diff -Nru kodi-16.1~git20160425.1001-final/addons/kodi.adsp/addon.xml kodi-15.2~git20151019.1039-final/addons/kodi.adsp/addon.xml --- kodi-16.1~git20160425.1001-final/addons/kodi.adsp/addon.xml 2015-11-02 01:00:10.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/kodi.adsp/addon.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - diff -Nru kodi-16.1~git20160425.1001-final/addons/kodi.resource/addon.xml kodi-15.2~git20151019.1039-final/addons/kodi.resource/addon.xml --- kodi-16.1~git20160425.1001-final/addons/kodi.resource/addon.xml 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/kodi.resource/addon.xml 2015-10-19 08:39:14.000000000 +0000 @@ -6,5 +6,4 @@ - diff -Nru kodi-16.1~git20160425.1001-final/addons/kodi.resource/images.xsd kodi-15.2~git20151019.1039-final/addons/kodi.resource/images.xsd --- kodi-16.1~git20160425.1001-final/addons/kodi.resource/images.xsd 2015-11-02 01:00:10.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/kodi.resource/images.xsd 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ - - - - - - - - - - diff -Nru kodi-16.1~git20160425.1001-final/addons/library.kodi.adsp/libKODI_adsp.h kodi-15.2~git20151019.1039-final/addons/library.kodi.adsp/libKODI_adsp.h --- kodi-16.1~git20160425.1001-final/addons/library.kodi.adsp/libKODI_adsp.h 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/library.kodi.adsp/libKODI_adsp.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,236 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include -#include -#include -#ifdef BUILD_KODI_ADDON -#include "kodi/kodi_adsp_types.h" -#else -#include "addons/include/kodi_adsp_types.h" -#endif -#include "libXBMC_addon.h" - -typedef void* ADSPHANDLE; - -#ifdef _WIN32 -#define ADSP_HELPER_DLL "\\library.kodi.adsp\\libKODI_adsp" ADDON_HELPER_EXT -#else -#define ADSP_HELPER_DLL_NAME "libKODI_adsp-" ADDON_HELPER_ARCH ADDON_HELPER_EXT -#define ADSP_HELPER_DLL "/library.kodi.adsp/" ADSP_HELPER_DLL_NAME -#endif - -class CAddonSoundPlay; - -class CHelper_libKODI_adsp -{ -public: - CHelper_libKODI_adsp(void) - { - m_libKODI_adsp = NULL; - m_Handle = NULL; - } - - ~CHelper_libKODI_adsp(void) - { - if (m_libKODI_adsp) - { - ADSP_unregister_me(m_Handle, m_Callbacks); - dlclose(m_libKODI_adsp); - } - } - - /*! - * @brief Resolve all callback methods - * @param handle Pointer to the add-on - * @return True when all methods were resolved, false otherwise. - */ - bool RegisterMe(void* handle) - { - m_Handle = handle; - - std::string libBasePath; - libBasePath = ((cb_array*)m_Handle)->libPath; - libBasePath += ADSP_HELPER_DLL; - -#if defined(ANDROID) - struct stat st; - if(stat(libBasePath.c_str(),&st) != 0) - { - std::string tempbin = getenv("XBMC_ANDROID_LIBS"); - libBasePath = tempbin + "/" + ADSP_HELPER_DLL_NAME; - } -#endif - - m_libKODI_adsp = dlopen(libBasePath.c_str(), RTLD_LAZY); - if (m_libKODI_adsp == NULL) - { - fprintf(stderr, "Unable to load %s\n", dlerror()); - return false; - } - - ADSP_register_me = (void* (*)(void *HANDLE)) - dlsym(m_libKODI_adsp, "ADSP_register_me"); - if (ADSP_register_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - ADSP_unregister_me = (void (*)(void* HANDLE, void* CB)) - dlsym(m_libKODI_adsp, "ADSP_unregister_me"); - if (ADSP_unregister_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - ADSP_add_menu_hook = (void (*)(void* HANDLE, void* CB, AE_DSP_MENUHOOK *hook)) - dlsym(m_libKODI_adsp, "ADSP_add_menu_hook"); - if (ADSP_add_menu_hook == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - ADSP_remove_menu_hook = (void (*)(void* HANDLE, void* CB, AE_DSP_MENUHOOK *hook)) - dlsym(m_libKODI_adsp, "ADSP_remove_menu_hook"); - if (ADSP_remove_menu_hook == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - ADSP_register_mode = (void (*)(void *HANDLE, void* CB, AE_DSP_MODES::AE_DSP_MODE *modes)) - dlsym(m_libKODI_adsp, "ADSP_register_mode"); - if (ADSP_register_mode == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - ADSP_unregister_mode = (void (*)(void* HANDLE, void* CB, AE_DSP_MODES::AE_DSP_MODE *modes)) - dlsym(m_libKODI_adsp, "ADSP_unregister_mode"); - if (ADSP_unregister_mode == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - ADSP_get_sound_play = (CAddonSoundPlay* (*)(void *HANDLE, void *CB, const char *filename)) - dlsym(m_libKODI_adsp, "ADSP_get_sound_play"); - if (ADSP_get_sound_play == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - ADSP_release_sound_play = (void (*)(CAddonSoundPlay* p)) - dlsym(m_libKODI_adsp, "ADSP_release_sound_play"); - if (ADSP_release_sound_play == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - m_Callbacks = ADSP_register_me(m_Handle); - return m_Callbacks != NULL; - } - - /*! - * @brief Add or replace a menu hook for the context menu for this add-on - * @param hook The hook to add - */ - void AddMenuHook(AE_DSP_MENUHOOK* hook) - { - return ADSP_add_menu_hook(m_Handle, m_Callbacks, hook); - } - - /*! - * @brief Remove a menu hook for the context menu for this add-on - * @param hook The hook to remove - */ - void RemoveMenuHook(AE_DSP_MENUHOOK* hook) - { - return ADSP_remove_menu_hook(m_Handle, m_Callbacks, hook); - } - - /*! - * @brief Add or replace master mode information inside audio dsp database. - * Becomes identifier written inside mode to iModeID if it was 0 (undefined) - * @param mode The master mode to add or update inside database - */ - void RegisterMode(AE_DSP_MODES::AE_DSP_MODE* mode) - { - return ADSP_register_mode(m_Handle, m_Callbacks, mode); - } - - /*! - * @brief Remove a master mode from audio dsp database - * @param mode The Mode to remove - */ - void UnregisterMode(AE_DSP_MODES::AE_DSP_MODE* mode) - { - return ADSP_unregister_mode(m_Handle, m_Callbacks, mode); - } - - /*! - * @brief Open a sound playing class - * @param filename The wav filename to open - */ - CAddonSoundPlay* GetSoundPlay(const char *filename) - { - return ADSP_get_sound_play(m_Handle, m_Callbacks, filename); - } - - /*! - * @brief Remove a played file class - * @param p The playback to remove - */ - void ReleaseSoundPlay(CAddonSoundPlay* p) - { - return ADSP_release_sound_play(p); - } - -protected: - void* (*ADSP_register_me)(void*); - - void (*ADSP_unregister_me)(void*, void*); - void (*ADSP_add_menu_hook)(void*, void*, AE_DSP_MENUHOOK*); - void (*ADSP_remove_menu_hook)(void*, void*, AE_DSP_MENUHOOK*); - void (*ADSP_register_mode)(void*, void*, AE_DSP_MODES::AE_DSP_MODE*); - void (*ADSP_unregister_mode)(void*, void*, AE_DSP_MODES::AE_DSP_MODE*); - CAddonSoundPlay* (*ADSP_get_sound_play)(void*, void*, const char *); - void (*ADSP_release_sound_play)(CAddonSoundPlay*); - -private: - void* m_libKODI_adsp; - void* m_Handle; - void* m_Callbacks; - struct cb_array - { - const char* libPath; - }; -}; - -class CAddonSoundPlay -{ -public: - CAddonSoundPlay(void *hdl, void *cb, const char *filename); - virtual ~CAddonSoundPlay(); - - /*! play the sound this object represents */ - virtual void Play(); - - /*! stop playing the sound this object represents */ - virtual void Stop(); - - /*! return true if the sound is currently playing */ - virtual bool IsPlaying(); - - /*! set the playback channel position of this sound, AE_DSP_CH_INVALID for all */ - virtual void SetChannel(AE_DSP_CHANNEL channel); - - /*! get the current playback volume of this sound, AE_DSP_CH_INVALID for all */ - virtual AE_DSP_CHANNEL GetChannel(); - - /*! set the playback volume of this sound */ - virtual void SetVolume(float volume); - - /*! get the current playback volume of this sound */ - virtual float GetVolume(); - -private: - std::string m_Filename; - void *m_Handle; - void *m_cb; - ADSPHANDLE m_PlayHandle; -}; diff -Nru kodi-16.1~git20160425.1001-final/addons/library.kodi.audioengine/libKODI_audioengine.h kodi-15.2~git20151019.1039-final/addons/library.kodi.audioengine/libKODI_audioengine.h --- kodi-16.1~git20160425.1001-final/addons/library.kodi.audioengine/libKODI_audioengine.h 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/library.kodi.audioengine/libKODI_audioengine.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,332 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include -#include -#include - -#ifdef BUILD_KODI_ADDON - #include "kodi/AudioEngine/AEChannelData.h" - #include "kodi/AudioEngine/AEChannelInfo.h" - #include "kodi/AudioEngine/AEStreamData.h" - #include "kodi/AudioEngine/kodi_audioengine_types.h" -#else - #include "cores/AudioEngine/Utils/AEChannelData.h" - #include "cores/AudioEngine/Utils/AEChannelInfo.h" - #include "cores/AudioEngine/Utils/AEStreamData.h" - #include "addons/include/kodi_audioengine_types.h" -#endif - -#include "libXBMC_addon.h" - -#ifdef _WIN32 -#define AUDIOENGINE_HELPER_DLL "\\library.kodi.audioengine\\libKODI_audioengine" ADDON_HELPER_EXT -#else -#define AUDIOENGINE_HELPER_DLL_NAME "libKODI_audioengine-" ADDON_HELPER_ARCH ADDON_HELPER_EXT -#define AUDIOENGINE_HELPER_DLL "/library.kodi.audioengine/" AUDIOENGINE_HELPER_DLL_NAME -#endif - -class CAddonAEStream; - -class CHelper_libKODI_audioengine -{ -public: - CHelper_libKODI_audioengine(void) - { - m_libKODI_audioengine = NULL; - m_Handle = NULL; - } - - ~CHelper_libKODI_audioengine(void) - { - if (m_libKODI_audioengine) - { - AudioEngine_unregister_me(m_Handle, m_Callbacks); - dlclose(m_libKODI_audioengine); - } - } - - /*! - * @brief Resolve all callback methods - * @param handle Pointer to the add-on - * @return True when all methods were resolved, false otherwise. - */ - bool RegisterMe(void* handle) - { - m_Handle = handle; - - std::string libBasePath; - libBasePath = ((cb_array*)m_Handle)->libPath; - libBasePath += AUDIOENGINE_HELPER_DLL; - -#if defined(ANDROID) - struct stat st; - if(stat(libBasePath.c_str(),&st) != 0) - { - std::string tempbin = getenv("XBMC_ANDROID_LIBS"); - libBasePath = tempbin + "/" + AUDIOENGINE_HELPER_DLL; - } -#endif - - m_libKODI_audioengine = dlopen(libBasePath.c_str(), RTLD_LAZY); - if (m_libKODI_audioengine == NULL) - { - fprintf(stderr, "Unable to load %s\n", dlerror()); - return false; - } - - AudioEngine_register_me = (void* (*)(void *HANDLE)) - dlsym(m_libKODI_audioengine, "AudioEngine_register_me"); - if (AudioEngine_register_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - AudioEngine_unregister_me = (void(*)(void* HANDLE, void* CB)) - dlsym(m_libKODI_audioengine, "AudioEngine_unregister_me"); - if (AudioEngine_unregister_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - AudioEngine_MakeStream = (CAddonAEStream* (*)(void*, void*, AEDataFormat, unsigned int, unsigned int, enum AEChannel*, unsigned int)) - dlsym(m_libKODI_audioengine, "AudioEngine_make_stream"); - if (AudioEngine_MakeStream == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - AudioEngine_FreeStream = (void(*)(CAddonAEStream*)) - dlsym(m_libKODI_audioengine, "AudioEngine_free_stream"); - if (AudioEngine_FreeStream == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - AudioEngine_GetCurrentSinkFormat = (bool(*)(void*, void*, AudioEngineFormat*)) - dlsym(m_libKODI_audioengine, "AudioEngine_get_current_sink_Format"); - if (AudioEngine_GetCurrentSinkFormat == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } - - m_Callbacks = AudioEngine_register_me(m_Handle); - return m_Callbacks != NULL; - } - - /** - * Creates and returns a new handle to an IAEStream in the format specified, this function should never fail - * @param DataFormat The data format the incoming audio will be in (eg, AE_FMT_S16LE) - * @param SampleRate The sample rate of the audio data (eg, 48000) - * @prarm EncodedSampleRate The sample rate of the encoded audio data if AE_IS_RAW(dataFormat) - * @param ChannelLayout The order of the channels in the audio data - * @param Options A bit field of stream options (see: enum AEStreamOptions) - * @return a new Handle to an IAEStream that will accept data in the requested format - */ - CAddonAEStream* MakeStream(AEDataFormat DataFormat, unsigned int SampleRate, unsigned int EncodedSampleRate, CAEChannelInfo &ChannelLayout, unsigned int Options = 0) - { - return AudioEngine_MakeStream(m_Handle, m_Callbacks, DataFormat, SampleRate, EncodedSampleRate, ChannelLayout.m_channels, Options); - } - - /** - * This method will remove the specifyed stream from the engine. - * For OSX/IOS this is essential to reconfigure the audio output. - * @param stream The stream to be altered - * @return NULL - */ - void FreeStream(CAddonAEStream **Stream) - { - AudioEngine_FreeStream(*Stream); - *Stream = NULL; - } - - /** - * Get the current sink data format - * - * @param Current sink data format. For more details see AudioEngineFormat. - * @return Returns true on success, else false. - */ - bool GetCurrentSinkFormat(AudioEngineFormat &SinkFormat) - { - return AudioEngine_GetCurrentSinkFormat(m_Handle, m_Callbacks, &SinkFormat); - } - -protected: - void* (*AudioEngine_register_me)(void*); - void (*AudioEngine_unregister_me)(void*, void*); - CAddonAEStream* (*AudioEngine_MakeStream)(void*, void*, AEDataFormat, unsigned int, unsigned int, enum AEChannel*, unsigned int); - bool (*AudioEngine_GetCurrentSinkFormat)(void*, void*, AudioEngineFormat *SinkFormat); - void (*AudioEngine_FreeStream)(CAddonAEStream*); - -private: - void* m_libKODI_audioengine; - void* m_Handle; - void* m_Callbacks; - struct cb_array - { - const char* libPath; - }; -}; - -// Audio Engine Stream Class -class CAddonAEStream -{ -public: - CAddonAEStream(void *Addon, void *Callbacks, AEStreamHandle *StreamHandle); - virtual ~CAddonAEStream(); - - /** - * Returns the amount of space available in the stream - * @return The number of bytes AddData will consume - */ - virtual unsigned int GetSpace(); - - /** - * Add planar or interleaved PCM data to the stream - * @param Data array of pointers to the planes - * @param Offset to frame in frames - * @param Frames number of frames - * @return The number of frames consumed - */ - virtual unsigned int AddData(uint8_t* const *Data, unsigned int Offset, unsigned int Frames); - - /** - * Returns the time in seconds that it will take - * for the next added packet to be heard from the speakers. - * @return seconds - */ - virtual double GetDelay(); - - /** - * Returns if the stream is buffering - * @return True if the stream is buffering - */ - virtual bool IsBuffering(); - - /** - * Returns the time in seconds that it will take - * to underrun the cache if no sample is added. - * @return seconds - */ - virtual double GetCacheTime(); - - /** - * Returns the total time in seconds of the cache - * @return seconds - */ - virtual double GetCacheTotal(); - - /** - * Pauses the stream playback - */ - virtual void Pause(); - - /** - * Resumes the stream after pausing - */ - virtual void Resume(); - - /** - * Start draining the stream - * @note Once called AddData will not consume more data. - */ - virtual void Drain(bool Wait); - - /** - * Returns true if the is stream draining - */ - virtual bool IsDraining(); - - /** - * Returns true if the is stream has finished draining - */ - virtual bool IsDrained(); - - /** - * Flush all buffers dropping the audio data - */ - virtual void Flush(); - - /** - * Return the stream's current volume level - * @return The volume level between 0.0 and 1.0 - */ - virtual float GetVolume(); - - /** - * Set the stream's volume level - * @param volume The new volume level between 0.0 and 1.0 - */ - virtual void SetVolume(float Volume); - - /** - * Gets the stream's volume amplification in linear units. - * @return The volume amplification factor between 1.0 and 1000.0 - */ - virtual float GetAmplification(); - - /** - * Sets the stream's volume amplification in linear units. - * @param The volume amplification factor between 1.0 and 1000.0 - */ - virtual void SetAmplification(float Amplify); - - /** - * Returns the size of one audio frame in bytes (channelCount * resolution) - * @return The size in bytes of one frame - */ - virtual const unsigned int GetFrameSize() const; - - /** - * Returns the number of channels the stream is configured to accept - * @return The channel count - */ - virtual const unsigned int GetChannelCount() const; - - /** - * Returns the stream's sample rate, if the stream is using a dynamic sample rate, this value will NOT reflect any changes made by calls to SetResampleRatio() - * @return The stream's sample rate (eg, 48000) - */ - virtual const unsigned int GetSampleRate() const; - - /** - * Returns the stream's encoded sample rate if the stream is RAW - * @return The stream's encoded sample rate - */ - virtual const unsigned int GetEncodedSampleRate() const; - - /** - * Return the data format the stream has been configured with - * @return The stream's data format (eg, AE_FMT_S16LE) - */ - virtual const AEDataFormat GetDataFormat() const; - - /** - * Return the resample ratio - * @note This will return an undefined value if the stream is not resampling - * @return the current resample ratio or undefined if the stream is not resampling - */ - virtual double GetResampleRatio(); - - /** - * Sets the resample ratio - * @note This function may return false if the stream is not resampling, if you wish to use this be sure to set the AESTREAM_FORCE_RESAMPLE option - * @param ratio the new sample rate ratio, calculated by ((double)desiredRate / (double)GetSampleRate()) - */ - virtual bool SetResampleRatio(double Ratio); - - /** - * Sginal a clock change - */ - virtual void Discontinuity(); - - private: - AEStreamHandle *m_StreamHandle; - void *m_Callbacks; - void *m_AddonHandle; -}; diff -Nru kodi-16.1~git20160425.1001-final/addons/library.kodi.guilib/libKODI_guilib.h kodi-15.2~git20151019.1039-final/addons/library.kodi.guilib/libKODI_guilib.h --- kodi-16.1~git20160425.1001-final/addons/library.kodi.guilib/libKODI_guilib.h 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/library.kodi.guilib/libKODI_guilib.h 2015-09-20 03:00:14.000000000 +0000 @@ -36,10 +36,10 @@ #endif /* current ADDONGUI API version */ -#define KODI_GUILIB_API_VERSION "5.10.0" +#define KODI_GUILIB_API_VERSION "5.8.0" /* min. ADDONGUI API version */ -#define KODI_GUILIB_MIN_API_VERSION "5.10.0" +#define KODI_GUILIB_MIN_API_VERSION "5.8.0" #define ADDON_ACTION_PREVIOUS_MENU 10 #define ADDON_ACTION_CLOSE_DIALOG 51 diff -Nru kodi-16.1~git20160425.1001-final/addons/library.xbmc.addon/libXBMC_addon.h kodi-15.2~git20151019.1039-final/addons/library.xbmc.addon/libXBMC_addon.h --- kodi-16.1~git20160425.1001-final/addons/library.xbmc.addon/libXBMC_addon.h 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/library.xbmc.addon/libXBMC_addon.h 2015-10-19 08:39:14.000000000 +0000 @@ -32,13 +32,7 @@ typedef intptr_t ssize_t; #define _SSIZE_T_DEFINED #endif // !_SSIZE_T_DEFINED - -#if defined(BUILD_KODI_ADDON) - #include "platform/windows/dlfcn-win32.h" -#else - #include "dlfcn-win32.h" -#endif - +#include "dlfcn-win32.h" #define ADDON_DLL "\\library.xbmc.addon\\libXBMC_addon" ADDON_HELPER_EXT #define ADDON_HELPER_EXT ".dll" #else diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.album.universal/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.album.universal/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.album.universal/addon.xml 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.album.universal/addon.xml 2015-08-20 03:00:16.000000000 +0000 @@ -1,8 +1,8 @@  + version="2.5.0" + provider-name="Olympia, XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.album.universal/albumuniversal.xml kodi-15.2~git20151019.1039-final/addons/metadata.album.universal/albumuniversal.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.album.universal/albumuniversal.xml 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.album.universal/albumuniversal.xml 2015-08-20 03:00:16.000000000 +0000 @@ -122,9 +122,6 @@ allmusic.com - - TheAudioDb.com - (.+) diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.album.universal/changelog.txt kodi-15.2~git20151019.1039-final/addons/metadata.album.universal/changelog.txt --- kodi-16.1~git20160425.1001-final/addons/metadata.album.universal/changelog.txt 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.album.universal/changelog.txt 2015-08-20 03:00:16.000000000 +0000 @@ -1,9 +1,3 @@ -[B]2.6.0[/B] -Added: Theme support from theaudiodb.com - -[B]2.5.1[/B] -Update author name - [B]2.5.0[/B] Removed: amazon.de review diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.album.universal/resources/settings.xml kodi-15.2~git20151019.1039-final/addons/metadata.album.universal/resources/settings.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.album.universal/resources/settings.xml 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.album.universal/resources/settings.xml 2015-08-20 03:00:16.000000000 +0000 @@ -8,7 +8,7 @@ - + diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.artists.universal/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.artists.universal/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.artists.universal/addon.xml 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.artists.universal/addon.xml 2015-08-20 03:00:16.000000000 +0000 @@ -1,8 +1,8 @@  + version="3.6.1" + provider-name="Olympia, XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.artists.universal/changelog.txt kodi-15.2~git20151019.1039-final/addons/metadata.artists.universal/changelog.txt --- kodi-16.1~git20160425.1001-final/addons/metadata.artists.universal/changelog.txt 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.artists.universal/changelog.txt 2015-08-20 03:00:16.000000000 +0000 @@ -1,6 +1,3 @@ -[B]3.6.2[/B] -Update author name - [B]3.6.1[/B] Fixed: Won't scrape MBID randomly diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.allmusic.com/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.allmusic.com/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.allmusic.com/addon.xml 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.allmusic.com/addon.xml 2014-12-21 04:00:23.000000000 +0000 @@ -1,8 +1,8 @@  + version="3.1.0" + provider-name="XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.fanart.tv/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.fanart.tv/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.fanart.tv/addon.xml 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.fanart.tv/addon.xml 2014-11-30 04:00:27.000000000 +0000 @@ -1,8 +1,8 @@ + version="3.1.2" + provider-name="XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.htbackdrops.com/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.htbackdrops.com/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.htbackdrops.com/addon.xml 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.htbackdrops.com/addon.xml 2014-11-30 04:00:27.000000000 +0000 @@ -1,8 +1,8 @@ + version="1.3.3" + provider-name="XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.imdb.com/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.imdb.com/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.imdb.com/addon.xml 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.imdb.com/addon.xml 2014-11-30 04:00:27.000000000 +0000 @@ -1,8 +1,8 @@ + version="2.7.9" + provider-name="XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.imdb.com/changelog.txt kodi-15.2~git20151019.1039-final/addons/metadata.common.imdb.com/changelog.txt --- kodi-16.1~git20160425.1001-final/addons/metadata.common.imdb.com/changelog.txt 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.imdb.com/changelog.txt 2014-07-11 17:50:51.000000000 +0000 @@ -1,18 +1,3 @@ -[B]2.8.4[/B] -- update author name - -[B]2.8.3[/B] -- fixed: Keep Original Title for foreign movies - -[B]2.8.2[/B] -- fixed: trying to fix IMDb outline - -[B]2.8.1[/B] -- fixed: potential PCRE error due to non-clean regexp - -[B]2.8.0[/B] -- fixed: won't scrape IMDb TOP250 - [B]2.7.8[/B] - fixed: add xml header diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.imdb.com/imdb.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.imdb.com/imdb.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.imdb.com/imdb.xml 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.imdb.com/imdb.xml 2014-07-11 17:50:51.000000000 +0000 @@ -22,7 +22,7 @@ - <span\sitemprop="ratingValue">([0-9.]+).*?ratingCount">([0-9,]+)< + <span\sitemprop="ratingValue">([0-9.]+).*?>.*?title="([0-9,]+)\s @@ -36,7 +36,7 @@ - Top\sRated\sMovies\s#([0-9]*) + Top\s250\s#([0-9]*)</ @@ -120,7 +120,7 @@ - itemprop="description">([^<]+)< + </p>\n?\s+<p\sitemprop="description">([^<]+)</p> @@ -134,7 +134,7 @@ - itemprop="description">([^<]+)< + </p>\n?\s+<p\sitemprop="description">([^<]+)</p> @@ -304,9 +304,6 @@ <meta\sname="title"\scontent="(IMDb\s-\s)?(?:&#x22;)?([^"]*?)(?:&#x22;)? \([^\(]*?([0-9]{4})(?:–\s)?\) - - class="originalTitle">([^<]*) - diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.last.fm/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.last.fm/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.last.fm/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.last.fm/addon.xml 2014-11-30 04:00:27.000000000 +0000 @@ -0,0 +1,40 @@ + + + + + + + + all + Библиотека за сваляне на инф. от LastFM + LastFM Scraper Library + Musik-Scraper für LastFM + Scraper de música de LastFM + LastFM musiikkitietojen lataaja + Scraper LastFM + LastFM leolvasó-könyvtár + LastFM-scraperfuncties + Scraper biblioteki LastFM + Scraper de música LastFM + Обработчик для LastFM + Skrapebibliotek för LastFM + LastFM刮削器代码库 + Извлича инф. за музикални файлове от www.last.fm + Download Music information from www.last.fm + Downloade Musik informationen von www.last.fm + Descargar información musical de www.last.fm + Lataa musiikkitietoja osoitteesta www.last.fm + Télécharge les infos musicales depuis www.last.fm + Zene információk letöltése a www.last.fm webhelyről + Muziekinfo ophalen van LastFM + Pobieraj informacje o muzyce z www.last.fm + Descarregar informação de música de www.last.fm + Загружать информацию о Музыке с www.last.fm + Ladda ner musikinformation från www.last.fm + 从www.last.fm下载音乐信息 + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/metadata.common.last.fm/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/metadata.common.last.fm/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.last.fm/lastfm.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.last.fm/lastfm.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.last.fm/lastfm.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.last.fm/lastfm.xml 2014-07-11 17:50:51.000000000 +0000 @@ -0,0 +1,306 @@ + + + + + + + + + + + + + + + + + + + <album[^>]*>[^<]*<name>([^<]*?)</name> + + + + + + + + + + + + + + + + + + + + <content><!\[CDATA\[(.*?)\]\] + + + + allmusic.com + + + TheAudioDb.com + + ^$ + + + (.+) + + + + + + + + + + + + + + + + + <content><!\[CDATA\[(.*?)\]\] + + + + + + + + + + + + + + + + + <tag>.*?<name>([^/lt;]*)</name> + + + + allmusic.com + + + TheAudioDb.com + + <genre></genre> + + + <genre>(.+)</genre> + + + + + + + + + + + + + + + + + <tag>.*?<name>([^/lt;]*)</name> + + + + + + + + + + + + + + + + + <tag>.*?<name>([^/lt;]*)</name> + + + + allmusic.com + + <style></style> + + + <style>(.+)</style> + + + + + + + + + + + + + + + + + <tag>.*?<name>([^/lt;]*)</name> + + + + + + + + + + + + + + + + + + + + + + <size name="original"[^>]*>([^<]*)<[^<]*<size name="large"[^>]*>([^<]*)< + + + + + + + + + + + + + + (.+)::(.+)::(.+)::(.+) + + + + + + <name>(.*?)</name> + + (.+) + + + + + + + + + + + (.+)::(.+)::(.+)::(.+) + + + + + + <artist>(.*?)</artist> + + (.+) + + + + + + + + + + + (.+)::(.+)::(.+)::(.+) + + + + + + <releasedate>([^,]*)?([^<]*)?</releasedate> + + + <releasedate>.*?([0-9]{4})[^<]*</releasedate> + + (.+) + + + + + + + + + + + (.+)::(.+)::(.+)::(.+) + + + + + + <track rank="(.*?)".*?<name>(.*?)</name> + + (.+) + + + + + + + + + + + (.+)::(.+)::(.+)::(.+) + + + + + + <content><!\[CDATA\[(.*?)(User-|\]\]) + + (.+) + + + + + + + + + + + (.+)::(.+)::(.+)::(.+) + + + + + + <image size="extralarge">([^<]*)</image> + + + <image size="large">([^<]*)</image> + + (.+) + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.musicbrainz.org/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.musicbrainz.org/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.musicbrainz.org/addon.xml 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.musicbrainz.org/addon.xml 2015-08-20 03:00:16.000000000 +0000 @@ -1,8 +1,8 @@  + version="2.0.4" + provider-name="XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.theaudiodb.com/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.theaudiodb.com/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.theaudiodb.com/addon.xml 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.theaudiodb.com/addon.xml 2014-12-21 04:00:23.000000000 +0000 @@ -1,8 +1,8 @@  + version="1.8.1" + provider-name="XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.theaudiodb.com/tadb.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.theaudiodb.com/tadb.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.theaudiodb.com/tadb.xml 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.theaudiodb.com/tadb.xml 2014-12-21 04:00:23.000000000 +0000 @@ -78,6 +78,9 @@ strBiography$INFO[tadbartistlanguage]":"(.*?)"," + + last.fm + allmusic.com @@ -241,6 +244,9 @@ strGenre":"([^"]*) + + last.fm + allmusic.com @@ -295,6 +301,9 @@ strMood":"([^"]*) + + last.fm + allmusic.com @@ -349,6 +358,9 @@ strStyle":"([^"]*) + + last.fm + allmusic.com @@ -523,25 +535,6 @@ - - - - - - - - - - - - - - strTheme":"([^"]*) - - - - - diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.themoviedb.org/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.themoviedb.org/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.themoviedb.org/addon.xml 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.themoviedb.org/addon.xml 2015-06-14 19:32:48.000000000 +0000 @@ -1,8 +1,8 @@ + version="2.13.1" + provider-name="XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.common.themoviedb.org/tmdb.xml kodi-15.2~git20151019.1039-final/addons/metadata.common.themoviedb.org/tmdb.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.common.themoviedb.org/tmdb.xml 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.common.themoviedb.org/tmdb.xml 2015-06-14 19:32:48.000000000 +0000 @@ -3,7 +3,7 @@ - + @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -48,7 +48,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -70,7 +70,7 @@ "overview":"(.*?)"," - + ^$ @@ -93,7 +93,7 @@ - + @@ -104,7 +104,7 @@ - + @@ -115,7 +115,7 @@ "tagline":"([^"]*) - + ^$ @@ -138,7 +138,7 @@ - + @@ -158,7 +158,7 @@ - + @@ -169,7 +169,7 @@ - + @@ -180,7 +180,7 @@ "belongs_to_collection":\{"id":[0-9]+,"name":"([^"]*) - + ^$ @@ -200,10 +200,10 @@ - + - + @@ -226,7 +226,7 @@ - + @@ -246,7 +246,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -274,7 +274,7 @@ - + @@ -294,7 +294,7 @@ - + @@ -314,7 +314,7 @@ - + @@ -334,7 +334,7 @@ - + @@ -354,7 +354,7 @@ - + @@ -362,7 +362,7 @@ - + @@ -379,7 +379,7 @@ "source":"([^"]*) - + ^$ @@ -399,7 +399,7 @@ "source":"([^"]*) - + ^$ @@ -422,10 +422,10 @@ - + - + @@ -445,10 +445,10 @@ - + - + @@ -456,10 +456,10 @@ - + - + @@ -480,12 +480,12 @@ (.+) - + en ^$ - + ^((?!en).)*$ (.+) @@ -506,12 +506,12 @@ (.+) - + en ^$ - + ^((?!en).)*$ (.+) @@ -531,7 +531,7 @@ (.+) - + ^$ (.+) diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/addon.xml 2015-06-14 19:32:48.000000000 +0000 @@ -0,0 +1,117 @@ + + + + + + + + + + theaudiodb.com Musiek Video Skraper + theaudiodb.com Music Video Scraper + Сваля инф. за музикални клипове от theaudiodb.com + Arreplegador de vídeos musicals de theaudiodb.com + Zdroj dat o hudebních videích theaudiodb.com + Crafwr Fideo Cerddoriaeth theaudiodb.com + theaudiodb.com Musikvideo-scraper + theaudiodb.com Musikvideo Scraper + Scraper Μουσικών Βίντεο του theaudiodb.com + theaudiodb.com Music Video Scraper + theaudiodb.com Music Video Scraper + theaudiodb.com Music Video Scraper + Buscador de videoclips de theaudiodb.com + Scraper de Videos de Música de theaudiodb.com + theaudiodb.com muusikavideo kraabits + theaudiodb.com musiikkivideotietojen lataaja + theaudiodb.com Scraper Clip Vidéo + Extracteur de vidéos musicales pour theaudiodb.com + Scraper de vídeo e música de theaudiodb.com + theaudiodb.com סקרייפר וידאו קליפ + theaudiodb.com sakupljač za glazbene spotove + theaudiodb.com videóklip leolvasó + Pengais Video Musik theaudiodb.com + theaudiodb.com Skafa fyrir Tónlistarmyndbönd + Lo scraper di video musicali theaudiodb.com + theaudiodb.com 音楽ビデオスクレーパー + theaudiodb.com 뮤직 비디오 정보수집기 + theaudiodb.com muzikinių vaizdo klipų skreperis + theaudiodb.com Music Video Scraper + Pengikis Video Muzik theaudiodb.com + theaudiodb.com Music Video Scraper + theaudiodb.com Muziekvideo-scraper + theaudiodb.com Skraper for musikkvideo + Scraper teledysków theaudiodb.com + Colector de música theaudiodb.com + Scraper de concertos theaudiodb.com + Informaţii videoclipuri de la theaudiodb.com + Скрапер музыки и видео theaudiodb.com + Skrapa för theaudiodb.com musik + Zdroj získavania dát o hudobných videách zo stránky theaudiodb.com + Ponudnik informacij o videospotih theaudiodb.com + theaudiodb.com musikvideoskrapa + theaudiodb.com இசை நிகழ்படம் சுரண்டி + ตัวดึงข้อมูลวิดีโอเพลง theaudiodb.com + Здирач музичного відео з theaudiodb.com + Trình lấy dữ liệu video nhạc từ theaudiodb.com + theaudiodb.com 音乐电视刮削器 + theaudiodb.com音樂影片搜括器 + Laai Musiek Video informasie af + የሙዚቃ ቪዲዮ መረጃ ማውረጃ + Download Music Video information + Сваля информация за музикални клипове + Baixa informació de videos musicals + Zdroj dat stahující informace o hudebních videích z TheAudioDB.com. Kvůli složitým problémům s vyhledáváním požaduje nástroj pro vyhledávání název složky složky/souboru pojmenován jako 'umělec - název stopy', pokud tomu tak není, nenalezne žádné výsledky. + Mae'r crafwr yn llwytho i lawr gwybodaeth am Gerddoriaeth Fideo o TheAudioDB.com. Oherwydd amryw o anawsterau chwilio mae'r crafwr yn disgwyl i'r ffolder/enw ffeil fod wedi ei fformatio fel 'artist - enw track' neu ni fydd yn dychwelyd canlyniadau. + Hent Musikvideo-information + Dieser Scraper lädt Musikvideoinformationen von TheAudioDB.com herunter. Aufgrund diverser Suchschwierigkeiten erwartet der Scraper derzeit, dass Ordner/Dateinamen als 'Künstler - Songname' formatiert werden, andernfalls wird er keine Ergebnisse zurückliefern. + Λήψη πληροφοριών Μουσικών Βίντεο + This scraper is downloading Music Video information from TheAudioDB.com. Due to various search difficulties the scraper currently expects the folder/filename to be formatted as 'artist - trackname' otherwise it will not return results. + This scraper is downloading Music Video information from TheAudioDB.com. Due to various search difficulties the scraper currently expects the folder/filename to be formatted as 'artist - trackname' otherwise it will not return results. + This scraper is downloading Music Video information from TheAudioDB.com. Due to various search difficulties the scraper currently expects the folder/filename to be formatted as 'artist - trackname' otherwise it will not return results. + Descarga información del videoclip + Descarga información del Video Clip + Descarga Información de Vídeos de Músca + Hankija laeb alla muusikavideo infot portaalist TheAudioDB.com. Mitmete otsinguohtude tõttu tuvastab hankija kausta/faili nime vormingus 'esitaja - loo nimi', muidu hankija ei suuda otsimist läbi viia. + Lataa musiikkivideoiden tiedot + Télécharger les informations des clips vidéos + Cet extracteur télécharge les informations sur les vidéos musicales depuis TheAudioDB.com. À cause de difficultés de recherche diverses, l'extracteur s'attend présentement à ce que le dossier/nom du fichier soit formaté comme « artiste - nom de la piste ». Aucun résultat ne sera retourné si ce n'est pas le cas. + Este scraper descarga a información dende TheAudioDB.com. Debido a algúns problemas o scraper agarda que o cartafol/nome do ficheiro teña o formato 'artista - nome da pista' ou non retornará resultados. + הורד מידע וידאו קליפ + Ovaj sakupljač preuzima informacije o glazbenim spotovima s TheAudioDB.com. Uslijed mnogih problema s pretragom sakupljač očekuje da mape i datoteke budu u formatu 'izvođač - naziv pjesme' ili neće dati rezultata. + Videóklip információk letöltése a theaudiodb.com webhelyről + Pengais sedang mengunduh informasi musik video dari TheAudioDB.com. Dikarenakan berbagai kesulitan pencarian, Pengais mengharapkan folder/nama-berkas dalam format 'artis-judullagu' Apabila tidak, hasil tidak dapat muncul. + Þessi skafa halar niður upplýsingum Tónlistarmyndbanda frá TheAudioDB.com. Vegna ýmissa vandamála með leit þá gerir þessi skafa ráð fyrir að möppu/skráarnafn sé á forminu 'Listamaður - laganafn' annars skilar hún engum niðurstöðum. + Scarica informazioni Video Musicale + このスクレイパーはTheAudioDB.comから音楽ビデオ情報をダウンロードしています。様々な検索の困難のため、スクレイパーは現在「アーティスト - 曲名」とフォーマットされているフォルダ/ファイルネームを期待しています。そうでなければ、結果を返しません。 + 이 정보수집기믄 TheAudioDB.com에서 뮤직 비디오 정보를 가져옵니다. 여러가지 검색상의 어려움 때문에 폴더/파일이름이 '아티스트-트랙이름'으로 지정되어야 합니다. 그렇지 않으면 결과를 가져올 수 없습니다. + Šis skreperis atsiunčia muzikinių vaizdo klipų informaciją iš TheAudioDB.com. Dėl įvairių paieškos sunkumų, aplanko/failo pavadinimo formatas turi būti 'atlikėjas - takelio pavadinimas'. Priešingu atvejus nebus rasta jokių rezultatų. + Превземи информации за музичко видео + Pengikis ini memuat turun maklumat Video Muzik dari TheAudioDB.com. Oleh kerana kesukaran menggelintar, pengikis biasanya jangkakan folder/namafail diformat sebagai 'artis - namatrek' jika tidak ia tidak akan kembalikan keputusan. + Deze scraper download muziekvideo-informatie van TheAudioDB.com. Vanwege diverse zoek moeilijkheden verwacht de scraper nu dat de map/bestandsnaam is genaamd als 'artiest - Titel' anders zal het geen resultaten tonen. + Last ned musikkvideoinformasjon + Scraper teledysków pobiera informacje z bazy TheAudioDB.com. Ze względu na różne trudności wyszukiwania, scraper obecnie wymaga aby folder/plik był sformatowany: "artysta - nazwa ścieżki" inaczej nie zadziała poprawnie. + Descarregar informação de filmes de theaudiodb.com + Download de informação de Concertos + Acest plugin descarcă informaţii despre videoclipuri de la TheAudioDB.com. Datorita dificultatilor de cautare, pluginul asteapta ca perechea director/nume fisier sa fie formatate ca 'artist - nume piesa' altfel nu va returna nici un rezultat. + Загружать сведения о видеоклипах + Ladda ner musikvideoinformation från theaudiodb.com + Tento zdroj dát získava informácie o hudobných videách zo stránky TheAudioDB.com. Z dôvodu rôznych problémov pri hľadaní, zdroj dát aktuálne očakáva, aby bol názov priečinka/súboru formátovaný ako 'interpret - názov_skladby', v opačnom prípade nevráti žiadne výsledky. + Prenesite informacije o videospotih z TheAudioDB.com. Zaradi težavnosti iskanja morajo biti mape/datoteke v formatu 'izvajalec - pesem', drugače informacije ne bodo najdene. + Ladda ner musikvideoinformation + இந்த வலை சுரண்டி TheAudioDB.com இல் இருந்து இசை வீடியோ தகவல்களை பதிவிறக்கம் செய்கிறது. பல்வேறு தேடல் சிரமங்கள் காரணமாக தற்போது இந்த வலை சுரண்டியானது கோப்புறை / கோப்பு பெயரை 'கலைஞர் - தடங்கள் பெயர்' எனவாக வடிவமைக்க வேண்டும் என்று எதிர்பார்க்கிறது இல்லையெனில் முடிவுகளை தராது. கலைஞர் அல்லது தடங்கள் பெயரில் '-' அடையாளம் இருந்தால் அதை கூட கண்டுபிடிக்க முடியாது. + ดาวน์โหลดข้อมูลวิดีโอเพลง + Trình lấy dữ liệu đang tải thông tin video nhạc từ nguồn TheAudioDB.com. Do nhiều khó khăn tìm kiếm khác nhau, trình lấy dữ liệu này hiện chỉ hỗ trợ định dạng thư mục/tên tệp tin theo mẫu 'nghệ sỹ - tên track' nếu không sẽ không trả lại kết quả. + 从 theaudiodb.com 下载音乐电视资料。为简化搜索,刮削器限定文件夹/文件名格式为“歌手 - 歌名”,否则将不会返回结果。 + 此搜括器是從 TheAudioDB.com下載取得音樂影片資訊。因為各種不同搜尋變數,此搜括器目前須將資料夾/檔案名稱 重新命名為 "演出者-歌曲資訊"否則將無法正常取得專輯資料。帶有'-"符號的演出者或歌曲資訊也有極高可能無法找到。 + GPL v2.0 + http://forum.xbmc.org/showthread.php?tid=136105 + + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/changelog.txt kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/changelog.txt --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/changelog.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/changelog.txt 2015-06-14 19:32:48.000000000 +0000 @@ -0,0 +1,22 @@ +[B]1.2.7[/B] +- Fixed: Allow for apostrophes in artist/title + +[B]1.2.1[/B] +- Fixed: Allow for dashes in artist/title (v12.2+ required) + +[B]1.2.0[/B] +- Added: NfoURL function +- Added: Album thumbs from theaudiodb.com + +[B]1.1.1[/B] +- Fixed Workaround: Scraper won't return 'Unable to Connect to Remote Server' in case of year is available from the folder/file name + +[B]1.1.0[/B] +- Workaround: Scraper won't return 'Unable to Connect to Remote Server' in case of unexpected folder/file naming conventions +- Added: Music Video Director +- Added: Music Video Studio +- Changed: Scrape Music Video screenshot instead of album thumb if available +- Changed: Trust search result ordering from TheAudioDb.com +- Changed: Scrape Album genre instead of track genre for now +- Added: Scrape Album Year +- Added: Scraper description (stating current limitations) Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Afrikaans/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Afrikaans/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Afrikaans/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Afrikaans/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-addons/language/af/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Gryp album duimnaelsketse vanaf fanart.tv" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Belarusian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Belarusian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Belarusian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Belarusian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-addons/language/be/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Grab album thumbs from fanart.tv" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Bulgarian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Bulgarian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Bulgarian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Bulgarian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-addons/language/bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Сваляй миниатюри за албумите от fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Сваляй миниатюри за албумите от theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Burmese/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Burmese/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Burmese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Burmese/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-addons/language/my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "fanart.tv မှ album thumbs များရာယူမည်" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Catalan/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Catalan/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Catalan/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Catalan/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-addons/language/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Obté les miniatures de l'àlbum de fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Obté les miniatures de l'àlbum de theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Simple)/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Simple)/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Simple)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Simple)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-addons/language/zh/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "从 fanart.tv 获取专辑图片" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "从 theaudiodb.com 获取专辑图片" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Traditional)/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Traditional)/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Traditional)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Traditional)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-addons/language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "從fanart.tv取得專輯縮圖" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "從 theaudiodb.com取得專輯縮圖" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Croatian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Croatian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Croatian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Croatian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-addons/language/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Nabavi minijature albuma s fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Nabavi minijature albuma s theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Czech/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Czech/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Czech/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Czech/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-addons/language/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Získat náhledy alb z fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Získat náhledy alb z theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Danish/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Danish/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Danish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Danish/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-addons/language/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Hent Miniaturebilleder af Albummer fra fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Hent miniaturebilleder til albummer fra theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Dutch/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Dutch/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Dutch/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Dutch/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-addons/language/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Pak albumminiaturen van fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Haal Albumminiaturen van theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-addons/language/en/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (New Zealand)/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (New Zealand)/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (New Zealand)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (New Zealand)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-addons/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Grab album thumbs from fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Grab album thumbs from theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (US)/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (US)/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (US)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (US)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-addons/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Grab album thumbs from fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Grab album thumbs from theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Estonian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Estonian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Estonian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Estonian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-addons/language/et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Hangi albumi pisipildid fanart.tv-st" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Hangi albumi pisipildid theaudiodb.com-st" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Finnish/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Finnish/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Finnish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Finnish/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-addons/language/fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Hae albumin pienoiskuvat fanart.tv:stä" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/French/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/French/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/French/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/French/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (http://www.transifex.com/projects/p/xbmc-addons/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Récupérer les vignettes d'albums depuis fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Récupère les vignettes des albums depuis theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/French (Canada)/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/French (Canada)/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/French (Canada)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/French (Canada)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-addons/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Récupérer les imagettes d'albums de fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Récupérer les imagettes d'albums de theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Galician/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Galician/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Galician/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Galician/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-addons/language/gl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Obter as miniaturas do álbum dende fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Obter as miniaturas do álbum dende theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/German/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/German/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/German/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/German/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: German (http://www.transifex.com/projects/p/xbmc-addons/language/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Album-Vorschaubilder von fanart.tv laden" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Album-Vorschaubilder von theaudiodb.com laden" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Greek/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Greek/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Greek/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Greek/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-addons/language/el/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Μικρογραφίες άλμπουμ από fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Μικρογραφίες Άλμπουμ από το theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hebrew/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hebrew/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hebrew/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hebrew/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-addons/language/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "השג תמונות אלבום מ- fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "השג תמונת אלבום מ-theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hungarian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hungarian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hungarian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hungarian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-addons/language/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Album miniképek letőltésea fanart.tv-ről" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Album miniképek a theaudiodb.com-ról" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Icelandic/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Icelandic/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Icelandic/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Icelandic/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-addons/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Ná í smámyndir hljómplatna frá fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Ná í smámyndir hljómplatna frá theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Indonesian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Indonesian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Indonesian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Indonesian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-addons/language/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Ambil thumb album dari fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Ambil thumb album dari theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Italian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Italian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Italian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Italian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-addons/language/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Scarica le copertine album da fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Prendi miniature album da theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Japanese/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Japanese/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Japanese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Japanese/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-addons/language/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "fanart.tv からアルバムサムネイルを取得" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "theaudiodb.com からアルバムサムネイルを取得" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Korean/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Korean/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Korean/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Korean/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-addons/language/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "fanart.tv 에서 앨범 커버 가져오기" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "theaudiodb.com 에서 앨범 커버 가져오기" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Lithuanian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Lithuanian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Lithuanian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Lithuanian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-addons/language/lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Paimti albumų miniatiūras iš fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Paimti albumų miniatiūras iš theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Macedonian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Macedonian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Macedonian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Macedonian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-addons/language/mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Симни сликички за албум од fanart.tv" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Malay/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Malay/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Malay/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Malay/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-addons/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Dapatkan Lakaran Kenit Album dari fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Dapatkan Lakaran Kenit Album dari theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Norwegian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Norwegian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Norwegian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Norwegian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-addons/language/no/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Hent album bilder fra fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Hent Album Thumbs fra theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Polish/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Polish/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Polish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Polish/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-addons/language/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Pobieraj miniatur albumu z fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Pobieraj miniatur albumu theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-addons/language/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Obter miniaturas de álbum em fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Obter miniaturas de álbum em theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese (Brazil)/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese (Brazil)/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese (Brazil)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese (Brazil)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-addons/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Obter miniaturas de álbuns de fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Pegar miniaturas de álbum de theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Romanian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Romanian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Romanian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Romanian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-addons/language/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Obţine imagini albume de la fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Obţine imagini albume de la theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Russian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Russian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Russian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Russian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-addons/language/ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Загружать эскизы альбомов с fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Загружать эскизы альбомов с fanart.tv" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovak/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovak/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovak/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovak/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-addons/language/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Získať náhľady albumov zo stránky fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Získať náhľady albumov zo stránky theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovenian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovenian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovenian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovenian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-addons/language/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Prenesi sličice albumov s fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Prenesi sličice albumov z theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-addons/language/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Obtener miniatura de álbum de fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Descargar miniaturas de álbum desde theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Argentina)/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Argentina)/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Argentina)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Argentina)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-addons/language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Obtener miniaturas de álbum de fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Descargar miniaturas de álbum de theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Mexico)/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Mexico)/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Mexico)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Mexico)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-addons/language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Obtener miniaturas de álbumes desde fanart.tv" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Swedish/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Swedish/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Swedish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Swedish/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-addons/language/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Hämta albumminiatyrer från fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Hämta albumminiatyrer från theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Tamil (India)/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Tamil (India)/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Tamil (India)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Tamil (India)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-addons/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "ஆல்பம் குருபடங்களை fanart.tv இருந்து கைப்பற்று" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "ஆல்பம் குருபடங்களை theaudiodb.com இருந்து கைப்பற்று" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Thai/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Thai/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Thai/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Thai/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-addons/language/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "ดึงข้อมูลภาพปกอัลบั้มจาก fanart.tv" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Turkish/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Turkish/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Turkish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Turkish/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-addons/language/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Albüm kapaklarını fanart.tv'den al" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Ukrainian/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Ukrainian/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Ukrainian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Ukrainian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-addons/language/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Отримати малюнки альбому з fanart.tv" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Vietnamese/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Vietnamese/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Vietnamese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Vietnamese/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-addons/language/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Lấy hình đại diện album từ nguồn fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Lấy hình đại diện album từ nguồn theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Welsh/strings.po kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Welsh/strings.po --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Welsh/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/language/Welsh/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: TheAudioDb.com for Music Videos +# Addon id: metadata.musicvideos.theaudiodb.com +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-addons/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "Grab album thumbs from fanart.tv" +msgstr "Estyn lluniau bach album o fanart.tv" + +msgctxt "#30001" +msgid "Grab album thumbs from theaudiodb.com" +msgstr "Estynnwch luniau bach albwm o theaudiodb.com" diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/settings.xml kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/settings.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/resources/settings.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/resources/settings.xml 2013-09-19 07:42:51.000000000 +0000 @@ -0,0 +1,5 @@ + + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/tadb.xml kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/tadb.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.musicvideos.theaudiodb.com/tadb.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.musicvideos.theaudiodb.com/tadb.xml 2015-06-14 19:32:48.000000000 +0000 @@ -0,0 +1,71 @@ + + + + + http://www.theaudiodb.com/track/(.+) + + + + + + ((?:[^%]*(?:%20))*[^%]*)(?:%27)((?:[^%]*(?:%20))*[^%]*) + + + (.+)%20(?:%20|-)%20(.+) + + + + + + ^$ + + + + + + + + idTrack":"([^"]*)","idAlbum":"([^"]*).*?"strTrack":"([^"]*)","strAlbum":"([^"]*)","strArtist":"([^"]*) + + + + + + + + strTrack":"([^"]*)" + + + strArtist":"([^"]*)" + + + strAlbum":"([^"]*)" + + + strDescriptionEN":"(.*?)"," + + + strMusicVidDirector":"(.*?)"," + + + strMusicVidCompany":"(.*?)"," + + + strMusicVidScreen1\d?":"([^"]*) + + + strMusicBrainzAlbumID":"([^"]*)" + + + strMusicBrainzAlbumID":"([^"]*)" + + + strMusicBrainzAlbumID":"([^"]*)" + + + strMusicBrainzAlbumID":"([^"]*)" + + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.themoviedb.org/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.themoviedb.org/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.themoviedb.org/addon.xml 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.themoviedb.org/addon.xml 2015-08-14 16:41:50.000000000 +0000 @@ -1,8 +1,8 @@ + version="3.8.4" + provider-name="XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.themoviedb.org/changelog.txt kodi-15.2~git20151019.1039-final/addons/metadata.themoviedb.org/changelog.txt --- kodi-16.1~git20160425.1001-final/addons/metadata.themoviedb.org/changelog.txt 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.themoviedb.org/changelog.txt 2015-08-14 16:41:50.000000000 +0000 @@ -1,15 +1,3 @@ -[B]3.9.0[/B] -- Update - -[B]3.8.8[/B] -- Update author name - -[B]3.8.7[/B] -- fixed: caching - -[B]3.8.6[/B] -- fixed: broken search results due to API changes - [B]3.8.4[/B] - removed: option to scrape trailers from hd-trailers.net (it was broken) diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.themoviedb.org/tmdb.xml kodi-15.2~git20151019.1039-final/addons/metadata.themoviedb.org/tmdb.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.themoviedb.org/tmdb.xml 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.themoviedb.org/tmdb.xml 2015-08-14 16:41:50.000000000 +0000 @@ -1,7 +1,7 @@  - + (.+) @@ -9,26 +9,26 @@ - + (themoviedb.org/movie/)([0-9]*) - + imdb....?/title/tt([0-9]+) - + imdb....?/Title\?t{0,2}([0-9]+) - - "release_date":"([0-9]+)-.*?"id":([0-9]*),"original_title":"[^"]*","original_language":"[^"]*","title":"([^"]*)" + + "id":([0-9]*),"original_language":"[^"]*","original_title":"([^"]*)","overview":.*?,"release_date":"([0-9]+)-.*?"title":"([^"]*) - - "release_date":"([0-9]+)-.*?"id":([0-9]*),"original_title":"([^"]*)","original_language":"[^"]*" + + "id":([0-9]*),"original_language":"[^"]*","original_title":"([^"]*)","overview":.*?,"release_date":"([0-9]+)- - - "release_date":null.*?"id":([0-9]*),"original_title":"([^"]*)","original_language":"[^"]*" + + "id":([0-9]*),"original_language":"[^"]*","original_title":"([^"]*)","overview":.*?,"release_date":null @@ -59,7 +59,7 @@ "runtime":([0-9]+) - + ^$ diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.tvdb.com/addon.xml kodi-15.2~git20151019.1039-final/addons/metadata.tvdb.com/addon.xml --- kodi-16.1~git20160425.1001-final/addons/metadata.tvdb.com/addon.xml 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.tvdb.com/addon.xml 2015-08-14 16:41:50.000000000 +0000 @@ -1,8 +1,8 @@ + version="1.8.2" + provider-name="XBMC Foundation"> diff -Nru kodi-16.1~git20160425.1001-final/addons/metadata.tvdb.com/changelog.txt kodi-15.2~git20151019.1039-final/addons/metadata.tvdb.com/changelog.txt --- kodi-16.1~git20160425.1001-final/addons/metadata.tvdb.com/changelog.txt 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/metadata.tvdb.com/changelog.txt 2015-08-14 16:41:50.000000000 +0000 @@ -1,6 +1,3 @@ -[B]1.8.3[/B] -- Update author name - [B]1.8.2[/B] - Fixed: Runtime being zero in some cases diff -Nru kodi-16.1~git20160425.1001-final/addons/repository.xbmc.org/addon.xml kodi-15.2~git20151019.1039-final/addons/repository.xbmc.org/addon.xml --- kodi-16.1~git20160425.1001-final/addons/repository.xbmc.org/addon.xml 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/repository.xbmc.org/addon.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,17 +1,29 @@ - - http://mirrors.kodi.tv/addons/jarvis/addons.xml.gz - http://mirrors.kodi.tv/addons/jarvis/addons.xml.gz.md5 - http://mirrors.kodi.tv/addons/jarvis + + http://mirrors.kodi.tv/addons/gotham/addons.xml + http://mirrors.kodi.tv/addons/gotham/addons.xml.md5 + http://mirrors.kodi.tv/addons/gotham + true + + + http://mirrors.kodi.tv/addons/helix/addons.xml + http://mirrors.kodi.tv/addons/helix/addons.xml.md5 + http://mirrors.kodi.tv/addons/helix + true + + + http://mirrors.kodi.tv/addons/isengard/addons.xml + http://mirrors.kodi.tv/addons/isengard/addons.xml.md5 + http://mirrors.kodi.tv/addons/isengard true @@ -36,7 +48,7 @@ Installar Add-ons de Kodi.tv Paigalda lisasid lehelt Kodi.tv Instalatu Kodi.tv-eko gehigarriak - ‫نصف افزونه‌ها از Kodi.tv + نصب افزونه ها از سایت Kodi.tv Asenna lisäosia Kodi.tv -sivustolta Installer des addiciels depuis Kodi.tv Installer des extensions depuis Kodi.tv @@ -53,19 +65,18 @@ Instalēt pielikumus no Kodi.tv Инсталирај Додатоци од Kodi.tv Pasang tambahan daripada Kodi.tv - Installa Add-ons minn Kodi.tv Kodi.tv မှ Add-on များကိုသွင်းမည် Installer utvidelser fra Kodi.tv Add-ons van Kodi.tv installeren Instaluj dodatki z Kodi.tv Instale Add-ons do Kodi.tv - Instalar add-ons a partir de Kodi.tv + Instalar Add-ons a partir de Kodi.tv Instalați suplimente de la Kodi.tv Установить дополнения с сайта Kodi.tv Inštalovať rozšírenia z Kodi.tv Namestite dodatke s Kodi.tv - Инсталирај додатне програме са Kodi.tv - Instaliraj dodatne programe sa Kodi.tv + Инсталирај додатке са Kodi.tv + Instaliraj dodatne programe sa Kodi-tv Installera tillägg från Kodi.tv Насб кардани барномаҳои иловагӣ аз Kodi.tv ติดตั้งส่วนเสริมจาก Kodi.tv @@ -93,35 +104,34 @@ Descarga e instala add-ons del repositorio oficial Kodi.tv.[CR] Al usar el repositorio oficial, tendrá la ventaja de los servicios de espejos, y así tener descargas más rápidas.[CR] Todos los add-ons en este repositorio se han probado de manera básica, si encuentra alguno que no funciona o roto, favor de reportarlo al Equipo de Kodi para poder tomar las medidas necesarias. Lae alla ja installi lisasid ametlikust Kodi.tv hoidlast.[CR] Ametliku hoidla kasutamise eeliseks on võimalus kasutada meie ulatuslikku failide peegelteenust laadides faile sulle kõige lähemast serverist.[CR] Kõik lisad selles hoidlas on läbinud elementaarse testimise. Siiski, kui sa leiad vigase või mittetöötava lisa, siis palun teavita sellest Kodi meeskonda, et me saaksime vajaliku abi osutada. Gehigarriak Kodi.tv biltegi ofizialetik deskargatu eta instalatu.[CR] Biltegi ofiziala erabiliaz zutaz gertu dagoen gune batetik deskargatu ditzakezu gure fitxategi-ispilu multzoaren abantailaz aprobetxatuaz.[CR] Biltegi honetako gehigarri guztiek proba basikoak gainditu dituzte baina hondaturiko edo funtzionatzen ez duen gehigarri baten bat aurki ezkero honen berri Kodi taldeari eman beharrezko ekintzak burutu ditzagun. - افزودنی‫ ها را از منبع رسمی افزونه ها در Kodi.tv ‫دانلود و نصب کنید. [CR]‫ با ا‫ستفاده از منبع‫‫‫‫ ‫رسمی شما قادر خواهید‫ بود از خدمات گسترده سرویس دانلود جایگزین ما بهره ببرید که امکان دانلود از مناطق نزدیکتر را در اختیار شما قرار می دهد. [CR]‫ ‫همه افزونه های این منبع آزمایش های اولیه را پشت سر گذاشته اند. در صورت یافتن افزونه معیوب یا غیر قابل استفاده لطفا آن را به تیم کودی گزارش‫ کنید تا اقدامات لازم ‫را انجام د‫هیم‫. + افزودنی ها را از منبع رسمی افزونه ها در Kodi.tv دانلود و نصب کنید. [CR] با استفاده از منبع رسمی شما قادر خواهید بود از خدمات گسترده سرویس دانلود جایگزین ما بهره ببرید که امکان دانلود از مناطق نزدیکتر را در اختیار شما قرار می دهد. [CR] همه افزونه های این منبع آزمایش های اولیه را پشت سر گذاشته اند. در صورت یافتن افزونه معیوب یا غیر قابل استفاده لطفا آن را به تیم کودی گزارش کنید تا اقدامات لازم را انجام دهیم. Lataa ja asenna lisäosia virallisesta Kodi.tv -lisäosasäilöstä.[CR] Käyttämällä virallista säilöä sinun on mahdollista käyttää hyväksesi meidän kattavaa tiedostojen peilauspalveluamme saavuttaaksesi korkeat latausnopeudet sinun lähialueeltasi.[CR] Kaikki tämän säilön lisäosat on testattu toimiviksi, jos löydät rikkinäisen tai "ei toimivan" lisäosan, ilmoita siitä Team-Kodi:lle, jotta voimme korjata asian. Télécharger et installer des addiciels depuis le dépôt officiel de Kodi.tv.[CR] En utilisant le dépôt officiel vous pourrez bénéficier de notre service étendu de miroirs de fichiers favorisant des téléchargements plus rapides depuis une région proche de vous.[CR] Tous les addiciels de ce dépôt ont subi des tests de base. Si vous trouvez un addiciel non fonctionnel ou brisé, veuillez le rapporter à l'équipe-Kodi afin que nous puissions agir. - Télécharger et installer des extensions à partir du dépôt officiel Kodi.tv.[CR]En utilisant le dépôt officiel, vous bénéficierez de notre service de serveurs miroirs permettant de télécharger rapidement depuis une région proche de chez vous.[CR]Toutes les extensions de ce dépôt ont été testées sommairement, si vous trouvez une extension endommagée ou non fonctionnelle, merci d'en informer l'Équipe Kodi afin que nous puissions prendre les mesures nécessaires. - Descargar e instalar Engadidos dende o repositorio oficial de Kodi.tv.[CR] Empregando o repositorio oficial, vostede poderá gozar das vantaxes do seu extenso servizo de replicación de ficheiros que lle permite unhas descargas máis rápidas dende unha rexión preto a vostede.[CR] Tódolos Engadidos deste repositorio pasaron por comprobacións básicas. Se atopa algún Engadido roto ou non funcional, por favor repórteo ó equipo de Kodi para que poidan actuar en consecuencia. + Télécharger et installer des extensions à partir du dépôt officiel Kodi.tv.[CR] En utilisant le dépôt officiel, vous bénéficierez de notre service de serveurs miroirs vous permettant de télécharger rapidement depuis une région proche de chez vous.[CR] Toutes les extensions de ce dépôt ont été testées sommairement, si vous trouvez une extension corrompue ou inutilisable, veuillez en informer l'Équipe Kodi afin que nous puissions prendre les mesures nécessaires. + Descargar e instalar Engadidos dende o repositorio oficial de Kodi.tv.[CR] Empregando o repositorio oficial, vostede poderá gozar das vantaxes do seu extenso servizo de replicación de ficheiros que lle permite unhas descargas máis rápidas dende unha rexión preto a vostede.[CR] Tódolos Engadidos deste repositorio pasaron por comprobacións básicas. Se atopa algún Engadido roto ou non funcional, por favor reporteo ó equipo de Kodi para que poidan actuar en consecuencia. הורדה והתקנת הרחבות ממאגר הרחבות Kodi.tv הרשמי.[CR] שימוש במאגר הרשמי מאפשר לנצל את שירות שיקוף הקבצים של Kodi.tv העוזר להוריד מהר יותר מהשרת הקרוב ביותר.[CR] כל ההרחבות במאגר זה עברו בדיקה בסיסית. יש לדווח לצוות הפיתוח של Kodi על כל הרחבה שנמצאה כלא תקינה או שלא עובדת ע"מ שתתבצע הפעולה המתאימה. Preuzmite i instalirajte dodatke sa službenog Kodi.tv repozitorija dodataka.[CR] Korištenjem službenog repozitorija bit ćete u mogućnosti iskoristiti prednosti usluge našeg brzog zrcalnog poslužitelja datoteka, da bi mogli brže preuzimati iz regije koje je bliže vašoj lokaciji.[CR] Svi dodaci na ovom repozitoriju prošli su osnovno testiranje, u slučaju da primijetite neispravan dodatak, molimo vas da to prijavite Kodi timu koji će zatim poduzeti potrebne korake. - Kiegészítők letöltése és telepítése a hivatalos Kodi.tv tárolóhelyről.[CR] A hivatalos tárolóhely használatával kihasználhatja a szerteágazó tükörkiszolgáló hálózatunkat, ami segít a gyorsabb letöltésben egy közeli kiszolgáló használatával.[CR] Minden kiegészítő ezen a tárolóhelyen átment egy alaptesztelésen. Ha mégis hibás vagy nem működő kiegészítő talál, kérjük jelezze a Kodi csapatnak, hogy megtegyük a szükséges lépéseket. + Kiegészítők letöltése és telepítése a hivatalos Kodi.tv tárolóhelyről.[CR] A hivatalos tárolóhely használatával kihasználhatod szerteágazó tükör-kiszolgáló hálózatunkat, ami segít a gyorsabb letöltésben egy hozzád közelebb eső körzet használatával.[CR] Minden kiegészítő ezen a tárolóhelyen átment egy alaptesztelésen. Ha mégis hibás vagy nem működő kiegészítőt találsz, kérünk jelezd az Kodi csapatnak, hogy megtegyük a szükséges lépéseket. Unduh dan pasang pengaya dari repositori pengaya resmi Kodi.tv. [CR] Dengan menggunakan repositori resmi anda akan mendapat keuntungan dari miror berkas kami yang luas dimana dapat membantu anda untuk lebih cepat mengunduh dari daerah yang dekat dengan anda. [CR] Semua pengaya pada repository telah melalui uji coba standar, jika anda menemukan pengaya yang rusak atau tidak bekerja tolong laporkan kepada tim Kodi agar kami bisa menindak lanjutinya. Sækja og setja inn viðbætur frá hinu viðurkennda Kodi.tv viðbóta safni.[CR] Með því að nota þetta safn getur þú nýtt þér möguleikann á fullkmonni speglunar þjónustu sem hjálpar við að sækja viðbætur hraðar frá landsvæði nálægt þér.[CR] Allar viðbætur í þessu safni hafa gengið undir grunn prófanir, ef þú finnur viðbætur sem eru bilaðar eða virka ekki vinsamlegast látið Kodi teymið vita svo við getum gert eitthvað í málinu. - Scarica e installa gli add-on dalla libreria ufficiale di Kodi.tv.[CR] Usando la libreria ufficiale avrai il vantaggio di ottenere download più veloci con mirror più vicini alla tua località.[CR] Tutti gli add-on in questa libreria sono stati sottoposti a test di base, se ne trovi uno non funzionante o corrotto, per favore riporta il problema al team di Kodi così potremmo prendere provvedimenti. + Scarica ed installa gli add-on dalla libreria ufficiale di Kodi.tv[CR] Usando la libreria ufficiale avrai il vantaggio di ottenere download più veloci con mirror più vicini alla tua località.[CR] Tutti gli add-on in questa libreria sono stati sottoposti a test di base, se ne trovi uno non funzionante o corrotto, per favore riporta il problema al team di Kodi così potremmo prendere provvedimenti. オフィシャルの Kodi.tv リポジトリからアドオンをダウンロードします。[CR] オフィシャルリポジトリを使うことで、お住まいのエリアに近いミラーサーバーから高速にアドオンをダウンロードすることが可能です。[CR] このリポジトリ上のアドオンは全て、簡単な動作テストを受けてはいますが、もしアドオンがおかしかったりうまく動作しなかったりした場合は、Kodi チームに連絡をお願いします。 공식 Kodi.tv 애드온 저장소에서 애드온을 다운로드하여 설치합니다.[CR] 공식 저장소를 사용하면 파일 미러링 서비스를 통해 사용자와 가까운 곳에서 빠르게 다운로드할 수 있습니다.[CR] 저장소의 모든 애드온은 기본 테스트를 거치지만 작동이 되지 않거나 손상된 애드온을 발견하면 필요한 조치를 취할 수 있게 Team-Kodi로 알려주시기 바랍니다. Atsisiųskite ir įdiegite priedus iš oficialios Kodi.tv saugyklos.[CR]Naudojantis oficialia saugykla, galėsite pasinaudoti pranašumu mūsų didele failų veidrodinę paslauga.[CR]Taip pat siekiame padėti jums greičiau parsisiųsti priedą iš Jūsų regiono.[CR]Visiems šioje saugykloje saugomiems priedams buvo atliktas testavimas, jei Jūs radote netaisyklingą ir nedarbinį priedą.[CR]Prašome pranešti apie tai Kodi komandai, kad mes galėtume imtis būtinų veiksmų Lejupielādējiet un instalējiet pielikumus no oficiālā Kodi.tv pielikumu repozitorija[CR] Izmantojot oficiālo repozitoriju, varēsiet izmantot mūsu plašo spoguļu pakalpojumu, lai iegūtu ātrākas lejupielādes no reģiona, kas vistuvāk.[CR] Visi pielikumi šajā repozitorijā ir izgājuši pamata testēšanu, bet, ja atrodat saplīsušu vai nestrādājošu pielikumu, lūdzu, ziņojiet par to Team-Kodi, lai varam izpildīt nepieciešamās labošanas darbības. Превземи и инсталирај Додатоци од официјалниот Kodi.tv склад.[CR] Со користење на официјалниот склад ќе бидете во можност да ги користите предностите на нашата богата датотека со услуги која ви помага да добиете побрзи превземања од регионот блиску до вас.[CR] Сите Додатоци во овој склад се основно тестирани, ако најдете неисправни или додатоци кои не работат пријавете го тоа на тимот на Kodi така што ќе можеме да превземеме било каква акција што е потребна. Muat turun dan pasang tambahan PVR melalui repositori rasmi Kodi.tv[CR] Dengan menggunakan Repositori rasmi anda dapat perkhidmatan cermin fail yang luas supaya dapat memuat turun lebih pantas menerusi kawasan berhampiran anda.[CR] Semua tambahan di dalam repositori ini telah lulus pengujian asas, jika anda temui tambahan yang rosak atau tidak berfungsi sila laporkannya kepada Team-Kodi supaya kami boleh membuat tindakan yang sewajarnya. - Niżżel u nstalla add-ons mir-repożitorju uffiċjali ta Kodi.tv.[CR] Permezz ta' dan ir-ripożitorju uffiċjali tista' tieħu vantaġġ mis-servizz ta' file mirrors estensiv li jgħinek tniżżel l-add-ons iktar malajr minn postijiet li huma ġeografikament qrib tiegħek.[CR] L-Add-ons kollha f'dan ir-repożitorju għaddew minn testijiet bażiċi, f'każ li tinzerta xi add-on miksura jew mhux taħdem jekk jpgħġbok irrportha lil Team-Kodi biex inkunu nistgħu nieħdu l-azzjoni li jkun hemm bżonn. - Last ned og installer utvidelser fra den offisielle Kodi.tv pakkebrønnen.[CR] Når du benytter den offisielle pakkebrønnen kan du dra nytte av vår omfattende arkivtjeneste slik at du får raskere nedlasting fra en tjener nær deg.[CR] Alle utvidelser i denne brønnen har gått gjennom grunnleggende testing, men hvis du finner en utvidelse som ikke fungerer, vennligst rapporter det til Team-Kodi så vi får sett på det. + Last ned og installer utvidelser fra den offisielle Kodi.tv pakkebrønnen.[CR] Når du benytter den offisielle pakkebrønnen kan du dra nytte av vår omfattende arkivtjeneste slik at du får raskere nedlasting fra en server nær deg.[CR] Alle tillegg i denne brønnen har gått gjennom grunnleggende testing, men hvis du finner et tillegg som ikke fungerer, vennligst rapporter det til Team-Kodi så vi får sett på det. Download en installeer add-ons uit de officiële Kodi.tv add-on depot.[CR] Wanneer u de officiële depot gebruikt beschikt u over onze uitgebreide mirrorservice, waardoor u snel kan downloaden van locaties in uw buurt.[CR] Alle add-ons in dit depot ondergingen standaardtests; indien u een defecte of niet-werkende add-on vindt, meld dit dan aan Team-Kodi zodat zij actie kunnen ondernemen. Pobieraj i instaluj dodatki z oficjalnego repozytorium Kodi.tv.[CR] Używając oficjalnego repozytorium korzystasz z serwerów lustrzanych, rozsianych po całym świecie. Wybierany jest ten, który znajduje się najbliżej ciebie, zapewniając dużą prędkość połączenia.[CR]Wszystkie dodatki znajdujące się w tym repozytorium są testowane, ale mogą okazać się niesprawne. Zgłoś wówczas błąd, aby zespół Kodi mógł podjąć odpowiednie działanie. Transfira e instale add-ons a partir do repositório oficial do Kodi.tv.[CR]|Ao utilizar o repositório oficial, você será capaz de tirar proveito do nosso serviço de espelhamento de arquivos, auxiliando em downloads mais rápidos a partir de uma região perto de você.[CR]|Todos os add-ons neste repositório passam por testes básicos, se você encontrar algum quebrado ou que não esteja funcionando, por favor reporte para a equipe do Kodi, para que possamos tomar as ações necessárias. - Descarregar e instalar os add-ons do repositório oficial Kodi.tv.[CR]Ao utilizar o repositório oficial, irá beneficiar do nosso serviço de servidores de ficheiro para o ajudar a ter descargas mais rápidas a partir da região mais perto de si.[CR]Todos os add-ons neste repositório foram alvo de testes básicos. Se encontrar um add-on danificado não funcional, informe a equipa do Kodi para que a situação seja resolva. + Transferir e instalar os add-ons do repositório de add-ons Oficiais de Kodi.tv.[CR]Ao utilizar o Repositório oficial, irá beneficiar do nosso serviço de servidores de ficheiro para o ajudar a ter transferências mais rápidas a partir da região mais perto de si.[CR]Todos os Add-ons neste repositório foram alvo de testes básicos. Se encontrar um danificado ou que não funciona, por favor, informe a Equipa do Kodi, para que a situação seja resolva. Descărcați și instalați suplimente din depozitul de suplimente Kodi.tv oficial.[CR] Folosind depozitul (repository) oficial puteți beneficia de serviciul nostru de găzduire distribuită pentru a vă ajuta să descărcați mai repede dintr-o regiune mai apropiată de dumneavoastră.[CR] Toate suplimentele din acest depozit au trecut testele de bază, în caz că găsiți un supliment defect vă rugăm să îl raportați echipei Kodi pentru a lua măsurile necesare. Загружайте и устанавливайте обновления из официального репозитория Kodi.tv[CR]Используя официальный репозиторий, вы сможете воспользоваться преимуществами распределенного хранилища для быстрой загрузки файлов с ближайшего к вам сервера.[CR]Все дополнения в данном репозитории прошли тестирование. Если вы обнаружили нерабочее дополнение, сообщите об этом разработчикам Kodi. Stiahnuť a nainštalovať rozšírenia z oficiálneho zdroja rozšírení Kodi.tv.[CR] Použitím oficiálneho zdroja získavate možnosť využiť rozsiahly systém zrkadiel, ktorý Vám umožní rýchlejšie sťahovanie z Vám blízkeho regiónu.[CR] Všetky rozšírenia v tomto zdroji boli podrobené základnému testovaniu. Ak nájdete poškodené alebo nefunkčné rozšírenie, oznámte to prosím týmu Kodi aby mohol podľa potreby zakročiť. Prenos in namestitev dodatkov iz uradnega skladišča Kodi.tv.[CR] Z uporabo uradnega skladišča, boste lahko izkoristili hitrejšo povezavo, ki bo izbrana glede na vašo lokacijo.[CR] Vsi dodatki tega skladišča so bili osnovno stestirani, če pa boste našli pokvarjen ali nedelujoč dodatek, to sporočite ekipi Kodi, da bomo lahko odpravili napake. - Преузми и инсталирај додатне програме из Званичног Kodi.tv спремишта за додатне програме.[CR] Коришћењем званичног Спремишта моћи ћете да искористите предности нашег сервиса копија датотека који ће вам помоћи приликом бржег преузимања из региона ближег вашој локацији.[CR] Сви додатни програми у овом спремишту прошли су основно тестирање, у случају да пронађете неисправан додатни програм молимо вас да то пријавите Kodi тиму који ће затим предузети неопходне мере. - Preuzmi i instaliraj dodatne programe iz Zvaničnog Kodi.tv spremišta za dodatne programe.[CR] Korišćenjem zvaničnog Spremišta moći ćete da iskoristite prednosti našeg servisa kopija datoteka koji će vam pomoći prilikom bržeg preuzimanja iz regiona bližeg vašoj lokaciji.[CR] Svi dodatni programi u ovom spremištu prošli su osnovno testiranje, u slučaju da pronađete neispravan dodatni program molimo vas da to prijavite Kodi timu koji će zatim preduzeti neophodne mere. + Преузмите и инсталирајте додатке из Званичног Kodi.tv спремишта додатака.[CR] Коришћењем званичног Спремишта моћићете да искористите предности нашег сервиса копија фајлова који ће вам помоћи приликом бржег преузимања из региона ближег вашој локацији.[CR] Сви додаци у овом спремишту прошли су основно тестирање, у случају да пронађете неисправан додатак молимо вас да то пријавите Kodi тиму који ће затим предузети неопходне мере. + Preuzmi i instaliraj dodatne programe iz Zvaničnog Kodi.tv spremišta za dodatne programe.[CR] Korišćenjem zvaničnog Spremišta moći ćete da iskoristite prednosti našeg servisa kopija fajlova koji će vam pomoći prilikom bržeg preuzimanja iz regiona bližeg vašoj lokaciji.[CR] Svi dodatni programi u ovom spremištu prošli su osnovno testiranje, u slučaju da pronađete neispravan dodatni program molimo vas da to prijavite Kodi timu koji će zatim preduzeti neophodne mere. Ladda ner och installera tillägg från det officiella Kodi.tv tilläggsförrådet.[CR]Genom att använda det officiella förrådet kommer du att få fördelen att kunna använda vår omfattande spegeltjänst som kommer att hjälpa dig till snabbare nedladdningar från en plats nära dig.[CR]Alla tillägg i detta förråd har genomgått grundläggande tester. Hittar du ett trasigt eller icke fungerande tillägg, vänligen meddela detta till Team-Kodi så att vi kan vidta nödvändiga åtgärder. Барномаҳои иловагиро аз анбори нармафзори Kodi.tv боргирӣ кунед ва насб намоед.[CR] Аз истифодаи анбори нармафзори расмии мо ба шумо имконият пайдо мешавад, ки тавонед шароити мусофидро аз хидмати оинаи файлии васеъ ба даст оред ва нармафзори лозимиро аз сервери минтакаи ба шумо наздиктар бо суръати баланд боргирӣ кунед.[CR] Ҳамаи барномаҳо аз анбори нармафзори мо дар ҳолати санҷишӣ мебошанд, бинобар ин агар ягон барномаи иловагии нуқсондор ё вайроншударо ёбед, лутфан дар бораи он барнома ва нуқсон пайдошуда ба гурӯҳи кории Kodi гузориш диҳед, то ин ки мо тавонем ҳамаи камбудиҳои барномаҳои моро ҳал кунем. ดาวน์โหลดและติดตั้งส่วนเสริม จากแหล่งข้อมูลโปรแกรมของ Kodi.tv อย่างเป็นทางการ.[CR] โดยการใช้งานแหล่งข้อมูลโปรแกรมอย่างเป็นทางการ คุณสามารถใช้ประโยชน์จากบริการแฟ้มมิเรอร์ที่กว้างขวางของเรา ที่จะช่วยให้การดาวน์โหลดของคุณเร็วขึ้นจากภูมิภาคที่ใกล้ที่สุด.[CR] ส่วนเสริม ทั้งหมดในแหล่งเก็บข้อมูลนี้ อยู่ภายใต้การทดสอบขั้นพื้นฐานแล้ว ถ้าคุณพบส่วนเสริมที่เสียหายหรือไม่ทำงาน กรุณาแจ้งทีมงาน Kodi เพื่อให้เราสามารถดำเนินการใด ๆ ที่จำเป็น. @@ -150,10 +160,10 @@ El equipo de Kodi no hizo todos los add-ons en este repositorio y no es responsable de su contenido Kodi meeskond ei teinud kõiki lisasid selles hoidlas ja ei vastuta ka nende sisu eest. Kodi taldeak ez ditu biltegi honetako gehigarri guztiak sortu eta ez da beren edukien erantzule. - همه افزونه های این منبع محصول کار تیم کودی نیستند و این تیم مسئولیتی در قبال محتوای‫ آنها ندارد. + همه افزونه های این منبع محصول کار تیم کودی نیستند و این تیم مسئولیتی در قبال محتوای آنها ندارد. Team-Kodi ei ole tehnyt kaikkia tässä säilössä olevia lisäosia, eikä siten ole vastuullinen kyseisten lisäosien sisällöstä L'équipe-Kodi n'a pas créé tous les addiciels de ce dépôt et n'est pas responsable de leur contenu - L'Équipe Kodi n'a pas créé toutes les extensions de ce dépôt et n'est pas responsable de leur contenu. + L'Équipe-Kodi n'a pas créé toutes les extensions de ce dépôt et n'est pas responsable de leur contenu O equipo de Kodi non creou todos os Engadidos deste repositorio e non é responsábel do seu contido צוות הפיתוח של Kodi לא יצר את כל ההרחבות שבמאגר זה ואיננו אחראי על תוכנן Kodi tim nije autor svih dodataka u ovom repozitoriju te kao takvi ne odgovaraju za njihov sadržaj @@ -162,12 +172,11 @@ Kodi teymið gerir ekki allar þessar viðbætur og er ekki ábyrgt fyrir innihaldi þeirra. Il team di Kodi non ha creato tutti gli add-on di questa libreria e non è responsabile per il loro contenuto Kodi チームが、このリポジトリ上の全アドオンを作ったわけではありません。また、その内容についても責任は負いかねます。 - Team-Kodi가 이 저장소의 모든 애드온을 제작한 것은 아니며, 애드온 콘텐츠에 대한 책임이 없습니다. + Team-Kodi가 이 저장소의 모든 애드온을 제작한 것은 아니며, 애드온 컨텐츠에 대한 책임이 없습니다. Kodi komanda netestavo priedų šioje saugykloje ir neatsako arba nėra atsakinga už jų turinį Kodi komanda nav izveidojusi visus šīs krātuves pielikumus un nav atbildīga par to saturu Kodi тимот ги нема направено сите овие додатоци и не е одговорен за нивната содржина Team-Kodi tidak menghasilkan semua tambahan di dalam repositori ini dan tidak bertanggungjawab keatas kandungannya - Team-Kodi m'għamilx l-add-ons kollha li hawn f'dan ir-repożitorju u mhumiex responsabbli għall-kontenut tagħhom Team-Kodi har ikke utviklet alle utvidelsene i denne pakkebrønnen og er ikke ansvarlig for deres innhold Team-Kodi heeft niet alle add-ons in deze depot geschreven en is niet verantwoordelijk voor hun inhoud. Zespół Kodi nie tworzy wszystkich dodatków i nie bierze odpowiedzialności za ich zawartość @@ -177,7 +186,7 @@ Разработчики Kodi не являются авторами всех дополнений в данном репозитории и не несут ответственность за их содержимое. Team-Kodi nevytvoril všetky rozšírenia v tomto zdroji nie je zodpovedný za ich obsah Ekipa Kodi ni naredila vseh dodatkov v tem skladišču in ne odgovarja za njihovo vsebino - Тим-Kodi није направио све додатне програме у овом спремишту и није одговоран за њихов садржај + Тим Kodi није направио све додатке у овом спремишту и није одговоран за њихов садржај Tim-Kodi nije napravio sve dodatne programe u ovom spremištu i nije odgovoran za njihov sadržaj Team-Kodi har inte gjort alla tillägg och är inte ansvariga för innehållet i dessa. Гурӯҳи кории Kodi дар ин анбори нармафзор соҳиби ҳамаи барномаҳои иловагӣ намебошад ва барои мӯҳтавояшон ҷавобгар намебшад diff -Nru kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/addon.xml kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/addon.xml --- kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/addon.xml 2015-11-02 01:00:11.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/addon.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - - - - - - - - Default Weather Icons - Default set of Weather Icons shipped with Kodi - all - - Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/License.txt kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/License.txt --- kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/License.txt 2015-11-02 01:00:11.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/License.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -Kodi Realistic Weather Icon Set by Mominur Rahman (www.illuminatedimages.co.uk) is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. - -http://creativecommons.org/licenses/by-nc-sa/3.0/ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/0.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/0.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/10.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/10.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/11.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/11.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/12.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/12.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/13.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/13.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/14.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/14.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/15.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/15.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/16.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/16.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/17.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/17.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/18.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/18.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/19.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/19.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/20.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/20.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/21.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/21.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/22.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/22.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/23.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/23.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/24.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/24.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/25.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/25.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/26.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/26.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/27.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/27.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/28.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/28.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/29.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/29.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/30.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/30.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/31.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/31.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/32.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/32.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/33.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/33.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/34.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/34.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/35.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/35.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/36.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/36.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/37.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/37.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/38.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/38.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/39.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/39.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/40.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/40.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/41.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/41.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/42.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/42.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/43.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/43.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/44.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/44.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/45.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/45.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/46.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/46.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/47.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/47.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/4.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/4.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/5.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/5.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/6.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/6.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/7.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/7.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/8.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/8.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/9.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/9.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/License.txt kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/License.txt --- kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/License.txt 2015-11-02 01:00:11.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/License.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -XBMC Realistic Weather Icon Set by Mominur Rahman (www.illuminatedimages.co.uk) is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. - -http://creativecommons.org/licenses/by-nc-sa/3.0/ \ No newline at end of file Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/resource.images.weathericons.default/resources/na.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/resource.images.weathericons.default/resources/na.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/resource.language.en_gb/addon.xml kodi-15.2~git20151019.1039-final/addons/resource.language.en_gb/addon.xml --- kodi-16.1~git20160425.1001-final/addons/resource.language.en_gb/addon.xml 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/resource.language.en_gb/addon.xml 2015-04-04 00:00:11.000000000 +0000 @@ -1,7 +1,7 @@ diff -Nru kodi-16.1~git20160425.1001-final/addons/resource.language.en_gb/resources/strings.po kodi-15.2~git20151019.1039-final/addons/resource.language.en_gb/resources/strings.po --- kodi-16.1~git20160425.1001-final/addons/resource.language.en_gb/resources/strings.po 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/resource.language.en_gb/resources/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -79,6 +79,7 @@ msgstr "" #empty string with id 10 +#strings from 11 to 17 are reserved for weather translation #. Weather token msgctxt "#11" @@ -246,6 +247,7 @@ msgstr "" #empty strings from id 63 to 70 +#strings from 71 to 97 are reserved for weather translation #. Weather token msgctxt "#71" @@ -488,7 +490,6 @@ msgid "Would you like to delete the selected file(s)?[CR]Warning - this action can't be undone!" msgstr "" -#: xbmc/peripherals/bus/PeripheralBus.cpp #: xbmc/dialogs/GUIDialogMediaFilter.cpp #: xbmc/playlists/SmartPlaylist.cpp msgctxt "#126" @@ -591,8 +592,6 @@ msgid "Current:" msgstr "" -#. Used in Confluence system info to show build info -#: addons/skin.confluence/720p/SettingsSystemInfo.xml msgctxt "#144" msgid "Build:" msgstr "" @@ -647,7 +646,6 @@ msgid "Free" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp msgctxt "#157" msgid "Video" msgstr "" @@ -727,11 +725,7 @@ msgid "Display 4:3 videos as" msgstr "" -#. Used in Confluence system info to show build date -#: addons/skin.confluence/720p/SettingsSystemInfo.xml -msgctxt "#174" -msgid "Compiled:" -msgstr "" +#empty string with id 174 #: xbmc/playlists/SmartPlaylist.cpp msgctxt "#175" @@ -743,19 +737,10 @@ msgid "Styles" msgstr "" -#. successfully started -#: xbmc/Application.cpp -msgctxt "#177" -msgid "%s successfully started" -msgstr "" - -#. has been successfully started. -#: xbmc/Application.cpp -msgctxt "#178" -msgid "%s has been successfully started." -msgstr "" +#empty strings from id 177 to 178 #: xbmc/media/MediaTypes.cpp +#: xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp msgctxt "#179" msgid "Song" msgstr "" @@ -1008,14 +993,11 @@ msgid "Video filters" msgstr "" -#. Name of an action to perform on a specific event, like changing the CEC source away from Kodi #: system/peripherals.xml #: xbmc/addons/GUIViewStateAddonBrowser.cpp #: xbmc/dialogs/GUIDialogMediaSource.cpp #: xbmc/playlists/SmartPlaylist.cpp #: system/settings/settings.xml -#: xbmc/LangInfo.cpp -#: ###this documented usage does not cover all usecases yet### msgctxt "#231" msgid "None" msgstr "" @@ -1093,7 +1075,6 @@ #: xbmc/dialogs/GUIDialogMediaSource.cpp #: xbmc/media/MediaTypes.cpp -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp msgctxt "#249" msgid "Music" msgstr "" @@ -1163,11 +1144,6 @@ msgid "Allow remote control via HTTP" msgstr "" -#. Label for a context menu entry to start/schedule a recording -#: xbmc/music/windows/GUIWindowMusicBase.cpp -#: xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp -#: xbmc/pvr/windows/GUIWindowPVRGuide.cpp -#: xbmc/pvr/windows/GUIWindowPVRSearch.cpp msgctxt "#264" msgid "Record" msgstr "" @@ -1341,11 +1317,9 @@ msgid "Language" msgstr "" -#. Label of active/inactive radiobutton in PVR timer settings dialog #: system/peripherals.xml #: xbmc/filesystem/AddonsDirectory.cpp #: system/settings/settings.xml -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#305" msgid "Enabled" msgstr "" @@ -1356,12 +1330,10 @@ #empty string with id 307 -#: xbmc/LangInfo.cpp msgctxt "#308" msgid "Original stream's language" msgstr "" -#: xbmc/LangInfo.cpp msgctxt "#309" msgid "User interface language" msgstr "" @@ -1383,7 +1355,6 @@ msgstr "" #: xbmc/music/MusicDatabase.cpp -#: xbmc/pvr/PVRManager.cpp msgctxt "#313" msgid "Cleaning database" msgstr "" @@ -2476,7 +2447,6 @@ #: xbmc/dialogs/GUIDialogMediaFilter.cpp #: xbmc/playlists/SmartPlaylist.cpp -#: xbmc/video/dialogs/GUIDialogVideoInfo.cpp msgctxt "#563" msgid "Rating" msgstr "" @@ -2554,12 +2524,7 @@ msgid "Date taken" msgstr "" -#: xbmc/utils/SortUtils.cpp -msgctxt "#578" -msgid "Artist / Year" -msgstr "" - -#empty string with id 579 +#empty strings from id 578 to 579 msgctxt "#580" msgid "Sort direction" @@ -2577,12 +2542,10 @@ msgid "Remember views for different folders" msgstr "" -#: xbmc/view/GUIViewState.cpp msgctxt "#584" msgid "Ascending" msgstr "" -#: xbmc/view/GUIViewState.cpp msgctxt "#585" msgid "Descending" msgstr "" @@ -2616,13 +2579,11 @@ msgid "One" msgstr "" -#. Label used for buttons and select options as a reference to match all items or ocurrences. #: xbmc/dialogs/GUIDialogMediaFilter.cpp #: xbmc/filesystem/AddonsDirectory.cpp #: xbmc/PlayListPlayer.cpp #: xbmc/profiles/dialogs/GUIDialogLockSettings.cpp #: xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.cpp -#: xbmc/pvr/windows/GUIWindowPVRBase.cpp msgctxt "#593" msgid "All" msgstr "" @@ -2696,7 +2657,6 @@ msgid "Bits/sample" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp msgctxt "#613" msgid "Sample rate" msgstr "" @@ -2819,10 +2779,7 @@ msgid "Avoid clipping on ReplayGained files" msgstr "" -#: system/settings/settings.xml -msgctxt "#644" -msgid "Stretch 16:9 - Nonlinear" -msgstr "" +#empty string with id 644 msgctxt "#645" msgid "Need to unpack a big file. Continue?" @@ -3168,7 +3125,13 @@ msgid "Files" msgstr "" -#empty strings from id 745 to 746 +msgctxt "#745" +msgid "No scanned information for this view" +msgstr "" + +msgctxt "#746" +msgid "Please turn off library mode" +msgstr "" msgctxt "#747" msgid "Error loading image" @@ -3402,247 +3365,7 @@ msgid "%s of %s available" msgstr "" -#. Label of list control for choosing the timer type (one time, repeating, ...) in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#803" -msgid "Type" -msgstr "" - -#. Label of 'Guide data title search' edit field in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#804" -msgid "Search guide for" -msgstr "" - -#. Help of 'Guide data title search' edit field in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#805" -msgid "Enter the search string to use to lookup matching events in the guide" -msgstr "" - -#. Label of "Fulltext search" edit field in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#806" -msgid "Fulltext search (or title search only)" -msgstr "" - -#. special days of week representation value for a timer schedule -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#807" -msgid "Any day" -msgstr "" - -#. special days of week representation for a repeating timer -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#808" -msgid "Every day" -msgstr "" - -#. special channel representation value for a repeating timer -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#809" -msgid "Any channel" -msgstr "" - -#. Label of "Start any time" radio button in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#810" -msgid "Start any time" -msgstr "" - -# Label of "Recording group" list in the PVR timer setting dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#811" -msgid "Recording group" -msgstr "" - -#. Label for setting TV->Recordings->Prevent duplicate episodes -#. Label of prevent duplicate episodes list control (if user does not want to record the same episode multiple times) in PVR timer settings dialog -#: system/settings/settings.xml -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#812" -msgid "Prevent duplicate episodes" -msgstr "" - -#. Label of pre-record margin spinner in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#813" -msgid "Start padding time" -msgstr "" - -#. Label of post-record margin spinner in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#814" -msgid "End padding time" -msgstr "" - -#. Value of prevent duplicate episodes list control -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#815" -msgid "Record all episodes" -msgstr "" - -#. Value of prevent duplicate episodes list control -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#816" -msgid "Record only new episodes" -msgstr "" - -#. Label of "End any time" radio button in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#817" -msgid "End any time" -msgstr "" - -#. Label of "MaxRecordings" list in the PVR timer setting dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp -msgctxt "#818" -msgid "Max recordings" -msgstr "" - -#empty string with id 819 - -#. Representation of a one-time timer. -#: xbmc/pvr/addons/PVRClient.cpp -msgctxt "#820" -msgid "One time" -msgstr "" - -#. Representation of an epg-based one-time timer. -#: xbmc/pvr/addons/PVRClient.cpp -msgctxt "#821" -msgid "One time (guide-based)" -msgstr "" - -#. Representation of a timer schedule -#: xbmc/pvr/addons/PVRClient.cpp -msgctxt "#822" -msgid "Repeating" -msgstr "" - -#. Representation of an epg-based timer schedule. -#: xbmc/pvr/addons/PVRClient.cpp -msgctxt "#823" -msgid "Repeating (guide-based)" -msgstr "" - -#empty strings from id 824 to 827 - -#. Text for notification that a repeating timer has been deleted -#: xbmc/pvr/timers/PVRTimers.cpp -msgctxt "#828" -msgid "Repeating timer deleted" -msgstr "" - -#empty strings from id 829 to 830 - -#. Weekday representation -#: xbmc/dialogs/GUIDialogPVRTimerWeekdaysSettings.cpp -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#831" -msgid "Mondays" -msgstr "" - -#. Weekday representation -#: xbmc/dialogs/GUIDialogPVRTimerWeekdaysSettings.cpp -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#832" -msgid "Tuesdays" -msgstr "" - -#. Weekday representation -#: xbmc/dialogs/GUIDialogPVRTimerWeekdaysSettings.cpp -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#833" -msgid "Wednesdays" -msgstr "" - -#. Weekday representation -#: xbmc/dialogs/GUIDialogPVRTimerWeekdaysSettings.cpp -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#834" -msgid "Thursdays" -msgstr "" - -#. Weekday representation -#: xbmc/dialogs/GUIDialogPVRTimerWeekdaysSettings.cpp -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#835" -msgid "Fridays" -msgstr "" - -#. Weekday representation -#: xbmc/dialogs/GUIDialogPVRTimerWeekdaysSettings.cpp -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#836" -msgid "Saturdays" -msgstr "" - -#. Weekday representation -#: xbmc/dialogs/GUIDialogPVRTimerWeekdaysSettings.cpp -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#837" -msgid "Sundays" -msgstr "" - -#empty strings from id 838 to 839 - -#. Message in a dialog when a user wants to delete a timer that was scheduled by a repeating timer -#: xbmc/pvr/windows/GUIWindowPVRBase.cpp -msgctxt "#840" -msgid "Do you only want to delete this timer or also the repeating timer that has scheduled it?" -msgstr "" - -#. Label for No button in a dialog when a user wants to delete a timer that was scheduled by a repeating timer -#: xbmc/pvr/windows/GUIWindowPVRBase.cpp -msgctxt "#841" -msgid "Only this" -msgstr "" - -#. Label of the option to switch between hierarchical and flat timer view (in confluence sideblade). -#: skin.confluence -msgctxt "#842" -msgid "Group timers" -msgstr "" - -#. Label for a context menu entry to activate a currently inactive timer -#: xbmc/pvr/windows/GUIWindowPVRTimers.cpp -msgctxt "#843" -msgid "Activate" -msgstr "" - -#. Label for a context menu entry to deactivate a currently active timer -#: xbmc/pvr/windows/GUIWindowPVRTimers.cpp -msgctxt "#844" -msgid "Deactivate" -msgstr "" - -#. Message in a dialog when a user wants to delete a repeating timer -#: xbmc/pvr/windows/GUIWindowPVRBase.cpp -msgctxt "#845" -msgid "Are you sure you want to delete this repeating timer and all timers it has scheduled?" -msgstr "" - -#. Message in a dialog when a user wants to delete a non-repeating timer -#: xbmc/pvr/windows/GUIWindowPVRBase.cpp -msgctxt "#846" -msgid "Are you sure you want to delete this timer?" -msgstr "" - -#. Message in a dialog when a user wants to delete a non-repeating timer -#: xbmc/pvr/windows/GUIWindowPVRBase.cpp -msgctxt "#847" -msgid "Confirm stop recording" -msgstr "" - -#. Message in a dialog when a user wants to delete a non-repeating timer -#: xbmc/pvr/windows/GUIWindowPVRBase.cpp -msgctxt "#848" -msgid "Are you sure you want to stop this recording?" -msgstr "" - -#empty string with id 849 +#empty strings from id 803 to 849 msgctxt "#850" msgid "Invalid port number entered" @@ -3974,7 +3697,6 @@ #empty string with id 1209 -#: xbmc/event/windows/GUIWindowEventLog.cpp msgctxt "#1210" msgid "Remove" msgstr "" @@ -4090,7 +3812,7 @@ #: system/settings/settings.xml msgctxt "#1268" -msgid "Enable AirPlay \"Videos\" and \"Pictures\" support" +msgid "iOS 8 compatibility mode" msgstr "" msgctxt "#1269" @@ -5010,11 +4732,9 @@ #empty strings from id 12012 to 12020 -#. Label of various controls for starting playback from the beginning -#: xbmc/Autorun.cpp -#: xbmc/pvr/windows/GUIWindowPVRBase.cpp -#: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp -#: xbmc/video/windows/GUIWindowVideoBase.cpp +#: xbmc\Autorun.cpp +#: xbmc\pvr\windows\GUIWindowPVRRecordings.cpp +#: xbmc\video\windows\GUIWindowVideoBase.cpp msgctxt "#12021" msgid "Start from beginning" msgstr "" @@ -5283,11 +5003,10 @@ #empty strings from id 12374 to 12375 -#: xbmc\settings\dialogs\GUIDialogAudioDSPSettings.cpp #: xbmc\video\dialogs\GUIDialogAudioSubtitleSettings.cpp #: xbmc\video\dialogs\GUIDialogVideoSettings.cpp msgctxt "#12376" -msgid "Set as default for all media" +msgid "Set as default for all videos" msgstr "" #: xbmc\video\dialogs\GUIDialogAudioSubtitleSettings.cpp @@ -5510,17 +5229,17 @@ #: xbmc\storage\MediaManager.cpp msgctxt "#13021" -msgid "Mounted removable storage device" +msgid "Mounted removable hard drive" msgstr "" #: xbmc\storage\MediaManager.cpp msgctxt "#13022" -msgid "Unsafe storage device removal" +msgid "Unsafe device removal" msgstr "" #: xbmc\storage\MediaManager.cpp msgctxt "#13023" -msgid "Successfully removed storage device" +msgid "Successfully removed device" msgstr "" msgctxt "#13024" @@ -5612,9 +5331,7 @@ msgid "Vertical blank sync" msgstr "" -#: xbmc/peripherals/bus/PeripheralBus.cpp #: system/settings/settings.xml -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp msgctxt "#13106" msgid "Disabled" msgstr "" @@ -5803,9 +5520,7 @@ msgid "Last loaded profile:" msgstr "" -#: xbmc/addons/GUIDialogAddonInfo.cpp -#: xbmc/peripherals/devices/Peripheral.cpp -#: xbmc/peripherals/bus/PeripheralBus.cpp +#: xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp msgctxt "#13205" msgid "Unknown" msgstr "" @@ -5814,11 +5529,7 @@ msgid "Overwrite" msgstr "" -#. Subtitle selection to only use forced subtitles -#: xbmc/LangInfo.cpp -msgctxt "#13207" -msgid "Forced only" -msgstr "" +#empty string with id 13207 msgctxt "#13208" msgid "Alarm clock" @@ -6068,7 +5779,10 @@ msgid "Right only" msgstr "" -#empty string with id 13323 +#: system/settings/settings.xml +msgctxt "#13323" +msgid "Enable karaoke support" +msgstr "" msgctxt "#13324" msgid "Background transparency" @@ -6082,7 +5796,10 @@ msgid "A/V delay" msgstr "" -#empty string with id 13327 +#: system/settings/settings.xml +msgctxt "#13327" +msgid "Karaoke" +msgstr "" msgctxt "#13328" msgid "%s not found" @@ -6149,9 +5866,7 @@ msgid "Switch LED off on playback" msgstr "" -#: xbmc/video/jobs/VideoLibraryRefreshingJob.cpp #: xbmc/video/windows/GUIWindowVideoBase.cpp -#: xbmc/video/windows/GUIWindowVideoNav.cpp msgctxt "#13346" msgid "Movie information" msgstr "" @@ -6519,10 +6234,7 @@ msgid "Allow hardware acceleration - MediaCodec" msgstr "" -#: system/settings/settings.xml -msgctxt "#13440" -msgid "Allow hardware acceleration - MediaCodec (Surface)" -msgstr "" +#empty string with id 13440 #: system/settings/settings.xml msgctxt "#13441" @@ -7030,8 +6742,6 @@ msgid "Unknown type cache - Internet" msgstr "" -#. Name of a class/preset for audio DSP -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp msgctxt "#14061" msgid "Auto" msgstr "" @@ -7068,7 +6778,6 @@ msgid "Apply these settings now?" msgstr "" -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml msgctxt "#14070" msgid "Apply changes now" msgstr "" @@ -7120,10 +6829,9 @@ msgid "File lists" msgstr "" -#. Label of button in Settings -> Audio output to clear the audio DSP database. #: system/settings/settings.xml msgctxt "#14082" -msgid "Reset the Audio DSP database..." +msgid "Show EXIF picture information" msgstr "" #: system/settings/settings.xml @@ -7170,7 +6878,7 @@ #: system/settings/settings.xml msgctxt "#14092" -msgid "Logging" +msgid "Debugging" msgstr "" msgctxt "#14093" @@ -7265,116 +6973,7 @@ msgid "Long date format" msgstr "" -#: Used in Confluence as a title for the event log window/view -msgctxt "#14111" -msgid "Events" -msgstr "" - -#. Label of setting to enable/disable event logging -#: system/settings/settings.xml -msgctxt "#14112" -msgid "Enable event logging" -msgstr "" - -#. Label of setting to enable/disable event logging for notifications -#: system/settings/settings.xml -msgctxt "#14113" -msgid "Enable notification event logging" -msgstr "" - -#. Label of setting to go into the event log window -#: system/settings/settings.xml -msgctxt "#14114" -msgid "Show event log" -msgstr "" - -#. Label for the "Basic" event level -#: xbmc/event/windows/GUIWindowEventLog.cpp -msgctxt "#14115" -msgid "Basic" -msgstr "" - -#. Label for the "Information" event level -#: xbmc/event/windows/GUIWindowEventLog.cpp -msgctxt "#14116" -msgid "Information" -msgstr "" - -#. Label for the "Warning" event level -#: xbmc/event/windows/GUIWindowEventLog.cpp -msgctxt "#14117" -msgid "Warning" -msgstr "" - -#. Label for the "Error" event level -#: xbmc/event/windows/GUIWindowEventLog.cpp -msgctxt "#14118" -msgid "Error" -msgstr "" - -#. Label to show the currently active/displayed event level in the event log window -#: xbmc/event/windows/GUIWindowEventLog.cpp -msgctxt "#14119" -msgid "Level: %s" -msgstr "" - -#. Label for the option to show/hide higher level events in the event log window -#: xbmc/event/windows/GUIWindowEventLog.cpp -msgctxt "#14120" -msgid "Show higher levels" -msgstr "" - -#. Name of a setting for Blu-ray region codes -#: system/settings/settings.xml -msgctxt "#14121" -msgid "Blu-ray region Code" -msgstr "" - -#. Region Code option for Blu-ray -#: system/settings/settings.xml -msgctxt "#14122" -msgid "Region A" -msgstr "" - -#. Region Code option for Blu-ray -#: system/settings/settings.xml -msgctxt "#14123" -msgid "Region B" -msgstr "" - -#. Region Code option for Blu-ray -#: system/settings/settings.xml -msgctxt "#14124" -msgid "Region C" -msgstr "" - -#empty strings from id 14125 to 15003 - -#. Name of a class/preset for audio DSP -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15004" -msgid "Basic" -msgstr "" - -#. Name of a class/preset for audio DSP -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15005" -msgid "Application" -msgstr "" - -#. Name of a class/preset for audio DSP -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15006" -msgid "Phone" -msgstr "" - -#. Name of a class/preset for audio DSP -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15007" -msgid "Message" -msgstr "" - -#empty strings from id 15008 to 15010 +#empty strings from id 14111 to 15010 #: xbmc/music/MusicDatabase.cpp #: xbmc/video/VideoDatabase.cpp @@ -7403,7 +7002,6 @@ msgid "Remove" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp msgctxt "#15016" msgid "Games" msgstr "" @@ -7414,424 +7012,103 @@ msgid "Add" msgstr "" -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15020" -msgid "Audio DSP manager" -msgstr "" +#empty strings from id 15020 to 15051 -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15021" -msgid "Content type" +msgctxt "#15052" +msgid "Password" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15022" -msgid "Listening mode" -msgstr "" +#empty strings from id 15053 to 15099 -#: xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.cpp -msgctxt "#15023" -msgid "Master mode" +msgctxt "#15100" +msgid "Library" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15024" -msgid "Pre-process setup..." +msgctxt "#15101" +msgid "Database" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15025" -msgid "Listening mode setup..." +#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp +#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeAlbum.cpp +#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeCompilations.cpp +#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeRcentlyAdded.cpp +#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeRcentlyPlayed.cpp +#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeYearAlbum.cpp +msgctxt "#15102" +msgid "* All albums" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15026" -msgid "Speaker / Output setup..." +#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp +#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeArtist.cpp +msgctxt "#15103" +msgid "* All artists" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15027" -msgid "Audio information..." +#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp +msgctxt "#15104" +msgid "* All songs" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15028" -msgid "Audio DSP settings - Main" +#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp +msgctxt "#15105" +msgid "* All genres" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15029" -msgid "Audio DSP settings - Listening mode" +#: xbmc/addons/Skin.cpp +msgctxt "#15106" +msgid "Skin built-in" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15030" -msgid "Audio DSP settings - Speaker / Output" +msgctxt "#15107" +msgid "Buffering..." msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15031" -msgid "Audio DSP settings - Audio information" +#: system/settings/settings.xml +msgctxt "#15108" +msgid "GUI sounds" msgstr "" -#empty string with id 15032 +msgctxt "#15109" +msgid "Skin default" +msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15033" -msgid "Resampler setup..." +msgctxt "#15110" +msgid "Larger font size" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15034" -msgid "Miscellaneous..." +#: system/settings/settings.xml +msgctxt "#15111" +msgid "Theme" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15035" -msgid "Audio DSP settings - Resampler" +#: system/settings/settings.xml +msgctxt "#15112" +msgid "Default theme" msgstr "" -#empty string with id 15036 +#empty strings from id 15113 to 15199 -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15037" -msgid "Audio DSP settings - Pre-process" +msgctxt "#15200" +msgid "Last.fm" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15038" -msgid "Audio DSP settings - Miscellaneous" -msgstr "" +#empty strings from id 15201 to 15206 -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15039" -msgid "Pre-processing setup..." +#: xbmc/GUIInfoManager.cpp +msgctxt "#15207" +msgid "Connected" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPManager.cpp -msgctxt "#15040" -msgid "The settings dialogue can only be opened from the OSD menu during playback" +#: xbmc/GUIInfoManager.cpp +msgctxt "#15208" +msgid "Not connected" msgstr "" -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15041" -msgid "Unknown mode name" -msgstr "" +#empty strings from id 15209 to 15212 -#: addons/skin.confluence/720p/DialogAudioDSPSettings.xml -msgctxt "#15042" -msgid "Content:" -msgstr "" - -#empty strings from id 15043 to 15046 - -#. Label for a context menu entry and dialog button to open audio DSP settings dialog -#: xbmc/pvr/windows/GUIWindowPVRChannels.cpp -#: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp -#: xbmc/music/windows/GUIWindowMusicBase.cpp -#: xbmc/addons/skin.confluence/720p/MusicOSD.xml -msgctxt "#15047" -msgid "Audio DSP settings" -msgstr "" - -#: xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp -msgctxt "#15048" -msgid "No audio DSP add-on enabled" -msgstr "" - -#: xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp -msgctxt "#15049" -msgid "The audio DSP manager has been enabled without any enabled DSP add-on. Enable at least one add-on in order to use the DSP functionality." -msgstr "" - -#. Name of a list with amount of entries behind on GUI -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15050" -msgid "Available modes" -msgstr "" - -#. Name of a list with amount of entries behind on GUI -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15051" -msgid "Active modes" -msgstr "" - -msgctxt "#15052" -msgid "Password" -msgstr "" - -#empty strings from id 15053 to 15056 - -#. Chain select button name -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15057" -msgid "Input resampling" -msgstr "" - -#. Chain select button name -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15058" -msgid "Pre-processing" -msgstr "" - -#. Chain select button name -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15059" -msgid "Master processing" -msgstr "" - -#. Chain select button name -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15060" -msgid "Post-processing" -msgstr "" - -#. Chain select button name -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15061" -msgid "Output resampling" -msgstr "" - -#. Header on detailed add-on dsp mode description -#: xbmc/settings/dialogs/GUIDialogAudioDSPManager.cpp -msgctxt "#15062" -msgid "Detailed description" -msgstr "" - -#. Fallback string if nothing from addon is present -#: xbmc/settings/dialogs/GUIDialogAudioDSPManager.cpp -msgctxt "#15063" -msgid "No description available" -msgstr "" - -#. DSP manager boolean enable/disable value text -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15064" -msgid "Apply changes directly" -msgstr "" - -#empty string with id 15065 - -#. Button to disable all enabled modes on current selected type -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15066" -msgid "Clear active modes" -msgstr "" - -#. Close the DSP manager window -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15067" -msgid "Close" -msgstr "" - -#empty strings from id 15068 to 15077 - -#. DSP manager dialog context menu entry -#: xbmc/settings/dialogs/GUIDialogAudioDSPManager.cpp -msgctxt "#15078" -msgid "Mode settings" -msgstr "" - -#. DSP manager yes/no dialog text -#: xbmc/settings/dialogs/GUIDialogAudioDSPManager.cpp -msgctxt "#15079" -msgid "You have changed some audio DSP settings.\nWould you like to keep the new settings?" -msgstr "" - -#. DSP manager dialog context menu entry -#: xbmc/settings/dialogs/GUIDialogAudioDSPManager.cpp -msgctxt "#15080" -msgid "Change resampler" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15081" -msgid "Process chain (with CPU usage)" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15082" -msgid "Resampling to %i Hz" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15083" -msgid "Final resampling to %i Hz" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15084" -msgid "Master process" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15085" -msgid "Pre-process" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15086" -msgid "Post-process" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15087" -msgid "Input" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15088" -msgid "Output" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15089" -msgid "Input signal" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15090" -msgid "Output signal" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15091" -msgid "Positions" -msgstr "" - -#. Audio DSP process chain indication -#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp -msgctxt "#15092" -msgid "CPU usage for DSP" -msgstr "" - -#empty strings from id 15093 to 15099 - -msgctxt "#15100" -msgid "Library" -msgstr "" - -msgctxt "#15101" -msgid "Database" -msgstr "" - -#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp -#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeAlbum.cpp -#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeCompilations.cpp -#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeRcentlyAdded.cpp -#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeRcentlyPlayed.cpp -#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeYearAlbum.cpp -msgctxt "#15102" -msgid "* All albums" -msgstr "" - -#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp -#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeArtist.cpp -msgctxt "#15103" -msgid "* All artists" -msgstr "" - -#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp -msgctxt "#15104" -msgid "* All songs" -msgstr "" - -#: xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp -msgctxt "#15105" -msgid "* All genres" -msgstr "" - -#: xbmc/addons/Skin.cpp -msgctxt "#15106" -msgid "Skin built-in" -msgstr "" - -msgctxt "#15107" -msgid "Buffering..." -msgstr "" - -#: system/settings/settings.xml -msgctxt "#15108" -msgid "GUI sounds" -msgstr "" - -msgctxt "#15109" -msgid "Skin default" -msgstr "" - -msgctxt "#15110" -msgid "Larger font size" -msgstr "" - -#: system/settings/settings.xml -msgctxt "#15111" -msgid "Theme" -msgstr "" - -#: system/settings/settings.xml -msgctxt "#15112" -msgid "Default theme" -msgstr "" - -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15113" -msgid "Here you can configure pre-processing modes. This processing stage only change the input data stream." -msgstr "" - -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15114" -msgid "Here you can configure an input resampling process. Notice: Only one active mode is allowed!" -msgstr "" - -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15115" -msgid "Here you can configure master processing modes. Notice: On playback only one active mode can be selected!" -msgstr "" - -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15116" -msgid "Here you can configure a output resampling process. Notice: Only one active mode is allowed!" -msgstr "" - -#: addons/skin.confluence/720p/DialogAudioDSPManager.xml -msgctxt "#15117" -msgid "Here you can configure post-processing modes. This processing stage can be used for equalizing and volume correction..." -msgstr "" - -#empty strings from id 15118 to 15199 - -msgctxt "#15200" -msgid "Last.fm" -msgstr "" - -#empty strings from id 15201 to 15206 - -#: xbmc/GUIInfoManager.cpp -msgctxt "#15207" -msgid "Connected" -msgstr "" - -#: xbmc/GUIInfoManager.cpp -msgctxt "#15208" -msgid "Not connected" -msgstr "" - -#empty strings from id 15209 to 15212 - -#: xbmc/windows/GUIWindowFileManager.cpp -msgctxt "#15213" -msgid "Play using..." +#: xbmc/windows/GUIWindowFileManager.cpp +msgctxt "#15213" +msgid "Play using..." msgstr "" msgctxt "#15214" @@ -8072,7 +7349,6 @@ msgid "Watched" msgstr "" -#. Label for a context menu entry to mark an item as watched #: xbmc/music/windows/GUIWindowMusicNav.cpp #: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp #: xbmc/video/dialogs/GUIDialogVideoInfo.cpp @@ -8081,7 +7357,6 @@ msgid "Mark as watched" msgstr "" -#. Label for a context menu entry to mark an item as unwatched #: xbmc/music/windows/GUIWindowMusicNav.cpp #: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp #: xbmc/video/dialogs/GUIDialogVideoInfo.cpp @@ -8096,7 +7371,6 @@ msgid "Edit title" msgstr "" -#. Label for a context menu entry that opens a submenu with further actions for the selected item #: xbmc/pvr/windows/GUIWindowPVRChannels.cpp #: xbmc/video/windows/GUIWindowVideoNav.cpp msgctxt "#16106" @@ -8379,11 +7653,12 @@ msgid "or use phrases to find an exact match, like \"The wizard of Oz\"." msgstr "" -#. Label of a button / context menu entry to find similar programs (matching a given epg event) +#. Label of the button / context menu entry to find similar programs in the PVR EPG data #: skin.confluence #: xbmc/pvr/windows/GUIWindowPVRChannels.cpp #: xbmc/pvr/windows/GUIWindowPVRGuide.cpp #: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp +#: xbmc/pvr/windows/GUIWindowPVRTimers.cpp msgctxt "#19003" msgid "Find similar" msgstr "" @@ -8536,7 +7811,6 @@ msgid "Timeline" msgstr "" -#: xbmc/event/windows/GUIWindowEventLog.cpp #: xbmc/pvr/addons/PVRClients.cpp #: xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp #: xbmc/pvr/PVRManager.cpp @@ -8578,11 +7852,8 @@ msgid "Are you sure you want to hide this channel?" msgstr "" -#: addons/skin.confluence/720p/IncludesHomeMenuItems.xml -#: addons/skin.confluence/720p/IncludesPVR.xml -#: addons/skin.confluence/720p/MyPVRTimers.xml msgctxt "#19040" -msgid "Timers" +msgid "Timer" msgstr "" msgctxt "#19041" @@ -8610,11 +7881,6 @@ msgid "New channel" msgstr "" -#. Label for a context menu entry to open an EPG event information dialog -#: xbmc/pvr/windows/GUIWindowPVRChannels.cpp -#: xbmc/pvr/windows/GUIWindowPVRGuide.cpp -#: xbmc/pvr/windows/GUIWindowPVRSearch.cpp -#: xbmc/pvr/windows/GUIWindowPVRtimers.cpp msgctxt "#19047" msgid "Programme information" msgstr "" @@ -8639,8 +7905,6 @@ msgid "Move channel to:" msgstr "" -#. Label for a context menu entry to open recording info dialog -#: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp msgctxt "#19053" msgid "Recording information" msgstr "" @@ -8655,22 +7919,14 @@ msgid "No information available" msgstr "" -#. Label for a new timer -#: xbmc/pvr/timers/PVRTimers.cpp -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19056" msgid "New timer" msgstr "" -#. Notification text to announce that a timer was disabled -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp msgctxt "#19057" -msgid "Timer disabled" +msgid "Edit timer" msgstr "" -#. Notification text to announce that a timer was enabled -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp msgctxt "#19058" msgid "Timer enabled" msgstr "" @@ -8679,17 +7935,10 @@ msgid "Stop recording" msgstr "" -#. Label for a context menu entry to delete a timer associated with an epg event and for a button to delete a timer in epg event info dialog -#: xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp -#: xbmc/pvr/windows/GUIWindowPVRGuide.cpp -#: xbmc/pvr/windows/GUIWindowPVRSearch.cpp msgctxt "#19060" msgid "Delete timer" msgstr "" -#. Label for a context menu entry to open the timer settings dialog -#: xbmc/pvr/windows/GUIWindowPVRGuide.cpp -#: xbmc/pvr/windows/GUIWindowPVRSearch.cpp msgctxt "#19061" msgid "Add timer" msgstr "" @@ -8751,63 +8000,46 @@ msgid "Delay channel switch" msgstr "" -#: addons/skin.confluence/720p/DialogPVRChannelManager.xml msgctxt "#19074" -msgid "Active" +msgid "Active:" msgstr "" -#. Label of name edit in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19075" -msgid "Name" +msgid "Name:" msgstr "" -#. Label of recording folder edit in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19076" -msgid "Folder" +msgid "Folder:" msgstr "" #empty string with id 19077 -#. Label of channel selector list in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19078" -msgid "Channel" +msgid "Channel:" msgstr "" -#. heading for PVR timer days of week settings dialog -#. Label of days of week button in PVR timer settings dialog -#: skin.confluence -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19079" -msgid "Days of week" +msgid "Day:" msgstr "" msgctxt "#19080" -msgid "Begin" +msgid "Begin:" msgstr "" msgctxt "#19081" -msgid "End" +msgid "End:" msgstr "" -#. Label of priority spinner in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19082" -msgid "Priority" +msgid "Priority:" msgstr "" -#. Label of lifetime spinner in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19083" -msgid "Lifetime" +msgid "Lifetime (days):" msgstr "" -#. Label of first day (dd mm yy) button in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19084" -msgid "First day" +msgid "First day:" msgstr "" msgctxt "#19085" @@ -8992,26 +8224,18 @@ msgid "Ignore present recordings" msgstr "" -#. Label of "Start time" spinner in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19126" msgid "Start time" msgstr "" -#. Label of "End time" edit field in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19127" msgid "End time" msgstr "" -#. Label of "Start date" spinner field in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19128" msgid "Start date" msgstr "" -#. Label of "End date" edit field in PVR timer settings dialog -#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp msgctxt "#19129" msgid "End date" msgstr "" @@ -9141,11 +8365,7 @@ msgid "to" msgstr "" -#. timer schedule presentation string. "from" "to" -#: xbmc/pvr/timers/PVRTimerInfoTag.cpp -msgctxt "#19161" -msgid "any time" -msgstr "" +#empty string with id 19161 msgctxt "#19162" msgid "Recording active" @@ -9212,12 +8432,12 @@ #: system/settings/settings.xml msgctxt "#19175" -msgid "Default start padding time" +msgid "Start padding time" msgstr "" #: system/settings/settings.xml msgctxt "#19176" -msgid "Default end padding time" +msgid "End padding time" msgstr "" #: system/settings/settings.xml @@ -9267,17 +8487,12 @@ msgid "Clear data" msgstr "" -#: xbmc/pvr/PVRManager.cpp msgctxt "#19186" msgid "All your TV related data (channels, groups, guide) will be cleared. Are you sure?" msgstr "" -#: xbmc/pvr/PVRManager.cpp -msgctxt "#19187" -msgid "Clearing all related data." -msgstr "" +#empty string with id 19187 -#: xbmc/pvr/PVRManager.cpp msgctxt "#19188" msgid "All your guide data will be cleared. Are you sure?" msgstr "" @@ -9377,8 +8592,6 @@ msgid "Client" msgstr "" -#. Heading of a channel delete confirmation dialog -#: xbmc/pvr/dialogs/GUIDialogPVRChannelManager.cpp msgctxt "#19211" msgid "Delete channel" msgstr "" @@ -9564,7 +8777,13 @@ msgid "Guide update failed for channel" msgstr "" -#empty strings from id 19255 to 19256 +msgctxt "#19255" +msgid "Start recording" +msgstr "" + +msgctxt "#19256" +msgid "Stop recording" +msgstr "" msgctxt "#19257" msgid "Lock channel" @@ -9640,17 +8859,7 @@ msgid "You need a tuner, backend software, and an add-on for the backend to be able to use PVR. Please visit http://kodi.wiki/view/PVR to learn more." msgstr "" -#. Header on DialogOK -#: xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp -msgctxt "#19273" -msgid "No audio DSP add-ons could be found" -msgstr "" - -#. DialogOK for no installed ADSP add-on available -#: xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp -msgctxt "#19274" -msgid "You need an add-on installed to be able to use audio digital signal processing (DSP)." -msgstr "" +#empty strings from id 19273 to 19274 #: xbmc/pvr/timers/PVRTimerInfoTag.cpp msgctxt "#19275" @@ -9738,7 +8947,7 @@ msgid "Hide group" msgstr "" -#. Label for a context menu entry of a recording to undelete a deleted recording +#. Used on recordings context menu #: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp msgctxt "#19290" msgid "Undelete" @@ -10244,11 +9453,7 @@ #empty string with id 19686 -#: Label for a context menu entries, dialog heading, button to start playing a recording #: xbmc/pvr/windows/GUIWindowPVRGuide.cpp -#: xbmc/pvr/windows/GUIWindowPVRSearch.cpp -#: xbmc/pvr/windows/GUIWindowPVRBase.cpp -#: xbmc/addons/skin.confluence/720p/DialogPVRInfo.xml msgctxt "#19687" msgid "Play recording" msgstr "" @@ -10942,7 +10147,6 @@ msgid "Network information" msgstr "" -#: xbmc/video/jobs/VideoLibraryRefreshingJob.cpp #: xbmc/windows/GUIWindowSystemInfo.cpp msgctxt "#20159" msgid "Video information" @@ -11046,7 +10250,10 @@ msgid "Reload skin" msgstr "" -#empty string with id 20184 +#: system/settings/settings.xml +msgctxt "#20184" +msgid "Rotate pictures using EXIF information" +msgstr "" msgctxt "#20185" msgid "Use poster view styles for TV shows" @@ -11422,14 +10629,10 @@ msgid "votes" msgstr "" -#: xbmc/video/jobs/VideoLibraryRefreshingJob.cpp -#: xbmc/video/windows/GUIWindowVideoNav.cpp msgctxt "#20351" msgid "TV show information" msgstr "" -#: xbmc/video/jobs/VideoLibraryRefreshingJob.cpp -#: xbmc/video/windows/GUIWindowVideoNav.cpp msgctxt "#20352" msgid "Episode information" msgstr "" @@ -11622,9 +10825,6 @@ msgid "Remove music video from library" msgstr "" -#: xbmc/music/windows/GUIWindowMusicNav.cpp -#: xbmc/video/jobs/VideoLibraryRefreshingJob.cpp -#: xbmc/video/windows/GUIWindowVideoNav.cpp msgctxt "#20393" msgid "Music video information" msgstr "" @@ -11854,10 +11054,7 @@ msgid "Do you want to refresh information for all items within this path?" msgstr "" -#: xbmc/music/windows/GUIWindowMusicBase.cpp -msgctxt "#20444" -msgid "Add to library" -msgstr "" +#empty string with id 20444 #: xbmc/music/dialogs/GUIDialogMusicInfo.cpp msgctxt "#20445" @@ -11868,10 +11065,7 @@ msgid "Locally stored information found. Ignore and refresh from Internet?" msgstr "" -#: xbmc/music/windows/GUIWindowMusicBase.cpp -msgctxt "#20447" -msgid "Do you want to add the media from this source to your library?" -msgstr "" +#empty string with id 20447 #: xbmc/video/VideoInfoScanner.cpp msgctxt "#20448" @@ -11976,17 +11170,7 @@ msgid "Keep current set (%s)" msgstr "" -#: system/settings/settings.xml -msgctxt "#20470" -msgid "Use movie sets for single movies" -msgstr "" - -#: system/settings/settings.xml -msgctxt "#20471" -msgid "Show empty TV shows" -msgstr "" - -#empty strings from id 20472 to 21329 +#empty strings from id 20470 to 21329 #up to 21329 is reserved for the video db !! ! #: system/settings/settings.xml @@ -12024,38 +11208,7 @@ msgid "Connecting to: %s" msgstr "" -#. Used in the add-on browser under "Last updated" when a repository has never been updated -#: xbmc/addons/RepositoryUpdater.cpp -msgctxt "#21337" -msgid "Never" -msgstr "" - -#: xbmc/addons/GUIDialogAddonInfo.cpp -msgctxt "#21338" -msgid "Select version" -msgstr "" - -#: xbmc/addons/GUIDialogAddonInfo.cpp -msgctxt "#21339" -msgid "Version %s" -msgstr "" - -#: xbmc/addons/GUIDialogAddonInfo.cpp -msgctxt "#21340" -msgid "Auto-update" -msgstr "" - -#: xbmc/addons/GUIDialogAddonInfo.cpp -msgctxt "#21341" -msgid "No updates available" -msgstr "" - -#: xbmc/addons/GUIDialogAddonInfo.cpp -msgctxt "#21342" -msgid "There are currently no updates available for this add-on." -msgstr "" - -#empty strings from id 21343 to 21358 +#empty strings from id 21337 to 21358 #: xbmc/dialogs/GUIDialogFileBrowser.cpp msgctxt "#21359" @@ -12395,7 +11548,6 @@ msgid "Find items where" msgstr "" -#: addons/skin.confluence/720p/SmartPlaylistEditor.xml msgctxt "#21435" msgid "Edit" msgstr "" @@ -12464,9 +11616,7 @@ msgid "Remote control sends keyboard presses" msgstr "" -#. Label for controls used to edit something (e.g. setting "Appearance -> Skin -> Edit" or a context menu entry to open timer settings dialog) #: system/settings/settings.xml -#: xbmc/pvr/windows/GUIWindowPVRTimers.cpp msgctxt "#21450" msgid "Edit" msgstr "" @@ -12613,26 +11763,11 @@ msgid "Just \"Specials\"" msgstr "" -#: xbmc/addons/GUIDialogAddonInfo.cpp -msgctxt "#21478" -msgid "Open" -msgstr "" +#empty strings from id 21478 to 21601 -#: xbmc/addons/GUIDialogAddonInfo.cpp -msgctxt "#21479" -msgid "Run" -msgstr "" - -#: xbmc/addons/GUIDialogAddonInfo.cpp -msgctxt "#21480" -msgid "Use" -msgstr "" - -#empty strings from id 21481 to 21601 - -#: xbmc/Util.cpp -msgctxt "#21602" -msgid "(External)" +#: xbmc/Util.cpp +msgctxt "#21602" +msgid "(External)" msgstr "" #empty strings from id 21603 to 21799 @@ -12771,11 +11906,7 @@ msgid "Orientation" msgstr "" -msgctxt "#21844" -msgid "XP comment" -msgstr "" - -#empty strings from id 21845 to 21856 +#empty strings from id 21844 to 21856 msgctxt "#21857" msgid "Sub-location" @@ -13076,7 +12207,10 @@ msgid "Show video files in listings" msgstr "" -#empty string with id 22023 +#: xbmc/windows/GUIWindowSystemInfo.cpp +msgctxt "#22023" +msgid "DirectX vendor:" +msgstr "" #: xbmc/windows/GUIWindowSystemInfo.cpp msgctxt "#22024" @@ -13084,6 +12218,7 @@ msgstr "" #empty strings from id 22025 to 22029 +#strings 22030 thru 22060 reserved for karaoke #: system/settings/settings.xml msgctxt "#22030" @@ -13105,7 +12240,51 @@ msgid "Charset" msgstr "" -#empty strings from id 22034 to 22078 +msgctxt "#22034" +msgid "Export karaoke titles as HTML" +msgstr "" + +msgctxt "#22035" +msgid "Export karaoke titles as CSV" +msgstr "" + +#: system/settings/settings.xml +msgctxt "#22036" +msgid "Import karaoke titles..." +msgstr "" + +#: system/settings/settings.xml +msgctxt "#22037" +msgid "Show song selector automatically" +msgstr "" + +#: system/settings/settings.xml +msgctxt "#22038" +msgid "Export karaoke titles..." +msgstr "" + +msgctxt "#22039" +msgid "Enter song number" +msgstr "" + +#: system/settings/settings.xml +msgctxt "#22040" +msgid "white / green" +msgstr "" + +msgctxt "#22041" +msgid "white / red" +msgstr "" + +msgctxt "#22042" +msgid "white / blue" +msgstr "" + +msgctxt "#22043" +msgid "black / white" +msgstr "" + +#empty strings from id 22044 to 22078 #: system/settings/settings.xml msgctxt "#22079" @@ -13306,7 +12485,7 @@ #. Used as the type name for context item addons #: xbmc/addons/Addons.cpp msgctxt "#24025" -msgid "Context menus" +msgid "Context items" msgstr "" #: xbmc/addons/Addon.cpp @@ -13353,11 +12532,7 @@ msgid "Check for updates" msgstr "" -#: Name of an Add-on category -#: xbmc/addons/Addon.cpp -msgctxt "#24035" -msgid "Image collections" -msgstr "" +#empty string with id 24035 msgctxt "#24036" msgid "Changelog" @@ -13404,10 +12579,9 @@ msgid "Dependencies not met. Please contact add-on author." msgstr "" -#. Used as an event log description for add-ons failed to install from zip #: xbmc/addons/AddonInstaller.cpp msgctxt "#24045" -msgid "Failed to install Add-on from zip file" +msgid "Add-on does not have the correct structure" msgstr "" #: xbmc/addons/GUIDialogAddonInfo.cpp @@ -13420,7 +12594,10 @@ msgid "This add-on can't be uninstalled" msgstr "" -#empty string with id 24048 +#: skin.confluence +msgctxt "#24048" +msgid "Rollback" +msgstr "" #: xbmc/filesystem/AddonsDirectory.cpp msgctxt "#24049" @@ -13432,7 +12609,6 @@ msgid "Available add-ons" msgstr "" -#: xbmc/peripherals/bus/PeripheralBus.cpp #: xbmc/addons/AddonVersion.cpp msgctxt "#24051" msgid "Version:" @@ -13486,9 +12662,9 @@ msgid "Would you like to disable this add-on?" msgstr "" -#: xbmc/addons/RepositoryUpdater.cpp +#: xbmc/addons/Repository.cpp msgctxt "#24061" -msgid "Add-on updates available" +msgid "Add-on update available!" msgstr "" #: xbmc/addons/GUIViewStateAddonBrowser.cpp @@ -13502,9 +12678,7 @@ msgid "Auto update" msgstr "" -#. Used as an event log description for add-ons that have been installed/enabled #: xbmc/addons/AddonInstaller.cpp -#: xbmc/addons/AddonManager.cpp msgctxt "#24064" msgid "Add-on enabled" msgstr "" @@ -13524,7 +12698,6 @@ msgid "Currently downloading add-ons" msgstr "" -#: xbmc/addons/RepositoryUpdater.cpp #: xbmc/filesystem/AddonsDirectory.cpp msgctxt "#24068" msgid "Update available" @@ -13627,11 +12800,7 @@ msgid "All repositories" msgstr "" -#. Description on error dialog why not possible -#: xbmc/addons/GUIDialogAddonInfo.h -msgctxt "#24088" -msgid "The DSP add-on is currently in use and can't be modified." -msgstr "" +#empty string with id 24088 msgctxt "#24089" msgid "Add-on restarts" @@ -13658,11 +12827,14 @@ msgid "Checking %s..." msgstr "" -#empty string with id 24094 +#: xbmc/addons/guidialogaddoninfo.cpp +msgctxt "#24094" +msgid "(current)" +msgstr "" -#: xbmc/addons/GUIDialogAddonInfo.cpp +#: xbmc/addons/guidialogaddoninfo.cpp msgctxt "#24095" -msgid "Local package cache" +msgid "(blacklisted)" msgstr "" #: xbmc/addons/Repository.cpp @@ -13869,91 +13041,7 @@ msgid "We were unable to load your configured language. Please check your language settings." msgstr "" -#. Folder name in addon settings window -#: xbmc/addons/addon.cpp -msgctxt "#24135" -msgid "Audio DSP" -msgstr "" - -#. To open dsp submenu -#: xbmc\video\dialogs\GUIDialogAudioSubtitleSettings.cpp -msgctxt "#24136" -msgid "Audio DSP..." -msgstr "" - -#: xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp -msgctxt "#24137" -msgid "Not allowed" -msgstr "" - -#: xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp -msgctxt "#24138" -msgid "DSP add-on is currently in use and can't be removed." -msgstr "" - -#. Label for the action provided by addon management events to jump to a specific Add-on -#: xbmc/events/AddonManagementEvent.cpp -msgctxt "#24139" -msgid "View Add-on" -msgstr "" - -#. Label for the action provided by media library events to jump to a specific path/file -#: xbmc/events/MediaLibraryEvent.cpp -msgctxt "#24140" -msgid "View" -msgstr "" - -#. Used as an event log description for add-ons that have been disabled -#: xbmc/addons/AddonManager.cpp -msgctxt "#24141" -msgid "Add-on disabled" -msgstr "" - -#. The dependency on version coult not be satisfied. -#: xbmc/addons/AddonInstaller.cpp -msgctxt "#24142" -msgid "The dependency on %s version %s could not be satisfied." -msgstr "" - -#. Installing the addon from zip file located at failed due to an invalid structure. -#: xbmc/addons/AddonInstaller.cpp -msgctxt "#24143" -msgid "Installing the Add-on from zip file located at %s failed due to an invalid structure." -msgstr "" - -#. Used as an event log description for add-ons that have been uninstalled -#: xbmc/addons/AddonInstaller.cpp -msgctxt "#24144" -msgid "Add-on uninstalled" -msgstr "" - -#. Used as an event log title for the video library scanner -#: xbmc/video/VideoInfoScanner.cpp -msgctxt "#24145" -msgid "Video library scanner" -msgstr "" - -#. Used as an event log title for the music library scanner -#: xbmc/music/infoscanner/MusicInfoScanner.cpp -msgctxt "#24146" -msgid "Music library scanner" -msgstr "" - -#. Used as an event log description for files that failed to be processed by the library scanner -#. Failed to scan : -#: xbmc/music/infoscanner/MusicInfoScanner.cpp -#: xbmc/video/VideoInfoScanner.cpp -msgctxt "#24147" -msgid "Failed to scan %s: %s" -msgstr "" - -#empty strings from id 24148 to 24990 - -#. Used as error message in add-on browser when add-on repository data could not be downloaded -#: xbmc/filesystem/AddonsDirectory.cpp -msgctxt "#24991" -msgid "Could not connect to repository." -msgstr "" +#empty strings from id 24135 to 24991 #: xbmc/addons/CGUIViewStateAddonBrowser.cpp #: xbmc/filesystem/AddonsDirectory.cpp @@ -13985,10 +13073,7 @@ msgid "Dependencies" msgstr "" -#: xbmc/filesystem/AddonsDirectory.cpp -msgctxt "#24997" -msgid "Look and feel" -msgstr "" +#empty string with id 24997 #: xbmc/addons/CGUIViewStateAddonBrowser.cpp #: xbmc/filesystem/AddonsDirectory.cpp @@ -14058,7 +13143,14 @@ msgid "Chapter %u" msgstr "" -#empty strings from id 25011 to 29800 +#empty strings from id 25011 to 29799 +#strings 29800 thru 29998 reserved strings used only in the default Project Mayhem III skin and not c++ code + +#: skin.confluence +#: skin.retouched +msgctxt "#29800" +msgid "Library mode" +msgstr "" #: unused msgctxt "#29801" @@ -14070,493 +13162,7 @@ msgid "Passthrough audio in use" msgstr "" -#empty strings from id 29803 to 29899 - -#. Header string on RDS Radiotext+ Info dialog -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29900" -msgid "Radiotext Plus info" -msgstr "" - -#. Music band name which make the song (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29901" -msgid "Band" -msgstr "" - -#. Style of the current playing radio -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29902" -msgid "Style" -msgstr "" - -#. Concert composer of the music (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29903" -msgid "Composer" -msgstr "" - -#. Artits which sing the music (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29904" -msgid "Artist" -msgstr "" - -#. Conductor of the classic music (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29905" -msgid "Conductor" -msgstr "" - -#. Moderator currently on radio (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29906" -msgid "Moderator" -msgstr "" - -#. List of editoral staff (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29907" -msgid "Editorial Staff" -msgstr "" - -#. Current playing program name -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29908" -msgid "Program" -msgstr "" - -#. Studio name (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29909" -msgid "Studio" -msgstr "" - -#. Phone number (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29910" -msgid "Phone" -msgstr "" - -#. EMail address (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29911" -msgid "EMail" -msgstr "" - -#. SMS message number (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29912" -msgid "SMS" -msgstr "" - -#. Hotline phone (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29913" -msgid "Hotline" -msgstr "" - -#. Website address (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29914" -msgid "Website" -msgstr "" - -#. General information news, in list selector (if present) -#: addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml -msgctxt "#29915" -msgid "Info" -msgstr "" - -#. News, in list selector (if present) -#: xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp -msgctxt "#29916" -msgid "News" -msgstr "" - -#. Local news, in list selector (if present) -#: xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp -msgctxt "#29917" -msgid "News local" -msgstr "" - -#. Sport news, in list selector (if present) -#: xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp -msgctxt "#29918" -msgid "Sport" -msgstr "" - -#. Lottery information, in list selector (if present) -#: xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp -msgctxt "#29919" -msgid "Lottery" -msgstr "" - -# Stock information, in list selector (if present) -#: xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp -msgctxt "#29920" -msgid "Stock" -msgstr "" - -#. Other informations, in list selector (if present) -#: xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp -msgctxt "#29921" -msgid "Other" -msgstr "" - -#. Horoscope messages, in list selector (if present) -#: xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp -msgctxt "#29922" -msgid "Horoscope" -msgstr "" - -#empty strings from id 29923 to 29925 - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29926" -msgid "Adult hits" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29927" -msgid "Spanish talk" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29928" -msgid "Spanish music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29929" -msgid "Hip hop" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29930" -msgid "Radio Traffic advisory message!" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29931" -msgid "Radio message" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29932" -msgid "Language" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29933" -msgid "College" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29934" -msgid "Personality" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29935" -msgid "Public" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29936" -msgid "Soft music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29937" -msgid "Adult hits" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29938" -msgid "Soft rock" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29939" -msgid "Talk" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29940" -msgid "No programme type" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29941" -msgid "News" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29942" -msgid "Current affairs" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29943" -msgid "Information" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29944" -msgid "Sport" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29945" -msgid "Education" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29946" -msgid "Drama" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29947" -msgid "Culture" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29948" -msgid "Science" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29949" -msgid "Varied" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29950" -msgid "Pop music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29951" -msgid "Rock music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29952" -msgid "Easy listening music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29953" -msgid "Light classical" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29954" -msgid "Serious classical" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29955" -msgid "Other music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29956" -msgid "Weather" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29957" -msgid "Finance" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29958" -msgid "Children's Programmes" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29959" -msgid "Social Affairs" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29960" -msgid "Religion" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29961" -msgid "Phone-in" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29962" -msgid "Travel" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29963" -msgid "Leisure" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29964" -msgid "Jazz Music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29965" -msgid "Country Music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29966" -msgid "National Music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29967" -msgid "Oldies Music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29968" -msgid "Folk Music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29969" -msgid "Documentary" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29970" -msgid "Alarm Test" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29971" -msgid "Alarm" -msgstr "" - -#empty strings from id 29972 to 29976 - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29977" -msgid "Classic rock music" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29978" -msgid "Classical" -msgstr "" - -#. Program style name -#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp -msgctxt "#29979" -msgid "Nostalgia" -msgstr "" - -#. Settings boolean value to enable/disable RDS -#: system/settings/settings.xml -msgctxt "#29980" -msgid "Enable RDS for radio channels" -msgstr "" - -#. Help text for RDS enable/disable -#: system/settings/settings.xml -msgctxt "#29981" -msgid "RDS data can be used if present" -msgstr "" - -#. Boolean value to enable traffic advisory from RDS -#: system/settings/settings.xml -msgctxt "#29982" -msgid "Message traffic advisory" -msgstr "" - -#. Help text of boolean on/off value -#: system/settings/settings.xml -msgctxt "#29983" -msgid "RDS inform you about traffic advisory messages" -msgstr "" - -#. Boolean value on settings -#: system/settings/settings.xml -msgctxt "#29984" -msgid "Increase volume on traffic advisory" -msgstr "" - -#. Help text of boolean on/off value -#: system/settings/settings.xml -msgctxt "#29985" -msgid "If traffic advisory is send from RDS, volume is increased" -msgstr "" - -#. Boolean value on settings -#: system/settings/settings.xml -msgctxt "#29986" -msgid "Publicate traffic messages" -msgstr "" - -#. Help text of boolean on/off value -#: system/settings/settings.xml -msgctxt "#29987" -msgid "Send present traffic messages around and can be handled from add-ons (nothing inside Kodi)" -msgstr "" - -#empty strings from id 29988 to 33000 +#empty strings from id 29803 to 33000 #strings 30000 thru 30999 reserved for plug-ins and plug-in settings #strings 31000 thru 31999 reserved for skins #strings 32000 thru 32999 reserved for scripts @@ -14876,7 +13482,10 @@ msgid "Hate" msgstr "" -#empty string with id 33081 +#: Unknown +msgctxt "#33081" +msgid "This file is stacked, select the part you want to play from." +msgstr "" #: Unknown msgctxt "#33082" @@ -15442,7 +14051,7 @@ #: system/peripherals.xml msgctxt "#36033" -msgid "Action when switching to another source" +msgid "Pause playback when switching to another source" msgstr "" #empty string with id 36034 @@ -15493,23 +14102,7 @@ msgid "Use limited colour range (16-235)" msgstr "" -#empty string with id 36043 - -#. Name of an action to perform on a specific event, like changing the CEC source away from Kodi -#: xbmc/peripherals/devices/PeripheralCecAdapter.cpp -#: system/peripherals.xml -msgctxt "#36044" -msgid "Stop Playback" -msgstr "" - -#. Name of an action to perform on a specific event, like changing the CEC source away from Kodi -#: xbmc/peripherals/devices/PeripheralCecAdapter.cpp -#: system/peripherals.xml -msgctxt "#36045" -msgid "Pause Playback" -msgstr "" - -#empty strings from id 36046 to 36100 +#empty strings from id 36043 to 36100 #strings from 36100 to 36999 are reserved for settings descriptions #. Description of settings section "Appearance" @@ -15776,7 +14369,7 @@ #. Description of setting "Videos -> Library -> Group movies in sets" with label #20458 #: system/settings/settings.xml msgctxt "#36145" -msgid "When enabled, movies belonging to a \"Movie set\" are grouped together under one entry for the set in the movie library, this entry can then be opened to display the individual movies. When disabled, each movie will have it's own entry in the movie library even if it belongs to a set." +msgid "Group movies into \"Movie sets\" when browsing the movie library." msgstr "" #. Description of setting "Videos -> Library -> Update library on startup" with label #22000 @@ -15847,11 +14440,7 @@ msgid "Enable VAAPI hardware decoding of video files, mainly used for Intel graphics and in some circumstances AMD graphics." msgstr "" -#. Description of setting "Videos -> Library -> Use movie sets for single movies" with label #20470 -#: system/settings/settings.xml -msgctxt "#36157" -msgid "When enabled, a \"Movie set\" entry is used even if the movie library contains only a single movie from that set. When disabled, a \"Movie set\" entry is used only if the movie library contains more than one movie from that set." -msgstr "" +#empty string with id 36157 #. Description of setting "Videos -> Playback -> Allow hardware acceleration (DXVA2)" with label #13427 #: system/settings/settings.xml @@ -15883,11 +14472,7 @@ msgid "Enable VideoToolbox hardware decoding of video files." msgstr "" -#. Description of setting "Videos -> Library -> Show empty TV shows" with label #20471 -#: system/settings/settings.xml -msgctxt "#36163" -msgid "Show TV shows with no episodes when browsing the video library." -msgstr "" +#empty string with id 36163 #. Description of setting "Videos -> Playback -> Adjust display refresh rate" with label #170 #: system/settings/settings.xml @@ -16252,7 +14837,7 @@ #: system/settings/settings.xml msgctxt "#36231" -msgid "When flipping through channels using channel up/down buttons or when pressing a number button in full screen mode, channel switches must be confirmed using the OK button." +msgid "Pressing a number button in full screen mode will automatically switch to the channel number that was entered after 1 second." msgstr "" #: system/settings/settings.xml @@ -16589,7 +15174,59 @@ msgid "Auto eject disc after rip is complete." msgstr "" -#empty strings from id 36292 to 36300 +#. Description of settings category "Music -> Karaoke" with label #13327 +#: system/settings/settings.xml +msgctxt "#36292" +msgid "This category contains the settings for how karaoke is handled." +msgstr "" + +#. Description of setting "Music -> Karaoke -> Enable karaoke support" with label #13323 +#: system/settings/settings.xml +msgctxt "#36293" +msgid "When playing any music file, look for a matching .cdg file and display its graphics." +msgstr "" + +#. Description of setting "Music -> Karaoke -> Show song selector automatically" with label #22037 +#: system/settings/settings.xml +msgctxt "#36294" +msgid "Show song selection dialogue once the last song in the queue has been played." +msgstr "" + +#. Description of setting "Music -> Karaoke -> Font" with label #22030 +#: system/settings/settings.xml +msgctxt "#36295" +msgid "Select the font type used during karaoke." +msgstr "" + +#. Description of setting "Music -> Karaoke -> Size" with label #22031 +#: system/settings/settings.xml +msgctxt "#36296" +msgid "Select the size of the font used during karaoke." +msgstr "" + +#. Description of setting "Music -> Karaoke -> Colours" with label #22032 +#: system/settings/settings.xml +msgctxt "#36297" +msgid "Select the font colour used during karaoke." +msgstr "" + +#. Description of setting "Music -> Karaoke -> Charset" with label #22033 +#: system/settings/settings.xml +msgctxt "#36298" +msgid "Select the character set used during karaoke." +msgstr "" + +#. Description of setting "Music -> Karaoke -> Export karaoke titles..." with label #22038 +#: system/settings/settings.xml +msgctxt "#36299" +msgid "Export the karaoke numbered songs to HTML or CSV files." +msgstr "" + +#. Description of setting "Music -> Karaoke -> Import karaoke titles..." with label #22036 +#: system/settings/settings.xml +msgctxt "#36300" +msgid "Import the karaoke numbered songs from HTML or CSV files." +msgstr "" #: system/settings/settings.xml msgctxt "#36301" @@ -16618,7 +15255,11 @@ msgid "This category contains the settings for how picture file lists are handled." msgstr "" -#empty string with id 36306 +#. Description of setting "Pictures -> Show EXIF picture information" with label #14082 +#: system/settings/settings.xml +msgctxt "#36306" +msgid "If EXIF information exists (date, time, camera used, etc.), it will be displayed." +msgstr "" #. Description of setting "Pictures -> Automatically generate thumbnails" with label #13360 #: system/settings/settings.xml @@ -16626,7 +15267,11 @@ msgid "Automatically generate picture thumbnails when entering picture folder." msgstr "" -#empty string with id 36308 +#. Description of setting "Pictures -> Rotate pictures using EXIF information" with label #20184 +#: system/settings/settings.xml +msgctxt "#36308" +msgid "Pictures will automatically rotate according to information in the EXIF tag, if found." +msgstr "" #. Description of setting "Pictures -> Show video files in listings" with label #22022 #: system/settings/settings.xml @@ -16913,7 +15558,7 @@ #. Description of setting "System -> Video output -> Vertical blank sync" with label #13105 #: system/settings/settings.xml msgctxt "#36356" -msgid "Eliminates tearing." +msgid "Eliminate vertical tearing." msgstr "" #. Description of setting "System -> Video output -> Video calibration..." with label #214 @@ -16972,7 +15617,7 @@ #. Description of setting "System -> Audio output -> DTS capable receiver" with label #254 #: system/settings/settings.xml msgctxt "#36366" -msgid "Select this option if your receiver is capable of decoding DTS streams. Note: Enabling this will disable \"Support 8 channel DTS-HD audio decoding\" option" +msgid "Select this option if your receiver is capable of decoding DTS streams." msgstr "" #: system/settings/darwin_osx.xml @@ -16995,7 +15640,7 @@ #. Description of setting "System -> Audio output -> DTS-HD capable receiver" with label #347 #: system/settings/settings.xml msgctxt "#36370" -msgid "Select this option if your receiver is capable of decoding DTS-HD streams. Note: Enabling this will disable \"Support 8 channel DTS-HD audio decoding\" option" +msgid "Select this option if your receiver is capable of decoding DTS-HD streams." msgstr "" #. Description of setting "System -> Audio output -> Audio output device" with label #545 @@ -17118,25 +15763,25 @@ msgid "Define what action to perform when the shutdown function timer lapsed." msgstr "" -#. Description of settings category "System -> Logging" with label #14092 +#. Description of settings category "System -> Debugging" with label #14092 #: system/settings/settings.xml msgctxt "#36391" -msgid "This category contains the settings for enabling event and debug logging. You can also enable component-specific debug logging in order to help troubleshoot related issues in more detail." +msgid "This category contains the settings for enabling debug functions. You can also enable component-specific debug logging in order to help troubleshoot related issues in more detail." msgstr "" -#. Description of setting "System -> Logging -> Enable debug logging" with label #20191 +#. Description of setting "System -> Debugging -> Enable debug logging" with label #20191 #: system/settings/settings.xml msgctxt "#36392" msgid "Turn debug logging on or off. Useful for troubleshooting." msgstr "" -#. Description of setting "System -> Logging -> Screenshot folder" with label #20004 +#. Description of setting "System -> Debugging -> Screenshot folder" with label #20004 #: system/settings/settings.xml msgctxt "#36393" msgid "Select the folder where screenshots should be saved in." msgstr "" -#. Description of setting "System -> Logging -> Enable component-specific logging" with label #666 +#. Description of setting "System -> Debugging -> Enable component-specific logging" with label #666 #: system/settings/settings.xml msgctxt "#36394" msgid "Enables verbose messages from additional libraries to be included in the debug log." @@ -17304,11 +15949,7 @@ msgid "Enable hardware video decode using Amlogic decoder." msgstr "" -#. Description of setting "TV -> Recording -> Prevent duplicate episodes" with label #812 -#: system/settings/settings.xml -msgctxt "#36423" -msgid "Repeating schedules shall only record new episodes. Not supported by all add-ons and backends." -msgstr "" +#empty string with id 36423 #: system/settings/settings.xml msgctxt "#36424" @@ -17347,11 +15988,7 @@ msgid "Configure how video processing will be accelerated. This includes things like decoding and scaling." msgstr "" -#. Description of setting "System -> Logging -> Show event log" with label #13438 -#: system/settings/settings.xml -msgctxt "#36431" -msgid "Shows all events in the event log for the current profile with options to only show specific levels." -msgstr "" +#empty string with id 36431 #. Description for international setting #310: Keyboard layouts #: system/settings/settings.xml @@ -17377,57 +16014,7 @@ msgid "Use DVDPlayer for decoding of video files with MMAL acceleration." msgstr "" -#. Button on settings "System -> Audio output" to opend DSP manager dialog -#: system/settings/settings.xml -msgctxt "#36436" -msgid "Audio DSP manager..." -msgstr "" - -#. Description of setting "System -> Audio output -> Audio DSP manager..." with label 36436 -#: system/settings/settings.xml -msgctxt "#36437" -msgid "Allows to configure available modes for different stages in audio processing and to arrange the steps within the processing chain of each selected mode." -msgstr "" - -#. Description of setting "System -> Audio output -> Enable Audio DSP processing" with label 36441 -#: system/settings/settings.xml -msgctxt "#36438" -msgid "Enables digital signal processing (DSP) of audio channels specified by the speaker configuration." -msgstr "" - -#. Description of setting "System -> Audio output -> Reset the Audio DSP database..." with label 14082 -#: system/settings/settings.xml -msgctxt "#36439" -msgid "All data (add-on settings and audio DSP manager settings) in the audio DSP database will be erased." -msgstr "" - -#. Used in confirm on dialog to erase database -#: xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp -msgctxt "#36440" -msgid "Erasing all DSP add-on and audio DSP manager settings in the audio DSP database." -msgstr "" - -#. Settings boolean value name -#: system/settings/settings.xml -msgctxt "#36441" -msgid "Enable audio DSP processing" -msgstr "" - -#empty strings from id 36442 to 36459 - -#. Description of settings "System -> Logging -> Enable event logging" with label #14112 -#: system/settings/settings.xml -msgctxt "#36460" -msgid "Event logging allows to keep track of what has happened." -msgstr "" - -#. Description of settings "System -> Logging -> Enable notification event logging" with label #14113 -#: system/settings/settings.xml -msgctxt "#36461" -msgid "Notification event describe regular processes and actions performed by the system or the user." -msgstr "" - -#empty strings from id 36462 to 36499 +#empty strings from id 36436 to 36499 #end reservation #. label of a setting for the stereoscopic 3D mode of the GUI that is/should be applied @@ -17500,13 +16087,7 @@ msgid "Anaglyph yellow / blue" msgstr "" -#. name of a stereoscopic mode -#: system/settings/settings.xml -msgctxt "#36511" -msgid "Checkerboard" -msgstr "" - -#empty strings from id 36512 to 36519 +#empty strings from id 36511 to 36519 #end of reserved strings for 3d modes #. Name of a setting, asking the user for the default playback mode (2D, 3D, ask) of stereoscopic videos @@ -17580,7 +16161,7 @@ msgid "Select how audio is downmixed, e.g. from 5.1 to 2.0.[CR][Enabled] Maintains volume level of the original audio source however the dynamic range is compressed.[CR][Disabled] Maintains the dynamic range of the original audio source when downmixed however volume will be lower. Note: Dynamic range is the difference between the quietest and loudest sounds in an audio source. Enable this setting if movie dialogues are barely audible." msgstr "" -#. Description of setting "System -> Logging -> Component-specific logging..." with label #668 +#. Description of setting "System -> Debugging -> Component-specific logging..." with label #668 #: system/settings/settings.xml msgctxt "#36534" msgid "Specify additional libraries whose verbose messages are to be included in the debug log." @@ -17670,22 +16251,10 @@ #. Description of setting "Services -> AirPlay -> iOS 8 compatibility mode" with label #1268 #: system/settings/settings.xml msgctxt "#36549" -msgid "Enables support for receiving \"Videos\" and \"Pictures\" via AirPlay. This needs to be disabled when using iOS 9 or later clients to restore music streaming via AirPlay. \"Videos\" and \"Pictures\" are only supported for iOS clients using iOS 8.x and older." +msgid "Use iOS8 compatible AirPlay support. If you have trouble with older iOS devices detecting this application as a valid target try switching this off. This option requires a restart to take effect!" msgstr "" -#. Name of a setting -#: system/settings/settings.xml -msgctxt "#36550" -msgid "Stereoscopic 3D effect strength" -msgstr "" - -#. Description of setting "Appearance -> Skin -> Stereoscopic 3D effect strength" with label #36550 -#: system/settings/settings.xml -msgctxt "#36551" -msgid "Defines the strength of the stereoscopic 3D effect in the GUI. This is done by controlling the depth of perception within the GUI, so the higher the value, the more elements will pop out of the screen. [Zero] Disables the stereoscopic 3D effect of the GUI.[CR]For a good visual experience, the value should be higher for small screens and lower for large screens. Note: this is not supported by all skins." -msgstr "" - -#empty strings from id 36552 to 36599 +#empty strings from id 36550 to 36599 #reserved strings 365XX #. Description of settings category "Music -> Library" with label #14022 @@ -18073,40 +16642,3 @@ msgctxt "#38016" msgid "%d fps" msgstr "" - -#. Description of setting #14111 Settings -> Video -> Discs -> Blu-ray region code -#: system/settings/settings.xml -msgctxt "#38017" -msgid "Region A - Americas, East Asia and Southeast Asia. Region B - Africa, Middle East, Southwest Asia, Europe, Australia, New Zealand. Region C - Central Asia, mainland China, Mongolia, South Asia, Belarus, Russia, Ukraine, Kazakhstan." -msgstr "" - -#. Used for the viewstate selection -#: xbmc/video/GUIViewStateVideo.xml -msgctxt "#38018" -msgid "My rating" -msgstr "" - -#. Setting #38019 "Settings -> System -> Audio output -> Support 8 channel DTS-HD audio decoding" -#: system/settings/settings.xml -msgctxt "#38019" -msgid "Support 8 channel DTS-HD audio decoding" -msgstr "" - -#. Description of setting #38019 Settings -> System -> Audio output -> Support 8 channel DTS-HD audio decoding -#: system/settings/settings.xml -msgctxt "#38020" -msgid "Enables decoding of high quality DTS-HD audio streams. Note: This increases CPU load and is only available when DTS and DTS-HD audio passthrough are disabled." -msgstr "" - -#empty string with id 38021 - -#. Used for the viewstate selection -#: xbmc/video/dialogs/GUIDialogVideoInfo.cpp -msgctxt "#38022" -msgid "No rating" -msgstr "" - -#. Used in Confluence -msgctxt "#38023" -msgid "Set my rating" -msgstr "" diff -Nru kodi-16.1~git20160425.1001-final/addons/screensaver.rsxs.euphoria/addon.xml kodi-15.2~git20151019.1039-final/addons/screensaver.rsxs.euphoria/addon.xml --- kodi-16.1~git20160425.1001-final/addons/screensaver.rsxs.euphoria/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/screensaver.rsxs.euphoria/addon.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,125 @@ + + + + + + + + Omtrent so psigedelies soos sluimerskerm kan kom + حول الحصول على مهدء كشاشة التوقف + Падобны на псіхадэлічны ахоўнік экрану + Колкото халюциногенен може да бъде един скрийнсейвър + Quant al més psicodèlic dels estalvis de pantalla + Nejdivočejší šetřič obrazovky všech dob + Mor seicadelig ag y mae modd bod + Omtrent så psykedelisk som en pauseskærm kan blive. + So psychedelisch wie ein Bildschirmschoner nur sein kann + Όσο πιο ψυχεδελική μπορεί να είναι μία προφύλαξη οθόνης + About as psychedelic as screensavers get + About as psychedelic as screensavers get + About as psychedelic as screensavers get + About as psychedelic as screensavers get + Tan psicodélico como un protector de pantalla pueda serlo + El más psicodélico de los salvapantallas + Tan psicodélico como cualquier protector de pantalla debería + Nii psühhedeelne kui üks ekraanisäästja olla saab + Pantaila-babesleetatik psikodelikoena + نهایت توهم زایی یک محافظ صفحه نمایش + Mahdollisesti kaikkein psykedeelisin näytönsäästäjä + Il y a pas d'économiseur d'écran plus psychédélique + Difficilement plus psychédélique comme économiseur d'écran + Máis ou menos tan psicodélico como o pode ser un protector de pantalla + זהו שומר המסך הפסיכדלי ביותר שיכול להיות + Psihodeličan koliko čuvar zaslona može biti + A legpszihedelikusabb képernyővédő + Sepsikedelik mungkin dari sebuah screensaver + Eins geggjuð og skjáhvíla getur orðið + Quanto di più psichedelico possa essere un salvaschermo + スクリーンセーバーはここまでサイケになれる + 싸이키델릭 화면 보호기 + Psihodelinė užsklanda nunešanti stoga + Cik nu vien psihodēlisks ekrānsaudzētājs var būt + Најпсиходелична заштита на екран + Дэлгэц хадгалагчийн хамгийн галзуу хувилбар. + Perihal as psychedelic as screensavers get + Så psykadelisk som en skjermsparer kan bli + Een meer psychedelische schermbeveiliging vindt u niet + Tak psychodeliczny jak tylko się da + Protetor de Tela Psicodélico + Um protector de ecrã mais psicadélico do que este? Impossível. + Un protector ecran cât se poate de năucitor + Самая психоделическая в мире заставка + Tak psychodelický ako to len ide + Najbolj psihadelični ohranjevalnik zaslona + Психоделичан колико то један чувар екрана може да буде. + Ungefär så psykedelisk som en skärmsläckare kan bli + Дар тамоми ҷаҳон ин пардаи экран аз ҳама беҳтарин аст + İnsanı hayallere sürükleyen bir ekran koruyucu + Настільки психоделічна наскільки можливо для заставки + Tạo ra ảo giác mạnh nhất mà trình bảo vệ màn hình có thể có được + 最具迷幻效果的屏幕保护程序 + 最具夢幻效果的螢幕保護程式 + Die is omtrent so psigedelies soos sluimerskerm kan kom. mogumbo het gedink sy Plasma beskermer was heel voor in die koor, maar die een sal jou maag selfs meer laat draai. Jy beter een van daardie vlug siekte sakke kry voor jy te lank na hierdie een staar. + هذا حول الحصول على مهدء كشاشة التوقف. اعتقد موغمبو أن شاشة توقف البلازمة خاصته في قمة الجدول, لكن هذا مقرف أكثر. الأفضل أن تجد أحد أكياس الغثيان قبل أن تنظر لهذا لوقت طويل. + This is about as psychedelic as screensavers get. mogumbo thought his Plasma saver was at the top of the scale, but this one is even more nauseating. You'd better find one of those air sickness bags before you stare at this one for too long. + Точно колкото може един скрийнсейвър. mogumbo смяташе, че неговият "Plasma saver" е върхът, но този е по-смущаващ. Препоръчвам Ви да вземете една торбичка/леген, преди да зазяпате в скрийнсейвъра по-дълго отколкото трябва. + Aquest és probablement el més psicodèlic dels estalvis de pantalla. mogumbo va pensar que el seu estalvi Plasma estava al capdamunt, però aquest és més nauseabund. Serà millor que agafis una bossa per als marejos si has d'estar molta estona mirant-lo. + Asi nejdivočejší šetřič obrazovky všech dob. Použití plazmového šetřiče bývalo vrcholem, ale tento spořič je ještě více zneklidňující. Připravte si pytlíky na zvracení pokud se jej rozhodnete sledovat příliš dlouho. + Mor seicadelig ag y mae modd bod. Roedd mogumbo'n meddwl fod ei arbedwr Plasma ar frig y rhestr, ond mae hwn hyd yn oed yn fwy troëdig. Gwell dod o hyd i fag salwch cyn edrych ar hwn yn rhy hir. + Dette er omtrent så psykedelisk som en pauseskærm kan blive. Mogumbo troede hans Plasma-pauseskærm var i toppen af skalaen, men denne er endnu mere kvalmende. Du må hellere finde en papirpose, inden du kigger alt for længe på denne. + In etwa so ​​psychedelisch wie ein Bildschirmschoner nur sein kann. mogumbo dachte, sein Plasma-Bildschirmschoner wäre bereits abstoßend, aber dieser hier ist noch verabscheuenswürdiger. Kram' besser schon mal eine Kotztüte hervor, bevor Du diesen Bildschirmschoner zu lange anstarrst. + Αυτή είναι η πιο ψυχεδελική προφύλαξη οθόνης που υπάρχει. Ο mogumbo νόμιζε ότι η Plasma προφ. οθόνης του ήταν η κορυφαία, αλλά αυτή είναι ακόμα πιο μπερδεμένη. Καλύτερα να βρείτε μία από εκείνες τις σακούλες για τη ναυτία προτού την κοιτάξετε για πολλή ώρα. + This is about as psychedelic as screensavers get. mogumbo thought his Plasma saver was at the top of the scale, but this one is even more nauseating. You'd better find one of those air sickness bags before you stare at this one for too long. + This is about as psychedelic as screensavers get. mogumbo thought his Plasma saver was at the top of the scale, but this one is even more nauseating. You'd better find one of those air sickness bags before you stare at this one for too long. + This is about as psychedelic as screensavers get. mogumbo thought his Plasma saver was at the top of the scale, but this one is even more nauseating. You'd better find one of those air sickness bags before you stare at this one for too long. + This is about as psychedelic as screensavers get. mogumbo thought his Plasma saver was at the top of the scale, but this one is even more nauseating. You'd better find one of those air sickness bags before you stare at this one for too long. + Este es probablemente el más psicodélico de los protectores de pantalla. mogumbo pensó que su protector de Plasma estaba en lo mas alto, pero éste es más repugnante. Será mejor que busques una bolsa para los mareos si vas a estar mucho tiempo viéndolo. + Este es probablemente el más psicodélico de los salvapantallas. Mogumbo -el autor- pensó que su protector 'Plasma' estaba en lo más alto, pero éste es más repugnante. Será mejor que cojas una bolsa para los mareos si vas a estar mucho tiempo viéndolo. + Esto es tan psicodélico como un protector de pantalla debe ser, mogumbo pensó que su protector Plasma estaba en la cima del mundo, pero éste es aún más nauseabundo. Deberías conseguir una bolsa para mareos antes de quedarte observando por mucho tiempo. + See on nii psühhedeelne kui üks ekraanisäästja olla saab. mogumbo arvas, et tema Plasma säästja oli tippude tipp, aga see on isegi rohkem iiveldama ajav. Parem otsi endale üks neist lennuki oksekottidest enne kui liiga kauaks seda siin vaatama jääd. + Hau ziurrenik inoiz sortu den pantaila-babesle psikodelikoena da. Mogunbo sortzaileak bere Plasma babeslea garaiena zuela uste zuen baina hau oraindik nazkagarriago da. Ikusten denbora asko egon behar bazara hobe zorabiorako poltsa bat edukitzea. + این محافظ تقریبا از نهایت توهم زایی یک محافظ صفحه نمایش برخوردار است. ماگومبو فکر می کرد محافظ پلاسمایی او نهایت کار است، اما این یکی از آن هم تهوع آور تر است. بهتر است قبل از آنکه مدت طولانی به این محافظ خیره شوید یکی از آن پاکت های مخصوص حالت تهوع هواپیماها را تهیه کنید. + Tämä on mahdollisesti niin psykedeelinen kuin vain näytönsäästäjä voi olla. mogumbo luuli, että hänen Plasma-näytönäästäjänsä oli asteikon huipulla, mutta tämä ohittaa senkin. Oksennuspussin hakeminen on suositeltavaa ennen pitkäaikaista tuijottamista. + On fait difficilement plus psychédélique comme économiseur d'écran. mogumbo pensait que son économiseur Plasma était tout en haut de l'échelle mais, celui-ci donne encore plus la nausée. Vous devriez trouver un de ces sacs pour le mal de l'air avant de le fixer trop longtemps. + En terme d'économiseur, on fait difficilement plus psychédélique. Mogumbo pensait son économiseur Plasma tout en haut de l'échelle mais, celui-ci donne encore plus la nausée. Mieux vaut se munir d'un de ces sachets pour le mal de l'air avant de le regarder trop longtemps. + Este é máis ou menos tan psicodélico como pode selo un protector de pantalla. mogumbo pensou que o seu protector de pantalla Plasma era do mello, pero este é aínda máis mareante. Será mellor que colla unha bolsa contra o mareo antes de quedar pampo mirando para el. + זהו שומר מסך הכי פסיכדלי שניתן להיות. mogumbo חשב ששומר מסך הפלזמה שלו הגיע לראש הטבלה, אך שומר זה יגרום לתחושת סחרחורת גדולה יותר. מוטב להצטייד במספר שקיות הקאה בטרם בהיה ממושכת. + Psihodeličan koliko čuvar zaslona može biti. Mogumbo kroz svoj plazma čuvar zaslona je bio vrh, ali od ovog vam je još više loše. Bilo bi vam bolje da pronađete jednu od onih vrećica za mučninu što dijele u avionima prije nego počnete zuriti u ovaj. + Ez a legpszihedelikusabb képernyővédő. mogumbo úgy gondolta, hogy a Plasma képernyővédő van a lista tetején,de ez még inkább kábító. Jobb ha keresel egy légibetegség zacskót mielőtt túl sokáig néznéd a képernyőt. + Ini adalah sepsikedelik mungkin dari sebuah screensaver. mogumbo mengira Plasma savernya berada di puncak, Tapi ini bahkan lebih memabukkan. Anda sebaiknya mencari kantung mabuk terlebih dahulu sebelum menatapnya terlalu lama. + Þetta er líklega eins geggjað og skjáhvílur geta orðið. mogumbo hélt að Plasma skjáhvílan væri á toppnum, en þessi gerir þig meira flökurt. Best fyrir þig að redda þér ælupoka áður en þú starir á þetta í einhvern tíma. + Questo è quanto di più psichedelico possa essere un salvaschermo. mogumbo pensava che il suo salvaschermo 'Plasma' fosse al massimo della psichedelicità, ma questo è anche più nauseante. Faresti meglio a cercare uno di quei sacchetti per il mal d'aria prima di fissarlo troppo a lungo. + This is about as psychedelic as screensavers get. mogumbo thought his Plasma saver was at the top of the scale, but this one is even more nauseating. You'd better find one of those air sickness bags before you stare at this one for too long. + 싸이키델릭한 화면보호기입니다. 거의 토나올 정도의 화면보호기로 오래 쳐다보려면 봉투를 준비하는것이 좋을겁니다. + Tai stogą nunešanti psichodelinė užsklanda. Mogumbo galvojo, kad jo Plasma užsklandos niekas neperšoks, tačiau ši užsklanda tai kažkas tokio. Geriau susiraskite vieną iš tų lėktuvo maišelių, jei supykintų, prieš spoksant į tai per ilgai.. + Ekrānsaudzētājs nevarētu būt vēl vairāk psihodēlisks. mogumbo domāja, ka viņa "Plasma saver" bija saraksta augšgalā, bet šis ir vēl šķebinošāks. Labāk apsēdies un sameklē kādu maisņu nelabai dūšai pirms skaties šo pārāk ilgi. + This is about as psychedelic as screensavers get. mogumbo thought his Plasma saver was at the top of the scale, but this one is even more nauseating. You'd better find one of those air sickness bags before you stare at this one for too long. + Дэлгэц хадгалагчийн хамгийн галзуу гэсэн хувилбар бол энэ. mogumbo ийн хийсэн Plasma дэлгэц хадгалагч хамгийн оргил дээд нь гэж бодож байсан боловч энэ бол бүр ч их толгой эргүүлмээр болсон. Энэ дэлгэцрүү удаан ширтэхээсээ өмнө онгоцонд өгдөг бөөлждөг уутыг урдаа бэлдсэн нь дээр байх. + Ia mengenai as psychedelic as screensavers get. mogumbo berpendapat penyelamat Plasmanya adlaah yang terbaik, tetapi yang ini adalah lebih meloyakan. Oleh itu anda perlu cari beg muntah sebelum anda melihatnya dengan lebih lama. + Dette er så psykadelisk som en skjermsparer kan bli. Mogumbo trodde hans Plasma skjermsparer var på toppen av skalaen, men denne er enda mer kvalmende. Du bør skaffe deg en sånn spypose som de deler ut på fly før du stirrer på denne for lenge. + Ongetwijfeld de meest psychedelische screensaver. mogumbo dacht dat zijn Plasmascreensaver al bovenaan deze lijst stond, maar deze is nóg meer misselijkmakend. Houd uw braakzakje bij de hand, mocht u hier te lang naar staren. + Tak psychodeliczny wygaszacz jak tylko się da. Lepiej zaopatrz się w worki na chorobę lokomocyjną. + Esta é provavelmente a proteção de tela mais psicodélica de todos os tempos. O mogumbo, pensou que a sua proteção de tela 'Plasma' estava no topo da escala de proteções nauseantes mas esta parece ainda pior. Procure um saco de enjoo e sente-se, se vai ficar muito tempo a olhar para a tela. + Provavelmente o protector de ecrã mais psicadélico de sempre. O autor, mogumbo, julgava que a sua proteção 'Plasma' estava no topo da escala, mas este é ainda mais repugnante. É melhor encontrar um desses sacos de enjoo antes de ficar pregado nele durante muito tempo. + Acesta este un protector ecran cât se poate de năucitor. mogumbo credea că screensaverul creat de el, Plasma este pe primul loc, dar acest screensaver este și mai amețitor. Ar trebui să căutați o pungă să nu vi se facă rău înainte de a vă uita la acesta prea mult. + Самая психоделическая в мире заставка. mogumbo считал, что никто не сможет достичь эффекта его заставки Plasma, но от этой заставки укачивает ещё сильнее. Если будете смотреть на эту заставку слишком долго, вам очень скоро понадобится гигиенический пакет. + Tento šetrič je tak psychodelický ako to len ide. Mogumbo myslel, že Plasma šetrič je na vrchole rebríčka, ale tento je ešte viac zvrátený. Radšej si nájdite hygienické vrecko skôr než naň budete civieť pridlho. + Težko bi si zamislili bolj psihadeličen ohranjevalnik zaslona. mogumbo je menil, da je njegov ohranjevalnik Plasma na vrhu, to da ta še bolj vzbuja slabost. Bolje, da najdete eno izmed tistih vrečk za bruhanje, preden predolgo strmite vanj. + Психоделичан колико то један чувар екрана може да буде. Mogumbo је мислио да је његов Plasma чувар екрана на врху скале, али од овога ће вам бити још лошије. Боље да пронађете једну од оних кесица за мучнину које деле у авионима пре него што почнете да зурите у овај превише дуго. + Detta är ungefär så psykedelisk som en skärmsläckare kan bli. mogumbo trodde att hans Plasma Saver var toppen på skalan, men denna gör dig ännu mer illamående. Det är nog bäst att du letar upp en påse för flygsjuka innan du sätter dig ned och stirrar på denna för länge. + Дар тамоми ҷаҳон ин пардаи экран аз ҳама беҳтарин буда дар рейтинги пардаҳои экран ҷои якумро бо пардаи плазмаи худ гирифт. Вақте ки истифодаи ин пардаи экранро сар мекунед, аз истифодаи он ҳеҷ гоҳ рад намекунед. + Bu, insanı hayallere sürükleyen bir ekran koruyucudur. mogumbo kendisine ait bu Plazma ekran koruyucunun skalanın en üstünde olduğunu düşünüyor, ancak daha ziyade insanın içini kaldırıyor. Bu ekran koruyucuyu uzun süre seyretmeden önce mide bulantınız için gerekli önlemleri almanız iyi olur. + Сама психоделічна в світі заставка. mogumbo вважав, що ніхто не зможе досягти ефекту його заставки плазми, але від цієї заставки заколисує ще сильніше. Якщо будете дивитися на цю заставку занадто довго, вам дуже скоро знадобиться гігієнічний пакет. + Chú trọng để tạo ra ảo giác mạnh nhất mà trình bảo vệ màn hình có thể có được. Mogumbo từng nghĩ trình bảo vệ Plasma của mình đã đỉnh, nhưng trình này còn kinh khủng hơn. Tốt hơn hết là bạn nên chuẩn bị một túi chống nôn cho mình trước khi bắt đầu nhìn vào nó quá lâu + 这大概是最具迷幻效果的屏幕保护程序了。mogumbo 以为他的 Plasma 屏保已经是数一数二了,但这个更令人犯晕。如果你要长时间盯视它最好先准备一个晕机袋。 + 這大概是最具夢幻效果的屏幕保護程序了。 mogumbo以為他的電漿螢幕保護程式已經是數一數二了,但這個更令人頭昏腦脹。如果你要長時間盯視它最好先準備一個夠用的暈機嘔吐袋。 + linux osx + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/screensaver.rsxs.euphoria/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/screensaver.rsxs.euphoria/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/screensaver.rsxs.plasma/addon.xml kodi-15.2~git20151019.1039-final/addons/screensaver.rsxs.plasma/addon.xml --- kodi-16.1~git20160425.1001-final/addons/screensaver.rsxs.plasma/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/screensaver.rsxs.plasma/addon.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,125 @@ + + + + + + + + Seker die tweede mees psigedeliese sluimerskerm ooit + ربما شاشة التوقف الثانية الأكثر هدوء على الإطلاق + Напэўна, другі найбольш псіхадэлічны ахоўнік экрану + Вероятно вторият най-халюциногенен скрийнсейвър + Probablement el segon estalvi de pantalla més psicodèlic mai creat + Pravděpodobně druhý nejdivočejší šetřič obrazovky všech dob + Mwy na thebyg yr ail arbedwr sgrin mwyaf seicadelig + Formodentlig den anden mest psykedeliske pauseskærm nogensinde + Wahrscheinlich der zweit-psychodelischste Bildschirmschoner überhaupt + Πιθανότατα η δεύτερη πιο ψυχεδελική προφύλαξη οθόνης που έγινε ποτέ + Probably the second most psychedelic screensaver ever + Probably the second most psychedelic screensaver ever + Probably the second most psychedelic screensaver ever + Probably the second most psychedelic screensaver ever + Probablemente el segundo protector de pantalla más psicodélico jamás creado + Probablemente el segundo salvapantallas más psicodélico jamás creado + Probablemente el segundo protector de pantalla más psicodélico + Arvatavasti teine kõige psühhedeelsem ekraanisäästja, mis iial tehtud + Ziurrenik inoizko bigarren pantaila-babesle psikodelikoena + این محافظ صفحه نمایش احتمالا مقام دوم را در توهم زایی دارد + Todennäköisesti toiseksi psykedeelisin näytönsäästäjä koskaan + Probablement le deuxième économiseur d'écran le plus psychédélique + Probablement le deuxième économiseur d'écran le plus psychédélique jamais créé + Probabelmente o segundo protector de pantalla máis psicodélico. + כנראה שומר המסך השני בדירוג הפסיכדליות + Vjerojatno drugi najveći psihodelični čuvar zaslona ikad + A második legpszihedelikusabb képernyővédő + Mungkin screensaver paling psikedelik nomor dua yang pernah ada + Líklega í öðru sæti yfir klikkuðustu skjáhvíluna + Probabilmente il secondo salvaschermo più psichedelico di sempre + 世界で2番目にサイケなスクリーンセーバー + 아마도 지금까지 두번째로 가장 환상적인 화면 보호기 + Tikriausiai antra labiausiai psichodelinė ekrano užsklanda pasaulyje. + Iespējams viens no vispsihodēliskākajiem ekrānsaudzētājiem pasaulē + Можеби втора нај психоделична заштита на екран + Berkemungkinan penyelamat skrin kedua yang paling psikedelik + Helt sikkert den nest mest psykedeliske skjermspareren som finnes + Waarschijnlijk de op één na meest psychedelische schermbeveiliging ooit + Prawdopodobnie drugi najbardziej psychodeliczny wygaszacz na świecie + Provavelmente a segunda mais psicodélica proteção de tela já vista + Este é provavelmente o segundo melhor protector de ecrã psicadélico de sempre + Probabil al doilea cel mai năucitor protector ecran care a existat vreodată + Наверное, вторая из самых психоделических заставок в мире + පෙනෙන විදියට සදා දෙවන මහත් අධිචිත්ත වේගී තිරමෙහෙකරු + Pravdepodobne druhý najviac hypnotizujúci šetrič obrazovky vôbec + Gotovo drugi najbolj psihadelični ohranjevalnik zaslona na svetu + Вероватно други нај психоделичнији чувар екрана икада + Troligen den näst mest psykedeliska skärmsläckaren någonsin. + Эҳтимол аст, ки имрӯз дар тамоми ҷаҳон ин пардаи экран ҷои дуюмро мегирад + Muhtemelen insanı hayallere sürükleyen en iyi ikinci ekran koruyucu + Напевно, друга серед найбільш психоделічних заставок + Xứng đáng làm trình bảo vệ màn hình gây ảo giác mạnh thứ hai + 或许是排名第二的迷幻效果屏幕保护程序 + 可能是有史以來第二最夢幻的螢幕保護程式保護程式 + Seker die tweede mees psigedeliese sluimerskerm wat bestaan. Verbeel jou net al daai kleure wat rond beweeg. + ربما شاشة التوقف الثانية الأكثر هدوء في الوجود. فقط حاول تصوير هذه الألوان المتحركة . + Probably the second most psychedelic screensaver in existence. Just try to picture all those colors moving around. + Вероятно вторият по сила халюциногенен скрийнсейвър създаван някога. Просто се опитайте да съзрете всички тези цветове. + Probablement el segon estalvi de pantalla més psicodèlic que existeix. Intenta imaginar tots aquests colors movent-se. + Pravděpodobně druhý nejdivočejší šetřič obrazovky všech dob. Zkuste si představit všechny ty poletující barvy. + Mwy na thebyg yr ail arbedwr sgrin mwyaf seicadelig sy'n bod. Ceisiwch ddychmygu'r holl liwiau na'n symud o gwmpas. + Formodentlig den anden mest psykedeliske pauseskærm, der eksisterer. Forestil dig alle de farver, der bevæger sig omkring. + Wahrscheinlich der zweit-psychodelischste Bildschirmschoner, den es gibt. Versuche doch alle diese Farben, die sich umher bewegen, festzuhalten. + Πιθανότατα η δεύτερη πιο ψυχεδελική προφύλαξη οθόνης που υπάρχει. Απλά προσπαθήστε να φανταστείτε όλα αυτά τα χρώματα σε κίνηση. + Probably the second most psychedelic screensaver in existence. Just try to picture all those colours moving around. + Probably the second most psychedelic screensaver in existence. Just try to picture all those colours moving around. + Probably the second most psychedelic screensaver in existence. Just try to picture all those colours moving around. + Probably the second most psychedelic screensaver in existence. Just try to picture all those colors moving around. + Probablemente el segundo protector de pantalla más psicodélico que existe. Solo intente imaginarse todos esos colores moviéndose. + Probablemente el segundo salvapantallas más psicodélico que existe. Intente imaginarse todos esos colores moviéndose. + Probablemente el segundo protector de pantallas más psicodélico. Solo trate de captar todos los colores moviéndose alrededor. + Arvatavasti ajaloo teine kõige psühhedeelsem ekraanisäästja. Püüa lihtsalt kujutleda kõiki neid värve, mis ringi liiguvad. + Ziurrenik existitzen den bigarren pantaila-babesle psikodelikoena. Saiatu kolore guzti horiek mugitzen irudikatzen. + این محافظ احتمالا در میان تمام محافظ های موجود مقام دوم را در توهم زایی دارد. سعی کنید همه این رنگ هایی را که در حال حرکت هستند، نگه دارید. + Todennäköisesti toiseksi psykedeelisin olemassa oleva näytönsäästäjä. Kuvittelepa vain kaikki nuo värit lentelemässä ympäriinsä. + Probablement le deuxième économiseur d'écran le plus psychédélique de l'histoire. Essayez seulement d'imaginer toutes ces couleurs en mouvement. + Probablement le deuxième économiseur d'écran le plus psychédélique de l'histoire. Essayez seulement d'imaginer toutes ces couleurs en mouvement. + Probabelmente o segundo protector de pantalla máis psicodélico do mundo. Tan só probe a imaxinarse todas esas cores movéndose ó redor. + כנראה שומר המסך השני בדירוג הפסיכדליות שקיים כיום. פשוט נסו לדמיין את כל הצבעים האלו נעים ממקום למקום. + Vjerojatno drugi najveći psihodelični čuvar zaslona koji postoji. Samo pokušajte zamisliti sve te boje koje se gibaju okolo. + Valószínüleg a második legpszihedelikusabb képernyővédő ami létezik. Csak képzeld el mindezt a színkavalkádot mozogni. + Mungkin screensaver paling psikedelik nomor dua yang pernah ada. Coba bayangkan warna-warni itu bergerak ke sana kemari. + Líklega í öðru sæti yfir klikkuðustu skjáhvíluna sem til er. Reyndi bara að ímynda þér alla þessa liti á hreyfingu. + Probabilmente il secondo salvaschermo più psichedelico di sempre. Prova semplicemente a guardare tutti quei colori che si muovono. + Probably the second most psychedelic screensaver in existence. Just try to picture all those colors moving around. + 아마도 존재하는 두번째로 가장 환상적인 화면 보호기. 모든 색깔들이 움직이는 것을 상상해보세요. + Turbūt antra labiausiai psichodelinė ekrano užsklanda pasaulyje. Išbandykite ją ir pamatysite judančių spalvų šventę. + Iespējams viens no vispsihodēliskākajiem ekrānsaudzētājiem pasaulē. Pamēģiniet, lai gūtu priekšstatu par krāsu kustību un plūsmu visapkārt. + Можеби втора нај психоделична заштита на екран. Само обидете се да ги согледате сите тие бои кои се движат. + Berkemungkinan penyelamat skrin kedua yang paling psikedelik yang ada. Hanya cuba gambarkan semua warna yang bergerak disekitar. + Helt sikkert den nest mest psykadeliske skjermsparern i verden. Bare prøv å se for deg alle de fargene som beveger seg rundt. + Waarschlijnlijk de op één na meest psychedelische schermbeveliging ooit. Probeer u het voor te stellen: al die kleuren die door elkaar lopen. + Prawdopodobnie drugi, najbardziej psychodeliczny wygaszacz na świecie. Spróbuj i zobacz ferie poruszających się barw. + Provavelmente a segundo mais psicodélica proteção de tela existente. Experimente ver todas essas cores se movimentando ao redor da tela. + Provavelmente, o segundo melhor protector de ecrã psicadélico de sempre. Experimente visualizar todas as cores a moverem-se. + Probabil al doilea cel mai năucitor protector ecran care a existat vreodată. Doar încercați să vă imaginați toate acele culori mișcându-se. + Просто попробуйте представить себе все цвета в движении. + පෙනෙන විදියට සදා පවතින දෙවන මහත් අධිචිත්ත වේගී තිරමෙහෙකරු.වටේ තිබෙන එම සියළු වර්ණ ඡායාරූප කිරීමට උත්සාහ කිරීම පමණයි. + Pravdepodobne druhý najviac hypnotizujúci šetrič obrazovky aký vôbec existuje. Iba si skúste predstaviť všetky tie farby pohybujúc sa okolo. + Gotovo drugi najbolj psihadelični ohranjevalnik zaslona na svetu. Samo predstavljajte si vse te barve, ki letijo naokrog. + Вероватно други нај психоделичнији чувар екрана који је икада постојао. Само пробајте да замислите све те боје како шетају наоколо. + Troligen den näst mest psykedeliska skärmsläckaren som existerar. Bara tänk dig alla färgerna som rör på sig. + Эҳтимол аст, ки имрӯз дар тамоми ҷаҳон ин пардаи экран ҷои дуюмро мегирад. Танҳо тасаввур кунед, ки чӣ қадар зебо ҳамаи рангҳояш бозӣ мекунанд. + Muhtemelen insanı hayallere sürükleyen en iyi ikinci ekran koruyucu. Ekranda dolaşan tüm renkleri seyretmeye çalışın. + Напевно, друга серед найбільш психоделічних заставок. Лише уявіть усі ці переливи кольорів. + Đây có thể là trình bảo vệ màn hình gây ảo giác mạnh thứ hai tại thời điểm này. Hãy thử xem các hình ảnh tạo nên từ các màu sắc di chuyển khắp nơi + 或许是排名第二的迷幻效果屏幕保护程序。你将看到所有颜色满处乱飞。 + 可能是現存第二最夢幻的螢幕保護程式。快來嘗試想像一下所有移動中的色彩變化。 + linux osx + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/screensaver.rsxs.plasma/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/screensaver.rsxs.plasma/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/screensaver.rsxs.solarwinds/addon.xml kodi-15.2~git20151019.1039-final/addons/screensaver.rsxs.solarwinds/addon.xml --- kodi-16.1~git20160425.1001-final/addons/screensaver.rsxs.solarwinds/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/screensaver.rsxs.solarwinds/addon.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,123 @@ + + + + + + + + 'n Betoverende deeltjie effek sluimerskerm + أداة ساحرة تؤثر بشاشة التوقف + Ахоўнік экрану з зачаравальнымі эфэктамі часьціцаў + Скрийнсейвър от частици, които очароват + Un estalvi de pantalla amb uns efectes de partícula fascinants + Spořič obrazovky s fascinujícími částicovými efekty + Arbedwr sgrin effeithiau gronynnau llesmeiriol + En tryllebindende pauseskærm med partikeleffekter + Ein faszinierender Bildschirmschoner mit Partikeleffekten + Μία μαγευτική σωματιδιακή προφύλαξη οθόνης + A mesmerising particle effects screensaver + A mesmerising particle effects screensaver + A mesmerising particle effects screensaver + A mesmerizing particle effects screensaver + Un protector de pantalla con unos efectos de partículas hipnotizantes + Un salvapantallas con unos efectos de partículas hipnotizantes + Un sorprendente protector de pantalla de partículas + Hüpnotiseeriv osakeste efektiga ekraanisäästja + یک محافظ جذاب صفحه نمایش با جلوه های ذرات + Lumoava partikkelitehostenäytönsäästäjä + Un économiseur d'écran hypnotisant à effets de particules + Un économiseur envoûtant à effets de particules + Un hipnotizante protector de pantalla con efectos de partículas + שומר מסך עם אפקט חלקיקים מהפנט + Čuvar zaslona - Očaravajuće kretanje čestica. + Egy igéző részecske-effektus képernyővédő + Penyelamat layar dengan efek partikel yang mencuri perhatian + Dáleiðandi skjáhvíla með brellum með agnir + Un salvaschermo con effetti particellari ipnotizzanti + 幻想的な粒子エフェクトのスクリーンセーバー + 매혹적인 파티클 이펙트 화면 보호기 + Įtaigaus dalelių poveikio ekrano užsklanda + Hipnotizējošs daļiņu efekta ekrānsaudzētājs + Заштита на екран со смирувачки честички + Penyelamat kesan zarah yang memukau + En hypnotiserende skjermsparer med partikkeleffekter + Een hypnotiserende schermbeveiliging met partikeleffecten + Wygaszacz hipnotyzujący efektami cząsteczek + Um protetor de tela hipnotizante com efeitos de partículas + Protector de ecrã com um impressionante efeito de partículas + Un protector ecran cu efecte de particule fascinant + Завораживающая заставка с эффектами частиц + මෝහනය කිරීම් තිරමෙහෙයුම් වෙත ප්‍රයෝගිකව බලපෑම + Fascinujúci šetrič s efektom častíc + Ohranjevalnik zaslona z dih jemajočimi delčki + Чувар екрана са очаравајућим ефектом честица + En hypnotiserande partikeleffektskärmsläckare + Пардаи экрани аҷоиб бо таъсири зарраҳо + Büyüleyici bir parçacık efektli ekran koruyucu + Заставка із частинок, що має гіпнотизуючий ефект + Một trình bảo vệ màn hình với hiệu ứng thôi miên tạo từ các hạt + 一个迷人的粒子效果屏幕保护程序 + 一個令人著迷的粒子效果的螢幕保護程式 + Hierdie is 'n uiters betoverende deeltjie effek sluimerskerm. Jy sal vind dat jy 'n ongelooflike aantal verskillende patrone kan bewerkstellig. + أداة ساحرة جدا تؤثر بشاشة التوقف. ستجد أنك تستطيع أن تحقق عدد مذهل من الأنماط المختلفة. + This is a very mesmerizing particle effects screensaver. You'll find that you can achieve an amazing number of different patterns. + Това е скрийнсейвър, който очарова с частиците си. Ще откриете, че можете да създадете изключително голям брой различни модели. + Aquest és un estalvi de pantalla amb uns efectes de partícules fascinants. Veuràs que pot obtenir un nombre increïble de patrons diferents. + Spořič obrazovky s velmi fascinujícími částicovými efekty. Zjistíte, že můžete dosáhnout úžasného množství různých vzorů. + Mae hwn yn arbedwr sgrin effeithiau gronynnau hynod lesmeiriol. Mae modd cynhyrchu nifer anferthol o batrymau gwahanol. + Dette er en meget tryllebindende pauseskærm med partikeleffekter. Du vil opdage, at man kan opnå et forbløffende antal af forskellige mønstre. + Dies ist ein faszinierender Bildschirmschoner mit Partikeleffekten. Du kannst eine verblüffend große Anzahl an verschiedenen Animationen einstellen. + Αυτή είναι μία μαγευτική σωματιδιακή προφύλαξη οθόνης. Θα διαπιστώσετε ότι μπορείτε να επιτύχετε έναν απίστευτο αριθμό διαφορετικών σχεδίων. + This is a very mesmerising particle effects screensaver. You'll find that you can achieve an amazing number of different patterns. + This is a very mesmerising particle effects screensaver. You'll find that you can achieve an amazing number of different patterns. + This is a very mesmerising particle effects screensaver. You'll find that you can achieve an amazing number of different patterns. + This is a very mesmerizing particle effects screensaver. You'll find that you can achieve an amazing number of different patterns. + Este es un protector de pantalla con unos efectos de partículas hipnotizantes. Descubrirás que puedes obtener un número increíble de patrones diferentes. + Este es un salvapantallas con unos efectos de partículas hipnotizantes. Descubrirás que puedes obtener un número increíble de patrones diferentes. + Éste es un sorprendente protector de pantalla de partículas. Encontrará que puede obtener un gran número de patrones diferentes. + See on väga hüpnotiseeriv osakeste efektiga ekraanisäästja. Võimalik on koostada tohutul hulgal erinevaid mustreid. + این یک محافظ جذاب صفحه نمایش با جلوه های ذرات است. تعداد پویانماهایی که با این محافظ می توان ساخت بطرز شگفت آوری زیاد است. + Erittäin lumoava partikkelitehostenäytönsäästäjä. Tulet huomaamaan uskomattoman määrän erilaisia kuvioita. + C'est un économiseur d'écran à effets de particules particulièrement hypnotisant. Il vous permettra d'obtenir un nombre incroyable de modèles différents. + Voici un économiseur d'écran à effets de particules particulièrement envoûtant. Vous trouverez qu'il permet d'obtenir un nombre incroyable de modèles et d'effets différents. + Este é un protector de pantalla con efectos de partículas moi hipnotizante. Atopará que pode acadar un incrible número de patróns diferentes. + זהו שומר מסך עם אפקט חלקיקים מהפנט ביותר. מספר מפתיע של צורות שונות ומרהיבות יתקבלו. + Ovo je zaista očaravajuči čuvar zaslona. Moguće je ostvariti zapanjujući broj različitih uzoraka. + Ez egy lebilincselő hatású részecske-effektus képernyővédő. Hihetetlen mennyiségű különböző minta képes benne kialakulni. + Ini adalah penyelamat layar dengan efek partikel yang sangat mencuri perhatian. Anda akan lihat bahwa Anda bisa mendapat sejumlah yang mengagumkan dari pola yang berbeda. + Þetta er mjög dáleiðandi skjáhvíla með brellum með ögnum. Þú munt komast að því að þú getur fengið ótrúlegan fjölda af mismunandi mynstri. + Questo è un salvaschermo con effetti particellari è veramente ipnotizzante. E' inoltre possibile ottenere un incredibile numero di differenti schemi. + 非常に幻想的な粒子エフェクトのスクリーンセーバーです。驚くほどの様々なパターンを知ることになるでしょう。 + 매혹적인 파티클 이펙트 화면보호기입니다. 아주 다양한 패턴의 보여줍니다. + Tai labai įtaigaus dalelių poveikio ekrano užsklanda. Atrasite, kad galite sukurti neįtikėtina skaičių skirtingų šablonų. + Šis ir ļoti valdzinošs daļiņu efekta ekrānsaudzētājs. Jūs redzēsit, ka tas spēj izveidot neticamu skaitu dažādu musturu. + Ова е заштита на екран со смирувачки честички. Ќе откриете дека можете да постигнете зачудувачки шеми. + Ia merupakan penyelamat skrin kesan zarah yang sangat memukau. Anda dapati ia boleh dihasilkan beberapa corak yang sangat mempersonakan. + Dette er en veldig hypnotiserende skjermsparer med partikkeleffekter. Du vil finne ut av at du kan oppnå en utrolig mengde forskjellige mønstre. + Dit is een erg hypnotiserende screensaver. Je kunt ongelooflijk veel verschillende patronen maken. + Bardzo hipnotyzujący wygaszacz. Przekonaj się, ile niespotykanch wzorów da się osiągnąć. + Este é um protetor de tela com efeitos de partícula bem hipnotizante. Você verá que pode alcançar um incrível número de diferentes padrões. + Um fantástico protector de ecrã com um impressionante efeito de partículas. Experimente e verá que pode obter um número quase infinito de padrões. + Acesta este un protector ecran cu efecte de particule foarte fascinant. O să vedeți că veți putea obține un număr uimitor de modele diferite. + Завораживающая заставка с эффектами частиц. Для этой заставки на выбор доступно огромное количество вариаций эффектов. + මෙම මෝහනය කිරීම් තිරමෙහෙයුම් වෙත ප්‍රයෝගිකව මහත් බලපෑම සහිතයි. පුදුම සහගත විවිධ මෝස්‌තර ප්‍රමාණයක් ඔබට ලබා ගැනීමට හැකි බව ඔබ සොයගනිවී + Toto je veľmi fascinujúci šetrič s efektom častíc. Zistíte, že môžete dosiahnuť neskutočné číslo rôznych vzorov. + To je ohranjevalnik zaslona z dih jemajočimi delčki. Odkrili boste, da lahko dosežejo neverjetno število različnih vzorcev. + Ово је чувар екрана са веома очаравајућим ефектом честица. Можете остварити невероватан број различитих образаца. + Detta är en väldigt hypnotiserande partikeleffektskärmsläckare. Du kommer att upptäcka att du kan åstadkomma ett häpnadsväckande antal olika mönster. + Ин пардаи экран бо таъсири зарраҳо аҷоиб мебошад. Барои ин парда шумо бисёр таъсирҳои аҷиби нотакрорро пайдо мекунед. + Son derece büyüleyici bir parçacık efektli ekran koruyucu. Birçok değişik şekle ulaşabildiğinizi farkedeceksiniz. + Це дуже гіпнотизуюча заставка із різноманітних ефектів частинок. Ви побачите надзвичайно велику кількість різноманітних візерунків. + Đây là trình bảo vệ có hiệu ứng thôi miên cục kỳ lợi hại. Bạn sẽ thấy sự sáng tạo từ những kiểu kết hợp có thể là không giới hạn + 这是一个非常迷人的粒子效果屏幕保护程序。你会发现你能看到惊人数量的不同图案。 + 這是一個非常令人著迷的粒子效果螢幕保護程式。您會發現可以達到一個另人驚豔的圖形數。 + linux osx + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/screensaver.rsxs.solarwinds/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/screensaver.rsxs.solarwinds/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.black/addon.xml kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.black/addon.xml --- kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.black/addon.xml 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.black/addon.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@  @@ -28,7 +28,7 @@ محافظ خاموش کننده صفحه نمایش Tyhjä ruutu Un économiseur d'écran qui rend votre écran noir - Un économiseur d'écran qui rend l'écran noir + Un économiseur d'écran qui rend votre écran noir Protector de pantalla que volta a súa pantalla negra שומר מסך ההופך את המסך לשחור Čuvar zaslona koji pretvara zaslon u crno @@ -46,13 +46,13 @@ Schermbeveiliging die uw scherm op zwart zet Wygaszacz ekranu wyświetlający czarny ekran Protetor de tela que deixa sua tela preta - Um protetor de ecrã que coloca o seu ecrã negro - Protector de ecran care afișează un ecran negru + Protector de ecrã que coloca o seu ecrã negro + Protector ecran care afișează un ecran negru Заставка «чёрный экран» ඔබගේ තිරය කළුවට හරවන තිරමෙහෙකරු Šetrič obrazovky, ktorú ju zmení na čiernu Ohranjevalnik zaslona, ki počrni zaslon - Чувар екрана који зацрни ваш екран + Чувар екрана који поцрни ваш екран Čuvar ekrana koji zacrni vaš ekran En skärmsläckare som gör din skärm svart Пардаи экран бо таъсири «Пардаи экрани сиёҳ» @@ -85,7 +85,7 @@ Black یک محافظ ساده است که صفحه نمایش را خاموش می کند. Black on yksinkertainen näytönsäästäjä, joka muuttaa ruudun mustaksi. Black est un économiseur d'écran simple qui rend votre écran noir. - Black est un simple économiseur qui passe l'écran au noir. + Black est un simple économiseur qui passe votre écran au noir. Black é un protector de pantalla que voltará a súa pantalla a negro. Black הוא שומר מסך פשוט אשר צובע את המסך בשחור. Black je jednostavni čuvar zaslona koji pretvara zaslon u crno. @@ -103,13 +103,13 @@ Black is een eenvoudige schermbeveiliging die uw scherm op zwart zet. Ten wygaszacz ekranu wyświetla czarny ekran. Staraj się używać go na wyświetlaczach CRT i unikaj na LCD. Black é um protetor de tela que vai deixar sua tela preta - O Black é um protetor de ecrã simples que coloca o seu ecrã negro. - Black este un protector de ecran simplu care afișează negru pe ecran. + Black é um protector de ecrã simples que coloca o seu ecrã negro. + Black este un protector ecran simplu care afișează negru pe ecran. Это простая заставка, которая делает экран чёрным. කළු ඔබගේ තිරය කළුවට හරවන සරල තිරමෙහෙකරුවෙකි. Black je jednoduchý šetrič, ktorý zmení vašu obrazovku na čiernu. Black je enostaven ohranjevalnik zaslona, ki počrni zaslon. - Црно је једноставан чувар екрана који ће зацрнити ваш екран. + Black је једноставан чувар екрана који поцрни ваш екран. Crno je jednostavan čuvar ekrana koji će zacrniti vaš ekran. Detta är en enkel skärmsläckare som gör din skärm svart. Ин пардаи экрани осон мебошад, ки таъсири «Пардаи экрани сиёҳ»-ро истифода мебарад. diff -Nru kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/addon.xml kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/addon.xml --- kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/addon.xml 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/addon.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@  @@ -27,7 +27,7 @@ محافظ تاریک کننده صفحه نمایش Ruudun himmennys Un économiseur d'écran qui baisse la luminosité de votre écran - Un économiseur qui assombrit l'écran + Un économiseur qui assombrit votre écran O protector de pantalla atenúa a súa pantalla שומר מסך אשר מעמעם את המסך Čuvar zaslona koji zatamnjuje vaš zaslon @@ -41,19 +41,18 @@ Ekrānsaudzētājs, kas aptumšo jūsu ekrānu Заштита што го стемнува екранот Penyelamat skrin yang memalapkan skrin anda - Skrinsejver li jbaxxilek id-dawl tal-iskrin သင်၏စကရင်ကို မှေးမှိန်စေသော Screensaver Skjermsparer som demper skjermen din Schermbeveiliging die je scherm dimt Wygaszacz ekranu przyciemniający ekran Protetor de tela que escurece sua tela - Protetor de ecrã que obscurece o seu ecrã - Protector de ecran ce întunecă ecranul + Protector de ecrã que obscurece o seu ecrã + Protector ecran ce întunecă ecranul Заставка, постепенно затемняющая экран Šetrič obrazovky, ktorý zatemní Vašu obrazovku Ohranjevalnik zaslona, ki zatemni zaslon Ruajtës ekrani, që errëson ekranin - Чувар екрана који пригушује ваш екран + Чувар екрана који затамни ваш екран. Čuvar ekrana koji prigušuje vaš ekran En skärmsläckare som tonar ned din skärm Пардаи экран бо таъсири «Пардаи экрани камнур» @@ -85,38 +84,37 @@ محافظ تاریک کننده صفحه نمایش یک محافظ ساده است که نور صفحه نمایش را (بطور تدریجی) تا سطح تعریف شده بین 20 تا 100% کم می کند. Dim on yksinkertainen näytönsäästäjä joka himmentää ruudun valitulle tasolle välillä 20-100%. L'économiseur Dim est un économiseur d'écran simple qui abaissera la luminosité de votre écran à une valeur réglable entre 20 à 100 %. - L'économiseur Dim est un simple économiseur qui assombrira l'écran. L'assombrissement est paramétrable de 20 à 100 %. - Este protector de pantalla atenuará a súa pantalla nun valor configurábel entre o 20% e o 100%. + L'économiseur Dim est un simple économiseur qui assombrira votre écran. L'assombrissement est paramétrable de 20 à 100 %. + O protector de pantalla de Atenuación atenuará a súa pantalla nun valor configurábel entre o 20% e o 100% שומר המסך Dim הוא שומר מסך פשוט אשר מעמעם את המסך לערך מוגדר בין 20% ל־100%. Dim čuvar zaslona je jednostavan čuvar zaslona koji će zatamniti (postepeno isčeznuti) vaš zaslon na odabranu vrijednost između 20 i 100% . A Dim képernyővédő egyszerűen elhalványítja a képernyőt egy előre beállítható sötétségi szintre 20 és 100% között. Penyelamat layar Redup adalah penyelamat layar sederhana yang akan meredupkan (membuat gambar menjadi hilang) layar Anda ke suatu nilai yang dapat diatur antara 20 dan 100%. Dim er einföld skjáhvíla sem lækkar birtustigið á skjánum um stillanlegt gildi á milli 20 og 100% - Dim è un semplice salvaschermo che diminuirà la luminosità del tuo schermo ad un valore (regolabile) tra il 20% e il 100%. + 'Dim' è un semplice salvaschermo che diminuirà la luminosità del tuo schermo ad un valore (regolabile) tra il 20% ed il 100%. Dim はシンプルなスクリーンセーバーで、画面を(フェードアウトで)薄暗くします。値は20%から100%まで設定可能です。 Dim 화면보호기는 화면을 어둡게(페이드 아웃)하는 간단한 화면 보호기 입니다. 어둡게 하는 정도를 20-100%사이에서 설정할 수 있습니다. Pritemdyta ekrano užsklanda yra paprasta ekrano užsklanda,katra pamažu (pamažu mažinant vaizdo ryškumą) jūsų ekrano ryškuma sumažins nuo 20 iki 100%. Aptumsuma ekrānsaudzētājs ir vienkāršs ekrānsaudzētājs, kas aptumšo (padara tumšāku) jūsu ekrānu līdz uzstādāmai robežai starp 20 un 100%. ДИМ Заштитата на екран е едноставно стемнување на екранот, може да се одбере вредност помеѓу 20 и 100% Penyelamat skrin malap adapah penyelamat skrin ringkas yang memalapkan (lenyapkan) skrin anda kepada nilai boleh ditetap diantara 20 hingga 100%. - L-iskrinsejver Dim huwa skrinsejver sempliċi li jbaxxilek (bil-mod) il-qawwa tal-iskrin sa valur li tista' tagħżel bejn 20 u 100%. Dim screensaver သည် ရိုးရှင်းသော Screensaver တစ်ခုဖြစ်သည်။ ၎င်းသည် သင်၏ စခရင် ကို ၂၀% မှ ၁၀၀% အတွင်း မှေးမှိန်သွားအောင်ပြုလုပ်လိမ့်မည် Dim er en enkel skjermsparer som demper skjermen din til en justerbar verdi mellom 20-100% De Dim-schermbeveiliging is een eenvoudige schermbeveiliging die uw scherm geleidelijk dimt. U kan een waarde gaande van 20 tot 100% instellen. Wygaszacz Przyciemnienie jest prostym wygaszaczem, który płynnie przyciemnia (wygasza) ekran do ustawionego poziomu między 20-100%. O Dim ("Escurecer") é um protetor de tela simples que diminui a intensidade da luz de sua tela (escurece), com um valor selecionável entre 20 e 100%. - O protetor de ecrã "Dim" é um protetor simples que obscurece (diminui a intensidade luminosa) o seu ecrã para um valor entre 20 e 100%. - Dim este un protector de ecran simplu care va întuneca (reduce intensitatea luminii) ecranului dumneavoastră la o valoare configurabilă cuprinsă între 20 și 100% . + O protetor de ecrã "Obscurecer" é um protector simples que obscurece (diminui a intensidade luminosa) o seu ecrã para um valor definível entre 20 e 100%. + Dim este un protector ecran simplu care va întuneca (reduce intensitatea luminii) ecranului dumneavoastră la o valoare configurabilă cuprinsă între 20 și 100% . Эта заставка постепенно затемняет изображение на экране до заданного значения (от 20% до 100%). "Dim" šetrič obrazovky je jednoduchý šetrič, ktorý zatemní Vašu obrazovku podľa nastavenia v rozsahu 20 až 100%. Dim je enostaven ohranjevalnik zaslona, ki zatemni zaslon do izbrane svetlosti med 20 in 100%. Errësuesi i ekranit është një mbrojtës i thjeshtë ekrani, i cili errëson (zbeh) ekranin tuaj në varësi të një vlere të axhustueshme nga 20 deri në 100%. - Чувар екрана Пригуши је једноставан чувар екрана који ће пригушити (избледети) ваш екран на подешену вредност између 20 и 100% . + Dim чувар екрана је једноставан чувар екрана који ће затамнети (постепено) ваш екран на подешену вредност између 20 и 100%. Čuvar ekrana Priguši je jednostavan čuvar ekrana koji će prigušiti (izbledeti) vaš ekran na podešenu vrednost između 20 i 100% . Detta är en enkel skärmsläckare som tonar ned ljusstyrkan på din skärm till ett angivet värde mellan 20 och 100% Ин пардаи экран бо таъсири «Пардаи экрани камнур» хеле осон мебошад, ки сатҳи камнури экранро то дараҷае байни 20% ва 100% тағйир меёбад. สกรีนเซฟเวอร์หรี่หน้าจอเป็นสกรีนเซฟเวอร์แบบพื้นฐานที่ช่วยหรี่หน้าจอของคุณซึ่งสามารถตั้งค่าการหรี่หน้าจอได้ตั้งแต่ 20% ถึง 100% - Dim ekran koruyucusu, değeri %20 ile %100 arasında ayarlanabilen ve ekranınızı karanlıklaştıran (silikleştiren) basit bir ekran koruyucudur. + Dim ekran koruyucusu, değeri %20 ila %100 arasında ayarlanabilen ve ekranınızı karanlıklaştıran (silikleştiren) basit bir ekran koruyucudur. Ця заставка затемняє екран (зменшує яскравість) на встановлене значення в межах від 20% до 100%. Trình bảo vệ Dim là trình bảo vệ đơn giản để làm tối (mờ dần) màn hình của bạn theo giá trị được sắp đặt từ 20 cho đến 100%. 淡出屏保是一个简单的屏幕保护程序,它使你的屏幕显示内容变暗(淡出效果),暗化度可在20%至100%之间调节。 diff -Nru kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.mt_mt/strings.po kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.mt_mt/strings.po --- kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.mt_mt/strings.po 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.mt_mt/strings.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Dim -# Addon id: screensaver.xbmc.builtin.dim -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: KODI Main\n" -"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Maltese (Malta) (http://www.transifex.com/projects/p/kodi-main/language/mt_MT/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mt_MT\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" - -msgctxt "#30000" -msgid "Dim level" -msgstr "Livell b'kemm jitbaxxa l-iskrin" diff -Nru kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.pt_pt/strings.po kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.pt_pt/strings.po --- kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.pt_pt/strings.po 2016-01-16 04:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.pt_pt/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -18,4 +18,4 @@ msgctxt "#30000" msgid "Dim level" -msgstr "Nível de obscurecimento" +msgstr "Nível de Obscurecimento" diff -Nru kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs/strings.po kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs/strings.po --- kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs/strings.po 2016-01-16 04:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -18,4 +18,4 @@ msgctxt "#30000" msgid "Dim level" -msgstr "Ниво пригушења" +msgstr "Ниво затамљења" diff -Nru kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs@latin/strings.po kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs@latin/strings.po --- kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs@latin/strings.po 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs@latin/strings.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Dim -# Addon id: screensaver.xbmc.builtin.dim -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: KODI Main\n" -"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Serbian (Latin) (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr_RS@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgctxt "#30000" -msgid "Dim level" -msgstr "Nivo prigušenja" diff -Nru kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sv_se/strings.po kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sv_se/strings.po --- kodi-16.1~git20160425.1001-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sv_se/strings.po 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sv_se/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -18,4 +18,4 @@ msgctxt "#30000" msgid "Dim level" -msgstr "Nivå för nertoning" +msgstr "Nedtoningsnivå" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/addon.xml kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/addon.xml --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/addon.xml 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/addon.xml 2015-08-20 03:00:16.000000000 +0000 @@ -1,8 +1,8 @@ + version="0.3.6" + provider-name="XBMC Foundation"> @@ -20,8 +20,7 @@ Kodi Version Check checks if you are running latest released version. Kodi Version Check comprueba si está ejecutando la última versión de Kodi. Comprobador de Version de Kodi comprueba si se esta ejecutando ultima version publicada. - Kodi Version Check tarkistaa onko käyttämäsi uusin versio. - Le contrôle de version de Kodi vérifie si la dernière version sortie est utilisée. + Kodi Version Check vérifie si vous utilisez la dernière version disponible. Le contrôleur de version Kodi vérifie si vous utilisez la dernière version parue. Kodi Version Check verifica se está a executar a última versión. בודק גרסת Kodi מוודא אם אתה מריץ את הגרסה הרשמית האחרונה. @@ -42,7 +41,7 @@ Kodi Kontrola verzií overuje, či používate najnovšiu vydanú verziu. Preverjanje različice Kodi preveri, če imate nameščeno nazadnje izdano različico. Kodi Version Check kontrollerar om du använder den senaste versionen. - Kodi Sürüm Kontrol yayınlanmış son sürümü kullanıp kullanmadığınızı kontrol eder. + Kodi Versiyon Kontrol yayınlanmış son versiyonu kullanıp kullanmadığınızı kontrol eder. Kodi 版本检查检查你使用的是否为最新发布的版本。 Kodi Version Check only supports a number of platforms/distros as releases may differ between them. For more information visit the kodi.tv website. Kodi Version Check поддържа няколко платформи/дистрибуции. За повече информация посетете страницата www.kodi.tv @@ -55,8 +54,7 @@ Kodi Version Check only supports a number of platforms/distros as releases may differ between them. For more information visit the kodi.tv website. Kodi Version Check only supports a number of platforms/distros as releases may differ between them. For more information visit the kodi.tv website. Kodi Version Check solo soporta un número limitado de plataformas/distribuciones, ya que los lanzamientos pueden diferir entre ellos. Para más información, visite la web de kodi.tv. - Kodi Version Check tukee vain joitain alustoja/distroja koska julkaisut saattavat poiketa toisistaan. Saadaksesi lisätietoa, vieraile kodi.tv:ssä. - Le contrôle de version de Kodi ne prend en charge qu'un certain nombre de plate-formes/distributions car les versions peuvent varier entre elles. Pour plus d'informations, consulter le site Web kodi.tv. + Kodi Version Check supporte seulement un nombre de plateformes/distributions qui peuvent varier entre elles. Visitez le site internet kodi.tv pour plus d'informations. Le contrôleur de version Kodi ne prend en charge qu'un certain nombre de plate-formes/distributions car les versions peuvent varier entre elles. Pour plus d'informations, visitez le site Web kodi.tv. Kodi Version Check só soporta un número limitado de plataformas/distribucións, xa que os lanzamentos poden diferir entre eles. Para máis información visitar o sitio web de kodi.tv. בודק גרסת Kodi תומך רק במספר פלטפורמות/הפצות מאחר שסימון הגרסאות שונה בין אחת לשניה. למידע נוסף בקר באתר kodi.tv. @@ -74,7 +72,7 @@ Проверка новых версий Kodi поддерживается только на ряде платформ/дистрибутивов и они могут различаться между собой. Для получения доп. информации посетите сайт kodi.tv Preverjanje različice Kodi podpira le nekatere platforme/distribucije, saj se izdaje med njimi lahko zelo razlikujejo. Za več informacij obiščite spletišče kodi.tv Kodi Version Check stöder endeast ett antal plattformar/distributioner eftersom utgivningar kan skilja mellan dessa. För mer information besök kodi.tv webplatsen. - Kodi Sürüm Kontrol sürümler arasında değişiklik olduğu için sadece birkaç platform/dağıtım destekler. Daha fazla bilgi için kodi.tv web sitesini ziyaret edin. + Kodi Versiyon Kontrol sürümler arasında değişiklik olduğu için sadece birkaç platform/dağıtım destekler. Daha fazla bilgi için kodi.tv websitesini ziyaret edin Kodi 版本检查只支持部分平台/发行版,它们之间的版本可能会有所不同。欲了解更多信息,请访问 kodi.tv 网站。 Feel free to use this script. For information visit kodi.tv Ползвайте скрипта свободно. За повече информация посетете www.kodi.tv @@ -88,7 +86,7 @@ Feel free to use this script. For information visit kodi.tv Puede usar libremente este programa. Para más información, visite kodi.tv Sientase libre de utilizar este script. Para mas información visita kodi.tv - Utiliser ce script si désiré. Pour plus d'informations, consulter le site kodi.tv + Utilisez ce script si vous le désirez. Visitez le site Internet kodi.tv pour plus d'informations. N'hésitez pas à utiliser ce script. Pour plus d'informations visitez kodi.tv Síntase libre de usar este script, para máis información visitar kodi.tv. תרגיש חופשי להשתמש בסקריפט זה. למידע נוסף בקר ב-kodi.tv @@ -103,11 +101,10 @@ Zapraszamy do używania tego dodatku. Więcej informacji na stronie kodi.tv Esteja à vontade para usar este script. Para mais informação, visite kodi.tv. Sinta-se livre para usar este script. Para maiores informações visite kodi.tv - Simțiți-vă liberi să folosiți acest script. Pentru informații vizitați kodi.tv Используйте этот скрипт на свое усмотрение. Для информации посетите kodi.tv Izvolite uporabiti ta skript. Za dodatne informacije obiščite kodi.tv Använd gärna detta skript. För information, besök kodi.tv - Bu betiği kullanmaktan çekinmeyin. Daha fazla bilgi için kodi.tv adresini ziyaret edin + Bu betiği kullanmaktan çekinmeyin. Daha fazla bilgi için kodi.tv ziyaret edin 可放心使用此脚本,更多信息访问 kodi.tv all GNU GENERAL PUBLIC LICENSE. Version 2, June 1991 diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/changelog.txt kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/changelog.txt --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/changelog.txt 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/changelog.txt 2015-08-20 03:00:16.000000000 +0000 @@ -1,18 +1,10 @@ -v0.3.17 +v0.3.6 - Update version list -v0.3.16 -- Update version list - -v0.3.15 -- Update version list - -v0.3.14 -- Updated language files from Transifex -- Cosmetics -- Update version list +v0.3.5 +- fix list -v0.3.12 to 0.3.4 +v0.3.4 - Update version list v0.3.3 diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/lib/common.py kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/lib/common.py --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/lib/common.py 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/lib/common.py 2014-12-21 04:00:23.000000000 +0000 @@ -22,14 +22,12 @@ import xbmcgui import xbmcvfs -ADDON = xbmcaddon.Addon() -ADDONVERSION = ADDON.getAddonInfo('version') -ADDONNAME = ADDON.getAddonInfo('name') -ADDONPATH = ADDON.getAddonInfo('path').decode('utf-8') -ADDONPROFILE = xbmc.translatePath( ADDON.getAddonInfo('profile') ).decode('utf-8') -ICON = ADDON.getAddonInfo('icon') - -monitor = xbmc.Monitor() +__addon__ = xbmcaddon.Addon() +__addonversion__ = __addon__.getAddonInfo('version') +__addonname__ = __addon__.getAddonInfo('name') +__addonpath__ = __addon__.getAddonInfo('path').decode('utf-8') +__addonprofile__ = xbmc.translatePath( __addon__.getAddonInfo('profile') ).decode('utf-8') +__icon__ = __addon__.getAddonInfo('icon') # Fixes unicode problems def string_unicode(text, encoding='utf-8'): @@ -47,7 +45,7 @@ return text def localise(id): - string = normalize_string(ADDON.getLocalizedString(id)) + string = normalize_string(__addon__.getLocalizedString(id)) return string def log(txt): @@ -57,36 +55,41 @@ xbmc.log(msg=message.encode("utf-8"), level=xbmc.LOGDEBUG) def get_password_from_user(): - keyboard = xbmc.Keyboard("", ADDONNAME + "," +localise(32022), True) + keyboard = xbmc.Keyboard("", __addonname__ + "," +localise(32022), True) keyboard.doModal() if (keyboard.isConfirmed()): pwd = keyboard.getText() return pwd def message_upgrade_success(): - xbmc.executebuiltin("XBMC.Notification(%s, %s, %d, %s)" %(ADDONNAME, + xbmc.executebuiltin("XBMC.Notification(%s, %s, %d, %s)" %(__addonname__, localise(32013), 15000, - ICON)) + __icon__)) def message_restart(): if dialog_yesno(32014): xbmc.executebuiltin("RestartApp") def dialog_yesno(line1 = 0, line2 = 0): - return xbmcgui.Dialog().yesno(ADDONNAME, + return xbmcgui.Dialog().yesno(__addonname__, localise(line1), localise(line2)) def upgrade_message(msg, oldversion, upgrade, msg_current, msg_available): - wait_for_end_of_video() - - if ADDON.getSetting("lastnotified_version") < ADDONVERSION: - xbmcgui.Dialog().ok(ADDONNAME, + # Don't show while watching a video + while(xbmc.Player().isPlayingVideo() and not xbmc.abortRequested): + xbmc.sleep(1000) + i = 0 + while(i < 5 and not xbmc.abortRequested): + xbmc.sleep(1000) + i += 1 + if __addon__.getSetting("lastnotified_version") < __addonversion__: + xbmcgui.Dialog().ok(__addonname__, localise(msg), localise(32001), localise(32002)) - #ADDON.setSetting("lastnotified_version", ADDONVERSION) + #__addon__.setSetting("lastnotified_version", __addonversion__) else: log("Already notified one time for upgrading.") @@ -105,41 +108,47 @@ msg_stable = version_stable['major'] + '.' + version_stable['minor'] + ' ' + version_stable['tag'] + version_stable.get('tagversion','') msg = localise(32034) %(msg_current, msg_available) - wait_for_end_of_video() + # Don't show notify while watching a video + while(xbmc.Player().isPlayingVideo() and not xbmc.abortRequested): + xbmc.sleep(1000) + i = 0 + while(i < 10 and not xbmc.abortRequested): + xbmc.sleep(1000) + i += 1 # hack: convert current version number to stable string # so users don't get notified again. remove in future - if ADDON.getSetting("lastnotified_version") == '0.1.24': - ADDON.setSetting("lastnotified_stable", msg_stable) + if __addon__.getSetting("lastnotified_version") == '0.1.24': + __addon__.setSetting("lastnotified_stable", msg_stable) # Show different dialogs depending if there's a newer stable available. # Also split them between xbmc and kodi notifications to reduce possible confusion. # People will find out once they visit the website. # For stable only notify once and when there's a newer stable available. # Ignore any add-on updates as those only count for != stable - if oldversion == 'stable' and ADDON.getSetting("lastnotified_stable") != msg_stable: + if oldversion == 'stable' and __addon__.getSetting("lastnotified_stable") != msg_stable: if xbmcaddon.Addon('xbmc.addon').getAddonInfo('version') < "13.9.0": - xbmcgui.Dialog().ok(ADDONNAME, + xbmcgui.Dialog().ok(__addonname__, msg, localise(32030), localise(32031)) else: - xbmcgui.Dialog().ok(ADDONNAME, + xbmcgui.Dialog().ok(__addonname__, msg, localise(32032), localise(32033)) - ADDON.setSetting("lastnotified_stable", msg_stable) + __addon__.setSetting("lastnotified_stable", msg_stable) - elif oldversion != 'stable' and ADDON.getSetting("lastnotified_version") != msg_available: + elif oldversion != 'stable' and __addon__.getSetting("lastnotified_version") != msg_available: if xbmcaddon.Addon('xbmc.addon').getAddonInfo('version') < "13.9.0": # point them to xbmc.org - xbmcgui.Dialog().ok(ADDONNAME, + xbmcgui.Dialog().ok(__addonname__, msg, localise(32035), localise(32031)) else: #use kodi.tv - xbmcgui.Dialog().ok(ADDONNAME, + xbmcgui.Dialog().ok(__addonname__, msg, localise(32035), localise(32033)) @@ -153,24 +162,10 @@ else: msg = msg + ' ' + localise(32035) msg = msg + ' ' + localise(32031) - xbmcgui.Dialog().ok(ADDONNAME, msg) - #ADDON.setSetting("lastnotified_version", ADDONVERSION) + xbmcgui.Dialog().ok(__addonname__, msg) + #__addon__.setSetting("lastnotified_version", __addonversion__) ''' - ADDON.setSetting("lastnotified_version", msg_available) + __addon__.setSetting("lastnotified_version", msg_available) else: - log("Already notified one time for upgrading.") - - -def wait_for_end_of_video(): - # Don't show notify while watching a video - while xbmc.Player().isPlayingVideo() and not monitor.abortRequested(): - if monitor.waitForAbort(1): - # Abort was requested while waiting. We should exit - break - i = 0 - while i < 10 and not monitor.abortRequested(): - if monitor.waitForAbort(1): - # Abort was requested while waiting. We should exit - break - i += 1 \ No newline at end of file + log("Already notified one time for upgrading.") \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/lib/jsoninterface.py kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/lib/jsoninterface.py --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/lib/jsoninterface.py 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/lib/jsoninterface.py 2014-07-11 17:50:52.000000000 +0000 @@ -24,7 +24,7 @@ import lib.common from lib.common import log -ADDONPATH = lib.common.ADDONPATH +__addonpath__ = lib.common.__addonpath__ import json as jsoninterface @@ -40,7 +40,7 @@ def get_versionfilelist(): # retrieve versionlists from supplied version file - version_file = os.path.join(ADDONPATH, 'resources/versions.txt') + version_file = os.path.join(__addonpath__, 'resources/versions.txt') # Eden didn't have xbmcvfs.File() if xbmcaddon.Addon('xbmc.addon').getAddonInfo('version') < "11.9.3": file = open(version_file, 'r') @@ -50,4 +50,4 @@ file.close() version_query = unicode(data, 'utf-8', errors='ignore') version_query = jsoninterface.loads(version_query) - return version_query + return version_query \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/lib/viewer.py kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/lib/viewer.py --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/lib/viewer.py 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/lib/viewer.py 2014-07-11 17:50:52.000000000 +0000 @@ -25,12 +25,12 @@ import xbmcaddon ### get addon info -ADDON = xbmcaddon.Addon('service.xbmc.versioncheck') -ADDONVERSION = ADDON.getAddonInfo('version') -ADDONNAME = ADDON.getAddonInfo('name') -ADDONPATH = ADDON.getAddonInfo('path').decode('utf-8') -ADDONPROFILE = xbmc.translatePath( ADDON.getAddonInfo('profile') ).decode('utf-8') -ICON = ADDON.getAddonInfo('icon') +__addon__ = xbmcaddon.Addon('service.xbmc.versioncheck') +__addonversion__ = __addon__.getAddonInfo('version') +__addonname__ = __addon__.getAddonInfo('name') +__addonpath__ = __addon__.getAddonInfo('path').decode('utf-8') +__addonprofile__ = xbmc.translatePath( __addon__.getAddonInfo('profile') ).decode('utf-8') +__icon__ = __addon__.getAddonInfo('icon') class Viewer: # constants @@ -52,7 +52,7 @@ #get header, text heading, text = self.getText() # set heading - self.window.getControl(self.CONTROL_LABEL).setLabel("%s : %s" % (ADDONNAME, heading, )) + self.window.getControl(self.CONTROL_LABEL).setLabel("%s : %s" % (__addonname__, heading, )) # set text self.window.getControl(self.CONTROL_TEXTBOX).setText(text) xbmc.sleep(2000) @@ -60,9 +60,9 @@ def getText(self): try: if sys.argv[ 1 ] == "gotham-alpha_notice": - return "Call to Gotham alpha users", self.readFile(os.path.join(ADDONPATH , "resources/gotham-alpha_notice.txt")) + return "Call to Gotham alpha users", self.readFile(os.path.join(__addonpath__ , "resources/gotham-alpha_notice.txt")) except Exception, e: - xbmc.log(ADDONNAME + ': ' + str(e), xbmc.LOGERROR) + xbmc.log(__addonname__ + ': ' + str(e), xbmc.LOGERROR) return "", "" def readFile(self, filename): @@ -75,12 +75,12 @@ try: url = sys.argv[2] # notify user - notification(ADDONNAME, url) + notification(__addonname__, url) xbmc.sleep(100) # launch url self.launchUrl(url) except Exception, e: - xbmc.log(ADDONNAME + ': ' + str(e), xbmc.LOGERROR) + xbmc.log(__addonname__ + ': ' + str(e), xbmc.LOGERROR) def launchUrl(self, url): import webbrowser @@ -93,7 +93,7 @@ else: Viewer() except Exception, e: - xbmc.log(ADDONNAME + ': ' + str(e), xbmc.LOGERROR) + xbmc.log(__addonname__ + ': ' + str(e), xbmc.LOGERROR) if (__name__ == "__main__"): Main() diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Afrikaans/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Afrikaans/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Afrikaans/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Afrikaans/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Albanian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Albanian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Albanian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Albanian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Amharic/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Amharic/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Amharic/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Amharic/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Arabic/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Arabic/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Arabic/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Arabic/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Armenian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Armenian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Armenian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Armenian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Asturian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Asturian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Asturian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Asturian/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Basque/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Basque/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Basque/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Basque/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Belarusian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Belarusian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Belarusian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Belarusian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Bosnian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Bosnian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Bosnian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Bosnian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Bulgarian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Bulgarian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Bulgarian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Bulgarian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" @@ -62,7 +62,7 @@ msgctxt "#32021" msgid "Enable Kodi version check?" -msgstr "Да се включи ли проверката за нови версии на Kodi?" +msgstr "Да се включи ли Kodi проверката за версия?" msgctxt "#32022" msgid "Please enter your password" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Burmese/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Burmese/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Burmese/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Burmese/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Catalan/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Catalan/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Catalan/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Catalan/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Chinese (Simple)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Chinese (Simple)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Chinese (Simple)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Chinese (Simple)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Chinese (Traditional)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Chinese (Traditional)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Chinese (Traditional)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Chinese (Traditional)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Croatian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Croatian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Croatian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Croatian/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Czech/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Czech/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Czech/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Czech/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Danish/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Danish/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Danish/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Danish/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Dutch/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Dutch/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Dutch/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Dutch/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/English/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/English/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/English/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/English/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/English (Australia)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/English (Australia)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/English (Australia)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/English (Australia)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/English (New Zealand)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/English (New Zealand)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/English (New Zealand)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/English (New Zealand)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" @@ -28,10 +28,6 @@ msgid "Would you like to remove this reminder?" msgstr "Would you like to remove this reminder?" -msgctxt "#32010" -msgid "You can enable/disable it through add-on settings." -msgstr "You can enable/disable it through add-on settings." - msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Use your package manager(apt) to upgrade." @@ -52,10 +48,6 @@ msgid "Do you want to check the repository for a new version?" msgstr "Do you want to check the repository for a new version?" -msgctxt "#32016" -msgid "There is a newer stable Kodi version available." -msgstr "There is a newer stable Kodi version available." - msgctxt "#32020" msgid "General" msgstr "General" @@ -75,27 +67,3 @@ msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Upgrade using apt" - -msgctxt "#32030" -msgid "A new stable version of Kodi is available." -msgstr "A new stable version of Kodi is available." - -msgctxt "#32031" -msgid "Visit http://kodi.tv for more information." -msgstr "Visit http://kodi.tv for more information." - -msgctxt "#32032" -msgid "A new stable version of Kodi is available." -msgstr "A new stable version of Kodi is available." - -msgctxt "#32033" -msgid "Visit http://kodi.tv for more information." -msgstr "Visit http://kodi.tv for more information." - -msgctxt "#32034" -msgid "Using %s while %s is available." -msgstr "Using %s while %s is available." - -msgctxt "#32035" -msgid "It is recommended that you to upgrade to a newer version." -msgstr "It is recommended that you to upgrade to a newer version." diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/English (US)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/English (US)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/English (US)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/English (US)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Esperanto/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Esperanto/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Esperanto/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Esperanto/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Estonian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Estonian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Estonian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Estonian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Faroese/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Faroese/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Faroese/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Faroese/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Finnish/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Finnish/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Finnish/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Finnish/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" @@ -16,50 +16,6 @@ "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#32013" -msgid "Upgrade successful" -msgstr "Päivitys onnistui" - -msgctxt "#32014" -msgid "Do you want to restart Kodi to finish the upgrade?" -msgstr "Haluatko käynnistää Kodin viimeistellääksesi päivityksen?" - -msgctxt "#32016" -msgid "There is a newer stable Kodi version available." -msgstr "Kodista on saatavilla uudempi stable-versio." - msgctxt "#32020" msgid "General" msgstr "Yleinen" - -msgctxt "#32021" -msgid "Enable Kodi version check?" -msgstr "Kytke Kodin version tarkistus?" - -msgctxt "#32022" -msgid "Please enter your password" -msgstr "Ole hyvä ja syötä salasanasi" - -msgctxt "#32030" -msgid "A new stable version of Kodi is available." -msgstr "Uusi stable-versio on saatavilla Kodista." - -msgctxt "#32031" -msgid "Visit http://kodi.tv for more information." -msgstr "Käy http://kodi.tv saadaksesi lisätietoa" - -msgctxt "#32032" -msgid "A new stable version of Kodi is available." -msgstr "Uusi stable-versio on saatavilla Kodista." - -msgctxt "#32033" -msgid "Visit http://kodi.tv for more information." -msgstr "Käy http://kodi.tv saadaksesi lisätietoa" - -msgctxt "#32034" -msgid "Using %s while %s is available." -msgstr "Käytät %s , mutta %s on saatavilla." - -msgctxt "#32035" -msgid "It is recommended that you to upgrade to a newer version." -msgstr "On suositeltavaa, että päivität uudempaan versioon." diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/French/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/French/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/French/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/French/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" @@ -18,39 +18,39 @@ msgctxt "#32001" msgid "We would like to recommend you to upgrade." -msgstr "Il est recommandé de mettre à jour Kodi." +msgstr "Nous vous recommandons de mettre à jour Kodi." msgctxt "#32002" msgid "Visit Kodi.tv for more information." -msgstr "Consulter kodi.tv pour plus d'informations." +msgstr "Visitez kodi.tv pour plus d'informations." msgctxt "#32009" msgid "Would you like to remove this reminder?" -msgstr "Faut-il retirer ce rappel ?" +msgstr "Souhaitez-vous supprimer ce rappel ?" msgctxt "#32010" msgid "You can enable/disable it through add-on settings." -msgstr "Il est possible de l'activer / le désactiver depuis les paramètres de l'extension." +msgstr "Vous pouvez l'activer/désactiver depuis les paramètres de l'extension." msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." -msgstr "Utiliser votre gestionnaire de paquets (apt) pour mettre à niveau." +msgstr "Utilisez votre gestionnaire de paquets (apt) pour mettre à jour." msgctxt "#32012" msgid "A new version is available, do you want to upgrade now?" -msgstr "Une nouvelle version est disponible, faut-il mettre à niveau maintenant ?" +msgstr "Une nouvelle version est disponible, souhaitez vous mettre à niveau maintenant ?" msgctxt "#32013" msgid "Upgrade successful" -msgstr "Mise à niveau réussie" +msgstr "Mise à jour réussie" msgctxt "#32014" msgid "Do you want to restart Kodi to finish the upgrade?" -msgstr "Faut-il redémarrer Kodi pour terminer la mise à niveau ?" +msgstr "Voulez-vous redémarrer Kodi pour terminer la mise à jour ?" msgctxt "#32015" msgid "Do you want to check the repository for a new version?" -msgstr "Faut-il vérifier sur le dépôt s’il existe une nouvelle version?" +msgstr "Voulez-vous vérifier sur le dépôt s’il existe une nouvelle version?" msgctxt "#32016" msgid "There is a newer stable Kodi version available." @@ -62,39 +62,39 @@ msgctxt "#32021" msgid "Enable Kodi version check?" -msgstr "Activer le contrôle de version de Kodi" +msgstr "Activer Kodi Version Check ?" msgctxt "#32022" msgid "Please enter your password" -msgstr "Saisir le mot de passe" +msgstr "S'il vous plaît entrer votre mot de passe" msgctxt "#32023" msgid "Linux: Upgrade complete system" -msgstr "Linux : mettre à niveau le système complet" +msgstr "Linux: Mise à niveau du système terminée" msgctxt "#32024" msgid "Linux: Upgrade using apt" -msgstr "Linux : mettre à niveau en utilisant apt" +msgstr "Linux: Mettre à niveau en utilisant apt" msgctxt "#32030" msgid "A new stable version of Kodi is available." -msgstr "Une nouvelle version stable de Kodi est disponible." +msgstr "Une nouvelle version stable de Kodi est disponible" msgctxt "#32031" msgid "Visit http://kodi.tv for more information." -msgstr "Consulter http://kodi.tv pour plus d'informations." +msgstr "Visitez http://kodi.tv pour plus d'informations." msgctxt "#32032" msgid "A new stable version of Kodi is available." -msgstr "Une nouvelle version stable de Kodi est disponible." +msgstr "A new stable version of Kodi is available." msgctxt "#32033" msgid "Visit http://kodi.tv for more information." -msgstr "Consulter http://kodi.tv pour plus d'informations." +msgstr "Visitez http://kodi.tv pour plus d'informations." msgctxt "#32034" msgid "Using %s while %s is available." -msgstr "%s est utilisée alors que %s est disponible." +msgstr "Utiliser %s tant que %s est disponible." msgctxt "#32035" msgid "It is recommended that you to upgrade to a newer version." diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/French (Canada)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/French (Canada)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/French (Canada)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/French (Canada)/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Galician/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Galician/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Galician/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Galician/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Georgian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Georgian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Georgian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Georgian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/German/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/German/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/German/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/German/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Greek/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Greek/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Greek/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Greek/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Hebrew/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Hebrew/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Hebrew/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Hebrew/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" @@ -28,10 +28,6 @@ msgid "Would you like to remove this reminder?" msgstr "התרצה להסיר תזכורת זאת?" -msgctxt "#32010" -msgid "You can enable/disable it through add-on settings." -msgstr "אתה יכול להפעיל/לנטרל זאת בהגדרות ההרחבה." - msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "השתמש במנהל החבילות (apt) לשידרוג." @@ -52,10 +48,6 @@ msgid "Do you want to check the repository for a new version?" msgstr "התרצה לבדוק האם זמינה גרסה חדשה במאגר?" -msgctxt "#32016" -msgid "There is a newer stable Kodi version available." -msgstr "קיימת גרסה יציבה חדשה של קודי זמינה להורדה " - msgctxt "#32020" msgid "General" msgstr "כללי" @@ -71,31 +63,3 @@ msgctxt "#32023" msgid "Linux: Upgrade complete system" msgstr "לינוקס: שדרוג מערכת מלא" - -msgctxt "#32024" -msgid "Linux: Upgrade using apt" -msgstr "לינוקס: שדרוג באמצעות apt" - -msgctxt "#32030" -msgid "A new stable version of Kodi is available." -msgstr "גרסה יציבה חדשה של קודי זמינה." - -msgctxt "#32031" -msgid "Visit http://kodi.tv for more information." -msgstr "בקר ב-http://kodi.tv למידע נוסף." - -msgctxt "#32032" -msgid "A new stable version of Kodi is available." -msgstr "גרסה יציבה חדשה של קודי זמינה." - -msgctxt "#32033" -msgid "Visit http://kodi.tv for more information." -msgstr "בקר ב-http://kodi.tv למידע נוסף." - -msgctxt "#32034" -msgid "Using %s while %s is available." -msgstr "שימוש בs% בעוד s% זמין." - -msgctxt "#32035" -msgid "It is recommended that you to upgrade to a newer version." -msgstr "מומלץ לך לשדרג לגרסה חדשה יותר." diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Hindi (Devanagiri)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Hindi (Devanagiri)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Hindi (Devanagiri)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Hindi (Devanagiri)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Hungarian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Hungarian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Hungarian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Hungarian/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Icelandic/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Icelandic/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Icelandic/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Icelandic/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Indonesian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Indonesian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Indonesian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Indonesian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Italian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Italian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Italian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Italian/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Japanese/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Japanese/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Japanese/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Japanese/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Korean/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Korean/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Korean/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Korean/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Latvian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Latvian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Latvian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Latvian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Lithuanian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Lithuanian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Lithuanian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Lithuanian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Macedonian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Macedonian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Macedonian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Macedonian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Malay/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Malay/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Malay/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Malay/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Malayalam/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Malayalam/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Malayalam/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Malayalam/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Maltese/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Maltese/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Maltese/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Maltese/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Mongolian (Mongolia)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Mongolian (Mongolia)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Mongolian (Mongolia)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Mongolian (Mongolia)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Norwegian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Norwegian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Norwegian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Norwegian/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Persian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Persian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Persian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Persian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Persian (Iran)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Persian (Iran)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Persian (Iran)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Persian (Iran)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Polish/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Polish/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Polish/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Polish/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Portuguese/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Portuguese/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Portuguese/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Portuguese/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Portuguese (Brazil)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Portuguese (Brazil)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Portuguese (Brazil)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Portuguese (Brazil)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Romanian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Romanian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Romanian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Romanian/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" @@ -24,10 +24,6 @@ msgid "Do you want to restart Kodi to finish the upgrade?" msgstr "Doriți să reporniți Kodi pentru a finaliza actualizarea?" -msgctxt "#32015" -msgid "Do you want to check the repository for a new version?" -msgstr "Doriți să verificați dacă în depozit este o versiune mai nouă?" - msgctxt "#32016" msgid "There is a newer stable Kodi version available." msgstr "Este disponibilă o nouă versiune stabilă pentru Kodi." @@ -64,10 +60,6 @@ msgid "Visit http://kodi.tv for more information." msgstr "Vizitați http://kodi.tv pentru mai multe informații." -msgctxt "#32034" -msgid "Using %s while %s is available." -msgstr "Folosiți versiunea %s în timp ce versiunea %s este disponibilă." - msgctxt "#32035" msgid "It is recommended that you to upgrade to a newer version." msgstr "Este recomandat să treceți la o versiune mai nouă." diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Russian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Russian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Russian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Russian/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Serbian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Serbian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Serbian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Serbian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Serbian (Cyrillic)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Serbian (Cyrillic)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Serbian (Cyrillic)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Serbian (Cyrillic)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Slovak/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Slovak/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Slovak/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Slovak/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Slovenian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Slovenian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Slovenian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Slovenian/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Spanish/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Spanish/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Spanish/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Spanish/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Spanish (Argentina)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Spanish (Argentina)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Spanish (Argentina)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Spanish (Argentina)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Spanish (Mexico)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Spanish (Mexico)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Spanish (Mexico)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Spanish (Mexico)/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Swedish/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Swedish/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Swedish/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Swedish/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Tamil (India)/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Tamil (India)/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Tamil (India)/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Tamil (India)/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Thai/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Thai/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Thai/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Thai/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Turkish/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Turkish/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Turkish/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Turkish/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" @@ -26,19 +26,19 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" -msgstr "Bu hatırlatmayı kaldırmak ister misiniz?" +msgstr "Bu hatırlatmayı kaldırmak istermisiniz?" msgctxt "#32010" msgid "You can enable/disable it through add-on settings." -msgstr "Eklenti ayarlarından etkinleştirip veya devre dışı bırakabilirsiniz." +msgstr "Eklenti ayarlarından etkinleştir/etkinleştirmeyi kaldırabilirsiniz." msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." -msgstr "Güncelleme için paket yöneticinizi(apt) kullanın." +msgstr "Güncelleme için paket yöneticinizi(apt) kullanabilirsiniz." msgctxt "#32012" msgid "A new version is available, do you want to upgrade now?" -msgstr "Yeni bir sürüm mevcut, şimdi güncellemek ister misiniz?" +msgstr "Yeni bir versiyon mevcut, şimdi güncellemek istermisiniz?" msgctxt "#32013" msgid "Upgrade successful" @@ -46,15 +46,15 @@ msgctxt "#32014" msgid "Do you want to restart Kodi to finish the upgrade?" -msgstr "Güncellemeyi tamamlamak için Kodi'yi yeniden başlatmak ister misiniz?" +msgstr "Güncellemeyi tamamlamak için Kodi'yi yeniden başlatmak istermisiniz?" msgctxt "#32015" msgid "Do you want to check the repository for a new version?" -msgstr "Yeni bir sürüm için depoyu kontrol etmek ister misiniz?" +msgstr "Yeni bir versiyon için depoyu kontrol etmek istermisiniz?" msgctxt "#32016" msgid "There is a newer stable Kodi version available." -msgstr "Daha yeni kararlı bir Kodi sürümü mevcut." +msgstr "Daha yeni stabil bir Kodi versiyonu mevcut." msgctxt "#32020" msgid "General" @@ -62,11 +62,11 @@ msgctxt "#32021" msgid "Enable Kodi version check?" -msgstr "Kodi sürüm kontrolünü etkinleştirmek ister misiniz?" +msgstr "Kodi versiyon kontrolünü etkinleştir?" msgctxt "#32022" msgid "Please enter your password" -msgstr "Lütfen parolanızı girin" +msgstr "Lütfen şifrenizi giriniz" msgctxt "#32023" msgid "Linux: Upgrade complete system" @@ -78,19 +78,19 @@ msgctxt "#32030" msgid "A new stable version of Kodi is available." -msgstr "Yeni kararlı bir Kodi sürümü mevcut." +msgstr "Yeni stabil bir Kodi versiyonu mevcut." msgctxt "#32031" msgid "Visit http://kodi.tv for more information." -msgstr "Daha fazla bilgi için http://kodi.tv adresini ziyaret edin." +msgstr "Daha fazla bilgi için http://kodi.tv ziyaret ediniz." msgctxt "#32032" msgid "A new stable version of Kodi is available." -msgstr "Yeni kararlı bir Kodi sürümü mevcut." +msgstr "Yeni stabil bir Kodi versiyonu mevcut." msgctxt "#32033" msgid "Visit http://kodi.tv for more information." -msgstr "Daha fazla bilgi için http://kodi.tv adresini ziyaret edin." +msgstr "Daha fazla bilgi için http://kodi.tv ziyaret ediniz." msgctxt "#32034" msgid "Using %s while %s is available." @@ -98,4 +98,4 @@ msgctxt "#32035" msgid "It is recommended that you to upgrade to a newer version." -msgstr "Daha yeni bir sürüme güncellemeniz önerilir." +msgstr "Daha yeni bir versiyona güncellemeniz tavsiye olunur." diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Ukrainian/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Ukrainian/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Ukrainian/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Ukrainian/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Uzbek/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Uzbek/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Uzbek/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Uzbek/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Vietnamese/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Vietnamese/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Vietnamese/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Vietnamese/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Welsh/strings.po kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Welsh/strings.po --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/language/Welsh/strings.po 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/language/Welsh/strings.po 2014-12-21 04:00:23.000000000 +0000 @@ -1,7 +1,7 @@ # Kodi Media Center language file # Addon Name: Version Check # Addon id: service.xbmc.versioncheck -# Addon Provider: Team Kodi +# Addon Provider: XBMC Foundation msgid "" msgstr "" "Project-Id-Version: XBMC Addons\n" diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/versions.txt kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/versions.txt --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/resources/versions.txt 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/resources/versions.txt 2015-08-20 03:00:16.000000000 +0000 @@ -3,33 +3,6 @@ "releases": { "stable": [ { - "major": "15", - "minor": "2", - "tag": "stable", - "tagversion":"", - "revision": "20151019-02e7013", - "extrainfo": "final", - "addon_support": "yes" - }, - { - "major": "15", - "minor": "1", - "tag": "stable", - "tagversion":"", - "revision": "20150816-f4dda26", - "extrainfo": "final", - "addon_support": "yes" - }, - { - "major": "15", - "minor": "0", - "tag": "stable", - "tagversion":"", - "revision": "20150721-2f34a0c", - "extrainfo": "final", - "addon_support": "yes" - }, - { "major": "14", "minor": "2", "tag": "stable", @@ -149,60 +122,6 @@ ], "releasecandidate": [ { - "major": "16", - "minor": "0", - "tag": "releasecandidate", - "tagversion":"3", - "revision": "20160204-b587e98", - "extrainfo": "RC3", - "addon_support": "yes" - }, - { - "major": "16", - "minor": "0", - "tag": "releasecandidate", - "tagversion":"2", - "revision": "20160128-46175d6", - "extrainfo": "RC2", - "addon_support": "yes" - }, - { - "major": "16", - "minor": "0", - "tag": "releasecandidate", - "tagversion":"1", - "revision": "20160120-981b7dd", - "extrainfo": "RC1", - "addon_support": "yes" - }, - { - "major": "15", - "minor": "2", - "tag": "releasecandidate", - "tagversion":"2", - "revision": "20150920-4ed3eb6", - "extrainfo": "RC2", - "addon_support": "yes" - }, - { - "major": "15", - "minor": "2", - "tag": "releasecandidate", - "tagversion":"1", - "revision": "20150828-59716ca", - "extrainfo": "RC1", - "addon_support": "yes" - }, - { - "major": "15", - "minor": "1", - "tag": "releasecandidate", - "tagversion":"1", - "revision": "20150810-31c22e4", - "extrainfo": "RC1", - "addon_support": "yes" - }, - { "major": "15", "minor": "0", "tag": "releasecandidate", @@ -322,46 +241,6 @@ ], "beta": [ { - "major": "16", - "minor": "0", - "tag": "beta", - "tagversion":"5", - "revision": "20160110-9d9a153", - "addon_support": "yes" - }, - { - "major": "16", - "minor": "0", - "tag": "beta", - "tagversion":"4", - "revision": "20151213-a724f29", - "addon_support": "yes" - }, - { - "major": "16", - "minor": "0", - "tag": "beta", - "tagversion":"3", - "revision": "20151205-85a0a13", - "addon_support": "yes" - }, - { - "major": "16", - "minor": "0", - "tag": "beta", - "tagversion":"2", - "revision": "20151121-98e0275", - "addon_support": "yes" - }, - { - "major": "16", - "minor": "0", - "tag": "beta", - "tagversion":"1", - "revision": "20151113-9c7322e", - "addon_support": "yes" - }, - { "major": "15", "minor": "0", "tag": "beta", @@ -564,30 +443,6 @@ ], "alpha": [ { - "major": "16", - "minor": "0", - "tag": "alpha", - "tagversion":"3", - "revision": "20151001-ca8d08c", - "addon_support": "yes" - }, - { - "major": "16", - "minor": "0", - "tag": "alpha", - "tagversion":"2", - "revision": "20150831-b4afc20", - "addon_support": "yes" - }, - { - "major": "16", - "minor": "0", - "tag": "alpha", - "tagversion":"1", - "revision": "20150801-c5f806e", - "addon_support": "yes" - }, - { "major": "15", "minor": "0", "tag": "alpha", diff -Nru kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/service.py kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/service.py --- kodi-16.1~git20160425.1001-final/addons/service.xbmc.versioncheck/service.py 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/service.xbmc.versioncheck/service.py 2015-07-06 19:37:22.000000000 +0000 @@ -24,11 +24,11 @@ from lib.common import upgrade_message as _upgrademessage from lib.common import upgrade_message2 as _upgrademessage2 -ADDON = lib.common.ADDON -ADDONVERSION = lib.common.ADDONVERSION -ADDONNAME = lib.common.ADDONNAME -ADDONPATH = lib.common.ADDONPATH -ICON = lib.common.ICON +__addon__ = lib.common.__addon__ +__addonversion__ = lib.common.__addonversion__ +__addonname__ = lib.common.__addonname__ +__addonpath__ = lib.common.__addonpath__ +__icon__ = lib.common.__icon__ oldversion = False class Main: @@ -36,7 +36,7 @@ linux = False packages = [] xbmc.sleep(5000) - if xbmc.getCondVisibility('System.Platform.Linux') and ADDON.getSetting("upgrade_apt") == 'true': + if xbmc.getCondVisibility('System.Platform.Linux') and __addon__.getSetting("upgrade_apt") == 'true': packages = ['kodi'] _versionchecklinux(packages) else: @@ -75,13 +75,13 @@ pass elif dialog_yesno(32009, 32010): log("disabling addon by user request") - ADDON.setSetting("versioncheck_enable", 'false') + __addon__.setSetting("versioncheck_enable", 'false') return if handler: if handler.check_upgrade_available(packages[0]): if _upgrademessage(32012, oldversion, True): - if ADDON.getSetting("upgrade_system") == "false": + if __addon__.getSetting("upgrade_system") == "false": result = handler.upgrade_package(packages[0]) else: result = handler.upgrade_system() @@ -100,5 +100,5 @@ if (__name__ == "__main__"): - log('Version %s started' % ADDONVERSION) + log('Version %s started' % __addonversion__) Main() diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/AddonBrowser.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/AddonBrowser.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/AddonBrowser.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/AddonBrowser.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no ActivateWindow(1112) 50,51,550,551 @@ -18,18 +18,38 @@ AddonInfoThumbView1 - - DepthFooter - CommonPageCount - CommonNowPlaying - + CommonPageCount + CommonNowPlaying MainWindowMouseButtons BehindDialogFadeOut ScrollOffsetLabel - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_addons.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + !IsEmpty(Container.FolderName) + + -250 SideBladeLeft @@ -135,5 +155,6 @@ center + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/defaults.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/defaults.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/defaults.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/defaults.xml 2015-10-19 08:39:14.000000000 +0000 @@ -69,8 +69,6 @@ 126 scroll-up-2.png scroll-down-2.png - scroll-up-2.png - scroll-down-2.png scroll-up-focus-2.png scroll-down-focus-2.png right @@ -96,8 +94,6 @@ - scroll-up-2.png scroll-down-2.png - scroll-up-2.png - scroll-down-2.png scroll-up-focus-2.png scroll-down-focus-2.png font13 @@ -119,8 +115,6 @@ radiobutton-focus.png radiobutton-nofocus.png radiobutton-nofocus.png - radiobutton-focus.png - radiobutton-nofocus.png button-focus.png button-nofocus.png diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogAddonInfo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogAddonInfo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogAddonInfo.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogAddonInfo.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 9000 + 1 185 40 !IsEmpty(ListItem.Property(Addon.broken)) @@ -297,14 +298,6 @@ center font12_title - - Auto-update button - 220 - 43 - - center - font12_title - Launch Addon button 220 @@ -329,6 +322,14 @@ center font12_title + + Rollback button + 220 + 43 + + center + font12_title + Changelog button 220 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogAddonSettings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogAddonSettings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogAddonSettings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogAddonSettings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 9 + 1 240 60 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogAlbumInfo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogAlbumInfo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogAlbumInfo.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogAlbumInfo.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,16 +1,16 @@ 5 + no - DepthSideBlade !Window.IsVisible(FileBrowser) WindowOpen WindowClose 180 0 - 1120 + 1100 720 MediaBladeSub.png @@ -482,27 +482,149 @@ !Control.IsVisible(50) - Album cover + Actor image 210 480 160 160 $INFO[Container(50).Listitem.Icon] keep - Control.IsVisible(50) + Container.Content(Artists) + Control.IsVisible(50) + + + 380 + 520 + 860 + 120 + 9000 + 61 + 61 + 9000 + list + 61 + 200 + vertical + + + 0 + 0 + 430 + 40 + button-nofocus.png + + + 10 + 0 + 410 + 40 + font12 + left + center + selected + + + + 220 + 0 + 200 + 40 + font12 + right + center + selected + + + + + + 0 + 0 + 430 + 40 + !Control.HasFocus(50) + button-nofocus.png + + + 0 + 0 + 430 + 40 + Control.HasFocus(50) + button-focus2.png + + + 10 + 0 + 410 + 40 + font12 + left + center + selected + + + + 220 + 0 + 200 + 40 + font12 + right + center + selected + + + + + + 0 + 0 + 430 + 40 + button-nofocus.png + + + 10 + 0 + 410 + 40 + font12 + left + center + selected + + + + + + 0 + 0 + 430 + 40 + !Control.HasFocus(50) + button-nofocus.png + + + 0 + 0 + 430 + 40 + Control.HasFocus(50) + button-focus2.png + + + 10 + 0 + 410 + 40 + font12 + left + center + selected + + + - - - - - - - - - - - - 210 660 @@ -538,9 +660,6 @@ - - DepthSideBlade - Clock - + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogAudioDSPManager.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogAudioDSPManager.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogAudioDSPManager.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogAudioDSPManager.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,597 +0,0 @@ - - - 1 - 9000 - dialogeffect - - 40 - 40 - - - BehindDialogFadeOut - - 0 - 0 - 1200 - 640 - $VAR[SelectBack] - dialogheader.png - - - 0 - 0 - 1200 - 40 - - dialog close button - 1120 - 15 - 64 - 32 - - - - PreviousMenu - DialogCloseButton-focus.png - DialogCloseButton.png - system.getbool(input.enablemouse) - VisibleFadeEffect - - - dialog header image - 600 - 16 - 1140 - 40 - dialogheader.png - - - window header label - 0 - 20 - 1200 - 30 - font13_title - - center - center - selected - black - - - - processing mode selection list - 30 - 70 - 1140 - 40 - 9001 - 200 - 9000 - 9000 - horizontal - 200 - - - 0 - 0 - 228 - 40 - button-nofocus.png - - - 5 - 0 - 218 - 40 - grey3 - font13_title - center - center - - false - 0 - - - - - 0 - 0 - 228 - 40 - button-focus2.png - conditional - - - 5 - 0 - 218 - 40 - white - font13_title - center - center - - false - 0 - - - - - - $LOCALIZE[15114] - true - noop - InputResampling - - - - $LOCALIZE[15113] - true - noop - Preprocessing - - - - $LOCALIZE[15115] - true - noop - Masterprocessing - - - - $LOCALIZE[15117] - true - noop - Postprocessing - - - - $LOCALIZE[15116] - true - noop - OutputResampling - - - - - white borders and mode description - 30 - 109 - 1140 - 500 - - blue border - 0 - 0 - 1140 - 500 - button-focus3.png - 80FFFFFF - - - current mode description label - 10 - 0 - 1120 - 30 - font12 - left - center - white - selected - - - - - available- and active mode lists - 30 - 150 - 1140 - 500 - 9001 - 9000 - - available modes group - 0 - 0 - 570 - 360 - - blue available modes - 25 - 2 - 550 - 30 - font12_title - - center - center - blue - black - - - available modes list border - 25 - 30 - 538 - 350 - button-nofocus.png - - - scrollbar for available modes list - 5 - 30 - 25 - 350 - ScrollBarV.png - ScrollBarV_bar.png - ScrollBarV_bar_focus.png - ScrollBarNib.png - ScrollBarNib.png - 61 - 20 - false - vertical - - - available modes list - 30 - 35 - 528 - 345 - 9000 - 9001 - 60 - 21 - 60 - 200 - - - 0 - 3 - 528 - 40 - button-nofocus.png - - - 15 - 8 - 30 - 30 - $INFO[ListItem.Property(Icon)] - keep - !StringCompare(ListItem.Property(Icon),"") - - - 15 - 8 - 30 - 30 - DefaultAudioDSP.png - keep - StringCompare(ListItem.Property(Icon),"") - - - active addon name and mode name - 80 - 3 - 435 - 40 - font12 - left - center - white - false - selected - - - - - - 0 - 3 - 528 - 60 - button-focus2.png - conditional - - - 5 - 8 - 50 - 50 - $INFO[ListItem.Property(Icon)] - keep - !StringCompare(ListItem.Property(Icon),"") - - - 5 - 8 - 50 - 50 - DefaultAudioDSP.png - keep - StringCompare(ListItem.Property(Icon),"") - - - addon name and mode name on focus - 80 - 3 - 435 - 40 - font12 - left - center - white - false - selected - - - - ADSP-Mode description on focus - 80 - 33 - 435 - 30 - font12 - left - center - grey2 - false - selected - - !Control.HasFocus(20) - - - ADSP-Mode description on focus - 80 - 33 - 435 - 30 - font12 - left - center - grey2 - true - > < - selected - - Control.HasFocus(20) - - - - - - 568 - 0 - 570 - 360 - - blue active modes - 10 - 2 - 550 - 30 - font12_title - - center - center - blue - black - - - active modes list border - 10 - 30 - 538 - 350 - button-nofocus.png - - - scrollbar for active modes list - 542 - 30 - 25 - 350 - ScrollBarV.png - ScrollBarV_bar.png - ScrollBarV_bar_focus.png - ScrollBarNib.png - ScrollBarNib.png - 21 - 60 - false - vertical - - - active modes list - 15 - 35 - 538 - 345 - 9000 - 9001 - 20 - 61 - 61 - 200 - - - 0 - 3 - 528 - 40 - button-nofocus.png - - - 15 - 8 - 30 - 30 - $INFO[ListItem.Property(Icon)] - keep - !StringCompare(ListItem.Property(Icon),"") - - - 15 - 8 - 30 - 30 - DefaultAudioDSP.png - keep - StringCompare(ListItem.Property(Icon),"") - - - active addon name and mode name - 80 - 3 - 435 - 40 - font12 - left - center - white - false - selected - - - - - - 0 - 3 - 528 - 60 - button-focus2.png - conditional - - - 5 - 8 - 50 - 50 - $INFO[ListItem.Property(Icon)] - keep - !StringCompare(ListItem.Property(Icon),"") - - - 5 - 8 - 50 - 50 - DefaultAudioDSP.png - keep - StringCompare(ListItem.Property(Icon),"") - - - addon name and mode name on focus - 80 - 3 - 435 - 40 - font12 - left - center - white - false - selected - - true - - - ADSP-Mode description on focus - 80 - 33 - 435 - 30 - font12 - left - center - grey2 - false - selected - - !Control.HasFocus(21) - - - ADSP-Mode description on focus - 80 - 33 - 435 - 30 - font12 - left - center - grey2 - true - > < - selected - - Control.HasFocus(21) - - - - - - - 55 - 528 - 1090 - - Default RadioButton - 0 - 15 - 40 - 280 - 200 - 9000 - 24 - 23 - 252 - font13 - grey2 - white - button-focus2.png - button-nofocus.png - - ButtonCommonValues - - - Apply changes button - 288 - 15 - 40 - 250 - 200 - 9000 - 22 - 24 - font13 - 15FFFFFF - grey3 - white - button-focus2.png - - center - - - Clear active modes button - 841 - 15 - 40 - 250 - 200 - 9000 - 23 - 22 - font13 - 30FFFFFF - grey3 - white - button-focus2.png - - center - - - - diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogAudioDSPSettings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogAudioDSPSettings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogAudioDSPSettings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogAudioDSPSettings.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,244 +0,0 @@ - - - 5 - - 240 - 60 - - dialogeffect - - - Conditional - - background image - 0 - 0 - 800 - 600 - DialogBack2.png - - - Dialog Header image - 40 - 16 - 720 - 40 - dialogheader.png - - - header label - 40 - 20 - 720 - 30 - font13_title - - center - center - selected - black - - - Close Window button - 710 - 15 - 64 - 32 - - - - PreviousMenu - DialogCloseButton-focus.png - DialogCloseButton.png - system.getbool(input.enablemouse) - - - control area - 40 - 65 - 520 - 470 - 5 - 60 - 60 - 60 - 5 - 5 - - - 560 - 65 - 25 - 470 - ScrollBarV.png - ScrollBarV_bar.png - ScrollBarV_bar_focus.png - ScrollBarNib.png - ScrollBarNib.png - 5 - 5 - 61 - 61 - false - vertical - - - info label - 40 - 540 - 720 - 30 - font13_title - - left - center - selected - black - - - Audio DSP Image - 555 - 540 - 85 - 35 - keep - !IsEmpty(ADSP.MasterOwnIcon) - $INFO[ADSP.MasterOwnIcon] - - - Audio Codec Image - 640 - 540 - 85 - 35 - keep - $INFO[VideoPlayer.AudioCodec,flagging/audio/,.png] - IsEmpty(ADSP.MasterOverrideIcon) + Player.HasVideo - - - Audio Codec Image - 640 - 540 - 85 - 35 - keep - $INFO[MusicPlayer.Codec,flagging/audio/,.png] - IsEmpty(ADSP.MasterOverrideIcon) + Player.HasAudio - - - Audio Codec Override Image - 640 - 540 - 85 - 35 - keep - !IsEmpty(ADSP.MasterOverrideIcon) - $INFO[ADSP.MasterOverrideIcon] - - - Audio Channels Image - 730 - 540 - 50 - 35 - keep - $INFO[VideoPlayer.AudioChannels,flagging/audio/,.png] - - - type label - 590 - 65 - 720 - 30 - font13_title - - left - center - grey2 - black - - - type label - 590 - 100 - 230 - 30 - font13_title - - left - center - selected - black - - - - Default Button - 0 - 0 - 40 - font13 - grey2 - white - button-focus2.png - - - Default RadioButton - 0 - 0 - 40 - font13 - grey2 - white - button-focus2.png - - - Default SpinControlex - 0 - 0 - 40 - font13 - grey2 - white - button-focus2.png - button-nofocus.png - center - yes - - - separator image - 2 - separator2.png - - - Default Edit - 0 - 0 - 40 - font13 - grey2 - white - button-nofocus.png - button-focus2.png - - - Default Slider - 40 - button-nofocus.png - button-focus2.png - font13 - grey2 - white - - - Default Label - 0 - 0 - 30 - - center - bottom - font13_title - grey - black - - - diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogBusy.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogBusy.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogBusy.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogBusy.xml 2015-10-19 08:39:14.000000000 +0000 @@ -3,12 +3,12 @@ WindowOpen WindowClose + 1 0 0 - DepthDialog+ 1070 640 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogButtonMenu.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogButtonMenu.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogButtonMenu.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogButtonMenu.xml 2015-10-19 08:39:14.000000000 +0000 @@ -3,6 +3,7 @@ 9001 dialogeffect + 1 0 0 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogContentSettings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogContentSettings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogContentSettings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogContentSettings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 20 + 1 240 20 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogContextMenu.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogContextMenu.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogContextMenu.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogContextMenu.xml 2015-10-19 08:39:14.000000000 +0000 @@ -3,6 +3,7 @@ 1000 dialogeffect + 1 0 0 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogExtendedProgressBar.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogExtendedProgressBar.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogExtendedProgressBar.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogExtendedProgressBar.xml 2015-10-19 08:39:14.000000000 +0000 @@ -5,7 +5,6 @@ WindowClose - DepthHeader 720 0 conditional diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogFavourites.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogFavourites.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogFavourites.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogFavourites.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,18 +2,18 @@ 450 + 1 0 0 - DepthSideBlade WindowOpen WindowClose 400r 0 - 420 + 400 720 HomeBladeSub.png diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogFileStacking.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogFileStacking.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogFileStacking.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogFileStacking.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,117 @@ + + + 450 + dialogeffect + + 1 + 315 + 260 + + + + 0 + 0 + 650 + 200 + OverlayDialogBackground.png + + + Close Window button + 560 + 5 + 64 + 32 + + - + PreviousMenu + DialogCloseButton-focus.png + DialogCloseButton.png + 13 + 13 + 13 + 13 + system.getbool(input.enablemouse) + + + heading label + 40 + 18 + 570 + 30 + center + center + font13 + + white + + + 40 + 60 + 570 + 30 + center + center + font12 + + grey2 + + + 50 + 110 + 20 + 25 + scroll-left-focus.png + Container(450).HasPrevious + + + 575 + 110 + 20 + 25 + scroll-right-focus.png + Container(450).HasNext + + + 85 + 105 + 480 + 100 + 450 + 450 + 450 + 450 + horizontal + list + 200 + + + 0 + 0 + 38 + 32 + stretch + StackNF.png + + + + + 0 + 0 + 38 + 32 + stretch + StackFO.png + + + + + 40 + 155 + 570 + 22 + font13_title + center + Container(450).ListItem.Label + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogGamepad.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogGamepad.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogGamepad.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogGamepad.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,54 @@ + + + 1 + + 1 + 335 + 235 + + dialogeffect + + + + + + + + + + + + dialog line 1 + 30 + 70 + 550 + 30 + left + center + + font13 + + + dialog line 2 + 30 + 95 + 550 + 30 + left + center + + font13 + + + dialog line 3 + 30 + 130 + 550 + 30 + left + center + + font35_title + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogKaiToast.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogKaiToast.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogKaiToast.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogKaiToast.xml 2015-10-19 08:39:14.000000000 +0000 @@ -8,7 +8,6 @@ - DepthMax conditional 0 @@ -25,6 +24,7 @@ 50 50 keep + DefaultFile.png Line 1 Label @@ -52,6 +52,36 @@ false 2000 + + avatar + 20 + 10 + 50 + 50 + keep + false + DefaultIconInfo.png + + + avatar + 20 + 10 + 50 + 50 + keep + false + DefaultIconWarning.png + + + avatar + 20 + 10 + 50 + 50 + keep + false + DefaultIconError.png + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogKaraokeSongSelectorLarge.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogKaraokeSongSelectorLarge.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogKaraokeSongSelectorLarge.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogKaraokeSongSelectorLarge.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,45 @@ + + + dialogeffect + + 1 + 415 + 275 + + + + + + + + + + + + + + Song Number Label + 30 + 70 + 390 + 30 + font28_title + white + center + center + + + Song Name Label + 30 + 120 + 390 + 20 + font13 + center + center + blue + true + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogKaraokeSongSelector.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogKaraokeSongSelector.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogKaraokeSongSelector.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogKaraokeSongSelector.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,40 @@ + + + WindowOpen + WindowClose + + + 100 + 0 + + 0 + -10 + 370 + 70 + InfoMessagePanel.png + + + Song Number Label + 15 + 2 + 340 + 25 + font13_title + selected + left + center + + + Song Name Label + 15 + 27 + 340 + 20 + font13 + blue + left + center + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogKeyboard.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogKeyboard.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogKeyboard.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogKeyboard.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,8 +2,8 @@ 300 dialogeffect - DepthDialog+ + 2 205 120 @@ -20,54 +20,6 @@ - - 0 - -90 - Control.IsVisible(313) - - 0 - 0 - 860 - 102 - OverlayDialogBackground.png - - - 50 - 18 - 760 - 32 - stretch - KeyboardEditArea.png - - - 0 - 53 - 860 - 2 - stretch - separator.png - - - HZCODE label - 55 - 18 - 750 - 30 - font13 - center - center - - - HZLIST label - 55 - 55 - 750 - 30 - font13 - center - center - - 50 60 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogMediaFilter.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogMediaFilter.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogMediaFilter.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogMediaFilter.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 5 + 1 240 100 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogMediaSource.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogMediaSource.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogMediaSource.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogMediaSource.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 10 + 1 240 100 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogMuteBug.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogMuteBug.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogMuteBug.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogMuteBug.xml 2015-10-19 08:39:14.000000000 +0000 @@ -3,6 +3,7 @@ - dialogeffect + 0 0 0 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogNetworkSetup.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogNetworkSetup.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogNetworkSetup.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogNetworkSetup.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 10 + 1 240 135 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogNumeric.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogNumeric.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogNumeric.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogNumeric.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,57 +2,31 @@ 21 dialogeffect - DepthDialog+ - 420 - 175 + 2 + 480 + 145 0 0 - 380 + 320 430 DialogBack.png Dialog Header image 40 - 18 - 300 - 50 + 16 + 240 + 40 dialogheader.png - - Close Window button - 290 - 15 - 64 - 32 - - - - PreviousMenu - DialogCloseButton-focus.png - DialogCloseButton.png - system.getbool(input.enablemouse) - - - dialog Heading - 20 - 28 - 340 - 35 - font12_title - selected - black - center - center - true - 30 70 - 320 + 260 50 stretch KeyboardEditArea.png @@ -61,7 +35,7 @@ Edit Text 35 70 - 310 + 250 50 font13 selected @@ -72,13 +46,26 @@ 40 120 - 300 + 240 30 stretch dialogheader.png + + dialog Heading + 20 + 20 + 280 + 35 + font12_title + selected + black + center + center + true + - 55 + 40 155 1 button @@ -138,29 +125,22 @@ Backspace button 180 0 - 90 + 60 120 font12 center center KeyboardCornerTopNF.png - KeyboardCornerTop.png + KeyboardCornerTop.png 120 - + black + 270 13 11 21 21 - - Backspace icon - 210 - 45 - 30 - 30 - KeyboardBackKey.png - 4 button 0 @@ -273,29 +253,22 @@ Done button 180 120 - 90 + 60 120 font12 center center - KeyboardCornerBottomNF.png - KeyboardCornerBottom.png + KeyboardCornerBottomNF.png + KeyboardCornerBottom.png 120 - + black + 270 19 17 23 23 - - Done icon - 210 - 165 - 30 - 30 - KeyboardDoneKey.png - prev button 0 @@ -307,8 +280,8 @@ black center center - KeyboardCornerBottomNF.png - KeyboardCornerBottom.png + KeyboardCornerBottomNF.png + KeyboardCornerBottom.png 21 10 17 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogOK.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogOK.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogOK.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogOK.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,11 +2,11 @@ 10 + 1 335 230 dialogeffect - DepthDialog+ diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPeripheralManager.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPeripheralManager.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPeripheralManager.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPeripheralManager.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,183 @@ + + + 20 + + 1 + 335 + 30 + + dialogeffect + + + !Window.IsVisible(PeripheralSettings) + VisibleFadeEffect + + + + + + + + + + + 20 + 65 + 550 + 510 + 10 + 10 + 61 + 61 + 61 + 200 + Conditional + + + 0 + 0 + 550 + 80 + button-nofocus.png + + + Name + 10 + 5 + 520 + 20 + + left + center + font13 + white + + + Product ID Vendor ID + 10 + 30 + 520 + 20 + + left + center + font12 + blue + + + class + 10 + 50 + 520 + 20 + + left + center + font12 + blue + + + + + 0 + 0 + 550 + 80 + button-nofocus.png + !Control.HasFocus(20) + VisibleFadeEffect + + + 0 + 0 + 550 + 80 + button-focus2.png + Control.HasFocus(20) + VisibleFadeEffect + + + Name + 10 + 5 + 520 + 20 + + left + center + font13 + white + + + Product ID Vendor ID + 10 + 30 + 520 + 20 + + left + center + font12 + blue + + + class + 10 + 50 + 520 + 20 + + left + center + font12 + blue + + + + + 570 + 65 + 25 + 510 + ScrollBarV.png + ScrollBarV_bar.png + ScrollBarV_bar_focus.png + ScrollBarNib.png + ScrollBarNib.png + 20 + 10 + 61 + 61 + false + vertical + + + number of files/pages in list text label + 280 + 585 + 300 + 35 + font12 + right + center + true + grey + + + + OK button + 20 + 585 + 200 + 40 + + font12_title + white + white + center + 20 + 20 + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPeripheralSettings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPeripheralSettings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPeripheralSettings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPeripheralSettings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 5 + 1 290 75 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPictureInfo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPictureInfo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPictureInfo.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPictureInfo.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 5 + 1 240 45 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogProgress.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogProgress.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogProgress.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogProgress.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,11 +2,11 @@ 10 + 1 335 230 dialogeffect - DepthDialog+ diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRChannelManager.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRChannelManager.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRChannelManager.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRChannelManager.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,9 @@ 20 + no + 1 80 65 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRChannelsOSD.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRChannelsOSD.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRChannelsOSD.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRChannelsOSD.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 11 + 1 780 30 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRGroupManager.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRGroupManager.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRGroupManager.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRGroupManager.xml 2015-10-19 08:39:14.000000000 +0000 @@ -3,14 +3,13 @@ 29 - DepthSideBlade !Window.IsVisible(FileBrowser) WindowOpen WindowClose 50 0 - 1250 + 1230 720 MediaBladeSub.png @@ -480,10 +479,7 @@ - - DepthSideBlade - Clock - + Clock Fake Label used to pass on name label false diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRGuideInfo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRGuideInfo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRGuideInfo.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRGuideInfo.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,285 @@ + + + 7 + no + + + WindowOpen + WindowClose + + 180 + 0 + 1100 + 720 + MediaBladeSub.png + + + Close Window button + 230 + 0 + 64 + 32 + + - + PreviousMenu + DialogCloseButton-focus.png + DialogCloseButton.png + 9000 + 9000 + 9000 + 9000 + system.getbool(input.enablemouse) + + + WindowOpen + WindowClose + + header label + 210 + 40 + 1030 + 30 + font24_title + + center + center + white + black + + + 90 + 210 + VisibleFadeEffect + + 0 + 0 + 380 + 360 + keep + button-nofocus.png + 4 + $INFO[ListItem.Icon] + + + 390 + 20 + 640 + 330 + 49 + 49 + 9000 + 61 + - + 200 + + + 5 + 0 + 160 + 30 + font13 + right + center + blue + selected + ListItem.Label + + + 175 + 0 + 465 + 30 + font13 + left + center + white + white + ListItem.Label2 + + + + + 0 + 0 + 640 + 30 + Control.HasFocus(49) + MenuItemFO.png + VisibleFadeEffect + + + 5 + 0 + 160 + 30 + font13 + right + center + blue + selected + ListItem.Label + + + 175 + 0 + 465 + 30 + font13 + left + center + white + white + ListItem.Label2 + true + + + + + + $INFO[ListItem.EpisodeName] + noop + !IsEmpty(ListItem.EpisodeName) + + + + $INFO[ListItem.Season] + noop + !IsEmpty(ListItem.Season) + + + + $INFO[ListItem.Episode] + noop + !IsEmpty(ListItem.Episode) + + + + $INFO[ListItem.ChannelName] + noop + + + + $INFO[ListItem.StartTime] - $INFO[ListItem.EndTime] ($INFO[ListItem.StartDate]) + noop + + + + $INFO[ListItem.Duration] + noop + + + + $INFO[ListItem.Genre] + noop + + + + $INFO[ListItem.Writer] + noop + !IsEmpty(ListItem.Writer) + + + + $INFO[ListItem.Director] + noop + !IsEmpty(ListItem.Director) + + + + $INFO[ListItem.Cast] + noop + !IsEmpty(ListItem.Cast) + + + + + 390 + 370 + 640 + 4 + stretch + separator.png + + + + 130 + 480 + 400 + 30 + font13_title + grey2 + black + true + right + center + + Control.IsVisible(400) + + + Next page button + 120r + 485 + page + - + 61 + 61 + 9000 + 49 + - + true + + + 210 + 527 + 1030 + 120 + font13 + justify + white + 61 + + !Control.HasFocus(61) + Skin.HasSetting(AutoScroll) + + + 210 + 660 + 1030 + 40 + 2 + center + horizontal + 9000 + 9000 + 49 + 49 + + Find similar + ButtonInfoDialogsCommonValues + + + + Switch to Channel + ButtonInfoDialogsCommonValues + + + + Play recording + ButtonInfoDialogsCommonValues + + + + Record + ButtonInfoDialogsCommonValues + + + + OK + ButtonInfoDialogsCommonValues + + + + + + Clock + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRGuideOSD.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRGuideOSD.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRGuideOSD.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRGuideOSD.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 11 + 1 780 30 @@ -113,15 +114,7 @@ 20 20 PVR-HasTimer.png - ListItem.HasTimer + !ListItem.HasTimerSchedule + !ListItem.IsRecording - - - 120 - 5 - 20 - 20 - PVR-HasTimerSchedule.png - ListItem.HasTimerSchedule + !ListItem.IsRecording + ListItem.HasTimer + !ListItem.IsRecording 60 @@ -203,15 +196,7 @@ 20 20 PVR-HasTimer.png - ListItem.HasTimer + !ListItem.HasTimerSchedule + !ListItem.IsRecording - - - 120 - 5 - 20 - 20 - PVR-HasTimerSchedule.png - ListItem.HasTimerSchedule + !ListItem.IsRecording + ListItem.HasTimer + !ListItem.IsRecording 60 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRGuideSearch.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRGuideSearch.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRGuideSearch.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRGuideSearch.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 9 + 1 210 65 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRInfo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRInfo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRInfo.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRInfo.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,231 +0,0 @@ - - - 7 - - 225 - 30 - - dialogeffect - - - - - - - - - - - - 40 - 80 - 640 - 330 - 49 - 49 - 9000 - 61 - - - 200 - - - 5 - 0 - 160 - 30 - font13 - left - center - blue - selected - ListItem.Label - - - 175 - 0 - 465 - 30 - font13 - left - center - white - white - ListItem.Label2 - - - - - 0 - 0 - 640 - 30 - Control.HasFocus(49) - MenuItemFO.png - VisibleFadeEffect - - - 5 - 0 - 160 - 30 - font13 - left - center - blue - selected - ListItem.Label - - - 175 - 0 - 465 - 30 - font13 - left - center - white - white - ListItem.Label2 - true - - - - - - $INFO[ListItem.EpisodeName] - noop - !IsEmpty(ListItem.EpisodeName) - - - - $INFO[ListItem.Season] - noop - !IsEmpty(ListItem.Season) - - - - $INFO[ListItem.Episode] - noop - !IsEmpty(ListItem.Episode) - - - - $INFO[ListItem.ChannelName] - noop - - - - $INFO[ListItem.StartTime] - $INFO[ListItem.EndTime] ($INFO[ListItem.StartDate]) - noop - - - - $INFO[ListItem.Duration] - noop - - - - $INFO[ListItem.Genre] - noop - - - - $INFO[ListItem.Writer] - noop - !IsEmpty(ListItem.Writer) - - - - $INFO[ListItem.Director] - noop - !IsEmpty(ListItem.Director) - - - - $INFO[ListItem.Cast] - noop - !IsEmpty(ListItem.Cast) - - - - - 310 - 370 - 400 - 30 - font12 - grey - black - true - right - center - - - - Next page button - 720 - 375 - page - - - 60 - 60 - 9000 - 9000 - - - true - - - PLOT - 40 - 402 - 750 - 178 - font13 - justify - 60 - - - - 40 - 590 - 740 - 40 - 5 - center - horizontal - 9000 - 9000 - 60 - 60 - - Find similar - ButtonInfoDialogsCommonValues - - Window.IsActive(PVRGuideInfo) - - - Switch to Channel - ButtonInfoDialogsCommonValues - - Window.IsActive(PVRGuideInfo) - - - Play recording - ButtonInfoDialogsCommonValues - - Window.IsActive(PVRGuideInfo) - - - Record - ButtonInfoDialogsCommonValues - - Window.IsActive(PVRGuideInfo) - - - OK - ButtonInfoDialogsCommonValues - - - - - diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRRadioRDSInfo.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,949 +0,0 @@ - - - 10 - - 200 - 20 - - dialogeffect - - - background image - 0 - 0 - 880 - 680 - DialogBack2.png - Window.IsVisible(FullscreenVideo) | Window.IsVisible(Visualisation) - - - background image - 0 - 0 - 880 - 680 - DialogBack.png - ![Window.IsVisible(FullscreenVideo) | Window.IsVisible(Visualisation)] - - - Dialog Header image - 40 - 16 - 880 - 40 - dialogheader.png - - - header label - 40 - 20 - 800 - 30 - font13_title - - center - center - selected - black - - - Close Window button - 800 - 15 - 64 - 32 - - - - PreviousMenu - DialogCloseButton-focus.png - DialogCloseButton.png - 10 - 10 - 10 - 10 - system.getbool(input.enablemouse) - - - Normal song info group - 0 - 70 - IsEmpty(RDS.IsClassical) - - Artist Title - 10 - 0 - 140 - 25 - right - center - font13 - blue - - IsEmpty(RDS.Band) - - - Artist Value - 160 - 0 - 704 - 25 - left - center - font13 - white - - false - 2000 - IsEmpty(RDS.Band) - - - Band Title - 10 - 0 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.Band) - - - Band Value - 160 - 0 - 292 - 25 - left - center - font13 - white - - false - 2000 - !IsEmpty(RDS.Band) - - - Artist Name (alt pos) - 385 - 0 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.Artist)+!IsEmpty(RDS.Band) - - - Artist Value (alt pos) - 535 - 0 - 328 - 25 - left - center - font13 - white - - !IsEmpty(RDS.Artist)+!IsEmpty(RDS.Band) - - - Song Title - 10 - 35 - 140 - 25 - right - center - font13 - blue - - - - Song Value - 160 - 35 - 704 - 25 - left - center - font13 - white - - false - 2000 - - - Programme style Name - 10 - 70 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.ProgStyle) - - - Programme style Value - 160 - 70 - 704 - 25 - left - center - font13 - white - - !IsEmpty(RDS.ProgStyle) - - - - Classic concert music group - 0 - 70 - !IsEmpty(RDS.IsClassical) - - Composer Title - 10 - 0 - 140 - 25 - right - center - font13 - blue - - - - Composer Value - 160 - 0 - 704 - 25 - left - center - font13 - white - - false - 2000 - - - Song Title - 10 - 35 - 140 - 25 - right - center - font13 - blue - - - - Song Value - 160 - 35 - 704 - 25 - left - center - font13 - white - - false - 2000 - - - Artist Title - 10 - 70 - 140 - 25 - right - center - font13 - blue - - IsEmpty(RDS.Band)+!IsEmpty(RDS.Artist) - - - Artist Value - 160 - 66 - 704 - 29 - font13 - white - left - - - - true - IsEmpty(RDS.Band)+!IsEmpty(RDS.Artist) - - - Band Title - 10 - 70 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.Band) - - - Band Value - 160 - 70 - 292 - 25 - left - center - font13 - white - - false - 2000 - !IsEmpty(RDS.Band) - - - Artist Name (alt pos) - 385 - 70 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.Artist)+!IsEmpty(RDS.Band) - - - Artist Value (alt pos) - 535 - 70 - 328 - 100 - font13 - white - left - - - - true - !IsEmpty(RDS.Artist)+!IsEmpty(RDS.Band) - - - Conductor Title - 10 - 105 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.Conductor) - - - Conductor Value - 160 - 105 - 300 - 25 - left - center - font13 - white - - false - 2000 - !IsEmpty(RDS.Conductor) - - - Programme style Name - 10 - 105 - 140 - 25 - right - center - font13 - blue - - IsEmpty(RDS.Conductor)+!IsEmpty(RDS.ProgStyle) - - - Programme style Value - 160 - 105 - 704 - 25 - left - center - font13 - white - - IsEmpty(RDS.Conductor)+!IsEmpty(RDS.ProgStyle) - - - Programme style Name - 385 - 105 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.Conductor)+!IsEmpty(RDS.ProgStyle) - - - Programme style Value - 535 - 105 - 328 - 25 - left - center - font13 - white - - !IsEmpty(RDS.Conductor)+!IsEmpty(RDS.ProgStyle) - - - - Album Title - 385 - 175 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.Album) - - - Album Value - 535 - 175 - 328 - 25 - left - center - font13 - white - - false - 2000 - !IsEmpty(RDS.Album) - - - Programme host Name - 10 - 210 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.ProgHost) - - - Programme host Value - 160 - 210 - 235 - 25 - left - center - font13 - white - - !IsEmpty(RDS.ProgHost) - - - Comment Title - 385 - 210 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.Comment) - - - Comment Value - 535 - 210 - 328 - 25 - left - center - font13 - white - - false - 2000 - !IsEmpty(RDS.Comment) - - - Channel Name - 10 - 245 - 140 - 25 - right - center - font13 - blue - - - - Channel Value - 160 - 245 - 235 - 25 - left - center - font13 - white - - - - Editorial Staff Name - 385 - 245 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.ProgEditStaff) - - - Editorial Staff Value - 535 - 245 - 328 - 25 - left - center - font13 - white - - !IsEmpty(RDS.ProgEditStaff) - - - - 10 - 280 - 160 - 300 - 8 - - Program basename - 10 - 280 - 140 - 25 - right - center - font13caps - blue - - !IsEmpty(RDS.ProgNow) | !IsEmpty(RDS.ProgNext) - - - blind label - 10 - 280 - 140 - 25 - - !IsEmpty(RDS.ProgNow) + !IsEmpty(RDS.ProgNext) - - - Studio basename - 140 - 25 - right - center - font13caps - blue - - !IsEmpty(RDS.PhoneStudio) | !IsEmpty(RDS.EmailStudio) | !IsEmpty(RDS.SMSStudio) - - - - 160 - 280 - 160 - 300 - 8 - - Program now Name - 160 - 25 - left - center - font13 - white - - !IsEmpty(RDS.ProgNow) - - - Program next Name - 160 - 25 - left - center - font13 - white - - !IsEmpty(RDS.ProgNext) - - - Studio phone Name - 95 - 25 - left - center - font13 - white - - !IsEmpty(RDS.PhoneStudio) - - - Studio email Name - 95 - 25 - left - center - font13 - white - - !IsEmpty(RDS.EmailStudio) - - - Studio SMS Name - 95 - 25 - left - center - font13 - white - - !IsEmpty(RDS.SMSStudio) - - - - 230 - 280 - 620 - 300 - 8 - - Program now Value - 620 - 25 - left - center - font13 - grey - - !IsEmpty(RDS.ProgNow) - - - Program next Value - 620 - 25 - left - center - font13 - grey - - !IsEmpty(RDS.ProgNext) - - - Studio phone Value - 215 - 25 - left - center - font13 - grey - - !IsEmpty(RDS.PhoneStudio) - - - Studio email Value - 215 - 25 - left - center - font13 - grey - - !IsEmpty(RDS.EmailStudio) - - - Studio SMS Value - 215 - 25 - left - center - font13 - grey - - !IsEmpty(RDS.SMSStudio) - - - - 385 - 280 - 520 - 300 - 8 - - blind label - 5 - 25 - - !IsEmpty(RDS.ProgNow) - - - blind label - 5 - 25 - - !IsEmpty(RDS.ProgNext) - - - Hotline basename - 140 - 25 - right - center - font13caps - blue - - !IsEmpty(RDS.PhoneHotline) | !IsEmpty(RDS.EmailHotline) - - - blind label - 140 - 25 - - !IsEmpty(RDS.PhoneHotline) + !IsEmpty(RDS.EmailHotline) - - - Homepage Name - 385 - 420 - 140 - 25 - right - center - font13 - blue - - !IsEmpty(RDS.ProgHomepage) - - - - 535 - 280 - 520 - 300 - 8 - - blind label - 5 - 25 - - !IsEmpty(RDS.ProgNow) - - - blind label - 5 - 25 - - !IsEmpty(RDS.ProgNext) - - - Hotline phone Name - 160 - 25 - left - center - font13 - white - - !IsEmpty(RDS.PhoneHotline) - - - Hotline email Name - 160 - 25 - left - center - font13 - white - - !IsEmpty(RDS.EmailHotline) - - - Homepage Value - 320 - 25 - left - center - font13 - white - - !IsEmpty(RDS.ProgHomepage) - - - - 605 - 280 - 520 - 300 - 8 - - blind label - 5 - 25 - - !IsEmpty(RDS.ProgNow) - - - blind label - 140 - 25 - - !IsEmpty(RDS.ProgNext) - - - Hotline phone Value - 248 - 25 - left - center - font13 - grey - - !IsEmpty(RDS.PhoneHotline) - - - Hotline email Value - 248 - 25 - left - center - font13 - grey - - !IsEmpty(RDS.EmailHotline) - - - - - Radio text info list - 40 - 455 - false - VisibleFadeEffect - - Info label - 375 - 0 - 110 - 25 - right - center - font13caps - blue - - - - Source Type - 740 - 5 - font13 - white - center - - 10 - 21 - 21 - 9000 - 9000 - - - Next page button - 0 - 155 - page - - - 9000 - 9000 - 21 - 21 - - - true - - - PLOT - 0 - 30 - 800 - 120 - font11 - justify - 60 - - - - - 40 - 620 - 790 - 40 - 5 - center - horizontal - 60 - 60 - 21 - 21 - - OK - ButtonInfoDialogsCommonValues - - - - - diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRRecordingInfo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRRecordingInfo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRRecordingInfo.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRRecordingInfo.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,221 @@ + + + 10 + + 1 + 275 + 30 + + dialogeffect + + + + + + + + + + + + Title label + 40 + 70 + 650 + 30 + font13_title + + center + center + blue + black + + + 40 + 140 + + Start Date + 10 + 0 + 160 + 25 + right + center + font13 + blue + + + + Start date value + 180 + 0 + 470 + 25 + left + center + font13 + white + + + + Start time + 10 + 35 + 160 + 25 + right + center + font13 + blue + + + + Start Time value + 180 + 35 + 470 + 25 + left + center + font13 + white + + + + Channel Name + 10 + 70 + 160 + 25 + right + center + font13 + blue + + + + Channel Value + 180 + 70 + 470 + 25 + left + center + font13 + white + + + + Duration + 10 + 105 + 160 + 25 + right + center + font13 + blue + + + + Duration value + 180 + 105 + 470 + + left + font13 + true + + + Genre + 10 + 140 + 160 + 25 + right + center + font13 + blue + + + + Genre value + 180 + 140 + 470 + + left + font13 + true + + + Subtitle value + 40 + 185 + 650 + + center + font13 + blue + true + !IsEmpty(ListItem.PlotOutline) + + + + 210 + 370 + 400 + 30 + font12 + grey + black + true + right + center + + + + Next page button + 620 + 375 + page + - + 60 + 60 + 9000 + 9000 + - + true + + + PLOT + 40 + 402 + 650 + 178 + font13 + justify + 60 + + + + 40 + 590 + 640 + 40 + 5 + center + horizontal + 9000 + 9000 + 60 + 60 + + OK + ButtonInfoDialogsCommonValues + + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRTimerSettings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRTimerSettings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogPVRTimerSettings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogPVRTimerSettings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,14 +2,15 @@ 29 + 1 275 - 30 + 50 dialogeffect - + @@ -30,7 +31,7 @@ 160 - 590 + 550 OK Button 0 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogSeekBar.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogSeekBar.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogSeekBar.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogSeekBar.xml 2015-10-19 08:39:14.000000000 +0000 @@ -4,7 +4,6 @@ Player.Seeking | Player.DisplayAfterSeek | Player.Paused | Player.Forwarding | Player.Rewinding WindowOpen WindowClose - DepthOSD player.chaptercount + Window.IsVisible(FullScreenVideo) diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogSelect.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogSelect.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogSelect.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogSelect.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,81 +1,110 @@ + 1 3 - 235 - 75 + 1 + 215 + 35 dialogeffect - DepthDialog+ - Conditional - Conditional - Conditional - - background image - 0 - 0 - 850 - 550 - $VAR[SelectBack] - [Control.IsVisible(3) + IntegerGreaterThan(Container(3).NumItems,8)] | [Control.IsVisible(6) + IntegerGreaterThan(Container(6).NumItems,4)] - - - background image - 0 - 0 - 850 - 458 - $VAR[SelectBack] - [Control.IsVisible(3) + IntegerGreaterThan(Container(3).NumItems,6) + !IntegerGreaterThan(Container(3).NumItems,8)] | [Control.IsVisible(6) + IntegerGreaterThan(Container(6).NumItems,3) + !IntegerGreaterThan(Container(6).NumItems,4)] - - - background image - 0 - 0 - 850 - 366 - $VAR[SelectBack] - [Control.IsVisible(3) + IntegerGreaterThan(Container(3).NumItems,4) + !IntegerGreaterThan(Container(3).NumItems,6)] | [Control.IsVisible(6) + IntegerGreaterThan(Container(6).NumItems,2) + !IntegerGreaterThan(Container(6).NumItems,3)] - - - background image - 0 - 0 - 850 - 274 - $VAR[SelectBack] - [Control.IsVisible(3) + !IntegerGreaterThan(Container(3).NumItems,4)] | [Control.IsVisible(6) + !IntegerGreaterThan(Container(6).NumItems,2)] - - - Dialog Header image - 40 - 16 - 770 - 40 - dialogheader.png - - - header label - 40 - 20 - 770 - 30 - font13_title - - center - center - selected - black + Conditional + Conditional + Conditional + + Control.IsVisible(5) + + background image + 0 + 0 + 850 + 630 + $VAR[SelectBack] + + + Dialog Header image + 40 + 16 + 770 + 40 + dialogheader.png + + + header label + 40 + 20 + 770 + 30 + font13_title + + center + center + selected + black + - - No Settings Label - 20 - 120 - 550 - center - font13 + + 120 + !Control.IsVisible(5) + + background image + 0 + 0 + 610 + 630 + $VAR[SelectBack] + [Control.IsVisible(3) + IntegerGreaterThan(Container(3).NumItems,8)] | Control.IsVisible(6) + + + background image + 0 + 0 + 610 + 550 + $VAR[SelectBack] + Control.IsVisible(3) + IntegerGreaterThan(Container(3).NumItems,6) + !IntegerGreaterThan(Container(3).NumItems,8) + + + background image + 0 + 0 + 610 + 370 + $VAR[SelectBack] + Control.IsVisible(3) + IntegerGreaterThan(Container(3).NumItems,4) + !IntegerGreaterThan(Container(3).NumItems,6) + + + background image + 0 + 0 + 610 + 280 + $VAR[SelectBack] + Control.IsVisible(3) + !IntegerGreaterThan(Container(3).NumItems,4) + + + Dialog Header image + 40 + 16 + 530 + 40 + dialogheader.png + + + header label + 40 + 20 + 530 + 30 + font13_title + + center + center + selected + black + Close Window button @@ -88,19 +117,26 @@ PreviousMenu DialogCloseButton-focus.png DialogCloseButton.png + 10 + 10 + 10 + 10 + Conditional system.getbool(input.enablemouse) 20 67 550 - 460 + 506 3 3 - 99 + 5 61 61 200 + Conditional + Conditional 0 @@ -157,28 +193,30 @@ 20 - 67 + 65 550 - 460 + 510 6 6 - 99 + 5 61 61 200 - + Conditional + Conditional + 0 0 550 - 86 + 80 button-nofocus.png 2 - 3 + 2 80 - 80 + 76 $INFO[Listitem.Icon] keep black-back2.png @@ -186,7 +224,7 @@ 90 - 2 + 0 450 30 font13 @@ -198,7 +236,7 @@ 90 - 34 + 32 450 48 font12 @@ -208,12 +246,12 @@ - + 0 0 550 - 86 + 80 button-nofocus.png !Control.HasFocus(6) VisibleFadeEffect @@ -222,16 +260,16 @@ 0 0 550 - 86 + 80 button-focus2.png Control.HasFocus(6) VisibleFadeEffect 2 - 3 + 2 80 - 80 + 76 $INFO[Listitem.Icon] keep black-back2.png @@ -239,7 +277,7 @@ 90 - 2 + 0 450 30 font13 @@ -251,7 +289,7 @@ 90 - 34 + 32 450 48 font12 @@ -266,61 +304,83 @@ 570 65 25 - 464 + 510 ScrollBarV.png ScrollBarV_bar.png ScrollBarV_bar_focus.png ScrollBarNib.png ScrollBarNib.png 3 - 90 + 5 61 61 false vertical + Conditional + + + number of files/pages in list text label + 275 + 572 + 550 + 35 + font12 + right + center + true + grey + + Conditional + IntegerGreaterThan(Container(3).NumItems,8) + + + number of files/pages in list text label + 275 + 572 + 550 + 35 + font12 + right + center + true + grey + + true + Conditional + IntegerGreaterThan(Container(6).NumItems,8) + + + Manual button + 615 + 107 + 200 + 40 + + font12_title + white + white + center + 3 + 3 - - number of files/pages in list text label - 592 - 490 - 240 - 35 - font12 - center - center - grey - - Conditional - Conditional - Conditional - - - 612 - 100 - 3 - 3 - - Manual button - 200 - 40 - - font12_title - white - white - center - - - Cancel button - 200 - 40 - - font12_title - white - white - center - Dialog.Close(selectdialog) - + 610 + 320 + Control.IsVisible(6) + Control.IsVisible(5) + + 0 + 0 + 210 + 210 + button-nofocus.png + + + 5 + 5 + 200 + 200 + keep + $INFO[Container(6).ListItem.Icon] diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogSlider.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogSlider.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogSlider.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogSlider.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,10 +1,10 @@ - DepthDialog+ 11 WindowOpen WindowClose + 1 405 0 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogSongInfo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogSongInfo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogSongInfo.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogSongInfo.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,8 @@ - 12 + 10 + 1 185 105 @@ -201,6 +202,34 @@ keep LeftRating/$INFO[ListItem.StarRating] + + Decrease Rating + 160 + 5 + 33 + 22 + DecreaseRating + scroll-down-2.png + scroll-down-focus-2.png + 15 + 15 + 9000 + 9000 + + + Increase Rating + 193 + 5 + 33 + 22 + IncreaseRating + scroll-up-2.png + scroll-up-focus-2.png + 14 + 14 + 9000 + 9000 + Comment Title @@ -226,43 +255,63 @@ - 140 + 40 445 - - Album Info button + + Ok button 0 0 200 40 - + font12_title center - 7 - 13 + 13 + 11 + 14 + 14 - - Get Thumb button + + Cancel button 210 0 200 40 - + font12_title center - 12 - 7 + 10 + 12 + 14 + 14 - - Set my rating + + Album Info button 420 0 200 40 - + font12_title center - 13 - 12 + 11 + 13 + 14 + 14 + + + Get Thumb button + 630 + 0 + 200 + 40 + + font12_title + center + 12 + 10 + 14 + 14 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogSubtitles.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogSubtitles.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogSubtitles.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogSubtitles.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,12 +1,12 @@ + 1 380 0 - DepthDialog- WindowClose diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogTextViewer.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogTextViewer.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogTextViewer.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogTextViewer.xml 2015-10-19 08:39:14.000000000 +0000 @@ -3,13 +3,12 @@ 61 - DepthDialog- WindowOpen WindowClose 180 0 - 1120 + 1100 720 MediaBladeSub.png @@ -77,9 +76,6 @@ - - DepthDialog- - Clock - + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogVideoInfo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogVideoInfo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogVideoInfo.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogVideoInfo.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,16 +1,16 @@ 8 + no - DepthSideBlade !Window.IsVisible(FileBrowser) WindowOpen WindowClose 180 0 - 1120 + 1100 720 MediaBladeSub.png @@ -178,9 +178,9 @@ 290 - -4 + 20 740 - 390 + 330 49 49 9000 @@ -292,12 +292,6 @@ !IsEmpty(ListItem.Duration) - - $INFO[ListItem.Userrating] - noop - !IsEmpty(ListItem.Userrating) - - $INFO[ListItem.RatingAndVotes] noop @@ -331,7 +325,7 @@ 290 - 382 + 370 740 4 stretch @@ -460,12 +454,6 @@ !IsEmpty(ListItem.Year) - - $INFO[ListItem.Userrating] - noop - !IsEmpty(ListItem.Userrating) - - $INFO[ListItem.RatingAndVotes] noop @@ -515,9 +503,9 @@ 390 - 0 + 20 640 - 360 + 330 49 49 9000 @@ -641,12 +629,6 @@ !IsEmpty(ListItem.Duration) - - $INFO[ListItem.Userrating] - noop - !IsEmpty(ListItem.Userrating) - - $INFO[ListItem.RatingAndVotes] noop @@ -806,12 +788,6 @@ !IsEmpty(ListItem.Duration) - - $INFO[ListItem.Userrating] - noop - !IsEmpty(ListItem.Userrating) - - $INFO[ListItem.FilenameAndPath] noop @@ -1007,18 +983,9 @@ PlayMedia($INFO[ListItem.Trailer],1) !IsEmpty(ListItem.Trailer) + Skin.HasSetting(WindowedTrailer) - - Set my rating - ButtonInfoDialogsCommonValues - - Control.IsEnabled(7) - - - DepthSideBlade - Clock - + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogVolumeBar.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogVolumeBar.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogVolumeBar.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogVolumeBar.xml 2015-10-19 08:39:14.000000000 +0000 @@ -5,7 +5,6 @@ WindowClose - DepthOSD 820 0 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogYesNo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogYesNo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/DialogYesNo.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/DialogYesNo.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,11 +2,11 @@ 10 + 1 335 230 dialogeffect - DepthDialog+ diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/EventLog.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/EventLog.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/EventLog.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/EventLog.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,250 +0,0 @@ - - - 570 - 9000 - ActivateWindow(1112) - 570 - - CommonBackground - ContentPanelBackgrounds - - DepthFooter - CommonPageCount - CommonNowPlaying - - MainWindowMouseButtons - BehindDialogFadeOut - ScrollOffsetLabel - - Control.IsVisible(570) - Window_OpenClose_Animation - VisibleFadeEffect - - 75 - 60 - 1130 - 600 - ContentPanel.png - - - 75 - 652 - 1130 - 64 - ContentPanelMirror.png - - - 95 - 78 - 1080 - 561 - 9000 - 60 - 570 - 570 - list - 60 - 200 - - - 0 - 0 - 1080 - 80 - button-nofocus.png - - - 2 - 2 - 80 - 76 - $INFO[Listitem.Icon] - keep - black-back2.png - 2 - - - 90 - 0 - 870 - 30 - font13 - grey2 - selected - left - center - - - - 90 - 32 - 870 - 48 - font12 - grey - selected - left - - - - 90 - 0 - 970 - 30 - font12 - grey2 - selected - right - center - - - - - - 0 - 0 - 1080 - 80 - button-nofocus.png - !Control.HasFocus(570) - VisibleFadeEffect - - - 0 - 0 - 1080 - 80 - button-focus2.png - Control.HasFocus(570) - VisibleFadeEffect - - - 2 - 2 - 80 - 76 - $INFO[Listitem.Icon] - keep - black-back2.png - 2 - - - 90 - 0 - 870 - 30 - font13 - white - selected - left - center - - - - 90 - 32 - 870 - 48 - font12 - grey - selected - left - - - - 90 - 0 - 970 - 30 - font12 - grey2 - selected - right - center - - - - - - 1170 - 80 - 25 - 550 - ScrollBarV.png - ScrollBarV_bar.png - ScrollBarV_bar_focus.png - ScrollBarNib.png - ScrollBarNib.png - 570 - 2 - false - vertical - Control.IsVisible(570) - - - - - - - - -250 - SideBladeLeft - - 0 - 110 - 250 - 600 - 9000 - 570 - 9000 - 9000 - 570 - 0 - - 250 - 35 - font12 - - blue - center - center - - - Sort asc - ButtonCommonValues - button-focus.png - - - - 31050 - Container.SortDirection(Ascending) - - - 250 - 35 - font12 - - blue - center - center - - - Level button - 235 - ButtonCommonValues - - - - Only show current level - ButtonCommonValues - - - - Clear button - ButtonCommonValues - - - CommonNowPlaying_Controls - - - - diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/FileBrowser.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/FileBrowser.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/FileBrowser.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/FileBrowser.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,13 +1,14 @@ 450 + no + 1 0 0 - DepthDialog+ 360 WindowOpen WindowOpen @@ -140,10 +141,10 @@ !SubString(Control.GetLabel(416),*) - 690 - 405 - 211 - 211 + 250 + 465 + 410 + 200 keep $INFO[ListItem.Icon] SubString(Control.GetLabel(416),*) @@ -347,9 +348,6 @@ - - DepthDialog+ - Clock - + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/FileManager.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/FileManager.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/FileManager.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/FileManager.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,6 +1,7 @@ 20 + no CommonBackground @@ -12,6 +13,28 @@ WindowOpen WindowClose + + Section header image + 20 + 3 + 35 + 35 + keep + icon_system.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + 30 40 @@ -360,32 +383,29 @@ - - DepthFooter - - number of files/pages in left list text label - 40 - 53r - 570 - font12 - left - true - grey - black - - - - number of files/pages in left list text label - 40 - 53r - 570 - font12 - right - true - grey - black - - + + number of files/pages in left list text label + 40 + 53r + 570 + font12 + left + true + grey + black + + + + number of files/pages in left list text label + 40 + 53r + 570 + font12 + right + true + grey + black + 595 @@ -444,9 +464,6 @@ icon_home.png - - - - + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/Home.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/Home.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/Home.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/Home.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,30 +1,37 @@ 9000 + no SetProperty(VideosDirectLink,True) - SetProperty(MusicDirectLink,True) ClearProperty(VideosDirectLink) - ClearProperty(MusicDirectLink) CommonBackground - DepthFloor - -20 - - 0 - 1320 + 0 + 90r + 1280 90 floor.png - Conditional - WindowOpen - WindowClose + WindowOpen + WindowClose + + + LOGO + 10 + 5 + 120 + 49 + keep + kodi-logo.png + VisibleFadeEffect + Window_OpenClose_Animation + !Skin.HasSetting(homepageWeatherinfo) - DepthMenu 0 60 - Player.HasAudio + !Skin.HasSetting(homepageMusicinfo) + IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia)) + Player.HasAudio + !Skin.HasSetting(homepageMusicinfo) VisibleFadeEffect Window_OpenClose_Animation @@ -80,7 +87,6 @@ - DepthMenu 490r 70 Container(9000).HasFocus(12) + [PVR.IsRecording | PVR.HasNonRecordingTimer] @@ -225,10 +231,9 @@ - DepthMenu 0 50 - Player.HasVideo + !Skin.HasSetting(homepageVideoinfo) + IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia)) + Player.HasVideo + !Skin.HasSetting(homepageVideoinfo) VisibleFadeEffect Window_OpenClose_Animation @@ -449,7 +454,6 @@ false - DepthMenu- Controls for currently playing media 545r 370 @@ -462,7 +466,6 @@ - IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia)) Background End image 0 @@ -665,29 +668,13 @@ OSDPlayFO.png OSDPlayNF.png 603 - 605 + 606 9003 9000 PlayerControl(Play) Player.PauseEnabled Conditional - - 130 - 2 - 30 - 30 - - OSDRadioRDSFO.png - OSDRadioRDSNF.png - 604 - 606 - 9003 - 9000 - ActivateWindow(PVRRadioRDSInfo) - RDS.HasRadiotextPlus - Conditional - 160 2 @@ -696,7 +683,7 @@ OSDRecordOffFO.png OSDRecordOffNF.png - 605 + 604 607 9003 9000 @@ -735,7 +722,6 @@ - DepthMenu 400 @@ -746,7 +732,6 @@ - DepthMenu- 0 70 9000 @@ -973,8 +958,7 @@ - ActivateWindow(Music) - ActivateWindow(Music,root) + ActivateWindow(Music) - - !Skin.HasSetting(HomeMenuNoMusicButton) @@ -1003,22 +987,21 @@ - -10 + 0 6 - 138 + 128 63 SideFade.png 128r 6 - 138 + 128 63 SideFade.png - DepthMenu 9001 20 @@ -1071,7 +1054,6 @@ - DepthMenu- 0 33r system.getbool(lookandfeel.enablerssfeeds) @@ -1098,7 +1080,6 @@ - DepthFooter 20 55r Window_OpenClose_Animation @@ -1154,104 +1135,89 @@ - DepthHeader + 20 + 0 + Skin.HasSetting(homepageWeatherinfo) + !IsEmpty(Weather.Plugin) + Window_OpenClose_Animation - LOGO - 10 + Weather image + 0 + 0 + 60 + 60 + keep + $INFO[Weather.Conditions] + + + Location label + 65 5 - 120 - 49 - keep - kodi-logo.png - VisibleFadeEffect - Window_OpenClose_Animation - !Skin.HasSetting(homepageWeatherinfo) + 500 + 15 + left + center + font10 + white + black + - - 20 - 0 - Skin.HasSetting(homepageWeatherinfo) + !IsEmpty(Weather.Plugin) - Window_OpenClose_Animation - - Weather image - 0 - 0 - 60 - 60 - keep - $INFO[Weather.Conditions] - + + 65 + 20 + 1000 + 30 + horizontal + left + 0 - Location label - 65 - 5 - 500 - 15 + Temp label + auto + 30 left center + font28_title + white + black + + + + Temp Units + auto + 22 font10 + center + white black - + !IsEmpty(Window(Weather).Property(Current.Temperature)) - - 65 - 20 - 1000 - 30 - horizontal - left - 0 - - Temp label - auto - 30 - left - center - font28_title - white - black - - - - Temp Units - auto - 22 - font10 - center - - white - black - !IsEmpty(Window(Weather).Property(Current.Temperature)) - - - Conditions Label - 500 - 22 - font10 - center - - grey2 - black - + + Conditions Label + 500 + 22 + font10 + center + + grey2 + black - Clock - - Date label - 20 - 35 - 300 - 15 - right - center - font10 - white - black - - Window_OpenClose_Animation - conditional - + + Clock + + Date label + 20 + 35 + 200 + 15 + right + center + font10 + white + black + + Window_OpenClose_Animation + conditional diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/IncludesBackgroundBuilding.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/IncludesBackgroundBuilding.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/IncludesBackgroundBuilding.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/IncludesBackgroundBuilding.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,26 +2,32 @@ - DepthBackground Normal Default Background Image - BackgroundDimensions + 0 + 0 + 1280 + 720 scale $INFO[Skin.CurrentTheme,special://skin/backgrounds/,.jpg] ![Skin.HasSetting(UseCustomBackground) + !IsEmpty(Skin.String(CustomBackgroundPath))] VisibleFadeEffect - DepthBackground User Set Background Image - BackgroundDimensions + 0 + 0 + 1280 + 720 scale $INFO[Skin.String(CustomBackgroundPath)] Skin.HasSetting(UseCustomBackground) + !IsEmpty(Skin.String(CustomBackgroundPath)) VisibleFadeEffect - DepthBackground - BackgroundDimensions + 0 + 0 + 1280 + 720 scale $INFO[ListItem.Art(fanart)] backgroundfade @@ -31,7 +37,10 @@ ![Player.HasVideo + !Skin.HasSetting(ShowBackgroundVideo)] - BackgroundDimensions + 0 + 0 + 1280 + 720 special://skin/backgrounds/media-overlay.jpg [Player.HasVideo + !Skin.HasSetting(ShowBackgroundVideo)] + !Window.IsVisible(TVChannels) + !Window.IsVisible(RadioChannels) VisibleFadeEffect @@ -42,10 +51,8 @@ 1280 720 Player.HasAudio + !Skin.HasSetting(ShowBackgroundVis) - IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia)) - DepthBackground 0 0 1280 @@ -53,26 +60,22 @@ Player.HasVideo + !Skin.HasSetting(ShowBackgroundVideo) + !Window.IsVisible(TVChannels) + !Window.IsVisible(RadioChannels) - DepthBackground - -20 + 0 -40 - 1320 + 1280 120 HomeNowPlayingBack.png - [Player.HasVideo + !Skin.HasSetting(ShowBackgroundVideo)] | [Player.HasAudio + ![Skin.HasSetting(ShowBackgroundVis) | !IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia))]] | [!Skin.HasSetting(HideBackGroundFanart) + !IsEmpty(ListItem.Property(Fanart_Image))] + [Player.HasVideo + !Skin.HasSetting(ShowBackgroundVideo)] | [Player.HasAudio + !Skin.HasSetting(ShowBackgroundVis)] | [!Skin.HasSetting(HideBackGroundFanart) + !IsEmpty(ListItem.Property(Fanart_Image))] VisibleFadeEffect - DepthFloor - -20 - - 0 - 1320 + 0 + 100r + 1280 100 floor.png - Conditional WindowOpen WindowClose diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/IncludesHomeMenuItems.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/IncludesHomeMenuItems.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/IncludesHomeMenuItems.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/IncludesHomeMenuItems.xml 2015-10-19 08:39:14.000000000 +0000 @@ -135,36 +135,43 @@ ButtonHomeSubCommonValues - ActivateWindow(Music,Artists,return) + ActivateWindow(MusicLibrary,Artists,return) Library.HasContent(Music) ButtonHomeSubCommonValues - ActivateWindow(Music,Albums,return) + ActivateWindow(MusicLibrary,Albums,return) Library.HasContent(Music) ButtonHomeSubCommonValues - ActivateWindow(Music,Songs,return) + ActivateWindow(MusicLibrary,Songs,return) Library.HasContent(Music) ButtonHomeSubCommonValues - ActivateWindow(Music,Files,return) + ActivateWindow(MusicFiles) ButtonHomeSubCommonValues - ActivateWindow(Music,Root) + ActivateWindow(MusicLibrary,root) Library.HasContent(Music) ButtonHomeSubCommonValues - ActivateWindow(Music,Addons,return) + ActivateWindow(MusicLibrary,Addons,return) + Library.HasContent(Music) + + + ButtonHomeSubCommonValues + + ActivateWindow(MusicFiles,Addons,return) + !Library.HasContent(Music) 35 @@ -198,13 +205,7 @@ ActivateWindow(SystemInfo) - - ButtonHomeSubCommonValues - - ActivateWindow(EventLog,events://,return) - system.getbool(eventlog.enabled) - - + 35 35 HomeSubEnd.png @@ -222,7 +223,7 @@ SetFocus(9000) EjectTray() - + 35 35 HomeSubEnd.png diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/IncludesHomeRecentlyAdded.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/IncludesHomeRecentlyAdded.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/IncludesHomeRecentlyAdded.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/IncludesHomeRecentlyAdded.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,7 +2,6 @@ - DepthMenu 20 608 603 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/IncludesPVR.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/IncludesPVR.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/IncludesPVR.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/IncludesPVR.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,78 +1,74 @@ - - DepthHeader - - Section header image - 20 - 3 - 35 - 35 - keep - icon_video.png - - - 65 - 5 - 1000 - 30 - horizontal - left - 5 - - WindowTitleCommons - - IsEmpty(Window.Property(IsRadio)) - - - WindowTitleCommons - - !IsEmpty(Window.Property(IsRadio)) - - - WindowTitleCommons - - Window.IsActive(TVChannels) | Window.IsActive(RadioChannels) - - - WindowTitleCommons - - Window.IsActive(TVGuide) | Window.IsActive(RadioGuide) - - - WindowTitleCommons - - Window.IsActive(TVRecordings) | Window.IsActive(RadioRecordings) - - - WindowTitleCommons - - Window.IsActive(TVTimers) | Window.IsActive(RadioTimers) - - - WindowTitleCommons - - Window.IsActive(TVSearch) | Window.IsActive(RadioSearch) - - - WindowTitleCommons - - - - WindowTitleCommons - - - - - Empty so we can pass the values up one level - False - - - Empty so we can pass the values up one level - False + + Section header image + 20 + 3 + 35 + 35 + keep + icon_video.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + IsEmpty(Window.Property(IsRadio)) + + + WindowTitleCommons + + !IsEmpty(Window.Property(IsRadio)) + + + WindowTitleCommons + + Window.IsActive(TVChannels) | Window.IsActive(RadioChannels) + + + WindowTitleCommons + + Window.IsActive(TVGuide) | Window.IsActive(RadioGuide) + + + WindowTitleCommons + + Window.IsActive(TVRecordings) | Window.IsActive(RadioRecordings) - Clock + + WindowTitleCommons + + Window.IsActive(TVTimers) | Window.IsActive(RadioTimers) + + + WindowTitleCommons + + Window.IsActive(TVSearch) | Window.IsActive(RadioSearch) + + + WindowTitleCommons + + + + WindowTitleCommons + + + + + Empty so we can pass the values up one level + False + + + Empty so we can pass the values up one level + False @@ -193,7 +189,7 @@ blue center center - Control.IsVisible(5) | Control.IsVisible(6) | Control.IsVisible(7) | Control.IsVisible(8) + Control.IsVisible(5) | Control.IsVisible(6) | Control.IsVisible(7) Group recording items by folder structure @@ -216,13 +212,6 @@ Window.IsActive(TVRecordings) | Window.IsActive(RadioRecordings) - - Group timers - 235 - ButtonCommonValues - - Window.IsActive(TVTimers) | Window.IsActive(RadioTimers) - CommonNowPlaying_Controls diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/includes.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/includes.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/includes.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/includes.xml 2015-10-19 08:39:14.000000000 +0000 @@ -14,30 +14,8 @@ - 500 400 - 0.50 - 0.52 - 0.48 - 0.54 - 0.40 - 0.44 - 0.36 - 0.48 - 0 - 0.08 - -0.08 - 0.15 - 0.08 - 0.14 - 0.00 - 0.08 - 0.08 - -0.80 - -0.20 - 0.15 - flagging/video/Set.png $INFO[ListItem.VideoResolution,flagging/lists/,.png] @@ -51,10 +29,6 @@ $INFO[ListItem.Art(poster)] $INFO[ListItem.Icon] - - $INFO[ListItem.Label] - $INFO[ListItem.TrackNumber,([COLOR=selected][B],[/B][/COLOR]) - ]$INFO[ListItem.Label] - ActivateWindow(videoplaylist) ActivateWindow(musicplaylist) @@ -64,7 +38,7 @@ DialogBack2.png - bluray + bluray hddvd dvd TV @@ -76,7 +50,6 @@ mpaa_pg mpaa_restricted mpaa_nc17 - mpaa_notrated divx @@ -92,14 +65,10 @@ $LOCALIZE[31044] $LOCALIZE[31045] - - ([COLOR=blue]$INFO[Container(3).NumItems][/COLOR]) $LOCALIZE[31025] - $LOCALIZE[31024] ([COLOR=blue]$INFO[Container(3).CurrentPage]/$INFO[Container(3).NumPages][/COLOR]) - ([COLOR=blue]$INFO[Container(6).NumItems][/COLOR]) $LOCALIZE[31025] - $LOCALIZE[31024] ([COLOR=blue]$INFO[Container(6).CurrentPage]/$INFO[Container(6).NumPages][/COLOR]) - - OSDRepeatOneFO.png - OSDRepeatAllFO.png - OSDRepeatFO.png + OSDRepeatOneFO.png + OSDRepeatAllFO.png + OSDRepeatFO.png OSDRepeatOneNF.png OSDRepeatAllNF.png OSDRepeatNF.png @@ -108,94 +77,6 @@ $LOCALIZE[19199] - $LOCALIZE[19024] $LOCALIZE[19199] - $LOCALIZE[19023] - - - - $PARAM[panel-left] - 520 - $PARAM[panel-width] - 120 - 9000 - 61 - 61 - 9000 - list - 61 - 200 - vertical - - - 0 - 0 - $PARAM[item-width] - 40 - button-nofocus.png - - - 10 - 0 - $PARAM[label-width] - 40 - font12 - left - center - selected - - - - 10 - 0 - $PARAM[label-width] - 40 - font12 - right - center - selected - - - - - - 0 - 0 - $PARAM[item-width] - 40 - !Control.HasFocus(50) - button-nofocus.png - - - 0 - 0 - $PARAM[item-width] - 40 - Control.HasFocus(50) - button-focus2.png - - - 10 - 0 - $PARAM[label-width] - 40 - font12 - left - center - selected - - - - 10 - 0 - $PARAM[label-width] - 40 - font12 - right - center - selected - - - - - background image @@ -253,7 +134,7 @@ black-back.png Visible Hidden - Window.IsActive(MovieInformation) | Window.IsActive(MusicInformation) | Window.IsActive(SongInformation) | Window.IsActive(FileBrowser) | Window.IsActive(TextViewer) | Window.IsActive(AddonSettings) | Window.IsActive(ContentSettings) | Window.IsActive(SelectDialog) | Window.IsActive(MediaSource) | Window.IsActive(PictureInfo) | Window.IsActive(PlayerControls) | Window.IsActive(VirtualKeyboard) | Window.IsActive(NumericInput) | Window.IsActive(ProfileSettings) | Window.IsActive(LockSettings) | Window.IsActive(SmartPlaylistEditor) | Window.IsActive(SmartPlaylistRule) | Window.IsActive(script-RSS_Editor-rssEditor.xml) | Window.IsActive(script-RSS_Editor-setEditor.xml) | Window.IsActive(AddonInformation) | Window.IsActive(PeripheralSettings) | Window.IsActive(script-cu-lrclyrics-main.xml) | Window.IsActive(MediaFilter) + Window.IsActive(MovieInformation) | Window.IsActive(MusicInformation) | Window.IsActive(SongInformation) | Window.IsActive(FileBrowser) | Window.IsActive(TextViewer) | Window.IsActive(AddonSettings) | Window.IsActive(ContentSettings) | Window.IsActive(SelectDialog) | Window.IsActive(FileStackingDialog) | Window.IsActive(MediaSource) | Window.IsActive(PictureInfo) | Window.IsActive(PlayerControls) | Window.IsActive(VirtualKeyboard) | Window.IsActive(NumericInput) | Window.IsActive(ProfileSettings) | Window.IsActive(LockSettings) | Window.IsActive(SmartPlaylistEditor) | Window.IsActive(SmartPlaylistRule) | Window.IsActive(script-RSS_Editor-rssEditor.xml) | Window.IsActive(script-RSS_Editor-setEditor.xml) | Window.IsActive(AddonInformation) | Window.IsActive(Peripherals) | Window.IsActive(PeripheralSettings) | Window.IsActive(script-cu-lrclyrics-main.xml) | Window.IsActive(MediaFilter) @@ -319,7 +200,7 @@ 40 170 - 5 + 20 center center font12_title @@ -328,8 +209,7 @@ false - DepthSideBlade - Conditional + Conditional WindowClose WindowClose WindowOpen @@ -355,9 +235,9 @@ HasSub.png - -20 + 0 0 - 280 + 260 720 MediaBladeSub.png @@ -432,7 +312,7 @@ - Player.HasMedia + IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia)) + Player.HasMedia VisibleFadeEffect WindowOpen WindowClose @@ -808,120 +688,134 @@ Fake Button to fix Player Controls Navigation false - + + 250 45 VideoPlayer.Content(LiveTV) VisibleFadeEffect - - 250 - 45 - 1 - horizontal - 50 + + 20 + 2 + 39 + 39 + + OSDChannelUPFO.png + OSDChannelUPNF.png + 50 + 601 + 610 + 611 + ChannelDown + + + 60 + 2 + 39 + 39 + + OSDChannelDownFO.png + OSDChannelDownNF.png + 600 + 603 + 610 + 611 + ChannelUp + + + 100 + 2 + 39 + 39 + + OSDStopFO.png + OSDStopNF.png + 601 + 604 + 610 + 611 + down + PlayerControl(Stop) + + + 140 + 2 + 39 + 39 + + OSDPauseFO.png + OSDPauseNF.png + Player.Paused | Player.Forwarding | Player.Rewinding + OSDPlayFO.png + OSDPlayNF.png + 603 + 605 + 610 + 606 50 + PlayerControl(Play) + Player.PauseEnabled + Conditional + + + 180 + 2 + 39 + 39 + + OSDRecordOffFO.png + OSDRecordOffNF.png + 604 + 50 610 611 - - 39 - 39 - - OSDChannelUPFO.png - OSDChannelUPNF.png - ChannelDown - - - 39 - 39 - - OSDChannelDownFO.png - OSDChannelDownNF.png - ChannelUp - - - 39 - 39 - - OSDStopFO.png - OSDStopNF.png - down - PlayerControl(Stop) - - - 39 - 39 - - OSDPauseFO.png - OSDPauseNF.png - Player.Paused | Player.Forwarding | Player.Rewinding - OSDPlayFO.png - OSDPlayNF.png - PlayerControl(Play) - Player.PauseEnabled - Conditional - - - 39 - 39 - - OSDRecordOffFO.png - OSDRecordOffNF.png - PlayerControl(record) - Player.CanRecord - Conditional - - - 39 - 39 - - RDS.HasRadiotextPlus - OSDRadioRDSFO.png - OSDRadioRDSNF.png - ActivateWindow(PVRRadioRDSInfo) - - - 39 - 39 - - !RDS.HasRadiotextPlus - OSDChannelListFO.png - OSDChannelListNF.png - ActivateWindow(PVRGuideInfo) - + PlayerControl(record) + Player.CanRecord + Conditional - + Player.HasMedia !VideoPlayer.Content(LiveTV) VisibleFadeEffect + 250 45 - - 250 - 45 - 1 - horizontal - 50 + 603 + + 5 + 2 + 39 + 39 + + OSDPrevTrackFO.png + OSDPrevTrackNF.png + 50 + 606 + 610 + 611 50 + PlayerControl(Previous) + + + 45 + 2 + 39 + 39 + + OSDRewindFO.png + OSDRewindNF.png + 600 + 603 610 611 - 603 - - 39 - 39 - - OSDPrevTrackFO.png - OSDPrevTrackNF.png - PlayerControl(Previous) - - - 39 - 39 - - OSDRewindFO.png - OSDRewindNF.png - PlayerControl(Rewind) - Window.IsVisible(MusicPlaylist) | Window.IsVisible(VideoPlaylist) | Player.HasVideo - - + 50 + PlayerControl(Rewind) + Window.IsVisible(MusicPlaylist) | Window.IsVisible(VideoPlaylist) | Player.HasVideo + + + Conditional + + 45 + 2 39 39 @@ -930,56 +824,89 @@ Player.Paused | Player.Forwarding | Player.Rewinding OSDPlayFO.png OSDPlayNF.png + 606 + 601 + 610 + 611 + 50 PlayerControl(Play) - + + 85 + 2 39 39 OSDStopFO.png OSDStopNF.png + 603 + 607 + 610 + 611 + 50 down PlayerControl(Stop) - + + 125 + 2 39 39 OSDForwardFO.png OSDForwardNF.png + 601 + 602 + 610 + 611 + 50 PlayerControl(Forward) Window.IsVisible(MusicPlaylist) | Window.IsVisible(VideoPlaylist) | Player.HasVideo - + + 125 + 2 39 39 OSDNextTrackFO.png OSDNextTrackNF.png + 607 + 604 + 610 + 611 + 50 PlayerControl(Next) + Conditional - + + + !Window.IsVisible(MusicPlaylist) + !Window.IsVisible(VideoPlaylist) + !Player.HasVideo + + 165 + 2 39 39 - - 39 - 39 - - - - - - 702 - 705 - PlayerControl(Repeat) - !Window.IsVisible(MusicPlaylist) + !Window.IsVisible(VideoPlaylist) + !Player.HasVideo - - - 39 - 39 - $VAR[PlayerControlsRepeatImageVar] - !Window.IsVisible(MusicPlaylist) + !Window.IsVisible(VideoPlaylist) + !Player.HasVideo - + + - + - + PlayerControl(Repeat) + 602 + 605 + 610 + 611 + 50 - + + 165 + 2 + 39 + 39 + $VAR[PlayerControlsRepeatImageVar] + + + 205 + 2 39 39 @@ -989,7 +916,11 @@ OSDRandomOnFO.png OSDRandomOnNF.png PlayerControl(Random) - !Window.IsVisible(MusicPlaylist) + !Window.IsVisible(VideoPlaylist) + !Player.HasVideo + 604 + 50 + 610 + 611 + 50 @@ -1014,7 +945,6 @@ - DepthSideBlade Container.Scrolling + [StringCompare(Container.SortMethod,$LOCALIZE[551]) | StringCompare(Container.SortMethod,$LOCALIZE[561]) | StringCompare(Container.SortMethod,$LOCALIZE[558]) | StringCompare(Container.SortMethod,$LOCALIZE[557]) | StringCompare(Container.SortMethod,$LOCALIZE[556])] Visible Hidden @@ -1341,7 +1271,6 @@ WindowClose - DepthDialog WindowOpen WindowClose @@ -1359,52 +1288,4 @@ font13 black - - - - - - - DepthHeader - - Section header image - 20 - 3 - 35 - 35 - keep - $PARAM[Icon].png - - - 65 - 5 - 1000 - 30 - horizontal - left - 5 - - WindowTitleCommons - - - - WindowTitleCommons - - !IsEmpty(Container.FolderName) - - - WindowTitleCommons - - $PARAM[ShowLabel2] - - - Clock - - - - - 1280 - 720 - conditional - diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/LockSettings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/LockSettings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/LockSettings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/LockSettings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 5 + 1 290 75 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/LoginScreen.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/LoginScreen.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/LoginScreen.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/LoginScreen.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,9 @@ 52 + no + 1 0 0 @@ -210,24 +212,21 @@ - - DepthHeader - Clock - - Date label - 20 - 35 - 200 - 15 - right - center - font10 - white - black - - Window_OpenClose_Animation - conditional - + Clock + + Date label + 20 + 35 + 200 + 15 + right + center + font10 + white + black + + Window_OpenClose_Animation + conditional diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MusicKaraokeLyrics.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MusicKaraokeLyrics.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MusicKaraokeLyrics.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MusicKaraokeLyrics.xml 2015-04-04 00:00:12.000000000 +0000 @@ -0,0 +1,46 @@ + + + + + visualisation + 0 + 0 + 1280 + 720 + false + + + fullscreen image + 0 + 0 + 1280 + 720 + false + + + MusicPlayer.Offset(number).Exists + !IntegerGreaterThan(Player.TimeRemaining,20) + Visible + 420 + 0 + + 0 + -10 + 470 + 55 + InfoMessagePanel.png + + + Next Song Name + 5 + 5 + 470 + 25 + font13_title + blue + + center + center + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MusicOSD.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MusicOSD.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MusicOSD.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MusicOSD.xml 2015-10-19 08:39:14.000000000 +0000 @@ -3,8 +3,8 @@ 100 SetFocus(602) dialogeffect - DepthOSD + 1 0 0 @@ -27,10 +27,9 @@ 100 VisibleChange conditional - ![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide) | Window.IsVisible(PVRRadioRDSInfo) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(Addon)] + ![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)] - DepthOSD+ Seek Slider 430 82r @@ -43,7 +42,7 @@ osd_slider_nibNF.png osd_slider_nib.png VisibleChange - ![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide) | Window.IsVisible(PVRRadioRDSInfo) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(Addon)] + ![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)] 325 @@ -53,7 +52,7 @@ horizontal 0 VisibleChange - ![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide) | Window.IsVisible(PVRRadioRDSInfo) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(Addon)] + ![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)] 55 55 @@ -158,18 +157,7 @@ OSDepgFO.png OSDepgNF.png ActivateWindow(PVROSDGuide) - MusicPlayer.Content(LiveTV) + !RDS.HasRadiotextPlus - - - RDS.HasRadiotextPlus - 55 - 55 - - - - OSDRadioRDSFO.png - OSDRadioRDSNF.png - ActivateWindow(PVRRadioRDSInfo) - MusicPlayer.Content(LiveTV) + RDS.HasRadiotextPlus + MusicPlayer.Content(LiveTV) 55 @@ -259,34 +247,16 @@ PlayerControl(Random) - 160 + 215 + 55 - + !MusicPlayer.Content(LiveTV) - 55 - - - !system.getbool(audiooutput.dspaddonsenabled) - - - 55 + 270 - MusicPlayer.Content(LiveTV) - - 55 - - - !Player.CanRecord - - - 55 - 55 - - - - OSDDSPAudioFO.png - OSDDSPAudioNF.png - ActivateWindow(OSDAudioDSPSettings) - system.getbool(audiooutput.dspaddonsenabled) - 55 55 @@ -329,8 +299,6 @@ OSDPreFO.png OSDPreNF.png ActivateWindow(122) - Visualisation.HasPresets - Conditional 55 @@ -340,7 +308,8 @@ OSDRecordOffFO.png OSDRecordOffNF.png PlayerControl(record) - Player.CanRecord + Player.CanRecord + Conditional diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MusicOverlay.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MusicOverlay.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MusicOverlay.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MusicOverlay.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,5 @@ + + + - + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MusicVisualisation.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MusicVisualisation.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MusicVisualisation.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MusicVisualisation.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,6 +1,7 @@ - + no @@ -16,7 +17,6 @@ 0 1280 720 - scale $INFO[Player.Art(fanart)] AAFFFFFF !IsEmpty(Player.Art(fanart)) + !Skin.HasSetting(HideVisualizationFanart) @@ -24,13 +24,12 @@ - DepthOSD VisibleChange - [Player.ShowInfo | Window.IsActive(MusicOSD)] + ![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide) | Window.IsVisible(PVRRadioRDSInfo) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(Addon)] + [Player.ShowInfo | Window.IsActive(MusicOSD)] + ![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)] - -20 + 0 -150 - 1320 + 1280 256 HomeNowPlayingBack.png @@ -78,14 +77,13 @@ conditional - -20 + 0 230r - 1320 + 1280 230 HomeNowPlayingBack.png - DepthOSDPopout cover image 20 250r @@ -131,7 +129,6 @@ 35 5 horizontal - !system.getbool(audiooutput.dspaddonsenabled) auto 30 @@ -148,73 +145,6 @@ 35 keep $INFO[MusicPlayer.Codec,flagging/audio/,.png] - !Player.ChannelPreviewActive - - - Rating - 110 - 35 - - rating back - 0 - 0 - 110 - 35 - stretch - flagging/blank.png - - - Rating - 5 - 0 - 100 - 35 - keep - $INFO[Player.StarRating,LeftRating/] - - - - - 20 - 60 - 910 - 35 - 5 - horizontal - system.getbool(audiooutput.dspaddonsenabled) - - auto - 30 - font30 - left - center - - orange - true - - - ADSP Master Mode Image - 80 - 35 - keep - ![IsEmpty(ADSP.MasterOwnIcon) | Player.ChannelPreviewActive] - $INFO[ADSP.MasterOwnIcon] - - - Audio Codec Image - 80 - 35 - keep - IsEmpty(ADSP.MasterOverrideIcon) + !Player.ChannelPreviewActive - $INFO[MusicPlayer.Codec,flagging/audio/,.png] - - - ADSP Audio Codec Override Image - 80 - 35 - keep - ![IsEmpty(ADSP.MasterOwnIcon) | Player.ChannelPreviewActive] - $INFO[ADSP.MasterOverrideIcon] Rating @@ -290,10 +220,9 @@ - DepthOSD+ 0 50 - Player.ShowCodec + ![Window.IsVisible(script-cu-lrclyrics-main.xml) | Window.IsVisible(VisualisationSettings) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide) | Window.IsVisible(PVRRadioRDSInfo) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(Addon)] + Player.ShowCodec + ![Window.IsVisible(script-cu-lrclyrics-main.xml) | Window.IsVisible(VisualisationSettings) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)] VisibleChange media info background image diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyMusicNav.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyMusicNav.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyMusicNav.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyMusicNav.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no ActivateWindow(1112) 50,51,500,550,551,509,506,511,512,513 @@ -30,18 +30,38 @@ AddonInfoThumbView1 - - DepthFooter - CommonPageCount - CommonNowPlaying - + CommonPageCount + CommonNowPlaying MainWindowMouseButtons BehindDialogFadeOut ScrollOffsetLabel - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_music.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + !IsEmpty(Container.FolderName) + + -250 SideBladeLeft @@ -85,6 +105,13 @@ 31050 Container.SortDirection(Ascending) + + Library button + + ReplaceWindow(MusicFiles) + Window.IsVisible(MusicLibrary) + ButtonCommonValues + Container.CanFilter + !Container.CanFilterAdvanced Filter @@ -151,5 +178,6 @@ CommonNowPlaying_Controls + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyMusicPlaylistEditor.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyMusicPlaylistEditor.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyMusicPlaylistEditor.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyMusicPlaylistEditor.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 6 - 9000 + no CommonBackground @@ -396,9 +396,33 @@ - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_music.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + !IsEmpty(Container.FolderName) + + + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyMusicPlaylist.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyMusicPlaylist.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyMusicPlaylist.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyMusicPlaylist.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no ActivateWindow(1112) 50,51,506 @@ -16,18 +16,38 @@ MusicInfoListView - - DepthFooter - CommonPageCount - CommonNowPlaying - + CommonPageCount + CommonNowPlaying MainWindowMouseButtons BehindDialogFadeOut ScrollOffsetLabel - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_music.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + !IsEmpty(Container.FolderName) + + -250 SideBladeLeft @@ -93,5 +113,6 @@ CommonNowPlaying_Controls + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyMusicSongs.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyMusicSongs.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyMusicSongs.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyMusicSongs.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,129 @@ + + + 50 + no + ActivateWindow(1112) + 50,51,550,551,500,506 + + CommonBackground + ContentPanelBackgrounds + + Window_OpenClose_Animation + + CommonRootView + + FullWidthList + + ThumbnailView + + MusicInfoListView + + AddonInfoListView1 + + AddonInfoThumbView1 + + CommonPageCount + CommonNowPlaying + MainWindowMouseButtons + BehindDialogFadeOut + ScrollOffsetLabel + + Section header image + 20 + 3 + 35 + 35 + keep + icon_music.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + !IsEmpty(Container.FolderName) + + + + -250 + SideBladeLeft + + 0 + 110 + 250 + 600 + 9000 + 50 + 9000 + 9000 + 50 + 0 + + 250 + 35 + font12 + + blue + center + center + + + View As button + 235 + ButtonCommonValues + + + + Sort by button + ButtonCommonValues + + + + Sort asc + ButtonCommonValues + button-focus.png + - + + 31050 + Container.SortDirection(Ascending) + + + Library button + + ReplaceWindow(MusicLibrary) + Window.IsVisible(MusicLibrary) + ButtonCommonValues + Library.HasContent(Music) + + + Container.CanFilter + !Container.CanFilterAdvanced + Filter + 230 + ButtonCommonValues + + + + Container.CanFilterAdvanced + Filter + ButtonCommonValues + + Container.Filtered + right + Filter + + CommonNowPlaying_Controls + + + Clock + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPics.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPics.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPics.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPics.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no ActivateWindow(1112) 50,51,550,551,500,514,510 @@ -36,18 +36,38 @@ AddonInfoThumbView1 - - DepthFooter - CommonPageCount - CommonNowPlaying - + CommonPageCount + CommonNowPlaying MainWindowMouseButtons BehindDialogFadeOut ScrollOffsetLabel - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_pictures.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + !IsEmpty(Container.FolderName) + + -250 SideBladeLeft @@ -135,5 +155,6 @@ CommonNowPlaying_Controls + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPrograms.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPrograms.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPrograms.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPrograms.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no ActivateWindow(1112) 50,51,500,550,551 @@ -20,18 +20,38 @@ AddonInfoThumbView1 - - DepthFooter - CommonPageCount - CommonNowPlaying - + CommonPageCount + CommonNowPlaying MainWindowMouseButtons BehindDialogFadeOut ScrollOffsetLabel - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_addons.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + !IsEmpty(Container.FolderName) + + -250 SideBladeLeft @@ -93,5 +113,6 @@ CommonNowPlaying_Controls + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPVRChannels.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPVRChannels.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPVRChannels.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPVRChannels.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no 50 CommonBackground @@ -16,8 +16,8 @@ Window_OpenClose_Animation - VisibleFadeEffect + VisibleFadeEffect 50 60 @@ -25,27 +25,27 @@ 600 ContentPanel.png - - - 50 - 652 - 450 - 64 - ContentPanelMirror.png - - - 510 - 60 - 730 - 600 - ContentPanel.png - - - 510 - 652 - 730 - 64 - ContentPanelMirror.png + + 50 + 652 + 450 + 64 + ContentPanelMirror.png + + + 510 + 60 + 730 + 600 + ContentPanel.png + + + 510 + 652 + 730 + 64 + ContentPanelMirror.png + MainWindowMouseButtons @@ -54,6 +54,7 @@ Small Media Window 530 80 + Control.IsVisible(50) VisibleFadeEffect Window_OpenClose_Animation @@ -63,19 +64,6 @@ 400 button-nofocus.png - - -1 - -1 - 692 - 402 - VideoWindowFO.png - - - - - no - 70 - Fullscreen - Player.HasVideo - 5 5 @@ -119,11 +107,11 @@ Window_OpenClose_Animation TV Channels group + Control.IsVisible(50) VisibleFadeEffect 530 490 - ![Control.IsVisible(50) + !IsEmpty(Window.Property(IsRadio)) + System.GetBool(PVRPlayback.EnableRadioRDS) + !Skin.HasSetting(HideEPGwithRDS) + RDS.HasRDS] 0 0 @@ -135,7 +123,7 @@ true center center - + 0 @@ -198,324 +186,233 @@ - - - 70 - 85 - 390 - 541 - 100 - 70 - 50 - 50 - list - 70 - 200 - - - 0 - 0 - 390 - 61 - MenuItemNF.png - VisibleFadeEffect - - - 5 - -4 - 40 - 35 - font12 - left - center - grey - grey - ListItem.ChannelNumberLabel - - - 50 - 0 - 270 - 25 - font13 - white - selected - left - center - - - - 50 - 25 - 330 - 20 - font12 - grey - grey - left - center - - IsEmpty(Listitem.Icon) - - - 50 - 25 - 280 - 20 - font12 - grey - grey - left - center - - !IsEmpty(Listitem.Icon) - - - Progressbar - 50 - 48 - 280 - 6 - 88FFFFFF - ListItem.HasEpg - ListItem.Progress - - - 340 - 4 - 50 - 50 - $INFO[ListItem.Icon] - keep - - - 5 - 37 - 30 - 20 - PVR-IsRecording.png - ListItem.IsRecording - - - - - 0 - 0 - 390 - 61 - MenuItemNF.png - !Control.HasFocus(50) - VisibleFadeEffect - - - 0 - 0 - 390 - 61 - MenuItemFO.png - Control.HasFocus(50) - VisibleFadeEffect - - - 5 - -4 - 40 - 35 - font12 - left - center - grey - grey - ListItem.ChannelNumberLabel - - - 50 - 0 - 270 - 25 - font13 - white - selected - left - center - - - - 50 - 25 - 330 - 20 - font12 - grey - grey - left - center - - IsEmpty(Listitem.Icon) - - - 50 - 25 - 280 - 20 - font12 - grey - grey - left - center - - !IsEmpty(Listitem.Icon) - - - Progressbar - 50 - 48 - 280 - 6 - 88FFFFFF - ListItem.HasEpg - ListItem.Progress - - - 340 - 4 - 50 - 50 - $INFO[ListItem.Icon] - keep - - - 5 - 37 - 30 - 20 - PVR-IsRecording.png - ListItem.IsRecording - - - - - 465 - 85 - 25 - 540 - ScrollBarV.png - ScrollBarV_bar.png - ScrollBarV_bar_focus.png - ScrollBarNib.png - ScrollBarNib.png - 50 - 61 - false - vertical - - - DepthFooter - Conditional - Page Count Label - 40 - 53r - 500 - 20 - font12 - grey - false - right - center - - Window_OpenClose_Animation - + + 70 + 85 + 390 + 541 + 100 + 70 + 50 + 50 + list + 70 + 200 + + + 0 + 0 + 390 + 61 + MenuItemNF.png + VisibleFadeEffect + + + 5 + -4 + 40 + 35 + font12 + left + center + grey + grey + ListItem.ChannelNumberLabel + + + 50 + 0 + 270 + 25 + font13 + white + selected + left + center + + + + 50 + 25 + 330 + 20 + font12 + grey + grey + left + center + + IsEmpty(Listitem.Icon) + + + 50 + 25 + 280 + 20 + font12 + grey + grey + left + center + + !IsEmpty(Listitem.Icon) + + + Progressbar + 50 + 48 + 280 + 6 + 88FFFFFF + ListItem.HasEpg + ListItem.Progress + + + 340 + 4 + 50 + 50 + $INFO[ListItem.Icon] + keep + + + 5 + 37 + 30 + 20 + PVR-IsRecording.png + ListItem.IsRecording + + + + + 0 + 0 + 390 + 61 + MenuItemNF.png + !Control.HasFocus(50) + VisibleFadeEffect + + + 0 + 0 + 390 + 61 + MenuItemFO.png + Control.HasFocus(50) + VisibleFadeEffect + + + 5 + -4 + 40 + 35 + font12 + left + center + grey + grey + ListItem.ChannelNumberLabel + + + 50 + 0 + 270 + 25 + font13 + white + selected + left + center + + + + 50 + 25 + 330 + 20 + font12 + grey + grey + left + center + + IsEmpty(Listitem.Icon) + + + 50 + 25 + 280 + 20 + font12 + grey + grey + left + center + + !IsEmpty(Listitem.Icon) + + + Progressbar + 50 + 48 + 280 + 6 + 88FFFFFF + ListItem.HasEpg + ListItem.Progress + + + 340 + 4 + 50 + 50 + $INFO[ListItem.Icon] + keep + + + 5 + 37 + 30 + 20 + PVR-IsRecording.png + ListItem.IsRecording + + + + + 465 + 85 + 25 + 540 + ScrollBarV.png + ScrollBarV_bar.png + ScrollBarV_bar_focus.png + ScrollBarNib.png + ScrollBarNib.png + 50 + 100 + false + vertical - - 530 - 490 - Control.IsVisible(50) + !IsEmpty(Window.Property(IsRadio)) + System.GetBool(PVRPlayback.EnableRadioRDS) + !Skin.HasSetting(HideEPGwithRDS) + RDS.HasRDS - - 580 - -3 - 104 - 40 - !RDS.HasRadioText - flagging/rds/rds-logo.png - - - 580 - -3 - 104 - 34 - RDS.HasRadioText + !RDS.HasRadioTextPlus - flagging/rds/rds-radiotext-logo.png - - - 580 - -3 - 104 - 40 - RDS.HasRadioTextPlus - flagging/rds/rds-radiotext-plus-logo.png - - - 0 - 40 - 690 - 20 - font13 - white - black - left - center - true - RDS.HasRDS - - - - 0 - 65 - 690 - 20 - font13 - white - black - left - center - true - RDS.HasRDS - - - - 0 - 90 - 690 - 20 - font13 - white - black - left - center - true - RDS.HasRDS - - - - 0 - 115 - 690 - 20 - font13 - white - black - left - center - true - RDS.HasRDS - - + + Conditional + Page Count Label + 40 + 53r + 500 + 20 + font12 + grey + false + right + center + + Window_OpenClose_Animation - - DepthFooter - CommonNowPlaying - + CommonNowPlaying BehindDialogFadeOut ScrollOffsetLabel @@ -529,5 +426,6 @@ Window.IsActive(FileBrowser) | Window.IsActive(PVRGuideInfo) | Window.IsActive(PVRRecordingInfo) | Window.IsActive(PVRTimerSetting) | Window.IsActive(PVRGroupManager) | Window.IsActive(PVRGuideSearch) PVRSideBlade + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPVRGuide.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPVRGuide.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPVRGuide.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPVRGuide.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 10 - 9000 + no 10,11,12,13 CommonBackground @@ -55,10 +55,7 @@ PVRGuideViewNext PVRGuideViewChannel - - DepthFooter - CommonNowPlaying - + CommonNowPlaying BehindDialogFadeOut ScrollOffsetLabel @@ -72,5 +69,6 @@ Window.IsActive(FileBrowser) | Window.IsActive(PVRGuideInfo) | Window.IsActive(PVRRecordingInfo) | Window.IsActive(PVRTimerSetting) | Window.IsActive(PVRGroupManager) | Window.IsActive(PVRGuideSearch) PVRSideBlade + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPVRRecordings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPVRRecordings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPVRRecordings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPVRRecordings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no 50 CommonBackground @@ -95,7 +95,7 @@ selected left center - + 225 @@ -171,7 +171,7 @@ selected left center - + 225 @@ -219,7 +219,6 @@ vertical - DepthFooter Conditional Page Count Label 40 @@ -253,7 +252,7 @@ 230 290 25 - + center center font13 @@ -297,10 +296,7 @@ PVR.backenddiskspaceprogr!IntegerGreaterThan(PVR.backenddiskspaceprogr,100) - - DepthFooter - CommonNowPlaying - + CommonNowPlaying BehindDialogFadeOut ScrollOffsetLabel @@ -314,5 +310,6 @@ Window.IsActive(FileBrowser) | Window.IsActive(PVRGuideInfo) | Window.IsActive(PVRRecordingInfo) | Window.IsActive(PVRTimerSetting) | Window.IsActive(PVRGroupManager) | Window.IsActive(PVRGuideSearch) PVRSideBlade + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPVRSearch.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPVRSearch.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPVRSearch.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPVRSearch.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no 50 CommonBackground @@ -117,7 +117,7 @@ 0 55 1100 - 370 + 520 50 50 104 @@ -190,7 +190,7 @@ center grey2 selected - + ListItem.Label 750 @@ -229,15 +229,7 @@ 20 20 PVR-HasTimer.png - ListItem.HasTimer + !ListItem.IsRecording + !ListItem.HasTimerSchedule - - - 980 - 10 - 20 - 20 - PVR-HasTimerSchedule.png - ListItem.HasTimerSchedule + !ListItem.IsRecording + ListItem.HasTimer + !ListItem.IsRecording 1010 @@ -249,7 +241,7 @@ grey2 selected - ListItem.HasTimer + !ListItem.IsRecording + ListItem.HasTimer 980 @@ -335,7 +327,7 @@ center white selected - + ListItem.Label 750 @@ -374,15 +366,7 @@ 20 20 PVR-HasTimer.png - ListItem.HasTimer + !ListItem.IsRecording + !ListItem.HasTimerSchedule - - - 980 - 10 - 20 - 20 - PVR-HasTimerSchedule.png - ListItem.HasTimerSchedule + !ListItem.IsRecording + ListItem.HasTimer + !ListItem.IsRecording 1010 @@ -394,7 +378,7 @@ grey2 selected - ListItem.HasTimer + !ListItem.IsRecording + ListItem.HasTimer 980 @@ -411,7 +395,7 @@ 1105 50 25 - 370 + 520 ScrollBarV.png ScrollBarV_bar.png ScrollBarV_bar_focus.png @@ -422,77 +406,8 @@ false vertical - - separator image - 0 - 430 - 1100 - 1 - 88FFFFFF - separator2.png - - - !ListItem.HasEPG - 0 - 440 - - 0 - 0 - 1100 - 20 - - font13 - white - center - - - - ListItem.HasEPG - 0 - 440 - - 62 - 6 - 130 - 130 - $INFO[ListItem.Icon] - keep - - - 280 - 0 - 800 - 20 - - font13 - white - true - - - 280 - 25 - 800 - 20 - - font12 - grey - - - Plot value - 280 - 57 - 800 - 63 - font12 - justify - grey - true - - - - DepthFooter Conditional Page Count Label 40 @@ -507,10 +422,7 @@ - - DepthFooter - CommonNowPlaying - + CommonNowPlaying BehindDialogFadeOut ScrollOffsetLabel @@ -524,5 +436,6 @@ Window.IsActive(FileBrowser) | Window.IsActive(PVRGuideInfo) | Window.IsActive(PVRRecordingInfo) | Window.IsActive(PVRTimerSetting) | Window.IsActive(PVRGroupManager) | Window.IsActive(PVRGuideSearch) PVRSideBlade + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPVRTimers.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPVRTimers.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyPVRTimers.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyPVRTimers.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no 50 CommonBackground @@ -58,7 +58,7 @@ 60 Channel header label - 50 + 20 20 220 20 @@ -72,7 +72,7 @@ Title header label 240 20 - 200 + 300 20 font13_title white @@ -82,9 +82,9 @@ Schedule Time header label - 480 + 600 20 - 200 + 300 20 font13_title white @@ -93,18 +93,6 @@ - Type header label - 770 - 20 - 150 - 20 - font13_title - white - black - center - - - Status header label 980 20 @@ -129,7 +117,7 @@ 0 55 1100 - 330 + 480 50 50 103 @@ -180,7 +168,7 @@ 240 0 - 200 + 290 40 font12 center @@ -188,9 +176,9 @@ ListItem.Label - 480 + 600 0 - 250 + 400 40 font12 center @@ -198,19 +186,9 @@ ListItem.Date - 770 - 0 - 180 - 40 - font12 - center - selected - ListItem.Timertype - - 980 0 - 150 + 170 40 font12 center @@ -272,7 +250,7 @@ 240 0 - 200 + 290 40 font12 center @@ -280,9 +258,9 @@ ListItem.Label - 480 + 600 0 - 250 + 400 40 font12 center @@ -290,16 +268,6 @@ ListItem.Date - 770 - 0 - 180 - 40 - font12 - center - selected - ListItem.Timertype - - 980 0 150 @@ -316,7 +284,7 @@ 1105 50 25 - 330 + 480 ScrollBarV.png ScrollBarV_bar.png ScrollBarV_bar_focus.png @@ -329,77 +297,9 @@ separator image - 0 - 390 - 1100 - 1 - 88FFFFFF - separator2.png - - - !ListItem.HasEPG - 0 - 400 - - 0 - 0 - 1100 - 20 - - font13 - white - center - - - - ListItem.HasEPG - 0 - 400 - - 62 - 6 - 130 - 130 - $INFO[ListItem.Icon] - keep - - - 280 - 0 - 800 - 20 - - font13 - white - true - - - 280 - 25 - 800 - 20 - - font12 - grey - - - Plot value - 280 - 57 - 800 - 63 - font12 - justify - grey - true - - - - - separator image - 0 + 55 540 - 1100 + 1010 1 88FFFFFF separator2.png @@ -420,7 +320,6 @@ - DepthFooter Conditional Page Count Label 40 @@ -436,10 +335,7 @@ Window_OpenClose_Animation - - DepthFooter - CommonNowPlaying - + CommonNowPlaying BehindDialogFadeOut ScrollOffsetLabel @@ -453,5 +349,6 @@ Window.IsActive(FileBrowser) | Window.IsActive(PVRGuideInfo) | Window.IsActive(PVRRecordingInfo) | Window.IsActive(PVRTimerSetting) | Window.IsActive(PVRGroupManager) | Window.IsActive(PVRGuideSearch) PVRSideBlade + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyVideoNav.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyVideoNav.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyVideoNav.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyVideoNav.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no 50,51,500,550,551,560,501,508,504,503,515,505,511 ActivateWindow(1112) @@ -36,18 +36,38 @@ LiveTVView1 - - DepthFooter - CommonPageCount - CommonNowPlaying - + CommonPageCount + CommonNowPlaying MainWindowMouseButtons BehindDialogFadeOut ScrollOffsetLabel - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_video.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + !IsEmpty(Container.FolderName) + + -250 SideBladeLeft @@ -173,5 +193,6 @@ CommonNowPlaying_Controls + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyVideoPlaylist.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyVideoPlaylist.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyVideoPlaylist.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyVideoPlaylist.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,7 @@ 50 - 9000 + no ActivateWindow(1112) 50,51 @@ -14,18 +14,38 @@ FullWidthList - - DepthFooter - CommonPageCount - CommonNowPlaying - + CommonPageCount + CommonNowPlaying MainWindowMouseButtons BehindDialogFadeOut ScrollOffsetLabel - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_video.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + !IsEmpty(Container.FolderName) + + -250 SideBladeLeft @@ -91,5 +111,6 @@ CommonNowPlaying_Controls + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyWeather.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyWeather.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/MyWeather.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/MyWeather.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,26 +1,45 @@ 50 - 9000 + no ActivateWindow(1112) CommonBackground - DepthBackground - BackgroundDimensions - scale - resource://resource.images.weatherfanart.multi/$INFO[Window(Weather).Property(Current.FanartCode)] + 0 + 0 + 1280 + 720 + $INFO[Skin.String(WeatherFanartDir)]$INFO[Window(Weather).Property(Current.FanartCode)] 10000 true 1000 VisibleFadeEffect - System.HasAddon(resource.images.weatherfanart.multi) + Skin.HasSetting(ShowWeatherFanart) + !IsEmpty(Skin.String(WeatherFanartDir)) WindowClose - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_weather.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + 0 100r @@ -127,43 +146,40 @@ center grey2 - - DepthContent+ - - current temp Value - 15 - 185 - 180 - 40 - WeatherTemp - right - top - - white - black - - - current temp Value Units - 200 - 206 - 100 - 40 - font16 - left - top - - white - black - - - current weather icon - 260 - 145 - 200 - 200 - Window.Property(Current.ConditionIcon) - keep - + + current temp Value + 15 + 185 + 180 + 40 + WeatherTemp + right + top + + white + black + + + current temp Value Units + 200 + 206 + 100 + 40 + font16 + left + top + + white + black + + + current weather icon + 260 + 145 + 200 + 200 + Window.Property(Current.ConditionIcon) + keep current condition label @@ -435,10 +451,7 @@ - - DepthFooter - CommonNowPlaying - + CommonNowPlaying MainWindowMouseButtons -250 @@ -553,6 +566,16 @@ ButtonCommonValues + + Custom Weather Script Button + + SetFocus(50) + RunScript($INFO[Skin.String(WeatherScript_Path)]) + SetFocus(50) + 235 + ButtonCommonValues + Skin.HasSetting(WeatherScript_Enable) + !IsEmpty(Skin.String(WeatherScript_Label)) + Settings button @@ -560,8 +583,22 @@ 235 ButtonCommonValues + + Fanart Toggle + ButtonCommonValues + + Skin.ToggleSetting(ShowWeatherFanart) + !Skin.HasSetting(ShowWeatherFanart) + + + ButtonCommonValues + + Skin.SetPath(WeatherFanartDir) + Skin.HasSetting(ShowWeatherFanart) + CommonNowPlaying_Controls + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/PlayerControls.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/PlayerControls.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/PlayerControls.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/PlayerControls.xml 2015-10-19 08:39:14.000000000 +0000 @@ -4,6 +4,7 @@ dialogeffect Player.HasMedia + Window.IsActive(PlayerControls) + !Window.IsActive(FullscreenVideo) + !Window.IsActive(Visualisation) + 1 390 250 @@ -368,7 +369,7 @@ OSDRecordOffFO.png OSDRecordOffNF.png 705 - 707 + 701 300 200 PlayerControl(record) @@ -376,21 +377,6 @@ Conditional VideoPlayer.Content(LiveTV) - - 400 - 0 - 40 - 40 - - OSDRadioRDSFO.png - OSDRadioRDSNF.png - 706 - 701 - 300 - 200 - ActivateWindow(PVRRadioRDSInfo) - VideoPlayer.Content(LiveTV) + RDS.HasRadiotextPlus - gradient diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/Pointer.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/Pointer.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/Pointer.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/Pointer.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ - + 1 0 0 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ProfileSettings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ProfileSettings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ProfileSettings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ProfileSettings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,6 +1,7 @@ + 1 290 75 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/script-cu-lrclyrics-main.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/script-cu-lrclyrics-main.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/script-cu-lrclyrics-main.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/script-cu-lrclyrics-main.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,34 +1,29 @@ + no - 300 - 60 + 1 + 680 + 0 - dialogeffect - DepthSideBlade + WindowOpen + WindowOpen + WindowClose - background image + media info background image 0 0 - 680 - 470 - BBFFFFFF - DialogBack2.png - - - Dialog Header image - 40 - 16 600 - 40 - dialogheader.png + 720 + BBFFFFFF + MediaBladeSub.png Close Window button - 590 - 15 + 20 + 0 64 32 @@ -40,38 +35,56 @@ header label - 40 - 20 - 600 + 30 + 30 + 550 + 30 + font30_title + + right + center + white + black + + + Artist label + 30 + 60 + 550 30 - font13_title - center + + right center - selected + grey black - !Control.IsVisible(120) - - Pick label - 40 - 20 - 600 + + Song label + 30 + 85 + 550 30 - font13_title - center + + right center - selected + grey black - Control.IsVisible(120) + !Control.IsVisible(110) + + + 30 + 120 + 550 + 4 + separator.png 30 - 60 - 620 - 350 + 130 + 550 + 500 111 111 110 @@ -82,20 +95,20 @@ 0 0 - 620 + 550 25 font13 center center selected - + ListItem.Label 0 0 - 620 + 550 25 font13 center @@ -109,80 +122,83 @@ 0 0 - 620 + 550 25 font13 center center black selected - + Control.HasFocus(110) - - 360 - 420 - 200 - 20 - font12 - center - right - grey2 - - Control.IsVisible(111) - Next page button - 570 - 420 + 520 + 650 page - - + font12 110 110 110 110 + blue true Control.IsVisible(110) + + Pick label + 30 + 130 + 550 + 30 + center + center + font13_title + + white + Control.IsVisible(120) + !Control.IsVisible(110) + 30 - 60 - 620 - 360 + 170 + 550 + 440 121 121 120 120 121 200 + Conditional 0 0 - 620 + 550 41 MenuItemNF.png 10 0 - 600 + 530 40 font13 left center selected - + ListItem.Label 0 0 - 620 + 550 41 !Control.HasFocus(120) MenuItemNF.png @@ -190,7 +206,7 @@ 0 0 - 620 + 550 41 Control.HasFocus(120) MenuItemFO.png @@ -198,49 +214,46 @@ 10 0 - 600 + 530 40 font13 left center selected - + ListItem.Label - - 360 - 420 - 200 - 20 - font12 - center - right - grey2 - - Control.IsVisible(121) - Next page button - 570 - 420 + 520 + 650 page - - + font12 120 120 120 120 + blue true Control.IsVisible(120) + + 30 + 640 + 550 + 4 + separator.png + Scraper label - 40 - 420 - 600 + 30 + 680 + 550 30 font12_title + right center grey2 black diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/script-globalsearch-main.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/script-globalsearch-main.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/script-globalsearch-main.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/script-globalsearch-main.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,10 +1,11 @@ + no + 1 0 0 - DepthDialog VisibleFadeEffect diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/script-NextAired-TVGuide.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/script-NextAired-TVGuide.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/script-NextAired-TVGuide.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/script-NextAired-TVGuide.xml 2015-10-19 08:39:14.000000000 +0000 @@ -7,6 +7,7 @@ ClearProperty(TVGuide.FridayList,Home) ClearProperty(TVGuide.SaturdayList,Home) ClearProperty(TVGuide.SundayList,Home) + no CommonBackground diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/script-RSS_Editor-rssEditor.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/script-RSS_Editor-rssEditor.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/script-RSS_Editor-rssEditor.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/script-RSS_Editor-rssEditor.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 10 + 1 240 140 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/script-RSS_Editor-setEditor.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/script-RSS_Editor-setEditor.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/script-RSS_Editor-setEditor.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/script-RSS_Editor-setEditor.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 10 + 1 240 140 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SettingsCategory.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SettingsCategory.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SettingsCategory.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SettingsCategory.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,6 +1,7 @@ 3 + no CommonBackground @@ -274,15 +275,34 @@ - false - - DepthFooter - CommonNowPlaying - + CommonNowPlaying MainWindowMouseButtons - - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_system.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + + + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SettingsProfile.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SettingsProfile.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SettingsProfile.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SettingsProfile.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,6 +1,7 @@ 9000 + no CommonBackground @@ -373,15 +374,31 @@ - - DepthFooter - CommonNowPlaying - + CommonNowPlaying MainWindowMouseButtons BehindDialogFadeOut - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_system.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SettingsSystemInfo.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SettingsSystemInfo.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SettingsSystemInfo.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SettingsSystemInfo.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,6 +1,7 @@ 95 + no CommonBackground @@ -272,14 +273,25 @@ font13 + + Kodi Build Version + 20 + 400 + 730 + + right + blue + black + font13_title + CPU Text - 0 - 350 - 750 + 70 + 450 + 350 25 - left + right center white black @@ -287,20 +299,20 @@ CPU BAR - 0 - 375 - 750 + 430 + 455 + 320 16 System.CPUUsage Memory Text - 0 - 395 - auto + 70 + 480 + 350 25 - - left + + right center white black @@ -308,69 +320,38 @@ Memory BAR - 0 - 420 - 750 + 430 + 485 + 320 16 system.memory(used) - - Kodi build version - 50 - 450 - 0 - left - horizontal - - Build label - auto - 25 - - white - black - font13_title - - - Kodi Build Version - 90 - 450 - auto - blue - black - font13_title - - - - Build date - 10 - 480 - left - 0 - horizontal - - kodi Compiled Text - auto - 25 - - white - black - font13_title - - - Kodi Build Date - auto - blue - black - font13_title - - CommonNowPlaying MainWindowMouseButtons - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_system.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/Settings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/Settings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/Settings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/Settings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,6 +1,7 @@ 9000 + no CommonBackground @@ -243,15 +244,31 @@ black - - DepthFooter - CommonNowPlaying - + CommonNowPlaying MainWindowMouseButtons BehindDialogFadeOut - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_system.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SkinSettings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SkinSettings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SkinSettings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SkinSettings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -11,10 +11,33 @@ floor.png VisibleFadeEffect - - - - + + Section header image + 20 + 3 + 35 + 35 + keep + icon_system.png + + + 65 + 5 + 1000 + 30 + horizontal + left + 5 + + WindowTitleCommons + + + + WindowTitleCommons + + !IsEmpty(Container.FolderName) + + 90 30 @@ -261,18 +284,6 @@ Skin.ToggleSetting(HideFilenameFlagging) Skin.HasSetting(HideFilenameFlagging) - - 750 - 40 - font13 - - grey2 - white - MenuItemFO.png - MenuItemNF.png - Skin.ToggleSetting(HideEPGwithRDS) - Skin.HasSetting(HideEPGwithRDS) - 750 45 @@ -707,7 +718,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomeVideosButton1,xbmc.addon.video) + Skin.SetAddon(HomeVideosButton1,xbmc.addon.video,xbmc.addon.executable) 750 @@ -719,7 +730,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomeVideosButton2,xbmc.addon.video) + Skin.SetAddon(HomeVideosButton2,xbmc.addon.video,xbmc.addon.executable) 750 @@ -731,7 +742,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomeVideosButton3,xbmc.addon.video) + Skin.SetAddon(HomeVideosButton3,xbmc.addon.video,xbmc.addon.executable) 750 @@ -743,7 +754,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomeVideosButton4,xbmc.addon.video) + Skin.SetAddon(HomeVideosButton4,xbmc.addon.video,xbmc.addon.executable) 750 @@ -755,7 +766,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomeVideosButton5,xbmc.addon.video) + Skin.SetAddon(HomeVideosButton5,xbmc.addon.video,xbmc.addon.executable) 750 @@ -777,7 +788,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomeMusicButton1,xbmc.addon.audio) + Skin.SetAddon(HomeMusicButton1,xbmc.addon.audio,xbmc.addon.executable) 750 @@ -789,7 +800,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomeMusicButton2,xbmc.addon.audio) + Skin.SetAddon(HomeMusicButton2,xbmc.addon.audio,xbmc.addon.executable) 750 @@ -801,7 +812,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomeMusicButton3,xbmc.addon.audio) + Skin.SetAddon(HomeMusicButton3,xbmc.addon.audio,xbmc.addon.executable) 750 @@ -813,7 +824,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomeMusicButton4,xbmc.addon.audio) + Skin.SetAddon(HomeMusicButton4,xbmc.addon.audio,xbmc.addon.executable) 750 @@ -825,7 +836,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomeMusicButton5,xbmc.addon.audio) + Skin.SetAddon(HomeMusicButton5,xbmc.addon.audio,xbmc.addon.executable) 750 @@ -847,7 +858,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomePictureButton1,xbmc.addon.image) + Skin.SetAddon(HomePictureButton1,xbmc.addon.image,xbmc.addon.executable) 750 @@ -859,7 +870,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomePictureButton2,xbmc.addon.image) + Skin.SetAddon(HomePictureButton2,xbmc.addon.image,xbmc.addon.executable) 750 @@ -871,7 +882,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomePictureButton3,xbmc.addon.image) + Skin.SetAddon(HomePictureButton3,xbmc.addon.image,xbmc.addon.executable) 750 @@ -883,7 +894,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomePictureButton4,xbmc.addon.image) + Skin.SetAddon(HomePictureButton4,xbmc.addon.image,xbmc.addon.executable) 750 @@ -895,7 +906,7 @@ white MenuItemFO.png MenuItemNF.png - Skin.SetAddon(HomePictureButton5,xbmc.addon.image) + Skin.SetAddon(HomePictureButton5,xbmc.addon.image,xbmc.addon.executable) 750 @@ -967,6 +978,18 @@ MenuItemNF.png Skin.SetAddon(HomeProgramButton5,xbmc.addon.executable) + + 750 + 40 + font13 + + [COLOR=selected]$INFO[system.addontitle(Skin.String(HomeProgramButton6))][/COLOR] + grey2 + white + MenuItemFO.png + MenuItemNF.png + Skin.SetAddon(HomeProgramButton6,xbmc.addon.executable) + @@ -990,5 +1013,6 @@ CommonNowPlaying MainWindowMouseButtons BehindDialogFadeOut + Clock diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SmartPlaylistEditor.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SmartPlaylistEditor.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SmartPlaylistEditor.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SmartPlaylistEditor.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,9 @@ 22 + no + 1 240 22 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SmartPlaylistRule.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SmartPlaylistRule.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/SmartPlaylistRule.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/SmartPlaylistRule.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,7 +1,9 @@ 9001 + no + 1 240 220 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/Startup.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/Startup.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/Startup.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/Startup.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,6 +1,7 @@ 10 + no trigger diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VideoFullScreen.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VideoFullScreen.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VideoFullScreen.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VideoFullScreen.xml 2015-10-19 08:39:14.000000000 +0000 @@ -4,13 +4,12 @@ - DepthOSD - [Player.ShowInfo | Window.IsActive(VideoOSD)] + ![Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide) | Window.IsVisible(SliderDialog)] + [Player.ShowInfo | Window.IsActive(VideoOSD)] + ![Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide) | Window.IsVisible(SliderDialog)] VisibleChange - -20 + 0 -150 - 1320 + 1280 256 HomeNowPlayingBack.png @@ -58,14 +57,13 @@ conditional - -20 + 0 230r - 1320 + 1280 230 HomeNowPlayingBack.png - DepthOSDPopout cover image 20 260r @@ -78,7 +76,6 @@ ![VideoPlayer.Content(Movies) | VideoPlayer.Content(LiveTV)] - DepthOSDPopout Movie cover image 20 350r @@ -91,7 +88,6 @@ VideoPlayer.Content(Movies) - DepthOSDPopout PIcon image 20 200r @@ -125,7 +121,7 @@ 25 keep PVR-IsRecording.png - VideoPlayer.Content(LiveTV) + Player.Recording + !Player.ChannelPreviewActive + VideoPlayer.Content(LiveTV) + Player.Recording Heading label @@ -139,7 +135,7 @@ white black - VideoPlayer.Content(LiveTV) + Player.Recording + !Player.ChannelPreviewActive + VideoPlayer.Content(LiveTV) + Player.Recording Studio label @@ -216,44 +212,25 @@ 35 keep $INFO[VideoPlayer.VideoResolution,flagging/video/,.png] - !Player.ChannelPreviewActive - - - ADSP Master Mode Image - 85 - 35 - keep - ![IsEmpty(ADSP.MasterOwnIcon) | Player.ChannelPreviewActive] - $INFO[ADSP.MasterOwnIcon] Audio Codec Image 85 35 keep - IsEmpty(ADSP.MasterOverrideIcon) + !Player.ChannelPreviewActive $INFO[VideoPlayer.AudioCodec,flagging/audio/,.png] - ADSP Audio Codec Override Image - 85 - 35 - keep - ![IsEmpty(ADSP.MasterOverrideIcon) | Player.ChannelPreviewActive] - $INFO[ADSP.MasterOverrideIcon] - - Audio Channels Image 50 35 keep $INFO[VideoPlayer.AudioChannels,flagging/audio/,.png] - !Player.ChannelPreviewActive 85 35 - ![IsEmpty(VideoPlayer.AudioLanguage) | Player.ChannelPreviewActive] + !IsEmpty(VideoPlayer.AudioLanguage) 5 0 @@ -276,7 +253,7 @@ 85 35 - ![IsEmpty(VideoPlayer.SubtitlesLanguage) | Player.ChannelPreviewActive] + !IsEmpty(VideoPlayer.SubtitlesLanguage) 5 0 @@ -359,7 +336,6 @@ 16 Player.ProgressCache OSDProgressMidLight.png - !Player.ChannelPreviewActive Progressbar @@ -395,7 +371,6 @@ - DepthOSD+ 0 20 VisibleChange @@ -442,7 +417,6 @@ - DepthOSD+ Player.ShowCodec + VideoPlayer.Content(LiveTV) + system.getbool(pvrplayback.signalquality) 185 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VideoOSDBookmarks.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VideoOSDBookmarks.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VideoOSDBookmarks.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VideoOSDBookmarks.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,6 +2,7 @@ 2 + 1 240 60 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VideoOSDSettings.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VideoOSDSettings.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VideoOSDSettings.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VideoOSDSettings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -2,13 +2,14 @@ 5 + 1 240 60 dialogeffect - Conditional + Conditional background image 0 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VideoOSD.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VideoOSD.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VideoOSD.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VideoOSD.xml 2015-10-19 08:39:14.000000000 +0000 @@ -3,8 +3,8 @@ 100 SetFocus(202) dialogeffect - DepthOSD + 1 0 0 @@ -27,10 +27,9 @@ 100 conditional VisibleChange - ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(VideoBookmarks)] + ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks)] - DepthOSD+ Seek Slider 430 82r @@ -43,7 +42,7 @@ osd_slider_nibNF.png osd_slider_nib.png VisibleChange - ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(VideoBookmarks) | VideoPlayer.Content(LiveTV)] + ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks) | VideoPlayer.Content(LiveTV)] 325 @@ -51,7 +50,7 @@ horizontal 0 VisibleChange - ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)] + ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)] 1000 55 @@ -174,18 +173,13 @@ 270 - - VideoPlayer.HasMenu + !VideoPlayer.Content(LiveTV) + !VideoPlayer.Content(LiveTV) - 160 + 165 - VideoPlayer.Content(LiveTV) - - 325 - - - !VideoPlayer.Content(LiveTV) + !VideoPlayer.HasMenu - VideoPlayer.IsStereoscopic Conditional @@ -219,16 +213,13 @@ 1000 ActivateWindow(OSDVideoSettings) - + 55 55 - OSDAudioFO.png OSDAudioNF.png - system.getbool(audiooutput.dspaddonsenabled) - OSDDSPAudioFO.png - OSDDSPAudioNF.png 1000 1000 ActivateWindow(OSDAudioSettings) @@ -255,7 +246,9 @@ 1000 1000 PlayerControl(ShowVideoMenu) - !VideoPlayer.Content(LiveTV) + VideoPlayer.HasMenu + VideoPlayer.HasMenu + Conditional + !VideoPlayer.Content(LiveTV) 55 @@ -288,13 +281,11 @@ Control.HasFocus(410) | Control.HasFocus(250) | ControlGroup(400).HasFocus - DepthOSD+ - ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(VideoBookmarks)] + ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks)] VisibleChange Conditional Conditional - Conditional - Conditional + Conditional 145 45 256 @@ -411,10 +402,8 @@ Control.HasFocus(520) | Control.HasFocus(255) | ControlGroup(500).HasFocus - DepthOSD+ - videoplayer.isstereoscopic + ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)] + [Control.HasFocus(255) | ControlGroup(500).HasFocus | Control.HasFocus(520)] + videoplayer.isstereoscopic + ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)] + [Control.HasFocus(255) | ControlGroup(500).HasFocus | Control.HasFocus(520)] VisibleChange - Conditional Conditional 200 45 @@ -488,7 +477,7 @@ SubMenuBack-MiddleFO.png SubMenuBack-MiddleNF.png StereoModeToMono - StringCompare(System.StereoscopicMode,9) + StringCompare(System.StereoscopicMode,8) false diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VideoOverlay.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VideoOverlay.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VideoOverlay.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VideoOverlay.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,5 @@ + + + - + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsAddonBrowser.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsAddonBrowser.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsAddonBrowser.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsAddonBrowser.xml 2015-10-19 08:39:14.000000000 +0000 @@ -265,17 +265,17 @@ !IsEmpty(ListItem.Property(Addon.broken)) - 0 - 0 - 193 - 186 + 1 + 70 + 191 + 25 font13_title ffaa0000 black red center center - Conditional + 45 !IsEmpty(ListItem.Property(Addon.broken)) @@ -318,17 +318,17 @@ !IsEmpty(ListItem.Property(Addon.broken)) - 0 - 0 - 193 - 186 + 1 + 70 + 191 + 25 font13_title ffaa0000 black red center center - Conditional + 45 !IsEmpty(ListItem.Property(Addon.broken)) diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsFileMode.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsFileMode.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsFileMode.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsFileMode.xml 2015-10-19 08:39:14.000000000 +0000 @@ -201,7 +201,6 @@ Control.IsVisible(50) - DepthContent- 850 100 Control.IsVisible(50) diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsMusicLibrary.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsMusicLibrary.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsMusicLibrary.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsMusicLibrary.xml 2015-10-19 08:39:14.000000000 +0000 @@ -16,7 +16,7 @@ list 60 200 - Container.Content(Files) | Window.IsVisible(MusicPlaylist) | Container.Content(Songs) | Container.Content(Albums) + Window.IsVisible(MusicFiles) | Window.IsVisible(MusicPlaylist) | Container.Content(Songs) | Container.Content(Albums) 0 @@ -261,7 +261,6 @@ 0 450 - DepthContent- Container.Content(Albums) -80 @@ -314,7 +313,6 @@ - DepthContentPopout -2 16 168 @@ -328,7 +326,6 @@ unfocus - DepthContentPopout 180 325 35 @@ -347,7 +344,6 @@ - DepthContent 310 195 660 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsPictures.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsPictures.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsPictures.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsPictures.xml 2015-10-19 08:39:14.000000000 +0000 @@ -7,7 +7,6 @@ 0 440 - DepthContent+ -25 5 1330 @@ -45,7 +44,6 @@ - DepthContentPopout 15 40 160 @@ -59,7 +57,6 @@ unfocus - DepthContentPopout 25 50 140 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsPVRGuide.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsPVRGuide.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsPVRGuide.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsPVRGuide.xml 2015-10-19 08:39:14.000000000 +0000 @@ -31,6 +31,7 @@ 101 10 10 + 101 0 @@ -183,15 +184,7 @@ 16 16 PVR-HasTimer.png - ListItem.HasTimer + !ListItem.IsRecording + !ListItem.HasTimerSchedule - - - 6 - 28 - 16 - 16 - PVR-HasTimerSchedule.png - !ListItem.IsRecording + ListItem.HasTimerSchedule + ListItem.HasTimer + !ListItem.IsRecording 6 @@ -243,15 +236,7 @@ 16 16 PVR-HasTimer.png - ListItem.HasTimer + !ListItem.IsRecording + !ListItem.HasTimerSchedule - - - 6 - 28 - 16 - 16 - PVR-HasTimerSchedule.png - !ListItem.IsRecording + ListItem.HasTimerSchedule + ListItem.HasTimer + !ListItem.IsRecording 6 @@ -671,7 +656,6 @@ - DepthFooter Conditional Page Count Label 40 @@ -1050,7 +1034,6 @@ - DepthFooter Conditional Page Count Label 40 @@ -1376,7 +1359,6 @@ - DepthFooter Conditional Page Count Label 40 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsVideoLibrary.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsVideoLibrary.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsVideoLibrary.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsVideoLibrary.xml 2015-10-19 08:39:14.000000000 +0000 @@ -42,7 +42,6 @@ - DepthContentPopout -2 36 222 @@ -55,7 +54,6 @@ unfocus - DepthContentPopout 6 44 170 @@ -66,7 +64,6 @@ unfocus - DepthContentPopout 185 310 35 @@ -312,7 +309,6 @@ 0 460 - DepthContent- Container.Content(Movies) | Container.Content(TVShows) | Container.Content(Sets) -20 @@ -365,7 +361,6 @@ - DepthContentPopout -2 16 128 @@ -379,7 +374,6 @@ unfocus - DepthContentPopout 2 180 120 @@ -391,7 +385,6 @@ $VAR[PosterThumb] - DepthContentPopout 90 150 35 @@ -410,7 +403,6 @@ - DepthContent 310 185 660 @@ -1767,7 +1759,6 @@ VideoTypeHackFlaggingConditions - DepthContent+ 560 140 180 @@ -1817,7 +1808,6 @@ Skin.HasSetting(AutoScroll) - DepthContent+ 560 140 180 @@ -1867,7 +1857,6 @@ Skin.HasSetting(AutoScroll) - DepthContent+ 560 140 180 @@ -1932,7 +1921,6 @@ VideoTypeHackFlaggingConditions - DepthContent+ 420 140 330 diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsWeather.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsWeather.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/ViewsWeather.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/ViewsWeather.xml 2015-10-19 08:39:14.000000000 +0000 @@ -292,69 +292,188 @@ noop !Weather.IsFetched - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + $INFO[Window.Property(Day0.OutlookIcon)] + $INFO[Window.Property(Day0.HighTemp)] + $INFO[Window.Property(Day0.LowTemp)] + $INFO[Window.Property(Day0.Outlook)] + $INFO[System.TemperatureUnits] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Day0.Outlook)) + IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Day1.OutlookIcon)] + $INFO[Window.Property(Day1.HighTemp)] + $INFO[Window.Property(Day1.LowTemp)] + $INFO[Window.Property(Day1.Outlook)] + $INFO[System.TemperatureUnits] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Day1.Outlook)) + IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Day2.OutlookIcon)] + $INFO[Window.Property(Day2.HighTemp)] + $INFO[Window.Property(Day2.LowTemp)] + $INFO[Window.Property(Day2.Outlook)] + $INFO[System.TemperatureUnits] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Day2.Outlook)) + IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Day3.OutlookIcon)] + $INFO[Window.Property(Day3.HighTemp)] + $INFO[Window.Property(Day3.LowTemp)] + $INFO[Window.Property(Day3.Outlook)] + $INFO[System.TemperatureUnits] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Day3.Outlook)) + IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Day4.OutlookIcon)] + $INFO[Window.Property(Day4.HighTemp)] + $INFO[Window.Property(Day4.LowTemp)] + $INFO[Window.Property(Day4.Outlook)] + $INFO[System.TemperatureUnits] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Day4.Outlook)) + IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Day5.OutlookIcon)] + $INFO[Window.Property(Day5.HighTemp)] + $INFO[Window.Property(Day5.LowTemp)] + $INFO[Window.Property(Day5.Outlook)] + $INFO[System.TemperatureUnits] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Day5.Outlook)) + IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Day6.OutlookIcon)] + $INFO[Window.Property(Day6.HighTemp)] + $INFO[Window.Property(Day6.LowTemp)] + $INFO[Window.Property(Day6.Outlook)] + $INFO[System.TemperatureUnits] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Day6.Outlook)) + IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.1.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.1.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.1.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.1.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.1.OutlookIcon)] + $INFO[Window.Property(Daily.1.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.1.WindSpeed)] $INFO[Window.Property(Daily.1.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.1.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.2.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.2.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.2.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.2.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.2.OutlookIcon)] + $INFO[Window.Property(Daily.2.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.2.WindSpeed)] $INFO[Window.Property(Daily.2.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.2.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.3.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.3.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.3.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.3.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.3.OutlookIcon)] + $INFO[Window.Property(Daily.3.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.3.WindSpeed)] $INFO[Window.Property(Daily.3.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.3.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.4.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.4.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.4.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.4.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.4.OutlookIcon)] + $INFO[Window.Property(Daily.4.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.4.WindSpeed)] $INFO[Window.Property(Daily.4.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.4.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.5.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.5.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.5.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.5.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.5.OutlookIcon)] + $INFO[Window.Property(Daily.5.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.5.WindSpeed)] $INFO[Window.Property(Daily.5.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.5.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.6.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.6.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.6.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.6.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.6.OutlookIcon)] + $INFO[Window.Property(Daily.6.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.6.WindSpeed)] $INFO[Window.Property(Daily.6.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.6.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.7.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.7.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.7.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.7.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.7.OutlookIcon)] + $INFO[Window.Property(Daily.7.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.7.WindSpeed)] $INFO[Window.Property(Daily.7.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.7.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.8.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.8.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.8.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.8.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.8.OutlookIcon)] + $INFO[Window.Property(Daily.8.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.8.WindSpeed)] $INFO[Window.Property(Daily.8.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.8.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.9.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.9.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.9.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.9.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.9.OutlookIcon)] + $INFO[Window.Property(Daily.9.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.9.WindSpeed)] $INFO[Window.Property(Daily.9.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.9.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.10.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.10.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.10.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.10.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.10.OutlookIcon)] + $INFO[Window.Property(Daily.10.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.10.WindSpeed)] $INFO[Window.Property(Daily.10.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.10.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.11.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.11.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.11.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.11.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.11.OutlookIcon)] + $INFO[Window.Property(Daily.11.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.11.WindSpeed)] $INFO[Window.Property(Daily.11.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.11.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.12.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.12.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.12.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.12.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.12.OutlookIcon)] + $INFO[Window.Property(Daily.12.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.12.WindSpeed)] $INFO[Window.Property(Daily.12.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.12.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.13.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.13.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.13.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.13.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.13.OutlookIcon)] + $INFO[Window.Property(Daily.13.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.13.WindSpeed)] $INFO[Window.Property(Daily.13.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.13.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + + + + $INFO[Window.Property(Daily.14.HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.14.LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.14.Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.14.Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Daily.14.OutlookIcon)] + $INFO[Window.Property(Daily.14.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.14.WindSpeed)] $INFO[Window.Property(Daily.14.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Daily.14.Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) + @@ -374,7 +493,6 @@ Control.IsVisible(51) - DepthFooter Conditional number of files/pages 90 @@ -390,48 +508,6 @@ - - - - $INFO[Window.Property(Day$PARAM[item_id].OutlookIcon)] - $INFO[Window.Property(Day$PARAM[item_id].HighTemp)] - $INFO[Window.Property(Day$PARAM[item_id].LowTemp)] - $INFO[Window.Property(Day$PARAM[item_id].Outlook)] - $INFO[System.TemperatureUnits] - noop - Weather.IsFetched + !IsEmpty(Window.Property(Day$PARAM[item_id].Outlook)) + IsEmpty(Window.Property(Daily.IsFetched)) - - - - - - $INFO[Window.Property(Daily.$PARAM[item_id].HighTemperature),[COLOR=grey2]$LOCALIZE[419] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Daily.$PARAM[item_id].LowTemperature),[COLOR=grey2]$LOCALIZE[418] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.$PARAM[item_id].Precipitation),[COLOR=grey2]$LOCALIZE[33022] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Daily.$PARAM[item_id].Cloudiness),[COLOR=grey2]$LOCALIZE[387] :[/COLOR][B] ,[/B]] - resource://resource.images.weathericons.default/$INFO[Window.Property(Daily.$PARAM[item_id].OutlookIcon)] - $INFO[Window.Property(Daily.$PARAM[item_id].Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Daily.$PARAM[item_id].WindSpeed)] $INFO[Window.Property(Daily.$PARAM[item_id].WindDirection)] - noop - Weather.IsFetched + !IsEmpty(Window.Property(Daily.$PARAM[item_id].Outlook)) + !IsEmpty(Window.Property(Daily.IsFetched)) - - - - - - $INFO[Window.Property(Hourly.$PARAM[item_id].Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.$PARAM[item_id].FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.$PARAM[item_id].Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.$PARAM[item_id].Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] - resource://resource.images.weathericons.default/$INFO[Window.Property(Hourly.$PARAM[item_id].OutlookIcon)] - $INFO[Window.Property(Hourly.$PARAM[item_id].Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.$PARAM[item_id].WindSpeed)] $INFO[Window.Property(Hourly.$PARAM[item_id].WindDirection)] - noop - Weather.IsFetched + !IsEmpty(Window.Property(Hourly.$PARAM[item_id].Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) - - - - - - $INFO[Window.Property(Map.$PARAM[item_id].Legend)] - $INFO[Window.Property(Map.$PARAM[item_id].Area)] - $INFO[Window.Property(Map.$PARAM[item_id].Layer)] - noop - Weather.IsFetched + !IsEmpty(Window.Property(Map.$PARAM[item_id].Area)) + !IsEmpty(Window.Property(Map.IsFetched)) - - StringCompare(Window.Property(Weather.CurrentView),36hour) + !IsEmpty(Window.Property(36Hour.IsFetched)) @@ -483,7 +559,7 @@ 120 110 keep - resource://resource.images.weathericons.default/$INFO[Window.Property(36Hour.1.OutlookIcon)] + $INFO[Window.Property(36Hour.1.OutlookIcon)] 120 @@ -548,7 +624,7 @@ 120 110 keep - resource://resource.images.weathericons.default/$INFO[Window.Property(36Hour.2.OutlookIcon)] + $INFO[Window.Property(36Hour.2.OutlookIcon)] 120 @@ -613,7 +689,7 @@ 120 110 keep - resource://resource.images.weathericons.default/$INFO[Window.Property(36Hour.3.OutlookIcon)] + $INFO[Window.Property(36Hour.3.OutlookIcon)] 120 @@ -705,7 +781,7 @@ 130 160 keep - resource://resource.images.weathericons.default/$INFO[Window.Property(Weekend.1.OutlookIcon)] + $INFO[Window.Property(Weekend.1.OutlookIcon)] 140 @@ -792,7 +868,7 @@ 130 160 keep - resource://resource.images.weathericons.default/$INFO[Window.Property(Weekend.2.OutlookIcon)] + $INFO[Window.Property(Weekend.2.OutlookIcon)] 140 @@ -1007,78 +1083,198 @@ noop IsEmpty(Window.Property(Hourly.IsFetched)) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + $INFO[Window.Property(Hourly.1.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.1.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.1.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.1.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.1.OutlookIcon)] + $INFO[Window.Property(Hourly.1.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.1.WindSpeed)] $INFO[Window.Property(Hourly.1.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.1.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.2.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.2.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.2.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.2.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.2.OutlookIcon)] + $INFO[Window.Property(Hourly.2.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.2.WindSpeed)] $INFO[Window.Property(Hourly.2.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.2.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.3.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.3.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.3.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.3.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.3.OutlookIcon)] + $INFO[Window.Property(Hourly.3.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.3.WindSpeed)] $INFO[Window.Property(Hourly.3.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.3.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.4.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.4.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.4.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.4.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.4.OutlookIcon)] + $INFO[Window.Property(Hourly.4.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.4.WindSpeed)] $INFO[Window.Property(Hourly.4.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.4.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.5.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.5.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.5.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.5.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.5.OutlookIcon)] + $INFO[Window.Property(Hourly.5.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.5.WindSpeed)] $INFO[Window.Property(Hourly.5.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.5.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.6.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.6.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.6.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.6.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.6.OutlookIcon)] + $INFO[Window.Property(Hourly.6.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.6.WindSpeed)] $INFO[Window.Property(Hourly.6.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.6.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.7.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.7.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.7.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.7.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.7.OutlookIcon)] + $INFO[Window.Property(Hourly.7.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.7.WindSpeed)] $INFO[Window.Property(Hourly.7.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.7.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.8.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.8.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.8.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.8.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.8.OutlookIcon)] + $INFO[Window.Property(Hourly.8.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.8.WindSpeed)] $INFO[Window.Property(Hourly.8.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.8.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.9.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.9.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.9.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.9.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.9.OutlookIcon)] + $INFO[Window.Property(Hourly.9.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.9.WindSpeed)] $INFO[Window.Property(Hourly.9.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.9.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.10.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.10.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.10.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.10.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.10.OutlookIcon)] + $INFO[Window.Property(Hourly.10.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.10.WindSpeed)] $INFO[Window.Property(Hourly.10.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.10.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.11.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.11.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.11.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.11.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.11.OutlookIcon)] + $INFO[Window.Property(Hourly.11.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.11.WindSpeed)] $INFO[Window.Property(Hourly.11.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.11.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.12.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.12.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.12.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.12.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.12.OutlookIcon)] + $INFO[Window.Property(Hourly.12.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.12.WindSpeed)] $INFO[Window.Property(Hourly.12.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.12.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.13.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.13.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.13.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.13.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.13.OutlookIcon)] + $INFO[Window.Property(Hourly.13.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.13.WindSpeed)] $INFO[Window.Property(Hourly.13.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.13.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.14.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.14.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.14.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.14.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.14.OutlookIcon)] + $INFO[Window.Property(Hourly.14.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.14.WindSpeed)] $INFO[Window.Property(Hourly.14.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.14.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.15.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.15.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.15.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.15.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.15.OutlookIcon)] + $INFO[Window.Property(Hourly.15.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.15.WindSpeed)] $INFO[Window.Property(Hourly.15.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.15.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.16.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.16.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.16.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.16.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.16.OutlookIcon)] + $INFO[Window.Property(Hourly.16.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.16.WindSpeed)] $INFO[Window.Property(Hourly.16.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.16.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.17.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.17.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.17.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.17.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.17.OutlookIcon)] + $INFO[Window.Property(Hourly.17.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.17.WindSpeed)] $INFO[Window.Property(Hourly.17.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.17.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.18.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.18.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.18.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.18.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.18.OutlookIcon)] + $INFO[Window.Property(Hourly.18.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.18.WindSpeed)] $INFO[Window.Property(Hourly.18.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.18.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.19.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.19.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.19.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.19.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.19.OutlookIcon)] + $INFO[Window.Property(Hourly.19.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.19.WindSpeed)] $INFO[Window.Property(Hourly.19.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.19.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.20.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.20.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.20.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.20.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.20.OutlookIcon)] + $INFO[Window.Property(Hourly.20.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.20.WindSpeed)] $INFO[Window.Property(Hourly.20.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.20.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.21.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.21.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.21.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.21.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.21.OutlookIcon)] + $INFO[Window.Property(Hourly.21.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.21.WindSpeed)] $INFO[Window.Property(Hourly.21.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.21.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.22.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.22.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.22.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.22.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.22.OutlookIcon)] + $INFO[Window.Property(Hourly.22.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.22.WindSpeed)] $INFO[Window.Property(Hourly.22.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.22.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.23.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.23.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.23.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.23.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.23.OutlookIcon)] + $INFO[Window.Property(Hourly.23.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.23.WindSpeed)] $INFO[Window.Property(Hourly.23.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.23.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + + + + $INFO[Window.Property(Hourly.24.Temperature),[COLOR=grey2]$LOCALIZE[401] :[/COLOR][B] ,[/B]] $INFO[Window.Property(Hourly.24.FeelsLike),[COLOR=grey2]$LOCALIZE[402] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.24.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR]$INFO[Window.Property(Hourly.24.Precipitation),[COLOR=grey2]$LOCALIZE[1448] :[/COLOR][B] ,[/B]] + $INFO[Window.Property(Hourly.24.OutlookIcon)] + $INFO[Window.Property(Hourly.24.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]][CR][COLOR=grey2]$LOCALIZE[383]: [/COLOR]$INFO[Window.Property(Hourly.24.WindSpeed)] $INFO[Window.Property(Hourly.24.WindDirection)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Hourly.24.Outlook)) + !IsEmpty(Window.Property(Hourly.IsFetched)) + @@ -1099,7 +1295,6 @@ Control.IsVisible(52) - DepthFooter Conditional number of files/pages 40 @@ -1251,21 +1446,46 @@ - - - - - - - - - - - - - - - + + + $INFO[Window.Property(Map.1.Legend)] + $INFO[Window.Property(Map.1.Area)] + $INFO[Window.Property(Map.1.Layer)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Map.1.Area)) + !IsEmpty(Window.Property(Map.IsFetched)) + + + + $INFO[Window.Property(Map.2.Legend)] + $INFO[Window.Property(Map.2.Area)] + $INFO[Window.Property(Map.2.Layer)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Map.2.Area)) + !IsEmpty(Window.Property(Map.IsFetched)) + + + + $INFO[Window.Property(Map.3.Legend)] + $INFO[Window.Property(Map.3.Area)] + $INFO[Window.Property(Map.3.Layer)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Map.3.Area)) + !IsEmpty(Window.Property(Map.IsFetched)) + + + + $INFO[Window.Property(Map.4.Legend)] + $INFO[Window.Property(Map.4.Area)] + $INFO[Window.Property(Map.4.Layer)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Map.4.Area)) + !IsEmpty(Window.Property(Map.IsFetched)) + + + + $INFO[Window.Property(Map.5.Legend)] + $INFO[Window.Property(Map.5.Area)] + $INFO[Window.Property(Map.5.Layer)] + noop + Weather.IsFetched + !IsEmpty(Window.Property(Map.5.Area)) + !IsEmpty(Window.Property(Map.IsFetched)) + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VisualisationPresetList.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VisualisationPresetList.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/720p/VisualisationPresetList.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/720p/VisualisationPresetList.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,163 @@ + + + 5 + + 1 + 240 + 60 + + dialogeffect + + + + background image + 0 + 0 + 800 + 600 + DialogBack2.png + + + Dialog Header image + 40 + 16 + 720 + 40 + dialogheader.png + + + header label + 40 + 20 + 720 + 30 + font13_title + center + center + selected + black + + + Close Window button + 710 + 15 + 64 + 32 + + - + PreviousMenu + DialogCloseButton-focus.png + DialogCloseButton.png + 5 + 5 + 5 + 5 + system.getbool(input.enablemouse) + + + No Settings Label + 20 + 180 + 760 + center + + font13 + + + 40 + 60 + 720 + 495 + 60 + 60 + 5 + 5 + 60 + 200 + + + 0 + 0 + 720 + 40 + button-nofocus.png + + + 10 + 0 + 700 + 40 + font13 + grey2 + selected + left + center + + + + + + 0 + 0 + 720 + 40 + button-nofocus.png + !Control.HasFocus(5) + VisibleFadeEffect + + + 0 + 0 + 720 + 40 + button-focus2.png + Control.HasFocus(5) + VisibleFadeEffect + + + 10 + 0 + 700 + 40 + font13 + white + selected + left + center + + + + + + 760 + 60 + 25 + 495 + ScrollBarV.png + ScrollBarV_bar.png + ScrollBarV_bar_focus.png + ScrollBarNib.png + ScrollBarNib.png + 5 + 5 + 60 + 60 + false + vertical + + + number of files/pages in list text label + 460 + 548 + 300 + 35 + font12 + right + center + true + grey + + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/addon.xml kodi-15.2~git20151019.1039-final/addons/skin.confluence/addon.xml --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/addon.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/addon.xml 2015-10-19 08:39:14.000000000 +0000 @@ -1,11 +1,11 @@ - + - Confluence oortreksel deur Jezz_X. (Kodi se standaard tema) + Confluence tema deur Jezz_X. (Kodi se standaard tema) جلد "كونفليونس" من صنع Jezz_x. (الجلد المبدأى لبرنامج إكس بى إم سى) Confluence skin by Jezz_X. (Kodi's default skin) Confluence облик от Jezz_X. (стандартния облик за Kodi) Pell Confluence, per Jezz_X. (Pell per defecte del Kodi) Vzhled Confluence od Jezz_X. (výchozí vzhled Kodi) Croen Confluence gan Jezz_X. (Croen rhagosodedig Kodi) - Confluence-tema af Jezz_X. (Kodis standardtema) + Confluence skin af Jezz_X. (Kodi's standardskin) Confluence Skin von Jezz_X. (Standard-Skin von Kodi) Το κέλυφος Confluence από τον Jezz_X (προεπιλεγμένο κέλυφος του Kodi). Confluence skin by Jezz_X. (Kodi's default skin) @@ -51,12 +51,11 @@ Confluence apvalks no Jeez_X. (Kodi noklusētais apvalks) Confluence skin by Jezz_X. (Kodi's default skin) Penyatuan, kulit daripada Jezz_X. (Kulit lalai Kodi) - Dehra Confluence magħmula minn Jezz_X. (Id-dehra normali ta' Kodi) Confluence-skall av Jezz_X. (Kodis standardskall) Confluence skin door Jezz_X. (Kodi's standaard skin) Confluence autorstwa Jezz_X (domyślna skóra Kodi) Skin Confluence por Jezz_X. (Skin padrão do Kodi) - Tema Confluence por Jezz_X (tema padrão do Kodi) + Tema "Confluence" por Jezz_X. (Tema predefinido do Kodi) Costum Confluence de Jezz_X. (costum implicit pentru Kodi) Обложка Confluence (стандартная обложка Kodi). Автор: Jezz_X. Confluence skin od Jezz_X. (predvolený skin Kodi) @@ -73,7 +72,7 @@ Giao diện Confluence bởi Jezz_X. (Giao diện mặc định của Kodi) Jezz_X 开发的 Confluence 皮肤(Kodi 的默认皮肤)。 Jezz_X 製作的佈景主題(Kodi的預設佈景主題) - Confluence is die standaard oortreksel vir Kodi 9.11 en op. Dit is 'n kombinasie van konsepte van 'n klomp gewilde oortreksels, en 'n poging om hulle goeie idees te omvat en te integreer in 'n oortreksel wat maklik behoort te wees vir eerste keer Kodi gebruikers om te verstaan en te gebruik. + Confluence is die standaard tema vir Kodi 9.11 en op. Dit is 'n kombinasie van konsepte van 'n klomp gewilde temas, en 'n poging om hulle goeie idees te omvat en te integreer in 'n tema wat maklik behoort te wees vir eerste keer Kodi gebruikers om te verstaan en te gebruik. "كونفليونس" هو الجلد المبدأى لبرنامج إكس بى إم سى اﻹصدار 9.11 وما فوق. هو خلط بين اشهر اﻷجلده الاخرى معاً ومحاوله لتبنى ودمج افكارهم للخروج بِنِتَاج يُفترض به ان يكون سهل اﻹستيعاب بمجرد النظر لمستخدمى إكس بى إم سى المبتدئين. Confluence is the default skin for Kodi 9.11 and above. It is a combination of concepts from many popular skins, and attempts to embrace and integrate their good ideas into a skin that should be easy for first time Kodi users to understand and use. Confluence е стандартният облик на Kodi 9.11 и по-новите версии. Представлява смесица от концепциите на много от популярните облици. Целта е да се интегрират тези добри идеи в подходящ и удобен вид за хора, които се сблъскват за първи път с Kodi. @@ -82,7 +81,7 @@ Confluence yw croen rhagosodedig Kodi 9.11 ac uwch. Mae'n gyfuniad o gysyniadau o nifer o grwyn poblogaidd ac mae'n ymdrechu i gyfuno eu syniadau da hwy i groen ddylai fod yn hawdd i ddefnyddiwr cyntaf Kodi ei deall a'i ddefnyddio. Confluence er standardskin'et til Kodi 9.11 og senere versioner. Det er en kombination af koncepter fra mange populære skins, og det forsøger at omfavne og integrere de gode ideer i et skin, der er let for førstegangsbrugere af Kodi at forstå og bruge. Confluence ist der Standardskin ab Kodi 14.0. Er ist eine Kombination mehrerer unterschiedlicher Skin-Konzepte und versucht dabei, die besten Ideen zu kombinieren, um einen einfachen Einstieg für neue Kodi-Nutzer zu ermöglichen. - Το Confluence είναι η προεπιλεγμένη αμφίεση για τις εκδόσεις Kodi 14.0 και άνω. Είναι ένας συνδυασμός από πολλές δημοφιλής αμφιέσεις, και επιχειρεί να παρέχει τις καλύτερες ιδέες τους σε μία αμφίεση, το οποίο είναι εύκολο για τους αρχάριους χρήστες του Kodi να κατανοήσουν και να χρησιμοποιήσουν. + Το Confluence είναι το προεπιλεγμένο κέλυφος για τις εκδόσεις Kodi 9.11 και άνω. Είναι ένας συνδυασμός από πολλά δημοφιλή κελύφη, και επιχειρεί να συμπεριλάβει τις καλύτερες ιδέες τους σε ένα κέλυφος το οποίο είναι εύκολο σε αρχάριους χρήστες του Kodi να κατανοήσουν και χρησιμοποιήσουν. Confluence is the default skin for Kodi 9.11 and above. It is a combination of concepts from many popular skins, and attempts to embrace and integrate their good ideas into a skin that should be easy for first time Kodi users to understand and use. Confluence is the default skin for Kodi 14.0 and above. It is a combination of concepts from many popular skins, and attempts to embrace and integrate their good ideas into a skin that should be easy for first time Kodi users to understand and use. Confluence is the default skin for Kodi 9.11 and above. It is a combination of concepts from many popular skins, and attempts to embrace and integrate their good ideas into a skin that should be easy for first time Kodi users to understand and use. @@ -95,13 +94,13 @@ Confluence on oletusulkoasu Kodi:n versiosta 9.11 lähtien. Se on yhdistelmä useiden suosittujen ulkoasujen konsepteista, ja yritys omaksua ja integroida heidän hyvät ideat ulkoasuun, jonka pitäisi olla helppokäyttöinen ja -tajuinen kaikille Kodi:n käyttäjille. Confluence er vanliga útsjóndin, sum er brúkt í Kodi síðan útg. 9.11. Hetta er ein samansjóðan av fleiri hugtøkum. Ætlanin er at útsjóndin skal lætta um móttøku og nýtslu av Kodi fyri nýggjar brúkarar. Confluence est l'habillage par défaut pour Kodi 9.11 et ultérieur. C'est une combinaison des concepts issus de plusieurs habillages populaires et une tentative d'inclure et d'intégrer leurs bonnes idées en un habillage qui devrait être facile à comprendre et à utiliser pour les utilisateurs débutants de Kodi. - Confluence est l'habillage prédéfini depuis Kodi 14.0. Reprenant les concepts issus de plusieurs habillages populaires, il est une tentative d'inclusion et d'intégration des meilleures idées afin de créer un habillage d'interface qui soit facile à comprendre et à utiliser pour les personnes découvrant Kodi. + Confluence est l'habillage prédéfini depuis Kodi 14.0. Reprenant les concepts issus de plusieurs thèmes populaires, il est une tentative d'inclusion et d'intégration des meilleures idées afin de créer un habillage qui soit facile à comprendre et à utiliser pour les personnes découvrant Kodi. Confluence é a pel predeterminada para Kodi 9.11 e posteriores. É unha combinación de conceptos de algunhas peles populares, e tenta abranguer e integrar as súas mellores ideas nunha pel que sexa fácil de entender e utilizar para as usuarias que utilizan por primeira vez Kodi. המעטפת Confluence היא מעטפת ברירת המחדל של Kodi. המעטפת הינה תוצר של אימוץ מאפיינים ממעטפות פופולריות רבות תוך רצון לשלב מאפיינים אלה למעטפת פשוטה לשימוש ולהכרה ראשונית ע"י משתמשי Kodi חדשים. Confluence je uobičajena presvlaka za Kodi 14.0 naviše. To je mješavina koncepta iz mnogih drugih popularnih presvlaka, pokušaj da se objedine njihove dobre osobine u presvlaku i da budu lagane za upotrebu i razumljive novim Kodi korisnicima. A Confluence az alapértelmezett felszín a Kodihoz a 9.11-es verziótól kezdődően. Merít sok sok népszerű felszín elképzeléséből, megpróbálva vegyíteni a jó ötleteket úgy, hogy az könnyen kezelhető legyen a Kodival először találkozóknak is. Confluence merupakan skin bawaan untuk Kodi 9.11 dan selanjutnya. Merupakan kombinasi konsep dari beberapa skin populer, dan berusaha untuk merangkul dan menyatukan ide bagus mereka ke sebuah skin yang mudah dipakai dan dipahami oleh pengguna Kodi pertama kali. - Confluence er sjálfgefið útlit Kodi 14.0 og nýrra. Það er samsetning hugmynda frá mörgum vinsælum útlitum og er tilraun til að fanga og innlima þær góðu hugmyndir í útlit sem sé einfalt fyrir fyrir nýja Kodi notendur að skilja og nota + Confluence er sjálfgefið útlit Kodi 9.11 og nýrra. Það er samsetning hugmynda frá mörgum vinsælum útlitum og er tilraun til að fanga og innlima þær góðu hugmyndir í útlit þar sem hugmyndin er að skuli vera einfalt fyrir fyrir nýja Kodi notendur að skilja og nota Confluence è la skin predefinita di Kodi dalla versione 14.0 in poi. È una combinazione di elementi provenienti da altre skin popolari e cerca di integrare e coinvolgere tutte le loro grandi idee in una skin facile da usare e comprendere per l'utente inesperto di Kodi. Confluence は Kodi 9.11 およびそれ以上のバージョンで標準のスキンです。さまざまな人気のスキンのコンセプトを組み合わせ、ユーザが初めて Kodi に触れる際に便利に使えるようにしてあります。 Confluence 는 Kodi 14.0 이상을 위한 기본 스킨입니다. 많은 인기 스킨의 컨셉과 좋은 아이디어를 모아서 하나의 스킨으로 만들었으며 초보자도 사용하기 쉽습니다. @@ -109,18 +108,17 @@ Confluence ir Kodi 9.11 un jaunāku versiju noklusētais apvalks. Tajā apvienota daudzu populāru apvalku koncepcija un centieni pieņemt un integrēt labākās idejas, lai jaunajiem Kodi ietotājiem to būtu viegli izprast un lietot. Confluence е основниот изглед на Kodi 14.0 и нагоре. Тој е комбинација на концепти од повеќе популарни изгледи, и настојува да ги обедини и истакне нивните добри идеи во еден изглед разбирлив за почетници. Penyatuan ialah kulit lalai untuk Kodi 9.11 dan ke atas. Ia merupakan gabungan konsep dari pelbagai kulit terkenal, dan berusaha untuk merangkumkan dan menyepadukan idea baik kulit-kulit tersebut menjadi satu kulit yang mudah difahami dan digunakan oleh pengguna baru Kodi . - Confluence hija d-dehra normali ta' Kodi 14.0 il-fuq. Hija taħlita ta' kunċetti minn ħafna dehriet popolari, u tipporva tgħaqqad u tintegra l-aqwa ideat tagħhom f'dehra li għandha tkun faċli biex jifmuha u jużawha dawk l-utenti li qed jużaw Kodi għall-ewwel darba. Confluence er standardskallet for Kodi 9.11 og oppover. Det er en kombinasjon av konseptene fra mange populære skall, og prøver å omfavne og integrere de gode idéene i et skall som bør være lett å forstå og benytte seg av for nye Kodi-brukere. Confluence is de standaard skin voor Kodi 15.0 en hoger. Het combineert de concepten van andere populaire skins, waarbij het tracht hun goede ideeën te integreren in een skin die gemakkelijk in gebruik is. Confluence jest domyślną skóra dla Kodi w wersji 14.0 lub nowszych. Jest kombinacją pomysłów z wielu popularnych skór i próbą zawarcia tego, co w nich najlepsze w skórze, która będzie łatwa do opanowania dla początkującego użytkownika. Confluence é a skin padrão do Kodi 9.11 e acima. É uma combinação de conceitos das mais populares skins, visando abraçar e integrar as boas ideias em uma skin que seja fácil de entender e usar, destinada aos usuários iniciantes do Kodi. - O tema "Confluence" é o tema padrão do Kodi 14.0 e superior. É uma combinação de conceitos a partir de muitos temas populares e tenta integrar as boas ideias dos mesmos, num tema que deverá ser fácil de entender e utilizar pelos novos utilizadores do Kodi. + O tema "Confluence" é o tema predefinido do Kodi 9.11 e superior. É uma combinação de conceitos a partir de muitos temas populares e tenta integrar as boas ideias dos mesmos, num tema que deverá ser fácil de entender e utilizar para os novos utilizadores do Kodi. Confluence este costumul implicit pentru Kodi 9.11 și versiunile ulterioare. Este o combinație de concepte împrumutate de la mai multe costume populare, care încearcă să îmbrățișeze și să integreze ideile lor bune într-un costum care să fie ușor de înțeles și folosit de către utilizatorii Kodi începători. Confluence — это стандартная обложка Kodi, начиная с версии 9.11. Она представляет собой сочетание концепций, взятых из многих популярных обложек, в попытке интегрировать их удачные идеи в обложке, которая была бы простой для использования и понимания новыми пользователями Kodi. Confluence je predvolený pre Kodi 9.11 a vyššie. Je kombináciou konceptov z mnoho populárnych skinov a pokusom integrovať ich dobré nápady do skinu, ktorý by bol ľahko zrozumiteľný a použiteľný pre nových používateľov Kodi. Confluence je privzeta preobleka za Kodi 14.0 in novejše. Je kombinacija konceptov mnogih priljubljenih preoblek in poskuša zaobjeti in integrirati njihove dobre ideje v preobleko, ki bi bila preprosta za uporabo in razumevanje tudi novim uporabnikom. Confluence është maska kryesore për Kodi 9.11 dhe verzionet më të lartë. Është nje kombinim nga shumë maska e popullarizuar dhe përpjeket për të përqafuar dhe integruar idetë më të mira në një maskë që të jetë sa më lehtë në përdorim dhe kuptim për përdoruasit duke e përdorur Kodi për herë të parë. - Confluence је подразумевана маска за Kodi 14.0 и навише. То је мешавина концепата из многих других популарних маски, и покушај да се обједине њихове добре идеје у маску која би трабала да буде лака за разумевање и употребу новим корисницима Kodi-а. + Confluence је подразумевана маска за Kodi 14.0 и навише. То је мешавина концепата многих популарних маски, и покушај да се обједине њихове добре идеје у маску која би требала да буде лака за разумевање и употребу новим корисницима Kodi-а. Confluence je podrazumevana maska za Kodi 14.0 i naviše. To je mešavina koncepata iz mnogih drugih popularnih maski, i pokušaj da se objedine njihove dobre ideje u masku koja bi trabala da bude laka za razumevanje i upotrebu novim korisnicima Kodi-a. Confluence är standardskal för Kodi 14.0 och senare. Det kombinerar koncept från många populära skal och försöker återanvända och integrera goda idéer för att skapa ett skal som är enkelt att förstå och använda för nya Kode-användare. Confluence to je wychodnŏ skōra dlŏ Kodi 14.0 i nowszych. To je miszōng kōnceptōw ze mocki popularnych skōr i prōbuje te nŏjlepsze wkludzić do skōry, kerŏ winnŏ być prostŏ we użyciu i spokopiyniu dlŏ nowych używŏczōw Kodi. @@ -131,7 +129,7 @@ Confluence là giao diện mặc định cho Kodi 9.11 and các phiên bản trở về trước. Đây là sự kết hợp các khái niệm đến từ các giao diện khác nhau nhằm hướng người dùng đến sự đơn giản và dễ sử dụng. Confluence 是 Kodi 14.0 的默认皮肤。它集合了许多流行皮肤的创意,力求把这些优点融合到一个皮肤中,使得首次使用 Kodi 的用户能更容易上手。 Confluence 是從 Kodi 9.11 開始預設的佈景主題。它結合了許多受歡迎的佈景主題的概念,且試圖包含並整合它們的優點,使第一次使用 Kodi 的使用者可以簡單地上手。 - Confluence is die standaard oortreksel vir Kodi, verwydering mag probleme veroorsaak + Confluence is die standaard tema vir Kodi, verwydering mag probleme veroorsaak "كونفليونس" هو الجلد المبدأى لبرنامج إكس بى إم سى وإزالته قد تسبب مشاكل Confluence is the default skin for Kodi, removing it may cause issues Confluence е стандартният облик на Kodi. Премахването му може да предизвика проблеми @@ -140,7 +138,7 @@ Confluence yw croen rhagosodedig Kodi, gall ei dynnu achosi anhawsterau Confluence er standardskin'et til Kodi. Fjernes det, kan der opstå problemer Confluence ist der Standard-Skin für Kodi. Die Deinstallation kann zu unerwünschten Nebeneffekten führen. - Το Confluence είναι η προεπιλεγμένη αμφίεση για το Kodi, η αφαίρεσή του μπορεί να δημιουργήσει προβλήματα + Το Confluence είναι το προεπιλεγμένο κέλυφος για το Kodi, η αφαίρεσή του μπορεί να δημιουργήσει προβλήματα Confluence is the default skin for Kodi, removing it may cause issues Confluence is the default skin for Kodi, removing it may cause issues Confluence is the default skin for Kodi, removing it may cause issues @@ -154,31 +152,30 @@ Confluence er vanliga útsjónding brúkt av Kodi. Strikan kann viðføra brek. Confluence est l'habillage par défaut de Kodi, le supprimer peut créer des problèmes Confluence est l'habillage prédéfini de Kodi, le supprimer peut créer des problèmes - Confluence é a pel predefinida para Kodi e eliminala pode causar problemas. + Confluence é a pel predefinida para Kodi e eliminala pode causas problemas. המעטפת Confluence היא מעטפת ברירת המחדל של Kodi, הסרתה עלולה לגרום לתקלות Confluence je uobičajena presvlaka za Kodi, njegovim uklanjanjem može uzrokovati poteškoće. A Confluence az alapértelmezett Kodi felszín. Eltávolítása problémákat okozhat. Confluence merupakan skin bawaan untuk Kodi, menghapusnya mungkin menyebabkan permasalahan Confluence er sjálfgefið útlit Kodi, það getur orsakað vandamál að fjarlægja það. - Confluence è la skin predefinita di Kodi, rimuoverla potrebbe comportare dei problemi + Confluence è la Skin predefinita di Kodi, rimuoverla potrebbe comportare dei problemi Confluence は Kodi のデフォルトスキンですので、これを削除するとうまく動かなくなる可能性があります Confluence는 Kodi의 기본스킨으로 제거시 문제가 생길 수 있습니다. Confluence yra numatytoji Kodi teminė išvaizda, jos pašalinimas gali sukelti problemų Confluence ir Kodi noklusētais apvalks, dzēšot to, var rasties problēmas Confluence е основната маска, бришењето може да предизвика проблеми Penyatuan ialah kulit lalai Kodi, mengubahnya boleh menimbulkan isu. - Confluence hija d-dehra normali ta' Kodi, jekk tneħħiha jaf ikollok il-problemi. Confluence er standardskallet for Kodi, å fjerne det kan skape problemer Confluence is de standaard Kodi skin, het verwijderen van Confluence kan leiden tot problemen. Confluence jest domyślną skórą Kodi. Jej usunięcie może powodować problemy. Confluence é a skin padrão do Kodi, removê-la pode lhe causar problemas. - O tema "Confluence" é o tema padrão do Kodi e removê-lo pode causar problemas. + O tema "Confluence" é o tema predefinido do Kodi, e removê-lo pode causar problemas. Confluence este costumul implicit pentru Kodi, dacă îl eliminați pot apărea probleme! Confluence — это стандартная обложка Kodi, и ее удаление может привести к возникновению проблем Confluence je predvolený skin pre Kodi, jeho odstránenie môže spôsobiť problémy Confluence je privzeta preobleka za Kodi, njena odstranitev lahko povzroči težave Confluence është maska kryesore së Kodi, fshirja e saj mund të shkaktoj çështje. - Confluence је подразумевана маска за Kodi, њено уклањање може изазвати проблеме + Confluence је подразумевана маска за Kodi, њено уклањање може направити проблеме Confluence je podrazumevana maska za Kodi, njeno uklanjanje može izazvati probleme Confluence är standardskal för Kodi. Att ta bort detta skal kan skapa problem. Confluence to je wychodnŏ skōra we Kodi, a wyciepniyńciy jij może sprŏwić niyprzileżytości. diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/changelog.txt kodi-15.2~git20151019.1039-final/addons/skin.confluence/changelog.txt --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/changelog.txt 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/changelog.txt 2015-10-19 08:39:14.000000000 +0000 @@ -1,32 +1,4 @@ -[B]2.8.8[/B] - -- Updated language files from Transifex - -[B]2.8.7[/B] - -- Updated language files from Transifex - -[B]2.8.6[/B] - -- Updated language files from Transifex - -[B]2.8.5[/B] - -- Updated language files from Transifex - -[B]2.8.4[/B] - -- Updated language files from Transifex - -[B]2.8.3[/B] - -- Updated language files from Transifex - -[B]2.8.2[/B] - -- Updated language files from Transifex - -[B]2.8.1[/B] +[B]2.7.4[/B] - Updated language files from Transifex Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.af_za/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.af_za/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.af_za/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.af_za/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,21 +16,9 @@ "Language: af_ZA\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Verander jou" - -msgctxt "#31003" -msgid "Power options" -msgstr "Krag opsies" - msgctxt "#31004" msgid "Working..." -msgstr "Werk..." - -msgctxt "#31005" -msgid "Hide information" -msgstr "Versteek inligting" +msgstr "Besig..." msgctxt "#31006" msgid "View options" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "Volskerm" -msgctxt "#31009" -msgid "Total duration" -msgstr "Totale tydsduur" - msgctxt "#31022" msgid "Music - Files" msgstr "Musiek - Lêers" @@ -58,31 +42,15 @@ msgctxt "#31025" msgid "Items" -msgstr "Items" - -msgctxt "#31026" -msgid "Misc options" -msgstr "Diverse opsies" +msgstr "Voorwerpe" msgctxt "#31027" msgid "Location" msgstr "Ligging" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Plakkaat omvouing" - msgctxt "#31029" msgid "Fanart" -msgstr "Ondersteunerkuns" - -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Prent naeldrukke" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Prent omvouing" +msgstr "Aanhanger Kuns" msgctxt "#31033" msgid "Info" @@ -92,37 +60,29 @@ msgid "Actions" msgstr "Aksies" -msgctxt "#31040" -msgid "Now playing" -msgstr "Speel nou" - msgctxt "#31042" msgid "PLAYING" msgstr "SPEEL" msgctxt "#31043" msgid "PAUSED" -msgstr "GEPOUSEER" +msgstr "POUSEER" msgctxt "#31044" msgid "FAST FORWARD" -msgstr "VINNIG VORENTOE" +msgstr "SPEEL VINNIG VORENTOE" msgctxt "#31045" msgid "REWIND" -msgstr "TERUGDRAAI" +msgstr "SPEEL AGTERUIT" msgctxt "#31046" msgid "SEEKING" msgstr "SOEK" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Visualisering voorafinstellings" - msgctxt "#31049" msgid "End time" -msgstr "Eind tyd" +msgstr "End tyd" msgctxt "#31050" msgid "Sort: Ascending" @@ -154,11 +114,7 @@ msgctxt "#31060" msgid "This file is stacked, select the part you want to play from." -msgstr "Hierdie lêer is gestapel, selekteer die deel van waar af jy wil speel." - -msgctxt "#31061" -msgid "Current selected" -msgstr "Huidiglik geselekteer" +msgstr "Hierdie lêer is gestapel, selekteer die deel van waar jy wil speel." msgctxt "#31101" msgid "Home screen options" @@ -168,33 +124,17 @@ msgid "Background" msgstr "Agtergrond" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Wys \"Gepouseer\" in prent skyfievertoning" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Speel lokprente in 'n venster [COLOR=grey3](Video inligting dialoog alleenlik)[/COLOR] " - msgctxt "#31106" msgid "Miscellaneous options" -msgstr "Diverse opsies" - -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Versteek vlae gelees van video lêername [COLOR=grey3](bv. Blu-ray, HD-DVD)[/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Versteek hoof kieslys knoppies" +msgstr "Diverse Opsies" msgctxt "#31109" msgid "Enable custom background" -msgstr "Stel pasgemaakte agtergrond in staat" +msgstr "Stel verpersoonlikte agtergrond in staat" msgctxt "#31110" msgid "Background path:" -msgstr "Agtergrond pad:" +msgstr "Agtergrond soeklys:" msgctxt "#31111" msgid "Hide" @@ -204,65 +144,25 @@ msgid "Options" msgstr "Opsies" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Wys onlangs bygevoegde albums" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Wys onlangs bygevoegde videos" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Tuis bladsy programme subkieslys" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Versteek agtergrond ondersteunerkuns" - -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Versteek EPG as RDS teenwoordig is op kanaal venster" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Wys agtergrond \"Speel nou\" video" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Wys agtergrond \"Speel nou\" visualisering" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Speel TV tema musiek in video lys (TvTunes byvoegsel)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvMelodie" msgctxt "#31128" msgid "Lyrics" msgstr "Lirieke" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Versteek ondersteunerkuns in vol skerm visualisering " - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Lirieke byvoegsel" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Tuis bladsy \"Videos\" subkieslys" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Tuis bladsy \"Musiek\" subkieslys" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Tuis bladsy \"Prente\" subkieslys" - msgctxt "#31140" msgid "Music OSD" -msgstr "Musiek OSD" +msgstr "Musiek OSV" msgctxt "#31141" msgid "Video OSD" -msgstr "Video OSD" +msgstr "Video OSV" msgctxt "#31142" msgid "Settings level" @@ -272,90 +172,22 @@ msgid "Shortcuts" msgstr "Kortpaaie" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Kies jou liedjie" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Lirieke bron" - msgctxt "#31206" msgid "Found" msgstr "Gevind" -msgctxt "#31207" -msgid "Find more items" -msgstr "Vind meer items" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Opkomende episodes" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Huidige temperatuur" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Laas opgedateer" - msgctxt "#31303" msgid "Data provider" msgstr "Data verskaffer" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Versteek ondersteunerkuns" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Fliek besonderhede" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Geheue gebruik:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Snit nommer" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" -msgstr "Ondersteunerkuns prent[CR][CR]Nie beskikbaar[CR][CR] Kliek knoppie om te stel" - -msgctxt "#31312" -msgid "Current scraper" -msgstr "Huidige skraper" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Kies 'n skraper" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Inhoud deursoek opsies" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Stel ondersteunerkuns pad" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Geselekteerde profiel" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Laas ingeteken" +msgstr "Aanhanger kuns prentjie[CR][CR]Nie beskikbaar[CR][CR] Kliek knoppie om te stel" msgctxt "#31322" msgid "Aired" msgstr "Uitgesaai" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Speellys opsies" - msgctxt "#31326" msgid "Created" msgstr "Geskep" @@ -364,21 +196,9 @@ msgid "Resolution" msgstr "Resolusie" -msgctxt "#31328" -msgid "Recently added" -msgstr "Onlangs bygevoeg" - msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" -msgstr "[B]Tydhouer gestel![/B] [COLOR=grey2] - Outomatiese stelsel afskakeling in[/COLOR]" - -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Kliek knoppie om[CR][CR]lokprent te speel" - -msgctxt "#31331" -msgid "Album details" -msgstr "Album besonderhede" +msgstr "[B]Tydhouer gestel![/B] [COLOR=grey2] - Stelsel automatiese afskakeling in[/COLOR]" msgctxt "#31351" msgid "Pause" @@ -388,41 +208,29 @@ msgid "Stop" msgstr "Stop" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Vinnig vorentoe" - msgctxt "#31354" msgid "Rewind" -msgstr "Terugdraai" +msgstr "Speel Agteruit" msgctxt "#31355" msgid "Movie menu" -msgstr "Fliek kieslys" - -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Laai onderskrifte af" +msgstr "Rolprent kieslys" msgctxt "#31360" msgid "Watch as 2D" -msgstr "Kyk as 2D" +msgstr "Kyk in 2D" msgctxt "#31361" msgid "Change mode" -msgstr "Verander modus" +msgstr "Verander wyse" msgctxt "#31362" msgid "Enabled" -msgstr "In staat gestel" +msgstr "Geaktifeer" msgctxt "#31390" msgid "Skin default" -msgstr "Verstek oortreksel" - -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Verstek oortreksel met geen hoofletters" +msgstr "Standaard tema" msgctxt "#31392" msgid "Arial based" @@ -430,47 +238,27 @@ msgctxt "#31400" msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver" -msgstr "[B]STEL VOORKOMS VERSTELLINGS OP[/B][CR][CR]Verander die oortreksel · Stel taal en streek · Verander lêer lyste opsies[CR]Stel 'n skermskut op" +msgstr "[B]KONFIGUREER VOORKOMS VERSTELLINGS[/B][CR][CR]Verander die tema · Stel taal en streek · Verander lêer lyste opsies[CR]Stel 'n skermskut op" msgctxt "#31401" msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" -msgstr "[B]STEL VIDEO VERSTELLINGS OP[/B][CR][CR]Bestuur jou video biblioteek · Stel video terugspeel opsies · Verander video lys opsies[CR]Stel onderskrif skrif" +msgstr "[B]KONFIGUREER VIDEO VERSTELLINGS[/B][CR][CR]Beheer jou video lys · Stel video terugspeel opsies · Verander video lys opsies[CR]Stel onderskrif font" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]STEL MUSIEK VERSTELLINGS OP[/B][CR][CR]Bestuur jou musiek biblioteek · Stel musiek terugspeel opsies · Verander musiek lys opsies[CR]Stel liedjie voorlegging op" - -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]STEL PRENT VERSTELLINGS OP[/B][CR][CR]Stel prent lys opsies · Stel skyfievertoning op" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]STEL WEER VERSTELLINGS OP[/B][CR][CR]Stel verskeie stede om weer inligting te versamel" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KONFIGUREER MUSIEK VERSTELLINGS[/B][CR][CR]Beheer jou musiek lys · Stel musiek speel opsies · Verander musiek lys opsies[CR]Stel liedjie voorlegging op · Stel kareoke opsies" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" -msgstr "[B]STEL STELSEL VERSTELLINGS OP[/B][CR][CR]Stel op en kalibreer skerms · Stel klank uitvoer op · Stel afstandbeheerders op[CR]Stel krag bespaar opsies · Stel ontfouting in staat · Stel hoof slot op" - -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]STEL BYVOEGSELS OP[/B][CR][CR]Bestuur jou geïnstalleerde byvoegsels · Blaai vir en installeer byvoegsels vanaf kodi.tv[CR]Verander byvoegsel verstellings" +msgstr "[B]KONFIGUREER STELSEL VERSTELLINGS[/B][CR][CR]Stel op en kalibreer skerms · Konfigureer klank uitvoer · Stel afstandbeheerders op[CR]Stel krag bespaar opsies · Stel ontfouting in staat · Stel hoof slot op" msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" -msgstr "[B]STEL TV VERSTELLINGS OP[/B][CR][CR]Verander vol skerm inligting - Bestuur EPG data verstellings" +msgstr "[B]VERANDER TV VERSTELLINGS[/B][CR][CR]Verander vol skerm inligting - Beheer EPG data verstellings" msgctxt "#31410" msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" -msgstr "[B]STEL DIENS VERSTELLINGS OP[/B][CR][CR]Stel beheer van Kodi via UPnP en HTTP op · Stel lêer deling op[CR]Stel Zeroconf in staat · Stel AirPlay op" - -msgctxt "#31411" -msgid "First run help..." -msgstr "Eerste lopie hulp..." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Hierdie duimgids beteken dat daar 'n kieslys af na die kant van hierdie venster is wat ekstra opsies vir hierdie seksie bevat. Vir toegang tot die kieslys, navigeer na links met jou afstandbeheer of sleutelbord, of plaas jou muis aanwyser oor die duimgids.[CR][CR]Kliek \"OK\" om hierdie dialoog toe te maak. Dit sal nie weer verskyn nie." +msgstr "[B]KONFIGUREER DIENS VERSTELLINGS[/B][CR][CR]Stel beheer van Kodi via UPnP en HTTP op · Konfigureer lêer deling[CR]Stel Zeroconf in staat · Konfigureer AirPlay" msgctxt "#31413" msgid "Local subtitle available" @@ -480,78 +268,26 @@ msgid "Login" msgstr "Teken In" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Selekteer jou Kodi gebruikers profiel[CR]om in te teken en voort te gaan" - msgctxt "#31422" msgid "Show or hide the login screen at startup." -msgstr "Wys of versteek die inteken bladsy wanneer die program begin" +msgstr "Wys of versteek die in teken bladsy wanneer die program begin" msgctxt "#31423" msgid "Select the profile that will be used at startup when the login screen is disabled." -msgstr "Kies die profiel wat gebriuk moet word met program begin wanneer die inteken skerm nie in staat gestel is nie." - -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Geskeduleerde tyd" +msgstr "Kies die profiel wat gebriuk moet word wanneer die program begin as die in teken bladsy onaktief is." msgctxt "#31502" msgid "TV" msgstr "TV" -msgctxt "#31503" -msgid "Add group" -msgstr "Voeg groep by" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Hernoem groep" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Wis groep uit" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "Beskikbare[CR]Groepe" -msgctxt "#31509" -msgid "Channel group" -msgstr "Kanaal groep" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Tydhouer gestel" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Kanaal opsies" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "36-uur voorspelling" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Uurlikse voorspelling" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Naweek voorspelling" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Daaglikse voorspelling" - msgctxt "#31905" msgid "Forecast" msgstr "Voorspelling" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Kans vir neerslag" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "Gaan haal voorspelling info..." @@ -578,11 +314,11 @@ msgctxt "#31954" msgid "MOVIES" -msgstr "FLIEKS" +msgstr "ROLPRENTE" msgctxt "#31955" msgid "TV SHOWS" -msgstr "TV VERTONINGS" +msgstr "TV PROGRAMME" msgctxt "#31956" msgid "MUSIC" @@ -594,12 +330,8 @@ msgctxt "#31958" msgid "PLAY DISC" -msgstr "SPEEL SKYF" +msgstr "SPEEL OPTIESE SKYF" msgctxt "#31959" msgid "SYSTEM" msgstr "STELSEL" - -msgctxt "#31960" -msgid "RADIO" -msgstr "RADIO" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ar_sa/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ar_sa/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ar_sa/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ar_sa/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -144,6 +144,14 @@ msgid "Options" msgstr "إعدادات" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "(TvTunes ملحق) تشغيل أغاني سمة التلفزيون في مكتبة الفيديو" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "كلمات الأغاني" @@ -236,6 +244,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]ضبط إعدادات المقاطع المرئيه[/B][CR][CR]ضبط إعدادات مكتبات المقاطع المرئيه - ضبط إعدادات تشغيل المقاطع المرئيه - تغيير إعدادات قوائم المقاطع المرئيه[CR]ضبط الترجمات" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]ضبط إعدادات الموسيقى[/B][CR][CR]ضبط مكتبات الموسيقى · ضبط إعدادات تشغيل الموسيقى · ضبط إعدادات قائمه الموسيقى[CR]ضبط إعدادات إذاعه الموسيقى - ضبط إعدادات الكارويوكي" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]ضبط إعدادات النظام[/B][CR][CR]ضبط ومعايره طُرُق العرض - ضبط مخارج الصوت - ضبط التحكم عن بعد[CR]ضبط إعدادات توفير الطاقه - ضبط وضع المعالجه - ضبط القفل الرئيسى" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.be_by/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.be_by/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.be_by/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.be_by/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -140,6 +140,14 @@ msgid "Options" msgstr "Options" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Play TV theme songs in video library (TvTunes add-on)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Lyrics" @@ -220,6 +228,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]ЗЬМЯНІЦЬ НАЛАДЫ ВІДЭА[/B][CR][CR]Кіраваць бібліятэкай відэа · Наставіць налады прайграваньня відэа · Зьмяніць налады сьпісу відэа[CR]Наставіць шрыфт субтытраў" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]ЗЬМЯНІЦЬ НАЛАДЫ МУЗЫКІ[/B][CR][CR]Кіраваць бібліятэкай музыкі · Наставіць налады прайграваньня музыкі · Зьмяніць налады сьпісу музыкі[CR]Наладзіць перадачу музыкі · Наставіць налады караоке" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]ЗЬМЯНІЦЬ НАЛАДЫ СЫСТЭМЫ[/B][CR][CR]Наладзіць і калібраваць адлюстраваньне · Наставіць аўдыё вывад · Наладзіць адлеглае кіраваньне[CR]Наставіць захоўваньне энэргіі · Дазволіць дэбаг · Наставіць агульны замок" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.bg_bg/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.bg_bg/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.bg_bg/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.bg_bg/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -228,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Ползвай за фон възпроизвежданата визуализация" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Възпроизвеждай мелодии от ТВ Сериали в библиотеката (добавка TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Лирики" @@ -306,7 +314,7 @@ msgctxt "#31308" msgid "Movie details" -msgstr "Детайли за филма" +msgstr "Подробности за филма" msgctxt "#31309" msgid "Memory used:" @@ -344,6 +352,10 @@ msgid "Last logged in" msgstr "Последно влизане" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Прозорец за избор на караоке песен" + msgctxt "#31322" msgid "Aired" msgstr "Излъчен" @@ -374,7 +386,7 @@ msgctxt "#31331" msgid "Album details" -msgstr "Детайли за албума" +msgstr "Подробности за албума" msgctxt "#31351" msgid "Pause" @@ -433,8 +445,8 @@ msgstr "[B]КОНФИГУРИРАЙТЕ ВИДЕОТО[/B][CR][CR]Управлявайте видео библиотеката си · Настройте възпроизвеждането на видео[CR]Променете настройките на списъците с видео файлове · Задайте шрифт за субтитрите" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]КОНФИГУРИРАЙТЕ МУЗИКАТА[/B][CR][CR]Управлявайте музикалната си библиотека · Настройте възпроизвеждането на музика[CR]Променете настройките на списъците с аудио файлове" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]КОНФИГУРИРАЙТЕ МУЗИКАТА[/B][CR][CR]Управлявайте музикалната си библиотеката · Настройте възпроизвеждането на музика[CR]Променете настройките на списъците с аудио файлове · Настройте караоке плеъра" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ca_es/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ca_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ca_es/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ca_es/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -24,10 +24,6 @@ msgid "Working..." msgstr "Carregant..." -msgctxt "#31005" -msgid "Hide information" -msgstr "Amaga la informació" - msgctxt "#31006" msgid "View options" msgstr "Mostra les opcions" @@ -36,10 +32,6 @@ msgid "Full screen" msgstr "Pantalla completa" -msgctxt "#31009" -msgid "Total duration" -msgstr "Duració total" - msgctxt "#31022" msgid "Music - Files" msgstr "Música - Fitxers" @@ -56,26 +48,14 @@ msgid "Items" msgstr "Elements" -msgctxt "#31026" -msgid "Misc options" -msgstr "Opcions vàries" - msgctxt "#31027" msgid "Location" msgstr "Ubicació" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Embolcall del cartell" - msgctxt "#31029" msgid "Fanart" msgstr "Fanart" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Miniatures" - msgctxt "#31033" msgid "Info" msgstr "Info" @@ -84,10 +64,6 @@ msgid "Actions" msgstr "Accions" -msgctxt "#31040" -msgid "Now playing" -msgstr "S'està reproduint" - msgctxt "#31042" msgid "PLAYING" msgstr "REPRODUINT" @@ -108,10 +84,6 @@ msgid "SEEKING" msgstr "S'ESTÀ CERCANT" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Visualitzacions preestablertes" - msgctxt "#31049" msgid "End time" msgstr "Hora de fi" @@ -148,10 +120,6 @@ msgid "This file is stacked, select the part you want to play from." msgstr "Aquest fitxer està agrupat, seleccioneu la part que desitgeu reproduir." -msgctxt "#31061" -msgid "Current selected" -msgstr "Selecció actual" - msgctxt "#31101" msgid "Home screen options" msgstr "Opcions de la pantalla principal" @@ -160,22 +128,10 @@ msgid "Background" msgstr "Fons" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Mostra \"Pausa\" en la presentació de diapositives" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Reprodueix els tràilers en una finestra [COLOR=grey3](Només al diàleg d'informació de vídeo)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" msgstr "Opcions vàries" -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Amaga els botons del menú principal" - msgctxt "#31109" msgid "Enable custom background" msgstr "Habilita el fons personalitzat" @@ -192,46 +148,18 @@ msgid "Options" msgstr "Opcions" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Mostra els àlbums afegits recentment" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Mostra els vídeos afegits recentment" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Submenú de programes de la pantalla principal" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Amaga el Fanart del fons" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Reprodueix les cançons de la temàtica TV a la llibreria de vídeo (complement TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "Lletres" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Amaga el fanart a la reproducció a pantalla completa" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Complement de lletres" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Submenú \"Vídeos\" de la pàgina principal" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Submenú \"Música\" de la pàgina principal" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Submenú \"Imatges\" de la pàgina principal" - msgctxt "#31140" msgid "Music OSD" msgstr "OSD de música" @@ -248,90 +176,22 @@ msgid "Shortcuts" msgstr "Dreceres de teclat" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Trieu la vostra cançó" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Origen de les lletres" - msgctxt "#31206" msgid "Found" msgstr "Trobat" -msgctxt "#31207" -msgid "Find more items" -msgstr "Troba més elements" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Propers episodis" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Temperatura actual" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Última actualització" - msgctxt "#31303" msgid "Data provider" msgstr "Proveïdor de dades" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Amaga Fanart" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Detalls de la pel·lícula" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Memòria utilitzada:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Número de pista" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" msgstr "Imatge de fanart[CR][CR]No disponible[CR][CR] Feu clic per definir-la" -msgctxt "#31312" -msgid "Current scraper" -msgstr "Scraper actual" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Trieu un scraper" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Opcions d'escaneig de continguts" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Estableix el camí del fanart" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Perfil seleccionat" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Últim accés el" - msgctxt "#31322" msgid "Aired" msgstr "Emès" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Opcions de la llista de reproducció" - msgctxt "#31326" msgid "Created" msgstr "Creat" @@ -340,22 +200,10 @@ msgid "Resolution" msgstr "Resolució" -msgctxt "#31328" -msgid "Recently added" -msgstr "Recentment afegits" - msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" msgstr "[B]Temporitzador activat[/B] [COLOR=grey2] - El sistema s'apagarà automàticament en[/COLOR]" -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Clic per reproduir[CR][CR]tràiler de pel·lícula" - -msgctxt "#31331" -msgid "Album details" -msgstr "Detalls de l'àlbum" - msgctxt "#31351" msgid "Pause" msgstr "Pausa" @@ -364,10 +212,6 @@ msgid "Stop" msgstr "Atura" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Avanç ràpid" - msgctxt "#31354" msgid "Rewind" msgstr "Rebobina" @@ -376,10 +220,6 @@ msgid "Movie menu" msgstr "Menú de la pel·lícula" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Baixa els subtítols" - msgctxt "#31360" msgid "Watch as 2D" msgstr "Veure en 2D" @@ -396,10 +236,6 @@ msgid "Skin default" msgstr "Aparença per defecte" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Tema per defecte sense Majúscules" - msgctxt "#31392" msgid "Arial based" msgstr "Basat en Arial" @@ -412,6 +248,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]CONFIGUREU ELS PARÀMETRES DE VÍDEO[/B][CR][CR]Gestioneu la biblioteca de vídeos · Establiu les opcions de reproducció de vídeo[CR]Canvieu les opcions del llistat de vídeo · Establiu els tipus de lletra dels subtítols" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGUREU ELS PARÀMETRES DE LA MÚSICA[/B][CR][CR]Gestioneu la biblioteca de música · Establiu les opcions de reproducció de la música[CR]Canvieu les opcions del llistat de música · Configureu l'enviament de cançons[CR]Establiu les opcions del karaoke" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]CONFIGUREU ELS PARÀMETRES DEL SISTEMA[/B][CR][CR]Configureu i calibreu les pantalles · Configureu la sortida d'àudio[CR]Configureu els comandaments a distància · Establiu les opcions d'estalvi d'energia[CR]Habiliteu la depuració · Configureu el bloqueig mestre" @@ -424,10 +264,6 @@ msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" msgstr "[B]CONFIGUREU ELS PARÀMETRES DE SERVEI[/B][CR][CR]Configureu el control del Kodi a través de UPnP i HTTP[CR]Configureu l'ús compartit de fitxers · Habiliteu el Zeroconf · Configureu l'AirPlay" -msgctxt "#31411" -msgid "First run help..." -msgstr "Ajuda per a la primera vegada..." - msgctxt "#31413" msgid "Local subtitle available" msgstr "Subtítol local disponible" @@ -436,10 +272,6 @@ msgid "Login" msgstr "Inicia sessió" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Seleccioni el seu perfil d'usuari de Kodi[CR]per ingressar i continuar" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "Mostra o amaga la pantalla d'inici de sessió a l'inici." @@ -448,66 +280,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "Seleccioneu el perfil que serà utilitzat a l'inici quan la pantalla d'entrada d'usuari està deshabilitada." -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Hora programada" - msgctxt "#31502" msgid "TV" msgstr "TV" -msgctxt "#31503" -msgid "Add group" -msgstr "Afegeix un grup" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Canvia el nom del grup" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Elimina el grup" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "Grups[CR]disponibles" -msgctxt "#31509" -msgid "Channel group" -msgstr "Grup del canal" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Establir Temporitzador" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Opcions del canal" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "Predicció a 36 hores" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Predicció per hores" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Predicció del cap de setmana" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Predicció diària" - msgctxt "#31905" msgid "Forecast" msgstr "Predicció" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Possibilitat de precipitació" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "S'està obtenint la informació de la predicció..." diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.cs_cz/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.cs_cz/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.cs_cz/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.cs_cz/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Skrýt Fanart na pozadí" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Schovat EPG jestliže je RDS zobrazeno v okně kanálu" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Zobrazit právě přehrávané video na pozadí" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Zobrazit právě přehrávanou vizualizaci na pozadí" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Přehrát znělky v knihovně videí (doplněk TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Texty písní" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Naposledy přihlášen" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Výběr karaoke skladby" + msgctxt "#31322" msgid "Aired" msgstr "Odvysíláno" @@ -437,8 +445,8 @@ msgstr "[B]NASTAVENÍ MOŽNOSTÍ VIDEA[/B][CR][CR]Správa knihovny videí · Možnosti přehrávání videa · Možnosti zobrazení video souborů[CR]Nastavení fontu titulků" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]NASTAVENÍ MOŽNOSTÍ HUDBY[/B][CR][CR]Správa knihovny hudby · Možnosti přehrávání hudby · Možnosti zobrazení hudebních souborů[CR] Nastavení služby odesílání informací o přehrávaných skladbách " +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]NASTAVENÍ MOŽNOSTÍ HUDBY[/B][CR][CR]Správa knihovny hudby · Možnosti přehrávání hudby · Možnosti zobrazení hudebních souborů[CR] Nastavení služby odesílání informací o přehrávaných skladbách · Nastavení karaoke" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" @@ -570,7 +578,7 @@ msgctxt "#31952" msgid "TV" -msgstr "TELEVIZE" +msgstr "Televize" msgctxt "#31953" msgid "VIDEOS" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.cy_gb/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.cy_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.cy_gb/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.cy_gb/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -144,6 +144,14 @@ msgid "Options" msgstr "Dewisiadau" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Chwarae caneuon thema teledu yn y llyfrgell fideo (ychwanegyn TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Geiriau Caneuon" @@ -236,6 +244,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]FFURFWEDDU GOSODIADAU FIDEO[/B][CR][CR]Rheoli eich llyfrgell fideo · Gosod dewisiadau chwarae fideo · Newid dewisiadau rhestru fideo[CR]Gosod ffontiau isdeitlau" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]FFURFWEDDU GOSODIADAU CERDDORIAETH[/B][CR][CR]Rheoli eich llyfrgell cerddoriaeth · Gosod dewisiadau chwarae cerddoriaeth · Newid dewisiadau rhestru cerddoriaeth [CR]Gosod cyflwyno caneuon · Gosod dewisiadau karaoke" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]FFURFWEDDU GOSODIADAU'R SYSTEM[/B][CR][CR]Gosod a chalibro dangosyddion · Ffurfweddu allbwn sain · Gosod rheolyddion pell[CR]Gosod dewisiadau pŵer · Galluogi dadfygio · Gosod prif glo" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.da_dk/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.da_dk/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.da_dk/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.da_dk/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Skjul baggrundsfankunst" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Skjul EPG hvis RDS er til stede på kanalvindue" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Vis \"Spiller nu\" i baggrunden for videoer" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Vis \"Spiller nu\" visualisering i baggrunden" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Afspil kendingsmelodier til TV-serier i videobiblioteket (TvTunes add-on)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Sangtekster" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Sidst logget ind" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Sangvalg til Karaoke" + msgctxt "#31322" msgid "Aired" msgstr "Sendt" @@ -437,8 +445,8 @@ msgstr "[B]KONFIGURER VIDEOINDSTILLINGER[/B][CR][CR]Administrer dit videobibliotek · Vælg indstillinger for videoafspilning · Skift indstillinger for videooversigt[CR]Vælg skrifttype til undertekster" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]KONFIGURER MUSIKINDSTILLINGER[/B][CR][CR]Administrer dit musikbibliotek · Angiv indstillinger for musikafspilning · Ændr indstillinger for musikvisning[CR]Opsæt sangindsendelse" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KONFIGURER MUSIKINDSTILLINGER[/B][CR][CR]Administrer dit musikbibliotek · Vælg indstillinger for musikafspilning · Skift indstillinger for musikoversigt[CR]Opsæt sangindsendelse · Vælg karaoke-indstillinger" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.de_de/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.de_de/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.de_de/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.de_de/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Hintergrund-Fanart verstecken" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "EPG bei Anwesenheit vom RDS auf dem Kanal" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Das \"Es läuft\" Hintergrund-Video anzeigen" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Die \"Es läuft\" Hintergrund-Visualisierung anzeigen" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "TV-Titelmusikstücke beim Navigieren in der Video-Bibliothek abspielen (TvTunes Addon)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Liedtexte" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Zuletzt angemeldet" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Karaoke-Titelauswahl" + msgctxt "#31322" msgid "Aired" msgstr "Ausgestrahlt" @@ -437,8 +445,8 @@ msgstr "[B]VIDEO-EINSTELLUNGEN KONFIGURIEREN[/B][CR][CR]Die Video-Bibliothek verwalten · Videoabspieleinstellungen vornehmen · Videoauflistungseinstellungen ändern[CR]Untertitel-Schriftarten einstellen" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]MUSIKEINSTELLUNGEN ÄNDERN[/B][CR][CR]Bearbeiten Sie ihre Musikbibliothek · Musikwiedergabeoptionen ändern · Musikanzeige ändern[CR]Musikübertragung einrichten" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]MUSIK-EINSTELLUNGEN KONFIGURIEREN[/B][CR][CR]Die Musik-Bibliothek verwalten· Musikabspieleinstellungen · Musikauflistungseinstellungen ändern[CR]Musikübertragung einrichten · Karaoke-Einstellungen" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.el_gr/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.el_gr/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.el_gr/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.el_gr/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: el_GR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Αλλαγή" - -msgctxt "#31003" -msgid "Power options" -msgstr "Επιλογές Ενέργειας" - msgctxt "#31004" msgid "Working..." msgstr "Απασχολημένο..." -msgctxt "#31005" -msgid "Hide information" -msgstr "Απόκρυψη πληροφοριών" - msgctxt "#31006" msgid "View options" msgstr "Επιλογές προβολής" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "Πλήρης οθόνη" -msgctxt "#31009" -msgid "Total duration" -msgstr "Συνολική διάρκεια" - msgctxt "#31022" msgid "Music - Files" msgstr "Μουσική - Αρχεία" @@ -60,30 +44,14 @@ msgid "Items" msgstr "Αντικείμενα" -msgctxt "#31026" -msgid "Misc options" -msgstr "Διάφορες επιλογές" - msgctxt "#31027" msgid "Location" msgstr "Τοποθεσία" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Αφίσες" - msgctxt "#31029" msgid "Fanart" msgstr "Fanart" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Μικρογραφίες" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Εικόνες" - msgctxt "#31033" msgid "Info" msgstr "Πληροφορίες" @@ -92,10 +60,6 @@ msgid "Actions" msgstr "Ενέργειες" -msgctxt "#31040" -msgid "Now playing" -msgstr "Τώρα εκτελείται" - msgctxt "#31042" msgid "PLAYING" msgstr "ΑΝΑΠΑΡΑΓΩΓΗ" @@ -116,13 +80,9 @@ msgid "SEEKING" msgstr "ΑΝΑΖΗΤΗΣΗ" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Προεπιλογές οπτικοποίησης" - msgctxt "#31049" msgid "End time" -msgstr "Χρόνος Λήξης" +msgstr "Έως ώρα" msgctxt "#31050" msgid "Sort: Ascending" @@ -156,45 +116,25 @@ msgid "This file is stacked, select the part you want to play from." msgstr "Αυτό το αρχείο είναι στοιβαγμένο, επιλέξτε από που να γίνει αναπαραγωγή." -msgctxt "#31061" -msgid "Current selected" -msgstr "τρέχον επιλεγμένο " - msgctxt "#31101" msgid "Home screen options" msgstr "Επιλογές Αρχικής Οθόνης" msgctxt "#31102" msgid "Background" -msgstr "Φόντο" - -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Εμφάνιση \"Παύση\" προβολής σλάιντ εικόνων" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Αναπαραγωγή τρέιλερ σε παράθυρο [COLOR=grey3](Πληροφορίες βίντεο διαλόγου μόνο)[/COLOR]" +msgstr "Υπόβαθρο" msgctxt "#31106" msgid "Miscellaneous options" msgstr "Διάφορες επιλογές" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Απόκρυψη των αναγνώσιμων σημαιών από τα ονόματα αρχείων βίντεο [COLOR=grey3](π.χ Blu-ray, HD-DVD)[/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Απόκρυψη πλήκτρων κυρίου μενού" - msgctxt "#31109" msgid "Enable custom background" -msgstr "Ενεργοποίηση προσαρμοσμένου φόντου" +msgstr "Ενεργοποίηση προσαρμοσμένου υποβάθρου" msgctxt "#31110" msgid "Background path:" -msgstr "Διαδρομή φόντου:" +msgstr "Διαδρομή υποβάθρου:" msgctxt "#31111" msgid "Hide" @@ -204,65 +144,25 @@ msgid "Options" msgstr "Επιλογές" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Εμφάνιση πρόσφατων προσθέσεων άλμπουμ" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Εμφάνιση πρόσφατων προσθέσεων βίντεο" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Προγράμματα υπομενού κύριας σελίδας" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Απόκρυψη φόντου fanart" - -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Απόκρυψη EPG αν το RDS είναι στο παράθυρο καναλιών" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Εμφάνηση φόντου βίντεο που \"Αναπαραγωγή σε εκτέλεση\"" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Εμφάνηση φόντου οπτικοποίησης που \"Αναπαραγωγή σε εκτέλεση\"" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Αναπαραγωγή μουσικής σειρών στη συλλογή (πρόσθετο TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "Στίχοι" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Απόκρυψη fanart σε πλήρης οθόνη απτικοποίηση" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Add-on στοίχων" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Υπομενού \"Βίντεο\" κύριας σελίδας" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Υπομενού \"Μουσική\" κύριας σελίδας" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Υπομενού \"Φωτογραφίες\" κύριας σελίδας" - msgctxt "#31140" msgid "Music OSD" -msgstr "Aπεικόνιση οθόνης (OSD) Μουσικής" +msgstr "Aπεικονίσεις οθόνης (OSD) Μουσικής" msgctxt "#31141" msgid "Video OSD" -msgstr "Aπεικόνιση οθόνης (OSD) Βίντεο" +msgstr "Aπεικονίσεις οθόνης (OSD) Βίντεο" msgctxt "#31142" msgid "Settings level" @@ -272,90 +172,22 @@ msgid "Shortcuts" msgstr "Συντομεύσεις" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Επιλογή τραγουδιού" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Προέλευση στίχων" - msgctxt "#31206" msgid "Found" msgstr "Βρέθηκαν" -msgctxt "#31207" -msgid "Find more items" -msgstr "Εύρεση περισσότερων αντικειμένων" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Ανερχόμενα επεισόδια" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Τρέχουσα θερμοκρασία" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Τελευταία ανανέωση" - msgctxt "#31303" msgid "Data provider" msgstr "Πηγή δεδομένων" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Απόκρυψη fanart" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Πληροφορίες ταινίας" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Χρήση μνήμης:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Αριθμός κομματιού" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" -msgstr "Εικόνα Fanart[CR][CR]Μη διαθέσιμη[CR][CR] Επιλέξτε το πλήκτρο για να ορίσετε" - -msgctxt "#31312" -msgid "Current scraper" -msgstr "Τρέχον Ξύστρα" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Επιλογή ξύστρας" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Επιλογές Σάρωσης Περιεχομένου" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Ορισμός Διαδρομής Fanart" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Επιλεγμένο Προφίλ" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Τελευταία σύνδεση" +msgstr "Εικόνα Fanart[CR][CR]Μη διαθέσιμη[CR][CR] Πιέστε το πλήκτρο για να ορίσετε" msgctxt "#31322" msgid "Aired" msgstr "Πρώτη Προβολή" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Επιλογές λίστας αναπ/γής" - msgctxt "#31326" msgid "Created" msgstr "Δημιουργήθηκε" @@ -364,22 +196,10 @@ msgid "Resolution" msgstr "Ανάλυση" -msgctxt "#31328" -msgid "Recently added" -msgstr "Πρόσφατη προσθήκη" - msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" msgstr "[B]Ορίστηκε χρονοδιακόπτης![/B] [COLOR=grey2] - Τερματισμός συστήματος σε[/COLOR]" -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Επιλογή πλήκτρου για αναπαραγωγή[CR][CR]τρέιλερ ταινίας" - -msgctxt "#31331" -msgid "Album details" -msgstr "Λεπτομέρειες Άλμπουμ" - msgctxt "#31351" msgid "Pause" msgstr "Παύση" @@ -388,10 +208,6 @@ msgid "Stop" msgstr "Διακοπή" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Μπροστά" - msgctxt "#31354" msgid "Rewind" msgstr "Πίσω" @@ -400,10 +216,6 @@ msgid "Movie menu" msgstr "Μενού Ταινιών" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Λήψη Υποτίτλων" - msgctxt "#31360" msgid "Watch as 2D" msgstr "Προβολή ως 2D" @@ -418,11 +230,7 @@ msgctxt "#31390" msgid "Skin default" -msgstr "Προεπιλογή αμφίεσης" - -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Προεπιλογή αμφίεσης χωρίς Κεφαλαία" +msgstr "Προεπιλογή" msgctxt "#31392" msgid "Arial based" @@ -430,47 +238,27 @@ msgctxt "#31400" msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver" -msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΝ ΕΞΑΤΟΜΙΚΕΥΣΗΣ[/B][CR][CR]Αλλαγή αμφίεσης · Αλλαγή χώρας και γλώσσας συστήματος · Επιλογές καταλόγου αρχείων[CR]Προσαρμογή της προφύλαξης οθόνης" +msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΕΞΑΤΟΜΙΚΕΥΣΗΣ[/B][CR][CR]Αλλαγή κελύφους · Αλλαγή χώρας και γλώσσας συστήματος · Επιλογές καταλόγου αρχείων[CR]Προσαρμογή της προφύλαξης οθόνης" msgctxt "#31401" msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" -msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΝ ΒΙΝΤΕΟ[/B][CR][CR]Διαχείριση της συλλογής βίντεο · Ρύθμιση αναπαραγωγής βίντεο · Επιλογές καταλόγου ταινιών[CR]Ρύθμιση γραμματοσειράς υπότιτλου" +msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΒΙΝΤΕΟ[/B][CR][CR]Διαχείριση της συλλογής βίντεο · Ρύθμιση αναπαραγωγής βίντεο · Επιλογές καταλόγου ταινιών[CR]Ρύθμιση γραμματοσειράς υποτίτλων" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΝ ΜΟΥΣΙΚΗΣ ΜΟΥΣΙΚΗΣ[/B][CR][CR]Διαχείριση της μουσικής συλλογής · Ρύθμιση αναπαραγωγής μουσικής · Επιλογές καταλόγου μουσικής[CR]Ρύθμιση υποβολής τραγουδιού" - -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΝ ΕΙΚΟΝΩΝ[/B][CR][CR]Επιλογές καταλόγου εικόνων · Ρύθμιση παρουσίασης σλάιντ" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΝ ΚΑΙΡΟΥ[/B][CR][CR]Ορισμός πολλαπλών πόλεων για την συλλογή πληροφοριών πρόγνωσης καιρού" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΜΟΥΣΙΚΗΣ[/B][CR][CR]Διαχείριση της μουσικής συλλογής · Ρύθμιση αναπαραγωγής μουσικής · Επιλογές καταλόγου μουσικής[CR]Ρύθμιση υποβολής τραγουδιού · Επιλογές karaoke" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" -msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΝ ΣΥΣΤΗΜΑΤΟΣ[/B][CR][CR]Διαμόρφωση και βαθμονόμηση οθονών · Ρύθμιση εξόδου ήχου · Τηλεχειριστήρια · Εξοικονόμηση ενέργειας · Εντοπισμός σφαλμάτων (debug) · Κεντρικό κλείδωμα" - -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΝ ΠΡΟΣΘΕΤΩΝ[/B][CR][CR]Διαχείριση εγκατεστημένων προσθέτων · Αναζήτηση και εγκατάσταση προσθέτων από το kodi.tv[CR]Τροποποίηση ρυθμίσεων των προσθέτων" +msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΣΥΣΤΗΜΑΤΟΣ[/B][CR][CR]Διαμόρφωση και βαθμονόμηση οθονών · Ρύθμιση εξόδου ήχου · Τηλεχειριστήρια · Εξοικονόμηση ενέργειας · Εντοπισμός σφαλμάτων (debug) · Κεντρικό κλείδωμα" msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" -msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΝ ΤΗΛΕΟΡΑΣΗΣ[/B][CR][CR]Αλλαγή πληροφοριών πλήρους οθόνης · Διαχείριση των ρυθμίσεων δεδομένων EPG" +msgstr "[B]ΡΥΘΜΙΣΗ ΤΗΛΕΟΡΑΣΗΣ[/B][CR][CR]Αλλαγή πληροφοριών πλήρους οθόνης · Διαχείριση των ρυθμίσεων δεδομένων EPG" msgctxt "#31410" msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" -msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΝ ΥΠΗΡΕΣΙΩΝ[/B][CR][CR]Χειρισμός του Kodi μέσω UPnP και HTTP · Ρύθμιση κοινής χρήσης αρχείων[CR]Ενεργοποίηση Zeroconf · Ρύθμιση AirPlay" - -msgctxt "#31411" -msgid "First run help..." -msgstr "Αρχική βοήθεια...." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Αυτή η ετικέτα δηλώνει ότι υπάρχει ένα μενού στο πλάι του παραθύρου, με επιπλέον επιλογές. Για να το ανοίξετε επιλέξτε το αντίστοιχο πλήκτρο κατεύθυνσης ή μεταφέρετε εκεί το ποντίκι σας.[CR][CR]Επιλέξτε 'Επιλογή' για να κλείσει αυτό το παράθυρο. Δε θα εμφανιστεί ξανά." +msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΥΠΗΡΕΣΙΩΝ[/B][CR][CR]Χειρισμός του Kodi μέσω UPnP και HTTP · Ρύθμιση κοινής χρήσης αρχείων[CR]Ενεργοποίηση Zeroconf · Ρύθμιση AirPlay" msgctxt "#31413" msgid "Local subtitle available" @@ -480,10 +268,6 @@ msgid "Login" msgstr "Σύνδεση" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Επιλέξτε προφίλ χρήστη για το Kodi[CR]για να συνδεθείτε και να συνεχίσετε" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "Εμφάνιση ή απόκρυψη της οθόνης σύνδεσης κατά την εκκίνηση." @@ -492,66 +276,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "Επιλογή του προφίλ που θα χρησιμοποιηθεί κατά την εκκίνηση αν έχει απενεργοποιηθεί η οθόνη σύνδεσης." -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Προγραμματισμένη Ώρα" - msgctxt "#31502" msgid "TV" msgstr "Τηλεόραση" -msgctxt "#31503" -msgid "Add group" -msgstr "Προσθήκη Γκρουπ" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Μετονομασία Γκρουπ" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Διαγραφή Γκρουπ" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "Διαθέσιμα[CR]Γκρουπ" -msgctxt "#31509" -msgid "Channel group" -msgstr "Γκρουπ Καναλιών" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Ορισμός Χρονοδιακόπτη" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Επιλογές Καναλιού" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "36ωρη πρόγνωση" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Ωριαία Πρόγνωση" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Πρόγνωση Σαββατοκύριακου" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Ημερήσια Πρόγνωση" - msgctxt "#31905" msgid "Forecast" msgstr "Πρόγνωση" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Πιθανότητα κατακρήμνισης" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "Ανάκτηση πρόγνωσης καιρού..." diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.en_au/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.en_au/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.en_au/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.en_au/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -144,6 +144,14 @@ msgid "Options" msgstr "Options" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Play TV theme songs in video library (TvTunes add-on)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Lyrics" @@ -236,6 +244,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.en_gb/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.en_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.en_gb/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.en_gb/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -257,15 +257,7 @@ msgid "Hide background fanart" msgstr "" -#empty strings from id 31120 to 31121 - -#. Boolean settings value -#: system/settings/settings.xml -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "" - -#empty string with id 31123 +#empty strings from id 31120 to 31123 msgctxt "#31124" msgid "Show background \"Now playing\" video" @@ -418,7 +410,9 @@ msgid "Last logged in" msgstr "" -#empty string with id 31321 +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "" msgctxt "#31322" msgid "Aired" @@ -522,7 +516,7 @@ msgstr "" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" msgstr "" msgctxt "#31403" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.en_nz/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.en_nz/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.en_nz/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.en_nz/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Hide background fanart" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Hide EPG if RDS is present on channel window" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Show background \"Now playing\" video" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Show background \"Now playing\" visualisation" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Play TV theme songs in video library (TvTunes add-on)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Lyrics" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Last logged in" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Karaoke song selector" + msgctxt "#31322" msgid "Aired" msgstr "Aired" @@ -437,8 +445,8 @@ msgstr "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.en_us/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.en_us/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.en_us/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.en_us/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -228,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Show background \"Now playing\" visualization" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Play TV theme songs in video library (TvTunes add-on)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Lyrics" @@ -344,6 +352,10 @@ msgid "Last logged in" msgstr "Last logged in" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Karaoke song selector" + msgctxt "#31322" msgid "Aired" msgstr "Aired" @@ -432,6 +444,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" + msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" msgstr "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.es_ar/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.es_ar/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.es_ar/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.es_ar/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -228,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Mostrar visualización \"Reproduciendo ahora\" en el fondo" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Reproducir canciones de series en la colección de video (complemento TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Letras" @@ -344,6 +352,10 @@ msgid "Last logged in" msgstr "Último inicio de sesión" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Selector de canción de karaoke" + msgctxt "#31322" msgid "Aired" msgstr "Estrenado" @@ -432,6 +444,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]Configura las opciones de VIDEO[/B][CR][CR]Administre su colección de video · Ajusta reproducción de video · Cambia opciones de listas de video[CR]Configura tipografía de subtítulos" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]Configura las opciones de MÚSICA[/B][CR][CR]Administre su colección de música · Ajusta reproducción de música · Cambia opciones de listas de música[CR]Configura envío de canciones · Configura el karaoke" + msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" msgstr "[B]Configura las opciones de IMAGEN[/B][CR][CR]Cambia opciones de listas de imágenes - Configura presentación de diapositivas" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.es_es/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.es_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.es_es/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.es_es/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Ocultar el Fanart del fondo" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Ocultar EPG si EDS está presente en la ventana del canal" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Mostrar de fondo \"Ahora reproduciendo\" vídeo" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Mostrar de fondo la visualización \"Ahora reproduciendo\"" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Reproducir sintonías en la colección de vídeo (complemento TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Letra" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Última sesión el" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Selector de canción de karaoke" + msgctxt "#31322" msgid "Aired" msgstr "Emitido" @@ -437,8 +445,8 @@ msgstr "[B]Configura las opciones de VÍDEO[/B][CR][CR]Administra tu colección de vídeo - Ajusta reproducción de vídeo - Cambia opciones de listas de vídeo[CR]Configura fuentes de subtítulos" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]Configura las opciones de MÚSICA[/B][CR][CR]Administra tu colección de música · Ajusta reproducción de música · Cambia opciones de listas de música[CR]Configura sumisión de canciones" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]Configura las opciones de MÚSICA[/B][CR][CR]Administra tu colección de música · Ajusta reproducción de música · Cambia opciones de listas de música[CR]Configura sumisión de canciones · Configura el karaoke" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.es_mx/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.es_mx/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.es_mx/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.es_mx/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -148,6 +148,14 @@ msgid "Options" msgstr "Opciones" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Reproducir canciones temáticas de TV en la biblioteca de Video (TvTunes add-on)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Letras" @@ -240,6 +248,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]CONFIGURAR AJUSTES DE VIDEO[/B][CR][CR]Administrar tu biblioteca de video · Configurar las opciones de reproducción de vídeo · Cambiar las opciones de listado de videos[CR]Establecer fuentes de subtítulos" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGURAR AJUSTES DE MÚSICA[/B][CR][CR]Administrar tu biblioteca de música · Configurar las opciones de reproducción de música · Cambiar las opciones de listado de música [CR]Configurar el envío de canciones · Ajustar opciones de karaoke" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]CONFIGURAR AJUSTES DE SISTEMA[/B][CR][CR]Configurar y calibrar las pantallas · Configurar salida de audio · Configurar controles remotos[CR]Configurar opciones de ahorro de energía · Habilitar depuración · Configurar Bloqueo Maestro" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.et_ee/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.et_ee/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.et_ee/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.et_ee/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -144,6 +144,14 @@ msgid "Options" msgstr "Valikud" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Esita videoteegis sarjade tunnusmuusikat (TvTunes lisamoodul)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Laulutekst" @@ -236,6 +244,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]KONFIGUREERI VIDEO SEADEID[/B][CR][CR]Halda enda videoteeki · Määra video esitamise seaded · Muuda videoloendi valikuid[CR]Määra subtiitrite font" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KONFIGUREERI MUUSIKA SEADEID[/B][CR][CR]Halda enda muusikateeki · Määra muusika esitamise seaded · Muuda muusikaloendi valikuid[CR]Seadista loo esitamine · Seadista karaoke valikud" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]KONFIGUREERI SÜSTEEMI SEADEID[/B][CR][CR]Seadista ja kalibreeri ekraane · Konfigureeri heliväljundit · Seadista kaugjuhtimine[CR]Määra energiasäästu valikud· Luba silumine · Seadista pealukk" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.fa_ir/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.fa_ir/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.fa_ir/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.fa_ir/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -44,10 +44,6 @@ msgid "Items" msgstr "موضوعات" -msgctxt "#31026" -msgid "Misc options" -msgstr "سایر تنظیمات" - msgctxt "#31027" msgid "Location" msgstr "مکان" @@ -148,6 +144,14 @@ msgid "Options" msgstr "گزینه ها" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "پخش موسیقی تیتر تلویزیون در کتابخانه ویدئویی (افزونه TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "اشعار" @@ -248,6 +252,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B] تنظیمات ویدئو[/B] [CR][CR] مرتب سازی کتابخانه ویدئویی. تنظیمات پخش ویدئو. انتخاب گزینه های مرتب سازی ویدئو. [CR] انتخاب قلم زیرنویس ها." +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B] تنظیمات موسیقی[/B] [CR][CR] مرتب سازی کتابخانه موسیقی. تنظیمات پخش موسیقی. انتخاب گزینه های مرتب سازی موسیقی . [CR] انتخاب گزینه های همخوانی." + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B] تنظیمات سیستم [/B] [CR][CR] راه اندازی و کالیبره کردن نمایشگر ها. تنظیم پخش صدا. تنظیم کنترل از راه دور. [CR] انتخاب گزینه های صرفه جویی در انرژی - فعال کردن خطا یابی. تنظیم قفل اصلی." diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.fi_fi/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.fi_fi/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.fi_fi/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.fi_fi/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: fi_FI\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Määritä" - -msgctxt "#31003" -msgid "Power options" -msgstr "Virta-asetukset" - msgctxt "#31004" msgid "Working..." msgstr "Suoritetaan..." -msgctxt "#31005" -msgid "Hide information" -msgstr "Piilota tiedot" - msgctxt "#31006" msgid "View options" msgstr "Näkymä valinnat" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "Kokoruutu" -msgctxt "#31009" -msgid "Total duration" -msgstr "Kokonaiskesto" - msgctxt "#31022" msgid "Music - Files" msgstr "Musiikki - Tiedostot" @@ -60,30 +44,14 @@ msgid "Items" msgstr "Kohdetta" -msgctxt "#31026" -msgid "Misc options" -msgstr "Muut asetukset" - msgctxt "#31027" msgid "Location" msgstr "Paikkakunta" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Julistekierto" - msgctxt "#31029" msgid "Fanart" msgstr "Fanitaide" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Kuva pienoiskuvake" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Kuvakierto" - msgctxt "#31033" msgid "Info" msgstr "Tiedot" @@ -92,10 +60,6 @@ msgid "Actions" msgstr "Toiminnot" -msgctxt "#31040" -msgid "Now playing" -msgstr "Nyt toistetaan" - msgctxt "#31042" msgid "PLAYING" msgstr "TOISTETAAN" @@ -116,10 +80,6 @@ msgid "SEEKING" msgstr "HAKEE" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Visualisoinnin esiasetukset" - msgctxt "#31049" msgid "End time" msgstr "Päättymisaika" @@ -156,10 +116,6 @@ msgid "This file is stacked, select the part you want to play from." msgstr "Tämä tiedosto on pinottu, valitse osa jonka haluat toistaa." -msgctxt "#31061" -msgid "Current selected" -msgstr "Nyt valittuna" - msgctxt "#31101" msgid "Home screen options" msgstr "Päävalikon asetukset" @@ -168,26 +124,10 @@ msgid "Background" msgstr "Tausta" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Näytä \"Tauko\" kuvaesityksessä" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Toista trailerit ikkunassa [COLOR=grey3](Vain videon informaatiodialogi)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" msgstr "Yleiset asetukset" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Piilota tiedostojen nimistä luetut merkinnät [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Piilota päävalikon painikkeet" - msgctxt "#31109" msgid "Enable custom background" msgstr "Valinnainen taustakuva käytössä" @@ -204,54 +144,18 @@ msgid "Options" msgstr "Asetukset" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Näytä viimeksi lisätyt albumit" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Näytä viimeksi lisätyt videot" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Kotisivu Ohjelmat Alavalikko" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Piilota taustan fanitaide" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Näytä taustalla \"Nyt katsellaan\"-video" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Näytä taustalla \"Nyt soi\"-visualisaatio" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Toista TV-tunnusmusiikit videokirjastossa (TvTunes-lisäosa)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "Sanoitukset" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Piilot fanitaide kun visualisointi toistetaan koko ruudussa" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Sanoitukset-lisäosa" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Kotisivu Videot Alavalikko" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Kotisivu Musiikki Alavalikko" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Kotisivu Kuvat Alavalikko" - msgctxt "#31140" msgid "Music OSD" msgstr "Musiikki-OSD" @@ -268,90 +172,22 @@ msgid "Shortcuts" msgstr "Pikavalinnat" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Valitse kappale" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Sanoitusten lähde" - msgctxt "#31206" msgid "Found" msgstr "Löytyi" -msgctxt "#31207" -msgid "Find more items" -msgstr "Etsi lisää kohteita" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Tulevat jaksot" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Tämänhetkinen lämpötila" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Viimeksi päivitetty" - msgctxt "#31303" msgid "Data provider" msgstr "Tietojen tarjoaja" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Piilota fanitaide" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Elokuvan tiedot" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Käytetty muisti:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Kappalenumero" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" msgstr "Fanitaide kuvaa[CR][CR]ei ole saatavilla[CR][CR]Klikkaa asettaaksesi" -msgctxt "#31312" -msgid "Current scraper" -msgstr "Nykyinen hakupaikka" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Valitse hakupaikka" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Sisällön hakuasetukset" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Aseta fanitaiteen polku" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Valittu profiili" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Viimeksi kirjauduttu" - msgctxt "#31322" msgid "Aired" msgstr "Esitetty" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Toistolistan asetukset" - msgctxt "#31326" msgid "Created" msgstr "Luotu" @@ -368,14 +204,6 @@ msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" msgstr "[B]Ajastus[/B] [COLOR=grey2] - Aikaa järjestelmän sammuttamiseen[/COLOR]" -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Paina painiketta katsoaksesi[CR][CR]elokuvaesittelyn" - -msgctxt "#31331" -msgid "Album details" -msgstr "Albumin tiedot" - msgctxt "#31351" msgid "Pause" msgstr "Tauko" @@ -384,10 +212,6 @@ msgid "Stop" msgstr "Pysäytä" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Kelaa eteenpäin" - msgctxt "#31354" msgid "Rewind" msgstr "Kelaa taaksepäin" @@ -396,10 +220,6 @@ msgid "Movie menu" msgstr "Elokuvavalikko" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Lataa tekstitykset" - msgctxt "#31360" msgid "Watch as 2D" msgstr "Katso 2D:nä" @@ -416,10 +236,6 @@ msgid "Skin default" msgstr "Ulkoasun oletus" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Ulkoasun oletus ilman isoja kirjaimia" - msgctxt "#31392" msgid "Arial based" msgstr "Arial pohjainen" @@ -432,22 +248,14 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]Muokkaa video-asetuksia[/B][CR][CR]Hallitse videokirjastoa · Aseta videotoiston asetukset · Vaihda videolistauksen asetuksia[CR]Aseta tekstitysasetukset" -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]Muokkaa kuva-asetuksia[/B][CR][CR]Aseta kuvalistauksen asetukset · Määritä kuvaesityksiä" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]Muokkaa sää-asetuksia[/B][CR][CR]Aseta eri kaupunkeja joista noudetaan säätiedot" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]Muokkaa musiikki-asetuksia[/B][CR][CR]Hallitse musiikkikirjastoa · Aseta musiikkitoiston asetukset · Vaihda musiikkilistauksen[CR]asetuksia · Aseta kappaleen lähetysasetuksia · Aseta karaoke-asetukset" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]Muokkaa järjestelmän asetuksia[/B][CR][CR]Aseta ja kalibroi näyttö · Määritä äänilähtö · Aseta kauko-ohjaus[CR]Aseta sähkönsäästöasetukset · Ota debuggaus käyttöön · Muokkaa pääkäyttäjän lukituksia" -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]Muokkaa lisäosia[/B][CR][CR]Hallitse asennettuja lisäosia · Valitse ja asenna lisäosia kodi.tv:stä[CR]Muokkaa lisäosien asetuksia" - msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" msgstr "[B]MÄÄRITÄ TV-ASETUKSET[/B][CR][CR]Vaihda koko ruudun infoa · Hallitse EPG-tietojen asetuksia" @@ -456,14 +264,6 @@ msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" msgstr "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Määritä Kodi:n kauko ohjaus käyttäen UPnP:tä ja HTTP:tä · Määritä tiedostonjako[CR]Kytke päälle Zeroconf · Määritä AirPlay" -msgctxt "#31411" -msgid "First run help..." -msgstr "Ensimmäisen käynnistyksen apu..." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Tämä välilehti merkitsee ikkunan sivussa olevan tämän osaston ekstravalikon. Käyttääksesi valikkoa, siirry vasemmalle kaukosäädintä, näppäimistöä tai hiiren kursoria käyttäen välilehdessä. [CR][CR]Paina \"Ok\" sulkeaksesi tämän ikkunan. Se ei ilmesty tämän jälkeen." - msgctxt "#31413" msgid "Local subtitle available" msgstr "Paikallinen tekstitys saatavilla" @@ -472,10 +272,6 @@ msgid "Login" msgstr "Kirjaudu" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Valitse Kodi-käyttäjäprofiili[CR]kirjautuaksesi sisään" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "Näytä tai piilota kirjautumisruutu käynnistyksessä." @@ -484,66 +280,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "Valitse se profiili, jota käytetään käynnistyksessä, kun kirjautumisruutu on poiskytketty." -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Kellonaika" - msgctxt "#31502" msgid "TV" msgstr "TV" -msgctxt "#31503" -msgid "Add group" -msgstr "Lisää ryhmä" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Muuta ryhmän nimeä" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Poista ryhmä" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "Saatavilla olevat[CR]ryhmät" -msgctxt "#31509" -msgid "Channel group" -msgstr "Kanavaryhmä" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Ajastettu" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Kanavan valinnat" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "36 tunnin ennuste" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Tunneittainen ennuste" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Viikonlopun ennuste" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Päivittäinen Ennuste" - msgctxt "#31905" msgid "Forecast" msgstr "Ennuste" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Sateen mahdollisuus" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "Noudetaan ennusteen tietoja..." diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.fo_fo/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.fo_fo/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.fo_fo/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.fo_fo/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -212,6 +212,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]STILLINGAR FYRI VIDEO[/B][CR][CR]Umsit títt video savn · Áset møguleikar fyri video avspæling · Broyt stilling til vísing av video[CR]Áset skrivtslag til undirtekstir" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]STILLINGAR FYRI TÓNLEIK[/B][CR][CR]Umsit títt tónleikasavn · Áset stillingar fyri spæling av tónleiki · Broyt stilling til vísing av tónleiki[CR]Áset skráseting av lagi · Áset stillingar fyri karaoke" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]STILLINGAR FYRI SKIPAN[/B][CR][CR]Set upp og stilla skermar · Stilla ljóð · Stilla fjarstýringar[CR]Stilla streymsparing · Tendra debugging · Áset høvuðslás" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.fr_ca/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.fr_ca/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.fr_ca/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.fr_ca/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Masquer le fanart d’arrière-plan" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Cacher le GÉP si RDS est présent sur la fenêtre de la chaîne" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Afficher la vidéo d'arrière-plan « Lecture en cours »" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Afficher la visualisation d'arrière-plan « Lecture en cours »" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Jouer les indicatifs musicaux de la télé dans la vidéothèque (addiciel TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Paroles" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Dernière connexion" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Sélecteur de chanson karaoké" + msgctxt "#31322" msgid "Aired" msgstr "Diffusé" @@ -437,8 +445,8 @@ msgstr "[B]CONFIGURER LES PARAMÈTRES DES VIDÉOS[/B][CR][CR]Gérer la vidéothèque · Définir les options de lecture · Changer les options de listage des vidéos[CR]Définir la police des sous-titres" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]CONFIGURER LES PARAMÈTRES DE LA MUSIQUE[/B][CR][CR]Gérer l'audiothèque · Définir les options de lecture · Changer les options de listage de la musique[CR]Paramétrer les envois de chansons" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGURER LES PARAMÈTRES DE LA MUSIQUE[/B][CR][CR]Gérer l'audiothèque · Définir les options de lecture · Changer les options de listage de la musique[CR]Paramétrer les envois de chansons · Définir les options de karaoké" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.fr_fr/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.fr_fr/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.fr_fr/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.fr_fr/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -18,7 +18,7 @@ msgctxt "#31000" msgid "Change your" -msgstr "Modification des" +msgstr "Changer vos" msgctxt "#31003" msgid "Power options" @@ -26,7 +26,7 @@ msgctxt "#31004" msgid "Working..." -msgstr "En cours..." +msgstr "En cours…" msgctxt "#31005" msgid "Hide information" @@ -34,7 +34,7 @@ msgctxt "#31006" msgid "View options" -msgstr "Options de la vue" +msgstr "Options d'affichage" msgctxt "#31008" msgid "Full screen" @@ -66,7 +66,7 @@ msgctxt "#31027" msgid "Location" -msgstr "Lieu" +msgstr "Emplacement" msgctxt "#31028" msgid "Poster wrap" @@ -78,7 +78,7 @@ msgctxt "#31031" msgid "Pic thumbs" -msgstr "Galerie de miniatures" +msgstr "Miniatures" msgctxt "#31032" msgid "Image wrap" @@ -86,7 +86,7 @@ msgctxt "#31033" msgid "Info" -msgstr "Infos" +msgstr "Info" msgctxt "#31039" msgid "Actions" @@ -102,7 +102,7 @@ msgctxt "#31043" msgid "PAUSED" -msgstr "EN PAUSE" +msgstr "PAUSE" msgctxt "#31044" msgid "FAST FORWARD" @@ -114,11 +114,11 @@ msgctxt "#31046" msgid "SEEKING" -msgstr "DÉPLACEMENT" +msgstr "RECHERCHE" msgctxt "#31048" msgid "Visualisation presets" -msgstr "Présélections de visualisation" +msgstr "Préréglages de visualisation" msgctxt "#31049" msgid "End time" @@ -126,11 +126,11 @@ msgctxt "#31050" msgid "Sort: Ascending" -msgstr "Ordre : Croissant" +msgstr "Tri : Ascendant" msgctxt "#31051" msgid "Sort: Descending" -msgstr "Ordre : Décroissant" +msgstr "Tri : Descendant" msgctxt "#31055" msgid "Open playlist" @@ -154,7 +154,7 @@ msgctxt "#31060" msgid "This file is stacked, select the part you want to play from." -msgstr "Ce fichier est empilé, sélectionner le point à partir duquel le lire." +msgstr "Ce fichier est empilé, sélectionnez le point à partir duquel vous souhaitez le lire." msgctxt "#31061" msgid "Current selected" @@ -162,7 +162,7 @@ msgctxt "#31101" msgid "Home screen options" -msgstr "Options de la page d'accueil" +msgstr "Options de l'écran d'accueil" msgctxt "#31102" msgid "Background" @@ -170,11 +170,11 @@ msgctxt "#31103" msgid "Show \"Paused\" in picture slideshow" -msgstr "Afficher « Pause » dans le diaporama d'images" +msgstr "Afficher \"Pause\" dans le diaporama d'images" msgctxt "#31104" msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Lire les bandes-annonces dans une fenêtre [COLOR=grey3](juste l'information de la vidéo)[/COLOR]" +msgstr "Lire les bandes-annonces dans une fenêtre [COLOR=grey3](Juste l'information de la vidéo)[/COLOR]" msgctxt "#31106" msgid "Miscellaneous options" @@ -214,16 +214,12 @@ msgctxt "#31118" msgid "Home page programs submenu" -msgstr "Sous-menu Programmes de la page d'accueil" +msgstr "Sous-menu \"Programmes\" de la page d'accueil" msgctxt "#31119" msgid "Hide background fanart" msgstr "Masquer le fanart d'arrière-plan" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Masquer le guide TV en présence de RDS sur le canal" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Afficher la vidéo en cours de lecture en arrière-plan" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Afficher la visualisation en cours de lecture en arrière-plan" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Jouer les génériques TV dans la vidéothèque (extension TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Paroles" @@ -242,31 +246,31 @@ msgctxt "#31132" msgid "Lyrics add-on" -msgstr "Extension de paroles" +msgstr "Extensions de paroles" msgctxt "#31134" msgid "Home page \"Videos\" submenu" -msgstr "Sous-menu Vidéos de la page d'accueil" +msgstr "Sous-menu \"Vidéos\" de la page d'accueil" msgctxt "#31135" msgid "Home page \"Music\" submenu" -msgstr "Sous-menu Musique de la page d'accueil" +msgstr "Sous-menu \"Musique\" de la page d'accueil" msgctxt "#31136" msgid "Home page \"Pictures\" submenu" -msgstr "Sous-menu Images de la page d'accueil" +msgstr "Sous-menu \"Images\" de la page d'accueil" msgctxt "#31140" msgid "Music OSD" -msgstr "Incrustation à l'écran Musique" +msgstr "Menu à l'écran Musique" msgctxt "#31141" msgid "Video OSD" -msgstr "Incrustation à l'écran Vidéos" +msgstr "Menu à l'écran Vidéo" msgctxt "#31142" msgid "Settings level" -msgstr "Niveau de paramétrage" +msgstr "Niveau de paramètres" msgctxt "#31200" msgid "Shortcuts" @@ -274,7 +278,7 @@ msgctxt "#31203" msgid "Choose your song" -msgstr "Choisir une chanson" +msgstr "Choisir votre morceau" msgctxt "#31205" msgid "Lyrics source" @@ -322,19 +326,19 @@ msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" -msgstr "Image fanart[CR][CR]Indisponible[CR][CR]Cliquer sur le bouton pour définir" +msgstr "Image Fanart[CR][CR]Indisponible[CR][CR] Cliquer sur le bouton pour définir" msgctxt "#31312" msgid "Current scraper" -msgstr "Collecteur actuel" +msgstr "Scraper actuel" msgctxt "#31313" msgid "Choose a scraper" -msgstr "Choisir un collecteur" +msgstr "Choisir un scraper" msgctxt "#31314" msgid "Content scanning options" -msgstr "Options d'analyse de contenu" +msgstr "Options de balayage des contenus" msgctxt "#31317" msgid "Set fanart path" @@ -348,13 +352,17 @@ msgid "Last logged in" msgstr "Dernière connexion" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Sélecteur de chanson Karaoké" + msgctxt "#31322" msgid "Aired" msgstr "Diffusé" msgctxt "#31325" msgid "Playlist options" -msgstr "Options de la liste de lecture" +msgstr "Options des listes de lecture" msgctxt "#31326" msgid "Created" @@ -370,7 +378,7 @@ msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" -msgstr "[B]Arrêt programmé ![/B][COLOR=grey2] - Le système s'arrêtera dans[/COLOR]" +msgstr "[B]Minuterie programmée ![/B] [COLOR=grey2] - Arrêt automatique du système dans[/COLOR]" msgctxt "#31330" msgid "Click button to play[CR][CR]movie trailer" @@ -398,7 +406,7 @@ msgctxt "#31355" msgid "Movie menu" -msgstr "Menu film" +msgstr "Menu Film" msgctxt "#31356" msgid "Download subtitles" @@ -422,55 +430,55 @@ msgctxt "#31391" msgid "Skin default with no caps" -msgstr "Prédéfini par l'habillage, sans majuscules" +msgstr "Prédéfini par l'habillage sans majuscules" msgctxt "#31392" msgid "Arial based" -msgstr "Basée sur Arial" +msgstr "Basé sur Arial" msgctxt "#31400" msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver" -msgstr "[B]CONFIGURATION DES PARAMÈTRES D'APPARENCE[/B][CR][CR]Changement de l'habillage · Définition de la langue et de la région · Modification des options de listage de fichiers · Configuration d'un économiseur d'écran" +msgstr "[B]CONFIGURATION DES PARAMÈTRES D'APPARENCE[/B][CR][CR]Changer l'habillage · Définir la langue et la région · Changer les options de liste de fichiers[CR]Configurer un économiseur d'écran" msgctxt "#31401" msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" -msgstr "[B]CONFIGURATION DES PARAMÈTRES DES VIDÉOS[/B][CR][CR]Gestion de la vidéothèque · Définition des options de lecture de vidéos · Modification des options de listage de vidéos · Définition des polices de sous-titres" +msgstr "[B]CONFIGURATION DES PARAMÈTRES VIDÉO[/B][CR][CR]Gérer votre médiathèque vidéo · Définir les options de lecture · Changer les options des listes de vidéos[CR]Définir la police des sous-titres" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]CONFIGURATION DES PARAMÈTRES DE MUSIQUE[/B][CR][CR]Gestion de l'audiothèque · Définition des options de lecture · Modification des options de listes de musique · Configuration de la soumission de chanson" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGURATION DES PARAMÈTRES MUSIQUE[/B][CR][CR]Gérer votre médiathèque musicale · Définir les options de lecture · Changer les options des listes de musique[CR]Paramétrer les soumissions de chansons · Définir les options karaoké" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]CONFIGURATION DES PARAMÈTRES DES IMAGES[/B][CR][CR]Définition des options de listage d'images · Configuration du diaporama" +msgstr "[B]CONFIGURATION DES PARAMÈTRES D'IMAGE[/B][CR][CR]Définir les options des listes d'images · Configurer le diaporama" msgctxt "#31404" msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]CONFIGURATION DES PARAMÈTRES DE LA MÉTÉO[/B][CR][CR]Définition des différentes villes pour collecter les informations météo" +msgstr "[B]CONFIGURATION DES PARAMÈTRES MÉTÉO[/B][CR][CR]Définir les différentes villes pour recueillir des informations météo" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" -msgstr "[B]CONFIGURATION DES PARAMÈTRES DU SYSTÈME[/B][CR][CR]Configuration et calibration des écrans · Configuration de la sortie audio · Configuration des télécommandes · Définition des options de gestion d'énergie · Activation du débogage · Configuration du verrouillage maître" +msgstr "[B]CONFIGURATION DES PARAMÈTRES SYSTÈME[/B][CR][CR]Configurer et calibrer l'affichage · Configurer les sorties audio · Configurer les périphériques[CR]Définir les options de gestion d'énergie · Activer le débogage · Configurer le verrouillage administrateur" msgctxt "#31408" msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]CONFIGURATION DES EXTENSIONS[/B][CR][CR]Gestion des extensions installées · Parcours et installation des extensions depuis kodi.tv[CR]Modification des paramètres des extensions" +msgstr "[B]CONFIGURATION DES EXTENSIONS[/B][CR][CR]Gérer vos extensions installées · Parcourir et installer des extensions depuis kodi.tv[CR]Modifier les paramètres des extensions" msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" -msgstr "[B]CONFIGURATION DES RÉGLAGES TV[/B][CR][CR]Modification des informations de plein écran · Gestion des données du guide électronique des programmes TV" +msgstr "[B]CONFIGURATION DES RÉGLAGES TV[/B][CR][CR]Changer les informations de plein écran · Gérer les données du guide des programmes" msgctxt "#31410" msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" -msgstr "[B]CONFIGURATION DES PARAMÈTRES DES SERVICES[/B][CR][CR]Configuration du contrôle de Kodi via UPnP et HTTP · Configuration du partage de fichiers · Activation Zeroconf · Configuration AirPlay" +msgstr "[B]CONFIGURATION DES PARAMÈTRES DE SERVICE[/B][CR][CR]Configurer le contrôle de Kodi via UPnP et HTTP · Configurer le partage de fichiers[CR]Activer Zeroconf · Configurer AirPlay" msgctxt "#31411" msgid "First run help..." -msgstr "Aide au démarrage" +msgstr "Lancer l'aide d'abord..." msgctxt "#31412" msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Cet onglet signifie qu'il y a un menu sur le côté gauche de la fenêtre qui contient des options supplémentaires pour cette section. Pour accéder au menu, naviguer vers la gauche avec la télécommande ou le clavier, ou placer le pointeur de la souris ou un doigt sur l'onglet.[CR][CR]Cliquer sur « OK » pour fermer cette fenêtre. Elle n’apparaîtra plus." +msgstr "Cet onglet signifie qu'il y a un menu sur le côté de la fenêtre qui contient des options supplémentaires pour cette section. Pour accéder au menu, naviguez vers la gauche avec votre télécommande ou votre clavier ou placez le pointeur de votre souris sur l'onglet.[CR][CR]Cliquez sur \"OK\" pour fermer cette fenêtre. Elle n’apparaîtra plus." msgctxt "#31413" msgid "Local subtitle available" @@ -482,15 +490,15 @@ msgctxt "#31421" msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Choisir le profil utilisateur Kodi[CR]pour s'identifier et poursuivre" +msgstr "Choisissez votre profil utilisateur Kodi[CR]pour vous identifier et poursuivre" msgctxt "#31422" msgid "Show or hide the login screen at startup." -msgstr "Affiche ou masque l'écran de connexion au démarrage." +msgstr "Afficher ou masquer l'écran de connexion au démarrage." msgctxt "#31423" msgid "Select the profile that will be used at startup when the login screen is disabled." -msgstr "Sélection du profil utilisé au démarrage lorsque l'écran de connexion est désactivé." +msgstr "Sélectionner le profil utilisé au démarrage lorsque l'écran de connexion est désactivé." msgctxt "#31501" msgid "Scheduled time" @@ -518,11 +526,11 @@ msgctxt "#31509" msgid "Channel group" -msgstr "Groupe de chaînes " +msgstr "Groupe de chaînes" msgctxt "#31510" msgid "Timer set" -msgstr "Programmation définie" +msgstr "Minuterie définie" msgctxt "#31511" msgid "Channel options" @@ -534,11 +542,11 @@ msgctxt "#31902" msgid "Hourly forecast" -msgstr "Prévisions heure par heure" +msgstr "Prévision heure par heure" msgctxt "#31903" msgid "Weekend forecast" -msgstr "Prévisions du week-end" +msgstr "Prévisions de fin de semaine" msgctxt "#31904" msgid "Daily forecast" @@ -554,7 +562,7 @@ msgctxt "#31909" msgid "Fetching forecast info..." -msgstr "Récupération des prévisions météo..." +msgstr "Récupération des prévisions météo…" msgctxt "#31910" msgid "Maps" @@ -594,7 +602,7 @@ msgctxt "#31958" msgid "PLAY DISC" -msgstr "LIRE DISQUE" +msgstr "DISQUE" msgctxt "#31959" msgid "SYSTEM" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.gl_es/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.gl_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.gl_es/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.gl_es/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: gl_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Troca o teu" - -msgctxt "#31003" -msgid "Power options" -msgstr "Opcións de enerxía" - msgctxt "#31004" msgid "Working..." msgstr "Traballando..." -msgctxt "#31005" -msgid "Hide information" -msgstr "Agochar información" - msgctxt "#31006" msgid "View options" msgstr "Opcións da vista" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "Pantalla completa" -msgctxt "#31009" -msgid "Total duration" -msgstr "Duración total" - msgctxt "#31022" msgid "Music - Files" msgstr "Música - Ficheiros" @@ -60,30 +44,14 @@ msgid "Items" msgstr "Elementos" -msgctxt "#31026" -msgid "Misc options" -msgstr "Outras opcións" - msgctxt "#31027" msgid "Location" msgstr "Localización" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Envoltorio de cartel" - msgctxt "#31029" msgid "Fanart" msgstr "Cartel" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Miniaturas" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Envoltura de Imaxe" - msgctxt "#31033" msgid "Info" msgstr "Info" @@ -92,10 +60,6 @@ msgid "Actions" msgstr "Accións" -msgctxt "#31040" -msgid "Now playing" -msgstr "Reproducindo" - msgctxt "#31042" msgid "PLAYING" msgstr "REPRODUCINDO" @@ -116,10 +80,6 @@ msgid "SEEKING" msgstr "BUSCANDO" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Preconfiguracións de visualizacións" - msgctxt "#31049" msgid "End time" msgstr "Hora de fin" @@ -156,10 +116,6 @@ msgid "This file is stacked, select the part you want to play from." msgstr "Este ficheiro esta amontoado, selecione a parte que quere reproducir." -msgctxt "#31061" -msgid "Current selected" -msgstr "Seleccionado actualmente" - msgctxt "#31101" msgid "Home screen options" msgstr "Opcións da pantalla de inicio" @@ -168,26 +124,10 @@ msgid "Background" msgstr "Fondo" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Amosar \"Pausado\" nunha diapositiva." - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Reproducir avances nunha xanela [COLOR=grey3](Só diálogo de información de vídeo)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" msgstr "Outras opcións" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Agochar a lectura da marcaxe dende os nomes dos videos [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Ocultar botóns do menú principal" - msgctxt "#31109" msgid "Enable custom background" msgstr "Activar fondo personalizado" @@ -204,58 +144,18 @@ msgid "Options" msgstr "Opcións" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Amosar albumes engadidos recentemente" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Amosar vídeos engadidos recentemente" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Submenú de Aplicacións da Páxina de Inicio" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Agochar o fondo do cartel" - -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Ocultar EPG se RDS está presente na fiestra da canle" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Amosar o vídeo reproducíndose actualmente no fondo" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Amosar a visualización 'En Reprodución' no fondo" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Reproducir as cancións das series de TV na bibloteca de video (Engadido TVTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "Letras" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Agochar cartel na visualización de pantalla completa" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Complemento de letras" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Submenú de Vídeos da Páxina de Inicio" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Submenú de Música da Páxina de Inicio" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Submenú de Imaxes da Páxina de Inicio" - msgctxt "#31140" msgid "Music OSD" msgstr "OSD de Música" @@ -272,90 +172,22 @@ msgid "Shortcuts" msgstr "Atallos" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Escolle a túa canción" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Fonte das letras" - msgctxt "#31206" msgid "Found" msgstr "Atopado" -msgctxt "#31207" -msgid "Find more items" -msgstr "Atopar máis elementos" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Vindeiros episodios" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Temperatura actual" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Última actualización" - msgctxt "#31303" msgid "Data provider" msgstr "Provedor de datos" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Agochar fanart" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Detalles do filme" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Memoria empregada:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Nº de pista" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" msgstr "Imaxe de cartel[CR][CR]Non dispoñible[CR][CR] Preme o botón para estabrecer" -msgctxt "#31312" -msgid "Current scraper" -msgstr "Scraper actual" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Escoller scraper" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Opcións de escaneado de contidos" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Estabelecer ruta dos Fanart" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Selecionar perfíl" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Último ingreso" - msgctxt "#31322" msgid "Aired" msgstr "Emitido" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Opcións da listaxe de reprodución" - msgctxt "#31326" msgid "Created" msgstr "Creado" @@ -364,22 +196,10 @@ msgid "Resolution" msgstr "Resolución" -msgctxt "#31328" -msgid "Recently added" -msgstr "Engadidos recentemente" - msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" msgstr "[B]Temporizador estabrecido![/B] [COLOR=grey2] - Apagado automático de sistema en[/COLOR]" -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Prema o botón para reproducir[CR][CR]Avance do filme" - -msgctxt "#31331" -msgid "Album details" -msgstr "Detalles do álbum" - msgctxt "#31351" msgid "Pause" msgstr "Pausa" @@ -388,10 +208,6 @@ msgid "Stop" msgstr "Parar" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Axiña adiante" - msgctxt "#31354" msgid "Rewind" msgstr "Atrás" @@ -400,10 +216,6 @@ msgid "Movie menu" msgstr "Menú do filme" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Descargar subtítulos" - msgctxt "#31360" msgid "Watch as 2D" msgstr "Ver como 2D" @@ -420,41 +232,25 @@ msgid "Skin default" msgstr "Pel predefinida" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Pel predefinida sen maiúsculas" - msgctxt "#31392" msgid "Arial based" msgstr "Baseado en Arial" msgctxt "#31400" msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver" -msgstr "[B]CONFIGURAR PARÁMETROS DE APARENCIA[/B][CR][CR]Trocar o tema - Estabelecer lingua e rexión - Trocar opcións de listado de ficheiros[CR]Estabelecer o protector de pantalla" +msgstr "[B]CONFIGURAR PARÁMETROS DE APARIENCIA[/B][CR][CR]Trocar a pel · Estabelecer o idioma e a rexión · Trocar as opcións de listado de ficheiros[CR]Estabelecer o protector de pantalla" msgctxt "#31401" msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" -msgstr "[B]CONFIGURAR PARÁMETROS DE VÍDEO[/B][CR][CR]Xestionar a biblioteca de vídeo · Estabelecer opcións da reprodución de vídeo · Trocar opcións de listado de vídeos[CR]Estabelecer fontes dos subtítulos" +msgstr "[B]CONFIGURAR PARÁMETROS DE VÍDEO[/B][CR][CR]Xestionar a bibloteca de vídeo · Estabrecer opcións da reprodución de vídeo · Trocar opcións de listado de vídeos[CR]Estabrecer fontes dos subtítulos" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]CONFIGURAR PARÁMETROS DE MÚSICA[/B][CR][CR]Xestionar a biblioteca de música · Estabelecer opcións de reprodución de música · Trocar opcións do listado da música[CR]Estabelecer a submisión das cancións" - -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]CONFIGURAR PARÁMETROS DE IMAXES[/B][CR][CR]Estabelecer opcións do listado de imaxes · Configurar presentacións" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]CONFIGURAR PARÁMETROS METEOROLÓXICOS[/B][CR][CR]Escoller o complemento de tempo · Estabelecer varias cidade para obter a súa información" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGURAR PARÁMETROS DE MÚSICA[/B][CR][CR]Xestionar a bibloteca de música · Estabrecer as opcións de reprodución de música · Trocar opcións do listado da música[CR]Estabrecer o envío de cancións · Estabrecer as opcións do karaoke" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" -msgstr "[B]CONFIGURAR PARÁMETROS DO SISTEMA[/B][CR][CR]Configurar as pantallas · Configurar a saída de son · Estabelecer mandos remotos[CR]Estabelecer opcións de aforro enerxético · Activar depuración · Activar a depuración · Estabelecer bloqueo mestre" - -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]CONFIGURAR COMPLEMENTOS[/B][CR][CR]Xestionar complementos instalados · Buscar e instalar complementos de kodi.tv[CR]Modificar a configuración dos complementos" +msgstr "[B]CONFIGURAR PARÁMETROS DO SISTEMA[/B][CR][CR]Configurar as pantallas · Configurar a saída de audio · Estabrecer mandos remotos[CR]Estabrecer opcións de aforro enerxético · Activar depuración · Estabrecer bloque mestre" msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" @@ -462,15 +258,7 @@ msgctxt "#31410" msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" -msgstr "[B]CONFIGURAR PARÁMETROS DOS SERVIZOS[/B][CR][CR]Configurar o control de Kodi vía UPnP e HTTP · Configurar compartición de ficheiros[CR]Activar Zeroconf · Configurar AirPlay" - -msgctxt "#31411" -msgid "First run help..." -msgstr "Axuda na primeira execución..." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Esta lapela significa que existe un menú desactivado nesta xanela que contén máis opcións para esta sección. Para acceder ó menú, ir a esquerda co control remoto o teclado ou move o punteiro do rato até a lapela. [CR][CR]Preme en \"Feito\" para pechar a caixa de diálogo. Non aparecerá máis." +msgstr "[B]CONFIGURAR PARÁMETROS DO SERVIZO[/B][CR][CR]Configurar o control de Kodi vía UPnP e HTTP · Configurar compartición de ficheiros[CR]Activar Zeroconf · Configurar AirPlay" msgctxt "#31413" msgid "Local subtitle available" @@ -480,10 +268,6 @@ msgid "Login" msgstr "Inicio de sesión" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Selecione o seu perfíl de usuario de Kodi[CR]para ingresar e continuar" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "Amosar ou agochar a pantalla de inicio de sesión ao iniciar." @@ -492,66 +276,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "Usar o perfil a usar no inicio cando a pantalla de inicio de sesión estea desactivada." -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Hora programada" - msgctxt "#31502" msgid "TV" msgstr "TV" -msgctxt "#31503" -msgid "Add group" -msgstr "Engadir grupo" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Renomear grupo" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Eliminar grupo" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "Grupos[CR]Dispoñíbeis" -msgctxt "#31509" -msgid "Channel group" -msgstr "Canle do Grupo" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Axuste do Temporizador" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Opcións da Canle" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "Predición para 36 horas" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Predición de hora en hora" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Predición para a fin de semana" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Predición diaria" - msgctxt "#31905" msgid "Forecast" msgstr "Predición" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Probabilidade de Chuvia" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "Obtendo información da predición..." diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.he_il/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.he_il/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.he_il/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.he_il/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "נטרל הצגת פאנארט כרקע" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "הסתר לוח שידורים מחלון ערוץ אם זמין מידע RDS" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "הצג וידאו \"מנגן כעת\" כרקע" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "הצג חיזוי \"מנגן כעת\" כרקע" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "נגן נעימת סדרה בספריית הוידאו (הרחבת TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "מילות שיר" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "חובר לאחרונה" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "בוחר שיר קריוקי" + msgctxt "#31322" msgid "Aired" msgstr "שודר" @@ -437,8 +445,8 @@ msgstr "[B]שינוי הגדרות וידאו[/B][CR][CR]ניהול ספריית הווידאו · קביעת העדפות ניגון וידאו · שינוי אפשרויות תצוגת קבצי וידאו[CR]הגדרת גופן כתוביות" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]שינוי הגדרות מוזיקה[/B][CR][CR]ניהול ספריית המוזיקה · קביעת העדפות ניגון מוזיקה · שינוי אפשרויות תצוגת קבצי מוזיקה[CR]" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]שינוי הגדרות מוזיקה[/B][CR][CR]ניהול ספריית המוזיקה · קביעת העדפות ניגון מוזיקה · שינוי אפשרויות תצוגת קבצי מוזיקה[CR]הגדרת אפשרויות קריוקי" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.hr_hr/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.hr_hr/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.hr_hr/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.hr_hr/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -214,16 +214,12 @@ msgctxt "#31118" msgid "Home page programs submenu" -msgstr "Početna stranica \"Programi\" podizbornika" +msgstr "Početna stranica podizbornika programa " msgctxt "#31119" msgid "Hide background fanart" msgstr "Sakrij pozadinu slike omota" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Sakrij EPG ako je RDS prisutan na prozoru programa" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Prikaži pozadinu \"Trenutno se reproducira\" videa" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Prikaži pozadinu \"Trenutno se reproducira\" vizualizacije" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Reproduciraj pjesme TV tema iz videoteke (TvTunes dodatak)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "Tv melodije" + msgctxt "#31128" msgid "Lyrics" msgstr "Tekstovi pjesama" @@ -246,15 +250,15 @@ msgctxt "#31134" msgid "Home page \"Videos\" submenu" -msgstr "Početna stranica \"Video\" podizbornika" +msgstr "Početna stranica \"video\" podizbornika" msgctxt "#31135" msgid "Home page \"Music\" submenu" -msgstr "Početna stranica \"Glazba\" podizbornika" +msgstr "Početna stranica \"glazbenog\" podizbornika" msgctxt "#31136" msgid "Home page \"Pictures\" submenu" -msgstr "Početna stranica \"Slike\" podizbornika" +msgstr "Početna stranica podizbornika \"slika\"" msgctxt "#31140" msgid "Music OSD" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Posljednji prijavljen" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Izbornik karaoke pjesama" + msgctxt "#31322" msgid "Aired" msgstr "Emitirano" @@ -437,8 +445,8 @@ msgstr "[B]PRILAGODITE VIDEO POSTAVKE[/B][CR][CR]Upravljajte svojom videotekom · Postavite mogućnosti reprodukcije videa[CR]Promijenite mogućnosti popisivanja video sadržaja · Postavite slova podnaslova" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]PRILAGODITE POSTAVKE GLAZBE[/B][CR][CR]Upravljajte svojm fonotekom · Postavite mogućnosti reprodukcije glazbe · Promjenite mogućnosti popisivanja glazbenoga sadržaja[CR]Postavite slanje pjesama" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]PRILAGODITE POSTAVKE GLAZBE[/B][CR][CR]Upravljajte svojm fonotekom · Postavite mogućnosti reprodukcije glazbe[CR]Promjenite mogućnosti popisivanja glazbenoga sadržaja · Postavite slanje pjesama · Postavite mogućnosti karaoka" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.hu_hu/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.hu_hu/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.hu_hu/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.hu_hu/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -114,11 +114,11 @@ msgctxt "#31046" msgid "SEEKING" -msgstr "KERESÉS" +msgstr "KERESŐ" msgctxt "#31048" msgid "Visualisation presets" -msgstr "Vizualizáció előbeállítások" +msgstr "Vizualizáció beállításai" msgctxt "#31049" msgid "End time" @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Fanart-háttér elrejtése" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Rejtse el az EPG-t, ha az RDS látható a csatorna ablakban" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "A háttérben az éppen játszott videó megjelenítése" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "A háttérben az éppen futó vizualizáció megjelenítése" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "TV főtéma dalok játszása a videó médiatárban (TvTunes kiegészítő)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Dalszöveg" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Utoljára bejelentkezve" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Karaoke dalválasztó" + msgctxt "#31322" msgid "Aired" msgstr "Játszva" @@ -437,8 +445,8 @@ msgstr "[B]VIDEÓ BEÁLLÍTÁSOK[/B][CR][CR]Film médiatár kezelése · Videólejátszás beállítása · Videólistázás módjának beállítása[CR]Feliratok karaktertípusának váltása" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]ZENE BEÁLLÍTÁSOK[/B][CR][CR]Zene médiatár kezelése · Zenelejátszás beállítása · Zenelistázás módjának beállítása[CR]Hang benyújtásának beállítása" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]ZENE BEÁLLÍTÁSOK[/B][CR][CR]Zene médiatár kezelése · Zenelejátszás beállítása · Zenelistázás módjának beállítása[CR]Zene lejátszási szabályok felállítása · Karaoke lehetőségek" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" @@ -466,7 +474,7 @@ msgctxt "#31411" msgid "First run help..." -msgstr "Segítség első indításkor…" +msgstr "Segítség első indításkor..." msgctxt "#31412" msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.hy_am/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.hy_am/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.hy_am/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.hy_am/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -128,6 +128,14 @@ msgid "Options" msgstr "Տարբերակներ" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Նվագարկել TV թեմայի երգերը տեսադարանում (TvTunes add-on)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TV-Որոնում" + msgctxt "#31128" msgid "Lyrics" msgstr "Երգի բառեր" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.id_id/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.id_id/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.id_id/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.id_id/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: id_ID\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Ubah" - -msgctxt "#31003" -msgid "Power options" -msgstr "Pilihan daya" - msgctxt "#31004" msgid "Working..." msgstr "Mengerjakan..." -msgctxt "#31005" -msgid "Hide information" -msgstr "Menyembunyikan informasi" - msgctxt "#31006" msgid "View options" msgstr "Lihat Pilihan" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "Video Mainkan Secara Otomatis" -msgctxt "#31009" -msgid "Total duration" -msgstr "Total durasi" - msgctxt "#31022" msgid "Music - Files" msgstr "Berkas - Musik" @@ -60,30 +44,14 @@ msgid "Items" msgstr "Item" -msgctxt "#31026" -msgid "Misc options" -msgstr "Pilihan Misc" - msgctxt "#31027" msgid "Location" msgstr "Lokasi" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Mengemas poster" - msgctxt "#31029" msgid "Fanart" msgstr "Fanart" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Tampilan gambar" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Mengemas gambar" - msgctxt "#31033" msgid "Info" msgstr "Info" @@ -92,10 +60,6 @@ msgid "Actions" msgstr "Aksi" -msgctxt "#31040" -msgid "Now playing" -msgstr "Sedang dimainkan" - msgctxt "#31042" msgid "PLAYING" msgstr "Mainkan" @@ -116,10 +80,6 @@ msgid "SEEKING" msgstr "MENCARI" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Visualisasi yang telah ditetapkan" - msgctxt "#31049" msgid "End time" msgstr "Waktu selesai" @@ -156,10 +116,6 @@ msgid "This file is stacked, select the part you want to play from." msgstr "Berkas ini sudah ditumpuk, pilih bagian yang ingin anda mainkan" -msgctxt "#31061" -msgid "Current selected" -msgstr "Pilihan saat ini" - msgctxt "#31101" msgid "Home screen options" msgstr "Opsi Home Screen" @@ -168,26 +124,10 @@ msgid "Background" msgstr "Latar belakang" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Tampilkan video dalam daftar berkas gambar." - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Putar Trailer dalam sebuah jendela [COLOR=grey3](Hanya dialog informasi video Saja)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" msgstr "Opsi Lainnya" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Sembunyikan flagging membaca dari nama file video [COLOR = grey3] (misalnya Blu-ray, HD-DVD) [/ COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Sembunyikan tombol menu utama" - msgctxt "#31109" msgid "Enable custom background" msgstr "Fungsikan background custom" @@ -204,54 +144,18 @@ msgid "Options" msgstr "Opsi" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Tampilkan album baru yang sudah ditambahkan" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Tampilkan album baru yang sudah ditambahkan" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Laman Program Submenu" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Sembunyikan Background Fanart" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Tampilkan Video latar belakang \"Sedang dimainkan\"" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Tampilkan latar belakang visualisasi \"Sedang Memainkan\"" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Putar lagu tema TV dalam pustaka video (Pengaya TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "Lirik" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Sembunyikan Fanart pada visualisasi layar penuh" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Add-on lirik" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Submenu halaman utama \"Video\"" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Submenu halaman utama \"Music\"" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Submenu halaman utama \"gambar\"" - msgctxt "#31140" msgid "Music OSD" msgstr "OSD Musik" @@ -268,90 +172,22 @@ msgid "Shortcuts" msgstr "Bookmark" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Pilih lagu Anda" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Sumber lirik" - msgctxt "#31206" msgid "Found" msgstr "Ditemukan" -msgctxt "#31207" -msgid "Find more items" -msgstr "Cari item" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Episode mendatang" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Suhu saat ini" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Pembaharuan terakhir" - msgctxt "#31303" msgid "Data provider" msgstr "Penyedia data" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Sembunyikan fanart" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Rincian film" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Memori yang digunakan:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Nomor track" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" msgstr "Gambar Fanart[CR][CR]Tidak tersedia[CR][CR] Klik tombol untuk mengatur" -msgctxt "#31312" -msgid "Current scraper" -msgstr "Scraper saat ini" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Pilih scraper" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Pilihan pemindaian konten" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Set jalur fanart" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Profil pilihan" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Login terakhir" - msgctxt "#31322" msgid "Aired" msgstr "Disiarkan" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Opsi Daftar Main" - msgctxt "#31326" msgid "Created" msgstr "Dibuat" @@ -368,14 +204,6 @@ msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" msgstr "[B]Atur Timer![/B] [COLOR=grey2] - Sistem dimatikan secara otomatis dalam[/COLOR]" -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Klik tombol untuk mainkan [CR] [CR] trailer film" - -msgctxt "#31331" -msgid "Album details" -msgstr "Rincian album" - msgctxt "#31351" msgid "Pause" msgstr "Pause" @@ -384,10 +212,6 @@ msgid "Stop" msgstr "Berhenti" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Mempercepat" - msgctxt "#31354" msgid "Rewind" msgstr "Mundurkan" @@ -396,10 +220,6 @@ msgid "Movie menu" msgstr "Menu film" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "unduh sub judul" - msgctxt "#31360" msgid "Watch as 2D" msgstr "Tonton sebagai 2D" @@ -416,10 +236,6 @@ msgid "Skin default" msgstr "Kulit Standar" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Skin standard tanpa topi" - msgctxt "#31392" msgid "Arial based" msgstr "berbasis Arial" @@ -432,22 +248,14 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]KONFIGURASI SETELAN VIDEO[/B][CR][CR]Kelola pustaka video Anda · Set opsi pemutaran video · Rubah opsi daftar video[CR]Atur font subtitle" -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B] PENGATURAN KONFIGURASI GAMBAR [/ B] [CR] [CR] Mengatur pilihan daftar gambar · Konfigurasi dafra slideshow" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B] PENGATURAN KONFIGURASI CUACA [/ B] [CR] [CR] Mengatur berbagai kota untuk mengumpulkan informasi cuaca" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KONFIGURASIKAN SETELAN MUSIK[/B][CR][CR]Kelola pustaka musik Anda · Atur opsi pemutaran musik · Rubah opsi daftar musik[CR]Setel submisi lagu · Setel opsi karaoke" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]KONFIGURASIKAN SETELAN SISTEM[/B][CR][CR]Setel dan kalibrasi tampilan · Konfigurasi keluaran audio · Setel remote control[CR]Atur opsi hemat daya · Aktifkan debugging · Setel kunci master" -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B] KONFIGURASI ADD-ONS [/ B] [CR] [CR] Mengelola add-ons yang telah terintsall · Browse for dan menginstal add-ons dari kodi.tv [CR] Modifikasi pengaturan add-on" - msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" msgstr "[B]KONFIGURASIKAN SETELAN TV[/B][CR][CR]Rubah info layar penuh · Kelola setelan data EPG" @@ -456,14 +264,6 @@ msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" msgstr "[B]KONFIGURASIKAN SETELAN LAYANAN[/B][CR][CR]Setel kontrol Kodi melalui UPnP dan HTTP · Konfigurasikan layanan berbagi berkas[CR]Aktifkan Zeroconf · Konfigurasikan AirPlay" -msgctxt "#31411" -msgid "First run help..." -msgstr "Pertama jalankan bantuan..." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Tab ini menandakan bahwa ada menu off ke sisi jendela ini yang berisi opsi tambahan untuk bagian ini. Untuk mengakses menu, arahkan ke kiri dengan remote control atau keyboard atau tempatkan pointer mouse Anda ke tab. [CR] [CR] Klik \"OK\" untuk menutup dialog ini. Ini tidak akan muncul lagi." - msgctxt "#31413" msgid "Local subtitle available" msgstr "Subtitle lokal tersedia" @@ -472,10 +272,6 @@ msgid "Login" msgstr "Login" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Pilih profil pengguna Kodi Anda [CR] untuk login dan lanjutkan" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "Tampilkan atau sembunyikan layar login pada startup." @@ -484,66 +280,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "Pilih profil akan digunakan ketika startup apabila layar login dinonaktifkan." -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Waktu yang telah dijadwalkan" - msgctxt "#31502" msgid "TV" msgstr "TV" -msgctxt "#31503" -msgid "Add group" -msgstr "Tambah grup" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Mengubah nama grup" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Hapus grup" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "Grup[CR]Tersedia" -msgctxt "#31509" -msgid "Channel group" -msgstr "Grup saluran" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Set timer" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Pilihan saluran" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "Perkiraan 36 jam" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Perkiraan jam" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Perkiraan akhir pekan" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Perkiraan harian" - msgctxt "#31905" msgid "Forecast" msgstr "Ramalan" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Kemungkinan presipitasi" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "Mengambil info ramalan..." diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.is_is/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.is_is/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.is_is/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.is_is/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: is_IS\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Breyta þínu" - -msgctxt "#31003" -msgid "Power options" -msgstr "Orkukostir" - msgctxt "#31004" msgid "Working..." msgstr "Vinnsla..." -msgctxt "#31005" -msgid "Hide information" -msgstr "Fela upplýsingar" - msgctxt "#31006" msgid "View options" msgstr "Stillingar sjónarhorns" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "Fylla skjá" -msgctxt "#31009" -msgid "Total duration" -msgstr "Heildar tímalengd" - msgctxt "#31022" msgid "Music - Files" msgstr "Tónlist - Skrár" @@ -60,30 +44,14 @@ msgid "Items" msgstr "Hlutir" -msgctxt "#31026" -msgid "Misc options" -msgstr "Ýmsir valkostir" - msgctxt "#31027" msgid "Location" msgstr "Staðsetning" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Veggspjaldafletting" - msgctxt "#31029" msgid "Fanart" msgstr "Aðdáendamyndir" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Smámyndir" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Myndafletting" - msgctxt "#31033" msgid "Info" msgstr "Upplýsingar" @@ -92,10 +60,6 @@ msgid "Actions" msgstr "Aðgerðir" -msgctxt "#31040" -msgid "Now playing" -msgstr "Í spilun" - msgctxt "#31042" msgid "PLAYING" msgstr "SPILA" @@ -116,10 +80,6 @@ msgid "SEEKING" msgstr "LEITA" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Forstillingar myndskreytinga" - msgctxt "#31049" msgid "End time" msgstr "Lokatími" @@ -156,10 +116,6 @@ msgid "This file is stacked, select the part you want to play from." msgstr "Þessi skrá er stöfluð, veldu þann part sem þú vilt byrja að spila frá." -msgctxt "#31061" -msgid "Current selected" -msgstr "Núverandi val" - msgctxt "#31101" msgid "Home screen options" msgstr "Stillingar heimaskjás" @@ -168,26 +124,10 @@ msgid "Background" msgstr "Bakgrunnur" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Sýna \"Í bið\" í mynda-glærusýningu" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Spila kvikmyndasýnishorn í glugga [COLOR=grey3](Aðeins myndbandaupplýsingarglugga)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" msgstr "Ýmsir valkostir" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Fela flagg lesið frá skráarnöfnum [COLOR=grey3](t.d Blu-ray, HD-DVD)[/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Fela hnappa í aðalvalmynd" - msgctxt "#31109" msgid "Enable custom background" msgstr "Virkja sérsniðinn bakgrunn" @@ -204,54 +144,18 @@ msgid "Options" msgstr "Valkostir" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Sýna hljómplötur sem hefur nýlega verið bætt við" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Sýna myndbönd sem var nýlega bætt við" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Undirvalmynd forrita-heimasíðu" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Fela aðdáendamyndir í bakgrunni" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Sýna \"Í spilun\" myndband í bakgrunni" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Sýna \"Í spilun\" myndskreytingu í bakgrunni" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Spila þema lög í myndbandasafni (TvTunes viðbót)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "Lagatextar" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Fela aðdáendamyndir í myndhrifum fyrir allan skjá" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Viðbót fyrir lagatexta" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Undirvalmynd myndbandasíðu" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Undirvalmynd tónlistarsíðu" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Undirvalmynd ljósmyndaasíðu" - msgctxt "#31140" msgid "Music OSD" msgstr "Tónlistarskjár" @@ -268,90 +172,22 @@ msgid "Shortcuts" msgstr "Flýtileiðir" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Veldu þitt lag" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Veita lagatexta" - msgctxt "#31206" msgid "Found" msgstr "Fann" -msgctxt "#31207" -msgid "Find more items" -msgstr "Finna fleiri atriði" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Næstu þættir" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Núverandi hiti" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Síðast uppfært" - msgctxt "#31303" msgid "Data provider" msgstr "Gagnaveita" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Fela aðdáendamyndir" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Kvikmyndaupplýsingar" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Minni notað:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Númer lags" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" msgstr "Aðdáendamynd[CR][CR]Ekki fáanleg[CR][CR] Smelltu til að breyta" -msgctxt "#31312" -msgid "Current scraper" -msgstr "Núverandi skafa" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Veldu sköfu" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Stillingar fyrir skönnun innihalds" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Breyta slóð fyrir aðdáendamyndir" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Valinn notandi" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Síðast skráður inn" - msgctxt "#31322" msgid "Aired" msgstr "Sýnt" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Valkostir lagalista" - msgctxt "#31326" msgid "Created" msgstr "Búið til" @@ -360,22 +196,10 @@ msgid "Resolution" msgstr "Upplausn" -msgctxt "#31328" -msgid "Recently added" -msgstr "Nýlega bætt við" - msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" msgstr "[B]Tímamælir virkur![/B] [COLOR=grey2] - Sjálfvirkt Slökkt eftir[/COLOR]" -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Smelltu á takka til að spila[CR][CR]Kvikmyndasýnishorn" - -msgctxt "#31331" -msgid "Album details" -msgstr "Hljómplötuupplýsingar" - msgctxt "#31351" msgid "Pause" msgstr "Bið" @@ -384,10 +208,6 @@ msgid "Stop" msgstr "Stöðva" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Hratt áfram" - msgctxt "#31354" msgid "Rewind" msgstr "Til baka" @@ -396,10 +216,6 @@ msgid "Movie menu" msgstr "Kvikmyndavalmynd" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Sækja þýðingartexta" - msgctxt "#31360" msgid "Watch as 2D" msgstr "Horfa á í 2D" @@ -416,10 +232,6 @@ msgid "Skin default" msgstr "Sjálfgildi útlits" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Sjálfgildi útlits með engum hástöfum" - msgctxt "#31392" msgid "Arial based" msgstr "Byggt á Arial" @@ -432,22 +244,14 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]BREYTA SKJÁSTILLINGUM[/B][CR][CR]Sýsla með myndabandasafn · Breyta myndbandaspilun · Breyta stillingum myndbandalista[CR]Breyta leturgerðum þýðingartexta" -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]BREYTA LJÓSMYNDASTILLINGUM[/B][CR][CR]Breyta stillingum ljósmyndalista · Stilla myndasýningar" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]BREYTA VEÐURSTILLINGUM[/B][CR][CR]Skilgreindu nokkrar borgir til að ná í veðurupplýsingar fyrir" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]BREYTA TÓNLISTARSTILLINGUM[/B][CR][CR]Sýsla með tónlistarsafn · Breyta stillingum tónlistarspilara · Breyta stillingum tónlistarlista[CR]Skilgreina laga upphal · Breyta karaoke stillingum" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]BREYTA KERFISSTILLINGUM[/B][CR][CR]Breyta og stilla skjái · Breyta hljóðúttaki · Skilgreina fjarstýringar[CR]Breyta orkukostum · Virkja aflúsun · Skilgreina aðallykilorð" -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]BREYTA VIÐBÓTUM[/B][CR][CR]Breyttu uppsettum viðbótum · Leitaðu að og settu upp viðbætur frá kodi.tv[CR]Breyta stillingum viðbóta" - msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" msgstr "[B]SJÓNVARPSSTILLINGAR[/B][CR][CR]Breyta upplýsingum á fullum skjá · Halda utan um EPG gagnastillingar" @@ -456,14 +260,6 @@ msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" msgstr "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Uppsetning á stjórnun Kodi með UPnP og HTTP · Setja upp skráardeilingu[CR]Virkja Zeroconf · Stilla AirPlay" -msgctxt "#31411" -msgid "First run help..." -msgstr "Keyrið hjálp fyrst..." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Þessi flipi þýðir að það er valblað við hliðina á þessum glugga, sem er með aukastillingum fyrir þennan hluta. Til að komast í valblaðið skaltu fara til vinstri með fjarstýringunni eða lyklaborðinu eða setja músabendilinn á flipann. [CR][CR]Smelltu á \"Í lagi\" til að loka þessum texta. Hann birtist ekki aftur." - msgctxt "#31413" msgid "Local subtitle available" msgstr "Staðvær þýðingartexti tiltækur" @@ -472,10 +268,6 @@ msgid "Login" msgstr "Innskrá" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Veldu Kodi notanda[CR]til að skrá þig inn og halda áfram" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "Sýna eða fela innskráningarskjá við ræsingu." @@ -484,66 +276,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "Veldu uppsetninguna sem verður notuð í ræsingu þegar innskráningarglugginn hefur verið gerður óvirkur." -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Uppsettur tími" - msgctxt "#31502" msgid "TV" msgstr "Sjónvarp" -msgctxt "#31503" -msgid "Add group" -msgstr "Bæta við hóp" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Endurnefna hóp" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Eyða hóp" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "Tiltækir[CR]Hópar" -msgctxt "#31509" -msgid "Channel group" -msgstr "Rásarhópur" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Stilling teljara" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Valkostir rásar" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "36 klst veðurspá" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Klukkustunda veðurspá" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Veðurspá helgarinnar" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Dagleg veðurspá" - msgctxt "#31905" msgid "Forecast" msgstr "Veðurspá" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Líkur á úrkomu" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "Næ í veðurspá..." diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.it_it/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.it_it/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.it_it/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.it_it/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -42,7 +42,7 @@ msgctxt "#31009" msgid "Total duration" -msgstr "Durata totale" +msgstr "Durata Totale" msgctxt "#31022" msgid "Music - Files" @@ -50,7 +50,7 @@ msgctxt "#31023" msgid "Playing" -msgstr "In riproduzione" +msgstr "In Riproduzione" msgctxt "#31024" msgid "Page" @@ -62,7 +62,7 @@ msgctxt "#31026" msgid "Misc options" -msgstr "Opzioni varie" +msgstr "Opzioni Varie" msgctxt "#31027" msgid "Location" @@ -78,7 +78,7 @@ msgctxt "#31031" msgid "Pic thumbs" -msgstr "Miniature immagini" +msgstr "Miniature Immagini" msgctxt "#31032" msgid "Image wrap" @@ -94,7 +94,7 @@ msgctxt "#31040" msgid "Now playing" -msgstr "In riproduzione" +msgstr "In Riproduzione" msgctxt "#31042" msgid "PLAYING" @@ -134,23 +134,23 @@ msgctxt "#31055" msgid "Open playlist" -msgstr "Apri la playlist" +msgstr "Apri Playlist" msgctxt "#31056" msgid "Save playlist" -msgstr "Salva la playlist" +msgstr "Salva Playlist" msgctxt "#31057" msgid "Close playlist" -msgstr "Chiudi la playlist" +msgstr "Chiudi Playlist" msgctxt "#31058" msgid "System music files" -msgstr "Suoni di sistema" +msgstr "Suoni di Sistema" msgctxt "#31059" msgid "Current playlist" -msgstr "Playlist corrente" +msgstr "Playlist Attuale" msgctxt "#31060" msgid "This file is stacked, select the part you want to play from." @@ -162,7 +162,7 @@ msgctxt "#31101" msgid "Home screen options" -msgstr "Opzioni pagina iniziale" +msgstr "Opzioni Pagina Iniziale" msgctxt "#31102" msgid "Background" @@ -170,11 +170,11 @@ msgctxt "#31103" msgid "Show \"Paused\" in picture slideshow" -msgstr "Mostra \"In pausa\" durante la presentazione delle immagini" +msgstr "Mostra \"In Pausa\" durante la presentazione delle immagini" msgctxt "#31104" msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Mostra trailer in una finestra [COLOR=grey3](Solo finestra di dialogo Informazioni video)[/COLOR]" +msgstr "Mostra trailer in finestra [COLOR=grey3](Solo finestra dialogo informazioni Video)[/COLOR]" msgctxt "#31106" msgid "Miscellaneous options" @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Nascondi Sfondo Fanart" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Nascondi l'EPG se è presente l'RDS nella finestra del canale" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Mostra Sfondo Video \"In Riproduzione\"" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Mostra Sfondo Visualizzazione \"In Riproduzione\"" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Riproduci le Sigle TV nella Libreria Video (Add-on TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Testi canzoni" @@ -298,7 +302,7 @@ msgctxt "#31301" msgid "Last updated" -msgstr "Ultimo aggiornamento" +msgstr "Ultimo Aggiornamento" msgctxt "#31303" msgid "Data provider" @@ -318,7 +322,7 @@ msgctxt "#31310" msgid "Track number" -msgstr "Numero traccia" +msgstr "Numero Traccia" msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Ultimo login" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Selettore Canzoni Karaoke" + msgctxt "#31322" msgid "Aired" msgstr "Trasmessa" @@ -418,11 +426,11 @@ msgctxt "#31390" msgid "Skin default" -msgstr "Predefinito della skin" +msgstr "Predefinito Skin" msgctxt "#31391" msgid "Skin default with no caps" -msgstr "Predefinito della skin senza maiuscole" +msgstr "Predefinito Skin senza maiuscole" msgctxt "#31392" msgid "Arial based" @@ -437,8 +445,8 @@ msgstr "[B]CONFIGURA IMPOSTAZIONI VIDEO[/B][CR][CR]Gestisci la tua Libreria video · Imposta le opzioni di riproduzione dei video · Cambia le opzioni per le liste video[CR]Imposta i font dei sottotitoli" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]CONFIGURA IMPOSTAZIONI MUSICA[/B][CR][CR]Gestisci la tua libreria musicale · Imposta le opzioni di riproduzione musicale · Cambia le impostazioni di ordinamento musicale[CR]Imposta invio canzone" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGURA IMPOSTAZIONI MUSICA[/B][CR][CR]Gestisci la tua libreria musicale · Imposta le opzioni di riproduzione della musica · Cambia le impostazioni per le liste audio[CR]Imposta invio canzone · Imposta le opzioni per il karaoke" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ja_jp/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ja_jp/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ja_jp/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ja_jp/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -144,6 +144,14 @@ msgid "Options" msgstr "オプション" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "ビデオライブラリで TV テーマ曲を再生 (TvTunes アドオン)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "歌詞" @@ -236,6 +244,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]ビデオ設定[/B][CR][CR]ビデオライブラリ管理 - ビデオ再生設定 - ビデオ一覧設定変更[CR]字幕用フォント変更" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]ミュージック設定[/B][CR][CR]ミュージックライブラリ管理 - ミュージック再生設定 - ミュージック一覧設定変更[CR]楽曲送信設定 - カラオケ設定" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]システム設定[/B][CR][CR]画面の設定・調整 - オーディオ出力設定 - リモートコントローラー設定[CR]省電力設定 - デバッグの有効化 - マスターロック設定" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ko_kr/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ko_kr/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ko_kr/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ko_kr/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "배경 팬아트 숨김" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "채널창에서 RDS 가 있으면 EPG 숨김" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "배경에 \"지금 재생 중\" 비디오 보기" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "배경에 \"지금 재생 중\" 시각화 보기" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "라이브러리 모드에서 TV 주제음악 재생 (TvTunes 애드온)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "가사" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "마지막 로그인" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "노래방 노래 선택기" + msgctxt "#31322" msgid "Aired" msgstr "방영" @@ -437,8 +445,8 @@ msgstr "[B]비디오 설정[/B][CR][CR]비디오 라이브러리 관리 · 비디오 재생 옵션 변경 · 비디오 목록 옵션 변경[CR]자막 글꼴 설정" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]음악 설정[/B][CR][CR]음악 라이브러리 관리 · 음악 재생 옵션 변경 · 음악 목록 옵션 변경[CR]노래 전송 설정" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]음악 설정[/B][CR][CR]음악 라이브러리 관리 · 음악 재생 옵션 변경 · 음악 목록 옵션 변경[CR]노래 전송 설정 · 노래방 옵션 설정" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.lt_lt/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.lt_lt/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.lt_lt/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.lt_lt/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Slėpti fono Fanart" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Slėpti EPG, jei kanalo lange yra RDS" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Rodyti \"Dabar atkuriamą\" vaizdo įrašą fone" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Rodyti \"Dabar atkuriamos\" muzikos vizualizaciją fone" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Atkurti televizijos temų dainas vaizdo bibliotekoje (TvTunes priedas)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Dainų žodžiai" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Paskutinis prisijungimas" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Karaoke dainos pasirinkimas" + msgctxt "#31322" msgid "Aired" msgstr "Transliuotas" @@ -437,8 +445,8 @@ msgstr "[B]KONFIGŪRUOTI VAIZDO ĮRAŠŲ NUSTATYMUS[/B][CR][CR]Tvarkyti vaizdo biblioteką · Nustatyti vaizdo atkūrimo parinktis[CR]Keisti vaizdo įrašų sąrašo atvaizdavimo parinktis · Nustatyti subtitrų šriftus" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]KONFIGŪRUOTI MUZIKOS NUSTATYMUS[/B][CR][CR]Tvarkyti muzikos biblioteką · Nustatyti dainų įkėlimą[CR]Keisti muzikos sąrašo atvaizdavimo parinktis · Nustatyti muzikos atkūrimo parinktis" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KONFIGŪRUOTI MUZIKOS NUSTATYMUS[/B][CR][CR]Tvarkyti muzikos biblioteką · Nustatyti dainų įkėlimą · Nustatyti karaoke parinktis[CR]Keisti muzikos sąrašo atvaizdavimo parinktis · Nustatyti muzikos atkūrimo parinktis" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.lv_lv/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.lv_lv/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.lv_lv/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.lv_lv/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -152,6 +152,14 @@ msgid "Options" msgstr "Opcijas" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Atskaņot TV tēmu dziesmas video bibiliotēkā (TvTunes pielikums)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Dziesmu vārdi" @@ -244,6 +252,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]KONFIGURĒT VIDEO IESTATĪJUMUS[/B][CR][CR]Pārvaldīt savu video bibliotēku · Iestatīt video atskaņošanas opcijas · Mainīt video saraksta opcijas[CR]Iestatīt subtitru fontus" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KONFIGURĒT MŪZIKAS IESTATĪJUMUS[/B][CR][CR]Pārvaldīt savu mūzikas bibiliotēku · Iestatīt mūzikas atskaņošanas opcijas · Mainīt mūzikas saraksta opcijas[CR]Uzstādīt dziesmas iesniegšanu · Iestatīt karaoke opcijas" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]KONFIGURĒT SISTĒMAS IESTATĪJUMUS[/B][CR][CR]Uzstādīt un kalibrēt displejus · Konfigurēt audio izvadi · Uzstādīt tālvadības pulti[CR]Iestatīt enerģijas taupīšanas opcijas · Ieslēgt atkļūdošanu · Uzstādīt galveno slēdzeni" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.mk_mk/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.mk_mk/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.mk_mk/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.mk_mk/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -144,6 +144,14 @@ msgid "Options" msgstr "Опции" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Пуштај TV-theme-songs во видео библиотеката (TvTunes add-on)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Стихови на песни" @@ -236,6 +244,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]КОНФИГУРИРАЊЕ ПОСТАВКИ ЗА ФИЛМОВИ[/B][CR][CR]Управувајте со вашата библиотека на видеа · Поставете опции за изведба на филмови[CR]Изменете опции за прикажување на филмови · Поставете фонт за преводот" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]КОНФИГУРИРАЊЕ ПОСТАВКИ ЗА МУЗИКА[/B][CR][CR]Управувајте со вашата музичка библиотека · Поставете опции за изведба на музика[CR]Променете опции за прикажување на музика · Поставете праќање на песни · Поставете караоке опции" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]КОНФИГУРИРАЊЕ СИСТЕМСКИ ПОСТАВКИ[/B][CR][CR]Подесете и калибрирајте екрани · Конфигурирајте звучен излез · Подесете далечинско управување · Поставете опции за заштеда на енергија[CR]Овозможете евиденција на грешки · Подесете главна лозинка" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ms_my/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ms_my/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ms_my/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ms_my/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Ubah" - -msgctxt "#31003" -msgid "Power options" -msgstr "Pilihan kuasa" - msgctxt "#31004" msgid "Working..." msgstr "Bekerja..." -msgctxt "#31005" -msgid "Hide information" -msgstr "Sembunyi maklumat" - msgctxt "#31006" msgid "View options" msgstr "Pilihan paparan" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "Skrin Penuh" -msgctxt "#31009" -msgid "Total duration" -msgstr "Tempoh keseluruhan" - msgctxt "#31022" msgid "Music - Files" msgstr "Muzik - Fail" @@ -60,30 +44,14 @@ msgid "Items" msgstr "Item" -msgctxt "#31026" -msgid "Misc options" -msgstr "Pilihan lain" - msgctxt "#31027" msgid "Location" msgstr "Kedudukan" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Lilit poster" - msgctxt "#31029" msgid "Fanart" msgstr "Hasil Seni Peminat" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Lakaran kecil gambar" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Lilit imej" - msgctxt "#31033" msgid "Info" msgstr "Maklumat" @@ -92,10 +60,6 @@ msgid "Actions" msgstr "Tindakan" -msgctxt "#31040" -msgid "Now playing" -msgstr "Kini dimainkan" - msgctxt "#31042" msgid "PLAYING" msgstr "BERMAIN" @@ -116,33 +80,29 @@ msgid "SEEKING" msgstr "MENCARI" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Praset pengvisualan" - msgctxt "#31049" msgid "End time" msgstr "Masa tamat" msgctxt "#31050" msgid "Sort: Ascending" -msgstr "Isih: Menaik" +msgstr "Susun: Menaik" msgctxt "#31051" msgid "Sort: Descending" -msgstr "Isih: Menurun" +msgstr "Susun: Menurun" msgctxt "#31055" msgid "Open playlist" -msgstr "Buka senarai main" +msgstr "Buka senarai audio video" msgctxt "#31056" msgid "Save playlist" -msgstr "Simpan senarai main" +msgstr "Simpan senarai audio video" msgctxt "#31057" msgid "Close playlist" -msgstr "Tutup senarai main" +msgstr "Tutup senarai audio video" msgctxt "#31058" msgid "System music files" @@ -150,51 +110,27 @@ msgctxt "#31059" msgid "Current playlist" -msgstr "Senarai main semasa" +msgstr "Senarai audio video semasa" msgctxt "#31060" msgid "This file is stacked, select the part you want to play from." -msgstr "Fail ini disusun-tindan. Pilih bahagian yang anda ingin mainkan." - -msgctxt "#31061" -msgid "Current selected" -msgstr "Terkini dipilih" +msgstr "Fail ini disusun tindan. Pilih bahagian yang anda ingin mainkan." msgctxt "#31101" msgid "Home screen options" -msgstr "Pilihan skrin utama" +msgstr "Opsyen skrin utama" msgctxt "#31102" msgid "Background" msgstr "Latar Belakang" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Tunjuk \"Dijeda\" dalam paparan slaid gambar" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Main treler dalam tetingkap [COLOR=grey3](Dialog maklumat video sahaja)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" -msgstr "Pilihan pelbagai" - -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Sembunyi penanda bacaan dari nama fail video [COLOR=grey3](contoh Blu-ray, HD-DVD)[/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Sembunyi butang menu utama" - -msgctxt "#31109" -msgid "Enable custom background" -msgstr "Benarkan latar belakang suai" +msgstr "Pelbagai opsyen" msgctxt "#31110" msgid "Background path:" -msgstr "Laluan latar belakang:" +msgstr "Laluan Latar Belakang:" msgctxt "#31111" msgid "Hide" @@ -202,60 +138,20 @@ msgctxt "#31112" msgid "Options" -msgstr "Pilihan" +msgstr "Opsyen" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Tunjuk album ditambah baru-baru ini" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Tunjuk video ditambah baru-baru ini" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Submenu program laman rumah" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Sembunyi seni peminat latar belakang" - -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "sembunyi EPG jika RDS hadir pada tetingkap saluran" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Tunjuk video latar belakang \"Kini dimainkan\"" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Tunjuk pengvisualan latar belakang \"Kini dimainkan\"" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Mainkan lagu-lagu tema TV dalam perpustakaan video (perisian tambahan TVTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "Lirik" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Sembunyi seni peminat dalam pengvisualan skrin penuh" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Tambahan lirik" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Sub-menu \"Video\" laman rumah" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Sub-menu \"Muzik\" laman rumah" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Sub-menu \"Gambar\" laman rumah" - msgctxt "#31140" msgid "Music OSD" msgstr "OSD Muzik" @@ -272,90 +168,22 @@ msgid "Shortcuts" msgstr "Pintasan" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Pilih lagu anda" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Sumber lirik" - msgctxt "#31206" msgid "Found" -msgstr "Ditemui" - -msgctxt "#31207" -msgid "Find more items" -msgstr "Cari lagi item" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Episod akan datang" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Suhu semasa" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Kemaskini terakhir" +msgstr "Dijumpai" msgctxt "#31303" msgid "Data provider" msgstr "Penyedia data" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Sembunyi seni peminat" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Perincian cereka" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Ingatan digunakan:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Nombor trek" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" msgstr "Imej seni peminat[CR][CR]Tidak Tersedia[CR][CR] Klik butang untuk tetapkan" -msgctxt "#31312" -msgid "Current scraper" -msgstr "Pengikis semasa" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Pilih pengikis" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Pilihan pengimbasan kandungan" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Tetapkan laluan seni peminat" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Profil terpilih" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Daftar masuk terakhir" - msgctxt "#31322" msgid "Aired" msgstr "Disiarkan" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Pilihan senarai main" - msgctxt "#31326" msgid "Created" msgstr "Dicipta" @@ -372,14 +200,6 @@ msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" msgstr "[B]Pemasa ditetapkan![/B] [COLOR=grey2] - Sistem dimatikan sendiri dalam tempoh[/COLOR]" -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Klik butang untuk main[CR][CR]treler cereka" - -msgctxt "#31331" -msgid "Album details" -msgstr "Perincian album" - msgctxt "#31351" msgid "Pause" msgstr "Jeda" @@ -388,10 +208,6 @@ msgid "Stop" msgstr "Henti" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Maju pantas" - msgctxt "#31354" msgid "Rewind" msgstr "Undur" @@ -400,13 +216,9 @@ msgid "Movie menu" msgstr "Menu cereka" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Muat turun sari kata" - msgctxt "#31360" msgid "Watch as 2D" -msgstr "Tonton sebagai 2D" +msgstr "Tonton menggunakan 2D" msgctxt "#31361" msgid "Change mode" @@ -420,10 +232,6 @@ msgid "Skin default" msgstr "Lalai Kulit" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Lalai kulit tanpa penutup" - msgctxt "#31392" msgid "Arial based" msgstr "Berasaskan Arial" @@ -437,25 +245,13 @@ msgstr "[B]KONFIGUR TETAPAN VIDEO[/B][CR][CR]Ubah pustaka video anda · Tetapkan pilihan main balik video · Ubah pilihan penyenaraian video[CR]Tetapkan fon sarikata" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]KONFIGUR TETAPAN MUZIK[/B][CR][CR]Urus pustaka muzik anda · Tetapkan pilihan main balik muzik · Ubah pilihan penyenaraian[CR]Pasang penyerahan lagu" - -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]KONFIGUR TETAPAN GAMBAR[/B][CR][CR]Tetapkan pilihan penyenaraian gambar · Konfigur paparan slaid" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]KONFIGUR TETAPAN CUACA[/B][CR][CR]Tetapkan bandar-bandar untuk kutip maklumat cuaca" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KONFIGUR TETAPAN MUZIK[/B][CR][CR]Urus pustaka muzik anda · Tetapkan pilihan main balik muzik · Ubah pilihan penyenaraian muzik[CR] Pasang penyerahan lagu · Tetapkan pilihan karaoke" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]KONFIGUR TETAPAN SISTEM[/B][CR][CR]Sedia dan tentukur paparan · Konfigur output audio · Persediaan kawalan jauh[CR]Tetapkan pilihan penjimatan kuasa · Benarkan penyahpepijatan · Persediaan kunci master" -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]KONFIGUR TAMBAHAN[/B][CR][CR]Urus tambahan terpasang anda · Layar dan pasang tambahan dari kodi.tv[CR]Ubahsuai tetapan tambahan" - msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" msgstr "[B]KONFIGUR TETAPAN TV[/B][CR][CR]Ubah maklumat skrin penuh · Urus tetapan data EPG" @@ -464,26 +260,14 @@ msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" msgstr "[B]KONFIGUR TETAPAN PERKHIDMATAN[/B][CR][CR]Persediaan kawalan Kodi melalui UPnP dan HTTP · Konfigur perkongsian fail[CR]Benarkan Zeroconf · Konfigur AirPlay" -msgctxt "#31411" -msgid "First run help..." -msgstr "Bantuan kali pertama..." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Tab ini menjelaskan terdapat menu di luar sisi tetingkap ini yang mengandungi pilihan tambahan untuk seksyen. Untuk mencapai menu, navigasi ke kiri dengan kawalan jauh atau papan kekunci atau letak penuding tetikus anda diatas tab. [CR][CR]Klik \"Ok\" untuk tutup dialog ini. Ia tidak akan muncul lagi." - msgctxt "#31413" msgid "Local subtitle available" -msgstr "Sarikata setempat tersedia" +msgstr "Sarikata tempatan tersedia" msgctxt "#31420" msgid "Login" msgstr "Daftar Masuk" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Pilih Profil pengguna Kodi anda[CR]untuk daftar masuk dan teruskan" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "Tunjuk atau sembunyi skrin daftar masuk ketika permulaan." @@ -492,66 +276,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "Pilih profil yang akan digunakan ketika permulaan bila skrin daftar masuk dilumpuhkan." -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Masa terjadual" - msgctxt "#31502" msgid "TV" msgstr "TV" -msgctxt "#31503" -msgid "Add group" -msgstr "Tambah kumpulan" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Namakan semula kumpulan" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Padam kumpulan" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "Kumpulan[CR]Tersedia" -msgctxt "#31509" -msgid "Channel group" -msgstr "Kumpulan saluran" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Pemasa ditetapkan" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Pilihan saluran" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "Ramalan 36-jam" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Ramalan sejam" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Ramalan mingguan" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Ramalan harian" - msgctxt "#31905" msgid "Forecast" msgstr "Ramalan" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Pembentukan pemendakan" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "Mendapatkan maklumat ramalan..." @@ -598,7 +334,7 @@ msgctxt "#31959" msgid "SYSTEM" -msgstr "SISTEM" +msgstr "Sistem" msgctxt "#31960" msgid "RADIO" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.mt_mt/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.mt_mt/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.mt_mt/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.mt_mt/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,482 +16,30 @@ "Language: mt_MT\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Ibdel il-" - -msgctxt "#31004" -msgid "Working..." -msgstr "Qed jaħdem..." - -msgctxt "#31005" -msgid "Hide information" -msgstr "Aħbi l-informazzjoni" - msgctxt "#31006" msgid "View options" -msgstr "Ara l-għażliet" +msgstr "View Options" msgctxt "#31008" msgid "Full screen" -msgstr "Skrin sħiħ" - -msgctxt "#31009" -msgid "Total duration" -msgstr "Tul totali" - -msgctxt "#31022" -msgid "Music - Files" -msgstr "Mużika - Fajls" - -msgctxt "#31023" -msgid "Playing" -msgstr "Qed jindaqq" - -msgctxt "#31024" -msgid "Page" -msgstr "Paġna" - -msgctxt "#31025" -msgid "Items" -msgstr "Affarijiet" - -msgctxt "#31026" -msgid "Misc options" -msgstr "Għażliet mixxelanji" - -msgctxt "#31027" -msgid "Location" -msgstr "Post" - -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Tgeżwira tal-powster" - -msgctxt "#31029" -msgid "Fanart" -msgstr "Fanart" - -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Thumbs tal-istampi" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Tgeżwir tal-istampi" - -msgctxt "#31033" -msgid "Info" -msgstr "Info" - -msgctxt "#31039" -msgid "Actions" -msgstr "Azzjonijiet" - -msgctxt "#31040" -msgid "Now playing" -msgstr "Qed jindaqq bħalissa" - -msgctxt "#31042" -msgid "PLAYING" -msgstr "IDOQQ" - -msgctxt "#31043" -msgid "PAUSED" -msgstr "IPPAWŻAT" - -msgctxt "#31044" -msgid "FAST FORWARD" -msgstr "GĦAĠĠEL QUDDIEM" - -msgctxt "#31045" -msgid "REWIND" -msgstr "B'LURA" - -msgctxt "#31046" -msgid "SEEKING" -msgstr "IFITTEX" - -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Viżwalizzazjoni ssetjata minn qabel" - -msgctxt "#31049" -msgid "End time" -msgstr "Ħin tat-tmiem" - -msgctxt "#31050" -msgid "Sort: Ascending" -msgstr "Qassam: Jikbru" - -msgctxt "#31051" -msgid "Sort: Descending" -msgstr "Qassam: Jiċkienu" - -msgctxt "#31055" -msgid "Open playlist" -msgstr "Iftaħ il-playlist" - -msgctxt "#31056" -msgid "Save playlist" -msgstr "Żomm il-playlist" - -msgctxt "#31057" -msgid "Close playlist" -msgstr "Għalaq il-playlist" - -msgctxt "#31058" -msgid "System music files" -msgstr "Fajls tal-mużika tas-sistema" - -msgctxt "#31059" -msgid "Current playlist" -msgstr "Playlist kurrenti" - -msgctxt "#31060" -msgid "This file is stacked, select the part you want to play from." -msgstr "Dan il-fajl huwa stacked, għażel il-parti minn fejn trid tibda ddoqq." - -msgctxt "#31061" -msgid "Current selected" -msgstr "Magħżul bħalissa" - -msgctxt "#31102" -msgid "Background" -msgstr "Sfond" - -msgctxt "#31106" -msgid "Miscellaneous options" -msgstr "Għażliet varji" +msgstr "Daħħal u Ara Filmati" msgctxt "#31109" msgid "Enable custom background" -msgstr "Attiva l-isfond preferut" - -msgctxt "#31110" -msgid "Background path:" -msgstr "Path tal-isfond" - -msgctxt "#31111" -msgid "Hide" -msgstr "Aħbi" - -msgctxt "#31112" -msgid "Options" -msgstr "Għażliet" - -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Uri l-albums li ġew miżjuda dan l-aħħar" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Uri vidjos li ġew miżjuda dan l-aħħar" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Aħbi l-fanart fl-isfond" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Uri l-vidjo li qed jindaqq bħalissa fl-isfond" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Uri l-viżwalizzazjoni fl-isfond" - -msgctxt "#31128" -msgid "Lyrics" -msgstr "Liriċi" - -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Aħbi l-fanart f'viżwalizzazjonijiet fuq l-iskrin kollu" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Add-on tal-lirika" - -msgctxt "#31140" -msgid "Music OSD" -msgstr "OSD tal-Mużika" - -msgctxt "#31141" -msgid "Video OSD" -msgstr "OSD tal-Vidjo" - -msgctxt "#31142" -msgid "Settings level" -msgstr "Livell ta' settings" +msgstr "Attiva Bakgrawnd Preferut" msgctxt "#31200" msgid "Shortcuts" msgstr "Shortcuts" -msgctxt "#31203" -msgid "Choose your song" -msgstr "AGħżel id-diska tiegħek" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Sors ta' lirika" - -msgctxt "#31206" -msgid "Found" -msgstr "Misjub" - -msgctxt "#31207" -msgid "Find more items" -msgstr "Sib aktar affarijiet" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Episodji li jmiss" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Temperatura kurrenti" - -msgctxt "#31301" -msgid "Last updated" -msgstr "L-aħħar li ġġedded" - -msgctxt "#31303" -msgid "Data provider" -msgstr "Fornitur ta' informazzjoni" - -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Aħbi l-fanart" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Dettalji tal-film" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Memorja użata:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Numru tad-diska" - -msgctxt "#31311" -msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" -msgstr "Stampa tal-fanart[CR][CR]mhux disponibbli[CR][CR] Għafas il-buttuna biex tagħżel" - -msgctxt "#31312" -msgid "Current scraper" -msgstr "Scraper kurrenti" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Għażel scraper" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Għażliet ta' kif jitfittex il-kontenut" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Għażel il-path tal-fanart" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Profil magħżul" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "L-aħħar login" - -msgctxt "#31322" -msgid "Aired" -msgstr "Intwera" - -msgctxt "#31325" -msgid "Playlist options" -msgstr "Għażliet tal-playlist" - -msgctxt "#31326" -msgid "Created" -msgstr "Maħluq" - msgctxt "#31327" msgid "Resolution" -msgstr "Reżoluzzjoni" - -msgctxt "#31328" -msgid "Recently added" -msgstr "Miżjud dan l-aħħar" - -msgctxt "#31329" -msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" -msgstr "[B]Arloġġ issetjat![/B] [COLOR=grey2] - Sistema se tintefa' waħedha f'[/COLOR]" - -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Għafas il-buttuna biex iddoqq it-trejler tal-film[CR][CR]" - -msgctxt "#31331" -msgid "Album details" -msgstr "Dettalji dwar l-album" - -msgctxt "#31351" -msgid "Pause" -msgstr "Ippawża" - -msgctxt "#31352" -msgid "Stop" -msgstr "Waqqaf" - -msgctxt "#31353" -msgid "Fast forward" -msgstr "Għaġġel quddiem" - -msgctxt "#31354" -msgid "Rewind" -msgstr "Lura" - -msgctxt "#31355" -msgid "Movie menu" -msgstr "Menu tal-film" - -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Niżżel is-sottotitoli" - -msgctxt "#31360" -msgid "Watch as 2D" -msgstr "Ara bħala 2D" - -msgctxt "#31361" -msgid "Change mode" -msgstr "Ibdel il-modalita'" +msgstr "Resolution:" msgctxt "#31362" msgid "Enabled" -msgstr "Attivat" +msgstr "Jintuża" msgctxt "#31390" msgid "Skin default" -msgstr "Dehra normali" - -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Id-derha normal mingħajr ittri kapitali" - -msgctxt "#31392" -msgid "Arial based" -msgstr "Ibbażat fuq l-Arial" - -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Ħin skedat" - -msgctxt "#31502" -msgid "TV" -msgstr "Televixin" - -msgctxt "#31503" -msgid "Add group" -msgstr "Żid grupp" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Ibdel l-isem ta' grupp" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Ħassar grupp" - -msgctxt "#31506" -msgid "Available[CR]Groups" -msgstr "Gruppi[CR]Disponibbli" - -msgctxt "#31509" -msgid "Channel group" -msgstr "Grupp ta' stazzjonijiet" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Issettja l-arloġġ" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Għażliet tal-istazzjon" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "Tbassir ta' 36 siegħa" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Tbassir siegħa b'siegħa" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Tbassir għal tmiem il-ġimgħa" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Tbassir ġurnata b'ġurnata" - -msgctxt "#31905" -msgid "Forecast" -msgstr "Tbassir tat-temp" - -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Ċans ta' xita" - -msgctxt "#31909" -msgid "Fetching forecast info..." -msgstr "Qed tinstab l-informazzjoni tat-tbassir..." - -msgctxt "#31910" -msgid "Maps" -msgstr "Mappep" - -msgctxt "#31950" -msgid "WEATHER" -msgstr "TEMP" - -msgctxt "#31951" -msgid "PICTURES" -msgstr "STAMPI" - -msgctxt "#31952" -msgid "TV" -msgstr "Televixin" - -msgctxt "#31953" -msgid "VIDEOS" -msgstr "VIDJOS" - -msgctxt "#31954" -msgid "MOVIES" -msgstr "FILMS" - -msgctxt "#31955" -msgid "TV SHOWS" -msgstr "XOWS TELEVIŻIVI" - -msgctxt "#31956" -msgid "MUSIC" -msgstr "MUŻIKA" - -msgctxt "#31957" -msgid "PROGRAMS" -msgstr "PROGRAMMI" - -msgctxt "#31958" -msgid "PLAY DISC" -msgstr "DOQQ CD" - -msgctxt "#31959" -msgid "SYSTEM" -msgstr "SISTEMA" - -msgctxt "#31960" -msgid "RADIO" -msgstr "RADJU" +msgstr "Qoxra Default" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.nb_no/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.nb_no/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.nb_no/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.nb_no/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -68,10 +68,6 @@ msgid "Location" msgstr "Sted" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Plakatsvøpe" - msgctxt "#31029" msgid "Fanart" msgstr "Fanart" @@ -80,10 +76,6 @@ msgid "Pic thumbs" msgstr "Bildeminiatyrer" -msgctxt "#31032" -msgid "Image wrap" -msgstr "Bildesvøpe" - msgctxt "#31033" msgid "Info" msgstr "Informasjon" @@ -228,6 +220,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Vis «spilles nå» bakgrunnen i visualisering" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Spill av kjenningsmelodier i videobiblioteket (TvTunes-utvidelse)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Sangtekster" @@ -344,6 +344,10 @@ msgid "Last logged in" msgstr "Sist innlogget" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Låtvelger for karaoke" + msgctxt "#31322" msgid "Aired" msgstr "Sendt" @@ -432,22 +436,14 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]ENDRE DINE GRAFIKKINNSTILLINGER:[/B][CR][CR]Håndter ditt filmbibliotek · Oppgi videoavspillingsalternativer · Endre videolistealternativer[CR]Oppgi skrifttype for undertekster" -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]KONFIGURER BILDE INSTILLINGER[/B][CR][CR]Forandre bilde opplistings alternativer · Konfigurer bildefremvisning" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]KONFIGURER VÆR INSTILLINGER[/B][CR][CR]Skriv inn hvilke byer informasjon skal vises for" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]ENDRE DINE MUSIKKINNSTILLINGER:[/B][CR][CR]Håndter ditt musikkbibliotek · Oppgi musikkavspillingsalternativer · Endre lyttealternativer[CR]Oppgi din Last.FM konto · Endre karaokealternativer" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]ENDRE SYSTEMVALG[/B][CR][CR]Oppsett og kalibrering av skjerm · Konfigurer lydmaskinvare · Still inn fjernkontroller[CR]Endre strømsparingsalternativer · Aktiver feilsøking · Sett opp systemlås" -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]KONFIGURER UTVIDELSER[/B][CR][CR]Håndter dine installerte utvidelser · Se etter og installer utvidelser fra kodi.tv[CR]Forandre utvidelses innstillinger" - msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" msgstr "[B]KONFIGURER TV-INNSTILLINGER[/B][CR][CR]Skift fullskjermsinfo · Administrer datainnstillinger for EPG" @@ -460,10 +456,6 @@ msgid "First run help..." msgstr "Førstegangsintroduksjon..." -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Denne fanen viser at det er en meny på siden av vinduet om inneholder ekstra alternativer for denne avdelingen. For å få åpne menyen, trykk til venstre med fjernkontrollen, tastaturet eller plaser musepekeren over fanen. [CR][CR]Trykk \"OK\" for å lukke denne ruten. Den vil ikke vises igjen." - msgctxt "#31413" msgid "Local subtitle available" msgstr "Lokal tekst tilgjengelig" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.nl_nl/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.nl_nl/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.nl_nl/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.nl_nl/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -22,7 +22,7 @@ msgctxt "#31003" msgid "Power options" -msgstr "Energiebeheer" +msgstr "vermogen opties" msgctxt "#31004" msgid "Working..." @@ -62,7 +62,7 @@ msgctxt "#31026" msgid "Misc options" -msgstr "Overige opties" +msgstr "Diverse Opties" msgctxt "#31027" msgid "Location" @@ -186,7 +186,7 @@ msgctxt "#31108" msgid "Hide main menu buttons" -msgstr "Verberg knoppen in het hoofdmenu" +msgstr "Verberg hoofd menu knoppen" msgctxt "#31109" msgid "Enable custom background" @@ -220,18 +220,22 @@ msgid "Hide background fanart" msgstr "Fanart achtergronden verbergen" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Verberg EPG wanneer RDS aanwezig is op kanaalvenster" - msgctxt "#31124" msgid "Show background \"Now playing\" video" -msgstr "Toon achtergrond \"Nu afspelend\" video" +msgstr "Toon achtergrond \"nu afspelend\" video" msgctxt "#31125" msgid "Show background \"Now playing\" visualisation" msgstr "Toon achtergrond \"Nu afspelend\" visualisatie" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Speel de Themasong van de TV serie af in de videobibliotheek. (TvTunes add-on)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Songteksten" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Laatst ingelogd op" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Karaoke lied kiezer" + msgctxt "#31322" msgid "Aired" msgstr "Uitgezonden" @@ -437,8 +445,8 @@ msgstr "[B]VIDEO-INSTELLINGEN CONFIGUREREN[/B][CR][CR]Beheer uw videobibliotheek · Configureer videoafspeelopties en -bestandslijstsopties · Stel lettertype in voor ondertitels" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]CONFIGUREER MUZIEKINSTELLINGEN[/B][CR][CR]Beheer uw muziekbibliotheek · Instellen muziek afspeel opties · Verander muzieklijsten opties[CR]Instellen nummer indiening " +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]MUZIEKINSTELLINGEN CONFIGUREREN[/B][CR][CR]Beheer uw muziekbibliotheek · Configureer muziekafspeelopties en -bestandslijstopties · Configureer nummer indienen · Configureer karaokeopties" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.pl_pl/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.pl_pl/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.pl_pl/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.pl_pl/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -186,7 +186,7 @@ msgctxt "#31108" msgid "Hide main menu buttons" -msgstr "Ukrywaj przyciski menu" +msgstr "Ukryj przyciski menu" msgctxt "#31109" msgid "Enable custom background" @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Nie używaj fototapet w roli tła" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Ukrywaj przewodnik, gdy dostępne są informacje RDS" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Wyświetlaj odtwarzane wideo w tle interfejsu" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Wyświetlaj wizualizację muzyki w tle interfejsu" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Odtwarzaj motywy muzyczne w bibliotece wideo (dodatek TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "Dodatek TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Tekst utworu" @@ -326,11 +330,11 @@ msgctxt "#31312" msgid "Current scraper" -msgstr "Aktualny dostawca" +msgstr "Aktualny ekstraktor" msgctxt "#31313" msgid "Choose a scraper" -msgstr "Wybierz dostawcę" +msgstr "Wybierz ekstraktor" msgctxt "#31314" msgid "Content scanning options" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Ostatnio zalogowany" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Selektor utworów Karaoke" + msgctxt "#31322" msgid "Aired" msgstr "Premiera" @@ -437,8 +445,8 @@ msgstr "[B]KONFIGURACJA WIDEO[/B][CR][CR]Biblioteka wideo · Odtwarzanie · Akceleracja · Listy wideo · Napisy" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]KONFIGURACJA MUZYKI[/B][CR][CR]Biblioteka muzyki · Odtwarzanie · Listy utworów · CD-Audio" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KONFIGURACJA MUZYKI[/B][CR][CR]Biblioteka muzyki · Odtwarzanie · Listy utworów · CD-Audio · Karaoke" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" @@ -490,7 +498,7 @@ msgctxt "#31423" msgid "Select the profile that will be used at startup when the login screen is disabled." -msgstr "Wybierz profil, który będzie używany w przypadku dezaktywacji ekranu logowania." +msgstr "Wybierz profil, który będzie używany w przypadku wyłączenia ekranu logowania." msgctxt "#31501" msgid "Scheduled time" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.pt_br/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.pt_br/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.pt_br/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.pt_br/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Ocultar fanart fundo da visualização" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Esconder EPG se RDS está presente na janela do canal" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Exibir vídeo \\\"reproduzindo agora\\\" ao fundo" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Apresentar visualização de fundo em \\\"Agora reproduzindo\\\"" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Reproduzir música tema do seriado na biblioteca de vídeo (add-on TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Letras" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "última conexão" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Selecionador de música karaoke" + msgctxt "#31322" msgid "Aired" msgstr "Transmitido" @@ -437,8 +445,8 @@ msgstr "[B]AJUSTES DE VÍDEO[/B][CR][CR]Gerencie sua coleção de vídeos · Defina opções de execução de vídeo[CR]Altere opções de listagem de vídeo · Defina fonte para legendas" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]AJUSTES DE MÚSICAS[/B][CR][CR]Gerencie sua coleção de músicas · Defina opções de execução de música[CR]Altere opções de listagem de música · Configure submissão de música" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]AJUSTES DE MÚSICAS[/B][CR][CR]Gerencie sua coleção de músicas · Defina opções de execução de música[CR]Altere opções de listagem de música · Configure submissão de música · Defina opções de karaokê" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" @@ -510,7 +518,7 @@ msgctxt "#31505" msgid "Delete group" -msgstr "Deletar grupo" +msgstr "Deletar gurpo" msgctxt "#31506" msgid "Available[CR]Groups" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.pt_pt/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.pt_pt/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.pt_pt/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.pt_pt/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -18,7 +18,7 @@ msgctxt "#31000" msgid "Change your" -msgstr "Alterar" +msgstr "Altere as suas" msgctxt "#31003" msgid "Power options" @@ -38,7 +38,7 @@ msgctxt "#31008" msgid "Full screen" -msgstr "Ecrã completo" +msgstr "Ecrã cheio" msgctxt "#31009" msgid "Total duration" @@ -82,7 +82,7 @@ msgctxt "#31032" msgid "Image wrap" -msgstr "Moldar imagem" +msgstr "Envolver a imagem" msgctxt "#31033" msgid "Info" @@ -98,27 +98,23 @@ msgctxt "#31042" msgid "PLAYING" -msgstr "A reproduzir" +msgstr "A REPRODUZIR" msgctxt "#31043" msgid "PAUSED" -msgstr "Em pausa" +msgstr "EM PAUSA" msgctxt "#31044" msgid "FAST FORWARD" -msgstr "Avançar" +msgstr "AVANÇAR" msgctxt "#31045" msgid "REWIND" -msgstr "Recuar" +msgstr "RETROCEDER " msgctxt "#31046" msgid "SEEKING" -msgstr "A procurar" - -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Pré-ajustes de visualização" +msgstr "A PROCURAR" msgctxt "#31049" msgid "End time" @@ -126,23 +122,23 @@ msgctxt "#31050" msgid "Sort: Ascending" -msgstr "Ordem crescente" +msgstr "Orientar: Ascendente" msgctxt "#31051" msgid "Sort: Descending" -msgstr "Ordem decrescente" +msgstr "Orientar: Descendente" msgctxt "#31055" msgid "Open playlist" -msgstr "Abrir lista de reprodução" +msgstr "Abrir Lista Reprodução" msgctxt "#31056" msgid "Save playlist" -msgstr "Guardar lista de reprodução" +msgstr "Guardar Lista Reprodução" msgctxt "#31057" msgid "Close playlist" -msgstr "Fechar lista de reprodução" +msgstr "Fechar Lista Reprodução" msgctxt "#31058" msgid "System music files" @@ -150,15 +146,15 @@ msgctxt "#31059" msgid "Current playlist" -msgstr "Lista de reprodução atual" +msgstr "Lista de Reprodução Actual" msgctxt "#31060" msgid "This file is stacked, select the part you want to play from." -msgstr "Este ficheiro está dividido em partes. Escolha a parte que deseja reproduzir." +msgstr "Este ficheiro está dividido por partes. Escolha a parte que pretende reproduzir." msgctxt "#31061" msgid "Current selected" -msgstr "Seleção atual" +msgstr "Seleccionado actualmente" msgctxt "#31101" msgid "Home screen options" @@ -166,11 +162,11 @@ msgctxt "#31102" msgid "Background" -msgstr "Fundo" +msgstr "Fundo de ecrã" msgctxt "#31103" msgid "Show \"Paused\" in picture slideshow" -msgstr "Mostrar \"Em pausa\" nas apresentações de imagens" +msgstr "Mostrar \"Pausa\" em apresentação de imagens" msgctxt "#31104" msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" @@ -178,11 +174,7 @@ msgctxt "#31106" msgid "Miscellaneous options" -msgstr "Opções diversas" - -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Ocultar leitura de sinalizadores dos ficheiros de vídeo [COLOR=grey3](ex. Blu-ray, HD-DVD)[/COLOR]" +msgstr "Opções variadas" msgctxt "#31108" msgid "Hide main menu buttons" @@ -190,11 +182,11 @@ msgctxt "#31109" msgid "Enable custom background" -msgstr "Ativar fundo personalizado" +msgstr "Activar fundo personalizado" msgctxt "#31110" msgid "Background path:" -msgstr "Caminho do fundo:" +msgstr "Caminho do fundo de ecrã:" msgctxt "#31111" msgid "Hide" @@ -216,14 +208,6 @@ msgid "Home page programs submenu" msgstr "Submenu \"Programas\" da página inicial" -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Ocultar fanart de fundo" - -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Ocultar EPG se existir RDS na janela do canal" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Mostrar vídeo \"A reproduzir\" em fundo" @@ -232,13 +216,21 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Mostrar visualização \"A reproduzir\" em fundo" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Tocar música de genérico na biblioteca de vídeo (Add-on TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" -msgstr "Letras de músicas" +msgstr "Letras" msgctxt "#31129" msgid "Hide fanart in full screen visualisation" -msgstr "Ocultar fanart em ecrã completo" +msgstr "Ocultar o Fanart em ecrã completo" msgctxt "#31132" msgid "Lyrics add-on" @@ -266,7 +258,7 @@ msgctxt "#31142" msgid "Settings level" -msgstr "Nível de definições" +msgstr "Nível das definições" msgctxt "#31200" msgid "Shortcuts" @@ -294,11 +286,11 @@ msgctxt "#31300" msgid "Current temperature" -msgstr "Temperatura atual" +msgstr "Temperatura actual" msgctxt "#31301" msgid "Last updated" -msgstr "Última atualização" +msgstr "Última actualização" msgctxt "#31303" msgid "Data provider" @@ -306,7 +298,7 @@ msgctxt "#31307" msgid "Hide fanart" -msgstr "Ocultar fanart" +msgstr "Ocultar o Fanart" msgctxt "#31308" msgid "Movie details" @@ -322,35 +314,27 @@ msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" -msgstr "Imagem fanart[CR][CR]não disponível[CR][CR]Clique no botão para definir" - -msgctxt "#31312" -msgid "Current scraper" -msgstr "Coletor atual" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Escolha um coletor" +msgstr "Imagem de Fanart[CR][CR]Indisponível[CR][CR] Clique no botão para seleccionar" msgctxt "#31314" msgid "Content scanning options" -msgstr "Opções de pesquisa de conteúdo" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Defina o caminho fanart" +msgstr "Opções de pesquisa de conteúdos" msgctxt "#31319" msgid "Selected profile" -msgstr "Perfil selecionado" +msgstr "Perfil seleccionado" msgctxt "#31320" msgid "Last logged in" msgstr "Última vez ligado" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Seleção de música para karaoke" + msgctxt "#31322" msgid "Aired" -msgstr "Exibido" +msgstr "Transmitido a" msgctxt "#31325" msgid "Playlist options" @@ -358,23 +342,15 @@ msgctxt "#31326" msgid "Created" -msgstr "Criado" +msgstr "Criado a" msgctxt "#31327" msgid "Resolution" msgstr "Resolução" -msgctxt "#31328" -msgid "Recently added" -msgstr "Adições recentes" - msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" -msgstr "[B]Temporizador definido![/B] [COLOR=grey2] - O sistema vai desligar-se em[/COLOR]" - -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Clique no botão para[CR][CR]reproduzir o trailer do filme" +msgstr "[B]Temporizador activado![/B] [COLOR=grey2] - Sistema vai desligar-se em[/COLOR]" msgctxt "#31331" msgid "Album details" @@ -382,7 +358,7 @@ msgctxt "#31351" msgid "Pause" -msgstr "Pausa" +msgstr "Pausar" msgctxt "#31352" msgid "Stop" @@ -394,7 +370,7 @@ msgctxt "#31354" msgid "Rewind" -msgstr "Recuar" +msgstr "Retroceder" msgctxt "#31355" msgid "Movie menu" @@ -402,7 +378,7 @@ msgctxt "#31356" msgid "Download subtitles" -msgstr "Descarregar legendas" +msgstr "Transferir Legendas" msgctxt "#31360" msgid "Watch as 2D" @@ -414,15 +390,11 @@ msgctxt "#31362" msgid "Enabled" -msgstr "Ativado" +msgstr "Activado" msgctxt "#31390" msgid "Skin default" -msgstr "Padrão do tema" - -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Padrão do tema sem maiúsculas" +msgstr "Predefinição do tema" msgctxt "#31392" msgid "Arial based" @@ -430,48 +402,32 @@ msgctxt "#31400" msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver" -msgstr "[B]Configurar definições de aparência[/B][CR][CR]Mudar de tema · Definir o idioma e a região · Opções de listagem de ficheiros[CR]Definir uma proteção de ecrã" +msgstr "[B]CONFIGURAR DEFINIÇÕES DE APARÊNCIA[/B][CR][CR]Mudar de tema · Definir o idioma e a região · Opções de listagem de ficheiros[CR]Definir um protector de ecrã" msgctxt "#31401" msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" -msgstr "[B]Configurar definições de vídeo[/B][CR][CR]Gerir coleção de vídeos · Opções de reprodução de vídeos · Opções de listagem de vídeos[CR]Definir tipo de letra das legendas" +msgstr "[B]CONFIGURAR DEFINIÇÕES DE VÍDEO[/B][CR][CR]Gerir Biblioteca de Vídeo · Opções de reprodução de vídeo · Opções de listagem de vídeo[CR]Definir tipo de letra das legendas" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]Configurar definições de músicas[/B][CR][CR]Gerir a coleção de músicas · Opções de reprodução de músicas · Opções de listagem de músicas[CR]Configurar submissão de músicas" - -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]Configurar definições de imagens[/B][CR][CR]Opções de listagem de imagens · Configurar apresentação" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]Configurar definições meteorológicas[/B][CR][CR]Definir várias cidades para obtenção de informação meterológica" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGURAR DEFINIÇÕES DE MÚSICA[/B][CR][CR]Gerir Biblioteca de Música · Opções de reprodução · Opções de listagem[CR]Definir envio de músicas · Opções de karaoke" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" -msgstr "[B]Configurar definições do sistema[/B][CR][CR]Configurar e calibrar ecrãs · Configurar saída de áudio · Configurar controlo remoto[CR]Opções de poupança de energia · Ativar depuração · Configurar bloqueio geral" - -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]Configurar add-ons[/B][CR][CR]Gerir add-ons instalados · Procurar e instalar add-ons a partir de kodi.tv[CR]Alterar definições de add-ons" +msgstr "[B]CONFIGURAR DEFINIÇÕES DO SISTEMA[/B][CR][CR]Configurar e calibrar ecrãs · Configurar saída de áudio · Configurar controlo remoto[CR]Configurar poupança de energia · Activar depuração · Configurar bloqueio geral" msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" -msgstr "[B]Configurar definições de TV[/B][CR][CR]Informação em ecrã completo· Gerir definições de dados do EPG" +msgstr "[B]CONFIGURAR DEFINIÇÕES DE TV[/B][CR][CR]Definir informação em ecrã cheio · Gerir definições de dados do EPG" msgctxt "#31410" msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" -msgstr "[B]Configurar definições dos serviços[/B][CR][CR]Controlar o Kodi via UPnP e HTTP · Configurar partilha de ficheiros[CR]Ativar ZeroConf · Configurar AirPlay" +msgstr "[B]CONFIGURAR DEFINIÇÕES DE SERVIÇOS[/B][CR][CR]Configurar controlo do Kodi via UPnP e HTTP · Configurar partilha de ficheiros[CR]Activar ZeroConf · Configurar AirPlay" msgctxt "#31411" msgid "First run help..." msgstr "Ajuda da primeira execução..." -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Este separador significa que existe um menu lateral nesta janela que contém opções extra para esta seção. Para aceder ao menu, navegue para a esquerda com o controlo remoto ou teclado, ou posicione o ponteiro do rato sobre o separador. [CR][CR]Clique em \"OK\" para fechar este diálogo. Não irá aparecer novamente." - msgctxt "#31413" msgid "Local subtitle available" msgstr "Legenda local disponível" @@ -482,23 +438,19 @@ msgctxt "#31421" msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Selecione o seu perfil de utilizador do Kodi[CR]para iniciar sessão e continuar" +msgstr "Escolha o seu perfil de utilizador do Kodi[CR]para iniciar sessão e prosseguir" msgctxt "#31422" msgid "Show or hide the login screen at startup." -msgstr "Mostrar/ocultar o ecrã de início de sessão ao arrancar" +msgstr "Mostrar ou ocultar o ecrã de início de sessão ao iniciar o Kodi" msgctxt "#31423" msgid "Select the profile that will be used at startup when the login screen is disabled." -msgstr "Selecione o perfil a utilizar no arranque se o ecrã de início de sessão estiver desativado." - -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Hora do agendamento" +msgstr "Seleccionar o perfil que será usado inicialmente quando o ecrã de início de sessão não é exibido" msgctxt "#31502" msgid "TV" -msgstr "Televisão" +msgstr "TELEVISÃO" msgctxt "#31503" msgid "Add group" @@ -510,27 +462,23 @@ msgctxt "#31505" msgid "Delete group" -msgstr "Apagar grupo" +msgstr "Remover grupo" msgctxt "#31506" msgid "Available[CR]Groups" -msgstr "Grupos[CR]disponíveis" +msgstr "Grupos[CR] disponíveis" msgctxt "#31509" msgid "Channel group" msgstr "Grupo de canais" -msgctxt "#31510" -msgid "Timer set" -msgstr "Temporizador definido" - msgctxt "#31511" msgid "Channel options" msgstr "Opções do canal" msgctxt "#31901" msgid "36-hour forecast" -msgstr "Previsão de 36 Horas" +msgstr "Previsão para 36 horas" msgctxt "#31902" msgid "Hourly forecast" @@ -538,7 +486,7 @@ msgctxt "#31903" msgid "Weekend forecast" -msgstr "Previsão do fim de semana" +msgstr "Previsão semanal" msgctxt "#31904" msgid "Daily forecast" @@ -548,13 +496,9 @@ msgid "Forecast" msgstr "Previsão" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Possibilidade de precipitação" - msgctxt "#31909" msgid "Fetching forecast info..." -msgstr "A obter previsões meteorológicas..." +msgstr "A receber previsões meteorológicas..." msgctxt "#31910" msgid "Maps" @@ -562,44 +506,44 @@ msgctxt "#31950" msgid "WEATHER" -msgstr "Meteorologia" +msgstr "METEOROLOGIA" msgctxt "#31951" msgid "PICTURES" -msgstr "Imagens" +msgstr "IMAGENS" msgctxt "#31952" msgid "TV" -msgstr "Televisão" +msgstr "TELEVISÃO" msgctxt "#31953" msgid "VIDEOS" -msgstr "Vídeos" +msgstr "VÍDEOS" msgctxt "#31954" msgid "MOVIES" -msgstr "Filmes" +msgstr "FILMES" msgctxt "#31955" msgid "TV SHOWS" -msgstr "Séries" +msgstr "SÉRIES TV" msgctxt "#31956" msgid "MUSIC" -msgstr "Música" +msgstr "MÚSICA" msgctxt "#31957" msgid "PROGRAMS" -msgstr "Programas" +msgstr "PROGRAMAS" msgctxt "#31958" msgid "PLAY DISC" -msgstr "Reproduzir disco" +msgstr "INICIAR DISCO" msgctxt "#31959" msgid "SYSTEM" -msgstr "Sistema" +msgstr "SISTEMA" msgctxt "#31960" msgid "RADIO" -msgstr "Rádio" +msgstr "RÁDIO" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ro_ro/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ro_ro/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ro_ro/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ro_ro/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -42,7 +42,7 @@ msgctxt "#31009" msgid "Total duration" -msgstr "Durata totală" +msgstr "Durată totală" msgctxt "#31022" msgid "Music - Files" @@ -118,7 +118,7 @@ msgctxt "#31048" msgid "Visualisation presets" -msgstr "Prestabiliri vizualizare" +msgstr "Predefiniri vizualizare" msgctxt "#31049" msgid "End time" @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Ascunde creația artistică de pe fundal" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Ascunde EPG dacă RDS este prezent în fereastra canal" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Arată fundal video „Acum în redare”" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Arată vizualizare „Acum în redare” pe fundal" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Redă cântece temă TV în mediateca video (supliment TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Versuri" @@ -266,7 +270,7 @@ msgctxt "#31142" msgid "Settings level" -msgstr "Nivel stabiliri" +msgstr "Nivel setări" msgctxt "#31200" msgid "Shortcuts" @@ -338,7 +342,7 @@ msgctxt "#31317" msgid "Set fanart path" -msgstr "Stabilire cale creație artistică" +msgstr "Definire cale creație artistică" msgctxt "#31319" msgid "Selected profile" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Ultimul autentificat" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Selector cântece karaoke" + msgctxt "#31322" msgid "Aired" msgstr "Difuzat pe" @@ -370,7 +378,7 @@ msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" -msgstr "[B]Planificare oprire activată![/B] [COLOR=grey2] Sistemul va fi oprit automat în[/COLOR]" +msgstr "[B]Planificare închidere activată![/B] [COLOR=grey2] Închidere sistem în[/COLOR]" msgctxt "#31330" msgid "Click button to play[CR][CR]movie trailer" @@ -402,7 +410,7 @@ msgctxt "#31356" msgid "Download subtitles" -msgstr "Descarcă subtitluri" +msgstr "Descarcă subtitrări" msgctxt "#31360" msgid "Watch as 2D" @@ -430,39 +438,39 @@ msgctxt "#31400" msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver" -msgstr "[B]CONFIGURAȚI STABILIRI ASPECT[/B][CR][CR]Schimbați costumul · Alegeți limba și regiunea · Modificați opțiunile de listare a fișierelor[CR]Alegeți un protector de ecran" +msgstr "[B]CONFIGURAȚI SETĂRI DE ASPECT[/B][CR][CR]Schimbați costumul · Alegeți limba și regiunea · Modificați opțiunile de listare a fișierelor[CR]Alegeți un protector ecran" msgctxt "#31401" msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" -msgstr "[B]CONFIGURAȚI STABILIRI VIDEO[/B][CR][CR]Administrați mediateca video · Configurați opțiuni redare video · Modificați opțiuni afișare liste de fișiere video[CR]Alegeți font subtitlu" +msgstr "[B]CONFIGURAȚI SETĂRI VIDEO[/B][CR][CR]Administrați mediateca video · Configurați opțiuni redare video · Modificați opțiuni afișare liste de fișiere video[CR]Alegeți font subtitrare" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]CONFIGURAȚI STABILIRI MUZICĂ[/B][CR][CR]Administrați mediateca audio · Stabiliți opțiunile de redare a muzicii · Schimbați opțiunile de afișare listă ale muzicii[CR]Configurați trimitere cântece" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]CONFIGURAȚI SETĂRI MUZICĂ[/B][CR][CR]Administrați mediateca audio · Setați opțiuni redare muzică · Modificați opțiuni afișare liste de fișiere audio[CR]Pregătiți trimitere cântec · Configurați opțiuni karaoke" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]CONFIGURAȚI STABILIRI IMAGINE[/B][CR][CR]Modificați opțiuni afișare liste de imagini · Configurați diaporama" +msgstr "[B]CONFIGURAȚI SETĂRI IMAGINE[/B][CR][CR]Modificați opțiuni afișare liste de imagini · Configurați diaporama" msgctxt "#31404" msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]CONFIGURAȚI STABILIRI METEO[/B][CR][CR]Alegeți orașe diverse pentru care se obțin informații meteo" +msgstr "[B]CONFIGURAȚI SETĂRI METEO[/B][CR][CR]Alegeți orașe diverse pentru care se obțin informații meteo" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" -msgstr "[B]CONFIGURAȚI STABILIRI SISTEM[/B][CR][CR]Configurați și calibrați ecrane · Configurați ieșirea audio · Instalați telecomenzi[CR]Alegeți opțiuni de economisire energie · Activați depanarea · Configurați blocarea principală" +msgstr "[B]CONFIGURAȚI SETĂRI SISTEM[/B][CR][CR]Configurați și calibrați ecrane · Configurați ieșirea audio · Instalați telecomenzi[CR]Alegeți opțiuni de economisire energie · Activați depanarea · Configurați blocarea principală" msgctxt "#31408" msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]CONFIGURAȚI SUPLIMENTE[/B][CR][CR]Administrați suplimentele instalate · Răsfoiți și instalați suplimente de la kodi.tv[CR]Modificați stabilirile suplimentelor" +msgstr "[B]CONFIGURAȚI SUPLIMENTE[/B][CR][CR]Administrați suplimentele instalate · Răsfoiți și instalați suplimente de la kodi.tv[CR]Modificați setările suplimentelor" msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" -msgstr "[B]CONFIGURAȚI STABILIRI TELEVIZIUNE ÎN DIRECT[/B][CR][CR]Schimbați informațiile afișate pe ecran în modul ecran complet · Gestionați stabiliri date ghid tv" +msgstr "[B]CONFIGURAȚI SETĂRI TELEVIZIUNE ÎN DIRECT[/B][CR][CR]Schimbați informațiile afișate pe ecran în modul ecran complet · Gestionați setări date ghid tv" msgctxt "#31410" msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" -msgstr "[B]CONFIGURARAȚI STABILIRI SERVICII[/B][CR][CR]Configurați controului Kodi prin UPnP și HTTP · Configurarați partajarea de fișiere[CR]Activați Zeroconf · Configurați AirPlay" +msgstr "[B]CONFIGURARAȚI SETĂRI SERVICII[/B][CR][CR]Stabiliți controului Kodi prin UPnP și HTTP · Configurarați partajarea de fișiere[CR]Activați Zeroconf · Configurați AirPlay" msgctxt "#31411" msgid "First run help..." @@ -474,7 +482,7 @@ msgctxt "#31413" msgid "Local subtitle available" -msgstr "Este disponibil un subtitlu local" +msgstr "Este disponibilă o subtitrare locală" msgctxt "#31420" msgid "Login" @@ -522,7 +530,7 @@ msgctxt "#31510" msgid "Timer set" -msgstr "Cronometru stabilit" +msgstr "Cronometru pornit" msgctxt "#31511" msgid "Channel options" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ru_ru/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ru_ru/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ru_ru/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ru_ru/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Скрыть фоновый фанарт" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Скрыть EPG если на каналe присутствует RDS" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Воспроизводимое видео в качестве фона" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Музыкальная визуализация в качестве фона" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Играть мелодию сериала в медиатеке (дополнение TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Тексты" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Последний вход" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Выбор песен для караоке" + msgctxt "#31322" msgid "Aired" msgstr "Премьера" @@ -437,8 +445,8 @@ msgstr "[B]НАСТРОЙКА ПАРАМЕТРОВ ВИДЕО[/B][CR][CR]Управление медиатекой видео • Параметры воспроизведения видео[CR]Настройка списка видео • Настройка шрифта субтитров" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]НАСТРОЙКА ПАРАМЕТРОВ МУЗЫКИ[/B][CR][CR]Управление медиатекой аудио • Параметры воспроизведения аудио[CR]Настройка списка аудио • Настройка добавления песен" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]НАСТРОЙКА ПАРАМЕТРОВ МУЗЫКИ[/B][CR][CR]Управление медиатекой аудио • Параметры воспроизведения аудио[CR]Настройка списка аудио • Настройка добавления песен • Настройка караоке" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sk_sk/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sk_sk/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sk_sk/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sk_sk/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: sk_SK\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Zmeňte vaše" - -msgctxt "#31003" -msgid "Power options" -msgstr "Nastavenia napájania" - msgctxt "#31004" msgid "Working..." msgstr "Pracujem..." -msgctxt "#31005" -msgid "Hide information" -msgstr "Skryť informáciu" - msgctxt "#31006" msgid "View options" msgstr "Zobrazenie" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "Celá obrazovka" -msgctxt "#31009" -msgid "Total duration" -msgstr "Celkové trvanie" - msgctxt "#31022" msgid "Music - Files" msgstr "Hudba - Súbory" @@ -60,30 +44,14 @@ msgid "Items" msgstr "Položky" -msgctxt "#31026" -msgid "Misc options" -msgstr "Ďalšie nastavenia" - msgctxt "#31027" msgid "Location" msgstr "Mesto" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Obal posteru" - msgctxt "#31029" msgid "Fanart" msgstr "Fanart" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Obrázky náhľadov" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Obal obrázku" - msgctxt "#31033" msgid "Info" msgstr "Informácie" @@ -92,10 +60,6 @@ msgid "Actions" msgstr "Akcie" -msgctxt "#31040" -msgid "Now playing" -msgstr "Práve hrá" - msgctxt "#31042" msgid "PLAYING" msgstr "PREHRÁVA SA" @@ -116,10 +80,6 @@ msgid "SEEKING" msgstr "VYHĽADÁVANIE" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Predvoľby vizualizácie" - msgctxt "#31049" msgid "End time" msgstr "Čas konca" @@ -156,10 +116,6 @@ msgid "This file is stacked, select the part you want to play from." msgstr "Tento súbor sa skladá z viac častí. Vyberte tu, od ktorej chcete spustit prehrávaníe." -msgctxt "#31061" -msgid "Current selected" -msgstr "Aktuálne vybraný" - msgctxt "#31101" msgid "Home screen options" msgstr "Informácie na Domovskej stránke" @@ -168,26 +124,10 @@ msgid "Background" msgstr "Pozadie" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Zobrazovať \"Pauza\" pri prezentácii obrázkov" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Prehrávať ukážky v okne [COLOR=grey3](iba z okna Informácie o videu)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" msgstr "Rôzne nastavenia" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Nezobrazovať ikonky zdroja videa [COLOR=grey3](napr. Blu-ray, HD-DVD)[/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Skryť položky hlavného menu" - msgctxt "#31109" msgid "Enable custom background" msgstr "Aktivovať vlastné pozadie" @@ -204,58 +144,18 @@ msgid "Options" msgstr "Možnosti" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Zobraziť naposledy pridané albumy" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Zobrazovať naposledy pridané videá" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Domovská stránka / podmenu Programy" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Skryť Fanart na pozadí" - -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Ak je v okne kanálu informácia RDS, skryť EPG" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Zobrazovať práve prehrávané video na pozadí" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Zobrazovať práve prehrávanú vizualizáciu na pozadí" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Prehrávať skladbu TV seriálu vo video knižnici (TvTunes doplnok)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "Texty skladieb" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Skryť Fanart pri vizualizácii na celú obrazovku" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Doplnok Texty skladieb" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Domovská stránka / podmenu Videá" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Domovská stránka / podmenu Hudba" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Domovská stránka / podmenu Obrázky" - msgctxt "#31140" msgid "Music OSD" msgstr "Hudobný OSD" @@ -272,90 +172,22 @@ msgid "Shortcuts" msgstr "Odkazy" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Vyberte si vašu skladbu" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Zdroj textov skladieb" - msgctxt "#31206" msgid "Found" msgstr "Nájdené" -msgctxt "#31207" -msgid "Find more items" -msgstr "Hľadať viac položiek" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Pripravované časti" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Aktuálna teplota" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Naposledy aktualizované" - msgctxt "#31303" msgid "Data provider" msgstr "Počasie Vám prináša" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Skryť FanArt" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Podrobnosti o filme" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Použitá pamäť:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Číslo skladby" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" msgstr "Fanart obrázok[CR][CR]Nedostupný[CR][CR] Klik pre nastavenie" -msgctxt "#31312" -msgid "Current scraper" -msgstr "Aktuálny sťahovač" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Vyber sťahovač" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Možnosti vyhľadávania obsahu" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Nastaviť cestu k FanArt" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Vybratý profil" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Posledné prihlásenie" - msgctxt "#31322" msgid "Aired" msgstr "Vysielané" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Nastavenia Playlistu" - msgctxt "#31326" msgid "Created" msgstr "Vytvorené" @@ -372,14 +204,6 @@ msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" msgstr "[B]Časovač nastavený![/B] [COLOR=grey2] - Systém sa automaticky vypne za[/COLOR]" -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Pre spustenie ukážky[CR][CR]stlačte tlačidlo" - -msgctxt "#31331" -msgid "Album details" -msgstr "Podrobnosti o albume" - msgctxt "#31351" msgid "Pause" msgstr "Pauza" @@ -388,10 +212,6 @@ msgid "Stop" msgstr "Zastaviť" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Posunúť dopredu" - msgctxt "#31354" msgid "Rewind" msgstr "Pretočiť dozadu" @@ -400,10 +220,6 @@ msgid "Movie menu" msgstr "Menu filmu" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Stiahnuť titulky" - msgctxt "#31360" msgid "Watch as 2D" msgstr "Pozerať ako 2D" @@ -420,10 +236,6 @@ msgid "Skin default" msgstr "Predvolený vzhľad" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Predvolený vzhľad bez veľkých písmen" - msgctxt "#31392" msgid "Arial based" msgstr "Arial" @@ -437,25 +249,13 @@ msgstr "[B]MOŽNOSTI VIDEA[/B][CR][CR]Správa knižnice videí · Možnosti prehrávania videa · Zobrazenie video súborov[CR]Nastavenie titulkov" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]KONFIGUROVAŤ NASTAVENIA HUDBY[/B][CR][CR]Spravujte svoju hudobnú zbierku · Nastaviť možnosti prehrávania hudby · Zmeniť možnosti zobrazovania zoznamu[CR]Nastaviť informácie o skladbách" - -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]MOŽNOSTI OBRÁZKOV[/B][CR][CR]Možnosti zobrazenia obrázkov · Nastavenie prezentácie" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]MOŽNOSTI POČASIA[/B][CR][CR]Nastavte rôzne mestá, pre ktoré si prajete získavať predpoveď počasia" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]MOŽNOSTI HUDBY[/B][CR][CR]Správa knižnice hudby · Možnosti prehrávania hudby · Zobrazenie hudobných súborov[CR]Služby pre odosielanie informácií o prehrávaných skladbách · Karaoke nastavenia" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]MOŽNOSTI SYSTÉMU[/B][CR][CR]Nastavenie obrazovky · Nastavenie zvukového výstupu[CR]Možnosti úsporného režimu · Ukladanie informácií · Konfigurácia rodičovského zámku" -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]MOŽNOSTI DOPLNKOV[/B][CR][CR]Správa nainštalovaných doplnkov · Vyhľadávanie a inštalácia doplnkov z kodi.tv[CR]Zmena nastavenia doplnkov" - msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" msgstr "[B]NASTAVENIA TV[/B][CR][CR]Zmeniť informácie zobrazené na celej obrazovke · Spravovať nastavenia EPG dát" @@ -464,14 +264,6 @@ msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" msgstr "[B]KONFIGUROVAŤ NASTAVENIA SLUŽBY[/B][CR][CR]Nastaviť ovládanie Kodi pomocou UPnP a HTTP · Konfigurovať zdielanie[CR]Zapnúť Zeroconf · Konfigurovať AirPlay" -msgctxt "#31411" -msgid "First run help..." -msgstr "Pomocník po prvom spustení..." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Táto záložka zvýrazňuje, že sa na bočnej strane okna nachádza skryté menu. Aby ste sa k nemu dostali, kurzorovými tlačidlami na vašom diaľkovom ovládači alebo klávesnici choďte doľava, prípadne umiestnite kurzor myši ponad túto záložku. [CR][CR]Kliknutím na tlačidlo \"OK\" sa zavrie toto dialógové okno. V budúcnosti sa už nezobrazí." - msgctxt "#31413" msgid "Local subtitle available" msgstr "Dostupné lokálne titulky" @@ -480,10 +272,6 @@ msgid "Login" msgstr "Prihlásiť" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Vyberte váš používateľský profil Kodi[CR]pre prihlásenie a pokračovanie" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "Zobraziť alebo skryť prihlasovaciu obrazovku pri štarte." @@ -492,66 +280,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "Zvoľte profil, ktorý bude použitý pri štarte, ak je prihlasovacia obrazovka vypnutá." -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Naplánovaný čas" - msgctxt "#31502" msgid "TV" msgstr "TV" -msgctxt "#31503" -msgid "Add group" -msgstr "Pridať skupinu" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Premenovať skupinu" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Vymazať skupinu" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "Dostupné[CR]skupiny" -msgctxt "#31509" -msgid "Channel group" -msgstr "Skupina kanálov" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Časovač nastavený" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Možnosti kanálu" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "36-hodinová predpoveď" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Hodinová predpoveď" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Víkendová predpoveď" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Denná predpoveď" - msgctxt "#31905" msgid "Forecast" msgstr "Predpoveď" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Riziko zrážok" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "Zisťujem informácie o počasí..." diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sl_si/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sl_si/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sl_si/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sl_si/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Skrij ozadja" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Skrij el. prog. vodnika, če je v oknu kanala prisoten RDS" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Prikaži v ozadju \"Zdaj se predvaja\" video" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Prikaži v ozadju \"Zdaj se predvaja\" vizualizacija" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "V knjižnici predvajaj uvodne pesmi TV serij (dodatek TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Besedilo pesmi" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Zadnja prijava" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Izbirnik pesmi za karaoke" + msgctxt "#31322" msgid "Aired" msgstr "Predvajano" @@ -437,8 +445,8 @@ msgstr "[B]PRILAGODITE NASTAVITVE VIDEA[/B][CR][CR]Upravljajte s knjižnico videa · Nastavite možnosti predvajanja videa[CR]Spremenite možnosti seznamov · Določite pisavo podnapisov" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]PRILAGODITE NASTAVITVE GLASBE[/B][CR][CR]Upravljajte knjižnico glasbe · Nastavite možnosti predvajanja glasbe · Spremenite možnosti seznamov[CR]Nastavite objavo pesmi" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]PRILAGODITE NASTAVITVE GLASBE[/B][CR][CR]Upravljajte s knjižnico glasbe · Nastavite možnosti predvajanja glasbe[CR]Spremenite možnosti seznamov · Nastavite objavo pesmi · Nastavite karaoke" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sq_al/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sq_al/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sq_al/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sq_al/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -140,6 +140,14 @@ msgid "Options" msgstr "Opcionet" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Luaj melodinë kryesore përcjellse së një seriali televiziv ne bibleotekën video (Shtesa TVTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TVTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Tekste Këngësh" @@ -220,6 +228,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]KONFIGURO OPCIONET E VIDEOVE[/B][CR][CR]Menaxho video-bibliotekën tënde · Cakto opcionet e video-riprodhimit · Ndrysho pamjen e video-listës[CR]Cakto shkrimin e subtitrave" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KONFIGURO OPCIONET E MUZIKËS[/B][CR][CR]Menaxho bibliotekën e muzikës tënde · Cakto opcione të riprodhimit të muzikës · Ndrysho pamjen e listës së muzikës[CR]Cakto opcionet karaoke" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]KONFIGURO OPCIONET E SISTEMIT[/B][CR][CR]Konfiguro dhe Kalibro Ekranet · Konfiguro daljen e zërit · Konfiguro telekomandat [CR]Cakto opcionet për kursimin e rrymës · Aktivizo debugging · Konfiguro dryrin përdorues" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sr_rs/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sr_rs/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sr_rs/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sr_rs/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: sr_RS\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Промените ваше" - -msgctxt "#31003" -msgid "Power options" -msgstr "Опције напајања" - msgctxt "#31004" msgid "Working..." msgstr "Обрада..." -msgctxt "#31005" -msgid "Hide information" -msgstr "Сакриј информације" - msgctxt "#31006" msgid "View options" msgstr "Прикажи опције" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "Цео екран" -msgctxt "#31009" -msgid "Total duration" -msgstr "Укупно трајање" - msgctxt "#31022" msgid "Music - Files" msgstr "Музика - Датотеке" @@ -60,29 +44,13 @@ msgid "Items" msgstr "Ставки" -msgctxt "#31026" -msgid "Misc options" -msgstr "Остале опције" - msgctxt "#31027" msgid "Location" msgstr "Локација" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Умотано у постер" - msgctxt "#31029" msgid "Fanart" -msgstr "Уметност љубитеља" - -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Сличице слика" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Умотано у слику" +msgstr "Зан. слика" msgctxt "#31033" msgid "Info" @@ -90,11 +58,7 @@ msgctxt "#31039" msgid "Actions" -msgstr "Акције" - -msgctxt "#31040" -msgid "Now playing" -msgstr "Сада пуштено" +msgstr "Наредбе" msgctxt "#31042" msgid "PLAYING" @@ -114,35 +78,31 @@ msgctxt "#31046" msgid "SEEKING" -msgstr "ТРАЖЕЊЕ" - -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Унапред задате визуализације" +msgstr "ПРЕМОТАВАЊЕ" msgctxt "#31049" msgid "End time" -msgstr "Време краја" +msgstr "Време завршетка" msgctxt "#31050" msgid "Sort: Ascending" -msgstr "Сложи: Узлазно" +msgstr "Сортирај Растуће" msgctxt "#31051" msgid "Sort: Descending" -msgstr "Сложи: Силазно" +msgstr "Сортирај Опадајуће" msgctxt "#31055" msgid "Open playlist" -msgstr "Отвори листу за репродукцију" +msgstr "Отвори реп. списак" msgctxt "#31056" msgid "Save playlist" -msgstr "Сачувај листу за репродукцију" +msgstr "Сачувај реп. списак" msgctxt "#31057" msgid "Close playlist" -msgstr "Затвори листу за репродукцију" +msgstr "Затвори реп. списак" msgctxt "#31058" msgid "System music files" @@ -150,44 +110,24 @@ msgctxt "#31059" msgid "Current playlist" -msgstr "Тренутна листа за репродукцију" +msgstr "Тренутни реп. списак" msgctxt "#31060" msgid "This file is stacked, select the part you want to play from." -msgstr "Ова датотека је сложена, одаберите који део желите да репродукујете из ње" - -msgctxt "#31061" -msgid "Current selected" -msgstr "Тренутно одабрано" +msgstr "Ова датотека је сложена, изаберите део који желите да репродукујете." msgctxt "#31101" msgid "Home screen options" -msgstr "Опције главног екрана" +msgstr "Опције почетног екрана" msgctxt "#31102" msgid "Background" msgstr "Позадина" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Прикажи \"Паузирано\" при репродукцији слајдова слика" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Пусти најаве у прозору [COLOR=grey3](Само дијалог података видеа)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" msgstr "Разне опције" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Сакриј ознаке прочитане из назива видео датотека [COLOR=grey3](нпр. Blu-ray,, HD-DVD)[/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Сакриј тастере главног менија" - msgctxt "#31109" msgid "Enable custom background" msgstr "Омогући прилагођену позадину" @@ -204,58 +144,18 @@ msgid "Options" msgstr "Опције" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Прикажи недавно додате албуме" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Прикажи недавно додате видее" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Подмени програма на почетној страни" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Сакриј позадинску слику уметности љубитеља" - -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Сакриј EPG ако је RDS присутан на прозору канала" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Прикажи у позадини \"Сада пуштени\" видео" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Прикажи у позадини \"Сада пуштено\" визуелизацију" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Пусти насловну музичку тему из видео библиотеке (додатак TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "ТвМелодије" msgctxt "#31128" msgid "Lyrics" msgstr "Текстови песама" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Сакриј уметност љубитеља при визуализацији преко целог екрана" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Додатни програм за текстове песама" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Подмени \"Видеи\" на главном екрану" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Подмени \"Музика\" на главном екрану" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Подмени \"Слике\" на главном екрану" - msgctxt "#31140" msgid "Music OSD" msgstr "Музички OSD" @@ -266,96 +166,28 @@ msgctxt "#31142" msgid "Settings level" -msgstr "Ниво подешавања" +msgstr "Ниво поставки" msgctxt "#31200" msgid "Shortcuts" msgstr "Пречице" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Изаберите вашу песму" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Извор текстова песама" - msgctxt "#31206" msgid "Found" msgstr "Пронађено" -msgctxt "#31207" -msgid "Find more items" -msgstr "Потражи још ставки" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Предстојеће епизоде" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Тренутна температура" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Последњи пут ажурирано" - msgctxt "#31303" msgid "Data provider" -msgstr "Провајдер података" - -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Сакриј уметност љубитеља" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Детаљи филма" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Искоришћеност меморије:" - -msgctxt "#31310" -msgid "Track number" -msgstr "Број нумере" +msgstr "Провајдер" msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" -msgstr "Уметност љубитеља[CR][CR]Није доступна.[CR][CR]Кликните на татер да бисте је поставили." - -msgctxt "#31312" -msgid "Current scraper" -msgstr "Тренутни добављач" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Изаберите добављача" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Опције анализирања садржаја" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Поставите путању уметности љубитеља" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Одабрани профил" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Последња пријава" +msgstr "Занимљива слика[CR]није додељена.[CR][CR]Кликните на дугме да[CR]бисте је доделили." msgctxt "#31322" msgid "Aired" msgstr "Емитовано" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Опције листе за репродукцију" - msgctxt "#31326" msgid "Created" msgstr "Направљено" @@ -370,15 +202,7 @@ msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" -msgstr "[B]Тајмер је постављен![/B] [COLOR=grey2] - Систем ће се искључити за[/COLOR]" - -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Кликните на тастер за репродукцију[CR][CR]најаве филма" - -msgctxt "#31331" -msgid "Album details" -msgstr "Детаљи албума" +msgstr "[B]Одбројавање је постављено![/B] [COLOR=grey2] - Систем ће се искључити за[/COLOR]" msgctxt "#31351" msgid "Pause" @@ -388,10 +212,6 @@ msgid "Stop" msgstr "Заустави" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Премотај унапред" - msgctxt "#31354" msgid "Rewind" msgstr "Премотај уназад" @@ -400,10 +220,6 @@ msgid "Movie menu" msgstr "Филмски мени" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Преузми титлове" - msgctxt "#31360" msgid "Watch as 2D" msgstr "Гледај као 2D" @@ -420,57 +236,33 @@ msgid "Skin default" msgstr "Подразумевана маска" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Подразумевана маска без великих слова" - msgctxt "#31392" msgid "Arial based" msgstr "Засновано на Arial-у" msgctxt "#31400" msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver" -msgstr "[B]ПОДЕСИТЕ ПОДЕШАВАЊА ПРИКАЗА[/B][CR][CR]Промените маску · Поставите језик и регију - Промените опције излиставања датотека[CR]Поставите чувара екрана" +msgstr "[B]КОНФИГУРИСАЊЕ ПОСТАВКИ ПРИКАЗА[/B][CR][CR]Промените маску · Изаберите језик и област где живите[CR]Промените опције излиставања датотека · Изаберите чувара екрана" msgctxt "#31401" msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" -msgstr "[B]ПОДЕСИТЕ ВИДЕО ПОДЕШАВАЊА[/B][CR][CR]Управљајте вашом видео библиотеком · Поставите опције видео репродукције - Промените опције излиставања филмова[CR]Поставите слова титлова" +msgstr "[B]КОНФИГУРИСАЊЕ ПОСТАВКИ ФИЛМОВА[/B][CR][CR]Управљајте вашом библиотеком филмова · Поставите опције репродукције филмова[CR]Промените опције излиставања филмова · Поставите изглед слова у титловима" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]ПОДЕСИТЕ МУЗИЧКА ПОДЕШАВАЊА[/B][CR][CR]Управљајте вашом музичком библиотеком · Поставите опције репродукције музике - Промените опције излиставања музике[CR]Поставите слање песама" - -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]ПОДЕСИТЕ ПОДЕШАВАЊА СЛИКА[/B][CR][CR]Поставите опције излиставања слика · Подесите репродукцију слајдова" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]ПОДЕСИТЕ ПОДЕШАВАЊА ВРЕМЕНСКЕ ПРОГНОЗЕ[/B][CR][CR]Поставите различите градове за прикупљање информација о временским приликама" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]КОНФИГУРИСАЊЕ ПОСТАВКИ МУЗИКЕ[/B][CR][CR]Управљајте вашом библиотеком музичких нумера · Поставите опције репрод. музике[CR]Промените опције излиставања музике · Поставите слање песама[CR]Поставите караоке опције" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" -msgstr "[B]ПОДЕСИТЕ ПОДЕШАВАЊА СИСТЕМА[/B][CR][CR]Подесите и калибришите екране · Подесите звучни излаз - Подесите даљинско управљање[CR]Поставите опције уштеде енергије - Омогућите евиденцију грешака · Подесите главну лозинку" - -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]ПОДЕСИТЕ ДОДАТНЕ ПРОГРАМЕ[/B][CR][CR]Управљајте вашим инсталираним додатним програмима · Потражите и инсталирајте додатне програме са коди.тв[CR]Подесите подешавања додатних програма" +msgstr "[B]КОНФИГУРИСАЊЕ ПОСТАВКИ СИСТЕМА[/B][CR][CR]Подесите и калибришите екране · Конфигуришите звучни излаз[CR]Подесите даљинско управљање · Поставите опције штедње енергије[CR]Омогућите евиденцију грешака · Подесите главну лозинку" msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" -msgstr "[B]ПОДЕСИТЕ ТВ ПОДЕШАВАЊА[/B][CR][CR]Промените информације целог екрана · Управљајте подешавањима EPG података" +msgstr "[B]КОНФИГУРИСАЊЕ ТВ ПОСТАВКИ[/B][CR][CR]Промените информације целог екрана · Управљајте поставкама података електронског програмског водича (EPG)" msgctxt "#31410" msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" -msgstr "[B]ПОДЕСИТЕ ПОДЕШАВАЊА СЕРВИСА[/B][CR][CR]Подесите контролу Kodi путем UPnP и HTTP · Подесите дељење датотека[CR]Омогућите Zeroconf - Подесите AirPlay" - -msgctxt "#31411" -msgid "First run help..." -msgstr "Помоћ код првог покретања...." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Овај таб показује да постоји мени са стране овог прозора који садржи додатне опције за овај одељак. Да би приступили овом менију, идите на леву страну вашим даљинским управљачем или тастатуром или поставите поинтер миша преко таба. [CR][CR]Кликните на \"У реду\" да би затворили овај дијалог. Неће се појавити поново." +msgstr "[B]ПОДЕШАВАЊЕ СЕРВИСА[/B][CR][CR]Подешавање контроле Kodi-ја преко UPnP и HTTP · Подешавање дељења фајлова[CR]Укључи Zeroconf · Подешавање AirPlay" msgctxt "#31413" msgid "Local subtitle available" @@ -480,10 +272,6 @@ msgid "Login" msgstr "Пријава" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Изаберите ваш Kodi кориснички профил[CR]за пријаву, а потом наставите даље" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "Прикажи или сакриј екран за пријаву при покретању." @@ -492,73 +280,25 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "Изаберите профил који ће се користити приликом покретања када је екран за пријаву онемогућен." -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Заказано време" - msgctxt "#31502" msgid "TV" msgstr "ТВ" -msgctxt "#31503" -msgid "Add group" -msgstr "Додај групу" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Преименуј групу" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Избриши групу" - msgctxt "#31506" msgid "Available[CR]Groups" -msgstr "Доступне[CR]Групе" - -msgctxt "#31509" -msgid "Channel group" -msgstr "Група канала" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Тајмер подешен" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Опције канала" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "Прогноза за 36 часова" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Часовна прогноза" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Прогноза за викенд" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Дневна прогноза" +msgstr "Доступне[CR]групе" msgctxt "#31905" msgid "Forecast" msgstr "Прогноза" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Могуће падавине" - msgctxt "#31909" msgid "Fetching forecast info..." -msgstr "Преузимање података прогнозе..." +msgstr "Прибављам информације о прогнози..." msgctxt "#31910" msgid "Maps" -msgstr "Мапе" +msgstr "Карта" msgctxt "#31950" msgid "WEATHER" @@ -574,7 +314,7 @@ msgctxt "#31953" msgid "VIDEOS" -msgstr "ВИДЕИ" +msgstr "ВИДЕО" msgctxt "#31954" msgid "MOVIES" @@ -594,7 +334,7 @@ msgctxt "#31958" msgid "PLAY DISC" -msgstr "ПУСТИ ДИСК" +msgstr "ОПТИЧКИ ДИСК" msgctxt "#31959" msgid "SYSTEM" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sr_rs@latin/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sr_rs@latin/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sr_rs@latin/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sr_rs@latin/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -38,7 +38,7 @@ msgctxt "#31008" msgid "Full screen" -msgstr "Ceo ekran" +msgstr "Ceo Ekran" msgctxt "#31009" msgid "Total duration" @@ -180,10 +180,6 @@ msgid "Miscellaneous options" msgstr "Razne opcije" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Sakrij oznake pročitane iz naziva video datoteka [COLOR=grey3](npr. Blu-ray, HD-DVD)[/COLOR]" - msgctxt "#31108" msgid "Hide main menu buttons" msgstr "Sakrij tastere glavnog menija" @@ -210,27 +206,31 @@ msgctxt "#31117" msgid "Show recently added videos" -msgstr "Prikaži nedavno dodate videe" +msgstr "Prikaži nedavno dodat video materijal" msgctxt "#31118" msgid "Home page programs submenu" -msgstr "Podmeni programa na početnoj strani" +msgstr "Podmeni \"Programi\" na glavnom ekranu" msgctxt "#31119" msgid "Hide background fanart" msgstr "Sakrij pozadinsku sliku umetnosti ljubitelja" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Sakrij EPG ako je RDS prisutan na prozoru kanala" - msgctxt "#31124" msgid "Show background \"Now playing\" video" -msgstr "Prikaži u pozadini \"Sada pušteni\" video" +msgstr "Prikaži u pozadini \"Sada Pušteni\" video" msgctxt "#31125" msgid "Show background \"Now playing\" visualisation" -msgstr "Prikaži u pozadini \"Sada pušteno\" vizuelizaciju" +msgstr "Prikaži u pozadini \"Sada Puštenu\" vizualizaciju" + +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Reprodukuj TV tematske pesme u video biblioteci (TVTunes dodatni program)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" @@ -246,7 +246,7 @@ msgctxt "#31134" msgid "Home page \"Videos\" submenu" -msgstr "Podmeni \"Videi\" na glavnom ekranu" +msgstr "Podmeni \"Video materijal\" na glavnom ekranu" msgctxt "#31135" msgid "Home page \"Music\" submenu" @@ -348,6 +348,10 @@ msgid "Last logged in" msgstr "Poslednja prijava" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Birač karaoke pesme" + msgctxt "#31322" msgid "Aired" msgstr "Emitovano" @@ -426,7 +430,7 @@ msgctxt "#31392" msgid "Arial based" -msgstr "Zasnovano na Arial-u" +msgstr "Zasnovano na Arialu" msgctxt "#31400" msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver" @@ -437,8 +441,8 @@ msgstr "[B]PODESITE VIDEO PODEŠAVANJA[/B][CR][CR]Upravljajte vašom video bibliotekom · Postavite opcije video reprodukcije - Promenite opcije izlistavanja filmova[CR]Postavite slova titlova" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]PODESITE MUZIČKA PODEŠAVANJA[/B][CR][CR]Upravljajte vašom muzičkom bibliotekom · Postavite opcije reprodukcije muzike - Promenite opcije izlistavanja muzike[CR]Postavite slanje pesama" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]PODESITE MUZIČKA PODEŠAVANJA[/B][CR][CR]Upravljajte vašom muzičkom bibliotekom · Postavite opcije reprodukcije muzike - Promenite opcije izlistavanja muzike[CR]Postavite slanje pesama - Postavite karaoke opcije" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" @@ -458,11 +462,11 @@ msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" -msgstr "[B]PODESITE TV PODEŠAVANJA[/B][CR][CR]Promenite informacije celog ekrana · Upravljajte podešavanjima EPG podataka" +msgstr "[B]PODESITE TV PODEŠAVANJA[/B][CR][CR]Promenite informacije celog ekrana · Upravljajte podešavanjima EPG podataka " msgctxt "#31410" msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" -msgstr "[B]PODESITE PODEŠAVANJA SERVISA[/B][CR][CR]Podesite kontrolu Kodi putem UPnP i HTTP · Podesite deljenje datoteka[CR]Omogućite Zeroconf - Podesite AirPlay" +msgstr "[B]PODESITE PODEŠAVANJA SERVISA[/B][CR][CR]Podesite kontrolu Kodija putem UPnP i HTTP · Podesite daljenje datoteka[CR]Omogućite Zeroconf - Podesite AirPlay" msgctxt "#31411" msgid "First run help..." @@ -470,7 +474,7 @@ msgctxt "#31412" msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Ovaj tab pokazuje da postoji meni sa strane ovog prozora koji sadrži dodatne opcije za ovaj odeljak. Da bi pristupili ovom meniju, idite na levu stranu vašim daljinskim upravljačem ili tastaturom ili postavite pointer miša preko taba. [CR][CR]Kliknite na \"U redu\" da bi zatvorili ovaj dijalog. Neće se pojaviti ponovo." +msgstr "Ovaj tab pojazuje da postoji meni sa strane ovog prozora koji sadrži dodatne opcije za ovaj odeljak. Da bi pristupili ovom meniju, idite na levu stranu vašim daljinskim upravljačem ili tastaturom ili postavite pointer miša preko taba. [CR][CR]Kliknite na \"U redu\" da bi zatvorili ovaj dijalog. Neće se pojaviti ponovo." msgctxt "#31413" msgid "Local subtitle available" @@ -486,11 +490,11 @@ msgctxt "#31422" msgid "Show or hide the login screen at startup." -msgstr "Prikaži ili sakrij ekran za prijavu pri pokretanju." +msgstr "Prikaži ili sakrij ekran za prijavu pri pokretanju" msgctxt "#31423" msgid "Select the profile that will be used at startup when the login screen is disabled." -msgstr "Izaberite profil koji će se koristiti prilikom pokretanja kada je ekran za prijavu onemogućen." +msgstr "Izaberite profil koji će se koristiti prilikom pokretanja kada je ekran za prijavu onemogućen" msgctxt "#31501" msgid "Scheduled time" @@ -514,7 +518,7 @@ msgctxt "#31506" msgid "Available[CR]Groups" -msgstr "Dostupne[CR]Grupe" +msgstr "Dostupne[CR]grupe" msgctxt "#31509" msgid "Channel group" @@ -562,7 +566,7 @@ msgctxt "#31950" msgid "WEATHER" -msgstr "VREME" +msgstr "VREMENSKA PROGNOZA" msgctxt "#31951" msgid "PICTURES" @@ -574,7 +578,7 @@ msgctxt "#31953" msgid "VIDEOS" -msgstr "VIDEI" +msgstr "VIDEO MATERIJAL" msgctxt "#31954" msgid "MOVIES" @@ -594,7 +598,7 @@ msgctxt "#31958" msgid "PLAY DISC" -msgstr "PUSTI DISK" +msgstr "OPTIČKI DISK" msgctxt "#31959" msgid "SYSTEM" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sv_se/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sv_se/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.sv_se/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.sv_se/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "Dölj bakgrundsfanart" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Dölj EPG när RDS finns i kanalfönstret" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "Visa bakgrund \"Nu spelas\" filmer" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Visa \"Spelas nu\" backgrundsvisualisering" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Spela TV-temasånger i videobiblioteket (TVTunes-tillägg)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Sångtexter" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "Senast inloggad" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Låtväljare för kareoke" + msgctxt "#31322" msgid "Aired" msgstr "Sänt" @@ -437,8 +445,8 @@ msgstr "[B]KONFIGURERA GRAFIKINSTÄLLNINGAR[/B][CR][CR]Hantera ditt filmbibliotek · Ange filmuppspelningsalternativ[CR]Ändra videoförteckningsalternativ · Konfigurera undertexttypsnitt" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]KONFIGURERA MUSIKINSTÄLLNINGAR[/B][CR][CR]Hantera ditt musikbibliotek · Ange musikuppspelningsalternativ · Ändra musiklistningsalternativ[CR]Ange låtinskickning" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KONFIGURERA MUSIKINSTÄLLNINGAR[/B][CR][CR]Hantera ditt musikbibliotek · Ange musikuppspelningsalternativ[CR]Ändra musiklistningsalternativ · Ange låtinskickning · Ange karaoke-alternativ" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.szl/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.szl/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.szl/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.szl/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -228,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "Pokŏż prawie przegrywanõ wizualizacyjõ na zadku" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Grej śpiywki ze programōw TV we bibliŏtyce wideo (przidŏwka TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Teksty śpiywek" @@ -344,6 +352,10 @@ msgid "Last logged in" msgstr "Ôstatnie logowaniy" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Ôbiyrŏcz śpiywek karaoke" + msgctxt "#31322" msgid "Aired" msgstr "Emisyjŏ" @@ -432,6 +444,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]KŌNFIGURUJ NASZTALOWANIA WIDEO[/B][CR][CR]Biblioteka wideo · Ôdgrywaniy · Lista wideo · Czciōnka napisōw" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]KŌNFIGURUJ NASZTALOWANIA MUZYKI[/B][CR][CR]Biblioteka muzyki · Ôdgrywaniy · Lista śpiywek · Publikacyjŏ śpiywek · Ôpcyje karaoke" + msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" msgstr "[B]KŌNFIGURUJ NASZTALOWANIA BILDŌW[/B][CR][CR]Lista bildōw · Prezyntacyjŏ" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ta_in/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ta_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.ta_in/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.ta_in/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -124,6 +124,10 @@ msgid "Options" msgstr "விருப்பங்கள்" +msgctxt "#31127" +msgid "TvTunes" +msgstr "தொலைராகங்கள்" + msgctxt "#31128" msgid "Lyrics" msgstr "பாடல்வரிகள்" @@ -176,6 +180,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]நிகழ்படம் அமைப்புகள் கட்டமைப்பு[/B][CR][CR]உங்கள் வீடியோ நூலக மேலாண்மை · வீடியோ பின்னணி விருப்பங்களை அமைக்க · வீடியோ பட்டியல் விருப்பங்களை மாற்ற[CR]வசன எழுத்துருக்களை அமைக்க" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]இசை அமைப்புகள் கட்டமைப்பு[/B][CR][CR]உங்கள் இசை நூலகம் நிர்வகிக்க · இசை பின்னணி விருப்பங்களை அமைக்க · இசை பட்டியல் விருப்பங்களை மாற்ற[CR]சமர்ப்பிப்பு பாடல் அமைப்பு · கரோக்கே விருப்பங்கள் அமைக்க" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]கணினி அமைப்புகள் கட்டமைப்பு[/B][CR][CR]காட்சிகளை அமைப்பது மற்றும் அளவீடு · ஆடியோ வெளியீடு கட்டமைக்க · ரிமோட் கண்ட்ரோல்கள் அமைப்பதற்கு[CR]மின் ஆற்றல் சேமிப்பு விருப்பங்கள் அமைக்க · பிழைத்திருத்தம் செயல்படுத்த · மாஸ்டர் பூட்டு அமைப்பு" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.tg_tj/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.tg_tj/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.tg_tj/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.tg_tj/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -144,6 +144,14 @@ msgid "Options" msgstr "Имконот" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Пахш кардани суруди мавзӯи телевизионӣ дар китобхонаи видеоӣ (Барномаи иловагии TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "Лирика" @@ -236,6 +244,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]ТАНЗИМОТИ ПАРАМЕТРҲОИ ВИДЕО[/B][CR][CR]Идоракунии китобхонаи видеоӣ • Имконоти пахши видео[CR]Тағйир додани имконоти рӯйхати видеоҳо • Танзимоти шрифтҳои зерунвон" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]ТАНЗИМОТИ ПАРАМЕТРҲОИ МУСИҚӢ[/B][CR][CR]Идоракунии китобхонаи мусиқӣ · Имконоти пахши мусиқӣ · Тағйир додани имконоти рӯйхати мусиқӣ[CR]Танзими иловакунии мусиқӣ · Танзими имконоти караоке" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]ТАНЗИМОТИ ПАРАМЕТРҲОИ СИСТЕМА[/B][CR][CR]Танзимот ва санҷиши дисплейҳо · Танзимоти барориши аудио · Танзимоти идоракунии дурдаст[CR]Танзимоти масрафи барқ · Танзимоти ислоҳи хатоҳо · Танзимоти қулфкунӣ" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.th_th/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.th_th/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.th_th/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.th_th/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: th_TH\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgctxt "#31000" -msgid "Change your" -msgstr "ปรับเปลี่ยน" - -msgctxt "#31003" -msgid "Power options" -msgstr "ตัวเลือกด้านพลังงาน" - msgctxt "#31004" msgid "Working..." msgstr "ทำงานอยู่..." -msgctxt "#31005" -msgid "Hide information" -msgstr "ซ่อนรายละเอียดข้อมูล" - msgctxt "#31006" msgid "View options" msgstr "ตัวเลือกการดู" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "เต็มจอ" -msgctxt "#31009" -msgid "Total duration" -msgstr "รวมระยะเวลา" - msgctxt "#31022" msgid "Music - Files" msgstr "แฟ้ม-เพลง" @@ -60,30 +44,14 @@ msgid "Items" msgstr "รายการ" -msgctxt "#31026" -msgid "Misc options" -msgstr "ตัวเลือกอื่นๆ" - msgctxt "#31027" msgid "Location" msgstr "ที่ตั้ง" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "ย่อโปสเตอร์" - msgctxt "#31029" msgid "Fanart" msgstr "แฟนอาร์ต" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "รูปย่อของภาพ" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "ย่อส่วนภาพ" - msgctxt "#31033" msgid "Info" msgstr "ข้อมูล" @@ -92,10 +60,6 @@ msgid "Actions" msgstr "การกระทำ" -msgctxt "#31040" -msgid "Now playing" -msgstr "ขณะนี้กำลังเล่น" - msgctxt "#31042" msgid "PLAYING" msgstr "กำลังเล่น" @@ -116,10 +80,6 @@ msgid "SEEKING" msgstr "ค้นหา" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "ชุดรูปแบบการแสดงแสงสี" - msgctxt "#31049" msgid "End time" msgstr "เวลาสิ้นสุด" @@ -156,10 +116,6 @@ msgid "This file is stacked, select the part you want to play from." msgstr "แฟ้มนี้ซ้อนกันอยู่เลือกส่วนที่คุณต้องการจะเล่นจาก" -msgctxt "#31061" -msgid "Current selected" -msgstr "ที่เลือกในปัจจุบัน" - msgctxt "#31101" msgid "Home screen options" msgstr "ตัวเลือก หน้าจอหลัก" @@ -168,26 +124,10 @@ msgid "Background" msgstr "พื้นหลัง" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "แสดง \"หยุดชั่วขณะ\" ในการนำเสนอภาพนิ่ง" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "เล่นตัวอย่างภาพยนตร์ในหน้าต่าง [COLOR=grey3](กล่องโต้ตอบข้อมูลวิดีโอเท่านั้น)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" msgstr "ตัวเลือก อื่นๆ" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "ซ่อนป้ายกำกับ ที่อ่านได้จากชื่อแฟ้มวิดีโอ [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "ซ่อนปุ่มเมนูหลัก" - msgctxt "#31109" msgid "Enable custom background" msgstr "เปิดใช้งานปรับแต่งพื้นหลัง" @@ -204,54 +144,18 @@ msgid "Options" msgstr "ตัวเลือก" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "แสดงอัลบัมที่เพิ่งเพิ่ม" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "แสดงวิดีโอที่เพิ่งเพิ่ม" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "หน้าหลัก เมนูย่อยโปรแกรม" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "ซ่อนพื้นหลังแฟนอาร์ต" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "แสดงพื้นหลังวิดีโอ \"ที่กำลังเล่น\"" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "แสดงพื้นหลังแสงสีประกอบเพลง \"ที่กำลังเล่น\"" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "เล่นเพลงธีมรายการทีวีในคลังข้อมูลวิดีโอ (ส่วนเสริม TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "เนื้อเพลง" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "ซ่อนแฟนอาร์ตในการแสดงแสงสีแบบเต็มจอ" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "ส่วนเสริมเนื้อเพลง" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "หน้าหลัก เมนูย่อย \"วิดีโอ\"" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "หน้าหลัก เมนูย่อย \"เพลง\"" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "หน้าหลัก เมนูย่อย \"รูปภาพ\"" - msgctxt "#31140" msgid "Music OSD" msgstr "OSD เพลง" @@ -268,90 +172,22 @@ msgid "Shortcuts" msgstr "ปุ่มลัด" -msgctxt "#31203" -msgid "Choose your song" -msgstr "เลือกเพลงของคุณ" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "แหล่งเนื้อเพลง" - msgctxt "#31206" msgid "Found" msgstr "ค้นพบ" -msgctxt "#31207" -msgid "Find more items" -msgstr "ค้นหารายการเพิ่มเติม" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "ตอนที่กำลังจะมา" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "อุณหภูมิปัจจุบัน" - -msgctxt "#31301" -msgid "Last updated" -msgstr "ปรับปรุงล่าสุด" - msgctxt "#31303" msgid "Data provider" msgstr "ผู้ให้บริการข้อมูล" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "ซ่อนแฟนอาร์ต" - -msgctxt "#31308" -msgid "Movie details" -msgstr "รายละเอียดภาพยนตร์" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "หน่วยความจำที่ใช้:" - -msgctxt "#31310" -msgid "Track number" -msgstr "หมายเลขแทรค" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" msgstr "รูปภาพแฟนอาร์ต[CR][CR]ไม่มี[CR][CR] คลิกปุ่มเพื่อตั้งค่า" -msgctxt "#31312" -msgid "Current scraper" -msgstr "ตัวดึงข้อมูลปัจจุบัน" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "เลือกตัวดึงข้อมูล" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "ตัวเลือกการสืบค้นเนื้อหา" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "กำหนดเส้นทางของแฟนอาร์ต" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "โปรไฟล์ที่เลือก" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "เข้าระบบล่าสุด" - msgctxt "#31322" msgid "Aired" msgstr "ออกอากาศ" -msgctxt "#31325" -msgid "Playlist options" -msgstr "ตัวเลือกของรายการเล่น" - msgctxt "#31326" msgid "Created" msgstr "สร้างเมื่อ" @@ -360,22 +196,10 @@ msgid "Resolution" msgstr "ความละเอียดจอ" -msgctxt "#31328" -msgid "Recently added" -msgstr "ที่เพิ่งเพิ่ม" - msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" msgstr "[B]ตั้งค่า ตัวจับเวลา![/B] [COLOR=grey2] - ระบบจะปิดอัตโนมัติ ใน[/COLOR]" -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "คลิกปุ่มเพื่อเล่น[CR][CR]ตัวอย่างภาพยนตร์" - -msgctxt "#31331" -msgid "Album details" -msgstr "รายละเอียดอัลบั้ม" - msgctxt "#31351" msgid "Pause" msgstr "หยุดชั่วขณะ" @@ -384,10 +208,6 @@ msgid "Stop" msgstr "หยุด" -msgctxt "#31353" -msgid "Fast forward" -msgstr "ไปหน้าแบบเร็ว" - msgctxt "#31354" msgid "Rewind" msgstr "ย้อนกลับเร็ว" @@ -396,10 +216,6 @@ msgid "Movie menu" msgstr "เมนู ภาพยนตร์" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "ดาวน์โหลดคำบรรยาย" - msgctxt "#31360" msgid "Watch as 2D" msgstr "ชมแบบ 2 มิติ" @@ -416,10 +232,6 @@ msgid "Skin default" msgstr "หน้าตาพื้นฐาน" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "ค่าเริ่มต้นของสกินโดยไม่ใช้ caps" - msgctxt "#31392" msgid "Arial based" msgstr "ใช้ฟ้อนท์ Arial" @@ -432,22 +244,14 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]ปรับเปลี่ยนการตั้งค่าวิดีโอ[/B][CR][CR]จัดการคลังข้อมูลวิดีโอของคุณ · ตั้งค่าตัวเลือกการเล่นวิดีโอ · เปลี่ยนตัวเลือกจัดเรียงรายการวิดีโอ[CR]ตั้งค่าแบบอักษรคำบรรยาย" -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]กำหนดการตั้งค่ารูปภาพ[/B][CR][CR]ตั้งค่าตัวเลือกจัดเรียงรายการรูปภาพ · กำหนดค่าแสดงภาพนิ่ง" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]กำหนดการตั้งค่าสภาพอากาศ[/B][CR][CR]กำหนดเมืองต่างๆ ในการเก็บรวบรวมข้อมูลสภาพอากาศ" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]ปรับเปลี่ยนการตั้งค่าเพลง[/B][CR][CR]จัดการคลังข้อมูลเพลงของคุณ · ตั้งค่าตัวเลือกการเล่นเพลง · เปลี่ยนตัวเลือกจัดเรียงรายการเพลง[CR]ตั้งค่าการส่งเพลง · ตั้งค่าตัวเลือกคาราโอเกะ" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]ปรับเปลี่ยนการตั้งค่าระบบ[/B][CR][CR]การติดตั้งและปรับเทียบการแสดงผล · กำหนดค่าการส่งออกสัญญาณเสียง · การติดตั้งรีโมทคอนโทรล[CR]ตั้งค่าตัวเลือกการประหยัดพลังงาน · เปิดใช้งานการแก้จุดบกพร่อง · ติดตั้ง กุญแจหลัก" -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]กำหนดค่าส่วนเสริม[/B][CR][CR]จัดการส่วนเสริมที่ติดตั้งไว้ของคุณ · เรียกดูและติดตั้งส่วนเสริมจาก kodi.tv[CR]ปรับแต่งการตั้งค่าส่วนเสริม" - msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" msgstr "[B] ตั้งค่าทีวี [/B][CR][CR]เปลี่ยนแปลงข้อมูลแบบเต็มหน้าจอ·จัดการการตั้งค่าข้อมูล EPG" @@ -456,14 +260,6 @@ msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" msgstr "[B]ปรับเปลี่ยนการตั้งค่าบริการ[/B][CR][CR]การตั้งค่าของ การควบคุม Kodi ผ่าน UPnP และ HTTP · กำหนดค่าใช้ไฟล์ร่วมกัน[CR]เปิดใช้ Zeroconf · กำหนดค่า AirPlay" -msgctxt "#31411" -msgid "First run help..." -msgstr "ช่วยเหลือในการเริ่มใช้งาน..." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "แท็บนี้มีเครื่องหมายที่แสดงว่า มีเมนูหลบอยู่ข้างของหน้าต่าง ซึ่งมีเมนูการปรับแต่งพิเศษสำหรับส่วนนี้ ในการเข้าถึงเมนูนี้, ให้เลื่อนลูกศรซ้ายด้วยรีโมทหรือคีย์บอร์ด หรือวางตัวชี้ของเมาท์เหนือแท็บ [CR][CR]กด \"ตกลง\" เพื่อปิดกล่องโต้ตอบนี้ ซึ่งจะไม่แสดงขึ้นมาอีก" - msgctxt "#31413" msgid "Local subtitle available" msgstr "พบคำบรรยายภายใน" @@ -472,10 +268,6 @@ msgid "Login" msgstr "ลงชื่อเข้าใช้" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "เลือกโปรไฟล์ผู้ใช้ Kodi ของคุณ[CR]เพื่อเข้าสู่ระบบและดำเนินการต่อไป" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "แสดงหรือซ่อน หน้าจอลงชื่อเข้าใช้เมื่อเริ่มต้น" @@ -484,66 +276,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "เลือกโปรไฟล์ที่จะใช้ในตอนเริ่มต้น เมื่อหน้าจอลงชื่อเข้าใช้ถูกปิดการใช้งาน" -msgctxt "#31501" -msgid "Scheduled time" -msgstr "เวลาที่กำหนด" - msgctxt "#31502" msgid "TV" msgstr "ทีวี" -msgctxt "#31503" -msgid "Add group" -msgstr "เพิ่มกลุ่ม" - -msgctxt "#31504" -msgid "Rename group" -msgstr "เปลี่ยนชื่อกลุ่ม" - -msgctxt "#31505" -msgid "Delete group" -msgstr "ลบกลุ่ม" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "กลุ่มทีมีอยู่" -msgctxt "#31509" -msgid "Channel group" -msgstr "กลุ่มช่องสัญญาณ" - -msgctxt "#31510" -msgid "Timer set" -msgstr "กำหนดตัวตั้งเวลา" - -msgctxt "#31511" -msgid "Channel options" -msgstr "ตัวเลือกของช่อง" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "พยากรณ์ใน 36 ชั่วโมง" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "พยากรณ์รายชั่วโมง" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "พยากรณ์สุดสัปดาห์" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "พยากรณ์ประจำวัน" - msgctxt "#31905" msgid "Forecast" msgstr "พยากรณ์" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "โอกาสเกิดฝน" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "กำลังเรียกข้อมูลการพยากรณ์ ..." diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.tr_tr/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.tr_tr/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.tr_tr/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.tr_tr/strings.po 2015-07-06 19:37:22.000000000 +0000 @@ -170,7 +170,7 @@ msgctxt "#31103" msgid "Show \"Paused\" in picture slideshow" -msgstr "Resim slayt gösterisinde \"Duraklatıldı\" mesajını göster" +msgstr "Resim slayt gösterisinde \"Duraklatıldı\"yı göster" msgctxt "#31104" msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" @@ -220,17 +220,21 @@ msgid "Hide background fanart" msgstr "Arka plan fanartını gizle" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "Eğer kanal penceresinde RDS varsa EPG'yi gizle" - msgctxt "#31124" msgid "Show background \"Now playing\" video" -msgstr "Arkaplanda oynatılan videoyu göster" +msgstr "\"Video oynatılıyorken\" arka planı göster" msgctxt "#31125" msgid "Show background \"Now playing\" visualisation" -msgstr "Arkaplanda görsel öğeyi göster" +msgstr "\"Görsel efektler oynatılıyorken\" arka planı göster" + +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "TV tema şarkılarını video kitaplığında çal (TvTunes eklentisi)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" @@ -294,7 +298,7 @@ msgctxt "#31300" msgid "Current temperature" -msgstr "Geçerli sıcaklık" +msgstr "Sıcaklık" msgctxt "#31301" msgid "Last updated" @@ -348,9 +352,13 @@ msgid "Last logged in" msgstr "Son giriş yapan" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "Karaoke şarkı seçici" + msgctxt "#31322" msgid "Aired" -msgstr "Yayınlanma" +msgstr "Gösterim" msgctxt "#31325" msgid "Playlist options" @@ -437,8 +445,8 @@ msgstr "[B]VİDEO AYARLARINI YAPILANDIR[/B][CR][CR]Video kitaplığını yönet · Video oynatma seçeneklerini ayarla · Video listeleme seçeneklerini değiştir[CR]Altyazı yazı tiplerini ayarla" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]MÜZİK AYARLARINI YAPILANDIR[/B][CR][CR]Müzik kitaplığını yönet · Müzik çalma seçeneklerini ayarla · Müzik listeleme seçeneklerini değiştir[CR]Şarkı sunumu ayarları" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]MÜZİK AYARLARINI YAPILANDIR[/B][CR][CR]Müzik kitaplığını yönet · Müzik çalma seçeneklerini ayarla · Müzik listeleme seçeneklerini değiştir · Şarkı sunumu ayarları · Karaoke seçeneklerini ayarla" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.uk_ua/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.uk_ua/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.uk_ua/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.uk_ua/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: uk_UA\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -msgctxt "#31000" -msgid "Change your" -msgstr "Змініть" - -msgctxt "#31003" -msgid "Power options" -msgstr "Налаштування живлення" - msgctxt "#31004" msgid "Working..." msgstr "Зачекайте…" -msgctxt "#31005" -msgid "Hide information" -msgstr "Без відомостей" - msgctxt "#31006" msgid "View options" msgstr "Налаштування перегляду" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "Повний екран" -msgctxt "#31009" -msgid "Total duration" -msgstr "Загальна тривалість" - msgctxt "#31022" msgid "Music - Files" msgstr "Музика - файли" @@ -60,30 +44,14 @@ msgid "Items" msgstr "у списку" -msgctxt "#31026" -msgid "Misc options" -msgstr "Інші параметри" - msgctxt "#31027" msgid "Location" msgstr "Розташування" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "Карусель постерів" - msgctxt "#31029" msgid "Fanart" msgstr "Фанарт" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "Мініатюри" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "Карусель картинок" - msgctxt "#31033" msgid "Info" msgstr "Інформація" @@ -92,10 +60,6 @@ msgid "Actions" msgstr "Дії" -msgctxt "#31040" -msgid "Now playing" -msgstr "Відтворюється" - msgctxt "#31042" msgid "PLAYING" msgstr "ВІДТВОРЕННЯ" @@ -116,13 +80,9 @@ msgid "SEEKING" msgstr "ПОШУК" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "Налаштування візуалізації" - msgctxt "#31049" msgid "End time" -msgstr "Кінець" +msgstr "Час кінця" msgctxt "#31050" msgid "Sort: Ascending" @@ -156,10 +116,6 @@ msgid "This file is stacked, select the part you want to play from." msgstr "Складений файл; виберіть частину для відтворення." -msgctxt "#31061" -msgid "Current selected" -msgstr "Поточне виділення" - msgctxt "#31101" msgid "Home screen options" msgstr "Налаштування головного екрану" @@ -168,33 +124,17 @@ msgid "Background" msgstr "Тло" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "Показувати \"Пауза\" в режими слайдшоу" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "Відтворювати трейлери у вікні [COLOR=grey3](лише для вікна відомостей)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" msgstr "Різні параметри" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "Приховати маркування, отримані з імен файлів [COLOR = grey3] (наприклад, Blu-Ray, HD-DVD) [/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "Приховати кнопки головного меню" - msgctxt "#31109" msgid "Enable custom background" msgstr "Дозволити вибір фонових зображень" msgctxt "#31110" msgid "Background path:" -msgstr "Шлях до зображення:" +msgstr "Шлях до тла:" msgctxt "#31111" msgid "Hide" @@ -204,54 +144,18 @@ msgid "Options" msgstr "Параметри" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "Показати останні додані альбоми" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "Показати останні додані альбоми" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "Субменю сторінки програм" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "Приховати фоновий фанарт" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "Показувати на відео \"Відтворюється\"" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "Показувати на візуалізації \"Відтворюється\"" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Грати мелодію серіалу в медіатеці (надбудова TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "Тексти" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "Приховати фанарт в режимі візуалізації на весь екран" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "Надбудова \"Тексти\"" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "Субменю сторінки \"Відео\"" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "Субменю сторінки \"Музика\"" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "Субменю сторінки \"Фото\"" - msgctxt "#31140" msgid "Music OSD" msgstr "OSD музики" @@ -268,113 +172,33 @@ msgid "Shortcuts" msgstr "Ярлики" -msgctxt "#31203" -msgid "Choose your song" -msgstr "Виберіть пісню" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "Джерело текстів пісень" - msgctxt "#31206" msgid "Found" msgstr "Знайдено" -msgctxt "#31207" -msgid "Find more items" -msgstr "Більше об'єктів" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "Наступні серії" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "Поточна температура" - -msgctxt "#31301" -msgid "Last updated" -msgstr "Останнє оновлення" - msgctxt "#31303" msgid "Data provider" msgstr "Джерело даних" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "Приховати фанарт" - -msgctxt "#31308" -msgid "Movie details" -msgstr "Відомості про фільм" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "Використано пам'яті" - -msgctxt "#31310" -msgid "Track number" -msgstr "Номер треку" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" msgstr "Фанарт[CR][CR]недоступний,[CR][CR]натисніть кнопку, щоб вибрати" -msgctxt "#31312" -msgid "Current scraper" -msgstr "Поточний інфоресурс" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "Вибрати інфоресурс" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "Параметри сканування вмісту" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "Вибрати розташування фанарту" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "Обраний профіль" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "Останній вхід" - msgctxt "#31322" msgid "Aired" msgstr "Прем'єра" -msgctxt "#31325" -msgid "Playlist options" -msgstr "Параметри списку відтворення" - msgctxt "#31326" msgid "Created" -msgstr "Створено" +msgstr "Створений" msgctxt "#31327" msgid "Resolution" -msgstr "Роздільна здатність" - -msgctxt "#31328" -msgid "Recently added" -msgstr "Додано останніми" +msgstr "Розмір" msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" -msgstr "[B]Встановлено таймер![/B] [COLOR=grey2] - Автоматичне вимкнення через[/COLOR]" - -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "Натисніть кнопку,[CR][CR]щоб переглянути кино-трейлер" - -msgctxt "#31331" -msgid "Album details" -msgstr "Відомості про альбом" +msgstr "[B]Встановлено таймер![/B] [COLOR=grey2] - Автоматичне відключення через[/COLOR]" msgctxt "#31351" msgid "Pause" @@ -384,10 +208,6 @@ msgid "Stop" msgstr "Стоп" -msgctxt "#31353" -msgid "Fast forward" -msgstr "Перемотка вперед" - msgctxt "#31354" msgid "Rewind" msgstr "Перемотка назад" @@ -396,10 +216,6 @@ msgid "Movie menu" msgstr "Меню фільму" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "Завантажити субтитри" - msgctxt "#31360" msgid "Watch as 2D" msgstr "Переглядати як 2D" @@ -410,16 +226,12 @@ msgctxt "#31362" msgid "Enabled" -msgstr "Увімкнено" +msgstr "Увімкн." msgctxt "#31390" msgid "Skin default" msgstr "Стандартні" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "Стандартні без ВЕЛИКИХ" - msgctxt "#31392" msgid "Arial based" msgstr "Стиль Arial" @@ -432,22 +244,14 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]НАЛАШТУВАННЯ ПАРАМЕТРІВ ВІДЕО[/B][CR][CR]Керування медіатекою відео • Параметри відтворення відео[CR]Налаштування списку відео • Налаштування шрифту субтитрів" -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]НАЛАШТУВАННЯ ПАРАМЕТРІВ ФОТО[/ B] [CR] [CR]Параметри списку зображень - Параметри слайдшоу" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]НАЛАШТУВАННЯ ПАРАМЕТРІВ ПОГОДИ[/ B] [CR] [CR]Встановлення різних міст для збору інформації про погоду" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]НАЛАШТУВАННЯ ПАРАМЕТРІВ МУЗИКИ[/B][CR][CR]Керування медиатекою аудіо • Параметри відтворення аудіо[CR]Налаштування списку аудіо • Налаштування додавання пісень[CR]Налаштування караоке" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]НАЛАШТУВАННЯ ПАРАМЕТРІВ СИСТЕМИ[/B][CR][CR]Налаштування та калібрування дисплеїв • Налаштування виведення аудіо[CR]Налаштування дистанційного керування • Налаштування параметрів енергозбереження[CR]Увімкнення налагодження • Налаштування блокування" -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]НАЛАШТУВАННЯ НАДБУДОВ[/B][CR][CR]Керування встановленими надбудовами • Встановлення надбудов з kodi.tv[CR]Зміна налаштувань надбудов" - msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" msgstr "[B]НАЛАШТУВАННЯ ТБ[/B][CR][CR]Параметри повноекранної інформації · Налаштування показу телепрограми (EPG)" @@ -456,14 +260,6 @@ msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" msgstr "[B]НАЛАШТУВАННЯ ПАРАМЕТРІВ СЛУЖБ[/B][CR][CR]Налаштування керування Kodi за UPnP і HTTP • Налаштування доступу до файлів[CR]Увімкнення Zeroconf • Налаштування AirPlay" -msgctxt "#31411" -msgid "First run help..." -msgstr "Допомога під час першого запуску." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "Вкладка вказує на нявність бічного меню з додатковими налаштуваннями розділу. Відкрийте меню ліворуч з допомогою пульта ДК чи клавіатури, або наведіть курсор миші на вкладку. [CR][CR]Натисніть ОК, щоб закрити цей діалог. Він більше не з'явиться." - msgctxt "#31413" msgid "Local subtitle available" msgstr "Доступні локальні субтитри" @@ -472,10 +268,6 @@ msgid "Login" msgstr "Вхід" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "Виберіть профіль користувача Kodi,[CR]щоб увійти до системи" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "Показати або приховати екран входу при запуску." @@ -484,66 +276,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "Вибрати профіль, що буде використовуватися при запуску, коли екран входу вимкнено." -msgctxt "#31501" -msgid "Scheduled time" -msgstr "Запланований час" - msgctxt "#31502" msgid "TV" msgstr "ТБ" -msgctxt "#31503" -msgid "Add group" -msgstr "Додати групу" - -msgctxt "#31504" -msgid "Rename group" -msgstr "Перейменувати групу" - -msgctxt "#31505" -msgid "Delete group" -msgstr "Видалити групу" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "Доступні[CR]групи" -msgctxt "#31509" -msgid "Channel group" -msgstr "Група каналів" - -msgctxt "#31510" -msgid "Timer set" -msgstr "Таймер встановлено" - -msgctxt "#31511" -msgid "Channel options" -msgstr "Параметри канала" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "Прогноз на 36 годин" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "Щогодинний прогноз" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "Прогноз на вихідні" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "Щоденний прогноз" - msgctxt "#31905" msgid "Forecast" msgstr "Прогноз" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "Можливі опади" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "Отримання прогнозу…" @@ -586,7 +330,7 @@ msgctxt "#31958" msgid "PLAY DISC" -msgstr "ВІДТВОРЕННЯ" +msgstr "ГРАТИ ДИСК" msgctxt "#31959" msgid "SYSTEM" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.vi_vn/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.vi_vn/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.vi_vn/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.vi_vn/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -140,6 +140,14 @@ msgid "Options" msgstr "Tùy chọn" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "Phát các bài hát từ TV trong hệ thống thư viện video (add-on TvTunes)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TV Turner" + msgctxt "#31128" msgid "Lyrics" msgstr "Lời Bài Hát" @@ -232,6 +240,10 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts" msgstr "[B]TUỲ CHỈNH CÀI ĐẶT VIDEO[/B][CR][CR]Quản lý thư viện video · Đặt chế độ xem video · Thay đổi cách liệt kê video[CR]Đặt font phụ đề" +msgctxt "#31402" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]TUỲ CHỈNH CÀI ĐẶT NHẠC[/B][CR][CR]Quản lý thư viện nhạc · Đặt chế độ nghe nhạc · Thay đổi cách liệt kê nhạc[CR]Cài đặt gửi và lấy thông tin nhạc · Đặt chế độ karaoke" + msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]TUỲ CHỈNH CÀI ĐẶT HỆ THỐNG[/B][CR][CR]Cài đặt và điều chỉnh màn hình · Chỉnh đầu ra audio · Cài đặt điều khiển từ xa[CR]Đặt chế độ tiết kiệm năng lượng · Bật chế độ tìm sửa lỗi · Đặt khoá chủ" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.zh_cn/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.zh_cn/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.zh_cn/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.zh_cn/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -220,10 +220,6 @@ msgid "Hide background fanart" msgstr "隐藏同人画背景" -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "频道窗口使用 RDS 时隐藏电子节目单" - msgctxt "#31124" msgid "Show background \"Now playing\" video" msgstr "在背景显示“正在播放”视频" @@ -232,6 +228,14 @@ msgid "Show background \"Now playing\" visualisation" msgstr "在背景显示“正在播放”可视化效果" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "视频资料库模式播放电视主题曲(TvTunes 插件)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" + msgctxt "#31128" msgid "Lyrics" msgstr "歌词" @@ -348,6 +352,10 @@ msgid "Last logged in" msgstr "最近登录" +msgctxt "#31321" +msgid "Karaoke song selector" +msgstr "卡拉OK歌曲选择器" + msgctxt "#31322" msgid "Aired" msgstr "首播" @@ -437,8 +445,8 @@ msgstr "[B]设置视频选项[/B][CR][CR]管理视频资料库 · 设置视频播放选项 · 修改视频列表选项 · 设置字幕字体" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]设置音乐选项[/B][CR][CR]管理音乐资料库 · 设置音乐播放选项 · 修改音乐列表选项 · 设置歌曲提交" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]设置音乐选项[/B][CR][CR]管理音乐资料库 · 设置音乐播放选项 · 修改音乐列表选项 · 设置歌曲提交 · 设置卡拉OK选项" msgctxt "#31403" msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.zh_tw/strings.po kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.zh_tw/strings.po --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/language/resource.language.zh_tw/strings.po 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/language/resource.language.zh_tw/strings.po 2015-06-14 19:32:48.000000000 +0000 @@ -16,22 +16,10 @@ "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgctxt "#31000" -msgid "Change your" -msgstr "修改你的" - -msgctxt "#31003" -msgid "Power options" -msgstr "電源選項" - msgctxt "#31004" msgid "Working..." msgstr "處理中..." -msgctxt "#31005" -msgid "Hide information" -msgstr "隱藏資訊" - msgctxt "#31006" msgid "View options" msgstr "瀏覽設定" @@ -40,10 +28,6 @@ msgid "Full screen" msgstr "全螢幕" -msgctxt "#31009" -msgid "Total duration" -msgstr "總計時間" - msgctxt "#31022" msgid "Music - Files" msgstr "音樂 - 檔案" @@ -60,30 +44,14 @@ msgid "Items" msgstr "個項目" -msgctxt "#31026" -msgid "Misc options" -msgstr "其他選項" - msgctxt "#31027" msgid "Location" msgstr "位置" -msgctxt "#31028" -msgid "Poster wrap" -msgstr "海報捲動" - msgctxt "#31029" msgid "Fanart" msgstr "Fanart" -msgctxt "#31031" -msgid "Pic thumbs" -msgstr "圖片縮圖" - -msgctxt "#31032" -msgid "Image wrap" -msgstr "圖片捲動" - msgctxt "#31033" msgid "Info" msgstr "資訊" @@ -92,13 +60,9 @@ msgid "Actions" msgstr "動作" -msgctxt "#31040" -msgid "Now playing" -msgstr "現正播放" - msgctxt "#31042" msgid "PLAYING" -msgstr "播放中" +msgstr "正在播放" msgctxt "#31043" msgid "PAUSED" @@ -116,10 +80,6 @@ msgid "SEEKING" msgstr "查找" -msgctxt "#31048" -msgid "Visualisation presets" -msgstr "視覺效果預設值" - msgctxt "#31049" msgid "End time" msgstr "結束時間" @@ -156,10 +116,6 @@ msgid "This file is stacked, select the part you want to play from." msgstr "這個檔案已堆疊,請選擇您要從哪個部分開始播放。" -msgctxt "#31061" -msgid "Current selected" -msgstr "目前所選" - msgctxt "#31101" msgid "Home screen options" msgstr "首頁介面選項" @@ -168,26 +124,10 @@ msgid "Background" msgstr "背景" -msgctxt "#31103" -msgid "Show \"Paused\" in picture slideshow" -msgstr "在圖片幻燈片秀中顯示\"已暫停\"狀態" - -msgctxt "#31104" -msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]" -msgstr "在視窗中播放預告片[COLOR=grey3](只在影片資訊對話框中)[/COLOR]" - msgctxt "#31106" msgid "Miscellaneous options" msgstr "其他選項" -msgctxt "#31107" -msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]" -msgstr "隱藏影片檔案名稱的媒體標示 [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]" - -msgctxt "#31108" -msgid "Hide main menu buttons" -msgstr "隱藏主選單按鈕" - msgctxt "#31109" msgid "Enable custom background" msgstr "啟用 自訂背景" @@ -204,58 +144,18 @@ msgid "Options" msgstr "選項" -msgctxt "#31116" -msgid "Show recently added albums" -msgstr "顯示最近加入的專輯" - -msgctxt "#31117" -msgid "Show recently added videos" -msgstr "顯示最近加入的影片" - -msgctxt "#31118" -msgid "Home page programs submenu" -msgstr "首頁程式子選單" - -msgctxt "#31119" -msgid "Hide background fanart" -msgstr "隱藏背景 Fanart" - -msgctxt "#31122" -msgid "Hide EPG if RDS is present on channel window" -msgstr "如果該頻道畫面中有自帶RDS訊息,則不顯示電子節目表" - -msgctxt "#31124" -msgid "Show background \"Now playing\" video" -msgstr "在背景顯示正在播放的影片" - -msgctxt "#31125" -msgid "Show background \"Now playing\" visualisation" -msgstr "在背景顯示正在播放的視覺效果" +msgctxt "#31126" +msgid "Play TV theme songs in video library (TvTunes add-on)" +msgstr "在影片資料庫中播放電視主題曲(TvTunes 附加元件)" + +msgctxt "#31127" +msgid "TvTunes" +msgstr "TvTunes" msgctxt "#31128" msgid "Lyrics" msgstr "歌詞" -msgctxt "#31129" -msgid "Hide fanart in full screen visualisation" -msgstr "在全螢幕視覺效果中隱藏 Fanart" - -msgctxt "#31132" -msgid "Lyrics add-on" -msgstr "歌詞附加元件" - -msgctxt "#31134" -msgid "Home page \"Videos\" submenu" -msgstr "首頁影片子選單" - -msgctxt "#31135" -msgid "Home page \"Music\" submenu" -msgstr "首頁音樂子選單" - -msgctxt "#31136" -msgid "Home page \"Pictures\" submenu" -msgstr "首頁圖片子選單" - msgctxt "#31140" msgid "Music OSD" msgstr "音樂播放工具列" @@ -272,90 +172,22 @@ msgid "Shortcuts" msgstr "捷徑" -msgctxt "#31203" -msgid "Choose your song" -msgstr "選擇你的歌曲" - -msgctxt "#31205" -msgid "Lyrics source" -msgstr "歌詞來源" - msgctxt "#31206" msgid "Found" msgstr "已找到" -msgctxt "#31207" -msgid "Find more items" -msgstr "尋找更多項目" - -msgctxt "#31208" -msgid "Upcoming episodes" -msgstr "劇集預告" - -msgctxt "#31300" -msgid "Current temperature" -msgstr "現在溫度" - -msgctxt "#31301" -msgid "Last updated" -msgstr "最後更新" - msgctxt "#31303" msgid "Data provider" msgstr "資料提供者" -msgctxt "#31307" -msgid "Hide fanart" -msgstr "隱藏 Fanart" - -msgctxt "#31308" -msgid "Movie details" -msgstr "電影詳細資訊" - -msgctxt "#31309" -msgid "Memory used:" -msgstr "已使用記憶體:" - -msgctxt "#31310" -msgid "Track number" -msgstr "音軌編號" - msgctxt "#31311" msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set" msgstr "無法取得[CR][CR]Fanart 圖片[CR][CR] 請點擊按鈕來設定" -msgctxt "#31312" -msgid "Current scraper" -msgstr "目前的站台" - -msgctxt "#31313" -msgid "Choose a scraper" -msgstr "選擇一個站台" - -msgctxt "#31314" -msgid "Content scanning options" -msgstr "內容掃描選項" - -msgctxt "#31317" -msgid "Set fanart path" -msgstr "設定 Fanart 路徑" - -msgctxt "#31319" -msgid "Selected profile" -msgstr "選擇的設定檔" - -msgctxt "#31320" -msgid "Last logged in" -msgstr "上次登入在" - msgctxt "#31322" msgid "Aired" msgstr "首播" -msgctxt "#31325" -msgid "Playlist options" -msgstr "播放清單選項" - msgctxt "#31326" msgid "Created" msgstr "已建立" @@ -364,22 +196,10 @@ msgid "Resolution" msgstr "解析度" -msgctxt "#31328" -msgid "Recently added" -msgstr "最近加入的" - msgctxt "#31329" msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]" msgstr "[B]計時器啟動![/B] [COLOR=grey2] - 系統將自動關機於:[/COLOR]" -msgctxt "#31330" -msgid "Click button to play[CR][CR]movie trailer" -msgstr "點擊按鈕播放[CR][CR]電影預告片" - -msgctxt "#31331" -msgid "Album details" -msgstr "專輯詳細資訊" - msgctxt "#31351" msgid "Pause" msgstr "暫停" @@ -388,10 +208,6 @@ msgid "Stop" msgstr "停止" -msgctxt "#31353" -msgid "Fast forward" -msgstr "快轉" - msgctxt "#31354" msgid "Rewind" msgstr "倒轉" @@ -400,10 +216,6 @@ msgid "Movie menu" msgstr "電影選單" -msgctxt "#31356" -msgid "Download subtitles" -msgstr "下載字幕" - msgctxt "#31360" msgid "Watch as 2D" msgstr "以 2D 模式觀賞" @@ -420,10 +232,6 @@ msgid "Skin default" msgstr "主題預設" -msgctxt "#31391" -msgid "Skin default with no caps" -msgstr "佈景主題預設(沒有開頭大寫)" - msgctxt "#31392" msgid "Arial based" msgstr "基於 Arial" @@ -437,25 +245,13 @@ msgstr "[B]配置視訊設定[/B][CR][CR]管理你的音樂資料庫 · 設定影片播放選項 · 修改影片清單選項[CR]設定字幕字型" msgctxt "#31402" -msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission" -msgstr "[B]配置設定[/B][CR][CR]管理你的音樂資料庫 · 設定音樂播放選項 · 修改音樂清單選項[CR]設定歌曲提交" - -msgctxt "#31403" -msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow" -msgstr "[B]配置圖片設定[/B][CR][CR]設定圖片清單選項 · 設定幻燈片秀" - -msgctxt "#31404" -msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information" -msgstr "[B]配置天氣設定[/B][CR][CR]設定幾個要收集天氣資料的城市" +msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options" +msgstr "[B]配置音樂設定[/B][CR][CR]管理你的音樂資料庫 · 設定音樂播放選項 · 修改音樂清單選項[CR]設定歌曲提交 · 設定卡拉OK選項" msgctxt "#31406" msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock" msgstr "[B]配置系統設定[/B][CR][CR]設定和校正顯示輸出 · 設定音效輸出 · 設定遙控器[CR]設定節能選項 · 啟用除錯 · 設定鎖定密碼" -msgctxt "#31408" -msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings" -msgstr "[B]配置附加元件[/B][CR][CR]管理已安裝的附加元件 · 從 kodi.tv 瀏覽並安裝附加元件[CR]修改附加元件設定" - msgctxt "#31409" msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings" msgstr "[B]電視設定[/B][CR][CR]修改全螢幕資訊 · 管理電子節目表資料設定" @@ -464,14 +260,6 @@ msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay" msgstr "[B]配置服務設定[/B][CR][CR]設定透過 UPnP 和 HTTP 控製 Kodi · 配置檔案分享[CR]啟用 Zeroconf · 配置 AirPlay" -msgctxt "#31411" -msgid "First run help..." -msgstr "第一次使用說明..." - -msgctxt "#31412" -msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again." -msgstr "這個標籤表示這個部分在視窗的側邊有提供額外選項的選單。你可以使用遙控器或鍵盤的左鍵或者是將滑鼠指標移動到這個標籤的範圍來存取這個選單。[CR][CR]按一下\"Ok\" 可以關閉這個對話框。它不會再出現。" - msgctxt "#31413" msgid "Local subtitle available" msgstr "有本地語言的字幕可選用" @@ -480,10 +268,6 @@ msgid "Login" msgstr "登入" -msgctxt "#31421" -msgid "Select your Kodi user profile[CR]to login and continue" -msgstr "選擇您的 Kodi 使用者設定檔[CR]登入並繼續" - msgctxt "#31422" msgid "Show or hide the login screen at startup." msgstr "啟動時顯示或隱藏登入畫面" @@ -492,66 +276,18 @@ msgid "Select the profile that will be used at startup when the login screen is disabled." msgstr "選擇登入畫面停用是要使用的設定檔。" -msgctxt "#31501" -msgid "Scheduled time" -msgstr "已排程的時間" - msgctxt "#31502" msgid "TV" msgstr "電視" -msgctxt "#31503" -msgid "Add group" -msgstr "新增群組" - -msgctxt "#31504" -msgid "Rename group" -msgstr "重新命名群組" - -msgctxt "#31505" -msgid "Delete group" -msgstr "刪除群組" - msgctxt "#31506" msgid "Available[CR]Groups" msgstr "可用的[CR]群組" -msgctxt "#31509" -msgid "Channel group" -msgstr "頻道群組" - -msgctxt "#31510" -msgid "Timer set" -msgstr "計時器設定" - -msgctxt "#31511" -msgid "Channel options" -msgstr "頻道選項" - -msgctxt "#31901" -msgid "36-hour forecast" -msgstr "36小時預報" - -msgctxt "#31902" -msgid "Hourly forecast" -msgstr "每小時預報" - -msgctxt "#31903" -msgid "Weekend forecast" -msgstr "一週預報" - -msgctxt "#31904" -msgid "Daily forecast" -msgstr "每日氣象預測" - msgctxt "#31905" msgid "Forecast" msgstr "預報" -msgctxt "#31908" -msgid "Chance of precipitation" -msgstr "降雨機率" - msgctxt "#31909" msgid "Fetching forecast info..." msgstr "正在擷取預報資訊..." Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/arrow-big-left.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/arrow-big-left.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/arrow-big-right.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/arrow-big-right.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/black-back2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/black-back2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/black-back.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/black-back.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/busy.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/busy.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/button-focus2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/button-focus2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/button-focus3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/button-focus3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/button-focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/button-focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/button-nofocus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/button-nofocus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/CalibrateBottomRight.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/CalibrateBottomRight.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/CalibratePixelRatio.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/CalibratePixelRatio.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/CalibrateSubtitles.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/CalibrateSubtitles.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/CalibrateTopLeft.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/CalibrateTopLeft.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/CenterRating/rating0.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/CenterRating/rating0.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/CenterRating/rating1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/CenterRating/rating1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/CenterRating/rating2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/CenterRating/rating2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/CenterRating/rating3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/CenterRating/rating3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/CenterRating/rating4.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/CenterRating/rating4.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/CenterRating/rating5.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/CenterRating/rating5.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/Confluence_Logo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/Confluence_Logo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ContentPanelMirror.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ContentPanelMirror.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ContentPanel.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ContentPanel.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultActor.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultActor.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonAlbumInfo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonAlbumInfo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonArtistInfo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonArtistInfo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonAudioDecoder.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonAudioDecoder.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonAudioDSP.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonAudioDSP.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonAudioEncoder.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonAudioEncoder.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonContextItem.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonContextItem.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonHelper.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonHelper.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonImages.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonImages.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonInfoProvider.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonInfoProvider.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonLanguage.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonLanguage.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonLibrary.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonLibrary.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonLyrics.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonLyrics.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonMovieInfo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonMovieInfo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonMusic.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonMusic.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonMusicVideoInfo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonMusicVideoInfo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonNone.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonNone.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonPicture.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonPicture.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddon.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonProgram.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonProgram.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonPVRClient.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonPVRClient.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonRepository.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonRepository.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonScreensaver.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonScreensaver.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonService.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonService.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonSkin.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonSkin.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonSubtitles.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonSubtitles.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonTvInfo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonTvInfo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonUISounds.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonUISounds.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonVideo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonVideo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonVisualization.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonVisualization.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonWeather.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonWeather.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddonWebSkin.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddonWebSkin.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAddSource.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAddSource.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAlbumCover.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAlbumCover.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultArtist.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultArtist.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAudioDSP.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAudioDSP.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultAudio.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultAudio.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultCDDA.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultCDDA.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultDVDEmpty.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultDVDEmpty.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/defaultDVDFull.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/defaultDVDFull.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultDVDFull.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultDVDFull.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultDVDRom.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultDVDRom.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultFile.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultFile.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultFolderBack.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultFolderBack.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultFolder.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultFolder.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultHardDisk.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultHardDisk.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultIconError.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultIconError.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultIconInfo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultIconInfo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultIconWarning.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultIconWarning.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultInProgressShows.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultInProgressShows.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMovies.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMovies.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicAlbums.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicAlbums.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicArtists.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicArtists.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicCompilations.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicCompilations.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicGenres.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicGenres.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicPlaylists.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicPlaylists.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicPlugins.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicPlugins.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicRecentlyAdded.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicRecentlyAdded.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicRecentlyPlayed.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicRecentlyPlayed.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicSongs.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicSongs.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicTop100.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicTop100.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicVideos.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicVideos.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultMusicYears.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultMusicYears.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultNetwork.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultNetwork.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultPicture.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultPicture.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultPlaylist.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultPlaylist.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultProgram.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultProgram.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultRecentlyAddedEpisodes.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultRecentlyAddedEpisodes.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultRecentlyAddedMovies.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultRecentlyAddedMovies.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultRecentlyAddedMusicVideos.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultRecentlyAddedMusicVideos.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultRemovableDisk.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultRemovableDisk.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultTVShows.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultTVShows.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultVCD.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultVCD.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultVideoCover.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultVideoCover.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultVideoDeleted.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultVideoDeleted.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultVideoPlaylists.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultVideoPlaylists.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultVideoPlugins.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultVideoPlugins.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DefaultVideo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DefaultVideo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DialogBack2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DialogBack2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DialogBack.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DialogBack.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DialogCloseButton-focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DialogCloseButton-focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DialogCloseButton.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DialogCloseButton.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DialogContextBottom.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DialogContextBottom.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DialogContextMiddle.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DialogContextMiddle.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/DialogContextTop.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/DialogContextTop.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/dialogheader.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/dialogheader.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/diffuse_mirror2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/diffuse_mirror2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/diffuse_mirror3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/diffuse_mirror3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/0.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/0.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/112.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/112.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/128.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/128.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/144.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/144.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/160.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/160.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/16.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/16.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/176.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/176.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/192.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/192.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/208.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/208.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/224.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/224.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/240.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/240.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/256.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/256.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/32.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/32.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/48.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/48.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/64.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/64.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/80.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/80.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/epg-genres/96.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/epg-genres/96.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/Fanart_Diffuse.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/Fanart_Diffuse.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/aspectratio/1.33.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/aspectratio/1.33.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/aspectratio/1.37.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/aspectratio/1.37.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/aspectratio/1.66.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/aspectratio/1.66.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/aspectratio/1.78.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/aspectratio/1.78.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/aspectratio/1.85.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/aspectratio/1.85.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/aspectratio/2.20.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/aspectratio/2.20.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/aspectratio/2.35.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/aspectratio/2.35.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/aspectratio/2.40.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/aspectratio/2.40.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/aspectratio/2.55.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/aspectratio/2.55.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/aspectratio/2.76.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/aspectratio/2.76.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/0.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/0.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/10.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/10.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/4.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/4.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/5.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/5.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/6.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/6.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/7.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/7.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/8.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/8.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/aac.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/aac.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/ac3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/ac3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/aifc.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/aifc.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/aiff.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/aiff.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/aif.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/aif.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/alac.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/alac.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/ape.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/ape.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/avc.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/avc.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/cdda.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/cdda.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/dca.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/dca.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/dtshd_hra.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/dtshd_hra.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/dtshd_ma.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/dtshd_ma.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/dts.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/dts.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/eac3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/eac3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/flac.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/flac.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/mp1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/mp1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/mp2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/mp2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/mp3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/mp3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/ogg.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/ogg.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/opus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/opus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/pcm_bluray.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/pcm_bluray.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/pcm.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/pcm.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/pcm_s16le.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/pcm_s16le.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/pcm_s24le.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/pcm_s24le.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/truehd.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/truehd.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/vorbis.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/vorbis.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/wavpack.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/wavpack.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/wav.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/wav.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/wma.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/wma.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/wmapro.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/wmapro.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/audio/wmav2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/audio/wmav2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/AudioLang.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/AudioLang.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/blank.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/blank.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/lists/1080.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/lists/1080.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/lists/3D.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/lists/3D.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/lists/480.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/lists/480.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/lists/4K.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/lists/4K.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/lists/540.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/lists/540.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/lists/576.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/lists/576.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/lists/720.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/lists/720.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/ratings/mpaa_general.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/ratings/mpaa_general.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/ratings/mpaa_nc17.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/ratings/mpaa_nc17.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/ratings/mpaa_notrated.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/ratings/mpaa_notrated.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/ratings/mpaa_pg13.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/ratings/mpaa_pg13.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/ratings/mpaa_pg.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/ratings/mpaa_pg.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/ratings/mpaa_restricted.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/ratings/mpaa_restricted.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/rds/rds-logo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/rds/rds-logo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/rds/rds-radiotext-logo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/rds/rds-radiotext-logo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/rds/rds-radiotext-plus-logo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/rds/rds-radiotext-plus-logo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/SubLang.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/SubLang.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/1080.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/1080.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/3D.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/3D.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/480.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/480.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/4K.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/4K.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/540.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/540.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/576.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/576.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/720.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/720.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/avc1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/avc1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/bluray.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/bluray.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/divx.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/divx.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/dvd.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/dvd.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/flv.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/flv.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/h264.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/h264.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/hddvd.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/hddvd.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/hdmv.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/hdmv.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/hevc.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/hevc.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/mpeg1video.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/mpeg1video.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/mpeg2video.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/mpeg2video.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/Set.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/Set.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/tv.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/tv.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/vc-1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/vc-1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/vhs.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/vhs.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/vp8.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/vp8.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/vp9.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/vp9.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/wvc1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/wvc1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/flagging/video/xvid.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/flagging/video/xvid.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/floor_buttonFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/floor_buttonFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/floor_button.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/floor_button.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/floor.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/floor.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/folder-focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/folder-focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/GlassOverlay.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/GlassOverlay.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/GoFullscreen.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/GoFullscreen.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/gradient.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/gradient.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/HasSub.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/HasSub.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/hint-overlay.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/hint-overlay.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/HomeBack.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/HomeBack.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/HomeBladeSub.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/HomeBladeSub.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/HomeNowPlayingBack.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/HomeNowPlayingBack.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/HomeOverlay1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/HomeOverlay1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/HomeSeperator.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/HomeSeperator.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/HomeSubEnd.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/HomeSubEnd.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/HomeSubFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/HomeSubFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/HomeSubNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/HomeSubNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_addons.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_addons.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_back.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_back.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_events.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_events.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_favourites.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_favourites.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_home.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_home.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_music.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_music.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon-mute.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon-mute.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_pictures.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_pictures.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_player.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_player.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_power.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_power.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon-rss.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon-rss.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_search.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_search.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_system.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_system.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_video.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_video.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/icon_weather.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/icon_weather.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/InfoMessagePanel.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/InfoMessagePanel.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/KeyboardBackKey.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/KeyboardBackKey.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/KeyboardCornerBottomNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/KeyboardCornerBottomNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/KeyboardCornerBottom.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/KeyboardCornerBottom.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/KeyboardCornerTopNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/KeyboardCornerTopNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/KeyboardCornerTop.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/KeyboardCornerTop.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/KeyboardDoneKey.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/KeyboardDoneKey.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/KeyboardEditArea.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/KeyboardEditArea.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/KeyboardKeyNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/KeyboardKeyNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/KeyboardKey.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/KeyboardKey.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/kodi-logo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/kodi-logo.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/LeftRating/rating0.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/LeftRating/rating0.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/LeftRating/rating1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/LeftRating/rating1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/LeftRating/rating2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/LeftRating/rating2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/LeftRating/rating3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/LeftRating/rating3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/LeftRating/rating4.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/LeftRating/rating4.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/LeftRating/rating5.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/LeftRating/rating5.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/Makefile.in kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/Makefile.in --- kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/Makefile.in 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/Makefile.in 2015-04-04 00:00:12.000000000 +0000 @@ -10,9 +10,9 @@ $(TARGET): $(IMAGES) ifeq (@ARCH@,arm) - @TEXTUREPACKER@ -dupecheck -use_none -input . -output $(TARGET) + @TEXTUREPACKER@ -use_none -input . -output $(TARGET) else - @TEXTUREPACKER@ -dupecheck -input . -output $(TARGET) + @TEXTUREPACKER@ -input . -output $(TARGET) endif Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/MediaBladeSub.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/MediaBladeSub.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/MediaItemDetailBG.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/MediaItemDetailBG.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/MenuItemFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/MenuItemFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/MenuItemNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/MenuItemNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSD16x.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSD16x.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSD2x.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSD2x.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSD32x.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSD32x.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSD4x.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSD4x.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSD8x.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSD8x.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDAudioFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDAudioFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDAudioNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDAudioNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDBookmarksFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDBookmarksFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDBookmarksNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDBookmarksNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDChannelDownFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDChannelDownFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDChannelDownNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDChannelDownNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDChannelListFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDChannelListFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDChannelListNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDChannelListNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDChannelUPFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDChannelUPFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDChannelUPNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDChannelUPNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDDSPAudioFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDDSPAudioFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDDSPAudioNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDDSPAudioNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDDvdFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDDvdFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDDvdNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDDvdNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDepgFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDepgFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDepgNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDepgNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDForwardFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDForwardFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDForwardNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDForwardNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDLyricsFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDLyricsFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDLyricsNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDLyricsNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDNextTrackFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDNextTrackFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDNextTrackNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDNextTrackNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPauseFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPauseFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPauseNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPauseNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPause.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPause.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPlayFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPlayFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPlaylistFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPlaylistFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPlaylistNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPlaylistNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPlayNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPlayNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPlay.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPlay.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPreFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPreFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPreNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPreNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPresetSettingsFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPresetSettingsFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPresetSettingsNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPresetSettingsNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPrevTrackFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPrevTrackFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDPrevTrackNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDPrevTrackNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDProgressBack.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDProgressBack.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDProgressMidLight.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDProgressMidLight.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDProgressMid.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDProgressMid.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRadioRDSFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRadioRDSFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRadioRDSNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRadioRDSNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRandomOffFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRandomOffFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRandomOffNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRandomOffNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRandomOnFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRandomOnFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRandomOnNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRandomOnNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRecordOffFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRecordOffFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRecordOffNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRecordOffNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRecordOnFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRecordOnFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRecordOnNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRecordOnNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRepeatAllFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRepeatAllFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRepeatAllNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRepeatAllNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRepeatFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRepeatFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRepeatNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRepeatNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRepeatOneFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRepeatOneFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRepeatOneNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRepeatOneNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRewindFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRewindFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDRewindNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDRewindNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDSeekForward.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDSeekForward.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDSeekFrame.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDSeekFrame.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDSeekRewind.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDSeekRewind.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/osd_slider_bg_2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/osd_slider_bg_2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/osd_slider_bg.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/osd_slider_bg.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/osd_slider_nibNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/osd_slider_nibNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/osd_slider_nib.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/osd_slider_nib.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDStereoscopicFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDStereoscopicFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDStereoscopicNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDStereoscopicNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDStopFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDStopFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDStopNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDStopNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDSubtitlesFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDSubtitlesFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDSubtitlesNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDSubtitlesNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDTeleTextFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDTeleTextFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDTeleTextNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDTeleTextNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDVideoFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDVideoFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDVideoNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDVideoNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDVizFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDVizFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OSDVizNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OSDVizNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OverlayDialogBackground.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OverlayDialogBackground.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OverlayLocked.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OverlayLocked.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OverlayRAR.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OverlayRAR.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OverlayWatched.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OverlayWatched.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/OverlayWatching.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/OverlayWatching.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/pointer-focus-click.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/pointer-focus-click.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/pointer-focus-drag.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/pointer-focus-drag.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/pointer-focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/pointer-focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/pointer-nofocus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/pointer-nofocus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/PVR-EpgProgressIndicator.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/PVR-EpgProgressIndicator.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/PVR-HasRecording.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/PVR-HasRecording.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/PVR-HasTimer.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/PVR-HasTimer.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/PVR-HasTimerSchedule.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/PVR-HasTimerSchedule.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/PVR-IsRecording.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/PVR-IsRecording.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/radiobutton-focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/radiobutton-focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/radiobutton-nofocus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/radiobutton-nofocus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/RecentAddedBack.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/RecentAddedBack.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ScrollBarH_bar_focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ScrollBarH_bar_focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ScrollBarH_bar.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ScrollBarH_bar.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ScrollBarH.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ScrollBarH.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ScrollBarNib.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ScrollBarNib.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ScrollBarV_bar_focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ScrollBarV_bar_focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ScrollBarV_bar.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ScrollBarV_bar.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ScrollBarV.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ScrollBarV.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-down-2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-down-2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-down-focus-2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-down-focus-2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-down-focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-down-focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-down.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-down.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-left-focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-left-focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-left.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-left.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-right-focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-right-focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-right.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-right.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-up-2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-up-2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-up-focus-2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-up-focus-2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-up-focus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-up-focus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/scroll-up.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/scroll-up.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/seekslider2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/seekslider2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/seekslider.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/seekslider.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/separator2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/separator2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/separator.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/separator.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/separator_vertical.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/separator_vertical.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ShutdownButtonFocus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ShutdownButtonFocus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ShutdownButtonNoFocus.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ShutdownButtonNoFocus.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/SideFade.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/SideFade.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/StackFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/StackFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/StackNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/StackNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/SubMenuBack-Footer.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/SubMenuBack-Footer.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/SubMenuBack-Header.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/SubMenuBack-Header.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/SubMenuBack-MiddleFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/SubMenuBack-MiddleFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/SubMenuBack-MiddleNF.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/SubMenuBack-MiddleNF.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/Subtitles/flags/ca.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/Subtitles/flags/ca.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/Subtitles/flags/fa.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/Subtitles/flags/fa.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/Subtitles/flags/gl.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/Subtitles/flags/gl.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/Subtitles/flags/-.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/Subtitles/flags/-.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/Subtitles/icon_close_caption.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/Subtitles/icon_close_caption.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/Subtitles/icon_sync.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/Subtitles/icon_sync.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ThumbBG.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ThumbBG.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ThumbBorder.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ThumbBorder.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/ThumbShadow.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/ThumbShadow.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/unknown-user.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/unknown-user.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/VideoWindowFO.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/VideoWindowFO.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/skin.confluence/media/VolumeIcon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/skin.confluence/media/VolumeIcon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/addon.xml kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/addon.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/addon.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,122 @@ + + + + + Visualisering wat 'n roterende 3D Spektrum Analiseerder vertoon + تصور عرض محلل طيف دوار 3 الأبعاد + Visualisation showing a rotating 3D Spectrum Analyzer + Визуализация представяща ротиращ се 3D спектрален анализатор + Efecte visual que mostra un analitzador d'espectre en 3D rotant + Vizualizace zobrazující rotující 3D spektrální analyzátor + Delweddu'n dangos Dadansoddwr Sbectrwm 3D sy'n troi + Visualisering der viser en roterende 3D-spektrumanalyse + Diese Visualisierung zeigt eine rotierende Spektrumanalyse in 3D + Οπτικοποίηση που εμφανίζει έναν περιστρεφόμενο τρισδιάστατο Αναλυτή Φάσματος + Visualisation showing a rotating 3D Spectrum Analyser + Visualisation showing a rotating 3D Spectrum Analyser + Visualisation showing a rotating 3D Spectrum Analyser + Visualization showing a rotating 3D Spectrum Analyzer + Visualización que muestra un analizador de espectro en 3D girando + Visualización que muestra un analizador de espectro en 3D girando + Visualización mostrando un Analizador de Espectro en 3D + Pöörlevat 3D spektraalanalüüsi näitav visuaal + 3D espektro analizatzaile bat biraka erakusten duen bistaratzea + این مجسم ساز یک آنالیز چرخنده طیفی را به شکل 3 بعدی نمایش می دهد. + Pyörivä 3D-spektrianalysaattori + Visualisation affichant un analyseur de spectre 3D en rotation + Visualisation affichant un analyseur de spectre 3D en rotation + Visualización que amosa un analizador de espectro virando en 3D + חיזוי המציג סיבובי נתח תדרים תלת מימדי מסתובב + Vizualizacija koja prikazuje rotirajući 3D spektralni analizator + Vizualizáció 3D spektrum analizátorral + Visualisasi memperlihatkan Spektrum Analyzer 3D yang berputar + Myndskreyting sem sýnir þrívíddar rófgreini + Visualizzazione che mostra un analizzatore di spettro 3D ruotante + 回転する 3D スペクトラムアナライザーを表示するビジュアライザー + 회전하는 3D 스펙트럼 분석기를 보여지는 음악시각화 + Vizualizacija rodo rotacinis 3D spektro analizatorių + Vizualizācija, kas attēlo rotējošu 3D spektra analizatoru + Оваа визуализација покажува ротирачки 3Д анализатор на спектар + Pengvisualan menunjukkan Penganalisis Spektrum 3D yang berputar + လည်ပတ်နေသော 3D Spectrum Analyzer ဖန်တီး ပြနေသည် + Visualisering som viser en roterende 3D-spektrumanalysator + DirectX-visualisatie die een roterende 3D-spectrumanalyse weergeeft + Wizualizacja wyświetlająca obracający się 3 wymiarowy Analizator Widma Akustycznego + Visualização que mostra um analisador espectral rotativo em 3D + Visualização que mostra um analisador espectral rotativo em 3D + Vizualizare care afișează un analizor de spectre 3D rotativ + Визуализация, показывающая вращающийся трёхмерный анализатор спектра + Vizualizácia zobrazujúca rotujúci 3D Spektrálny analyzér + Vizualizacija, ki prikazuje vrtečo 3D spektralno analizo + Vizualizim që tregon një Analizor Spektral 3D + Visualisering som visar en roterande 3D-spektrumanalysator + Таҷассум бо намоиши таҳлили спектри 3D-и даврзананда + การแสดงแสงสี ทำให้เห็นการหมุนแบบ 3 มิติ ของการวิเคราะห์คลื่นความถี่เสียง + Görsel öğe dönen bir 3B Spektrum Analizör göstermektedir + Візуалізація що показує обертаючийся 3D спектроаналізатор. + Trình diễn đồ họa thể hiện hình ảnh xoay liên tục về 3D Spectrum Analyzer + 显示旋转三维频谱分析图像的可视化效果 + 顯示旋轉的3D頻譜分析視覺效果 + DirectX Spectrum is 'n Visualisering wat 'n roterende 3D Spektrum Analiseerder, verbeeld met DirectX, vertoon wat op die maat van die musiek beweeg en 'n golf effek oor die spektrum rooster skep. Dit het ook verstellings vir die aanpas van spektrum staaf hoogte, sy spoed, en hoe die stawe verbeeld word (solied, punte, draad raamwerk) en is 'n lekker ligte, lae cpu verbruik visualisering wat fantasties lyk + طيف دايركت اكس هو عرض تخيل دوار 3 الأبعاد مقدم بدايركت اكس الذي يتحرك مع وقع الموسيقى مُنشِأَ موجة تأثير عبر شبكة الطيف. وله أيضا إعدادات لتعديل شريط ارتفاع الطيف, و كيف الأشرطة تعرض (صلبة, نقط, سلكية) و لطيفة خفيفة الوزن, تصور بيدو رائع استخدام منخفض لوحدة المعالجة المركزية. + DirectX Spectrum is a Visualisation showing a rotating 3D Spectrum Analyzer rendered in DirectX that moves to the beat of the music creating a wave effect across the spectrum grid. It also has settings to adjust the spectrum bar height, Its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low cpu useage visualisation that looks great + DirectX Spectrum е визуализация изобразяваща въртящ се 3D спектрален анализатор (изчертаването се извършва с DirectX). Въртенето е под ритъма на музиката и предизвиква вълнови ефект по спектрална решетка. Можете да настройвате височината на спектралните стълбове, скоростта и това как се изчертават стълбовете – плътни, с точки, с решетка. Характеризира се с отличен вид, като същевременно почти не натоварва централния процесор. + El DirectX Spectrum és una visualització que mostra un analitzador d'espectre rotant en 3D renderitzat en DirectX que es mou al ritme de la música i crea un efecte d'ona a través de la graella de l'espectre. També té ajustos per defniri l'alçada de la barra de l'espectre, la seva velocitat i la manera de renderitzar les barres (sòlid, punts, fil de ferro) i és una visualització lleugera, de poc ús de CPU que llueix be + DirectX Spectrum je vizualizace zobrazující rotující 3D spektrální analyzátor vykreslený pomocí DirectX, který se pohybuje v rytmu hudby a vytváří vlnový efekt napříč spektrální mřížkou. Obsahuje také nastavení pro přizpůsobení výšky sloupců spektra, rychlosti, a způsobu vykreslení (vyplněný, body, drátový model). Je to velmi lehká vizualizace s nízkou zátěží CPU, která vypadá skvěle. + Mae DirectX Spectrum yn ddelweddiad sy'n dangos Dadansoddwr Sbectrwm 3D sydd wedi ei lunio gan DirectX sy'n symud i guriad cerddoriaeth gan greu effaith tonnog ar draws y grid sbectrwm. Mae ganddo osodiadau i newid uchder y bar sbectrwm, ei gyflymder a sut mae'r bariau'n cael eu llunio (solet, pwyntiau, ffrâm weiren). Mae'n ddelweddiad ysgafn sydd dim yn defnyddio llawer o'r prosesydd ac yn edrych yn dda + DirectX Spektrum er en visualisering, der viser en roterende 3D-spektrumanalysator renderet i DirectX, som bevæger sig i takt til musikken og skaber en bølgeeffekt på tværs af spektrumfeltet. Den har også indstillinger til at justere spektrumliniens højde, fart og hvordan den bliver renderet (fast, punkter, trådramme). Det er en letvægtsvisualisering med lavt CPU-forbrug, som ser godt ud. + DirectX Spectrum ist eine Visualisierung, die eine rotierende Spektrum Analyse in 3D zeigt. Die Visualisierung wird so gerendert, dass sie sich zum Takt der Musik bewegt und eine Welle über das Spektrum Grid legt. Es lässt sich neben der Höhe, die Geschwindigkeit als auch die Art der Balken (durchgehend, Punkte, Drahtgeflecht) einstellen. Eine schöne Visualisierung, die nur eine geringe CPU-Last erzeugt + Το DirectX Spectrum είναι μία Οπτικοποίηση που εμφανίζει έναν περιστρεφόμενο τρισδιάστατο Αναλυτή Φάσματος που αποδίδεται μέσω DirectX και κινείται στο ρυθμό της μουσικής δημιουργώντας ένα κυματικό εφέ κατά μήκος του φασματικού πλέγματος. Διαθέτει ρυθμίσεις για τον ορισμό του ύψους των στηλών του φάσματος, του τρόπου απόδοσης των στηλών (συμπαγείς, σημειακές, συρματόπλεγμα), και είναι μία ελαφριά, εμφανίσιμη και χαμηλής υπολογιστικής ισχύος οπτικοποίηση + DirectX Spectrum is a Visualisation showing a rotating 3D Spectrum Analyser rendered in DirectX that moves to the beat of the music creating a wave effect across the spectrum grid. It also has settings to adjust the spectrum bar height, its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low cpu usage visualisation that looks great + DirectX Spectrum is a Visualisation showing a rotating 3D Spectrum Analyser rendered in DirectX that moves to the beat of the music creating a wave effect across the spectrum grid. It also has settings to adjust the spectrum bar height, its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low cpu usage visualisation that looks great + DirectX Spectrum is a Visualisation showing a rotating 3D Spectrum Analyser rendered in DirectX that moves to the beat of the music creating a wave effect across the spectrum grid. It also has settings to adjust the spectrum bar height, its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low cpu usage visualisation that looks great + DirectX Spectrum is a Visualization showing a rotating 3D Spectrum Analyzer rendered in DirectX that moves to the beat of the music creating a wave effect across the spectrum grid. It also has settings to adjust the spectrum bar height, Its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low CPU usage visualization that looks great + DirectX Spectrum es una visualización que muestra un analizador de espectro en 3D girando, renderizado con DirectX, que se mueve al ritmo de la música creando un efecto de onda en la rejilla del espectro. Se puede ajustar la altura de las barras, su velocidad, y como son renderizadas (sólido, puntos, malla). Es una visualización que utiliza poca CPU y muy agradable. + DirectX Spectrum es una visualización que muestra un analizador de espectro en 3D girando renderizado con DirectX que se mueve al ritmo de la música creando un efecto de onda en la rejilla del espectro. Se puede ajustar la altura de las barras, su velocidad, y como son renderizadas (sólido, puntos, malla). Es una visualización que utiliza poca CPU y es muy agradable. + Espectro DirectX es una Visualización que muestra un Analizador de Especto en 3D rotando renderizado en DirectX que se mueve al ritmo de la música creando un efecto de onda a través del espectro de la red. También tiene configuraciones para ajustar la altura de la barra de espectro, su velocidad, y cómo las barras son renderizadas (sólidas, puntos, malla de alambre) y es una buena visualización liviana, de poco uso de cpu que se ve genial. + DirectX Spectrum on visuaal, mis näitab pöörlevat 3D spektraalanalüüsi, renderdatuna DirectX keskkonnas ja mis liigub muusika rütmis luues laineefekti üle spektraalvõrgu. Lisaks on sellel võimalus muuta spektri kõrgust, selle kiirust ja kuidas ribasid renderdatakse (tahkis, punktid, sõrestik). DirectX Spectrum on ilusa väljanägemisega kerge ja väikese protsessorikasutusega visuaal. + DirectX Spectrum DIRECTX erabiliaz mugitzen den 3D espektro analizatzaile bat biraka erakusten duen bistaratzea, hau musikarekin erritmoarekin batera efektu berriak sortzen ditu . Barren garaiera, abiadura eta errenderizazio modua (solidoa, puntuak, ..) doitu daitezke. CPU gutxi erabiltzen duen bistaratze atsegin bat da. + DirectX Spectrum مجسم سازی است که یک آنالیز چرخنده طیفی را به شکل 3D نمایش می دهد. تصویر همراه با ضرباهنگ موسیقی حرکت می کند و یک موج بر روی شبکه طیفی نمایش می دهد. امکان تغییر ارتفاع، سرعت و شکل ستون ها (تصویر کامل، نقطه چین، مدل سیمی) در برنامه موجود است. یک مجسم ساز واقعا زیبا، که زمان کمی را از پردازنده می طلبد. + Näyttää pyörivän 3D-spektrianalysaattorin, joka liikkuu musiikin tahdissa tuottaen aaltotehosteen spektrikuvaajaan. Spektripalkin korkeuden, nopeuden, ja piirtotavan (täytetyt, pisteet, ääriviivat) voi asettaa asetuksista. Spectrum on kevyt visualisointi joka näyttää hyvältä. + DirectX Spectrum est une visualisation affichant un analyseur de spectre 3D en rotation, rendue en DirectX, qui se déplace au gré du rythme de la musique tout en créant un effet d'onde sur toute la grille du spectre. Elle offre aussi des paramètres pour ajuster la hauteur des barres du spectre, sa vitesse et comment les barres sont rendues (plein, points, fil de fer). C'est une visualisation légère, frugale et visuellement attirante. + DirectX Spectrum est une visualisation affichant un analyseur de spectre 3D en rotation, sous DirectX. Il réagit au rythme de la musique, créant un effet d'onde sur la grille du spectre. Il propose divers paramètres pour ajuster la hauteur des barres du spectre, la vitesse, et le rendu des barres (plein, en points, en fil de fer). Une visualisation légère, peu gourmande en CPU et agréable à regarder. + DirectX Spectrum é unha Visualización que amosa un analizador de espectro rederizdo en DirectX que se move ó ritmo da música creando un efecto onda sobre a grella do espectro. Tamén ten configuracións para axustar a altura da barra do espectro, a súa velocidade e como as barras son renderizadas (sólidas, puntos, malla) e é unha visualización bonita, lixeira e de escaso consumo de CPU. + החיזוי DirectX Spectrum מציג נתח תדרים תלת מימדי מסתובב שזז בקצב המוזיקה ויוצר אפקט גל על פני ציר התדר. קיימת אפשרות גם להגדיר את הגובה האנכי, את המהירות, ואופן העיבוד הגרפי (מלא, נקודות, מסגרת קווית) וזהו חיזוי נחמד וקליל שלא מעמיס על המעבד ונראה נהדר. + DirectX Spectrum je vizualizacija koja prikazuje rotirajući 3D spektralni analizator prikazan u DirectX-u koji se pokreće u ritmu glazbe stvarajući efekt valova u spektralnoj mreži. Također sadrži i postavke za namještanje visine sprektralnih traka, njihove brzine, i načina na koji su prikazane (popunjeno, točke, žičani okvir). Vizualizacija izgleda sjajno te je malih memorijskih i CPU zahtjeva. + A DirectX Spectrum egy olyan vizualizáció ami egy 3D hang spektrum analizátort mutat DirectX segítségével megjelenítve, ami a zene ritmusára mozog egy hullám-effektust képezve a teljes spektrumhálón. Beállítható a spektrum oszlopok magassága, mozgási sebessége és hogy az oszlopok hogyan jelenjenek meg (teli, pontok, drótváz). Ez egy kis erőforrásigényű vizualizáció ami nagyon jól mutat. + DirectX Spectrum merupakan visualisasi yang memperlihatkan Spektrum Analyzer 3D yang berputar yang dirender pada DirectX yang bergerak mengikuti hentakan musik dan mencipkatan efek gelombang sepanjang kisi spektrum. Juga diatur untuk menyesuaikan tinggi bar, kecepatan, dan bagaimana bar dirender (solid, poin, wire frame) dan cukup ringan, rendah pemakaian cpu yang keren!!! + DirectX Spectrum er myndskreyting sem sýnir þrívíddar rófgreini sem snýst sem er teiknaður í DirectX og hreyfist í takt við tónlistina sem myndar bylgjuhreyfingu yfir rófið. Það er líka hægt að stilla hæð mælingana, hraða og hvernig þær eru teiknaðar (fyllt, punktar, útlínur) myndskrytingin setur lítið álag á örgjörva og lítur vel út + DirectX Spectrum è una visualizzazione che mostra un analizzatore di spettro 3D ruotante renderizzato in DirectX che si muove a tempo di musica creando un effetto onda tramite la griglia di spettro. Ha anche varie impostazioni: altezza delle barra dello spettro, la sua velocità e come le barre sono renderizzate (solidi, punti, reticolato). E' una visualizzazione leggera, che richiede poche risorse cpu e dall'aspetto fantastico + DirectX スペクトラムは回転する 3D スペクトラムアナライザーを表示する DirectX ビジュアライザーで、音楽のビートに合わせてスペクトラムの波形エフェクトを作成します。 バーの高さ、表示時間、バーの表示モード (ソリッド、ポイント、ワイヤーフレーム)を設定でき、軽量なCPU使用率でグレイトなビジュアライザーです。 + DirectX 스펙트럼은 회전하는 3D 스펙트럼 분석기를 통해 음악시각화를 보여주며 음악의 비트가 만들어내는 웨이브 효과를 스펙트럼 그리드에 보여줍니다. 설정에서 스펙트럼 바의 높이, 속도, 바의 갯수 (채워짐, 점, 와이어 프레임)를 지정할수 있습니다. 가볍고 CPU를 많이 사용하지 않습니다. + DirectX spektro vizualizacija, kurioje besisukantį 3D spektro analizatorių, paimta iš DirectX, katras juda į muzikos ritmą, įteigiančio bangų poveikį visame spektro tinklelyje. Turi nustatymuose nureguliuoti spektro juostos aukštį, jo greitį, teikiamas kraštines (kieta, taškai, tinklelio rėmas),vizualizacijai naudoja mažai CPU + DirectX Spectrum ir vizualizācija, kas attēlo DirectX apstrādātu rotējošu 3D spektra analizatoru, kas kustās mūzikas ritmā, radot viļnošanās efektu pa visu spektra režģi. Pieejami iestatījumi, lai pielāgotu joslas augstumu, ātrumu un joslu renderēšanu (pildījums, punkti, karkass), un vizualizācija darbojas viegli, maz noslogo cpu un izskatās lieliski. + DirectX Spectrum is a Visualisation showing a rotating 3D Spectrum Analyzer rendered in DirectX that moves to the beat of the music creating a wave effect across the spectrum grid.⏎ It also has settings to adjust the spectrum bar height, Its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low cpu useage visualisation that looks great + Spektrum DirectX ialah Pengvisualan yang menunjukkan Penganalisis Spektrum 3D berputar dalam DirectX. Yang mana ia bergerak mengikut rentak muzik yang membentuk kesan bergelombang sepanjang grid spektrum. Ia juga mempunyai tetapan yang dapat melaras tinggi palang spektrum, kelajuannya, dan bagaimana palang dipersembahkan (pejal, mata, bingkai wayar) serta merupakan penggunaan cpu pengvisualan yang rendah, menarik dan nampak cantik. + DirectX Spectrum er en visualisering som viser en roterende 3D-spektrumanalysator rendret i DirectX som beveger seg i takt med musikken og skaper en bølgeeffekt over lydspektrumet. Du kan stille inn søylehøyden, hastigheten og hvordan barene blir rendret (solid, punkt, trådramme) i lydspektrumet. Visualiseringen tar liten plass, krever lite av prosessoren og ser flott ut + DirectX-spectrum toont een roterende 3D-spectrumanalyse via DirectX, die meebeweegt op de maat van de muziek, waarbij een golfeffect ontstaat over het spectrumraster. U kunt de hoogte, snelheid en weergave (vol, stippen, ...) van de spectrumbalk zelf instellen. Deze visualisatie vereist weinig geheugen en belast de processor nauwelijks. + DirectX Spectrum to obracający się, 3 wymiarowy Analizator Widma Akustycznego, renderowany za pośrednictwem DirectX, który porusza się w rytm muzyki, tworząc efekt fali w całym zakresie widma. Możesz zmieniać efekty, wysokość słupków, ich prędkość i wygląd. Świetna wizualizacja charakteryzująca się niskim obciążeniem procesora. + O DirectX Spectrum é uma visualização que mostra um analisador espectral rotacional 3d, renderizado em DirectX, que se sincroniza com a batida, criando assim um efeito de ondas na grelha espectral. Pode-se definir a altura das barras, a sua velocidade e como são renderizadas (sólido, pontos ou contorno). É uma visualização que utiliza pouco o CPU e com um visual fantástico + O DirectX Spectrum é uma visualização que mostra um analisador espectral rotativo em 3D, renderizado em DirectX, que se sincroniza com o ritmo da música, criando assim um efeito de ondas na grelha espectral. Pode definir-se a altura das barras, a sua velocidade e como são renderizadas (sólido, pontos ou contorno). É uma visualização que não utiliza muito CPU e tem um aspecto fantástico. + Spectrul DirectX este o vizualizare care afișează un analizor de spectre 3D rotativ randat în DirectX care se mișcă după bătăile muzicii creând un val dea-lungul grilei spectrale. De asemenea, are setări pentru ajustarea înălțimii bărilor spectrale, a vitezei, și a modului în care bările sunt randate (umplere, puncte, contur). Este o vizualizare cu consum redus al procesorului care arată fantastic de bine. + Эта визуализация на основе DirectX показывает вращающийся трёхмерный анализатор спектра, который движется в такт музыке, создавая эффект волны по всему спектру сетки.[C] Визуализация имеет настройки для регулировки высоты полос спектра, скорости движения и способа отображения полос (сплошной, точки, каркас), а также обладает небольшим размером и малой нагрузкой на процессор + DirectX Spectrum je vizualizácia zobrazujúca rotujúci 3D Spektrálny analyzér renderovaný v DirectX, ktorý sa pohybuje do rytmu hudby a vytvára vlnový efekt. Môžte si tiež nastaviť jeho výšku, rýchlosť a metódu renderovania(pevné, body, wireframe) a je to veľmi jednoduchá, málo procesor zaťažujúca vizualizácia, ktorá vyzerá skvelo + DirectX Spectrum je vizualizacija, ki prikazuje vrtečo 3D spektralno analizo, generirano v DirectX, ki se premika v ritmu glasbe in ustvarja učinek valovanja v celotnem spektru. Vsebuje tudi nastavitve za prilagoditev višine spektra, hitrosti in oblike (polno, točke, okvir) ter je varčna vizualizacija, z nizko porabo CPU-ja, ki izgleda super + DirectX Spectrum është nje vizualizim që tregonë një analizues spektral 3D që është llogaritur duke përdorur DirectX dhe lëvziet sipas muzikës duke krejuar një efekt valësh në një rrjet koordinativ spektral. Gjithashtu ka cilësime që lejojnë ndryshime të parametrave të ndryshme. Ky vizualizim nuk përdor shum llogari nga CPU. + DirectX-spektrum är en visualisering som visar en roterande 3D-spektrumanalysator renderad i DirectX. Den rör sig till musikens takt och skapar en vågeffekt över spektrat. Den har också inställningar för att justera staplarnas höjd, deras hastighet, hur de ska visas (solida, punkter, ramverk) och är en visualisering med låg cpu-användning samtidigt som den ser bra ut + DirectX Spectrum - ин таҷассум бо намоиши таҳлили спектри 3D-и даврзананда дар асоси DirectX мебошад, ки ритми мусиқиро интиқол дода таъсири мавҷро дар тӯри спектр эҷод мекунад. Танзимоте, вуҷуд доранд, ки твонед тавассути онҳо баландии навори спектрро танзим кунед, суръаташро тағйир диҳед ва ҳолати (яклухт, нуқтаҳо, ҷорчӯбаи хаттӣ) наворҳоро интихоб намоед. Равшании форам ва кам масрафи CPU ҳангоми таҷассуми таъсирҳои мусиқӣ намоиши аҷибро таъмин менамояд + DirectX Spectrum เป็น การแสดงแสงสี ทำให้เห็นการหมุนกราฟวิเคราะห์คลื่นความถี่เสียง แบบ 3 มิติ ที่สร้างขึ้นโดย DirectX ที่ขยับไปตามจังหวะของเพลงที่สร้างผลกระทบเป็นคลื่นไปทั่วตารางความถี่. นอกจากนี้ยังมีการตั้งค่าเพื่อปรับความสูงของแท่งคลื่นความถี่,ความเร็วและกระบวนการที่แท่งแสดงผล (ของแข็ง, จุด, โครงลวด) ทั้งยังใช้ทรัพยากรน้อยได้ดี, การแสดงแสงสี ที่ใช้ซีพียูต่ำนั่นก็ดูยอดเยี่ยมทีเดียว + DirectX Spektrum; 3B dönen bir Spektrum Analizör gösterisidir ve Directx yardımıyla renderlanır. Müziğin ritmine göre spektrum alanında dalga efekti yaratır. Aynı zamanda sepktrum bar yüksekliği, hızı ve barların nasıl render olacağı (katı, noktalar, tel kafes) ile ilgili ayarları vardır. Güzel gözüken, işlemciyi çok yormayan hafif bir yapıdır. + DirectX Spectrum є візалізаціє що показує обертаючийся 3D спектроаналізатор що промальовується з використанням технології DirectX. Спектроаналізатор показує стовпчики змінної висоти що рухаються в такт з музикою і створюють ефект подібний до хвилі. Ви маєте можливість налаштувати висоту стовпчиків, їх швидкість і те як вони намальовані (Заповнені, контури, крапки). Це досить проста, і невимоглива до процесора візуалізація, але яка має чудовий вигляд. + DirectX Spectrum là chương trình trình diễn đồ họa hình ảnh xoay liên tục về 3D Spectrum Analyzer trên DirectX chạy theo nhịp điệu của bài hát tạo ra hiệu ứng sóng trên dãy quang phổ.\n Hỗ trợ các tùy chỉnh để điều chỉnh như chiều cao của các cột quang phổ, tốc độ, và cách thể hiện các cột (đặc, điểm, hay khung dây). Tuy nó nhẹ, và cần ít tài nguyên của CPU nhưng vẫn rất tuyệt vời + DirectX Spectrum 可视化效果是 DirectX 渲染的一个旋转的三维频谱分析图像,频谱矩阵随着音乐节拍而象波浪起伏。 你还可以设置频谱棒的高度、变换速度、以及呈现效果(固体、点、框架)。这是一个不错的轻量级,低 CPU 占用率的可视化效果。 + DirectX頻譜是一個以DirectX呈現的展示旋轉3D頻譜分析儀的視覺效果,它會跟著音樂的節奏創造出水波紋的特效。 同時也有調整的頻譜條狀高度、速度以及條狀呈現方式 (固定、點狀、線框) 的設定,而且它是一個好用、輕量化並占用極低中央處理器資源的視覺效果。 + windx + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.af_za/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.af_za/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.af_za/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.af_za/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/kodi-main/language/af_ZA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af_ZA\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modus" + +msgctxt "#30001" +msgid "Filled" +msgstr "Gevul" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Draad Raamwerk" + +msgctxt "#30003" +msgid "Points" +msgstr "Punte" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Staaf Hoogte" + +msgctxt "#30005" +msgid "Small" +msgstr "Klein" + +msgctxt "#30006" +msgid "Default" +msgstr "Verstek" + +msgctxt "#30007" +msgid "Big" +msgstr "Groot" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Baie Groot" + +msgctxt "#30009" +msgid "Speed" +msgstr "Spoed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Baie Stadig" + +msgctxt "#30011" +msgid "Slow" +msgstr "Stadig" + +msgctxt "#30012" +msgid "Default" +msgstr "Verstek" + +msgctxt "#30013" +msgid "Fast" +msgstr "Vinnig" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Baie Vinnig" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.am_et/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.am_et/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.am_et/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.am_et/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Amharic (Ethiopia) (http://www.transifex.com/projects/p/kodi-main/language/am_ET/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: am_ET\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "ዘዴ " + +msgctxt "#30001" +msgid "Filled" +msgstr "ተሞልቷል" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "የሽቦ ክፈፍ " + +msgctxt "#30003" +msgid "Points" +msgstr "ነጥቦች " + +msgctxt "#30004" +msgid "Bar Height" +msgstr "የባሩ እርዝመት" + +msgctxt "#30005" +msgid "Small" +msgstr "ትንሽ " + +msgctxt "#30006" +msgid "Default" +msgstr "ነባር " + +msgctxt "#30007" +msgid "Big" +msgstr "ትልቅ " + +msgctxt "#30008" +msgid "Very Big" +msgstr "በጣም ትልቅ " + +msgctxt "#30009" +msgid "Speed" +msgstr "ፍጥነት" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "በጣም በዝግታ " + +msgctxt "#30011" +msgid "Slow" +msgstr "በዝግታ " + +msgctxt "#30012" +msgid "Default" +msgstr "ነባር " + +msgctxt "#30013" +msgid "Fast" +msgstr "በፍጥነት " + +msgctxt "#30014" +msgid "Very Fast" +msgstr "በጣም በፍጥነት " diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ar_sa/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ar_sa/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ar_sa/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ar_sa/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/kodi-main/language/ar_SA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar_SA\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "الوضع" + +msgctxt "#30001" +msgid "Filled" +msgstr "ممتلء" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "سلكي" + +msgctxt "#30003" +msgid "Points" +msgstr "نقاط" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "شريط الارتفاع" + +msgctxt "#30005" +msgid "Small" +msgstr "صغير" + +msgctxt "#30006" +msgid "Default" +msgstr "الافتراضية" + +msgctxt "#30007" +msgid "Big" +msgstr "كبير" + +msgctxt "#30008" +msgid "Very Big" +msgstr "كبير جدا" + +msgctxt "#30009" +msgid "Speed" +msgstr "سرعة" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "بطيء جدا" + +msgctxt "#30011" +msgid "Slow" +msgstr "بطيء" + +msgctxt "#30012" +msgid "Default" +msgstr "الافتراضية" + +msgctxt "#30013" +msgid "Fast" +msgstr "سريع" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "سريع جدا" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.az_az/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.az_az/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.az_az/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.az_az/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Azerbaijani (Azerbaijan) (http://www.transifex.com/projects/p/kodi-main/language/az_AZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az_AZ\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30006" +msgid "Default" +msgstr "Normal" + +msgctxt "#30009" +msgid "Speed" +msgstr "Sürət" + +msgctxt "#30012" +msgid "Default" +msgstr "Normal" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.be_by/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.be_by/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.be_by/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.be_by/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Belarusian (Belarus) (http://www.transifex.com/projects/p/kodi-main/language/be_BY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be_BY\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Filled" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Bar Height" + +msgctxt "#30005" +msgid "Small" +msgstr "Small" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30007" +msgid "Big" +msgstr "Вялікі" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Very Big" + +msgctxt "#30009" +msgid "Speed" +msgstr "Speed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Very Slow" + +msgctxt "#30011" +msgid "Slow" +msgstr "Slow" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" + +msgctxt "#30013" +msgid "Fast" +msgstr "Fast" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Very Fast" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.bg_bg/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.bg_bg/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.bg_bg/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.bg_bg/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/kodi-main/language/bg_BG/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg_BG\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Режим" + +msgctxt "#30001" +msgid "Filled" +msgstr "Запълнен" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Точков" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Височина на стълбовете" + +msgctxt "#30005" +msgid "Small" +msgstr "Малка" + +msgctxt "#30006" +msgid "Default" +msgstr "Стандартна" + +msgctxt "#30007" +msgid "Big" +msgstr "Голяма" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Много голяма" + +msgctxt "#30009" +msgid "Speed" +msgstr "Скорост" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Много бавна" + +msgctxt "#30011" +msgid "Slow" +msgstr "Бавна" + +msgctxt "#30012" +msgid "Default" +msgstr "Стандартна" + +msgctxt "#30013" +msgid "Fast" +msgstr "Бърза" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Много бърза" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.bs_ba/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.bs_ba/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.bs_ba/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.bs_ba/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/projects/p/kodi-main/language/bs_BA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs_BA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režim" + +msgctxt "#30005" +msgid "Small" +msgstr "Malo" + +msgctxt "#30006" +msgid "Default" +msgstr "Podrazumjevano" + +msgctxt "#30009" +msgid "Speed" +msgstr "Brzina" + +msgctxt "#30012" +msgid "Default" +msgstr "Podrazumjevano" + +msgctxt "#30013" +msgid "Fast" +msgstr "Brzo" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ca_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ca_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ca_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ca_es/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Catalan (Spain) (http://www.transifex.com/projects/p/kodi-main/language/ca_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Sòlid" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Malla" + +msgctxt "#30003" +msgid "Points" +msgstr "Punts" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Alçada de la barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Petit" + +msgctxt "#30006" +msgid "Default" +msgstr "Per defecte" + +msgctxt "#30007" +msgid "Big" +msgstr "Gran" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Molt Gran" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocitat" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Molt lent" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lent" + +msgctxt "#30012" +msgid "Default" +msgstr "Per defecte" + +msgctxt "#30013" +msgid "Fast" +msgstr "Ràpid" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Molt ràpid" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.cs_cz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.cs_cz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.cs_cz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.cs_cz/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/kodi-main/language/cs_CZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs_CZ\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režim" + +msgctxt "#30001" +msgid "Filled" +msgstr "Vypněný" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Drátový model" + +msgctxt "#30003" +msgid "Points" +msgstr "Body" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Výška sloupce" + +msgctxt "#30005" +msgid "Small" +msgstr "Malá" + +msgctxt "#30006" +msgid "Default" +msgstr "Výchozí" + +msgctxt "#30007" +msgid "Big" +msgstr "Velká" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Velmi velká" + +msgctxt "#30009" +msgid "Speed" +msgstr "Rychlost" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Velmi pomalu" + +msgctxt "#30011" +msgid "Slow" +msgstr "Pomalu" + +msgctxt "#30012" +msgid "Default" +msgstr "Výchozí" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rychle" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Velmi rychle" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.cy_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.cy_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.cy_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.cy_gb/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Welsh (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/cy_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy_GB\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modd" + +msgctxt "#30001" +msgid "Filled" +msgstr "Llanwyd" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Ffrâm weiar" + +msgctxt "#30003" +msgid "Points" +msgstr "Pwyntiau" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Uchder Bar" + +msgctxt "#30005" +msgid "Small" +msgstr "Bach" + +msgctxt "#30006" +msgid "Default" +msgstr "Rhagosodiad" + +msgctxt "#30007" +msgid "Big" +msgstr "Mawr" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Mawr Iawn" + +msgctxt "#30009" +msgid "Speed" +msgstr "Cyflymder" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Araf Iawn" + +msgctxt "#30011" +msgid "Slow" +msgstr "Araf" + +msgctxt "#30012" +msgid "Default" +msgstr "Rhagosodiad" + +msgctxt "#30013" +msgid "Fast" +msgstr "Cyflym" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Cyflym Iawn" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.da_dk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.da_dk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.da_dk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.da_dk/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Danish (Denmark) (http://www.transifex.com/projects/p/kodi-main/language/da_DK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da_DK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Tilstand" + +msgctxt "#30001" +msgid "Filled" +msgstr "Fyldt" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkter" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Bokshøjde" + +msgctxt "#30005" +msgid "Small" +msgstr "Lille" + +msgctxt "#30006" +msgid "Default" +msgstr "Standard" + +msgctxt "#30007" +msgid "Big" +msgstr "Stor" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Meget stor" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hastighed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Meget langsom" + +msgctxt "#30011" +msgid "Slow" +msgstr "Langsom" + +msgctxt "#30012" +msgid "Default" +msgstr "Standard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Hurtig" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Meget hurtig" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.de_de/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.de_de/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.de_de/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.de_de/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: German (Germany) (http://www.transifex.com/projects/p/kodi-main/language/de_DE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de_DE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modus" + +msgctxt "#30001" +msgid "Filled" +msgstr "Ausgefüllt" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Drahtgeflecht" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkte" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Balkenhöhe" + +msgctxt "#30005" +msgid "Small" +msgstr "Klein" + +msgctxt "#30006" +msgid "Default" +msgstr "Standard" + +msgctxt "#30007" +msgid "Big" +msgstr "Groß" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Sehr groß" + +msgctxt "#30009" +msgid "Speed" +msgstr "Geschwindigkeit" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Sehr langsam" + +msgctxt "#30011" +msgid "Slow" +msgstr "Langsam" + +msgctxt "#30012" +msgid "Default" +msgstr "Standard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Schnell" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Sehr schnell" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.el_gr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.el_gr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.el_gr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.el_gr/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Greek (Greece) (http://www.transifex.com/projects/p/kodi-main/language/el_GR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el_GR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Μέθοδος" + +msgctxt "#30001" +msgid "Filled" +msgstr "Γέμισαν" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Συρματόπλεγμα" + +msgctxt "#30003" +msgid "Points" +msgstr "Σημεία" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Ύψος Στηλών" + +msgctxt "#30005" +msgid "Small" +msgstr "Μικρό" + +msgctxt "#30006" +msgid "Default" +msgstr "Προεπιλογή" + +msgctxt "#30007" +msgid "Big" +msgstr "Μεγάλο" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Πολύ Μεγάλο" + +msgctxt "#30009" +msgid "Speed" +msgstr "Ταχύτητα" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Πολύ Αργά" + +msgctxt "#30011" +msgid "Slow" +msgstr "Αργά" + +msgctxt "#30012" +msgid "Default" +msgstr "Προεπιλογή" + +msgctxt "#30013" +msgid "Fast" +msgstr "Γρήγορα" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Πολύ Γρήγορα" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.en_au/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.en_au/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.en_au/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.en_au/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/kodi-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Filled" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Bar Height" + +msgctxt "#30005" +msgid "Small" +msgstr "Small" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30007" +msgid "Big" +msgstr "Big" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Very Big" + +msgctxt "#30009" +msgid "Speed" +msgstr "Speed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Very Slow" + +msgctxt "#30011" +msgid "Slow" +msgstr "Slow" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" + +msgctxt "#30013" +msgid "Fast" +msgstr "Fast" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Very Fast" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.en_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.en_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.en_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.en_gb/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,79 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#settings labels + +msgctxt "#30000" +msgid "Mode" +msgstr "" + +msgctxt "#30001" +msgid "Filled" +msgstr "" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "" + +msgctxt "#30003" +msgid "Points" +msgstr "" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "" + +msgctxt "#30005" +msgid "Small" +msgstr "" + +msgctxt "#30006" +msgid "Default" +msgstr "" + +msgctxt "#30007" +msgid "Big" +msgstr "" + +msgctxt "#30008" +msgid "Very Big" +msgstr "" + +msgctxt "#30009" +msgid "Speed" +msgstr "" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "" + +msgctxt "#30011" +msgid "Slow" +msgstr "" + +msgctxt "#30012" +msgid "Default" +msgstr "" + +msgctxt "#30013" +msgid "Fast" +msgstr "" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.en_nz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.en_nz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.en_nz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.en_nz/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/kodi-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Filled" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Bar Height" + +msgctxt "#30005" +msgid "Small" +msgstr "Small" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30007" +msgid "Big" +msgstr "Big" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Very Big" + +msgctxt "#30009" +msgid "Speed" +msgstr "Speed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Very Slow" + +msgctxt "#30011" +msgid "Slow" +msgstr "Slow" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" + +msgctxt "#30013" +msgid "Fast" +msgstr "Fast" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Very Fast" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.en_us/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.en_us/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.en_us/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.en_us/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United States) (http://www.transifex.com/projects/p/kodi-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Filled" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Bar Height" + +msgctxt "#30005" +msgid "Small" +msgstr "Small" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30007" +msgid "Big" +msgstr "Big" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Very Big" + +msgctxt "#30009" +msgid "Speed" +msgstr "Speed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Very Slow" + +msgctxt "#30011" +msgid "Slow" +msgstr "Slow" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" + +msgctxt "#30013" +msgid "Fast" +msgstr "Fast" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Very Fast" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.eo/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.eo/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.eo/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.eo/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/kodi-main/language/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30009" +msgid "Speed" +msgstr "Rapideco" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.es_ar/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.es_ar/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.es_ar/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.es_ar/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/kodi-main/language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Sólido" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Malla" + +msgctxt "#30003" +msgid "Points" +msgstr "Puntos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura de la barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Pequeña" + +msgctxt "#30006" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Muy grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidad" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Muy lenta" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lenta" + +msgctxt "#30012" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápida" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Muy rápida" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.es_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.es_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.es_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.es_es/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/kodi-main/language/es_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Sólido" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Malla" + +msgctxt "#30003" +msgid "Points" +msgstr "Puntos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura de la barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Pequeña" + +msgctxt "#30006" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Muy grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidad" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Muy despacio" + +msgctxt "#30011" +msgid "Slow" +msgstr "Despacio" + +msgctxt "#30012" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápido" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Muy rápido" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.es_mx/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.es_mx/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.es_mx/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.es_mx/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/kodi-main/language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Lleno" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Malla de alambre" + +msgctxt "#30003" +msgid "Points" +msgstr "Puntos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura de Barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Chico" + +msgctxt "#30006" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Muy Grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidad" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Muy Lento" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lento" + +msgctxt "#30012" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápido" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Muy Rápido" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.et_ee/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.et_ee/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.et_ee/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.et_ee/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/kodi-main/language/et_EE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et_EE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režiim" + +msgctxt "#30001" +msgid "Filled" +msgstr "Täidetud" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Sõrestik" + +msgctxt "#30003" +msgid "Points" +msgstr "Punktid" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Riba kõrgus" + +msgctxt "#30005" +msgid "Small" +msgstr "Väike" + +msgctxt "#30006" +msgid "Default" +msgstr "Vaikimisi" + +msgctxt "#30007" +msgid "Big" +msgstr "Suur" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Väga suur" + +msgctxt "#30009" +msgid "Speed" +msgstr "Kiirus" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Väga aeglane" + +msgctxt "#30011" +msgid "Slow" +msgstr "Aeglane" + +msgctxt "#30012" +msgid "Default" +msgstr "Vaikimisi" + +msgctxt "#30013" +msgid "Fast" +msgstr "Kiire" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Väga kiire" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.eu_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.eu_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.eu_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.eu_es/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Basque (Spain) (http://www.transifex.com/projects/p/kodi-main/language/eu_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modua" + +msgctxt "#30001" +msgid "Filled" +msgstr "Betea" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Burdin-haria" + +msgctxt "#30003" +msgid "Points" +msgstr "Puntuak" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Barra garaiera" + +msgctxt "#30005" +msgid "Small" +msgstr "Txikia" + +msgctxt "#30006" +msgid "Default" +msgstr "Lehenetsia" + +msgctxt "#30007" +msgid "Big" +msgstr "Handia" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Oso handia" + +msgctxt "#30009" +msgid "Speed" +msgstr "Abiadura" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Oso poliki" + +msgctxt "#30011" +msgid "Slow" +msgstr "Poliki" + +msgctxt "#30012" +msgid "Default" +msgstr "Lehenetsia" + +msgctxt "#30013" +msgid "Fast" +msgstr "Azkarra" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Oso azkarra" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fa_af/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fa_af/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fa_af/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fa_af/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Persian (Afghanistan) (http://www.transifex.com/projects/p/kodi-main/language/fa_AF/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_AF\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30006" +msgid "Default" +msgstr "پیش فرض" + +msgctxt "#30009" +msgid "Speed" +msgstr "سرعت" + +msgctxt "#30012" +msgid "Default" +msgstr "پیش فرض" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fa_ir/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fa_ir/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fa_ir/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fa_ir/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/kodi-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "حالت" + +msgctxt "#30001" +msgid "Filled" +msgstr "پر شده" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "مدل سیمی" + +msgctxt "#30003" +msgid "Points" +msgstr "نقطه ها" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "ارتفاع ستون" + +msgctxt "#30005" +msgid "Small" +msgstr "کوچک" + +msgctxt "#30006" +msgid "Default" +msgstr "پیش فرض" + +msgctxt "#30007" +msgid "Big" +msgstr "بزرگ" + +msgctxt "#30008" +msgid "Very Big" +msgstr "خیلی بزرگ" + +msgctxt "#30009" +msgid "Speed" +msgstr "سرعت" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "خیلی آهسته" + +msgctxt "#30011" +msgid "Slow" +msgstr "آهسته" + +msgctxt "#30012" +msgid "Default" +msgstr "پیش فرض" + +msgctxt "#30013" +msgid "Fast" +msgstr "تند" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "خیلی تند" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fi_fi/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fi_fi/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fi_fi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fi_fi/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/kodi-main/language/fi_FI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi_FI\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Muoto" + +msgctxt "#30001" +msgid "Filled" +msgstr "Täytetty" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Rautalanka" + +msgctxt "#30003" +msgid "Points" +msgstr "Pisteet" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Palkin korkeus" + +msgctxt "#30005" +msgid "Small" +msgstr "Pieni" + +msgctxt "#30006" +msgid "Default" +msgstr "Oletus" + +msgctxt "#30007" +msgid "Big" +msgstr "Suuri" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Erittäin suuri" + +msgctxt "#30009" +msgid "Speed" +msgstr "Nopeus" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Erittäin hidas" + +msgctxt "#30011" +msgid "Slow" +msgstr "Hidas" + +msgctxt "#30012" +msgid "Default" +msgstr "Oletus" + +msgctxt "#30013" +msgid "Fast" +msgstr "Nopea" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Erittäin nopea" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fo_fo/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fo_fo/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fo_fo/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fo_fo/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,37 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Faroese (Faroe Islands) (http://www.transifex.com/projects/p/kodi-main/language/fo_FO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo_FO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30005" +msgid "Small" +msgstr "Líti" + +msgctxt "#30006" +msgid "Default" +msgstr "Vanligt" + +msgctxt "#30009" +msgid "Speed" +msgstr "Fer" + +msgctxt "#30012" +msgid "Default" +msgstr "Vanligt" + +msgctxt "#30013" +msgid "Fast" +msgstr "Skjótt" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fr_ca/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fr_ca/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fr_ca/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fr_ca/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/kodi-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Plein" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Fil de fer" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Hauteur de barre" + +msgctxt "#30005" +msgid "Small" +msgstr "Petit" + +msgctxt "#30006" +msgid "Default" +msgstr "Valeur par défaut" + +msgctxt "#30007" +msgid "Big" +msgstr "Grand" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Très grand" + +msgctxt "#30009" +msgid "Speed" +msgstr "Vitesse" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Très lent" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lent" + +msgctxt "#30012" +msgid "Default" +msgstr "Valeur par défaut" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rapide" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Très rapide" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fr_fr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fr_fr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.fr_fr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.fr_fr/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (France) (http://www.transifex.com/projects/p/kodi-main/language/fr_FR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_FR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Plein" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Fil de fer" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Hauteur de barre" + +msgctxt "#30005" +msgid "Small" +msgstr "Petit" + +msgctxt "#30006" +msgid "Default" +msgstr "Prédéfini" + +msgctxt "#30007" +msgid "Big" +msgstr "Grand" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Très Grand" + +msgctxt "#30009" +msgid "Speed" +msgstr "Vitesse" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Très Lent" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lent" + +msgctxt "#30012" +msgid "Default" +msgstr "Prédéfini" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rapide" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Très Rapide" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.gl_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.gl_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.gl_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.gl_es/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Galician (Spain) (http://www.transifex.com/projects/p/kodi-main/language/gl_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Cheo" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Malla" + +msgctxt "#30003" +msgid "Points" +msgstr "Puntos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura da barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Pequeno" + +msgctxt "#30006" +msgid "Default" +msgstr "Predefinido" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Moi Grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidade" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Moi Lento" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lento" + +msgctxt "#30012" +msgid "Default" +msgstr "Predefinido" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápido" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Moi rápido" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.he_il/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.he_il/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.he_il/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.he_il/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/kodi-main/language/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "מצב" + +msgctxt "#30001" +msgid "Filled" +msgstr "מלא" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "מסגרת קווית" + +msgctxt "#30003" +msgid "Points" +msgstr "נקודות" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "גובה אנכי" + +msgctxt "#30005" +msgid "Small" +msgstr "קטן" + +msgctxt "#30006" +msgid "Default" +msgstr "ברירת מחדל" + +msgctxt "#30007" +msgid "Big" +msgstr "גדול" + +msgctxt "#30008" +msgid "Very Big" +msgstr "גדול מאוד" + +msgctxt "#30009" +msgid "Speed" +msgstr "מהירות" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "איטי מאוד" + +msgctxt "#30011" +msgid "Slow" +msgstr "איטי" + +msgctxt "#30012" +msgid "Default" +msgstr "ברירת מחדל" + +msgctxt "#30013" +msgid "Fast" +msgstr "מהיר" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "מהיר מאוד" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.hi_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.hi_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.hi_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.hi_in/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hindi (India) (http://www.transifex.com/projects/p/kodi-main/language/hi_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "विधि" + +msgctxt "#30006" +msgid "Default" +msgstr "डिफ़ॉल्ट" + +msgctxt "#30009" +msgid "Speed" +msgstr "गति" + +msgctxt "#30012" +msgid "Default" +msgstr "डिफ़ॉल्ट" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.hr_hr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.hr_hr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.hr_hr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.hr_hr/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Croatian (Croatia) (http://www.transifex.com/projects/p/kodi-main/language/hr_HR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr_HR\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Način" + +msgctxt "#30001" +msgid "Filled" +msgstr "Popunjeno" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Žičani okvir" + +msgctxt "#30003" +msgid "Points" +msgstr "Točke" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Visina trake" + +msgctxt "#30005" +msgid "Small" +msgstr "Malo" + +msgctxt "#30006" +msgid "Default" +msgstr "Zadano" + +msgctxt "#30007" +msgid "Big" +msgstr "Veliko" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Vrlo veliko" + +msgctxt "#30009" +msgid "Speed" +msgstr "Brzina" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Vrlo sporo" + +msgctxt "#30011" +msgid "Slow" +msgstr "Sporo" + +msgctxt "#30012" +msgid "Default" +msgstr "Zadano" + +msgctxt "#30013" +msgid "Fast" +msgstr "Brzo" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Vrlo brzo" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.hu_hu/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.hu_hu/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.hu_hu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.hu_hu/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/kodi-main/language/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mód" + +msgctxt "#30001" +msgid "Filled" +msgstr "Kitöltött" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Drótváz" + +msgctxt "#30003" +msgid "Points" +msgstr "Pontok" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Oszlopmagasság" + +msgctxt "#30005" +msgid "Small" +msgstr "Alacsony" + +msgctxt "#30006" +msgid "Default" +msgstr "Alapérték" + +msgctxt "#30007" +msgid "Big" +msgstr "Nagy" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Nagyon nagy" + +msgctxt "#30009" +msgid "Speed" +msgstr "Sebesség" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Nagyon lassú" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lassú" + +msgctxt "#30012" +msgid "Default" +msgstr "Alapérték" + +msgctxt "#30013" +msgid "Fast" +msgstr "Gyors" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Nagyon gyors" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.hy_am/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.hy_am/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.hy_am/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.hy_am/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Armenian (Armenia) (http://www.transifex.com/projects/p/kodi-main/language/hy_AM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy_AM\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Կարգավիճակ" + +msgctxt "#30006" +msgid "Default" +msgstr "Նախնական" + +msgctxt "#30009" +msgid "Speed" +msgstr "Արագություն" + +msgctxt "#30012" +msgid "Default" +msgstr "Նախնական" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.id_id/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.id_id/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.id_id/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.id_id/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/kodi-main/language/id_ID/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id_ID\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Diisi" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Point" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Tinggi bar" + +msgctxt "#30005" +msgid "Small" +msgstr "Kecil" + +msgctxt "#30006" +msgid "Default" +msgstr "Standar" + +msgctxt "#30007" +msgid "Big" +msgstr "Besar" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Sangat Besar" + +msgctxt "#30009" +msgid "Speed" +msgstr "Kecepatan" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Sangat Pelan" + +msgctxt "#30011" +msgid "Slow" +msgstr "Pelan" + +msgctxt "#30012" +msgid "Default" +msgstr "Standar" + +msgctxt "#30013" +msgid "Fast" +msgstr "Cepat" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Sangat Cepat" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.is_is/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.is_is/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.is_is/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.is_is/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Icelandic (Iceland) (http://www.transifex.com/projects/p/kodi-main/language/is_IS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is_IS\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Hamur" + +msgctxt "#30001" +msgid "Filled" +msgstr "Fyllt" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Útlínur" + +msgctxt "#30003" +msgid "Points" +msgstr "Punktar" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Hæð" + +msgctxt "#30005" +msgid "Small" +msgstr "Lítið" + +msgctxt "#30006" +msgid "Default" +msgstr "Sjálfgefið" + +msgctxt "#30007" +msgid "Big" +msgstr "Stórt" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Mjög stórt" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hraði" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Mjög hægt" + +msgctxt "#30011" +msgid "Slow" +msgstr "Hægt" + +msgctxt "#30012" +msgid "Default" +msgstr "Sjálfgefið" + +msgctxt "#30013" +msgid "Fast" +msgstr "Hratt" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Mjög hratt" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.it_it/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.it_it/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.it_it/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.it_it/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/kodi-main/language/it_IT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it_IT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modalità" + +msgctxt "#30001" +msgid "Filled" +msgstr "Piena" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "A righe" + +msgctxt "#30003" +msgid "Points" +msgstr "A punti" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altezza barre" + +msgctxt "#30005" +msgid "Small" +msgstr "Piccolo" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Molto Grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocità" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Molto Lento" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lento" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" + +msgctxt "#30013" +msgid "Fast" +msgstr "Veloce" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Molto Veloce" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ja_jp/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ja_jp/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ja_jp/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ja_jp/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/kodi-main/language/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "モード" + +msgctxt "#30001" +msgid "Filled" +msgstr "フィル" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "ワイヤーフレーム" + +msgctxt "#30003" +msgid "Points" +msgstr "ポイント" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "バーの高さ" + +msgctxt "#30005" +msgid "Small" +msgstr "小さく" + +msgctxt "#30006" +msgid "Default" +msgstr "デフォルト" + +msgctxt "#30007" +msgid "Big" +msgstr "大きく" + +msgctxt "#30008" +msgid "Very Big" +msgstr "とても大きく" + +msgctxt "#30009" +msgid "Speed" +msgstr "表示時間" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "とてもゆっくり" + +msgctxt "#30011" +msgid "Slow" +msgstr "ゆっくり" + +msgctxt "#30012" +msgid "Default" +msgstr "デフォルト" + +msgctxt "#30013" +msgid "Fast" +msgstr "速く" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "とても速く" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ko_kr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ko_kr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ko_kr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ko_kr/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/kodi-main/language/ko_KR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko_KR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "모드" + +msgctxt "#30001" +msgid "Filled" +msgstr "채워짐" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "와이어 프레임" + +msgctxt "#30003" +msgid "Points" +msgstr "점" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "바 높이" + +msgctxt "#30005" +msgid "Small" +msgstr "낮음" + +msgctxt "#30006" +msgid "Default" +msgstr "보통" + +msgctxt "#30007" +msgid "Big" +msgstr "높음" + +msgctxt "#30008" +msgid "Very Big" +msgstr "매우 높음" + +msgctxt "#30009" +msgid "Speed" +msgstr "속도" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "매우 느림" + +msgctxt "#30011" +msgid "Slow" +msgstr "느림" + +msgctxt "#30012" +msgid "Default" +msgstr "보통" + +msgctxt "#30013" +msgid "Fast" +msgstr "빠름" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "매우 빠름" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.lt_lt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.lt_lt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.lt_lt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.lt_lt/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/kodi-main/language/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režimas" + +msgctxt "#30001" +msgid "Filled" +msgstr "Pripildytas" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Tinklelio modelis" + +msgctxt "#30003" +msgid "Points" +msgstr "Taškai" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Juosta aukštai" + +msgctxt "#30005" +msgid "Small" +msgstr "Mažas" + +msgctxt "#30006" +msgid "Default" +msgstr "Numatytas" + +msgctxt "#30007" +msgid "Big" +msgstr "Didelis" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Labai didelis" + +msgctxt "#30009" +msgid "Speed" +msgstr "Prezentacijos rodymo laikas" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Labai lėtas" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lėtas" + +msgctxt "#30012" +msgid "Default" +msgstr "Numatytas" + +msgctxt "#30013" +msgid "Fast" +msgstr "Greitas" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Labai greitas" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.lv_lv/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.lv_lv/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.lv_lv/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.lv_lv/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/kodi-main/language/lv_LV/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv_LV\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režīms" + +msgctxt "#30001" +msgid "Filled" +msgstr "Aizpildīts" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Karkass" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkti" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Joslas augstums" + +msgctxt "#30005" +msgid "Small" +msgstr "Mazs" + +msgctxt "#30006" +msgid "Default" +msgstr "Noklusējums" + +msgctxt "#30007" +msgid "Big" +msgstr "Liels" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Ļoti liels" + +msgctxt "#30009" +msgid "Speed" +msgstr "Ātrums" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Ļoti lēns" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lēns" + +msgctxt "#30012" +msgid "Default" +msgstr "Noklusējums" + +msgctxt "#30013" +msgid "Fast" +msgstr "Ātrs" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Loti ātrs" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.mi/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.mi/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.mi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.mi/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/kodi-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Aratau" + +msgctxt "#30005" +msgid "Small" +msgstr "Small" + +msgctxt "#30006" +msgid "Default" +msgstr "Taunoa" + +msgctxt "#30009" +msgid "Speed" +msgstr "Tere" + +msgctxt "#30012" +msgid "Default" +msgstr "Taunoa" + +msgctxt "#30013" +msgid "Fast" +msgstr "Nohopuku" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.mk_mk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.mk_mk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.mk_mk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.mk_mk/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Macedonian (Macedonia) (http://www.transifex.com/projects/p/kodi-main/language/mk_MK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk_MK\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Режим" + +msgctxt "#30001" +msgid "Filled" +msgstr "Исполнето" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Мрежесто" + +msgctxt "#30003" +msgid "Points" +msgstr "Поени" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Висина на бар" + +msgctxt "#30005" +msgid "Small" +msgstr "Мало" + +msgctxt "#30006" +msgid "Default" +msgstr "Подразбирачко" + +msgctxt "#30007" +msgid "Big" +msgstr "Големо" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Многу големо" + +msgctxt "#30009" +msgid "Speed" +msgstr "Брзина" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Многу споро" + +msgctxt "#30011" +msgid "Slow" +msgstr "Споро" + +msgctxt "#30012" +msgid "Default" +msgstr "Подразбирачко" + +msgctxt "#30013" +msgid "Fast" +msgstr "Брзо" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Многу брзо" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.mn_mn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.mn_mn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.mn_mn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.mn_mn/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Mongolian (Mongolia) (http://www.transifex.com/projects/p/kodi-main/language/mn_MN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mn_MN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30009" +msgid "Speed" +msgstr "Хурд" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ms_my/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ms_my/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ms_my/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ms_my/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/kodi-main/language/ms_MY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms_MY\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mod" + +msgctxt "#30001" +msgid "Filled" +msgstr "Diisi" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Bingkai Wayar" + +msgctxt "#30003" +msgid "Points" +msgstr "Mata" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Tinggi Palang" + +msgctxt "#30005" +msgid "Small" +msgstr "Kecil" + +msgctxt "#30006" +msgid "Default" +msgstr "Lalai" + +msgctxt "#30007" +msgid "Big" +msgstr "Besar" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Sangat Besar" + +msgctxt "#30009" +msgid "Speed" +msgstr "Kelajuan" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Sangat Perlahan" + +msgctxt "#30011" +msgid "Slow" +msgstr "Perlahan" + +msgctxt "#30012" +msgid "Default" +msgstr "Lalai" + +msgctxt "#30013" +msgid "Fast" +msgstr "Pantas" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Sangat Pantas" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.mt_mt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.mt_mt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.mt_mt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.mt_mt/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,37 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Maltese (Malta) (http://www.transifex.com/projects/p/kodi-main/language/mt_MT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mt_MT\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode:" + +msgctxt "#30006" +msgid "Default" +msgstr "Difolt" + +msgctxt "#30009" +msgid "Speed" +msgstr "Veloċita'" + +msgctxt "#30012" +msgid "Default" +msgstr "Difolt" + +msgctxt "#30013" +msgid "Fast" +msgstr "Mgħaġġel" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.my_mm/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.my_mm/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.my_mm/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.my_mm/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/kodi-main/language/my_MM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my_MM\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "အခြေအနေ" + +msgctxt "#30001" +msgid "Filled" +msgstr "ဖြည့်စွက်မည်" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "အခြေခံဖွဲ့စည်းမှု" + +msgctxt "#30003" +msgid "Points" +msgstr "အမှတ်များ" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "ဘား အမြင့်" + +msgctxt "#30005" +msgid "Small" +msgstr "သေးငယ်သော" + +msgctxt "#30006" +msgid "Default" +msgstr "မူလအတိုင်း" + +msgctxt "#30007" +msgid "Big" +msgstr "ကြီးမားသော" + +msgctxt "#30008" +msgid "Very Big" +msgstr "ပို၍ကြီးမားသော" + +msgctxt "#30009" +msgid "Speed" +msgstr "အမြန်နှုန်း" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "ပို၍နှေးသော" + +msgctxt "#30011" +msgid "Slow" +msgstr "နှေးသော" + +msgctxt "#30012" +msgid "Default" +msgstr "မူလအတိုင်း" + +msgctxt "#30013" +msgid "Fast" +msgstr "အမြန်" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "ပို၍မြန်သော" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.nb_no/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.nb_no/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.nb_no/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.nb_no/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/kodi-main/language/nb_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modus" + +msgctxt "#30001" +msgid "Filled" +msgstr "Fylt" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Trådramme" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkt" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Søylehøyde" + +msgctxt "#30005" +msgid "Small" +msgstr "Liten" + +msgctxt "#30006" +msgid "Default" +msgstr "Standard" + +msgctxt "#30007" +msgid "Big" +msgstr "Stor" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Veldig stor" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hastighet" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Veldig sakte" + +msgctxt "#30011" +msgid "Slow" +msgstr "Sakte" + +msgctxt "#30012" +msgid "Default" +msgstr "Standard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rask" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Veldig raskt" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.nl_nl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.nl_nl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.nl_nl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.nl_nl/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/kodi-main/language/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modus" + +msgctxt "#30001" +msgid "Filled" +msgstr "Gevuld" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Draadframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Punten" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Balkhoogte" + +msgctxt "#30005" +msgid "Small" +msgstr "Klein" + +msgctxt "#30006" +msgid "Default" +msgstr "Standaard" + +msgctxt "#30007" +msgid "Big" +msgstr "Groot" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Heel groot" + +msgctxt "#30009" +msgid "Speed" +msgstr "Snelheid" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Zeer traag" + +msgctxt "#30011" +msgid "Slow" +msgstr "Traag" + +msgctxt "#30012" +msgid "Default" +msgstr "Standaard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Snel" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Zeer snel" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.pl_pl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.pl_pl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.pl_pl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.pl_pl/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/kodi-main/language/pl_PL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Tryb" + +msgctxt "#30001" +msgid "Filled" +msgstr "Wypełnione" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Siatka" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkty" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Wysokość słupków" + +msgctxt "#30005" +msgid "Small" +msgstr "Małe" + +msgctxt "#30006" +msgid "Default" +msgstr "Domyślne" + +msgctxt "#30007" +msgid "Big" +msgstr "Duże" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Bardzo duże" + +msgctxt "#30009" +msgid "Speed" +msgstr "Prędkość" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Bardzo wolna" + +msgctxt "#30011" +msgid "Slow" +msgstr "Wolna" + +msgctxt "#30012" +msgid "Default" +msgstr "Domyślna" + +msgctxt "#30013" +msgid "Fast" +msgstr "Szybka" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Bardzo szybka" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.pt_br/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.pt_br/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.pt_br/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.pt_br/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/kodi-main/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Total" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Contornos" + +msgctxt "#30003" +msgid "Points" +msgstr "Pontos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura da Barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Pequena" + +msgctxt "#30006" +msgid "Default" +msgstr "Padrão" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Muito Grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidade" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Lentamente" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lento" + +msgctxt "#30012" +msgid "Default" +msgstr "Padrão" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápido" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Velozmente" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.pt_pt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.pt_pt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.pt_pt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.pt_pt/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/kodi-main/language/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Preenchido" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Contorno" + +msgctxt "#30003" +msgid "Points" +msgstr "Pontos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura das Barras" + +msgctxt "#30005" +msgid "Small" +msgstr "Pequena" + +msgctxt "#30006" +msgid "Default" +msgstr "Padrão" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Muito grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidade" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Muito lenta" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lenta" + +msgctxt "#30012" +msgid "Default" +msgstr "Padrão" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápida" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Muito rápida" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ro_ro/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ro_ro/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ro_ro/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ro_ro/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Romanian (Romania) (http://www.transifex.com/projects/p/kodi-main/language/ro_RO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro_RO\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mod" + +msgctxt "#30001" +msgid "Filled" +msgstr "Umplere" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Contur" + +msgctxt "#30003" +msgid "Points" +msgstr "Puncte" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Înălțime bară" + +msgctxt "#30005" +msgid "Small" +msgstr "Mică" + +msgctxt "#30006" +msgid "Default" +msgstr "Standard" + +msgctxt "#30007" +msgid "Big" +msgstr "Mare" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Foarte mare" + +msgctxt "#30009" +msgid "Speed" +msgstr "Viteză" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Foarte încet" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lent" + +msgctxt "#30012" +msgid "Default" +msgstr "Standard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rapid" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Foarte rapid" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ru_ru/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ru_ru/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ru_ru/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ru_ru/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/kodi-main/language/ru_RU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru_RU\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Режим" + +msgctxt "#30001" +msgid "Filled" +msgstr "Сплошной" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Каркас" + +msgctxt "#30003" +msgid "Points" +msgstr "Точки" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Высота полос" + +msgctxt "#30005" +msgid "Small" +msgstr "Небольшие" + +msgctxt "#30006" +msgid "Default" +msgstr "По-умолчанию" + +msgctxt "#30007" +msgid "Big" +msgstr "Крупные" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Огромные" + +msgctxt "#30009" +msgid "Speed" +msgstr "Скорость" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Очень медленно" + +msgctxt "#30011" +msgid "Slow" +msgstr "Медленно" + +msgctxt "#30012" +msgid "Default" +msgstr "По умолчанию" + +msgctxt "#30013" +msgid "Fast" +msgstr "Быстро" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Очень быстро" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.si_lk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.si_lk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.si_lk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.si_lk/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,37 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/kodi-main/language/si_LK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: si_LK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "ක්‍රමය" + +msgctxt "#30005" +msgid "Small" +msgstr "කුඩා " + +msgctxt "#30006" +msgid "Default" +msgstr "නියත " + +msgctxt "#30009" +msgid "Speed" +msgstr "වේගය " + +msgctxt "#30012" +msgid "Default" +msgstr "නියත " diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sk_sk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sk_sk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sk_sk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sk_sk/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/kodi-main/language/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "režim" + +msgctxt "#30001" +msgid "Filled" +msgstr "Vyplnený" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Body" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Výška stĺpcov" + +msgctxt "#30005" +msgid "Small" +msgstr "Malý" + +msgctxt "#30006" +msgid "Default" +msgstr "Predvolené" + +msgctxt "#30007" +msgid "Big" +msgstr "Veľký" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Veľmi veľký" + +msgctxt "#30009" +msgid "Speed" +msgstr "Rýchlosť" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Veľmi pomalý" + +msgctxt "#30011" +msgid "Slow" +msgstr "Pomalý" + +msgctxt "#30012" +msgid "Default" +msgstr "Predvolené" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rýchly" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Veľmi rýchly" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sl_si/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sl_si/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sl_si/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sl_si/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/kodi-main/language/sl_SI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl_SI\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Način" + +msgctxt "#30001" +msgid "Filled" +msgstr "Polno" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Shema" + +msgctxt "#30003" +msgid "Points" +msgstr "Točke" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Višina stolpcev" + +msgctxt "#30005" +msgid "Small" +msgstr "Majhna" + +msgctxt "#30006" +msgid "Default" +msgstr "Privzeta" + +msgctxt "#30007" +msgid "Big" +msgstr "Velika" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Zelo velika" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hitrost" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Zelo počasno" + +msgctxt "#30011" +msgid "Slow" +msgstr "Počasno" + +msgctxt "#30012" +msgid "Default" +msgstr "Privzeto" + +msgctxt "#30013" +msgid "Fast" +msgstr "Hitro" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Zelo hitro" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sq_al/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sq_al/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sq_al/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sq_al/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Albanian (Albania) (http://www.transifex.com/projects/p/kodi-main/language/sq_AL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq_AL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mënyra" + +msgctxt "#30001" +msgid "Filled" +msgstr "Plotësuar" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Pikë" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Lartësija e kallëpit" + +msgctxt "#30005" +msgid "Small" +msgstr "Të vogël" + +msgctxt "#30006" +msgid "Default" +msgstr "Prezgjedhuar" + +msgctxt "#30007" +msgid "Big" +msgstr "I madh" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Shumë i madh" + +msgctxt "#30009" +msgid "Speed" +msgstr "Shpejtësija" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Shumë ngadal" + +msgctxt "#30011" +msgid "Slow" +msgstr "Ngadal" + +msgctxt "#30012" +msgid "Default" +msgstr "Prezgjedhuar" + +msgctxt "#30013" +msgid "Fast" +msgstr "Shpejtë" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Shumë shpejtë" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sr_rs/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sr_rs/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sr_rs/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sr_rs/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,37 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Serbian (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Режим" + +msgctxt "#30006" +msgid "Default" +msgstr "Подразумевано" + +msgctxt "#30009" +msgid "Speed" +msgstr "Брзина" + +msgctxt "#30012" +msgid "Default" +msgstr "Подразумевано" + +msgctxt "#30013" +msgid "Fast" +msgstr "Брзо" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sr_rs@latin/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sr_rs@latin/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sr_rs@latin/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sr_rs@latin/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Serbian (Latin) (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS@latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režim" + +msgctxt "#30005" +msgid "Small" +msgstr "Malo" + +msgctxt "#30006" +msgid "Default" +msgstr "Podrazumevano" + +msgctxt "#30009" +msgid "Speed" +msgstr "Brzina" + +msgctxt "#30012" +msgid "Default" +msgstr "Podrazumevano" + +msgctxt "#30013" +msgid "Fast" +msgstr "Brzo" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sv_se/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sv_se/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.sv_se/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.sv_se/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/kodi-main/language/sv_SE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv_SE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Läge" + +msgctxt "#30001" +msgid "Filled" +msgstr "Fylld" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkter" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Stapelhöjd" + +msgctxt "#30005" +msgid "Small" +msgstr "Liten" + +msgctxt "#30006" +msgid "Default" +msgstr "Standard" + +msgctxt "#30007" +msgid "Big" +msgstr "Stor" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Väldigt stor" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hastighet" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Väldigt långsam" + +msgctxt "#30011" +msgid "Slow" +msgstr "Långsam" + +msgctxt "#30012" +msgid "Default" +msgstr "Standard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Snabb" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Väldigt snabb" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.szl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.szl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.szl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.szl/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,73 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Silesian (http://www.transifex.com/projects/p/kodi-main/language/szl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: szl\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Tryb" + +msgctxt "#30001" +msgid "Filled" +msgstr "Wypołniōne" + +msgctxt "#30003" +msgid "Points" +msgstr "Pōnkty" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Wyżka lajsty" + +msgctxt "#30005" +msgid "Small" +msgstr "Małe" + +msgctxt "#30006" +msgid "Default" +msgstr "Wychodne" + +msgctxt "#30007" +msgid "Big" +msgstr "Sroge" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Fest sroge" + +msgctxt "#30009" +msgid "Speed" +msgstr "Wartkość" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Fest poleku" + +msgctxt "#30011" +msgid "Slow" +msgstr "Poleku" + +msgctxt "#30012" +msgid "Default" +msgstr "Wychodne" + +msgctxt "#30013" +msgid "Fast" +msgstr "Wartko" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Fest wartko" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ta_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ta_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.ta_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.ta_in/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/kodi-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "முறை" + +msgctxt "#30005" +msgid "Small" +msgstr "சிறிய" + +msgctxt "#30006" +msgid "Default" +msgstr "இயல்புநிலை" + +msgctxt "#30009" +msgid "Speed" +msgstr "வேகம்" + +msgctxt "#30012" +msgid "Default" +msgstr "இயல்புநிலை" + +msgctxt "#30013" +msgid "Fast" +msgstr "வேகமாக" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.te_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.te_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.te_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.te_in/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Telugu (India) (http://www.transifex.com/projects/p/kodi-main/language/te_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30009" +msgid "Speed" +msgstr "వేగం" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.tg_tj/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.tg_tj/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.tg_tj/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.tg_tj/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tajik (Tajikistan) (http://www.transifex.com/projects/p/kodi-main/language/tg_TJ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg_TJ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Ҳолат" + +msgctxt "#30001" +msgid "Filled" +msgstr "Пуршуда" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Чорчӯбаи хаттӣ" + +msgctxt "#30003" +msgid "Points" +msgstr "Нуқтаҳо" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Баландии навор" + +msgctxt "#30005" +msgid "Small" +msgstr "Хурд" + +msgctxt "#30006" +msgid "Default" +msgstr "Пешфарз" + +msgctxt "#30007" +msgid "Big" +msgstr "Калон" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Хеле калон" + +msgctxt "#30009" +msgid "Speed" +msgstr "Суръат" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Хеле суст" + +msgctxt "#30011" +msgid "Slow" +msgstr "Суст" + +msgctxt "#30012" +msgid "Default" +msgstr "Пешфарз" + +msgctxt "#30013" +msgid "Fast" +msgstr "Тез" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Хеле тез" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.th_th/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.th_th/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.th_th/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.th_th/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/kodi-main/language/th_TH/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th_TH\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "โหมด" + +msgctxt "#30001" +msgid "Filled" +msgstr "เติมพื้นผิว" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "โครงลวด" + +msgctxt "#30003" +msgid "Points" +msgstr "แบบจุด" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "ความสูงของแท่ง" + +msgctxt "#30005" +msgid "Small" +msgstr "เล็ก" + +msgctxt "#30006" +msgid "Default" +msgstr "ค่าพื้นฐาน" + +msgctxt "#30007" +msgid "Big" +msgstr "ใหญ่" + +msgctxt "#30008" +msgid "Very Big" +msgstr "ใหญ่มาก" + +msgctxt "#30009" +msgid "Speed" +msgstr "ความเร็ว" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "ช้ามาก" + +msgctxt "#30011" +msgid "Slow" +msgstr "ช้า" + +msgctxt "#30012" +msgid "Default" +msgstr "ค่าพื้นฐาน" + +msgctxt "#30013" +msgid "Fast" +msgstr "เร็ว" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "เร็วมาก" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.tr_tr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.tr_tr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.tr_tr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.tr_tr/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/kodi-main/language/tr_TR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr_TR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mod" + +msgctxt "#30001" +msgid "Filled" +msgstr "Dolu" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Telkafes" + +msgctxt "#30003" +msgid "Points" +msgstr "Noktalar" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Çubuk Yüksekliği" + +msgctxt "#30005" +msgid "Small" +msgstr "Küçük" + +msgctxt "#30006" +msgid "Default" +msgstr "Varsayılan" + +msgctxt "#30007" +msgid "Big" +msgstr "Büyük" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Çok Büyük" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hız" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Çok Yavaş" + +msgctxt "#30011" +msgid "Slow" +msgstr "Yavaş" + +msgctxt "#30012" +msgid "Default" +msgstr "Varsayılan" + +msgctxt "#30013" +msgid "Fast" +msgstr "Hızlı" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Çok Hızlı" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.uk_ua/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.uk_ua/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.uk_ua/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.uk_ua/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/kodi-main/language/uk_UA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk_UA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Режим" + +msgctxt "#30001" +msgid "Filled" +msgstr "Заповнений" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Контури" + +msgctxt "#30003" +msgid "Points" +msgstr "Крапки" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Висота стовпчика" + +msgctxt "#30005" +msgid "Small" +msgstr "Мала" + +msgctxt "#30006" +msgid "Default" +msgstr "За промовчанням" + +msgctxt "#30007" +msgid "Big" +msgstr "Велика" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Дуже велика" + +msgctxt "#30009" +msgid "Speed" +msgstr "Швидкість" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Дуже повільно" + +msgctxt "#30011" +msgid "Slow" +msgstr "Повільно" + +msgctxt "#30012" +msgid "Default" +msgstr "За промовчанням" + +msgctxt "#30013" +msgid "Fast" +msgstr "Швидкість" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Дуже швидко" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.uz_uz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.uz_uz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.uz_uz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.uz_uz/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Uzbek (Uzbekistan) (http://www.transifex.com/projects/p/kodi-main/language/uz_UZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz_UZ\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Usul" + +msgctxt "#30006" +msgid "Default" +msgstr "Andoza" + +msgctxt "#30009" +msgid "Speed" +msgstr "Tezligi" + +msgctxt "#30012" +msgid "Default" +msgstr "Andoza" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.vi_vn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.vi_vn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.vi_vn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.vi_vn/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/kodi-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Chế độ" + +msgctxt "#30001" +msgid "Filled" +msgstr "Làm đầy" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Khung dây" + +msgctxt "#30003" +msgid "Points" +msgstr "Số điểm" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Chiều cao cột" + +msgctxt "#30005" +msgid "Small" +msgstr "Nhỏ" + +msgctxt "#30006" +msgid "Default" +msgstr "Mặc định" + +msgctxt "#30007" +msgid "Big" +msgstr "Lớn" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Rất lớn" + +msgctxt "#30009" +msgid "Speed" +msgstr "Tốc độ" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Rất chậm" + +msgctxt "#30011" +msgid "Slow" +msgstr "Chậm" + +msgctxt "#30012" +msgid "Default" +msgstr "Mặc định" + +msgctxt "#30013" +msgid "Fast" +msgstr "Nhanh" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Rất nhanh" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.zh_cn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.zh_cn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.zh_cn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.zh_cn/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/kodi-main/language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "模式" + +msgctxt "#30001" +msgid "Filled" +msgstr "填充" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "线框" + +msgctxt "#30003" +msgid "Points" +msgstr "点" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "柱高" + +msgctxt "#30005" +msgid "Small" +msgstr "小" + +msgctxt "#30006" +msgid "Default" +msgstr "默认" + +msgctxt "#30007" +msgid "Big" +msgstr "大" + +msgctxt "#30008" +msgid "Very Big" +msgstr "特大" + +msgctxt "#30009" +msgid "Speed" +msgstr "速度" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "极慢" + +msgctxt "#30011" +msgid "Slow" +msgstr "慢" + +msgctxt "#30012" +msgid "Default" +msgstr "默认" + +msgctxt "#30013" +msgid "Fast" +msgstr "快" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "极快" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.zh_tw/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.zh_tw/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/language/resource.language.zh_tw/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/language/resource.language.zh_tw/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: DirectX Spectrum +# Addon id: visualization.dxspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/kodi-main/language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "模式" + +msgctxt "#30001" +msgid "Filled" +msgstr "填滿" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "線框" + +msgctxt "#30003" +msgid "Points" +msgstr "點狀" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "頻譜長條高度" + +msgctxt "#30005" +msgid "Small" +msgstr "小" + +msgctxt "#30006" +msgid "Default" +msgstr "預設" + +msgctxt "#30007" +msgid "Big" +msgstr "大" + +msgctxt "#30008" +msgid "Very Big" +msgstr "非常大" + +msgctxt "#30009" +msgid "Speed" +msgstr "速度" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "非常慢" + +msgctxt "#30011" +msgid "Slow" +msgstr "縵" + +msgctxt "#30012" +msgid "Default" +msgstr "預設" + +msgctxt "#30013" +msgid "Fast" +msgstr "快" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "非常快" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/settings.xml kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/settings.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.dxspectrum/resources/settings.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.dxspectrum/resources/settings.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,6 @@ + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/addon.xml kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/addon.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/addon.xml 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,154 @@ + + + + + Visualisasie wat Golwe en Wasigheid effek wys + إسلوب تخيلي يُظهِر مؤثراتاً بصرية تتضمن موجات ومؤثرات عين السمكة (مؤثرات ضبابية) + Визуализацията представя вълни и размиващи ефекти + Visualització que mostra efectes d'ona i taques + Vizualizace zobrazující vlny a rozmazané efekty + Delweddu'n dangos Tonau ac Effeithiau Pylu + Visualisering som viser Waves og Blur effekter + Visualisierung mit Wellen- und Weichzeichnungs-Effekten + Οπτικοποίηση προβολής Κυμάτων και Εφέ Θαμπώματος + Visualisation showing Waves and Blur Effects + Visualisation showing Waves and Blur Effects + Visualisation showing Waves and Blur Effects + Visualization showing Waves and Blur Effects + Visualización que muestra efectos de ondas y difuminado. + Visualización que muestra efectos de ondas y desenfoque + Visualización que muestra olas y efectos de desenfoque + Laine- ja uduefektidega visuaal + مجسم ساز با جلوه های موج گونه و محو کننده + Aalto- ja sumennustehosteita näyttävä visualisaatio + Visualisation à effet de vague et flou + Visualisation montrant des vagues et des effets de flou + Unha visualización con Ondas e efectos de Desenfoque + חיזוי המציג אפקטי גלים וטשטוש + Vizualizacija prikazuje valove i zamućene efekte + A vizualizáció Hullámokat és Elmosás Effekteket mutat. + Visualisasi menunjukkan efek gelombang dan efek kabur. + Sjónræn upplifun með bylgjum og afskerpuáhrifum + Visualizzazione mostrando Onde e Sfumature + ウェーブとブラー エフェクトを表示するビジュアライザー + 물결 효과와 흐림 효과를 보여주는 시각화 + Vizualizacija atvaizduojanti bangas ir suliejimo efektus + Vizualizācija, rādot viļņus un izpludināšanas efektu + Визуализација која покажува Бранови и Заматени Ефекти + Pengvisualan menunjukkan Kesan Gelombang dan Kabur + Visualisering viser bølge- og uskarpeffekter + Visualisatie waarbij Golven- en Blureffecten worden getoond + Wizualizacja wyświetlająca efekty fali i rozmycia + Visualização mostrando Ondas e Efeitos Borrados + Uma visualização com Ondas e Efeitos de Desfocagem + Vizualizare care arată valuri și efecte de încețoșare + Визуализация показывает волны и эффект размытия + Vizualizácia zobrazujúca vlnky a efekty rozmazania + Vizualizacija prikazuje valovanje in učinke zamegljenosti + Visualisering bestående av vågor- och blur-effekter + Wizualizacyjŏ, co pokŏzuje wele i mazy + Таҷассум бо шамоиши мавҷҳо ва таъсирҳои хирагӣ + Görselleştirme Dalga ve Bulanıklık Efektlerini gösteriyor + Візуалізація показу ефектів Хвилі та Розмиття + Hiển thị sử dụng hiệu ứng Sóng và Làm mờ + 呈现波浪和模糊效果的可视化效果 + fishBMC is gebasseer op fische, 'n onafhanklike klank visulasasie program. Die basiese prinsiep is: teken die golflente en smeer die tekening langs Vooraf gedefinieerde vektore. fische sluit ook gevorderde tempo ondekking in, wat 'n besondere visuele ervaring verseker. + fishBMC е създадена въз основа на fische - самостоятелен инструмент за визуализиране на звук. Основния принцип е изчертаване на вълнова функция и размиване по предварително определени вектори. В допълнение fische съдържа и разширена функция за засичане на ритъма, което би трябвало да гарантира великолепно визуално изживяване. + fishBMC je založeno na fische - samostatném nástorji pro vizualizaci zvuku. Základní princip: nakresli waveform a rozmaž obrázek podle předdefinováných směrů. Avšak fische také přidává pokročilou detekci rytmu a to garantuje nádherný vizuální zážitek. + MAe fishBMC yn seiliedig ar fisch, offeryn delweddu sain. Y prif elfen yw: llunio'r ffurf ton a'i lusgo ar hyd fectorau wedi eu diffinioo ymlaen llaw. Hefyd, mae fisch yn cynnwys dull o ganfod curiad uwch, sy'n gwarantu profiad gweledol trawiadol. + fishBMX er baseret på fische, et standard visualiserings værktøj. Det basale princip er: tegn waveformen og tvær tegning langs de prædefinerede vektorer. fische inkluderer også avanceret beat registrering, som garanterer en god visuel oplevelse. + fishBMC basiert auf fische, einem eigenständigen Ton-Visualisierungs-Programm. Das Grundprinzip ist: Zeichne das Wellen-Spektrum und verwische die Zeichnung entlang festgelegter Vektoren. fische verfügt jedoch auch über eine fortgeschrittene Rhytmus-Erkennung, die ein großartiges visuelles Erlebnis garantiert. + Το fishBMC είναι βασισμένο στο fische, ένα ξεχωριστό εργαλείο ηχητικών οπτικοποιήσεων. Η βασική του αρχή είναι: σχεδίαση μιας κυματομορφής και χρωματισμός της εικόνας κατά μήκος προκαθορισμένων διανυσμάτων. Παρ'όλα αυτά, το fische περιλαμβάνει και ανεπτυγμένες μεθόδους εντοπισμού παλμών, γεγονός που εγγυάται μια εκπληκτική οπτική εμπειρία. + fishBMC is based on fische, a standalone sound visualisation tool. The basic principle is: draw the waveform and smear the drawing along predefined vectors. However fische also incorporates advanced beat detection, which really guarantees a great visual experience. + fishBMC is based on fische, a standalone sound visualisation tool. The basic principle is: draw the waveform and smear the drawing along predefined vectors. However fische also incorporates advanced beat detection, which really guarantees a great visual experience. + fishBMC is based on fische, a standalone sound visualisation tool. The basic principle is: draw the waveform and smear the drawing along predefined vectors. However fische also incorporates advanced beat detection, which really guarantees a great visual experience. + fishBMC is based on fische, a standalone sound visualization tool. The basic principle is: draw the waveform and smear the drawing along predefined vectors. However fische also incorporates advanced beat detection, which really guarantees a great visual experience. + fishBMC esta basado en fische, una herramienta independiente de visualización de sonidos. El principio básico es: dibujar la forma de onda y difuminar el dibujo a lo largo de los vectores predefinidos. Sin embargo fische También incorpora detección del ritmo avanzado, que garantiza realmente una gran experiencia visual. + fishBMC está basado en fische, una herramienta de visualización de sonido. El principio básico es dibujar la forma de onda y extenderla a lo largo de vectores predefinidos. Sin embargo, fische también incluye una avanzada detección de ritmos, lo cual garantiza una gran experiencia visual. + fishBMC se basa en fische, una herramienta independiente de visualización de sonido. El principio principal es: dibujar la forma de onda y esfumar el dibujo en conjunto a vectores predefinidos. No obstante, fische también incorpora una detección avanzada de compás, lo que garantiza una gran experiencia visual. + fishBMC baseerub fische visualiseerimistööriistal. Põhiprintsiibiks on: joonista laine ja määri see ettenähtud suundades laiali. fische sisaldab lisaks veel edasijõudnud rütmituvastajat, garanteerides nii vaatajale suurepärase elamuse. + fishBMC بر پایه fische، که یک برنامه مجسم سازی صوتی مجزا است، تهیه شده است. اصل اساسی آن این است: رسم طیف موج و محو کردن تصویر در راستای بردارهای از پیش تعیین شده. fische از یک سیستم پیشرفته تشخیص ریتم نیز برخوردار است که امکان یک تجربه واقعا جالب دیداری را فراهم می آورد. + fishBMX est basé sur fische, un outil de visualisation audio autonome. Le principe de base est : dessiner la forme de l'onde et altère le dessin suivant des vecteurs prédéfinis. Cependant fische incorpore aussi une détection améliorée du tempo, ce qui garantie une expérience visuelle de qualité + fishBMC est basé sur fische, un outil de visualisation sonore. Le principe de base est : dessiner des ondes et déplacer le tracé sur les vecteurs prédéfinis. Cependant fische incorpore aussi un système de détection du rythme, ce qui garantie une grande expérience visuelle. + fishBMC está baseado en fische, unha ferramenta autónoma de visualización de sons. O principio básico é: debuxar as formas de onda e pintalas ao longo dos vectores predefinidos. E posíbel que fische tamén incorpore detección avanzada de golpes, que realmente garante unha grande experiencia visual. + החיזוי fishBMC מבוסס על fische, כלי לחיזוי קול. העיקרון הבסיסי אך: ציור צורת גל ומריחת הציור לאורך וקטורים המוגדרים מראש. עם זאת fische גם כולל יכולת מתקדמת לזיהוי קצב מוזיקה, דבר המעניק חוויה חזותית נהדרת. + fishBMC je temeljen na fische, samostalnom alatu zvučne vizualizacije. Osnovno načelo je: iscrtati valni oblik i razmazati crtež unaprijed određenim vektorima. Međutim fische isto uključuje napredno otkrivanje taktova, koje uistinu jamči sjajno vizualno iskustvo. + fishBMC a fische-n alapul, egy önálló hangvizualizációs eszköz. A fő célkitűzése: a hanghullám kirajzolása és előre megadott vektorok szerinti módosítása. Viszont a fische szintén alkalmaz egy haladó ütemérzékelőt, ami tényleg garantálja a nagyszerű vizuális élményt. + fishBMC didasarkan fische, alat visualisasi suara yang berdiri sendiri. Prinsip dasarnya adalah mengambar gelombang dan mengaburkannya sepanjang vektor yang telah ditentukan. Namun fische juga mengikutsertakan deteksi ketukan yang canggih, yang akan menjamin pengalaman visual yang hebat. + fishBMC er byggður á fische, sjálfstæðu tóli fyrir sjóræna upplifun á hljóði. Grunnuppbyggingin er: teikna bylgjuformið og smyrðu það út eftir skilgreindum vektorum. En fische er líka með þróaða taktskynjun, sem tryggir frábæra sjónræna upplifun. + fishBMC si basa su fische, uno strumento di visualizzazione del suono standalone. Il principio di base è: disegnare la forma d'onda e spalmare il disegno lungo i vettori predefiniti. Tuttavia fische incorpora anche il rilevamento di battito avanzato, che garantisce un'ottima esperienza visiva. + fishBMC は、fische というスタンドアロンの音声可視化ツールを基礎にしています。基本的な原理は、描いた波形を事前に定義したベクトルに沿ってにじませます。また fische には高度なビート検出が組み込まれており、本当に素晴らしいビジュアル体験を保証します。 + fllshBMC는 fische에 기반을 둔 음성 시각화 도구입니다. 기본 동작원리는 미리 정의된 벡터에 따라 선과 번짐을 표시하는 것입니다. 거기에다 검증된 멋진 비주얼 경험에 기반한 향상된 비트 검출 결과도 더해 집니다. + fishBMC paremtas fische, atskiru garso vizualizavimo įrankiu. Pagrindinis principas yra: piešti bangos formą ir ištaškyti piešinį išilgai iš anksto nustatytų vektorių. Taip pat fische turi įtrauktą pažangų dūžių aptikimą, kuris garantuoja didžiulį vizualinį įspūdį. + fishBMC pamatā ir savrups skaņas vizualizācijas rīks "fische". Pamatdoma ir zīmēt skaņas viļņus un iztriept tos pa iepriekš noteiktiem vektoriem. Tomēr fische iekļauta arī papildus ritma noteikšanas metode, kas patiešām garantē lielisku vizuālo baudījumu. + fishBMC е базирано на fische, кое е самостојна алатка за аудио визуелизација. Основниот принцип е: нацртај ја брановата форма и размачкај ја сликата по предефинирани вектори. Но fische исто така имплементира и напредна детекција на ритам, што навистина гарантира неверојатно визуелно искуство. + fishBMC adalah berasaskan pada fische, alat pengvisualan bunyi berdiri-sendiri. Prinsip asasnya: membentuk gelombang dan dilukis sepanjang vektor pra-takrif. Selain itu fische juga menggabungkan pengesanan beat termaju, yang pasti menjaminkan pengalaman visual yang hebat. + fishBMC er basert på fische, et selvstendig lydvisualiseringverktøy. Det grunnleggende prinsippet er: tegn bølgeformen og smør tegningen langs forhåndsdefinerte linjer. I tillegg inkluderer fische avansert rytmedeteksjon, noe som garanterer en flott, visuell opplevelse. + FishBMC is gebaseerd op fische, een zelfstandige geluidsvisualisatie tool. Het basis principe is: Teken de golfvorm en veeg de tekening rond ingestelde richtingen. Fische brengt eveneens geavanceerde beatdetectie, wat echt een grote visuele beleving garandeerd. + fishBMC bazuje na fische, samodzielnym narzędziu do wizualizacji muzyki. Podstawową zasadą jest generowanie wykresu fali i rozmazywanie go wzdłuż zdefiniowanych wektorów. Ponadto fische zawiera również zaawansowaną detekcję rytmu, co gwarantuje wspaniałe wrażenia wizualne. + fishBMC é baseado no fische, uma ferramenta de visualização de som independente. O princípio básico é: desenhar a forma de onda e esmaecer o desenho ao longo de vetores pré-definidos. Entretanto fische também incorpora detecção avançada de batidas, o que realmente garante uma grande experiência visual. + O fishBMC é baseado no fische, uma ferramenta autónoma de visualização de sons. O princípio básico é desenhar a onda e deformar o desenho através de vectores pré-definidos. No entanto, o fische também incorpora detecção avançada de ritmos, garantindo uma excelente experiência visual. + fishBMC основан на fische, являющейся самостоятельной утилитой для визуализации звука. Принцип работы: рисует форму волны и растягивает рисунок вдоль предопределенных векторов. При этом fische предлагает куда более продвинутый алгоритм определения ритма, гарантирующий потрясающее качество визуализации. + fishBMC je založený na fische, samostatnom nástroji na vizualizáciu. Základným princípom je: nakresliť priebeh signálu a rozmazať kresbu pozdĺž predefinovaných vektorov. Navyše fische obsahuje aj pokročilú detekciu rytmu, čo garantuje skutočný vizuálny zážitok. + fishBMC temelji na fischeu, samostojnem zvočno vizualizacijskem orodju. Osnovno načelo je: nariši valovni način in ga razmaži vzdolž vnaprej določenih vektorjev. Fische prav tako vključuje tudi napredno zaznavanje ritma, ki resnično zagotavlja odlično vizualno izkušnjo. + fishBMC är baserat på fische, ett fristående verktyg för ljudvisualisering. Den grundläggande principen är: rita en vågform och smeta ut den längs förbestämda vektorer. fische inkluderar även avancerad rytmdetektion, vilket verkligen garanterar en härlig visuell upplevelse. + fishBMC je podparte na fische, ôddziylnym nŏczyniu wizualizacyje źwiynku. Nŏjważniyjsze prawidło to je naszkryflać welã i ôzmazać jã podle nŏjprzōd nasztalowanych wektorōw. Fische ale mŏ tyż zaawansowane ôdkrywaniy szlagōw, co gwarantuje nŏjlepsze widoki. + fishBMC дар асоси fische, абзори алоҳида барои таҷассуми садо, амал мекунад. Қоидаи асосӣ: кашидани векторҳои мавҷшакл ва бетартиб. Инчунин fische муайянкунии зарбазании иловагии дарунсохтро таъмин менамояд, ки дар ҳақиқат таҷассуми аҷибро замонат медиҳад. + fishBMC, fische tabanlı kendi başına çalışabilir bir ses görselleştirme aracıdır. Temel ilkesi: ses biçimini çizmek ve çizimi önceden tanımlı vektörler ile yaymaktır. Ancak fische mükemmel bir görsel deneyimi garantileyen gelişmiş bir ritm algılama da içerir. + fishBMC 基于一个独立的声音可视化工具 fische。基本原理是:绘制波型并按预定的顶点涂抹。fische 还采用了先进的节拍检测,从而真正保证了绝佳的视觉体验。 + As dit iets breek, bly die stukke joune. + إذا سبب هذا تحطم أى شيئ، فستبقي القطع ملكك! + Ако "счупи" нещо - парчетата остават за Вас! + Když se rozbije všechno, ještě ti zůstanou ty kousky. + Os yw'n torri rhywbeth, eich darnau chi ydyn nhw. + Hvis dette ødelægger noget, er stykkerne dine. + Für eventuelle Schäden wird keine Haftung übernommen. + Αν σπάσει τίποτα, θα σας μείνουν τα κομμάτια. + If this breaks anything, the pieces remain yours. + If this breaks anything, the pieces remain yours. + If this breaks anything, the pieces remain yours. + If this breaks anything, the pieces remain yours. + Si esto rompe algo, los pedazos son tuyos. + Si esto rompe alguna cosa, te puedes quedar con los trozos. + Si esto rompe algo, las piezas siguen siento tuyas. + kui see midagi lõhub, siis võid tükid endale jätta + در قبال خسارات احتمالی مسئولیتی متوجه ما نخواهد بود. + Si ça brise, vous gardez les morceaux. + Si cela casse quelque chose, les pièces restent les vôtres. + Se isto estraga algunha cousa, pode quedar cas pezas. + אם זה שובר משהו, החתיכות ישארו שלך. + Ako ovo slomi nešto, komadići ostaju vama. + Ha ez összetör valamit attól a darabok még a tieid maradnak. + Kalau ini merusakkan suatu, pecahannya tetap menjadi milik anda. + Ef þetta brýtur eitthvað þá máttu eiga brotin. + se si rompe qualcosa, i cocci sono vostri. + これが何かを壊しても、あなたにはかけらが残ります。 + 발생하는 모든 문제는 사용자의 책임하에 있습니다. + Jei tai ką nors sugadins, gabalėliai liks jums. + Ja tas kaut ko saplēš, lauskas paliek tev. + Ако било што се расипе, деловите ти преостануваат тебе. + Jika ini merosakkan apa sahaja, bahagian in kekal milik anda. + Hvis noe blir ødelagt, så må du ordne opp selv. + Gebruik maken van deze visualisatie is op eigen risico. + Jeśli to rozbije cokolwiek, kawałki pozostaną Twoje. + se isto quebrar algo, as peças serão suas. + Se isto quebrar alguma coisa, pode ficar com as peças. + Если что-то сломается, это ваши проблемы. + Ak toto niečo rozbije, kúsky vám ostanú. + V primeru, da to karkoli zlomi, koščki ostanejo vaši. + Om detta skulle förstöra något så kan du behålla resterna. + Jeźli coś sie popsuje, to sie to weź. + Агар ин чизеро вайрон кунад, шумо қисмҳоро мегиред. + Eğer bu bir şeyi bozarsa, sorumluluk size aittir. + Якщо це щось знищить, шматки лишаються вашими. + 用者责任自负。 + linux osx + + diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/changelog.txt kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/changelog.txt --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/changelog.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/changelog.txt 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,57 @@ +2015-06-27: + Updated language files from Transifex + +2015-06-01: + Updated language files from Transifex + +2015-05-16: + Updated language files from Transifex + +2014-12-10: + Updated language files from Transifex + +2014-12-02: + Updated language files from Transifex + +2014-11-16: + Updated language files from Transifex + +2014-11-11: + Updated language files from Transifex + +2014-11-10: + Updated language files from Transifex + +2014-09-27: + Updated language files from Transifex + +2014-09-11: + Updated language files from Transifex + +2014-04-18: + Updated language files from Transifex + +2014-03-28: + Updated language files from Transifex + +2014-03-17: + Updated language files from Transifex + +2014-03-11: + Updated language files from Transifex + +2014-03-01: + Updated language files from Transifex + +2014-02-17: + Updated language files from Transifex + +2014-02-02: + Updated language files from Transifex + +2014-01-11: + Updated language files from Transifex + +2011-02-26: + Initial release for XBMC 11, based on fische 4 + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/LICENSE kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/LICENSE --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/LICENSE 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,282 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.af_za/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.af_za/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.af_za/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.af_za/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/kodi-main/language/af_ZA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af_ZA\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Besonderhede [CPU intens]" + +msgctxt "#30001" +msgid "Low" +msgstr "Laag" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normaal" + +msgctxt "#30003" +msgid "High" +msgstr "Hoog" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Uiterste" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Senuweeagtige Wyse [meer wyse veranderinge]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Spoed [spring oor sekere rame]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Baie Laag" + +msgctxt "#30008" +msgid "Low" +msgstr "Laag" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normaal" + +msgctxt "#30010" +msgid "High" +msgstr "Hoog" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Gebriuk 'n aanhoudende lêer [vinniger begin]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.am_et/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.am_et/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.am_et/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.am_et/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,53 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Amharic (Ethiopia) (http://www.transifex.com/projects/p/kodi-main/language/am_ET/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: am_ET\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "ዝርዝር [CPU intensive]" + +msgctxt "#30001" +msgid "Low" +msgstr "ዝቅተኛ " + +msgctxt "#30002" +msgid "Normal" +msgstr "መደበኛ " + +msgctxt "#30003" +msgid "High" +msgstr "ከፍተኛ " + +msgctxt "#30004" +msgid "Extreme" +msgstr "ከፍተኛ" + +msgctxt "#30007" +msgid "Very Low" +msgstr "በጣም ዝቅተኛ" + +msgctxt "#30008" +msgid "Low" +msgstr "ዝቅተኛ " + +msgctxt "#30009" +msgid "Normal" +msgstr "መደበኛ " + +msgctxt "#30010" +msgid "High" +msgstr "ከፍተኛ " diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ar_sa/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ar_sa/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ar_sa/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ar_sa/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,53 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/kodi-main/language/ar_SA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar_SA\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "#30001" +msgid "Low" +msgstr "منخفض" + +msgctxt "#30002" +msgid "Normal" +msgstr "متوسط" + +msgctxt "#30003" +msgid "High" +msgstr "مرتفع" + +msgctxt "#30004" +msgid "Extreme" +msgstr "اﻷقصي" + +msgctxt "#30007" +msgid "Very Low" +msgstr "منخفض جداً" + +msgctxt "#30008" +msgid "Low" +msgstr "الصغرى" + +msgctxt "#30009" +msgid "Normal" +msgstr "عادي" + +msgctxt "#30010" +msgid "High" +msgstr "مرتفع" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "إستخدِم ملفاً إستمرارياً [لضمان بدء التشغيل بشكل أسرع]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.az_az/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.az_az/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.az_az/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.az_az/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Azerbaijani (Azerbaijan) (http://www.transifex.com/projects/p/kodi-main/language/az_AZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az_AZ\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.be_by/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.be_by/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.be_by/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.be_by/strings.po 2015-10-19 08:39:14.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Belarusian (Belarus) (http://www.transifex.com/projects/p/kodi-main/language/be_BY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be_BY\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Найменшая" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Высокая" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Найлепшая" + +msgctxt "#30008" +msgid "Low" +msgstr "Найменшая" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Высокая" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.bg_bg/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.bg_bg/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.bg_bg/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.bg_bg/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/kodi-main/language/bg_BG/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg_BG\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Подробно [натоварва централния процесор]" + +msgctxt "#30001" +msgid "Low" +msgstr "Минимално" + +msgctxt "#30002" +msgid "Normal" +msgstr "Нормално" + +msgctxt "#30003" +msgid "High" +msgstr "Високо" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Изключително" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Нервен режим [още режимни промени]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Скорост [пропуска някои кадри]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Много минимално" + +msgctxt "#30008" +msgid "Low" +msgstr "Минимално" + +msgctxt "#30009" +msgid "Normal" +msgstr "Нормално" + +msgctxt "#30010" +msgid "High" +msgstr "Високо" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Ползвай постоянен файл [по-бързо стартиране]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.bs_ba/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.bs_ba/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.bs_ba/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.bs_ba/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/projects/p/kodi-main/language/bs_BA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs_BA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Min." + +msgctxt "#30002" +msgid "Normal" +msgstr "Normalno" + +msgctxt "#30003" +msgid "High" +msgstr "Visok" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstremno" + +msgctxt "#30008" +msgid "Low" +msgstr "Min." + +msgctxt "#30009" +msgid "Normal" +msgstr "Normalno" + +msgctxt "#30010" +msgid "High" +msgstr "Visok" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ca_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ca_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ca_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ca_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Catalan (Spain) (http://www.transifex.com/projects/p/kodi-main/language/ca_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detall [intensiu de CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Baix" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Alt" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extrem" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Velocitat [omet alguns marcs]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Molt baix" + +msgctxt "#30008" +msgid "Low" +msgstr "Baix" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Alt" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Utilitzeu un arxiu de persistència [inici més ràpid]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.cs_cz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.cs_cz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.cs_cz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.cs_cz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/kodi-main/language/cs_CZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs_CZ\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Podrobnosti [náročné na CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Nízké" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normální" + +msgctxt "#30003" +msgid "High" +msgstr "Vysoké" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Vysoké" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervozita Mod [větší změny modu]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Rychlost [přeskakuje některé snímky]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Velmi nízká" + +msgctxt "#30008" +msgid "Low" +msgstr "Nízká" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normální" + +msgctxt "#30010" +msgid "High" +msgstr "Vysoká" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Použij trvalý soubor [rychlejší start]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.cy_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.cy_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.cy_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.cy_gb/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Welsh (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/cy_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy_GB\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Manylyn [Dwysedd CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Isel" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Uchel" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Eithafol" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Modd Nerfus [rhagor o newidiadau modd]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Cyflymder [hepgor rhai ffframiau]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Isel Iawn" + +msgctxt "#30008" +msgid "Low" +msgstr "Isel" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Uchel" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Defnyddio Ffeil Barhaol [cychwyn yn gynt]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.da_dk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.da_dk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.da_dk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.da_dk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Danish (Denmark) (http://www.transifex.com/projects/p/kodi-main/language/da_DK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da_DK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detalje [CPU intensive]" + +msgctxt "#30001" +msgid "Low" +msgstr "Lav" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Høj" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstrem" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervøs mode [flere mode skift]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Hastighed [ignorer nogle frames]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Meget lavt" + +msgctxt "#30008" +msgid "Low" +msgstr "Lav" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Høj" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Brug en persistent fil [hurtigere opstart]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.de_de/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.de_de/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.de_de/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.de_de/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: German (Germany) (http://www.transifex.com/projects/p/kodi-main/language/de_DE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de_DE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detail [CPU-intensiv]" + +msgctxt "#30001" +msgid "Low" +msgstr "Niedrig" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Hoch" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Höchste Qualität" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervöser Modus [mehr Modus-Änderungen]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Geschwindigkeit [Überspringe einige Frames]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Sehr niedrig" + +msgctxt "#30008" +msgid "Low" +msgstr "Tief" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Hoch" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Persistente Datei benutzen [schnellerer Start]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.el_gr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.el_gr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.el_gr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.el_gr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Greek (Greece) (http://www.transifex.com/projects/p/kodi-main/language/el_GR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el_GR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Λεπτομέρεια [έντονη χρήση επεξεργαστή]" + +msgctxt "#30001" +msgid "Low" +msgstr "Ελαχ." + +msgctxt "#30002" +msgid "Normal" +msgstr "Κανονική" + +msgctxt "#30003" +msgid "High" +msgstr "Υψηλή" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ακραία" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Νευρική Λειτουργία [περισσότερες λειτουργικές αλλαγές]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Ταχύτητα [παράλειψη κάποιων καρέ]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Πολύ Χαμηλή" + +msgctxt "#30008" +msgid "Low" +msgstr "Ελαχ." + +msgctxt "#30009" +msgid "Normal" +msgstr "Κανονική" + +msgctxt "#30010" +msgid "High" +msgstr "Υψηλή" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Χρήση Σταθερού Αρχείου [ταχύτερη έναρξη]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.en_au/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.en_au/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.en_au/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.en_au/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/kodi-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detail [CPU intensive]" + +msgctxt "#30001" +msgid "Low" +msgstr "Low" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "High" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extreme" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervous Mode [more mode changes]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Speed [skip some frames]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Very Low" + +msgctxt "#30008" +msgid "Low" +msgstr "Low" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "High" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Use a Persistence File [faster startup]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.en_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.en_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.en_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.en_gb/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,67 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#settings labels + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "" + +msgctxt "#30001" +msgid "Low" +msgstr "" + +msgctxt "#30002" +msgid "Normal" +msgstr "" + +msgctxt "#30003" +msgid "High" +msgstr "" + +msgctxt "#30004" +msgid "Extreme" +msgstr "" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "" + +msgctxt "#30007" +msgid "Very Low" +msgstr "" + +msgctxt "#30008" +msgid "Low" +msgstr "" + +msgctxt "#30009" +msgid "Normal" +msgstr "" + +msgctxt "#30010" +msgid "High" +msgstr "" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.en_nz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.en_nz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.en_nz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.en_nz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/kodi-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detail [CPU intensive]" + +msgctxt "#30001" +msgid "Low" +msgstr "Low" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "High" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extreme" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervous Mode [more mode changes]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Speed [skip some frames]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Very Low" + +msgctxt "#30008" +msgid "Low" +msgstr "Low" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "High" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Use a Persistence File [faster startup]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.en_us/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.en_us/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.en_us/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.en_us/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United States) (http://www.transifex.com/projects/p/kodi-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detail [CPU intensive]" + +msgctxt "#30001" +msgid "Low" +msgstr "Low" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "High" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extreme" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervous Mode [more mode changes]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Speed [skip some frames]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Very Low" + +msgctxt "#30008" +msgid "Low" +msgstr "Low" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "High" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Use a Persistence File [faster startup]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.eo/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.eo/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.eo/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.eo/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/kodi-main/language/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Mia Filmoj/Gxenroj" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Nobla" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extreme" + +msgctxt "#30008" +msgid "Low" +msgstr "Mia Filmoj/Gxenroj" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Nobla" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.es_ar/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.es_ar/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.es_ar/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.es_ar/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/kodi-main/language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detalles [Alto uso de CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Min" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Alto" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extrema" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Modo nervioso [más cambios de modo]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Velocidad [saltea algunos cuadros]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Muy lenta" + +msgctxt "#30008" +msgid "Low" +msgstr "Min" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Alto" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Usar persistencia en archivo [arranque más rápido]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.es_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.es_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.es_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.es_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/kodi-main/language/es_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detalle [CPU intensivo]" + +msgctxt "#30001" +msgid "Low" +msgstr "Bajo" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Alto" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extremo" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Modo Nervioso [más cambios de modo]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Velocidad [saltarse algunos fotogramas]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Muy bajo" + +msgctxt "#30008" +msgid "Low" +msgstr "Bajo" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Alto" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Usar Archivo Persistente [inicio más rápido]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.es_mx/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.es_mx/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.es_mx/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.es_mx/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/kodi-main/language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detallado [Intensivo para CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Min" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Alta" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extrema" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Modo Nervioso [Mas cambios de modo]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Velocidad [saltar algunos cuadros]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Muy bajo" + +msgctxt "#30008" +msgid "Low" +msgstr "Min" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Alta" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Usar un archivo persistente [inicio más rápido]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.et_ee/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.et_ee/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.et_ee/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.et_ee/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/kodi-main/language/et_EE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et_EE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detailne [protsessorit koormav]" + +msgctxt "#30001" +msgid "Low" +msgstr "Madal" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normaalne" + +msgctxt "#30003" +msgid "High" +msgstr "Kõrge" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ülim" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Närviline režiim [rohkem režiimimuutusi]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Kiire [jäta mõned kaadrid vahele]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Väga madal" + +msgctxt "#30008" +msgid "Low" +msgstr "Madal" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normaalne" + +msgctxt "#30010" +msgid "High" +msgstr "Kõrge" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Kasuta püsivat faili [kiirem käivitamine]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.eu_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.eu_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.eu_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.eu_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,49 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Basque (Spain) (http://www.transifex.com/projects/p/kodi-main/language/eu_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Min" + +msgctxt "#30002" +msgid "Normal" +msgstr "Arrunta" + +msgctxt "#30003" +msgid "High" +msgstr "Handia" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extremoa" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Oso Baxua" + +msgctxt "#30008" +msgid "Low" +msgstr "Min" + +msgctxt "#30009" +msgid "Normal" +msgstr "Arrunta" + +msgctxt "#30010" +msgid "High" +msgstr "Handia" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fa_af/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fa_af/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fa_af/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fa_af/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Persian (Afghanistan) (http://www.transifex.com/projects/p/kodi-main/language/fa_AF/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_AF\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30002" +msgid "Normal" +msgstr "نورمال" + +msgctxt "#30009" +msgid "Normal" +msgstr "نورمال" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fa_ir/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fa_ir/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fa_ir/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fa_ir/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/kodi-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "جزئیات [مصرف زیاد زمان پردازنده]" + +msgctxt "#30001" +msgid "Low" +msgstr "کم" + +msgctxt "#30002" +msgid "Normal" +msgstr "نرمال" + +msgctxt "#30003" +msgid "High" +msgstr "زیاد" + +msgctxt "#30004" +msgid "Extreme" +msgstr "بی نهایت" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "حالت عصبی [تغییرات بیشتر حالت ها]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "سرعت [برخی از فریم ها حذف می شوند]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "خیلی کم" + +msgctxt "#30008" +msgid "Low" +msgstr "کم" + +msgctxt "#30009" +msgid "Normal" +msgstr "نرمال" + +msgctxt "#30010" +msgid "High" +msgstr "زیاد" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "از یک فایل دائمی استفاده شود [راه اندازی سریع تر]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fi_fi/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fi_fi/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fi_fi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fi_fi/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,49 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/kodi-main/language/fi_FI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi_FI\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Matala" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normaali" + +msgctxt "#30003" +msgid "High" +msgstr "Korkea" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Erittäin korkea" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Erittäin matala" + +msgctxt "#30008" +msgid "Low" +msgstr "Matala" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normaali" + +msgctxt "#30010" +msgid "High" +msgstr "Korkea" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fo_fo/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fo_fo/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fo_fo/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fo_fo/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Faroese (Faroe Islands) (http://www.transifex.com/projects/p/kodi-main/language/fo_FO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo_FO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Lágt" + +msgctxt "#30002" +msgid "Normal" +msgstr "Vanligt" + +msgctxt "#30003" +msgid "High" +msgstr "Høgt" + +msgctxt "#30008" +msgid "Low" +msgstr "Lágt" + +msgctxt "#30009" +msgid "Normal" +msgstr "Vanligt" + +msgctxt "#30010" +msgid "High" +msgstr "Høgt" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fr_ca/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fr_ca/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fr_ca/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fr_ca/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/kodi-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Détails [gourmand en ressources]" + +msgctxt "#30001" +msgid "Low" +msgstr "Bas" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normaux" + +msgctxt "#30003" +msgid "High" +msgstr "Élevés" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extrême" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Mode énervé [plus de changements de modes}" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Vitesse [saute des images]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Très basse" + +msgctxt "#30008" +msgid "Low" +msgstr "Basse" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normale" + +msgctxt "#30010" +msgid "High" +msgstr "Haute" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Utiliser un fichier de persistance [démarrage accéléré]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fr_fr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fr_fr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.fr_fr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.fr_fr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (France) (http://www.transifex.com/projects/p/kodi-main/language/fr_FR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_FR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Détail [gourmand en CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Min." + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Haute" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Excellente" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Mode nerveux [plus de changements de mode]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Vitesse [passer des images]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Très faible" + +msgctxt "#30008" +msgid "Low" +msgstr "Min." + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Haute" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Utiliser un fichier persistant [démarrage plus rapide]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.gl_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.gl_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.gl_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.gl_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Galician (Spain) (http://www.transifex.com/projects/p/kodi-main/language/gl_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detalle [uso intensivo da CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Baixo" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Alto" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extremo" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Modo Nervioso [máis trocos de modo]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Velocidade [omitir algúns fotogramas]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Moi Baixo" + +msgctxt "#30008" +msgid "Low" +msgstr "Baixo" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Alto" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Usar un Ficheiro Persistente [arranque rápido]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.he_il/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.he_il/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.he_il/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.he_il/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/kodi-main/language/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "פירוט [מעמיס על המעבד]" + +msgctxt "#30001" +msgid "Low" +msgstr "נמוך" + +msgctxt "#30002" +msgid "Normal" +msgstr "רגיל" + +msgctxt "#30003" +msgid "High" +msgstr "גבוה" + +msgctxt "#30004" +msgid "Extreme" +msgstr "קיצוני" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "מצב עצבני [יותר שינויי מצב]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "מהירות [מדלג על פריימים]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "נמוך מאוד" + +msgctxt "#30008" +msgid "Low" +msgstr "נמוך" + +msgctxt "#30009" +msgid "Normal" +msgstr "רגיל" + +msgctxt "#30010" +msgid "High" +msgstr "גבוה" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "השתמש בקובץ נתוני קול [הפעלה מהירה]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.hi_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.hi_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.hi_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.hi_in/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,49 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hindi (India) (http://www.transifex.com/projects/p/kodi-main/language/hi_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "लो" + +msgctxt "#30002" +msgid "Normal" +msgstr "सामान्य" + +msgctxt "#30003" +msgid "High" +msgstr "उच्च" + +msgctxt "#30004" +msgid "Extreme" +msgstr "चरम" + +msgctxt "#30007" +msgid "Very Low" +msgstr "बहुत कम" + +msgctxt "#30008" +msgid "Low" +msgstr "लो" + +msgctxt "#30009" +msgid "Normal" +msgstr "सामान्य" + +msgctxt "#30010" +msgid "High" +msgstr "उच्च" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.hr_hr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.hr_hr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.hr_hr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.hr_hr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Croatian (Croatia) (http://www.transifex.com/projects/p/kodi-main/language/hr_HR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr_HR\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Pojedinosti [CPU intenzivno]" + +msgctxt "#30001" +msgid "Low" +msgstr "Nisko" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normalno" + +msgctxt "#30003" +msgid "High" +msgstr "Visoko" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstremno" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervozan način [više promjena načina]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Brže [preskoči neke sličice]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Vrlo nisko" + +msgctxt "#30008" +msgid "Low" +msgstr "Nisko" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normalno" + +msgctxt "#30010" +msgid "High" +msgstr "Visoko" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Koristi stalnu datoteku [brže pokretanje]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.hu_hu/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.hu_hu/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.hu_hu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.hu_hu/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/kodi-main/language/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Részlet [CPU intenzív]" + +msgctxt "#30001" +msgid "Low" +msgstr "Min" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normál" + +msgctxt "#30003" +msgid "High" +msgstr "Magas" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extrém" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Ideges Mód [több mód váltakozik]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Sebesség [néhány képkocka átugrása]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Nagyon alacsony" + +msgctxt "#30008" +msgid "Low" +msgstr "Min" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normál" + +msgctxt "#30010" +msgid "High" +msgstr "Magas" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Tárolt fálj használata [gyorsabb indulás]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.hy_am/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.hy_am/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.hy_am/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.hy_am/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Armenian (Armenia) (http://www.transifex.com/projects/p/kodi-main/language/hy_AM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy_AM\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Ցածր" + +msgctxt "#30002" +msgid "Normal" +msgstr "Նորմալ" + +msgctxt "#30003" +msgid "High" +msgstr "Բարձր" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Եքստրեմալ" + +msgctxt "#30008" +msgid "Low" +msgstr "Ցածր" + +msgctxt "#30009" +msgid "Normal" +msgstr "Նորմալ" + +msgctxt "#30010" +msgid "High" +msgstr "Բարձր" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.id_id/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.id_id/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.id_id/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.id_id/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/kodi-main/language/id_ID/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id_ID\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detil [tingkat CPU tinggi]" + +msgctxt "#30001" +msgid "Low" +msgstr "Video/Aliran" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Tinggi" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstrim" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Modus Galau [lebih banyak perubahan modus]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Kecepatan [bisa melewatkan beberapa frame]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Sangat Lambat." + +msgctxt "#30008" +msgid "Low" +msgstr "Video/Aliran" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Tinggi" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Gunakan berkas yang menetap [lebih cepat dimulai]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.is_is/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.is_is/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.is_is/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.is_is/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Icelandic (Iceland) (http://www.transifex.com/projects/p/kodi-main/language/is_IS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is_IS\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Smáatriði [notar mikið af örgjörva]" + +msgctxt "#30001" +msgid "Low" +msgstr "Lágt" + +msgctxt "#30002" +msgid "Normal" +msgstr "Venjulegt" + +msgctxt "#30003" +msgid "High" +msgstr "Hátt" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Öfgakennt" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Taugaveiklað [skiptir oftar um ham]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Hraði [sleppir fleiri römmum]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Mjög lágt" + +msgctxt "#30008" +msgid "Low" +msgstr "Lágt" + +msgctxt "#30009" +msgid "Normal" +msgstr "Venjulegt" + +msgctxt "#30010" +msgid "High" +msgstr "Hátt" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Nota Þrautseigju skrá [hraðari ræsing]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.it_it/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.it_it/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.it_it/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.it_it/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/kodi-main/language/it_IT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it_IT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Dettagli [uso CPU intensivo]" + +msgctxt "#30001" +msgid "Low" +msgstr "Basso" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normale" + +msgctxt "#30003" +msgid "High" +msgstr "Alta" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Estremo" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Modalità Nervosa [altri cambi di modalità]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Velocità [salta più frame]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Molto bassa" + +msgctxt "#30008" +msgid "Low" +msgstr "Basso" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normale" + +msgctxt "#30010" +msgid "High" +msgstr "Alta" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Usa un file di persistenza [avvio più rapido]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ja_jp/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ja_jp/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ja_jp/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ja_jp/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/kodi-main/language/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "詳細 [CPU 周り]" + +msgctxt "#30001" +msgid "Low" +msgstr "低" + +msgctxt "#30002" +msgid "Normal" +msgstr "中" + +msgctxt "#30003" +msgid "High" +msgstr "高" + +msgctxt "#30004" +msgid "Extreme" +msgstr "最高" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "神経質モード [より多くのモード変更]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "速度 [フレームスキップ]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "最低" + +msgctxt "#30008" +msgid "Low" +msgstr "低" + +msgctxt "#30009" +msgid "Normal" +msgstr "中" + +msgctxt "#30010" +msgid "High" +msgstr "高" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "永続ファイルを使う [起動の高速化]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ko_kr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ko_kr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ko_kr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ko_kr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/kodi-main/language/ko_KR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko_KR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "자세히 [CPU 부하]" + +msgctxt "#30001" +msgid "Low" +msgstr "최저" + +msgctxt "#30002" +msgid "Normal" +msgstr "보통" + +msgctxt "#30003" +msgid "High" +msgstr "높음" + +msgctxt "#30004" +msgid "Extreme" +msgstr "최대" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "과민성 모드 [잦은 모드 변경]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "속도 [프레임 건너 뜀]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "매우 낮음" + +msgctxt "#30008" +msgid "Low" +msgstr "낮음" + +msgctxt "#30009" +msgid "Normal" +msgstr "보통" + +msgctxt "#30010" +msgid "High" +msgstr "높음" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "저장된 파일 사용[빠른 시작]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.lt_lt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.lt_lt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.lt_lt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.lt_lt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/kodi-main/language/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Išsamiau [CPU intensyvumas]" + +msgctxt "#30001" +msgid "Low" +msgstr "Žemas" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normalus" + +msgctxt "#30003" +msgid "High" +msgstr "Aukštas" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstremalus" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervingas režimas [daugiau režimo pakeitimų]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Greitas [praleisti kai kuriuos kadrus]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Labai žemas" + +msgctxt "#30008" +msgid "Low" +msgstr "Žemas" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normalus" + +msgctxt "#30010" +msgid "High" +msgstr "Aukštas" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Naudoti nuolatinį failą [greitesnis paleidimas]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.lv_lv/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.lv_lv/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.lv_lv/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.lv_lv/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/kodi-main/language/lv_LV/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv_LV\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detalizēts [noslogo CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Mazs" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normāls" + +msgctxt "#30003" +msgid "High" +msgstr "Liels" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstrēms" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervozs režīms [vairāk režīmu maiņas]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Ātrs [izlaiž dažus kadrus]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Ļoti mazs" + +msgctxt "#30008" +msgid "Low" +msgstr "Mazs" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normāls" + +msgctxt "#30010" +msgid "High" +msgstr "Liels" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Izmantot nemainīgu failu [uzsāk ātrāk]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.mi/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.mi/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.mi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.mi/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/kodi-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Hakahaka" + +msgctxt "#30002" +msgid "Normal" +msgstr "Pūnoa" + +msgctxt "#30003" +msgid "High" +msgstr "Teitei" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extreme" + +msgctxt "#30008" +msgid "Low" +msgstr "Hakahaka" + +msgctxt "#30009" +msgid "Normal" +msgstr "Pūnoa" + +msgctxt "#30010" +msgid "High" +msgstr "Teitei" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.mk_mk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.mk_mk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.mk_mk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.mk_mk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Macedonian (Macedonia) (http://www.transifex.com/projects/p/kodi-main/language/mk_MK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk_MK\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Детаљи [Го напрегаат процесорот]" + +msgctxt "#30001" +msgid "Low" +msgstr "Ниско" + +msgctxt "#30002" +msgid "Normal" +msgstr "Нормално" + +msgctxt "#30003" +msgid "High" +msgstr "Високо" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Екстремно" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Енергичен Режим [почести режимни промени]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Брзински [прескокнува кадри]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Многу ниско" + +msgctxt "#30008" +msgid "Low" +msgstr "Ниско" + +msgctxt "#30009" +msgid "Normal" +msgstr "Нормално" + +msgctxt "#30010" +msgid "High" +msgstr "Високо" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Користи фајл за зачувување [побрзо пуштање]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.mn_mn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.mn_mn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.mn_mn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.mn_mn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Mongolian (Mongolia) (http://www.transifex.com/projects/p/kodi-main/language/mn_MN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mn_MN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Бага" + +msgctxt "#30003" +msgid "High" +msgstr "Өндөр" + +msgctxt "#30008" +msgid "Low" +msgstr "Бага" + +msgctxt "#30010" +msgid "High" +msgstr "Өндөр" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ms_my/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ms_my/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ms_my/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ms_my/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/kodi-main/language/ms_MY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms_MY\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Terperinci [Banyak guna CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Rendah" + +msgctxt "#30002" +msgid "Normal" +msgstr "Biasa" + +msgctxt "#30003" +msgid "High" +msgstr "Tinggi" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstrim" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Mod Kejutan [lagi perubahan mod]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Kelajuan [langkau beberapa bingkai]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Sangat Perlahan" + +msgctxt "#30008" +msgid "Low" +msgstr "Rendah" + +msgctxt "#30009" +msgid "Normal" +msgstr "Biasa" + +msgctxt "#30010" +msgid "High" +msgstr "Tinggi" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Guna Fail Keterusan [permulaan lebih pantas]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.mt_mt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.mt_mt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.mt_mt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.mt_mt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Maltese (Malta) (http://www.transifex.com/projects/p/kodi-main/language/mt_MT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mt_MT\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Filmati/Generi" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normali" + +msgctxt "#30003" +msgid "High" +msgstr "Filmati/Atturi" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Estrem" + +msgctxt "#30008" +msgid "Low" +msgstr "Filmati/Generi" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normali" + +msgctxt "#30010" +msgid "High" +msgstr "Filmati/Atturi" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.my_mm/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.my_mm/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.my_mm/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.my_mm/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/kodi-main/language/my_MM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my_MM\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "Low" +msgstr "အနိမ့်စား" + +msgctxt "#30002" +msgid "Normal" +msgstr "ပုံမှန်" + +msgctxt "#30003" +msgid "High" +msgstr "အမြင့်စား" + +msgctxt "#30008" +msgid "Low" +msgstr "အနိမ့်စား" + +msgctxt "#30009" +msgid "Normal" +msgstr "ပုံမှန်" + +msgctxt "#30010" +msgid "High" +msgstr "အမြင့်စား" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.nb_no/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.nb_no/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.nb_no/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.nb_no/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/kodi-main/language/nb_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detaljnivå" + +msgctxt "#30001" +msgid "Low" +msgstr "Lavt" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normalt" + +msgctxt "#30003" +msgid "High" +msgstr "Høyt" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstremt" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Rastløsmodus (flere modusskifter)" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Hastighet (hopper over noen bilder)" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Veldig Lav" + +msgctxt "#30008" +msgid "Low" +msgstr "Lav" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Høy" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Benytt en oppstartsfil (for raskere oppstart)" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.nl_nl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.nl_nl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.nl_nl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.nl_nl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/kodi-main/language/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detail [CPU intensief]" + +msgctxt "#30001" +msgid "Low" +msgstr "Min" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normaal" + +msgctxt "#30003" +msgid "High" +msgstr "Hoog" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extreem" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nerveuze modus [meer modus veranderingen]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Snelheid [sla sommige frames over]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Heel laag" + +msgctxt "#30008" +msgid "Low" +msgstr "Min" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normaal" + +msgctxt "#30010" +msgid "High" +msgstr "Hoog" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Gebruik een Persistent bestand [snellere opstart]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.pl_pl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.pl_pl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.pl_pl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.pl_pl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/kodi-main/language/pl_PL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Szczegółowe [obciąża procesor]" + +msgctxt "#30001" +msgid "Low" +msgstr "Niski" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normalny" + +msgctxt "#30003" +msgid "High" +msgstr "Wysoki" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Maksymalny" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Tryb mocny [więcej zmian trybów]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Szybkość [pomija niektóre klatki]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Bardzo niskie" + +msgctxt "#30008" +msgid "Low" +msgstr "Niski" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normalny" + +msgctxt "#30010" +msgid "High" +msgstr "Wysoki" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Zapisuj do pliku [szybsze uruchomienie]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.pt_br/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.pt_br/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.pt_br/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.pt_br/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/kodi-main/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detalhado [Intensivo uso de CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Baixo" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Alto" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extrema" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Modo Nervoso [mais mudanças do modo]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Velocidade [mantenha alguns frames]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Muito Baixo" + +msgctxt "#30008" +msgid "Low" +msgstr "Baixo" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Alto" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Use um arquivo de persistência [inicialização mais rápida]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.pt_pt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.pt_pt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.pt_pt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.pt_pt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/kodi-main/language/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detalhado [uso intensivo de CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Baixa" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Alta" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Máxima" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Modo Nervoso [mais alterações do modo]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Velocidade [omitir algumas frames]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Mínima" + +msgctxt "#30008" +msgid "Low" +msgstr "Baixa" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Alta" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Usar um Ficheiro Persistente [início mais rápido]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ro_ro/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ro_ro/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ro_ro/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ro_ro/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Romanian (Romania) (http://www.transifex.com/projects/p/kodi-main/language/ro_RO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro_RO\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detaliat [folosește intensiv procesorul]" + +msgctxt "#30001" +msgid "Low" +msgstr "Minim" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Înalt" + +msgctxt "#30004" +msgid "Extreme" +msgstr "extremă" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Viteză [omite unele cadre]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Foarte scăzut" + +msgctxt "#30008" +msgid "Low" +msgstr "Minim" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Înalt" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Folosește fișier de persistență [pornire mai rapidă]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ru_ru/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ru_ru/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ru_ru/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ru_ru/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/kodi-main/language/ru_RU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru_RU\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Подробно [Нагрузка на процессор]" + +msgctxt "#30001" +msgid "Low" +msgstr "Мин." + +msgctxt "#30002" +msgid "Normal" +msgstr "Нормальное" + +msgctxt "#30003" +msgid "High" +msgstr "Макс." + +msgctxt "#30004" +msgid "Extreme" +msgstr "Максимальное" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Нервный режим [больше изменений режима]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Скорость [пропускать некоторые кадры]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Очень медленно" + +msgctxt "#30008" +msgid "Low" +msgstr "Мин." + +msgctxt "#30009" +msgid "Normal" +msgstr "Нормальное" + +msgctxt "#30010" +msgid "High" +msgstr "Макс." + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Использовать файл сохранения состояния [быстрее запуск]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.si_lk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.si_lk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.si_lk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.si_lk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/kodi-main/language/si_LK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: si_LK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "අඩු" + +msgctxt "#30002" +msgid "Normal" +msgstr "සාමාන්‍ය " + +msgctxt "#30003" +msgid "High" +msgstr "ඉහළ" + +msgctxt "#30004" +msgid "Extreme" +msgstr "අත්‍යන්ත " + +msgctxt "#30008" +msgid "Low" +msgstr "අඩු" + +msgctxt "#30009" +msgid "Normal" +msgstr "සාමාන්‍ය " + +msgctxt "#30010" +msgid "High" +msgstr "ඉහළ" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sk_sk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sk_sk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sk_sk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sk_sk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/kodi-main/language/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detailný [náročný na CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Nízky" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normálny" + +msgctxt "#30003" +msgid "High" +msgstr "Vysoký" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extrémnz" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervózny režim [viac zmien módov]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Rýchlosť [vynechať niektoré snímky]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Veľmi nízky" + +msgctxt "#30008" +msgid "Low" +msgstr "Nízky" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normálny" + +msgctxt "#30010" +msgid "High" +msgstr "Vysoký" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Použiť trvalý súbor [rýchlejší štart]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sl_si/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sl_si/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sl_si/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sl_si/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/kodi-main/language/sl_SI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl_SI\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Podrobno [CPU zahtevno]" + +msgctxt "#30001" +msgid "Low" +msgstr "Nizko" + +msgctxt "#30002" +msgid "Normal" +msgstr "Običajno" + +msgctxt "#30003" +msgid "High" +msgstr "Visoko" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstremno" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Živčni način [več sprememb]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Hitrost [preskoči nekaj sličic]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Zelo nizko" + +msgctxt "#30008" +msgid "Low" +msgstr "Nizko" + +msgctxt "#30009" +msgid "Normal" +msgstr "Običajno" + +msgctxt "#30010" +msgid "High" +msgstr "Visoko" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Uporabi stalno datoteko [hitrejši zagon]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sq_al/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sq_al/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sq_al/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sq_al/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Albanian (Albania) (http://www.transifex.com/projects/p/kodi-main/language/sq_AL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq_AL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Poshtë" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Lartë" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstrem" + +msgctxt "#30008" +msgid "Low" +msgstr "Poshtë" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Lartë" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sr_rs/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sr_rs/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sr_rs/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sr_rs/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Serbian (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Мин." + +msgctxt "#30002" +msgid "Normal" +msgstr "Нормално" + +msgctxt "#30003" +msgid "High" +msgstr "Висок" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Екстремно" + +msgctxt "#30008" +msgid "Low" +msgstr "Мин." + +msgctxt "#30009" +msgid "Normal" +msgstr "Нормално" + +msgctxt "#30010" +msgid "High" +msgstr "Висок" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sr_rs@latin/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sr_rs@latin/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sr_rs@latin/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sr_rs@latin/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Serbian (Latin) (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS@latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Min." + +msgctxt "#30002" +msgid "Normal" +msgstr "Normalno" + +msgctxt "#30003" +msgid "High" +msgstr "Visok" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ekstremno" + +msgctxt "#30008" +msgid "Low" +msgstr "Min." + +msgctxt "#30009" +msgid "Normal" +msgstr "Normalno" + +msgctxt "#30010" +msgid "High" +msgstr "Visok" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sv_se/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sv_se/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.sv_se/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.sv_se/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/kodi-main/language/sv_SE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv_SE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Detalj [CPU-intensiv]" + +msgctxt "#30001" +msgid "Low" +msgstr "Låg" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Hög" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extrem" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nervöst läge [fler lägesbyten]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Snabb [hoppar över några bildrutor]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Väldigt låg" + +msgctxt "#30008" +msgid "Low" +msgstr "Låg" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Hög" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Använd en statisk fil (snabbare uppstart)" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.szl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.szl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.szl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.szl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Silesian (http://www.transifex.com/projects/p/kodi-main/language/szl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: szl\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Akuratne [Zebiurŏ procesōr]" + +msgctxt "#30001" +msgid "Low" +msgstr "min." + +msgctxt "#30002" +msgid "Normal" +msgstr "Normalne" + +msgctxt "#30003" +msgid "High" +msgstr "maks." + +msgctxt "#30004" +msgid "Extreme" +msgstr "Nŏjwyższŏ" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Nerwowe tryb [winycyj pōmiynianiŏ trybōw]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Szwōng [przeskacz pŏrã klŏtek]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Fest poleku" + +msgctxt "#30008" +msgid "Low" +msgstr "min." + +msgctxt "#30009" +msgid "Normal" +msgstr "Normalne" + +msgctxt "#30010" +msgid "High" +msgstr "maks." + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Używej trwałygo zbioru [warcij sztartuje]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ta_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ta_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.ta_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.ta_in/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/kodi-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "குறைவு" + +msgctxt "#30002" +msgid "Normal" +msgstr "வழக்கமான" + +msgctxt "#30003" +msgid "High" +msgstr "அதிகம்" + +msgctxt "#30004" +msgid "Extreme" +msgstr "தீவிரம்" + +msgctxt "#30008" +msgid "Low" +msgstr "குறைவு" + +msgctxt "#30009" +msgid "Normal" +msgstr "வழக்கமான" + +msgctxt "#30010" +msgid "High" +msgstr "அதிகம்" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.tg_tj/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.tg_tj/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.tg_tj/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.tg_tj/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tajik (Tajikistan) (http://www.transifex.com/projects/p/kodi-main/language/tg_TJ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg_TJ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Тафсил [CPU бошиддат]" + +msgctxt "#30001" +msgid "Low" +msgstr "Паст" + +msgctxt "#30002" +msgid "Normal" +msgstr "Оддӣ" + +msgctxt "#30003" +msgid "High" +msgstr "Баланд" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Ниҳоят" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Ҳолати беқарор [бештар тағйироти ҳолат]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Суръат [гузаронидани баъзе кадрҳо]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Хеле суст" + +msgctxt "#30008" +msgid "Low" +msgstr "Паст" + +msgctxt "#30009" +msgid "Normal" +msgstr "Оддӣ" + +msgctxt "#30010" +msgid "High" +msgstr "Баланд" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Истифодаи файли суботкорӣ [оғози тезкор]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.th_th/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.th_th/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.th_th/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.th_th/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,53 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/kodi-main/language/th_TH/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th_TH\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "Low" +msgstr "ต่ำ" + +msgctxt "#30002" +msgid "Normal" +msgstr "ปกติ" + +msgctxt "#30003" +msgid "High" +msgstr "สูง" + +msgctxt "#30004" +msgid "Extreme" +msgstr "สูงสุด" + +msgctxt "#30007" +msgid "Very Low" +msgstr "ต่ำมาก" + +msgctxt "#30008" +msgid "Low" +msgstr "ต่ำ" + +msgctxt "#30009" +msgid "Normal" +msgstr "ปกติ" + +msgctxt "#30010" +msgid "High" +msgstr "สูง" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "ใช้ไฟล์มาตรฐาน [บูธเร็วขึ้น]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.tr_tr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.tr_tr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.tr_tr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.tr_tr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/kodi-main/language/tr_TR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr_TR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Ayrıntı [Yoğun CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Düşük" + +msgctxt "#30002" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30003" +msgid "High" +msgstr "Yüksek" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Extreme" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Gergin Mod [daha fazla mod değişiklikleri]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Hız [bazı kareleri atla]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Çok Düşük" + +msgctxt "#30008" +msgid "Low" +msgstr "Düşük" + +msgctxt "#30009" +msgid "Normal" +msgstr "Normal" + +msgctxt "#30010" +msgid "High" +msgstr "Yüksek" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Kalıcı Dosya Kullan [daha hızlı başlangıç]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.uk_ua/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.uk_ua/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.uk_ua/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.uk_ua/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/kodi-main/language/uk_UA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk_UA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Детальний [Інтенсивне використання процесору]" + +msgctxt "#30001" +msgid "Low" +msgstr "Низька" + +msgctxt "#30002" +msgid "Normal" +msgstr "Нормальна" + +msgctxt "#30003" +msgid "High" +msgstr "Висока" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Максимальна" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "Нервова режим [більше змін в налаштуваннях]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Швидкий [пропускати деякі кадри]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Дуже Низька" + +msgctxt "#30008" +msgid "Low" +msgstr "Низька" + +msgctxt "#30009" +msgid "Normal" +msgstr "Нормальне" + +msgctxt "#30010" +msgid "High" +msgstr "Висока" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Використовувати Файл Стабілізації [швидше завантаження]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.uz_uz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.uz_uz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.uz_uz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.uz_uz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Uzbek (Uzbekistan) (http://www.transifex.com/projects/p/kodi-main/language/uz_UZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz_UZ\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Past" + +msgctxt "#30003" +msgid "High" +msgstr "Yuqori" + +msgctxt "#30008" +msgid "Low" +msgstr "Past" + +msgctxt "#30010" +msgid "High" +msgstr "Yuqori" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.vi_vn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.vi_vn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.vi_vn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.vi_vn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/kodi-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "Chi tiết [thông số CPU]" + +msgctxt "#30001" +msgid "Low" +msgstr "Thấp" + +msgctxt "#30002" +msgid "Normal" +msgstr "Bình thường" + +msgctxt "#30003" +msgid "High" +msgstr "Cao" + +msgctxt "#30004" +msgid "Extreme" +msgstr "Tối đa" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "Tăng tốc [Bỏ qua một số khung hình]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "Rất thấp" + +msgctxt "#30008" +msgid "Low" +msgstr "Thấp" + +msgctxt "#30009" +msgid "Normal" +msgstr "Bình thường" + +msgctxt "#30010" +msgid "High" +msgstr "Cao" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "Dùng tệp tin cố định [tăng tốc khởi động]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.zh_cn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.zh_cn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.zh_cn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.zh_cn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/kodi-main/language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Detail [CPU intensive]" +msgstr "详细 [CPU 加强型]" + +msgctxt "#30001" +msgid "Low" +msgstr "低" + +msgctxt "#30002" +msgid "Normal" +msgstr "正常" + +msgctxt "#30003" +msgid "High" +msgstr "高" + +msgctxt "#30004" +msgid "Extreme" +msgstr "极好" + +msgctxt "#30005" +msgid "Nervous Mode [more mode changes]" +msgstr "紧张模式 [更多模式的变化]" + +msgctxt "#30006" +msgid "Speed [skip some frames]" +msgstr "快速 [跳过某些帧]" + +msgctxt "#30007" +msgid "Very Low" +msgstr "极低" + +msgctxt "#30008" +msgid "Low" +msgstr "低" + +msgctxt "#30009" +msgid "Normal" +msgstr "正常" + +msgctxt "#30010" +msgid "High" +msgstr "高" + +msgctxt "#30011" +msgid "Use a Persistence File [faster startup]" +msgstr "使用持久性文件 [快速启动]" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.zh_tw/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.zh_tw/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/language/resource.language.zh_tw/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/language/resource.language.zh_tw/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: FishBMC +# Addon id: visualization.fishbmc +# Addon Provider: 26elf +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/kodi-main/language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "Low" +msgstr "低溫" + +msgctxt "#30002" +msgid "Normal" +msgstr "一般" + +msgctxt "#30003" +msgid "High" +msgstr "高溫" + +msgctxt "#30004" +msgid "Extreme" +msgstr "最高" + +msgctxt "#30008" +msgid "Low" +msgstr "低溫" + +msgctxt "#30009" +msgid "Normal" +msgstr "一般" + +msgctxt "#30010" +msgid "High" +msgstr "高溫" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/settings.xml kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/settings.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.fishbmc/resources/settings.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.fishbmc/resources/settings.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,7 @@ + + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/addon.xml kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/addon.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/addon.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,124 @@ + + + + + Visualisering wys a roterende 3D Spektrum Analiseerder + عارض يظهر طيف محلل دوري ثلاثي الأبعاد + Visualisation showing a rotating 3D Spectrum Analyzer + Визуализация представяща ротиращ се 3D спектрален анализатор + Visualització mostrant un analitzador d'espectre giratori 3D + Vizualizace zobrazující rotující 3D spektrální analyzátor + Delewddu'n dangos Dadansoddwr Sbectrwm 3D sy'n troi + Visualisering der viser en roterende 3D-spektrumanalyse + Diese Visualisierung zeigt eine rotierende Spektrum Analyse in 3D + Οπτικοποίηση που εμφανίζει έναν περιστρεφόμενο τρισδιάστατο Αναλυτή Φάσματος + Visualisation showing a rotating 3D Spectrum Analyser + Visualisation showing a rotating 3D Spectrum Analyser + Visualisation showing a rotating 3D Spectrum Analyser + Visualization showing a rotating 3D Spectrum Analyzer + Visualización que muestra un analizador de espectro en 3D girando + Visualización que muestra un analizador de espectro en 3D girando + Visualización que muestra un Analizador de Espectro giratorio 3D + Visuaal, mis näitab pöörlevat 3D spektraalanalüüsi + 3D espektro analizatzaile bat biraka erakusten duen bistaratzea + این مجسم ساز یک آنالیز چرخنده طیفی را به شکل 3 بعدی نمایش می دهد. + Pyörivä 3D-spektrianalysaattori + Visualisation affichant un analyseur de spectre 3D en rotation + Visualisation affichant un analyseur de spectre 3D en rotation + Visualización que amosa un analizador de espectro virando en 3D + חיזוי המציג סיבובי נתח תדרים תלת מימדי מסתובב + Vizualizacija koja prikazuje rotirajući 3D spektralni analizator + Vizualizáció 3D spektrum analizátorral + Visualisasi memperlihatkan Spektrum Analyzer 3D yang berputar + Myndskreyting sem sýnir þrívíddar rófgreini + La visualizzazione mostra un analizzatore di spettro 3D rotante + 回転する 3D スペクトラムアナライザーを表示するビジュアライザー + 회전하는 3D 스펙트럼 분석기를 보여지는 음악시각화 + Vizualizacija rodo rotacinis 3D spektro analizatorių + Vizualizācija, kas attēlo rotējošu 3D spektra analizatoru + Визуализација која покажува ротирачки 3Д анализатор на спектар + Pengvisualan menunjukkan Penganalisis Spektrum 3D yang berputar + လည်ပတ်နေသော 3D Spectrum Analyzer ဖန်တီး ပြနေသည် + Visualisering som viser en roterende 3D-spektrumanalysator + DirectX-visualisatie die een roterende 3D-spectrumanalyse weergeeft + Wizualizacja wyświetlająca obracający się 3 wymiarowy Analizator Widma Akustycznego + Visualização que mostra um analisador espectral rotativo em 3D + Visualização que mostra um analisador espectral rotativo em 3D + Vizualizare cu afișarea unui analizor de spectru 3D rotativ + Визуализация, показывающая вращающийся трёхмерный анализатор спектра + Vizualizácia zobrazujúca rotujúci 3D spektrálny analyzátor + Vizualizacija, ki prikazuje vrtečo 3D spektralno analizo + Vizualizim që tregon një Analizor + Visualisering som visar en roterande 3D-spektrumanalysator + Таҷассум бо намоиши таҳлили спектри 3D-и даврзананда + การแสดงแสงสี ทำให้เห็นการหมุนแบบ 3 มิติ ของการวิเคราะห์คลื่นความถี่เสียง + Görsel öğe dönen bir 3 Boyutlu Spektrum Analizör göstermektedir + Візуалізація що показує обертаючийся 3D спектроаналізатор. + Trình diễn đồ họa hình ảnh xoay liên tục về 3D Spectrum Analyzer + 显示旋转三维频谱分析图像的可视化效果 + 顯示旋轉的3D頻譜分析視覺效果 + Opengl Spectrum is 'n Visualisering wat 'n roterende 3D Spektrum Analiseerder, verbeeld met Opengl, vertoon wat op die maat van die musiek beweeg en 'n golf effek oor die spektrum rooster skep. Dit het ook verstellings vir die aanpas van spektrum staaf hoogte, sy spoed, en hoe die stawe verbeeld word (solied, punte, draad raamwerk) en is 'n lekker ligte, lae cpu verbruik visualisering wat fantasties lyk + طيف Opengl هو تحليل بصري متحرك ثلاثي الابعاد للموسيقى! يتحرك بواسطة يرنامج Opengl على وزن الموسيقى في شكل موجة. توجد ايضا اعدادات لتعديل شبكة الطيف من حيث طول الاعمدة, سرعتها, وحتى شكلها (صلبة, نقاط, اسلاك) تعمل هذة بحمل خفيف, ومعالجة cpu ضئيلة لكنها تبدو رائعة + Opengl Spectrum is a Visualisation showing a rotating 3D Spectrum Analyzer rendered in Opengl that moves to the beat of the music creating a wave effect across the spectrum grid. It also has settings to adjust the spectrum bar height, Its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low cpu useage visualisation that looks great + Opengl Spectrum е визуализация изобразяваща въртящ се 3D спектрален анализатор (изчертаването се извършва с Opengl). Въртенето е под ритъма на музиката и предизвиква вълнови ефект по спектрална решетка. Можете да настройвате височината на спектралните стълбове, скоростта и това как се изчертават стълбовете – плътни, с точки, с решетка. Характеризира се с отличен вид, като същевременно почти не натоварва централния процесор. + OpenGL Spectrum és una visualització que mostra un analitzador d'espectre giratori en 3D renderitzat amb OpenGL que es mou al ritme de la música creant un efecte d'ona al llarg de la graella de l'espectre.⏎ També té opcions per ajustar l'alçada de la barra de l'espectre, la seva velocitat, i com es renderitzen les barres (sòlid, punts, malla de filferro). Una visualització que utilitza poca CPU i que és veu molt bé. + Opengl Spectrum je vizualizace zobrazující rotující 3D spektrální analyzátor rendrovaný v OpenGL, který se pohybuje v rytmu hudby a vytváří vlnový efekt napříč spektrální mřížkou. Obsahuje také nastavení pro přizpůsobení výšky sloupců spektra, rychlosti a způsobu vykreslení (vyplněný, body, drátový model). Je to velmi lehká vizualizace s nízkou zátěží CPU, která vypadá skvěle. + Mae DirectX Spectrum yn ddelweddiad sy'n dangos Dadansoddwr Sbectrwm 3D sydd wedi ei lunio gan DirectX sy'n symud i guriad cerddoriaeth gan greu effaith tonnog ar draws y grid sbectrwm. Mae ganddo osodiadau i newid uchder y bar sbectrwm, ei gyflymder a sut mae'r bariau'n cael eu llunio (solet, pwyntiau, ffrâm weiren). Mae'n ddelweddiad ysgafn sydd dim yn defnyddio llawer o'r prosesydd ac yn edrych yn dda + OpenGL-spektrum er en visualisering, der viser en roterende 3D-spektrumanalysator renderet i DirectX, som bevæger sig i takt til musikken og skaber en bølgeeffekt på tværs af spektrumfeltet. Den har også indstillinger til at justere spektrumliniens højde, fart og hvordan den bliver renderet (fast, punkter, trådramme). Det er en letvægtsvisualisering med lavt CPU-forbrug, som ser godt ud. + Opengl Spectrum ist eine Visualisierung, die eine rotierende Spektrum Analyse in 3D zeigt. Die Visualisierung wird so gerendert, dass sie sich zum Takt der Musik bewegt und eine Welle über das Spektrum Grid legt. Es lässt sich neben der Höhe, die Geschwindigkeit als auch die Art der Balken (durchgehend, Punkte, Drahtgeflecht) einstellen. Eine schöne Visualisierung, die nur eine geringe CPU-Last erzeugt + Το Opengl Spectrum είναι μία Οπτικοποίηση που εμφανίζει έναν περιστρεφόμενο τρισδιάστατο Αναλυτή Φάσματος που αποδίδεται μέσω Opengl και κινείται στο ρυθμό της μουσικής δημιουργώντας ένα κυματικό εφέ κατά μήκος του φασματικού πλέγματος. Διαθέτει ρυθμίσεις για τον ορισμό του ύψους των στηλών του φάσματος, του τρόπου απόδοσης των στηλών (συμπαγείς, σημειακές, συρματόπλεγμα), και είναι μία ελαφριά, εμφανίσιμη και χαμηλής υπολογιστικής ισχύος οπτικοποίηση + OpenGL Spectrum is a Visualisation showing a rotating 3D Spectrum Analyser rendered in OpenGL that moves to the beat of the music creating a wave effect across the spectrum grid. It also has settings to adjust the spectrum bar height, its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low cpu usage visualisation that looks great + OpenGL Spectrum is a Visualisation showing a rotating 3D Spectrum Analyser rendered in OpenGL that moves to the beat of the music creating a wave effect across the spectrum grid. It also has settings to adjust the spectrum bar height, its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low cpu usage visualisation that looks great + OpenGL Spectrum is a Visualisation showing a rotating 3D Spectrum Analyser rendered in OpenGL that moves to the beat of the music creating a wave effect across the spectrum grid. It also has settings to adjust the spectrum bar height, its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low cpu usage visualisation that looks great + OpenGL Spectrum is a Visualization showing a rotating 3D Spectrum Analyzer rendered in OpenGL that moves to the beat of the music creating a wave effect across the spectrum grid. It also has settings to adjust the spectrum bar height, Its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low CPU usage visualization that looks great + OpenGL Spectrum es una visualización que muestra un analizador de espectro en 3D girando, renderizado con OpenGL, que se mueve al ritmo de la música creando un efecto de onda en la rejilla del espectro. Se puede ajustar la altura de las barras, su velocidad, y como son renderizadas (sólido, puntos, malla). Es una visualización que utiliza poca CPU y muy agradable. + OpenGL Spectrum es una visualización que muestra un analizador de espectro en 3D girando renderizado con OpenGL que se mueve al ritmo de la música creando un efecto de onda en la rejilla del espectro. Se puede ajustar la altura de las barras, su velocidad, y como son renderizadas (sólido, puntos, malla). Es una visualización que utiliza poca CPU y es muy agradable. + Espectro Opengl es una Visualización que muestra un Analizador de Especto en 3D rotando renderizado en Opengl que se mueve al ritmo de la música creando un efecto de onda a través del espectro de la red. También tiene configuraciones para ajustar la altura de la barra de espectro, su velocidad, y cómo las barras son renderizadas (sólidas, puntos, malla de alambre) y es una buena visualización liviana, de poco uso de cpu que se ve genial. + OpenGL Spectrum on visuaal, mis näitab 3D spektraalanalüüsi renderdatud OpenGL'is, mis liigub liigub muusika rütmis luues laineefekti üle spektraalvõrgustiku. Lisaks on olemas ka võimalus seadistada spektri kõrgust, selle kiirust ja kuidas ribasid renderdatakse (tahkis, punktid, sõrestik). Opengl Spectrum on hea väljanägemisega kerge ja vähese protsessorikasutusega visuaal. + OpenGL Spectrum-ek OpenGL bitartez errenderizatutako birakako 3D Espektro Analizagailu bat erakusten du; musikaren erritmoaren arabera mugitzen da uhin baten efektua sortuz saretaren espektroan zehar. Era berean, hainbat ezarpen dauzka espektroaren altuera, abiadura eta barrak errenderizatzen diren (solidoa, puntuak, harien markoa) modua doitzeko. Era berean, itxura oneko, arina den eta cpu gutxi erabiltzen duen bisualizazio bat da + OpenGL Spectrum مجسم سازی است که یک آنالیز چرخنده طیفی را به شکل 3D نمایش می دهد. تصویر همراه با ضرباهنگ موسیقی حرکت می کند و یک موج بر روی شبکه طیفی نمایش می دهد. امکان تغییر ارتفاع، سرعت و شکل ستون ها (تصویر کامل، نقطه چین، مدل سیمی) در برنامه موجود است. یک مجسم ساز واقعا زیبا، که زمان کمی را از پردازنده می طلبد. + Näyttää pyörivän 3D-spektrianalysaattorin, joka liikkuu musiikin tahdissa tuottaen aaltotehosteen spektrikuvaajaan. Spektripalkin korkeuden, nopeuden, ja piirtotavan (täytetyt, pisteet, ääriviivat) voi asettaa asetuksista. Spectrum on kevyt visualisointi joka näyttää hyvältä. + Opengl Spectrum est une visualisation affichant un analyseur de spectre 3D en rotation, rendue en DirectX, qui se déplace au gré du rythme de la musique tout en créant un effet d'onde sur toute la grille du spectre. Elle offre aussi des paramètres pour ajuster la hauteur des barres du spectre, sa vitesse et comment les barres sont rendues (plein, points, fil de fer). C'est une visualisation légère, frugale et visuellement attirante. + Opengl Spectrum est une visualisation affichant un analyseur de spectre 3D en rotation, sous Opengl. Il réagit au rythme de la musique, créant un effet d'onde sur la grille du spectre. Il propose divers paramètres pour ajuster la hauteur, la vitesse, et le rendu des barres du spectre (plein, points, fil de fer). Une visualisation légère, peu gourmande en CPU et agréable à regarder. + Opengl Spectrum é unha Visualización que amosa un analizador de espectro virando en 3D renderizado con OpenGL que se move ó ritmo da música creando un efecto de onde ó longo da grella do espectro. Tamén ten opcións para axustar a altura da barra, a velocidade e como se renderizan as barras (sólidas, puntos, malla) do espectro. É bonito, lixeiro, de baixo custo en CPU. + החיזוי Opengl Spectrum מציג נתח תדרים תלת מימדי מסתובב שזז בקצב המוזיקה ויוצר אפקט גל על פני ציר התדר. קיימת אפשרות גם להגדיר את הגובה האנכי, את המהירות, ואופן העיבוד הגרפי (מלא, נקודות, מסגרת קווית) וזהו חיזוי נחמד וקליל שלא מעמיס על המעבד ונראה נהדר. + Opengl Spectrum je vizualizacija koja prikazuje rotirajući 3D spektralni analizator prikazan u Opengl-u koji se pokreće u ritmu glazbe stvarajući efekt valova u spektralnoj mreži. Također sadrži i postavke za namještanje visine sprektralnih traka, njihove brzine, i načina na koji su prikazane (popunjeno, točke, žičani okvir). Vizualizacija izgleda sjajno te je malih memorijskih i CPU zahtjeva. + Az Opengl Spectrum egy olyan vizualizáció ami egy 3D hang spektrum analizátort mutat Opengl segítségével megjelenítve, ami a zene ritmusára mozog egy hullám-effektust képezve a teljes spektrumhálón. Beállítható a spektrum oszlopok magassága, mozgási sebessége és hogy az oszlopok hogyan jelenjenek meg (teli, pontok, drótváz). Ez egy kis erőforrásigényű vizualizáció ami nagyon jól mutat. + OpenGL Spectrum merupakan visualisasi yang memperlihatkan Spektrum Analyzer 3D yang berputar yang dirender pada OpenGL yang bergerak mengikuti hentakan musik dan mencipkatan efek gelombang sepanjang kisi spektrum. Juga diatur untuk menyesuaikan tinggi bar, kecepatan, dan bagaimana bar dirender (solid, poin, wire frame) dan cukup ringan, rendah pemakaian cpu yang keren!!! + Opengl Spectrum er myndskreyting sem sýnir þrívíddar rófgreini sem snýst sem er teiknaður í Opengl og hreyfist í takt við tónlistina sem myndar bylgjuhreyfingu yfir rófið. Það er líka hægt að stilla hæð mælingana, hraða og hvernig þær eru teiknaðar (fyllt, punktar, útlínur) myndskrytingin setur lítið álag á örgjörva og lítur vel út + Opengl Spectrum è una visualizzazione che mostra un analizzatore di spettro renderizzato in Opengl che si muove a tempo di musica creando un effetto onda attraverso la griglia. E' possibile regolare varie impostazioni: l'altezza delle barre, la velocità di risposta e come le barre sono renderizzate (piene, con punti o con righe). E' una visualizzazione rilassante e con basso uso del processore. + OpenGL スペクトラムは回転する 3D スペクトラムアナライザーを表示する OpenGL ビジュアライザーで、音楽のビートに合わせてスペクトラムの波形エフェクトを作成します。 バーの高さ、表示時間、バーの表示モード (ソリッド、ポイント、ワイヤーフレーム)を設定でき、軽量なCPU使用率でグレイトなビジュアライザーです。 + Opengl 스펙트럼은 회전하는 3D 스펙트럼 분석기를 통해 음악시각화를 보여주며 음악의 비트가 만들어내는 웨이브 효과를 스펙트럼 그리드에 보여줍니다. 설정에서 스펙트럼 바의 높이, 속도, 바의 갯수 (채워짐, 점, 와이어 프레임)를 지정할수 있습니다. 가볍고 CPU를 많이 사용하지 않습니다. + Opengl spektro vizualizacija, kurioje besisukantį 3D spektro analizatorių, priimtą OpenGL, katras juda į muzikos ritmą, įsteigiantis bangų poveikį visame spektro tinklelyje. Taip pat turi nustatymus nureguliuoti spektro juostos aukštį, jos greitį, ir teikiamas kraštines (kieta, taškai, tinklelio rėmas) ir yra gražus bei lengvas, mažai naudoja CPU vizualizacijai, ir atrodo puikiai + OpenGL Spectrum ir vizualizācija, kas attēlo OpenGL apstrādātu rotējošu 3D spektra analizatoru, kas kustās mūzikas ritmā, radot viļnošanās efektu pa visu spektra režģi. Pieejami iestatījumi, lai pielāgotu joslas augstumu, ātrumu un joslu renderēšanu (pildījums, punkti, karkass), un vizualizācija darbojas viegli, maz noslogo cpu un izskatās lieliski. + Opengl Spectrum is a Visualisation showing a rotating 3D Spectrum Analyzer rendered in Opengl that moves to the beat of the music creating a wave effect across the spectrum grid.⏎ It also has settings to adjust the spectrum bar height, Its speed, and how the bars are rendered (solid, points, wire frame) and is a nice light weight, low cpu useage visualisation that looks great + Spektrum OpenGL ialah Pengvisualan yang menunjukkan Penganalisis Spektrum 3D berputar dalam OpenGL. Yang mana ia bergerak mengikut rentak muzik yang membentuk kesan bergelombang sepanjang grid spektrum. Ia juga mempunyai tetapan yang dapat melaras tinggi palang spektrum, kelajuannya, dan bagaimana palang dipersembahkan (pejal, mata, bingkai wayar) serta merupakan penggunaan cpu pengvisualan yang rendah, menarik dan nampak cantik. + OpenGL Spectrum er en visualisering som viser en roterende 3D-spektrumanalysator rendret i OpenGL som beveger seg i takt med musikken og skaper en bølgeeffekt over lydspektrumet. Du kan stille inn søylehøyden, hastigheten og hvordan søylene blir rendret (fylt, punkt, trådramme) i lydspektrumet. Visualiseringen tar lite plass, krever lite av prosessoren og ser flott ut + Opengl Spectrum is een visualisatie met een draaiende 3D ​​Spectrum Analyzer gerenderd in OpenGL. Deze visualisatie beweegt op het ritme van de muziek en creëert een golf effect over het hele spectrum. ⏎ Het heeft instellingen om de barhoogte en de snelheid aan te passen, en hoe de staven worden weergegeven (vast, punten, draad frame) en is een mooie lichtgewicht visualisatie die weinig van de cpu vraagt en er geweldig uit ziet. + OpenGL Spectrum to 3 wymiarowy Analizator Widma Akustycznego, renderowany przy pomocy OpenGL, który porusza się w rytm muzyki, tworząc efekt fali w całym zakresie widma. Możesz zmieniać efekty, wysokość słupków, ich prędkość i wygląd (linie, punkty itd). Świetna wizualizacja charakteryzująca się niskim obciążeniem procesora. + O OpenGL Spectrum é uma visualização que mostra um analisador espectral rotativo 3D, renderizado em OpenGL, que se sincroniza com a batida, criando assim um efeito de ondas na grelha espectral. Pode-se definir a altura das barras, a sua velocidade e como são renderizadas (sólido, pontos ou contorno). É uma visualização que utiliza pouco o CPU e com um visual fantástico. + Opengl Spectrum é uma visualização que mostra um analisador espectral 3D rotativo, renderizado em Opengl, que se sincroniza com o ritmo da música, criando assim um efeito de ondas na grelha espectral. Pode-se definir a altura das barras, a sua velocidade e como são renderizadas (sólido, pontos ou contorno). É uma visualização que não utiliza muito CPU e tem um aspecto fantástico. + Spectrul OpenGL este o vizualizare care afișează un analizor de spectre 3D rotativ randat în OpenGL care se mișcă după bătăile muzicii creând un val dea-lungul grilei spectrale. De asemenea, are setări pentru ajustarea înălțimii bărilor spectrale, a vitezei, și a modului în care bările sunt randate (umplere, puncte, contur). Este o vizualizare cu consum redus al procesorului care arată fantastic de bine. + Эта визуализация на основе OpenGL показывает вращающийся трёхмерный анализатор спектра, который движется в такт музыке, создавая эффект волны по всему спектру сетки.⏎ Визуализация имеет настройки для регулировки высоты полос спектра, скорости движения и способа отображения полос (сплошной, точки, каркас), а также обладает небольшим размером и малой нагрузкой на процессор. + Opengl Spectrum je vizualizácia zobrazujúca rotujúci 3D spektrálny analyzátor vykresľovaný pomocou OpenGL, ktorý sa hýbe v rytme hudby a tak vytvára vlny naprieč mriežkou spektra.[CR] Zároveň má nastavenia upravujúce výšku stĺpcov spektra, ich rýchlosť a ako sú vykresľované (vyplnené, body, drôtový model). Je to jednoduchá vizualizácia s nízkou záťažou CPU, ktorá výborne vyzerá. + OpenGL Spectrum je vizualizacija, ki prikazuje vrtečo 3D spektralno analizo, generirano v OpenGL, ki se premika v ritmu glasbe in ustvarja učinek valovanja v celotnem spektru. Vsebuje tudi nastavitve za prilagoditev višine spektra, hitrosti in oblike (polno, točke, okvir) ter je varčna vizualizacija z nizko porabo CPU-ja, ki izgleda super. + Opengl Spectrum është nje vizualizim që tregonë një analizues spektral 3D që është llogaritur duke përdorur Opengl dhe lëvziet sipas muzikës duke krejuar një efekt valësh në një rrjet koordinativ spektral. Gjithashtu ka cilësime që lejojnë ndryshime të parametrave të ndryshme. Ky vizualizim nuk përdor shum llogari nga CPU. + OpenGL-spektrum är en visualisering som visar en roterande 3D-spektrumanalysator renderad i OpenGL. Den rör sig till musikens takt och skapar en vågeffekt över spektrat. OpenGL-spektrum har inställningar för att justera staplarnas höjd, deras hastighet, hur de ska visas (solida, punkter, ramverk) och är en visualisering med låg cpu-användning samtidigt som den ser bra ut + OpenGL Spectrum - ин таҷассум бо намоиши таҳлили спектри 3D-и даврзананда дар асоси OpenGL мебошад, ки ритми мусиқиро интиқол дода таъсири мавҷро дар тӯри спектр эҷод мекунад. Танзимоте, вуҷуд доранд, ки твонед тавассути онҳо баландии навори спектрро танзим кунед, суръаташро тағйир диҳед ва ҳолати (яклухт, нуқтаҳо, ҷорчӯбаи хаттӣ) наворҳоро интихоб намоед. Равшании форам ва кам масрафи CPU ҳангоми таҷассуми таъсирҳои мусиқӣ намоиши аҷибро таъмин менамояд + Opengl Spectrum เป็น การแสดงแสงสี ทำให้เห็นการหมุนกราฟวิเคราะห์คลื่นความถี่เสียง แบบ 3 มิติ ที่สร้างขึ้นโดย Opengl ที่ขยับไปตามจังหวะของเพลงที่สร้างผลกระทบเป็นคลื่นไปทั่วตารางความถี่. นอกจากนี้ยังมีการตั้งค่าเพื่อปรับความสูงของแท่งคลื่นความถี่,ความเร็วและกระบวนการที่แท่งแสดงผล (ของแข็ง, จุด, โครงลวด) ทั้งยังใช้ทรัพยากรน้อยได้ดี, การแสดงแสงสี ที่ใช้ซีพียูต่ำนั่นก็ดูยอดเยี่ยมทีเดียว + Opengl Spektrum, 3 Boyutlu Spektrum Analizörde opengl kullanarak müziğin ritmine göre bir dalga efekti yaratır. Aynı zamanda sepktrum bar yüksekliği, hızı ve barların nasıl render olacağı (katı, noktalar, tel kafes) ile ilgili ayarları vardır. Güzel gözüken, işlemciyi çok yormayan hafif bir yapıdır. + OpenGL Spectrum є візалізаціє що показує обертаючийся 3D спектроаналізатор що промальовується з використанням технології OpenGL. Спектроаналізатор показує стовпчики змінної висоти що рухаються в такт з музикою і створюють ефект подібний до хвилі. Ви маєте можливість налаштувати висоту стовпчиків, їх швидкість і те як вони намальовані (Заповнені, контури, крапки). Це досить проста, і невимоглива до процесора візуалізація, але яка має чудовий вигляд. + OpenGL Spectrum là chương trình trình diễn đồ họa hình ảnh xoay liên tục về 3D Spectrum Analyzer trên OpenGL chạy theo nhịp điệu của bài hát tạo ra hiệu ứng sóng trên dãy quang phổ.\n Hỗ trợ các tùy chỉnh để điều chỉnh như chiều cao của các cột quang phổ, tốc độ, và cách thể hiện các cột (đặc, điểm, hay khung dây). Tuy nó nhẹ, và cần ít tài nguyên của CPU nhưng vẫn rất tuyệt vời + Opengl Spectrum 可视化效果是 Opengl 渲染的一个旋转的三维频谱分析图像,频谱矩阵随着音乐节拍而象波浪起伏。 你还可以设置频谱棒的高度、变换速度、以及呈现效果(固体、点、框架)。这是一个不错的轻量级,低 CPU 占用率的可视化效果。 + OpenGL Spectrum 是使用 OpenGL 描繪顯示旋轉的3D頻譜分析視覺效果,頻譜格線隨著音樂節拍而像波浪起伏。 它還可以調整頻譜長條的高度、速度以及呈現效果(實心、點狀、線框)。它是個很好的輕量級、低 CPU 使用率的視覺化效果。 + linux osx ios android + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.af_za/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.af_za/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.af_za/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.af_za/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/kodi-main/language/af_ZA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af_ZA\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modus" + +msgctxt "#30001" +msgid "Filled" +msgstr "Gevul" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Draad Raamwerk" + +msgctxt "#30003" +msgid "Points" +msgstr "Punte" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Staaf Hoogte" + +msgctxt "#30005" +msgid "Small" +msgstr "Klein" + +msgctxt "#30006" +msgid "Default" +msgstr "Verstek" + +msgctxt "#30007" +msgid "Big" +msgstr "Groot" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Baie Groot" + +msgctxt "#30009" +msgid "Speed" +msgstr "Spoed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Baie Stadig" + +msgctxt "#30011" +msgid "Slow" +msgstr "Stadig" + +msgctxt "#30012" +msgid "Default" +msgstr "Verstek" + +msgctxt "#30013" +msgid "Fast" +msgstr "Vinnig" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Baie Vinnig" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.am_et/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.am_et/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.am_et/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.am_et/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Amharic (Ethiopia) (http://www.transifex.com/projects/p/kodi-main/language/am_ET/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: am_ET\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "ዘዴ " + +msgctxt "#30001" +msgid "Filled" +msgstr "ተሞልቷል" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "የሽቦ ክፈፍ " + +msgctxt "#30003" +msgid "Points" +msgstr "ነጥቦች " + +msgctxt "#30004" +msgid "Bar Height" +msgstr "የባሩ እርዝመት" + +msgctxt "#30005" +msgid "Small" +msgstr "ትንሽ " + +msgctxt "#30006" +msgid "Default" +msgstr "ነባር " + +msgctxt "#30007" +msgid "Big" +msgstr "ትልቅ " + +msgctxt "#30008" +msgid "Very Big" +msgstr "በጣም ትልቅ " + +msgctxt "#30009" +msgid "Speed" +msgstr "ፍጥነት" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "በጣም በዝግታ " + +msgctxt "#30011" +msgid "Slow" +msgstr "በዝግታ " + +msgctxt "#30012" +msgid "Default" +msgstr "ነባር " + +msgctxt "#30013" +msgid "Fast" +msgstr "በፍጥነት " + +msgctxt "#30014" +msgid "Very Fast" +msgstr "በጣም በፍጥነት " diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ar_sa/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ar_sa/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ar_sa/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ar_sa/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/kodi-main/language/ar_SA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar_SA\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "الوضع" + +msgctxt "#30001" +msgid "Filled" +msgstr "ممتلء" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "سلكي" + +msgctxt "#30003" +msgid "Points" +msgstr "نقط" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "شريط الارتفاع" + +msgctxt "#30005" +msgid "Small" +msgstr "صغير" + +msgctxt "#30006" +msgid "Default" +msgstr "الافتراضية" + +msgctxt "#30007" +msgid "Big" +msgstr "كبير" + +msgctxt "#30008" +msgid "Very Big" +msgstr "كبير جدا" + +msgctxt "#30009" +msgid "Speed" +msgstr "سرعة" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "ب\\يء جدا" + +msgctxt "#30011" +msgid "Slow" +msgstr "بطيء" + +msgctxt "#30012" +msgid "Default" +msgstr "الافتراضية" + +msgctxt "#30013" +msgid "Fast" +msgstr "سريع" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "سريع جدا" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.az_az/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.az_az/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.az_az/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.az_az/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Azerbaijani (Azerbaijan) (http://www.transifex.com/projects/p/kodi-main/language/az_AZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az_AZ\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30006" +msgid "Default" +msgstr "Normal" + +msgctxt "#30009" +msgid "Speed" +msgstr "Sürət" + +msgctxt "#30012" +msgid "Default" +msgstr "Normal" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.be_by/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.be_by/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.be_by/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.be_by/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Belarusian (Belarus) (http://www.transifex.com/projects/p/kodi-main/language/be_BY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be_BY\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Filled" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Bar Height" + +msgctxt "#30005" +msgid "Small" +msgstr "Small" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30007" +msgid "Big" +msgstr "Вялікі" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Very Big" + +msgctxt "#30009" +msgid "Speed" +msgstr "Speed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Very Slow" + +msgctxt "#30011" +msgid "Slow" +msgstr "Slow" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" + +msgctxt "#30013" +msgid "Fast" +msgstr "Fast" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Very Fast" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.bg_bg/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.bg_bg/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.bg_bg/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.bg_bg/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/kodi-main/language/bg_BG/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg_BG\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Режим" + +msgctxt "#30001" +msgid "Filled" +msgstr "Запълнен" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Точков" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Височина на стълбовете" + +msgctxt "#30005" +msgid "Small" +msgstr "Малка" + +msgctxt "#30006" +msgid "Default" +msgstr "Стандартна" + +msgctxt "#30007" +msgid "Big" +msgstr "Голяма" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Много голяма" + +msgctxt "#30009" +msgid "Speed" +msgstr "Скорост" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Много бавна" + +msgctxt "#30011" +msgid "Slow" +msgstr "Бавна" + +msgctxt "#30012" +msgid "Default" +msgstr "Стандартна" + +msgctxt "#30013" +msgid "Fast" +msgstr "Бърза" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Много бърза" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.bs_ba/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.bs_ba/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.bs_ba/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.bs_ba/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/projects/p/kodi-main/language/bs_BA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs_BA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režim" + +msgctxt "#30005" +msgid "Small" +msgstr "Malo" + +msgctxt "#30006" +msgid "Default" +msgstr "Podrazumjevano" + +msgctxt "#30009" +msgid "Speed" +msgstr "Brzina" + +msgctxt "#30012" +msgid "Default" +msgstr "Podrazumjevano" + +msgctxt "#30013" +msgid "Fast" +msgstr "Brzo" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ca_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ca_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ca_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ca_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Catalan (Spain) (http://www.transifex.com/projects/p/kodi-main/language/ca_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Sòlid" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Malla" + +msgctxt "#30003" +msgid "Points" +msgstr "Punts" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Alçada de la barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Petit" + +msgctxt "#30006" +msgid "Default" +msgstr "Per defecte" + +msgctxt "#30007" +msgid "Big" +msgstr "Gran" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Molt gran" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocitat" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Molt lent" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lent" + +msgctxt "#30012" +msgid "Default" +msgstr "Per defecte" + +msgctxt "#30013" +msgid "Fast" +msgstr "Ràpid" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Molt ràpid" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.cs_cz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.cs_cz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.cs_cz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.cs_cz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/kodi-main/language/cs_CZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs_CZ\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režim" + +msgctxt "#30001" +msgid "Filled" +msgstr "Vypněný" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Drátový model" + +msgctxt "#30003" +msgid "Points" +msgstr "Body" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Výška sloupce" + +msgctxt "#30005" +msgid "Small" +msgstr "Malá" + +msgctxt "#30006" +msgid "Default" +msgstr "Výchozí" + +msgctxt "#30007" +msgid "Big" +msgstr "Velká" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Velmi velká" + +msgctxt "#30009" +msgid "Speed" +msgstr "Rychlost" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Velmi pomalu" + +msgctxt "#30011" +msgid "Slow" +msgstr "Pomalu" + +msgctxt "#30012" +msgid "Default" +msgstr "Výchozí" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rychle" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Velmi rychle" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.cy_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.cy_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.cy_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.cy_gb/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Welsh (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/cy_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy_GB\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modd" + +msgctxt "#30001" +msgid "Filled" +msgstr "Llanwyd" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Ffrâm weiar" + +msgctxt "#30003" +msgid "Points" +msgstr "Pwyntiau" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Uchder Bar" + +msgctxt "#30005" +msgid "Small" +msgstr "Bach" + +msgctxt "#30006" +msgid "Default" +msgstr "Rhagosodiad" + +msgctxt "#30007" +msgid "Big" +msgstr "Mawr" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Mawr Iawn" + +msgctxt "#30009" +msgid "Speed" +msgstr "Cyflymder" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Araf Iawn" + +msgctxt "#30011" +msgid "Slow" +msgstr "Araf" + +msgctxt "#30012" +msgid "Default" +msgstr "Rhagosodiad" + +msgctxt "#30013" +msgid "Fast" +msgstr "Cyflym" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Cyflym Iawn" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.da_dk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.da_dk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.da_dk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.da_dk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Danish (Denmark) (http://www.transifex.com/projects/p/kodi-main/language/da_DK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da_DK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Tilstand" + +msgctxt "#30001" +msgid "Filled" +msgstr "Fyldt" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkter" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Bokshøjde" + +msgctxt "#30005" +msgid "Small" +msgstr "Lille" + +msgctxt "#30006" +msgid "Default" +msgstr "Standard" + +msgctxt "#30007" +msgid "Big" +msgstr "Stor" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Meget stor" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hastighed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Meget langsom" + +msgctxt "#30011" +msgid "Slow" +msgstr "Langsom" + +msgctxt "#30012" +msgid "Default" +msgstr "Standard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Hurtig" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Meget hurtig" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.de_de/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.de_de/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.de_de/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.de_de/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: German (Germany) (http://www.transifex.com/projects/p/kodi-main/language/de_DE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de_DE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modus" + +msgctxt "#30001" +msgid "Filled" +msgstr "Ausgefüllt" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Drahtgeflecht" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkte" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Balkenhöhe" + +msgctxt "#30005" +msgid "Small" +msgstr "Klein" + +msgctxt "#30006" +msgid "Default" +msgstr "Standard" + +msgctxt "#30007" +msgid "Big" +msgstr "Groß" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Sehr groß" + +msgctxt "#30009" +msgid "Speed" +msgstr "Geschwindigkeit" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Sehr langsam" + +msgctxt "#30011" +msgid "Slow" +msgstr "Langsam" + +msgctxt "#30012" +msgid "Default" +msgstr "Standard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Schnell" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Sehr schnell" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.el_gr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.el_gr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.el_gr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.el_gr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Greek (Greece) (http://www.transifex.com/projects/p/kodi-main/language/el_GR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el_GR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Μέθοδος" + +msgctxt "#30001" +msgid "Filled" +msgstr "Γέμισαν" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Συρματόπλεγμα" + +msgctxt "#30003" +msgid "Points" +msgstr "Σημεία" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Ύψος Στηλών" + +msgctxt "#30005" +msgid "Small" +msgstr "Μικρό" + +msgctxt "#30006" +msgid "Default" +msgstr "Προεπιλογή" + +msgctxt "#30007" +msgid "Big" +msgstr "Μεγάλο" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Πολύ Μεγάλο" + +msgctxt "#30009" +msgid "Speed" +msgstr "Ταχύτητα" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Πολύ Αργά" + +msgctxt "#30011" +msgid "Slow" +msgstr "Αργά" + +msgctxt "#30012" +msgid "Default" +msgstr "Προεπιλογή" + +msgctxt "#30013" +msgid "Fast" +msgstr "Γρήγορα" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Πολύ Γρήγορα" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.en_au/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.en_au/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.en_au/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.en_au/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/kodi-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Filled" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Bar Height" + +msgctxt "#30005" +msgid "Small" +msgstr "Small" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30007" +msgid "Big" +msgstr "Big" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Very Big" + +msgctxt "#30009" +msgid "Speed" +msgstr "Speed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Very Slow" + +msgctxt "#30011" +msgid "Slow" +msgstr "Slow" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" + +msgctxt "#30013" +msgid "Fast" +msgstr "Fast" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Very Fast" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.en_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.en_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.en_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.en_gb/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,79 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#settings labels + +msgctxt "#30000" +msgid "Mode" +msgstr "" + +msgctxt "#30001" +msgid "Filled" +msgstr "" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "" + +msgctxt "#30003" +msgid "Points" +msgstr "" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "" + +msgctxt "#30005" +msgid "Small" +msgstr "" + +msgctxt "#30006" +msgid "Default" +msgstr "" + +msgctxt "#30007" +msgid "Big" +msgstr "" + +msgctxt "#30008" +msgid "Very Big" +msgstr "" + +msgctxt "#30009" +msgid "Speed" +msgstr "" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "" + +msgctxt "#30011" +msgid "Slow" +msgstr "" + +msgctxt "#30012" +msgid "Default" +msgstr "" + +msgctxt "#30013" +msgid "Fast" +msgstr "" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.en_nz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.en_nz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.en_nz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.en_nz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/kodi-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Filled" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Bar Height" + +msgctxt "#30005" +msgid "Small" +msgstr "Small" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30007" +msgid "Big" +msgstr "Big" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Very Big" + +msgctxt "#30009" +msgid "Speed" +msgstr "Speed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Very Slow" + +msgctxt "#30011" +msgid "Slow" +msgstr "Slow" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" + +msgctxt "#30013" +msgid "Fast" +msgstr "Fast" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Very Fast" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.en_us/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.en_us/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.en_us/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.en_us/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United States) (http://www.transifex.com/projects/p/kodi-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Filled" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Bar Height" + +msgctxt "#30005" +msgid "Small" +msgstr "Small" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30007" +msgid "Big" +msgstr "Big" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Very Big" + +msgctxt "#30009" +msgid "Speed" +msgstr "Speed" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Very Slow" + +msgctxt "#30011" +msgid "Slow" +msgstr "Slow" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" + +msgctxt "#30013" +msgid "Fast" +msgstr "Fast" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Very Fast" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.eo/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.eo/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.eo/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.eo/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/kodi-main/language/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30006" +msgid "Default" +msgstr "Default" + +msgctxt "#30009" +msgid "Speed" +msgstr "Rapideco" + +msgctxt "#30012" +msgid "Default" +msgstr "Default" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.es_ar/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.es_ar/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.es_ar/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.es_ar/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/kodi-main/language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Sólido" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Malla" + +msgctxt "#30003" +msgid "Points" +msgstr "Puntos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura de la barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Pequeña" + +msgctxt "#30006" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Muy grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidad" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Muy lenta" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lenta" + +msgctxt "#30012" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápida" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Muy rápida" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.es_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.es_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.es_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.es_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/kodi-main/language/es_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Sólido" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Malla" + +msgctxt "#30003" +msgid "Points" +msgstr "Puntos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura de la barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Pequeña" + +msgctxt "#30006" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Muy grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidad" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Muy despacio" + +msgctxt "#30011" +msgid "Slow" +msgstr "Despacio" + +msgctxt "#30012" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápido" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Muy rápido" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.es_mx/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.es_mx/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.es_mx/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.es_mx/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/kodi-main/language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Lleno" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Malla de alambre" + +msgctxt "#30003" +msgid "Points" +msgstr "Puntos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura de Barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Chico" + +msgctxt "#30006" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Muy Grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidad" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Muy Lento" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lento" + +msgctxt "#30012" +msgid "Default" +msgstr "Por defecto" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápido" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Muy Rápido" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.et_ee/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.et_ee/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.et_ee/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.et_ee/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/kodi-main/language/et_EE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et_EE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režiim" + +msgctxt "#30001" +msgid "Filled" +msgstr "Täidetud" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Sõrestik" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkte" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Riba kõrgus" + +msgctxt "#30005" +msgid "Small" +msgstr "Väike" + +msgctxt "#30006" +msgid "Default" +msgstr "Vaikimisi" + +msgctxt "#30007" +msgid "Big" +msgstr "Suur" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Väga suur" + +msgctxt "#30009" +msgid "Speed" +msgstr "Kiirus" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Väga aeglane" + +msgctxt "#30011" +msgid "Slow" +msgstr "Aeglane" + +msgctxt "#30012" +msgid "Default" +msgstr "Vaikimisi" + +msgctxt "#30013" +msgid "Fast" +msgstr "Kiire" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Väga kiire" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.eu_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.eu_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.eu_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.eu_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Basque (Spain) (http://www.transifex.com/projects/p/kodi-main/language/eu_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modua" + +msgctxt "#30001" +msgid "Filled" +msgstr "Betea" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Burdin-haria" + +msgctxt "#30003" +msgid "Points" +msgstr "Puntuak" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Barra garaiera" + +msgctxt "#30005" +msgid "Small" +msgstr "Txikia" + +msgctxt "#30006" +msgid "Default" +msgstr "Lehenetsia" + +msgctxt "#30007" +msgid "Big" +msgstr "Handia" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Oso handia" + +msgctxt "#30009" +msgid "Speed" +msgstr "Abiadura" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Oso poliki" + +msgctxt "#30011" +msgid "Slow" +msgstr "Poliki" + +msgctxt "#30012" +msgid "Default" +msgstr "Lehenetsia" + +msgctxt "#30013" +msgid "Fast" +msgstr "Azkarra" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Oso azkarra" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fa_af/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fa_af/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fa_af/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fa_af/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Persian (Afghanistan) (http://www.transifex.com/projects/p/kodi-main/language/fa_AF/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_AF\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30006" +msgid "Default" +msgstr "پیش فرض" + +msgctxt "#30009" +msgid "Speed" +msgstr "سرعت" + +msgctxt "#30012" +msgid "Default" +msgstr "پیش فرض" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fa_ir/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fa_ir/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fa_ir/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fa_ir/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/kodi-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "حالت" + +msgctxt "#30001" +msgid "Filled" +msgstr "پر شده" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "مدل سیمی" + +msgctxt "#30003" +msgid "Points" +msgstr "نقطه ها" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "ارتفاع ستون" + +msgctxt "#30005" +msgid "Small" +msgstr "کوچک" + +msgctxt "#30006" +msgid "Default" +msgstr "پیش فرض" + +msgctxt "#30007" +msgid "Big" +msgstr "بزرگ" + +msgctxt "#30008" +msgid "Very Big" +msgstr "خیلی بزرگ" + +msgctxt "#30009" +msgid "Speed" +msgstr "سرعت" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "خیلی آهسته" + +msgctxt "#30011" +msgid "Slow" +msgstr "آهسته" + +msgctxt "#30012" +msgid "Default" +msgstr "پیش فرض" + +msgctxt "#30013" +msgid "Fast" +msgstr "تند" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "خیلی تند" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fi_fi/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fi_fi/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fi_fi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fi_fi/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/kodi-main/language/fi_FI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi_FI\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Muoto" + +msgctxt "#30001" +msgid "Filled" +msgstr "Täytetty" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Rautalanka" + +msgctxt "#30003" +msgid "Points" +msgstr "Pisteet" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Palkin korkeus" + +msgctxt "#30005" +msgid "Small" +msgstr "Pieni" + +msgctxt "#30006" +msgid "Default" +msgstr "Oletus" + +msgctxt "#30007" +msgid "Big" +msgstr "Suuri" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Erittäin suuri" + +msgctxt "#30009" +msgid "Speed" +msgstr "Nopeus" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Erittäin hidas" + +msgctxt "#30011" +msgid "Slow" +msgstr "Hidas" + +msgctxt "#30012" +msgid "Default" +msgstr "Oletus" + +msgctxt "#30013" +msgid "Fast" +msgstr "Nopea" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Erittäin nopea" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fo_fo/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fo_fo/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fo_fo/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fo_fo/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,37 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Faroese (Faroe Islands) (http://www.transifex.com/projects/p/kodi-main/language/fo_FO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo_FO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30005" +msgid "Small" +msgstr "Líti" + +msgctxt "#30006" +msgid "Default" +msgstr "Vanligt" + +msgctxt "#30009" +msgid "Speed" +msgstr "Fer" + +msgctxt "#30012" +msgid "Default" +msgstr "Vanligt" + +msgctxt "#30013" +msgid "Fast" +msgstr "Skjótt" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fr_ca/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fr_ca/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fr_ca/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fr_ca/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/kodi-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Plein" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Fil de fer" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Hauteur de barre" + +msgctxt "#30005" +msgid "Small" +msgstr "Petit" + +msgctxt "#30006" +msgid "Default" +msgstr "Valeur par défaut" + +msgctxt "#30007" +msgid "Big" +msgstr "Grand" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Très grand" + +msgctxt "#30009" +msgid "Speed" +msgstr "Vitesse" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Très lent" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lent" + +msgctxt "#30012" +msgid "Default" +msgstr "Valeur par défaut" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rapide" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Très rapide" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fr_fr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fr_fr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.fr_fr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.fr_fr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (France) (http://www.transifex.com/projects/p/kodi-main/language/fr_FR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_FR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Plein" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Fil de fer" + +msgctxt "#30003" +msgid "Points" +msgstr "Points" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Hauteur de barre" + +msgctxt "#30005" +msgid "Small" +msgstr "Petit" + +msgctxt "#30006" +msgid "Default" +msgstr "Prédéfini" + +msgctxt "#30007" +msgid "Big" +msgstr "Grand" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Très Grand" + +msgctxt "#30009" +msgid "Speed" +msgstr "Vitesse" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Très Lent" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lent" + +msgctxt "#30012" +msgid "Default" +msgstr "Prédéfini" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rapide" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Très Rapide" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.gl_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.gl_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.gl_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.gl_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Galician (Spain) (http://www.transifex.com/projects/p/kodi-main/language/gl_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Cheo" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Malla" + +msgctxt "#30003" +msgid "Points" +msgstr "Puntos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura da barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Pequeno" + +msgctxt "#30006" +msgid "Default" +msgstr "Predefinido" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Moi grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidade" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Moi lenta" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lenta" + +msgctxt "#30012" +msgid "Default" +msgstr "Predefinida" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápida" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Moi rápida" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.he_il/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.he_il/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.he_il/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.he_il/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/kodi-main/language/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "מצב" + +msgctxt "#30001" +msgid "Filled" +msgstr "מלא" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "מסגרת קווית" + +msgctxt "#30003" +msgid "Points" +msgstr "נקודות" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "גובה אנכי" + +msgctxt "#30005" +msgid "Small" +msgstr "קטן" + +msgctxt "#30006" +msgid "Default" +msgstr "ברירת מחדל" + +msgctxt "#30007" +msgid "Big" +msgstr "גדול" + +msgctxt "#30008" +msgid "Very Big" +msgstr "גדול מאוד" + +msgctxt "#30009" +msgid "Speed" +msgstr "מהירות" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "איטי מאוד" + +msgctxt "#30011" +msgid "Slow" +msgstr "איטי" + +msgctxt "#30012" +msgid "Default" +msgstr "ברירת מחדל" + +msgctxt "#30013" +msgid "Fast" +msgstr "מהיר" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "מהיר מאוד" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.hi_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.hi_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.hi_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.hi_in/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hindi (India) (http://www.transifex.com/projects/p/kodi-main/language/hi_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "विधि" + +msgctxt "#30006" +msgid "Default" +msgstr "डिफ़ॉल्ट" + +msgctxt "#30009" +msgid "Speed" +msgstr "गति" + +msgctxt "#30012" +msgid "Default" +msgstr "डिफ़ॉल्ट" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.hr_hr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.hr_hr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.hr_hr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.hr_hr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Croatian (Croatia) (http://www.transifex.com/projects/p/kodi-main/language/hr_HR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr_HR\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Način" + +msgctxt "#30001" +msgid "Filled" +msgstr "Popunjeno" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Žičani okvir" + +msgctxt "#30003" +msgid "Points" +msgstr "Točke" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Visina trake" + +msgctxt "#30005" +msgid "Small" +msgstr "Malo" + +msgctxt "#30006" +msgid "Default" +msgstr "Zadano" + +msgctxt "#30007" +msgid "Big" +msgstr "Veliko" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Vrlo veliko" + +msgctxt "#30009" +msgid "Speed" +msgstr "Brzina" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Vrlo sporo" + +msgctxt "#30011" +msgid "Slow" +msgstr "Sporo" + +msgctxt "#30012" +msgid "Default" +msgstr "Zadano" + +msgctxt "#30013" +msgid "Fast" +msgstr "Brzo" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Vrlo brzo" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.hu_hu/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.hu_hu/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.hu_hu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.hu_hu/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/kodi-main/language/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mód" + +msgctxt "#30001" +msgid "Filled" +msgstr "Kitöltött" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Drótváz" + +msgctxt "#30003" +msgid "Points" +msgstr "Pontok" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Oszlopmagasság" + +msgctxt "#30005" +msgid "Small" +msgstr "Alacsony" + +msgctxt "#30006" +msgid "Default" +msgstr "Alapérték" + +msgctxt "#30007" +msgid "Big" +msgstr "Nagy" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Nagyon nagy" + +msgctxt "#30009" +msgid "Speed" +msgstr "Sebesség" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Nagyon lassú" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lassú" + +msgctxt "#30012" +msgid "Default" +msgstr "Alapérték" + +msgctxt "#30013" +msgid "Fast" +msgstr "Gyors" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Nagyon gyors" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.hy_am/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.hy_am/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.hy_am/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.hy_am/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Armenian (Armenia) (http://www.transifex.com/projects/p/kodi-main/language/hy_AM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy_AM\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Կարգավիճակ" + +msgctxt "#30006" +msgid "Default" +msgstr "Նախնական" + +msgctxt "#30009" +msgid "Speed" +msgstr "Արագություն" + +msgctxt "#30012" +msgid "Default" +msgstr "Նախնական" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.id_id/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.id_id/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.id_id/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.id_id/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/kodi-main/language/id_ID/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id_ID\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode" + +msgctxt "#30001" +msgid "Filled" +msgstr "Diisi" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Point" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Tinggi bar" + +msgctxt "#30005" +msgid "Small" +msgstr "Kecil" + +msgctxt "#30006" +msgid "Default" +msgstr "Standar" + +msgctxt "#30007" +msgid "Big" +msgstr "Besar" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Sangat Besar" + +msgctxt "#30009" +msgid "Speed" +msgstr "Kecepatan" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Sangat Pelan" + +msgctxt "#30011" +msgid "Slow" +msgstr "Pelan" + +msgctxt "#30012" +msgid "Default" +msgstr "Standar" + +msgctxt "#30013" +msgid "Fast" +msgstr "Cepat" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Sangat Cepat" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.is_is/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.is_is/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.is_is/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.is_is/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Icelandic (Iceland) (http://www.transifex.com/projects/p/kodi-main/language/is_IS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is_IS\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Hamur" + +msgctxt "#30001" +msgid "Filled" +msgstr "Fyllt" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Útlínur" + +msgctxt "#30003" +msgid "Points" +msgstr "Punktar" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Hæð" + +msgctxt "#30005" +msgid "Small" +msgstr "Lítið" + +msgctxt "#30006" +msgid "Default" +msgstr "Sjálfgefið" + +msgctxt "#30007" +msgid "Big" +msgstr "Stórt" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Mjög stórt" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hraði" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Mjög hægt" + +msgctxt "#30011" +msgid "Slow" +msgstr "Hægt" + +msgctxt "#30012" +msgid "Default" +msgstr "Sjálfgefið" + +msgctxt "#30013" +msgid "Fast" +msgstr "Hratt" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Mjög hratt" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.it_it/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.it_it/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.it_it/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.it_it/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/kodi-main/language/it_IT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it_IT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modalità" + +msgctxt "#30001" +msgid "Filled" +msgstr "Piene" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "A righe" + +msgctxt "#30003" +msgid "Points" +msgstr "A punti" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altezza barre" + +msgctxt "#30005" +msgid "Small" +msgstr "Piccolo" + +msgctxt "#30006" +msgid "Default" +msgstr "Predefinito" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Molto grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocità" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Molto lento" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lento" + +msgctxt "#30012" +msgid "Default" +msgstr "Predefinito" + +msgctxt "#30013" +msgid "Fast" +msgstr "Veloce" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Molto veloce" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ja_jp/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ja_jp/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ja_jp/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ja_jp/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/kodi-main/language/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "モード" + +msgctxt "#30001" +msgid "Filled" +msgstr "フィル" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "ワイヤーフレーム" + +msgctxt "#30003" +msgid "Points" +msgstr "ポイント" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "バーの高さ" + +msgctxt "#30005" +msgid "Small" +msgstr "小さい" + +msgctxt "#30006" +msgid "Default" +msgstr "デフォルト" + +msgctxt "#30007" +msgid "Big" +msgstr "大きい" + +msgctxt "#30008" +msgid "Very Big" +msgstr "とても大きい" + +msgctxt "#30009" +msgid "Speed" +msgstr "表示時間" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "とてもゆっくり" + +msgctxt "#30011" +msgid "Slow" +msgstr "ゆっくり" + +msgctxt "#30012" +msgid "Default" +msgstr "デフォルト" + +msgctxt "#30013" +msgid "Fast" +msgstr "速く" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "とても速く" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ko_kr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ko_kr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ko_kr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ko_kr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/kodi-main/language/ko_KR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko_KR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "모드" + +msgctxt "#30001" +msgid "Filled" +msgstr "채워짐" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "와이어 프레임" + +msgctxt "#30003" +msgid "Points" +msgstr "점" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "바 높이" + +msgctxt "#30005" +msgid "Small" +msgstr "낮음" + +msgctxt "#30006" +msgid "Default" +msgstr "보통" + +msgctxt "#30007" +msgid "Big" +msgstr "높음" + +msgctxt "#30008" +msgid "Very Big" +msgstr "매우 높음" + +msgctxt "#30009" +msgid "Speed" +msgstr "속도" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "매우 느림" + +msgctxt "#30011" +msgid "Slow" +msgstr "느림" + +msgctxt "#30012" +msgid "Default" +msgstr "보통" + +msgctxt "#30013" +msgid "Fast" +msgstr "빠름" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "매우 빠름" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.lt_lt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.lt_lt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.lt_lt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.lt_lt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/kodi-main/language/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režimas" + +msgctxt "#30001" +msgid "Filled" +msgstr "Pripildytas" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Tinklelio modelis" + +msgctxt "#30003" +msgid "Points" +msgstr "Taškai" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Juosta aukštai" + +msgctxt "#30005" +msgid "Small" +msgstr "Mažas" + +msgctxt "#30006" +msgid "Default" +msgstr "Numatytas" + +msgctxt "#30007" +msgid "Big" +msgstr "Didelis" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Labai didelis" + +msgctxt "#30009" +msgid "Speed" +msgstr "Prezentacijos rodymo laikas" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Labai lėtas" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lėtas" + +msgctxt "#30012" +msgid "Default" +msgstr "Numatytas" + +msgctxt "#30013" +msgid "Fast" +msgstr "Greitas" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Labai greitas" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.lv_lv/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.lv_lv/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.lv_lv/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.lv_lv/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/kodi-main/language/lv_LV/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv_LV\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režīms" + +msgctxt "#30001" +msgid "Filled" +msgstr "Aizpildīts" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Karkass" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkti" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Joslas augstums" + +msgctxt "#30005" +msgid "Small" +msgstr "Mazs" + +msgctxt "#30006" +msgid "Default" +msgstr "Noklusējums" + +msgctxt "#30007" +msgid "Big" +msgstr "Liels" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Ļoti liels" + +msgctxt "#30009" +msgid "Speed" +msgstr "Ātrums" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Ļoti lēns" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lēns" + +msgctxt "#30012" +msgid "Default" +msgstr "Noklusējums" + +msgctxt "#30013" +msgid "Fast" +msgstr "Ātrs" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Loti ātrs" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.mi/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.mi/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.mi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.mi/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/kodi-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Aratau" + +msgctxt "#30005" +msgid "Small" +msgstr "Small" + +msgctxt "#30006" +msgid "Default" +msgstr "Taunoa" + +msgctxt "#30009" +msgid "Speed" +msgstr "Tere" + +msgctxt "#30012" +msgid "Default" +msgstr "Taunoa" + +msgctxt "#30013" +msgid "Fast" +msgstr "Nohopuku" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.mk_mk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.mk_mk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.mk_mk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.mk_mk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Macedonian (Macedonia) (http://www.transifex.com/projects/p/kodi-main/language/mk_MK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk_MK\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Режим" + +msgctxt "#30001" +msgid "Filled" +msgstr "Исполнето" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Мрежесто" + +msgctxt "#30003" +msgid "Points" +msgstr "Поени" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Висина на бар" + +msgctxt "#30005" +msgid "Small" +msgstr "Мало" + +msgctxt "#30006" +msgid "Default" +msgstr "Подразбирачко" + +msgctxt "#30007" +msgid "Big" +msgstr "Големо" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Многу големо" + +msgctxt "#30009" +msgid "Speed" +msgstr "Брзина" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Многу споро" + +msgctxt "#30011" +msgid "Slow" +msgstr "Споро" + +msgctxt "#30012" +msgid "Default" +msgstr "Подразбирачко" + +msgctxt "#30013" +msgid "Fast" +msgstr "Брзо" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Многу брзо" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.mn_mn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.mn_mn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.mn_mn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.mn_mn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Mongolian (Mongolia) (http://www.transifex.com/projects/p/kodi-main/language/mn_MN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mn_MN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30009" +msgid "Speed" +msgstr "Хурд" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ms_my/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ms_my/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ms_my/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ms_my/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/kodi-main/language/ms_MY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms_MY\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mod" + +msgctxt "#30001" +msgid "Filled" +msgstr "Diisi" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Bingkai Wayar" + +msgctxt "#30003" +msgid "Points" +msgstr "Mata" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Tinggi Palang" + +msgctxt "#30005" +msgid "Small" +msgstr "Kecil" + +msgctxt "#30006" +msgid "Default" +msgstr "Lalai" + +msgctxt "#30007" +msgid "Big" +msgstr "Besar" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Sangat Besar" + +msgctxt "#30009" +msgid "Speed" +msgstr "Kelajuan" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Sangat Perlahan" + +msgctxt "#30011" +msgid "Slow" +msgstr "Perlahan" + +msgctxt "#30012" +msgid "Default" +msgstr "Lalai" + +msgctxt "#30013" +msgid "Fast" +msgstr "Pantas" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Sangat Pantas" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.mt_mt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.mt_mt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.mt_mt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.mt_mt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,37 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Maltese (Malta) (http://www.transifex.com/projects/p/kodi-main/language/mt_MT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mt_MT\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mode:" + +msgctxt "#30006" +msgid "Default" +msgstr "Difolt" + +msgctxt "#30009" +msgid "Speed" +msgstr "Veloċita'" + +msgctxt "#30012" +msgid "Default" +msgstr "Difolt" + +msgctxt "#30013" +msgid "Fast" +msgstr "Mgħaġġel" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.my_mm/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.my_mm/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.my_mm/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.my_mm/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/kodi-main/language/my_MM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my_MM\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "အခြေအနေ" + +msgctxt "#30001" +msgid "Filled" +msgstr "ဖြည့်စွက်မည်" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "အခြေခံဖွဲ့စည်းမှု" + +msgctxt "#30003" +msgid "Points" +msgstr "အမှတ်များ" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "ဘား အမြင့်" + +msgctxt "#30005" +msgid "Small" +msgstr "သေးငယ်သော" + +msgctxt "#30006" +msgid "Default" +msgstr "မူလအတိုင်း" + +msgctxt "#30007" +msgid "Big" +msgstr "ကြီးမားသော" + +msgctxt "#30008" +msgid "Very Big" +msgstr "ပို၍ကြီးမားသော" + +msgctxt "#30009" +msgid "Speed" +msgstr "အမြန်နှုန်း" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "ပို၍နှေးသော" + +msgctxt "#30011" +msgid "Slow" +msgstr "နှေးသော" + +msgctxt "#30012" +msgid "Default" +msgstr "မူလအတိုင်း" + +msgctxt "#30013" +msgid "Fast" +msgstr "အမြန်" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "ပို၍မြန်သော" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.nb_no/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.nb_no/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.nb_no/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.nb_no/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/kodi-main/language/nb_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modus" + +msgctxt "#30001" +msgid "Filled" +msgstr "Fylt" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Trådramme" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkter" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Søylehøyde" + +msgctxt "#30005" +msgid "Small" +msgstr "Lav" + +msgctxt "#30006" +msgid "Default" +msgstr "Standard" + +msgctxt "#30007" +msgid "Big" +msgstr "Høy" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Veldig høy" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hastighet" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Veldig sakte" + +msgctxt "#30011" +msgid "Slow" +msgstr "Sakte" + +msgctxt "#30012" +msgid "Default" +msgstr "Standard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Raskt" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Veldig raskt" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.nl_nl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.nl_nl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.nl_nl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.nl_nl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/kodi-main/language/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modus" + +msgctxt "#30001" +msgid "Filled" +msgstr "Gevuld" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Draadframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Punten" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Balkhoogte" + +msgctxt "#30005" +msgid "Small" +msgstr "Klein" + +msgctxt "#30006" +msgid "Default" +msgstr "Standaard" + +msgctxt "#30007" +msgid "Big" +msgstr "Groot" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Heel groot" + +msgctxt "#30009" +msgid "Speed" +msgstr "Snelheid" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Zeer traag" + +msgctxt "#30011" +msgid "Slow" +msgstr "Traag" + +msgctxt "#30012" +msgid "Default" +msgstr "Standaard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Snel" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Zeer snel" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.pl_pl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.pl_pl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.pl_pl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.pl_pl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/kodi-main/language/pl_PL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Tryb" + +msgctxt "#30001" +msgid "Filled" +msgstr "Wypełnione" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Siatka" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkty" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Wysokość słupków" + +msgctxt "#30005" +msgid "Small" +msgstr "Małe" + +msgctxt "#30006" +msgid "Default" +msgstr "Domyślne" + +msgctxt "#30007" +msgid "Big" +msgstr "Duże" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Bardzo duże" + +msgctxt "#30009" +msgid "Speed" +msgstr "Prędkość" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Bardzo wolna" + +msgctxt "#30011" +msgid "Slow" +msgstr "Wolna" + +msgctxt "#30012" +msgid "Default" +msgstr "Domyślna" + +msgctxt "#30013" +msgid "Fast" +msgstr "Szybka" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Bardzo szybka" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.pt_br/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.pt_br/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.pt_br/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.pt_br/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/kodi-main/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Total" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Contornos" + +msgctxt "#30003" +msgid "Points" +msgstr "Pontos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura da Barra" + +msgctxt "#30005" +msgid "Small" +msgstr "Pequeno" + +msgctxt "#30006" +msgid "Default" +msgstr "Padrão" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Muito Grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidade" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Bem devagar" + +msgctxt "#30011" +msgid "Slow" +msgstr "Devagar" + +msgctxt "#30012" +msgid "Default" +msgstr "Padrão" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápido" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Muito Rápido" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.pt_pt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.pt_pt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.pt_pt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.pt_pt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/kodi-main/language/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Modo" + +msgctxt "#30001" +msgid "Filled" +msgstr "Preenchido" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Contorno" + +msgctxt "#30003" +msgid "Points" +msgstr "Pontos" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Altura das Barras" + +msgctxt "#30005" +msgid "Small" +msgstr "Pequena" + +msgctxt "#30006" +msgid "Default" +msgstr "Padrão" + +msgctxt "#30007" +msgid "Big" +msgstr "Grande" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Muito grande" + +msgctxt "#30009" +msgid "Speed" +msgstr "Velocidade" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Muito lenta" + +msgctxt "#30011" +msgid "Slow" +msgstr "Lenta" + +msgctxt "#30012" +msgid "Default" +msgstr "Padrão" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rápida" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Muito rápida" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ro_ro/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ro_ro/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ro_ro/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ro_ro/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Romanian (Romania) (http://www.transifex.com/projects/p/kodi-main/language/ro_RO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro_RO\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mod" + +msgctxt "#30001" +msgid "Filled" +msgstr "Umplere" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Contur" + +msgctxt "#30003" +msgid "Points" +msgstr "Puncte" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Înălțime bară" + +msgctxt "#30005" +msgid "Small" +msgstr "Mică" + +msgctxt "#30006" +msgid "Default" +msgstr "Standard" + +msgctxt "#30007" +msgid "Big" +msgstr "Mare" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Foarte mare" + +msgctxt "#30009" +msgid "Speed" +msgstr "Viteză" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Foarte încet" + +msgctxt "#30011" +msgid "Slow" +msgstr "Încet" + +msgctxt "#30012" +msgid "Default" +msgstr "Standard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rapidă" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Foarte rapidă" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ru_ru/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ru_ru/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ru_ru/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ru_ru/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/kodi-main/language/ru_RU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru_RU\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Режим" + +msgctxt "#30001" +msgid "Filled" +msgstr "Сплошной" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Каркас" + +msgctxt "#30003" +msgid "Points" +msgstr "Точки" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Высота полос" + +msgctxt "#30005" +msgid "Small" +msgstr "Небольшие" + +msgctxt "#30006" +msgid "Default" +msgstr "По-умолчанию" + +msgctxt "#30007" +msgid "Big" +msgstr "Крупные" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Огромные" + +msgctxt "#30009" +msgid "Speed" +msgstr "Скорость" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Очень медленно" + +msgctxt "#30011" +msgid "Slow" +msgstr "Медленно" + +msgctxt "#30012" +msgid "Default" +msgstr "По-умолчанию" + +msgctxt "#30013" +msgid "Fast" +msgstr "Быстро" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Очень быстро" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.si_lk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.si_lk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.si_lk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.si_lk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,37 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/kodi-main/language/si_LK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: si_LK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "ක්‍රමය" + +msgctxt "#30005" +msgid "Small" +msgstr "කුඩා " + +msgctxt "#30006" +msgid "Default" +msgstr "නියත " + +msgctxt "#30009" +msgid "Speed" +msgstr "වේගය " + +msgctxt "#30012" +msgid "Default" +msgstr "නියත " diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sk_sk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sk_sk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sk_sk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sk_sk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/kodi-main/language/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režim" + +msgctxt "#30001" +msgid "Filled" +msgstr "Vyplnený" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Drôtový model" + +msgctxt "#30003" +msgid "Points" +msgstr "Body" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Výška stĺpcov" + +msgctxt "#30005" +msgid "Small" +msgstr "Malý" + +msgctxt "#30006" +msgid "Default" +msgstr "Štandardný" + +msgctxt "#30007" +msgid "Big" +msgstr "Veľký" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Veľmi veľký" + +msgctxt "#30009" +msgid "Speed" +msgstr "Rýchlosť" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Veľmi pomalo" + +msgctxt "#30011" +msgid "Slow" +msgstr "Pomalo" + +msgctxt "#30012" +msgid "Default" +msgstr "Štandardná" + +msgctxt "#30013" +msgid "Fast" +msgstr "Rýchlo" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Veľmi rýchlo" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sl_si/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sl_si/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sl_si/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sl_si/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/kodi-main/language/sl_SI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl_SI\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Način" + +msgctxt "#30001" +msgid "Filled" +msgstr "Polno" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Shema" + +msgctxt "#30003" +msgid "Points" +msgstr "Točke" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Višina stolpcev" + +msgctxt "#30005" +msgid "Small" +msgstr "Majhna" + +msgctxt "#30006" +msgid "Default" +msgstr "Privzeta" + +msgctxt "#30007" +msgid "Big" +msgstr "Velika" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Zelo velika" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hitrost" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Zelo počasno" + +msgctxt "#30011" +msgid "Slow" +msgstr "Počasno" + +msgctxt "#30012" +msgid "Default" +msgstr "Privzeto" + +msgctxt "#30013" +msgid "Fast" +msgstr "Hitro" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Zelo hitro" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sq_al/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sq_al/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sq_al/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sq_al/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Albanian (Albania) (http://www.transifex.com/projects/p/kodi-main/language/sq_AL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq_AL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mënyra" + +msgctxt "#30001" +msgid "Filled" +msgstr "Plotësuar" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Pikë" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Naltësija e kallëpit" + +msgctxt "#30005" +msgid "Small" +msgstr "Të vogël" + +msgctxt "#30006" +msgid "Default" +msgstr "Prezgjedhuar" + +msgctxt "#30007" +msgid "Big" +msgstr "I madh" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Shumë i madh" + +msgctxt "#30009" +msgid "Speed" +msgstr "Shpejtësija" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Shumë ngadal" + +msgctxt "#30011" +msgid "Slow" +msgstr "Ngadal" + +msgctxt "#30012" +msgid "Default" +msgstr "Prezgjedhuar" + +msgctxt "#30013" +msgid "Fast" +msgstr "Shpejt" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Shumë i shpejtë" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sr_rs/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sr_rs/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sr_rs/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sr_rs/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,37 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Serbian (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Режим" + +msgctxt "#30006" +msgid "Default" +msgstr "Подразумевано" + +msgctxt "#30009" +msgid "Speed" +msgstr "Брзина" + +msgctxt "#30012" +msgid "Default" +msgstr "Подразумевано" + +msgctxt "#30013" +msgid "Fast" +msgstr "Брзо" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sr_rs@latin/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sr_rs@latin/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sr_rs@latin/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sr_rs@latin/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Serbian (Latin) (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS@latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Režim" + +msgctxt "#30005" +msgid "Small" +msgstr "Malo" + +msgctxt "#30006" +msgid "Default" +msgstr "Podrazumevano" + +msgctxt "#30009" +msgid "Speed" +msgstr "Brzina" + +msgctxt "#30012" +msgid "Default" +msgstr "Podrazumevano" + +msgctxt "#30013" +msgid "Fast" +msgstr "Brzo" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sv_se/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sv_se/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.sv_se/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.sv_se/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/kodi-main/language/sv_SE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv_SE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Läge" + +msgctxt "#30001" +msgid "Filled" +msgstr "Fylld" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Wireframe" + +msgctxt "#30003" +msgid "Points" +msgstr "Punkter" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Stapelhöjd" + +msgctxt "#30005" +msgid "Small" +msgstr "Liten" + +msgctxt "#30006" +msgid "Default" +msgstr "Standard" + +msgctxt "#30007" +msgid "Big" +msgstr "Stor" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Väldigt stor" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hastighet" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Väldigt långsam" + +msgctxt "#30011" +msgid "Slow" +msgstr "Långsam" + +msgctxt "#30012" +msgid "Default" +msgstr "Standard" + +msgctxt "#30013" +msgid "Fast" +msgstr "Snabb" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Väldigt snabb" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.szl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.szl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.szl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.szl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,73 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Silesian (http://www.transifex.com/projects/p/kodi-main/language/szl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: szl\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Tryb" + +msgctxt "#30001" +msgid "Filled" +msgstr "Wypołniōne" + +msgctxt "#30003" +msgid "Points" +msgstr "Pōnkty" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Wyżka lajsty" + +msgctxt "#30005" +msgid "Small" +msgstr "Małe" + +msgctxt "#30006" +msgid "Default" +msgstr "Wychodne" + +msgctxt "#30007" +msgid "Big" +msgstr "Sroge" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Fest sroge" + +msgctxt "#30009" +msgid "Speed" +msgstr "Wartkość" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Fest poleku" + +msgctxt "#30011" +msgid "Slow" +msgstr "Poleku" + +msgctxt "#30012" +msgid "Default" +msgstr "Wychodne" + +msgctxt "#30013" +msgid "Fast" +msgstr "Wartko" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Fest wartko" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ta_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ta_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.ta_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.ta_in/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/kodi-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "முறை" + +msgctxt "#30005" +msgid "Small" +msgstr "சிறிய" + +msgctxt "#30006" +msgid "Default" +msgstr "இயல்புநிலை" + +msgctxt "#30009" +msgid "Speed" +msgstr "வேகம்" + +msgctxt "#30012" +msgid "Default" +msgstr "இயல்புநிலை" + +msgctxt "#30013" +msgid "Fast" +msgstr "வேகமாக" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.te_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.te_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.te_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.te_in/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Telugu (India) (http://www.transifex.com/projects/p/kodi-main/language/te_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30009" +msgid "Speed" +msgstr "వేగం" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.tg_tj/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.tg_tj/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.tg_tj/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.tg_tj/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tajik (Tajikistan) (http://www.transifex.com/projects/p/kodi-main/language/tg_TJ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg_TJ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Ҳолат" + +msgctxt "#30001" +msgid "Filled" +msgstr "Пуршуда" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Чорчӯбаи хаттӣ" + +msgctxt "#30003" +msgid "Points" +msgstr "Нуқтаҳо" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Баландии навор" + +msgctxt "#30005" +msgid "Small" +msgstr "Хурд" + +msgctxt "#30006" +msgid "Default" +msgstr "Пешфарз" + +msgctxt "#30007" +msgid "Big" +msgstr "Калон" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Хеле калон" + +msgctxt "#30009" +msgid "Speed" +msgstr "Суръат" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Хеле суст" + +msgctxt "#30011" +msgid "Slow" +msgstr "Суст" + +msgctxt "#30012" +msgid "Default" +msgstr "Пешфарз" + +msgctxt "#30013" +msgid "Fast" +msgstr "Тез" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Хеле тез" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.th_th/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.th_th/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.th_th/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.th_th/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/kodi-main/language/th_TH/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th_TH\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "โหมด" + +msgctxt "#30001" +msgid "Filled" +msgstr "เติมพื้นผิว" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "โครงลวด" + +msgctxt "#30003" +msgid "Points" +msgstr "จุด" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "ความสูงของแท่ง" + +msgctxt "#30005" +msgid "Small" +msgstr "เล็ก" + +msgctxt "#30006" +msgid "Default" +msgstr "ค่าพื้นฐาน" + +msgctxt "#30007" +msgid "Big" +msgstr "ใหญ่" + +msgctxt "#30008" +msgid "Very Big" +msgstr "ใหญ่มาก" + +msgctxt "#30009" +msgid "Speed" +msgstr "ความเร็ว" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "ช้ามาก" + +msgctxt "#30011" +msgid "Slow" +msgstr "ช้า" + +msgctxt "#30012" +msgid "Default" +msgstr "ค่าพื้นฐาน" + +msgctxt "#30013" +msgid "Fast" +msgstr "เร็ว" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "เร็วมาก" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.tr_tr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.tr_tr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.tr_tr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.tr_tr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/kodi-main/language/tr_TR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr_TR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Mod" + +msgctxt "#30001" +msgid "Filled" +msgstr "Dolu" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Telkafes" + +msgctxt "#30003" +msgid "Points" +msgstr "Noktalar" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Çubuk Yüksekliği" + +msgctxt "#30005" +msgid "Small" +msgstr "Küçük" + +msgctxt "#30006" +msgid "Default" +msgstr "Varsayılan" + +msgctxt "#30007" +msgid "Big" +msgstr "Büyük" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Çok Büyük" + +msgctxt "#30009" +msgid "Speed" +msgstr "Hız" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Çok Yavaş" + +msgctxt "#30011" +msgid "Slow" +msgstr "Yavaş" + +msgctxt "#30012" +msgid "Default" +msgstr "Varsayılan" + +msgctxt "#30013" +msgid "Fast" +msgstr "Hızlı" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Çok Hızlı" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.uk_ua/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.uk_ua/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.uk_ua/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.uk_ua/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/kodi-main/language/uk_UA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk_UA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Режим" + +msgctxt "#30001" +msgid "Filled" +msgstr "Заповнений" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Контури" + +msgctxt "#30003" +msgid "Points" +msgstr "Крапки" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Висота стовпчика" + +msgctxt "#30005" +msgid "Small" +msgstr "Мала" + +msgctxt "#30006" +msgid "Default" +msgstr "За промовчанням" + +msgctxt "#30007" +msgid "Big" +msgstr "Велика" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Дуже велика" + +msgctxt "#30009" +msgid "Speed" +msgstr "Швидкість" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Дуже повільно" + +msgctxt "#30011" +msgid "Slow" +msgstr "Повільно" + +msgctxt "#30012" +msgid "Default" +msgstr "За промовчанням" + +msgctxt "#30013" +msgid "Fast" +msgstr "Швидкість" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Дуже швидко" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.uz_uz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.uz_uz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.uz_uz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.uz_uz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Uzbek (Uzbekistan) (http://www.transifex.com/projects/p/kodi-main/language/uz_UZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz_UZ\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Usul" + +msgctxt "#30006" +msgid "Default" +msgstr "Andoza" + +msgctxt "#30009" +msgid "Speed" +msgstr "Tezligi" + +msgctxt "#30012" +msgid "Default" +msgstr "Andoza" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.vi_vn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.vi_vn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.vi_vn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.vi_vn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/kodi-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "Chế độ" + +msgctxt "#30001" +msgid "Filled" +msgstr "Làm đầy" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "Khung dây" + +msgctxt "#30003" +msgid "Points" +msgstr "Số điểm" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "Chiều cao cột" + +msgctxt "#30005" +msgid "Small" +msgstr "Nhỏ" + +msgctxt "#30006" +msgid "Default" +msgstr "Mặc định" + +msgctxt "#30007" +msgid "Big" +msgstr "Lớn" + +msgctxt "#30008" +msgid "Very Big" +msgstr "Rất lớn" + +msgctxt "#30009" +msgid "Speed" +msgstr "Tốc độ" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "Rất chậm" + +msgctxt "#30011" +msgid "Slow" +msgstr "Chậm" + +msgctxt "#30012" +msgid "Default" +msgstr "Mặc định" + +msgctxt "#30013" +msgid "Fast" +msgstr "Nhanh" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "Rất nhanh" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.zh_cn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.zh_cn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.zh_cn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.zh_cn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/kodi-main/language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "模式" + +msgctxt "#30001" +msgid "Filled" +msgstr "填充" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "线框" + +msgctxt "#30003" +msgid "Points" +msgstr "点" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "柱高" + +msgctxt "#30005" +msgid "Small" +msgstr "小" + +msgctxt "#30006" +msgid "Default" +msgstr "默认" + +msgctxt "#30007" +msgid "Big" +msgstr "大" + +msgctxt "#30008" +msgid "Very Big" +msgstr "特大" + +msgctxt "#30009" +msgid "Speed" +msgstr "速度" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "极慢" + +msgctxt "#30011" +msgid "Slow" +msgstr "慢" + +msgctxt "#30012" +msgid "Default" +msgstr "默认" + +msgctxt "#30013" +msgid "Fast" +msgstr "快" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "极快" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.zh_tw/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.zh_tw/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/language/resource.language.zh_tw/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/language/resource.language.zh_tw/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: OpenGL Spectrum +# Addon id: visualization.glspectrum +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/kodi-main/language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mode" +msgstr "模式" + +msgctxt "#30001" +msgid "Filled" +msgstr "填滿" + +msgctxt "#30002" +msgid "Wireframe" +msgstr "線框" + +msgctxt "#30003" +msgid "Points" +msgstr "點狀" + +msgctxt "#30004" +msgid "Bar Height" +msgstr "頻譜長條高度" + +msgctxt "#30005" +msgid "Small" +msgstr "小" + +msgctxt "#30006" +msgid "Default" +msgstr "預設" + +msgctxt "#30007" +msgid "Big" +msgstr "大" + +msgctxt "#30008" +msgid "Very Big" +msgstr "非常大" + +msgctxt "#30009" +msgid "Speed" +msgstr "速度" + +msgctxt "#30010" +msgid "Very Slow" +msgstr "非常慢" + +msgctxt "#30011" +msgid "Slow" +msgstr "縵" + +msgctxt "#30012" +msgid "Default" +msgstr "預設" + +msgctxt "#30013" +msgid "Fast" +msgstr "快" + +msgctxt "#30014" +msgid "Very Fast" +msgstr "非常快" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/settings.xml kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/settings.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.glspectrum/resources/settings.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.glspectrum/resources/settings.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,6 @@ + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/addon.xml kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/addon.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/addon.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,118 @@ + + + + + MilkDrop laat jou sweef deur die klankgolwe wat jy hoor + يحلق بك MilkDrop فوق الموجات الصوتية اللتي تسمع + MilkDrop takes you flying through the soundwaves you're hearing + "MilkDrop" ще Ви отведе на пътешествие между звуковите вълни, които чувате + MilkDrop et porta volant a través de les ones de so que escoltes + MilkDrop s Vámi proletí skrz zvukové vlny, které slyšíte + Mae MilkDrop yn eich hedeg drwy'r tannau sain rydych yn eu clywed + Milkdrop tager dig på en flyvetur gennem lydbølgerne, du lytter til + MilkDrop nimmt dich mit auf einen Flug durch deine Musik. + Το MilkDrop σας ταξιδεύει μέσα στα ηχητικά κύματα που ακούτε + MilkDrop takes you flying through the soundwaves you're hearing + MilkDrop takes you flying through the soundwaves you're hearing + MilkDrop takes you flying through the soundwaves you're hearing + MilkDrop takes you flying through the soundwaves you're hearing + MilkDrop te lleva volando a través de las ondas que estás escuchando + MilkDrop te lleva volando a través de las ondas que estás escuchando + MilkDrop the lleva volando a través de las ondas de sonido que estás escuchando + MilkDrop viib sind lennates läbi kullatavate helilainete + MilkDrop شما را در صدایی که می شنوید به پرواز در می آورد + MilkDrop lennättää sinut ääniaaltojen läpi + MilkDrop vous fait voler au travers des ondes sonores que vous entendez + MilkDrop vous fait voyager dans les ondes sonores de votre musique + MilkDrop lévate voando a través da ondas de son que esta a ouvir + החיזוי MilkDrop לוקח את המאזין לטיסה בין גלי הקול + MilkDrop vam omogućuje let kroz zvuk koji čujete + A Milkdrop végigrepít a zene hullámain + MilkDrop membawa anda terbang melalui gelombang suara yang anda dengarkan + Með MilkDrop flýgurðu í gegnum hljóðbylgjurnar sem þú heyrir + MilkDrop ti fa volare tra le onde sonore di ciò che stai ascoltando + MilkDrop - 音楽の波の上を飛ぶ + MilkDrop은 사운드웨이브 속으로 날아가는듯한 효과를 보여줍니다. + MilkDrop nukelia Jus i nuostabu skrydi virs debesu, istiesu fantastisku garsu gausa + MilkDrop paņem Jūs līdzi lidojumā cauri skaņu viļņiem, kurus dzirdat + MilkDrop ве прелетува преку брановите на музиката која ја слушате + MilkDrop memikat pendengaran anda melalui gelombang bunyi yang dihasilkan + MilkDrop tar deg med på en flyreise gjennom lydbølgene du hører + Met MilkDrop vliegt u mee door de geluidsgolven die je hoort + MilkDrop zabiera Cię w niesamowity lot w chmurach aktualnie słuchanych dźwięków + O MilkDrop leva você para voar nas ondas sonoras que está ouvindo + O MilkDrop leva-o num voo através das ondas sonoras que está a ouvir + MilkDrop vă face să zburați printre undele audio pe care le auziți + Milkdrop отправит вас в полёт через звуковые волны, которые вы слышите + MilkDrop s Vami poletí zvukovými vlnami, ktoré počúvate + MilkDrop vas popelje skozi zvočne valove, ki jih poslušate + MilkDrop të bën të fluturosh nëpër valet të tingullit që e dëgjonë + Milkdrop för dig flygande genom de ljudvågor du hör. + MilkDrop бо мавҷҳои садояш фораму роҳатбахш аст + MilkDrop นำคุณโบยบิน ผ่านคลื่นเสียงที่คุณกำลังรับฟัง + MilkDrop sizi duymakta olduğunuz ses dalgalarının içine çeker + MilkDrop забере вас в політ крізь хвилі музики яку ви слухаєте + MilkDrop giúp bạn bay bổng trong âm thanh bạn đang nghe + MilkDrop 带你与声波一起飞翔 + MilkDrop帶您穿越聆聽中的音樂饗宴 + MilkDrop was oorspronklik 'n musiek visualisering "plug-in" vir die Winamp musiek speler. Soos jy na jou musiek luister, laat MilkDrop jou deur die klankgolwe sweef wat jy hoor, en gebruik klop waarnemings om 'n magdom psigedeliese effekte te aktiveer, en 'n visuele reis deur klank te skep. + ميلك دروب كان أصلا عارض موسيقى لمشغل الموسيقى وين امب. عندما تستمع لموسيقاك, كيلك دروب يطير بك خلال موجات صوتية تسمعا حيقيةً, ,و يستخدم كشف الوقع الموسيقي ليؤدي إلى تأثيرات كثيرة, منشئاً رجلة صوت مرئية قيمة. + MilkDrop was originally a music visualizer "plug-in" to the Winamp music player. As you listen to your music, MilkDrop takes you flying through the actual soundwaves you're hearing, and uses beat detection to trigger myriad psychedelic effects, creating a rich visual journey through sound. + Първоначално "MilkDrop" е замислена като приставка за музикалния плеър Winamp. Докато слушате музикалната си колекция "MilkDrop" ще Ви накара да "полетите", измежду звуковите вълни, които чувате. Ползва ритъма за да създаде безброй еуфорични ефекти. Така създава едно богато визуално пътешествие в звука. + El MilkDrop era originalment un afegitó de visualització musical pel reproductor Winamp. Mentre escoltes la música MilkDrop et porta volant a través de les ones de so que estàs escoltant al moment, i utilitza detecció de tempo per activar una munió d'efectes psicodèlics i crea un enriquidor viatge visual a través del so. + MikDrop bylo původně vizualizační rozšíření pro přehrávač hudby Winamp. Při poslechu vaší hudby s Vámi MikDrop prolétá skrze zvukové vlny, které slyšíte, a používá detekci taktů, pro spuštění spousty psychedelických efektů, vytvářejíce tak zajímavou vizuální cestu skrze zvuk. + Roedd MilkDrop yn wreiddiol yn "ategyn" delweddu cerddoriaeth ar gyfer Winamp. Wrth i chi wrando ar MilkDrop mae MilkDrop yn eich hedeg drwy'r tonnau sain rydych yn eu clywed gan ddefnyddio canfodydd trawiad i gychwyn effeithiau seicadelig amrywiol gan greu taith weledol cyfoethog drwy'r sain. + Milkdrop var oprindeligt et musikvisualisering "plug-in" til Winamp musikafspilleren. Mens du lytter til din musik, tager Milkdrop dig på en flyvetur gennem de faktiske lydbølger du hører og bruger beat-genkendelse til at udløse en myriade af psykedeliske effekter, der skaber en visuel rejse gennem lyd. + MilkDrop war ursprünglich ein Musik-Visualizer "Plug-in" für den Musik-Player Winamp.Wenn Sie Ihre Musik hören, fliegen Sie mit MilkDrop durch die aktuellen Klangwellen die Sie hören. Und die Beat-Erkennung wird genutzt um unzählige psychedelische Effekte auslösen, die Schaffung einer visuellen Reise durch den Klang. + Το MilkDrop ήταν αρχικά ένα "plug-in" μουσικών οπτικοποιήσεων του Winamp. Καθώς παίζετε τη μουσική σας, το MilkDrop σας ταξιδεύει μέσα στα πραγματικά ηχητικά κύματα που ακούτε, και χρησιμοποιεί ανίχνευση ρυθμού για να ενεργοποιήσει ένα πλήθος ψυχεδελικών εφέ, δημιουργώντας ένα πλούσιο οπτικό ταξίδι μέσα στον ήχο. + MilkDrop was originally a music visualiser "plug-in" to the Winamp music player. As you listen to your music, MilkDrop takes you flying through the actual soundwaves you're hearing, and uses beat detection to trigger a myriad of psychedelic effects, creating a rich visual journey through sound. + MilkDrop was originally a music visualiser "plug-in" to the Winamp music player. As you listen to your music, MilkDrop takes you flying through the actual soundwaves you're hearing, and uses beat detection to trigger myriad psychedelic effects, creating a rich visual journey through sound. + MilkDrop was originally a music visualiser "plug-in" to the Winamp music player. As you listen to your music, MilkDrop takes you flying through the actual soundwaves you're hearing, and uses beat detection to trigger myriad psychedelic effects, creating a rich visual journey through sound. + MilkDrop was originally a music visualizer "plug-in" to the Winamp music player. As you listen to your music, MilkDrop takes you flying through the actual soundwaves you're hearing, and uses beat detection to trigger myriad psychedelic effects, creating a rich visual journey through sound. + MilkDrop era originalmente un plug-in visualizador de música para Winamp. Mientras escuchas música, MilkDrop te lleva volando a través de las ondas que estás escuchando, y utiliza la detección del ritmo para activar una gran cantidad de efectos psicodélicos, creando una rica experiencia visual a través del sonido. + MilkDrop era originalmente un plug-in visualizador de música para Winamp. Mientras escuchas música, MilkDrop te lleva volando a través de las ondas que estás escuchando, y utiliza la detección del ritmo para activar una gran cantidad de efectos psicodélicos, creando una rica experiencia visual a través del sonido. + MilkDrop originalmente fue un "plug-in" visualizador de música para el reproductor de música Winamp. Mientras escuchas tu músuca, MilkDrop te lleva volando a través de las ondas de sonido que estás escuchando en ese momento, y usa detección de ritmo para desencadenar múltiples efectos psicodélicos, creando un rico recorrido visual a través del sonido. + MilkDrop oli algselt muusika visuaal plugin Winamp'ile. Muusikat kuulates viib MilkDrop sind lennates läbi kuulatavate helilainete. MilkDrop kasutab rütmituvastust, et päästa valla tohutu hulk psühhedeelseid efekte luues visuaalidest rikka teekonna läbi heli. + MilkDrop oli alunperin Winampin visualisaattorilisäosa. Kuunnellessasi musiikkia MilkDrop lennättää sinut kuulemiesi ääniaaltojen läpi ja käyttää tahdintunnistusta lukemattomien psykedeelisten tehosteiden toistamiseen, luoden visuaalisen matkan musiikin läpi. + MilkDrop était à l'origine un plugiciel de visualisation musicale pour le lecteur audio Winamp. Alors que vous écoutez votre musique, Milkdrop vous fait voler au travers des ondes sonores, et utilise la détection rythmique pour déclencher une myriade d'effets psychédéliques, créant un voyage visuel et sonore. + MilkDrop était à l'origine une extension de visualisation musicale pour le lecteur audio Winamp. Pendant que vous écoutez votre musique, Milkdrop vous fait voyager à travers les ondes sonores que vous entendez, détectant le rythme pour déclencher une myriade d'effets psychédéliques, créant ainsi une riche expérience visuelle et sonore. + MilkDrop foi orixinalmente un plugin de Visualización para múica do reprodutor de música Winamp. Nametres vostede escoita a súa música, MilkDrop lévao voando a través das ondas de son que esta a ouvir, e emprega a detección de ritmo para activar milleiros de efectos psicodélicos, creando unha rica viaxe visual a través do son. + החיזוי MilkDrop במקור הינו הרחבה לנגן המוזיקה Winamp. בעת האזנה למוזיקה, MilkDrop יקח את המאזין לטיסה בין גלי הקול שנשמעים, וישתמש ביכולת זיהוי קצב מוזיקה להפעלת מספר עצום של אפקטים פסיכדלים, בכך יוצר מסע חזותי עשיר לגלי הקול. + MilkDrop je orginalno bio zamišljen kao "dodatak" za Winamp glazbeni svirač. Dok slušate svoju glazbu, MilkDrop vam omogućuje let kroz zvuk koji čujete i koristi otkrivanje taktova da bi pokrenuo bezbroj psihodeličnih efekata, tako stvarajući bogato vizualno zvučno putovanje. + A Milkdrop eredetileg egy beépülőmodul volt a Winamp zenelejátszóhoz. Ahogy hallgatod a zenét, a Milkdrop keresztülrepít a hallható hanghullámokon, felhasználva a dobritmust pszihedelikus effektusok létrehozására gazdag látványvilág megteremtésével. + MilkDrop awalnya adalah pengaya visualisasi musik untuk Winamp. Sembari mendengarkan musik, MilkDrop akan membawa Anda terbang melalui gelombang suara yang Anda dengarkan, dan menggunakan deteksi ketukan untuk menampikan banyak sekali efek psikedelik, menciptakan suatu perjalanan visual yang kaya melalui suara. + Milkdrop var upprunalega viðbót við Winamp tónlistarspilarann. Þegar þú hlustar á tónlistina, fer Milkdrop með þig á flug í gegnum hljóðbylgjurnar sem þú heyrir og notar taktskynjun til að setja af stað allskonar effekta sem skapa myndrænt ferðalag í gegnum tónlistarupplifunina + MilkDrop era, in origine, un "plug-in" di visualizzazione per Winamp. Mentre ascolti la musica, MilkDrop ti fa volare tra le onde sonore di ciò che stai ascoltando usando la rilevazione del ritmo per sincronizzare una miriade di effetti psichedelici, creando un ricco viaggio visuale attraverso il suono. + MilkDrop は元々 Winamp 音楽プレーヤーのビジュアライザープラグインでした。音楽を再生すると、音楽にあわせた波の上を飛んでいるような視覚効果が現れ、ビート検出により無数のサイケデリックな効果が生まれ、音による視覚的体験を生み出します。 + MilkDrop는 원래 윈앰프의 음악 시각화 플러그인입니다. 음악을 들으면서 사운드 웨이브로 날아가는듯한 효과를 보여주며 비트 감지를 해서 다양한 싸이키데릭한 효과를 만들어 풍부한 시각적 경험을 하게합니다. + MilkDrop vizualizacija, gauta is Winamp. Klausantis muzikos, MilkDrop nukelia jus i nuostabu skrydi virs debesu, naudojamas ritmo aptikimas, kuris sinchronizuoja muzikos vaizdo efektus. + MilkDrop sākotnēji bija mūzikas vizualizācijas "spraudnis" Winamp mūzikas atskaņotājā. Kamēr tu klausies mūziku, MilkDrop paņem tevi līdz lidojumā cauri skaņas viļņiem, kuri skan, un izmanto ritma noteikšanu, lai palaistu myriad psihodēliskos efektus, radot bagātu vizuālo ceļojumu cauri skaņai. + MilkDrop беше визуализација допонување на Winamp music player. Како што ја слушате музиката, MilkDrop ве прелетува преку актуелните музички бранови, и користи детекција на битот за да покрене myriad психоделични ефекти, креирајќи богато визуелно патување низ звукот. + MilkDrop pada asalnya adalah pemalam pengvisual untuk pemain muzik Winamp. Ketika anda mendengar muzik, MilkDrop memaparkan gelombang bunyi yang dengari dan guna pengesanan rentak untuk memicu kesan psikedelik tak terkira banyaknya, dan menghasilkan perjalanan visual yang sempurna menerusi bunyi. + MilkDrop var originalt et visualiseringstillegg til musikkavspilleren Winamp. Mens du lytter til musikken din, tar MilkDrop deg med på en reise gjennom de faktiske lydbølgene du hører. Visualiseringen oppdager takten i musikken og bruker denne for å skape en rik, visuell ferd gjennom utallige, psykedeliske effekter. + Milkdrop was oorspronkelijk een muziekvisualisatieplug-in voor de Winamp-muziekspeler. Terwijl u uw muziek beluistert vliegt Milkdrop u door de soundwaves die u op dat moment hoort. Op basis van de beat produceert het een veelvoud aan psychedelische effecten. + MilkDrop jest wizualizacją pochodzącą z odtwarzacza Winamp. W czasie słuchania muzyki, MilkDrop zabiera użytkownika w niesamowity lot pomiędzy aktualnie odtwarzanymi falami dźwiękowymi, używając detekcji rytmu, która synchronizuje efekty wizualne z muzyką. + MilkDrop era originalmente uma visualização do reprodutor de música Winamp. Ao ouvir a sua música, o MilkDrop leva-o a voar nas ondas sonoras que está a ouvir, usando detecção de batida para desencadear uma miríade de efeitos psicodélicos. Cria, assim, uma viagem visual inesquecível pelo som. + Originalmente, o MilkDrop era uma visualização do leitor de música Winamp. Ao ouvir a sua música, o MilkDrop leva-o a voar pelas ondas sonoras que está a ouvir, detectando o ritmo da música e desencadeando uma variedade de efeitos psicadélicos. Cria, assim, uma viagem inesquecível pelo som. + MilkDrop a fost original un „modul” de vizualizare pentru lectorul de muzică Winamp. În timp ce ascultați muzica, MilkDrop vă face să zburați printre undele audio actuale pe care le auziți și folosește detecția bătăii pentru a activa miriada de efecte psihedelice, creând o călătorie vizuală bogată printre sunete. + MilkDrop изначально был модулем визуализации музыки для проигрывателя Winamp. Когда вы слушаете музыку, MilkDrop создает визуальное ощущение полёта по звуковым волнам, а также использует обнаружение ритма для активации множества психоделических эффектов. + MilkDrop bol pôvodne hudobným vizualizačným rozšírením Winamp prehrávača. Pri počúvaní hudby s Vami MilkDrop letí zvukovými vlnami, ktoré počúvate a použitím detekcie rytmu spúšťa nespočetné psychodelické efekty, a vytvára bohatú vizuálnu cestu zvukom. + MilkDrop je bila prvotno vizualizacija za predvajalnik Winamp. Ko poslušate vašo glasbo, vas MilkDrop popelje skozi dejansko valovanje, ki ga slišite, in uporablja zaznavanje ritma, kar omogoči psihedelični efekt in bogato vizualno izkušnjo predvajanja glasbe. + Milkrop fillimisht ishte një "plug-in" për vizualizimin e muzikës për riprodhuesin Winamp. Ndërsa dëgjonë muzikën tënde, Milkdrop vizualizon valët që i dëgjon dhe përdor zbulimin e tingullit për efekte të ndryshme. + Milkdrop var ursprungligen ett visualiserarande ljudplug-in till Winamp. Medan du lyssnar på din musik så för dig Milkdrop flygande genom de ljudvågor du hör och använder rytmavkänning för att ge dig psykedeliska effekter som skapar en mäktig visuell resa via ljudet. + MilkDrop аз ибтидо плагини таҷассуми мусиқие барои плеери мусиқии Winamp буд. Вақте ки шумо мусиқиро мешунавед, MilkDrop бо мавҷҳои садояш фораму роҳатбахш аст, ва муайянкуни битҳои мусиқиро барои эҷоди таъсирҳои девонагӣ истифода мекунад ва шуморо ба сайёҳии мусиқӣ мебарад. + MilkDrop แต่เดิมเป็น "ปลั๊ก-อิน" การแสดงแสงสีประกอบเพลง ของโปรแกรมเล่นเพลง Winamp. ในขณะที่คุณฟังเพลงของคุณ, MilkDrop นำคุณบินผ่านคลื่นเสียงที่เกิดขึ้นตามที่คุณได้ยิน, และใช้การจับจังหวะ ในการส่งผลต่อเอฟเฟคภาพลวงตา อันหลากหลาย, สร้างภาพอันตื่นตาในการเดินทางไปตามเสียงเพลง. + MilkDrop aslında Winamp müzik çalıcısı için görsel bir "eklenti" dir. Müziğinizi dinlerken, Milkdrop size işittiğiniz ses dalgaları arasında uçuyormuşcasına bir his ve ritm algılayıcısı ile de en çılgın efektleri yaşıyormuşçasına görsel bir şölen sunar. + MilkDrop спочатку був додатком візуалізації музики для програвача музики Winamp. MilkDrop створює багату гаму візуалізації музики, використовуючи власний механізм визначення музичних тактів. + MilkDrop ban đầu là một "plug-in" trình diễn nhạc cho Winamp. Khi bạn nghe nhạc, MilkDrop sẽ làm bạn bay bổng trong âm thanh bạn đang nghe, và sử dụng bộ dò giai điệu để kích hoạt vô số những hiệu ứng ảo, tạo ra một cuộc hành trình âm thanh qua mắt thường + MilkDrop 是来自于 Winamp 音乐播放器的可视化效果插件。在你听音乐时,MilkDrop 通过节拍检测触发的无数迷幻的效果,带你与声波一起飞翔,给你带来丰富的音乐和视觉旅程。 + MilkDrop是來自於Winamp音樂播放器的視覺效果插件。在您在聽音樂時,MilkDrop通過節奏偵測觸發的無數夢幻的效果,帶您穿越聆聽中的音樂饗宴,也給您帶來豐富的聲音和視覺效果的奇幻旅程。 + windx + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/icon.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/presets/WA51-presets(265).zip and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/presets/WA51-presets(265).zip differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/presets/Winamp-presets(436).zip and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/presets/Winamp-presets(436).zip differ diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.af_za/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.af_za/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.af_za/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.af_za/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/kodi-main/language/af_ZA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af_ZA\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Outomatiese Meng Tyd" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tyd Tussen Voorafinstellings" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Addisionele Lukraak Tyd" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Stel Anisotrope Filter in staat" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Stel Harde Snye in Staat" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Luidheid Drumpel vir Harde Snye" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Gemiddelde Tyd Tussen Harde Snye" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maksimum Verfris Tempo" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Aktiveer Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Voorafinstellings Pak" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Gebruiker Voorafinstellings Vouer " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Voorafinstellings Skommel Modus" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Voorafinstellings" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp Voorafinstellings" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Gebruiker Gedefinieerde Voorafinstellings Vouer" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek." + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f rps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.am_et/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.am_et/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.am_et/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.am_et/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Amharic (Ethiopia) (http://www.transifex.com/projects/p/kodi-main/language/am_ET/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: am_ET\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ar_sa/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ar_sa/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ar_sa/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ar_sa/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/kodi-main/language/ar_SA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar_SA\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "مزيج وقت تلقائي" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "الزمن بين الإعدادات المسبقة" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "وقت إضافي عشوائي" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "تمكين تنقية التباين" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "تمكين التوقفات القوية" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "عتبة الضجيج للتقطعات." + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "متوسط الزمن بين الانقطاعات القوية" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "أقصى معدل التحديث" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "تمكين Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "حزمة الإعدادات المسبقة" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "مجلد الإعدادات المسبقة للمستخدم" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "الوضع العشوائي للإعدادات المسبقة" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 نغمات" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr " تغمات وين امب" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "مستخدم مجلد نغمات معرف" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.be_by/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.be_by/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.be_by/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.be_by/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Belarusian (Belarus) (http://www.transifex.com/projects/p/kodi-main/language/be_BY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be_BY\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatic Blend Time" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Time Between Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Additional Random Time" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Enable Anisotropic Filtering" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Enable Hard Cuts" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Loudness Threshold For Hard Cuts" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Average Time Between Hard Cuts" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maximum Refresh Rate" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Enable Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "User Preset Folder " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Preset Shuffle Mode" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Presets" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp Presets" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "User Defined Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сэк." + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.bg_bg/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.bg_bg/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.bg_bg/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.bg_bg/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/kodi-main/language/bg_BG/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg_BG\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Време за автоматично сливане" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Време между отделните шаблони" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Допълнително произволно време" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Включи анизотропното филтриране" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Включи Hard Cuts" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Прагове на усилване за Hard Cuts" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Средно време между Hard Cuts" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Максимум за честотата на обновяване" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Включи 3D стерео режим" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Пакет шаблони" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Папка със шаблони " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Режим за смяна на шаблоните" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Шаблони" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Шаблони от Winamp " + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Папка за шаблоните на потребителя" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сек" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ca_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ca_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ca_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ca_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Catalan (Spain) (http://www.transifex.com/projects/p/kodi-main/language/ca_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Temps de mescla automàtica" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Temps entre predefinits" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Temps Aleatori Addicional" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Habilita el filtre anisotròpic" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Habilita talls en sec" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Llindar de volum pels talls en sec" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Temps mig entre talls en sec" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Temps de refresc màxim" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Habilita l'estèreo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paquet de predefinits" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Directori de predefinits de l'usuari" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Mode aleatori de predefinits" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Predefinits WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Predefinits Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Directori de predefinits establert per l'usuari" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.cs_cz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.cs_cz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.cs_cz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.cs_cz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/kodi-main/language/cs_CZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs_CZ\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatický čas sloučení" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Čas mezi předvolbami" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Dodatečný náhodný čas" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Povolit artroskopické filtrování" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Povolit ostrá utnutí" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Hrana hlasitosti pro ostré utnutí" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Průměrný čas mezi ostrými utnutími" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maximální obnovovací frekvence" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Povolit Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Balíček předvoleb" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Složka uživatelských předvoleb " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Režim náhodné předvolby" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Předvolby WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Předvolby Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Uživatelem zadaná složka předvoleb" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f s" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.cy_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.cy_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.cy_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.cy_gb/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Welsh (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/cy_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy_GB\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Amser Cymysgu Awtomatig" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Amse Rhwg Rhagosodiadau" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Amser Hap Ychwanegol" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Galluogi Hidlo Anisotropig" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Galluogi Toriadau Caled" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Trothwy Sain ar gyfer Toriadau Caled" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Amser Cyfartalog Rhwng Toriadau Caled" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Cyfradd Adnewyddu Uchaf" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Galluogi Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pac Rhagosodiad" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Defnyddio Ffolder Rhagosodiaid" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Modd Rjhagosodiaid Hap" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Rhagosodiaid WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Rhagosodiaid Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Ffolder Rhagosodiad Defnyddiwr Diffinedig" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f eil" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f ye" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.da_dk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.da_dk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.da_dk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.da_dk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Danish (Denmark) (http://www.transifex.com/projects/p/kodi-main/language/da_DK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da_DK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatisk blandingstid" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tid mellem forudindstillinger" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Ekstra tilfældig tid" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Aktiver anisotropisk filtrering" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Muliggør hårde skift" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Niveautærskel for hårde skift" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Gennemsnitlig tid mellem hårde skift" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maksimal opdateringshastighed" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Aktiver stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Forudindstillings-pakke" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Brugermappe med forudindstillinger" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Forudindstillet blandingstilstand" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 forudindstillinger" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp forudindstillinger" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Brugerdefineret mappe med forudindstillinger" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.de_de/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.de_de/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.de_de/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.de_de/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: German (Germany) (http://www.transifex.com/projects/p/kodi-main/language/de_DE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de_DE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatische Überblendezeit" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Zeit zwischen den Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Zusätzliche zufällige Zeit" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Anisotropischen Filter aktivieren" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Harte Schnitte aktivieren" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Lautstärken-Grenzwert für Hard Cuts" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Durchschnittszeit zwischen Hard Cuts" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maximale Wiederholrate" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Stereo 3D aktivieren" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Benutzer Vorlagen Ordner" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Zufallsvorlagen" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Vorlagen" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp Vorlagen" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "benutzerdefinierter Vorlagen Ordner" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sec" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.el_gr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.el_gr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.el_gr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.el_gr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Greek (Greece) (http://www.transifex.com/projects/p/kodi-main/language/el_GR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el_GR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Χρόνος Αυτόματης Μίξης" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Χρόνος Μεταξύ Προρυθμίσεων" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Επιπλέον Χρόνος Τυχαίων" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Ενεργοποίηση Ανισοτροπικού Φιλτραρίσματος" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Ενεργοποίηση Απότομων Μεταβάσεων" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Κατώφλι Έντασης για τις Απότομες Μεταβάσεις" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Μέσος Χρόνος Μεταξύ Απότομων Μεταβάσεων" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Μέγιστος Ρυθμός Ανανέωσης" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Ενεργοποίηση Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Πακέτο Προρυθμίσεων" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Φάκελος Προρυθμίσεων Χρήστη " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Λειτουργία Ανάμιξης Προρυθμίσεων" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Προρυθμίσεις του WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Προρυθμίσεις του Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Φάκελος Προρυθμίσεων Επιλογής Χρήστη" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f δευτερόλεπτα" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.en_au/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.en_au/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.en_au/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.en_au/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/kodi-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatic Blend Time" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Time Between Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Additional Random Time" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Enable Anisotropic Filtering" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Enable Hard Cuts" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Loudness Threshold For Hard Cuts" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Average Time Between Hard Cuts" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maximum Refresh Rate" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Enable Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "User Preset Folder " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Preset Shuffle Mode" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Presets" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp Presets" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "User Defined Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.en_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.en_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.en_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.en_gb/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,96 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#settings labels + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "" + +#empty strings from id 30012 to 30019 + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "" + +#empty strings from id 30023 to 30049 +#setting value formats + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.en_nz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.en_nz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.en_nz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.en_nz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/kodi-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatic Blend Time" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Time Between Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Additional Random Time" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Enable Anisotropic Filtering" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Enable Hard Cuts" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Loudness Threshold For Hard Cuts" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Average Time Between Hard Cuts" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maximum Refresh Rate" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Enable Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "User Preset Folder " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Preset Shuffle Mode" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Presets" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp Presets" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "User Defined Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.en_us/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.en_us/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.en_us/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.en_us/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United States) (http://www.transifex.com/projects/p/kodi-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatic Blend Time" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Time Between Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Additional Random Time" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Enable Anisotropic Filtering" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Enable Hard Cuts" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Loudness Threshold For Hard Cuts" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Average Time Between Hard Cuts" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maximum Refresh Rate" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Enable Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "User Preset Folder " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Preset Shuffle Mode" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Presets" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp Presets" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "User Defined Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.es_ar/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.es_ar/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.es_ar/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.es_ar/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/kodi-main/language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Tiempo de mezcla automático" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tiempo entre presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tiempo aleatorio adicional" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Activar el filtro Anisotrópico" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Habilitar cortes" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Umbral de volumen para cortes" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Tiempo medio entre cortes" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Frecuencia de actualización máxima" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Habilitar Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Conjunto de presets" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Carpeta de presets del usuario" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Modo aleatorio de presets" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Presets WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Presets Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Carpeta de presets definida por el usuario" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.es_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.es_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.es_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.es_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/kodi-main/language/es_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Tiempo de mezcla automático" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tiempo entre presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tiempo aleatorio adicional" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Activar el filtro Anisotrópico" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Habilitar cortes" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Umbral de volumen para cortes" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Tiempo medio entre cortes" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Frecuencia de actualización máxima" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Habilitar Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Conjunto de presets" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Carpeta de presets de usuario" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Modo aleatorio de presets" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Presets WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Presets Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Carpeta de presets definida por el usuario" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.es_mx/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.es_mx/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.es_mx/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.es_mx/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/kodi-main/language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Tiempo de Mezcla Automático" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tiempo Entre Preajustes" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tiempo Aleatorio Adicional" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Habilitar Filtrado Anisotrópico" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Habilitar Cortes en Seco" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Umbral de Intensidad para Cortes en Seco" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Tiempo Promedio Entre Cortes en Seco" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Máxima Frecuencia de Actualización" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Habilitar Estéreo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paquete de Preajustes" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Carpeta de Usuario de Preajustes" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Modo Aleatorio de Preajustes" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Preajustes WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Preajustes de Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Carpeta de Preajustes Definidos por Usuario" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f segs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.et_ee/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.et_ee/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.et_ee/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.et_ee/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/kodi-main/language/et_EE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et_EE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automaatne sulanduse aeg" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Eelseadistuste vaheline aeg" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Juhuslik lisaaeg" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Luba anisotroopne filtreerimine" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Kasuta tugevaid kärpeid" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Helitugevuse künnis" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Keskmine intervall" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Suurim värskendussagedus" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Stereo 3D kasutusel" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Eelseadete pakett" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Kasutaja eelseade kaust" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Eelseade segamise režiim" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 eelseaded" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp eelseaded" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Kasutaja määratud eelseade kaust" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f s" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.fa_ir/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.fa_ir/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.fa_ir/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.fa_ir/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,45 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/kodi-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "زمان بین پیش تنظیمات" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "زمان اتفاقی اضافه" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "بسته قالب ها" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "پوشه تعریف شده برای قالب ها" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f ثانیه" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %% " + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0 فریم در ثانیه" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.fi_fi/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.fi_fi/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.fi_fi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.fi_fi/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/kodi-main/language/fi_FI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi_FI\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automaattinen pehmennysaika" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Esiasetusten välinen aika" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Satunnainen lisäaika" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Anisotrooppinen suodatus käytössä" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Voimakkaat leikkaukset käytössä" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr " - Äänenvoimakkuuden kynnys" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr " - Keskimääräinen väli" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Suurin ruudunpäivitysnopeus" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Stereo 3D käytössä" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Esiasetuspaketti" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Käyttäjän esiasetuskansio " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Esiasetuksen sekoitustila" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51-esiasetukset" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp-esiasetukset" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Käyttäjän määrittämä esiasetuskansio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f s" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.fr_ca/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.fr_ca/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.fr_ca/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.fr_ca/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/kodi-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Durée de mélange automatique" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Intervalle entre les préréglages" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Ajout aléatoire de temps" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Activer le filtrage anisotropique" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Activer les coupures brusques" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Seuil de volume pour les coupures brusques" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Temps moyen entre les coupures brusques" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Fréquence de rafraîchissement maximale" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Activer la stéréo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Jeu de préréglages" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Dossier de préréglages de l'utilisateur " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Mode de préréglages aléatoire" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Préréglages WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Préréglages Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Dossier de préréglages de l'utilisateur" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f s" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f images-par-seconde" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.fr_fr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.fr_fr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.fr_fr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.fr_fr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (France) (http://www.transifex.com/projects/p/kodi-main/language/fr_FR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_FR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Durée des combinaisons" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Intervalle des présélections" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Ajout aléatoire de temps" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Activer le filtre anisotropique" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Activer les coupures brusques" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Seuil de volume pour les changements brusques" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Temps moyen entre les coupures" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Taux de rafraichissement maximum " + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Activer la Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pack de présélections" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Dossier de présélection de l'utilisateur " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Mode de présélections aléatoires" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Présélections WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Présélections Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Dossier de présélection défini par l'utilisateur" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.gl_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.gl_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.gl_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.gl_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Galician (Spain) (http://www.transifex.com/projects/p/kodi-main/language/gl_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Tempo de mistura automática" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tempo entre preconfiguracións" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tempo ó chou adicional" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Activar filtro anisotrópico" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Activar cortes abruptos" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Umbral de volume alto para cortes abruptos" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Tempo medio entre cortes abruptos" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Máximo ratio de refresco" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Activar 3D Stereo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pack de preconfiguracións" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Cartafol de preconfiguracións do usuario" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Modo aleatorio de preconfiguracións" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Preconfiguracións de WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Preconfiguracións de Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Cartafol de preconfiguracións definido polo usuario" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.he_il/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.he_il/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.he_il/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.he_il/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/kodi-main/language/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "זמן מיזוג אוטומטי" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "זמן בין קביעונים" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "זמן אקראי נוסף" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "אפשר סינון אניזוטרופי" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "אפשר חיתוך מידי" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "סף עוצמה לחיתוך מידי" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "זמן ממוצע בין חיתוכים מידיים" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "קצב רענון מירבי" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "הפעל סטריאו 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "ערכת קביעונים" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "נתיב תיקיית קביעונים" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "קביעון מצב מעורבב" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "קביעוני WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "קביעוני Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "תיקיה מותאמת אישית" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f שניות" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.hr_hr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.hr_hr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.hr_hr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.hr_hr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Croatian (Croatia) (http://www.transifex.com/projects/p/kodi-main/language/hr_HR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr_HR\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatsko vrijeme miješanja" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Vrijeme između predloška" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Dodatno naizmjenično vrijeme" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Omogućite Anizotropno filtriranje" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Omogući velike rezove" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Prag glasnoće za velike rezove" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Prosječno vrijeme između veliki rezova" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maksimalna brzina osvježavanja" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Omogući Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paket predložaka" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Mapa korisnikovih predložaka" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Način naizmjeničnih predložaka" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 predlošci" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp predlošci" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Korisnički odabrana mapa predložaka" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekundi" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.hu_hu/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.hu_hu/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.hu_hu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.hu_hu/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/kodi-main/language/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatikus keverési idő" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Idő a beállításkészletek között" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Többlet véletlen idő" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Anisotropic szűrés bekapcsolása" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Éles váltások engedélyezése" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Hangerőküszöb az éles váltásokhoz" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Átlagos idő az éles váltások között" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maximális frissítési frekvencia" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Sztereó 3D engedélyezése" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Beállításkészlet-csomag" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Saját-készlet mappa " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Keverési mód" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 beállításkészlet" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp beállításkészlet" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Felhasználói készlet" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f mp" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.id_id/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.id_id/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.id_id/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.id_id/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/kodi-main/language/id_ID/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id_ID\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Waktu Aduk otomatis" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Waktu Antara Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tambahan Waktu Acak" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Aktifkan Anisotropic Filtering" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Aktifkan Hard Cuts" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Ambang kekerasan untuk Hard Cuts" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Waktu rata-rata antara Hard Cuts" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Refresh Rate maksimum" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Aktifkan Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paket Preset" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Folder Preset Pengguna" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Preset Modus Acak " + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Preset WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Preset Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Folder Preset yang ditentukan Pengguna" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f detik" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.is_is/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.is_is/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.is_is/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.is_is/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Icelandic (Iceland) (http://www.transifex.com/projects/p/kodi-main/language/is_IS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is_IS\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Sjálfvirkur blöndunartími" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tími á milli forstillinga" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Aukalegur slembitími" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Virkja Anisotropic filter" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Virkja snöggar skiptingar" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Hljóðstyrks þröskuldur fyrir snöggar skiptingar" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Meðal tími á milli snöggra skiptinga" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Hámarks uppfærslu tími" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Virkja Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Forstillinga pakki" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Mappa fyrir forstillingar notenda" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Slembi hamur forstillinga" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 forstilling" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp forstillingar" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Mappa fyrir forstillingar skilgreindar af notanda" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekúndur" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.it_it/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.it_it/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.it_it/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.it_it/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/kodi-main/language/it_IT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it_IT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Durata transizione automatica" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tempo tra i preset" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tempo aggiuntivo casuale" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Abilita il filtro anisotropico" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Abilita tagli netti" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Soglia di rumorosità per i tagli netti" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Tempo medio tra i tagli netti" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Frequenza di aggiornamento massima" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Abilita effetto 3D anaglifo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Raccolta preset" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Cartella preset dell'utente " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Modalità preset casuale" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Preset WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Preset di Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Cartella personale dei preset" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secondi" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ja_jp/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ja_jp/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ja_jp/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ja_jp/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/kodi-main/language/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "自動ブレンド時間" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "各プリセットの間隔" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "追加ランダム時間" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "異方性フィルタリングを有効" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "ハードカットを有効" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "ハードカットのラウドネス閾値" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "ハードカット間の平均時間" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "最大リフレッシュレート" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "ステレオ3Dを有効にする" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "プリセットパック" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "ユーザープリセットフォルダ" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "プリセットシャッフルモード" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 プリセット" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp プリセット" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "ユーザー設定プリセットフォルダ" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f 秒" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ko_kr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ko_kr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ko_kr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ko_kr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/kodi-main/language/ko_KR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko_KR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "자동 블렌드 시간" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "프리셋사이 간격" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "추가적 랜덤 간격" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "비등방성 필터링 사용" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "하드컷 사용" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "하드컷을 위한 음량 임계치" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "하드컷 사이의 평균 시간" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "최대 리프레쉬 레이트" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "스테레오 3D 사용" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "프리셋 팩" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "사용자 프리셋 폴더" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "무작위 프리셋 모드" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 프리셋" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp 프리셋" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "사용자 정의 프리셋 폴더" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f 초" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.lt_lt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.lt_lt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.lt_lt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.lt_lt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/kodi-main/language/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatinio Perejimo Laikas" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Laikas Tarp Nustatymu" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Papildomas Atsitiktinis Laikas" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Ijungti Anizotropini Filtravima" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Ijungti Staigu Perejima" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Minimalus Garsas del Staigaus Perejimo" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Vidutinis Laikas tarp Staigiu Perejimu" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maksimalus Daznui Naujinimas" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Ijungti Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Nustatymu Komplektas" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Vartotojo Nustatymu Aplankas " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Isankstinis Atsitiktinis Rezimas" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Profiliai" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "WinAmp Profiliai" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Apibreztas Vartotojo Aplankas" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.lv_lv/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.lv_lv/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.lv_lv/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.lv_lv/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/kodi-main/language/lv_LV/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv_LV\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automātisks maisījuma laiks" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Laiks starp sagatavēm" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Papildus nejaušs laiks" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Ieslēgt anizotropo filtrēšanu" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Ieslēgt ciešo griezšanu" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Skaļuma slieksnis ciešai griezšanai" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Vidējais laiks starp ciešajiem griezieniem" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maksimālais pārzīmēšanās biežums" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Ieslēgt Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Sagatavju paka" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Lietotāja sagatavju mape" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Sagatavju jaukšanas režīms" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 sagataves" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp sagataves" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Lietotāja norādīta sagatavju mape" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekundes" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.mk_mk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.mk_mk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.mk_mk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.mk_mk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Macedonian (Macedonia) (http://www.transifex.com/projects/p/kodi-main/language/mk_MK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk_MK\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Автоматско време на блендирање" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Време помеѓу подесувањата" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Дополнително случајно време" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Овозможи Анисотропично филтрирање" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Овозможи јаки пресеци" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Loudness Threshold For Hard Cuts" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Average Time Between Hard Cuts" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Максимална рата на освежување" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Овозможи Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "User Preset Folder " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Preset Shuffle Mode" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Presets" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp Presets" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "User Defined Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сек." + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ms_my/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ms_my/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ms_my/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ms_my/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/kodi-main/language/ms_MY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms_MY\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Masa Adun Automatik" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Masa Diantara Praset" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Masa Rawak Tambahan" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Benarkan Penapisan Anisotropik" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Benarkan Potongan Keras" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Ambang Kelantangan Untuk Potongan Keras" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Masa Purata Diantara Potongan Keras" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Kadar Segar Semula Maksimum" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Benarkan Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pek Praset" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Folder Praset Pengguna" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Mod Kocok Praset" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Praset WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Praset Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Folder Praset Ditakrif Pengguna" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f saat" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.my_mm/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.my_mm/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.my_mm/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.my_mm/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,57 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/kodi-main/language/my_MM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my_MM\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Preset များအတွင်းကြာချိန်" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Stereo 3D ဖွင့်ထားမည်" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "အသုံးပြုသူ၏ Preset ဖိုလ်ဒါလ်" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Preset Shuffle Mode" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Presets" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp Presets" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "အသုံးပြုသူသတ်မှတ်ထားသော Preset ဖိုလ်ဒါလ်" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.nb_no/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.nb_no/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.nb_no/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.nb_no/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/kodi-main/language/nb_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatisk tid for sammensmelting" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tid mellom forvalg" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Ytterligere tilfeldig tid" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Aktiver anisotropisk filtrering" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Aktiver umiddelbare overganger" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Lydgrense for umiddelbare overganger" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Gjennomsnittlig tid mellom umiddelbare overganger" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Høyeste oppdateringsfrekvens" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Aktiver Sterio 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Forhåndsinnstillingspakke" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Mappe for egendefinertee forhåndsinnstillinger" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Blandingsmodus for forhåndsinnstillinger" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 forhåndsinnstillinger" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp forhåndsinnstillinger" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Brukerdefinert forhåndsinnstillingsmappe" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.nl_nl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.nl_nl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.nl_nl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.nl_nl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/kodi-main/language/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatische overgangstijd" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tijd tussen presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Toegevoegde willekeurige tijd" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Anisotropisch filter inschakelen" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Ruwe afkappingen inschakelen" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Geluidssterktedrempel voor een ruwe afkapping" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Gemiddelde tijd tussen ruwe afkappingen" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maximale verversingsfrequentie" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Stereo 3D inschakelen" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Voorinstelling pakket" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Gebruiker voorinstelling folder " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Voorinstelling shuffle mode" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 voorinstelling" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp voorinstelling" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Gebruikergedefineerde Presetmap" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.Van sec." + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.Van %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.Van fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.pl_pl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.pl_pl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.pl_pl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.pl_pl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/kodi-main/language/pl_PL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Częstotliwość mieszania" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Częstotliwość zmiany wzorców" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Dodatkowy czas losowy" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Aktywuj filtrowanie anizotropowe" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Aktywuj \"ostre cięcia\"" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Próg głośności dla \"ostrych cięć\"" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Średni czas pomiędzy \"ostrymi cięciami\"" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maksymalna częstotliwość odświeżania" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Aktywuj stereofoniczny tryb 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pakiet wzorców" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Folder wzorców użytkownika" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Tryb losowych wzorców" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Wzorce WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Wzorce Winampa" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Folder wzorców użytkownika" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek." + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.pt_br/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.pt_br/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.pt_br/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.pt_br/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/kodi-main/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Tempo de mistura automático" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tempo entre as predefinições" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tempo aleatório adicional" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Ativar filtragem anisotrópica" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Habilitar cortes rígidos" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Limite de volume para cortes rígidos" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Tempo médio entre cortes rígidos" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Taxa máxima de atualização" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Ativar Estéreo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pacote de predefinições" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Pasta de predefinições do usuário" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Modo Aleatório predefinido" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Predefinições WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Predefinições Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Pasta de predefinições definida pelo usuário" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f segundos" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.pt_pt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.pt_pt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.pt_pt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.pt_pt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/kodi-main/language/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Mistura automática de tempo" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tempo entre Pré-Selecções" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tempo Aleatório Adicional" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Activar Filtro Anisotrópico" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Ligar cortes" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Limiar de som para cortes" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Tempo médio entre cortes" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Taxa máxima de actualização" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Activar Estéreo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Conjunto de Pré-Selecções" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Pasta de Pré-Selecções do Utilizador" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Modo de Pré-Selecção aleatória" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Pré-Selecções WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Pré-Selecções do Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Pasta personalizada de Pré-Selecções do utilizador" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f segundos" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ro_ro/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ro_ro/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ro_ro/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ro_ro/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Romanian (Romania) (http://www.transifex.com/projects/p/kodi-main/language/ro_RO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro_RO\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Durată de contopire automată" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Durată între vizualizări predefinite" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Timp aleatoriu adițional" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Activează filtrare anisotropică" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Activează schimbări rapide" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Prag de intensitate pentru schimbări rapide" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Durată medie între schimbări rapide" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Rată maximă de reîmprospătare" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Activează 3D stereo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pachet vizualizări predefinite" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Dosar preferințe utilizator" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Mod Amestec Preferinte " + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Preferinte WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Preferinte Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Dosar presetări definite de utilizator" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sec" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ru_ru/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ru_ru/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ru_ru/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ru_ru/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/kodi-main/language/ru_RU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru_RU\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Время автоматического перехода" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Время между настройками" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Дополнительное случайное время" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Включить анизотропную фильтрацию" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Включить жёсткие переходы" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Минимальная громкость для жёсткого перехода" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Среднее время между жёсткими переходами" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Максимальная частота обновления" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Включить стерео 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Набор настроек" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Папка настроек пользователя " + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Режим перемешивания настроек" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Настройки WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Настройки Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Папка для пользовательских настроек" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f с" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f кадр/с" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.sk_sk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.sk_sk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.sk_sk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.sk_sk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/kodi-main/language/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatický čas prelínania" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Čas medzi Predvoľbami" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Pridaný náhodná čas" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Povoliť anizotropné filtrovanie" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Povoliť tvrdé useknutia" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Úroveň hlasitosti pre tvrdé useknutia" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Priemerný čas medzi tvrdými useknutiami" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maximálna obnovovacia frekvencia" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Povoliť Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Balík Predvilieb" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Užívateľský adresár Predvolieb" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Náhodný výber Predvolieb" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Predvoľby" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp Predvoľby" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Užívateľom nastavený adresár Predvolieb" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.sl_si/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.sl_si/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.sl_si/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.sl_si/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/kodi-main/language/sl_SI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl_SI\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Samodejen čas prelivanja" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Čas med prednastavitvami" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Dodaten naključen čas" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Vključi anizotropno filtriranje" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Vključi ostre prehode" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Glasnost za ostre prehode" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Povprečen čas med ostrimi prehodi" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Največja stopnja osveževanja" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Vključi stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paket prednastavitev" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Uporabniška mapa s prednastavitvami" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Način mešanja prednastavitev" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Prednastavitve WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Prednastavitve Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Uporabniško določena mapa s prednastavitvami" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekund" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.sq_al/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.sq_al/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.sq_al/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.sq_al/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Albanian (Albania) (http://www.transifex.com/projects/p/kodi-main/language/sq_AL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq_AL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paketë e të paravendosurve" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Regjistri i paravendosurve i zgjedhur nga përdoruesi" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekonda" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.sr_rs@latin/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.sr_rs@latin/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.sr_rs@latin/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.sr_rs@latin/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Serbian (Latin) (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS@latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Dodatno Neodredjeno Vreme" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.sv_se/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.sv_se/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.sv_se/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.sv_se/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/kodi-main/language/sv_SE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv_SE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Automatisk bländningstid" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tid mellan förval" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Extra slumpmässig tid" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Aktivera anisotropicfilter" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Aktivera hårda brytningar" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Loudnessgräns för hårda beskärningar" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Medeltid mellan hårda brytningar" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Maximal uppdateringsfrekvens" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Aktivera stereo-3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Förvalspaket" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Användarförvalsmapp" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Förvalsslumpningsläge" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51-förval" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp-förval" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Användardefineradförvalsmapp" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ta_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ta_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.ta_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.ta_in/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/kodi-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "தரவுப்பொதி" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "பயனர் வரையறுத்த தரவு அடைவு" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f வினாடிகள்" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.tg_tj/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.tg_tj/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.tg_tj/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.tg_tj/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tajik (Tajikistan) (http://www.transifex.com/projects/p/kodi-main/language/tg_TJ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg_TJ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Вақти омезиши худкор" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Вақт байни интихобҳо" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Вақти тасодуфии иловагӣ" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Фаъол кардани филтри антизотропӣ" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Фаъол кардани буришҳои ноҳамвор" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Ҳудуди баландии садо барои буришҳои ноҳамвор" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Вақти миёна байни буришҳои ноҳамвор" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Суръати зиёдтарини навсозӣ" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Фаъол кардани стереои 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Бастаи интихобшуда" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Ҷузвдони интихобшудаи корбарӣ" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Ҳолати тасодуфии интихобшуда" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51-и танзимшуда" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp-и танзимшуда" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Ҷузвдони интихобшудаи корбари муайяншуда" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сония" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f кадр/с" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.th_th/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.th_th/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.th_th/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.th_th/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/kodi-main/language/th_TH/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th_TH\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "ระยะเวลาการผสานแบบอัตโนมัติ" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "ระยะเวลาระหว่างชุดรูปแบบ" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "เวลาสุ่มเพิ่มเติม" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "เปิดใช้ ตัวกรอง Anisotropic" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "เปิดใช้งาน การตัดแบบแข็ง" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "ช่วงระดับความดัง สำหรับการตัดแบบแข็ง" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "เวลาเฉลี่ยระหว่างการตัดแบบแข็ง" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "อัตราการรีเฟรชสูงสุด" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "เปิดใช้งาน 3D สเตอริโอ" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "แพ็ค ชุดรูปแบบ" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "โฟลเดอร์ ชุดรูปแบบของผู้ใช้" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "โหมด สุ่มลำดับชุดรูปแบบ" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "ชุดรูปแบบ WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "ชุดรูปแบบ Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "โฟลเดอร์ ชุดรูปแบบที่กำหนดโดยผู้ใช้" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f วินาที" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f เฟรมต่อวิ." diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.tr_tr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.tr_tr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.tr_tr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.tr_tr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/kodi-main/language/tr_TR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr_TR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Otomatik Karıştırma Zamanı" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Önayarlar Arasındaki Zaman" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "İlave Rasgele Zaman" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Anizotropik Filtrelemeyi Etkin Kıl" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Sert Kesimler Etkin" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Sert Kesimler İçin Gürültülü Eşik" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Sert Kesimler İçin Ortalama Zaman" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "En Yüksek Tazeleme Oranı" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Stereo 3D'yi Etkinleştir" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Önayar Paketi" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Kullanıcı Önayar Klasörü" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Karıştırma Modunu Önayarla" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 Önayarları" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp Önayarları" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Kullanıcı Tanımlı Önayar Klasörü" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f saniye" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%% %2.0f" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.uk_ua/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.uk_ua/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.uk_ua/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.uk_ua/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/kodi-main/language/uk_UA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk_UA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Тривалість автоматичного змішування" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Тривалість показу одного ефекту" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Додатковий час випадкової тривалості" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Увімкнути анізотропну фільтрацію" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Ввімкнути різку зміну" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Межа гучності для різкої зміни" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Середній час між різкими змінами" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Максимальна частота кадрів" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Увімкнути стерео 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Набір ефектів" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Тека з типовими налаштуваннями користувача" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Перемішати ефекти" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 ефекти" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Ефекти з Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Користувацька папка з ефектами" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сек" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f кадр/с" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.vi_vn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.vi_vn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.vi_vn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.vi_vn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/kodi-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "Tự động điều chỉnh Blend Time" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Thời gian đổi Preset" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Thời gian random thêm vào" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "Sử dụng Anisotropic Filtering" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "Sử dụng các đoạn Hard Cut" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Giới hạn âm lượng cho các đoạn Hard Cut" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Thời gian trung bình giữa các đoạn Hard Cut" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "Giá trị độ làm tươi Max" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "Sử dụng Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Các gói Preset" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "Thư mục Preset" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "Chế độ tự nhảy Preset" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "Preset từ WA51" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Preset từ Winamp" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "Đặt thư mục Preset" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f giây" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f hình/s" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.zh_cn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.zh_cn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.zh_cn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.zh_cn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/kodi-main/language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "自动混合时间" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "预置切换时间" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "附加随机时间" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "启用各向异性过滤" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "启用硬切" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "硬切响度门限" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "硬切平均间隔" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "最大刷新率" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "启用3D立体声" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "预置包" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "用户预置文件夹" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "预置随机模式" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 预置" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp 预置" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "用户定义的预置文件夹" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f 秒" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.zh_tw/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.zh_tw/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/language/resource.language.zh_tw/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/language/resource.language.zh_tw/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,89 @@ +# Kodi Media Center language file +# Addon Name: MilkDrop +# Addon id: visualization.milkdrop +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/kodi-main/language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Automatic Blend Time" +msgstr "自動混音時間" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "預置切換時間" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "附屬隨機時間" + +msgctxt "#30003" +msgid "Enable Anisotropic Filtering" +msgstr "啟用各向異性過濾器" + +msgctxt "#30004" +msgid "Enable Hard Cuts" +msgstr "啟用 Hard Cuts" + +msgctxt "#30005" +msgid "Loudness Threshold For Hard Cuts" +msgstr "Hard Cuts 響度限位" + +msgctxt "#30006" +msgid "Average Time Between Hard Cuts" +msgstr "Hard Cuts平均間隔時間" + +msgctxt "#30007" +msgid "Maximum Refresh Rate" +msgstr "最高更新率" + +msgctxt "#30008" +msgid "Enable Stereo 3D" +msgstr "啟用Stereo 3D" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "預置封包" + +msgctxt "#30010" +msgid "User Preset Folder " +msgstr "使用者預置資料夾" + +msgctxt "#30011" +msgid "Preset Shuffle Mode" +msgstr "預置隨機撥放模式" + +msgctxt "#30020" +msgid "WA51 Presets" +msgstr "WA51 預置" + +msgctxt "#30021" +msgid "Winamp Presets" +msgstr "Winamp 預置" + +msgctxt "#30022" +msgid "User Defined Preset Folder" +msgstr "使用者定義的預置資料夾" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f 秒" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" + +msgctxt "#30052" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/settings.xml kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/settings.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.milkdrop/resources/settings.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.milkdrop/resources/settings.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/addon.xml kodi-15.2~git20151019.1039-final/addons/visualization.projectm/addon.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/addon.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,129 @@ + + + + + + + + + + + projectM vat jou op 'n vlug deur die klankgolwe wat jy hoor + مشروع M يجعلك تطير بين موحات الصوت التي تسمعها + projectM takes you flying through the soundwaves you're hearing + "projectM" ще Ви отведе на пътешествие между звуковите вълни, които чувате + projectM et fa volar a través de les ones de so que escoltes + projectM s Vámi proletí zvukovými vlnamy, které posloucháte + Mae projectM yn eich hedeg drwy'r tonnau sain + projectM tager dig på en flyvetur gennem lydbølgerne, du lytter til + projectM lässt euch durch den Sound fliegen, den Ihr gerade hört + Το projectM σας ταξιδεύει μέσα στα ηχητικά κύματα που ακούτε + projectM takes you flying through the soundwaves you're hearing + projectM takes you flying through the soundwaves you're hearing + projectM takes you flying through the soundwaves you're hearing + projectM takes you flying through the soundwaves you're hearing + projectM te lleva volando a través de las ondas que estás escuchando + projectM te lleva volando a través de las ondas que estás escuchando + projectM te lleva volando a través de las ondas de sonido que estás escuchando + projectM viib sind lennates läbi helilainete mida kuulad + projectM شما را در صدایی که می شنوید به پرواز درمی آورد. + projectM lennättää sinut ääniaaltojen läpi + projectM vous fait voler au travers des ondes sonores que vous entendez + projectM vous entraine à travers les ondes sonores que vous écoutez + projectM lévao voando a través das ondas de son que está a ouvir + החיזוי projectM לוקח את המאזין לטיסה בין גלי הקול הנשמעים + projectM vam omogućuje let kroz zvuk koji čujete + A projectM végigrepít a zene hullámain + ProjectM membawa anda terbang melalui gelombang suara yang anda dengar + Með projectM flýgurðu í gegnum hljóðbylgjurnar sem þú heyrir + projectM ti fa volare tra le onde sonore di ciò che stai ascoltando + projectM - 音楽の波の上を飛ぶ + projectM 은 사운드웨이브 속으로 날아가는듯한 효과를 보여줍니다. + projectM nukelia Jus į nuostabų skrydį virš debesų, ištiesų fantastiškų garsų gausą + projectM paņem Jūs līdzi lidojumā cauri skaņu viļņiem, kurus dzirdat + projectM ве води на летање низ звучните бранови на музиката што ја слушате + projectM memikat pendengaran anda melalui gelombang bunyi yang dihasilkan + projectM tar deg på en reise igjennom musikken du hører + projectM-visualisatie neemt je mee op de geluidsgolven die je hoort + projectM zabiera Cię w niesamowity lot w chmurach aktualnie słuchanych dźwięków + O projectM leva-o a voar nas ondas sonoras que está a ouvir + O projectM leva-o num voo através das ondas sonoras que está a ouvir + projectM îți oferă o senzație auditivă unică astfel încât simți că zbori printre undele sonore pe care le asculți + projectM отправит вас в полёт через звуковые волны, которые вы слышите + projektM s Vami poletí zvukovými vlnami, ktoré počúvate + projectM vas popelje čez valovanje zvoka, ki ga poslušate + projectM të bën të fluturosh nëpër valet e tingullit që i dëgjon + projectM tar med dig på en flygtur genom ljudvågorna du hör + projectM உங்களை நீங்கள் கேட்கும் ஒலியலைகளினூடு பறக்கும் அனுபவத்தை தரும் + projectM бо мавҷҳои садояш фораму роҳатбахш аст + projectM นำคุณโบยบิน ผ่านคลื่นเสียงที่คุณกำลังรับฟัง + projectM sizi duyduğunuz ses dalgaları üzerinde bir uçuşa çıkartır + projectM забирає вас в політ крізь хвилі музики яку ви слухаєте + projectM giúp bạn bay bổng trong âm thanh bạn đang nghe + projectM 带你与声波一起飞翔 + projectM帶著您一起翱翔並飛越聆聽中的音樂浪潮 + projectM is 'n ontsagwekkende musiek visualiseerder. Daar is niks beter in die wêreld van Unix nie. projectM se grootheid kom van die harde werk van die gemeenskap. Gebruikers soos jy kan voorafinstellings skep wat musiek met ongelooflike visualiserings konnekteer. Probeer dit! projectM Visualisering is 'n geLGPL'de herimplementasie van Milkdrop onder OpenGL Al wat projectM benodig is 'n video kaart met 3D versnelling en jou gunsteling musiek. + مشروع M هو مصورللموسقى رائع. لا شي في العالم أفضل من Unix. عظمة مشروع M تأتي من عمل المجتمع الجاد. يستطيع مستخدمون مثلك إنشاء مسبقات تتصل بالموسقى لصور رائعة. جربه تصوير مشروع M كل ما يتطلبه مشروع M هو كرت شاشة بتسارع 3D و موسيقاك المفضلة. + projectM is an awesome music visualizer. There is nothing better in the world of Unix. projectM's greatness comes from the hard work of the community. Users like you can create presets that connect music with incredible visuals. Try it! projectM Visualization is an LGPL'ed reimplementation of Milkdrop under OpenGL All projectM requires is a video card with 3D acceleration and your favorite music. + "projectM" е страхотна визуализация, плод на упорит труд от страна на общността. В света на Unix не съществува нищо по-добро. Потребители, като Вас, създават предварително комбинации от настройки, които се ползват като модел за визуализацията и така свързват звука с невероятни визуални ефекти. Пробвайте! Визуализацията "projectM" е преработка на Milkdrop под лиценза LGPL, основана на OpenGL. "projectM" изисква видео карта с 3D ускорение и любимата Ви музика. + El projectM és un visualitzador de música impressionant. No hi ha res millor al món Unix. La grandesa de projectM prové del dur treball de la comunitat. Els usuaris com tu poden crear predefinits que connecten la música amb visualitzacions increibles. Prova-ho! La Visualització projectM és una re-implementació en LGPL de Milkdrop baix OpenGL Tot el que projectM requereix és una tarja amb acceleració 3D i la teva música preferida. + projectM je úžasný hudební vizualizér. Ve světě Unixu neexistuje nic lepšího. Velikost projectuM pochází z tvrdé práce komunity. Uživatelé, jako jste vy, mohou vytvářet předvolby, které spojují hudbu s fantastickými vizuálními zážitky. Zkuste jej! projectM vizualizace je LGPL reimplementace Milkdropu pod OpenGL. Vše co projectM vyžaduje je grafická karta s 3D akcelerací a vaši oblíbenou hudbu. + Mae delweddwr cerddoriaeth ryfeddol. Does dim byd gwell ym myd Unix. Mae mawredd projectM yn dod o waith caled y gymuned. Mae defnyddwyr fel chi yn gallu creu rhagosodiadau sy'n cysylltu delweddau anhygoel gyda cherddoriaeth. Defnyddiwch e. Mae projectM yn ailgyflwyniad LGPL o Milkdrop o dan OpenGL. Yr unig beth sydd ei angen ar projectM yw cerdyn video gyda chyflymu 3D a'ch hoff gerddoriaeth. + projectM er en fantastisk musikvisualisering. Der findes intet bedre i Unix-verdenen. projectMs storhed kommer fra brugerbasens hårde arbejde. Brugere, som dig selv, kan skabe forudindstillinger, som forbinder musik med utrolige visualiseringer. Prøv det! projectM Visualization er en LGPLed reimplementation af Milkdrop under OpenGL. Alt hvad projectM kræver er et grafikkort med 3D-acceleration og din yndlingsmusik. + projectM ist eine unglaublicher Musik-Visualisierung. In der Unix-Welt gibt es nichts besseres. Die Einzigartigkeit kommt durch die harte Arbeit der Community. User wie du können "Presets" schreiben, welche sich mit der Musik verbinden. Versuche es selber! projectM ist die LGPL Reimplementierung von Milkdrop als OpenGL Variante Alles was prjectM benötigt ist eine Grafikkarte mit 3D Beschleunigung und deine Lieblingmusik + Το projectM είναι ένας φοβερός μουσικός οπτικοποιητής. Δεν υπάρχει τίποτα καλύτερο στον κόσμο του Unix. Το μεγαλείο του projectM πηγάζει από τη σκληρή δουλειά της κοινότητας. Χρήστες όπως εσείς μπορούν να δημιουργήσουν προρυθμίσεις συνδέοντας τη μουσική με απίστευτες απεικονίσεις. Δοκιμάστε το! Η Οπτικοποίηση projectM αποτελεί μία νέα LGPL υλοποίηση του Milkdrop υπό το OpenGL Το μόνο που απαιτείται από το projectM είναι μία κάρτα γραφικών με τρισδιάστατη (3D) επιτάχυνση, και την αγαπημένη σας μουσική. + projectM is an awesome music visualiser. There is nothing better in the world of Unix. projectM's greatness comes from the hard work of the community. Users like you can create presets that connect music with incredible visuals. Try it! projectM Visualisation is an LGPL'ed reimplementation of Milkdrop under OpenGL All projectM requires is a video card with 3D acceleration and your favourite music. + projectM is an awesome music visualiser. There is nothing better in the world of Unix. projectM's greatness comes from the hard work of the community. Users like you can create presets that connect music with incredible visuals. Try it! projectM Visualisation is an LGPL'ed reimplementation of Milkdrop under OpenGL All projectM requires is a video card with 3D acceleration and your favourite music. + projectM is an awesome music visualiser. There is nothing better in the world of Unix. projectM's greatness comes from the hard work of the community. Users like you can create presets that connect music with incredible visuals. Try it! projectM Visualisation is an LGPL'ed reimplementation of Milkdrop under OpenGL All projectM requires is a video card with 3D acceleration and your favourite music. + projectM is an awesome music visualizer. There is nothing better in the world of Unix. projectM's greatness comes from the hard work of the community. Users like you can create presets that connect music with incredible visuals. Try it! projectM Visualization is an LGPL'ed reimplementation of Milkdrop under OpenGL All projectM requires is a video card with 3D acceleration and your favorite music. + projectM es un fantástico visualizador de música. No hay nada mejor en el universo Unix. La grandeza de projectM proviene del duro trabajo de la comunidad. Usuarios como tu pueden crear ajustes preestablecidos que conecten la música con visualizaciones increíbles. ¡Pruebalo! projectM Visualization es una reimplantación de Milkdrop bajo licencia LGPL y renderizado en OpenGL. Todo lo que projectM necesita es una tarjeta de video con aceleración 3D y tu música favorita. + projectM es un fantástico visualizador de música. No hay nada mejor en el universo Unix. La grandeza de projectM proviene del duro trabajo de la comunidad. Usuarios como usted pueden crear ajustes preestablecidos que conecten la música con visualizaciones increibles. ¡Pruébelo! projectM Visualization es una reimplantación de Milkdrop bajo licencia LGPL y renderizado en OpenGL. Todo lo que projectM necesita es una tarjeta de vídeo con aceleración 3D y su música favorita. + projectM es un visualizador de música sorprendente. No hay nada mejor en el mundo de Unix. La grandeza de projectM proviene del duro trabajo de la comunidad. Usuarios como tú pueden crear preaujstes que conectan la música con increíbles imágenes. Inténtalo! La visualización projectM es una reimplementación en LGPL de Milkdrop bajo OpenGL. Todo lo que projectM necesita es una tarjeta de video con aceleración 3D y tu música favorita. + projectM on äge muusika visuaal. Unixi maailmas pole midagi paremat. projectM'i suurus on saavutatud kogukonna ühise raske töö tulemusena. Kasutajad nagu sina saavad luua eelseadeid, mis ühendavad muusika imeliste visualidega. Proovi seda! projectM visualiseerimine on litsentseeritud (LGPL) uuskasutus Milkdrop'ist OpenGL keskkonnas. Ainus mida projectM vajab, on 3D kiirendusega videokaart ja sinu lemmikmuusika. + projectM یک مجسم ساز باور نکردنی موسیقی است. در دنیای Unix چیز بهتری وجود ندارد. این جایگاه نتیجه کار سخت اعضای گروه است. کاربرانی مثل تو می توانند قالب هایی بنویسند که موسیقی را با نماها تلفیق می کنند. امتحانش کن! projectM اجرای دوباره پروژه Milkdrop با مجوز LGPL و تحت OpenGL می باشد. یک کارت گرافیکی با پشتیبانی 3D و موسیقی مورد علاقه شما تنها چیزهایی هستند که projectM به آنها نیاز دارد. + projectM on uskomaton musiikkivisualisointi, joka on yhteisön kovan työn tulos. Käyttäjät voivat luoda esiasetuksia, jotka yhdistävät musiikin kuviin. projectM -visualisointi on LGPL-lisensoitu Milkdropin uudelleenimplementointi OpenGL:llä. projectM tarvitsee vain 3D-kiihdyttävän näytönohjaimen ja lempimusiikkisi. + projectM est un incroyable visualiseur musical. Il n'y a rien de mieux dans l'univers Unix. La force projectM vient du travail acharné de la communauté. Des utilisateurs comme vous peuvent créer des préréglages qui connecteront la musique avec des visuels incroyables. Essayez-le! La visualisation projectM est une réalisation sous LGPL de Milkdrop en OpenGL. Le seul pré-requis pour projectM est une carte graphique avec accélération 3D et votre musique favorite. + projectM est un fantastique visualiseur musical. Il n'y a rien de mieux dans l'univers Unix. L'ampleur de projectM vient du travail énorme de la communauté. Des utilisateurs comme vous peuvent créer des préréglages qui connecteront la musique avec des visuels incroyables. Essayez-le! La visualisation projectM est une réalisation sous LGPL de Milkdrop en OpenGL. Le seul pré-requis pour projectM est une carte graphique avec accélération 3D et votre musique favorite. + projectM é unha impresionante Visualización de música. Non hai nada mellor no mundo Unix. A grandeza de projectM ven da dura xeira da comunidade. Usuarios coma vostede poden crear preconfiguracións que conectan a música con incribles visualizacións. Próbeo! A Visualización projectM é unha reimplementación de Milkdrop empregando OpenGL e con licencia LGPL. Todo o que precisa projectM é unha tarxeta gráfica con aceleración 3D e a súa música favorita. + החיזוי projectM הוא חיזוי מוזיקה מדהים. לא קיים חיזוי טוב יותר בעולם ה־Unix. הגדולה של projectM מגיעה מהעבודה הרבה של הקהילה. כל משתמש יכול ליצור קביעון שיחבר את המוזיקה עם פלט חזותי מדהים. חובה לנסותו! החיזוי projectM הוא ישום OpenGL של Milkdrop תחת רשיון LGPL. כל מה שדורש projectM מהמשתמש זה כרטיס גרפי עם האצה תלת מימדית ואת המוזיקה המועדפת. + projectM je fenomenalan glazbeni vizualizator. Ne postoji ništa bolje u svijetu Unixa. Veličina projectM-a dolazi zbog predanosti njegove zajednice. Korisnici kao što ste Vi, mogu stvoriti predloške koje povezuju glazbu i nevjerojatne vizualizacije. Isprobajte! projectM Vizualizacija je LGPL reimplementacija Milkdropa pod OpenGL-om Sve što projectM zahtijeva je video kartica sa 3d ubrzanjem i vašu omiljenu glazbu. + A projectM egy fantasztikus zenei vizualizáció. Nincs ennél jobb a Unix világban. A projectM különlegessége, hogy egy egész fejlesztői közösség nehéz munkájából jött létre. A felhasználók, mint te egyedi beállításokat hozhatnak létre ami összekapcsolja a zenét a hihetetlen látványelemekkel. Próbáld ki! A projectM Vizualizáció a Milkdrop újrakódolása LGPL licenc alatt, OpenGL videókártya támogatást használva. Minden projectM látványbeállításhoz 3D gyorsításra képes videókártya és a kedvenc zenéd szükséges. + projectM merupakan visualiser musik yang keren. Tak ada yng lebih baik di dunia Unix. Kebesaran projectM berasa dari kerja keras dari komunitas. Pengguna seperti anda dapat membuat preset yang menghubungkan musik dengan visual yang luarbiasa. Cobalah!!! Visualisasi projectM merupakan produk berlisensi LGPL reimplementasi dari Milkdrop dibawah OpenGL Semua projectM membutuhkan kartu grafis dengan akselerasi 3D dan musik favorit anda. + projectM er frábær myndskreyting. það er ekkert betra í Unix heiminum. Gæði projectM koma til vegna framlags samfélagsins.Notendur eins og þú geta búið til forstillingar sem tengja tónlist við ótrúlega myndræna upplifun. Prófaðu!⏎ projectM myndskreyting er LGPL útgáfa af Milkdrop með OpenGL⏎ Allt sem projectM þarfnast er skjákort með þrívíddar hraðli 3D og uppáhalds tónlistin þín. + projectM è un incredibile visualizzazione musicale. E' il meglio del mondo Unix. La grandezza di projectM proviene dal duro lavoro della comunità. Gli utenti come te possono creare preset che connetto la musica con incredibili grafiche. Provalo! projectM è una reimplementazione LGPL di Milkdrop sotto OpenGL Tutti i projectM richiedono una scheda video con accelerazione 3D e la tua musica preferita. + projectM is an awesome music visualizer. There is nothing better in the world of Unix. projectM's greatness comes from the hard work of the community. Users like you can create presets that connect music with incredible visuals. Try it! projectM Visualization is an LGPL'ed reimplementation of Milkdrop under OpenGL All projectM requires is a video card with 3D acceleration and your favorite music. + projectM은 멋진 음악 시각화입니다. Unix에는 이것보다 좋은것은 없습니다. projectM은 많은 사람들에 의해 개발되었습니다. 여러분과 같은 유저들이 음악을 표현하는 프리셋을 만들었습니다. projectM 음악시각화는 OpenGL에서 작동하도록 Milkdrop를 새로 만든것입니다. 모든 projectM은 3D 가속이 되는 비디오카드와 음악이 필요합니다. + ProjectM yra išskirtinė muzikos vizualizacija. Nėra nieko geriau, Unix pasaulyje. ProjectM spindesys tai sunkus darbas bendruomenėje. Naudotojai, tokie kaip Jūs galite sukurti ir suderinti muziką su puikiais vizualizacijos efektais. Sužinokite! ProjectM yra įgyvendinimas iš Milkdrop pagal LGPL licenciją, ir naudoja OpenGL Viskas ko reikia projectM tai vaizdo plokštės su 3D akceleracija (greitėjimu) ir geros muzikos. + projectM ir brīnišķīgs mūzikas vizualizētājs. Nav nekā labāka Unix pasaulē. projectM izcilība rodas no smagā darba komūnā. Lietotāji, kas ir tādi paši kā Jūs, var radīt sagataves, kas savieno mūziku ar neticami skaistām vizualizācijām. Pamēģiniet! projectM Vizualizācija ir Milkdrop LGPL reimplementācija zem OpenGL Visi projectM pieprasa video karti ar 3D paātrinājumu un Jūsu mīļākās mūzikas izlasi. + projectM is an awesome music visualizer. There is nothing better in the world of Unix. projectM's greatness comes from the hard work of the community. Users like you can create presets that connect music with incredible visuals. Try it!⏎ projectM Visualization is an LGPL'ed reimplementation of Milkdrop under OpenGL⏎ All projectM requires is a video card with 3D acceleration and your favorite music. + projectM ialah pengvisual muzik yang hebat. Ia yang terbaik dalam dunia Unix. Kehebatan projectM hasil dari kerja istiqamah komuniti. Pengguna seperti anda boleh mencipta praset yang menghubungkan muzik dengan visual yang hebat. Cubalah! Pengvisualan projectM merupakan perlaksanaan semula LGPL Milkdrop dibawah OpenGL. Semua projectM memerlukan kad video dengan pemecutan 3D dan tidak lupa muzik kegemaran anda. + projectM er en flott visualisering. Det finnes ikke finere i Unix-verdenen. projectM er blitt så bra takket være et hardtarbeidende fellesskap. Du kan opprette forhåndsinnstillinger som gir utrolige visualiseringer. Prøv det! projectM visualiseringen benytter OpenGL og er en realisering av Milkdrop under en åpen programvarelisens. Alt projectM behøver er et 3D-grafikkkort og din favorittmusikk. + projectM is een geweldige muziekvisualisatie. Er bestaat niets beters in de UNIX-wereld. Het success van projectM is het resultaat van het harde werk van de Kodi-gemeenschap. U kunt hun eigen presets instellen die muziek linken aan verbluffende visualisaties. Probeer het uit! projectM-visualisatie is beschikbaar onder de LGPL-licentie en is een herimplementatie van Milkdrop (OpenGL). Alles wat projectM vereist is een videokaart met 3D-versnelling en jouw favoriete muziek. + projectM to rewelacyjna wizualizacja muzyki. Nie ma nic lepszego w świecie Unixa. Wspaniałość projectM jest efektem ciężkiej pracy społeczności. Użytkownicy tacy jak Ty, mogą tworzyć wzorce wizualiacji łączące muzykę z niesamowitymi efektami wizualnymi. Przekonaj się! projectM jest reimplementacją Milkdrop na licencji LGPL i używa OpenGL Wszystko czego wymaga projectM, to karta graficzna obsługująca akcelerację 3D oraz zasoby Twojej muzyki. + O projectM é um fantástico visualizador de música. Não existe nenhum melhor no mundo Unix. A grandeza do projectM advém do trabalho árduo da comunidade. Utilizadores como você podem criar pré-definições que ligam a música a visualizações incríveis. Experimente! O visualizador projectM é uma reimplementação do Milkdrop OpenGL sob uma licença LGPL. Tudo o que o projectM necessita é de uma placa gráfica com aceleração 3D e a sua música favorita. + O projectM é uma fantástica visualização de música. Não há melhor no mundo Unix. A grandeza do projectM advém do trabalho árduo da comunidade. Qualquer utilizador pode criar pré-selecções que combinam a música com visualizações incríveis. Experimente! O visualizador projectM é uma reimplementação do Milkdrop OpenGL sob uma licença LGPL. Tudo o que o projectM precisa é de uma placa gráfica com aceleração 3D e a sua música favorita. + projectM este un plugin uimitor. Nu există nimic mai bun în lumea Unix. Măreția projectM vine din munca întregii comunități. Utilizatori ca și tine pot crea presetări care conectează muzica cu vizualizări incredibile. Încearcă și tu! Vizualizarea projectM este o reimplementare LGPL a lui Milkdrop sub OpenGL. Tot ceea ce necesită projectM este o placă video cu accelerare 3D și muzica ta favorită. + projectM удивительным образом визуализирует музыку. В мире Unix нет ничего лучше. projectM является результатом напряжённой работы сообщества. Пользователи могут создавать наборы настроек, которые объединяют музыку и невероятные визуальные эффекты. Попробуйте сами!⏎ Визуализация projectM представляет собой LGPL-реализацию Milkdrop на основе OpenGL⏎ Всё, что требуется для визуализации — это видеокарта с 3D-ускорением и любимая музыка. + projektM je úžasný hudobný vizualizér. Vo svete Unixu neexistuje nič lepšie. Veľkosť projectM pramení z tvrdej práce komunity. Užívatelia ako ty vytvárajú Predvoľby, ktoré spájajú hudbu s fantastickými vizualizáciami. Vyskúšaj to![CR] projectM vizualizácie sú LGPL implementáciou vizualizácií Milkdrop s použitím OpenGL.[CR] Jediné čo projectM potrebuje je grafickú kartu s 3D akceleráciou a Vašu obľúbenú hudbu. + projectM je glasbeni vizualizator. Nič ni boljšega v svetu Unixa. Veličina ProjectM izhaja iz garanja skupnosti. Uporabniki, kot vi, si lahko ustvarite prednastavitve, ki povezujejo glasbo z neverjetno vizualizacijo. Poskusite! Vizualizacija projectM je reimplementacija Milkdropa v LGPL v okviru OpenGL-a. projectM potrebuje le grafično kartico s 3D pospeševanjem in vašo najljubšo glasbo. + projectM është nje vizualizim i tmerrshëm. Nuk ekziston asgjë më të mirë në boten e Unix'it. Madhësija e projectM'it vjen nga puna e shkëlqyeshme të bashkimit të saj. Përdoruesit si ti mundin të krijojnë cilësime që lidhin musikën me vizualizime të jashtzakonshëm. Provoje! projectM'i është një zbatim i LGPL'uar prej Milkdrop ndër OpenGL. Të gjith që projectM kërkon është një kartë grafike me përshpejtim për 3D dhe muzikën tënde të preferuar. + projectM är en fantastisk musikvisualisering. Det finns inget bättre i Unixvärlden. projectM's storhet kommer från gemenskapens hårda jobb. Användare som du kan skapa förval som förenar musiken med otroliga visualiseringar. Prova det! projectM visualisering är en LGPL-implementation av Milkdrop i OpenGL Alla projectM kräver ett grafikkort med 3D-acceleration och din favoritmusik. + projectM ஒரு அருமையான இசை காட்சிப்படுத்துனர். யுனிக்ஸின் உலகத்தில் மேன்மையானது இல்லை. projectM இன் தரம் சமூகத்தின் கடின உழைப்பால் வருகிறது. உங்களைப்போன்ற பயனர்கள் இசையுடனான காட்சிப்படுத்தலை உருவாக்க முடியும். முயற்சிக்க projectM Visualisation is an LGPL'ed reimplementation of Milkdrop under OpenGL சகல projectM களும் வேலைசெய்ய முப்பரிமாணத்துடன் கூடிய video card உம் நீங்கள் விரும்பிய இசையும் அவசியம். + projectM таҷассуми мусиқии аҷоиб мебошад. Чезе беҳтар аз projectM дар ҷаҳони Unix вуҷуд надорад. projectM натиҷаи кори вазнини ҷамъияташ мебошад. Корбарони монанди шумо метавонанд танзимотеро, ки мусиқиро бо таҷассуми аҷоиб пайваст мекунед, эҷод кунанд. Кӯшиш кунед! Таҷассуми projectM дар асоси LGPL-и Milkdrop бо OpenGL эҷод карда шуд Таҷассуми projectM танҳо корти видеоӣ бо шитобдиҳандаи 3D ва файлҳои мусиқии дӯстдоштаи шуморо талаб мекунад. + projectM คือการแสดงแสงสีประกอบเพลง อันยอดเยี่ยม. ไม่มีอะไรที่ดีกว่านี้แล้ว ในโลกของ Unix. projectM คือความยิ่งใหญ่ ที่มาจากการทำงานอย่างหนักของชุมชน. ผู้ใช้เช่นคุณสามารถสร้าง ชุดรูปแบบ ที่เชื่อมโยงกับเพลงด้วยแสงสีอันน่าทึ่ง. ลองเลย! การแสดงแสงสี projectM เป็นการดำเนินการตาม LGPL'ed ของ Milkdrop ภายใต้ OpenGL ทั้งหมดที่ต้องใช้สำหรับ projectM มีเพียงการ์ดวิดีโอที่มีการเร่งแสดงผล 3D และเพลงที่คุณชื่นชอบ. + projectM muhteşem bir müzik görselleştiricidir. Unix dünyasında daha iyisi yoktur. projectM'in ihtişamı geliştirici gurubunun çok çalışmasından gelir. Sizin gibi kullanıcılar müzik ile bağlanan inanılmaz görsel ayarlar hazırlayabilirler. Lütfen siz de deneyin! projectM Görseli, Milkdrop'un OpenGL altında yeniden LGPL'li implementasyonudur. projectM' in tek ihtiyacı 3D hızlandırıcılı bir görüntü kartı ve sizin favori müziğinizdir. + projectM - це чудовий візуалізатор відео. Немає нічого кращого в світі Unix. projectM створений тяжкою роботою спільноти. Користувачі, такі як Ви, можуть створювати різні візуалізації. Спробуйте! Візуалізація projectM - це LGPLівська імплементація Milkdrop під ліцензією OpenGL Все, що потрібно для projectM - це відео карта з 3D прискоренням і Ваша улюблена музика. + projectM là chương trình trình chiếu nhạc tuyệt vời. Không có gì tuyệt hơn nó trong thế giới Unix. Sự tuyệt vời của projectM đến từ thành quả vất vả của cộng đồng. Những người sử dụng như bạn có thể tạo ra những bộ preset mà kết nối âm nhạc với hiệu ứng hình ảnh tuyệt vời. Hãy thử nó!\n Chương trình này là một phiên bản LGPL được phát triển dựa trên Milkdrop qua OpenGL\n Tất cả bạn cần chỉ là một card đồ họa 3D và bài hát ưa thích của mình. + projectM 是一个音乐可视化效果。它是 Unix 世界中最好的。它的伟大来自于社区的辛苦工作。使用者可以创建预设参数把音乐和难以置信的可视化效果连接起来。试试吧! projectM 可视化效果是用 OpenGL 按照 LGPL 协议对 Milkdrop 的重新实现 projectM 所要求的仅是一块有 3D 加速功能的显卡和你喜爱的音乐。 + projectM是一個令人驚豔的音樂視覺效果。它是Unix世界中最好的。projectM的偉大成果來自於社群創作者的投入與心血。使用者可以創建把音樂和難以置信的視覺效果連接起來的預設值。快來嘗鮮一下吧! projectM視覺效果是用OpenGL按照LGPL協議對Milkdrop的重新實現 projectM所要求的僅是一張有3D加速功能的影像顯示卡和您喜愛的音樂。 + linux osx wingl + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.projectm/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.projectm/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.af_za/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.af_za/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.af_za/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.af_za/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/kodi-main/language/af_ZA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af_ZA\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Verbeeld Kwaliteit" + +msgctxt "#30001" +msgid "Low" +msgstr "Laag" + +msgctxt "#30002" +msgid "Medium" +msgstr "Medium" + +msgctxt "#30003" +msgid "High" +msgstr "Hoog" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maksimum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Skommel Modus" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Gladde Voorafinstelling Duur" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Voorafinstelling Duur" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Maatslag Sensitiwiteit" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Voorafinstelling Pak" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Bestek Pak" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Gebruiker Gedefinieerde Voorafinstelling Vouer" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Gebruiker Voorafinstelling Vouer" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek." + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.am_et/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.am_et/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.am_et/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.am_et/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Amharic (Ethiopia) (http://www.transifex.com/projects/p/kodi-main/language/am_ET/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: am_ET\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "ዝቅተኛ " + +msgctxt "#30002" +msgid "Medium" +msgstr "መካከለኛ " + +msgctxt "#30003" +msgid "High" +msgstr "ከፍተኛ " + +msgctxt "#30004" +msgid "Maximum" +msgstr "ከፍተኛ" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ar_sa/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ar_sa/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ar_sa/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ar_sa/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/kodi-main/language/ar_SA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar_SA\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "تقديم الجودة" + +msgctxt "#30001" +msgid "Low" +msgstr "الصغرى" + +msgctxt "#30002" +msgid "Medium" +msgstr "متوسط" + +msgctxt "#30003" +msgid "High" +msgstr "العظمى" + +msgctxt "#30004" +msgid "Maximum" +msgstr "أقصى حد" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "الوضع العشوائي" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "مدة ضبط مسبق سلس" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "مدة الضبط المسبق" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "حساسية الوقع الموسيقي" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "حزمة ضبط مسبق" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "حزمة افتراضية" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "مستخدم مجلد ضبط مسبق معدل" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "مستخدم مجلد الضبط المسبق" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f الثانية" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.be_by/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.be_by/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.be_by/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.be_by/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Belarusian (Belarus) (http://www.transifex.com/projects/p/kodi-main/language/be_BY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be_BY\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Якасьць рэндэрынгу" + +msgctxt "#30001" +msgid "Low" +msgstr "Нізкая" + +msgctxt "#30002" +msgid "Medium" +msgstr "Сярэдняя" + +msgctxt "#30003" +msgid "High" +msgstr "Высокая" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Максымальная" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Выпадковы парадак" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Smooth Preset Duration" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Preset Duration" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Beat Sensitivity" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Default Pack" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "User Defined Preset Folder" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "User Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.bg_bg/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.bg_bg/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.bg_bg/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.bg_bg/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/kodi-main/language/bg_BG/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg_BG\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Качество на изчертаването" + +msgctxt "#30001" +msgid "Low" +msgstr "Ниско" + +msgctxt "#30002" +msgid "Medium" +msgstr "Средно" + +msgctxt "#30003" +msgid "High" +msgstr "Високо" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Максимално" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Режим за смяна" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Плавен преход между шаблоните" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Времетраене на шаблон" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Чувствителност към ритъма" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Пакет шаблони" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Стандартен пакет" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Папка за шаблоните на потребителя" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Папка със шаблони" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сек" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.bs_ba/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.bs_ba/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.bs_ba/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.bs_ba/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/projects/p/kodi-main/language/bs_BA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs_BA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "nizak" + +msgctxt "#30002" +msgid "Medium" +msgstr "Srednje" + +msgctxt "#30003" +msgid "High" +msgstr "visok" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ca_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ca_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ca_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ca_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Catalan (Spain) (http://www.transifex.com/projects/p/kodi-main/language/ca_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Qualitat del renderitzat" + +msgctxt "#30001" +msgid "Low" +msgstr "Baixa" + +msgctxt "#30002" +msgid "Medium" +msgstr "Mitjana" + +msgctxt "#30003" +msgid "High" +msgstr "Alta" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Màxima" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Mode aleatori" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Suavitzar la durada del predefinit" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Durada del predefinit" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensibilitat del ritme" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paquet de predefinits" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Paquet per defecte" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Directori de predefinits configurat per l'usuari" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Directori de predefinits de l'usuari" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.cs_cz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.cs_cz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.cs_cz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.cs_cz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/kodi-main/language/cs_CZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs_CZ\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Kvalita vykreslování" + +msgctxt "#30001" +msgid "Low" +msgstr "Nízká" + +msgctxt "#30002" +msgid "Medium" +msgstr "Střední" + +msgctxt "#30003" +msgid "High" +msgstr "Vysoká" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Nejvyšší" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Náhodný režim" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Trvání hladkého přednastavení" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Trvání přednastavení" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Citlivost taktu" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Balík přednastavení" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Výchozí balík" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Uživatelem nastavená složka přednastavení" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Uživatelská složka přednastavení" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.cy_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.cy_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.cy_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.cy_gb/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Welsh (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/cy_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy_GB\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Ansawdd Llunio" + +msgctxt "#30001" +msgid "Low" +msgstr "Isel" + +msgctxt "#30002" +msgid "Medium" +msgstr "Canolig" + +msgctxt "#30003" +msgid "High" +msgstr "Uchel" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Mwyaf" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Modd Hap" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Hyd Rhagosodiad Llyfn" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Hyd Rhagosodiad" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensitifrwydd Curiad" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pac Rhagosodiad" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Pac Rhagosodedig" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Ffolder Rhagosodiad Defnyddiwr Diffinedig" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Defnyddio Ffolder Rhagosodiad" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f eil" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.da_dk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.da_dk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.da_dk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.da_dk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Danish (Denmark) (http://www.transifex.com/projects/p/kodi-main/language/da_DK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da_DK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Renderingskvalitet" + +msgctxt "#30001" +msgid "Low" +msgstr "Lav" + +msgctxt "#30002" +msgid "Medium" +msgstr "Medium" + +msgctxt "#30003" +msgid "High" +msgstr "Høj" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Blandingstilstand" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Jævn varighed af forudindstilling" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Varighed af forudindstilling" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Beat-følsomhed" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Forudindstillings-pakke" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Standardpakke" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Brugerdefineret mappe med forudindstillinger " + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Brugermappe med forudindstillinger" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.de_de/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.de_de/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.de_de/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.de_de/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: German (Germany) (http://www.transifex.com/projects/p/kodi-main/language/de_DE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de_DE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Render-Qualität" + +msgctxt "#30001" +msgid "Low" +msgstr "Niedrig" + +msgctxt "#30002" +msgid "Medium" +msgstr "Mittel" + +msgctxt "#30003" +msgid "High" +msgstr "Hoch" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximal" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Zufallsmodus" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Dauer der Überblendung (s)" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Dauer für Einstellung (s)" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Takt Empfindlichkeit" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Standard-Pack" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Benutzerdefiniertes Verzeichnis für Presets" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Presets aus dem Userverzeichnis" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.el_gr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.el_gr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.el_gr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.el_gr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Greek (Greece) (http://www.transifex.com/projects/p/kodi-main/language/el_GR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el_GR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Ποιότητα Απόδοσης" + +msgctxt "#30001" +msgid "Low" +msgstr "Ελαχ." + +msgctxt "#30002" +msgid "Medium" +msgstr "Μεσαία" + +msgctxt "#30003" +msgid "High" +msgstr "Υψηλά" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Μέγ." + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Λειτουργία Ανάμιξης" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Διάρκεια Ομαλής Προρύθμισης" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Διάρκεια Προρύθμισης" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Ευαισθησία Ρυθμού" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Πακέτο Προρυθμίσεων" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Προεπιλεγμένο Πακέτο" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Φάκελος Προρυθμίσεων Επιλογής Χρήστη" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Φάκελος Προρυθμίσεων Χρήστη" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f δευτερόλεπτα" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.en_au/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.en_au/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.en_au/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.en_au/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/kodi-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Render Quality" + +msgctxt "#30001" +msgid "Low" +msgstr "Low" + +msgctxt "#30002" +msgid "Medium" +msgstr "Medium" + +msgctxt "#30003" +msgid "High" +msgstr "High" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Shuffle Mode" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Smooth Preset Duration" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Preset Duration" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Beat Sensitivity" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Default Pack" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "User Defined Preset Folder" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "User Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.en_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.en_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.en_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.en_gb/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,82 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#settings labels + +msgctxt "#30000" +msgid "Render Quality" +msgstr "" + +msgctxt "#30001" +msgid "Low" +msgstr "" + +msgctxt "#30002" +msgid "Medium" +msgstr "" + +msgctxt "#30003" +msgid "High" +msgstr "" + +msgctxt "#30004" +msgid "Maximum" +msgstr "" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "" + +#empty strings from id 30013 to 30049 +#setting value formats + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.en_nz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.en_nz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.en_nz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.en_nz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/kodi-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Render Quality" + +msgctxt "#30001" +msgid "Low" +msgstr "Low" + +msgctxt "#30002" +msgid "Medium" +msgstr "Medium" + +msgctxt "#30003" +msgid "High" +msgstr "High" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Shuffle Mode" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Smooth Preset Duration" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Preset Duration" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Beat Sensitivity" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Default Pack" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "User Defined Preset Folder" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "User Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.en_us/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.en_us/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.en_us/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.en_us/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United States) (http://www.transifex.com/projects/p/kodi-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Render Quality" + +msgctxt "#30001" +msgid "Low" +msgstr "Low" + +msgctxt "#30002" +msgid "Medium" +msgstr "Medium" + +msgctxt "#30003" +msgid "High" +msgstr "High" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Shuffle Mode" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Smooth Preset Duration" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Preset Duration" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Beat Sensitivity" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Default Pack" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "User Defined Preset Folder" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "User Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.eo/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.eo/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.eo/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.eo/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/kodi-main/language/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Malnobla" + +msgctxt "#30002" +msgid "Medium" +msgstr "Medium" + +msgctxt "#30003" +msgid "High" +msgstr "Nobla" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.es_ar/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.es_ar/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.es_ar/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.es_ar/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/kodi-main/language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Calidad del renderizado" + +msgctxt "#30001" +msgid "Low" +msgstr "Baja" + +msgctxt "#30002" +msgid "Medium" +msgstr "Media" + +msgctxt "#30003" +msgid "High" +msgstr "Alta" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Máxima" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Modo aleatorio" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Suavizar la duración del ajuste preestablecido" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Duración del ajuste preestablecido" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensibillidad del ritmo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paquete de ajustes preestablecidos" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Paquete por defecto" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Carpeta de ajustes preestablecidos definida por el usuario" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Carpeta de ajustes preestablecidos del usuario" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.es_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.es_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.es_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.es_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/kodi-main/language/es_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Calidad del renderizado" + +msgctxt "#30001" +msgid "Low" +msgstr "Baja" + +msgctxt "#30002" +msgid "Medium" +msgstr "Media" + +msgctxt "#30003" +msgid "High" +msgstr "Alta" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Máxima" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Modo aleatorio" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Suavizar la duración del Preset" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Duración del Preset" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensibillidad del ritmo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paquete de Presets" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Paquete por defecto" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Carpeta de Presets definidos por el usuario" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Carpeta de Presets de usuario" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.es_mx/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.es_mx/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.es_mx/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.es_mx/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/kodi-main/language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Calidad del Renderizado" + +msgctxt "#30001" +msgid "Low" +msgstr "Bajo" + +msgctxt "#30002" +msgid "Medium" +msgstr "Media" + +msgctxt "#30003" +msgid "High" +msgstr "Alto" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Máximo" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Modo Aleatorio" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Duración del Preaujste Suave" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Duración del Preaujste" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensibilidad del Ritmo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paquete del Preaujste" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Paquete Default" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Carpeta de Preaujstes Definidos por el Usuario" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Carpeta de Preaujstes de Usuario" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f segs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.et_ee/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.et_ee/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.et_ee/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.et_ee/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/kodi-main/language/et_EE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et_EE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Renderduse kvaliteet" + +msgctxt "#30001" +msgid "Low" +msgstr "Madal" + +msgctxt "#30002" +msgid "Medium" +msgstr "Keskmine" + +msgctxt "#30003" +msgid "High" +msgstr "Kõrge" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maksimaalne" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Segamise režiim" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Katkematu eelseade kestvus" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Eelseade kestvus" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Rütmitundlikkus" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Eelseade pakett" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Vaikepakett" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Kasutaja määratud eelseade kaust" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Kasutaja eelseade kaust" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f s" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.eu_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.eu_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.eu_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.eu_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Basque (Spain) (http://www.transifex.com/projects/p/kodi-main/language/eu_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Baxua" + +msgctxt "#30002" +msgid "Medium" +msgstr "Ertaina" + +msgctxt "#30003" +msgid "High" +msgstr "Handia" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.fa_ir/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.fa_ir/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.fa_ir/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.fa_ir/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/kodi-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "کیفیت نمایش" + +msgctxt "#30001" +msgid "Low" +msgstr "کم" + +msgctxt "#30002" +msgid "Medium" +msgstr "متوسط" + +msgctxt "#30003" +msgid "High" +msgstr "زیاد" + +msgctxt "#30004" +msgid "Maximum" +msgstr "حداکثر" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "اتفاقی" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "مدت نمایش شفاف" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "مدت نمایش قالب" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "حساسیت به ضرباهنگ" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "بسته قالب ها" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "بسته پیش فرض" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "پوشه تعریف شده برای قالب ها" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "پوشه قالب های کاربر" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f ثانیه" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %% " diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.fi_fi/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.fi_fi/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.fi_fi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.fi_fi/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/kodi-main/language/fi_FI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi_FI\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Kuvanlaatu" + +msgctxt "#30001" +msgid "Low" +msgstr "Matala" + +msgctxt "#30002" +msgid "Medium" +msgstr "Keski" + +msgctxt "#30003" +msgid "High" +msgstr "Korkea" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maksimi" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Sekoitustila" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Pehmeä esiasetettu kesto" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Esiasetettu kesto" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Rytmiherkkyys" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Esiasetuspaketti" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Oletuspaketti" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Käyttäjän määrittämä esiasetuskansio" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Esiasetuskansio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f s" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.fo_fo/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.fo_fo/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.fo_fo/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.fo_fo/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Faroese (Faroe Islands) (http://www.transifex.com/projects/p/kodi-main/language/fo_FO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo_FO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Lágt" + +msgctxt "#30002" +msgid "Medium" +msgstr "Miðal" + +msgctxt "#30003" +msgid "High" +msgstr "Høgt" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.fr_ca/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.fr_ca/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.fr_ca/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.fr_ca/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/kodi-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Qualité de Rendu" + +msgctxt "#30001" +msgid "Low" +msgstr "Basse" + +msgctxt "#30002" +msgid "Medium" +msgstr "Moyenne" + +msgctxt "#30003" +msgid "High" +msgstr "Haute" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Mode Aléatoire" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Lisser la durée du préréglage" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Durée du préréglage" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensibilité au tempo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pack de préréglages" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Paquet par défaut" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Dossier de préréglages de l'utilisateur" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Dossier de préréglages de l'utilisateur" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.fr_fr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.fr_fr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.fr_fr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.fr_fr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (France) (http://www.transifex.com/projects/p/kodi-main/language/fr_FR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_FR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Qualité de Rendu" + +msgctxt "#30001" +msgid "Low" +msgstr "Basse" + +msgctxt "#30002" +msgid "Medium" +msgstr "Moyenne" + +msgctxt "#30003" +msgid "High" +msgstr "Haute" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Mode Aléatoire" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Lisser la durée de la présélection" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Durée de la présélection" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensibilité au tempo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pack de présélections" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Paquet prédéfini" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Dossier de présélection défini par l'utilisateur" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Dossier de présélection de l'utilisateur" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.gl_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.gl_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.gl_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.gl_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Galician (Spain) (http://www.transifex.com/projects/p/kodi-main/language/gl_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Calidade do renderizado" + +msgctxt "#30001" +msgid "Low" +msgstr "Baixa" + +msgctxt "#30002" +msgid "Medium" +msgstr "Media" + +msgctxt "#30003" +msgid "High" +msgstr "Alta" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Máxima" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Modo ó chou" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Duración da preconfiguración suave" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Duración da preconfiguración" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensibilidade do ritmo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paquete de preconfiguracións" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Paquete por defecto" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Cartafol de preconfiguracións definido polo usuario" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Cartafol de preconfiguracións do usuario" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.he_il/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.he_il/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.he_il/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.he_il/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/kodi-main/language/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "איכות עיבוד" + +msgctxt "#30001" +msgid "Low" +msgstr "נמוך" + +msgctxt "#30002" +msgid "Medium" +msgstr "בינוני" + +msgctxt "#30003" +msgid "High" +msgstr "גבוה" + +msgctxt "#30004" +msgid "Maximum" +msgstr "מירבי" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "מצב מעורבב" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "משך החלקת מעבר קביעון" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "משך קביעון" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "רגישות קצב" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "ערכת קביעונים" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "ברירת מחדל" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "תיקיה מותאמת אישית" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "נתיב תיקיית קביעונים" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f שניות" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.hi_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.hi_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.hi_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.hi_in/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hindi (India) (http://www.transifex.com/projects/p/kodi-main/language/hi_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "लो" + +msgctxt "#30002" +msgid "Medium" +msgstr "मध्यम" + +msgctxt "#30003" +msgid "High" +msgstr "उच्च" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.hr_hr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.hr_hr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.hr_hr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.hr_hr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Croatian (Croatia) (http://www.transifex.com/projects/p/kodi-main/language/hr_HR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr_HR\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Kvaliteta prikaza" + +msgctxt "#30001" +msgid "Low" +msgstr "Niska" + +msgctxt "#30002" +msgid "Medium" +msgstr "Srednja" + +msgctxt "#30003" +msgid "High" +msgstr "Visoka" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Najveća" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Naizmjenični način" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Vrijeme glatkog prijelaza predloška" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Trajanje predloška" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Osjetljivost takta" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paket predložaka" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Zadani paket" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Korisnički definirana mapa predložaka" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Korisnička mapa predložaka" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.hu_hu/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.hu_hu/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.hu_hu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.hu_hu/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/kodi-main/language/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Megjelenítés minősége" + +msgctxt "#30001" +msgid "Low" +msgstr "Alacsony" + +msgctxt "#30002" +msgid "Medium" +msgstr "Közepes" + +msgctxt "#30003" +msgid "High" +msgstr "Magas" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Altípus keverési mód" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Finom átmenet időtartama" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Átmenet időtartama" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Ritmus érzékenység" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Beállításkészlet" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Alapértelmezett készlet" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Felhasználói beállításkészlet" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Beállításkészlet mappája" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f mp" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.hy_am/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.hy_am/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.hy_am/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.hy_am/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Armenian (Armenia) (http://www.transifex.com/projects/p/kodi-main/language/hy_AM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy_AM\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Ցածր" + +msgctxt "#30002" +msgid "Medium" +msgstr "Միջին" + +msgctxt "#30003" +msgid "High" +msgstr "Բարձր" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.id_id/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.id_id/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.id_id/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.id_id/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/kodi-main/language/id_ID/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id_ID\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Kualitas Render" + +msgctxt "#30001" +msgid "Low" +msgstr "Rendah" + +msgctxt "#30002" +msgid "Medium" +msgstr "Medium" + +msgctxt "#30003" +msgid "High" +msgstr "Tinggi" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maksimum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Mode Acak" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Durasi Preset Halus" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Durasi Preset" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sentifitas Beat" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paket Preset" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Paket Standar" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Folder Preset yang ditentukan Pengguna" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Gunakan Folder Preset" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f detik" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.is_is/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.is_is/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.is_is/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.is_is/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Icelandic (Iceland) (http://www.transifex.com/projects/p/kodi-main/language/is_IS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is_IS\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Gæði birtingar" + +msgctxt "#30001" +msgid "Low" +msgstr "Lægst" + +msgctxt "#30002" +msgid "Medium" +msgstr "Meðal" + +msgctxt "#30003" +msgid "High" +msgstr "Hæst" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Hámark" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Slembi hamur" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Tímalengd mjúkra forstillinga" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Tímalengd forstillinga" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Taktnæmni" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Forstillinga pakki" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Sjálfgefinn pakki" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Mappa fyrir forstillingar skilgreindar af notanda" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Nota möppu" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekúndur" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.it_it/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.it_it/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.it_it/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.it_it/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/kodi-main/language/it_IT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it_IT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Qualità di rendering" + +msgctxt "#30001" +msgid "Low" +msgstr "Bassa" + +msgctxt "#30002" +msgid "Medium" +msgstr "Media" + +msgctxt "#30003" +msgid "High" +msgstr "Alta" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Massima" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Modalità casuale" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Durata Preset 'Smooth'" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Durata preset" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensibilità al ritmo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Raccolta preset" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Raccolta predefinita" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Cartella specifica per i preset" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Cartella preset dell'utente" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secondi" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ja_jp/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ja_jp/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ja_jp/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ja_jp/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/kodi-main/language/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "レンダリング品質" + +msgctxt "#30001" +msgid "Low" +msgstr "低" + +msgctxt "#30002" +msgid "Medium" +msgstr "中" + +msgctxt "#30003" +msgid "High" +msgstr "高" + +msgctxt "#30004" +msgid "Maximum" +msgstr "最大" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "シャッフルモード" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "スムースプリセット間隔" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "プリセット間隔" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "ビート感度" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "プリセットパック" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "デフォルトパック" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "ユーザー設定プリセットフォルダ" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "ユーザープリセットフォルダ" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f秒" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f%%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ko_kr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ko_kr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ko_kr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ko_kr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/kodi-main/language/ko_KR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko_KR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "렌더링 화질" + +msgctxt "#30001" +msgid "Low" +msgstr "낮음" + +msgctxt "#30002" +msgid "Medium" +msgstr "중간" + +msgctxt "#30003" +msgid "High" +msgstr "높음" + +msgctxt "#30004" +msgid "Maximum" +msgstr "최대" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "셔플 모드" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "부드러운 프리셋 시간" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "프리셋 시간" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "비트 감지도" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "프리셋 팩" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "기본 팩" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "사용자 정의 프리셋 폴더" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "사용자 프리셋 폴더" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f 초" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.lt_lt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.lt_lt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.lt_lt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.lt_lt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/kodi-main/language/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Renderingo Kokybė" + +msgctxt "#30001" +msgid "Low" +msgstr "Žemas" + +msgctxt "#30002" +msgid "Medium" +msgstr "Vidutinis" + +msgctxt "#30003" +msgid "High" +msgstr "Aukštas" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maksimalus" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Maišimo Režimas" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Perėjimo Laikas" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Režimo Ilgumas" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Jautrumas Ritmui" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Nustatymų Paketas" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Numatytasis Paketas" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Apibrėžtas Vartotojo Aplankas" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Vartotojo Nustatymų Aplankas" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.lv_lv/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.lv_lv/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.lv_lv/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.lv_lv/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/kodi-main/language/lv_LV/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv_LV\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Apstrādes kvalitāte" + +msgctxt "#30001" +msgid "Low" +msgstr "Zems" + +msgctxt "#30002" +msgid "Medium" +msgstr "Vidējs" + +msgctxt "#30003" +msgid "High" +msgstr "Augsts" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maksimums" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Jaukšanas režīms" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Gluda sagataves darbība " + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Sagatavju ilgums" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Ritma sajušana" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Sagatavju paka" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Noklusētā paka" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Lietotāja norādīta sagatavju mape" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Lietotāja sagataves mape" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekundes" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.mi/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.mi/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.mi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.mi/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/kodi-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Hakahaka" + +msgctxt "#30002" +msgid "Medium" +msgstr "Waenga" + +msgctxt "#30003" +msgid "High" +msgstr "Teitei" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.mk_mk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.mk_mk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.mk_mk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.mk_mk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Macedonian (Macedonia) (http://www.transifex.com/projects/p/kodi-main/language/mk_MK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk_MK\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Квалитет на рендерирање" + +msgctxt "#30001" +msgid "Low" +msgstr "низок" + +msgctxt "#30002" +msgid "Medium" +msgstr "Средно" + +msgctxt "#30003" +msgid "High" +msgstr "висок" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Максимум" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Shuffle Mode" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Smooth Preset Duration" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Preset Duration" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Beat Sensitivity" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Preset Pack" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Default Pack" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "User Defined Preset Folder" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "User Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.mn_mn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.mn_mn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.mn_mn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.mn_mn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Mongolian (Mongolia) (http://www.transifex.com/projects/p/kodi-main/language/mn_MN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mn_MN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Бага" + +msgctxt "#30002" +msgid "Medium" +msgstr "Дунд" + +msgctxt "#30003" +msgid "High" +msgstr "Өндөр" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ms_my/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ms_my/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ms_my/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ms_my/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/kodi-main/language/ms_MY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms_MY\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Kualiti Persembahan" + +msgctxt "#30001" +msgid "Low" +msgstr "Rendah" + +msgctxt "#30002" +msgid "Medium" +msgstr "Sederhana" + +msgctxt "#30003" +msgid "High" +msgstr "Tinggi" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maksimum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Mod Kocok" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Jangkamasa Praset Lancar" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Jangkamasa Praset" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Kepekaan Rentak" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pek Praset" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Pek Lalai" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Folder Praset Ditakrif Pengguna" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Folder Praset Pengguna" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f saat" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.mt_mt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.mt_mt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.mt_mt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.mt_mt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Maltese (Malta) (http://www.transifex.com/projects/p/kodi-main/language/mt_MT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mt_MT\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Filmati/Generi" + +msgctxt "#30002" +msgid "Medium" +msgstr "Medju" + +msgctxt "#30003" +msgid "High" +msgstr "Filmati/Atturi" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.my_mm/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.my_mm/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.my_mm/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.my_mm/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/kodi-main/language/my_MM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my_MM\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Render အရည်အသွေး" + +msgctxt "#30001" +msgid "Low" +msgstr "အနိမ့်စား" + +msgctxt "#30002" +msgid "Medium" +msgstr "အလယ်အလတ်" + +msgctxt "#30003" +msgid "High" +msgstr "အမြင့်စား" + +msgctxt "#30004" +msgid "Maximum" +msgstr "အမြင့်ဆုံး" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Preset ကြာချိန်" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Default Pack" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "အသုံးပြုသူသတ်မှတ်ထားသော Preset ဖိုလ်ဒါလ်" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "User Preset Folder" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.nb_no/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.nb_no/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.nb_no/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.nb_no/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/kodi-main/language/nb_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Kvalitet" + +msgctxt "#30001" +msgid "Low" +msgstr "Lav" + +msgctxt "#30002" +msgid "Medium" +msgstr "Middels" + +msgctxt "#30003" +msgid "High" +msgstr "Høy" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Høyest" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Blandingsmodus" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Utglattingsintervall" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Visualiseringsvarighet" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Rytmefølsomhet" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Innstillinger" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Standard" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Egendefinert" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Bla etter innstillingsmappe" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.nl_nl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.nl_nl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.nl_nl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.nl_nl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/kodi-main/language/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Weergavekwaliteit" + +msgctxt "#30001" +msgid "Low" +msgstr "Laag" + +msgctxt "#30002" +msgid "Medium" +msgstr "Medium" + +msgctxt "#30003" +msgid "High" +msgstr "Hoog" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Willekeurige modus" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Geleidelijke voorinstellingsduur " + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Voorinstellingsduur" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Beatgevoeligheid" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Voorinstelling pakket" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Standaard pakket" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Gebruikergedefineerde Presetmap" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Gebruiker Presetmap" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.Van sec." + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.Van %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.pl_pl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.pl_pl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.pl_pl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.pl_pl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/kodi-main/language/pl_PL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Jakość renderowania" + +msgctxt "#30001" +msgid "Low" +msgstr "Niska" + +msgctxt "#30002" +msgid "Medium" +msgstr "Średnia" + +msgctxt "#30003" +msgid "High" +msgstr "Wysoka" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maksymalna" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Tryb losowania" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Płynny czas trwania wzorca" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Czas trwania wzorca" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Czułość rytmu" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pakiet wzorców" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Domyślny zestaw" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Folder wzorców użytkownika" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Folder wzorców użytkownika" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek." + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.pt_br/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.pt_br/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.pt_br/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.pt_br/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/kodi-main/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Qualidade do Render" + +msgctxt "#30001" +msgid "Low" +msgstr "Mínima" + +msgctxt "#30002" +msgid "Medium" +msgstr "Médio" + +msgctxt "#30003" +msgid "High" +msgstr "Máxima" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Máximo" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Modo Shuffle" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Duração predefinida Suave" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Duração predefinida" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensibilidade da batida" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pacote de predefinições" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Pacote Padrão" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Diretório pré-definido pelo usuário" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Pasta de predefinições do usuário" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f segs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.pt_pt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.pt_pt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.pt_pt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.pt_pt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/kodi-main/language/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Qualidade da renderização" + +msgctxt "#30001" +msgid "Low" +msgstr "Baixa" + +msgctxt "#30002" +msgid "Medium" +msgstr "Média" + +msgctxt "#30003" +msgid "High" +msgstr "Alta" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Máxima" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Modo aleatório" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Duração de Pré-Selecção Suave" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Duração de Pré-Selecção" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Sensibilidade ao Ritmo" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Conjunto de Pré-Selecções" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Conjunto padrão" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Pasta de Pré-Selecções Definida " + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Pasta de Pré-Selecções do Utilizador" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f segundos" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ro_ro/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ro_ro/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ro_ro/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ro_ro/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Romanian (Romania) (http://www.transifex.com/projects/p/kodi-main/language/ro_RO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro_RO\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Calitatea randare" + +msgctxt "#30001" +msgid "Low" +msgstr "Mică" + +msgctxt "#30002" +msgid "Medium" +msgstr "Medie" + +msgctxt "#30003" +msgid "High" +msgstr "Mare" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximă" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Mod amestecare" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Durată presetări fin" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Durată presetări" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Senzitivitate bătăi" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Pachet presetări" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Pachet implicit" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Dosar presetări definite de utilizator" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Dosar presetări utilizator" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sec" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ru_ru/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ru_ru/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ru_ru/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ru_ru/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/kodi-main/language/ru_RU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru_RU\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Качество отрисовки" + +msgctxt "#30001" +msgid "Low" +msgstr "Низкое" + +msgctxt "#30002" +msgid "Medium" +msgstr "Среднее" + +msgctxt "#30003" +msgid "High" +msgstr "Высокое" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Максимальное" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Режим перемешивания" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Время перехода" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Длительность режима" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Чувствительность к ритму" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Набор настроек" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Пакет по умолчанию" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Папка для пользовательских настроек" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Папка настроек пользователя" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f с" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.si_lk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.si_lk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.si_lk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.si_lk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/kodi-main/language/si_LK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: si_LK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "අඩු" + +msgctxt "#30002" +msgid "Medium" +msgstr "මධ්‍යස්ථ" + +msgctxt "#30003" +msgid "High" +msgstr "ඉහළ" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sk_sk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sk_sk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sk_sk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sk_sk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/kodi-main/language/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Kvalita vykreslovania" + +msgctxt "#30001" +msgid "Low" +msgstr "Nízka" + +msgctxt "#30002" +msgid "Medium" +msgstr "Stredná" + +msgctxt "#30003" +msgid "High" +msgstr "Vysoká" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximálny" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Náhodný režim" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Doba trvania prechodu" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Trvanie nastavenia" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Citlivosť na rytmus" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Balík predvolieb" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Východzí balík" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Užívateľom nastavený adresár Predvolieb" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Užívateľský adresár Predvolieb" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sl_si/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sl_si/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sl_si/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sl_si/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/kodi-main/language/sl_SI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl_SI\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Kakovost izrisa" + +msgctxt "#30001" +msgid "Low" +msgstr "Nizka" + +msgctxt "#30002" +msgid "Medium" +msgstr "Srednja" + +msgctxt "#30003" +msgid "High" +msgstr "Visoka" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Najvišja" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Naključni način" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Trajanje prelivanja med prednastavitvami" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Trajanje prednastavitev" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Občutljivost na ritem" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paket prednastavitev" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Privzet paket" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Uporabniško določena mapa s prednastavitvami" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Uporabniško določena mapa" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekund" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sq_al/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sq_al/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sq_al/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sq_al/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Albanian (Albania) (http://www.transifex.com/projects/p/kodi-main/language/sq_AL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq_AL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Kualiteti i \"Rendering\"" + +msgctxt "#30001" +msgid "Low" +msgstr "Poshtë" + +msgctxt "#30002" +msgid "Medium" +msgstr "Mesatare" + +msgctxt "#30003" +msgid "High" +msgstr "Lartë" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maksimum" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Mënyra e përziejer" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Kohëzgjatja (me kalim të but) e të paravendosurit" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Kohëzgjatja e të paravendosurit" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Ndjeshmërija ndaj muzikës" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Paketë e të paravendosurve" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Paketi i parazgjedhur" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Regjistri i paravendosurve i zgjedhur nga përdoruesi" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Regjistri i paravendosurve i përdoruesit" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekonda" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sr_rs/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sr_rs/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sr_rs/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sr_rs/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Serbian (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "низак" + +msgctxt "#30002" +msgid "Medium" +msgstr "Средње" + +msgctxt "#30003" +msgid "High" +msgstr "висок" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sr_rs@latin/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sr_rs@latin/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sr_rs@latin/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sr_rs@latin/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Serbian (Latin) (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS@latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "nizak" + +msgctxt "#30002" +msgid "Medium" +msgstr "Srednje" + +msgctxt "#30003" +msgid "High" +msgstr "Visok" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sv_se/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sv_se/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.sv_se/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.sv_se/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/kodi-main/language/sv_SE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv_SE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Renderingskvalitet" + +msgctxt "#30001" +msgid "Low" +msgstr "Låg" + +msgctxt "#30002" +msgid "Medium" +msgstr "Mellan" + +msgctxt "#30003" +msgid "High" +msgstr "Hög" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Maximal" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Blandningsläge" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Mjukt förvalslängd" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Förvalslängd" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Taktkänslighet" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Förvalspaket" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Standardpaket" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Användardefineradförvalsmapp" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Användarförvalsmapp" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.szl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.szl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.szl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.szl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Silesian (http://www.transifex.com/projects/p/kodi-main/language/szl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: szl\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "min." + +msgctxt "#30002" +msgid "Medium" +msgstr "strz." + +msgctxt "#30003" +msgid "High" +msgstr "maks." diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ta_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ta_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.ta_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.ta_in/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,73 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/kodi-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30001" +msgid "Low" +msgstr "குறைவு" + +msgctxt "#30002" +msgid "Medium" +msgstr "மிதம்" + +msgctxt "#30003" +msgid "High" +msgstr "அதிகம்" + +msgctxt "#30004" +msgid "Maximum" +msgstr "உச்ச அளவு" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "கலக்கும் முறை" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "சீரான தரவு காலம்" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "தரவு காலம்" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "அதிர்வு உணர்திறன்" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "தரவுப்பொதி" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "நிலையான பொதி" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "பயனர் வரையறுத்த தரவு அடைவு" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "பயனர் தரவு அடைவு" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f வினாடிகள்" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.tg_tj/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.tg_tj/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.tg_tj/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.tg_tj/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tajik (Tajikistan) (http://www.transifex.com/projects/p/kodi-main/language/tg_TJ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg_TJ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Сифати пахш" + +msgctxt "#30001" +msgid "Low" +msgstr "Паст" + +msgctxt "#30002" +msgid "Medium" +msgstr "Миёна" + +msgctxt "#30003" +msgid "High" +msgstr "Баланд" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Ҳадди аксар" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Ҳолати пахши тасодуфӣ" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Давомнокии интихобшудаи ҳамворӣ" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Давомнокии интихобшуда" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Ҳассосияти тапиш" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Бастаи интихобшуда" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Бастаи пешфарз" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Ҷузвдони интихобшудаи корбари муайяншуда" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Ҷузвдони интихобшудаи корбарӣ" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сония" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.th_th/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.th_th/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.th_th/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.th_th/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/kodi-main/language/th_TH/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th_TH\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "คุณภาพการแสดงผล" + +msgctxt "#30001" +msgid "Low" +msgstr "ต่ำ" + +msgctxt "#30002" +msgid "Medium" +msgstr "ปานกลาง" + +msgctxt "#30003" +msgid "High" +msgstr "สูง" + +msgctxt "#30004" +msgid "Maximum" +msgstr "สูงสุด" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "โหมด สุ่มลำดับ" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "เปลี่ยนชุดรูปแบบอย่างลื่นไหล" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "ระยะเวลา เปลี่ยนชุดรูปแบบ" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "ค่าตอบสนองจังหวะ" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "แพ็ค ชุดรูปแบบ" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "แพ็ค ค่าเริ่มต้น" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "โฟลเดอร์ ชุดรูปแบบที่กำหนดโดยผู้ใช้" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "โฟลเดอร์ ชุดรูปแบบของผู้ใช้" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f วินาที" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.tr_tr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.tr_tr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.tr_tr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.tr_tr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/kodi-main/language/tr_TR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr_TR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "İşleyici Kalitesi" + +msgctxt "#30001" +msgid "Low" +msgstr "Düşük" + +msgctxt "#30002" +msgid "Medium" +msgstr "Orta" + +msgctxt "#30003" +msgid "High" +msgstr "Yüksek" + +msgctxt "#30004" +msgid "Maximum" +msgstr "En Yüksek" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Karıştırma Modu" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Akıcı Önayar Süresi" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Önayar Süresi" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Ritm Hassasiyeti" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Önayarlı Paket" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Varsayılan Paket" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Kullanıcı Tanımlı Önayar Klasörü" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Kullanıcı Önayar Klasörü" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f saniye" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.uk_ua/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.uk_ua/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.uk_ua/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.uk_ua/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/kodi-main/language/uk_UA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk_UA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Якість відображення" + +msgctxt "#30001" +msgid "Low" +msgstr "Мін." + +msgctxt "#30002" +msgid "Medium" +msgstr "Середня" + +msgctxt "#30003" +msgid "High" +msgstr "Макс." + +msgctxt "#30004" +msgid "Maximum" +msgstr "Максимальна" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Довільний вибір ефекту" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "М'яка зміна ефектів" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Тривалість ефекту" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Чутливість до такту музики" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Набір ефектів" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Набір за змовчанням" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Папка ефектів вказана користувачем" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Користувацька папка ефектів" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сек" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.uz_uz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.uz_uz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.uz_uz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.uz_uz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Uzbek (Uzbekistan) (http://www.transifex.com/projects/p/kodi-main/language/uz_UZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz_UZ\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "Low" +msgstr "Past" + +msgctxt "#30003" +msgid "High" +msgstr "Yuqori" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.vi_vn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.vi_vn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.vi_vn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.vi_vn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/kodi-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "Chất lượng hiển thị" + +msgctxt "#30001" +msgid "Low" +msgstr "Thấp" + +msgctxt "#30002" +msgid "Medium" +msgstr "Trung bình" + +msgctxt "#30003" +msgid "High" +msgstr "Cao" + +msgctxt "#30004" +msgid "Maximum" +msgstr "Max" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "Chế độ tự nhảy" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "Làm mượt khi bật Preset" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "Thời gian Preset" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "Độ nhạy với nhịp điệu" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "Các gói Preset" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "Gói mặc định" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "Đặt thư mục Preset" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "Thư mục Preset" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f giây" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.zh_cn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.zh_cn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.zh_cn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.zh_cn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/kodi-main/language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "渲染质量" + +msgctxt "#30001" +msgid "Low" +msgstr "低" + +msgctxt "#30002" +msgid "Medium" +msgstr "中" + +msgctxt "#30003" +msgid "High" +msgstr "高" + +msgctxt "#30004" +msgid "Maximum" +msgstr "最大" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "乱序播放模式" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "平滑预置时间" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "预置时间" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "节拍灵敏度" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "预置包" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "默认包" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "用户定义的预置文件夹" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "用户预置文件夹" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f 秒" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.zh_tw/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.zh_tw/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/language/resource.language.zh_tw/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/language/resource.language.zh_tw/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,77 @@ +# Kodi Media Center language file +# Addon Name: projectM +# Addon id: visualization.projectm +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/kodi-main/language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Render Quality" +msgstr "呈像品質" + +msgctxt "#30001" +msgid "Low" +msgstr "低溫" + +msgctxt "#30002" +msgid "Medium" +msgstr "中等" + +msgctxt "#30003" +msgid "High" +msgstr "高溫" + +msgctxt "#30004" +msgid "Maximum" +msgstr "最高" + +msgctxt "#30005" +msgid "Shuffle Mode" +msgstr "随機播放模式" + +msgctxt "#30006" +msgid "Smooth Preset Duration" +msgstr "平滑預置時間" + +msgctxt "#30007" +msgid "Preset Duration" +msgstr "預置時間" + +msgctxt "#30008" +msgid "Beat Sensitivity" +msgstr "節拍靈敏度" + +msgctxt "#30009" +msgid "Preset Pack" +msgstr "預置封包" + +msgctxt "#30010" +msgid "Default Pack" +msgstr "預設封包" + +msgctxt "#30011" +msgid "User Defined Preset Folder" +msgstr "使用者定義的預置資料夾" + +msgctxt "#30012" +msgid "User Preset Folder" +msgstr "使用者預置資料夾" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f 秒" + +msgctxt "#30051" +msgid "%2.0f %%" +msgstr "%2.0f %%" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/settings.xml kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/settings.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.projectm/resources/settings.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.projectm/resources/settings.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/addon.xml kodi-15.2~git20151019.1039-final/addons/visualization.vortex/addon.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/addon.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,62 @@ + + + + + Vortex Visualisasie van die XBOX paket + تصور دوامة من حزمة XBOX + Визуализацията Vortex от пакета за XBOX + Visualització Vortex del paquet d'XBOX + Vizualizace Vortex z balíčku XBOX + Vortex Visualization o becyn XBOX + Vortex visualisering fra XBOX pakken + Vortex Visualisierung aus dem XBOX Paket + Οπτικοποίηση Δίνης από το πακέτο XBOX + Vortex Visualisation from XBOX package + Vortex Visualization from XBOX package + Vortex Visualisation from XBOX package + Vortex Visualization from XBOX package + Visualización Vortex del paquete XBOX + Visualización Vortex del paquete XBOX + Visualización Vortex desde el paquete de XBOX + Vortex visuaal XBOX-i paketist + مجسم ساز Vortex از بسته XBOX. + Vortex-visualisaatiot XBOX-paketista + Visualisation Vortex du paquet XBOX + Visualisation Vortex du Package XBOX + Visualización Vortex do paquete XBOX + חיזוי מערבולת מחבילת XBOX + Vortex vizualizacija iz XBOX paketa + Vortex vizualizáció az XBOX csomagból + Visualisasi Vortex dari paket XBOX + Vortex sjónræn upplifun frá XBOX pakkanum + Visualizzazione vortice dal package XBOX + XBOX パッケージ由来の渦巻きビジュアライザー + XBOX 패키지의 Vortex 시각화 + Vortex vizualicija iš Kodi paketo + Vortex vizualizācija no XBOX pakotnes + Vortex визуелизација од пакетот на XBOX + Pengvisualan Vortex melalui pakej XBOX + Tornado Visualisering fra XBOX pakke + Vortexvisualisatie van XBOX pakket + Wizualizacja Vortex z XBOX + Visualização Vortex do pacote XBOX + Visualização Vortex do pacote XBOX + Vizualizare Vortex din pachetul XBOX + Vortex визуализация из пакета XBOX + Vortex vizualizácia z XBOX balíčku + Vizualizacija Vortex iz paketa XBOX + Vortex Visualization från XBOX-paketet + Таҷассуми Vortex аз бастаи XBOX + การแสดง Vortex จาก XBOX package + XBOX paketinden Vortex Görsel Öğe + Візуалізація Вихору з XBOX пакету + 来自 XBOX 组件包的旋涡可视化效果 + windx + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.af_za/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.af_za/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.af_za/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.af_za/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/kodi-main/language/af_ZA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af_ZA\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Willekeurige voorafinstelling" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tyd Tussen Voorafinstellings" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Addisionele Willekeurige Tyd" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Sluit Voorafinstelling" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Aktiveer Oorgang" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stop eerste voorafinstelling" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Wys RPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Wys ontfout konsole" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Wys klank ontleding" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek." + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f rps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.am_et/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.am_et/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.am_et/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.am_et/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,25 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Amharic (Ethiopia) (http://www.transifex.com/projects/p/kodi-main/language/am_ET/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: am_ET\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ar_sa/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ar_sa/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ar_sa/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ar_sa/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/kodi-main/language/ar_SA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar_SA\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "إعدادات مسبقة عشوائية" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "الزمن بين الإعدادات المسبقة" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "وقت إضافي عشوائي" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "قفل الإعدادات المسبقة" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "تمكين التحويلات" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "ايقاف الإعدادات المسبقة الأولى" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "إظهار عدد اللقطات في الثانية" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "اظهار وحدة التحكم التصحيح" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "اظهار تحليل الصوت" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f الثانية" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.be_by/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.be_by/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.be_by/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.be_by/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Belarusian (Belarus) (http://www.transifex.com/projects/p/kodi-main/language/be_BY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be_BY\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Time Between Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Additional Random Time" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.bg_bg/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.bg_bg/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.bg_bg/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.bg_bg/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/kodi-main/language/bg_BG/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg_BG\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Произволен ред на шаблоните" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Време между отделните шаблони" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Допълнително произволно време" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "\"Заключи\" (спри на) шаблона" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Включи прехода между шаблоните" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Спри първият шаблон" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Покажи FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Покажи дебъг конзолата" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Покажи аудио анализа" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сек" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ca_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ca_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ca_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ca_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Catalan (Spain) (http://www.transifex.com/projects/p/kodi-main/language/ca_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Predefinits aleatoris" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Temps entre predefinits" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Temps aleatori addicional" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Bloqueja predefinit" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Activa les transicions" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Para al primer predefinit" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Mostra els FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Mostra la consola de depuració" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Mostra anàlisi d'audio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.cs_cz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.cs_cz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.cs_cz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.cs_cz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/kodi-main/language/cs_CZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs_CZ\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Náhodné předvolby" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Čas mezi předvolbami" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Dodatečný náhodný čas" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Uzamknout předvolbu" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Povolit překlady" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Zastavit první předvolbu" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Zobrazit FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Zobrazit ladící konzoli" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Zobrazit analýzu zvuku" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.cy_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.cy_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.cy_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.cy_gb/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Welsh (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/cy_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy_GB\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Rhagosodiadau Hap" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Amser Rhwng Rhagosodiadau" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Amser Hap Ychwanegol" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Cloi'r Rhagosodiadau" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Galluogi'r Newidiadau" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Rhwystro'r rhagosodiad cyntaf" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Dangos FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Dangos y consol dadfygio" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Dangos y dadansoddiad sain" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f eil" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f ye" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.da_dk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.da_dk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.da_dk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.da_dk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Danish (Denmark) (http://www.transifex.com/projects/p/kodi-main/language/da_DK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da_DK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Tilfældige forudindstillinger" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tid mellem forudindstillinger" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Ekstra tilfældig tid" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Låse forudindstillinger" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Aktiver transitioner" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stop første forudindstillinger" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Vis FPS " + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Vis debugging konsollen" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Vis audio analyse" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.de_de/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.de_de/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.de_de/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.de_de/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: German (Germany) (http://www.transifex.com/projects/p/kodi-main/language/de_DE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de_DE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Zufällige Voreinstellungen" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Zeit zwischen den Voreinstellungen" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Zusätzliche zufällige Zeit" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Voreinstellung sperren" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Übergänge erlauben" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Erste Voreinstellung anhalten" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Zeige FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Zeige Debug-Konsole" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Zeige Audio-Analyse" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.el_gr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.el_gr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.el_gr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.el_gr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Greek (Greece) (http://www.transifex.com/projects/p/kodi-main/language/el_GR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el_GR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Τυχαίες Προρυθμίσεις" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Χρόνος Μεταξύ Προρυθμίσεων" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Επιπλέον Χρόνος Τυχαίων" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Κλείδωμα Προρύθμισης" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Ενεργοποίηση Μεταβάσεων" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Διακοπή πρώτης προρύθμισης" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Εμφάνιση FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Κονσόλα εντοπισμού σφαλμάτων" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Εμφάνιση ηχητικής ανάλυσης" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f δευτ." + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.en_au/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.en_au/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.en_au/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.en_au/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/kodi-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Random Presets" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Time Between Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Additional Random Time" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Lock Preset" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Enable Transitions" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stop first preset" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Show FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Show debug console" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Show audio analysis" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.en_gb/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.en_gb/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.en_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.en_gb/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,66 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#settings labels + +msgctxt "#30000" +msgid "Random Presets" +msgstr "" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "" + +#empty strings from id 30009 to 30049 +#setting value formats + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.en_nz/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.en_nz/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.en_nz/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.en_nz/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/kodi-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Random Presets" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Time Between Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Additional Random Time" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Lock Preset" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Enable Transitions" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stop first preset" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Show FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Show debug console" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Show audio analysis" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.en_us/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.en_us/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.en_us/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.en_us/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (United States) (http://www.transifex.com/projects/p/kodi-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Random Presets" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Time Between Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Additional Random Time" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Lock Preset" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Enable Transitions" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stop first preset" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Show FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Show debug console" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Show audio analysis" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.es_ar/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.es_ar/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.es_ar/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.es_ar/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/kodi-main/language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Ajustes aleatorios" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tiempo entre presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tiempo aleatorio adicional" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Bloquear ajuste" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Habilitar transiciones" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Detener el primer ajuste" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Mostrar FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Mostrar consola de depuración" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Mostrar análisis de audio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.es_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.es_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.es_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.es_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/kodi-main/language/es_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Preset aleatorio" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tiempo entre Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tiempo aleatorio adicional" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Bloquear Preset" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Activar Transiciones" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Detener en el primer Preset" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Mostrar FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Mostrar consola de depuración" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Mostrar análisis de audio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.es_mx/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.es_mx/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.es_mx/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.es_mx/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/kodi-main/language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Preajustes aleatorios" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tiempo Entre Preajustes" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tiempo Aleatorio Adicional" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Fijar Preajuste" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Habilitar Transiciones" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Detener primer preajuste" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Mostrar FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Mostrar consola de depuración" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Mostrar análisis de audio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f segs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.et_ee/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.et_ee/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.et_ee/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.et_ee/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/kodi-main/language/et_EE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et_EE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Juhuslikud eelseaded" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Eelseadistuste vaheline aeg" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Juhuslik lisaaeg" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Lukusta eelseaded" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Luba üleminekud" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Peate esimene eelseade" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Näita värskenduskiirust" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Näita silumise konsooli" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Näita audio analüüsi" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f s" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.fa_ir/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.fa_ir/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.fa_ir/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.fa_ir/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/kodi-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "پیش تنظیمات اتفاقی" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "زمان بین پیش تنظیمات" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "زمان اتفاقی اضافه" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "پیش تنظیمات مسدود شوند" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "تبدیل نمایه ها مجاز است." + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "اولین پیش تنظیم حفظ شود" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "نمایش نرخ فریم" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "نمایش کنسول اشتباه یابی" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "نمایش آنالیز صوتی" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f ثانیه" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0 فریم در ثانیه" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.fi_fi/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.fi_fi/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.fi_fi/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.fi_fi/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/kodi-main/language/fi_FI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi_FI\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Satunnaiset esiasetukset" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Esiasetusten välinen aika" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Satunnainen lisäaika" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Lukitse esiasetus" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Käytä siirtymiä" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Pysäytä ensimmäinen esiasetus" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Näytä FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Näytä vianjäljityskonsoli" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Näytä äänianalyysi" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f s" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.fr_ca/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.fr_ca/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.fr_ca/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.fr_ca/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/kodi-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Préréglages aléatoires" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Intervalle entre les préréglages" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Temps aléatoire additionnel" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Verrouiller le préréglage" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Transitions activées" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Arrêt au premier préréglage" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Afficher la fréquences d'images" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Afficher la console de débogage" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Afficher l'analyse audio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f s" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f mages-par-seconde" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.fr_fr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.fr_fr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.fr_fr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.fr_fr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: French (France) (http://www.transifex.com/projects/p/kodi-main/language/fr_FR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_FR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Présélections aléatoires" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Intervalle des présélections" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Ajout aléatoire de temps" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Verrouiller la présélection" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Activer les transitions" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Arrêter la première présélection" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Afficher FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Afficher la console de débuggage" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Afficher l'analyse audio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.gl_es/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.gl_es/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.gl_es/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.gl_es/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Galician (Spain) (http://www.transifex.com/projects/p/kodi-main/language/gl_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Preconfiguracións Ó Chou" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tempo entre Preconfiguracións" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tempo ó chou adicional" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Bloquear Preconfiguración" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Activar Transicións" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Deter a primeira Preconfiguración" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Amosar FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Amosar a consola de depuración" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Amosar análises de son" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f seg" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.he_il/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.he_il/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.he_il/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.he_il/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/kodi-main/language/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "קביעונים אקראיים" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "זמן בין קביעונים" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "זמן אקראי נוסף" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "נעיל קביעון" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "אפשר מעברים" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "עצור קביעון ראשון" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "הצג FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "הצג יומן רישום" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "הצג ניתוח קול" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f שניות" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.hr_hr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.hr_hr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.hr_hr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.hr_hr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Croatian (Croatia) (http://www.transifex.com/projects/p/kodi-main/language/hr_HR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr_HR\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Naizmjenični predložci" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Vrijeme između predložka" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Dodatno naizmjenično vrijeme" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Zaključaj predložak" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Omogući prijelaz" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Zaustavi prvi predložak" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Prikaži Sl/Sek" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Prikaži konzolu otklanjanja grešaka" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Prikaži zvučnu analizu" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f sl/sek" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.hu_hu/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.hu_hu/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.hu_hu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.hu_hu/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/kodi-main/language/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Véletlen Beállítások" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Idő a beállításkészletek között" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Többlet véletlen idő" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Beállítások zárolása" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Átfedések engedélyezése" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Első beállítás megállítása" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "FPS mutatása" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Hibakereső konzol mutatása" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Audióvizsgálat mutatása" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f mp" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.id_id/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.id_id/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.id_id/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.id_id/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/kodi-main/language/id_ID/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id_ID\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Preset Acak" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Waktu Antara Presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tambahan Waktu Acak" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Kunci Preset" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Aktifkan Transisi" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stop preset pertama" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Tampilkan FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Tampilkan konsol debug" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Tampilkan analisis audio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f detik" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.is_is/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.is_is/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.is_is/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.is_is/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Icelandic (Iceland) (http://www.transifex.com/projects/p/kodi-main/language/is_IS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is_IS\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Handahófskenndar forstillingar" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tími á milli forstillinga" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Aukalegur slembitími" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Læsa forstillingu" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Virkja Umskipti" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stöðva fyrstu forstillingu" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Sýna ramma á sekúndu" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Sýna villukembunarglugga" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Sýna greiningu hljóðs" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekúndur" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f rammar á sekúndu" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.it_it/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.it_it/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.it_it/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.it_it/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/kodi-main/language/it_IT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it_IT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Presets casuali" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tempo tra i preset" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tempo aggiuntivo casuale" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Blocca preset" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Attiva le transizioni" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Ferma primo preset" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Mostra FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Mostra la console di debug" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Mostra analisi audio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secondi" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ja_jp/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ja_jp/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ja_jp/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ja_jp/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/kodi-main/language/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "ランダムプリセット" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "各プリセットの間隔" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "追加ランダム時間" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "プリセットをロック" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "遷移を利用" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "最初のプリセットを停止" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "FPS を表示" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "デバッグコンソールを表示" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "オーディオ解析を表示" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f秒" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ko_kr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ko_kr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ko_kr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ko_kr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/kodi-main/language/ko_KR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko_KR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "무작위 프리셋" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "프리셋 사이 간격" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "추가적 랜덤 간격" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "프리셋 잠금" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "전환효과 사용" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "첫번째 프리셋 중지" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "FPS 보기" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "디버그 콘솔 보기" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "오디오 분석 보기" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f 초" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.lt_lt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.lt_lt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.lt_lt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.lt_lt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/kodi-main/language/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Atsitiktinė išankstinė parinktis" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Laikas tarp išankstinių parinkčių" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Papildomas atsitiktinis laikas" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Užrakinti išankstinę parinktį" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Įjungti perėjimus" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stabdyti pirmą išankstinę parinktį" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Rodyti FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Rodyti derinimo konsolę" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Rodyti garso analizę" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek." + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.lv_lv/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.lv_lv/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.lv_lv/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.lv_lv/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/kodi-main/language/lv_LV/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv_LV\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Nejaušas sagataves" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Laiks starp sagatavēm" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Papildus nejaušs laiks" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Aizslēgt sagatavi" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Ieslēgt pārejas" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Apturēt pimo sagatavi" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Rādīt FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Rādīt atkļūdošanas konsoli" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Rādīt audio analīzi" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekundes" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.mk_mk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.mk_mk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.mk_mk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.mk_mk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Macedonian (Macedonia) (http://www.transifex.com/projects/p/kodi-main/language/mk_MK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk_MK\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Случајна поставка" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Време помеѓу подесувањата" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Дополнително случајно време" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Заклучи дефиниција" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Овозможи транзиции" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Запри ја првата дефиниција" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Покажи FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Прикажи ја конзолата за дебагирање" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Прикажи ги звучните анализи" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ms_my/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ms_my/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ms_my/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ms_my/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/kodi-main/language/ms_MY/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms_MY\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Praset Rawak" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Masa Diantara Praset" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Masa Rawak Tambahan" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Kunci Praset" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Benarkan Peralihan" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Henti praset pertama" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Tunjuk FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Tunjuk konsol nyahpepijat" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Tunjuk analisis audio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f saat" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.my_mm/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.my_mm/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.my_mm/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.my_mm/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,29 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/kodi-main/language/my_MM/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my_MM\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Preset များအတွင်းကြာချိန်" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.nb_no/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.nb_no/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.nb_no/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.nb_no/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/kodi-main/language/nb_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Tilfeldige Presets" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tid mellom forvalg" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Ytterligere tilfeldig tid" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Låst Preset" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Aktiver Oversettelse " + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stopp første forvalg" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Vis FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Vis feilsøkingskonsoll " + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Vis lyd analyse" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.nl_nl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.nl_nl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.nl_nl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.nl_nl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/kodi-main/language/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Willekeurige Presets" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tijd tussen presets" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Toegevoegde willekeurige tijd" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Preset vastzetten" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Activeer transities" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stop eerste preset" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Toon FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Toon debugconsole" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Toon audioanalyses" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.Van sec." + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.Van fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.pl_pl/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.pl_pl/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.pl_pl/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.pl_pl/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/kodi-main/language/pl_PL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Losowe wzorce wizualizacji" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Częstotliwość zmiany wzorców" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Dodatkowy losowy czas" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Zablokuj wzorzec" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Aktywuj przejścia" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Zatrzymaj pierwszy szablon" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Pokazuj częstotliwość klatek" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Pokazuj konsolę diagnostyczną" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Pokazuj analizę dźwięku " + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek." + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.pt_br/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.pt_br/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.pt_br/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.pt_br/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/kodi-main/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Pré-definidos Randômicos" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tempo entre predefinições" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tempo Randômico Adicional" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Travar Pré-definição" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Ativar Transições" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Interromper primeira pré-definição" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Mostrar FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Apresentar console de depuração" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Apresentar análise de áudio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f segs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.pt_pt/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.pt_pt/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.pt_pt/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.pt_pt/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/kodi-main/language/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Pré-selecões aleatórias" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tempo entre as pré-seleções" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Tempo Aleatório Adicional" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Bloquear Pré-Selecção" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Activar Transições" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Parar primeira pré-selecção" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Exibir frames p/ seg." + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Mostrar consola da depuração" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Exibir análise do áudio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f segundos" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ro_ro/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ro_ro/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ro_ro/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ro_ro/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,49 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Romanian (Romania) (http://www.transifex.com/projects/p/kodi-main/language/ro_RO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro_RO\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Durată între vizualizări predefinite" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Timp aleatoriu adițional" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Activează tranziții" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Arată cadre pe secundă" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Arată consola de depanare" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Arată analiza audio" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sec" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ru_ru/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ru_ru/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ru_ru/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ru_ru/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/kodi-main/language/ru_RU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru_RU\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Случайные настройки" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Время между настройками" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Дополнительное случайное время" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Заблокировать предустановки" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Включить переходы" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Остановить первую предустановку" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Показать FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Показать консоль отладки" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Показать анализ аудио" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f с" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f кадр/с" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.sk_sk/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.sk_sk/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.sk_sk/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.sk_sk/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/kodi-main/language/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Náhodné predvoľby" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Čas medzi predvoľbami" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Pridaný náhodná čas" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Zamknúť predvoľbu" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Zapnúť prechody" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Zastaviť prvú predvľbu" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Zobraziť FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Zobraziť ladiace informácie" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Zobraziť analýzu zvuku" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f secs" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.sl_si/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.sl_si/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.sl_si/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.sl_si/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/kodi-main/language/sl_SI/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl_SI\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Naključne prednastavitve" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Čas med prednastavitvami" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Dodaten naključen čas" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Zakleni prednastavitev" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Omogoči prehode" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Ustavi prvo prednastavitev" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Prikaži FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Prikaži razhroščevalno konzolo" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Prikaži analizo zvoka" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekund" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.sq_al/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.sq_al/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.sq_al/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.sq_al/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Albanian (Albania) (http://www.transifex.com/projects/p/kodi-main/language/sq_AL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq_AL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sekonda" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.sr_rs@latin/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.sr_rs@latin/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.sr_rs@latin/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.sr_rs@latin/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Serbian (Latin) (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS@latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Nasumično" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Dodatno Neodredjeno Vreme" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Omogući animacije" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Prikaži analizu zvuka" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.sv_se/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.sv_se/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.sv_se/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.sv_se/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/kodi-main/language/sv_SE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv_SE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Slumpmässiga förval" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Tid mellan förval" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Extra slumpmässig tid" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Lås förval" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Aktivera övergångar" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Stoppa första förvalet" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Visa FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Visa debugkonsol" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Visa audioanalys" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f sek" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ta_in/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ta_in/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.ta_in/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.ta_in/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/kodi-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f வினாடிகள்" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.tg_tj/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.tg_tj/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.tg_tj/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.tg_tj/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tajik (Tajikistan) (http://www.transifex.com/projects/p/kodi-main/language/tg_TJ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg_TJ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Танзими тасодуфӣ" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Вақт байни интихобҳо" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Вақти тасодуфии иловагӣ" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Танзими қулф" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Фаъол кардани интиқолҳо" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Қатъ кардани танзими аслӣ" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Намоиши FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Намоиш консол бо иттилооти ислоҳи хатоҳо" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Намоиши таҳлили садо" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сония" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f кадр/с" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.th_th/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.th_th/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.th_th/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.th_th/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/kodi-main/language/th_TH/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th_TH\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "สุ่มเวลา" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "ระยะเวลาระหว่างชุดรูปแบบ" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "เวลาสุ่มเพิ่มเติม" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "ล็อคเวลา" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "เปิดการส่งผ่าน" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "หยุดช่วงเวลาแรก" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "แสดง FPS" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "แสดง debug console" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "แสดงการวิเคราะห์เสียง" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f วินาที" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f เฟรมต่อวิ." diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.tr_tr/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.tr_tr/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.tr_tr/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.tr_tr/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/kodi-main/language/tr_TR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr_TR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Rastgele Önayarlar" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Önayarlar Arasındaki Zaman" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "İlave Rastgele Zaman" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Önayarları Kilitle" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Geçişleri Etkinleştir" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "İlk önayarı durdur" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "FPS'yi göster" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Hata ayıklama konsolunu göster" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Ses analizlerini göster" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f saniye" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.uk_ua/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.uk_ua/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.uk_ua/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.uk_ua/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/kodi-main/language/uk_UA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk_UA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "Випадкові набори ефектів" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Тривалість показу одного ефекту" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Додатковий час випадкової тривалості" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "Заблокувати набір ефектів" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "Увімкнути переклади" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "Зупинити перший набір ефектів" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "Показувати кількість кадрів в секунду" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "Показати панель налагодження" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "Показати аудіо аналіз" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f сек" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f кадр/с" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.vi_vn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.vi_vn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.vi_vn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.vi_vn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/kodi-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "Thời gian đổi Preset" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "Thời gian random thêm vào" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f giây" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f hình/s" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.zh_cn/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.zh_cn/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.zh_cn/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.zh_cn/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,61 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/kodi-main/language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Random Presets" +msgstr "随机预置" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "预置切换时间" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "附加随机时间" + +msgctxt "#30003" +msgid "Lock Preset" +msgstr "锁定预置" + +msgctxt "#30004" +msgid "Enable Transitions" +msgstr "允许过渡" + +msgctxt "#30005" +msgid "Stop first preset" +msgstr "停止首个预置" + +msgctxt "#30006" +msgid "Show FPS" +msgstr "显示祯率" + +msgctxt "#30007" +msgid "Show debug console" +msgstr "显示调试控制台" + +msgctxt "#30008" +msgid "Show audio analysis" +msgstr "显示音频分析" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f 秒" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.zh_tw/strings.po kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.zh_tw/strings.po --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/language/resource.language.zh_tw/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/language/resource.language.zh_tw/strings.po 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: Vortex +# Addon id: visualization.vortex +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/kodi-main/language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "Time Between Presets" +msgstr "預置切換時間" + +msgctxt "#30002" +msgid "Additional Random Time" +msgstr "附屬隨機時間" + +msgctxt "#30050" +msgid "%2.0f secs" +msgstr "%2.0f 秒" + +msgctxt "#30051" +msgid "%2.0f fps" +msgstr "%2.0f fps" diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/AlbumArtCubeRain.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/AlbumArtCubeRain.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/AlbumArtCubeRain.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/AlbumArtCubeRain.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,71 @@ +// AlbumArtCubeRain.vtx +// Author - MrC +// Based on CubeRain.r4 by Gordon Williams + +int x,y; +float c,tm,tn,td; +float[] c_x(256),c_y(256),c_z(256),c_vz(256),c_rx(256),c_ry(256),c_sx(256),c_sy(256),c_sz(256); + +float counter; + +void MakeNew(int n) +{ + c_x[n]=c_y[n]=0; + while (Mag(c_x[n],c_y[n])<1) + { + c_x[n] = (Rand()*10.0)-5.0; + c_y[n] = (Rand()*10.0)-5.0; + } + + c_z[n] = 10; + c_vz[n] = (1.0+Rand())*4; + c_rx[n] = (1.0+Rand())*80; + c_ry[n] = (1.0+Rand())*80; + c_sx[n] = (0.5+Rand())*0.5; + c_sy[n] = (0.5+Rand())*0.15; + c_sz[n] = (0.5+Rand())*0.15; +} + +void Init() +{ + counter = 0; + + for (x=0;x<256;x=x+1) + { + MakeNew(x); + c_z[x] = Rand()*10; + } + tm = tn = 0; +} + +void Render() +{ + td = ((TREBLE+1.0f)*TIMEPASS); + tm = tm + td; + tn = tn + ((BASS+1.5)*TIMEPASS*2); + + gfxTranslate(Cos(tn * 1.23f) * 0.5f, Sin(tn) * 0.5f, 0.0f); + gfxRotate(Cos(tn*0.6734f)*20.0f, 1.0f, 0.0f, 0.0f); + gfxRotate(Sin(tn*0.2143f)*20.0f, 0.0f, 1.0f, 0.0f); + + gfxSetTexture(TEXTURE_ALBUMART); + + for (x=0;x<20;x=x+1) + { + c_z[x] = c_z[x] - (td*c_vz[x]); + if (c_z[x]<0) + { + MakeNew(x); + } + + c = Cos(c_z[x]*0.05*3.1416); + gfxColour(c,c,c,1); + gfxPushMatrix(); + gfxTranslate(c_x[x],c_y[x],c_z[x]); + gfxRotate(c_rx[x]*tm, 1, 0, 0); + gfxRotate(c_ry[x]*tm, 0, 1, 0); + gfxCube(-c_sx[x],-c_sx[x],-c_sx[x],c_sx[x],c_sx[x],c_sx[x]); + gfxPopMatrix(); + } + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/AlbumArtCube.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/AlbumArtCube.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/AlbumArtCube.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/AlbumArtCube.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,28 @@ +// AlbumArtCube.vtx +// Author - MrC + +float time = 0; +float rx,rxamt,ry,ryamt; + +void Render() +{ + time += TIMEPASS; + + gfxSetTexture(TEXTURE_ALBUMART); + gfxTranslate(0, 0, 2.0f - (TREBLE * 0.5)); + + if (BASS>0.3) rxamt = 1; + if (BASS<-0.3) rxamt = -1; + if (TREBLE>0.3) ryamt = 1; + if (TREBLE<-0.3) ryamt = -1; + rx = rx + (rxamt*TIMEPASS); + ry = ry + (ryamt*TIMEPASS); + + gfxRotate(-70+(Sin(time)*12),1,0,0); + gfxRotate(rx*90,0,0,1); + gfxRotate(ry*90,0,1,0); + + gfxColour(1, 1, 1, 1); + gfxCube(-0.25f, -0.25f, -0.25f, 0.25f, 0.25f, 0.25f); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/AlbumArtStretch.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/AlbumArtStretch.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/AlbumArtStretch.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/AlbumArtStretch.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,52 @@ +// AlbumArtStretch.vtx +// Author - MrC + +Map map; +float time = 0; + +void Init() +{ + map.SetTimed(); +} + +void Render() +{ + if (BASS > 0) + time += (BASS)* TIMEPASS; + + float myX = Sin(time); + float myY = Cos(time); + + float dx, dy; + + for (int y = 0; y < 24; y++) + { + for (int x = 0; x < 32; x++) + { + dx = x-15.5; + dy = y-11.5; + float mx = dx + myX*10; + float my = dy + myY*10; + + map.SetValues(x,y, mx, my, -2, -2, -2); + } + } + + map.Render(); + gfxSetRenderTarget(map); + + gfxSetTexture(TEXTURE_ALBUMART); + + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + + float x = (MIDDLE + 1) / 2; + float y = (TREBLE+ 1) / 2; + + gfxTexRect(-1 * x, 1 * y, 1 * x, -1 * y); + + gfxSetRenderTarget(0); + gfxSetTexture(map); + + gfxTexRect(-1, 1, 1, -1); +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/AlbumArtWaveSpectrum.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/AlbumArtWaveSpectrum.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/AlbumArtWaveSpectrum.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/AlbumArtWaveSpectrum.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,102 @@ +// AlbumArtWaveSpectum.vtx +// Author : MrC + +float[] vl(256); +int x; +float[] cubeRot(3); +float[] cubePos(3); + +void Init() +{ + for (int i=0; i<9;i++) + { + cubePos[i] = 0.0f; + cubeRot[i] = 0.0f; + } + +} + +void Render() +{ + + gfxSetTexture(TEXTURE_ALBUMART); + + for (int i=0; i<3;i++) + { + cubePos[i] = cubePos[i] + cubeRot[i]; + cubeRot[i] = cubeRot[i] * 0.95; + if (cubeRot[i] > 1) + cubeRot[i] = 1; + if (cubeRot[i] < -1) + cubeRot[i] = -1; + } + + cubeRot[0] += BASS; + cubeRot[1] += MIDDLE; + cubeRot[2] += TREBLE; + + + gfxPushMatrix(); + gfxTranslate(-0.8, 0.25, 2); + + gfxRotate(cubePos[0],1,0,0); + gfxRotate(cubePos[1],0,0,1); + gfxRotate(cubePos[2],0,1,0); + + gfxCube(-0.25f, -0.25f, -0.25f, 0.25f, 0.25f, 0.25f); + gfxPopMatrix(); + + gfxSetTexture(NULL); + + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + + gfxColour(1, 1, 1, 1); + + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x<256; x=x+1) + { + float r = WaveLeft(x); + gfxVertex((x-128) / 256.0f + 0.3, r * 0.2f + 0.5f, 0); + } + gfxEnd(); + + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x<256; x=x+1) + { + float r = WaveRight(x); + gfxVertex((x-128) / 256.0f + 0.3, r * 0.2f + 0.1f, 0); + } + gfxEnd(); + + // calculate spectrum + for (x=0;x<256;x=x+1) + vl[x] = 0; + for (x=0;x<512;x=x+1) + vl[x/2] = vl[x/2] + GetSpecLeft(x)+GetSpecRight(x); + + // now draw spectrum + gfxTranslate(-1,-0.9,0); + gfxBegin(PRIM_QUADLIST); + gfxSetTexture(NULL); + + + for (x = 0; x < 256; x++) + { + vl[x] = vl[x]/8; + if (vl[x]>1.0) vl[x]=1.0; + + + float xPos = x / 128.0f; + + gfxColour(1,0,0,1); + gfxVertex(xPos+(1/128.0f),0,0); + gfxVertex(xPos,0,0); + gfxColour(1,vl[x],0, 1); + gfxVertex(xPos,vl[x]*0.4,0); + gfxVertex(xPos+(1/128.0f),vl[x]*0.4,0); + } + gfxEnd(); + + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/AlbumArtZoomer.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/AlbumArtZoomer.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/AlbumArtZoomer.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/AlbumArtZoomer.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,66 @@ +// AlbumArtZoomer.vtx +// Author - MrC + +float rot; +float zoom; +float dxx,dxy,dyx,dyy; + +float t; +float px = 16; +float py = 12; +float pdx = 1.342; +float pdy = 1; +float basstime = 0; + +void Init() +{ + zoom = 0; + rot=Rand(); + px = 16; + py = 12; + pdx = 1.342; + pdy = 1; + basstime = 0; +} + +void Quad(float rt, float sz) +{ + dxx = Cos(rt)*sz; + dxy = Sin(rt)*sz; + dyx = Sin(rt)*sz; + dyy = 0.0f-Cos(rt)*sz; + + gfxTexCoord((0.0f-dxx)+(0.0f+dyx),(0.0f-dxy)+(0.0f+dyy)); + gfxVertex(-1 * 2,1 * 2,0); + gfxTexCoord((0.0f+dxx)+(0.0f+dyx),(0.0f+dxy)+(0.0f+dyy)); + gfxVertex(1 * 2,1 * 2,0); + gfxTexCoord((0.0f+dxx)+(0.0f-dyx),(0.0f+dxy)+(0.0f-dyy)); + gfxVertex(1 * 2,-1 * 2,0); + gfxTexCoord((0.0f-dxx)+(0.0f-dyx),(0.0f-dxy)+(0.0f-dyy)); + gfxVertex(-1 * 2,-1 * 2,0); +} + +void Render() +{ + zoom += BASS * 2 * TIMEPASS; + rot += TREBLE * 4* TIMEPASS; + + t = TIMEPASS*(BASS+0.25) * 20; + px = px + (pdx*t); + if (px>28) { pdx = -Abs(pdx); px = 28; } + if (px<4) { pdx = Abs(pdx); px = 4; } + py = py + (pdy*t); + if (py>20) { pdy = -Abs(pdy); py=20; } + if (py<4) { pdy = Abs(pdy); py = 4; } + + // draw + gfxSetTexture(TEXTURE_ALBUMART); + gfxSetAspect(0); + gfxTranslate(((px / 28.0f) - 0.5f), (py / 20.0f) - 0.5f, 2.414f); + gfxBegin(PRIM_QUADLIST); + + gfxColour(1.0f, 1.0f, 1.0f, 1); + Quad(Sin(rot),(Fabs(Sin(zoom)) + 0.25)*5); + gfxEnd(); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Awakenings.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Awakenings.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Awakenings.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Awakenings.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,125 @@ +// Awakenings.vtx +// Author - MrC +// Based on Awakenings_remix.r4 by John Baker and Gordon Williams + +int x,y; +float c,tm,tn,td; +float[] c_x(256),c_y(256),c_z(256),c_vz(256),c_rx(256),c_ry(256),c_sx(256),c_sy(256),c_sz(256); +float d; + +Texture envTexture; + +void MakeNew(int n) +{ + c_x[n]=c_y[n]=0; + while (Mag(c_x[n],c_y[n])<1) + { + c_x[n] = (Rand()*8.0)-4.0; + c_y[n] = (Rand()*8.0)-4.0; + } + + c_z[n] = 10; + c_vz[n] = (1.0+Rand())*4; + c_rx[n] = (1.0+Rand())*80; + c_ry[n] = (1.0+Rand())*80; + c_sx[n] = (0.5+Rand())*0.5; + c_sy[n] = (0.5+Rand())*0.5; + c_sz[n] = (0.5+Rand())*0.05; +} + + +void Init() +{ + envTexture.LoadTexture("xbmc_icon.png"); + + for (x=0;x<256;x=x+1) + { + MakeNew(x); + c_z[x] = Rand()*10; + } + tm = tn = 0; +} + +void mything(float x,float y,float z) +{ + gfxBegin(PRIM_QUADLIST); + gfxTexCoord(0,0); + gfxVertex(-x,y,0); + gfxTexCoord(1,0); + gfxVertex(x,y,0); + gfxTexCoord(1,1); + gfxVertex(x,-y,0); + gfxTexCoord(0,1); + gfxVertex(-x,-y,0); + + gfxTexCoord(0,0); + gfxVertex(-x,0,z); + gfxTexCoord(1,0); + gfxVertex(x,0,z); + gfxTexCoord(1,1); + gfxVertex(x,0,-z); + gfxTexCoord(0,1); + gfxVertex(-x,0,-z); + + gfxTexCoord(0,0); + gfxVertex(0,-y,z); + gfxTexCoord(1,0); + gfxVertex(0,y,z); + gfxTexCoord(1,1); + gfxVertex(0,y,-z); + gfxTexCoord(0,1); + gfxVertex(0,-y,-z); + gfxEnd(); +} + +void Render() +{ + td = ((TREBLE+1.5f) * TIMEPASS); + tm = tm + td; + tn = tn + ((BASS+1.0) * TIMEPASS * 2); + + gfxTranslate(Cos(tn * 1.23f) * 0.25f, Sin(tn) * 0.25f, 0.0f); + gfxRotate(Cos(tn*0.6734f)*20.0f, 1.0f, 0.0f, 0.0f); + gfxRotate(Sin(tn*0.2143f)*20.0f, 0.0f, 1.0f, 0.0f); + + gfxSetBlendMode(BLEND_MOD); + gfxSetTexture(envTexture); + gfxTranslate(0, 0, 3+BASS); + gfxBegin(PRIM_QUADLIST); + gfxTexCoord(0, 0); + gfxVertex(-1.5, 1,0); + gfxTexCoord(1, 0); + gfxVertex(1.5, 1,0); + gfxTexCoord(1, 1); + gfxVertex(1.5, -1,0); + gfxTexCoord(0, 1); + gfxVertex(-1.5, -1,0); + gfxEnd(); + gfxTranslate(0, 0, -3-BASS); + + gfxSetTexture(envTexture); + gfxSetBlendMode(BLEND_ADD); + + for (x=255;x>0;x=x-1) + { + c_z[x] = c_z[x] - (td*c_vz[x]); + if (c_z[x]<0) MakeNew(x); + + c = (5.0-(c_z[x]*0.5))*0.1; + if (c>1.75) c=(2-c)*4; + if (c>1) c=1; + + d = (20.0-(c_z[x]*2.0))*0.1; + if (d>1.75) d=(2-c)*4; + if (d>1) c=1; + + gfxColour(c,d*(TREBLE+1)*0.5,c,1); + gfxPushMatrix(); + gfxTranslate(c_x[x],c_y[x],c_z[x]); + gfxRotate(c_rx[x]*tm,1.0f,0.0f,0.0f); + gfxRotate(c_ry[x]*tm,0.0f,1.0f,0.0f); + mything(c_sx[x],c_sy[x],c_sz[x]); + gfxPopMatrix(); + } + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Block.tra kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Block.tra --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Block.tra 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Block.tra 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,88 @@ +// Block.tra +// Author - MrC +// Based on FadeBlocks.r4 by Gordon Williams + +int i,x,y; +float dx,dy,sx,sy,dd,a,b,mytime; +float[] d(64); +Texture mix; + +void Init() +{ + mix.CreateTexture(); + for (x=0;x<64;x=x+1) + d[x] = Rand()-0.5; + mytime = 0; +} + +void Rect(float x0, float y0, float x1, float y1) +{ + gfxBegin(PRIM_QUADLIST); + + gfxTexCoord(0,1); + gfxVertex(x0, y0, 0.0); + gfxTexCoord(1, 1); + gfxVertex(x1, y0, 0.0); + gfxTexCoord(1, 0); + gfxVertex(x1, y1, 0.0); + gfxTexCoord(0, 0); + gfxVertex(x0, y1, 0.0); + + gfxEnd(); + +} +void Render() +{ + mytime = mytime + (TIMEPASS*0.25); + FINISHED = mytime>=1.0; + b = (1.0-Cos(mytime*3.14159))*0.5; + + + gfxSetRenderTarget(mix); + gfxClear(0); + gfxSetAspect(0); + a = -2.414; + gfxTranslate(0, 0, -a); + gfxSetBlendMode(BLEND_MOD); + gfxColour(1, 1, 1, 1-b); + gfxSetTexture(TEXTURE_CURRPRESET); + gfxTexRect(-1, 1, 1, -1); + gfxColour(1, 1, 1, b); + gfxSetTexture(TEXTURE_NEXTPRESET); + gfxTexRect(-1, -1, 1, 1); + + gfxSetRenderTarget(TEXTURE_FRAMEBUFFER); + gfxSetBlendMode(BLEND_OFF); + + + gfxSetAspect((1.0-Cos(b*3.14159*2.0))*0.5); + + gfxRotate(b*180, 0, 1, 0); + gfxRotate(b*180, 0, 0, 1); + gfxColour(1, 1, 1, 1); + + gfxSetTexture(mix); + + gfxBegin(PRIM_QUADLIST); + + for (i=0;i<64;i=i+1) + { + x = i%8; + y = i/8; + dx = (x/8.0); + dy = (y/8.0); + sx = ((x+1.0)/8.0); + sy = ((y+1.0)/8.0); + dd = 0.83*(a-((0.5-b)*2*d[i])); + gfxTexCoord(1.0-dx,dy); + gfxVertex(dd*(dx-0.5),dd*(dy-0.5),d[i]); + gfxTexCoord(1.0-sx,dy); + gfxVertex(dd*(sx-0.5),dd*(dy-0.5),d[i]); + gfxTexCoord(1.0-sx,sy); + gfxVertex(dd*(sx-0.5),dd*(sy-0.5),d[i]); + gfxTexCoord(1.0-dx,sy); + gfxVertex(dd*(dx-0.5),dd*(sy-0.5),d[i]); + } + gfxEnd(); + +} diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/ChessMania.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/ChessMania.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/ChessMania.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/ChessMania.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,90 @@ +// ChessMania.vtx +// Author - MrC +// Based on Rovastar - Chessmania.r4 by John Baker + +Texture checker; +Texture tex1; +Texture tex2; + +float[] cubeRot(3*3); +float[] cubePos(3*3); + +void Init() +{ + checker.LoadTexture("checker.png"); + tex1.CreateTexture(); + tex2.CreateTexture(); + + for (int i=0; i<9;i++) + { + cubePos[i] = 0.0f; + cubeRot[i] = 0.0f; + } + +} + +void RenderCube(int cube, float dist) +{ + gfxPushMatrix(); + gfxTranslate(0, 0, dist); + + gfxRotate(cubePos[0+cube*3],1,0,0); + gfxRotate(cubePos[1+cube*3],0,0,1); + gfxRotate(cubePos[2+cube*3],0,1,0); + + gfxCube(-0.25f, -0.25f, -0.25f, 0.25f, 0.25f, 0.25f); + gfxPopMatrix(); +} + +void Render() +{ + gfxSetTexture(checker); + + gfxTranslate(0,0,2.414); + + for (int i=0; i<9;i++) + { + cubePos[i] = cubePos[i] + cubeRot[i]; + cubeRot[i] = cubeRot[i] * 0.95; + if (cubeRot[i] > 1) + cubeRot[i] = 1; + if (cubeRot[i] < -1) + cubeRot[i] = -1; + } + + cubeRot[0] += BASS; + cubeRot[1] += MIDDLE; + cubeRot[2] += TREBLE; + + cubeRot[4] += BASS; + cubeRot[5] += MIDDLE; + cubeRot[3] += TREBLE; + + cubeRot[8] += BASS; + cubeRot[6] += MIDDLE; + cubeRot[7] += TREBLE; + + gfxSetRenderTarget(tex1); + gfxClear(0); + gfxSetTexture(checker); + gfxSetAspect(0); + gfxTexRect(-1, -1, 1, 1); + RenderCube(2, -1.0); + + gfxSetRenderTarget(tex2); + gfxClear(0); + gfxSetTexture(checker); + gfxSetAspect(0); + gfxTexRect(-1, -1, 1, 1); + gfxSetTexture(tex1); + RenderCube(1, -1.0); + + gfxSetRenderTarget(TEXTURE_FRAMEBUFFER); + gfxSetTexture(checker); + gfxSetAspect(0); + gfxTexRect(-1, -1, 1, 1); + gfxSetTexture(tex2); + gfxSetAspect(1); + RenderCube(0, -1.15); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/CubeBlowOut.tra kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/CubeBlowOut.tra --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/CubeBlowOut.tra 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/CubeBlowOut.tra 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,160 @@ +// CubeBlowOut.tra +// Author - MrC +// Based on FadeCubeBlowOut.r4 by Gordon Williams + +int x,y; +float c,tm,td,ftime,fric; +float[] c_tx(64),c_ty(64),c_x(64),c_y(64),c_z(64),c_vx(64),c_vy(64),c_vz(64),c_rx(64),c_ry(64); +const float dx = 0.125; +const float dy = 0.125; + +void Init() +{ + reset(); +} + +void makenew(int n) +{ + c_tx[n]=(n%8)/8.0; + c_ty[n]=(n-(n%8))/64.0; + c_x[n] = (c_tx[n]-0.5)*2+dx; + c_y[n] = (c_ty[n]-0.5)*2+dy; + c_z[n] = 0; + c_vx[n] = (c_x[n]+Rand()-0.5); + c_vy[n] = (c_y[n]+Rand()); + c_vz[n] = (1.0+Rand()); + c_rx[n] = (1.0+Rand())*160; + c_ry[n] = (1.0+Rand())*160; +} + +void drawcube(int n) +{ + gfxBegin(PRIM_QUADLIST); + // FRONT FACE + gfxTexCoord(c_tx[n],c_ty[n]); + gfxVertex(-1,-1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(1,-1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(1,1,-1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(-1,1,-1); + // BACK + gfxTexCoord(c_tx[n],1-(c_ty[n])); + gfxVertex(-1,-1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(1,-1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(1,1,1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(-1,1,1); + // LEFT + gfxTexCoord(c_tx[n],1-(c_ty[n])); + gfxVertex(-1,-1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(-1,-1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(-1,1,1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(-1,1,-1); + // RIGHT + gfxTexCoord(c_tx[n],1-(c_ty[n])); + gfxVertex(1,-1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(1,-1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(1,1,1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(1,1,-1); + // UP + gfxTexCoord(c_tx[n],1-(c_ty[n])); + gfxVertex(1,-1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(1,-1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(-1,-1,1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(-1,-1,-1); + // DOWN + gfxTexCoord(c_tx[n],1-(c_ty[n])); + gfxVertex(1,1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(1,1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(-1,1,1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(-1,1,-1); + + gfxEnd(); +} + +void reset() +{ + for (x=0;x<64;x=x+1) + { + makenew(x); + } + tm = 0; + ftime = 0; +} + +void Render() +{ + gfxPushMatrix(); + gfxTranslate(0, 0, 2.414); + gfxSetAspect(0); + gfxSetTexture(TEXTURE_NEXTPRESET); + gfxColour(1, 1, 1, 1); + gfxTexRect(-1, 1, 1, -1); + gfxPopMatrix(); + gfxSetAspect(1); + gfxSetTexture(TEXTURE_CURRPRESET); + + + if (ftime<0.1) + td = TIMEPASS*(ftime*10); + else + td = TIMEPASS; + tm = tm+td; + + ftime = ftime + (TIMEPASS*0.225); + if (ftime>0.6) + { + ftime=1; + FINISHED = true; + return; + } + + gfxPushMatrix(); + + gfxSetAspect(0); + gfxScale(-1,1,1); + gfxTranslate(0,0,2.414); + gfxTranslate(0,0,-dx); + gfxRotate(180,0,1,0); + + fric = Pow(0.75,td); + + for (x=0;x<64;x=x+1) + { + c_vy[x] = c_vy[x] - (td*2); + c_x[x] = c_x[x] + (td*c_vx[x]); + c_y[x] = c_y[x] + (td*c_vy[x]); + c_z[x] = c_z[x] + (td*c_vz[x]); + c_vx[x] = c_vx[x]*fric; + c_vy[x] = c_vy[x]*fric; + c_vz[x] = c_vz[x]*fric; + + gfxPushMatrix(); + gfxTranslate(c_x[x],c_y[x],c_z[x]); + gfxRotate(c_rx[x]*tm,1,0,0); + gfxRotate(c_ry[x]*tm,0,1,0); + gfxScale(dx,dx,dx); + drawcube(x); + + gfxPopMatrix(); + + } + + gfxPopMatrix(); +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/CubeGridStrobe.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/CubeGridStrobe.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/CubeGridStrobe.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/CubeGridStrobe.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,74 @@ +// CubeGridStrobe.vtx +// Author - Pike +// Based on CubeGrid.r4 by Gordon Williams + +int x,y,z; +float t,c; +float bt,bs; +float time; + +const int XMAX = 3; +const int YMAX = 3; +const int ZMAX = 5; + +Texture envTexture; +Texture envTexture1; + +void Init() +{ + t = 0; + bt = 0; + bs = 0; + time = 0; + envTexture.LoadTexture("env2.jpg"); + envTexture1.LoadTexture("env3_darker.png"); +} + +void Render() +{ + bt = bt + (TIMEPASS*(MIDDLE+0.5f)); + bs = bs + (TIMEPASS*(TREBLE+0.5f)); + t = t + (TIMEPASS*2.5); + while (t>1.0) + { + t=t-1.0; + } + + time = time + TIMEPASS; + + gfxRotate(time*60.0f, 0.0f, 0.0f, 1.0f); + gfxRotate(bt*53.0f, 1.0f, 0.0f, 1.0f); + gfxRotate(bs*62.0f, 0.0f, 1.0f, 0.0f); + + if (TREBLE > 0.5) + gfxSetEnvTexture(envTexture); + else + gfxSetEnvTexture(envTexture1); + + gfxTranslate(-XMAX*0.5f, -YMAX*0.5f, -3.0f+t); + for (z=0;z<=ZMAX;z=z+1) + { + c=1; + if (z==0) + c = t; + if (z==ZMAX) + c = 1.0f - t; + gfxColour(c,c,c,1); + for (y=0;y<=YMAX;y=y+1) + { + for (x=0;x<=XMAX;x=x+1) + { + gfxCube(x-0.15f, y-0.15f, z-0.15f, x+0.15f, y+0.15f, z+0.15f); + if (x1.0) + { + t=t-1.0; + } + + time = time + TIMEPASS; + + gfxRotate(time*60.0f, 0.0f, 0.0f, 1.0f); + gfxRotate(bt*53.0f, 1.0f, 0.0f, 1.0f); + gfxRotate(bs*62.0f, 0.0f, 1.0f, 0.0f); + + gfxSetEnvTexture(envTexture); + + gfxTranslate(-XMAX*0.5f, -YMAX*0.5f, -3.0f+t); + for (z=0;z<=ZMAX;z=z+1) + { + c=1; + if (z==0) + c = t; + if (z==ZMAX) + c = 1.0f - t; + gfxColour(c,c,c,1); + for (y=0;y<=YMAX;y=y+1) + { + for (x=0;x<=XMAX;x=x+1) + { + gfxCube(x-0.15f, y-0.15f, z-0.15f, x+0.15f, y+0.15f, z+0.15f); + if (x1.0) + { + t=t-1.0; + } + + time = time + TIMEPASS; + + gfxRotate(time*60.0f, 0.0f, 0.0f, 1.0f); + gfxRotate(bt*53.0f, 1.0f, 0.0f, 1.0f); + gfxRotate(bs*62.0f, 0.0f, 1.0f, 0.0f); + + if (TREBLE < 0.5) + { + gfxSetTexture(NULL); + gfxSetFillMode(FILLMODE_WIREFRAME); + } + else + gfxSetEnvTexture(envTexture); + + gfxTranslate(-XMAX*0.5f, -YMAX*0.5f, -3.0f+t); + for (z=0;z<=ZMAX;z=z+1) + { + c=1; + if (z==0) + c = t; + if (z==ZMAX) + c = 1.0f - t; + gfxColour(c,c,c,1); + for (y=0;y<=YMAX;y=y+1) + { + for (x=0;x<=XMAX;x=x+1) + { + gfxCube(x-0.15f, y-0.15f, z-0.15f, x+0.15f, y+0.15f, z+0.15f); + if (x 0.0) + tm = tm + ((TREBLE) * TIMEPASS * 20); + + while (tm>1) + { + tm = tm-1; + ofs = ofs + 1; + } + + tn = tn + ((BASS+1.5)*TIMEPASS); + + + gfxSetAspect(0); + gfxLookAt(Cos(tn*1.23)*5,Sin(tn)*5,(tm*2)-1,Cos(tn*0.6734)*2,Sin(tn*0.2143)*2,(tm*2)+8,0,1,0); + gfxRotate(-tiltfunc(0)*tm,0,0,1); + + gfxSetTexture(skybox); + gfxPushMatrix(); + gfxTranslate(0,0,tm*2); + gfxRotate(tiltfunc(0)*tm,0,0,1); + gfxCube(-400,-400,-400,400,400,400); + gfxPopMatrix(); + gfxSetTexture(env); + + gfxSetBlendMode(BLEND_ADD); + + for (y=0;y<15;y=y+1) + { + c = 1.0 - ((y-tm)/15.0); + for (x=-3;x<4;x=x+1) + { + gfxColour(c,c,c,1); + gfxCube((x*2)-0.75,-0.375,(y*2)-0.75, (x*2)+0.75,0.375,(y*2)+0.75); + } + gfxRotate(tiltfunc(y),0,0,1); + } + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Cubes.tra kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Cubes.tra --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Cubes.tra 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Cubes.tra 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,162 @@ +// Cube.tra +// Author - MrC +// Based on FadeCube.r4 By Gordon Williams + +int x,y; +float c,tm,td,ftime,fric; +float[] c_tx(64),c_ty(64),c_x(64),c_y(64),c_z(64),c_vx(64),c_vy(64),c_vz(64),c_rx(64),c_ry(64); +const float dx = 0.125; +const float dy = 0.125; + +void Init() +{ + reset(); +} + +void makenew(int n) +{ + c_tx[n]=(n%8)/8.0; + c_ty[n]=(n-(n%8))/64.0; + c_x[n] = (c_tx[n]-0.5)*2+dx; + c_y[n] = (c_ty[n]-0.5)*2+dy; + c_z[n] = 0; + c_vx[n] = (c_x[n]+Rand()-0.5); + c_vy[n] = (c_y[n]+Rand()); + c_vz[n] = -(1.0+Rand()); + c_rx[n] = (1.0+Rand())*160; + c_ry[n] = (1.0+Rand())*160; +} + +void drawcube(int n) +{ + gfxBegin(PRIM_QUADLIST); + // FRONT FACE + gfxTexCoord(c_tx[n],c_ty[n]); + gfxVertex(-1,-1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(1,-1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(1,1,-1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(-1,1,-1); + // BACK + gfxTexCoord(c_tx[n],1-(c_ty[n])); + gfxVertex(-1,-1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(1,-1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(1,1,1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(-1,1,1); + // LEFT + gfxTexCoord(c_tx[n],1-(c_ty[n])); + gfxVertex(-1,-1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(-1,-1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(-1,1,1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(-1,1,-1); + // RIGHT + gfxTexCoord(c_tx[n],1-(c_ty[n])); + gfxVertex(1,-1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(1,-1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(1,1,1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(1,1,-1); + // UP + gfxTexCoord(c_tx[n],1-(c_ty[n])); + gfxVertex(1,-1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(1,-1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(-1,-1,1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(-1,-1,-1); + // DOWN + gfxTexCoord(c_tx[n],1-(c_ty[n])); + gfxVertex(1,1,-1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n])); + gfxVertex(1,1,1); + gfxTexCoord(c_tx[n]+dx,1-(c_ty[n]+dy)); + gfxVertex(-1,1,1); + gfxTexCoord(c_tx[n],1-(c_ty[n]+dy)); + gfxVertex(-1,1,-1); + + gfxEnd(); +} + +void reset() +{ + for (x=0;x<64;x=x+1) + { + makenew(x); + } + tm = 0; + ftime = 0; +} + +void Render() +{ + gfxPushMatrix(); + gfxTranslate(0, 0, 2.414); + gfxSetAspect(0); + gfxSetTexture(TEXTURE_NEXTPRESET); + gfxColour(1, 1, 1, 1); + gfxTexRect(-1, 1, 1, -1); + gfxPopMatrix(); + gfxSetAspect(1); + gfxSetTexture(TEXTURE_CURRPRESET); + + if (ftime<0.1) + td = TIMEPASS*(ftime*10); + else + td = TIMEPASS; + tm = tm+td; + + ftime = ftime + (TIMEPASS*0.225); + if (ftime>1) + { + ftime=1; + FINISHED = true; + return; + } + + gfxPushMatrix(); + + gfxSetAspect(0); + gfxScale(-1,1,1); + gfxTranslate(0,0,2.414); + gfxTranslate(0,0,dx); + + gfxRotate(180,0,1,0); + + + fric = Pow(0.75,td); + + + for (x=0;x<64;x=x+1) + { + c_vy[x] = c_vy[x] - (td*2); + c_x[x] = c_x[x] + (td*c_vx[x]); + c_y[x] = c_y[x] + (td*c_vy[x]); + c_z[x] = c_z[x] + (td*c_vz[x]); + c_vx[x] = c_vx[x]*fric; + c_vy[x] = c_vy[x]*fric; + c_vz[x] = c_vz[x]*fric; + + gfxPushMatrix(); + gfxTranslate(c_x[x],c_y[x],c_z[x]); + gfxRotate(c_rx[x]*tm,1,0,0); + gfxRotate(c_ry[x]*tm,0,1,0); + gfxScale(dx,dx,dx); + drawcube(x); + + gfxPopMatrix(); + + } + + gfxPopMatrix(); +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/CubeTunnel.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/CubeTunnel.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/CubeTunnel.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/CubeTunnel.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,66 @@ +// CubeTunnel.vtx +// Author - MrC +// Based on CubeTunnel.r4 By Gordon Williams + +Texture texture; +Texture sky; + +int x,y; +float tm,tn,ofs,c,ox,oy,stretch; + +void Init() +{ + sky.LoadTexture("skybox.dds"); + texture.LoadTexture("plasma_edge.jpg"); + + tm = 0; + tn = 0; +} + +float tiltfunc(float p) +{ + float a = (Sin((ofs+p)*0.1) + Cos((ofs+p)*0.423))*15.0; + return a; +} + +void Render() +{ + tm = tm + ((TREBLE+1.5)*TIMEPASS*8); + while (tm>1) + { + tm = tm-1; + ofs = ofs + 1; + } + + + tn = tn + ((BASS+1.5)*TIMEPASS); + + stretch = 3.5+(Sin(tn*1.23)*2); + + gfxSetAspect(0); + gfxLookAt(Cos(tn*1.23)*2.5, Sin(tn)*2.5,(tm*stretch)-1,Cos(tn*0.6734)*2,Sin(tn*0.2143)*2,(tm*stretch)+6,0.0,1.0,0.0); + gfxRotate(-tiltfunc(0)*tm,0,0,1); + + gfxSetTexture(sky); + gfxPushMatrix(); + gfxTranslate(0, 0, tm*stretch); + gfxRotate(tiltfunc(0)*tm,0,0,1); + gfxCube(-400,-400,-400,400,400,400); + gfxPopMatrix(); + + gfxSetTexture(texture); + + gfxSetBlendMode(BLEND_ADD); + for (y=0;y<15;y=y+1) + { + c = 1.0 - ((y-tm)/15.0); + for (x=0;x<8;x=x+1) + { + gfxColour(c,c,c,1); + ox = Sin(x*3.14159*0.25)*5; + oy = Cos(x*3.14159*0.25)*5; + gfxCube(ox-0.75,oy-0.75,(y*stretch)-(0.75*stretch), 0.75+ox,oy+0.75,(y*stretch)+(0.75*stretch)); + } + gfxRotate(tiltfunc(y),0,0,1); + } +} diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/DynamicCubeTunnel.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/DynamicCubeTunnel.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/DynamicCubeTunnel.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/DynamicCubeTunnel.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,176 @@ +// DynamicCubeTunnel.vtx +// Author - MrC +// Based on DynamicCubeTunnel.r4 by Gordon Williams + +Texture env; +Texture skybox; +Map map; + + +int x,y; +float tm,tn,ofs,c; +float btime,ctime; +float[] v(32*24),o(32*24),va(32*24),oa(32*24); +float[] pv(4),po(4); +int sx,sy,i; +float wa,txa,txb,tya,tyb; + + +void Init() +{ + skybox.LoadTexture("skybox.dds"); + env.LoadTexture("huemap.jpg"); + map.SetTimed(); + reset(); +} + +void reset() +{ + tm = 0; + tn = 0; + btime = 0; + ctime = 0; + + for (sy=0;sy<24;sy=sy+1) + { + for (sx=0;sx<32;sx=sx+1) + { + v[sy*32 + sx] = Rand()+1.0; + o[sy*32 + sx] = Rand()*6.3; + va[sy*32 + sx] = (Rand()+1.0)*3.0; + oa[sy*32 + sx] = Rand()*6.3; + } + } + + + for (i=0;i<4;i=i+1) + { + pv[i] = Rand()+1.0; + po[i] = Rand()*6.3; + } + +} + +float tiltfunc(float p) +{ + return (Sin((ofs+p)*0.1)+Cos((ofs+p)*0.123))*10.0; +} + +void Render() +{ + + btime = btime + (TIMEPASS*(TREBLE+0.5)*2.0); + ctime = ctime + (TIMEPASS*(BASS+0.5)*0.5); + + for (sy=0;sy<24;sy=sy+1) + for (sx=0;sx<32;sx=sx+1) + { + float tu = ((sx-15.5)/16) + Sin(oa[sy * 32 + sx] + (va[sy * 32 + sx]*btime)); + float tv = ((sy-11.5)/12) + Sin(o[sy * 32 + sx] + (v[sy * 32 + sx]*btime)); + map.SetValues(sx, sy, tu, tv, -1.5, -1.5, -1.5); + } + + map.Render(); + + gfxPushMatrix(); + gfxSetAspect(0); + gfxTranslate(0,0,2.414); + + gfxSetTexture(env); + gfxSetBlendMode(BLEND_MOD); + + gfxSetRenderTarget(map); + + txa = (Sin(po[0]+(ctime*pv[0]))*2.0); + tya = (Sin(po[1]+(ctime*pv[1]))*2.0); + txb = (Sin(po[2]+(ctime*pv[2]))*2.0); + tyb = (Sin(po[3]+(ctime*pv[3]))*2.0); + + gfxBegin(PRIM_QUADLIST); + // bottom + gfxColour(1,1,1,0); + gfxTexCoord(txa,tya); + gfxVertex(-1,-0.9,0); + gfxTexCoord(txb,tyb); + gfxVertex(1,-0.9,0); + gfxColour(1,1,1,1); + gfxTexCoord(txb,tyb); + gfxVertex(1,-1.0,0); + gfxTexCoord(txa,tya); + gfxVertex(-1,-1.0,0); + + // top + gfxColour(1,1,1,0); + gfxTexCoord(txa,tya); + gfxVertex(-1,0.9,0); + gfxTexCoord(txb,tyb); + gfxVertex(1,0.9,0); + gfxColour(1,1,1,1); + gfxTexCoord(txb,tyb); + gfxVertex(1,1.0,0); + gfxTexCoord(txa,tya); + gfxVertex(-1,1.0,0); + + // left + gfxColour(1,1,1,0); + gfxTexCoord(txa,tya); + gfxVertex(-0.9,-1,0); + gfxTexCoord(txb,tyb); + gfxVertex(-0.9,1,0); + gfxColour(1,1,1,1); + gfxTexCoord(txb,tyb); + gfxVertex(-1,1,0); + gfxTexCoord(txa,tya); + gfxVertex(-1,-1,0); + + // right + gfxColour(1,1,1,0); + gfxTexCoord(txa,tya); + gfxVertex(0.9,-1,0); + gfxTexCoord(txb,tyb); + gfxVertex(0.9,1,0); + gfxColour(1,1,1,1); + gfxTexCoord(txb,tyb); + gfxVertex(1,1,0); + gfxTexCoord(txa,tya); + gfxVertex(1,-1,0); + gfxEnd(); + + gfxSetRenderTarget(0); + gfxSetTexture(map); + gfxPopMatrix(); + + + tm = tm + ((TREBLE+1.5)*TIMEPASS*8); + while (tm>1) + { + tm = tm-1; + ofs = ofs + 1; + } + + tn = tn + ((BASS+1.5)*TIMEPASS); + + gfxSetAspect(0); + gfxLookAt(Cos(tn*1.23)*3.5,Sin(tn)*3.5,(tm*2)-1,Cos(tn*0.6734)*2,Sin(tn*0.2143)*2,(tm*2)+8,0,1,0); + gfxRotate(-tiltfunc(0)*tm,0,0,1); + gfxSetTexture(skybox); + gfxPushMatrix(); + gfxTranslate(0,0,tm*2); + gfxRotate(tiltfunc(0)*tm,0,0,1); + gfxCube(-400,-400,-400,400,400,400); + gfxPopMatrix(); + gfxSetTexture(map); + + gfxSetBlendMode(BLEND_ADD); + + for (y=0;y<15;y=y+1) + { + c = 1.0 - ((y-tm)/15.0); + gfxColour(c,c,c,1); + gfxCube(-4,-4,(y*2)-0.75, 4,-4.5,(y*2)+0.75); + gfxCube(-4,4,(y*2)-0.75, 4,4.5,(y*2)+0.75); + gfxCube(-4,-4,(y*2)-0.75, -4.5,4,(y*2)+0.75); + gfxCube(4,-4,(y*2)-0.75, 4.5,4,(y*2)+0.75); + gfxRotate(tiltfunc(y),0,0,1); + } +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/FlipBoth.tra kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/FlipBoth.tra --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/FlipBoth.tra 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/FlipBoth.tra 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,54 @@ +// FlipBoth.tra +// Author - MrC +// Based on FadeFlipBoth.r4 by Gordon Williams +float myTime = 0; +float d; + +void Init() +{ + +} + +void Rect(float x0, float y0, float x1, float y1) +{ + gfxBegin(PRIM_QUADLIST); + + gfxTexCoord(0,1); + gfxVertex(x0, y0, 0.0); + gfxTexCoord(1, 1); + gfxVertex(x1, y0, 0.0); + gfxTexCoord(1, 0); + gfxVertex(x1, y1, 0.0); + gfxTexCoord(0, 0); + gfxVertex(x0, y1, 0.0); + + gfxEnd(); + +} +void Render() +{ + myTime = myTime + (TIMEPASS/1.5); + + FINISHED = myTime>=1.0; + + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + + d = 0.0-Cos(myTime*3.14159); + + gfxSetTexture(TEXTURE_CURRPRESET); + gfxSetBlendMode(BLEND_ADD); + gfxColour(1, 1, 1, 0.25); + + Rect(-1.0, -1.0, 0.0 - d, 1.0); + Rect(d, -1.0, 1.0, 1.0); + Rect(-1.0, -1.0, 1.0, 0 - d); + Rect(-1.0, d, 1.0, 1.0); + + gfxSetTexture(TEXTURE_NEXTPRESET); + Rect(0.0 - d, -1.0, 1.0, 1.0); + Rect(-1.0, -1.0, d, 1.0); + Rect(-1.0, 0.0 - d, 1.0, 1.0); + Rect(-1.0, -1.0, 1.0, d); + +} diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/HamsterMatic.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/HamsterMatic.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/HamsterMatic.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/HamsterMatic.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,104 @@ +// HamsterMatic.vtx +// Author - MrC +// Based on HamsterMatic.r4 by Gordon Williams + +Texture tex; +float btime; +float[] rot(8); +float[] rots(8); +int x; +float dxx,dxy,dyx,dyy; +// colours +float ar,ag,ab,br,bg,bb; +float colamt,coltime; + +void Init() +{ + int id = Rand() * 3; + if (id == 0) + tex.LoadTexture("Alien.png"); + else if (id == 1) + tex.LoadTexture("Smiley.png"); + else + tex.LoadTexture("skull.png"); + + btime = 0; + for (x=0;x<8;x=x+1) + { + rot[x]=Rand(); + rots[x]=Rand()+1.0f; + } + colamt = 1; + br = 0.0; + bg = 0.0; + bb = 0.5; + coltime = 1+(Rand()*5); +} + +void quad(float rt, float sz) +{ + dxx = Cos(rt)*sz; + dxy = Sin(rt)*sz; + dyx = Sin(rt)*sz; + dyy = 0.0f-Cos(rt)*sz; + + gfxTexCoord((0.0f-dxx)+(0.0f+dyx),(0.0f-dxy)+(0.0f+dyy)); + gfxVertex(1.0,-1,0); + gfxTexCoord((0.0f+dxx)+(0.0f+dyx),(0.0f+dxy)+(0.0f+dyy)); + gfxVertex(-1.0,-1,0); + gfxTexCoord((0.0f+dxx)+(0.0f-dyx),(0.0f+dxy)+(0.0f-dyy)); + gfxVertex(-1.0,1,0); + gfxTexCoord((0.0f-dxx)+(0.0f-dyx),(0.0f-dxy)+(0.0f-dyy)); + gfxVertex(1.0,1,0); +} + +void Render() +{ + gfxSetBlendMode(BLEND_MOD); + + // keep moving + btime = btime + TIMEPASS; + while (btime>1) + { + btime = btime - 1; + for (x=6;x>=0;x=x-1) + { + rot[x+1]=rot[x]; + rots[x+1]=rots[x]; + } + rot[0] = 0; + rots[0] = Rand()+1.0f; + } + + coltime = coltime - TIMEPASS; + if (coltime<0) + { + coltime = 1+(Rand()*5); + ar = br; ag = bg; ab = bb; + colamt = 0; + x = (Rand()*6.0)+1.0; + br = x%2; + bg = ((x%4)-br)/2; + bb = ((x%8)-(bg*2)-br)/4; + br = br/2.0; + bg = bg/2.0; + bb = bb/2.0; + } + colamt = colamt + TIMEPASS; + if (colamt>1) colamt=1; + gfxClear( ((1.0f-colamt)*ar)+(colamt*br), ((1.0f-colamt)*ag)+(colamt*bg), ((1.0f-colamt)*ab)+(colamt*bb) ); + + // draw + gfxSetTexture(tex); + gfxSetAspect(0); + gfxTranslate(0.0f, 0.0f, 2.414f); + gfxBegin(PRIM_QUADLIST); + for (x=7;x>=0;x=x-1) + { + rot[x] = rot[x] + (TIMEPASS*rots[x]*(0.5+BASS)*1.5f); + gfxColour(1.0f, 1.0f, 1.0f, 0.0f-((x+btime)/8.0f)); + quad(rot[x],0.2f+((x+btime)/2.0)); + } + gfxEnd(); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/MentalHangover.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/MentalHangover.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/MentalHangover.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/MentalHangover.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,143 @@ +// MentalHangover.vtx +// Author - MrC + +Texture checker; +Texture ball; +float ty; + +float d = 0; +float c; + +// colours +float ar,ag,ab,br,bg,bb; +float colamt,coltime; + +// balls +float[] c_z(64),c_vz(64),c_sx(64),c_sy(64), c_vy(64); + +void Init() +{ + checker.LoadTexture("checker_transp.png"); + ball.LoadTexture("smiley.png"); + + ty = 0; + coltime = 0; + + for (int x=0;x<64;x=x+1) + { + MakeNew(x); + c_z[x] = (Rand()*6) - 2; + c_vy[x] = Rand()*2 - 1; + } +} + +void MakeNew(int n) +{ + c_z[n] = 4; + c_vz[n] = Rand()* 1.0f + 1.0; + c_vy[n] = (Rand()*1.0 + 0.5); + c_sx[n] = (-0.5+Rand())*2.5; + c_sy[n] = 0.0f; +} + + +void Sprite(float x, float y, float z, float sz) +{ + gfxTexCoord(0,0); + gfxVertex(x-sz,y+sz,z); + gfxTexCoord(1,0); + gfxVertex(x+sz,y+sz,z); + gfxTexCoord(1,1); + gfxVertex(x+sz,y-sz,z); + gfxTexCoord(0,1); + gfxVertex(x-sz,y-sz,z); +} + +void Render() +{ + d = (TIMEPASS*6 + (TREBLE * 4 * TIMEPASS)) * 0.25; + + ty -= d; + + if (ty > 2) + ty -= 1.0f; + + if (ty < 2) + ty += 1.0f; + + // Floor + + coltime = coltime - TIMEPASS; + if (coltime<0) + { + coltime = 1+(Rand()*5); + ar = br; ag = bg; ab = bb; + colamt = 0; + float x = (Rand()*5.0)+1.0; + br = x%2; + bg = ((x%4)-br)/2; + bb = ((x%8)-(bg*2)-br)/4; + br = br/2.0; + bg = bg/2.0; + bb = bb/2.0; + } + colamt = colamt + TIMEPASS; + if (colamt>1) colamt=1; + + gfxRotate(-5.0,1,0,0); + + gfxSetTexture(NULL); + gfxTranslate(0, -0.245, 2.0f); + gfxSetBlendMode(BLEND_MOD); + + gfxBegin(PRIM_QUADLIST); + gfxColour( ((1.0f-colamt)*ag)+(colamt*bg), ((1.0f-colamt)*ab)+(colamt*bb), ((1.0f-colamt)*ar)+(colamt*br), 1 ); + gfxVertex(-5, 0, 2.5); + gfxVertex(5, 0, 2.5); + gfxVertex(5, 0, -2.5); + gfxVertex(-5, 0, -2.5); + gfxEnd(); + + gfxSetTexture(checker); + gfxSetBlendMode(BLEND_MOD); + + gfxBegin(PRIM_QUADLIST); + gfxColour(0, 0, 0, 0.4); + gfxColour( ((1.0f-colamt)*ar)+(colamt*br), ((1.0f-colamt)*ag)+(colamt*bg), ((1.0f-colamt)*ab)+(colamt*bb), 1 ); + gfxTexCoord(0, 0 + ty); + gfxVertex(-10, 0, 2.5); + gfxTexCoord(20, 0 + ty); + gfxVertex(10, 0, 2.5); + gfxTexCoord(20, 5 + ty); + gfxVertex(10, 0, -2.5); + gfxTexCoord(0, 5 + ty); + gfxVertex(-10, 0, -2.5); + gfxEnd(); + + gfxSetTexture(ball); + + gfxSetBlendMode(BLEND_MOD); + + gfxBegin(PRIM_QUADLIST); + for (int x=0;x<32;x++) + { + + c_z[x] = c_z[x] - (d*c_vz[x]); + c_vy[x] = c_vy[x] + 1 * TIMEPASS*2; + c_sy[x] = c_sy[x] - (c_vy[x] * d); + if (c_sy[x] < 0.025) + { + c_sy[x] = 0.025; + c_vy[x] = - (c_vy[x]* 0.9); + } + if (c_z[x]<-2) + MakeNew(x); + + c = (7.0-(c_z[x]+2))*0.11; + gfxColour(1,1,1,1); + Sprite(c_sx[x],c_sy[x],c_z[x], 0.0350); + } + + gfxEnd(); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/MeteorShower.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/MeteorShower.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/MeteorShower.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/MeteorShower.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,73 @@ +// MeteorShower.vtx +// Author - MrC +// Based on MeteorShower.r4 by Gordon Williams +Texture trail; +Texture sky; + +float[] pvel(256),ppos(256),ptheta(256),prad(256),plen(256),psnd(256); +int x; +float f,g,bt; +const int cnt = 256; +float time; + +void Init() +{ + sky.LoadTexture("skybox.dds"); + trail.LoadTexture("trail2.dds"); + + for (x=0;x1.0) newpt(x); + gfxColour(1,1,1,(1.0-Cos(ppos[x]*3.14159*2.0))*0.5); + drawit(ptheta[x],(ppos[x]*16.0)+plen[x],ptheta[x]+0.08+(prad[x]*0.025),(ppos[x]*16.0),prad[x]); + } + gfxEnd(); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/MiddleGrid.tra kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/MiddleGrid.tra --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/MiddleGrid.tra 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/MiddleGrid.tra 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,67 @@ +// MiddleGrid.tra +// Author - MrC +// Based on FadeMiddleGrid.r4 By Gordon Williams + +int x,y,mx,my,hx,hy; +float dx,dy,sx,sy,a,b,mytime; + +void Init() +{ + +} + +void Render() +{ + mytime = mytime + (TIMEPASS*0.40); + + + gfxSetAspect(0); + gfxTranslate(-1, -1, 2.414); + gfxSetTexture(TEXTURE_NEXTPRESET); + gfxColour(1, 1, 1, 1); + gfxTexRect(0, 2, 2, 0); + + mx = 16; + my = 12; + hx = 8; + hy = 6; + + gfxScale(2.0/mx,2.0/my,1.0); + sx = 1.0/mx; + sy = 1.0/my; + + gfxSetTexture(TEXTURE_CURRPRESET); + gfxColour(1, 1, 1, 1); + + gfxBegin(PRIM_QUADLIST); + + FINISHED = true; + + dx = 0; + for (x=0;x 0) + tex = MIDDLE * 10; + if (tex == 0) + gfxSetTexture(skull0); + else if (tex == 1) + gfxSetTexture(skull1); + else if (tex == 2) + gfxSetTexture(skull2); + else if (tex == 3) + gfxSetTexture(skull3); + else if (tex == 4) + gfxSetTexture(skull4); + else if (tex == 5) + gfxSetTexture(skull5); + else if (tex == 6) + gfxSetTexture(skull6); + else if (tex >= 7) + gfxSetTexture(skull7); +// gfxSetAspect(0); + gfxSetBlendMode(BLEND_MOD); + gfxTranslate(0,0,2.5); + + float x = (Sin(bt*6.43)+Cos(bt*4.23))*0.25; + float y = (Cos(bt*6.43)+Sin(bt*4.23))*0.25; + + + gfxTexRect(x - 0.5, y + 0.5, x + 0.5, y -0.5); + + float col = 0; + if (BASS > 0) + col = BASS; + + col = Fabs(Sin(time)); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Slide.tra kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Slide.tra --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Slide.tra 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Slide.tra 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,52 @@ +// Slide.tra +// Author - MrC + +int direction; +float position; + +void Init() +{ + position = 0; + direction = Rand() * 4; +} + +void Render() +{ + position += TIMEPASS*0.75; + if (position >= 1.0f) + FINISHED = true; + + gfxSetTexture(TEXTURE_CURRPRESET); + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + gfxColour(1, 1, 1, 1); + gfxTexRect(-1, 1, 1, -1); + + gfxSetTexture(TEXTURE_NEXTPRESET); + + if (direction == 0) + { + // Top to bottom + float i = -3 + position * 2; + gfxTexRect(-1, i+2, 1, i); + } + else if (direction == 1) + { + // Bottom to top + float i = 1 - (position * 2); + gfxTexRect(-1, i+2, 1, i); + } + else if (direction == 2) + { + // Left to right + float i = -3 + position * 2; + gfxTexRect(i, 1, i+2, -1); + } + else + { + // Right to left + float i = 1 - position * 2; + gfxTexRect(i, 1, i+2, -1); + } + +} diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/SpaceHarrier.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/SpaceHarrier.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/SpaceHarrier.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/SpaceHarrier.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,91 @@ +/* + +SCENE ( +"name" = "Space Harrier 2"; +"author" = "Gordon Williams"; +SOLID bg(); +TEXTURE texa(); +TEXTURE texb(); +GL gl(bg,texa,texb); +) +*/ +Texture checker; + +int x; +float bt,bump,n; +float time; + +//- --------------------------- +void drawit(float ox,float oy) +{ + gfxColour(1, 1, 1, 1); + gfxTexCoord(0+ox,0+oy); + gfxVertex(-10,0,-5); + gfxTexCoord(20+ox,0+oy); + gfxVertex(10,0,-5); + + gfxColour(0, 0, 0, 0); + gfxTexCoord(20+ox,10+oy); + gfxVertex(10,0,5); + gfxTexCoord(0+ox,10+oy); + gfxVertex(-10,0,5); +} +//- --------------------------- + +void Init() +{ + checker.LoadTexture("checker.png"); + bt = 0; +// bg.col = rgb(0,0,0); +// strcpy(texa.filename,"dots.png"); +// strcpy(texb.filename,"grid.png"); +// strcpy(gl.shader,"T0;BAa;"); +} + +void Render() +{ + time += TIMEPASS; + bt = bt + (TIMEPASS*(0.5+BASS)); + n = 1.0-(TIMEPASS*4); + bump = (bump*n)+(BASS*(1.0-n)); + +// gl.clear(); + + gfxRotate(bump*40.0,1,0,0); + gfxRotate((Sin(bt*6.43)+Cos(bt*4.23))*15,0,1,0); + + gfxRotate((Sin(bt*2)+Cos(bt*4.23))*30,0,0,1); + + gfxSetTexture(checker); + gfxTranslate(0,0.3,5); + gfxColour(1,1,1,1); + gfxBegin(PRIM_QUADLIST); + drawit(0,bt); + gfxEnd(); + +// gl.glbindtexture(2); + gfxTranslate(0,-0.6,0); +// gl.glcolor(1,1,1,1); + gfxBegin(PRIM_QUADLIST); + drawit(0,bt+time); + gfxEnd(); + + gfxSetTexture(NULL); + gfxTranslate(0, 0.3, -2 ); + gfxScale(5,0.35,1); + gfxColour(1,1,1,1); + gfxSetLineWidth(2); + gfxBegin(PRIM_LINESTRIP); + + gfxColour(1, 1, 0, 1); + for (x=0;x<256;x=x+1) + gfxVertex((x-128.0)/128.0,WaveLeft(x),0); + gfxEnd(); + + gfxColour(0, 1, 1, 1); + gfxBegin(PRIM_LINESTRIP); + for (x=0;x<256;x=x+1) + gfxVertex((x-128.0)/128.0,WaveRight(x),0); + gfxEnd(); + +} diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Speakers.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Speakers.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Speakers.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Speakers.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,95 @@ +// Speakers.vtx +// Author - MrC + +float[] x(15), y(15), vx(15), vy(15); + +Texture speaker; + +void Init() +{ + speaker.LoadTexture("speaker.png"); + + for (int i = 0; i < 15; i++) + { + x[i] = (Rand()-0.5) * 2; + y[i] = (Rand()-0.5) * 2; + vx[i] = (Rand()-0.5) * 0.05; + vy[i] = (Rand()-0.5) * 0.05; + } +} + +void quad(float x, float y, float sz) +{ + gfxTexCoord(0,0); + gfxVertex(x-sz,y+sz,0); + gfxTexCoord(1,0); + gfxVertex(x+sz,y+sz,0); + gfxTexCoord(1,1); + gfxVertex(x+sz,y-sz,0); + gfxTexCoord(0,1); + gfxVertex(x-sz,y-sz,0); +} + +float time = 0; + +void Render() +{ + time += TIMEPASS * 30; + + for (int i = 0; i < 15; i++) + { + float value; + if (i < 5) + value = BASS; + else if (i < 10) + value = MIDDLE; + else + value = TREBLE; + + + x[i] = x[i] + vx[i] * value; + if (x[i] < -1) + { + x[i] = -1; + vx[i] = -vx[i]; + } + else if (x[i] > 1) + { + x[i] = 1; + vx[i] = -vx[i]; + } + y[i] = y[i] + vy[i] * value; + if (y[i] < -1) + { + y[i] = -1; + vy[i] = -vy[i]; + } + else if (y[i] > 1) + { + y[i] = 1; + vy[i] = -vy[i]; + } + } + + + gfxSetTexture(speaker); + gfxSetAspect(1); + gfxTranslate(0, 0, 2.0); + gfxBegin(PRIM_QUADLIST); + gfxColour(1.0f, 1.0f, 1.0f, 1); + gfxSetBlendMode(BLEND_MOD); + for (int i=0; i < 5; i++) + { + quad(x[i], y[i], 0.1 + (1+BASS)*0.2); + } + for (int i=5; i < 10; i++) + { + quad(x[i], y[i], 0.1 + (1+MIDDLE)*0.2); + } + for (int i=10; i < 15; i++) + { + quad(x[i], y[i], 0.1 + (1+TREBLE)*0.2); + } + gfxEnd(); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/SpectrumCylinder.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/SpectrumCylinder.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/SpectrumCylinder.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/SpectrumCylinder.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,91 @@ +// SpectrumCylinder.vtx +// Author - MrC +// Based on SpectrumCylinder.r4 by Gordon Williams + +float time = 0; + +float tm; +int x,y; + +float rx,rxamt,ry,ryamt; +int currBuffer; + +float[] buffers(12*12); + +float[] savr(12); +int[] sn(12); +float[] sp(12); + + +Map map; +Texture envTexture; + +void Init() +{ + envTexture.LoadTexture("env3.png"); + currBuffer = 0; + + for (y=0;y<24;y=y+1) + { + for (x=0;x<32;x=x+1) + { + map.SetValues(x, y, Sin((x-15.5)*3)*0.01, Sin((y-11.5)*3)*0.01, 1, 1, 1); + } + } + rxamt = 1; + ryamt = -1; +} + +void Render() +{ + time += TIMEPASS; + + map.Render(); + + gfxSetRenderTarget(map); + + gfxPushMatrix(); + + gfxTranslate(0,0,17.5f); + gfxRotate(-70+(Sin(time)*12),1,0,0); + + if (BASS>0.3) rxamt = 1; + if (BASS<-0.3) rxamt = -1; + if (TREBLE>0.3) ryamt = 1; + if (TREBLE<-0.3) ryamt = -1; + rx = rx + (rxamt*TIMEPASS); + ry = ry + (ryamt*TIMEPASS); + + gfxRotate(rx*90,0,0,1); + gfxRotate(ry*90,0,1,0); + + + for (x = 0; x < 12; x++) + { + sp[x] = GetSpec(x*2); + } + gfxSetEnvTexture(envTexture); + + // draw buffer out of cubes + for (y=0;y<12;y=y+1) + { + for (x=0;x<12;x=x+1) + { + gfxColour(x/12.0,y/12.0,1.0-(y/12.0),1.0); // fade colour + gfxCube(-5.5+x,-0.25f,1.0,-5.5+x+0.5f,0.25f,1.0+(sp[x]*1.5)); + } + gfxRotate(360.0/12.0,1,0,0); + } + + gfxPopMatrix(); + + gfxSetRenderTarget(0); + gfxSetEnvTexture(NULL); + gfxSetTexture(map); + + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + gfxColour(1, 1, 1, 1); + gfxTexRect(-1, 1, 1, -1); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/SpectrumField.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/SpectrumField.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/SpectrumField.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/SpectrumField.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,73 @@ +// SpectrumFile.vtx +// Author - MrC + +const int STEP = 5; +float time = 0; + +float tm; +int x,y; + +float rx,ry,ryamt; +int currBuffer; + +float[] buffers(24*32); +int counter = 0; + +void Init() +{ + currBuffer = 0; + counter = 0; + for (int i=0; i<24*32; i++) + { + buffers[i]=0; + } + + ryamt = -25.0f; + ry = Rand() * 360.0f; + +} + +void Render() +{ + + time += TIMEPASS; + + gfxTranslate(0,-2,30.0f); + counter++; + + ryamt = (BASS) * 40; + + ry = ry + (ryamt*TIMEPASS); + + + gfxRotate(-20,1,0,0); + gfxRotate(ry,0,1,0); + + gfxSetBlendMode(BLEND_ADD); + + if (counter == 5) + { + currBuffer = (currBuffer+1) % 24; + for (int i=0; i<32; i++) + { + buffers[currBuffer*32 + i] = GetSpec(i) * 4; + } + counter = 0; + } + + gfxColour(1, 1, 1, 1); + gfxSetLineWidth(5); + + for (int i=0; i<24;i++) + { + int index = (i+currBuffer+1) % 24; + + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x<32; x++) + { + gfxColour(i/24.0,x/32.0,1.0-(x/32.0),1.0); // fade colour + gfxVertex(-12+i-(counter/5.0f), buffers[index*32 + x], -16+x); + } + gfxEnd(); + } +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/SpectrumSphere.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/SpectrumSphere.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/SpectrumSphere.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/SpectrumSphere.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,186 @@ +// SpectrumSphere.vtx +// Author - morte0815 + +float time = 0; +float rx,rxamt,ry,ryamt; + +float[] org_coordsX(70); +float[] org_coordsY(70); +float[] org_coordsZ(70); +float[] org_colorR(70); +float[] org_colorG(70); +float[] org_colorB(70); + +float stacks = 8; +float segments = 8; + +float velX,velY,velZ; +float posX,posY,posZ; +float signX,signY,signZ; +Map map; + +int x,y; + +void Init() +{ + velX= 0; + velY= 0; + velZ = 0; + posX= 0; + posY= 0; + posZ = 0; + posX= 0; + posY= 0; + posZ = 0; + signX= 1; + signY= 1; + signZ = 1; + + if(BASS < 0.2f){signZ = 1;} + if(MIDDLE < 0.2f){signY = -1;} + if(TREBLE < 0.2f){signX = -1;} + + for (int i = 0; i< stacks; i++) + { + float temp = Cos(3.14159f/6.0f*i-3.14159f/2.0f); + for (int j = 0; j < segments; j++) + { + org_coordsY[Fabs(i*segments+j)] = Sin(3.14159f/6.0f*i-3.14159f/2.0f); + org_coordsX[Fabs(i*segments+j)] = Cos(2*3.14159f/segments*j) * temp; + org_coordsZ[Fabs(i*segments+j)] = Sin(2*3.14159f/segments*j) * temp; + } + } + for (int i = 0; i< stacks; i++) + { + for (int j = 0; j< segments; j++) + { + org_colorR[i*segments+j] = Sin(i); + org_colorG[i*segments+j] = Sin(j); + org_colorB[i*segments+j] = 1-Sin(j); + } + } + + + + + +} + +void RenderSphere() +{ + float addX=0; + float addY=0; + float addZ=0; + float scale = 0.5f; + float colorVal = 0; + gfxBegin(PRIM_TRIANGLELIST); + for (int i = 0; i< stacks-2; i++) + { + for (int j = 0; j< segments; j++) + { + float temp = i*segments+j; + addX = GetSpec(Fabs(temp/2)) * org_coordsX[temp]*scale; + addY = GetSpec(Fabs(temp/2)) * org_coordsY[temp]*scale; + addZ = GetSpec(Fabs(temp/2)) * org_coordsZ[temp]*scale; + colorVal = GetSpec(Fabs(temp/2)); + + + gfxColour(org_colorR[temp],org_colorG[temp] ,org_colorB[temp] ,1); + gfxVertex(org_coordsX[temp] + addX,org_coordsY[temp] + addY,org_coordsZ[temp] + addZ); + + temp = (i+1)*segments+((j+1)%segments); + gfxVertex(org_coordsX[temp] + addX,org_coordsY[temp] + addY,org_coordsZ[temp] + addZ); + + temp = i*segments+((j+1)%segments); + gfxVertex(org_coordsX[temp] + addX,org_coordsY[temp] + addY,org_coordsZ[temp] + addZ); + + temp = i*segments+j; + addX = GetSpec(Fabs(temp/2)) * org_coordsX[temp]*scale; + addY = GetSpec(Fabs(temp/2)) * org_coordsY[temp]*scale; + addZ = GetSpec(Fabs(temp/2)) * org_coordsZ[temp]*scale; + colorVal = GetSpec(Fabs(temp/2)); + + gfxColour(org_colorR[temp],org_colorG[temp],org_colorB[temp],1); + gfxVertex(org_coordsX[temp] + addX,org_coordsY[temp] + addY,org_coordsZ[temp] + addZ); + + temp = (i+1)*segments+j; + gfxVertex(org_coordsX[temp] + addX,org_coordsY[temp] + addY,org_coordsZ[temp] + addZ); + + temp = (i+1)*segments+((j+1)%segments); + gfxVertex(org_coordsX[temp] + addX,org_coordsY[temp] + addY,org_coordsZ[temp] + addZ); + } + } + gfxEnd(); +} + +void PushAround() +{ + if (Abs(BASS) > 0.3f){velZ += BASS*3.0f;} + if (Abs(BASS) < 0.3f){velZ -= BASS*3.0f;} + if (Abs(MIDDLE) > 0.3f){velY += MIDDLE*3.0f;} + if (Abs(MIDDLE) < 0.3f){velY -= MIDDLE*3.0f;} + if (Abs(TREBLE) > 0.3f){velX += TREBLE*3.0f;} + if (Abs(TREBLE) < 0.3f){velX -= TREBLE*3.0f;} + + velX = Clamp(velX,-3.0f,3.0f); + velY = Clamp(velY,-3.0f,3.0f); + velZ = Clamp(velZ,-3.0f,3.0f); + + posX += signX*velX*TIMEPASS; + posY += signY*velY*TIMEPASS; + posZ += signZ*velZ*TIMEPASS; + + if (posX < -4 || posX > 4){signX = -signX;} + if (posY < -4 || posY > 4){signY = -signY;} + if (posZ < -4 || posZ > 4){signZ = -signZ;} + + gfxTranslate(posX,posY,posZ); + +} + +void Render() +{ + time += TIMEPASS; + for (y=0;y<24;y=y+1) + { + for (x=0;x<32;x=x+1) + { + float dx = (x-16); + float dy = (y-12); + float s = Mag(dx,dy)/Mag(16,12); + if (s == 0) + { + map.SetValues(x, y, 0.1, 0.1, 0.8,0.8, 0.8); + } + map.SetValues(x, y, dx*s*0.1*Fabs(BASS), dy*s*0.1*Fabs(BASS), 0.8,0.8, 0.8); + } + + } + map.Render(); + + gfxSetRenderTarget(map); + gfxPushMatrix(); + gfxTranslate(0,0,15); + + PushAround(); + + if (BASS>0.3) ryamt = 1; + if (BASS<-0.3) ryamt = -1; + ry = ry + (ryamt*TIMEPASS); + + gfxRotate(ry*90,0,1,0); + + + RenderSphere(); + + gfxPopMatrix(); + + gfxSetRenderTarget(0); + gfxSetEnvTexture(NULL); + gfxSetTexture(map); + + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + gfxColour(1, 1, 1, 1); + gfxTexRect(-1, 1, 1, -1); +} diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Sphere.tra kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Sphere.tra --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Sphere.tra 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Sphere.tra 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +// Sphere.tra +// Author - MrC +// Based on FadeSphere.r4 by Gordon Williams + +const int stripx = 32; +const int stripy = 16; + +int x,y; +float dx,da,db,sa,sb,a,b,mytime; + +void Init() +{ +} + +void Render() +{ + mytime = mytime + (TIMEPASS * 0.25); + FINISHED = (mytime>1); + + gfxSetTexture(TEXTURE_NEXTPRESET); + gfxSetAspect(0); + gfxTranslate(0,0,2.414); + gfxColour(1, 1, 1, 1); + gfxTexRect(-1, 1, 1, -1); + gfxTranslate(0,0,-2.414); + + a = mytime*2; + if (a>1.0) a=1.0; + a = (1.0-Cos(a*3.14159))/2.0; + + gfxSetAspect(a); + + b = (mytime*2)-1.0; + if (b<0.0) b=0.0; + b = (1.0-Cos(b*3.14159))/2.0; + + gfxTranslate(b*6,0,2.414+(a*1.5)); + + gfxRotate(mytime*720,1,1,1); + + gfxSetTexture(TEXTURE_CURRPRESET); + + gfxColour(1,1,1,1); + for (y=0;y= 0 && index < 256*BUFFERS) + value = value + buffers[index]; + } +// value = value / (256.0f / WIDTH); + value = value * 2.0; + + float prevValue = value; + + // get previous value + if (x != 0 && x != (WIDTH / 2)) prevValue = m_prevValue; + + // remember for next time + m_prevValue = value; + + value = (value + prevValue) / 2.0f; + + if (rowRenderCount == BUFFERS) + gfxColour((x >= (WIDTH / 2) ? 1.0 - (x-(WIDTH/2.0f)) / (WIDTH * 2.0f / 3.0f) : 0.0), (x < (WIDTH / 2) ? 1.0 - (WIDTH/2-x) / (WIDTH * 2.0f / 3.0f) : 0.0), 0.0, 0.2); // front bright colour + else + gfxColour((x >= (WIDTH / 2) ? (0.8f - (x-(WIDTH/2.0f)) / (WIDTH * 2.0f / 3.0f)) / (Zpos+1) : 0.0), (x < (WIDTH / 2) ? (0.8f - (WIDTH/2-x) / (WIDTH * 2.0f / 3.0f)) / (Zpos+1) : 0.0), 0.0, 1.0); // fade colour + if (x == 0 || x == WIDTH / 2) + gfxBegin(PRIM_QUADSTRIP); + + gfxVertex(-(WIDTH / 16.0f)+(x/8.0f)+(x < WIDTH / 2 ? 0.2f : 0.0) + (x < (WIDTH / 2) ? 0.0 : 0.0), value, Zpos + 0.3f); + gfxVertex(-(WIDTH / 16.0f)+(x/8.0f)+(x < WIDTH / 2 ? 0.0f : 0.2f) + (x < (WIDTH / 2) ? 0.0 : 0.0), value, Zpos); + + if (x == WIDTH / 2 - 1 || x == WIDTH - 1) + gfxEnd(); + } + + //gfxPopMatrix(); + + gfxPopMatrix(); +} + +void Render() +{ + yaws[currBuffer] = Fabs(Sin(BASS) * 6); + counter++; + + gfxTranslate(0.0, 0.0, 12.0f); + bounces[currBuffer] = -1.6 + Fabs((BASS + TREBLE) / 2.0f); + + { + for (int i = 0; i < 256; i++) + { + int index = i + (currBuffer * 256); + int prevIndex = (index + 256) % (BUFFERS * 256); + int prevIndex2 = (index + 512) % (BUFFERS * 256); + float value = 0.0f; + + if (i < 128) + { + buffers[index] = (GetSpecLeft(i * 4 + 0) + GetSpecLeft(i * 4 + 1) + GetSpecLeft(i * 4 + 2) + GetSpecLeft(i * 4 + 3)) / 4.0f; + } + else + { + buffers[index] = (GetSpecRight((256 - i) * 4 + 0) + GetSpecRight((256 - i) * 4 + 1) + GetSpecRight((256 - i) * 4 + 2) + GetSpecRight((256 - i) * 4 + 3)) / 4.0f; + } + } + + currBuffer = (currBuffer + 1) % BUFFERS; + counter = 0; + } + + rowRenderCount = 0; + int rendPos = BUFFERS; +//doRender(currBuffer-1, 0 * 0.25f); + for (int rend=currBuffer; rend1); + + gfxSetTexture(TEXTURE_NEXTPRESET); + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + gfxColour(1, 1, 1, 1); + gfxTexRect(-1, 1, 1, -1); + gfxTranslate(0, 0, -2.414); + + a = mytime*2; + if (a>1.0) a=1.0; + a = (1.0-Cos(a*3.14159))/2.0; + + b = (mytime*2)-1.0; + if (b<0.0) b=0.0; + b = (1.0-Cos(b*3.14159))/2.0; + + gfxTranslate(0,0,2.414+(a*3.0)-(b*8)); + + gfxRotate((1.0-Cos(a*3.14159))*180,1,1,1); + gfxRotate(a*90,1,0,0); + gfxRotate((1.0-Cos(b*3.14159))*180,0,1,0); + + gfxSetTexture(TEXTURE_CURRPRESET); + + gfxColour(1,1,1,1); + gfxBegin(PRIM_QUADSTRIP); + + for (x=0;x<=strips;x=x+1) + { + dx = (1.0*x)/strips; + tx = dx*2; + if (tx>1) tx=2.0-tx; + gfxTexCoord(tx,1.0); + gfxVertex(((dx*4.0)-1.0)*(1.0-a)+(-Cos(3.14159*2.0*dx)*a),-1-a,(-Sin(3.14159*2.0*dx)*a)); + gfxTexCoord(tx,0.0); + gfxVertex(((dx*4.0)-1.0)*(1.0-a)+(-Cos(3.14159*2.0*dx)*a),1+a,(-Sin(3.14159*2.0*dx)*a)); + } + gfxEnd(); +} diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/VoicePrintDonut.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/VoicePrintDonut.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/VoicePrintDonut.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/VoicePrintDonut.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,74 @@ +// VoicePrintDonut.vtx +// Author - MrC +// Based on VoicePrint.r4 by Gordon Williams + +VoicePrint vp; +Map map; +float time = 0; +float minX; + +float rx,rxamt,ry,ryamt; + +void Init() +{ + vp.LoadColourMap("huemap.jpg"); + vp.SetSpeed(0.5); + + for (int y=0;y<24;y=y+1) + { + for (int x=0;x<32;x=x+1) + { + float dx = (x-16)/16.0; + float dy = (y-12)/12.0; + float s = (Mag(dx,dy))-1.5; + map.SetValues(x, y, dx*s, dy*s, 1, 1, 1); + } + } + +} + +void Render() +{ + gfxPushMatrix(); + minX = 0.75f - BASS; + if (minX<0.5f) minX=0.5f; + if (minX>0.99f) minX=0.99f; + + vp.SetRect(minX, 0, 0.5, 0.99); + + vp.Render(); + + gfxSetRenderTarget(map); + gfxSetTexture(vp); + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + gfxTexRect(-1, 1, 1, -1); + + map.Render(); + gfxSetRenderTarget(0); + gfxSetTexture(map); + gfxTexRect(-1, 1, 1, -1); + + gfxPopMatrix(); + + time += TIMEPASS; + + gfxSetTexture(vp); + gfxTranslate(0, 0, 2.0f-(BASS* 0.5f)); + + if (BASS>0.3) rxamt = 1; + if (BASS<-0.3) rxamt = -1; + if (TREBLE>0.3) ryamt = 1; + if (TREBLE<-0.3) ryamt = -1; + rx = rx + (rxamt*TIMEPASS); + ry = ry + (ryamt*TIMEPASS); + + gfxRotate(-70+(Sin(time)*12),1,0,0); + gfxRotate(rx*90,0,0,1); + gfxRotate(ry*90,0,1,0); + + gfxColour(1, 1, 1, 1); + gfxSetAspect(1); + gfxCube(-0.25f, -0.25f, -0.25f, 0.25f, 0.25f, 0.25f); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WalkingCube.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WalkingCube.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WalkingCube.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WalkingCube.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,151 @@ +// WalkingCube.vtx +// Author - MrC + +float time = 0; +float rx,rxamt,ry,ryamt; +float y = 0; +Texture checker; +Texture sky; +float tx, ty; + +float d = 0; + +void Init() +{ + checker.LoadTexture("checker.png"); + sky.LoadTexture("sky.dds"); + + tx = 0; + ty = 0; + ryamt = 0; + +} + +void Render() +{ + + gfxPushMatrix(); + + d = TIMEPASS*((BASS + 1.5)*4); + d = TIMEPASS*6 + (BASS * 4 * TIMEPASS); + + time += d; + + ry += TIMEPASS * ryamt * 2; + + gfxSetTexture(sky); + + gfxSetBlendMode(BLEND_MOD); + gfxPushMatrix(); + gfxSetAspect(0); + gfxTranslate(0,0,2.414); + + gfxBegin(PRIM_QUADLIST); + gfxColour(1, 1, 1, 1); + gfxTexCoord(0, 0); + gfxVertex(-1, 1, 0); + + gfxTexCoord(1, 0); + gfxVertex(1, 1, 0); + + gfxTexCoord(1, 1); + gfxVertex(1, -0.2, 0); + + gfxTexCoord(0, 1); + gfxVertex(-1, -0.2, 0); + + gfxColour(0.7, 0.7, 0.7, 1); + + gfxTexCoord(0, 1); + gfxVertex(-1, -0.2, 0); + + gfxTexCoord(1, 1); + gfxVertex(1, -0.2, 0); + + gfxTexCoord(1, 0); + gfxVertex(1, -1, 0); + + gfxTexCoord(0, 0); + gfxVertex(-1, -1, 0); + + gfxEnd(); + + gfxSetAspect(1); + gfxPopMatrix(); + + gfxSetTexture(TEXTURE_ALBUMART); + + if (BASS>0.3) rxamt = 1; + if (BASS<-0.3) rxamt = -1; + if (TREBLE>0.4) ryamt = Rand()-0.5f; + + + + gfxPushMatrix(); + gfxSetBlendMode(BLEND_OFF); + gfxScale(1,-1,1); + gfxTranslate(0, 0.5 + Fabs(Sin(time * 2 *45 * 3.1415 / 180))* 0.125, 2.0f); + gfxRotate(ry*90,0,1,0); + gfxRotate(time*45,0,0,1); + + gfxColour(1, 1, 1, 1); + gfxCube(-0.25f, -0.25f, -0.25f, 0.25f, 0.25f, 0.25f); + + gfxPopMatrix(); + + gfxPushMatrix(); + + gfxTranslate(0, Fabs(Sin(time * 2 *45 * 3.1415 / 180))* 0.125, 2.0f); + gfxRotate(ry*90,0,1,0); + gfxRotate(time*45,0,0,1); + + gfxColour(1, 1, 1, 1); + gfxCube(-0.25f, -0.25f, -0.25f, 0.25f, 0.25f, 0.25f); + + gfxPopMatrix(); + + + float c = Cos(ry*90 * 3.1415 / 180); + float s = Sin(ry * 90 * 3.1415 / 180); + + ty -= d * 0.06f * s; + tx -= d * 0.06f * c; + + if (ty > 2) + ty -= 1.0f; + + if (ty < 2) + ty += 1.0f; + + if (tx > 2) + tx -= 1.0f; + + if (tx < 2) + tx += 1.0f; + + + // Floor + + + gfxSetTexture(checker); + gfxTranslate(0, -0.245, 2.0f); + gfxSetBlendMode(BLEND_MOD); + + gfxBegin(PRIM_QUADLIST); + gfxColour(0, 0, 0, 0.4); + gfxTexCoord((0+tx)*2, (0+ty)*2); + gfxVertex(-2, 0, 2); + gfxTexCoord((1+tx)*2, (0+ty)*2); + gfxVertex(2, 0, 2); + gfxColour(1, 1, 1, 0.8); + gfxTexCoord((1+tx)*2, (1+ty)*2); + gfxVertex(2, 0, -2); + gfxTexCoord((0+tx)*2, (1+ty)*2); + gfxVertex(-2, 0, -2); + gfxEnd(); + + + gfxPopMatrix(); + + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WarpDriveTwist.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WarpDriveTwist.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WarpDriveTwist.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WarpDriveTwist.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,74 @@ +// WarpDriveTwist.vtx +// Author - MrC +// Based on WarpDriveTwist.r4 by Gordon Williams + +Texture trail; + +float[] pvel(256),ppos(256),ptheta(256),prad(256),plen(256),psnd(256); +int[] pval(256),vr(8),vg(8),vb(8); + +int x; +float f,g,bt; +const int cnt = 256; +float time; + +void Init() +{ + trail.LoadTexture("bluestrip.dds"); + + for (x=0;x1.0) newpt(x); + gfxColour(1,1,1,(1.0-Cos(ppos[x]*3.14159*2.0))*0.5); + drawit(ptheta[x],(ppos[x]*16.0)+plen[x],ptheta[x]+0.08+(prad[x]*0.025),(ppos[x]*16.0),prad[x]); + } + gfxEnd(); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WarpDrive.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WarpDrive.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WarpDrive.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WarpDrive.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,73 @@ +// WarpDrive.vtx +// Author - MrC +// Based on WarpDrive.r4 by Gordon Williams + +Texture trail; +Texture sky; + +float[] pvel(256),ppos(256),ptheta(256),prad(256),plen(256),psnd(256); +int x; +float f,g,bt; +const int cnt = 256; +float time; + +void Init() +{ + sky.LoadTexture("skybox.dds"); + trail.LoadTexture("bluestrip.dds"); + + for (x=0;x1.0) newpt(x); + gfxColour(1,1,1,(1.0-Cos(ppos[x]*3.14159*2.0))*0.5); + drawit(ptheta[x],(ppos[x]*16.0)+plen[x],ptheta[x]+0.08+(prad[x]*0.025),(ppos[x]*16.0),prad[x]); + } + gfxEnd(); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WaveRing.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WaveRing.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WaveRing.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WaveRing.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,59 @@ +// Author - MrC +// Based on WaveRing.r4 by Gordon Williams + +Map map; + +int x,y; +float theta,rad,dx,dy; +float mx, my; + +void Init() +{ + for (y=0;y<24;y=y+1) + { + for (x=0;x<32;x=x+1) + { + dx = x-15.5; + dy = y-11.5; + rad = Mag(dx,dy); + theta = Atan2(dy,dx); + mx = -(0.01*dy/rad)-Sin((rad-7.5)*0.1)*0.02*dx/rad; + my = (0.01*dx/rad)-Sin((rad-7.5)*0.1)*0.02*dy/rad; + map.SetValues(x, y, mx, my, (3.0+Cos(theta))*0.275, (3.0+Cos(theta*2.0))*0.275, (3.0+Cos(theta*4.0))*0.275); + } + } +} + +void Render() +{ + map.Render(); + + gfxSetRenderTarget(map); + + gfxColour(1,1,1,1); + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x < 256; x = x+1) + { + rad = 0.25 + (WaveLeft(x) / 10.0f); + theta = x*3.141592/128.0; + gfxVertex(Cos(theta)*rad, Sin(theta)*rad,1); + } + gfxEnd(); + + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x < 256; x = x+1) + { + rad = 0.25 + (WaveRight(x) / 10.0f); + theta = x*3.141592/128.0; + gfxVertex(Cos(theta)*rad, Sin(theta)*rad,1); + } + gfxEnd(); + + gfxSetRenderTarget(0); + gfxSetTexture(map); + + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + gfxTexRect(-1, 1, 1, -1); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WaveScope.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WaveScope.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WaveScope.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WaveScope.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,99 @@ +// Author - MrC +// Based on WaveScope.r4 by Gordon Williams +Map map; + +float dx,dy,a,r,d,tp,s,t,c; +float px,py,pdx,pdy; // point +float cr,cg,cb,basstime; + +void Init() +{ + px = 16; + py = 12; + pdx = 1.342; + pdy = 1; + basstime = 0; + map.SetTimed(); +} + +void Render() +{ + //-------------------------------------- + // Update map + + t = TIMEPASS*(BASS+0.25)*40; + px = px + (pdx*t); + if (px>28) + { + pdx = -(pdx); + px = 28; + } + else if (px<4) + { + pdx = -(pdx); + px = 4; + } + py = py + (pdy*t); + if (py>20) + { + pdy = -(pdy); + py = 20; + } + else if (py<4) + { + pdy = -(pdy); + py = 4; + } + + basstime = basstime + (TIMEPASS*(BASS+1)); + cr = (Cos(basstime)-1.0)/2.0; + cg = (Cos(basstime*2.0)-1.0)/2.0; + cb = (Cos(basstime*4.0)-1.0)/2.0; + + for (int y = 0; y < 24; y++) + { + for (int x = 0; x < 32; x++) + { + dx = x-px; + dy = y-py; + d = Mag(dx,dy); + if (d>0.01) + { + c = (0.5/d)-0.05; + if (c<0) + c=0; + a = (d-12)/64; + if (a>0) + a=0; + r = 1-(d/4.0); + map.SetValues(x,y, (dx*a)+(dy*c), (dy*a)-(dx*c), cr+r, cg+r, cb+r); + } + } + } + + map.Render(); + + gfxSetRenderTarget(map); + + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x < 256; x = x+1) + { + gfxVertex((x-128)/128.0f, (WaveLeft(x) / 3.0f) + 0.5f, 0); + } + gfxEnd(); + + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x < 256; x = x+1) + { + gfxVertex((x-128)/128.0f, (WaveRight(x) / 3.0f) - 0.5f, 0); + } + gfxEnd(); + + gfxSetRenderTarget(0); + gfxSetTexture(map); + gfxTexRect(-1, -1, 1, 1); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Wave.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Wave.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Wave.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Wave.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,26 @@ +// Author : MrC + +void Render() +{ + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x<256; x=x+1) + { + float r = WaveLeft(x); + gfxColour(1, Fabs(r), 0.1f, 1); + gfxVertex((x-128) / 128.0f, r * 0.4f + 0.5f, 0); + } + gfxEnd(); + + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x<256; x=x+1) + { + float r = WaveRight(x); + gfxColour(Fabs(r), 1, 0.1f, 1); + gfxVertex((x-128) / 128.0f, r * 0.4f - 0.5f, 0); + } + gfxEnd(); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WaveZoomer.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WaveZoomer.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/WaveZoomer.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/WaveZoomer.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,90 @@ +// WaveZoomer.vtx +// Author - MrC +// Based on WaveZoomer.r4 b Gordon Williams + +Map map; + +int x,y; +float dx,dy,a,r; +float cr,cg,cb,cx,cy,crot,cox,coy; +float ccr,ccg,ccb; +float sinrot,cosrot; +float tx,ty,tz; +float mx, my; +int beat; + +void Init() +{ + map.SetTimed(); + cx = 15.5; + cy = 11.5; + cox = 0; + coy = 0; + crot = 0; +} + +void Render() +{ + if ((BASS+MIDDLE+TREBLE>0.6) && (beat!=1)) + { + beat=1; + cx = (20.0*Rand())+6.0; + cy = (16.0*Rand())+4.0; + cox = (Rand()-0.5)*1.5; + coy = (Rand()-0.5)*1.5; + crot = (Rand()-0.5)*2; + ccr = Rand()-2; + ccg = Rand()-2; + ccb = Rand()-2; + } + else if ((BASS+MIDDLE+TREBLE<-0.6) && (beat!=0)) + { + beat = 0; + } + + sinrot = -0.05*Sin(crot)*(BASS+1.5); + cosrot = -0.05*Cos(crot)*(BASS+1.5); + + tx = cox*(MIDDLE+1.5); + ty = coy*(MIDDLE+1.5); + for (y=0;y<24;y=y+1) + { + for (x=0;x<32;x=x+1) + { + dx = x-cx; + dy = y-cy; + mx = tx+((dx*cosrot)+(dy*sinrot)); + my = ty+((dy*cosrot)-(dx*sinrot)); + map.SetValues(x, y, mx, my, ccr, ccg, ccb); + } + } + + map.Render(); + + gfxSetRenderTarget(map); + + gfxColour(0.8,0.8,0.8, 1); + + gfxSetAspect(0); + gfxTranslate(0, 0, 2.414); + + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x < 256; x = x+1) + { + gfxVertex((x-128)*0.0078125f, (WaveLeft(x) * 0.2f) + 0.5f, 0); + } + gfxEnd(); + + gfxBegin(PRIM_LINESTRIP); + for (int x=0; x < 256; x = x+1) + { + gfxVertex((x-128)*0.0078125f, (WaveRight(x) * 0.2f) - 0.5f, 0); + } + gfxEnd(); + + gfxSetRenderTarget(0); + gfxSetTexture(map); + + gfxTexRect(-1, 1, 1, -1); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Woofer.vtx kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Woofer.vtx --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Presets/Woofer.vtx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Presets/Woofer.vtx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,65 @@ +// woofer.vtx +// Author - morte0815 + +float angle = 0; + +void Init() +{ + +} + +void Quad(float x, float y, float z, float width, float tu_u,float tv_l, float tu_b , float tv_r) +{ +gfxBegin(PRIM_QUADLIST); +gfxTexCoord(tu_u, tv_l); +gfxVertex(x,y,z); +gfxTexCoord(tu_b, tv_l); +gfxVertex(x+width,y,z); +gfxTexCoord(tu_b, tv_r); +gfxVertex(x+width,y+width,z); +gfxTexCoord(tu_u, tv_r); +gfxVertex(x,y+width,z); + + +gfxEnd(); +} + + +float Length(float x, float y) +{ + return Sqrt(x*x+y*y); +} + +void Render() +{ + if (BASS>0.5f)angle += TIMEPASS*5; + if (BASS<0.5f)angle -= TIMEPASS*5; + + gfxTranslate(0, 0, 25.0f); + + gfxRotate(-100,1,0,0); + gfxRotate(angle,0,0,1); + + + gfxSetTexture(TEXTURE_ALBUMART); + + for (int i = -10; i < 10; i++) + { + for ( int j = -10; j < 10; j++) + { + if (Length(i,j) <= 10) + { + float height=(Length(i,j)/10.0f*BASS); + height+=((10.0f-Length(i,j))/10.0f*TREBLE); + height+=((5.0f-Length(i,j))/10*MIDDLE); + Quad(i,j,height,1,(i+10)/20.0f,(j+10)/20.0f,(i+1+10)/20.0f,(j+1+10)/20.0f); + } + } + } + + + + + gfxEnd(); + +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/settings.xml kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/settings.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/settings.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/settings.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,12 @@ + + + + + + + + + + + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/alien.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/alien.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/aqua_ravines.jpg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/aqua_ravines.jpg differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/bluestrip.dds and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/bluestrip.dds differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/checker.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/checker.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/checker_transp.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/checker_transp.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/env2.jpg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/env2.jpg differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/env3_darker.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/env3_darker.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/env3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/env3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/huemap.jpg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/huemap.jpg differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Plasma_edge.jpg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Plasma_edge.jpg differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Skull_JawUD1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Skull_JawUD1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Skull_JawUD2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Skull_JawUD2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Skull_JawUD3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Skull_JawUD3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Skull_JawUD4.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Skull_JawUD4.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Skull_JawUD5.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Skull_JawUD5.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Skull_JawUD6.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Skull_JawUD6.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Skull_JawUD7.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Skull_JawUD7.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Skull_JawUD8.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Skull_JawUD8.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/skull.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/skull.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/skybox.dds and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/skybox.dds differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/sky.dds and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/sky.dds differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Smiley.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Smiley.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Speaker.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Speaker.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Tex_Edge.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Tex_Edge.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/trail2.dds and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/trail2.dds differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/Vortex_Credits.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/Vortex_Credits.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.vortex/resources/Textures/vortex-v.jpg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.vortex/resources/Textures/vortex-v.jpg differ diff -Nru kodi-16.1~git20160425.1001-final/addons/visualization.waveform/addon.xml kodi-15.2~git20151019.1039-final/addons/visualization.waveform/addon.xml --- kodi-16.1~git20160425.1001-final/addons/visualization.waveform/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/visualization.waveform/addon.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,125 @@ + + + + + Visualisering wat 2 golfvorm grafieke op die skerm vertoon + التصوير يظهر2 رسم بياني موجي على الشاشة + Візуалізацыя што паказвае 2 графікі сыгналу на экране + Визуализация представяща две осцилиращи вълни + Visualització que mostra 2 gràfics en forma d'ona a la pantalla + Vizualizace zobrazující 2 grafy průběhu vlny na obrazovce + Delweddu'n dangos 2 Graff Ffurf Ton ar y sgrin + Visualisering der viser 2 bølgeagtige grafer på skærmen + Eine Visualisierung, die zwei wellenförmige Grafiken auf dem Bildschirm zeigt + Οπτικοποίηση που εμφανίζει 2 Κυματομορφές στην οθόνη + Visualisation showing 2 Waveform Graphs on the screen + Visualisation showing 2 Waveform Graphs on the screen + Visualisation showing 2 Waveform Graphs on the screen + Visualization showing 2 Waveform Graphs on the screen + Visualización mostrando 2 gráficos de ondas en la pantalla + Visualización mostrando 2 gráficos de ondas en la pantalla + Visualización que muestra 2 Gráficos de Forma de onda + Visuaal, mis näitab ekraanil kahte signaalikujulist graafikut + یک مجسم ساز، که دو تصویر موج گونه را روی صفحه نمایش می دهد. + Kaksi aaltomuotograafia + Visualisation affichant à l'écran 2 graphes de forme d'onde + Visualisation affichant 2 graphiques de forme d'onde à l'écran + Visualización que amosa 2 gráficos en forma de onda na pantalla + חיזוי המציג שני גרפים בצורת גל על המסך + Vizualizacija koja prikazuje 2 valna grafikona + Vizualizáció két hullámformával + Visualisasi menampilkan dua grafik gelombang pada layar + Sjónræn upplifun sem sýnir 2 bylgjuform á skjánum + Visualizzatore che mostra 2 grafici di forma d'onda sullo schermo + 画面に2つの波形グラフを表示するビジュアライザー + 두개의 웨이브폼을 보여주는 음악시각화 + Vizualizacija kuri parodo dvi garso bangas + Vizualizācija, kas attēlo 2 viļņveida grafikus uz ekrāna + Визуализација која покажува 2 брана на екранот + Visual di skrin menunjukkan 2 graf gelombang + Visualisering som viser to bølgeformede grafer på skjermen + Visualisatie die twee grafieken in golfvorm weergeeft + Wizualizacja wyświetlająca 2 kanałowy Analizator Widma Akustycznego + Visualização que mostra 2 gráficos ondulantes + Visualização que mostra 2 gráficos em forma de onda no ecrã + Vizualizare care arată 2 grafice Waveform pe ecran + Визуализация, показывающая на экране 2 волновых графика + Vizualizácia zobrazujúca 2 grafy priebehu signálu + Vizualizacija zvoka z dvema valovnima oblikama + Vizualizim që shfaq 2 Grafikë Valëzues në ekran + Визуелизација која приказује два таласна облика на екрану + Visualisering som visar 2 vågformgrafer på skärmen + Wizualizacyjŏ, kerŏ pokŏzuje dwa welowe grafy na ekranie + Визуализатсия бо намоиши 2 нақши мавҷшакл дар экран + กำลังแสดงผลภาพเวอร์ชวลไลเซชั่น 'Waveform' เป็น 2 กราฟสัญญาณบนหน้าจอ + 2 Dalga Grafiğini ekranda gösteren görsel öğe + Візуалізація показує на екрані 2 лінії, що змінюються в такт з музикою. + Trình diễn đồ họa 2 đường sóng lên màn hình + 在屏幕上显示两个波形图的可视化效果 + 在屏幕上顯示2波形圖的視覺效果 + Golfvorm is 'n eenvoudige visualisering wat 2 golfvorm grafieke op die skerm vertoon, een elk vir Linker en Regter kanale wat beweeg op die maat van die musiek. + التشكيل الموجي هو تصوير بسيط يظهر2 رسم بياني موجي على الشاشة, واحد لقنوات اليسار و اليمين التر تتحرك على وقع الموسيقى + Waveform is a simple Visualization showing 2 Waveform Graphs on the screen, One each for Left and Right channels that move to the beat of the music + Waveform представя графика на две осцилиращи вълни на екрана, по една за всеки канал (ляв и десен), който реагират на ритъма на музиката. + Waveform és una visualització molt simple que mostra 2 gràfics en forma d'ona a la pantalla, un per a cada un dels canals, esquerre i dret, que es mouen al ritme de la música. + Průběh vlny je jednoduchá vizualizace zobrazující 2 grafy průběhu vlny na obrazovce, které znázorňují levý a pravý kanál a pohybují se v rytmu hudby + Delweddu syml yw Waveform sy'n dangos 2 Graff Ffurf Ton ar y sgrin. Un yr un ar gyfer y sianel de a chwith sy'n symud i guriad y gerddoriaeth + Waveform er en simpel visualisering, der viser 2 bølgeagtige grafer på skærmen. Én til den venstre og én til den højre kanal, der bevæger sig til musikkens rytme. + Waveform ist eine einfache Visualisierung, die zwei wellenförmige Grafiken zeigt. Je eine Grafik für den linken und rechten Kanal, die sich im Takt der Musik bewegen + Το Waveform είναι μία απλή Οπτικοποίηση του εμφανίζει 2 Κυματομορφές στην οθόνη, μία για το Αριστερό και μία για το Δεξί κανάλι οι οποίες κινούνται στο ρυθμό της μουσικής + Waveform is a simple Visualisation showing 2 Waveform Graphs on the screen, one each for Left and Right channels that move to the beat of the music + Waveform is a simple Visualisation showing 2 Waveform Graphs on the screen, One each for Left and Right channels that move to the beat of the music + Waveform is a simple Visualisation showing 2 Waveform Graphs on the screen, One each for Left and Right channels that move to the beat of the music + Waveform is a simple Visualization showing 2 Waveform Graphs on the screen, One each for Left and Right channels that move to the beat of the music + Waveform es un sencillo visualizador que muestra 2 gráficos de ondas en la pantalla, uno para cada canal, derecho e izquierdo, que se mueven al ritmo de la música. + Waveform es un sencillo visualizador que muestra 2 gráficos de ondas en la pantalla, uno para cada canal, derecho e izquierdo, que se mueven al ritmo de la música. + Waveform es una Visualización simple que muestra 2 Gráficos de Forma de onda en la pantalla, uno para cada canal Izquierdo y Derecho que se mueven al ritmo de la música + Waveform on lihtne visuaal, ekraanil on 2 signaalikujulist graafikut - üks vasaku ja teine parema kanali jaoks, mis mõlemad liiguvad muusika rütmis. + موج گونه یک مجسم ساز ساده است که 2 نمودار موج گونه را برای کانال چپ و راست روی صفحه نمایش می دهد. هر یک از این نمودارها با ضرباهنگ موسیقی حرکت می کنند. + Waveform on kaksi aaltomuotograafia näyttävä yksinkertainen visualisointi. Toinen on vasemmalle ja toinen oikealle kanavalla ja ne liikkuvat musiikin tahdissa. + Waveform est une visualisation simple affichant à l'écran 2 graphes en forme d'onde. Un pour le canal gauche et un pour le canal droit, qui réagissent au rythme de la musique. + Waveform est une visualisation simple affichant deux graphiques de forme d'onde à l'écran. Chaque forme d'onde représente une voie, gauche et droite, et réagit selon le rythme de la musique. + Waveform é unha Visualización simple que amosa 2 gráficos en forma de onda na súa pantalla, unha por cada canle correspondente á esquerda e a dereita que se move ó ritmo da música + החיזוי Waveform מציג שני גרפים בצורת גל על המסך, אחד לערוץ שמאלי ושני לימני הזזים לקצב המוזיקה + Waveform je jednostavna vizualizacija koja prikazuje 2 valna grafikona, po jedan za lijevi i desni kanal koji se pokreću u ritmu glazbe. + A Waveform egy egyszerű vizualizáció, amely 2db hullámot mutat reprezentálva a bal és a jobb hangcsatornákat, melyek a zene ritmusára mozognak. + Waveform adalah visualisasi sederhana yang menunjukkan grafik dua gelombang pada layar, masing-masing untuk Satu saluran Kiri dan Kanan yang bergerak dengan ketukan musik + Waweform er einföld sjónræn upplifun sem sýnir 2 bylgjuform á skjánum, eitt fyrir hægri rás og eitt fyrir vinstri, sem hreyfast í takt við tónlistina + Waveform è un semplice visualizzatore che mostra 2 grafici di forma d'onda sullo schermo, uno per il canale destro e uno per quello sinistro, che si muovono a ritmo di musica + Waveform は画面に2つの波形グラフを表示するシンプルなビジュアライザーです。音楽に合わせて、右チャンネル、左チャンネルの波形が表示されます。 + Waveform은 간단히 두개의 웨이브폼을 화면에 보여줍니다. 각각 왼쪽, 오른쪽 채널이고 음악의 비트에 따라 움직입니다. + Waveform yra paprasta vizualizacija katra rodo dvi garso bangas ekrane. Viena banga vieno kanalo garsas. + Waveform ir vienkārša vizualizācija, kas atēlo 2 viļņveida grafikus uz ekrāna, vienu - labajam, otru - kreisajam kanālam, kas kustās muzikas ritmā + Бранови е едноставна визуализација која покажува 2 брановидни графови на екран, по еден за десниот и левиот канал од музиката + Gelombang merupakan visual ringkas yang menunjukkan 2 graf gelombang, saluran kiri dan kanan yang bergerak mengikut rentak musik + Waveform er en enkel visualisering. Waveform viser to bølgeformede grafer på skjermen som beveger seg i takt med musikken. En for venstre og en for høyre lydkanal. + Waveform is een simpele muziekvisualisatie die twee golfvormen op het scherm toont, respectievelijk voor het linker- en rechtergeluidskanaal. De golfvormen bewegen mee met de beat van de muziek. + Prosty 2 kanałowy Analizator Widma Akustycznego, który porusza się w rytm muzyki, tworząc efekt fali w całym zakresie widma + O Waveform é um visualizador simples que mostra 2 gráficos ondulantes na tela, um para cada canal estéreo + O Waveform é uma visualização simples que mostra 2 Gráficos em forma de onda no ecrã. Um para cada canal estéreo que se movem ao ritmo da música + Waveform este o vizualizare simplă care arată 2 grafice în formă de undă pe ecran, câte unul pentru fiecare canal stâng și drept și care se mișcă după bătăile muzicii. + В этой визуализации отображаются 2 графика для левого и правого каналов, которые движутся в такт музыке + "Waveform" je jednoduchá vizualizácia zobrazujúca 2 grafy priebehu signálu pre pravý a ľavý kanál, pohybujúce sa v rytme hudby + Waveform je preprosta vizualizacija, ki prikazuje valovni obliki zvoka iz levega in desnega kanala, ki sledita ritmu glasbe + Valëzuesi është një Vizualizim i thjeshtë që shfaq 2 Grafikë Valëzues në ekran, nga Një për secilin kanal, të Majtë dhe të Djathtë, që lëvizin sipas ritmit të muzikës + Waveform är en enkel visualisering som visar 2 vågformgrafer på skärmen, en vardera för vänster och höger kanal som rör sig i takt med musiken. + Waveform to je ajnafowŏ wizualizacyjŏ, kerŏ pokŏzuje dwa welowe grafy na ekranie, po jednym dlŏ lewego i prawego kanału, a ôbie wele ruszajōm sie podle muzyki. + Waveform - визуализатсияи осонест, ки дар экран 2 нақши мавҷшаклро намоиш медиҳад, ду нақши алоҳида барои шабакаи чап ва рости ритми мусиқӣ + Waveform เป็นการแสดงผลภาพเวอร์ชวลไลเซชั่นพื้นฐานที่จะแสดงกราฟสัญญาณเสียง 2 กราฟบนหน้าจอ โดยเป็นกราฟสัญญาณเสียงซ้ายและขวาตามจังหวะของเพลง + Dalgaformu, müzik vuruşlarına göre biri sol biri sağ kanal olmak üzere 2 dalga grafiğini ekranda gösteren görsel öğedir. + Waveform є простою візуалізацією що показує 2 осцилограми на екрані. Кожна лінія відповідає своєму каналу і змінюється в такт з музикою. + Waveform là một màn trình diễn đồ họa đơn giản hiển thị 2 đường sóng lên màn hình, Mỗi đường sóng sẽ đại diện cho một kênh tín hiệu loa trái hoặc phải di chuyển theo nhịp điệu của bài hát + Waveform 是一个简单的可视化效果,它在屏幕上显示两个波形图,分别与音乐左右声道的节拍相呼应。 + Waveform是一個簡單的可在屏幕上顯示2波形圖的視覺效果,左右聲道會跟著音樂節拍移動 + all + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/addons/visualization.waveform/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/addons/visualization.waveform/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/addons/webinterface.default/addon.xml kodi-15.2~git20151019.1039-final/addons/webinterface.default/addon.xml --- kodi-16.1~git20160425.1001-final/addons/webinterface.default/addon.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/webinterface.default/addon.xml 2015-10-19 08:39:15.000000000 +0000 @@ -1,7 +1,7 @@  @@ -15,7 +15,7 @@ واجهه فريق إكس بي إم سي للشبكة العنكبوتية (واجهه الشبكة العنكبوتية المبدئية لـ إكس بي إم سي) Team-Kodi Web Interface. (Kodi's default web interface) Уеб интерфейс на Team-Kodi. (стандартният уеб интерфейс на Kodi) - Interfície web de l'equip Kodi. (la interfície web per defecte del Kodi) + Interfície web de l'equip Kodi. (Interficie web per defecte del Kodi) Webové rozhraní týmu Kodi (Výchozí webové rozhraní Kodi). Rhyngwyneb Gwe Team-Kodi (Rhyngwyneb gwe rhagosodedig Kodi) Team-Kodi Web-grænseflade. (Kodi's standard webgrænseflade) @@ -34,11 +34,11 @@ رابط وب تیم Kodi. (رابط وب استاندارد Kodi) Team-Kodi:n WWW-käyttöliittymä. (Kodi:n oletus WWW-käyttöliittymä) Interface Web de l'équipe-Kodi. (Interface Web par défaut d'Kodi) - Interface Web de l'Équipe-Kodi. (Interface Web par défaut de Kodi) - Interface web do equipo de Kodi. (Interface web predefinida de Kodi) + Interface Web de l'Équipe-Kodi. (Interface Web prédéfinie de Kodi) + Interface web da equipa de Kodi. (Interface web predefinida de Kodi) ממשק הדפדפן הרשמי של Kodi. (ברירת המחדל) Tim Kodi Web sučelje. (Kodijevo uobičajeno web sučelje) - A Kodi csapat Webes kezelőfelülete (Kodi alapértelmezett webes kezelőfelülete) + Az Kodi csapat Webes kezelőfelülete (Kodi alapértelmezett webes kezelőfelülete) Antar Muka Web Tim Kodi. (Antar muka web bawaan Kodi) Team-Kodi Vefviðmót. (Sjálfgefið vefviðmót á Kodi) Interfaccia Web del Team-Kodi. (Interfaccia web di default per Kodi) @@ -47,20 +47,19 @@ Komandos Kodi Web sąsaja.(Kodi numatytoji žiniatinklio sąsaja) Team-Kodi tīmekļa saskarne. (Kodi noklusētā tīmekļa saskarne) Веб интерфејс на Kodi тимот. (Kodi's подразбирачки веб интерфејс) - Antaramuka Sesawang Pasukan-Kodi (antaramuka sesawang lalai Kodi) - Web interface ta' Team-Kodi. (Il-Web interface normali ta' Kodi) + Antaramuka web kumpulan Kodi (antaramuka web lalai Kodi) Team-Kodi ဝက်ဘ် အသွင်အပြင် (Kodi ၏ မူရင် ဝက်ဘ် အသွင်အပြင်) Team-Kodi nettgrensesnitt. (Kodis standard nettgrensesnitt) Team-Kodi Webinterface. (Kodi's standaard webinterface) Interfejs webowy Kodi. (Domyślny) Interface Web da Equipe Kodi. (interface web padrão do Kodi) - Interface web da Team-Kodi. (Interface web padrão do Kodi) + Interface web da Team-Kodi. (Interface web predefinida do Kodi) Interfață web Kodi. (interfață web implicită pentru Kodi) Веб-интерфейс от разработчиков Kodi (веб-интерфейс Kodi по умолчанию). Webové rozhranie tímu Kodi. (predvolené webové rozhranie pre Kodi) Spletni vmesnik ekipe Kodi. (Privzet spletni vmesnik za Kodi) - Web интерфејс Kodi Тима (подразуевани web интерфејс Kodi-jа) - Web interfejs Kodi Tima (podrazuevani web interfejs Kodija) + Веб интерфејс од програмера Kodi-а (подразумевани веб интерфејс Kodi-а) + Web interfejs Kodi Tima (podrazuevani web interfejs Kodia) Team-Kodi webbgränsnitt. (Kodi's standardwebbgränssnitt) Webowy interfejs ôd Team-Kodi (wychodny webowy interface we Kodi). கோடி குழுமத்தின் இணைய இடைமுகம். (கோடியின் நிரந்தர இணைய இடைமுகம்) @@ -78,7 +77,7 @@ واجهه الشبكة العنكبوتية المبدئية لـ إكس بي إم سي، مُصمَمة لتناسب كافة قياسات أبعاد الشاشات Стандартны вэб-інтэрфэйс да Kodi; распрацаваны для прыладаў зь любымі разрознасьцямі Стандартния уеб интерфейс на Kodi; Направен е за устройства с най-различни резолюции - Interfície web per defecte del Kodi; Dissenyada per dispositius de totes les resolucions + Interfície web per defecte del Kodi; Dissenyada per dispositius de totes les resol·lucions Výchozí webové rozhraní Kodi navržené pro zařízení s libovolným rozlišením Rhyngwyneb gwe rhagosodedig Kodi. Wedi ei gynllunio ar gyfer cydraniad pob dyfais Standard webgrænseflade til Kodi; designet til enheder i alle opløsninger @@ -97,13 +96,13 @@ رابط استاندارد وب برای Kodi. قابل استفاده برای همه دستگاه ها و همه رزولوشن ها Oletus WWW-käyttöliittymä Kodi:lle. Suunniteltu käytettäväksi kaiken kokoisilla laitteilla. Interface Web par défaut d'Kodi - Conçue pour les dispositifs de toutes résolutions - Interface Web par défaut de Kodi ; adaptée aux appareils de toutes résolutions + Interface Web prédéfini de Kodi ; adaptée aux appareils de toutes résolutions Interface web predefinida para Kodi, deseñada para dispositivos de todas as resolucións ממשק דפדפן ברירת המחדל עבור Kodi; מותאם למכשירים בעלי אבחנות שונות Uobičajeno web sučelje za Kodi; Dizajnirano za uređaje svih razlučivosti - A Kodi alapértelmezett webes kezelőfelülete; Minden felbontásra alkalmas + Az Kodi alapértelmezett webes kezelőfelülete; Minden felbontásra alkalmas Նախնական տեսք Kodi-ի համար; Նախատեսված է բոլոր կրիչների համար - Antar muka web bawaan bagi Kodi; Dirancang untuk perangkat dengan semua resolusi + Antar muka web bawaan bagi Kodi; Dirancang bagi perangkat dengan semua resolusi Sjálfgefið vefviðmót fyrir Kodi; Hannað fyrir tæki með allskonar upplausnir Interfaccia Web di default per Kodi; Realizzata per periferiche con qualunque risoluzione Kodi のデフォルト Web インターフェースです。さまざまな解像度のデバイス用にデザインされています。 @@ -111,21 +110,20 @@ Numatytoji Kodi Web sąsaja skirta visų rezoliucijų prietaisams Noklusētā Kodi tīmekļa sakarne; Piemērota visu izšķirtspēju iekārtām Подразбирачки веб интерфејс за Kodi; Дизајниран за уреди со сите резолуции - Antaramuka sesawang lalai untuk Kodi; Direka untuk peranti pelbagai resolusi - Il-Web interface in-normali ta' Kodi; Iddiżinjata għal apparat ta' kull reżoluzzjoni + Antaramuka web lalai untuk Kodi; Di reka untuk peranti pelbagai resolusi Kodi အတွက် မူရင်း ဝက်ဘ် အသွင်ပြင် ၊ စက်များ အားလုံး၏ resolutions အတွက် ရေးဆွဲထားသည်။ Standard nettgrensesnitt for Kodi; Laget for alle oppløsninger Standaard Kodi-webinterface; geschikt voor alle resoluties Domyślny interfejs webowy Kodi; Zaprojektowany dla urządzeń o ekranach w dowolnej rozdzielczości Interface web padrão para Kodi; Concebida para dispositivos de todas as resoluções - Interface web padrão do Kodi. Criada para dispositivos de todas as resoluções. + Interface web predefinida do Kodi. Concebida para dispositivos de todas as resoluções Interfață web implicită pentru Kodi, realizată de echipa Kodi pentru dispozitive cu orice rezoluție. Веб-интерфейс Kodi по умолчанию. Разработан для устройств с любыми разрешениями. Kodi' සඳහා නියත වෙබ් අතුරුමුහුණත; සෑම විභේදනයකම උපකරණ සඳහා නිර්මාණය කර ඇත Predvolené webové rozhranie pre Kodi; Navrhnuté pre zariadenia zobrazujúce v akomkoľvek rozlíšení Privzet spletni vmesnik za Kodi, ustvarjen za naprave vseh ločljivosti - Подразумевани web интерфејс Kodi; Намењен уређајима свих резолуција - Podrazumevani web interfejs Kodi; Namenjen uređajima svih rezolucija + Подразумевани веб интерфејс Kodi-а, намењен уређајима свих резолуција + Podrazumevani web interfejs Kodia; Namenjen uređajima svih rezolucija Standardwebbgränssnitt för Kodi; Utformat för alla enheter oavsett skärmupplösning Wychodny webowy interface we Kodi. Zrychtowany dlŏ maszin we wszyjskich rozdziylczościach. கோடி இற்கான நிரந்தர இணைய இடைமுகம்; சகல சாதனங்களின் திரைகளுக்கும் வடிவமைக்கப்பட்டது diff -Nru kodi-16.1~git20160425.1001-final/addons/xbmc.gui/addon.xml kodi-15.2~git20151019.1039-final/addons/xbmc.gui/addon.xml --- kodi-16.1~git20160425.1001-final/addons/xbmc.gui/addon.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/xbmc.gui/addon.xml 2015-10-19 08:39:15.000000000 +0000 @@ -1,6 +1,6 @@ - - + + diff -Nru kodi-16.1~git20160425.1001-final/addons/xbmc.pvr/addon.xml kodi-15.2~git20151019.1039-final/addons/xbmc.pvr/addon.xml --- kodi-16.1~git20160425.1001-final/addons/xbmc.pvr/addon.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/xbmc.pvr/addon.xml 2015-10-19 08:39:15.000000000 +0000 @@ -1,6 +1,6 @@ - - + + diff -Nru kodi-16.1~git20160425.1001-final/addons/xbmc.python/addon.xml kodi-15.2~git20151019.1039-final/addons/xbmc.python/addon.xml --- kodi-16.1~git20160425.1001-final/addons/xbmc.python/addon.xml 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/xbmc.python/addon.xml 2015-10-19 08:39:15.000000000 +0000 @@ -1,5 +1,5 @@ - + diff -Nru kodi-16.1~git20160425.1001-final/addons/xbmc.python/contextitem.xsd kodi-15.2~git20151019.1039-final/addons/xbmc.python/contextitem.xsd --- kodi-16.1~git20160425.1001-final/addons/xbmc.python/contextitem.xsd 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/addons/xbmc.python/contextitem.xsd 2015-10-19 08:39:15.000000000 +0000 @@ -4,30 +4,26 @@ - + + + + + + + + + + + - - - - - - - - - - - - - - - + diff -Nru kodi-16.1~git20160425.1001-final/bootstrap.mk kodi-15.2~git20151019.1039-final/bootstrap.mk --- kodi-16.1~git20160425.1001-final/bootstrap.mk 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/bootstrap.mk 2015-10-19 08:39:15.000000000 +0000 @@ -1,4 +1,6 @@ BOOTSTRAP_SUBDIRS += configure.ac +BOOTSTRAP_SUBDIRS += xbmc/screensavers/rsxs-0.9/configure.ac +BOOTSTRAP_SUBDIRS += xbmc/visualizations/Goom/goom2k4-0/configure.ac BOOTSTRAP_SUBDIRS += lib/cpluff/configure.ac BOOTSTRAP_SUBDIRS += lib/gtest/configure.ac diff -Nru kodi-16.1~git20160425.1001-final/codegenerator.mk kodi-15.2~git20151019.1039-final/codegenerator.mk --- kodi-16.1~git20160425.1001-final/codegenerator.mk 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/codegenerator.mk 2015-10-19 08:39:15.000000000 +0000 @@ -27,7 +27,7 @@ endif GENDIR = $(INTERFACES_DIR)/python/generated -GROOVY_DIR = $(TOPDIR)/tools/codegenerator/groovy +GROOVY_DIR = $(TOPDIR)/lib/groovy GENERATED = $(GENDIR)/AddonModuleXbmc.cpp GENERATED += $(GENDIR)/AddonModuleXbmcgui.cpp @@ -42,9 +42,9 @@ $(GENDIR)/%.cpp: $(GENDIR)/%.xml $(JAVA) $(SWIG) $(DOXY_XML_PATH) # Work around potential groovy bug reported at: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=733234 - $(JAVA) -cp "$(GROOVY_DIR)/groovy-all-2.4.4.jar:$(GROOVY_DIR)/commons-lang-2.6.jar:$(TOPDIR)/tools/codegenerator:$(INTERFACES_DIR)/python" \ + $(JAVA) -cp "$(GROOVY_DIR)/groovy-all-2.1.7.jar:$(GROOVY_DIR)/commons-lang-2.6.jar:$(TOPDIR)/tools/codegenerator:$(INTERFACES_DIR)/python" \ org.codehaus.groovy.tools.FileSystemCompiler -d $(TOPDIR)/tools/codegenerator $(TOPDIR)/tools/codegenerator/Helper.groovy $(TOPDIR)/tools/codegenerator/SwigTypeParser.groovy $(INTERFACES_DIR)/python/MethodType.groovy $(INTERFACES_DIR)/python/PythonTools.groovy - $(JAVA) -cp "$(GROOVY_DIR)/groovy-all-2.4.4.jar:$(GROOVY_DIR)/commons-lang-2.6.jar:$(TOPDIR)/tools/codegenerator:$(INTERFACES_DIR)/python" \ + $(JAVA) -cp "$(GROOVY_DIR)/groovy-all-2.1.7.jar:$(GROOVY_DIR)/commons-lang-2.6.jar:$(TOPDIR)/tools/codegenerator:$(INTERFACES_DIR)/python" \ groovy.ui.GroovyMain $(TOPDIR)/tools/codegenerator/Generator.groovy $< $(INTERFACES_DIR)/python/PythonSwig.cpp.template $@ $(DOXY_XML_PATH) rm $< diff -Nru kodi-16.1~git20160425.1001-final/configure.ac kodi-15.2~git20151019.1039-final/configure.ac --- kodi-16.1~git20160425.1001-final/configure.ac 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/configure.ac 2015-10-19 08:39:15.000000000 +0000 @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT([kodi], [16.1.000], [http://trac.kodi.tv]) +AC_INIT([kodi], [15.2.000], [http://trac.kodi.tv]) AC_CONFIG_HEADERS([xbmc/config.h]) AH_TOP([#pragma once]) m4_include([m4/ax_prog_cc_for_build.m4]) @@ -170,8 +170,20 @@ missing_library="Could not find a required library. Please see the README for your platform." missing_headers="Could not find some required headers. Please see the README for your platform." missing_program="Could not find a required program. Please see the README for your platform." +waveform_enabled="== WAVEFORM enabled ==" +waveform_disabled="== WAVEFORM disabled ==" +spectrum_enabled="== SPECTRUM enabled ==" +spectrum_disabled="== SPECTRUM disabled ==" +goom_enabled="== GOOM enabled. ==" +goom_disabled="== GOOM disabled. ==" alsa_disabled="== ALSA support disabled. ==" dbus_disabled="== DBUS support disabled. ==" +rsxs_enabled="== RSXS enabled. ==" +rsxs_disabled="== RSXS disabled. ==" +fishbmc_enabled="== FishBMC enabled. ==" +fishbmc_disabled="== FishBMC disabled. ==" +projectm_enabled="== ProjectM enabled. ==" +projectm_disabled="== ProjectM disabled. ==" wayland_enabled="== Wayland enabled. ==" wayland_disabled="== Wayland disabled. ==" x11_enabled="== X11 enabled. ==" @@ -198,8 +210,6 @@ librtmp_disabled="== RTMP support disabled. ==" libnfs_not_found="== Could not find libnfs. NFS client support disabled. ==" libnfs_disabled="== NFS support disabled. ==" -libgif_not_found="== Could not find libgif. libgif support disabled. ==" -libgif_disabled="== libgif support disabled. ==" libshairplay_not_found="== Could not find libshairplay. ==" samba_disabled="== SAMBA support disabled. ==" libplist_not_found="== Could not find libplist. AirPlay support disabled. ==" @@ -306,6 +316,42 @@ [use_joystick=$enableval], [use_joystick=auto]) +AC_ARG_ENABLE([waveform], + [AS_HELP_STRING([--enable-waveform], + [enable Waveform visualisation (default is yes)])], + [use_waveform=$enableval], + [use_waveform=yes]) + +AC_ARG_ENABLE([spectrum], + [AS_HELP_STRING([--enable-spectrum], + [enable Spectrum visualisation (default is yes)])], + [use_spectrum=$enableval], + [use_spectrum=yes]) + +AC_ARG_ENABLE([goom], + [AS_HELP_STRING([--enable-goom], + [enable GOOM visualisation (default is no)])], + [use_goom=$enableval], + [use_goom=no]) + +AC_ARG_ENABLE([rsxs], + [AS_HELP_STRING([--enable-rsxs], + [enable really slick X screensavers (default is yes)])], + [use_rsxs=$enableval], + [use_rsxs=yes]) + +AC_ARG_ENABLE([fishbmc], + [AS_HELP_STRING([--enable-fishbmc], + [enable FishBMC visualisation (default is yes)])], + [use_fishbmc=$enableval], + [use_fishbmc=yes]) + +AC_ARG_ENABLE([projectm], + [AS_HELP_STRING([--enable-projectm], + [enable ProjectM visualisation (default is yes)])], + [use_projectm=$enableval], + [use_projectm=yes]) + AC_ARG_ENABLE([wayland], [AS_HELP_STRING([--enable-wayland], [enable wayland (default is no) 'Linux Only'])], @@ -366,12 +412,6 @@ [use_libnfs=$enableval], [use_libnfs=auto]) -AC_ARG_ENABLE([gif], - [AS_HELP_STRING([--enable-gif], - [enable gif support via libgif (default is auto)])], - [use_libgif=$enableval], - [use_libgif=auto]) - AC_ARG_ENABLE([airplay], [AS_HELP_STRING([--enable-airplay], [enable AirPlay support(default is auto)])], @@ -565,7 +605,6 @@ build_shared_lib=yes ;; i*86*-linux-gnu*|i*86*-*-linux-uclibc*) - target_platform=target_linux ARCH="i486-linux" if test "$use_cpu" = "no" -a "$cross_compiling" = "yes"; then use_arch="x86" @@ -587,7 +626,6 @@ fi ;; x86_64-*-linux-gnu*|x86_64-*-linux-uclibc*) - target_platform=target_linux ARCH="x86_64-linux" if test "$use_cpu" = "no" -a "$cross_compiling" = "yes"; then use_arch="x86_64" @@ -596,12 +634,10 @@ USE_STATIC_FFMPEG=1 ;; i386-*-freebsd*) - target_platform=target_linux ARCH="x86-freebsd" MAKE="gmake" ;; amd64-*-freebsd*) - target_platform=target_linux ARCH="x86_64-freebsd" MAKE="gmake" ;; @@ -646,7 +682,6 @@ ARCH="powerpc64-linux" ;; arm*-*-linux-gnu*|arm*-*-linux-uclibc*) - target_platform=target_linux ARCH="arm" use_arch="arm" use_joystick=no @@ -670,7 +705,6 @@ build_shared_lib=yes ;; mips*-*-linux-gnu*) - target_platform=target_linux ARCH="mips" use_arch="mips" use_joystick=no @@ -685,6 +719,18 @@ esac AC_SUBST([ARCH]) +case $host in + *-apple-darwin*) + check_sdl_arch=[`file $NATIVE_ROOT/lib/libSDL_image.dylib | awk '{print $NF}'`] + if test "x$check_sdl_arch" = "xi386" ; then + DARWIN_NATIVE_ARCH=-m32 + elif test "x$check_sdl_arch" = "xx86_64" ; then + DARWIN_NATIVE_ARCH=-m64 + fi + ;; +esac +AC_SUBST([DARWIN_NATIVE_ARCH]) + if test "$target_platform" = "target_android" ; then USE_ANDROID=1 webserver_checkdepends=yes @@ -715,6 +761,7 @@ use_avahi=no use_alsa=no use_openmax=no + use_goom=no use_libudev=no use_libusb=no use_x11=no @@ -800,9 +847,6 @@ LIBS="$LIBS -framework QuartzCore" LIBS="$LIBS -framework SystemConfiguration" LIBS="$LIBS -framework VideoDecodeAcceleration" - else - #arm/ios - LIBS="$LIBS -framework CoreFoundation" fi elif test "$target_platform" = "target_raspberry_pi"; then ARCH="arm" @@ -911,6 +955,9 @@ AC_CHECK_SIZEOF([wchar_t]) AC_LANG_POP([C++]) +# Add top source directory for all builds so we can use config.h +INCLUDES="-I\$(abs_top_srcdir) $INCLUDES" + # Check inotify availability AC_CHECK_HEADER([sys/inotify.h], AC_DEFINE([HAVE_INOTIFY],[1],[Define if we have inotify]),) @@ -1052,7 +1099,6 @@ AC_CHECK_HEADER([jpeglib.h],, AC_MSG_ERROR($missing_library)) AC_CHECK_HEADER([ogg/ogg.h],, AC_MSG_ERROR($missing_library)) AC_CHECK_HEADER([vorbis/vorbisfile.h],, AC_MSG_ERROR($missing_library)) -PKG_CHECK_MODULES([LIBDCADEC], [dcadec],, AC_MSG_ERROR([libdcadec not found])) PKG_CHECK_MODULES([LIBCURL], [libcurl],, AC_MSG_ERROR([libcurl not found])) XB_FIND_SONAME([CURL], [curl]) @@ -1122,23 +1168,6 @@ )]) AC_LANG_POP([C++]) -if test "${target_platform}" = "target_linux" || test "${target_platform}" = "target_raspberry_pi" || test "${target_platform}" = "target_android"; then - PKG_CHECK_MODULES([UUID], [uuid],, AC_MSG_ERROR(libuuid not found)) -fi - -AC_MSG_CHECKING("for libcrossguid") -AC_LANG_PUSH([C++]) -SAVED_LIBS="$LIBS" -LIBS="$LIBS -lcrossguid $UUID_LIBS" -AC_LINK_IFELSE( - [AC_LANG_PROGRAM( - [#include ], - [Guid dummy])], - [AC_MSG_RESULT(yes); SAVED_LIBS="$SAVED_LIBS $LDFLAGS -lcrossguid $UUID_LIBS"], - [AC_MSG_ERROR(crossguid not found)]) -LIBS="$SAVED_LIBS" -AC_LANG_POP([C++]) - PKG_CHECK_MODULES([YAJL], [yajl >= 2], [INCLUDES="$INCLUDES $YAJL_CFLAGS"; LIBS="$LIBS $YAJL_LIBS"; YAJL_FOUND="true"], [AC_COMPILE_IFELSE( @@ -1205,16 +1234,16 @@ # check for libbluray AS_CASE([x$use_libbluray], [xyes],[ - PKG_CHECK_MODULES([LIBBLURAY],[libbluray >= 0.7.0],[use_libbluray="yes"], AC_MSG_ERROR($missing_library)) + PKG_CHECK_MODULES([LIBBLURAY],[libbluray >= 0.2.1],[use_libbluray="yes"], AC_MSG_ERROR($missing_library)) ], [xauto],[ - PKG_CHECK_MODULES([LIBBLURAY],[libbluray >= 0.7.0],[use_libbluray="yes"], [use_libbluray="no"]) + PKG_CHECK_MODULES([LIBBLURAY],[libbluray >= 0.2.1],[use_libbluray="yes"], [use_libbluray="no"]) ]) AS_CASE([x$use_libbluray], [xyes],[ INCLUDES="$INCLUDES $LIBBLURAY_CFLAGS"; - LIBBLURAY_LIB_BASENAME=`$PKG_CONFIG --libs-only-L "libbluray >= 0.7.0"`; + LIBBLURAY_LIB_BASENAME=`$PKG_CONFIG --libs-only-L "libbluray >= 0.2.1"`; XB_FIND_SONAME([BLURAY], [bluray], [use_libbluray], [$LIBBLURAY_LIB_BASENAME]) AC_DEFINE([HAVE_LIBBLURAY], 1, [System has libbluray library]) AC_SUBST([HAVE_LIBBLURAY], 1) @@ -1240,7 +1269,7 @@ if test "$use_arch" != "arm"; then AC_CHECK_LIB([SDL], [main],, AC_MSG_ERROR($missing_library)) AC_DEFINE([HAVE_SDL],[1],["Define to 1 if using sdl"]) - AC_DEFINE([HAVE_SDL_VERSION],[1],["SDL major version"]) + AC_DEFINE([SDL_VERSION],[1],["SDL major version"]) fi else if test "$target_platform" != "target_android" ; then @@ -1263,7 +1292,7 @@ # joystick if test "$use_joystick" != "no"; then PKG_CHECK_MODULES([SDL2], [sdl2], - [AC_DEFINE([HAVE_SDL_VERSION],[2],["SDL major version"]) + [AC_DEFINE([SDL_VERSION],[2],["SDL major version"]) AC_DEFINE([HAVE_SDL],[1],["Define to 1 if using sdl"]) INCLUDES="$INCLUDES $SDL2_CFLAGS"; LIBS="$LIBS $SDL2_LIBS"; use_joystick="yes"], [if test "$use_joystick" = "yes"; then @@ -1278,6 +1307,9 @@ fi fi +XB_FIND_SONAME([OGG], [ogg]) +XB_FIND_SONAME([VORBIS], [vorbis]) +XB_FIND_SONAME([VORBISFILE], [vorbisfile]) XB_FIND_SONAME([ASS], [ass]) XB_FIND_SONAME([MPEG2], [mpeg2]) @@ -1386,6 +1418,71 @@ AC_MSG_RESULT($x11_disabled) fi +# WAVEFORM +if test "$use_waveform" = "yes"; then + AC_MSG_NOTICE($waveform_enabled) + DISABLE_WAVEFORM=0 +else + AC_MSG_NOTICE($waveform_disabled) + DISABLE_WAVEFORM=1 +fi + +# SPECTRUM +if test "$use_spectrum" = "yes"; then + AC_MSG_NOTICE($spectrum_enabled) + DISABLE_SPECTRUM=0 +else + AC_MSG_NOTICE($spectrum_disabled) + DISABLE_SPECTRUM=1 +fi + +# GOOM +if test "$use_goom" = "yes" && test "$use_gl" = "yes"; then + AC_MSG_NOTICE($goom_enabled) + DISABLE_GOOM=0 +else + AC_MSG_NOTICE($goom_disabled) + DISABLE_GOOM=1 +fi + +# RSXS +if test "$use_rsxs" = "no" || test "$use_gl" = "no"; then + AC_MSG_NOTICE($rsxs_disabled) + DISABLE_RSXS=1 +else + AC_MSG_NOTICE($rsxs_enabled) + DISABLE_RSXS=0 + # darwin osx can do rsxs but does not use x11, so do not pkg-config check for them + if test "$host_vendor" != "apple" ; then + PKG_CHECK_MODULES([XT], [xt], + [INCLUDES="$INCLUDES $XT_CFLAGS"; LIBS="$LIBS $XT_LIBS"], + AC_MSG_ERROR($missing_library)) + PKG_CHECK_MODULES([XMU], [xmu], + [INCLUDES="$INCLUDES $XMU_CFLAGS"; LIBS="$LIBS $XMU_LIBS"], + AC_MSG_ERROR($missing_library)) + fi +fi + +# FISHBMC +if test "$use_fishbmc" = "no" || test "$use_gl" = "no"; then + AC_MSG_NOTICE($fishbmc_disabled) + DISABLE_FISHBMC=1 + use_fishbmc="no" +else + AC_MSG_NOTICE($fishbmc_enabled) + DISABLE_FISHBMC=0 +fi + +# PROJECTM +if test "$use_projectm" = "no" || test "$use_gl" = "no"; then + AC_MSG_NOTICE($projectm_disabled) + DISABLE_PROJECTM=1 + use_projectm="no" +else + AC_MSG_NOTICE($projectm_enabled) + DISABLE_PROJECTM=0 +fi + # touch skin use_touch_skin=no if [[ -f "addons/skin.re-touched/addon.xml" ]]; then @@ -1467,29 +1564,6 @@ AC_MSG_NOTICE($libnfs_disabled) fi -# libgif -if test "$use_libgif" != "no"; then - AC_CHECK_HEADERS([gif_lib.h],, - [if test "$use_libgif" = "yes"; then - AC_MSG_ERROR($libgif_not_found) - USE_LIBGIF=0 - elif test "$use_libgif" != "no"; then - AC_MSG_NOTICE($libgif_not_found) - use_libgif="no" - USE_LIBGIF=0 - fi - ]) - if test "$use_libgif" != "no"; then - XB_FIND_SONAME([GIF], [gif], [use_libgif]) - fi - if test "$use_libgif" != "no"; then - AC_DEFINE([HAVE_LIBGIF], [1], [Whether to use libgif library.]) - USE_LIBGIF=1 - fi -else - USE_LIBGIF=0 - AC_MSG_NOTICE($libgif_disabled) -fi # libplist for airplay feature USE_AIRPLAY=0 @@ -1519,10 +1593,9 @@ if test "x$USE_AIRTUNES" != "x0"; then XB_FIND_SONAME([SHAIRPLAY], [shairplay], [USE_AIRTUNES]) - AC_CHECK_MEMBERS([struct raop_callbacks_s.audio_remote_control_id], - AC_DEFINE([HAVE_LIBSHAIRPLAY],[1],["Define to 1 if you have libshairplay."]), - USE_AIRTUNES=0, + AC_CHECK_MEMBERS([struct raop_callbacks_s.cls],,, [[#include ]]) + AC_DEFINE([HAVE_LIBSHAIRPLAY],[1],["Define to 1 if you have libshairplay."]) fi if test "x$USE_AIRTUNES" == "x0"; then @@ -1714,7 +1787,6 @@ FFMPEG_LIBDIR=${pkg_cfg_prefix}$(PKG_CONFIG_SYSROOT_DIR="" ${PKG_CONFIG} --static --variable=libdir libavcodec) GNUTLS_ALL_LIBS=$(${PKG_CONFIG} --static --libs-only-l --silence-errors gnutls) VORBISENC_ALL_LIBS=$(${PKG_CONFIG} --static --libs-only-l --silence-errors vorbisenc) - DCADEC_ALL_LIBS=$(${PKG_CONFIG} --static --libs-only-l --silence-errors dcadec) # check if static libs are available for ff_lib in ${ff_libs}; do @@ -2034,6 +2106,42 @@ final_message="$final_message\n Joystick:\tNo" fi +if test "$use_waveform" = "yes"; then + final_message="$final_message\n Waveform:\tYes" +else + final_message="$final_message\n Waveform:\tNo" +fi + +if test "$use_spectrum" = "yes"; then + final_message="$final_message\n Spectrum:\tYes" +else + final_message="$final_message\n Spectrum:\tNo" +fi + +if test "$use_goom" = "yes"; then + final_message="$final_message\n GOOM:\t\tYes" +else + final_message="$final_message\n GOOM:\t\tNo" +fi + +if test "$use_rsxs" = "yes"; then + final_message="$final_message\n RSXS:\t\tYes" +else + final_message="$final_message\n RSXS:\t\tNo" +fi + +if test "$use_fishbmc" = "yes"; then + final_message="$final_message\n FishBMC:\tYes" +else + final_message="$final_message\n FishBMC:\tNo" +fi + +if test "$use_projectm" = "yes"; then + final_message="$final_message\n ProjectM:\tYes" +else + final_message="$final_message\n ProjectM:\tNo" +fi + if test "$use_touch_skin" = "yes"; then final_message="$final_message\n Touch skin:\tYes" else @@ -2261,12 +2369,6 @@ final_message="$final_message\n libnfs client support:No" fi -if test "$use_libgif" != "no"; then - final_message="$final_message\n libgif support:\tYes" -else - final_message="$final_message\n libgif support:\tNo" -fi - if test "$use_airplay" != "no"; then final_message="$final_message\n AirPlay support:\tYes" else @@ -2367,16 +2469,15 @@ xbmc/cores/paplayer/Makefile \ xbmc/cores/omxplayer/Makefile \ xbmc/cores/playercorefactory/Makefile \ - xbmc/messaging/Makefile \ - xbmc/messaging/helpers/Makefile \ + xbmc/music/karaoke/Makefile \ xbmc/osx/Makefile \ xbmc/guilib/Makefile \ xbmc/input/linux/Makefile \ xbmc/interfaces/Makefile \ - xbmc/interfaces/builtins/Makefile \ xbmc/network/Makefile \ xbmc/network/upnp/Makefile \ lib/libexif/Makefile \ + lib/libhdhomerun/Makefile \ lib/cximage-6.0/Makefile \ lib/libUPnP/Makefile \ xbmc/DllPaths_generated.h \ @@ -2384,14 +2485,19 @@ xbmc/freebsd/Makefile \ xbmc/linux/Makefile \ xbmc/filesystem/Makefile \ + xbmc/screensavers/rsxs-0.9/xbmc/Makefile \ + xbmc/visualizations/XBMCProjectM/Makefile \ + xbmc/visualizations/Goom/Makefile \ + xbmc/visualizations/OpenGLSpectrum/Makefile \ + xbmc/visualizations/fishBMC/Makefile \ + xbmc/visualizations/WaveForm/Makefile \ xbmc/windowing/Makefile \ xbmc/windowing/egl/Makefile \ lib/addons/library.xbmc.addon/Makefile \ - lib/addons/library.kodi.adsp/Makefile \ - lib/addons/library.kodi.audioengine/Makefile \ lib/addons/library.xbmc.codec/Makefile \ lib/addons/library.kodi.guilib/Makefile \ lib/addons/library.xbmc.pvr/Makefile \ + xbmc/visualizations/EGLHelpers/Makefile \ tools/Linux/${APP_NAME_LC}.sh \ tools/Linux/${APP_NAME_LC}-standalone.sh \ tools/Linux/${APP_NAME_LC}-xsession.desktop \ @@ -2404,14 +2510,16 @@ xbmc/android/jni/Makefile \ xbmc/utils/Makefile \ xbmc/main/Makefile \ - xbmc/main/posix/Makefile \ tools/darwin/Configurations/App.xcconfig \ tools/darwin/Configurations/Common.xcconfig \ tools/darwin/packaging/ios/mkdeb-ios.sh \ + tools/darwin/packaging/atv2/mkdeb-atv2.sh \ tools/darwin/packaging/osx/mkdmg-osx.sh \ tools/darwin/packaging/migrate_to_kodi_ios.sh \ + tools/darwin/packaging/seatbeltunlock/mkdeb-seatbeltunlock.sh \ xbmc/osx/Info.plist \ xbmc/osx/ios/XBMCIOS-Info.plist \ + xbmc/osx/atv2/XBMCATV2-Info.plist \ project/cmake/kodi-config.cmake \ project/cmake/xbmc-config.cmake \ tools/android/packaging/xbmc/AndroidManifest.xml \ @@ -2422,8 +2530,6 @@ tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnFrameAvailableListener.java \ tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCSettingsContentObserver.java \ tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java \ - tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java \ - tools/android/packaging/xbmc/activity_main.xml \ tools/android/packaging/xbmc/strings.xml \ addons/xbmc.addon/addon.xml" @@ -2485,11 +2591,16 @@ AC_SUBST(LDFLAGS_FOR_BUILD) AC_SUBST(SDL_DEFINES) AC_SUBST(BUILD_DVDCSS) +AC_SUBST(DISABLE_WAVEFORM) +AC_SUBST(DISABLE_SPECTRUM) +AC_SUBST(DISABLE_GOOM) +AC_SUBST(DISABLE_RSXS) +AC_SUBST(DISABLE_FISHBMC) +AC_SUBST(DISABLE_PROJECTM) AC_SUBST(FFMPEG_LIBDIR) AC_SUBST(USE_STATIC_FFMPEG) AC_SUBST(GNUTLS_ALL_LIBS) AC_SUBST(VORBISENC_ALL_LIBS) -AC_SUBST(DCADEC_ALL_LIBS) AC_SUBST(USE_TOUCH_SKIN) AC_SUBST(USE_LIBAV_HACKS) AC_SUBST(PYTHON_VERSION) @@ -2509,7 +2620,6 @@ AC_SUBST(USE_VAAPI) AC_SUBST(USE_LIBSMBCLIENT) AC_SUBST(USE_LIBNFS) -AC_SUBST(USE_LIBGIF) AC_SUBST(USE_AIRPLAY) AC_SUBST(USE_OPENMAX) AC_SUBST(USE_PULSE) @@ -2631,6 +2741,78 @@ --cc="$CC" ], [0]) +XB_CONFIG_MODULE([xbmc/visualizations/XBMCProjectM/libprojectM],[ + set -x + rm -f CMakeCache.txt && \ + CC="$ORIGCC" CXX="$ORIGCXX" LDFLAGS="$LDFLAGS" cmake \ + -DCMAKE_BUILD_TYPE=None -DUSE_FTGL:BOOL=OFF \ + -DCMAKE_C_FLAGS:STRING="${CPPFLAGS} ${CFLAGS}" \ + -DCMAKE_CXX_FLAGS:STRING="${CPPFLAGS} ${CXXFLAGS}" \ + -DCMAKE_INSTALL_PREFIX="${prefix}" \ + -DCMAKE_INSTALL_LIBDIR:PATH="${libdir}" \ + -DINCLUDE_INSTALL_DIR:PATH="${includedir}" \ + -DLIB_INSTALL_DIR:PATH="${libdir}" \ + -DSYSCONF_INSTALL_DIR:PATH="${sysconfdir}" \ + -DSHARE_INSTALL_PREFIX:PATH="${datadir}" . && + if test "$host_vendor" = "apple" ; then + # cmake has hardcoded paths to macports which bork our darwin depends cross/ppc, remove them + sed -ie "s|-L/opt/local/lib| |" CMakeFiles/projectM.dir/link.txt + sed -ie "s|-L/opt/local/lib| |" CMakeFiles/projectM.dir/flags.make + sed -ie "s|-I/opt/local/include| |" CMakeFiles/projectM.dir/flags.make + fi + set +x +], [$DISABLE_PROJECTM]) + +XB_CONFIG_MODULE([xbmc/visualizations/Goom/goom2k4-0],[ + ./configure \ + CFLAGS="$CFLAGS" \ + CXXFLAGS="$CXXFLAGS" \ + --prefix="${prefix}" --includedir="${includedir}" --libdir="${libdir}" --datadir="${datadir}" \ + --host=$host_alias \ + --build=$build_alias \ + --target=$target_alias \ + --disable-shared \ + --enable-static \ + --with-pic +], [$DISABLE_GOOM]) + +XB_CONFIG_MODULE([xbmc/screensavers/rsxs-0.9/], [ + if test "$host_vendor" = "apple"; then + # clang treats inlines different + case $CC in + *clang*) + TEMPCFLAGS="$CFLAGS";; + *) + TEMPCFLAGS="${CFLAGS} -fgnu89-inline";; + esac + else + TEMPCFLAGS="$CFLAGS"; + fi + ./configure \ + CC="$CC" \ + CXX="$CXX" \ + CFLAGS="$TEMPCFLAGS" \ + CXXFLAGS="$CXXFLAGS" \ + `if test "$host_vendor" = "apple"; then echo --with-png=${prefix} --x-includes=/usr/X11/include --x-libraries=/usr/X11/lib; fi` \ + --prefix="${prefix}" --includedir="${includedir}" --libdir="${libdir}" --datadir="${datadir}" \ + --host=$host_alias \ + --build=$build_alias \ + --target=$target_alias \ + --without-xscreensaver \ + --disable-sound \ + --disable-cyclone \ + --disable-fieldlines \ + --disable-flocks \ + --disable-flux \ + --disable-helios \ + --disable-hyperspace \ + --disable-lattice \ + --disable-skyrocket + if echo "$ARCH" | grep -q freebsd ; then + sed -i.back "s;\(STDBOOL_H = \)stdbool.h;\1;" lib/Makefile + fi +], [$DISABLE_RSXS]) + XB_CONFIG_MODULE([lib/cpluff], [ ./configure --disable-nls \ --prefix="${prefix}" --includedir="${includedir}" --libdir="${libdir}" --datadir="${datadir}" \ diff -Nru kodi-16.1~git20160425.1001-final/debian/changelog kodi-15.2~git20151019.1039-final/debian/changelog --- kodi-16.1~git20160425.1001-final/debian/changelog 2016-04-25 08:02:54.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/debian/changelog 2015-10-19 09:11:01.000000000 +0000 @@ -1,1723 +1,29523 @@ -kodi (2:16.1~git20160425.1001-final-0xenial) xenial; urgency=high +kodi (2:15.2~git20151019.1039-final-0trusty) trusty; urgency=high - [HerbFargus] - * Add xboxdrv name for xbox keymap + [Matthias Kortstiege] + * [guilib] enable onfocus/onunfocus actions for base containers + + [Rainer Hochecker] + * remove dependency from Unrar lib to GUIWindowManager + + [ronie] + * drop tvtunes support + + [Matthias Kortstiege] + * [texture] redact username/password when texture loading fails + + [Thomas Amland] + * [addons] dont redirect to download dir on update all. already shows progress + + [Thomas Amland] + * [addons] remove unused methods and database column for blacklisting + + [Thomas Amland] + * [addons] refactor GetAllOutdatedAddons + + [Thomas Amland] + * [addons] dont hide available updates for blacklisted addons + + [Thomas Amland] + * [addons] add caching of blacklisted addons via addon manager + + [Sascha Kuehndel (InuSasha)] + * [guilib] add override onclick to dynamic content lists + + [Chris "koying" Browet] + * FIX: [droid] use context resolution when recreating window + + [Rainer Hochecker] + * OSX: remove ifdef from platform agnostic code + + [Matthias Kortstiege] + * [eventserver] logging once when starting is enough + + [Matthias Kortstiege] + * [webserver] logging once about starting/stopping is enough + + [Kai Sommerfeld] + * [PVR] Activate PVR windows only if PVR is enabled + + [Kolja Lampe] + * Fix tests after removal of atv2 See: #8181 + + [Leonidas Kosmidis] + * Save last eglConfig to m_eglConfig and reuse it wherever is possible + + [Kolja Lampe] + * [music] Aligned music userrating frontend to the new way we do it in the video library + + [Kolja Lampe] + * [confluence] Add user rating item to list and add a button for setting the user rating of this item + + [Kolja Lampe] + * [video] Enable editing of userrating from the frontend via increase/decrease and update video info and listings accordingly + + [Stefan Saraev] + * [Confluence] on left/right fixup after #8222 + + [Kai Sommerfeld] + * [PVR] Fix search window init regression + + [Garrett Brown] + * [win32] Fix VS project after #8212 + + [Matthias Kortstiege] + * [guilib] add ability to visualize controls hitrects + + [Garrett Brown] + * [addonlib] Fixed: labelenum setting should be a string instead of int + + [Garrett Brown] + * [dllLoader] Fix segfault if high-order word is zero + + [Garrett Brown] + * [vfs] Fix crash when entering zip:// URLs with unknown zip file size + + [Garrett Brown] + * [guilib] Notify parent control when focus is lost due to mouse event + + [Garrett Brown] + * [addons] Build library path in CAddon instead of CAddonDll + + [Garrett Brown] + * [binary addons] Allow overriding install paths + + [Garrett Brown] + * [addons] Move resource cleanup to parent class + + [Garrett Brown] + * [python] Fix listing of protocol root + + [Garrett Brown] + * [cleanup] Move string alias to outer block + + [Garrett Brown] + * [cleanup] Move local variable to the stack in PluginDirectory.cpp + + [Garrett Brown] + * [utils] Add missing const null check to CVariant move assignment operator + + [Kai Sommerfeld] + * [Confluence] Add 'Events' to Home screen's 'System' submenu. + + [Kai Sommerfeld] + * [pvr] context menu changes: remove 'Add to favourites' for timers and EPG events + + [Chris "koying" Browet] + * FIX: [droid;amc] fix WMV3/VC1 + + [Sam Stenvall] + * [pvr] fix playback of recordings when an exact duplicate exists. This happens if one for some reason records a show twice, stopping in between (which creates two separate recordings) + + [Chris "Koying" Browet] + * ADD: [droid] VP9 + decouple VC1/WMV + + [montellese] + * [win32][binary addons] bootstrap-addons.bat: fix typo in NULL instead of NUL + + [montellese] + * [binary addons] fix handling of PACKAGE_DIR argument + + [montellese] + * [binary addons] fix typo in log message + + [Sean Kelly] + * Minor cleanup to match naming convention in video database + + [Cole Johnson] + * Show BluRay media flag for `brrip` + + [Kolja Lampe] + * Make sortorder descending default for lastPlayed + + [Kolja Lampe] + * Removed label2 and show value that is sorted by or fall back to duration. Add lastPlayed sortorder for music + + [fritsch] + * FFmpeg: Bump to 2.8.1-Jarvis-alpha4-HEVC + + [DaveTBlake] + * Tidy up CAlbum creator use of albumartist + + [Kai Sommerfeld] + * [pvr] context menu changes: use 'Record'/'Stop recording' in a consistent way + + [Kai Sommerfeld] + * [pvr] context menu changes: 'Add timer' => 'Record', 'Add custom timer' => 'Add timer' + + [Anton Fedchin] + * [d3d11] Fixed segfault if device was lost. Also this adds trying to restore device if it was lost. + + [DaveTBlake] + * Use GetArtistString() methods to replace Join/m_musicItemSeparator approach in various places. + + [Arne Morten Kvarving] + * changed: enable ffmpeg tag reader for dsf files + + [Arne Morten Kvarving] + * added: use FFmpeg tag loader for .mka files + + [Arne Morten Kvarving] + * added: FFmpeg based tag loader + + [xhaggi] + * [gui] fix missing path param in CGUIDialog::Open() after 447ec5b + + [DaveTBlake] + * Remove artist vector from song + + [Arne Morten Kvarving] + * changed: move ffmpeg read buffer definition so it is reusable + + [un1versal] + * [Readme] Useful links, add bug tracker link + + [Michał Kępień] + * Strip trailing newlines from URLs in NFO files for cURL 7.40+ compatibility + + [Montellese] + * CGUIDialogSelect: clear the view control before it is saved in CGUIWindow::OnDeinitWindow() to be able to properly reset the scroll and offset positions + + [Montellese] + * CGUIListContainer: also reset the list's offset and not just the cursor on GUI_MSG_LABEL_RESET + + [Montellese] + * CGUIDialogSelect: fix focusing the first selected item when opening the dialog + + [Kai Sommerfeld] + * [pvr] Fix errors after switching from using backend channel numbers to using kodi channel numbers and vica versa + + [Montellese] + * CGUIWindowVideoBase: clear the cached source listing when removing a video source + + [Montellese] + * CGUIWindowMusicBase: clear the cached source listing when removing a music source + + [Matthias Kortstiege] + * [input] fix baidu method signatures of overriden virtual methods + + [Montellese] + * CGUIDialog: forward overridden method calls to CGUIDialogBoxBase instead of CGUIDialog + + [Sascha Kuehndel (InuSasha)] + * [gitignore] rename xbmc -> kodi + + [Matthias Kortstiege] + * [guilib] scrollbar not reading custom hitrect specified + + [Kolja Lampe] + * Align video and music sort types on file listings to each other + + [Montellese] + * remove "Settings" context menu button from music and pictures views + + [Pär Björklund] + * Added init/uninit for coding tables to avoid having the baidu thread running all the time + + [da-anda] + * [Confluence] add stereoscopic depths + + [Kolja Lampe] + * [json] Added seasonid to episode returns + + [Kolja Lampe] + * Add idSeason to episode table + + [Thomas Amland] + * [python] fix memory leak in multiselect + + [ace20022] + * [guilib][gif] Make animated gifs loadable for any kind of textures, e.g., posters. + + [ace20022] + * [coverity] Unsigned compared against 0 (CID ids 1325653 - 1325663) + + [Alwin Esch] + * [depends] update cmake to 3.3.2 + + [popcornmix] + * [screensaver] Avoid getting stuck in dim state when skin is reloaded + + [HitcherUK] + * Lets skins use a light font weight through the use of either the style tag in Fonts.xml or via the info label + + [da-anda] + * [Confluence] use include for common window header + + [S. Davilla] + * [ios] - removed, atv2 support. time to make way for something new. hint, hint :) - backport from mrmc fork + + [Memphiz] + * [airplay] - fixed broken "stop" for stopping picture streaming via airplay + + [Memphiz] + * [airplay] - make ios8 compatibility mode the new default and don't use a setting for it + + [Memphiz] + * [settings] - make the ios8 compatibility setting a "enable airplay video and pictures support" setting + + [Memphiz] + * [airplay] - evaluate the new "enable airplay video and pictures" setting - this allows the ios9 users to restore at least music streaming capabilities (by disabling video/pictures support) + + [Memphiz] + * [depends/shairplay] - updated libshairplay to the current master which supports ios9 clients (also bumped on win32) + + [Thomas Amland] + * fix typo in log message + + [Thomas Amland] + * [addons] close info dialog on install, not when opening the update dialog + + [Thomas Amland] + * [addons] fix and move the rollback feature into the new update dialog + + [Matthias Kortstiege] + * [input] fix ios build after 7aeff92 + + [Matthias Kortstiege] + * [input] xcode sync for InputCodingTableKorean + + [Matthias Kortstiege] + * [input] add InputCodingTableKorean.cpp to Makefile + + [universal] + * [cleanup][cdio] cosmetics + + [universal] + * [cleanup][DetectDVDType] cosmetics + + [uNiversaI] + * [cleanup][DetectDVDType] remove xbox udfx related + + [uNiversaI] + * [cleanup][libcdio] remove xbox udfx related + + [Matthias Kortstiege] + * [input] fix onnext in dialog numeric after bab2486 + + [Matthias Kortstiege] + * [cleanup] silent reorder compiler warning in InputCodingTableBaiduPY.h + + [Matthias Kortstiege] + * [cleanup] remove DOS line endings in InputCodingTableBaiduPY.h + + [xconverge] + * Minor cleanup for readability. + + [ace20022] + * [coverity] CID#1312062 Unintentional integer overflow. + + [ace20022] + * [coverity] CID#1316334 class member foo is not initialized in this constructor nor in any functions that it calls. + + [ace20022] + * [coverity] CID#1288653 case VIDEOPLAYER_TITLE was not reachable for pvr channels. + + [ace20022] + * [coverity] CID#1272227 Remove logically dead code. + + [ace20022] + * [coverity] CID#1213839 Remove logically dead code. + + [Rainer Hochecker] + * VideoPlayer: trust SAR of mkv container + + [Matthias Kortstiege] + * [guilib] add justify alignment for grouplist controls + + [Martijn Kaijser] + * bump to 16.0alpha4 + + [Martijn Kaijser] + * [python] removed long deprecated xbmcgui.lock() and xbmcgui.unlock() + + [Matthias Kortstiege] + * [videothumbloader] skip thumb extraction for bluray items + + [Kai Sommerfeld] + * [EPG][PVR] Guide Window: On selection of an EPG gap, switch to associated channel. + + [Kai Sommerfeld] + * [EPG] EPG Grid Container: Fill grid with trailing gap epg tags. + + [Kai Sommerfeld] + * [EPG][PVR] Guide Window: Show channels without EPG data. + + [NedScott] + * Improve virtual keyboard layout for English + + [Matthias Kortstiege] + * [guilib] only consider visible controls within grouplists for Container.Position + + [NedScott] + * Improve description of sets strings + + [NedScott] + * Addiitonal long-press modifications + + [Kib] + * [Android-x86] move symbols to the workspace + + [Kib] + * [Android] move symbols to the workspace + + [Matthias Kortstiege] + * [cleanup] get rid of unused function warnings from eventlevel + + [montellese] + * video library: move "Choose art" context button for seasons into "Manage..." + + [montellese] + * video library: add functionality to set custom names for tvshow seasons + + [Matthias Kortstiege] + * [cleanup] cast user ratings to int in sortutils + + [da-anda] + * [guilib] parse tag for constants + + [Kai Sommerfeld] + * [PVR] Search window: Fixed OnPrepareFileItems only to search if requested to do so and not just a simple window refresh is ongoing. + + [Kai Sommerfeld] + * [PVR] Timers: Relax handling of read-only timers a bit. + + [Kai Sommerfeld] + * [PVR] Search window: Fix "Find similar program" for timers to prefer EPG tag title over timer title. + + [Matthias Kortstiege] + * [cleanup] fix signed/unsigned compiler warning + + [Matthias Kortstiege] + * [cleanup] remove unused variable isExecutable + + [Matthias Kortstiege] + * [cleanup] silent override warnings on newer gcc version + + [Kai Sommerfeld] + * [PVR] Don't ask user for confirmtion when creating a timer. "Do you really want to record this?" => Nonsense + + [Kai Sommerfeld] + * [PVR] Cleanup: Rename CGUIWindowPVRBase::StartRecordFile() => CGUIWindowPVRBase::AddTimer() to reflect what it actually does. + + [fritsch] + * AESinkPULSE: Replace Delay method with self calculated method + + [Rainer Hochecker] + * dvdplayer: fix non DVB subs after 5c0d694fa769f311bc5e14dec04c260267a56b79 + + [Matthias Kortstiege] + * [guilib] simplify dirty region marking for fadelabels (fixes #16277) + + [Kai Sommerfeld] + * Revert "[pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running" + + [Martijn Kaijser] + * [win32] add screensaver add-ons to installer + + [Thomas Amland] + * run repository update jobs in low pausable mode + + [Anton Fedchin] + * [dxva] Re-factor: get rid of unneeded reference to decoder texture. Properly destroying resources during creating decoders views if something goes wrong. + + [Anton Fedchin] + * [WinVideoFilter] Lower feature level for test shader. This fixes segfault in video drivers which support only FL9.1/9.2. + + [Anton Fedchin] + * [dxva] Fix DXVA renderer color range. + + [Floris Bos] + * LinuxInputDevice: add support for multi-touch devices + + [DaveTBlake] + * Add missing MusicInfoTag values when set from artist, album and song. Had not been previously updated to allow for artist credits, so while artist vector being set the description and MBIDs not all being done. + + [Pär Björklund] + * Fix c/p error on dialogs and renamed singleFiles variable in videolibrary as it was somewhat confusingly named compared to the dialog options + + [Kai Sommerfeld] + * [network] CNetWork::IsAvailable: Remove parameter 'wait', because there is no implementation behind. + + [h.udo] + * [gitignore] Add library.kodi.audioengine makefile + + [ace20022] + * [fix][gui] Fix multi images in grouplists/layouts. This fixes a regression introduced with cb2dd229ce5b6f479f9a6ebd51998831554d2ae2 . + + [Peter Bauer] + * Subtract readahead when seeking (SEEK_CUR) outside of buffer area + + [Peter Bauer] + * Use ID3v2Tag loader results + + [LS80] + * Fixed missing Python traceback caused by an invalid format string. Fixes #16274. + + [Achim Turan] + * [library.kodi.audioengine] Fixing clumsy error mesage + + [Thomas Amland] + * [addons] fix uninstalling of non-repository addons + + [Achim Turan] + * [library.kodi.audioengine] [FIX CID 1324647] Fixing Null-checking "cb" + + [Sam Stenvall] + * [pvr] fix invalid memory access when a PVR window is accessed before any clients have finished loading. Also introduce an event which gets triggered when an update is actually needed. + + [xhaggi] + * [cleanup] get rid of unused window allow overlay code + + [Thomas Amland] + * [addons] fix zip install after 61121d731 + + [Thomas Amland] + * [addons] fix bad error handling (returns int) + + [Thomas Amland] + * log time of previous repository update to make it easier to detect database problems in the future + + [Thomas Amland] + * [addons] fix repo last checked time not updating if not previously added + + [S. Davilla] + * bump gas to https://git.libav.org/?p=gas-preprocessor.git;a=commit;h=5ab764742626598cb462bc86e2d04ac8001e05d7 + + [S. Davilla] + * docs, document what we are doing in depends + + [S. Davilla] + * fixed, c++11 compiler warning + + [S. Davilla] + * fixed, all our thread should be named + + [S. Davilla] + * fixed, massive memory leak in DirectoryNode and some cosmetic cleanup. Basically CDirectoryNode::ParseURL creates a bunch of nodes then orphans them when browsing by file. Also StringUtils::Split can return a leading empty string for '/Users/Shared/Movies', and we add another one to path, which creates two root nodes. use StringUtils::Tokenize which does what we want. Side note: StringUtils::Split needs a refactor, iMaxStrings is size_t and the default value is zero and the very 1st thing it does is pre-decrement it which wraps it around to a very big number, sure, sure :) + + [S. Davilla] + * fixed, memory leaks using VDA (both of them) + + [S. Davilla] + * fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5 + + [S. Davilla] + * fixed, memory leaks in SMBFile, three tiny ones left to find. + + [S. Davilla] + * fixed, clearerr return void + + [sportica] + * Add Korean keyboard + + [ronie] + * [Confluence] hardcode icon path for extended weather info + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetTop100AlbumSongs + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetRecentlyPlayedAlbumSongs + + [Martijn Kaijser] + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Return ENOENT for empty path according to specs + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& + + [Kai Sommerfeld] + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers + + [Thomas Amland] + * [addons] add missing implementations of IsInUse + + [Thomas Amland] + * [addons] add missing implementations of SetDefault + + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis + + [Chris "Koying" Browet] + * FIX: proper casting of file time TZ adjustment + + [Kolja Lampe] + * Check if charsetSetting is null before trying to get data from it. If it is use the default value. + + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [ronie] + * [Confluence] cleanup + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Mike Frysinger] + * TexturePacker: use $PKG_CONFIG + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard + + [Anton Fedchin] + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. + + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 + + [Memphiz] + * [cosmetics] - fixed typos + + [Memphiz] + * [ios] - fix mapping of 3 finger taps + + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not + + [montellese] + * GroupUtils: add additional overloads for more control over the result + + [montellese] + * GroupUtils: remove unused GroupAndSort() + + [BigNoid] + * [guilib] reduce duplicate code + + [BigNoid] + * [guilib] Add container.listitemid.infolabel + + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims + + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation + + [DaveTBlake] + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Kolja Lampe] + * [video] Don't save scraper settings if we exit out and not select the "ok" button + + [anaconda] + * [video] Fix content type for special://videoplaylists + + [Chris "Koying" Browet] + * FIX: [droid;storage] check readability last + + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do + + [Ryan Gribble] + * Update gitignore for bootstrapped addons definition files + + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values + + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). + + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [evilhamster] + * [music] Removed refresh on artist/album info when the artist/album has not been scraped. + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme + + [Martijn Kaijser] + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Alex Deryskyba] + * [aml] Enable true 1920x1080 output without upscaling on Amlogic-based devices. + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [taxigps] + * fixed: setlocale issue other than windows + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Chris "Koying" Browet] + * FIX: [droid] handle audio headsets + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux trustyros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Sam Nazarko] + * [rbp] tools: only use sudo if we have it on the system + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Matthias Kortstiege] + * [input] fix ios build after 7aeff92 + + [Matthias Kortstiege] + * [input] xcode sync for InputCodingTableKorean + + [Matthias Kortstiege] + * [input] add InputCodingTableKorean.cpp to Makefile + + [universal] + * [cleanup][cdio] cosmetics + + [universal] + * [cleanup][DetectDVDType] cosmetics + + [uNiversaI] + * [cleanup][DetectDVDType] remove xbox udfx related + + [uNiversaI] + * [cleanup][libcdio] remove xbox udfx related + + [Matthias Kortstiege] + * [input] fix onnext in dialog numeric after bab2486 + + [Matthias Kortstiege] + * [cleanup] silent reorder compiler warning in InputCodingTableBaiduPY.h + + [Matthias Kortstiege] + * [cleanup] remove DOS line endings in InputCodingTableBaiduPY.h + + [xconverge] + * Minor cleanup for readability. + + [ace20022] + * [coverity] CID#1312062 Unintentional integer overflow. + + [ace20022] + * [coverity] CID#1316334 class member foo is not initialized in this constructor nor in any functions that it calls. + + [ace20022] + * [coverity] CID#1288653 case VIDEOPLAYER_TITLE was not reachable for pvr channels. + + [ace20022] + * [coverity] CID#1272227 Remove logically dead code. + + [ace20022] + * [coverity] CID#1213839 Remove logically dead code. + + [Rainer Hochecker] + * VideoPlayer: trust SAR of mkv container + + [Matthias Kortstiege] + * [guilib] add justify alignment for grouplist controls + + [Martijn Kaijser] + * bump to 16.0alpha4 + + [Martijn Kaijser] + * [python] removed long deprecated xbmcgui.lock() and xbmcgui.unlock() + + [Matthias Kortstiege] + * [videothumbloader] skip thumb extraction for bluray items + + [Kai Sommerfeld] + * [EPG][PVR] Guide Window: On selection of an EPG gap, switch to associated channel. + + [Kai Sommerfeld] + * [EPG] EPG Grid Container: Fill grid with trailing gap epg tags. + + [Kai Sommerfeld] + * [EPG][PVR] Guide Window: Show channels without EPG data. + + [NedScott] + * Improve virtual keyboard layout for English + + [Matthias Kortstiege] + * [guilib] only consider visible controls within grouplists for Container.Position + + [NedScott] + * Improve description of sets strings + + [NedScott] + * Addiitonal long-press modifications + + [Kib] + * [Android-x86] move symbols to the workspace + + [Kib] + * [Android] move symbols to the workspace + + [Matthias Kortstiege] + * [cleanup] get rid of unused function warnings from eventlevel + + [Matthias Kortstiege] + * [cleanup] cast user ratings to int in sortutils + + [da-anda] + * [guilib] parse tag for constants + + [Kai Sommerfeld] + * [PVR] Search window: Fixed OnPrepareFileItems only to search if requested to do so and not just a simple window refresh is ongoing. + + [Kai Sommerfeld] + * [PVR] Timers: Relax handling of read-only timers a bit. + + [Kai Sommerfeld] + * [PVR] Search window: Fix "Find similar program" for timers to prefer EPG tag title over timer title. + + [Matthias Kortstiege] + * [cleanup] fix signed/unsigned compiler warning + + [Matthias Kortstiege] + * [cleanup] remove unused variable isExecutable + + [Matthias Kortstiege] + * [cleanup] silent override warnings on newer gcc version + + [Kai Sommerfeld] + * [PVR] Don't ask user for confirmtion when creating a timer. "Do you really want to record this?" => Nonsense + + [Kai Sommerfeld] + * [PVR] Cleanup: Rename CGUIWindowPVRBase::StartRecordFile() => CGUIWindowPVRBase::AddTimer() to reflect what it actually does. + + [fritsch] + * AESinkPULSE: Replace Delay method with self calculated method + + [Rainer Hochecker] + * dvdplayer: fix non DVB subs after 5c0d694fa769f311bc5e14dec04c260267a56b79 + + [Matthias Kortstiege] + * [guilib] simplify dirty region marking for fadelabels (fixes #16277) + + [Kai Sommerfeld] + * Revert "[pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running" + + [Martijn Kaijser] + * [win32] add screensaver add-ons to installer + + [Thomas Amland] + * run repository update jobs in low pausable mode + + [Anton Fedchin] + * [dxva] Re-factor: get rid of unneeded reference to decoder texture. Properly destroying resources during creating decoders views if something goes wrong. + + [Anton Fedchin] + * [WinVideoFilter] Lower feature level for test shader. This fixes segfault in video drivers which support only FL9.1/9.2. + + [Anton Fedchin] + * [dxva] Fix DXVA renderer color range. + + [Floris Bos] + * LinuxInputDevice: add support for multi-touch devices + + [Pär Björklund] + * Fix c/p error on dialogs and renamed singleFiles variable in videolibrary as it was somewhat confusingly named compared to the dialog options + + [Kai Sommerfeld] + * [network] CNetWork::IsAvailable: Remove parameter 'wait', because there is no implementation behind. + + [h.udo] + * [gitignore] Add library.kodi.audioengine makefile + + [ace20022] + * [fix][gui] Fix multi images in grouplists/layouts. This fixes a regression introduced with cb2dd229ce5b6f479f9a6ebd51998831554d2ae2 . + + [Peter Bauer] + * Subtract readahead when seeking (SEEK_CUR) outside of buffer area + + [Peter Bauer] + * Use ID3v2Tag loader results + + [LS80] + * Fixed missing Python traceback caused by an invalid format string. Fixes #16274. + + [Achim Turan] + * [library.kodi.audioengine] Fixing clumsy error mesage + + [Thomas Amland] + * [addons] fix uninstalling of non-repository addons + + [Achim Turan] + * [library.kodi.audioengine] [FIX CID 1324647] Fixing Null-checking "cb" + + [Sam Stenvall] + * [pvr] fix invalid memory access when a PVR window is accessed before any clients have finished loading. Also introduce an event which gets triggered when an update is actually needed. + + [xhaggi] + * [cleanup] get rid of unused window allow overlay code + + [Thomas Amland] + * [addons] fix zip install after 61121d731 + + [Thomas Amland] + * [addons] fix bad error handling (returns int) + + [Thomas Amland] + * log time of previous repository update to make it easier to detect database problems in the future + + [Thomas Amland] + * [addons] fix repo last checked time not updating if not previously added + + [S. Davilla] + * bump gas to https://git.libav.org/?p=gas-preprocessor.git;a=commit;h=5ab764742626598cb462bc86e2d04ac8001e05d7 + + [S. Davilla] + * docs, document what we are doing in depends + + [S. Davilla] + * fixed, c++11 compiler warning + + [S. Davilla] + * fixed, all our thread should be named + + [S. Davilla] + * fixed, massive memory leak in DirectoryNode and some cosmetic cleanup. Basically CDirectoryNode::ParseURL creates a bunch of nodes then orphans them when browsing by file. Also StringUtils::Split can return a leading empty string for '/Users/Shared/Movies', and we add another one to path, which creates two root nodes. use StringUtils::Tokenize which does what we want. Side note: StringUtils::Split needs a refactor, iMaxStrings is size_t and the default value is zero and the very 1st thing it does is pre-decrement it which wraps it around to a very big number, sure, sure :) + + [S. Davilla] + * fixed, memory leaks using VDA (both of them) + + [S. Davilla] + * fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5 + + [S. Davilla] + * fixed, memory leaks in SMBFile, three tiny ones left to find. + + [S. Davilla] + * fixed, clearerr return void + + [sportica] + * Add Korean keyboard + + [ronie] + * [Confluence] hardcode icon path for extended weather info + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetTop100AlbumSongs + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetRecentlyPlayedAlbumSongs + + [Martijn Kaijser] + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Return ENOENT for empty path according to specs + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& + + [Kai Sommerfeld] + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers + + [Thomas Amland] + * [addons] add missing implementations of IsInUse + + [Thomas Amland] + * [addons] add missing implementations of SetDefault + + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis + + [Chris "Koying" Browet] + * FIX: proper casting of file time TZ adjustment + + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [ronie] + * [Confluence] cleanup + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Mike Frysinger] + * TexturePacker: use $PKG_CONFIG + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard + + [Anton Fedchin] + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. + + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 + + [Memphiz] + * [cosmetics] - fixed typos + + [Memphiz] + * [ios] - fix mapping of 3 finger taps + + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not + + [montellese] + * GroupUtils: add additional overloads for more control over the result + + [montellese] + * GroupUtils: remove unused GroupAndSort() + + [BigNoid] + * [guilib] reduce duplicate code + + [BigNoid] + * [guilib] Add container.listitemid.infolabel + + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims + + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation + + [DaveTBlake] + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Kolja Lampe] + * [video] Don't save scraper settings if we exit out and not select the "ok" button + + [anaconda] + * [video] Fix content type for special://videoplaylists + + [Chris "Koying" Browet] + * FIX: [droid;storage] check readability last + + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do + + [Ryan Gribble] + * Update gitignore for bootstrapped addons definition files + + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values + + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). + + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme + + [Martijn Kaijser] + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux trustyros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [da-anda] + * [guilib] parse tag for constants + + [Matthias Kortstiege] + * [guilib] simplify dirty region marking for fadelabels (fixes #16277) + + [Kai Sommerfeld] + * Revert "[pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running" + + [Martijn Kaijser] + * [win32] add screensaver add-ons to installer + + [Thomas Amland] + * run repository update jobs in low pausable mode + + [Anton Fedchin] + * [dxva] Re-factor: get rid of unneeded reference to decoder texture. Properly destroying resources during creating decoders views if something goes wrong. + + [Anton Fedchin] + * [WinVideoFilter] Lower feature level for test shader. This fixes segfault in video drivers which support only FL9.1/9.2. + + [Anton Fedchin] + * [dxva] Fix DXVA renderer color range. + + [ace20022] + * [fix][gui] Fix multi images in grouplists/layouts. This fixes a regression introduced with cb2dd229ce5b6f479f9a6ebd51998831554d2ae2 . + + [LS80] + * Fixed missing Python traceback caused by an invalid format string. Fixes #16274. + + [Achim Turan] + * [library.kodi.audioengine] Fixing clumsy error mesage + + [Thomas Amland] + * [addons] fix uninstalling of non-repository addons + + [Achim Turan] + * [library.kodi.audioengine] [FIX CID 1324647] Fixing Null-checking "cb" + + [Sam Stenvall] + * [pvr] fix invalid memory access when a PVR window is accessed before any clients have finished loading. Also introduce an event which gets triggered when an update is actually needed. + + [xhaggi] + * [cleanup] get rid of unused window allow overlay code + + [Thomas Amland] + * [addons] fix zip install after 61121d731 + + [Thomas Amland] + * [addons] fix bad error handling (returns int) + + [Thomas Amland] + * log time of previous repository update to make it easier to detect database problems in the future + + [Thomas Amland] + * [addons] fix repo last checked time not updating if not previously added + + [S. Davilla] + * bump gas to https://git.libav.org/?p=gas-preprocessor.git;a=commit;h=5ab764742626598cb462bc86e2d04ac8001e05d7 + + [S. Davilla] + * docs, document what we are doing in depends + + [S. Davilla] + * fixed, c++11 compiler warning + + [S. Davilla] + * fixed, all our thread should be named + + [S. Davilla] + * fixed, massive memory leak in DirectoryNode and some cosmetic cleanup. Basically CDirectoryNode::ParseURL creates a bunch of nodes then orphans them when browsing by file. Also StringUtils::Split can return a leading empty string for '/Users/Shared/Movies', and we add another one to path, which creates two root nodes. use StringUtils::Tokenize which does what we want. Side note: StringUtils::Split needs a refactor, iMaxStrings is size_t and the default value is zero and the very 1st thing it does is pre-decrement it which wraps it around to a very big number, sure, sure :) + + [S. Davilla] + * fixed, memory leaks using VDA (both of them) + + [S. Davilla] + * fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5 + + [S. Davilla] + * fixed, memory leaks in SMBFile, three tiny ones left to find. + + [S. Davilla] + * fixed, clearerr return void + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetTop100AlbumSongs + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetRecentlyPlayedAlbumSongs + + [Martijn Kaijser] + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& + + [Kai Sommerfeld] + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers + + [Thomas Amland] + * [addons] add missing implementations of IsInUse + + [Thomas Amland] + * [addons] add missing implementations of SetDefault + + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis + + [Chris "Koying" Browet] + * FIX: proper casting of file time TZ adjustment + + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Mike Frysinger] + * TexturePacker: use $PKG_CONFIG + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard + + [Anton Fedchin] + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. + + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 + + [Memphiz] + * [cosmetics] - fixed typos + + [Memphiz] + * [ios] - fix mapping of 3 finger taps + + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not + + [montellese] + * GroupUtils: add additional overloads for more control over the result + + [montellese] + * GroupUtils: remove unused GroupAndSort() + + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims + + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation + + [DaveTBlake] + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Kolja Lampe] + * [video] Don't save scraper settings if we exit out and not select the "ok" button + + [anaconda] + * [video] Fix content type for special://videoplaylists + + [Chris "Koying" Browet] + * FIX: [droid;storage] check readability last + + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do + + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values + + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). + + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme + + [Martijn Kaijser] + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux trustyros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [fritsch] + * AESinkPULSE: Workaround Delay issues in PA Server + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + + [Martijn Kaijser] + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& + + [Kai Sommerfeld] + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers + + [Thomas Amland] + * [addons] add missing implementations of IsInUse + + [Thomas Amland] + * [addons] add missing implementations of SetDefault + + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis + + [Chris "Koying" Browet] + * FIX: proper casting of file time TZ adjustment + + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard + + [Anton Fedchin] + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. + + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 + + [Memphiz] + * [cosmetics] - fixed typos + + [Memphiz] + * [ios] - fix mapping of 3 finger taps + + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not + + [montellese] + * GroupUtils: add additional overloads for more control over the result + + [montellese] + * GroupUtils: remove unused GroupAndSort() + + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims + + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation + + [DaveTBlake] + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Chris "Koying" Browet] + * FIX: [droid;storage] check readability last + + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do + + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values + + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). + + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme + + [Martijn Kaijser] + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux trustyros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux trustyros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [xhaggi] + * [cleanup] removes unused actions + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux trustyros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux trustyros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux trustyros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [xhaggi] + * [cosmetics] removes left-over enum WINDOW_TYPE in CGUIWindow + + [xhaggi] + * [gui] adjusts log level for the window activation refused message + + [xhaggi] + * [gui] introduce a dialog modality type to differ between modalities + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [xhaggi] + * [cosmetics] removes left-over enum WINDOW_TYPE in CGUIWindow + + [xhaggi] + * [gui] adjusts log level for the window activation refused message + + [xhaggi] + * [gui] introduce a dialog modality type to differ between modalities + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [hudokkow] + * [pvr.mythtv] Bump add-on to 2.4.0 + + [Matthias Kortstiege] + * [favourites] handle pictures via showpicture builtin + + [Sam Stenvall] + * [pvr] refactor the way information about the currently active PVR client is determined in CPVRGUIInfo. Instead of querying the current client directly we ask CPVRClients to give us a summary (SBackend) of each connected client. These summaries are safe to loop over no matter what happens to the actual clients in the mean time. Fixes trac #15942 + + [h.udo] + * [gitigonre] Another android artifact + + [h.udo] + * [libplatform] Bump to 1.0.10 + + [h.udo] + * [pvr] Bump all add-ons (libplatform update) + + [ronie] + * [Confluence] fix label width + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [xhaggi] + * [cosmetics] sort ctor in CPVRChannelGroup + + [xhaggi] + * [pvr] fix CPVRChannelGroup::OnSettingChanged won't get called + + [Chris "Koying" Browet] + * CHG: [droid] add external storage path to initial status log + + [Chris "Koying" Browet] + * FIX: [droid] limit 4K to Shield TV + allow override + + [Martijn Kaijser] + * [pvr] bump add-ons + + [xhaggi] + * [pvr] fix: delete of empty group with an invalid id ends up in deleting the wrong group + + [montellese] + * fix some warnings concerning type mismatches + + [Chris "Koying" Browet] + * FIX: [droid] properly handle sys vol going to 0 (fixes #16069) + + [Chris "Koying" Browet] + * FIX: [droid] fix volume handling + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [xhaggi] + * [pvr] sort equal client channel numbers by name if not sub-channels + + [Zapata11] + * Added lithuanian keyboard layout + + [Martijn Kaijser] + * [lang] fix typo + + [Chris "Koying" Browet] + * FIX: [droid] prevent the os restarting us for "screenlayout" and "screensize" + + [popcornmix] + * [omxplayer] Change in interlace state is not an error in log + + [Chris "Koying" Browet] + * FIX: [droid] fix crash when restarted by system + + [Matthias Kortstiege] + * [videodb] fix yet some more query typos + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] automatic cosmetics for the en_gb language file + + [txtranslation] + * [lang] update of internal addon language files + + [Sam Stenvall] + * [pvr] bump pvr.vbox to 1.3.4 + + [mapfau] + * [pvr] get rid of fixed internal group ids + + [Matthias Kortstiege] + * [videodb] use GetNavCommon for tags + + [Matthias Kortstiege] + * [addons] force repository update in post-install/uninstall + + [fritsch] + * Wasapi: Do not probe for AE_FMT_AAC - we don't passthrough it anyways + + [arnova] + * fixed: Don't do GetLength() off-thread is it may be (b)locked by a pending read() (fixes #16046) + + [ace20022] + * [dvdplayer][fix] Initialize SelectionStream members. This fixes the issue that any external subtitle is recognized as forced. + + [balmeras] + * [libexif] Ignore invalid DMS value in GPS coordinate, and fix kodi crash due to buffer overflow with special value FFFFFF + + [Tobias Markus] + * Various cppcheck perf fixes + + [Sam Stenvall] + * [pvr] bump pvr.vbox to 1.3.3 + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Sam Stenvall] + * [confluence] increase button group height in the PVR group manager dialog, fixes "Add group" being hidden + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [h.udo] + * [pvr.wmc] Fix android lib name (fixes #16044) + + [Anton Fedchin] + * [GL] Fixed: FontTTF breaks scissor which causes bad rendering with dirty regions. + + [montellese] + * music library: don't force a rescan after update past version 35 if not needed + + [montellese] + * video library: only allow to scan sources which have a content set + + [montellese] + * video library: show "Set content" even during library scan (fixes #16061) + + [Chris "Koying" Browet] + * FIX: [droid] harden MigrateUserData + + [Chris "Koying" Browet] + * FIX: [amc] clear pending exceptions on exit + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [Chris "Koying" Browet] + * FIX: [amc;hevc] let CBitstreamConverter decide + + [Kai Sommerfeld] + * [pvr] bump pvr.hts to 2.1.12 + + [Memphiz] + * [osx/cocoa] - revert 0f32a2f5d4fb1077def8c581098aa4385e8d0a67 (it is prone to deadlocking because it blocks the gui/main thread) and instead trust in the openglcontext which is tracked by windowing. Fixes deadlock introduced by PR #7143 + + [Memphiz] + * [windowing/osx] - expose the current NSOpenGLContext tracked by windowing to the outside via a getter + + [Chris "Koying" Browet] + * FIX: [droid] return type mismatch when launching ext app + + [Anton Fedchin] + * [builtins] do not restart visualization if it has no settings. + + [Anton Fedchin] + * [keymaps] Use Addon.Default.OpenSettings instead of ActivateWindow for visualization settings. + + [Anton Fedchin] + * [win32][curl] Using CEnvironment::unsetenv() instead of SetEnvironmentVariable. It's proper way to unset environment variable. + + [Martijn Kaijser] + * [lang] Remove line breaks used in dialogs + + [Kai Sommerfeld] + * [pvr] bump pvr.hts to 2.1.11 + + [Matthias Kortstiege] + * [videodatabase] fix invalid queries (closes #16054) + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [Rainer Hochecker] + * dvdplayer: fix vc1 hwaccel like vdpau - work around an ffmpeg issue + + [BigNoid] + * [lang] Fix overlapping kaitoast messages + + [phate89] + * Honor "ignorethewhensorting" + + [Sam Stenvall] + * [pvr] bump pvr.hts to 2.1.10 + + [Anton Fedchin] + * [win32] Fixed libcurl initialization when the env variable OPENSSL_CONF points to existing openssl.conf file. + + [Rainer Hochecker] + * dvdplayer: fix ff/rw after ea6e82997bd6087a7beff1be0ef9b34847fe3cc7 + + [uNiversaI] + * [confluence] add missing video codec flags + + [Sam Stenvall] + * consider a CURLINFO_RESPONSE_CODE of zero a failed request + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v1.3.2 + + [fape] + * [Confluence] fix long filenames in subtitles search&download dialog header + + [ace20022] + * [cosmetics] Fix code formatting of ScanArchiveForSubtitles. + + [ace20022] + * [subs][perf] Make ScanArchiveForSubtitles more performant: - Rearrange the list of subtitle extension - Add break/continue to loops + + [Rainer Hochecker] + * dvdplayer fix sorting of subtitles - fixes trac 16038 + + [popcornmix] + * [utils] Disable fast_memcpy which is slower than memcpy + + [ace20022] + * [Fix][subs] Fix checking zip archives in zip archives. + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Martijn Kaijser] + * bump to 15.0 rc1 + + [ronie] + * add the option to conditionally include files + + + [Martijn Kaijser] + * bump to 15.0 rc1 + + + [Martijn Kaijser] + * [addons] sync with repo + + [Chris "Koying" Browet] + * FIX: [droid] proper audio focus management + + [Rainer Hochecker] + * renderer: fix subtitle (text) positions for alignment outside video, consider height of text + + [Pär Björklund] + * make sure that we don't set values when there was no node, we have no idea what will be in value if that happens. closes #16040 + + [Rainer Hochecker] + * renderer: fix overlapping subtitles for alignments other than fixed + + [Rainer Hochecker] + * renderer: fix mixed-up rd/rv after fd53c703d96d9beec2ccf4e5982bd91aafc29be2, resulted in wrong subtitle positions + + [Chris "Koying" Browet] + * ADD: [droid] standard refreshrate switcher (>= api 21) + + [Chris "Koying" Browet] + * FIX: [aml] remove obsolete audio latency hack + + [Martijn Kaijser] + * [android] hide certain settings which are non functional + + [ace20022] + * [log] Reduce log spam from ScanArchiveForSubtitles. + + [Sam Stenvall] + * [pvr] bump addons + + [popcornmix] + * [players] Remove not working SetPriority calls + + [AlwinEsch] + * [epg] Remove usage of 'using namespace std' + + [xhaggi] + * [seek] fix: reset seek size after seeking + + [AlwinEsch] + * [epg] Sort included files alphabetical + + [xhaggi] + * [video] de-duplication/cleanup of related database tables + + [Tobias Markus] + * Followup fix for CID1272226 + + [xhaggi] + * [database][mysql] insert char set for CREATE TABLE .. SELECT syntax between create table and select clause + + [xhaggi] + * [video] limit length of name to 255 for actor, country, genre etc. + + [Tobias Markus] + * Remove const keyword from CDVDInputStreamPVRManager::GetSelectedChannel() Fixes CID 1272226 + + [AlwinEsch] + * [pvr] Remove not needed trailing spaces + + [xhaggi] + * [rfc][json-rpc] use setter of CVideoInfoTag + + [xhaggi] + * [video] fix leading/trailing whitespaces in video details + + [Martijn Kaijser] + * [cosmetics] improve English strings + + [AlwinEsch] + * [epg] Remove call a bit + + [arnova] + * changed: Properly exit screensaver on shutdown (fixes #16028) + + [Memphiz] + * [windowing/osx] - check the pointer of the displayname before accessing the string object - fixes bad access when turing off the TV while Kodi is running + + [Kai Sommerfeld] + * Revert "[pvr] changed: ask if the user wants to disable libCEC if no TV couldn't be found for 30 seconds" + + [Sam Stenvall] + * [pvr] matching EPG tag pointers means an absolute match between a timer and an EPG tag + + [Chris Browet] + * FIX: [aml;droid] only bother with REALVIDEO intent if the permissions are right + + [Chris "Koying" Browet] + * ADD: [droid] generically use hdmi resolution (4K) + + [Chris "Koying" Browet] + * ADD: [jni] CJNISystemProperties + + [Kai Sommerfeld] + * [PVR] Fix crash in PVR::CPVRClient::GetDriveSpace, take two (Trac #15942) + + [MilhouseVH] + * [videodb] Add missing argument on JSON filter PrepareSQL() + + [Martijn Kaijser] + * get rid of g_localizeStrings in Dialogs + + [xhaggi] + * [pvr] return empty info label for season and episode less than 1 + + [Martijn Kaijser] + * combine split strings into a single string and only use the textbox in dialogs + + [ace20022] + * [Fix][subs] Don't try to read vob sub files (without a corresponding idx file) like text based sub files. + + [xhaggi] + * [gui] unify method overloads in CGUIDialogYesNo + + [xhaggi] + * [cosmetics] format and add docs in CGUIDialogYesNo + + [uNiversaI] + * [binary addons] bump audio decoders + + [Chris "Koying" Browet] + * FIX: [droid] re-establish immersive mode if it was reset + + [ronie] + * [re-touched] update + + [Pär Björklund] + * addon.xml was written as ucs2 with bom as that is the default output from powershell, changed it to specify utf8 without bom + + [Kai Sommerfeld] + * [PVR] Fix crash in PVR::CPVRClient::GetDriveSpace (Trac #15942) + + [ronie] + * add new pvr infolabels + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] automatic cosmetics for the en_gb language file + + [txtranslation] + * [lang] update of internal addon language files + + [wsnipex] + * [binary addons] bump audio encoders + + [montellese] + * CLangInfo: don't detect a language migration from "English" to "resource.language.en_gb" as a fallback mechanism + + [Pär Björklund] + * Rebuild curl with openssl support instead of windows schannel to fix the deadlock on win32. Rebuilt using latest curl 7.42.1 and openssl 1.0.2a + + [ace20022] + * Revert "[Fix][subs] Don't try to read a vob sub file without a corresponding idx file." + + [uNiversaI] + * revert ecea1fff0 + + [Matthias Kortstiege] + * Revert "[guilib] fadelabel not reading scroll tag" + + [wsnipex] + * [cmake] removed multi-arch again, its not needed anymore + + [wsnipex] + * [binary addons] use kodi core install paths by default + + [xhaggi] + * [gui] render dialog teletext always on top + + [arnova] + * changed: When emptyng Curl's overflow buffer, shrink overflow buffer + tweaks + + [Rainer Hochecker] + * dvdplayer: avoid seek to sync after unpause + + [Ben Avison] + * Fix for font corruption + + [Rainer Hochecker] + * dvdplayer: sanity checks for current time + + [fritsch] + * RenderManager: Fix Gui Layer Update + + [fritsch] + * IMX: Fix 3D rects v20 + + [fritsch] + * IMX: Reorder in initialization list + + [Kai Sommerfeld] + * [cec] Fix return value handling logic for CEC_TV_PRESENT_CHECK_TIMEOUT dialog. + + [ace20022] + * [Fix] Fix a std::out_of_range exception when the sum of seek steps is zero. + + [Rainer Hochecker] + * dvdplayer: do not signal started until output of first frame + + [hrotkogabor] + * PinnacleSysPCTVRemote remote keys for lirc 0.9 + + [wsnipex] + * [depends] fix Xrandr pkg-config includes on linux + + [xhaggi] + * [pvr] fix CPVRDirectory::Exists always returns false (fixes 15997) + + [Max Kellermann] + * configure.ac: detect libxrandr with pkg-config + + [Max Kellermann] + * WinSystemX11: make XRandR mandatory + + [Max Kellermann] + * tools/depends/target/Makefile: add links to X RandR pkg-config files + + [Max Kellermann] + * configure.ac: simplify $host_vendor=apple special cases + + [Joseph A. Yasi] + * [powermanagement] Choose powermanager with the most features on Linux. + + [ace20022] + * [Fix][subs] Don't try to read a vob sub file without a corresponding idx file. + + [montellese] + * upnp: fix hiding watched tvshows and seasons + + [montellese] + * upnp: fix watched overlay for tvshows and seasons + + [Martijn Kaijser] + * [addons] update scrapers + + [Martijn Kaijser] + * [droid] Bump targetSdkVersion to Android 5.1 (API 22) + + [montellese] + * show the startup dialogs informing about the fallback language and the migrated userdata once the user interface is really ready for usage + + [montellese] + * added GUI_MSG_UI_READY message to notify everyone when the user interface is ready for usage + + [uNiversaI] + * [strings] info -> information + + [Martijn Kaijser] + * Combine multiline strings into one string which will be placed in the textbox input. Also add additional comments in strings.po + + [Pär Björklund] + * fixed gtest build that broke with kissfft + + [uNiversaI] + * [confluence] cleanup unused files + + [uNiversaI] + * [sourcesDirectory][Util] separate DefaultDVDRom from defaultDVDFull + + [uNiversaI] + * [confluence] add new & update Default* icons + + [Thomas Amland] + * fix kaitoast dialog loading the previous icon instead of the default when no icon or type is passed + + [ace20022] + * [win32] Fix crash after 8e1f62cc1b80918d723edc40e7b2a903cbef96e2 due to cdio logging. + + [Matthias Kortstiege] + * [addons] fix toast dialog showing wrong icon on install errors + + [the-hydra] + * Fixed makefile ARCH install bug + + [Matthias Kortstiege] + * [subs] skip directory cache read to ensure we're picking up subtitles (fixes #15989) + + [Martijn Kaijser] + * always use the DialogOK with the textbox input instead of separate lines + + [ace20022] + * [windows] Cleanup includes. + + [ace20022] + * [windowing] Cleanup includes. + + [ace20022] + * [win32] Cleanup includes. + + [ace20022] + * [view] Cleanup includes. + + [ace20022] + * [video] Cleanup includes. + + [ace20022] + * [utils] Cleanup includes. + + [ace20022] + * [storage] Cleanup includes. + + [ace20022] + * [settings] Cleanup includes. + + [ace20022] + * [rendering] Cleanup includes. + + [ace20022] + * [pvr] Cleanup includes. + + [ace20022] + * [programs] Cleanup includes. + + [ace20022] + * [profiles] Cleanup includes. + + [ace20022] + * [powermanagement] Cleanup includes. + + [ace20022] + * [playlists] Cleanup includes. + + [ace20022] + * [pictures] Cleanup includes. + + [ace20022] + * [peripherals] Cleanup includes. + + [ace20022] + * [music] Cleanup includes. + + [ace20022] + * [listproviders] Cleanup includes. + + [ace20022] + * [interfaces] Cleanup includes. + + [ace20022] + * [input] Cleanup includes. + + [ace20022] + * [guilib] Cleanup includes. + + [ace20022] + * [filesystem] Cleanup includes. + + [ace20022] + * [dialogs] Cleanup includes. + + [ace20022] + * [dbwrappers] Cleanup includes. + + [ace20022] + * [cdrip] Cleanup includes. + + [ace20022] + * [addons] Cleanup includes. + + [ace20022] + * [epg] Cleanup includes. + + [ace20022] + * [app] Cleanup includes. + + [Trent Nelson] + * Pivos: Don't use dir cache on Android App list + + [Chris "Koying" Browet] + * CHG: [droid;kbd] log ignored keys + + [Chris "Koying" Browet] + * FIX: [droid;sound] restore volume after passthrough + + [Chris "Koying" Browet] + * FIX: [droid] possible fix for localtime crash + + [Chris "Koying" Browet] + * ADD: add a fallback site for internet detection + + [Martijn Kaijser] + * [string] several grammar fixes + + [Martijn Kaijser] + * [strings] fix wrong setting description + + [hudokkow] + * [pvr] Bump filmon, dvblink and vbox + + [Rainer Hochecker] + * [pvr] bump vnsi + + [uNiversaI] + * [strings] fix curly brakets and rename setting + + [xhaggi] + * [input] drop fallback window configuration for fullscreeninfo dialog + + [fritsch] + * WinSystemX11: Properly initialize fps value - it might not be set at all + + [Michael Cronenworth] + * Always declare gnu89 inline standard + + [Sam Stenvall] + * [pvr] bump pvr.vbox + + [Memphiz] + * [osx/windowing] - properly track lastdisplay id when window is moved between screens (else GetCurrentScreen might return the wrong cached index) + + [Memphiz] + * [osx/DisplaySettings] - if strOutput in the resolution info is not empty - show this as displayname in the settings ui + + [Memphiz] + * [osx/windowing] - set screen name in resolution infos + + [Memphiz] + * [osx/windowing] - track current refreshrate of the screen and make sure rest of the system is notified via XBMC_RESIZE for all use cases (fullscreen1 to fullscreen1, fullscreen1 to windowed1, windowed1 to windowed2, windowed1 to fullscreen2, fullscreen2 to windowed1) + + [Memphiz] + * [ApplicationMessenger] - add TMSG_VIDEORESIZE for beeing able to notify resize from non application thread + + [Memphiz] + * [osx/windowing] - update resolutions when plugging/unplugging displays + + [Memphiz] + * [osx/windowing] - don't get the display_id from the current window but obey the screenIdx parameter when querying the current resolution of a screen (else we always query the first screen even if we want to get the resolution of the newly attached second screen for example) + + [Memphiz] + * [osx/videosync] - call our UpdateClock with our hostcounter, but calc vblank with the corevideo hostcounter (at the end they might be the same) + + [Memphiz] + * [osx/videosync] - implement RefreshChanged - allows to pickup new videoref after changing displays during playback + + [Memphiz] + * [osx/videosync] - move calls to displaylink init/deinit into the vsync thread and make sure that init is only called once the display reset is done - same as GLX does + + [Memphiz] + * [osx/cocoa] - ensure that gl context is fetched via mainthread (fixes wrong vsync on external displays) + + [Rainer Hochecker] + * dvdplayer: fix unused variable after e1b2c94049fa34bc9de7d067ae2206643fe73f63 + + [Martijn Kaijser] + * [strings] add files where string id is used + + [montellese] + * CLocalizeStrings: unify fallback language handling (fixes skin strings loading) + + [Rainer Hochecker] + * videorefclock: DRM - listen to refresh change events + + [Rainer Hochecker] + * X11: set refresh rate in gfx context, fixes fps for windowed mode + + [Rainer Hochecker] + * guilib: add method for setting fps, currently fps defaults to 60hz in windowed mode which is wrong + + [uNiversaI] + * emergency fix strings bracket on tag wrong way around + + [uNiversaI] + * emergency fix: missing slash on close [/B] tag + + [montellese] + * addons: fix fallback language handling for metadata + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] automatic cosmetics for the en_gb language file + + [uNiversaI] + * [skin strings] fix remnant strings issues + + [uNiversaI] + * [strings] take 3 - capitalization & other string fixes + + [h.udo] + * [PVR] Bump add-ons to fix debian packaging + + [Rainer Hochecker] + * dvdplayer: more ff/rw fixes + + [txtranslation] + * [lang] update of internal addon language files + + [Matthias Kortstiege] + * [stacking] skip folder stacking entirely in case no patterns available + + [wsnipex] + * [depends] fix (lib)platform build + + [Rainer Hochecker] + * renderer: fix wrong subtitle position when not fullscreen + + [hudokkow] + * [audiodecoders] update to use libplatform + + [Chris "Koying" Browet] + * FIX: [stf;3D] stagefright is no longer flipped in Y + + [Rainer Hochecker] + * ffmpeg: fix 8ch audio conversion on Windows + + [Martijn Kaijser] + * bump to 15.0 rc1 + + [Thomas Amland] + * [sounds] use a better name than 'default' for sounds bundled with skin + + [Thomas Amland] + * [sounds] dont allow 'skin default' option to be selected when active skin doesnt provide sounds + + [Martijn Kaijser] + * [stings] Improve sentence for CEC settings + + [Pär Björklund] + * A possible fix for looping over a modified vector + + [Tobias Markus] + * Fix coverity #1287129 + + [Lars Op den Kamp] + * rebuilt libcec against the latest platform lib + + [Lars Op den Kamp] + * bump libplatform to 1.0.9 and include xbmc-addons.include when building it in depends + + [h.udo] + * [pvr] bumps addons to use libplatform + + [Kai Sommerfeld] + * Fixed CGUIControlButtonSetting::Update handling for CSettingAction + + [c3n] + * Added KEY_PLAYCD and KEY_PAUSECD for linux support of bluetooth headphone buttons + + [Chris "Koying" Browet] + * FIX: [audiotrack] proper detection of supported sample rates + + [Chris "koying" Browet] + * FIX: [gles] don't compile BOB OES shader if not supported + + [xhaggi] + * [cosmetics] corrects format + indentation + + [xhaggi] + * [gui] force activate fullscreen window with CApplication::SwitchToFullScreen() + + [xhaggi] + * [gui] force activate window screen calibration in CGUIDialogVideoSettings + + [Tobias Markus] + * Fix coverity #719001 + + [Arne Morten Kvarving] + * fix string + + [Memphiz] + * [rfft] - implement d'tor + + [xhaggi] + * [gui] introduce new force window activation which do not check for active modals + + [smallint] + * [imx] RGB -> BGR for RenderCapture + + [Philipp Te] + * [Confluence] - improved value order for "rating" variable + + [Memphiz] + * [jenkins] - make building of binary addons verbose for getting more compelte build output + + [uNiversaI] + * [README] fix typo coding -> code + + [uNiversaI] + * [contributing.md] some cleanup and updating + + [Anton Fedchin] + * [win32] WinRenderer: Fix possible memory leak. + + [Philipp Te] + * [Confluence] - fix some invalid values / fonts + + [Thomas Amland] + * [configure] fix python version check and add py3k check + + [Thomas Amland] + * update ax_python_devel.m4 to rev 17 + + [Memphiz] + * [fft/viz] - replaced our buggy fft implementation with rfft + + [Memphiz] + * [fft] - added kissfft based rfft implementation and unit tests for it + + [popcornmix] + * [mmalrenderer] Fix for stereo view modes + + [popcornmix] + * [renderer] Fix for number of surfaces being passed to codec + + [arnova] + * changed: Improve HTTP dir error logging + + [arnova] + * changed: Prevent Curl log spam with Webdav + only retry without range with http error 416 + + [Memphiz] + * [contrib] - added contrib dir and kissfft sources + + [Thomas Amland] + * [addons] add progress dialog for repo updates + + [Thomas Amland] + * [extendedprogressbar] fix possible division by zero + + [Thomas Amland] + * [ProgressJob] add HasProgressIndicator + + [Thomas Amland] + * [ProgressJob] let ShouldCancel update progress in non-modal dialogs + + [Thomas Amland] + * [addons] remove unused code + + [uNiversaI] + * [strings] capitalized second/third word + + [uNiversaI] + * [strings] typos/misspellings/cleanup and cosmetics. + + [Thomas Amland] + * [addons] add icon for info provider group + + [Stephan Raue] + * [AML] add support for aml-linux.xml and aml-android.xml settings file + + [Memphiz] + * [keymapping/joystick] - fix the annoying error logging which is logged in accident because altname tags are tried to be treated like mappings + + [smallint] + * IMX: Attempt to revert last buffer alignment change and to improve it + + [Memphiz] + * [KeyMapping/Joystick] - fix regression introduced in https://github.com/xbmc/xbmc/pull/5624 - allow to overwrite joystick mappings with user keymaps again + + [Hofi] + * OS X Kodi.app script target transformed into a real app bundle target + + [Rainer Hochecker] + * vaapi: prevent from draining msg queue if we ran out of surfaces + + [popcornmix] + * [mmalcodec] Limit submitted video frames. + + [popcornmix] + * [SinkPi] Handle multichannel layout more like OMXAudio + + [Memphiz] + * [keymaps/touchscreen] - add touchscreen mappings for WindowScreenCalibration + + [Memphiz] + * [WindowScreenCalibration] - make it touch gesture compatible + + [Rainer Hochecker] + * dvdplayer: fix calc for frame dropping when going ff + + [popcornmix] + * [mmalrenderer] Remove release thread - it is no longer required + + [popcornmix] + * [mmalrenderer] Add shared lock around MMAL operations + + [popcornmix] + * [mmalcodec] Add shared lock around MMAL operations + + [popcornmix] + * [mmalcodec] Remove DVDVideoCodecMMAL wrapper + + [popcornmix] + * [mmal] Separate the buffers from the decoder so decoder can be destroyed first + + [popcornmix] + * [mmalrenderer] Separate mmal and renderer configured flags + + [popcornmix] + * [mmal] Move the image pool from decoder to renderer + + [popcornmix] + * [mmal] Add some sanity checks to mmal flags + + [popcornmix] + * [mmal] Enable zero copy + + [popcornmix] + * [mmalcodec] Handle resolution change from callback + + [popcornmix] + * [mmalcodec] Return mmal buffers explicitly + + [arnova] + * changed: Log in case script does not exist + + [popcornmix] + * [mmalcodec] Remove dropping logic. It only seems to make things worse + + [montellese] + * media library: fix lost filter path due to re-creating the path history (fixes #15746) + + [montellese] + * CDirectoryHistory: make sure to set the filter path even if the path is already in the history + + [Sascha Kuehndel (InuSasha)] + * [skin.confluence] fix overlapping mute-bug in FullscreenVideo/OSD + + [popcornmix] + * renderer: Use a structure for information passed from renderer to codec + + [popcornmix] + * [pi/players] Make use of new scheme to submit DTS timestamps + + [wsnipex] + * [cmake] add libplatform to kodi-platform depends + + [Rainer Hochecker] + * Revert "[ActiveAE] - ActiveAESink: Change several LOGNOTICE to LOGDEBUG to reduce kodi.log "spamming"." - settings are not loaded at this time and debug logs go to nirvana + + [Hofi] + * Fixed OS X i386 Xcode builds on x86_64 build machines + + [fritsch] + * IMX: Fix path to edid on default imx kernel + + [Martijn Kaijser] + * update re-Touched skin + + [fritsch] + * SysfsUtils: don't create files when writing values - silence warnings + + [Rainer Hochecker] + * dvdplayer: fix display time after 43b6cf683abf16bc41e9b7f624a678c285c85c97 + + [Rainer Hochecker] + * addons: pvr and audiodecoder are optional addons, disable by default + + [uNiversaI] + * [README.pvr] update/point to compile procedures + + [uNiversaI] + * [README.linux] update/cleanup - keep up with current code + + [uNiversaI] + * [remote] add support to delete in MyPictures via remote + + [Anton Fedchin] + * [win32] Fix: CWinIdleTimer::StartZero - do not set ES_SYSTEM_REQUIRED and ES_DISPLAY_REQUIRED if DPMS is active. + + [Arne Morten Kvarving] + * fixed: make sure we don't match a substring of an extension or a mime type + + [Pär Björklund] + * Fixed msg 31117 to match 31116 + + [uNiversaI] + * [strings] fix capitalized second/third word + + [hudokkow] + * Ignore android build artifact + + [John Rennie] + * Allow uppercase input via SMS + + [Philipp Te] + * Control.cpp: remove trailing whitespaces + + [Philipp Te] + * Python: ControlList - add ALL items to the list + + [arnova] + * Revert "[davfile] use PROPFIND for Stat() and Exists()". Proper fix will follow later. + + [xhaggi] + * [messenger] fix wrong parameter usage for TMSG_GUI_WINDOW_CLOSE + + [xhaggi] + * [addons] fix launch addon from within CGUIDialogAddonInfo + + [Max Kellermann] + * configure.ac: pass $CFLAGS to $CC in XB_FIND_SONAME + + [Max Kellermann] + * configure.ac: do Darwin specific check only on Darwin + + [ronie] + * [Confluence] fix misaligned date label + + [Memphiz] + * [cmake] - only evaluate the sudo check on linux. On darwin with cmake 2.8.12 the execute_process with the multiple commands inside doesn't seem to work (it detects that it needs sudo and so it doesn't install into the addons dir). Bumping to cmake 3.2.2 was an other solution which made it work but bumping cmake is considered to dangerous at this stage. Fixes missing addons on ios and osx builds. + + [Chris "koying" Browet] + * FIX: [sysfs] do not try to create files + + [Sam Stenvall] + * [pvr] change "recording deleted" to "timer deleted" to avoid confusion + + [Stephan Raue] + * [AML] fix sysfs path for permissions check + + [Lars Op den Kamp] + * [cec] bump to libCEC 3.0.0 + + [Chris "Koying" Browet] + * FIX: [gles;font] do not clip rotated text + + [arnova] + * fixed: Don't try to delete empty filename + + [Sascha Kuehndel (InuSasha)] + * [Skin] optimitation for picons in livetv many picons have transparent background and an other dimention as cover images. - no border around picon in fullscreen - center picon vertical, and adjust vertical position + + [Garrett Brown] + * [cosmetic] Debug log: fix typo in units + + [Rainer Hochecker] + * dvdplayer: make sure not to block more than 50ms in renderer when ff/rw + + [Rainer Hochecker] + * dvdplayer: make sure not to display frames with pts > pts at screen when rw + + [Rainer Hochecker] + * dvdplayer: use time of frame on screen for displayed time + + [ronie] + * [Confluence] make button focusable with a mouse - fixes #15955 + + [Violet Red] + * Fix: Queue item not working for music videos + + [Chris "Koying" Browet] + * FIX: [droid] tweak storage stat display + + [Chris "Koying" Browet] + * FIX: [droid] rework storage provider + + [uNiversaI] + * [resource.ui.sounds.confluence] give trustyinguishing name and add icon + + [Martijn Kaijser] + * bump to 15.0 beta2 + + [Sam Stenvall] + * [pvr] change the way the "recording deleted/completed" message is determined. Instead of looking at timestamps we look at the last known state of the timer, which is way more reliable. + + [phate89] + * Fix series optical media files + + [taxigps] + * add advanced setting assfixedworks + + [phate89] + * Honor episode bookmarks in bd simple menu + + [montellese] + * upnp: fix renderer's PlayMedia() + + [Daniel] + * Add romanian keyboard layout + + [Matthias Kortstiege] + * [videodb] consider removable drives when checking for matching source during library cleanup + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [montellese] + * upnp: add a setting to allow users to enable looking for external subtitles in the ContentDirectory implementation + + [montellese] + * upnp: only look for and provide external subtitles for players and renderers + + [montellese] + * upnp: introduce UPnPService and pass them to BuildObject() + + [montellese] + * upnp: cosmetics in UPnPInternal.h/cpp + + [Matthias Kortstiege] + * [recentlyadded] no need to fetch artist separately + + [Arne Morten Kvarving] + * added: allow setting connection timeout for curl urls through a protocol option + + [popcornmix] + * alsalib: Build with enable-shared + + [NedScott] + * Allow smaller minimal subtitle size in settings.xml + + + [uNiversaI] + * [resource.ui.sounds.confluence] give trustyinguishing name and add icon + + [Martijn Kaijser] + * bump to 15.0 beta2 + + + [Martijn Kaijser] + * update splash image for beta + + [hudokkow] + * [pvr] Add new pvr.stalker add-on + + [Rainer Hochecker] + * ActiveAE: slightly reduce buffer size + + [xhaggi] + * [seekhandler] use only the first step forward/backward for a seek without a delay + + [xhaggi] + * [seekhandler] refactors GetSeekSeconds() to not update member m_seekStep + + [xhaggi] + * [seekhandler] don't use process roundtrip for SeekSeconds() + + [xhaggi] + * [seekhandler] no need for member m_performingSeek as we use locks + + [popcornmix] + * [mmalrenderer] Fix initialisation of m_format in init_vout + + [Pär Björklund] + * curl uses fputs to write the header for it's cookie file + + [Sam Stenvall] + * [pvr] copy some group properties immediately when the group is loaded from the database, otherwise the new group will be marked as "changed" a bit further down which causes all groups to be persisted every time the PVR manager starts + + + [wsnipex] + * [linux] install UseMultiArch.cmake file + + [Brandon McAnsh] + * [droid;packagaing] Remove non-relevant comment + + [Anton Fedchin] + * [pictures] SlideShowPicture: fix texels to display only filled part of texture instead of displaying whole texture. + + + + [uNiversaI] + * [confluence] fonts, update licencing/copyright. + + [uNiversaI] + * [confluence] update roboto fonts + + + [xhaggi] + * [seekhandler] get rid of CGUIInfoManager dependency + + [xhaggi] + * [seekhandler] get rid of inaccurate seek size percent calculation + + [Anton Fedchin] + * [win32] CLog: Do not use FlushFileBuffers after each write to file which causes unnecessary performance penalties. + + [Rainer Hochecker] + * player: implement SeekTimeRelative, disable accurate seeking for relative seeks + + + + [Thomas Amland] + * [addons] lazy load translated context item label + + [Rainer Hochecker] + * videorefclock: fix deadlock in glx method + + [Thomas Amland] + * [addons] fix multiple edge cases of pre/post-(un)installing not working correctly for services/context items + + [Thomas Amland] + * [addons] move enabling/disabling responsibility out of database to manager + + [Thomas Amland] + * [addons] remove unused IsAddonInstalled method + + [Thomas Amland] + * [addons] remove dead code + + [wsnipex] + * [binary addons] use multi arch install paths + + [wsnipex] + * [configure] properly set multi arch kodi libdir in kodi-config.cmake + + + [Rainer Hochecker] + * dvdplayer: add missing msg handler for GENERAL_SYNCHRONIZE + + [Rainer Hochecker] + * dvdplayer: fix crash caused by GENERAL_SYNCHRONIZE messages + + [uNiversaI] + * [English language] typo capitalized second word + + [ronie] + * [re-touched] skin update + + [xhaggi] + * [keymaps] map ReloadKeymaps to shift+control+k and ToggleDebug to shift+control+d + + [NedScott] + * [keymaps] replace smallstepback with built-in Seek(-7) + + [ace20022] + * [AudioEngine] Cleanup includes. + + [ace20022] + * [DllLoader] Cleanup includes. + + [ace20022] + * [cores] Cleanup includes. + + [ace20022] + * [VideoRenderers] Cleanup includes. + + [ace20022] + * [PlayerCoreFactory] Cleanup includes. + + [ace20022] + * [ExternalPlayer] Cleanup includes. + + [ace20022] + * [paplayer] Cleanup includes. + + [ace20022] + * [dvdplayer] Cleanup includes. + + [montellese] + * jsonrpc: replace static Addon.Types type with dynamically created one to fix missing addon types + + [Sam Stenvall] + * add pvr.vbox (new PVR addon) + + [Rainer Hochecker] + * AE: fix init of resampler (remapper) after flush + + [Andrew Fyfe] + * FIX: update link between movie and tv shows when saving a movies details + + [Thomas Amland] + * [addons] dont show addons from disabled repos in 'All repositories' + + [xhaggi] + * [settings] adjusts seek steps default configurations + + [Memphiz] + * [input/touch] - when translating mapped touch events don't loose the actionstring so that builtin functions can be used. - fixes #15245 + + [xhaggi] + * [gui] move check of active modals before opening a new window from CBuiltins to CGUIWindowManager + + [Thomas Amland] + * [language] fix unescaped double quotes + + [Pär Björklund] + * Don't treat smb connections to same machine as a local path + + [Ryan Gribble] + * [pvr] Bump pvr.wmc to version 0.5.3 (PVR API 1.9.6) https://github.com/kodi-pvr/pvr.wmc/commit/37b4b292d56885489aa8949bd70b54babb41b898 + + [Rainer Hochecker] + * dvdplayer: do not check buffering levels while in dvd menu + + [fritsch] + * Application: Show passthrough indicator in passthrough mode + + [ronie] + * [Confluence] add DefaultAddonUISounds.png + + [h.udo] + * [VideoSyncIos.h] Typo + + [Rainer Hochecker] + * AE: only push valid buffers to m_discardBufferPools, fix segfault on close right after open of stream + + [Chris "Koying" Browet] + * FIX: passthrough volume warning no longer showed + + [Matthias Kortstiege] + * [switchplayer] fix multiple ghost choices in contextmenu + + [Rainer Hochecker] + * dvdplayer: proper flush when triggering resync after a stall + + [Matthias Kortstiege] + * [video] no need to re-fetch (and stack) directory in case we already know about it + + [ronie] + * [Confluence] last updated label + + [Shine] + * Don't delay subtitles by display latency + + [Thomas Amland] + * addonbrowser: change 'Required Dependencies' to just 'Dependencies'. Required sort of implied + + [Thomas Amland] + * addonbrowser: list 'all repositories' on top. regression after refactor + + [Thomas Amland] + * addonbrowser: disable broken/foreign filters outside of repository + + [Thomas Amland] + * addonbrowser: add categories (and 'all') to 'my addons' + + [Thomas Amland] + * addonbrowser: make internal functions static + + [Thomas Amland] + * addonbrowser: remove 'system addons' group. merge with my/deps + + [Thomas Amland] + * addonbrowser: hide info provider group if empty + + [Thomas Amland] + * addonbrowser: hide orphaned node if empty + + [Thomas Amland] + * addonbrowser: improve performance of orphan filtering + + [Thomas Amland] + * addonbrowser: move the more 'advanced' features to a manage sub-directory + + [Thomas Amland] + * addonbrowser: improve 'running addons'. check with script invocation manager if service is actually running + + [Thomas Amland] + * [infomanager] add listitem.endtime support for video items + + [Thomas Amland] + * addonbrowser: add 'Updated' window property containing the last datetime repositories was checked for updates + + [montellese] + * videodb: add a delete trigger for the files table + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' not working for episodes in directories + + [Glenn-1990] + * [confluence] shrink dialog as we have less items now + + [Rainer Hochecker] + * dvdplayer: reduce time for initial audio sync + + [popcornmix] + * [mmalcodec] Move port format setup into init_vout + + [popcornmix] + * [mmalrenderer] Move dec_input_port_cb into class + + [popcornmix] + * [mmalcodec] Remove ReturnBuffer function + + [popcornmix] + * [mmalcodec] Explicitly init variables + + [popcornmix] + * [mmal] Remove unused variables + + [popcornmix] + * [mmalcodec] Fix for inverted check for first frame + + [popcornmix] + * [mmalrenderer] Avoid blank frame on resolution change + + [popcornmix] + * [mmalrenderer] logging update and remove a warning + + [popcornmix] + * [mmalrenderer] Reset m_buffers on PreInit + + [popcornmix] + * [mmalrenderer] Add auto select as explicit deinterlace method + + [popcornmix] + * [mmalcodec] Also treat VS_INTERLACEMETHOD_NONE as disabled + + [popcornmix] + * [mmalrenderer] Add locking around m_droppedPics + + [popcornmix] + * [mmalcodec] Move m_output_busy into lock + + [popcornmix] + * [mmalrenderer] Avoid submitting a buffer to renderer twice + + [popcornmix] + * [mmalcodec] Explicitly use fast deinterlace for HD and reduce buffers allocated by 2 + + [xhaggi] + * [pvr] adds missing videoplayer info label for episode name + + [da-anda] + * [settings] only add a separator if it's not the first list item of the first settings group + + [Glenn-1990] + * [pvr] remove not used string + + [montellese] + * settings: fix position of musiclibrary.showallitems setting + + [popcornmix] + * [omxplayer] Handle failures from EmptyThisBuffer and FillThisBuffer + + [Matthias Kortstiege] + * [stringutils] do not capitalize after apostrophes + + [xhaggi] + * [pvr] expose timer epg info for listitem labels + + [montellese] + * CLangInfo: fix GetMeridiemSymbol to return the proper string based on the current 12/24-hour clock settings + + [popcornmix] + * [omxplayer] Limit subtitle updates to avoid closed caption stutters + + [popcornmix] + * rbp: Use new dispmanx function for vsync callbacks + + [popcornmix] + * [rbp] Add Pi 2 specific settings defaults + + [popcornmix] + * [omximage] Increase timeout - this is sometimes hit + + [popcornmix] + * [rbp] Disable analogue output of sink when passthrough is enabled + + [popcornmix] + * [OMXAudio] Make stereoupmix and fixed behave more like dvdplayer + + [Memphiz] + * [jenkins/win32] - enable webserver unit tests + + [dhacker29] + * android: Fix the readme to reflect the changes to bump SDK to 17 + + [Glenn-1990] + * [pvr] fix: no channel set error + + [Glenn-1990] + * [pvr] radio and tv are separated now.. + + [ronie] + * [Confluence] GlobalSearch: add EPG search support + + [ronie] + * [Confluence] fix header label + + [Stephan Raue] + * [IMX] EGLNativeTypeIMX.h: include EGL/egl.h to fix build after https://github.com/xbmc/xbmc/commit/c3116fdfd515b674242a44d0b0eadbe423ec5794 + + [Rainer Hochecker] + * dvdplayer: compare to absolute sync error, fix sync issues for large negative errors + + [Karlson2k] + * [depends] Update libmicrohttpd to SVN 35533. Should resolve WebServer shutdown issue. + + [Rainer Hochecker] + * dvdplayer: flush audio sync errors on resume and resync + + [Rainer Hochecker] + * dvdplayer audio: fix/improve calculation of playing pts + + [Rainer Hochecker] + * dvdplayer audio: do not consider dropped packets for sync error + + [xhaggi] + * [musicdb] improves performance for querying the album view + + [fritsch] + * Application: Don't slow down videos rendered on GuiLayer + + [Rainer Hochecker] + * dvdplayer: ffmpeg-vda - ignore silly 3-byte nal encoded files + + [Rainer Hochecker] + * dvdplayer: make ffmpeg vda default + + [Rainer Hochecker] + * dvdplayer: rework ffmpeg vda + + [Matthias Kortstiege] + * [davfile] use PROPFIND for Stat() and Exists() + + [da-anda] + * [settings] change logical order of some subtitle and EPG related settings + + [da-anda] + * [Language] remove obsolete strings + + [da-anda] + * [Language] shorten labels in system settings and make them less technical + + [da-anda] + * [Language] improve PVR labels + + [da-anda] + * [Language] shorten labels in services/network settings an make them less technical + + [da-anda] + * [Language] shorten labels in appearance settings + + [da-anda] + * [Language] shorten labels in audio settings and make them less technical + + [da-anda] + * [Language] shorten labels in video settings and make them less technical + + [da-anda] + * [Language] get rid of "EPG" and use "Guide" instead to be consistent + + [da-anda] + * [Language] use "information provider" instead of "scraper" to be consistent with addon manager category + + [da-anda] + * [Language] remove references to "Kodi" in settings labels where appropriate + + [Martijn Kaijser] + * [skin] Updated re-Touched + + [Rainer Hochecker] + * ffmpeg: bump to 2.6.2 + + [Rainer Hochecker] + * dvdplayer audio: proper handle resume if playspeed is already normal + + [Rainer Hochecker] + * AE: flush resampler when flushing buffers + + [Rainer Hochecker] + * dvdplayer: improve audio sync for large packet durations + + [Rainer Hochecker] + * [PVR] disable thumb extraction for pvr recordings + + [ronie] + * add library://music path + + [Matthias Kortstiege] + * [videoinfoscanner] re-scrape season art for newly added seasons + + [Matthias Kortstiege] + * [videoinfodownloader] adds scrapers GetArtwork method + + [Matthias Kortstiege] + * [scraper] added GetArtwork function + + [Chris "Koying" Browet] + * FIX: [droid] amlcodec scale after aml egl + + [Chris "koying" Browet] + * FIX: [eg] only compile what's necessary per platform + + [Chris "Koying" Browet] + * ADD: [droid;aml+rk] specific aml and rk egl windowing for droid; allows framerate autoswitch + + [Chris "Koying" Browet] + * CHG: [droid] let the system handle volume + + [Chris "Koying" Browet] + * ADD: ACTION_VOLUME_SET to set absolute volume level + + [Rainer Hochecker] + * dvdplayer/omxplayer: protect live streams (pvr) from stalling + + [Rainer Hochecker] + * dvdplayer: cosmetics + + [Arne Morten Kvarving] + * fix wrong include path + + [Arne Morten Kvarving] + * add missing include in Encoder.cpp + + [Arne Morten Kvarving] + * add missing include in TestFileFactory + + [Arne Morten Kvarving] + * fixed: don't pass NULL pointer for boolean argument + + [Arne Morten Kvarving] + * fixed: bitwise and intended, not logical + + [Arne Morten Kvarving] + * fixed: give enum a name + + [Arne Morten Kvarving] + * add missing include + + [Arne Morten Kvarving] + * remove unused arrays and defines + + [Arne Morten Kvarving] + * fixed: quell pointer -> integer conversion warning + + [Arne Morten Kvarving] + * remove useless check + + [Chris "Koying" Browet] + * FIX: [egl;font] assert if cache texture was not created + + [Thomas Amland] + * [python] add DelayedCallGuard to xbmcvfs.listdir. closes #14212 + + [Thomas Amland] + * dont install sounds directory + + [Thomas Amland] + * improve consistency of gui sounds related strings + + [Matthias Kortstiege] + * [osx/ios] xcode sync for ui sound addons + + [Thomas Amland] + * [addons] hook up ui sound addons to the gui audio manager and settings + + [Thomas Amland] + * [addons] move sounds from confluence skin to a resource addon + + [Thomas Amland] + * remove bursting bubbles sounds (moved to addon repo) + + [Thomas Amland] + * [addons] add new ui sounds resource addon type + + [Violet Red] + * Include MusicVideos when creating playlists + + + [Memphiz] + * [osx/ios] - mention xcode 6.3 support in osx and ios readme + + [Memphiz] + * [osx/ios] - fix compilation with newest apple clang (xcode6.3) - disable forward declaration of boost containers (those broke compilation with c++11 and latest apple clang) + + [Memphiz] + * [depends/libffi] - pass the "don't use std asm" only to the CCASFLAGS - fixes configure failing to detect working c compiler in xcode6.3 + + [Matthias Kortstiege] + * [bookmarks] remove trailing semicolon + + [Memphiz] + * [depends/nettle] - disable build of testsuite (doesn't compile with clang from xcode6.3) + + [fritsch] + * IMX: Don't try to open width > 1920 hw is not capable to do so + + [fritsch] + * IMX: Only fallback to ffmpeg for AVC with level 3.0 - others are fine + + [fritsch] + * EGLNativeTypeIMX: Fix boolean return and close ifstream properly + + [xhaggi] + * [seek] improves instant seek in seek handler + + [fritsch] + * Only use videoplayer.limitguiupdate on Pi and IMX + + [Arne Morten Kvarving] + * added: 'volumeamplification' action to show slider + + [montellese] + * jsonrpc: add explicitly named parameters to Player.Seek and support seeking by a number of seconds + + [fritsch] + * IMX: Fix Screenshot v4 + + [fritsch] + * IMX: Warn once when frames are received but VPU detects interlaced content + + [xhaggi] + * [cosmetic] put statement of single line if to new line + + [xhaggi] + * [cpp] use c++ style casts in CSeekHandler + + [xhaggi] + * [builtin] adds new builtin for seeking + + + [Sam Nazarko] + * iMX: Only align dest Rects to 2 - cares for artifacts + + [fritsch] + * IMX: Read Text strings without trailing and leading n + + [Memphiz] + * [win32] - sync project + + [Arne Morten Kvarving] + * move CUtil tests to gtest unit tests + + [xhaggi] + * [xcode] sort IActionListerner.h alphabetically + + [ace20022] + * [dvdplayer] Use a message for AddSubtitle to prevent possible races. + + [ace20022] + * [dvdplayer][vob subs] Add better support for vob subtitles with multiple streams. + + [ace20022] + * [dvdplayer] Refactor AddSubtitleFile, i.e., remove unused parameter. + + + [AlwinEsch] + * [pvr.argustv] Bump pvr.argustv@96ee875 + + [ronie] + * [Confluence] unify filemanager list + + [ronie] + * [Confluence] cosmetics + + [fritsch] + * RPB: Adjust settings to also use new limitgui setting + + [fritsch] + * IMX: Add special settings file with render reduction + + [fritsch] + * Lang: Add ressources strings for Gui Limits + + [Rainer Hochecker] + * fix fading of CGUIImage + + [Rainer Hochecker] + * dvdplayer: trigger resync of players after audio stream stalled + + [Rainer Hochecker] + * dvdplayer: improve audio sync + + [Sam Stenvall] + * [pvr] check linked recordings when determining if an EPG tag is currently being recorded + + [Matthias Kortstiege] + * [infomanager] add ListItem.IsCollection + + [phil65] + * [CONFLUENCE] - add list flags for ListItem.IsCollection + + [popcornmix] + * renderer: Allow gui updates to be skipped when playing video + + [montellese] + * upnp: split up starting/stopping of the client (browser) and the controller + + [montellese] + * network: fix some wrong UPnP related calls to be able to stop the client and server + + [montellese] + * upnp: make services.upnpcontroller a sub-setting of services.upnpserver (it depends on it already anyway) + + + [Anton Fedchin] + * [pvr.iptvsimple] Bump pvr.iptvsimple@a2e6c6f + + [phil65] + * [CONFLUENCE] - cleaned up PlayerControl RepeatButton images + + [taxigps] + * use subtitle settings to set ASS/SSA subtitles position + + [taxigps] + * add a member m_viewRect to CBaseRenderer and a 3rd argument view to GetVideoRect + + [taxigps] + * bump libass to version 0.12.1 + + [arnova] + * fixed: Declaration order + wrong prototype (cosmetics) + + [arnova] + * changed: Refactor ImageLoader to improve error handling when e.g. texture loading fails + + [Sam Stenvall] + * [pvr] fix wrong logic which made it impossible to persist changes in the channel manager dialog + + [Violet Red] + * Keep playlistid=playerid in JSON interface + + + [Chris "Koying" Browet] + * Fixup 3D sub: remove unnecessay include + + [Pär Björklund] + * make lirc a bit more thread safe + + [Gordon Ellis] + * Fixed some lingering grammar errors from the name change to Kodi + + [Rainer Hochecker] + * dvdplayer: unpause PVR playback after channel switch + + + [AlwinEsch] + * [confluence] Add settings group title support + + [AlwinEsch] + * [settings] Add coded group title support + + [AlwinEsch] + * [settings] Add group title support + + [AlwinEsch] + * [settings] Add single control type to CSettingGroup + + [Chris "Koying" Browet] + * ADD: [vkeyboard] to toggle use left/right/enter the keyboard way + + [Chris "Koying" Browet] + * FIX: actually remove excluded addons + + [Chris "Koying" Browet] + * FIX: [droid;packaging] handle addons libraries + + [Matthias Kortstiege] + * [videodb] cleanup files from removed media sources + + [Chris "Koying" Browet] + * ADD: Handle bitmap subtitles in 3D + + [montellese] + * smartplaylist: fix filtering musicvideos by artists + + [montellese] + * videodb: fix partymode with filtered musicvideos through GetMusicVideoIDs() with WHERE clause (fixes #15989) + + [Rainer Hochecker] + * goom: drop unneeded file which bothers git + + [Rainer Hochecker] + * fix gui fps indicator for cases like dr kicks in + + [Matthias Kortstiege] + * [util] refactored ScanForExternalSubtitles to fetch the media's basepath instead of stating all kind of non-existing directories + + [Matthias Kortstiege] + * [uriutils] moved GetParentDir from VideoInfoScanner to URIUtils - renamed to GetBasePath + + [Matthias Kortstiege] + * [music] added mood for songs + + + + [ace20022] + * [Fix] Fix the Blu-ray simple menu entry "select from all titles...". + + [Chris "koying" Browet] + * FIX: [droid] Samba 3.6.12 (gplv3) + + [Sam Stenvall] + * [README.pvr] fixed old name and URL (closes #15866) + + [Chris "Koying" Browet] + * FIX: [jni] Do not detach UI thread + + [arnova] + * changed: Allow extraction for all protocols except for HTTP + FTP when NOT on a LAN + + [arnova] + * added: URIUtils::IsHTTP() function + + + [Andrew Fyfe] + * [xbmc.webinterface] fix typo in webinterface.xsd + + [Rainer Hochecker] + * linux: fix libsse4, compile with correct flags + + [Matthias Kortstiege] + * [fileitem] no need to stack or check for thumbs on library:// folders + + [Memphiz] + * [fontconfig] - bump to 2.11.1 - fixes #15864 + + + [Rainer Hochecker] + * dvdplayer: do not bail out if av_find_stream_info fails for mpegts + + [arnova] + * changed: Use toasts to report video and music db export errors instead of modal dialog + + [arnova] + * fixed: Dialog would not close properly when an exception occurred + + + [Matthias Kortstiege] + * [music] remove search node - sidebar already has search integrated + + [Matthias Kortstiege] + * [musicdb] added infomanager hascontent checks for singles and compilations + + [Matthias Kortstiege] + * [musicdb] enable the library via xml + + [Stefan Saraev] + * [replaytv] minor cleanup after pull/6798 + + [Stefan Saraev] + * [replaytv] remove replaytv support + + [Stefan Saraev] + * [daap] remove daap support + + [montellese] + * jsonrpc: add "compilation" property to AudioLibrary.GetAlbums + + [montellese] + * jsonrpc: add "includesingles" parameter to AudioLibrary.GetAlbums + + [montellese] + * jsonrpc: add "releasetype" for albums and "albumreleasetype" for songs + + [montellese] + * musicdb: add CMusicDatabase::GetSinglesCount() + + [montellese] + * musicdb: add strReleaseType to album table and use it to filter albums/singles + + [montellese] + * music: move decision whether an album is a single or not into CMusicInfoScanner + + [montellese] + * music: add support for album release type to CMusicInfoTag + + [montellese] + * music: move EmbeddedArt and EmbeddedArtInfo from MusicInfoTag.h into its own header file + + [montellese] + * music: add CAlbum::ReleaseType and CAlbum::releaseType + + [h.udo] + * [pvr] Sync a bunch of addons with PVR API 1.9.6 + + [Martijn Kaijser] + * bump to 15.0 beta1 + + [xhaggi] + * [gui] removes obsolete close of child dialogs in video/music osd + + [xhaggi] + * [gui] use CloseInternalModalDialogs() where possible + + [xhaggi] + * [cosmetic] indentation, comments and simplify button label decision + + [xhaggi] + * [video] close bookmark dialog after select an item + + [xhaggi] + * [video] don't open the bookmark dialog if no playback exists + + [xhaggi] + * [video] adds ListItem properties IsChapter/IsBookmark + + [xhaggi] + * [video] don't add bookmarks of type resume in bookmark dialog + + [xhaggi] + * [confluence] use Label and Label2 to separate bookmark name and time + + [xhaggi] + * [video] separate bookmark/chapter name and time in Label and Label2 + + [Matthias Kortstiege] + * [video] human readable chapter and bookmark labels + + [Rainer Hochecker] + * do not enable remote control on initialize, respect app params + + [xhaggi] + * [gui] rename CloseModalDialogs to CloseInternalModalDialogs + + [Memphiz] + * [advancedsettings] - changed applydrc to be a float instead of bool + + [Memphiz] + * [AudioCodecFFMPEG] - disable drc in audio codec context when advancedsetting "applydrc" is disabled + + [xhaggi] + * [gui] exclude addon/python dialogs in window manager's CloseModalDialogs() + + [wsnipex] + * [curl] use better method to stat shoutcast and friends + + [xhaggi] + * [video] select proper bookmark item based on current playtime + + [xhaggi] + * [video] unify bookmarks/chapters and sort them by resume point + + [manuel] + * [pvr.dvbviewer] Bump to kodi-pvr/pvr.dvbviewer@bd2c01f + + [Bernd Kuhls] + * Remove lib/enca/ + + [Matthias Kortstiege] + * [settings] allow hide watched toggling in files node + + [wsnipex] + * [configure] add option to disable lirc + + [Menno] + * Added permissions for master mode to remove items from library when in RO account. + + [Anssi Hannula] + * [AE] ALSA: Fix DeviceChange event triggered by enumeration + + [Anssi Hannula] + * [AE] ALSA: Add more logging to device change triggers + + [Anssi Hannula] + * [AE] ALSA: Add ALSADeviceMonitor for monitoring ELD changes + + [Anssi Hannula] + * [AE] ALSA: Add ALSADeviceMonitor for monitoring card removals/additions + + [Anssi Hannula] + * [linux] Add FDEventMonitor for monitoring file descriptors + + + [Matthias Kortstiege] + * [muscidb] do not blindly add karaoke genre + + [Chris "Koying" Browet] + * FIX: [droid;amc] crash when calling dispose twice + + [Matthias Kortstiege] + * [stacking] remove loose 'd' from video stack expressions (fixes #15882) + + [montellese] + * python: fix HAS_WEB_SERVER ifdef guard in AddonModuleXbmcwsgi.i (fixes #15849) + + [montellese] + * codegenerator: add support for "footer" code insertion block to python template + + [Mateusz Lewicki] + * fix for gamepad volume change + + + [Chris "Koying" Browet] + * fixup: [breakpad;jenkins] save symbols tarball + + [Chris "Koying" Browet] + * ADD: [droid] implement Google Breakpad for minidumps + + [Chris "Koying" Browet] + * FIX: [aml] fallback to codec_id if codec_tag is unknown + + [Chris "Koying" Browet] + * FIX: [aml] check size (and realloc) of header buffer + + [Chris "Koying" Browet] + * [aml] add rotation to render features + + [Chris "Koying" Browet] + * FIX: [amcodec] remove problematic check (solves "[h264 aml error] 00001.ts") + + [davilla] + * pivos: [amcodec-hack] pvr can reopen too fast, slow us down a little + + [uNiversaI] + * [Default webinterface] make add-on name more descriptive + + [ace20022] + * [Fix] dvdplayer: Only one (external) vobsub could be displayed due to a wrong source numeration. + + [xhaggi] + * [gui] fix endless loop in CloseDialogs() if not force close + + [xhaggi] + * [gcc] fix gcc 4.6 compiler error introduced by #6828 + + [Kai Sommerfeld] + * [pvr] Bump pvr.hts to version 2.1.7 + + [Anton Fedchin] + * [pvr.iptvsimple] Sync prv.iptvsimple. CONTRIBUTING.md Kodi.xcodeproj LICENSE.GPL Makefile.in Makefile.include.in README.md VERSION addons bootstrap bootstrap.mk build-aux codegenerator.mk configure.ac copying.txt debian docs doxygen_resources gitrev gitrev.sh lib m4 media project sounds system tools userdata version.txt xbmc xbmc-xrandr.c Fix loading add-on on android. + + [Chris "Koying" Browet] + * FIX: [droid] consistent splash error handling + + + [Pär Björklund] + * Only log first connection attempt to avoid spamming the logs, also some cleanup + + + [Rainer Hochecker] + * dvdplayer: fix audiosync for rr not equal to 1.0 + + [Rainer Hochecker] + * fix and cleanup after codec removal from paplayer + + [xhaggi] + * [gui] playback an error sound if window switch is refused + + [xhaggi] + * [gui] don't switch to another window if there are active modal dialogs + + [arnova] + * changed: Set default buffer factor to 4 to allow faster filling + + [arnova] + * fixed: Buffer factor should not set higher read rate demands but instead have filecache increase its limiter + + [arnova] + * added: Debug logging for low read rate condition + + + [Dmitry Sandalov] + * [README.ubuntu] ppa sources, provided package + + [arnova] + * fixed: Bunch of compile warnings + + [arnova] + * fixed: String not found comparison was wrong in URL.cpp + fixed compile warning + + + [Pär Björklund] + * [tests] Get rid of a bunch of forced conversion to bool warnings and some cleanup as well + + [uNiversaI] + * [confluence] add pcm, pcm_s16le and pcm_s24le flags + + [Matthias Kortstiege] + * [tagloader] make TagLoaderFactory load by item (fixes #15879) + + [BigNoid] + * [confluence] Move dialog background to include + + [Memphiz] + * [jenkins/tests/win32] -exclude webserver tests for win32 because each one lasts 120 secs or so + + [Memphiz] + * [jenkins/win32] - add buildstep for building and running testsuite + + + [Memphiz] + * [jenkins] - prevent cleanout of native tools when pathChanged returns 1 in make-native-depends (due to Configuration set to RELEASE) + + [Memphiz] + * [tests] - fix charsetconverter unit tests by initialising CSettings singleton (else g_charsetConvert will access NULL-Ptr settings) + + [Memphiz] + * [Tests] - fix compilation + + [montellese] + * musicdb: remove unused GetVariousArtistsAlbums*() methods without implementation + + [Matthias Kortstiege] + * [video] removed old unused library <-> files toggle code + + [hudokkow] + * [Keyboard Layouts] Add missing characters in Greek keyboard + + [hudokkow] + * [Keyboard Layouts] Add missing characters in German keyboard + + [Kib] + * [readme.md] Updated link to coding guidelines + + + [Rainer Hochecker] + * vaapi: reduce refs by one after rework of frame threading + + [Rainer Hochecker] + * dvdplayer - rework frame therading for ffmpeg + + [uNiversaI] + * [project readme.md] update quick links + + [Matthias Kortstiege] + * [stringutils] fix sizestring alignment + + [Memphiz] + * [AE/CA/osx] - fillup the stream with up to 64 unknown channels fixes support for studio audio devices with more then 16 unused/unknown channels in one stream - fixes #15874 + + [Memphiz] + * [AE] - extend the number of unknown channels from 16 to 64 + + [Anton Fedchin] + * [pvr.iptvsimple] Sync win v.1.11.0 (API 1.9.6) + + [Rainer Hochecker] + * fix frametime for active vsync + + [Rainer Hochecker] + * guilib: only update scrollinfo if frametime did change + + + [ronie] + * [Confluence] fix 2D button after PR#6345 + + [xhaggi] + * [gui] only close active modal dialogs if closing a media window + + [xhaggi] + * [gui] new method CGUIWindowManager::CloseModalDialogs() to close modal dialogs only + + [xhaggi] + * [gui] unify CGUIWindowManager::AddModeless/RouteToWindow into new method RegisterDialog() + + [wsnipex] + * [binary addons] bump kodi-platform (fixes #15870) + + [Kai Sommerfeld] + * [pvr] fixed regression in CGUIInfoManager::GetItemLabel, LISTITEM_NEXT_* + + [Marcel Groothuis] + * GUIInfoManager: fix PVR recording genre display + + [Rainer Hochecker] + * dvdplayer: fix mem leak in ffmpeg decoder + + [Rainer Hochecker] + * dvdplayer: fix memleak in ffmpeg demuxer + + [Garrett Brown] + * [input] Change GetFrameTime() to SystemClockMillis() + + [Rainer Hochecker] + * dvdplayer: adjust threshold of audio errors to frame duration + + [Garrett Brown] + * [input] Untangle key processing from key translation + + [Daniel Scheller] + * Fix compile with gcc-4.6 (e.g. Ubuntu Precise) after 799094a838d12cc6f9513bd576d35f37668176e8 + + [uNiversaI] + * [keyboard] add/restore track rating functionality + + [uNiversaI] + * [remote] restore track rating functionality + + [montellese] + * addons: find and use the best matching translation for an addon summary/description/disclaimer + + [montellese] + * utils: add CLocale::FindBestMatch() to find the best matching locale from a list of locales + + [Karlson2k] + * Revert "[emufnc] Disable support for READ_TRUNCATED. To be reverted after Helix release." + + + [ronie] + * [Confluence] add another missing default icon + + [ronie] + * [Confluence] add missing default icons + + [Rainer Hochecker] + * [pvr.vnsi] sync with API 1.9.6 + + [Garrett Brown] + * Mark static function as static + + + [Kai Sommerfeld] + * [pvr] Fix radio channelgroup support. Take over 'radio' group property supplied by client. + + + [Dusan Slijepcevic] + * New feature: Added parameters to skin include directive ($PARAM[ParamName]) + + [Dusan Slijepcevic] + * Refactored string replacer to return flag and accept functor + + [Kai Sommerfeld] + * [pvr] Improved content of pvr shutdown warning dialog. + + [Matthias Kortstiege] + * [guilib] remove obsolete always show cursor code + + [Matthias Kortstiege] + * [guilib] hint text not displayed in keyboard dialog + + [montellese] + * videodb: store the number of seasons of a tvshow in CVideoInfoTag::m_iSeason + + [popcornmix] + * [resampler] Use ffmpeg for quiet noise generation + + [montellese] + * CGUIMediaWindow: reorganise the virtual methods into groups based on where they are defined + + [montellese] + * CGUIMediaWindow: move all #defines to the top + + [montellese] + * CGUIMediaWindow: sort includes alphabetically + + [popcornmix] + * [OMXImage] Increase jpeg decode timeout + + [Lukas Rusak] + * [input] add keymap for ouya controller + + [Lukas Rusak] + * [input] add keymap for PS4 controller + + [Stefan Saraev] + * [input] add home key id for Rii i7 remote + + [Stephan Raue] + * [settings] move RSS to standard group + + [Stephan Raue] + * [input] support KEY_TV on 'devinput' devices + + + [Rainer Hochecker] + * paplayer: remove audio extensions for removed codecs + + [Rainer Hochecker] + * paplayer: drop obsolete codecs from lib + + [Rainer Hochecker] + * paplayer: drop remaining codecs, only use ffmpeg + + [Matthias Kortstiege] + * [videolibrary] adjust year sort order label + + [Matthias Kortstiege] + * [musiclibrary] adjust sort order labels (closes #15860) + + [montellese] + * fix TV language detection with HDMI-CEC + + [xhaggi] + * [pvr] fix type of CPVRChannelGroup's m_iPosition + + [ace20022] + * [lang] Also check for user defined custom language codes. + + [ace20022] + * [lang] Add custom languages to our language list. + + [xhaggi] + * [epg] fix use of new epg database column iYear + + [David Butler] + * Added some support for a titlebar-less functionality on OSX, the window is also movable by using a "drag anywhere" functionality while the titlebar is disabled... + + [Matthias Kortstiege] + * [fonts] fix font mask after 4e542f7 + + [Matthias Kortstiege] + * [art] fetch artist and album art based on album id + + [Matthias Kortstiege] + * [art] clear all artwork assigned to the CFileItemList + + [Thomas Amland] + * [addonbrowser] rearrange root menu + + [Thomas Amland] + * [addonbrowser] move information providers type addons to a sub-category + + [Thomas Amland] + * [addons] refactor and cleanup addon directory + + [Thomas Amland] + * [addonbrowser] remove date sorting. doesn't work + + [Thomas Amland] + * [addons] allow GetAllAddons to be used successively without clearing input + + [Rainer Hochecker] + * renderer: do not add overlays when eating video frames - fixes segfault + + [montellese] + * binary addons: add modplug, nosefart, sidplay, snesapu, stsound, timidity and vgmstream audiodecoders + + [montellese] + * [win32] integrate audiodecoders into the installer + + [montellese] + * [win32] make sure we have access to a patch command + + + [popcornmix] + * [omxplayer] Allow HDMI output to work when ALSA card is selected + + [Kai Sommerfeld] + * [pvr] Bump pvr.hts to version 2.1.6 (PVR addon API 1.9.6) + + [uNiversaI] + * [configure.in] rename file extension to configure.ac + + [uNiversaI] + * [bootstrap.mk] change configure.in -> configure.ac + + [Kai Sommerfeld] + * [epg] CEpgInfoTag: Reintroduced mutex protection for m_pvrchannel and m_recording. + + + [Matthias Kortstiege] + * [osx/ios] force project indent to 2 spaces - no tabs + + [xhaggi] + * [gui] fix uninitializeed iEpisode and iSeason + + [xhaggi] + * [epg] fix usage of ALTER TABLE in epg database update + + [Matthias Kortstiege] + * [osx/ios] sync project file + + [wsnipex] + * [depends] binary-addons: remove quotes around the addon list and use "all" for the list of addons + + [kajdreef] + * Fixed issue 15831 by checking for the password after the choice have been made and removed the Profile delete option + + [ace20022] + * [gui] Use a list instead of a spinner for the audio and subtitle selection via the video osd dialog. + + [ace20022] + * [Fix][bluray] Allow reading the disc's root directory. + + + [xhaggi] + * [pvr] bump API to 1.9.6 + + [xhaggi] + * [gui] handle ListItem.IMDBNumber / VidePlayer.IMDBNumber also for video items + + [xhaggi] + * [gui] handle season and episode item labels for channel/epg item + + [xhaggi] + * [gui] handle more video info labels for PVR channel item + + [xhaggi] + * [gui] adds new EPG properties to GUIInfoManager + + [xhaggi] + * [epg] adds new properties to epg info tag + database + + [xhaggi] + * [pvr] extends API for new epg properties + + [xhaggi] + * [pvr] adds capability for sorted channel groups + + [Pär Björklund] + * Changed FONT_CACHE_DIST_LIMIT to float to silence a bunch of warnings. floats are used everywhere in the calculations so this was most likely an oversight and not intended behaviour + + [Pär Björklund] + * Removed boost/shared_ptr include that had been left behind + + [Matthias Kortstiege] + * [tests] added tests for capitalise after punctuation characters + + [Matthias Kortstiege] + * [stringutils] also capitalise after punctuation characters + + [Arne Morten Kvarving] + * fixed: rename across mount points on posix filesystems + + [Pär Björklund] + * Remove throw() specifications since they're not used anymore in C++11 + + + [Matthias Kortstiege] + * [pvr] fix unable to open grouped recordings/folders (closes #15848) + + [xhaggi] + * [pvr] fix group member assignment + + [Chris "Koying" Browet] + * FIX: [droid] if a full apk is present, use it rather than obb; lower threshold to 40Mb + + [ace20022] + * [cleanup] Remove CheckLoadLanguage from LangInfo. + + [ace20022] + * [cleanup] Remove check for language (codes) from language addons. + + [xhaggi] + * [pvr] drop table 'clients' regardless of whether we have PVR addons + + [xhaggi] + * [pvr] simplify iteration through pvr addons + + [xhaggi] + * [pvr] fix endless loop while migrating clients table to addon database + + [Rainer Hochecker] + * renderer: drop video frames if neither full-screen nor video control displays them + + [Rainer Hochecker] + * renderer: cosmetics + + [Alfredo Tupone] + * Allows choosing compiler during build of libsquish + + [Karlson2k] + * [posix] [depends] Update libmicrohttpd lib for POSIX platforms + + [Karlson2k] + * [depends] Fix wrongly used system native libgcrypt-config instead of target libgcrypt-config + + [Karlson2k] + * [depends] Fix: libmicrohttpd doesn't need openssl, but need gnutls + + [Karlson2k] + * [win32] [installer] Remove systemwebserver directory if any + + [Karlson2k] + * [win32] Update libmicrohttpd package, use static lib for libmicrohttpd + + [Martijn Kaijser] + * remove old pre-Frodo upgrade code for cached artwork + + + [Rainer Hochecker] + * dvdplayer: add slice threading back for most codecs - currently too many issues + + [Matthias Kortstiege] + * [libraryqueue] refresh listing after doing the work + + [wsnipex] + * [depends] binary-addons: fix building only selected addons + + [ksooo] + * [htsp] remove internal htsp support. + + [Alfredo Tupone] + * Use $(MAKE) to call make from a Makefile. + + [Mateusz Lewicki] + * fixed gamepad on windows spamming to logs + + [Rainer Hochecker] + * renderer: grab corect lock when calling IsGui/VideoLayer + + [Rainer Hochecker] + * ffmpeg: fixes for 2.6.0 + + [montellese] + * lib: get rid of copy of libmicrohttpd + + [Anton Fedchin] + * [dxva] hevc: added decoder guids. Fixed refs count. + + [Anton Fedchin] + * [dxva] hevc: add compat header for mingw. + + + [ksooo] + * [confluence] Consistent usage of one string resource for electronic program guide => #22020 "Guide". + + [psyton] + * Support for load replay gain info from CUE + + [psyton] + * CCueDocument refactoring + + [psyton] + * ReplayGain refactoring. (Create class for store and work with RG data) + + [h.udo] + * Add more native artifacts to .gitignore + + [ace20022] + * [Fix][Settings] Fix the definition of the subtitles.tv and subtitles.movie service settings. + + [Violet Red] + * Fix Artists view in Music Videos + + [Matthias Kortstiege] + * [vtp] remove internal vtp (vdr-streamdev) support + + [ace20022] + * [Fix][GUIDialogSelect] Reset members m_buttonString and m_bButtonPressed on Reset(). + + [Cam Hutchison] + * [playlist] Add tags to episode smart playlists. + + [Rainer Hochecker] + * dvdplayer: drop ffmpeg threading work around, fix root cause + + + [h.udo] + * [pvr addons] Sync remaining addons with API 1.9.5 + + [h.udo] + * [pvr.pctv] Add pvr.pctv and sync with https://github.com/kodi-pvr/pvr.pctv/commit/7929c6b + + [Matthias Kortstiege] + * [mythtv] remove internal mythtv support + + [montellese] + * [win32] binary addons: don't try to build unsupported addons + + [Memphiz] + * [win32/TexturePacker] - added version resource and bumped to 1.0.2 + + [wsnipex] + * [depends] binary addons: don't try to build unsupported addons + + [wsnipex] + * [cmake] add a custom target "supported_addons" that returns all addons we're going to build on this platform + + [wsnipex] + * [cmake] fix binary addon install when sudo rights are needed + + [montellese] + * CLangInfo: improve log messages during initial language update + + [montellese] + * addons: fix SQL query in CAddonDatabase::GetAddons() after 92e7fc973b27f6b14de03ea91d71abadd5f91171 + + [Lars Op den Kamp] + * [pvr] some more channelgroup optimisations + + [ace20022] + * [settings] Remove maximum items constraint for the setting "Languages to download subtitles for". + + [ace20022] + * [Fix][settings] Use the built-in language list for the setting "Languages to download subtitles for" instead of the list of installed languages. This is done by a re-factoring of the method SettingOptionsStreamLanguagesFiller. + + [Memphiz] + * [TexturePacker] - fix decode of png files with indexed color palette - thx @BigNoid for reporting the problem + + [anaconda] + * Decrease priority of BackgroundInfoLoader thread on POSIX too. + + [Lars Op den Kamp] + * [pvr] changed channel paths to the format addonid_uniquechannelid instead of using the db id, so channel settings can be shared accross installations via a shared video db + + [Lars Op den Kamp] + * [pvr] changed erase calls in CPVRTimers::UpdateEntries() + + [Lars Op den Kamp] + * [pvr] changed erase calls in CPVRDatabase::UpdateTables() + + [Lars Op den Kamp] + * [epg] changed erase() calls in CEpg::Cleanup() + + [Lars Op den Kamp] + * [pvr] fixed bad erase in CPVRChannelGroups::DeleteGroup() + + [Lars Op den Kamp] + * [pvr] removed work around that no longer seems to be needed and that reset the channel pointer in each epg tag every time 'now' or 'next' is accessed + + [Lars Op den Kamp] + * [pvr] changed CPVRChannelGroup to use two maps: one by client/unique id, one by channel number order, so getters can be optimised. changed channel paths to use the client/unique id instead of the channel number, so we don't have to regenerate paths when things change some bug fixes and optimisations + + [Lars Op den Kamp] + * [pvr] use iterators in CPVRChannelGroupInternal + + [Lars Op den Kamp] + * [pvr] fixed: CPVRChannelGroupInternal::AddToGroup() signature no longer matched the parent class signatature + + [Lars Op den Kamp] + * [pvr] now that we're using shared pointers for channels, use it to optimise accessing groups + + [Lars Op den Kamp] + * [pvr] removed dead code CPVRChannelGroupsContainer::GetByChannelIDFromAll() + + [Lars Op den Kamp] + * [pvr] renamed CPVRChannelGroup::GetByClient() to CPVRChannelGroup::GetByUniqueID() + + [Lars Op den Kamp] + * [pvr] fixed: removed CVPRChannelGroup::GetByUniqueID() and replaced remaining calls by GetByClient(). fixes issues if more than 1 client is loaded with the same unique IDs used + + [ace20022] + * [Fix][settings] Don't ignore minimum and maximum items constraints (case sensitive). + + + [uNiversaI] + * [typo fix] priviledges -> privileges + + [Memphiz] + * [depends/binaddons] - replace the static addon list with a simple shell script which lists all addons in project/cmake/addons/addons + + [Memphiz] + * [depends/binaddons] - build all addons addon by addon and log the successful built addons to cmake/project/addons/.success and the failed ones to cmake/project/addons/.failure + + [Memphiz] + * [depends/binaddons] - unify xbmc-pvr-addons and xbmc-audioencode-addons to binary-addons + + [montellese] + * update .gitignore after changes to binary addons buildsteps + + [montellese] + * [win32] add prepare-binary-addons-dev.bat for easier binary addon development + + [Mateusz Lewicki] + * panning with gamepad in slideshow fixed + + [uNiversaI] + * [kodi-resource] add kodi-resource icon + + [uNiversaI] + * [kodi-language-resource] add GENERIC language resource icon + + [uNiversaI] + * [confluence] add repo image DefaultAddonLanguage + + + [Kai Sommerfeld] + * [EPG] Fix CEpgInfoTag::Title() + + [Martijn Kaijser] + * [cosmetic] rebrand pydocs template + + [Memphiz] + * [droid/depends] - bump default API version to 17 (was missed during sdk bump) + + [ace20022] + * [LangCodes] Check the length of the trimmed code string. + + [ace20022] + * [LangCodes] Use case insensitive comparisons to find a language code for a give language name. + + [ksooo] + * CFileItemList ctors: initializer list vs. assignment + + [ksooo] + * CFileItem[List] cosmetics, mainly return statements on separate line. + + [Thomas Amland] + * [addons] cleanup context menus in addon window + + [ksooo] + * CFileItem ctors: No need to call base class default ctor, happens automatically. + + [ksooo] + * CFileItem copy ctor: initializer list vs. assignment. + + [ksooo] + * Align CFileItem::CFileItem(const CEpgInfoTagPtr& tag) with the other ctors taking const *Ptr& parameter (assert vs. NULL check). + + [Matthias Kortstiege] + * [addoncallbacks] initialize members in the order they were declared + + [Matthias Kortstiege] + * [addonmanager] initialize members in the order they were declared + + [Matthias Kortstiege] + * [audiodecoder] initialize members in the order they were declared + + [montellese] + * input: use "language" and "layout" instead of "name" attribute for keyboard layouts + + [montellese] + * input: split keyboardlayouts.xml into one XML per language + + [montellese] + * input: extract CKeyboardLayoutManager from CKeyboardLayout and support loading multiple keyboard layout XML files + + [montellese] + * input: remove unused CKeyboardLayoutConfiguration + + [montellese] + * [win32] write successful + + [montellese] + * [win32] don't abort make-addons.bat if a binary addon fails to build + + [montellese] + * [win32] allow make-addons.bat to be called with multiple binary addons as arguments + + [Matthias Kortstiege] + * [win32file] use LastWriteTime instead of ChangeTime (fixes #15590) + + [montellese] + * settings: add locale.shortdateformat and locale.longdateformat settings + + [montellese] + * settings: add locale.timeformat and locale.use24hourclock settings + + [montellese] + * settings: add locale.speedunit setting + + [montellese] + * CLangInfo: refactor speed unit handling using CSpeed + + [montellese] + * utils: add CSpeed utility class + + [montellese] + * CLangCodeExpander: cleanup and refactoring + + [montellese] + * settings: add locale.temperatureunit setting + + [montellese] + * CTemperature: cleanup and refactoring + + [montellese] + * move Temperature.h/cpp to utils + + [AlwinEsch] + * [gui] Close all open dialogs if media window becomes closed + + [AlwinEsch] + * [gui] Cleanup video osd dialog function, to match code rules + + [AlwinEsch] + * [gui] Fix music OSD close with open PVR dialogs + + [Matthias Kortstiege] + * [fonts] adds CAPITALIZE - capitalize the first letter of each word + + [alanwww1] + * disable desktop compositing for KDE, when Kodi is in full-screen mode + + + [Miroslav Bambousek] + * [gui] fix for textbox vertical centering + + [Pär Björklund] + * Changed sleep call to AbortableWait + + [Matthias Kortstiege] + * [webif] fixed typo (closes #15844 - thanks b1m1) + + [montellese] + * [tests] fix TestPOUtils.General + + [Chris "Koying" Browet] + * FIX: [droid] properly save addon settings even if the control is not focused (fixes #13913) + + [Matthias Kortstiege] + * [videoinfoscanner] fix shows not picked up after initial scan abort + + [Pär Björklund] + * Fix the following coverity issues that the variables are uninitialized in the constructor or any functions that it calls fix 719141, 719143, 719144, 719146, 719147, 719148, 719149, 727842, 122884 fix 718193, 718210, 1261374, 1261377 + + [Matthias Kortstiege] + * [htmltable/util] remove dead html code + + [Pär Björklund] + * Cosmetic changes Renamed setUsed to match the other input interfaces + + [Pär Björklund] + * Fixed disconnect + + [Pär Björklund] + * Fixed remote initialization + + [Pär Björklund] + * Bump curl to 7.40 + + + [AlwinEsch] + * [settings] Allow on settings button, right label a continues update + + [sub9] + * Add index to count all of the collection's fanart when creating the "fanart://Remote%i" strings + + [ronie] + * [Confluence] re-locate comments + + [Stefan Saraev] + * [audioencoders] add xbmc.audioencoder + + [Stefan Saraev] + * [pvr] bump xbmc.pvr/addon.xml after 5f76e327 + + [Memphiz] + * [filesystem/afp] - remove AFP implementation + + [Chris "Koying" Browet] + * FIX: [amc] crash if decoder cannot handle a file + + [Lars Op den Kamp] + * fixed: don't return local add-ons from CAddonDatabase::GetAddons() + + [Lars Op den Kamp] + * fixed: all add-ons got duplicated in the addon table after b72f00a75c63ebe5b846d28824bcbe3ba1daebc6 + + [Lars Op den Kamp] + * [pvr] changed: ask if the user wants to disable libCEC if no TV couldn't be found for 30 seconds + + [Lars Op den Kamp] + * [cec] changed: don't show a kaitoast when the configuration has been updated by libCEC + + [Rainer Hochecker] + * [AE] pass force resample flag down to resampler + + [Rainer Hochecker] + * [ffmpeg] bump to 2.6 + + [Rainer Hochecker] + * [rbp] update README + + [Philipp Te] + * [CONFLUENCE] - change effectslowdown to 1.0 in addon.xml + + [Philipp Te] + * [CONFLUENCE] - second conversion with XML tool ("scaling" values with 0.75) + + [Chris "koying" Browet] + * FIX: [droid] keep wakelock on non-default screensavers + + [Chris "Koying" Browet] + * FIX: [droid] use SCREEN_BRIGHT_WAKE_LOCK to allow the keys backlight to go off + + [Chris "Koying" Browet] + * CHG: [droid] refactor wake lock; follow our screensaver + + [Philipp Te] + * [CONFLUENCE] - first conversion with XML tool (just alignments, whitespace removals etc) + + [ksooo] + * Optimize CFileItem::operator=() + + + [Matthias Kortstiege] + * [fileitem] remove compile warnings after 121b3fc + + [Pär Björklund] + * fix 1228841, 1228842, 1273988 Added addon/AudioDecoder.h to VS project, was missing for some reason + + [Pär Björklund] + * fixes 719099, 719101, 719105, 1021008, 1194442 + + [Bernd Kuhls] + * [uclibc] Fix compilation error in xbmc/cores/DllLoader/exports/emu_msvcrt.cpp + + [Pär Björklund] + * fix 1287131 and 1287132 + + [Matthias Kortstiege] + * [curl] fix ftps exists handling + + [Martijn Kaijser] + * [win32] fix building after split addon gui for skin and binary addons 127663da0ed4cff015d9d0070ccacf543282dd82 + + [Rainer Hochecker] + * [pvr.vnsi] change repo location to kodi-pvr + + [Rainer Hochecker] + * [pvr.vnsi] bump version + + [Martijn Kaijser] + * remove PVR specific repo + + [h.udo] + * [pvr.vuplus] Sync with https://github.com/kodi-pvr/pvr.vuplus/commit/366c8df + + [h.udo] + * [pvr.iptvsimple] Sync with https://github.com/kodi-pvr/pvr.iptvsimple/commit/4e1e7f6 + + [hudokkow] + * [pvr.filmon] Add pvr.filmon and sync with https://github.com/kodi-pvr/pvr.filmon/commit/f607fdf + + [Lars Op den Kamp] + * [pvr] optimise CPVRChannelGroup + + [Lars Op den Kamp] + * [pvr] fixed: slow channels import + + [Matthias Kortstiege] + * [tuxbox] remove internal tuxbox support + + + [Lars Op den Kamp] + * [pvr] fix check for disabled add-ons at startup, making you have to start the pvr manager twice on a new installation + + [Lars Op den Kamp] + * [pvr] clean up CPVRClients::RegisterClient() and always disable add-ons that have missing settings + + [Lars Op den Kamp] + * [pvr] replace the id of the clients table in pvr by the one used by the addondatabase. bump db version + + [Matthias Kortstiege] + * [video] remove dead code + + [montellese] + * [linux] fix home path detection + + [montellese] + * addons: fix missing parameter in CLanguageResource::OnPostInstall() + + [Lars Op den Kamp] + * [pvr] fixed: don't disable all new add-ons by default, only the ones that need configuration by default, all add-ons are marked as needing a configuration. overrule in addon.xml, by adding needs_configuration=false to the pvr extension point + + [Lars Op den Kamp] + * [pvr] changed: no longer disable all new add-ons when creating a new pvr db + + [Lars Op den Kamp] + * [pvr] changed: removed the special clients table for pvr, and use the add-on ids from the AddonManager + + [Lars Op den Kamp] + * added: CAddonDatabase::GetAddonId() + + [Matthias Kortstiege] + * [osx/ios] sync Xcode + + [montellese] + * [win32] update VS project files + + [montellese] + * no need to install the language directory anymore + + [montellese] + * addons: move language files to resource.language addons and remove all languages except English + + [montellese] + * addons: support the same locales used for the language addons in the tag and in the "lang" attribute of and tags in addon.xml + + [montellese] + * adjust language loading/handling logic + + [montellese] + * settings: turn locale.language into an addon setting + + [montellese] + * addons: only disallow non-forced repository updates while on the login screen + + [montellese] + * addons: extend CAddonDatabase::GetAddons() to support getting addons of a specific type + + [montellese] + * filesystem: add support for resource:// paths + + [montellese] + * addons: add new kodi.resource(.language) addon type + + [montellese] + * CAddonMgr: make GetExtElement() public + + [montellese] + * utils: add CLocale + + [Lars Op den Kamp] + * [pvr.hts] bump to https://github.com/kodi-pvr/pvr.hts/commit/abceaf8 [pvr.demo] bump to https://github.com/kodi-pvr/pvr.demo/commit/b4b7de1 + + [Violet Red] + * [fix] Trac 15707, queue item fails on music videos + + [Violet Red] + * Add function to return preferred playlist for active player + + [Thomas Amland] + * [addonmanager] cleanup GetAllAddons + + + [Lars Op den Kamp] + * [pvr.hts] bump to https://github.com/kodi-pvr/pvr.hts/commit/f11a84f6deb8609fa47a39b49c2b729d50a9b5b0 + + [Lars Op den Kamp] + * [pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running + + [Lars Op den Kamp] + * [pvr] added: CPVRRecording::IsBeingRecorded() + + [Lars Op den Kamp] + * [pvr] fixed: always ask to resume recordings, not just when played from the recordings window + + [Lars Op den Kamp] + * [pvr] fixed: remove deleted recordings from the timeline too + + [Lars Op den Kamp] + * [pvr] changed: add button to resume live playback when playing a recording + + [Lars Op den Kamp] + * [pvr] changed: ask if the user wants to resume from the beginning of a recording when starting playback on a channel and a matching recording is found + + [Lars Op den Kamp] + * [confluence] add a play recording button to DialogPVRGuideInfo.xml, hidden when no recording was found + + [Lars Op den Kamp] + * [pvr] changed: display a 'play recording' button in the epg info dialog and context menu when a recording is found, and don't make 'switch channel' play a recording, but always make it switch channels like the label says + + [Lars Op den Kamp] + * [pvr] changed: add the filename of the recording (if any) to the epg tag serialised data + + [Lars Op den Kamp] + * [pvr] fixed: missing initialisers in CEpgContainer + + [Lars Op den Kamp] + * [pvr] changed: instead of having a recording id set for epg tags, have an epg id set for recordings epg tags are only refreshed based on a timeout, or when an update is forced fixes playing recordings in progress from the timeline + + [Lars Op den Kamp] + * [pvr] fixed: missing initialiser for CPVRRecordings::m_bHasDeleted + + [Lars Op den Kamp] + * [pvr] fixed: file path for recordings with a / in the channel name + + [ace20022] + * [Fix] Cache chapter info for dvds to avoid frequent file accesses. + + [montellese] + * fix settings definition for win32 after df1c1b8d25f8ae227ee76399f6ef7b6b98f34201 + + [montellese] + * fix settings definition for win32 and ios after face9ead060c964f0bae4c3b6179ea36d98708a5 + + [Pär Björklund] + * Fixed the formatting that got messed up when moving Key.h/cpp + + [Lars Op den Kamp] + * [pvr] fixed: clear the epg tag of deleted timers explicitly because it no longer happens automatically in the destructor when using shared pointers + + [Lars Op den Kamp] + * [pvr] fixed: don't delete a timer from the list of timers in CPVRTimers::DeleteTimersOnChannel(). wait for the client to trigger an update + + [Lars Op den Kamp] + * [jenkins] ac3e91a89a63bcd5c1b892cdec7931a8067f0c68 for other platforms + + [Memphiz] + * [jenkins] - make binary addon compilation error non-fatal for jenkins + + [Lars Op den Kamp] + * [pvr] changed: scan for auto-configurable services for 5 seconds, instead of sleeping 1 second and then returning + + [Lars Op den Kamp] + * [pvr] register the avahi type set in the add-on + + [Lars Op den Kamp] + * changed: made CZeroconfBrowser::AddServiceType() and CZeroconfBrowser::RemoveServiceType() public + + [Rainer Hochecker] + * split addon gui for skin and binary addons + + [Lars Op den Kamp] + * [pvr] added: auto-configure pvr clients via avahi add these to xbmc.pvrclient extension point in the addon.xml of the add-on to configure: avahi_type="(avahi type)" avahi_ip_setting="(name of the ip/address setting)" avahi_port_setting="(name of the port setting)" + + [Karlson2k] + * WebServer: add and use panic handler for MHD + + [mad-max] + * reverse logic from commit abc298ca71c25ae57081aad60ba5ef0abec3a445 + + [Chris Mayo] + * mouse: Increase number of buttons supported from 5 to 7 + + [Karlson2k] + * WebServer: write messages from MHD to log + + + [Arne Morten Kvarving] + * fixed: try to extract zip files marked as split archives + + [Arne Morten Kvarving] + * fixed: zip files which uses an out-of-spec header for the data record entry + + [Thomas Amland] + * [addons] revert force clearing of strings after loading context item label + + [Thomas Amland] + * [addons] fix post install of context items after #6549 + + [montellese] + * don't allow to pause queued video library jobs + + [montellese] + * fix video library cleaning not initiated by a user blocking the main thread + + [Matthias Kortstiege] + * [videoinfoscanner] add season art when new season are added (fixes #14339) + + [Jonathan Marshall] + * move AddSeason() public. + + [Jonathan Marshall] + * adds GetTvShowSeasons + + [montellese] + * CVideoLibraryQueue: fix segfault in CancelJob() if CJobQueue::CancelJob() deletes the job to be cancelled + + [Rainer Hochecker] + * fix installing arch dependent files into share + + [Rainer Hochecker] + * drop in-tree building of pvr addons + + + [Kai Sommerfeld] + * [dvdplayer] Fix CDVDPlayer::SwitchChannel signature to match IPlayer::SwitchChannel signature. + + [montellese] + * [win32] cmake: improve generated Visual Studio solution + + [wsnipex] + * cmake: allow to override local addon location via ADDON_SRC_PREFIX + + [montellese] + * cmake: support file:// based paths for addon definitions + + [montellese] + * cmake: don't use an extra loop to setup addon building + + [montellese] + * addons: fix CAddonMgr::CanAddonBeDisabled() for disabled addons + + [montellese] + * addons: fix CAddonMgr::IsAddonInstalled() for disabled addons + + [Rainer Hochecker] + * [cmake] add define BUILD_KODI_ADDON + + [Carcharius] + * [video] refactor select first unwatched season/episode item + + [Arne Morten Kvarving] + * fixed: don't load new copy of dll in LoadDll() + + [Arne Morten Kvarving] + * added: add audio codec extensions to the music extension list + + [Arne Morten Kvarving] + * changed: make the music extension member in AdvancedSettings private + + [Arne Morten Kvarving] + * add support for audio decoder addons + + [Arne Morten Kvarving] + * fixed: binary add-on child dll handling + + [montellese] + * pvr: silence warning in CPVRRecordings::DeleteAllRecordingsFromTrash() + + [montellese] + * MathUtils: silence warning about implicit cast from double to int + + [montellese] + * addons: fix CAddonCallbacksGUI::Dialog_Keyboard_ShowAndVerifyPassword() calling the wrong method + + [mad-max] + * damn you case-sensitivity + + [mad-max] + * moved HideAllItems Tag from AdvancedSettings to GUI + + [Rechi] + * SQL: replaced implicit Joins with explicit Joins + + [Kai Sommerfeld] + * Optimize CPVRTimerInfoTag. No more copies, just shared pointers. + + [Matthias Kortstiege] + * [videos] check whether or not we already know about the scraper and re-use it + + [Deniz Türkoglu] + * stringutils: add test for sortstringbyname + + [Deniz Türkoglu] + * Decouple Util and StringUtil + + [Chris "Koying" Browet] + * ADD: [jni] add Activity and refactor to use our specific descendant + + [popcornmix] + * [build] Enable PYTHONOPTIMIZE for linux + + + [Garrett Brown] + * [cosmetic] Fix c/p error and whitespace in IPlayer.h + + [popcornmix] + * [mmalrenderer] Fix for HAS_MMAL being set by chance + + [Matthias Kortstiege] + * [mysql] properly toggle mysql transactions automode + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [Pär Björklund] + * Moved key.h/cpp to input where it belongs + + [Pär Björklund] + * Moved settings handling into inputmanager and got rid of friend class declaration + + [Pär Björklund] + * Encapsulated g_RemoteControl in CInputManager. Removed several ifdefs from callers and hid it inside inputmanager + + [Pär Björklund] + * Encapsulated g_Mouse in CInputManager + + [Pär Björklund] + * Encapsulated g_Keyboard in CInputManager cleaned up some includes + + [Pär Björklund] + * Move more input processing over to CInputManager. Chain OnEvent so anything not handled by CApplication OnEvent gets passed to inputmanager for processing + + [Pär Björklund] + * Renamed GetInstance to Get + + [Martijn Kaijser] + * [repo] add isengard as repo location + + [Thomas Amland] + * update vs project files + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [Thomas Amland] + * [python] expose VideoInfoTag and MusicInfoTag of listitems + + [Thomas Amland] + * [addons] remove dead code + + [Thomas Amland] + * [addons] fix addon browser not propagating unknown context menu buttons to base class + + [Fice] + * [ADDONS] Hook up the context menu addons in all the windows + + [Fice] + * [ADDONS] Context Menu Addons System + + [Violet Red] + * Add proper tag for videos in playlists + + [Matthias Kortstiege] + * [application] load videosettings by item + + [Matthias Kortstiege] + * [videothumbloader] load videosettings by item instead by path + + [Matthias Kortstiege] + * [videodatabase] add doxy for Get-/SetVideoSettings functions + + [Matthias Kortstiege] + * [videodatabase] remove dead code from GetVideoSettings + + [Matthias Kortstiege] + * [videodatabase] fetch videos settings by file id, item and path + + [ace20022] + * [Settings/rpi] Disable chapter thumbnail extraction by default for the rpi. + + [ace20022] + * [VideoBookmarks] Add a setting for chapter thumbnail extraction. + + [Arne Morten Kvarving] + * added: if chapter is nameless, use a generic 'Chapter %u' string + + [ace20022] + * added: show chapters in bookmark dialog (with thumbs) + + [ace20022] + * [VideoThumbLoader] Make == operator more strict. + + [ace20022] + * [VideoThumbLoader] Add parameter to skip querying/storing stream details when extracting thumbs. This is useful for chapter thumbs extraction for example. + + [ace20022] + * [demuxer] set correct startpts when seeking chapters of discs. + + [ace20022] + * [dvdplayer] Fix wrong chapter numbers in dvd menus. + + [Arne Morten Kvarving] + * added: support grabbing chapter name and position from bluray/dvds + + [Arne Morten Kvarving] + * added: ability to specify where to extract thumb from in thumb extractor job + + [wsnipex] + * cmake: ask for sudo rights on addon install to system dirs + + [wsnipex] + * [depends] fix standalone building of binary addons + + [montellese] + * [depends] build PVR addons as binary addons + + [wsnipex] + * [depends] add binary addon specific cmake Toolchain and autotools config.site + + [montellese] + * [depends] add RBPI's firmware directory to CMAKE_FIND_ROOT_PATH and CMAKE_LIBRARY_PATH + + [montellese] + * [win32] get rid of buildpvraddons.bat and update BuildSetup.bat + + [montellese] + * [win32] also install the PDB file for debug builds + + [montellese] + * [win32] cmake: fix installation of binary addon DLLs when using Visual Studio + + [montellese] + * addons: add pvr addons as a binary addon + + [montellese] + * cmake: always add kodi-platform as a dependency to all binary addons + + [montellese] + * binary addons: add kodi-platform (and its dependency tinyxml) as a common dependency + + [montellese] + * cmake: fix handling/passing of CMAKE_C_FLAGS/CMAKE_CXX_FLAGS + + [montellese] + * cmake: add custom build step for addons between configure and build to force re-building changed files (thanks manuelm) + + [wsnipex] + * cmake: don't install binary addon dependencies in unified deps prefix path and make sure unified deps are not used for building bin addons + + [wsnipex] + * cmake: add C++11 flag + + [montellese] + * cmake: cleanup INSTALL_COMMAND/CONFIGURE_COMMAND handling for dependencies + + [montellese] + * cmake: improve patch file/command handling for dependencies + + [montellese] + * [win32] Win32DllLoader: add wrapper for fopen_s() + + [popcornmix] + * [mmalrenderer] Fix for hang on shutdown + + [Thomas Amland] + * [python] add ContextItemAddonInvoker for running context item addons + + [Thomas Amland] + * makefile cosmetics + + [popcornmix] + * [omxplayer] Fix for volume being treated as a linear scale + + [Arne Morten Kvarving] + * added: ability to specify position where thumb is taken from in DVDFileInfo + + [Arne Morten Kvarving] + * added: ability to grab all chapter name and chapter positions from players + + [foser] + * [X11] The inline cast of int32 EGLint to unsigned long XVisualInfo.visualid could cause the latter to be filled with a garbage value, resulting in no VisualInfo being returned later on. + + [foser] + * [X11] Make eglChooseConfig use a dynamic array. + + [foser] + * [X11] With empty attributes eglChooseConfig will return all configurations, including ones with a depth buffer size of zero. A minimal depth buffer of 24 is required, so return only those. + + [foser] + * [X11] Use EGLint instead of GLint for EGL arrays + + [Rainer Hochecker] + * SDL clean-up - remove HAS_SDL_OPENGL + + [AlwinEsch] + * [pvr] Improve pvr manager start/stop way + + [Kai Sommerfeld] + * [rss] CRssReader::Process: Sleep 5 secs before retrying CCurlFile::Get(). + + [Deniz Türkoglu] + * Add native artifacts to .gitignore + + [AlwinEsch] + * [gui] Improve CGUIControlFactory::Create to use 'switch' instead of 'if' + + + [montellese] + * CGUIWindowManager: force close closing dialogs/windows during DeInitialize() + + [montellese] + * addons: don't ask the user if he wants to switch to a newly installed skin if the "modal" parameter is set in OnPostInstall() + + [montellese] + * settings: allow more control over an addon setting's control + + [montellese] + * addons: extend CGUIWindowAddonBrowser::SelectAddonID() to support selecting addons that haven't been installed yet + + [montellese] + * CGUIDialogAddonInfo: make use of CAddonMgr::CanAddonBeDisabled() + + [montellese] + * addons: add some helper methods to CAddonMgr + + [montellese] + * addons: refactor CAddonInstaller and CAddonInstallerJob to be usable with a modal progress dialog + + [montellese] + * CAddonInstaller: cosmetics and cleanup + + [montellese] + * CAddonInstaller: rename PromptForInstall() to InstallModal() + + [montellese] + * IAddon: extend OnPostInstall with an additional "modal" parameter + + [montellese] + * CFileOperationJob: change to derive from CProgressJob instead of CJob + + [montellese] + * CFileOperationJob: cosmetics and cleanup + + [montellese] + * CProgressJob: add DoModal() and extend it to support a CGUIDialogProgress modal dialog + + [montellese] + * CJob: make ShouldCancel() virtual + + [xhaggi] + * [epg] fix missing assignment of series number in constructor + + [xhaggi] + * [epg] removes some unecessary setters in CEpgInfoTag + + [xhaggi] + * [epg] adds new method SetEpg() to CEpgInfoTag to drop the use of friend class in CEpg + + [xhaggi] + * [epg] refactor: changes some method signatures in CEPGInfoTag + + [xhaggi] + * [epg] get rid of mutex lock, m_bChanged and unnecessary calls to UpdatePath() in CEpgInfoTag + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [montellese] + * [win32] updave VS project files + + [montellese] + * webserver: add CHTTPPythonHandler to handle python scripts for webinterfaces using WSGI + + [montellese] + * webserver: add CHTTPPythonInvoker and CHTTPPythonWsgiInvoker to run python scripts from webinterfaces using WSGI + + [montellese] + * webserver: fix CHTTPWebinterfaceHandler::ResolveUrl() to support a custom entry page + + [montellese] + * addons: add new xbmc.webinterface addon and CWebinterface with "type", "library" and "entry" attributes + + [montellese] + * python: add basic WSGI implementation + + [montellese] + * codegenerator: improve doxygen integration (thanks notspiff) + + [montellese] + * python: add support for tp_iter, tp_iternext and iterators + + [montellese] + * python: fix some indentation in PythonSwig.cpp.template + + [montellese] + * python: add support for tp_call + + [montellese] + * python: fix property getters/setters for custom API types + + [montellese] + * python: fix code generation for index operator + + [montellese] + * python: add typemap for void* to pass through a PyObject* object + + [montellese] + * python: cleanup input/output typemap definitions for cleaner code generation + + [montellese] + * python: refactor parsing of python exceptions + + [montellese] + * python: add virtual executeScript() to CPythonInvoker + + [montellese] + * swig: add SWIG_IMMUTABLE macro for read-only properties + + [montellese] + * CScriptInvocationManager: add ExecuteSync() + + [montellese] + * CScriptInvocationManager: rename Execute() to ExecuteAsync() and add documentation + + [montellese] + * use shared pointer of ILanguageInvoker + + [montellese] + * IHTTPRequestHandler: add GetHostnameAndPort internal helper method + + [montellese] + * webserver: remember the full request URI (not just the path) + + [montellese] + * webserver: remember the full path URI of a request + + [montellese] + * webserver: increase the priorities of the special request handlers to have more more between them and the default webinterface handler + + [Menno] + * First check if allowfiledeletion is true before prompting for master password. + + [Menno] + * Only allow delete from library if user has DB write permission + + [uNiversaI] + * [readme] cleanup unused libs + + [Thomas Amland] + * [addons] update repo if version in db differ + + [Thomas Amland] + * cleanup: avoid opening db multiple times + + [Thomas Amland] + * [addons] store repo version database + + [AlwinEsch] + * [addon] Allow addons to use kodi.addon.metadata to bring description + + [Kai Sommerfeld] + * Optimize CPVRChannel. No more copies, just shared pointers. + + [Matthias Kortstiege] + * [mysql] add optional protocol compression - defaults to false + + [Matthias Kortstiege] + * [scraper] retry without appending year after first fail + + [Thomas Amland] + * [addons] remove legacy backwards compatibility behaviour + + [smallint] + * [imx] Fixed compiler warning + + [wolfgar] + * Add guard to fix build on non iMX6 arch + + [Fernando Carmona Varo] + * Added RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE implementation + + [smallint] + * [imx] Ifdef'd iMX6 specific include + + [smallint] + * [imx] Output associated pts for TRACE_FRAMES + + [wolfgar] + * [iMX6] Implement rendercapture for latest rendering rework blit fb using g2d when no deinterlacing is required + + [smallint] + * [imx] Reworked video decoding and rendering, see http://forum.kodi.tv/showthread.php?tid=211289&pid=1892440#pid1892440 + + [smallint] + * [RenderManager] preserve field type for Renderer::RenderUpdate + + [smallint] + * [imx] Added de-interlacing method enumerations FAST_MOTION and FAST_MOTION_DOUBLE + + [Martijn Kaijser] + * [android] bump SDK to 17 + + + [gokl] + * * fix tv vendor override typo + + [Martijn Kaijser] + * update startup splash image + + [Chris "koying" Browet] + * FIX: [jni] Context::sendBroadcast returns void + + [montellese] + * CTextureCacheJob: add fallback hash in case neither mtime/ctime nor size of an image are known + + [Martijn Kaijser] + * bump version to 15.0alpha2 + + [Martijn Kaijser] + * [android] remove Ouya platform as it doesn't meet our minimal android API + + [Philipp Te] + * settings.xml: changed several spinners to lists + + + [montellese] + * bump audioencoder.flac and audioencoder.vorbis to fix parallel build problems with ogg + + [Rainer Hochecker] + * dvdplayer: flush audio errors on large sync error + + [Rainer Hochecker] + * [AE] - force re-create of ffmpeg resampler after error + + [Rainer Hochecker] + * dvdplayer: sync audio after having issued GENERAL_RESYNC + + [Chris "Koying" Browet] + * FIX: video db cleanup with no parent path + + + [montellese] + * CSettingAddon: remove unused define + + [montellese] + * strings: fix Weather -> General category description + + [Matthias Kortstiege] + * [video] fix mark watched/unwatched from manage sub menu + + [Kai Sommerfeld] + * [confluence, core] String Fixes: TV settings 10021 "Web Browser" => "Settings - TV". This one was semantically completely wrong. String gets displayed on VFDs/LCDs when navigating through the items of the left side of the TV settings dialog. 31502 "Live TV" => "TV". Confluence. Seems this one got forgotten the time the resp. core changes were made. + + [Thomas Amland] + * [addons] make sure to get correct extension point before attempting to cast to plugin + + + [montellese] + * translations: fix some filenames in English's strings.po + + [xhaggi] + * [xcode] sort PVRActionListener below existing folders in /pvr + + [xhaggi] + * [gui] fix activating of context menu after skin reload while context menu was active + + [janbar] + * [PVR] fix deleted recordings view + + [Matthias Kortstiege] + * [smbdirectory] mark dot files and folders hidden (fixes #15680) + + [da-anda] + * [3D] don't back out from 3D handling on resolution changes if we're switching to a different 3D mode + + + [montellese] + * json-rpc: fix duplicate "lastplayed" in "Video.Fields.TVShow" (thanks Tolriq) + + [xhaggi] + * [seek] fix crash if no seek steps are found for the selected direction + + [Kai Sommerfeld] + * [ActiveAE] - ActiveAESink: Change several LOGNOTICE to LOGDEBUG to reduce kodi.log "spamming". + + + [montellese] + * simplify and document CLangInfo::GetLanguageLocale() + + [montellese] + * [win32] addons: fix filtering foreign language addons + + [montellese] + * addons: no need to retrieve general.addonforeignfilter in a block that is only called if its value is true + + + [montellese] + * cmake: fix debug builds by passing CMAKE_BUILD_TYPE to the addon's build + + [Rainer Hochecker] + * dvdplayer: fix missing audio info + + [Rainer Hochecker] + * dvdplayer: sync av players after unsynced seeks which may occur when rw/ff + + [Rainer Hochecker] + * dvdplayer: consider audio stalled as long as message queue is empty + + [Rainer Hochecker] + * dvdplayer: reset error integral when flushing sync errors + + [Kai Sommerfeld] + * Fix AnnouncementManager::Announce(). Announcers may be removed while iterating announcers vector. + + + [Matthias Kortstiege] + * [videoinfoscanner] reset library bools only once - fixes #15805 + + [AlwinEsch] + * [pvr] Fix compiler warning in CGUIWindowPVRRecordings + + [wsnipex] + * [configure] make sure the gcc-4.9 SSE workaround is only enabled on x86 + + [Thomas Amland] + * [linux] prepend -Wall so it doesn't override flags from environment + + + [Rainer Hochecker] + * [win32] - fix DirectSound for streams with very low sample rates + + [Chris "koying" Browet] + * FIXUP: fix python PIL after #5218 + + [Memphiz] + * [jenkins/addons] - fix error detection during addons build + + + [ronie] + * [Confluence] api bump + + [ronie] + * revert xbmc.gui bw-compatibility change + + [Carcharius] + * Add support for jumping to the first unwatched tv show season/episode. Only allows jumping to unwatched episodes if sorting by episode number. + + [Pär Björklund] + * issue 1262131 ignoring bytes read Should silence a bunch of warnings without altering code logic + + [Pär Björklund] + * issue 1262428 out of bounds read this code seems to have done nothing for a long time. If the first loop hit it's break condition the second loop would check the same value and break directly. Not sure what effects this might have had? + + [Pär Björklund] + * issue 1269601 bad override base class method is not const + + [Pär Björklund] + * 1269602 bad override base class is not const + + [Pär Björklund] + * issue 1269603 unchecked return value not really an issue but might as well fix it. + + [Pär Björklund] + * issue 1269604 Dead code, no changes in git blame since 2012, comment out to avoid further warnings + + [Pär Björklund] + * issue 1269605 First check makes second check impossible to be true also switched to c++ style casts + + [montellese] + * cmake: fix include of check_target_platform.cmake + + [Sam Stenvall] + * [pvr] don't allow the "go to parent" item to be deleted from the recordings window. The Delete action can't be triggered by the context menu anymore but is still triggerable using the delete key + + [Sam Stenvall] + * [gui] remove any set context buttons for the "go to parent" item (fixes #15732) + + [wsnipex] + * [configure] enable SSE when using gcc-4.9 + + [Karlson2k] + * [win32] JSONVariantWriter::Write(): use wide string version of setlocale() to prevent crash on win32 + + [Karlson2k] + * JSONVariantWriter::Write(): do no re-set locale if locale is already "C" + + [Karlson2k] + * [win32] Set thread local locale for started threads + + [Karlson2k] + * [win32] Set thread local locale for main thread + + [Karlson2k] + * [win32] WIN32Util: add SetThreadLocalLocale() for controlling thread local locale + + [Karlson2k] + * [win32] Add win32/crts_caller for calling same function in all loaded CRTs + + [Matthias Kortstiege] + * [mysql] fix transaction handling by set autocommit to false when requested + + [ruuk] + * Add optional .index() to Control.GetLabel() allowing access to secondary labels + + [Stephan Raue] + * [configure.in] use pkgconfig to detect curl + + [Karlson2k] + * [win32] Use _beginthreadex() instead of CreateThread() for better compatibility with CRT functions + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [montellese] + * [win32] update VS project files + + [montellese] + * video library: add documentation for CVideoLibraryQueue and CVideoLibraryJob implementations + + [montellese] + * video library: move all video library scanning logic into CVideoLibraryQueue and allow queueing multiple library scans + + [montellese] + * video library: add CVideoLibraryScanningJob + + [montellese] + * video library: move all video library cleaning logic into CVideoLibraryQueue + + [montellese] + * video library: introduce CVideoLibraryCleaningJob + + [montellese] + * video library: move CMarkWatchedJob to CVideoLibraryMarkWatchedJob and use CVideoLibraryQueue + + [montellese] + * video library: add CVideoLibraryQueue and CVideoLibraryJob + + [montellese] + * utils: add CProgressJob + + [montellese] + * CJobQueue: add boolean return value to AddJob() + + [montellese] + * CJobQueue: add IsProcessing() + + [montellese] + * videodb: cleanup paramters of CleanDatabase() + + [Karlson2k] + * StringUtils::AlphaNumericCompare(): do not use temporal locale object as use_facet() return only reference to facet stored in locale + + [Karlson2k] + * LangInfo: add m_locale and GetLocale() for current locale + + + [wsnipex] + * [depends] enable C++11 for native builds + + [montellese] + * cmake: add platform definitions for android, darwin, freebsd, ios, rbpi and windows + + [wsnipex] + * cmake: add platform directory and parsing of platform specific definitions + + [AlwinEsch] + * [pvr] Cleanup CPVRDatabase help text + + [AlwinEsch] + * [pvr] Remove double used header file + + [montellese] + * cmake: only set the scope of the list of an addon's dependencies once + + [montellese] + * cmake: only add a dependency to the list of an addon's dependencies if it has been downloaded and should be built + + [montellese] + * cmake: only determine the URL of a dependency if it will be downloaded and built + + [montellese] + * cmake: support platforms.txt for dependencies + + [montellese] + * cmake: extract target platform checking logic into check_target_platform.cmake + + [montellese] + * cmake: pass CORE_SYSTEM_NAME to addons and dependencies + + [Violet Red] + * [fix] Allow mixed Audio&Video playlists + + [Memphiz] + * [docs] - adapt docs - binary addons (audioencoder, pvr) need to be built manually in an extra step from now on + + [Memphiz] + * [pvr-addons] - make sure that the git repo are in the prefix and not in a shared dir (else we race if multiple nodes on the same mashine are trying to do any operations on this shared repo) + + [Memphiz] + * [jenkins] - refactor jenkins buildsteps for allowing seperate binary addons building + + [Memphiz] + * [depends] - remove xbmc-pvr-addons and xbmc-audioencoder-addons from depends build (will be build in seperate step from now on) + + [montellese] + * jsonrpc: fix SetEpisodeDetails expecting a datetime instead of a date value for "firstaired" + + [AlwinEsch] + * [settings] Allow coded settings dialogs to define label (needed to pass addon strings) + + [da-anda] + * [keymap] trigger OSD when pressing SELECT on remotes in Visualisation window to be consistent with videos + + + [Arne Morten Kvarving] + * [c++11] - quell some warnings + + [Lars Op den Kamp] + * Revert "[addon] Increase API with change 'char*' return value to 'const char*' to fix compiler warnings (addon relevant part)" + + [Dom Cobley] + * [mmalrenderer] Don't call UnInit internally. Use an internal function. + + [popcornmix] + * [mmalcodec] Avoid deinterlace for dvd menus for now + + [popcornmix] + * [mmalcodec] Introduce a preroll period to buffer up frames on startup + + [popcornmix] + * [mmalrenderer] Add back in SetVideoRect lost in PR6090 + + [popcornmix] + * [mmalrenderer] Avoid grabbing the g_graphicsContext lock - it can deadlock + + [popcornmix] + * [mmalrenderer] Render new from frame from RenderUpdate rather than FlipPage + + [popcornmix] + * [mmalrenderer] Ensure we have requested number of buffers in non-accelerated case + + [popcornmix] + * [mmalrender] Skip some log message in bypass mode + + [popcornmix] + * [rbp] Enable error concealment by default + + [popcornmix] + * [mmalcodec] Reduce number of extra video buffers + + [popcornmix] + * [mmalcodec] Skip some setup that is not required when closing + + [popcornmix] + * [mmalcodec] Report when support is compiled in + + [Rainer Hochecker] + * [pvr] bump addons + + [Rainer Hochecker] + * [addons] fix FreeString - strings are allocated by strdup + + [ronie] + * [Confluence] fix time label in seek dialog + + [Rainer Hochecker] + * Revert "[addon] Change 'char*' return value to 'const char*' to fix compiler warnings on addon lib" + + [Rainer Hochecker] + * [pvr] bump version + + [glenvt18] + * [videosync] drm: fix multi-head. + + [Memphiz] + * [osx/ios] - remove old videosync implementation for ios/osx and hook the new impl up in project and videoreferenceclock + + [Memphiz] + * [osx/ios] - add proper videosync implementations for ios and osx + + [Matthias Kortstiege] + * [videoinfoscanner] added ability to explicitly skip fast hashing + + [Memphiz] + * [ios/windowing] - add displaylink handling + + [Memphiz] + * [ios/atv2] - remove all the displaylink related stuff from the appcontrollers + + [Memphiz] + * [ios/screenmanager] - expose the current screenIdx to the outside + + [Memphiz] + * [ios/eaglview] - remove displaylink handling from eaglview + + [AlwinEsch] + * [settings] Moving label and help into ISetting + + [popcornmix] + * [omxplayer] Skip packet concatenation for WMAV2 files + + [Chris "Koying" Browet] + * FIX: [droid] fix joystick after #5624 + + [Voyager1] + * Fix occasional build errors related to unclean binary addons build + + [Chris "koying" Browet] + * CHG: [aml] remove su hacks + + [montellese] + * webserver: add support for JSONP for JSON-RPC requests + + + [Arne Morten Kvarving] + * [TexturePacker] - fix compilation with c++11 + + [AlwinEsch] + * [pvr] bump addons with #6367 + + [montellese] + * [skin.re-touched] fix win32 build + + [popcornmix] + * [resamplepi] Try to report the same numbers as ffmpeg + + [popcornmix] + * [omxplayer] Add some info about hdmi sync to codec overlay + + [popcornmix] + * [omxplayer] Avoid extra frame allocation when deinterlace might be enabled + + [AlwinEsch] + * [confluence] Don't use BehindDialogFadeOut for channel manager (does not work with addon dialog) + + [AlwinEsch] + * [addon] Change 'char*' return value to 'const char*' to fix compiler warnings on addon lib + + [AlwinEsch] + * [confluence] Add button for new channel on PVR channel manager + + [AlwinEsch] + * [pvr] Add possibility in channel manager to edit channel settings on addon + + [AlwinEsch] + * [pvr] Add usage of channel settings to addon interface + + [AlwinEsch] + * [gui] Fix addon dialog render order + + [AlwinEsch] + * [pvr] Add deleted recordings trash support + + [AlwinEsch] + * [confluence] Add button to open deleted recordings + + [AlwinEsch] + * [confluence] Add icon for deleted recordings + + [AlwinEsch] + * [language] Add needed strings for deleted recordings trash support + + [AlwinEsch] + * [codec] Add RDS type handling in addon lib (CODEC Ver. 1.0.1) + + [AlwinEsch] + * [gui] Allow usage of slider and several dialogs on addons (GUI Ver. 5.8.0) + + [AlwinEsch] + * [pvr] Rename DialogChannelScan to OpenDialogChannelScan + + [AlwinEsch] + * [addon] Increase API with change 'char*' return value to 'const char*' to fix compiler warnings (addon relevant part) + + [AlwinEsch] + * [codec] Increase API version to 1.0.1 (addon relevant part) + + [AlwinEsch] + * [gui] Increase API version to 5.8.0 (addon relevant part) + + [AlwinEsch] + * [pvr] Increase API version to 1.9.4 (addon relevant part) + + + [popcornmix] + * [omxcore] Skip out of flush on error + + [wsnipex] + * [linux] fix building with gcc 4.9 on i386 + + + [Memphiz] + * [ios] - fix 2 more warnings about unhandled enum value in switch case + + [Memphiz] + * [osx/ios/atv2] - sync xcode project after libsquish was moved to depends - fixes linker warning + + [Memphiz] + * [osx/ios/atv2] - kill 300+ warnings about unused variables by disabling the build of all the neptune tls keys we don't make use of + + [Martijn Kaijser] + * [skin] update re-touched + + [popcornmix] + * [omxplayer] Remove test of removed setting, avoids a log message + + [ronie] + * [Confluence] cosmetics + + [Martijn Kaijser] + * [android] bump minimum API version to 17 and set target API to 21. Also remove any API < 17 checks and obsolete OMXLibName. + + [Rainer Hochecker] + * [AE] clean up - drop enumeration for vanished engines + + [Chris "Koying" Browet] + * FIX: [gles;amc;deint] invert fields because pic is inverted + + [Chris "Koying" Browet] + * FIX: [amc] proper fix to overbuffer + + + + [fritsch] + * FFmpeg: Bump version to 2.5.4-Isengard-alpha + + [Martijn Kaijser] + * remove pre-Frodo upgrade code for legacy audio channel settings + + [Martijn Kaijser] + * remove pre-Frodo upgrade code for legacy add-on settings + + + [psyton] + * Support for reading embedded CUE from tags. + + [Matthias Gehre] + * Do not render when dpms is active + + [Matthias Kortstiege] + * [dialogvideoinfo] removed obsolete path invalidation code + + [anaconda] + * [python] Don't set PYTHONCASEOK=1. + + [Tobias Markus] + * [coverity] Fix for #1194431 + + + [xhaggi] + * [seek] reduces the default for seekdelay from 1000ms to 750ms + + [xhaggi] + * [cleanup] drops unnecessary delay for setting Player.Seeking to false + + [xhaggi] + * [seek] use a static delay for analog seek as you can now disable the delay in settings which breaks analog seeking + + [xhaggi] + * [cleanup] kills m_seekHandler in CApplication because SeekHandler use Singleton + + [xhaggi] + * [seek] introduces seek settings (steps and delay) for music + + [Memphiz] + * [osx/ios] - update readmes to reflect minimum runtime targets (osx10.7/ios5.1.1), minimum xcode versions (xcode 6.x), minimum SDKversions (osx10.9, ios8.0) and remove instructions for building ATV2 + + [xhaggi] + * [seek] use setting to turn off delay instead of validate enabled seek steps + + [xhaggi] + * [keymaps] unify seek keys for FullscreenVideo and Visualisation + + [xhaggi] + * [seek] use smart seek for ACTION_SMALL_STEP_BACK + + [xhaggi] + * [seek] refactor analog seek handling out of CApplication into CSeekHandler + + [xhaggi] + * [seek] refactor seek handling out of CGUIWindowFullScreen into CSeekHanlder + + [AchimTuran] + * Code cosmetic for readProcStat + + [Thomas Amland] + * [python] remove leftover xbmc.python 1.0 compat code + + + [Memphiz] + * [tests] - string literals need spaces when concatinated + + [Memphiz] + * [tests] - add some missing includes + + [Memphiz] + * [gtest] - pass cxx flags to gtest (for making it compile with c++11 on osx) + + [Memphiz] + * [osx] - .m files need to be compiled with C compiler not with C++ compiler (means clang instead of clang++) + + [Memphiz] + * [gtest/c++11/darwin] - add -DGTEST_USE_OWN_TR1_TUPLE=1 to testsuite for satisfying apple clang + + [Arne Morten Kvarving] + * [tests] - move atomics tests from shared_ptr of thread array to vector of shared_ptr of thread - fixes tests broken by change to c++11 shared pointers for clang 3.5 + + [Rainer Hochecker] + * paplayer: fix gapless for mp3 + + [Pär Björklund] + * [c++11/GuiFontCache] - move the boost includes from the header to the cpp file. This is needed because of clang having issues with trustyinguishingg the std::vector with boost::vector. + + [Memphiz] + * [c++11] - atoi is not member of namespace std + + [Memphiz] + * [c++11] - add more missing explicit includes + + [Memphiz] + * [darwin/rsxs/quirk] - force usage of toolchain stdbool.h - else rsxs plants its own non clang compatible version of it (somehow its m4 doesn't detect it correctly - don't bother with it...) + + [Memphiz] + * [jenkins/ios] - don't overwrite deployment target but use what is defined in xcconfig + + [Memphiz] + * [osx/ios] - enable c++11 standard - bump osx deployment target from 10.6 to 10.7 (means we need at least osx 10.7 for beeing able to run) and bump ios deployment target from 4.2 to 5.1 (means we need at least ios 5.1 to run) + + [Memphiz] + * [depends/plist] - added c++11 patch + + [Memphiz] + * [xcode/c++11] - use std::move for making an object copy + + [Memphiz] + * [xcode/c++11] - std::istream can't be checked for NULL - check is unneeded anyways ... + + [Memphiz] + * [xcode/c++11] - c++11 forbids concatinating constant strings without seperation by space in preprocessor definitions + + [montellese] + * addons: rename xbmc.gui.webinterface extension point to xbmc.webinterface + + [Memphiz] + * [xcode/c++11] - explicitly include stdlib where needed + + [Memphiz] + * [xcode/c++11] - add explicit casts where narrowing fails in c++11 + + [Chris "Koying" Browet] + * [C++11] replace deprecated auto_ptr by unique_ptr + + [Chris "Koying" Browet] + * [c++11] remove boost::shared_array + + [Chris "Koying" Browet] + * CHG: Move to c++11 and use std:shared_ptr rather than boost + + [montellese] + * CGUIDialogAudioSubtitleSettings: enable volume and volume amplification settings when passthrough is enabled but playback is not using passthrough + + + [Memphiz] + * [ios] - when using the hdmi adapter (or any other hardware tvout adapter) with ios8 devices - ensure that we do the proper rotation even if only the resolution on the external screen is switched + + [tavoc] + * [confluence] fix misalignment of epg progressbar + + [xhaggi] + * [gui] fix missing breaks in switch/case CGUIDialogSeekBar + + [Martijn Kaijser] + * [repo] bye bye Frodo + + [Rainer Hochecker] + * drop some useless level 4 settings for player and renderer + + [wsnipex] + * [rtmp] re-add rtmp options + + [Thomas Amland] + * fix video content type checks + + + [xhaggi] + * [confluence] output new info label Player.SeekStepSize + + [xhaggi] + * [gui] adds new info label Player.SeekStepSize + + [AchimTuran] + * Fixed wrong return type + + [montellese] + * remove unused strings after 9cf3094eed8ca285b26eded5a354e0ec42c79e60 + + [montellese] + * python: fix return values from generated Foo_setMember() implementation (thanks notspiff) + + [montellese] + * settings: remove unused and hidden videolibrary/musiclibrary.enabled settings + + [montellese] + * CWebServer: silence compiler warnings (thanks notspiff) + + [Memphiz] + * [ios/atv2/packaging] - switch back to the hardcoded dsym dir - fixes dsym backups on jenkins which were broken in a0a6e40a6299ff004353603201e6d60f569c1a2c + + [Memphiz] + * [depends/tar-native] - force fdopendir to no because we don't have it when compiling native on 10.9 with 10.10 sdk installed (it would pick fdopendir from 10.10 sdk which is not available at runtime on 10.9 later on when tar is used for packaging the ios deb files) + + [Frank Razenberg] + * [keymap] Update xbox 360 keymap to group joysticks by family; sync names with xpad driver in linux 3.18 + + [Frank Razenberg] + * Remove no longer needed initialization call + + [Frank Razenberg] + * Update CJoystick for changed ButtonTranslator signature + + [Frank Razenberg] + * [buttontranslator] Group joystick keymaps by family + + [wsnipex] + * [configure] tinyxml upstream does not provide a pkg-config file, + + [Kib] + * Update irc channel + + [xhaggi] + * [gui] fix the focus issue since file item list is empty until directory is fetched + + [Tobias Markus] + * cppcheck performance fixes in interfaces/ + + [Matthias Kortstiege] + * [guilib] fix hint text vanish on unfocus - closes #15765 + + [Sebastian Brückner] + * Add support for more CEC remote keys on Android. + + [Rainer Hochecker] + * dvdplayer: fix clock speed + + [Rainer Hochecker] + * dvdplayer: reset speed of video reference clock after refresh rate changed + + [Rainer Hochecker] + * dvdplayer: only consider standard framerates for vfr + + [Matthias Kortstiege] + * [videodatabase] include tvshows base dir in GetPathsForTvShow (fixes #15739) + + [Rainer Hochecker] + * dvdplayer: discard render buffers if gui is not active + + [montellese] + * python: extend ILanguageInvocationHandler to not have to call g_pythonParser directly in CPythonInvoker + + [da-anda] + * [3D] remember user selected 3D modes between videos until playback ended + + [da-anda] + * [3D] handle stereoscopic mode of videos in mixed playlists + + + [ace20022] + * [Fix][bluray] Show simplified bd menu with all playback paths. This fixes playback of (unsupported) bd-java menu disc via the simple menu, e.g., through json-rpc. Additionally GUIDialogSimpleMenu accepts CFileItem& now. + + [Matthias Kortstiege] + * PR6334 xcode sync + + [ace20022] + * [dialogs] Move CGUIWindowVideoBase::ShowPlaySelection to its own class. + + [ace20022] + * [FileItem] Change m_items.size() <= 0 to m_items.empty(). + + [xhaggi] + * [gui] fix: dialog seek bar slider not updated correctly + + [xhaggi] + * [seek] use SeekHandler for ACTION_STEP_FORWARD and ACTION_STEP_BACK + + [xhaggi] + * [seek] adds additive seek support + + [Martijn Kaijser] + * [addon] webinterface shouldn't have GUI as dependency + + + [Rainer Hochecker] + * [pvr] - set framerate if not set by demuxer + + [Rainer Hochecker] + * dvdplayer: fix changing refresh rate after invalid state + + [AlwinEsch] + * [pvr] Fix list change with first or last page selection on Channel Manager + + [Rainer Hochecker] + * [pvr] do not persist channel data a user can not set + + [AlwinEsch] + * [pvr] Fix in Channel Manager channel move with mouse + + [uNiversaI] + * [rebrand] ffmpeg extra-version xbmc -> kodi + + [Kai Sommerfeld] + * [PVR] Optimized CPVRManager::CanSystemPowerdown not to do expensive backend calls (e.g. GetTimers) but to act 100% on locally cached data. + + [Thomas Amland] + * text rendering: dont change character spacing on justify, only word spacing + + [Kai Sommerfeld] + * Optimize CPVRRecording. No more copies, just shared pointers. + + + [Jonathan Lane] + * Fix build in OSX with case-sensitive FS. + + [Tobias Markus] + * cppcheck performance fixes in dbwrappers/ + + [montellese] + * CGUIWindowSlideShow: use CGUIViewStateWindowPictures::GetExtensions() as a fallback if no file extensions were specified in RunSlideshow() + + [montellese] + * CGUIViewStateWindowPictures: cleanup GetExtensions() + + [montellese] + * CGUIViewStateWindowPictures: make GetLockType(), GetExtensions() and GetSources() public like in CGUIViewState + + [Tobias Markus] + * cppcheck performance fixes in win32/ + + [wsnipex] + * [configure] check for tinyxml >= 2.6.2 + + [wsnipex] + * [configure] check for yajl >= 2.0 + + [Thomas Amland] + * [repos] handle errors in repo xml parsing and checksum/addons.xml fetching + + [Ryan Gribble] + * [pvr] bump pvr addons to latest commit + + [Thomas Amland] + * remove unused method + + [Pär Björklund] + * Move GetActiveWindowID from CApplication to a more fitting home in CGUIWindowManager + + [arnova] + * fixed: External subs in (local) custom folder did not work with url encoded files + + [arnova] + * changed: Rename shared strPath to seperate strMoviePath and strSubtitlePath for clarity + + [arnova] + * changed: Add option to not add the path with ChangeBasePath + + [h.udo] + * [Keyboard Layouts] Add Spanish QWERTY + + [Thomas Amland] + * [python] prevent segfault when calling DialogProgress(BG) methods before create() + + [Thomas Amland] + * [python] fix video duration infolabel inconsistency (fixes ticket #13904) + + + [uNiversaI] + * [readme update] libyajl-dev >= 2.0 + + + [Rainer Hochecker] + * [pvr] fix segfault when changing channels via json-rpc + + [Ben Avison] + * Fix for font corruption seen on Windows + + [xhaggi] + * [gui] fix list control couldn't get the focus after introducing #5804 + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * webserver: add image transformation handler for /image/ paths + + [montellese] + * CTextureCacheJob: add ResizeTexture() implementation + + [Rainer Hochecker] + * dvdplayer: consider audio stream stalled if queue ran dry + + [montellese] + * CPicture: add ResizeTexture() implementation + + [Violet Red] + * [core] Support mixed media types in playlists + + + [Fabian Ockenfels] + * [Confluence] GUIDialogVideoInfo Separate actor name and role + + [Pär Björklund] + * fixed indentation and style + + [Fabian Ockenfels] + * [GUIDialogVideoInfo] Separate actor name and role + + [Tobias Arrskog] + * Remove FEH + + [Anssi Hannula] + * [android] Add 7.1 PCM playback support + + [Tobias Arrskog] + * Dropped libyajl 1.x and removed the dependency on system.h in the JSON parser/writer + + + + [AlwinEsch] + * [confluence] Fix position switching in PVR channel manager dialog + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [Pär Björklund] + * Moved input handling from CApplication into it's own class CInputManager. Removed global g_joystick and made it a private member of CInputManager + + [Pär Björklund] + * Moved window creation and destruction from CApplication and into CGUIWindowManager + + [wsnipex] + * [cmake] clean addons project dir before building from depends + + [wsnipex] + * [cmake] pass arch definitions down to autotools based dependencies + + [wsnipex] + * [cmake] pass autoconf config.sub, config.guess down to addon dependencies + + [montellese] + * [depends] fix missing DEPENDS_PATH definition for non-darwin builds + + [montellese] + * initialize all members of HTTPFileHandler + + [montellese] + * initialize all members of IHTTPRequestHandler + + [Memphiz] + * [atv2] - remove hardcoded gcc 4.2 + + [Memphiz] + * [ios/atv2/osx] - bump sdk version to ios 8.1 and osx 10.10 + + [Memphiz] + * [win32] - bump texturepacker to 1.0.1 ( contains pr #6301 ) + + [ronie] + * [Confluence] focus play/pause button by default + + [montellese] + * [win32] update .gitignore + + [ronie] + * [Confluence] reduce code duplication + + [ronie] + * [Confluence] textbox fixes after 20dd190 + + [AlwinEsch] + * [confluence] Add PVR related parts to music OSD + + [AlwinEsch] + * [pvr] Allow usage of pvr buttons on music osd + + [Rainer Hochecker] + * dvdplayer: avoid unwanted dropping in output stage of video + + [Rainer Hochecker] + * VAAPI: avoid reset when running out of surfaces + + [Rainer Hochecker] + * dvdplayer: do not reset hw decoder if just ffmpeg get_buffer failed + + [Rainer Hochecker] + * dvdplayer: drop dead code - IHardwareDecoder::Section + + [montellese] + * [cmake] fix missing BUILD_ARGS in custom CONFIGURE_COMMAND for dependencies + + [uNiversaI] + * [update] use real support website link + + [Rainer Hochecker] + * fix render order for addon dialogs + + [Jonathan Dray] + * fix(build): debian packages generation + + [ronie] + * [Confluence] use grouplist in MusicOSD + + [ronie] + * [Confluence] re-align buttons after 8832317 + + [Andrius] + * Fix TexturePacker segfault with grayscale PNGs. see http://forum.kodi.tv/showthread.php?tid=216503 + + [Rainer Hochecker] + * [win32] - bump librtmp + + [Rainer Hochecker] + * [OSX] - drop unneeded script for librtmp + + [Rainer Hochecker] + * librtmp: bump to 2.4 + + [Tobias Markus] + * Add missing initialization for m_forceUnicodeFont + + [Memphiz] + * [jenkins] - don't clamp release builds to 1 thread - parallel building seems working ok on the builders [tm] + + [fritsch] + * dvdplayer: fix calculation of level when data based + + [Ben Avison] + * Fix for crash on startup on iOS + + [Sam Stenvall] + * [confluence] disable the "Download" item in the subtitle menu when in live TV + + [Sam Stenvall] + * [confluence] display the subtitle button in live TV too (fixes #15688) + + [Sam Stenvall] + * [confluence] move the teletext button to the left button group + + [montellese] + * video library: overwrite the scraped runtime if the one from stream details is more accurate + + [montellese] + * VideoThumbLoader: use already available reference variable + + [montellese] + * videodb: add SetDetailsForItem() + + [Sam Stenvall] + * [gui] bump version + + [Sam Stenvall] + * [confluence] bump version + + [Sam Stenvall] + * [pvr] remove the "edit" and "delete" buttons from the channel manager + + [Sam Stenvall] + * [pvr] remove support for "virtual" channels + + [ronie] + * [Re-Touched] Add PVR support + + [Balint Reczey] + * mips: Pass --disable-mips.* flags to FFmpeg to cover more platforms + + [Balint Reczey] + * mips: Use #pragma once instead of C style header guard + + [Andriy Prystupa] + * mips: Fix addon shared library naming + + [Balint Reczey] + * mips: Fix build with using OpenGL rendering + + [Balint Reczey] + * mips: Don't use ASM rounding on MIPS + + [Balint Reczey] + * mips: Add configure option for mips and mipsel + + [theuni] + * mips: add atomics + + [ronie] + * [Confluence] don't hide header during radio playback + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [Memphiz] + * [osx] - downgrade curl to former version for now until a serious symbol clash with system libcurl is solved + + [Memphiz] + * [depends/TexturePacker] - fix extraction of delay and disposal from animated gifs (wrong assumption what ExtensionBlockCount was ...) - add delay as printout too + + [ksooo] + * [PVR] Fixed: Calculation of PVR wakeuptime. Did not take margin start of timer into account. + + [montellese] + * binary addons: bring win32 in line with how the "kodi" dependency is prepared/provided + + [montellese] + * cmake: add missing get_filename_component() for DEPENDS_PATH + + [montellese] + * cosmetics: fix indentation in binary addons cmake buildsystem + + [Memphiz] + * [depends/ffmpeg] - force ffmpeg build to use AR and RANLIB from the toolchain + + [Memphiz] + * [depends/droid] - get rid of the NDK_VER parsing/define - not needed anymore as we rely on ndk r9c now (sed works differently on darwin and never got the parsing right) + + [Memphiz] + * [depends/PIL] - force "toolchain-gcc -shared" as linker command for shared libs (LDSHARED) - else it will pull stupid flags based on the building system into it (e.x. -bundle because i compile on osx - stupid python) + + [Memphiz] + * [depends/openssl] - force openssl to use the ar from the toolchain + + [Memphiz] + * [depends/libplist] - stop rebuilding libplist when not compiling for darwin + + [Memphiz] + * [docs] - clarify android readme a bit and added extra bits for building on osx + + [Memphiz] + * [depends] - probe if build os supports sort -V - if not - use sort for determining android build-tools + + [Memphiz] + * [depends/TexturePacker] - make the decisions based on the build mashine and pass the NATIVE_ARCH_DEFINES to the build - not the target defines + + [Memphiz] + * [depends] - expose NATIVE_ARCH_DEFINES and build_os via the Makefile.include to our depends + + [Memphiz] + * [depends/configure] - add build_os - defining our os strings for the os the compilation is run on + + [Memphiz] + * [m4] - add NATIVE_ARCH_DEFINES which present the -DTARGET_ defines for the system the compilation is run on + + [Memphiz] + * [AML/videobookmark] - use the CScreenshotAML class for generating video bookmarks on amlogic + + [Memphiz] + * [AML/Screenshot] - add screenshot implementation for aml platforms - based on the amvideocap driver (needs amlogic kernel with amvideocap support) + + [Memphiz] + * [win32/packaging] - bring the package list back to alphabetical order + + [montellese] + * python: add ControlTextBox.autoScroll() (thanks notspiff) + + [montellese] + * guilib: add CGUITextBox::SetAutoScrolling(delay, time, repeatTime [, condition]) + + [montellese] + * cmake: fix expansion of EXTERNALPROJECT_SETUP variable + + [montellese] + * cmake: replace addon depends build system with call to add_addon_depends + + [montellese] + * cmake: add some comments to handle-depends.cmake + + [Karlson2k] + * [win32/packaging] - Update download script to retry downloading if archive can't be extracted + + [Memphiz] + * [win32/packaging] - repack all win32 depencencies into formed packages + + [Matthias Kortstiege] + * [gui] fix font cutting in auto height textboxes + + [Sam Stenvall] + * [pvr] only update a group's last watched timestamp if the timestamp has actually changed + + [montellese] + * webserver: handle error in case no webinterface is installed + + [montellese] + * cosmetics: remove unused/rarely used "using namespace" declarations + + [montellese] + * [win32] update VS project files + + [montellese] + * webserver: add unit tests + + [montellese] + * [unit tests] set special://home to be able to dynamically load libraries + + [montellese] + * webserver: refactor handling of HEAD requests and of caching and range HTTP headers + + [montellese] + * utils: add unit tests for CHttpRange, CHttpResponseRange and CHttpRanges + + [montellese] + * utils: add HttpRangeUtils to handle HTTP range requests and responses + + [montellese] + * webserver: rename and document methods in IHTTPRequestHandler + + [montellese] + * make CCurlFile::GetHttpHeader() const + + [Kevin Mihelich] + * Fixes for using giflib 5.1 in GifHelper.cpp + + [Rafał Chwiała] + * It allows to play video with external subtitle over UPnP. + + [montellese] + * [confluence] VisualisationPresetList.xml: adjust the header label and list control IDs + + [montellese] + * CGUIDialogVisualisationPresetList: align header label and list control IDs with settings dialogs + + [Kai Sommerfeld] + * Fix CUDevProvider::GetDisks() to support non-removable and optical drives correctly. Fix CAutorun::PlayDisc() to call CMediaManager::GetDiscPath() as last resort. These changes do fix autostart and "Play disc" of Blu-ray disks on Linux trustyros using UDev, like OpenELEC. + + [Rafał Chwiała] + * PATCH for Platinum library needed to external subtitles over UPnP works. + + [Rafał Chwiała] + * platinum Changes to external subtitles over UPnP works + + [Tobias Arrskog] + * Remove xrandr from application + + [Pablo Molina] + * Added playcount and lastplayed on Audiolibrary.setSongDetails + + [theuni] + * mips: add guards + + + + + [ronie] + * revert makefile changes + + [ronie] + * [Re-Touched] Add PVR support + + [Martijn Kaijser] + * bump to 14.1 final + + + [ronie] + * [Re-Touched] Add PVR support + + [Martijn Kaijser] + * bump to 14.1 final + + + [ronie] + * [Re-Touched] Add PVR support + + [Martijn Kaijser] + * bump to 14.1 final + + + [Matthias Kortstiege] + * [gui] fix font cutting in auto height textboxes + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [Memphiz] + * [keyboard] - disabletextinput after the keyboard dialog is open because in that state the editcontrol has not the focus and therefore textinput is disabled (and text is handled via key actions in this case) + + [Memphiz] + * [guilib/input] - replace GUI_MSG_INPUT_TEXT with ACTION_INPUT_TEXT + + [Memphiz] + * [guilib] - add new action and members ACTION_INPUT_TEXT + + [Sam Stenvall] + * [pvr] Helix: bump PVR addons + + [Mike] + * darwin dlna client user agent string override not working f + + [uNiversaI] + * [Helix backport] Fix memory leak in OGGcodec: m_inited was never set to true and inial… + + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing tv shows or episodes + + [anaconda] + * Fix state not saved after 5842 if playing from "Recently added". + + [Thomas Amland] + * improve error handling of stacked items + + [Rainer Hochecker] + * ffmpeg: bump to 2.4.6 - bug fix + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [Rainer Hochecker] + * upnp: do not block upnp renderer on start of playback + + [Memphiz] + * [sdl/osx] - stop eating cmd+v keycombination away in sdlinput - application handles the paste shortcut already - fixes non-working paste on non-osd-keyboard textfields for osx + + [Memphiz] + * [osx] - fixed vsync for osx - notify reference clock when refresh rate has changed - fixes #15612 + + [montellese] + * media library: don't change the current directory path in SetHistoryForPath() (fixes #15668) + + [montellese] + * media library: ignore trailing slashes when comparing the start directory path with the current directory path + + [montellese] + * URIUtils: support ignoring trailing slashes in PathEquals() + + [Memphiz] + * [addoninstaller] - prevent recursion on addons with circular dependecies - fixes stackoverflow crash with xunity repo + + [montellese] + * videodb: fix GetRandomMusicVideo() with empty WHERE clause (fixes mixed party mode) + + [Martijn Kaijser] + * [addons] sync with repo + + [Sam Stenvall] + * [pvr] fix switching to the previous channel group (fixes #15661) + + [Sam Stenvall] + * [pvr] don't attempt to count the number of recordings unless the PVR manager is started. Fixes #15591 + + [Karlson2k] + * [android] [vfs] PosixFile: fix large file support on Android + + [fritsch] + * DVDDemuxFFmpeg: Take care of av_probe changing buffer_size fixes #15659 + + [a11599] + * [fixed] DXVA flickering on AMD + + [Rainer Hochecker] + * vaapi: allocate an extra surface + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [Anssi Hannula] + * AESinkALSA: Workaround alsa-lib buffer overflow in snd_pcm_chmap_print + + [Rainer Hochecker] + * wasapi: probe S24 before S32, works around some driver bugs + + [Chris "Koying" Browet] + * FIX: [aml] only use screen size if ppscaler is disabled + + [Rainer Hochecker] + * dvdplayer: fix potential segfault when silencing audio + + [ronie] + * [Confluence] labels in PVR Search could overlap + + [Rainer Hochecker] + * dvdplayer: ffmpeg demuxer - do not skip streaminfo if format is not known + + [fape] + * fix GUISpinControl process + + [montellese] + * sorting: fix Container.SetSortMethod (fixes #15627) + + [Martijn Kaijser] + * bump to 14.1rc1 + + [Bl4ck09] + * Do not scroll list label if false + + [ronie] + * [Confluence] remove addon ratings + + [davilla] + * FIX: [aml;pivos] Fix 1080 on MX + + [montellese] + * media library: fix path history for items with a real path differing from the requested path + + + [Ben Avison] + * Switch from glDrawArrays() to glDrawElements(). + + [Ben Avison] + * Move vertex data into an OpenGL VBO when the font cache entry is populated. + + [Ben Avison] + * Move the vertex data across to a vertex buffer object just prior to drawing. + + [Ben Avison] + * Enable hardware clipping. + + [Ben Avison] + * Rather than applying the translation offsets to the vertices, now applies them to the model view matrix from the top of the matrix stack and pushes it over to OpenGL. The vertices themselves are still all held client-side. + + [Ben Avison] + * Move the application of the translation offsets into the GLES code. + + [Ben Avison] + * Rewrite of scrolling text code. + + [Ben Avison] + * Increase font cache hit rate by keying on the fractional part of m_originX and m_originY *after* they have been through the graphics context's transformation matrix, plus the scale/rotation elements of the matrix, rather than the origin in the original frame of reference plus the complete transformation matrix. All vertices of individual glyph bounding boxes are a constant offset from this position, and when the fractional part of the translation is a match, the rounding of each vertex will be in the same direction; this permits us to calculate the desired vertices from the cached ones simply by adding the integer parts of the translations with no additional rounding steps. + + [Ben Avison] + * Lay the groundwork for hardware clipping. + + [Ben Avison] + * Add a cache of font glyph bounding box vertices. + + [Ben Avison] + * CGUIFontTTFBase::RenderCharacter can now append to arbitrary vectors of vertices rather than only CGUIFontTTFBase::m_vertex + + [Ben Avison] + * Convert CGUIFontTTFBase::m_vertex to be managed as a std::vector. + + [Matthias Kortstiege] + * [videosync] remove unused variable + + [Matthias Kortstiege] + * [networkservices] remove unused variable + + [Matthias Kortstiege] + * [httpheader] fix signed/unsigned mismatch + + [Matthias Kortstiege] + * [texturemanager] reorder initialization list + + [Martijn Kaijser] + * [pvr] bump addon.pvr to 1.9.3 after dbfa0b6374b779a62c6fb0456f0c0618a6e25bfc + + [Ben Avison] + * Move the reference-counting of Begin and End calls from DX and GL source files into GUIFontTTF.cpp. + + [Tobias Markus] + * Fix for coverity #719001 + + [Tobias Markus] + * cppcheck performance fixes in linux/ + + [anaconda] + * [cosmetics] StereoscopicsManager: don't log localized strings. + + [montellese] + * binary addons: only create backwards compatibility header file if it doesn't already exist + + [montellese] + * cosmetics: fix a typo in prepare-env.cmake helper script + + + [ace20022] + * fix typo in 729c42b0d9675ea6b3af7192afc23d96a775fc74. + + [Tobias Markus] + * [coverity] Proposed fix for CID 1260398 + + [Tobias Markus] + * cppcheck performance fixes + + [Sam Stenvall] + * [pvr] fix missing variable assignment after PR #4671 + + [ace20022] + * [dvdplayer] Prioritize number of channels over codec over default flag and add a setting to change that behavior. + + + [ronie] + * [Confluence] fixed: sideblade would scroll + + [ronie] + * [Confluence] Cosmetics + + [Mike] + * darwin dlna client user agent string override not working + + [Memphiz] + * [jenkins/droid] - allow to select the ndk version through jenkins jobs and bump to ndk r10d + + [Tobias Markus] + * cppcheck performance fixes in video/ + + + [xhaggi] + * [pvr] fix wrong condition for channel view if no epg items exist + + [Ryan Gribble] + * [pvr] support EPG item type for "ListItem.Premiered" (FirstAired) GUI label + + [AlwinEsch] + * [PVR] Fix CFileItem::FillInDefaultIcon wrong compare position + + [Rainer Hochecker] + * renderer: fix sequence from WaitFrame, Render, FrameMove to WaitFrame, FrameMove, Render + + [Rainer Hochecker] + * renderer: exit gfx lock when waiting for present time + + [Rainer Hochecker] + * guilib: mark control dirty when setting to invisible + + [smallint] + * renderer: improve rendering to gui and separate video layer + + [smallint] + * Set dirty flag in teletext dialog if required + + [Rainer Hochecker] + * renderer: drop old tempfix firstflippage, did not work anyway because RendererHandlesPresent returned always true + + [xhaggi] + * [pvr] fix: refresh container after view mode is changed in guide window + + [Tobias Markus] + * cppcheck performance fixes in view/ + + [AlwinEsch] + * [PVR] Fix CGUIWindowPVRChannels::Update (come back from hidden can not work) + + + [Tobias Markus] + * [coverity] fix for #1262429 + + [Tobias Markus] + * cppcheck performance fixes in windowing/ + + [Tobias Markus] + * cppcheck performance fixes in storage/ + + [xhaggi] + * [keymaps] replaces obsolete mapping of left/right to prev/next group for tv/radio fullscreen with StepBack and StepForward + + [xhaggi] + * [confluence] removes channel group chooser control (id: 503) + + [xhaggi] + * [pvr] removes group chooser from CGUIWindowFullScreen + + [montellese] + * [confluence] remove default heading labels for DialogPeripheralSettings, SmartPlaylistEditor and VideoOSDSettings + + [montellese] + * CGUIDialogAudioSubtitleSettings: add default heading label + + [montellese] + * CGUIDialogVideoSettings: add default heading label + + [montellese] + * cmake: use OUTPUT_DIR instead of DEPENDS_PATH in add_addon_depends + + [montellese] + * cmake: append revision/hash of addon to downloaded tarball to force downloading a new version if the revision/hash has changed + + [Tobias Markus] + * cppcheck performance fixes in utils/ + + [Tobias Markus] + * Fix for Coverity #1126044 + + [Tobias Markus] + * Fix for coverity #1194431 + + [xhaggi] + * [gui] reset view state directly after directory was fetched + + [xhaggi] + * [gui] use m_vecItems directly instead of a new CFileItemList and copy it over to m_vecItems + + [xhaggi] + * [pvr] refactor CPVRManager:OnAction out to PVRActionListener + + [xhaggi] + * [win32] adds PVRActionListener to VS2010 project + + [xhaggi] + * [osx] adds PVRActionListener to xcode project + + [xhaggi] + * [pvr] refactor REMOTE_X key functionality from CGUIWindowFullScreen to PVR action listener + + [xhaggi] + * [win32] adds IActionListener.h to VS2010 project + + [xhaggi] + * [osx] adds IActionListener to xcode project + + [xhaggi] + * [core] adds action listener pattern + + [montellese] + * CGUIDialogPeripheralSettings: add default heading label + + [montellese] + * CGUIDialogSmartPlaylistEditor: add default heading label + + [montellese] + * videodb: (temporarily) trim actor names in AddActor + + [montellese] + * videodb: add update/cleanup logic for version 91 in case of duplicate actors + + + [AlwinEsch] + * [PVR] Fix DialogPVRChannelManager.xml (from name edit go right not work) + + [Tobias Markus] + * [coverity] fixes for missing breaks and falling-through statements + + [Chris "Koying" Browet] + * ADD: [gles] enable contrast & brightness controls + + [Chris "koying" Browet] + * CHG: [gles] use shader for generic yuv bob deinterlacing + + [Chris "koying" Browet] + * FIX: [gles] enable generic bob deinterlacing + + [Chris "Koying" Browet] + * ADD: [gles] BOB deinterlacing + + [Chris "Koying" Browet] + * FIX: [stf] de-invert y at source + + + [Matus Kral] + * [cec] Don't resume on source change if playback is paused. + + [Sam Stenvall] + * [pvr] update the timestamps directly in SetLastWatched() instead of having the caller call Persist() on both the channel and the group, something which leads to an incredible mount of persisting being done everytime someone switches channel + + [Sam Stenvall] + * [pvr] always persist channels to the database immediately when Persist is called. This way we can use lastinsertid() to set the new channel ID for new channels, which means we don't have to rely on GetLastChannelID() which only worked on SQLite databases (TRWTF) and was prone to random segmentation faults. + + [Sam Stenvall] + * [pvr] remove unused method + + [Sam Stenvall] + * [pvr] removed two unused dialogs + + [Sam Stenvall] + * [pvr] no need to assign a variable twice + + [Sam Stenvall] + * [pvr] remove an unneeded lock + + [Sam Stenvall] + * [pvr] remove a lot of unused methods and some unused code + + [Sam Stenvall] + * [pvr] use m_addons directly, no need to use the getter here + + [smallint] + * [imx] Fixed mode change after SysfsUtils port + + [Andriy Prystupa] + * [wayland] fixed wrong current/preferred modes in Output + + [ace20022] + * [URIUtils] Fix IsSmb, IsFTP, IsAfp, IsDAV and IsNfs. Due to protocol stacking, e.g., files in a zip on a smb share were not recognized as files on a network share. + + [Andriy Prystupa] + * Fixed refresh rate calculation for wayland. + + + [Thomas Amland] + * improve error handling of stacked items + + [anaconda] + * Fix state not saved after 5842 if playing from "Recently added". + + [Sam Stenvall] + * [pvr] don't persist channel groups (includes members) unless the group is fully loaded + + + [asavah] + * fix videodb SQL + + + [Matthias Kortstiege] + * [cosmetic] fix signed/unsigned mismatch + + [montellese] + * videodb: potentially fix SQL query in GetRandomMusicVideo + + [Tomas Melin] + * Fix duplicate statement in buttontranslator + + [Tobias Markus] + * cppcheck performance fixes in guilib/ + + [Tobias Markus] + * cppcheck performance fixes in threads/ + + [Tobias Markus] + * cppcheck performance fixes in test/ + + [Tobias Markus] + * cppcheck performance fixes in settings/ + + [Tobias Markus] + * cppcheck performance fixes in rendering/ + + [Tobias Markus] + * cppcheck performance fixes in input/ + + + [ronie] + * [Confluence] Cosmetics + + [Arne Morten Kvarving] + * quell warnings in VideoSyncDRM + + [Tobias Markus] + * Reorder initialization list Fixes compile time warning. + + [Arne Morten Kvarving] + * fixed: URIUtils.IsRemote test (now) accesses the network member in g_application + + [uNiversaI] + * readmes : remove deprecated sdl dependencies. + + [Matthias Kortstiege] + * [videolibrary]: do not set set season artwork on an empty tvshow + + [ronie] + * add path option + + [BigNoid] + * [video info] Fix changing fanart + + [Tobias Markus] + * cppcheck performance fixes in peripherals/ + + + [Rainer Hochecker] + * drop language string for crop black bars after d30e8ec54bbc374e70f1b313881d66ccdb3d2d62 + + [Rainer Hochecker] + * dvdplayer: fix compiler warning in cc code + + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing tv shows or episodes from library + + [wsnipex] + * [depends] fix building audio encoders on non unified depends platforms + + [John Rennie] + * Add support for right mouse drag + + [Rainer Hochecker] + * dvdplayer: drop autocrop + + + [Kai Sommerfeld] + * Optimize CEpgInfoTag. No more copies, just shared pointers. + + [Lars Op den Kamp] + * [PVR] bump add-ons (sync api with PR #4342) closes #4342 + + [Kai Sommerfeld] + * [PVR] Feature: Confirm XBMC shutdown if any local PVR backend is not idle. + + + [ronie] + * [Confluence] fix focused text color for addons on home + + [John Rennie] + * Remove unecessary header + + [John Rennie] + * Add actions for mouse drag start and end + + + [Bernd Kuhls] + * Allow up to 31 days to display in the EPG + + + + + [Bernd Kuhls] + * [configure] Fix display of git revision + + [Rainer Hochecker] + * dvdplayer: closed captions - add DVD style for 608 + + [Rainer Hochecker] + * dvdplayer: also parse h264 for closed captions + + [montellese] + * [win32] binary addons: remove dependencies as they are part of the audioencoder addons now + + [montellese] + * [win32] update/cleanup build scripts for binary addons + + [wsnipex] + * [depends] fix building binary addons with the new auto depends handling + + [wsnipex] + * [depends] adapt binary addon building to new system + + [wsnipex] + * [depends] build cmake with ssl support by using system curl + + [montellese] + * [depends] cmake: set CORE_SYSTEM_NAME for android, ios and rbpi + + [wsnipex] + * [depends] use central include file for binary-addons build + + [wsnipex] + * [cmake] binary addons: automatic dependency resolution + + [wsnipex] + * [cmake] add helper function for addon dependency handling + + [montellese] + * binary addons: don't build audioencoder.flac on IOS/ATV2 + + [wsnipex] + * binary addons: bump audioencoder addons + + [montellese] + * [cmake] binary addons: support negated platform definitions + + [Rainer Hochecker] + * dvdplayer: closed captions - implement 608 as fallback + + [Rainer Hochecker] + * dvdplayer: cc decoder 608 - cosmetics + + [Memphiz] + * [osx] - fixed vsync for osx - notify reference clock when refresh rate has changed - fixes #15612 + + [Memphiz] + * [keyboard] - disabletextinput after the keyboard dialog is open because in that state the editcontrol has not the focus and therefore textinput is disabled (and text is handled via key actions in this case) + + [Memphiz] + * [guilib/input] - replace GUI_MSG_INPUT_TEXT with ACTION_INPUT_TEXT + + [Memphiz] + * [guilib] - add new action and members ACTION_INPUT_TEXT + + [Memphiz] + * [sdl/osx] - stop eating cmd+v keycombination away in sdlinput - application handles the paste shortcut already - fixes non-working paste on non-osd-keyboard textfields for osx + + + [wsnipex] + * [TexturePacker] fix building on ubuntu 12.04 + + + + + + + + [Philipp Te] + * [CONFLUENCE] use VARs for list overlays + + [ronie] + * [Confluence] cosmetics + + [ronie] + * re-touched update Makefile + + [wsnipex] + * [Texturepacker] allow building with giflib4 + + [Arne Morten Kvarving] + * quell compiler warning (no return value) with giflib4 + + [Arne Morten Kvarving] + * fixed: gif support in TexturePacker using giflib4 + + [wsnipex] + * [configure] fix case where --enable-texturepacker is given, but not available + + [Matthias Gehre] + * configure.in: Make SDL depend on joystick + + [Memphiz] + * [addoninstaller] - prevent recursion on addons with circular dependecies - fixes stackoverflow crash with xunity repo + + + [Tobias Markus] + * cppcheck performance fixes in osx/ + + [BigNoid] + * CApplication: fix loading of custom windows + + [Tobias Markus] + * cppcheck performance fixes in network/ + + [Rainer Hochecker] + * upnp: do not block upnp renderer on start of playback + + [Memphiz] + * [win32] - make use of the texturepacker binary package for windows + + [wsnipex] + * [configure] adjust to texturepacker and squish in depends + + [wsnipex] + * [TexturePacker] TEMP workaround for skins: create legacy link. Remove me when skins are fixed + + [wsnipex] + * [TexturePacker] - move texturepacker to native depends + + [wsnipex] + * [depends] add target(non native) libsquish + + [wsnipex] + * [libsquish] - move libsquish to native depends + + [Memphiz] + * [TexturePacker/Win32] - link zlib statically, link statically against libgif, add dependencyfree TexturePacker.exe + + [Memphiz] + * [TexturePacker/Win32] - don't copy sdl dlls to TexturePacker (not needed anymore) + + [Memphiz] + * [TexturePacker] - remove MakeDDS as its heavily broken and would pull in half of XBMC via DDSImage.h/.cpp + + [Memphiz] + * [depends] - add giflib native (which is needed for TexturePacker now) + + [Memphiz] + * [TexturePacker] - fixed win32 projects and makefile to compile the new decoders and link the new libs + + [Memphiz] + * [TexturePacker] - removed unused files + + [Memphiz] + * [TexturePacker] - renamed XBMCTex.cpp to TexturePacker.cpp replace SDL implementation with the new decoders + + [Memphiz] + * [TexturePacker] - send all errors to stderr, all other printouts to stdout + + [Memphiz] + * [TexturePacker] - abstracted image decoder and implemented decoders for jpg (libjpg), gif (libgif) and png (libpng) + + [Memphiz] + * [texturepacker/simplefs] - add some needed helper methods (seek, getfilesize, getfp) + + [wsnipex] + * [depends] bump curl to v7.39.0 + + [wsnipex] + * [depends] bump libnfs to v1.9.6 + + [wsnipex] + * [depends] bump libssh to v0.7.0a + + [wsnipex] + * [depends] bump openssl to 1.0.1j + + [wsnipex] + * [depends] bump gcrypt to v1.6.2 + + [Memphiz] + * [win32] - added static libs to zlib package + + [Memphiz] + * [win32] - added giflib package (needed for TexturePacker and for new gif support in core later aswell) + + [Memphiz] + * [win32] - added libpng package (needed for texturepacker) + + [Tobias Markus] + * cppcheck performance fixes in profiles/ + + [Tobias Markus] + * cppcheck performance fixes in playlists/ + + + [Tobias Markus] + * cppcheck performance fixes in filesystem/ + + + [ronie] + * [Confluence] fix header label + + [Arne Morten Kvarving] + * cosmetics after CStdString removal + + [Arne Morten Kvarving] + * CXRandR: pass strings by reference, not value + + [mrhipp] + * [airtunes] - feed audio data to the pipe in one chunk instead of splitting into 64 byte buffers - reduces audio stuttering + + [Matthias Kortstiege] + * [scraper] initialize members in the order they were declared + + [montellese] + * BYE BYE CStdString + + [Jonathan Marshall] + * [stdstring] fix xbmc/commons/Exception.h + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in interfaces/json-rpc/GUIOperations.cpp + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in xbmc/cdrip/CDDARipper.h + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in network/cddb.h + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in interfaces/info/SkinVariable.h + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in StringUtils.cpp + + [montellese] + * [stdstring] get rid of CStdString in cores/ + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in UnrarXLib + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in URIUtils.cpp + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in utils/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in windows/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in guilib/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in xbmc/Util.cpp + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in xbmc/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in network/upnp/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in video/windows/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in video/dialogs/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in video/ + + [montellese] + * [stdstring] get rid of CStdString in win32/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in settings/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in windowing/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in rendering/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in profiles/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in powermanagement/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in pictures/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in peripherals + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in osx/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/windows/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/karaoke/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/infoscanner/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/dialogs/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/tags/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/ + + [ronie] + * don't force skins to use a panel container + + [Thomas Amland] + * [confluence] left align addon descriptions + + [montellese] + * media library: don't change the current directory path in SetHistoryForPath() (fixes #15668) + + [montellese] + * media library: ignore trailing slashes when comparing the start directory path with the current directory path + + [montellese] + * URIUtils: support ignoring trailing slashes in PathEquals() + + [montellese] + * videodb: avoid an empty entry in string arrays + + [Tobias Markus] + * cppcheck performance fixes in epg/ + + + [ronie] + * [Confluence] there's no reason to hide the visualization in the pvr channels windows + + [Matthias Kortstiege] + * [cosmetic] fix missing default switch statement + + [Matthias Kortstiege] + * [cosmetic] initialize members in the order they were declared + + [uNiversaI] + * [confluence] fix cosmetic scrollbar shwing for half setting height + + [Rainer Hochecker] + * dvdplayer: add counting selection streams of type and source + + [Rainer Hochecker] + * dvdplayer: close/flush subtitle player in OpenDefaultStreams + + [Rainer Hochecker] + * dvdplayer: closed captions - fix rollup types and clear window + + [Rainer Hochecker] + * dvdplayer: fix for closed captions + + [uNiversaI] + * [confluence] Chapter foward always hidden by broken condition + + [Tobias Markus] + * cppcheck performance fixes in dialogs/ + + [montellese] + * silence warning in TestDatabaseUtils (thanks @notspiff) + + [Tomi Harjunmaa] + * Fix memory leak in OGGcodec: m_inited was never set to true and inialization was done always causing a memory leak + + [anaconda] + * Fix leftover from c89ddea209bff64dab7cb386be4a5fad06263610 + + [Sam Stenvall] + * [pvr] properly select the hovered channel in the channel manager (fixes #15473) + + [xhaggi] + * [pvr] don't reset internal group channel numbers if reset channel number cache + + + [montellese] + * videodb: use PrepareSQL() instead of StringUtils::Format() for SELECT query + + [montellese] + * videodb: remove unused GetMusicVideoCount() + + [montellese] + * videodb: fix GetRandomMusicVideo() with empty WHERE clause (fixes mixed party mode) + + [Martijn Kaijser] + * [addons] sync with repo + + [Tobias Markus] + * cppcheck performance fixes in cores/paplayer + + [Ryan Gribble] + * [pvr] EPG_INFO field "strIconPath" was not being stored/retrieved in the EPG database + + [Ryan Gribble] + * [pvr] EPG_INFO field "strIconPath" was not being transferred in Update() function + + + [Wolfgang Schupp] + * Revert "Moved userdata to XDG_DATA_HOME" + + [Chris "Koying" Browet] + * CHG: Extract SysfsUtils from the AML utils + + [montellese] + * cosmetics: remove unneeded C header includes from Webserver.h + + [montellese] + * cosmetics: make CPythonInvoker and CAddonPythonInvoker constructor explicit + + [montellese] + * cosmetics: add virtual destructor to classes derived from IHTTPRequestHandler + + [montellese] + * [win32] remove non-existing xbmc/interfaces/swig/ControlListAddItemMethods.i from VS project files + + [popcornmix] + * squash: Changes suggested by Jalle19 + + [Philipp Te] + * [CONFLUENCE] fix spacer image width + + [popcornmix] + * [PVR] Fix for slow metadata updates of recordings + + [Sam Stenvall] + * [pvr] fix switching to the previous channel group (fixes #15661) + + [Rainer Hochecker] + * dvdplayer: do not wait for buffers when closing subs or teletext in OpenDefaultStreams + + [ace20022] + * [dvdplayer/settings] Add option to prefer audio/subtitle streams for visually/hearing impaired. + + [ace20022] + * [DVDDemux] Add FLAG_HEARING_IMPAIRED and FLAG_VISUAL_IMPAIRED flags. + + [a11599] + * [fixed] DXVA flickering on AMD + + [Stanisław Gackowski] + * Corrected references to special paths for clarity + + [Balint Reczey] + * Fix bashisms in shell scripts + + [Stanisław Gackowski] + * Place link when migrating directory to new location + + [Stanisław Gackowski] + * Moved temp folder to XDG_CACHE_HOME on Linux + + [Stanisław Gackowski] + * Moved userfiles to XDG base directory spec compliant location (XDG_DATA_HOME) + + + [Rainer Hochecker] + * AE: make stream more robust against frequent calls to flush + + [Memphiz] + * [gnutls] - enable gnutls support for all platforms + + [Memphiz] + * [depends/gmp/ios] - fix compilation of gmp - needed for gnutls + + [Memphiz] + * [depends/nettle/ios] - on older ios toolchains we need to disable assembly because gcc 4.2 (xcode3) doesn't know about ".int" asm operator + + [Rainer Hochecker] + * dvdplayer: CID 1261373 (#1 of 1): Resource leak (RESOURCE_LEAK) + + [Rainer Hochecker] + * wasapi: fix incorrect error log + + [Rainer Hochecker] + * dvdplayer: fix for closed captions + + [mgehre] + * configure.in: Fix final_message without PulseAudio + + [Chris "Koying" Browet] + * FIX: [aml] only use screen size if ppscaler is disabled + + [Philipp Te] + * [Confluence] - some improvements for VideoOSD + + + [fritsch] + * DVDDemuxFFmpeg: Take care of av_probe changing buffer_size fixes #15659 + + [Sam Stenvall] + * [gui] correct the logic for checking whether we have a sort method or not + + [Sam Stenvall] + * [pvr] don't attempt to count the number of recordings unless the PVR manager is started. Fixes #15591 + + [Anssi Hannula] + * AESinkALSA: Workaround alsa-lib buffer overflow in snd_pcm_chmap_print + + [Rainer Hochecker] + * vaapi: allocate an extra surface + + [Rainer Hochecker] + * ffmpeg: explicitly disable sdl + + [Rainer Hochecker] + * ffmpeg: bump to 2.5.2 + + [Rainer Hochecker] + * dvdplayer: sync large audio errors without playing with the clock + + [Rainer Hochecker] + * dvdplayer: simplify calculation of playing pts for audio + + [Sam Stenvall] + * [squash] inject parent implemenation's context buttons before the Manage button + + [Sam Stenvall] + * [gui] bump xbmc.gui to 5.6.0 + + [Sam Stenvall] + * [confluence] bump version to 2.6.0 + + [Sam Stenvall] + * [settings] make "Group manager" accessible from the Live TV settings, just like the channel manager + + [Sam Stenvall] + * [language] rename "Group management" to "Group manager" to better match "Channel manager" + + [Sam Stenvall] + * [confluence] move the "group items" radio button under "Misc Options" + + [Sam Stenvall] + * [confluence] remove height limitation from the PVR side blade + + [Sam Stenvall] + * [pvr] remove a lot of duplicated functionality from the channel list context menu. Some of the functionality is already present in the channel manager dialog, and for consistency some options (filter and show hidden channels) have been moved to the side blade (similar to how it's done for e.g. movies). + + [Rainer Hochecker] + * wasapi: probe S24 before S32, works around some driver bugs + + [Sam Stenvall] + * [pvr] remove unused variable + + [fritsch] + * Revert "fixed: CID 719030 Copy into fixed size buffer" + + [fritsch] + * Revert "fixed: CID 719030 Copy into fixed size buffer" + + [fritsch] + * Revert "fixed: CID 719032 Copy into fixed size buffer" + + [Rainer Hochecker] + * dvdplayer: fix potential segfault when silencing audio + + [Joakim Plate] + * fixed: CVE 1249615 Dereference after null check + + [Joakim Plate] + * fixed: CID 1248213 Unsigned compared against 0 + + [Joakim Plate] + * fixed: CID 1248203 Logically dead code + + [Joakim Plate] + * fixed: CID 1228827 Logically dead code + + [Joakim Plate] + * fixed: CID 1228826 Logically dead code + + [Joakim Plate] + * fixed: CID 228815 Unchecked return value + + [Joakim Plate] + * fixed: CID 719171 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719169 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719168 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719167 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719166 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719165 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719164 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719163 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719162 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719160 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719159 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719157 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719153 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719151 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719150 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719032 Copy into fixed size buffer + + [Joakim Plate] + * fixed: CID 719030 Copy into fixed size buffer + + [Joakim Plate] + * fixed: CID 719030 Copy into fixed size buffer + + [Joakim Plate] + * fixed: CID 719029 Copy into fixed size buffer + + [ace20022] + * [pvr] Fix segfault introduced in 841fb09f0d2f31e5bf9b3cb5df05c7dbfcae0300. + + [Joakim Plate] + * fixed: CID 719001 Resource leak + + [Joakim Plate] + * fixed: CID 718985 Big parameter passed by value + + [Joakim Plate] + * fixed: CID 1248237, 1248250 Unintended sign extension + + [Joakim Plate] + * fixed: CID 1248206 Unchecked dynamic_cast + + [Joakim Plate] + * fixed: CID 1248179 Unchecked return value + + [Joakim Plate] + * fixed: CID 1228812 Unchecked return value + + [Joakim Plate] + * fixed: CID 1221980 Unchecked return value + + [Joakim Plate] + * fixed: CID 1207074 Untrusted value as argument + + [Joakim Plate] + * fixed: CID 718202 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 718013 Resource leak + + + [montellese] + * unit tests: fix TestDatabaseUtils + + [montellese] + * [win32] fix "Debug Testsuite" target compilation of DVDCodecs' cc_decoder + + [ronie] + * [Confluence] labels in PVR Search could overlap + + [montellese] + * cosmetics: fix c&p'ed code comment in CVideoInfoTag::ToSortable() + + [Rainer Hochecker] + * dvdplayer: drop setting sync methods for sync playback to display. default to resample and drop/dup for passthrough + + [Rainer Hochecker] + * [pvr] bump addons after #6036 + + [Martijn Kaijser] + * [skin] update re-touched + + [Rainer Hochecker] + * dvdplayer: captions, update rullup windows at end of sequence + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [Rainer Hochecker] + * dvdplayer: add setting to enable parsing for closed captions + + [Rainer Hochecker] + * dvdplayer: add support for closed captions + + [Rainer Hochecker] + * dvdplayer: ffmpeg demuxer - do not skip streaminfo if format is not known + + [Rainer Hochecker] + * dvdplayer: fix mime type for mpegts + + [Rainer Hochecker] + * dvdpalyer: revomve dead cc code + + [Rainer Hochecker] + * dvdplayer: add closed caption decoder for cea708 + + [ace20022] + * [pvr][cleanup] Make class CPVRChannelGroupsContainer' non-copyable. + + [ace20022] + * [pvr][cleanup] Technically the member function 'foo::bar' can be const. + + [ace20022] + * [pvr][cleanup] The scope of the variable 'foo' can be reduced. + + [ace20022] + * [pvr][cleanup] Possible null pointer dereference: tag - otherwise it is redundant to check it against null. + + [ace20022] + * [pvr][cleanup] Member variable 'CPVRTimerInfoTag::m_genre' is not assigned a value in 'CPVRTimerInfoTag::operator='. + + [ace20022] + * [pvr][cleanup] Member variable 'foo::bar' is not assigned a value in 'foo::bar='.tor. + + [ace20022] + * [pvr][cleanup] Member variable 'foo::bar' is not initialized in the constructor. + + [ace20022] + * [pvr][cleanup] Variable 'iClientIndex' is reassigned a value before the old one has been used if variable is no semaphore variable. + + [ace20022] + * [pvr][cleanup] Variable 'foo' is assigned in constructor body. Consider performing initialization in initialization list. + + [ace20022] + * [pvr][cleanup] Function parameter 'path' should be passed by reference. + + [ace20022] + * [pvr][cleanup] Prefer prefix ++/-- operators for non-primitive types. + + [ace20022] + * [pvr][cleanup] Unused variable: strBackendDiskspace . + + + [Chris "Koying" Browet] + * FIX: [aml] S812 can do 4K + check earlier + + [Chris "Koying" Browet] + * FIX: hevc bitstream tweak from aml + + [John Stebbins] + * MediaCodec: add hw accel hevc playback + + [John Stebbins] + * StageFright: add hw accel hevc playback + + [John Stebbins] + * BitstreamConverter: add hevc annex-b conversion + + [montellese] + * store the sort order per sort method instead of globally + + [montellese] + * rename SORT_METHOD_DETAILS to GUIViewSortDetails + + [montellese] + * cosmetics in GUI view related code + + [Chris "Koying" Browet] + * CHG: [droid] do not h/w decode SD video (save on support) + + [fape] + * fix GUISpinControl process + + [Tobias Markus] + * Remove string initialization + + [Joakim Plate] + * fixup! GL: switch to CPU based matrix caculations to match GLES + + [Joakim Plate] + * fixup! GL(ES): Simplify matrix stack handling + + [Joakim Plate] + * GL(ES): Simplify matrix stack handling + + [Joakim Plate] + * GL: switch to CPU based matrix caculations to match GLES + + [Joakim Plate] + * gl: avoid grabbing viewport on each render + + [Chris "Koying" Browet] + * ADD: [aml] add h265/hevc support + + [Stanislav Vlasic] + * Add aml_support_hevc function and recognize S812 chip + + + [Tobias Markus] + * Fixing vdp_st checking + + [Tobias Markus] + * cppcheck fixes in cores/dvdplayer/ + + [Tobias Markus] + * cppcheck performance fixes in cores/AudioEngine + + [Chris "Koying" Browet] + * FIX: [amc] check for exceptions on everything + + [Chris "Koying" Browet] + * FX: [jni] useExceptionCheck rather than ExceptionOccured + + [montellese] + * binary addons: bump audioencoder.vorbis to match libvorbis built on win32 + + [montellese] + * [win32] binary addons: replace prebuilt libflac dependency with a cmake based one + + [montellese] + * [win32] binary addons: add and build nasmw executable needed for building flac + + [montellese] + * [win32] binary addons: replace prebuilt libvorbis dependency with a cmake based one + + [montellese] + * [win32] binary addons: replace prebuilt libogg dependency with a cmake based one + + [montellese] + * [win32] binary addons: replace prebuilt libmp3lame dependency with a cmake based one + + [Tobias Markus] + * cppcheck performance fixes in cores/dllloader/ + + [montellese] + * sorting: fix Container.SetSortMethod (fixes #15627) + + + [Tobias Markus] + * cppcheck performance fixes in cores/playercorefactory + + + [fritsch] + * VAAPI: Enable VC1 by default - not much interlaced content there + + [fritsch] + * [art] fix up dfaacca54d4a8f78ee02a041d4d1648aa0b403a2 + + [montellese] + * upnp: add support for xbmc:uniqueidentifier with IMDB/TVDB identifier + + [montellese] + * platinum: add patch for bd19c357eb + + [montellese] + * platinum: add xbmc:uniqueidentifier for IMDB/TVDB identifiers + + [Tobias Markus] + * cppcheck performance fixes in android/ + + [wsnipex] + * [depends] fix gmp Makefile + + [wsnipex] + * [depends] fix nettle dylib target + + [wsnipex] + * [depends] bump gnutls to last stable version 3.3.10 + + [wsnipex] + * [android] re-enable gnutls in ffmpeg + + + [fritsch] + * AESinkPULSE: Use const ref when finding the channel map + + [montellese] + * [videodb] bump version + + [montellese] + * videodb: cleanup/fix DELETE triggers + + [Jonathan Marshall] + * [videodb] use type_view for views + + [Jonathan Marshall] + * [videodb] FIX: drop incorrect querying of non-existent setlinkmovie table + + [Jonathan Marshall] + * [videodb] adds AppendFilter() to simplify repetitive queries in GetFilter + + [Jonathan Marshall] + * [videodb] simplify AddToLinkTable, RemoveFromLinkTable implementations + + [Jonathan Marshall] + * [videodb] switch the tag and link tables to the new layout + + [Jonathan Marshall] + * [videodb] switch the studio,genre,country and link tables to the new format + + [Jonathan Marshall] + * [videodb] refactor UpdateLinkTable into AddLinksToItem, UpdateLinksToItem, and use these when adding genre,country,studio + + [Jonathan Marshall] + * [videodb] cleanup AddCast, AddLinkToActor to drop unused params + + [Jonathan Marshall] + * [videodb] switch actor table and links to the new layout + + [Jonathan Marshall] + * [videodb] refactors UpdateActorLinkTable into UpdateActorLinksToItem, AddActorLinksToItem, with special case for musicvideos + + [Jonathan Marshall] + * [videodb] add routines for creating link indices + + [Jonathan Marshall] + * [smartplaylist] adds routine for generating queries against videodb link tables + + [Jonathan Marshall] + * [dbwrappers] have query() take a std::string, we copy direct into a std::string anyway in the functions + + [xhaggi] + * [gui] bump api version to 5.5.0 + + [xhaggi] + * [confluence] adds radio button to hide/unhide a group in DialogPVRGroupManager + + [xhaggi] + * [pvr] adds support for hiding groups + + [fritsch] + * VAAPI: Log the function of the CheckSuccess that failed + + [Tobias Arrskog] + * Made versiontag optional + + [fritsch] + * VAAPI: Report failure when VPP is not usable + + [fritsch] + * VAAPI: Don't return false when vlVaQueryDisplayAttributes returns empty + + [Martijn Kaijser] + * [skin] include last re-touched fixes + + [ace20022] + * [Fix] Deinitialize the audio manager to avoid memory leaks. + + [fritsch] + * CFile: Don't cast potential negative values to unsigned int + + [ronie] + * [Confluence] remove unused code + + [montellese] + * addons: "defaultresolution" attribute is optional in skin.xsd + + [montellese] + * addons: rename "defaultresolutionwide" attribute to "defaultwideresolution" in skin.xsd + + [montellese] + * addons: remove unused "defaultthemename" attribute from skin.xsd + + [montellese] + * addons: add "res" element to skin.xsd + + [montellese] + * addons: add service.xsd + + [montellese] + * addons: add "cachepersistence" attribute to scraper.xsd + + [montellese] + * addons: fix repository.xsd + + [montellese] + * addons: remove "wingl" as a possible platform value from metadata.xsd + + [montellese] + * addons: remove unused "content" element from pluginsource.xsd + + [montellese] + * addons: fix pluginsource.xsd + + [Thomas Amland] + * remove old samba mount code + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [montellese] + * [win32] update VS project files + + [montellese] + * filesystem: reduce code duplication in CBlurayFile, CMultiPathFile, CSpecialProtocolFile and CSpecialProtocolDirectory by deriving from COverrideFile/COverrideDirectory + + [montellese] + * filesystem: add COverrideFile and COverrideDirectory + + [Bl4ck09] + * Do not scroll list label if false + + + [Tobias Arrskog] + * Made versiontag optional + + [Martijn Kaijser] + * [skin] include last re-touched fixes + + [fritsch] + * CFile: Don't cast potential negative values to unsigned int + + [Martijn Kaijser] + * [release] bump to Helix 14.0 final + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [ace20022] + * [Fix] Fix a memory leak in PlayerSelectionRule.cpp. + + [ace20022] + * [Fix] Fix a memory leak in Setting.cpp. + + [t4-ravenbird] + * woa - use profile path + + [Rainer Hochecker] + * DXVA: add HD5xxx to ati work-around, only capable of opening a single time + + [Rainer Hochecker] + * dvdplayer: make sure overlay container is cleared when player stops + + [h.udo] + * [rebrand][confluence sounds.xml] xbmc -> kodi + + [h.udo] + * [rebrand][Json-RPC schema] xbmc -> kodi + + [h.udo] + * [rebrand][Linux FEH_py.in] xbmc -> kodi + + [h.udo] + * [rebrand][Win32BuildSetup readme.txt] xbmc -> kodi + + [h.udo] + * [rebrand][ps3_remote.py] xbmc -> kodi + + [h.udo] + * [rebrand][OSX Credits.html] xbmc -> kodi + + [h.udo] + * [rebrand][German keyboardmap.xml] xbmc -> kodi + + [Rainer Hochecker] + * DXVA: add HD4xxx to ati work-around, only capable of opening a single decoder at a given time + + [fritsch] + * IMX: Announce EGL_QUIRK_RECREATE_DISPLAY_ON_CREATE_WINDOW to fix refreshrate change + + [fritsch] + * EGL: Add Quirk for display recreation + + [wolfgar] + * Revert to software decoding for AVC profile 578 as it is not handled by imx6 VPU + + [host505] + * [keyboardlayout] Add Greek QWERTY + + [uNiversaI] + * [confluence] [confluence] minor cosmetic to codec info background + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + + [ronie] + * [Confluence] cosmetics + + [Tobias Markus] + * Check return value + + [Tobias Markus] + * cppcheck performance fixes in addons/ + + [ace20022] + * [Fix] Fix a memory leak in PlayerSelectionRule.cpp. + + [Martijn Kaijser] + * [keyboard] only use English names for layouts + + [ace20022] + * [Fix] Fix a memory leak in Setting.cpp. + + [Matthias Kortstiege] + * [art] fix missing container art for album paths + + [davilla] + * FIX: [aml;pivos] Fix 1080 on MX + + [ronie] + * [Confluence] remove addon ratings + + [Rainer Hochecker] + * DXVA: add HD5xxx to ati work-around, only capable of opening a single time + + [Rainer Hochecker] + * dvdplayer: make sure overlay container is cleared when player stops + + [t4-ravenbird] + * woa - use profile path + + [Matthias Kortstiege] + * [gui] bump gui version to 5.4.0 + + [Matthias Kortstiege] + * [infomanager] nuke old container art infolabels + + [Martijn Kaijser] + * [skin] fix weather layout re-touched + + [Matthias Kortstiege] + * [art] add container art to music paths + + [Matthias Kortstiege] + * [art] tvshow season art not set correctly when item list was flattened + + [Matthias Kortstiege] + * [infomanager] adds container.art + + [Martijn Kaijser] + * [addons] sync with repo + + [Martijn Kaijser] + * [skin] update re-touched + + [Rainer Hochecker] + * DXVA: add HD4xxx to ati work-around, only capable of opening a single decoder at a given time + + [Dr-Romantic] + * [keyboardlayout] add Arabic layout. + + [Thomas Amland] + * [addons] display a more helpful message on python errors + + [anaconda] + * Fix resume on multi-episode files if no resume point is set. + + [fritsch] + * BaseRender: Allow 1px wrong in aspect ratio to not do completeley refit the image + + [h.udo] + * [rebrand][confluence sounds.xml] xbmc -> kodi + [h.udo] + * [rebrand][Json-RPC schema] xbmc -> kodi - [Martijn Kaijser] - * bump to 16.1 release + [h.udo] + * [rebrand][Linux FEH_py.in] xbmc -> kodi - [DaveTBlake] - * Fix song reported on playback of songs from cuesheet + [h.udo] + * [rebrand][Win32BuildSetup readme.txt] xbmc -> kodi - [HerbFargus] - * Add xboxdrv name for xbox keymap + [h.udo] + * [rebrand][ps3_remote.py] xbmc -> kodi - [anaconda] - * videoinfotag: fix typo introduced in e6e2d0ace5cfe6191b8f7727ced1747854254ce4 + [h.udo] + * [rebrand][OSX Credits.html] xbmc -> kodi + + [h.udo] + * [rebrand][German keyboardmap.xml] xbmc -> kodi + + [montellese] + * media library: fix path history for items with a real path differing from the requested path + + [Memphiz] + * [tests/osx] - add unit tests for aliasshortcut resolving + + [Memphiz] + * [osx] - add method for creating an alias shortcut (used for unit testing) + + [Memphiz] + * [osx] - replace alias / shortcut handling with non deprecated functions (fixes non working alias resolving since osx 10.10 yosemite) + + [Memphiz] + * [osx] - move alias/shortcut translation code to darwinhelpers + + [Karlson2k] + * [android] [vfs] PosixFile: fix large file support on Android [Chris "Koying" Browet] - * FIX: [droid] cap refresh rates when probing, too + * FIX: [droid] make python PIL module working + + [Chris "Koying" Browet] + * FIX: [droid;python] proper handling of module libraries + + [Chris "Koying" Browet] + * FIX: [droid;packaging] handle addons libraries + + [Matthias Kortstiege] + * [mediawindow] remove unused function OnFinalizeFileItems + + [Matthias Kortstiege] + * [infomanager] added Container(id).CurrentItem + + [montellese] + * win32: add nopvraddons and nobinaryaddons options to BuildSetup.bat + + [montellese] + * win32: fix indentations in BuildSetup.bat + + [Martin van Beurden] + * [win32] remove redundant /MP compiler option in release builds. + + [Martin van Beurden] + * [win32] git_revision custombuild trigger from existing file, set correct outputpath, remove non existing dependency. + + [Martin van Beurden] + * [win32] remove non-existing header files from project files + + [montellese] + * webserver: refactor IsAuthenticated() + + [montellese] + * webserver: silence warning + + [montellese] + * webserver: use defines for HTTP header fields and values + + [montellese] + * webserver: handle Cache-Control: no-cache and Pragma: no-cache + + [montellese] + * webserver: add Cache-Control HTTP header to cacheable responses + + [montellese] + * webserver: add support for If-Unmodified-Since HTTP header + + [montellese] + * webserver: cosmetic refactoring + + + [fritsch] + * IMX: Announce EGL_QUIRK_RECREATE_DISPLAY_ON_CREATE_WINDOW to fix refreshrate change + + [fritsch] + * EGL: Add Quirk for display recreation + + [host505] + * [keyboardlayout] Add Greek QWERTY + + [wolfgar] + * [imx6] Revert to software decoding for AVC profile 578 as it is not handled by imx6 VPU + + [Thomas Amland] + * [videoinfoscanner] fix multipath scanning - [txtranslation] - * [lang] updated language files from Transifex [Martijn Kaijser] - * bump to 16.1 rc3 + * fix wrong values in version.txt after 15.0a1 bump - [Anton Fedchin] - * [RenderSystemDX] Fix possible segfault after ba2ff03 + [Lars Op den Kamp] + * Revert "Disable extra logging by default" [Rainer Hochecker] - * VDPAU: fix flushing mixer + * dvdplayer: allow skipping streaminfo only for mpegts streams + + [Rainer Hochecker] + * Revert "rename xbmc folder to src" + + [Rainer Hochecker] + * Revert "change xbmc/ path to src/ in all files" - [Martijn Kaijser] - * update re-Touched skin + + [Fneufneu] + * change xbmc/ path to src/ in all files + + [Fneufneu] + * rename xbmc folder to src [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + * Set version to development version 15.0 alpha1 and change splash screen + + [uNiversaI] + * [confluence] minor cosmetic to codec info background [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + * [addons] sync with repo - [Thomas Amland] - * never cache addons directories + [Rainer Hochecker] + * dvdplayer: ffmpeg decoder - initialize codec control flags, fixes thumbnail extraction which does not set those members [Chris "Koying" Browet] - * FIX: [droid] disable libcec - - [Achim Turan] - * [cmake][addons] Use an absolute path for ADDON_SRC_PREFIX + * FIX: [aml] properly handle rotation - [txtranslation] - * [lang] updated language files from Transifex + [Rainer Hochecker] + * dvdplayer: double number of frames to try for thumbnails - [S. Davilla] - * [darwin/WebServer] - fixed crash under json. double thread stack size for libmicrohttpd for osx/ios [fritsch] - * AndroidStorageProvide: Ignore /mnt/runtime + * VAAPI: Take more care when probing filters - [Thomas Amland] - * AndroidStorageProvider: avoid calling Exists from PumpDriveChangeEvents + [phate89] + * [metadata.tvdb.com] updated to version 1.7.0 - [Anton Fedchin] - * [WinSystemWin32DX] Avoid unneeded resize buffers when minimized in FSE mode. - [Anton Fedchin] - * [RenderSystemDX] Force 23.976fps mode before switch to stereoscopic 3D mode. + [Sam Stenvall] + * [pvr] bump addons (fixes #15598) - [Anton Fedchin] - * [RenderSystemDX] fixup: re-create swap chain in mono if switching to stereoscopic 3D mode fails. + [Memphiz] + * [AE/CA/osx] - cosmetics - make comment generic - [Anton Fedchin] - * [RenderSystemDX] Avoid resize buffers twice when transition from windows to FSE mode. + [Memphiz] + * [AE/CA/osx] - fillup the stream with up to 16 unknown channels fixes support for studio audio devices with more then 8 unused/unknown channels in one stream - [Anton Fedchin] - * [RenderSystemDX] use two buffers in FSEX. + [Memphiz] + * [AE] - extend the number of unknown channels from 8 to 16 - [Anton Fedchin] - * [RenderSystemDX] Added workaround to create device on a default adapter if it wasn't detected previously. + [Tarulia] + * [keymap] Make XB360 DPads consistent - [Anton Fedchin] - * [WinRenderer] Re-work color shader. try to fix wrong colors on some hardware. + [MilhouseVH] + * [rebrand] Cosmetic #2 - apply Kodi label to CPU stat - [Anton Fedchin] - * [WinRenderer] speed up a bit configuring renderer. - [Bernd Kuhls] - * [Jarvis] partly backport of PR 9231 to fix segfault - [Kai Sommerfeld] - * [EPG] Guide Window: 20% performance gain on open + [txtranslation] + * [lang] update of skin.confluence language files [txtranslation] - * [lang] updated language files from Transifex + * [lang] update of core language files - [ace20022] - * [android] Add missing libgif.so to the package. + [txtranslation] + * [lang] update of internal addon language files - [Alwin Esch] - * [adsp] fix kodi frezze if no add-on present + [MilhouseVH] + * [rebrand] Cosmetic + + [oldnemesis] + * Fixed memory allocation; not enough memory was allocated + + + [h.udo] + * [system colors.xml] correct wrong colors and spelling + + [Matthias Kortstiege] + * [infomanager] fix missing seekoffset label when seeking chapters + + [wsnipex] + * [linux] fix building libxbmc.so + + [xhaggi] + * [pvr] adds parental lock check to PlayMedia() + + [xhaggi] + * [pvr] fix built-in PlayMedia with PVR channels and recordings (Trac #15164) [Martijn Kaijser] - * bump to 16.1rc2 + * [language] fix incorrect strings - [Kai Sommerfeld] - * [EPG] Fix lockup when entering epg grid (endless loop) - [Anton Fedchin] - * [dx11] Fixed possible crash when living hardware stereo mode. + [Martijn Kaijser] + * [language] fix incorrect strings - [Anton Fedchin] - * [dxva] fixed possible issue with dxva rendering (wrong hue/gamma) + [h.udo] + * [system colors.xml] Remove whitespace - [Anton Fedchin] - * [win32] memcpy_sse2: fixed crash in corner case. + [Karlson2k] + * [win32] WIN32Util::PowerManagement: fix restart on Win8.1 - [Chris "Koying" Browet] - * FIX: [longpress] do not eat keypress after a longpress + [txtranslation] + * [lang] added missing langinfo.xml files for new languages - [Tolriq] - * EventServer security fix. + [Martijn Kaijser] + * [addons] sync with repo - [arnova] - * changed: Ignore chapters for large step if there's only one + [Thomas Amland] + * fix wrong video content type on empty tvshow title - [arnova] - * fixed: Screensaver would lockup Kodi when stopping on slow systems + [h.udo] + * [CONTRIBUTING.md] Update to Kodi links - [Anton Fedchin] - * [VideoPlayer] WinRenderer: fix render capure when dxva render method is used. + [h.udo] + * [README.md] Update to Kodi links - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi dtor avahi thread termination. + [dhead666] + * [pvr] bump addons - [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + [Thomas Amland] + * [rebrand] new linux icons - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [Rainer Hochecker] + * dvdplayer: defer release of ffmpeg hw decoder after next decode, deleting a hw decoder in GetFormat can result in a crash for dxva - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [h.udo] + * [rebrand][osx] new icons [h.udo] - * [LoadVideoSettings] Don't leak credentials + * [rebrand][upnp] new icons - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [hudokkow] + * [rebrand][web interface] new favicon.ico - [txtranslation] - * [lang] updated language files from Transifex + [h.udo] + * [rebrand][atv2] new AppIcon.png + + [h.udo] + * [rebrand][ios] new icons + + [h.udo] + * [rebrand][android] new icons + + [h.udo] + * [rebrand][win] new application.ico + + [Chris "Koying" Browet] + * FIX: [droid] fix launching leanback only apps + + [Chainfire] + * fix playback getting progressively slower and memory filling up until crash + + [ronie] + * replace webserver logo + + [fritsch] + * VAAPI: Let untested drivers use vaapi via advanced setting [Rainer Hochecker] - * dxva2: fix segfault + * dvdplayer: fix audio/l16 for ffmpeg demuxer, format cannot be probed [Rainer Hochecker] - * vaapi: fix segfault + * fix getting charset from http header, incorrect usage of constructor for string - [Martijn Kaijser] - * Bump to 16.1rc1 + [Rainer Hochecker] + * CCurlFile: allow getting full content type + [Chris "Koying" Browet] + * FIX: [amc] bail out on null hint size - [DaveTBlake] - * Fix song reported on playback of songs from cuesheet + [Alex Deryskyba] + * [aml] Do not disable keyboard auto-repeat for Meson6 and higher - [anaconda] - * videoinfotag: fix typo introduced in e6e2d0ace5cfe6191b8f7727ced1747854254ce4 + [Rainer Hochecker] + * paplayer: drop broken PCM codec, use ffmpeg instead + + [Memphiz] + * [input/linux] - map KEY_BACK to xbmckey backspace - same like we do for android (key back as found on the wetek remote sends KEY_BACK keycode which is not mapped on linux and so isn't usable in openelec on that box) [Chris "Koying" Browet] - * FIX: [droid] cap refresh rates when probing, too + * FIX: [amc] if omx returns w/h, use it - [txtranslation] - * [lang] updated language files from Transifex + [Chris "Koying" Browet] + * FIX: [amc] trap exception when mime is unsupported + + [Chris "Koying" Browet] + * FIX: [amc] log exceptions + + [Chris "Koying" Browet] + * FIX: [mediacodec] more exception checking + + [Chris "Koying" Browet] + * FIX: [mediacodec] handle aspect ratio + + [Chris "Koying" Browet] + * FIX: [mediacodec] prevent crash if 'createByCodecName' throws an exception (omx.rk) + + [Karlson2k] + * Update PIL package to prevent crash with some addons + + [Chris "Koying" Browet] + * FIX: [droid;aml] fix preview scaling [Martijn Kaijser] - * bump to 16.1 rc3 + * [release] bump to 14.0 rc3 + + + [Martijn Kaijser] + * [skin] update re-touched skin - [Anton Fedchin] - * [RenderSystemDX] Fix possible segfault after ba2ff03 + + [Matthias Kortstiege] + * [art] use correct art type when appending art to item lists + + [Tarulia] + * [keymap] Add support for XBOX One Controller for PC + + [xhaggi] + * [cosmetics] fix indentation + + [xhaggi] + * [pvr] fix: separate sort orders for each directory in recordings window [Rainer Hochecker] - * VDPAU: fix flushing mixer + * dvdplayer: demuxer ffmpeg - do not create streams until having seen pat/pmt for pvr [Martijn Kaijser] - * update re-Touched skin + * [skin] update re-touched skin - [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + [fastcolors] + * [osx] new application icons + + [Memphiz] + * Revert "[airplay] - merge the binary plist and xml plist pathes in airplay (which already diverged) by using libplist for parsing in both cases - not only the binary case" + + [xhaggi] + * [epg] fix selecting channel if given index is smaller than channel offset + + [xhaggi] + * [pvr] use getter/setter instead of directly access m_selectedItemPaths + + [uNiversaI] + * [audioencoders] bump to their latest master + + + [perexis] + * Fixed Polish translation of "%s of %s available" [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + * [release] bump to 14.0 rc2 + + [Sam Stenvall] + * [keymap] fix guide button for kernel-based mceusb remotes (closes #15374) + + [Rainer Hochecker] + * ffmpeg: bump to 2.4.4 + + + [txtranslation] + * [lang] rename Tamil to Tamil (India) as this is the actual translated language at Transifex + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [popcornmix] + * [omxplayer] Fix precedence in deinterlace resolution check + + [Sam Stenvall] + * [pvr] don't update the item list path before calling Update(), otherwise the history will be incorrectly recorded since the the history expects m_vecItems->GetPath() to be the "old" path, not the new one + + [montellese] + * fix content settings not being properly evaluated/stored + + + [popcornmix] + * FIX: actually disable omxplayer if software is selected + + [xhaggi] + * [pvr] do not restart the PVR manager on wake, only trigger updates + + [xhaggi] + * [gui] temp fix to reset m_guiState with the right file item list + + [xhaggi] + * [pvr] fix: select the first item if we don't have a stored last selected item path + + [Sam Stenvall] + * [pvr] bump addons - [Thomas Amland] - * never cache addons directories [Chris "Koying" Browet] - * FIX: [droid] disable libcec + * FIX: actually disable hardware decoders if sotware is selected + + + [montellese] + * platinum: add patch for 2104093 + + [montellese] + * platinum: fix filter mask values of xbmc:votes and xbmc:artwork + + [montellese] + * jsonrpc: fix Files.GetDirectory not returning artistid, albumid and genreid for smartplaylists + + [uNiversaI] + * [keyboardlayout] add Hungarian QWERTZ + + [xhaggi] + * [pvr] removes Timer and Guide item from root directory listing + + [xhaggi] + * [pvr] fix: remove slash at the end of the base path + + [xhaggi] + * [pvr] fix creation of item paths for root (pvr://) directory + + [xhaggi] + * [pvr] fix creation of an illegal group path in GetGroupList() + + [arnova] + * changed: Don't perform wait-on-data if position is in our old cache + + [arnova] + * changed: Modify rate calculation to obtain a proper average with heavy seeking/cache swapping + + [Martijn Kaijser] + * [release] bump to 14.0 rc1 + + + [montellese] + * fix content dialog settings not being properly reset + + [wolfgar] + * [imx6] Fix VP8 timestamping + + [montellese] + * [rebrand] android: log to logcat with "Kodi" prefix instead of "XBMC" + + [montellese] + * [rebrand] replace XBMC with Kodi in the UPnP server's HTTP agent string + + [Rainer Hochecker] + * dvdplayer: fix ff for higher speeds - [Achim Turan] - * [cmake][addons] Use an absolute path for ADDON_SRC_PREFIX + [montellese] + * jsonrpc: fix Player.GetItem for PVR channels not providing extended details like plot, genre etc. - [txtranslation] - * [lang] updated language files from Transifex + [anaconda] + * Fix off-by-1 errors in saving video settings when in a playlists. - [S. Davilla] - * [darwin/WebServer] - fixed crash under json. double thread stack size for libmicrohttpd for osx/ios - [fritsch] - * AndroidStorageProvide: Ignore /mnt/runtime + [Martijn Kaijser] + * [win32] Update installer text to be more clear about taken actions. Also set artwork for un-installer pages - [Thomas Amland] - * AndroidStorageProvider: avoid calling Exists from PumpDriveChangeEvents + [uNiversaI] + * [rebrand] web interface rename XBMC -. Kodi - [Anton Fedchin] - * [WinSystemWin32DX] Avoid unneeded resize buffers when minimized in FSE mode. + [Martijn Kaijser] + * shorten the wiki migration url - [Anton Fedchin] - * [RenderSystemDX] Force 23.976fps mode before switch to stereoscopic 3D mode. + [Chris "Koying" Browet] + * fixup aml no video: video lost after resume - [Anton Fedchin] - * [RenderSystemDX] fixup: re-create swap chain in mono if switching to stereoscopic 3D mode fails. + [Memphiz] + * [depends] - add boblight to depends but don't install it (used for compiling the needed libboblight binary for the boblight addon) - seems this was lost since frodo ... - [Anton Fedchin] - * [RenderSystemDX] Avoid resize buffers twice when transition from windows to FSE mode. + [Martijn Kaijser] + * [win32] Make sure we copy the userdata from the build into the $INSTDIR/userdata". Since we only use the userdata from $APPDATE/${APP_NAME}/userdata/ or portable_data it's safe to wipe $INSTDIR/userdata. - [Anton Fedchin] - * [RenderSystemDX] use two buffers in FSEX. + [Martijn Kaijser] + * [win32] remove modelines_template.xml and kodi.log from installer package - [Anton Fedchin] - * [RenderSystemDX] Added workaround to create device on a default adapter if it wasn't detected previously. + [Rainer Hochecker] + * Revert "gl: multipass renderer would use wrong source pixels sizes" - [Anton Fedchin] - * [WinRenderer] Re-work color shader. try to fix wrong colors on some hardware. + [wsnipex] + * fix: [linux] include ffmpeg tarball in mk-debian-package.sh - [Anton Fedchin] - * [WinRenderer] speed up a bit configuring renderer. + [Matthias Kortstiege] + * [infomanager] container.pluginname returns an empty string (fixes #15566) - [Bernd Kuhls] - * [Jarvis] partly backport of PR 9231 to fix segfault + [ace20022] + * [pvr][cleanup] Return 'bRetrun' instead of 'true'. cppcheck message: Variable 'bReturn' is assigned a value that is never used. - [Kai Sommerfeld] - * [EPG] Guide Window: 20% performance gain on open + [fritsch] + * Revert "linux: Check for Logind first, then *Kit-s with UPower when detecting PM framework" - [txtranslation] - * [lang] updated language files from Transifex + [xhaggi] + * [pvr] always use last played group as current group on startup - [ace20022] - * [android] Add missing libgif.so to the package. + [xhaggi] + * [pvr] re-init pvr manager on wake up - [Alwin Esch] - * [adsp] fix kodi frezze if no add-on present + [fritsch] + * VAAPI: Print driver vendor string (including version) when opening context - [Martijn Kaijser] - * bump to 16.1rc2 + [Karlson2k] + * [win32] [vfs] Win32SMBFile::Stat(): fix wrong error code check - [Kai Sommerfeld] - * [EPG] Fix lockup when entering epg grid (endless loop) + [Rainer Hochecker] + * Revert "smb: eliminate unused while loop in OpenDir" - [Anton Fedchin] - * [dx11] Fixed possible crash when living hardware stereo mode. + [Karlson2k] + * [emufnc] Disable support for READ_TRUNCATED. To be reverted after Helix release. - [Anton Fedchin] - * [dxva] fixed possible issue with dxva rendering (wrong hue/gamma) + [Memphiz] + * [libdvdread] - add patch for fixing partial reads in file_read - also upstreamed for inclusion - patch by karlson2k - [Anton Fedchin] - * [win32] memcpy_sse2: fixed crash in corner case. + [Memphiz] + * [libdvdread] - fix partial reads in file_read - fixes iso playback on ios (which doesn't use libdvdcss and therefore hits this bug) [Chris "Koying" Browet] - * FIX: [longpress] do not eat keypress after a longpress + * FIX: [droid] aarch64 is always neon-enabled - [Tolriq] - * EventServer security fix. + [Chris "Koying" Browet] + * FIX: [sqlite] fix sqlite when built in 32bits and executed on 64bits - [arnova] - * changed: Ignore chapters for large step if there's only one + [Rainer Hochecker] + * dvdplayer: demux ffmpeg - fix seeking behind eof - [arnova] - * fixed: Screensaver would lockup Kodi when stopping on slow systems - [Anton Fedchin] - * [VideoPlayer] WinRenderer: fix render capure when dxva render method is used. - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi dtor avahi thread termination. + [Thomas Amland] + * Revert "jobs: fixed segmentation fault when thumbnail loader abort" [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + * [libdvdread] - fix out of bound access when playing some iso files - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [Martijn Kaijser] + * [release] bump to 14.0 beta5 - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [Chris "Koying" Browet] + * FIX: [aml] no video on newer aml sdk - [h.udo] - * [LoadVideoSettings] Don't leak credentials - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Memphiz] + * [osx/packaging] - premade .DS_Store which works for /Volumes/Kodi - [txtranslation] - * [lang] updated language files from Transifex + [Memphiz] + * [osx/packaging] - ensure that our dmg is always mounted with a static name (/Volumes/Kodi in our case) - else the prepared .DS_Store won't work and we don't get the background image and icon position - [Rainer Hochecker] - * dxva2: fix segfault + [Memphiz] + * [gitignore] - add VolumeIcon.icns to gitignore - [Rainer Hochecker] - * vaapi: fix segfault + [Martijn Kaijser] + * [addons] sync with repo [Martijn Kaijser] - * Bump to 16.1rc1 + * [skin] update re-touched with new Kodi logo + [Kai Sommerfeld] + * [cec] Fixed PeripheralCecAdapter application exit code handling. Introduced new field "exitcode" for "OnQuit" message (@pdf). - [DaveTBlake] - * Fix song reported on playback of songs from cuesheet + [montellese] + * infomanager: fix calls to GetInt() without a valid file item (same as in GetBool()) - [anaconda] - * videoinfotag: fix typo introduced in e6e2d0ace5cfe6191b8f7727ced1747854254ce4 - [Chris "Koying" Browet] - * FIX: [droid] cap refresh rates when probing, too + [da-anda] + * [android][ouya] added launcher icon - [txtranslation] - * [lang] updated language files from Transifex + [da-anda] + * [rebrand][visualization.vortex] remove XBMCrain preset and logo - [Martijn Kaijser] - * bump to 16.1 rc3 + [da-anda] + * [rebrand][addons] new addon icons - [Anton Fedchin] - * [RenderSystemDX] Fix possible segfault after ba2ff03 + [da-anda] + * [rebrand][confluence] new logo + [da-anda] + * [rebrand] new splash - [Rainer Hochecker] - * VDPAU: fix flushing mixer + [Memphiz] + * [osx] - new DSStore template for the dmg folder (uses the new background and has properly aligned icons) - [Martijn Kaijser] - * update re-Touched skin + [Memphiz] + * [osx/packaging] - generate the volumeicon.icns in the packaging script and fixup some pathes - remove some unneeded checks and do a sanity clean of the rw dmg during packaging - [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + [da-anda] + * [rebrand][osx] new DMG volume icon and background artwork - [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + [da-anda] + * [rebrand][osx] new app icon - [Thomas Amland] - * never cache addons directories + [da-anda] + * [rebrand][atv] new icons - [Chris "Koying" Browet] - * FIX: [droid] disable libcec + [da-anda] + * [rebrand][ios] new icons with iOS8 support - [Achim Turan] - * [cmake][addons] Use an absolute path for ADDON_SRC_PREFIX + [da-anda] + * [android] add Android-TV banner - [txtranslation] - * [lang] updated language files from Transifex + [da-anda] + * [rebrand][android] new icons - [S. Davilla] - * [darwin/WebServer] - fixed crash under json. double thread stack size for libmicrohttpd for osx/ios + [da-anda] + * [rebrand][linux - [fritsch] - * AndroidStorageProvide: Ignore /mnt/runtime + [da-anda] + * [rebrand][win32] new installer artwork - [Thomas Amland] - * AndroidStorageProvider: avoid calling Exists from PumpDriveChangeEvents + [da-anda] + * [rebrand][win] new app icon - [Anton Fedchin] - * [WinSystemWin32DX] Avoid unneeded resize buffers when minimized in FSE mode. + [fritsch] + * IMX6: Add VerifyGLState() to render to help debugging - [Anton Fedchin] - * [RenderSystemDX] Force 23.976fps mode before switch to stereoscopic 3D mode. + [Memphiz] + * [osx] - re-enable yadif deinterlacer on osx - [Anton Fedchin] - * [RenderSystemDX] fixup: re-create swap chain in mono if switching to stereoscopic 3D mode fails. + [fritsch] + * IMX6: Use correct Method for deletion - [Anton Fedchin] - * [RenderSystemDX] Avoid resize buffers twice when transition from windows to FSE mode. + [Chris "Koying" Browet] + * FIX: [droid] adjust splash layout - [Anton Fedchin] - * [RenderSystemDX] use two buffers in FSEX. + [Chris "Koying" Browet] + * CHG: [rebrand;droid] adjust progressbar colors - [Anton Fedchin] - * [RenderSystemDX] Added workaround to create device on a default adapter if it wasn't detected previously. + [montellese] + * infomanager: fix calls to GetInt() without a valid file item (same as in GetBool()) - [Anton Fedchin] - * [WinRenderer] Re-work color shader. try to fix wrong colors on some hardware. + [Voyager1] + * re enable manually add to library (reverted from commit ce447e622ddbc65019797edb533d3c507b945b91) - [Anton Fedchin] - * [WinRenderer] speed up a bit configuring renderer. + [Voyager1] + * [rebrand][win] new app icon (reverted from commit 53bc14946e46b6e97a965dd3da5d6fbcf9cbcdbf) - [Bernd Kuhls] - * [Jarvis] partly backport of PR 9231 to fix segfault + [Voyager1] + * [rebrand][linux - [Kai Sommerfeld] - * [EPG] Guide Window: 20% performance gain on open + [Voyager1] + * [rebrand][android] new icons (reverted from commit 73195e349303cf88ecbd83c0d683d39d6efac52e) - [txtranslation] - * [lang] updated language files from Transifex + [Voyager1] + * [rebrand][ios] new icons with iOS8 support (reverted from commit feedab2c2a3b88b5c9c3b910dd69b8be24d7408d) - [ace20022] - * [android] Add missing libgif.so to the package. + [Voyager1] + * [rebrand][osx] new icons and installer background (reverted from commit 92cbadcd53e13edb8384ab5f474f34f58f0cfebd) - [Alwin Esch] - * [adsp] fix kodi frezze if no add-on present + [Voyager1] + * [rebrand][atv] new icons (reverted from commit 9d00bbd19b99c474fd981305f6b6e123256bbea0) - [Martijn Kaijser] - * bump to 16.1rc2 + [Voyager1] + * [rebrand][win32] new installer artwork (reverted from commit b208d62a6e07d41cdf98a59e838b27e2006d2534) - [Tolriq] - * EventServer security fix. + [Voyager1] + * [rebrand] new splash (reverted from commit 133439d8a6cf38d2de2b28579bb6938995d43cf7) + [Voyager1] + * [WIP][android] add Android TV banners (reverted from commit 18738a4337eebeeeea6ae4ea5a414f1705e6ce6a) - [Martijn Kaijser] - * bump to 16.1rc2 + [Voyager1] + * [rebrand][confluence] new logo (reverted from commit 1f93dbe97a557fad616a311cb4f293b7277c1007) - [Kai Sommerfeld] - * [EPG] Fix lockup when entering epg grid (endless loop) + [Voyager1] + * [rebrand][addons] new addon icons (reverted from commit 16f57541a6ed02a9e387a4df04d00edb023341fb) - [Anton Fedchin] - * [dx11] Fixed possible crash when living hardware stereo mode. + [Voyager1] + * [rebrand][visualization.vortex] remove XBMCrain preset and logo (reverted from commit 4cb1f72481840251441c49f687a7d13189aa8b73) - [Anton Fedchin] - * [dxva] fixed possible issue with dxva rendering (wrong hue/gamma) + [Voyager1] + * [WIP][rebrand][osx] dynamically create VolumeIcon.icns and move packaging related artwork to the central folder for this (reverted from commit 2a9f21e0f24a08b708a54051842f29bba5e3c205) - [Anton Fedchin] - * [win32] memcpy_sse2: fixed crash in corner case. + [da-anda] + * [WIP][rebrand][osx] dynamically create VolumeIcon.icns and move packaging related artwork to the central folder for this - [Chris "Koying" Browet] - * FIX: [longpress] do not eat keypress after a longpress + [da-anda] + * [rebrand][visualization.vortex] remove XBMCrain preset and logo - [arnova] - * changed: Ignore chapters for large step if there's only one + [da-anda] + * [rebrand][addons] new addon icons - [arnova] - * fixed: Screensaver would lockup Kodi when stopping on slow systems + [da-anda] + * [rebrand][confluence] new logo - [Anton Fedchin] - * [VideoPlayer] WinRenderer: fix render capure when dxva render method is used. + [da-anda] + * [WIP][android] add Android TV banners - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi dtor avahi thread termination. + [da-anda] + * [rebrand] new splash - [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + [da-anda] + * [rebrand][win32] new installer artwork - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [da-anda] + * [rebrand][atv] new icons - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [da-anda] + * [rebrand][osx] new icons and installer background - [h.udo] - * [LoadVideoSettings] Don't leak credentials + [da-anda] + * [rebrand][ios] new icons with iOS8 support - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [da-anda] + * [rebrand][android] new icons - [txtranslation] - * [lang] updated language files from Transifex + [da-anda] + * [rebrand][linux - [Rainer Hochecker] - * dxva2: fix segfault + [da-anda] + * [rebrand][win] new app icon - [Rainer Hochecker] - * vaapi: fix segfault + [Voyager1] + * re enable manually add to library [Martijn Kaijser] - * Bump to 16.1rc1 - + * [release] bump to 14.0 beta4 - [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + [Martijn Kaijser] + * [repo] change repo URLs to use mirrors.kodi.tv - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [arnova] + * fixed: Typo in variable name - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [arnova] + * fixed: Calling WaitForData with a large minimum could cause it to block the max. timeout - [h.udo] - * [LoadVideoSettings] Don't leak credentials + [arnova] + * changed: Use m_StateInput else dvdplayer osd info is 8 seconds delayed - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [arnova] + * fixed: Don't keep reading source when cache is full (fixes #15500) - [txtranslation] - * [lang] updated language files from Transifex + [arnova] + * fixed: FileCache-full logic was wrong + implement GetMaxWriteSize() function - [Rainer Hochecker] - * dxva2: fix segfault + [arnova] + * changed: Rename confusing CSimpleDoubleCache class to CDoubleCache - [Rainer Hochecker] - * vaapi: fix segfault + [montellese] + * musicdb: fix conflicting "singles" filter option introduced by 9fbf13eded5d682d4ae210043e536895c9356c18 (fixes #15539) - [Martijn Kaijser] - * Bump to 16.1rc1 + [popcornmix] + * [omxplayer] Fix for EAC3 passthrough + [popcornmix] + * [omxplayer] Don't sync up to passthrough audio packets - let GPU handle it - [Martijn Kaijser] - * update banner + [popcornmix] + * [omxplayer] Fix for out of sync after trickplay - [Martijn Kaijser] - * fix splashs screen + [anaconda] + * Add mk3d to video extensions and enable double cache + [Rainer Hochecker] + * dvdplayer: call UpdateClockMaster in regular intervals, state of videorefclock may change - [Martijn Kaijser] - * [addons] sync with repo + [Karlson2k] + * SysInfo: show CPU frequency as "XXXX MHz" instead of "XXXX,00MHz" - [ace20022] - * [cximage] Stop reading if an error was reported. + [wsnipex] + * [depends] ffmpeg: define make threads if number of cpu cores detection fails - [ace20022] - * [fix][cximage] Stop reading if an error was reported, since the data was freed already. + [Memphiz] + * [jenkins] - refactor jenkins scripts to centralise the decision for rebuilding depends - add project/cmake dir as criterion - [ace20022] - * [fix][cximage] Set row_pointers to null after deletion. This fixes a crash. + [h.udo] + * [Keyboard Layouts] Add Polish QWERTY - [Alex Ling] - * Fixed less than optimal number of decoding threads on some Android devices + [Rainer Hochecker] + * dvdplayer: update dropping stats after every call to decode - [kekePower] - * Update RssFeeds.xml + [Joakim Plate] + * copy: support chunked reads so that CFile internal buffer is eliminated - [Martijn Kaijser] - * bump to 16.0 Jarvis final + [Arne Morten Kvarving] + * fixed: quell printf format warnings - [Martijn Kaijser] - * bump to 16.0rc4 + [Joakim Plate] + * vda: only allow ffmpeg VDA when advanced setting enable it - [DaveTBlake] - * Fix GetSongsFullByWhere to work around SQLite query optimiser bug that makes left join on views very slow + [Memphiz] + * [AE/CA] - fix regression introduced in the enumeration refactor - handle "hackintosh" audio devices with "digital" in the name as digital devices [Memphiz] - * [VideoRenderer] - fix video rotation due to orientation hint - added scaling for not cutting video content + * [AE/CA] - constify getName of CADevice - [Anton Fedchin] - * [win32] WinRenderer: Fixed rotated videos. + [ace20022] + * [Fix] Manually activated subs, if classified as irrelevant, were not shown on resume. This is fixed by saving the subtitle's index upon manual activation. - [Anton Fedchin] - * [win32] Fixed convolution-6x6_d3d.fx shader. + [wsnipex] + * [linux] systemd-coredumpctl was renamed to coredumpctl, support both in kodi.sh - [Kai Sommerfeld] - * [PVR] PVR Windows: Only the active window must update the shared slected item path. + [Andriy Prystupa] + * fixed compilation error with undefined ARRAY_SIZE - [fritsch] - * FFmpeg: Use 2.8.6-Jarvis-16.0 + [Joakim Plate] + * gl: multipass renderer was broken when RECT textures was used as source - [fritsch] - * Revert "FFmpeg: Bump to 2.8.6-Jarvis-16.1" + [Joakim Plate] + * gl: multipass renderer would use wrong source pixels sizes - [Martijn Kaijser] - * [addons] sync with repo + [Joakim Plate] + * ffmpeg: if a second GetFormat dis-allow hwaccel, we must restore ffmpeg - [fritsch] - * FFmpeg: Bump to 2.8.6-Jarvis-16.1 + [Joakim Plate] + * vda: upgrade to hwaccel2 interface - [Erik Kessler] - * Fix Xbox controller crash on Windows. #16279 + [Joakim Plate] + * vda: if no image is returned, we must still reset cv_buffer - [anaconda] - * [lang/settings] Fix ADSP labels. + [Joakim Plate] + * vda: allow 3 render buffers - [Adrian Moennich] - * Check for .nomedia file inside tv show folders + [Memphiz] + * [ffmpeg/vda] - update for current used ffmpeg (2.2) + [Joakim Plate] + * vda: switch cvref rendering over to standard UYVY422 renderer - [Chris "koying" Browet] - * FIX: [longpress] do not repeat long presses + [Joakim Plate] + * vda: allocate pot texture if requested - [h.udo] - * [Jarvis] Add travic-ci badge to README.md + [Joakim Plate] + * vda: use IOSurfaceGetPixelformat instead of CVPixelBufferGetPixelFormatType - [h.udo] - * [Jarvis] Add travis linux support + [Joakim Plate] + * vda: cvref textures are non power of two so don't allocate extra space - [Martijn Kaijser] - * fix French AZERTY keyboard layout + [Joakim Plate] + * vda: fix chroma issue with vda upload [anaconda] - * CGUIListContainer: reset scroller position too on GUI_MSG_LABEL_RESET. + * Fix "Current fanart" not being shown in DialogVideoInfo. - [MilhouseVH] - * [mysql]: Fix limited songs query after #9005 - [Martijn Kaijser] - * [TexturePacker][gif] The Graphic Control Extension is optional. + [Karlson2k] + * [win32] CPUInfo: fix CPU frequency wrongly count in GHz instead of MHz, fixes #15555 - [1977David] - * Create french keyboardlayout + [Sam Stenvall] + * fix namespace typo - [popcornmix] - * mmalrender: Reject unsupported render formats + [Karlson2k] + * [win32] Update python package to 2.7.8 - [Arnold Neugebauer Zweikeks] - * [aml] fix trac 16515 + [Matthias Kortstiege] + * [videoinfoscanner] do not consider optical file paths as valid subpaths [Thomas Amland] - * [addons] show install notification for local version + * [videoinfoscanner] fix infinite loop - [Stanislav Vlasic] - * FIX Android: On newer kernels neon cpu feature is represented as asimd - [DaveTBlake] - * Fix GetSongsFullByWhere to use left join (some songs do not have artists) and apply count limit to just songs + [Joakim Plate] + * jobs: fixed segmentation fault when thumbnail loader abort - [ronie] - * fix radio channels background + [Martijn Kaijser] + * [skin] update re-touched - [Anton Fedchin] - * [dx11] Fix: Properly handle DXGI_STATUS_OCCLUDED status, previous method may cause overflow in dirty regions stack when desktop was locked for long time. + [ronie] + * [confluence] add 'hide broken' button - [DaveTBlake] - * Add missing MOOD tag scanning for FLAC/Ogg/Xiph/Vorbis, ASF and MP4/iTunes like other file formats + [ronie] + * [lang] add 'hide broken' string [Martijn Kaijser] - * bump to 16.0rc3 - - [Voyager1] - * [DVD] fix invisible menu overlays when corrected pts becomes negative after discontinuities - - [Voyager1] - * [DVD] fix invisible buttons by delay checking for invalid menu buttons until after the player received them from the demuxer + * [addons] do show broken/incompatible add-ons that are still installed at this moment so users can un-install them without using the toggle. This makes the hide broken option only toggle non-installed broken/compatible add-ons. - [Voyager1] - * fix multi-part stack selection of correct part + [Sam Stenvall] + * Revert "[pvr] Fix recording history (last directory not selected)" - [Kai Sommerfeld] - * [PVR] Guide window: EPG grid: now even works if none of the available channels has EPG data (fixes trac#16548). + [montellese] + * library: don't remove the source if the user has changed his mind + [Thomas Amland] + * [python] add all installed modules to path when addon info is unavailable - [Kai Sommerfeld] - * [PVR] Guide/Search/channel window: Do not add 'Record' if backend does not support timers. + [Martijn Kaijser] + * [pydocs] cosmetic fix on line ending - [Kai Sommerfeld] - * [PVR] Timer window: Show error box if 'Add timer' is selected and PVR backend does not support timers (fixes trac#16539) + [Thomas Amland] + * [addons] add toggle for hiding broken addons. hide by default - [Memphiz] - * Revert "fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5" + [ace20022] + * [Fix][win32] Discs that were present at start are not removed from views when ejecting them. - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Sam Stenvall] + * [gui] update the view state's list reference before the view state is consulted about whether the "go to parent" item should be added to the list - [txtranslation] - * [lang] updated language files from Transifex + [Sam Stenvall] + * [pvr] don't update the item list path before calling Update(), otherwise the history will be incorrectly recorded since the the history expects m_vecItems->GetPath() to be the "old" path, not the new one - [fritsch] - * ActiveAE: Increase timeout for sink init to 60 seconds + [Memphiz] + * [vfs/Pipe] - fix premature close of pipe. It should only be closed if refcount is zero [montellese] - * [profiles] don't save skin settings on master profile when it was only loaded to switch between two other profiles + * music library: add the possibility to clean the database in the background - [Martijn Kaijser] - * bump to 16.0rc2 - - - [Chris "Koying" Browet] - * FIX: [longpress] fixes ghost repeat + [montellese] + * video library: add the possibility to clean the database in the background - [Rechi] - * fix crashing if music is scanning and application gets stopped + [t4-ravenbird] + * dont abort if wait for net fails - [ronie] - * [re-touched] final update for jarvis - [Thomas Amland] - * [filesystem] handle resource paths as file paths + [Memphiz] + * [jenkins/darwin] - ensure that audioencoder addons are not removed from tree during cleanup (same like with pvr addons before) - fixed missing audioencoder addons in nightlies. - [Martijn Kaijser] - * ignore default select action on scripts - fixes #16516 + [Karlson2k] + * [emufnc] return exact '-1' instead of other negative values in dll_read() and dll_write() - [Kai Sommerfeld] - * Jarvis binary addons now taken from repo-binary-addons Jarvis branch + [Karlson2k] + * [emufnc] fix possible compiler warning - [Rainer Hochecker] - * VideoPlayer: allow dts of video streams to jump bach more up to 500ms - if those streams have no dts, dts equals pts + [Karlson2k] + * libdvdcss: add custom patches as files to lib/libdvd/patches/ - [fritsch] - * FFmpeg: Bump to 2.8.5-Jarvis-rc1 + [ace20022] + * [Fix] Reading zero bytes from a file should yield zero read bytes. Fix for 52800a1fa28cd6f9b843b55cfb40820fae2bc9d3. - [Kai Sommerfeld] - * [EPG] CGUIEPGGridContainer::UpdateItem: Fix m_item 'use after free' and invalid cursors, offsets. + [Karlson2k] + * libdvdcss: better handle partial read in libc_read - [phil65] - * [guiinfo] content type fix for addon browser + [Sam Stenvall] + * [pvr] move ActionDeleteRecording to GUIWindowPVRRecordings - [Martijn Kaijser] - * sync scrapers with repo + [Sam Stenvall] + * [pvr] go back to the parent folder when the last recording inside a subdirectory is deleted - [Martijn Kaijser] - * bump to 16.0rc1 + [Sam Stenvall] + * [pvr] hopefully fix the folder watched overlay once and for all. We now start out by assuming all folders are watched, then as we encounter unwatched recordings we remember those folders and unmark them at the end of the method - [Tolriq] - * Fix Http server default port on all platforms Use 8080 from default settings.xml Keep previous default value if webserver is activated + [Sam Stenvall] + * [pvr] always update metadata (i.e. play count) for items, not just the first time an item from that particular folder is encountered - [Kai Sommerfeld] - * [PVR] Fix 'dancing' OSD progress bar while switching channels. + [Sam Stenvall] + * [pvr] fixed folder watched icon appearing only after the folder had been entered once - [ronie] - * fix Container.SortOrder infolabel + [Sam Stenvall] + * [pvr] fix bug where the selected item didn't change to the next one after an item has been marked as watched/unwatched + [Sam Stenvall] + * [pvr] fix marking recordings as watched or unwatched (fixes #15118) - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [popcornmix] + * MMAL: Use Component Logging v2 - [txtranslation] - * [lang] updated language files from Transifex + [Joakim Plate] + * smb: eliminate unused while loop in OpenDir - [ronie] - * fix Container.SortOrder infolabel + [Joakim Plate] + * url: share name should always be updated - [DaveTBlake] - * Prevent "Scan to library" appearing on context menu for "Add music" item of music file view + [Joakim Plate] + * smb: make sure we deinit samba before global destructor - [ace20022] - * [tools][win32] Bump texturepacker to version 1.0.5. + [Joakim Plate] + * smb: use utility function to convert time_t to local file time - [ace20022] - * [gif][depends] Bump static and dynamic gif lib to 5.1.1. + [Joakim Plate] + * smb: drop old (unused) purge code - [ace20022] - * [tools][texturepacker] Fix gif decoding and packaging . + [Joakim Plate] + * smb: factor out stat to __stat64 conversion - [arnova] - * fixed: Our dir cache should always ignore url (protocol) options (fixes #16469) + [Joakim Plate] + * smb: eliminate smb.Init() calls in non static functions - [Kai Sommerfeld] - * [PVR] Fix ACTION_CHANNEL_[UP + [Joakim Plate] + * smb: drop try/catch of exceptions from C api - [ace20022] - * [gif] Fall back to DISPOSAL_UNSPECIFIED if no valid disposal method is specified. + [Joakim Plate] + * smb: don't add : for empty password - [ace20022] - * [TextureManager] Fix possible invalid pointer deletion. + [Joakim Plate] + * smb: set workgroup using standard api - [Voyager1] - * [dxva] since deinterlace options are disabled, don't use them + [Joakim Plate] + * Revert "[vfs] [posix] SMBFile: fix reading files opened with READ_TRUNCATED flag" - [ace20022] - * [gif] Add more version #ifdefs. + [Memphiz] + * [osx] - mark removable shares which are either have DVD or CD media in it as SOURCE_TYPE_DVD so the audio cd rip context menu is visible for it - [ace20022] - * [gif] The number of loops is stored as 2x uint8_t. + [Memphiz] + * [vtb/vda] - use component debug logging [ace20022] - * [gif] Fix for version < 5: delay and transparent are stored as uint8_t. + * [dvdplayer] Remove superfluous cast. Since 923baa83e091bbf80159b8aff523915ec0af824a m_SpeedState.lasttime is a int64_t. - [ace20022] - * [gif] Redact filenames in gif log output. + [fritsch] + * IMX: Use Component Logging - [ace20022] - * [gif] Try to skip erroneous frames instead of giving up immediately. + [fritsch] + * VDPAU: Component Logging - [ace20022] - * [gif] Be more tolerant if the first frame has the disposal method DISPOSE_PREVIOUS. + [fritsch] + * VAAPI: Use Component Logging - [ronie] - * [Confluence] fix size & position of mirrored image + [xhaggi] + * [pvr] fix update of groups and overriding group properties we only store locally - [Memphiz] - * [FileBrowser] - fixed credential disclosure when adding network locations + [xhaggi] + * [pvr] persist channel group after updated from client - [Anton Fedchin] - * [win32] memcpy_sse2: Fixed possible heap corruption if chroma width is not 16 aligned. + [Karlson2k] + * [emufnc] Fix: use correct return value on error in dll_flsbuf, flush file buffers, properly write data - [Dave Blake] - * Revert "Fix cached folders JSON playlist play item failure" + [Karlson2k] + * [emufnc] Fix: use correct return value on error in dll_filbuf, try to restore proper file pointer - [phil65] - * [guilib] properly set content types in music section + [Karlson2k] + * [emufnc] Use proper macro instead of hardcoded value in dll_ungetc() - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Karlson2k] + * [emufnc] Fixes: correctly emulate on bigendian platforms, use cast to _unsigned_ char in dll_fputc() - [txtranslation] - * [lang] updated language files from Transifex + [Karlson2k] + * [emufnc] Fix: return correct value in dll_fclose() - [xhaggi] - * [confluence][fix] get rid of view (ID: 51) in pvr channel window which cause issues with viewtypes + [Karlson2k] + * [emufnc] Fix: always read all data in dll_fwrite() - [t4-ravenbird] - * [bugfix] fast startup fail to execute wakeup + [Karlson2k] + * [emufnc] Fix: always read all data in dll_fread() - [DaveTBlake] - * Ensure FileExists is called with a file name, rather than a URL. Options on the end of the string causes file not to be found in cache when present. + [Karlson2k] + * [emufnc] Fix: return zero for dll_fread()/dll_fwrite() if size or count is zero - [xhaggi] - * [fix][pvr] prevent numeric dialog from being opened if python modal is present + [Karlson2k] + * [emufnc] Fix: "-1" is incorrect return value for dll_fwrite() and dll_fread() (return type is size_t) - [Anton Fedchin] - * [WinRenderer] Added support of rotated videos. + [Karlson2k] + * [emufnc] dll_write(): set errno if write() failed - [Anton Fedchin] - * [WinRenderer] Added workaround to fix an issue with color range on some hardware which doesn't support color range conversion or whose drivers are crappy. Now we're using same technique for color range conversion which is used in UI instead of using video processor. + [Karlson2k] + * [emufnc] dll_read(): set errno if read() failed - [xhaggi] - * [fix][pvr] don't populate hidden groups over json-rpc + [Karlson2k] + * [vfs] CFile: workaround in Read() and Write() for VFSes that do not support null buffer pointer - [xhaggi] - * [fix][pvr] m_gridIndex array index out of bound + [Karlson2k] + * [vfs] [win32] Win32File: better handle partially read/written buffer in Read()/Write() - [Kai Sommerfeld] - * [EPG] Fix 'GoToNow' to select the currently active epg event of selected channel. + [Karlson2k] + * [vfs] [win32] Win32File: really support "test" Read() and Write() with zero buffer size - [Kolja Lampe] - * Disable ratings button for plugins + [Karlson2k] + * libdvdcss: fix position after partial read in libc_read - [xhaggi] - * [fix][pvr] wrong group if channel switched by its internal id - [ronie] - * fix duplicate key mapping [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + * [lang] update of skin.confluence language files [txtranslation] - * [lang] updated language files from Transifex + * [lang] update of core language files - [fritsch] - * FFmpeg: Bump to 2.8.4-Jarvis-rc1-mp3 - - [Stefan Saraev] - * [udevprovider] browse disk dialog is not wanted for blu-rays + [txtranslation] + * [lang] update of internal addon language files - [Rainer Hochecker] - * [pvr] - fix selecting a channel by id via json-rpc + [Martijn Kaijser] + * show correct dialog header text for master lock code. fixes #15543 [montellese] - * [jsonrpc] CEpgInfoTag: fix serialization of "runtime" as an integer (in minutes) instead of as a string + * fix queuing of songs starting playback if something is already playing (fixes #15545) - [Chris "Koying" Browet] - * FIX: [droid] handle video rotation + [Martijn Kaijser] + * [release] bump to 14.0 beta3 - [jun.jiang] - * Fix compile error on msvs2013 - [jun.jiang] - * Fix assertion fail in Cutil::GetExternalStreamDetailsFromFilename + [xbmc] + * fix incorrect display of fps when dr kicks in - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [popcornmix] + * [ResamplePi] Add support for formats that need shifting [txtranslation] - * [lang] updated language files from Transifex + * [lang] fix invalid or wrong language names to be in sync with Transifex - [DaveTBlake] - * Allow for item separator in ARTISTS and ALBUMARTISTS tags. + [Sam Stenvall] + * [pvr] add missing call to parent's OnPrepareFileItems() - [Kai Sommerfeld] - * [PVR] Fix: Abort of active recordings must be possible even if associated timer is read-only + [popcornmix] + * [mmalrenderer] Add choice of 4 deinterlace schemes - [Ned Scott] - * Correct numeric input for newer PVR windows + [Memphiz] + * [darwin] - fix flicker in sysinfo - querying gateway via pipe needs a sleep - [Kai Sommerfeld] - * [keymaps] remote.xml: virtualkeyboard,numericinput: back now maps to 'back', not 'backspace' anymore + [Sam Stenvall] + * [epg] rename GetCurrentTime() to avoid naming collision with Windows-specific macro - [fritsch] - * FFmpeg: Bump to 2.8.4-Jarvis-rc1 + [uNiversaI] + * [cosmetics] minor spacing in readme - [Kolja Lampe] - * Prevent taglib from crashing kodi + [Frank Razenberg] + * [buttontranslator] don't copy windowmap for lookups - [Kolja Lampe] - * Select previously selected values in userratings selectdialogs + [Frank Razenberg] + * [buttontranslator] fix keymap overrides not working - [DaveTBlake] - * Fix Playlist.Getitems returning empty artist array by spltting artist desc string at separator. + [Martijn Kaijser] + * [skin] update reTouched git sha - [Max Kellermann] - * epg/EpgContainer: fix deadlock bug in LoadFromDB() + [Rainer Hochecker] + * fix string for component logging video - [Max Kellermann] - * pvr: fix a bunch of deadlock bugs + [Arne Morten Kvarving] + * AESinkPULSE: Rebrand pulseaudio sink name to reflect kodi - [Max Kellermann] - * pvr/PVRManager: make m_pvrWindowIds "const" + [Karlson2k] + * DVDVideoCodecLibMpeg2: fix broken check for memory allocation Thanks @fritsch and @Uukrull - [Max Kellermann] - * GUIWindowManager: protect m_idCache with g_graphicsContext + [Rainer Hochecker] + * AE: always request float from sink when in fixed mode, fixes unwanted re-init of sink - [Ned Scott] - * Remove some long-presses and some notes cleanup + [Roman Miroshnychenko] + * Ukr and Rus language fixes - [Joel Teichroeb] - * Use two full size members instead of using a static array as a union + [Rainer Hochecker] + * videorefclock: use videosync DRM on AMD systems - [Martijn Kaijser] - * fix forced subtitle selection after abc184c + [Sam Stenvall] + * [pvr] bump addons - [Max Kellermann] - * GUIWindowPVRBase: protect m_selectedItemPaths + [xbmc] + * player: fix rewind - [Max Kellermann] - * GUIWindowPVRBase: use array instead of std::map + [fritsch] + * (Coverity) AudioEngine: Cosmetics and member initialization ActiveAEBuffer - [Arne Morten Kvarving] - * fix ffmpeg logging credentials + [fritsch] + * (Coverity) VideoCodecs: Remove unused method pts_itod() - [Stefan Saraev] - * [udevprovider] handle 'change' events only for optical drives + [fritsch] + * (Coverity) iso9660: make sure to initialize m_paths to 0 as it's used by Reset() - [xhaggi] - * [pvr][fix] fix initial selection of channel item in guide window + [fritsch] + * (Coverity) Skin: properly initialize m_effectsSlowDown - [xhaggi] - * [pvr][fix] empty-check to prevent empty pathes in m_selectedItemPaths + [fritsch] + * (Coverity) DVDPlayerVideo: Remove assignment of bRequestDrop which is never read - [montellese] - * fix saving of skin settings when switching profiles (fixes #16203) + [anaconda] + * [builtins/jsonrpc] Invert default for showing dialogs after 5324. - [montellese] - * cosmetics: fix log messages about tag in skin settings + [Rainer Hochecker] + * dvdplayer: vaapi, vdpau - implement codec control flags - [ronie] - * [Confluence] reduce padding on dialog buttons + [Rainer Hochecker] + * dvdplayer: fix dts correction, again - [fritsch] - * FFMpeg: Bump to 2.8.4-Jarvis-beta4 + [Memphiz] + * [osx] - add callback when the input.appleremotealwayson setting is changed ("allow startup of kodi via remote") - to instantly install/deinstall the launchagent -> needed for manual migration path from xbmc to kodi - [h.udo] - * [PVR] CDVDInputStreamPVRManager: Don't leak credentials + [Memphiz] + * [XBMCHelper] - small refactor - move the launchagent installation/deinstallation out into its own method - [Martijn Kaijser] - * bump to 16.0 beta 5 + [Memphiz] + * [XBMCHelper] - change to only build i386 and adapt output dir to match the one where the binary was in our tree before... - [Martijn Kaijser] - * [strings] fix typos + [Memphiz] + * [osx] - remove XBMCHelper binary from tree - [Achim Turan] - * [Win32File] Fix invalid assert expression + [popcornmix] + * [omxplayer] Add option to choose omxplayer/dvdplayer automatically - [MilhouseVH] - * [mysql] Querying optimizer_switch needs to be non-fatal [backport] + [wsnipex] + * [rtmp] add canseek and drop unused rtmp options + [Joakim Plate] + * osx: fixed detect of latest sdk after yosemite - [Martijn Kaijser] - * bump to 16.0 beta 5 + [Rainer Hochecker] + * dvdplayer: fix app exit caused by creating teletext while thread is running already - [Thomas Amland] - * [addons] fix download location for multi directory repositories + [Michał Kępień] + * Handle BlueZ 5.x play/pause evdev scancodes - [wsnipex] - * [configure] make sure the top kodi src dir is always in INCLUDES + [Rainer Hochecker] + * dvdplayer: videocodec ffmpeg - fix timestamps and colorspace - [Martijn Kaijser] - * [pvr] fix missing header label on clean EPG + [xbmc] + * dvdplayer: allow rewinding at end of stream, do a seek after rewind - [ronie] - * don't use cached results for dir checks + [xbmc] + * dvdplayer: avoid short screen flicker caused by unnecessary reconfigure of renderer - [Chris "koying" Browet] - * FIX: [droid;input] regression after stylus fix + [Karlson2k] + * cc_decoder: suppress printing to stderr and stdout - [Chris "koying" Browet] - * CHG: [droid] remove unecessary dyloads + [Karlson2k] + * CueDocument: replace call of isdigit() with StringUtils::isasciidigit() - [Kai Sommerfeld] - * [confluence] String fix 'Timer' => 'Timers' + [Karlson2k] + * ActiveAEResample::Init: transform to 64bit before shift - [ronie] - * [Confluence] fix sidemenu nowplaying buttons + [Karlson2k] + * XMLUtils::GetHex: check result of sscanf() - [Kai Sommerfeld] - * [PVR, json-rpc] Fix Input.Select for PVR fullscreen windows + [Karlson2k] + * AEChannelInfo::BestMatch: fix use boolean in arithmetics - [Kai Sommerfeld] - * [PVR] Fix ghost timers in epg window. + [Karlson2k] + * GUIWindowTestPatternDX::DrawCheckers: check input parameters - [DaveTBlake] - * Override default setting for albumartistonly flag when already set in musicURL, so can be used by custom nodes. + [Karlson2k] + * [win32] AESinkDirectSound: check result of GetStatus() - [DaveTBlake] - * Stop scraping album data from overriding tag artist data even when override tag setting is disabled. + [Karlson2k] + * ElementText: replace 'char *' with 'std::string' - [ronie] - * fix logging of failed dependency + [Karlson2k] + * Fixes: remove large buffers from stack - [Max Kellermann] - * VideoPlayer/VAAPI: fix use-after-free bug in Release() + [Karlson2k] + * Fixes: wrong log strings - [Max Kellermann] - * Epg: fix buffer overflow in GetLastScanTime() + [Karlson2k] + * Fixes: checks for buffer overrun - [Chris "Koying" Browet] - * REVERT: [droid] leave MPEG2 h/w decoded; VOB playback is niche + [Karlson2k] + * Fixes: don't use uninitialized vars - [Achim Turan] - * [adsp] ADSP addon get enabled status fix + [Karlson2k] + * Fixes: check for NULL pointers before dereference - [Stefan Saraev] - * [music] fix leaking credentials in logs + [Karlson2k] + * Fixes: check results of memory allocation functions - [Stefan Saraev] - * [texturecache] fix leaking credentials in logs + [Rainer Hochecker] + * add component logging for video - [ronie] - * fix python version + [Chris "Koying" Browet] + * FIX: must return true after setting update - [ronie] - * update guilib api to 5.10.0 + [Memphiz] + * [vtb] - fix - use the correct bit for signaling the hw decoder to drop a frame. This is the bit which is visible in the now public ios 8 headers of vtb. I doubt that apple ever change this till ios4. If they did - we are screwed on older runtimes. At least on ios6 this bit is valid for sure. - [Martijn Kaijser] - * [pvr] fix incorrect string usage after combining multiple strings + [hudokkow] + * [Keyboard layouts] Add Portuguese QWERTY - [Martijn Kaijser] - * bump to 16.0 beta 4 + [Thomas Amland] + * fix uninitialized variable + [Thomas Amland] + * remove unused variable - [Chris "Koying" Browet] - * FIX: [amcs] no brightness/contrast for mediacodec(S) + [Thomas Amland] + * [xml] 'action' type setting should not require 'id' attribute - [Matus Kral] - * [TextureCache] fix log leaking username/pass + [popcornmix] + * [curl] Avoid busy spinning when socket timeout is too low - [Martijn Kaijser] - * [repo] bump repo version + [foo86] + * [rbp] Enable optimization on Raspberry Pi - [Martijn Kaijser] - * [addons] sync with repo + [Frank Razenberg] + * [keymap] Recreate SDL2 compatible PS3 dualshock keymap, converted from the 360 one - [Thomas Amland] - * [addons] dont invalidate art for addons that are new or not updated since last fetch + [Matthias Kortstiege] + * [vaapi] fix missing break in switch - [Rainer Hochecker] - * VideoPlayer: fix false positive vfr detection + [Matthias Kortstiege] + * [rendermanager] fix possible null ptr dereference in CXBMCRenderManager::GetOptimalBufferSize() - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Matthias Kortstiege] + * [nfsfile] fix arg type mismatch - [Danilo Krummrich] - * android: fix event source evaluation + [Matthias Kortstiege] + * [cpuinfo] fix possible divide-by-zero - [phil65] - * [Confluence] - fix navigation for SideBar NowPlaying controls + [Matthias Kortstiege] + * [paplayer] fix possible resource leak in QueueNextFileEx - [wsnipex] - * [cmake] fix package-addon (zip) target on linux + [Matthias Kortstiege] + * [settings] fix possible null ptr dereference in CGUIDialogSettingsBase::SetupControls - [un1versal] - * fix strings after #8180 + [Matthias Kortstiege] + * [pvr] fix uninitialized members in CPVRGUIInfo constructor - [DaveTBlake] - * Fix missing disc number when in file view. As song.iTrack holds both disc and track numbers, SetSong needs to set both. + [Matthias Kortstiege] + * [pvr] fix possible resource leak in channels osd dialog - [phil65] - * [GUI] remove "Add source" from MyPrograms section + [Matthias Kortstiege] + * [skininfo] fix uninitialized members in CSkinsInfo constructor - [Martijn Kaijser] - * [strings] fix typo + [Balint Reczey] + * linux: Check for Logind first, then *Kit-s with UPower when detecting PM framework - [Avdienko Mikhail] - * Fix DPMS detection for X11 without GLX + [Thomas Amland] + * log when RunAddon is called with invalid addon id/type and no addon will be started - [ace20022] - * [osx][XBMCHelper] Comparison of a boolean with an integer. + [Thomas Amland] + * RunScript: execute even if addon isn't a script type addon - [ace20022] - * [PowerManager] Possible leak in public function. The pointer 'm_instance' is not deallocated before it is allocated. + [phate89] + * Use "system.playlistspath" setting instead of default library one in CFileUtils - [ace20022] - * [AMLUtils] Suspicious use of ; at the end of 'if' statement. + [Kai Sommerfeld] + * [PVR] Changed EpgInfoTag::[IsActive - [ace20022] - * [SMBFile] Invalid number of character '(' when these macros are defined: 'TARGET_POSIX'. + [Stanislav Vlasic] + * [AMLCodec] Add support for panel display output + + [Brandon McAnsh] + * DVDVideoCodecAmlogic: Remove throttling of MPEG2 playback - [txtranslation] - * [lang] bump major version of the en_GB language-addon [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + * [lang] update of skin.confluence language files [txtranslation] - * [lang] updated language files from Transifex + * [lang] update of core language files [txtranslation] - * [lang] automatic syntax corrections for the en_GB language file + * [lang] update of internal addon language files - [DaveTBlake] - * Set FileItem from MusicInfoTag rather than create new and lose artwork in CPlayerOperations::GetItem. This now similar to how video handled. + [Rainer Hochecker] + * renderer: use 3 render buffers for sw decoding, restores bahavior after 71f50d3677409a3ba3f8533daae105e6e0366a1 - [ace20022] - * [GUIWindowManager] Clarify calculation precedence for '&' and '?'. + [Rainer Hochecker] + * [infomanager] only update a/v info if something has changed and only by main thread - [ace20022] - * [GUIFontTTF] Clarify calculation precedence for '&' and '?'. + [txtranslation] + * [lang] update of skin.confluence language files - [ace20022] - * [guiaction] Set retval to true instead of + [txtranslation] + * [lang] update of core language files - [Thomas Amland] - * adjust repository addon to use gzipped addons.xml + [txtranslation] + * [lang] update of internal addon language files - [Thomas Amland] - * [addons] add support for pre-gzipped addons.xml in repositories + [Tobias Arrskog] + * Disable extra logging by default - [montellese] - * [events] fix removal of events (fixes #16403) + [Mettbrot] + * Add German QWERTZ to keyboard layouts - [Matthias Kortstiege] - * [touch/filemanager] - workaround for the non-working touch input in the filemanager window + [fritsch] + * AESinkALSA: Allow fragmentation, e.g. even multiply of PeriodSize - [Thomas Amland] - * add utility for decompressing gzip + [Rudi] + * AESinkALSA: Set correct value for AES3 when using HBR mode - [HitcherUK] - * [skin.confluence] Fix main menu player controls + [montellese] + * binary addons: fix dependency handling for dependencies - [Martijn Kaijser] - * [string] fix c/p mistake + [Rainer Hochecker] + * videorefclock: fix clock speed for D3D after refactoring - [Martijn Kaijser] - * [strings] fix incorrect setting description + [fritsch] + * AESinkProfiler: Goodbye my love goodbye - [Kolja Lampe] - * Fix content types for video. Library paths should not get "files" content type. + [fritsch] + * AE: Fix some coverity warnings - [Kolja Lampe] - * Fix content types for music. Root and source pathes should not get "files" content type. Also improved playlists handling and added addon handling. + [fritsch] + * AESinkPULSE: Fix Coverity suggestions - [Achim Turan] - * [adsp] Remove unused newRegistration variable during addon registration method + [xbmc] + * videoplayer: update frametime, it might change due to fps detection - [Alwin Esch] - * [adsp] fix wrong function error check on database + [xbmc] + * video player: present correct pts to user for a/v sync (after buffering in renderer) - [fritsch] - * ffmpeg: Bump to 2.8.3-Jarvis-beta3 + [xbmc] + * videoplayer: adapt lateness detection and dropping to buffering - [Alwin Esch] - * [adsp] fix crash and frezzes during add-on load - [Alwin Esch] - * [adsp] cleanup system start way + [ronie] + * [Confluence] add new default icons [ronie] - * [gui] drop video/music overlay dialogs leftover part III + * add missing default icons - [Kai Sommerfeld] - * [PVR] Timer update: Fix handling of timers with 'start at any time' - [Chris Browet] - * FIX: [aml] avoid decoder being deadlocked + [Memphiz] + * [ios] - get the resolution clamp for > 720p material back in place - the assumption that retina devices have enough power was wrong - [h.udo] - * [addons] Fix wrong text on failed add-on install - [Jan Holthuis] - * [AMLCodec] Use libamcodec.so if libamplayer.so is missing + [Rainer Hochecker] + * Revert "[infomanager] only call UpdateAVInfo when really needed" - [Jan Holthuis] - * [AMLCodec] Remove dependency on amffmpeg and use libavutil instead + [Matthias Kortstiege] + * [logging] stop log spam introduced with ba34a62 - [Jan Holthuis] - * [AMLCodec] Remove unused methods/members from DllLibAmCodec/am_private_t + [fritsch] + * GUIInfoManager: Proper minimalstest locking for UpdateAVInfo - [Jan Holthuis] - * [AMLCodec] Remove unreachable code in set_header_info() + [Matthias Kortstiege] + * [infomanager] only call UpdateAVInfo when really needed - [Chris "koying" Browet] - * FIX: [aml] smarter capabilities detection + [Martijn Kaijser] + * [release] bump to 14.0 beta2 - [Chris "koying" Browet] - * CHG: [aml] drop device-specific hacks - [Chris "koying" Browet] - * CHG: [aml] remove cpufreq hacks + [Martijn Kaijser] + * [win32] fix typo in NSIS installer creation - [Jian Wang] - * PD#113872:First kodi 15.2 version for amlogic + [Karlson2k] + * [vfs] [posix] SMBFile::Write() remove unneeded cast - [John Rennie] - * The Info action is not useful in an addon + [Karlson2k] + * [vfs] [posix] SMBFile::GetLength() return correct values on errors - [Leonard Harms] - * time sometimes moves backwards coming up from base libraries + [Karlson2k] + * [vfs] [posix] SMBFile::GetPosition() return correct values on errors - [Memphiz] - * [webserver] - fixed possible directory traversal bug due to insufficient url checking + [Karlson2k] + * [vfs] [posix] SMBFile: fix reading files opened with READ_TRUNCATED flag - [MilhouseVH] - * [MySQL] Restore pre-5.7.6 query optimizer behaviour when required + [arnova] + * changed: m_iCurrentPts is NOT an int but a double - [Chris "koying" Browet] - * FIX: allow to delete a default key binding + [arnova] + * fixed: Chapter skipping was broken due to improper current pts updating (thanks FernetMenta for the pointer). Fixes ticket #14535 - [MilhouseVH] - * [MySQL] Disable ONLY_FULL_GROUP_BY per session + [Rainer Hochecker] + * ffmpeg: bump to version 2.4.3 - [metaron] - * [PVR] Mark Created groups as Loaded on Persist + [montellese] + * fix CApplicationMessenger::SendText() not sending the text to the proper edit control - [Kolja Lampe] - * Coverity fix check return value (CID 1224459) + [Thomas Amland] + * fix segfault when calling StopScript builtin with no parameters - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719190) + [Matthias Kortstiege] + * [NfoFile] fix empty video details for multipart episodes - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719189) + [Karlson2k] + * [vfs] [posix] SMBFile: fix Read() with zero size and null buffer - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719187) + [anaconda] + * [videodb] Keep empty series if hideemptyseries=true - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719219 & CID 719220) + [phate89] + * Honor "ignorethewhensorting" when jumping to letter - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719221) + [anaconda] + * [videodb] Fix deleting bookmarks from dialog for add-ons. - [Kolja Lampe] - * [music] Listeners should not be able to hold a negative value + [Chris "Koying" Browet] + * FIX: [droid] allow to build without debugging and pickup jenkins configuration - [metaron] - * [PVR] Context Menu Crash Fix - [Kai Sommerfeld] - * [PVR] Ensure that newly added channel groups are persisted, fixes trac 16365 + [ronie] + * [Cosmetics] reserve window id's for skins - [Chris "koying" Browet] - * FIX: [droid] always handle media keys... + [Memphiz] + * [jenkins] - when trying to determine the branchname of a detached head revision - filter it so only branches from the currently built GITHUB_REPO are used (else we might pick the wrong branchname from another repo which was checked out before and contains the same revision) - [DaveTBlake] - * Archive artistDesc and albumArtistDesc otherwise artist names not shown when album list loaded from cache. + [Fice] + * [UPnP] rebrand our Media Server/Renderer - [ace20022] - * [guilib] Fix gif animations in case of a too large gif. + [Fice] + * [Docs] fixup urls to kodi.tv - [Chris "Koying" Browet] - * FIX: [droid] ignore power button + [ronie] + * [Confluence] fix last day of daily weather forecast - [Chris "Koying" Browet] - * FIX: [droid;keys] handle F-keys + [Kai Sommerfeld] + * [CEC] Added support for CEC buttons introduced by HDMI 1.4 - CONTENTS_MENU - ROOT_MENU - TOP_MENU - DVD-MENU (Requires at least libcec 2.2.0) - [ronie] - * [Confluence] fix button alignment - fixes trac #16382 + [Philipp Te] + * removed redundant value conditions from variables - [MilhouseVH] - * [dbwrapers] Include database name in error message - [ronie] - * [re-touched] skin update + [wsnipex] + * use correct app name in the linux desktop file (fixes #15524) - [Thomas Amland] - * [gui] show an ok dialog instead of the addon update dialog when there are no versions available + [Martijn Kaijser] + * Update GPL license XBMC -> Kodi - [ronie] - * [Confluence] disallow program addons selection + [Rainer Hochecker] + * dvdplayer: exclude blurays from fast anylyzinh mpegts streams - [metaron] - * [PVR] Fix for blank Currently In Prog Recordings + [Memphiz] + * [rebrand] - change default username of webserver from xbmc to kodi - [txtranslation] - * [lang] correct wrong (duplicated) numeric ID + [montellese] + * settings: fix combination of updated settings and default value handling - [Martijn Kaijser] - * bump to 16.0 beta3 + [popcornmix] + * [AE] Allow resampler to indicate when it has too much data buffered - [metaron] - * [PVR] Fix Timer Status UI inconsistencies + [popcornmix] + * [omxplayer] Remove unused function - [Stephan Raue] - * [keyboard.xml] add KEY_CONFIG keymapping (config) + [arnova] + * changed: For web servers returning filenames with & encoding (e.g. Apache) transcode into %-URL encoding. Fixes #15365 - [Stephan Raue] - * [LinuxInputDevices] add KEY_SELECT support (return) + [Karlson2k] + * Change APP_HOME -> KODI_HOME and other APP_* -> KODI_* - [Stephan Raue] - * [LinuxInputDevices] add KEY_FILE support (launch_file_browser) + [arnova] + * fixed: For DAV files we should first get filename then URL decode else files like test;.avi fail - [Stephan Raue] - * [LinuxInputDevices] add KEY_SEARCH support (browser_search) + [arnova] + * fixed: ConvertHTMLToW didn't properly handle &#x encoding - [Stephan Raue] - * [LinuxInputDevices] add KEY_MAIL support (launch_mail) - [Stephan Raue] - * [keyboard.xml] add KEY_HOMEPAGE keymapping (Home) + [Martijn Kaijser] + * Update GPL license XBMC -> Kodi - [Stephan Raue] - * [keyboard.xml] add KEY_RED,KEY_GREEN,KEY_YELLOW,KEY_BLUE keymapping (colored buttons) + [Martijn Kaijser] + * [release] also bump version in configure.in - [Stephan Raue] - * [keyboard.xml] add KEY_FAVORITES keymapping (Favorites) + [uNiversaI] + * xbmc -> left over - [Stephan Raue] - * [keyboard.xml] add KEY_TEXT keymapping (Text) + [montellese] + * Revert "media library: add UPnP servers to sources://" - [Stephan Raue] - * [keyboard.xml] add KEY_ZOOM keymapping (Zoom) + [montellese] + * Revert "upnp: fire an update source message when a UPnP server becomes available/unavailable" - [Stephan Raue] - * [mouse.xml] add right click keymapping (Info) + [yanniks] + * [linux/ubuntu] update README files - [Stephan Raue] - * [keyboard.xml] add ALT+F4 keymapping (Exit) + [Rainer Hochecker] + * dvdplayer: exclude blurays from fast anylyzinh mpegts streams - [Stephan Raue] - * [keyboard.xml] add CTRL+R keymapping (Record) + [Memphiz] + * [rebrand] - change default username of webserver from xbmc to kodi - [anaconda] - * builtins: fix Container.Refresh after ac870b64b16dfd0fc2bd0496c14529cf6d563f41. + [montellese] + * settings: fix combination of updated settings and default value handling - [wsnipex] - * redact filenames in smbfile log output + [popcornmix] + * [AE] Allow resampler to indicate when it has too much data buffered - [sportica] - * Fix codepage problem to input Korean properly. + [popcornmix] + * [omxplayer] Remove unused function - [Thomas Amland] - * [addons] fix pausing of repository updates during foreground playback + [Sam Stenvall] + * [pvr] fix deleting recording folders - [Thomas Amland] - * allow CTimer to be restarted asynchronously + [arnova] + * changed: For web servers returning filenames with & encoding (e.g. Apache) transcode into %-URL encoding. Fixes #15365 - [Anton Fedchin] - * [win32] RenderingSystemDX::OnDeviceReset() - fire OnResetDevice event also if new device was created. + [Karlson2k] + * Change APP_HOME -> KODI_HOME and other APP_* -> KODI_* - [Pär Björklund] - * Re-add the openssl hack, was never mean't to be removed without adding a proper fix + [arnova] + * fixed: For DAV files we should first get filename then URL decode else files like test;.avi fail - [Martijn Kaijser] - * [win32] Windows has no GL any more so setting negate is obsolete + [arnova] + * fixed: ConvertHTMLToW didn't properly handle &#x encoding [Martijn Kaijser] - * [droid] Don't show option "sync playback to display" as it's not supported on Android - - [Kolja Lampe] - * [music] When adding a new music directory, ask the user if he wants to scan it + * [release] bump to 14.0 beta1 - [metaron] - * [PVR] Prevent broken Timers being 'Next Recording' [ronie] - * remove broken musicvideos scraper + * nuke presetlist action. fixes #15518 - [BtbN] - * AE Pulse: Ignore volume changes on corked sinks + [Rainer Hochecker] + * videorefclock: fix potential segfault on systems which do not support video sync - [Glenn-1990] - * [PVR] prevent empty timer settings with integers + [Memphiz] + * [ios] - replace the launch images holding the XBMC logo with plain black images (as those aren't shown on most devices anyways and our startup time is fast enough to not need visible launch images) - [fritsch] - * FFMpeg: Bump to 2.8.2-Jarvis-beta2 + [Memphiz] + * [ios] - add the launchimage for iphone5 screens to the info.plist - restores iphone5 resolution on ios8 - [Glenn-1990] - * [PVR] fix timer dialog 'maxRecordings' label + [anaconda] + * Fix marking a video with a resume point as watched. - [Martijn Kaijser] - * [repo] Only fetch the addons.xml for the current version as we changed our repo script on the server to auto copy all compatible version to a single folder + [popcornmix] + * [rbp/settings] Allow av sync type to be enabled - [Martijn Kaijser] - * bump to 16.0 beta 2 + [popcornmix] + * [omxplayer] Request 3 render buffers - [metaron] - * [PVR] Remove repeating timers from Recording lists + [Chris "Koying" Browet] + * FIX: [depends] install pvr at the proper, name depdendant, place - [Thomas Amland] - * [addons] remove unused methods + [fritsch] + * PGS Subs: Don't read from null ptr and Flush on error - [Thomas Amland] - * [addons] fix min/max typo. should get the repo with the highest version + [Karlson2k] + * [cec] [win32] Use new package format - [Thomas Amland] - * [addons] dont include broken versions in available updates + [Lars Op den Kamp] + * [CEC] use device name 'Kodi' instead of 'XBMC' - [robwebset] - * Support PlayingBackgroundMedia + [Lars Op den Kamp] + * [CEC] fixed - don't use CEC_CLIENT_VERSION_CURRENT for the client version, because it will lead to issues when XBMC is rebuilt after a libCEC bump that changes something - [MilhouseVH] - * Clear previous cancelled flag + [Lars Op den Kamp] + * [CEC] renamed the iDoubleTapTimeoutMs in the new libCEC for clarity. does not change binary compatibility - [MilhouseVH] - * Fix inversion of export library dialogs; fix #16317, fix #16358 + [Lars Op den Kamp] + * [CEC] fixed: don't return garbage from CEC related app messenger methods see https://github.com/xbmc/xbmc/commit/19d37944ca2a2ac2f3e71a40a94e9ea289d8f2db#commitcomment-8248480 - [LS80] - * [python] Fixed getRegion dateshort format without leading zero + [Lars Op den Kamp] + * [CEC] prevent bus rescan on a Pi, since the adapter cannot be removed - [John Rennie] - * Fix ticket 15727, SMS input not updating CGUIKeyboardGeneric + [Lars Op den Kamp] + * [CEC] bump libCEC to 2.2.0 + [montellese] + * cmake: rename XBMCROOT to APP_ROOT with backwards compatibility - [Martijn Kaijser] - * bump to 16.0 beta 2 + [montellese] + * cmake: fix version.txt parsing and APP_NAME in kodi-config.cmake + [montellese] + * cmake: rebrand from xbmc to kodi with backwards compatibility - [Stefan Saraev] - * [amcodec] partialy revert 344af8f + [popcornmix] + * Add VideoReference clock for Raspberry Pi - [Chris "koying" Browet] - * FIX: [droid] Only sw for SD MPEG + [popcornmix] + * [rbp] Add method for waiting for next vsync - [Chris Browet] - * FIX: [amc] skip frame render when changing surface size + [popcornmix] + * [egl] Add support for calling OnResetDevice on display mode change + [Rainer Hochecker] + * videorefclock: add video sync drm [Rainer Hochecker] - * AE: fix GetDelay - only apply time correction to sink delay + * X11: expose crtc needed by drm video sync - [DaveTBlake] - * Restore content to "files" when in music file view, but still have "media info" view type available so that music file tag data can be displayed. + [Rainer Hochecker] + * videorefclock: refactoring + [Lars Op den Kamp] + * [CEC] fixed: don't try to stick a value > 255 in a byte - [Thomas Amland] - * [addons] lock manager initialization + [Brandon McAnsh] + * Use APP_NAME_LC for generating the android library - [Thomas Amland] - * [addons] dont change disabled state in db directly on addon update + [Matthias Kortstiege] + * [videodatabase] speed up the video database cleanup for archives - [Thomas Amland] - * [addons] clear blacklist state from database and manager on uninstall + [Matthias Kortstiege] + * [musicinfoscanner] keep track of already processed paths while scanning - [enen92] - * [pydocs] Fix small typo in xbmc.log() example + [Thomas Amland] + * fix script.library type missing in runscript/runaddon checks. + [fritsch] + * VAAPI: Change some loglevels - we are spamming too much v2 - [Anton Fedchin] - * [win32/utils] Fixed converting yuv420 to nv12. Fixed trac #16217 + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing musicvideo from library - [Rainer Hochecker] - * VideoPlayer: fix for closed captions - 708 + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing movie from library + [phil65] + * dynamic dialog size for DialogSelect.xml [Thomas Amland] - * [events] fix crash when attempting to install an addon not in a repository from the event list + * [videoinfoscanner] scan the entire subtree of path passed to scanner. - [Alwin Esch] - * [gui] Sort include files on GUIWindowLoginScreen.* alphabetical - [metaron] - * [PVR] Recording EPG Association Fix + [Lars Op den Kamp] + * ... and prevent these backup files from being committed again - [DaveTBlake] - * Use CMusicInfoTag.GetArtistString() and GetAlbumArtistString to pass song and album artist string out to python addons. + [Lars Op den Kamp] + * removed accidental backup file committed... + [Martijn Kaijser] + * [droid] update Android manifest with - [Memphiz] - * [ios] - fix playback controls from ios control center when kodi is playing music and backgrounded + [yanniks] + * [README] updates for Kodi - [Alwin Esch] - * [builddep] add calls to create missing headers on build for libgpg-error + [Lars Op den Kamp] + * changed to enable all component logging by default - [Kai Sommerfeld] - * [PVR] Fix: Toggle record/stop recording on ACTION_RECORD (e.g. for 'record' remote control button) + [Lars Op den Kamp] + * [CEC] fixed: re-enable CEC logging by default after fba4e391197b92d2e49c936a3a13fe785014d31c. It can still be disabled for people who don't want to see CEC logging, but it'll now be enabled again by default when debugging is enabled, like it was in Gotham. - [Kai Sommerfeld] - * [PVR] Fix: Remove context menu item 'Add to favourites' for children of repeating timers + [popcornmix] + * [rbp] Fix for orientation handling of Pi textures - [Kai Sommerfeld] - * [PVR] Prevent to delete read-only timers (e.g. using 'del' key) - [Kai Sommerfeld] - * [PVR] Context menu cleanup: All windows use same order for menu items + [Memphiz] + * [ios] - update readme - [Kai Sommerfeld] - * [PVR] Context menu cleanup: Consequently use same logic for 'Stop recording' vs 'Delete timer' + [Memphiz] + * [darwin] - some pending xcode project changes (xcodes does those whenever opened so lets commit them) - [Kai Sommerfeld] - * [PVR] Context menu cleanup: Rename CONTEXT_BUTTON_ADVANCED_RECORD to CONTEXT_BUTTON_ADD_TIMER + [Chris "Koying" Browet] + * fixup 5f5d8c86490510f49b82d05ff16011bfbf4cbfa8; re-add default joystick map - [Alwin Esch] - * [depends] fix libgpg-error compile with gcc5 (Ubuntu Xenial) with update to version 1.20 - [Alwin Esch] - * [depends] fix libssh compile with gcc5 (Ubuntu Xenial) + [montellese] + * [confluence] fix default focus in ProfileSettings.xml (fixes #15507) - [Ned Scott] - * Minor keyboard.xml improvements + [Karlson2k] + * [win32] [vfs] Win32SMBDirectory: Do not try to connect with not required. Implemented similarly to Win32SMBFile. + [Thomas Amland] + * [smb] only log if samba logging is enabled - [Memphiz] - * [jenkins] - evaluate new env var "BUILD_BINARY_ADDONS" + [anaconda] + * Respect parent path decision when cleaning paths. - [Memphiz] - * [jenkins] - remove unused linux32 buildsteps - [Memphiz] - * [jenkins] - removed osx32 build support + [yanniks] + * [ios/atv2] fix spelling mistake in README - [DaveTBlake] - * Split mood into an array of values when serialized to match JSON interface. Bump JSON minor version as interface now correctly returning mood. + [Frank Razenberg] + * [keymap] Update PS3 keymap to use a regex name so it works OOB with sixad driver - [Chris "koying" Browet] - * FIX: [droid] some intent filters MUST be registered in code + [Frank Razenberg] + * [keymap] Add trigger attributes to 360 controller + altname for Razer Sabertooth - [Chris "koying" Browet] - * FIX: [droid] regression on media keys with CEC + [Frank Razenberg] + * [buttontranslator] Use regexes for joystick names in ButtonTranslator keymaps - [Kai Sommerfeld] - * [EPG,PVR] Fix deadlock caused by Noitifyobservers call while holding instance's mutex. + [Frank Razenberg] + * [buttontranslator] Add keymap attribute for axis-to-trigger mappings + [Frank Razenberg] + * [windows] WINJoystick: correctly handle multiple joystick and improve triggers - [ace20022] - * [texture/iimage] Pass the texture's width to iimage's Decode() method. + [Frank Razenberg] + * [linux] Rewrite SDL_Joystick to use SDL2: adds hotplug support, correctly handles multiple joysticks and improves axis handling - [Chris "koying" Browet] - * FIX: [amc] VC1 tweak + [wsnipex] + * [depends] move to SDL2 for linux - [Kai Sommerfeld] - * [PVR] Remove redundant method CGUIWindowPVRTimers::ShowTimerSettings. + [Tobias Arrskog] + * [configure] Moved xbmc to SDL2 - [Kai Sommerfeld] - * [PVR] Fix: Do not try to update read-only timers. - [Matthias Kortstiege] - * [coverity] CID#1267254 uninitialized class members in GUIFont.cpp + [Memphiz] + * [ios] - fix compile (stupid backport error - yeah i will continue using jenkins i promise ...) - [Matthias Kortstiege] - * [coverity] CID#1315108 class member 'm_image' is not initialized + [Memphiz] + * [jenkins/android] - fixed wrong env_var check - [Matthias Kortstiege] - * [coverity] CID#1316471 class member 'm_doContentLookup' is not initialized + [ronie] + * [Confluence] fix visible condition - [Matthias Kortstiege] - * [coverity] CID#1262133 fix possible div-by-zero in Autorun.cpp + [BigNoid] + * [win32] Dont delete AppData folder - [Matthias Kortstiege] - * [cleanup] remove unused variables + [Memphiz] + * [jenkins/android] - allow to build OBB package via jenkins env_var - [Fernando] - * Fix TRAC 16359: not filtering tvshows/movies already in tag + [Memphiz] + * [ios8] - another native keyboard fix which slipped through when compiling with our old sdk on jenkins + [montellese] + * [win32] fix compiling TestRarFile due to missing S_IFLNK - [Matthias Kortstiege] - * [music] don't use the directory cache when cleaning the database (fixes #16354) + [Memphiz] + * [jenkins/android] - enable usage of release sign key - [Thomas Amland] - * [addons] fix library path building + [Memphiz] + * [vtb] - fix the removed clamp for retina displays (need to fix the stride for some movies as it was done before) - [ace20022] - * [JpegIO] Crop too large image/frame in Decode. This fixes a theoretically possible access violation. + [montellese] + * tests: fix CXBMCTestUtils::ReferenceFilePath() - [ace20022] - * [cximage] Crop too large image/frame in Decode. This fixes a theoretically possible access violation. + [montellese] + * [win32] silence warning about unused variable - [ace20022] - * [fix][gif] Crop too large image/frame in Decode. This fixes a possible access violation. + [montellese] + * [win32] fix building and running Kodi-test - [ace20022] - * [iimage] Add width and height of the texture/buffer to the interface method Decode(...). + [montellese] + * cmake: handle cases when cmake has pre-initialized CMAKE_INSTALL_PREFIX - [ace20022] - * [gif] Check if there's a frame, before accessing it. This prevents a possible access violation. + [montellese] + * make "Zeroconf Browser" localizable - [Matthias Kortstiege] - * [guilib] colordiffuse not applying to progresstextures + [montellese] + * upnp: fire an update source message when a UPnP server becomes available/unavailable - [Matthias Kortstiege] - * [guilib] fix togglebutton label not rendered properly + [montellese] + * media library: add UPnP servers to sources:// - [ace20022] - * [gif] Check frame dimensions. + [montellese] + * SourcesDirectory: avoid retrieving removable devices if getting media sources failed - [ace20022] - * [gif] Skip frames with an illegal dimension rather than abort. + [montellese] + * media library: force a reload when sources have changed in files view + [ronie] + * Remove 'XBMC.' from built-ins - [fritsch] - * Compositors: Only disable them if actually in use + [ronie] + * [Confluence] Update weather window - [Lauri Myllari] - * x11: use the standard hint for disabling compositing + [ronie] + * Add some new weather strings - [Rainer Hochecker] - * videoplayer: fix detection of program change + [arnova] + * fixed: Asserting on empty protocol is too extreme, it also fails with file://... - [un1versal] - * [strings] fix incorrect dvd mount string and generalise it instead + [wsnipex] + * [buildsystem] posix: add legacy xbmc links for libdir, includedir and datarootdir - [Stefan Saraev] - * [udevprovider] also handle 'change' events. fixes data cd/dvds - [Stefan Saraev] - * [udevprovider] fix mounting raw filesystems on a non partitioned disks + [janbar] + * [pvr] Fix unexpected sub channel merge in EPG grid - [Stefan Saraev] - * [udevprovider] fix segfaults. mountpoint can be null + [Matthias Kortstiege] + * [streamdetails] do not log username/password - [Rainer Hochecker] - * paplayer: wait for eof if no crossfading or cue sheet + [Matthias Kortstiege] + * [playlistplayer] do not log username/password + [Matthias Kortstiege] + * [subtitles] do not log username/password - [DaveTBlake] - * Fix missing artist display in music player + [Matthias Kortstiege] + * [videoinfoscanner] do not log username/password - [Sam Stenvall] - * [teletext] fix incorrect loop parameters, makes loop run again + [Thomas Amland] + * runscript: make sure to get the correct extension point to run - [Sam Stenvall] - * [dxva] fix dereferencing this after deleting it + [Chris "Koying" Browet] + * CHG: [droid] refactor packaging to allow obb google extension apk - [Sam Stenvall] - * fix invalid log format specifiers + [uNiversaI] + * [rebrand] minor @echo @APP_NAME@ instead of kodi/xbmc + [Memphiz] + * [ios/atv2] - adapt the readme for support with Xcode 6.1 against iOS SDK 8.1 on Yosemite - [Chris "Koying" Browet] - * FIX: [droid] Media keys handling fixups + [Memphiz] + * [osx] - adapt readme for compatibility with Xcode 6.1 with OSX SDK 10.10 under Yosemite - [Martijn Kaijser] - * bump to 16.0 beta1 + [Memphiz] + * [ios/atv2] - adapt readme - we support Xcode 6.0.1 against iOS 8 SDK - [wsnipex] - * [python] demote pythons stdout to loglevel debug + [Memphiz] + * ios] - fix libmpeg2 build error by making it even more PIC (also the real fix for the xcode5 build issue earlier) - [ronie] - * remove skin backward compatibility + [Linus Yang] + * [ios] - libRTV fix build for Xcode 6 + [Linus Yang] + * [ios] - fix pil build with Xcode 6 - [ronie] - * [re-touched] update + [Linus Yang] + * [ios] - fix libssh build with Xcode 6 - [Søren Juul] - * Fix regressions introduced by refactoring in commit 9e9396b073ba973b2847896a11244a9f37ecbaff + [Memphiz] + * [ios] - support Xcode 6.x and iOS 8 SDK - [DaveTBlake] - * JSON when getting album or song ensure underlying query uses song_artist or album_artist tables to fully populate artist credits. Hence artist names and id arrays will be consistent. As a bonus now gets MBID (as a vector to match names and ids) + [Memphiz] + * [ios] - bump gas-preprocessor - [Anton Fedchin] - * [WinRenderer] Fixed HQ scalers again. - [Martijn Kaijser] - * [win32] it's time we also name the stacktrace and crashdump Kodi + [Matthias Kortstiege] + * [scrapers] log what actually failed to load - [Ryan Rector] - * Lower "Thread start" logging level + [anaconda] + * Fix LOGDBUS component logging. - [Erwin Jansen] - * Fix unit tests on linux/os-x + [Memphiz] + * [ios] - fix devcert signing (pvr addons were missing and couldn't be loaded) - [Chris "Koying" Browet] - * CHG: [droid] proper handling of MEDIA keys + [Rainer Hochecker] + * vaapi: glIsSync, glIsTexture seem to unreliable on Intel - [Chris "Koying" Browet] - * FIX: don't show size for non-file items + [popcornmix] + * [PiSink] Dual audio support - [arnova] - * changed: Increase maximum amount of cached directories to 50 + [popcornmix] + * [omxplayer] Restore flush/accurate seek flags to fix issue with edl skipping + [Rainer Hochecker] + * vaapi: workaround intel bugs - [Chris "Koying" Browet] - * FIX: [droid;amc] be sure that we have a surface + [Memphiz] + * [ios] - add support for iPad Air 2 and iPad mini 3 - [Chris "koying" Browet] - * FIX: [droid] do not reuse destroyed native window + [Memphiz] + * [ios/vtb] - remove the video render scale down / clamp for all retina devices which have enought power to render unscaled - [SkyCrawl] - * Adding keyboard layout: Czech QWERTZ + [Memphiz] + * [ios] - add launch images for ip6 and ip6+ for enabling the new resolutions + [Memphiz] + * [ios] - support iphone6plus screensize which uses screenScale 3 and add support for iPhone6 screen aswell - [un1versal] - * [confluence]fix alignment of subtitles menu in livetv OSD when VideoPlayer.HasMenu is not visible - [un1versal] - * [confluence]fix 3D menu alignment when VideoPlayer.HasMenu is not visible + [xhaggi] + * [pvr] fix continue playback of last watched channel on startup if group was deleted or channel was moved - [Matthias Kortstiege] - * [make] silent ar compiler warnings + [wsnipex] + * [buildsteps] fix linux32 gtests invocation as well - [Kolja Lampe] - * Remove .idea folder which get's created from JetBrains CLion + [wsnipex] + * [buildsteps] fix OSX gtests invocation - [Chris "Koying" Browet] - * FIX: [droid;amcs] do not stop video when loosing main surface + [wsnipex] + * [buildsteps] fix linux gtest invocation - [Anton Fedchin] - * [d3d11] Fixed issue with stereoscopic 3D mode and DXVA scaling for some drivers which works incorrectly with DXVA processor and deferred context. + [Memphiz] + * [osx] - don't release strings we didn't alloc - fixes crash on shutdown (introduced in rebrand) - [Anton Fedchin] - * [WinRenderer] Fix HQ scallers, to avoid unnecessary scaling at Stage1 (with DXVA processor and color shader). This also fixes HQ scallers for TAB/SBS modes. + [Memphiz] + * [git] - add generated FEH-ARM.py and FEH.py to gitignore - [Matthias Kortstiege] - * [globals] remove macro XBMC_GLOBAL + [phil65] + * [rebrand] - fixed some labels from strings.po files - [Matthias Kortstiege] - * [guilib] fix togglebutton not properly resizing when using the altlabel + [xhaggi] + * [pvr] removes unnecessary persist of current channel in GetLastPlayedChannel() + [xhaggi] + * [pvr] fix: update to last watched does not reflect to correct channel instance - [Martijn Kaijser] - * [droid] update readme to recommend Ubuntu 14.04 + [xhaggi] + * [pvr] fix call to base class GetContextButtons() to re-add favorite entry - [h.udo] - * [gitignore] More android artifacts + [Philipp Te] + * [CONFLUENCE] fixed lyrics xml filename in includes.xml - [Kai Sommerfeld] - * [PVR] Fix: Coverity: CGUIInfoManager: divide_by_zero (actually a false positive) + [Philipp Te] + * [CONFLUENCE] removed some unneccessary visibility conditions - [Kai Sommerfeld] - * [PVR] Fix: Coverity: CGUIDialogPVRRadioRDSInfo: uninit member + [Philipp Te] + * [CONFLUENCE] fixed lyrics xml filename in MusicVis - [Kai Sommerfeld] - * [PVR] Fix: Coverity: CPVRManagerStartJob: unused member + [Lars Op den Kamp] + * [pvr] bump add-ons - [Kai Sommerfeld] - * [PVR] Fix: Coverity: PVRGUIInfo: uninit member + [montellese] + * [win32] rename XBMC_PROFILE_USERDATA to APP_PROFILE_USERDATA + [montellese] + * [win32] rename XBMC_HOME to APP_HOME - [Chris "koying" Browet] - * CHG: [droid] decouple kodi and system audio volumes + [Rainer Hochecker] + * dxva: fix memory leak caused by additional ref on video surfaces - [Kai Sommerfeld] - * [xcode] add xbmc/addons/include directory to project (exists for ages, but was not in project) + [uNiversaI] + * [fix] keyboard layout default setting - [Kai Sommerfeld] - * [guiinfo] Fixed LISTITEM_ISRECORDING for epg event items in case there is an aborted recording for the selected epg event. + [Karlson2k] + * [vfs] PVRFile::Read(): do not return negative values other than "-1" + [Karlson2k] + * DVDInputStreamTV/DVDInputStreamFile: Don't set EOF in case of error to give player a chance to retry read. - [Chris "Koying" Browet] - * CHG: [droid] Use best possible icons for app + refactor + [Rainer Hochecker] + * dxva: fix selection of render target format + + [xhaggi] + * [builtin] fix activatewindow if directory path differs + + [AlwinEsch] + * [pvr] fix unnecessary creation of new CPVRChannel instances - [Chris "Koying" Browet] - * CHG: [droid] stop video when loosing focus - [Chris "koying" Browet] - * FIX: [droid] protect clear surface vs. destruction - [Chris "Koying" Browet] - * FIX: [droid] also check CPU2 for compatibility - [dummy] * dummy + -- wsnipex Sun, 04 Nov 2012 09:41:54 +0100 diff -Nru kodi-16.1~git20160425.1001-final/debian/changelog.tmp kodi-15.2~git20151019.1039-final/debian/changelog.tmp --- kodi-16.1~git20160425.1001-final/debian/changelog.tmp 2016-04-25 08:02:54.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/debian/changelog.tmp 2015-10-19 08:40:32.000000000 +0000 @@ -1,1723 +1,29523 @@ -kodi (2:16.1~git20160425.1001-final-0dist) dist; urgency=high +kodi (2:15.2~git20151019.1039-final-0dist) dist; urgency=high - [HerbFargus] - * Add xboxdrv name for xbox keymap + [Matthias Kortstiege] + * [guilib] enable onfocus/onunfocus actions for base containers + + [Rainer Hochecker] + * remove dependency from Unrar lib to GUIWindowManager + + [ronie] + * drop tvtunes support + + [Matthias Kortstiege] + * [texture] redact username/password when texture loading fails + + [Thomas Amland] + * [addons] dont redirect to download dir on update all. already shows progress + + [Thomas Amland] + * [addons] remove unused methods and database column for blacklisting + + [Thomas Amland] + * [addons] refactor GetAllOutdatedAddons + + [Thomas Amland] + * [addons] dont hide available updates for blacklisted addons + + [Thomas Amland] + * [addons] add caching of blacklisted addons via addon manager + + [Sascha Kuehndel (InuSasha)] + * [guilib] add override onclick to dynamic content lists + + [Chris "koying" Browet] + * FIX: [droid] use context resolution when recreating window + + [Rainer Hochecker] + * OSX: remove ifdef from platform agnostic code + + [Matthias Kortstiege] + * [eventserver] logging once when starting is enough + + [Matthias Kortstiege] + * [webserver] logging once about starting/stopping is enough + + [Kai Sommerfeld] + * [PVR] Activate PVR windows only if PVR is enabled + + [Kolja Lampe] + * Fix tests after removal of atv2 See: #8181 + + [Leonidas Kosmidis] + * Save last eglConfig to m_eglConfig and reuse it wherever is possible + + [Kolja Lampe] + * [music] Aligned music userrating frontend to the new way we do it in the video library + + [Kolja Lampe] + * [confluence] Add user rating item to list and add a button for setting the user rating of this item + + [Kolja Lampe] + * [video] Enable editing of userrating from the frontend via increase/decrease and update video info and listings accordingly + + [Stefan Saraev] + * [Confluence] on left/right fixup after #8222 + + [Kai Sommerfeld] + * [PVR] Fix search window init regression + + [Garrett Brown] + * [win32] Fix VS project after #8212 + + [Matthias Kortstiege] + * [guilib] add ability to visualize controls hitrects + + [Garrett Brown] + * [addonlib] Fixed: labelenum setting should be a string instead of int + + [Garrett Brown] + * [dllLoader] Fix segfault if high-order word is zero + + [Garrett Brown] + * [vfs] Fix crash when entering zip:// URLs with unknown zip file size + + [Garrett Brown] + * [guilib] Notify parent control when focus is lost due to mouse event + + [Garrett Brown] + * [addons] Build library path in CAddon instead of CAddonDll + + [Garrett Brown] + * [binary addons] Allow overriding install paths + + [Garrett Brown] + * [addons] Move resource cleanup to parent class + + [Garrett Brown] + * [python] Fix listing of protocol root + + [Garrett Brown] + * [cleanup] Move string alias to outer block + + [Garrett Brown] + * [cleanup] Move local variable to the stack in PluginDirectory.cpp + + [Garrett Brown] + * [utils] Add missing const null check to CVariant move assignment operator + + [Kai Sommerfeld] + * [Confluence] Add 'Events' to Home screen's 'System' submenu. + + [Kai Sommerfeld] + * [pvr] context menu changes: remove 'Add to favourites' for timers and EPG events + + [Chris "koying" Browet] + * FIX: [droid;amc] fix WMV3/VC1 + + [Sam Stenvall] + * [pvr] fix playback of recordings when an exact duplicate exists. This happens if one for some reason records a show twice, stopping in between (which creates two separate recordings) + + [Chris "Koying" Browet] + * ADD: [droid] VP9 + decouple VC1/WMV + + [montellese] + * [win32][binary addons] bootstrap-addons.bat: fix typo in NULL instead of NUL + + [montellese] + * [binary addons] fix handling of PACKAGE_DIR argument + + [montellese] + * [binary addons] fix typo in log message + + [Sean Kelly] + * Minor cleanup to match naming convention in video database + + [Cole Johnson] + * Show BluRay media flag for `brrip` + + [Kolja Lampe] + * Make sortorder descending default for lastPlayed + + [Kolja Lampe] + * Removed label2 and show value that is sorted by or fall back to duration. Add lastPlayed sortorder for music + + [fritsch] + * FFmpeg: Bump to 2.8.1-Jarvis-alpha4-HEVC + + [DaveTBlake] + * Tidy up CAlbum creator use of albumartist + + [Kai Sommerfeld] + * [pvr] context menu changes: use 'Record'/'Stop recording' in a consistent way + + [Kai Sommerfeld] + * [pvr] context menu changes: 'Add timer' => 'Record', 'Add custom timer' => 'Add timer' + + [Anton Fedchin] + * [d3d11] Fixed segfault if device was lost. Also this adds trying to restore device if it was lost. + + [DaveTBlake] + * Use GetArtistString() methods to replace Join/m_musicItemSeparator approach in various places. + + [Arne Morten Kvarving] + * changed: enable ffmpeg tag reader for dsf files + + [Arne Morten Kvarving] + * added: use FFmpeg tag loader for .mka files + + [Arne Morten Kvarving] + * added: FFmpeg based tag loader + + [xhaggi] + * [gui] fix missing path param in CGUIDialog::Open() after 447ec5b + + [DaveTBlake] + * Remove artist vector from song + + [Arne Morten Kvarving] + * changed: move ffmpeg read buffer definition so it is reusable + + [un1versal] + * [Readme] Useful links, add bug tracker link + + [Michał Kępień] + * Strip trailing newlines from URLs in NFO files for cURL 7.40+ compatibility + + [Montellese] + * CGUIDialogSelect: clear the view control before it is saved in CGUIWindow::OnDeinitWindow() to be able to properly reset the scroll and offset positions + + [Montellese] + * CGUIListContainer: also reset the list's offset and not just the cursor on GUI_MSG_LABEL_RESET + + [Montellese] + * CGUIDialogSelect: fix focusing the first selected item when opening the dialog + + [Kai Sommerfeld] + * [pvr] Fix errors after switching from using backend channel numbers to using kodi channel numbers and vica versa + + [Montellese] + * CGUIWindowVideoBase: clear the cached source listing when removing a video source + + [Montellese] + * CGUIWindowMusicBase: clear the cached source listing when removing a music source + + [Matthias Kortstiege] + * [input] fix baidu method signatures of overriden virtual methods + + [Montellese] + * CGUIDialog: forward overridden method calls to CGUIDialogBoxBase instead of CGUIDialog + + [Sascha Kuehndel (InuSasha)] + * [gitignore] rename xbmc -> kodi + + [Matthias Kortstiege] + * [guilib] scrollbar not reading custom hitrect specified + + [Kolja Lampe] + * Align video and music sort types on file listings to each other + + [Montellese] + * remove "Settings" context menu button from music and pictures views + + [Pär Björklund] + * Added init/uninit for coding tables to avoid having the baidu thread running all the time + + [da-anda] + * [Confluence] add stereoscopic depths + + [Kolja Lampe] + * [json] Added seasonid to episode returns + + [Kolja Lampe] + * Add idSeason to episode table + + [Thomas Amland] + * [python] fix memory leak in multiselect + + [ace20022] + * [guilib][gif] Make animated gifs loadable for any kind of textures, e.g., posters. + + [ace20022] + * [coverity] Unsigned compared against 0 (CID ids 1325653 - 1325663) + + [Alwin Esch] + * [depends] update cmake to 3.3.2 + + [popcornmix] + * [screensaver] Avoid getting stuck in dim state when skin is reloaded + + [HitcherUK] + * Lets skins use a light font weight through the use of either the style tag in Fonts.xml or via the info label + + [da-anda] + * [Confluence] use include for common window header + + [S. Davilla] + * [ios] - removed, atv2 support. time to make way for something new. hint, hint :) - backport from mrmc fork + + [Memphiz] + * [airplay] - fixed broken "stop" for stopping picture streaming via airplay + + [Memphiz] + * [airplay] - make ios8 compatibility mode the new default and don't use a setting for it + + [Memphiz] + * [settings] - make the ios8 compatibility setting a "enable airplay video and pictures support" setting + + [Memphiz] + * [airplay] - evaluate the new "enable airplay video and pictures" setting - this allows the ios9 users to restore at least music streaming capabilities (by disabling video/pictures support) + + [Memphiz] + * [depends/shairplay] - updated libshairplay to the current master which supports ios9 clients (also bumped on win32) + + [Thomas Amland] + * fix typo in log message + + [Thomas Amland] + * [addons] close info dialog on install, not when opening the update dialog + + [Thomas Amland] + * [addons] fix and move the rollback feature into the new update dialog + + [Matthias Kortstiege] + * [input] fix ios build after 7aeff92 + + [Matthias Kortstiege] + * [input] xcode sync for InputCodingTableKorean + + [Matthias Kortstiege] + * [input] add InputCodingTableKorean.cpp to Makefile + + [universal] + * [cleanup][cdio] cosmetics + + [universal] + * [cleanup][DetectDVDType] cosmetics + + [uNiversaI] + * [cleanup][DetectDVDType] remove xbox udfx related + + [uNiversaI] + * [cleanup][libcdio] remove xbox udfx related + + [Matthias Kortstiege] + * [input] fix onnext in dialog numeric after bab2486 + + [Matthias Kortstiege] + * [cleanup] silent reorder compiler warning in InputCodingTableBaiduPY.h + + [Matthias Kortstiege] + * [cleanup] remove DOS line endings in InputCodingTableBaiduPY.h + + [xconverge] + * Minor cleanup for readability. + + [ace20022] + * [coverity] CID#1312062 Unintentional integer overflow. + + [ace20022] + * [coverity] CID#1316334 class member foo is not initialized in this constructor nor in any functions that it calls. + + [ace20022] + * [coverity] CID#1288653 case VIDEOPLAYER_TITLE was not reachable for pvr channels. + + [ace20022] + * [coverity] CID#1272227 Remove logically dead code. + + [ace20022] + * [coverity] CID#1213839 Remove logically dead code. + + [Rainer Hochecker] + * VideoPlayer: trust SAR of mkv container + + [Matthias Kortstiege] + * [guilib] add justify alignment for grouplist controls + + [Martijn Kaijser] + * bump to 16.0alpha4 + + [Martijn Kaijser] + * [python] removed long deprecated xbmcgui.lock() and xbmcgui.unlock() + + [Matthias Kortstiege] + * [videothumbloader] skip thumb extraction for bluray items + + [Kai Sommerfeld] + * [EPG][PVR] Guide Window: On selection of an EPG gap, switch to associated channel. + + [Kai Sommerfeld] + * [EPG] EPG Grid Container: Fill grid with trailing gap epg tags. + + [Kai Sommerfeld] + * [EPG][PVR] Guide Window: Show channels without EPG data. + + [NedScott] + * Improve virtual keyboard layout for English + + [Matthias Kortstiege] + * [guilib] only consider visible controls within grouplists for Container.Position + + [NedScott] + * Improve description of sets strings + + [NedScott] + * Addiitonal long-press modifications + + [Kib] + * [Android-x86] move symbols to the workspace + + [Kib] + * [Android] move symbols to the workspace + + [Matthias Kortstiege] + * [cleanup] get rid of unused function warnings from eventlevel + + [montellese] + * video library: move "Choose art" context button for seasons into "Manage..." + + [montellese] + * video library: add functionality to set custom names for tvshow seasons + + [Matthias Kortstiege] + * [cleanup] cast user ratings to int in sortutils + + [da-anda] + * [guilib] parse tag for constants + + [Kai Sommerfeld] + * [PVR] Search window: Fixed OnPrepareFileItems only to search if requested to do so and not just a simple window refresh is ongoing. + + [Kai Sommerfeld] + * [PVR] Timers: Relax handling of read-only timers a bit. + + [Kai Sommerfeld] + * [PVR] Search window: Fix "Find similar program" for timers to prefer EPG tag title over timer title. + + [Matthias Kortstiege] + * [cleanup] fix signed/unsigned compiler warning + + [Matthias Kortstiege] + * [cleanup] remove unused variable isExecutable + + [Matthias Kortstiege] + * [cleanup] silent override warnings on newer gcc version + + [Kai Sommerfeld] + * [PVR] Don't ask user for confirmtion when creating a timer. "Do you really want to record this?" => Nonsense + + [Kai Sommerfeld] + * [PVR] Cleanup: Rename CGUIWindowPVRBase::StartRecordFile() => CGUIWindowPVRBase::AddTimer() to reflect what it actually does. + + [fritsch] + * AESinkPULSE: Replace Delay method with self calculated method + + [Rainer Hochecker] + * dvdplayer: fix non DVB subs after 5c0d694fa769f311bc5e14dec04c260267a56b79 + + [Matthias Kortstiege] + * [guilib] simplify dirty region marking for fadelabels (fixes #16277) + + [Kai Sommerfeld] + * Revert "[pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running" + + [Martijn Kaijser] + * [win32] add screensaver add-ons to installer + + [Thomas Amland] + * run repository update jobs in low pausable mode + + [Anton Fedchin] + * [dxva] Re-factor: get rid of unneeded reference to decoder texture. Properly destroying resources during creating decoders views if something goes wrong. + + [Anton Fedchin] + * [WinVideoFilter] Lower feature level for test shader. This fixes segfault in video drivers which support only FL9.1/9.2. + + [Anton Fedchin] + * [dxva] Fix DXVA renderer color range. + + [Floris Bos] + * LinuxInputDevice: add support for multi-touch devices + + [DaveTBlake] + * Add missing MusicInfoTag values when set from artist, album and song. Had not been previously updated to allow for artist credits, so while artist vector being set the description and MBIDs not all being done. + + [Pär Björklund] + * Fix c/p error on dialogs and renamed singleFiles variable in videolibrary as it was somewhat confusingly named compared to the dialog options + + [Kai Sommerfeld] + * [network] CNetWork::IsAvailable: Remove parameter 'wait', because there is no implementation behind. + + [h.udo] + * [gitignore] Add library.kodi.audioengine makefile + + [ace20022] + * [fix][gui] Fix multi images in grouplists/layouts. This fixes a regression introduced with cb2dd229ce5b6f479f9a6ebd51998831554d2ae2 . + + [Peter Bauer] + * Subtract readahead when seeking (SEEK_CUR) outside of buffer area + + [Peter Bauer] + * Use ID3v2Tag loader results + + [LS80] + * Fixed missing Python traceback caused by an invalid format string. Fixes #16274. + + [Achim Turan] + * [library.kodi.audioengine] Fixing clumsy error mesage + + [Thomas Amland] + * [addons] fix uninstalling of non-repository addons + + [Achim Turan] + * [library.kodi.audioengine] [FIX CID 1324647] Fixing Null-checking "cb" + + [Sam Stenvall] + * [pvr] fix invalid memory access when a PVR window is accessed before any clients have finished loading. Also introduce an event which gets triggered when an update is actually needed. + + [xhaggi] + * [cleanup] get rid of unused window allow overlay code + + [Thomas Amland] + * [addons] fix zip install after 61121d731 + + [Thomas Amland] + * [addons] fix bad error handling (returns int) + + [Thomas Amland] + * log time of previous repository update to make it easier to detect database problems in the future + + [Thomas Amland] + * [addons] fix repo last checked time not updating if not previously added + + [S. Davilla] + * bump gas to https://git.libav.org/?p=gas-preprocessor.git;a=commit;h=5ab764742626598cb462bc86e2d04ac8001e05d7 + + [S. Davilla] + * docs, document what we are doing in depends + + [S. Davilla] + * fixed, c++11 compiler warning + + [S. Davilla] + * fixed, all our thread should be named + + [S. Davilla] + * fixed, massive memory leak in DirectoryNode and some cosmetic cleanup. Basically CDirectoryNode::ParseURL creates a bunch of nodes then orphans them when browsing by file. Also StringUtils::Split can return a leading empty string for '/Users/Shared/Movies', and we add another one to path, which creates two root nodes. use StringUtils::Tokenize which does what we want. Side note: StringUtils::Split needs a refactor, iMaxStrings is size_t and the default value is zero and the very 1st thing it does is pre-decrement it which wraps it around to a very big number, sure, sure :) + + [S. Davilla] + * fixed, memory leaks using VDA (both of them) + + [S. Davilla] + * fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5 + + [S. Davilla] + * fixed, memory leaks in SMBFile, three tiny ones left to find. + + [S. Davilla] + * fixed, clearerr return void + + [sportica] + * Add Korean keyboard + + [ronie] + * [Confluence] hardcode icon path for extended weather info + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetTop100AlbumSongs + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetRecentlyPlayedAlbumSongs + + [Martijn Kaijser] + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Return ENOENT for empty path according to specs + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& + + [Kai Sommerfeld] + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers + + [Thomas Amland] + * [addons] add missing implementations of IsInUse + + [Thomas Amland] + * [addons] add missing implementations of SetDefault + + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis + + [Chris "Koying" Browet] + * FIX: proper casting of file time TZ adjustment + + [Kolja Lampe] + * Check if charsetSetting is null before trying to get data from it. If it is use the default value. + + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [ronie] + * [Confluence] cleanup + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Mike Frysinger] + * TexturePacker: use $PKG_CONFIG + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard + + [Anton Fedchin] + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. + + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 + + [Memphiz] + * [cosmetics] - fixed typos + + [Memphiz] + * [ios] - fix mapping of 3 finger taps + + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not + + [montellese] + * GroupUtils: add additional overloads for more control over the result + + [montellese] + * GroupUtils: remove unused GroupAndSort() + + [BigNoid] + * [guilib] reduce duplicate code + + [BigNoid] + * [guilib] Add container.listitemid.infolabel + + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims + + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation + + [DaveTBlake] + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Kolja Lampe] + * [video] Don't save scraper settings if we exit out and not select the "ok" button + + [anaconda] + * [video] Fix content type for special://videoplaylists + + [Chris "Koying" Browet] + * FIX: [droid;storage] check readability last + + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do + + [Ryan Gribble] + * Update gitignore for bootstrapped addons definition files + + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values + + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). + + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [evilhamster] + * [music] Removed refresh on artist/album info when the artist/album has not been scraped. + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme + + [Martijn Kaijser] + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Alex Deryskyba] + * [aml] Enable true 1920x1080 output without upscaling on Amlogic-based devices. + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [taxigps] + * fixed: setlocale issue other than windows + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Chris "Koying" Browet] + * FIX: [droid] handle audio headsets + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Sam Nazarko] + * [rbp] tools: only use sudo if we have it on the system + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Matthias Kortstiege] + * [input] fix ios build after 7aeff92 + + [Matthias Kortstiege] + * [input] xcode sync for InputCodingTableKorean + + [Matthias Kortstiege] + * [input] add InputCodingTableKorean.cpp to Makefile + + [universal] + * [cleanup][cdio] cosmetics + + [universal] + * [cleanup][DetectDVDType] cosmetics + + [uNiversaI] + * [cleanup][DetectDVDType] remove xbox udfx related + + [uNiversaI] + * [cleanup][libcdio] remove xbox udfx related + + [Matthias Kortstiege] + * [input] fix onnext in dialog numeric after bab2486 + + [Matthias Kortstiege] + * [cleanup] silent reorder compiler warning in InputCodingTableBaiduPY.h + + [Matthias Kortstiege] + * [cleanup] remove DOS line endings in InputCodingTableBaiduPY.h + + [xconverge] + * Minor cleanup for readability. + + [ace20022] + * [coverity] CID#1312062 Unintentional integer overflow. + + [ace20022] + * [coverity] CID#1316334 class member foo is not initialized in this constructor nor in any functions that it calls. + + [ace20022] + * [coverity] CID#1288653 case VIDEOPLAYER_TITLE was not reachable for pvr channels. + + [ace20022] + * [coverity] CID#1272227 Remove logically dead code. + + [ace20022] + * [coverity] CID#1213839 Remove logically dead code. + + [Rainer Hochecker] + * VideoPlayer: trust SAR of mkv container + + [Matthias Kortstiege] + * [guilib] add justify alignment for grouplist controls + + [Martijn Kaijser] + * bump to 16.0alpha4 + + [Martijn Kaijser] + * [python] removed long deprecated xbmcgui.lock() and xbmcgui.unlock() + + [Matthias Kortstiege] + * [videothumbloader] skip thumb extraction for bluray items + + [Kai Sommerfeld] + * [EPG][PVR] Guide Window: On selection of an EPG gap, switch to associated channel. + + [Kai Sommerfeld] + * [EPG] EPG Grid Container: Fill grid with trailing gap epg tags. + + [Kai Sommerfeld] + * [EPG][PVR] Guide Window: Show channels without EPG data. + + [NedScott] + * Improve virtual keyboard layout for English + + [Matthias Kortstiege] + * [guilib] only consider visible controls within grouplists for Container.Position + + [NedScott] + * Improve description of sets strings + + [NedScott] + * Addiitonal long-press modifications + + [Kib] + * [Android-x86] move symbols to the workspace + + [Kib] + * [Android] move symbols to the workspace + + [Matthias Kortstiege] + * [cleanup] get rid of unused function warnings from eventlevel + + [Matthias Kortstiege] + * [cleanup] cast user ratings to int in sortutils + + [da-anda] + * [guilib] parse tag for constants + + [Kai Sommerfeld] + * [PVR] Search window: Fixed OnPrepareFileItems only to search if requested to do so and not just a simple window refresh is ongoing. + + [Kai Sommerfeld] + * [PVR] Timers: Relax handling of read-only timers a bit. + + [Kai Sommerfeld] + * [PVR] Search window: Fix "Find similar program" for timers to prefer EPG tag title over timer title. + + [Matthias Kortstiege] + * [cleanup] fix signed/unsigned compiler warning + + [Matthias Kortstiege] + * [cleanup] remove unused variable isExecutable + + [Matthias Kortstiege] + * [cleanup] silent override warnings on newer gcc version + + [Kai Sommerfeld] + * [PVR] Don't ask user for confirmtion when creating a timer. "Do you really want to record this?" => Nonsense + + [Kai Sommerfeld] + * [PVR] Cleanup: Rename CGUIWindowPVRBase::StartRecordFile() => CGUIWindowPVRBase::AddTimer() to reflect what it actually does. + + [fritsch] + * AESinkPULSE: Replace Delay method with self calculated method + + [Rainer Hochecker] + * dvdplayer: fix non DVB subs after 5c0d694fa769f311bc5e14dec04c260267a56b79 + + [Matthias Kortstiege] + * [guilib] simplify dirty region marking for fadelabels (fixes #16277) + + [Kai Sommerfeld] + * Revert "[pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running" + + [Martijn Kaijser] + * [win32] add screensaver add-ons to installer + + [Thomas Amland] + * run repository update jobs in low pausable mode + + [Anton Fedchin] + * [dxva] Re-factor: get rid of unneeded reference to decoder texture. Properly destroying resources during creating decoders views if something goes wrong. + + [Anton Fedchin] + * [WinVideoFilter] Lower feature level for test shader. This fixes segfault in video drivers which support only FL9.1/9.2. + + [Anton Fedchin] + * [dxva] Fix DXVA renderer color range. + + [Floris Bos] + * LinuxInputDevice: add support for multi-touch devices + + [Pär Björklund] + * Fix c/p error on dialogs and renamed singleFiles variable in videolibrary as it was somewhat confusingly named compared to the dialog options + + [Kai Sommerfeld] + * [network] CNetWork::IsAvailable: Remove parameter 'wait', because there is no implementation behind. + + [h.udo] + * [gitignore] Add library.kodi.audioengine makefile + + [ace20022] + * [fix][gui] Fix multi images in grouplists/layouts. This fixes a regression introduced with cb2dd229ce5b6f479f9a6ebd51998831554d2ae2 . + + [Peter Bauer] + * Subtract readahead when seeking (SEEK_CUR) outside of buffer area + + [Peter Bauer] + * Use ID3v2Tag loader results + + [LS80] + * Fixed missing Python traceback caused by an invalid format string. Fixes #16274. + + [Achim Turan] + * [library.kodi.audioengine] Fixing clumsy error mesage + + [Thomas Amland] + * [addons] fix uninstalling of non-repository addons + + [Achim Turan] + * [library.kodi.audioengine] [FIX CID 1324647] Fixing Null-checking "cb" + + [Sam Stenvall] + * [pvr] fix invalid memory access when a PVR window is accessed before any clients have finished loading. Also introduce an event which gets triggered when an update is actually needed. + + [xhaggi] + * [cleanup] get rid of unused window allow overlay code + + [Thomas Amland] + * [addons] fix zip install after 61121d731 + + [Thomas Amland] + * [addons] fix bad error handling (returns int) + + [Thomas Amland] + * log time of previous repository update to make it easier to detect database problems in the future + + [Thomas Amland] + * [addons] fix repo last checked time not updating if not previously added + + [S. Davilla] + * bump gas to https://git.libav.org/?p=gas-preprocessor.git;a=commit;h=5ab764742626598cb462bc86e2d04ac8001e05d7 + + [S. Davilla] + * docs, document what we are doing in depends + + [S. Davilla] + * fixed, c++11 compiler warning + + [S. Davilla] + * fixed, all our thread should be named + + [S. Davilla] + * fixed, massive memory leak in DirectoryNode and some cosmetic cleanup. Basically CDirectoryNode::ParseURL creates a bunch of nodes then orphans them when browsing by file. Also StringUtils::Split can return a leading empty string for '/Users/Shared/Movies', and we add another one to path, which creates two root nodes. use StringUtils::Tokenize which does what we want. Side note: StringUtils::Split needs a refactor, iMaxStrings is size_t and the default value is zero and the very 1st thing it does is pre-decrement it which wraps it around to a very big number, sure, sure :) + + [S. Davilla] + * fixed, memory leaks using VDA (both of them) + + [S. Davilla] + * fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5 + + [S. Davilla] + * fixed, memory leaks in SMBFile, three tiny ones left to find. + + [S. Davilla] + * fixed, clearerr return void + + [sportica] + * Add Korean keyboard + + [ronie] + * [Confluence] hardcode icon path for extended weather info + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetTop100AlbumSongs + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetRecentlyPlayedAlbumSongs + + [Martijn Kaijser] + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Return ENOENT for empty path according to specs + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& + + [Kai Sommerfeld] + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers + + [Thomas Amland] + * [addons] add missing implementations of IsInUse + + [Thomas Amland] + * [addons] add missing implementations of SetDefault + + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis + + [Chris "Koying" Browet] + * FIX: proper casting of file time TZ adjustment + + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [ronie] + * [Confluence] cleanup + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Mike Frysinger] + * TexturePacker: use $PKG_CONFIG + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard + + [Anton Fedchin] + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. + + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 + + [Memphiz] + * [cosmetics] - fixed typos + + [Memphiz] + * [ios] - fix mapping of 3 finger taps + + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not + + [montellese] + * GroupUtils: add additional overloads for more control over the result + + [montellese] + * GroupUtils: remove unused GroupAndSort() + + [BigNoid] + * [guilib] reduce duplicate code + + [BigNoid] + * [guilib] Add container.listitemid.infolabel + + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims + + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation + + [DaveTBlake] + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Kolja Lampe] + * [video] Don't save scraper settings if we exit out and not select the "ok" button + + [anaconda] + * [video] Fix content type for special://videoplaylists + + [Chris "Koying" Browet] + * FIX: [droid;storage] check readability last + + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do + + [Ryan Gribble] + * Update gitignore for bootstrapped addons definition files + + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values + + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). + + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme + + [Martijn Kaijser] + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [da-anda] + * [guilib] parse tag for constants + + [Matthias Kortstiege] + * [guilib] simplify dirty region marking for fadelabels (fixes #16277) + + [Kai Sommerfeld] + * Revert "[pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running" + + [Martijn Kaijser] + * [win32] add screensaver add-ons to installer + + [Thomas Amland] + * run repository update jobs in low pausable mode + + [Anton Fedchin] + * [dxva] Re-factor: get rid of unneeded reference to decoder texture. Properly destroying resources during creating decoders views if something goes wrong. + + [Anton Fedchin] + * [WinVideoFilter] Lower feature level for test shader. This fixes segfault in video drivers which support only FL9.1/9.2. + + [Anton Fedchin] + * [dxva] Fix DXVA renderer color range. + + [ace20022] + * [fix][gui] Fix multi images in grouplists/layouts. This fixes a regression introduced with cb2dd229ce5b6f479f9a6ebd51998831554d2ae2 . + + [LS80] + * Fixed missing Python traceback caused by an invalid format string. Fixes #16274. + + [Achim Turan] + * [library.kodi.audioengine] Fixing clumsy error mesage + + [Thomas Amland] + * [addons] fix uninstalling of non-repository addons + + [Achim Turan] + * [library.kodi.audioengine] [FIX CID 1324647] Fixing Null-checking "cb" + + [Sam Stenvall] + * [pvr] fix invalid memory access when a PVR window is accessed before any clients have finished loading. Also introduce an event which gets triggered when an update is actually needed. + + [xhaggi] + * [cleanup] get rid of unused window allow overlay code + + [Thomas Amland] + * [addons] fix zip install after 61121d731 + + [Thomas Amland] + * [addons] fix bad error handling (returns int) + + [Thomas Amland] + * log time of previous repository update to make it easier to detect database problems in the future + + [Thomas Amland] + * [addons] fix repo last checked time not updating if not previously added + + [S. Davilla] + * bump gas to https://git.libav.org/?p=gas-preprocessor.git;a=commit;h=5ab764742626598cb462bc86e2d04ac8001e05d7 + + [S. Davilla] + * docs, document what we are doing in depends + + [S. Davilla] + * fixed, c++11 compiler warning + + [S. Davilla] + * fixed, all our thread should be named + + [S. Davilla] + * fixed, massive memory leak in DirectoryNode and some cosmetic cleanup. Basically CDirectoryNode::ParseURL creates a bunch of nodes then orphans them when browsing by file. Also StringUtils::Split can return a leading empty string for '/Users/Shared/Movies', and we add another one to path, which creates two root nodes. use StringUtils::Tokenize which does what we want. Side note: StringUtils::Split needs a refactor, iMaxStrings is size_t and the default value is zero and the very 1st thing it does is pre-decrement it which wraps it around to a very big number, sure, sure :) + + [S. Davilla] + * fixed, memory leaks using VDA (both of them) + + [S. Davilla] + * fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5 + + [S. Davilla] + * fixed, memory leaks in SMBFile, three tiny ones left to find. + + [S. Davilla] + * fixed, clearerr return void + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetTop100AlbumSongs + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetRecentlyPlayedAlbumSongs + + [Martijn Kaijser] + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& + + [Kai Sommerfeld] + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers + + [Thomas Amland] + * [addons] add missing implementations of IsInUse + + [Thomas Amland] + * [addons] add missing implementations of SetDefault + + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis + + [Chris "Koying" Browet] + * FIX: proper casting of file time TZ adjustment + + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Mike Frysinger] + * TexturePacker: use $PKG_CONFIG + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard + + [Anton Fedchin] + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. + + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 + + [Memphiz] + * [cosmetics] - fixed typos + + [Memphiz] + * [ios] - fix mapping of 3 finger taps + + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not + + [montellese] + * GroupUtils: add additional overloads for more control over the result + + [montellese] + * GroupUtils: remove unused GroupAndSort() + + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims + + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation + + [DaveTBlake] + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Kolja Lampe] + * [video] Don't save scraper settings if we exit out and not select the "ok" button + + [anaconda] + * [video] Fix content type for special://videoplaylists + + [Chris "Koying" Browet] + * FIX: [droid;storage] check readability last + + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do + + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values + + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). + + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme + + [Martijn Kaijser] + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [fritsch] + * AESinkPULSE: Workaround Delay issues in PA Server + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + + [Martijn Kaijser] + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& + + [Kai Sommerfeld] + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers + + [Thomas Amland] + * [addons] add missing implementations of IsInUse + + [Thomas Amland] + * [addons] add missing implementations of SetDefault + + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis + + [Chris "Koying" Browet] + * FIX: proper casting of file time TZ adjustment + + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard + + [Anton Fedchin] + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. + + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 + + [Memphiz] + * [cosmetics] - fixed typos + + [Memphiz] + * [ios] - fix mapping of 3 finger taps + + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not + + [montellese] + * GroupUtils: add additional overloads for more control over the result + + [montellese] + * GroupUtils: remove unused GroupAndSort() + + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims + + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation + + [DaveTBlake] + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Chris "Koying" Browet] + * FIX: [droid;storage] check readability last + + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do + + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values + + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). + + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme + + [Martijn Kaijser] + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [xhaggi] + * [cleanup] removes unused actions + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [xhaggi] + * [cosmetics] removes left-over enum WINDOW_TYPE in CGUIWindow + + [xhaggi] + * [gui] adjusts log level for the window activation refused message + + [xhaggi] + * [gui] introduce a dialog modality type to differ between modalities + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [xhaggi] + * [cosmetics] removes left-over enum WINDOW_TYPE in CGUIWindow + + [xhaggi] + * [gui] adjusts log level for the window activation refused message + + [xhaggi] + * [gui] introduce a dialog modality type to differ between modalities + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [hudokkow] + * [pvr.mythtv] Bump add-on to 2.4.0 + + [Matthias Kortstiege] + * [favourites] handle pictures via showpicture builtin + + [Sam Stenvall] + * [pvr] refactor the way information about the currently active PVR client is determined in CPVRGUIInfo. Instead of querying the current client directly we ask CPVRClients to give us a summary (SBackend) of each connected client. These summaries are safe to loop over no matter what happens to the actual clients in the mean time. Fixes trac #15942 + + [h.udo] + * [gitigonre] Another android artifact + + [h.udo] + * [libplatform] Bump to 1.0.10 + + [h.udo] + * [pvr] Bump all add-ons (libplatform update) + + [ronie] + * [Confluence] fix label width + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [xhaggi] + * [cosmetics] sort ctor in CPVRChannelGroup + + [xhaggi] + * [pvr] fix CPVRChannelGroup::OnSettingChanged won't get called + + [Chris "Koying" Browet] + * CHG: [droid] add external storage path to initial status log + + [Chris "Koying" Browet] + * FIX: [droid] limit 4K to Shield TV + allow override + + [Martijn Kaijser] + * [pvr] bump add-ons + + [xhaggi] + * [pvr] fix: delete of empty group with an invalid id ends up in deleting the wrong group + + [montellese] + * fix some warnings concerning type mismatches + + [Chris "Koying" Browet] + * FIX: [droid] properly handle sys vol going to 0 (fixes #16069) + + [Chris "Koying" Browet] + * FIX: [droid] fix volume handling + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [xhaggi] + * [pvr] sort equal client channel numbers by name if not sub-channels + + [Zapata11] + * Added lithuanian keyboard layout + + [Martijn Kaijser] + * [lang] fix typo + + [Chris "Koying" Browet] + * FIX: [droid] prevent the os restarting us for "screenlayout" and "screensize" + + [popcornmix] + * [omxplayer] Change in interlace state is not an error in log + + [Chris "Koying" Browet] + * FIX: [droid] fix crash when restarted by system + + [Matthias Kortstiege] + * [videodb] fix yet some more query typos + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] automatic cosmetics for the en_gb language file + + [txtranslation] + * [lang] update of internal addon language files + + [Sam Stenvall] + * [pvr] bump pvr.vbox to 1.3.4 + + [mapfau] + * [pvr] get rid of fixed internal group ids + + [Matthias Kortstiege] + * [videodb] use GetNavCommon for tags + + [Matthias Kortstiege] + * [addons] force repository update in post-install/uninstall + + [fritsch] + * Wasapi: Do not probe for AE_FMT_AAC - we don't passthrough it anyways + + [arnova] + * fixed: Don't do GetLength() off-thread is it may be (b)locked by a pending read() (fixes #16046) + + [ace20022] + * [dvdplayer][fix] Initialize SelectionStream members. This fixes the issue that any external subtitle is recognized as forced. + + [balmeras] + * [libexif] Ignore invalid DMS value in GPS coordinate, and fix kodi crash due to buffer overflow with special value FFFFFF + + [Tobias Markus] + * Various cppcheck perf fixes + + [Sam Stenvall] + * [pvr] bump pvr.vbox to 1.3.3 + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Sam Stenvall] + * [confluence] increase button group height in the PVR group manager dialog, fixes "Add group" being hidden + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [h.udo] + * [pvr.wmc] Fix android lib name (fixes #16044) + + [Anton Fedchin] + * [GL] Fixed: FontTTF breaks scissor which causes bad rendering with dirty regions. + + [montellese] + * music library: don't force a rescan after update past version 35 if not needed + + [montellese] + * video library: only allow to scan sources which have a content set + + [montellese] + * video library: show "Set content" even during library scan (fixes #16061) + + [Chris "Koying" Browet] + * FIX: [droid] harden MigrateUserData + + [Chris "Koying" Browet] + * FIX: [amc] clear pending exceptions on exit + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [Chris "Koying" Browet] + * FIX: [amc;hevc] let CBitstreamConverter decide + + [Kai Sommerfeld] + * [pvr] bump pvr.hts to 2.1.12 + + [Memphiz] + * [osx/cocoa] - revert 0f32a2f5d4fb1077def8c581098aa4385e8d0a67 (it is prone to deadlocking because it blocks the gui/main thread) and instead trust in the openglcontext which is tracked by windowing. Fixes deadlock introduced by PR #7143 + + [Memphiz] + * [windowing/osx] - expose the current NSOpenGLContext tracked by windowing to the outside via a getter + + [Chris "Koying" Browet] + * FIX: [droid] return type mismatch when launching ext app + + [Anton Fedchin] + * [builtins] do not restart visualization if it has no settings. + + [Anton Fedchin] + * [keymaps] Use Addon.Default.OpenSettings instead of ActivateWindow for visualization settings. + + [Anton Fedchin] + * [win32][curl] Using CEnvironment::unsetenv() instead of SetEnvironmentVariable. It's proper way to unset environment variable. + + [Martijn Kaijser] + * [lang] Remove line breaks used in dialogs + + [Kai Sommerfeld] + * [pvr] bump pvr.hts to 2.1.11 + + [Matthias Kortstiege] + * [videodatabase] fix invalid queries (closes #16054) + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [Rainer Hochecker] + * dvdplayer: fix vc1 hwaccel like vdpau - work around an ffmpeg issue + + [BigNoid] + * [lang] Fix overlapping kaitoast messages + + [phate89] + * Honor "ignorethewhensorting" + + [Sam Stenvall] + * [pvr] bump pvr.hts to 2.1.10 + + [Anton Fedchin] + * [win32] Fixed libcurl initialization when the env variable OPENSSL_CONF points to existing openssl.conf file. + + [Rainer Hochecker] + * dvdplayer: fix ff/rw after ea6e82997bd6087a7beff1be0ef9b34847fe3cc7 + + [uNiversaI] + * [confluence] add missing video codec flags + + [Sam Stenvall] + * consider a CURLINFO_RESPONSE_CODE of zero a failed request + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v1.3.2 + + [fape] + * [Confluence] fix long filenames in subtitles search&download dialog header + + [ace20022] + * [cosmetics] Fix code formatting of ScanArchiveForSubtitles. + + [ace20022] + * [subs][perf] Make ScanArchiveForSubtitles more performant: - Rearrange the list of subtitle extension - Add break/continue to loops + + [Rainer Hochecker] + * dvdplayer fix sorting of subtitles - fixes trac 16038 + + [popcornmix] + * [utils] Disable fast_memcpy which is slower than memcpy + + [ace20022] + * [Fix][subs] Fix checking zip archives in zip archives. + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Martijn Kaijser] + * bump to 15.0 rc1 + + [ronie] + * add the option to conditionally include files + + + [Martijn Kaijser] + * bump to 15.0 rc1 + + + [Martijn Kaijser] + * [addons] sync with repo + + [Chris "Koying" Browet] + * FIX: [droid] proper audio focus management + + [Rainer Hochecker] + * renderer: fix subtitle (text) positions for alignment outside video, consider height of text + + [Pär Björklund] + * make sure that we don't set values when there was no node, we have no idea what will be in value if that happens. closes #16040 + + [Rainer Hochecker] + * renderer: fix overlapping subtitles for alignments other than fixed + + [Rainer Hochecker] + * renderer: fix mixed-up rd/rv after fd53c703d96d9beec2ccf4e5982bd91aafc29be2, resulted in wrong subtitle positions + + [Chris "Koying" Browet] + * ADD: [droid] standard refreshrate switcher (>= api 21) + + [Chris "Koying" Browet] + * FIX: [aml] remove obsolete audio latency hack + + [Martijn Kaijser] + * [android] hide certain settings which are non functional + + [ace20022] + * [log] Reduce log spam from ScanArchiveForSubtitles. + + [Sam Stenvall] + * [pvr] bump addons + + [popcornmix] + * [players] Remove not working SetPriority calls + + [AlwinEsch] + * [epg] Remove usage of 'using namespace std' + + [xhaggi] + * [seek] fix: reset seek size after seeking + + [AlwinEsch] + * [epg] Sort included files alphabetical + + [xhaggi] + * [video] de-duplication/cleanup of related database tables + + [Tobias Markus] + * Followup fix for CID1272226 + + [xhaggi] + * [database][mysql] insert char set for CREATE TABLE .. SELECT syntax between create table and select clause + + [xhaggi] + * [video] limit length of name to 255 for actor, country, genre etc. + + [Tobias Markus] + * Remove const keyword from CDVDInputStreamPVRManager::GetSelectedChannel() Fixes CID 1272226 + + [AlwinEsch] + * [pvr] Remove not needed trailing spaces + + [xhaggi] + * [rfc][json-rpc] use setter of CVideoInfoTag + + [xhaggi] + * [video] fix leading/trailing whitespaces in video details + + [Martijn Kaijser] + * [cosmetics] improve English strings + + [AlwinEsch] + * [epg] Remove call a bit + + [arnova] + * changed: Properly exit screensaver on shutdown (fixes #16028) + + [Memphiz] + * [windowing/osx] - check the pointer of the displayname before accessing the string object - fixes bad access when turing off the TV while Kodi is running + + [Kai Sommerfeld] + * Revert "[pvr] changed: ask if the user wants to disable libCEC if no TV couldn't be found for 30 seconds" + + [Sam Stenvall] + * [pvr] matching EPG tag pointers means an absolute match between a timer and an EPG tag + + [Chris Browet] + * FIX: [aml;droid] only bother with REALVIDEO intent if the permissions are right + + [Chris "Koying" Browet] + * ADD: [droid] generically use hdmi resolution (4K) + + [Chris "Koying" Browet] + * ADD: [jni] CJNISystemProperties + + [Kai Sommerfeld] + * [PVR] Fix crash in PVR::CPVRClient::GetDriveSpace, take two (Trac #15942) + + [MilhouseVH] + * [videodb] Add missing argument on JSON filter PrepareSQL() + + [Martijn Kaijser] + * get rid of g_localizeStrings in Dialogs + + [xhaggi] + * [pvr] return empty info label for season and episode less than 1 + + [Martijn Kaijser] + * combine split strings into a single string and only use the textbox in dialogs + + [ace20022] + * [Fix][subs] Don't try to read vob sub files (without a corresponding idx file) like text based sub files. + + [xhaggi] + * [gui] unify method overloads in CGUIDialogYesNo + + [xhaggi] + * [cosmetics] format and add docs in CGUIDialogYesNo + + [uNiversaI] + * [binary addons] bump audio decoders + + [Chris "Koying" Browet] + * FIX: [droid] re-establish immersive mode if it was reset + + [ronie] + * [re-touched] update + + [Pär Björklund] + * addon.xml was written as ucs2 with bom as that is the default output from powershell, changed it to specify utf8 without bom + + [Kai Sommerfeld] + * [PVR] Fix crash in PVR::CPVRClient::GetDriveSpace (Trac #15942) + + [ronie] + * add new pvr infolabels + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] automatic cosmetics for the en_gb language file + + [txtranslation] + * [lang] update of internal addon language files + + [wsnipex] + * [binary addons] bump audio encoders + + [montellese] + * CLangInfo: don't detect a language migration from "English" to "resource.language.en_gb" as a fallback mechanism + + [Pär Björklund] + * Rebuild curl with openssl support instead of windows schannel to fix the deadlock on win32. Rebuilt using latest curl 7.42.1 and openssl 1.0.2a + + [ace20022] + * Revert "[Fix][subs] Don't try to read a vob sub file without a corresponding idx file." + + [uNiversaI] + * revert ecea1fff0 + + [Matthias Kortstiege] + * Revert "[guilib] fadelabel not reading scroll tag" + + [wsnipex] + * [cmake] removed multi-arch again, its not needed anymore + + [wsnipex] + * [binary addons] use kodi core install paths by default + + [xhaggi] + * [gui] render dialog teletext always on top + + [arnova] + * changed: When emptyng Curl's overflow buffer, shrink overflow buffer + tweaks + + [Rainer Hochecker] + * dvdplayer: avoid seek to sync after unpause + + [Ben Avison] + * Fix for font corruption + + [Rainer Hochecker] + * dvdplayer: sanity checks for current time + + [fritsch] + * RenderManager: Fix Gui Layer Update + + [fritsch] + * IMX: Fix 3D rects v20 + + [fritsch] + * IMX: Reorder in initialization list + + [Kai Sommerfeld] + * [cec] Fix return value handling logic for CEC_TV_PRESENT_CHECK_TIMEOUT dialog. + + [ace20022] + * [Fix] Fix a std::out_of_range exception when the sum of seek steps is zero. + + [Rainer Hochecker] + * dvdplayer: do not signal started until output of first frame + + [hrotkogabor] + * PinnacleSysPCTVRemote remote keys for lirc 0.9 + + [wsnipex] + * [depends] fix Xrandr pkg-config includes on linux + + [xhaggi] + * [pvr] fix CPVRDirectory::Exists always returns false (fixes 15997) + + [Max Kellermann] + * configure.ac: detect libxrandr with pkg-config + + [Max Kellermann] + * WinSystemX11: make XRandR mandatory + + [Max Kellermann] + * tools/depends/target/Makefile: add links to X RandR pkg-config files + + [Max Kellermann] + * configure.ac: simplify $host_vendor=apple special cases + + [Joseph A. Yasi] + * [powermanagement] Choose powermanager with the most features on Linux. + + [ace20022] + * [Fix][subs] Don't try to read a vob sub file without a corresponding idx file. + + [montellese] + * upnp: fix hiding watched tvshows and seasons + + [montellese] + * upnp: fix watched overlay for tvshows and seasons + + [Martijn Kaijser] + * [addons] update scrapers + + [Martijn Kaijser] + * [droid] Bump targetSdkVersion to Android 5.1 (API 22) + + [montellese] + * show the startup dialogs informing about the fallback language and the migrated userdata once the user interface is really ready for usage + + [montellese] + * added GUI_MSG_UI_READY message to notify everyone when the user interface is ready for usage + + [uNiversaI] + * [strings] info -> information + + [Martijn Kaijser] + * Combine multiline strings into one string which will be placed in the textbox input. Also add additional comments in strings.po + + [Pär Björklund] + * fixed gtest build that broke with kissfft + + [uNiversaI] + * [confluence] cleanup unused files + + [uNiversaI] + * [sourcesDirectory][Util] separate DefaultDVDRom from defaultDVDFull + + [uNiversaI] + * [confluence] add new & update Default* icons + + [Thomas Amland] + * fix kaitoast dialog loading the previous icon instead of the default when no icon or type is passed + + [ace20022] + * [win32] Fix crash after 8e1f62cc1b80918d723edc40e7b2a903cbef96e2 due to cdio logging. + + [Matthias Kortstiege] + * [addons] fix toast dialog showing wrong icon on install errors + + [the-hydra] + * Fixed makefile ARCH install bug + + [Matthias Kortstiege] + * [subs] skip directory cache read to ensure we're picking up subtitles (fixes #15989) + + [Martijn Kaijser] + * always use the DialogOK with the textbox input instead of separate lines + + [ace20022] + * [windows] Cleanup includes. + + [ace20022] + * [windowing] Cleanup includes. + + [ace20022] + * [win32] Cleanup includes. + + [ace20022] + * [view] Cleanup includes. + + [ace20022] + * [video] Cleanup includes. + + [ace20022] + * [utils] Cleanup includes. + + [ace20022] + * [storage] Cleanup includes. + + [ace20022] + * [settings] Cleanup includes. + + [ace20022] + * [rendering] Cleanup includes. + + [ace20022] + * [pvr] Cleanup includes. + + [ace20022] + * [programs] Cleanup includes. + + [ace20022] + * [profiles] Cleanup includes. + + [ace20022] + * [powermanagement] Cleanup includes. + + [ace20022] + * [playlists] Cleanup includes. + + [ace20022] + * [pictures] Cleanup includes. + + [ace20022] + * [peripherals] Cleanup includes. + + [ace20022] + * [music] Cleanup includes. + + [ace20022] + * [listproviders] Cleanup includes. + + [ace20022] + * [interfaces] Cleanup includes. + + [ace20022] + * [input] Cleanup includes. + + [ace20022] + * [guilib] Cleanup includes. + + [ace20022] + * [filesystem] Cleanup includes. + + [ace20022] + * [dialogs] Cleanup includes. + + [ace20022] + * [dbwrappers] Cleanup includes. + + [ace20022] + * [cdrip] Cleanup includes. + + [ace20022] + * [addons] Cleanup includes. + + [ace20022] + * [epg] Cleanup includes. + + [ace20022] + * [app] Cleanup includes. + + [Trent Nelson] + * Pivos: Don't use dir cache on Android App list + + [Chris "Koying" Browet] + * CHG: [droid;kbd] log ignored keys + + [Chris "Koying" Browet] + * FIX: [droid;sound] restore volume after passthrough + + [Chris "Koying" Browet] + * FIX: [droid] possible fix for localtime crash + + [Chris "Koying" Browet] + * ADD: add a fallback site for internet detection + + [Martijn Kaijser] + * [string] several grammar fixes + + [Martijn Kaijser] + * [strings] fix wrong setting description + + [hudokkow] + * [pvr] Bump filmon, dvblink and vbox + + [Rainer Hochecker] + * [pvr] bump vnsi + + [uNiversaI] + * [strings] fix curly brakets and rename setting + + [xhaggi] + * [input] drop fallback window configuration for fullscreeninfo dialog + + [fritsch] + * WinSystemX11: Properly initialize fps value - it might not be set at all + + [Michael Cronenworth] + * Always declare gnu89 inline standard + + [Sam Stenvall] + * [pvr] bump pvr.vbox + + [Memphiz] + * [osx/windowing] - properly track lastdisplay id when window is moved between screens (else GetCurrentScreen might return the wrong cached index) + + [Memphiz] + * [osx/DisplaySettings] - if strOutput in the resolution info is not empty - show this as displayname in the settings ui + + [Memphiz] + * [osx/windowing] - set screen name in resolution infos + + [Memphiz] + * [osx/windowing] - track current refreshrate of the screen and make sure rest of the system is notified via XBMC_RESIZE for all use cases (fullscreen1 to fullscreen1, fullscreen1 to windowed1, windowed1 to windowed2, windowed1 to fullscreen2, fullscreen2 to windowed1) + + [Memphiz] + * [ApplicationMessenger] - add TMSG_VIDEORESIZE for beeing able to notify resize from non application thread + + [Memphiz] + * [osx/windowing] - update resolutions when plugging/unplugging displays + + [Memphiz] + * [osx/windowing] - don't get the display_id from the current window but obey the screenIdx parameter when querying the current resolution of a screen (else we always query the first screen even if we want to get the resolution of the newly attached second screen for example) + + [Memphiz] + * [osx/videosync] - call our UpdateClock with our hostcounter, but calc vblank with the corevideo hostcounter (at the end they might be the same) + + [Memphiz] + * [osx/videosync] - implement RefreshChanged - allows to pickup new videoref after changing displays during playback + + [Memphiz] + * [osx/videosync] - move calls to displaylink init/deinit into the vsync thread and make sure that init is only called once the display reset is done - same as GLX does + + [Memphiz] + * [osx/cocoa] - ensure that gl context is fetched via mainthread (fixes wrong vsync on external displays) + + [Rainer Hochecker] + * dvdplayer: fix unused variable after e1b2c94049fa34bc9de7d067ae2206643fe73f63 + + [Martijn Kaijser] + * [strings] add files where string id is used + + [montellese] + * CLocalizeStrings: unify fallback language handling (fixes skin strings loading) + + [Rainer Hochecker] + * videorefclock: DRM - listen to refresh change events + + [Rainer Hochecker] + * X11: set refresh rate in gfx context, fixes fps for windowed mode + + [Rainer Hochecker] + * guilib: add method for setting fps, currently fps defaults to 60hz in windowed mode which is wrong + + [uNiversaI] + * emergency fix strings bracket on tag wrong way around + + [uNiversaI] + * emergency fix: missing slash on close [/B] tag + + [montellese] + * addons: fix fallback language handling for metadata + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] automatic cosmetics for the en_gb language file + + [uNiversaI] + * [skin strings] fix remnant strings issues + + [uNiversaI] + * [strings] take 3 - capitalization & other string fixes + + [h.udo] + * [PVR] Bump add-ons to fix debian packaging + + [Rainer Hochecker] + * dvdplayer: more ff/rw fixes + + [txtranslation] + * [lang] update of internal addon language files + + [Matthias Kortstiege] + * [stacking] skip folder stacking entirely in case no patterns available + + [wsnipex] + * [depends] fix (lib)platform build + + [Rainer Hochecker] + * renderer: fix wrong subtitle position when not fullscreen + + [hudokkow] + * [audiodecoders] update to use libplatform + + [Chris "Koying" Browet] + * FIX: [stf;3D] stagefright is no longer flipped in Y + + [Rainer Hochecker] + * ffmpeg: fix 8ch audio conversion on Windows + + [Martijn Kaijser] + * bump to 15.0 rc1 + + [Thomas Amland] + * [sounds] use a better name than 'default' for sounds bundled with skin + + [Thomas Amland] + * [sounds] dont allow 'skin default' option to be selected when active skin doesnt provide sounds + + [Martijn Kaijser] + * [stings] Improve sentence for CEC settings + + [Pär Björklund] + * A possible fix for looping over a modified vector + + [Tobias Markus] + * Fix coverity #1287129 + + [Lars Op den Kamp] + * rebuilt libcec against the latest platform lib + + [Lars Op den Kamp] + * bump libplatform to 1.0.9 and include xbmc-addons.include when building it in depends + + [h.udo] + * [pvr] bumps addons to use libplatform + + [Kai Sommerfeld] + * Fixed CGUIControlButtonSetting::Update handling for CSettingAction + + [c3n] + * Added KEY_PLAYCD and KEY_PAUSECD for linux support of bluetooth headphone buttons + + [Chris "Koying" Browet] + * FIX: [audiotrack] proper detection of supported sample rates + + [Chris "koying" Browet] + * FIX: [gles] don't compile BOB OES shader if not supported + + [xhaggi] + * [cosmetics] corrects format + indentation + + [xhaggi] + * [gui] force activate fullscreen window with CApplication::SwitchToFullScreen() + + [xhaggi] + * [gui] force activate window screen calibration in CGUIDialogVideoSettings + + [Tobias Markus] + * Fix coverity #719001 + + [Arne Morten Kvarving] + * fix string + + [Memphiz] + * [rfft] - implement d'tor + + [xhaggi] + * [gui] introduce new force window activation which do not check for active modals + + [smallint] + * [imx] RGB -> BGR for RenderCapture + + [Philipp Te] + * [Confluence] - improved value order for "rating" variable + + [Memphiz] + * [jenkins] - make building of binary addons verbose for getting more compelte build output + + [uNiversaI] + * [README] fix typo coding -> code + + [uNiversaI] + * [contributing.md] some cleanup and updating + + [Anton Fedchin] + * [win32] WinRenderer: Fix possible memory leak. + + [Philipp Te] + * [Confluence] - fix some invalid values / fonts + + [Thomas Amland] + * [configure] fix python version check and add py3k check + + [Thomas Amland] + * update ax_python_devel.m4 to rev 17 + + [Memphiz] + * [fft/viz] - replaced our buggy fft implementation with rfft + + [Memphiz] + * [fft] - added kissfft based rfft implementation and unit tests for it + + [popcornmix] + * [mmalrenderer] Fix for stereo view modes + + [popcornmix] + * [renderer] Fix for number of surfaces being passed to codec + + [arnova] + * changed: Improve HTTP dir error logging + + [arnova] + * changed: Prevent Curl log spam with Webdav + only retry without range with http error 416 + + [Memphiz] + * [contrib] - added contrib dir and kissfft sources + + [Thomas Amland] + * [addons] add progress dialog for repo updates + + [Thomas Amland] + * [extendedprogressbar] fix possible division by zero + + [Thomas Amland] + * [ProgressJob] add HasProgressIndicator + + [Thomas Amland] + * [ProgressJob] let ShouldCancel update progress in non-modal dialogs + + [Thomas Amland] + * [addons] remove unused code + + [uNiversaI] + * [strings] capitalized second/third word + + [uNiversaI] + * [strings] typos/misspellings/cleanup and cosmetics. + + [Thomas Amland] + * [addons] add icon for info provider group + + [Stephan Raue] + * [AML] add support for aml-linux.xml and aml-android.xml settings file + + [Memphiz] + * [keymapping/joystick] - fix the annoying error logging which is logged in accident because altname tags are tried to be treated like mappings + + [smallint] + * IMX: Attempt to revert last buffer alignment change and to improve it + + [Memphiz] + * [KeyMapping/Joystick] - fix regression introduced in https://github.com/xbmc/xbmc/pull/5624 - allow to overwrite joystick mappings with user keymaps again + + [Hofi] + * OS X Kodi.app script target transformed into a real app bundle target + + [Rainer Hochecker] + * vaapi: prevent from draining msg queue if we ran out of surfaces + + [popcornmix] + * [mmalcodec] Limit submitted video frames. + + [popcornmix] + * [SinkPi] Handle multichannel layout more like OMXAudio + + [Memphiz] + * [keymaps/touchscreen] - add touchscreen mappings for WindowScreenCalibration + + [Memphiz] + * [WindowScreenCalibration] - make it touch gesture compatible + + [Rainer Hochecker] + * dvdplayer: fix calc for frame dropping when going ff + + [popcornmix] + * [mmalrenderer] Remove release thread - it is no longer required + + [popcornmix] + * [mmalrenderer] Add shared lock around MMAL operations + + [popcornmix] + * [mmalcodec] Add shared lock around MMAL operations + + [popcornmix] + * [mmalcodec] Remove DVDVideoCodecMMAL wrapper + + [popcornmix] + * [mmal] Separate the buffers from the decoder so decoder can be destroyed first + + [popcornmix] + * [mmalrenderer] Separate mmal and renderer configured flags + + [popcornmix] + * [mmal] Move the image pool from decoder to renderer + + [popcornmix] + * [mmal] Add some sanity checks to mmal flags + + [popcornmix] + * [mmal] Enable zero copy + + [popcornmix] + * [mmalcodec] Handle resolution change from callback + + [popcornmix] + * [mmalcodec] Return mmal buffers explicitly + + [arnova] + * changed: Log in case script does not exist + + [popcornmix] + * [mmalcodec] Remove dropping logic. It only seems to make things worse + + [montellese] + * media library: fix lost filter path due to re-creating the path history (fixes #15746) + + [montellese] + * CDirectoryHistory: make sure to set the filter path even if the path is already in the history + + [Sascha Kuehndel (InuSasha)] + * [skin.confluence] fix overlapping mute-bug in FullscreenVideo/OSD + + [popcornmix] + * renderer: Use a structure for information passed from renderer to codec + + [popcornmix] + * [pi/players] Make use of new scheme to submit DTS timestamps + + [wsnipex] + * [cmake] add libplatform to kodi-platform depends + + [Rainer Hochecker] + * Revert "[ActiveAE] - ActiveAESink: Change several LOGNOTICE to LOGDEBUG to reduce kodi.log "spamming"." - settings are not loaded at this time and debug logs go to nirvana + + [Hofi] + * Fixed OS X i386 Xcode builds on x86_64 build machines + + [fritsch] + * IMX: Fix path to edid on default imx kernel + + [Martijn Kaijser] + * update re-Touched skin + + [fritsch] + * SysfsUtils: don't create files when writing values - silence warnings + + [Rainer Hochecker] + * dvdplayer: fix display time after 43b6cf683abf16bc41e9b7f624a678c285c85c97 + + [Rainer Hochecker] + * addons: pvr and audiodecoder are optional addons, disable by default + + [uNiversaI] + * [README.pvr] update/point to compile procedures + + [uNiversaI] + * [README.linux] update/cleanup - keep up with current code + + [uNiversaI] + * [remote] add support to delete in MyPictures via remote + + [Anton Fedchin] + * [win32] Fix: CWinIdleTimer::StartZero - do not set ES_SYSTEM_REQUIRED and ES_DISPLAY_REQUIRED if DPMS is active. + + [Arne Morten Kvarving] + * fixed: make sure we don't match a substring of an extension or a mime type + + [Pär Björklund] + * Fixed msg 31117 to match 31116 + + [uNiversaI] + * [strings] fix capitalized second/third word + + [hudokkow] + * Ignore android build artifact + + [John Rennie] + * Allow uppercase input via SMS + + [Philipp Te] + * Control.cpp: remove trailing whitespaces + + [Philipp Te] + * Python: ControlList - add ALL items to the list + + [arnova] + * Revert "[davfile] use PROPFIND for Stat() and Exists()". Proper fix will follow later. + + [xhaggi] + * [messenger] fix wrong parameter usage for TMSG_GUI_WINDOW_CLOSE + + [xhaggi] + * [addons] fix launch addon from within CGUIDialogAddonInfo + + [Max Kellermann] + * configure.ac: pass $CFLAGS to $CC in XB_FIND_SONAME + + [Max Kellermann] + * configure.ac: do Darwin specific check only on Darwin + + [ronie] + * [Confluence] fix misaligned date label + + [Memphiz] + * [cmake] - only evaluate the sudo check on linux. On darwin with cmake 2.8.12 the execute_process with the multiple commands inside doesn't seem to work (it detects that it needs sudo and so it doesn't install into the addons dir). Bumping to cmake 3.2.2 was an other solution which made it work but bumping cmake is considered to dangerous at this stage. Fixes missing addons on ios and osx builds. + + [Chris "koying" Browet] + * FIX: [sysfs] do not try to create files + + [Sam Stenvall] + * [pvr] change "recording deleted" to "timer deleted" to avoid confusion + + [Stephan Raue] + * [AML] fix sysfs path for permissions check + + [Lars Op den Kamp] + * [cec] bump to libCEC 3.0.0 + + [Chris "Koying" Browet] + * FIX: [gles;font] do not clip rotated text + + [arnova] + * fixed: Don't try to delete empty filename + + [Sascha Kuehndel (InuSasha)] + * [Skin] optimitation for picons in livetv many picons have transparent background and an other dimention as cover images. - no border around picon in fullscreen - center picon vertical, and adjust vertical position + + [Garrett Brown] + * [cosmetic] Debug log: fix typo in units + + [Rainer Hochecker] + * dvdplayer: make sure not to block more than 50ms in renderer when ff/rw + + [Rainer Hochecker] + * dvdplayer: make sure not to display frames with pts > pts at screen when rw + + [Rainer Hochecker] + * dvdplayer: use time of frame on screen for displayed time + + [ronie] + * [Confluence] make button focusable with a mouse - fixes #15955 + + [Violet Red] + * Fix: Queue item not working for music videos + + [Chris "Koying" Browet] + * FIX: [droid] tweak storage stat display + + [Chris "Koying" Browet] + * FIX: [droid] rework storage provider + + [uNiversaI] + * [resource.ui.sounds.confluence] give distinguishing name and add icon + + [Martijn Kaijser] + * bump to 15.0 beta2 + + [Sam Stenvall] + * [pvr] change the way the "recording deleted/completed" message is determined. Instead of looking at timestamps we look at the last known state of the timer, which is way more reliable. + + [phate89] + * Fix series optical media files + + [taxigps] + * add advanced setting assfixedworks + + [phate89] + * Honor episode bookmarks in bd simple menu + + [montellese] + * upnp: fix renderer's PlayMedia() + + [Daniel] + * Add romanian keyboard layout + + [Matthias Kortstiege] + * [videodb] consider removable drives when checking for matching source during library cleanup + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [montellese] + * upnp: add a setting to allow users to enable looking for external subtitles in the ContentDirectory implementation + + [montellese] + * upnp: only look for and provide external subtitles for players and renderers + + [montellese] + * upnp: introduce UPnPService and pass them to BuildObject() + + [montellese] + * upnp: cosmetics in UPnPInternal.h/cpp + + [Matthias Kortstiege] + * [recentlyadded] no need to fetch artist separately + + [Arne Morten Kvarving] + * added: allow setting connection timeout for curl urls through a protocol option + + [popcornmix] + * alsalib: Build with enable-shared + + [NedScott] + * Allow smaller minimal subtitle size in settings.xml + + + [uNiversaI] + * [resource.ui.sounds.confluence] give distinguishing name and add icon + + [Martijn Kaijser] + * bump to 15.0 beta2 + + + [Martijn Kaijser] + * update splash image for beta + + [hudokkow] + * [pvr] Add new pvr.stalker add-on + + [Rainer Hochecker] + * ActiveAE: slightly reduce buffer size + + [xhaggi] + * [seekhandler] use only the first step forward/backward for a seek without a delay + + [xhaggi] + * [seekhandler] refactors GetSeekSeconds() to not update member m_seekStep + + [xhaggi] + * [seekhandler] don't use process roundtrip for SeekSeconds() + + [xhaggi] + * [seekhandler] no need for member m_performingSeek as we use locks + + [popcornmix] + * [mmalrenderer] Fix initialisation of m_format in init_vout + + [Pär Björklund] + * curl uses fputs to write the header for it's cookie file + + [Sam Stenvall] + * [pvr] copy some group properties immediately when the group is loaded from the database, otherwise the new group will be marked as "changed" a bit further down which causes all groups to be persisted every time the PVR manager starts + + + [wsnipex] + * [linux] install UseMultiArch.cmake file + + [Brandon McAnsh] + * [droid;packagaing] Remove non-relevant comment + + [Anton Fedchin] + * [pictures] SlideShowPicture: fix texels to display only filled part of texture instead of displaying whole texture. + + + + [uNiversaI] + * [confluence] fonts, update licencing/copyright. + + [uNiversaI] + * [confluence] update roboto fonts + + + [xhaggi] + * [seekhandler] get rid of CGUIInfoManager dependency + + [xhaggi] + * [seekhandler] get rid of inaccurate seek size percent calculation + + [Anton Fedchin] + * [win32] CLog: Do not use FlushFileBuffers after each write to file which causes unnecessary performance penalties. + + [Rainer Hochecker] + * player: implement SeekTimeRelative, disable accurate seeking for relative seeks + + + + [Thomas Amland] + * [addons] lazy load translated context item label + + [Rainer Hochecker] + * videorefclock: fix deadlock in glx method + + [Thomas Amland] + * [addons] fix multiple edge cases of pre/post-(un)installing not working correctly for services/context items + + [Thomas Amland] + * [addons] move enabling/disabling responsibility out of database to manager + + [Thomas Amland] + * [addons] remove unused IsAddonInstalled method + + [Thomas Amland] + * [addons] remove dead code + + [wsnipex] + * [binary addons] use multi arch install paths + + [wsnipex] + * [configure] properly set multi arch kodi libdir in kodi-config.cmake + + + [Rainer Hochecker] + * dvdplayer: add missing msg handler for GENERAL_SYNCHRONIZE + + [Rainer Hochecker] + * dvdplayer: fix crash caused by GENERAL_SYNCHRONIZE messages + + [uNiversaI] + * [English language] typo capitalized second word + + [ronie] + * [re-touched] skin update + + [xhaggi] + * [keymaps] map ReloadKeymaps to shift+control+k and ToggleDebug to shift+control+d + + [NedScott] + * [keymaps] replace smallstepback with built-in Seek(-7) + + [ace20022] + * [AudioEngine] Cleanup includes. + + [ace20022] + * [DllLoader] Cleanup includes. + + [ace20022] + * [cores] Cleanup includes. + + [ace20022] + * [VideoRenderers] Cleanup includes. + + [ace20022] + * [PlayerCoreFactory] Cleanup includes. + + [ace20022] + * [ExternalPlayer] Cleanup includes. + + [ace20022] + * [paplayer] Cleanup includes. + + [ace20022] + * [dvdplayer] Cleanup includes. + + [montellese] + * jsonrpc: replace static Addon.Types type with dynamically created one to fix missing addon types + + [Sam Stenvall] + * add pvr.vbox (new PVR addon) + + [Rainer Hochecker] + * AE: fix init of resampler (remapper) after flush + + [Andrew Fyfe] + * FIX: update link between movie and tv shows when saving a movies details + + [Thomas Amland] + * [addons] dont show addons from disabled repos in 'All repositories' + + [xhaggi] + * [settings] adjusts seek steps default configurations + + [Memphiz] + * [input/touch] - when translating mapped touch events don't loose the actionstring so that builtin functions can be used. - fixes #15245 + + [xhaggi] + * [gui] move check of active modals before opening a new window from CBuiltins to CGUIWindowManager + + [Thomas Amland] + * [language] fix unescaped double quotes + + [Pär Björklund] + * Don't treat smb connections to same machine as a local path + + [Ryan Gribble] + * [pvr] Bump pvr.wmc to version 0.5.3 (PVR API 1.9.6) https://github.com/kodi-pvr/pvr.wmc/commit/37b4b292d56885489aa8949bd70b54babb41b898 + + [Rainer Hochecker] + * dvdplayer: do not check buffering levels while in dvd menu + + [fritsch] + * Application: Show passthrough indicator in passthrough mode + + [ronie] + * [Confluence] add DefaultAddonUISounds.png + + [h.udo] + * [VideoSyncIos.h] Typo + + [Rainer Hochecker] + * AE: only push valid buffers to m_discardBufferPools, fix segfault on close right after open of stream + + [Chris "Koying" Browet] + * FIX: passthrough volume warning no longer showed + + [Matthias Kortstiege] + * [switchplayer] fix multiple ghost choices in contextmenu + + [Rainer Hochecker] + * dvdplayer: proper flush when triggering resync after a stall + + [Matthias Kortstiege] + * [video] no need to re-fetch (and stack) directory in case we already know about it + + [ronie] + * [Confluence] last updated label + + [Shine] + * Don't delay subtitles by display latency + + [Thomas Amland] + * addonbrowser: change 'Required Dependencies' to just 'Dependencies'. Required sort of implied + + [Thomas Amland] + * addonbrowser: list 'all repositories' on top. regression after refactor + + [Thomas Amland] + * addonbrowser: disable broken/foreign filters outside of repository + + [Thomas Amland] + * addonbrowser: add categories (and 'all') to 'my addons' + + [Thomas Amland] + * addonbrowser: make internal functions static + + [Thomas Amland] + * addonbrowser: remove 'system addons' group. merge with my/deps + + [Thomas Amland] + * addonbrowser: hide info provider group if empty + + [Thomas Amland] + * addonbrowser: hide orphaned node if empty + + [Thomas Amland] + * addonbrowser: improve performance of orphan filtering + + [Thomas Amland] + * addonbrowser: move the more 'advanced' features to a manage sub-directory + + [Thomas Amland] + * addonbrowser: improve 'running addons'. check with script invocation manager if service is actually running + + [Thomas Amland] + * [infomanager] add listitem.endtime support for video items + + [Thomas Amland] + * addonbrowser: add 'Updated' window property containing the last datetime repositories was checked for updates + + [montellese] + * videodb: add a delete trigger for the files table + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' not working for episodes in directories + + [Glenn-1990] + * [confluence] shrink dialog as we have less items now + + [Rainer Hochecker] + * dvdplayer: reduce time for initial audio sync + + [popcornmix] + * [mmalcodec] Move port format setup into init_vout + + [popcornmix] + * [mmalrenderer] Move dec_input_port_cb into class + + [popcornmix] + * [mmalcodec] Remove ReturnBuffer function + + [popcornmix] + * [mmalcodec] Explicitly init variables + + [popcornmix] + * [mmal] Remove unused variables + + [popcornmix] + * [mmalcodec] Fix for inverted check for first frame + + [popcornmix] + * [mmalrenderer] Avoid blank frame on resolution change + + [popcornmix] + * [mmalrenderer] logging update and remove a warning + + [popcornmix] + * [mmalrenderer] Reset m_buffers on PreInit + + [popcornmix] + * [mmalrenderer] Add auto select as explicit deinterlace method + + [popcornmix] + * [mmalcodec] Also treat VS_INTERLACEMETHOD_NONE as disabled + + [popcornmix] + * [mmalrenderer] Add locking around m_droppedPics + + [popcornmix] + * [mmalcodec] Move m_output_busy into lock + + [popcornmix] + * [mmalrenderer] Avoid submitting a buffer to renderer twice + + [popcornmix] + * [mmalcodec] Explicitly use fast deinterlace for HD and reduce buffers allocated by 2 + + [xhaggi] + * [pvr] adds missing videoplayer info label for episode name + + [da-anda] + * [settings] only add a separator if it's not the first list item of the first settings group + + [Glenn-1990] + * [pvr] remove not used string + + [montellese] + * settings: fix position of musiclibrary.showallitems setting + + [popcornmix] + * [omxplayer] Handle failures from EmptyThisBuffer and FillThisBuffer + + [Matthias Kortstiege] + * [stringutils] do not capitalize after apostrophes + + [xhaggi] + * [pvr] expose timer epg info for listitem labels + + [montellese] + * CLangInfo: fix GetMeridiemSymbol to return the proper string based on the current 12/24-hour clock settings + + [popcornmix] + * [omxplayer] Limit subtitle updates to avoid closed caption stutters + + [popcornmix] + * rbp: Use new dispmanx function for vsync callbacks + + [popcornmix] + * [rbp] Add Pi 2 specific settings defaults + + [popcornmix] + * [omximage] Increase timeout - this is sometimes hit + + [popcornmix] + * [rbp] Disable analogue output of sink when passthrough is enabled + + [popcornmix] + * [OMXAudio] Make stereoupmix and fixed behave more like dvdplayer + + [Memphiz] + * [jenkins/win32] - enable webserver unit tests + + [dhacker29] + * android: Fix the readme to reflect the changes to bump SDK to 17 + + [Glenn-1990] + * [pvr] fix: no channel set error + + [Glenn-1990] + * [pvr] radio and tv are separated now.. + + [ronie] + * [Confluence] GlobalSearch: add EPG search support + + [ronie] + * [Confluence] fix header label + + [Stephan Raue] + * [IMX] EGLNativeTypeIMX.h: include EGL/egl.h to fix build after https://github.com/xbmc/xbmc/commit/c3116fdfd515b674242a44d0b0eadbe423ec5794 + + [Rainer Hochecker] + * dvdplayer: compare to absolute sync error, fix sync issues for large negative errors + + [Karlson2k] + * [depends] Update libmicrohttpd to SVN 35533. Should resolve WebServer shutdown issue. + + [Rainer Hochecker] + * dvdplayer: flush audio sync errors on resume and resync + + [Rainer Hochecker] + * dvdplayer audio: fix/improve calculation of playing pts + + [Rainer Hochecker] + * dvdplayer audio: do not consider dropped packets for sync error + + [xhaggi] + * [musicdb] improves performance for querying the album view + + [fritsch] + * Application: Don't slow down videos rendered on GuiLayer + + [Rainer Hochecker] + * dvdplayer: ffmpeg-vda - ignore silly 3-byte nal encoded files + + [Rainer Hochecker] + * dvdplayer: make ffmpeg vda default + + [Rainer Hochecker] + * dvdplayer: rework ffmpeg vda + + [Matthias Kortstiege] + * [davfile] use PROPFIND for Stat() and Exists() + + [da-anda] + * [settings] change logical order of some subtitle and EPG related settings + + [da-anda] + * [Language] remove obsolete strings + + [da-anda] + * [Language] shorten labels in system settings and make them less technical + + [da-anda] + * [Language] improve PVR labels + + [da-anda] + * [Language] shorten labels in services/network settings an make them less technical + + [da-anda] + * [Language] shorten labels in appearance settings + + [da-anda] + * [Language] shorten labels in audio settings and make them less technical + + [da-anda] + * [Language] shorten labels in video settings and make them less technical + + [da-anda] + * [Language] get rid of "EPG" and use "Guide" instead to be consistent + + [da-anda] + * [Language] use "information provider" instead of "scraper" to be consistent with addon manager category + + [da-anda] + * [Language] remove references to "Kodi" in settings labels where appropriate + + [Martijn Kaijser] + * [skin] Updated re-Touched + + [Rainer Hochecker] + * ffmpeg: bump to 2.6.2 + + [Rainer Hochecker] + * dvdplayer audio: proper handle resume if playspeed is already normal + + [Rainer Hochecker] + * AE: flush resampler when flushing buffers + + [Rainer Hochecker] + * dvdplayer: improve audio sync for large packet durations + + [Rainer Hochecker] + * [PVR] disable thumb extraction for pvr recordings + + [ronie] + * add library://music path + + [Matthias Kortstiege] + * [videoinfoscanner] re-scrape season art for newly added seasons + + [Matthias Kortstiege] + * [videoinfodownloader] adds scrapers GetArtwork method + + [Matthias Kortstiege] + * [scraper] added GetArtwork function + + [Chris "Koying" Browet] + * FIX: [droid] amlcodec scale after aml egl + + [Chris "koying" Browet] + * FIX: [eg] only compile what's necessary per platform + + [Chris "Koying" Browet] + * ADD: [droid;aml+rk] specific aml and rk egl windowing for droid; allows framerate autoswitch + + [Chris "Koying" Browet] + * CHG: [droid] let the system handle volume + + [Chris "Koying" Browet] + * ADD: ACTION_VOLUME_SET to set absolute volume level + + [Rainer Hochecker] + * dvdplayer/omxplayer: protect live streams (pvr) from stalling + + [Rainer Hochecker] + * dvdplayer: cosmetics + + [Arne Morten Kvarving] + * fix wrong include path + + [Arne Morten Kvarving] + * add missing include in Encoder.cpp + + [Arne Morten Kvarving] + * add missing include in TestFileFactory + + [Arne Morten Kvarving] + * fixed: don't pass NULL pointer for boolean argument + + [Arne Morten Kvarving] + * fixed: bitwise and intended, not logical + + [Arne Morten Kvarving] + * fixed: give enum a name + + [Arne Morten Kvarving] + * add missing include + + [Arne Morten Kvarving] + * remove unused arrays and defines + + [Arne Morten Kvarving] + * fixed: quell pointer -> integer conversion warning + + [Arne Morten Kvarving] + * remove useless check + + [Chris "Koying" Browet] + * FIX: [egl;font] assert if cache texture was not created + + [Thomas Amland] + * [python] add DelayedCallGuard to xbmcvfs.listdir. closes #14212 + + [Thomas Amland] + * dont install sounds directory + + [Thomas Amland] + * improve consistency of gui sounds related strings + + [Matthias Kortstiege] + * [osx/ios] xcode sync for ui sound addons + + [Thomas Amland] + * [addons] hook up ui sound addons to the gui audio manager and settings + + [Thomas Amland] + * [addons] move sounds from confluence skin to a resource addon + + [Thomas Amland] + * remove bursting bubbles sounds (moved to addon repo) + + [Thomas Amland] + * [addons] add new ui sounds resource addon type + + [Violet Red] + * Include MusicVideos when creating playlists + + + [Memphiz] + * [osx/ios] - mention xcode 6.3 support in osx and ios readme + + [Memphiz] + * [osx/ios] - fix compilation with newest apple clang (xcode6.3) - disable forward declaration of boost containers (those broke compilation with c++11 and latest apple clang) + + [Memphiz] + * [depends/libffi] - pass the "don't use std asm" only to the CCASFLAGS - fixes configure failing to detect working c compiler in xcode6.3 + + [Matthias Kortstiege] + * [bookmarks] remove trailing semicolon + + [Memphiz] + * [depends/nettle] - disable build of testsuite (doesn't compile with clang from xcode6.3) + + [fritsch] + * IMX: Don't try to open width > 1920 hw is not capable to do so + + [fritsch] + * IMX: Only fallback to ffmpeg for AVC with level 3.0 - others are fine + + [fritsch] + * EGLNativeTypeIMX: Fix boolean return and close ifstream properly + + [xhaggi] + * [seek] improves instant seek in seek handler + + [fritsch] + * Only use videoplayer.limitguiupdate on Pi and IMX + + [Arne Morten Kvarving] + * added: 'volumeamplification' action to show slider + + [montellese] + * jsonrpc: add explicitly named parameters to Player.Seek and support seeking by a number of seconds + + [fritsch] + * IMX: Fix Screenshot v4 + + [fritsch] + * IMX: Warn once when frames are received but VPU detects interlaced content + + [xhaggi] + * [cosmetic] put statement of single line if to new line + + [xhaggi] + * [cpp] use c++ style casts in CSeekHandler + + [xhaggi] + * [builtin] adds new builtin for seeking + + + [Sam Nazarko] + * iMX: Only align dest Rects to 2 - cares for artifacts + + [fritsch] + * IMX: Read Text strings without trailing and leading n + + [Memphiz] + * [win32] - sync project + + [Arne Morten Kvarving] + * move CUtil tests to gtest unit tests + + [xhaggi] + * [xcode] sort IActionListerner.h alphabetically + + [ace20022] + * [dvdplayer] Use a message for AddSubtitle to prevent possible races. + + [ace20022] + * [dvdplayer][vob subs] Add better support for vob subtitles with multiple streams. + + [ace20022] + * [dvdplayer] Refactor AddSubtitleFile, i.e., remove unused parameter. + + + [AlwinEsch] + * [pvr.argustv] Bump pvr.argustv@96ee875 + + [ronie] + * [Confluence] unify filemanager list + + [ronie] + * [Confluence] cosmetics + + [fritsch] + * RPB: Adjust settings to also use new limitgui setting + + [fritsch] + * IMX: Add special settings file with render reduction + + [fritsch] + * Lang: Add ressources strings for Gui Limits + + [Rainer Hochecker] + * fix fading of CGUIImage + + [Rainer Hochecker] + * dvdplayer: trigger resync of players after audio stream stalled + + [Rainer Hochecker] + * dvdplayer: improve audio sync + + [Sam Stenvall] + * [pvr] check linked recordings when determining if an EPG tag is currently being recorded + + [Matthias Kortstiege] + * [infomanager] add ListItem.IsCollection + + [phil65] + * [CONFLUENCE] - add list flags for ListItem.IsCollection + + [popcornmix] + * renderer: Allow gui updates to be skipped when playing video + + [montellese] + * upnp: split up starting/stopping of the client (browser) and the controller + + [montellese] + * network: fix some wrong UPnP related calls to be able to stop the client and server + + [montellese] + * upnp: make services.upnpcontroller a sub-setting of services.upnpserver (it depends on it already anyway) + + + [Anton Fedchin] + * [pvr.iptvsimple] Bump pvr.iptvsimple@a2e6c6f + + [phil65] + * [CONFLUENCE] - cleaned up PlayerControl RepeatButton images + + [taxigps] + * use subtitle settings to set ASS/SSA subtitles position + + [taxigps] + * add a member m_viewRect to CBaseRenderer and a 3rd argument view to GetVideoRect + + [taxigps] + * bump libass to version 0.12.1 + + [arnova] + * fixed: Declaration order + wrong prototype (cosmetics) + + [arnova] + * changed: Refactor ImageLoader to improve error handling when e.g. texture loading fails + + [Sam Stenvall] + * [pvr] fix wrong logic which made it impossible to persist changes in the channel manager dialog + + [Violet Red] + * Keep playlistid=playerid in JSON interface + + + [Chris "Koying" Browet] + * Fixup 3D sub: remove unnecessay include + + [Pär Björklund] + * make lirc a bit more thread safe + + [Gordon Ellis] + * Fixed some lingering grammar errors from the name change to Kodi + + [Rainer Hochecker] + * dvdplayer: unpause PVR playback after channel switch + + + [AlwinEsch] + * [confluence] Add settings group title support + + [AlwinEsch] + * [settings] Add coded group title support + + [AlwinEsch] + * [settings] Add group title support + + [AlwinEsch] + * [settings] Add single control type to CSettingGroup + + [Chris "Koying" Browet] + * ADD: [vkeyboard] to toggle use left/right/enter the keyboard way + + [Chris "Koying" Browet] + * FIX: actually remove excluded addons + + [Chris "Koying" Browet] + * FIX: [droid;packaging] handle addons libraries + + [Matthias Kortstiege] + * [videodb] cleanup files from removed media sources + + [Chris "Koying" Browet] + * ADD: Handle bitmap subtitles in 3D + + [montellese] + * smartplaylist: fix filtering musicvideos by artists + + [montellese] + * videodb: fix partymode with filtered musicvideos through GetMusicVideoIDs() with WHERE clause (fixes #15989) + + [Rainer Hochecker] + * goom: drop unneeded file which bothers git + + [Rainer Hochecker] + * fix gui fps indicator for cases like dr kicks in + + [Matthias Kortstiege] + * [util] refactored ScanForExternalSubtitles to fetch the media's basepath instead of stating all kind of non-existing directories + + [Matthias Kortstiege] + * [uriutils] moved GetParentDir from VideoInfoScanner to URIUtils - renamed to GetBasePath + + [Matthias Kortstiege] + * [music] added mood for songs + + + + [ace20022] + * [Fix] Fix the Blu-ray simple menu entry "select from all titles...". + + [Chris "koying" Browet] + * FIX: [droid] Samba 3.6.12 (gplv3) + + [Sam Stenvall] + * [README.pvr] fixed old name and URL (closes #15866) + + [Chris "Koying" Browet] + * FIX: [jni] Do not detach UI thread + + [arnova] + * changed: Allow extraction for all protocols except for HTTP + FTP when NOT on a LAN + + [arnova] + * added: URIUtils::IsHTTP() function + + + [Andrew Fyfe] + * [xbmc.webinterface] fix typo in webinterface.xsd + + [Rainer Hochecker] + * linux: fix libsse4, compile with correct flags + + [Matthias Kortstiege] + * [fileitem] no need to stack or check for thumbs on library:// folders + + [Memphiz] + * [fontconfig] - bump to 2.11.1 - fixes #15864 + + + [Rainer Hochecker] + * dvdplayer: do not bail out if av_find_stream_info fails for mpegts + + [arnova] + * changed: Use toasts to report video and music db export errors instead of modal dialog + + [arnova] + * fixed: Dialog would not close properly when an exception occurred + + + [Matthias Kortstiege] + * [music] remove search node - sidebar already has search integrated + + [Matthias Kortstiege] + * [musicdb] added infomanager hascontent checks for singles and compilations + + [Matthias Kortstiege] + * [musicdb] enable the library via xml + + [Stefan Saraev] + * [replaytv] minor cleanup after pull/6798 + + [Stefan Saraev] + * [replaytv] remove replaytv support + + [Stefan Saraev] + * [daap] remove daap support + + [montellese] + * jsonrpc: add "compilation" property to AudioLibrary.GetAlbums + + [montellese] + * jsonrpc: add "includesingles" parameter to AudioLibrary.GetAlbums + + [montellese] + * jsonrpc: add "releasetype" for albums and "albumreleasetype" for songs + + [montellese] + * musicdb: add CMusicDatabase::GetSinglesCount() + + [montellese] + * musicdb: add strReleaseType to album table and use it to filter albums/singles + + [montellese] + * music: move decision whether an album is a single or not into CMusicInfoScanner + + [montellese] + * music: add support for album release type to CMusicInfoTag + + [montellese] + * music: move EmbeddedArt and EmbeddedArtInfo from MusicInfoTag.h into its own header file + + [montellese] + * music: add CAlbum::ReleaseType and CAlbum::releaseType + + [h.udo] + * [pvr] Sync a bunch of addons with PVR API 1.9.6 + + [Martijn Kaijser] + * bump to 15.0 beta1 + + [xhaggi] + * [gui] removes obsolete close of child dialogs in video/music osd + + [xhaggi] + * [gui] use CloseInternalModalDialogs() where possible + + [xhaggi] + * [cosmetic] indentation, comments and simplify button label decision + + [xhaggi] + * [video] close bookmark dialog after select an item + + [xhaggi] + * [video] don't open the bookmark dialog if no playback exists + + [xhaggi] + * [video] adds ListItem properties IsChapter/IsBookmark + + [xhaggi] + * [video] don't add bookmarks of type resume in bookmark dialog + + [xhaggi] + * [confluence] use Label and Label2 to separate bookmark name and time + + [xhaggi] + * [video] separate bookmark/chapter name and time in Label and Label2 + + [Matthias Kortstiege] + * [video] human readable chapter and bookmark labels + + [Rainer Hochecker] + * do not enable remote control on initialize, respect app params + + [xhaggi] + * [gui] rename CloseModalDialogs to CloseInternalModalDialogs + + [Memphiz] + * [advancedsettings] - changed applydrc to be a float instead of bool + + [Memphiz] + * [AudioCodecFFMPEG] - disable drc in audio codec context when advancedsetting "applydrc" is disabled + + [xhaggi] + * [gui] exclude addon/python dialogs in window manager's CloseModalDialogs() + + [wsnipex] + * [curl] use better method to stat shoutcast and friends + + [xhaggi] + * [video] select proper bookmark item based on current playtime + + [xhaggi] + * [video] unify bookmarks/chapters and sort them by resume point + + [manuel] + * [pvr.dvbviewer] Bump to kodi-pvr/pvr.dvbviewer@bd2c01f + + [Bernd Kuhls] + * Remove lib/enca/ + + [Matthias Kortstiege] + * [settings] allow hide watched toggling in files node + + [wsnipex] + * [configure] add option to disable lirc + + [Menno] + * Added permissions for master mode to remove items from library when in RO account. + + [Anssi Hannula] + * [AE] ALSA: Fix DeviceChange event triggered by enumeration + + [Anssi Hannula] + * [AE] ALSA: Add more logging to device change triggers + + [Anssi Hannula] + * [AE] ALSA: Add ALSADeviceMonitor for monitoring ELD changes + + [Anssi Hannula] + * [AE] ALSA: Add ALSADeviceMonitor for monitoring card removals/additions + + [Anssi Hannula] + * [linux] Add FDEventMonitor for monitoring file descriptors + + + [Matthias Kortstiege] + * [muscidb] do not blindly add karaoke genre + + [Chris "Koying" Browet] + * FIX: [droid;amc] crash when calling dispose twice + + [Matthias Kortstiege] + * [stacking] remove loose 'd' from video stack expressions (fixes #15882) + + [montellese] + * python: fix HAS_WEB_SERVER ifdef guard in AddonModuleXbmcwsgi.i (fixes #15849) + + [montellese] + * codegenerator: add support for "footer" code insertion block to python template + + [Mateusz Lewicki] + * fix for gamepad volume change + + + [Chris "Koying" Browet] + * fixup: [breakpad;jenkins] save symbols tarball + + [Chris "Koying" Browet] + * ADD: [droid] implement Google Breakpad for minidumps + + [Chris "Koying" Browet] + * FIX: [aml] fallback to codec_id if codec_tag is unknown + + [Chris "Koying" Browet] + * FIX: [aml] check size (and realloc) of header buffer + + [Chris "Koying" Browet] + * [aml] add rotation to render features + + [Chris "Koying" Browet] + * FIX: [amcodec] remove problematic check (solves "[h264 aml error] 00001.ts") + + [davilla] + * pivos: [amcodec-hack] pvr can reopen too fast, slow us down a little + + [uNiversaI] + * [Default webinterface] make add-on name more descriptive + + [ace20022] + * [Fix] dvdplayer: Only one (external) vobsub could be displayed due to a wrong source numeration. + + [xhaggi] + * [gui] fix endless loop in CloseDialogs() if not force close + + [xhaggi] + * [gcc] fix gcc 4.6 compiler error introduced by #6828 + + [Kai Sommerfeld] + * [pvr] Bump pvr.hts to version 2.1.7 + + [Anton Fedchin] + * [pvr.iptvsimple] Sync prv.iptvsimple. CONTRIBUTING.md Kodi.xcodeproj LICENSE.GPL Makefile.in Makefile.include.in README.md VERSION addons bootstrap bootstrap.mk build-aux codegenerator.mk configure.ac copying.txt debian docs doxygen_resources gitrev gitrev.sh lib m4 media project sounds system tools userdata version.txt xbmc xbmc-xrandr.c Fix loading add-on on android. + + [Chris "Koying" Browet] + * FIX: [droid] consistent splash error handling + + + [Pär Björklund] + * Only log first connection attempt to avoid spamming the logs, also some cleanup + + + [Rainer Hochecker] + * dvdplayer: fix audiosync for rr not equal to 1.0 + + [Rainer Hochecker] + * fix and cleanup after codec removal from paplayer + + [xhaggi] + * [gui] playback an error sound if window switch is refused + + [xhaggi] + * [gui] don't switch to another window if there are active modal dialogs + + [arnova] + * changed: Set default buffer factor to 4 to allow faster filling + + [arnova] + * fixed: Buffer factor should not set higher read rate demands but instead have filecache increase its limiter + + [arnova] + * added: Debug logging for low read rate condition + + + [Dmitry Sandalov] + * [README.ubuntu] ppa sources, provided package + + [arnova] + * fixed: Bunch of compile warnings + + [arnova] + * fixed: String not found comparison was wrong in URL.cpp + fixed compile warning + + + [Pär Björklund] + * [tests] Get rid of a bunch of forced conversion to bool warnings and some cleanup as well + + [uNiversaI] + * [confluence] add pcm, pcm_s16le and pcm_s24le flags + + [Matthias Kortstiege] + * [tagloader] make TagLoaderFactory load by item (fixes #15879) + + [BigNoid] + * [confluence] Move dialog background to include + + [Memphiz] + * [jenkins/tests/win32] -exclude webserver tests for win32 because each one lasts 120 secs or so + + [Memphiz] + * [jenkins/win32] - add buildstep for building and running testsuite + + + [Memphiz] + * [jenkins] - prevent cleanout of native tools when pathChanged returns 1 in make-native-depends (due to Configuration set to RELEASE) + + [Memphiz] + * [tests] - fix charsetconverter unit tests by initialising CSettings singleton (else g_charsetConvert will access NULL-Ptr settings) + + [Memphiz] + * [Tests] - fix compilation + + [montellese] + * musicdb: remove unused GetVariousArtistsAlbums*() methods without implementation + + [Matthias Kortstiege] + * [video] removed old unused library <-> files toggle code + + [hudokkow] + * [Keyboard Layouts] Add missing characters in Greek keyboard + + [hudokkow] + * [Keyboard Layouts] Add missing characters in German keyboard + + [Kib] + * [readme.md] Updated link to coding guidelines + + + [Rainer Hochecker] + * vaapi: reduce refs by one after rework of frame threading + + [Rainer Hochecker] + * dvdplayer - rework frame therading for ffmpeg + + [uNiversaI] + * [project readme.md] update quick links + + [Matthias Kortstiege] + * [stringutils] fix sizestring alignment + + [Memphiz] + * [AE/CA/osx] - fillup the stream with up to 64 unknown channels fixes support for studio audio devices with more then 16 unused/unknown channels in one stream - fixes #15874 + + [Memphiz] + * [AE] - extend the number of unknown channels from 16 to 64 + + [Anton Fedchin] + * [pvr.iptvsimple] Sync win v.1.11.0 (API 1.9.6) + + [Rainer Hochecker] + * fix frametime for active vsync + + [Rainer Hochecker] + * guilib: only update scrollinfo if frametime did change + + + [ronie] + * [Confluence] fix 2D button after PR#6345 + + [xhaggi] + * [gui] only close active modal dialogs if closing a media window + + [xhaggi] + * [gui] new method CGUIWindowManager::CloseModalDialogs() to close modal dialogs only + + [xhaggi] + * [gui] unify CGUIWindowManager::AddModeless/RouteToWindow into new method RegisterDialog() + + [wsnipex] + * [binary addons] bump kodi-platform (fixes #15870) + + [Kai Sommerfeld] + * [pvr] fixed regression in CGUIInfoManager::GetItemLabel, LISTITEM_NEXT_* + + [Marcel Groothuis] + * GUIInfoManager: fix PVR recording genre display + + [Rainer Hochecker] + * dvdplayer: fix mem leak in ffmpeg decoder + + [Rainer Hochecker] + * dvdplayer: fix memleak in ffmpeg demuxer + + [Garrett Brown] + * [input] Change GetFrameTime() to SystemClockMillis() + + [Rainer Hochecker] + * dvdplayer: adjust threshold of audio errors to frame duration + + [Garrett Brown] + * [input] Untangle key processing from key translation + + [Daniel Scheller] + * Fix compile with gcc-4.6 (e.g. Ubuntu Precise) after 799094a838d12cc6f9513bd576d35f37668176e8 + + [uNiversaI] + * [keyboard] add/restore track rating functionality + + [uNiversaI] + * [remote] restore track rating functionality + + [montellese] + * addons: find and use the best matching translation for an addon summary/description/disclaimer + + [montellese] + * utils: add CLocale::FindBestMatch() to find the best matching locale from a list of locales + + [Karlson2k] + * Revert "[emufnc] Disable support for READ_TRUNCATED. To be reverted after Helix release." + + + [ronie] + * [Confluence] add another missing default icon + + [ronie] + * [Confluence] add missing default icons + + [Rainer Hochecker] + * [pvr.vnsi] sync with API 1.9.6 + + [Garrett Brown] + * Mark static function as static + + + [Kai Sommerfeld] + * [pvr] Fix radio channelgroup support. Take over 'radio' group property supplied by client. + + + [Dusan Slijepcevic] + * New feature: Added parameters to skin include directive ($PARAM[ParamName]) + + [Dusan Slijepcevic] + * Refactored string replacer to return flag and accept functor + + [Kai Sommerfeld] + * [pvr] Improved content of pvr shutdown warning dialog. + + [Matthias Kortstiege] + * [guilib] remove obsolete always show cursor code + + [Matthias Kortstiege] + * [guilib] hint text not displayed in keyboard dialog + + [montellese] + * videodb: store the number of seasons of a tvshow in CVideoInfoTag::m_iSeason + + [popcornmix] + * [resampler] Use ffmpeg for quiet noise generation + + [montellese] + * CGUIMediaWindow: reorganise the virtual methods into groups based on where they are defined + + [montellese] + * CGUIMediaWindow: move all #defines to the top + + [montellese] + * CGUIMediaWindow: sort includes alphabetically + + [popcornmix] + * [OMXImage] Increase jpeg decode timeout + + [Lukas Rusak] + * [input] add keymap for ouya controller + + [Lukas Rusak] + * [input] add keymap for PS4 controller + + [Stefan Saraev] + * [input] add home key id for Rii i7 remote + + [Stephan Raue] + * [settings] move RSS to standard group + + [Stephan Raue] + * [input] support KEY_TV on 'devinput' devices + + + [Rainer Hochecker] + * paplayer: remove audio extensions for removed codecs + + [Rainer Hochecker] + * paplayer: drop obsolete codecs from lib + + [Rainer Hochecker] + * paplayer: drop remaining codecs, only use ffmpeg + + [Matthias Kortstiege] + * [videolibrary] adjust year sort order label + + [Matthias Kortstiege] + * [musiclibrary] adjust sort order labels (closes #15860) + + [montellese] + * fix TV language detection with HDMI-CEC + + [xhaggi] + * [pvr] fix type of CPVRChannelGroup's m_iPosition + + [ace20022] + * [lang] Also check for user defined custom language codes. + + [ace20022] + * [lang] Add custom languages to our language list. + + [xhaggi] + * [epg] fix use of new epg database column iYear + + [David Butler] + * Added some support for a titlebar-less functionality on OSX, the window is also movable by using a "drag anywhere" functionality while the titlebar is disabled... + + [Matthias Kortstiege] + * [fonts] fix font mask after 4e542f7 + + [Matthias Kortstiege] + * [art] fetch artist and album art based on album id + + [Matthias Kortstiege] + * [art] clear all artwork assigned to the CFileItemList + + [Thomas Amland] + * [addonbrowser] rearrange root menu + + [Thomas Amland] + * [addonbrowser] move information providers type addons to a sub-category + + [Thomas Amland] + * [addons] refactor and cleanup addon directory + + [Thomas Amland] + * [addonbrowser] remove date sorting. doesn't work + + [Thomas Amland] + * [addons] allow GetAllAddons to be used successively without clearing input + + [Rainer Hochecker] + * renderer: do not add overlays when eating video frames - fixes segfault + + [montellese] + * binary addons: add modplug, nosefart, sidplay, snesapu, stsound, timidity and vgmstream audiodecoders + + [montellese] + * [win32] integrate audiodecoders into the installer + + [montellese] + * [win32] make sure we have access to a patch command + + + [popcornmix] + * [omxplayer] Allow HDMI output to work when ALSA card is selected + + [Kai Sommerfeld] + * [pvr] Bump pvr.hts to version 2.1.6 (PVR addon API 1.9.6) + + [uNiversaI] + * [configure.in] rename file extension to configure.ac + + [uNiversaI] + * [bootstrap.mk] change configure.in -> configure.ac + + [Kai Sommerfeld] + * [epg] CEpgInfoTag: Reintroduced mutex protection for m_pvrchannel and m_recording. + + + [Matthias Kortstiege] + * [osx/ios] force project indent to 2 spaces - no tabs + + [xhaggi] + * [gui] fix uninitializeed iEpisode and iSeason + + [xhaggi] + * [epg] fix usage of ALTER TABLE in epg database update + + [Matthias Kortstiege] + * [osx/ios] sync project file + + [wsnipex] + * [depends] binary-addons: remove quotes around the addon list and use "all" for the list of addons + + [kajdreef] + * Fixed issue 15831 by checking for the password after the choice have been made and removed the Profile delete option + + [ace20022] + * [gui] Use a list instead of a spinner for the audio and subtitle selection via the video osd dialog. + + [ace20022] + * [Fix][bluray] Allow reading the disc's root directory. + + + [xhaggi] + * [pvr] bump API to 1.9.6 + + [xhaggi] + * [gui] handle ListItem.IMDBNumber / VidePlayer.IMDBNumber also for video items + + [xhaggi] + * [gui] handle season and episode item labels for channel/epg item + + [xhaggi] + * [gui] handle more video info labels for PVR channel item + + [xhaggi] + * [gui] adds new EPG properties to GUIInfoManager + + [xhaggi] + * [epg] adds new properties to epg info tag + database + + [xhaggi] + * [pvr] extends API for new epg properties + + [xhaggi] + * [pvr] adds capability for sorted channel groups + + [Pär Björklund] + * Changed FONT_CACHE_DIST_LIMIT to float to silence a bunch of warnings. floats are used everywhere in the calculations so this was most likely an oversight and not intended behaviour + + [Pär Björklund] + * Removed boost/shared_ptr include that had been left behind + + [Matthias Kortstiege] + * [tests] added tests for capitalise after punctuation characters + + [Matthias Kortstiege] + * [stringutils] also capitalise after punctuation characters + + [Arne Morten Kvarving] + * fixed: rename across mount points on posix filesystems + + [Pär Björklund] + * Remove throw() specifications since they're not used anymore in C++11 + + + [Matthias Kortstiege] + * [pvr] fix unable to open grouped recordings/folders (closes #15848) + + [xhaggi] + * [pvr] fix group member assignment + + [Chris "Koying" Browet] + * FIX: [droid] if a full apk is present, use it rather than obb; lower threshold to 40Mb + + [ace20022] + * [cleanup] Remove CheckLoadLanguage from LangInfo. + + [ace20022] + * [cleanup] Remove check for language (codes) from language addons. + + [xhaggi] + * [pvr] drop table 'clients' regardless of whether we have PVR addons + + [xhaggi] + * [pvr] simplify iteration through pvr addons + + [xhaggi] + * [pvr] fix endless loop while migrating clients table to addon database + + [Rainer Hochecker] + * renderer: drop video frames if neither full-screen nor video control displays them + + [Rainer Hochecker] + * renderer: cosmetics + + [Alfredo Tupone] + * Allows choosing compiler during build of libsquish + + [Karlson2k] + * [posix] [depends] Update libmicrohttpd lib for POSIX platforms + + [Karlson2k] + * [depends] Fix wrongly used system native libgcrypt-config instead of target libgcrypt-config + + [Karlson2k] + * [depends] Fix: libmicrohttpd doesn't need openssl, but need gnutls + + [Karlson2k] + * [win32] [installer] Remove systemwebserver directory if any + + [Karlson2k] + * [win32] Update libmicrohttpd package, use static lib for libmicrohttpd + + [Martijn Kaijser] + * remove old pre-Frodo upgrade code for cached artwork + + + [Rainer Hochecker] + * dvdplayer: add slice threading back for most codecs - currently too many issues + + [Matthias Kortstiege] + * [libraryqueue] refresh listing after doing the work + + [wsnipex] + * [depends] binary-addons: fix building only selected addons + + [ksooo] + * [htsp] remove internal htsp support. + + [Alfredo Tupone] + * Use $(MAKE) to call make from a Makefile. + + [Mateusz Lewicki] + * fixed gamepad on windows spamming to logs + + [Rainer Hochecker] + * renderer: grab corect lock when calling IsGui/VideoLayer + + [Rainer Hochecker] + * ffmpeg: fixes for 2.6.0 + + [montellese] + * lib: get rid of copy of libmicrohttpd + + [Anton Fedchin] + * [dxva] hevc: added decoder guids. Fixed refs count. + + [Anton Fedchin] + * [dxva] hevc: add compat header for mingw. + + + [ksooo] + * [confluence] Consistent usage of one string resource for electronic program guide => #22020 "Guide". + + [psyton] + * Support for load replay gain info from CUE + + [psyton] + * CCueDocument refactoring + + [psyton] + * ReplayGain refactoring. (Create class for store and work with RG data) + + [h.udo] + * Add more native artifacts to .gitignore + + [ace20022] + * [Fix][Settings] Fix the definition of the subtitles.tv and subtitles.movie service settings. + + [Violet Red] + * Fix Artists view in Music Videos + + [Matthias Kortstiege] + * [vtp] remove internal vtp (vdr-streamdev) support + + [ace20022] + * [Fix][GUIDialogSelect] Reset members m_buttonString and m_bButtonPressed on Reset(). + + [Cam Hutchison] + * [playlist] Add tags to episode smart playlists. + + [Rainer Hochecker] + * dvdplayer: drop ffmpeg threading work around, fix root cause + + + [h.udo] + * [pvr addons] Sync remaining addons with API 1.9.5 + + [h.udo] + * [pvr.pctv] Add pvr.pctv and sync with https://github.com/kodi-pvr/pvr.pctv/commit/7929c6b + + [Matthias Kortstiege] + * [mythtv] remove internal mythtv support + + [montellese] + * [win32] binary addons: don't try to build unsupported addons + + [Memphiz] + * [win32/TexturePacker] - added version resource and bumped to 1.0.2 + + [wsnipex] + * [depends] binary addons: don't try to build unsupported addons + + [wsnipex] + * [cmake] add a custom target "supported_addons" that returns all addons we're going to build on this platform + + [wsnipex] + * [cmake] fix binary addon install when sudo rights are needed + + [montellese] + * CLangInfo: improve log messages during initial language update + + [montellese] + * addons: fix SQL query in CAddonDatabase::GetAddons() after 92e7fc973b27f6b14de03ea91d71abadd5f91171 + + [Lars Op den Kamp] + * [pvr] some more channelgroup optimisations + + [ace20022] + * [settings] Remove maximum items constraint for the setting "Languages to download subtitles for". + + [ace20022] + * [Fix][settings] Use the built-in language list for the setting "Languages to download subtitles for" instead of the list of installed languages. This is done by a re-factoring of the method SettingOptionsStreamLanguagesFiller. + + [Memphiz] + * [TexturePacker] - fix decode of png files with indexed color palette - thx @BigNoid for reporting the problem + + [anaconda] + * Decrease priority of BackgroundInfoLoader thread on POSIX too. + + [Lars Op den Kamp] + * [pvr] changed channel paths to the format addonid_uniquechannelid instead of using the db id, so channel settings can be shared accross installations via a shared video db + + [Lars Op den Kamp] + * [pvr] changed erase calls in CPVRTimers::UpdateEntries() + + [Lars Op den Kamp] + * [pvr] changed erase calls in CPVRDatabase::UpdateTables() + + [Lars Op den Kamp] + * [epg] changed erase() calls in CEpg::Cleanup() + + [Lars Op den Kamp] + * [pvr] fixed bad erase in CPVRChannelGroups::DeleteGroup() + + [Lars Op den Kamp] + * [pvr] removed work around that no longer seems to be needed and that reset the channel pointer in each epg tag every time 'now' or 'next' is accessed + + [Lars Op den Kamp] + * [pvr] changed CPVRChannelGroup to use two maps: one by client/unique id, one by channel number order, so getters can be optimised. changed channel paths to use the client/unique id instead of the channel number, so we don't have to regenerate paths when things change some bug fixes and optimisations + + [Lars Op den Kamp] + * [pvr] use iterators in CPVRChannelGroupInternal + + [Lars Op den Kamp] + * [pvr] fixed: CPVRChannelGroupInternal::AddToGroup() signature no longer matched the parent class signatature + + [Lars Op den Kamp] + * [pvr] now that we're using shared pointers for channels, use it to optimise accessing groups + + [Lars Op den Kamp] + * [pvr] removed dead code CPVRChannelGroupsContainer::GetByChannelIDFromAll() + + [Lars Op den Kamp] + * [pvr] renamed CPVRChannelGroup::GetByClient() to CPVRChannelGroup::GetByUniqueID() + + [Lars Op den Kamp] + * [pvr] fixed: removed CVPRChannelGroup::GetByUniqueID() and replaced remaining calls by GetByClient(). fixes issues if more than 1 client is loaded with the same unique IDs used + + [ace20022] + * [Fix][settings] Don't ignore minimum and maximum items constraints (case sensitive). + + + [uNiversaI] + * [typo fix] priviledges -> privileges + + [Memphiz] + * [depends/binaddons] - replace the static addon list with a simple shell script which lists all addons in project/cmake/addons/addons + + [Memphiz] + * [depends/binaddons] - build all addons addon by addon and log the successful built addons to cmake/project/addons/.success and the failed ones to cmake/project/addons/.failure + + [Memphiz] + * [depends/binaddons] - unify xbmc-pvr-addons and xbmc-audioencode-addons to binary-addons + + [montellese] + * update .gitignore after changes to binary addons buildsteps + + [montellese] + * [win32] add prepare-binary-addons-dev.bat for easier binary addon development + + [Mateusz Lewicki] + * panning with gamepad in slideshow fixed + + [uNiversaI] + * [kodi-resource] add kodi-resource icon + + [uNiversaI] + * [kodi-language-resource] add GENERIC language resource icon + + [uNiversaI] + * [confluence] add repo image DefaultAddonLanguage + + + [Kai Sommerfeld] + * [EPG] Fix CEpgInfoTag::Title() + + [Martijn Kaijser] + * [cosmetic] rebrand pydocs template + + [Memphiz] + * [droid/depends] - bump default API version to 17 (was missed during sdk bump) + + [ace20022] + * [LangCodes] Check the length of the trimmed code string. + + [ace20022] + * [LangCodes] Use case insensitive comparisons to find a language code for a give language name. + + [ksooo] + * CFileItemList ctors: initializer list vs. assignment + + [ksooo] + * CFileItem[List] cosmetics, mainly return statements on separate line. + + [Thomas Amland] + * [addons] cleanup context menus in addon window + + [ksooo] + * CFileItem ctors: No need to call base class default ctor, happens automatically. + + [ksooo] + * CFileItem copy ctor: initializer list vs. assignment. + + [ksooo] + * Align CFileItem::CFileItem(const CEpgInfoTagPtr& tag) with the other ctors taking const *Ptr& parameter (assert vs. NULL check). + + [Matthias Kortstiege] + * [addoncallbacks] initialize members in the order they were declared + + [Matthias Kortstiege] + * [addonmanager] initialize members in the order they were declared + + [Matthias Kortstiege] + * [audiodecoder] initialize members in the order they were declared + + [montellese] + * input: use "language" and "layout" instead of "name" attribute for keyboard layouts + + [montellese] + * input: split keyboardlayouts.xml into one XML per language + + [montellese] + * input: extract CKeyboardLayoutManager from CKeyboardLayout and support loading multiple keyboard layout XML files + + [montellese] + * input: remove unused CKeyboardLayoutConfiguration + + [montellese] + * [win32] write successful + + [montellese] + * [win32] don't abort make-addons.bat if a binary addon fails to build + + [montellese] + * [win32] allow make-addons.bat to be called with multiple binary addons as arguments + + [Matthias Kortstiege] + * [win32file] use LastWriteTime instead of ChangeTime (fixes #15590) + + [montellese] + * settings: add locale.shortdateformat and locale.longdateformat settings + + [montellese] + * settings: add locale.timeformat and locale.use24hourclock settings + + [montellese] + * settings: add locale.speedunit setting + + [montellese] + * CLangInfo: refactor speed unit handling using CSpeed + + [montellese] + * utils: add CSpeed utility class + + [montellese] + * CLangCodeExpander: cleanup and refactoring + + [montellese] + * settings: add locale.temperatureunit setting + + [montellese] + * CTemperature: cleanup and refactoring + + [montellese] + * move Temperature.h/cpp to utils + + [AlwinEsch] + * [gui] Close all open dialogs if media window becomes closed + + [AlwinEsch] + * [gui] Cleanup video osd dialog function, to match code rules + + [AlwinEsch] + * [gui] Fix music OSD close with open PVR dialogs + + [Matthias Kortstiege] + * [fonts] adds CAPITALIZE - capitalize the first letter of each word + + [alanwww1] + * disable desktop compositing for KDE, when Kodi is in full-screen mode + + + [Miroslav Bambousek] + * [gui] fix for textbox vertical centering + + [Pär Björklund] + * Changed sleep call to AbortableWait + + [Matthias Kortstiege] + * [webif] fixed typo (closes #15844 - thanks b1m1) + + [montellese] + * [tests] fix TestPOUtils.General + + [Chris "Koying" Browet] + * FIX: [droid] properly save addon settings even if the control is not focused (fixes #13913) + + [Matthias Kortstiege] + * [videoinfoscanner] fix shows not picked up after initial scan abort + + [Pär Björklund] + * Fix the following coverity issues that the variables are uninitialized in the constructor or any functions that it calls fix 719141, 719143, 719144, 719146, 719147, 719148, 719149, 727842, 122884 fix 718193, 718210, 1261374, 1261377 + + [Matthias Kortstiege] + * [htmltable/util] remove dead html code + + [Pär Björklund] + * Cosmetic changes Renamed setUsed to match the other input interfaces + + [Pär Björklund] + * Fixed disconnect + + [Pär Björklund] + * Fixed remote initialization + + [Pär Björklund] + * Bump curl to 7.40 + + + [AlwinEsch] + * [settings] Allow on settings button, right label a continues update + + [sub9] + * Add index to count all of the collection's fanart when creating the "fanart://Remote%i" strings + + [ronie] + * [Confluence] re-locate comments + + [Stefan Saraev] + * [audioencoders] add xbmc.audioencoder + + [Stefan Saraev] + * [pvr] bump xbmc.pvr/addon.xml after 5f76e327 + + [Memphiz] + * [filesystem/afp] - remove AFP implementation + + [Chris "Koying" Browet] + * FIX: [amc] crash if decoder cannot handle a file + + [Lars Op den Kamp] + * fixed: don't return local add-ons from CAddonDatabase::GetAddons() + + [Lars Op den Kamp] + * fixed: all add-ons got duplicated in the addon table after b72f00a75c63ebe5b846d28824bcbe3ba1daebc6 + + [Lars Op den Kamp] + * [pvr] changed: ask if the user wants to disable libCEC if no TV couldn't be found for 30 seconds + + [Lars Op den Kamp] + * [cec] changed: don't show a kaitoast when the configuration has been updated by libCEC + + [Rainer Hochecker] + * [AE] pass force resample flag down to resampler + + [Rainer Hochecker] + * [ffmpeg] bump to 2.6 + + [Rainer Hochecker] + * [rbp] update README + + [Philipp Te] + * [CONFLUENCE] - change effectslowdown to 1.0 in addon.xml + + [Philipp Te] + * [CONFLUENCE] - second conversion with XML tool ("scaling" values with 0.75) + + [Chris "koying" Browet] + * FIX: [droid] keep wakelock on non-default screensavers + + [Chris "Koying" Browet] + * FIX: [droid] use SCREEN_BRIGHT_WAKE_LOCK to allow the keys backlight to go off + + [Chris "Koying" Browet] + * CHG: [droid] refactor wake lock; follow our screensaver + + [Philipp Te] + * [CONFLUENCE] - first conversion with XML tool (just alignments, whitespace removals etc) + + [ksooo] + * Optimize CFileItem::operator=() + + + [Matthias Kortstiege] + * [fileitem] remove compile warnings after 121b3fc + + [Pär Björklund] + * fix 1228841, 1228842, 1273988 Added addon/AudioDecoder.h to VS project, was missing for some reason + + [Pär Björklund] + * fixes 719099, 719101, 719105, 1021008, 1194442 + + [Bernd Kuhls] + * [uclibc] Fix compilation error in xbmc/cores/DllLoader/exports/emu_msvcrt.cpp + + [Pär Björklund] + * fix 1287131 and 1287132 + + [Matthias Kortstiege] + * [curl] fix ftps exists handling + + [Martijn Kaijser] + * [win32] fix building after split addon gui for skin and binary addons 127663da0ed4cff015d9d0070ccacf543282dd82 + + [Rainer Hochecker] + * [pvr.vnsi] change repo location to kodi-pvr + + [Rainer Hochecker] + * [pvr.vnsi] bump version + + [Martijn Kaijser] + * remove PVR specific repo + + [h.udo] + * [pvr.vuplus] Sync with https://github.com/kodi-pvr/pvr.vuplus/commit/366c8df + + [h.udo] + * [pvr.iptvsimple] Sync with https://github.com/kodi-pvr/pvr.iptvsimple/commit/4e1e7f6 + + [hudokkow] + * [pvr.filmon] Add pvr.filmon and sync with https://github.com/kodi-pvr/pvr.filmon/commit/f607fdf + + [Lars Op den Kamp] + * [pvr] optimise CPVRChannelGroup + + [Lars Op den Kamp] + * [pvr] fixed: slow channels import + + [Matthias Kortstiege] + * [tuxbox] remove internal tuxbox support + + + [Lars Op den Kamp] + * [pvr] fix check for disabled add-ons at startup, making you have to start the pvr manager twice on a new installation + + [Lars Op den Kamp] + * [pvr] clean up CPVRClients::RegisterClient() and always disable add-ons that have missing settings + + [Lars Op den Kamp] + * [pvr] replace the id of the clients table in pvr by the one used by the addondatabase. bump db version + + [Matthias Kortstiege] + * [video] remove dead code + + [montellese] + * [linux] fix home path detection + + [montellese] + * addons: fix missing parameter in CLanguageResource::OnPostInstall() + + [Lars Op den Kamp] + * [pvr] fixed: don't disable all new add-ons by default, only the ones that need configuration by default, all add-ons are marked as needing a configuration. overrule in addon.xml, by adding needs_configuration=false to the pvr extension point + + [Lars Op den Kamp] + * [pvr] changed: no longer disable all new add-ons when creating a new pvr db + + [Lars Op den Kamp] + * [pvr] changed: removed the special clients table for pvr, and use the add-on ids from the AddonManager + + [Lars Op den Kamp] + * added: CAddonDatabase::GetAddonId() + + [Matthias Kortstiege] + * [osx/ios] sync Xcode + + [montellese] + * [win32] update VS project files + + [montellese] + * no need to install the language directory anymore + + [montellese] + * addons: move language files to resource.language addons and remove all languages except English + + [montellese] + * addons: support the same locales used for the language addons in the tag and in the "lang" attribute of and tags in addon.xml + + [montellese] + * adjust language loading/handling logic + + [montellese] + * settings: turn locale.language into an addon setting + + [montellese] + * addons: only disallow non-forced repository updates while on the login screen + + [montellese] + * addons: extend CAddonDatabase::GetAddons() to support getting addons of a specific type + + [montellese] + * filesystem: add support for resource:// paths + + [montellese] + * addons: add new kodi.resource(.language) addon type + + [montellese] + * CAddonMgr: make GetExtElement() public + + [montellese] + * utils: add CLocale + + [Lars Op den Kamp] + * [pvr.hts] bump to https://github.com/kodi-pvr/pvr.hts/commit/abceaf8 [pvr.demo] bump to https://github.com/kodi-pvr/pvr.demo/commit/b4b7de1 + + [Violet Red] + * [fix] Trac 15707, queue item fails on music videos + + [Violet Red] + * Add function to return preferred playlist for active player + + [Thomas Amland] + * [addonmanager] cleanup GetAllAddons + + + [Lars Op den Kamp] + * [pvr.hts] bump to https://github.com/kodi-pvr/pvr.hts/commit/f11a84f6deb8609fa47a39b49c2b729d50a9b5b0 + + [Lars Op den Kamp] + * [pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running + + [Lars Op den Kamp] + * [pvr] added: CPVRRecording::IsBeingRecorded() + + [Lars Op den Kamp] + * [pvr] fixed: always ask to resume recordings, not just when played from the recordings window + + [Lars Op den Kamp] + * [pvr] fixed: remove deleted recordings from the timeline too + + [Lars Op den Kamp] + * [pvr] changed: add button to resume live playback when playing a recording + + [Lars Op den Kamp] + * [pvr] changed: ask if the user wants to resume from the beginning of a recording when starting playback on a channel and a matching recording is found + + [Lars Op den Kamp] + * [confluence] add a play recording button to DialogPVRGuideInfo.xml, hidden when no recording was found + + [Lars Op den Kamp] + * [pvr] changed: display a 'play recording' button in the epg info dialog and context menu when a recording is found, and don't make 'switch channel' play a recording, but always make it switch channels like the label says + + [Lars Op den Kamp] + * [pvr] changed: add the filename of the recording (if any) to the epg tag serialised data + + [Lars Op den Kamp] + * [pvr] fixed: missing initialisers in CEpgContainer + + [Lars Op den Kamp] + * [pvr] changed: instead of having a recording id set for epg tags, have an epg id set for recordings epg tags are only refreshed based on a timeout, or when an update is forced fixes playing recordings in progress from the timeline + + [Lars Op den Kamp] + * [pvr] fixed: missing initialiser for CPVRRecordings::m_bHasDeleted + + [Lars Op den Kamp] + * [pvr] fixed: file path for recordings with a / in the channel name + + [ace20022] + * [Fix] Cache chapter info for dvds to avoid frequent file accesses. + + [montellese] + * fix settings definition for win32 after df1c1b8d25f8ae227ee76399f6ef7b6b98f34201 + + [montellese] + * fix settings definition for win32 and ios after face9ead060c964f0bae4c3b6179ea36d98708a5 + + [Pär Björklund] + * Fixed the formatting that got messed up when moving Key.h/cpp + + [Lars Op den Kamp] + * [pvr] fixed: clear the epg tag of deleted timers explicitly because it no longer happens automatically in the destructor when using shared pointers + + [Lars Op den Kamp] + * [pvr] fixed: don't delete a timer from the list of timers in CPVRTimers::DeleteTimersOnChannel(). wait for the client to trigger an update + + [Lars Op den Kamp] + * [jenkins] ac3e91a89a63bcd5c1b892cdec7931a8067f0c68 for other platforms + + [Memphiz] + * [jenkins] - make binary addon compilation error non-fatal for jenkins + + [Lars Op den Kamp] + * [pvr] changed: scan for auto-configurable services for 5 seconds, instead of sleeping 1 second and then returning + + [Lars Op den Kamp] + * [pvr] register the avahi type set in the add-on + + [Lars Op den Kamp] + * changed: made CZeroconfBrowser::AddServiceType() and CZeroconfBrowser::RemoveServiceType() public + + [Rainer Hochecker] + * split addon gui for skin and binary addons + + [Lars Op den Kamp] + * [pvr] added: auto-configure pvr clients via avahi add these to xbmc.pvrclient extension point in the addon.xml of the add-on to configure: avahi_type="(avahi type)" avahi_ip_setting="(name of the ip/address setting)" avahi_port_setting="(name of the port setting)" + + [Karlson2k] + * WebServer: add and use panic handler for MHD + + [mad-max] + * reverse logic from commit abc298ca71c25ae57081aad60ba5ef0abec3a445 + + [Chris Mayo] + * mouse: Increase number of buttons supported from 5 to 7 + + [Karlson2k] + * WebServer: write messages from MHD to log + + + [Arne Morten Kvarving] + * fixed: try to extract zip files marked as split archives + + [Arne Morten Kvarving] + * fixed: zip files which uses an out-of-spec header for the data record entry + + [Thomas Amland] + * [addons] revert force clearing of strings after loading context item label + + [Thomas Amland] + * [addons] fix post install of context items after #6549 + + [montellese] + * don't allow to pause queued video library jobs + + [montellese] + * fix video library cleaning not initiated by a user blocking the main thread + + [Matthias Kortstiege] + * [videoinfoscanner] add season art when new season are added (fixes #14339) + + [Jonathan Marshall] + * move AddSeason() public. + + [Jonathan Marshall] + * adds GetTvShowSeasons + + [montellese] + * CVideoLibraryQueue: fix segfault in CancelJob() if CJobQueue::CancelJob() deletes the job to be cancelled + + [Rainer Hochecker] + * fix installing arch dependent files into share + + [Rainer Hochecker] + * drop in-tree building of pvr addons + + + [Kai Sommerfeld] + * [dvdplayer] Fix CDVDPlayer::SwitchChannel signature to match IPlayer::SwitchChannel signature. + + [montellese] + * [win32] cmake: improve generated Visual Studio solution + + [wsnipex] + * cmake: allow to override local addon location via ADDON_SRC_PREFIX + + [montellese] + * cmake: support file:// based paths for addon definitions + + [montellese] + * cmake: don't use an extra loop to setup addon building + + [montellese] + * addons: fix CAddonMgr::CanAddonBeDisabled() for disabled addons + + [montellese] + * addons: fix CAddonMgr::IsAddonInstalled() for disabled addons + + [Rainer Hochecker] + * [cmake] add define BUILD_KODI_ADDON + + [Carcharius] + * [video] refactor select first unwatched season/episode item + + [Arne Morten Kvarving] + * fixed: don't load new copy of dll in LoadDll() + + [Arne Morten Kvarving] + * added: add audio codec extensions to the music extension list + + [Arne Morten Kvarving] + * changed: make the music extension member in AdvancedSettings private + + [Arne Morten Kvarving] + * add support for audio decoder addons + + [Arne Morten Kvarving] + * fixed: binary add-on child dll handling + + [montellese] + * pvr: silence warning in CPVRRecordings::DeleteAllRecordingsFromTrash() + + [montellese] + * MathUtils: silence warning about implicit cast from double to int + + [montellese] + * addons: fix CAddonCallbacksGUI::Dialog_Keyboard_ShowAndVerifyPassword() calling the wrong method + + [mad-max] + * damn you case-sensitivity + + [mad-max] + * moved HideAllItems Tag from AdvancedSettings to GUI + + [Rechi] + * SQL: replaced implicit Joins with explicit Joins + + [Kai Sommerfeld] + * Optimize CPVRTimerInfoTag. No more copies, just shared pointers. + + [Matthias Kortstiege] + * [videos] check whether or not we already know about the scraper and re-use it + + [Deniz Türkoglu] + * stringutils: add test for sortstringbyname + + [Deniz Türkoglu] + * Decouple Util and StringUtil + + [Chris "Koying" Browet] + * ADD: [jni] add Activity and refactor to use our specific descendant + + [popcornmix] + * [build] Enable PYTHONOPTIMIZE for linux + + + [Garrett Brown] + * [cosmetic] Fix c/p error and whitespace in IPlayer.h + + [popcornmix] + * [mmalrenderer] Fix for HAS_MMAL being set by chance + + [Matthias Kortstiege] + * [mysql] properly toggle mysql transactions automode + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [Pär Björklund] + * Moved key.h/cpp to input where it belongs + + [Pär Björklund] + * Moved settings handling into inputmanager and got rid of friend class declaration + + [Pär Björklund] + * Encapsulated g_RemoteControl in CInputManager. Removed several ifdefs from callers and hid it inside inputmanager + + [Pär Björklund] + * Encapsulated g_Mouse in CInputManager + + [Pär Björklund] + * Encapsulated g_Keyboard in CInputManager cleaned up some includes + + [Pär Björklund] + * Move more input processing over to CInputManager. Chain OnEvent so anything not handled by CApplication OnEvent gets passed to inputmanager for processing + + [Pär Björklund] + * Renamed GetInstance to Get + + [Martijn Kaijser] + * [repo] add isengard as repo location + + [Thomas Amland] + * update vs project files + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [Thomas Amland] + * [python] expose VideoInfoTag and MusicInfoTag of listitems + + [Thomas Amland] + * [addons] remove dead code + + [Thomas Amland] + * [addons] fix addon browser not propagating unknown context menu buttons to base class + + [Fice] + * [ADDONS] Hook up the context menu addons in all the windows + + [Fice] + * [ADDONS] Context Menu Addons System + + [Violet Red] + * Add proper tag for videos in playlists + + [Matthias Kortstiege] + * [application] load videosettings by item + + [Matthias Kortstiege] + * [videothumbloader] load videosettings by item instead by path + + [Matthias Kortstiege] + * [videodatabase] add doxy for Get-/SetVideoSettings functions + + [Matthias Kortstiege] + * [videodatabase] remove dead code from GetVideoSettings + + [Matthias Kortstiege] + * [videodatabase] fetch videos settings by file id, item and path + + [ace20022] + * [Settings/rpi] Disable chapter thumbnail extraction by default for the rpi. + + [ace20022] + * [VideoBookmarks] Add a setting for chapter thumbnail extraction. + + [Arne Morten Kvarving] + * added: if chapter is nameless, use a generic 'Chapter %u' string + + [ace20022] + * added: show chapters in bookmark dialog (with thumbs) + + [ace20022] + * [VideoThumbLoader] Make == operator more strict. + + [ace20022] + * [VideoThumbLoader] Add parameter to skip querying/storing stream details when extracting thumbs. This is useful for chapter thumbs extraction for example. + + [ace20022] + * [demuxer] set correct startpts when seeking chapters of discs. + + [ace20022] + * [dvdplayer] Fix wrong chapter numbers in dvd menus. + + [Arne Morten Kvarving] + * added: support grabbing chapter name and position from bluray/dvds + + [Arne Morten Kvarving] + * added: ability to specify where to extract thumb from in thumb extractor job + + [wsnipex] + * cmake: ask for sudo rights on addon install to system dirs + + [wsnipex] + * [depends] fix standalone building of binary addons + + [montellese] + * [depends] build PVR addons as binary addons + + [wsnipex] + * [depends] add binary addon specific cmake Toolchain and autotools config.site + + [montellese] + * [depends] add RBPI's firmware directory to CMAKE_FIND_ROOT_PATH and CMAKE_LIBRARY_PATH + + [montellese] + * [win32] get rid of buildpvraddons.bat and update BuildSetup.bat + + [montellese] + * [win32] also install the PDB file for debug builds + + [montellese] + * [win32] cmake: fix installation of binary addon DLLs when using Visual Studio + + [montellese] + * addons: add pvr addons as a binary addon + + [montellese] + * cmake: always add kodi-platform as a dependency to all binary addons + + [montellese] + * binary addons: add kodi-platform (and its dependency tinyxml) as a common dependency + + [montellese] + * cmake: fix handling/passing of CMAKE_C_FLAGS/CMAKE_CXX_FLAGS + + [montellese] + * cmake: add custom build step for addons between configure and build to force re-building changed files (thanks manuelm) + + [wsnipex] + * cmake: don't install binary addon dependencies in unified deps prefix path and make sure unified deps are not used for building bin addons + + [wsnipex] + * cmake: add C++11 flag + + [montellese] + * cmake: cleanup INSTALL_COMMAND/CONFIGURE_COMMAND handling for dependencies + + [montellese] + * cmake: improve patch file/command handling for dependencies + + [montellese] + * [win32] Win32DllLoader: add wrapper for fopen_s() + + [popcornmix] + * [mmalrenderer] Fix for hang on shutdown + + [Thomas Amland] + * [python] add ContextItemAddonInvoker for running context item addons + + [Thomas Amland] + * makefile cosmetics + + [popcornmix] + * [omxplayer] Fix for volume being treated as a linear scale + + [Arne Morten Kvarving] + * added: ability to specify position where thumb is taken from in DVDFileInfo + + [Arne Morten Kvarving] + * added: ability to grab all chapter name and chapter positions from players + + [foser] + * [X11] The inline cast of int32 EGLint to unsigned long XVisualInfo.visualid could cause the latter to be filled with a garbage value, resulting in no VisualInfo being returned later on. + + [foser] + * [X11] Make eglChooseConfig use a dynamic array. + + [foser] + * [X11] With empty attributes eglChooseConfig will return all configurations, including ones with a depth buffer size of zero. A minimal depth buffer of 24 is required, so return only those. + + [foser] + * [X11] Use EGLint instead of GLint for EGL arrays + + [Rainer Hochecker] + * SDL clean-up - remove HAS_SDL_OPENGL + + [AlwinEsch] + * [pvr] Improve pvr manager start/stop way + + [Kai Sommerfeld] + * [rss] CRssReader::Process: Sleep 5 secs before retrying CCurlFile::Get(). + + [Deniz Türkoglu] + * Add native artifacts to .gitignore + + [AlwinEsch] + * [gui] Improve CGUIControlFactory::Create to use 'switch' instead of 'if' + + + [montellese] + * CGUIWindowManager: force close closing dialogs/windows during DeInitialize() + + [montellese] + * addons: don't ask the user if he wants to switch to a newly installed skin if the "modal" parameter is set in OnPostInstall() + + [montellese] + * settings: allow more control over an addon setting's control + + [montellese] + * addons: extend CGUIWindowAddonBrowser::SelectAddonID() to support selecting addons that haven't been installed yet + + [montellese] + * CGUIDialogAddonInfo: make use of CAddonMgr::CanAddonBeDisabled() + + [montellese] + * addons: add some helper methods to CAddonMgr + + [montellese] + * addons: refactor CAddonInstaller and CAddonInstallerJob to be usable with a modal progress dialog + + [montellese] + * CAddonInstaller: cosmetics and cleanup + + [montellese] + * CAddonInstaller: rename PromptForInstall() to InstallModal() + + [montellese] + * IAddon: extend OnPostInstall with an additional "modal" parameter + + [montellese] + * CFileOperationJob: change to derive from CProgressJob instead of CJob + + [montellese] + * CFileOperationJob: cosmetics and cleanup + + [montellese] + * CProgressJob: add DoModal() and extend it to support a CGUIDialogProgress modal dialog + + [montellese] + * CJob: make ShouldCancel() virtual + + [xhaggi] + * [epg] fix missing assignment of series number in constructor + + [xhaggi] + * [epg] removes some unecessary setters in CEpgInfoTag + + [xhaggi] + * [epg] adds new method SetEpg() to CEpgInfoTag to drop the use of friend class in CEpg + + [xhaggi] + * [epg] refactor: changes some method signatures in CEPGInfoTag + + [xhaggi] + * [epg] get rid of mutex lock, m_bChanged and unnecessary calls to UpdatePath() in CEpgInfoTag + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [montellese] + * [win32] updave VS project files + + [montellese] + * webserver: add CHTTPPythonHandler to handle python scripts for webinterfaces using WSGI + + [montellese] + * webserver: add CHTTPPythonInvoker and CHTTPPythonWsgiInvoker to run python scripts from webinterfaces using WSGI + + [montellese] + * webserver: fix CHTTPWebinterfaceHandler::ResolveUrl() to support a custom entry page + + [montellese] + * addons: add new xbmc.webinterface addon and CWebinterface with "type", "library" and "entry" attributes + + [montellese] + * python: add basic WSGI implementation + + [montellese] + * codegenerator: improve doxygen integration (thanks notspiff) + + [montellese] + * python: add support for tp_iter, tp_iternext and iterators + + [montellese] + * python: fix some indentation in PythonSwig.cpp.template + + [montellese] + * python: add support for tp_call + + [montellese] + * python: fix property getters/setters for custom API types + + [montellese] + * python: fix code generation for index operator + + [montellese] + * python: add typemap for void* to pass through a PyObject* object + + [montellese] + * python: cleanup input/output typemap definitions for cleaner code generation + + [montellese] + * python: refactor parsing of python exceptions + + [montellese] + * python: add virtual executeScript() to CPythonInvoker + + [montellese] + * swig: add SWIG_IMMUTABLE macro for read-only properties + + [montellese] + * CScriptInvocationManager: add ExecuteSync() + + [montellese] + * CScriptInvocationManager: rename Execute() to ExecuteAsync() and add documentation + + [montellese] + * use shared pointer of ILanguageInvoker + + [montellese] + * IHTTPRequestHandler: add GetHostnameAndPort internal helper method + + [montellese] + * webserver: remember the full request URI (not just the path) + + [montellese] + * webserver: remember the full path URI of a request + + [montellese] + * webserver: increase the priorities of the special request handlers to have more more between them and the default webinterface handler + + [Menno] + * First check if allowfiledeletion is true before prompting for master password. + + [Menno] + * Only allow delete from library if user has DB write permission + + [uNiversaI] + * [readme] cleanup unused libs + + [Thomas Amland] + * [addons] update repo if version in db differ + + [Thomas Amland] + * cleanup: avoid opening db multiple times + + [Thomas Amland] + * [addons] store repo version database + + [AlwinEsch] + * [addon] Allow addons to use kodi.addon.metadata to bring description + + [Kai Sommerfeld] + * Optimize CPVRChannel. No more copies, just shared pointers. + + [Matthias Kortstiege] + * [mysql] add optional protocol compression - defaults to false + + [Matthias Kortstiege] + * [scraper] retry without appending year after first fail + + [Thomas Amland] + * [addons] remove legacy backwards compatibility behaviour + + [smallint] + * [imx] Fixed compiler warning + + [wolfgar] + * Add guard to fix build on non iMX6 arch + + [Fernando Carmona Varo] + * Added RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE implementation + + [smallint] + * [imx] Ifdef'd iMX6 specific include + + [smallint] + * [imx] Output associated pts for TRACE_FRAMES + + [wolfgar] + * [iMX6] Implement rendercapture for latest rendering rework blit fb using g2d when no deinterlacing is required + + [smallint] + * [imx] Reworked video decoding and rendering, see http://forum.kodi.tv/showthread.php?tid=211289&pid=1892440#pid1892440 + + [smallint] + * [RenderManager] preserve field type for Renderer::RenderUpdate + + [smallint] + * [imx] Added de-interlacing method enumerations FAST_MOTION and FAST_MOTION_DOUBLE + + [Martijn Kaijser] + * [android] bump SDK to 17 + + + [gokl] + * * fix tv vendor override typo + + [Martijn Kaijser] + * update startup splash image + + [Chris "koying" Browet] + * FIX: [jni] Context::sendBroadcast returns void + + [montellese] + * CTextureCacheJob: add fallback hash in case neither mtime/ctime nor size of an image are known + + [Martijn Kaijser] + * bump version to 15.0alpha2 + + [Martijn Kaijser] + * [android] remove Ouya platform as it doesn't meet our minimal android API + + [Philipp Te] + * settings.xml: changed several spinners to lists + + + [montellese] + * bump audioencoder.flac and audioencoder.vorbis to fix parallel build problems with ogg + + [Rainer Hochecker] + * dvdplayer: flush audio errors on large sync error + + [Rainer Hochecker] + * [AE] - force re-create of ffmpeg resampler after error + + [Rainer Hochecker] + * dvdplayer: sync audio after having issued GENERAL_RESYNC + + [Chris "Koying" Browet] + * FIX: video db cleanup with no parent path + + + [montellese] + * CSettingAddon: remove unused define + + [montellese] + * strings: fix Weather -> General category description + + [Matthias Kortstiege] + * [video] fix mark watched/unwatched from manage sub menu + + [Kai Sommerfeld] + * [confluence, core] String Fixes: TV settings 10021 "Web Browser" => "Settings - TV". This one was semantically completely wrong. String gets displayed on VFDs/LCDs when navigating through the items of the left side of the TV settings dialog. 31502 "Live TV" => "TV". Confluence. Seems this one got forgotten the time the resp. core changes were made. + + [Thomas Amland] + * [addons] make sure to get correct extension point before attempting to cast to plugin + + + [montellese] + * translations: fix some filenames in English's strings.po + + [xhaggi] + * [xcode] sort PVRActionListener below existing folders in /pvr + + [xhaggi] + * [gui] fix activating of context menu after skin reload while context menu was active + + [janbar] + * [PVR] fix deleted recordings view + + [Matthias Kortstiege] + * [smbdirectory] mark dot files and folders hidden (fixes #15680) + + [da-anda] + * [3D] don't back out from 3D handling on resolution changes if we're switching to a different 3D mode + + + [montellese] + * json-rpc: fix duplicate "lastplayed" in "Video.Fields.TVShow" (thanks Tolriq) + + [xhaggi] + * [seek] fix crash if no seek steps are found for the selected direction + + [Kai Sommerfeld] + * [ActiveAE] - ActiveAESink: Change several LOGNOTICE to LOGDEBUG to reduce kodi.log "spamming". + + + [montellese] + * simplify and document CLangInfo::GetLanguageLocale() + + [montellese] + * [win32] addons: fix filtering foreign language addons + + [montellese] + * addons: no need to retrieve general.addonforeignfilter in a block that is only called if its value is true + + + [montellese] + * cmake: fix debug builds by passing CMAKE_BUILD_TYPE to the addon's build + + [Rainer Hochecker] + * dvdplayer: fix missing audio info + + [Rainer Hochecker] + * dvdplayer: sync av players after unsynced seeks which may occur when rw/ff + + [Rainer Hochecker] + * dvdplayer: consider audio stalled as long as message queue is empty + + [Rainer Hochecker] + * dvdplayer: reset error integral when flushing sync errors + + [Kai Sommerfeld] + * Fix AnnouncementManager::Announce(). Announcers may be removed while iterating announcers vector. + + + [Matthias Kortstiege] + * [videoinfoscanner] reset library bools only once - fixes #15805 + + [AlwinEsch] + * [pvr] Fix compiler warning in CGUIWindowPVRRecordings + + [wsnipex] + * [configure] make sure the gcc-4.9 SSE workaround is only enabled on x86 + + [Thomas Amland] + * [linux] prepend -Wall so it doesn't override flags from environment + + + [Rainer Hochecker] + * [win32] - fix DirectSound for streams with very low sample rates + + [Chris "koying" Browet] + * FIXUP: fix python PIL after #5218 + + [Memphiz] + * [jenkins/addons] - fix error detection during addons build + + + [ronie] + * [Confluence] api bump + + [ronie] + * revert xbmc.gui bw-compatibility change + + [Carcharius] + * Add support for jumping to the first unwatched tv show season/episode. Only allows jumping to unwatched episodes if sorting by episode number. + + [Pär Björklund] + * issue 1262131 ignoring bytes read Should silence a bunch of warnings without altering code logic + + [Pär Björklund] + * issue 1262428 out of bounds read this code seems to have done nothing for a long time. If the first loop hit it's break condition the second loop would check the same value and break directly. Not sure what effects this might have had? + + [Pär Björklund] + * issue 1269601 bad override base class method is not const + + [Pär Björklund] + * 1269602 bad override base class is not const + + [Pär Björklund] + * issue 1269603 unchecked return value not really an issue but might as well fix it. + + [Pär Björklund] + * issue 1269604 Dead code, no changes in git blame since 2012, comment out to avoid further warnings + + [Pär Björklund] + * issue 1269605 First check makes second check impossible to be true also switched to c++ style casts + + [montellese] + * cmake: fix include of check_target_platform.cmake + + [Sam Stenvall] + * [pvr] don't allow the "go to parent" item to be deleted from the recordings window. The Delete action can't be triggered by the context menu anymore but is still triggerable using the delete key + + [Sam Stenvall] + * [gui] remove any set context buttons for the "go to parent" item (fixes #15732) + + [wsnipex] + * [configure] enable SSE when using gcc-4.9 + + [Karlson2k] + * [win32] JSONVariantWriter::Write(): use wide string version of setlocale() to prevent crash on win32 + + [Karlson2k] + * JSONVariantWriter::Write(): do no re-set locale if locale is already "C" + + [Karlson2k] + * [win32] Set thread local locale for started threads + + [Karlson2k] + * [win32] Set thread local locale for main thread + + [Karlson2k] + * [win32] WIN32Util: add SetThreadLocalLocale() for controlling thread local locale + + [Karlson2k] + * [win32] Add win32/crts_caller for calling same function in all loaded CRTs + + [Matthias Kortstiege] + * [mysql] fix transaction handling by set autocommit to false when requested + + [ruuk] + * Add optional .index() to Control.GetLabel() allowing access to secondary labels + + [Stephan Raue] + * [configure.in] use pkgconfig to detect curl + + [Karlson2k] + * [win32] Use _beginthreadex() instead of CreateThread() for better compatibility with CRT functions + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [montellese] + * [win32] update VS project files + + [montellese] + * video library: add documentation for CVideoLibraryQueue and CVideoLibraryJob implementations + + [montellese] + * video library: move all video library scanning logic into CVideoLibraryQueue and allow queueing multiple library scans + + [montellese] + * video library: add CVideoLibraryScanningJob + + [montellese] + * video library: move all video library cleaning logic into CVideoLibraryQueue + + [montellese] + * video library: introduce CVideoLibraryCleaningJob + + [montellese] + * video library: move CMarkWatchedJob to CVideoLibraryMarkWatchedJob and use CVideoLibraryQueue + + [montellese] + * video library: add CVideoLibraryQueue and CVideoLibraryJob + + [montellese] + * utils: add CProgressJob + + [montellese] + * CJobQueue: add boolean return value to AddJob() + + [montellese] + * CJobQueue: add IsProcessing() + + [montellese] + * videodb: cleanup paramters of CleanDatabase() + + [Karlson2k] + * StringUtils::AlphaNumericCompare(): do not use temporal locale object as use_facet() return only reference to facet stored in locale + + [Karlson2k] + * LangInfo: add m_locale and GetLocale() for current locale + + + [wsnipex] + * [depends] enable C++11 for native builds + + [montellese] + * cmake: add platform definitions for android, darwin, freebsd, ios, rbpi and windows + + [wsnipex] + * cmake: add platform directory and parsing of platform specific definitions + + [AlwinEsch] + * [pvr] Cleanup CPVRDatabase help text + + [AlwinEsch] + * [pvr] Remove double used header file + + [montellese] + * cmake: only set the scope of the list of an addon's dependencies once + + [montellese] + * cmake: only add a dependency to the list of an addon's dependencies if it has been downloaded and should be built + + [montellese] + * cmake: only determine the URL of a dependency if it will be downloaded and built + + [montellese] + * cmake: support platforms.txt for dependencies + + [montellese] + * cmake: extract target platform checking logic into check_target_platform.cmake + + [montellese] + * cmake: pass CORE_SYSTEM_NAME to addons and dependencies + + [Violet Red] + * [fix] Allow mixed Audio&Video playlists + + [Memphiz] + * [docs] - adapt docs - binary addons (audioencoder, pvr) need to be built manually in an extra step from now on + + [Memphiz] + * [pvr-addons] - make sure that the git repo are in the prefix and not in a shared dir (else we race if multiple nodes on the same mashine are trying to do any operations on this shared repo) + + [Memphiz] + * [jenkins] - refactor jenkins buildsteps for allowing seperate binary addons building + + [Memphiz] + * [depends] - remove xbmc-pvr-addons and xbmc-audioencoder-addons from depends build (will be build in seperate step from now on) + + [montellese] + * jsonrpc: fix SetEpisodeDetails expecting a datetime instead of a date value for "firstaired" + + [AlwinEsch] + * [settings] Allow coded settings dialogs to define label (needed to pass addon strings) + + [da-anda] + * [keymap] trigger OSD when pressing SELECT on remotes in Visualisation window to be consistent with videos + + + [Arne Morten Kvarving] + * [c++11] - quell some warnings + + [Lars Op den Kamp] + * Revert "[addon] Increase API with change 'char*' return value to 'const char*' to fix compiler warnings (addon relevant part)" + + [Dom Cobley] + * [mmalrenderer] Don't call UnInit internally. Use an internal function. + + [popcornmix] + * [mmalcodec] Avoid deinterlace for dvd menus for now + + [popcornmix] + * [mmalcodec] Introduce a preroll period to buffer up frames on startup + + [popcornmix] + * [mmalrenderer] Add back in SetVideoRect lost in PR6090 + + [popcornmix] + * [mmalrenderer] Avoid grabbing the g_graphicsContext lock - it can deadlock + + [popcornmix] + * [mmalrenderer] Render new from frame from RenderUpdate rather than FlipPage + + [popcornmix] + * [mmalrenderer] Ensure we have requested number of buffers in non-accelerated case + + [popcornmix] + * [mmalrender] Skip some log message in bypass mode + + [popcornmix] + * [rbp] Enable error concealment by default + + [popcornmix] + * [mmalcodec] Reduce number of extra video buffers + + [popcornmix] + * [mmalcodec] Skip some setup that is not required when closing + + [popcornmix] + * [mmalcodec] Report when support is compiled in + + [Rainer Hochecker] + * [pvr] bump addons + + [Rainer Hochecker] + * [addons] fix FreeString - strings are allocated by strdup + + [ronie] + * [Confluence] fix time label in seek dialog + + [Rainer Hochecker] + * Revert "[addon] Change 'char*' return value to 'const char*' to fix compiler warnings on addon lib" + + [Rainer Hochecker] + * [pvr] bump version + + [glenvt18] + * [videosync] drm: fix multi-head. + + [Memphiz] + * [osx/ios] - remove old videosync implementation for ios/osx and hook the new impl up in project and videoreferenceclock + + [Memphiz] + * [osx/ios] - add proper videosync implementations for ios and osx + + [Matthias Kortstiege] + * [videoinfoscanner] added ability to explicitly skip fast hashing + + [Memphiz] + * [ios/windowing] - add displaylink handling + + [Memphiz] + * [ios/atv2] - remove all the displaylink related stuff from the appcontrollers + + [Memphiz] + * [ios/screenmanager] - expose the current screenIdx to the outside + + [Memphiz] + * [ios/eaglview] - remove displaylink handling from eaglview + + [AlwinEsch] + * [settings] Moving label and help into ISetting + + [popcornmix] + * [omxplayer] Skip packet concatenation for WMAV2 files + + [Chris "Koying" Browet] + * FIX: [droid] fix joystick after #5624 + + [Voyager1] + * Fix occasional build errors related to unclean binary addons build + + [Chris "koying" Browet] + * CHG: [aml] remove su hacks + + [montellese] + * webserver: add support for JSONP for JSON-RPC requests + + + [Arne Morten Kvarving] + * [TexturePacker] - fix compilation with c++11 + + [AlwinEsch] + * [pvr] bump addons with #6367 + + [montellese] + * [skin.re-touched] fix win32 build + + [popcornmix] + * [resamplepi] Try to report the same numbers as ffmpeg + + [popcornmix] + * [omxplayer] Add some info about hdmi sync to codec overlay + + [popcornmix] + * [omxplayer] Avoid extra frame allocation when deinterlace might be enabled + + [AlwinEsch] + * [confluence] Don't use BehindDialogFadeOut for channel manager (does not work with addon dialog) + + [AlwinEsch] + * [addon] Change 'char*' return value to 'const char*' to fix compiler warnings on addon lib + + [AlwinEsch] + * [confluence] Add button for new channel on PVR channel manager + + [AlwinEsch] + * [pvr] Add possibility in channel manager to edit channel settings on addon + + [AlwinEsch] + * [pvr] Add usage of channel settings to addon interface + + [AlwinEsch] + * [gui] Fix addon dialog render order + + [AlwinEsch] + * [pvr] Add deleted recordings trash support + + [AlwinEsch] + * [confluence] Add button to open deleted recordings + + [AlwinEsch] + * [confluence] Add icon for deleted recordings + + [AlwinEsch] + * [language] Add needed strings for deleted recordings trash support + + [AlwinEsch] + * [codec] Add RDS type handling in addon lib (CODEC Ver. 1.0.1) + + [AlwinEsch] + * [gui] Allow usage of slider and several dialogs on addons (GUI Ver. 5.8.0) + + [AlwinEsch] + * [pvr] Rename DialogChannelScan to OpenDialogChannelScan + + [AlwinEsch] + * [addon] Increase API with change 'char*' return value to 'const char*' to fix compiler warnings (addon relevant part) + + [AlwinEsch] + * [codec] Increase API version to 1.0.1 (addon relevant part) + + [AlwinEsch] + * [gui] Increase API version to 5.8.0 (addon relevant part) + + [AlwinEsch] + * [pvr] Increase API version to 1.9.4 (addon relevant part) + + + [popcornmix] + * [omxcore] Skip out of flush on error + + [wsnipex] + * [linux] fix building with gcc 4.9 on i386 + + + [Memphiz] + * [ios] - fix 2 more warnings about unhandled enum value in switch case + + [Memphiz] + * [osx/ios/atv2] - sync xcode project after libsquish was moved to depends - fixes linker warning + + [Memphiz] + * [osx/ios/atv2] - kill 300+ warnings about unused variables by disabling the build of all the neptune tls keys we don't make use of + + [Martijn Kaijser] + * [skin] update re-touched + + [popcornmix] + * [omxplayer] Remove test of removed setting, avoids a log message + + [ronie] + * [Confluence] cosmetics + + [Martijn Kaijser] + * [android] bump minimum API version to 17 and set target API to 21. Also remove any API < 17 checks and obsolete OMXLibName. + + [Rainer Hochecker] + * [AE] clean up - drop enumeration for vanished engines + + [Chris "Koying" Browet] + * FIX: [gles;amc;deint] invert fields because pic is inverted + + [Chris "Koying" Browet] + * FIX: [amc] proper fix to overbuffer + + + + [fritsch] + * FFmpeg: Bump version to 2.5.4-Isengard-alpha + + [Martijn Kaijser] + * remove pre-Frodo upgrade code for legacy audio channel settings + + [Martijn Kaijser] + * remove pre-Frodo upgrade code for legacy add-on settings + + + [psyton] + * Support for reading embedded CUE from tags. + + [Matthias Gehre] + * Do not render when dpms is active + + [Matthias Kortstiege] + * [dialogvideoinfo] removed obsolete path invalidation code + + [anaconda] + * [python] Don't set PYTHONCASEOK=1. + + [Tobias Markus] + * [coverity] Fix for #1194431 + + + [xhaggi] + * [seek] reduces the default for seekdelay from 1000ms to 750ms + + [xhaggi] + * [cleanup] drops unnecessary delay for setting Player.Seeking to false + + [xhaggi] + * [seek] use a static delay for analog seek as you can now disable the delay in settings which breaks analog seeking + + [xhaggi] + * [cleanup] kills m_seekHandler in CApplication because SeekHandler use Singleton + + [xhaggi] + * [seek] introduces seek settings (steps and delay) for music + + [Memphiz] + * [osx/ios] - update readmes to reflect minimum runtime targets (osx10.7/ios5.1.1), minimum xcode versions (xcode 6.x), minimum SDKversions (osx10.9, ios8.0) and remove instructions for building ATV2 + + [xhaggi] + * [seek] use setting to turn off delay instead of validate enabled seek steps + + [xhaggi] + * [keymaps] unify seek keys for FullscreenVideo and Visualisation + + [xhaggi] + * [seek] use smart seek for ACTION_SMALL_STEP_BACK + + [xhaggi] + * [seek] refactor analog seek handling out of CApplication into CSeekHandler + + [xhaggi] + * [seek] refactor seek handling out of CGUIWindowFullScreen into CSeekHanlder + + [AchimTuran] + * Code cosmetic for readProcStat + + [Thomas Amland] + * [python] remove leftover xbmc.python 1.0 compat code + + + [Memphiz] + * [tests] - string literals need spaces when concatinated + + [Memphiz] + * [tests] - add some missing includes + + [Memphiz] + * [gtest] - pass cxx flags to gtest (for making it compile with c++11 on osx) + + [Memphiz] + * [osx] - .m files need to be compiled with C compiler not with C++ compiler (means clang instead of clang++) + + [Memphiz] + * [gtest/c++11/darwin] - add -DGTEST_USE_OWN_TR1_TUPLE=1 to testsuite for satisfying apple clang + + [Arne Morten Kvarving] + * [tests] - move atomics tests from shared_ptr of thread array to vector of shared_ptr of thread - fixes tests broken by change to c++11 shared pointers for clang 3.5 + + [Rainer Hochecker] + * paplayer: fix gapless for mp3 + + [Pär Björklund] + * [c++11/GuiFontCache] - move the boost includes from the header to the cpp file. This is needed because of clang having issues with distinguishingg the std::vector with boost::vector. + + [Memphiz] + * [c++11] - atoi is not member of namespace std + + [Memphiz] + * [c++11] - add more missing explicit includes + + [Memphiz] + * [darwin/rsxs/quirk] - force usage of toolchain stdbool.h - else rsxs plants its own non clang compatible version of it (somehow its m4 doesn't detect it correctly - don't bother with it...) + + [Memphiz] + * [jenkins/ios] - don't overwrite deployment target but use what is defined in xcconfig + + [Memphiz] + * [osx/ios] - enable c++11 standard - bump osx deployment target from 10.6 to 10.7 (means we need at least osx 10.7 for beeing able to run) and bump ios deployment target from 4.2 to 5.1 (means we need at least ios 5.1 to run) + + [Memphiz] + * [depends/plist] - added c++11 patch + + [Memphiz] + * [xcode/c++11] - use std::move for making an object copy + + [Memphiz] + * [xcode/c++11] - std::istream can't be checked for NULL - check is unneeded anyways ... + + [Memphiz] + * [xcode/c++11] - c++11 forbids concatinating constant strings without seperation by space in preprocessor definitions + + [montellese] + * addons: rename xbmc.gui.webinterface extension point to xbmc.webinterface + + [Memphiz] + * [xcode/c++11] - explicitly include stdlib where needed + + [Memphiz] + * [xcode/c++11] - add explicit casts where narrowing fails in c++11 + + [Chris "Koying" Browet] + * [C++11] replace deprecated auto_ptr by unique_ptr + + [Chris "Koying" Browet] + * [c++11] remove boost::shared_array + + [Chris "Koying" Browet] + * CHG: Move to c++11 and use std:shared_ptr rather than boost + + [montellese] + * CGUIDialogAudioSubtitleSettings: enable volume and volume amplification settings when passthrough is enabled but playback is not using passthrough + + + [Memphiz] + * [ios] - when using the hdmi adapter (or any other hardware tvout adapter) with ios8 devices - ensure that we do the proper rotation even if only the resolution on the external screen is switched + + [tavoc] + * [confluence] fix misalignment of epg progressbar + + [xhaggi] + * [gui] fix missing breaks in switch/case CGUIDialogSeekBar + + [Martijn Kaijser] + * [repo] bye bye Frodo + + [Rainer Hochecker] + * drop some useless level 4 settings for player and renderer + + [wsnipex] + * [rtmp] re-add rtmp options + + [Thomas Amland] + * fix video content type checks + + + [xhaggi] + * [confluence] output new info label Player.SeekStepSize + + [xhaggi] + * [gui] adds new info label Player.SeekStepSize + + [AchimTuran] + * Fixed wrong return type + + [montellese] + * remove unused strings after 9cf3094eed8ca285b26eded5a354e0ec42c79e60 + + [montellese] + * python: fix return values from generated Foo_setMember() implementation (thanks notspiff) + + [montellese] + * settings: remove unused and hidden videolibrary/musiclibrary.enabled settings + + [montellese] + * CWebServer: silence compiler warnings (thanks notspiff) + + [Memphiz] + * [ios/atv2/packaging] - switch back to the hardcoded dsym dir - fixes dsym backups on jenkins which were broken in a0a6e40a6299ff004353603201e6d60f569c1a2c + + [Memphiz] + * [depends/tar-native] - force fdopendir to no because we don't have it when compiling native on 10.9 with 10.10 sdk installed (it would pick fdopendir from 10.10 sdk which is not available at runtime on 10.9 later on when tar is used for packaging the ios deb files) + + [Frank Razenberg] + * [keymap] Update xbox 360 keymap to group joysticks by family; sync names with xpad driver in linux 3.18 + + [Frank Razenberg] + * Remove no longer needed initialization call + + [Frank Razenberg] + * Update CJoystick for changed ButtonTranslator signature + + [Frank Razenberg] + * [buttontranslator] Group joystick keymaps by family + + [wsnipex] + * [configure] tinyxml upstream does not provide a pkg-config file, + + [Kib] + * Update irc channel + + [xhaggi] + * [gui] fix the focus issue since file item list is empty until directory is fetched + + [Tobias Markus] + * cppcheck performance fixes in interfaces/ + + [Matthias Kortstiege] + * [guilib] fix hint text vanish on unfocus - closes #15765 + + [Sebastian Brückner] + * Add support for more CEC remote keys on Android. + + [Rainer Hochecker] + * dvdplayer: fix clock speed + + [Rainer Hochecker] + * dvdplayer: reset speed of video reference clock after refresh rate changed + + [Rainer Hochecker] + * dvdplayer: only consider standard framerates for vfr + + [Matthias Kortstiege] + * [videodatabase] include tvshows base dir in GetPathsForTvShow (fixes #15739) + + [Rainer Hochecker] + * dvdplayer: discard render buffers if gui is not active + + [montellese] + * python: extend ILanguageInvocationHandler to not have to call g_pythonParser directly in CPythonInvoker + + [da-anda] + * [3D] remember user selected 3D modes between videos until playback ended + + [da-anda] + * [3D] handle stereoscopic mode of videos in mixed playlists + + + [ace20022] + * [Fix][bluray] Show simplified bd menu with all playback paths. This fixes playback of (unsupported) bd-java menu disc via the simple menu, e.g., through json-rpc. Additionally GUIDialogSimpleMenu accepts CFileItem& now. + + [Matthias Kortstiege] + * PR6334 xcode sync + + [ace20022] + * [dialogs] Move CGUIWindowVideoBase::ShowPlaySelection to its own class. + + [ace20022] + * [FileItem] Change m_items.size() <= 0 to m_items.empty(). + + [xhaggi] + * [gui] fix: dialog seek bar slider not updated correctly + + [xhaggi] + * [seek] use SeekHandler for ACTION_STEP_FORWARD and ACTION_STEP_BACK + + [xhaggi] + * [seek] adds additive seek support + + [Martijn Kaijser] + * [addon] webinterface shouldn't have GUI as dependency + + + [Rainer Hochecker] + * [pvr] - set framerate if not set by demuxer + + [Rainer Hochecker] + * dvdplayer: fix changing refresh rate after invalid state + + [AlwinEsch] + * [pvr] Fix list change with first or last page selection on Channel Manager + + [Rainer Hochecker] + * [pvr] do not persist channel data a user can not set + + [AlwinEsch] + * [pvr] Fix in Channel Manager channel move with mouse + + [uNiversaI] + * [rebrand] ffmpeg extra-version xbmc -> kodi + + [Kai Sommerfeld] + * [PVR] Optimized CPVRManager::CanSystemPowerdown not to do expensive backend calls (e.g. GetTimers) but to act 100% on locally cached data. + + [Thomas Amland] + * text rendering: dont change character spacing on justify, only word spacing + + [Kai Sommerfeld] + * Optimize CPVRRecording. No more copies, just shared pointers. + + + [Jonathan Lane] + * Fix build in OSX with case-sensitive FS. + + [Tobias Markus] + * cppcheck performance fixes in dbwrappers/ + + [montellese] + * CGUIWindowSlideShow: use CGUIViewStateWindowPictures::GetExtensions() as a fallback if no file extensions were specified in RunSlideshow() + + [montellese] + * CGUIViewStateWindowPictures: cleanup GetExtensions() + + [montellese] + * CGUIViewStateWindowPictures: make GetLockType(), GetExtensions() and GetSources() public like in CGUIViewState + + [Tobias Markus] + * cppcheck performance fixes in win32/ + + [wsnipex] + * [configure] check for tinyxml >= 2.6.2 + + [wsnipex] + * [configure] check for yajl >= 2.0 + + [Thomas Amland] + * [repos] handle errors in repo xml parsing and checksum/addons.xml fetching + + [Ryan Gribble] + * [pvr] bump pvr addons to latest commit + + [Thomas Amland] + * remove unused method + + [Pär Björklund] + * Move GetActiveWindowID from CApplication to a more fitting home in CGUIWindowManager + + [arnova] + * fixed: External subs in (local) custom folder did not work with url encoded files + + [arnova] + * changed: Rename shared strPath to seperate strMoviePath and strSubtitlePath for clarity + + [arnova] + * changed: Add option to not add the path with ChangeBasePath + + [h.udo] + * [Keyboard Layouts] Add Spanish QWERTY + + [Thomas Amland] + * [python] prevent segfault when calling DialogProgress(BG) methods before create() + + [Thomas Amland] + * [python] fix video duration infolabel inconsistency (fixes ticket #13904) + + + [uNiversaI] + * [readme update] libyajl-dev >= 2.0 + + + [Rainer Hochecker] + * [pvr] fix segfault when changing channels via json-rpc + + [Ben Avison] + * Fix for font corruption seen on Windows + + [xhaggi] + * [gui] fix list control couldn't get the focus after introducing #5804 + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * webserver: add image transformation handler for /image/ paths + + [montellese] + * CTextureCacheJob: add ResizeTexture() implementation + + [Rainer Hochecker] + * dvdplayer: consider audio stream stalled if queue ran dry + + [montellese] + * CPicture: add ResizeTexture() implementation + + [Violet Red] + * [core] Support mixed media types in playlists + + + [Fabian Ockenfels] + * [Confluence] GUIDialogVideoInfo Separate actor name and role + + [Pär Björklund] + * fixed indentation and style + + [Fabian Ockenfels] + * [GUIDialogVideoInfo] Separate actor name and role + + [Tobias Arrskog] + * Remove FEH + + [Anssi Hannula] + * [android] Add 7.1 PCM playback support + + [Tobias Arrskog] + * Dropped libyajl 1.x and removed the dependency on system.h in the JSON parser/writer + + + + [AlwinEsch] + * [confluence] Fix position switching in PVR channel manager dialog + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [Pär Björklund] + * Moved input handling from CApplication into it's own class CInputManager. Removed global g_joystick and made it a private member of CInputManager + + [Pär Björklund] + * Moved window creation and destruction from CApplication and into CGUIWindowManager + + [wsnipex] + * [cmake] clean addons project dir before building from depends + + [wsnipex] + * [cmake] pass arch definitions down to autotools based dependencies + + [wsnipex] + * [cmake] pass autoconf config.sub, config.guess down to addon dependencies + + [montellese] + * [depends] fix missing DEPENDS_PATH definition for non-darwin builds + + [montellese] + * initialize all members of HTTPFileHandler + + [montellese] + * initialize all members of IHTTPRequestHandler + + [Memphiz] + * [atv2] - remove hardcoded gcc 4.2 + + [Memphiz] + * [ios/atv2/osx] - bump sdk version to ios 8.1 and osx 10.10 + + [Memphiz] + * [win32] - bump texturepacker to 1.0.1 ( contains pr #6301 ) + + [ronie] + * [Confluence] focus play/pause button by default + + [montellese] + * [win32] update .gitignore + + [ronie] + * [Confluence] reduce code duplication + + [ronie] + * [Confluence] textbox fixes after 20dd190 + + [AlwinEsch] + * [confluence] Add PVR related parts to music OSD + + [AlwinEsch] + * [pvr] Allow usage of pvr buttons on music osd + + [Rainer Hochecker] + * dvdplayer: avoid unwanted dropping in output stage of video + + [Rainer Hochecker] + * VAAPI: avoid reset when running out of surfaces + + [Rainer Hochecker] + * dvdplayer: do not reset hw decoder if just ffmpeg get_buffer failed + + [Rainer Hochecker] + * dvdplayer: drop dead code - IHardwareDecoder::Section + + [montellese] + * [cmake] fix missing BUILD_ARGS in custom CONFIGURE_COMMAND for dependencies + + [uNiversaI] + * [update] use real support website link + + [Rainer Hochecker] + * fix render order for addon dialogs + + [Jonathan Dray] + * fix(build): debian packages generation + + [ronie] + * [Confluence] use grouplist in MusicOSD + + [ronie] + * [Confluence] re-align buttons after 8832317 + + [Andrius] + * Fix TexturePacker segfault with grayscale PNGs. see http://forum.kodi.tv/showthread.php?tid=216503 + + [Rainer Hochecker] + * [win32] - bump librtmp + + [Rainer Hochecker] + * [OSX] - drop unneeded script for librtmp + + [Rainer Hochecker] + * librtmp: bump to 2.4 + + [Tobias Markus] + * Add missing initialization for m_forceUnicodeFont + + [Memphiz] + * [jenkins] - don't clamp release builds to 1 thread - parallel building seems working ok on the builders [tm] + + [fritsch] + * dvdplayer: fix calculation of level when data based + + [Ben Avison] + * Fix for crash on startup on iOS + + [Sam Stenvall] + * [confluence] disable the "Download" item in the subtitle menu when in live TV + + [Sam Stenvall] + * [confluence] display the subtitle button in live TV too (fixes #15688) + + [Sam Stenvall] + * [confluence] move the teletext button to the left button group + + [montellese] + * video library: overwrite the scraped runtime if the one from stream details is more accurate + + [montellese] + * VideoThumbLoader: use already available reference variable + + [montellese] + * videodb: add SetDetailsForItem() + + [Sam Stenvall] + * [gui] bump version + + [Sam Stenvall] + * [confluence] bump version + + [Sam Stenvall] + * [pvr] remove the "edit" and "delete" buttons from the channel manager + + [Sam Stenvall] + * [pvr] remove support for "virtual" channels + + [ronie] + * [Re-Touched] Add PVR support + + [Balint Reczey] + * mips: Pass --disable-mips.* flags to FFmpeg to cover more platforms + + [Balint Reczey] + * mips: Use #pragma once instead of C style header guard + + [Andriy Prystupa] + * mips: Fix addon shared library naming + + [Balint Reczey] + * mips: Fix build with using OpenGL rendering + + [Balint Reczey] + * mips: Don't use ASM rounding on MIPS + + [Balint Reczey] + * mips: Add configure option for mips and mipsel + + [theuni] + * mips: add atomics + + [ronie] + * [Confluence] don't hide header during radio playback + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [Memphiz] + * [osx] - downgrade curl to former version for now until a serious symbol clash with system libcurl is solved + + [Memphiz] + * [depends/TexturePacker] - fix extraction of delay and disposal from animated gifs (wrong assumption what ExtensionBlockCount was ...) - add delay as printout too + + [ksooo] + * [PVR] Fixed: Calculation of PVR wakeuptime. Did not take margin start of timer into account. + + [montellese] + * binary addons: bring win32 in line with how the "kodi" dependency is prepared/provided + + [montellese] + * cmake: add missing get_filename_component() for DEPENDS_PATH + + [montellese] + * cosmetics: fix indentation in binary addons cmake buildsystem + + [Memphiz] + * [depends/ffmpeg] - force ffmpeg build to use AR and RANLIB from the toolchain + + [Memphiz] + * [depends/droid] - get rid of the NDK_VER parsing/define - not needed anymore as we rely on ndk r9c now (sed works differently on darwin and never got the parsing right) + + [Memphiz] + * [depends/PIL] - force "toolchain-gcc -shared" as linker command for shared libs (LDSHARED) - else it will pull stupid flags based on the building system into it (e.x. -bundle because i compile on osx - stupid python) + + [Memphiz] + * [depends/openssl] - force openssl to use the ar from the toolchain + + [Memphiz] + * [depends/libplist] - stop rebuilding libplist when not compiling for darwin + + [Memphiz] + * [docs] - clarify android readme a bit and added extra bits for building on osx + + [Memphiz] + * [depends] - probe if build os supports sort -V - if not - use sort for determining android build-tools + + [Memphiz] + * [depends/TexturePacker] - make the decisions based on the build mashine and pass the NATIVE_ARCH_DEFINES to the build - not the target defines + + [Memphiz] + * [depends] - expose NATIVE_ARCH_DEFINES and build_os via the Makefile.include to our depends + + [Memphiz] + * [depends/configure] - add build_os - defining our os strings for the os the compilation is run on + + [Memphiz] + * [m4] - add NATIVE_ARCH_DEFINES which present the -DTARGET_ defines for the system the compilation is run on + + [Memphiz] + * [AML/videobookmark] - use the CScreenshotAML class for generating video bookmarks on amlogic + + [Memphiz] + * [AML/Screenshot] - add screenshot implementation for aml platforms - based on the amvideocap driver (needs amlogic kernel with amvideocap support) + + [Memphiz] + * [win32/packaging] - bring the package list back to alphabetical order + + [montellese] + * python: add ControlTextBox.autoScroll() (thanks notspiff) + + [montellese] + * guilib: add CGUITextBox::SetAutoScrolling(delay, time, repeatTime [, condition]) + + [montellese] + * cmake: fix expansion of EXTERNALPROJECT_SETUP variable + + [montellese] + * cmake: replace addon depends build system with call to add_addon_depends + + [montellese] + * cmake: add some comments to handle-depends.cmake + + [Karlson2k] + * [win32/packaging] - Update download script to retry downloading if archive can't be extracted + + [Memphiz] + * [win32/packaging] - repack all win32 depencencies into formed packages + + [Matthias Kortstiege] + * [gui] fix font cutting in auto height textboxes + + [Sam Stenvall] + * [pvr] only update a group's last watched timestamp if the timestamp has actually changed + + [montellese] + * webserver: handle error in case no webinterface is installed + + [montellese] + * cosmetics: remove unused/rarely used "using namespace" declarations + + [montellese] + * [win32] update VS project files + + [montellese] + * webserver: add unit tests + + [montellese] + * [unit tests] set special://home to be able to dynamically load libraries + + [montellese] + * webserver: refactor handling of HEAD requests and of caching and range HTTP headers + + [montellese] + * utils: add unit tests for CHttpRange, CHttpResponseRange and CHttpRanges + + [montellese] + * utils: add HttpRangeUtils to handle HTTP range requests and responses + + [montellese] + * webserver: rename and document methods in IHTTPRequestHandler + + [montellese] + * make CCurlFile::GetHttpHeader() const + + [Kevin Mihelich] + * Fixes for using giflib 5.1 in GifHelper.cpp + + [Rafał Chwiała] + * It allows to play video with external subtitle over UPnP. + + [montellese] + * [confluence] VisualisationPresetList.xml: adjust the header label and list control IDs + + [montellese] + * CGUIDialogVisualisationPresetList: align header label and list control IDs with settings dialogs + + [Kai Sommerfeld] + * Fix CUDevProvider::GetDisks() to support non-removable and optical drives correctly. Fix CAutorun::PlayDisc() to call CMediaManager::GetDiscPath() as last resort. These changes do fix autostart and "Play disc" of Blu-ray disks on Linux distros using UDev, like OpenELEC. + + [Rafał Chwiała] + * PATCH for Platinum library needed to external subtitles over UPnP works. + + [Rafał Chwiała] + * platinum Changes to external subtitles over UPnP works + + [Tobias Arrskog] + * Remove xrandr from application + + [Pablo Molina] + * Added playcount and lastplayed on Audiolibrary.setSongDetails + + [theuni] + * mips: add guards + + + + + [ronie] + * revert makefile changes + + [ronie] + * [Re-Touched] Add PVR support + + [Martijn Kaijser] + * bump to 14.1 final + + + [ronie] + * [Re-Touched] Add PVR support + + [Martijn Kaijser] + * bump to 14.1 final + + + [ronie] + * [Re-Touched] Add PVR support + + [Martijn Kaijser] + * bump to 14.1 final + + + [Matthias Kortstiege] + * [gui] fix font cutting in auto height textboxes + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [Memphiz] + * [keyboard] - disabletextinput after the keyboard dialog is open because in that state the editcontrol has not the focus and therefore textinput is disabled (and text is handled via key actions in this case) + + [Memphiz] + * [guilib/input] - replace GUI_MSG_INPUT_TEXT with ACTION_INPUT_TEXT + + [Memphiz] + * [guilib] - add new action and members ACTION_INPUT_TEXT + + [Sam Stenvall] + * [pvr] Helix: bump PVR addons + + [Mike] + * darwin dlna client user agent string override not working f + + [uNiversaI] + * [Helix backport] Fix memory leak in OGGcodec: m_inited was never set to true and inial… + + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing tv shows or episodes + + [anaconda] + * Fix state not saved after 5842 if playing from "Recently added". + + [Thomas Amland] + * improve error handling of stacked items + + [Rainer Hochecker] + * ffmpeg: bump to 2.4.6 - bug fix + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [Rainer Hochecker] + * upnp: do not block upnp renderer on start of playback + + [Memphiz] + * [sdl/osx] - stop eating cmd+v keycombination away in sdlinput - application handles the paste shortcut already - fixes non-working paste on non-osd-keyboard textfields for osx + + [Memphiz] + * [osx] - fixed vsync for osx - notify reference clock when refresh rate has changed - fixes #15612 + + [montellese] + * media library: don't change the current directory path in SetHistoryForPath() (fixes #15668) + + [montellese] + * media library: ignore trailing slashes when comparing the start directory path with the current directory path + + [montellese] + * URIUtils: support ignoring trailing slashes in PathEquals() + + [Memphiz] + * [addoninstaller] - prevent recursion on addons with circular dependecies - fixes stackoverflow crash with xunity repo + + [montellese] + * videodb: fix GetRandomMusicVideo() with empty WHERE clause (fixes mixed party mode) + + [Martijn Kaijser] + * [addons] sync with repo + + [Sam Stenvall] + * [pvr] fix switching to the previous channel group (fixes #15661) + + [Sam Stenvall] + * [pvr] don't attempt to count the number of recordings unless the PVR manager is started. Fixes #15591 + + [Karlson2k] + * [android] [vfs] PosixFile: fix large file support on Android + + [fritsch] + * DVDDemuxFFmpeg: Take care of av_probe changing buffer_size fixes #15659 + + [a11599] + * [fixed] DXVA flickering on AMD + + [Rainer Hochecker] + * vaapi: allocate an extra surface + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [Anssi Hannula] + * AESinkALSA: Workaround alsa-lib buffer overflow in snd_pcm_chmap_print + + [Rainer Hochecker] + * wasapi: probe S24 before S32, works around some driver bugs + + [Chris "Koying" Browet] + * FIX: [aml] only use screen size if ppscaler is disabled + + [Rainer Hochecker] + * dvdplayer: fix potential segfault when silencing audio + + [ronie] + * [Confluence] labels in PVR Search could overlap + + [Rainer Hochecker] + * dvdplayer: ffmpeg demuxer - do not skip streaminfo if format is not known + + [fape] + * fix GUISpinControl process + + [montellese] + * sorting: fix Container.SetSortMethod (fixes #15627) + + [Martijn Kaijser] + * bump to 14.1rc1 + + [Bl4ck09] + * Do not scroll list label if false + + [ronie] + * [Confluence] remove addon ratings + + [davilla] + * FIX: [aml;pivos] Fix 1080 on MX + + [montellese] + * media library: fix path history for items with a real path differing from the requested path + + + [Ben Avison] + * Switch from glDrawArrays() to glDrawElements(). + + [Ben Avison] + * Move vertex data into an OpenGL VBO when the font cache entry is populated. + + [Ben Avison] + * Move the vertex data across to a vertex buffer object just prior to drawing. + + [Ben Avison] + * Enable hardware clipping. + + [Ben Avison] + * Rather than applying the translation offsets to the vertices, now applies them to the model view matrix from the top of the matrix stack and pushes it over to OpenGL. The vertices themselves are still all held client-side. + + [Ben Avison] + * Move the application of the translation offsets into the GLES code. + + [Ben Avison] + * Rewrite of scrolling text code. + + [Ben Avison] + * Increase font cache hit rate by keying on the fractional part of m_originX and m_originY *after* they have been through the graphics context's transformation matrix, plus the scale/rotation elements of the matrix, rather than the origin in the original frame of reference plus the complete transformation matrix. All vertices of individual glyph bounding boxes are a constant offset from this position, and when the fractional part of the translation is a match, the rounding of each vertex will be in the same direction; this permits us to calculate the desired vertices from the cached ones simply by adding the integer parts of the translations with no additional rounding steps. + + [Ben Avison] + * Lay the groundwork for hardware clipping. + + [Ben Avison] + * Add a cache of font glyph bounding box vertices. + + [Ben Avison] + * CGUIFontTTFBase::RenderCharacter can now append to arbitrary vectors of vertices rather than only CGUIFontTTFBase::m_vertex + + [Ben Avison] + * Convert CGUIFontTTFBase::m_vertex to be managed as a std::vector. + + [Matthias Kortstiege] + * [videosync] remove unused variable + + [Matthias Kortstiege] + * [networkservices] remove unused variable + + [Matthias Kortstiege] + * [httpheader] fix signed/unsigned mismatch + + [Matthias Kortstiege] + * [texturemanager] reorder initialization list + + [Martijn Kaijser] + * [pvr] bump addon.pvr to 1.9.3 after dbfa0b6374b779a62c6fb0456f0c0618a6e25bfc + + [Ben Avison] + * Move the reference-counting of Begin and End calls from DX and GL source files into GUIFontTTF.cpp. + + [Tobias Markus] + * Fix for coverity #719001 + + [Tobias Markus] + * cppcheck performance fixes in linux/ + + [anaconda] + * [cosmetics] StereoscopicsManager: don't log localized strings. + + [montellese] + * binary addons: only create backwards compatibility header file if it doesn't already exist + + [montellese] + * cosmetics: fix a typo in prepare-env.cmake helper script + + + [ace20022] + * fix typo in 729c42b0d9675ea6b3af7192afc23d96a775fc74. + + [Tobias Markus] + * [coverity] Proposed fix for CID 1260398 + + [Tobias Markus] + * cppcheck performance fixes + + [Sam Stenvall] + * [pvr] fix missing variable assignment after PR #4671 + + [ace20022] + * [dvdplayer] Prioritize number of channels over codec over default flag and add a setting to change that behavior. + + + [ronie] + * [Confluence] fixed: sideblade would scroll + + [ronie] + * [Confluence] Cosmetics + + [Mike] + * darwin dlna client user agent string override not working + + [Memphiz] + * [jenkins/droid] - allow to select the ndk version through jenkins jobs and bump to ndk r10d + + [Tobias Markus] + * cppcheck performance fixes in video/ + + + [xhaggi] + * [pvr] fix wrong condition for channel view if no epg items exist + + [Ryan Gribble] + * [pvr] support EPG item type for "ListItem.Premiered" (FirstAired) GUI label + + [AlwinEsch] + * [PVR] Fix CFileItem::FillInDefaultIcon wrong compare position + + [Rainer Hochecker] + * renderer: fix sequence from WaitFrame, Render, FrameMove to WaitFrame, FrameMove, Render + + [Rainer Hochecker] + * renderer: exit gfx lock when waiting for present time + + [Rainer Hochecker] + * guilib: mark control dirty when setting to invisible + + [smallint] + * renderer: improve rendering to gui and separate video layer + + [smallint] + * Set dirty flag in teletext dialog if required + + [Rainer Hochecker] + * renderer: drop old tempfix firstflippage, did not work anyway because RendererHandlesPresent returned always true + + [xhaggi] + * [pvr] fix: refresh container after view mode is changed in guide window + + [Tobias Markus] + * cppcheck performance fixes in view/ + + [AlwinEsch] + * [PVR] Fix CGUIWindowPVRChannels::Update (come back from hidden can not work) + + + [Tobias Markus] + * [coverity] fix for #1262429 + + [Tobias Markus] + * cppcheck performance fixes in windowing/ + + [Tobias Markus] + * cppcheck performance fixes in storage/ + + [xhaggi] + * [keymaps] replaces obsolete mapping of left/right to prev/next group for tv/radio fullscreen with StepBack and StepForward + + [xhaggi] + * [confluence] removes channel group chooser control (id: 503) + + [xhaggi] + * [pvr] removes group chooser from CGUIWindowFullScreen + + [montellese] + * [confluence] remove default heading labels for DialogPeripheralSettings, SmartPlaylistEditor and VideoOSDSettings + + [montellese] + * CGUIDialogAudioSubtitleSettings: add default heading label + + [montellese] + * CGUIDialogVideoSettings: add default heading label + + [montellese] + * cmake: use OUTPUT_DIR instead of DEPENDS_PATH in add_addon_depends + + [montellese] + * cmake: append revision/hash of addon to downloaded tarball to force downloading a new version if the revision/hash has changed + + [Tobias Markus] + * cppcheck performance fixes in utils/ + + [Tobias Markus] + * Fix for Coverity #1126044 + + [Tobias Markus] + * Fix for coverity #1194431 + + [xhaggi] + * [gui] reset view state directly after directory was fetched + + [xhaggi] + * [gui] use m_vecItems directly instead of a new CFileItemList and copy it over to m_vecItems + + [xhaggi] + * [pvr] refactor CPVRManager:OnAction out to PVRActionListener + + [xhaggi] + * [win32] adds PVRActionListener to VS2010 project + + [xhaggi] + * [osx] adds PVRActionListener to xcode project + + [xhaggi] + * [pvr] refactor REMOTE_X key functionality from CGUIWindowFullScreen to PVR action listener + + [xhaggi] + * [win32] adds IActionListener.h to VS2010 project + + [xhaggi] + * [osx] adds IActionListener to xcode project + + [xhaggi] + * [core] adds action listener pattern + + [montellese] + * CGUIDialogPeripheralSettings: add default heading label + + [montellese] + * CGUIDialogSmartPlaylistEditor: add default heading label + + [montellese] + * videodb: (temporarily) trim actor names in AddActor + + [montellese] + * videodb: add update/cleanup logic for version 91 in case of duplicate actors + + + [AlwinEsch] + * [PVR] Fix DialogPVRChannelManager.xml (from name edit go right not work) + + [Tobias Markus] + * [coverity] fixes for missing breaks and falling-through statements + + [Chris "Koying" Browet] + * ADD: [gles] enable contrast & brightness controls + + [Chris "koying" Browet] + * CHG: [gles] use shader for generic yuv bob deinterlacing + + [Chris "koying" Browet] + * FIX: [gles] enable generic bob deinterlacing + + [Chris "Koying" Browet] + * ADD: [gles] BOB deinterlacing + + [Chris "Koying" Browet] + * FIX: [stf] de-invert y at source + + + [Matus Kral] + * [cec] Don't resume on source change if playback is paused. + + [Sam Stenvall] + * [pvr] update the timestamps directly in SetLastWatched() instead of having the caller call Persist() on both the channel and the group, something which leads to an incredible mount of persisting being done everytime someone switches channel + + [Sam Stenvall] + * [pvr] always persist channels to the database immediately when Persist is called. This way we can use lastinsertid() to set the new channel ID for new channels, which means we don't have to rely on GetLastChannelID() which only worked on SQLite databases (TRWTF) and was prone to random segmentation faults. + + [Sam Stenvall] + * [pvr] remove unused method + + [Sam Stenvall] + * [pvr] removed two unused dialogs + + [Sam Stenvall] + * [pvr] no need to assign a variable twice + + [Sam Stenvall] + * [pvr] remove an unneeded lock + + [Sam Stenvall] + * [pvr] remove a lot of unused methods and some unused code + + [Sam Stenvall] + * [pvr] use m_addons directly, no need to use the getter here + + [smallint] + * [imx] Fixed mode change after SysfsUtils port + + [Andriy Prystupa] + * [wayland] fixed wrong current/preferred modes in Output + + [ace20022] + * [URIUtils] Fix IsSmb, IsFTP, IsAfp, IsDAV and IsNfs. Due to protocol stacking, e.g., files in a zip on a smb share were not recognized as files on a network share. + + [Andriy Prystupa] + * Fixed refresh rate calculation for wayland. + + + [Thomas Amland] + * improve error handling of stacked items + + [anaconda] + * Fix state not saved after 5842 if playing from "Recently added". + + [Sam Stenvall] + * [pvr] don't persist channel groups (includes members) unless the group is fully loaded + + + [asavah] + * fix videodb SQL + + + [Matthias Kortstiege] + * [cosmetic] fix signed/unsigned mismatch + + [montellese] + * videodb: potentially fix SQL query in GetRandomMusicVideo + + [Tomas Melin] + * Fix duplicate statement in buttontranslator + + [Tobias Markus] + * cppcheck performance fixes in guilib/ + + [Tobias Markus] + * cppcheck performance fixes in threads/ + + [Tobias Markus] + * cppcheck performance fixes in test/ + + [Tobias Markus] + * cppcheck performance fixes in settings/ + + [Tobias Markus] + * cppcheck performance fixes in rendering/ + + [Tobias Markus] + * cppcheck performance fixes in input/ + + + [ronie] + * [Confluence] Cosmetics + + [Arne Morten Kvarving] + * quell warnings in VideoSyncDRM + + [Tobias Markus] + * Reorder initialization list Fixes compile time warning. + + [Arne Morten Kvarving] + * fixed: URIUtils.IsRemote test (now) accesses the network member in g_application + + [uNiversaI] + * readmes : remove deprecated sdl dependencies. + + [Matthias Kortstiege] + * [videolibrary]: do not set set season artwork on an empty tvshow + + [ronie] + * add path option + + [BigNoid] + * [video info] Fix changing fanart + + [Tobias Markus] + * cppcheck performance fixes in peripherals/ + + + [Rainer Hochecker] + * drop language string for crop black bars after d30e8ec54bbc374e70f1b313881d66ccdb3d2d62 + + [Rainer Hochecker] + * dvdplayer: fix compiler warning in cc code + + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing tv shows or episodes from library + + [wsnipex] + * [depends] fix building audio encoders on non unified depends platforms + + [John Rennie] + * Add support for right mouse drag + + [Rainer Hochecker] + * dvdplayer: drop autocrop + + + [Kai Sommerfeld] + * Optimize CEpgInfoTag. No more copies, just shared pointers. + + [Lars Op den Kamp] + * [PVR] bump add-ons (sync api with PR #4342) closes #4342 + + [Kai Sommerfeld] + * [PVR] Feature: Confirm XBMC shutdown if any local PVR backend is not idle. + + + [ronie] + * [Confluence] fix focused text color for addons on home + + [John Rennie] + * Remove unecessary header + + [John Rennie] + * Add actions for mouse drag start and end + + + [Bernd Kuhls] + * Allow up to 31 days to display in the EPG + + + + + [Bernd Kuhls] + * [configure] Fix display of git revision + + [Rainer Hochecker] + * dvdplayer: closed captions - add DVD style for 608 + + [Rainer Hochecker] + * dvdplayer: also parse h264 for closed captions + + [montellese] + * [win32] binary addons: remove dependencies as they are part of the audioencoder addons now + + [montellese] + * [win32] update/cleanup build scripts for binary addons + + [wsnipex] + * [depends] fix building binary addons with the new auto depends handling + + [wsnipex] + * [depends] adapt binary addon building to new system + + [wsnipex] + * [depends] build cmake with ssl support by using system curl + + [montellese] + * [depends] cmake: set CORE_SYSTEM_NAME for android, ios and rbpi + + [wsnipex] + * [depends] use central include file for binary-addons build + + [wsnipex] + * [cmake] binary addons: automatic dependency resolution + + [wsnipex] + * [cmake] add helper function for addon dependency handling + + [montellese] + * binary addons: don't build audioencoder.flac on IOS/ATV2 + + [wsnipex] + * binary addons: bump audioencoder addons + + [montellese] + * [cmake] binary addons: support negated platform definitions + + [Rainer Hochecker] + * dvdplayer: closed captions - implement 608 as fallback + + [Rainer Hochecker] + * dvdplayer: cc decoder 608 - cosmetics + + [Memphiz] + * [osx] - fixed vsync for osx - notify reference clock when refresh rate has changed - fixes #15612 + + [Memphiz] + * [keyboard] - disabletextinput after the keyboard dialog is open because in that state the editcontrol has not the focus and therefore textinput is disabled (and text is handled via key actions in this case) + + [Memphiz] + * [guilib/input] - replace GUI_MSG_INPUT_TEXT with ACTION_INPUT_TEXT + + [Memphiz] + * [guilib] - add new action and members ACTION_INPUT_TEXT + + [Memphiz] + * [sdl/osx] - stop eating cmd+v keycombination away in sdlinput - application handles the paste shortcut already - fixes non-working paste on non-osd-keyboard textfields for osx + + + [wsnipex] + * [TexturePacker] fix building on ubuntu 12.04 + + + + + + + + [Philipp Te] + * [CONFLUENCE] use VARs for list overlays + + [ronie] + * [Confluence] cosmetics + + [ronie] + * re-touched update Makefile + + [wsnipex] + * [Texturepacker] allow building with giflib4 + + [Arne Morten Kvarving] + * quell compiler warning (no return value) with giflib4 + + [Arne Morten Kvarving] + * fixed: gif support in TexturePacker using giflib4 + + [wsnipex] + * [configure] fix case where --enable-texturepacker is given, but not available + + [Matthias Gehre] + * configure.in: Make SDL depend on joystick + + [Memphiz] + * [addoninstaller] - prevent recursion on addons with circular dependecies - fixes stackoverflow crash with xunity repo + + + [Tobias Markus] + * cppcheck performance fixes in osx/ + + [BigNoid] + * CApplication: fix loading of custom windows + + [Tobias Markus] + * cppcheck performance fixes in network/ + + [Rainer Hochecker] + * upnp: do not block upnp renderer on start of playback + + [Memphiz] + * [win32] - make use of the texturepacker binary package for windows + + [wsnipex] + * [configure] adjust to texturepacker and squish in depends + + [wsnipex] + * [TexturePacker] TEMP workaround for skins: create legacy link. Remove me when skins are fixed + + [wsnipex] + * [TexturePacker] - move texturepacker to native depends + + [wsnipex] + * [depends] add target(non native) libsquish + + [wsnipex] + * [libsquish] - move libsquish to native depends + + [Memphiz] + * [TexturePacker/Win32] - link zlib statically, link statically against libgif, add dependencyfree TexturePacker.exe + + [Memphiz] + * [TexturePacker/Win32] - don't copy sdl dlls to TexturePacker (not needed anymore) + + [Memphiz] + * [TexturePacker] - remove MakeDDS as its heavily broken and would pull in half of XBMC via DDSImage.h/.cpp + + [Memphiz] + * [depends] - add giflib native (which is needed for TexturePacker now) + + [Memphiz] + * [TexturePacker] - fixed win32 projects and makefile to compile the new decoders and link the new libs + + [Memphiz] + * [TexturePacker] - removed unused files + + [Memphiz] + * [TexturePacker] - renamed XBMCTex.cpp to TexturePacker.cpp replace SDL implementation with the new decoders + + [Memphiz] + * [TexturePacker] - send all errors to stderr, all other printouts to stdout + + [Memphiz] + * [TexturePacker] - abstracted image decoder and implemented decoders for jpg (libjpg), gif (libgif) and png (libpng) + + [Memphiz] + * [texturepacker/simplefs] - add some needed helper methods (seek, getfilesize, getfp) + + [wsnipex] + * [depends] bump curl to v7.39.0 + + [wsnipex] + * [depends] bump libnfs to v1.9.6 + + [wsnipex] + * [depends] bump libssh to v0.7.0a + + [wsnipex] + * [depends] bump openssl to 1.0.1j + + [wsnipex] + * [depends] bump gcrypt to v1.6.2 + + [Memphiz] + * [win32] - added static libs to zlib package + + [Memphiz] + * [win32] - added giflib package (needed for TexturePacker and for new gif support in core later aswell) + + [Memphiz] + * [win32] - added libpng package (needed for texturepacker) + + [Tobias Markus] + * cppcheck performance fixes in profiles/ + + [Tobias Markus] + * cppcheck performance fixes in playlists/ + + + [Tobias Markus] + * cppcheck performance fixes in filesystem/ + + + [ronie] + * [Confluence] fix header label + + [Arne Morten Kvarving] + * cosmetics after CStdString removal + + [Arne Morten Kvarving] + * CXRandR: pass strings by reference, not value + + [mrhipp] + * [airtunes] - feed audio data to the pipe in one chunk instead of splitting into 64 byte buffers - reduces audio stuttering + + [Matthias Kortstiege] + * [scraper] initialize members in the order they were declared + + [montellese] + * BYE BYE CStdString + + [Jonathan Marshall] + * [stdstring] fix xbmc/commons/Exception.h + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in interfaces/json-rpc/GUIOperations.cpp + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in xbmc/cdrip/CDDARipper.h + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in network/cddb.h + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in interfaces/info/SkinVariable.h + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in StringUtils.cpp + + [montellese] + * [stdstring] get rid of CStdString in cores/ + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in UnrarXLib + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in URIUtils.cpp + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in utils/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in windows/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in guilib/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in xbmc/Util.cpp + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in xbmc/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in network/upnp/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in video/windows/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in video/dialogs/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in video/ + + [montellese] + * [stdstring] get rid of CStdString in win32/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in settings/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in windowing/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in rendering/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in profiles/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in powermanagement/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in pictures/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in peripherals + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in osx/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/windows/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/karaoke/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/infoscanner/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/dialogs/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/tags/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/ + + [ronie] + * don't force skins to use a panel container + + [Thomas Amland] + * [confluence] left align addon descriptions + + [montellese] + * media library: don't change the current directory path in SetHistoryForPath() (fixes #15668) + + [montellese] + * media library: ignore trailing slashes when comparing the start directory path with the current directory path + + [montellese] + * URIUtils: support ignoring trailing slashes in PathEquals() + + [montellese] + * videodb: avoid an empty entry in string arrays + + [Tobias Markus] + * cppcheck performance fixes in epg/ + + + [ronie] + * [Confluence] there's no reason to hide the visualization in the pvr channels windows + + [Matthias Kortstiege] + * [cosmetic] fix missing default switch statement + + [Matthias Kortstiege] + * [cosmetic] initialize members in the order they were declared + + [uNiversaI] + * [confluence] fix cosmetic scrollbar shwing for half setting height + + [Rainer Hochecker] + * dvdplayer: add counting selection streams of type and source + + [Rainer Hochecker] + * dvdplayer: close/flush subtitle player in OpenDefaultStreams + + [Rainer Hochecker] + * dvdplayer: closed captions - fix rollup types and clear window + + [Rainer Hochecker] + * dvdplayer: fix for closed captions + + [uNiversaI] + * [confluence] Chapter foward always hidden by broken condition + + [Tobias Markus] + * cppcheck performance fixes in dialogs/ + + [montellese] + * silence warning in TestDatabaseUtils (thanks @notspiff) + + [Tomi Harjunmaa] + * Fix memory leak in OGGcodec: m_inited was never set to true and inialization was done always causing a memory leak + + [anaconda] + * Fix leftover from c89ddea209bff64dab7cb386be4a5fad06263610 + + [Sam Stenvall] + * [pvr] properly select the hovered channel in the channel manager (fixes #15473) + + [xhaggi] + * [pvr] don't reset internal group channel numbers if reset channel number cache + + + [montellese] + * videodb: use PrepareSQL() instead of StringUtils::Format() for SELECT query + + [montellese] + * videodb: remove unused GetMusicVideoCount() + + [montellese] + * videodb: fix GetRandomMusicVideo() with empty WHERE clause (fixes mixed party mode) + + [Martijn Kaijser] + * [addons] sync with repo + + [Tobias Markus] + * cppcheck performance fixes in cores/paplayer + + [Ryan Gribble] + * [pvr] EPG_INFO field "strIconPath" was not being stored/retrieved in the EPG database + + [Ryan Gribble] + * [pvr] EPG_INFO field "strIconPath" was not being transferred in Update() function + + + [Wolfgang Schupp] + * Revert "Moved userdata to XDG_DATA_HOME" + + [Chris "Koying" Browet] + * CHG: Extract SysfsUtils from the AML utils + + [montellese] + * cosmetics: remove unneeded C header includes from Webserver.h + + [montellese] + * cosmetics: make CPythonInvoker and CAddonPythonInvoker constructor explicit + + [montellese] + * cosmetics: add virtual destructor to classes derived from IHTTPRequestHandler + + [montellese] + * [win32] remove non-existing xbmc/interfaces/swig/ControlListAddItemMethods.i from VS project files + + [popcornmix] + * squash: Changes suggested by Jalle19 + + [Philipp Te] + * [CONFLUENCE] fix spacer image width + + [popcornmix] + * [PVR] Fix for slow metadata updates of recordings + + [Sam Stenvall] + * [pvr] fix switching to the previous channel group (fixes #15661) + + [Rainer Hochecker] + * dvdplayer: do not wait for buffers when closing subs or teletext in OpenDefaultStreams + + [ace20022] + * [dvdplayer/settings] Add option to prefer audio/subtitle streams for visually/hearing impaired. + + [ace20022] + * [DVDDemux] Add FLAG_HEARING_IMPAIRED and FLAG_VISUAL_IMPAIRED flags. + + [a11599] + * [fixed] DXVA flickering on AMD + + [Stanisław Gackowski] + * Corrected references to special paths for clarity + + [Balint Reczey] + * Fix bashisms in shell scripts + + [Stanisław Gackowski] + * Place link when migrating directory to new location + + [Stanisław Gackowski] + * Moved temp folder to XDG_CACHE_HOME on Linux + + [Stanisław Gackowski] + * Moved userfiles to XDG base directory spec compliant location (XDG_DATA_HOME) + + + [Rainer Hochecker] + * AE: make stream more robust against frequent calls to flush + + [Memphiz] + * [gnutls] - enable gnutls support for all platforms + + [Memphiz] + * [depends/gmp/ios] - fix compilation of gmp - needed for gnutls + + [Memphiz] + * [depends/nettle/ios] - on older ios toolchains we need to disable assembly because gcc 4.2 (xcode3) doesn't know about ".int" asm operator + + [Rainer Hochecker] + * dvdplayer: CID 1261373 (#1 of 1): Resource leak (RESOURCE_LEAK) + + [Rainer Hochecker] + * wasapi: fix incorrect error log + + [Rainer Hochecker] + * dvdplayer: fix for closed captions + + [mgehre] + * configure.in: Fix final_message without PulseAudio + + [Chris "Koying" Browet] + * FIX: [aml] only use screen size if ppscaler is disabled + + [Philipp Te] + * [Confluence] - some improvements for VideoOSD + + + [fritsch] + * DVDDemuxFFmpeg: Take care of av_probe changing buffer_size fixes #15659 + + [Sam Stenvall] + * [gui] correct the logic for checking whether we have a sort method or not + + [Sam Stenvall] + * [pvr] don't attempt to count the number of recordings unless the PVR manager is started. Fixes #15591 + + [Anssi Hannula] + * AESinkALSA: Workaround alsa-lib buffer overflow in snd_pcm_chmap_print + + [Rainer Hochecker] + * vaapi: allocate an extra surface + + [Rainer Hochecker] + * ffmpeg: explicitly disable sdl + + [Rainer Hochecker] + * ffmpeg: bump to 2.5.2 + + [Rainer Hochecker] + * dvdplayer: sync large audio errors without playing with the clock + + [Rainer Hochecker] + * dvdplayer: simplify calculation of playing pts for audio + + [Sam Stenvall] + * [squash] inject parent implemenation's context buttons before the Manage button + + [Sam Stenvall] + * [gui] bump xbmc.gui to 5.6.0 + + [Sam Stenvall] + * [confluence] bump version to 2.6.0 + + [Sam Stenvall] + * [settings] make "Group manager" accessible from the Live TV settings, just like the channel manager + + [Sam Stenvall] + * [language] rename "Group management" to "Group manager" to better match "Channel manager" + + [Sam Stenvall] + * [confluence] move the "group items" radio button under "Misc Options" + + [Sam Stenvall] + * [confluence] remove height limitation from the PVR side blade + + [Sam Stenvall] + * [pvr] remove a lot of duplicated functionality from the channel list context menu. Some of the functionality is already present in the channel manager dialog, and for consistency some options (filter and show hidden channels) have been moved to the side blade (similar to how it's done for e.g. movies). + + [Rainer Hochecker] + * wasapi: probe S24 before S32, works around some driver bugs + + [Sam Stenvall] + * [pvr] remove unused variable + + [fritsch] + * Revert "fixed: CID 719030 Copy into fixed size buffer" + + [fritsch] + * Revert "fixed: CID 719030 Copy into fixed size buffer" + + [fritsch] + * Revert "fixed: CID 719032 Copy into fixed size buffer" + + [Rainer Hochecker] + * dvdplayer: fix potential segfault when silencing audio + + [Joakim Plate] + * fixed: CVE 1249615 Dereference after null check + + [Joakim Plate] + * fixed: CID 1248213 Unsigned compared against 0 + + [Joakim Plate] + * fixed: CID 1248203 Logically dead code + + [Joakim Plate] + * fixed: CID 1228827 Logically dead code + + [Joakim Plate] + * fixed: CID 1228826 Logically dead code + + [Joakim Plate] + * fixed: CID 228815 Unchecked return value + + [Joakim Plate] + * fixed: CID 719171 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719169 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719168 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719167 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719166 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719165 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719164 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719163 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719162 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719160 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719159 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719157 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719153 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719151 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719150 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719032 Copy into fixed size buffer + + [Joakim Plate] + * fixed: CID 719030 Copy into fixed size buffer + + [Joakim Plate] + * fixed: CID 719030 Copy into fixed size buffer + + [Joakim Plate] + * fixed: CID 719029 Copy into fixed size buffer + + [ace20022] + * [pvr] Fix segfault introduced in 841fb09f0d2f31e5bf9b3cb5df05c7dbfcae0300. + + [Joakim Plate] + * fixed: CID 719001 Resource leak + + [Joakim Plate] + * fixed: CID 718985 Big parameter passed by value + + [Joakim Plate] + * fixed: CID 1248237, 1248250 Unintended sign extension + + [Joakim Plate] + * fixed: CID 1248206 Unchecked dynamic_cast + + [Joakim Plate] + * fixed: CID 1248179 Unchecked return value + + [Joakim Plate] + * fixed: CID 1228812 Unchecked return value + + [Joakim Plate] + * fixed: CID 1221980 Unchecked return value + + [Joakim Plate] + * fixed: CID 1207074 Untrusted value as argument + + [Joakim Plate] + * fixed: CID 718202 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 718013 Resource leak + + + [montellese] + * unit tests: fix TestDatabaseUtils + + [montellese] + * [win32] fix "Debug Testsuite" target compilation of DVDCodecs' cc_decoder + + [ronie] + * [Confluence] labels in PVR Search could overlap + + [montellese] + * cosmetics: fix c&p'ed code comment in CVideoInfoTag::ToSortable() + + [Rainer Hochecker] + * dvdplayer: drop setting sync methods for sync playback to display. default to resample and drop/dup for passthrough + + [Rainer Hochecker] + * [pvr] bump addons after #6036 + + [Martijn Kaijser] + * [skin] update re-touched + + [Rainer Hochecker] + * dvdplayer: captions, update rullup windows at end of sequence + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [Rainer Hochecker] + * dvdplayer: add setting to enable parsing for closed captions + + [Rainer Hochecker] + * dvdplayer: add support for closed captions + + [Rainer Hochecker] + * dvdplayer: ffmpeg demuxer - do not skip streaminfo if format is not known + + [Rainer Hochecker] + * dvdplayer: fix mime type for mpegts + + [Rainer Hochecker] + * dvdpalyer: revomve dead cc code + + [Rainer Hochecker] + * dvdplayer: add closed caption decoder for cea708 + + [ace20022] + * [pvr][cleanup] Make class CPVRChannelGroupsContainer' non-copyable. + + [ace20022] + * [pvr][cleanup] Technically the member function 'foo::bar' can be const. + + [ace20022] + * [pvr][cleanup] The scope of the variable 'foo' can be reduced. + + [ace20022] + * [pvr][cleanup] Possible null pointer dereference: tag - otherwise it is redundant to check it against null. + + [ace20022] + * [pvr][cleanup] Member variable 'CPVRTimerInfoTag::m_genre' is not assigned a value in 'CPVRTimerInfoTag::operator='. + + [ace20022] + * [pvr][cleanup] Member variable 'foo::bar' is not assigned a value in 'foo::bar='.tor. + + [ace20022] + * [pvr][cleanup] Member variable 'foo::bar' is not initialized in the constructor. + + [ace20022] + * [pvr][cleanup] Variable 'iClientIndex' is reassigned a value before the old one has been used if variable is no semaphore variable. + + [ace20022] + * [pvr][cleanup] Variable 'foo' is assigned in constructor body. Consider performing initialization in initialization list. + + [ace20022] + * [pvr][cleanup] Function parameter 'path' should be passed by reference. + + [ace20022] + * [pvr][cleanup] Prefer prefix ++/-- operators for non-primitive types. + + [ace20022] + * [pvr][cleanup] Unused variable: strBackendDiskspace . + + + [Chris "Koying" Browet] + * FIX: [aml] S812 can do 4K + check earlier + + [Chris "Koying" Browet] + * FIX: hevc bitstream tweak from aml + + [John Stebbins] + * MediaCodec: add hw accel hevc playback + + [John Stebbins] + * StageFright: add hw accel hevc playback + + [John Stebbins] + * BitstreamConverter: add hevc annex-b conversion + + [montellese] + * store the sort order per sort method instead of globally + + [montellese] + * rename SORT_METHOD_DETAILS to GUIViewSortDetails + + [montellese] + * cosmetics in GUI view related code + + [Chris "Koying" Browet] + * CHG: [droid] do not h/w decode SD video (save on support) + + [fape] + * fix GUISpinControl process + + [Tobias Markus] + * Remove string initialization + + [Joakim Plate] + * fixup! GL: switch to CPU based matrix caculations to match GLES + + [Joakim Plate] + * fixup! GL(ES): Simplify matrix stack handling + + [Joakim Plate] + * GL(ES): Simplify matrix stack handling + + [Joakim Plate] + * GL: switch to CPU based matrix caculations to match GLES + + [Joakim Plate] + * gl: avoid grabbing viewport on each render + + [Chris "Koying" Browet] + * ADD: [aml] add h265/hevc support + + [Stanislav Vlasic] + * Add aml_support_hevc function and recognize S812 chip + + + [Tobias Markus] + * Fixing vdp_st checking + + [Tobias Markus] + * cppcheck fixes in cores/dvdplayer/ + + [Tobias Markus] + * cppcheck performance fixes in cores/AudioEngine + + [Chris "Koying" Browet] + * FIX: [amc] check for exceptions on everything + + [Chris "Koying" Browet] + * FX: [jni] useExceptionCheck rather than ExceptionOccured + + [montellese] + * binary addons: bump audioencoder.vorbis to match libvorbis built on win32 + + [montellese] + * [win32] binary addons: replace prebuilt libflac dependency with a cmake based one + + [montellese] + * [win32] binary addons: add and build nasmw executable needed for building flac + + [montellese] + * [win32] binary addons: replace prebuilt libvorbis dependency with a cmake based one + + [montellese] + * [win32] binary addons: replace prebuilt libogg dependency with a cmake based one + + [montellese] + * [win32] binary addons: replace prebuilt libmp3lame dependency with a cmake based one + + [Tobias Markus] + * cppcheck performance fixes in cores/dllloader/ + + [montellese] + * sorting: fix Container.SetSortMethod (fixes #15627) + + + [Tobias Markus] + * cppcheck performance fixes in cores/playercorefactory + + + [fritsch] + * VAAPI: Enable VC1 by default - not much interlaced content there + + [fritsch] + * [art] fix up dfaacca54d4a8f78ee02a041d4d1648aa0b403a2 + + [montellese] + * upnp: add support for xbmc:uniqueidentifier with IMDB/TVDB identifier + + [montellese] + * platinum: add patch for bd19c357eb + + [montellese] + * platinum: add xbmc:uniqueidentifier for IMDB/TVDB identifiers + + [Tobias Markus] + * cppcheck performance fixes in android/ + + [wsnipex] + * [depends] fix gmp Makefile + + [wsnipex] + * [depends] fix nettle dylib target + + [wsnipex] + * [depends] bump gnutls to last stable version 3.3.10 + + [wsnipex] + * [android] re-enable gnutls in ffmpeg + + + [fritsch] + * AESinkPULSE: Use const ref when finding the channel map + + [montellese] + * [videodb] bump version + + [montellese] + * videodb: cleanup/fix DELETE triggers + + [Jonathan Marshall] + * [videodb] use type_view for views + + [Jonathan Marshall] + * [videodb] FIX: drop incorrect querying of non-existent setlinkmovie table + + [Jonathan Marshall] + * [videodb] adds AppendFilter() to simplify repetitive queries in GetFilter + + [Jonathan Marshall] + * [videodb] simplify AddToLinkTable, RemoveFromLinkTable implementations + + [Jonathan Marshall] + * [videodb] switch the tag and link tables to the new layout + + [Jonathan Marshall] + * [videodb] switch the studio,genre,country and link tables to the new format + + [Jonathan Marshall] + * [videodb] refactor UpdateLinkTable into AddLinksToItem, UpdateLinksToItem, and use these when adding genre,country,studio + + [Jonathan Marshall] + * [videodb] cleanup AddCast, AddLinkToActor to drop unused params + + [Jonathan Marshall] + * [videodb] switch actor table and links to the new layout + + [Jonathan Marshall] + * [videodb] refactors UpdateActorLinkTable into UpdateActorLinksToItem, AddActorLinksToItem, with special case for musicvideos + + [Jonathan Marshall] + * [videodb] add routines for creating link indices + + [Jonathan Marshall] + * [smartplaylist] adds routine for generating queries against videodb link tables + + [Jonathan Marshall] + * [dbwrappers] have query() take a std::string, we copy direct into a std::string anyway in the functions + + [xhaggi] + * [gui] bump api version to 5.5.0 + + [xhaggi] + * [confluence] adds radio button to hide/unhide a group in DialogPVRGroupManager + + [xhaggi] + * [pvr] adds support for hiding groups + + [fritsch] + * VAAPI: Log the function of the CheckSuccess that failed + + [Tobias Arrskog] + * Made versiontag optional + + [fritsch] + * VAAPI: Report failure when VPP is not usable + + [fritsch] + * VAAPI: Don't return false when vlVaQueryDisplayAttributes returns empty + + [Martijn Kaijser] + * [skin] include last re-touched fixes + + [ace20022] + * [Fix] Deinitialize the audio manager to avoid memory leaks. + + [fritsch] + * CFile: Don't cast potential negative values to unsigned int + + [ronie] + * [Confluence] remove unused code + + [montellese] + * addons: "defaultresolution" attribute is optional in skin.xsd + + [montellese] + * addons: rename "defaultresolutionwide" attribute to "defaultwideresolution" in skin.xsd + + [montellese] + * addons: remove unused "defaultthemename" attribute from skin.xsd + + [montellese] + * addons: add "res" element to skin.xsd + + [montellese] + * addons: add service.xsd + + [montellese] + * addons: add "cachepersistence" attribute to scraper.xsd + + [montellese] + * addons: fix repository.xsd + + [montellese] + * addons: remove "wingl" as a possible platform value from metadata.xsd + + [montellese] + * addons: remove unused "content" element from pluginsource.xsd + + [montellese] + * addons: fix pluginsource.xsd + + [Thomas Amland] + * remove old samba mount code + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [montellese] + * [win32] update VS project files + + [montellese] + * filesystem: reduce code duplication in CBlurayFile, CMultiPathFile, CSpecialProtocolFile and CSpecialProtocolDirectory by deriving from COverrideFile/COverrideDirectory + + [montellese] + * filesystem: add COverrideFile and COverrideDirectory + + [Bl4ck09] + * Do not scroll list label if false + + + [Tobias Arrskog] + * Made versiontag optional + + [Martijn Kaijser] + * [skin] include last re-touched fixes + + [fritsch] + * CFile: Don't cast potential negative values to unsigned int + + [Martijn Kaijser] + * [release] bump to Helix 14.0 final + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [ace20022] + * [Fix] Fix a memory leak in PlayerSelectionRule.cpp. + + [ace20022] + * [Fix] Fix a memory leak in Setting.cpp. + + [t4-ravenbird] + * woa - use profile path + + [Rainer Hochecker] + * DXVA: add HD5xxx to ati work-around, only capable of opening a single time + + [Rainer Hochecker] + * dvdplayer: make sure overlay container is cleared when player stops + + [h.udo] + * [rebrand][confluence sounds.xml] xbmc -> kodi + + [h.udo] + * [rebrand][Json-RPC schema] xbmc -> kodi + + [h.udo] + * [rebrand][Linux FEH_py.in] xbmc -> kodi + + [h.udo] + * [rebrand][Win32BuildSetup readme.txt] xbmc -> kodi + + [h.udo] + * [rebrand][ps3_remote.py] xbmc -> kodi + + [h.udo] + * [rebrand][OSX Credits.html] xbmc -> kodi + + [h.udo] + * [rebrand][German keyboardmap.xml] xbmc -> kodi + + [Rainer Hochecker] + * DXVA: add HD4xxx to ati work-around, only capable of opening a single decoder at a given time + + [fritsch] + * IMX: Announce EGL_QUIRK_RECREATE_DISPLAY_ON_CREATE_WINDOW to fix refreshrate change + + [fritsch] + * EGL: Add Quirk for display recreation + + [wolfgar] + * Revert to software decoding for AVC profile 578 as it is not handled by imx6 VPU + + [host505] + * [keyboardlayout] Add Greek QWERTY + + [uNiversaI] + * [confluence] [confluence] minor cosmetic to codec info background + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + + [ronie] + * [Confluence] cosmetics + + [Tobias Markus] + * Check return value + + [Tobias Markus] + * cppcheck performance fixes in addons/ + + [ace20022] + * [Fix] Fix a memory leak in PlayerSelectionRule.cpp. + + [Martijn Kaijser] + * [keyboard] only use English names for layouts + + [ace20022] + * [Fix] Fix a memory leak in Setting.cpp. + + [Matthias Kortstiege] + * [art] fix missing container art for album paths + + [davilla] + * FIX: [aml;pivos] Fix 1080 on MX + + [ronie] + * [Confluence] remove addon ratings + + [Rainer Hochecker] + * DXVA: add HD5xxx to ati work-around, only capable of opening a single time + + [Rainer Hochecker] + * dvdplayer: make sure overlay container is cleared when player stops + + [t4-ravenbird] + * woa - use profile path + + [Matthias Kortstiege] + * [gui] bump gui version to 5.4.0 + + [Matthias Kortstiege] + * [infomanager] nuke old container art infolabels + + [Martijn Kaijser] + * [skin] fix weather layout re-touched + + [Matthias Kortstiege] + * [art] add container art to music paths + + [Matthias Kortstiege] + * [art] tvshow season art not set correctly when item list was flattened + + [Matthias Kortstiege] + * [infomanager] adds container.art + + [Martijn Kaijser] + * [addons] sync with repo + + [Martijn Kaijser] + * [skin] update re-touched + + [Rainer Hochecker] + * DXVA: add HD4xxx to ati work-around, only capable of opening a single decoder at a given time + + [Dr-Romantic] + * [keyboardlayout] add Arabic layout. + + [Thomas Amland] + * [addons] display a more helpful message on python errors + + [anaconda] + * Fix resume on multi-episode files if no resume point is set. + + [fritsch] + * BaseRender: Allow 1px wrong in aspect ratio to not do completeley refit the image + + [h.udo] + * [rebrand][confluence sounds.xml] xbmc -> kodi + [h.udo] + * [rebrand][Json-RPC schema] xbmc -> kodi - [Martijn Kaijser] - * bump to 16.1 release + [h.udo] + * [rebrand][Linux FEH_py.in] xbmc -> kodi - [DaveTBlake] - * Fix song reported on playback of songs from cuesheet + [h.udo] + * [rebrand][Win32BuildSetup readme.txt] xbmc -> kodi - [HerbFargus] - * Add xboxdrv name for xbox keymap + [h.udo] + * [rebrand][ps3_remote.py] xbmc -> kodi - [anaconda] - * videoinfotag: fix typo introduced in e6e2d0ace5cfe6191b8f7727ced1747854254ce4 + [h.udo] + * [rebrand][OSX Credits.html] xbmc -> kodi + + [h.udo] + * [rebrand][German keyboardmap.xml] xbmc -> kodi + + [montellese] + * media library: fix path history for items with a real path differing from the requested path + + [Memphiz] + * [tests/osx] - add unit tests for aliasshortcut resolving + + [Memphiz] + * [osx] - add method for creating an alias shortcut (used for unit testing) + + [Memphiz] + * [osx] - replace alias / shortcut handling with non deprecated functions (fixes non working alias resolving since osx 10.10 yosemite) + + [Memphiz] + * [osx] - move alias/shortcut translation code to darwinhelpers + + [Karlson2k] + * [android] [vfs] PosixFile: fix large file support on Android [Chris "Koying" Browet] - * FIX: [droid] cap refresh rates when probing, too + * FIX: [droid] make python PIL module working + + [Chris "Koying" Browet] + * FIX: [droid;python] proper handling of module libraries + + [Chris "Koying" Browet] + * FIX: [droid;packaging] handle addons libraries + + [Matthias Kortstiege] + * [mediawindow] remove unused function OnFinalizeFileItems + + [Matthias Kortstiege] + * [infomanager] added Container(id).CurrentItem + + [montellese] + * win32: add nopvraddons and nobinaryaddons options to BuildSetup.bat + + [montellese] + * win32: fix indentations in BuildSetup.bat + + [Martin van Beurden] + * [win32] remove redundant /MP compiler option in release builds. + + [Martin van Beurden] + * [win32] git_revision custombuild trigger from existing file, set correct outputpath, remove non existing dependency. + + [Martin van Beurden] + * [win32] remove non-existing header files from project files + + [montellese] + * webserver: refactor IsAuthenticated() + + [montellese] + * webserver: silence warning + + [montellese] + * webserver: use defines for HTTP header fields and values + + [montellese] + * webserver: handle Cache-Control: no-cache and Pragma: no-cache + + [montellese] + * webserver: add Cache-Control HTTP header to cacheable responses + + [montellese] + * webserver: add support for If-Unmodified-Since HTTP header + + [montellese] + * webserver: cosmetic refactoring + + + [fritsch] + * IMX: Announce EGL_QUIRK_RECREATE_DISPLAY_ON_CREATE_WINDOW to fix refreshrate change + + [fritsch] + * EGL: Add Quirk for display recreation + + [host505] + * [keyboardlayout] Add Greek QWERTY + + [wolfgar] + * [imx6] Revert to software decoding for AVC profile 578 as it is not handled by imx6 VPU + + [Thomas Amland] + * [videoinfoscanner] fix multipath scanning - [txtranslation] - * [lang] updated language files from Transifex [Martijn Kaijser] - * bump to 16.1 rc3 + * fix wrong values in version.txt after 15.0a1 bump - [Anton Fedchin] - * [RenderSystemDX] Fix possible segfault after ba2ff03 + [Lars Op den Kamp] + * Revert "Disable extra logging by default" [Rainer Hochecker] - * VDPAU: fix flushing mixer + * dvdplayer: allow skipping streaminfo only for mpegts streams + + [Rainer Hochecker] + * Revert "rename xbmc folder to src" + + [Rainer Hochecker] + * Revert "change xbmc/ path to src/ in all files" - [Martijn Kaijser] - * update re-Touched skin + + [Fneufneu] + * change xbmc/ path to src/ in all files + + [Fneufneu] + * rename xbmc folder to src [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + * Set version to development version 15.0 alpha1 and change splash screen + + [uNiversaI] + * [confluence] minor cosmetic to codec info background [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + * [addons] sync with repo - [Thomas Amland] - * never cache addons directories + [Rainer Hochecker] + * dvdplayer: ffmpeg decoder - initialize codec control flags, fixes thumbnail extraction which does not set those members [Chris "Koying" Browet] - * FIX: [droid] disable libcec - - [Achim Turan] - * [cmake][addons] Use an absolute path for ADDON_SRC_PREFIX + * FIX: [aml] properly handle rotation - [txtranslation] - * [lang] updated language files from Transifex + [Rainer Hochecker] + * dvdplayer: double number of frames to try for thumbnails - [S. Davilla] - * [darwin/WebServer] - fixed crash under json. double thread stack size for libmicrohttpd for osx/ios [fritsch] - * AndroidStorageProvide: Ignore /mnt/runtime + * VAAPI: Take more care when probing filters - [Thomas Amland] - * AndroidStorageProvider: avoid calling Exists from PumpDriveChangeEvents + [phate89] + * [metadata.tvdb.com] updated to version 1.7.0 - [Anton Fedchin] - * [WinSystemWin32DX] Avoid unneeded resize buffers when minimized in FSE mode. - [Anton Fedchin] - * [RenderSystemDX] Force 23.976fps mode before switch to stereoscopic 3D mode. + [Sam Stenvall] + * [pvr] bump addons (fixes #15598) - [Anton Fedchin] - * [RenderSystemDX] fixup: re-create swap chain in mono if switching to stereoscopic 3D mode fails. + [Memphiz] + * [AE/CA/osx] - cosmetics - make comment generic - [Anton Fedchin] - * [RenderSystemDX] Avoid resize buffers twice when transition from windows to FSE mode. + [Memphiz] + * [AE/CA/osx] - fillup the stream with up to 16 unknown channels fixes support for studio audio devices with more then 8 unused/unknown channels in one stream - [Anton Fedchin] - * [RenderSystemDX] use two buffers in FSEX. + [Memphiz] + * [AE] - extend the number of unknown channels from 8 to 16 - [Anton Fedchin] - * [RenderSystemDX] Added workaround to create device on a default adapter if it wasn't detected previously. + [Tarulia] + * [keymap] Make XB360 DPads consistent - [Anton Fedchin] - * [WinRenderer] Re-work color shader. try to fix wrong colors on some hardware. + [MilhouseVH] + * [rebrand] Cosmetic #2 - apply Kodi label to CPU stat - [Anton Fedchin] - * [WinRenderer] speed up a bit configuring renderer. - [Bernd Kuhls] - * [Jarvis] partly backport of PR 9231 to fix segfault - [Kai Sommerfeld] - * [EPG] Guide Window: 20% performance gain on open + [txtranslation] + * [lang] update of skin.confluence language files [txtranslation] - * [lang] updated language files from Transifex + * [lang] update of core language files - [ace20022] - * [android] Add missing libgif.so to the package. + [txtranslation] + * [lang] update of internal addon language files - [Alwin Esch] - * [adsp] fix kodi frezze if no add-on present + [MilhouseVH] + * [rebrand] Cosmetic + + [oldnemesis] + * Fixed memory allocation; not enough memory was allocated + + + [h.udo] + * [system colors.xml] correct wrong colors and spelling + + [Matthias Kortstiege] + * [infomanager] fix missing seekoffset label when seeking chapters + + [wsnipex] + * [linux] fix building libxbmc.so + + [xhaggi] + * [pvr] adds parental lock check to PlayMedia() + + [xhaggi] + * [pvr] fix built-in PlayMedia with PVR channels and recordings (Trac #15164) [Martijn Kaijser] - * bump to 16.1rc2 + * [language] fix incorrect strings - [Kai Sommerfeld] - * [EPG] Fix lockup when entering epg grid (endless loop) - [Anton Fedchin] - * [dx11] Fixed possible crash when living hardware stereo mode. + [Martijn Kaijser] + * [language] fix incorrect strings - [Anton Fedchin] - * [dxva] fixed possible issue with dxva rendering (wrong hue/gamma) + [h.udo] + * [system colors.xml] Remove whitespace - [Anton Fedchin] - * [win32] memcpy_sse2: fixed crash in corner case. + [Karlson2k] + * [win32] WIN32Util::PowerManagement: fix restart on Win8.1 - [Chris "Koying" Browet] - * FIX: [longpress] do not eat keypress after a longpress + [txtranslation] + * [lang] added missing langinfo.xml files for new languages - [Tolriq] - * EventServer security fix. + [Martijn Kaijser] + * [addons] sync with repo - [arnova] - * changed: Ignore chapters for large step if there's only one + [Thomas Amland] + * fix wrong video content type on empty tvshow title - [arnova] - * fixed: Screensaver would lockup Kodi when stopping on slow systems + [h.udo] + * [CONTRIBUTING.md] Update to Kodi links - [Anton Fedchin] - * [VideoPlayer] WinRenderer: fix render capure when dxva render method is used. + [h.udo] + * [README.md] Update to Kodi links - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi dtor avahi thread termination. + [dhead666] + * [pvr] bump addons - [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + [Thomas Amland] + * [rebrand] new linux icons - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [Rainer Hochecker] + * dvdplayer: defer release of ffmpeg hw decoder after next decode, deleting a hw decoder in GetFormat can result in a crash for dxva - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [h.udo] + * [rebrand][osx] new icons [h.udo] - * [LoadVideoSettings] Don't leak credentials + * [rebrand][upnp] new icons - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [hudokkow] + * [rebrand][web interface] new favicon.ico - [txtranslation] - * [lang] updated language files from Transifex + [h.udo] + * [rebrand][atv2] new AppIcon.png + + [h.udo] + * [rebrand][ios] new icons + + [h.udo] + * [rebrand][android] new icons + + [h.udo] + * [rebrand][win] new application.ico + + [Chris "Koying" Browet] + * FIX: [droid] fix launching leanback only apps + + [Chainfire] + * fix playback getting progressively slower and memory filling up until crash + + [ronie] + * replace webserver logo + + [fritsch] + * VAAPI: Let untested drivers use vaapi via advanced setting [Rainer Hochecker] - * dxva2: fix segfault + * dvdplayer: fix audio/l16 for ffmpeg demuxer, format cannot be probed [Rainer Hochecker] - * vaapi: fix segfault + * fix getting charset from http header, incorrect usage of constructor for string - [Martijn Kaijser] - * Bump to 16.1rc1 + [Rainer Hochecker] + * CCurlFile: allow getting full content type + [Chris "Koying" Browet] + * FIX: [amc] bail out on null hint size - [DaveTBlake] - * Fix song reported on playback of songs from cuesheet + [Alex Deryskyba] + * [aml] Do not disable keyboard auto-repeat for Meson6 and higher - [anaconda] - * videoinfotag: fix typo introduced in e6e2d0ace5cfe6191b8f7727ced1747854254ce4 + [Rainer Hochecker] + * paplayer: drop broken PCM codec, use ffmpeg instead + + [Memphiz] + * [input/linux] - map KEY_BACK to xbmckey backspace - same like we do for android (key back as found on the wetek remote sends KEY_BACK keycode which is not mapped on linux and so isn't usable in openelec on that box) [Chris "Koying" Browet] - * FIX: [droid] cap refresh rates when probing, too + * FIX: [amc] if omx returns w/h, use it - [txtranslation] - * [lang] updated language files from Transifex + [Chris "Koying" Browet] + * FIX: [amc] trap exception when mime is unsupported + + [Chris "Koying" Browet] + * FIX: [amc] log exceptions + + [Chris "Koying" Browet] + * FIX: [mediacodec] more exception checking + + [Chris "Koying" Browet] + * FIX: [mediacodec] handle aspect ratio + + [Chris "Koying" Browet] + * FIX: [mediacodec] prevent crash if 'createByCodecName' throws an exception (omx.rk) + + [Karlson2k] + * Update PIL package to prevent crash with some addons + + [Chris "Koying" Browet] + * FIX: [droid;aml] fix preview scaling [Martijn Kaijser] - * bump to 16.1 rc3 + * [release] bump to 14.0 rc3 + + + [Martijn Kaijser] + * [skin] update re-touched skin - [Anton Fedchin] - * [RenderSystemDX] Fix possible segfault after ba2ff03 + + [Matthias Kortstiege] + * [art] use correct art type when appending art to item lists + + [Tarulia] + * [keymap] Add support for XBOX One Controller for PC + + [xhaggi] + * [cosmetics] fix indentation + + [xhaggi] + * [pvr] fix: separate sort orders for each directory in recordings window [Rainer Hochecker] - * VDPAU: fix flushing mixer + * dvdplayer: demuxer ffmpeg - do not create streams until having seen pat/pmt for pvr [Martijn Kaijser] - * update re-Touched skin + * [skin] update re-touched skin - [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + [fastcolors] + * [osx] new application icons + + [Memphiz] + * Revert "[airplay] - merge the binary plist and xml plist pathes in airplay (which already diverged) by using libplist for parsing in both cases - not only the binary case" + + [xhaggi] + * [epg] fix selecting channel if given index is smaller than channel offset + + [xhaggi] + * [pvr] use getter/setter instead of directly access m_selectedItemPaths + + [uNiversaI] + * [audioencoders] bump to their latest master + + + [perexis] + * Fixed Polish translation of "%s of %s available" [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + * [release] bump to 14.0 rc2 + + [Sam Stenvall] + * [keymap] fix guide button for kernel-based mceusb remotes (closes #15374) + + [Rainer Hochecker] + * ffmpeg: bump to 2.4.4 + + + [txtranslation] + * [lang] rename Tamil to Tamil (India) as this is the actual translated language at Transifex + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [popcornmix] + * [omxplayer] Fix precedence in deinterlace resolution check + + [Sam Stenvall] + * [pvr] don't update the item list path before calling Update(), otherwise the history will be incorrectly recorded since the the history expects m_vecItems->GetPath() to be the "old" path, not the new one + + [montellese] + * fix content settings not being properly evaluated/stored + + + [popcornmix] + * FIX: actually disable omxplayer if software is selected + + [xhaggi] + * [pvr] do not restart the PVR manager on wake, only trigger updates + + [xhaggi] + * [gui] temp fix to reset m_guiState with the right file item list + + [xhaggi] + * [pvr] fix: select the first item if we don't have a stored last selected item path + + [Sam Stenvall] + * [pvr] bump addons - [Thomas Amland] - * never cache addons directories [Chris "Koying" Browet] - * FIX: [droid] disable libcec + * FIX: actually disable hardware decoders if sotware is selected + + + [montellese] + * platinum: add patch for 2104093 + + [montellese] + * platinum: fix filter mask values of xbmc:votes and xbmc:artwork + + [montellese] + * jsonrpc: fix Files.GetDirectory not returning artistid, albumid and genreid for smartplaylists + + [uNiversaI] + * [keyboardlayout] add Hungarian QWERTZ + + [xhaggi] + * [pvr] removes Timer and Guide item from root directory listing + + [xhaggi] + * [pvr] fix: remove slash at the end of the base path + + [xhaggi] + * [pvr] fix creation of item paths for root (pvr://) directory + + [xhaggi] + * [pvr] fix creation of an illegal group path in GetGroupList() + + [arnova] + * changed: Don't perform wait-on-data if position is in our old cache + + [arnova] + * changed: Modify rate calculation to obtain a proper average with heavy seeking/cache swapping + + [Martijn Kaijser] + * [release] bump to 14.0 rc1 + + + [montellese] + * fix content dialog settings not being properly reset + + [wolfgar] + * [imx6] Fix VP8 timestamping + + [montellese] + * [rebrand] android: log to logcat with "Kodi" prefix instead of "XBMC" + + [montellese] + * [rebrand] replace XBMC with Kodi in the UPnP server's HTTP agent string + + [Rainer Hochecker] + * dvdplayer: fix ff for higher speeds - [Achim Turan] - * [cmake][addons] Use an absolute path for ADDON_SRC_PREFIX + [montellese] + * jsonrpc: fix Player.GetItem for PVR channels not providing extended details like plot, genre etc. - [txtranslation] - * [lang] updated language files from Transifex + [anaconda] + * Fix off-by-1 errors in saving video settings when in a playlists. - [S. Davilla] - * [darwin/WebServer] - fixed crash under json. double thread stack size for libmicrohttpd for osx/ios - [fritsch] - * AndroidStorageProvide: Ignore /mnt/runtime + [Martijn Kaijser] + * [win32] Update installer text to be more clear about taken actions. Also set artwork for un-installer pages - [Thomas Amland] - * AndroidStorageProvider: avoid calling Exists from PumpDriveChangeEvents + [uNiversaI] + * [rebrand] web interface rename XBMC -. Kodi - [Anton Fedchin] - * [WinSystemWin32DX] Avoid unneeded resize buffers when minimized in FSE mode. + [Martijn Kaijser] + * shorten the wiki migration url - [Anton Fedchin] - * [RenderSystemDX] Force 23.976fps mode before switch to stereoscopic 3D mode. + [Chris "Koying" Browet] + * fixup aml no video: video lost after resume - [Anton Fedchin] - * [RenderSystemDX] fixup: re-create swap chain in mono if switching to stereoscopic 3D mode fails. + [Memphiz] + * [depends] - add boblight to depends but don't install it (used for compiling the needed libboblight binary for the boblight addon) - seems this was lost since frodo ... - [Anton Fedchin] - * [RenderSystemDX] Avoid resize buffers twice when transition from windows to FSE mode. + [Martijn Kaijser] + * [win32] Make sure we copy the userdata from the build into the $INSTDIR/userdata". Since we only use the userdata from $APPDATE/${APP_NAME}/userdata/ or portable_data it's safe to wipe $INSTDIR/userdata. - [Anton Fedchin] - * [RenderSystemDX] use two buffers in FSEX. + [Martijn Kaijser] + * [win32] remove modelines_template.xml and kodi.log from installer package - [Anton Fedchin] - * [RenderSystemDX] Added workaround to create device on a default adapter if it wasn't detected previously. + [Rainer Hochecker] + * Revert "gl: multipass renderer would use wrong source pixels sizes" - [Anton Fedchin] - * [WinRenderer] Re-work color shader. try to fix wrong colors on some hardware. + [wsnipex] + * fix: [linux] include ffmpeg tarball in mk-debian-package.sh - [Anton Fedchin] - * [WinRenderer] speed up a bit configuring renderer. + [Matthias Kortstiege] + * [infomanager] container.pluginname returns an empty string (fixes #15566) - [Bernd Kuhls] - * [Jarvis] partly backport of PR 9231 to fix segfault + [ace20022] + * [pvr][cleanup] Return 'bRetrun' instead of 'true'. cppcheck message: Variable 'bReturn' is assigned a value that is never used. - [Kai Sommerfeld] - * [EPG] Guide Window: 20% performance gain on open + [fritsch] + * Revert "linux: Check for Logind first, then *Kit-s with UPower when detecting PM framework" - [txtranslation] - * [lang] updated language files from Transifex + [xhaggi] + * [pvr] always use last played group as current group on startup - [ace20022] - * [android] Add missing libgif.so to the package. + [xhaggi] + * [pvr] re-init pvr manager on wake up - [Alwin Esch] - * [adsp] fix kodi frezze if no add-on present + [fritsch] + * VAAPI: Print driver vendor string (including version) when opening context - [Martijn Kaijser] - * bump to 16.1rc2 + [Karlson2k] + * [win32] [vfs] Win32SMBFile::Stat(): fix wrong error code check - [Kai Sommerfeld] - * [EPG] Fix lockup when entering epg grid (endless loop) + [Rainer Hochecker] + * Revert "smb: eliminate unused while loop in OpenDir" - [Anton Fedchin] - * [dx11] Fixed possible crash when living hardware stereo mode. + [Karlson2k] + * [emufnc] Disable support for READ_TRUNCATED. To be reverted after Helix release. - [Anton Fedchin] - * [dxva] fixed possible issue with dxva rendering (wrong hue/gamma) + [Memphiz] + * [libdvdread] - add patch for fixing partial reads in file_read - also upstreamed for inclusion - patch by karlson2k - [Anton Fedchin] - * [win32] memcpy_sse2: fixed crash in corner case. + [Memphiz] + * [libdvdread] - fix partial reads in file_read - fixes iso playback on ios (which doesn't use libdvdcss and therefore hits this bug) [Chris "Koying" Browet] - * FIX: [longpress] do not eat keypress after a longpress + * FIX: [droid] aarch64 is always neon-enabled - [Tolriq] - * EventServer security fix. + [Chris "Koying" Browet] + * FIX: [sqlite] fix sqlite when built in 32bits and executed on 64bits - [arnova] - * changed: Ignore chapters for large step if there's only one + [Rainer Hochecker] + * dvdplayer: demux ffmpeg - fix seeking behind eof - [arnova] - * fixed: Screensaver would lockup Kodi when stopping on slow systems - [Anton Fedchin] - * [VideoPlayer] WinRenderer: fix render capure when dxva render method is used. - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi dtor avahi thread termination. + [Thomas Amland] + * Revert "jobs: fixed segmentation fault when thumbnail loader abort" [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + * [libdvdread] - fix out of bound access when playing some iso files - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [Martijn Kaijser] + * [release] bump to 14.0 beta5 - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [Chris "Koying" Browet] + * FIX: [aml] no video on newer aml sdk - [h.udo] - * [LoadVideoSettings] Don't leak credentials - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Memphiz] + * [osx/packaging] - premade .DS_Store which works for /Volumes/Kodi - [txtranslation] - * [lang] updated language files from Transifex + [Memphiz] + * [osx/packaging] - ensure that our dmg is always mounted with a static name (/Volumes/Kodi in our case) - else the prepared .DS_Store won't work and we don't get the background image and icon position - [Rainer Hochecker] - * dxva2: fix segfault + [Memphiz] + * [gitignore] - add VolumeIcon.icns to gitignore - [Rainer Hochecker] - * vaapi: fix segfault + [Martijn Kaijser] + * [addons] sync with repo [Martijn Kaijser] - * Bump to 16.1rc1 + * [skin] update re-touched with new Kodi logo + [Kai Sommerfeld] + * [cec] Fixed PeripheralCecAdapter application exit code handling. Introduced new field "exitcode" for "OnQuit" message (@pdf). - [DaveTBlake] - * Fix song reported on playback of songs from cuesheet + [montellese] + * infomanager: fix calls to GetInt() without a valid file item (same as in GetBool()) - [anaconda] - * videoinfotag: fix typo introduced in e6e2d0ace5cfe6191b8f7727ced1747854254ce4 - [Chris "Koying" Browet] - * FIX: [droid] cap refresh rates when probing, too + [da-anda] + * [android][ouya] added launcher icon - [txtranslation] - * [lang] updated language files from Transifex + [da-anda] + * [rebrand][visualization.vortex] remove XBMCrain preset and logo - [Martijn Kaijser] - * bump to 16.1 rc3 + [da-anda] + * [rebrand][addons] new addon icons - [Anton Fedchin] - * [RenderSystemDX] Fix possible segfault after ba2ff03 + [da-anda] + * [rebrand][confluence] new logo + [da-anda] + * [rebrand] new splash - [Rainer Hochecker] - * VDPAU: fix flushing mixer + [Memphiz] + * [osx] - new DSStore template for the dmg folder (uses the new background and has properly aligned icons) - [Martijn Kaijser] - * update re-Touched skin + [Memphiz] + * [osx/packaging] - generate the volumeicon.icns in the packaging script and fixup some pathes - remove some unneeded checks and do a sanity clean of the rw dmg during packaging - [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + [da-anda] + * [rebrand][osx] new DMG volume icon and background artwork - [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + [da-anda] + * [rebrand][osx] new app icon - [Thomas Amland] - * never cache addons directories + [da-anda] + * [rebrand][atv] new icons - [Chris "Koying" Browet] - * FIX: [droid] disable libcec + [da-anda] + * [rebrand][ios] new icons with iOS8 support - [Achim Turan] - * [cmake][addons] Use an absolute path for ADDON_SRC_PREFIX + [da-anda] + * [android] add Android-TV banner - [txtranslation] - * [lang] updated language files from Transifex + [da-anda] + * [rebrand][android] new icons - [S. Davilla] - * [darwin/WebServer] - fixed crash under json. double thread stack size for libmicrohttpd for osx/ios + [da-anda] + * [rebrand][linux - [fritsch] - * AndroidStorageProvide: Ignore /mnt/runtime + [da-anda] + * [rebrand][win32] new installer artwork - [Thomas Amland] - * AndroidStorageProvider: avoid calling Exists from PumpDriveChangeEvents + [da-anda] + * [rebrand][win] new app icon - [Anton Fedchin] - * [WinSystemWin32DX] Avoid unneeded resize buffers when minimized in FSE mode. + [fritsch] + * IMX6: Add VerifyGLState() to render to help debugging - [Anton Fedchin] - * [RenderSystemDX] Force 23.976fps mode before switch to stereoscopic 3D mode. + [Memphiz] + * [osx] - re-enable yadif deinterlacer on osx - [Anton Fedchin] - * [RenderSystemDX] fixup: re-create swap chain in mono if switching to stereoscopic 3D mode fails. + [fritsch] + * IMX6: Use correct Method for deletion - [Anton Fedchin] - * [RenderSystemDX] Avoid resize buffers twice when transition from windows to FSE mode. + [Chris "Koying" Browet] + * FIX: [droid] adjust splash layout - [Anton Fedchin] - * [RenderSystemDX] use two buffers in FSEX. + [Chris "Koying" Browet] + * CHG: [rebrand;droid] adjust progressbar colors - [Anton Fedchin] - * [RenderSystemDX] Added workaround to create device on a default adapter if it wasn't detected previously. + [montellese] + * infomanager: fix calls to GetInt() without a valid file item (same as in GetBool()) - [Anton Fedchin] - * [WinRenderer] Re-work color shader. try to fix wrong colors on some hardware. + [Voyager1] + * re enable manually add to library (reverted from commit ce447e622ddbc65019797edb533d3c507b945b91) - [Anton Fedchin] - * [WinRenderer] speed up a bit configuring renderer. + [Voyager1] + * [rebrand][win] new app icon (reverted from commit 53bc14946e46b6e97a965dd3da5d6fbcf9cbcdbf) - [Bernd Kuhls] - * [Jarvis] partly backport of PR 9231 to fix segfault + [Voyager1] + * [rebrand][linux - [Kai Sommerfeld] - * [EPG] Guide Window: 20% performance gain on open + [Voyager1] + * [rebrand][android] new icons (reverted from commit 73195e349303cf88ecbd83c0d683d39d6efac52e) - [txtranslation] - * [lang] updated language files from Transifex + [Voyager1] + * [rebrand][ios] new icons with iOS8 support (reverted from commit feedab2c2a3b88b5c9c3b910dd69b8be24d7408d) - [ace20022] - * [android] Add missing libgif.so to the package. + [Voyager1] + * [rebrand][osx] new icons and installer background (reverted from commit 92cbadcd53e13edb8384ab5f474f34f58f0cfebd) - [Alwin Esch] - * [adsp] fix kodi frezze if no add-on present + [Voyager1] + * [rebrand][atv] new icons (reverted from commit 9d00bbd19b99c474fd981305f6b6e123256bbea0) - [Martijn Kaijser] - * bump to 16.1rc2 + [Voyager1] + * [rebrand][win32] new installer artwork (reverted from commit b208d62a6e07d41cdf98a59e838b27e2006d2534) - [Tolriq] - * EventServer security fix. + [Voyager1] + * [rebrand] new splash (reverted from commit 133439d8a6cf38d2de2b28579bb6938995d43cf7) + [Voyager1] + * [WIP][android] add Android TV banners (reverted from commit 18738a4337eebeeeea6ae4ea5a414f1705e6ce6a) - [Martijn Kaijser] - * bump to 16.1rc2 + [Voyager1] + * [rebrand][confluence] new logo (reverted from commit 1f93dbe97a557fad616a311cb4f293b7277c1007) - [Kai Sommerfeld] - * [EPG] Fix lockup when entering epg grid (endless loop) + [Voyager1] + * [rebrand][addons] new addon icons (reverted from commit 16f57541a6ed02a9e387a4df04d00edb023341fb) - [Anton Fedchin] - * [dx11] Fixed possible crash when living hardware stereo mode. + [Voyager1] + * [rebrand][visualization.vortex] remove XBMCrain preset and logo (reverted from commit 4cb1f72481840251441c49f687a7d13189aa8b73) - [Anton Fedchin] - * [dxva] fixed possible issue with dxva rendering (wrong hue/gamma) + [Voyager1] + * [WIP][rebrand][osx] dynamically create VolumeIcon.icns and move packaging related artwork to the central folder for this (reverted from commit 2a9f21e0f24a08b708a54051842f29bba5e3c205) - [Anton Fedchin] - * [win32] memcpy_sse2: fixed crash in corner case. + [da-anda] + * [WIP][rebrand][osx] dynamically create VolumeIcon.icns and move packaging related artwork to the central folder for this - [Chris "Koying" Browet] - * FIX: [longpress] do not eat keypress after a longpress + [da-anda] + * [rebrand][visualization.vortex] remove XBMCrain preset and logo - [arnova] - * changed: Ignore chapters for large step if there's only one + [da-anda] + * [rebrand][addons] new addon icons - [arnova] - * fixed: Screensaver would lockup Kodi when stopping on slow systems + [da-anda] + * [rebrand][confluence] new logo - [Anton Fedchin] - * [VideoPlayer] WinRenderer: fix render capure when dxva render method is used. + [da-anda] + * [WIP][android] add Android TV banners - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi dtor avahi thread termination. + [da-anda] + * [rebrand] new splash - [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + [da-anda] + * [rebrand][win32] new installer artwork - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [da-anda] + * [rebrand][atv] new icons - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [da-anda] + * [rebrand][osx] new icons and installer background - [h.udo] - * [LoadVideoSettings] Don't leak credentials + [da-anda] + * [rebrand][ios] new icons with iOS8 support - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [da-anda] + * [rebrand][android] new icons - [txtranslation] - * [lang] updated language files from Transifex + [da-anda] + * [rebrand][linux - [Rainer Hochecker] - * dxva2: fix segfault + [da-anda] + * [rebrand][win] new app icon - [Rainer Hochecker] - * vaapi: fix segfault + [Voyager1] + * re enable manually add to library [Martijn Kaijser] - * Bump to 16.1rc1 - + * [release] bump to 14.0 beta4 - [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + [Martijn Kaijser] + * [repo] change repo URLs to use mirrors.kodi.tv - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [arnova] + * fixed: Typo in variable name - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [arnova] + * fixed: Calling WaitForData with a large minimum could cause it to block the max. timeout - [h.udo] - * [LoadVideoSettings] Don't leak credentials + [arnova] + * changed: Use m_StateInput else dvdplayer osd info is 8 seconds delayed - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [arnova] + * fixed: Don't keep reading source when cache is full (fixes #15500) - [txtranslation] - * [lang] updated language files from Transifex + [arnova] + * fixed: FileCache-full logic was wrong + implement GetMaxWriteSize() function - [Rainer Hochecker] - * dxva2: fix segfault + [arnova] + * changed: Rename confusing CSimpleDoubleCache class to CDoubleCache - [Rainer Hochecker] - * vaapi: fix segfault + [montellese] + * musicdb: fix conflicting "singles" filter option introduced by 9fbf13eded5d682d4ae210043e536895c9356c18 (fixes #15539) - [Martijn Kaijser] - * Bump to 16.1rc1 + [popcornmix] + * [omxplayer] Fix for EAC3 passthrough + [popcornmix] + * [omxplayer] Don't sync up to passthrough audio packets - let GPU handle it - [Martijn Kaijser] - * update banner + [popcornmix] + * [omxplayer] Fix for out of sync after trickplay - [Martijn Kaijser] - * fix splashs screen + [anaconda] + * Add mk3d to video extensions and enable double cache + [Rainer Hochecker] + * dvdplayer: call UpdateClockMaster in regular intervals, state of videorefclock may change - [Martijn Kaijser] - * [addons] sync with repo + [Karlson2k] + * SysInfo: show CPU frequency as "XXXX MHz" instead of "XXXX,00MHz" - [ace20022] - * [cximage] Stop reading if an error was reported. + [wsnipex] + * [depends] ffmpeg: define make threads if number of cpu cores detection fails - [ace20022] - * [fix][cximage] Stop reading if an error was reported, since the data was freed already. + [Memphiz] + * [jenkins] - refactor jenkins scripts to centralise the decision for rebuilding depends - add project/cmake dir as criterion - [ace20022] - * [fix][cximage] Set row_pointers to null after deletion. This fixes a crash. + [h.udo] + * [Keyboard Layouts] Add Polish QWERTY - [Alex Ling] - * Fixed less than optimal number of decoding threads on some Android devices + [Rainer Hochecker] + * dvdplayer: update dropping stats after every call to decode - [kekePower] - * Update RssFeeds.xml + [Joakim Plate] + * copy: support chunked reads so that CFile internal buffer is eliminated - [Martijn Kaijser] - * bump to 16.0 Jarvis final + [Arne Morten Kvarving] + * fixed: quell printf format warnings - [Martijn Kaijser] - * bump to 16.0rc4 + [Joakim Plate] + * vda: only allow ffmpeg VDA when advanced setting enable it - [DaveTBlake] - * Fix GetSongsFullByWhere to work around SQLite query optimiser bug that makes left join on views very slow + [Memphiz] + * [AE/CA] - fix regression introduced in the enumeration refactor - handle "hackintosh" audio devices with "digital" in the name as digital devices [Memphiz] - * [VideoRenderer] - fix video rotation due to orientation hint - added scaling for not cutting video content + * [AE/CA] - constify getName of CADevice - [Anton Fedchin] - * [win32] WinRenderer: Fixed rotated videos. + [ace20022] + * [Fix] Manually activated subs, if classified as irrelevant, were not shown on resume. This is fixed by saving the subtitle's index upon manual activation. - [Anton Fedchin] - * [win32] Fixed convolution-6x6_d3d.fx shader. + [wsnipex] + * [linux] systemd-coredumpctl was renamed to coredumpctl, support both in kodi.sh - [Kai Sommerfeld] - * [PVR] PVR Windows: Only the active window must update the shared slected item path. + [Andriy Prystupa] + * fixed compilation error with undefined ARRAY_SIZE - [fritsch] - * FFmpeg: Use 2.8.6-Jarvis-16.0 + [Joakim Plate] + * gl: multipass renderer was broken when RECT textures was used as source - [fritsch] - * Revert "FFmpeg: Bump to 2.8.6-Jarvis-16.1" + [Joakim Plate] + * gl: multipass renderer would use wrong source pixels sizes - [Martijn Kaijser] - * [addons] sync with repo + [Joakim Plate] + * ffmpeg: if a second GetFormat dis-allow hwaccel, we must restore ffmpeg - [fritsch] - * FFmpeg: Bump to 2.8.6-Jarvis-16.1 + [Joakim Plate] + * vda: upgrade to hwaccel2 interface - [Erik Kessler] - * Fix Xbox controller crash on Windows. #16279 + [Joakim Plate] + * vda: if no image is returned, we must still reset cv_buffer - [anaconda] - * [lang/settings] Fix ADSP labels. + [Joakim Plate] + * vda: allow 3 render buffers - [Adrian Moennich] - * Check for .nomedia file inside tv show folders + [Memphiz] + * [ffmpeg/vda] - update for current used ffmpeg (2.2) + [Joakim Plate] + * vda: switch cvref rendering over to standard UYVY422 renderer - [Chris "koying" Browet] - * FIX: [longpress] do not repeat long presses + [Joakim Plate] + * vda: allocate pot texture if requested - [h.udo] - * [Jarvis] Add travic-ci badge to README.md + [Joakim Plate] + * vda: use IOSurfaceGetPixelformat instead of CVPixelBufferGetPixelFormatType - [h.udo] - * [Jarvis] Add travis linux support + [Joakim Plate] + * vda: cvref textures are non power of two so don't allocate extra space - [Martijn Kaijser] - * fix French AZERTY keyboard layout + [Joakim Plate] + * vda: fix chroma issue with vda upload [anaconda] - * CGUIListContainer: reset scroller position too on GUI_MSG_LABEL_RESET. + * Fix "Current fanart" not being shown in DialogVideoInfo. - [MilhouseVH] - * [mysql]: Fix limited songs query after #9005 - [Martijn Kaijser] - * [TexturePacker][gif] The Graphic Control Extension is optional. + [Karlson2k] + * [win32] CPUInfo: fix CPU frequency wrongly count in GHz instead of MHz, fixes #15555 - [1977David] - * Create french keyboardlayout + [Sam Stenvall] + * fix namespace typo - [popcornmix] - * mmalrender: Reject unsupported render formats + [Karlson2k] + * [win32] Update python package to 2.7.8 - [Arnold Neugebauer Zweikeks] - * [aml] fix trac 16515 + [Matthias Kortstiege] + * [videoinfoscanner] do not consider optical file paths as valid subpaths [Thomas Amland] - * [addons] show install notification for local version + * [videoinfoscanner] fix infinite loop - [Stanislav Vlasic] - * FIX Android: On newer kernels neon cpu feature is represented as asimd - [DaveTBlake] - * Fix GetSongsFullByWhere to use left join (some songs do not have artists) and apply count limit to just songs + [Joakim Plate] + * jobs: fixed segmentation fault when thumbnail loader abort - [ronie] - * fix radio channels background + [Martijn Kaijser] + * [skin] update re-touched - [Anton Fedchin] - * [dx11] Fix: Properly handle DXGI_STATUS_OCCLUDED status, previous method may cause overflow in dirty regions stack when desktop was locked for long time. + [ronie] + * [confluence] add 'hide broken' button - [DaveTBlake] - * Add missing MOOD tag scanning for FLAC/Ogg/Xiph/Vorbis, ASF and MP4/iTunes like other file formats + [ronie] + * [lang] add 'hide broken' string [Martijn Kaijser] - * bump to 16.0rc3 - - [Voyager1] - * [DVD] fix invisible menu overlays when corrected pts becomes negative after discontinuities - - [Voyager1] - * [DVD] fix invisible buttons by delay checking for invalid menu buttons until after the player received them from the demuxer + * [addons] do show broken/incompatible add-ons that are still installed at this moment so users can un-install them without using the toggle. This makes the hide broken option only toggle non-installed broken/compatible add-ons. - [Voyager1] - * fix multi-part stack selection of correct part + [Sam Stenvall] + * Revert "[pvr] Fix recording history (last directory not selected)" - [Kai Sommerfeld] - * [PVR] Guide window: EPG grid: now even works if none of the available channels has EPG data (fixes trac#16548). + [montellese] + * library: don't remove the source if the user has changed his mind + [Thomas Amland] + * [python] add all installed modules to path when addon info is unavailable - [Kai Sommerfeld] - * [PVR] Guide/Search/channel window: Do not add 'Record' if backend does not support timers. + [Martijn Kaijser] + * [pydocs] cosmetic fix on line ending - [Kai Sommerfeld] - * [PVR] Timer window: Show error box if 'Add timer' is selected and PVR backend does not support timers (fixes trac#16539) + [Thomas Amland] + * [addons] add toggle for hiding broken addons. hide by default - [Memphiz] - * Revert "fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5" + [ace20022] + * [Fix][win32] Discs that were present at start are not removed from views when ejecting them. - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Sam Stenvall] + * [gui] update the view state's list reference before the view state is consulted about whether the "go to parent" item should be added to the list - [txtranslation] - * [lang] updated language files from Transifex + [Sam Stenvall] + * [pvr] don't update the item list path before calling Update(), otherwise the history will be incorrectly recorded since the the history expects m_vecItems->GetPath() to be the "old" path, not the new one - [fritsch] - * ActiveAE: Increase timeout for sink init to 60 seconds + [Memphiz] + * [vfs/Pipe] - fix premature close of pipe. It should only be closed if refcount is zero [montellese] - * [profiles] don't save skin settings on master profile when it was only loaded to switch between two other profiles + * music library: add the possibility to clean the database in the background - [Martijn Kaijser] - * bump to 16.0rc2 - - - [Chris "Koying" Browet] - * FIX: [longpress] fixes ghost repeat + [montellese] + * video library: add the possibility to clean the database in the background - [Rechi] - * fix crashing if music is scanning and application gets stopped + [t4-ravenbird] + * dont abort if wait for net fails - [ronie] - * [re-touched] final update for jarvis - [Thomas Amland] - * [filesystem] handle resource paths as file paths + [Memphiz] + * [jenkins/darwin] - ensure that audioencoder addons are not removed from tree during cleanup (same like with pvr addons before) - fixed missing audioencoder addons in nightlies. - [Martijn Kaijser] - * ignore default select action on scripts - fixes #16516 + [Karlson2k] + * [emufnc] return exact '-1' instead of other negative values in dll_read() and dll_write() - [Kai Sommerfeld] - * Jarvis binary addons now taken from repo-binary-addons Jarvis branch + [Karlson2k] + * [emufnc] fix possible compiler warning - [Rainer Hochecker] - * VideoPlayer: allow dts of video streams to jump bach more up to 500ms - if those streams have no dts, dts equals pts + [Karlson2k] + * libdvdcss: add custom patches as files to lib/libdvd/patches/ - [fritsch] - * FFmpeg: Bump to 2.8.5-Jarvis-rc1 + [ace20022] + * [Fix] Reading zero bytes from a file should yield zero read bytes. Fix for 52800a1fa28cd6f9b843b55cfb40820fae2bc9d3. - [Kai Sommerfeld] - * [EPG] CGUIEPGGridContainer::UpdateItem: Fix m_item 'use after free' and invalid cursors, offsets. + [Karlson2k] + * libdvdcss: better handle partial read in libc_read - [phil65] - * [guiinfo] content type fix for addon browser + [Sam Stenvall] + * [pvr] move ActionDeleteRecording to GUIWindowPVRRecordings - [Martijn Kaijser] - * sync scrapers with repo + [Sam Stenvall] + * [pvr] go back to the parent folder when the last recording inside a subdirectory is deleted - [Martijn Kaijser] - * bump to 16.0rc1 + [Sam Stenvall] + * [pvr] hopefully fix the folder watched overlay once and for all. We now start out by assuming all folders are watched, then as we encounter unwatched recordings we remember those folders and unmark them at the end of the method - [Tolriq] - * Fix Http server default port on all platforms Use 8080 from default settings.xml Keep previous default value if webserver is activated + [Sam Stenvall] + * [pvr] always update metadata (i.e. play count) for items, not just the first time an item from that particular folder is encountered - [Kai Sommerfeld] - * [PVR] Fix 'dancing' OSD progress bar while switching channels. + [Sam Stenvall] + * [pvr] fixed folder watched icon appearing only after the folder had been entered once - [ronie] - * fix Container.SortOrder infolabel + [Sam Stenvall] + * [pvr] fix bug where the selected item didn't change to the next one after an item has been marked as watched/unwatched + [Sam Stenvall] + * [pvr] fix marking recordings as watched or unwatched (fixes #15118) - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [popcornmix] + * MMAL: Use Component Logging v2 - [txtranslation] - * [lang] updated language files from Transifex + [Joakim Plate] + * smb: eliminate unused while loop in OpenDir - [ronie] - * fix Container.SortOrder infolabel + [Joakim Plate] + * url: share name should always be updated - [DaveTBlake] - * Prevent "Scan to library" appearing on context menu for "Add music" item of music file view + [Joakim Plate] + * smb: make sure we deinit samba before global destructor - [ace20022] - * [tools][win32] Bump texturepacker to version 1.0.5. + [Joakim Plate] + * smb: use utility function to convert time_t to local file time - [ace20022] - * [gif][depends] Bump static and dynamic gif lib to 5.1.1. + [Joakim Plate] + * smb: drop old (unused) purge code - [ace20022] - * [tools][texturepacker] Fix gif decoding and packaging . + [Joakim Plate] + * smb: factor out stat to __stat64 conversion - [arnova] - * fixed: Our dir cache should always ignore url (protocol) options (fixes #16469) + [Joakim Plate] + * smb: eliminate smb.Init() calls in non static functions - [Kai Sommerfeld] - * [PVR] Fix ACTION_CHANNEL_[UP + [Joakim Plate] + * smb: drop try/catch of exceptions from C api - [ace20022] - * [gif] Fall back to DISPOSAL_UNSPECIFIED if no valid disposal method is specified. + [Joakim Plate] + * smb: don't add : for empty password - [ace20022] - * [TextureManager] Fix possible invalid pointer deletion. + [Joakim Plate] + * smb: set workgroup using standard api - [Voyager1] - * [dxva] since deinterlace options are disabled, don't use them + [Joakim Plate] + * Revert "[vfs] [posix] SMBFile: fix reading files opened with READ_TRUNCATED flag" - [ace20022] - * [gif] Add more version #ifdefs. + [Memphiz] + * [osx] - mark removable shares which are either have DVD or CD media in it as SOURCE_TYPE_DVD so the audio cd rip context menu is visible for it - [ace20022] - * [gif] The number of loops is stored as 2x uint8_t. + [Memphiz] + * [vtb/vda] - use component debug logging [ace20022] - * [gif] Fix for version < 5: delay and transparent are stored as uint8_t. + * [dvdplayer] Remove superfluous cast. Since 923baa83e091bbf80159b8aff523915ec0af824a m_SpeedState.lasttime is a int64_t. - [ace20022] - * [gif] Redact filenames in gif log output. + [fritsch] + * IMX: Use Component Logging - [ace20022] - * [gif] Try to skip erroneous frames instead of giving up immediately. + [fritsch] + * VDPAU: Component Logging - [ace20022] - * [gif] Be more tolerant if the first frame has the disposal method DISPOSE_PREVIOUS. + [fritsch] + * VAAPI: Use Component Logging - [ronie] - * [Confluence] fix size & position of mirrored image + [xhaggi] + * [pvr] fix update of groups and overriding group properties we only store locally - [Memphiz] - * [FileBrowser] - fixed credential disclosure when adding network locations + [xhaggi] + * [pvr] persist channel group after updated from client - [Anton Fedchin] - * [win32] memcpy_sse2: Fixed possible heap corruption if chroma width is not 16 aligned. + [Karlson2k] + * [emufnc] Fix: use correct return value on error in dll_flsbuf, flush file buffers, properly write data - [Dave Blake] - * Revert "Fix cached folders JSON playlist play item failure" + [Karlson2k] + * [emufnc] Fix: use correct return value on error in dll_filbuf, try to restore proper file pointer - [phil65] - * [guilib] properly set content types in music section + [Karlson2k] + * [emufnc] Use proper macro instead of hardcoded value in dll_ungetc() - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Karlson2k] + * [emufnc] Fixes: correctly emulate on bigendian platforms, use cast to _unsigned_ char in dll_fputc() - [txtranslation] - * [lang] updated language files from Transifex + [Karlson2k] + * [emufnc] Fix: return correct value in dll_fclose() - [xhaggi] - * [confluence][fix] get rid of view (ID: 51) in pvr channel window which cause issues with viewtypes + [Karlson2k] + * [emufnc] Fix: always read all data in dll_fwrite() - [t4-ravenbird] - * [bugfix] fast startup fail to execute wakeup + [Karlson2k] + * [emufnc] Fix: always read all data in dll_fread() - [DaveTBlake] - * Ensure FileExists is called with a file name, rather than a URL. Options on the end of the string causes file not to be found in cache when present. + [Karlson2k] + * [emufnc] Fix: return zero for dll_fread()/dll_fwrite() if size or count is zero - [xhaggi] - * [fix][pvr] prevent numeric dialog from being opened if python modal is present + [Karlson2k] + * [emufnc] Fix: "-1" is incorrect return value for dll_fwrite() and dll_fread() (return type is size_t) - [Anton Fedchin] - * [WinRenderer] Added support of rotated videos. + [Karlson2k] + * [emufnc] dll_write(): set errno if write() failed - [Anton Fedchin] - * [WinRenderer] Added workaround to fix an issue with color range on some hardware which doesn't support color range conversion or whose drivers are crappy. Now we're using same technique for color range conversion which is used in UI instead of using video processor. + [Karlson2k] + * [emufnc] dll_read(): set errno if read() failed - [xhaggi] - * [fix][pvr] don't populate hidden groups over json-rpc + [Karlson2k] + * [vfs] CFile: workaround in Read() and Write() for VFSes that do not support null buffer pointer - [xhaggi] - * [fix][pvr] m_gridIndex array index out of bound + [Karlson2k] + * [vfs] [win32] Win32File: better handle partially read/written buffer in Read()/Write() - [Kai Sommerfeld] - * [EPG] Fix 'GoToNow' to select the currently active epg event of selected channel. + [Karlson2k] + * [vfs] [win32] Win32File: really support "test" Read() and Write() with zero buffer size - [Kolja Lampe] - * Disable ratings button for plugins + [Karlson2k] + * libdvdcss: fix position after partial read in libc_read - [xhaggi] - * [fix][pvr] wrong group if channel switched by its internal id - [ronie] - * fix duplicate key mapping [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + * [lang] update of skin.confluence language files [txtranslation] - * [lang] updated language files from Transifex + * [lang] update of core language files - [fritsch] - * FFmpeg: Bump to 2.8.4-Jarvis-rc1-mp3 - - [Stefan Saraev] - * [udevprovider] browse disk dialog is not wanted for blu-rays + [txtranslation] + * [lang] update of internal addon language files - [Rainer Hochecker] - * [pvr] - fix selecting a channel by id via json-rpc + [Martijn Kaijser] + * show correct dialog header text for master lock code. fixes #15543 [montellese] - * [jsonrpc] CEpgInfoTag: fix serialization of "runtime" as an integer (in minutes) instead of as a string + * fix queuing of songs starting playback if something is already playing (fixes #15545) - [Chris "Koying" Browet] - * FIX: [droid] handle video rotation + [Martijn Kaijser] + * [release] bump to 14.0 beta3 - [jun.jiang] - * Fix compile error on msvs2013 - [jun.jiang] - * Fix assertion fail in Cutil::GetExternalStreamDetailsFromFilename + [xbmc] + * fix incorrect display of fps when dr kicks in - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [popcornmix] + * [ResamplePi] Add support for formats that need shifting [txtranslation] - * [lang] updated language files from Transifex + * [lang] fix invalid or wrong language names to be in sync with Transifex - [DaveTBlake] - * Allow for item separator in ARTISTS and ALBUMARTISTS tags. + [Sam Stenvall] + * [pvr] add missing call to parent's OnPrepareFileItems() - [Kai Sommerfeld] - * [PVR] Fix: Abort of active recordings must be possible even if associated timer is read-only + [popcornmix] + * [mmalrenderer] Add choice of 4 deinterlace schemes - [Ned Scott] - * Correct numeric input for newer PVR windows + [Memphiz] + * [darwin] - fix flicker in sysinfo - querying gateway via pipe needs a sleep - [Kai Sommerfeld] - * [keymaps] remote.xml: virtualkeyboard,numericinput: back now maps to 'back', not 'backspace' anymore + [Sam Stenvall] + * [epg] rename GetCurrentTime() to avoid naming collision with Windows-specific macro - [fritsch] - * FFmpeg: Bump to 2.8.4-Jarvis-rc1 + [uNiversaI] + * [cosmetics] minor spacing in readme - [Kolja Lampe] - * Prevent taglib from crashing kodi + [Frank Razenberg] + * [buttontranslator] don't copy windowmap for lookups - [Kolja Lampe] - * Select previously selected values in userratings selectdialogs + [Frank Razenberg] + * [buttontranslator] fix keymap overrides not working - [DaveTBlake] - * Fix Playlist.Getitems returning empty artist array by spltting artist desc string at separator. + [Martijn Kaijser] + * [skin] update reTouched git sha - [Max Kellermann] - * epg/EpgContainer: fix deadlock bug in LoadFromDB() + [Rainer Hochecker] + * fix string for component logging video - [Max Kellermann] - * pvr: fix a bunch of deadlock bugs + [Arne Morten Kvarving] + * AESinkPULSE: Rebrand pulseaudio sink name to reflect kodi - [Max Kellermann] - * pvr/PVRManager: make m_pvrWindowIds "const" + [Karlson2k] + * DVDVideoCodecLibMpeg2: fix broken check for memory allocation Thanks @fritsch and @Uukrull - [Max Kellermann] - * GUIWindowManager: protect m_idCache with g_graphicsContext + [Rainer Hochecker] + * AE: always request float from sink when in fixed mode, fixes unwanted re-init of sink - [Ned Scott] - * Remove some long-presses and some notes cleanup + [Roman Miroshnychenko] + * Ukr and Rus language fixes - [Joel Teichroeb] - * Use two full size members instead of using a static array as a union + [Rainer Hochecker] + * videorefclock: use videosync DRM on AMD systems - [Martijn Kaijser] - * fix forced subtitle selection after abc184c + [Sam Stenvall] + * [pvr] bump addons - [Max Kellermann] - * GUIWindowPVRBase: protect m_selectedItemPaths + [xbmc] + * player: fix rewind - [Max Kellermann] - * GUIWindowPVRBase: use array instead of std::map + [fritsch] + * (Coverity) AudioEngine: Cosmetics and member initialization ActiveAEBuffer - [Arne Morten Kvarving] - * fix ffmpeg logging credentials + [fritsch] + * (Coverity) VideoCodecs: Remove unused method pts_itod() - [Stefan Saraev] - * [udevprovider] handle 'change' events only for optical drives + [fritsch] + * (Coverity) iso9660: make sure to initialize m_paths to 0 as it's used by Reset() - [xhaggi] - * [pvr][fix] fix initial selection of channel item in guide window + [fritsch] + * (Coverity) Skin: properly initialize m_effectsSlowDown - [xhaggi] - * [pvr][fix] empty-check to prevent empty pathes in m_selectedItemPaths + [fritsch] + * (Coverity) DVDPlayerVideo: Remove assignment of bRequestDrop which is never read - [montellese] - * fix saving of skin settings when switching profiles (fixes #16203) + [anaconda] + * [builtins/jsonrpc] Invert default for showing dialogs after 5324. - [montellese] - * cosmetics: fix log messages about tag in skin settings + [Rainer Hochecker] + * dvdplayer: vaapi, vdpau - implement codec control flags - [ronie] - * [Confluence] reduce padding on dialog buttons + [Rainer Hochecker] + * dvdplayer: fix dts correction, again - [fritsch] - * FFMpeg: Bump to 2.8.4-Jarvis-beta4 + [Memphiz] + * [osx] - add callback when the input.appleremotealwayson setting is changed ("allow startup of kodi via remote") - to instantly install/deinstall the launchagent -> needed for manual migration path from xbmc to kodi - [h.udo] - * [PVR] CDVDInputStreamPVRManager: Don't leak credentials + [Memphiz] + * [XBMCHelper] - small refactor - move the launchagent installation/deinstallation out into its own method - [Martijn Kaijser] - * bump to 16.0 beta 5 + [Memphiz] + * [XBMCHelper] - change to only build i386 and adapt output dir to match the one where the binary was in our tree before... - [Martijn Kaijser] - * [strings] fix typos + [Memphiz] + * [osx] - remove XBMCHelper binary from tree - [Achim Turan] - * [Win32File] Fix invalid assert expression + [popcornmix] + * [omxplayer] Add option to choose omxplayer/dvdplayer automatically - [MilhouseVH] - * [mysql] Querying optimizer_switch needs to be non-fatal [backport] + [wsnipex] + * [rtmp] add canseek and drop unused rtmp options + [Joakim Plate] + * osx: fixed detect of latest sdk after yosemite - [Martijn Kaijser] - * bump to 16.0 beta 5 + [Rainer Hochecker] + * dvdplayer: fix app exit caused by creating teletext while thread is running already - [Thomas Amland] - * [addons] fix download location for multi directory repositories + [Michał Kępień] + * Handle BlueZ 5.x play/pause evdev scancodes - [wsnipex] - * [configure] make sure the top kodi src dir is always in INCLUDES + [Rainer Hochecker] + * dvdplayer: videocodec ffmpeg - fix timestamps and colorspace - [Martijn Kaijser] - * [pvr] fix missing header label on clean EPG + [xbmc] + * dvdplayer: allow rewinding at end of stream, do a seek after rewind - [ronie] - * don't use cached results for dir checks + [xbmc] + * dvdplayer: avoid short screen flicker caused by unnecessary reconfigure of renderer - [Chris "koying" Browet] - * FIX: [droid;input] regression after stylus fix + [Karlson2k] + * cc_decoder: suppress printing to stderr and stdout - [Chris "koying" Browet] - * CHG: [droid] remove unecessary dyloads + [Karlson2k] + * CueDocument: replace call of isdigit() with StringUtils::isasciidigit() - [Kai Sommerfeld] - * [confluence] String fix 'Timer' => 'Timers' + [Karlson2k] + * ActiveAEResample::Init: transform to 64bit before shift - [ronie] - * [Confluence] fix sidemenu nowplaying buttons + [Karlson2k] + * XMLUtils::GetHex: check result of sscanf() - [Kai Sommerfeld] - * [PVR, json-rpc] Fix Input.Select for PVR fullscreen windows + [Karlson2k] + * AEChannelInfo::BestMatch: fix use boolean in arithmetics - [Kai Sommerfeld] - * [PVR] Fix ghost timers in epg window. + [Karlson2k] + * GUIWindowTestPatternDX::DrawCheckers: check input parameters - [DaveTBlake] - * Override default setting for albumartistonly flag when already set in musicURL, so can be used by custom nodes. + [Karlson2k] + * [win32] AESinkDirectSound: check result of GetStatus() - [DaveTBlake] - * Stop scraping album data from overriding tag artist data even when override tag setting is disabled. + [Karlson2k] + * ElementText: replace 'char *' with 'std::string' - [ronie] - * fix logging of failed dependency + [Karlson2k] + * Fixes: remove large buffers from stack - [Max Kellermann] - * VideoPlayer/VAAPI: fix use-after-free bug in Release() + [Karlson2k] + * Fixes: wrong log strings - [Max Kellermann] - * Epg: fix buffer overflow in GetLastScanTime() + [Karlson2k] + * Fixes: checks for buffer overrun - [Chris "Koying" Browet] - * REVERT: [droid] leave MPEG2 h/w decoded; VOB playback is niche + [Karlson2k] + * Fixes: don't use uninitialized vars - [Achim Turan] - * [adsp] ADSP addon get enabled status fix + [Karlson2k] + * Fixes: check for NULL pointers before dereference - [Stefan Saraev] - * [music] fix leaking credentials in logs + [Karlson2k] + * Fixes: check results of memory allocation functions - [Stefan Saraev] - * [texturecache] fix leaking credentials in logs + [Rainer Hochecker] + * add component logging for video - [ronie] - * fix python version + [Chris "Koying" Browet] + * FIX: must return true after setting update - [ronie] - * update guilib api to 5.10.0 + [Memphiz] + * [vtb] - fix - use the correct bit for signaling the hw decoder to drop a frame. This is the bit which is visible in the now public ios 8 headers of vtb. I doubt that apple ever change this till ios4. If they did - we are screwed on older runtimes. At least on ios6 this bit is valid for sure. - [Martijn Kaijser] - * [pvr] fix incorrect string usage after combining multiple strings + [hudokkow] + * [Keyboard layouts] Add Portuguese QWERTY - [Martijn Kaijser] - * bump to 16.0 beta 4 + [Thomas Amland] + * fix uninitialized variable + [Thomas Amland] + * remove unused variable - [Chris "Koying" Browet] - * FIX: [amcs] no brightness/contrast for mediacodec(S) + [Thomas Amland] + * [xml] 'action' type setting should not require 'id' attribute - [Matus Kral] - * [TextureCache] fix log leaking username/pass + [popcornmix] + * [curl] Avoid busy spinning when socket timeout is too low - [Martijn Kaijser] - * [repo] bump repo version + [foo86] + * [rbp] Enable optimization on Raspberry Pi - [Martijn Kaijser] - * [addons] sync with repo + [Frank Razenberg] + * [keymap] Recreate SDL2 compatible PS3 dualshock keymap, converted from the 360 one - [Thomas Amland] - * [addons] dont invalidate art for addons that are new or not updated since last fetch + [Matthias Kortstiege] + * [vaapi] fix missing break in switch - [Rainer Hochecker] - * VideoPlayer: fix false positive vfr detection + [Matthias Kortstiege] + * [rendermanager] fix possible null ptr dereference in CXBMCRenderManager::GetOptimalBufferSize() - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Matthias Kortstiege] + * [nfsfile] fix arg type mismatch - [Danilo Krummrich] - * android: fix event source evaluation + [Matthias Kortstiege] + * [cpuinfo] fix possible divide-by-zero - [phil65] - * [Confluence] - fix navigation for SideBar NowPlaying controls + [Matthias Kortstiege] + * [paplayer] fix possible resource leak in QueueNextFileEx - [wsnipex] - * [cmake] fix package-addon (zip) target on linux + [Matthias Kortstiege] + * [settings] fix possible null ptr dereference in CGUIDialogSettingsBase::SetupControls - [un1versal] - * fix strings after #8180 + [Matthias Kortstiege] + * [pvr] fix uninitialized members in CPVRGUIInfo constructor - [DaveTBlake] - * Fix missing disc number when in file view. As song.iTrack holds both disc and track numbers, SetSong needs to set both. + [Matthias Kortstiege] + * [pvr] fix possible resource leak in channels osd dialog - [phil65] - * [GUI] remove "Add source" from MyPrograms section + [Matthias Kortstiege] + * [skininfo] fix uninitialized members in CSkinsInfo constructor - [Martijn Kaijser] - * [strings] fix typo + [Balint Reczey] + * linux: Check for Logind first, then *Kit-s with UPower when detecting PM framework - [Avdienko Mikhail] - * Fix DPMS detection for X11 without GLX + [Thomas Amland] + * log when RunAddon is called with invalid addon id/type and no addon will be started - [ace20022] - * [osx][XBMCHelper] Comparison of a boolean with an integer. + [Thomas Amland] + * RunScript: execute even if addon isn't a script type addon - [ace20022] - * [PowerManager] Possible leak in public function. The pointer 'm_instance' is not deallocated before it is allocated. + [phate89] + * Use "system.playlistspath" setting instead of default library one in CFileUtils - [ace20022] - * [AMLUtils] Suspicious use of ; at the end of 'if' statement. + [Kai Sommerfeld] + * [PVR] Changed EpgInfoTag::[IsActive - [ace20022] - * [SMBFile] Invalid number of character '(' when these macros are defined: 'TARGET_POSIX'. + [Stanislav Vlasic] + * [AMLCodec] Add support for panel display output + + [Brandon McAnsh] + * DVDVideoCodecAmlogic: Remove throttling of MPEG2 playback - [txtranslation] - * [lang] bump major version of the en_GB language-addon [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + * [lang] update of skin.confluence language files [txtranslation] - * [lang] updated language files from Transifex + * [lang] update of core language files [txtranslation] - * [lang] automatic syntax corrections for the en_GB language file + * [lang] update of internal addon language files - [DaveTBlake] - * Set FileItem from MusicInfoTag rather than create new and lose artwork in CPlayerOperations::GetItem. This now similar to how video handled. + [Rainer Hochecker] + * renderer: use 3 render buffers for sw decoding, restores bahavior after 71f50d3677409a3ba3f8533daae105e6e0366a1 - [ace20022] - * [GUIWindowManager] Clarify calculation precedence for '&' and '?'. + [Rainer Hochecker] + * [infomanager] only update a/v info if something has changed and only by main thread - [ace20022] - * [GUIFontTTF] Clarify calculation precedence for '&' and '?'. + [txtranslation] + * [lang] update of skin.confluence language files - [ace20022] - * [guiaction] Set retval to true instead of + [txtranslation] + * [lang] update of core language files - [Thomas Amland] - * adjust repository addon to use gzipped addons.xml + [txtranslation] + * [lang] update of internal addon language files - [Thomas Amland] - * [addons] add support for pre-gzipped addons.xml in repositories + [Tobias Arrskog] + * Disable extra logging by default - [montellese] - * [events] fix removal of events (fixes #16403) + [Mettbrot] + * Add German QWERTZ to keyboard layouts - [Matthias Kortstiege] - * [touch/filemanager] - workaround for the non-working touch input in the filemanager window + [fritsch] + * AESinkALSA: Allow fragmentation, e.g. even multiply of PeriodSize - [Thomas Amland] - * add utility for decompressing gzip + [Rudi] + * AESinkALSA: Set correct value for AES3 when using HBR mode - [HitcherUK] - * [skin.confluence] Fix main menu player controls + [montellese] + * binary addons: fix dependency handling for dependencies - [Martijn Kaijser] - * [string] fix c/p mistake + [Rainer Hochecker] + * videorefclock: fix clock speed for D3D after refactoring - [Martijn Kaijser] - * [strings] fix incorrect setting description + [fritsch] + * AESinkProfiler: Goodbye my love goodbye - [Kolja Lampe] - * Fix content types for video. Library paths should not get "files" content type. + [fritsch] + * AE: Fix some coverity warnings - [Kolja Lampe] - * Fix content types for music. Root and source pathes should not get "files" content type. Also improved playlists handling and added addon handling. + [fritsch] + * AESinkPULSE: Fix Coverity suggestions - [Achim Turan] - * [adsp] Remove unused newRegistration variable during addon registration method + [xbmc] + * videoplayer: update frametime, it might change due to fps detection - [Alwin Esch] - * [adsp] fix wrong function error check on database + [xbmc] + * video player: present correct pts to user for a/v sync (after buffering in renderer) - [fritsch] - * ffmpeg: Bump to 2.8.3-Jarvis-beta3 + [xbmc] + * videoplayer: adapt lateness detection and dropping to buffering - [Alwin Esch] - * [adsp] fix crash and frezzes during add-on load - [Alwin Esch] - * [adsp] cleanup system start way + [ronie] + * [Confluence] add new default icons [ronie] - * [gui] drop video/music overlay dialogs leftover part III + * add missing default icons - [Kai Sommerfeld] - * [PVR] Timer update: Fix handling of timers with 'start at any time' - [Chris Browet] - * FIX: [aml] avoid decoder being deadlocked + [Memphiz] + * [ios] - get the resolution clamp for > 720p material back in place - the assumption that retina devices have enough power was wrong - [h.udo] - * [addons] Fix wrong text on failed add-on install - [Jan Holthuis] - * [AMLCodec] Use libamcodec.so if libamplayer.so is missing + [Rainer Hochecker] + * Revert "[infomanager] only call UpdateAVInfo when really needed" - [Jan Holthuis] - * [AMLCodec] Remove dependency on amffmpeg and use libavutil instead + [Matthias Kortstiege] + * [logging] stop log spam introduced with ba34a62 - [Jan Holthuis] - * [AMLCodec] Remove unused methods/members from DllLibAmCodec/am_private_t + [fritsch] + * GUIInfoManager: Proper minimalstest locking for UpdateAVInfo - [Jan Holthuis] - * [AMLCodec] Remove unreachable code in set_header_info() + [Matthias Kortstiege] + * [infomanager] only call UpdateAVInfo when really needed - [Chris "koying" Browet] - * FIX: [aml] smarter capabilities detection + [Martijn Kaijser] + * [release] bump to 14.0 beta2 - [Chris "koying" Browet] - * CHG: [aml] drop device-specific hacks - [Chris "koying" Browet] - * CHG: [aml] remove cpufreq hacks + [Martijn Kaijser] + * [win32] fix typo in NSIS installer creation - [Jian Wang] - * PD#113872:First kodi 15.2 version for amlogic + [Karlson2k] + * [vfs] [posix] SMBFile::Write() remove unneeded cast - [John Rennie] - * The Info action is not useful in an addon + [Karlson2k] + * [vfs] [posix] SMBFile::GetLength() return correct values on errors - [Leonard Harms] - * time sometimes moves backwards coming up from base libraries + [Karlson2k] + * [vfs] [posix] SMBFile::GetPosition() return correct values on errors - [Memphiz] - * [webserver] - fixed possible directory traversal bug due to insufficient url checking + [Karlson2k] + * [vfs] [posix] SMBFile: fix reading files opened with READ_TRUNCATED flag - [MilhouseVH] - * [MySQL] Restore pre-5.7.6 query optimizer behaviour when required + [arnova] + * changed: m_iCurrentPts is NOT an int but a double - [Chris "koying" Browet] - * FIX: allow to delete a default key binding + [arnova] + * fixed: Chapter skipping was broken due to improper current pts updating (thanks FernetMenta for the pointer). Fixes ticket #14535 - [MilhouseVH] - * [MySQL] Disable ONLY_FULL_GROUP_BY per session + [Rainer Hochecker] + * ffmpeg: bump to version 2.4.3 - [metaron] - * [PVR] Mark Created groups as Loaded on Persist + [montellese] + * fix CApplicationMessenger::SendText() not sending the text to the proper edit control - [Kolja Lampe] - * Coverity fix check return value (CID 1224459) + [Thomas Amland] + * fix segfault when calling StopScript builtin with no parameters - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719190) + [Matthias Kortstiege] + * [NfoFile] fix empty video details for multipart episodes - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719189) + [Karlson2k] + * [vfs] [posix] SMBFile: fix Read() with zero size and null buffer - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719187) + [anaconda] + * [videodb] Keep empty series if hideemptyseries=true - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719219 & CID 719220) + [phate89] + * Honor "ignorethewhensorting" when jumping to letter - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719221) + [anaconda] + * [videodb] Fix deleting bookmarks from dialog for add-ons. - [Kolja Lampe] - * [music] Listeners should not be able to hold a negative value + [Chris "Koying" Browet] + * FIX: [droid] allow to build without debugging and pickup jenkins configuration - [metaron] - * [PVR] Context Menu Crash Fix - [Kai Sommerfeld] - * [PVR] Ensure that newly added channel groups are persisted, fixes trac 16365 + [ronie] + * [Cosmetics] reserve window id's for skins - [Chris "koying" Browet] - * FIX: [droid] always handle media keys... + [Memphiz] + * [jenkins] - when trying to determine the branchname of a detached head revision - filter it so only branches from the currently built GITHUB_REPO are used (else we might pick the wrong branchname from another repo which was checked out before and contains the same revision) - [DaveTBlake] - * Archive artistDesc and albumArtistDesc otherwise artist names not shown when album list loaded from cache. + [Fice] + * [UPnP] rebrand our Media Server/Renderer - [ace20022] - * [guilib] Fix gif animations in case of a too large gif. + [Fice] + * [Docs] fixup urls to kodi.tv - [Chris "Koying" Browet] - * FIX: [droid] ignore power button + [ronie] + * [Confluence] fix last day of daily weather forecast - [Chris "Koying" Browet] - * FIX: [droid;keys] handle F-keys + [Kai Sommerfeld] + * [CEC] Added support for CEC buttons introduced by HDMI 1.4 - CONTENTS_MENU - ROOT_MENU - TOP_MENU - DVD-MENU (Requires at least libcec 2.2.0) - [ronie] - * [Confluence] fix button alignment - fixes trac #16382 + [Philipp Te] + * removed redundant value conditions from variables - [MilhouseVH] - * [dbwrapers] Include database name in error message - [ronie] - * [re-touched] skin update + [wsnipex] + * use correct app name in the linux desktop file (fixes #15524) - [Thomas Amland] - * [gui] show an ok dialog instead of the addon update dialog when there are no versions available + [Martijn Kaijser] + * Update GPL license XBMC -> Kodi - [ronie] - * [Confluence] disallow program addons selection + [Rainer Hochecker] + * dvdplayer: exclude blurays from fast anylyzinh mpegts streams - [metaron] - * [PVR] Fix for blank Currently In Prog Recordings + [Memphiz] + * [rebrand] - change default username of webserver from xbmc to kodi - [txtranslation] - * [lang] correct wrong (duplicated) numeric ID + [montellese] + * settings: fix combination of updated settings and default value handling - [Martijn Kaijser] - * bump to 16.0 beta3 + [popcornmix] + * [AE] Allow resampler to indicate when it has too much data buffered - [metaron] - * [PVR] Fix Timer Status UI inconsistencies + [popcornmix] + * [omxplayer] Remove unused function - [Stephan Raue] - * [keyboard.xml] add KEY_CONFIG keymapping (config) + [arnova] + * changed: For web servers returning filenames with & encoding (e.g. Apache) transcode into %-URL encoding. Fixes #15365 - [Stephan Raue] - * [LinuxInputDevices] add KEY_SELECT support (return) + [Karlson2k] + * Change APP_HOME -> KODI_HOME and other APP_* -> KODI_* - [Stephan Raue] - * [LinuxInputDevices] add KEY_FILE support (launch_file_browser) + [arnova] + * fixed: For DAV files we should first get filename then URL decode else files like test;.avi fail - [Stephan Raue] - * [LinuxInputDevices] add KEY_SEARCH support (browser_search) + [arnova] + * fixed: ConvertHTMLToW didn't properly handle &#x encoding - [Stephan Raue] - * [LinuxInputDevices] add KEY_MAIL support (launch_mail) - [Stephan Raue] - * [keyboard.xml] add KEY_HOMEPAGE keymapping (Home) + [Martijn Kaijser] + * Update GPL license XBMC -> Kodi - [Stephan Raue] - * [keyboard.xml] add KEY_RED,KEY_GREEN,KEY_YELLOW,KEY_BLUE keymapping (colored buttons) + [Martijn Kaijser] + * [release] also bump version in configure.in - [Stephan Raue] - * [keyboard.xml] add KEY_FAVORITES keymapping (Favorites) + [uNiversaI] + * xbmc -> left over - [Stephan Raue] - * [keyboard.xml] add KEY_TEXT keymapping (Text) + [montellese] + * Revert "media library: add UPnP servers to sources://" - [Stephan Raue] - * [keyboard.xml] add KEY_ZOOM keymapping (Zoom) + [montellese] + * Revert "upnp: fire an update source message when a UPnP server becomes available/unavailable" - [Stephan Raue] - * [mouse.xml] add right click keymapping (Info) + [yanniks] + * [linux/ubuntu] update README files - [Stephan Raue] - * [keyboard.xml] add ALT+F4 keymapping (Exit) + [Rainer Hochecker] + * dvdplayer: exclude blurays from fast anylyzinh mpegts streams - [Stephan Raue] - * [keyboard.xml] add CTRL+R keymapping (Record) + [Memphiz] + * [rebrand] - change default username of webserver from xbmc to kodi - [anaconda] - * builtins: fix Container.Refresh after ac870b64b16dfd0fc2bd0496c14529cf6d563f41. + [montellese] + * settings: fix combination of updated settings and default value handling - [wsnipex] - * redact filenames in smbfile log output + [popcornmix] + * [AE] Allow resampler to indicate when it has too much data buffered - [sportica] - * Fix codepage problem to input Korean properly. + [popcornmix] + * [omxplayer] Remove unused function - [Thomas Amland] - * [addons] fix pausing of repository updates during foreground playback + [Sam Stenvall] + * [pvr] fix deleting recording folders - [Thomas Amland] - * allow CTimer to be restarted asynchronously + [arnova] + * changed: For web servers returning filenames with & encoding (e.g. Apache) transcode into %-URL encoding. Fixes #15365 - [Anton Fedchin] - * [win32] RenderingSystemDX::OnDeviceReset() - fire OnResetDevice event also if new device was created. + [Karlson2k] + * Change APP_HOME -> KODI_HOME and other APP_* -> KODI_* - [Pär Björklund] - * Re-add the openssl hack, was never mean't to be removed without adding a proper fix + [arnova] + * fixed: For DAV files we should first get filename then URL decode else files like test;.avi fail - [Martijn Kaijser] - * [win32] Windows has no GL any more so setting negate is obsolete + [arnova] + * fixed: ConvertHTMLToW didn't properly handle &#x encoding [Martijn Kaijser] - * [droid] Don't show option "sync playback to display" as it's not supported on Android - - [Kolja Lampe] - * [music] When adding a new music directory, ask the user if he wants to scan it + * [release] bump to 14.0 beta1 - [metaron] - * [PVR] Prevent broken Timers being 'Next Recording' [ronie] - * remove broken musicvideos scraper + * nuke presetlist action. fixes #15518 - [BtbN] - * AE Pulse: Ignore volume changes on corked sinks + [Rainer Hochecker] + * videorefclock: fix potential segfault on systems which do not support video sync - [Glenn-1990] - * [PVR] prevent empty timer settings with integers + [Memphiz] + * [ios] - replace the launch images holding the XBMC logo with plain black images (as those aren't shown on most devices anyways and our startup time is fast enough to not need visible launch images) - [fritsch] - * FFMpeg: Bump to 2.8.2-Jarvis-beta2 + [Memphiz] + * [ios] - add the launchimage for iphone5 screens to the info.plist - restores iphone5 resolution on ios8 - [Glenn-1990] - * [PVR] fix timer dialog 'maxRecordings' label + [anaconda] + * Fix marking a video with a resume point as watched. - [Martijn Kaijser] - * [repo] Only fetch the addons.xml for the current version as we changed our repo script on the server to auto copy all compatible version to a single folder + [popcornmix] + * [rbp/settings] Allow av sync type to be enabled - [Martijn Kaijser] - * bump to 16.0 beta 2 + [popcornmix] + * [omxplayer] Request 3 render buffers - [metaron] - * [PVR] Remove repeating timers from Recording lists + [Chris "Koying" Browet] + * FIX: [depends] install pvr at the proper, name depdendant, place - [Thomas Amland] - * [addons] remove unused methods + [fritsch] + * PGS Subs: Don't read from null ptr and Flush on error - [Thomas Amland] - * [addons] fix min/max typo. should get the repo with the highest version + [Karlson2k] + * [cec] [win32] Use new package format - [Thomas Amland] - * [addons] dont include broken versions in available updates + [Lars Op den Kamp] + * [CEC] use device name 'Kodi' instead of 'XBMC' - [robwebset] - * Support PlayingBackgroundMedia + [Lars Op den Kamp] + * [CEC] fixed - don't use CEC_CLIENT_VERSION_CURRENT for the client version, because it will lead to issues when XBMC is rebuilt after a libCEC bump that changes something - [MilhouseVH] - * Clear previous cancelled flag + [Lars Op den Kamp] + * [CEC] renamed the iDoubleTapTimeoutMs in the new libCEC for clarity. does not change binary compatibility - [MilhouseVH] - * Fix inversion of export library dialogs; fix #16317, fix #16358 + [Lars Op den Kamp] + * [CEC] fixed: don't return garbage from CEC related app messenger methods see https://github.com/xbmc/xbmc/commit/19d37944ca2a2ac2f3e71a40a94e9ea289d8f2db#commitcomment-8248480 - [LS80] - * [python] Fixed getRegion dateshort format without leading zero + [Lars Op den Kamp] + * [CEC] prevent bus rescan on a Pi, since the adapter cannot be removed - [John Rennie] - * Fix ticket 15727, SMS input not updating CGUIKeyboardGeneric + [Lars Op den Kamp] + * [CEC] bump libCEC to 2.2.0 + [montellese] + * cmake: rename XBMCROOT to APP_ROOT with backwards compatibility - [Martijn Kaijser] - * bump to 16.0 beta 2 + [montellese] + * cmake: fix version.txt parsing and APP_NAME in kodi-config.cmake + [montellese] + * cmake: rebrand from xbmc to kodi with backwards compatibility - [Stefan Saraev] - * [amcodec] partialy revert 344af8f + [popcornmix] + * Add VideoReference clock for Raspberry Pi - [Chris "koying" Browet] - * FIX: [droid] Only sw for SD MPEG + [popcornmix] + * [rbp] Add method for waiting for next vsync - [Chris Browet] - * FIX: [amc] skip frame render when changing surface size + [popcornmix] + * [egl] Add support for calling OnResetDevice on display mode change + [Rainer Hochecker] + * videorefclock: add video sync drm [Rainer Hochecker] - * AE: fix GetDelay - only apply time correction to sink delay + * X11: expose crtc needed by drm video sync - [DaveTBlake] - * Restore content to "files" when in music file view, but still have "media info" view type available so that music file tag data can be displayed. + [Rainer Hochecker] + * videorefclock: refactoring + [Lars Op den Kamp] + * [CEC] fixed: don't try to stick a value > 255 in a byte - [Thomas Amland] - * [addons] lock manager initialization + [Brandon McAnsh] + * Use APP_NAME_LC for generating the android library - [Thomas Amland] - * [addons] dont change disabled state in db directly on addon update + [Matthias Kortstiege] + * [videodatabase] speed up the video database cleanup for archives - [Thomas Amland] - * [addons] clear blacklist state from database and manager on uninstall + [Matthias Kortstiege] + * [musicinfoscanner] keep track of already processed paths while scanning - [enen92] - * [pydocs] Fix small typo in xbmc.log() example + [Thomas Amland] + * fix script.library type missing in runscript/runaddon checks. + [fritsch] + * VAAPI: Change some loglevels - we are spamming too much v2 - [Anton Fedchin] - * [win32/utils] Fixed converting yuv420 to nv12. Fixed trac #16217 + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing musicvideo from library - [Rainer Hochecker] - * VideoPlayer: fix for closed captions - 708 + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing movie from library + [phil65] + * dynamic dialog size for DialogSelect.xml [Thomas Amland] - * [events] fix crash when attempting to install an addon not in a repository from the event list + * [videoinfoscanner] scan the entire subtree of path passed to scanner. - [Alwin Esch] - * [gui] Sort include files on GUIWindowLoginScreen.* alphabetical - [metaron] - * [PVR] Recording EPG Association Fix + [Lars Op den Kamp] + * ... and prevent these backup files from being committed again - [DaveTBlake] - * Use CMusicInfoTag.GetArtistString() and GetAlbumArtistString to pass song and album artist string out to python addons. + [Lars Op den Kamp] + * removed accidental backup file committed... + [Martijn Kaijser] + * [droid] update Android manifest with - [Memphiz] - * [ios] - fix playback controls from ios control center when kodi is playing music and backgrounded + [yanniks] + * [README] updates for Kodi - [Alwin Esch] - * [builddep] add calls to create missing headers on build for libgpg-error + [Lars Op den Kamp] + * changed to enable all component logging by default - [Kai Sommerfeld] - * [PVR] Fix: Toggle record/stop recording on ACTION_RECORD (e.g. for 'record' remote control button) + [Lars Op den Kamp] + * [CEC] fixed: re-enable CEC logging by default after fba4e391197b92d2e49c936a3a13fe785014d31c. It can still be disabled for people who don't want to see CEC logging, but it'll now be enabled again by default when debugging is enabled, like it was in Gotham. - [Kai Sommerfeld] - * [PVR] Fix: Remove context menu item 'Add to favourites' for children of repeating timers + [popcornmix] + * [rbp] Fix for orientation handling of Pi textures - [Kai Sommerfeld] - * [PVR] Prevent to delete read-only timers (e.g. using 'del' key) - [Kai Sommerfeld] - * [PVR] Context menu cleanup: All windows use same order for menu items + [Memphiz] + * [ios] - update readme - [Kai Sommerfeld] - * [PVR] Context menu cleanup: Consequently use same logic for 'Stop recording' vs 'Delete timer' + [Memphiz] + * [darwin] - some pending xcode project changes (xcodes does those whenever opened so lets commit them) - [Kai Sommerfeld] - * [PVR] Context menu cleanup: Rename CONTEXT_BUTTON_ADVANCED_RECORD to CONTEXT_BUTTON_ADD_TIMER + [Chris "Koying" Browet] + * fixup 5f5d8c86490510f49b82d05ff16011bfbf4cbfa8; re-add default joystick map - [Alwin Esch] - * [depends] fix libgpg-error compile with gcc5 (Ubuntu Xenial) with update to version 1.20 - [Alwin Esch] - * [depends] fix libssh compile with gcc5 (Ubuntu Xenial) + [montellese] + * [confluence] fix default focus in ProfileSettings.xml (fixes #15507) - [Ned Scott] - * Minor keyboard.xml improvements + [Karlson2k] + * [win32] [vfs] Win32SMBDirectory: Do not try to connect with not required. Implemented similarly to Win32SMBFile. + [Thomas Amland] + * [smb] only log if samba logging is enabled - [Memphiz] - * [jenkins] - evaluate new env var "BUILD_BINARY_ADDONS" + [anaconda] + * Respect parent path decision when cleaning paths. - [Memphiz] - * [jenkins] - remove unused linux32 buildsteps - [Memphiz] - * [jenkins] - removed osx32 build support + [yanniks] + * [ios/atv2] fix spelling mistake in README - [DaveTBlake] - * Split mood into an array of values when serialized to match JSON interface. Bump JSON minor version as interface now correctly returning mood. + [Frank Razenberg] + * [keymap] Update PS3 keymap to use a regex name so it works OOB with sixad driver - [Chris "koying" Browet] - * FIX: [droid] some intent filters MUST be registered in code + [Frank Razenberg] + * [keymap] Add trigger attributes to 360 controller + altname for Razer Sabertooth - [Chris "koying" Browet] - * FIX: [droid] regression on media keys with CEC + [Frank Razenberg] + * [buttontranslator] Use regexes for joystick names in ButtonTranslator keymaps - [Kai Sommerfeld] - * [EPG,PVR] Fix deadlock caused by Noitifyobservers call while holding instance's mutex. + [Frank Razenberg] + * [buttontranslator] Add keymap attribute for axis-to-trigger mappings + [Frank Razenberg] + * [windows] WINJoystick: correctly handle multiple joystick and improve triggers - [ace20022] - * [texture/iimage] Pass the texture's width to iimage's Decode() method. + [Frank Razenberg] + * [linux] Rewrite SDL_Joystick to use SDL2: adds hotplug support, correctly handles multiple joysticks and improves axis handling - [Chris "koying" Browet] - * FIX: [amc] VC1 tweak + [wsnipex] + * [depends] move to SDL2 for linux - [Kai Sommerfeld] - * [PVR] Remove redundant method CGUIWindowPVRTimers::ShowTimerSettings. + [Tobias Arrskog] + * [configure] Moved xbmc to SDL2 - [Kai Sommerfeld] - * [PVR] Fix: Do not try to update read-only timers. - [Matthias Kortstiege] - * [coverity] CID#1267254 uninitialized class members in GUIFont.cpp + [Memphiz] + * [ios] - fix compile (stupid backport error - yeah i will continue using jenkins i promise ...) - [Matthias Kortstiege] - * [coverity] CID#1315108 class member 'm_image' is not initialized + [Memphiz] + * [jenkins/android] - fixed wrong env_var check - [Matthias Kortstiege] - * [coverity] CID#1316471 class member 'm_doContentLookup' is not initialized + [ronie] + * [Confluence] fix visible condition - [Matthias Kortstiege] - * [coverity] CID#1262133 fix possible div-by-zero in Autorun.cpp + [BigNoid] + * [win32] Dont delete AppData folder - [Matthias Kortstiege] - * [cleanup] remove unused variables + [Memphiz] + * [jenkins/android] - allow to build OBB package via jenkins env_var - [Fernando] - * Fix TRAC 16359: not filtering tvshows/movies already in tag + [Memphiz] + * [ios8] - another native keyboard fix which slipped through when compiling with our old sdk on jenkins + [montellese] + * [win32] fix compiling TestRarFile due to missing S_IFLNK - [Matthias Kortstiege] - * [music] don't use the directory cache when cleaning the database (fixes #16354) + [Memphiz] + * [jenkins/android] - enable usage of release sign key - [Thomas Amland] - * [addons] fix library path building + [Memphiz] + * [vtb] - fix the removed clamp for retina displays (need to fix the stride for some movies as it was done before) - [ace20022] - * [JpegIO] Crop too large image/frame in Decode. This fixes a theoretically possible access violation. + [montellese] + * tests: fix CXBMCTestUtils::ReferenceFilePath() - [ace20022] - * [cximage] Crop too large image/frame in Decode. This fixes a theoretically possible access violation. + [montellese] + * [win32] silence warning about unused variable - [ace20022] - * [fix][gif] Crop too large image/frame in Decode. This fixes a possible access violation. + [montellese] + * [win32] fix building and running Kodi-test - [ace20022] - * [iimage] Add width and height of the texture/buffer to the interface method Decode(...). + [montellese] + * cmake: handle cases when cmake has pre-initialized CMAKE_INSTALL_PREFIX - [ace20022] - * [gif] Check if there's a frame, before accessing it. This prevents a possible access violation. + [montellese] + * make "Zeroconf Browser" localizable - [Matthias Kortstiege] - * [guilib] colordiffuse not applying to progresstextures + [montellese] + * upnp: fire an update source message when a UPnP server becomes available/unavailable - [Matthias Kortstiege] - * [guilib] fix togglebutton label not rendered properly + [montellese] + * media library: add UPnP servers to sources:// - [ace20022] - * [gif] Check frame dimensions. + [montellese] + * SourcesDirectory: avoid retrieving removable devices if getting media sources failed - [ace20022] - * [gif] Skip frames with an illegal dimension rather than abort. + [montellese] + * media library: force a reload when sources have changed in files view + [ronie] + * Remove 'XBMC.' from built-ins - [fritsch] - * Compositors: Only disable them if actually in use + [ronie] + * [Confluence] Update weather window - [Lauri Myllari] - * x11: use the standard hint for disabling compositing + [ronie] + * Add some new weather strings - [Rainer Hochecker] - * videoplayer: fix detection of program change + [arnova] + * fixed: Asserting on empty protocol is too extreme, it also fails with file://... - [un1versal] - * [strings] fix incorrect dvd mount string and generalise it instead + [wsnipex] + * [buildsystem] posix: add legacy xbmc links for libdir, includedir and datarootdir - [Stefan Saraev] - * [udevprovider] also handle 'change' events. fixes data cd/dvds - [Stefan Saraev] - * [udevprovider] fix mounting raw filesystems on a non partitioned disks + [janbar] + * [pvr] Fix unexpected sub channel merge in EPG grid - [Stefan Saraev] - * [udevprovider] fix segfaults. mountpoint can be null + [Matthias Kortstiege] + * [streamdetails] do not log username/password - [Rainer Hochecker] - * paplayer: wait for eof if no crossfading or cue sheet + [Matthias Kortstiege] + * [playlistplayer] do not log username/password + [Matthias Kortstiege] + * [subtitles] do not log username/password - [DaveTBlake] - * Fix missing artist display in music player + [Matthias Kortstiege] + * [videoinfoscanner] do not log username/password - [Sam Stenvall] - * [teletext] fix incorrect loop parameters, makes loop run again + [Thomas Amland] + * runscript: make sure to get the correct extension point to run - [Sam Stenvall] - * [dxva] fix dereferencing this after deleting it + [Chris "Koying" Browet] + * CHG: [droid] refactor packaging to allow obb google extension apk - [Sam Stenvall] - * fix invalid log format specifiers + [uNiversaI] + * [rebrand] minor @echo @APP_NAME@ instead of kodi/xbmc + [Memphiz] + * [ios/atv2] - adapt the readme for support with Xcode 6.1 against iOS SDK 8.1 on Yosemite - [Chris "Koying" Browet] - * FIX: [droid] Media keys handling fixups + [Memphiz] + * [osx] - adapt readme for compatibility with Xcode 6.1 with OSX SDK 10.10 under Yosemite - [Martijn Kaijser] - * bump to 16.0 beta1 + [Memphiz] + * [ios/atv2] - adapt readme - we support Xcode 6.0.1 against iOS 8 SDK - [wsnipex] - * [python] demote pythons stdout to loglevel debug + [Memphiz] + * ios] - fix libmpeg2 build error by making it even more PIC (also the real fix for the xcode5 build issue earlier) - [ronie] - * remove skin backward compatibility + [Linus Yang] + * [ios] - libRTV fix build for Xcode 6 + [Linus Yang] + * [ios] - fix pil build with Xcode 6 - [ronie] - * [re-touched] update + [Linus Yang] + * [ios] - fix libssh build with Xcode 6 - [Søren Juul] - * Fix regressions introduced by refactoring in commit 9e9396b073ba973b2847896a11244a9f37ecbaff + [Memphiz] + * [ios] - support Xcode 6.x and iOS 8 SDK - [DaveTBlake] - * JSON when getting album or song ensure underlying query uses song_artist or album_artist tables to fully populate artist credits. Hence artist names and id arrays will be consistent. As a bonus now gets MBID (as a vector to match names and ids) + [Memphiz] + * [ios] - bump gas-preprocessor - [Anton Fedchin] - * [WinRenderer] Fixed HQ scalers again. - [Martijn Kaijser] - * [win32] it's time we also name the stacktrace and crashdump Kodi + [Matthias Kortstiege] + * [scrapers] log what actually failed to load - [Ryan Rector] - * Lower "Thread start" logging level + [anaconda] + * Fix LOGDBUS component logging. - [Erwin Jansen] - * Fix unit tests on linux/os-x + [Memphiz] + * [ios] - fix devcert signing (pvr addons were missing and couldn't be loaded) - [Chris "Koying" Browet] - * CHG: [droid] proper handling of MEDIA keys + [Rainer Hochecker] + * vaapi: glIsSync, glIsTexture seem to unreliable on Intel - [Chris "Koying" Browet] - * FIX: don't show size for non-file items + [popcornmix] + * [PiSink] Dual audio support - [arnova] - * changed: Increase maximum amount of cached directories to 50 + [popcornmix] + * [omxplayer] Restore flush/accurate seek flags to fix issue with edl skipping + [Rainer Hochecker] + * vaapi: workaround intel bugs - [Chris "Koying" Browet] - * FIX: [droid;amc] be sure that we have a surface + [Memphiz] + * [ios] - add support for iPad Air 2 and iPad mini 3 - [Chris "koying" Browet] - * FIX: [droid] do not reuse destroyed native window + [Memphiz] + * [ios/vtb] - remove the video render scale down / clamp for all retina devices which have enought power to render unscaled - [SkyCrawl] - * Adding keyboard layout: Czech QWERTZ + [Memphiz] + * [ios] - add launch images for ip6 and ip6+ for enabling the new resolutions + [Memphiz] + * [ios] - support iphone6plus screensize which uses screenScale 3 and add support for iPhone6 screen aswell - [un1versal] - * [confluence]fix alignment of subtitles menu in livetv OSD when VideoPlayer.HasMenu is not visible - [un1versal] - * [confluence]fix 3D menu alignment when VideoPlayer.HasMenu is not visible + [xhaggi] + * [pvr] fix continue playback of last watched channel on startup if group was deleted or channel was moved - [Matthias Kortstiege] - * [make] silent ar compiler warnings + [wsnipex] + * [buildsteps] fix linux32 gtests invocation as well - [Kolja Lampe] - * Remove .idea folder which get's created from JetBrains CLion + [wsnipex] + * [buildsteps] fix OSX gtests invocation - [Chris "Koying" Browet] - * FIX: [droid;amcs] do not stop video when loosing main surface + [wsnipex] + * [buildsteps] fix linux gtest invocation - [Anton Fedchin] - * [d3d11] Fixed issue with stereoscopic 3D mode and DXVA scaling for some drivers which works incorrectly with DXVA processor and deferred context. + [Memphiz] + * [osx] - don't release strings we didn't alloc - fixes crash on shutdown (introduced in rebrand) - [Anton Fedchin] - * [WinRenderer] Fix HQ scallers, to avoid unnecessary scaling at Stage1 (with DXVA processor and color shader). This also fixes HQ scallers for TAB/SBS modes. + [Memphiz] + * [git] - add generated FEH-ARM.py and FEH.py to gitignore - [Matthias Kortstiege] - * [globals] remove macro XBMC_GLOBAL + [phil65] + * [rebrand] - fixed some labels from strings.po files - [Matthias Kortstiege] - * [guilib] fix togglebutton not properly resizing when using the altlabel + [xhaggi] + * [pvr] removes unnecessary persist of current channel in GetLastPlayedChannel() + [xhaggi] + * [pvr] fix: update to last watched does not reflect to correct channel instance - [Martijn Kaijser] - * [droid] update readme to recommend Ubuntu 14.04 + [xhaggi] + * [pvr] fix call to base class GetContextButtons() to re-add favorite entry - [h.udo] - * [gitignore] More android artifacts + [Philipp Te] + * [CONFLUENCE] fixed lyrics xml filename in includes.xml - [Kai Sommerfeld] - * [PVR] Fix: Coverity: CGUIInfoManager: divide_by_zero (actually a false positive) + [Philipp Te] + * [CONFLUENCE] removed some unneccessary visibility conditions - [Kai Sommerfeld] - * [PVR] Fix: Coverity: CGUIDialogPVRRadioRDSInfo: uninit member + [Philipp Te] + * [CONFLUENCE] fixed lyrics xml filename in MusicVis - [Kai Sommerfeld] - * [PVR] Fix: Coverity: CPVRManagerStartJob: unused member + [Lars Op den Kamp] + * [pvr] bump add-ons - [Kai Sommerfeld] - * [PVR] Fix: Coverity: PVRGUIInfo: uninit member + [montellese] + * [win32] rename XBMC_PROFILE_USERDATA to APP_PROFILE_USERDATA + [montellese] + * [win32] rename XBMC_HOME to APP_HOME - [Chris "koying" Browet] - * CHG: [droid] decouple kodi and system audio volumes + [Rainer Hochecker] + * dxva: fix memory leak caused by additional ref on video surfaces - [Kai Sommerfeld] - * [xcode] add xbmc/addons/include directory to project (exists for ages, but was not in project) + [uNiversaI] + * [fix] keyboard layout default setting - [Kai Sommerfeld] - * [guiinfo] Fixed LISTITEM_ISRECORDING for epg event items in case there is an aborted recording for the selected epg event. + [Karlson2k] + * [vfs] PVRFile::Read(): do not return negative values other than "-1" + [Karlson2k] + * DVDInputStreamTV/DVDInputStreamFile: Don't set EOF in case of error to give player a chance to retry read. - [Chris "Koying" Browet] - * CHG: [droid] Use best possible icons for app + refactor + [Rainer Hochecker] + * dxva: fix selection of render target format + + [xhaggi] + * [builtin] fix activatewindow if directory path differs + + [AlwinEsch] + * [pvr] fix unnecessary creation of new CPVRChannel instances - [Chris "Koying" Browet] - * CHG: [droid] stop video when loosing focus - [Chris "koying" Browet] - * FIX: [droid] protect clear surface vs. destruction - [Chris "Koying" Browet] - * FIX: [droid] also check CPU2 for compatibility - [dummy] * dummy + -- wsnipex Sun, 04 Nov 2012 09:41:54 +0100 diff -Nru kodi-16.1~git20160425.1001-final/debian/changelog.tmp.old kodi-15.2~git20151019.1039-final/debian/changelog.tmp.old --- kodi-16.1~git20160425.1001-final/debian/changelog.tmp.old 2016-04-25 08:01:49.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/debian/changelog.tmp.old 2015-10-19 08:39:25.000000000 +0000 @@ -1,1719 +1,25691 @@ kodi (2:13.0~git20121115.1002-beta1-0dist) dist; urgency=high - [Martijn Kaijser] - * bump to 16.1 release + [Matthias Kortstiege] + * [input] fix ios build after 7aeff92 - [DaveTBlake] - * Fix song reported on playback of songs from cuesheet + [Matthias Kortstiege] + * [input] xcode sync for InputCodingTableKorean - [HerbFargus] - * Add xboxdrv name for xbox keymap + [Matthias Kortstiege] + * [input] add InputCodingTableKorean.cpp to Makefile - [anaconda] - * videoinfotag: fix typo introduced in e6e2d0ace5cfe6191b8f7727ced1747854254ce4 + [universal] + * [cleanup][cdio] cosmetics - [Chris "Koying" Browet] - * FIX: [droid] cap refresh rates when probing, too + [universal] + * [cleanup][DetectDVDType] cosmetics - [txtranslation] - * [lang] updated language files from Transifex + [uNiversaI] + * [cleanup][DetectDVDType] remove xbox udfx related - [Martijn Kaijser] - * bump to 16.1 rc3 + [uNiversaI] + * [cleanup][libcdio] remove xbox udfx related - [Anton Fedchin] - * [RenderSystemDX] Fix possible segfault after ba2ff03 + [Matthias Kortstiege] + * [input] fix onnext in dialog numeric after bab2486 + + [Matthias Kortstiege] + * [cleanup] silent reorder compiler warning in InputCodingTableBaiduPY.h + + [Matthias Kortstiege] + * [cleanup] remove DOS line endings in InputCodingTableBaiduPY.h + + [xconverge] + * Minor cleanup for readability. + + [ace20022] + * [coverity] CID#1312062 Unintentional integer overflow. + + [ace20022] + * [coverity] CID#1316334 class member foo is not initialized in this constructor nor in any functions that it calls. + + [ace20022] + * [coverity] CID#1288653 case VIDEOPLAYER_TITLE was not reachable for pvr channels. + + [ace20022] + * [coverity] CID#1272227 Remove logically dead code. + + [ace20022] + * [coverity] CID#1213839 Remove logically dead code. [Rainer Hochecker] - * VDPAU: fix flushing mixer + * VideoPlayer: trust SAR of mkv container - [Martijn Kaijser] - * update re-Touched skin + [Matthias Kortstiege] + * [guilib] add justify alignment for grouplist controls [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + * bump to 16.0alpha4 [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + * [python] removed long deprecated xbmcgui.lock() and xbmcgui.unlock() - [Thomas Amland] - * never cache addons directories + [Matthias Kortstiege] + * [videothumbloader] skip thumb extraction for bluray items - [Chris "Koying" Browet] - * FIX: [droid] disable libcec + [Kai Sommerfeld] + * [EPG][PVR] Guide Window: On selection of an EPG gap, switch to associated channel. - [Achim Turan] - * [cmake][addons] Use an absolute path for ADDON_SRC_PREFIX + [Kai Sommerfeld] + * [EPG] EPG Grid Container: Fill grid with trailing gap epg tags. - [txtranslation] - * [lang] updated language files from Transifex + [Kai Sommerfeld] + * [EPG][PVR] Guide Window: Show channels without EPG data. - [S. Davilla] - * [darwin/WebServer] - fixed crash under json. double thread stack size for libmicrohttpd for osx/ios + [NedScott] + * Improve virtual keyboard layout for English + + [Matthias Kortstiege] + * [guilib] only consider visible controls within grouplists for Container.Position + + [NedScott] + * Improve description of sets strings + + [NedScott] + * Addiitonal long-press modifications + + [Kib] + * [Android-x86] move symbols to the workspace + + [Kib] + * [Android] move symbols to the workspace + + [Matthias Kortstiege] + * [cleanup] get rid of unused function warnings from eventlevel + + [Matthias Kortstiege] + * [cleanup] cast user ratings to int in sortutils + + [da-anda] + * [guilib] parse tag for constants + + [Kai Sommerfeld] + * [PVR] Search window: Fixed OnPrepareFileItems only to search if requested to do so and not just a simple window refresh is ongoing. + + [Kai Sommerfeld] + * [PVR] Timers: Relax handling of read-only timers a bit. + + [Kai Sommerfeld] + * [PVR] Search window: Fix "Find similar program" for timers to prefer EPG tag title over timer title. + + [Matthias Kortstiege] + * [cleanup] fix signed/unsigned compiler warning + + [Matthias Kortstiege] + * [cleanup] remove unused variable isExecutable + + [Matthias Kortstiege] + * [cleanup] silent override warnings on newer gcc version + + [Kai Sommerfeld] + * [PVR] Don't ask user for confirmtion when creating a timer. "Do you really want to record this?" => Nonsense + + [Kai Sommerfeld] + * [PVR] Cleanup: Rename CGUIWindowPVRBase::StartRecordFile() => CGUIWindowPVRBase::AddTimer() to reflect what it actually does. [fritsch] - * AndroidStorageProvide: Ignore /mnt/runtime + * AESinkPULSE: Replace Delay method with self calculated method - [Thomas Amland] - * AndroidStorageProvider: avoid calling Exists from PumpDriveChangeEvents + [Rainer Hochecker] + * dvdplayer: fix non DVB subs after 5c0d694fa769f311bc5e14dec04c260267a56b79 - [Anton Fedchin] - * [WinSystemWin32DX] Avoid unneeded resize buffers when minimized in FSE mode. + [Matthias Kortstiege] + * [guilib] simplify dirty region marking for fadelabels (fixes #16277) - [Anton Fedchin] - * [RenderSystemDX] Force 23.976fps mode before switch to stereoscopic 3D mode. + [Kai Sommerfeld] + * Revert "[pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running" - [Anton Fedchin] - * [RenderSystemDX] fixup: re-create swap chain in mono if switching to stereoscopic 3D mode fails. + [Martijn Kaijser] + * [win32] add screensaver add-ons to installer - [Anton Fedchin] - * [RenderSystemDX] Avoid resize buffers twice when transition from windows to FSE mode. + [Thomas Amland] + * run repository update jobs in low pausable mode [Anton Fedchin] - * [RenderSystemDX] use two buffers in FSEX. + * [dxva] Re-factor: get rid of unneeded reference to decoder texture. Properly destroying resources during creating decoders views if something goes wrong. [Anton Fedchin] - * [RenderSystemDX] Added workaround to create device on a default adapter if it wasn't detected previously. + * [WinVideoFilter] Lower feature level for test shader. This fixes segfault in video drivers which support only FL9.1/9.2. [Anton Fedchin] - * [WinRenderer] Re-work color shader. try to fix wrong colors on some hardware. + * [dxva] Fix DXVA renderer color range. - [Anton Fedchin] - * [WinRenderer] speed up a bit configuring renderer. + [Floris Bos] + * LinuxInputDevice: add support for multi-touch devices - [Bernd Kuhls] - * [Jarvis] partly backport of PR 9231 to fix segfault + [Pär Björklund] + * Fix c/p error on dialogs and renamed singleFiles variable in videolibrary as it was somewhat confusingly named compared to the dialog options [Kai Sommerfeld] - * [EPG] Guide Window: 20% performance gain on open + * [network] CNetWork::IsAvailable: Remove parameter 'wait', because there is no implementation behind. - [txtranslation] - * [lang] updated language files from Transifex + [h.udo] + * [gitignore] Add library.kodi.audioengine makefile [ace20022] - * [android] Add missing libgif.so to the package. + * [fix][gui] Fix multi images in grouplists/layouts. This fixes a regression introduced with cb2dd229ce5b6f479f9a6ebd51998831554d2ae2 . - [Alwin Esch] - * [adsp] fix kodi frezze if no add-on present + [Peter Bauer] + * Subtract readahead when seeking (SEEK_CUR) outside of buffer area + + [Peter Bauer] + * Use ID3v2Tag loader results + + [LS80] + * Fixed missing Python traceback caused by an invalid format string. Fixes #16274. + + [Achim Turan] + * [library.kodi.audioengine] Fixing clumsy error mesage + + [Thomas Amland] + * [addons] fix uninstalling of non-repository addons + + [Achim Turan] + * [library.kodi.audioengine] [FIX CID 1324647] Fixing Null-checking "cb" + + [Sam Stenvall] + * [pvr] fix invalid memory access when a PVR window is accessed before any clients have finished loading. Also introduce an event which gets triggered when an update is actually needed. + + [xhaggi] + * [cleanup] get rid of unused window allow overlay code + + [Thomas Amland] + * [addons] fix zip install after 61121d731 + + [Thomas Amland] + * [addons] fix bad error handling (returns int) + + [Thomas Amland] + * log time of previous repository update to make it easier to detect database problems in the future + + [Thomas Amland] + * [addons] fix repo last checked time not updating if not previously added + + [S. Davilla] + * bump gas to https://git.libav.org/?p=gas-preprocessor.git;a=commit;h=5ab764742626598cb462bc86e2d04ac8001e05d7 + + [S. Davilla] + * docs, document what we are doing in depends + + [S. Davilla] + * fixed, c++11 compiler warning + + [S. Davilla] + * fixed, all our thread should be named + + [S. Davilla] + * fixed, massive memory leak in DirectoryNode and some cosmetic cleanup. Basically CDirectoryNode::ParseURL creates a bunch of nodes then orphans them when browsing by file. Also StringUtils::Split can return a leading empty string for '/Users/Shared/Movies', and we add another one to path, which creates two root nodes. use StringUtils::Tokenize which does what we want. Side note: StringUtils::Split needs a refactor, iMaxStrings is size_t and the default value is zero and the very 1st thing it does is pre-decrement it which wraps it around to a very big number, sure, sure :) + + [S. Davilla] + * fixed, memory leaks using VDA (both of them) + + [S. Davilla] + * fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5 + + [S. Davilla] + * fixed, memory leaks in SMBFile, three tiny ones left to find. + + [S. Davilla] + * fixed, clearerr return void + + [sportica] + * Add Korean keyboard + + [ronie] + * [Confluence] hardcode icon path for extended weather info + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetTop100AlbumSongs + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetRecentlyPlayedAlbumSongs [Martijn Kaijser] - * bump to 16.1rc2 + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Return ENOENT for empty path according to specs + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& [Kai Sommerfeld] - * [EPG] Fix lockup when entering epg grid (endless loop) + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers - [Anton Fedchin] - * [dx11] Fixed possible crash when living hardware stereo mode. + [Thomas Amland] + * [addons] add missing implementations of IsInUse - [Anton Fedchin] - * [dxva] fixed possible issue with dxva rendering (wrong hue/gamma) + [Thomas Amland] + * [addons] add missing implementations of SetDefault - [Anton Fedchin] - * [win32] memcpy_sse2: fixed crash in corner case. + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis [Chris "Koying" Browet] - * FIX: [longpress] do not eat keypress after a longpress + * FIX: proper casting of file time TZ adjustment - [Tolriq] - * EventServer security fix. + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag - [arnova] - * changed: Ignore chapters for large step if there's only one + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag - [arnova] - * fixed: Screensaver would lockup Kodi when stopping on slow systems + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [ronie] + * [Confluence] cleanup + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Mike Frysinger] + * TexturePacker: use $PKG_CONFIG + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard [Anton Fedchin] - * [VideoPlayer] WinRenderer: fix render capure when dxva render method is used. + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi dtor avahi thread termination. + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + * [cosmetics] - fixed typos [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + * [ios] - fix mapping of 3 finger taps - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not - [h.udo] - * [LoadVideoSettings] Don't leak credentials + [montellese] + * GroupUtils: add additional overloads for more control over the result - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [montellese] + * GroupUtils: remove unused GroupAndSort() - [txtranslation] - * [lang] updated language files from Transifex + [BigNoid] + * [guilib] reduce duplicate code - [Rainer Hochecker] - * dxva2: fix segfault + [BigNoid] + * [guilib] Add container.listitemid.infolabel - [Rainer Hochecker] - * vaapi: fix segfault + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims - [Martijn Kaijser] - * Bump to 16.1rc1 + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation [DaveTBlake] - * Fix song reported on playback of songs from cuesheet + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Kolja Lampe] + * [video] Don't save scraper settings if we exit out and not select the "ok" button [anaconda] - * videoinfotag: fix typo introduced in e6e2d0ace5cfe6191b8f7727ced1747854254ce4 + * [video] Fix content type for special://videoplaylists [Chris "Koying" Browet] - * FIX: [droid] cap refresh rates when probing, too + * FIX: [droid;storage] check readability last - [txtranslation] - * [lang] updated language files from Transifex + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do - [Martijn Kaijser] - * bump to 16.1 rc3 + [Ryan Gribble] + * Update gitignore for bootstrapped addons definition files - [Anton Fedchin] - * [RenderSystemDX] Fix possible segfault after ba2ff03 + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values - [Rainer Hochecker] - * VDPAU: fix flushing mixer + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). - [Martijn Kaijser] - * update re-Touched skin + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [da-anda] + * [guilib] parse tag for constants + + [Matthias Kortstiege] + * [guilib] simplify dirty region marking for fadelabels (fixes #16277) + + [Kai Sommerfeld] + * Revert "[pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running" + + [Martijn Kaijser] + * [win32] add screensaver add-ons to installer + + [Thomas Amland] + * run repository update jobs in low pausable mode + + [Anton Fedchin] + * [dxva] Re-factor: get rid of unneeded reference to decoder texture. Properly destroying resources during creating decoders views if something goes wrong. + + [Anton Fedchin] + * [WinVideoFilter] Lower feature level for test shader. This fixes segfault in video drivers which support only FL9.1/9.2. + + [Anton Fedchin] + * [dxva] Fix DXVA renderer color range. + + [ace20022] + * [fix][gui] Fix multi images in grouplists/layouts. This fixes a regression introduced with cb2dd229ce5b6f479f9a6ebd51998831554d2ae2 . + + [LS80] + * Fixed missing Python traceback caused by an invalid format string. Fixes #16274. + + [Achim Turan] + * [library.kodi.audioengine] Fixing clumsy error mesage + + [Thomas Amland] + * [addons] fix uninstalling of non-repository addons + + [Achim Turan] + * [library.kodi.audioengine] [FIX CID 1324647] Fixing Null-checking "cb" + + [Sam Stenvall] + * [pvr] fix invalid memory access when a PVR window is accessed before any clients have finished loading. Also introduce an event which gets triggered when an update is actually needed. + + [xhaggi] + * [cleanup] get rid of unused window allow overlay code + + [Thomas Amland] + * [addons] fix zip install after 61121d731 + + [Thomas Amland] + * [addons] fix bad error handling (returns int) + + [Thomas Amland] + * log time of previous repository update to make it easier to detect database problems in the future + + [Thomas Amland] + * [addons] fix repo last checked time not updating if not previously added + + [S. Davilla] + * bump gas to https://git.libav.org/?p=gas-preprocessor.git;a=commit;h=5ab764742626598cb462bc86e2d04ac8001e05d7 + + [S. Davilla] + * docs, document what we are doing in depends + + [S. Davilla] + * fixed, c++11 compiler warning + + [S. Davilla] + * fixed, all our thread should be named + + [S. Davilla] + * fixed, massive memory leak in DirectoryNode and some cosmetic cleanup. Basically CDirectoryNode::ParseURL creates a bunch of nodes then orphans them when browsing by file. Also StringUtils::Split can return a leading empty string for '/Users/Shared/Movies', and we add another one to path, which creates two root nodes. use StringUtils::Tokenize which does what we want. Side note: StringUtils::Split needs a refactor, iMaxStrings is size_t and the default value is zero and the very 1st thing it does is pre-decrement it which wraps it around to a very big number, sure, sure :) + + [S. Davilla] + * fixed, memory leaks using VDA (both of them) + + [S. Davilla] + * fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5 + + [S. Davilla] + * fixed, memory leaks in SMBFile, three tiny ones left to find. + + [S. Davilla] + * fixed, clearerr return void + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetTop100AlbumSongs + + [MilhouseVH] + * [musicdb] Fix LIMIT IN which is not MySQL compatible - GetRecentlyPlayedAlbumSongs + + [Martijn Kaijser] + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& + + [Kai Sommerfeld] + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers + + [Thomas Amland] + * [addons] add missing implementations of IsInUse + + [Thomas Amland] + * [addons] add missing implementations of SetDefault + + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis + + [Chris "Koying" Browet] + * FIX: proper casting of file time TZ adjustment + + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Mike Frysinger] + * TexturePacker: use $PKG_CONFIG + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard + + [Anton Fedchin] + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. + + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 + + [Memphiz] + * [cosmetics] - fixed typos + + [Memphiz] + * [ios] - fix mapping of 3 finger taps + + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not + + [montellese] + * GroupUtils: add additional overloads for more control over the result + + [montellese] + * GroupUtils: remove unused GroupAndSort() + + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims + + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation + + [DaveTBlake] + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Kolja Lampe] + * [video] Don't save scraper settings if we exit out and not select the "ok" button + + [anaconda] + * [video] Fix content type for special://videoplaylists + + [Chris "Koying" Browet] + * FIX: [droid;storage] check readability last + + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do + + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values + + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). + + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme + + [Martijn Kaijser] + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [fritsch] + * AESinkPULSE: Workaround Delay issues in PA Server + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + + [Martijn Kaijser] + * fix c/p error in 3174a4f90c07d94c2075875af76c0414f5879b1f + + [fritsch] + * WinSystemX11: D3DPRESENTFLAG_WIDESCREEN is not used anywhere + + [fritsch] + * XRandR: Identify interlaced modes + + [anaconda] + * [jsonrpc] Add "plot" property to VL.GetMovieSet/GetMovieSetDetails. + + [anaconda] + * [videodb][infomanager] Add support for overview (plot) in movie sets. + + [fritsch] + * Fix position outside of video for text based subs + + [Pär Björklund] + * Add missing include of + + [Memphiz] + * [touch] - fixed inertial scrolling - regression introduced in 987cacfd318cf12e27bbdf791952a3b090274a9a + + [Pär Björklund] + * Remove .c_str() when calling exec and query as they take a const std::string& + + [Kai Sommerfeld] + * [PVR][EPG] PVR API 4.0.0 Followup: Fixed signed/unsigned mismatch leftovers + + [Thomas Amland] + * [addons] add missing implementations of IsInUse + + [Thomas Amland] + * [addons] add missing implementations of SetDefault + + [Thomas Amland] + * [addons] allow skins etc. to be activated via info dialog + + [ronie] + * [Re-Touched] latest updates for Jarvis + + [Chris "Koying" Browet] + * FIX: proper casting of file time TZ adjustment + + [metaron] + * [PVR] implement Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] API add Timer Type EPG Series Restrict Flag + + [metaron] + * [PVR] [EPG] Database version 11 (add iFlags) + + [metaron] + * [PVR] API Add EPG Flags + + [metaron] + * [PVR] bump API version to 4.1.0 + + [Pär Björklund] + * Clean up dialognumeric a bit and get rid of the void* + + [fritsch] + * AdjustRefreshrate: Don't switch to bogus AVR introduced modes + + [Garrett Brown] + * Fix c/p error in CVariant + + [Matthias Kortstiege] + * [xcode] sync project file + + [Pär Björklund] + * Reworked AutPtrHandle to make it a generic scopeguard + + [Anton Fedchin] + * [cores] RenderManager::GetStats - now returns queue and discard separately. DVDPlayerVideo - ignore discard stats for dropping frame on rewind. + + [Anton Fedchin] + * [cores] WinRenderer: fixed usage of processor size even if no hw decoder is used + + [JoethePartylion] + * Fix empty VideoPlayer.Plot when playing recorded TV + + [fritsch] + * DVDCodecUtils: Change to SWS_BILINEAR from SWS_FAST_BILINEAR (fix quality and segfault) + + [ronie] + * [Confluence] add close button to numeric dialog - fixes #16244 + + [Memphiz] + * [cosmetics] - fixed typos + + [Memphiz] + * [ios] - fix mapping of 3 finger taps + + [montellese] + * movie sets: add new setting to control whether to show single movie sets as sets or not + + [montellese] + * GroupUtils: add additional overloads for more control over the result + + [montellese] + * GroupUtils: remove unused GroupAndSort() + + [fritsch] + * AdjustRefreshrate: Switch to higher resolution depending on source dims + + [Achim Turan] + * [library.kodi.audioengine] Adapt project files + + [Achim Turan] + * [library.kodi.audioengine] ActiveAE extension to allow binary addon calls + + [Achim Turan] + * [library.kodi.audioengine] Binary addon callback implementations + + [Achim Turan] + * [library.kodi.audioengine] Basic binary addon AudioEngine implementation + + [DaveTBlake] + * Fix repeated setting of playcount and compilation values (added in #8012) + + [Chris "Koying" Browet] + * FIX: [droid;storage] check readability last + + [Pär Björklund] + * Revert this message sorting as it broke some stuff and was a dumb thing to do + + [montellese] + * jsonrpc: fix Addons.SetAddonEnabled() for invalid addonid values + + [Kai Sommerfeld] + * [Confluence] Removed media/flagging/audio/0.png (no longer used). + + [Kai Sommerfeld] + * [guiinfo] (VIDEOPLAYER + + [Pär Björklund] + * Don't parse the action in EventServer, Builtins want it unmodified + + [ace20022] + * [gif] Handle the disposal method DISPOSE_BACKGROUND like the majority of browsers and image viewers. The former implementation was written in compliance with the specification. + + [ace20022] + * [gif][cosmetics] Fix typos. + + [ace20022] + * [gif] Fix possible access violation while reading from the color palette. + + [ace20022] + * [gif] Skip frames with no color map (neither global nor local). + + [Thomas Amland] + * [addons] change the update functionality to show a list of available versions to allow updating, downgrading and changing which repository to install from + + [Thomas Amland] + * [addons] allow blacklisting without version (ie all version) + + [Thomas Amland] + * [addons] fix realoading of downgraded addons + + [Thomas Amland] + * [addons] add repository support for multiple versions of addons + + [Thomas Amland] + * [addons] remove GetRepoForAddon and explicitly get the repo with the highest version + + [Thomas Amland] + * [addons] refactror. move repository selection as high up in the api as possible + + [Thomas Amland] + * [addons] add database support for multiple versions of addons + + [Memphiz] + * [ios] - allow full codesign in after build phase for all identities if set + + [Memphiz] + * [iOS] - disable Bitcode - it needs a deployment target of at least ios6 + + [Memphiz] + * [osx/cmake-native] - give a hint about our used native SDK - cmake might pick a wrong/non existing sdk (f.e. when running on 10.10 and having xcode7 with SDK 10.11 - it picks 10.10 which is non existent) for some reason (and bails out because it doesn't find curl for example) - simply use the latest sdk given by xcrun for native tools + + [amet] + * [depends] - add zlib to libssh depends + + [amet] + * [osx/ios/depends] - allow OSX SDK 10.11 and iOS 9 SDK + + [S. Davilla] + * [ios/osx] - move those explicit dylib references from the xcode project to the xcconfig files (this leaves out the extension and fixes linking so that it now also finds tbd files) + + [S. Davilla] + * [depends/libssh] - fixed typo (-fnostack-protector vs. -fno-stack-protector) - newest clang errors out on invalid params. Also nuke those libssh_threads dylibs too, not needed due to static linking + + [S. Davilla] + * [osx/depends/samba] - changed, proper dylib version is name.number.dylib, not name.dylib.number. Just mv the number and do install_name_tool fixups + + [S. Davilla] + * [osx/cmake-native] - patch cmake to also find tbd libraries on osx (this is the new dylib format in SDKs - some sort of text stubs) + + [Memphiz] + * [osx] - add xcode7 support to osx readme + + [Memphiz] + * [ios] - add xcode7 support to ios readme + + [Martijn Kaijser] + * bump GUI ABI version to Kodi version 15 as minimum + + [Alwin Esch] + * [pvr] remove not needed StringUtils::ToLower on RDS text line + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_EPG_UID instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Changed type of PVR_TIMER.iEpgUid to unsigned int. Introduce constant PVR_TIMER_NO_EPG_UID. + + [Kai Sommerfeld] + * [PVR] Get rid of magic numbers; use constant PVR_TIMER_NO_CLIENT_INDEX instead. Solve related signed/unsigned problems. + + [Kai Sommerfeld] + * [PVR] Addon API: Introduce constant PVR_TIMER_NO_CLIENT_INDEX. + + [Kai Sommerfeld] + * [PVR] Replace senseless functionality to keep timers scheduled by a repeating timer when deleting the repeating timer by the option to delete the repeating timer that scheduled a timer about to delete, if exists. + + [Kai Sommerfeld] + * [PVR] Addon API: Remove parameter bDeleteScheduled from function DeleteTimer. + + [Kai Sommerfeld] + * [PVR] Bump PVR addon API to 4.0.0 + + [Matthias Kortstiege] + * [strings] remove obsolete strings after #8011 + + [montellese] + * upnp: add support for user ratings + + [montellese] + * platinum: add patch for f606fe4ca1f15a55411e45f528bcdb8f184d5a0c + + [montellese] + * platinum: add xbmc:userrating for user ratings + + [montellese] + * upnp: add support for countries + + [montellese] + * platinum: add patch for d75e736 + + [montellese] + * platinum: add xbmc:country for countries + + [Stefan Saraev] + * sqlite3: dont apply map_populate patch on android + + [Memphiz] + * [ios] - add missing gesture swipe handlers for 2 and 3 finger swipes (fixes non mappable multi finger swipe gestures) + + [ace20022] + * [fix][subs] Fix MicroDVD Subtitles after da80dbea8505ce655c728c012c05874db40bea09. The first 1024 bytes of the file were lost. + + [Alwin Esch] + * [adsp] fix wrong TMSG_SETAUDIODSPSTATE id + + [Alwin Esch] + * [adsp] add use of ACTIVE_AE_DSP_SYNC_ACTIVATE on ...PostMsg(TMSG_SETAUDIODSPSTATE... + + [montellese] + * videodb: allow calling SetDetailsForSeason() for "All seasons" + + [Arne Morten Kvarving] + * settings: default to visualization.spectrum, not visualization.glspectrum + + [Thomas Amland] + * CGUIDialogSelect: cleanup Add/SetItems. pass const reference + + [Thomas Amland] + * remove zip operation log spam + + [Pär Björklund] + * Some cleanup, makes it easier to change format string + + [Alwin Esch] + * Update .gitignore to ignore new Makefile's + + [ace20022] + * [fix][udf] Free allocated memory in the destructor. + + [fritsch] + * ffmpeg: Bump to 2.8.0-Jarvis-alpha3-HEVC + + [Alwin Esch] + * [adsp] fix wrong used settings parameter + + [Alwin Esch] + * [adsp] remove wrong description line + + [Alwin Esch] + * [pvr] improve for loops in CPVRRadioRDSInfoTag + + [Alwin Esch] + * [pvr] remove '- ' on radiotext info lists (News...), does not match text style + + [Alwin Esch] + * [confluence] add missing 'Radio text info list' control id + + [Alwin Esch] + * [pvr] improve RDS player and remove compiler warning + + [Alwin Esch] + * [pvr] fix wrong value in RDS_ALBUM_TRACKNUMBER return + + [Alwin Esch] + * [pvr] Sort included files alphabetical + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSPProcess, CActiveAEDSPAddonand and CActiveAEDSPDatabase + + [Alwin Esch] + * [adsp] fix wrong error dialog text and usage of them + + [Alwin Esch] + * [adsp] improve for loops in CActiveAEDSP + + [Alwin Esch] + * [adsp] fix disabled add-on folder name check + + [Alwin Esch] + * [adsp] remove wrong TMSG_SETAUDIODSPSTATE call + + [Rainer Hochecker] + * builtins: adapt xcode project + + [Pär Björklund] + * Fixed VS project files and a new nitpicks + + [Arne Morten Kvarving] + * builtins: clean up includes and namespaces + + [Arne Morten Kvarving] + * changed: get rid of old builtin command map + + [Arne Morten Kvarving] + * move android related builtins to separate file + + [Arne Morten Kvarving] + * move application related builtins to separate file + + [Arne Morten Kvarving] + * move optical related builtins to separate file + + [Arne Morten Kvarving] + * move player related builtins to separate file + + [Arne Morten Kvarving] + * move picture related builtins to separate file + + [Arne Morten Kvarving] + * move pvr related builtins to separate file + + [Arne Morten Kvarving] + * move gui container related builtins to separate file + + [Arne Morten Kvarving] + * move weather related builtins to separate file + + [Arne Morten Kvarving] + * move CEC builtins to separate file + + [Arne Morten Kvarving] + * move gui control builtins to separate file + + [Arne Morten Kvarving] + * move gui builtins to separate file + + [Arne Morten Kvarving] + * move profile related builtins to separate file + + [Arne Morten Kvarving] + * move system builtins to separate file + + [Arne Morten Kvarving] + * move skin builtins to separate file + + [Arne Morten Kvarving] + * move addon builtins to separate file + + [Arne Morten Kvarving] + * move library builtins to separate file + + [Arne Morten Kvarving] + * add command provider hooks in CBuiltins + + [Arne Morten Kvarving] + * changed: make CBuiltins a singleton + + [Arne Morten Kvarving] + * relocate builtins to a subfolder + + [anaconda] + * [application] Hide credentials for folder locations in debug logs. + + [montellese] + * CGUIWindowMusicNav: get rid of the empty database control + + [Pär Björklund] + * Fix formatting I messed up + + [Stanislav Vlasic] + * AML: EGLNativeTypeAmlAndroid: Implement 480cvbs/i/p and 576cvbs/i/p modes + + [fritsch] + * AESinkPULSE: Emulate periodSize as ALSA to stop fragmentation + + [Thomas Amland] + * addon installer: remove referer code + + [ace20022] + * [lang/settings] Separate StreamLanguagesFiller into AudioStreamLanguagesFiller, SubtitleStreamLanguagesFiller and SubtitleDownloadlanguagesFiller because of special entries. + + [montellese] + * CFileItem: copy album artwork in SetFromAlbum() + + [montellese] + * CMusicInfoTag: copy some missing information in SetArtist/SetAlbum/SetSong() (fixes #16232) + + [ace20022] + * [lang] Remove Close Caption (cc) from the ISO_639_1 and ISO_3166_1 lists. + + [montellese] + * CMusicInfoTag: use setters instead of direct member access + + [ronie] + * [confluence] unify music library and files view + + [Arne Morten Kvarving] + * fixed: don't execute extra fluff if listing failed + + [Arne Morten Kvarving] + * add file node to default music library layout + + [Arne Morten Kvarving] + * bye bye GUIWindowMusicSongs + + [Arne Morten Kvarving] + * changed: integrate custom ::Update code from songs in to Nav + + [Arne Morten Kvarving] + * changed: fold rename/delete for files into nav window + + [Arne Morten Kvarving] + * changed: move handling of CDDB context button to base window + + [Arne Morten Kvarving] + * changed: move handling of rip cd track context button to base window + + [Arne Morten Kvarving] + * changed: add music scanning context button handling to base/nav window + + [Arne Morten Kvarving] + * changed: add handling of sources context menu to nav/base window + + [Arne Morten Kvarving] + * changed: move OnPrepareFileItems to music base class + + [Arne Morten Kvarving] + * changed: move getdirectory code from music songs to music base + + [Arne Morten Kvarving] + * changed: move handling of ACTION_SCAN_ITEM to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNREC to music base class + + [Arne Morten Kvarving] + * changed: move handling of CONTROL_BTNSCAN to base window + + [Arne Morten Kvarving] + * changed: move CONTROL_BTNPLAYLISTS into music base window + + [Arne Morten Kvarving] + * changed: move handling of GUI_MSG_DIRECTORY_SCANNED to base class + + [Arne Morten Kvarving] + * changed: fold music song window ::PlayItem into base (and nav) class + + [Arne Morten Kvarving] + * changed: remove implementation of OnRemoveSource to music base class + + [Arne Morten Kvarving] + * changed: move the implementation of IBackgroundInfoLoader to music base class + + [Arne Morten Kvarving] + * changed: move scanning related functions to music base window + + [Arne Morten Kvarving] + * changed: move audio cd rip button handling to base music window + + [Arne Morten Kvarving] + * added: quickpath support for files to music nav window + + [Arne Morten Kvarving] + * changed: move GUI_MSG_NOTIFY_ALL+GUI_MSG_REMOVED_MEDIA handling to base window + + [montellese] + * CGUIViewStateMusicSmartPlaylist: fix default sorting of songs over UPnP (fixes #16192) + + [Pär Björklund] + * Remove auto_aptr as std::unique_ptr handles this just fine by specifying [] in the template type + + [Matthias Kortstiege] + * [osx/ios] xcode sync for PR7800 + + [Pär Björklund] + * Add the ability to open dialogyesno by sending a threadmessage. + + [Kai Sommerfeld] + * [Confluence] Home screen: Make system.date label wider + + [S. Davilla] + * cleanup, no one uses the functions, drop a nuke + + [S. Davilla] + * fixed compiler warnings, do not over-ride SDL defines with our own junk + + [S. Davilla] + * cleansing, SDL what ? + + [S. Davilla] + * removed, LockFree. Also not used since water made to wine + + [S. Davilla] + * [ios] - only change scheduler on ios, not osx + + [S. Davilla] + * fixed, memory leak. and rm results, no one cares + + [S. Davilla] + * fixed, packedBuffer is an array, use the proper delete + + [S. Davilla] + * [soloader] - remove debugoutput in global dtor again - those can cause crashes on exit. + + [S. Davilla] + * removed, mediainfo has been going forever, why is this here ? + + [S. Davilla] + * removed, DARWIN_NATIVE_ARCH does not exist and has not since Texturepacker was moved to depends + + [S. Davilla] + * fixed, we do not own png object so do not manually release it + + [S. Davilla] + * fixed, hidden collision with CSettingString:copy + + [S. Davilla] + * fixed, NULL is not equal to zero, thank you + + [S. Davilla] + * removed, SDL native. This should have been removed long ago when TexturePacker was nutered of SDL + + [S. Davilla] + * fixed, signed/unsigned compiler warning by casting + + [ace20022] + * [GUITexture] Fix animation delay "calculation". + + [ace20022] + * [GUITexture] Make texture animations more accurate. + + [ace20022] + * [TextureManager] Use new gif implementation and remove now obsolete AnimatedGif class. + + [ace20022] + * [gif] Add proper gif implementation using giflib 4/5. + + [Kolja Lampe] + * Ignore .vs folder in visual studio project Ignore removed visualization addons + + [fritsch] + * ffmpeg: Disable videotoolbox on OSX + + [t4-ravenbird] + * fix use of progress-dialog lines + + [fritsch] + * FFmpeg: Bump to 2.8.0-Jarvis-alpha3 + + [fritsch] + * VAAPI: Use HEVC acceleration (ffmpeg 2.8+) + + [fritsch] + * VDPAU: Use HEVC_MAIN GPU decoding (ffmpeg 2.8+) v2: Always use 16 ReFrames + + [montellese] + * CImageResource: adjust IsAllowed() to also accept directory paths to be able browse directories for multiimage controls + + [Kolja Lampe] + * [music] Make sure the node type is correct + + [Razzeee] + * [cleanup] Removed unused declaration that crept in somehow + + [ace20022] + * [depends] Add giflib. + + [wsnipex] + * [depends] fix dcadec makefile to allow manual install + + [fritsch] + * dcadec: Remove wrong AC_CHECK_LIB + + [fritsch] + * DCADEC: Display real stream information - don't hide what we know + + [montellese] + * [win32] TexturePacker: bump version to 1.0.4 + + [Alwin Esch] + * [pvr] Radio RDS - Add related parts to skin + + [Alwin Esch] + * [pvr] Radio RDS - Add in legacy interface + + [Alwin Esch] + * [pvr] Radio RDS - Add handling code + + [Alwin Esch] + * [pvr] Radio RDS - Add related settings + + [Alwin Esch] + * [pvr] Radio RDS - Add related strings + + [Alwin Esch] + * [pvr] Radio RDS - Add related skin strings + + [AlwinEsch] + * [pvr] Radio RDS - Add related gui images + + [Thomas Amland] + * [addons] kill force parameter. logically dead code + + [Thomas Amland] + * [addons] remove 'update' parameter. always called with true if addon is installed + + [Thomas Amland] + * remove unused method + + [Thomas Amland] + * [addons] dont attempt to install dependency if it's just disabled + + [Kolja Lampe] + * [cleanup][music] Removed unneeded lines from SaveViewStates + + [popcornmix] + * [DVDDemuxFFmpeg] Ignore extradata for unknown stream types + + [universal] + * [readme] part 3 - fix comments. + + [Razzeee] + * [musiclibrary] Made top albums sortable by play count + + [universal] + * [readmes] Final revision + + [S. Davilla] + * fixed, convertBaseToScreen is depreciated + + [S. Davilla] + * fixed, c++11 compiler warnings + + [S. Davilla] + * fixed, XBMCDelegate warnings + + [S. Davilla] + * fixed GCRY_THREAD_OPTION_PTHREAD_IMPL is depricated, check for it + + [S. Davilla] + * fixed linker warnings about PIC/PIE + + [Matthias Kortstiege] + * [settings] remove rotate pictures using EXIF information setting + + [Matthias Kortstiege] + * [settings] remove show EXIF picture information setting + + [universal] + * [readme] typos and cleanup including whitespaces. + + [Kolja Lampe] + * Corrected label order for songs when ordering by dateadded See https://github.com/xbmc/xbmc/pull/7884#discussion-diff-38898752 + + [montellese] + * [win32] TexturePacker: fix/cleanup include directories definition + + [montellese] + * TexturePacker: properly write the path into the header followed by zeroes instead of garbage + + [Kolja Lampe] + * Disable CPU temp test on windows + + [montellese] + * settings: fix method signatures of overridden virtual methods + + [montellese] + * CWakeOnAccess: replace OnSettingsSaved() with OnSettingChanged() + + [montellese] + * CWinSystemX11: don't derive from unused ISettingCallback + + [popcornmix] + * [visualisation] Don't restrict the sample buffer to 256 samples + + [popcornmix] + * [mmalcodec] Use settings constants + + [popcornmix] + * [omxplayer] Flush EOS from queue to avoid it turning up after a seek + + [Thomas Amland] + * remove file operation log spam + + [evilhamster] + * [music] Added a desc field for (album)artists to Song and Album, the field is used to keep the information from the tags for display purposes. + + [ace20022] + * [guilib] The output buffer of IImage::Decode should be a const pointer rather than a pointer to a const value. + + [MilhouseVH] + * [mysql]Add support for hyphenated database names when copying databases + + [Alwin Esch] + * [depends] remove libmp3lame + + [S. Davilla] + * fixed, AEDelayStatus is a struct, not a class + + [Kai Sommerfeld] + * [PVR] Use custom setting list formatter for displaying days of week values. + + [Kai Sommerfeld] + * [settings] CGUIControlListSetting: Add possibility to supply a custom formatter for label2. + + [Martijn Kaijser] + * fix language strings after 0997117a659a09e7b1c5bcb110f3526ea16698be + + [Roman] + * Fix: Disable unneeded flip of characters for hebrew/arabic languages + + [montellese] + * [win32] provide bootstrap-addons.bat to execute binary addons bootstrapping + + [montellese] + * [binary addons] replace all addons with a binary addons definition repository + + [montellese] + * [binary addons] automatically bootstrap all default repositories and addons if no addon definitions are available + + [montellese] + * [binary addons] provide a bootstrap buildsystem to download addon definitions + + [montellese] + * [binary addons] add ADDONS_DEFINITION_DIR to be able to specify the directory containing the definitions for the addons to be built + + [montellese] + * jsonrpc: fix CID 1273979 + + [montellese] + * jsonrpc: fix CIDs 1228813, 1228816, 1228817, 1228818, 1228823 and 1228824 + + [montellese] + * jsonrpc: fix CIDs 1194413, 1194414, 1194415, 1194416, 1213841 and 1213842 + + [montellese] + * JSONServiceDescription: fix CID 719179 and 719180 + + [Kai Sommerfeld] + * [Confluence]]PVR] Re-add channel icons before timer title (was accidentally removed with #7630) + + [NedScott] + * Fix "menu" button for Android and linux. + + [Thomas Amland] + * remove unused context menu id + + [Thomas Amland] + * [addons] move LastUpdated from installer to repository updater + + [Matthias Kortstiege] + * [osx/ios] xcode sync for repository updater + + [Thomas Amland] + * add context menu for updating a single addon repository + + [Thomas Amland] + * [addons] improve error handling in repository navigation + + [Thomas Amland] + * [addons] fix repository install hooks + + [Thomas Amland] + * [addons] rework repository updating + + [Arne Morten Kvarving] + * copy config.site with friends to in-addon-tree autoconf dirs + + [wsnipex] + * [depends] binary-addons: add X11 + + [wsnipex] + * [depends] binary addons: add CMAKE_LD_FLAGS to cmake toolchain file + + [wsnipex] + * [depends] binary addons: add GLEW to addon depends on linux + + [wsnipex] + * [cmake] pass DEPENDS_PATH to addons + + [montellese] + * [win32] update build scripts to handle visualization addons + + [wsnipex] + * remove visualizations fishbmc, goom, milkdrop, projectm, spectrum, vortex and waveform from tree + + [wsnipex] + * remove rsxs from tree + + [wsnipex] + * [binary addons] add visualizations fishbmc, goom, milkdrop, milkdrop2, projectm, spectrum, vortex and waveform + + [wsnipex] + * [binary addons] add screensavers.rsxs + + [Arne Morten Kvarving] + * added: special setting __addonpath__ to libXBMC_addon::GetSettings() + + [Matthias Kortstiege] + * [confluence] remove obsolete windows from visible condition + + [MilhouseVH] + * [videodatabase] Fix database version after #7561 + + [Razzeee] + * Fix fileutils test that failed on windows + + [Matthias Kortstiege] + * [videodatabase] fix typo + + [ace20022] + * Bump minimum libbluray version to 0.7.0 in configure.ac. Update README.linux. + + [montellese] + * jsonrpc: fix Audio.Details.Base definition after 59cead53175c51e25d5d73b25e95cbf8d2d309e2 + + [montellese] + * CXbtFile: add include for hidden dependency (thanks notspiff) + + [h.udo] + * [gui] drop video/music overlay dialogs leftover part II + + [ronie] + * [Confluence] cosmetics after PR7857 + + [Thomas Amland] + * [addons] move installing for updates to addon installer + + [Razzee] + * Added SORT_METHOD_VIDEO_USER_RATING to legacy code + + [Razzee] + * tests: Added unit tests for user ratings (videodb) + + [Razzee] + * Added user rating to json rpc for movie, tvshow, episode and musicvideo (get/set) + + [Razzee] + * Added user rating to setInfo on ListItem + + [Razzee] + * Added user rating to videoplayer and listitem for skinners Added label formatter for user rating Added IncreaseRating / DecreaseRating for video user ratings Added sorting option for user rating and show it in tvshows, episode and movie views + + [montellese] + * jsonrpc: fix handling of default sort method "none" + + [Razzee] + * Added user rating to musicvideo, movie, episode and tvshow databases Made user rating it scrapable + + [Matthias Kortstiege] + * [videoinfodialog] cleanup obsolete and dupe code + + [Matthias Kortstiege] + * [keymap] let ctrl+shift+r toggle dirty region visualization + + [Matthias Kortstiege] + * [builtins] adds ToggleDirtyRegionVisualization builtin + + [h.udo] + * [gui] drop video/music overlay dialogs leftover + + [xhaggi] + * [input] fix long press fallback handling after #7846 + + [Pär Björklund] + * Added prebuilt libdcadec from same source as linux version + + [popcornmix] + * [ffmpeg] Add support for libdcadec + + [Matthias Kortstiege] + * [video] retrieve season poster via the thumbloader + + [ronie] + * typo + + [BigNoid] + * [guilib] Add randomize tag for fadelabels + + [Matthias Kortstiege] + * [infomanager] add Container.Row/Column info label for panels + + [Matthias Kortstiege] + * [peripherals] nuke PeripheralManager + + [Matthias Kortstiege] + * [peripherals] use the actual device name for settings dialog header + + [Matthias Kortstiege] + * [peripherals] pass peripheral device properties to settings dialog + + [Matthias Kortstiege] + * [peripherals] use select dialog for listing devices + + [phil65] + * [guilib] nuke VisualisationPresetList.xml + + [DaveTBlake] + * Fix so that "Various artists" is displayed in the artists list just as it is when displaying artists for a specific genre. + + [Martijn Kaijser] + * set version to 16.0a3 + + [popcornmix] + * [peripherals] Move initialisation after language init to fix notifications + + [montellese] + * CVideoLibraryProgressJob: don't force the progress dialog/bar open in DoWork() + + [montellese] + * CVideoLibraryRefreshingJob: always close the progress dialog after scraping + + [Matthias Kortstiege] + * [infomanager] add Container.Content info label + + [ace20022] + * [bluray][depends] Adapt libbluray makefile to libbluray 0.8.1 and add a patch for android (setmntent not defined). + + [ace20022] + * [bluray] Add Abort implementation. + + [ace20022] + * [bluray] Initialize m_angle. + + [ace20022] + * [bluray] Fix bluray player language settings. + + [ace20022] + * [bluray] Set persistent and cache directory. + + [ace20022] + * [bluray] Set BLURAY_PLAYER_SETTING_PARENTAL and BLURAY_PLAYER_SETTING_PLAYER_PROFILE to recommended values. + + [ace20022] + * [bluray] Use the region locale (country code) form the settings instead of hardcoded "us". + + [ace20022] + * [bluray][settings] Add a Blu-ray region setting and use it. + + [ace20022] + * [bluray] Move player setup to an own method and refactor it. + + [ace20022] + * [bluray] Add PLAYMARK event. + + [ace20022] + * [curl][udf] The separator between the image path and the file path (inside the image) must be '/'. + + [ace20022] + * [win32][bluray] Update libbluray to version 0.8.1. + + [Pär Björklund] + * Fix: Change parameter to CPVRChannelPtr + + [montellese] + * CVideoLibraryRefreshingJob: ditch m_showDialogs in favor of CProgressJob::DoModal/IsModal() + + [metaron] + * [PVR] search window add play recording to context menu + + [metaron] + * [PVR] Fix crash in PVR search window context menu + + [Ben Avison] + * Pre-populate the mmap'ed database file in SQLite. + + [Matthias Kortstiege] + * [guilib] fix button label2 not updated after emptying + + [metaron] + * [PVR][Confluence] Add EPG to search results window + + [arnova] + * fixed: Enable retry without range set for e.g. broken HDHomerun servers (fixes #14204) + + [Ben Avison] + * Enable SQLite to use mmap for file access. + + [janbar] + * [PVR] Don't show 'will record' in EPG for inactive schedule + + [Matthias Kortstiege] + * [videodb] add genre to episode_view + + [Matthias Kortstiege] + * [video] add listitem audio/subtitle properties from streamdetails + + [Matthias Kortstiege] + * [goom] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dllloader] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [cdrip] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [epg] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [linux] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dvdplayer] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [peripherals] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dialogs] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audioengine] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [input] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [interfaces] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [audiodsp] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [pictures] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [network] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [dbwrappers] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [listproviders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [videoshaders] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [guilib] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [addons] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [utils] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [music] use std:: instead of using namespace std + + [Matthias Kortstiege] + * [filesystems] use std:: instead of using namespace std + + [montellese] + * CApplication: improve skin reloading in case theme/color/font is not default + + [Stefan Saraev] + * [keymap] improve 'menu' keymaps + + [Stefan Saraev] + * [input] added KEY_MENU to linux input + + [Matthias Kortstiege] + * [video] fix missing container.art for movie sets + + [Matthias Kortstiege] + * [video] fix title prompting in case the search returned no results + + [Anton Fedchin] + * [GraphicContext] Use stereo strength setting instead of fixed value. + + [Anton Fedchin] + * [language.en_gb] Added strings for stereo strength setting. + + [Anton Fedchin] + * [windows] GUIWindowTestPattern: Don't adjust white and black levels for DirectX, they will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIFontTTF: Don't adjust color range for DirectX, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUITextureD3D: Don't adjust color range, it will be adjusted in shader. + + [Anton Fedchin] + * [guilib] GUIShaderDX: Added color adjustment to shaders for correct displaying limited color range. + + [Anton Fedchin] + * [settings] Added new setting 'GUI Stereo Effect Strength'. + + [Anton Fedchin] + * [guilib] GUIWindow: added new tag which define on how window will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] ControlFactory: added new tag which define on how control will be "in front" or "in back" in stereo mode. + + [Anton Fedchin] + * [guilib] CGUIControl: added parameter for stereo correction factor. + + [Anton Fedchin] + * [GraphicsContext] Added methods SetStereoFactor/RestoreStereoFactor for stereo corrections. + + [Anton Fedchin] + * [RenderSystem] SetCameraPosition: Added stereo correction factor parameter (default 0). + + [ace20022] + * [ae] Fix copy-paste-error. + + [Stefan Saraev] + * [cleanup] dont search for ogg/vorbis/vorbisenc shared libs + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Pär Björklund] + * Fixed broken switch statement and moved it to it's own method to cut down on similar future issues. Added logging for unhandled values. + + [ace20022] + * [Util] Make use of generalized ScanForExternalSubtitles(...) methods. + + [hudokkow] + * [groovy] Move groovy to tools/codegenerator/ + + [anaconda] + * [videodb] Never clean empty TV shows if the path still exists. + + [Matus Kral] + * [CEC] change bool setting "pause playback on changing source" into tristate option with possible settings: 1. do nothing (as was before) 2. pause playback (as was before) 3. stop video, keep playing audio + + [ace20022] + * [Util] Generalize external subtitle retrieval method(s). This adds the following protected methods. + + [Martijn Kaijser] + * [pydocs] cosmetics + + [hudokkow] + * [groovy] Update to 2.4.4 + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Mike Frysinger] + * kodi.sh: use portable printf + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [arnova] + * changed: When matching articles, ignore their case + + [montellese] + * CDirectoryProvider: support "sortby" and "sortorder" attributes + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [montellese] + * SmartPlaylist: use the new SortUtils helper methods + + [montellese] + * JSON-RPC: use the new SortUtils helper methods + + [montellese] + * SortUtils: add methods to translate sort methods/orders from/to string + + [Matthias Kortstiege] + * [infomanager] add System.HasHiddenInput info bool + + [wsnipex] + * [binary addons] Allow regex patterns in ADDONS_TO_BUILD + + [Matthias Kortstiege] + * [dialog] use DialogOK as basis for the gamepad dialog + + [Matthias Kortstiege] + * [video] nuke GUIDialogFileStacking + + [Matthias Kortstiege] + * [video] use select dialog for play stacked part selection + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [metaron] + * [PVR] Timer Setting Dialog: only supported anytime + + [metaron] + * [PVR] Timer settings dialog: Start/End display fix + + [Achim Turan] + * [ActiveAE] Added new interface method GetCurrentSinkFormat(...) + + [Achim Turan] + * [AEUtils] Added copy operator to AEAudioFormat + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Matthias Kortstiege] + * [confluence] disable vis preset button in case there are no presets available + + [Matthias Kortstiege] + * [infomanager] add Visualisation.HasPresets info bool + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Matthias Kortstiege] + * [grouplist] factor out control on screen detection code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [Matthias Kortstiege] + * [guilib] add Container(id).Position for grouplist controls + + [Matthias Kortstiege] + * [guilib] move infolabel functions to GUIControlGrouList + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [evilhamster] + * Updated addsong to check for iTrack aswell when checking for duplicates. + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [Kolja Lampe] + * Hide image when showing tracks + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Kolja Lampe] + * Added dateAdded to album and artist json-rpc + + [Kolja Lampe] + * Call SetArtist with the artist object instead of the artist name + + [Kolja Lampe] + * Added max dateAdded to artist and album + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [uNiversaI] + * [confluence] update bookmark OSD icon + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [Memphiz] + * Revert "[osx/XBMCHelper] - compile XBMCHelper as 64bit" + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Chris Browet] + * FIX: [amlegl] additional display modes + + [Chris "koying" Browet] + * FIX: [amlegl] do not require RW on /sys/.../mode + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Matthias Kortstiege] + * [music] fix missing lyrics from tag when playing from musicdb url (fixes #16216) + + [Tobias Markus] + * Fix coverity #1312063 and #1312064: Pass big parameter by reference instead of value + + [montellese] + * [win32] fix minimum required CMake version for generator expressions + + [montellese] + * [binary addons] fix android by using TARGET_LINKER_FILE_NAME instead of TARGET_FILE_NAME + + [Pär Björklund] + * CancelAlarmclock didn't understand silent as a parameter and with the addition of event logging it started displaying a toast + + [Pierre Bureau] + * [CONTAINERART] Fix Container.Art property for artist directories + + [ace20022] + * Avoid access violations when a lib couldn't be loaded. + + [Rainer Hochecker] + * dvdplayer: set default screen region for dvb subs + + [Matthias Kortstiege] + * [settings] ensure year string is at the end in clean datetime regexp + + [Chris "Koying" Browet] + * Revert "[aml] - fix draining message queue" + + [Thomas Amland] + * [gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item + + [Anton Fedchin] + * [dx11] CProcessorHD: Get rig of unneeded std::map. + + [Anton Fedchin] + * [dxva] CProcessorHD::Convert - Optimize method with sse2 instructions. + + [Anton Fedchin] + * [dx11] Moved CDVDCodecUtils::CopyDXVA2Picture to WinRenderer and optimize copying a DXVA texture to YUV buffer with sse4. + + [ronie] + * [Re-Touched] update + + [ronie] + * [Confluence] remove dead code + + [Thomas Amland] + * [lang] sort special values for preferred subtitle/audio language on top + + [metaron] + * [PVR] Implement: Recording scraper support / UI + + [metaron] + * [PVR] Doc Only: Doxy syntax correction + + [metaron] + * [PVR] Doc Only: iLifetime list purpose + + [Ryan Gribble] + * [PVR] Implement: Add menu visibility controls + + [metaron] + * [PVR] API: Add menu visibility controls for timers + + [Ryan Gribble] + * [PVR] Implement: MaxRecordings list + + [metaron] + * [PVR] API: Add maxRecordings + + [metaron] + * [PVR] API: Add Recording scraper support + + [metaron] + * [PVR] Implement: Add boolean control of Any Time + + [metaron] + * [PVR] API: Add boolean control of Any Time + + [metaron] + * [PVR] API 3.0.0 Version Bump + + [montellese] + * CLangInfo: properly set the time format when setting/changing regions + + [Matthias Kortstiege] + * [musiclibrary] add SortByArtistThenYear + + [Thomas Amland] + * [lang] fix inconsistent naming of norwegian languages + + [uNiversaI] + * [readme] fix crossguid install PREFIX + + [uNiversaI] + * [crossguid] all: also check for installed location + + [xhaggi] + * [gui] drop video/music overlay dialogs + + [Tobias Markus] + * Various cppcheck performance fixes + + [ronie] + * [Confluence] cleanup + + [ronie] + * [Re-Touched] update + + [Thomas Amland] + * [addons] fix foreign filter after 'no' was changed to 'nb_NO' + + [Thomas Amland] + * [lang] fix fallback after 'no' was changed to 'nb_NO' + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [recentlyadded] fix empty LatestAlbum.Artist (closes #16200) + + [Matthias Kortstiege] + * [guilib] fix double memory free in panel container + + [ronie] + * [Confluence] cosmetics + + [Rainer Hochecker] + * [cmake] set CORE_SYSTEM_NAME on osx correctly + + [xhaggi] + * [input] fix stack overflow in HasLongpressMapping + + [ronie] + * [Confluence] fix watched flag in media info 3 view + + [xhaggi] + * [cleanup] unify method name used for singleton pattern + + [Thomas Amland] + * [addonbrowser] dont set content to "addons" for category listings and other menus + + [Thomas Amland] + * [codegenerator] return None for null pointer, not empty vector + + [Thomas Amland] + * [python] add multiselect dialog + + [Thomas Amland] + * [gui] change CGUIDialogSelect::GetSelectedItems to return indices + + [Matthias Kortstiege] + * [guilib] fix fadelabel always marked dirty + + [ronie] + * [Confluence] numpad redesign + + [Anton Fedchin] + * [guilib] GUIFontTTFDX: Fixed rendering of rotated text. + + [metaron] + * [PVR] Timer settings dialog: Pre/post bugfix + + [ronie] + * [Confluence] fix highlight on numpad buttons + + [ronie] + * [Confluence] replace tag with animation + + [uNiversaI] + * [readme] add uuid-dev / crossguid to dependencies + + [popcornmix] + * [mmalrenderer] Use half rate deinterlace when playing video in background + + [popcornmix] + * [mmalcodec] Tidy up debug logging for decode + + [popcornmix] + * [omxplayer] Tidy up setting of timestamp flags + + [popcornmix] + * [omxhelper] Ignore embedded coverart image when looking for supported video streams + + [popcornmix] + * [omxplayer] Set audio properties for passthrough + + [popcornmix] + * [omxplayer] Support per refresh rate display latency settings + + [popcornmix] + * [omxplayer] Allow automatic switching back to omxplayer after it has been disabled + + [Anton Fedchin] + * [guilib] TextureDX: fix texture updates. Now there is a possibility to update texture if it was created with default usage. + + [MilhouseVH] + * [mysql] Fix incomprehensible error message + + [Pär Björklund] + * Updated taglib that fixes a crash when playing flac files + + [popcornmix] + * [mmaldecodec] Increase queue limit to 1 second to avoid stalls + + [popcornmix] + * [mmalcodec] Use both dts and pts for determining amount of queued data + + [popcornmix] + * [mmalcodec] Don't set initial unknown timestamps to zero + + [popcornmix] + * [mmalcodec] Enable interpolate timestamps + + [popcornmix] + * [mmalcodec] Populate the framerate of video decoder + + [popcornmix] + * [rbp] Ignore pts value when m_hints.ptsinvalid set + + [Martijn Kaijser] + * [gui] change some appearence settings from spinner to list + + [montellese] + * CApplication: reloading the skin when changing themes must be done asynchronously (broken by 9e9396b073ba973b2847896a11244a9f37ecbaff) + + [montellese] + * addons: simplify and document logic for broken add-on handling + + [montellese] + * events: only log incompatible/broken add-ons that are installed + + [montellese] + * CAddonInstaller: fix CheckDependencies() after 71b96140956936dfd366554e8806bed1b15d81f1 + + [montellese] + * fix CUtil::GetSkinThemes() to also handle xbt:// VFS paths + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [Frank Razenberg] + * [keymap] undo workaround for volume adjustment issue + + [Frank Razenberg] + * [action] Disregard sign of volume adjustment actions to match seeking behavior + + [xhaggi] + * [cleanup] removes unused actions + + [Pär Björklund] + * [xbmc][win32] Fixes side flyout appearing when using touch + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [xhaggi] + * [confluence] merge guide/recording info dialogs into one DialogPVRInfo + + [xhaggi] + * [pvr] use same skin XML for guide/recording info dialog + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [uNiversaI] + * [confluence] uppercase icon name and allow separate icons + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Martijn Kaijser] + * [add-ons] sync with repo + + [Martijn Kaijser] + * [cosmetic] fix incorrect string id start point + + [Thomas Amland] + * [addonbrowser] refactor + + [Thomas Amland] + * [addonbrowser] add 'look and feel' category + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' for folders containing a single series + + [montellese] + * [win32] update pre-built TexturePacker.exe dependency + + [montellese] + * [win32] fix missing include path to winres.h + + [montellese] + * texturepacker: fix texturepacker not writing any frames + + [montellese] + * texturepacker: derive CXBTFWriter from CXBTFBase instead of abusing CXBTFReader + + [montellese] + * guilib: split CXBTFBase out of CXBTFReader + + [phil65] + * [Confluence] - fix WindowOpen animation for Eventlog + + [montellese] + * jsonrpc: add VideoLibrary.RefreshMovie/TVShow/Episode/MusicVideo + + [ronie] + * [Confluence] epggrid - remove onback, menu key can now be used to focus the sidemenu + + [ronie] + * [Confluence] add menucontrol to eventlog window + + [montellese] + * CFileItem: fix GetBaseMoviePath() for folder-level sources + + [montellese] + * cosmetic: use else if instead of if in CVideoInfoScanner + + [montellese] + * video library: use CVideoLibraryQueue::RefreshItemModal + + [montellese] + * CVideoLibraryQueue: add RefreshItem and RefreshItemModal + + [montellese] + * refactor video item refreshing into CVideoLibraryRefreshingJob + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault #2 + + [MilhouseVH] + * [mysql] Fix formatting arg that leads to segfault + + [montellese] + * filesystem: make events:// available even if there's no network interface available + + [montellese] + * filesystem: make resource:// available even if there's no network interface available + + [montellese] + * filesystem: make bluray:// available even if there's no network interface available + + [montellese] + * filesystem: make pipe:// available even if there's no network interface available + + [xhaggi] + * [cleanup] removes unused actions + + [xhaggi] + * [settings] rename eventlog setting ids based on the convention + + [xhaggi] + * [setting] hunt missing setting id constants + + [xhaggi] + * [keymap] adjust keymaps to support the menu action + + [xhaggi] + * [confluence] adds new menucontrol tag in related xml's + + [h.udo] + * [json] Bump API + + [Arne Morten Kvarving] + * [json] added: announce after audio library export + + [Arne Morten Kvarving] + * [json] added: announce after video library export + + [Matthias Kortstiege] + * [textbox] remove duplicate code + + [Matthias Kortstiege] + * [infomanager] add Container(id).HasNext / HasPrevious for textbox controls + + [montellese] + * events: fix showing event log from settings + + [montellese] + * settings: use constants for event log settings + + [montellese] + * CBaseTexture: support loading a (static) texture from an XBT file (and from resource addons) + + [montellese] + * CImageResource: override CResource::GetFullPath() to forward paths to Textures.xbt if present + + [montellese] + * CResource: add overridable GetFullPath() + + [montellese] + * filesystem: add CXbtManager, CXbtDirectory and CXBtFile to implement xbt:// + + [montellese] + * filesystem: add Directorize helper function and use it in CZipDirectory::GetDirectory() + + [montellese] + * add CXBTFFile::GetPackedSize()/GetUnpackedSize() + + [montellese] + * refactor CXBTFFrame, CXBTFFile and CXBTFReader and get rid of CXBTF + + [Matthias Kortstiege] + * [infomanager] add Container(id).CurrentItem / NumItems for grouplists + + [h.udo] + * [Util.cpp] sap stream was dropped by mistake during HDhomerun cleanup + + [Stefan Saraev] + * [binary addons] make sure CORE_SYSTEM_NAME is set + + [h.udo] + * [pvr.dvbviewer] Point to master again now https://github.com/xbmc/xbmc/pull/7570 is in + + [hudokkow] + * [Binary Add-ons] Point audio encoders/decoders to master instead of SHA + + [Anton Fedchin] + * [GUIFontTTFDX] Optimized: don't change rendering state if there is nothing to render. + + [wsnipex] + * [binary addons] fix addon.xml generation if addon.xml.in contains semicolons + + [Memphiz] + * [Database/Import] - present the user with removable and network shares aswell when importing a database - same as the export database dialog provides + + [montellese] + * [confluence] add EventLog.xml + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * events: add and integrate CGUIWindowEventLog + + [montellese] + * label formatter: add %d for date and time + + [montellese] + * info manager: add ListItem.DateTime info label + + [montellese] + * events: add events for files/directories that couldn't be scraped + + [montellese] + * events: add events for addon installation/update/uninstallation/enabling/disabling/breaking + + [montellese] + * addons: add FullType() to IAddon and a specialization to CPluginSource + + [montellese] + * CAddonInstaller: add the possibility to retrieve the information about which addon dependency failed + + [montellese] + * cosmetics in CGUIWindowAddonBrowser + + [montellese] + * addon browser: only try to remove addons from the listing if GetDirectory() succeeded + + [montellese] + * events: add some general events + + [montellese] + * events: add specific IEvent implementations + + [montellese] + * filesystem: add support for events:// + + [montellese] + * add event log infrastructure + + [montellese] + * fix StringUtils::CreateUUID() by using crossguid + + [montellese] + * [win32] integrate crossguid as a static library + + [montellese] + * [depends] integrate crossguid as a static library + + [Anton Fedchin] + * [GUIFontTTF] Fixed rounding X coordinate of a char if it has negative value. + + [Pär Björklund] + * Fix endless loop during shutdown. + + [Matthias Kortstiege] + * [infomanager] add System.HasModalDialog info bool + + [montellese] + * [depends] integrate building libuuid for Linux/RBPi + + [xhaggi] + * [gui] new action ACTION_MENU to focus menucontrol + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [Thomas Amland] + * change ui sound system to addons only + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [fritsch] + * [python] Add setContentLookup method + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [ace20022] + * [coverity] Result is not floating-point. This commit deals with CID numbers: 1238561 1238569 1238573 1238592 1238593 + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [Anton Fedchin] + * [application] Moved call to PVRManager::SetWakeupCommand in PowerManager::OnSleep for execute it when a actual suspend/hibernate occurs. + + [ace20022] + * [coverity] Add additional check to prevent an only theoretical out-of-bounds read from a buffer (CID #1248215) in StringUtils::​SizeToString(long). + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Anton Fedchin] + * [PowerManager] Show dialog busy only when processing OnSleep. + + [Anton Fedchin] + * [win32] Move call to SetSuspendState/InitiateShutdown out from main thread. + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Achim Turan] + * [adsp] Added AudioDSP-System bypass functionality + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Kai Sommerfeld] + * [EPG] Fix: Respect view mode changes of EPG window when controlling number of epg data updates. + + [montellese] + * cmake: automatically set the proper platform specific library in the addon.xml + + [montellese] + * addons: support library_freebsd, library_rbpi, library_ios and library_windows in addon.xml + + [montellese] + * [binary addons] bump platform and kodi-platform + + [h.udo] + * [pvr.dvbviewer] Change back to SHA or it will continue to fail + + [ronie] + * fix Window.IsMedia infobool + + [Kai Sommerfeld] + * [PVR] Fix timer type compat code. Solves a crash with MediaPortal addon. + + [Kai Sommerfeld] + * [PVR] Fix usage of PVR_TIMER_STATE_NEW. + + [Kai Sommerfeld] + * [PVR] API docs: Changed description of PVR_TIMER_STATE_NEW to be more accurate. + + [Ryan Gribble] + * CPVRChannel::SetEpgId() should flag the record as changed (and only be set if it isnt already) + + [arnova] + * fixed: Watched overlay would not display if item was also (still) resumable (fixes #15766) + + [mapfau] + * [epg] avoid PVR thread to persist epg tables directly (sync issue with epg thread) + + [Martijn Kaijser] + * [pydocs] sortMethod list is already at the bottom of the page + + [Chris "Koying" Browet] + * squashme: after review longpress + + [Chris "koying" Browet] + * ADD: [keyboard] allow to map long key presses + + [Thomas Amland] + * [gui] fix confirm state not reset in CGUIDialogSelect + + [Martijn Kaijser] + * [pydocs] cosmetics + + [Martijn Kaijser] + * [pydocs] update sortMethods documentation + + [Memphiz] + * [SectionLoader] - remove logging in D'Tor + + [hudokkow] + * [gitignore] Add libdvdcss artifact + + [Anton Fedchin] + * [dx11] Don't cull a texture which is shown with reverse side. + + [taxigps] + * fixed: can't set locale in right language and region + + [xhaggi] + * [epg] trigger epgs create after we started the epg container + + [Kai Sommerfeld] + * [PVR] 'Confim channel switch' only for up/down, not ch+/- + + [Memphiz] + * [ios] - fix linkage for VTB framework for ios < 6 - fixes vtb on ios 5.x runtime + + [taxigps] + * [keyboard] support codingtable input and add Chinese BaiduPY/BasePY layouts + + [metaron] + * [PVR] Conflence: Add EpisodeName to MyPVRChannels + + [xhaggi] + * [gui] use a global enum to specify the default render orders + + [Martijn Kaijser] + * [win32] remove old DirectX var from installer + + [ronie] + * [pydocs] don't tell people to use os.getcwd() + + [xhaggi] + * [settings] use setting id constants + + [xhaggi] + * [settings] specifies constants for every setting id + + [enen92] + * [pydocs] proper type and examples on Listitem.setInfo (cast and castandrole) + + [Kai Sommerfeld] + * [PVR] Confirm channel switch when flipping through channel information in fullscreen. + + [Martijn Kaijser] + * [pydocs] must use lowercase dictionary keys + + [Rainer Hochecker] + * renderer: apply logic for overlapping only to guitext subs - fix wrong positions for DVB subs + + [Rainer Hochecker] + * dvdplayer: ffmpeg subtitle codec does not know video size, drop guessing -> renderer knows + + [enen92] + * [pydocs] Listitem addStreamInfo example (must use lowercase dictionary keys) + + [Kolja Lampe] + * Fixed wrong variable names due to copy and paste + + [Martijn Kaijser] + * [pydocs] fix wrong example + + [Matthias Kortstiege] + * [infomanager] add Container.HasParent info bool + + [xhaggi] + * [pvr] protect pvr windows against illegal gui messages if manager is not started + + [xhaggi] + * [confluence] fix missing id for progressbar in progress dialog + + [Matthias Kortstiege] + * [guilib] fix possible crash due to accessing non-existing layout + + [Matthias Kortstiege] + * [guilib] make mouse wheel only move slider controls in case the actual slider is focused + + [Matthias Kortstiege] + * [guilib] make mouse wheel only scroll spin controls in case the actual spinners are focused + + [xhaggi] + * [gui] fix crash at destruction of CGUIWindowSplash + + [arnova] + * changed: Rename cache: to forward: as that's what it really is + + [Memphiz] + * [ios] - fix broken native keyboard on ios 5.1.1 devices (incompatiblity with ios8 sdk and old deployment target) + + [Martijn Kaijser] + * sync scrapers with repo + + [ace20022] + * [dvdplayer][subs] Add "forced only" to the preferred language list. Only forced subtitles matching the audio language are considered relevant. + + [ace20022] + * [dvdplayer][subs] Add "none" to the preferred language list. It will disable any kind of available subtitles. + + [h.udo] + * [pvr] Point add-ons to master instead of SHA + + [xhaggi] + * [pvr][fix] limit numeric dialog to fullscreen/visualisation window (fixes #16167) + + [xhaggi] + * [pvr] also register channel osd as observer for epg container + + [xhaggi] + * [pvr] show progress dialog in pvr windows and wait until manager has be started + + [xhaggi] + * [pvr] get rid of startup window handling in PVR manager + + [fritsch] + * FFmpeg: Bump to 2.7.2-Jarvis-alpha1 + + [Ryan Gribble] + * While working on MaxRecordings, found bug where default RecordingGroup selection wasnt being populated on new timer + + [Matthias Kortstiege] + * [guilib] update label color for sliderex controls + + [Thomas Amland] + * [python] remove unnecessary copying + + [Thomas Amland] + * [python] deprecate thumb/icon methods and args in favour of setArt + + [Thomas Amland] + * [python] add icon support for setArt + + [Thomas Amland] + * [python] add docs for ListItem constructor + + [phil65] + * [CONFLUENCE] - fix wrong navigation in SmartPlaylistEditor.xml + + [Matthias Kortstiege] + * [splash] centerCrop android splash + + [xhaggi] + * [splash] updated splash - thanks da-anda + + [Matthias Kortstiege] + * [guilib] only set label/label2 in case it changed + + [Matthias Kortstiege] + * [guilib] use label2 to display the radiobutton value instead of a texture + + [xhaggi] + * [pvr] limit invalidation of list items to once per 2 seconds for PVR windows + + [montellese] + * cmake: rename "darwin" to "osx" in CORE_SYSTEM_NAME + + [montellese] + * move logic to load platform specific addon library name into CAddonMgr::GetPlatformLibraryName() + + [montellese] + * CAddonMgr: make GetExtValue() const + + [montellese] + * cosmetic: fix indentation + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/main/posix/ + + [wsnipex] + * [cmake] resolve addon git branches/tags to hash + + [Thomas Amland] + * [python] add 'mediatype' info label and remove implicit sets + + [montellese] + * [binary addons] make addon source tarball caching option by introducing the ADDON_TARBALL_CACHING option + + [Martijn Kaijser] + * bump to 16.0a2 + + [montellese] + * CProgressJob: cosmetics + + [montellese] + * CProgressJob: don't set m_progressDialog to nullptr in MarkFinished() (partially reverts 658b0a21ed4a7443d6670fc6180d8dc2e9b2ca47 + + [montellese] + * CProgressJob: use MarkFinished() instead of manually calling CProgressDialog::Close() + + [xhaggi] + * [gui][fix] progress dialog's canceled is never reset + + [Rainer Hochecker] + * dvdplayer: drop work-around for very fast ff, obsolete after flushing render buffers correctly after seek + + [xhaggi] + * [epg] start epg container asynchronously + + [Matthias Kortstiege] + * [guilib] label2 colors need to be updated as well + + [Craig Andrews] + * [rsxs] Use stdbool.h from GCC 5.2.0 + + [ace20022] + * [dsp] Fix CID#1312065 Uninitialized scalar variable. + + [Matthias Kortstiege] + * [guilib] fix textbox textcolor not properly set + + [LS80] + * [keymap] change 'mytv' remote mapping to open the TV Shows node + + [xhaggi] + * [pvr] fix missing epg observable message handling in pvr windows + + [arnova] + * changed: Prefer openssl over gnutls for libcurl for Linux and Ubuntu as it is more reliable + + [montellese] + * [binary addons] bump audioencoder.flac/lame/wav to fix packaging + + [montellese] + * [win32] support "package" option in make-addons.bat + + [montellese] + * [binary addons] introduce PACKAGE_DIR variable to be able to specify where packaged addon archives should be copied to + + [Matthias Kortstiege] + * [guilib] revert fix label overlap in radiobutton control + + [Matthias Kortstiege] + * [guilib] fix hitrect for auto-width buttons + + [xhaggi] + * [gui] fix resizing GUI during initialization + + [xhaggi] + * [splash] get rid of obsolete message rendering + + [xhaggi] + * [splash] make CSplash singleton + + [xhaggi] + * [splash] get rid of obsolete thread stuff from CSplash + + [xhaggi] + * [splash] get rid of hard-coded resolution + + [Matthias Kortstiege] + * [application] remove unsused splash thread message + + [Matthias Kortstiege] + * [splash] introduce splash also as regular window + + [Kai Sommerfeld] + * [EPG] Jump to 'now' on init of EPG timeline view + + [Rainer Hochecker] + * dvdplayer - consider clock not last frame on screen when going rewind + + [montellese] + * [binary addons] add package-addons target to package all built addons + + [montellese] + * cmake: fix addon packaging and installation + + [Memphiz] + * [jenkins] - ensure that only the path workspace/addons is excluded from the clean - before it excluded workspace/xbmc/addons aswell which left the stale addons.a file around + + [Memphiz] + * [buildsys/Make] - remove main.a from the list of DIRECTORY_ARCHIVES for preventing duplicate linkage when compiling unit tests + + [phil65] + * [Confluence] - make use of new parametrized includes for wather part + + [uNiversaI] + * fix trac 16159 Yes (single) / Separate is doing reverse + + [Anton Fedchin] + * [dxva] Fixed: don't use DXVADDI_Intel_ModeH264_E decoder if source requires more than 11 references. + + [Anton Fedchin] + * [dxva] Fixed: missed Intel Clear Video workaround after dx11 upgrade. + + [Memphiz] + * [osx/ios/atv2] - synced xcode project + + [Thomas Amland] + * [contextmenu] sort items in internal menus by name + + [Thomas Amland] + * [contextmenu] use vector instead of map since we're mostly using linear search + + [Thomas Amland] + * [contextmenu] rename m_iCurrentContextId to m_nextButtonId + + [Thomas Amland] + * [contextmenu] rename Execute to OnClick + + [Thomas Amland] + * [addons] rename ContextItemAddon to ContextMenuAddon + + [Thomas Amland] + * [contextmenu] add support for sub-menus and multiple items + + [xhaggi] + * [pvr] fix missing return in CGUIWindowPVRBase::OnBack (fixes #16150) + + [Matthias Kortstiege] + * [dialog] fix indentation + + [montellese] + * tests: fix TestDatabaseUtils.GetField_MediaTypeSong + + [montellese] + * DatabaseUtils: songview.dateAdded can also be used in SELECT + + [Rainer Hochecker] + * dvdplayer: fix waiting time for buffer when ff + + [Rainer Hochecker] + * renderer: reset timestamp of current frame on flush + + [Rainer Hochecker] + * dvdplayer: improve rw + + [Memphiz] + * [osx] - reimplement Cocoa_GetVolumeNameFromMountPoint with a more current version - should fix strange crashes on some system with mounted HDDs + + [Rainer Hochecker] + * dvdplayer - drop deferred release of hw decoder, not need after running hw decoders single threaded + + [Pär Björklund] + * Fixes a crash when trying do delete a file in filemanager + + [Matthias Kortstiege] + * [guilib] auto-width button needs resizing on label change + + [Matthias Kortstiege] + * [guilib] wrapmultline for toggle button controls + + [Kai Sommerfeld] + * [Confluence][PVR] Added EPG info area to PVR timer window. + + [Kai Sommerfeld] + * [guiinfo] Added LISTITEM_EPG_EVENT_TITLE, extended LISTITEM_HAS_EPG to recognize timer info tags containing an epg info tag. + + [Kai Sommerfeld] + * [guiinfo] remove DOS line ends introduced by 74262ffdc1d55b9d9991e2a47762b4f075930952 + + [LS80] + * Changed the mapping for the mceusb LiveTV button from 'mytv' to 'livetv'. + + [LS80] + * Changed the mapping for the KEY_TUNER button from 'mytv' to 'livetv'. KEY_TV still maps to 'mytv'. + + [Rainer Hochecker] + * dvdplayer - dispose ffmpeg hw decoder prior to opening a new one + + [Rainer Hochecker] + * [aml] - fix draining message queue + + [ronie] + * [Re-Touched] some updates for jarvis + + [ronie] + * [Confluence] no + + [Kai Sommerfeld] + * [guiinfo] Fixed PVR_STRINGS_END value in GUIInfoLabels.h + + [Sam Stenvall] + * [dvdplayer] remove unused methods from DVDVideoCodec + + [Sam Stenvall] + * [dvdplayer] do not access m_pVideoCodec from dvdplayer thread + + [Rainer Hochecker] + * dvdplayer: drop speed adjust when buffer is full - with timeshift and server side buffering this case is normal + + [montellese] + * [binary addons] turn PACKAGE_ZIP into a proper cmake option + + [montellese] + * cmake: unify output of build messages by using message(STATUS ...) + + [Matthias Kortstiege] + * [gitignore] don't clean Makefile in xbmc/messaging/ + + [Martijn Kaijser] + * [adsp] disable binary add-on until they build on all platforms + + [Memphiz] + * [PosixClog] - ensure that file decriptor for logfile is NULL'ed in the d'tor to minimize issues when static/global object destruction order results in CLog accesses past destruction of the CLog instance + + [Kai Sommerfeld] + * [PVR] gui info: Fix 'PVR.IsTimeshift' (PVR_IS_TIMESHIFTING) + + [metaron] + * [PVR] Timer settings dialog: Add weekday for dates + + [metaron] + * [PVR] Timer settings dialog: rename SetDateFromInt + + [metaron] + * [PVR] Timer settings dialog: support unlisted date + + [metaron] + * [PVR] Timer settings dialog: Start/end in the past + + [Martijn Kaijser] + * add 16.x Jarvis repo + + [ace20022] + * [gui] Use correct overload in the ShowAndGetInput hierarchy. + + [ace20022] + * [gui] Initialize bool parameter before use (CID# 1311638). + + [Kai Sommerfeld] + * [PVR] Fix gui info time format for timeshift buffer start, buffer end, playing time. + + [Rainer Hochecker] + * [pvr] fix holding lock while querying backend + + [uNiversaI] + * [Strings] Audio DSP string fixes + + [ace20022] + * [subs] Use ISO 639-1 and addon languages for the "Languages to download subtitles for" setting. + + [ace20022] + * [lang] Add installed languages to the list of possible stream languages. + + [Memphiz] + * [ios/codesign] - if ldid was found - apply it to the kodi binary for fake signing it - this fixes runtime error on ios5.1 devices + + [Memphiz] + * [ios/depends] - add ldid fake sign package to native depends + + [montellese] + * settings: refactor handling of integer/string spinners/lists and add support for minimum/step/maximum in CGUIControlListSetting + + [montellese] + * settings: add support for minimum/step/maximum in CSettingControlList + + [a11599] + * [dx11] Fix AMD deinterlacing + + [Memphiz] + * [osx/XBMCHelper] - compile XBMCHelper as 64bit + + [Kai Sommerfeld] + * [PVR] bump addon pvr.hts + + [montellese] + * settings: use range based for loop in CGUIControlBaseSetting and derived classes + + [Rainer Hochecker] + * [pvr] fix stuttering indruduced by 9c3adb5a9f390ad73c52469ed79de297dad68d80 + + [xhaggi] + * [video] use action listener pattern for CPlayerController + + [uNiversaI] + * [typos] fix typos RegisterReceveiver -> RegisterReceiver + + [Anton Fedchin] + * [dx11] CD3DEffect::SetTexture - restored a missed expression. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Notify all about our resurrection after device re-creation also. This fixes issue with fonts after transition from window to full screen on another adapter. + + [Anton Fedchin] + * [dx11] RenderSystemDX: Switch swap chain to windowed mode before destroying device. This fixes a possible crash into ID3D11DeviceContext::Flush if swap chain still in full screen mode. + + [uNiversaI] + * [cosmetic] cleanup ident / alignment, spaces & boilerplate + + [Anton Fedchin] + * [dx11] CD3DTexture::SaveTexture - fixed an amount of memory to save compressed (DX1/3/5) texture. + + [xhaggi] + * [video] make CPlayerController singleton + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [montellese] + * [win32] fix VS 2013 solution + + [Rainer Hochecker] + * dvdplayer: fix clockspeed adjust for non-resampling modes + + [xhaggi] + * [guilib] fix modality handling of dialog slider (fixes #16140) + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [arnova] + * changed: For memory file cache there's no point creating a bigger cache than filesize + + [uNiversaI] + * Fix audio offset Dialog has no title + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [Sam Stenvall] + * [epg] adapt the progress texture's height to the actual height of the grid (fixes trac #15681) + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + [Alfredo Tupone] + * use $(MAKE) instead of hardcoded make + + + [Memphiz] + * [ios/packaging] - ensure that the deb package has ios5.1 as minimum ios version + + [Pär Björklund] + * Fix GUIInfoManager that got messed up with dsp merge + + [Martijn Kaijser] + * [pvr] bump addons after 800a634e6a20345dc0fb28212720a5e972709812 + + [Martijn Kaijser] + * [adsp] set fixed git SHA for ADSP add-ons + + [Martijn Kaijser] + * [win32] Use actuall add-on names instead of chopped addon-id in Windows installer; + + [Martijn Kaijser] + * remove duplicate ;; + + [Martijn Kaijser] + * [win32] Add ADSP option to Windows installer + + [Martijn Kaijser] + * use CVariant for strings in dialogs + + [montellese] + * [win32] cmake: no need to check for install permissions (avoid creating unneeded directories) + + [Rainer Hochecker] + * dvdplayer: flush renderbuffers when flushing video player + + [wsnipex] + * [linux] fix crashlog generation + + [Rainer Hochecker] + * [pvr] - expose timeshift info to GUI + + [Kai Sommerfeld] + * [EPG] Changed some CGUIEPGGridContainer member data types to get rid of some silly down casts. + + [Kai Sommerfeld] + * [EPG] Refactored CGUIEPGGridContainer grid data update code. + + [xhaggi] + * [guilib] fix hint text not shown in keyboard dialog + + [montellese] + * [resource.images.weathericons.default] fix addon.xml missing import of kodi.resource (thanks uNiversaI) + + [AchimTuran] + * [adsp] Add CApplicationMessenger receiver functionality to CActiveAEDSP + + [AchimTuran] + * [CApplicationMessenger] Move RegisterReceiver(...) from CApplication::Initialize(...) to CApplication::Create(...), which connects CApplicationMessenger receivers earlier + + [AchimTuran] + * [add-ons] adapt libXBMC_addon helper class dlfcn-win32 include path + + [AlwinEsch] + * [adsp] Add CMake addon build environment + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to music and pvr channels context menu + + [AlwinEsch] + * [adsp] Add send of ffmpeg info data to dsp addon + + [AlwinEsch] + * [adsp] Add dsp processing setting dialog selection to player dialog + + [AlwinEsch] + * [adsp] Add adsp mode processing chain settings dialog + + [AlwinEsch] + * [adsp] Add audio dsp information to CGUIInfoManager + + [AlwinEsch] + * [adsp] Add gui sound playback with selectable channel position on dsp addon callbacks + + [AlwinEsch] + * [adsp] Add adsp addon callback helper library + + [AlwinEsch] + * [adsp] Add basic audio dsp addon handling structure + + [AlwinEsch] + * [adsp] Add dsp related strings + + [AlwinEsch] + * [adsp] Add CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) + + [AlwinEsch] + * [adsp] Add audio dsp addon header and function defination files + + [AlwinEsch] + * [adsp] Add dsp related gui images + + [popcornmix] + * [dllloader] Fix logging of dlls without absolute path + + [Martijn Kaijser] + * set BICUBIC as default picture scaling algorithme + + [Rainer Hochecker] + * dvdplayer: fix mimetype after 89538103d60f64106f8ad998427c7286a3766244 + + [metaron] + * [PVR] Ignore article & folders when sorting Timers + + [xhaggi] + * [guilib] fix first letter remains visible in keyboard dialog + + [h.udo] + * [pvr] Bump add-ons for alpha1 + + [ronie] + * [Confluence] disabled textures + version bump + + [ronie] + * rename weather icon type + + [janbar] + * [PVR Addons] Fix XbmcStreamProperties::GetStreamData + + [xhaggi] + * [guilib] fix cursor not always shown in keyboard dialog (fixes #16134) + + [Pär Björklund] + * Fixed progress bar not showing for library scanning and probably a few other dialog issues + + [bryanbrazil] + * [python] add disabled textures for radio buttons and spin controls + + [bryanbrazil] + * [guilib] add disabled textures for radio buttons and spin controls + + [uNiversaI] + * [confluence] fix overlapping mutebug on musicvisualization and OSD + + [Pär Björklund] + * Fixed jsonrpc playback that hadn't survived the rework, closes #16129 + + [Pär Björklund] + * Fix for nullptr deref check that was wrong + + [Pär Björklund] + * Fix indentation that I broke + + [Kai Sommerfeld] + * [EPG] Reduce lagging of EPG window during EPG data grid updates. + + [Kai Sommerfeld] + * [EPG] Fix EPG grid container control concurrency issue (making it threadsafe for that particular case). + + [Kai Sommerfeld] + * [EPG] Use key 'remote 0' to jump to 'now' in EPG window. + + [Kai Sommerfeld] + * [EPG] Fix EPG window view port jumping to 'now' on every EPG data grid update. + + [Matthias Kortstiege] + * [cosmetic] use %"PRIuS instead of %zu + + [Matthias Kortstiege] + * [pvrguiinfo] silence compiler warning + + [Matthias Kortstiege] + * [pvrtimer] m_iTypeId is unsigned int + + [Matthias Kortstiege] + * [pvrtimer] remove unused variable + + [Matthias Kortstiege] + * [epginfotag] initialize members in the order they were declared + + [Matthias Kortstiege] + * [databases] silent UpdateFileDateAdded compile warnings + + [Memphiz] + * Revert "dummy commit" + + [montellese] + * don't mess with the long and short date formats defined in langinfo.xml + + [janbar] + * [PVR] fix timer deletion + + [Martijn Kaijser] + * exclude resource:// from texture caching as these are always local addons + + [Pär Björklund] + * dummy commit + + [Pär Björklund] + * Clean up ApplicationMessenger + + [ronie] + * [Re-Touched] update + + [Pär Björklund] + * Reworked initialization for win32 + + [xhaggi] + * [gui] fix modality type of skin custom dialogs + + [Anton Fedchin] + * [dx11] Fixed creating device on GPU whose driver not supports DX11 video API. + + [montellese] + * fix musicvideo artist artwork not being loaded from the musicdb (fixes #16120) + + [montellese] + * [win32] add system/ssleay32.dll to .gitignore + + [montellese] + * cosmetics: remove some trailing whitespaces + + [montellese] + * CHttpRangeUtils: don't build multipart-boundary related methods if webserver is disabled + + [montellese] + * [Makefile.in] integrate python/legacy archives into the general list + + [montellese] + * [Makefile.in] only build xbmc/interfaces/legacy/wsgi/legacy-wsgi.a if webserver is enabled + + [montellese] + * [configure.ac] only generate xbmc/network/httprequesthandler/python/Makefile if webserver is enabled + + [Kai Sommerfeld] + * [EPG] Fix init and update of EPG window. + + [hudokkow] + * [std cleanup] xbmc/playlists/ + + [hudokkow] + * [std cleanup] xbmc/profiles/ + + [hudokkow] + * [std cleanup] xbmc/settings/ + + [hudokkow] + * [std cleanup] xbmc/storage/ + + [hudokkow] + * [std cleanup] xbmc/video/ + + [hudokkow] + * [std cleanup] xbmc/view/ + + [hudokkow] + * [std cleanup] xbmc/win32/ + + [hudokkow] + * [std cleanup] xbmc/windowing/ + + [hudokkow] + * [std cleanup] xbmc/windows/ + + [hudokkow] + * [std cleanup] xbmc/ + + [uNiversaI] + * [baserenderer] make ViewModeStretch16x9Nonlin fall in range + + [Ryan Gribble] + * [pvr] Show ParentItem ".." label when displaying children of repeating timers (whilst honoring the GUI Appearance setting for this behaviour) + + [xhaggi] + * [guilib] fix dirty regions because it evaluates always to true + + [ronie] + * add Skin.ToggleDebug function + + [ronie] + * [Confluence] remove zorder + + [enen92] + * [buitins] Rename StartPVRManager and StopPVRManager to PVR.StartManager and PVR.StopManager. Marking older functions as deprecated + + [enen92] + * [builtin] Add PVR.SearchMissingChannelIcons + + [xhaggi] + * [interfaces] fix render order of addon dialogs + + [sialivi] + * [DirectoryNode] add 'All albums' option + + [Pär Björklund] + * Got rid of boost::totally_ordered from AddonVersion + + [montellese] + * webserver: support specifying the scaling algorithm in image:// transformation URLs + + [montellese] + * CTextureCacheJob: support "scaling_algorithm" option in image:// URLs + + [montellese] + * CPicture: fall back to image scaling algorithm from advancedsettings.xml if none is passed to CacheTexture() + + [montellese] + * CAdvancedSettings: add + + [montellese] + * CPicture: add possibility to specify the scaling algorithm + + [montellese] + * pictures: add CPictureScalingAlgorithm helper class + + [xhaggi] + * [guilib] renames modality enum value SYSTEM_MODAL to PARENTLESS_MODAL + + [xhaggi] + * [gui] make music/video overlay dialogs modeless + + [xhaggi] + * [gui] refactors CGUIDialogProgress::StartModal + + [xhaggi] + * [gui] refactors modality handling for dialogs + + [Matthias Kortstiege] + * [videolibrary] fix musicvideo artist browsing after e55adbd (closes #16118) + + [Matthias Kortstiege] + * [videodb] fix browsing tvshows genre/studios with masterlock enabled + + [phil65] + * [guilib] - fix missing fadelabel text (introduced with #7323) + + [uNiversaI] + * [confluence] add DefaultAddonImages.png + + [Arne Morten Kvarving] + * move weather icons to a resource addon + + [Arne Morten Kvarving] + * changed: read weather icons from a resource addon + + [Arne Morten Kvarving] + * added: support for image resource addons + + [Rainer Hochecker] + * dvdplayer: add a method to avoid requeting HTTP Header + + [BigNoid] + * [guilib] Add Container.TotalWatched and Container.TotalUnwatched + + [arnova] + * Revert "changed: Implement native Stat/Exists functions for Webdav" + + [Deniz Türkoglu] + * Use C++ cast to const char* in HTTPFile + + [Deniz Türkoglu] + * Fix sign issue in DVDPlayer + + [Deniz Türkoglu] + * Convert ternary operator to if/else + + [Deniz Türkoglu] + * Remove unnecessary/add required casting + + [Deniz Türkoglu] + * Fix string format parameters + + [Deniz Türkoglu] + * Remove deprecated register storage class + + [Deniz Türkoglu] + * Fix sign compare issues + + [Deniz Türkoglu] + * Remove unused variables and/or lessen scope + + [Deniz Türkoglu] + * Add new addons and depends to .gitignore + + [Roman Kraevskiy] + * printf call replaced by CLog::Log + + [Roman Kraevskiy] + * Mouse wheel support for X11-less linux distros (openelec) + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [Kai Sommerfeld] + * Revert "[PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures." + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Matthias Kortstiege] + * [guilib] wrapmultiline for button control + + [Matthias Kortstiege] + * [guilib] auto-width for togglebutton controls + + [Matthias Kortstiege] + * [guilib] auto-width for button controls + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [Kai Sommerfeld] + * [PVR] Timer settings dialog: Forcing 'first day' to at least today is pointless + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::CreateFromEpg: Fixed initialization of new timer's summary (m_strSummary does not contain the plot of the event to record, but a text representation of the timer's schedule) + + [Kai Sommerfeld] + * [PVR] CPVRTimerInfoTag::UpdateSummary: Add support for 'first day', fix support for 'any time'. + + [Kai Sommerfeld] + * [PVR] Timer settings: Cleanup: Removed unused variable. + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [uNiversaI] + * [cosmetics] some cleanup on spelling/capitalisation & xbmc -> kodi + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [Arne Morten Kvarving] + * WIP: nonlinear stretch 16:9 setting for 4:3 video display + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [phil65] + * [Python] add xbmcgui.Dialog().textviewer() + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [fritsch] + * AESinkPULSE: Make buffer settings more failsafe + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Marcus Wanner] + * Make kodi-send.py cwd-independent. + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Fneufneu] + * Avoid overflow in ljpeg_start(). + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + + [Pär Björklund] + * Removed default params as it made it very fragile which method actually got called + + [montellese] + * jsonrpc: fix API definition for setting's "level" + + [Anton Fedchin] + * [dx11] VideoRenderer: fix compiler warnings. + + [Anton Fedchin] + * [dx11] CGUIShaderDX: a tiny optimization - Get rid of index buffer. Now we use triangle strip topology with special ordered vertices. + + [Anton Fedchin] + * [dx11] CD3DHelper: No need to clear all 128 shader resources, clear really used only. Currently Kodi doesn't use more that 3 shader resources, but theoretically shadertoy screensaver/visualization can use up to 4 resources. + + [Anton Fedchin] + * [dx11] CD3DEffect: cosmetics. + + [Anton Fedchin] + * [dx11] WinVideoFilter: a little shaders optimizations. + + [Chris "Koying" Browet] + * FIXUP: [droid;obb] be sure the obb dir exists + + [Chris "Koying" Browet] + * FIX: [droid] broken video calibration + + [Chris Browet] + * FIX: [droid] manually download obb if store failed + + [janbar] + * [PVR] fix possible stack overflow + + [Pär Björklund] + * Missing skinsetting tag is not an error and shouldn't be treated as one, thought logging might still be useful but shouldn't be a warning as it's not really an issue + + [ace20022] + * [libexif] Add an own field for XP comments. + + [ace20022] + * [fix][libexif] Force text fields to be null-terminated. + + [ace20022] + * [libexif] Increase the possible length of a comment according to the specification. + + [ace20022] + * [fix][libexif] Fix possible buffer overrun. + + [ace20022] + * [fix][libexif] Fix mixing of file comments and exif comments. + + [ace20022] + * [fix][libexif] Prevent possible buffer overrun for XP comments. + + [Pär Björklund] + * Rework the move constructor a bit to make it safe and proper. Not runtime tested yet because of other issue + + [Olaf Hering] + * Adjust return in GetModificationDate + + [hudokkow] + * [langinfo] Remove unused code + + [Olaf Hering] + * Remove cast in CProfile::Load + + [Olaf Hering] + * [guilib]: add braces in GetLabel + + [Olaf Hering] + * Always return a CDateTime in GetModificationDate + + [Olaf Hering] + * configure.ac: update verification of shairplay + + [Pär Björklund] + * Changed method signatures to use CVariant instead of const CVariant& + + [Pär Björklund] + * CVariant fixes + + [Stefan Saraev] + * [cleanup] DVDInputStreamTV is now unused + + [Stefan Saraev] + * [cleanup][pvr] fs providers are no more + + [Stefan Saraev] + * [cleanup] remove slingbox + + [Pär Björklund] + * Added detection for Windows 10 in systeminfo + + [hudokkow] + * Drop internal HDHomeRun support + + [phil65] + * [guilib] - nuke Container.Sort InfoLabel + + [phil65] + * [guilib] add Container.SortOrder InfoLabel + + [Matthias Kortstiege] + * [guilib] fix label overlap in radiobutton control (#15854) + + [Matthias Kortstiege] + * [guilib] use textcolor from labelInfo for textboxes + + [Matus Kral] + * [CURL] xbmc/URL.cpp adapted to parse URI containing IPv6 address. + + [Olaf Hering] + * [cximage]: use integers for arithmetic in CxImage::CheckFormat + + [Olaf Hering] + * [cximage]: remove undefined operation on variable in dcr_sony_decrypt + + [Olaf Hering] + * [cximage]: remove warning about statement with no effect + + [Olaf Hering] + * [cximage]: remove undefined operation on variable + + [Razzee] + * Added dateAdded to song table for musiclibrary and ask the user to refresh musiclibrary Added the "date added" sorting to some musiclibrary views Show the date that we sort by in these views AdvancedSettings for musiclibrary can now handle dateadded like videolibrary already does Handle the extraction of the file added date in one place (for music database and video database) + + [Matthias Kortstiege] + * fix a few coverity warnings + + [phil65] + * [cosmetics] - fix method typos ("Availalbe" --> "Available") + + [Chris Browet] + * cosmetic: misplaced parenthesis + + [Kai Sommerfeld] + * [PVR] Series Recordings: Reduce PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE value, avoiding too large data structures. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Coverity. Only use dynamic_cast if you really don't know the actual type. + + [Kai Sommerfeld] + * [PVR] Series Recordings: Some minor changes requested by opdenkamp + + [Kai Sommerfeld] + * [guiinfo] Fix listitem.hastimerschedule + + [Kai Sommerfeld] + * [PVR] Series Recordings: Fix Coverity warnings + + [Pär Björklund] + * Recent merge broke project files, missing closing xml tag + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v2.0.1 + + [Matthias Kortstiege] + * [smartplaylist] fix broken genre after PR7347 (closes #16104) + + [phil65] + * [Confluence] Fix for widget labels (labels out of sync) + + [Memphiz] + * [ios/docs] - mention support for xcode6.4 and ios sdk 8.4 (verified working) + + [Memphiz] + * [ffmpeg/osx] - add --disable-securetransport to configure to prevent linkage against libsecurity_ssl (gnutls provides the functionality - but ffmpeg autodetect fails and tries to do it the appl/libsecurity_ssl way) + + [Memphiz] + * [AirTunes] - implement the progress callback and alter time and totaltime of the player accordingly + + [Memphiz] + * [PaPlayer] - allow to set time and totaltime from the outside - used for injecting the time/totaltime metadata during airtunes streaming + + [Memphiz] + * [AudioDecoder] - allow injection of TotalTime into the decoder - needed for decoders which don't have duration information (like with airtunes where the duration is set from the outside - not through the stream data) + + [Memphiz] + * [IPlayer] - add methods for injecting totaltime and time - this is needed for airtunes where we basically play an endless stream and need to inject current platime and duration of the tracks which are selected in the client + + [Memphiz] + * [AirTunes] - add support for png coverart - not only jpg + + [Memphiz] + * [airtunes] - add support for remote controlling the client via DACP + + [Memphiz] + * [network/dacp] - add subset of DACP (Digital Audio Control Protocol) implementation for usage with airtunes clients + + [Memphiz] + * [depends+win32/shairplay] - bump libshairplay to current master (contains png coverart support, dacp remote control support, progress support) - also drop all patches because there were upstreamed 100% + + [ace20022] + * [libexif] Add processing of comment tags used by Windows. + + [uNiversaI] + * [AutorunMediaJob] make hardcoded strings translatable + + [Memphiz] + * [gl/gles] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [Memphiz] + * [ios/windowing] - check the return code of glGetString - it can return 0 on error (and leads to crash if assigned to std::string afterwards) + + [hudokkow] + * [GUIWindowSystemInfo.cpp] Cosmetics + + [hudokkow] + * [System Info] Separate build date from build info + + [uNiversaI] + * [confluence] update info formatting in SettingsSystemInfo + + [montellese] + * CSkinInfo: support saving skin settings as addon data instead of in guisettings.xml + + [Matthias Kortstiege] + * [xcode] sync xcode for move sysinfo out of infomanager + + [Matthias Kortstiege] + * [videodb] cleanup dupe/obsolete code + + [Matthias Kortstiege] + * [smartplaylist] fix musicvideo grouping by artist + + [uNiversaI] + * [confluence] fix missing "Not Rated" condition + + [montellese] + * CPeripherals: update CGUIDialogPeripheralManager asynchronously to avoid deadlocks + + [Pär Björklund] + * Removed HAS_SYSINFO as it doesn't seem to be used for any platform + + [Pär Björklund] + * Moved a few functions from infomanager to sysinfo moved labels to a separate file removed a few includes to infomanager that only needs the label + + [Tobias Markus] + * Fix another instance of coverity #719001 + + [fritsch] + * FFmpeg: Bump to version 2.7.1 + + [fritsch] + * GUIInfoManager: Remove fps completely + + [fritsch] + * CodecScreen: Remove fps + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Matthias Kortstiege] + * [confluence] get rid of iCCP warnings from libpng + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [phil65] + * [guilib] DialogKeyboard: Do not register input for buttons with id >= 500 + + [Kai Sommerfeld] + * [PVR] bump PVR addons + + [Kai Sommerfeld] + * [PVR] bump PVR addon API version to 2.0.0 + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [xhaggi] + * [cosmetics] removes left-over enum WINDOW_TYPE in CGUIWindow + + [xhaggi] + * [gui] adjusts log level for the window activation refused message + + [xhaggi] + * [gui] introduce a dialog modality type to differ between modalities + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [montellese] + * fix some warnings concerning type mismatches + + [montellese] + * CAddon: support saving addon-specific user settings + + [montellese] + * CAddon: fix the documentation of SettingsToXML() + + [montellese] + * CAddon: make some settings related methods virtual + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [phil65] + * [guilib] allow Control.SetFocus(CONTAINER_ID,ITEM_INDEX) for all container types + + [Tobias Markus] + * Various cppcheck perf fixes + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [mapfau] + * Initalize vars claimed by valgrind / write classname instead 'PVR' in PVRChannelGroups:LOGDEBUG to make debugging easier + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [evilhamster] + * Prefer information from tags instead of cue files if there are one audiofile for each track and the tags contain information about artist, album and title. + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [AlwinEsch] + * [epg] Swap everything from 'std::map' to 'EPGMAP' and use auto + + [Alfredo Tupone] + * Inject CPPFLAGS (e.g. to disable FORTIFY) + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [a11599] + * [win32][fixed] Proper 24.0/60.0 Hz refresh rate in fake fullscreen mode + + [Philipp Te] + * [guilib] add $ESCVAR[] infoformat to allow escaping of variables + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [arnova] + * changed: Implement native Stat/Exists functions for Webdav + + [ronie] + * add the option to conditionally include files + + [ace20022] + * [swig] Use std::type_index instead of a homegrown implementation. + + + [Chris "Koying" Browet] + * FIX: [amc] do not fail if stream is already annexB + + [Martijn Kaijser] + * drop old music and video database upgrade logic for pre-Frodo + + [Anton Fedchin] + * [settings] AdvancedSettings: Enable DXVA HQ scalers by default. + + [Anton Fedchin] + * [videorenderers] Optimized PS rendering by removing extra copying textures. Now CYUV2RGBShader uses YUVbuffer's textures instead of copy them. + + [Shine] + * [win32] Make sure Kodi window is focussed before setting full screen + + [Anton Fedchin] + * [rendering] Fix rendering with dirty region algorithm 1 and 2 + + [Anton Fedchin] + * [settings] AdvancedSettings: Removed dx9 related settings. + + [Anton Fedchin] + * [win32/dx] Fixed segfault on feature level 9.1. + + [Anton Fedchin] + * [win32] Removed 'DirectX vendor' and 'GPU temperature' from System Info - Video + + [Anton Fedchin] + * [language.en_gb] Added new string for Checkerboard stereo mode. + + [Anton Fedchin] + * [installer] Got rid of DX9 from installation package. + + [Anton Fedchin] + * [visualization] MilkDrop: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Waveform: Rework to DirectX11. + + [Chris "Koying" Browet] + * FIX: [droid] no known working h264/hi10p h/w decoder. Exclude... + + [Anton Fedchin] + * [visualization] DirectXSpectrum: Rework to DirectX11. + + [Anton Fedchin] + * [visualization] Vortex: Rework to DirectX11. + + [Anton Fedchin] + * [addons] ScreenSaver&Visualization: Change the assignment of device property of SCR_PROPS/VIS_PROPS. (DirectX11) + + [Anton Fedchin] + * [windowing] WinSystem: Rework to DirectX11. + + [Anton Fedchin] + * [utils] Screenshot: Rework to DirectX11. + + [Anton Fedchin] + * [videosync] VideoSyncD3D: Rework to DirectX11. + + [Anton Fedchin] + * [rendering] Rework to DirectX11. + + [Anton Fedchin] + * [settings] AdvancedSettings: Added setting to switch off differed rendering. + + [Anton Fedchin] + * [SlideShowPicture] Rework to DirectX11. + + [Anton Fedchin] + * [guilib] Rework to DirectX11. + + [Anton Fedchin] + * [cores] DummyVideoPlayer: remove unused methods calls. + + [Anton Fedchin] + * [VideoRenderers] Rework to DirectX11. + + [Anton Fedchin] + * [WinVideoFilter] Rework to DirectX11. + + [Anton Fedchin] + * [dvdplayer][dxva] Rework to DirectX11. + + [Anton Fedchin] + * [win32] Changed XBMC.vcxproj to compile with Windows Kit 8.1 instead of DirectX SDK + + [Anton Fedchin] + * [win32] Added DirectX11 GUI shaders. + + [Anton Fedchin] + * [win32] Added Effects11 project to solution. + + [Pär Björklund] + * Silence warnings about forcing value to bool + + [fritsch] + * PVR: Fix endless loop + + [popcornmix] + * [omximage] Don't report failed decode of progressive jpegs as as error + + [popcornmix] + * [omxplayer] Make unsupported when ac3transcode is enabled + + [popcornmix] + * [rpi] Always add desktop resolution to supported list + + [macrule] + * Changed SDTV resolutions to be treated similarly to HDMI resolutions in SetNativeResolution. This means that the SDTV interface is powered up and set to the right mode. + + [macrule] + * Added private utility function to map a float display aspect, to the respective SDTV_ASPECT_* enum value. + + [macrule] + * Added some vc_tv_* functions that were missing in DllBCM. + + [popcornmix] + * egl: Treat unknown display aspect ratio as square pixel + + [Kai Sommerfeld] + * [PVR] bump addons (PVR API version 1.9.7) + + [Kai Sommerfeld] + * [PVR] Series recording support (incl. PVR addon API version bump to 1.9.7) + + [Kai Sommerfeld] + * [Confluence] redesign select dialog. credits @ronie + + [Kai Sommerfeld] + * [settings] Add opaque data pointer to SettingConditionCheck callback function (needed by new timer settings dialog) + + [Matthias Kortstiege] + * [videolibrary] fix sort by episodes (closes #15945) + + [janbar] + * [PVR] disable thumb extraction for pvr recordings (2) + + [Thomas Amland] + * [addons] fix segfault on invalid context item visibility condition + + [xhaggi] + * [cosmetics] removes left-over enum WINDOW_TYPE in CGUIWindow + + [xhaggi] + * [gui] adjusts log level for the window activation refused message + + [xhaggi] + * [gui] introduce a dialog modality type to differ between modalities + + [Matthias Kortstiege] + * [videodb] fetch season year based on first aired episode + + [Matthias Kortstiege] + * [addons] fix addon info not opening from context menu (closes #16087) + + [mapfau] + * [db] speedup of ResultQueries using string key reuse + + [Pär Björklund] + * Fix missing includes for SortUtils.h + + [hudokkow] + * [pvr.mythtv] Bump add-on to 2.4.0 + + [Matthias Kortstiege] + * [favourites] handle pictures via showpicture builtin + + [Sam Stenvall] + * [pvr] refactor the way information about the currently active PVR client is determined in CPVRGUIInfo. Instead of querying the current client directly we ask CPVRClients to give us a summary (SBackend) of each connected client. These summaries are safe to loop over no matter what happens to the actual clients in the mean time. Fixes trac #15942 + + [h.udo] + * [gitigonre] Another android artifact + + [h.udo] + * [libplatform] Bump to 1.0.10 + + [h.udo] + * [pvr] Bump all add-ons (libplatform update) + + [ronie] + * [Confluence] fix label width + + [Martijn Kaijser] + * bump to 16.0 alpha1 for development + + [Arne Morten Kvarving] + * added: ability to open the smartplaylisteditor for a given playlist + + [xhaggi] + * [cosmetics] sort ctor in CPVRChannelGroup + + [xhaggi] + * [pvr] fix CPVRChannelGroup::OnSettingChanged won't get called + + [Chris "Koying" Browet] + * CHG: [droid] add external storage path to initial status log + + [Chris "Koying" Browet] + * FIX: [droid] limit 4K to Shield TV + allow override + + [Martijn Kaijser] + * [pvr] bump add-ons + + [xhaggi] + * [pvr] fix: delete of empty group with an invalid id ends up in deleting the wrong group + + [montellese] + * fix some warnings concerning type mismatches + + [Chris "Koying" Browet] + * FIX: [droid] properly handle sys vol going to 0 (fixes #16069) + + [Chris "Koying" Browet] + * FIX: [droid] fix volume handling + + [Tobias Markus] + * coverity #719001: Free pCurr_dir_cache when going out of scope + + [montellese] + * mysql: always check the result of mysql_store_result() against NULL (fixes #16071) + + [xhaggi] + * [pvr] sort equal client channel numbers by name if not sub-channels + + [Zapata11] + * Added lithuanian keyboard layout + + [Martijn Kaijser] + * [lang] fix typo + + [Chris "Koying" Browet] + * FIX: [droid] prevent the os restarting us for "screenlayout" and "screensize" + + [popcornmix] + * [omxplayer] Change in interlace state is not an error in log + + [Chris "Koying" Browet] + * FIX: [droid] fix crash when restarted by system + + [Matthias Kortstiege] + * [videodb] fix yet some more query typos + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] automatic cosmetics for the en_gb language file + + [txtranslation] + * [lang] update of internal addon language files + + [Sam Stenvall] + * [pvr] bump pvr.vbox to 1.3.4 + + [mapfau] + * [pvr] get rid of fixed internal group ids + + [Matthias Kortstiege] + * [videodb] use GetNavCommon for tags + + [Matthias Kortstiege] + * [addons] force repository update in post-install/uninstall + + [fritsch] + * Wasapi: Do not probe for AE_FMT_AAC - we don't passthrough it anyways + + [arnova] + * fixed: Don't do GetLength() off-thread is it may be (b)locked by a pending read() (fixes #16046) + + [ace20022] + * [dvdplayer][fix] Initialize SelectionStream members. This fixes the issue that any external subtitle is recognized as forced. + + [balmeras] + * [libexif] Ignore invalid DMS value in GPS coordinate, and fix kodi crash due to buffer overflow with special value FFFFFF + + [Tobias Markus] + * Various cppcheck perf fixes + + [Sam Stenvall] + * [pvr] bump pvr.vbox to 1.3.3 + + [robwebset] + * Clean up the way PlayingBackgroundMedia is read + + [Sam Stenvall] + * [confluence] increase button group height in the PVR group manager dialog, fixes "Add group" being hidden + + [Matthias Kortstiege] + * [url] don't use # as separator for internal zip:// (fixes #16066) + + [h.udo] + * [pvr.wmc] Fix android lib name (fixes #16044) + + [Anton Fedchin] + * [GL] Fixed: FontTTF breaks scissor which causes bad rendering with dirty regions. + + [montellese] + * music library: don't force a rescan after update past version 35 if not needed + + [montellese] + * video library: only allow to scan sources which have a content set + + [montellese] + * video library: show "Set content" even during library scan (fixes #16061) + + [Chris "Koying" Browet] + * FIX: [droid] harden MigrateUserData + + [Chris "Koying" Browet] + * FIX: [amc] clear pending exceptions on exit + + [robwebset] + * Updage Confluence hooks for TvTunes v5.0.0 + + [Chris "Koying" Browet] + * FIX: [amc;hevc] let CBitstreamConverter decide + + [Kai Sommerfeld] + * [pvr] bump pvr.hts to 2.1.12 + + [Memphiz] + * [osx/cocoa] - revert 0f32a2f5d4fb1077def8c581098aa4385e8d0a67 (it is prone to deadlocking because it blocks the gui/main thread) and instead trust in the openglcontext which is tracked by windowing. Fixes deadlock introduced by PR #7143 + + [Memphiz] + * [windowing/osx] - expose the current NSOpenGLContext tracked by windowing to the outside via a getter + + [Chris "Koying" Browet] + * FIX: [droid] return type mismatch when launching ext app + + [Anton Fedchin] + * [builtins] do not restart visualization if it has no settings. + + [Anton Fedchin] + * [keymaps] Use Addon.Default.OpenSettings instead of ActivateWindow for visualization settings. + + [Anton Fedchin] + * [win32][curl] Using CEnvironment::unsetenv() instead of SetEnvironmentVariable. It's proper way to unset environment variable. + + [Martijn Kaijser] + * [lang] Remove line breaks used in dialogs + + [Kai Sommerfeld] + * [pvr] bump pvr.hts to 2.1.11 + + [Matthias Kortstiege] + * [videodatabase] fix invalid queries (closes #16054) + + [evilhamster] + * Added support for the musicbrainz "ARTISTS" tag in id3v2, ape, xiph. + + [Rainer Hochecker] + * dvdplayer: fix vc1 hwaccel like vdpau - work around an ffmpeg issue + + [BigNoid] + * [lang] Fix overlapping kaitoast messages + + [phate89] + * Honor "ignorethewhensorting" + + [Sam Stenvall] + * [pvr] bump pvr.hts to 2.1.10 + + [Anton Fedchin] + * [win32] Fixed libcurl initialization when the env variable OPENSSL_CONF points to existing openssl.conf file. + + [Rainer Hochecker] + * dvdplayer: fix ff/rw after ea6e82997bd6087a7beff1be0ef9b34847fe3cc7 + + [uNiversaI] + * [confluence] add missing video codec flags + + [Sam Stenvall] + * consider a CURLINFO_RESPONSE_CODE of zero a failed request + + [Sam Stenvall] + * [pvr] bump pvr.vbox to v1.3.2 + + [fape] + * [Confluence] fix long filenames in subtitles search&download dialog header + + [ace20022] + * [cosmetics] Fix code formatting of ScanArchiveForSubtitles. + + [ace20022] + * [subs][perf] Make ScanArchiveForSubtitles more performant: - Rearrange the list of subtitle extension - Add break/continue to loops + + [Rainer Hochecker] + * dvdplayer fix sorting of subtitles - fixes trac 16038 + + [popcornmix] + * [utils] Disable fast_memcpy which is slower than memcpy + + [ace20022] + * [Fix][subs] Fix checking zip archives in zip archives. + + [Ryan Saunders] + * Improve Win32 build/download scripts. This change adds support for a KODI_MIRROR environment variable which, if set, overrides the default mirror URL of http://mirrors.kodi.tv. In the event that a package download fails, DownloadBuildDeps.bat will now suggest that the user manually choose an alternate mirror and re-run. + + [arnova] + * changed: On Curl retry perform a progressive Sleep() for tries > 1 to improve succesful recovery + + [arnova] + * fixed: Don't call select() to sleep on windows as it doesn't work without a dummy socket + + [Thomas Amland] + * cleanup kai toast icon logic. use only one control + + [Martijn Kaijser] + * bump to 15.0 rc1 + + [ronie] + * add the option to conditionally include files + + + [Martijn Kaijser] + * bump to 15.0 rc1 + + + [Martijn Kaijser] + * [addons] sync with repo + + [Chris "Koying" Browet] + * FIX: [droid] proper audio focus management + + [Rainer Hochecker] + * renderer: fix subtitle (text) positions for alignment outside video, consider height of text + + [Pär Björklund] + * make sure that we don't set values when there was no node, we have no idea what will be in value if that happens. closes #16040 + + [Rainer Hochecker] + * renderer: fix overlapping subtitles for alignments other than fixed + + [Rainer Hochecker] + * renderer: fix mixed-up rd/rv after fd53c703d96d9beec2ccf4e5982bd91aafc29be2, resulted in wrong subtitle positions + + [Chris "Koying" Browet] + * ADD: [droid] standard refreshrate switcher (>= api 21) + + [Chris "Koying" Browet] + * FIX: [aml] remove obsolete audio latency hack + + [Martijn Kaijser] + * [android] hide certain settings which are non functional + + [ace20022] + * [log] Reduce log spam from ScanArchiveForSubtitles. + + [Sam Stenvall] + * [pvr] bump addons + + [popcornmix] + * [players] Remove not working SetPriority calls + + [AlwinEsch] + * [epg] Remove usage of 'using namespace std' + + [xhaggi] + * [seek] fix: reset seek size after seeking + + [AlwinEsch] + * [epg] Sort included files alphabetical + + [xhaggi] + * [video] de-duplication/cleanup of related database tables + + [Tobias Markus] + * Followup fix for CID1272226 + + [xhaggi] + * [database][mysql] insert char set for CREATE TABLE .. SELECT syntax between create table and select clause + + [xhaggi] + * [video] limit length of name to 255 for actor, country, genre etc. + + [Tobias Markus] + * Remove const keyword from CDVDInputStreamPVRManager::GetSelectedChannel() Fixes CID 1272226 + + [AlwinEsch] + * [pvr] Remove not needed trailing spaces + + [xhaggi] + * [rfc][json-rpc] use setter of CVideoInfoTag + + [xhaggi] + * [video] fix leading/trailing whitespaces in video details + + [Martijn Kaijser] + * [cosmetics] improve English strings + + [AlwinEsch] + * [epg] Remove call a bit + + [arnova] + * changed: Properly exit screensaver on shutdown (fixes #16028) + + [Memphiz] + * [windowing/osx] - check the pointer of the displayname before accessing the string object - fixes bad access when turing off the TV while Kodi is running + + [Kai Sommerfeld] + * Revert "[pvr] changed: ask if the user wants to disable libCEC if no TV couldn't be found for 30 seconds" + + [Sam Stenvall] + * [pvr] matching EPG tag pointers means an absolute match between a timer and an EPG tag + + [Chris Browet] + * FIX: [aml;droid] only bother with REALVIDEO intent if the permissions are right + + [Chris "Koying" Browet] + * ADD: [droid] generically use hdmi resolution (4K) + + [Chris "Koying" Browet] + * ADD: [jni] CJNISystemProperties + + [Kai Sommerfeld] + * [PVR] Fix crash in PVR::CPVRClient::GetDriveSpace, take two (Trac #15942) + + [MilhouseVH] + * [videodb] Add missing argument on JSON filter PrepareSQL() + + [Martijn Kaijser] + * get rid of g_localizeStrings in Dialogs + + [xhaggi] + * [pvr] return empty info label for season and episode less than 1 + + [Martijn Kaijser] + * combine split strings into a single string and only use the textbox in dialogs + + [ace20022] + * [Fix][subs] Don't try to read vob sub files (without a corresponding idx file) like text based sub files. + + [xhaggi] + * [gui] unify method overloads in CGUIDialogYesNo + + [xhaggi] + * [cosmetics] format and add docs in CGUIDialogYesNo + + [uNiversaI] + * [binary addons] bump audio decoders + + [Chris "Koying" Browet] + * FIX: [droid] re-establish immersive mode if it was reset + + [ronie] + * [re-touched] update + + [Pär Björklund] + * addon.xml was written as ucs2 with bom as that is the default output from powershell, changed it to specify utf8 without bom + + [Kai Sommerfeld] + * [PVR] Fix crash in PVR::CPVRClient::GetDriveSpace (Trac #15942) + + [ronie] + * add new pvr infolabels + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] automatic cosmetics for the en_gb language file + + [txtranslation] + * [lang] update of internal addon language files + + [wsnipex] + * [binary addons] bump audio encoders + + [montellese] + * CLangInfo: don't detect a language migration from "English" to "resource.language.en_gb" as a fallback mechanism + + [Pär Björklund] + * Rebuild curl with openssl support instead of windows schannel to fix the deadlock on win32. Rebuilt using latest curl 7.42.1 and openssl 1.0.2a + + [ace20022] + * Revert "[Fix][subs] Don't try to read a vob sub file without a corresponding idx file." + + [uNiversaI] + * revert ecea1fff0 + + [Matthias Kortstiege] + * Revert "[guilib] fadelabel not reading scroll tag" + + [wsnipex] + * [cmake] removed multi-arch again, its not needed anymore + + [wsnipex] + * [binary addons] use kodi core install paths by default + + [xhaggi] + * [gui] render dialog teletext always on top + + [arnova] + * changed: When emptyng Curl's overflow buffer, shrink overflow buffer + tweaks + + [Rainer Hochecker] + * dvdplayer: avoid seek to sync after unpause + + [Ben Avison] + * Fix for font corruption + + [Rainer Hochecker] + * dvdplayer: sanity checks for current time + + [fritsch] + * RenderManager: Fix Gui Layer Update + + [fritsch] + * IMX: Fix 3D rects v20 + + [fritsch] + * IMX: Reorder in initialization list + + [Kai Sommerfeld] + * [cec] Fix return value handling logic for CEC_TV_PRESENT_CHECK_TIMEOUT dialog. + + [ace20022] + * [Fix] Fix a std::out_of_range exception when the sum of seek steps is zero. + + [Rainer Hochecker] + * dvdplayer: do not signal started until output of first frame + + [hrotkogabor] + * PinnacleSysPCTVRemote remote keys for lirc 0.9 + + [wsnipex] + * [depends] fix Xrandr pkg-config includes on linux + + [xhaggi] + * [pvr] fix CPVRDirectory::Exists always returns false (fixes 15997) + + [Max Kellermann] + * configure.ac: detect libxrandr with pkg-config + + [Max Kellermann] + * WinSystemX11: make XRandR mandatory + + [Max Kellermann] + * tools/depends/target/Makefile: add links to X RandR pkg-config files + + [Max Kellermann] + * configure.ac: simplify $host_vendor=apple special cases + + [Joseph A. Yasi] + * [powermanagement] Choose powermanager with the most features on Linux. + + [ace20022] + * [Fix][subs] Don't try to read a vob sub file without a corresponding idx file. + + [montellese] + * upnp: fix hiding watched tvshows and seasons + + [montellese] + * upnp: fix watched overlay for tvshows and seasons + + [Martijn Kaijser] + * [addons] update scrapers + + [Martijn Kaijser] + * [droid] Bump targetSdkVersion to Android 5.1 (API 22) + + [montellese] + * show the startup dialogs informing about the fallback language and the migrated userdata once the user interface is really ready for usage + + [montellese] + * added GUI_MSG_UI_READY message to notify everyone when the user interface is ready for usage + + [uNiversaI] + * [strings] info -> information + + [Martijn Kaijser] + * Combine multiline strings into one string which will be placed in the textbox input. Also add additional comments in strings.po + + [Pär Björklund] + * fixed gtest build that broke with kissfft + + [uNiversaI] + * [confluence] cleanup unused files + + [uNiversaI] + * [sourcesDirectory][Util] separate DefaultDVDRom from defaultDVDFull + + [uNiversaI] + * [confluence] add new & update Default* icons + + [Thomas Amland] + * fix kaitoast dialog loading the previous icon instead of the default when no icon or type is passed + + [ace20022] + * [win32] Fix crash after 8e1f62cc1b80918d723edc40e7b2a903cbef96e2 due to cdio logging. + + [Matthias Kortstiege] + * [addons] fix toast dialog showing wrong icon on install errors + + [the-hydra] + * Fixed makefile ARCH install bug + + [Matthias Kortstiege] + * [subs] skip directory cache read to ensure we're picking up subtitles (fixes #15989) + + [Martijn Kaijser] + * always use the DialogOK with the textbox input instead of separate lines + + [ace20022] + * [windows] Cleanup includes. + + [ace20022] + * [windowing] Cleanup includes. + + [ace20022] + * [win32] Cleanup includes. + + [ace20022] + * [view] Cleanup includes. + + [ace20022] + * [video] Cleanup includes. + + [ace20022] + * [utils] Cleanup includes. + + [ace20022] + * [storage] Cleanup includes. + + [ace20022] + * [settings] Cleanup includes. + + [ace20022] + * [rendering] Cleanup includes. + + [ace20022] + * [pvr] Cleanup includes. + + [ace20022] + * [programs] Cleanup includes. + + [ace20022] + * [profiles] Cleanup includes. + + [ace20022] + * [powermanagement] Cleanup includes. + + [ace20022] + * [playlists] Cleanup includes. + + [ace20022] + * [pictures] Cleanup includes. + + [ace20022] + * [peripherals] Cleanup includes. + + [ace20022] + * [music] Cleanup includes. + + [ace20022] + * [listproviders] Cleanup includes. + + [ace20022] + * [interfaces] Cleanup includes. + + [ace20022] + * [input] Cleanup includes. + + [ace20022] + * [guilib] Cleanup includes. + + [ace20022] + * [filesystem] Cleanup includes. + + [ace20022] + * [dialogs] Cleanup includes. + + [ace20022] + * [dbwrappers] Cleanup includes. + + [ace20022] + * [cdrip] Cleanup includes. + + [ace20022] + * [addons] Cleanup includes. + + [ace20022] + * [epg] Cleanup includes. + + [ace20022] + * [app] Cleanup includes. + + [Trent Nelson] + * Pivos: Don't use dir cache on Android App list + + [Chris "Koying" Browet] + * CHG: [droid;kbd] log ignored keys + + [Chris "Koying" Browet] + * FIX: [droid;sound] restore volume after passthrough + + [Chris "Koying" Browet] + * FIX: [droid] possible fix for localtime crash + + [Chris "Koying" Browet] + * ADD: add a fallback site for internet detection + + [Martijn Kaijser] + * [string] several grammar fixes + + [Martijn Kaijser] + * [strings] fix wrong setting description + + [hudokkow] + * [pvr] Bump filmon, dvblink and vbox + + [Rainer Hochecker] + * [pvr] bump vnsi + + [uNiversaI] + * [strings] fix curly brakets and rename setting + + [xhaggi] + * [input] drop fallback window configuration for fullscreeninfo dialog + + [fritsch] + * WinSystemX11: Properly initialize fps value - it might not be set at all + + [Michael Cronenworth] + * Always declare gnu89 inline standard + + [Sam Stenvall] + * [pvr] bump pvr.vbox + + [Memphiz] + * [osx/windowing] - properly track lastdisplay id when window is moved between screens (else GetCurrentScreen might return the wrong cached index) + + [Memphiz] + * [osx/DisplaySettings] - if strOutput in the resolution info is not empty - show this as displayname in the settings ui + + [Memphiz] + * [osx/windowing] - set screen name in resolution infos + + [Memphiz] + * [osx/windowing] - track current refreshrate of the screen and make sure rest of the system is notified via XBMC_RESIZE for all use cases (fullscreen1 to fullscreen1, fullscreen1 to windowed1, windowed1 to windowed2, windowed1 to fullscreen2, fullscreen2 to windowed1) + + [Memphiz] + * [ApplicationMessenger] - add TMSG_VIDEORESIZE for beeing able to notify resize from non application thread + + [Memphiz] + * [osx/windowing] - update resolutions when plugging/unplugging displays + + [Memphiz] + * [osx/windowing] - don't get the display_id from the current window but obey the screenIdx parameter when querying the current resolution of a screen (else we always query the first screen even if we want to get the resolution of the newly attached second screen for example) + + [Memphiz] + * [osx/videosync] - call our UpdateClock with our hostcounter, but calc vblank with the corevideo hostcounter (at the end they might be the same) + + [Memphiz] + * [osx/videosync] - implement RefreshChanged - allows to pickup new videoref after changing displays during playback + + [Memphiz] + * [osx/videosync] - move calls to displaylink init/deinit into the vsync thread and make sure that init is only called once the display reset is done - same as GLX does + + [Memphiz] + * [osx/cocoa] - ensure that gl context is fetched via mainthread (fixes wrong vsync on external displays) + + [Rainer Hochecker] + * dvdplayer: fix unused variable after e1b2c94049fa34bc9de7d067ae2206643fe73f63 + + [Martijn Kaijser] + * [strings] add files where string id is used + + [montellese] + * CLocalizeStrings: unify fallback language handling (fixes skin strings loading) + + [Rainer Hochecker] + * videorefclock: DRM - listen to refresh change events + + [Rainer Hochecker] + * X11: set refresh rate in gfx context, fixes fps for windowed mode + + [Rainer Hochecker] + * guilib: add method for setting fps, currently fps defaults to 60hz in windowed mode which is wrong + + [uNiversaI] + * emergency fix strings bracket on tag wrong way around + + [uNiversaI] + * emergency fix: missing slash on close [/B] tag + + [montellese] + * addons: fix fallback language handling for metadata + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] automatic cosmetics for the en_gb language file + + [uNiversaI] + * [skin strings] fix remnant strings issues + + [uNiversaI] + * [strings] take 3 - capitalization & other string fixes + + [h.udo] + * [PVR] Bump add-ons to fix debian packaging + + [Rainer Hochecker] + * dvdplayer: more ff/rw fixes + + [txtranslation] + * [lang] update of internal addon language files + + [Matthias Kortstiege] + * [stacking] skip folder stacking entirely in case no patterns available + + [wsnipex] + * [depends] fix (lib)platform build + + [Rainer Hochecker] + * renderer: fix wrong subtitle position when not fullscreen + + [hudokkow] + * [audiodecoders] update to use libplatform + + [Chris "Koying" Browet] + * FIX: [stf;3D] stagefright is no longer flipped in Y + + [Rainer Hochecker] + * ffmpeg: fix 8ch audio conversion on Windows + + [Martijn Kaijser] + * bump to 15.0 rc1 + + [Thomas Amland] + * [sounds] use a better name than 'default' for sounds bundled with skin + + [Thomas Amland] + * [sounds] dont allow 'skin default' option to be selected when active skin doesnt provide sounds + + [Martijn Kaijser] + * [stings] Improve sentence for CEC settings + + [Pär Björklund] + * A possible fix for looping over a modified vector + + [Tobias Markus] + * Fix coverity #1287129 + + [Lars Op den Kamp] + * rebuilt libcec against the latest platform lib + + [Lars Op den Kamp] + * bump libplatform to 1.0.9 and include xbmc-addons.include when building it in depends + + [h.udo] + * [pvr] bumps addons to use libplatform + + [Kai Sommerfeld] + * Fixed CGUIControlButtonSetting::Update handling for CSettingAction + + [c3n] + * Added KEY_PLAYCD and KEY_PAUSECD for linux support of bluetooth headphone buttons + + [Chris "Koying" Browet] + * FIX: [audiotrack] proper detection of supported sample rates + + [Chris "koying" Browet] + * FIX: [gles] don't compile BOB OES shader if not supported + + [xhaggi] + * [cosmetics] corrects format + indentation + + [xhaggi] + * [gui] force activate fullscreen window with CApplication::SwitchToFullScreen() + + [xhaggi] + * [gui] force activate window screen calibration in CGUIDialogVideoSettings + + [Tobias Markus] + * Fix coverity #719001 + + [Arne Morten Kvarving] + * fix string + + [Memphiz] + * [rfft] - implement d'tor + + [xhaggi] + * [gui] introduce new force window activation which do not check for active modals + + [smallint] + * [imx] RGB -> BGR for RenderCapture + + [Philipp Te] + * [Confluence] - improved value order for "rating" variable + + [Memphiz] + * [jenkins] - make building of binary addons verbose for getting more compelte build output + + [uNiversaI] + * [README] fix typo coding -> code + + [uNiversaI] + * [contributing.md] some cleanup and updating + + [Anton Fedchin] + * [win32] WinRenderer: Fix possible memory leak. + + [Philipp Te] + * [Confluence] - fix some invalid values / fonts + + [Thomas Amland] + * [configure] fix python version check and add py3k check + + [Thomas Amland] + * update ax_python_devel.m4 to rev 17 + + [Memphiz] + * [fft/viz] - replaced our buggy fft implementation with rfft + + [Memphiz] + * [fft] - added kissfft based rfft implementation and unit tests for it + + [popcornmix] + * [mmalrenderer] Fix for stereo view modes + + [popcornmix] + * [renderer] Fix for number of surfaces being passed to codec + + [arnova] + * changed: Improve HTTP dir error logging + + [arnova] + * changed: Prevent Curl log spam with Webdav + only retry without range with http error 416 + + [Memphiz] + * [contrib] - added contrib dir and kissfft sources + + [Thomas Amland] + * [addons] add progress dialog for repo updates + + [Thomas Amland] + * [extendedprogressbar] fix possible division by zero + + [Thomas Amland] + * [ProgressJob] add HasProgressIndicator + + [Thomas Amland] + * [ProgressJob] let ShouldCancel update progress in non-modal dialogs + + [Thomas Amland] + * [addons] remove unused code + + [uNiversaI] + * [strings] capitalized second/third word + + [uNiversaI] + * [strings] typos/misspellings/cleanup and cosmetics. + + [Thomas Amland] + * [addons] add icon for info provider group + + [Stephan Raue] + * [AML] add support for aml-linux.xml and aml-android.xml settings file + + [Memphiz] + * [keymapping/joystick] - fix the annoying error logging which is logged in accident because altname tags are tried to be treated like mappings + + [smallint] + * IMX: Attempt to revert last buffer alignment change and to improve it + + [Memphiz] + * [KeyMapping/Joystick] - fix regression introduced in https://github.com/xbmc/xbmc/pull/5624 - allow to overwrite joystick mappings with user keymaps again + + [Hofi] + * OS X Kodi.app script target transformed into a real app bundle target + + [Rainer Hochecker] + * vaapi: prevent from draining msg queue if we ran out of surfaces + + [popcornmix] + * [mmalcodec] Limit submitted video frames. + + [popcornmix] + * [SinkPi] Handle multichannel layout more like OMXAudio + + [Memphiz] + * [keymaps/touchscreen] - add touchscreen mappings for WindowScreenCalibration + + [Memphiz] + * [WindowScreenCalibration] - make it touch gesture compatible + + [Rainer Hochecker] + * dvdplayer: fix calc for frame dropping when going ff + + [popcornmix] + * [mmalrenderer] Remove release thread - it is no longer required + + [popcornmix] + * [mmalrenderer] Add shared lock around MMAL operations + + [popcornmix] + * [mmalcodec] Add shared lock around MMAL operations + + [popcornmix] + * [mmalcodec] Remove DVDVideoCodecMMAL wrapper + + [popcornmix] + * [mmal] Separate the buffers from the decoder so decoder can be destroyed first + + [popcornmix] + * [mmalrenderer] Separate mmal and renderer configured flags + + [popcornmix] + * [mmal] Move the image pool from decoder to renderer + + [popcornmix] + * [mmal] Add some sanity checks to mmal flags + + [popcornmix] + * [mmal] Enable zero copy + + [popcornmix] + * [mmalcodec] Handle resolution change from callback + + [popcornmix] + * [mmalcodec] Return mmal buffers explicitly + + [arnova] + * changed: Log in case script does not exist + + [popcornmix] + * [mmalcodec] Remove dropping logic. It only seems to make things worse + + [montellese] + * media library: fix lost filter path due to re-creating the path history (fixes #15746) + + [montellese] + * CDirectoryHistory: make sure to set the filter path even if the path is already in the history + + [Sascha Kuehndel (InuSasha)] + * [skin.confluence] fix overlapping mute-bug in FullscreenVideo/OSD + + [popcornmix] + * renderer: Use a structure for information passed from renderer to codec + + [popcornmix] + * [pi/players] Make use of new scheme to submit DTS timestamps + + [wsnipex] + * [cmake] add libplatform to kodi-platform depends + + [Rainer Hochecker] + * Revert "[ActiveAE] - ActiveAESink: Change several LOGNOTICE to LOGDEBUG to reduce kodi.log "spamming"." - settings are not loaded at this time and debug logs go to nirvana + + [Hofi] + * Fixed OS X i386 Xcode builds on x86_64 build machines + + [fritsch] + * IMX: Fix path to edid on default imx kernel + + [Martijn Kaijser] + * update re-Touched skin + + [fritsch] + * SysfsUtils: don't create files when writing values - silence warnings + + [Rainer Hochecker] + * dvdplayer: fix display time after 43b6cf683abf16bc41e9b7f624a678c285c85c97 + + [Rainer Hochecker] + * addons: pvr and audiodecoder are optional addons, disable by default + + [uNiversaI] + * [README.pvr] update/point to compile procedures + + [uNiversaI] + * [README.linux] update/cleanup - keep up with current code + + [uNiversaI] + * [remote] add support to delete in MyPictures via remote + + [Anton Fedchin] + * [win32] Fix: CWinIdleTimer::StartZero - do not set ES_SYSTEM_REQUIRED and ES_DISPLAY_REQUIRED if DPMS is active. + + [Arne Morten Kvarving] + * fixed: make sure we don't match a substring of an extension or a mime type + + [Pär Björklund] + * Fixed msg 31117 to match 31116 + + [uNiversaI] + * [strings] fix capitalized second/third word + + [hudokkow] + * Ignore android build artifact + + [John Rennie] + * Allow uppercase input via SMS + + [Philipp Te] + * Control.cpp: remove trailing whitespaces + + [Philipp Te] + * Python: ControlList - add ALL items to the list + + [arnova] + * Revert "[davfile] use PROPFIND for Stat() and Exists()". Proper fix will follow later. + + [xhaggi] + * [messenger] fix wrong parameter usage for TMSG_GUI_WINDOW_CLOSE + + [xhaggi] + * [addons] fix launch addon from within CGUIDialogAddonInfo + + [Max Kellermann] + * configure.ac: pass $CFLAGS to $CC in XB_FIND_SONAME + + [Max Kellermann] + * configure.ac: do Darwin specific check only on Darwin + + [ronie] + * [Confluence] fix misaligned date label + + [Memphiz] + * [cmake] - only evaluate the sudo check on linux. On darwin with cmake 2.8.12 the execute_process with the multiple commands inside doesn't seem to work (it detects that it needs sudo and so it doesn't install into the addons dir). Bumping to cmake 3.2.2 was an other solution which made it work but bumping cmake is considered to dangerous at this stage. Fixes missing addons on ios and osx builds. + + [Chris "koying" Browet] + * FIX: [sysfs] do not try to create files + + [Sam Stenvall] + * [pvr] change "recording deleted" to "timer deleted" to avoid confusion + + [Stephan Raue] + * [AML] fix sysfs path for permissions check + + [Lars Op den Kamp] + * [cec] bump to libCEC 3.0.0 + + [Chris "Koying" Browet] + * FIX: [gles;font] do not clip rotated text + + [arnova] + * fixed: Don't try to delete empty filename + + [Sascha Kuehndel (InuSasha)] + * [Skin] optimitation for picons in livetv many picons have transparent background and an other dimention as cover images. - no border around picon in fullscreen - center picon vertical, and adjust vertical position + + [Garrett Brown] + * [cosmetic] Debug log: fix typo in units + + [Rainer Hochecker] + * dvdplayer: make sure not to block more than 50ms in renderer when ff/rw + + [Rainer Hochecker] + * dvdplayer: make sure not to display frames with pts > pts at screen when rw + + [Rainer Hochecker] + * dvdplayer: use time of frame on screen for displayed time + + [ronie] + * [Confluence] make button focusable with a mouse - fixes #15955 + + [Violet Red] + * Fix: Queue item not working for music videos + + [Chris "Koying" Browet] + * FIX: [droid] tweak storage stat display + + [Chris "Koying" Browet] + * FIX: [droid] rework storage provider + + [uNiversaI] + * [resource.ui.sounds.confluence] give distinguishing name and add icon + + [Martijn Kaijser] + * bump to 15.0 beta2 + + [Sam Stenvall] + * [pvr] change the way the "recording deleted/completed" message is determined. Instead of looking at timestamps we look at the last known state of the timer, which is way more reliable. + + [phate89] + * Fix series optical media files + + [taxigps] + * add advanced setting assfixedworks + + [phate89] + * Honor episode bookmarks in bd simple menu + + [montellese] + * upnp: fix renderer's PlayMedia() + + [Daniel] + * Add romanian keyboard layout + + [Matthias Kortstiege] + * [videodb] consider removable drives when checking for matching source during library cleanup + + [Matthias Kortstiege] + * [guilib] fadelabel not reading scroll tag + + [montellese] + * upnp: add a setting to allow users to enable looking for external subtitles in the ContentDirectory implementation + + [montellese] + * upnp: only look for and provide external subtitles for players and renderers + + [montellese] + * upnp: introduce UPnPService and pass them to BuildObject() + + [montellese] + * upnp: cosmetics in UPnPInternal.h/cpp + + [Matthias Kortstiege] + * [recentlyadded] no need to fetch artist separately + + [Arne Morten Kvarving] + * added: allow setting connection timeout for curl urls through a protocol option + + [popcornmix] + * alsalib: Build with enable-shared + + [NedScott] + * Allow smaller minimal subtitle size in settings.xml + + + [uNiversaI] + * [resource.ui.sounds.confluence] give distinguishing name and add icon + + [Martijn Kaijser] + * bump to 15.0 beta2 + + + [Martijn Kaijser] + * update splash image for beta + + [hudokkow] + * [pvr] Add new pvr.stalker add-on + + [Rainer Hochecker] + * ActiveAE: slightly reduce buffer size + + [xhaggi] + * [seekhandler] use only the first step forward/backward for a seek without a delay + + [xhaggi] + * [seekhandler] refactors GetSeekSeconds() to not update member m_seekStep + + [xhaggi] + * [seekhandler] don't use process roundtrip for SeekSeconds() + + [xhaggi] + * [seekhandler] no need for member m_performingSeek as we use locks + + [popcornmix] + * [mmalrenderer] Fix initialisation of m_format in init_vout + + [Pär Björklund] + * curl uses fputs to write the header for it's cookie file + + [Sam Stenvall] + * [pvr] copy some group properties immediately when the group is loaded from the database, otherwise the new group will be marked as "changed" a bit further down which causes all groups to be persisted every time the PVR manager starts + + + [wsnipex] + * [linux] install UseMultiArch.cmake file + + [Brandon McAnsh] + * [droid;packagaing] Remove non-relevant comment + + [Anton Fedchin] + * [pictures] SlideShowPicture: fix texels to display only filled part of texture instead of displaying whole texture. + + + + [uNiversaI] + * [confluence] fonts, update licencing/copyright. + + [uNiversaI] + * [confluence] update roboto fonts + + + [xhaggi] + * [seekhandler] get rid of CGUIInfoManager dependency + + [xhaggi] + * [seekhandler] get rid of inaccurate seek size percent calculation + + [Anton Fedchin] + * [win32] CLog: Do not use FlushFileBuffers after each write to file which causes unnecessary performance penalties. + + [Rainer Hochecker] + * player: implement SeekTimeRelative, disable accurate seeking for relative seeks + + + + [Thomas Amland] + * [addons] lazy load translated context item label + + [Rainer Hochecker] + * videorefclock: fix deadlock in glx method + + [Thomas Amland] + * [addons] fix multiple edge cases of pre/post-(un)installing not working correctly for services/context items + + [Thomas Amland] + * [addons] move enabling/disabling responsibility out of database to manager + + [Thomas Amland] + * [addons] remove unused IsAddonInstalled method + + [Thomas Amland] + * [addons] remove dead code + + [wsnipex] + * [binary addons] use multi arch install paths + + [wsnipex] + * [configure] properly set multi arch kodi libdir in kodi-config.cmake + + + [Rainer Hochecker] + * dvdplayer: add missing msg handler for GENERAL_SYNCHRONIZE + + [Rainer Hochecker] + * dvdplayer: fix crash caused by GENERAL_SYNCHRONIZE messages + + [uNiversaI] + * [English language] typo capitalized second word + + [ronie] + * [re-touched] skin update + + [xhaggi] + * [keymaps] map ReloadKeymaps to shift+control+k and ToggleDebug to shift+control+d + + [NedScott] + * [keymaps] replace smallstepback with built-in Seek(-7) + + [ace20022] + * [AudioEngine] Cleanup includes. + + [ace20022] + * [DllLoader] Cleanup includes. + + [ace20022] + * [cores] Cleanup includes. + + [ace20022] + * [VideoRenderers] Cleanup includes. + + [ace20022] + * [PlayerCoreFactory] Cleanup includes. + + [ace20022] + * [ExternalPlayer] Cleanup includes. + + [ace20022] + * [paplayer] Cleanup includes. + + [ace20022] + * [dvdplayer] Cleanup includes. + + [montellese] + * jsonrpc: replace static Addon.Types type with dynamically created one to fix missing addon types + + [Sam Stenvall] + * add pvr.vbox (new PVR addon) + + [Rainer Hochecker] + * AE: fix init of resampler (remapper) after flush + + [Andrew Fyfe] + * FIX: update link between movie and tv shows when saving a movies details + + [Thomas Amland] + * [addons] dont show addons from disabled repos in 'All repositories' + + [xhaggi] + * [settings] adjusts seek steps default configurations + + [Memphiz] + * [input/touch] - when translating mapped touch events don't loose the actionstring so that builtin functions can be used. - fixes #15245 + + [xhaggi] + * [gui] move check of active modals before opening a new window from CBuiltins to CGUIWindowManager + + [Thomas Amland] + * [language] fix unescaped double quotes + + [Pär Björklund] + * Don't treat smb connections to same machine as a local path + + [Ryan Gribble] + * [pvr] Bump pvr.wmc to version 0.5.3 (PVR API 1.9.6) https://github.com/kodi-pvr/pvr.wmc/commit/37b4b292d56885489aa8949bd70b54babb41b898 + + [Rainer Hochecker] + * dvdplayer: do not check buffering levels while in dvd menu + + [fritsch] + * Application: Show passthrough indicator in passthrough mode + + [ronie] + * [Confluence] add DefaultAddonUISounds.png + + [h.udo] + * [VideoSyncIos.h] Typo + + [Rainer Hochecker] + * AE: only push valid buffers to m_discardBufferPools, fix segfault on close right after open of stream + + [Chris "Koying" Browet] + * FIX: passthrough volume warning no longer showed + + [Matthias Kortstiege] + * [switchplayer] fix multiple ghost choices in contextmenu + + [Rainer Hochecker] + * dvdplayer: proper flush when triggering resync after a stall + + [Matthias Kortstiege] + * [video] no need to re-fetch (and stack) directory in case we already know about it + + [ronie] + * [Confluence] last updated label + + [Shine] + * Don't delay subtitles by display latency + + [Thomas Amland] + * addonbrowser: change 'Required Dependencies' to just 'Dependencies'. Required sort of implied + + [Thomas Amland] + * addonbrowser: list 'all repositories' on top. regression after refactor + + [Thomas Amland] + * addonbrowser: disable broken/foreign filters outside of repository + + [Thomas Amland] + * addonbrowser: add categories (and 'all') to 'my addons' + + [Thomas Amland] + * addonbrowser: make internal functions static + + [Thomas Amland] + * addonbrowser: remove 'system addons' group. merge with my/deps + + [Thomas Amland] + * addonbrowser: hide info provider group if empty + + [Thomas Amland] + * addonbrowser: hide orphaned node if empty + + [Thomas Amland] + * addonbrowser: improve performance of orphan filtering + + [Thomas Amland] + * addonbrowser: move the more 'advanced' features to a manage sub-directory + + [Thomas Amland] + * addonbrowser: improve 'running addons'. check with script invocation manager if service is actually running + + [Thomas Amland] + * [infomanager] add listitem.endtime support for video items + + [Thomas Amland] + * addonbrowser: add 'Updated' window property containing the last datetime repositories was checked for updates + + [montellese] + * videodb: add a delete trigger for the files table + + [Matthias Kortstiege] + * [videodatabase] fix 'replace file names with library titles' not working for episodes in directories + + [Glenn-1990] + * [confluence] shrink dialog as we have less items now + + [Rainer Hochecker] + * dvdplayer: reduce time for initial audio sync + + [popcornmix] + * [mmalcodec] Move port format setup into init_vout + + [popcornmix] + * [mmalrenderer] Move dec_input_port_cb into class + + [popcornmix] + * [mmalcodec] Remove ReturnBuffer function + + [popcornmix] + * [mmalcodec] Explicitly init variables + + [popcornmix] + * [mmal] Remove unused variables + + [popcornmix] + * [mmalcodec] Fix for inverted check for first frame + + [popcornmix] + * [mmalrenderer] Avoid blank frame on resolution change + + [popcornmix] + * [mmalrenderer] logging update and remove a warning + + [popcornmix] + * [mmalrenderer] Reset m_buffers on PreInit + + [popcornmix] + * [mmalrenderer] Add auto select as explicit deinterlace method + + [popcornmix] + * [mmalcodec] Also treat VS_INTERLACEMETHOD_NONE as disabled + + [popcornmix] + * [mmalrenderer] Add locking around m_droppedPics + + [popcornmix] + * [mmalcodec] Move m_output_busy into lock + + [popcornmix] + * [mmalrenderer] Avoid submitting a buffer to renderer twice + + [popcornmix] + * [mmalcodec] Explicitly use fast deinterlace for HD and reduce buffers allocated by 2 + + [xhaggi] + * [pvr] adds missing videoplayer info label for episode name + + [da-anda] + * [settings] only add a separator if it's not the first list item of the first settings group + + [Glenn-1990] + * [pvr] remove not used string + + [montellese] + * settings: fix position of musiclibrary.showallitems setting + + [popcornmix] + * [omxplayer] Handle failures from EmptyThisBuffer and FillThisBuffer + + [Matthias Kortstiege] + * [stringutils] do not capitalize after apostrophes + + [xhaggi] + * [pvr] expose timer epg info for listitem labels + + [montellese] + * CLangInfo: fix GetMeridiemSymbol to return the proper string based on the current 12/24-hour clock settings + + [popcornmix] + * [omxplayer] Limit subtitle updates to avoid closed caption stutters + + [popcornmix] + * rbp: Use new dispmanx function for vsync callbacks + + [popcornmix] + * [rbp] Add Pi 2 specific settings defaults + + [popcornmix] + * [omximage] Increase timeout - this is sometimes hit + + [popcornmix] + * [rbp] Disable analogue output of sink when passthrough is enabled + + [popcornmix] + * [OMXAudio] Make stereoupmix and fixed behave more like dvdplayer + + [Memphiz] + * [jenkins/win32] - enable webserver unit tests + + [dhacker29] + * android: Fix the readme to reflect the changes to bump SDK to 17 + + [Glenn-1990] + * [pvr] fix: no channel set error + + [Glenn-1990] + * [pvr] radio and tv are separated now.. + + [ronie] + * [Confluence] GlobalSearch: add EPG search support + + [ronie] + * [Confluence] fix header label + + [Stephan Raue] + * [IMX] EGLNativeTypeIMX.h: include EGL/egl.h to fix build after https://github.com/xbmc/xbmc/commit/c3116fdfd515b674242a44d0b0eadbe423ec5794 + + [Rainer Hochecker] + * dvdplayer: compare to absolute sync error, fix sync issues for large negative errors + + [Karlson2k] + * [depends] Update libmicrohttpd to SVN 35533. Should resolve WebServer shutdown issue. + + [Rainer Hochecker] + * dvdplayer: flush audio sync errors on resume and resync + + [Rainer Hochecker] + * dvdplayer audio: fix/improve calculation of playing pts + + [Rainer Hochecker] + * dvdplayer audio: do not consider dropped packets for sync error + + [xhaggi] + * [musicdb] improves performance for querying the album view + + [fritsch] + * Application: Don't slow down videos rendered on GuiLayer + + [Rainer Hochecker] + * dvdplayer: ffmpeg-vda - ignore silly 3-byte nal encoded files + + [Rainer Hochecker] + * dvdplayer: make ffmpeg vda default + + [Rainer Hochecker] + * dvdplayer: rework ffmpeg vda + + [Matthias Kortstiege] + * [davfile] use PROPFIND for Stat() and Exists() + + [da-anda] + * [settings] change logical order of some subtitle and EPG related settings + + [da-anda] + * [Language] remove obsolete strings + + [da-anda] + * [Language] shorten labels in system settings and make them less technical + + [da-anda] + * [Language] improve PVR labels + + [da-anda] + * [Language] shorten labels in services/network settings an make them less technical + + [da-anda] + * [Language] shorten labels in appearance settings + + [da-anda] + * [Language] shorten labels in audio settings and make them less technical + + [da-anda] + * [Language] shorten labels in video settings and make them less technical + + [da-anda] + * [Language] get rid of "EPG" and use "Guide" instead to be consistent + + [da-anda] + * [Language] use "information provider" instead of "scraper" to be consistent with addon manager category + + [da-anda] + * [Language] remove references to "Kodi" in settings labels where appropriate + + [Martijn Kaijser] + * [skin] Updated re-Touched + + [Rainer Hochecker] + * ffmpeg: bump to 2.6.2 + + [Rainer Hochecker] + * dvdplayer audio: proper handle resume if playspeed is already normal + + [Rainer Hochecker] + * AE: flush resampler when flushing buffers + + [Rainer Hochecker] + * dvdplayer: improve audio sync for large packet durations + + [Rainer Hochecker] + * [PVR] disable thumb extraction for pvr recordings + + [ronie] + * add library://music path + + [Matthias Kortstiege] + * [videoinfoscanner] re-scrape season art for newly added seasons + + [Matthias Kortstiege] + * [videoinfodownloader] adds scrapers GetArtwork method + + [Matthias Kortstiege] + * [scraper] added GetArtwork function + + [Chris "Koying" Browet] + * FIX: [droid] amlcodec scale after aml egl + + [Chris "koying" Browet] + * FIX: [eg] only compile what's necessary per platform + + [Chris "Koying" Browet] + * ADD: [droid;aml+rk] specific aml and rk egl windowing for droid; allows framerate autoswitch + + [Chris "Koying" Browet] + * CHG: [droid] let the system handle volume + + [Chris "Koying" Browet] + * ADD: ACTION_VOLUME_SET to set absolute volume level + + [Rainer Hochecker] + * dvdplayer/omxplayer: protect live streams (pvr) from stalling + + [Rainer Hochecker] + * dvdplayer: cosmetics + + [Arne Morten Kvarving] + * fix wrong include path + + [Arne Morten Kvarving] + * add missing include in Encoder.cpp + + [Arne Morten Kvarving] + * add missing include in TestFileFactory + + [Arne Morten Kvarving] + * fixed: don't pass NULL pointer for boolean argument + + [Arne Morten Kvarving] + * fixed: bitwise and intended, not logical + + [Arne Morten Kvarving] + * fixed: give enum a name + + [Arne Morten Kvarving] + * add missing include + + [Arne Morten Kvarving] + * remove unused arrays and defines + + [Arne Morten Kvarving] + * fixed: quell pointer -> integer conversion warning + + [Arne Morten Kvarving] + * remove useless check + + [Chris "Koying" Browet] + * FIX: [egl;font] assert if cache texture was not created + + [Thomas Amland] + * [python] add DelayedCallGuard to xbmcvfs.listdir. closes #14212 + + [Thomas Amland] + * dont install sounds directory + + [Thomas Amland] + * improve consistency of gui sounds related strings + + [Matthias Kortstiege] + * [osx/ios] xcode sync for ui sound addons + + [Thomas Amland] + * [addons] hook up ui sound addons to the gui audio manager and settings + + [Thomas Amland] + * [addons] move sounds from confluence skin to a resource addon + + [Thomas Amland] + * remove bursting bubbles sounds (moved to addon repo) + + [Thomas Amland] + * [addons] add new ui sounds resource addon type + + [Violet Red] + * Include MusicVideos when creating playlists + + + [Memphiz] + * [osx/ios] - mention xcode 6.3 support in osx and ios readme + + [Memphiz] + * [osx/ios] - fix compilation with newest apple clang (xcode6.3) - disable forward declaration of boost containers (those broke compilation with c++11 and latest apple clang) + + [Memphiz] + * [depends/libffi] - pass the "don't use std asm" only to the CCASFLAGS - fixes configure failing to detect working c compiler in xcode6.3 + + [Matthias Kortstiege] + * [bookmarks] remove trailing semicolon + + [Memphiz] + * [depends/nettle] - disable build of testsuite (doesn't compile with clang from xcode6.3) + + [fritsch] + * IMX: Don't try to open width > 1920 hw is not capable to do so + + [fritsch] + * IMX: Only fallback to ffmpeg for AVC with level 3.0 - others are fine + + [fritsch] + * EGLNativeTypeIMX: Fix boolean return and close ifstream properly + + [xhaggi] + * [seek] improves instant seek in seek handler + + [fritsch] + * Only use videoplayer.limitguiupdate on Pi and IMX + + [Arne Morten Kvarving] + * added: 'volumeamplification' action to show slider + + [montellese] + * jsonrpc: add explicitly named parameters to Player.Seek and support seeking by a number of seconds + + [fritsch] + * IMX: Fix Screenshot v4 + + [fritsch] + * IMX: Warn once when frames are received but VPU detects interlaced content + + [xhaggi] + * [cosmetic] put statement of single line if to new line + + [xhaggi] + * [cpp] use c++ style casts in CSeekHandler + + [xhaggi] + * [builtin] adds new builtin for seeking + + + [Sam Nazarko] + * iMX: Only align dest Rects to 2 - cares for artifacts + + [fritsch] + * IMX: Read Text strings without trailing and leading n + + [Memphiz] + * [win32] - sync project + + [Arne Morten Kvarving] + * move CUtil tests to gtest unit tests + + [xhaggi] + * [xcode] sort IActionListerner.h alphabetically + + [ace20022] + * [dvdplayer] Use a message for AddSubtitle to prevent possible races. + + [ace20022] + * [dvdplayer][vob subs] Add better support for vob subtitles with multiple streams. + + [ace20022] + * [dvdplayer] Refactor AddSubtitleFile, i.e., remove unused parameter. + + + [AlwinEsch] + * [pvr.argustv] Bump pvr.argustv@96ee875 + + [ronie] + * [Confluence] unify filemanager list + + [ronie] + * [Confluence] cosmetics + + [fritsch] + * RPB: Adjust settings to also use new limitgui setting + + [fritsch] + * IMX: Add special settings file with render reduction + + [fritsch] + * Lang: Add ressources strings for Gui Limits + + [Rainer Hochecker] + * fix fading of CGUIImage + + [Rainer Hochecker] + * dvdplayer: trigger resync of players after audio stream stalled + + [Rainer Hochecker] + * dvdplayer: improve audio sync + + [Sam Stenvall] + * [pvr] check linked recordings when determining if an EPG tag is currently being recorded + + [Matthias Kortstiege] + * [infomanager] add ListItem.IsCollection + + [phil65] + * [CONFLUENCE] - add list flags for ListItem.IsCollection + + [popcornmix] + * renderer: Allow gui updates to be skipped when playing video + + [montellese] + * upnp: split up starting/stopping of the client (browser) and the controller + + [montellese] + * network: fix some wrong UPnP related calls to be able to stop the client and server + + [montellese] + * upnp: make services.upnpcontroller a sub-setting of services.upnpserver (it depends on it already anyway) + + + [Anton Fedchin] + * [pvr.iptvsimple] Bump pvr.iptvsimple@a2e6c6f + + [phil65] + * [CONFLUENCE] - cleaned up PlayerControl RepeatButton images + + [taxigps] + * use subtitle settings to set ASS/SSA subtitles position + + [taxigps] + * add a member m_viewRect to CBaseRenderer and a 3rd argument view to GetVideoRect + + [taxigps] + * bump libass to version 0.12.1 + + [arnova] + * fixed: Declaration order + wrong prototype (cosmetics) + + [arnova] + * changed: Refactor ImageLoader to improve error handling when e.g. texture loading fails + + [Sam Stenvall] + * [pvr] fix wrong logic which made it impossible to persist changes in the channel manager dialog + + [Violet Red] + * Keep playlistid=playerid in JSON interface + + + [Chris "Koying" Browet] + * Fixup 3D sub: remove unnecessay include + + [Pär Björklund] + * make lirc a bit more thread safe + + [Gordon Ellis] + * Fixed some lingering grammar errors from the name change to Kodi + + [Rainer Hochecker] + * dvdplayer: unpause PVR playback after channel switch + + + [AlwinEsch] + * [confluence] Add settings group title support + + [AlwinEsch] + * [settings] Add coded group title support + + [AlwinEsch] + * [settings] Add group title support + + [AlwinEsch] + * [settings] Add single control type to CSettingGroup + + [Chris "Koying" Browet] + * ADD: [vkeyboard] to toggle use left/right/enter the keyboard way + + [Chris "Koying" Browet] + * FIX: actually remove excluded addons + + [Chris "Koying" Browet] + * FIX: [droid;packaging] handle addons libraries + + [Matthias Kortstiege] + * [videodb] cleanup files from removed media sources + + [Chris "Koying" Browet] + * ADD: Handle bitmap subtitles in 3D + + [montellese] + * smartplaylist: fix filtering musicvideos by artists + + [montellese] + * videodb: fix partymode with filtered musicvideos through GetMusicVideoIDs() with WHERE clause (fixes #15989) + + [Rainer Hochecker] + * goom: drop unneeded file which bothers git + + [Rainer Hochecker] + * fix gui fps indicator for cases like dr kicks in + + [Matthias Kortstiege] + * [util] refactored ScanForExternalSubtitles to fetch the media's basepath instead of stating all kind of non-existing directories + + [Matthias Kortstiege] + * [uriutils] moved GetParentDir from VideoInfoScanner to URIUtils - renamed to GetBasePath + + [Matthias Kortstiege] + * [music] added mood for songs + + + + [ace20022] + * [Fix] Fix the Blu-ray simple menu entry "select from all titles...". + + [Chris "koying" Browet] + * FIX: [droid] Samba 3.6.12 (gplv3) + + [Sam Stenvall] + * [README.pvr] fixed old name and URL (closes #15866) + + [Chris "Koying" Browet] + * FIX: [jni] Do not detach UI thread + + [arnova] + * changed: Allow extraction for all protocols except for HTTP + FTP when NOT on a LAN + + [arnova] + * added: URIUtils::IsHTTP() function + + + [Andrew Fyfe] + * [xbmc.webinterface] fix typo in webinterface.xsd + + [Rainer Hochecker] + * linux: fix libsse4, compile with correct flags + + [Matthias Kortstiege] + * [fileitem] no need to stack or check for thumbs on library:// folders + + [Memphiz] + * [fontconfig] - bump to 2.11.1 - fixes #15864 + + + [Rainer Hochecker] + * dvdplayer: do not bail out if av_find_stream_info fails for mpegts + + [arnova] + * changed: Use toasts to report video and music db export errors instead of modal dialog + + [arnova] + * fixed: Dialog would not close properly when an exception occurred + + + [Matthias Kortstiege] + * [music] remove search node - sidebar already has search integrated + + [Matthias Kortstiege] + * [musicdb] added infomanager hascontent checks for singles and compilations + + [Matthias Kortstiege] + * [musicdb] enable the library via xml + + [Stefan Saraev] + * [replaytv] minor cleanup after pull/6798 + + [Stefan Saraev] + * [replaytv] remove replaytv support + + [Stefan Saraev] + * [daap] remove daap support + + [montellese] + * jsonrpc: add "compilation" property to AudioLibrary.GetAlbums + + [montellese] + * jsonrpc: add "includesingles" parameter to AudioLibrary.GetAlbums + + [montellese] + * jsonrpc: add "releasetype" for albums and "albumreleasetype" for songs + + [montellese] + * musicdb: add CMusicDatabase::GetSinglesCount() + + [montellese] + * musicdb: add strReleaseType to album table and use it to filter albums/singles + + [montellese] + * music: move decision whether an album is a single or not into CMusicInfoScanner + + [montellese] + * music: add support for album release type to CMusicInfoTag + + [montellese] + * music: move EmbeddedArt and EmbeddedArtInfo from MusicInfoTag.h into its own header file + + [montellese] + * music: add CAlbum::ReleaseType and CAlbum::releaseType + + [h.udo] + * [pvr] Sync a bunch of addons with PVR API 1.9.6 + + [Martijn Kaijser] + * bump to 15.0 beta1 + + [xhaggi] + * [gui] removes obsolete close of child dialogs in video/music osd + + [xhaggi] + * [gui] use CloseInternalModalDialogs() where possible + + [xhaggi] + * [cosmetic] indentation, comments and simplify button label decision + + [xhaggi] + * [video] close bookmark dialog after select an item + + [xhaggi] + * [video] don't open the bookmark dialog if no playback exists + + [xhaggi] + * [video] adds ListItem properties IsChapter/IsBookmark + + [xhaggi] + * [video] don't add bookmarks of type resume in bookmark dialog + + [xhaggi] + * [confluence] use Label and Label2 to separate bookmark name and time + + [xhaggi] + * [video] separate bookmark/chapter name and time in Label and Label2 + + [Matthias Kortstiege] + * [video] human readable chapter and bookmark labels + + [Rainer Hochecker] + * do not enable remote control on initialize, respect app params + + [xhaggi] + * [gui] rename CloseModalDialogs to CloseInternalModalDialogs + + [Memphiz] + * [advancedsettings] - changed applydrc to be a float instead of bool + + [Memphiz] + * [AudioCodecFFMPEG] - disable drc in audio codec context when advancedsetting "applydrc" is disabled + + [xhaggi] + * [gui] exclude addon/python dialogs in window manager's CloseModalDialogs() + + [wsnipex] + * [curl] use better method to stat shoutcast and friends + + [xhaggi] + * [video] select proper bookmark item based on current playtime + + [xhaggi] + * [video] unify bookmarks/chapters and sort them by resume point + + [manuel] + * [pvr.dvbviewer] Bump to kodi-pvr/pvr.dvbviewer@bd2c01f + + [Bernd Kuhls] + * Remove lib/enca/ + + [Matthias Kortstiege] + * [settings] allow hide watched toggling in files node + + [wsnipex] + * [configure] add option to disable lirc + + [Menno] + * Added permissions for master mode to remove items from library when in RO account. + + [Anssi Hannula] + * [AE] ALSA: Fix DeviceChange event triggered by enumeration + + [Anssi Hannula] + * [AE] ALSA: Add more logging to device change triggers + + [Anssi Hannula] + * [AE] ALSA: Add ALSADeviceMonitor for monitoring ELD changes + + [Anssi Hannula] + * [AE] ALSA: Add ALSADeviceMonitor for monitoring card removals/additions + + [Anssi Hannula] + * [linux] Add FDEventMonitor for monitoring file descriptors + + + [Matthias Kortstiege] + * [muscidb] do not blindly add karaoke genre + + [Chris "Koying" Browet] + * FIX: [droid;amc] crash when calling dispose twice + + [Matthias Kortstiege] + * [stacking] remove loose 'd' from video stack expressions (fixes #15882) + + [montellese] + * python: fix HAS_WEB_SERVER ifdef guard in AddonModuleXbmcwsgi.i (fixes #15849) + + [montellese] + * codegenerator: add support for "footer" code insertion block to python template + + [Mateusz Lewicki] + * fix for gamepad volume change + + + [Chris "Koying" Browet] + * fixup: [breakpad;jenkins] save symbols tarball + + [Chris "Koying" Browet] + * ADD: [droid] implement Google Breakpad for minidumps + + [Chris "Koying" Browet] + * FIX: [aml] fallback to codec_id if codec_tag is unknown + + [Chris "Koying" Browet] + * FIX: [aml] check size (and realloc) of header buffer + + [Chris "Koying" Browet] + * [aml] add rotation to render features + + [Chris "Koying" Browet] + * FIX: [amcodec] remove problematic check (solves "[h264 aml error] 00001.ts") + + [davilla] + * pivos: [amcodec-hack] pvr can reopen too fast, slow us down a little + + [uNiversaI] + * [Default webinterface] make add-on name more descriptive + + [ace20022] + * [Fix] dvdplayer: Only one (external) vobsub could be displayed due to a wrong source numeration. + + [xhaggi] + * [gui] fix endless loop in CloseDialogs() if not force close + + [xhaggi] + * [gcc] fix gcc 4.6 compiler error introduced by #6828 + + [Kai Sommerfeld] + * [pvr] Bump pvr.hts to version 2.1.7 + + [Anton Fedchin] + * [pvr.iptvsimple] Sync prv.iptvsimple. CONTRIBUTING.md Kodi.xcodeproj LICENSE.GPL Makefile.in Makefile.include.in README.md VERSION addons bootstrap bootstrap.mk build-aux codegenerator.mk configure.ac copying.txt debian docs doxygen_resources gitrev gitrev.sh lib m4 media project sounds system tools userdata version.txt xbmc xbmc-xrandr.c Fix loading add-on on android. + + [Chris "Koying" Browet] + * FIX: [droid] consistent splash error handling + + + [Pär Björklund] + * Only log first connection attempt to avoid spamming the logs, also some cleanup + + + [Rainer Hochecker] + * dvdplayer: fix audiosync for rr not equal to 1.0 + + [Rainer Hochecker] + * fix and cleanup after codec removal from paplayer + + [xhaggi] + * [gui] playback an error sound if window switch is refused + + [xhaggi] + * [gui] don't switch to another window if there are active modal dialogs + + [arnova] + * changed: Set default buffer factor to 4 to allow faster filling + + [arnova] + * fixed: Buffer factor should not set higher read rate demands but instead have filecache increase its limiter + + [arnova] + * added: Debug logging for low read rate condition + + + [Dmitry Sandalov] + * [README.ubuntu] ppa sources, provided package + + [arnova] + * fixed: Bunch of compile warnings + + [arnova] + * fixed: String not found comparison was wrong in URL.cpp + fixed compile warning + + + [Pär Björklund] + * [tests] Get rid of a bunch of forced conversion to bool warnings and some cleanup as well + + [uNiversaI] + * [confluence] add pcm, pcm_s16le and pcm_s24le flags + + [Matthias Kortstiege] + * [tagloader] make TagLoaderFactory load by item (fixes #15879) + + [BigNoid] + * [confluence] Move dialog background to include + + [Memphiz] + * [jenkins/tests/win32] -exclude webserver tests for win32 because each one lasts 120 secs or so + + [Memphiz] + * [jenkins/win32] - add buildstep for building and running testsuite + + + [Memphiz] + * [jenkins] - prevent cleanout of native tools when pathChanged returns 1 in make-native-depends (due to Configuration set to RELEASE) + + [Memphiz] + * [tests] - fix charsetconverter unit tests by initialising CSettings singleton (else g_charsetConvert will access NULL-Ptr settings) + + [Memphiz] + * [Tests] - fix compilation + + [montellese] + * musicdb: remove unused GetVariousArtistsAlbums*() methods without implementation + + [Matthias Kortstiege] + * [video] removed old unused library <-> files toggle code + + [hudokkow] + * [Keyboard Layouts] Add missing characters in Greek keyboard + + [hudokkow] + * [Keyboard Layouts] Add missing characters in German keyboard + + [Kib] + * [readme.md] Updated link to coding guidelines + + + [Rainer Hochecker] + * vaapi: reduce refs by one after rework of frame threading + + [Rainer Hochecker] + * dvdplayer - rework frame therading for ffmpeg + + [uNiversaI] + * [project readme.md] update quick links + + [Matthias Kortstiege] + * [stringutils] fix sizestring alignment + + [Memphiz] + * [AE/CA/osx] - fillup the stream with up to 64 unknown channels fixes support for studio audio devices with more then 16 unused/unknown channels in one stream - fixes #15874 + + [Memphiz] + * [AE] - extend the number of unknown channels from 16 to 64 + + [Anton Fedchin] + * [pvr.iptvsimple] Sync win v.1.11.0 (API 1.9.6) + + [Rainer Hochecker] + * fix frametime for active vsync + + [Rainer Hochecker] + * guilib: only update scrollinfo if frametime did change + + + [ronie] + * [Confluence] fix 2D button after PR#6345 + + [xhaggi] + * [gui] only close active modal dialogs if closing a media window + + [xhaggi] + * [gui] new method CGUIWindowManager::CloseModalDialogs() to close modal dialogs only + + [xhaggi] + * [gui] unify CGUIWindowManager::AddModeless/RouteToWindow into new method RegisterDialog() + + [wsnipex] + * [binary addons] bump kodi-platform (fixes #15870) + + [Kai Sommerfeld] + * [pvr] fixed regression in CGUIInfoManager::GetItemLabel, LISTITEM_NEXT_* + + [Marcel Groothuis] + * GUIInfoManager: fix PVR recording genre display + + [Rainer Hochecker] + * dvdplayer: fix mem leak in ffmpeg decoder + + [Rainer Hochecker] + * dvdplayer: fix memleak in ffmpeg demuxer + + [Garrett Brown] + * [input] Change GetFrameTime() to SystemClockMillis() + + [Rainer Hochecker] + * dvdplayer: adjust threshold of audio errors to frame duration + + [Garrett Brown] + * [input] Untangle key processing from key translation + + [Daniel Scheller] + * Fix compile with gcc-4.6 (e.g. Ubuntu Precise) after 799094a838d12cc6f9513bd576d35f37668176e8 + + [uNiversaI] + * [keyboard] add/restore track rating functionality + + [uNiversaI] + * [remote] restore track rating functionality + + [montellese] + * addons: find and use the best matching translation for an addon summary/description/disclaimer + + [montellese] + * utils: add CLocale::FindBestMatch() to find the best matching locale from a list of locales + + [Karlson2k] + * Revert "[emufnc] Disable support for READ_TRUNCATED. To be reverted after Helix release." + + + [ronie] + * [Confluence] add another missing default icon + + [ronie] + * [Confluence] add missing default icons + + [Rainer Hochecker] + * [pvr.vnsi] sync with API 1.9.6 + + [Garrett Brown] + * Mark static function as static + + + [Kai Sommerfeld] + * [pvr] Fix radio channelgroup support. Take over 'radio' group property supplied by client. + + + [Dusan Slijepcevic] + * New feature: Added parameters to skin include directive ($PARAM[ParamName]) + + [Dusan Slijepcevic] + * Refactored string replacer to return flag and accept functor + + [Kai Sommerfeld] + * [pvr] Improved content of pvr shutdown warning dialog. + + [Matthias Kortstiege] + * [guilib] remove obsolete always show cursor code + + [Matthias Kortstiege] + * [guilib] hint text not displayed in keyboard dialog + + [montellese] + * videodb: store the number of seasons of a tvshow in CVideoInfoTag::m_iSeason + + [popcornmix] + * [resampler] Use ffmpeg for quiet noise generation + + [montellese] + * CGUIMediaWindow: reorganise the virtual methods into groups based on where they are defined + + [montellese] + * CGUIMediaWindow: move all #defines to the top + + [montellese] + * CGUIMediaWindow: sort includes alphabetically + + [popcornmix] + * [OMXImage] Increase jpeg decode timeout + + [Lukas Rusak] + * [input] add keymap for ouya controller + + [Lukas Rusak] + * [input] add keymap for PS4 controller + + [Stefan Saraev] + * [input] add home key id for Rii i7 remote + + [Stephan Raue] + * [settings] move RSS to standard group + + [Stephan Raue] + * [input] support KEY_TV on 'devinput' devices + + + [Rainer Hochecker] + * paplayer: remove audio extensions for removed codecs + + [Rainer Hochecker] + * paplayer: drop obsolete codecs from lib + + [Rainer Hochecker] + * paplayer: drop remaining codecs, only use ffmpeg + + [Matthias Kortstiege] + * [videolibrary] adjust year sort order label + + [Matthias Kortstiege] + * [musiclibrary] adjust sort order labels (closes #15860) + + [montellese] + * fix TV language detection with HDMI-CEC + + [xhaggi] + * [pvr] fix type of CPVRChannelGroup's m_iPosition + + [ace20022] + * [lang] Also check for user defined custom language codes. + + [ace20022] + * [lang] Add custom languages to our language list. + + [xhaggi] + * [epg] fix use of new epg database column iYear + + [David Butler] + * Added some support for a titlebar-less functionality on OSX, the window is also movable by using a "drag anywhere" functionality while the titlebar is disabled... + + [Matthias Kortstiege] + * [fonts] fix font mask after 4e542f7 + + [Matthias Kortstiege] + * [art] fetch artist and album art based on album id + + [Matthias Kortstiege] + * [art] clear all artwork assigned to the CFileItemList + + [Thomas Amland] + * [addonbrowser] rearrange root menu + + [Thomas Amland] + * [addonbrowser] move information providers type addons to a sub-category + + [Thomas Amland] + * [addons] refactor and cleanup addon directory + + [Thomas Amland] + * [addonbrowser] remove date sorting. doesn't work + + [Thomas Amland] + * [addons] allow GetAllAddons to be used successively without clearing input + + [Rainer Hochecker] + * renderer: do not add overlays when eating video frames - fixes segfault + + [montellese] + * binary addons: add modplug, nosefart, sidplay, snesapu, stsound, timidity and vgmstream audiodecoders + + [montellese] + * [win32] integrate audiodecoders into the installer + + [montellese] + * [win32] make sure we have access to a patch command + + + [popcornmix] + * [omxplayer] Allow HDMI output to work when ALSA card is selected + + [Kai Sommerfeld] + * [pvr] Bump pvr.hts to version 2.1.6 (PVR addon API 1.9.6) + + [uNiversaI] + * [configure.in] rename file extension to configure.ac + + [uNiversaI] + * [bootstrap.mk] change configure.in -> configure.ac + + [Kai Sommerfeld] + * [epg] CEpgInfoTag: Reintroduced mutex protection for m_pvrchannel and m_recording. + + + [Matthias Kortstiege] + * [osx/ios] force project indent to 2 spaces - no tabs + + [xhaggi] + * [gui] fix uninitializeed iEpisode and iSeason + + [xhaggi] + * [epg] fix usage of ALTER TABLE in epg database update + + [Matthias Kortstiege] + * [osx/ios] sync project file + + [wsnipex] + * [depends] binary-addons: remove quotes around the addon list and use "all" for the list of addons + + [kajdreef] + * Fixed issue 15831 by checking for the password after the choice have been made and removed the Profile delete option + + [ace20022] + * [gui] Use a list instead of a spinner for the audio and subtitle selection via the video osd dialog. + + [ace20022] + * [Fix][bluray] Allow reading the disc's root directory. + + + [xhaggi] + * [pvr] bump API to 1.9.6 + + [xhaggi] + * [gui] handle ListItem.IMDBNumber / VidePlayer.IMDBNumber also for video items + + [xhaggi] + * [gui] handle season and episode item labels for channel/epg item + + [xhaggi] + * [gui] handle more video info labels for PVR channel item + + [xhaggi] + * [gui] adds new EPG properties to GUIInfoManager + + [xhaggi] + * [epg] adds new properties to epg info tag + database + + [xhaggi] + * [pvr] extends API for new epg properties + + [xhaggi] + * [pvr] adds capability for sorted channel groups + + [Pär Björklund] + * Changed FONT_CACHE_DIST_LIMIT to float to silence a bunch of warnings. floats are used everywhere in the calculations so this was most likely an oversight and not intended behaviour + + [Pär Björklund] + * Removed boost/shared_ptr include that had been left behind + + [Matthias Kortstiege] + * [tests] added tests for capitalise after punctuation characters + + [Matthias Kortstiege] + * [stringutils] also capitalise after punctuation characters + + [Arne Morten Kvarving] + * fixed: rename across mount points on posix filesystems + + [Pär Björklund] + * Remove throw() specifications since they're not used anymore in C++11 + + + [Matthias Kortstiege] + * [pvr] fix unable to open grouped recordings/folders (closes #15848) + + [xhaggi] + * [pvr] fix group member assignment + + [Chris "Koying" Browet] + * FIX: [droid] if a full apk is present, use it rather than obb; lower threshold to 40Mb + + [ace20022] + * [cleanup] Remove CheckLoadLanguage from LangInfo. + + [ace20022] + * [cleanup] Remove check for language (codes) from language addons. + + [xhaggi] + * [pvr] drop table 'clients' regardless of whether we have PVR addons + + [xhaggi] + * [pvr] simplify iteration through pvr addons + + [xhaggi] + * [pvr] fix endless loop while migrating clients table to addon database + + [Rainer Hochecker] + * renderer: drop video frames if neither full-screen nor video control displays them + + [Rainer Hochecker] + * renderer: cosmetics + + [Alfredo Tupone] + * Allows choosing compiler during build of libsquish + + [Karlson2k] + * [posix] [depends] Update libmicrohttpd lib for POSIX platforms + + [Karlson2k] + * [depends] Fix wrongly used system native libgcrypt-config instead of target libgcrypt-config + + [Karlson2k] + * [depends] Fix: libmicrohttpd doesn't need openssl, but need gnutls + + [Karlson2k] + * [win32] [installer] Remove systemwebserver directory if any + + [Karlson2k] + * [win32] Update libmicrohttpd package, use static lib for libmicrohttpd + + [Martijn Kaijser] + * remove old pre-Frodo upgrade code for cached artwork + + + [Rainer Hochecker] + * dvdplayer: add slice threading back for most codecs - currently too many issues + + [Matthias Kortstiege] + * [libraryqueue] refresh listing after doing the work + + [wsnipex] + * [depends] binary-addons: fix building only selected addons + + [ksooo] + * [htsp] remove internal htsp support. + + [Alfredo Tupone] + * Use $(MAKE) to call make from a Makefile. + + [Mateusz Lewicki] + * fixed gamepad on windows spamming to logs + + [Rainer Hochecker] + * renderer: grab corect lock when calling IsGui/VideoLayer + + [Rainer Hochecker] + * ffmpeg: fixes for 2.6.0 + + [montellese] + * lib: get rid of copy of libmicrohttpd + + [Anton Fedchin] + * [dxva] hevc: added decoder guids. Fixed refs count. + + [Anton Fedchin] + * [dxva] hevc: add compat header for mingw. + + + [ksooo] + * [confluence] Consistent usage of one string resource for electronic program guide => #22020 "Guide". + + [psyton] + * Support for load replay gain info from CUE + + [psyton] + * CCueDocument refactoring + + [psyton] + * ReplayGain refactoring. (Create class for store and work with RG data) + + [h.udo] + * Add more native artifacts to .gitignore + + [ace20022] + * [Fix][Settings] Fix the definition of the subtitles.tv and subtitles.movie service settings. + + [Violet Red] + * Fix Artists view in Music Videos + + [Matthias Kortstiege] + * [vtp] remove internal vtp (vdr-streamdev) support + + [ace20022] + * [Fix][GUIDialogSelect] Reset members m_buttonString and m_bButtonPressed on Reset(). + + [Cam Hutchison] + * [playlist] Add tags to episode smart playlists. + + [Rainer Hochecker] + * dvdplayer: drop ffmpeg threading work around, fix root cause + + + [h.udo] + * [pvr addons] Sync remaining addons with API 1.9.5 + + [h.udo] + * [pvr.pctv] Add pvr.pctv and sync with https://github.com/kodi-pvr/pvr.pctv/commit/7929c6b + + [Matthias Kortstiege] + * [mythtv] remove internal mythtv support + + [montellese] + * [win32] binary addons: don't try to build unsupported addons + + [Memphiz] + * [win32/TexturePacker] - added version resource and bumped to 1.0.2 + + [wsnipex] + * [depends] binary addons: don't try to build unsupported addons + + [wsnipex] + * [cmake] add a custom target "supported_addons" that returns all addons we're going to build on this platform + + [wsnipex] + * [cmake] fix binary addon install when sudo rights are needed + + [montellese] + * CLangInfo: improve log messages during initial language update + + [montellese] + * addons: fix SQL query in CAddonDatabase::GetAddons() after 92e7fc973b27f6b14de03ea91d71abadd5f91171 + + [Lars Op den Kamp] + * [pvr] some more channelgroup optimisations + + [ace20022] + * [settings] Remove maximum items constraint for the setting "Languages to download subtitles for". + + [ace20022] + * [Fix][settings] Use the built-in language list for the setting "Languages to download subtitles for" instead of the list of installed languages. This is done by a re-factoring of the method SettingOptionsStreamLanguagesFiller. + + [Memphiz] + * [TexturePacker] - fix decode of png files with indexed color palette - thx @BigNoid for reporting the problem + + [anaconda] + * Decrease priority of BackgroundInfoLoader thread on POSIX too. + + [Lars Op den Kamp] + * [pvr] changed channel paths to the format addonid_uniquechannelid instead of using the db id, so channel settings can be shared accross installations via a shared video db + + [Lars Op den Kamp] + * [pvr] changed erase calls in CPVRTimers::UpdateEntries() + + [Lars Op den Kamp] + * [pvr] changed erase calls in CPVRDatabase::UpdateTables() + + [Lars Op den Kamp] + * [epg] changed erase() calls in CEpg::Cleanup() + + [Lars Op den Kamp] + * [pvr] fixed bad erase in CPVRChannelGroups::DeleteGroup() + + [Lars Op den Kamp] + * [pvr] removed work around that no longer seems to be needed and that reset the channel pointer in each epg tag every time 'now' or 'next' is accessed + + [Lars Op den Kamp] + * [pvr] changed CPVRChannelGroup to use two maps: one by client/unique id, one by channel number order, so getters can be optimised. changed channel paths to use the client/unique id instead of the channel number, so we don't have to regenerate paths when things change some bug fixes and optimisations + + [Lars Op den Kamp] + * [pvr] use iterators in CPVRChannelGroupInternal + + [Lars Op den Kamp] + * [pvr] fixed: CPVRChannelGroupInternal::AddToGroup() signature no longer matched the parent class signatature + + [Lars Op den Kamp] + * [pvr] now that we're using shared pointers for channels, use it to optimise accessing groups + + [Lars Op den Kamp] + * [pvr] removed dead code CPVRChannelGroupsContainer::GetByChannelIDFromAll() + + [Lars Op den Kamp] + * [pvr] renamed CPVRChannelGroup::GetByClient() to CPVRChannelGroup::GetByUniqueID() + + [Lars Op den Kamp] + * [pvr] fixed: removed CVPRChannelGroup::GetByUniqueID() and replaced remaining calls by GetByClient(). fixes issues if more than 1 client is loaded with the same unique IDs used + + [ace20022] + * [Fix][settings] Don't ignore minimum and maximum items constraints (case sensitive). + + + [uNiversaI] + * [typo fix] priviledges -> privileges + + [Memphiz] + * [depends/binaddons] - replace the static addon list with a simple shell script which lists all addons in project/cmake/addons/addons + + [Memphiz] + * [depends/binaddons] - build all addons addon by addon and log the successful built addons to cmake/project/addons/.success and the failed ones to cmake/project/addons/.failure + + [Memphiz] + * [depends/binaddons] - unify xbmc-pvr-addons and xbmc-audioencode-addons to binary-addons + + [montellese] + * update .gitignore after changes to binary addons buildsteps + + [montellese] + * [win32] add prepare-binary-addons-dev.bat for easier binary addon development + + [Mateusz Lewicki] + * panning with gamepad in slideshow fixed + + [uNiversaI] + * [kodi-resource] add kodi-resource icon + + [uNiversaI] + * [kodi-language-resource] add GENERIC language resource icon + + [uNiversaI] + * [confluence] add repo image DefaultAddonLanguage + + + [Kai Sommerfeld] + * [EPG] Fix CEpgInfoTag::Title() + + [Martijn Kaijser] + * [cosmetic] rebrand pydocs template + + [Memphiz] + * [droid/depends] - bump default API version to 17 (was missed during sdk bump) + + [ace20022] + * [LangCodes] Check the length of the trimmed code string. + + [ace20022] + * [LangCodes] Use case insensitive comparisons to find a language code for a give language name. + + [ksooo] + * CFileItemList ctors: initializer list vs. assignment + + [ksooo] + * CFileItem[List] cosmetics, mainly return statements on separate line. + + [Thomas Amland] + * [addons] cleanup context menus in addon window + + [ksooo] + * CFileItem ctors: No need to call base class default ctor, happens automatically. + + [ksooo] + * CFileItem copy ctor: initializer list vs. assignment. + + [ksooo] + * Align CFileItem::CFileItem(const CEpgInfoTagPtr& tag) with the other ctors taking const *Ptr& parameter (assert vs. NULL check). + + [Matthias Kortstiege] + * [addoncallbacks] initialize members in the order they were declared + + [Matthias Kortstiege] + * [addonmanager] initialize members in the order they were declared + + [Matthias Kortstiege] + * [audiodecoder] initialize members in the order they were declared + + [montellese] + * input: use "language" and "layout" instead of "name" attribute for keyboard layouts + + [montellese] + * input: split keyboardlayouts.xml into one XML per language + + [montellese] + * input: extract CKeyboardLayoutManager from CKeyboardLayout and support loading multiple keyboard layout XML files + + [montellese] + * input: remove unused CKeyboardLayoutConfiguration + + [montellese] + * [win32] write successful + + [montellese] + * [win32] don't abort make-addons.bat if a binary addon fails to build + + [montellese] + * [win32] allow make-addons.bat to be called with multiple binary addons as arguments + + [Matthias Kortstiege] + * [win32file] use LastWriteTime instead of ChangeTime (fixes #15590) + + [montellese] + * settings: add locale.shortdateformat and locale.longdateformat settings + + [montellese] + * settings: add locale.timeformat and locale.use24hourclock settings + + [montellese] + * settings: add locale.speedunit setting + + [montellese] + * CLangInfo: refactor speed unit handling using CSpeed + + [montellese] + * utils: add CSpeed utility class + + [montellese] + * CLangCodeExpander: cleanup and refactoring + + [montellese] + * settings: add locale.temperatureunit setting + + [montellese] + * CTemperature: cleanup and refactoring + + [montellese] + * move Temperature.h/cpp to utils + + [AlwinEsch] + * [gui] Close all open dialogs if media window becomes closed + + [AlwinEsch] + * [gui] Cleanup video osd dialog function, to match code rules + + [AlwinEsch] + * [gui] Fix music OSD close with open PVR dialogs + + [Matthias Kortstiege] + * [fonts] adds CAPITALIZE - capitalize the first letter of each word + + [alanwww1] + * disable desktop compositing for KDE, when Kodi is in full-screen mode + + + [Miroslav Bambousek] + * [gui] fix for textbox vertical centering + + [Pär Björklund] + * Changed sleep call to AbortableWait + + [Matthias Kortstiege] + * [webif] fixed typo (closes #15844 - thanks b1m1) + + [montellese] + * [tests] fix TestPOUtils.General + + [Chris "Koying" Browet] + * FIX: [droid] properly save addon settings even if the control is not focused (fixes #13913) + + [Matthias Kortstiege] + * [videoinfoscanner] fix shows not picked up after initial scan abort + + [Pär Björklund] + * Fix the following coverity issues that the variables are uninitialized in the constructor or any functions that it calls fix 719141, 719143, 719144, 719146, 719147, 719148, 719149, 727842, 122884 fix 718193, 718210, 1261374, 1261377 + + [Matthias Kortstiege] + * [htmltable/util] remove dead html code + + [Pär Björklund] + * Cosmetic changes Renamed setUsed to match the other input interfaces + + [Pär Björklund] + * Fixed disconnect + + [Pär Björklund] + * Fixed remote initialization + + [Pär Björklund] + * Bump curl to 7.40 + + + [AlwinEsch] + * [settings] Allow on settings button, right label a continues update + + [sub9] + * Add index to count all of the collection's fanart when creating the "fanart://Remote%i" strings + + [ronie] + * [Confluence] re-locate comments + + [Stefan Saraev] + * [audioencoders] add xbmc.audioencoder + + [Stefan Saraev] + * [pvr] bump xbmc.pvr/addon.xml after 5f76e327 + + [Memphiz] + * [filesystem/afp] - remove AFP implementation + + [Chris "Koying" Browet] + * FIX: [amc] crash if decoder cannot handle a file + + [Lars Op den Kamp] + * fixed: don't return local add-ons from CAddonDatabase::GetAddons() + + [Lars Op den Kamp] + * fixed: all add-ons got duplicated in the addon table after b72f00a75c63ebe5b846d28824bcbe3ba1daebc6 + + [Lars Op den Kamp] + * [pvr] changed: ask if the user wants to disable libCEC if no TV couldn't be found for 30 seconds + + [Lars Op den Kamp] + * [cec] changed: don't show a kaitoast when the configuration has been updated by libCEC + + [Rainer Hochecker] + * [AE] pass force resample flag down to resampler + + [Rainer Hochecker] + * [ffmpeg] bump to 2.6 + + [Rainer Hochecker] + * [rbp] update README + + [Philipp Te] + * [CONFLUENCE] - change effectslowdown to 1.0 in addon.xml + + [Philipp Te] + * [CONFLUENCE] - second conversion with XML tool ("scaling" values with 0.75) + + [Chris "koying" Browet] + * FIX: [droid] keep wakelock on non-default screensavers + + [Chris "Koying" Browet] + * FIX: [droid] use SCREEN_BRIGHT_WAKE_LOCK to allow the keys backlight to go off + + [Chris "Koying" Browet] + * CHG: [droid] refactor wake lock; follow our screensaver + + [Philipp Te] + * [CONFLUENCE] - first conversion with XML tool (just alignments, whitespace removals etc) + + [ksooo] + * Optimize CFileItem::operator=() + + + [Matthias Kortstiege] + * [fileitem] remove compile warnings after 121b3fc + + [Pär Björklund] + * fix 1228841, 1228842, 1273988 Added addon/AudioDecoder.h to VS project, was missing for some reason + + [Pär Björklund] + * fixes 719099, 719101, 719105, 1021008, 1194442 + + [Bernd Kuhls] + * [uclibc] Fix compilation error in xbmc/cores/DllLoader/exports/emu_msvcrt.cpp + + [Pär Björklund] + * fix 1287131 and 1287132 + + [Matthias Kortstiege] + * [curl] fix ftps exists handling + + [Martijn Kaijser] + * [win32] fix building after split addon gui for skin and binary addons 127663da0ed4cff015d9d0070ccacf543282dd82 + + [Rainer Hochecker] + * [pvr.vnsi] change repo location to kodi-pvr + + [Rainer Hochecker] + * [pvr.vnsi] bump version + + [Martijn Kaijser] + * remove PVR specific repo + + [h.udo] + * [pvr.vuplus] Sync with https://github.com/kodi-pvr/pvr.vuplus/commit/366c8df + + [h.udo] + * [pvr.iptvsimple] Sync with https://github.com/kodi-pvr/pvr.iptvsimple/commit/4e1e7f6 + + [hudokkow] + * [pvr.filmon] Add pvr.filmon and sync with https://github.com/kodi-pvr/pvr.filmon/commit/f607fdf + + [Lars Op den Kamp] + * [pvr] optimise CPVRChannelGroup + + [Lars Op den Kamp] + * [pvr] fixed: slow channels import + + [Matthias Kortstiege] + * [tuxbox] remove internal tuxbox support + + + [Lars Op den Kamp] + * [pvr] fix check for disabled add-ons at startup, making you have to start the pvr manager twice on a new installation + + [Lars Op den Kamp] + * [pvr] clean up CPVRClients::RegisterClient() and always disable add-ons that have missing settings + + [Lars Op den Kamp] + * [pvr] replace the id of the clients table in pvr by the one used by the addondatabase. bump db version + + [Matthias Kortstiege] + * [video] remove dead code + + [montellese] + * [linux] fix home path detection + + [montellese] + * addons: fix missing parameter in CLanguageResource::OnPostInstall() + + [Lars Op den Kamp] + * [pvr] fixed: don't disable all new add-ons by default, only the ones that need configuration by default, all add-ons are marked as needing a configuration. overrule in addon.xml, by adding needs_configuration=false to the pvr extension point + + [Lars Op den Kamp] + * [pvr] changed: no longer disable all new add-ons when creating a new pvr db + + [Lars Op den Kamp] + * [pvr] changed: removed the special clients table for pvr, and use the add-on ids from the AddonManager + + [Lars Op den Kamp] + * added: CAddonDatabase::GetAddonId() + + [Matthias Kortstiege] + * [osx/ios] sync Xcode + + [montellese] + * [win32] update VS project files + + [montellese] + * no need to install the language directory anymore + + [montellese] + * addons: move language files to resource.language addons and remove all languages except English + + [montellese] + * addons: support the same locales used for the language addons in the tag and in the "lang" attribute of and tags in addon.xml + + [montellese] + * adjust language loading/handling logic + + [montellese] + * settings: turn locale.language into an addon setting + + [montellese] + * addons: only disallow non-forced repository updates while on the login screen + + [montellese] + * addons: extend CAddonDatabase::GetAddons() to support getting addons of a specific type + + [montellese] + * filesystem: add support for resource:// paths + + [montellese] + * addons: add new kodi.resource(.language) addon type + + [montellese] + * CAddonMgr: make GetExtElement() public + + [montellese] + * utils: add CLocale + + [Lars Op den Kamp] + * [pvr.hts] bump to https://github.com/kodi-pvr/pvr.hts/commit/abceaf8 [pvr.demo] bump to https://github.com/kodi-pvr/pvr.demo/commit/b4b7de1 + + [Violet Red] + * [fix] Trac 15707, queue item fails on music videos + + [Violet Red] + * Add function to return preferred playlist for active player + + [Thomas Amland] + * [addonmanager] cleanup GetAllAddons + + + [Lars Op den Kamp] + * [pvr.hts] bump to https://github.com/kodi-pvr/pvr.hts/commit/f11a84f6deb8609fa47a39b49c2b729d50a9b5b0 + + [Lars Op den Kamp] + * [pvr] changed: also use CACHESTATE_PVR in dvdplayer when playing a recording that's still running + + [Lars Op den Kamp] + * [pvr] added: CPVRRecording::IsBeingRecorded() + + [Lars Op den Kamp] + * [pvr] fixed: always ask to resume recordings, not just when played from the recordings window + + [Lars Op den Kamp] + * [pvr] fixed: remove deleted recordings from the timeline too + + [Lars Op den Kamp] + * [pvr] changed: add button to resume live playback when playing a recording + + [Lars Op den Kamp] + * [pvr] changed: ask if the user wants to resume from the beginning of a recording when starting playback on a channel and a matching recording is found + + [Lars Op den Kamp] + * [confluence] add a play recording button to DialogPVRGuideInfo.xml, hidden when no recording was found + + [Lars Op den Kamp] + * [pvr] changed: display a 'play recording' button in the epg info dialog and context menu when a recording is found, and don't make 'switch channel' play a recording, but always make it switch channels like the label says + + [Lars Op den Kamp] + * [pvr] changed: add the filename of the recording (if any) to the epg tag serialised data + + [Lars Op den Kamp] + * [pvr] fixed: missing initialisers in CEpgContainer + + [Lars Op den Kamp] + * [pvr] changed: instead of having a recording id set for epg tags, have an epg id set for recordings epg tags are only refreshed based on a timeout, or when an update is forced fixes playing recordings in progress from the timeline + + [Lars Op den Kamp] + * [pvr] fixed: missing initialiser for CPVRRecordings::m_bHasDeleted + + [Lars Op den Kamp] + * [pvr] fixed: file path for recordings with a / in the channel name + + [ace20022] + * [Fix] Cache chapter info for dvds to avoid frequent file accesses. + + [montellese] + * fix settings definition for win32 after df1c1b8d25f8ae227ee76399f6ef7b6b98f34201 + + [montellese] + * fix settings definition for win32 and ios after face9ead060c964f0bae4c3b6179ea36d98708a5 + + [Pär Björklund] + * Fixed the formatting that got messed up when moving Key.h/cpp + + [Lars Op den Kamp] + * [pvr] fixed: clear the epg tag of deleted timers explicitly because it no longer happens automatically in the destructor when using shared pointers + + [Lars Op den Kamp] + * [pvr] fixed: don't delete a timer from the list of timers in CPVRTimers::DeleteTimersOnChannel(). wait for the client to trigger an update + + [Lars Op den Kamp] + * [jenkins] ac3e91a89a63bcd5c1b892cdec7931a8067f0c68 for other platforms + + [Memphiz] + * [jenkins] - make binary addon compilation error non-fatal for jenkins + + [Lars Op den Kamp] + * [pvr] changed: scan for auto-configurable services for 5 seconds, instead of sleeping 1 second and then returning + + [Lars Op den Kamp] + * [pvr] register the avahi type set in the add-on + + [Lars Op den Kamp] + * changed: made CZeroconfBrowser::AddServiceType() and CZeroconfBrowser::RemoveServiceType() public + + [Rainer Hochecker] + * split addon gui for skin and binary addons + + [Lars Op den Kamp] + * [pvr] added: auto-configure pvr clients via avahi add these to xbmc.pvrclient extension point in the addon.xml of the add-on to configure: avahi_type="(avahi type)" avahi_ip_setting="(name of the ip/address setting)" avahi_port_setting="(name of the port setting)" + + [Karlson2k] + * WebServer: add and use panic handler for MHD + + [mad-max] + * reverse logic from commit abc298ca71c25ae57081aad60ba5ef0abec3a445 + + [Chris Mayo] + * mouse: Increase number of buttons supported from 5 to 7 + + [Karlson2k] + * WebServer: write messages from MHD to log + + + [Arne Morten Kvarving] + * fixed: try to extract zip files marked as split archives + + [Arne Morten Kvarving] + * fixed: zip files which uses an out-of-spec header for the data record entry + + [Thomas Amland] + * [addons] revert force clearing of strings after loading context item label + + [Thomas Amland] + * [addons] fix post install of context items after #6549 + + [montellese] + * don't allow to pause queued video library jobs + + [montellese] + * fix video library cleaning not initiated by a user blocking the main thread + + [Matthias Kortstiege] + * [videoinfoscanner] add season art when new season are added (fixes #14339) + + [Jonathan Marshall] + * move AddSeason() public. + + [Jonathan Marshall] + * adds GetTvShowSeasons + + [montellese] + * CVideoLibraryQueue: fix segfault in CancelJob() if CJobQueue::CancelJob() deletes the job to be cancelled + + [Rainer Hochecker] + * fix installing arch dependent files into share + + [Rainer Hochecker] + * drop in-tree building of pvr addons + + + [Kai Sommerfeld] + * [dvdplayer] Fix CDVDPlayer::SwitchChannel signature to match IPlayer::SwitchChannel signature. + + [montellese] + * [win32] cmake: improve generated Visual Studio solution + + [wsnipex] + * cmake: allow to override local addon location via ADDON_SRC_PREFIX + + [montellese] + * cmake: support file:// based paths for addon definitions + + [montellese] + * cmake: don't use an extra loop to setup addon building + + [montellese] + * addons: fix CAddonMgr::CanAddonBeDisabled() for disabled addons + + [montellese] + * addons: fix CAddonMgr::IsAddonInstalled() for disabled addons + + [Rainer Hochecker] + * [cmake] add define BUILD_KODI_ADDON + + [Carcharius] + * [video] refactor select first unwatched season/episode item + + [Arne Morten Kvarving] + * fixed: don't load new copy of dll in LoadDll() + + [Arne Morten Kvarving] + * added: add audio codec extensions to the music extension list + + [Arne Morten Kvarving] + * changed: make the music extension member in AdvancedSettings private + + [Arne Morten Kvarving] + * add support for audio decoder addons + + [Arne Morten Kvarving] + * fixed: binary add-on child dll handling + + [montellese] + * pvr: silence warning in CPVRRecordings::DeleteAllRecordingsFromTrash() + + [montellese] + * MathUtils: silence warning about implicit cast from double to int + + [montellese] + * addons: fix CAddonCallbacksGUI::Dialog_Keyboard_ShowAndVerifyPassword() calling the wrong method + + [mad-max] + * damn you case-sensitivity + + [mad-max] + * moved HideAllItems Tag from AdvancedSettings to GUI + + [Rechi] + * SQL: replaced implicit Joins with explicit Joins + + [Kai Sommerfeld] + * Optimize CPVRTimerInfoTag. No more copies, just shared pointers. + + [Matthias Kortstiege] + * [videos] check whether or not we already know about the scraper and re-use it + + [Deniz Türkoglu] + * stringutils: add test for sortstringbyname + + [Deniz Türkoglu] + * Decouple Util and StringUtil + + [Chris "Koying" Browet] + * ADD: [jni] add Activity and refactor to use our specific descendant + + [popcornmix] + * [build] Enable PYTHONOPTIMIZE for linux + + + [Garrett Brown] + * [cosmetic] Fix c/p error and whitespace in IPlayer.h + + [popcornmix] + * [mmalrenderer] Fix for HAS_MMAL being set by chance + + [Matthias Kortstiege] + * [mysql] properly toggle mysql transactions automode + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [Pär Björklund] + * Moved key.h/cpp to input where it belongs + + [Pär Björklund] + * Moved settings handling into inputmanager and got rid of friend class declaration + + [Pär Björklund] + * Encapsulated g_RemoteControl in CInputManager. Removed several ifdefs from callers and hid it inside inputmanager + + [Pär Björklund] + * Encapsulated g_Mouse in CInputManager + + [Pär Björklund] + * Encapsulated g_Keyboard in CInputManager cleaned up some includes + + [Pär Björklund] + * Move more input processing over to CInputManager. Chain OnEvent so anything not handled by CApplication OnEvent gets passed to inputmanager for processing + + [Pär Björklund] + * Renamed GetInstance to Get + + [Martijn Kaijser] + * [repo] add isengard as repo location + + [Thomas Amland] + * update vs project files + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [Thomas Amland] + * [python] expose VideoInfoTag and MusicInfoTag of listitems + + [Thomas Amland] + * [addons] remove dead code + + [Thomas Amland] + * [addons] fix addon browser not propagating unknown context menu buttons to base class + + [Fice] + * [ADDONS] Hook up the context menu addons in all the windows + + [Fice] + * [ADDONS] Context Menu Addons System + + [Violet Red] + * Add proper tag for videos in playlists + + [Matthias Kortstiege] + * [application] load videosettings by item + + [Matthias Kortstiege] + * [videothumbloader] load videosettings by item instead by path + + [Matthias Kortstiege] + * [videodatabase] add doxy for Get-/SetVideoSettings functions + + [Matthias Kortstiege] + * [videodatabase] remove dead code from GetVideoSettings + + [Matthias Kortstiege] + * [videodatabase] fetch videos settings by file id, item and path + + [ace20022] + * [Settings/rpi] Disable chapter thumbnail extraction by default for the rpi. + + [ace20022] + * [VideoBookmarks] Add a setting for chapter thumbnail extraction. + + [Arne Morten Kvarving] + * added: if chapter is nameless, use a generic 'Chapter %u' string + + [ace20022] + * added: show chapters in bookmark dialog (with thumbs) + + [ace20022] + * [VideoThumbLoader] Make == operator more strict. + + [ace20022] + * [VideoThumbLoader] Add parameter to skip querying/storing stream details when extracting thumbs. This is useful for chapter thumbs extraction for example. + + [ace20022] + * [demuxer] set correct startpts when seeking chapters of discs. + + [ace20022] + * [dvdplayer] Fix wrong chapter numbers in dvd menus. + + [Arne Morten Kvarving] + * added: support grabbing chapter name and position from bluray/dvds + + [Arne Morten Kvarving] + * added: ability to specify where to extract thumb from in thumb extractor job + + [wsnipex] + * cmake: ask for sudo rights on addon install to system dirs + + [wsnipex] + * [depends] fix standalone building of binary addons + + [montellese] + * [depends] build PVR addons as binary addons + + [wsnipex] + * [depends] add binary addon specific cmake Toolchain and autotools config.site + + [montellese] + * [depends] add RBPI's firmware directory to CMAKE_FIND_ROOT_PATH and CMAKE_LIBRARY_PATH + + [montellese] + * [win32] get rid of buildpvraddons.bat and update BuildSetup.bat + + [montellese] + * [win32] also install the PDB file for debug builds + + [montellese] + * [win32] cmake: fix installation of binary addon DLLs when using Visual Studio + + [montellese] + * addons: add pvr addons as a binary addon + + [montellese] + * cmake: always add kodi-platform as a dependency to all binary addons + + [montellese] + * binary addons: add kodi-platform (and its dependency tinyxml) as a common dependency + + [montellese] + * cmake: fix handling/passing of CMAKE_C_FLAGS/CMAKE_CXX_FLAGS + + [montellese] + * cmake: add custom build step for addons between configure and build to force re-building changed files (thanks manuelm) + + [wsnipex] + * cmake: don't install binary addon dependencies in unified deps prefix path and make sure unified deps are not used for building bin addons + + [wsnipex] + * cmake: add C++11 flag + + [montellese] + * cmake: cleanup INSTALL_COMMAND/CONFIGURE_COMMAND handling for dependencies + + [montellese] + * cmake: improve patch file/command handling for dependencies + + [montellese] + * [win32] Win32DllLoader: add wrapper for fopen_s() + + [popcornmix] + * [mmalrenderer] Fix for hang on shutdown + + [Thomas Amland] + * [python] add ContextItemAddonInvoker for running context item addons + + [Thomas Amland] + * makefile cosmetics + + [popcornmix] + * [omxplayer] Fix for volume being treated as a linear scale + + [Arne Morten Kvarving] + * added: ability to specify position where thumb is taken from in DVDFileInfo + + [Arne Morten Kvarving] + * added: ability to grab all chapter name and chapter positions from players + + [foser] + * [X11] The inline cast of int32 EGLint to unsigned long XVisualInfo.visualid could cause the latter to be filled with a garbage value, resulting in no VisualInfo being returned later on. + + [foser] + * [X11] Make eglChooseConfig use a dynamic array. + + [foser] + * [X11] With empty attributes eglChooseConfig will return all configurations, including ones with a depth buffer size of zero. A minimal depth buffer of 24 is required, so return only those. + + [foser] + * [X11] Use EGLint instead of GLint for EGL arrays + + [Rainer Hochecker] + * SDL clean-up - remove HAS_SDL_OPENGL + + [AlwinEsch] + * [pvr] Improve pvr manager start/stop way + + [Kai Sommerfeld] + * [rss] CRssReader::Process: Sleep 5 secs before retrying CCurlFile::Get(). + + [Deniz Türkoglu] + * Add native artifacts to .gitignore + + [AlwinEsch] + * [gui] Improve CGUIControlFactory::Create to use 'switch' instead of 'if' + + + [montellese] + * CGUIWindowManager: force close closing dialogs/windows during DeInitialize() + + [montellese] + * addons: don't ask the user if he wants to switch to a newly installed skin if the "modal" parameter is set in OnPostInstall() + + [montellese] + * settings: allow more control over an addon setting's control + + [montellese] + * addons: extend CGUIWindowAddonBrowser::SelectAddonID() to support selecting addons that haven't been installed yet + + [montellese] + * CGUIDialogAddonInfo: make use of CAddonMgr::CanAddonBeDisabled() + + [montellese] + * addons: add some helper methods to CAddonMgr + + [montellese] + * addons: refactor CAddonInstaller and CAddonInstallerJob to be usable with a modal progress dialog + + [montellese] + * CAddonInstaller: cosmetics and cleanup + + [montellese] + * CAddonInstaller: rename PromptForInstall() to InstallModal() + + [montellese] + * IAddon: extend OnPostInstall with an additional "modal" parameter + + [montellese] + * CFileOperationJob: change to derive from CProgressJob instead of CJob + + [montellese] + * CFileOperationJob: cosmetics and cleanup + + [montellese] + * CProgressJob: add DoModal() and extend it to support a CGUIDialogProgress modal dialog + + [montellese] + * CJob: make ShouldCancel() virtual + + [xhaggi] + * [epg] fix missing assignment of series number in constructor + + [xhaggi] + * [epg] removes some unecessary setters in CEpgInfoTag + + [xhaggi] + * [epg] adds new method SetEpg() to CEpgInfoTag to drop the use of friend class in CEpg + + [xhaggi] + * [epg] refactor: changes some method signatures in CEPGInfoTag + + [xhaggi] + * [epg] get rid of mutex lock, m_bChanged and unnecessary calls to UpdatePath() in CEpgInfoTag + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [montellese] + * [win32] updave VS project files + + [montellese] + * webserver: add CHTTPPythonHandler to handle python scripts for webinterfaces using WSGI + + [montellese] + * webserver: add CHTTPPythonInvoker and CHTTPPythonWsgiInvoker to run python scripts from webinterfaces using WSGI + + [montellese] + * webserver: fix CHTTPWebinterfaceHandler::ResolveUrl() to support a custom entry page + + [montellese] + * addons: add new xbmc.webinterface addon and CWebinterface with "type", "library" and "entry" attributes + + [montellese] + * python: add basic WSGI implementation + + [montellese] + * codegenerator: improve doxygen integration (thanks notspiff) + + [montellese] + * python: add support for tp_iter, tp_iternext and iterators + + [montellese] + * python: fix some indentation in PythonSwig.cpp.template + + [montellese] + * python: add support for tp_call + + [montellese] + * python: fix property getters/setters for custom API types + + [montellese] + * python: fix code generation for index operator + + [montellese] + * python: add typemap for void* to pass through a PyObject* object + + [montellese] + * python: cleanup input/output typemap definitions for cleaner code generation + + [montellese] + * python: refactor parsing of python exceptions + + [montellese] + * python: add virtual executeScript() to CPythonInvoker + + [montellese] + * swig: add SWIG_IMMUTABLE macro for read-only properties + + [montellese] + * CScriptInvocationManager: add ExecuteSync() + + [montellese] + * CScriptInvocationManager: rename Execute() to ExecuteAsync() and add documentation + + [montellese] + * use shared pointer of ILanguageInvoker + + [montellese] + * IHTTPRequestHandler: add GetHostnameAndPort internal helper method + + [montellese] + * webserver: remember the full request URI (not just the path) + + [montellese] + * webserver: remember the full path URI of a request + + [montellese] + * webserver: increase the priorities of the special request handlers to have more more between them and the default webinterface handler + + [Menno] + * First check if allowfiledeletion is true before prompting for master password. + + [Menno] + * Only allow delete from library if user has DB write permission + + [uNiversaI] + * [readme] cleanup unused libs + + [Thomas Amland] + * [addons] update repo if version in db differ + + [Thomas Amland] + * cleanup: avoid opening db multiple times + + [Thomas Amland] + * [addons] store repo version database + + [AlwinEsch] + * [addon] Allow addons to use kodi.addon.metadata to bring description + + [Kai Sommerfeld] + * Optimize CPVRChannel. No more copies, just shared pointers. + + [Matthias Kortstiege] + * [mysql] add optional protocol compression - defaults to false + + [Matthias Kortstiege] + * [scraper] retry without appending year after first fail + + [Thomas Amland] + * [addons] remove legacy backwards compatibility behaviour + + [smallint] + * [imx] Fixed compiler warning + + [wolfgar] + * Add guard to fix build on non iMX6 arch + + [Fernando Carmona Varo] + * Added RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE implementation + + [smallint] + * [imx] Ifdef'd iMX6 specific include + + [smallint] + * [imx] Output associated pts for TRACE_FRAMES + + [wolfgar] + * [iMX6] Implement rendercapture for latest rendering rework blit fb using g2d when no deinterlacing is required + + [smallint] + * [imx] Reworked video decoding and rendering, see http://forum.kodi.tv/showthread.php?tid=211289&pid=1892440#pid1892440 + + [smallint] + * [RenderManager] preserve field type for Renderer::RenderUpdate + + [smallint] + * [imx] Added de-interlacing method enumerations FAST_MOTION and FAST_MOTION_DOUBLE + + [Martijn Kaijser] + * [android] bump SDK to 17 + + + [gokl] + * * fix tv vendor override typo + + [Martijn Kaijser] + * update startup splash image + + [Chris "koying" Browet] + * FIX: [jni] Context::sendBroadcast returns void + + [montellese] + * CTextureCacheJob: add fallback hash in case neither mtime/ctime nor size of an image are known + + [Martijn Kaijser] + * bump version to 15.0alpha2 + + [Martijn Kaijser] + * [android] remove Ouya platform as it doesn't meet our minimal android API + + [Philipp Te] + * settings.xml: changed several spinners to lists + + + [montellese] + * bump audioencoder.flac and audioencoder.vorbis to fix parallel build problems with ogg + + [Rainer Hochecker] + * dvdplayer: flush audio errors on large sync error + + [Rainer Hochecker] + * [AE] - force re-create of ffmpeg resampler after error + + [Rainer Hochecker] + * dvdplayer: sync audio after having issued GENERAL_RESYNC + + [Chris "Koying" Browet] + * FIX: video db cleanup with no parent path + + + [montellese] + * CSettingAddon: remove unused define + + [montellese] + * strings: fix Weather -> General category description + + [Matthias Kortstiege] + * [video] fix mark watched/unwatched from manage sub menu + + [Kai Sommerfeld] + * [confluence, core] String Fixes: TV settings 10021 "Web Browser" => "Settings - TV". This one was semantically completely wrong. String gets displayed on VFDs/LCDs when navigating through the items of the left side of the TV settings dialog. 31502 "Live TV" => "TV". Confluence. Seems this one got forgotten the time the resp. core changes were made. + + [Thomas Amland] + * [addons] make sure to get correct extension point before attempting to cast to plugin + + + [montellese] + * translations: fix some filenames in English's strings.po + + [xhaggi] + * [xcode] sort PVRActionListener below existing folders in /pvr + + [xhaggi] + * [gui] fix activating of context menu after skin reload while context menu was active + + [janbar] + * [PVR] fix deleted recordings view + + [Matthias Kortstiege] + * [smbdirectory] mark dot files and folders hidden (fixes #15680) + + [da-anda] + * [3D] don't back out from 3D handling on resolution changes if we're switching to a different 3D mode + + + [montellese] + * json-rpc: fix duplicate "lastplayed" in "Video.Fields.TVShow" (thanks Tolriq) + + [xhaggi] + * [seek] fix crash if no seek steps are found for the selected direction + + [Kai Sommerfeld] + * [ActiveAE] - ActiveAESink: Change several LOGNOTICE to LOGDEBUG to reduce kodi.log "spamming". + + + [montellese] + * simplify and document CLangInfo::GetLanguageLocale() + + [montellese] + * [win32] addons: fix filtering foreign language addons + + [montellese] + * addons: no need to retrieve general.addonforeignfilter in a block that is only called if its value is true + + + [montellese] + * cmake: fix debug builds by passing CMAKE_BUILD_TYPE to the addon's build + + [Rainer Hochecker] + * dvdplayer: fix missing audio info + + [Rainer Hochecker] + * dvdplayer: sync av players after unsynced seeks which may occur when rw/ff + + [Rainer Hochecker] + * dvdplayer: consider audio stalled as long as message queue is empty + + [Rainer Hochecker] + * dvdplayer: reset error integral when flushing sync errors + + [Kai Sommerfeld] + * Fix AnnouncementManager::Announce(). Announcers may be removed while iterating announcers vector. + + + [Matthias Kortstiege] + * [videoinfoscanner] reset library bools only once - fixes #15805 + + [AlwinEsch] + * [pvr] Fix compiler warning in CGUIWindowPVRRecordings + + [wsnipex] + * [configure] make sure the gcc-4.9 SSE workaround is only enabled on x86 + + [Thomas Amland] + * [linux] prepend -Wall so it doesn't override flags from environment + + + [Rainer Hochecker] + * [win32] - fix DirectSound for streams with very low sample rates + + [Chris "koying" Browet] + * FIXUP: fix python PIL after #5218 + + [Memphiz] + * [jenkins/addons] - fix error detection during addons build + + + [ronie] + * [Confluence] api bump + + [ronie] + * revert xbmc.gui bw-compatibility change + + [Carcharius] + * Add support for jumping to the first unwatched tv show season/episode. Only allows jumping to unwatched episodes if sorting by episode number. + + [Pär Björklund] + * issue 1262131 ignoring bytes read Should silence a bunch of warnings without altering code logic + + [Pär Björklund] + * issue 1262428 out of bounds read this code seems to have done nothing for a long time. If the first loop hit it's break condition the second loop would check the same value and break directly. Not sure what effects this might have had? + + [Pär Björklund] + * issue 1269601 bad override base class method is not const + + [Pär Björklund] + * 1269602 bad override base class is not const + + [Pär Björklund] + * issue 1269603 unchecked return value not really an issue but might as well fix it. + + [Pär Björklund] + * issue 1269604 Dead code, no changes in git blame since 2012, comment out to avoid further warnings + + [Pär Björklund] + * issue 1269605 First check makes second check impossible to be true also switched to c++ style casts + + [montellese] + * cmake: fix include of check_target_platform.cmake + + [Sam Stenvall] + * [pvr] don't allow the "go to parent" item to be deleted from the recordings window. The Delete action can't be triggered by the context menu anymore but is still triggerable using the delete key + + [Sam Stenvall] + * [gui] remove any set context buttons for the "go to parent" item (fixes #15732) + + [wsnipex] + * [configure] enable SSE when using gcc-4.9 + + [Karlson2k] + * [win32] JSONVariantWriter::Write(): use wide string version of setlocale() to prevent crash on win32 + + [Karlson2k] + * JSONVariantWriter::Write(): do no re-set locale if locale is already "C" + + [Karlson2k] + * [win32] Set thread local locale for started threads + + [Karlson2k] + * [win32] Set thread local locale for main thread + + [Karlson2k] + * [win32] WIN32Util: add SetThreadLocalLocale() for controlling thread local locale + + [Karlson2k] + * [win32] Add win32/crts_caller for calling same function in all loaded CRTs + + [Matthias Kortstiege] + * [mysql] fix transaction handling by set autocommit to false when requested + + [ruuk] + * Add optional .index() to Control.GetLabel() allowing access to secondary labels + + [Stephan Raue] + * [configure.in] use pkgconfig to detect curl + + [Karlson2k] + * [win32] Use _beginthreadex() instead of CreateThread() for better compatibility with CRT functions + + [Matthias Kortstiege] + * [osx/ios] sync xcode project + + [montellese] + * [win32] update VS project files + + [montellese] + * video library: add documentation for CVideoLibraryQueue and CVideoLibraryJob implementations + + [montellese] + * video library: move all video library scanning logic into CVideoLibraryQueue and allow queueing multiple library scans + + [montellese] + * video library: add CVideoLibraryScanningJob + + [montellese] + * video library: move all video library cleaning logic into CVideoLibraryQueue + + [montellese] + * video library: introduce CVideoLibraryCleaningJob + + [montellese] + * video library: move CMarkWatchedJob to CVideoLibraryMarkWatchedJob and use CVideoLibraryQueue + + [montellese] + * video library: add CVideoLibraryQueue and CVideoLibraryJob + + [montellese] + * utils: add CProgressJob + + [montellese] + * CJobQueue: add boolean return value to AddJob() + + [montellese] + * CJobQueue: add IsProcessing() + + [montellese] + * videodb: cleanup paramters of CleanDatabase() + + [Karlson2k] + * StringUtils::AlphaNumericCompare(): do not use temporal locale object as use_facet() return only reference to facet stored in locale + + [Karlson2k] + * LangInfo: add m_locale and GetLocale() for current locale + + + [wsnipex] + * [depends] enable C++11 for native builds + + [montellese] + * cmake: add platform definitions for android, darwin, freebsd, ios, rbpi and windows + + [wsnipex] + * cmake: add platform directory and parsing of platform specific definitions + + [AlwinEsch] + * [pvr] Cleanup CPVRDatabase help text + + [AlwinEsch] + * [pvr] Remove double used header file + + [montellese] + * cmake: only set the scope of the list of an addon's dependencies once + + [montellese] + * cmake: only add a dependency to the list of an addon's dependencies if it has been downloaded and should be built + + [montellese] + * cmake: only determine the URL of a dependency if it will be downloaded and built + + [montellese] + * cmake: support platforms.txt for dependencies + + [montellese] + * cmake: extract target platform checking logic into check_target_platform.cmake + + [montellese] + * cmake: pass CORE_SYSTEM_NAME to addons and dependencies + + [Violet Red] + * [fix] Allow mixed Audio&Video playlists + + [Memphiz] + * [docs] - adapt docs - binary addons (audioencoder, pvr) need to be built manually in an extra step from now on + + [Memphiz] + * [pvr-addons] - make sure that the git repo are in the prefix and not in a shared dir (else we race if multiple nodes on the same mashine are trying to do any operations on this shared repo) + + [Memphiz] + * [jenkins] - refactor jenkins buildsteps for allowing seperate binary addons building + + [Memphiz] + * [depends] - remove xbmc-pvr-addons and xbmc-audioencoder-addons from depends build (will be build in seperate step from now on) + + [montellese] + * jsonrpc: fix SetEpisodeDetails expecting a datetime instead of a date value for "firstaired" + + [AlwinEsch] + * [settings] Allow coded settings dialogs to define label (needed to pass addon strings) + + [da-anda] + * [keymap] trigger OSD when pressing SELECT on remotes in Visualisation window to be consistent with videos + + + [Arne Morten Kvarving] + * [c++11] - quell some warnings + + [Lars Op den Kamp] + * Revert "[addon] Increase API with change 'char*' return value to 'const char*' to fix compiler warnings (addon relevant part)" + + [Dom Cobley] + * [mmalrenderer] Don't call UnInit internally. Use an internal function. + + [popcornmix] + * [mmalcodec] Avoid deinterlace for dvd menus for now + + [popcornmix] + * [mmalcodec] Introduce a preroll period to buffer up frames on startup + + [popcornmix] + * [mmalrenderer] Add back in SetVideoRect lost in PR6090 + + [popcornmix] + * [mmalrenderer] Avoid grabbing the g_graphicsContext lock - it can deadlock + + [popcornmix] + * [mmalrenderer] Render new from frame from RenderUpdate rather than FlipPage + + [popcornmix] + * [mmalrenderer] Ensure we have requested number of buffers in non-accelerated case + + [popcornmix] + * [mmalrender] Skip some log message in bypass mode + + [popcornmix] + * [rbp] Enable error concealment by default + + [popcornmix] + * [mmalcodec] Reduce number of extra video buffers + + [popcornmix] + * [mmalcodec] Skip some setup that is not required when closing + + [popcornmix] + * [mmalcodec] Report when support is compiled in + + [Rainer Hochecker] + * [pvr] bump addons + + [Rainer Hochecker] + * [addons] fix FreeString - strings are allocated by strdup + + [ronie] + * [Confluence] fix time label in seek dialog + + [Rainer Hochecker] + * Revert "[addon] Change 'char*' return value to 'const char*' to fix compiler warnings on addon lib" + + [Rainer Hochecker] + * [pvr] bump version + + [glenvt18] + * [videosync] drm: fix multi-head. + + [Memphiz] + * [osx/ios] - remove old videosync implementation for ios/osx and hook the new impl up in project and videoreferenceclock + + [Memphiz] + * [osx/ios] - add proper videosync implementations for ios and osx + + [Matthias Kortstiege] + * [videoinfoscanner] added ability to explicitly skip fast hashing + + [Memphiz] + * [ios/windowing] - add displaylink handling + + [Memphiz] + * [ios/atv2] - remove all the displaylink related stuff from the appcontrollers + + [Memphiz] + * [ios/screenmanager] - expose the current screenIdx to the outside + + [Memphiz] + * [ios/eaglview] - remove displaylink handling from eaglview + + [AlwinEsch] + * [settings] Moving label and help into ISetting + + [popcornmix] + * [omxplayer] Skip packet concatenation for WMAV2 files + + [Chris "Koying" Browet] + * FIX: [droid] fix joystick after #5624 + + [Voyager1] + * Fix occasional build errors related to unclean binary addons build + + [Chris "koying" Browet] + * CHG: [aml] remove su hacks + + [montellese] + * webserver: add support for JSONP for JSON-RPC requests + + + [Arne Morten Kvarving] + * [TexturePacker] - fix compilation with c++11 + + [AlwinEsch] + * [pvr] bump addons with #6367 + + [montellese] + * [skin.re-touched] fix win32 build + + [popcornmix] + * [resamplepi] Try to report the same numbers as ffmpeg + + [popcornmix] + * [omxplayer] Add some info about hdmi sync to codec overlay + + [popcornmix] + * [omxplayer] Avoid extra frame allocation when deinterlace might be enabled + + [AlwinEsch] + * [confluence] Don't use BehindDialogFadeOut for channel manager (does not work with addon dialog) + + [AlwinEsch] + * [addon] Change 'char*' return value to 'const char*' to fix compiler warnings on addon lib + + [AlwinEsch] + * [confluence] Add button for new channel on PVR channel manager + + [AlwinEsch] + * [pvr] Add possibility in channel manager to edit channel settings on addon + + [AlwinEsch] + * [pvr] Add usage of channel settings to addon interface + + [AlwinEsch] + * [gui] Fix addon dialog render order + + [AlwinEsch] + * [pvr] Add deleted recordings trash support + + [AlwinEsch] + * [confluence] Add button to open deleted recordings + + [AlwinEsch] + * [confluence] Add icon for deleted recordings + + [AlwinEsch] + * [language] Add needed strings for deleted recordings trash support + + [AlwinEsch] + * [codec] Add RDS type handling in addon lib (CODEC Ver. 1.0.1) + + [AlwinEsch] + * [gui] Allow usage of slider and several dialogs on addons (GUI Ver. 5.8.0) + + [AlwinEsch] + * [pvr] Rename DialogChannelScan to OpenDialogChannelScan + + [AlwinEsch] + * [addon] Increase API with change 'char*' return value to 'const char*' to fix compiler warnings (addon relevant part) + + [AlwinEsch] + * [codec] Increase API version to 1.0.1 (addon relevant part) + + [AlwinEsch] + * [gui] Increase API version to 5.8.0 (addon relevant part) + + [AlwinEsch] + * [pvr] Increase API version to 1.9.4 (addon relevant part) + + + [popcornmix] + * [omxcore] Skip out of flush on error + + [wsnipex] + * [linux] fix building with gcc 4.9 on i386 + + + [Memphiz] + * [ios] - fix 2 more warnings about unhandled enum value in switch case + + [Memphiz] + * [osx/ios/atv2] - sync xcode project after libsquish was moved to depends - fixes linker warning + + [Memphiz] + * [osx/ios/atv2] - kill 300+ warnings about unused variables by disabling the build of all the neptune tls keys we don't make use of + + [Martijn Kaijser] + * [skin] update re-touched + + [popcornmix] + * [omxplayer] Remove test of removed setting, avoids a log message + + [ronie] + * [Confluence] cosmetics + + [Martijn Kaijser] + * [android] bump minimum API version to 17 and set target API to 21. Also remove any API < 17 checks and obsolete OMXLibName. + + [Rainer Hochecker] + * [AE] clean up - drop enumeration for vanished engines + + [Chris "Koying" Browet] + * FIX: [gles;amc;deint] invert fields because pic is inverted + + [Chris "Koying" Browet] + * FIX: [amc] proper fix to overbuffer + + + + [fritsch] + * FFmpeg: Bump version to 2.5.4-Isengard-alpha + + [Martijn Kaijser] + * remove pre-Frodo upgrade code for legacy audio channel settings + + [Martijn Kaijser] + * remove pre-Frodo upgrade code for legacy add-on settings + + + [psyton] + * Support for reading embedded CUE from tags. + + [Matthias Gehre] + * Do not render when dpms is active + + [Matthias Kortstiege] + * [dialogvideoinfo] removed obsolete path invalidation code + + [anaconda] + * [python] Don't set PYTHONCASEOK=1. + + [Tobias Markus] + * [coverity] Fix for #1194431 + + + [xhaggi] + * [seek] reduces the default for seekdelay from 1000ms to 750ms + + [xhaggi] + * [cleanup] drops unnecessary delay for setting Player.Seeking to false + + [xhaggi] + * [seek] use a static delay for analog seek as you can now disable the delay in settings which breaks analog seeking + + [xhaggi] + * [cleanup] kills m_seekHandler in CApplication because SeekHandler use Singleton + + [xhaggi] + * [seek] introduces seek settings (steps and delay) for music + + [Memphiz] + * [osx/ios] - update readmes to reflect minimum runtime targets (osx10.7/ios5.1.1), minimum xcode versions (xcode 6.x), minimum SDKversions (osx10.9, ios8.0) and remove instructions for building ATV2 + + [xhaggi] + * [seek] use setting to turn off delay instead of validate enabled seek steps + + [xhaggi] + * [keymaps] unify seek keys for FullscreenVideo and Visualisation + + [xhaggi] + * [seek] use smart seek for ACTION_SMALL_STEP_BACK + + [xhaggi] + * [seek] refactor analog seek handling out of CApplication into CSeekHandler + + [xhaggi] + * [seek] refactor seek handling out of CGUIWindowFullScreen into CSeekHanlder + + [AchimTuran] + * Code cosmetic for readProcStat + + [Thomas Amland] + * [python] remove leftover xbmc.python 1.0 compat code + + + [Memphiz] + * [tests] - string literals need spaces when concatinated + + [Memphiz] + * [tests] - add some missing includes + + [Memphiz] + * [gtest] - pass cxx flags to gtest (for making it compile with c++11 on osx) + + [Memphiz] + * [osx] - .m files need to be compiled with C compiler not with C++ compiler (means clang instead of clang++) + + [Memphiz] + * [gtest/c++11/darwin] - add -DGTEST_USE_OWN_TR1_TUPLE=1 to testsuite for satisfying apple clang + + [Arne Morten Kvarving] + * [tests] - move atomics tests from shared_ptr of thread array to vector of shared_ptr of thread - fixes tests broken by change to c++11 shared pointers for clang 3.5 + + [Rainer Hochecker] + * paplayer: fix gapless for mp3 + + [Pär Björklund] + * [c++11/GuiFontCache] - move the boost includes from the header to the cpp file. This is needed because of clang having issues with distinguishingg the std::vector with boost::vector. + + [Memphiz] + * [c++11] - atoi is not member of namespace std + + [Memphiz] + * [c++11] - add more missing explicit includes + + [Memphiz] + * [darwin/rsxs/quirk] - force usage of toolchain stdbool.h - else rsxs plants its own non clang compatible version of it (somehow its m4 doesn't detect it correctly - don't bother with it...) + + [Memphiz] + * [jenkins/ios] - don't overwrite deployment target but use what is defined in xcconfig + + [Memphiz] + * [osx/ios] - enable c++11 standard - bump osx deployment target from 10.6 to 10.7 (means we need at least osx 10.7 for beeing able to run) and bump ios deployment target from 4.2 to 5.1 (means we need at least ios 5.1 to run) + + [Memphiz] + * [depends/plist] - added c++11 patch + + [Memphiz] + * [xcode/c++11] - use std::move for making an object copy + + [Memphiz] + * [xcode/c++11] - std::istream can't be checked for NULL - check is unneeded anyways ... + + [Memphiz] + * [xcode/c++11] - c++11 forbids concatinating constant strings without seperation by space in preprocessor definitions + + [montellese] + * addons: rename xbmc.gui.webinterface extension point to xbmc.webinterface + + [Memphiz] + * [xcode/c++11] - explicitly include stdlib where needed + + [Memphiz] + * [xcode/c++11] - add explicit casts where narrowing fails in c++11 + + [Chris "Koying" Browet] + * [C++11] replace deprecated auto_ptr by unique_ptr + + [Chris "Koying" Browet] + * [c++11] remove boost::shared_array + + [Chris "Koying" Browet] + * CHG: Move to c++11 and use std:shared_ptr rather than boost + + [montellese] + * CGUIDialogAudioSubtitleSettings: enable volume and volume amplification settings when passthrough is enabled but playback is not using passthrough + + + [Memphiz] + * [ios] - when using the hdmi adapter (or any other hardware tvout adapter) with ios8 devices - ensure that we do the proper rotation even if only the resolution on the external screen is switched + + [tavoc] + * [confluence] fix misalignment of epg progressbar + + [xhaggi] + * [gui] fix missing breaks in switch/case CGUIDialogSeekBar + + [Martijn Kaijser] + * [repo] bye bye Frodo + + [Rainer Hochecker] + * drop some useless level 4 settings for player and renderer + + [wsnipex] + * [rtmp] re-add rtmp options + + [Thomas Amland] + * fix video content type checks + + + [xhaggi] + * [confluence] output new info label Player.SeekStepSize + + [xhaggi] + * [gui] adds new info label Player.SeekStepSize + + [AchimTuran] + * Fixed wrong return type + + [montellese] + * remove unused strings after 9cf3094eed8ca285b26eded5a354e0ec42c79e60 + + [montellese] + * python: fix return values from generated Foo_setMember() implementation (thanks notspiff) + + [montellese] + * settings: remove unused and hidden videolibrary/musiclibrary.enabled settings + + [montellese] + * CWebServer: silence compiler warnings (thanks notspiff) + + [Memphiz] + * [ios/atv2/packaging] - switch back to the hardcoded dsym dir - fixes dsym backups on jenkins which were broken in a0a6e40a6299ff004353603201e6d60f569c1a2c + + [Memphiz] + * [depends/tar-native] - force fdopendir to no because we don't have it when compiling native on 10.9 with 10.10 sdk installed (it would pick fdopendir from 10.10 sdk which is not available at runtime on 10.9 later on when tar is used for packaging the ios deb files) + + [Frank Razenberg] + * [keymap] Update xbox 360 keymap to group joysticks by family; sync names with xpad driver in linux 3.18 + + [Frank Razenberg] + * Remove no longer needed initialization call + + [Frank Razenberg] + * Update CJoystick for changed ButtonTranslator signature + + [Frank Razenberg] + * [buttontranslator] Group joystick keymaps by family + + [wsnipex] + * [configure] tinyxml upstream does not provide a pkg-config file, + + [Kib] + * Update irc channel + + [xhaggi] + * [gui] fix the focus issue since file item list is empty until directory is fetched + + [Tobias Markus] + * cppcheck performance fixes in interfaces/ + + [Matthias Kortstiege] + * [guilib] fix hint text vanish on unfocus - closes #15765 + + [Sebastian Brückner] + * Add support for more CEC remote keys on Android. + + [Rainer Hochecker] + * dvdplayer: fix clock speed + + [Rainer Hochecker] + * dvdplayer: reset speed of video reference clock after refresh rate changed + + [Rainer Hochecker] + * dvdplayer: only consider standard framerates for vfr + + [Matthias Kortstiege] + * [videodatabase] include tvshows base dir in GetPathsForTvShow (fixes #15739) + + [Rainer Hochecker] + * dvdplayer: discard render buffers if gui is not active + + [montellese] + * python: extend ILanguageInvocationHandler to not have to call g_pythonParser directly in CPythonInvoker + + [da-anda] + * [3D] remember user selected 3D modes between videos until playback ended + + [da-anda] + * [3D] handle stereoscopic mode of videos in mixed playlists + + + [ace20022] + * [Fix][bluray] Show simplified bd menu with all playback paths. This fixes playback of (unsupported) bd-java menu disc via the simple menu, e.g., through json-rpc. Additionally GUIDialogSimpleMenu accepts CFileItem& now. + + [Matthias Kortstiege] + * PR6334 xcode sync + + [ace20022] + * [dialogs] Move CGUIWindowVideoBase::ShowPlaySelection to its own class. + + [ace20022] + * [FileItem] Change m_items.size() <= 0 to m_items.empty(). + + [xhaggi] + * [gui] fix: dialog seek bar slider not updated correctly + + [xhaggi] + * [seek] use SeekHandler for ACTION_STEP_FORWARD and ACTION_STEP_BACK + + [xhaggi] + * [seek] adds additive seek support + + [Martijn Kaijser] + * [addon] webinterface shouldn't have GUI as dependency + + + [Rainer Hochecker] + * [pvr] - set framerate if not set by demuxer + + [Rainer Hochecker] + * dvdplayer: fix changing refresh rate after invalid state + + [AlwinEsch] + * [pvr] Fix list change with first or last page selection on Channel Manager + + [Rainer Hochecker] + * [pvr] do not persist channel data a user can not set + + [AlwinEsch] + * [pvr] Fix in Channel Manager channel move with mouse + + [uNiversaI] + * [rebrand] ffmpeg extra-version xbmc -> kodi + + [Kai Sommerfeld] + * [PVR] Optimized CPVRManager::CanSystemPowerdown not to do expensive backend calls (e.g. GetTimers) but to act 100% on locally cached data. + + [Thomas Amland] + * text rendering: dont change character spacing on justify, only word spacing + + [Kai Sommerfeld] + * Optimize CPVRRecording. No more copies, just shared pointers. + + + [Jonathan Lane] + * Fix build in OSX with case-sensitive FS. + + [Tobias Markus] + * cppcheck performance fixes in dbwrappers/ + + [montellese] + * CGUIWindowSlideShow: use CGUIViewStateWindowPictures::GetExtensions() as a fallback if no file extensions were specified in RunSlideshow() + + [montellese] + * CGUIViewStateWindowPictures: cleanup GetExtensions() + + [montellese] + * CGUIViewStateWindowPictures: make GetLockType(), GetExtensions() and GetSources() public like in CGUIViewState + + [Tobias Markus] + * cppcheck performance fixes in win32/ + + [wsnipex] + * [configure] check for tinyxml >= 2.6.2 + + [wsnipex] + * [configure] check for yajl >= 2.0 + + [Thomas Amland] + * [repos] handle errors in repo xml parsing and checksum/addons.xml fetching + + [Ryan Gribble] + * [pvr] bump pvr addons to latest commit + + [Thomas Amland] + * remove unused method + + [Pär Björklund] + * Move GetActiveWindowID from CApplication to a more fitting home in CGUIWindowManager + + [arnova] + * fixed: External subs in (local) custom folder did not work with url encoded files + + [arnova] + * changed: Rename shared strPath to seperate strMoviePath and strSubtitlePath for clarity + + [arnova] + * changed: Add option to not add the path with ChangeBasePath + + [h.udo] + * [Keyboard Layouts] Add Spanish QWERTY + + [Thomas Amland] + * [python] prevent segfault when calling DialogProgress(BG) methods before create() + + [Thomas Amland] + * [python] fix video duration infolabel inconsistency (fixes ticket #13904) + + + [uNiversaI] + * [readme update] libyajl-dev >= 2.0 + + + [Rainer Hochecker] + * [pvr] fix segfault when changing channels via json-rpc + + [Ben Avison] + * Fix for font corruption seen on Windows + + [xhaggi] + * [gui] fix list control couldn't get the focus after introducing #5804 + + [Matthias Kortstiege] + * [osx/ios] xcode sync + + [montellese] + * [win32] update VS project files + + [montellese] + * webserver: add image transformation handler for /image/ paths + + [montellese] + * CTextureCacheJob: add ResizeTexture() implementation + + [Rainer Hochecker] + * dvdplayer: consider audio stream stalled if queue ran dry + + [montellese] + * CPicture: add ResizeTexture() implementation + + [Violet Red] + * [core] Support mixed media types in playlists + + + [Fabian Ockenfels] + * [Confluence] GUIDialogVideoInfo Separate actor name and role + + [Pär Björklund] + * fixed indentation and style + + [Fabian Ockenfels] + * [GUIDialogVideoInfo] Separate actor name and role + + [Tobias Arrskog] + * Remove FEH + + [Anssi Hannula] + * [android] Add 7.1 PCM playback support + + [Tobias Arrskog] + * Dropped libyajl 1.x and removed the dependency on system.h in the JSON parser/writer + + + + [AlwinEsch] + * [confluence] Fix position switching in PVR channel manager dialog + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [Pär Björklund] + * Moved input handling from CApplication into it's own class CInputManager. Removed global g_joystick and made it a private member of CInputManager + + [Pär Björklund] + * Moved window creation and destruction from CApplication and into CGUIWindowManager + + [wsnipex] + * [cmake] clean addons project dir before building from depends + + [wsnipex] + * [cmake] pass arch definitions down to autotools based dependencies + + [wsnipex] + * [cmake] pass autoconf config.sub, config.guess down to addon dependencies + + [montellese] + * [depends] fix missing DEPENDS_PATH definition for non-darwin builds + + [montellese] + * initialize all members of HTTPFileHandler + + [montellese] + * initialize all members of IHTTPRequestHandler + + [Memphiz] + * [atv2] - remove hardcoded gcc 4.2 + + [Memphiz] + * [ios/atv2/osx] - bump sdk version to ios 8.1 and osx 10.10 + + [Memphiz] + * [win32] - bump texturepacker to 1.0.1 ( contains pr #6301 ) + + [ronie] + * [Confluence] focus play/pause button by default + + [montellese] + * [win32] update .gitignore + + [ronie] + * [Confluence] reduce code duplication + + [ronie] + * [Confluence] textbox fixes after 20dd190 + + [AlwinEsch] + * [confluence] Add PVR related parts to music OSD + + [AlwinEsch] + * [pvr] Allow usage of pvr buttons on music osd + + [Rainer Hochecker] + * dvdplayer: avoid unwanted dropping in output stage of video + + [Rainer Hochecker] + * VAAPI: avoid reset when running out of surfaces + + [Rainer Hochecker] + * dvdplayer: do not reset hw decoder if just ffmpeg get_buffer failed + + [Rainer Hochecker] + * dvdplayer: drop dead code - IHardwareDecoder::Section + + [montellese] + * [cmake] fix missing BUILD_ARGS in custom CONFIGURE_COMMAND for dependencies + + [uNiversaI] + * [update] use real support website link + + [Rainer Hochecker] + * fix render order for addon dialogs + + [Jonathan Dray] + * fix(build): debian packages generation + + [ronie] + * [Confluence] use grouplist in MusicOSD + + [ronie] + * [Confluence] re-align buttons after 8832317 + + [Andrius] + * Fix TexturePacker segfault with grayscale PNGs. see http://forum.kodi.tv/showthread.php?tid=216503 + + [Rainer Hochecker] + * [win32] - bump librtmp + + [Rainer Hochecker] + * [OSX] - drop unneeded script for librtmp + + [Rainer Hochecker] + * librtmp: bump to 2.4 + + [Tobias Markus] + * Add missing initialization for m_forceUnicodeFont + + [Memphiz] + * [jenkins] - don't clamp release builds to 1 thread - parallel building seems working ok on the builders [tm] + + [fritsch] + * dvdplayer: fix calculation of level when data based + + [Ben Avison] + * Fix for crash on startup on iOS + + [Sam Stenvall] + * [confluence] disable the "Download" item in the subtitle menu when in live TV + + [Sam Stenvall] + * [confluence] display the subtitle button in live TV too (fixes #15688) + + [Sam Stenvall] + * [confluence] move the teletext button to the left button group + + [montellese] + * video library: overwrite the scraped runtime if the one from stream details is more accurate + + [montellese] + * VideoThumbLoader: use already available reference variable + + [montellese] + * videodb: add SetDetailsForItem() + + [Sam Stenvall] + * [gui] bump version + + [Sam Stenvall] + * [confluence] bump version + + [Sam Stenvall] + * [pvr] remove the "edit" and "delete" buttons from the channel manager + + [Sam Stenvall] + * [pvr] remove support for "virtual" channels + + [ronie] + * [Re-Touched] Add PVR support + + [Balint Reczey] + * mips: Pass --disable-mips.* flags to FFmpeg to cover more platforms + + [Balint Reczey] + * mips: Use #pragma once instead of C style header guard + + [Andriy Prystupa] + * mips: Fix addon shared library naming + + [Balint Reczey] + * mips: Fix build with using OpenGL rendering + + [Balint Reczey] + * mips: Don't use ASM rounding on MIPS + + [Balint Reczey] + * mips: Add configure option for mips and mipsel + + [theuni] + * mips: add atomics + + [ronie] + * [Confluence] don't hide header during radio playback + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [Memphiz] + * [osx] - downgrade curl to former version for now until a serious symbol clash with system libcurl is solved + + [Memphiz] + * [depends/TexturePacker] - fix extraction of delay and disposal from animated gifs (wrong assumption what ExtensionBlockCount was ...) - add delay as printout too + + [ksooo] + * [PVR] Fixed: Calculation of PVR wakeuptime. Did not take margin start of timer into account. + + [montellese] + * binary addons: bring win32 in line with how the "kodi" dependency is prepared/provided + + [montellese] + * cmake: add missing get_filename_component() for DEPENDS_PATH + + [montellese] + * cosmetics: fix indentation in binary addons cmake buildsystem + + [Memphiz] + * [depends/ffmpeg] - force ffmpeg build to use AR and RANLIB from the toolchain + + [Memphiz] + * [depends/droid] - get rid of the NDK_VER parsing/define - not needed anymore as we rely on ndk r9c now (sed works differently on darwin and never got the parsing right) + + [Memphiz] + * [depends/PIL] - force "toolchain-gcc -shared" as linker command for shared libs (LDSHARED) - else it will pull stupid flags based on the building system into it (e.x. -bundle because i compile on osx - stupid python) + + [Memphiz] + * [depends/openssl] - force openssl to use the ar from the toolchain + + [Memphiz] + * [depends/libplist] - stop rebuilding libplist when not compiling for darwin + + [Memphiz] + * [docs] - clarify android readme a bit and added extra bits for building on osx + + [Memphiz] + * [depends] - probe if build os supports sort -V - if not - use sort for determining android build-tools + + [Memphiz] + * [depends/TexturePacker] - make the decisions based on the build mashine and pass the NATIVE_ARCH_DEFINES to the build - not the target defines + + [Memphiz] + * [depends] - expose NATIVE_ARCH_DEFINES and build_os via the Makefile.include to our depends + + [Memphiz] + * [depends/configure] - add build_os - defining our os strings for the os the compilation is run on + + [Memphiz] + * [m4] - add NATIVE_ARCH_DEFINES which present the -DTARGET_ defines for the system the compilation is run on + + [Memphiz] + * [AML/videobookmark] - use the CScreenshotAML class for generating video bookmarks on amlogic + + [Memphiz] + * [AML/Screenshot] - add screenshot implementation for aml platforms - based on the amvideocap driver (needs amlogic kernel with amvideocap support) + + [Memphiz] + * [win32/packaging] - bring the package list back to alphabetical order + + [montellese] + * python: add ControlTextBox.autoScroll() (thanks notspiff) + + [montellese] + * guilib: add CGUITextBox::SetAutoScrolling(delay, time, repeatTime [, condition]) + + [montellese] + * cmake: fix expansion of EXTERNALPROJECT_SETUP variable + + [montellese] + * cmake: replace addon depends build system with call to add_addon_depends + + [montellese] + * cmake: add some comments to handle-depends.cmake + + [Karlson2k] + * [win32/packaging] - Update download script to retry downloading if archive can't be extracted + + [Memphiz] + * [win32/packaging] - repack all win32 depencencies into formed packages + + [Matthias Kortstiege] + * [gui] fix font cutting in auto height textboxes + + [Sam Stenvall] + * [pvr] only update a group's last watched timestamp if the timestamp has actually changed + + [montellese] + * webserver: handle error in case no webinterface is installed + + [montellese] + * cosmetics: remove unused/rarely used "using namespace" declarations + + [montellese] + * [win32] update VS project files + + [montellese] + * webserver: add unit tests + + [montellese] + * [unit tests] set special://home to be able to dynamically load libraries + + [montellese] + * webserver: refactor handling of HEAD requests and of caching and range HTTP headers + + [montellese] + * utils: add unit tests for CHttpRange, CHttpResponseRange and CHttpRanges + + [montellese] + * utils: add HttpRangeUtils to handle HTTP range requests and responses + + [montellese] + * webserver: rename and document methods in IHTTPRequestHandler + + [montellese] + * make CCurlFile::GetHttpHeader() const + + [Kevin Mihelich] + * Fixes for using giflib 5.1 in GifHelper.cpp + + [Rafał Chwiała] + * It allows to play video with external subtitle over UPnP. + + [montellese] + * [confluence] VisualisationPresetList.xml: adjust the header label and list control IDs + + [montellese] + * CGUIDialogVisualisationPresetList: align header label and list control IDs with settings dialogs + + [Kai Sommerfeld] + * Fix CUDevProvider::GetDisks() to support non-removable and optical drives correctly. Fix CAutorun::PlayDisc() to call CMediaManager::GetDiscPath() as last resort. These changes do fix autostart and "Play disc" of Blu-ray disks on Linux distros using UDev, like OpenELEC. + + [Rafał Chwiała] + * PATCH for Platinum library needed to external subtitles over UPnP works. + + [Rafał Chwiała] + * platinum Changes to external subtitles over UPnP works + + [Tobias Arrskog] + * Remove xrandr from application + + [Pablo Molina] + * Added playcount and lastplayed on Audiolibrary.setSongDetails + + [theuni] + * mips: add guards + + + + + [ronie] + * revert makefile changes + + [ronie] + * [Re-Touched] Add PVR support + + [Martijn Kaijser] + * bump to 14.1 final + + + [ronie] + * [Re-Touched] Add PVR support + + [Martijn Kaijser] + * bump to 14.1 final + + + [ronie] + * [Re-Touched] Add PVR support + + [Martijn Kaijser] + * bump to 14.1 final + + + [Matthias Kortstiege] + * [gui] fix font cutting in auto height textboxes + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [Memphiz] + * [keyboard] - disabletextinput after the keyboard dialog is open because in that state the editcontrol has not the focus and therefore textinput is disabled (and text is handled via key actions in this case) + + [Memphiz] + * [guilib/input] - replace GUI_MSG_INPUT_TEXT with ACTION_INPUT_TEXT + + [Memphiz] + * [guilib] - add new action and members ACTION_INPUT_TEXT + + [Sam Stenvall] + * [pvr] Helix: bump PVR addons + + [Mike] + * darwin dlna client user agent string override not working f + + [uNiversaI] + * [Helix backport] Fix memory leak in OGGcodec: m_inited was never set to true and inial… + + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing tv shows or episodes + + [anaconda] + * Fix state not saved after 5842 if playing from "Recently added". + + [Thomas Amland] + * improve error handling of stacked items + + [Rainer Hochecker] + * ffmpeg: bump to 2.4.6 - bug fix + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [Rainer Hochecker] + * upnp: do not block upnp renderer on start of playback + + [Memphiz] + * [sdl/osx] - stop eating cmd+v keycombination away in sdlinput - application handles the paste shortcut already - fixes non-working paste on non-osd-keyboard textfields for osx + + [Memphiz] + * [osx] - fixed vsync for osx - notify reference clock when refresh rate has changed - fixes #15612 + + [montellese] + * media library: don't change the current directory path in SetHistoryForPath() (fixes #15668) + + [montellese] + * media library: ignore trailing slashes when comparing the start directory path with the current directory path + + [montellese] + * URIUtils: support ignoring trailing slashes in PathEquals() + + [Memphiz] + * [addoninstaller] - prevent recursion on addons with circular dependecies - fixes stackoverflow crash with xunity repo + + [montellese] + * videodb: fix GetRandomMusicVideo() with empty WHERE clause (fixes mixed party mode) + + [Martijn Kaijser] + * [addons] sync with repo + + [Sam Stenvall] + * [pvr] fix switching to the previous channel group (fixes #15661) + + [Sam Stenvall] + * [pvr] don't attempt to count the number of recordings unless the PVR manager is started. Fixes #15591 + + [Karlson2k] + * [android] [vfs] PosixFile: fix large file support on Android + + [fritsch] + * DVDDemuxFFmpeg: Take care of av_probe changing buffer_size fixes #15659 + + [a11599] + * [fixed] DXVA flickering on AMD + + [Rainer Hochecker] + * vaapi: allocate an extra surface + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [Anssi Hannula] + * AESinkALSA: Workaround alsa-lib buffer overflow in snd_pcm_chmap_print + + [Rainer Hochecker] + * wasapi: probe S24 before S32, works around some driver bugs + + [Chris "Koying" Browet] + * FIX: [aml] only use screen size if ppscaler is disabled + + [Rainer Hochecker] + * dvdplayer: fix potential segfault when silencing audio + + [ronie] + * [Confluence] labels in PVR Search could overlap + + [Rainer Hochecker] + * dvdplayer: ffmpeg demuxer - do not skip streaminfo if format is not known + + [fape] + * fix GUISpinControl process + + [montellese] + * sorting: fix Container.SetSortMethod (fixes #15627) + + [Martijn Kaijser] + * bump to 14.1rc1 + + [Bl4ck09] + * Do not scroll list label if false + + [ronie] + * [Confluence] remove addon ratings + + [davilla] + * FIX: [aml;pivos] Fix 1080 on MX + + [montellese] + * media library: fix path history for items with a real path differing from the requested path + + + [Ben Avison] + * Switch from glDrawArrays() to glDrawElements(). + + [Ben Avison] + * Move vertex data into an OpenGL VBO when the font cache entry is populated. + + [Ben Avison] + * Move the vertex data across to a vertex buffer object just prior to drawing. + + [Ben Avison] + * Enable hardware clipping. + + [Ben Avison] + * Rather than applying the translation offsets to the vertices, now applies them to the model view matrix from the top of the matrix stack and pushes it over to OpenGL. The vertices themselves are still all held client-side. + + [Ben Avison] + * Move the application of the translation offsets into the GLES code. + + [Ben Avison] + * Rewrite of scrolling text code. + + [Ben Avison] + * Increase font cache hit rate by keying on the fractional part of m_originX and m_originY *after* they have been through the graphics context's transformation matrix, plus the scale/rotation elements of the matrix, rather than the origin in the original frame of reference plus the complete transformation matrix. All vertices of individual glyph bounding boxes are a constant offset from this position, and when the fractional part of the translation is a match, the rounding of each vertex will be in the same direction; this permits us to calculate the desired vertices from the cached ones simply by adding the integer parts of the translations with no additional rounding steps. + + [Ben Avison] + * Lay the groundwork for hardware clipping. + + [Ben Avison] + * Add a cache of font glyph bounding box vertices. + + [Ben Avison] + * CGUIFontTTFBase::RenderCharacter can now append to arbitrary vectors of vertices rather than only CGUIFontTTFBase::m_vertex + + [Ben Avison] + * Convert CGUIFontTTFBase::m_vertex to be managed as a std::vector. + + [Matthias Kortstiege] + * [videosync] remove unused variable + + [Matthias Kortstiege] + * [networkservices] remove unused variable + + [Matthias Kortstiege] + * [httpheader] fix signed/unsigned mismatch + + [Matthias Kortstiege] + * [texturemanager] reorder initialization list + + [Martijn Kaijser] + * [pvr] bump addon.pvr to 1.9.3 after dbfa0b6374b779a62c6fb0456f0c0618a6e25bfc + + [Ben Avison] + * Move the reference-counting of Begin and End calls from DX and GL source files into GUIFontTTF.cpp. + + [Tobias Markus] + * Fix for coverity #719001 + + [Tobias Markus] + * cppcheck performance fixes in linux/ + + [anaconda] + * [cosmetics] StereoscopicsManager: don't log localized strings. + + [montellese] + * binary addons: only create backwards compatibility header file if it doesn't already exist + + [montellese] + * cosmetics: fix a typo in prepare-env.cmake helper script + + + [ace20022] + * fix typo in 729c42b0d9675ea6b3af7192afc23d96a775fc74. + + [Tobias Markus] + * [coverity] Proposed fix for CID 1260398 + + [Tobias Markus] + * cppcheck performance fixes + + [Sam Stenvall] + * [pvr] fix missing variable assignment after PR #4671 + + [ace20022] + * [dvdplayer] Prioritize number of channels over codec over default flag and add a setting to change that behavior. + + + [ronie] + * [Confluence] fixed: sideblade would scroll + + [ronie] + * [Confluence] Cosmetics + + [Mike] + * darwin dlna client user agent string override not working + + [Memphiz] + * [jenkins/droid] - allow to select the ndk version through jenkins jobs and bump to ndk r10d + + [Tobias Markus] + * cppcheck performance fixes in video/ + + + [xhaggi] + * [pvr] fix wrong condition for channel view if no epg items exist + + [Ryan Gribble] + * [pvr] support EPG item type for "ListItem.Premiered" (FirstAired) GUI label + + [AlwinEsch] + * [PVR] Fix CFileItem::FillInDefaultIcon wrong compare position + + [Rainer Hochecker] + * renderer: fix sequence from WaitFrame, Render, FrameMove to WaitFrame, FrameMove, Render + + [Rainer Hochecker] + * renderer: exit gfx lock when waiting for present time + + [Rainer Hochecker] + * guilib: mark control dirty when setting to invisible + + [smallint] + * renderer: improve rendering to gui and separate video layer + + [smallint] + * Set dirty flag in teletext dialog if required + + [Rainer Hochecker] + * renderer: drop old tempfix firstflippage, did not work anyway because RendererHandlesPresent returned always true + + [xhaggi] + * [pvr] fix: refresh container after view mode is changed in guide window + + [Tobias Markus] + * cppcheck performance fixes in view/ + + [AlwinEsch] + * [PVR] Fix CGUIWindowPVRChannels::Update (come back from hidden can not work) + + + [Tobias Markus] + * [coverity] fix for #1262429 + + [Tobias Markus] + * cppcheck performance fixes in windowing/ + + [Tobias Markus] + * cppcheck performance fixes in storage/ + + [xhaggi] + * [keymaps] replaces obsolete mapping of left/right to prev/next group for tv/radio fullscreen with StepBack and StepForward + + [xhaggi] + * [confluence] removes channel group chooser control (id: 503) + + [xhaggi] + * [pvr] removes group chooser from CGUIWindowFullScreen + + [montellese] + * [confluence] remove default heading labels for DialogPeripheralSettings, SmartPlaylistEditor and VideoOSDSettings + + [montellese] + * CGUIDialogAudioSubtitleSettings: add default heading label + + [montellese] + * CGUIDialogVideoSettings: add default heading label + + [montellese] + * cmake: use OUTPUT_DIR instead of DEPENDS_PATH in add_addon_depends + + [montellese] + * cmake: append revision/hash of addon to downloaded tarball to force downloading a new version if the revision/hash has changed + + [Tobias Markus] + * cppcheck performance fixes in utils/ + + [Tobias Markus] + * Fix for Coverity #1126044 + + [Tobias Markus] + * Fix for coverity #1194431 + + [xhaggi] + * [gui] reset view state directly after directory was fetched + + [xhaggi] + * [gui] use m_vecItems directly instead of a new CFileItemList and copy it over to m_vecItems + + [xhaggi] + * [pvr] refactor CPVRManager:OnAction out to PVRActionListener + + [xhaggi] + * [win32] adds PVRActionListener to VS2010 project + + [xhaggi] + * [osx] adds PVRActionListener to xcode project + + [xhaggi] + * [pvr] refactor REMOTE_X key functionality from CGUIWindowFullScreen to PVR action listener + + [xhaggi] + * [win32] adds IActionListener.h to VS2010 project + + [xhaggi] + * [osx] adds IActionListener to xcode project + + [xhaggi] + * [core] adds action listener pattern + + [montellese] + * CGUIDialogPeripheralSettings: add default heading label + + [montellese] + * CGUIDialogSmartPlaylistEditor: add default heading label + + [montellese] + * videodb: (temporarily) trim actor names in AddActor + + [montellese] + * videodb: add update/cleanup logic for version 91 in case of duplicate actors + + + [AlwinEsch] + * [PVR] Fix DialogPVRChannelManager.xml (from name edit go right not work) + + [Tobias Markus] + * [coverity] fixes for missing breaks and falling-through statements + + [Chris "Koying" Browet] + * ADD: [gles] enable contrast & brightness controls + + [Chris "koying" Browet] + * CHG: [gles] use shader for generic yuv bob deinterlacing + + [Chris "koying" Browet] + * FIX: [gles] enable generic bob deinterlacing + + [Chris "Koying" Browet] + * ADD: [gles] BOB deinterlacing + + [Chris "Koying" Browet] + * FIX: [stf] de-invert y at source + + + [Matus Kral] + * [cec] Don't resume on source change if playback is paused. + + [Sam Stenvall] + * [pvr] update the timestamps directly in SetLastWatched() instead of having the caller call Persist() on both the channel and the group, something which leads to an incredible mount of persisting being done everytime someone switches channel + + [Sam Stenvall] + * [pvr] always persist channels to the database immediately when Persist is called. This way we can use lastinsertid() to set the new channel ID for new channels, which means we don't have to rely on GetLastChannelID() which only worked on SQLite databases (TRWTF) and was prone to random segmentation faults. + + [Sam Stenvall] + * [pvr] remove unused method + + [Sam Stenvall] + * [pvr] removed two unused dialogs + + [Sam Stenvall] + * [pvr] no need to assign a variable twice + + [Sam Stenvall] + * [pvr] remove an unneeded lock + + [Sam Stenvall] + * [pvr] remove a lot of unused methods and some unused code + + [Sam Stenvall] + * [pvr] use m_addons directly, no need to use the getter here + + [smallint] + * [imx] Fixed mode change after SysfsUtils port + + [Andriy Prystupa] + * [wayland] fixed wrong current/preferred modes in Output + + [ace20022] + * [URIUtils] Fix IsSmb, IsFTP, IsAfp, IsDAV and IsNfs. Due to protocol stacking, e.g., files in a zip on a smb share were not recognized as files on a network share. + + [Andriy Prystupa] + * Fixed refresh rate calculation for wayland. + + + [Thomas Amland] + * improve error handling of stacked items + + [anaconda] + * Fix state not saved after 5842 if playing from "Recently added". + + [Sam Stenvall] + * [pvr] don't persist channel groups (includes members) unless the group is fully loaded + + + [asavah] + * fix videodb SQL + + + [Matthias Kortstiege] + * [cosmetic] fix signed/unsigned mismatch + + [montellese] + * videodb: potentially fix SQL query in GetRandomMusicVideo + + [Tomas Melin] + * Fix duplicate statement in buttontranslator + + [Tobias Markus] + * cppcheck performance fixes in guilib/ + + [Tobias Markus] + * cppcheck performance fixes in threads/ + + [Tobias Markus] + * cppcheck performance fixes in test/ + + [Tobias Markus] + * cppcheck performance fixes in settings/ + + [Tobias Markus] + * cppcheck performance fixes in rendering/ + + [Tobias Markus] + * cppcheck performance fixes in input/ + + + [ronie] + * [Confluence] Cosmetics + + [Arne Morten Kvarving] + * quell warnings in VideoSyncDRM + + [Tobias Markus] + * Reorder initialization list Fixes compile time warning. + + [Arne Morten Kvarving] + * fixed: URIUtils.IsRemote test (now) accesses the network member in g_application + + [uNiversaI] + * readmes : remove deprecated sdl dependencies. + + [Matthias Kortstiege] + * [videolibrary]: do not set set season artwork on an empty tvshow + + [ronie] + * add path option + + [BigNoid] + * [video info] Fix changing fanart + + [Tobias Markus] + * cppcheck performance fixes in peripherals/ + + + [Rainer Hochecker] + * drop language string for crop black bars after d30e8ec54bbc374e70f1b313881d66ccdb3d2d62 + + [Rainer Hochecker] + * dvdplayer: fix compiler warning in cc code + + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing tv shows or episodes from library + + [wsnipex] + * [depends] fix building audio encoders on non unified depends platforms + + [John Rennie] + * Add support for right mouse drag + + [Rainer Hochecker] + * dvdplayer: drop autocrop + + + [Kai Sommerfeld] + * Optimize CEpgInfoTag. No more copies, just shared pointers. + + [Lars Op den Kamp] + * [PVR] bump add-ons (sync api with PR #4342) closes #4342 + + [Kai Sommerfeld] + * [PVR] Feature: Confirm XBMC shutdown if any local PVR backend is not idle. + + + [ronie] + * [Confluence] fix focused text color for addons on home + + [John Rennie] + * Remove unecessary header + + [John Rennie] + * Add actions for mouse drag start and end + + + [Bernd Kuhls] + * Allow up to 31 days to display in the EPG + + + + + [Bernd Kuhls] + * [configure] Fix display of git revision + + [Rainer Hochecker] + * dvdplayer: closed captions - add DVD style for 608 + + [Rainer Hochecker] + * dvdplayer: also parse h264 for closed captions + + [montellese] + * [win32] binary addons: remove dependencies as they are part of the audioencoder addons now + + [montellese] + * [win32] update/cleanup build scripts for binary addons + + [wsnipex] + * [depends] fix building binary addons with the new auto depends handling + + [wsnipex] + * [depends] adapt binary addon building to new system + + [wsnipex] + * [depends] build cmake with ssl support by using system curl + + [montellese] + * [depends] cmake: set CORE_SYSTEM_NAME for android, ios and rbpi + + [wsnipex] + * [depends] use central include file for binary-addons build + + [wsnipex] + * [cmake] binary addons: automatic dependency resolution + + [wsnipex] + * [cmake] add helper function for addon dependency handling + + [montellese] + * binary addons: don't build audioencoder.flac on IOS/ATV2 + + [wsnipex] + * binary addons: bump audioencoder addons + + [montellese] + * [cmake] binary addons: support negated platform definitions + + [Rainer Hochecker] + * dvdplayer: closed captions - implement 608 as fallback + + [Rainer Hochecker] + * dvdplayer: cc decoder 608 - cosmetics + + [Memphiz] + * [osx] - fixed vsync for osx - notify reference clock when refresh rate has changed - fixes #15612 + + [Memphiz] + * [keyboard] - disabletextinput after the keyboard dialog is open because in that state the editcontrol has not the focus and therefore textinput is disabled (and text is handled via key actions in this case) + + [Memphiz] + * [guilib/input] - replace GUI_MSG_INPUT_TEXT with ACTION_INPUT_TEXT + + [Memphiz] + * [guilib] - add new action and members ACTION_INPUT_TEXT + + [Memphiz] + * [sdl/osx] - stop eating cmd+v keycombination away in sdlinput - application handles the paste shortcut already - fixes non-working paste on non-osd-keyboard textfields for osx + + + [wsnipex] + * [TexturePacker] fix building on ubuntu 12.04 + + + + + + + + [Philipp Te] + * [CONFLUENCE] use VARs for list overlays + + [ronie] + * [Confluence] cosmetics + + [ronie] + * re-touched update Makefile + + [wsnipex] + * [Texturepacker] allow building with giflib4 + + [Arne Morten Kvarving] + * quell compiler warning (no return value) with giflib4 + + [Arne Morten Kvarving] + * fixed: gif support in TexturePacker using giflib4 + + [wsnipex] + * [configure] fix case where --enable-texturepacker is given, but not available + + [Matthias Gehre] + * configure.in: Make SDL depend on joystick + + [Memphiz] + * [addoninstaller] - prevent recursion on addons with circular dependecies - fixes stackoverflow crash with xunity repo + + + [Tobias Markus] + * cppcheck performance fixes in osx/ + + [BigNoid] + * CApplication: fix loading of custom windows + + [Tobias Markus] + * cppcheck performance fixes in network/ + + [Rainer Hochecker] + * upnp: do not block upnp renderer on start of playback + + [Memphiz] + * [win32] - make use of the texturepacker binary package for windows + + [wsnipex] + * [configure] adjust to texturepacker and squish in depends + + [wsnipex] + * [TexturePacker] TEMP workaround for skins: create legacy link. Remove me when skins are fixed + + [wsnipex] + * [TexturePacker] - move texturepacker to native depends + + [wsnipex] + * [depends] add target(non native) libsquish + + [wsnipex] + * [libsquish] - move libsquish to native depends + + [Memphiz] + * [TexturePacker/Win32] - link zlib statically, link statically against libgif, add dependencyfree TexturePacker.exe + + [Memphiz] + * [TexturePacker/Win32] - don't copy sdl dlls to TexturePacker (not needed anymore) + + [Memphiz] + * [TexturePacker] - remove MakeDDS as its heavily broken and would pull in half of XBMC via DDSImage.h/.cpp + + [Memphiz] + * [depends] - add giflib native (which is needed for TexturePacker now) + + [Memphiz] + * [TexturePacker] - fixed win32 projects and makefile to compile the new decoders and link the new libs + + [Memphiz] + * [TexturePacker] - removed unused files + + [Memphiz] + * [TexturePacker] - renamed XBMCTex.cpp to TexturePacker.cpp replace SDL implementation with the new decoders + + [Memphiz] + * [TexturePacker] - send all errors to stderr, all other printouts to stdout + + [Memphiz] + * [TexturePacker] - abstracted image decoder and implemented decoders for jpg (libjpg), gif (libgif) and png (libpng) + + [Memphiz] + * [texturepacker/simplefs] - add some needed helper methods (seek, getfilesize, getfp) + + [wsnipex] + * [depends] bump curl to v7.39.0 + + [wsnipex] + * [depends] bump libnfs to v1.9.6 + + [wsnipex] + * [depends] bump libssh to v0.7.0a + + [wsnipex] + * [depends] bump openssl to 1.0.1j + + [wsnipex] + * [depends] bump gcrypt to v1.6.2 + + [Memphiz] + * [win32] - added static libs to zlib package + + [Memphiz] + * [win32] - added giflib package (needed for TexturePacker and for new gif support in core later aswell) + + [Memphiz] + * [win32] - added libpng package (needed for texturepacker) + + [Tobias Markus] + * cppcheck performance fixes in profiles/ + + [Tobias Markus] + * cppcheck performance fixes in playlists/ + + + [Tobias Markus] + * cppcheck performance fixes in filesystem/ + + + [ronie] + * [Confluence] fix header label + + [Arne Morten Kvarving] + * cosmetics after CStdString removal + + [Arne Morten Kvarving] + * CXRandR: pass strings by reference, not value + + [mrhipp] + * [airtunes] - feed audio data to the pipe in one chunk instead of splitting into 64 byte buffers - reduces audio stuttering + + [Matthias Kortstiege] + * [scraper] initialize members in the order they were declared + + [montellese] + * BYE BYE CStdString + + [Jonathan Marshall] + * [stdstring] fix xbmc/commons/Exception.h + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in interfaces/json-rpc/GUIOperations.cpp + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in xbmc/cdrip/CDDARipper.h + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in network/cddb.h + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in interfaces/info/SkinVariable.h + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in StringUtils.cpp + + [montellese] + * [stdstring] get rid of CStdString in cores/ + + [Jonathan Marshall] + * [stdstring] get rid of CStdString in UnrarXLib + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in URIUtils.cpp + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in utils/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in windows/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in guilib/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in xbmc/Util.cpp + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in xbmc/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in network/upnp/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in video/windows/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in video/dialogs/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in video/ + + [montellese] + * [stdstring] get rid of CStdString in win32/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in settings/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in windowing/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in rendering/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in profiles/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in powermanagement/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in pictures/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in peripherals + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in osx/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/windows/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/karaoke/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/infoscanner/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/dialogs/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/tags/ + + [Arne Morten Kvarving] + * [stdstring] get rid of CStdString in music/ + + [ronie] + * don't force skins to use a panel container + + [Thomas Amland] + * [confluence] left align addon descriptions + + [montellese] + * media library: don't change the current directory path in SetHistoryForPath() (fixes #15668) + + [montellese] + * media library: ignore trailing slashes when comparing the start directory path with the current directory path + + [montellese] + * URIUtils: support ignoring trailing slashes in PathEquals() + + [montellese] + * videodb: avoid an empty entry in string arrays + + [Tobias Markus] + * cppcheck performance fixes in epg/ + + + [ronie] + * [Confluence] there's no reason to hide the visualization in the pvr channels windows + + [Matthias Kortstiege] + * [cosmetic] fix missing default switch statement + + [Matthias Kortstiege] + * [cosmetic] initialize members in the order they were declared + + [uNiversaI] + * [confluence] fix cosmetic scrollbar shwing for half setting height + + [Rainer Hochecker] + * dvdplayer: add counting selection streams of type and source + + [Rainer Hochecker] + * dvdplayer: close/flush subtitle player in OpenDefaultStreams + + [Rainer Hochecker] + * dvdplayer: closed captions - fix rollup types and clear window + + [Rainer Hochecker] + * dvdplayer: fix for closed captions + + [uNiversaI] + * [confluence] Chapter foward always hidden by broken condition + + [Tobias Markus] + * cppcheck performance fixes in dialogs/ + + [montellese] + * silence warning in TestDatabaseUtils (thanks @notspiff) + + [Tomi Harjunmaa] + * Fix memory leak in OGGcodec: m_inited was never set to true and inialization was done always causing a memory leak + + [anaconda] + * Fix leftover from c89ddea209bff64dab7cb386be4a5fad06263610 + + [Sam Stenvall] + * [pvr] properly select the hovered channel in the channel manager (fixes #15473) + + [xhaggi] + * [pvr] don't reset internal group channel numbers if reset channel number cache + + + [montellese] + * videodb: use PrepareSQL() instead of StringUtils::Format() for SELECT query + + [montellese] + * videodb: remove unused GetMusicVideoCount() + + [montellese] + * videodb: fix GetRandomMusicVideo() with empty WHERE clause (fixes mixed party mode) + + [Martijn Kaijser] + * [addons] sync with repo + + [Tobias Markus] + * cppcheck performance fixes in cores/paplayer + + [Ryan Gribble] + * [pvr] EPG_INFO field "strIconPath" was not being stored/retrieved in the EPG database + + [Ryan Gribble] + * [pvr] EPG_INFO field "strIconPath" was not being transferred in Update() function + + + [Wolfgang Schupp] + * Revert "Moved userdata to XDG_DATA_HOME" + + [Chris "Koying" Browet] + * CHG: Extract SysfsUtils from the AML utils + + [montellese] + * cosmetics: remove unneeded C header includes from Webserver.h + + [montellese] + * cosmetics: make CPythonInvoker and CAddonPythonInvoker constructor explicit + + [montellese] + * cosmetics: add virtual destructor to classes derived from IHTTPRequestHandler + + [montellese] + * [win32] remove non-existing xbmc/interfaces/swig/ControlListAddItemMethods.i from VS project files + + [popcornmix] + * squash: Changes suggested by Jalle19 + + [Philipp Te] + * [CONFLUENCE] fix spacer image width + + [popcornmix] + * [PVR] Fix for slow metadata updates of recordings + + [Sam Stenvall] + * [pvr] fix switching to the previous channel group (fixes #15661) + + [Rainer Hochecker] + * dvdplayer: do not wait for buffers when closing subs or teletext in OpenDefaultStreams + + [ace20022] + * [dvdplayer/settings] Add option to prefer audio/subtitle streams for visually/hearing impaired. + + [ace20022] + * [DVDDemux] Add FLAG_HEARING_IMPAIRED and FLAG_VISUAL_IMPAIRED flags. + + [a11599] + * [fixed] DXVA flickering on AMD + + [Stanisław Gackowski] + * Corrected references to special paths for clarity + + [Balint Reczey] + * Fix bashisms in shell scripts + + [Stanisław Gackowski] + * Place link when migrating directory to new location + + [Stanisław Gackowski] + * Moved temp folder to XDG_CACHE_HOME on Linux + + [Stanisław Gackowski] + * Moved userfiles to XDG base directory spec compliant location (XDG_DATA_HOME) + + + [Rainer Hochecker] + * AE: make stream more robust against frequent calls to flush + + [Memphiz] + * [gnutls] - enable gnutls support for all platforms + + [Memphiz] + * [depends/gmp/ios] - fix compilation of gmp - needed for gnutls + + [Memphiz] + * [depends/nettle/ios] - on older ios toolchains we need to disable assembly because gcc 4.2 (xcode3) doesn't know about ".int" asm operator + + [Rainer Hochecker] + * dvdplayer: CID 1261373 (#1 of 1): Resource leak (RESOURCE_LEAK) + + [Rainer Hochecker] + * wasapi: fix incorrect error log + + [Rainer Hochecker] + * dvdplayer: fix for closed captions + + [mgehre] + * configure.in: Fix final_message without PulseAudio + + [Chris "Koying" Browet] + * FIX: [aml] only use screen size if ppscaler is disabled + + [Philipp Te] + * [Confluence] - some improvements for VideoOSD + + + [fritsch] + * DVDDemuxFFmpeg: Take care of av_probe changing buffer_size fixes #15659 + + [Sam Stenvall] + * [gui] correct the logic for checking whether we have a sort method or not + + [Sam Stenvall] + * [pvr] don't attempt to count the number of recordings unless the PVR manager is started. Fixes #15591 + + [Anssi Hannula] + * AESinkALSA: Workaround alsa-lib buffer overflow in snd_pcm_chmap_print + + [Rainer Hochecker] + * vaapi: allocate an extra surface + + [Rainer Hochecker] + * ffmpeg: explicitly disable sdl + + [Rainer Hochecker] + * ffmpeg: bump to 2.5.2 + + [Rainer Hochecker] + * dvdplayer: sync large audio errors without playing with the clock + + [Rainer Hochecker] + * dvdplayer: simplify calculation of playing pts for audio + + [Sam Stenvall] + * [squash] inject parent implemenation's context buttons before the Manage button + + [Sam Stenvall] + * [gui] bump xbmc.gui to 5.6.0 + + [Sam Stenvall] + * [confluence] bump version to 2.6.0 + + [Sam Stenvall] + * [settings] make "Group manager" accessible from the Live TV settings, just like the channel manager + + [Sam Stenvall] + * [language] rename "Group management" to "Group manager" to better match "Channel manager" + + [Sam Stenvall] + * [confluence] move the "group items" radio button under "Misc Options" + + [Sam Stenvall] + * [confluence] remove height limitation from the PVR side blade + + [Sam Stenvall] + * [pvr] remove a lot of duplicated functionality from the channel list context menu. Some of the functionality is already present in the channel manager dialog, and for consistency some options (filter and show hidden channels) have been moved to the side blade (similar to how it's done for e.g. movies). + + [Rainer Hochecker] + * wasapi: probe S24 before S32, works around some driver bugs + + [Sam Stenvall] + * [pvr] remove unused variable + + [fritsch] + * Revert "fixed: CID 719030 Copy into fixed size buffer" + + [fritsch] + * Revert "fixed: CID 719030 Copy into fixed size buffer" + + [fritsch] + * Revert "fixed: CID 719032 Copy into fixed size buffer" + + [Rainer Hochecker] + * dvdplayer: fix potential segfault when silencing audio + + [Joakim Plate] + * fixed: CVE 1249615 Dereference after null check + + [Joakim Plate] + * fixed: CID 1248213 Unsigned compared against 0 + + [Joakim Plate] + * fixed: CID 1248203 Logically dead code + + [Joakim Plate] + * fixed: CID 1228827 Logically dead code + + [Joakim Plate] + * fixed: CID 1228826 Logically dead code + + [Joakim Plate] + * fixed: CID 228815 Unchecked return value + + [Joakim Plate] + * fixed: CID 719171 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719169 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719168 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719167 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719166 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719165 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719164 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719163 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719162 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719160 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719159 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719157 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719153 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719151 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 719150 Uninitialized scalar field + + [Joakim Plate] + * fixed: CID 719032 Copy into fixed size buffer + + [Joakim Plate] + * fixed: CID 719030 Copy into fixed size buffer + + [Joakim Plate] + * fixed: CID 719030 Copy into fixed size buffer + + [Joakim Plate] + * fixed: CID 719029 Copy into fixed size buffer + + [ace20022] + * [pvr] Fix segfault introduced in 841fb09f0d2f31e5bf9b3cb5df05c7dbfcae0300. + + [Joakim Plate] + * fixed: CID 719001 Resource leak + + [Joakim Plate] + * fixed: CID 718985 Big parameter passed by value + + [Joakim Plate] + * fixed: CID 1248237, 1248250 Unintended sign extension + + [Joakim Plate] + * fixed: CID 1248206 Unchecked dynamic_cast + + [Joakim Plate] + * fixed: CID 1248179 Unchecked return value + + [Joakim Plate] + * fixed: CID 1228812 Unchecked return value + + [Joakim Plate] + * fixed: CID 1221980 Unchecked return value + + [Joakim Plate] + * fixed: CID 1207074 Untrusted value as argument + + [Joakim Plate] + * fixed: CID 718202 Uninitialized pointer field + + [Joakim Plate] + * fixed: CID 718013 Resource leak + + + [montellese] + * unit tests: fix TestDatabaseUtils + + [montellese] + * [win32] fix "Debug Testsuite" target compilation of DVDCodecs' cc_decoder + + [ronie] + * [Confluence] labels in PVR Search could overlap + + [montellese] + * cosmetics: fix c&p'ed code comment in CVideoInfoTag::ToSortable() + + [Rainer Hochecker] + * dvdplayer: drop setting sync methods for sync playback to display. default to resample and drop/dup for passthrough + + [Rainer Hochecker] + * [pvr] bump addons after #6036 + + [Martijn Kaijser] + * [skin] update re-touched + + [Rainer Hochecker] + * dvdplayer: captions, update rullup windows at end of sequence + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [Rainer Hochecker] + * dvdplayer: add setting to enable parsing for closed captions + + [Rainer Hochecker] + * dvdplayer: add support for closed captions + + [Rainer Hochecker] + * dvdplayer: ffmpeg demuxer - do not skip streaminfo if format is not known + + [Rainer Hochecker] + * dvdplayer: fix mime type for mpegts + + [Rainer Hochecker] + * dvdpalyer: revomve dead cc code + + [Rainer Hochecker] + * dvdplayer: add closed caption decoder for cea708 + + [ace20022] + * [pvr][cleanup] Make class CPVRChannelGroupsContainer' non-copyable. + + [ace20022] + * [pvr][cleanup] Technically the member function 'foo::bar' can be const. + + [ace20022] + * [pvr][cleanup] The scope of the variable 'foo' can be reduced. + + [ace20022] + * [pvr][cleanup] Possible null pointer dereference: tag - otherwise it is redundant to check it against null. + + [ace20022] + * [pvr][cleanup] Member variable 'CPVRTimerInfoTag::m_genre' is not assigned a value in 'CPVRTimerInfoTag::operator='. + + [ace20022] + * [pvr][cleanup] Member variable 'foo::bar' is not assigned a value in 'foo::bar='.tor. + + [ace20022] + * [pvr][cleanup] Member variable 'foo::bar' is not initialized in the constructor. + + [ace20022] + * [pvr][cleanup] Variable 'iClientIndex' is reassigned a value before the old one has been used if variable is no semaphore variable. + + [ace20022] + * [pvr][cleanup] Variable 'foo' is assigned in constructor body. Consider performing initialization in initialization list. + + [ace20022] + * [pvr][cleanup] Function parameter 'path' should be passed by reference. + + [ace20022] + * [pvr][cleanup] Prefer prefix ++/-- operators for non-primitive types. + + [ace20022] + * [pvr][cleanup] Unused variable: strBackendDiskspace . + + + [Chris "Koying" Browet] + * FIX: [aml] S812 can do 4K + check earlier + + [Chris "Koying" Browet] + * FIX: hevc bitstream tweak from aml + + [John Stebbins] + * MediaCodec: add hw accel hevc playback + + [John Stebbins] + * StageFright: add hw accel hevc playback + + [John Stebbins] + * BitstreamConverter: add hevc annex-b conversion + + [montellese] + * store the sort order per sort method instead of globally + + [montellese] + * rename SORT_METHOD_DETAILS to GUIViewSortDetails + + [montellese] + * cosmetics in GUI view related code + + [Chris "Koying" Browet] + * CHG: [droid] do not h/w decode SD video (save on support) + + [fape] + * fix GUISpinControl process + + [Tobias Markus] + * Remove string initialization + + [Joakim Plate] + * fixup! GL: switch to CPU based matrix caculations to match GLES + + [Joakim Plate] + * fixup! GL(ES): Simplify matrix stack handling + + [Joakim Plate] + * GL(ES): Simplify matrix stack handling + + [Joakim Plate] + * GL: switch to CPU based matrix caculations to match GLES + + [Joakim Plate] + * gl: avoid grabbing viewport on each render + + [Chris "Koying" Browet] + * ADD: [aml] add h265/hevc support + + [Stanislav Vlasic] + * Add aml_support_hevc function and recognize S812 chip + + + [Tobias Markus] + * Fixing vdp_st checking + + [Tobias Markus] + * cppcheck fixes in cores/dvdplayer/ + + [Tobias Markus] + * cppcheck performance fixes in cores/AudioEngine + + [Chris "Koying" Browet] + * FIX: [amc] check for exceptions on everything + + [Chris "Koying" Browet] + * FX: [jni] useExceptionCheck rather than ExceptionOccured + + [montellese] + * binary addons: bump audioencoder.vorbis to match libvorbis built on win32 + + [montellese] + * [win32] binary addons: replace prebuilt libflac dependency with a cmake based one + + [montellese] + * [win32] binary addons: add and build nasmw executable needed for building flac + + [montellese] + * [win32] binary addons: replace prebuilt libvorbis dependency with a cmake based one + + [montellese] + * [win32] binary addons: replace prebuilt libogg dependency with a cmake based one + + [montellese] + * [win32] binary addons: replace prebuilt libmp3lame dependency with a cmake based one + + [Tobias Markus] + * cppcheck performance fixes in cores/dllloader/ + + [montellese] + * sorting: fix Container.SetSortMethod (fixes #15627) + + + [Tobias Markus] + * cppcheck performance fixes in cores/playercorefactory + + + [fritsch] + * VAAPI: Enable VC1 by default - not much interlaced content there + + [fritsch] + * [art] fix up dfaacca54d4a8f78ee02a041d4d1648aa0b403a2 + + [montellese] + * upnp: add support for xbmc:uniqueidentifier with IMDB/TVDB identifier + + [montellese] + * platinum: add patch for bd19c357eb + + [montellese] + * platinum: add xbmc:uniqueidentifier for IMDB/TVDB identifiers + + [Tobias Markus] + * cppcheck performance fixes in android/ + + [wsnipex] + * [depends] fix gmp Makefile + + [wsnipex] + * [depends] fix nettle dylib target + + [wsnipex] + * [depends] bump gnutls to last stable version 3.3.10 + + [wsnipex] + * [android] re-enable gnutls in ffmpeg + + + [fritsch] + * AESinkPULSE: Use const ref when finding the channel map + + [montellese] + * [videodb] bump version + + [montellese] + * videodb: cleanup/fix DELETE triggers + + [Jonathan Marshall] + * [videodb] use type_view for views + + [Jonathan Marshall] + * [videodb] FIX: drop incorrect querying of non-existent setlinkmovie table + + [Jonathan Marshall] + * [videodb] adds AppendFilter() to simplify repetitive queries in GetFilter + + [Jonathan Marshall] + * [videodb] simplify AddToLinkTable, RemoveFromLinkTable implementations + + [Jonathan Marshall] + * [videodb] switch the tag and link tables to the new layout + + [Jonathan Marshall] + * [videodb] switch the studio,genre,country and link tables to the new format + + [Jonathan Marshall] + * [videodb] refactor UpdateLinkTable into AddLinksToItem, UpdateLinksToItem, and use these when adding genre,country,studio + + [Jonathan Marshall] + * [videodb] cleanup AddCast, AddLinkToActor to drop unused params + + [Jonathan Marshall] + * [videodb] switch actor table and links to the new layout + + [Jonathan Marshall] + * [videodb] refactors UpdateActorLinkTable into UpdateActorLinksToItem, AddActorLinksToItem, with special case for musicvideos + + [Jonathan Marshall] + * [videodb] add routines for creating link indices + + [Jonathan Marshall] + * [smartplaylist] adds routine for generating queries against videodb link tables + + [Jonathan Marshall] + * [dbwrappers] have query() take a std::string, we copy direct into a std::string anyway in the functions + + [xhaggi] + * [gui] bump api version to 5.5.0 + + [xhaggi] + * [confluence] adds radio button to hide/unhide a group in DialogPVRGroupManager + + [xhaggi] + * [pvr] adds support for hiding groups + + [fritsch] + * VAAPI: Log the function of the CheckSuccess that failed + + [Tobias Arrskog] + * Made versiontag optional + + [fritsch] + * VAAPI: Report failure when VPP is not usable + + [fritsch] + * VAAPI: Don't return false when vlVaQueryDisplayAttributes returns empty + + [Martijn Kaijser] + * [skin] include last re-touched fixes + + [ace20022] + * [Fix] Deinitialize the audio manager to avoid memory leaks. + + [fritsch] + * CFile: Don't cast potential negative values to unsigned int + + [ronie] + * [Confluence] remove unused code + + [montellese] + * addons: "defaultresolution" attribute is optional in skin.xsd + + [montellese] + * addons: rename "defaultresolutionwide" attribute to "defaultwideresolution" in skin.xsd + + [montellese] + * addons: remove unused "defaultthemename" attribute from skin.xsd + + [montellese] + * addons: add "res" element to skin.xsd + + [montellese] + * addons: add service.xsd + + [montellese] + * addons: add "cachepersistence" attribute to scraper.xsd + + [montellese] + * addons: fix repository.xsd + + [montellese] + * addons: remove "wingl" as a possible platform value from metadata.xsd + + [montellese] + * addons: remove unused "content" element from pluginsource.xsd + + [montellese] + * addons: fix pluginsource.xsd + + [Thomas Amland] + * remove old samba mount code + + [Memphiz] + * [osx/ios/atv2] - sync xcode project + + [montellese] + * [win32] update VS project files + + [montellese] + * filesystem: reduce code duplication in CBlurayFile, CMultiPathFile, CSpecialProtocolFile and CSpecialProtocolDirectory by deriving from COverrideFile/COverrideDirectory + + [montellese] + * filesystem: add COverrideFile and COverrideDirectory + + [Bl4ck09] + * Do not scroll list label if false + + + [Tobias Arrskog] + * Made versiontag optional + + [Martijn Kaijser] + * [skin] include last re-touched fixes + + [fritsch] + * CFile: Don't cast potential negative values to unsigned int + + [Martijn Kaijser] + * [release] bump to Helix 14.0 final + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [ace20022] + * [Fix] Fix a memory leak in PlayerSelectionRule.cpp. + + [ace20022] + * [Fix] Fix a memory leak in Setting.cpp. + + [t4-ravenbird] + * woa - use profile path + + [Rainer Hochecker] + * DXVA: add HD5xxx to ati work-around, only capable of opening a single time + + [Rainer Hochecker] + * dvdplayer: make sure overlay container is cleared when player stops + + [h.udo] + * [rebrand][confluence sounds.xml] xbmc -> kodi + + [h.udo] + * [rebrand][Json-RPC schema] xbmc -> kodi + + [h.udo] + * [rebrand][Linux FEH_py.in] xbmc -> kodi + + [h.udo] + * [rebrand][Win32BuildSetup readme.txt] xbmc -> kodi + + [h.udo] + * [rebrand][ps3_remote.py] xbmc -> kodi + + [h.udo] + * [rebrand][OSX Credits.html] xbmc -> kodi + + [h.udo] + * [rebrand][German keyboardmap.xml] xbmc -> kodi + + [Rainer Hochecker] + * DXVA: add HD4xxx to ati work-around, only capable of opening a single decoder at a given time + + [fritsch] + * IMX: Announce EGL_QUIRK_RECREATE_DISPLAY_ON_CREATE_WINDOW to fix refreshrate change + + [fritsch] + * EGL: Add Quirk for display recreation + + [wolfgar] + * Revert to software decoding for AVC profile 578 as it is not handled by imx6 VPU + + [host505] + * [keyboardlayout] Add Greek QWERTY + + [uNiversaI] + * [confluence] [confluence] minor cosmetic to codec info background + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + + [ronie] + * [Confluence] cosmetics + + [Tobias Markus] + * Check return value + + [Tobias Markus] + * cppcheck performance fixes in addons/ + + [ace20022] + * [Fix] Fix a memory leak in PlayerSelectionRule.cpp. + + [Martijn Kaijser] + * [keyboard] only use English names for layouts + + [ace20022] + * [Fix] Fix a memory leak in Setting.cpp. + + [Matthias Kortstiege] + * [art] fix missing container art for album paths + + [davilla] + * FIX: [aml;pivos] Fix 1080 on MX + + [ronie] + * [Confluence] remove addon ratings + + [Rainer Hochecker] + * DXVA: add HD5xxx to ati work-around, only capable of opening a single time + + [Rainer Hochecker] + * dvdplayer: make sure overlay container is cleared when player stops + + [t4-ravenbird] + * woa - use profile path + + [Matthias Kortstiege] + * [gui] bump gui version to 5.4.0 + + [Matthias Kortstiege] + * [infomanager] nuke old container art infolabels + + [Martijn Kaijser] + * [skin] fix weather layout re-touched + + [Matthias Kortstiege] + * [art] add container art to music paths + + [Matthias Kortstiege] + * [art] tvshow season art not set correctly when item list was flattened + + [Matthias Kortstiege] + * [infomanager] adds container.art + + [Martijn Kaijser] + * [addons] sync with repo + + [Martijn Kaijser] + * [skin] update re-touched + + [Rainer Hochecker] + * DXVA: add HD4xxx to ati work-around, only capable of opening a single decoder at a given time + + [Dr-Romantic] + * [keyboardlayout] add Arabic layout. + + [Thomas Amland] + * [addons] display a more helpful message on python errors + + [anaconda] + * Fix resume on multi-episode files if no resume point is set. + + [fritsch] + * BaseRender: Allow 1px wrong in aspect ratio to not do completeley refit the image + + [h.udo] + * [rebrand][confluence sounds.xml] xbmc -> kodi + + [h.udo] + * [rebrand][Json-RPC schema] xbmc -> kodi + + [h.udo] + * [rebrand][Linux FEH_py.in] xbmc -> kodi + + [h.udo] + * [rebrand][Win32BuildSetup readme.txt] xbmc -> kodi + + [h.udo] + * [rebrand][ps3_remote.py] xbmc -> kodi + + [h.udo] + * [rebrand][OSX Credits.html] xbmc -> kodi + + [h.udo] + * [rebrand][German keyboardmap.xml] xbmc -> kodi + + [montellese] + * media library: fix path history for items with a real path differing from the requested path + + [Memphiz] + * [tests/osx] - add unit tests for aliasshortcut resolving + + [Memphiz] + * [osx] - add method for creating an alias shortcut (used for unit testing) + + [Memphiz] + * [osx] - replace alias / shortcut handling with non deprecated functions (fixes non working alias resolving since osx 10.10 yosemite) + + [Memphiz] + * [osx] - move alias/shortcut translation code to darwinhelpers + + [Karlson2k] + * [android] [vfs] PosixFile: fix large file support on Android + + [Chris "Koying" Browet] + * FIX: [droid] make python PIL module working + + [Chris "Koying" Browet] + * FIX: [droid;python] proper handling of module libraries + + [Chris "Koying" Browet] + * FIX: [droid;packaging] handle addons libraries + + [Matthias Kortstiege] + * [mediawindow] remove unused function OnFinalizeFileItems + + [Matthias Kortstiege] + * [infomanager] added Container(id).CurrentItem + + [montellese] + * win32: add nopvraddons and nobinaryaddons options to BuildSetup.bat + + [montellese] + * win32: fix indentations in BuildSetup.bat + + [Martin van Beurden] + * [win32] remove redundant /MP compiler option in release builds. + + [Martin van Beurden] + * [win32] git_revision custombuild trigger from existing file, set correct outputpath, remove non existing dependency. + + [Martin van Beurden] + * [win32] remove non-existing header files from project files + + [montellese] + * webserver: refactor IsAuthenticated() + + [montellese] + * webserver: silence warning + + [montellese] + * webserver: use defines for HTTP header fields and values + + [montellese] + * webserver: handle Cache-Control: no-cache and Pragma: no-cache + + [montellese] + * webserver: add Cache-Control HTTP header to cacheable responses + + [montellese] + * webserver: add support for If-Unmodified-Since HTTP header + + [montellese] + * webserver: cosmetic refactoring + + + [fritsch] + * IMX: Announce EGL_QUIRK_RECREATE_DISPLAY_ON_CREATE_WINDOW to fix refreshrate change + + [fritsch] + * EGL: Add Quirk for display recreation + + [host505] + * [keyboardlayout] Add Greek QWERTY + + [wolfgar] + * [imx6] Revert to software decoding for AVC profile 578 as it is not handled by imx6 VPU + + [Thomas Amland] + * [videoinfoscanner] fix multipath scanning + + + [Martijn Kaijser] + * fix wrong values in version.txt after 15.0a1 bump + + [Lars Op den Kamp] + * Revert "Disable extra logging by default" + + [Rainer Hochecker] + * dvdplayer: allow skipping streaminfo only for mpegts streams + + [Rainer Hochecker] + * Revert "rename xbmc folder to src" + + [Rainer Hochecker] + * Revert "change xbmc/ path to src/ in all files" + + + [Fneufneu] + * change xbmc/ path to src/ in all files + + [Fneufneu] + * rename xbmc folder to src + + [Martijn Kaijser] + * Set version to development version 15.0 alpha1 and change splash screen + + [uNiversaI] + * [confluence] minor cosmetic to codec info background + + [Martijn Kaijser] + * [addons] sync with repo + + [Rainer Hochecker] + * dvdplayer: ffmpeg decoder - initialize codec control flags, fixes thumbnail extraction which does not set those members + + [Chris "Koying" Browet] + * FIX: [aml] properly handle rotation + + [Rainer Hochecker] + * dvdplayer: double number of frames to try for thumbnails + + + [fritsch] + * VAAPI: Take more care when probing filters + + [phate89] + * [metadata.tvdb.com] updated to version 1.7.0 + + + [Sam Stenvall] + * [pvr] bump addons (fixes #15598) + + [Memphiz] + * [AE/CA/osx] - cosmetics - make comment generic + + [Memphiz] + * [AE/CA/osx] - fillup the stream with up to 16 unknown channels fixes support for studio audio devices with more then 8 unused/unknown channels in one stream + + [Memphiz] + * [AE] - extend the number of unknown channels from 8 to 16 + + [Tarulia] + * [keymap] Make XB360 DPads consistent + + [MilhouseVH] + * [rebrand] Cosmetic #2 - apply Kodi label to CPU stat + + + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [MilhouseVH] + * [rebrand] Cosmetic + + [oldnemesis] + * Fixed memory allocation; not enough memory was allocated + + + [h.udo] + * [system colors.xml] correct wrong colors and spelling + + [Matthias Kortstiege] + * [infomanager] fix missing seekoffset label when seeking chapters + + [wsnipex] + * [linux] fix building libxbmc.so + + [xhaggi] + * [pvr] adds parental lock check to PlayMedia() + + [xhaggi] + * [pvr] fix built-in PlayMedia with PVR channels and recordings (Trac #15164) + + [Martijn Kaijser] + * [language] fix incorrect strings + + + [Martijn Kaijser] + * [language] fix incorrect strings + + [h.udo] + * [system colors.xml] Remove whitespace + + [Karlson2k] + * [win32] WIN32Util::PowerManagement: fix restart on Win8.1 + + [txtranslation] + * [lang] added missing langinfo.xml files for new languages + + [Martijn Kaijser] + * [addons] sync with repo + + [Thomas Amland] + * fix wrong video content type on empty tvshow title + + [h.udo] + * [CONTRIBUTING.md] Update to Kodi links + + [h.udo] + * [README.md] Update to Kodi links + + [dhead666] + * [pvr] bump addons + + [Thomas Amland] + * [rebrand] new linux icons + + [Rainer Hochecker] + * dvdplayer: defer release of ffmpeg hw decoder after next decode, deleting a hw decoder in GetFormat can result in a crash for dxva + + [h.udo] + * [rebrand][osx] new icons + + [h.udo] + * [rebrand][upnp] new icons + + [hudokkow] + * [rebrand][web interface] new favicon.ico + + [h.udo] + * [rebrand][atv2] new AppIcon.png + + [h.udo] + * [rebrand][ios] new icons + + [h.udo] + * [rebrand][android] new icons + + [h.udo] + * [rebrand][win] new application.ico + + [Chris "Koying" Browet] + * FIX: [droid] fix launching leanback only apps + + [Chainfire] + * fix playback getting progressively slower and memory filling up until crash + + [ronie] + * replace webserver logo + + [fritsch] + * VAAPI: Let untested drivers use vaapi via advanced setting + + [Rainer Hochecker] + * dvdplayer: fix audio/l16 for ffmpeg demuxer, format cannot be probed + + [Rainer Hochecker] + * fix getting charset from http header, incorrect usage of constructor for string + + [Rainer Hochecker] + * CCurlFile: allow getting full content type + + [Chris "Koying" Browet] + * FIX: [amc] bail out on null hint size + + [Alex Deryskyba] + * [aml] Do not disable keyboard auto-repeat for Meson6 and higher + + [Rainer Hochecker] + * paplayer: drop broken PCM codec, use ffmpeg instead + + [Memphiz] + * [input/linux] - map KEY_BACK to xbmckey backspace - same like we do for android (key back as found on the wetek remote sends KEY_BACK keycode which is not mapped on linux and so isn't usable in openelec on that box) + + [Chris "Koying" Browet] + * FIX: [amc] if omx returns w/h, use it + + [Chris "Koying" Browet] + * FIX: [amc] trap exception when mime is unsupported + + [Chris "Koying" Browet] + * FIX: [amc] log exceptions + + [Chris "Koying" Browet] + * FIX: [mediacodec] more exception checking + + [Chris "Koying" Browet] + * FIX: [mediacodec] handle aspect ratio + + [Chris "Koying" Browet] + * FIX: [mediacodec] prevent crash if 'createByCodecName' throws an exception (omx.rk) + + [Karlson2k] + * Update PIL package to prevent crash with some addons + + [Chris "Koying" Browet] + * FIX: [droid;aml] fix preview scaling + + [Martijn Kaijser] + * [release] bump to 14.0 rc3 + + + [Martijn Kaijser] + * [skin] update re-touched skin + + + [Matthias Kortstiege] + * [art] use correct art type when appending art to item lists + + [Tarulia] + * [keymap] Add support for XBOX One Controller for PC + + [xhaggi] + * [cosmetics] fix indentation + + [xhaggi] + * [pvr] fix: separate sort orders for each directory in recordings window + + [Rainer Hochecker] + * dvdplayer: demuxer ffmpeg - do not create streams until having seen pat/pmt for pvr + + [Martijn Kaijser] + * [skin] update re-touched skin + + [fastcolors] + * [osx] new application icons + + [Memphiz] + * Revert "[airplay] - merge the binary plist and xml plist pathes in airplay (which already diverged) by using libplist for parsing in both cases - not only the binary case" + + [xhaggi] + * [epg] fix selecting channel if given index is smaller than channel offset + + [xhaggi] + * [pvr] use getter/setter instead of directly access m_selectedItemPaths + + [uNiversaI] + * [audioencoders] bump to their latest master + + + [perexis] + * Fixed Polish translation of "%s of %s available" + + [Martijn Kaijser] + * [release] bump to 14.0 rc2 + + [Sam Stenvall] + * [keymap] fix guide button for kernel-based mceusb remotes (closes #15374) + + [Rainer Hochecker] + * ffmpeg: bump to 2.4.4 + + + [txtranslation] + * [lang] rename Tamil to Tamil (India) as this is the actual translated language at Transifex + + [txtranslation] + * [lang] update of skin.confluence language files + + [txtranslation] + * [lang] update of core language files + + [txtranslation] + * [lang] update of internal addon language files + + [popcornmix] + * [omxplayer] Fix precedence in deinterlace resolution check + + [Sam Stenvall] + * [pvr] don't update the item list path before calling Update(), otherwise the history will be incorrectly recorded since the the history expects m_vecItems->GetPath() to be the "old" path, not the new one + + [montellese] + * fix content settings not being properly evaluated/stored + + + [popcornmix] + * FIX: actually disable omxplayer if software is selected + + [xhaggi] + * [pvr] do not restart the PVR manager on wake, only trigger updates + + [xhaggi] + * [gui] temp fix to reset m_guiState with the right file item list + + [xhaggi] + * [pvr] fix: select the first item if we don't have a stored last selected item path + + [Sam Stenvall] + * [pvr] bump addons + + + [Chris "Koying" Browet] + * FIX: actually disable hardware decoders if sotware is selected + + + [montellese] + * platinum: add patch for 2104093 + + [montellese] + * platinum: fix filter mask values of xbmc:votes and xbmc:artwork + + [montellese] + * jsonrpc: fix Files.GetDirectory not returning artistid, albumid and genreid for smartplaylists + + [uNiversaI] + * [keyboardlayout] add Hungarian QWERTZ + + [xhaggi] + * [pvr] removes Timer and Guide item from root directory listing + + [xhaggi] + * [pvr] fix: remove slash at the end of the base path + + [xhaggi] + * [pvr] fix creation of item paths for root (pvr://) directory + + [xhaggi] + * [pvr] fix creation of an illegal group path in GetGroupList() + + [arnova] + * changed: Don't perform wait-on-data if position is in our old cache + + [arnova] + * changed: Modify rate calculation to obtain a proper average with heavy seeking/cache swapping + + [Martijn Kaijser] + * [release] bump to 14.0 rc1 + + + [montellese] + * fix content dialog settings not being properly reset + + [wolfgar] + * [imx6] Fix VP8 timestamping - [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + [montellese] + * [rebrand] android: log to logcat with "Kodi" prefix instead of "XBMC" - [Thomas Amland] - * never cache addons directories + [montellese] + * [rebrand] replace XBMC with Kodi in the UPnP server's HTTP agent string - [Chris "Koying" Browet] - * FIX: [droid] disable libcec + [Rainer Hochecker] + * dvdplayer: fix ff for higher speeds - [Achim Turan] - * [cmake][addons] Use an absolute path for ADDON_SRC_PREFIX + [montellese] + * jsonrpc: fix Player.GetItem for PVR channels not providing extended details like plot, genre etc. - [txtranslation] - * [lang] updated language files from Transifex + [anaconda] + * Fix off-by-1 errors in saving video settings when in a playlists. - [S. Davilla] - * [darwin/WebServer] - fixed crash under json. double thread stack size for libmicrohttpd for osx/ios - [fritsch] - * AndroidStorageProvide: Ignore /mnt/runtime + [Martijn Kaijser] + * [win32] Update installer text to be more clear about taken actions. Also set artwork for un-installer pages - [Thomas Amland] - * AndroidStorageProvider: avoid calling Exists from PumpDriveChangeEvents + [uNiversaI] + * [rebrand] web interface rename XBMC -. Kodi - [Anton Fedchin] - * [WinSystemWin32DX] Avoid unneeded resize buffers when minimized in FSE mode. + [Martijn Kaijser] + * shorten the wiki migration url - [Anton Fedchin] - * [RenderSystemDX] Force 23.976fps mode before switch to stereoscopic 3D mode. + [Chris "Koying" Browet] + * fixup aml no video: video lost after resume - [Anton Fedchin] - * [RenderSystemDX] fixup: re-create swap chain in mono if switching to stereoscopic 3D mode fails. + [Memphiz] + * [depends] - add boblight to depends but don't install it (used for compiling the needed libboblight binary for the boblight addon) - seems this was lost since frodo ... - [Anton Fedchin] - * [RenderSystemDX] Avoid resize buffers twice when transition from windows to FSE mode. + [Martijn Kaijser] + * [win32] Make sure we copy the userdata from the build into the $INSTDIR/userdata". Since we only use the userdata from $APPDATE/${APP_NAME}/userdata/ or portable_data it's safe to wipe $INSTDIR/userdata. - [Anton Fedchin] - * [RenderSystemDX] use two buffers in FSEX. + [Martijn Kaijser] + * [win32] remove modelines_template.xml and kodi.log from installer package - [Anton Fedchin] - * [RenderSystemDX] Added workaround to create device on a default adapter if it wasn't detected previously. + [Rainer Hochecker] + * Revert "gl: multipass renderer would use wrong source pixels sizes" - [Anton Fedchin] - * [WinRenderer] Re-work color shader. try to fix wrong colors on some hardware. + [wsnipex] + * fix: [linux] include ffmpeg tarball in mk-debian-package.sh - [Anton Fedchin] - * [WinRenderer] speed up a bit configuring renderer. + [Matthias Kortstiege] + * [infomanager] container.pluginname returns an empty string (fixes #15566) - [Bernd Kuhls] - * [Jarvis] partly backport of PR 9231 to fix segfault + [ace20022] + * [pvr][cleanup] Return 'bRetrun' instead of 'true'. cppcheck message: Variable 'bReturn' is assigned a value that is never used. - [Kai Sommerfeld] - * [EPG] Guide Window: 20% performance gain on open + [fritsch] + * Revert "linux: Check for Logind first, then *Kit-s with UPower when detecting PM framework" - [txtranslation] - * [lang] updated language files from Transifex + [xhaggi] + * [pvr] always use last played group as current group on startup - [ace20022] - * [android] Add missing libgif.so to the package. + [xhaggi] + * [pvr] re-init pvr manager on wake up - [Alwin Esch] - * [adsp] fix kodi frezze if no add-on present + [fritsch] + * VAAPI: Print driver vendor string (including version) when opening context - [Martijn Kaijser] - * bump to 16.1rc2 + [Karlson2k] + * [win32] [vfs] Win32SMBFile::Stat(): fix wrong error code check - [Kai Sommerfeld] - * [EPG] Fix lockup when entering epg grid (endless loop) + [Rainer Hochecker] + * Revert "smb: eliminate unused while loop in OpenDir" - [Anton Fedchin] - * [dx11] Fixed possible crash when living hardware stereo mode. + [Karlson2k] + * [emufnc] Disable support for READ_TRUNCATED. To be reverted after Helix release. - [Anton Fedchin] - * [dxva] fixed possible issue with dxva rendering (wrong hue/gamma) + [Memphiz] + * [libdvdread] - add patch for fixing partial reads in file_read - also upstreamed for inclusion - patch by karlson2k - [Anton Fedchin] - * [win32] memcpy_sse2: fixed crash in corner case. + [Memphiz] + * [libdvdread] - fix partial reads in file_read - fixes iso playback on ios (which doesn't use libdvdcss and therefore hits this bug) [Chris "Koying" Browet] - * FIX: [longpress] do not eat keypress after a longpress + * FIX: [droid] aarch64 is always neon-enabled - [Tolriq] - * EventServer security fix. + [Chris "Koying" Browet] + * FIX: [sqlite] fix sqlite when built in 32bits and executed on 64bits - [arnova] - * changed: Ignore chapters for large step if there's only one + [Rainer Hochecker] + * dvdplayer: demux ffmpeg - fix seeking behind eof - [arnova] - * fixed: Screensaver would lockup Kodi when stopping on slow systems - [Anton Fedchin] - * [VideoPlayer] WinRenderer: fix render capure when dxva render method is used. - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi dtor avahi thread termination. + [Thomas Amland] + * Revert "jobs: fixed segmentation fault when thumbnail loader abort" [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + * [libdvdread] - fix out of bound access when playing some iso files - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [Martijn Kaijser] + * [release] bump to 14.0 beta5 - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [Chris "Koying" Browet] + * FIX: [aml] no video on newer aml sdk - [h.udo] - * [LoadVideoSettings] Don't leak credentials - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Memphiz] + * [osx/packaging] - premade .DS_Store which works for /Volumes/Kodi - [txtranslation] - * [lang] updated language files from Transifex + [Memphiz] + * [osx/packaging] - ensure that our dmg is always mounted with a static name (/Volumes/Kodi in our case) - else the prepared .DS_Store won't work and we don't get the background image and icon position - [Rainer Hochecker] - * dxva2: fix segfault + [Memphiz] + * [gitignore] - add VolumeIcon.icns to gitignore - [Rainer Hochecker] - * vaapi: fix segfault + [Martijn Kaijser] + * [addons] sync with repo [Martijn Kaijser] - * Bump to 16.1rc1 + * [skin] update re-touched with new Kodi logo + [Kai Sommerfeld] + * [cec] Fixed PeripheralCecAdapter application exit code handling. Introduced new field "exitcode" for "OnQuit" message (@pdf). - [DaveTBlake] - * Fix song reported on playback of songs from cuesheet + [montellese] + * infomanager: fix calls to GetInt() without a valid file item (same as in GetBool()) - [anaconda] - * videoinfotag: fix typo introduced in e6e2d0ace5cfe6191b8f7727ced1747854254ce4 - [Chris "Koying" Browet] - * FIX: [droid] cap refresh rates when probing, too + [da-anda] + * [android][ouya] added launcher icon - [txtranslation] - * [lang] updated language files from Transifex + [da-anda] + * [rebrand][visualization.vortex] remove XBMCrain preset and logo - [Martijn Kaijser] - * bump to 16.1 rc3 + [da-anda] + * [rebrand][addons] new addon icons - [Anton Fedchin] - * [RenderSystemDX] Fix possible segfault after ba2ff03 + [da-anda] + * [rebrand][confluence] new logo + [da-anda] + * [rebrand] new splash - [Rainer Hochecker] - * VDPAU: fix flushing mixer + [Memphiz] + * [osx] - new DSStore template for the dmg folder (uses the new background and has properly aligned icons) - [Martijn Kaijser] - * update re-Touched skin + [Memphiz] + * [osx/packaging] - generate the volumeicon.icns in the packaging script and fixup some pathes - remove some unneeded checks and do a sanity clean of the rw dmg during packaging - [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + [da-anda] + * [rebrand][osx] new DMG volume icon and background artwork - [Martijn Kaijser] - * FIX: typo when calculating forced ratio size. credits to Koying + [da-anda] + * [rebrand][osx] new app icon - [Thomas Amland] - * never cache addons directories + [da-anda] + * [rebrand][atv] new icons - [Chris "Koying" Browet] - * FIX: [droid] disable libcec + [da-anda] + * [rebrand][ios] new icons with iOS8 support - [Achim Turan] - * [cmake][addons] Use an absolute path for ADDON_SRC_PREFIX + [da-anda] + * [android] add Android-TV banner - [txtranslation] - * [lang] updated language files from Transifex + [da-anda] + * [rebrand][android] new icons - [S. Davilla] - * [darwin/WebServer] - fixed crash under json. double thread stack size for libmicrohttpd for osx/ios + [da-anda] + * [rebrand][linux - [fritsch] - * AndroidStorageProvide: Ignore /mnt/runtime + [da-anda] + * [rebrand][win32] new installer artwork - [Thomas Amland] - * AndroidStorageProvider: avoid calling Exists from PumpDriveChangeEvents + [da-anda] + * [rebrand][win] new app icon - [Anton Fedchin] - * [WinSystemWin32DX] Avoid unneeded resize buffers when minimized in FSE mode. + [fritsch] + * IMX6: Add VerifyGLState() to render to help debugging - [Anton Fedchin] - * [RenderSystemDX] Force 23.976fps mode before switch to stereoscopic 3D mode. + [Memphiz] + * [osx] - re-enable yadif deinterlacer on osx - [Anton Fedchin] - * [RenderSystemDX] fixup: re-create swap chain in mono if switching to stereoscopic 3D mode fails. + [fritsch] + * IMX6: Use correct Method for deletion - [Anton Fedchin] - * [RenderSystemDX] Avoid resize buffers twice when transition from windows to FSE mode. + [Chris "Koying" Browet] + * FIX: [droid] adjust splash layout - [Anton Fedchin] - * [RenderSystemDX] use two buffers in FSEX. + [Chris "Koying" Browet] + * CHG: [rebrand;droid] adjust progressbar colors - [Anton Fedchin] - * [RenderSystemDX] Added workaround to create device on a default adapter if it wasn't detected previously. + [montellese] + * infomanager: fix calls to GetInt() without a valid file item (same as in GetBool()) - [Anton Fedchin] - * [WinRenderer] Re-work color shader. try to fix wrong colors on some hardware. + [Voyager1] + * re enable manually add to library (reverted from commit ce447e622ddbc65019797edb533d3c507b945b91) - [Anton Fedchin] - * [WinRenderer] speed up a bit configuring renderer. + [Voyager1] + * [rebrand][win] new app icon (reverted from commit 53bc14946e46b6e97a965dd3da5d6fbcf9cbcdbf) - [Bernd Kuhls] - * [Jarvis] partly backport of PR 9231 to fix segfault + [Voyager1] + * [rebrand][linux - [Kai Sommerfeld] - * [EPG] Guide Window: 20% performance gain on open + [Voyager1] + * [rebrand][android] new icons (reverted from commit 73195e349303cf88ecbd83c0d683d39d6efac52e) - [txtranslation] - * [lang] updated language files from Transifex + [Voyager1] + * [rebrand][ios] new icons with iOS8 support (reverted from commit feedab2c2a3b88b5c9c3b910dd69b8be24d7408d) - [ace20022] - * [android] Add missing libgif.so to the package. + [Voyager1] + * [rebrand][osx] new icons and installer background (reverted from commit 92cbadcd53e13edb8384ab5f474f34f58f0cfebd) - [Alwin Esch] - * [adsp] fix kodi frezze if no add-on present + [Voyager1] + * [rebrand][atv] new icons (reverted from commit 9d00bbd19b99c474fd981305f6b6e123256bbea0) - [Martijn Kaijser] - * bump to 16.1rc2 + [Voyager1] + * [rebrand][win32] new installer artwork (reverted from commit b208d62a6e07d41cdf98a59e838b27e2006d2534) - [Tolriq] - * EventServer security fix. + [Voyager1] + * [rebrand] new splash (reverted from commit 133439d8a6cf38d2de2b28579bb6938995d43cf7) + [Voyager1] + * [WIP][android] add Android TV banners (reverted from commit 18738a4337eebeeeea6ae4ea5a414f1705e6ce6a) - [Martijn Kaijser] - * bump to 16.1rc2 + [Voyager1] + * [rebrand][confluence] new logo (reverted from commit 1f93dbe97a557fad616a311cb4f293b7277c1007) - [Kai Sommerfeld] - * [EPG] Fix lockup when entering epg grid (endless loop) + [Voyager1] + * [rebrand][addons] new addon icons (reverted from commit 16f57541a6ed02a9e387a4df04d00edb023341fb) - [Anton Fedchin] - * [dx11] Fixed possible crash when living hardware stereo mode. + [Voyager1] + * [rebrand][visualization.vortex] remove XBMCrain preset and logo (reverted from commit 4cb1f72481840251441c49f687a7d13189aa8b73) - [Anton Fedchin] - * [dxva] fixed possible issue with dxva rendering (wrong hue/gamma) + [Voyager1] + * [WIP][rebrand][osx] dynamically create VolumeIcon.icns and move packaging related artwork to the central folder for this (reverted from commit 2a9f21e0f24a08b708a54051842f29bba5e3c205) - [Anton Fedchin] - * [win32] memcpy_sse2: fixed crash in corner case. + [da-anda] + * [WIP][rebrand][osx] dynamically create VolumeIcon.icns and move packaging related artwork to the central folder for this - [Chris "Koying" Browet] - * FIX: [longpress] do not eat keypress after a longpress + [da-anda] + * [rebrand][visualization.vortex] remove XBMCrain preset and logo - [arnova] - * changed: Ignore chapters for large step if there's only one + [da-anda] + * [rebrand][addons] new addon icons - [arnova] - * fixed: Screensaver would lockup Kodi when stopping on slow systems + [da-anda] + * [rebrand][confluence] new logo - [Anton Fedchin] - * [VideoPlayer] WinRenderer: fix render capure when dxva render method is used. + [da-anda] + * [WIP][android] add Android TV banners - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi dtor avahi thread termination. + [da-anda] + * [rebrand] new splash - [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes + [da-anda] + * [rebrand][win32] new installer artwork - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [da-anda] + * [rebrand][atv] new icons - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [da-anda] + * [rebrand][osx] new icons and installer background - [h.udo] - * [LoadVideoSettings] Don't leak credentials + [da-anda] + * [rebrand][ios] new icons with iOS8 support - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [da-anda] + * [rebrand][android] new icons - [txtranslation] - * [lang] updated language files from Transifex + [da-anda] + * [rebrand][linux - [Rainer Hochecker] - * dxva2: fix segfault + [da-anda] + * [rebrand][win] new app icon - [Rainer Hochecker] - * vaapi: fix segfault + [Voyager1] + * re enable manually add to library [Martijn Kaijser] - * Bump to 16.1rc1 + * [release] bump to 14.0 beta4 + [Martijn Kaijser] + * [repo] change repo URLs to use mirrors.kodi.tv - [Memphiz] - * [osx] - on 10.7.x runtime never call Cocoa_GetVolumeNameFromMountPoint as it crashes - - [Memphiz] - * [osx/darwinutils] - add method IsLion to check for 10.7.x runtime + [arnova] + * fixed: Typo in variable name - [Kai Sommerfeld] - * [network] Fix CZeroconfBrowserAvahi::doRemoveServiceType map iterator usage + [arnova] + * fixed: Calling WaitForData with a large minimum could cause it to block the max. timeout - [h.udo] - * [LoadVideoSettings] Don't leak credentials + [arnova] + * changed: Use m_StateInput else dvdplayer osd info is 8 seconds delayed - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [arnova] + * fixed: Don't keep reading source when cache is full (fixes #15500) - [txtranslation] - * [lang] updated language files from Transifex + [arnova] + * fixed: FileCache-full logic was wrong + implement GetMaxWriteSize() function - [Rainer Hochecker] - * dxva2: fix segfault + [arnova] + * changed: Rename confusing CSimpleDoubleCache class to CDoubleCache - [Rainer Hochecker] - * vaapi: fix segfault + [montellese] + * musicdb: fix conflicting "singles" filter option introduced by 9fbf13eded5d682d4ae210043e536895c9356c18 (fixes #15539) - [Martijn Kaijser] - * Bump to 16.1rc1 + [popcornmix] + * [omxplayer] Fix for EAC3 passthrough + [popcornmix] + * [omxplayer] Don't sync up to passthrough audio packets - let GPU handle it - [Martijn Kaijser] - * update banner + [popcornmix] + * [omxplayer] Fix for out of sync after trickplay - [Martijn Kaijser] - * fix splashs screen + [anaconda] + * Add mk3d to video extensions and enable double cache + [Rainer Hochecker] + * dvdplayer: call UpdateClockMaster in regular intervals, state of videorefclock may change - [Martijn Kaijser] - * [addons] sync with repo + [Karlson2k] + * SysInfo: show CPU frequency as "XXXX MHz" instead of "XXXX,00MHz" - [ace20022] - * [cximage] Stop reading if an error was reported. + [wsnipex] + * [depends] ffmpeg: define make threads if number of cpu cores detection fails - [ace20022] - * [fix][cximage] Stop reading if an error was reported, since the data was freed already. + [Memphiz] + * [jenkins] - refactor jenkins scripts to centralise the decision for rebuilding depends - add project/cmake dir as criterion - [ace20022] - * [fix][cximage] Set row_pointers to null after deletion. This fixes a crash. + [h.udo] + * [Keyboard Layouts] Add Polish QWERTY - [Alex Ling] - * Fixed less than optimal number of decoding threads on some Android devices + [Rainer Hochecker] + * dvdplayer: update dropping stats after every call to decode - [kekePower] - * Update RssFeeds.xml + [Joakim Plate] + * copy: support chunked reads so that CFile internal buffer is eliminated - [Martijn Kaijser] - * bump to 16.0 Jarvis final + [Arne Morten Kvarving] + * fixed: quell printf format warnings - [Martijn Kaijser] - * bump to 16.0rc4 + [Joakim Plate] + * vda: only allow ffmpeg VDA when advanced setting enable it - [DaveTBlake] - * Fix GetSongsFullByWhere to work around SQLite query optimiser bug that makes left join on views very slow + [Memphiz] + * [AE/CA] - fix regression introduced in the enumeration refactor - handle "hackintosh" audio devices with "digital" in the name as digital devices [Memphiz] - * [VideoRenderer] - fix video rotation due to orientation hint - added scaling for not cutting video content + * [AE/CA] - constify getName of CADevice - [Anton Fedchin] - * [win32] WinRenderer: Fixed rotated videos. + [ace20022] + * [Fix] Manually activated subs, if classified as irrelevant, were not shown on resume. This is fixed by saving the subtitle's index upon manual activation. - [Anton Fedchin] - * [win32] Fixed convolution-6x6_d3d.fx shader. + [wsnipex] + * [linux] systemd-coredumpctl was renamed to coredumpctl, support both in kodi.sh - [Kai Sommerfeld] - * [PVR] PVR Windows: Only the active window must update the shared slected item path. + [Andriy Prystupa] + * fixed compilation error with undefined ARRAY_SIZE - [fritsch] - * FFmpeg: Use 2.8.6-Jarvis-16.0 + [Joakim Plate] + * gl: multipass renderer was broken when RECT textures was used as source - [fritsch] - * Revert "FFmpeg: Bump to 2.8.6-Jarvis-16.1" + [Joakim Plate] + * gl: multipass renderer would use wrong source pixels sizes - [Martijn Kaijser] - * [addons] sync with repo + [Joakim Plate] + * ffmpeg: if a second GetFormat dis-allow hwaccel, we must restore ffmpeg - [fritsch] - * FFmpeg: Bump to 2.8.6-Jarvis-16.1 + [Joakim Plate] + * vda: upgrade to hwaccel2 interface - [Erik Kessler] - * Fix Xbox controller crash on Windows. #16279 + [Joakim Plate] + * vda: if no image is returned, we must still reset cv_buffer - [anaconda] - * [lang/settings] Fix ADSP labels. + [Joakim Plate] + * vda: allow 3 render buffers - [Adrian Moennich] - * Check for .nomedia file inside tv show folders + [Memphiz] + * [ffmpeg/vda] - update for current used ffmpeg (2.2) + [Joakim Plate] + * vda: switch cvref rendering over to standard UYVY422 renderer - [Chris "koying" Browet] - * FIX: [longpress] do not repeat long presses + [Joakim Plate] + * vda: allocate pot texture if requested - [h.udo] - * [Jarvis] Add travic-ci badge to README.md + [Joakim Plate] + * vda: use IOSurfaceGetPixelformat instead of CVPixelBufferGetPixelFormatType - [h.udo] - * [Jarvis] Add travis linux support + [Joakim Plate] + * vda: cvref textures are non power of two so don't allocate extra space - [Martijn Kaijser] - * fix French AZERTY keyboard layout + [Joakim Plate] + * vda: fix chroma issue with vda upload [anaconda] - * CGUIListContainer: reset scroller position too on GUI_MSG_LABEL_RESET. + * Fix "Current fanart" not being shown in DialogVideoInfo. - [MilhouseVH] - * [mysql]: Fix limited songs query after #9005 - [Martijn Kaijser] - * [TexturePacker][gif] The Graphic Control Extension is optional. + [Karlson2k] + * [win32] CPUInfo: fix CPU frequency wrongly count in GHz instead of MHz, fixes #15555 - [1977David] - * Create french keyboardlayout + [Sam Stenvall] + * fix namespace typo - [popcornmix] - * mmalrender: Reject unsupported render formats + [Karlson2k] + * [win32] Update python package to 2.7.8 - [Arnold Neugebauer Zweikeks] - * [aml] fix trac 16515 + [Matthias Kortstiege] + * [videoinfoscanner] do not consider optical file paths as valid subpaths [Thomas Amland] - * [addons] show install notification for local version + * [videoinfoscanner] fix infinite loop - [Stanislav Vlasic] - * FIX Android: On newer kernels neon cpu feature is represented as asimd - [DaveTBlake] - * Fix GetSongsFullByWhere to use left join (some songs do not have artists) and apply count limit to just songs + [Joakim Plate] + * jobs: fixed segmentation fault when thumbnail loader abort - [ronie] - * fix radio channels background + [Martijn Kaijser] + * [skin] update re-touched - [Anton Fedchin] - * [dx11] Fix: Properly handle DXGI_STATUS_OCCLUDED status, previous method may cause overflow in dirty regions stack when desktop was locked for long time. + [ronie] + * [confluence] add 'hide broken' button - [DaveTBlake] - * Add missing MOOD tag scanning for FLAC/Ogg/Xiph/Vorbis, ASF and MP4/iTunes like other file formats + [ronie] + * [lang] add 'hide broken' string [Martijn Kaijser] - * bump to 16.0rc3 - - [Voyager1] - * [DVD] fix invisible menu overlays when corrected pts becomes negative after discontinuities - - [Voyager1] - * [DVD] fix invisible buttons by delay checking for invalid menu buttons until after the player received them from the demuxer + * [addons] do show broken/incompatible add-ons that are still installed at this moment so users can un-install them without using the toggle. This makes the hide broken option only toggle non-installed broken/compatible add-ons. - [Voyager1] - * fix multi-part stack selection of correct part + [Sam Stenvall] + * Revert "[pvr] Fix recording history (last directory not selected)" - [Kai Sommerfeld] - * [PVR] Guide window: EPG grid: now even works if none of the available channels has EPG data (fixes trac#16548). + [montellese] + * library: don't remove the source if the user has changed his mind + [Thomas Amland] + * [python] add all installed modules to path when addon info is unavailable - [Kai Sommerfeld] - * [PVR] Guide/Search/channel window: Do not add 'Record' if backend does not support timers. + [Martijn Kaijser] + * [pydocs] cosmetic fix on line ending - [Kai Sommerfeld] - * [PVR] Timer window: Show error box if 'Add timer' is selected and PVR backend does not support timers (fixes trac#16539) + [Thomas Amland] + * [addons] add toggle for hiding broken addons. hide by default - [Memphiz] - * Revert "fixed, memory leak. Note to self, these routines attach but do not detach under 10.9.5" + [ace20022] + * [Fix][win32] Discs that were present at start are not removed from views when ejecting them. - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Sam Stenvall] + * [gui] update the view state's list reference before the view state is consulted about whether the "go to parent" item should be added to the list - [txtranslation] - * [lang] updated language files from Transifex + [Sam Stenvall] + * [pvr] don't update the item list path before calling Update(), otherwise the history will be incorrectly recorded since the the history expects m_vecItems->GetPath() to be the "old" path, not the new one - [fritsch] - * ActiveAE: Increase timeout for sink init to 60 seconds + [Memphiz] + * [vfs/Pipe] - fix premature close of pipe. It should only be closed if refcount is zero [montellese] - * [profiles] don't save skin settings on master profile when it was only loaded to switch between two other profiles - - [Martijn Kaijser] - * bump to 16.0rc2 - + * music library: add the possibility to clean the database in the background - [Chris "Koying" Browet] - * FIX: [longpress] fixes ghost repeat + [montellese] + * video library: add the possibility to clean the database in the background - [Rechi] - * fix crashing if music is scanning and application gets stopped + [t4-ravenbird] + * dont abort if wait for net fails - [ronie] - * [re-touched] final update for jarvis - [Thomas Amland] - * [filesystem] handle resource paths as file paths + [Memphiz] + * [jenkins/darwin] - ensure that audioencoder addons are not removed from tree during cleanup (same like with pvr addons before) - fixed missing audioencoder addons in nightlies. - [Martijn Kaijser] - * ignore default select action on scripts - fixes #16516 + [Karlson2k] + * [emufnc] return exact '-1' instead of other negative values in dll_read() and dll_write() - [Kai Sommerfeld] - * Jarvis binary addons now taken from repo-binary-addons Jarvis branch + [Karlson2k] + * [emufnc] fix possible compiler warning - [Rainer Hochecker] - * VideoPlayer: allow dts of video streams to jump bach more up to 500ms - if those streams have no dts, dts equals pts + [Karlson2k] + * libdvdcss: add custom patches as files to lib/libdvd/patches/ - [fritsch] - * FFmpeg: Bump to 2.8.5-Jarvis-rc1 + [ace20022] + * [Fix] Reading zero bytes from a file should yield zero read bytes. Fix for 52800a1fa28cd6f9b843b55cfb40820fae2bc9d3. - [Kai Sommerfeld] - * [EPG] CGUIEPGGridContainer::UpdateItem: Fix m_item 'use after free' and invalid cursors, offsets. + [Karlson2k] + * libdvdcss: better handle partial read in libc_read - [phil65] - * [guiinfo] content type fix for addon browser + [Sam Stenvall] + * [pvr] move ActionDeleteRecording to GUIWindowPVRRecordings - [Martijn Kaijser] - * sync scrapers with repo + [Sam Stenvall] + * [pvr] go back to the parent folder when the last recording inside a subdirectory is deleted - [Martijn Kaijser] - * bump to 16.0rc1 + [Sam Stenvall] + * [pvr] hopefully fix the folder watched overlay once and for all. We now start out by assuming all folders are watched, then as we encounter unwatched recordings we remember those folders and unmark them at the end of the method - [Tolriq] - * Fix Http server default port on all platforms Use 8080 from default settings.xml Keep previous default value if webserver is activated + [Sam Stenvall] + * [pvr] always update metadata (i.e. play count) for items, not just the first time an item from that particular folder is encountered - [Kai Sommerfeld] - * [PVR] Fix 'dancing' OSD progress bar while switching channels. + [Sam Stenvall] + * [pvr] fixed folder watched icon appearing only after the folder had been entered once - [ronie] - * fix Container.SortOrder infolabel + [Sam Stenvall] + * [pvr] fix bug where the selected item didn't change to the next one after an item has been marked as watched/unwatched + [Sam Stenvall] + * [pvr] fix marking recordings as watched or unwatched (fixes #15118) - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [popcornmix] + * MMAL: Use Component Logging v2 - [txtranslation] - * [lang] updated language files from Transifex + [Joakim Plate] + * smb: eliminate unused while loop in OpenDir - [ronie] - * fix Container.SortOrder infolabel + [Joakim Plate] + * url: share name should always be updated - [DaveTBlake] - * Prevent "Scan to library" appearing on context menu for "Add music" item of music file view + [Joakim Plate] + * smb: make sure we deinit samba before global destructor - [ace20022] - * [tools][win32] Bump texturepacker to version 1.0.5. + [Joakim Plate] + * smb: use utility function to convert time_t to local file time - [ace20022] - * [gif][depends] Bump static and dynamic gif lib to 5.1.1. + [Joakim Plate] + * smb: drop old (unused) purge code - [ace20022] - * [tools][texturepacker] Fix gif decoding and packaging . + [Joakim Plate] + * smb: factor out stat to __stat64 conversion - [arnova] - * fixed: Our dir cache should always ignore url (protocol) options (fixes #16469) + [Joakim Plate] + * smb: eliminate smb.Init() calls in non static functions - [Kai Sommerfeld] - * [PVR] Fix ACTION_CHANNEL_[UP + [Joakim Plate] + * smb: drop try/catch of exceptions from C api - [ace20022] - * [gif] Fall back to DISPOSAL_UNSPECIFIED if no valid disposal method is specified. + [Joakim Plate] + * smb: don't add : for empty password - [ace20022] - * [TextureManager] Fix possible invalid pointer deletion. + [Joakim Plate] + * smb: set workgroup using standard api - [Voyager1] - * [dxva] since deinterlace options are disabled, don't use them + [Joakim Plate] + * Revert "[vfs] [posix] SMBFile: fix reading files opened with READ_TRUNCATED flag" - [ace20022] - * [gif] Add more version #ifdefs. + [Memphiz] + * [osx] - mark removable shares which are either have DVD or CD media in it as SOURCE_TYPE_DVD so the audio cd rip context menu is visible for it - [ace20022] - * [gif] The number of loops is stored as 2x uint8_t. + [Memphiz] + * [vtb/vda] - use component debug logging [ace20022] - * [gif] Fix for version < 5: delay and transparent are stored as uint8_t. + * [dvdplayer] Remove superfluous cast. Since 923baa83e091bbf80159b8aff523915ec0af824a m_SpeedState.lasttime is a int64_t. - [ace20022] - * [gif] Redact filenames in gif log output. + [fritsch] + * IMX: Use Component Logging - [ace20022] - * [gif] Try to skip erroneous frames instead of giving up immediately. + [fritsch] + * VDPAU: Component Logging - [ace20022] - * [gif] Be more tolerant if the first frame has the disposal method DISPOSE_PREVIOUS. + [fritsch] + * VAAPI: Use Component Logging - [ronie] - * [Confluence] fix size & position of mirrored image + [xhaggi] + * [pvr] fix update of groups and overriding group properties we only store locally - [Memphiz] - * [FileBrowser] - fixed credential disclosure when adding network locations + [xhaggi] + * [pvr] persist channel group after updated from client - [Anton Fedchin] - * [win32] memcpy_sse2: Fixed possible heap corruption if chroma width is not 16 aligned. + [Karlson2k] + * [emufnc] Fix: use correct return value on error in dll_flsbuf, flush file buffers, properly write data - [Dave Blake] - * Revert "Fix cached folders JSON playlist play item failure" + [Karlson2k] + * [emufnc] Fix: use correct return value on error in dll_filbuf, try to restore proper file pointer - [phil65] - * [guilib] properly set content types in music section + [Karlson2k] + * [emufnc] Use proper macro instead of hardcoded value in dll_ungetc() - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Karlson2k] + * [emufnc] Fixes: correctly emulate on bigendian platforms, use cast to _unsigned_ char in dll_fputc() - [txtranslation] - * [lang] updated language files from Transifex + [Karlson2k] + * [emufnc] Fix: return correct value in dll_fclose() - [xhaggi] - * [confluence][fix] get rid of view (ID: 51) in pvr channel window which cause issues with viewtypes + [Karlson2k] + * [emufnc] Fix: always read all data in dll_fwrite() - [t4-ravenbird] - * [bugfix] fast startup fail to execute wakeup + [Karlson2k] + * [emufnc] Fix: always read all data in dll_fread() - [DaveTBlake] - * Ensure FileExists is called with a file name, rather than a URL. Options on the end of the string causes file not to be found in cache when present. + [Karlson2k] + * [emufnc] Fix: return zero for dll_fread()/dll_fwrite() if size or count is zero - [xhaggi] - * [fix][pvr] prevent numeric dialog from being opened if python modal is present + [Karlson2k] + * [emufnc] Fix: "-1" is incorrect return value for dll_fwrite() and dll_fread() (return type is size_t) - [Anton Fedchin] - * [WinRenderer] Added support of rotated videos. + [Karlson2k] + * [emufnc] dll_write(): set errno if write() failed - [Anton Fedchin] - * [WinRenderer] Added workaround to fix an issue with color range on some hardware which doesn't support color range conversion or whose drivers are crappy. Now we're using same technique for color range conversion which is used in UI instead of using video processor. + [Karlson2k] + * [emufnc] dll_read(): set errno if read() failed - [xhaggi] - * [fix][pvr] don't populate hidden groups over json-rpc + [Karlson2k] + * [vfs] CFile: workaround in Read() and Write() for VFSes that do not support null buffer pointer - [xhaggi] - * [fix][pvr] m_gridIndex array index out of bound + [Karlson2k] + * [vfs] [win32] Win32File: better handle partially read/written buffer in Read()/Write() - [Kai Sommerfeld] - * [EPG] Fix 'GoToNow' to select the currently active epg event of selected channel. + [Karlson2k] + * [vfs] [win32] Win32File: really support "test" Read() and Write() with zero buffer size - [Kolja Lampe] - * Disable ratings button for plugins + [Karlson2k] + * libdvdcss: fix position after partial read in libc_read - [xhaggi] - * [fix][pvr] wrong group if channel switched by its internal id - [ronie] - * fix duplicate key mapping [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + * [lang] update of skin.confluence language files [txtranslation] - * [lang] updated language files from Transifex - - [fritsch] - * FFmpeg: Bump to 2.8.4-Jarvis-rc1-mp3 + * [lang] update of core language files - [Stefan Saraev] - * [udevprovider] browse disk dialog is not wanted for blu-rays + [txtranslation] + * [lang] update of internal addon language files - [Rainer Hochecker] - * [pvr] - fix selecting a channel by id via json-rpc + [Martijn Kaijser] + * show correct dialog header text for master lock code. fixes #15543 [montellese] - * [jsonrpc] CEpgInfoTag: fix serialization of "runtime" as an integer (in minutes) instead of as a string + * fix queuing of songs starting playback if something is already playing (fixes #15545) - [Chris "Koying" Browet] - * FIX: [droid] handle video rotation + [Martijn Kaijser] + * [release] bump to 14.0 beta3 - [jun.jiang] - * Fix compile error on msvs2013 - [jun.jiang] - * Fix assertion fail in Cutil::GetExternalStreamDetailsFromFilename + [xbmc] + * fix incorrect display of fps when dr kicks in - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [popcornmix] + * [ResamplePi] Add support for formats that need shifting [txtranslation] - * [lang] updated language files from Transifex + * [lang] fix invalid or wrong language names to be in sync with Transifex - [DaveTBlake] - * Allow for item separator in ARTISTS and ALBUMARTISTS tags. + [Sam Stenvall] + * [pvr] add missing call to parent's OnPrepareFileItems() - [Kai Sommerfeld] - * [PVR] Fix: Abort of active recordings must be possible even if associated timer is read-only + [popcornmix] + * [mmalrenderer] Add choice of 4 deinterlace schemes - [Ned Scott] - * Correct numeric input for newer PVR windows + [Memphiz] + * [darwin] - fix flicker in sysinfo - querying gateway via pipe needs a sleep - [Kai Sommerfeld] - * [keymaps] remote.xml: virtualkeyboard,numericinput: back now maps to 'back', not 'backspace' anymore + [Sam Stenvall] + * [epg] rename GetCurrentTime() to avoid naming collision with Windows-specific macro - [fritsch] - * FFmpeg: Bump to 2.8.4-Jarvis-rc1 + [uNiversaI] + * [cosmetics] minor spacing in readme - [Kolja Lampe] - * Prevent taglib from crashing kodi + [Frank Razenberg] + * [buttontranslator] don't copy windowmap for lookups - [Kolja Lampe] - * Select previously selected values in userratings selectdialogs + [Frank Razenberg] + * [buttontranslator] fix keymap overrides not working - [DaveTBlake] - * Fix Playlist.Getitems returning empty artist array by spltting artist desc string at separator. + [Martijn Kaijser] + * [skin] update reTouched git sha - [Max Kellermann] - * epg/EpgContainer: fix deadlock bug in LoadFromDB() + [Rainer Hochecker] + * fix string for component logging video - [Max Kellermann] - * pvr: fix a bunch of deadlock bugs + [Arne Morten Kvarving] + * AESinkPULSE: Rebrand pulseaudio sink name to reflect kodi - [Max Kellermann] - * pvr/PVRManager: make m_pvrWindowIds "const" + [Karlson2k] + * DVDVideoCodecLibMpeg2: fix broken check for memory allocation Thanks @fritsch and @Uukrull - [Max Kellermann] - * GUIWindowManager: protect m_idCache with g_graphicsContext + [Rainer Hochecker] + * AE: always request float from sink when in fixed mode, fixes unwanted re-init of sink - [Ned Scott] - * Remove some long-presses and some notes cleanup + [Roman Miroshnychenko] + * Ukr and Rus language fixes - [Joel Teichroeb] - * Use two full size members instead of using a static array as a union + [Rainer Hochecker] + * videorefclock: use videosync DRM on AMD systems - [Martijn Kaijser] - * fix forced subtitle selection after abc184c + [Sam Stenvall] + * [pvr] bump addons - [Max Kellermann] - * GUIWindowPVRBase: protect m_selectedItemPaths + [xbmc] + * player: fix rewind - [Max Kellermann] - * GUIWindowPVRBase: use array instead of std::map + [fritsch] + * (Coverity) AudioEngine: Cosmetics and member initialization ActiveAEBuffer - [Arne Morten Kvarving] - * fix ffmpeg logging credentials + [fritsch] + * (Coverity) VideoCodecs: Remove unused method pts_itod() - [Stefan Saraev] - * [udevprovider] handle 'change' events only for optical drives + [fritsch] + * (Coverity) iso9660: make sure to initialize m_paths to 0 as it's used by Reset() - [xhaggi] - * [pvr][fix] fix initial selection of channel item in guide window + [fritsch] + * (Coverity) Skin: properly initialize m_effectsSlowDown - [xhaggi] - * [pvr][fix] empty-check to prevent empty pathes in m_selectedItemPaths + [fritsch] + * (Coverity) DVDPlayerVideo: Remove assignment of bRequestDrop which is never read - [montellese] - * fix saving of skin settings when switching profiles (fixes #16203) + [anaconda] + * [builtins/jsonrpc] Invert default for showing dialogs after 5324. - [montellese] - * cosmetics: fix log messages about tag in skin settings + [Rainer Hochecker] + * dvdplayer: vaapi, vdpau - implement codec control flags - [ronie] - * [Confluence] reduce padding on dialog buttons + [Rainer Hochecker] + * dvdplayer: fix dts correction, again - [fritsch] - * FFMpeg: Bump to 2.8.4-Jarvis-beta4 + [Memphiz] + * [osx] - add callback when the input.appleremotealwayson setting is changed ("allow startup of kodi via remote") - to instantly install/deinstall the launchagent -> needed for manual migration path from xbmc to kodi - [h.udo] - * [PVR] CDVDInputStreamPVRManager: Don't leak credentials + [Memphiz] + * [XBMCHelper] - small refactor - move the launchagent installation/deinstallation out into its own method - [Martijn Kaijser] - * bump to 16.0 beta 5 + [Memphiz] + * [XBMCHelper] - change to only build i386 and adapt output dir to match the one where the binary was in our tree before... - [Martijn Kaijser] - * [strings] fix typos + [Memphiz] + * [osx] - remove XBMCHelper binary from tree - [Achim Turan] - * [Win32File] Fix invalid assert expression + [popcornmix] + * [omxplayer] Add option to choose omxplayer/dvdplayer automatically - [MilhouseVH] - * [mysql] Querying optimizer_switch needs to be non-fatal [backport] + [wsnipex] + * [rtmp] add canseek and drop unused rtmp options + [Joakim Plate] + * osx: fixed detect of latest sdk after yosemite - [Martijn Kaijser] - * bump to 16.0 beta 5 + [Rainer Hochecker] + * dvdplayer: fix app exit caused by creating teletext while thread is running already - [Thomas Amland] - * [addons] fix download location for multi directory repositories + [Michał Kępień] + * Handle BlueZ 5.x play/pause evdev scancodes - [wsnipex] - * [configure] make sure the top kodi src dir is always in INCLUDES + [Rainer Hochecker] + * dvdplayer: videocodec ffmpeg - fix timestamps and colorspace - [Martijn Kaijser] - * [pvr] fix missing header label on clean EPG + [xbmc] + * dvdplayer: allow rewinding at end of stream, do a seek after rewind - [ronie] - * don't use cached results for dir checks + [xbmc] + * dvdplayer: avoid short screen flicker caused by unnecessary reconfigure of renderer - [Chris "koying" Browet] - * FIX: [droid;input] regression after stylus fix + [Karlson2k] + * cc_decoder: suppress printing to stderr and stdout - [Chris "koying" Browet] - * CHG: [droid] remove unecessary dyloads + [Karlson2k] + * CueDocument: replace call of isdigit() with StringUtils::isasciidigit() - [Kai Sommerfeld] - * [confluence] String fix 'Timer' => 'Timers' + [Karlson2k] + * ActiveAEResample::Init: transform to 64bit before shift - [ronie] - * [Confluence] fix sidemenu nowplaying buttons + [Karlson2k] + * XMLUtils::GetHex: check result of sscanf() - [Kai Sommerfeld] - * [PVR, json-rpc] Fix Input.Select for PVR fullscreen windows + [Karlson2k] + * AEChannelInfo::BestMatch: fix use boolean in arithmetics - [Kai Sommerfeld] - * [PVR] Fix ghost timers in epg window. + [Karlson2k] + * GUIWindowTestPatternDX::DrawCheckers: check input parameters - [DaveTBlake] - * Override default setting for albumartistonly flag when already set in musicURL, so can be used by custom nodes. + [Karlson2k] + * [win32] AESinkDirectSound: check result of GetStatus() - [DaveTBlake] - * Stop scraping album data from overriding tag artist data even when override tag setting is disabled. + [Karlson2k] + * ElementText: replace 'char *' with 'std::string' - [ronie] - * fix logging of failed dependency + [Karlson2k] + * Fixes: remove large buffers from stack - [Max Kellermann] - * VideoPlayer/VAAPI: fix use-after-free bug in Release() + [Karlson2k] + * Fixes: wrong log strings - [Max Kellermann] - * Epg: fix buffer overflow in GetLastScanTime() + [Karlson2k] + * Fixes: checks for buffer overrun - [Chris "Koying" Browet] - * REVERT: [droid] leave MPEG2 h/w decoded; VOB playback is niche + [Karlson2k] + * Fixes: don't use uninitialized vars - [Achim Turan] - * [adsp] ADSP addon get enabled status fix + [Karlson2k] + * Fixes: check for NULL pointers before dereference - [Stefan Saraev] - * [music] fix leaking credentials in logs + [Karlson2k] + * Fixes: check results of memory allocation functions - [Stefan Saraev] - * [texturecache] fix leaking credentials in logs + [Rainer Hochecker] + * add component logging for video - [ronie] - * fix python version + [Chris "Koying" Browet] + * FIX: must return true after setting update - [ronie] - * update guilib api to 5.10.0 + [Memphiz] + * [vtb] - fix - use the correct bit for signaling the hw decoder to drop a frame. This is the bit which is visible in the now public ios 8 headers of vtb. I doubt that apple ever change this till ios4. If they did - we are screwed on older runtimes. At least on ios6 this bit is valid for sure. - [Martijn Kaijser] - * [pvr] fix incorrect string usage after combining multiple strings + [hudokkow] + * [Keyboard layouts] Add Portuguese QWERTY - [Martijn Kaijser] - * bump to 16.0 beta 4 + [Thomas Amland] + * fix uninitialized variable + [Thomas Amland] + * remove unused variable - [Chris "Koying" Browet] - * FIX: [amcs] no brightness/contrast for mediacodec(S) + [Thomas Amland] + * [xml] 'action' type setting should not require 'id' attribute - [Matus Kral] - * [TextureCache] fix log leaking username/pass + [popcornmix] + * [curl] Avoid busy spinning when socket timeout is too low - [Martijn Kaijser] - * [repo] bump repo version + [foo86] + * [rbp] Enable optimization on Raspberry Pi - [Martijn Kaijser] - * [addons] sync with repo + [Frank Razenberg] + * [keymap] Recreate SDL2 compatible PS3 dualshock keymap, converted from the 360 one - [Thomas Amland] - * [addons] dont invalidate art for addons that are new or not updated since last fetch + [Matthias Kortstiege] + * [vaapi] fix missing break in switch - [Rainer Hochecker] - * VideoPlayer: fix false positive vfr detection + [Matthias Kortstiege] + * [rendermanager] fix possible null ptr dereference in CXBMCRenderManager::GetOptimalBufferSize() - [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + [Matthias Kortstiege] + * [nfsfile] fix arg type mismatch - [Danilo Krummrich] - * android: fix event source evaluation + [Matthias Kortstiege] + * [cpuinfo] fix possible divide-by-zero - [phil65] - * [Confluence] - fix navigation for SideBar NowPlaying controls + [Matthias Kortstiege] + * [paplayer] fix possible resource leak in QueueNextFileEx - [wsnipex] - * [cmake] fix package-addon (zip) target on linux + [Matthias Kortstiege] + * [settings] fix possible null ptr dereference in CGUIDialogSettingsBase::SetupControls + + [Matthias Kortstiege] + * [pvr] fix uninitialized members in CPVRGUIInfo constructor - [un1versal] - * fix strings after #8180 + [Matthias Kortstiege] + * [pvr] fix possible resource leak in channels osd dialog - [DaveTBlake] - * Fix missing disc number when in file view. As song.iTrack holds both disc and track numbers, SetSong needs to set both. + [Matthias Kortstiege] + * [skininfo] fix uninitialized members in CSkinsInfo constructor - [phil65] - * [GUI] remove "Add source" from MyPrograms section + [Balint Reczey] + * linux: Check for Logind first, then *Kit-s with UPower when detecting PM framework - [Martijn Kaijser] - * [strings] fix typo + [Thomas Amland] + * log when RunAddon is called with invalid addon id/type and no addon will be started - [Avdienko Mikhail] - * Fix DPMS detection for X11 without GLX + [Thomas Amland] + * RunScript: execute even if addon isn't a script type addon - [ace20022] - * [osx][XBMCHelper] Comparison of a boolean with an integer. + [phate89] + * Use "system.playlistspath" setting instead of default library one in CFileUtils - [ace20022] - * [PowerManager] Possible leak in public function. The pointer 'm_instance' is not deallocated before it is allocated. + [Kai Sommerfeld] + * [PVR] Changed EpgInfoTag::[IsActive - [ace20022] - * [AMLUtils] Suspicious use of ; at the end of 'if' statement. + [Stanislav Vlasic] + * [AMLCodec] Add support for panel display output - [ace20022] - * [SMBFile] Invalid number of character '(' when these macros are defined: 'TARGET_POSIX'. + [Brandon McAnsh] + * DVDVideoCodecAmlogic: Remove throttling of MPEG2 playback - [txtranslation] - * [lang] bump major version of the en_GB language-addon [txtranslation] - * [lang] updated language files from Transifex for Skin Confluence + * [lang] update of skin.confluence language files [txtranslation] - * [lang] updated language files from Transifex + * [lang] update of core language files [txtranslation] - * [lang] automatic syntax corrections for the en_GB language file + * [lang] update of internal addon language files - [DaveTBlake] - * Set FileItem from MusicInfoTag rather than create new and lose artwork in CPlayerOperations::GetItem. This now similar to how video handled. + [Rainer Hochecker] + * renderer: use 3 render buffers for sw decoding, restores bahavior after 71f50d3677409a3ba3f8533daae105e6e0366a1 - [ace20022] - * [GUIWindowManager] Clarify calculation precedence for '&' and '?'. + [Rainer Hochecker] + * [infomanager] only update a/v info if something has changed and only by main thread - [ace20022] - * [GUIFontTTF] Clarify calculation precedence for '&' and '?'. + [txtranslation] + * [lang] update of skin.confluence language files - [ace20022] - * [guiaction] Set retval to true instead of + [txtranslation] + * [lang] update of core language files - [Thomas Amland] - * adjust repository addon to use gzipped addons.xml + [txtranslation] + * [lang] update of internal addon language files - [Thomas Amland] - * [addons] add support for pre-gzipped addons.xml in repositories + [Tobias Arrskog] + * Disable extra logging by default - [montellese] - * [events] fix removal of events (fixes #16403) + [Mettbrot] + * Add German QWERTZ to keyboard layouts - [Matthias Kortstiege] - * [touch/filemanager] - workaround for the non-working touch input in the filemanager window + [fritsch] + * AESinkALSA: Allow fragmentation, e.g. even multiply of PeriodSize - [Thomas Amland] - * add utility for decompressing gzip + [Rudi] + * AESinkALSA: Set correct value for AES3 when using HBR mode - [HitcherUK] - * [skin.confluence] Fix main menu player controls + [montellese] + * binary addons: fix dependency handling for dependencies - [Martijn Kaijser] - * [string] fix c/p mistake + [Rainer Hochecker] + * videorefclock: fix clock speed for D3D after refactoring - [Martijn Kaijser] - * [strings] fix incorrect setting description + [fritsch] + * AESinkProfiler: Goodbye my love goodbye - [Kolja Lampe] - * Fix content types for video. Library paths should not get "files" content type. + [fritsch] + * AE: Fix some coverity warnings - [Kolja Lampe] - * Fix content types for music. Root and source pathes should not get "files" content type. Also improved playlists handling and added addon handling. + [fritsch] + * AESinkPULSE: Fix Coverity suggestions - [Achim Turan] - * [adsp] Remove unused newRegistration variable during addon registration method + [xbmc] + * videoplayer: update frametime, it might change due to fps detection - [Alwin Esch] - * [adsp] fix wrong function error check on database + [xbmc] + * video player: present correct pts to user for a/v sync (after buffering in renderer) - [fritsch] - * ffmpeg: Bump to 2.8.3-Jarvis-beta3 + [xbmc] + * videoplayer: adapt lateness detection and dropping to buffering - [Alwin Esch] - * [adsp] fix crash and frezzes during add-on load - [Alwin Esch] - * [adsp] cleanup system start way + [ronie] + * [Confluence] add new default icons [ronie] - * [gui] drop video/music overlay dialogs leftover part III + * add missing default icons - [Kai Sommerfeld] - * [PVR] Timer update: Fix handling of timers with 'start at any time' - [Chris Browet] - * FIX: [aml] avoid decoder being deadlocked + [Memphiz] + * [ios] - get the resolution clamp for > 720p material back in place - the assumption that retina devices have enough power was wrong - [h.udo] - * [addons] Fix wrong text on failed add-on install - [Jan Holthuis] - * [AMLCodec] Use libamcodec.so if libamplayer.so is missing + [Rainer Hochecker] + * Revert "[infomanager] only call UpdateAVInfo when really needed" - [Jan Holthuis] - * [AMLCodec] Remove dependency on amffmpeg and use libavutil instead + [Matthias Kortstiege] + * [logging] stop log spam introduced with ba34a62 - [Jan Holthuis] - * [AMLCodec] Remove unused methods/members from DllLibAmCodec/am_private_t + [fritsch] + * GUIInfoManager: Proper minimalstest locking for UpdateAVInfo - [Jan Holthuis] - * [AMLCodec] Remove unreachable code in set_header_info() + [Matthias Kortstiege] + * [infomanager] only call UpdateAVInfo when really needed - [Chris "koying" Browet] - * FIX: [aml] smarter capabilities detection + [Martijn Kaijser] + * [release] bump to 14.0 beta2 - [Chris "koying" Browet] - * CHG: [aml] drop device-specific hacks - [Chris "koying" Browet] - * CHG: [aml] remove cpufreq hacks + [Martijn Kaijser] + * [win32] fix typo in NSIS installer creation - [Jian Wang] - * PD#113872:First kodi 15.2 version for amlogic + [Karlson2k] + * [vfs] [posix] SMBFile::Write() remove unneeded cast - [John Rennie] - * The Info action is not useful in an addon + [Karlson2k] + * [vfs] [posix] SMBFile::GetLength() return correct values on errors - [Leonard Harms] - * time sometimes moves backwards coming up from base libraries + [Karlson2k] + * [vfs] [posix] SMBFile::GetPosition() return correct values on errors - [Memphiz] - * [webserver] - fixed possible directory traversal bug due to insufficient url checking + [Karlson2k] + * [vfs] [posix] SMBFile: fix reading files opened with READ_TRUNCATED flag - [MilhouseVH] - * [MySQL] Restore pre-5.7.6 query optimizer behaviour when required + [arnova] + * changed: m_iCurrentPts is NOT an int but a double - [Chris "koying" Browet] - * FIX: allow to delete a default key binding + [arnova] + * fixed: Chapter skipping was broken due to improper current pts updating (thanks FernetMenta for the pointer). Fixes ticket #14535 - [MilhouseVH] - * [MySQL] Disable ONLY_FULL_GROUP_BY per session + [Rainer Hochecker] + * ffmpeg: bump to version 2.4.3 - [metaron] - * [PVR] Mark Created groups as Loaded on Persist + [montellese] + * fix CApplicationMessenger::SendText() not sending the text to the proper edit control - [Kolja Lampe] - * Coverity fix check return value (CID 1224459) + [Thomas Amland] + * fix segfault when calling StopScript builtin with no parameters - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719190) + [Matthias Kortstiege] + * [NfoFile] fix empty video details for multipart episodes - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719189) + [Karlson2k] + * [vfs] [posix] SMBFile: fix Read() with zero size and null buffer - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719187) + [anaconda] + * [videodb] Keep empty series if hideemptyseries=true - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719219 & CID 719220) + [phate89] + * Honor "ignorethewhensorting" when jumping to letter - [Kolja Lampe] - * Coverity fix uninitialized scalar field (CID 719221) + [anaconda] + * [videodb] Fix deleting bookmarks from dialog for add-ons. - [Kolja Lampe] - * [music] Listeners should not be able to hold a negative value + [Chris "Koying" Browet] + * FIX: [droid] allow to build without debugging and pickup jenkins configuration - [metaron] - * [PVR] Context Menu Crash Fix - [Kai Sommerfeld] - * [PVR] Ensure that newly added channel groups are persisted, fixes trac 16365 + [ronie] + * [Cosmetics] reserve window id's for skins - [Chris "koying" Browet] - * FIX: [droid] always handle media keys... + [Memphiz] + * [jenkins] - when trying to determine the branchname of a detached head revision - filter it so only branches from the currently built GITHUB_REPO are used (else we might pick the wrong branchname from another repo which was checked out before and contains the same revision) - [DaveTBlake] - * Archive artistDesc and albumArtistDesc otherwise artist names not shown when album list loaded from cache. + [Fice] + * [UPnP] rebrand our Media Server/Renderer - [ace20022] - * [guilib] Fix gif animations in case of a too large gif. + [Fice] + * [Docs] fixup urls to kodi.tv - [Chris "Koying" Browet] - * FIX: [droid] ignore power button + [ronie] + * [Confluence] fix last day of daily weather forecast - [Chris "Koying" Browet] - * FIX: [droid;keys] handle F-keys + [Kai Sommerfeld] + * [CEC] Added support for CEC buttons introduced by HDMI 1.4 - CONTENTS_MENU - ROOT_MENU - TOP_MENU - DVD-MENU (Requires at least libcec 2.2.0) - [ronie] - * [Confluence] fix button alignment - fixes trac #16382 + [Philipp Te] + * removed redundant value conditions from variables - [MilhouseVH] - * [dbwrapers] Include database name in error message - [ronie] - * [re-touched] skin update + [wsnipex] + * use correct app name in the linux desktop file (fixes #15524) - [Thomas Amland] - * [gui] show an ok dialog instead of the addon update dialog when there are no versions available + [Martijn Kaijser] + * Update GPL license XBMC -> Kodi - [ronie] - * [Confluence] disallow program addons selection + [Rainer Hochecker] + * dvdplayer: exclude blurays from fast anylyzinh mpegts streams - [metaron] - * [PVR] Fix for blank Currently In Prog Recordings + [Memphiz] + * [rebrand] - change default username of webserver from xbmc to kodi - [txtranslation] - * [lang] correct wrong (duplicated) numeric ID + [montellese] + * settings: fix combination of updated settings and default value handling - [Martijn Kaijser] - * bump to 16.0 beta3 + [popcornmix] + * [AE] Allow resampler to indicate when it has too much data buffered - [metaron] - * [PVR] Fix Timer Status UI inconsistencies + [popcornmix] + * [omxplayer] Remove unused function - [Stephan Raue] - * [keyboard.xml] add KEY_CONFIG keymapping (config) + [arnova] + * changed: For web servers returning filenames with & encoding (e.g. Apache) transcode into %-URL encoding. Fixes #15365 - [Stephan Raue] - * [LinuxInputDevices] add KEY_SELECT support (return) + [Karlson2k] + * Change APP_HOME -> KODI_HOME and other APP_* -> KODI_* - [Stephan Raue] - * [LinuxInputDevices] add KEY_FILE support (launch_file_browser) + [arnova] + * fixed: For DAV files we should first get filename then URL decode else files like test;.avi fail - [Stephan Raue] - * [LinuxInputDevices] add KEY_SEARCH support (browser_search) + [arnova] + * fixed: ConvertHTMLToW didn't properly handle &#x encoding - [Stephan Raue] - * [LinuxInputDevices] add KEY_MAIL support (launch_mail) - [Stephan Raue] - * [keyboard.xml] add KEY_HOMEPAGE keymapping (Home) + [Martijn Kaijser] + * Update GPL license XBMC -> Kodi - [Stephan Raue] - * [keyboard.xml] add KEY_RED,KEY_GREEN,KEY_YELLOW,KEY_BLUE keymapping (colored buttons) + [Martijn Kaijser] + * [release] also bump version in configure.in - [Stephan Raue] - * [keyboard.xml] add KEY_FAVORITES keymapping (Favorites) + [uNiversaI] + * xbmc -> left over - [Stephan Raue] - * [keyboard.xml] add KEY_TEXT keymapping (Text) + [montellese] + * Revert "media library: add UPnP servers to sources://" - [Stephan Raue] - * [keyboard.xml] add KEY_ZOOM keymapping (Zoom) + [montellese] + * Revert "upnp: fire an update source message when a UPnP server becomes available/unavailable" - [Stephan Raue] - * [mouse.xml] add right click keymapping (Info) + [yanniks] + * [linux/ubuntu] update README files - [Stephan Raue] - * [keyboard.xml] add ALT+F4 keymapping (Exit) + [Rainer Hochecker] + * dvdplayer: exclude blurays from fast anylyzinh mpegts streams - [Stephan Raue] - * [keyboard.xml] add CTRL+R keymapping (Record) + [Memphiz] + * [rebrand] - change default username of webserver from xbmc to kodi - [anaconda] - * builtins: fix Container.Refresh after ac870b64b16dfd0fc2bd0496c14529cf6d563f41. + [montellese] + * settings: fix combination of updated settings and default value handling - [wsnipex] - * redact filenames in smbfile log output + [popcornmix] + * [AE] Allow resampler to indicate when it has too much data buffered - [sportica] - * Fix codepage problem to input Korean properly. + [popcornmix] + * [omxplayer] Remove unused function - [Thomas Amland] - * [addons] fix pausing of repository updates during foreground playback + [Sam Stenvall] + * [pvr] fix deleting recording folders - [Thomas Amland] - * allow CTimer to be restarted asynchronously + [arnova] + * changed: For web servers returning filenames with & encoding (e.g. Apache) transcode into %-URL encoding. Fixes #15365 - [Anton Fedchin] - * [win32] RenderingSystemDX::OnDeviceReset() - fire OnResetDevice event also if new device was created. + [Karlson2k] + * Change APP_HOME -> KODI_HOME and other APP_* -> KODI_* - [Pär Björklund] - * Re-add the openssl hack, was never mean't to be removed without adding a proper fix + [arnova] + * fixed: For DAV files we should first get filename then URL decode else files like test;.avi fail - [Martijn Kaijser] - * [win32] Windows has no GL any more so setting negate is obsolete + [arnova] + * fixed: ConvertHTMLToW didn't properly handle &#x encoding [Martijn Kaijser] - * [droid] Don't show option "sync playback to display" as it's not supported on Android - - [Kolja Lampe] - * [music] When adding a new music directory, ask the user if he wants to scan it + * [release] bump to 14.0 beta1 - [metaron] - * [PVR] Prevent broken Timers being 'Next Recording' [ronie] - * remove broken musicvideos scraper + * nuke presetlist action. fixes #15518 - [BtbN] - * AE Pulse: Ignore volume changes on corked sinks + [Rainer Hochecker] + * videorefclock: fix potential segfault on systems which do not support video sync - [Glenn-1990] - * [PVR] prevent empty timer settings with integers + [Memphiz] + * [ios] - replace the launch images holding the XBMC logo with plain black images (as those aren't shown on most devices anyways and our startup time is fast enough to not need visible launch images) - [fritsch] - * FFMpeg: Bump to 2.8.2-Jarvis-beta2 + [Memphiz] + * [ios] - add the launchimage for iphone5 screens to the info.plist - restores iphone5 resolution on ios8 - [Glenn-1990] - * [PVR] fix timer dialog 'maxRecordings' label + [anaconda] + * Fix marking a video with a resume point as watched. - [Martijn Kaijser] - * [repo] Only fetch the addons.xml for the current version as we changed our repo script on the server to auto copy all compatible version to a single folder + [popcornmix] + * [rbp/settings] Allow av sync type to be enabled - [Martijn Kaijser] - * bump to 16.0 beta 2 + [popcornmix] + * [omxplayer] Request 3 render buffers - [metaron] - * [PVR] Remove repeating timers from Recording lists + [Chris "Koying" Browet] + * FIX: [depends] install pvr at the proper, name depdendant, place - [Thomas Amland] - * [addons] remove unused methods + [fritsch] + * PGS Subs: Don't read from null ptr and Flush on error - [Thomas Amland] - * [addons] fix min/max typo. should get the repo with the highest version + [Karlson2k] + * [cec] [win32] Use new package format - [Thomas Amland] - * [addons] dont include broken versions in available updates + [Lars Op den Kamp] + * [CEC] use device name 'Kodi' instead of 'XBMC' - [robwebset] - * Support PlayingBackgroundMedia + [Lars Op den Kamp] + * [CEC] fixed - don't use CEC_CLIENT_VERSION_CURRENT for the client version, because it will lead to issues when XBMC is rebuilt after a libCEC bump that changes something - [MilhouseVH] - * Clear previous cancelled flag + [Lars Op den Kamp] + * [CEC] renamed the iDoubleTapTimeoutMs in the new libCEC for clarity. does not change binary compatibility - [MilhouseVH] - * Fix inversion of export library dialogs; fix #16317, fix #16358 + [Lars Op den Kamp] + * [CEC] fixed: don't return garbage from CEC related app messenger methods see https://github.com/xbmc/xbmc/commit/19d37944ca2a2ac2f3e71a40a94e9ea289d8f2db#commitcomment-8248480 - [LS80] - * [python] Fixed getRegion dateshort format without leading zero + [Lars Op den Kamp] + * [CEC] prevent bus rescan on a Pi, since the adapter cannot be removed - [John Rennie] - * Fix ticket 15727, SMS input not updating CGUIKeyboardGeneric + [Lars Op den Kamp] + * [CEC] bump libCEC to 2.2.0 + [montellese] + * cmake: rename XBMCROOT to APP_ROOT with backwards compatibility - [Martijn Kaijser] - * bump to 16.0 beta 2 + [montellese] + * cmake: fix version.txt parsing and APP_NAME in kodi-config.cmake + [montellese] + * cmake: rebrand from xbmc to kodi with backwards compatibility - [Stefan Saraev] - * [amcodec] partialy revert 344af8f + [popcornmix] + * Add VideoReference clock for Raspberry Pi - [Chris "koying" Browet] - * FIX: [droid] Only sw for SD MPEG + [popcornmix] + * [rbp] Add method for waiting for next vsync - [Chris Browet] - * FIX: [amc] skip frame render when changing surface size + [popcornmix] + * [egl] Add support for calling OnResetDevice on display mode change + [Rainer Hochecker] + * videorefclock: add video sync drm [Rainer Hochecker] - * AE: fix GetDelay - only apply time correction to sink delay + * X11: expose crtc needed by drm video sync - [DaveTBlake] - * Restore content to "files" when in music file view, but still have "media info" view type available so that music file tag data can be displayed. + [Rainer Hochecker] + * videorefclock: refactoring + [Lars Op den Kamp] + * [CEC] fixed: don't try to stick a value > 255 in a byte - [Thomas Amland] - * [addons] lock manager initialization + [Brandon McAnsh] + * Use APP_NAME_LC for generating the android library - [Thomas Amland] - * [addons] dont change disabled state in db directly on addon update + [Matthias Kortstiege] + * [videodatabase] speed up the video database cleanup for archives - [Thomas Amland] - * [addons] clear blacklist state from database and manager on uninstall + [Matthias Kortstiege] + * [musicinfoscanner] keep track of already processed paths while scanning - [enen92] - * [pydocs] Fix small typo in xbmc.log() example + [Thomas Amland] + * fix script.library type missing in runscript/runaddon checks. + [fritsch] + * VAAPI: Change some loglevels - we are spamming too much v2 - [Anton Fedchin] - * [win32/utils] Fixed converting yuv420 to nv12. Fixed trac #16217 + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing musicvideo from library - [Rainer Hochecker] - * VideoPlayer: fix for closed captions - 708 + [Matthias Kortstiege] + * [videodatabase] path hash is not invalidated when removing movie from library + [phil65] + * dynamic dialog size for DialogSelect.xml [Thomas Amland] - * [events] fix crash when attempting to install an addon not in a repository from the event list + * [videoinfoscanner] scan the entire subtree of path passed to scanner. - [Alwin Esch] - * [gui] Sort include files on GUIWindowLoginScreen.* alphabetical - [metaron] - * [PVR] Recording EPG Association Fix + [Lars Op den Kamp] + * ... and prevent these backup files from being committed again - [DaveTBlake] - * Use CMusicInfoTag.GetArtistString() and GetAlbumArtistString to pass song and album artist string out to python addons. + [Lars Op den Kamp] + * removed accidental backup file committed... + [Martijn Kaijser] + * [droid] update Android manifest with - [Memphiz] - * [ios] - fix playback controls from ios control center when kodi is playing music and backgrounded + [yanniks] + * [README] updates for Kodi - [Alwin Esch] - * [builddep] add calls to create missing headers on build for libgpg-error + [Lars Op den Kamp] + * changed to enable all component logging by default - [Kai Sommerfeld] - * [PVR] Fix: Toggle record/stop recording on ACTION_RECORD (e.g. for 'record' remote control button) + [Lars Op den Kamp] + * [CEC] fixed: re-enable CEC logging by default after fba4e391197b92d2e49c936a3a13fe785014d31c. It can still be disabled for people who don't want to see CEC logging, but it'll now be enabled again by default when debugging is enabled, like it was in Gotham. - [Kai Sommerfeld] - * [PVR] Fix: Remove context menu item 'Add to favourites' for children of repeating timers + [popcornmix] + * [rbp] Fix for orientation handling of Pi textures - [Kai Sommerfeld] - * [PVR] Prevent to delete read-only timers (e.g. using 'del' key) - [Kai Sommerfeld] - * [PVR] Context menu cleanup: All windows use same order for menu items + [Memphiz] + * [ios] - update readme - [Kai Sommerfeld] - * [PVR] Context menu cleanup: Consequently use same logic for 'Stop recording' vs 'Delete timer' + [Memphiz] + * [darwin] - some pending xcode project changes (xcodes does those whenever opened so lets commit them) - [Kai Sommerfeld] - * [PVR] Context menu cleanup: Rename CONTEXT_BUTTON_ADVANCED_RECORD to CONTEXT_BUTTON_ADD_TIMER + [Chris "Koying" Browet] + * fixup 5f5d8c86490510f49b82d05ff16011bfbf4cbfa8; re-add default joystick map - [Alwin Esch] - * [depends] fix libgpg-error compile with gcc5 (Ubuntu Xenial) with update to version 1.20 - [Alwin Esch] - * [depends] fix libssh compile with gcc5 (Ubuntu Xenial) + [montellese] + * [confluence] fix default focus in ProfileSettings.xml (fixes #15507) - [Ned Scott] - * Minor keyboard.xml improvements + [Karlson2k] + * [win32] [vfs] Win32SMBDirectory: Do not try to connect with not required. Implemented similarly to Win32SMBFile. + [Thomas Amland] + * [smb] only log if samba logging is enabled - [Memphiz] - * [jenkins] - evaluate new env var "BUILD_BINARY_ADDONS" + [anaconda] + * Respect parent path decision when cleaning paths. - [Memphiz] - * [jenkins] - remove unused linux32 buildsteps - [Memphiz] - * [jenkins] - removed osx32 build support + [yanniks] + * [ios/atv2] fix spelling mistake in README - [DaveTBlake] - * Split mood into an array of values when serialized to match JSON interface. Bump JSON minor version as interface now correctly returning mood. + [Frank Razenberg] + * [keymap] Update PS3 keymap to use a regex name so it works OOB with sixad driver - [Chris "koying" Browet] - * FIX: [droid] some intent filters MUST be registered in code + [Frank Razenberg] + * [keymap] Add trigger attributes to 360 controller + altname for Razer Sabertooth - [Chris "koying" Browet] - * FIX: [droid] regression on media keys with CEC + [Frank Razenberg] + * [buttontranslator] Use regexes for joystick names in ButtonTranslator keymaps - [Kai Sommerfeld] - * [EPG,PVR] Fix deadlock caused by Noitifyobservers call while holding instance's mutex. + [Frank Razenberg] + * [buttontranslator] Add keymap attribute for axis-to-trigger mappings + [Frank Razenberg] + * [windows] WINJoystick: correctly handle multiple joystick and improve triggers - [ace20022] - * [texture/iimage] Pass the texture's width to iimage's Decode() method. + [Frank Razenberg] + * [linux] Rewrite SDL_Joystick to use SDL2: adds hotplug support, correctly handles multiple joysticks and improves axis handling - [Chris "koying" Browet] - * FIX: [amc] VC1 tweak + [wsnipex] + * [depends] move to SDL2 for linux - [Kai Sommerfeld] - * [PVR] Remove redundant method CGUIWindowPVRTimers::ShowTimerSettings. + [Tobias Arrskog] + * [configure] Moved xbmc to SDL2 - [Kai Sommerfeld] - * [PVR] Fix: Do not try to update read-only timers. - [Matthias Kortstiege] - * [coverity] CID#1267254 uninitialized class members in GUIFont.cpp + [Memphiz] + * [ios] - fix compile (stupid backport error - yeah i will continue using jenkins i promise ...) - [Matthias Kortstiege] - * [coverity] CID#1315108 class member 'm_image' is not initialized + [Memphiz] + * [jenkins/android] - fixed wrong env_var check - [Matthias Kortstiege] - * [coverity] CID#1316471 class member 'm_doContentLookup' is not initialized + [ronie] + * [Confluence] fix visible condition - [Matthias Kortstiege] - * [coverity] CID#1262133 fix possible div-by-zero in Autorun.cpp + [BigNoid] + * [win32] Dont delete AppData folder - [Matthias Kortstiege] - * [cleanup] remove unused variables + [Memphiz] + * [jenkins/android] - allow to build OBB package via jenkins env_var - [Fernando] - * Fix TRAC 16359: not filtering tvshows/movies already in tag + [Memphiz] + * [ios8] - another native keyboard fix which slipped through when compiling with our old sdk on jenkins + [montellese] + * [win32] fix compiling TestRarFile due to missing S_IFLNK - [Matthias Kortstiege] - * [music] don't use the directory cache when cleaning the database (fixes #16354) + [Memphiz] + * [jenkins/android] - enable usage of release sign key - [Thomas Amland] - * [addons] fix library path building + [Memphiz] + * [vtb] - fix the removed clamp for retina displays (need to fix the stride for some movies as it was done before) - [ace20022] - * [JpegIO] Crop too large image/frame in Decode. This fixes a theoretically possible access violation. + [montellese] + * tests: fix CXBMCTestUtils::ReferenceFilePath() - [ace20022] - * [cximage] Crop too large image/frame in Decode. This fixes a theoretically possible access violation. + [montellese] + * [win32] silence warning about unused variable - [ace20022] - * [fix][gif] Crop too large image/frame in Decode. This fixes a possible access violation. + [montellese] + * [win32] fix building and running Kodi-test - [ace20022] - * [iimage] Add width and height of the texture/buffer to the interface method Decode(...). + [montellese] + * cmake: handle cases when cmake has pre-initialized CMAKE_INSTALL_PREFIX - [ace20022] - * [gif] Check if there's a frame, before accessing it. This prevents a possible access violation. + [montellese] + * make "Zeroconf Browser" localizable - [Matthias Kortstiege] - * [guilib] colordiffuse not applying to progresstextures + [montellese] + * upnp: fire an update source message when a UPnP server becomes available/unavailable - [Matthias Kortstiege] - * [guilib] fix togglebutton label not rendered properly + [montellese] + * media library: add UPnP servers to sources:// - [ace20022] - * [gif] Check frame dimensions. + [montellese] + * SourcesDirectory: avoid retrieving removable devices if getting media sources failed - [ace20022] - * [gif] Skip frames with an illegal dimension rather than abort. + [montellese] + * media library: force a reload when sources have changed in files view + [ronie] + * Remove 'XBMC.' from built-ins - [fritsch] - * Compositors: Only disable them if actually in use + [ronie] + * [Confluence] Update weather window - [Lauri Myllari] - * x11: use the standard hint for disabling compositing + [ronie] + * Add some new weather strings - [Rainer Hochecker] - * videoplayer: fix detection of program change + [arnova] + * fixed: Asserting on empty protocol is too extreme, it also fails with file://... - [un1versal] - * [strings] fix incorrect dvd mount string and generalise it instead + [wsnipex] + * [buildsystem] posix: add legacy xbmc links for libdir, includedir and datarootdir - [Stefan Saraev] - * [udevprovider] also handle 'change' events. fixes data cd/dvds - [Stefan Saraev] - * [udevprovider] fix mounting raw filesystems on a non partitioned disks + [janbar] + * [pvr] Fix unexpected sub channel merge in EPG grid - [Stefan Saraev] - * [udevprovider] fix segfaults. mountpoint can be null + [Matthias Kortstiege] + * [streamdetails] do not log username/password - [Rainer Hochecker] - * paplayer: wait for eof if no crossfading or cue sheet + [Matthias Kortstiege] + * [playlistplayer] do not log username/password + [Matthias Kortstiege] + * [subtitles] do not log username/password - [DaveTBlake] - * Fix missing artist display in music player + [Matthias Kortstiege] + * [videoinfoscanner] do not log username/password - [Sam Stenvall] - * [teletext] fix incorrect loop parameters, makes loop run again + [Thomas Amland] + * runscript: make sure to get the correct extension point to run - [Sam Stenvall] - * [dxva] fix dereferencing this after deleting it + [Chris "Koying" Browet] + * CHG: [droid] refactor packaging to allow obb google extension apk - [Sam Stenvall] - * fix invalid log format specifiers + [uNiversaI] + * [rebrand] minor @echo @APP_NAME@ instead of kodi/xbmc + [Memphiz] + * [ios/atv2] - adapt the readme for support with Xcode 6.1 against iOS SDK 8.1 on Yosemite - [Chris "Koying" Browet] - * FIX: [droid] Media keys handling fixups + [Memphiz] + * [osx] - adapt readme for compatibility with Xcode 6.1 with OSX SDK 10.10 under Yosemite - [Martijn Kaijser] - * bump to 16.0 beta1 + [Memphiz] + * [ios/atv2] - adapt readme - we support Xcode 6.0.1 against iOS 8 SDK - [wsnipex] - * [python] demote pythons stdout to loglevel debug + [Memphiz] + * ios] - fix libmpeg2 build error by making it even more PIC (also the real fix for the xcode5 build issue earlier) - [ronie] - * remove skin backward compatibility + [Linus Yang] + * [ios] - libRTV fix build for Xcode 6 + [Linus Yang] + * [ios] - fix pil build with Xcode 6 - [ronie] - * [re-touched] update + [Linus Yang] + * [ios] - fix libssh build with Xcode 6 - [Søren Juul] - * Fix regressions introduced by refactoring in commit 9e9396b073ba973b2847896a11244a9f37ecbaff + [Memphiz] + * [ios] - support Xcode 6.x and iOS 8 SDK - [DaveTBlake] - * JSON when getting album or song ensure underlying query uses song_artist or album_artist tables to fully populate artist credits. Hence artist names and id arrays will be consistent. As a bonus now gets MBID (as a vector to match names and ids) + [Memphiz] + * [ios] - bump gas-preprocessor - [Anton Fedchin] - * [WinRenderer] Fixed HQ scalers again. - [Martijn Kaijser] - * [win32] it's time we also name the stacktrace and crashdump Kodi + [Matthias Kortstiege] + * [scrapers] log what actually failed to load - [Ryan Rector] - * Lower "Thread start" logging level + [anaconda] + * Fix LOGDBUS component logging. - [Erwin Jansen] - * Fix unit tests on linux/os-x + [Memphiz] + * [ios] - fix devcert signing (pvr addons were missing and couldn't be loaded) - [Chris "Koying" Browet] - * CHG: [droid] proper handling of MEDIA keys + [Rainer Hochecker] + * vaapi: glIsSync, glIsTexture seem to unreliable on Intel - [Chris "Koying" Browet] - * FIX: don't show size for non-file items + [popcornmix] + * [PiSink] Dual audio support - [arnova] - * changed: Increase maximum amount of cached directories to 50 + [popcornmix] + * [omxplayer] Restore flush/accurate seek flags to fix issue with edl skipping + [Rainer Hochecker] + * vaapi: workaround intel bugs - [Chris "Koying" Browet] - * FIX: [droid;amc] be sure that we have a surface + [Memphiz] + * [ios] - add support for iPad Air 2 and iPad mini 3 - [Chris "koying" Browet] - * FIX: [droid] do not reuse destroyed native window + [Memphiz] + * [ios/vtb] - remove the video render scale down / clamp for all retina devices which have enought power to render unscaled - [SkyCrawl] - * Adding keyboard layout: Czech QWERTZ + [Memphiz] + * [ios] - add launch images for ip6 and ip6+ for enabling the new resolutions + [Memphiz] + * [ios] - support iphone6plus screensize which uses screenScale 3 and add support for iPhone6 screen aswell - [un1versal] - * [confluence]fix alignment of subtitles menu in livetv OSD when VideoPlayer.HasMenu is not visible - [un1versal] - * [confluence]fix 3D menu alignment when VideoPlayer.HasMenu is not visible + [xhaggi] + * [pvr] fix continue playback of last watched channel on startup if group was deleted or channel was moved - [Matthias Kortstiege] - * [make] silent ar compiler warnings + [wsnipex] + * [buildsteps] fix linux32 gtests invocation as well - [Kolja Lampe] - * Remove .idea folder which get's created from JetBrains CLion + [wsnipex] + * [buildsteps] fix OSX gtests invocation - [Chris "Koying" Browet] - * FIX: [droid;amcs] do not stop video when loosing main surface + [wsnipex] + * [buildsteps] fix linux gtest invocation - [Anton Fedchin] - * [d3d11] Fixed issue with stereoscopic 3D mode and DXVA scaling for some drivers which works incorrectly with DXVA processor and deferred context. + [Memphiz] + * [osx] - don't release strings we didn't alloc - fixes crash on shutdown (introduced in rebrand) - [Anton Fedchin] - * [WinRenderer] Fix HQ scallers, to avoid unnecessary scaling at Stage1 (with DXVA processor and color shader). This also fixes HQ scallers for TAB/SBS modes. + [Memphiz] + * [git] - add generated FEH-ARM.py and FEH.py to gitignore - [Matthias Kortstiege] - * [globals] remove macro XBMC_GLOBAL + [phil65] + * [rebrand] - fixed some labels from strings.po files - [Matthias Kortstiege] - * [guilib] fix togglebutton not properly resizing when using the altlabel + [xhaggi] + * [pvr] removes unnecessary persist of current channel in GetLastPlayedChannel() + [xhaggi] + * [pvr] fix: update to last watched does not reflect to correct channel instance - [Martijn Kaijser] - * [droid] update readme to recommend Ubuntu 14.04 + [xhaggi] + * [pvr] fix call to base class GetContextButtons() to re-add favorite entry - [h.udo] - * [gitignore] More android artifacts + [Philipp Te] + * [CONFLUENCE] fixed lyrics xml filename in includes.xml - [Kai Sommerfeld] - * [PVR] Fix: Coverity: CGUIInfoManager: divide_by_zero (actually a false positive) + [Philipp Te] + * [CONFLUENCE] removed some unneccessary visibility conditions - [Kai Sommerfeld] - * [PVR] Fix: Coverity: CGUIDialogPVRRadioRDSInfo: uninit member + [Philipp Te] + * [CONFLUENCE] fixed lyrics xml filename in MusicVis - [Kai Sommerfeld] - * [PVR] Fix: Coverity: CPVRManagerStartJob: unused member + [Lars Op den Kamp] + * [pvr] bump add-ons - [Kai Sommerfeld] - * [PVR] Fix: Coverity: PVRGUIInfo: uninit member + [montellese] + * [win32] rename XBMC_PROFILE_USERDATA to APP_PROFILE_USERDATA + [montellese] + * [win32] rename XBMC_HOME to APP_HOME - [Chris "koying" Browet] - * CHG: [droid] decouple kodi and system audio volumes + [Rainer Hochecker] + * dxva: fix memory leak caused by additional ref on video surfaces - [Kai Sommerfeld] - * [xcode] add xbmc/addons/include directory to project (exists for ages, but was not in project) + [uNiversaI] + * [fix] keyboard layout default setting - [Kai Sommerfeld] - * [guiinfo] Fixed LISTITEM_ISRECORDING for epg event items in case there is an aborted recording for the selected epg event. + [Karlson2k] + * [vfs] PVRFile::Read(): do not return negative values other than "-1" + [Karlson2k] + * DVDInputStreamTV/DVDInputStreamFile: Don't set EOF in case of error to give player a chance to retry read. - [Chris "Koying" Browet] - * CHG: [droid] Use best possible icons for app + refactor + [Rainer Hochecker] + * dxva: fix selection of render target format + + [xhaggi] + * [builtin] fix activatewindow if directory path differs + + [AlwinEsch] + * [pvr] fix unnecessary creation of new CPVRChannel instances - [Chris "Koying" Browet] - * CHG: [droid] stop video when loosing focus - [Chris "koying" Browet] - * FIX: [droid] protect clear surface vs. destruction - [Chris "Koying" Browet] - * FIX: [droid] also check CPU2 for compatibility - [dummy] * dummy + -- wsnipex Sun, 04 Nov 2012 09:41:54 +0100 diff -Nru kodi-16.1~git20160425.1001-final/debian/control kodi-15.2~git20151019.1039-final/debian/control --- kodi-16.1~git20160425.1001-final/debian/control 2016-04-25 08:03:05.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/debian/control 2015-10-19 09:22:12.000000000 +0000 @@ -11,13 +11,13 @@ cmake, curl, cvs, - dcadec-dev, default-jre | openjdk-6-jre | openjdk-7-jre, fpc, gawk, gcc (>= 4.8) | gcc-4.8, gdc, gperf, + libafpclient-dev, libasound2-dev | libasound-dev, libass-dev (>= 0.9.8), libavahi-client-dev, @@ -28,8 +28,8 @@ libboost-thread-dev, libbz2-dev, libcdio-dev, + libcec3, libcec-dev (>= 3), - libcrossguid-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev | libcurl-dev, libcwiid-dev, libdbus-1-dev, @@ -75,7 +75,6 @@ libtinyxml-dev, libtool, libudev-dev, - udev, libva-dev, libvdpau-dev, libvorbis-dev, @@ -88,10 +87,9 @@ nasm [!amd64], python-dev, python-imaging, - python-support | python-minimal, + python-support, swig, unzip, - uuid-dev, yasm, zip, zlib1g-dev @@ -105,7 +103,6 @@ Depends: kodi-bin (>= ${source:Version}), kodi-bin (<< ${source:Version}.1~), curl, - libcurl3, mesa-utils, x11-utils, fonts-liberation | ttf-liberation, @@ -115,22 +112,21 @@ python-simplejson, libmad0, libass5 | libass4, - libgif7 | libgif5, libssh-4 | libssh2-1, - libnfs8 | libnfs4 | libnfs1, + libnfs4 | libnfs1, libbluray1, libshairplay0, libvorbisfile3, libaacs0, libcec3, librtmp1 | librtmp0, - libgnutls30 | libgnutls-deb0-28 | libgnutls28 | libgnutls26, + libgnutls-deb0-28 | libgnutls28 | libgnutls26, libxslt1.1, libyajl2, ${python:Depends}, ${misc:Depends} Recommends: libvdpau1, - libva-intel-vaapi-driver | i965-va-driver, + libva-intel-vaapi-driver, libva1 Suggests: kodi-pvr-mythtv, kodi-pvr-vuplus, diff -Nru kodi-16.1~git20160425.1001-final/debian/control.in kodi-15.2~git20151019.1039-final/debian/control.in --- kodi-16.1~git20160425.1001-final/debian/control.in 2016-04-25 08:01:49.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/debian/control.in 2015-10-19 08:39:25.000000000 +0000 @@ -13,7 +13,6 @@ Depends: kodi-bin (>= ${source:Version}), kodi-bin (<< ${source:Version}.1~), curl, - libcurl3, mesa-utils, x11-utils, fonts-liberation | ttf-liberation, @@ -23,22 +22,21 @@ python-simplejson, libmad0, libass5 | libass4, - libgif7 | libgif5, libssh-4 | libssh2-1, - libnfs8 | libnfs4 | libnfs1, + libnfs4 | libnfs1, libbluray1, libshairplay0, libvorbisfile3, libaacs0, libcec3, librtmp1 | librtmp0, - libgnutls30 | libgnutls-deb0-28 | libgnutls28 | libgnutls26, + libgnutls-deb0-28 | libgnutls28 | libgnutls26, libxslt1.1, libyajl2, ${python:Depends}, ${misc:Depends} Recommends: libvdpau1, - libva-intel-vaapi-driver | i965-va-driver, + libva-intel-vaapi-driver, libva1 Suggests: kodi-pvr-mythtv, kodi-pvr-vuplus, diff -Nru kodi-16.1~git20160425.1001-final/debian/kodi-addon-dev.install kodi-15.2~git20151019.1039-final/debian/kodi-addon-dev.install --- kodi-16.1~git20160425.1001-final/debian/kodi-addon-dev.install 2016-04-25 08:01:49.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/debian/kodi-addon-dev.install 2015-10-19 08:39:25.000000000 +0000 @@ -6,6 +6,5 @@ usr/include/kodi/libXBMC_addon.h usr/include/kodi/libXBMC_codec.h usr/include/kodi/libKODI_guilib.h -usr/include/kodi/libKODI_adsp.h usr/include/xbmc usr/lib/kodi/*.cmake diff -Nru kodi-16.1~git20160425.1001-final/debian/kodi-audio-dev.install kodi-15.2~git20151019.1039-final/debian/kodi-audio-dev.install --- kodi-16.1~git20160425.1001-final/debian/kodi-audio-dev.install 2016-04-25 08:01:49.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/debian/kodi-audio-dev.install 2015-10-19 08:39:25.000000000 +0000 @@ -1,4 +1,3 @@ usr/include/kodi/xbmc_audio*.h usr/include/kodi/kodi_audio*.h -usr/include/kodi/kodi_adsp*.h usr/include/kodi/AEChannelData.h diff -Nru kodi-16.1~git20160425.1001-final/debian/var_info kodi-15.2~git20151019.1039-final/debian/var_info --- kodi-16.1~git20160425.1001-final/debian/var_info 2016-04-25 08:01:49.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/debian/var_info 2015-10-19 08:39:25.000000000 +0000 @@ -11,13 +11,13 @@ cmake, curl, cvs, - dcadec-dev, default-jre | openjdk-6-jre | openjdk-7-jre, fpc, gawk, gcc (>= 4.8) | gcc-4.8, gdc, gperf, + libafpclient-dev, libasound2-dev | libasound-dev, libass-dev (>= 0.9.8), libavahi-client-dev, @@ -28,8 +28,8 @@ libboost-thread-dev, libbz2-dev, libcdio-dev, + libcec3, libcec-dev (>= 3), - libcrossguid-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev | libcurl-dev, libcwiid-dev, libdbus-1-dev, @@ -75,7 +75,6 @@ libtinyxml-dev, libtool, libudev-dev, - udev, libva-dev, libvdpau-dev, libvorbis-dev, @@ -88,10 +87,9 @@ nasm [!amd64], python-dev, python-imaging, - python-support | python-minimal, + python-support, swig, unzip, - uuid-dev, yasm, zip, zlib1g-dev" diff -Nru kodi-16.1~git20160425.1001-final/docs/README.android kodi-15.2~git20151019.1039-final/docs/README.android --- kodi-16.1~git20160425.1001-final/docs/README.android 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/docs/README.android 2015-10-19 08:39:15.000000000 +0000 @@ -13,7 +13,7 @@ 1. Introduction ----------------------------------------------------------------------------- -We currently recommend Ubuntu "Trusty Tahr" (14.04) 64Bit. This is what our continuous +We currently recommend Ubuntu "Precise Pangolin" (12.04) 64Bit. This is what our continuous integration system "jenkins" is using. Additionally, building from OSX Snow Leopard or Mavericks (others on your own risk ;) ) is working (see 3.1). @@ -25,20 +25,20 @@ ----------------------------------------------------------------------------- 2. Installing the required Ubuntu packages ----------------------------------------------------------------------------- -These are the minimum packages necessary for building Kodi. -Non-Ubuntu users will need to get the equivalents. +These are the minimum packages necessary for building Kodi. Non-Ubuntu +users will need to get the equivalents. - $ sudo apt-get install build-essential default-jdk git curl autoconf \ - unzip zip zlib1g-dev gawk gperf cmake + # sudo apt-get install build-essential default-jdk git curl autoconf \ + unzip zip zlib1g-dev gawk gperf cmake If you run a 64bit operating system you will also need to get ia32-libs -Ubuntu >= 14.04: - $ sudo apt-get install lib32stdc++6 lib32z1 lib32z1-dev - -Older versions: - $ sudo apt-get install ia32-libs + ubuntu >= 14.04: + # sudo apt-get install lib32stdc++6 lib32z1 lib32z1-dev + older versions: + # sudo apt-get install ia32-libs + The following versions are used on our continuous integration system "jenkins". Other (newer) versions might work as well. @@ -53,32 +53,30 @@ To develop Kodi for Android the Android SDK and NDK are required. -------------------------------------------------------------------- -3.1. Prerequisites when compiling on Mac OSX +3.1. Prerequesites when compiling on Mac OSX -------------------------------------------------------------------- a. When building on Mac OSX you should download the java version from here: http://support.apple.com/kb/DL1572 Or ensure otherwise that you are using java 1.6 (java -version tells you the version). b. The compilation for android needs a case sensitive filesystem. The - filesystem used on normal OSX installations is case insensitive. So you + filesystem used on normal osx installations is case insensitive. So you need to generate a writeable hdd image and format it with hfs+ (case sensitive). The size should be 20GB. c. Generate a writable dmg with the following command: - $ hdiutil create -type UDIF -fs 'Case-sensitive Journaled HFS+' -size 20g -volname android-dev ~/android-dev.dmg - + # hdiutil create -type UDIF -fs 'Case-sensitive Journaled HFS+' -size 20g -volname android-dev ~/android-dev.dmg d. Whenever you want to compile/develop you need to mount it: - $ open ~/android-dev.dmg - + # open ~/android-dev.dmg e. Your workspace can be accessed in /Volumes/android-dev/ then f. Once you have your hdd image with case sensitive hfs+ file system do all steps - below inside of this filesystem. In the end you need to adapt all paths in this + below inside of this filesystem. In the end you need to adapt all pathes in this document so that they match your local environment. As an example here is a - configure line from step 5.1 which demonstrates possible paths. In this + configure line from step 5.1 which demonstrates possible pathes. In this example the hdd image is mounted on /Volumes/android-dev. - $ ./configure --with-tarballs=/Users/Shared/xbmc-depends/tarballs --host=arm-linux-androideabi \ - --with-sdk-path=/Volumes/android-dev/android/android-sdk-macosx \ - --with-ndk=/Volumes/android-dev/android/android-ndk-r10d \ - --with-toolchain=/Volumes/android-dev/android/android-toolchain-arm/android-17 \ - --prefix=/Volumes/android-dev/android/xbmc-depends + ./configure --with-tarballs=/Users/Shared/xbmc-depends/tarballs --host=arm-linux-androideabi \ + --with-sdk-path=/Volumes/android-dev/android/android-sdk-macosx \ + --with-ndk=/Volumes/android-dev/android/android-ndk-r10d \ + --with-toolchain=/Volumes/android-dev/android/android-toolchain-arm/android-17 \ + --prefix=/Volumes/android-dev/android/xbmc-depends -------------------------------------------------------------------- 3.2. Getting the Android SDK and NDK @@ -86,15 +84,15 @@ To get the Android SDK, go to http://developer.android.com/sdk and download the latest version for your operating system. The NDK -can be downloaded from http://developer.android.com/tools/sdk/ndk/ +can be downloaded from http://developer.android.com/tools/sdk/ndk/ [NOTICE] Compiling Kodi for Android requires Android NDK - Revision at least 10d. For the SDK just use the latest available. + Revision at least 10d. For the SDK just use the latest available. It will work. After downloading the SDK and NDK extract the files contained in the archives to your harddisk. For our example we are extracting in the following -directories (this matches the example from tools/depends/README as well): +directories (this matches the example from tools/depends/README aswell): NDK (referenced as from now on): /opt/android-ndk-r10d @@ -118,9 +116,9 @@ After having extracted the Android SDK to you need to install some android packages using the Android SDK Manager: - $ cd /tools - $ ./android update sdk -u -t platform,platform-tool - $ ./android update sdk -u -t build-tools-20.0.0 + # cd /tools + # ./android update sdk -u -t platform,platform-tool + # ./android update sdk -u -t build-tools-20.0.0 -------------------------------------------------------------------- 3.4. Setup the Android toolchain -------------------------------------------------------------------- @@ -131,27 +129,27 @@ following commands will create a toolchain suitable for the most common scenario. The --install-dir option (and therefore the / value) -specifies where the resulting toolchain should be installed (your choice). +specifies where the resulting toolchain should be installed (your choice). [NOTICE] Kodi uses the android API Version 17 and gcc version 4.8! Building for arm architecture: - $ cd - $ ls platforms - $ cd build/tools - $ ./make-standalone-toolchain.sh --ndk-dir=../../ \ - --install-dir=/android-17 --platform=android-17 \ - --toolchain=arm-linux-androideabi-4.8 - + # cd + # ls platforms + # cd build/tools + # ./make-standalone-toolchain.sh --ndk-dir=../../ \ + --install-dir=/android-17 --platform=android-17 \ + --toolchain=arm-linux-androideabi-4.8 + Building for x86 architecture: - $ cd - $ ls platforms - $ cd build/tools - $ ./make-standalone-toolchain.sh --ndk-dir=../../ \ - --install-dir=/android-17 --platform=android-17 \ - --toolchain=x86-4.8 --arch=x86 --system=linux-x86_64 + # cd + # ls platforms + # cd build/tools + # ./make-standalone-toolchain.sh --ndk-dir=../../ \ + --install-dir=/android-17 --platform=android-17 \ + --toolchain=x86-4.8 --arch=x86 --system=linux-x86_64 Make sure to pick a toolchain for your desired architecture. If an error about the used system is shown - please add proper --system parameter as mentioned @@ -161,11 +159,11 @@ 3.5. Create a (new) debug key to sign debug APKs -------------------------------------------------------------------- -All packages must be signed. The following command will generate a -self-signed debug key. If the result is a cryptic error, it -probably just means a debug key already existed, no cause for alarm. + All packages must be signed. The following command will generate a + self-signed debug key. If the result is a cryptic error, it + probably just means a debug key already existed, no cause for alarm. - $ keytool -genkey -keystore ~/.android/debug.keystore -v -alias \ + # keytool -genkey -keystore ~/.android/debug.keystore -v -alias \ androiddebugkey -dname "CN=Android Debug,O=Android,C=US" -keypass \ android -storepass android -keyalg RSA -keysize 2048 -validity 10000 @@ -173,10 +171,10 @@ 4. Getting the source code ----------------------------------------------------------------------------- - $ cd $HOME - $ git clone git://github.com/xbmc/xbmc.git kodi-android - $ cd kodi-android - $ git submodule update --init addons/skin.re-touched + # cd $HOME + # git clone git://github.com/xbmc/xbmc.git kodi-android + # cd kodi-android + # git submodule update --init addons/skin.re-touched ----------------------------------------------------------------------------- 5. How to compile @@ -190,46 +188,45 @@ 5.1. Building dependencies -------------------------------------------------------------------- - $ cd $HOME/kodi-android/tools/depends - $ ./bootstrap - $ ./configure --help - -Run configure with the correct settings for you local configuration. -See tools/depends/README for examples. - -Anyone working on the dependencies themselves will want to set the -environment variables specified in ~/.bashrc or similar, to avoid -having to input these with each configure. - - $ make -j - $ make -j -C target/binary-addons - -NOTE: if you only want to build specific addons you can specify like this: - $ make -C target/binary-addons ADDONS="pvr.hts pvr.dvblink" - -This build was designed to be massively parallel. Don't be afraid to -give it a 'make -j20' or so. - -Verify that all dependencies are built correctly (it will tell you so) -before continuing to avoid errors. If in doubt run another 'make' (single threaded) -until the message "Dependencies built successfully." appears. If the single make -fails, keep cleaning the specific library by issuing: - $ make -C target/ distclean - -Then try make again. -Rinse and repeat until you are really done and all libs are built. + # cd $HOME/kodi-android/tools/depends + # ./bootstrap + # ./configure --help + + Run configure with the correct settings for you local configuration. + See tools/depends/README for examples. + + Anyone working on the dependencies themselves will want to set the + environment variables specified in ~/.bashrc or similar, to avoid + having to input these with each configure. + + # make -j + # make -j -C target/binary-addons + + NOTE: if you only want to build specific addons you can specify like this: + # make -C target/binary-addons ADDONS="pvr.hts pvr.dvblink" + + This build was designed to be massively parallel. Don't be afraid to + give it a 'make -j20' or so. + + Verify that all deps built correctly (it will tell you so) before + continuing. You will get crazy build errors otherwise. If in doubt + run another 'make' (single threaded) until the message + "Dependencies built successfully." appears. If the single make + fails keep cleaning the dependend library in charge by issueing + make -C target/ distclean. Then try make again. + Rinse and repeat until you are really done and all libs are built. -------------------------------------------------------------------- 5.2. Building Kodi -------------------------------------------------------------------- - $ cd $HOME/kodi-android - $ make -C tools/depends/target/xbmc - $ make - $ make apk + # cd $HOME/kodi-android + # make -C tools/depends/target/xbmc + # make + # make apk -After the first build (assuming bootstrap and configure are successful), -subsequent builds can be run with a simple 'make' and 'make apk'. + After the first build (assuming bootstrap and configure are successful), + subsequent builds can be run with a simple 'make' and 'make apk'. ----------------------------------------------------------------------------- 6. Installing Kodi in an Android system @@ -250,10 +247,10 @@ - Applications [X] Unknown sources - $ cd $HOME/kodi-android/tools/android/packaging - $ adb devices - $ adb -s install -r images/xbmcapp-debug.apk - + # cd $HOME/kodi-android/tools/android/packaging + # adb devices + # adb -s install -r images/xbmcapp-debug.apk + The can be retrieved from the list returned by the "adb devices" command and is the first value in the row representing your device. @@ -276,12 +273,12 @@ - Applications [X] Unknown sources - Development - [X] USB debugging + [X] USB debugging To access the log output of your Android system run (the -s parameter and the may not be needed when using the Android emulator) - $ adb -s logcat + # adb -s logcat -------------------------------------------------------------------- @@ -293,7 +290,7 @@ the -p/--project switches, as they do not work. Instead you will need to cd to tools/android/packaging/xbmc and execute it from there. - $ ndk-gdb --start --delay=0 + # ndk-gdb --start --delay=0 This will open the installed version of Kodi and break. The warnings can be ignored as we have setup the appropriate paths already. @@ -353,16 +350,18 @@ is 'tools/android/packaging' and that the proper sdk/ndk paths are set. -Install a new build over the existing one - $ adb -e install -r images/xbmcapp-debug.apk + # adb -e install -r images/xbmcapp-debug.apk -Launch Kodi on the emulator without the GUI - $ adb shell am start -a android.intent.action.MAIN -n org.xbmc.xbmc/android.app.NativeActivity + # adb shell am start -a android.intent.action.MAIN -n org.xbmc.xbmc/android.app.NativeActivity -Kill a misbehaving Kodi - $ adb shell ps | grep org.xbmc | awk '{print $2}' | xargs adb shell kill + # adb shell ps | grep org.xbmc | awk '{print $2}' | xargs adb shell kill -Filter logcat messages by a specific tag (e.g. "XBMC") - $ adb logcat -s XBMC:V - + # adb logcat -s XBMC:V + -Enable CheckJNI (BEFORE starting the application) - $ adb shell setprop debug.checkjni 1 + # adb shell setprop debug.checkjni 1 + + diff -Nru kodi-16.1~git20160425.1001-final/docs/README.armel kodi-15.2~git20151019.1039-final/docs/README.armel --- kodi-16.1~git20160425.1001-final/docs/README.armel 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/docs/README.armel 2015-10-19 08:39:15.000000000 +0000 @@ -1,22 +1,23 @@ TOC 1. Introduction 2. Using Scratchbox - 2.1 Automatic Installation - 2.2 Manual Installation - 2.3 Installation Continued for both Automatic and Manual Methods - 2.4 Setup Scratchbox + 2.1 Automatic Installation + 2.2 Manual Installation + 2.3 Installation Continued for both Automatic and Manual Methods + 2.4 Setup Scratchbox 3. Getting the source code 4. Installing the required ARMEL packages 5. Obtaining the SGX files 6. How to compile - 6.1 Configure & Make - 6.2 Install + 6.1 Configure & Make + 6.2 Install 7. How to run - 7.1 Obtaining the Packages - 7.2 Installing the Files - 7.3 Running Kodi + 7.1 Obtaining the Packages + 7.2 Installing the Files + 7.3 Running Kodi 8. Troubleshooting + ----------------------------------------------------------------------------- 1. Introduction ----------------------------------------------------------------------------- @@ -39,115 +40,115 @@ First, you need scratch box, along with some other packages. The easiest way is to do the following automatic installation. -If you don't succeed, or want to do it manually, follow the next step instead. - ------------------------------------------------------------------------------ -2.1 Automatic Installation: ------------------------------------------------------------------------------ - - $ sudo gedit /etc/apt/sources.list - -Add this to the end of the file, then save and exit gedit: - deb http://scratchbox.org/debian stable main - deb http://scratchbox.org/debian legacy main - -Now enter the following command: - $ sudo apt-get install scratchbox-core scratchbox-libs scratchbox-devkit-cputransp scratchbox-devkit-git scratchbox-devkit-mtd scratchbox-devkit-perl scratchbox-devkit-doctools scratchbox-toolchain-arm-linux-cs2007q3-51sb3 scratchbox-toolchain-host-gcc scratchbox-devkit-debian - ------------------------------------------------------------------------------ -2.2 Manual Installation: ------------------------------------------------------------------------------ - -Go to the following website: -http://www.scratchbox.org/download/files/sbox-releases/stable/tarball/ -and download the following files (Unless specified, choose latest version): - - core - - libs - - cputransp - - doctools - - git - - mtd - - perl - - toolchain (cs2007q3-51sb3) - - host-gcc - - debian - -To install - $ cd / - $ sudo tar xvf //scratchbox-core.tar.gz - -Repeat for all the downloaded files. - ------------------------------------------------------------------------------ -2.3 Installation Continued for both Automatic and Manual Methods: ------------------------------------------------------------------------------ +If you dont succeed, or want to do it manually, follow the next step instead. -Now, a few changes needs to me made in order for it to work correctly: - $ sudo gedit /etc/sysctl.conf - -Change/Add these variables: + ----------------------------------------------------------------------------- + 2.1 Automatic Installation: + ----------------------------------------------------------------------------- + + $ sudo gedit /etc/apt/sources.list + + Add this to the end of the file, then save and exit gedit: + deb http://scratchbox.org/debian stable main + deb http://scratchbox.org/debian legacy main + + Now enter the following command: + $ sudo apt-get install scratchbox-core scratchbox-libs scratchbox-devkit-cputransp scratchbox-devkit-git scratchbox-devkit-mtd scratchbox-devkit-perl scratchbox-devkit-doctools scratchbox-toolchain-arm-linux-cs2007q3-51sb3 scratchbox-toolchain-host-gcc scratchbox-devkit-debian + + ----------------------------------------------------------------------------- + 2.2 Manual Installation: + ----------------------------------------------------------------------------- + + Go to the following website: + http://www.scratchbox.org/download/files/sbox-releases/stable/tarball/ + and download the following files (Unless specified, choose latest version): + - core + - libs + - cputransp + - doctools + - git + - mtd + - perl + - toolchain (cs2007q3-51sb3) + - host-gcc + - debian + + To install + $ cd / + $ sudo tar xvf //scratchbox-core.tar.gz + + Repeat for all the downloaded files. + + ----------------------------------------------------------------------------- + 2.3 Installation Continued for both Automatic and Manual Methods: + ----------------------------------------------------------------------------- + + Now, a few changes needs to me made in order for it to work correctly: + $ sudo gedit /etc/sysctl.conf + + Change/Add these variables: vm.mmap_min_addr = 4096 - vm.vdso_enabled = 0 -Save and Close. - -Add yourself to scratchbox: - $ sb-adduser + vm.vdso_enabled = 0 + Save and Close. -Make sure it worked by doing the following command, and see if sbox is listed. - $ groups - -If it isn't listed, restart and try again. If it still isnt listed, then do the following: - $ usermod -a -G sbox - -It should now list (possibly after another logout) -Now you have access to scratchbox. - ------------------------------------------------------------------------------ -2.4 Setup Scratchbox: ------------------------------------------------------------------------------ - -Before setting up your target, you need a rootstrap. Obtain the latest rootstrap from: -http://linux.onarm.com/download/images/generic-X/ -You want to download the file 'beagleboard--rootstrap.tar.gz'. - -Do this every time you want to access scratchbox: - $ /scratchbox/login - -Time to setup your target: - $ sb-menu - -A GUI will appear for the setup procedure. - - Choose Setup - - Create a NEW target, give it any name - - Select the compiler you downloaded (arm-linux-cs2007q3-51sb3) - - Select all development kits listed by highlighting each one and pressing enter, then Done and enter - - Select CPU transparency (qemu-arm-cvs-m) - - Yes to rootstrap. Locate the previously downloaded rootstrap to install. - - Yes to install files - - Only select DEVKIT and ETC. Remove all other files in list, then continue - - And finally Yes to selecting target. - -Now scratchbox is setup + Add yourself to scratchbox: + $ sb-adduser + + Make sure it worked by doing the following command, and see if sbox is listed. + $ groups + + If it isnt listed, restart and try again. If it still isnt listed, then do the following: + $ usermod -a -G sbox + + It should now list (possibly after another logout) + Now you have access to scratchbox. + + ----------------------------------------------------------------------------- + 2.4 Setup Scratchbox: + ----------------------------------------------------------------------------- + + Before setting up your target, you need a rootstrap. Obtain the latest rootstrap from: + http://linux.onarm.com/download/images/generic-X/ + You want to download the file 'beagleboard--rootstrap.tar.gz'. + + Do this every time you want to access scratchbox: + $ /scratchbox/login + + Time to setup your target: + > sb-menu + + A GUI will appear for the setup procedure. + - Choose Setup + - Create a NEW target, give it any name + - Select the compiler you downloaded (arm-linux-cs2007q3-51sb3) + - Select all development kits listed by highlighting each one and pressing enter, then Done and enter + - Select CPU transparency (qemu-arm-cvs-m) + - Yes to rootstrap. Locate the previously downloaded rootstrap to install. + - Yes to install files + - Only select DEVKIT and ETC. Remove all other files in list, then continue + - And finally Yes to selecting target. + Now scratchbox is setup + ----------------------------------------------------------------------------- 3. Getting the source code ----------------------------------------------------------------------------- - $ sudo apt-get install git-core - $ cd /scratchbox/users//home// - $ git clone git://github.com/xbmc/xbmc.git - + $ sudo apt-get install git-core + $ cd /scratchbox/users//home// + $ git clone git://github.com/xbmc/xbmc.git + ----------------------------------------------------------------------------- 4. Installing the required ARMEL packages ----------------------------------------------------------------------------- There is a simple shell script that downloads a list of packages that are required and installs them into scratchbox. - $ cd tools/arm/arm-scripts/ - $ ./install-pkgs.sh - + > cd tools/arm/arm-scripts/ + > ./install-pkgs.sh + Please check the output files for any possible errors that may have occured. Note. You will need the headers and shared object files for EGL and GLESv2 to continue. @@ -161,7 +162,6 @@ Once you have installed said SDK on a standard Linux machine, copy the neccessary .h and .so files to the appropriate directories in scratchbox: e.g /scratchbox/users//targets//usr/include/EGL/egl.h These files will also need to be transferred over to the board eventually. - NOTE: Kodi has only been tested with the following versions of the OMAP35x Graphics SDK: 3.00.00.05, 3.00.00.06, 3.00.00.08, 3.00.00.09 @@ -172,88 +172,88 @@ To create the Kodi executable manually perform these following steps: ------------------------------------------------------------------------------ -6.1 Configure & Make: ------------------------------------------------------------------------------ - - $ ./bootstrap - $ ./configure --enable-gles - -This will configure Kodi inside scratchbox ready for compilation on ARM. -Because the default is to build for OpenGL, we require the --enable-gles flag to be set for OpenGL ES 2.0. -Note: No OpenGL ES 1.x available -Now, build with the following: - - $ make - ------------------------------------------------------------------------------ -6.2 Install: ------------------------------------------------------------------------------ - -There is no need to do 'make install' as we dont want it installed into scratchbox. -There is also the slight problem of the fact that scratchbox's 'find' command is outdated and wont execute Kodi's 'make install' correctly. -Instead, use the provided shell script: - $ cd /tools/arm/arm-scripts/ - $ ./create-xbmcfile.sh - -This will create a tar file tools/arm/arm-scripts/xbmc.tar.bz2 containing the Kodi files, ready for you to transfer to the board. + ----------------------------------------------------------------------------- + 6.1 Configure & Make: + ----------------------------------------------------------------------------- + + $ ./bootstrap + > ./configure --enable-gles + + This will configure Kodi inside scratchbox ready for compilation on ARM. + Because the default is to build for OpenGL, we require the --enable-gles flag to be set for OpenGL ES 2.0. + (Note: No OpenGL ES 1.x available) + Now, build with the following: + + > make + + ----------------------------------------------------------------------------- + 6.2 Install: + ----------------------------------------------------------------------------- + + There is no need to do 'make install' as we dont want it installed into scratchbox. + There is also the slight problem of the fact that scratchbox's 'find' command is outdated and wont execute Kodi's 'make install' correctly. + Instead, use the provided shell script: + > cd /tools/arm/arm-scripts/ + > ./create-xbmcfile.sh + + This will create a tar file tools/arm/arm-scripts/xbmc.tar.bz2 containing the Kodi files, ready for you to transfer to the board. ----------------------------------------------------------------------------- 7. How to run ----------------------------------------------------------------------------- -It is assumed you have a beagleboard with all the necessary hardware installed. -(e.g. keyboard, mouse, and Ethernet adapter) +It is assumed you have a beagleboard with all the neccessary hardware installed. +(e.g keyboard, mouse, and ethernet adapter) It is also assumed that you have it setup with either Angstrom or Ubuntu. ------------------------------------------------------------------------------ -7.1 Obtaining the Packages: ------------------------------------------------------------------------------ - -For Ubuntu: See README.linux for list of packages to install. -If planning on not extracting the pkgs file, a few additional packages are required to be installed. -These are python and liblzo2 - -For Angstrom: - $ opkg update - $ opkg install subversion make g++ gcc gawk pmount libtool automake gperf unzip bison libsdl-1.2-dev libsdl-image-1.2-dev libsdl-gfx-dev libsdl-mixer-1.2-dev libfribidi-dev liblzo-dev libfreetype-dev libsqlite3-dev libasound2 python-sqlite3 libcurl4 libxrandr-dev libxrender-dev libmad-dev libogg-dev libvorbis-dev libmysqlclient-dev libpcre-dev libdbus-glib-1-dev hal-dev libjasper-dev libfontconfig-dev boost-dev libxt-dev libxmu-dev libpng-dev libjpeg-dev - -Unfortunately this will only install the packages that are available through opkg. There will be further packages that need to be installed. -Either use the method mentioned below, or selectively find and install packages, mentioned at the bottom of this README. - -Alternatively, do the following: -First make sure you have done section 4. then do the following: - $ cd xbmc_on_arm/arm-scripts/ - $ ./create-pkgsfile.sh - -This will create a tar file xbmc_on_arm/arm-scripts/pkgs.tar.bz2 containing the packages, ready for you to transfer to the board. - ------------------------------------------------------------------------------ -7.2 Installing the Files: ------------------------------------------------------------------------------ - -Transfer the file(s), armel-pkgs.tar.bz2 (if using alternative method mentioned above) and xbmc.tar.bz2 to the beagleboard. -Do the following to extract them: - $ tar xjf armel-pkgs.tar.bz2 -C / - $ tar xjf xbmc.tar.bz2 -C /usr/ - -After this initial setup, during development, you should only need to replace /usr/share/kodi/kodi.bin with the newly created binary. - ------------------------------------------------------------------------------ -7.3 Running Kodi: ------------------------------------------------------------------------------ - -Now, run Kodi by executing the binary: - $ /usr/share/kodi/kodi.bin - -Run the binary and not the script as the script will fail. - - + ----------------------------------------------------------------------------- + 7.1 Obtaining the Packages: + ----------------------------------------------------------------------------- + + For Ubuntu: See README.linux for list of packages to install. + If planning on not extracting the pkgs file, a few additional packages are required to be installed. + These are python and liblzo2 + + For Angstrom: + # opkg update + # opkg install subversion make g++ gcc gawk pmount libtool automake gperf unzip bison libsdl-1.2-dev libsdl-image-1.2-dev libsdl-gfx-dev libsdl-mixer-1.2-dev libfribidi-dev liblzo-dev libfreetype-dev libsqlite3-dev libasound2 python-sqlite3 libcurl4 libxrandr-dev libxrender-dev libmad-dev libogg-dev libvorbis-dev libmysqlclient-dev libpcre-dev libdbus-glib-1-dev hal-dev libjasper-dev libfontconfig-dev boost-dev libxt-dev libxmu-dev libpng-dev libjpeg-dev + + Unfortunately this will only install the packages that are available through opkg. There will be further packages that need to be installed. + Either use the method mentioned below, or selectively find and install packages, mentioned at the bottom of this README. + + Alternatively, do the following: + First make sure you have done section 4. then do the following: + > cd xbmc_on_arm/arm-scripts/ + > ./create-pkgsfile.sh + + This will create a tar file xbmc_on_arm/arm-scripts/pkgs.tar.bz2 containing the packages, ready for you to transfer to the board. + + ----------------------------------------------------------------------------- + 7.2 Installing the Files: + ----------------------------------------------------------------------------- + + Transfer the file(s), armel-pkgs.tar.bz2 (if using alternative method mentioned above) and xbmc.tar.bz2 to the beagleboard. + Do the following to extract them: + # tar xjf armel-pkgs.tar.bz2 -C / + # tar xjf xbmc.tar.bz2 -C /usr/ + + After this initial setup, during development, you should only need to replace /usr/share/kodi/kodi.bin with the newly created binary. + + ----------------------------------------------------------------------------- + 7.3 Running Kodi: + ----------------------------------------------------------------------------- + + Now, run Kodi by executing the binary: + # /usr/share/kodi/kodi.bin + + Run the binary and not the script as the script will fail. + + ----------------------------------------------------------------------------- 8. Troubleshooting ----------------------------------------------------------------------------- - + If it fails to run correctly, there are a few things to try out. First, is there any helpful output on the terminal? Check the log file, usually located ~/.kodi/temp/kodi.log @@ -265,10 +265,9 @@ This is because the .deb files cannot be extracted in Angstrom. If this is not the case, try various different parameters for kodi.bin such as: - $ kodi.bin --standalone - $ kodi.bin -p - $ kodi.bin -fs - -Or build with debug for a more in-depth kodi.log file by omitting the line --disable-debug on configure. +kodi.bin --standalone +kodi.bin -p +kodi.bin -fs +Or build with debug for a more in-depth kodi.log file by ommitting the line --disable-debug on configure. Feel free to contact me on mcgeagh@xbmc.org diff -Nru kodi-16.1~git20160425.1001-final/docs/README.ios kodi-15.2~git20151019.1039-final/docs/README.ios --- kodi-16.1~git20160425.1001-final/docs/README.ios 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/docs/README.ios 2015-10-19 08:39:15.000000000 +0000 @@ -2,23 +2,22 @@ 1. Introduction 2. Getting the source code 3. Install required libs - 3.1. Install Xcode - 3.1.1 Supported Xcode and OSX constellations - 3.2. Install Cross libs and runtime environment + 3.1. Install Xcode + 3.1.1 Supported Xcode and OSX constellations + 3.2. Install Cross libs and runtime environment 4. How to compile and run - 4.1 Using XCode - 4.2 Using Command line + 4.1 Using XCode + 4.2 Using Command line 5. Packaging 6. Gesture Handling on iPad/iPhone/iPod touch 7. Usage/Development on un-jailbroken devices (only interesting for official apple developers!) - ----------------------------------------------------------------------------- 1. Introduction ----------------------------------------------------------------------------- -This is a platform port of Kodi for the Apple iOS operating system. -The current build system supports Xcode 6.x and 7.x with iOS SDK 8.x and 9.x +This is a platform port of Kodi for the Apple iOS operating system. +The current build system supports Xcode 6.0.1 and 6.1.0 with iOS SDK 8.1 There are two ways to build Kodi for Mac. 1) command-line or @@ -41,68 +40,64 @@ 2. Getting the source code ----------------------------------------------------------------------------- - $ cd $HOME - $ git clone git://github.com/xbmc/xbmc.git Kodi - $ cd Kodi - $ git submodule update --init addons/skin.re-touched + $ cd $HOME + $ git clone git://github.com/xbmc/xbmc.git Kodi + $ cd Kodi + $ git submodule update --init addons/skin.re-touched ----------------------------------------------------------------------------- 3.1 Install Xcode ----------------------------------------------------------------------------- See point 3.1.1 below for an updated list of supported Xcode/osx constellations!!! -Install latest Xcode (6.1.0 as of the writing). You can download it from +Install latest Xcode (6.1.0 as of the writing). You can download it from -1. The MacOSX AppStore (Xcode). +1. The MacOSX AppStore (Xcode). Xcode 6.1.0 only runs on 10.9.5 and later (at least Mavericks). -Xcode 6.4.0 only runs on 10.10 and later (at least Yosemite). -Xcode 7.x only runs on 10.10 and later (at least Yosemite). The preferred iOS SDK Version is 8.1. ----------------------------------------------------------------------------- 3.1.1 Supported Xcode and OSX constellations ----------------------------------------------------------------------------- -As far as we know the compilation for iOS should work with the following -constellations of Xcode and OSX versions (to be updated once we know more): +As far as we know the compilation for ios should work with the following +constellations of Xcode and osx versions (to be updated once we know more): 1. Xcode 6.0.1 against iOS SDK 8.0 on 10.9.x (Mavericks) 2. Xcode 6.1.0 against iOS SDK 8.1 on 10.10.x (Yosemite) 3. Xcode 6.3.0 against iOS SDK 8.3 on 10.10.x (Yosemite) -4. Xcode 6.4.0 against iOS SDK 8.4 on 10.10.x (Yosemite) -5. Xcode 7.x against iOS SDK 9.x on 10.10.x (Yosemite) ----------------------------------------------------------------------------- 3.2 Install Cross libs and runtime environment ----------------------------------------------------------------------------- - The following commands will build using the latest iOS SDK found on your + The following commands will build using the latest iOS SDK found on your system. - $ cd $HOME/Kodi - $ cd tools/depends - $ ./bootstrap - $ ./configure --host=arm-apple-darwin - $ make - $ make -C target/binary-addons - -NOTE: if you only want to build specific addons you can specify like this: - $ make -C target/binary-addons ADDONS="pvr.hts pvr.dvblink" - -NOTE: You can speedup compilation on multicore systems by doing - "make -j" instead of "make". For a dualcore this would read: - $ make -j2 - -ADVANCED developers only! If you want to specify an iOS SDK version (if -multiple versions are installed) - then append it to the configure line -above (example below would use iOS SDK 8.0): + $ cd $HOME/Kodi + $ cd tools/depends + $ ./bootstrap + $ ./configure --host=arm-apple-darwin + $ make + $ make -C target/binary-addons + + NOTE: if you only want to build specific addons you can specify like this: + $ make -C target/binary-addons ADDONS="pvr.hts pvr.dvblink" + + NOTE: You can speedup compilation on multicore systems by doing + "make -j" instead of "make". For a dualcore this would read: + "make -j2" + + ADVANCED developers only! If you want to specify an iOS SDK version (if + multiple versions are installed) - then append it to the configure line + above (example below would use iOS SDK 8.0): - $ ./configure --host=arm-apple-darwin --with-sdk=8.0 + $ ./configure --host=arm-apple-darwin --with-sdk=8.0 -Ensure that you also adapt the xcode project to use this SDK version or -if building via cmdline the SDKROOT parameter of the xcodebuild command. + Ensure that you also adapt the xcode project to use this SDK version or + if building via cmdline the SDKROOT parameter of the xcodebuild command. ----------------------------------------------------------------------------- 4. How to compile @@ -110,10 +105,10 @@ Both Xcode and Terminal compilation require that build environment be setup from the step 3.2. - $ cd $HOME/Kodi - $ make -C tools/depends/target/xbmc - $ make clean - $ make xcode_depends + $ cd $HOME/Kodi + $ make -C tools/depends/target/xbmc + $ make clean + $ make xcode_depends ----------------------------------------------------------------------------- 4.1 Using Xcode @@ -124,21 +119,21 @@ There are two relevant build configurations : Release and Debug. Compile always for device end not simulator and select the target Kodi-iOS. -If you have selected a specific iOS SDK Version in step 3.2 then you might need -to adapt the active target to use the same iOS SDK version. Else build will fail +If you have selected a specific iOS SDK Version in step 3.2 then you might need +to adapt the active target to use the same iOS SDK version. Else build will fail (you will see alot of errors with at least non-found boost/shared_ptr.hpp). ----------------------------------------------------------------------------- 4.2 Using Terminal (command-line) ----------------------------------------------------------------------------- - $ cd $HOME/Kodi - $ xcodebuild -project Kodi.xcodeproj -target Kodi-iOS -configuration Release build \ - ONLY_ACTIVE_ARCH=YES ARCHS=armv7 VALID_ARCHS=armv7 SDKROOT=iphoneos8.0 - -Make sure to set SDKROOT to the iOS SDK you want to use. This should be the same -you used on point 3.2! If latest SDK should be used (and you didn't specify anything -in step 3.2) - just remove the SDKROOT=iphoneos8.0 from the command line. + $ cd $HOME/Kodi + $ xcodebuild -project Kodi.xcodeproj -target Kodi-iOS -configuration Release build \ + ONLY_ACTIVE_ARCH=YES ARCHS=armv7 VALID_ARCHS=armv7 SDKROOT=iphoneos8.0 + + Make sure to set SDKROOT to the iOS SDK you want to use. This should be the same + you used on point 3.2! If latest SDK should be used (and you didn't specify anything + in step 3.2) - just remove the SDKROOT=iphoneos8.0 from the command line. ----------------------------------------------------------------------------- 5. Packaging @@ -147,32 +142,33 @@ This section describes how to package Kodi in a deb image for distribution. -1. Build Kodi for iOS from XCode so that the application bundle is - correctly updated. - -2. $ cd tools/darwin/packaging/ios - -3. $ chmod +x ./mkdeb-ios.sh && ./mkdeb-ios.sh release + 1. build Kodi for iOS from XCode so that the application bundle is + correctly updated. -4. Use release or debug - you have to be sure that you build the corresponding - version before. + 2. + $ cd tools/darwin/packaging/ios -5. The resulting deb file can be copied to the iOS device via ssh/scp and then be - installed manually. For this you need to SSH into the iOS device and do: - $ dpkg -i + 3. $ chmod +x ./mkdeb-ios.sh && ./mkdeb-ios.sh release + + 4. Use release or debug - you have to be sure that you build the corresponding + version before. + + 5. The resulting deb file can be copied to the iOS device via ssh/scp and then be + installed manually. For this you need to ssh into the iOS device and do: + $ dpkg -i ----------------------------------------------------------------------------- 6. Gesture Handling on iPad/iPhone/iPod touch ----------------------------------------------------------------------------- - - Double finger swipe left -> Back - - Double finger tap/single finger long tap -> Right mouse - - Single finger tap -> Left mouse - - Panning, and flicking -> For navigating in lists - - Dragging -> For scrollbars and sliders - - Zoom gesture -> In the pictureviewer - -Gestures can be adapted in system/keymaps/touchscreen.xml + - double finger swipe left -> back + - double finger tap/single finger long tap -> right mouse + - single finger tap -> left mouse + - panning, and flicking -> for navigating in lists + - dragging -> for scrollbars and sliders + - zoom gesture -> in the pictureviewer + + Gestures can be adapted in system/keymaps/touchscreen.xml ------------------------------------------------------------------------------ 7. Usage/Development on un-jailbroken devices (only interesting for official apple developers!) @@ -180,8 +176,9 @@ If you are a developer with an official apple code signing identity you can deploy Kodi via xcode to work on it on non-jailbroken devices. For this to happen you just need to alter the -Xcode project by setting your codesign identity. Just select the "iPhone Developer" shortcut. -Its also important that you select the signing on all 4 spots +Xcode project by setting your codesign identity. Be sure to not just select the "iPhone Developer" shortcut +but instead select your full identity "iPhone Developer: your name (your id)" (this is important else our sign +script won't detect a real sign identity). Its also important that you select the signing on all 4 spots in the project settings. After that the last buildstep in our support script will do a full sign of all binaries and the bundle with the given identity (all *.viz, *.pvr, *.so files Xcode doesn't know anything about). This should allow you to deploy Kodi to all non-jailbroken devices @@ -189,5 +186,3 @@ files are then located in the sandboxed "Documents" folder and can be easily accessed via iTunes file sharing. Keep in mind that no hardware acceleration will be possible without jailbreaking when using iOS < Version 8. - -From Xcode7 on - this approach is also available for non paying app developers (apple allows self signing from now on) diff -Nru kodi-16.1~git20160425.1001-final/docs/README.linux kodi-15.2~git20151019.1039-final/docs/README.linux --- kodi-16.1~git20160425.1001-final/docs/README.linux 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/docs/README.linux 2015-10-19 08:39:15.000000000 +0000 @@ -44,10 +44,10 @@ external libraries enabled). Build-Depends: autoconf, automake, autopoint, autotools-dev, cmake, curl, - dcadec-dev, default-jre, gawk, gperf, libao-dev, libasound2-dev, + debhelper (>= 7.0.50~), default-jre, gawk, gperf, libao-dev, libasound2-dev, libass-dev (>= 0.9.8), libavahi-client-dev, libavahi-common-dev, libbluetooth-dev, - libbluray-dev (>= 0.7.0), libboost-dev, libboost-thread-dev, libbz2-dev, libcap-dev, libcdio-dev, - libcec-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev | libcurl-dev, libcwiid-dev, + libbluray-dev, libboost-dev, libboost-thread-dev, libbz2-dev, libcap-dev, libcdio-dev, + libcec-dev, libcurl4-gnutls-dev | libcurl4-openssl-dev | libcurl-dev, libcwiid-dev, libdbus-1-dev, libfontconfig-dev, libfreetype6-dev, libfribidi-dev, libgif-dev (>= 4.1.6), libgl1-mesa-dev | libgl-dev, libglew-dev, libglu1-mesa-dev | libglu-dev, libiso9660-dev, libjasper-dev, libjpeg-dev, libltdl-dev, liblzo2-dev, libmicrohttpd-dev, @@ -57,17 +57,12 @@ libtag1-dev (>= 1.8), libtiff-dev, libtinyxml-dev (>= 2.6.2), libtool, libudev-dev, libusb-dev, libva-dev, libvdpau-dev, libvorbis-dev, libxinerama-dev, libxml2-dev, libxmu-dev, libxrandr-dev, libxslt1-dev, libxt-dev, libyajl-dev (>=2.0), lsb-release, - nasm [!amd64], python-dev, python-imaging, python-support, swig, unzip, uuid-dev, yasm, - zip, zlib1g-dev - -[NOTICE] crossguid / libcrossguid-dev all Linux distributions. -Kodi now requires crossguid which is not available in Ubuntu repositories at this time. -We supply a Makefile in tools/depends/target/crossguid -to make it easy to install into /usr/local. - $ make -C tools/depends/target/crossguid PREFIX=/usr/local - + nasm [!amd64], python-dev, python-imaging, python-support, swig, unzip, yasm, zip, + zlib1g-dev + Note: For developers and anyone else who compiles frequently it is recommended to use ccache. - $ sudo apt-get install ccache + + $ sudo apt-get install ccache ----------------------------------------------------------------------------- 3.1. Using the Kodi PPA to get all build dependencies (Debian/Ubuntu only) @@ -80,16 +75,18 @@ http://kodi.wiki/index.php?title=Official_Ubuntu_PPA Update apt: - $ sudo apt-get update + $ sudo apt-get update The command to get the build dependencies, used to compile the version on the PPA. - $ sudo apt-get build-dep kodi + + $ sudo apt-get build-dep kodi ----------------------------------------------------------------------------- 4. How to compile ----------------------------------------------------------------------------- To create the Kodi executable manually perform these steps: + .0 $ ./bootstrap .1 $ ./configure PREFIX=... (See --help for available options) @@ -101,16 +98,19 @@ concurrent jobs will be used. So for dualcore the command is: $ make -j2 - -.3 $ sudo make install + +.3 $ make install This will install Kodi in the prefix provided in 4.1 as well as a launcher script. +Note: You may need to run this with sudo (sudo make install) if your user doesn't have write permissions +to the prefix you have provided (as in the default case, /usr/local). + Tip: To override the location that Kodi is installed, use PREFIX=. For example. $ make install DESTDIR=$HOME/kodi - + ----------------------------------------------------------------------------- 4.4. Binary addons - compile ----------------------------------------------------------------------------- @@ -131,7 +131,7 @@ pvr.argustv, pvr.demo, pvr.dvblink, pvr.dvbviewer, pvr.filmon, pvr.hts, pvr.iptvsimple, pvr.mediaportal.tvserver, pvr.mythtv, pvr.nextpvr, pvr.njoy, pvr.pctv, pvr.stalker, pvr.vbox, pvr.vdr.vnsi, pvr.vuplus -Audio decoders: +Audio decoders: audiodecoder.modplug, audiodecoder.nosefart, audiodecoder.sidplay, audiodecoder.snesapu, audiodecoder.stsound, audiodecoder.timidity, audiodecoder.vgmstream @@ -165,7 +165,7 @@ --gtest_list_tests List the names of all tests instead of running them. The name of TEST(Foo, Bar) is "Foo.Bar". - + --gtest_filter=POSTIVE_PATTERNS[-NEGATIVE_PATTERNS] Run only the tests whose name matches one of the positive patterns but none of the negative patterns. '?' matches any single character; '*' diff -Nru kodi-16.1~git20160425.1001-final/docs/README.osx kodi-15.2~git20151019.1039-final/docs/README.osx --- kodi-16.1~git20160425.1001-final/docs/README.osx 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/docs/README.osx 2015-10-19 08:39:15.000000000 +0000 @@ -2,23 +2,23 @@ 1. Introduction 2. Getting the source code 3. Install required libs - 3.1. Install Xcode - 3.1.1 Supported Xcode and OSX constellations - 3.2. Install Kodi build depends - 3.2.1 Compiling as 32 Bit binary - 3.2.2 Compiling as 64 Bit binary - 3.2.3 Compile binary addons + 3.1. Install Xcode + 3.1.1 Supported Xcode and OSX constellations + 3.2. Install Kodi build depends + 3.2.1 Compiling as 32 Bit binary + 3.2.2 Compiling as 64 Bit binary + 3.2.3 Compile binary addons 4. How to compile and run - 4.1 Using XCode - 4.2 Using Command line + 4.1 Using XCode + 4.2 Using Command line 5. Packaging ----------------------------------------------------------------------------- 1. Introduction ----------------------------------------------------------------------------- -This is a platform port of Kodi for the Apple OSX operating system. 10.9 and 10.10 Intel development -platforms are supported. Xcode 6 or newer are the recommended versions. +This is a platform port of Kodi for the Apple OSX operating system. 10.9 and 10.10 Intel development +platforms are supported. Xcode 6 newer are the recommended versions. There are 3 ways to build Kodi for Mac, from command-line with make, from command-line using xcodebuild or from Xcode. @@ -31,80 +31,79 @@ codecs that support a multitude of music and video formats. On Mavericks (OSX 10.9.x) we recommend using Xcode 6.1. -On Yosemite (OSX 10.10.x) we recommend using Xcode 6.4. +On Yosemite (OSX 10.10.x) we recommend using Xcode 6.1. NOTE TO NEW OS X USERS: All lines that are prefixed with the '$' character are commands that need to be typed into a Terminal window. Note that the '$' character itself should NOT be typed as part of the command. -ATTENTION: You need to download and install XQuartz from https://xquartz.macosforge.org/landing/ since +ATTENTION: You need to download and install XQuartz from https://xquartz.macosforge.org/landing/ since its not part of OSX anymore since 10.8. ----------------------------------------------------------------------------- 2. Getting the source code ----------------------------------------------------------------------------- - $ cd $HOME - $ git clone git://github.com/xbmc/xbmc.git Kodi + $ cd $HOME + $ git clone git://github.com/xbmc/xbmc.git Kodi ----------------------------------------------------------------------------- 3.1 Install XCODE ----------------------------------------------------------------------------- See point 3.1.1 below for an updated list of supported/tested Xcode/osx constellations!!! -Install latest Xcode (6.4.0 ). You can download it from the MacOSX AppStore (Xcode). +Install latest Xcode (6.1.0 ). You can download it from the MacOSX AppStore (Xcode). -Xcode 6.4 runs on 10.10 and later (at least Yosemite). +Xcode 6.1 runs on 10.9.5 and later (at least Mavericks). ----------------------------------------------------------------------------- 3.1.1 Supported Xcode and OSX constellations ----------------------------------------------------------------------------- As far as we know the compilation for mac osx should work with the following constellations of Xcode and osx versions (to be updated once we know more): - + 1. XCode 6.0.1 against OSX SDK 10.9 (M) 2. XCode 6.1.0 against OSX SDK 10.10 (Y) 3. XCode 6.2.0 against OSX SDK 10.10 (Y) 4. XCode 6.3.0 against OSX SDK 10.10 (Y) -5. Xcode 6.4.0 against OSX SDK 10.10 (Y) -6. Xcode 7.x against OSX SDK 10.11 (Y) ----------------------------------------------------------------------------- 3.2 Install Kodi build depends ----------------------------------------------------------------------------- -The following commands will build using the latest OSX SDK found on your system. + The following commands will build using the latest OSX SDK found on your + system. 3.2.1 Compiling as 32 Bit binary - $ cd $HOME/Kodi - $ cd tools/depends - $ ./bootstrap - $ ./configure --host=i386-apple-darwin - $ make + $ cd $HOME/Kodi + $ cd tools/depends + $ ./bootstrap + $ ./configure --host=i386-apple-darwin + $ make 3.2.2 Compiling as 64 Bit binary - $ cd $HOME/Kodi - $ cd tools/depends - $ ./bootstrap - $ ./configure --host=x86_64-apple-darwin - $ make + $ cd $HOME/Kodi + $ cd tools/depends + $ ./bootstrap + $ ./configure --host=x86_64-apple-darwin + $ make 3.2.3 Compile binary addons - $ make -C target/binary-addons + $ make -C target/binary-addons -NOTE: if you only want to build specific addons you can specify like this: - $ make -C target/binary-addons ADDONS="pvr.hts pvr.dvblink" + NOTE: if you only want to build specific addons you can specify like this: + $ make -C target/binary-addons ADDONS="pvr.hts pvr.dvblink" -NOTE: You can speedup compilation on multicore systems by doing - "make -j" instead of "make". For a dualcore this would read: - $ make -j2 + NOTE: You can speedup compilation on multicore systems by doing + "make -j" instead of "make". For a dualcore this would read: + "make -j2" -ADVANCED developers only! If you want to specify an OSX SDK version (if -multiple versions are installed) - then append it to the configure line -above (example below would use OSX SDK 10.9 and build for 64bit): + ADVANCED developers only! If you want to specify an OSX SDK version (if + multiple versions are installed) - then append it to the configure line + above (example below would use OSX SDK 10.9 and build for 64bit): - $ ./configure --host=x86_64-apple-darwin --with-sdk=10.9 + $ ./configure --host=x86_64-apple-darwin --with-sdk=10.9 -Ensure that you also adapt the xcode project to use this SDK version. + Ensure that you also adapt the xcode project to use this SDK version. ----------------------------------------------------------------------------- 4. How to compile @@ -115,16 +114,16 @@ 4.a Compilation by using command-line building via xcodebuild or by compiling via Xcode GUI - $ cd $HOME/Kodi - $ make -C tools/depends/target/xbmc - $ make clean - $ make xcode_depends + $ cd $HOME/Kodi + $ make -C tools/depends/target/xbmc + $ make clean + $ make xcode_depends 4.b Compilation by using command-line building via make (experimental) - $ cd $HOME/Kodi - $ make -C tools/depends/target/xbmc - $ make clean + $ cd $HOME/Kodi + $ make -C tools/depends/target/xbmc + $ make clean The configure operation will setup the build environment for codecs and internal libraries that are used by Kodi. This step is required for both Xcode @@ -142,24 +141,24 @@ Xcode 6 and later Menu -> Product -> Edit Sheme -> "Run Kodi"/"Debug" -> Add KODI_HOME into the List of "Environment Variables". Set the value to the path to the Kodi - root folder. For example, "/Users/bigdog/Documents/Kodi" + root folder. For example, "/Users/bigdog/Documents/Kodi" -There are two build targets "Kodi" and "Kodi.app" (each in 32Bit and 64Bit flavour) -with debug and release settings. The "Kodi" target is used for rapid build and -debug cycles while the "Kodi.app" target is used to build a self contained +There are two build targets "Kodi" and "Kodi.app" (each in 32Bit and 64Bit flavour) +with debug and release settings. The "Kodi" target is used for rapid build and +debug cycles while the "Kodi.app" target is used to build a self contained OSX application bundle. -Set the build target to "Kodi" or "Kodi.app" and be sure to select the same -architecture as selected in step 3.2 (either i386 for 32Bit or x86_64 for 64Bit), -then build. - -If you have selected a specific OSX SDK Version in step 3.2 then you might need -to adapt the active target to use the same OSX SDK version. Else build will fail -(you will see a lot of errors with at least non-found boost/shared_ptr.hpp). - -The build process will take a long time when building the first time. -You can see the progress in "Build Results". There are a large number of static -and dynamic libraries that will need to be built. Once these are built, +Set the build target to "Kodi" or "Kodi.app" and be sure to select the same +architecture as selected in step 3.2 (either i386 for 32Bit or x86_64 for 64Bit), +then build. + +If you have selected a specific OSX SDK Version in step 3.2 then you might need +to adapt the active target to use the same OSX SDK version. Else build will fail +(you will see alot of errors with at least non-found boost/shared_ptr.hpp). + +The build process will take a long time when building the first time. +You can see the progress in "Build Results". There are a large number of static +and dynamic libaries that will need to be built. Once these are built, subsequent builds will be faster. After the build, you can ether run Kodi for Mac from Xcode or run it from @@ -167,19 +166,19 @@ the KODI_HOME environment variable (export KODI_HOME=$HOME/Kodi). Then, to run the debug version: - $ ./build/Debug/Kodi +$ ./build/Debug/Kodi Or the release version: - $ ./build/Release/Kodi +$ ./build/Release/Kodi You can also build via Xcode from the command-line using the following: - $ xcodebuild -configuration Release ONLY_ACTIVE_ARCH=YES ARCHS=i386 VALID_ARCHS=i386 \ - -target "Kodi.app" -project Kodi.xcodeproj +$ xcodebuild -configuration Release ONLY_ACTIVE_ARCH=YES ARCHS=i386 VALID_ARCHS=i386 \ + -target "Kodi.app" -project Kodi.xcodeproj You can specify "Release" instead of "Debug" as a configuration. Be sure to set *_ARCHS -variables to the same architecture as selected in step 3.2 (either i386 for 32Bit or x86_64 +variables to the same architecture as selected in step 3.2 (either i386 for 32Bit or x86_64 for 64Bit). ----------------------------------------------------------------------------- @@ -192,17 +191,17 @@ below(normally unneeded - for advanced developers). a) - $ cd $HOME/Kodi - $ export KODI_HOME=`pwd` - $ make xcode_depends - $ xcodebuild -sdk macosx10.9 -project Kodi.xcodeproj -target Kodi.app ONLY_ACTIVE_ARCH=YES \ - ARCHS=x86_64 VALID_ARCHS=x86_64 -configuration Release build - - b) Building via make: - $ cd $HOME/Kodi - $ export KODI_HOME=`pwd` - $ make - $ ./Kodi.bin + $ cd $HOME/Kodi + $ export KODI_HOME=`pwd` + $ make xcode_depends + $ xcodebuild -sdk macosx10.9 -project Kodi.xcodeproj -target Kodi.app ONLY_ACTIVE_ARCH=YES \ + ARCHS=x86_64 VALID_ARCHS=x86_64 -configuration Release build + + b) building via make + $ cd $HOME/Kodi + $ export KODI_HOME=`pwd` + $ make + $ ./Kodi.bin ----------------------------------------------------------------------------- 5. Packaging @@ -210,13 +209,13 @@ This section describes how to package Kodi in a disk image for distribution. -1. Build Kodi.app from XCode so that the application bundle is correctly updated. + 1. build Kodi.app from XCode so that the application bundle is correctly updated. -2. $ cd tools/darwin/packaging/osx + 2. $ cd tools/darwin/packaging/osx -3. $ chmod +x ./mkdeb-osx.sh && ./mkdmg-osx.sh release + 3. $ chmod +x ./mkdeb-osx.sh && ./mkdmg-osx.sh release -4. Use release or debug - you have to be sure that you build the corresponding - version before. + 4. Use release or debug - you have to be sure that you build the corresponding + version before. -6. Find the corresponding dmg in the packaging dir. + 6. Find the corresponding dmg in the packaging dir. diff -Nru kodi-16.1~git20160425.1001-final/docs/README.raspberrypi kodi-15.2~git20151019.1039-final/docs/README.raspberrypi --- kodi-16.1~git20160425.1001-final/docs/README.raspberrypi 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/docs/README.raspberrypi 2015-10-19 08:39:15.000000000 +0000 @@ -8,7 +8,7 @@ ----------------------------------------------------------------------------- You can build Kodi for the Raspberry Pi in different ways. This document -shows two different methods. The first assumes that you want to run Kodi +shows two differnt methods. The first assumes that you want to run Kodi on top of an image like Raspbian, the second shows how to create an entire image which includes Linux. @@ -19,22 +19,22 @@ The following steps were tested with Ubuntu 14.04 x64. (Note that building on a 32 bit machine requires slightly different setting) - $ sudo apt-get install git autoconf curl g++ zlib1g-dev libcurl4-openssl-dev gawk gperf libtool autopoint swig default-jre + sudo apt-get install git autoconf curl g++ zlib1g-dev libcurl4-openssl-dev gawk gperf libtool autopoint swig default-jre - $ git clone https://github.com/raspberrypi/tools - $ sudo cp -r tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64 /opt + git clone https://github.com/raspberrypi/tools + sudo cp -r tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64 /opt - $ git clone https://github.com/raspberrypi/firmware - $ sudo mkdir -p /opt/bcm-rootfs/opt - $ sudo cp -r firmware/opt/vc /opt/bcm-rootfs/opt + git clone https://github.com/raspberrypi/firmware + sudo mkdir -p /opt/bcm-rootfs/opt + sudo cp -r firmware/opt/vc /opt/bcm-rootfs/opt - $ sudo mkdir -p /opt/xbmc-bcm - $ sudo chmod 777 /opt/xbmc-bcm + sudo mkdir -p /opt/xbmc-bcm + sudo chmod 777 /opt/xbmc-bcm - $ git clone https://github.com/xbmc/xbmc + git clone https://github.com/xbmc/xbmc - $ cd xbmc/tools/depends - $ ./bootstrap + cd xbmc/tools/depends + ./bootstrap PATH="$PATH:/opt/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin" \ ./configure --host=arm-linux-gnueabihf \ --prefix=/opt/xbmc-bcm/xbmc-dbg \ @@ -43,19 +43,21 @@ --with-platform=raspberry-pi \ --build=i686-linux - $ make - $ cd ../.. + make + cd ../.. CONFIG_EXTRA="--with-platform=raspberry-pi \ --enable-libcec --enable-player=omxplayer \ --disable-x11 --disable-xrandr --disable-openmax \ --disable-optical-drive --disable-dvdcss --disable-joystick \ --disable-crystalhd --disable-vtbdecoder --disable-vaapi \ - --disable-vdpau --enable-alsa" \ - $ make -C tools/depends/target/xbmc + --disable-vdpau --disable-projectm --disable-rsxs --disable-fishbmc \ + --enable-alsa --disable-solarwinds --disable-euphoria \ + --disable-plasma" \ + make -C tools/depends/target/xbmc - $ make - $ sudo make install + make + make install ----------------------------------------------------------------------------- 3. Building Kodi using buildroot environment @@ -67,18 +69,18 @@ For example : - $ mkdir /opt/kodi-raspberrypi - $ cd /opt/kodi-raspberrypi +mkdir /opt/kodi-raspberrypi +cd /opt/kodi-raspberrypi Checkout kodi : - $ git clone https://github.com/xbmc/xbmc.git kodi +git clone https://github.com/xbmc/xbmc.git kodi Checkout buildroot : - $ git clone https://github.com/huceke/buildroot-rbp.git +git clone https://github.com/huceke/buildroot-rbp.git - $ cd /opt/kodi-raspberrypi/buildroot-rbp +cd /opt/kodi-raspberrypi/buildroot-rbp Follow the instructions in README.rbp how to build the system and Kodi. diff -Nru kodi-16.1~git20160425.1001-final/docs/README.ubuntu kodi-15.2~git20151019.1039-final/docs/README.ubuntu --- kodi-16.1~git20160425.1001-final/docs/README.ubuntu 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/docs/README.ubuntu 2015-10-19 08:39:15.000000000 +0000 @@ -55,7 +55,7 @@ For >= 14.04 lts: $ sudo apt-get install software-properties-common - $ sudo add-apt-repository -s ppa:team-xbmc/xbmc-nightly + $ sudo add-apt-repository -s ppa:team-xbmc/xbmc-nightly Add build-depends PPA: $ sudo add-apt-repository ppa:team-xbmc/xbmc-ppa-build-depends @@ -81,29 +81,18 @@ ----------------------------------------------------------------------------- For Ubuntu (all versions >= 7.04): - $ sudo apt-get install automake bison build-essential cmake curl cvs dcadec-dev \ - default-jre fp-compiler gawk gdc gettext git-core gperf libasound2-dev libass-dev \ - libboost-dev libboost-thread-dev libbz2-dev libcap-dev libcdio-dev libcurl3 \ - libcurl4-openssl-dev libdbus-1-dev libfontconfig-dev libfreetype6-dev libfribidi-dev \ - libgif-dev libglew-dev libiso9660-dev libjasper-dev libjpeg-dev liblzo2-dev libmicrohttpd-dev \ - libmodplug-dev libmpeg2-4-dev libmpeg3-dev libmysqlclient-dev libnfs-dev libogg-dev libpcre3-dev \ - libplist-dev libpng-dev libpulse-dev libsdl2-dev libsmbclient-dev libsqlite3-dev libssh-dev \ - libssl-dev libtiff-dev libtinyxml-dev libtool libudev-dev libusb-dev libva-dev libvdpau-dev \ - libvorbis-dev libvorbisenc2 libxml2-dev libxmu-dev libxrandr-dev libxrender-dev libxslt1-dev \ - libxt-dev libyajl-dev mesa-utils nasm pmount python-dev python-imaging python-sqlite swig \ - unzip uuid-dev yasm zip zlib1g-dev + + $ sudo apt-get install automake bison build-essential cmake curl cvs default-jre fp-compiler gawk gdc gettext git-core gperf libasound2-dev libass-dev libboost-dev libboost-thread-dev libbz2-dev libcap-dev libcdio-dev libcurl3 libcurl4-gnutls-dev libdbus-1-dev libfontconfig-dev libfreetype6-dev libfribidi-dev libgif-dev libglew-dev libiso9660-dev libjasper-dev libjpeg-dev liblzo2-dev libmicrohttpd-dev libmodplug-dev libmpeg2-4-dev libmpeg3-dev libmysqlclient-dev libnfs-dev libogg-dev libpcre3-dev libplist-dev libpng-dev libpulse-dev libsdl2-dev libsmbclient-dev libsqlite3-dev libssh-dev libssl-dev libtiff-dev libtinyxml-dev libtool libudev-dev libusb-dev libva-dev libvdpau-dev libvorbis-dev libvorbisenc2 libxml2-dev libxmu-dev libxrandr-dev libxrender-dev libxslt1-dev libxt-dev libyajl-dev mesa-utils nasm pmount python-dev python-imaging python-sqlite swig unzip yasm zip zlib1g-dev For >= 10.10: $ sudo apt-get install autopoint libltdl-dev For >= 12.04 lts: Backport for Precise of libyajl2 - $ sudo-add-apt-repository ppa:team-xbmc/xbmc-nightly - $ sudo apt-get install libyajl-dev - -Note: Ubuntu Precise users also need a upgraded GCC, else compile will fail. - + & sudo-add-apt-repository ppa:team-xbmc/xbmc-nightly + & sudo apt-get install libyajl-dev + For >= 12.10: - $ sudo apt-get install libtag1-dev + $ sudo apt-get install libtag1-dev On 8.10 and older versions, libcurl is outdated and thus Kodi will not compile properly. In this case you will have to manually compile the latest version. @@ -116,24 +105,14 @@ For <= 12.04 Kodi needs a new version of taglib other than what is available at this time. -Use prepackaged from the Kodi build-depends PPA. -0. $ sudo apt-get install libtag1-dev - -We also supply a Makefile in lib/taglib to make it easy to install into /usr/local. -1. $ sudo apt-get remove libtag1-dev +We supply a Makefile in lib/taglib to make it easy to install into /usr/local. + $ sudo apt-get remove libtag1-dev $ make -C lib/taglib $ sudo make -C lib/taglib install -[NOTICE] crossguid / libcrossguid-dev all Linux destributions. -Kodi now requires crossguid which is not available in Ubuntu repositories at this time. -If build-deps PPA doesn't provide a pre-packaged version for your distribution, see (1.) below. - -Use prepackaged from the Kodi build-depends PPA. -0. $ sudo apt-get install libcrossguid-dev - -We also supply a Makefile in tools/depends/target/crossguid -to make it easy to install into /usr/local. -1. $ make -C tools/depends/target/crossguid PREFIX=/usr/local +or use prepackaged from the Kodi PPA. + + $ sudo apt-get install libtag1-dev Unless you are proficient with how Linux libraries and versions work, do not try to provide it yourself, as you will likely mess up for other programs. diff -Nru kodi-16.1~git20160425.1001-final/.gitignore kodi-15.2~git20151019.1039-final/.gitignore --- kodi-16.1~git20160425.1001-final/.gitignore 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/.gitignore 2015-10-19 08:39:14.000000000 +0000 @@ -13,8 +13,6 @@ *.kdev4 # gedit *~ -# CLion -/.idea # generated files etc config.cache @@ -90,8 +88,8 @@ /build-aux/ltmain.sh /autotools /BUILD -/kodi.log -/kodi.old.log +/xbmc.log +/xbmc.old.log /Makefile.depend /config.status /configure @@ -103,19 +101,31 @@ /*.patch # /addons/ +/addons/com.nullsoft.milkdrop.xbmc/*.vis +/addons/org.xbmc.addons.dxspectrum/*.vis /addons/packages +/addons/screensaver.rsxs.euphoria/Euphoria.xbs +/addons/screensaver.rsxs.plasma/Plasma.xbs +/addons/screensaver.rsxs.solarwinds/Solarwinds.xbs /addons/skin.confluence/media/Makefile /addons/skin.confluence/media/Textures.xbt /addons/skin.pm3-hd/media/Textures.xbt +/addons/visualization.dxspectrum/Spectrum_win32dx.vis +/addons/visualization.glspectrum/opengl_spectrum.vis +/addons/visualization.milkdrop/MilkDrop_win32dx.vis +/addons/visualization.projectm/projectM.vis +/addons/visualization.projectm/resources/presets.zip +/addons/visualization.vortex/Vortex_win32dx.vis +/addons/visualization.waveform/Waveform.vis +/addons/visualization.waveform/Waveform_win32.vis /addons/visualization.itunes/iTunes.mvis +/addons/visualization.fishbmc/fishbmc.vis /addons/script.module.pil/ /addons/audioencoder.* /addons/pvr.* -/addons/adsp.* /addons/xbmc.addon/addon.xml /addons/xbmc.json/addon.xml /addons/kodi.guilib/addon.xml -/addons/audiodecoder.* # /lib/ /lib/Makefile @@ -136,20 +146,14 @@ /lib/addons/library.kodi.guilib/project/VS2010Express/Release /lib/addons/library.kodi.guilib/project/VS2010Express/Debug /lib/addons/library.xbmc.addon/Makefile -/lib/addons/library.kodi.adsp/Makefile /lib/addons/library.xbmc.pvr/Makefile /lib/addons/library.xbmc.codec/Makefile /lib/addons/library.xbmc.addon/project/VS2010Express/Release /lib/addons/library.xbmc.addon/project/VS2010Express/Debug -/lib/addons/library.kodi.adsp/project/VS2010Express/Release -/lib/addons/library.kodi.adsp/project/VS2010Express/Debug /lib/addons/library.xbmc.codec/project/VS2010Express/Release /lib/addons/library.xbmc.codec/project/VS2010Express/Debug /lib/addons/library.xbmc.pvr/project/VS2010Express/Release /lib/addons/library.xbmc.pvr/project/VS2010Express/Debug -/lib/addons/library.kodi.audioengine/Makefile -/lib/addons/library.kodi.audioengine/project/VS2010Express/Release/ -/lib/addons/library.kodi.audioengine/project/VS2010Express/Debug/ # /lib/cpluff/ /lib/cpluff/ABOUT-NLS @@ -298,7 +302,6 @@ /project/cmake/addons/*.error /project/cmake/addons/.failure /project/cmake/addons/.success -/project/cmake/addons/addons /project/cmake/addons/build /project/cmake/addons/depends/build /project/cmake/addons/output @@ -339,11 +342,9 @@ /project/VS2010Express/libs /project/VS2010Express/objs /project/VS2010Express/ipch -/project/VS2010Express/shaders /project/VS2010Express/*.vsp /project/VS2010Express/*.metaproj /project/VS2010Express/*.metaproj.tmp -/project/VS2010Express/.vs # /skin/ /skin/Confluence/media/Textures.xbt @@ -360,6 +361,7 @@ /system/libgif.dll /system/libssh2.dll /system/libssl32.dll +/system/hdhomerun.dll /system/ssh.dll /system/sqlite3.dll /system/libnfs.dll @@ -367,7 +369,6 @@ /system/libcec.dll /system/pthreadVC2.dll /system/libxslt.dll -/system/ssleay32.dll # /system/cdrip /system/cdrip/lame_enc.dll @@ -404,20 +405,24 @@ # /system /system/zlib1.dll + +# /screensavers/ +/screensavers/Solarwinds.xbs +/screensavers/Euphoria.xbs +/screensavers/Plasma.xbs + # /skin/Confluence/ /skin/Confluence/BUILD #/tools/android -/tools/android/packaging/Makefile -/tools/android/packaging/xbmc/activity_main.xml /tools/android/packaging/xbmc/AndroidManifest.xml +/tools/android/packaging/Makefile /tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java /tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java /tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCBroadcastReceiver.java /tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java /tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnFrameAvailableListener.java /tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCSettingsContentObserver.java -/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java /tools/android/packaging/xbmc/strings.xml #/tools/depends @@ -429,8 +434,6 @@ /tools/depends/target/ffmpeg/ffmpeg-*-*.tar.gz /tools/depends/target/ffmpeg/ffmpeg-*-*/ /tools/depends/target/ffmpeg/ffmpeg-install/ -/tools/depends/target/Toolchain_binaddons.cmake -/tools/depends/target/config-binaddons.site # /tools/EventClients/ /tools/EventClients/*.pyc @@ -483,6 +486,7 @@ # /xbmc/addons/ /xbmc/addons/Makefile +/xbmc/addons/visualization.waveform # /xbmc/android /xbmc/android/Makefile @@ -538,7 +542,6 @@ # /xbmc/interfaces/ /xbmc/interfaces/Makefile -/xbmc/interfaces/builtins/Makefile /xbmc/interfaces/json-rpc/ServiceDescription.h /xbmc/interfaces/python/Makefile /xbmc/interfaces/python/generated/ @@ -551,9 +554,8 @@ # /xbmc/main/ /xbmc/main/Makefile -# /xbmc/messaging/ -/xbmc/messaging/Makefile -/xbmc/messaging/helpers/Makefile +# /xbmc/music/ +/xbmc/music/karaoke/Makefile # /xbmc/network/ /xbmc/network/Makefile @@ -570,12 +572,105 @@ /xbmc/peripherals/bus/Makefile /xbmc/peripherals/devices/Makefile -# /xbmc/main/posix/ -xbmc/main/posix/Makefile +#/xbmc/screensavers/ +/xbmc/screensavers/Makefile +/xbmc/screensavers/rsxs-0.9/Makefile +/xbmc/screensavers/rsxs-0.9/configure +/xbmc/screensavers/rsxs-0.9/config.h +/xbmc/screensavers/rsxs-0.9/config.log +/xbmc/screensavers/rsxs-0.9/config/Makefile +/xbmc/screensavers/rsxs-0.9/lib/Makefile +/xbmc/screensavers/rsxs-0.9/libltdl/Makefile +/xbmc/screensavers/rsxs-0.9/src/Makefile +/xbmc/screensavers/rsxs-0.9/src/cyclone/Makefile +/xbmc/screensavers/rsxs-0.9/src/euphoria/Makefile +/xbmc/screensavers/rsxs-0.9/src/fieldlines/Makefile +/xbmc/screensavers/rsxs-0.9/src/flocks/Makefile +/xbmc/screensavers/rsxs-0.9/src/flux/Makefile +/xbmc/screensavers/rsxs-0.9/src/helios/Makefile +/xbmc/screensavers/rsxs-0.9/src/hyperspace/Makefile +/xbmc/screensavers/rsxs-0.9/src/lattice/Makefile +/xbmc/screensavers/rsxs-0.9/src/plasma/Makefile +/xbmc/screensavers/rsxs-0.9/src/skyrocket/Makefile +/xbmc/screensavers/rsxs-0.9/src/solarwinds/Makefile +/xbmc/screensavers/rsxs-0.9/xbmc/Makefile +/xbmc/screensavers/rsxs-0.9/autom4te.cache/ +/xbmc/screensavers/rsxs-0.9/lib/alloca.h +/xbmc/screensavers/rsxs-0.9/lib/argz.h +/xbmc/screensavers/rsxs-0.9/lib/getopt.h +/xbmc/screensavers/rsxs-0.9/rsxs.spec +/xbmc/screensavers/rsxs-0.9/src/.dirstamp +/xbmc/screensavers/rsxs-0.9/src/euphoria/rs-euphoria +/xbmc/screensavers/rsxs-0.9/src/plasma/rs-plasma +/xbmc/screensavers/rsxs-0.9/src/solarwinds/rs-solarwinds +/xbmc/screensavers/rsxs-0.9/stamp-h1 +/xbmc/screensavers/rsxs-0.9/aclocal.m4 +/xbmc/screensavers/rsxs-0.9/compile +/xbmc/screensavers/rsxs-0.9/config.guess +/xbmc/screensavers/rsxs-0.9/config.h.in +/xbmc/screensavers/rsxs-0.9/config.h.in~ +/xbmc/screensavers/rsxs-0.9/config.sub +/xbmc/screensavers/rsxs-0.9/config/Makefile.in +/xbmc/screensavers/rsxs-0.9/depcomp +/xbmc/screensavers/rsxs-0.9/INSTALL +/xbmc/screensavers/rsxs-0.9/install-sh +/xbmc/screensavers/rsxs-0.9/lib/Makefile.in +/xbmc/screensavers/rsxs-0.9/libltdl/Makefile.in +/xbmc/screensavers/rsxs-0.9/Makefile.in +/xbmc/screensavers/rsxs-0.9/missing +/xbmc/screensavers/rsxs-0.9/src/cyclone/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/euphoria/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/fieldlines/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/flocks/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/flux/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/helios/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/hyperspace/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/lattice/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/plasma/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/skyrocket/Makefile.in +/xbmc/screensavers/rsxs-0.9/src/solarwinds/Makefile.in #/xbmc/utils /xbmc/utils/Makefile +#/xbmc/visualizations/ +/xbmc/visualizations/DirectXSpectrum/Debug (DirectX) +/xbmc/visualizations/DirectXSpectrum/Release (DirectX) +/xbmc/visualizations/EGLHelpers/Makefile +/xbmc/visualizations/fishBMC/Makefile +/xbmc/visualizations/Goom/Makefile +/xbmc/visualizations/Goom/goom2k4-0/aclocal.m4 +/xbmc/visualizations/Goom/goom2k4-0/compile +/xbmc/visualizations/Goom/goom2k4-0/configure +/xbmc/visualizations/Goom/goom2k4-0/INSTALL +/xbmc/visualizations/Goom/goom2k4-0/mkinstalldirs +/xbmc/visualizations/Goom/goom2k4-0/Makefile.in +/xbmc/visualizations/Goom/goom2k4-0/config.guess +/xbmc/visualizations/Goom/goom2k4-0/config.sub +/xbmc/visualizations/Goom/goom2k4-0/depcomp +/xbmc/visualizations/Goom/goom2k4-0/install-sh +/xbmc/visualizations/Goom/goom2k4-0/ltmain.sh +/xbmc/visualizations/Goom/goom2k4-0/missing +/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.in +/xbmc/visualizations/Goom/goom2k4-0/src/Makefile.in +/xbmc/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.in +/xbmc/visualizations/Goom/goom2k4-0/ylwrap +/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/confdefs.h +/xbmc/visualizations/Milkdrop/Debug +/xbmc/visualizations/Milkdrop/Release +/xbmc/visualizations/OpenGLSpectrum/Makefile +/xbmc/visualizations/Vortex/Vortex/Vortex.vcxproj.metaproj +/xbmc/visualizations/WaveForm/Makefile +/xbmc/visualizations/WaveForm/Debug (DirectX) +/xbmc/visualizations/WaveForm/Release (DirectX) +/xbmc/visualizations/XBMCProjectM/Makefile +/xbmc/visualizations/XBMCProjectM/libprojectM/Makefile +/xbmc/visualizations/XBMCProjectM/libprojectM/CMakeCache.txt +/xbmc/visualizations/XBMCProjectM/libprojectM/CMakeFiles/ +/xbmc/visualizations/XBMCProjectM/libprojectM/cmake_install.cmake +/xbmc/visualizations/XBMCProjectM/libprojectM/config.inp + #/xbmc/win32/ /xbmc/win32/XBMC_PC.rc # no longer used @@ -654,7 +749,6 @@ /lib/libdvd/libdvdcss/stamp-doxygen /lib/libdvd/libdvdcss/test/Makefile /lib/libdvd/libdvdcss/doc/doxygen.cfg -/lib/libdvd/libdvdcss/doc/doxygen_sqlite3.db /lib/libdvd/libdvdcss/doc/Makefile /lib/libdvd/libdvdcss/doc/Makefile.in /lib/libdvd/libdvdcss/doc/html/ @@ -811,6 +905,8 @@ /lib/libexif/Release (DLL) /lib/libexif/libexif.lib +/lib/libhdhomerun/Makefile + /lib/libsquish/Makefile /lib/libsquish/lib/squishd.lib /lib/libsquish/lib/squish.lib @@ -824,22 +920,11 @@ /addons/library.xbmc.addon/libXBMC_addon.dll /addons/library.xbmc.addon/libXBMC_addon.lib -/addons/library.kodi.adsp/libKODI_adsp.dll -/addons/library.kodi.adsp/libKODI_adsp.lib /addons/library.xbmc.codec/libXBMC_codec.dll /addons/library.xbmc.codec/libXBMC_codec.lib /addons/library.kodi.guilib/libKODI_guilib.dll /addons/library.kodi.guilib/libKODI_guilib.lib /addons/library.xbmc.pvr/libXBMC_pvr.dll /addons/library.xbmc.pvr/libXBMC_pvr.lib -/addons/library.kodi.audioengine/libKODI_audioengine.dll -/addons/library.kodi.audioengine/libKODI_audioengine.lib /pvr-addons -/adsp-addons - -# files removed in Jarvis -/addons/visualization.dxspectrum/* -/addons/visualization.milkdrop/* -/addons/visualization.vortex/* -/addons/visualization.waveform/* diff -Nru kodi-16.1~git20160425.1001-final/gitrev kodi-15.2~git20151019.1039-final/gitrev --- kodi-16.1~git20160425.1001-final/gitrev 2016-04-25 08:01:49.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/gitrev 2015-10-19 08:39:25.000000000 +0000 @@ -1 +1 @@ -c327c53 +02e7013 diff -Nru kodi-16.1~git20160425.1001-final/Kodi.xcodeproj/project.pbxproj kodi-15.2~git20151019.1039-final/Kodi.xcodeproj/project.pbxproj --- kodi-16.1~git20160425.1001-final/Kodi.xcodeproj/project.pbxproj 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/Kodi.xcodeproj/project.pbxproj 2015-10-19 08:39:14.000000000 +0000 @@ -6,11 +6,33 @@ objectVersion = 46; objects = { +/* Begin PBXNativeTarget section */ + 6E2FACBA0E26DF7A00DF79EA /* Kodi.app */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6E2FACC10E26DFA300DF79EA /* Build configuration list for PBXNativeTarget "Kodi.app" */; + buildPhases = ( + F5DEC3580E6DEBB2005A4E24 /* copy root files */, + 6E2FACC70E26E22400DF79EA /* copy frameworks */, + 81B8FC150E7D927A00354E2E /* update version info */, + 1D64E5FC157BD76F001ACEBE /* genoutputdirlink */, + ); + dependencies = ( + 6E2FACC40E26E08100DF79EA /* PBXTargetDependency */, + ); + name = Kodi.app; + productName = Kodi.app; + productReference = D6299ABB1AFC2A9F00E3059D /* Kodi.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXAggregateTarget section */ + /* Begin PBXBuildFile section */ 0E3036EC1760F68A00D93596 /* FavouritesDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0E3036EA1760F68A00D93596 /* FavouritesDirectory.cpp */; }; 0E3036ED1760F68A00D93596 /* FavouritesDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0E3036EA1760F68A00D93596 /* FavouritesDirectory.cpp */; }; + 0E3036EE1760F68A00D93596 /* FavouritesDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0E3036EA1760F68A00D93596 /* FavouritesDirectory.cpp */; }; 180F6C8117CE9A5700127892 /* smc.c in Sources */ = {isa = PBXBuildFile; fileRef = 180F6C8017CE9A5700127892 /* smc.c */; }; 183FDF8A11AF0B0500B81E9C /* PluginSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 183FDF8811AF0B0500B81E9C /* PluginSource.cpp */; }; + 18404DA61396C31B00863BBA /* SlingboxLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 18404DA51396C31B00863BBA /* SlingboxLib.a */; }; 1840B74D13993D8A007C848B /* JSONVariantParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1840B74B13993D8A007C848B /* JSONVariantParser.cpp */; }; 1840B75313993DA0007C848B /* JSONVariantWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1840B75113993DA0007C848B /* JSONVariantWriter.cpp */; }; 184C472F1296BC6E0006DB3E /* Service.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 184C472D1296BC6E0006DB3E /* Service.cpp */; }; @@ -28,6 +50,7 @@ 18B7C38B12942090009E7A26 /* GUIViewStateAddonBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C38812942090009E7A26 /* GUIViewStateAddonBrowser.cpp */; }; 18B7C392129420E5009E7A26 /* Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C38E129420E5009E7A26 /* Settings.cpp */; }; 18B7C3A812942132009E7A26 /* AdvancedSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C3A612942132009E7A26 /* AdvancedSettings.cpp */; }; + 18B7C7A91294222E009E7A26 /* AnimatedGif.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7541294222E009E7A26 /* AnimatedGif.cpp */; }; 18B7C7AB1294222E009E7A26 /* D3DResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7561294222E009E7A26 /* D3DResource.cpp */; }; 18B7C7AC1294222E009E7A26 /* DDSImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7571294222E009E7A26 /* DDSImage.cpp */; }; 18B7C7AD1294222E009E7A26 /* DirectXGraphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7581294222E009E7A26 /* DirectXGraphics.cpp */; }; @@ -139,11 +162,9 @@ 1D638128161E211E003603ED /* PeripheralImon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1D638126161E211E003603ED /* PeripheralImon.cpp */; }; 1DAFDB7C16DFDCA7007F8C68 /* PeripheralBusCEC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1DAFDB7A16DFDCA7007F8C68 /* PeripheralBusCEC.cpp */; }; 1DE0443515828F4B005DDB4D /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1DE0443315828F4B005DDB4D /* Exception.cpp */; }; - 2A1A5A6C1BDEAA6D0084702D /* NOTE in Resources */ = {isa = PBXBuildFile; fileRef = 2A1A5A5D1BDEAA6D0084702D /* NOTE */; }; - 2A7B2BDC1BD6F16600044BCD /* PVRSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A7B2BDB1BD6F16600044BCD /* PVRSettings.cpp */; }; - 2A7B2BDD1BD6F16600044BCD /* PVRSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A7B2BDB1BD6F16600044BCD /* PVRSettings.cpp */; }; 2F4564D51970129A00396109 /* GUIFontCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2F4564D31970129A00396109 /* GUIFontCache.cpp */; }; 2F4564D61970129A00396109 /* GUIFontCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2F4564D31970129A00396109 /* GUIFontCache.cpp */; }; + 2F4564D71970129A00396109 /* GUIFontCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2F4564D31970129A00396109 /* GUIFontCache.cpp */; }; 32C631281423A90F00F18420 /* JpegIO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32C631261423A90F00F18420 /* JpegIO.cpp */; }; 36A9443D15821E2800727135 /* DatabaseUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A9443B15821E2800727135 /* DatabaseUtils.cpp */; }; 36A9444115821E7C00727135 /* SortUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A9443F15821E7C00727135 /* SortUtils.cpp */; }; @@ -155,83 +176,108 @@ 3802709A13D5A653009493DD /* SystemClock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3802709813D5A653009493DD /* SystemClock.cpp */; }; 384718D81325BA04000486D6 /* XBDateTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 384718D61325BA04000486D6 /* XBDateTime.cpp */; }; 38F4E57013CCCB3B00664821 /* Implementation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38F4E56C13CCCB3B00664821 /* Implementation.cpp */; }; - 391416BF1B4A3EFA00BBF0AA /* guiinfo in Resources */ = {isa = PBXBuildFile; fileRef = 391416BE1B4A3EFA00BBF0AA /* guiinfo */; }; 395897151AAD94F00033D27C /* KeyboardLayoutManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395897131AAD94F00033D27C /* KeyboardLayoutManager.cpp */; }; 395897161AAD94F00033D27C /* KeyboardLayoutManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395897131AAD94F00033D27C /* KeyboardLayoutManager.cpp */; }; - 395938771AC310B00053A590 /* MessagePrinter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395938751AC310B00053A590 /* MessagePrinter.cpp */; }; - 395938781AC310B00053A590 /* MessagePrinter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395938751AC310B00053A590 /* MessagePrinter.cpp */; }; + 395897171AAD94F00033D27C /* KeyboardLayoutManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395897131AAD94F00033D27C /* KeyboardLayoutManager.cpp */; }; 395C29BC1A94733100EBC7AD /* Key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29BA1A94733100EBC7AD /* Key.cpp */; }; 395C29BD1A94733100EBC7AD /* Key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29BA1A94733100EBC7AD /* Key.cpp */; }; + 395C29BE1A94733100EBC7AD /* Key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29BA1A94733100EBC7AD /* Key.cpp */; }; 395C29C11A98A0A000EBC7AD /* Webinterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29BF1A98A0A000EBC7AD /* Webinterface.cpp */; }; 395C29C21A98A0A000EBC7AD /* Webinterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29BF1A98A0A000EBC7AD /* Webinterface.cpp */; }; + 395C29C31A98A0A000EBC7AD /* Webinterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29BF1A98A0A000EBC7AD /* Webinterface.cpp */; }; 395C29C51A98A0E100EBC7AD /* ILanguageInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29C41A98A0E100EBC7AD /* ILanguageInvoker.cpp */; }; 395C29C61A98A0E100EBC7AD /* ILanguageInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29C41A98A0E100EBC7AD /* ILanguageInvoker.cpp */; }; + 395C29C71A98A0E100EBC7AD /* ILanguageInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29C41A98A0E100EBC7AD /* ILanguageInvoker.cpp */; }; 395C29D51A98A11C00EBC7AD /* WsgiErrorStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29CA1A98A11C00EBC7AD /* WsgiErrorStream.cpp */; }; 395C29D61A98A11C00EBC7AD /* WsgiErrorStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29CA1A98A11C00EBC7AD /* WsgiErrorStream.cpp */; }; + 395C29D71A98A11C00EBC7AD /* WsgiErrorStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29CA1A98A11C00EBC7AD /* WsgiErrorStream.cpp */; }; 395C29D81A98A11C00EBC7AD /* WsgiInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29CC1A98A11C00EBC7AD /* WsgiInputStream.cpp */; }; 395C29D91A98A11C00EBC7AD /* WsgiInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29CC1A98A11C00EBC7AD /* WsgiInputStream.cpp */; }; + 395C29DA1A98A11C00EBC7AD /* WsgiInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29CC1A98A11C00EBC7AD /* WsgiInputStream.cpp */; }; 395C29DB1A98A11C00EBC7AD /* WsgiResponse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29CE1A98A11C00EBC7AD /* WsgiResponse.cpp */; }; 395C29DC1A98A11C00EBC7AD /* WsgiResponse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29CE1A98A11C00EBC7AD /* WsgiResponse.cpp */; }; + 395C29DD1A98A11C00EBC7AD /* WsgiResponse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29CE1A98A11C00EBC7AD /* WsgiResponse.cpp */; }; 395C29DE1A98A11C00EBC7AD /* WsgiResponseBody.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29D01A98A11C00EBC7AD /* WsgiResponseBody.cpp */; }; 395C29DF1A98A11C00EBC7AD /* WsgiResponseBody.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29D01A98A11C00EBC7AD /* WsgiResponseBody.cpp */; }; + 395C29E01A98A11C00EBC7AD /* WsgiResponseBody.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29D01A98A11C00EBC7AD /* WsgiResponseBody.cpp */; }; 395C29E31A98A15700EBC7AD /* HTTPPythonHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29E11A98A15700EBC7AD /* HTTPPythonHandler.cpp */; }; 395C29E41A98A15700EBC7AD /* HTTPPythonHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29E11A98A15700EBC7AD /* HTTPPythonHandler.cpp */; }; + 395C29E51A98A15700EBC7AD /* HTTPPythonHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29E11A98A15700EBC7AD /* HTTPPythonHandler.cpp */; }; 395C29ED1A98A16300EBC7AD /* HTTPPythonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29E71A98A16300EBC7AD /* HTTPPythonInvoker.cpp */; }; 395C29EE1A98A16300EBC7AD /* HTTPPythonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29E71A98A16300EBC7AD /* HTTPPythonInvoker.cpp */; }; + 395C29EF1A98A16300EBC7AD /* HTTPPythonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29E71A98A16300EBC7AD /* HTTPPythonInvoker.cpp */; }; 395C29F01A98A16300EBC7AD /* HTTPPythonWsgiInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29EA1A98A16300EBC7AD /* HTTPPythonWsgiInvoker.cpp */; }; 395C29F11A98A16300EBC7AD /* HTTPPythonWsgiInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29EA1A98A16300EBC7AD /* HTTPPythonWsgiInvoker.cpp */; }; + 395C29F21A98A16300EBC7AD /* HTTPPythonWsgiInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29EA1A98A16300EBC7AD /* HTTPPythonWsgiInvoker.cpp */; }; 395C29F61A98B44B00EBC7AD /* AddonModuleXbmcwsgi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29F51A98B44B00EBC7AD /* AddonModuleXbmcwsgi.cpp */; }; 395C29F71A98B44B00EBC7AD /* AddonModuleXbmcwsgi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29F51A98B44B00EBC7AD /* AddonModuleXbmcwsgi.cpp */; }; + 395C29F81A98B44B00EBC7AD /* AddonModuleXbmcwsgi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29F51A98B44B00EBC7AD /* AddonModuleXbmcwsgi.cpp */; }; 395C29FB1A9CD20C00EBC7AD /* ContextMenuManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29F91A9CD20C00EBC7AD /* ContextMenuManager.cpp */; }; 395C29FC1A9CD20C00EBC7AD /* ContextMenuManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29F91A9CD20C00EBC7AD /* ContextMenuManager.cpp */; }; + 395C29FD1A9CD20C00EBC7AD /* ContextMenuManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C29F91A9CD20C00EBC7AD /* ContextMenuManager.cpp */; }; 395C2A041A9CD25100EBC7AD /* ContextItemAddonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A021A9CD25100EBC7AD /* ContextItemAddonInvoker.cpp */; }; 395C2A051A9CD25100EBC7AD /* ContextItemAddonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A021A9CD25100EBC7AD /* ContextItemAddonInvoker.cpp */; }; + 395C2A061A9CD25100EBC7AD /* ContextItemAddonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A021A9CD25100EBC7AD /* ContextItemAddonInvoker.cpp */; }; 395C2A091A9F06EB00EBC7AD /* LanguageResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A071A9F06EB00EBC7AD /* LanguageResource.cpp */; }; 395C2A0A1A9F06EB00EBC7AD /* LanguageResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A071A9F06EB00EBC7AD /* LanguageResource.cpp */; }; + 395C2A0B1A9F06EB00EBC7AD /* LanguageResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A071A9F06EB00EBC7AD /* LanguageResource.cpp */; }; 395C2A111A9F072400EBC7AD /* ResourceDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A0D1A9F072400EBC7AD /* ResourceDirectory.cpp */; }; 395C2A121A9F072400EBC7AD /* ResourceDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A0D1A9F072400EBC7AD /* ResourceDirectory.cpp */; }; + 395C2A131A9F072400EBC7AD /* ResourceDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A0D1A9F072400EBC7AD /* ResourceDirectory.cpp */; }; 395C2A141A9F072400EBC7AD /* ResourceFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A0F1A9F072400EBC7AD /* ResourceFile.cpp */; }; 395C2A151A9F072400EBC7AD /* ResourceFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A0F1A9F072400EBC7AD /* ResourceFile.cpp */; }; + 395C2A161A9F072400EBC7AD /* ResourceFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A0F1A9F072400EBC7AD /* ResourceFile.cpp */; }; 395C2A191A9F074C00EBC7AD /* Locale.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A171A9F074C00EBC7AD /* Locale.cpp */; }; 395C2A1A1A9F074C00EBC7AD /* Locale.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A171A9F074C00EBC7AD /* Locale.cpp */; }; + 395C2A1B1A9F074C00EBC7AD /* Locale.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A171A9F074C00EBC7AD /* Locale.cpp */; }; + 395C2A1F1A9F96A700EBC7AD /* ContextItemAddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A1D1A9F96A700EBC7AD /* ContextItemAddon.cpp */; }; + 395C2A201A9F96A700EBC7AD /* ContextItemAddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A1D1A9F96A700EBC7AD /* ContextItemAddon.cpp */; }; + 395C2A211A9F96A700EBC7AD /* ContextItemAddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A1D1A9F96A700EBC7AD /* ContextItemAddon.cpp */; }; 395C2A241AA4C32100EBC7AD /* AudioDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A221AA4C32100EBC7AD /* AudioDecoder.cpp */; }; 395C2A251AA4C32100EBC7AD /* AudioDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A221AA4C32100EBC7AD /* AudioDecoder.cpp */; }; + 395C2A261AA4C32100EBC7AD /* AudioDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395C2A221AA4C32100EBC7AD /* AudioDecoder.cpp */; }; 395F6DDD1A8133360088CC74 /* GUIDialogSimpleMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DDB1A8133360088CC74 /* GUIDialogSimpleMenu.cpp */; }; 395F6DDE1A8133360088CC74 /* GUIDialogSimpleMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DDB1A8133360088CC74 /* GUIDialogSimpleMenu.cpp */; }; + 395F6DDF1A8133360088CC74 /* GUIDialogSimpleMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DDB1A8133360088CC74 /* GUIDialogSimpleMenu.cpp */; }; 395F6DE21A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */; }; 395F6DE31A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */; }; + 395F6DE41A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */; }; 3961C4391ABC0A46002DBBFB /* UISoundsResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3961C4371ABC0A46002DBBFB /* UISoundsResource.cpp */; }; 3961C43A1ABC0A46002DBBFB /* UISoundsResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3961C4371ABC0A46002DBBFB /* UISoundsResource.cpp */; }; + 3961C43B1ABC0A46002DBBFB /* UISoundsResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3961C4371ABC0A46002DBBFB /* UISoundsResource.cpp */; }; 397877D51AAAF87700F98A45 /* Speed.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 397877D11AAAF87700F98A45 /* Speed.cpp */; }; 397877D61AAAF87700F98A45 /* Speed.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 397877D11AAAF87700F98A45 /* Speed.cpp */; }; + 397877D71AAAF87700F98A45 /* Speed.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 397877D11AAAF87700F98A45 /* Speed.cpp */; }; 397877D81AAAF87700F98A45 /* Temperature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 397877D31AAAF87700F98A45 /* Temperature.cpp */; }; 397877D91AAAF87700F98A45 /* Temperature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 397877D31AAAF87700F98A45 /* Temperature.cpp */; }; + 397877DA1AAAF87700F98A45 /* Temperature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 397877D31AAAF87700F98A45 /* Temperature.cpp */; }; 3994425B1A8DD8D0006C39E9 /* ProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442591A8DD8D0006C39E9 /* ProgressJob.cpp */; }; 3994425C1A8DD8D0006C39E9 /* ProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442591A8DD8D0006C39E9 /* ProgressJob.cpp */; }; + 3994425D1A8DD8D0006C39E9 /* ProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442591A8DD8D0006C39E9 /* ProgressJob.cpp */; }; 3994426E1A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442611A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp */; }; 3994426F1A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442611A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp */; }; + 399442701A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442611A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp */; }; 399442711A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442631A8DD920006C39E9 /* VideoLibraryJob.cpp */; }; 399442721A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442631A8DD920006C39E9 /* VideoLibraryJob.cpp */; }; + 399442731A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442631A8DD920006C39E9 /* VideoLibraryJob.cpp */; }; 399442741A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442651A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp */; }; 399442751A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442651A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp */; }; + 399442761A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442651A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp */; }; 399442771A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442671A8DD920006C39E9 /* VideoLibraryProgressJob.cpp */; }; 399442781A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442671A8DD920006C39E9 /* VideoLibraryProgressJob.cpp */; }; + 399442791A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442671A8DD920006C39E9 /* VideoLibraryProgressJob.cpp */; }; 3994427A1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442691A8DD920006C39E9 /* VideoLibraryScanningJob.cpp */; }; 3994427B1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442691A8DD920006C39E9 /* VideoLibraryScanningJob.cpp */; }; + 3994427C1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442691A8DD920006C39E9 /* VideoLibraryScanningJob.cpp */; }; 3994427F1A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3994427D1A8DD96F006C39E9 /* VideoLibraryQueue.cpp */; }; 399442801A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3994427D1A8DD96F006C39E9 /* VideoLibraryQueue.cpp */; }; - 39B4F3701B96F845009B2D88 /* RepositoryUpdater.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39B4F36E1B96F845009B2D88 /* RepositoryUpdater.cpp */; }; - 39B4F3711B96F845009B2D88 /* RepositoryUpdater.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39B4F36E1B96F845009B2D88 /* RepositoryUpdater.cpp */; }; - 39BD2AD81B845D40004A5A15 /* DialogHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39BD2AD71B845D40004A5A15 /* DialogHelper.cpp */; }; - 39BD2AD91B845D40004A5A15 /* DialogHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39BD2AD71B845D40004A5A15 /* DialogHelper.cpp */; }; - 39C38CCA1BBFF1EE000F59F5 /* InputCodingTableKorean.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39C38CC81BBFF1EE000F59F5 /* InputCodingTableKorean.cpp */; }; - 39C38CCB1BBFF1EE000F59F5 /* InputCodingTableKorean.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39C38CC81BBFF1EE000F59F5 /* InputCodingTableKorean.cpp */; }; + 399442811A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3994427D1A8DD96F006C39E9 /* VideoLibraryQueue.cpp */; }; 4260D5C71B67BB8F003F6F2D /* GUIWindowSplash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4260D5C51B67BB8F003F6F2D /* GUIWindowSplash.cpp */; }; 4260D5C81B67BB8F003F6F2D /* GUIWindowSplash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4260D5C51B67BB8F003F6F2D /* GUIWindowSplash.cpp */; }; + 4260D5C91B67BB8F003F6F2D /* GUIWindowSplash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4260D5C51B67BB8F003F6F2D /* GUIWindowSplash.cpp */; }; 42DAC16E1A6E789E0066B4C8 /* PVRActionListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 42DAC16C1A6E789E0066B4C8 /* PVRActionListener.cpp */; }; 42DAC16F1A6E789E0066B4C8 /* PVRActionListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 42DAC16C1A6E789E0066B4C8 /* PVRActionListener.cpp */; }; - 42E2E1C91B53F74D005C7E4E /* VideoLibraryRefreshingJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 42E2E1C71B53F74D005C7E4E /* VideoLibraryRefreshingJob.cpp */; }; - 42E2E1CA1B53F74D005C7E4E /* VideoLibraryRefreshingJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 42E2E1C71B53F74D005C7E4E /* VideoLibraryRefreshingJob.cpp */; }; + 42DAC1701A6E789E0066B4C8 /* PVRActionListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 42DAC16C1A6E789E0066B4C8 /* PVRActionListener.cpp */; }; 431AE5DA109C1A63007428C3 /* OverlayRendererUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 431AE5D7109C1A63007428C3 /* OverlayRendererUtil.cpp */; }; 432D7CE412D86DA500CE4C49 /* NetworkLinux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 432D7CE312D86DA500CE4C49 /* NetworkLinux.cpp */; }; 432D7CF712D870E800CE4C49 /* TCPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 432D7CF612D870E800CE4C49 /* TCPServer.cpp */; }; @@ -247,53 +293,67 @@ 55611BA31766672F00754072 /* RenderFlags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55611BA21766672F00754072 /* RenderFlags.cpp */; }; 55D3604E1826CAB900DA66D2 /* OverlayRendererGUI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55D3604C1826CAB900DA66D2 /* OverlayRendererGUI.cpp */; }; 5EB3113C1A978B9B00551907 /* CueInfoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EB3113A1A978B9B00551907 /* CueInfoLoader.cpp */; }; + 5EE4F9161A9FF0F7002E20F8 /* ReplayGain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EF800FE1A97892A0035AA4D /* ReplayGain.cpp */; }; + 5EE4F9171A9FF2AE002E20F8 /* CueInfoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EB3113A1A978B9B00551907 /* CueInfoLoader.cpp */; }; 5EE4F9181A9FF36F002E20F8 /* CueInfoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EB3113A1A978B9B00551907 /* CueInfoLoader.cpp */; }; 5EF801001A97892A0035AA4D /* ReplayGain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EF800FE1A97892A0035AA4D /* ReplayGain.cpp */; }; 7C0B98A4154B79C30065A238 /* AEDeviceInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C0B98A1154B79C30065A238 /* AEDeviceInfo.cpp */; }; 7C140989183224B8009F9411 /* ISetting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14096F183224B8009F9411 /* ISetting.cpp */; }; 7C14098A183224B8009F9411 /* ISetting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14096F183224B8009F9411 /* ISetting.cpp */; }; + 7C14098B183224B8009F9411 /* ISetting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14096F183224B8009F9411 /* ISetting.cpp */; }; 7C14098C183224B8009F9411 /* ISettingControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140972183224B8009F9411 /* ISettingControl.cpp */; }; 7C14098D183224B8009F9411 /* ISettingControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140972183224B8009F9411 /* ISettingControl.cpp */; }; + 7C14098E183224B8009F9411 /* ISettingControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140972183224B8009F9411 /* ISettingControl.cpp */; }; 7C14098F183224B8009F9411 /* Setting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140978183224B8009F9411 /* Setting.cpp */; }; 7C140990183224B8009F9411 /* Setting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140978183224B8009F9411 /* Setting.cpp */; }; + 7C140991183224B8009F9411 /* Setting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140978183224B8009F9411 /* Setting.cpp */; }; 7C140992183224B8009F9411 /* SettingCategoryAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14097A183224B8009F9411 /* SettingCategoryAccess.cpp */; }; 7C140993183224B8009F9411 /* SettingCategoryAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14097A183224B8009F9411 /* SettingCategoryAccess.cpp */; }; + 7C140994183224B8009F9411 /* SettingCategoryAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14097A183224B8009F9411 /* SettingCategoryAccess.cpp */; }; 7C140995183224B8009F9411 /* SettingConditions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14097C183224B8009F9411 /* SettingConditions.cpp */; }; 7C140996183224B8009F9411 /* SettingConditions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14097C183224B8009F9411 /* SettingConditions.cpp */; }; + 7C140997183224B8009F9411 /* SettingConditions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14097C183224B8009F9411 /* SettingConditions.cpp */; }; 7C140998183224B8009F9411 /* SettingDependency.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14097F183224B8009F9411 /* SettingDependency.cpp */; }; 7C140999183224B8009F9411 /* SettingDependency.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14097F183224B8009F9411 /* SettingDependency.cpp */; }; + 7C14099A183224B8009F9411 /* SettingDependency.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C14097F183224B8009F9411 /* SettingDependency.cpp */; }; 7C14099B183224B8009F9411 /* SettingRequirement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140981183224B8009F9411 /* SettingRequirement.cpp */; }; 7C14099C183224B8009F9411 /* SettingRequirement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140981183224B8009F9411 /* SettingRequirement.cpp */; }; + 7C14099D183224B8009F9411 /* SettingRequirement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140981183224B8009F9411 /* SettingRequirement.cpp */; }; 7C14099E183224B8009F9411 /* SettingSection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140983183224B8009F9411 /* SettingSection.cpp */; }; 7C14099F183224B8009F9411 /* SettingSection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140983183224B8009F9411 /* SettingSection.cpp */; }; + 7C1409A0183224B8009F9411 /* SettingSection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140983183224B8009F9411 /* SettingSection.cpp */; }; 7C1409A1183224B8009F9411 /* SettingsManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140985183224B8009F9411 /* SettingsManager.cpp */; }; 7C1409A2183224B8009F9411 /* SettingsManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140985183224B8009F9411 /* SettingsManager.cpp */; }; + 7C1409A3183224B8009F9411 /* SettingsManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140985183224B8009F9411 /* SettingsManager.cpp */; }; 7C1409A4183224B8009F9411 /* SettingUpdate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140987183224B8009F9411 /* SettingUpdate.cpp */; }; 7C1409A5183224B8009F9411 /* SettingUpdate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140987183224B8009F9411 /* SettingUpdate.cpp */; }; + 7C1409A6183224B8009F9411 /* SettingUpdate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C140987183224B8009F9411 /* SettingUpdate.cpp */; }; 7C1409A9184015C9009F9411 /* InfoExpression.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1409A7184015C6009F9411 /* InfoExpression.cpp */; }; 7C1409AA184015C9009F9411 /* InfoExpression.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1409A7184015C6009F9411 /* InfoExpression.cpp */; }; + 7C1409AB184015C9009F9411 /* InfoExpression.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1409A7184015C6009F9411 /* InfoExpression.cpp */; }; 7C15DCBC1892481400FCE564 /* InfoBool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C15DCBB1892481300FCE564 /* InfoBool.cpp */; }; 7C15DCBD1892481400FCE564 /* InfoBool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C15DCBB1892481300FCE564 /* InfoBool.cpp */; }; + 7C15DCBE1892481400FCE564 /* InfoBool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C15DCBB1892481300FCE564 /* InfoBool.cpp */; }; 7C1A492315A962EE004AF4A4 /* SeekHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1A492115A962EE004AF4A4 /* SeekHandler.cpp */; }; 7C1A85661520522500C63311 /* TextureCacheJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1A85631520522500C63311 /* TextureCacheJob.cpp */; }; 7C1D682915A7D2FD00658B65 /* DatabaseManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1D682715A7D2FD00658B65 /* DatabaseManager.cpp */; }; 7C1F6EBB13ECCFA7001726AB /* LibraryDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1F6EB913ECCFA7001726AB /* LibraryDirectory.cpp */; }; - 7C226E3E1BA5F61C00185CE0 /* AddonCallbacksAudioEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C226E3C1BA5F61C00185CE0 /* AddonCallbacksAudioEngine.cpp */; }; - 7C226E3F1BA5F61D00185CE0 /* AddonCallbacksAudioEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C226E3C1BA5F61C00185CE0 /* AddonCallbacksAudioEngine.cpp */; }; 7C26126C182068660086E04D /* SettingsOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126A182068660086E04D /* SettingsOperations.cpp */; }; 7C26126D182068660086E04D /* SettingsOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126A182068660086E04D /* SettingsOperations.cpp */; }; + 7C26126E182068660086E04D /* SettingsOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126A182068660086E04D /* SettingsOperations.cpp */; }; 7C2612711825B6340086E04D /* DatabaseQuery.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */; }; 7C2612721825B6340086E04D /* DatabaseQuery.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */; }; + 7C2612731825B6340086E04D /* DatabaseQuery.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */; }; 7C2D6AE40F35453E00DD2E85 /* SpecialProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2D6AE20F35453E00DD2E85 /* SpecialProtocol.cpp */; }; - 7C3018311BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C30182F1BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp */; }; - 7C3018321BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C30182F1BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp */; }; 7C4458BD161E203800A905F6 /* Screenshot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C4458BB161E203800A905F6 /* Screenshot.cpp */; }; 7C45DBE910F325C400D4BBF3 /* DAVDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C45DBE710F325C400D4BBF3 /* DAVDirectory.cpp */; }; 7C4705AE12EF584C00369E51 /* AddonInstaller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C4705AC12EF584C00369E51 /* AddonInstaller.cpp */; }; 7C4E6F721829AA9700F1068F /* GUIDialogSubtitles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C4E6F701829AA9700F1068F /* GUIDialogSubtitles.cpp */; }; 7C4E6F731829AA9700F1068F /* GUIDialogSubtitles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C4E6F701829AA9700F1068F /* GUIDialogSubtitles.cpp */; }; + 7C4E6F741829AA9700F1068F /* GUIDialogSubtitles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C4E6F701829AA9700F1068F /* GUIDialogSubtitles.cpp */; }; 7C525DF5195E2D8100BE3482 /* SaveFileStateJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C525DF4195E2D8100BE3482 /* SaveFileStateJob.cpp */; }; 7C525DF6195E2D8100BE3482 /* SaveFileStateJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C525DF4195E2D8100BE3482 /* SaveFileStateJob.cpp */; }; + 7C525DF7195E2D8100BE3482 /* SaveFileStateJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C525DF4195E2D8100BE3482 /* SaveFileStateJob.cpp */; }; 7C5608C70F1754930056433A /* ExternalPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C5608C40F1754930056433A /* ExternalPlayer.cpp */; }; 7C62F24210505BC7002AD2C1 /* Bookmark.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C62F24010505BC7002AD2C1 /* Bookmark.cpp */; }; 7C62F45E1057A62D002AD2C1 /* DirectoryNodeSingles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C62F45C1057A62D002AD2C1 /* DirectoryNodeSingles.cpp */; }; @@ -311,6 +371,8 @@ 7C7BCDC717727951004842FB /* StaticProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7BCDC317727951004842FB /* StaticProvider.cpp */; }; 7C7BCDC817727951004842FB /* IListProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7BCDBF17727951004842FB /* IListProvider.cpp */; }; 7C7BCDCA17727951004842FB /* StaticProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7BCDC317727951004842FB /* StaticProvider.cpp */; }; + 7C7BCDCB17727951004842FB /* IListProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7BCDBF17727951004842FB /* IListProvider.cpp */; }; + 7C7BCDCD17727952004842FB /* StaticProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7BCDC317727951004842FB /* StaticProvider.cpp */; }; 7C7CEAF1165629530059C9EB /* AELimiter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7CEAEF165629530059C9EB /* AELimiter.cpp */; }; 7C84A59E12FA3C1600CD1714 /* SourcesDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C84A59C12FA3C1600CD1714 /* SourcesDirectory.cpp */; }; 7C87B2CE162CE39600EF897D /* PlayerController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C87B2CC162CE39600EF897D /* PlayerController.cpp */; }; @@ -322,283 +384,357 @@ 7C8AE850189DE3CD00C33786 /* CoreAudioHardware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8AE84B189DE3CD00C33786 /* CoreAudioHardware.cpp */; }; 7C8AE851189DE3CD00C33786 /* CoreAudioStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8AE84C189DE3CD00C33786 /* CoreAudioStream.cpp */; }; 7C8AE854189DE47F00C33786 /* CoreAudioHelpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8AE852189DE47400C33786 /* CoreAudioHelpers.cpp */; }; - 7C8E02191BA35D0B0072E8B2 /* AddonBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01F71BA35D0B0072E8B2 /* AddonBuiltins.cpp */; }; - 7C8E021A1BA35D0B0072E8B2 /* AddonBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01F71BA35D0B0072E8B2 /* AddonBuiltins.cpp */; }; - 7C8E021C1BA35D0B0072E8B2 /* AndroidBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01F91BA35D0B0072E8B2 /* AndroidBuiltins.cpp */; }; - 7C8E021D1BA35D0B0072E8B2 /* AndroidBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01F91BA35D0B0072E8B2 /* AndroidBuiltins.cpp */; }; - 7C8E021F1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FB1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp */; }; - 7C8E02201BA35D0B0072E8B2 /* ApplicationBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FB1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp */; }; - 7C8E02221BA35D0B0072E8B2 /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FD1BA35D0B0072E8B2 /* Builtins.cpp */; }; - 7C8E02231BA35D0B0072E8B2 /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FD1BA35D0B0072E8B2 /* Builtins.cpp */; }; - 7C8E02251BA35D0B0072E8B2 /* CECBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FF1BA35D0B0072E8B2 /* CECBuiltins.cpp */; }; - 7C8E02261BA35D0B0072E8B2 /* CECBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FF1BA35D0B0072E8B2 /* CECBuiltins.cpp */; }; - 7C8E02281BA35D0B0072E8B2 /* GUIBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02011BA35D0B0072E8B2 /* GUIBuiltins.cpp */; }; - 7C8E02291BA35D0B0072E8B2 /* GUIBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02011BA35D0B0072E8B2 /* GUIBuiltins.cpp */; }; - 7C8E022B1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02031BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp */; }; - 7C8E022C1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02031BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp */; }; - 7C8E022E1BA35D0B0072E8B2 /* GUIControlBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02051BA35D0B0072E8B2 /* GUIControlBuiltins.cpp */; }; - 7C8E022F1BA35D0B0072E8B2 /* GUIControlBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02051BA35D0B0072E8B2 /* GUIControlBuiltins.cpp */; }; - 7C8E02311BA35D0B0072E8B2 /* LibraryBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02071BA35D0B0072E8B2 /* LibraryBuiltins.cpp */; }; - 7C8E02321BA35D0B0072E8B2 /* LibraryBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02071BA35D0B0072E8B2 /* LibraryBuiltins.cpp */; }; - 7C8E02341BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02091BA35D0B0072E8B2 /* OpticalBuiltins.cpp */; }; - 7C8E02351BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02091BA35D0B0072E8B2 /* OpticalBuiltins.cpp */; }; - 7C8E02371BA35D0B0072E8B2 /* PictureBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020B1BA35D0B0072E8B2 /* PictureBuiltins.cpp */; }; - 7C8E02381BA35D0B0072E8B2 /* PictureBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020B1BA35D0B0072E8B2 /* PictureBuiltins.cpp */; }; - 7C8E023A1BA35D0B0072E8B2 /* PlayerBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020D1BA35D0B0072E8B2 /* PlayerBuiltins.cpp */; }; - 7C8E023B1BA35D0B0072E8B2 /* PlayerBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020D1BA35D0B0072E8B2 /* PlayerBuiltins.cpp */; }; - 7C8E023D1BA35D0B0072E8B2 /* ProfileBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp */; }; - 7C8E023E1BA35D0B0072E8B2 /* ProfileBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp */; }; - 7C8E02401BA35D0B0072E8B2 /* PVRBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02111BA35D0B0072E8B2 /* PVRBuiltins.cpp */; }; - 7C8E02411BA35D0B0072E8B2 /* PVRBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02111BA35D0B0072E8B2 /* PVRBuiltins.cpp */; }; - 7C8E02431BA35D0B0072E8B2 /* SkinBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02131BA35D0B0072E8B2 /* SkinBuiltins.cpp */; }; - 7C8E02441BA35D0B0072E8B2 /* SkinBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02131BA35D0B0072E8B2 /* SkinBuiltins.cpp */; }; - 7C8E02461BA35D0B0072E8B2 /* SystemBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02151BA35D0B0072E8B2 /* SystemBuiltins.cpp */; }; - 7C8E02471BA35D0B0072E8B2 /* SystemBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02151BA35D0B0072E8B2 /* SystemBuiltins.cpp */; }; - 7C8E02491BA35D0B0072E8B2 /* WeatherBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02171BA35D0B0072E8B2 /* WeatherBuiltins.cpp */; }; - 7C8E024A1BA35D0B0072E8B2 /* WeatherBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02171BA35D0B0072E8B2 /* WeatherBuiltins.cpp */; }; 7C8FC6EE1829A4580045153D /* DirectoryProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8FC6EC1829A4580045153D /* DirectoryProvider.cpp */; }; 7C8FC6EF1829A4580045153D /* DirectoryProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8FC6EC1829A4580045153D /* DirectoryProvider.cpp */; }; + 7C8FC6F01829A4580045153D /* DirectoryProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8FC6EC1829A4580045153D /* DirectoryProvider.cpp */; }; 7C908894196358A8003D0619 /* auto_buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C908892196358A8003D0619 /* auto_buffer.cpp */; }; 7C908895196358A8003D0619 /* auto_buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C908892196358A8003D0619 /* auto_buffer.cpp */; }; + 7C908896196358A8003D0619 /* auto_buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C908892196358A8003D0619 /* auto_buffer.cpp */; }; 7C920CF9181669FF00DA1477 /* TextureOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C920CF7181669FF00DA1477 /* TextureOperations.cpp */; }; 7C920CFA181669FF00DA1477 /* TextureOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C920CF7181669FF00DA1477 /* TextureOperations.cpp */; }; - 7C973CE51B50378E0002A874 /* AddonCallbacksAudioDSP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CE31B50378E0002A874 /* AddonCallbacksAudioDSP.cpp */; }; - 7C973CF11B5037EF0002A874 /* ActiveAEDSP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CE71B5037EF0002A874 /* ActiveAEDSP.cpp */; }; - 7C973CF21B5037EF0002A874 /* ActiveAEDSPAddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CE91B5037EF0002A874 /* ActiveAEDSPAddon.cpp */; }; - 7C973CF31B5037EF0002A874 /* ActiveAEDSPDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CEB1B5037EF0002A874 /* ActiveAEDSPDatabase.cpp */; }; - 7C973CF41B5037EF0002A874 /* ActiveAEDSPMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CED1B5037EF0002A874 /* ActiveAEDSPMode.cpp */; }; - 7C973CF51B5037EF0002A874 /* ActiveAEDSPProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CEF1B5037EF0002A874 /* ActiveAEDSPProcess.cpp */; }; - 7C973CFA1B5038580002A874 /* GUIDialogAudioDSPManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CF61B5038580002A874 /* GUIDialogAudioDSPManager.cpp */; }; - 7C973CFB1B5038580002A874 /* GUIDialogAudioDSPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CF81B5038580002A874 /* GUIDialogAudioDSPSettings.cpp */; }; + 7C920CFB181669FF00DA1477 /* TextureOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C920CF7181669FF00DA1477 /* TextureOperations.cpp */; }; 7C99B6A4133D342100FC2B16 /* CircularCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C99B6A2133D342100FC2B16 /* CircularCache.cpp */; }; 7C99B7951340723F00FC2B16 /* GUIDialogPlayEject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C99B7931340723F00FC2B16 /* GUIDialogPlayEject.cpp */; }; 7CAA20511079C8160096DE39 /* BaseRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CAA204F1079C8160096DE39 /* BaseRenderer.cpp */; }; 7CAA25351085963B0096DE39 /* PasswordManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CAA25331085963B0096DE39 /* PasswordManager.cpp */; }; 7CAA469019427AED00008885 /* PosixDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CAA468E19427AED00008885 /* PosixDirectory.cpp */; }; 7CAA469119427AED00008885 /* PosixDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CAA468E19427AED00008885 /* PosixDirectory.cpp */; }; + 7CAA469219427AED00008885 /* PosixDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CAA468E19427AED00008885 /* PosixDirectory.cpp */; }; 7CBEBB8412912BA400431822 /* fstrcmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CBEBB8212912BA300431822 /* fstrcmp.c */; }; 7CC30DB116291A5C003E7579 /* MusicThumbLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC30DAF16291A5C003E7579 /* MusicThumbLoader.cpp */; }; 7CC30DC016291C2C003E7579 /* VideoThumbLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC30DBE16291C2C003E7579 /* VideoThumbLoader.cpp */; }; 7CC7B6B31918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AD1918699000DDB120 /* GUIDialogSettingsBase.cpp */; }; 7CC7B6B41918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AD1918699000DDB120 /* GUIDialogSettingsBase.cpp */; }; + 7CC7B6B51918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AD1918699000DDB120 /* GUIDialogSettingsBase.cpp */; }; 7CC7B6B61918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AF1918699000DDB120 /* GUIDialogSettingsManagerBase.cpp */; }; 7CC7B6B71918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AF1918699000DDB120 /* GUIDialogSettingsManagerBase.cpp */; }; + 7CC7B6B81918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AF1918699000DDB120 /* GUIDialogSettingsManagerBase.cpp */; }; 7CC7B6B91918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6B11918699000DDB120 /* GUIDialogSettingsManualBase.cpp */; }; 7CC7B6BA1918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6B11918699000DDB120 /* GUIDialogSettingsManualBase.cpp */; }; + 7CC7B6BB1918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6B11918699000DDB120 /* GUIDialogSettingsManualBase.cpp */; }; 7CC7B6C0191869EA00DDB120 /* SettingCreator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BC191869EA00DDB120 /* SettingCreator.cpp */; }; 7CC7B6C1191869EA00DDB120 /* SettingCreator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BC191869EA00DDB120 /* SettingCreator.cpp */; }; + 7CC7B6C2191869EA00DDB120 /* SettingCreator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BC191869EA00DDB120 /* SettingCreator.cpp */; }; 7CC7B6C3191869EA00DDB120 /* SettingUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BE191869EA00DDB120 /* SettingUtils.cpp */; }; 7CC7B6C4191869EA00DDB120 /* SettingUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BE191869EA00DDB120 /* SettingUtils.cpp */; }; + 7CC7B6C5191869EA00DDB120 /* SettingUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BE191869EA00DDB120 /* SettingUtils.cpp */; }; 7CC7B6C819186A8800DDB120 /* SettingConditions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6C619186A8800DDB120 /* SettingConditions.cpp */; }; 7CC7B6C919186A8800DDB120 /* SettingConditions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6C619186A8800DDB120 /* SettingConditions.cpp */; }; + 7CC7B6CA19186A8800DDB120 /* SettingConditions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6C619186A8800DDB120 /* SettingConditions.cpp */; }; 7CC82C9318284F9F0010DF30 /* CharsetDetection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC82C9118284F9F0010DF30 /* CharsetDetection.cpp */; }; 7CC82C9418284F9F0010DF30 /* CharsetDetection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC82C9118284F9F0010DF30 /* CharsetDetection.cpp */; }; + 7CC82C9518284F9F0010DF30 /* CharsetDetection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC82C9118284F9F0010DF30 /* CharsetDetection.cpp */; }; 7CCDA0DB192753E30074CF51 /* PltAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F6D192753E30074CF51 /* PltAction.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA0DC192753E30074CF51 /* PltAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F6D192753E30074CF51 /* PltAction.cpp */; }; + 7CCDA0DD192753E30074CF51 /* PltAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F6D192753E30074CF51 /* PltAction.cpp */; }; 7CCDA0E4192753E30074CF51 /* PltArgument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F71192753E30074CF51 /* PltArgument.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA0E5192753E30074CF51 /* PltArgument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F71192753E30074CF51 /* PltArgument.cpp */; }; + 7CCDA0E6192753E30074CF51 /* PltArgument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F71192753E30074CF51 /* PltArgument.cpp */; }; 7CCDA0ED192753E30074CF51 /* PltConstants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F75192753E30074CF51 /* PltConstants.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA0EE192753E30074CF51 /* PltConstants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F75192753E30074CF51 /* PltConstants.cpp */; }; + 7CCDA0EF192753E30074CF51 /* PltConstants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F75192753E30074CF51 /* PltConstants.cpp */; }; 7CCDA0F6192753E30074CF51 /* PltCtrlPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F79192753E30074CF51 /* PltCtrlPoint.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA0F7192753E30074CF51 /* PltCtrlPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F79192753E30074CF51 /* PltCtrlPoint.cpp */; }; + 7CCDA0F8192753E30074CF51 /* PltCtrlPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F79192753E30074CF51 /* PltCtrlPoint.cpp */; }; 7CCDA0FF192753E30074CF51 /* PltCtrlPointTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F7D192753E30074CF51 /* PltCtrlPointTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA100192753E30074CF51 /* PltCtrlPointTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F7D192753E30074CF51 /* PltCtrlPointTask.cpp */; }; + 7CCDA101192753E30074CF51 /* PltCtrlPointTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F7D192753E30074CF51 /* PltCtrlPointTask.cpp */; }; 7CCDA108192753E30074CF51 /* PltDatagramStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F81192753E30074CF51 /* PltDatagramStream.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA109192753E30074CF51 /* PltDatagramStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F81192753E30074CF51 /* PltDatagramStream.cpp */; }; + 7CCDA10A192753E30074CF51 /* PltDatagramStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F81192753E30074CF51 /* PltDatagramStream.cpp */; }; 7CCDA111192753E30074CF51 /* PltDeviceData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F85192753E30074CF51 /* PltDeviceData.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA112192753E30074CF51 /* PltDeviceData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F85192753E30074CF51 /* PltDeviceData.cpp */; }; + 7CCDA113192753E30074CF51 /* PltDeviceData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F85192753E30074CF51 /* PltDeviceData.cpp */; }; 7CCDA11A192753E30074CF51 /* PltDeviceHost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F89192753E30074CF51 /* PltDeviceHost.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA11B192753E30074CF51 /* PltDeviceHost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F89192753E30074CF51 /* PltDeviceHost.cpp */; }; + 7CCDA11C192753E30074CF51 /* PltDeviceHost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F89192753E30074CF51 /* PltDeviceHost.cpp */; }; 7CCDA123192753E30074CF51 /* PltEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F8D192753E30074CF51 /* PltEvent.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA124192753E30074CF51 /* PltEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F8D192753E30074CF51 /* PltEvent.cpp */; }; + 7CCDA125192753E30074CF51 /* PltEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F8D192753E30074CF51 /* PltEvent.cpp */; }; 7CCDA12C192753E30074CF51 /* PltHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F91192753E30074CF51 /* PltHttp.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA12D192753E30074CF51 /* PltHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F91192753E30074CF51 /* PltHttp.cpp */; }; + 7CCDA12E192753E30074CF51 /* PltHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F91192753E30074CF51 /* PltHttp.cpp */; }; 7CCDA135192753E30074CF51 /* PltHttpClientTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F95192753E30074CF51 /* PltHttpClientTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA136192753E30074CF51 /* PltHttpClientTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F95192753E30074CF51 /* PltHttpClientTask.cpp */; }; + 7CCDA137192753E30074CF51 /* PltHttpClientTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F95192753E30074CF51 /* PltHttpClientTask.cpp */; }; 7CCDA13E192753E30074CF51 /* PltHttpServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F99192753E30074CF51 /* PltHttpServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA13F192753E30074CF51 /* PltHttpServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F99192753E30074CF51 /* PltHttpServer.cpp */; }; + 7CCDA140192753E30074CF51 /* PltHttpServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F99192753E30074CF51 /* PltHttpServer.cpp */; }; 7CCDA147192753E30074CF51 /* PltHttpServerTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F9D192753E30074CF51 /* PltHttpServerTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA148192753E30074CF51 /* PltHttpServerTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F9D192753E30074CF51 /* PltHttpServerTask.cpp */; }; + 7CCDA149192753E30074CF51 /* PltHttpServerTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9F9D192753E30074CF51 /* PltHttpServerTask.cpp */; }; 7CCDA150192753E30074CF51 /* PltIconsData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FA1192753E30074CF51 /* PltIconsData.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA151192753E30074CF51 /* PltIconsData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FA1192753E30074CF51 /* PltIconsData.cpp */; }; + 7CCDA152192753E30074CF51 /* PltIconsData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FA1192753E30074CF51 /* PltIconsData.cpp */; }; 7CCDA159192753E30074CF51 /* PltMimeType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FA4192753E30074CF51 /* PltMimeType.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA15A192753E30074CF51 /* PltMimeType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FA4192753E30074CF51 /* PltMimeType.cpp */; }; + 7CCDA15B192753E30074CF51 /* PltMimeType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FA4192753E30074CF51 /* PltMimeType.cpp */; }; 7CCDA162192753E30074CF51 /* PltProtocolInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FA8192753E30074CF51 /* PltProtocolInfo.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA163192753E30074CF51 /* PltProtocolInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FA8192753E30074CF51 /* PltProtocolInfo.cpp */; }; + 7CCDA164192753E30074CF51 /* PltProtocolInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FA8192753E30074CF51 /* PltProtocolInfo.cpp */; }; 7CCDA16B192753E30074CF51 /* PltService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FAC192753E30074CF51 /* PltService.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA16C192753E30074CF51 /* PltService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FAC192753E30074CF51 /* PltService.cpp */; }; + 7CCDA16D192753E30074CF51 /* PltService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FAC192753E30074CF51 /* PltService.cpp */; }; 7CCDA174192753E30074CF51 /* PltSsdp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FB0192753E30074CF51 /* PltSsdp.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA175192753E30074CF51 /* PltSsdp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FB0192753E30074CF51 /* PltSsdp.cpp */; }; + 7CCDA176192753E30074CF51 /* PltSsdp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FB0192753E30074CF51 /* PltSsdp.cpp */; }; 7CCDA17D192753E30074CF51 /* PltStateVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FB4192753E30074CF51 /* PltStateVariable.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA17E192753E30074CF51 /* PltStateVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FB4192753E30074CF51 /* PltStateVariable.cpp */; }; + 7CCDA17F192753E30074CF51 /* PltStateVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FB4192753E30074CF51 /* PltStateVariable.cpp */; }; 7CCDA186192753E30074CF51 /* PltTaskManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FB8192753E30074CF51 /* PltTaskManager.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA187192753E30074CF51 /* PltTaskManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FB8192753E30074CF51 /* PltTaskManager.cpp */; }; + 7CCDA188192753E30074CF51 /* PltTaskManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FB8192753E30074CF51 /* PltTaskManager.cpp */; }; 7CCDA18F192753E30074CF51 /* PltThreadTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FBC192753E30074CF51 /* PltThreadTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA190192753E30074CF51 /* PltThreadTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FBC192753E30074CF51 /* PltThreadTask.cpp */; }; + 7CCDA191192753E30074CF51 /* PltThreadTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FBC192753E30074CF51 /* PltThreadTask.cpp */; }; 7CCDA198192753E30074CF51 /* PltUPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FC0192753E30074CF51 /* PltUPnP.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum"; }; }; 7CCDA199192753E30074CF51 /* PltUPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FC0192753E30074CF51 /* PltUPnP.cpp */; }; + 7CCDA19A192753E30074CF51 /* PltUPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FC0192753E30074CF51 /* PltUPnP.cpp */; }; 7CCDA1A1192753E30074CF51 /* PltMediaConnect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FC7192753E30074CF51 /* PltMediaConnect.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1A2192753E30074CF51 /* PltMediaConnect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FC7192753E30074CF51 /* PltMediaConnect.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA1A3192753E30074CF51 /* PltMediaConnect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FC7192753E30074CF51 /* PltMediaConnect.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1AA192753E30074CF51 /* PltXbox360.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCB192753E30074CF51 /* PltXbox360.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1AB192753E30074CF51 /* PltXbox360.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCB192753E30074CF51 /* PltXbox360.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA1AC192753E30074CF51 /* PltXbox360.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCB192753E30074CF51 /* PltXbox360.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1AF192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCE192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1B0192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCE192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp */; }; + 7CCDA1B1192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCE192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp */; }; 7CCDA1B8192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD1192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.xml */; }; + 7CCDA1B9192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD1192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.xml */; }; 7CCDA1BA192753E30074CF51 /* AVTransportSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD3192753E30074CF51 /* AVTransportSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1BB192753E30074CF51 /* AVTransportSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD3192753E30074CF51 /* AVTransportSCPD.cpp */; }; + 7CCDA1BC192753E30074CF51 /* AVTransportSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD3192753E30074CF51 /* AVTransportSCPD.cpp */; }; 7CCDA1C3192753E30074CF51 /* AVTransportSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD6192753E30074CF51 /* AVTransportSCPD.xml */; }; + 7CCDA1C4192753E30074CF51 /* AVTransportSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD6192753E30074CF51 /* AVTransportSCPD.xml */; }; 7CCDA1C5192753E30074CF51 /* AVTransportSCPDFull.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD7192753E30074CF51 /* AVTransportSCPDFull.xml */; }; + 7CCDA1C6192753E30074CF51 /* AVTransportSCPDFull.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD7192753E30074CF51 /* AVTransportSCPDFull.xml */; }; 7CCDA1C7192753E30074CF51 /* PltMediaController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD8192753E30074CF51 /* PltMediaController.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1C8192753E30074CF51 /* PltMediaController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD8192753E30074CF51 /* PltMediaController.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA1C9192753E30074CF51 /* PltMediaController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FD8192753E30074CF51 /* PltMediaController.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1D0192753E30074CF51 /* PltMediaRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FDC192753E30074CF51 /* PltMediaRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1D1192753E30074CF51 /* PltMediaRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FDC192753E30074CF51 /* PltMediaRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA1D2192753E30074CF51 /* PltMediaRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FDC192753E30074CF51 /* PltMediaRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1DB192753E30074CF51 /* RdrConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE1192753E30074CF51 /* RdrConnectionManagerSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1DC192753E30074CF51 /* RdrConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE1192753E30074CF51 /* RdrConnectionManagerSCPD.cpp */; }; + 7CCDA1DD192753E30074CF51 /* RdrConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE1192753E30074CF51 /* RdrConnectionManagerSCPD.cpp */; }; 7CCDA1E4192753E30074CF51 /* RdrConnectionManagerSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE4192753E30074CF51 /* RdrConnectionManagerSCPD.xml */; }; + 7CCDA1E5192753E30074CF51 /* RdrConnectionManagerSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE4192753E30074CF51 /* RdrConnectionManagerSCPD.xml */; }; 7CCDA1E6192753E30074CF51 /* RenderingControlSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE5192753E30074CF51 /* RenderingControlSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1E7192753E30074CF51 /* RenderingControlSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE5192753E30074CF51 /* RenderingControlSCPD.cpp */; }; + 7CCDA1E8192753E30074CF51 /* RenderingControlSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE5192753E30074CF51 /* RenderingControlSCPD.cpp */; }; 7CCDA1EF192753E30074CF51 /* RenderingControlSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE8192753E30074CF51 /* RenderingControlSCPD.xml */; }; + 7CCDA1F0192753E30074CF51 /* RenderingControlSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE8192753E30074CF51 /* RenderingControlSCPD.xml */; }; 7CCDA1F1192753E30074CF51 /* RenderingControlSCPD_Full.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE9192753E30074CF51 /* RenderingControlSCPD_Full.xml */; }; + 7CCDA1F2192753E30074CF51 /* RenderingControlSCPD_Full.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE9192753E30074CF51 /* RenderingControlSCPD_Full.xml */; }; 7CCDA1F3192753E30074CF51 /* ConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FEB192753E30074CF51 /* ConnectionManagerSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1F4192753E30074CF51 /* ConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FEB192753E30074CF51 /* ConnectionManagerSCPD.cpp */; }; + 7CCDA1F5192753E30074CF51 /* ConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FEB192753E30074CF51 /* ConnectionManagerSCPD.cpp */; }; 7CCDA1FC192753E30074CF51 /* ConnectionManagerSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FEE192753E30074CF51 /* ConnectionManagerSCPD.xml */; }; + 7CCDA1FD192753E30074CF51 /* ConnectionManagerSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FEE192753E30074CF51 /* ConnectionManagerSCPD.xml */; }; 7CCDA1FE192753E30074CF51 /* ContentDirectorySCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FEF192753E30074CF51 /* ContentDirectorySCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1FF192753E30074CF51 /* ContentDirectorySCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FEF192753E30074CF51 /* ContentDirectorySCPD.cpp */; }; + 7CCDA200192753E30074CF51 /* ContentDirectorySCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FEF192753E30074CF51 /* ContentDirectorySCPD.cpp */; }; 7CCDA207192753E30074CF51 /* ContentDirectorySCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FF2192753E30074CF51 /* ContentDirectorySCPD.xml */; }; + 7CCDA208192753E30074CF51 /* ContentDirectorySCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FF2192753E30074CF51 /* ContentDirectorySCPD.xml */; }; 7CCDA209192753E30074CF51 /* ContentDirectorywSearchSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FF3192753E30074CF51 /* ContentDirectorywSearchSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA20A192753E30074CF51 /* ContentDirectorywSearchSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FF3192753E30074CF51 /* ContentDirectorywSearchSCPD.cpp */; }; + 7CCDA20B192753E30074CF51 /* ContentDirectorywSearchSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FF3192753E30074CF51 /* ContentDirectorywSearchSCPD.cpp */; }; 7CCDA212192753E30074CF51 /* ContentDirectorywSearchSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FF6192753E30074CF51 /* ContentDirectorywSearchSCPD.xml */; }; + 7CCDA213192753E30074CF51 /* ContentDirectorywSearchSCPD.xml in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FF6192753E30074CF51 /* ContentDirectorywSearchSCPD.xml */; }; 7CCDA214192753E30074CF51 /* PltDidl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FF7192753E30074CF51 /* PltDidl.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA215192753E30074CF51 /* PltDidl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FF7192753E30074CF51 /* PltDidl.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA216192753E30074CF51 /* PltDidl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FF7192753E30074CF51 /* PltDidl.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA21D192753E30074CF51 /* PltFileMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FFB192753E30074CF51 /* PltFileMediaServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA21E192753E30074CF51 /* PltFileMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FFB192753E30074CF51 /* PltFileMediaServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA21F192753E30074CF51 /* PltFileMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FFB192753E30074CF51 /* PltFileMediaServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA226192753E30074CF51 /* PltMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FFF192753E30074CF51 /* PltMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA227192753E30074CF51 /* PltMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FFF192753E30074CF51 /* PltMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA228192753E30074CF51 /* PltMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FFF192753E30074CF51 /* PltMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA22F192753E30074CF51 /* PltMediaCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA003192753E30074CF51 /* PltMediaCache.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA230192753E30074CF51 /* PltMediaCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA003192753E30074CF51 /* PltMediaCache.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA231192753E30074CF51 /* PltMediaCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA003192753E30074CF51 /* PltMediaCache.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA238192753E30074CF51 /* PltMediaItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA007192753E30074CF51 /* PltMediaItem.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA239192753E30074CF51 /* PltMediaItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA007192753E30074CF51 /* PltMediaItem.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA23A192753E30074CF51 /* PltMediaItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA007192753E30074CF51 /* PltMediaItem.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA241192753E30074CF51 /* PltMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA00B192753E30074CF51 /* PltMediaServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA242192753E30074CF51 /* PltMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA00B192753E30074CF51 /* PltMediaServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA243192753E30074CF51 /* PltMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA00B192753E30074CF51 /* PltMediaServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA24A192753E30074CF51 /* PltSyncMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA00F192753E30074CF51 /* PltSyncMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA24B192753E30074CF51 /* PltSyncMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA00F192753E30074CF51 /* PltSyncMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + 7CCDA24C192753E30074CF51 /* PltSyncMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA00F192753E30074CF51 /* PltSyncMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA756192756250074CF51 /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = 7CCDA414192756240074CF51 /* README.txt */; }; + 7CCDA757192756250074CF51 /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = 7CCDA414192756240074CF51 /* README.txt */; }; 7CCDA758192756250074CF51 /* SConstruct in Resources */ = {isa = PBXBuildFile; fileRef = 7CCDA415192756240074CF51 /* SConstruct */; }; + 7CCDA759192756250074CF51 /* SConstruct in Resources */ = {isa = PBXBuildFile; fileRef = 7CCDA415192756240074CF51 /* SConstruct */; }; 7CCDA779192756250074CF51 /* Neptune.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA42E192756240074CF51 /* Neptune.cpp */; }; 7CCDA77A192756250074CF51 /* Neptune.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA42E192756240074CF51 /* Neptune.cpp */; }; + 7CCDA77B192756250074CF51 /* Neptune.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA42E192756240074CF51 /* Neptune.cpp */; }; 7CCDA782192756250074CF51 /* NptAutomaticCleaner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA433192756240074CF51 /* NptAutomaticCleaner.cpp */; }; 7CCDA783192756250074CF51 /* NptAutomaticCleaner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA433192756240074CF51 /* NptAutomaticCleaner.cpp */; }; + 7CCDA784192756250074CF51 /* NptAutomaticCleaner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA433192756240074CF51 /* NptAutomaticCleaner.cpp */; }; 7CCDA785192756250074CF51 /* NptBase64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA436192756240074CF51 /* NptBase64.cpp */; }; 7CCDA786192756250074CF51 /* NptBase64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA436192756240074CF51 /* NptBase64.cpp */; }; + 7CCDA787192756250074CF51 /* NptBase64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA436192756240074CF51 /* NptBase64.cpp */; }; 7CCDA78E192756250074CF51 /* NptBufferedStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA43A192756240074CF51 /* NptBufferedStreams.cpp */; }; 7CCDA78F192756250074CF51 /* NptBufferedStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA43A192756240074CF51 /* NptBufferedStreams.cpp */; }; + 7CCDA790192756250074CF51 /* NptBufferedStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA43A192756240074CF51 /* NptBufferedStreams.cpp */; }; 7CCDA797192756250074CF51 /* NptCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA43E192756240074CF51 /* NptCommon.cpp */; }; 7CCDA798192756250074CF51 /* NptCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA43E192756240074CF51 /* NptCommon.cpp */; }; + 7CCDA799192756250074CF51 /* NptCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA43E192756240074CF51 /* NptCommon.cpp */; }; 7CCDA7A0192756250074CF51 /* NptConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA443192756240074CF51 /* NptConsole.cpp */; }; 7CCDA7A1192756250074CF51 /* NptConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA443192756240074CF51 /* NptConsole.cpp */; }; + 7CCDA7A2192756250074CF51 /* NptConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA443192756240074CF51 /* NptConsole.cpp */; }; 7CCDA7A3192756250074CF51 /* NptCrypto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA446192756240074CF51 /* NptCrypto.cpp */; }; 7CCDA7A4192756250074CF51 /* NptCrypto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA446192756240074CF51 /* NptCrypto.cpp */; }; + 7CCDA7A5192756250074CF51 /* NptCrypto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA446192756240074CF51 /* NptCrypto.cpp */; }; 7CCDA7A6192756250074CF51 /* NptDataBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA448192756240074CF51 /* NptDataBuffer.cpp */; }; 7CCDA7A7192756250074CF51 /* NptDataBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA448192756240074CF51 /* NptDataBuffer.cpp */; }; + 7CCDA7A8192756250074CF51 /* NptDataBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA448192756240074CF51 /* NptDataBuffer.cpp */; }; 7CCDA7AF192756250074CF51 /* NptDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA44C192756240074CF51 /* NptDebug.cpp */; }; 7CCDA7B0192756250074CF51 /* NptDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA44C192756240074CF51 /* NptDebug.cpp */; }; + 7CCDA7B1192756250074CF51 /* NptDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA44C192756240074CF51 /* NptDebug.cpp */; }; 7CCDA7B8192756250074CF51 /* NptDigest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA451192756240074CF51 /* NptDigest.cpp */; }; 7CCDA7B9192756250074CF51 /* NptDigest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA451192756240074CF51 /* NptDigest.cpp */; }; + 7CCDA7BA192756250074CF51 /* NptDigest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA451192756240074CF51 /* NptDigest.cpp */; }; 7CCDA7BB192756250074CF51 /* NptDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA454192756240074CF51 /* NptDynamicLibraries.cpp */; }; 7CCDA7BC192756250074CF51 /* NptDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA454192756240074CF51 /* NptDynamicLibraries.cpp */; }; + 7CCDA7BD192756250074CF51 /* NptDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA454192756240074CF51 /* NptDynamicLibraries.cpp */; }; 7CCDA7BE192756250074CF51 /* NptFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA456192756240074CF51 /* NptFile.cpp */; }; 7CCDA7BF192756250074CF51 /* NptFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA456192756240074CF51 /* NptFile.cpp */; }; + 7CCDA7C0192756250074CF51 /* NptFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA456192756240074CF51 /* NptFile.cpp */; }; 7CCDA7C7192756250074CF51 /* NptHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA45A192756240074CF51 /* NptHash.cpp */; }; 7CCDA7C8192756250074CF51 /* NptHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA45A192756240074CF51 /* NptHash.cpp */; }; + 7CCDA7C9192756250074CF51 /* NptHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA45A192756240074CF51 /* NptHash.cpp */; }; 7CCDA7D0192756250074CF51 /* NptHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA45E192756240074CF51 /* NptHttp.cpp */; }; 7CCDA7D1192756250074CF51 /* NptHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA45E192756240074CF51 /* NptHttp.cpp */; }; + 7CCDA7D2192756250074CF51 /* NptHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA45E192756240074CF51 /* NptHttp.cpp */; }; 7CCDA7D9192756250074CF51 /* NptJson.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA463192756240074CF51 /* NptJson.cpp */; }; 7CCDA7DA192756250074CF51 /* NptJson.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA463192756240074CF51 /* NptJson.cpp */; }; + 7CCDA7DB192756250074CF51 /* NptJson.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA463192756240074CF51 /* NptJson.cpp */; }; 7CCDA7DC192756250074CF51 /* NptList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA465192756240074CF51 /* NptList.cpp */; }; 7CCDA7DD192756250074CF51 /* NptList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA465192756240074CF51 /* NptList.cpp */; }; + 7CCDA7DE192756250074CF51 /* NptList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA465192756240074CF51 /* NptList.cpp */; }; 7CCDA7E5192756250074CF51 /* NptLogging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA469192756240074CF51 /* NptLogging.cpp */; }; 7CCDA7E6192756250074CF51 /* NptLogging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA469192756240074CF51 /* NptLogging.cpp */; }; + 7CCDA7E7192756250074CF51 /* NptLogging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA469192756240074CF51 /* NptLogging.cpp */; }; 7CCDA7E8192756250074CF51 /* NptMessaging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA46C192756240074CF51 /* NptMessaging.cpp */; }; 7CCDA7E9192756250074CF51 /* NptMessaging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA46C192756240074CF51 /* NptMessaging.cpp */; }; + 7CCDA7EA192756250074CF51 /* NptMessaging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA46C192756240074CF51 /* NptMessaging.cpp */; }; 7CCDA7F1192756250074CF51 /* NptNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA470192756240074CF51 /* NptNetwork.cpp */; }; 7CCDA7F2192756250074CF51 /* NptNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA470192756240074CF51 /* NptNetwork.cpp */; }; + 7CCDA7F3192756250074CF51 /* NptNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA470192756240074CF51 /* NptNetwork.cpp */; }; 7CCDA7FA192756250074CF51 /* NptQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA474192756240074CF51 /* NptQueue.cpp */; }; 7CCDA7FB192756250074CF51 /* NptQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA474192756240074CF51 /* NptQueue.cpp */; }; + 7CCDA7FC192756250074CF51 /* NptQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA474192756240074CF51 /* NptQueue.cpp */; }; 7CCDA803192756250074CF51 /* NptResults.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA479192756240074CF51 /* NptResults.cpp */; }; 7CCDA804192756250074CF51 /* NptResults.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA479192756240074CF51 /* NptResults.cpp */; }; + 7CCDA805192756250074CF51 /* NptResults.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA479192756240074CF51 /* NptResults.cpp */; }; 7CCDA806192756250074CF51 /* NptRingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA47B192756240074CF51 /* NptRingBuffer.cpp */; }; 7CCDA807192756250074CF51 /* NptRingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA47B192756240074CF51 /* NptRingBuffer.cpp */; }; + 7CCDA808192756250074CF51 /* NptRingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA47B192756240074CF51 /* NptRingBuffer.cpp */; }; 7CCDA80F192756250074CF51 /* NptSimpleMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA481192756240074CF51 /* NptSimpleMessageQueue.cpp */; }; 7CCDA810192756250074CF51 /* NptSimpleMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA481192756240074CF51 /* NptSimpleMessageQueue.cpp */; }; + 7CCDA811192756250074CF51 /* NptSimpleMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA481192756240074CF51 /* NptSimpleMessageQueue.cpp */; }; 7CCDA818192756250074CF51 /* NptSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA485192756240074CF51 /* NptSockets.cpp */; }; 7CCDA819192756250074CF51 /* NptSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA485192756240074CF51 /* NptSockets.cpp */; }; + 7CCDA81A192756250074CF51 /* NptSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA485192756240074CF51 /* NptSockets.cpp */; }; 7CCDA821192756250074CF51 /* NptStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA48A192756240074CF51 /* NptStreams.cpp */; }; 7CCDA822192756250074CF51 /* NptStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA48A192756240074CF51 /* NptStreams.cpp */; }; + 7CCDA823192756250074CF51 /* NptStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA48A192756240074CF51 /* NptStreams.cpp */; }; 7CCDA82A192756250074CF51 /* NptStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA48E192756240074CF51 /* NptStrings.cpp */; }; 7CCDA82B192756250074CF51 /* NptStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA48E192756240074CF51 /* NptStrings.cpp */; }; + 7CCDA82C192756250074CF51 /* NptStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA48E192756240074CF51 /* NptStrings.cpp */; }; 7CCDA833192756250074CF51 /* NptSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA492192756240074CF51 /* NptSystem.cpp */; }; 7CCDA834192756250074CF51 /* NptSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA492192756240074CF51 /* NptSystem.cpp */; }; + 7CCDA835192756250074CF51 /* NptSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA492192756240074CF51 /* NptSystem.cpp */; }; 7CCDA83C192756250074CF51 /* NptThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA496192756240074CF51 /* NptThreads.cpp */; }; 7CCDA83D192756250074CF51 /* NptThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA496192756240074CF51 /* NptThreads.cpp */; }; + 7CCDA83E192756250074CF51 /* NptThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA496192756240074CF51 /* NptThreads.cpp */; }; 7CCDA845192756250074CF51 /* NptTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA49A192756240074CF51 /* NptTime.cpp */; }; 7CCDA846192756250074CF51 /* NptTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA49A192756240074CF51 /* NptTime.cpp */; }; + 7CCDA847192756250074CF51 /* NptTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA49A192756240074CF51 /* NptTime.cpp */; }; 7CCDA84E192756250074CF51 /* NptTls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA49E192756240074CF51 /* NptTls.cpp */; }; 7CCDA84F192756250074CF51 /* NptTls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA49E192756240074CF51 /* NptTls.cpp */; }; + 7CCDA850192756250074CF51 /* NptTls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA49E192756240074CF51 /* NptTls.cpp */; }; 7CCDA851192756250074CF51 /* NptUri.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4A3192756240074CF51 /* NptUri.cpp */; }; 7CCDA852192756250074CF51 /* NptUri.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4A3192756240074CF51 /* NptUri.cpp */; }; + 7CCDA853192756250074CF51 /* NptUri.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4A3192756240074CF51 /* NptUri.cpp */; }; 7CCDA85A192756250074CF51 /* NptUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4A7192756240074CF51 /* NptUtils.cpp */; }; 7CCDA85B192756250074CF51 /* NptUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4A7192756240074CF51 /* NptUtils.cpp */; }; + 7CCDA85C192756250074CF51 /* NptUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4A7192756240074CF51 /* NptUtils.cpp */; }; 7CCDA863192756250074CF51 /* NptXml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4AC192756240074CF51 /* NptXml.cpp */; }; 7CCDA864192756250074CF51 /* NptXml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4AC192756240074CF51 /* NptXml.cpp */; }; + 7CCDA865192756250074CF51 /* NptXml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4AC192756240074CF51 /* NptXml.cpp */; }; 7CCDA86C192756250074CF51 /* NptZip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B0192756240074CF51 /* NptZip.cpp */; }; 7CCDA86D192756250074CF51 /* NptZip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B0192756240074CF51 /* NptZip.cpp */; }; + 7CCDA86E192756250074CF51 /* NptZip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B0192756240074CF51 /* NptZip.cpp */; }; 7CCDAA82192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA56F192756240074CF51 /* NptPosixDynamicLibraries.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAA83192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA56F192756240074CF51 /* NptPosixDynamicLibraries.cpp */; }; + 7CCDAA84192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA56F192756240074CF51 /* NptPosixDynamicLibraries.cpp */; }; 7CCDAA85192756250074CF51 /* NptPosixEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA570192756240074CF51 /* NptPosixEnvironment.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAA86192756250074CF51 /* NptPosixEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA570192756240074CF51 /* NptPosixEnvironment.cpp */; }; + 7CCDAA87192756250074CF51 /* NptPosixEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA570192756240074CF51 /* NptPosixEnvironment.cpp */; }; 7CCDAA8B192756250074CF51 /* NptPosixNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA572192756240074CF51 /* NptPosixNetwork.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAA8C192756250074CF51 /* NptPosixNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA572192756240074CF51 /* NptPosixNetwork.cpp */; }; + 7CCDAA8D192756250074CF51 /* NptPosixNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA572192756240074CF51 /* NptPosixNetwork.cpp */; }; 7CCDAA8E192756250074CF51 /* NptPosixQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA573192756240074CF51 /* NptPosixQueue.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAA8F192756250074CF51 /* NptPosixQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA573192756240074CF51 /* NptPosixQueue.cpp */; }; + 7CCDAA90192756250074CF51 /* NptPosixQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA573192756240074CF51 /* NptPosixQueue.cpp */; }; 7CCDAA97192756250074CF51 /* NptPosixSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA576192756240074CF51 /* NptPosixSystem.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAA98192756250074CF51 /* NptPosixSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA576192756240074CF51 /* NptPosixSystem.cpp */; }; + 7CCDAA99192756250074CF51 /* NptPosixSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA576192756240074CF51 /* NptPosixSystem.cpp */; }; 7CCDAAA0192756250074CF51 /* NptPosixThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA579192756240074CF51 /* NptPosixThreads.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAAA1192756250074CF51 /* NptPosixThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA579192756240074CF51 /* NptPosixThreads.cpp */; }; + 7CCDAAA2192756250074CF51 /* NptPosixThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA579192756240074CF51 /* NptPosixThreads.cpp */; }; 7CCDAAA9192756250074CF51 /* NptPosixTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA57C192756240074CF51 /* NptPosixTime.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAAAA192756250074CF51 /* NptPosixTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA57C192756240074CF51 /* NptPosixTime.cpp */; }; + 7CCDAAAB192756250074CF51 /* NptPosixTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA57C192756240074CF51 /* NptPosixTime.cpp */; }; 7CCDAAB2192756250074CF51 /* NptSelectableMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA57F192756240074CF51 /* NptSelectableMessageQueue.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAAB3192756250074CF51 /* NptSelectableMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA57F192756240074CF51 /* NptSelectableMessageQueue.cpp */; }; + 7CCDAAB4192756250074CF51 /* NptSelectableMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA57F192756240074CF51 /* NptSelectableMessageQueue.cpp */; }; 7CCDAC8619275CA70074CF51 /* NptBsdNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC7F19275CA70074CF51 /* NptBsdNetwork.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAC8719275CA70074CF51 /* NptBsdNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC7F19275CA70074CF51 /* NptBsdNetwork.cpp */; }; + 7CCDAC8819275CA70074CF51 /* NptBsdNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC7F19275CA70074CF51 /* NptBsdNetwork.cpp */; }; 7CCDAC8F19275CA70074CF51 /* NptBsdResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC8219275CA70074CF51 /* NptBsdResolver.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAC9019275CA70074CF51 /* NptBsdResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC8219275CA70074CF51 /* NptBsdResolver.cpp */; }; + 7CCDAC9119275CA70074CF51 /* NptBsdResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC8219275CA70074CF51 /* NptBsdResolver.cpp */; }; 7CCDAC9219275CA70074CF51 /* NptBsdSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC8319275CA70074CF51 /* NptBsdSockets.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAC9319275CA70074CF51 /* NptBsdSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC8319275CA70074CF51 /* NptBsdSockets.cpp */; }; + 7CCDAC9419275CA70074CF51 /* NptBsdSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC8319275CA70074CF51 /* NptBsdSockets.cpp */; }; 7CCDACA719275D1F0074CF51 /* NptStdcDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC9D19275D1E0074CF51 /* NptStdcDebug.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDACA819275D1F0074CF51 /* NptStdcDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC9D19275D1E0074CF51 /* NptStdcDebug.cpp */; }; + 7CCDACA919275D1F0074CF51 /* NptStdcDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDAC9D19275D1E0074CF51 /* NptStdcDebug.cpp */; }; 7CCDACB019275D1F0074CF51 /* NptStdcEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACA019275D1E0074CF51 /* NptStdcEnvironment.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDACB119275D1F0074CF51 /* NptStdcEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACA019275D1E0074CF51 /* NptStdcEnvironment.cpp */; }; + 7CCDACB219275D1F0074CF51 /* NptStdcEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACA019275D1E0074CF51 /* NptStdcEnvironment.cpp */; }; 7CCDACC119275D790074CF51 /* NptAppleAutoreleasePool.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACBD19275D790074CF51 /* NptAppleAutoreleasePool.mm */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDACC219275D790074CF51 /* NptAppleAutoreleasePool.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACBD19275D790074CF51 /* NptAppleAutoreleasePool.mm */; }; + 7CCDACC319275D790074CF51 /* NptAppleAutoreleasePool.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACBD19275D790074CF51 /* NptAppleAutoreleasePool.mm */; }; 7CCDACCA19275D790074CF51 /* NptAppleLogConfig.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACC019275D790074CF51 /* NptAppleLogConfig.mm */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDACCB19275D790074CF51 /* NptAppleLogConfig.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACC019275D790074CF51 /* NptAppleLogConfig.mm */; }; + 7CCDACCC19275D790074CF51 /* NptAppleLogConfig.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACC019275D790074CF51 /* NptAppleLogConfig.mm */; }; + 7CCF7F1D1069F3AE00992676 /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */; }; 7CCF7FC9106A0DF500992676 /* TimeUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7FC7106A0DF500992676 /* TimeUtils.cpp */; }; 7CDAE9050FFCA3520040B25F /* DVDTSCorrection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAE9030FFCA3520040B25F /* DVDTSCorrection.cpp */; }; + 7CDAEA7D1001CD6E0040B25F /* karaokelyricstextustar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */; }; 7CEBD8A80F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEBD8A60F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp */; }; 7CEE2E5B13D6B71E000ABF2A /* TimeSmoother.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEE2E5913D6B71E000ABF2A /* TimeSmoother.cpp */; }; - 7CEE587D1B5A3FFB007C2B5A /* AudioDSPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEE587C1B5A3FFB007C2B5A /* AudioDSPSettings.cpp */; }; - 7CEE587E1B5A3FFB007C2B5A /* AudioDSPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEE587C1B5A3FFB007C2B5A /* AudioDSPSettings.cpp */; }; 7CF0504B190A1D7200222135 /* FFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF05049190A1D7200222135 /* FFmpeg.cpp */; }; 7CF0504C190A1D7200222135 /* FFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF05049190A1D7200222135 /* FFmpeg.cpp */; }; + 7CF0504D190A1D7200222135 /* FFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF05049190A1D7200222135 /* FFmpeg.cpp */; }; 7CF05056191195DA00222135 /* MediaType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF05051191195DA00222135 /* MediaType.cpp */; }; 7CF05057191195DA00222135 /* MediaType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF05051191195DA00222135 /* MediaType.cpp */; }; + 7CF05058191195DA00222135 /* MediaType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF05051191195DA00222135 /* MediaType.cpp */; }; 7CF1FB0C123B1AF000B2CBCB /* Variant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF1FB09123B1AF000B2CBCB /* Variant.cpp */; }; 7CF34D9F1930264A00D543C5 /* AudioEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF34D9D1930264A00D543C5 /* AudioEncoder.cpp */; }; 7CF34DA01930264A00D543C5 /* AudioEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF34D9D1930264A00D543C5 /* AudioEncoder.cpp */; }; + 7CF34DA11930264A00D543C5 /* AudioEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF34D9D1930264A00D543C5 /* AudioEncoder.cpp */; }; 7CF80DC919710DC2003B2B34 /* KeyboardLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF80DC719710DC2003B2B34 /* KeyboardLayout.cpp */; }; 7CF80DCA19710DC2003B2B34 /* KeyboardLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF80DC719710DC2003B2B34 /* KeyboardLayout.cpp */; }; + 7CF80DCB19710DC2003B2B34 /* KeyboardLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF80DC719710DC2003B2B34 /* KeyboardLayout.cpp */; }; 815EE6350E17F1DC009FBE3C /* DVDInputStreamRTMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 815EE6330E17F1DC009FBE3C /* DVDInputStreamRTMP.cpp */; }; 820023DB171A28A300667D1C /* OSXTextInputResponder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 820023DA171A28A300667D1C /* OSXTextInputResponder.mm */; }; + 83A72B970FBC8E3B00171871 /* LockFree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A72B950FBC8E3B00171871 /* LockFree.cpp */; settings = {COMPILER_FLAGS = "-O0"; }; }; 83E0B2490F7C95FF0091643F /* Atomics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83E0B2480F7C95FF0091643F /* Atomics.cpp */; }; 880DBE4E0DC223FF00E26B71 /* MediaSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 880DBE4B0DC223FF00E26B71 /* MediaSource.cpp */; }; 880DBE550DC224A100E26B71 /* MusicFileDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 880DBE530DC224A100E26B71 /* MusicFileDirectory.cpp */; }; @@ -610,22 +746,20 @@ 8883CEA80DD81807004E8B72 /* DVDSubtitlesLibass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8883CEA50DD81807004E8B72 /* DVDSubtitlesLibass.cpp */; }; 889B4D8E0E0EF86C00FAD25E /* RSSDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 889B4D8C0E0EF86C00FAD25E /* RSSDirectory.cpp */; }; AE32174218313ADF0003FAFC /* XSLTUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE4E87A517354C4A00D15206 /* XSLTUtils.cpp */; }; + AE32174318313AE10003FAFC /* XSLTUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE4E87A517354C4A00D15206 /* XSLTUtils.cpp */; }; AE4E87A717354C4A00D15206 /* XSLTUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE4E87A517354C4A00D15206 /* XSLTUtils.cpp */; }; AE84CB5A15A5B8A600A3810E /* TagLibVFSStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE84CB5915A5B8A600A3810E /* TagLibVFSStream.cpp */; }; AE89ACA61621DAB800E17DBC /* DVDDemuxBXA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE89ACA41621DAB800E17DBC /* DVDDemuxBXA.cpp */; }; AEC0083115ACAC6E0099888C /* TagLoaderTagLib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AEC0083015ACAC6E0099888C /* TagLoaderTagLib.cpp */; }; - B179BD6B1AD8EA7B00EA8D49 /* InputCodingTableBaiduPY.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B179BD651AD8EA7B00EA8D49 /* InputCodingTableBaiduPY.cpp */; }; - B179BD6C1AD8EA7B00EA8D49 /* InputCodingTableBaiduPY.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B179BD651AD8EA7B00EA8D49 /* InputCodingTableBaiduPY.cpp */; }; - B179BD6E1AD8EA7B00EA8D49 /* InputCodingTableBasePY.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B179BD671AD8EA7B00EA8D49 /* InputCodingTableBasePY.cpp */; }; - B179BD6F1AD8EA7B00EA8D49 /* InputCodingTableBasePY.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B179BD671AD8EA7B00EA8D49 /* InputCodingTableBasePY.cpp */; }; - B179BD711AD8EA7B00EA8D49 /* InputCodingTableFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B179BD691AD8EA7B00EA8D49 /* InputCodingTableFactory.cpp */; }; - B179BD721AD8EA7B00EA8D49 /* InputCodingTableFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B179BD691AD8EA7B00EA8D49 /* InputCodingTableFactory.cpp */; }; B5011E4119AF3B56005ADF89 /* PosixFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5011E3F19AF3B56005ADF89 /* PosixFile.cpp */; }; B5011E4219AF3B56005ADF89 /* PosixFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5011E3F19AF3B56005ADF89 /* PosixFile.cpp */; }; + B5011E4319AF3B56005ADF89 /* PosixFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5011E3F19AF3B56005ADF89 /* PosixFile.cpp */; }; B5101B5819DFF8DD00294D1E /* BlurayFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5101B5719DFF8DD00294D1E /* BlurayFile.cpp */; }; B5101B5919DFF8E300294D1E /* BlurayFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5101B5719DFF8DD00294D1E /* BlurayFile.cpp */; }; + B5101B5A19DFF8E400294D1E /* BlurayFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5101B5719DFF8DD00294D1E /* BlurayFile.cpp */; }; B542632B197D353B00726998 /* PosixInterfaceForCLog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5426329197D353B00726998 /* PosixInterfaceForCLog.cpp */; }; B542632C197D353B00726998 /* PosixInterfaceForCLog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5426329197D353B00726998 /* PosixInterfaceForCLog.cpp */; }; + B542632D197D353B00726998 /* PosixInterfaceForCLog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5426329197D353B00726998 /* PosixInterfaceForCLog.cpp */; }; C807114D135DB5CC002F601B /* InputOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C807114B135DB5CC002F601B /* InputOperations.cpp */; }; C84828C0156CFCD8005A996F /* PVRClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482874156CFCD8005A996F /* PVRClient.cpp */; }; C84828C1156CFCD8005A996F /* PVRClients.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482876156CFCD8005A996F /* PVRClients.cpp */; }; @@ -679,66 +813,44 @@ C8EC5D0E1369519D00CCC10D /* XBMC_keytable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8EC5D0C1369519D00CCC10D /* XBMC_keytable.cpp */; }; DF00492D162DAEA200A971AD /* PVROperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF00492B162DAEA200A971AD /* PVROperations.cpp */; }; DF02BA621A910623006DCA16 /* VideoSyncIos.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF02BA601A910623006DCA16 /* VideoSyncIos.cpp */; }; + DF02BA631A910624006DCA16 /* VideoSyncIos.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF02BA601A910623006DCA16 /* VideoSyncIos.cpp */; }; DF02BA661A91065F006DCA16 /* VideoSyncOsx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF02BA641A91065F006DCA16 /* VideoSyncOsx.cpp */; }; DF033D381946612400BFC82E /* AEDeviceEnumerationOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF033D361946612400BFC82E /* AEDeviceEnumerationOSX.cpp */; }; + DF07252E168734D7008DCAAD /* karaokevideobackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */; }; DF072534168734ED008DCAAD /* FFmpegVideoDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF072532168734ED008DCAAD /* FFmpegVideoDecoder.cpp */; }; DF0ABB73183A94A30018445D /* Utf8Utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0ABB71183A94A30018445D /* Utf8Utils.cpp */; }; DF0ABB74183A94A30018445D /* Utf8Utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0ABB71183A94A30018445D /* Utf8Utils.cpp */; }; + DF0ABB75183A94A30018445D /* Utf8Utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0ABB71183A94A30018445D /* Utf8Utils.cpp */; }; DF0DF15C13A3ADA7008ED511 /* NFSDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0DF15913A3ADA7008ED511 /* NFSDirectory.cpp */; }; - DF0E4AC51AD597ED00A75430 /* DVDPlayerRadioRDS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E4AC31AD597ED00A75430 /* DVDPlayerRadioRDS.cpp */; }; - DF0E4AC61AD597ED00A75430 /* DVDPlayerRadioRDS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E4AC31AD597ED00A75430 /* DVDPlayerRadioRDS.cpp */; }; - DF0E4ACA1AD5982500A75430 /* InfoTagRadioRDS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E4AC81AD5982500A75430 /* InfoTagRadioRDS.cpp */; }; - DF0E4ACB1AD5982500A75430 /* InfoTagRadioRDS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E4AC81AD5982500A75430 /* InfoTagRadioRDS.cpp */; }; - DF0E4ACF1AD5984600A75430 /* PVRRadioRDSInfoTag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E4ACD1AD5984600A75430 /* PVRRadioRDSInfoTag.cpp */; }; - DF0E4AD01AD5984600A75430 /* PVRRadioRDSInfoTag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E4ACD1AD5984600A75430 /* PVRRadioRDSInfoTag.cpp */; }; - DF0E4AD41AD5986F00A75430 /* GUIDialogPVRRadioRDSInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E4AD21AD5986F00A75430 /* GUIDialogPVRRadioRDSInfo.cpp */; }; - DF0E4AD51AD5986F00A75430 /* GUIDialogPVRRadioRDSInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0E4AD21AD5986F00A75430 /* GUIDialogPVRRadioRDSInfo.cpp */; }; DF14CF7E1A77782E00396CC9 /* InputManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF14CF7C1A77782E00396CC9 /* InputManager.cpp */; }; DF14CF7F1A77782E00396CC9 /* InputManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF14CF7C1A77782E00396CC9 /* InputManager.cpp */; }; - DF1D2DED1B6E85EE002BB9DB /* XbtDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1D2DE71B6E85EE002BB9DB /* XbtDirectory.cpp */; }; - DF1D2DEE1B6E85EE002BB9DB /* XbtDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1D2DE71B6E85EE002BB9DB /* XbtDirectory.cpp */; }; - DF1D2DF01B6E85EE002BB9DB /* XbtFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1D2DE91B6E85EE002BB9DB /* XbtFile.cpp */; }; - DF1D2DF11B6E85EE002BB9DB /* XbtFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1D2DE91B6E85EE002BB9DB /* XbtFile.cpp */; }; - DF1D2DF31B6E85EE002BB9DB /* XbtManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1D2DEB1B6E85EE002BB9DB /* XbtManager.cpp */; }; - DF1D2DF41B6E85EE002BB9DB /* XbtManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1D2DEB1B6E85EE002BB9DB /* XbtManager.cpp */; }; + DF14CF801A77782E00396CC9 /* InputManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF14CF7C1A77782E00396CC9 /* InputManager.cpp */; }; DF2345E115FA639500A934F6 /* UPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345D915FA639500A934F6 /* UPnP.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; DF2345E215FA639500A934F6 /* UPnPInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DB15FA639500A934F6 /* UPnPInternal.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; DF2345E315FA639500A934F6 /* UPnPRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DD15FA639500A934F6 /* UPnPRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; DF2345E415FA639500A934F6 /* UPnPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DF15FA639500A934F6 /* UPnPServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; - DF2401261B41A26F001E02DA /* ImageResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2401241B41A26E001E02DA /* ImageResource.cpp */; }; - DF2401271B41A26F001E02DA /* ImageResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2401241B41A26E001E02DA /* ImageResource.cpp */; }; - DF2863B719918B07008994AB /* Gif.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2863B519918B07008994AB /* Gif.cpp */; }; - DF2863B819918B07008994AB /* Gif.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2863B519918B07008994AB /* Gif.cpp */; }; DF28DF4D17B8379E0077F41A /* ProfilesOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28DF4B17B8379E0077F41A /* ProfilesOperations.cpp */; }; DF28DF4E17B8379E0077F41A /* ProfilesOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28DF4B17B8379E0077F41A /* ProfilesOperations.cpp */; }; + DF28DF4F17B8379E0077F41A /* ProfilesOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28DF4B17B8379E0077F41A /* ProfilesOperations.cpp */; }; DF28EDA2170E1A11005FA9D2 /* GUIDialogLockSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28ED94170E1A11005FA9D2 /* GUIDialogLockSettings.cpp */; }; DF28EDA3170E1A11005FA9D2 /* GUIDialogProfileSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28ED96170E1A11005FA9D2 /* GUIDialogProfileSettings.cpp */; }; DF28EDA6170E1A11005FA9D2 /* Profile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28ED9A170E1A11005FA9D2 /* Profile.cpp */; }; DF28EDA7170E1A11005FA9D2 /* ProfilesManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28ED9C170E1A11005FA9D2 /* ProfilesManager.cpp */; }; DF28EDA8170E1A11005FA9D2 /* GUIWindowSettingsProfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28ED9F170E1A11005FA9D2 /* GUIWindowSettingsProfile.cpp */; }; DF28EE03170E1E51005FA9D2 /* DisplaySettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28EE01170E1E51005FA9D2 /* DisplaySettings.cpp */; }; - DF29BCE81B5D911700904347 /* AddonEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCD51B5D911700904347 /* AddonEvent.cpp */; }; - DF29BCE91B5D911800904347 /* AddonEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCD51B5D911700904347 /* AddonEvent.cpp */; }; - DF29BCEB1B5D911800904347 /* AddonManagementEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCD71B5D911700904347 /* AddonManagementEvent.cpp */; }; - DF29BCEC1B5D911800904347 /* AddonManagementEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCD71B5D911700904347 /* AddonManagementEvent.cpp */; }; - DF29BCEE1B5D911800904347 /* BaseEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCD91B5D911700904347 /* BaseEvent.cpp */; }; - DF29BCEF1B5D911800904347 /* BaseEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCD91B5D911700904347 /* BaseEvent.cpp */; }; - DF29BCF11B5D911800904347 /* EventLog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCDB1B5D911700904347 /* EventLog.cpp */; }; - DF29BCF21B5D911800904347 /* EventLog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCDB1B5D911700904347 /* EventLog.cpp */; }; - DF29BCF71B5D911800904347 /* MediaLibraryEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCDF1B5D911700904347 /* MediaLibraryEvent.cpp */; }; - DF29BCF81B5D911800904347 /* MediaLibraryEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCDF1B5D911700904347 /* MediaLibraryEvent.cpp */; }; - DF29BCFA1B5D911800904347 /* GUIViewStateEventLog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCE41B5D911700904347 /* GUIViewStateEventLog.cpp */; }; - DF29BCFB1B5D911800904347 /* GUIViewStateEventLog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCE41B5D911700904347 /* GUIViewStateEventLog.cpp */; }; - DF29BCFD1B5D911800904347 /* GUIWindowEventLog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCE61B5D911700904347 /* GUIWindowEventLog.cpp */; }; - DF29BCFE1B5D911800904347 /* GUIWindowEventLog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BCE61B5D911700904347 /* GUIWindowEventLog.cpp */; }; - DF29BD021B5D913B00904347 /* EventsDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BD001B5D913B00904347 /* EventsDirectory.cpp */; }; - DF29BD031B5D913B00904347 /* EventsDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF29BD001B5D913B00904347 /* EventsDirectory.cpp */; }; DF32466219E931A8005E8CFB /* ActiveAEResampleFFMPEG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF32466019E931A8005E8CFB /* ActiveAEResampleFFMPEG.cpp */; }; DF32466319E931A8005E8CFB /* ActiveAEResampleFFMPEG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF32466019E931A8005E8CFB /* ActiveAEResampleFFMPEG.cpp */; }; + DF32466419E931A8005E8CFB /* ActiveAEResampleFFMPEG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF32466019E931A8005E8CFB /* ActiveAEResampleFFMPEG.cpp */; }; DF3488E713FD958F0026A711 /* GUIAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF3488E513FD958F0026A711 /* GUIAction.cpp */; }; DF34892A13FD9C780026A711 /* AirPlayServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF34892813FD9C780026A711 /* AirPlayServer.cpp */; }; DF34898213FDAAF60026A711 /* HttpParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF34898113FDAAF60026A711 /* HttpParser.cpp */; }; DF374B2418AC2BA20076B514 /* CoreAudioHelpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8AE852189DE47400C33786 /* CoreAudioHelpers.cpp */; }; + DF374B2518AC2BA20076B514 /* CoreAudioHelpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8AE852189DE47400C33786 /* CoreAudioHelpers.cpp */; }; + DF3C3C0E1752A7EE000989C3 /* IOSEAGLView.mm in Sources */ = {isa = PBXBuildFile; fileRef = E49910D7174E4A6400741B6D /* IOSEAGLView.mm */; }; + DF3C3C0F1752A7EE000989C3 /* IOSExternalTouchController.mm in Sources */ = {isa = PBXBuildFile; fileRef = E49910D9174E4A6400741B6D /* IOSExternalTouchController.mm */; }; + DF3C3C101752A7EE000989C3 /* IOSScreenManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = E49910DB174E4A6400741B6D /* IOSScreenManager.mm */; }; + DF3E5EFA199D41300039675D /* kodiclientwrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = DF3E5EF9199D41300039675D /* kodiclientwrapper.mm */; }; + DF3E5EFD199D4B340039675D /* KodiController.mm in Sources */ = {isa = PBXBuildFile; fileRef = DF3E5EFC199D4B340039675D /* KodiController.mm */; }; DF402A581644613B001C56B8 /* AddonModuleXbmc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1ACFD115FCE50700E10810 /* AddonModuleXbmc.cpp */; }; DF402A591644613B001C56B8 /* AddonModuleXbmcaddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1ACFD515FCE50700E10810 /* AddonModuleXbmcaddon.cpp */; }; DF402A5A1644613B001C56B8 /* AddonModuleXbmcgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1ACFD915FCE50700E10810 /* AddonModuleXbmcgui.cpp */; }; @@ -751,21 +863,25 @@ DF404A3916B9896C00D8023E /* cximage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF404A3416B9896C00D8023E /* cximage.cpp */; }; DF404A3A16B9896C00D8023E /* imagefactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF404A3716B9896C00D8023E /* imagefactory.cpp */; }; DF40BC1E178B4BEC009DB567 /* PythonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF40BC1C178B4BEC009DB567 /* PythonInvoker.cpp */; }; + DF40BC1F178B4BEC009DB567 /* PythonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF40BC1C178B4BEC009DB567 /* PythonInvoker.cpp */; }; DF40BC20178B4BEC009DB567 /* PythonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF40BC1C178B4BEC009DB567 /* PythonInvoker.cpp */; }; DF40BC29178B4C07009DB567 /* LanguageInvokerThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF40BC24178B4C07009DB567 /* LanguageInvokerThread.cpp */; }; DF40BC2B178B4C07009DB567 /* ScriptInvocationManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF40BC27178B4C07009DB567 /* ScriptInvocationManager.cpp */; }; + DF40BC2C178B4C07009DB567 /* LanguageInvokerThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF40BC24178B4C07009DB567 /* LanguageInvokerThread.cpp */; }; + DF40BC2E178B4C07009DB567 /* ScriptInvocationManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF40BC27178B4C07009DB567 /* ScriptInvocationManager.cpp */; }; DF40BC2F178B4C07009DB567 /* LanguageInvokerThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF40BC24178B4C07009DB567 /* LanguageInvokerThread.cpp */; }; DF40BC31178B4C07009DB567 /* ScriptInvocationManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF40BC27178B4C07009DB567 /* ScriptInvocationManager.cpp */; }; DF448457140048A60069344B /* AirTunesServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF448455140048A60069344B /* AirTunesServer.cpp */; }; DF44845E140048C80069344B /* PipesManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF44845B140048C80069344B /* PipesManager.cpp */; }; - DF4A3BB21B4B0FC100F9CDC0 /* ApplicationMessenger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF4A3BAD1B4B0FC100F9CDC0 /* ApplicationMessenger.cpp */; }; - DF4A3BB31B4B0FC100F9CDC0 /* ApplicationMessenger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF4A3BAD1B4B0FC100F9CDC0 /* ApplicationMessenger.cpp */; }; DF4BF0151A4EF30F0053AC56 /* cc_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = DF4BF0111A4EF30F0053AC56 /* cc_decoder.c */; }; DF4BF0161A4EF30F0053AC56 /* cc_decoder708.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF4BF0131A4EF30F0053AC56 /* cc_decoder708.cpp */; }; DF4BF0171A4EF31E0053AC56 /* cc_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = DF4BF0111A4EF30F0053AC56 /* cc_decoder.c */; }; DF4BF0181A4EF31E0053AC56 /* cc_decoder708.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF4BF0131A4EF30F0053AC56 /* cc_decoder708.cpp */; }; + DF4BF0191A4EF31F0053AC56 /* cc_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = DF4BF0111A4EF30F0053AC56 /* cc_decoder.c */; }; + DF4BF01A1A4EF31F0053AC56 /* cc_decoder708.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF4BF0131A4EF30F0053AC56 /* cc_decoder708.cpp */; }; DF4BF01D1A4EF3410053AC56 /* DVDDemuxCC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF4BF01B1A4EF3410053AC56 /* DVDDemuxCC.cpp */; }; DF4BF01E1A4EF3410053AC56 /* DVDDemuxCC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF4BF01B1A4EF3410053AC56 /* DVDDemuxCC.cpp */; }; + DF4BF01F1A4EF3410053AC56 /* DVDDemuxCC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF4BF01B1A4EF3410053AC56 /* DVDDemuxCC.cpp */; }; DF52566D1732C1890094A464 /* DVDDemuxCDDA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52566B1732C1890094A464 /* DVDDemuxCDDA.cpp */; }; DF5276E1151BAEDA00B5B63B /* Base64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52769A151BAEDA00B5B63B /* Base64.cpp */; }; DF5276E2151BAEDA00B5B63B /* HttpResponse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52769C151BAEDA00B5B63B /* HttpResponse.cpp */; }; @@ -774,27 +890,24 @@ DF527736151BAF4C00B5B63B /* WebSocketV13.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52772F151BAF4C00B5B63B /* WebSocketV13.cpp */; }; DF527737151BAF4C00B5B63B /* WebSocketV8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF527731151BAF4C00B5B63B /* WebSocketV8.cpp */; }; DF529BAE1741697B00523FB4 /* Environment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF529BAC1741697B00523FB4 /* Environment.cpp */; }; - DF54F7FE1B6580AD000FCBA4 /* ContextMenuItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF54F7FC1B6580AC000FCBA4 /* ContextMenuItem.cpp */; }; - DF54F7FF1B6580AD000FCBA4 /* ContextMenuItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF54F7FC1B6580AC000FCBA4 /* ContextMenuItem.cpp */; }; - DF54F8031B6580C8000FCBA4 /* ContextMenuAddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF54F8011B6580C8000FCBA4 /* ContextMenuAddon.cpp */; }; - DF54F8041B6580C8000FCBA4 /* ContextMenuAddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF54F8011B6580C8000FCBA4 /* ContextMenuAddon.cpp */; }; DF56EF1F1A798A3F00CAAEFB /* HTTPFileHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF56EF1D1A798A3F00CAAEFB /* HTTPFileHandler.cpp */; }; DF56EF201A798A3F00CAAEFB /* HTTPFileHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF56EF1D1A798A3F00CAAEFB /* HTTPFileHandler.cpp */; }; + DF56EF211A798A3F00CAAEFB /* HTTPFileHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF56EF1D1A798A3F00CAAEFB /* HTTPFileHandler.cpp */; }; DF56EF241A798A5E00CAAEFB /* HttpRangeUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF56EF221A798A5E00CAAEFB /* HttpRangeUtils.cpp */; }; DF56EF251A798A5E00CAAEFB /* HttpRangeUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF56EF221A798A5E00CAAEFB /* HttpRangeUtils.cpp */; }; - DF5E699A1B28121E009A88C3 /* PVRTimerType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF5E69981B28121E009A88C3 /* PVRTimerType.cpp */; }; - DF5E699B1B28121E009A88C3 /* PVRTimerType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF5E69981B28121E009A88C3 /* PVRTimerType.cpp */; }; + DF56EF261A798A5E00CAAEFB /* HttpRangeUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF56EF221A798A5E00CAAEFB /* HttpRangeUtils.cpp */; }; DF64FE3D16C07AAA00D028FB /* GUIViewControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF64FE3516C07AAA00D028FB /* GUIViewControl.cpp */; }; DF64FE3E16C07AAA00D028FB /* GUIViewState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF64FE3716C07AAA00D028FB /* GUIViewState.cpp */; }; DF64FE4016C07AAA00D028FB /* ViewDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF64FE3A16C07AAA00D028FB /* ViewDatabase.cpp */; }; DF673AA51443819600A5A509 /* AddonManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B49FF41152BFA5001AF8A6 /* AddonManager.cpp */; }; DF6A0D811A4584E80075BBFC /* OverrideDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6A0D7D1A4584E80075BBFC /* OverrideDirectory.cpp */; }; DF6A0D821A4584E80075BBFC /* OverrideDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6A0D7D1A4584E80075BBFC /* OverrideDirectory.cpp */; }; + DF6A0D831A4584E80075BBFC /* OverrideDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6A0D7D1A4584E80075BBFC /* OverrideDirectory.cpp */; }; DF6A0D841A4584E80075BBFC /* OverrideFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6A0D7F1A4584E80075BBFC /* OverrideFile.cpp */; }; DF6A0D851A4584E80075BBFC /* OverrideFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6A0D7F1A4584E80075BBFC /* OverrideFile.cpp */; }; + DF6A0D861A4584E80075BBFC /* OverrideFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6A0D7F1A4584E80075BBFC /* OverrideFile.cpp */; }; DF6D1DFE18312525009DB64F /* OverlayRendererGUI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55D3604C1826CAB900DA66D2 /* OverlayRendererGUI.cpp */; }; - DF6F52AE1AF6D03F001BC57D /* dacp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6F52AC1AF6D03F001BC57D /* dacp.cpp */; }; - DF6F52AF1AF6D03F001BC57D /* dacp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF6F52AC1AF6D03F001BC57D /* dacp.cpp */; }; + DF6D1DFF18312525009DB64F /* OverlayRendererGUI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55D3604C1826CAB900DA66D2 /* OverlayRendererGUI.cpp */; }; DF830D0C15BB260C00602BE6 /* GUIDialogKeyboardGeneric.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF830D0A15BB260C00602BE6 /* GUIDialogKeyboardGeneric.cpp */; }; DF830D1215BB262700602BE6 /* GUIKeyboardFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF830D0F15BB262700602BE6 /* GUIKeyboardFactory.cpp */; }; DF89901C1709BB2D00B35C21 /* MediaSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF8990161709BB2D00B35C21 /* MediaSettings.cpp */; }; @@ -803,6 +916,8 @@ DF8990211709BB5400B35C21 /* ViewStateSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89901F1709BB5400B35C21 /* ViewStateSettings.cpp */; }; DF923E5D1A11536A008CDB0C /* DataCacheCore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF923E5B1A11536A008CDB0C /* DataCacheCore.cpp */; }; DF923E5E1A11536A008CDB0C /* DataCacheCore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF923E5B1A11536A008CDB0C /* DataCacheCore.cpp */; }; + DF923E5F1A11536A008CDB0C /* DataCacheCore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF923E5B1A11536A008CDB0C /* DataCacheCore.cpp */; }; + DF93D65D1444A7A3007C6459 /* SlingboxDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D65C1444A7A3007C6459 /* SlingboxDirectory.cpp */; }; DF93D69A1444A8B1007C6459 /* DirectoryCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6651444A8B0007C6459 /* DirectoryCache.cpp */; }; DF93D69B1444A8B1007C6459 /* FileCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6671444A8B0007C6459 /* FileCache.cpp */; }; DF93D69C1444A8B1007C6459 /* CDDAFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6691444A8B0007C6459 /* CDDAFile.cpp */; }; @@ -817,11 +932,14 @@ DF93D6A81444A8B1007C6459 /* RarFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6811444A8B0007C6459 /* RarFile.cpp */; }; DF93D6AA1444A8B1007C6459 /* SFTPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6851444A8B0007C6459 /* SFTPFile.cpp */; }; DF93D6AB1444A8B1007C6459 /* ShoutcastFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6871444A8B0007C6459 /* ShoutcastFile.cpp */; }; + DF93D6AC1444A8B1007C6459 /* SlingboxFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6891444A8B0007C6459 /* SlingboxFile.cpp */; }; DF93D6AD1444A8B1007C6459 /* SMBFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D68B1444A8B0007C6459 /* SMBFile.cpp */; }; DF93D6AE1444A8B1007C6459 /* SpecialProtocolFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D68D1444A8B0007C6459 /* SpecialProtocolFile.cpp */; }; DF93D6B11444A8B1007C6459 /* UDFFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6931444A8B0007C6459 /* UDFFile.cpp */; }; DF93D6B21444A8B1007C6459 /* UPnPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6951444A8B0007C6459 /* UPnPFile.cpp */; }; DF93D6B31444A8B1007C6459 /* ZipFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6971444A8B0007C6459 /* ZipFile.cpp */; }; + DF93D7F21444B54A007C6459 /* HDHomeRunFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D7F01444B54A007C6459 /* HDHomeRunFile.cpp */; }; + DF93D7F61444B568007C6459 /* HDHomeRunDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D7F51444B568007C6459 /* HDHomeRunDirectory.cpp */; }; DF98D98C1434F47D00A6EBE1 /* SkinVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF98D98A1434F47D00A6EBE1 /* SkinVariable.cpp */; }; DF9A71EE1639C8F6005ECB2E /* HTTPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF9A71EC1639C8F6005ECB2E /* HTTPFile.cpp */; }; DFA8157E16713B1200E4E597 /* WakeOnAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFA8157C16713B1200E4E597 /* WakeOnAccess.cpp */; }; @@ -866,16 +984,21 @@ DFB65FD315373AE7006B8FF1 /* AEUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FB115373AE7006B8FF1 /* AEUtil.cpp */; }; DFB6610915374E80006B8FF1 /* DVDAudioCodecPassthrough.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB6610615374E80006B8FF1 /* DVDAudioCodecPassthrough.cpp */; }; DFBB4308178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */; }; + DFBB4309178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */; }; DFBB430A178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */; }; DFBB4319178B5E6F006CC20A /* CompileInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4317178B5E6F006CC20A /* CompileInfo.cpp */; }; + DFBB431A178B5E6F006CC20A /* CompileInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4317178B5E6F006CC20A /* CompileInfo.cpp */; }; DFBB431B178B5E6F006CC20A /* CompileInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4317178B5E6F006CC20A /* CompileInfo.cpp */; }; DFBE805115F7D75700D7D102 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFBE803D15F7D72100D7D102 /* SystemConfiguration.framework */; }; DFC6F4B61AFF7CB10039A7FA /* kiss_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = DFC6F4AF1AFF7CB10039A7FA /* kiss_fft.c */; }; DFC6F4B71AFF7CB10039A7FA /* kiss_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = DFC6F4AF1AFF7CB10039A7FA /* kiss_fft.c */; }; + DFC6F4B81AFF7CB10039A7FA /* kiss_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = DFC6F4AF1AFF7CB10039A7FA /* kiss_fft.c */; }; DFC6F4B91AFF7CB10039A7FA /* kiss_fftr.c in Sources */ = {isa = PBXBuildFile; fileRef = DFC6F4B11AFF7CB10039A7FA /* kiss_fftr.c */; }; DFC6F4BA1AFF7CB10039A7FA /* kiss_fftr.c in Sources */ = {isa = PBXBuildFile; fileRef = DFC6F4B11AFF7CB10039A7FA /* kiss_fftr.c */; }; + DFC6F4BB1AFF7CB10039A7FA /* kiss_fftr.c in Sources */ = {isa = PBXBuildFile; fileRef = DFC6F4B11AFF7CB10039A7FA /* kiss_fftr.c */; }; DFC6F4C11AFF7E300039A7FA /* rfft.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC6F4BF1AFF7E300039A7FA /* rfft.cpp */; }; DFC6F4C21AFF7E300039A7FA /* rfft.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC6F4BF1AFF7E300039A7FA /* rfft.cpp */; }; + DFC6F4C31AFF7E300039A7FA /* rfft.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC6F4BF1AFF7E300039A7FA /* rfft.cpp */; }; DFCA6AC7152245CD000BFAAE /* HTTPJsonRpcHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCA6ABB152245CD000BFAAE /* HTTPJsonRpcHandler.cpp */; }; DFCA6AC8152245CD000BFAAE /* HTTPVfsHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCA6ABD152245CD000BFAAE /* HTTPVfsHandler.cpp */; }; DFCA6AC9152245CD000BFAAE /* HTTPWebinterfaceAddonsHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCA6ABF152245CD000BFAAE /* HTTPWebinterfaceAddonsHandler.cpp */; }; @@ -885,25 +1008,18 @@ DFD5812616C828500008EEA0 /* DAVFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD5812316C828500008EEA0 /* DAVFile.cpp */; }; DFD7C7AD19D1DDA90071942C /* Default-667h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DFD7C7AB19D1DDA90071942C /* Default-667h@2x.png */; }; DFD7C7AE19D1DDA90071942C /* Default-736h@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DFD7C7AC19D1DDA90071942C /* Default-736h@3x.png */; }; + DFD882E717DD189E001516FE /* StringValidation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD882E517DD189E001516FE /* StringValidation.cpp */; }; DFD882E817DD189E001516FE /* StringValidation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD882E517DD189E001516FE /* StringValidation.cpp */; }; DFD882E917DD189E001516FE /* StringValidation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD882E517DD189E001516FE /* StringValidation.cpp */; }; + DFD882F617DD1A5B001516FE /* AddonPythonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD882F417DD1A5B001516FE /* AddonPythonInvoker.cpp */; }; DFD882F717DD1A5B001516FE /* AddonPythonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD882F417DD1A5B001516FE /* AddonPythonInvoker.cpp */; }; DFD882F817DD1A5B001516FE /* AddonPythonInvoker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD882F417DD1A5B001516FE /* AddonPythonInvoker.cpp */; }; DFD928F316384B6800709DAE /* Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD928F116384B6800709DAE /* Timer.cpp */; }; DFDA3153160E34230047A626 /* DVDOverlayCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFDA3152160E34230047A626 /* DVDOverlayCodec.cpp */; }; - DFDE5D511AE5658200EE53AD /* PictureScalingAlgorithm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFDE5D4F1AE5658200EE53AD /* PictureScalingAlgorithm.cpp */; }; - DFDE5D521AE5658200EE53AD /* PictureScalingAlgorithm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFDE5D4F1AE5658200EE53AD /* PictureScalingAlgorithm.cpp */; }; DFE4095B17417FDF00473BD9 /* LegacyPathTranslation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE4095917417FDF00473BD9 /* LegacyPathTranslation.cpp */; }; - DFEA4B4E1B5271A900562321 /* AddonCallbacksAudioDSP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CE31B50378E0002A874 /* AddonCallbacksAudioDSP.cpp */; }; - DFEA4B501B5271EB00562321 /* ActiveAEDSP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CE71B5037EF0002A874 /* ActiveAEDSP.cpp */; }; - DFEA4B521B5271EE00562321 /* ActiveAEDSPAddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CE91B5037EF0002A874 /* ActiveAEDSPAddon.cpp */; }; - DFEA4B541B5271F200562321 /* ActiveAEDSPDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CEB1B5037EF0002A874 /* ActiveAEDSPDatabase.cpp */; }; - DFEA4B561B5271F600562321 /* ActiveAEDSPMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CED1B5037EF0002A874 /* ActiveAEDSPMode.cpp */; }; - DFEA4B581B5271FA00562321 /* ActiveAEDSPProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CEF1B5037EF0002A874 /* ActiveAEDSPProcess.cpp */; }; - DFEA4B5A1B52721300562321 /* GUIDialogAudioDSPManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CF61B5038580002A874 /* GUIDialogAudioDSPManager.cpp */; }; - DFEA4B5C1B52721700562321 /* GUIDialogAudioDSPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C973CF81B5038580002A874 /* GUIDialogAudioDSPSettings.cpp */; }; DFEB902819E9337200728978 /* AEResampleFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEB902619E9337200728978 /* AEResampleFactory.cpp */; }; DFEB902919E9337200728978 /* AEResampleFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEB902619E9337200728978 /* AEResampleFactory.cpp */; }; + DFEB902A19E9337200728978 /* AEResampleFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEB902619E9337200728978 /* AEResampleFactory.cpp */; }; DFECFADF172D9C5100A43CF7 /* GUIControlSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFADD172D9C5100A43CF7 /* GUIControlSettings.cpp */; }; DFECFB09172D9CAB00A43CF7 /* SettingAddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFAF4172D9CAB00A43CF7 /* SettingAddon.cpp */; }; DFECFB0C172D9CAB00A43CF7 /* SettingControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFAFA172D9CAB00A43CF7 /* SettingControl.cpp */; }; @@ -913,9 +1029,843 @@ DFED5AC71AB23388001F080D /* ReplayGain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EF800FE1A97892A0035AA4D /* ReplayGain.cpp */; }; DFEF0BAC180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BA9180ADE6400AEAED1 /* FileItemListModification.cpp */; }; DFEF0BAD180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BA9180ADE6400AEAED1 /* FileItemListModification.cpp */; }; + DFEF0BAE180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BA9180ADE6400AEAED1 /* FileItemListModification.cpp */; }; DFEF0BC1180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BBF180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp */; }; DFEF0BC2180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BBF180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp */; }; + DFEF0BC3180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BBF180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp */; }; + DFF0EB54175280D1002DA3A4 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F56C8CE6131F5DC6000AD0F6 /* libz.dylib */; }; + DFF0EB55175280E5002DA3A4 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F56C8CF2131F5DFD000AD0F6 /* libiconv.dylib */; }; + DFF0EBB3175281CE002DA3A4 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910EC174E54D200741B6D /* AudioToolbox.framework */; }; + DFF0EBB4175281D6002DA3A4 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910F0174E54EC00741B6D /* CFNetwork.framework */; }; + DFF0EBB6175281E0002DA3A4 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910EA174E54C900741B6D /* CoreAudio.framework */; }; DFF0EBB7175281E1002DA3A4 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910EA174E54C900741B6D /* CoreAudio.framework */; }; + DFF0EBB8175281E7002DA3A4 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910E6174E54B300741B6D /* CoreMedia.framework */; }; + DFF0EBB9175281ED002DA3A4 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910E8174E54C300741B6D /* CoreVideo.framework */; }; + DFF0EBBA175281F3002DA3A4 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910EE174E54E400741B6D /* ImageIO.framework */; }; + DFF0EBBB175281FB002DA3A4 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910E4174E54A100741B6D /* OpenGLES.framework */; }; + DFF0EBBC17528200002DA3A4 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910E2174E549400741B6D /* QuartzCore.framework */; }; + DFF0EBC41752820F002DA3A4 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFF0EB8717528174002DA3A4 /* CoreGraphics.framework */; }; + DFF0EC531752821B002DA3A4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFF0EB8D17528174002DA3A4 /* Foundation.framework */; }; + DFF0EC891752822E002DA3A4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFF0EB9517528174002DA3A4 /* UIKit.framework */; }; + DFF0EC8C17528283002DA3A4 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFF0EC8B17528283002DA3A4 /* VideoToolbox.framework */; }; + DFF0ECA7175282AD002DA3A4 /* SlingboxLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 18404DA51396C31B00863BBA /* SlingboxLib.a */; }; + DFF0F0EF17528350002DA3A4 /* archive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CE60D25F9FC00618676 /* archive.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0F017528350002DA3A4 /* arcread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CE80D25F9FC00618676 /* arcread.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0F117528350002DA3A4 /* cmddata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CEA0D25F9FC00618676 /* cmddata.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0F217528350002DA3A4 /* consio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CEF0D25F9FC00618676 /* consio.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0F317528350002DA3A4 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CF10D25F9FC00618676 /* crc.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0F417528350002DA3A4 /* crypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CF40D25F9FC00618676 /* crypt.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0F517528350002DA3A4 /* encname.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CF80D25F9FC00618676 /* encname.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0F617528350002DA3A4 /* errhnd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CFA0D25F9FC00618676 /* errhnd.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0F717528350002DA3A4 /* extinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CFC0D25F9FC00618676 /* extinfo.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0F817528350002DA3A4 /* extract.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CFE0D25F9FC00618676 /* extract.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0F917528350002DA3A4 /* filcreat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D000D25F9FC00618676 /* filcreat.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0FA17528350002DA3A4 /* file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D020D25F9FC00618676 /* file.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0FB17528350002DA3A4 /* filefn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D040D25F9FC00618676 /* filefn.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0FC17528350002DA3A4 /* filestr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D060D25F9FC00618676 /* filestr.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0FD17528350002DA3A4 /* find.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D080D25F9FC00618676 /* find.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0FE17528350002DA3A4 /* getbits.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D0A0D25F9FC00618676 /* getbits.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F0FF17528350002DA3A4 /* global.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D0C0D25F9FC00618676 /* global.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10017528350002DA3A4 /* int64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D0F0D25F9FC00618676 /* int64.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10117528350002DA3A4 /* isnt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D110D25F9FC00618676 /* isnt.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10217528350002DA3A4 /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D160D25F9FC00618676 /* log.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10317528350002DA3A4 /* match.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D1A0D25F9FC00618676 /* match.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10417528350002DA3A4 /* options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D1E0D25F9FC00618676 /* options.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10517528350002DA3A4 /* pathfn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D210D25F9FC00618676 /* pathfn.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10617528350002DA3A4 /* rar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E257B0D263C4400618676 /* rar.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10717528350002DA3A4 /* rarvm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D2A0D25F9FC00618676 /* rarvm.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10817528350002DA3A4 /* rawread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D2D0D25F9FC00618676 /* rawread.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10917528350002DA3A4 /* rdwrfn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D2F0D25F9FC00618676 /* rdwrfn.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10A17528350002DA3A4 /* recvol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D330D25F9FC00618676 /* recvol.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10B17528350002DA3A4 /* resource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D350D25F9FC00618676 /* resource.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10C17528350002DA3A4 /* rijndael.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D370D25F9FC00618676 /* rijndael.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10D17528350002DA3A4 /* rs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D390D25F9FC00618676 /* rs.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10E17528350002DA3A4 /* savepos.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D3B0D25F9FC00618676 /* savepos.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F10F17528350002DA3A4 /* scantree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D3D0D25F9FC00618676 /* scantree.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F11017528350002DA3A4 /* sha1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D3F0D25F9FC00618676 /* sha1.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F11117528350002DA3A4 /* strfn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D460D25F9FC00618676 /* strfn.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F11217528350002DA3A4 /* strlist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D480D25F9FC00618676 /* strlist.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F11317528350002DA3A4 /* system.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D4C0D25F9FC00618676 /* system.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F11417528350002DA3A4 /* timefn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D4E0D25F9FC00618676 /* timefn.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F11517528350002DA3A4 /* ulinks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D500D25F9FC00618676 /* ulinks.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F11617528350002DA3A4 /* unicode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D520D25F9FC00618676 /* unicode.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F11717528350002DA3A4 /* unpack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E25770D263BF600618676 /* unpack.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F11817528350002DA3A4 /* volume.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D5E0D25F9FC00618676 /* volume.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; + DFF0F11917528350002DA3A4 /* Addon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B49FF11152BFA5001AF8A6 /* Addon.cpp */; }; + DFF0F11A17528350002DA3A4 /* AddonCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482911156CFFE7005A996F /* AddonCallbacks.cpp */; }; + DFF0F11B17528350002DA3A4 /* AddonCallbacksAddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482913156CFFE7005A996F /* AddonCallbacksAddon.cpp */; }; + DFF0F11C17528350002DA3A4 /* AddonCallbacksGUI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482915156CFFE7005A996F /* AddonCallbacksGUI.cpp */; }; + DFF0F11D17528350002DA3A4 /* AddonCallbacksPVR.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482917156CFFE7005A996F /* AddonCallbacksPVR.cpp */; }; + DFF0F11E17528350002DA3A4 /* AddonDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C3821294203F009E7A26 /* AddonDatabase.cpp */; }; + DFF0F11F17528350002DA3A4 /* AddonInstaller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C4705AC12EF584C00369E51 /* AddonInstaller.cpp */; }; + DFF0F12017528350002DA3A4 /* AddonManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B49FF41152BFA5001AF8A6 /* AddonManager.cpp */; }; + DFF0F12117528350002DA3A4 /* AddonStatusHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F52BFFDA115D5574004B1D66 /* AddonStatusHandler.cpp */; }; + DFF0F12217528350002DA3A4 /* AddonVersion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B700DF13A6A5750009C1AF /* AddonVersion.cpp */; }; + DFF0F12317528350002DA3A4 /* GUIDialogAddonInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C38612942090009E7A26 /* GUIDialogAddonInfo.cpp */; }; + DFF0F12417528350002DA3A4 /* GUIDialogAddonSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C8F912942718009E7A26 /* GUIDialogAddonSettings.cpp */; }; + DFF0F12517528350002DA3A4 /* GUIViewStateAddonBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C38812942090009E7A26 /* GUIViewStateAddonBrowser.cpp */; }; + DFF0F12617528350002DA3A4 /* GUIWindowAddonBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C97A12943809009E7A26 /* GUIWindowAddonBrowser.cpp */; }; + DFF0F12717528350002DA3A4 /* PluginSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 183FDF8811AF0B0500B81E9C /* PluginSource.cpp */; }; + DFF0F12817528350002DA3A4 /* Repository.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C85EB75A1174614E0008E5A5 /* Repository.cpp */; }; + DFF0F12917528350002DA3A4 /* Scraper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B49FFC1152BFA5001AF8A6 /* Scraper.cpp */; }; + DFF0F12A17528350002DA3A4 /* ScreenSaver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B49FFE1152BFA5001AF8A6 /* ScreenSaver.cpp */; }; + DFF0F12B17528350002DA3A4 /* Service.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 184C472D1296BC6E0006DB3E /* Service.cpp */; }; + DFF0F12C17528350002DA3A4 /* Skin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F52B063A11869862004B1D66 /* Skin.cpp */; }; + DFF0F12D17528350002DA3A4 /* Visualisation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B4A0001152BFA5001AF8A6 /* Visualisation.cpp */; }; + DFF0F12E17528350002DA3A4 /* CDDARipJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18E7CAC91578C26D001D4554 /* CDDARipJob.cpp */; }; + DFF0F12F17528350002DA3A4 /* CDDARipper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14820D25F9F900618676 /* CDDARipper.cpp */; }; + DFF0F13017528350002DA3A4 /* Encoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14880D25F9F900618676 /* Encoder.cpp */; }; + DFF0F13117528350002DA3A4 /* EncoderFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F50FE04D11A3411A00C8B8CD /* EncoderFFmpeg.cpp */; }; + DFF0F13617528350002DA3A4 /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1DE0443315828F4B005DDB4D /* Exception.cpp */; }; + DFF0F13717528350002DA3A4 /* ilog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC720A8D155091BB00FFD782 /* ilog.cpp */; }; + DFF0F13817528350002DA3A4 /* AEEncoderFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65F6A15373AE7006B8FF1 /* AEEncoderFFmpeg.cpp */; }; + DFF0F13E17528350002DA3A4 /* AEBitstreamPacker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FA315373AE7006B8FF1 /* AEBitstreamPacker.cpp */; }; + DFF0F13F17528350002DA3A4 /* AEBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FA515373AE7006B8FF1 /* AEBuffer.cpp */; }; + DFF0F14017528350002DA3A4 /* AEChannelInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FA715373AE7006B8FF1 /* AEChannelInfo.cpp */; }; + DFF0F14217528350002DA3A4 /* AEDeviceInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C0B98A1154B79C30065A238 /* AEDeviceInfo.cpp */; }; + DFF0F14317528350002DA3A4 /* AELimiter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7CEAEF165629530059C9EB /* AELimiter.cpp */; }; + DFF0F14417528350002DA3A4 /* AEPackIEC61937.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FAB15373AE7006B8FF1 /* AEPackIEC61937.cpp */; }; + DFF0F14617528350002DA3A4 /* AEStreamInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FAF15373AE7006B8FF1 /* AEStreamInfo.cpp */; }; + DFF0F14717528350002DA3A4 /* AEUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FB115373AE7006B8FF1 /* AEUtil.cpp */; }; + DFF0F14917528350002DA3A4 /* AEFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65F6515373AE7006B8FF1 /* AEFactory.cpp */; }; + DFF0F14A17528350002DA3A4 /* EmuFileWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14E30D25F9F900618676 /* EmuFileWrapper.cpp */; }; + DFF0F14B17528350002DA3A4 /* emu_dummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14B90D25F9F900618676 /* emu_dummy.cpp */; }; + DFF0F14C17528350002DA3A4 /* emu_kernel32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14BD0D25F9F900618676 /* emu_kernel32.cpp */; }; + DFF0F14D17528350002DA3A4 /* emu_msvcrt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14C10D25F9F900618676 /* emu_msvcrt.cpp */; }; + DFF0F14E17528350002DA3A4 /* coff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E149E0D25F9F900618676 /* coff.cpp */; }; + DFF0F14F17528350002DA3A4 /* dll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14A30D25F9F900618676 /* dll.cpp */; }; + DFF0F15017528350002DA3A4 /* dll_tracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14A50D25F9F900618676 /* dll_tracker.cpp */; }; + DFF0F15117528350002DA3A4 /* dll_tracker_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14A90D25F9F900618676 /* dll_tracker_file.cpp */; }; + DFF0F15217528350002DA3A4 /* dll_tracker_library.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14AB0D25F9F900618676 /* dll_tracker_library.cpp */; }; + DFF0F15317528350002DA3A4 /* dll_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14B10D25F9F900618676 /* dll_util.cpp */; }; + DFF0F15417528350002DA3A4 /* DllLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14B40D25F9F900618676 /* DllLoader.cpp */; }; + DFF0F15517528350002DA3A4 /* DllLoaderContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14B60D25F9F900618676 /* DllLoaderContainer.cpp */; }; + DFF0F15617528350002DA3A4 /* LibraryLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14ED0D25F9F900618676 /* LibraryLoader.cpp */; }; + DFF0F15717528350002DA3A4 /* SoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14F40D25F9F900618676 /* SoLoader.cpp */; }; + DFF0F15817528350002DA3A4 /* DVDAudioCodecFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15070D25F9F900618676 /* DVDAudioCodecFFmpeg.cpp */; }; + DFF0F15B17528350002DA3A4 /* DVDAudioCodecPassthrough.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB6610615374E80006B8FF1 /* DVDAudioCodecPassthrough.cpp */; }; + DFF0F15E17528350002DA3A4 /* DVDOverlayCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFDA3152160E34230047A626 /* DVDOverlayCodec.cpp */; }; + DFF0F16017528350002DA3A4 /* DVDOverlayCodecFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E152D0D25F9F900618676 /* DVDOverlayCodecFFmpeg.cpp */; }; + DFF0F16117528350002DA3A4 /* DVDOverlayCodecSSA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8883CE9E0DD817D1004E8B72 /* DVDOverlayCodecSSA.cpp */; }; + DFF0F16217528350002DA3A4 /* DVDOverlayCodecText.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E152F0D25F9F900618676 /* DVDOverlayCodecText.cpp */; }; + DFF0F16317528350002DA3A4 /* DVDOverlayCodecTX3G.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CEE60713D3C89700225F72 /* DVDOverlayCodecTX3G.cpp */; }; + DFF0F16617528350002DA3A4 /* DVDVideoCodecFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E153D0D25F9F900618676 /* DVDVideoCodecFFmpeg.cpp */; }; + DFF0F16717528350002DA3A4 /* DVDVideoCodecLibMpeg2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E153F0D25F9F900618676 /* DVDVideoCodecLibMpeg2.cpp */; }; + DFF0F16817528350002DA3A4 /* DVDVideoCodecVDA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F52B06B81187CE18004B1D66 /* DVDVideoCodecVDA.cpp */; }; + DFF0F16917528350002DA3A4 /* DVDVideoPPFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15410D25F9F900618676 /* DVDVideoPPFFmpeg.cpp */; }; + DFF0F16A17528350002DA3A4 /* DVDDemux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15490D25F9F900618676 /* DVDDemux.cpp */; }; + DFF0F16B17528350002DA3A4 /* DVDDemuxBXA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE89ACA41621DAB800E17DBC /* DVDDemuxBXA.cpp */; }; + DFF0F16C17528350002DA3A4 /* DVDDemuxCDDA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52566B1732C1890094A464 /* DVDDemuxCDDA.cpp */; }; + DFF0F16D17528350002DA3A4 /* DVDDemuxFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E25C20D263DE200618676 /* DVDDemuxFFmpeg.cpp */; }; + DFF0F16F17528350002DA3A4 /* DVDDemuxPVRClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482902156CFED9005A996F /* DVDDemuxPVRClient.cpp */; }; + DFF0F17017528350002DA3A4 /* DVDDemuxShoutcast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E154D0D25F9F900618676 /* DVDDemuxShoutcast.cpp */; }; + DFF0F17117528350002DA3A4 /* DVDDemuxUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E154F0D25F9F900618676 /* DVDDemuxUtils.cpp */; }; + DFF0F17217528350002DA3A4 /* DVDDemuxVobsub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E33206370D5070AA00435CE3 /* DVDDemuxVobsub.cpp */; }; + DFF0F17317528350002DA3A4 /* DVDFactoryDemuxer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E25BF0D263DC100618676 /* DVDFactoryDemuxer.cpp */; }; + DFF0F17417528350002DA3A4 /* DVDFactoryInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15590D25F9FA00618676 /* DVDFactoryInputStream.cpp */; }; + DFF0F17517528350002DA3A4 /* DVDInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E155B0D25F9FA00618676 /* DVDInputStream.cpp */; }; + DFF0F17617528350002DA3A4 /* DVDInputStreamBluray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F58E293711FFC103006F4D46 /* DVDInputStreamBluray.cpp */; }; + DFF0F17717528350002DA3A4 /* DVDInputStreamFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E155D0D25F9FA00618676 /* DVDInputStreamFFmpeg.cpp */; }; + DFF0F17817528350002DA3A4 /* DVDInputStreamFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E155F0D25F9FA00618676 /* DVDInputStreamFile.cpp */; }; + DFF0F17A17528350002DA3A4 /* DVDInputStreamHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15610D25F9FA00618676 /* DVDInputStreamHttp.cpp */; }; + DFF0F17B17528350002DA3A4 /* DVDInputStreamMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15630D25F9FA00618676 /* DVDInputStreamMemory.cpp */; }; + DFF0F17C17528350002DA3A4 /* DVDInputStreamNavigator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15650D25F9FA00618676 /* DVDInputStreamNavigator.cpp */; }; + DFF0F17D17528350002DA3A4 /* DVDInputStreamPVRManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848290E156CFFA0005A996F /* DVDInputStreamPVRManager.cpp */; }; + DFF0F17E17528350002DA3A4 /* DVDInputStreamRTMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 815EE6330E17F1DC009FBE3C /* DVDInputStreamRTMP.cpp */; }; + DFF0F17F17528350002DA3A4 /* DVDInputStreamTV.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E33979940D62FD47004ECDDA /* DVDInputStreamTV.cpp */; }; + DFF0F18017528350002DA3A4 /* DVDStateSerializer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15740D25F9FA00618676 /* DVDStateSerializer.cpp */; }; + DFF0F18117528350002DA3A4 /* DVDSubtitleParserSSA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8883CEA30DD81807004E8B72 /* DVDSubtitleParserSSA.cpp */; }; + DFF0F18217528350002DA3A4 /* DVDSubtitlesLibass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8883CEA50DD81807004E8B72 /* DVDSubtitlesLibass.cpp */; }; + DFF0F18317528350002DA3A4 /* DVDSubtitleParserMicroDVD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3B53E7A0D97B08100021A96 /* DVDSubtitleParserMicroDVD.cpp */; }; + DFF0F18417528350002DA3A4 /* DVDSubtitleParserMPL2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F548786C0FE060FF00E506FD /* DVDSubtitleParserMPL2.cpp */; }; + DFF0F18517528350002DA3A4 /* DVDSubtitleParserSami.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29E50DA72442001F0C9D /* DVDSubtitleParserSami.cpp */; }; + DFF0F18617528350002DA3A4 /* DVDFactorySubtitle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E158F0D25F9FA00618676 /* DVDFactorySubtitle.cpp */; }; + DFF0F18717528350002DA3A4 /* DVDSubtitleLineCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15910D25F9FA00618676 /* DVDSubtitleLineCollection.cpp */; }; + DFF0F18817528350002DA3A4 /* DVDSubtitleParserSubrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15940D25F9FA00618676 /* DVDSubtitleParserSubrip.cpp */; }; + DFF0F18917528350002DA3A4 /* DVDSubtitleParserVplayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D8EF59103912A4004A11AB /* DVDSubtitleParserVplayer.cpp */; }; + DFF0F18A17528350002DA3A4 /* DVDSubtitleStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15960D25F9FA00618676 /* DVDSubtitleStream.cpp */; }; + DFF0F18B17528350002DA3A4 /* DVDSubtitleTagMicroDVD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5BDB8191202032400F0B710 /* DVDSubtitleTagMicroDVD.cpp */; }; + DFF0F18C17528350002DA3A4 /* DVDSubtitleTagSami.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5BDB80B120202F400F0B710 /* DVDSubtitleTagSami.cpp */; }; + DFF0F18D17528350002DA3A4 /* DVDAudio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14FC0D25F9F900618676 /* DVDAudio.cpp */; }; + DFF0F18E17528350002DA3A4 /* DVDClock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14FE0D25F9F900618676 /* DVDClock.cpp */; }; + DFF0F18F17528350002DA3A4 /* DVDDemuxSPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15550D25F9FA00618676 /* DVDDemuxSPU.cpp */; }; + DFF0F19017528350002DA3A4 /* DVDFileInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5F2EF4A0E593E0D0092C37F /* DVDFileInfo.cpp */; }; + DFF0F19117528350002DA3A4 /* DVDMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15780D25F9FA00618676 /* DVDMessage.cpp */; }; + DFF0F19217528350002DA3A4 /* DVDMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E157A0D25F9FA00618676 /* DVDMessageQueue.cpp */; }; + DFF0F19417528350002DA3A4 /* DVDOverlayContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E157E0D25F9FA00618676 /* DVDOverlayContainer.cpp */; }; + DFF0F19517528350002DA3A4 /* DVDOverlayRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15800D25F9FA00618676 /* DVDOverlayRenderer.cpp */; }; + DFF0F19717528350002DA3A4 /* DVDPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15840D25F9FA00618676 /* DVDPlayer.cpp */; }; + DFF0F19817528350002DA3A4 /* DVDPlayerAudio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15860D25F9FA00618676 /* DVDPlayerAudio.cpp */; }; + DFF0F19917528350002DA3A4 /* DVDPlayerSubtitle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15880D25F9FA00618676 /* DVDPlayerSubtitle.cpp */; }; + DFF0F19A17528350002DA3A4 /* DVDPlayerTeletext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E55B5B10741272006E788A /* DVDPlayerTeletext.cpp */; }; + DFF0F19B17528350002DA3A4 /* DVDPlayerVideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E158A0D25F9FA00618676 /* DVDPlayerVideo.cpp */; }; + DFF0F19C17528350002DA3A4 /* DVDStreamInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E158C0D25F9FA00618676 /* DVDStreamInfo.cpp */; }; + DFF0F19D17528350002DA3A4 /* DVDTSCorrection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAE9030FFCA3520040B25F /* DVDTSCorrection.cpp */; }; + DFF0F19E17528350002DA3A4 /* Edl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43348AA1107747CD00F859CF /* Edl.cpp */; }; + DFF0F19F17528350002DA3A4 /* ExternalPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C5608C40F1754930056433A /* ExternalPlayer.cpp */; }; + DFF0F1A217528350002DA3A4 /* AudioDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15E30D25F9FA00618676 /* AudioDecoder.cpp */; }; + DFF0F1A317528350002DA3A4 /* CodecFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15E80D25F9FA00618676 /* CodecFactory.cpp */; }; + DFF0F1A417528350002DA3A4 /* DVDPlayerCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36578860D3AA7B40033CC1C /* DVDPlayerCodec.cpp */; }; + DFF0F1AB17528350002DA3A4 /* PAPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5987FDA0FBE2DFD008EF4FB /* PAPlayer.cpp */; }; + DFF0F1B317528350002DA3A4 /* PlayerCoreFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43348AA81077486D00F859CF /* PlayerCoreFactory.cpp */; }; + DFF0F1B417528350002DA3A4 /* PlayerSelectionRule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43348AAA1077486D00F859CF /* PlayerSelectionRule.cpp */; }; + DFF0F1B517528350002DA3A4 /* ConvolutionKernels.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F592568710FBF2E100D2C91D /* ConvolutionKernels.cpp */; }; + DFF0F1B617528350002DA3A4 /* VideoFilterShader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E166F0D25F9FA00618676 /* VideoFilterShader.cpp */; }; + DFF0F1B717528350002DA3A4 /* YUV2RGBShader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16710D25F9FA00618676 /* YUV2RGBShader.cpp */; }; + DFF0F1B817528350002DA3A4 /* BaseRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CAA204F1079C8160096DE39 /* BaseRenderer.cpp */; }; + DFF0F1B917528350002DA3A4 /* OverlayRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D8D731102BB3B1004A11AB /* OverlayRenderer.cpp */; }; + DFF0F1BA17528350002DA3A4 /* OverlayRendererGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D8D72F102BB3B1004A11AB /* OverlayRendererGL.cpp */; }; + DFF0F1BB17528350002DA3A4 /* OverlayRendererUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 431AE5D7109C1A63007428C3 /* OverlayRendererUtil.cpp */; }; + DFF0F1BC17528350002DA3A4 /* RenderCapture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56579AD13060D1E0085ED7F /* RenderCapture.cpp */; }; + DFF0F1BD17528350002DA3A4 /* RenderManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16650D25F9FA00618676 /* RenderManager.cpp */; }; + DFF0F1BE17528350002DA3A4 /* DummyVideoPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14F60D25F9F900618676 /* DummyVideoPlayer.cpp */; }; + DFF0F1BF17528350002DA3A4 /* Database.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16800D25F9FA00618676 /* Database.cpp */; }; + DFF0F1C017528350002DA3A4 /* dataset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CD70D25F9FC00618676 /* dataset.cpp */; }; + DFF0F1C117528350002DA3A4 /* mysqldataset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C7B2B2E1134F36400713D6D /* mysqldataset.cpp */; }; + DFF0F1C217528350002DA3A4 /* qry_dat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CDF0D25F9FC00618676 /* qry_dat.cpp */; }; + DFF0F1C317528350002DA3A4 /* sqlitedataset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CE20D25F9FC00618676 /* sqlitedataset.cpp */; }; + DFF0F1C417528350002DA3A4 /* Epg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828E8156CFD5E005A996F /* Epg.cpp */; }; + DFF0F1C517528350002DA3A4 /* EpgContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828EA156CFD5E005A996F /* EpgContainer.cpp */; }; + DFF0F1C617528350002DA3A4 /* EpgDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828EC156CFD5E005A996F /* EpgDatabase.cpp */; }; + DFF0F1C717528350002DA3A4 /* EpgInfoTag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828EE156CFD5E005A996F /* EpgInfoTag.cpp */; }; + DFF0F1C817528350002DA3A4 /* EpgSearchFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828F0156CFD5E005A996F /* EpgSearchFilter.cpp */; }; + DFF0F1C917528350002DA3A4 /* GUIEPGGridContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828F2156CFD5E005A996F /* GUIEPGGridContainer.cpp */; }; + DFF0F1CA17528350002DA3A4 /* GUIDialogBoxBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E179C0D25F9FA00618676 /* GUIDialogBoxBase.cpp */; }; + DFF0F1CB17528350002DA3A4 /* GUIDialogBusy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E179E0D25F9FA00618676 /* GUIDialogBusy.cpp */; }; + DFF0F1CC17528350002DA3A4 /* GUIDialogButtonMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17A00D25F9FA00618676 /* GUIDialogButtonMenu.cpp */; }; + DFF0F1CD17528350002DA3A4 /* GUIDialogCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3A478090D29029A00F3C3A6 /* GUIDialogCache.cpp */; }; + DFF0F1CE17528350002DA3A4 /* GUIDialogContextMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17A40D25F9FA00618676 /* GUIDialogContextMenu.cpp */; }; + DFF0F1CF17528350002DA3A4 /* GUIDialogExtendedProgressBar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828FC156CFDC3005A996F /* GUIDialogExtendedProgressBar.cpp */; }; + DFF0F1D017528350002DA3A4 /* GUIDialogFavourites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17A60D25F9FA00618676 /* GUIDialogFavourites.cpp */; }; + DFF0F1D117528350002DA3A4 /* GUIDialogFileBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17A80D25F9FA00618676 /* GUIDialogFileBrowser.cpp */; }; + DFF0F1D217528350002DA3A4 /* GUIDialogGamepad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17AC0D25F9FA00618676 /* GUIDialogGamepad.cpp */; }; + DFF0F1D317528350002DA3A4 /* GUIDialogKaiToast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38A06CC0D95AA5500FF8227 /* GUIDialogKaiToast.cpp */; }; + DFF0F1D417528350002DA3A4 /* GUIDialogKeyboardGeneric.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF830D0A15BB260C00602BE6 /* GUIDialogKeyboardGeneric.cpp */; }; + DFF0F1D517528350002DA3A4 /* GUIDialogMediaFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A95DA31624894400727135 /* GUIDialogMediaFilter.cpp */; }; + DFF0F1D617528350002DA3A4 /* GUIDialogMediaSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17B80D25F9FA00618676 /* GUIDialogMediaSource.cpp */; }; + DFF0F1D717528350002DA3A4 /* GUIDialogMuteBug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17BE0D25F9FA00618676 /* GUIDialogMuteBug.cpp */; }; + DFF0F1D817528350002DA3A4 /* GUIDialogNumeric.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17C20D25F9FA00618676 /* GUIDialogNumeric.cpp */; }; + DFF0F1D917528350002DA3A4 /* GUIDialogOK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17C40D25F9FA00618676 /* GUIDialogOK.cpp */; }; + DFF0F1DA17528350002DA3A4 /* GUIDialogPlayEject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C99B7931340723F00FC2B16 /* GUIDialogPlayEject.cpp */; }; + DFF0F1DB17528350002DA3A4 /* GUIDialogPlayerControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17C80D25F9FA00618676 /* GUIDialogPlayerControls.cpp */; }; + DFF0F1DC17528350002DA3A4 /* GUIDialogProgress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17CE0D25F9FA00618676 /* GUIDialogProgress.cpp */; }; + DFF0F1DD17528350002DA3A4 /* GUIDialogSeekBar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17D00D25F9FA00618676 /* GUIDialogSeekBar.cpp */; }; + DFF0F1DE17528350002DA3A4 /* GUIDialogSelect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AACA670FB3DE2D00DBB77C /* GUIDialogSelect.cpp */; }; + DFF0F1DF17528350002DA3A4 /* GUIDialogSlider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AACA950FB3E2B800DBB77C /* GUIDialogSlider.cpp */; }; + DFF0F1E017528350002DA3A4 /* GUIDialogSmartPlaylistEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17D60D25F9FA00618676 /* GUIDialogSmartPlaylistEditor.cpp */; }; + DFF0F1E117528350002DA3A4 /* GUIDialogSmartPlaylistRule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17D80D25F9FA00618676 /* GUIDialogSmartPlaylistRule.cpp */; }; + DFF0F1E217528350002DA3A4 /* GUIDialogSubMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17DC0D25F9FA00618676 /* GUIDialogSubMenu.cpp */; }; + DFF0F1E317528350002DA3A4 /* GUIDialogTextViewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F50FDC59119B4B2C00C8B8CD /* GUIDialogTextViewer.cpp */; }; + DFF0F1E417528350002DA3A4 /* GUIDialogVolumeBar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17EA0D25F9FA00618676 /* GUIDialogVolumeBar.cpp */; }; + DFF0F1E517528350002DA3A4 /* GUIDialogYesNo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17EC0D25F9FA00618676 /* GUIDialogYesNo.cpp */; }; + DFF0F1E617528350002DA3A4 /* AddonsDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7B42B113CBB950059D6AA /* AddonsDirectory.cpp */; }; + DFF0F1EA17528350002DA3A4 /* BlurayDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5ED8D6A1551F91400842059 /* BlurayDirectory.cpp */; }; + DFF0F1EB17528350002DA3A4 /* CacheStrategy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16990D25F9FA00618676 /* CacheStrategy.cpp */; }; + DFF0F1EC17528350002DA3A4 /* CDDADirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E169B0D25F9FA00618676 /* CDDADirectory.cpp */; }; + DFF0F1ED17528350002DA3A4 /* CDDAFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6691444A8B0007C6459 /* CDDAFile.cpp */; }; + DFF0F1EE17528350002DA3A4 /* CircularCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C99B6A2133D342100FC2B16 /* CircularCache.cpp */; }; + DFF0F1EF17528350002DA3A4 /* CurlFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D66B1444A8B0007C6459 /* CurlFile.cpp */; }; + DFF0F1F217528350002DA3A4 /* DAVCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD5812116C8284F0008EEA0 /* DAVCommon.cpp */; }; + DFF0F1F317528350002DA3A4 /* DAVDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C45DBE710F325C400D4BBF3 /* DAVDirectory.cpp */; }; + DFF0F1F417528350002DA3A4 /* DAVFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD5812316C828500008EEA0 /* DAVFile.cpp */; }; + DFF0F1F517528350002DA3A4 /* Directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16AC0D25F9FA00618676 /* Directory.cpp */; }; + DFF0F1F617528350002DA3A4 /* DirectoryCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6651444A8B0007C6459 /* DirectoryCache.cpp */; }; + DFF0F1F717528350002DA3A4 /* DirectoryFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D66F1444A8B0007C6459 /* DirectoryFactory.cpp */; }; + DFF0F1F817528350002DA3A4 /* DirectoryHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16B00D25F9FA00618676 /* DirectoryHistory.cpp */; }; + DFF0F1F917528350002DA3A4 /* DllLibCurl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16B40D25F9FA00618676 /* DllLibCurl.cpp */; }; + DFF0F1FA17528350002DA3A4 /* File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16BA0D25F9FA00618676 /* File.cpp */; }; + DFF0F1FB17528350002DA3A4 /* FileCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6671444A8B0007C6459 /* FileCache.cpp */; }; + DFF0F1FC17528350002DA3A4 /* FileDirectoryFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6711444A8B0007C6459 /* FileDirectoryFactory.cpp */; }; + DFF0F1FD17528350002DA3A4 /* FileFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16C40D25F9FA00618676 /* FileFactory.cpp */; }; + DFF0F1FE17528350002DA3A4 /* FileReaderFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6731444A8B0007C6459 /* FileReaderFile.cpp */; }; + DFF0F1FF17528350002DA3A4 /* FTPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16E40D25F9FA00618676 /* FTPDirectory.cpp */; }; + DFF0F20017528350002DA3A4 /* FTPParse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16E60D25F9FA00618676 /* FTPParse.cpp */; }; + DFF0F20317528350002DA3A4 /* HDHomeRunDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D7F51444B568007C6459 /* HDHomeRunDirectory.cpp */; }; + DFF0F20417528350002DA3A4 /* HDHomeRunFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D7F01444B54A007C6459 /* HDHomeRunFile.cpp */; }; + DFF0F20717528350002DA3A4 /* HTTPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F584E12D0F257C5100DB26A5 /* HTTPDirectory.cpp */; }; + DFF0F20817528350002DA3A4 /* HTTPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF9A71EC1639C8F6005ECB2E /* HTTPFile.cpp */; }; + DFF0F20917528350002DA3A4 /* IDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16EC0D25F9FA00618676 /* IDirectory.cpp */; }; + DFF0F20A17528350002DA3A4 /* IFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16EE0D25F9FA00618676 /* IFile.cpp */; }; + DFF0F20B17528350002DA3A4 /* ImageFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C6EB32E155BD1D40080368A /* ImageFile.cpp */; }; + DFF0F20C17528350002DA3A4 /* iso9660.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16F10D25F9FA00618676 /* iso9660.cpp */; }; + DFF0F20D17528350002DA3A4 /* ISO9660Directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16F30D25F9FA00618676 /* ISO9660Directory.cpp */; }; + DFF0F20E17528350002DA3A4 /* ISOFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6771444A8B0007C6459 /* ISOFile.cpp */; }; + DFF0F20F17528350002DA3A4 /* LibraryDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1F6EB913ECCFA7001726AB /* LibraryDirectory.cpp */; }; + DFF0F21017528350002DA3A4 /* MemBufferCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16970D25F9FA00618676 /* MemBufferCache.cpp */; }; + DFF0F21117528350002DA3A4 /* MultiPathDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17080D25F9FA00618676 /* MultiPathDirectory.cpp */; }; + DFF0F21217528350002DA3A4 /* MultiPathFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F50629780E57B9680066625A /* MultiPathFile.cpp */; }; + DFF0F21317528350002DA3A4 /* DirectoryNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E170B0D25F9FA00618676 /* DirectoryNode.cpp */; }; + DFF0F21417528350002DA3A4 /* DirectoryNodeAlbum.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E170D0D25F9FA00618676 /* DirectoryNodeAlbum.cpp */; }; + DFF0F21517528350002DA3A4 /* DirectoryNodeAlbumCompilations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E170F0D25F9FA00618676 /* DirectoryNodeAlbumCompilations.cpp */; }; + DFF0F21617528350002DA3A4 /* DirectoryNodeAlbumCompilationsSongs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17110D25F9FA00618676 /* DirectoryNodeAlbumCompilationsSongs.cpp */; }; + DFF0F21717528350002DA3A4 /* DirectoryNodeAlbumRecentlyAdded.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17130D25F9FA00618676 /* DirectoryNodeAlbumRecentlyAdded.cpp */; }; + DFF0F21817528350002DA3A4 /* DirectoryNodeAlbumRecentlyAddedSong.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17150D25F9FA00618676 /* DirectoryNodeAlbumRecentlyAddedSong.cpp */; }; + DFF0F21917528350002DA3A4 /* DirectoryNodeAlbumRecentlyPlayed.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17170D25F9FA00618676 /* DirectoryNodeAlbumRecentlyPlayed.cpp */; }; + DFF0F21A17528350002DA3A4 /* DirectoryNodeAlbumRecentlyPlayedSong.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17190D25F9FA00618676 /* DirectoryNodeAlbumRecentlyPlayedSong.cpp */; }; + DFF0F21B17528350002DA3A4 /* DirectoryNodeAlbumTop100.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E171B0D25F9FA00618676 /* DirectoryNodeAlbumTop100.cpp */; }; + DFF0F21C17528350002DA3A4 /* DirectoryNodeAlbumTop100Song.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E171D0D25F9FA00618676 /* DirectoryNodeAlbumTop100Song.cpp */; }; + DFF0F21D17528350002DA3A4 /* DirectoryNodeArtist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E171F0D25F9FA00618676 /* DirectoryNodeArtist.cpp */; }; + DFF0F21E17528350002DA3A4 /* DirectoryNodeGrouped.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F52CC5EE1713AAA200113454 /* DirectoryNodeGrouped.cpp */; }; + DFF0F21F17528350002DA3A4 /* DirectoryNodeOverview.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17230D25F9FA00618676 /* DirectoryNodeOverview.cpp */; }; + DFF0F22017528350002DA3A4 /* DirectoryNodeRoot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17250D25F9FA00618676 /* DirectoryNodeRoot.cpp */; }; + DFF0F22117528350002DA3A4 /* DirectoryNodeSingles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C62F45C1057A62D002AD2C1 /* DirectoryNodeSingles.cpp */; }; + DFF0F22217528350002DA3A4 /* DirectoryNodeSong.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17270D25F9FA00618676 /* DirectoryNodeSong.cpp */; }; + DFF0F22317528350002DA3A4 /* DirectoryNodeSongTop100.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17290D25F9FA00618676 /* DirectoryNodeSongTop100.cpp */; }; + DFF0F22417528350002DA3A4 /* DirectoryNodeTop100.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E172B0D25F9FA00618676 /* DirectoryNodeTop100.cpp */; }; + DFF0F22517528350002DA3A4 /* DirectoryNodeYearAlbum.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E172F0D25F9FA00618676 /* DirectoryNodeYearAlbum.cpp */; }; + DFF0F22617528350002DA3A4 /* DirectoryNodeYearSong.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17310D25F9FA00618676 /* DirectoryNodeYearSong.cpp */; }; + DFF0F22717528350002DA3A4 /* QueryParams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17350D25F9FA00618676 /* QueryParams.cpp */; }; + DFF0F22817528350002DA3A4 /* MusicDatabaseDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17370D25F9FA00618676 /* MusicDatabaseDirectory.cpp */; }; + DFF0F22917528350002DA3A4 /* MusicDatabaseFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D67B1444A8B0007C6459 /* MusicDatabaseFile.cpp */; }; + DFF0F22A17528350002DA3A4 /* MusicFileDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 880DBE530DC224A100E26B71 /* MusicFileDirectory.cpp */; }; + DFF0F22B17528350002DA3A4 /* MusicSearchDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17390D25F9FA00618676 /* MusicSearchDirectory.cpp */; }; + DFF0F22F17528350002DA3A4 /* NFSDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0DF15913A3ADA7008ED511 /* NFSDirectory.cpp */; }; + DFF0F23017528350002DA3A4 /* NFSFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D67D1444A8B0007C6459 /* NFSFile.cpp */; }; + DFF0F23117528350002DA3A4 /* NptXbmcFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4E91BB70E7F7338001F0546 /* NptXbmcFile.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + DFF0F23417528350002DA3A4 /* PipeFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D67F1444A8B0007C6459 /* PipeFile.cpp */; }; + DFF0F23517528350002DA3A4 /* PipesManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF44845B140048C80069344B /* PipesManager.cpp */; }; + DFF0F23617528350002DA3A4 /* PlaylistDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17400D25F9FA00618676 /* PlaylistDirectory.cpp */; }; + DFF0F23717528350002DA3A4 /* PlaylistFileDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17420D25F9FA00618676 /* PlaylistFileDirectory.cpp */; }; + DFF0F23817528350002DA3A4 /* PluginDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17440D25F9FA00618676 /* PluginDirectory.cpp */; }; + DFF0F23917528350002DA3A4 /* PVRDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482905156CFF24005A996F /* PVRDirectory.cpp */; }; + DFF0F23A17528350002DA3A4 /* PVRFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482907156CFF24005A996F /* PVRFile.cpp */; }; + DFF0F23B17528350002DA3A4 /* RarDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17460D25F9FA00618676 /* RarDirectory.cpp */; }; + DFF0F23C17528350002DA3A4 /* RarFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6811444A8B0007C6459 /* RarFile.cpp */; }; + DFF0F23D17528350002DA3A4 /* RarManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17480D25F9FA00618676 /* RarManager.cpp */; }; + DFF0F23E17528350002DA3A4 /* RSSDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 889B4D8C0E0EF86C00FAD25E /* RSSDirectory.cpp */; }; + DFF0F24117528350002DA3A4 /* SAPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4DC97500FFE5BA8008E0C07 /* SAPDirectory.cpp */; }; + DFF0F24217528350002DA3A4 /* SAPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4DC97520FFE5BA8008E0C07 /* SAPFile.cpp */; }; + DFF0F24317528350002DA3A4 /* SFTPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7B37C113AFB900059D6AA /* SFTPDirectory.cpp */; }; + DFF0F24417528350002DA3A4 /* SFTPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6851444A8B0007C6459 /* SFTPFile.cpp */; }; + DFF0F24517528350002DA3A4 /* ShoutcastFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6871444A8B0007C6459 /* ShoutcastFile.cpp */; }; + DFF0F24717528350002DA3A4 /* SlingboxDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D65C1444A7A3007C6459 /* SlingboxDirectory.cpp */; }; + DFF0F24817528350002DA3A4 /* SlingboxFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6891444A8B0007C6459 /* SlingboxFile.cpp */; }; + DFF0F24917528350002DA3A4 /* SmartPlaylistDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17530D25F9FA00618676 /* SmartPlaylistDirectory.cpp */; }; + DFF0F24A17528350002DA3A4 /* SMBDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3DAAF8B0D6E1B0500F17647 /* SMBDirectory.cpp */; }; + DFF0F24B17528350002DA3A4 /* SMBFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D68B1444A8B0007C6459 /* SMBFile.cpp */; }; + DFF0F24C17528350002DA3A4 /* SourcesDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C84A59C12FA3C1600CD1714 /* SourcesDirectory.cpp */; }; + DFF0F24D17528350002DA3A4 /* SpecialProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2D6AE20F35453E00DD2E85 /* SpecialProtocol.cpp */; }; + DFF0F24E17528350002DA3A4 /* SpecialProtocolDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEBD8A60F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp */; }; + DFF0F24F17528350002DA3A4 /* SpecialProtocolFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D68D1444A8B0007C6459 /* SpecialProtocolFile.cpp */; }; + DFF0F25017528350002DA3A4 /* StackDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17590D25F9FA00618676 /* StackDirectory.cpp */; }; + DFF0F25317528350002DA3A4 /* udf25.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 433219D312E4C6A500CD7486 /* udf25.cpp */; }; + DFF0F25417528350002DA3A4 /* UDFDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 433219D512E4C6A500CD7486 /* UDFDirectory.cpp */; }; + DFF0F25517528350002DA3A4 /* UDFFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6931444A8B0007C6459 /* UDFFile.cpp */; }; + DFF0F25617528350002DA3A4 /* UPnPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E175B0D25F9FA00618676 /* UPnPDirectory.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + DFF0F25717528350002DA3A4 /* UPnPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6951444A8B0007C6459 /* UPnPFile.cpp */; }; + DFF0F25817528350002DA3A4 /* DirectoryNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17600D25F9FA00618676 /* DirectoryNode.cpp */; }; + DFF0F25917528350002DA3A4 /* DirectoryNodeEpisodes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17660D25F9FA00618676 /* DirectoryNodeEpisodes.cpp */; }; + DFF0F25A17528350002DA3A4 /* DirectoryNodeGrouped.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F52CC6A81713BD2B00113454 /* DirectoryNodeGrouped.cpp */; }; + DFF0F25B17528350002DA3A4 /* DirectoryNodeMoviesOverview.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E176A0D25F9FA00618676 /* DirectoryNodeMoviesOverview.cpp */; }; + DFF0F25C17528350002DA3A4 /* DirectoryNodeMusicVideosOverview.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E176C0D25F9FA00618676 /* DirectoryNodeMusicVideosOverview.cpp */; }; + DFF0F25D17528350002DA3A4 /* DirectoryNodeOverview.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E176E0D25F9FA00618676 /* DirectoryNodeOverview.cpp */; }; + DFF0F25E17528350002DA3A4 /* DirectoryNodeRecentlyAddedEpisodes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17700D25F9FA00618676 /* DirectoryNodeRecentlyAddedEpisodes.cpp */; }; + DFF0F25F17528350002DA3A4 /* DirectoryNodeRecentlyAddedMovies.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17720D25F9FA00618676 /* DirectoryNodeRecentlyAddedMovies.cpp */; }; + DFF0F26017528350002DA3A4 /* DirectoryNodeRecentlyAddedMusicVideos.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17740D25F9FA00618676 /* DirectoryNodeRecentlyAddedMusicVideos.cpp */; }; + DFF0F26117528350002DA3A4 /* DirectoryNodeRoot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17760D25F9FA00618676 /* DirectoryNodeRoot.cpp */; }; + DFF0F26217528350002DA3A4 /* DirectoryNodeSeasons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17780D25F9FA00618676 /* DirectoryNodeSeasons.cpp */; }; + DFF0F26317528350002DA3A4 /* DirectoryNodeTitleMovies.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E177C0D25F9FA00618676 /* DirectoryNodeTitleMovies.cpp */; }; + DFF0F26417528350002DA3A4 /* DirectoryNodeTitleMusicVideos.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E177E0D25F9FA00618676 /* DirectoryNodeTitleMusicVideos.cpp */; }; + DFF0F26517528350002DA3A4 /* DirectoryNodeTitleTvShows.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17800D25F9FA00618676 /* DirectoryNodeTitleTvShows.cpp */; }; + DFF0F26617528350002DA3A4 /* DirectoryNodeTvShowsOverview.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17820D25F9FA00618676 /* DirectoryNodeTvShowsOverview.cpp */; }; + DFF0F26717528350002DA3A4 /* QueryParams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17880D25F9FA00618676 /* QueryParams.cpp */; }; + DFF0F26817528350002DA3A4 /* VideoDatabaseDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E178A0D25F9FA00618676 /* VideoDatabaseDirectory.cpp */; }; + DFF0F26917528350002DA3A4 /* VirtualDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E178C0D25F9FA00618676 /* VirtualDirectory.cpp */; }; + DFF0F26D17528350002DA3A4 /* ZeroconfDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E49ACD8B100745C400A86ECD /* ZeroconfDirectory.cpp */; }; + DFF0F26E17528350002DA3A4 /* ZipDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17930D25F9FA00618676 /* ZipDirectory.cpp */; }; + DFF0F26F17528350002DA3A4 /* ZipFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6971444A8B0007C6459 /* ZipFile.cpp */; }; + DFF0F27017528350002DA3A4 /* ZipManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17950D25F9FA00618676 /* ZipManager.cpp */; }; + DFF0F27117528350002DA3A4 /* AnimatedGif.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7541294222E009E7A26 /* AnimatedGif.cpp */; }; + DFF0F27217528350002DA3A4 /* cximage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF404A3416B9896C00D8023E /* cximage.cpp */; }; + DFF0F27317528350002DA3A4 /* D3DResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7561294222E009E7A26 /* D3DResource.cpp */; }; + DFF0F27417528350002DA3A4 /* DDSImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7571294222E009E7A26 /* DDSImage.cpp */; }; + DFF0F27517528350002DA3A4 /* DirectXGraphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7581294222E009E7A26 /* DirectXGraphics.cpp */; }; + DFF0F27617528350002DA3A4 /* DirtyRegionSolvers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F558F27913ABD56600631E12 /* DirtyRegionSolvers.cpp */; }; + DFF0F27717528350002DA3A4 /* DirtyRegionTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F558F27D13ABD57400631E12 /* DirtyRegionTracker.cpp */; }; + DFF0F27817528350002DA3A4 /* FrameBufferObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7591294222E009E7A26 /* FrameBufferObject.cpp */; }; + DFF0F27917528350002DA3A4 /* GraphicContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C75A1294222E009E7A26 /* GraphicContext.cpp */; }; + DFF0F27A17528350002DA3A4 /* GUIAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF3488E513FD958F0026A711 /* GUIAction.cpp */; }; + DFF0F27B17528350002DA3A4 /* GUIAudioManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C75B1294222E009E7A26 /* GUIAudioManager.cpp */; }; + DFF0F27C17528350002DA3A4 /* GUIBaseContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C75C1294222E009E7A26 /* GUIBaseContainer.cpp */; }; + DFF0F27D17528350002DA3A4 /* GUIBorderedImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C75D1294222E009E7A26 /* GUIBorderedImage.cpp */; }; + DFF0F27E17528350002DA3A4 /* GUIButtonControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C75E1294222E009E7A26 /* GUIButtonControl.cpp */; }; + DFF0F27F17528350002DA3A4 /* GUICheckMarkControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7601294222E009E7A26 /* GUICheckMarkControl.cpp */; }; + DFF0F28017528350002DA3A4 /* GUIColorManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7611294222E009E7A26 /* GUIColorManager.cpp */; }; + DFF0F28117528350002DA3A4 /* GUIControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7621294222E009E7A26 /* GUIControl.cpp */; }; + DFF0F28217528350002DA3A4 /* GUIControlFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7631294222E009E7A26 /* GUIControlFactory.cpp */; }; + DFF0F28317528350002DA3A4 /* GUIControlGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7641294222E009E7A26 /* GUIControlGroup.cpp */; }; + DFF0F28417528350002DA3A4 /* GUIControlGroupList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7651294222E009E7A26 /* GUIControlGroupList.cpp */; }; + DFF0F28517528350002DA3A4 /* GUIControlProfiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7661294222E009E7A26 /* GUIControlProfiler.cpp */; }; + DFF0F28617528350002DA3A4 /* GUIDialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7671294222E009E7A26 /* GUIDialog.cpp */; }; + DFF0F28717528350002DA3A4 /* GUIEditControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7681294222E009E7A26 /* GUIEditControl.cpp */; }; + DFF0F28817528350002DA3A4 /* GUIFadeLabelControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7691294222E009E7A26 /* GUIFadeLabelControl.cpp */; }; + DFF0F28917528350002DA3A4 /* GUIFixedListContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C76A1294222E009E7A26 /* GUIFixedListContainer.cpp */; }; + DFF0F28A17528350002DA3A4 /* GUIFont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C76B1294222E009E7A26 /* GUIFont.cpp */; }; + DFF0F28B17528350002DA3A4 /* GUIFontManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C76C1294222E009E7A26 /* GUIFontManager.cpp */; }; + DFF0F28C17528350002DA3A4 /* GUIFontTTF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C76D1294222E009E7A26 /* GUIFontTTF.cpp */; }; + DFF0F28D17528350002DA3A4 /* GUIFontTTFDX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C76E1294222E009E7A26 /* GUIFontTTFDX.cpp */; }; + DFF0F28E17528350002DA3A4 /* GUIFontTTFGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C76F1294222E009E7A26 /* GUIFontTTFGL.cpp */; }; + DFF0F28F17528350002DA3A4 /* GUIImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7701294222E009E7A26 /* GUIImage.cpp */; }; + DFF0F29017528350002DA3A4 /* GUIIncludes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7711294222E009E7A26 /* GUIIncludes.cpp */; }; + DFF0F29117528350002DA3A4 /* GUIInfoTypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7721294222E009E7A26 /* GUIInfoTypes.cpp */; }; + DFF0F29217528350002DA3A4 /* GUIKeyboardFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF830D0F15BB262700602BE6 /* GUIKeyboardFactory.cpp */; }; + DFF0F29317528350002DA3A4 /* GUILabel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7731294222E009E7A26 /* GUILabel.cpp */; }; + DFF0F29417528350002DA3A4 /* GUILabelControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7741294222E009E7A26 /* GUILabelControl.cpp */; }; + DFF0F29517528350002DA3A4 /* GUIListContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7751294222E009E7A26 /* GUIListContainer.cpp */; }; + DFF0F29617528350002DA3A4 /* GUIListGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7761294222E009E7A26 /* GUIListGroup.cpp */; }; + DFF0F29717528350002DA3A4 /* GUIListItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7771294222E009E7A26 /* GUIListItem.cpp */; }; + DFF0F29817528350002DA3A4 /* GUIListItemLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7781294222E009E7A26 /* GUIListItemLayout.cpp */; }; + DFF0F29917528350002DA3A4 /* GUIListLabel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7791294222E009E7A26 /* GUIListLabel.cpp */; }; + DFF0F29A17528350002DA3A4 /* GUIMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C77A1294222E009E7A26 /* GUIMessage.cpp */; }; + DFF0F29B17528350002DA3A4 /* GUIMoverControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C77B1294222E009E7A26 /* GUIMoverControl.cpp */; }; + DFF0F29C17528350002DA3A4 /* GUIMultiImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C77C1294222E009E7A26 /* GUIMultiImage.cpp */; }; + DFF0F29D17528350002DA3A4 /* GUIMultiSelectText.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C77D1294222E009E7A26 /* GUIMultiSelectText.cpp */; }; + DFF0F29E17528350002DA3A4 /* GUIPanelContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C77E1294222E009E7A26 /* GUIPanelContainer.cpp */; }; + DFF0F29F17528350002DA3A4 /* GUIProgressControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C77F1294222E009E7A26 /* GUIProgressControl.cpp */; }; + DFF0F2A017528350002DA3A4 /* GUIRadioButtonControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7801294222E009E7A26 /* GUIRadioButtonControl.cpp */; }; + DFF0F2A117528350002DA3A4 /* GUIRenderingControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7811294222E009E7A26 /* GUIRenderingControl.cpp */; }; + DFF0F2A217528350002DA3A4 /* GUIResizeControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7821294222E009E7A26 /* GUIResizeControl.cpp */; }; + DFF0F2A317528350002DA3A4 /* GUIRSSControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7831294222E009E7A26 /* GUIRSSControl.cpp */; }; + DFF0F2A417528350002DA3A4 /* GUIScrollBarControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7841294222E009E7A26 /* GUIScrollBarControl.cpp */; }; + DFF0F2A517528350002DA3A4 /* GUISelectButtonControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7851294222E009E7A26 /* GUISelectButtonControl.cpp */; }; + DFF0F2A617528350002DA3A4 /* GUISettingsSliderControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7861294222E009E7A26 /* GUISettingsSliderControl.cpp */; }; + DFF0F2A717528350002DA3A4 /* GUIShader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7871294222E009E7A26 /* GUIShader.cpp */; }; + DFF0F2A817528350002DA3A4 /* GUISliderControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7881294222E009E7A26 /* GUISliderControl.cpp */; }; + DFF0F2A917528350002DA3A4 /* GUISpinControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C78A1294222E009E7A26 /* GUISpinControl.cpp */; }; + DFF0F2AA17528350002DA3A4 /* GUISpinControlEx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C78B1294222E009E7A26 /* GUISpinControlEx.cpp */; }; + DFF0F2AB17528350002DA3A4 /* GUIStaticItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C78D1294222E009E7A26 /* GUIStaticItem.cpp */; }; + DFF0F2AC17528350002DA3A4 /* GUITextBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C78E1294222E009E7A26 /* GUITextBox.cpp */; }; + DFF0F2AD17528350002DA3A4 /* GUITextLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C78F1294222E009E7A26 /* GUITextLayout.cpp */; }; + DFF0F2AE17528350002DA3A4 /* GUITexture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7901294222E009E7A26 /* GUITexture.cpp */; }; + DFF0F2AF17528350002DA3A4 /* GUITextureD3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7911294222E009E7A26 /* GUITextureD3D.cpp */; }; + DFF0F2B017528350002DA3A4 /* GUITextureGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7921294222E009E7A26 /* GUITextureGL.cpp */; }; + DFF0F2B117528350002DA3A4 /* GUITextureGLES.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7931294222E009E7A26 /* GUITextureGLES.cpp */; }; + DFF0F2B217528350002DA3A4 /* GUIToggleButtonControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7941294222E009E7A26 /* GUIToggleButtonControl.cpp */; }; + DFF0F2B317528350002DA3A4 /* GUIVideoControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7951294222E009E7A26 /* GUIVideoControl.cpp */; }; + DFF0F2B417528350002DA3A4 /* GUIVisualisationControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7961294222E009E7A26 /* GUIVisualisationControl.cpp */; }; + DFF0F2B517528350002DA3A4 /* GUIWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7971294222E009E7A26 /* GUIWindow.cpp */; }; + DFF0F2B617528350002DA3A4 /* GUIWindowManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7981294222E009E7A26 /* GUIWindowManager.cpp */; }; + DFF0F2B717528350002DA3A4 /* GUIWrappingListContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7991294222E009E7A26 /* GUIWrappingListContainer.cpp */; }; + DFF0F2B817528350002DA3A4 /* imagefactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF404A3716B9896C00D8023E /* imagefactory.cpp */; }; + DFF0F2B917528350002DA3A4 /* IWindowManagerCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C79A1294222E009E7A26 /* IWindowManagerCallback.cpp */; }; + DFF0F2BA17528350002DA3A4 /* JpegIO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32C631261423A90F00F18420 /* JpegIO.cpp */; }; + DFF0F2BC17528350002DA3A4 /* LocalizeStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C79C1294222E009E7A26 /* LocalizeStrings.cpp */; }; + DFF0F2BD17528350002DA3A4 /* MatrixGLES.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C79D1294222E009E7A26 /* MatrixGLES.cpp */; }; + DFF0F2BE17528350002DA3A4 /* Shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C79E1294222E009E7A26 /* Shader.cpp */; }; + DFF0F2BF17528350002DA3A4 /* Texture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C79F1294222E009E7A26 /* Texture.cpp */; }; + DFF0F2C017528350002DA3A4 /* TextureBundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7A01294222E009E7A26 /* TextureBundle.cpp */; }; + DFF0F2C117528350002DA3A4 /* TextureBundleXBT.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7A11294222E009E7A26 /* TextureBundleXBT.cpp */; }; + DFF0F2C217528350002DA3A4 /* TextureBundleXPR.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7A21294222E009E7A26 /* TextureBundleXPR.cpp */; }; + DFF0F2C317528350002DA3A4 /* TextureDX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7A31294222E009E7A26 /* TextureDX.cpp */; }; + DFF0F2C417528350002DA3A4 /* TextureGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7A41294222E009E7A26 /* TextureGL.cpp */; }; + DFF0F2C517528350002DA3A4 /* TextureManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7A51294222E009E7A26 /* TextureManager.cpp */; }; + DFF0F2C617528350002DA3A4 /* VisibleEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7A61294222E009E7A26 /* VisibleEffect.cpp */; }; + DFF0F2C717528350002DA3A4 /* XBTF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7A71294222E009E7A26 /* XBTF.cpp */; }; + DFF0F2C817528350002DA3A4 /* XBTFReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7A81294222E009E7A26 /* XBTFReader.cpp */; }; + DFF0F2C917528350002DA3A4 /* GenericTouchActionHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4991334174E5E5C00741B6D /* GenericTouchActionHandler.cpp */; }; + DFF0F2CA17528350002DA3A4 /* ITouchInputHandling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4991342174E5E5C00741B6D /* ITouchInputHandling.cpp */; }; + DFF0F2CC17528350002DA3A4 /* SkinVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF98D98A1434F47D00A6EBE1 /* SkinVariable.cpp */; }; + DFF0F2CD17528350002DA3A4 /* AddonsOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0F470161B747500D744F4 /* AddonsOperations.cpp */; }; + DFF0F2CE17528350002DA3A4 /* ApplicationOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18968DC614155D7C005BA742 /* ApplicationOperations.cpp */; }; + DFF0F2CF17528350002DA3A4 /* AudioLibrary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE408013415D9E0004BD79 /* AudioLibrary.cpp */; }; + DFF0F2D017528350002DA3A4 /* FavouritesOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5DB700017322DBB00D4DF21 /* FavouritesOperations.cpp */; }; + DFF0F2D117528350002DA3A4 /* FileItemHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE408613415D9E0004BD79 /* FileItemHandler.cpp */; }; + DFF0F2D217528350002DA3A4 /* FileOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE408813415D9E0004BD79 /* FileOperations.cpp */; }; + DFF0F2D317528350002DA3A4 /* GUIOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 188F7600152217DF009870CE /* GUIOperations.cpp */; }; + DFF0F2D417528350002DA3A4 /* InputOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C807114B135DB5CC002F601B /* InputOperations.cpp */; }; + DFF0F2D517528350002DA3A4 /* JSONRPC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE408C13415D9E0004BD79 /* JSONRPC.cpp */; }; + DFF0F2D617528350002DA3A4 /* JSONServiceDescription.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84BF7321349BB74006D6FC9 /* JSONServiceDescription.cpp */; }; + DFF0F2D717528350002DA3A4 /* PlayerOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE409213415D9E0004BD79 /* PlayerOperations.cpp */; }; + DFF0F2D817528350002DA3A4 /* PlaylistOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE409413415D9E0004BD79 /* PlaylistOperations.cpp */; }; + DFF0F2D917528350002DA3A4 /* PVROperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF00492B162DAEA200A971AD /* PVROperations.cpp */; }; + DFF0F2DA17528350002DA3A4 /* SystemOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE409613415D9E0004BD79 /* SystemOperations.cpp */; }; + DFF0F2DB17528350002DA3A4 /* VideoLibrary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE409813415D9E0004BD79 /* VideoLibrary.cpp */; }; + DFF0F2DC17528350002DA3A4 /* XBMCOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE409A13415D9E0004BD79 /* XBMCOperations.cpp */; }; + DFF0F2DD17528350002DA3A4 /* AddonModuleXbmc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1ACFD115FCE50700E10810 /* AddonModuleXbmc.cpp */; }; + DFF0F2DE17528350002DA3A4 /* AddonModuleXbmcaddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1ACFD515FCE50700E10810 /* AddonModuleXbmcaddon.cpp */; }; + DFF0F2DF17528350002DA3A4 /* AddonModuleXbmcgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1ACFD915FCE50700E10810 /* AddonModuleXbmcgui.cpp */; }; + DFF0F2E017528350002DA3A4 /* AddonModuleXbmcplugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1ACFDD15FCE50700E10810 /* AddonModuleXbmcplugin.cpp */; }; + DFF0F2E117528350002DA3A4 /* AddonModuleXbmcvfs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1ACFE115FCE50700E10810 /* AddonModuleXbmcvfs.cpp */; }; + DFF0F2E217528350002DA3A4 /* CallbackHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F502BFDA160F34B900C96C76 /* CallbackHandler.cpp */; }; + DFF0F2E317528350002DA3A4 /* LanguageHook.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F502BFE4160F34DC00C96C76 /* LanguageHook.cpp */; }; + DFF0F2E417528350002DA3A4 /* PyContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB02DE816629DBA00F37752 /* PyContext.cpp */; }; + DFF0F2E517528350002DA3A4 /* swig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F502BFF0160F36AD00C96C76 /* swig.cpp */; }; + DFF0F2E617528350002DA3A4 /* XBPython.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F502BFE6160F34FE00C96C76 /* XBPython.cpp */; }; + DFF0F2E817528350002DA3A4 /* AnnouncementManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7A700112893E50059D6AA /* AnnouncementManager.cpp */; }; + DFF0F2E917528350002DA3A4 /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */; }; + DFF0F2EA17528350002DA3A4 /* ConvUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D6A0D25F9FD00618676 /* ConvUtils.cpp */; }; + DFF0F2EB17528350002DA3A4 /* LinuxResourceCounter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D700D25F9FD00618676 /* LinuxResourceCounter.cpp */; }; + DFF0F2EC17528350002DA3A4 /* LinuxTimezone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D720D25F9FD00618676 /* LinuxTimezone.cpp */; }; + DFF0F2ED17528350002DA3A4 /* PosixMountProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E56BA51082A675006E788A /* PosixMountProvider.cpp */; }; + DFF0F2EE17528350002DA3A4 /* XFileUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D7D0D25F9FD00618676 /* XFileUtils.cpp */; }; + DFF0F2EF17528350002DA3A4 /* XHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D7F0D25F9FD00618676 /* XHandle.cpp */; }; + DFF0F2F017528350002DA3A4 /* XMemUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D810D25F9FD00618676 /* XMemUtils.cpp */; }; + DFF0F2F117528350002DA3A4 /* XTimeUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D870D25F9FD00618676 /* XTimeUtils.cpp */; }; + DFF0F2F217528350002DA3A4 /* GUIDialogMusicInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E180F0D25F9FA00618676 /* GUIDialogMusicInfo.cpp */; }; + DFF0F2F317528350002DA3A4 /* GUIDialogMusicOSD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17BA0D25F9FA00618676 /* GUIDialogMusicOSD.cpp */; }; + DFF0F2F417528350002DA3A4 /* GUIDialogMusicOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18130D25F9FA00618676 /* GUIDialogMusicOverlay.cpp */; }; + DFF0F2F517528350002DA3A4 /* GUIDialogSongInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17DA0D25F9FA00618676 /* GUIDialogSongInfo.cpp */; }; + DFF0F2F617528350002DA3A4 /* GUIDialogVisualisationPresetList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17E60D25F9FA00618676 /* GUIDialogVisualisationPresetList.cpp */; }; + DFF0F2F717528350002DA3A4 /* MusicAlbumInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E650D25F9FD00618676 /* MusicAlbumInfo.cpp */; }; + DFF0F2F817528350002DA3A4 /* MusicArtistInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29E80DA72486001F0C9D /* MusicArtistInfo.cpp */; }; + DFF0F2F917528350002DA3A4 /* MusicInfoScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D930D25F9FD00618676 /* MusicInfoScanner.cpp */; }; + DFF0F2FA17528350002DA3A4 /* MusicInfoScraper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E670D25F9FD00618676 /* MusicInfoScraper.cpp */; }; + DFF0F2FB17528350002DA3A4 /* GUIDialogKaraokeSongSelector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D00F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp */; }; + DFF0F2FC17528350002DA3A4 /* GUIWindowKaraokeLyrics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AD1EA70F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp */; }; + DFF0F2FD17528350002DA3A4 /* karaokelyrics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D60F1E785700D46E3C /* karaokelyrics.cpp */; }; + DFF0F2FE17528350002DA3A4 /* karaokelyricscdg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D40F1E784800D46E3C /* karaokelyricscdg.cpp */; }; + DFF0F2FF17528350002DA3A4 /* karaokelyricsfactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E20F1E787700D46E3C /* karaokelyricsfactory.cpp */; }; + DFF0F30017528350002DA3A4 /* karaokelyricsmanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E10F1E787700D46E3C /* karaokelyricsmanager.cpp */; }; + DFF0F30117528350002DA3A4 /* karaokelyricstext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E40F1E787700D46E3C /* karaokelyricstext.cpp */; }; + DFF0F30217528350002DA3A4 /* karaokelyricstextkar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51DE0F1E787700D46E3C /* karaokelyricstextkar.cpp */; }; + DFF0F30317528350002DA3A4 /* karaokelyricstextlrc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E30F1E787700D46E3C /* karaokelyricstextlrc.cpp */; }; + DFF0F30417528350002DA3A4 /* karaokelyricstextustar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */; }; + DFF0F30517528350002DA3A4 /* karaokevideobackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */; }; + DFF0F30617528350002DA3A4 /* karaokewindowbackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56A084A0F4A18FB003F9F87 /* karaokewindowbackground.cpp */; }; + DFF0F30717528350002DA3A4 /* MusicInfoTag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C85E129423A7009E7A26 /* MusicInfoTag.cpp */; }; + DFF0F30917528350002DA3A4 /* MusicInfoTagLoaderCDDA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C866129423A7009E7A26 /* MusicInfoTagLoaderCDDA.cpp */; }; + DFF0F30A17528350002DA3A4 /* MusicInfoTagLoaderDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C868129423A7009E7A26 /* MusicInfoTagLoaderDatabase.cpp */; }; + DFF0F30B17528350002DA3A4 /* MusicInfoTagLoaderFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C86A129423A7009E7A26 /* MusicInfoTagLoaderFactory.cpp */; }; + DFF0F30E17528350002DA3A4 /* MusicInfoTagLoaderShn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C87C129423A7009E7A26 /* MusicInfoTagLoaderShn.cpp */; }; + DFF0F31217528350002DA3A4 /* TagLibVFSStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE84CB5915A5B8A600A3810E /* TagLibVFSStream.cpp */; }; + DFF0F31317528350002DA3A4 /* TagLoaderTagLib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AEC0083015ACAC6E0099888C /* TagLoaderTagLib.cpp */; }; + DFF0F31417528350002DA3A4 /* GUIWindowMusicBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E180D0D25F9FA00618676 /* GUIWindowMusicBase.cpp */; }; + DFF0F31517528350002DA3A4 /* GUIWindowMusicNav.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18110D25F9FA00618676 /* GUIWindowMusicNav.cpp */; }; + DFF0F31617528350002DA3A4 /* GUIWindowMusicPlaylist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18150D25F9FA00618676 /* GUIWindowMusicPlaylist.cpp */; }; + DFF0F31717528350002DA3A4 /* GUIWindowMusicPlaylistEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18170D25F9FA00618676 /* GUIWindowMusicPlaylistEditor.cpp */; }; + DFF0F31817528350002DA3A4 /* GUIWindowMusicSongs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18190D25F9FA00618676 /* GUIWindowMusicSongs.cpp */; }; + DFF0F31917528350002DA3A4 /* GUIWindowVisualisation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18470D25F9FA00618676 /* GUIWindowVisualisation.cpp */; }; + DFF0F31A17528350002DA3A4 /* Album.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29DC0DA72429001F0C9D /* Album.cpp */; }; + DFF0F31B17528350002DA3A4 /* Artist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29DB0DA72429001F0C9D /* Artist.cpp */; }; + DFF0F31C17528350002DA3A4 /* GUIViewStateMusic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17FB0D25F9FA00618676 /* GUIViewStateMusic.cpp */; }; + DFF0F31D17528350002DA3A4 /* MusicDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D8F0D25F9FD00618676 /* MusicDatabase.cpp */; }; + DFF0F31E17528350002DA3A4 /* MusicDbUrl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A9466515CF1FD200727135 /* MusicDbUrl.cpp */; }; + DFF0F31F17528350002DA3A4 /* MusicInfoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D910D25F9FD00618676 /* MusicInfoLoader.cpp */; }; + DFF0F32017528350002DA3A4 /* MusicThumbLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC30DAF16291A5C003E7579 /* MusicThumbLoader.cpp */; }; + DFF0F32117528350002DA3A4 /* Song.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E0D0D25F9FD00618676 /* Song.cpp */; }; + DFF0F32217528350002DA3A4 /* HTTPImageHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C6EB6F8155F32C30080368A /* HTTPImageHandler.cpp */; }; + DFF0F32317528350002DA3A4 /* HTTPJsonRpcHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCA6ABB152245CD000BFAAE /* HTTPJsonRpcHandler.cpp */; }; + DFF0F32417528350002DA3A4 /* HTTPVfsHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCA6ABD152245CD000BFAAE /* HTTPVfsHandler.cpp */; }; + DFF0F32517528350002DA3A4 /* HTTPWebinterfaceAddonsHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCA6ABF152245CD000BFAAE /* HTTPWebinterfaceAddonsHandler.cpp */; }; + DFF0F32617528350002DA3A4 /* HTTPWebinterfaceHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCA6AC1152245CD000BFAAE /* HTTPWebinterfaceHandler.cpp */; }; + DFF0F32717528350002DA3A4 /* IHTTPRequestHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCA6AC3152245CD000BFAAE /* IHTTPRequestHandler.cpp */; }; + DFF0F32817528350002DA3A4 /* NetworkLinux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 432D7CE312D86DA500CE4C49 /* NetworkLinux.cpp */; }; + DFF0F32917528350002DA3A4 /* ZeroconfBrowserOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E49ACD9D10074A4000A86ECD /* ZeroconfBrowserOSX.cpp */; }; + DFF0F32A17528350002DA3A4 /* ZeroconfOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E46F7C2C0F77219700C25D29 /* ZeroconfOSX.cpp */; }; + DFF0F32B17528350002DA3A4 /* UPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345D915FA639500A934F6 /* UPnP.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + DFF0F32C17528350002DA3A4 /* UPnPInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DB15FA639500A934F6 /* UPnPInternal.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + DFF0F32D17528350002DA3A4 /* UPnPPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 552840CA1626163B00ED1333 /* UPnPPlayer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + DFF0F32E17528350002DA3A4 /* UPnPRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DD15FA639500A934F6 /* UPnPRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + DFF0F32F17528350002DA3A4 /* UPnPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DF15FA639500A934F6 /* UPnPServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; + DFF0F33017528350002DA3A4 /* UPnPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F563529416E53FAB00D21BAD /* UPnPSettings.cpp */; }; + DFF0F33117528350002DA3A4 /* WebSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52772B151BAF4C00B5B63B /* WebSocket.cpp */; }; + DFF0F33217528350002DA3A4 /* WebSocketManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52772D151BAF4C00B5B63B /* WebSocketManager.cpp */; }; + DFF0F33317528350002DA3A4 /* WebSocketV13.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52772F151BAF4C00B5B63B /* WebSocketV13.cpp */; }; + DFF0F33417528350002DA3A4 /* WebSocketV8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF527731151BAF4C00B5B63B /* WebSocketV8.cpp */; }; + DFF0F33517528350002DA3A4 /* AirPlayServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF34892813FD9C780026A711 /* AirPlayServer.cpp */; }; + DFF0F33617528350002DA3A4 /* AirTunesServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF448455140048A60069344B /* AirTunesServer.cpp */; }; + DFF0F33717528350002DA3A4 /* cddb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E169D0D25F9FA00618676 /* cddb.cpp */; }; + DFF0F33817528350002DA3A4 /* DNSNameCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16890D25F9FA00618676 /* DNSNameCache.cpp */; }; + DFF0F33917528350002DA3A4 /* EventClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3E920010D8C622A002BF43D /* EventClient.cpp */; }; + DFF0F33A17528350002DA3A4 /* EventPacket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3E91FFA0D8C61DF002BF43D /* EventPacket.cpp */; }; + DFF0F33B17528350002DA3A4 /* EventServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3E91FFB0D8C61DF002BF43D /* EventServer.cpp */; }; + DFF0F33C17528350002DA3A4 /* GUIDialogAccessPoints.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3A478190D29032C00F3C3A6 /* GUIDialogAccessPoints.cpp */; }; + DFF0F33D17528350002DA3A4 /* GUIDialogNetworkSetup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17C00D25F9FA00618676 /* GUIDialogNetworkSetup.cpp */; }; + DFF0F33E17528350002DA3A4 /* Network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E6B0D25F9FD00618676 /* Network.cpp */; }; + DFF0F33F17528350002DA3A4 /* NetworkServices.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFB4A172D9D6D00A43CF7 /* NetworkServices.cpp */; }; + DFF0F34017528350002DA3A4 /* Socket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3E91FFC0D8C61DF002BF43D /* Socket.cpp */; }; + DFF0F34117528350002DA3A4 /* TCPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 432D7CF612D870E800CE4C49 /* TCPServer.cpp */; }; + DFF0F34217528350002DA3A4 /* UdpClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E8B0D25F9FD00618676 /* UdpClient.cpp */; }; + DFF0F34317528350002DA3A4 /* WakeOnAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFA8157C16713B1200E4E597 /* WakeOnAccess.cpp */; }; + DFF0F34417528350002DA3A4 /* WebServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7A859112908F00059D6AA /* WebServer.cpp */; }; + DFF0F34517528350002DA3A4 /* Zeroconf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E46F7C280F77217400C25D29 /* Zeroconf.cpp */; }; + DFF0F34617528350002DA3A4 /* ZeroconfBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E49ACDD410074F9200A86ECD /* ZeroconfBrowser.cpp */; }; + DFF0F34717528350002DA3A4 /* PeripheralBusUSB.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10513140AA38000175026 /* PeripheralBusUSB.cpp */; }; + DFF0F34817528350002DA3A4 /* PeripheralBus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10515140AA38000175026 /* PeripheralBus.cpp */; }; + DFF0F34917528350002DA3A4 /* Peripheral.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1051C140AA38000175026 /* Peripheral.cpp */; }; + DFF0F34A17528350002DA3A4 /* PeripheralBluetooth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1051E140AA38000175026 /* PeripheralBluetooth.cpp */; }; + DFF0F34B17528350002DA3A4 /* PeripheralCecAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10520140AA38000175026 /* PeripheralCecAdapter.cpp */; }; + DFF0F34C17528350002DA3A4 /* PeripheralDisk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10522140AA38000175026 /* PeripheralDisk.cpp */; }; + DFF0F34D17528350002DA3A4 /* PeripheralHID.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10524140AA38000175026 /* PeripheralHID.cpp */; }; + DFF0F34E17528350002DA3A4 /* PeripheralImon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1D638126161E211E003603ED /* PeripheralImon.cpp */; }; + DFF0F34F17528350002DA3A4 /* PeripheralNIC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10526140AA38000175026 /* PeripheralNIC.cpp */; }; + DFF0F35017528350002DA3A4 /* PeripheralNyxboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10528140AA38000175026 /* PeripheralNyxboard.cpp */; }; + DFF0F35117528350002DA3A4 /* PeripheralTuner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1052A140AA38000175026 /* PeripheralTuner.cpp */; }; + DFF0F35217528350002DA3A4 /* GUIDialogPeripheralManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1052D140AA38000175026 /* GUIDialogPeripheralManager.cpp */; }; + DFF0F35317528350002DA3A4 /* GUIDialogPeripheralSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1052F140AA38000175026 /* GUIDialogPeripheralSettings.cpp */; }; + DFF0F35417528350002DA3A4 /* Peripherals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10533140AA38000175026 /* Peripherals.cpp */; }; + DFF0F35517528350002DA3A4 /* GUIDialogPictureInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17C60D25F9FA00618676 /* GUIDialogPictureInfo.cpp */; }; + DFF0F35617528350002DA3A4 /* GUIViewStatePictures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 886328170E07B37200BB3DAB /* GUIViewStatePictures.cpp */; }; + DFF0F35717528350002DA3A4 /* GUIWindowPictures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E181F0D25F9FA00618676 /* GUIWindowPictures.cpp */; }; + DFF0F35817528350002DA3A4 /* GUIWindowSlideShow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18350D25F9FA00618676 /* GUIWindowSlideShow.cpp */; }; + DFF0F35917528350002DA3A4 /* Picture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1DD70D25F9FD00618676 /* Picture.cpp */; }; + DFF0F35A17528350002DA3A4 /* PictureInfoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1DD90D25F9FD00618676 /* PictureInfoLoader.cpp */; }; + DFF0F35B17528350002DA3A4 /* PictureInfoTag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1DDB0D25F9FD00618676 /* PictureInfoTag.cpp */; }; + DFF0F35C17528350002DA3A4 /* PictureThumbLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1DDD0D25F9FD00618676 /* PictureThumbLoader.cpp */; }; + DFF0F35D17528350002DA3A4 /* SlideShowPicture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E090D25F9FD00618676 /* SlideShowPicture.cpp */; }; + DFF0F35E17528350002DA3A4 /* PlayList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C91D129428CA009E7A26 /* PlayList.cpp */; }; + DFF0F35F17528350002DA3A4 /* PlayListB4S.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C91F129428CA009E7A26 /* PlayListB4S.cpp */; }; + DFF0F36017528350002DA3A4 /* PlayListFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C921129428CA009E7A26 /* PlayListFactory.cpp */; }; + DFF0F36117528350002DA3A4 /* PlayListM3U.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C923129428CA009E7A26 /* PlayListM3U.cpp */; }; + DFF0F36217528350002DA3A4 /* PlayListPLS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C925129428CA009E7A26 /* PlayListPLS.cpp */; }; + DFF0F36317528350002DA3A4 /* PlayListURL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C927129428CA009E7A26 /* PlayListURL.cpp */; }; + DFF0F36417528350002DA3A4 /* PlayListWPL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C929129428CA009E7A26 /* PlayListWPL.cpp */; }; + DFF0F36517528350002DA3A4 /* PlayListXML.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C92B129428CA009E7A26 /* PlayListXML.cpp */; }; + DFF0F36617528350002DA3A4 /* SmartPlayList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C92D129428CA009E7A26 /* SmartPlayList.cpp */; }; + DFF0F36717528350002DA3A4 /* CocoaPowerSyscall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5EA02200F6DA85C005C2EC5 /* CocoaPowerSyscall.cpp */; }; + DFF0F36817528350002DA3A4 /* DPMSSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5987F040FBDF274008EF4FB /* DPMSSupport.cpp */; }; + DFF0F36917528350002DA3A4 /* PowerManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5EA021A0F6DA7E8005C2EC5 /* PowerManager.cpp */; }; + DFF0F36A17528350002DA3A4 /* GUIDialogLockSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28ED94170E1A11005FA9D2 /* GUIDialogLockSettings.cpp */; }; + DFF0F36B17528350002DA3A4 /* GUIDialogProfileSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28ED96170E1A11005FA9D2 /* GUIDialogProfileSettings.cpp */; }; + DFF0F36C17528350002DA3A4 /* GUIWindowSettingsProfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28ED9F170E1A11005FA9D2 /* GUIWindowSettingsProfile.cpp */; }; + DFF0F36D17528350002DA3A4 /* Profile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28ED9A170E1A11005FA9D2 /* Profile.cpp */; }; + DFF0F36E17528350002DA3A4 /* ProfilesManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28ED9C170E1A11005FA9D2 /* ProfilesManager.cpp */; }; + DFF0F36F17528350002DA3A4 /* GUIViewStatePrograms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 886328190E07B37200BB3DAB /* GUIViewStatePrograms.cpp */; }; + DFF0F37017528350002DA3A4 /* GUIWindowPrograms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18230D25F9FA00618676 /* GUIWindowPrograms.cpp */; }; + DFF0F37117528350002DA3A4 /* PVRClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482874156CFCD8005A996F /* PVRClient.cpp */; }; + DFF0F37217528350002DA3A4 /* PVRClients.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482876156CFCD8005A996F /* PVRClients.cpp */; }; + DFF0F37317528350002DA3A4 /* PVRChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848287A156CFCD8005A996F /* PVRChannel.cpp */; }; + DFF0F37417528350002DA3A4 /* PVRChannelGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848287C156CFCD8005A996F /* PVRChannelGroup.cpp */; }; + DFF0F37517528350002DA3A4 /* PVRChannelGroupInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848287E156CFCD8005A996F /* PVRChannelGroupInternal.cpp */; }; + DFF0F37617528350002DA3A4 /* PVRChannelGroups.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482880156CFCD8005A996F /* PVRChannelGroups.cpp */; }; + DFF0F37717528350002DA3A4 /* PVRChannelGroupsContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482882156CFCD8005A996F /* PVRChannelGroupsContainer.cpp */; }; + DFF0F37817528350002DA3A4 /* GUIDialogPVRChannelManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482885156CFCD8005A996F /* GUIDialogPVRChannelManager.cpp */; }; + DFF0F37917528350002DA3A4 /* GUIDialogPVRChannelsOSD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482887156CFCD8005A996F /* GUIDialogPVRChannelsOSD.cpp */; }; + DFF0F37C17528350002DA3A4 /* GUIDialogPVRGroupManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848288D156CFCD8005A996F /* GUIDialogPVRGroupManager.cpp */; }; + DFF0F37D17528350002DA3A4 /* GUIDialogPVRGuideInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848288F156CFCD8005A996F /* GUIDialogPVRGuideInfo.cpp */; }; + DFF0F37E17528350002DA3A4 /* GUIDialogPVRGuideOSD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482891156CFCD8005A996F /* GUIDialogPVRGuideOSD.cpp */; }; + DFF0F37F17528350002DA3A4 /* GUIDialogPVRGuideSearch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482893156CFCD8005A996F /* GUIDialogPVRGuideSearch.cpp */; }; + DFF0F38017528350002DA3A4 /* GUIDialogPVRRecordingInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482895156CFCD8005A996F /* GUIDialogPVRRecordingInfo.cpp */; }; + DFF0F38117528350002DA3A4 /* GUIDialogPVRTimerSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8482897156CFCD8005A996F /* GUIDialogPVRTimerSettings.cpp */; }; + DFF0F38217528350002DA3A4 /* PVRRecording.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828A3156CFCD8005A996F /* PVRRecording.cpp */; }; + DFF0F38317528350002DA3A4 /* PVRRecordings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828A5156CFCD8005A996F /* PVRRecordings.cpp */; }; + DFF0F38417528350002DA3A4 /* PVRTimerInfoTag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828A9156CFCD8005A996F /* PVRTimerInfoTag.cpp */; }; + DFF0F38517528350002DA3A4 /* PVRTimers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828AB156CFCD8005A996F /* PVRTimers.cpp */; }; + DFF0F38617528350002DA3A4 /* GUIViewStatePVR.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828AE156CFCD8005A996F /* GUIViewStatePVR.cpp */; }; + DFF0F38717528350002DA3A4 /* GUIWindowPVRBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828B0156CFCD8005A996F /* GUIWindowPVRBase.cpp */; }; + DFF0F38817528350002DA3A4 /* GUIWindowPVRChannels.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828B2156CFCD8005A996F /* GUIWindowPVRChannels.cpp */; }; + DFF0F38A17528350002DA3A4 /* GUIWindowPVRGuide.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828B6156CFCD8005A996F /* GUIWindowPVRGuide.cpp */; }; + DFF0F38B17528350002DA3A4 /* GUIWindowPVRRecordings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828B8156CFCD8005A996F /* GUIWindowPVRRecordings.cpp */; }; + DFF0F38C17528350002DA3A4 /* GUIWindowPVRSearch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828BA156CFCD8005A996F /* GUIWindowPVRSearch.cpp */; }; + DFF0F38D17528350002DA3A4 /* GUIWindowPVRTimers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828BC156CFCD8005A996F /* GUIWindowPVRTimers.cpp */; }; + DFF0F38E17528350002DA3A4 /* PVRDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848289B156CFCD8005A996F /* PVRDatabase.cpp */; }; + DFF0F38F17528350002DA3A4 /* PVRGUIInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848289D156CFCD8005A996F /* PVRGUIInfo.cpp */; }; + DFF0F39017528350002DA3A4 /* PVRManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848289F156CFCD8005A996F /* PVRManager.cpp */; }; + DFF0F39117528350002DA3A4 /* RenderSystemGLES.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4991413174E5FF000741B6D /* RenderSystemGLES.cpp */; }; + DFF0F39217528350002DA3A4 /* RenderSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C779E1F104A57E500F444C4 /* RenderSystem.cpp */; }; + DFF0F39317528350002DA3A4 /* GUIControlSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFADD172D9C5100A43CF7 /* GUIControlSettings.cpp */; }; + DFF0F39417528350002DA3A4 /* GUIDialogContentSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352A216E5402100D21BAD /* GUIDialogContentSettings.cpp */; }; + DFF0F39617528350002DA3A4 /* GUIWindowSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B016E5403400D21BAD /* GUIWindowSettings.cpp */; }; + DFF0F39717528350002DA3A4 /* GUIWindowSettingsCategory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B216E5403400D21BAD /* GUIWindowSettingsCategory.cpp */; }; + DFF0F39817528350002DA3A4 /* GUIWindowSettingsScreenCalibration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B616E5403400D21BAD /* GUIWindowSettingsScreenCalibration.cpp */; }; + DFF0F39917528350002DA3A4 /* GUIWindowTestPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B816E5403400D21BAD /* GUIWindowTestPattern.cpp */; }; + DFF0F39A17528350002DA3A4 /* AdvancedSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C3A612942132009E7A26 /* AdvancedSettings.cpp */; }; + DFF0F39B17528350002DA3A4 /* DisplaySettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28EE01170E1E51005FA9D2 /* DisplaySettings.cpp */; }; + DFF0F39D17528350002DA3A4 /* MediaSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF8990161709BB2D00B35C21 /* MediaSettings.cpp */; }; + DFF0F39E17528350002DA3A4 /* MediaSourceSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF8990181709BB2D00B35C21 /* MediaSourceSettings.cpp */; }; + DFF0F3A017528350002DA3A4 /* SettingAddon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFAF4172D9CAB00A43CF7 /* SettingAddon.cpp */; }; + DFF0F3A317528350002DA3A4 /* SettingControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFAFA172D9CAB00A43CF7 /* SettingControl.cpp */; }; + DFF0F3A517528350002DA3A4 /* SettingPath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFAFE172D9CAB00A43CF7 /* SettingPath.cpp */; }; + DFF0F3A617528350002DA3A4 /* Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C38E129420E5009E7A26 /* Settings.cpp */; }; + DFF0F3AB17528350002DA3A4 /* SkinSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89901A1709BB2D00B35C21 /* SkinSettings.cpp */; }; + DFF0F3AC17528350002DA3A4 /* VideoSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E010D25F9FD00618676 /* VideoSettings.cpp */; }; + DFF0F3AD17528350002DA3A4 /* DarwinStorageProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F599CD73108E6A7A0010EC2A /* DarwinStorageProvider.cpp */; }; + DFF0F3AE17528350002DA3A4 /* AutorunMediaJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A249F51095C880003D74C6 /* AutorunMediaJob.cpp */; }; + DFF0F3AF17528350002DA3A4 /* cdioSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E169F0D25F9FA00618676 /* cdioSupport.cpp */; }; + DFF0F3B017528350002DA3A4 /* DetectDVDType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16840D25F9FA00618676 /* DetectDVDType.cpp */; }; + DFF0F3B117528350002DA3A4 /* IoSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F599CD29108E65370010EC2A /* IoSupport.cpp */; }; + DFF0F3B217528350002DA3A4 /* MediaManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D8B0D25F9FD00618676 /* MediaManager.cpp */; }; + DFF0F3B317528350002DA3A4 /* Implementation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38F4E56C13CCCB3B00664821 /* Implementation.cpp */; }; + DFF0F3B417528350002DA3A4 /* Atomics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83E0B2480F7C95FF0091643F /* Atomics.cpp */; }; + DFF0F3B517528350002DA3A4 /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E350D25F9FD00618676 /* Event.cpp */; }; + DFF0F3B617528350002DA3A4 /* LockFree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A72B950FBC8E3B00171871 /* LockFree.cpp */; }; + DFF0F3B717528350002DA3A4 /* SystemClock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3802709813D5A653009493DD /* SystemClock.cpp */; }; + DFF0F3B817528350002DA3A4 /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E850D25F9FD00618676 /* Thread.cpp */; }; + DFF0F3B917528350002DA3A4 /* Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD928F116384B6800709DAE /* Timer.cpp */; }; + DFF0F3BA17528350002DA3A4 /* AlarmClock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E230D25F9FD00618676 /* AlarmClock.cpp */; }; + DFF0F3BB17528350002DA3A4 /* AliasShortcutUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A9D3081097C9370050490F /* AliasShortcutUtils.cpp */; }; + DFF0F3BC17528350002DA3A4 /* Archive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E250D25F9FD00618676 /* Archive.cpp */; }; + DFF0F3BD17528350002DA3A4 /* AsyncFileCopy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5FDF51C0E7218950005B0A6 /* AsyncFileCopy.cpp */; }; + DFF0F3BE17528350002DA3A4 /* AutoPtrHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5BDB81F120203C200F0B710 /* AutoPtrHandle.cpp */; }; + DFF0F3BF17528350002DA3A4 /* Base64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52769A151BAEDA00B5B63B /* Base64.cpp */; }; + DFF0F3C017528350002DA3A4 /* BitstreamConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56353BD16E9BB3500D21BAD /* BitstreamConverter.cpp */; }; + DFF0F3C117528350002DA3A4 /* BitstreamStats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E270D25F9FD00618676 /* BitstreamStats.cpp */; }; + DFF0F3C217528350002DA3A4 /* BooleanLogic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFB1A172D9D0100A43CF7 /* BooleanLogic.cpp */; }; + DFF0F3C317528350002DA3A4 /* CharsetConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E290D25F9FD00618676 /* CharsetConverter.cpp */; }; + DFF0F3C417528350002DA3A4 /* CPUInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E2B0D25F9FD00618676 /* CPUInfo.cpp */; }; + DFF0F3C517528350002DA3A4 /* Crc32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C8E712942603009E7A26 /* Crc32.cpp */; }; + DFF0F3C617528350002DA3A4 /* CryptThreading.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5BD02F4148D3A7E001B5583 /* CryptThreading.cpp */; }; + DFF0F3C717528350002DA3A4 /* DatabaseUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A9443B15821E2800727135 /* DatabaseUtils.cpp */; }; + DFF0F3CB17528350002DA3A4 /* Environment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF529BAC1741697B00523FB4 /* Environment.cpp */; }; + DFF0F3CC17528350002DA3A4 /* Fanart.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29E90DA72486001F0C9D /* Fanart.cpp */; }; + DFF0F3CE17528350002DA3A4 /* FileOperationJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5F244641110DC6B009126C6 /* FileOperationJob.cpp */; }; + DFF0F3CF17528350002DA3A4 /* FileUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5F245EC1112C9AB009126C6 /* FileUtils.cpp */; }; + DFF0F3D017528350002DA3A4 /* GLUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18C1D22B13033F6A00CFFE59 /* GLUtils.cpp */; }; + DFF0F3D117528350002DA3A4 /* GroupUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5EDC48A1651A6F900B852D8 /* GroupUtils.cpp */; }; + DFF0F3D317528350002DA3A4 /* HTMLUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E420D25F9FD00618676 /* HTMLUtil.cpp */; }; + DFF0F3D417528350002DA3A4 /* HttpHeader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E460D25F9FD00618676 /* HttpHeader.cpp */; }; + DFF0F3D517528350002DA3A4 /* HttpParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF34898113FDAAF60026A711 /* HttpParser.cpp */; }; + DFF0F3D617528350002DA3A4 /* HttpResponse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52769C151BAEDA00B5B63B /* HttpResponse.cpp */; }; + DFF0F3D717528350002DA3A4 /* InfoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E4C0D25F9FD00618676 /* InfoLoader.cpp */; }; + DFF0F3D817528350002DA3A4 /* JobManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F57B6F7E1071B8B500079ACB /* JobManager.cpp */; }; + DFF0F3D917528350002DA3A4 /* JSONVariantParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1840B74B13993D8A007C848B /* JSONVariantParser.cpp */; }; + DFF0F3DA17528350002DA3A4 /* JSONVariantWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1840B75113993DA0007C848B /* JSONVariantWriter.cpp */; }; + DFF0F3DB17528350002DA3A4 /* LabelFormatter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E530D25F9FD00618676 /* LabelFormatter.cpp */; }; + DFF0F3DC17528350002DA3A4 /* LangCodeExpander.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18560D25F9FA00618676 /* LangCodeExpander.cpp */; }; + DFF0F3DD17528350002DA3A4 /* LegacyPathTranslation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFE4095917417FDF00473BD9 /* LegacyPathTranslation.cpp */; }; + DFF0F3DE17528350002DA3A4 /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E5B0D25F9FD00618676 /* log.cpp */; }; + DFF0F3DF17528350002DA3A4 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5F8E1E60E427F6700A8E96F /* md5.cpp */; }; + DFF0F3E017528350002DA3A4 /* Mime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 188F75FC152217BC009870CE /* Mime.cpp */; }; + DFF0F3E117528350002DA3A4 /* Observer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C84828FF156CFE4B005A996F /* Observer.cpp */; }; + DFF0F3E217528350002DA3A4 /* PerformanceSample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E6F0D25F9FD00618676 /* PerformanceSample.cpp */; }; + DFF0F3E317528350002DA3A4 /* PerformanceStats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E710D25F9FD00618676 /* PerformanceStats.cpp */; }; + DFF0F3E417528350002DA3A4 /* POUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5ED908C15538E2300842059 /* POUtils.cpp */; }; + DFF0F3E517528350002DA3A4 /* RecentlyAddedJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18ACF84113596C9B00B67371 /* RecentlyAddedJob.cpp */; }; + DFF0F3E617528350002DA3A4 /* RegExp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E730D25F9FD00618676 /* RegExp.cpp */; }; + DFF0F3E717528350002DA3A4 /* RingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5DC87E1110A287400EE1B15 /* RingBuffer.cpp */; }; + DFF0F3E817528350002DA3A4 /* RssManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAF6A4D16EBAE3800D6AE12 /* RssManager.cpp */; }; + DFF0F3E917528350002DA3A4 /* RssReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E750D25F9FD00618676 /* RssReader.cpp */; }; + DFF0F3EA17528350002DA3A4 /* ScraperParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E770D25F9FD00618676 /* ScraperParser.cpp */; }; + DFF0F3EB17528350002DA3A4 /* ScraperUrl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29E70DA72486001F0C9D /* ScraperUrl.cpp */; }; + DFF0F3EC17528350002DA3A4 /* Screenshot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C4458BB161E203800A905F6 /* Screenshot.cpp */; }; + DFF0F3ED17528350002DA3A4 /* SeekHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1A492115A962EE004AF4A4 /* SeekHandler.cpp */; }; + DFF0F3EE17528350002DA3A4 /* SortUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A9443F15821E7C00727135 /* SortUtils.cpp */; }; + DFF0F3EF17528350002DA3A4 /* Splash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E7F0D25F9FD00618676 /* Splash.cpp */; }; + DFF0F3F017528350002DA3A4 /* Stopwatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E810D25F9FD00618676 /* Stopwatch.cpp */; }; + DFF0F3F117528350002DA3A4 /* StreamDetails.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5487B4B0FE6F02700E506FD /* StreamDetails.cpp */; }; + DFF0F3F217528350002DA3A4 /* StreamUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18ECC96013CF178D00A9ED6C /* StreamUtils.cpp */; }; + DFF0F3F317528350002DA3A4 /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C8F11294261F009E7A26 /* StringUtils.cpp */; }; + DFF0F3F417528350002DA3A4 /* SystemInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E830D25F9FD00618676 /* SystemInfo.cpp */; }; + DFF0F3F517528350002DA3A4 /* TextSearch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848291D156D003E005A996F /* TextSearch.cpp */; }; + DFF0F3F617528350002DA3A4 /* TimeSmoother.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEE2E5913D6B71E000ABF2A /* TimeSmoother.cpp */; }; + DFF0F3F717528350002DA3A4 /* TimeUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7FC7106A0DF500992676 /* TimeUtils.cpp */; }; + DFF0F3F917528350002DA3A4 /* URIUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C8EC12942613009E7A26 /* URIUtils.cpp */; }; + DFF0F3FA17528350002DA3A4 /* UrlOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A9466815CF1FED00727135 /* UrlOptions.cpp */; }; + DFF0F3FB17528350002DA3A4 /* Variant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF1FB09123B1AF000B2CBCB /* Variant.cpp */; }; + DFF0F3FC17528350002DA3A4 /* Weather.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E8D0D25F9FD00618676 /* Weather.cpp */; }; + DFF0F3FD17528350002DA3A4 /* XBMCTinyXML.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5ED908615538DCE00842059 /* XBMCTinyXML.cpp */; }; + DFF0F3FE17528350002DA3A4 /* XMLUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C9811294385F009E7A26 /* XMLUtils.cpp */; }; + DFF0F3FF17528350002DA3A4 /* GUIDialogAudioSubtitleSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C8FE12942761009E7A26 /* GUIDialogAudioSubtitleSettings.cpp */; }; + DFF0F40017528350002DA3A4 /* GUIDialogFileStacking.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17AA0D25F9FA00618676 /* GUIDialogFileStacking.cpp */; }; + DFF0F40117528350002DA3A4 /* GUIDialogFullScreenInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 886328150E07B37200BB3DAB /* GUIDialogFullScreenInfo.cpp */; }; + DFF0F40217528350002DA3A4 /* GUIDialogTeletext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E55B65107412DE006E788A /* GUIDialogTeletext.cpp */; }; + DFF0F40317528350002DA3A4 /* GUIDialogVideoBookmarks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17E00D25F9FA00618676 /* GUIDialogVideoBookmarks.cpp */; }; + DFF0F40417528350002DA3A4 /* GUIDialogVideoInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E183F0D25F9FA00618676 /* GUIDialogVideoInfo.cpp */; }; + DFF0F40517528350002DA3A4 /* GUIDialogVideoOSD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E181D0D25F9FA00618676 /* GUIDialogVideoOSD.cpp */; }; + DFF0F40617528350002DA3A4 /* GUIDialogVideoOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18430D25F9FA00618676 /* GUIDialogVideoOverlay.cpp */; }; + DFF0F40717528350002DA3A4 /* GUIDialogVideoSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C90B129427A6009E7A26 /* GUIDialogVideoSettings.cpp */; }; + DFF0F40817528350002DA3A4 /* GUIWindowFullScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18050D25F9FA00618676 /* GUIWindowFullScreen.cpp */; }; + DFF0F40917528350002DA3A4 /* GUIWindowVideoBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E183B0D25F9FA00618676 /* GUIWindowVideoBase.cpp */; }; + DFF0F40A17528350002DA3A4 /* GUIWindowVideoNav.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18410D25F9FA00618676 /* GUIWindowVideoNav.cpp */; }; + DFF0F40B17528350002DA3A4 /* GUIWindowVideoPlaylist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18450D25F9FA00618676 /* GUIWindowVideoPlaylist.cpp */; }; + DFF0F40C17528350002DA3A4 /* Bookmark.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C62F24010505BC7002AD2C1 /* Bookmark.cpp */; }; + DFF0F40D17528350002DA3A4 /* FFmpegVideoDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF072532168734ED008DCAAD /* FFmpegVideoDecoder.cpp */; }; + DFF0F40E17528350002DA3A4 /* GUIViewStateVideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17FF0D25F9FA00618676 /* GUIViewStateVideo.cpp */; }; + DFF0F40F17528350002DA3A4 /* PlayerController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C87B2CC162CE39600EF897D /* PlayerController.cpp */; }; + DFF0F41017528350002DA3A4 /* Teletext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E55B6E10741340006E788A /* Teletext.cpp */; }; + DFF0F41117528350002DA3A4 /* VideoDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E930D25F9FD00618676 /* VideoDatabase.cpp */; }; + DFF0F41217528350002DA3A4 /* VideoDbUrl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A9466B15CF201F00727135 /* VideoDbUrl.cpp */; }; + DFF0F41317528350002DA3A4 /* VideoInfoDownloader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E4A0D25F9FD00618676 /* VideoInfoDownloader.cpp */; }; + DFF0F41417528350002DA3A4 /* VideoInfoScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E950D25F9FD00618676 /* VideoInfoScanner.cpp */; }; + DFF0F41517528350002DA3A4 /* VideoInfoTag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E970D25F9FD00618676 /* VideoInfoTag.cpp */; }; + DFF0F41617528350002DA3A4 /* VideoReferenceClock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F59876BF0FBA351D008EF4FB /* VideoReferenceClock.cpp */; }; + DFF0F41717528350002DA3A4 /* VideoThumbLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC30DBE16291C2C003E7579 /* VideoThumbLoader.cpp */; }; + DFF0F41817528350002DA3A4 /* GUIViewControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF64FE3516C07AAA00D028FB /* GUIViewControl.cpp */; }; + DFF0F41917528350002DA3A4 /* GUIViewState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF64FE3716C07AAA00D028FB /* GUIViewState.cpp */; }; + DFF0F41A17528350002DA3A4 /* ViewDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF64FE3A16C07AAA00D028FB /* ViewDatabase.cpp */; }; + DFF0F41B17528350002DA3A4 /* ViewStateSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89901F1709BB5400B35C21 /* ViewStateSettings.cpp */; }; + DFF0F41C17528350002DA3A4 /* WinEventsSDL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C779E27104A57E500F444C4 /* WinEventsSDL.cpp */; }; + DFF0F41D17528350002DA3A4 /* WinSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C779E29104A57E500F444C4 /* WinSystem.cpp */; }; + DFF0F41E17528350002DA3A4 /* GUIMediaWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17F00D25F9FA00618676 /* GUIMediaWindow.cpp */; }; + DFF0F41F17528350002DA3A4 /* GUIWindowDebugInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F558F29413ABD7DF00631E12 /* GUIWindowDebugInfo.cpp */; }; + DFF0F42017528350002DA3A4 /* GUIWindowFileManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18030D25F9FA00618676 /* GUIWindowFileManager.cpp */; }; + DFF0F42117528350002DA3A4 /* GUIWindowHome.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18090D25F9FA00618676 /* GUIWindowHome.cpp */; }; + DFF0F42217528350002DA3A4 /* GUIWindowLoginScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E180B0D25F9FA00618676 /* GUIWindowLoginScreen.cpp */; }; + DFF0F42317528350002DA3A4 /* GUIWindowPointer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18210D25F9FA00618676 /* GUIWindowPointer.cpp */; }; + DFF0F42417528350002DA3A4 /* GUIWindowScreensaver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18250D25F9FA00618676 /* GUIWindowScreensaver.cpp */; }; + DFF0F42517528350002DA3A4 /* GUIWindowScreensaverDim.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C89619013B6A16F003631FE /* GUIWindowScreensaverDim.cpp */; }; + DFF0F42617528350002DA3A4 /* GUIWindowStartup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18370D25F9FA00618676 /* GUIWindowStartup.cpp */; }; + DFF0F42717528350002DA3A4 /* GUIWindowSystemInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18390D25F9FA00618676 /* GUIWindowSystemInfo.cpp */; }; + DFF0F42817528350002DA3A4 /* GUIWindowWeather.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18490D25F9FA00618676 /* GUIWindowWeather.cpp */; }; + DFF0F43117528350002DA3A4 /* Application.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14640D25F9F900618676 /* Application.cpp */; }; + DFF0F43217528350002DA3A4 /* ApplicationMessenger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14660D25F9F900618676 /* ApplicationMessenger.cpp */; }; + DFF0F43317528350002DA3A4 /* AppParamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352C616E5436900D21BAD /* AppParamParser.cpp */; }; + DFF0F43417528350002DA3A4 /* Autorun.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E146E0D25F9F900618676 /* Autorun.cpp */; }; + DFF0F43517528350002DA3A4 /* AutoSwitch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14700D25F9F900618676 /* AutoSwitch.cpp */; }; + DFF0F43617528350002DA3A4 /* BackgroundInfoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14720D25F9F900618676 /* BackgroundInfoLoader.cpp */; }; + DFF0F43717528350002DA3A4 /* CueDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E167E0D25F9FA00618676 /* CueDocument.cpp */; }; + DFF0F43817528350002DA3A4 /* DatabaseManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1D682715A7D2FD00658B65 /* DatabaseManager.cpp */; }; + DFF0F43917528350002DA3A4 /* DbUrl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A9466115CF1FA600727135 /* DbUrl.cpp */; }; + DFF0F43A17528350002DA3A4 /* DynamicDll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E168C0D25F9FA00618676 /* DynamicDll.cpp */; }; + DFF0F43C17528350002DA3A4 /* FileItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16920D25F9FA00618676 /* FileItem.cpp */; }; + DFF0F43D17528350002DA3A4 /* GUIInfoManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E3E0D25F9FD00618676 /* GUIInfoManager.cpp */; }; + DFF0F43E17528350002DA3A4 /* GUILargeTextureManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17EE0D25F9FA00618676 /* GUILargeTextureManager.cpp */; }; + DFF0F43F17528350002DA3A4 /* GUIPassword.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17F20D25F9FA00618676 /* GUIPassword.cpp */; }; + DFF0F44017528350002DA3A4 /* LangInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18580D25F9FA00618676 /* LangInfo.cpp */; }; + DFF0F44117528350002DA3A4 /* MediaSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 880DBE4B0DC223FF00E26B71 /* MediaSource.cpp */; }; + DFF0F44217528350002DA3A4 /* NfoFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1DC10D25F9FD00618676 /* NfoFile.cpp */; }; + DFF0F44317528350002DA3A4 /* PartyModeManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1DD50D25F9FD00618676 /* PartyModeManager.cpp */; }; + DFF0F44417528350002DA3A4 /* PasswordManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CAA25331085963B0096DE39 /* PasswordManager.cpp */; }; + DFF0F44517528350002DA3A4 /* PlayListPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1DE90D25F9FD00618676 /* PlayListPlayer.cpp */; }; + DFF0F44617528350002DA3A4 /* SectionLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1DFE0D25F9FD00618676 /* SectionLoader.cpp */; }; + DFF0F44717528350002DA3A4 /* SystemGlobals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8D0B2AE1265A9A800F0C0AC /* SystemGlobals.cpp */; }; + DFF0F44917528350002DA3A4 /* TextureCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8A14541154CB2600E5FCFA /* TextureCache.cpp */; }; + DFF0F44A17528350002DA3A4 /* TextureCacheJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1A85631520522500C63311 /* TextureCacheJob.cpp */; }; + DFF0F44B17528350002DA3A4 /* TextureDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8A187A115B2A8200E5FCFA /* TextureDatabase.cpp */; }; + DFF0F44C17528350002DA3A4 /* ThumbLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E180D25F9FD00618676 /* ThumbLoader.cpp */; }; + DFF0F44D17528350002DA3A4 /* ThumbnailCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E1A0D25F9FD00618676 /* ThumbnailCache.cpp */; }; + DFF0F44E17528350002DA3A4 /* URL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E1E0D25F9FD00618676 /* URL.cpp */; }; + DFF0F44F17528350002DA3A4 /* Util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E200D25F9FD00618676 /* Util.cpp */; }; + DFF0F45017528350002DA3A4 /* XBApplicationEx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1EA70D25F9FD00618676 /* XBApplicationEx.cpp */; }; + DFF0F45117528350002DA3A4 /* XBDateTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 384718D61325BA04000486D6 /* XBDateTime.cpp */; }; + DFF0F45217528350002DA3A4 /* xbmc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ED10D25F9FD00618676 /* xbmc.cpp */; }; + DFF0F45317528350002DA3A4 /* XbmcContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC720A9B1550927000FFD782 /* XbmcContext.cpp */; }; + DFF0F45417528350002DA3A4 /* MouseStat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C8D112942546009E7A26 /* MouseStat.cpp */; }; + DFF0F45517528350002DA3A4 /* Addon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD17C15FCE77900E10810 /* Addon.cpp */; }; + DFF0F45617528350002DA3A4 /* AddonCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD18015FCE77900E10810 /* AddonCallback.cpp */; }; + DFF0F45717528350002DA3A4 /* AddonClass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD18415FCE77900E10810 /* AddonClass.cpp */; }; + DFF0F45817528350002DA3A4 /* AddonUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD18915FCE77900E10810 /* AddonUtils.cpp */; }; + DFF0F45917528350002DA3A4 /* CallbackFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD18F15FCE77900E10810 /* CallbackFunction.cpp */; }; + DFF0F45A17528350002DA3A4 /* CallbackHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD19315FCE77900E10810 /* CallbackHandler.cpp */; }; + DFF0F45B17528350002DA3A4 /* Control.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD19715FCE77900E10810 /* Control.cpp */; }; + DFF0F45C17528350002DA3A4 /* Dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD19B15FCE77900E10810 /* Dialog.cpp */; }; + DFF0F45D17528350002DA3A4 /* File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1A115FCE77900E10810 /* File.cpp */; }; + DFF0F45E17528350002DA3A4 /* InfoTagMusic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1A515FCE77900E10810 /* InfoTagMusic.cpp */; }; + DFF0F45F17528350002DA3A4 /* InfoTagVideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1A915FCE77900E10810 /* InfoTagVideo.cpp */; }; + DFF0F46017528350002DA3A4 /* Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1AD15FCE77900E10810 /* Keyboard.cpp */; }; + DFF0F46117528350002DA3A4 /* LanguageHook.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1B115FCE77900E10810 /* LanguageHook.cpp */; }; + DFF0F46217528350002DA3A4 /* ListItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1B715FCE77900E10810 /* ListItem.cpp */; }; + DFF0F46317528350002DA3A4 /* ModuleXbmc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1BC15FCE77900E10810 /* ModuleXbmc.cpp */; }; + DFF0F46417528350002DA3A4 /* ModuleXbmcgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1C015FCE77900E10810 /* ModuleXbmcgui.cpp */; }; + DFF0F46517528350002DA3A4 /* ModuleXbmcplugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1C415FCE77900E10810 /* ModuleXbmcplugin.cpp */; }; + DFF0F46617528350002DA3A4 /* ModuleXbmcvfs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1C815FCE77900E10810 /* ModuleXbmcvfs.cpp */; }; + DFF0F46717528350002DA3A4 /* Monitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1CC15FCE77900E10810 /* Monitor.cpp */; }; + DFF0F46817528350002DA3A4 /* Player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1D015FCE77900E10810 /* Player.cpp */; }; + DFF0F46917528350002DA3A4 /* PlayList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1D415FCE77900E10810 /* PlayList.cpp */; }; + DFF0F46A17528350002DA3A4 /* String.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1D915FCE77900E10810 /* String.cpp */; }; + DFF0F46B17528350002DA3A4 /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1DE15FCE77900E10810 /* Window.cpp */; }; + DFF0F46C17528350002DA3A4 /* WindowDialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1E215FCE77900E10810 /* WindowDialog.cpp */; }; + DFF0F46D17528350002DA3A4 /* WindowDialogMixin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1E615FCE77900E10810 /* WindowDialogMixin.cpp */; }; + DFF0F46E17528350002DA3A4 /* WindowXML.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF1AD1EC15FCE77900E10810 /* WindowXML.cpp */; }; + DFF0F46F17528350002DA3A4 /* ButtonTranslator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C8CB12942546009E7A26 /* ButtonTranslator.cpp */; }; + DFF0F47017528350002DA3A4 /* InertialScrollingHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAB049613F8376700B70BFB /* InertialScrollingHandler.cpp */; }; + DFF0F47217528350002DA3A4 /* KeyboardStat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C8CF12942546009E7A26 /* KeyboardStat.cpp */; }; + DFF0F47317528350002DA3A4 /* SDLJoystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C8D312942546009E7A26 /* SDLJoystick.cpp */; }; + DFF0F47417528350002DA3A4 /* XBMC_keytable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8EC5D0C1369519D00CCC10D /* XBMC_keytable.cpp */; }; + DFF0F47517528350002DA3A4 /* WinEventsIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4991571174E661300741B6D /* WinEventsIOS.mm */; }; + DFF0F47617528350002DA3A4 /* WinSystemIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4991573174E661300741B6D /* WinSystemIOS.mm */; }; + DFF0F47E17528350002DA3A4 /* AutoPool.mm in Sources */ = {isa = PBXBuildFile; fileRef = F57A1D1D1329B15300498CC7 /* AutoPool.mm */; }; + DFF0F48017528350002DA3A4 /* DarwinUtils.mm in Sources */ = {isa = PBXBuildFile; fileRef = F5B13C8C1334056B0045076D /* DarwinUtils.mm */; }; + DFF0F48117528350002DA3A4 /* OSXGNUReplacements.c in Sources */ = {isa = PBXBuildFile; fileRef = F51CEEEE0F5C5D20004F4602 /* OSXGNUReplacements.c */; }; + DFF0F48217528350002DA3A4 /* LinuxRendererGLES.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4991588174E68D700741B6D /* LinuxRendererGLES.cpp */; }; + DFF0F48317528350002DA3A4 /* DVDCodecUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15220D25F9F900618676 /* DVDCodecUtils.cpp */; }; + DFF0F48417528350002DA3A4 /* DVDFactoryCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15240D25F9F900618676 /* DVDFactoryCodec.cpp */; }; + DFF0F48717528350002DA3A4 /* DVDVideoCodecVideoToolBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E499158F174E6ABD00741B6D /* DVDVideoCodecVideoToolBox.cpp */; }; + DFF0F48817528350002DA3A4 /* fstrcmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CBEBB8212912BA300431822 /* fstrcmp.c */; }; + DFF0F48A17528350002DA3A4 /* yuv2rgb.neon.S in Sources */ = {isa = PBXBuildFile; fileRef = E4991595174E70BF00741B6D /* yuv2rgb.neon.S */; }; + DFF0F49D1752838E002DA3A4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DFF0F4901752838E002DA3A4 /* InfoPlist.strings */; }; + DFF1FE23199D2FFF0008211F /* KodiAppliance.mm in Sources */ = {isa = PBXBuildFile; fileRef = DFC8B7CE199C2B3A00424777 /* KodiAppliance.mm */; }; + DFFA43FF19104C0800C3923B /* AppIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = DFFA43D019104BFA00C3923B /* AppIcon.png */; }; DFFA440119104C1300C3923B /* AppIcon29x29.png in Resources */ = {isa = PBXBuildFile; fileRef = DFFA43D619104BFA00C3923B /* AppIcon29x29.png */; }; DFFA440219104C1300C3923B /* AppIcon29x29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DFFA43D719104BFA00C3923B /* AppIcon29x29@2x.png */; }; DFFA440319104C1300C3923B /* AppIcon40x40.png in Resources */ = {isa = PBXBuildFile; fileRef = DFFA43D819104BFA00C3923B /* AppIcon40x40.png */; }; @@ -933,6 +1883,7 @@ E306D12E0DDF7B590052C2AD /* XBMCHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E306D12C0DDF7B590052C2AD /* XBMCHelper.cpp */; }; E33206380D5070AA00435CE3 /* DVDDemuxVobsub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E33206370D5070AA00435CE3 /* DVDDemuxVobsub.cpp */; }; E33466A60D2E5103005A65EC /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E33466A50D2E5103005A65EC /* IOKit.framework */; }; + E33979960D62FD48004ECDDA /* DVDInputStreamTV.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E33979940D62FD47004ECDDA /* DVDInputStreamTV.cpp */; }; E36578880D3AA7B40033CC1C /* DVDPlayerCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36578860D3AA7B40033CC1C /* DVDPlayerCodec.cpp */; }; E36C29DF0DA72429001F0C9D /* Artist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29DB0DA72429001F0C9D /* Artist.cpp */; }; E36C29E00DA72429001F0C9D /* Album.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29DC0DA72429001F0C9D /* Album.cpp */; }; @@ -942,6 +1893,7 @@ E36C29EC0DA72486001F0C9D /* Fanart.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29E90DA72486001F0C9D /* Fanart.cpp */; }; E38A06CE0D95AA5500FF8227 /* GUIDialogKaiToast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38A06CC0D95AA5500FF8227 /* GUIDialogKaiToast.cpp */; }; E38E1F370D25F9FD00618676 /* Application.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14640D25F9F900618676 /* Application.cpp */; }; + E38E1F380D25F9FD00618676 /* ApplicationMessenger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14660D25F9F900618676 /* ApplicationMessenger.cpp */; }; E38E1F3C0D25F9FD00618676 /* Autorun.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E146E0D25F9F900618676 /* Autorun.cpp */; }; E38E1F3D0D25F9FD00618676 /* AutoSwitch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14700D25F9F900618676 /* AutoSwitch.cpp */; }; E38E1F3E0D25F9FD00618676 /* BackgroundInfoLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14720D25F9F900618676 /* BackgroundInfoLoader.cpp */; }; @@ -1083,6 +2035,7 @@ E38E207F0D25F9FD00618676 /* GUIDialogContextMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17A40D25F9FA00618676 /* GUIDialogContextMenu.cpp */; }; E38E20800D25F9FD00618676 /* GUIDialogFavourites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17A60D25F9FA00618676 /* GUIDialogFavourites.cpp */; }; E38E20810D25F9FD00618676 /* GUIDialogFileBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17A80D25F9FA00618676 /* GUIDialogFileBrowser.cpp */; }; + E38E20820D25F9FD00618676 /* GUIDialogFileStacking.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17AA0D25F9FA00618676 /* GUIDialogFileStacking.cpp */; }; E38E20830D25F9FD00618676 /* GUIDialogGamepad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17AC0D25F9FA00618676 /* GUIDialogGamepad.cpp */; }; E38E20890D25F9FD00618676 /* GUIDialogMediaSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17B80D25F9FA00618676 /* GUIDialogMediaSource.cpp */; }; E38E208A0D25F9FD00618676 /* GUIDialogMusicOSD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17BA0D25F9FA00618676 /* GUIDialogMusicOSD.cpp */; }; @@ -1114,8 +2067,10 @@ E38E20B30D25F9FD00618676 /* GUIWindowMusicBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E180D0D25F9FA00618676 /* GUIWindowMusicBase.cpp */; }; E38E20B40D25F9FD00618676 /* GUIDialogMusicInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E180F0D25F9FA00618676 /* GUIDialogMusicInfo.cpp */; }; E38E20B50D25F9FD00618676 /* GUIWindowMusicNav.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18110D25F9FA00618676 /* GUIWindowMusicNav.cpp */; }; + E38E20B60D25F9FD00618676 /* GUIDialogMusicOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18130D25F9FA00618676 /* GUIDialogMusicOverlay.cpp */; }; E38E20B70D25F9FD00618676 /* GUIWindowMusicPlaylist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18150D25F9FA00618676 /* GUIWindowMusicPlaylist.cpp */; }; E38E20B80D25F9FD00618676 /* GUIWindowMusicPlaylistEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18170D25F9FA00618676 /* GUIWindowMusicPlaylistEditor.cpp */; }; + E38E20B90D25F9FD00618676 /* GUIWindowMusicSongs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18190D25F9FA00618676 /* GUIWindowMusicSongs.cpp */; }; E38E20BB0D25F9FD00618676 /* GUIDialogVideoOSD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E181D0D25F9FA00618676 /* GUIDialogVideoOSD.cpp */; }; E38E20BC0D25F9FD00618676 /* GUIWindowPictures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E181F0D25F9FA00618676 /* GUIWindowPictures.cpp */; }; E38E20BD0D25F9FD00618676 /* GUIWindowPointer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18210D25F9FA00618676 /* GUIWindowPointer.cpp */; }; @@ -1127,6 +2082,7 @@ E38E20CA0D25F9FD00618676 /* GUIWindowVideoBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E183B0D25F9FA00618676 /* GUIWindowVideoBase.cpp */; }; E38E20CC0D25F9FD00618676 /* GUIDialogVideoInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E183F0D25F9FA00618676 /* GUIDialogVideoInfo.cpp */; }; E38E20CD0D25F9FD00618676 /* GUIWindowVideoNav.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18410D25F9FA00618676 /* GUIWindowVideoNav.cpp */; }; + E38E20CE0D25F9FD00618676 /* GUIDialogVideoOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18430D25F9FA00618676 /* GUIDialogVideoOverlay.cpp */; }; E38E20CF0D25F9FD00618676 /* GUIWindowVideoPlaylist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18450D25F9FA00618676 /* GUIWindowVideoPlaylist.cpp */; }; E38E20D00D25F9FD00618676 /* GUIWindowVisualisation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18470D25F9FA00618676 /* GUIWindowVisualisation.cpp */; }; E38E20D10D25F9FD00618676 /* GUIWindowWeather.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18490D25F9FA00618676 /* GUIWindowWeather.cpp */; }; @@ -1273,6 +2229,8 @@ E49910F1174E54ED00741B6D /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910F0174E54EC00741B6D /* CFNetwork.framework */; }; E49910F3174E54FB00741B6D /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910F2174E54FB00741B6D /* AVFoundation.framework */; }; E49910F5174E550200741B6D /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910F4174E550200741B6D /* MediaPlayer.framework */; }; + E49910F8174E561500741B6D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F56C8CE6131F5DC6000AD0F6 /* libz.dylib */; }; + E49910F9174E561D00741B6D /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F56C8CF2131F5DFD000AD0F6 /* libiconv.dylib */; }; E499114F174E5CC300741B6D /* archive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CE60D25F9FC00618676 /* archive.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; E4991150174E5CC300741B6D /* arcread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CE80D25F9FC00618676 /* arcread.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; E4991151174E5CC300741B6D /* cmddata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CEA0D25F9FC00618676 /* cmddata.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; @@ -1396,6 +2354,7 @@ E49911E4174E5D3700741B6D /* DVDInputStreamNavigator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15650D25F9FA00618676 /* DVDInputStreamNavigator.cpp */; }; E49911E5174E5D3700741B6D /* DVDInputStreamPVRManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C848290E156CFFA0005A996F /* DVDInputStreamPVRManager.cpp */; }; E49911E6174E5D3700741B6D /* DVDInputStreamRTMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 815EE6330E17F1DC009FBE3C /* DVDInputStreamRTMP.cpp */; }; + E49911E7174E5D3700741B6D /* DVDInputStreamTV.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E33979940D62FD47004ECDDA /* DVDInputStreamTV.cpp */; }; E49911E8174E5D3700741B6D /* DVDStateSerializer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E15740D25F9FA00618676 /* DVDStateSerializer.cpp */; }; E49911E9174E5D3E00741B6D /* DVDSubtitleParserSSA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8883CEA30DD81807004E8B72 /* DVDSubtitleParserSSA.cpp */; }; E49911EA174E5D3E00741B6D /* DVDSubtitlesLibass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8883CEA50DD81807004E8B72 /* DVDSubtitlesLibass.cpp */; }; @@ -1503,6 +2462,8 @@ E4991267174E5D8F00741B6D /* FileReaderFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6731444A8B0007C6459 /* FileReaderFile.cpp */; }; E4991268174E5D8F00741B6D /* FTPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16E40D25F9FA00618676 /* FTPDirectory.cpp */; }; E4991269174E5D8F00741B6D /* FTPParse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16E60D25F9FA00618676 /* FTPParse.cpp */; }; + E499126C174E5D8F00741B6D /* HDHomeRunDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D7F51444B568007C6459 /* HDHomeRunDirectory.cpp */; }; + E499126D174E5D8F00741B6D /* HDHomeRunFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D7F01444B54A007C6459 /* HDHomeRunFile.cpp */; }; E4991270174E5D8F00741B6D /* HTTPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F584E12D0F257C5100DB26A5 /* HTTPDirectory.cpp */; }; E4991271174E5D8F00741B6D /* HTTPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF9A71EC1639C8F6005ECB2E /* HTTPFile.cpp */; }; E4991272174E5D8F00741B6D /* IDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16EC0D25F9FA00618676 /* IDirectory.cpp */; }; @@ -1559,6 +2520,8 @@ E49912AC174E5D9900741B6D /* SFTPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7B37C113AFB900059D6AA /* SFTPDirectory.cpp */; }; E49912AD174E5D9900741B6D /* SFTPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6851444A8B0007C6459 /* SFTPFile.cpp */; }; E49912AE174E5D9900741B6D /* ShoutcastFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6871444A8B0007C6459 /* ShoutcastFile.cpp */; }; + E49912B0174E5D9900741B6D /* SlingboxDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D65C1444A7A3007C6459 /* SlingboxDirectory.cpp */; }; + E49912B1174E5D9900741B6D /* SlingboxFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6891444A8B0007C6459 /* SlingboxFile.cpp */; }; E49912B2174E5D9900741B6D /* SmartPlaylistDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17530D25F9FA00618676 /* SmartPlaylistDirectory.cpp */; }; E49912B3174E5D9900741B6D /* SMBDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3DAAF8B0D6E1B0500F17647 /* SMBDirectory.cpp */; }; E49912B4174E5D9900741B6D /* SMBFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D68B1444A8B0007C6459 /* SMBFile.cpp */; }; @@ -1594,6 +2557,7 @@ E49912D7174E5DA000741B6D /* ZipDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17930D25F9FA00618676 /* ZipDirectory.cpp */; }; E49912D8174E5DA000741B6D /* ZipFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6971444A8B0007C6459 /* ZipFile.cpp */; }; E49912D9174E5DA000741B6D /* ZipManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17950D25F9FA00618676 /* ZipManager.cpp */; }; + E49912DA174E5DAD00741B6D /* AnimatedGif.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7541294222E009E7A26 /* AnimatedGif.cpp */; }; E49912DB174E5DAD00741B6D /* cximage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF404A3416B9896C00D8023E /* cximage.cpp */; }; E49912DC174E5DAD00741B6D /* D3DResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7561294222E009E7A26 /* D3DResource.cpp */; }; E49912DD174E5DAD00741B6D /* DDSImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C7571294222E009E7A26 /* DDSImage.cpp */; }; @@ -1710,6 +2674,7 @@ E4991366174E5EEF00741B6D /* swig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F502BFF0160F36AD00C96C76 /* swig.cpp */; }; E4991367174E5EEF00741B6D /* XBPython.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F502BFE6160F34FE00C96C76 /* XBPython.cpp */; }; E4991369174E5EEF00741B6D /* AnnouncementManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7A700112893E50059D6AA /* AnnouncementManager.cpp */; }; + E499136A174E5EEF00741B6D /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */; }; E499136B174E5EF700741B6D /* ConvUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D6A0D25F9FD00618676 /* ConvUtils.cpp */; }; E499136C174E5EF700741B6D /* LinuxResourceCounter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D700D25F9FD00618676 /* LinuxResourceCounter.cpp */; }; E499136D174E5EF700741B6D /* LinuxTimezone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D720D25F9FD00618676 /* LinuxTimezone.cpp */; }; @@ -1720,12 +2685,25 @@ E4991372174E5EF700741B6D /* XTimeUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D870D25F9FD00618676 /* XTimeUtils.cpp */; }; E4991373174E5F0E00741B6D /* GUIDialogMusicInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E180F0D25F9FA00618676 /* GUIDialogMusicInfo.cpp */; }; E4991374174E5F0E00741B6D /* GUIDialogMusicOSD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17BA0D25F9FA00618676 /* GUIDialogMusicOSD.cpp */; }; + E4991375174E5F0E00741B6D /* GUIDialogMusicOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18130D25F9FA00618676 /* GUIDialogMusicOverlay.cpp */; }; E4991376174E5F0E00741B6D /* GUIDialogSongInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17DA0D25F9FA00618676 /* GUIDialogSongInfo.cpp */; }; E4991377174E5F0E00741B6D /* GUIDialogVisualisationPresetList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17E60D25F9FA00618676 /* GUIDialogVisualisationPresetList.cpp */; }; E4991378174E5F0E00741B6D /* MusicAlbumInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E650D25F9FD00618676 /* MusicAlbumInfo.cpp */; }; E4991379174E5F0E00741B6D /* MusicArtistInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29E80DA72486001F0C9D /* MusicArtistInfo.cpp */; }; E499137A174E5F0E00741B6D /* MusicInfoScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D930D25F9FD00618676 /* MusicInfoScanner.cpp */; }; E499137B174E5F0E00741B6D /* MusicInfoScraper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E670D25F9FD00618676 /* MusicInfoScraper.cpp */; }; + E499137C174E5F0E00741B6D /* GUIDialogKaraokeSongSelector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D00F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp */; }; + E499137D174E5F0E00741B6D /* GUIWindowKaraokeLyrics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AD1EA70F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp */; }; + E499137E174E5F0E00741B6D /* karaokelyrics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D60F1E785700D46E3C /* karaokelyrics.cpp */; }; + E499137F174E5F0E00741B6D /* karaokelyricscdg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D40F1E784800D46E3C /* karaokelyricscdg.cpp */; }; + E4991380174E5F0E00741B6D /* karaokelyricsfactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E20F1E787700D46E3C /* karaokelyricsfactory.cpp */; }; + E4991381174E5F0E00741B6D /* karaokelyricsmanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E10F1E787700D46E3C /* karaokelyricsmanager.cpp */; }; + E4991382174E5F0E00741B6D /* karaokelyricstext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E40F1E787700D46E3C /* karaokelyricstext.cpp */; }; + E4991383174E5F0E00741B6D /* karaokelyricstextkar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51DE0F1E787700D46E3C /* karaokelyricstextkar.cpp */; }; + E4991384174E5F0E00741B6D /* karaokelyricstextlrc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E30F1E787700D46E3C /* karaokelyricstextlrc.cpp */; }; + E4991385174E5F0E00741B6D /* karaokelyricstextustar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */; }; + E4991386174E5F0E00741B6D /* karaokevideobackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */; }; + E4991387174E5F0E00741B6D /* karaokewindowbackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56A084A0F4A18FB003F9F87 /* karaokewindowbackground.cpp */; }; E4991388174E5F0E00741B6D /* MusicInfoTag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C85E129423A7009E7A26 /* MusicInfoTag.cpp */; }; E499138A174E5F0E00741B6D /* MusicInfoTagLoaderCDDA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C866129423A7009E7A26 /* MusicInfoTagLoaderCDDA.cpp */; }; E499138B174E5F0E00741B6D /* MusicInfoTagLoaderDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C868129423A7009E7A26 /* MusicInfoTagLoaderDatabase.cpp */; }; @@ -1737,6 +2715,7 @@ E4991396174E5F0E00741B6D /* GUIWindowMusicNav.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18110D25F9FA00618676 /* GUIWindowMusicNav.cpp */; }; E4991397174E5F0E00741B6D /* GUIWindowMusicPlaylist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18150D25F9FA00618676 /* GUIWindowMusicPlaylist.cpp */; }; E4991398174E5F0E00741B6D /* GUIWindowMusicPlaylistEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18170D25F9FA00618676 /* GUIWindowMusicPlaylistEditor.cpp */; }; + E4991399174E5F0E00741B6D /* GUIWindowMusicSongs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18190D25F9FA00618676 /* GUIWindowMusicSongs.cpp */; }; E499139A174E5F0E00741B6D /* GUIWindowVisualisation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18470D25F9FA00618676 /* GUIWindowVisualisation.cpp */; }; E499139B174E5F0E00741B6D /* Album.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29DC0DA72429001F0C9D /* Album.cpp */; }; E499139C174E5F0E00741B6D /* Artist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29DB0DA72429001F0C9D /* Artist.cpp */; }; @@ -1794,6 +2773,7 @@ E49913D0174E5F8100741B6D /* PeripheralNIC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10526140AA38000175026 /* PeripheralNIC.cpp */; }; E49913D1174E5F8100741B6D /* PeripheralNyxboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10528140AA38000175026 /* PeripheralNyxboard.cpp */; }; E49913D2174E5F8100741B6D /* PeripheralTuner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1052A140AA38000175026 /* PeripheralTuner.cpp */; }; + E49913D3174E5F8600741B6D /* GUIDialogPeripheralManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1052D140AA38000175026 /* GUIDialogPeripheralManager.cpp */; }; E49913D4174E5F8600741B6D /* GUIDialogPeripheralSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1052F140AA38000175026 /* GUIDialogPeripheralSettings.cpp */; }; E49913D5174E5F8600741B6D /* Peripherals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10533140AA38000175026 /* Peripherals.cpp */; }; E49913D6174E5F8D00741B6D /* GUIDialogPictureInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17C60D25F9FA00618676 /* GUIDialogPictureInfo.cpp */; }; @@ -1880,6 +2860,7 @@ E4991437174E604700741B6D /* Implementation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38F4E56C13CCCB3B00664821 /* Implementation.cpp */; }; E4991438174E604700741B6D /* Atomics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83E0B2480F7C95FF0091643F /* Atomics.cpp */; }; E4991439174E604700741B6D /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E350D25F9FD00618676 /* Event.cpp */; }; + E499143A174E604700741B6D /* LockFree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A72B950FBC8E3B00171871 /* LockFree.cpp */; }; E499143B174E604700741B6D /* SystemClock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3802709813D5A653009493DD /* SystemClock.cpp */; }; E499143C174E604700741B6D /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E850D25F9FD00618676 /* Thread.cpp */; }; E499143D174E604700741B6D /* Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFD928F116384B6800709DAE /* Timer.cpp */; }; @@ -1887,6 +2868,7 @@ E499143F174E605900741B6D /* AliasShortcutUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A9D3081097C9370050490F /* AliasShortcutUtils.cpp */; }; E4991440174E605900741B6D /* Archive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E250D25F9FD00618676 /* Archive.cpp */; }; E4991441174E605900741B6D /* AsyncFileCopy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5FDF51C0E7218950005B0A6 /* AsyncFileCopy.cpp */; }; + E4991442174E605900741B6D /* AutoPtrHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5BDB81F120203C200F0B710 /* AutoPtrHandle.cpp */; }; E4991443174E605900741B6D /* Base64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52769A151BAEDA00B5B63B /* Base64.cpp */; }; E4991444174E605900741B6D /* BitstreamConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56353BD16E9BB3500D21BAD /* BitstreamConverter.cpp */; }; E4991445174E605900741B6D /* BitstreamStats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E270D25F9FD00618676 /* BitstreamStats.cpp */; }; @@ -1946,11 +2928,13 @@ E4991481174E605900741B6D /* XBMCTinyXML.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5ED908615538DCE00842059 /* XBMCTinyXML.cpp */; }; E4991482174E605900741B6D /* XMLUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C9811294385F009E7A26 /* XMLUtils.cpp */; }; E4991483174E606500741B6D /* GUIDialogAudioSubtitleSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C8FE12942761009E7A26 /* GUIDialogAudioSubtitleSettings.cpp */; }; + E4991484174E606500741B6D /* GUIDialogFileStacking.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17AA0D25F9FA00618676 /* GUIDialogFileStacking.cpp */; }; E4991485174E606500741B6D /* GUIDialogFullScreenInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 886328150E07B37200BB3DAB /* GUIDialogFullScreenInfo.cpp */; }; E4991486174E606500741B6D /* GUIDialogTeletext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E55B65107412DE006E788A /* GUIDialogTeletext.cpp */; }; E4991487174E606500741B6D /* GUIDialogVideoBookmarks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17E00D25F9FA00618676 /* GUIDialogVideoBookmarks.cpp */; }; E4991488174E606500741B6D /* GUIDialogVideoInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E183F0D25F9FA00618676 /* GUIDialogVideoInfo.cpp */; }; E4991489174E606500741B6D /* GUIDialogVideoOSD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E181D0D25F9FA00618676 /* GUIDialogVideoOSD.cpp */; }; + E499148A174E606500741B6D /* GUIDialogVideoOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18430D25F9FA00618676 /* GUIDialogVideoOverlay.cpp */; }; E499148B174E606500741B6D /* GUIDialogVideoSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C90B129427A6009E7A26 /* GUIDialogVideoSettings.cpp */; }; E499148C174E606500741B6D /* GUIWindowFullScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18050D25F9FA00618676 /* GUIWindowFullScreen.cpp */; }; E499148D174E606500741B6D /* GUIWindowVideoBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E183B0D25F9FA00618676 /* GUIWindowVideoBase.cpp */; }; @@ -1986,6 +2970,7 @@ E49914AB174E607200741B6D /* GUIWindowSystemInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18390D25F9FA00618676 /* GUIWindowSystemInfo.cpp */; }; E49914AC174E607200741B6D /* GUIWindowWeather.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18490D25F9FA00618676 /* GUIWindowWeather.cpp */; }; E499152C174E640800741B6D /* Application.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14640D25F9F900618676 /* Application.cpp */; }; + E499152D174E642900741B6D /* ApplicationMessenger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14660D25F9F900618676 /* ApplicationMessenger.cpp */; }; E499152E174E642900741B6D /* AppParamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352C616E5436900D21BAD /* AppParamParser.cpp */; }; E499152F174E642900741B6D /* Autorun.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E146E0D25F9F900618676 /* Autorun.cpp */; }; E4991530174E642900741B6D /* AutoSwitch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14700D25F9F900618676 /* AutoSwitch.cpp */; }; @@ -2051,6 +3036,7 @@ E499156F174E65AC00741B6D /* XBMC_keytable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8EC5D0C1369519D00CCC10D /* XBMC_keytable.cpp */; }; E4991574174E661400741B6D /* WinEventsIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4991571174E661300741B6D /* WinEventsIOS.mm */; }; E4991575174E661400741B6D /* WinSystemIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4991573174E661300741B6D /* WinSystemIOS.mm */; }; + E4991581174E681600741B6D /* SlingboxLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 18404DA51396C31B00863BBA /* SlingboxLib.a */; }; E4991582174E682F00741B6D /* AutoPool.mm in Sources */ = {isa = PBXBuildFile; fileRef = F57A1D1D1329B15300498CC7 /* AutoPool.mm */; }; E4991583174E684000741B6D /* CocoaInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = F5EA05C00F733812005C2EC5 /* CocoaInterface.mm */; }; E4991584174E684000741B6D /* DarwinUtils.mm in Sources */ = {isa = PBXBuildFile; fileRef = F5B13C8C1334056B0045076D /* DarwinUtils.mm */; }; @@ -2072,6 +3058,7 @@ EC720A9D1550927000FFD782 /* XbmcContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC720A9B1550927000FFD782 /* XbmcContext.cpp */; }; F500E35617F3412C004FC217 /* WinEvents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F500E35517F3412C004FC217 /* WinEvents.cpp */; }; F500E35717F3412C004FC217 /* WinEvents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F500E35517F3412C004FC217 /* WinEvents.cpp */; }; + F500E35817F3412C004FC217 /* WinEvents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F500E35517F3412C004FC217 /* WinEvents.cpp */; }; F506297A0E57B9680066625A /* MultiPathFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F50629780E57B9680066625A /* MultiPathFile.cpp */; }; F5071906175A26AD004C87D1 /* VideoDecodeAcceleration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5071905175A26AD004C87D1 /* VideoDecodeAcceleration.framework */; }; F50FDC5A119B4B2C00C8B8CD /* GUIDialogTextViewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F50FDC59119B4B2C00C8B8CD /* GUIDialogTextViewer.cpp */; }; @@ -2084,16 +3071,27 @@ F52CC5F01713AAA200113454 /* DirectoryNodeGrouped.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F52CC5EE1713AAA200113454 /* DirectoryNodeGrouped.cpp */; }; F52CC6AA1713BD2B00113454 /* DirectoryNodeGrouped.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F52CC6A81713BD2B00113454 /* DirectoryNodeGrouped.cpp */; }; F5364D34155B3B270016D00B /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5364D33155B3B270016D00B /* CoreVideo.framework */; }; + F5364D55155B3C7B0016D00B /* libm.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F5364D54155B3C7B0016D00B /* libm.dylib */; }; F5364E05155B3CAF0016D00B /* IOSurface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5364E04155B3CAF0016D00B /* IOSurface.framework */; }; F548786D0FE060FF00E506FD /* DVDSubtitleParserMPL2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F548786C0FE060FF00E506FD /* DVDSubtitleParserMPL2.cpp */; }; F5487B4C0FE6F02700E506FD /* StreamDetails.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5487B4B0FE6F02700E506FD /* StreamDetails.cpp */; }; F54BCC5F1439345300F86B0F /* HotKeyController.m in Sources */ = {isa = PBXBuildFile; fileRef = F54BCC5E1439345300F86B0F /* HotKeyController.m */; }; + F54C51D20F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D00F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp */; }; + F54C51D50F1E784800D46E3C /* karaokelyricscdg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D40F1E784800D46E3C /* karaokelyricscdg.cpp */; }; + F54C51D80F1E785700D46E3C /* karaokelyrics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D60F1E785700D46E3C /* karaokelyrics.cpp */; }; + F54C51E50F1E787700D46E3C /* karaokelyricstextkar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51DE0F1E787700D46E3C /* karaokelyricstextkar.cpp */; }; + F54C51E60F1E787700D46E3C /* karaokelyricsmanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E10F1E787700D46E3C /* karaokelyricsmanager.cpp */; }; + F54C51E70F1E787700D46E3C /* karaokelyricsfactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E20F1E787700D46E3C /* karaokelyricsfactory.cpp */; }; + F54C51E80F1E787700D46E3C /* karaokelyricstextlrc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E30F1E787700D46E3C /* karaokelyricstextlrc.cpp */; }; + F54C51E90F1E787700D46E3C /* karaokelyricstext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E40F1E787700D46E3C /* karaokelyricstext.cpp */; }; F558F25613ABCF7800631E12 /* WinEventsOSX.mm in Sources */ = {isa = PBXBuildFile; fileRef = F558F25513ABCF7800631E12 /* WinEventsOSX.mm */; }; F558F27B13ABD56600631E12 /* DirtyRegionSolvers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F558F27913ABD56600631E12 /* DirtyRegionSolvers.cpp */; }; F558F27F13ABD57400631E12 /* DirtyRegionTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F558F27D13ABD57400631E12 /* DirtyRegionTracker.cpp */; }; F558F29613ABD7DF00631E12 /* GUIWindowDebugInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F558F29413ABD7DF00631E12 /* GUIWindowDebugInfo.cpp */; }; F55BA70B17AB2264002A36D1 /* StereoscopicsManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5558ED0E176396CD00118C35 /* StereoscopicsManager.cpp */; }; + F55BA70C17AB2265002A36D1 /* StereoscopicsManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5558ED0E176396CD00118C35 /* StereoscopicsManager.cpp */; }; F55BA71017AB2293002A36D1 /* RenderFlags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55611BA21766672F00754072 /* RenderFlags.cpp */; }; + F55BA71117AB2293002A36D1 /* RenderFlags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55611BA21766672F00754072 /* RenderFlags.cpp */; }; F563529616E53FAB00D21BAD /* UPnPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F563529416E53FAB00D21BAD /* UPnPSettings.cpp */; }; F56352AA16E5402100D21BAD /* GUIDialogContentSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352A216E5402100D21BAD /* GUIDialogContentSettings.cpp */; }; F56352BB16E5403400D21BAD /* GUIWindowSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B016E5403400D21BAD /* GUIWindowSettings.cpp */; }; @@ -2103,6 +3101,9 @@ F56352C816E5436900D21BAD /* AppParamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352C616E5436900D21BAD /* AppParamParser.cpp */; }; F56353BF16E9BB3500D21BAD /* BitstreamConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56353BD16E9BB3500D21BAD /* BitstreamConverter.cpp */; }; F56579AF13060D1E0085ED7F /* RenderCapture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56579AD13060D1E0085ED7F /* RenderCapture.cpp */; }; + F56A084B0F4A18FB003F9F87 /* karaokewindowbackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56A084A0F4A18FB003F9F87 /* karaokewindowbackground.cpp */; }; + F56C8CE7131F5DC6000AD0F6 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F56C8CE6131F5DC6000AD0F6 /* libz.dylib */; }; + F56C8CF3131F5DFD000AD0F6 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F56C8CF2131F5DFD000AD0F6 /* libiconv.dylib */; }; F57A1D1E1329B15300498CC7 /* AutoPool.mm in Sources */ = {isa = PBXBuildFile; fileRef = F57A1D1D1329B15300498CC7 /* AutoPool.mm */; }; F57B6F801071B8B500079ACB /* JobManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F57B6F7E1071B8B500079ACB /* JobManager.cpp */; }; F584E12E0F257C5100DB26A5 /* HTTPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F584E12D0F257C5100DB26A5 /* HTTPDirectory.cpp */; }; @@ -2110,6 +3111,7 @@ F592568810FBF2E100D2C91D /* ConvolutionKernels.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F592568710FBF2E100D2C91D /* ConvolutionKernels.cpp */; }; F597B05B18A804E0005AADAE /* DVDVideoCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F597B05A18A804E0005AADAE /* DVDVideoCodec.cpp */; }; F597B05C18A804E0005AADAE /* DVDVideoCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F597B05A18A804E0005AADAE /* DVDVideoCodec.cpp */; }; + F597B05D18A804E0005AADAE /* DVDVideoCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F597B05A18A804E0005AADAE /* DVDVideoCodec.cpp */; }; F59876C00FBA351D008EF4FB /* VideoReferenceClock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F59876BF0FBA351D008EF4FB /* VideoReferenceClock.cpp */; }; F59879080FBAA0C3008EF4FB /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F59879070FBAA0C3008EF4FB /* QuartzCore.framework */; }; F5987F050FBDF274008EF4FB /* DPMSSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5987F040FBDF274008EF4FB /* DPMSSupport.cpp */; }; @@ -2118,6 +3120,7 @@ F599CD74108E6A7A0010EC2A /* DarwinStorageProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F599CD73108E6A7A0010EC2A /* DarwinStorageProvider.cpp */; }; F59EED7E17AD5174005BB7C6 /* ApplicationPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F59EED7C17AD5174005BB7C6 /* ApplicationPlayer.cpp */; }; F59EED7F17AD5174005BB7C6 /* ApplicationPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F59EED7C17AD5174005BB7C6 /* ApplicationPlayer.cpp */; }; + F59EED8017AD5174005BB7C6 /* ApplicationPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F59EED7C17AD5174005BB7C6 /* ApplicationPlayer.cpp */; }; F5A7A702112893E50059D6AA /* AnnouncementManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7A700112893E50059D6AA /* AnnouncementManager.cpp */; }; F5A7A85B112908F00059D6AA /* WebServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7A859112908F00059D6AA /* WebServer.cpp */; }; F5A7B37E113AFB900059D6AA /* SFTPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7B37C113AFB900059D6AA /* SFTPDirectory.cpp */; }; @@ -2125,6 +3128,7 @@ F5A9D3091097C9370050490F /* AliasShortcutUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A9D3081097C9370050490F /* AliasShortcutUtils.cpp */; }; F5AACA680FB3DE2D00DBB77C /* GUIDialogSelect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AACA670FB3DE2D00DBB77C /* GUIDialogSelect.cpp */; }; F5AACA970FB3E2B800DBB77C /* GUIDialogSlider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AACA950FB3E2B800DBB77C /* GUIDialogSlider.cpp */; }; + F5AD1EA80F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AD1EA70F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp */; }; F5AE409C13415D9E0004BD79 /* AudioLibrary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE408013415D9E0004BD79 /* AudioLibrary.cpp */; }; F5AE409F13415D9E0004BD79 /* FileItemHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE408613415D9E0004BD79 /* FileItemHandler.cpp */; }; F5AE40A013415D9E0004BD79 /* FileOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE408813415D9E0004BD79 /* FileOperations.cpp */; }; @@ -2138,25 +3142,36 @@ F5BD02F6148D3A7E001B5583 /* CryptThreading.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5BD02F4148D3A7E001B5583 /* CryptThreading.cpp */; }; F5BDB80C120202F400F0B710 /* DVDSubtitleTagSami.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5BDB80B120202F400F0B710 /* DVDSubtitleTagSami.cpp */; }; F5BDB81A1202032400F0B710 /* DVDSubtitleTagMicroDVD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5BDB8191202032400F0B710 /* DVDSubtitleTagMicroDVD.cpp */; }; + F5BDB820120203C200F0B710 /* AutoPtrHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5BDB81F120203C200F0B710 /* AutoPtrHandle.cpp */; }; F5CC228B1814F7E9006B5E91 /* AESinkDARWINOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22891814F7E9006B5E91 /* AESinkDARWINOSX.cpp */; }; F5CC228E1814F7F7006B5E91 /* AESinkDARWINIOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC228C1814F7F7006B5E91 /* AESinkDARWINIOS.cpp */; }; + F5CC228F1814F7F7006B5E91 /* AESinkDARWINIOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC228C1814F7F7006B5E91 /* AESinkDARWINIOS.cpp */; }; F5CC22DF1814FF3B006B5E91 /* ActiveAE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22D31814FF3B006B5E91 /* ActiveAE.cpp */; }; F5CC22E01814FF3B006B5E91 /* ActiveAEBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22D51814FF3B006B5E91 /* ActiveAEBuffer.cpp */; }; F5CC22E21814FF3B006B5E91 /* ActiveAESink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22D91814FF3B006B5E91 /* ActiveAESink.cpp */; }; F5CC22E31814FF3B006B5E91 /* ActiveAESound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22DB1814FF3B006B5E91 /* ActiveAESound.cpp */; }; F5CC22E41814FF3B006B5E91 /* ActiveAEStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22DD1814FF3B006B5E91 /* ActiveAEStream.cpp */; }; + F5CC22E51814FF3B006B5E91 /* ActiveAE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22D31814FF3B006B5E91 /* ActiveAE.cpp */; }; + F5CC22E61814FF3B006B5E91 /* ActiveAEBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22D51814FF3B006B5E91 /* ActiveAEBuffer.cpp */; }; + F5CC22E81814FF3B006B5E91 /* ActiveAESink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22D91814FF3B006B5E91 /* ActiveAESink.cpp */; }; + F5CC22E91814FF3B006B5E91 /* ActiveAESound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22DB1814FF3B006B5E91 /* ActiveAESound.cpp */; }; + F5CC22EA1814FF3B006B5E91 /* ActiveAEStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22DD1814FF3B006B5E91 /* ActiveAEStream.cpp */; }; F5CC22EB1814FF3B006B5E91 /* ActiveAE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22D31814FF3B006B5E91 /* ActiveAE.cpp */; }; F5CC22EC1814FF3B006B5E91 /* ActiveAEBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22D51814FF3B006B5E91 /* ActiveAEBuffer.cpp */; }; F5CC22EE1814FF3B006B5E91 /* ActiveAESink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22D91814FF3B006B5E91 /* ActiveAESink.cpp */; }; F5CC22EF1814FF3B006B5E91 /* ActiveAESound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22DB1814FF3B006B5E91 /* ActiveAESound.cpp */; }; F5CC22F01814FF3B006B5E91 /* ActiveAEStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22DD1814FF3B006B5E91 /* ActiveAEStream.cpp */; }; F5CC22FD18150065006B5E91 /* ActorProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22FB18150065006B5E91 /* ActorProtocol.cpp */; }; + F5CC22FE18150065006B5E91 /* ActorProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22FB18150065006B5E91 /* ActorProtocol.cpp */; }; F5CC22FF18150065006B5E91 /* ActorProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC22FB18150065006B5E91 /* ActorProtocol.cpp */; }; F5CC2303181500B1006B5E91 /* EndianSwap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC2302181500B1006B5E91 /* EndianSwap.cpp */; }; + F5CC2304181500B1006B5E91 /* EndianSwap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC2302181500B1006B5E91 /* EndianSwap.cpp */; }; F5CC2305181500B1006B5E91 /* EndianSwap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC2302181500B1006B5E91 /* EndianSwap.cpp */; }; F5CC230C18150118006B5E91 /* AESinkFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC230A18150118006B5E91 /* AESinkFactory.cpp */; }; + F5CC230D18150118006B5E91 /* AESinkFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC230A18150118006B5E91 /* AESinkFactory.cpp */; }; F5CC230E18150118006B5E91 /* AESinkFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC230A18150118006B5E91 /* AESinkFactory.cpp */; }; F5CC234718150277006B5E91 /* AESinkNULL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC234518150277006B5E91 /* AESinkNULL.cpp */; }; + F5CC234818150277006B5E91 /* AESinkNULL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC234518150277006B5E91 /* AESinkNULL.cpp */; }; F5CC234918150277006B5E91 /* AESinkNULL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CC234518150277006B5E91 /* AESinkNULL.cpp */; }; F5CEE60913D3C89700225F72 /* DVDOverlayCodecTX3G.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5CEE60713D3C89700225F72 /* DVDOverlayCodecTX3G.cpp */; }; F5D8D732102BB3B1004A11AB /* OverlayRendererGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D8D72F102BB3B1004A11AB /* OverlayRendererGL.cpp */; }; @@ -2173,6 +3188,7 @@ F5E10540140AA38100175026 /* PeripheralNIC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10526140AA38000175026 /* PeripheralNIC.cpp */; }; F5E10541140AA38100175026 /* PeripheralNyxboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10528140AA38000175026 /* PeripheralNyxboard.cpp */; }; F5E10542140AA38100175026 /* PeripheralTuner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1052A140AA38000175026 /* PeripheralTuner.cpp */; }; + F5E10543140AA38100175026 /* GUIDialogPeripheralManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1052D140AA38000175026 /* GUIDialogPeripheralManager.cpp */; }; F5E10544140AA38100175026 /* GUIDialogPeripheralSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E1052F140AA38000175026 /* GUIDialogPeripheralSettings.cpp */; }; F5E10547140AA38100175026 /* Peripherals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10533140AA38000175026 /* Peripherals.cpp */; }; F5E1138014357F3800175026 /* PeripheralCecAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5E10520140AA38000175026 /* PeripheralCecAdapter.cpp */; }; @@ -2216,6 +3232,7 @@ 18308CB51303370800AA309E /* stdio_utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdio_utf8.h; sourceTree = ""; }; 183FDF8811AF0B0500B81E9C /* PluginSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PluginSource.cpp; sourceTree = ""; }; 183FDF8911AF0B0500B81E9C /* PluginSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PluginSource.h; sourceTree = ""; }; + 18404DA51396C31B00863BBA /* SlingboxLib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = SlingboxLib.a; path = lib/SlingboxLib/SlingboxLib.a; sourceTree = ""; }; 1840B74B13993D8A007C848B /* JSONVariantParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSONVariantParser.cpp; sourceTree = ""; }; 1840B74C13993D8A007C848B /* JSONVariantParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONVariantParser.h; sourceTree = ""; }; 1840B75113993DA0007C848B /* JSONVariantWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSONVariantWriter.cpp; sourceTree = ""; }; @@ -2258,6 +3275,7 @@ 18B7C38F129420E5009E7A26 /* Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Settings.h; sourceTree = ""; }; 18B7C3A612942132009E7A26 /* AdvancedSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AdvancedSettings.cpp; sourceTree = ""; }; 18B7C3A712942132009E7A26 /* AdvancedSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdvancedSettings.h; sourceTree = ""; }; + 18B7C6F61294222D009E7A26 /* AnimatedGif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimatedGif.h; sourceTree = ""; }; 18B7C6F81294222D009E7A26 /* D3DResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = D3DResource.h; sourceTree = ""; }; 18B7C6F91294222D009E7A26 /* DDSImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDSImage.h; sourceTree = ""; }; 18B7C6FA1294222D009E7A26 /* DirectXGraphics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectXGraphics.h; sourceTree = ""; }; @@ -2345,6 +3363,7 @@ 18B7C7511294222E009E7A26 /* VisibleEffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VisibleEffect.h; sourceTree = ""; }; 18B7C7521294222E009E7A26 /* XBTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XBTF.h; sourceTree = ""; }; 18B7C7531294222E009E7A26 /* XBTFReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XBTFReader.h; sourceTree = ""; }; + 18B7C7541294222E009E7A26 /* AnimatedGif.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AnimatedGif.cpp; sourceTree = ""; }; 18B7C7561294222E009E7A26 /* D3DResource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = D3DResource.cpp; sourceTree = ""; }; 18B7C7571294222E009E7A26 /* DDSImage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DDSImage.cpp; sourceTree = ""; }; 18B7C7581294222E009E7A26 /* DirectXGraphics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DirectXGraphics.cpp; sourceTree = ""; }; @@ -2492,28 +3511,6 @@ 1DAFDB7B16DFDCA7007F8C68 /* PeripheralBusCEC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PeripheralBusCEC.h; sourceTree = ""; }; 1DE0443315828F4B005DDB4D /* Exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Exception.cpp; path = commons/Exception.cpp; sourceTree = ""; }; 1DE0443415828F4B005DDB4D /* Exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Exception.h; path = commons/Exception.h; sourceTree = ""; }; - 2A1A5A581BDEAA6D0084702D /* kodi_adsp_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodi_adsp_dll.h; sourceTree = ""; }; - 2A1A5A591BDEAA6D0084702D /* kodi_adsp_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodi_adsp_types.h; sourceTree = ""; }; - 2A1A5A5A1BDEAA6D0084702D /* kodi_audiodec_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodi_audiodec_dll.h; sourceTree = ""; }; - 2A1A5A5B1BDEAA6D0084702D /* kodi_audiodec_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodi_audiodec_types.h; sourceTree = ""; }; - 2A1A5A5C1BDEAA6D0084702D /* kodi_audioengine_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodi_audioengine_types.h; sourceTree = ""; }; - 2A1A5A5D1BDEAA6D0084702D /* NOTE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NOTE; sourceTree = ""; }; - 2A1A5A5E1BDEAA6D0084702D /* xbmc_addon_cpp_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_addon_cpp_dll.h; sourceTree = ""; }; - 2A1A5A5F1BDEAA6D0084702D /* xbmc_addon_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_addon_dll.h; sourceTree = ""; }; - 2A1A5A601BDEAA6D0084702D /* xbmc_addon_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_addon_types.h; sourceTree = ""; }; - 2A1A5A611BDEAA6D0084702D /* xbmc_audioenc_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_audioenc_dll.h; sourceTree = ""; }; - 2A1A5A621BDEAA6D0084702D /* xbmc_audioenc_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_audioenc_types.h; sourceTree = ""; }; - 2A1A5A631BDEAA6D0084702D /* xbmc_codec_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_codec_types.h; sourceTree = ""; }; - 2A1A5A641BDEAA6D0084702D /* xbmc_epg_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_epg_types.h; sourceTree = ""; }; - 2A1A5A651BDEAA6D0084702D /* xbmc_pvr_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_pvr_dll.h; sourceTree = ""; }; - 2A1A5A661BDEAA6D0084702D /* xbmc_pvr_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_pvr_types.h; sourceTree = ""; }; - 2A1A5A671BDEAA6D0084702D /* xbmc_scr_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_scr_dll.h; sourceTree = ""; }; - 2A1A5A681BDEAA6D0084702D /* xbmc_scr_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_scr_types.h; sourceTree = ""; }; - 2A1A5A691BDEAA6D0084702D /* xbmc_stream_utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = xbmc_stream_utils.hpp; sourceTree = ""; }; - 2A1A5A6A1BDEAA6D0084702D /* xbmc_vis_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_vis_dll.h; sourceTree = ""; }; - 2A1A5A6B1BDEAA6D0084702D /* xbmc_vis_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_vis_types.h; sourceTree = ""; }; - 2A7B2BDB1BD6F16600044BCD /* PVRSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PVRSettings.cpp; sourceTree = ""; }; - 2A7B2BDE1BD6F18B00044BCD /* PVRSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVRSettings.h; sourceTree = ""; }; 2F4564D31970129A00396109 /* GUIFontCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIFontCache.cpp; sourceTree = ""; }; 2F4564D41970129A00396109 /* GUIFontCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIFontCache.h; sourceTree = ""; }; 32C631261423A90F00F18420 /* JpegIO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JpegIO.cpp; sourceTree = ""; }; @@ -2548,12 +3545,9 @@ 38F4E56C13CCCB3B00664821 /* Implementation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Implementation.cpp; sourceTree = ""; }; 38F4E56D13CCCB3B00664821 /* README.platform */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.platform; sourceTree = ""; }; 38F4E56E13CCCB3B00664821 /* ThreadLocal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadLocal.h; sourceTree = ""; }; - 391416BE1B4A3EFA00BBF0AA /* guiinfo */ = {isa = PBXFileReference; lastKnownFileType = folder; name = guiinfo; path = xbmc/guiinfo; sourceTree = SOURCE_ROOT; }; 395897131AAD94F00033D27C /* KeyboardLayoutManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KeyboardLayoutManager.cpp; sourceTree = ""; }; 395897141AAD94F00033D27C /* KeyboardLayoutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyboardLayoutManager.h; sourceTree = ""; }; 395938731AC28F5A0053A590 /* EmbeddedArt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmbeddedArt.h; sourceTree = ""; }; - 395938751AC310B00053A590 /* MessagePrinter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MessagePrinter.cpp; sourceTree = ""; }; - 395938761AC310B00053A590 /* MessagePrinter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessagePrinter.h; sourceTree = ""; }; 395C29BA1A94733100EBC7AD /* Key.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Key.cpp; sourceTree = ""; }; 395C29BB1A94733100EBC7AD /* Key.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Key.h; sourceTree = ""; }; 395C29BF1A98A0A000EBC7AD /* Webinterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Webinterface.cpp; sourceTree = ""; }; @@ -2588,6 +3582,8 @@ 395C2A101A9F072400EBC7AD /* ResourceFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceFile.h; sourceTree = ""; }; 395C2A171A9F074C00EBC7AD /* Locale.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Locale.cpp; sourceTree = ""; }; 395C2A181A9F074C00EBC7AD /* Locale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Locale.h; sourceTree = ""; }; + 395C2A1D1A9F96A700EBC7AD /* ContextItemAddon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContextItemAddon.cpp; sourceTree = ""; }; + 395C2A1E1A9F96A700EBC7AD /* ContextItemAddon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContextItemAddon.h; sourceTree = ""; }; 395C2A221AA4C32100EBC7AD /* AudioDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioDecoder.cpp; sourceTree = ""; }; 395C2A231AA4C32100EBC7AD /* AudioDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioDecoder.h; sourceTree = ""; }; 395F6DDB1A8133360088CC74 /* GUIDialogSimpleMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogSimpleMenu.cpp; sourceTree = ""; }; @@ -2614,20 +3610,11 @@ 3994426A1A8DD920006C39E9 /* VideoLibraryScanningJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoLibraryScanningJob.h; sourceTree = ""; }; 3994427D1A8DD96F006C39E9 /* VideoLibraryQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoLibraryQueue.cpp; sourceTree = ""; }; 3994427E1A8DD96F006C39E9 /* VideoLibraryQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoLibraryQueue.h; sourceTree = ""; }; - 399B860B1BA49A230017F660 /* ScopeGuard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScopeGuard.h; sourceTree = ""; }; - 39B4F36E1B96F845009B2D88 /* RepositoryUpdater.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RepositoryUpdater.cpp; sourceTree = ""; }; - 39B4F36F1B96F845009B2D88 /* RepositoryUpdater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RepositoryUpdater.h; sourceTree = ""; }; - 39BD2AD61B845D40004A5A15 /* DialogHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DialogHelper.h; path = helpers/DialogHelper.h; sourceTree = ""; }; - 39BD2AD71B845D40004A5A15 /* DialogHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DialogHelper.cpp; path = helpers/DialogHelper.cpp; sourceTree = ""; }; - 39C38CC81BBFF1EE000F59F5 /* InputCodingTableKorean.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InputCodingTableKorean.cpp; sourceTree = ""; }; - 39C38CC91BBFF1EE000F59F5 /* InputCodingTableKorean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputCodingTableKorean.h; sourceTree = ""; }; 4260D5C51B67BB8F003F6F2D /* GUIWindowSplash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowSplash.cpp; sourceTree = ""; }; 4260D5C61B67BB8F003F6F2D /* GUIWindowSplash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowSplash.h; sourceTree = ""; }; 42DAC16B1A6E780C0066B4C8 /* IActionListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IActionListener.h; sourceTree = ""; }; 42DAC16C1A6E789E0066B4C8 /* PVRActionListener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PVRActionListener.cpp; sourceTree = ""; }; 42DAC16D1A6E789E0066B4C8 /* PVRActionListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVRActionListener.h; sourceTree = ""; }; - 42E2E1C71B53F74D005C7E4E /* VideoLibraryRefreshingJob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoLibraryRefreshingJob.cpp; sourceTree = ""; }; - 42E2E1C81B53F74D005C7E4E /* VideoLibraryRefreshingJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoLibraryRefreshingJob.h; sourceTree = ""; }; 430C881312D64A730098821A /* IPowerSyscall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IPowerSyscall.h; sourceTree = ""; }; 431376FF12D6455C00680C15 /* GUIDialogCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogCache.h; sourceTree = ""; }; 431AE5D7109C1A63007428C3 /* OverlayRendererUtil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OverlayRendererUtil.cpp; sourceTree = ""; }; @@ -2711,16 +3698,12 @@ 7C1D682815A7D2FD00658B65 /* DatabaseManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseManager.h; sourceTree = ""; }; 7C1F6EB913ECCFA7001726AB /* LibraryDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LibraryDirectory.cpp; sourceTree = ""; }; 7C1F6EBA13ECCFA7001726AB /* LibraryDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LibraryDirectory.h; sourceTree = ""; }; - 7C226E3C1BA5F61C00185CE0 /* AddonCallbacksAudioEngine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AddonCallbacksAudioEngine.cpp; sourceTree = ""; }; - 7C226E3D1BA5F61C00185CE0 /* AddonCallbacksAudioEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddonCallbacksAudioEngine.h; sourceTree = ""; }; 7C26126A182068660086E04D /* SettingsOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SettingsOperations.cpp; sourceTree = ""; }; 7C26126B182068660086E04D /* SettingsOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsOperations.h; sourceTree = ""; }; 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DatabaseQuery.cpp; sourceTree = ""; }; 7C2612701825B6340086E04D /* DatabaseQuery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseQuery.h; sourceTree = ""; }; 7C2D6AE20F35453E00DD2E85 /* SpecialProtocol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpecialProtocol.cpp; sourceTree = ""; }; 7C2D6AE30F35453E00DD2E85 /* SpecialProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpecialProtocol.h; sourceTree = ""; }; - 7C30182F1BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MusicInfoTagLoaderFFmpeg.cpp; sourceTree = ""; }; - 7C3018301BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MusicInfoTagLoaderFFmpeg.h; sourceTree = ""; }; 7C4458BB161E203800A905F6 /* Screenshot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Screenshot.cpp; sourceTree = ""; }; 7C4458BC161E203800A905F6 /* Screenshot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Screenshot.h; sourceTree = ""; }; 7C45DBE710F325C400D4BBF3 /* DAVDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DAVDirectory.cpp; sourceTree = ""; }; @@ -2788,63 +3771,12 @@ 7C8AE84C189DE3CD00C33786 /* CoreAudioStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CoreAudioStream.cpp; path = Sinks/osx/CoreAudioStream.cpp; sourceTree = ""; }; 7C8AE852189DE47400C33786 /* CoreAudioHelpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CoreAudioHelpers.cpp; path = Sinks/osx/CoreAudioHelpers.cpp; sourceTree = ""; }; 7C8AE853189DE47700C33786 /* CoreAudioHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CoreAudioHelpers.h; path = Sinks/osx/CoreAudioHelpers.h; sourceTree = ""; }; - 7C8E01F71BA35D0B0072E8B2 /* AddonBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AddonBuiltins.cpp; path = builtins/AddonBuiltins.cpp; sourceTree = ""; }; - 7C8E01F81BA35D0B0072E8B2 /* AddonBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AddonBuiltins.h; path = builtins/AddonBuiltins.h; sourceTree = ""; }; - 7C8E01F91BA35D0B0072E8B2 /* AndroidBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AndroidBuiltins.cpp; path = builtins/AndroidBuiltins.cpp; sourceTree = ""; }; - 7C8E01FA1BA35D0B0072E8B2 /* AndroidBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AndroidBuiltins.h; path = builtins/AndroidBuiltins.h; sourceTree = ""; }; - 7C8E01FB1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ApplicationBuiltins.cpp; path = builtins/ApplicationBuiltins.cpp; sourceTree = ""; }; - 7C8E01FC1BA35D0B0072E8B2 /* ApplicationBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ApplicationBuiltins.h; path = builtins/ApplicationBuiltins.h; sourceTree = ""; }; - 7C8E01FD1BA35D0B0072E8B2 /* Builtins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Builtins.cpp; path = builtins/Builtins.cpp; sourceTree = ""; }; - 7C8E01FE1BA35D0B0072E8B2 /* Builtins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Builtins.h; path = builtins/Builtins.h; sourceTree = ""; }; - 7C8E01FF1BA35D0B0072E8B2 /* CECBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CECBuiltins.cpp; path = builtins/CECBuiltins.cpp; sourceTree = ""; }; - 7C8E02001BA35D0B0072E8B2 /* CECBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CECBuiltins.h; path = builtins/CECBuiltins.h; sourceTree = ""; }; - 7C8E02011BA35D0B0072E8B2 /* GUIBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIBuiltins.cpp; path = builtins/GUIBuiltins.cpp; sourceTree = ""; }; - 7C8E02021BA35D0B0072E8B2 /* GUIBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIBuiltins.h; path = builtins/GUIBuiltins.h; sourceTree = ""; }; - 7C8E02031BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIContainerBuiltins.cpp; path = builtins/GUIContainerBuiltins.cpp; sourceTree = ""; }; - 7C8E02041BA35D0B0072E8B2 /* GUIContainerBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIContainerBuiltins.h; path = builtins/GUIContainerBuiltins.h; sourceTree = ""; }; - 7C8E02051BA35D0B0072E8B2 /* GUIControlBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIControlBuiltins.cpp; path = builtins/GUIControlBuiltins.cpp; sourceTree = ""; }; - 7C8E02061BA35D0B0072E8B2 /* GUIControlBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIControlBuiltins.h; path = builtins/GUIControlBuiltins.h; sourceTree = ""; }; - 7C8E02071BA35D0B0072E8B2 /* LibraryBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibraryBuiltins.cpp; path = builtins/LibraryBuiltins.cpp; sourceTree = ""; }; - 7C8E02081BA35D0B0072E8B2 /* LibraryBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibraryBuiltins.h; path = builtins/LibraryBuiltins.h; sourceTree = ""; }; - 7C8E02091BA35D0B0072E8B2 /* OpticalBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OpticalBuiltins.cpp; path = builtins/OpticalBuiltins.cpp; sourceTree = ""; }; - 7C8E020A1BA35D0B0072E8B2 /* OpticalBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpticalBuiltins.h; path = builtins/OpticalBuiltins.h; sourceTree = ""; }; - 7C8E020B1BA35D0B0072E8B2 /* PictureBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PictureBuiltins.cpp; path = builtins/PictureBuiltins.cpp; sourceTree = ""; }; - 7C8E020C1BA35D0B0072E8B2 /* PictureBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PictureBuiltins.h; path = builtins/PictureBuiltins.h; sourceTree = ""; }; - 7C8E020D1BA35D0B0072E8B2 /* PlayerBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PlayerBuiltins.cpp; path = builtins/PlayerBuiltins.cpp; sourceTree = ""; }; - 7C8E020E1BA35D0B0072E8B2 /* PlayerBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlayerBuiltins.h; path = builtins/PlayerBuiltins.h; sourceTree = ""; }; - 7C8E020F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ProfileBuiltins.cpp; path = builtins/ProfileBuiltins.cpp; sourceTree = ""; }; - 7C8E02101BA35D0B0072E8B2 /* ProfileBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProfileBuiltins.h; path = builtins/ProfileBuiltins.h; sourceTree = ""; }; - 7C8E02111BA35D0B0072E8B2 /* PVRBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PVRBuiltins.cpp; path = builtins/PVRBuiltins.cpp; sourceTree = ""; }; - 7C8E02121BA35D0B0072E8B2 /* PVRBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PVRBuiltins.h; path = builtins/PVRBuiltins.h; sourceTree = ""; }; - 7C8E02131BA35D0B0072E8B2 /* SkinBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkinBuiltins.cpp; path = builtins/SkinBuiltins.cpp; sourceTree = ""; }; - 7C8E02141BA35D0B0072E8B2 /* SkinBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkinBuiltins.h; path = builtins/SkinBuiltins.h; sourceTree = ""; }; - 7C8E02151BA35D0B0072E8B2 /* SystemBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SystemBuiltins.cpp; path = builtins/SystemBuiltins.cpp; sourceTree = ""; }; - 7C8E02161BA35D0B0072E8B2 /* SystemBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SystemBuiltins.h; path = builtins/SystemBuiltins.h; sourceTree = ""; }; - 7C8E02171BA35D0B0072E8B2 /* WeatherBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WeatherBuiltins.cpp; path = builtins/WeatherBuiltins.cpp; sourceTree = ""; }; - 7C8E02181BA35D0B0072E8B2 /* WeatherBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WeatherBuiltins.h; path = builtins/WeatherBuiltins.h; sourceTree = ""; }; 7C8FC6EC1829A4580045153D /* DirectoryProvider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DirectoryProvider.cpp; path = xbmc/listproviders/DirectoryProvider.cpp; sourceTree = SOURCE_ROOT; }; 7C8FC6ED1829A4580045153D /* DirectoryProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryProvider.h; path = xbmc/listproviders/DirectoryProvider.h; sourceTree = SOURCE_ROOT; }; 7C908892196358A8003D0619 /* auto_buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = auto_buffer.cpp; sourceTree = ""; }; 7C908893196358A8003D0619 /* auto_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = auto_buffer.h; sourceTree = ""; }; 7C920CF7181669FF00DA1477 /* TextureOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextureOperations.cpp; sourceTree = ""; }; 7C920CF8181669FF00DA1477 /* TextureOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextureOperations.h; sourceTree = ""; }; - 7C973CE31B50378E0002A874 /* AddonCallbacksAudioDSP.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AddonCallbacksAudioDSP.cpp; sourceTree = ""; }; - 7C973CE41B50378E0002A874 /* AddonCallbacksAudioDSP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddonCallbacksAudioDSP.h; sourceTree = ""; }; - 7C973CE71B5037EF0002A874 /* ActiveAEDSP.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ActiveAEDSP.cpp; path = xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp; sourceTree = SOURCE_ROOT; }; - 7C973CE81B5037EF0002A874 /* ActiveAEDSP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ActiveAEDSP.h; path = xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.h; sourceTree = SOURCE_ROOT; }; - 7C973CE91B5037EF0002A874 /* ActiveAEDSPAddon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ActiveAEDSPAddon.cpp; path = xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPAddon.cpp; sourceTree = SOURCE_ROOT; }; - 7C973CEA1B5037EF0002A874 /* ActiveAEDSPAddon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ActiveAEDSPAddon.h; path = xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPAddon.h; sourceTree = SOURCE_ROOT; }; - 7C973CEB1B5037EF0002A874 /* ActiveAEDSPDatabase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ActiveAEDSPDatabase.cpp; path = xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.cpp; sourceTree = SOURCE_ROOT; }; - 7C973CEC1B5037EF0002A874 /* ActiveAEDSPDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ActiveAEDSPDatabase.h; path = xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.h; sourceTree = SOURCE_ROOT; }; - 7C973CED1B5037EF0002A874 /* ActiveAEDSPMode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ActiveAEDSPMode.cpp; path = xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.cpp; sourceTree = SOURCE_ROOT; }; - 7C973CEE1B5037EF0002A874 /* ActiveAEDSPMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ActiveAEDSPMode.h; path = xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.h; sourceTree = SOURCE_ROOT; }; - 7C973CEF1B5037EF0002A874 /* ActiveAEDSPProcess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ActiveAEDSPProcess.cpp; path = xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.cpp; sourceTree = SOURCE_ROOT; }; - 7C973CF01B5037EF0002A874 /* ActiveAEDSPProcess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ActiveAEDSPProcess.h; path = xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.h; sourceTree = SOURCE_ROOT; }; - 7C973CF61B5038580002A874 /* GUIDialogAudioDSPManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIDialogAudioDSPManager.cpp; path = dialogs/GUIDialogAudioDSPManager.cpp; sourceTree = ""; }; - 7C973CF71B5038580002A874 /* GUIDialogAudioDSPManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIDialogAudioDSPManager.h; path = dialogs/GUIDialogAudioDSPManager.h; sourceTree = ""; }; - 7C973CF81B5038580002A874 /* GUIDialogAudioDSPSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIDialogAudioDSPSettings.cpp; path = dialogs/GUIDialogAudioDSPSettings.cpp; sourceTree = ""; }; - 7C973CF91B5038580002A874 /* GUIDialogAudioDSPSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIDialogAudioDSPSettings.h; path = dialogs/GUIDialogAudioDSPSettings.h; sourceTree = ""; }; - 7C973CFD1B5038680002A874 /* AudioDSPSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioDSPSettings.h; sourceTree = ""; }; 7C99B6A2133D342100FC2B16 /* CircularCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CircularCache.cpp; sourceTree = ""; }; 7C99B6A3133D342100FC2B16 /* CircularCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CircularCache.h; sourceTree = ""; }; 7C99B7931340723F00FC2B16 /* GUIDialogPlayEject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogPlayEject.cpp; sourceTree = ""; }; @@ -3216,15 +4148,18 @@ 7CCDACA019275D1E0074CF51 /* NptStdcEnvironment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptStdcEnvironment.cpp; sourceTree = ""; }; 7CCDACBD19275D790074CF51 /* NptAppleAutoreleasePool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NptAppleAutoreleasePool.mm; sourceTree = ""; }; 7CCDACC019275D790074CF51 /* NptAppleLogConfig.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NptAppleLogConfig.mm; sourceTree = ""; }; + 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Builtins.cpp; sourceTree = ""; }; + 7CCF7F1C1069F3AE00992676 /* Builtins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Builtins.h; sourceTree = ""; }; 7CCF7FC7106A0DF500992676 /* TimeUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TimeUtils.cpp; sourceTree = ""; }; 7CCF7FC8106A0DF500992676 /* TimeUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimeUtils.h; sourceTree = ""; }; 7CDAE9030FFCA3520040B25F /* DVDTSCorrection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDTSCorrection.cpp; sourceTree = ""; }; 7CDAE9040FFCA3520040B25F /* DVDTSCorrection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDTSCorrection.h; sourceTree = ""; }; + 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricstextustar.cpp; sourceTree = ""; }; + 7CDAEA7C1001CD6E0040B25F /* karaokelyricstextustar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricstextustar.h; sourceTree = ""; }; 7CEBD8A60F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpecialProtocolDirectory.cpp; sourceTree = ""; }; 7CEBD8A70F33A0D800CAF6AD /* SpecialProtocolDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpecialProtocolDirectory.h; sourceTree = ""; }; 7CEE2E5913D6B71E000ABF2A /* TimeSmoother.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TimeSmoother.cpp; sourceTree = ""; }; 7CEE2E5A13D6B71E000ABF2A /* TimeSmoother.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimeSmoother.h; sourceTree = ""; }; - 7CEE587C1B5A3FFB007C2B5A /* AudioDSPSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioDSPSettings.cpp; sourceTree = ""; }; 7CF05049190A1D7200222135 /* FFmpeg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FFmpeg.cpp; sourceTree = ""; }; 7CF0504A190A1D7200222135 /* FFmpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FFmpeg.h; sourceTree = ""; }; 7CF05051191195DA00222135 /* MediaType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaType.cpp; sourceTree = ""; }; @@ -3240,6 +4175,8 @@ 820023D9171A28A300667D1C /* OSXTextInputResponder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSXTextInputResponder.h; sourceTree = ""; }; 820023DA171A28A300667D1C /* OSXTextInputResponder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OSXTextInputResponder.mm; sourceTree = ""; }; 82F6F0EA16F269BB0081CC3C /* Buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Buffer.h; path = commons/Buffer.h; sourceTree = ""; }; + 83A72B950FBC8E3B00171871 /* LockFree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LockFree.cpp; sourceTree = ""; }; + 83A72B960FBC8E3B00171871 /* LockFree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LockFree.h; sourceTree = ""; }; 83E0B2470F7C95FF0091643F /* Atomics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Atomics.h; sourceTree = ""; }; 83E0B2480F7C95FF0091643F /* Atomics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Atomics.cpp; sourceTree = ""; }; 880DBE490DC223FF00E26B71 /* Album.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Album.h; sourceTree = ""; }; @@ -3266,6 +4203,7 @@ 889B4D8D0E0EF86C00FAD25E /* RSSDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSSDirectory.h; sourceTree = ""; }; 88ECB6580DE013C4003396A7 /* DiskArbitration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiskArbitration.framework; path = /System/Library/Frameworks/DiskArbitration.framework; sourceTree = ""; }; 8DD76F7E0486A8DE00D96B5E /* Kodi */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Kodi; sourceTree = BUILT_PRODUCTS_DIR; }; + D6299ABB1AFC2A9F00E3059D /* Kodi.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Kodi.app; sourceTree = BUILT_PRODUCTS_DIR; }; AE4E87A517354C4A00D15206 /* XSLTUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XSLTUtils.cpp; sourceTree = ""; }; AE4E87A617354C4A00D15206 /* XSLTUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XSLTUtils.h; sourceTree = ""; }; AE84CB5915A5B8A600A3810E /* TagLibVFSStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TagLibVFSStream.cpp; sourceTree = ""; }; @@ -3274,13 +4212,6 @@ AE89ACA51621DAB800E17DBC /* DVDDemuxBXA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDDemuxBXA.h; sourceTree = ""; }; AEC0083015ACAC6E0099888C /* TagLoaderTagLib.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TagLoaderTagLib.cpp; sourceTree = ""; }; AEC0083315ACAC7C0099888C /* TagLoaderTagLib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TagLoaderTagLib.h; sourceTree = ""; }; - B179BD641AD8EA7B00EA8D49 /* InputCodingTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InputCodingTable.h; path = xbmc/input/InputCodingTable.h; sourceTree = SOURCE_ROOT; }; - B179BD651AD8EA7B00EA8D49 /* InputCodingTableBaiduPY.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = InputCodingTableBaiduPY.cpp; path = xbmc/input/InputCodingTableBaiduPY.cpp; sourceTree = SOURCE_ROOT; }; - B179BD661AD8EA7B00EA8D49 /* InputCodingTableBaiduPY.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InputCodingTableBaiduPY.h; path = xbmc/input/InputCodingTableBaiduPY.h; sourceTree = SOURCE_ROOT; }; - B179BD671AD8EA7B00EA8D49 /* InputCodingTableBasePY.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = InputCodingTableBasePY.cpp; path = xbmc/input/InputCodingTableBasePY.cpp; sourceTree = SOURCE_ROOT; }; - B179BD681AD8EA7B00EA8D49 /* InputCodingTableBasePY.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InputCodingTableBasePY.h; path = xbmc/input/InputCodingTableBasePY.h; sourceTree = SOURCE_ROOT; }; - B179BD691AD8EA7B00EA8D49 /* InputCodingTableFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = InputCodingTableFactory.cpp; path = xbmc/input/InputCodingTableFactory.cpp; sourceTree = SOURCE_ROOT; }; - B179BD6A1AD8EA7B00EA8D49 /* InputCodingTableFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InputCodingTableFactory.h; path = xbmc/input/InputCodingTableFactory.h; sourceTree = SOURCE_ROOT; }; B5011E3F19AF3B56005ADF89 /* PosixFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PosixFile.cpp; sourceTree = ""; }; B5011E4019AF3B56005ADF89 /* PosixFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PosixFile.h; sourceTree = ""; }; B5101B5719DFF8DD00294D1E /* BlurayFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BlurayFile.cpp; sourceTree = ""; }; @@ -3389,7 +4320,6 @@ C8D0B2AE1265A9A800F0C0AC /* SystemGlobals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SystemGlobals.cpp; sourceTree = ""; }; C8EC5D0C1369519D00CCC10D /* XBMC_keytable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XBMC_keytable.cpp; sourceTree = ""; }; C8EC5D0D1369519D00CCC10D /* XBMC_keytable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XBMC_keytable.h; sourceTree = ""; }; - D6299ABB1AFC2A9F00E3059D /* Kodi.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Kodi.app; sourceTree = BUILT_PRODUCTS_DIR; }; DF00492B162DAEA200A971AD /* PVROperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PVROperations.cpp; sourceTree = ""; }; DF00492C162DAEA200A971AD /* PVROperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVROperations.h; sourceTree = ""; }; DF02BA601A910623006DCA16 /* VideoSyncIos.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VideoSyncIos.cpp; path = videosync/VideoSyncIos.cpp; sourceTree = ""; }; @@ -3398,20 +4328,14 @@ DF02BA651A91065F006DCA16 /* VideoSyncOsx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VideoSyncOsx.h; path = videosync/VideoSyncOsx.h; sourceTree = ""; }; DF033D361946612400BFC82E /* AEDeviceEnumerationOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AEDeviceEnumerationOSX.cpp; path = Sinks/osx/AEDeviceEnumerationOSX.cpp; sourceTree = ""; }; DF033D371946612400BFC82E /* AEDeviceEnumerationOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AEDeviceEnumerationOSX.h; path = Sinks/osx/AEDeviceEnumerationOSX.h; sourceTree = ""; }; + DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokevideobackground.cpp; sourceTree = ""; }; + DF07252D168734D7008DCAAD /* karaokevideobackground.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokevideobackground.h; sourceTree = ""; }; DF072532168734ED008DCAAD /* FFmpegVideoDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FFmpegVideoDecoder.cpp; sourceTree = ""; }; DF072533168734ED008DCAAD /* FFmpegVideoDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FFmpegVideoDecoder.h; sourceTree = ""; }; DF0ABB71183A94A30018445D /* Utf8Utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Utf8Utils.cpp; sourceTree = ""; }; DF0ABB72183A94A30018445D /* Utf8Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utf8Utils.h; sourceTree = ""; }; DF0DF15913A3ADA7008ED511 /* NFSDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NFSDirectory.cpp; sourceTree = ""; }; DF0DF15A13A3ADA7008ED511 /* NFSDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NFSDirectory.h; sourceTree = ""; }; - DF0E4AC31AD597ED00A75430 /* DVDPlayerRadioRDS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDPlayerRadioRDS.cpp; sourceTree = ""; }; - DF0E4AC41AD597ED00A75430 /* DVDPlayerRadioRDS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDPlayerRadioRDS.h; sourceTree = ""; }; - DF0E4AC81AD5982500A75430 /* InfoTagRadioRDS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InfoTagRadioRDS.cpp; sourceTree = ""; }; - DF0E4AC91AD5982500A75430 /* InfoTagRadioRDS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InfoTagRadioRDS.h; sourceTree = ""; }; - DF0E4ACD1AD5984600A75430 /* PVRRadioRDSInfoTag.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PVRRadioRDSInfoTag.cpp; sourceTree = ""; }; - DF0E4ACE1AD5984600A75430 /* PVRRadioRDSInfoTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVRRadioRDSInfoTag.h; sourceTree = ""; }; - DF0E4AD21AD5986F00A75430 /* GUIDialogPVRRadioRDSInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogPVRRadioRDSInfo.cpp; sourceTree = ""; }; - DF0E4AD31AD5986F00A75430 /* GUIDialogPVRRadioRDSInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogPVRRadioRDSInfo.h; sourceTree = ""; }; DF14CF7C1A77782E00396CC9 /* InputManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InputManager.cpp; sourceTree = ""; }; DF14CF7D1A77782E00396CC9 /* InputManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputManager.h; sourceTree = ""; }; DF1ACFD115FCE50700E10810 /* AddonModuleXbmc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AddonModuleXbmc.cpp; sourceTree = ""; }; @@ -3481,13 +4405,6 @@ DF1AD1EB15FCE77900E10810 /* WindowInterceptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowInterceptor.h; sourceTree = ""; }; DF1AD1EC15FCE77900E10810 /* WindowXML.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WindowXML.cpp; sourceTree = ""; }; DF1AD1ED15FCE77900E10810 /* WindowXML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowXML.h; sourceTree = ""; }; - DF1D2DE61B6E85EE002BB9DB /* Directorization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Directorization.h; sourceTree = ""; }; - DF1D2DE71B6E85EE002BB9DB /* XbtDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XbtDirectory.cpp; sourceTree = ""; }; - DF1D2DE81B6E85EE002BB9DB /* XbtDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XbtDirectory.h; sourceTree = ""; }; - DF1D2DE91B6E85EE002BB9DB /* XbtFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XbtFile.cpp; sourceTree = ""; }; - DF1D2DEA1B6E85EE002BB9DB /* XbtFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XbtFile.h; sourceTree = ""; }; - DF1D2DEB1B6E85EE002BB9DB /* XbtManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XbtManager.cpp; sourceTree = ""; }; - DF1D2DEC1B6E85EE002BB9DB /* XbtManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XbtManager.h; sourceTree = ""; }; DF2345D915FA639500A934F6 /* UPnP.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPnP.cpp; sourceTree = ""; }; DF2345DA15FA639500A934F6 /* UPnP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPnP.h; sourceTree = ""; }; DF2345DB15FA639500A934F6 /* UPnPInternal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPnPInternal.cpp; sourceTree = ""; }; @@ -3496,11 +4413,6 @@ DF2345DE15FA639500A934F6 /* UPnPRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPnPRenderer.h; sourceTree = ""; }; DF2345DF15FA639500A934F6 /* UPnPServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPnPServer.cpp; sourceTree = ""; }; DF2345E015FA639500A934F6 /* UPnPServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPnPServer.h; sourceTree = ""; }; - DF2401241B41A26E001E02DA /* ImageResource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageResource.cpp; sourceTree = ""; }; - DF2401251B41A26E001E02DA /* ImageResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageResource.h; sourceTree = ""; }; - DF2863B419918B07008994AB /* DllLibGif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DllLibGif.h; sourceTree = ""; }; - DF2863B519918B07008994AB /* Gif.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Gif.cpp; sourceTree = ""; }; - DF2863B619918B07008994AB /* Gif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gif.h; sourceTree = ""; }; DF28DF4B17B8379E0077F41A /* ProfilesOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProfilesOperations.cpp; sourceTree = ""; }; DF28DF4C17B8379E0077F41A /* ProfilesOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProfilesOperations.h; sourceTree = ""; }; DF28ED94170E1A11005FA9D2 /* GUIDialogLockSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogLockSettings.cpp; sourceTree = ""; }; @@ -3515,25 +4427,6 @@ DF28EDA0170E1A11005FA9D2 /* GUIWindowSettingsProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowSettingsProfile.h; sourceTree = ""; }; DF28EE01170E1E51005FA9D2 /* DisplaySettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DisplaySettings.cpp; sourceTree = ""; }; DF28EE02170E1E51005FA9D2 /* DisplaySettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplaySettings.h; sourceTree = ""; }; - DF29BCD51B5D911700904347 /* AddonEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AddonEvent.cpp; sourceTree = ""; }; - DF29BCD61B5D911700904347 /* AddonEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddonEvent.h; sourceTree = ""; }; - DF29BCD71B5D911700904347 /* AddonManagementEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AddonManagementEvent.cpp; sourceTree = ""; }; - DF29BCD81B5D911700904347 /* AddonManagementEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddonManagementEvent.h; sourceTree = ""; }; - DF29BCD91B5D911700904347 /* BaseEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BaseEvent.cpp; sourceTree = ""; }; - DF29BCDA1B5D911700904347 /* BaseEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseEvent.h; sourceTree = ""; }; - DF29BCDB1B5D911700904347 /* EventLog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventLog.cpp; sourceTree = ""; }; - DF29BCDC1B5D911700904347 /* EventLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventLog.h; sourceTree = ""; }; - DF29BCDD1B5D911700904347 /* IEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IEvent.h; sourceTree = ""; }; - DF29BCDF1B5D911700904347 /* MediaLibraryEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaLibraryEvent.cpp; sourceTree = ""; }; - DF29BCE01B5D911700904347 /* MediaLibraryEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaLibraryEvent.h; sourceTree = ""; }; - DF29BCE11B5D911700904347 /* NotificationEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotificationEvent.h; sourceTree = ""; }; - DF29BCE21B5D911700904347 /* UniqueEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UniqueEvent.h; sourceTree = ""; }; - DF29BCE41B5D911700904347 /* GUIViewStateEventLog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIViewStateEventLog.cpp; sourceTree = ""; }; - DF29BCE51B5D911700904347 /* GUIViewStateEventLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIViewStateEventLog.h; sourceTree = ""; }; - DF29BCE61B5D911700904347 /* GUIWindowEventLog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowEventLog.cpp; sourceTree = ""; }; - DF29BCE71B5D911700904347 /* GUIWindowEventLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowEventLog.h; sourceTree = ""; }; - DF29BD001B5D913B00904347 /* EventsDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventsDirectory.cpp; sourceTree = ""; }; - DF29BD011B5D913B00904347 /* EventsDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventsDirectory.h; sourceTree = ""; }; DF32466019E931A8005E8CFB /* ActiveAEResampleFFMPEG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ActiveAEResampleFFMPEG.cpp; sourceTree = ""; }; DF32466119E931A8005E8CFB /* ActiveAEResampleFFMPEG.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActiveAEResampleFFMPEG.h; sourceTree = ""; }; DF3488E513FD958F0026A711 /* GUIAction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIAction.cpp; sourceTree = ""; }; @@ -3542,13 +4435,21 @@ DF34892913FD9C780026A711 /* AirPlayServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AirPlayServer.h; sourceTree = ""; }; DF34897A13FDAA270026A711 /* HttpParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpParser.h; sourceTree = ""; }; DF34898113FDAAF60026A711 /* HttpParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HttpParser.cpp; sourceTree = ""; }; + DF3C3C7C1752AB68000989C3 /* App-ATV2.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "App-ATV2.xcconfig"; sourceTree = ""; }; + DF3C3D171752BED3000989C3 /* copyframeworks-atv2.command */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "copyframeworks-atv2.command"; sourceTree = ""; }; DF3C3D181752BED3000989C3 /* copyframeworks-ios.command */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "copyframeworks-ios.command"; sourceTree = ""; }; DF3C3D191752BED3000989C3 /* copyframeworks-osx.command */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "copyframeworks-osx.command"; sourceTree = ""; }; + DF3C3D1A1752BED3000989C3 /* CopyRootFiles-atv2.command */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "CopyRootFiles-atv2.command"; sourceTree = ""; }; DF3C3D1B1752BED3000989C3 /* CopyRootFiles-ios.command */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "CopyRootFiles-ios.command"; sourceTree = ""; }; DF3C3D1C1752BED3000989C3 /* CopyRootFiles-osx.command */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "CopyRootFiles-osx.command"; sourceTree = ""; }; DF3C3D1D1752BED3000989C3 /* genoutputdirlink.command */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = genoutputdirlink.command; sourceTree = ""; }; DF3C3D1E1752BED3000989C3 /* makepythoninterface.command */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = makepythoninterface.command; sourceTree = ""; }; DF3C3D1F1752BED3000989C3 /* updateversioninfo-osx.command */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "updateversioninfo-osx.command"; sourceTree = ""; }; + DF3E5EF5199D400B0039675D /* kodiclientwrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodiclientwrapper.h; sourceTree = ""; }; + DF3E5EF8199D41300039675D /* kodiclient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodiclient.h; sourceTree = ""; }; + DF3E5EF9199D41300039675D /* kodiclientwrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = kodiclientwrapper.mm; sourceTree = ""; }; + DF3E5EFB199D4B340039675D /* KodiController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KodiController.h; sourceTree = ""; }; + DF3E5EFC199D4B340039675D /* KodiController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = KodiController.mm; sourceTree = ""; }; DF404A3416B9896C00D8023E /* cximage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cximage.cpp; sourceTree = ""; }; DF404A3516B9896C00D8023E /* cximage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cximage.h; sourceTree = ""; }; DF404A3616B9896C00D8023E /* iimage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iimage.h; sourceTree = ""; }; @@ -3566,10 +4467,6 @@ DF448456140048A60069344B /* AirTunesServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AirTunesServer.h; sourceTree = ""; }; DF44845B140048C80069344B /* PipesManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PipesManager.cpp; sourceTree = ""; }; DF44845C140048C80069344B /* PipesManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PipesManager.h; sourceTree = ""; }; - DF4A3BAD1B4B0FC100F9CDC0 /* ApplicationMessenger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ApplicationMessenger.cpp; sourceTree = ""; }; - DF4A3BAE1B4B0FC100F9CDC0 /* ApplicationMessenger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplicationMessenger.h; sourceTree = ""; }; - DF4A3BAF1B4B0FC100F9CDC0 /* IMessageTarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IMessageTarget.h; sourceTree = ""; }; - DF4A3BB11B4B0FC100F9CDC0 /* ThreadMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadMessage.h; sourceTree = ""; }; DF4BF0111A4EF30F0053AC56 /* cc_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cc_decoder.c; sourceTree = ""; }; DF4BF0121A4EF30F0053AC56 /* cc_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cc_decoder.h; sourceTree = ""; }; DF4BF0131A4EF30F0053AC56 /* cc_decoder708.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cc_decoder708.cpp; sourceTree = ""; }; @@ -3592,16 +4489,10 @@ DF527732151BAF4C00B5B63B /* WebSocketV8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSocketV8.h; sourceTree = ""; }; DF529BAC1741697B00523FB4 /* Environment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Environment.cpp; sourceTree = ""; }; DF529BAD1741697B00523FB4 /* Environment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Environment.h; sourceTree = ""; }; - DF54F7FC1B6580AC000FCBA4 /* ContextMenuItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContextMenuItem.cpp; sourceTree = ""; }; - DF54F7FD1B6580AC000FCBA4 /* ContextMenuItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContextMenuItem.h; sourceTree = ""; }; - DF54F8011B6580C8000FCBA4 /* ContextMenuAddon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContextMenuAddon.cpp; sourceTree = ""; }; - DF54F8021B6580C8000FCBA4 /* ContextMenuAddon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContextMenuAddon.h; sourceTree = ""; }; DF56EF1D1A798A3F00CAAEFB /* HTTPFileHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPFileHandler.cpp; sourceTree = ""; }; DF56EF1E1A798A3F00CAAEFB /* HTTPFileHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPFileHandler.h; sourceTree = ""; }; DF56EF221A798A5E00CAAEFB /* HttpRangeUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HttpRangeUtils.cpp; sourceTree = ""; }; DF56EF231A798A5E00CAAEFB /* HttpRangeUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpRangeUtils.h; sourceTree = ""; }; - DF5E69981B28121E009A88C3 /* PVRTimerType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PVRTimerType.cpp; sourceTree = ""; }; - DF5E69991B28121E009A88C3 /* PVRTimerType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVRTimerType.h; sourceTree = ""; }; DF5EEEFB17CE977A003DEC49 /* AERingBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AERingBuffer.h; sourceTree = ""; }; DF64FE3516C07AAA00D028FB /* GUIViewControl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIViewControl.cpp; sourceTree = ""; }; DF64FE3616C07AAA00D028FB /* GUIViewControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIViewControl.h; sourceTree = ""; }; @@ -3614,8 +4505,6 @@ DF6A0D7E1A4584E80075BBFC /* OverrideDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverrideDirectory.h; sourceTree = ""; }; DF6A0D7F1A4584E80075BBFC /* OverrideFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OverrideFile.cpp; sourceTree = ""; }; DF6A0D801A4584E80075BBFC /* OverrideFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverrideFile.h; sourceTree = ""; }; - DF6F52AC1AF6D03F001BC57D /* dacp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dacp.cpp; sourceTree = ""; }; - DF6F52AD1AF6D03F001BC57D /* dacp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dacp.h; sourceTree = ""; }; DF830D0A15BB260C00602BE6 /* GUIDialogKeyboardGeneric.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogKeyboardGeneric.cpp; sourceTree = ""; }; DF830D0B15BB260C00602BE6 /* GUIDialogKeyboardGeneric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogKeyboardGeneric.h; sourceTree = ""; }; DF830D0E15BB262700602BE6 /* GUIKeyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIKeyboard.h; sourceTree = ""; }; @@ -3631,6 +4520,8 @@ DF8990201709BB5400B35C21 /* ViewStateSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewStateSettings.h; sourceTree = ""; }; DF923E5B1A11536A008CDB0C /* DataCacheCore.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataCacheCore.cpp; sourceTree = ""; }; DF923E5C1A11536A008CDB0C /* DataCacheCore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataCacheCore.h; sourceTree = ""; }; + DF93D65B1444A7A3007C6459 /* SlingboxDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlingboxDirectory.h; sourceTree = ""; }; + DF93D65C1444A7A3007C6459 /* SlingboxDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SlingboxDirectory.cpp; sourceTree = ""; }; DF93D6651444A8B0007C6459 /* DirectoryCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DirectoryCache.cpp; sourceTree = ""; }; DF93D6661444A8B0007C6459 /* DirectoryCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectoryCache.h; sourceTree = ""; }; DF93D6671444A8B0007C6459 /* FileCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileCache.cpp; sourceTree = ""; }; @@ -3659,6 +4550,8 @@ DF93D6861444A8B0007C6459 /* SFTPFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFTPFile.h; sourceTree = ""; }; DF93D6871444A8B0007C6459 /* ShoutcastFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShoutcastFile.cpp; sourceTree = ""; }; DF93D6881444A8B0007C6459 /* ShoutcastFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShoutcastFile.h; sourceTree = ""; }; + DF93D6891444A8B0007C6459 /* SlingboxFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SlingboxFile.cpp; sourceTree = ""; }; + DF93D68A1444A8B0007C6459 /* SlingboxFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlingboxFile.h; sourceTree = ""; }; DF93D68B1444A8B0007C6459 /* SMBFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SMBFile.cpp; sourceTree = ""; }; DF93D68C1444A8B0007C6459 /* SMBFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SMBFile.h; sourceTree = ""; }; DF93D68D1444A8B0007C6459 /* SpecialProtocolFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpecialProtocolFile.cpp; sourceTree = ""; }; @@ -3669,6 +4562,10 @@ DF93D6961444A8B0007C6459 /* UPnPFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPnPFile.h; sourceTree = ""; }; DF93D6971444A8B0007C6459 /* ZipFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ZipFile.cpp; sourceTree = ""; }; DF93D6981444A8B0007C6459 /* ZipFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZipFile.h; sourceTree = ""; }; + DF93D7F01444B54A007C6459 /* HDHomeRunFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HDHomeRunFile.cpp; sourceTree = ""; }; + DF93D7F11444B54A007C6459 /* HDHomeRunFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDHomeRunFile.h; sourceTree = ""; }; + DF93D7F41444B568007C6459 /* HDHomeRunDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDHomeRunDirectory.h; sourceTree = ""; }; + DF93D7F51444B568007C6459 /* HDHomeRunDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HDHomeRunDirectory.cpp; sourceTree = ""; }; DF98D98A1434F47D00A6EBE1 /* SkinVariable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SkinVariable.cpp; sourceTree = ""; }; DF98D98B1434F47D00A6EBE1 /* SkinVariable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkinVariable.h; sourceTree = ""; }; DF9A71EC1639C8F6005ECB2E /* HTTPFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPFile.cpp; sourceTree = ""; }; @@ -3715,7 +4612,6 @@ DFBB4307178B574E006CC20A /* AddonCallbacksCodec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddonCallbacksCodec.h; sourceTree = ""; }; DFBB4317178B5E6F006CC20A /* CompileInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CompileInfo.cpp; sourceTree = ""; }; DFBB4318178B5E6F006CC20A /* CompileInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompileInfo.h; sourceTree = ""; }; - DFBD336A1BD531CB001A8FEE /* DllVideoToolBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DllVideoToolBox.h; sourceTree = ""; }; DFBE803D15F7D72100D7D102 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; DFC6F4AD1AFF7CB10039A7FA /* _kiss_fft_guts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _kiss_fft_guts.h; sourceTree = ""; }; DFC6F4AF1AFF7CB10039A7FA /* kiss_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = kiss_fft.c; sourceTree = ""; }; @@ -3724,6 +4620,9 @@ DFC6F4B21AFF7CB10039A7FA /* kiss_fftr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kiss_fftr.h; sourceTree = ""; }; DFC6F4BF1AFF7E300039A7FA /* rfft.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rfft.cpp; sourceTree = ""; }; DFC6F4C01AFF7E300039A7FA /* rfft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rfft.h; sourceTree = ""; }; + DFC8B7CC199C1EC100424777 /* TopShelf.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = TopShelf.png; sourceTree = ""; }; + DFC8B7CD199C2B3A00424777 /* KodiAppliance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KodiAppliance.h; sourceTree = ""; }; + DFC8B7CE199C2B3A00424777 /* KodiAppliance.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = KodiAppliance.mm; sourceTree = ""; }; DFCA6ABB152245CD000BFAAE /* HTTPJsonRpcHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPJsonRpcHandler.cpp; sourceTree = ""; }; DFCA6ABC152245CD000BFAAE /* HTTPJsonRpcHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPJsonRpcHandler.h; sourceTree = ""; }; DFCA6ABD152245CD000BFAAE /* HTTPVfsHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPVfsHandler.cpp; sourceTree = ""; }; @@ -3747,8 +4646,6 @@ DFD928F116384B6800709DAE /* Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timer.cpp; sourceTree = ""; }; DFD928F216384B6800709DAE /* Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Timer.h; sourceTree = ""; }; DFDA3152160E34230047A626 /* DVDOverlayCodec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDOverlayCodec.cpp; sourceTree = ""; }; - DFDE5D4F1AE5658200EE53AD /* PictureScalingAlgorithm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PictureScalingAlgorithm.cpp; sourceTree = ""; }; - DFDE5D501AE5658200EE53AD /* PictureScalingAlgorithm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PictureScalingAlgorithm.h; sourceTree = ""; }; DFE4095917417FDF00473BD9 /* LegacyPathTranslation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LegacyPathTranslation.cpp; sourceTree = ""; }; DFE4095A17417FDF00473BD9 /* LegacyPathTranslation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LegacyPathTranslation.h; sourceTree = ""; }; DFEB902519E9335E00728978 /* AEResample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AEResample.h; sourceTree = ""; }; @@ -3771,7 +4668,16 @@ DFEF0BAB180ADE6400AEAED1 /* IFileItemListModifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IFileItemListModifier.h; sourceTree = ""; }; DFEF0BBF180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SmartPlaylistFileItemListModifier.cpp; sourceTree = ""; }; DFEF0BC0180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmartPlaylistFileItemListModifier.h; sourceTree = ""; }; + DFF0EB8717528174002DA3A4 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + DFF0EB8D17528174002DA3A4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + DFF0EB9517528174002DA3A4 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + DFF0EC8B17528283002DA3A4 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/PrivateFrameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; DFF0ECA8175282EA002DA3A4 /* README.ios */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.ios; path = docs/README.ios; sourceTree = ""; }; + DFF0F4911752838E002DA3A4 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + DFF0F4921752838E002DA3A4 /* substrate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = substrate.h; sourceTree = ""; }; + DFF0F4961752838E002DA3A4 /* XBMCATV2-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "XBMCATV2-Info.plist"; sourceTree = ""; }; + DFF0F49C1752838E002DA3A4 /* XBMCDebugHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XBMCDebugHelpers.h; sourceTree = ""; }; + DFFA43D019104BFA00C3923B /* AppIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppIcon.png; sourceTree = ""; }; DFFA43D319104BFA00C3923B /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iTunesArtwork.png; sourceTree = ""; }; DFFA43D419104BFA00C3923B /* iTunesArtwork@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "iTunesArtwork@2x.png"; sourceTree = ""; }; DFFA43D619104BFA00C3923B /* AppIcon29x29.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppIcon29x29.png; sourceTree = ""; }; @@ -3812,10 +4718,13 @@ DFFA43FC19104BFA00C3923B /* icon_32x32@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_32x32@2x.png"; sourceTree = ""; }; DFFA43FD19104BFA00C3923B /* icon_512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_512x512.png; sourceTree = ""; }; DFFA43FE19104BFA00C3923B /* icon_512x512@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_512x512@2x.png"; sourceTree = ""; }; + DFFC52CB17527B3100C937AB /* Kodi.frappliance */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Kodi.frappliance; sourceTree = BUILT_PRODUCTS_DIR; }; E306D12C0DDF7B590052C2AD /* XBMCHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XBMCHelper.cpp; sourceTree = ""; }; E306D12D0DDF7B590052C2AD /* XBMCHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XBMCHelper.h; sourceTree = ""; }; E33206370D5070AA00435CE3 /* DVDDemuxVobsub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDDemuxVobsub.cpp; sourceTree = ""; }; E33466A50D2E5103005A65EC /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; + E33979940D62FD47004ECDDA /* DVDInputStreamTV.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDInputStreamTV.cpp; sourceTree = ""; }; + E33979950D62FD47004ECDDA /* DVDInputStreamTV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDInputStreamTV.h; sourceTree = ""; }; E36578860D3AA7B40033CC1C /* DVDPlayerCodec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDPlayerCodec.cpp; sourceTree = ""; }; E36578870D3AA7B40033CC1C /* DVDPlayerCodec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDPlayerCodec.h; sourceTree = ""; }; E36C29DB0DA72429001F0C9D /* Artist.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Artist.cpp; sourceTree = ""; }; @@ -3829,6 +4738,8 @@ E38A06CD0D95AA5500FF8227 /* GUIDialogKaiToast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogKaiToast.h; sourceTree = ""; }; E38E14640D25F9F900618676 /* Application.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Application.cpp; sourceTree = ""; }; E38E14650D25F9F900618676 /* Application.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Application.h; sourceTree = ""; }; + E38E14660D25F9F900618676 /* ApplicationMessenger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ApplicationMessenger.cpp; sourceTree = ""; }; + E38E14670D25F9F900618676 /* ApplicationMessenger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplicationMessenger.h; sourceTree = ""; }; E38E146E0D25F9F900618676 /* Autorun.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Autorun.cpp; sourceTree = ""; }; E38E146F0D25F9F900618676 /* Autorun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Autorun.h; sourceTree = ""; }; E38E14700D25F9F900618676 /* AutoSwitch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AutoSwitch.cpp; sourceTree = ""; }; @@ -4146,6 +5057,8 @@ E38E17A70D25F9FA00618676 /* GUIDialogFavourites.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogFavourites.h; sourceTree = ""; }; E38E17A80D25F9FA00618676 /* GUIDialogFileBrowser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogFileBrowser.cpp; sourceTree = ""; }; E38E17A90D25F9FA00618676 /* GUIDialogFileBrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogFileBrowser.h; sourceTree = ""; }; + E38E17AA0D25F9FA00618676 /* GUIDialogFileStacking.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogFileStacking.cpp; sourceTree = ""; }; + E38E17AB0D25F9FA00618676 /* GUIDialogFileStacking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogFileStacking.h; sourceTree = ""; }; E38E17AC0D25F9FA00618676 /* GUIDialogGamepad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogGamepad.cpp; sourceTree = ""; }; E38E17AD0D25F9FA00618676 /* GUIDialogGamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogGamepad.h; sourceTree = ""; }; E38E17B80D25F9FA00618676 /* GUIDialogMediaSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogMediaSource.cpp; sourceTree = ""; }; @@ -4209,10 +5122,14 @@ E38E18100D25F9FA00618676 /* GUIDialogMusicInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogMusicInfo.h; sourceTree = ""; }; E38E18110D25F9FA00618676 /* GUIWindowMusicNav.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowMusicNav.cpp; sourceTree = ""; }; E38E18120D25F9FA00618676 /* GUIWindowMusicNav.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowMusicNav.h; sourceTree = ""; }; + E38E18130D25F9FA00618676 /* GUIDialogMusicOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogMusicOverlay.cpp; sourceTree = ""; }; + E38E18140D25F9FA00618676 /* GUIDialogMusicOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogMusicOverlay.h; sourceTree = ""; }; E38E18150D25F9FA00618676 /* GUIWindowMusicPlaylist.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowMusicPlaylist.cpp; sourceTree = ""; }; E38E18160D25F9FA00618676 /* GUIWindowMusicPlaylist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowMusicPlaylist.h; sourceTree = ""; }; E38E18170D25F9FA00618676 /* GUIWindowMusicPlaylistEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowMusicPlaylistEditor.cpp; sourceTree = ""; }; E38E18180D25F9FA00618676 /* GUIWindowMusicPlaylistEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowMusicPlaylistEditor.h; sourceTree = ""; }; + E38E18190D25F9FA00618676 /* GUIWindowMusicSongs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowMusicSongs.cpp; sourceTree = ""; }; + E38E181A0D25F9FA00618676 /* GUIWindowMusicSongs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowMusicSongs.h; sourceTree = ""; }; E38E181D0D25F9FA00618676 /* GUIDialogVideoOSD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogVideoOSD.cpp; sourceTree = ""; }; E38E181E0D25F9FA00618676 /* GUIDialogVideoOSD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogVideoOSD.h; sourceTree = ""; }; E38E181F0D25F9FA00618676 /* GUIWindowPictures.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowPictures.cpp; sourceTree = ""; }; @@ -4235,6 +5152,8 @@ E38E18400D25F9FA00618676 /* GUIDialogVideoInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogVideoInfo.h; sourceTree = ""; }; E38E18410D25F9FA00618676 /* GUIWindowVideoNav.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowVideoNav.cpp; sourceTree = ""; }; E38E18420D25F9FA00618676 /* GUIWindowVideoNav.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowVideoNav.h; sourceTree = ""; }; + E38E18430D25F9FA00618676 /* GUIDialogVideoOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogVideoOverlay.cpp; sourceTree = ""; }; + E38E18440D25F9FA00618676 /* GUIDialogVideoOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogVideoOverlay.h; sourceTree = ""; }; E38E18450D25F9FA00618676 /* GUIWindowVideoPlaylist.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowVideoPlaylist.cpp; sourceTree = ""; }; E38E18460D25F9FA00618676 /* GUIWindowVideoPlaylist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowVideoPlaylist.h; sourceTree = ""; }; E38E18470D25F9FA00618676 /* GUIWindowVisualisation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowVisualisation.cpp; sourceTree = ""; }; @@ -4247,6 +5166,14 @@ E38E18580D25F9FA00618676 /* LangInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LangInfo.cpp; sourceTree = ""; }; E38E18590D25F9FA00618676 /* LangInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LangInfo.h; sourceTree = ""; }; E38E18830D25F9FA00618676 /* libexif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libexif.h; sourceTree = ""; }; + E38E196E0D25F9FB00618676 /* hdhomerun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hdhomerun.h; sourceTree = ""; }; + E38E196F0D25F9FB00618676 /* hdhomerun_channelscan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hdhomerun_channelscan.h; sourceTree = ""; }; + E38E19700D25F9FB00618676 /* hdhomerun_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hdhomerun_control.h; sourceTree = ""; }; + E38E19710D25F9FB00618676 /* hdhomerun_device.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hdhomerun_device.h; sourceTree = ""; }; + E38E19720D25F9FB00618676 /* hdhomerun_discover.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hdhomerun_discover.h; sourceTree = ""; }; + E38E19730D25F9FB00618676 /* hdhomerun_os.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hdhomerun_os.h; sourceTree = ""; }; + E38E19740D25F9FB00618676 /* hdhomerun_pkt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hdhomerun_pkt.h; sourceTree = ""; }; + E38E19750D25F9FB00618676 /* hdhomerun_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hdhomerun_video.h; sourceTree = ""; }; E38E1AB80D25F9FB00618676 /* SConstruct */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SConstruct; sourceTree = ""; }; E38E1CD70D25F9FC00618676 /* dataset.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dataset.cpp; sourceTree = ""; }; E38E1CD80D25F9FC00618676 /* dataset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dataset.h; sourceTree = ""; }; @@ -4507,7 +5434,7 @@ E46F7C2B0F77219700C25D29 /* ZeroconfOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZeroconfOSX.h; sourceTree = ""; }; E46F7C2C0F77219700C25D29 /* ZeroconfOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ZeroconfOSX.cpp; sourceTree = ""; }; E47252BF175115F9001C1AAA /* Codesign.command */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = Codesign.command; sourceTree = ""; }; - E4991089174D0D2600741B6D /* Kodi.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Kodi.app; sourceTree = BUILT_PRODUCTS_DIR; }; + E4991089174D0D2600741B6D /* Kodi.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = Kodi.app; path = .app; sourceTree = BUILT_PRODUCTS_DIR; }; E499108B174D0D2600741B6D /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; E499108D174D0D2600741B6D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; E499108F174D0D2600741B6D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; @@ -4615,6 +5542,7 @@ F52CC6A81713BD2B00113454 /* DirectoryNodeGrouped.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DirectoryNodeGrouped.cpp; sourceTree = ""; }; F52CC6A91713BD2B00113454 /* DirectoryNodeGrouped.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectoryNodeGrouped.h; sourceTree = ""; }; F5364D33155B3B270016D00B /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = /System/Library/Frameworks/CoreVideo.framework; sourceTree = ""; }; + F5364D54155B3C7B0016D00B /* libm.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libm.dylib; path = /usr/lib/libm.dylib; sourceTree = ""; }; F5364E04155B3CAF0016D00B /* IOSurface.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOSurface.framework; path = /System/Library/Frameworks/IOSurface.framework; sourceTree = ""; }; F548786B0FE060FF00E506FD /* DVDSubtitleParserMPL2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDSubtitleParserMPL2.h; sourceTree = ""; }; F548786C0FE060FF00E506FD /* DVDSubtitleParserMPL2.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; path = DVDSubtitleParserMPL2.cpp; sourceTree = ""; }; @@ -4622,6 +5550,22 @@ F5487B4B0FE6F02700E506FD /* StreamDetails.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StreamDetails.cpp; sourceTree = ""; }; F54BCC5D1439345300F86B0F /* HotKeyController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HotKeyController.h; sourceTree = ""; }; F54BCC5E1439345300F86B0F /* HotKeyController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HotKeyController.m; sourceTree = ""; }; + F54C51D00F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogKaraokeSongSelector.cpp; sourceTree = ""; }; + F54C51D10F1E783200D46E3C /* GUIDialogKaraokeSongSelector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogKaraokeSongSelector.h; sourceTree = ""; }; + F54C51D30F1E784800D46E3C /* karaokelyricscdg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricscdg.h; sourceTree = ""; }; + F54C51D40F1E784800D46E3C /* karaokelyricscdg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricscdg.cpp; sourceTree = ""; }; + F54C51D60F1E785700D46E3C /* karaokelyrics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyrics.cpp; sourceTree = ""; }; + F54C51D70F1E785700D46E3C /* karaokelyrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyrics.h; sourceTree = ""; }; + F54C51DB0F1E787700D46E3C /* karaokelyricsmanager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricsmanager.h; sourceTree = ""; }; + F54C51DC0F1E787700D46E3C /* karaokelyricsfactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricsfactory.h; sourceTree = ""; }; + F54C51DD0F1E787700D46E3C /* karaokelyricstext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricstext.h; sourceTree = ""; }; + F54C51DE0F1E787700D46E3C /* karaokelyricstextkar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricstextkar.cpp; sourceTree = ""; }; + F54C51DF0F1E787700D46E3C /* karaokelyricstextkar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricstextkar.h; sourceTree = ""; }; + F54C51E00F1E787700D46E3C /* karaokelyricstextlrc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricstextlrc.h; sourceTree = ""; }; + F54C51E10F1E787700D46E3C /* karaokelyricsmanager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricsmanager.cpp; sourceTree = ""; }; + F54C51E20F1E787700D46E3C /* karaokelyricsfactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricsfactory.cpp; sourceTree = ""; }; + F54C51E30F1E787700D46E3C /* karaokelyricstextlrc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricstextlrc.cpp; sourceTree = ""; }; + F54C51E40F1E787700D46E3C /* karaokelyricstext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricstext.cpp; sourceTree = ""; }; F558F25413ABCF7800631E12 /* WinEventsOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WinEventsOSX.h; sourceTree = ""; }; F558F25513ABCF7800631E12 /* WinEventsOSX.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WinEventsOSX.mm; sourceTree = ""; }; F558F27813ABD56600631E12 /* DirtyRegion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirtyRegion.h; sourceTree = ""; }; @@ -4651,6 +5595,10 @@ F56353BE16E9BB3500D21BAD /* BitstreamConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitstreamConverter.h; sourceTree = ""; }; F56579AD13060D1E0085ED7F /* RenderCapture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderCapture.cpp; sourceTree = ""; }; F56579AE13060D1E0085ED7F /* RenderCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderCapture.h; sourceTree = ""; }; + F56A08490F4A18FB003F9F87 /* karaokewindowbackground.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokewindowbackground.h; sourceTree = ""; }; + F56A084A0F4A18FB003F9F87 /* karaokewindowbackground.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokewindowbackground.cpp; sourceTree = ""; }; + F56C8CE6131F5DC6000AD0F6 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + F56C8CF2131F5DFD000AD0F6 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; F57A1D1C1329B15300498CC7 /* AutoPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutoPool.h; sourceTree = ""; }; F57A1D1D1329B15300498CC7 /* AutoPool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AutoPool.mm; sourceTree = ""; }; F57B6F7E1071B8B500079ACB /* JobManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JobManager.cpp; sourceTree = ""; }; @@ -4689,6 +5637,8 @@ F5AACA670FB3DE2D00DBB77C /* GUIDialogSelect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogSelect.cpp; sourceTree = ""; }; F5AACA950FB3E2B800DBB77C /* GUIDialogSlider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogSlider.cpp; sourceTree = ""; }; F5AACA960FB3E2B800DBB77C /* GUIDialogSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogSlider.h; sourceTree = ""; }; + F5AD1EA60F488A1A0065EB5D /* GUIWindowKaraokeLyrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowKaraokeLyrics.h; sourceTree = ""; }; + F5AD1EA70F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowKaraokeLyrics.cpp; sourceTree = ""; }; F5AE408013415D9E0004BD79 /* AudioLibrary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioLibrary.cpp; sourceTree = ""; }; F5AE408113415D9E0004BD79 /* AudioLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioLibrary.h; sourceTree = ""; }; F5AE408613415D9E0004BD79 /* FileItemHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileItemHandler.cpp; sourceTree = ""; }; @@ -4719,6 +5669,8 @@ F5BDB80B120202F400F0B710 /* DVDSubtitleTagSami.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDSubtitleTagSami.cpp; sourceTree = ""; }; F5BDB8181202032400F0B710 /* DVDSubtitleTagMicroDVD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDSubtitleTagMicroDVD.h; sourceTree = ""; }; F5BDB8191202032400F0B710 /* DVDSubtitleTagMicroDVD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDSubtitleTagMicroDVD.cpp; sourceTree = ""; }; + F5BDB81E120203C200F0B710 /* AutoPtrHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutoPtrHandle.h; sourceTree = ""; }; + F5BDB81F120203C200F0B710 /* AutoPtrHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AutoPtrHandle.cpp; sourceTree = ""; }; F5CC22891814F7E9006B5E91 /* AESinkDARWINOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AESinkDARWINOSX.cpp; path = Sinks/AESinkDARWINOSX.cpp; sourceTree = ""; }; F5CC228A1814F7E9006B5E91 /* AESinkDARWINOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AESinkDARWINOSX.h; path = Sinks/AESinkDARWINOSX.h; sourceTree = ""; }; F5CC228C1814F7F7006B5E91 /* AESinkDARWINIOS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AESinkDARWINIOS.cpp; path = Sinks/AESinkDARWINIOS.cpp; sourceTree = ""; }; @@ -4772,6 +5724,8 @@ F5E10529140AA38000175026 /* PeripheralNyxboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PeripheralNyxboard.h; sourceTree = ""; }; F5E1052A140AA38000175026 /* PeripheralTuner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PeripheralTuner.cpp; sourceTree = ""; }; F5E1052B140AA38000175026 /* PeripheralTuner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PeripheralTuner.h; sourceTree = ""; }; + F5E1052D140AA38000175026 /* GUIDialogPeripheralManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogPeripheralManager.cpp; sourceTree = ""; }; + F5E1052E140AA38000175026 /* GUIDialogPeripheralManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogPeripheralManager.h; sourceTree = ""; }; F5E1052F140AA38000175026 /* GUIDialogPeripheralSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogPeripheralSettings.cpp; sourceTree = ""; }; F5E10530140AA38000175026 /* GUIDialogPeripheralSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogPeripheralSettings.h; sourceTree = ""; }; F5E10533140AA38000175026 /* Peripherals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Peripherals.cpp; sourceTree = ""; }; @@ -4817,6 +5771,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 18404DA61396C31B00863BBA /* SlingboxLib.a in Frameworks */, + F56C8CE7131F5DC6000AD0F6 /* libz.dylib in Frameworks */, + F5364D55155B3C7B0016D00B /* libm.dylib in Frameworks */, + F56C8CF3131F5DFD000AD0F6 /* libiconv.dylib in Frameworks */, F5ED9BFB155EC77400842059 /* ApplicationServices.framework in Frameworks */, E38E23930D2626E600618676 /* AudioUnit.framework in Frameworks */, E38E23920D2626E600618676 /* AudioToolbox.framework in Frameworks */, @@ -4835,6 +5793,27 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + DFFC52C817527B3100C937AB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DFF0EB54175280D1002DA3A4 /* libz.dylib in Frameworks */, + DFF0EB55175280E5002DA3A4 /* libiconv.dylib in Frameworks */, + DFF0EBB3175281CE002DA3A4 /* AudioToolbox.framework in Frameworks */, + DFF0EBB4175281D6002DA3A4 /* CFNetwork.framework in Frameworks */, + DFF0EBB6175281E0002DA3A4 /* CoreAudio.framework in Frameworks */, + DFF0EBB8175281E7002DA3A4 /* CoreMedia.framework in Frameworks */, + DFF0EBB9175281ED002DA3A4 /* CoreVideo.framework in Frameworks */, + DFF0EBBA175281F3002DA3A4 /* ImageIO.framework in Frameworks */, + DFF0EBBB175281FB002DA3A4 /* OpenGLES.framework in Frameworks */, + DFF0EBBC17528200002DA3A4 /* QuartzCore.framework in Frameworks */, + DFF0EBC41752820F002DA3A4 /* CoreGraphics.framework in Frameworks */, + DFF0EC531752821B002DA3A4 /* Foundation.framework in Frameworks */, + DFF0EC891752822E002DA3A4 /* UIKit.framework in Frameworks */, + DFF0ECA7175282AD002DA3A4 /* SlingboxLib.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; E4991086174D0D2600741B6D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -4851,7 +5830,11 @@ E499108C174D0D2600741B6D /* UIKit.framework in Frameworks */, E499108E174D0D2600741B6D /* Foundation.framework in Frameworks */, E4991090174D0D2600741B6D /* CoreGraphics.framework in Frameworks */, + E49910F8174E561500741B6D /* libz.dylib in Frameworks */, + E49910F9174E561D00741B6D /* libiconv.dylib in Frameworks */, + E4991581174E681600741B6D /* SlingboxLib.a in Frameworks */, DFF0EBB7175281E1002DA3A4 /* CoreAudio.framework in Frameworks */, + DFF0EC8C17528283002DA3A4 /* VideoToolbox.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4862,9 +5845,11 @@ isa = PBXGroup; children = ( 08FB7795FE84155DC02AAC07 /* Source */, + F57E1ED20E36E8FD00700C9D /* internal libs */, 08FB779DFE84155DC02AAC07 /* System Libs and Frameworks */, E49910C2174E2CDE00741B6D /* Configurations */, E47252BE175115F9001C1AAA /* Support */, + E499108A174D0D2600741B6D /* Frameworks */, 19C28FBDFE9D53C911CA2CBB /* Products */, ); indentWidth = 2; @@ -4886,8 +5871,12 @@ 08FB779DFE84155DC02AAC07 /* System Libs and Frameworks */ = { isa = PBXGroup; children = ( + DFF0EB7E17528112002DA3A4 /* ATV2 */, E49910F6174E55D400741B6D /* iOS */, E49910F7174E55E100741B6D /* OSX */, + F56C8CE6131F5DC6000AD0F6 /* libz.dylib */, + F5364D54155B3C7B0016D00B /* libm.dylib */, + F56C8CF2131F5DFD000AD0F6 /* libiconv.dylib */, ); name = "System Libs and Frameworks"; sourceTree = ""; @@ -4895,11 +5884,6 @@ 18B49FF01152BEEB001AF8A6 /* addons */ = { isa = PBXGroup; children = ( - 2A1A5A571BDEAA6D0084702D /* include */, - 7C226E3C1BA5F61C00185CE0 /* AddonCallbacksAudioEngine.cpp */, - 7C226E3D1BA5F61C00185CE0 /* AddonCallbacksAudioEngine.h */, - 7C973CE31B50378E0002A874 /* AddonCallbacksAudioDSP.cpp */, - 7C973CE41B50378E0002A874 /* AddonCallbacksAudioDSP.h */, 18B49FF11152BFA5001AF8A6 /* Addon.cpp */, 18B49FF21152BFA5001AF8A6 /* Addon.h */, C8482911156CFFE7005A996F /* AddonCallbacks.cpp */, @@ -4927,8 +5911,8 @@ 395C2A231AA4C32100EBC7AD /* AudioDecoder.h */, 7CF34D9D1930264A00D543C5 /* AudioEncoder.cpp */, 7CF34D9E1930264A00D543C5 /* AudioEncoder.h */, - DF54F8011B6580C8000FCBA4 /* ContextMenuAddon.cpp */, - DF54F8021B6580C8000FCBA4 /* ContextMenuAddon.h */, + 395C2A1D1A9F96A700EBC7AD /* ContextItemAddon.cpp */, + 395C2A1E1A9F96A700EBC7AD /* ContextItemAddon.h */, 18B49FF61152BFA5001AF8A6 /* DllAddon.h */, 18B7C38612942090009E7A26 /* GUIDialogAddonInfo.cpp */, 18B7C38712942090009E7A26 /* GUIDialogAddonInfo.h */, @@ -4939,16 +5923,12 @@ 18B7C97A12943809009E7A26 /* GUIWindowAddonBrowser.cpp */, 18B7C97B1294380A009E7A26 /* GUIWindowAddonBrowser.h */, 18B49FFB1152BFA5001AF8A6 /* IAddon.h */, - DF2401241B41A26E001E02DA /* ImageResource.cpp */, - DF2401251B41A26E001E02DA /* ImageResource.h */, 395C2A071A9F06EB00EBC7AD /* LanguageResource.cpp */, 395C2A081A9F06EB00EBC7AD /* LanguageResource.h */, 183FDF8811AF0B0500B81E9C /* PluginSource.cpp */, 183FDF8911AF0B0500B81E9C /* PluginSource.h */, C85EB75A1174614E0008E5A5 /* Repository.cpp */, C85EB75B1174614E0008E5A5 /* Repository.h */, - 39B4F36E1B96F845009B2D88 /* RepositoryUpdater.cpp */, - 39B4F36F1B96F845009B2D88 /* RepositoryUpdater.h */, 395C2A0C1A9F06F500EBC7AD /* Resource.h */, 18B49FFC1152BFA5001AF8A6 /* Scraper.cpp */, 18B49FFD1152BFA5001AF8A6 /* Scraper.h */, @@ -4971,7 +5951,8 @@ 18B7C3AA1294219F009E7A26 /* guilib */ = { isa = PBXGroup; children = ( - 391416BE1B4A3EFA00BBF0AA /* guiinfo */, + 18B7C7541294222E009E7A26 /* AnimatedGif.cpp */, + 18B7C6F61294222D009E7A26 /* AnimatedGif.h */, DF404A3416B9896C00D8023E /* cximage.cpp */, DF404A3516B9896C00D8023E /* cximage.h */, 18B7C7561294222E009E7A26 /* D3DResource.cpp */, @@ -4985,12 +5966,9 @@ F558F27A13ABD56600631E12 /* DirtyRegionSolvers.h */, F558F27D13ABD57400631E12 /* DirtyRegionTracker.cpp */, F558F27E13ABD57400631E12 /* DirtyRegionTracker.h */, - DF2863B419918B07008994AB /* DllLibGif.h */, 18B7C7591294222E009E7A26 /* FrameBufferObject.cpp */, 18B7C6FB1294222D009E7A26 /* FrameBufferObject.h */, 18B7C6FC1294222D009E7A26 /* Geometry.h */, - DF2863B519918B07008994AB /* Gif.cpp */, - DF2863B619918B07008994AB /* Gif.h */, 18B7C75A1294222E009E7A26 /* GraphicContext.cpp */, 18B7C6FD1294222D009E7A26 /* GraphicContext.h */, 18B7C6FE1294222D009E7A26 /* gui3d.h */, @@ -5171,6 +6149,7 @@ children = ( 431376A812D640B500680C15 /* dialogs */, 431376CC12D6421A00680C15 /* infoscanner */, + 431376D412D6427900680C15 /* karaoke */, 18B7C854129423A7009E7A26 /* tags */, 431376DC12D6430600680C15 /* windows */, E36C29DC0DA72429001F0C9D /* Album.cpp */, @@ -5199,8 +6178,6 @@ 18B7C854129423A7009E7A26 /* tags */ = { isa = PBXGroup; children = ( - 7C30182F1BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp */, - 7C3018301BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.h */, 18B7C85C129423A7009E7A26 /* ImusicInfoTagLoader.h */, 18B7C85E129423A7009E7A26 /* MusicInfoTag.cpp */, 18B7C85F129423A7009E7A26 /* MusicInfoTag.h */, @@ -5230,15 +6207,6 @@ 18B7C8CC12942546009E7A26 /* ButtonTranslator.h */, DFAB049613F8376700B70BFB /* InertialScrollingHandler.cpp */, DFAB049713F8376700B70BFB /* InertialScrollingHandler.h */, - B179BD641AD8EA7B00EA8D49 /* InputCodingTable.h */, - B179BD651AD8EA7B00EA8D49 /* InputCodingTableBaiduPY.cpp */, - B179BD661AD8EA7B00EA8D49 /* InputCodingTableBaiduPY.h */, - B179BD671AD8EA7B00EA8D49 /* InputCodingTableBasePY.cpp */, - B179BD681AD8EA7B00EA8D49 /* InputCodingTableBasePY.h */, - B179BD691AD8EA7B00EA8D49 /* InputCodingTableFactory.cpp */, - B179BD6A1AD8EA7B00EA8D49 /* InputCodingTableFactory.h */, - 39C38CC81BBFF1EE000F59F5 /* InputCodingTableKorean.cpp */, - 39C38CC91BBFF1EE000F59F5 /* InputCodingTableKorean.h */, DF14CF7C1A77782E00396CC9 /* InputManager.cpp */, DF14CF7D1A77782E00396CC9 /* InputManager.h */, 395C29BA1A94733100EBC7AD /* Key.cpp */, @@ -5297,6 +6265,7 @@ 8DD76F7E0486A8DE00D96B5E /* Kodi */, D6299ABB1AFC2A9F00E3059D /* Kodi.app */, E4991089174D0D2600741B6D /* Kodi.app */, + DFFC52CB17527B3100C937AB /* Kodi.frappliance */, ); name = Products; sourceTree = ""; @@ -5310,33 +6279,6 @@ path = virtual; sourceTree = ""; }; - 2A1A5A571BDEAA6D0084702D /* include */ = { - isa = PBXGroup; - children = ( - 2A1A5A581BDEAA6D0084702D /* kodi_adsp_dll.h */, - 2A1A5A591BDEAA6D0084702D /* kodi_adsp_types.h */, - 2A1A5A5A1BDEAA6D0084702D /* kodi_audiodec_dll.h */, - 2A1A5A5B1BDEAA6D0084702D /* kodi_audiodec_types.h */, - 2A1A5A5C1BDEAA6D0084702D /* kodi_audioengine_types.h */, - 2A1A5A5D1BDEAA6D0084702D /* NOTE */, - 2A1A5A5E1BDEAA6D0084702D /* xbmc_addon_cpp_dll.h */, - 2A1A5A5F1BDEAA6D0084702D /* xbmc_addon_dll.h */, - 2A1A5A601BDEAA6D0084702D /* xbmc_addon_types.h */, - 2A1A5A611BDEAA6D0084702D /* xbmc_audioenc_dll.h */, - 2A1A5A621BDEAA6D0084702D /* xbmc_audioenc_types.h */, - 2A1A5A631BDEAA6D0084702D /* xbmc_codec_types.h */, - 2A1A5A641BDEAA6D0084702D /* xbmc_epg_types.h */, - 2A1A5A651BDEAA6D0084702D /* xbmc_pvr_dll.h */, - 2A1A5A661BDEAA6D0084702D /* xbmc_pvr_types.h */, - 2A1A5A671BDEAA6D0084702D /* xbmc_scr_dll.h */, - 2A1A5A681BDEAA6D0084702D /* xbmc_scr_types.h */, - 2A1A5A691BDEAA6D0084702D /* xbmc_stream_utils.hpp */, - 2A1A5A6A1BDEAA6D0084702D /* xbmc_vis_dll.h */, - 2A1A5A6B1BDEAA6D0084702D /* xbmc_vis_types.h */, - ); - path = include; - sourceTree = ""; - }; 38F4E56013CCCB3B00664821 /* platform */ = { isa = PBXGroup; children = ( @@ -5360,16 +6302,6 @@ path = pthreads; sourceTree = ""; }; - 395938741AC310B00053A590 /* posix */ = { - isa = PBXGroup; - children = ( - 395938751AC310B00053A590 /* MessagePrinter.cpp */, - 395938761AC310B00053A590 /* MessagePrinter.h */, - ); - name = posix; - path = main/posix; - sourceTree = ""; - }; 395C29C81A98A11B00EBC7AD /* wsgi */ = { isa = PBXGroup; children = ( @@ -5408,23 +6340,12 @@ 399442661A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.h */, 399442671A8DD920006C39E9 /* VideoLibraryProgressJob.cpp */, 399442681A8DD920006C39E9 /* VideoLibraryProgressJob.h */, - 42E2E1C71B53F74D005C7E4E /* VideoLibraryRefreshingJob.cpp */, - 42E2E1C81B53F74D005C7E4E /* VideoLibraryRefreshingJob.h */, 399442691A8DD920006C39E9 /* VideoLibraryScanningJob.cpp */, 3994426A1A8DD920006C39E9 /* VideoLibraryScanningJob.h */, ); path = jobs; sourceTree = ""; }; - 39BD2AD51B845D1E004A5A15 /* helpers */ = { - isa = PBXGroup; - children = ( - 39BD2AD71B845D40004A5A15 /* DialogHelper.cpp */, - 39BD2AD61B845D40004A5A15 /* DialogHelper.h */, - ); - name = helpers; - sourceTree = ""; - }; 430C880812D649B10098821A /* powermanagement */ = { isa = PBXGroup; children = ( @@ -5466,8 +6387,6 @@ E38E1DDA0D25F9FD00618676 /* PictureInfoLoader.h */, E38E1DDB0D25F9FD00618676 /* PictureInfoTag.cpp */, E38E1DDC0D25F9FD00618676 /* PictureInfoTag.h */, - DFDE5D4F1AE5658200EE53AD /* PictureScalingAlgorithm.cpp */, - DFDE5D501AE5658200EE53AD /* PictureScalingAlgorithm.h */, E38E1DDD0D25F9FD00618676 /* PictureThumbLoader.cpp */, E38E1DDE0D25F9FD00618676 /* PictureThumbLoader.h */, E38E1E090D25F9FD00618676 /* SlideShowPicture.cpp */, @@ -5494,6 +6413,8 @@ E38E18100D25F9FA00618676 /* GUIDialogMusicInfo.h */, E38E17BA0D25F9FA00618676 /* GUIDialogMusicOSD.cpp */, E38E17BB0D25F9FA00618676 /* GUIDialogMusicOSD.h */, + E38E18130D25F9FA00618676 /* GUIDialogMusicOverlay.cpp */, + E38E18140D25F9FA00618676 /* GUIDialogMusicOverlay.h */, E38E17DA0D25F9FA00618676 /* GUIDialogSongInfo.cpp */, E38E17DB0D25F9FA00618676 /* GUIDialogSongInfo.h */, E38E17E60D25F9FA00618676 /* GUIDialogVisualisationPresetList.cpp */, @@ -5517,6 +6438,37 @@ path = infoscanner; sourceTree = ""; }; + 431376D412D6427900680C15 /* karaoke */ = { + isa = PBXGroup; + children = ( + F54C51D00F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp */, + F54C51D10F1E783200D46E3C /* GUIDialogKaraokeSongSelector.h */, + F5AD1EA70F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp */, + F5AD1EA60F488A1A0065EB5D /* GUIWindowKaraokeLyrics.h */, + F54C51D60F1E785700D46E3C /* karaokelyrics.cpp */, + F54C51D70F1E785700D46E3C /* karaokelyrics.h */, + F54C51D40F1E784800D46E3C /* karaokelyricscdg.cpp */, + F54C51D30F1E784800D46E3C /* karaokelyricscdg.h */, + F54C51E20F1E787700D46E3C /* karaokelyricsfactory.cpp */, + F54C51DC0F1E787700D46E3C /* karaokelyricsfactory.h */, + F54C51E10F1E787700D46E3C /* karaokelyricsmanager.cpp */, + F54C51DB0F1E787700D46E3C /* karaokelyricsmanager.h */, + F54C51E40F1E787700D46E3C /* karaokelyricstext.cpp */, + F54C51DD0F1E787700D46E3C /* karaokelyricstext.h */, + F54C51DE0F1E787700D46E3C /* karaokelyricstextkar.cpp */, + F54C51DF0F1E787700D46E3C /* karaokelyricstextkar.h */, + F54C51E30F1E787700D46E3C /* karaokelyricstextlrc.cpp */, + F54C51E00F1E787700D46E3C /* karaokelyricstextlrc.h */, + 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */, + 7CDAEA7C1001CD6E0040B25F /* karaokelyricstextustar.h */, + DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */, + DF07252D168734D7008DCAAD /* karaokevideobackground.h */, + F56A084A0F4A18FB003F9F87 /* karaokewindowbackground.cpp */, + F56A08490F4A18FB003F9F87 /* karaokewindowbackground.h */, + ); + path = karaoke; + sourceTree = ""; + }; 431376DC12D6430600680C15 /* windows */ = { isa = PBXGroup; children = ( @@ -5528,6 +6480,8 @@ E38E18160D25F9FA00618676 /* GUIWindowMusicPlaylist.h */, E38E18170D25F9FA00618676 /* GUIWindowMusicPlaylistEditor.cpp */, E38E18180D25F9FA00618676 /* GUIWindowMusicPlaylistEditor.h */, + E38E18190D25F9FA00618676 /* GUIWindowMusicSongs.cpp */, + E38E181A0D25F9FA00618676 /* GUIWindowMusicSongs.h */, E38E18470D25F9FA00618676 /* GUIWindowVisualisation.cpp */, E38E18480D25F9FA00618676 /* GUIWindowVisualisation.h */, ); @@ -5602,7 +6556,6 @@ 431376F212D6449100680C15 /* network */ = { isa = PBXGroup; children = ( - DF6F52AB1AF6D03F001BC57D /* dacp */, DFCA6AB8152245CD000BFAAE /* httprequesthandler */, 432D7CE112D86D4900CE4C49 /* linux */, 4313772312D646E300680C15 /* osx */, @@ -5689,7 +6642,6 @@ 4367217312D6640E002508E6 /* interfaces */ = { isa = PBXGroup; children = ( - 7C8E01F61BA35CBA0072E8B2 /* builtins */, DF40BC21178B4C07009DB567 /* generic */, 7C89674213C03B21003631FE /* info */, F5AE407F13415D9E0004BD79 /* json-rpc */, @@ -5697,6 +6649,8 @@ DF1ACFE815FCE53900E10810 /* python */, F5A7A700112893E50059D6AA /* AnnouncementManager.cpp */, F5A7A701112893E50059D6AA /* AnnouncementManager.h */, + 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */, + 7CCF7F1C1069F3AE00992676 /* Builtins.h */, 42DAC16B1A6E780C0066B4C8 /* IActionListener.h */, 436721A612D66A09002508E6 /* IAnnouncer.h */, ); @@ -5746,6 +6700,8 @@ E38E1E360D25F9FD00618676 /* Event.h */, 38F4E55E13CCCB3B00664821 /* Helpers.h */, 38F4E55F13CCCB3B00664821 /* Lockables.h */, + 83A72B950FBC8E3B00171871 /* LockFree.cpp */, + 83A72B960FBC8E3B00171871 /* LockFree.h */, E38E1E7A0D25F9FD00618676 /* SharedSection.h */, E38E1E7C0D25F9FD00618676 /* SingleLock.h */, 3802709813D5A653009493DD /* SystemClock.cpp */, @@ -5830,6 +6786,8 @@ children = ( 18B7C8FE12942761009E7A26 /* GUIDialogAudioSubtitleSettings.cpp */, 18B7C8FF12942761009E7A26 /* GUIDialogAudioSubtitleSettings.h */, + E38E17AA0D25F9FA00618676 /* GUIDialogFileStacking.cpp */, + E38E17AB0D25F9FA00618676 /* GUIDialogFileStacking.h */, 886328150E07B37200BB3DAB /* GUIDialogFullScreenInfo.cpp */, 886328160E07B37200BB3DAB /* GUIDialogFullScreenInfo.h */, 7C4E6F701829AA9700F1068F /* GUIDialogSubtitles.cpp */, @@ -5842,6 +6800,8 @@ E38E18400D25F9FA00618676 /* GUIDialogVideoInfo.h */, E38E181D0D25F9FA00618676 /* GUIDialogVideoOSD.cpp */, E38E181E0D25F9FA00618676 /* GUIDialogVideoOSD.h */, + E38E18430D25F9FA00618676 /* GUIDialogVideoOverlay.cpp */, + E38E18440D25F9FA00618676 /* GUIDialogVideoOverlay.h */, 18B7C90B129427A6009E7A26 /* GUIDialogVideoSettings.cpp */, 18B7C90C129427A6009E7A26 /* GUIDialogVideoSettings.h */, ); @@ -5920,7 +6880,6 @@ isa = PBXGroup; children = ( DFB15B1F15F8FB8100CDF0DE /* osx */, - 395938741AC310B00053A590 /* posix */, 552A226815F7E14B0015C0D0 /* main.cpp */, ); name = main; @@ -6014,65 +6973,6 @@ name = osx; sourceTree = ""; }; - 7C8E01F61BA35CBA0072E8B2 /* builtins */ = { - isa = PBXGroup; - children = ( - 7C8E01F71BA35D0B0072E8B2 /* AddonBuiltins.cpp */, - 7C8E01F81BA35D0B0072E8B2 /* AddonBuiltins.h */, - 7C8E01F91BA35D0B0072E8B2 /* AndroidBuiltins.cpp */, - 7C8E01FA1BA35D0B0072E8B2 /* AndroidBuiltins.h */, - 7C8E01FB1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp */, - 7C8E01FC1BA35D0B0072E8B2 /* ApplicationBuiltins.h */, - 7C8E01FD1BA35D0B0072E8B2 /* Builtins.cpp */, - 7C8E01FE1BA35D0B0072E8B2 /* Builtins.h */, - 7C8E01FF1BA35D0B0072E8B2 /* CECBuiltins.cpp */, - 7C8E02001BA35D0B0072E8B2 /* CECBuiltins.h */, - 7C8E02011BA35D0B0072E8B2 /* GUIBuiltins.cpp */, - 7C8E02021BA35D0B0072E8B2 /* GUIBuiltins.h */, - 7C8E02031BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp */, - 7C8E02041BA35D0B0072E8B2 /* GUIContainerBuiltins.h */, - 7C8E02051BA35D0B0072E8B2 /* GUIControlBuiltins.cpp */, - 7C8E02061BA35D0B0072E8B2 /* GUIControlBuiltins.h */, - 7C8E02071BA35D0B0072E8B2 /* LibraryBuiltins.cpp */, - 7C8E02081BA35D0B0072E8B2 /* LibraryBuiltins.h */, - 7C8E02091BA35D0B0072E8B2 /* OpticalBuiltins.cpp */, - 7C8E020A1BA35D0B0072E8B2 /* OpticalBuiltins.h */, - 7C8E020B1BA35D0B0072E8B2 /* PictureBuiltins.cpp */, - 7C8E020C1BA35D0B0072E8B2 /* PictureBuiltins.h */, - 7C8E020D1BA35D0B0072E8B2 /* PlayerBuiltins.cpp */, - 7C8E020E1BA35D0B0072E8B2 /* PlayerBuiltins.h */, - 7C8E020F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp */, - 7C8E02101BA35D0B0072E8B2 /* ProfileBuiltins.h */, - 7C8E02111BA35D0B0072E8B2 /* PVRBuiltins.cpp */, - 7C8E02121BA35D0B0072E8B2 /* PVRBuiltins.h */, - 7C8E02131BA35D0B0072E8B2 /* SkinBuiltins.cpp */, - 7C8E02141BA35D0B0072E8B2 /* SkinBuiltins.h */, - 7C8E02151BA35D0B0072E8B2 /* SystemBuiltins.cpp */, - 7C8E02161BA35D0B0072E8B2 /* SystemBuiltins.h */, - 7C8E02171BA35D0B0072E8B2 /* WeatherBuiltins.cpp */, - 7C8E02181BA35D0B0072E8B2 /* WeatherBuiltins.h */, - ); - name = builtins; - sourceTree = ""; - }; - 7C973CE61B5037B80002A874 /* DSPAddons */ = { - isa = PBXGroup; - children = ( - 7C973CE71B5037EF0002A874 /* ActiveAEDSP.cpp */, - 7C973CE81B5037EF0002A874 /* ActiveAEDSP.h */, - 7C973CE91B5037EF0002A874 /* ActiveAEDSPAddon.cpp */, - 7C973CEA1B5037EF0002A874 /* ActiveAEDSPAddon.h */, - 7C973CEB1B5037EF0002A874 /* ActiveAEDSPDatabase.cpp */, - 7C973CEC1B5037EF0002A874 /* ActiveAEDSPDatabase.h */, - 7C973CED1B5037EF0002A874 /* ActiveAEDSPMode.cpp */, - 7C973CEE1B5037EF0002A874 /* ActiveAEDSPMode.h */, - 7C973CEF1B5037EF0002A874 /* ActiveAEDSPProcess.cpp */, - 7C973CF01B5037EF0002A874 /* ActiveAEDSPProcess.h */, - ); - name = DSPAddons; - path = Engines; - sourceTree = ""; - }; 7CAA468D19427AED00008885 /* posix */ = { isa = PBXGroup; children = ( @@ -6617,8 +7517,6 @@ C848289E156CFCD8005A996F /* PVRGUIInfo.h */, C848289F156CFCD8005A996F /* PVRManager.cpp */, C84828A0156CFCD8005A996F /* PVRManager.h */, - 2A7B2BDB1BD6F16600044BCD /* PVRSettings.cpp */, - 2A7B2BDE1BD6F18B00044BCD /* PVRSettings.h */, ); path = pvr; sourceTree = ""; @@ -6647,8 +7545,6 @@ C8482881156CFCD8005A996F /* PVRChannelGroups.h */, C8482882156CFCD8005A996F /* PVRChannelGroupsContainer.cpp */, C8482883156CFCD8005A996F /* PVRChannelGroupsContainer.h */, - DF0E4ACD1AD5984600A75430 /* PVRRadioRDSInfoTag.cpp */, - DF0E4ACE1AD5984600A75430 /* PVRRadioRDSInfoTag.h */, ); path = channels; sourceTree = ""; @@ -6668,8 +7564,6 @@ C8482892156CFCD8005A996F /* GUIDialogPVRGuideOSD.h */, C8482893156CFCD8005A996F /* GUIDialogPVRGuideSearch.cpp */, C8482894156CFCD8005A996F /* GUIDialogPVRGuideSearch.h */, - DF0E4AD21AD5986F00A75430 /* GUIDialogPVRRadioRDSInfo.cpp */, - DF0E4AD31AD5986F00A75430 /* GUIDialogPVRRadioRDSInfo.h */, C8482895156CFCD8005A996F /* GUIDialogPVRRecordingInfo.cpp */, C8482896156CFCD8005A996F /* GUIDialogPVRRecordingInfo.h */, C8482897156CFCD8005A996F /* GUIDialogPVRTimerSettings.cpp */, @@ -6696,8 +7590,6 @@ C84828AA156CFCD8005A996F /* PVRTimerInfoTag.h */, C84828AB156CFCD8005A996F /* PVRTimers.cpp */, C84828AC156CFCD8005A996F /* PVRTimers.h */, - DF5E69981B28121E009A88C3 /* PVRTimerType.cpp */, - DF5E69991B28121E009A88C3 /* PVRTimerType.h */, ); path = timers; sourceTree = ""; @@ -6809,8 +7701,6 @@ DF1AD1A215FCE77900E10810 /* File.h */, DF1AD1A515FCE77900E10810 /* InfoTagMusic.cpp */, DF1AD1A615FCE77900E10810 /* InfoTagMusic.h */, - DF0E4AC81AD5982500A75430 /* InfoTagRadioRDS.cpp */, - DF0E4AC91AD5982500A75430 /* InfoTagRadioRDS.h */, DF1AD1A915FCE77900E10810 /* InfoTagVideo.cpp */, DF1AD1AA15FCE77900E10810 /* InfoTagVideo.h */, DF1AD1AD15FCE77900E10810 /* Keyboard.cpp */, @@ -6904,38 +7794,6 @@ path = windows; sourceTree = ""; }; - DF29BCD41B5D911700904347 /* events */ = { - isa = PBXGroup; - children = ( - DF29BCE31B5D911700904347 /* windows */, - DF29BCD51B5D911700904347 /* AddonEvent.cpp */, - DF29BCD61B5D911700904347 /* AddonEvent.h */, - DF29BCD71B5D911700904347 /* AddonManagementEvent.cpp */, - DF29BCD81B5D911700904347 /* AddonManagementEvent.h */, - DF29BCD91B5D911700904347 /* BaseEvent.cpp */, - DF29BCDA1B5D911700904347 /* BaseEvent.h */, - DF29BCDB1B5D911700904347 /* EventLog.cpp */, - DF29BCDC1B5D911700904347 /* EventLog.h */, - DF29BCDD1B5D911700904347 /* IEvent.h */, - DF29BCDF1B5D911700904347 /* MediaLibraryEvent.cpp */, - DF29BCE01B5D911700904347 /* MediaLibraryEvent.h */, - DF29BCE11B5D911700904347 /* NotificationEvent.h */, - DF29BCE21B5D911700904347 /* UniqueEvent.h */, - ); - path = events; - sourceTree = ""; - }; - DF29BCE31B5D911700904347 /* windows */ = { - isa = PBXGroup; - children = ( - DF29BCE41B5D911700904347 /* GUIViewStateEventLog.cpp */, - DF29BCE51B5D911700904347 /* GUIViewStateEventLog.h */, - DF29BCE61B5D911700904347 /* GUIWindowEventLog.cpp */, - DF29BCE71B5D911700904347 /* GUIWindowEventLog.h */, - ); - path = windows; - sourceTree = ""; - }; DF40BC21178B4C07009DB567 /* generic */ = { isa = PBXGroup; children = ( @@ -6950,18 +7808,6 @@ path = generic; sourceTree = ""; }; - DF4A3BAC1B4B0FC100F9CDC0 /* messaging */ = { - isa = PBXGroup; - children = ( - 39BD2AD51B845D1E004A5A15 /* helpers */, - DF4A3BAD1B4B0FC100F9CDC0 /* ApplicationMessenger.cpp */, - DF4A3BAE1B4B0FC100F9CDC0 /* ApplicationMessenger.h */, - DF4A3BAF1B4B0FC100F9CDC0 /* IMessageTarget.h */, - DF4A3BB11B4B0FC100F9CDC0 /* ThreadMessage.h */, - ); - path = messaging; - sourceTree = ""; - }; DF4BF0101A4EF30F0053AC56 /* contrib */ = { isa = PBXGroup; children = ( @@ -7004,15 +7850,6 @@ path = view; sourceTree = ""; }; - DF6F52AB1AF6D03F001BC57D /* dacp */ = { - isa = PBXGroup; - children = ( - DF6F52AC1AF6D03F001BC57D /* dacp.cpp */, - DF6F52AD1AF6D03F001BC57D /* dacp.h */, - ); - path = dacp; - sourceTree = ""; - }; DFA0E8C619FD6BFC00269A92 /* videosync */ = { isa = PBXGroup; children = ( @@ -7038,7 +7875,6 @@ DFB65F6315373AE7006B8FF1 /* AudioEngine */ = { isa = PBXGroup; children = ( - 7C973CE61B5037B80002A874 /* DSPAddons */, DFB65F6915373AE7006B8FF1 /* Encoders */, DFB65F6C15373AE7006B8FF1 /* Engines */, DFB65F8815373AE7006B8FF1 /* Interfaces */, @@ -7155,9 +7991,39 @@ path = httprequesthandler; sourceTree = ""; }; + DFF0EB7E17528112002DA3A4 /* ATV2 */ = { + isa = PBXGroup; + children = ( + DFF0EB8717528174002DA3A4 /* CoreGraphics.framework */, + DFF0EB8D17528174002DA3A4 /* Foundation.framework */, + DFF0EB9517528174002DA3A4 /* UIKit.framework */, + DFF0EC8B17528283002DA3A4 /* VideoToolbox.framework */, + ); + name = ATV2; + sourceTree = ""; + }; + DFF0F48F1752838E002DA3A4 /* atv2 */ = { + isa = PBXGroup; + children = ( + DFF0F4901752838E002DA3A4 /* InfoPlist.strings */, + DFC8B7CD199C2B3A00424777 /* KodiAppliance.h */, + DFC8B7CE199C2B3A00424777 /* KodiAppliance.mm */, + DF3E5EF8199D41300039675D /* kodiclient.h */, + DF3E5EF5199D400B0039675D /* kodiclientwrapper.h */, + DF3E5EF9199D41300039675D /* kodiclientwrapper.mm */, + DF3E5EFB199D4B340039675D /* KodiController.h */, + DF3E5EFC199D4B340039675D /* KodiController.mm */, + DFF0F4921752838E002DA3A4 /* substrate.h */, + DFF0F4961752838E002DA3A4 /* XBMCATV2-Info.plist */, + DFF0F49C1752838E002DA3A4 /* XBMCDebugHelpers.h */, + ); + path = atv2; + sourceTree = ""; + }; DFFA43CE19104BFA00C3923B /* media */ = { isa = PBXGroup; children = ( + DFFA43CF19104BFA00C3923B /* atv2 */, DFFA43D219104BFA00C3923B /* ios */, DFFA43F319104BFA00C3923B /* osx */, ); @@ -7165,6 +8031,15 @@ path = tools/darwin/packaging/media; sourceTree = ""; }; + DFFA43CF19104BFA00C3923B /* atv2 */ = { + isa = PBXGroup; + children = ( + DFC8B7CC199C1EC100424777 /* TopShelf.png */, + DFFA43D019104BFA00C3923B /* AppIcon.png */, + ); + path = atv2; + sourceTree = ""; + }; DFFA43D219104BFA00C3923B /* ios */ = { isa = PBXGroup; children = ( @@ -7246,6 +8121,7 @@ E37D5CB40D3023BB0081D327 /* osx */ = { isa = PBXGroup; children = ( + DFF0F48F1752838E002DA3A4 /* atv2 */, E49910DF174E4A6D00741B6D /* iOS-Shared */, E49910A6174D0E2A00741B6D /* iOS */, F57A1D1C1329B15300498CC7 /* AutoPool.h */, @@ -7279,7 +8155,6 @@ E38E149A0D25F9F900618676 /* cores */, 4313773012D647BB00680C15 /* dbwrappers */, C84828E7156CFD5E005A996F /* epg */, - DF29BCD41B5D911700904347 /* events */, 431376E912D6439900680C15 /* dialogs */, E38E16940D25F9FA00618676 /* filesystem */, 18B7C3AA1294219F009E7A26 /* guilib */, @@ -7289,7 +8164,6 @@ 7C430161175C41FE009B82E5 /* listproviders */, 552A226615F7E11B0015C0D0 /* main */, 7CF0504F191195DA00222135 /* media */, - DF4A3BAC1B4B0FC100F9CDC0 /* messaging */, 18B7C853129423A7009E7A26 /* music */, 431376F212D6449100680C15 /* network */, E37D5CB40D3023BB0081D327 /* osx */, @@ -7312,6 +8186,8 @@ 43D82FF512D64C8600B38489 /* windows */, E38E14640D25F9F900618676 /* Application.cpp */, E38E14650D25F9F900618676 /* Application.h */, + E38E14660D25F9F900618676 /* ApplicationMessenger.cpp */, + E38E14670D25F9F900618676 /* ApplicationMessenger.h */, F59EED7C17AD5174005BB7C6 /* ApplicationPlayer.cpp */, F59EED7D17AD5174005BB7C6 /* ApplicationPlayer.h */, F56352C616E5436900D21BAD /* AppParamParser.cpp */, @@ -7323,8 +8199,6 @@ E38E14720D25F9F900618676 /* BackgroundInfoLoader.cpp */, E38E14730D25F9F900618676 /* BackgroundInfoLoader.h */, F5B413131065900C0035D105 /* config.h */, - DF54F7FC1B6580AC000FCBA4 /* ContextMenuItem.cpp */, - DF54F7FD1B6580AC000FCBA4 /* ContextMenuItem.h */, 395C29F91A9CD20C00EBC7AD /* ContextMenuManager.cpp */, 395C29FA1A9CD20C00EBC7AD /* ContextMenuManager.h */, E38E167E0D25F9FA00618676 /* CueDocument.cpp */, @@ -7512,8 +8386,6 @@ E38E15850D25F9FA00618676 /* DVDPlayer.h */, E38E15860D25F9FA00618676 /* DVDPlayerAudio.cpp */, E38E15870D25F9FA00618676 /* DVDPlayerAudio.h */, - DF0E4AC31AD597ED00A75430 /* DVDPlayerRadioRDS.cpp */, - DF0E4AC41AD597ED00A75430 /* DVDPlayerRadioRDS.h */, E38E15880D25F9FA00618676 /* DVDPlayerSubtitle.cpp */, E38E15890D25F9FA00618676 /* DVDPlayerSubtitle.h */, F5E55B5B10741272006E788A /* DVDPlayerTeletext.cpp */, @@ -7586,7 +8458,6 @@ children = ( E38E15430D25F9F900618676 /* libmpeg2 */, E38E153B0D25F9F900618676 /* DllLibMpeg2.h */, - DFBD336A1BD531CB001A8FEE /* DllVideoToolBox.h */, F597B05A18A804E0005AADAE /* DVDVideoCodec.cpp */, E38E153C0D25F9F900618676 /* DVDVideoCodec.h */, E38E153D0D25F9F900618676 /* DVDVideoCodecFFmpeg.cpp */, @@ -7664,6 +8535,8 @@ C848290F156CFFA0005A996F /* DVDInputStreamPVRManager.h */, 815EE6330E17F1DC009FBE3C /* DVDInputStreamRTMP.cpp */, 815EE6340E17F1DC009FBE3C /* DVDInputStreamRTMP.h */, + E33979940D62FD47004ECDDA /* DVDInputStreamTV.cpp */, + E33979950D62FD47004ECDDA /* DVDInputStreamTV.h */, E38E15740D25F9FA00618676 /* DVDStateSerializer.cpp */, E38E15750D25F9FA00618676 /* DVDStateSerializer.h */, ); @@ -7785,9 +8658,6 @@ E38E16940D25F9FA00618676 /* filesystem */ = { isa = PBXGroup; children = ( - E38E170A0D25F9FA00618676 /* MusicDatabaseDirectory */, - 7CAA468D19427AED00008885 /* posix */, - E38E175F0D25F9FA00618676 /* VideoDatabaseDirectory */, F5A7B42B113CBB950059D6AA /* AddonsDirectory.cpp */, F5A7B42A113CBB950059D6AA /* AddonsDirectory.h */, F5ED8D6A1551F91400842059 /* BlurayDirectory.cpp */, @@ -7810,7 +8680,6 @@ 7C45DBE810F325C400D4BBF3 /* DAVDirectory.h */, DFD5812316C828500008EEA0 /* DAVFile.cpp */, DFD5812416C828500008EEA0 /* DAVFile.h */, - DF1D2DE61B6E85EE002BB9DB /* Directorization.h */, E38E16AC0D25F9FA00618676 /* Directory.cpp */, E38E16AD0D25F9FA00618676 /* Directory.h */, DF93D6651444A8B0007C6459 /* DirectoryCache.cpp */, @@ -7821,8 +8690,6 @@ E38E16B10D25F9FA00618676 /* DirectoryHistory.h */, E38E16B40D25F9FA00618676 /* DllLibCurl.cpp */, E38E16B50D25F9FA00618676 /* DllLibCurl.h */, - DF29BD001B5D913B00904347 /* EventsDirectory.cpp */, - DF29BD011B5D913B00904347 /* EventsDirectory.h */, 0E3036EA1760F68A00D93596 /* FavouritesDirectory.cpp */, 0E3036EB1760F68A00D93596 /* FavouritesDirectory.h */, E38E16BA0D25F9FA00618676 /* File.cpp */, @@ -7839,6 +8706,10 @@ E38E16E50D25F9FA00618676 /* FTPDirectory.h */, E38E16E60D25F9FA00618676 /* FTPParse.cpp */, E38E16E70D25F9FA00618676 /* FTPParse.h */, + DF93D7F51444B568007C6459 /* HDHomeRunDirectory.cpp */, + DF93D7F41444B568007C6459 /* HDHomeRunDirectory.h */, + DF93D7F01444B54A007C6459 /* HDHomeRunFile.cpp */, + DF93D7F11444B54A007C6459 /* HDHomeRunFile.h */, F584E12D0F257C5100DB26A5 /* HTTPDirectory.cpp */, F584E12C0F257C5100DB26A5 /* HTTPDirectory.h */, DF9A71EC1639C8F6005ECB2E /* HTTPFile.cpp */, @@ -7864,6 +8735,7 @@ E38E17090D25F9FA00618676 /* MultiPathDirectory.h */, F50629780E57B9680066625A /* MultiPathFile.cpp */, F50629790E57B9680066625A /* MultiPathFile.h */, + E38E170A0D25F9FA00618676 /* MusicDatabaseDirectory */, E38E17370D25F9FA00618676 /* MusicDatabaseDirectory.cpp */, E38E17380D25F9FA00618676 /* MusicDatabaseDirectory.h */, DF93D67B1444A8B0007C6459 /* MusicDatabaseFile.cpp */, @@ -7891,6 +8763,7 @@ E38E17430D25F9FA00618676 /* PlaylistFileDirectory.h */, E38E17440D25F9FA00618676 /* PluginDirectory.cpp */, E38E17450D25F9FA00618676 /* PluginDirectory.h */, + 7CAA468D19427AED00008885 /* posix */, C8482905156CFF24005A996F /* PVRDirectory.cpp */, C8482906156CFF24005A996F /* PVRDirectory.h */, C8482907156CFF24005A996F /* PVRFile.cpp */, @@ -7917,6 +8790,10 @@ DF93D6861444A8B0007C6459 /* SFTPFile.h */, DF93D6871444A8B0007C6459 /* ShoutcastFile.cpp */, DF93D6881444A8B0007C6459 /* ShoutcastFile.h */, + DF93D65C1444A7A3007C6459 /* SlingboxDirectory.cpp */, + DF93D65B1444A7A3007C6459 /* SlingboxDirectory.h */, + DF93D6891444A8B0007C6459 /* SlingboxFile.cpp */, + DF93D68A1444A8B0007C6459 /* SlingboxFile.h */, E38E17530D25F9FA00618676 /* SmartPlaylistDirectory.cpp */, E38E17540D25F9FA00618676 /* SmartPlaylistDirectory.h */, E3DAAF8B0D6E1B0500F17647 /* SMBDirectory.cpp */, @@ -7943,16 +8820,11 @@ E38E175C0D25F9FA00618676 /* UPnPDirectory.h */, DF93D6951444A8B0007C6459 /* UPnPFile.cpp */, DF93D6961444A8B0007C6459 /* UPnPFile.h */, + E38E175F0D25F9FA00618676 /* VideoDatabaseDirectory */, E38E178A0D25F9FA00618676 /* VideoDatabaseDirectory.cpp */, E38E178B0D25F9FA00618676 /* VideoDatabaseDirectory.h */, E38E178C0D25F9FA00618676 /* VirtualDirectory.cpp */, E38E178D0D25F9FA00618676 /* VirtualDirectory.h */, - DF1D2DE71B6E85EE002BB9DB /* XbtDirectory.cpp */, - DF1D2DE81B6E85EE002BB9DB /* XbtDirectory.h */, - DF1D2DE91B6E85EE002BB9DB /* XbtFile.cpp */, - DF1D2DEA1B6E85EE002BB9DB /* XbtFile.h */, - DF1D2DEB1B6E85EE002BB9DB /* XbtManager.cpp */, - DF1D2DEC1B6E85EE002BB9DB /* XbtManager.h */, E49ACD8B100745C400A86ECD /* ZeroconfDirectory.cpp */, E49ACD8A100745C400A86ECD /* ZeroconfDirectory.h */, E38E17930D25F9FA00618676 /* ZipDirectory.cpp */, @@ -8057,6 +8929,7 @@ isa = PBXGroup; children = ( E38E18820D25F9FA00618676 /* libexif */, + E38E196D0D25F9FB00618676 /* libhdhomerun */, E38E1A550D25F9FB00618676 /* libUPnP */, E38E1CE40D25F9FC00618676 /* UnrarXLib */, ); @@ -8071,6 +8944,21 @@ path = libexif; sourceTree = ""; }; + E38E196D0D25F9FB00618676 /* libhdhomerun */ = { + isa = PBXGroup; + children = ( + E38E196E0D25F9FB00618676 /* hdhomerun.h */, + E38E196F0D25F9FB00618676 /* hdhomerun_channelscan.h */, + E38E19700D25F9FB00618676 /* hdhomerun_control.h */, + E38E19710D25F9FB00618676 /* hdhomerun_device.h */, + E38E19720D25F9FB00618676 /* hdhomerun_discover.h */, + E38E19730D25F9FB00618676 /* hdhomerun_os.h */, + E38E19740D25F9FB00618676 /* hdhomerun_pkt.h */, + E38E19750D25F9FB00618676 /* hdhomerun_video.h */, + ); + path = libhdhomerun; + sourceTree = ""; + }; E38E1A550D25F9FB00618676 /* libUPnP */ = { isa = PBXGroup; children = ( @@ -8246,8 +9134,6 @@ F563529F16E53FE900D21BAD /* dialogs */, F56352A016E53FF300D21BAD /* windows */, 18B7C3A612942132009E7A26 /* AdvancedSettings.cpp */, - 7C973CFD1B5038680002A874 /* AudioDSPSettings.h */, - 7CEE587C1B5A3FFB007C2B5A /* AudioDSPSettings.cpp */, 18B7C3A712942132009E7A26 /* AdvancedSettings.h */, DF28EE01170E1E51005FA9D2 /* DisplaySettings.cpp */, DF28EE02170E1E51005FA9D2 /* DisplaySettings.h */, @@ -8292,6 +9178,8 @@ F5FDF51B0E7218950005B0A6 /* AsyncFileCopy.h */, 7C908892196358A8003D0619 /* auto_buffer.cpp */, 7C908893196358A8003D0619 /* auto_buffer.h */, + F5BDB81F120203C200F0B710 /* AutoPtrHandle.cpp */, + F5BDB81E120203C200F0B710 /* AutoPtrHandle.h */, DF52769A151BAEDA00B5B63B /* Base64.cpp */, DF52769B151BAEDA00B5B63B /* Base64.h */, F56353BD16E9BB3500D21BAD /* BitstreamConverter.cpp */, @@ -8390,7 +9278,6 @@ E38E1E760D25F9FD00618676 /* RssReader.h */, 7C525DF4195E2D8100BE3482 /* SaveFileStateJob.cpp */, 7C1A495B15A96918004AF4A4 /* SaveFileStateJob.h */, - 399B860B1BA49A230017F660 /* ScopeGuard.h */, E38E1E770D25F9FD00618676 /* ScraperParser.cpp */, E38E1E780D25F9FD00618676 /* ScraperParser.h */, E36C29E70DA72486001F0C9D /* ScraperUrl.cpp */, @@ -8450,6 +9337,7 @@ E47252BC174FA54E001C1AAA /* Targets */ = { isa = PBXGroup; children = ( + DF3C3C7C1752AB68000989C3 /* App-ATV2.xcconfig */, E49910D0174E2DFF00741B6D /* App-iOS.xcconfig */, E49910D1174E2E0000741B6D /* App-OSX.xcconfig */, E49910D2174E2E0000741B6D /* App.xcconfig */, @@ -8470,8 +9358,10 @@ E47252BE175115F9001C1AAA /* Support */ = { isa = PBXGroup; children = ( + DF3C3D171752BED3000989C3 /* copyframeworks-atv2.command */, DF3C3D181752BED3000989C3 /* copyframeworks-ios.command */, DF3C3D191752BED3000989C3 /* copyframeworks-osx.command */, + DF3C3D1A1752BED3000989C3 /* CopyRootFiles-atv2.command */, DF3C3D1B1752BED3000989C3 /* CopyRootFiles-ios.command */, DF3C3D1C1752BED3000989C3 /* CopyRootFiles-osx.command */, DF3C3D1D1752BED3000989C3 /* genoutputdirlink.command */, @@ -8483,6 +9373,16 @@ path = tools/darwin/Support; sourceTree = ""; }; + E499108A174D0D2600741B6D /* Frameworks */ = { + isa = PBXGroup; + children = ( + E499108B174D0D2600741B6D /* UIKit.framework */, + E499108D174D0D2600741B6D /* Foundation.framework */, + E499108F174D0D2600741B6D /* CoreGraphics.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; E49910A6174D0E2A00741B6D /* iOS */ = { isa = PBXGroup; children = ( @@ -8540,9 +9440,6 @@ E49910EE174E54E400741B6D /* ImageIO.framework */, E49910F4174E550200741B6D /* MediaPlayer.framework */, E49910E4174E54A100741B6D /* OpenGLES.framework */, - E499108B174D0D2600741B6D /* UIKit.framework */, - E499108D174D0D2600741B6D /* Foundation.framework */, - E499108F174D0D2600741B6D /* CoreGraphics.framework */, E49910E2174E549400741B6D /* QuartzCore.framework */, ); name = iOS; @@ -8627,10 +9524,6 @@ F563529F16E53FE900D21BAD /* dialogs */ = { isa = PBXGroup; children = ( - 7C973CF61B5038580002A874 /* GUIDialogAudioDSPManager.cpp */, - 7C973CF71B5038580002A874 /* GUIDialogAudioDSPManager.h */, - 7C973CF81B5038580002A874 /* GUIDialogAudioDSPSettings.cpp */, - 7C973CF91B5038580002A874 /* GUIDialogAudioDSPSettings.h */, DFECFADD172D9C5100A43CF7 /* GUIControlSettings.cpp */, DFECFADE172D9C5100A43CF7 /* GUIControlSettings.h */, F56352A216E5402100D21BAD /* GUIDialogContentSettings.cpp */, @@ -8660,6 +9553,14 @@ name = windows; sourceTree = ""; }; + F57E1ED20E36E8FD00700C9D /* internal libs */ = { + isa = PBXGroup; + children = ( + 18404DA51396C31B00863BBA /* SlingboxLib.a */, + ); + name = "internal libs"; + sourceTree = ""; + }; F5AE407F13415D9E0004BD79 /* json-rpc */ = { isa = PBXGroup; children = ( @@ -8804,6 +9705,8 @@ F5E1052C140AA38000175026 /* dialogs */ = { isa = PBXGroup; children = ( + F5E1052D140AA38000175026 /* GUIDialogPeripheralManager.cpp */, + F5E1052E140AA38000175026 /* GUIDialogPeripheralManager.h */, F5E1052F140AA38000175026 /* GUIDialogPeripheralSettings.cpp */, F5E10530140AA38000175026 /* GUIDialogPeripheralSettings.h */, ); @@ -8825,25 +9728,6 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 6E2FACBA0E26DF7A00DF79EA /* Kodi.app */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6E2FACC10E26DFA300DF79EA /* Build configuration list for PBXNativeTarget "Kodi.app" */; - buildPhases = ( - F5DEC3580E6DEBB2005A4E24 /* copy root files */, - 6E2FACC70E26E22400DF79EA /* copy frameworks */, - 81B8FC150E7D927A00354E2E /* update version info */, - 1D64E5FC157BD76F001ACEBE /* genoutputdirlink */, - ); - buildRules = ( - ); - dependencies = ( - 6E2FACC40E26E08100DF79EA /* PBXTargetDependency */, - ); - name = Kodi.app; - productName = Kodi.app; - productReference = D6299ABB1AFC2A9F00E3059D /* Kodi.app */; - productType = "com.apple.product-type.application"; - }; 8DD76F740486A8DE00D96B5E /* Kodi */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB924708733DCA0010E9CD /* Build configuration list for PBXNativeTarget "Kodi" */; @@ -8863,6 +9747,27 @@ productReference = 8DD76F7E0486A8DE00D96B5E /* Kodi */; productType = "com.apple.product-type.tool"; }; + DFFC52CA17527B3100C937AB /* Kodi-ATV2 */ = { + isa = PBXNativeTarget; + buildConfigurationList = DFFC52CE17527B4F00C937AB /* Build configuration list for PBXNativeTarget "Kodi-ATV2" */; + buildPhases = ( + DFFC52C617527B3100C937AB /* Resources */, + DFF0EB3017527FDE002DA3A4 /* Make interface-python */, + DFFC52C717527B3100C937AB /* Sources */, + DFFC52C817527B3100C937AB /* Frameworks */, + DFF0EB321752801C002DA3A4 /* copy root files */, + DFF0EB3417528047002DA3A4 /* copy frameworks */, + DFF0EB361752805B002DA3A4 /* genoutputdirlink */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Kodi-ATV2"; + productName = "Kodi-ATV2"; + productReference = DFFC52CB17527B3100C937AB /* Kodi.frappliance */; + productType = "com.apple.product-type.bundle"; + }; E4991088174D0D2600741B6D /* Kodi-iOS */ = { isa = PBXNativeTarget; buildConfigurationList = E49910A5174D0D2600741B6D /* Build configuration list for PBXNativeTarget "Kodi-iOS" */; @@ -8891,6 +9796,7 @@ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { + LastUpgradeCheck = 0430; }; buildConfigurationList = 1DEB924B08733DCA0010E9CD /* Build configuration list for PBXProject "Kodi" */; compatibilityVersion = "Xcode 3.2"; @@ -8910,17 +9816,37 @@ 8DD76F740486A8DE00D96B5E /* Kodi */, 6E2FACBA0E26DF7A00DF79EA /* Kodi.app */, E4991088174D0D2600741B6D /* Kodi-iOS */, + DFFC52CA17527B3100C937AB /* Kodi-ATV2 */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + DFFC52C617527B3100C937AB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DFF0F49D1752838E002DA3A4 /* InfoPlist.strings in Resources */, + DFFA43FF19104C0800C3923B /* AppIcon.png in Resources */, + 7CCDA1B9192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.xml in Resources */, + 7CCDA1C4192753E30074CF51 /* AVTransportSCPD.xml in Resources */, + 7CCDA1C6192753E30074CF51 /* AVTransportSCPDFull.xml in Resources */, + 7CCDA1E5192753E30074CF51 /* RdrConnectionManagerSCPD.xml in Resources */, + 7CCDA1F0192753E30074CF51 /* RenderingControlSCPD.xml in Resources */, + 7CCDA1F2192753E30074CF51 /* RenderingControlSCPD_Full.xml in Resources */, + 7CCDA1FD192753E30074CF51 /* ConnectionManagerSCPD.xml in Resources */, + 7CCDA208192753E30074CF51 /* ContentDirectorySCPD.xml in Resources */, + 7CCDA213192753E30074CF51 /* ContentDirectorywSearchSCPD.xml in Resources */, + 7CCDA757192756250074CF51 /* README.txt in Resources */, + 7CCDA759192756250074CF51 /* SConstruct in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; E4991087174D0D2600741B6D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( E49910B5174D0E2A00741B6D /* Default-568h@2x.png in Resources */, - 2A1A5A6C1BDEAA6D0084702D /* NOTE in Resources */, E49910B6174D0E2A00741B6D /* InfoPlist.strings in Resources */, DFFA440119104C1300C3923B /* AppIcon29x29.png in Resources */, DFFA440219104C1300C3923B /* AppIcon29x29@2x.png in Resources */, @@ -8944,7 +9870,6 @@ 7CCDA1E4192753E30074CF51 /* RdrConnectionManagerSCPD.xml in Resources */, 7CCDA1EF192753E30074CF51 /* RenderingControlSCPD.xml in Resources */, 7CCDA1F1192753E30074CF51 /* RenderingControlSCPD_Full.xml in Resources */, - 391416BF1B4A3EFA00BBF0AA /* guiinfo in Resources */, 7CCDA1FC192753E30074CF51 /* ConnectionManagerSCPD.xml in Resources */, 7CCDA207192753E30074CF51 /* ContentDirectorySCPD.xml in Resources */, 7CCDA212192753E30074CF51 /* ContentDirectorywSearchSCPD.xml in Resources */, @@ -9013,6 +9938,62 @@ shellPath = /bin/sh; shellScript = "tools/darwin/Support/updateversioninfo-osx.command"; }; + DFF0EB3017527FDE002DA3A4 /* Make interface-python */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Make interface-python"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = tools/darwin/Support/makepythoninterface.command; + }; + DFF0EB321752801C002DA3A4 /* copy root files */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "copy root files"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "tools/darwin/Support/CopyRootFiles-ios.command"; + }; + DFF0EB3417528047002DA3A4 /* copy frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "copy frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "tools/darwin/Support/copyframeworks-atv2.command"; + }; + DFF0EB361752805B002DA3A4 /* genoutputdirlink */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = genoutputdirlink; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = tools/darwin/Support/genoutputdirlink.command; + }; E49910BD174D1E0700741B6D /* genoutputdirlink */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -9121,7 +10102,7 @@ files = ( E38E1F370D25F9FD00618676 /* Application.cpp in Sources */, 399442771A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */, - 7C8E02431BA35D0B0072E8B2 /* SkinBuiltins.cpp in Sources */, + E38E1F380D25F9FD00618676 /* ApplicationMessenger.cpp in Sources */, E38E1F3C0D25F9FD00618676 /* Autorun.cpp in Sources */, E38E1F3D0D25F9FD00618676 /* AutoSwitch.cpp in Sources */, E38E1F3E0D25F9FD00618676 /* BackgroundInfoLoader.cpp in Sources */, @@ -9158,7 +10139,6 @@ E38E1F8E0D25F9FD00618676 /* DVDVideoCodecLibMpeg2.cpp in Sources */, E38E1F8F0D25F9FD00618676 /* DVDVideoPPFFmpeg.cpp in Sources */, E38E1F910D25F9FD00618676 /* DVDDemux.cpp in Sources */, - 7C8E023A1BA35D0B0072E8B2 /* PlayerBuiltins.cpp in Sources */, E38E1F930D25F9FD00618676 /* DVDDemuxShoutcast.cpp in Sources */, E38E1F940D25F9FD00618676 /* DVDDemuxUtils.cpp in Sources */, E38E1F970D25F9FD00618676 /* DVDDemuxSPU.cpp in Sources */, @@ -9214,7 +10194,6 @@ E38E20270D25F9FD00618676 /* IDirectory.cpp in Sources */, E38E20280D25F9FD00618676 /* IFile.cpp in Sources */, E38E20290D25F9FD00618676 /* iso9660.cpp in Sources */, - 39B4F3701B96F845009B2D88 /* RepositoryUpdater.cpp in Sources */, E38E202A0D25F9FD00618676 /* ISO9660Directory.cpp in Sources */, E38E20330D25F9FD00618676 /* MultiPathDirectory.cpp in Sources */, E38E20340D25F9FD00618676 /* DirectoryNode.cpp in Sources */, @@ -9244,7 +10223,6 @@ E38E20510D25F9FD00618676 /* PluginDirectory.cpp in Sources */, E38E20520D25F9FD00618676 /* RarDirectory.cpp in Sources */, E38E20530D25F9FD00618676 /* RarManager.cpp in Sources */, - DF54F7FE1B6580AD000FCBA4 /* ContextMenuItem.cpp in Sources */, 395C29C51A98A0E100EBC7AD /* ILanguageInvoker.cpp in Sources */, E38E20580D25F9FD00618676 /* SmartPlaylistDirectory.cpp in Sources */, E38E205B0D25F9FD00618676 /* StackDirectory.cpp in Sources */, @@ -9256,7 +10234,6 @@ E38E20650D25F9FD00618676 /* DirectoryNodeOverview.cpp in Sources */, E38E20660D25F9FD00618676 /* DirectoryNodeRecentlyAddedEpisodes.cpp in Sources */, DF4BF01D1A4EF3410053AC56 /* DVDDemuxCC.cpp in Sources */, - 7C8E02281BA35D0B0072E8B2 /* GUIBuiltins.cpp in Sources */, E38E20670D25F9FD00618676 /* DirectoryNodeRecentlyAddedMovies.cpp in Sources */, E38E20680D25F9FD00618676 /* DirectoryNodeRecentlyAddedMusicVideos.cpp in Sources */, E38E20690D25F9FD00618676 /* DirectoryNodeRoot.cpp in Sources */, @@ -9279,6 +10256,7 @@ E38E207F0D25F9FD00618676 /* GUIDialogContextMenu.cpp in Sources */, E38E20800D25F9FD00618676 /* GUIDialogFavourites.cpp in Sources */, E38E20810D25F9FD00618676 /* GUIDialogFileBrowser.cpp in Sources */, + E38E20820D25F9FD00618676 /* GUIDialogFileStacking.cpp in Sources */, E38E20830D25F9FD00618676 /* GUIDialogGamepad.cpp in Sources */, E38E20890D25F9FD00618676 /* GUIDialogMediaSource.cpp in Sources */, E38E208A0D25F9FD00618676 /* GUIDialogMusicOSD.cpp in Sources */, @@ -9311,13 +10289,14 @@ E38E20B30D25F9FD00618676 /* GUIWindowMusicBase.cpp in Sources */, E38E20B40D25F9FD00618676 /* GUIDialogMusicInfo.cpp in Sources */, E38E20B50D25F9FD00618676 /* GUIWindowMusicNav.cpp in Sources */, + E38E20B60D25F9FD00618676 /* GUIDialogMusicOverlay.cpp in Sources */, E38E20B70D25F9FD00618676 /* GUIWindowMusicPlaylist.cpp in Sources */, 395C29F61A98B44B00EBC7AD /* AddonModuleXbmcwsgi.cpp in Sources */, E38E20B80D25F9FD00618676 /* GUIWindowMusicPlaylistEditor.cpp in Sources */, + E38E20B90D25F9FD00618676 /* GUIWindowMusicSongs.cpp in Sources */, E38E20BB0D25F9FD00618676 /* GUIDialogVideoOSD.cpp in Sources */, DFC6F4B91AFF7CB10039A7FA /* kiss_fftr.c in Sources */, E38E20BC0D25F9FD00618676 /* GUIWindowPictures.cpp in Sources */, - 7C8E022E1BA35D0B0072E8B2 /* GUIControlBuiltins.cpp in Sources */, E38E20BD0D25F9FD00618676 /* GUIWindowPointer.cpp in Sources */, E38E20BE0D25F9FD00618676 /* GUIWindowPrograms.cpp in Sources */, E38E20BF0D25F9FD00618676 /* GUIWindowScreensaver.cpp in Sources */, @@ -9327,6 +10306,7 @@ E38E20CA0D25F9FD00618676 /* GUIWindowVideoBase.cpp in Sources */, E38E20CC0D25F9FD00618676 /* GUIDialogVideoInfo.cpp in Sources */, E38E20CD0D25F9FD00618676 /* GUIWindowVideoNav.cpp in Sources */, + E38E20CE0D25F9FD00618676 /* GUIDialogVideoOverlay.cpp in Sources */, E38E20CF0D25F9FD00618676 /* GUIWindowVideoPlaylist.cpp in Sources */, E38E20D00D25F9FD00618676 /* GUIWindowVisualisation.cpp in Sources */, E38E20D10D25F9FD00618676 /* GUIWindowWeather.cpp in Sources */, @@ -9351,7 +10331,6 @@ E38E22430D25F9FE00618676 /* filestr.cpp in Sources */, E38E22440D25F9FE00618676 /* find.cpp in Sources */, E38E22450D25F9FE00618676 /* getbits.cpp in Sources */, - DF0E4ACA1AD5982500A75430 /* InfoTagRadioRDS.cpp in Sources */, E38E22460D25F9FE00618676 /* global.cpp in Sources */, E38E22470D25F9FE00618676 /* int64.cpp in Sources */, E38E22480D25F9FE00618676 /* isnt.cpp in Sources */, @@ -9365,7 +10344,6 @@ E38E22520D25F9FE00618676 /* rawread.cpp in Sources */, E38E22530D25F9FE00618676 /* rdwrfn.cpp in Sources */, E38E22540D25F9FE00618676 /* recvol.cpp in Sources */, - 7C8E02191BA35D0B0072E8B2 /* AddonBuiltins.cpp in Sources */, E38E22550D25F9FE00618676 /* resource.cpp in Sources */, E38E22560D25F9FE00618676 /* rijndael.cpp in Sources */, E38E22570D25F9FE00618676 /* rs.cpp in Sources */, @@ -9412,7 +10390,6 @@ E38E22C60D25F9FE00618676 /* BitstreamStats.cpp in Sources */, E38E22C70D25F9FE00618676 /* CharsetConverter.cpp in Sources */, E38E22C80D25F9FE00618676 /* CPUInfo.cpp in Sources */, - DF29BCF11B5D911800904347 /* EventLog.cpp in Sources */, E38E22CD0D25F9FE00618676 /* Event.cpp in Sources */, E38E22D10D25F9FE00618676 /* GUIInfoManager.cpp in Sources */, E38E22D30D25F9FE00618676 /* HTMLUtil.cpp in Sources */, @@ -9434,7 +10411,6 @@ E38E22F30D25F9FE00618676 /* SystemInfo.cpp in Sources */, E38E22F40D25F9FE00618676 /* Thread.cpp in Sources */, E38E22F70D25F9FE00618676 /* UdpClient.cpp in Sources */, - DF29BCFA1B5D911800904347 /* GUIViewStateEventLog.cpp in Sources */, E38E22F80D25F9FE00618676 /* Weather.cpp in Sources */, E38E22FB0D25F9FE00618676 /* VideoDatabase.cpp in Sources */, E38E22FC0D25F9FE00618676 /* VideoInfoScanner.cpp in Sources */, @@ -9448,17 +10424,16 @@ E3A4780A0D29029A00F3C3A6 /* GUIDialogCache.cpp in Sources */, 395C29ED1A98A16300EBC7AD /* HTTPPythonInvoker.cpp in Sources */, E3A4781A0D29032C00F3C3A6 /* GUIDialogAccessPoints.cpp in Sources */, - 2A7B2BDC1BD6F16600044BCD /* PVRSettings.cpp in Sources */, 395897151AAD94F00033D27C /* KeyboardLayoutManager.cpp in Sources */, E36578880D3AA7B40033CC1C /* DVDPlayerCodec.cpp in Sources */, E33206380D5070AA00435CE3 /* DVDDemuxVobsub.cpp in Sources */, + E33979960D62FD48004ECDDA /* DVDInputStreamTV.cpp in Sources */, E3DAAF8D0D6E1B0500F17647 /* SMBDirectory.cpp in Sources */, E3E91FFD0D8C61DF002BF43D /* EventPacket.cpp in Sources */, E3E91FFE0D8C61DF002BF43D /* EventServer.cpp in Sources */, E3E91FFF0D8C61DF002BF43D /* Socket.cpp in Sources */, E3E920020D8C622A002BF43D /* EventClient.cpp in Sources */, E38A06CE0D95AA5500FF8227 /* GUIDialogKaiToast.cpp in Sources */, - 7C8E023D1BA35D0B0072E8B2 /* ProfileBuiltins.cpp in Sources */, E3B53E7C0D97B08100021A96 /* DVDSubtitleParserMicroDVD.cpp in Sources */, E36C29DF0DA72429001F0C9D /* Artist.cpp in Sources */, E36C29E00DA72429001F0C9D /* Album.cpp in Sources */, @@ -9483,17 +10458,23 @@ DFEB902819E9337200728978 /* AEResampleFactory.cpp in Sources */, F5F2EF4B0E593E0D0092C37F /* DVDFileInfo.cpp in Sources */, F5FDF51D0E7218950005B0A6 /* AsyncFileCopy.cpp in Sources */, - DF29BD021B5D913B00904347 /* EventsDirectory.cpp in Sources */, E4E91BB80E7F7338001F0546 /* NptXbmcFile.cpp in Sources */, - DF29BCEE1B5D911800904347 /* BaseEvent.cpp in Sources */, 7C5608C70F1754930056433A /* ExternalPlayer.cpp in Sources */, F584E12E0F257C5100DB26A5 /* HTTPDirectory.cpp in Sources */, 397877D51AAAF87700F98A45 /* Speed.cpp in Sources */, - 7C8E02341BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */, - DF29BCF71B5D911800904347 /* MediaLibraryEvent.cpp in Sources */, + F54C51D20F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp in Sources */, 2F4564D51970129A00396109 /* GUIFontCache.cpp in Sources */, + F54C51D50F1E784800D46E3C /* karaokelyricscdg.cpp in Sources */, + F54C51D80F1E785700D46E3C /* karaokelyrics.cpp in Sources */, + F54C51E50F1E787700D46E3C /* karaokelyricstextkar.cpp in Sources */, + F54C51E60F1E787700D46E3C /* karaokelyricsmanager.cpp in Sources */, + F54C51E70F1E787700D46E3C /* karaokelyricsfactory.cpp in Sources */, + F54C51E80F1E787700D46E3C /* karaokelyricstextlrc.cpp in Sources */, + F54C51E90F1E787700D46E3C /* karaokelyricstext.cpp in Sources */, 7CEBD8A80F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp in Sources */, 7C2D6AE40F35453E00DD2E85 /* SpecialProtocol.cpp in Sources */, + F5AD1EA80F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp in Sources */, + F56A084B0F4A18FB003F9F87 /* karaokewindowbackground.cpp in Sources */, F51CEEEF0F5C5D20004F4602 /* OSXGNUReplacements.c in Sources */, F5EA02260F6DA990005C2EC5 /* CocoaPowerSyscall.cpp in Sources */, F5EA02270F6DA9A5005C2EC5 /* PowerManager.cpp in Sources */, @@ -9504,6 +10485,7 @@ F5AACA680FB3DE2D00DBB77C /* GUIDialogSelect.cpp in Sources */, F5AACA970FB3E2B800DBB77C /* GUIDialogSlider.cpp in Sources */, F59876C00FBA351D008EF4FB /* VideoReferenceClock.cpp in Sources */, + 83A72B970FBC8E3B00171871 /* LockFree.cpp in Sources */, F5987F050FBDF274008EF4FB /* DPMSSupport.cpp in Sources */, F5987FDB0FBE2DFD008EF4FB /* PAPlayer.cpp in Sources */, F548786D0FE060FF00E506FD /* DVDSubtitleParserMPL2.cpp in Sources */, @@ -9511,15 +10493,14 @@ 7CDAE9050FFCA3520040B25F /* DVDTSCorrection.cpp in Sources */, E4DC97540FFE5BA8008E0C07 /* SAPDirectory.cpp in Sources */, E4DC97550FFE5BA8008E0C07 /* SAPFile.cpp in Sources */, + 7CDAEA7D1001CD6E0040B25F /* karaokelyricstextustar.cpp in Sources */, F5D8D732102BB3B1004A11AB /* OverlayRendererGL.cpp in Sources */, F5D8D733102BB3B1004A11AB /* OverlayRenderer.cpp in Sources */, E49ACD8C100745C400A86ECD /* ZeroconfDirectory.cpp in Sources */, B5101B5819DFF8DD00294D1E /* BlurayFile.cpp in Sources */, E49ACD9F10074A4000A86ECD /* ZeroconfBrowserOSX.cpp in Sources */, - DF6F52AE1AF6D03F001BC57D /* dacp.cpp in Sources */, E49ACDD510074F9200A86ECD /* ZeroconfBrowser.cpp in Sources */, F5D8EF5B103912A4004A11AB /* DVDSubtitleParserVplayer.cpp in Sources */, - 7C8E02491BA35D0B0072E8B2 /* WeatherBuiltins.cpp in Sources */, 7C779E3A104A57E500F444C4 /* RenderSystem.cpp in Sources */, 7C779E3B104A57E500F444C4 /* RenderSystemGL.cpp in Sources */, 7C779E3C104A57E500F444C4 /* WinEventsSDL.cpp in Sources */, @@ -9530,15 +10511,14 @@ 7C779E54104A58F900F444C4 /* GUIWindowTestPatternGL.cpp in Sources */, 7C62F24210505BC7002AD2C1 /* Bookmark.cpp in Sources */, 7C62F45E1057A62D002AD2C1 /* DirectoryNodeSingles.cpp in Sources */, + 7CCF7F1D1069F3AE00992676 /* Builtins.cpp in Sources */, 7CCF7FC9106A0DF500992676 /* TimeUtils.cpp in Sources */, F57B6F801071B8B500079ACB /* JobManager.cpp in Sources */, F5E55B5D10741272006E788A /* DVDPlayerTeletext.cpp in Sources */, - 7C8E02371BA35D0B0072E8B2 /* PictureBuiltins.cpp in Sources */, F5E55B66107412DE006E788A /* GUIDialogTeletext.cpp in Sources */, F5E55B7010741340006E788A /* Teletext.cpp in Sources */, 43348AA4107747CD00F859CF /* Edl.cpp in Sources */, 43348AAE1077486D00F859CF /* PlayerCoreFactory.cpp in Sources */, - 7C973CF21B5037EF0002A874 /* ActiveAEDSPAddon.cpp in Sources */, 43348AAF1077486D00F859CF /* PlayerSelectionRule.cpp in Sources */, 7CAA20511079C8160096DE39 /* BaseRenderer.cpp in Sources */, 55D3604E1826CAB900DA66D2 /* OverlayRendererGUI.cpp in Sources */, @@ -9553,7 +10533,6 @@ F592568810FBF2E100D2C91D /* ConvolutionKernels.cpp in Sources */, F5DC87E2110A287400EE1B15 /* RingBuffer.cpp in Sources */, F5F244651110DC6B009126C6 /* FileOperationJob.cpp in Sources */, - DF0E4AC51AD597ED00A75430 /* DVDPlayerRadioRDS.cpp in Sources */, F5F245EE1112C9AB009126C6 /* FileUtils.cpp in Sources */, F5A7A702112893E50059D6AA /* AnnouncementManager.cpp in Sources */, F5A7A85B112908F00059D6AA /* WebServer.cpp in Sources */, @@ -9576,6 +10555,7 @@ F58E293911FFC103006F4D46 /* DVDInputStreamBluray.cpp in Sources */, F5BDB80C120202F400F0B710 /* DVDSubtitleTagSami.cpp in Sources */, F5BDB81A1202032400F0B710 /* DVDSubtitleTagMicroDVD.cpp in Sources */, + F5BDB820120203C200F0B710 /* AutoPtrHandle.cpp in Sources */, 7CF1FB0C123B1AF000B2CBCB /* Variant.cpp in Sources */, C8D0B2AF1265A9A800F0C0AC /* SystemGlobals.cpp in Sources */, 7CBEBB8412912BA400431822 /* fstrcmp.c in Sources */, @@ -9583,10 +10563,10 @@ 18B7C3841294203F009E7A26 /* AddonDatabase.cpp in Sources */, 18B7C38A12942090009E7A26 /* GUIDialogAddonInfo.cpp in Sources */, 18B7C38B12942090009E7A26 /* GUIViewStateAddonBrowser.cpp in Sources */, - 39BD2AD81B845D40004A5A15 /* DialogHelper.cpp in Sources */, 18B7C392129420E5009E7A26 /* Settings.cpp in Sources */, 18B7C3A812942132009E7A26 /* AdvancedSettings.cpp in Sources */, 395C29DB1A98A11C00EBC7AD /* WsgiResponse.cpp in Sources */, + 18B7C7A91294222E009E7A26 /* AnimatedGif.cpp in Sources */, 18B7C7AB1294222E009E7A26 /* D3DResource.cpp in Sources */, 18B7C7AC1294222E009E7A26 /* DDSImage.cpp in Sources */, 18B7C7AD1294222E009E7A26 /* DirectXGraphics.cpp in Sources */, @@ -9626,12 +10606,10 @@ 18B7C7CE1294222E009E7A26 /* GUIListLabel.cpp in Sources */, 18B7C7CF1294222E009E7A26 /* GUIMessage.cpp in Sources */, 18B7C7D01294222E009E7A26 /* GUIMoverControl.cpp in Sources */, - 395938771AC310B00053A590 /* MessagePrinter.cpp in Sources */, 18B7C7D11294222E009E7A26 /* GUIMultiImage.cpp in Sources */, 18B7C7D21294222E009E7A26 /* GUIMultiSelectText.cpp in Sources */, 18B7C7D31294222E009E7A26 /* GUIPanelContainer.cpp in Sources */, 18B7C7D41294222E009E7A26 /* GUIProgressControl.cpp in Sources */, - DF1D2DF01B6E85EE002BB9DB /* XbtFile.cpp in Sources */, 18B7C7D51294222E009E7A26 /* GUIRadioButtonControl.cpp in Sources */, 18B7C7D61294222E009E7A26 /* GUIRenderingControl.cpp in Sources */, 18B7C7D71294222E009E7A26 /* GUIResizeControl.cpp in Sources */, @@ -9644,7 +10622,6 @@ 18B7C7DF1294222E009E7A26 /* GUISpinControl.cpp in Sources */, 399442711A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */, 18B7C7E01294222E009E7A26 /* GUISpinControlEx.cpp in Sources */, - 7C973CE51B50378E0002A874 /* AddonCallbacksAudioDSP.cpp in Sources */, 18B7C7E21294222E009E7A26 /* GUIStaticItem.cpp in Sources */, 18B7C7E31294222E009E7A26 /* GUITextBox.cpp in Sources */, 18B7C7E41294222E009E7A26 /* GUITextLayout.cpp in Sources */, @@ -9657,7 +10634,6 @@ 18B7C7EB1294222E009E7A26 /* GUIVisualisationControl.cpp in Sources */, 18B7C7EC1294222E009E7A26 /* GUIWindow.cpp in Sources */, 18B7C7ED1294222E009E7A26 /* GUIWindowManager.cpp in Sources */, - 7C973CF11B5037EF0002A874 /* ActiveAEDSP.cpp in Sources */, 18B7C7EE1294222E009E7A26 /* GUIWrappingListContainer.cpp in Sources */, 18B7C7EF1294222E009E7A26 /* IWindowManagerCallback.cpp in Sources */, 18B7C7F11294222E009E7A26 /* LocalizeStrings.cpp in Sources */, @@ -9713,7 +10689,6 @@ 7C99B6A4133D342100FC2B16 /* CircularCache.cpp in Sources */, 7C99B7951340723F00FC2B16 /* GUIDialogPlayEject.cpp in Sources */, F5AE409C13415D9E0004BD79 /* AudioLibrary.cpp in Sources */, - 7C3018311BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp in Sources */, F5AE409F13415D9E0004BD79 /* FileItemHandler.cpp in Sources */, F5AE40A013415D9E0004BD79 /* FileOperations.cpp in Sources */, F5AE40A113415D9E0004BD79 /* JSONRPC.cpp in Sources */, @@ -9737,7 +10712,6 @@ DF0DF15C13A3ADA7008ED511 /* NFSDirectory.cpp in Sources */, 7C89619213B6A16F003631FE /* GUIWindowScreensaverDim.cpp in Sources */, 18ECC96213CF178D00A9ED6C /* StreamUtils.cpp in Sources */, - 7C8E02401BA35D0B0072E8B2 /* PVRBuiltins.cpp in Sources */, F5CEE60913D3C89700225F72 /* DVDOverlayCodecTX3G.cpp in Sources */, 38F4E57013CCCB3B00664821 /* Implementation.cpp in Sources */, 3802709A13D5A653009493DD /* SystemClock.cpp in Sources */, @@ -9747,7 +10721,6 @@ DF34892A13FD9C780026A711 /* AirPlayServer.cpp in Sources */, DF34898213FDAAF60026A711 /* HttpParser.cpp in Sources */, 18968DC814155D7C005BA742 /* ApplicationOperations.cpp in Sources */, - DF0E4AD41AD5986F00A75430 /* GUIDialogPVRRadioRDSInfo.cpp in Sources */, 32C631281423A90F00F18420 /* JpegIO.cpp in Sources */, DF448457140048A60069344B /* AirTunesServer.cpp in Sources */, DF44845E140048C80069344B /* PipesManager.cpp in Sources */, @@ -9761,13 +10734,12 @@ F5E10540140AA38100175026 /* PeripheralNIC.cpp in Sources */, F5E10541140AA38100175026 /* PeripheralNyxboard.cpp in Sources */, F5E10542140AA38100175026 /* PeripheralTuner.cpp in Sources */, + F5E10543140AA38100175026 /* GUIDialogPeripheralManager.cpp in Sources */, F5E10544140AA38100175026 /* GUIDialogPeripheralSettings.cpp in Sources */, F5E10547140AA38100175026 /* Peripherals.cpp in Sources */, F5E1138014357F3800175026 /* PeripheralCecAdapter.cpp in Sources */, F54BCC5F1439345300F86B0F /* HotKeyController.m in Sources */, DF673AA51443819600A5A509 /* AddonManager.cpp in Sources */, - 7C8E022B1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */, - DFDE5D511AE5658200EE53AD /* PictureScalingAlgorithm.cpp in Sources */, F5BD02F6148D3A7E001B5583 /* CryptThreading.cpp in Sources */, DF5276E1151BAEDA00B5B63B /* Base64.cpp in Sources */, DF5276E2151BAEDA00B5B63B /* HttpResponse.cpp in Sources */, @@ -9781,8 +10753,8 @@ DFCA6AC8152245CD000BFAAE /* HTTPVfsHandler.cpp in Sources */, DFCA6AC9152245CD000BFAAE /* HTTPWebinterfaceAddonsHandler.cpp in Sources */, DFCA6ACA152245CD000BFAAE /* HTTPWebinterfaceHandler.cpp in Sources */, - 42E2E1C91B53F74D005C7E4E /* VideoLibraryRefreshingJob.cpp in Sources */, DFCA6ACB152245CD000BFAAE /* IHTTPRequestHandler.cpp in Sources */, + DF93D65D1444A7A3007C6459 /* SlingboxDirectory.cpp in Sources */, DF93D69A1444A8B1007C6459 /* DirectoryCache.cpp in Sources */, DF93D69B1444A8B1007C6459 /* FileCache.cpp in Sources */, 3994427A1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */, @@ -9790,7 +10762,6 @@ DF93D69D1444A8B1007C6459 /* CurlFile.cpp in Sources */, DF93D69F1444A8B1007C6459 /* DirectoryFactory.cpp in Sources */, DF93D6A01444A8B1007C6459 /* FileDirectoryFactory.cpp in Sources */, - DF2401261B41A26F001E02DA /* ImageResource.cpp in Sources */, DF93D6A11444A8B1007C6459 /* FileReaderFile.cpp in Sources */, DF93D6A31444A8B1007C6459 /* ISOFile.cpp in Sources */, DF93D6A51444A8B1007C6459 /* MusicDatabaseFile.cpp in Sources */, @@ -9799,25 +10770,26 @@ DF93D6A81444A8B1007C6459 /* RarFile.cpp in Sources */, DF93D6AA1444A8B1007C6459 /* SFTPFile.cpp in Sources */, DF93D6AB1444A8B1007C6459 /* ShoutcastFile.cpp in Sources */, + DF93D6AC1444A8B1007C6459 /* SlingboxFile.cpp in Sources */, DF93D6AD1444A8B1007C6459 /* SMBFile.cpp in Sources */, DF93D6AE1444A8B1007C6459 /* SpecialProtocolFile.cpp in Sources */, DF6A0D811A4584E80075BBFC /* OverrideDirectory.cpp in Sources */, DF93D6B11444A8B1007C6459 /* UDFFile.cpp in Sources */, DF93D6B21444A8B1007C6459 /* UPnPFile.cpp in Sources */, DF93D6B31444A8B1007C6459 /* ZipFile.cpp in Sources */, + DF93D7F21444B54A007C6459 /* HDHomeRunFile.cpp in Sources */, + DF93D7F61444B568007C6459 /* HDHomeRunDirectory.cpp in Sources */, 7C1A85661520522500C63311 /* TextureCacheJob.cpp in Sources */, 7C1F6EBB13ECCFA7001726AB /* LibraryDirectory.cpp in Sources */, EC720A8F155091BB00FFD782 /* ilog.cpp in Sources */, EC720A9D1550927000FFD782 /* XbmcContext.cpp in Sources */, F5ED8D6C1551F91400842059 /* BlurayDirectory.cpp in Sources */, - 7C8E02251BA35D0B0072E8B2 /* CECBuiltins.cpp in Sources */, F5ED908815538DCE00842059 /* XBMCTinyXML.cpp in Sources */, F5ED908E15538E2300842059 /* POUtils.cpp in Sources */, DFB65FB515373AE7006B8FF1 /* AEFactory.cpp in Sources */, DFB65FB715373AE7006B8FF1 /* AEEncoderFFmpeg.cpp in Sources */, DFB65FCC15373AE7006B8FF1 /* AEBitstreamPacker.cpp in Sources */, DFB65FCD15373AE7006B8FF1 /* AEBuffer.cpp in Sources */, - DF29BCFD1B5D911800904347 /* GUIWindowEventLog.cpp in Sources */, DFB65FCE15373AE7006B8FF1 /* AEChannelInfo.cpp in Sources */, DFB65FD015373AE7006B8FF1 /* AEPackIEC61937.cpp in Sources */, DFB65FD215373AE7006B8FF1 /* AEStreamInfo.cpp in Sources */, @@ -9836,7 +10808,6 @@ C84828C8156CFCD8005A996F /* GUIDialogPVRChannelManager.cpp in Sources */, C84828C9156CFCD8005A996F /* GUIDialogPVRChannelsOSD.cpp in Sources */, C84828CC156CFCD8005A996F /* GUIDialogPVRGroupManager.cpp in Sources */, - DF54F8031B6580C8000FCBA4 /* ContextMenuAddon.cpp in Sources */, C84828CD156CFCD8005A996F /* GUIDialogPVRGuideInfo.cpp in Sources */, C84828CE156CFCD8005A996F /* GUIDialogPVRGuideOSD.cpp in Sources */, C84828CF156CFCD8005A996F /* GUIDialogPVRGuideSearch.cpp in Sources */, @@ -9885,7 +10856,6 @@ 36A9466315CF1FA600727135 /* DbUrl.cpp in Sources */, 3994427F1A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */, 36A9466715CF1FD200727135 /* MusicDbUrl.cpp in Sources */, - DF29BCE81B5D911700904347 /* AddonEvent.cpp in Sources */, DFC6F4B61AFF7CB10039A7FA /* kiss_fft.c in Sources */, 36A9466A15CF1FED00727135 /* UrlOptions.cpp in Sources */, 36A9466D15CF201F00727135 /* VideoDbUrl.cpp in Sources */, @@ -9911,7 +10881,6 @@ DFD928F316384B6800709DAE /* Timer.cpp in Sources */, DF9A71EE1639C8F6005ECB2E /* HTTPFile.cpp in Sources */, DFB25D2F163D4743006C4A48 /* Addon.cpp in Sources */, - DF1D2DF31B6E85EE002BB9DB /* XbtManager.cpp in Sources */, DFB25D30163D4743006C4A48 /* AddonCallback.cpp in Sources */, DFB25D31163D4743006C4A48 /* AddonClass.cpp in Sources */, DFB25D32163D4743006C4A48 /* AddonUtils.cpp in Sources */, @@ -9952,8 +10921,8 @@ F5EDC48C1651A6F900B852D8 /* GroupUtils.cpp in Sources */, 7C7CEAF1165629530059C9EB /* AELimiter.cpp in Sources */, DFB02DEA16629DBA00F37752 /* PyContext.cpp in Sources */, + DF07252E168734D7008DCAAD /* karaokevideobackground.cpp in Sources */, DF072534168734ED008DCAAD /* FFmpegVideoDecoder.cpp in Sources */, - 7C8E02221BA35D0B0072E8B2 /* Builtins.cpp in Sources */, 395F6DE21A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */, DF64FE3D16C07AAA00D028FB /* GUIViewControl.cpp in Sources */, DF64FE3E16C07AAA00D028FB /* GUIViewState.cpp in Sources */, @@ -9967,7 +10936,6 @@ F56352AA16E5402100D21BAD /* GUIDialogContentSettings.cpp in Sources */, F56352BB16E5403400D21BAD /* GUIWindowSettings.cpp in Sources */, F56352BC16E5403400D21BAD /* GUIWindowSettingsCategory.cpp in Sources */, - 7C226E3E1BA5F61C00185CE0 /* AddonCallbacksAudioEngine.cpp in Sources */, F56352BE16E5403400D21BAD /* GUIWindowSettingsScreenCalibration.cpp in Sources */, F56352BF16E5403400D21BAD /* GUIWindowTestPattern.cpp in Sources */, F56352C816E5436900D21BAD /* AppParamParser.cpp in Sources */, @@ -9998,13 +10966,10 @@ F5DB700217322DBB00D4DF21 /* FavouritesOperations.cpp in Sources */, DF52566D1732C1890094A464 /* DVDDemuxCDDA.cpp in Sources */, DFA8157E16713B1200E4E597 /* WakeOnAccess.cpp in Sources */, - 7C973CFB1B5038580002A874 /* GUIDialogAudioDSPSettings.cpp in Sources */, 820023DB171A28A300667D1C /* OSXTextInputResponder.mm in Sources */, DF529BAE1741697B00523FB4 /* Environment.cpp in Sources */, DFE4095B17417FDF00473BD9 /* LegacyPathTranslation.cpp in Sources */, - 39C38CCA1BBFF1EE000F59F5 /* InputCodingTableKorean.cpp in Sources */, 0E3036EC1760F68A00D93596 /* FavouritesDirectory.cpp in Sources */, - 7C8E02461BA35D0B0072E8B2 /* SystemBuiltins.cpp in Sources */, 551C3A45175A12010051AAAD /* VDA.cpp in Sources */, DFBB431B178B5E6F006CC20A /* CompileInfo.cpp in Sources */, DF40BC20178B4BEC009DB567 /* PythonInvoker.cpp in Sources */, @@ -10041,10 +11006,10 @@ 7C1409A1183224B8009F9411 /* SettingsManager.cpp in Sources */, 7C1409A4183224B8009F9411 /* SettingUpdate.cpp in Sources */, DF0ABB73183A94A30018445D /* Utf8Utils.cpp in Sources */, - 7CEE587D1B5A3FFB007C2B5A /* AudioDSPSettings.cpp in Sources */, 7C1409A9184015C9009F9411 /* InfoExpression.cpp in Sources */, AE32174218313ADF0003FAFC /* XSLTUtils.cpp in Sources */, 7C15DCBC1892481400FCE564 /* InfoBool.cpp in Sources */, + 395C2A1F1A9F96A700EBC7AD /* ContextItemAddon.cpp in Sources */, F5CC228B1814F7E9006B5E91 /* AESinkDARWINOSX.cpp in Sources */, F5CC22EB1814FF3B006B5E91 /* ActiveAE.cpp in Sources */, F5CC22EC1814FF3B006B5E91 /* ActiveAEBuffer.cpp in Sources */, @@ -10058,7 +11023,6 @@ 7C8AE84E189DE3CD00C33786 /* CoreAudioChannelLayout.cpp in Sources */, 7C8AE84F189DE3CD00C33786 /* CoreAudioDevice.cpp in Sources */, 7C8AE850189DE3CD00C33786 /* CoreAudioHardware.cpp in Sources */, - DF5E699A1B28121E009A88C3 /* PVRTimerType.cpp in Sources */, 7C8AE851189DE3CD00C33786 /* CoreAudioStream.cpp in Sources */, 7C8AE854189DE47F00C33786 /* CoreAudioHelpers.cpp in Sources */, 7CF0504B190A1D7200222135 /* FFmpeg.cpp in Sources */, @@ -10086,8 +11050,6 @@ 7CCDA147192753E30074CF51 /* PltHttpServerTask.cpp in Sources */, 7CCDA150192753E30074CF51 /* PltIconsData.cpp in Sources */, 7CCDA159192753E30074CF51 /* PltMimeType.cpp in Sources */, - 7C973CF51B5037EF0002A874 /* ActiveAEDSPProcess.cpp in Sources */, - 7C8E021F1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp in Sources */, 7CCDA162192753E30074CF51 /* PltProtocolInfo.cpp in Sources */, 7CCDA16B192753E30074CF51 /* PltService.cpp in Sources */, 7CCDA174192753E30074CF51 /* PltSsdp.cpp in Sources */, @@ -10103,7 +11065,6 @@ 7CCDA1D0192753E30074CF51 /* PltMediaRenderer.cpp in Sources */, 3961C4391ABC0A46002DBBFB /* UISoundsResource.cpp in Sources */, 7CCDA1DB192753E30074CF51 /* RdrConnectionManagerSCPD.cpp in Sources */, - DF29BCEB1B5D911800904347 /* AddonManagementEvent.cpp in Sources */, 7CCDA1E6192753E30074CF51 /* RenderingControlSCPD.cpp in Sources */, 7CCDA1F3192753E30074CF51 /* ConnectionManagerSCPD.cpp in Sources */, 7CCDA1FE192753E30074CF51 /* ContentDirectorySCPD.cpp in Sources */, @@ -10115,7 +11076,6 @@ 7CCDA238192753E30074CF51 /* PltMediaItem.cpp in Sources */, 7CCDA241192753E30074CF51 /* PltMediaServer.cpp in Sources */, 7CCDA24A192753E30074CF51 /* PltSyncMediaBrowser.cpp in Sources */, - DF0E4ACF1AD5984600A75430 /* PVRRadioRDSInfoTag.cpp in Sources */, 7CCDA779192756250074CF51 /* Neptune.cpp in Sources */, 7CCDA782192756250074CF51 /* NptAutomaticCleaner.cpp in Sources */, 7CCDA785192756250074CF51 /* NptBase64.cpp in Sources */, @@ -10125,14 +11085,12 @@ 7CCDA7A3192756250074CF51 /* NptCrypto.cpp in Sources */, 7CCDA7A6192756250074CF51 /* NptDataBuffer.cpp in Sources */, DF4BF0161A4EF30F0053AC56 /* cc_decoder708.cpp in Sources */, - 7C8E021C1BA35D0B0072E8B2 /* AndroidBuiltins.cpp in Sources */, 7CCDA7AF192756250074CF51 /* NptDebug.cpp in Sources */, 7CCDA7B8192756250074CF51 /* NptDigest.cpp in Sources */, 399442741A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */, 7CCDA7BB192756250074CF51 /* NptDynamicLibraries.cpp in Sources */, 7CCDA7BE192756250074CF51 /* NptFile.cpp in Sources */, 7CCDA7C7192756250074CF51 /* NptHash.cpp in Sources */, - DF1D2DED1B6E85EE002BB9DB /* XbtDirectory.cpp in Sources */, 7CCDA7D0192756250074CF51 /* NptHttp.cpp in Sources */, 7CCDA7D9192756250074CF51 /* NptJson.cpp in Sources */, 7CCDA7DC192756250074CF51 /* NptList.cpp in Sources */, @@ -10145,10 +11103,8 @@ 395C29FB1A9CD20C00EBC7AD /* ContextMenuManager.cpp in Sources */, 7CCDA80F192756250074CF51 /* NptSimpleMessageQueue.cpp in Sources */, 7CCDA818192756250074CF51 /* NptSockets.cpp in Sources */, - 7C973CF31B5037EF0002A874 /* ActiveAEDSPDatabase.cpp in Sources */, 7CCDA821192756250074CF51 /* NptStreams.cpp in Sources */, 7CCDA82A192756250074CF51 /* NptStrings.cpp in Sources */, - 7C973CF41B5037EF0002A874 /* ActiveAEDSPMode.cpp in Sources */, 7CCDA833192756250074CF51 /* NptSystem.cpp in Sources */, 7CCDA83C192756250074CF51 /* NptThreads.cpp in Sources */, 7CCDA845192756250074CF51 /* NptTime.cpp in Sources */, @@ -10164,7 +11120,6 @@ 7CCDAA8E192756250074CF51 /* NptPosixQueue.cpp in Sources */, 7CCDAA97192756250074CF51 /* NptPosixSystem.cpp in Sources */, 7CCDAAA0192756250074CF51 /* NptPosixThreads.cpp in Sources */, - 7C8E02311BA35D0B0072E8B2 /* LibraryBuiltins.cpp in Sources */, 7CCDAAA9192756250074CF51 /* NptPosixTime.cpp in Sources */, 7CCDAAB2192756250074CF51 /* NptSelectableMessageQueue.cpp in Sources */, 7CCDAC8619275CA70074CF51 /* NptBsdNetwork.cpp in Sources */, @@ -10172,7 +11127,6 @@ 7CCDAC9219275CA70074CF51 /* NptBsdSockets.cpp in Sources */, 7CCDACA719275D1F0074CF51 /* NptStdcDebug.cpp in Sources */, 7CCDACB019275D1F0074CF51 /* NptStdcEnvironment.cpp in Sources */, - DF4A3BB21B4B0FC100F9CDC0 /* ApplicationMessenger.cpp in Sources */, 7CCDACC119275D790074CF51 /* NptAppleAutoreleasePool.mm in Sources */, 7CCDACCA19275D790074CF51 /* NptAppleLogConfig.mm in Sources */, 7CAA469019427AED00008885 /* PosixDirectory.cpp in Sources */, @@ -10181,12 +11135,1041 @@ 7C525DF5195E2D8100BE3482 /* SaveFileStateJob.cpp in Sources */, 7C908894196358A8003D0619 /* auto_buffer.cpp in Sources */, 7CF34D9F1930264A00D543C5 /* AudioEncoder.cpp in Sources */, - 7C973CFA1B5038580002A874 /* GUIDialogAudioDSPManager.cpp in Sources */, 7CF80DC919710DC2003B2B34 /* KeyboardLayout.cpp in Sources */, - DF2863B719918B07008994AB /* Gif.cpp in Sources */, - B179BD6B1AD8EA7B00EA8D49 /* InputCodingTableBaiduPY.cpp in Sources */, - B179BD6E1AD8EA7B00EA8D49 /* InputCodingTableBasePY.cpp in Sources */, - B179BD711AD8EA7B00EA8D49 /* InputCodingTableFactory.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DFFC52C717527B3100C937AB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5EE4F9171A9FF2AE002E20F8 /* CueInfoLoader.cpp in Sources */, + 5EE4F9161A9FF0F7002E20F8 /* ReplayGain.cpp in Sources */, + DFF0F0EF17528350002DA3A4 /* archive.cpp in Sources */, + DFF0F0F017528350002DA3A4 /* arcread.cpp in Sources */, + DFF0F0F117528350002DA3A4 /* cmddata.cpp in Sources */, + DFF0F0F217528350002DA3A4 /* consio.cpp in Sources */, + DFF0F0F317528350002DA3A4 /* crc.cpp in Sources */, + DFF0F0F417528350002DA3A4 /* crypt.cpp in Sources */, + DFF0F0F517528350002DA3A4 /* encname.cpp in Sources */, + DFF0F0F617528350002DA3A4 /* errhnd.cpp in Sources */, + DFF0F0F717528350002DA3A4 /* extinfo.cpp in Sources */, + DFF0F0F817528350002DA3A4 /* extract.cpp in Sources */, + DFF0F0F917528350002DA3A4 /* filcreat.cpp in Sources */, + DFF0F0FA17528350002DA3A4 /* file.cpp in Sources */, + DFF0F0FB17528350002DA3A4 /* filefn.cpp in Sources */, + DFF0F0FC17528350002DA3A4 /* filestr.cpp in Sources */, + DFF0F0FD17528350002DA3A4 /* find.cpp in Sources */, + DFF0F0FE17528350002DA3A4 /* getbits.cpp in Sources */, + DFF0F0FF17528350002DA3A4 /* global.cpp in Sources */, + DFF0F10017528350002DA3A4 /* int64.cpp in Sources */, + DFF0F10117528350002DA3A4 /* isnt.cpp in Sources */, + DFF0F10217528350002DA3A4 /* log.cpp in Sources */, + DFF0F10317528350002DA3A4 /* match.cpp in Sources */, + DFF0F10417528350002DA3A4 /* options.cpp in Sources */, + DFF0F10517528350002DA3A4 /* pathfn.cpp in Sources */, + DFF0F10617528350002DA3A4 /* rar.cpp in Sources */, + DFF0F10717528350002DA3A4 /* rarvm.cpp in Sources */, + DFF0F10817528350002DA3A4 /* rawread.cpp in Sources */, + DFF0F10917528350002DA3A4 /* rdwrfn.cpp in Sources */, + DFF0F10A17528350002DA3A4 /* recvol.cpp in Sources */, + DFF0F10B17528350002DA3A4 /* resource.cpp in Sources */, + DFF0F10C17528350002DA3A4 /* rijndael.cpp in Sources */, + DFF0F10D17528350002DA3A4 /* rs.cpp in Sources */, + DFF0F10E17528350002DA3A4 /* savepos.cpp in Sources */, + DFF0F10F17528350002DA3A4 /* scantree.cpp in Sources */, + DFF0F11017528350002DA3A4 /* sha1.cpp in Sources */, + 395C29FD1A9CD20C00EBC7AD /* ContextMenuManager.cpp in Sources */, + DFF0F11117528350002DA3A4 /* strfn.cpp in Sources */, + DFF0F11217528350002DA3A4 /* strlist.cpp in Sources */, + DFF0F11317528350002DA3A4 /* system.cpp in Sources */, + DFF0F11417528350002DA3A4 /* timefn.cpp in Sources */, + 395C29E51A98A15700EBC7AD /* HTTPPythonHandler.cpp in Sources */, + DFF0F11517528350002DA3A4 /* ulinks.cpp in Sources */, + DFF0F11617528350002DA3A4 /* unicode.cpp in Sources */, + DFF0F11717528350002DA3A4 /* unpack.cpp in Sources */, + DFF0F11817528350002DA3A4 /* volume.cpp in Sources */, + DFF0F11917528350002DA3A4 /* Addon.cpp in Sources */, + DFF0F11A17528350002DA3A4 /* AddonCallbacks.cpp in Sources */, + DFF0F11B17528350002DA3A4 /* AddonCallbacksAddon.cpp in Sources */, + DFF0F11C17528350002DA3A4 /* AddonCallbacksGUI.cpp in Sources */, + DFF0F11D17528350002DA3A4 /* AddonCallbacksPVR.cpp in Sources */, + DFF0F11E17528350002DA3A4 /* AddonDatabase.cpp in Sources */, + DFF0F11F17528350002DA3A4 /* AddonInstaller.cpp in Sources */, + DFF0F12017528350002DA3A4 /* AddonManager.cpp in Sources */, + DFF0F12117528350002DA3A4 /* AddonStatusHandler.cpp in Sources */, + DFF0F12217528350002DA3A4 /* AddonVersion.cpp in Sources */, + DFF0F12317528350002DA3A4 /* GUIDialogAddonInfo.cpp in Sources */, + DFF0F12417528350002DA3A4 /* GUIDialogAddonSettings.cpp in Sources */, + DFF0F12517528350002DA3A4 /* GUIViewStateAddonBrowser.cpp in Sources */, + DFF0F12617528350002DA3A4 /* GUIWindowAddonBrowser.cpp in Sources */, + DFF0F12717528350002DA3A4 /* PluginSource.cpp in Sources */, + DFF0F12817528350002DA3A4 /* Repository.cpp in Sources */, + DFF0F12917528350002DA3A4 /* Scraper.cpp in Sources */, + DFF0F12A17528350002DA3A4 /* ScreenSaver.cpp in Sources */, + 395C2A261AA4C32100EBC7AD /* AudioDecoder.cpp in Sources */, + DFF0F12B17528350002DA3A4 /* Service.cpp in Sources */, + DFF0F12C17528350002DA3A4 /* Skin.cpp in Sources */, + DFF0F12D17528350002DA3A4 /* Visualisation.cpp in Sources */, + DFF0F12E17528350002DA3A4 /* CDDARipJob.cpp in Sources */, + DFF0F12F17528350002DA3A4 /* CDDARipper.cpp in Sources */, + DFF0F13017528350002DA3A4 /* Encoder.cpp in Sources */, + DFF0F13117528350002DA3A4 /* EncoderFFmpeg.cpp in Sources */, + DFF0F13617528350002DA3A4 /* Exception.cpp in Sources */, + DFF0F13717528350002DA3A4 /* ilog.cpp in Sources */, + DFF0F13817528350002DA3A4 /* AEEncoderFFmpeg.cpp in Sources */, + 399442791A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */, + DFF0F13E17528350002DA3A4 /* AEBitstreamPacker.cpp in Sources */, + DFF0F13F17528350002DA3A4 /* AEBuffer.cpp in Sources */, + DFF0F14017528350002DA3A4 /* AEChannelInfo.cpp in Sources */, + DFF0F14217528350002DA3A4 /* AEDeviceInfo.cpp in Sources */, + DFF0F14317528350002DA3A4 /* AELimiter.cpp in Sources */, + DFF0F14417528350002DA3A4 /* AEPackIEC61937.cpp in Sources */, + DFF0F14617528350002DA3A4 /* AEStreamInfo.cpp in Sources */, + DFF0F14717528350002DA3A4 /* AEUtil.cpp in Sources */, + 42DAC1701A6E789E0066B4C8 /* PVRActionListener.cpp in Sources */, + DFF0F14917528350002DA3A4 /* AEFactory.cpp in Sources */, + DFF0F14A17528350002DA3A4 /* EmuFileWrapper.cpp in Sources */, + DFF0F14B17528350002DA3A4 /* emu_dummy.cpp in Sources */, + DFF0F14C17528350002DA3A4 /* emu_kernel32.cpp in Sources */, + DFF0F14D17528350002DA3A4 /* emu_msvcrt.cpp in Sources */, + DFF0F14E17528350002DA3A4 /* coff.cpp in Sources */, + DFF0F14F17528350002DA3A4 /* dll.cpp in Sources */, + DFF0F15017528350002DA3A4 /* dll_tracker.cpp in Sources */, + DFF0F15117528350002DA3A4 /* dll_tracker_file.cpp in Sources */, + DFF0F15217528350002DA3A4 /* dll_tracker_library.cpp in Sources */, + DFF0F15317528350002DA3A4 /* dll_util.cpp in Sources */, + DFF0F15417528350002DA3A4 /* DllLoader.cpp in Sources */, + DFF0F15517528350002DA3A4 /* DllLoaderContainer.cpp in Sources */, + DFF0F15617528350002DA3A4 /* LibraryLoader.cpp in Sources */, + DFF0F15717528350002DA3A4 /* SoLoader.cpp in Sources */, + 395C29EF1A98A16300EBC7AD /* HTTPPythonInvoker.cpp in Sources */, + DFF0F15817528350002DA3A4 /* DVDAudioCodecFFmpeg.cpp in Sources */, + DFF0F15B17528350002DA3A4 /* DVDAudioCodecPassthrough.cpp in Sources */, + DFF0F15E17528350002DA3A4 /* DVDOverlayCodec.cpp in Sources */, + DFF0F16017528350002DA3A4 /* DVDOverlayCodecFFmpeg.cpp in Sources */, + DFF0F16117528350002DA3A4 /* DVDOverlayCodecSSA.cpp in Sources */, + DFF0F16217528350002DA3A4 /* DVDOverlayCodecText.cpp in Sources */, + DFF0F16317528350002DA3A4 /* DVDOverlayCodecTX3G.cpp in Sources */, + DFF0F16617528350002DA3A4 /* DVDVideoCodecFFmpeg.cpp in Sources */, + 397877D71AAAF87700F98A45 /* Speed.cpp in Sources */, + DFF0F16717528350002DA3A4 /* DVDVideoCodecLibMpeg2.cpp in Sources */, + DFF0F16817528350002DA3A4 /* DVDVideoCodecVDA.cpp in Sources */, + DFF0F16917528350002DA3A4 /* DVDVideoPPFFmpeg.cpp in Sources */, + DFF0F16A17528350002DA3A4 /* DVDDemux.cpp in Sources */, + DFF0F16B17528350002DA3A4 /* DVDDemuxBXA.cpp in Sources */, + DFF0F16C17528350002DA3A4 /* DVDDemuxCDDA.cpp in Sources */, + DFF0F16D17528350002DA3A4 /* DVDDemuxFFmpeg.cpp in Sources */, + DFF0F16F17528350002DA3A4 /* DVDDemuxPVRClient.cpp in Sources */, + DFF0F17017528350002DA3A4 /* DVDDemuxShoutcast.cpp in Sources */, + DFF0F17117528350002DA3A4 /* DVDDemuxUtils.cpp in Sources */, + DFF0F17217528350002DA3A4 /* DVDDemuxVobsub.cpp in Sources */, + DFF0F17317528350002DA3A4 /* DVDFactoryDemuxer.cpp in Sources */, + DFF0F17417528350002DA3A4 /* DVDFactoryInputStream.cpp in Sources */, + DFF0F17517528350002DA3A4 /* DVDInputStream.cpp in Sources */, + DFF0F17617528350002DA3A4 /* DVDInputStreamBluray.cpp in Sources */, + DFF0F17717528350002DA3A4 /* DVDInputStreamFFmpeg.cpp in Sources */, + DFF0F17817528350002DA3A4 /* DVDInputStreamFile.cpp in Sources */, + DFF0F17A17528350002DA3A4 /* DVDInputStreamHttp.cpp in Sources */, + DFF0F17B17528350002DA3A4 /* DVDInputStreamMemory.cpp in Sources */, + DFF0F17C17528350002DA3A4 /* DVDInputStreamNavigator.cpp in Sources */, + DFF0F17D17528350002DA3A4 /* DVDInputStreamPVRManager.cpp in Sources */, + DFF0F17E17528350002DA3A4 /* DVDInputStreamRTMP.cpp in Sources */, + DFF0F17F17528350002DA3A4 /* DVDInputStreamTV.cpp in Sources */, + DFF0F18017528350002DA3A4 /* DVDStateSerializer.cpp in Sources */, + DFF0F18117528350002DA3A4 /* DVDSubtitleParserSSA.cpp in Sources */, + DFF0F18217528350002DA3A4 /* DVDSubtitlesLibass.cpp in Sources */, + DFF0F18317528350002DA3A4 /* DVDSubtitleParserMicroDVD.cpp in Sources */, + DFF0F18417528350002DA3A4 /* DVDSubtitleParserMPL2.cpp in Sources */, + DFF0F18517528350002DA3A4 /* DVDSubtitleParserSami.cpp in Sources */, + DFF0F18617528350002DA3A4 /* DVDFactorySubtitle.cpp in Sources */, + DFF0F18717528350002DA3A4 /* DVDSubtitleLineCollection.cpp in Sources */, + DFF0F18817528350002DA3A4 /* DVDSubtitleParserSubrip.cpp in Sources */, + DFF0F18917528350002DA3A4 /* DVDSubtitleParserVplayer.cpp in Sources */, + DFF0F18A17528350002DA3A4 /* DVDSubtitleStream.cpp in Sources */, + DFF0F18B17528350002DA3A4 /* DVDSubtitleTagMicroDVD.cpp in Sources */, + DFF0F18C17528350002DA3A4 /* DVDSubtitleTagSami.cpp in Sources */, + DFF0F18D17528350002DA3A4 /* DVDAudio.cpp in Sources */, + DFF0F18E17528350002DA3A4 /* DVDClock.cpp in Sources */, + DF56EF261A798A5E00CAAEFB /* HttpRangeUtils.cpp in Sources */, + DFF0F18F17528350002DA3A4 /* DVDDemuxSPU.cpp in Sources */, + DFF0F19017528350002DA3A4 /* DVDFileInfo.cpp in Sources */, + DFF0F19117528350002DA3A4 /* DVDMessage.cpp in Sources */, + DFF0F19217528350002DA3A4 /* DVDMessageQueue.cpp in Sources */, + DFF0F19417528350002DA3A4 /* DVDOverlayContainer.cpp in Sources */, + DFF0F19517528350002DA3A4 /* DVDOverlayRenderer.cpp in Sources */, + DFF0F19717528350002DA3A4 /* DVDPlayer.cpp in Sources */, + DFF0F19817528350002DA3A4 /* DVDPlayerAudio.cpp in Sources */, + DFF0F19917528350002DA3A4 /* DVDPlayerSubtitle.cpp in Sources */, + DFF0F19A17528350002DA3A4 /* DVDPlayerTeletext.cpp in Sources */, + B542632D197D353B00726998 /* PosixInterfaceForCLog.cpp in Sources */, + DFF0F19B17528350002DA3A4 /* DVDPlayerVideo.cpp in Sources */, + DFF0F19C17528350002DA3A4 /* DVDStreamInfo.cpp in Sources */, + DFF0F19D17528350002DA3A4 /* DVDTSCorrection.cpp in Sources */, + B5011E4319AF3B56005ADF89 /* PosixFile.cpp in Sources */, + DFF0F19E17528350002DA3A4 /* Edl.cpp in Sources */, + DFF0F19F17528350002DA3A4 /* ExternalPlayer.cpp in Sources */, + DFF0F1A217528350002DA3A4 /* AudioDecoder.cpp in Sources */, + DFF0F1A317528350002DA3A4 /* CodecFactory.cpp in Sources */, + DFF0F1A417528350002DA3A4 /* DVDPlayerCodec.cpp in Sources */, + DFF0F1AB17528350002DA3A4 /* PAPlayer.cpp in Sources */, + DFF0F1B317528350002DA3A4 /* PlayerCoreFactory.cpp in Sources */, + DFF0F1B417528350002DA3A4 /* PlayerSelectionRule.cpp in Sources */, + DFF0F1B517528350002DA3A4 /* ConvolutionKernels.cpp in Sources */, + DFF0F1B617528350002DA3A4 /* VideoFilterShader.cpp in Sources */, + DFF0F1B717528350002DA3A4 /* YUV2RGBShader.cpp in Sources */, + DFF0F1B817528350002DA3A4 /* BaseRenderer.cpp in Sources */, + DFF0F1B917528350002DA3A4 /* OverlayRenderer.cpp in Sources */, + DFF0F1BA17528350002DA3A4 /* OverlayRendererGL.cpp in Sources */, + DFF0F1BB17528350002DA3A4 /* OverlayRendererUtil.cpp in Sources */, + DFF0F1BC17528350002DA3A4 /* RenderCapture.cpp in Sources */, + DFF0F1BD17528350002DA3A4 /* RenderManager.cpp in Sources */, + DFF0F1BE17528350002DA3A4 /* DummyVideoPlayer.cpp in Sources */, + DFF0F1BF17528350002DA3A4 /* Database.cpp in Sources */, + DFF0F1C017528350002DA3A4 /* dataset.cpp in Sources */, + DFF0F1C117528350002DA3A4 /* mysqldataset.cpp in Sources */, + DFF0F1C217528350002DA3A4 /* qry_dat.cpp in Sources */, + DFF0F1C317528350002DA3A4 /* sqlitedataset.cpp in Sources */, + DFF0F1C417528350002DA3A4 /* Epg.cpp in Sources */, + DFF0F1C517528350002DA3A4 /* EpgContainer.cpp in Sources */, + DFF0F1C617528350002DA3A4 /* EpgDatabase.cpp in Sources */, + DFF0F1C717528350002DA3A4 /* EpgInfoTag.cpp in Sources */, + DFF0F1C817528350002DA3A4 /* EpgSearchFilter.cpp in Sources */, + DFF0F1C917528350002DA3A4 /* GUIEPGGridContainer.cpp in Sources */, + DFF0F1CA17528350002DA3A4 /* GUIDialogBoxBase.cpp in Sources */, + DFF0F1CB17528350002DA3A4 /* GUIDialogBusy.cpp in Sources */, + DFF0F1CC17528350002DA3A4 /* GUIDialogButtonMenu.cpp in Sources */, + DFF0F1CD17528350002DA3A4 /* GUIDialogCache.cpp in Sources */, + DFF0F1CE17528350002DA3A4 /* GUIDialogContextMenu.cpp in Sources */, + DFF0F1CF17528350002DA3A4 /* GUIDialogExtendedProgressBar.cpp in Sources */, + DFF0F1D017528350002DA3A4 /* GUIDialogFavourites.cpp in Sources */, + DFF0F1D117528350002DA3A4 /* GUIDialogFileBrowser.cpp in Sources */, + DF6A0D861A4584E80075BBFC /* OverrideFile.cpp in Sources */, + DFF0F1D217528350002DA3A4 /* GUIDialogGamepad.cpp in Sources */, + DFF0F1D317528350002DA3A4 /* GUIDialogKaiToast.cpp in Sources */, + DFF0F1D417528350002DA3A4 /* GUIDialogKeyboardGeneric.cpp in Sources */, + DFF0F1D517528350002DA3A4 /* GUIDialogMediaFilter.cpp in Sources */, + DFF0F1D617528350002DA3A4 /* GUIDialogMediaSource.cpp in Sources */, + DFF0F1D717528350002DA3A4 /* GUIDialogMuteBug.cpp in Sources */, + DFF0F1D817528350002DA3A4 /* GUIDialogNumeric.cpp in Sources */, + DFF0F1D917528350002DA3A4 /* GUIDialogOK.cpp in Sources */, + DFF0F1DA17528350002DA3A4 /* GUIDialogPlayEject.cpp in Sources */, + DFF0F1DB17528350002DA3A4 /* GUIDialogPlayerControls.cpp in Sources */, + DFF0F1DC17528350002DA3A4 /* GUIDialogProgress.cpp in Sources */, + DFF0F1DD17528350002DA3A4 /* GUIDialogSeekBar.cpp in Sources */, + DFF0F1DE17528350002DA3A4 /* GUIDialogSelect.cpp in Sources */, + DFF0F1DF17528350002DA3A4 /* GUIDialogSlider.cpp in Sources */, + DFF0F1E017528350002DA3A4 /* GUIDialogSmartPlaylistEditor.cpp in Sources */, + DFF0F1E117528350002DA3A4 /* GUIDialogSmartPlaylistRule.cpp in Sources */, + DFF0F1E217528350002DA3A4 /* GUIDialogSubMenu.cpp in Sources */, + DFF0F1E317528350002DA3A4 /* GUIDialogTextViewer.cpp in Sources */, + DFF0F1E417528350002DA3A4 /* GUIDialogVolumeBar.cpp in Sources */, + DFF0F1E517528350002DA3A4 /* GUIDialogYesNo.cpp in Sources */, + DFF0F1E617528350002DA3A4 /* AddonsDirectory.cpp in Sources */, + DFF0F1EA17528350002DA3A4 /* BlurayDirectory.cpp in Sources */, + DFF0F1EB17528350002DA3A4 /* CacheStrategy.cpp in Sources */, + DFF0F1EC17528350002DA3A4 /* CDDADirectory.cpp in Sources */, + DFF0F1ED17528350002DA3A4 /* CDDAFile.cpp in Sources */, + DFF0F1EE17528350002DA3A4 /* CircularCache.cpp in Sources */, + DFF0F1EF17528350002DA3A4 /* CurlFile.cpp in Sources */, + DFF0F1F217528350002DA3A4 /* DAVCommon.cpp in Sources */, + DFF0F1F317528350002DA3A4 /* DAVDirectory.cpp in Sources */, + DFF0F1F417528350002DA3A4 /* DAVFile.cpp in Sources */, + DFF0F1F517528350002DA3A4 /* Directory.cpp in Sources */, + DFF0F1F617528350002DA3A4 /* DirectoryCache.cpp in Sources */, + DFF0F1F717528350002DA3A4 /* DirectoryFactory.cpp in Sources */, + DFF0F1F817528350002DA3A4 /* DirectoryHistory.cpp in Sources */, + DFF0F1F917528350002DA3A4 /* DllLibCurl.cpp in Sources */, + DFF0F1FA17528350002DA3A4 /* File.cpp in Sources */, + DFF0F1FB17528350002DA3A4 /* FileCache.cpp in Sources */, + DFF0F1FC17528350002DA3A4 /* FileDirectoryFactory.cpp in Sources */, + DFF0F1FD17528350002DA3A4 /* FileFactory.cpp in Sources */, + DFF0F1FE17528350002DA3A4 /* FileReaderFile.cpp in Sources */, + DFF0F1FF17528350002DA3A4 /* FTPDirectory.cpp in Sources */, + DFF0F20017528350002DA3A4 /* FTPParse.cpp in Sources */, + DFF0F20317528350002DA3A4 /* HDHomeRunDirectory.cpp in Sources */, + DFF0F20417528350002DA3A4 /* HDHomeRunFile.cpp in Sources */, + 395F6DE41A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */, + DFF0F20717528350002DA3A4 /* HTTPDirectory.cpp in Sources */, + DFF0F20817528350002DA3A4 /* HTTPFile.cpp in Sources */, + DFF0F20917528350002DA3A4 /* IDirectory.cpp in Sources */, + DFF0F20A17528350002DA3A4 /* IFile.cpp in Sources */, + DFF0F20B17528350002DA3A4 /* ImageFile.cpp in Sources */, + DFF0F20C17528350002DA3A4 /* iso9660.cpp in Sources */, + DFF0F20D17528350002DA3A4 /* ISO9660Directory.cpp in Sources */, + DFF0F20E17528350002DA3A4 /* ISOFile.cpp in Sources */, + DFF0F20F17528350002DA3A4 /* LibraryDirectory.cpp in Sources */, + DFF0F21017528350002DA3A4 /* MemBufferCache.cpp in Sources */, + DFF0F21117528350002DA3A4 /* MultiPathDirectory.cpp in Sources */, + DFF0F21217528350002DA3A4 /* MultiPathFile.cpp in Sources */, + DFF0F21317528350002DA3A4 /* DirectoryNode.cpp in Sources */, + DFF0F21417528350002DA3A4 /* DirectoryNodeAlbum.cpp in Sources */, + DFF0F21517528350002DA3A4 /* DirectoryNodeAlbumCompilations.cpp in Sources */, + DFF0F21617528350002DA3A4 /* DirectoryNodeAlbumCompilationsSongs.cpp in Sources */, + DFF0F21717528350002DA3A4 /* DirectoryNodeAlbumRecentlyAdded.cpp in Sources */, + DFF0F21817528350002DA3A4 /* DirectoryNodeAlbumRecentlyAddedSong.cpp in Sources */, + DFF0F21917528350002DA3A4 /* DirectoryNodeAlbumRecentlyPlayed.cpp in Sources */, + DFF0F21A17528350002DA3A4 /* DirectoryNodeAlbumRecentlyPlayedSong.cpp in Sources */, + DFF0F21B17528350002DA3A4 /* DirectoryNodeAlbumTop100.cpp in Sources */, + DFF0F21C17528350002DA3A4 /* DirectoryNodeAlbumTop100Song.cpp in Sources */, + DFF0F21D17528350002DA3A4 /* DirectoryNodeArtist.cpp in Sources */, + DFF0F21E17528350002DA3A4 /* DirectoryNodeGrouped.cpp in Sources */, + DFF0F21F17528350002DA3A4 /* DirectoryNodeOverview.cpp in Sources */, + DFF0F22017528350002DA3A4 /* DirectoryNodeRoot.cpp in Sources */, + DFF0F22117528350002DA3A4 /* DirectoryNodeSingles.cpp in Sources */, + DFF0F22217528350002DA3A4 /* DirectoryNodeSong.cpp in Sources */, + DFF0F22317528350002DA3A4 /* DirectoryNodeSongTop100.cpp in Sources */, + DFF0F22417528350002DA3A4 /* DirectoryNodeTop100.cpp in Sources */, + DFF0F22517528350002DA3A4 /* DirectoryNodeYearAlbum.cpp in Sources */, + DFF0F22617528350002DA3A4 /* DirectoryNodeYearSong.cpp in Sources */, + DFF0F22717528350002DA3A4 /* QueryParams.cpp in Sources */, + DFF0F22817528350002DA3A4 /* MusicDatabaseDirectory.cpp in Sources */, + DFF0F22917528350002DA3A4 /* MusicDatabaseFile.cpp in Sources */, + DFF0F22A17528350002DA3A4 /* MusicFileDirectory.cpp in Sources */, + DFF0F22B17528350002DA3A4 /* MusicSearchDirectory.cpp in Sources */, + DFF0F22F17528350002DA3A4 /* NFSDirectory.cpp in Sources */, + DFF0F23017528350002DA3A4 /* NFSFile.cpp in Sources */, + DFF0F23117528350002DA3A4 /* NptXbmcFile.cpp in Sources */, + 395C29D71A98A11C00EBC7AD /* WsgiErrorStream.cpp in Sources */, + DFF0F23417528350002DA3A4 /* PipeFile.cpp in Sources */, + DFF0F23517528350002DA3A4 /* PipesManager.cpp in Sources */, + DFF0F23617528350002DA3A4 /* PlaylistDirectory.cpp in Sources */, + DFF0F23717528350002DA3A4 /* PlaylistFileDirectory.cpp in Sources */, + DFF0F23817528350002DA3A4 /* PluginDirectory.cpp in Sources */, + DFF0F23917528350002DA3A4 /* PVRDirectory.cpp in Sources */, + DFF0F23A17528350002DA3A4 /* PVRFile.cpp in Sources */, + DFF0F23B17528350002DA3A4 /* RarDirectory.cpp in Sources */, + DFF0F23C17528350002DA3A4 /* RarFile.cpp in Sources */, + DFF0F23D17528350002DA3A4 /* RarManager.cpp in Sources */, + DFF0F23E17528350002DA3A4 /* RSSDirectory.cpp in Sources */, + DFF0F24117528350002DA3A4 /* SAPDirectory.cpp in Sources */, + DFF0F24217528350002DA3A4 /* SAPFile.cpp in Sources */, + DFF0F24317528350002DA3A4 /* SFTPDirectory.cpp in Sources */, + 395C29C71A98A0E100EBC7AD /* ILanguageInvoker.cpp in Sources */, + DFF0F24417528350002DA3A4 /* SFTPFile.cpp in Sources */, + DFF0F24517528350002DA3A4 /* ShoutcastFile.cpp in Sources */, + DFF0F24717528350002DA3A4 /* SlingboxDirectory.cpp in Sources */, + DFF0F24817528350002DA3A4 /* SlingboxFile.cpp in Sources */, + DFF0F24917528350002DA3A4 /* SmartPlaylistDirectory.cpp in Sources */, + DFF0F24A17528350002DA3A4 /* SMBDirectory.cpp in Sources */, + DFF0F24B17528350002DA3A4 /* SMBFile.cpp in Sources */, + DFF0F24C17528350002DA3A4 /* SourcesDirectory.cpp in Sources */, + DFF0F24D17528350002DA3A4 /* SpecialProtocol.cpp in Sources */, + DFF0F24E17528350002DA3A4 /* SpecialProtocolDirectory.cpp in Sources */, + DFF0F24F17528350002DA3A4 /* SpecialProtocolFile.cpp in Sources */, + 395897171AAD94F00033D27C /* KeyboardLayoutManager.cpp in Sources */, + DFF0F25017528350002DA3A4 /* StackDirectory.cpp in Sources */, + DFF0F25317528350002DA3A4 /* udf25.cpp in Sources */, + DFF0F25417528350002DA3A4 /* UDFDirectory.cpp in Sources */, + DFF0F25517528350002DA3A4 /* UDFFile.cpp in Sources */, + DFF0F25617528350002DA3A4 /* UPnPDirectory.cpp in Sources */, + DFF0F25717528350002DA3A4 /* UPnPFile.cpp in Sources */, + DFF0F25817528350002DA3A4 /* DirectoryNode.cpp in Sources */, + DFF0F25917528350002DA3A4 /* DirectoryNodeEpisodes.cpp in Sources */, + DFF0F25A17528350002DA3A4 /* DirectoryNodeGrouped.cpp in Sources */, + DFF0F25B17528350002DA3A4 /* DirectoryNodeMoviesOverview.cpp in Sources */, + DFF0F25C17528350002DA3A4 /* DirectoryNodeMusicVideosOverview.cpp in Sources */, + DFF0F25D17528350002DA3A4 /* DirectoryNodeOverview.cpp in Sources */, + DFF0F25E17528350002DA3A4 /* DirectoryNodeRecentlyAddedEpisodes.cpp in Sources */, + DFF0F25F17528350002DA3A4 /* DirectoryNodeRecentlyAddedMovies.cpp in Sources */, + DFF0F26017528350002DA3A4 /* DirectoryNodeRecentlyAddedMusicVideos.cpp in Sources */, + DFF0F26117528350002DA3A4 /* DirectoryNodeRoot.cpp in Sources */, + DFF0F26217528350002DA3A4 /* DirectoryNodeSeasons.cpp in Sources */, + DFF0F26317528350002DA3A4 /* DirectoryNodeTitleMovies.cpp in Sources */, + 3994425D1A8DD8D0006C39E9 /* ProgressJob.cpp in Sources */, + DFF0F26417528350002DA3A4 /* DirectoryNodeTitleMusicVideos.cpp in Sources */, + DFF0F26517528350002DA3A4 /* DirectoryNodeTitleTvShows.cpp in Sources */, + DFF0F26617528350002DA3A4 /* DirectoryNodeTvShowsOverview.cpp in Sources */, + DFF0F26717528350002DA3A4 /* QueryParams.cpp in Sources */, + DFF0F26817528350002DA3A4 /* VideoDatabaseDirectory.cpp in Sources */, + DFF0F26917528350002DA3A4 /* VirtualDirectory.cpp in Sources */, + 395C29C31A98A0A000EBC7AD /* Webinterface.cpp in Sources */, + DFF0F26D17528350002DA3A4 /* ZeroconfDirectory.cpp in Sources */, + DFF0F26E17528350002DA3A4 /* ZipDirectory.cpp in Sources */, + DFF0F26F17528350002DA3A4 /* ZipFile.cpp in Sources */, + DFF0F27017528350002DA3A4 /* ZipManager.cpp in Sources */, + DFF0F27117528350002DA3A4 /* AnimatedGif.cpp in Sources */, + DFF0F27217528350002DA3A4 /* cximage.cpp in Sources */, + DFF0F27317528350002DA3A4 /* D3DResource.cpp in Sources */, + DFF0F27417528350002DA3A4 /* DDSImage.cpp in Sources */, + DFF0F27517528350002DA3A4 /* DirectXGraphics.cpp in Sources */, + DFF0F27617528350002DA3A4 /* DirtyRegionSolvers.cpp in Sources */, + DFF0F27717528350002DA3A4 /* DirtyRegionTracker.cpp in Sources */, + DFF0F27817528350002DA3A4 /* FrameBufferObject.cpp in Sources */, + DFF0F27917528350002DA3A4 /* GraphicContext.cpp in Sources */, + DFF0F27A17528350002DA3A4 /* GUIAction.cpp in Sources */, + DFF0F27B17528350002DA3A4 /* GUIAudioManager.cpp in Sources */, + DFF0F27C17528350002DA3A4 /* GUIBaseContainer.cpp in Sources */, + DFF0F27D17528350002DA3A4 /* GUIBorderedImage.cpp in Sources */, + DFF0F27E17528350002DA3A4 /* GUIButtonControl.cpp in Sources */, + DFF0F27F17528350002DA3A4 /* GUICheckMarkControl.cpp in Sources */, + DFF0F28017528350002DA3A4 /* GUIColorManager.cpp in Sources */, + DFF0F28117528350002DA3A4 /* GUIControl.cpp in Sources */, + DFF0F28217528350002DA3A4 /* GUIControlFactory.cpp in Sources */, + DFF0F28317528350002DA3A4 /* GUIControlGroup.cpp in Sources */, + DFF0F28417528350002DA3A4 /* GUIControlGroupList.cpp in Sources */, + DFF0F28517528350002DA3A4 /* GUIControlProfiler.cpp in Sources */, + DFF0F28617528350002DA3A4 /* GUIDialog.cpp in Sources */, + DFF0F28717528350002DA3A4 /* GUIEditControl.cpp in Sources */, + DFF0F28817528350002DA3A4 /* GUIFadeLabelControl.cpp in Sources */, + DFF0F28917528350002DA3A4 /* GUIFixedListContainer.cpp in Sources */, + 395C29DA1A98A11C00EBC7AD /* WsgiInputStream.cpp in Sources */, + DFF0F28A17528350002DA3A4 /* GUIFont.cpp in Sources */, + DFF0F28B17528350002DA3A4 /* GUIFontManager.cpp in Sources */, + DFF0F28C17528350002DA3A4 /* GUIFontTTF.cpp in Sources */, + DFF0F28D17528350002DA3A4 /* GUIFontTTFDX.cpp in Sources */, + DFF0F28E17528350002DA3A4 /* GUIFontTTFGL.cpp in Sources */, + DFF0F28F17528350002DA3A4 /* GUIImage.cpp in Sources */, + DFF0F29017528350002DA3A4 /* GUIIncludes.cpp in Sources */, + DFF0F29117528350002DA3A4 /* GUIInfoTypes.cpp in Sources */, + DFF0F29217528350002DA3A4 /* GUIKeyboardFactory.cpp in Sources */, + DFF0F29317528350002DA3A4 /* GUILabel.cpp in Sources */, + DFF0F29417528350002DA3A4 /* GUILabelControl.cpp in Sources */, + 395C2A061A9CD25100EBC7AD /* ContextItemAddonInvoker.cpp in Sources */, + DFF0F29517528350002DA3A4 /* GUIListContainer.cpp in Sources */, + DFF0F29617528350002DA3A4 /* GUIListGroup.cpp in Sources */, + DFF0F29717528350002DA3A4 /* GUIListItem.cpp in Sources */, + DFF0F29817528350002DA3A4 /* GUIListItemLayout.cpp in Sources */, + DFF0F29917528350002DA3A4 /* GUIListLabel.cpp in Sources */, + DFF0F29A17528350002DA3A4 /* GUIMessage.cpp in Sources */, + DFF0F29B17528350002DA3A4 /* GUIMoverControl.cpp in Sources */, + DFF0F29C17528350002DA3A4 /* GUIMultiImage.cpp in Sources */, + DFF0F29D17528350002DA3A4 /* GUIMultiSelectText.cpp in Sources */, + DFF0F29E17528350002DA3A4 /* GUIPanelContainer.cpp in Sources */, + DFF0F29F17528350002DA3A4 /* GUIProgressControl.cpp in Sources */, + DFF0F2A017528350002DA3A4 /* GUIRadioButtonControl.cpp in Sources */, + DFF0F2A117528350002DA3A4 /* GUIRenderingControl.cpp in Sources */, + DFF0F2A217528350002DA3A4 /* GUIResizeControl.cpp in Sources */, + DF4BF01A1A4EF31F0053AC56 /* cc_decoder708.cpp in Sources */, + 395C2A1B1A9F074C00EBC7AD /* Locale.cpp in Sources */, + DFF0F2A317528350002DA3A4 /* GUIRSSControl.cpp in Sources */, + DFF0F2A417528350002DA3A4 /* GUIScrollBarControl.cpp in Sources */, + DFF0F2A517528350002DA3A4 /* GUISelectButtonControl.cpp in Sources */, + DFF0F2A617528350002DA3A4 /* GUISettingsSliderControl.cpp in Sources */, + DFF0F2A717528350002DA3A4 /* GUIShader.cpp in Sources */, + 399442811A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */, + DFF0F2A817528350002DA3A4 /* GUISliderControl.cpp in Sources */, + DFF0F2A917528350002DA3A4 /* GUISpinControl.cpp in Sources */, + DFF0F2AA17528350002DA3A4 /* GUISpinControlEx.cpp in Sources */, + DFF0F2AB17528350002DA3A4 /* GUIStaticItem.cpp in Sources */, + DFF0F2AC17528350002DA3A4 /* GUITextBox.cpp in Sources */, + DFF0F2AD17528350002DA3A4 /* GUITextLayout.cpp in Sources */, + DFF0F2AE17528350002DA3A4 /* GUITexture.cpp in Sources */, + DFF0F2AF17528350002DA3A4 /* GUITextureD3D.cpp in Sources */, + DFF0F2B017528350002DA3A4 /* GUITextureGL.cpp in Sources */, + DFF0F2B117528350002DA3A4 /* GUITextureGLES.cpp in Sources */, + DFF0F2B217528350002DA3A4 /* GUIToggleButtonControl.cpp in Sources */, + DFF0F2B317528350002DA3A4 /* GUIVideoControl.cpp in Sources */, + DFF0F2B417528350002DA3A4 /* GUIVisualisationControl.cpp in Sources */, + DFF0F2B517528350002DA3A4 /* GUIWindow.cpp in Sources */, + DFF0F2B617528350002DA3A4 /* GUIWindowManager.cpp in Sources */, + DFF0F2B717528350002DA3A4 /* GUIWrappingListContainer.cpp in Sources */, + DFF0F2B817528350002DA3A4 /* imagefactory.cpp in Sources */, + DFF0F2B917528350002DA3A4 /* IWindowManagerCallback.cpp in Sources */, + DFF0F2BA17528350002DA3A4 /* JpegIO.cpp in Sources */, + 4260D5C91B67BB8F003F6F2D /* GUIWindowSplash.cpp in Sources */, + DFF0F2BC17528350002DA3A4 /* LocalizeStrings.cpp in Sources */, + DFF0F2BD17528350002DA3A4 /* MatrixGLES.cpp in Sources */, + DFF0F2BE17528350002DA3A4 /* Shader.cpp in Sources */, + DFF0F2BF17528350002DA3A4 /* Texture.cpp in Sources */, + DFF0F2C017528350002DA3A4 /* TextureBundle.cpp in Sources */, + DF3E5EFA199D41300039675D /* kodiclientwrapper.mm in Sources */, + DFF0F2C117528350002DA3A4 /* TextureBundleXBT.cpp in Sources */, + DFF0F2C217528350002DA3A4 /* TextureBundleXPR.cpp in Sources */, + DFF0F2C317528350002DA3A4 /* TextureDX.cpp in Sources */, + DFF0F2C417528350002DA3A4 /* TextureGL.cpp in Sources */, + DFF0F2C517528350002DA3A4 /* TextureManager.cpp in Sources */, + DFF0F2C617528350002DA3A4 /* VisibleEffect.cpp in Sources */, + F597B05D18A804E0005AADAE /* DVDVideoCodec.cpp in Sources */, + DFF0F2C717528350002DA3A4 /* XBTF.cpp in Sources */, + DFF0F2C817528350002DA3A4 /* XBTFReader.cpp in Sources */, + DFF0F2C917528350002DA3A4 /* GenericTouchActionHandler.cpp in Sources */, + DFF0F2CA17528350002DA3A4 /* ITouchInputHandling.cpp in Sources */, + DFF0F2CC17528350002DA3A4 /* SkinVariable.cpp in Sources */, + DFF0F2CD17528350002DA3A4 /* AddonsOperations.cpp in Sources */, + DFF0F2CE17528350002DA3A4 /* ApplicationOperations.cpp in Sources */, + DFEB902A19E9337200728978 /* AEResampleFactory.cpp in Sources */, + DFF0F2CF17528350002DA3A4 /* AudioLibrary.cpp in Sources */, + DFF0F2D017528350002DA3A4 /* FavouritesOperations.cpp in Sources */, + DFF0F2D117528350002DA3A4 /* FileItemHandler.cpp in Sources */, + DFF0F2D217528350002DA3A4 /* FileOperations.cpp in Sources */, + DFF0F2D317528350002DA3A4 /* GUIOperations.cpp in Sources */, + DFF0F2D417528350002DA3A4 /* InputOperations.cpp in Sources */, + DFF0F2D517528350002DA3A4 /* JSONRPC.cpp in Sources */, + DFF0F2D617528350002DA3A4 /* JSONServiceDescription.cpp in Sources */, + DFF0F2D717528350002DA3A4 /* PlayerOperations.cpp in Sources */, + DFF0F2D817528350002DA3A4 /* PlaylistOperations.cpp in Sources */, + DFF0F2D917528350002DA3A4 /* PVROperations.cpp in Sources */, + DFF0F2DA17528350002DA3A4 /* SystemOperations.cpp in Sources */, + DFF0F2DB17528350002DA3A4 /* VideoLibrary.cpp in Sources */, + DFF0F2DC17528350002DA3A4 /* XBMCOperations.cpp in Sources */, + DFF0F2DD17528350002DA3A4 /* AddonModuleXbmc.cpp in Sources */, + DFF0F2DE17528350002DA3A4 /* AddonModuleXbmcaddon.cpp in Sources */, + DFF0F2DF17528350002DA3A4 /* AddonModuleXbmcgui.cpp in Sources */, + DFF0F2E017528350002DA3A4 /* AddonModuleXbmcplugin.cpp in Sources */, + DFF0F2E117528350002DA3A4 /* AddonModuleXbmcvfs.cpp in Sources */, + DFF0F2E217528350002DA3A4 /* CallbackHandler.cpp in Sources */, + DFF0F2E317528350002DA3A4 /* LanguageHook.cpp in Sources */, + DFF0F2E417528350002DA3A4 /* PyContext.cpp in Sources */, + DFF0F2E517528350002DA3A4 /* swig.cpp in Sources */, + DFF0F2E617528350002DA3A4 /* XBPython.cpp in Sources */, + DFF0F2E817528350002DA3A4 /* AnnouncementManager.cpp in Sources */, + DFF0F2E917528350002DA3A4 /* Builtins.cpp in Sources */, + DFF0F2EA17528350002DA3A4 /* ConvUtils.cpp in Sources */, + DFF0F2EB17528350002DA3A4 /* LinuxResourceCounter.cpp in Sources */, + DFF0F2EC17528350002DA3A4 /* LinuxTimezone.cpp in Sources */, + DFF0F2ED17528350002DA3A4 /* PosixMountProvider.cpp in Sources */, + 3961C43B1ABC0A46002DBBFB /* UISoundsResource.cpp in Sources */, + DFF0F2EE17528350002DA3A4 /* XFileUtils.cpp in Sources */, + DFF0F2EF17528350002DA3A4 /* XHandle.cpp in Sources */, + DFF0F2F017528350002DA3A4 /* XMemUtils.cpp in Sources */, + DFF0F2F117528350002DA3A4 /* XTimeUtils.cpp in Sources */, + DFF0F2F217528350002DA3A4 /* GUIDialogMusicInfo.cpp in Sources */, + DFF0F2F317528350002DA3A4 /* GUIDialogMusicOSD.cpp in Sources */, + DFF0F2F417528350002DA3A4 /* GUIDialogMusicOverlay.cpp in Sources */, + DFF0F2F517528350002DA3A4 /* GUIDialogSongInfo.cpp in Sources */, + DFF0F2F617528350002DA3A4 /* GUIDialogVisualisationPresetList.cpp in Sources */, + DFF0F2F717528350002DA3A4 /* MusicAlbumInfo.cpp in Sources */, + DFF0F2F817528350002DA3A4 /* MusicArtistInfo.cpp in Sources */, + DFF0F2F917528350002DA3A4 /* MusicInfoScanner.cpp in Sources */, + DFF0F2FA17528350002DA3A4 /* MusicInfoScraper.cpp in Sources */, + DFF0F2FB17528350002DA3A4 /* GUIDialogKaraokeSongSelector.cpp in Sources */, + DFF0F2FC17528350002DA3A4 /* GUIWindowKaraokeLyrics.cpp in Sources */, + DFF0F2FD17528350002DA3A4 /* karaokelyrics.cpp in Sources */, + DFF0F2FE17528350002DA3A4 /* karaokelyricscdg.cpp in Sources */, + DFF0F2FF17528350002DA3A4 /* karaokelyricsfactory.cpp in Sources */, + DFF0F30017528350002DA3A4 /* karaokelyricsmanager.cpp in Sources */, + DFF0F30117528350002DA3A4 /* karaokelyricstext.cpp in Sources */, + DFF0F30217528350002DA3A4 /* karaokelyricstextkar.cpp in Sources */, + DFF0F30317528350002DA3A4 /* karaokelyricstextlrc.cpp in Sources */, + DFF0F30417528350002DA3A4 /* karaokelyricstextustar.cpp in Sources */, + DFF0F30517528350002DA3A4 /* karaokevideobackground.cpp in Sources */, + DFF0F30617528350002DA3A4 /* karaokewindowbackground.cpp in Sources */, + DFF0F30717528350002DA3A4 /* MusicInfoTag.cpp in Sources */, + DFF0F30917528350002DA3A4 /* MusicInfoTagLoaderCDDA.cpp in Sources */, + DFF0F30A17528350002DA3A4 /* MusicInfoTagLoaderDatabase.cpp in Sources */, + DFF0F30B17528350002DA3A4 /* MusicInfoTagLoaderFactory.cpp in Sources */, + DFF0F30E17528350002DA3A4 /* MusicInfoTagLoaderShn.cpp in Sources */, + DFF0F31217528350002DA3A4 /* TagLibVFSStream.cpp in Sources */, + DFF0F31317528350002DA3A4 /* TagLoaderTagLib.cpp in Sources */, + DFF0F31417528350002DA3A4 /* GUIWindowMusicBase.cpp in Sources */, + DFF0F31517528350002DA3A4 /* GUIWindowMusicNav.cpp in Sources */, + 395C2A0B1A9F06EB00EBC7AD /* LanguageResource.cpp in Sources */, + DFF0F31617528350002DA3A4 /* GUIWindowMusicPlaylist.cpp in Sources */, + DFF0F31717528350002DA3A4 /* GUIWindowMusicPlaylistEditor.cpp in Sources */, + DFF0F31817528350002DA3A4 /* GUIWindowMusicSongs.cpp in Sources */, + DFF0F31917528350002DA3A4 /* GUIWindowVisualisation.cpp in Sources */, + DFF0F31A17528350002DA3A4 /* Album.cpp in Sources */, + DFF0F31B17528350002DA3A4 /* Artist.cpp in Sources */, + DFF0F31C17528350002DA3A4 /* GUIViewStateMusic.cpp in Sources */, + DFF0F31D17528350002DA3A4 /* MusicDatabase.cpp in Sources */, + DFF0F31E17528350002DA3A4 /* MusicDbUrl.cpp in Sources */, + DFF0F31F17528350002DA3A4 /* MusicInfoLoader.cpp in Sources */, + DFF0F32017528350002DA3A4 /* MusicThumbLoader.cpp in Sources */, + DFF0F32117528350002DA3A4 /* Song.cpp in Sources */, + DFF0F32217528350002DA3A4 /* HTTPImageHandler.cpp in Sources */, + DFF0F32317528350002DA3A4 /* HTTPJsonRpcHandler.cpp in Sources */, + DFF0F32417528350002DA3A4 /* HTTPVfsHandler.cpp in Sources */, + DFF0F32517528350002DA3A4 /* HTTPWebinterfaceAddonsHandler.cpp in Sources */, + DFF0F32617528350002DA3A4 /* HTTPWebinterfaceHandler.cpp in Sources */, + 395C2A211A9F96A700EBC7AD /* ContextItemAddon.cpp in Sources */, + DFF0F32717528350002DA3A4 /* IHTTPRequestHandler.cpp in Sources */, + DFF0F32817528350002DA3A4 /* NetworkLinux.cpp in Sources */, + DFF0F32917528350002DA3A4 /* ZeroconfBrowserOSX.cpp in Sources */, + DFF0F32A17528350002DA3A4 /* ZeroconfOSX.cpp in Sources */, + DFF0F32B17528350002DA3A4 /* UPnP.cpp in Sources */, + DFF0F32C17528350002DA3A4 /* UPnPInternal.cpp in Sources */, + DFF0F32D17528350002DA3A4 /* UPnPPlayer.cpp in Sources */, + DF02BA631A910624006DCA16 /* VideoSyncIos.cpp in Sources */, + DFF0F32E17528350002DA3A4 /* UPnPRenderer.cpp in Sources */, + DFF0F32F17528350002DA3A4 /* UPnPServer.cpp in Sources */, + DFF0F33017528350002DA3A4 /* UPnPSettings.cpp in Sources */, + DFF0F33117528350002DA3A4 /* WebSocket.cpp in Sources */, + DFF0F33217528350002DA3A4 /* WebSocketManager.cpp in Sources */, + DFF0F33317528350002DA3A4 /* WebSocketV13.cpp in Sources */, + DFF0F33417528350002DA3A4 /* WebSocketV8.cpp in Sources */, + DFF0F33517528350002DA3A4 /* AirPlayServer.cpp in Sources */, + DFF0F33617528350002DA3A4 /* AirTunesServer.cpp in Sources */, + DFF0F33717528350002DA3A4 /* cddb.cpp in Sources */, + DFF0F33817528350002DA3A4 /* DNSNameCache.cpp in Sources */, + DFF0F33917528350002DA3A4 /* EventClient.cpp in Sources */, + DFF0F33A17528350002DA3A4 /* EventPacket.cpp in Sources */, + DFF0F33B17528350002DA3A4 /* EventServer.cpp in Sources */, + DFF0F33C17528350002DA3A4 /* GUIDialogAccessPoints.cpp in Sources */, + DFF0F33D17528350002DA3A4 /* GUIDialogNetworkSetup.cpp in Sources */, + DFF0F33E17528350002DA3A4 /* Network.cpp in Sources */, + DFF0F33F17528350002DA3A4 /* NetworkServices.cpp in Sources */, + DFF0F34017528350002DA3A4 /* Socket.cpp in Sources */, + DF3E5EFD199D4B340039675D /* KodiController.mm in Sources */, + DFF0F34117528350002DA3A4 /* TCPServer.cpp in Sources */, + DFF0F34217528350002DA3A4 /* UdpClient.cpp in Sources */, + DFF0F34317528350002DA3A4 /* WakeOnAccess.cpp in Sources */, + DFF0F34417528350002DA3A4 /* WebServer.cpp in Sources */, + DFF0F34517528350002DA3A4 /* Zeroconf.cpp in Sources */, + DF14CF801A77782E00396CC9 /* InputManager.cpp in Sources */, + DFF0F34617528350002DA3A4 /* ZeroconfBrowser.cpp in Sources */, + DFF0F34717528350002DA3A4 /* PeripheralBusUSB.cpp in Sources */, + DFF0F34817528350002DA3A4 /* PeripheralBus.cpp in Sources */, + DFF0F34917528350002DA3A4 /* Peripheral.cpp in Sources */, + DFF0F34A17528350002DA3A4 /* PeripheralBluetooth.cpp in Sources */, + DFF0F34B17528350002DA3A4 /* PeripheralCecAdapter.cpp in Sources */, + DFF0F34C17528350002DA3A4 /* PeripheralDisk.cpp in Sources */, + DFF0F34D17528350002DA3A4 /* PeripheralHID.cpp in Sources */, + DFF0F34E17528350002DA3A4 /* PeripheralImon.cpp in Sources */, + DFF0F34F17528350002DA3A4 /* PeripheralNIC.cpp in Sources */, + 397877DA1AAAF87700F98A45 /* Temperature.cpp in Sources */, + DFF0F35017528350002DA3A4 /* PeripheralNyxboard.cpp in Sources */, + DFF0F35117528350002DA3A4 /* PeripheralTuner.cpp in Sources */, + DFF0F35217528350002DA3A4 /* GUIDialogPeripheralManager.cpp in Sources */, + DFF0F35317528350002DA3A4 /* GUIDialogPeripheralSettings.cpp in Sources */, + DFF0F35417528350002DA3A4 /* Peripherals.cpp in Sources */, + DFF0F35517528350002DA3A4 /* GUIDialogPictureInfo.cpp in Sources */, + DFF0F35617528350002DA3A4 /* GUIViewStatePictures.cpp in Sources */, + DFF0F35717528350002DA3A4 /* GUIWindowPictures.cpp in Sources */, + DFF0F35817528350002DA3A4 /* GUIWindowSlideShow.cpp in Sources */, + DFF0F35917528350002DA3A4 /* Picture.cpp in Sources */, + DFF0F35A17528350002DA3A4 /* PictureInfoLoader.cpp in Sources */, + DFF0F35B17528350002DA3A4 /* PictureInfoTag.cpp in Sources */, + DFF0F35C17528350002DA3A4 /* PictureThumbLoader.cpp in Sources */, + DFF0F35D17528350002DA3A4 /* SlideShowPicture.cpp in Sources */, + DFF0F35E17528350002DA3A4 /* PlayList.cpp in Sources */, + DFF0F35F17528350002DA3A4 /* PlayListB4S.cpp in Sources */, + DFF0F36017528350002DA3A4 /* PlayListFactory.cpp in Sources */, + 395C29BE1A94733100EBC7AD /* Key.cpp in Sources */, + DFF0F36117528350002DA3A4 /* PlayListM3U.cpp in Sources */, + DF4BF0191A4EF31F0053AC56 /* cc_decoder.c in Sources */, + DFF0F36217528350002DA3A4 /* PlayListPLS.cpp in Sources */, + DFF0F36317528350002DA3A4 /* PlayListURL.cpp in Sources */, + DFF0F36417528350002DA3A4 /* PlayListWPL.cpp in Sources */, + DFF0F36517528350002DA3A4 /* PlayListXML.cpp in Sources */, + DFF0F36617528350002DA3A4 /* SmartPlayList.cpp in Sources */, + DFF0F36717528350002DA3A4 /* CocoaPowerSyscall.cpp in Sources */, + DFF0F36817528350002DA3A4 /* DPMSSupport.cpp in Sources */, + DFF0F36917528350002DA3A4 /* PowerManager.cpp in Sources */, + DFF0F36A17528350002DA3A4 /* GUIDialogLockSettings.cpp in Sources */, + DFF0F36B17528350002DA3A4 /* GUIDialogProfileSettings.cpp in Sources */, + DFF0F36C17528350002DA3A4 /* GUIWindowSettingsProfile.cpp in Sources */, + DFF0F36D17528350002DA3A4 /* Profile.cpp in Sources */, + DFF0F36E17528350002DA3A4 /* ProfilesManager.cpp in Sources */, + DFF0F36F17528350002DA3A4 /* GUIViewStatePrograms.cpp in Sources */, + DFF0F37017528350002DA3A4 /* GUIWindowPrograms.cpp in Sources */, + DFF0F37117528350002DA3A4 /* PVRClient.cpp in Sources */, + DFF0F37217528350002DA3A4 /* PVRClients.cpp in Sources */, + DFF0F37317528350002DA3A4 /* PVRChannel.cpp in Sources */, + DFF0F37417528350002DA3A4 /* PVRChannelGroup.cpp in Sources */, + 395C29F81A98B44B00EBC7AD /* AddonModuleXbmcwsgi.cpp in Sources */, + DFF0F37517528350002DA3A4 /* PVRChannelGroupInternal.cpp in Sources */, + DFF0F37617528350002DA3A4 /* PVRChannelGroups.cpp in Sources */, + DFF0F37717528350002DA3A4 /* PVRChannelGroupsContainer.cpp in Sources */, + DFF0F37817528350002DA3A4 /* GUIDialogPVRChannelManager.cpp in Sources */, + DFF0F37917528350002DA3A4 /* GUIDialogPVRChannelsOSD.cpp in Sources */, + DFF0F37C17528350002DA3A4 /* GUIDialogPVRGroupManager.cpp in Sources */, + DFF0F37D17528350002DA3A4 /* GUIDialogPVRGuideInfo.cpp in Sources */, + DFF0F37E17528350002DA3A4 /* GUIDialogPVRGuideOSD.cpp in Sources */, + DFF0F37F17528350002DA3A4 /* GUIDialogPVRGuideSearch.cpp in Sources */, + DFF0F38017528350002DA3A4 /* GUIDialogPVRRecordingInfo.cpp in Sources */, + DFF0F38117528350002DA3A4 /* GUIDialogPVRTimerSettings.cpp in Sources */, + DFF0F38217528350002DA3A4 /* PVRRecording.cpp in Sources */, + DFF0F38317528350002DA3A4 /* PVRRecordings.cpp in Sources */, + 3994427C1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */, + DFF0F38417528350002DA3A4 /* PVRTimerInfoTag.cpp in Sources */, + DFF0F38517528350002DA3A4 /* PVRTimers.cpp in Sources */, + DFF0F38617528350002DA3A4 /* GUIViewStatePVR.cpp in Sources */, + DFF0F38717528350002DA3A4 /* GUIWindowPVRBase.cpp in Sources */, + DFF0F38817528350002DA3A4 /* GUIWindowPVRChannels.cpp in Sources */, + DFF0F38A17528350002DA3A4 /* GUIWindowPVRGuide.cpp in Sources */, + DFF0F38B17528350002DA3A4 /* GUIWindowPVRRecordings.cpp in Sources */, + DFF0F38C17528350002DA3A4 /* GUIWindowPVRSearch.cpp in Sources */, + DFF0F38D17528350002DA3A4 /* GUIWindowPVRTimers.cpp in Sources */, + DFF0F38E17528350002DA3A4 /* PVRDatabase.cpp in Sources */, + DFF0F38F17528350002DA3A4 /* PVRGUIInfo.cpp in Sources */, + DFF0F39017528350002DA3A4 /* PVRManager.cpp in Sources */, + DFF0F39117528350002DA3A4 /* RenderSystemGLES.cpp in Sources */, + DFF0F39217528350002DA3A4 /* RenderSystem.cpp in Sources */, + DFF0F39317528350002DA3A4 /* GUIControlSettings.cpp in Sources */, + DFF0F39417528350002DA3A4 /* GUIDialogContentSettings.cpp in Sources */, + DFF0F39617528350002DA3A4 /* GUIWindowSettings.cpp in Sources */, + DFF0F39717528350002DA3A4 /* GUIWindowSettingsCategory.cpp in Sources */, + DFF0F39817528350002DA3A4 /* GUIWindowSettingsScreenCalibration.cpp in Sources */, + DFF0F39917528350002DA3A4 /* GUIWindowTestPattern.cpp in Sources */, + DFF0F39A17528350002DA3A4 /* AdvancedSettings.cpp in Sources */, + DFF0F39B17528350002DA3A4 /* DisplaySettings.cpp in Sources */, + DFF0F39D17528350002DA3A4 /* MediaSettings.cpp in Sources */, + DFF0F39E17528350002DA3A4 /* MediaSourceSettings.cpp in Sources */, + DFF0F3A017528350002DA3A4 /* SettingAddon.cpp in Sources */, + DFF0F3A317528350002DA3A4 /* SettingControl.cpp in Sources */, + DFF0F3A517528350002DA3A4 /* SettingPath.cpp in Sources */, + DFF0F3A617528350002DA3A4 /* Settings.cpp in Sources */, + DFF0F3AB17528350002DA3A4 /* SkinSettings.cpp in Sources */, + DFF0F3AC17528350002DA3A4 /* VideoSettings.cpp in Sources */, + DFF0F3AD17528350002DA3A4 /* DarwinStorageProvider.cpp in Sources */, + DFF0F3AE17528350002DA3A4 /* AutorunMediaJob.cpp in Sources */, + DFF0F3AF17528350002DA3A4 /* cdioSupport.cpp in Sources */, + DFF0F3B017528350002DA3A4 /* DetectDVDType.cpp in Sources */, + DFF0F3B117528350002DA3A4 /* IoSupport.cpp in Sources */, + DFF0F3B217528350002DA3A4 /* MediaManager.cpp in Sources */, + DFF0F3B317528350002DA3A4 /* Implementation.cpp in Sources */, + DFF0F3B417528350002DA3A4 /* Atomics.cpp in Sources */, + DFF0F3B517528350002DA3A4 /* Event.cpp in Sources */, + DFF0F3B617528350002DA3A4 /* LockFree.cpp in Sources */, + DFF0F3B717528350002DA3A4 /* SystemClock.cpp in Sources */, + DFF0F3B817528350002DA3A4 /* Thread.cpp in Sources */, + DFF0F3B917528350002DA3A4 /* Timer.cpp in Sources */, + DFF0F3BA17528350002DA3A4 /* AlarmClock.cpp in Sources */, + DFF0F3BB17528350002DA3A4 /* AliasShortcutUtils.cpp in Sources */, + DFF0F3BC17528350002DA3A4 /* Archive.cpp in Sources */, + DFF0F3BD17528350002DA3A4 /* AsyncFileCopy.cpp in Sources */, + DFF0F3BE17528350002DA3A4 /* AutoPtrHandle.cpp in Sources */, + DFF0F3BF17528350002DA3A4 /* Base64.cpp in Sources */, + DFF0F3C017528350002DA3A4 /* BitstreamConverter.cpp in Sources */, + DFF0F3C117528350002DA3A4 /* BitstreamStats.cpp in Sources */, + DFF0F3C217528350002DA3A4 /* BooleanLogic.cpp in Sources */, + DFF0F3C317528350002DA3A4 /* CharsetConverter.cpp in Sources */, + DFF0F3C417528350002DA3A4 /* CPUInfo.cpp in Sources */, + DFF0F3C517528350002DA3A4 /* Crc32.cpp in Sources */, + DFF0F3C617528350002DA3A4 /* CryptThreading.cpp in Sources */, + DFF0F3C717528350002DA3A4 /* DatabaseUtils.cpp in Sources */, + DFF0F3CB17528350002DA3A4 /* Environment.cpp in Sources */, + DFF0F3CC17528350002DA3A4 /* Fanart.cpp in Sources */, + DFF0F3CE17528350002DA3A4 /* FileOperationJob.cpp in Sources */, + DFF0F3CF17528350002DA3A4 /* FileUtils.cpp in Sources */, + DFF0F3D017528350002DA3A4 /* GLUtils.cpp in Sources */, + DFF0F3D117528350002DA3A4 /* GroupUtils.cpp in Sources */, + DFF0F3D317528350002DA3A4 /* HTMLUtil.cpp in Sources */, + DFF0F3D417528350002DA3A4 /* HttpHeader.cpp in Sources */, + DFF0F3D517528350002DA3A4 /* HttpParser.cpp in Sources */, + DFF0F3D617528350002DA3A4 /* HttpResponse.cpp in Sources */, + DFF0F3D717528350002DA3A4 /* InfoLoader.cpp in Sources */, + DFF0F3D817528350002DA3A4 /* JobManager.cpp in Sources */, + DFF0F3D917528350002DA3A4 /* JSONVariantParser.cpp in Sources */, + DFF0F3DA17528350002DA3A4 /* JSONVariantWriter.cpp in Sources */, + DFF0F3DB17528350002DA3A4 /* LabelFormatter.cpp in Sources */, + DFF0F3DC17528350002DA3A4 /* LangCodeExpander.cpp in Sources */, + 399442731A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */, + DFF0F3DD17528350002DA3A4 /* LegacyPathTranslation.cpp in Sources */, + DFF0F3DE17528350002DA3A4 /* log.cpp in Sources */, + DFF0F3DF17528350002DA3A4 /* md5.cpp in Sources */, + DFF0F3E017528350002DA3A4 /* Mime.cpp in Sources */, + DFF0F3E117528350002DA3A4 /* Observer.cpp in Sources */, + 395C29E01A98A11C00EBC7AD /* WsgiResponseBody.cpp in Sources */, + DFF0F3E217528350002DA3A4 /* PerformanceSample.cpp in Sources */, + DFF0F3E317528350002DA3A4 /* PerformanceStats.cpp in Sources */, + DFF0F3E417528350002DA3A4 /* POUtils.cpp in Sources */, + DFF0F3E517528350002DA3A4 /* RecentlyAddedJob.cpp in Sources */, + DFF0F3E617528350002DA3A4 /* RegExp.cpp in Sources */, + DFF0F3E717528350002DA3A4 /* RingBuffer.cpp in Sources */, + DFF0F3E817528350002DA3A4 /* RssManager.cpp in Sources */, + DFF0F3E917528350002DA3A4 /* RssReader.cpp in Sources */, + DFF0F3EA17528350002DA3A4 /* ScraperParser.cpp in Sources */, + DFF0F3EB17528350002DA3A4 /* ScraperUrl.cpp in Sources */, + DFF0F3EC17528350002DA3A4 /* Screenshot.cpp in Sources */, + DFF0F3ED17528350002DA3A4 /* SeekHandler.cpp in Sources */, + DFF0F3EE17528350002DA3A4 /* SortUtils.cpp in Sources */, + DFF0F3EF17528350002DA3A4 /* Splash.cpp in Sources */, + DFF0F3F017528350002DA3A4 /* Stopwatch.cpp in Sources */, + DFF0F3F117528350002DA3A4 /* StreamDetails.cpp in Sources */, + DFF0F3F217528350002DA3A4 /* StreamUtils.cpp in Sources */, + DFF0F3F317528350002DA3A4 /* StringUtils.cpp in Sources */, + DFF0F3F417528350002DA3A4 /* SystemInfo.cpp in Sources */, + DFF0F3F517528350002DA3A4 /* TextSearch.cpp in Sources */, + DFF0F3F617528350002DA3A4 /* TimeSmoother.cpp in Sources */, + DFF0F3F717528350002DA3A4 /* TimeUtils.cpp in Sources */, + DFF0F3F917528350002DA3A4 /* URIUtils.cpp in Sources */, + DFF0F3FA17528350002DA3A4 /* UrlOptions.cpp in Sources */, + DFF0F3FB17528350002DA3A4 /* Variant.cpp in Sources */, + DFF0F3FC17528350002DA3A4 /* Weather.cpp in Sources */, + DFF0F3FD17528350002DA3A4 /* XBMCTinyXML.cpp in Sources */, + DFF0F3FE17528350002DA3A4 /* XMLUtils.cpp in Sources */, + DFF0F3FF17528350002DA3A4 /* GUIDialogAudioSubtitleSettings.cpp in Sources */, + DFF0F40017528350002DA3A4 /* GUIDialogFileStacking.cpp in Sources */, + DFF0F40117528350002DA3A4 /* GUIDialogFullScreenInfo.cpp in Sources */, + DFF0F40217528350002DA3A4 /* GUIDialogTeletext.cpp in Sources */, + DFF0F40317528350002DA3A4 /* GUIDialogVideoBookmarks.cpp in Sources */, + DFF0F40417528350002DA3A4 /* GUIDialogVideoInfo.cpp in Sources */, + DFF0F40517528350002DA3A4 /* GUIDialogVideoOSD.cpp in Sources */, + DFF0F40617528350002DA3A4 /* GUIDialogVideoOverlay.cpp in Sources */, + DFF0F40717528350002DA3A4 /* GUIDialogVideoSettings.cpp in Sources */, + DFF0F40817528350002DA3A4 /* GUIWindowFullScreen.cpp in Sources */, + DFF0F40917528350002DA3A4 /* GUIWindowVideoBase.cpp in Sources */, + DFF0F40A17528350002DA3A4 /* GUIWindowVideoNav.cpp in Sources */, + DFF0F40B17528350002DA3A4 /* GUIWindowVideoPlaylist.cpp in Sources */, + DFF0F40C17528350002DA3A4 /* Bookmark.cpp in Sources */, + DFF0F40D17528350002DA3A4 /* FFmpegVideoDecoder.cpp in Sources */, + DFF0F40E17528350002DA3A4 /* GUIViewStateVideo.cpp in Sources */, + DFF0F40F17528350002DA3A4 /* PlayerController.cpp in Sources */, + DFF0F41017528350002DA3A4 /* Teletext.cpp in Sources */, + B5101B5A19DFF8E400294D1E /* BlurayFile.cpp in Sources */, + DFF0F41117528350002DA3A4 /* VideoDatabase.cpp in Sources */, + DFF0F41217528350002DA3A4 /* VideoDbUrl.cpp in Sources */, + DFF0F41317528350002DA3A4 /* VideoInfoDownloader.cpp in Sources */, + DFF0F41417528350002DA3A4 /* VideoInfoScanner.cpp in Sources */, + 395C2A161A9F072400EBC7AD /* ResourceFile.cpp in Sources */, + DFF0F41517528350002DA3A4 /* VideoInfoTag.cpp in Sources */, + DFF0F41617528350002DA3A4 /* VideoReferenceClock.cpp in Sources */, + DFF0F41717528350002DA3A4 /* VideoThumbLoader.cpp in Sources */, + 399442701A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp in Sources */, + DFF0F41817528350002DA3A4 /* GUIViewControl.cpp in Sources */, + DFF0F41917528350002DA3A4 /* GUIViewState.cpp in Sources */, + DFF0F41A17528350002DA3A4 /* ViewDatabase.cpp in Sources */, + DFF0F41B17528350002DA3A4 /* ViewStateSettings.cpp in Sources */, + DFF0F41C17528350002DA3A4 /* WinEventsSDL.cpp in Sources */, + DFF0F41D17528350002DA3A4 /* WinSystem.cpp in Sources */, + DFF0F41E17528350002DA3A4 /* GUIMediaWindow.cpp in Sources */, + DFF0F41F17528350002DA3A4 /* GUIWindowDebugInfo.cpp in Sources */, + DFF0F42017528350002DA3A4 /* GUIWindowFileManager.cpp in Sources */, + DFF0F42117528350002DA3A4 /* GUIWindowHome.cpp in Sources */, + DFF0F42217528350002DA3A4 /* GUIWindowLoginScreen.cpp in Sources */, + DFF0F42317528350002DA3A4 /* GUIWindowPointer.cpp in Sources */, + DFF0F42417528350002DA3A4 /* GUIWindowScreensaver.cpp in Sources */, + DFF0F42517528350002DA3A4 /* GUIWindowScreensaverDim.cpp in Sources */, + DFF0F42617528350002DA3A4 /* GUIWindowStartup.cpp in Sources */, + DFF0F42717528350002DA3A4 /* GUIWindowSystemInfo.cpp in Sources */, + DFF0F42817528350002DA3A4 /* GUIWindowWeather.cpp in Sources */, + DFF0F43117528350002DA3A4 /* Application.cpp in Sources */, + DFF0F43217528350002DA3A4 /* ApplicationMessenger.cpp in Sources */, + DFF0F43317528350002DA3A4 /* AppParamParser.cpp in Sources */, + DFF0F43417528350002DA3A4 /* Autorun.cpp in Sources */, + DFF0F43517528350002DA3A4 /* AutoSwitch.cpp in Sources */, + DFF0F43617528350002DA3A4 /* BackgroundInfoLoader.cpp in Sources */, + DFF0F43717528350002DA3A4 /* CueDocument.cpp in Sources */, + DFF0F43817528350002DA3A4 /* DatabaseManager.cpp in Sources */, + DFF0F43917528350002DA3A4 /* DbUrl.cpp in Sources */, + DFF0F43A17528350002DA3A4 /* DynamicDll.cpp in Sources */, + DFF0F43C17528350002DA3A4 /* FileItem.cpp in Sources */, + DFF0F43D17528350002DA3A4 /* GUIInfoManager.cpp in Sources */, + DFF0F43E17528350002DA3A4 /* GUILargeTextureManager.cpp in Sources */, + DFF0F43F17528350002DA3A4 /* GUIPassword.cpp in Sources */, + DFF0F44017528350002DA3A4 /* LangInfo.cpp in Sources */, + DFF0F44117528350002DA3A4 /* MediaSource.cpp in Sources */, + DFF0F44217528350002DA3A4 /* NfoFile.cpp in Sources */, + DF56EF211A798A3F00CAAEFB /* HTTPFileHandler.cpp in Sources */, + DFF0F44317528350002DA3A4 /* PartyModeManager.cpp in Sources */, + DFF0F44417528350002DA3A4 /* PasswordManager.cpp in Sources */, + DFF0F44517528350002DA3A4 /* PlayListPlayer.cpp in Sources */, + DFF0F44617528350002DA3A4 /* SectionLoader.cpp in Sources */, + DFF0F44717528350002DA3A4 /* SystemGlobals.cpp in Sources */, + DFF0F44917528350002DA3A4 /* TextureCache.cpp in Sources */, + DFF0F44A17528350002DA3A4 /* TextureCacheJob.cpp in Sources */, + DFF0F44B17528350002DA3A4 /* TextureDatabase.cpp in Sources */, + DFF0F44C17528350002DA3A4 /* ThumbLoader.cpp in Sources */, + DFF0F44D17528350002DA3A4 /* ThumbnailCache.cpp in Sources */, + 395F6DDF1A8133360088CC74 /* GUIDialogSimpleMenu.cpp in Sources */, + DFF0F44E17528350002DA3A4 /* URL.cpp in Sources */, + DFF0F44F17528350002DA3A4 /* Util.cpp in Sources */, + DFF0F45017528350002DA3A4 /* XBApplicationEx.cpp in Sources */, + DFF0F45117528350002DA3A4 /* XBDateTime.cpp in Sources */, + DFF0F45217528350002DA3A4 /* xbmc.cpp in Sources */, + DFF0F45317528350002DA3A4 /* XbmcContext.cpp in Sources */, + 399442761A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */, + DFF0F45417528350002DA3A4 /* MouseStat.cpp in Sources */, + DFF0F45517528350002DA3A4 /* Addon.cpp in Sources */, + DFF0F45617528350002DA3A4 /* AddonCallback.cpp in Sources */, + DFF0F45717528350002DA3A4 /* AddonClass.cpp in Sources */, + DFF1FE23199D2FFF0008211F /* KodiAppliance.mm in Sources */, + DFF0F45817528350002DA3A4 /* AddonUtils.cpp in Sources */, + DFF0F45917528350002DA3A4 /* CallbackFunction.cpp in Sources */, + DFF0F45A17528350002DA3A4 /* CallbackHandler.cpp in Sources */, + DFF0F45B17528350002DA3A4 /* Control.cpp in Sources */, + DFF0F45C17528350002DA3A4 /* Dialog.cpp in Sources */, + DFF0F45D17528350002DA3A4 /* File.cpp in Sources */, + 2F4564D71970129A00396109 /* GUIFontCache.cpp in Sources */, + DFC6F4B81AFF7CB10039A7FA /* kiss_fft.c in Sources */, + DFF0F45E17528350002DA3A4 /* InfoTagMusic.cpp in Sources */, + DFF0F45F17528350002DA3A4 /* InfoTagVideo.cpp in Sources */, + DFF0F46017528350002DA3A4 /* Keyboard.cpp in Sources */, + DFF0F46117528350002DA3A4 /* LanguageHook.cpp in Sources */, + DFF0F46217528350002DA3A4 /* ListItem.cpp in Sources */, + DFF0F46317528350002DA3A4 /* ModuleXbmc.cpp in Sources */, + DFF0F46417528350002DA3A4 /* ModuleXbmcgui.cpp in Sources */, + DFF0F46517528350002DA3A4 /* ModuleXbmcplugin.cpp in Sources */, + DFF0F46617528350002DA3A4 /* ModuleXbmcvfs.cpp in Sources */, + DFF0F46717528350002DA3A4 /* Monitor.cpp in Sources */, + DFF0F46817528350002DA3A4 /* Player.cpp in Sources */, + DFF0F46917528350002DA3A4 /* PlayList.cpp in Sources */, + DFF0F46A17528350002DA3A4 /* String.cpp in Sources */, + DFF0F46B17528350002DA3A4 /* Window.cpp in Sources */, + DFF0F46C17528350002DA3A4 /* WindowDialog.cpp in Sources */, + DFF0F46D17528350002DA3A4 /* WindowDialogMixin.cpp in Sources */, + DFF0F46E17528350002DA3A4 /* WindowXML.cpp in Sources */, + DFF0F46F17528350002DA3A4 /* ButtonTranslator.cpp in Sources */, + DFF0F47017528350002DA3A4 /* InertialScrollingHandler.cpp in Sources */, + 395C29DD1A98A11C00EBC7AD /* WsgiResponse.cpp in Sources */, + DFF0F47217528350002DA3A4 /* KeyboardStat.cpp in Sources */, + DFF0F47317528350002DA3A4 /* SDLJoystick.cpp in Sources */, + DFF0F47417528350002DA3A4 /* XBMC_keytable.cpp in Sources */, + DFF0F47517528350002DA3A4 /* WinEventsIOS.mm in Sources */, + 395C29F21A98A16300EBC7AD /* HTTPPythonWsgiInvoker.cpp in Sources */, + DFF0F47617528350002DA3A4 /* WinSystemIOS.mm in Sources */, + DF32466419E931A8005E8CFB /* ActiveAEResampleFFMPEG.cpp in Sources */, + DFF0F47E17528350002DA3A4 /* AutoPool.mm in Sources */, + DFF0F48017528350002DA3A4 /* DarwinUtils.mm in Sources */, + DFF0F48117528350002DA3A4 /* OSXGNUReplacements.c in Sources */, + DFF0F48217528350002DA3A4 /* LinuxRendererGLES.cpp in Sources */, + DFF0F48317528350002DA3A4 /* DVDCodecUtils.cpp in Sources */, + DFF0F48417528350002DA3A4 /* DVDFactoryCodec.cpp in Sources */, + DFF0F48717528350002DA3A4 /* DVDVideoCodecVideoToolBox.cpp in Sources */, + DFF0F48817528350002DA3A4 /* fstrcmp.c in Sources */, + DFF0F48A17528350002DA3A4 /* yuv2rgb.neon.S in Sources */, + DF3C3C0E1752A7EE000989C3 /* IOSEAGLView.mm in Sources */, + DF3C3C0F1752A7EE000989C3 /* IOSExternalTouchController.mm in Sources */, + DF3C3C101752A7EE000989C3 /* IOSScreenManager.mm in Sources */, + 0E3036EE1760F68A00D93596 /* FavouritesDirectory.cpp in Sources */, + DFBB431A178B5E6F006CC20A /* CompileInfo.cpp in Sources */, + DF40BC1F178B4BEC009DB567 /* PythonInvoker.cpp in Sources */, + DF40BC2C178B4C07009DB567 /* LanguageInvokerThread.cpp in Sources */, + DF40BC2E178B4C07009DB567 /* ScriptInvocationManager.cpp in Sources */, + DFBB4309178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */, + F55BA70C17AB2265002A36D1 /* StereoscopicsManager.cpp in Sources */, + F55BA71117AB2293002A36D1 /* RenderFlags.cpp in Sources */, + F59EED8017AD5174005BB7C6 /* ApplicationPlayer.cpp in Sources */, + DF28DF4F17B8379E0077F41A /* ProfilesOperations.cpp in Sources */, + DFD882F617DD1A5B001516FE /* AddonPythonInvoker.cpp in Sources */, + DFD882E717DD189E001516FE /* StringValidation.cpp in Sources */, + F500E35817F3412C004FC217 /* WinEvents.cpp in Sources */, + 7C2612731825B6340086E04D /* DatabaseQuery.cpp in Sources */, + 7C920CFB181669FF00DA1477 /* TextureOperations.cpp in Sources */, + DFEF0BAE180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */, + DFEF0BC3180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */, + 7CC82C9518284F9F0010DF30 /* CharsetDetection.cpp in Sources */, + DF6D1DFF18312525009DB64F /* OverlayRendererGUI.cpp in Sources */, + 7C26126E182068660086E04D /* SettingsOperations.cpp in Sources */, + 7C7BCDCB17727951004842FB /* IListProvider.cpp in Sources */, + 7C7BCDCD17727952004842FB /* StaticProvider.cpp in Sources */, + 7C8FC6F01829A4580045153D /* DirectoryProvider.cpp in Sources */, + 7C4E6F741829AA9700F1068F /* GUIDialogSubtitles.cpp in Sources */, + 7C14098B183224B8009F9411 /* ISetting.cpp in Sources */, + 7C14098E183224B8009F9411 /* ISettingControl.cpp in Sources */, + 7C140991183224B8009F9411 /* Setting.cpp in Sources */, + 7C140994183224B8009F9411 /* SettingCategoryAccess.cpp in Sources */, + 7C140997183224B8009F9411 /* SettingConditions.cpp in Sources */, + 7C14099A183224B8009F9411 /* SettingDependency.cpp in Sources */, + 7C14099D183224B8009F9411 /* SettingRequirement.cpp in Sources */, + 7C1409A0183224B8009F9411 /* SettingSection.cpp in Sources */, + 7C1409A3183224B8009F9411 /* SettingsManager.cpp in Sources */, + 7C1409A6183224B8009F9411 /* SettingUpdate.cpp in Sources */, + 395C2A131A9F072400EBC7AD /* ResourceDirectory.cpp in Sources */, + DF0ABB75183A94A30018445D /* Utf8Utils.cpp in Sources */, + 7C1409AB184015C9009F9411 /* InfoExpression.cpp in Sources */, + AE32174318313AE10003FAFC /* XSLTUtils.cpp in Sources */, + 7C15DCBE1892481400FCE564 /* InfoBool.cpp in Sources */, + F5CC228F1814F7F7006B5E91 /* AESinkDARWINIOS.cpp in Sources */, + F5CC22E51814FF3B006B5E91 /* ActiveAE.cpp in Sources */, + F5CC22E61814FF3B006B5E91 /* ActiveAEBuffer.cpp in Sources */, + F5CC22E81814FF3B006B5E91 /* ActiveAESink.cpp in Sources */, + F5CC22E91814FF3B006B5E91 /* ActiveAESound.cpp in Sources */, + F5CC22EA1814FF3B006B5E91 /* ActiveAEStream.cpp in Sources */, + F5CC22FE18150065006B5E91 /* ActorProtocol.cpp in Sources */, + F5CC2304181500B1006B5E91 /* EndianSwap.cpp in Sources */, + F5CC230D18150118006B5E91 /* AESinkFactory.cpp in Sources */, + F5CC234818150277006B5E91 /* AESinkNULL.cpp in Sources */, + DF374B2518AC2BA20076B514 /* CoreAudioHelpers.cpp in Sources */, + 7CF0504D190A1D7200222135 /* FFmpeg.cpp in Sources */, + 7CF05058191195DA00222135 /* MediaType.cpp in Sources */, + 7CC7B6B51918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */, + 7CC7B6B81918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */, + 7CC7B6BB1918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */, + 7CC7B6C2191869EA00DDB120 /* SettingCreator.cpp in Sources */, + 7CC7B6C5191869EA00DDB120 /* SettingUtils.cpp in Sources */, + 7CC7B6CA19186A8800DDB120 /* SettingConditions.cpp in Sources */, + 7CCDA0DD192753E30074CF51 /* PltAction.cpp in Sources */, + 7CCDA0E6192753E30074CF51 /* PltArgument.cpp in Sources */, + 7CCDA0EF192753E30074CF51 /* PltConstants.cpp in Sources */, + 7CCDA0F8192753E30074CF51 /* PltCtrlPoint.cpp in Sources */, + 7CCDA101192753E30074CF51 /* PltCtrlPointTask.cpp in Sources */, + 7CCDA10A192753E30074CF51 /* PltDatagramStream.cpp in Sources */, + 7CCDA113192753E30074CF51 /* PltDeviceData.cpp in Sources */, + 7CCDA11C192753E30074CF51 /* PltDeviceHost.cpp in Sources */, + 7CCDA125192753E30074CF51 /* PltEvent.cpp in Sources */, + 7CCDA12E192753E30074CF51 /* PltHttp.cpp in Sources */, + 7CCDA137192753E30074CF51 /* PltHttpClientTask.cpp in Sources */, + 7CCDA140192753E30074CF51 /* PltHttpServer.cpp in Sources */, + 7CCDA149192753E30074CF51 /* PltHttpServerTask.cpp in Sources */, + 7CCDA152192753E30074CF51 /* PltIconsData.cpp in Sources */, + 7CCDA15B192753E30074CF51 /* PltMimeType.cpp in Sources */, + 7CCDA164192753E30074CF51 /* PltProtocolInfo.cpp in Sources */, + 7CCDA16D192753E30074CF51 /* PltService.cpp in Sources */, + 7CCDA176192753E30074CF51 /* PltSsdp.cpp in Sources */, + 7CCDA17F192753E30074CF51 /* PltStateVariable.cpp in Sources */, + 7CCDA188192753E30074CF51 /* PltTaskManager.cpp in Sources */, + 7CCDA191192753E30074CF51 /* PltThreadTask.cpp in Sources */, + 7CCDA19A192753E30074CF51 /* PltUPnP.cpp in Sources */, + 7CCDA1A3192753E30074CF51 /* PltMediaConnect.cpp in Sources */, + 7CCDA1AC192753E30074CF51 /* PltXbox360.cpp in Sources */, + 7CCDA1B1192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */, + 7CCDA1BC192753E30074CF51 /* AVTransportSCPD.cpp in Sources */, + 7CCDA1C9192753E30074CF51 /* PltMediaController.cpp in Sources */, + 7CCDA1D2192753E30074CF51 /* PltMediaRenderer.cpp in Sources */, + 7CCDA1DD192753E30074CF51 /* RdrConnectionManagerSCPD.cpp in Sources */, + 7CCDA1E8192753E30074CF51 /* RenderingControlSCPD.cpp in Sources */, + 7CCDA1F5192753E30074CF51 /* ConnectionManagerSCPD.cpp in Sources */, + 7CCDA200192753E30074CF51 /* ContentDirectorySCPD.cpp in Sources */, + 7CCDA20B192753E30074CF51 /* ContentDirectorywSearchSCPD.cpp in Sources */, + 7CCDA216192753E30074CF51 /* PltDidl.cpp in Sources */, + 7CCDA21F192753E30074CF51 /* PltFileMediaServer.cpp in Sources */, + 7CCDA228192753E30074CF51 /* PltMediaBrowser.cpp in Sources */, + 7CCDA231192753E30074CF51 /* PltMediaCache.cpp in Sources */, + DF4BF01F1A4EF3410053AC56 /* DVDDemuxCC.cpp in Sources */, + 7CCDA23A192753E30074CF51 /* PltMediaItem.cpp in Sources */, + 7CCDA243192753E30074CF51 /* PltMediaServer.cpp in Sources */, + 7CCDA24C192753E30074CF51 /* PltSyncMediaBrowser.cpp in Sources */, + 7CCDA77B192756250074CF51 /* Neptune.cpp in Sources */, + 7CCDA784192756250074CF51 /* NptAutomaticCleaner.cpp in Sources */, + 7CCDA787192756250074CF51 /* NptBase64.cpp in Sources */, + 7CCDA790192756250074CF51 /* NptBufferedStreams.cpp in Sources */, + 7CCDA799192756250074CF51 /* NptCommon.cpp in Sources */, + 7CCDA7A2192756250074CF51 /* NptConsole.cpp in Sources */, + 7CCDA7A5192756250074CF51 /* NptCrypto.cpp in Sources */, + 7CCDA7A8192756250074CF51 /* NptDataBuffer.cpp in Sources */, + 7CCDA7B1192756250074CF51 /* NptDebug.cpp in Sources */, + 7CCDA7BA192756250074CF51 /* NptDigest.cpp in Sources */, + 7CCDA7BD192756250074CF51 /* NptDynamicLibraries.cpp in Sources */, + 7CCDA7C0192756250074CF51 /* NptFile.cpp in Sources */, + 7CCDA7C9192756250074CF51 /* NptHash.cpp in Sources */, + 7CCDA7D2192756250074CF51 /* NptHttp.cpp in Sources */, + 7CCDA7DB192756250074CF51 /* NptJson.cpp in Sources */, + 7CCDA7DE192756250074CF51 /* NptList.cpp in Sources */, + 7CCDA7E7192756250074CF51 /* NptLogging.cpp in Sources */, + DF6A0D831A4584E80075BBFC /* OverrideDirectory.cpp in Sources */, + 7CCDA7EA192756250074CF51 /* NptMessaging.cpp in Sources */, + 7CCDA7F3192756250074CF51 /* NptNetwork.cpp in Sources */, + 7CCDA7FC192756250074CF51 /* NptQueue.cpp in Sources */, + 7CCDA805192756250074CF51 /* NptResults.cpp in Sources */, + 7CCDA808192756250074CF51 /* NptRingBuffer.cpp in Sources */, + 7CCDA811192756250074CF51 /* NptSimpleMessageQueue.cpp in Sources */, + 7CCDA81A192756250074CF51 /* NptSockets.cpp in Sources */, + 7CCDA823192756250074CF51 /* NptStreams.cpp in Sources */, + 7CCDA82C192756250074CF51 /* NptStrings.cpp in Sources */, + 7CCDA835192756250074CF51 /* NptSystem.cpp in Sources */, + 7CCDA83E192756250074CF51 /* NptThreads.cpp in Sources */, + 7CCDA847192756250074CF51 /* NptTime.cpp in Sources */, + 7CCDA850192756250074CF51 /* NptTls.cpp in Sources */, + 7CCDA853192756250074CF51 /* NptUri.cpp in Sources */, + 7CCDA85C192756250074CF51 /* NptUtils.cpp in Sources */, + DFC6F4C31AFF7E300039A7FA /* rfft.cpp in Sources */, + 7CCDA865192756250074CF51 /* NptXml.cpp in Sources */, + 7CCDA86E192756250074CF51 /* NptZip.cpp in Sources */, + 7CCDAA84192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */, + 7CCDAA87192756250074CF51 /* NptPosixEnvironment.cpp in Sources */, + 7CCDAA8D192756250074CF51 /* NptPosixNetwork.cpp in Sources */, + DFC6F4BB1AFF7CB10039A7FA /* kiss_fftr.c in Sources */, + 7CCDAA90192756250074CF51 /* NptPosixQueue.cpp in Sources */, + 7CCDAA99192756250074CF51 /* NptPosixSystem.cpp in Sources */, + 7CCDAAA2192756250074CF51 /* NptPosixThreads.cpp in Sources */, + 7CCDAAAB192756250074CF51 /* NptPosixTime.cpp in Sources */, + 7CCDAAB4192756250074CF51 /* NptSelectableMessageQueue.cpp in Sources */, + 7CCDAC8819275CA70074CF51 /* NptBsdNetwork.cpp in Sources */, + 7CCDAC9119275CA70074CF51 /* NptBsdResolver.cpp in Sources */, + 7CCDAC9419275CA70074CF51 /* NptBsdSockets.cpp in Sources */, + 7CCDACA919275D1F0074CF51 /* NptStdcDebug.cpp in Sources */, + 7CCDACB219275D1F0074CF51 /* NptStdcEnvironment.cpp in Sources */, + 7CCDACC319275D790074CF51 /* NptAppleAutoreleasePool.mm in Sources */, + DF923E5F1A11536A008CDB0C /* DataCacheCore.cpp in Sources */, + 7CCDACCC19275D790074CF51 /* NptAppleLogConfig.mm in Sources */, + 7CAA469219427AED00008885 /* PosixDirectory.cpp in Sources */, + 7C525DF7195E2D8100BE3482 /* SaveFileStateJob.cpp in Sources */, + 7C908896196358A8003D0619 /* auto_buffer.cpp in Sources */, + 7CF34DA11930264A00D543C5 /* AudioEncoder.cpp in Sources */, + 7CF80DCB19710DC2003B2B34 /* KeyboardLayout.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -10196,14 +12179,12 @@ files = ( E49910B7174D0E2A00741B6D /* IOSKeyboard.mm in Sources */, E49910B8174D0E2A00741B6D /* IOSKeyboardView.mm in Sources */, - DF29BCFE1B5D911800904347 /* GUIWindowEventLog.cpp in Sources */, DF4BF0181A4EF31E0053AC56 /* cc_decoder708.cpp in Sources */, E49910BA174D0E2A00741B6D /* XBMCApplication.m in Sources */, E49910BB174D0E2A00741B6D /* XBMCController.mm in Sources */, E49910DC174E4A6400741B6D /* IOSEAGLView.mm in Sources */, E49910DD174E4A6400741B6D /* IOSExternalTouchController.mm in Sources */, E49910DE174E4A6400741B6D /* IOSScreenManager.mm in Sources */, - DF1D2DF41B6E85EE002BB9DB /* XbtManager.cpp in Sources */, E499114F174E5CC300741B6D /* archive.cpp in Sources */, E4991150174E5CC300741B6D /* arcread.cpp in Sources */, E4991151174E5CC300741B6D /* cmddata.cpp in Sources */, @@ -10246,7 +12227,6 @@ E4991176174E5CC300741B6D /* unicode.cpp in Sources */, E4991177174E5CC300741B6D /* unpack.cpp in Sources */, E4991178174E5CC300741B6D /* volume.cpp in Sources */, - DFEA4B5C1B52721700562321 /* GUIDialogAudioDSPSettings.cpp in Sources */, E4991179174E5CE000741B6D /* Addon.cpp in Sources */, E499117A174E5CE000741B6D /* AddonCallbacks.cpp in Sources */, E499117B174E5CE000741B6D /* AddonCallbacksAddon.cpp in Sources */, @@ -10271,7 +12251,6 @@ E499118E174E5CE400741B6D /* CDDARipJob.cpp in Sources */, E499118F174E5CE400741B6D /* CDDARipper.cpp in Sources */, E4991190174E5CE400741B6D /* Encoder.cpp in Sources */, - DFEA4B561B5271F600562321 /* ActiveAEDSPMode.cpp in Sources */, E4991191174E5CE400741B6D /* EncoderFFmpeg.cpp in Sources */, E4991196174E5CEB00741B6D /* Exception.cpp in Sources */, E4991197174E5CEB00741B6D /* ilog.cpp in Sources */, @@ -10299,7 +12278,6 @@ E49911BB174E5D0A00741B6D /* dll_util.cpp in Sources */, DFC6F4BA1AFF7CB10039A7FA /* kiss_fftr.c in Sources */, E49911BC174E5D0A00741B6D /* DllLoader.cpp in Sources */, - DF2401271B41A26F001E02DA /* ImageResource.cpp in Sources */, E49911BD174E5D0A00741B6D /* DllLoaderContainer.cpp in Sources */, E49911BE174E5D0A00741B6D /* LibraryLoader.cpp in Sources */, E49911BF174E5D0A00741B6D /* SoLoader.cpp in Sources */, @@ -10310,7 +12288,6 @@ E49911C8174E5D2500741B6D /* DVDOverlayCodecFFmpeg.cpp in Sources */, E49911C9174E5D2500741B6D /* DVDOverlayCodecSSA.cpp in Sources */, E49911CA174E5D2500741B6D /* DVDOverlayCodecText.cpp in Sources */, - 7C8E02471BA35D0B0072E8B2 /* SystemBuiltins.cpp in Sources */, E49911CB174E5D2500741B6D /* DVDOverlayCodecTX3G.cpp in Sources */, E49911CE174E5D2500741B6D /* DVDVideoCodecFFmpeg.cpp in Sources */, E49911CF174E5D2500741B6D /* DVDVideoCodecLibMpeg2.cpp in Sources */, @@ -10337,6 +12314,7 @@ E49911E4174E5D3700741B6D /* DVDInputStreamNavigator.cpp in Sources */, E49911E5174E5D3700741B6D /* DVDInputStreamPVRManager.cpp in Sources */, E49911E6174E5D3700741B6D /* DVDInputStreamRTMP.cpp in Sources */, + E49911E7174E5D3700741B6D /* DVDInputStreamTV.cpp in Sources */, E49911E8174E5D3700741B6D /* DVDStateSerializer.cpp in Sources */, E49911E9174E5D3E00741B6D /* DVDSubtitleParserSSA.cpp in Sources */, E49911EA174E5D3E00741B6D /* DVDSubtitlesLibass.cpp in Sources */, @@ -10348,7 +12326,6 @@ E49911F0174E5D3E00741B6D /* DVDSubtitleParserSubrip.cpp in Sources */, E49911F1174E5D3E00741B6D /* DVDSubtitleParserVplayer.cpp in Sources */, E49911F2174E5D3E00741B6D /* DVDSubtitleStream.cpp in Sources */, - DFEA4B581B5271FA00562321 /* ActiveAEDSPProcess.cpp in Sources */, E49911F3174E5D3E00741B6D /* DVDSubtitleTagMicroDVD.cpp in Sources */, E49911F4174E5D3E00741B6D /* DVDSubtitleTagSami.cpp in Sources */, E49911F5174E5D4500741B6D /* DVDAudio.cpp in Sources */, @@ -10358,9 +12335,7 @@ E49911F9174E5D4500741B6D /* DVDMessage.cpp in Sources */, E49911FA174E5D4500741B6D /* DVDMessageQueue.cpp in Sources */, E49911FC174E5D4500741B6D /* DVDOverlayContainer.cpp in Sources */, - DF4A3BB31B4B0FC100F9CDC0 /* ApplicationMessenger.cpp in Sources */, E49911FD174E5D4500741B6D /* DVDOverlayRenderer.cpp in Sources */, - DF29BCF21B5D911800904347 /* EventLog.cpp in Sources */, E49911FF174E5D4500741B6D /* DVDPlayer.cpp in Sources */, E4991200174E5D4500741B6D /* DVDPlayerAudio.cpp in Sources */, E4991201174E5D4500741B6D /* DVDPlayerSubtitle.cpp in Sources */, @@ -10410,7 +12385,6 @@ E499123A174E5D7E00741B6D /* GUIDialogFileBrowser.cpp in Sources */, E499123B174E5D7E00741B6D /* GUIDialogGamepad.cpp in Sources */, E499123C174E5D7E00741B6D /* GUIDialogKaiToast.cpp in Sources */, - 39B4F3711B96F845009B2D88 /* RepositoryUpdater.cpp in Sources */, E499123D174E5D7E00741B6D /* GUIDialogKeyboardGeneric.cpp in Sources */, E499123E174E5D7E00741B6D /* GUIDialogMediaFilter.cpp in Sources */, E499123F174E5D7E00741B6D /* GUIDialogMediaSource.cpp in Sources */, @@ -10436,7 +12410,6 @@ E4991254174E5D8F00741B6D /* CacheStrategy.cpp in Sources */, E4991255174E5D8F00741B6D /* CDDADirectory.cpp in Sources */, E4991256174E5D8F00741B6D /* CDDAFile.cpp in Sources */, - 7C3018321BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp in Sources */, E4991257174E5D8F00741B6D /* CircularCache.cpp in Sources */, E4991258174E5D8F00741B6D /* CurlFile.cpp in Sources */, E499125B174E5D8F00741B6D /* DAVCommon.cpp in Sources */, @@ -10451,11 +12424,12 @@ E4991264174E5D8F00741B6D /* FileCache.cpp in Sources */, E4991265174E5D8F00741B6D /* FileDirectoryFactory.cpp in Sources */, E4991266174E5D8F00741B6D /* FileFactory.cpp in Sources */, - DF29BCEC1B5D911800904347 /* AddonManagementEvent.cpp in Sources */, 395C29EE1A98A16300EBC7AD /* HTTPPythonInvoker.cpp in Sources */, E4991267174E5D8F00741B6D /* FileReaderFile.cpp in Sources */, E4991268174E5D8F00741B6D /* FTPDirectory.cpp in Sources */, E4991269174E5D8F00741B6D /* FTPParse.cpp in Sources */, + E499126C174E5D8F00741B6D /* HDHomeRunDirectory.cpp in Sources */, + E499126D174E5D8F00741B6D /* HDHomeRunFile.cpp in Sources */, E4991270174E5D8F00741B6D /* HTTPDirectory.cpp in Sources */, E4991271174E5D8F00741B6D /* HTTPFile.cpp in Sources */, DFC6F4C21AFF7E300039A7FA /* rfft.cpp in Sources */, @@ -10483,7 +12457,6 @@ E4991285174E5D9900741B6D /* DirectoryNodeAlbumTop100Song.cpp in Sources */, 395C2A051A9CD25100EBC7AD /* ContextItemAddonInvoker.cpp in Sources */, E4991286174E5D9900741B6D /* DirectoryNodeArtist.cpp in Sources */, - DF29BCEF1B5D911800904347 /* BaseEvent.cpp in Sources */, E4991287174E5D9900741B6D /* DirectoryNodeGrouped.cpp in Sources */, E4991288174E5D9900741B6D /* DirectoryNodeOverview.cpp in Sources */, E4991289174E5D9900741B6D /* DirectoryNodeRoot.cpp in Sources */, @@ -10504,7 +12477,6 @@ E499129D174E5D9900741B6D /* PipeFile.cpp in Sources */, E499129E174E5D9900741B6D /* PipesManager.cpp in Sources */, E499129F174E5D9900741B6D /* PlaylistDirectory.cpp in Sources */, - 7C8E02411BA35D0B0072E8B2 /* PVRBuiltins.cpp in Sources */, E49912A0174E5D9900741B6D /* PlaylistFileDirectory.cpp in Sources */, E49912A1174E5D9900741B6D /* PluginDirectory.cpp in Sources */, E49912A2174E5D9900741B6D /* PVRDirectory.cpp in Sources */, @@ -10516,12 +12488,12 @@ E49912A7174E5D9900741B6D /* RSSDirectory.cpp in Sources */, E49912AA174E5D9900741B6D /* SAPDirectory.cpp in Sources */, E49912AB174E5D9900741B6D /* SAPFile.cpp in Sources */, - 7C8E02231BA35D0B0072E8B2 /* Builtins.cpp in Sources */, E49912AC174E5D9900741B6D /* SFTPDirectory.cpp in Sources */, E49912AD174E5D9900741B6D /* SFTPFile.cpp in Sources */, E49912AE174E5D9900741B6D /* ShoutcastFile.cpp in Sources */, - DF0E4AD51AD5986F00A75430 /* GUIDialogPVRRadioRDSInfo.cpp in Sources */, + E49912B0174E5D9900741B6D /* SlingboxDirectory.cpp in Sources */, 395C29C21A98A0A000EBC7AD /* Webinterface.cpp in Sources */, + E49912B1174E5D9900741B6D /* SlingboxFile.cpp in Sources */, E49912B2174E5D9900741B6D /* SmartPlaylistDirectory.cpp in Sources */, E49912B3174E5D9900741B6D /* SMBDirectory.cpp in Sources */, E49912B4174E5D9900741B6D /* SMBFile.cpp in Sources */, @@ -10537,23 +12509,20 @@ E49912BF174E5D9900741B6D /* UPnPDirectory.cpp in Sources */, E49912C0174E5D9900741B6D /* UPnPFile.cpp in Sources */, E49912C1174E5DA000741B6D /* DirectoryNode.cpp in Sources */, - DF1D2DF11B6E85EE002BB9DB /* XbtFile.cpp in Sources */, E49912C2174E5DA000741B6D /* DirectoryNodeEpisodes.cpp in Sources */, E49912C3174E5DA000741B6D /* DirectoryNodeGrouped.cpp in Sources */, E49912C4174E5DA000741B6D /* DirectoryNodeMoviesOverview.cpp in Sources */, E49912C5174E5DA000741B6D /* DirectoryNodeMusicVideosOverview.cpp in Sources */, E49912C6174E5DA000741B6D /* DirectoryNodeOverview.cpp in Sources */, - DFEA4B5A1B52721300562321 /* GUIDialogAudioDSPManager.cpp in Sources */, DFED5AC71AB23388001F080D /* ReplayGain.cpp in Sources */, E49912C7174E5DA000741B6D /* DirectoryNodeRecentlyAddedEpisodes.cpp in Sources */, E49912C8174E5DA000741B6D /* DirectoryNodeRecentlyAddedMovies.cpp in Sources */, E49912C9174E5DA000741B6D /* DirectoryNodeRecentlyAddedMusicVideos.cpp in Sources */, E49912CA174E5DA000741B6D /* DirectoryNodeRoot.cpp in Sources */, E49912CB174E5DA000741B6D /* DirectoryNodeSeasons.cpp in Sources */, - DF1D2DEE1B6E85EE002BB9DB /* XbtDirectory.cpp in Sources */, + 395C2A201A9F96A700EBC7AD /* ContextItemAddon.cpp in Sources */, E49912CC174E5DA000741B6D /* DirectoryNodeTitleMovies.cpp in Sources */, E49912CD174E5DA000741B6D /* DirectoryNodeTitleMusicVideos.cpp in Sources */, - DFDE5D521AE5658200EE53AD /* PictureScalingAlgorithm.cpp in Sources */, E49912CE174E5DA000741B6D /* DirectoryNodeTitleTvShows.cpp in Sources */, E49912CF174E5DA000741B6D /* DirectoryNodeTvShowsOverview.cpp in Sources */, E49912D0174E5DA000741B6D /* QueryParams.cpp in Sources */, @@ -10563,6 +12532,7 @@ E49912D7174E5DA000741B6D /* ZipDirectory.cpp in Sources */, E49912D8174E5DA000741B6D /* ZipFile.cpp in Sources */, E49912D9174E5DA000741B6D /* ZipManager.cpp in Sources */, + E49912DA174E5DAD00741B6D /* AnimatedGif.cpp in Sources */, E49912DB174E5DAD00741B6D /* cximage.cpp in Sources */, E49912DC174E5DAD00741B6D /* D3DResource.cpp in Sources */, E49912DD174E5DAD00741B6D /* DDSImage.cpp in Sources */, @@ -10605,7 +12575,6 @@ E4991301174E5DAD00741B6D /* GUIListItemLayout.cpp in Sources */, E4991302174E5DAD00741B6D /* GUIListLabel.cpp in Sources */, E4991303174E5DAD00741B6D /* GUIMessage.cpp in Sources */, - 7C8E023E1BA35D0B0072E8B2 /* ProfileBuiltins.cpp in Sources */, E4991304174E5DAD00741B6D /* GUIMoverControl.cpp in Sources */, 399442751A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */, E4991305174E5DAD00741B6D /* GUIMultiImage.cpp in Sources */, @@ -10646,13 +12615,11 @@ E4991322174E5DAD00741B6D /* IWindowManagerCallback.cpp in Sources */, E4991323174E5DAD00741B6D /* JpegIO.cpp in Sources */, E4991325174E5DAD00741B6D /* LocalizeStrings.cpp in Sources */, - 7C8E024A1BA35D0B0072E8B2 /* WeatherBuiltins.cpp in Sources */, E4991326174E5DAD00741B6D /* MatrixGLES.cpp in Sources */, E4991327174E5DAD00741B6D /* Shader.cpp in Sources */, E4991328174E5DAD00741B6D /* Texture.cpp in Sources */, E4991329174E5DAD00741B6D /* TextureBundle.cpp in Sources */, 397877D61AAAF87700F98A45 /* Speed.cpp in Sources */, - DF6F52AF1AF6D03F001BC57D /* dacp.cpp in Sources */, E499132A174E5DAD00741B6D /* TextureBundleXBT.cpp in Sources */, E499132B174E5DAD00741B6D /* TextureBundleXPR.cpp in Sources */, E499132C174E5DAD00741B6D /* TextureDX.cpp in Sources */, @@ -10660,7 +12627,6 @@ E499132E174E5DAD00741B6D /* TextureManager.cpp in Sources */, E499132F174E5DAD00741B6D /* VisibleEffect.cpp in Sources */, E4991330174E5DAD00741B6D /* XBTF.cpp in Sources */, - DFEA4B541B5271F200562321 /* ActiveAEDSPDatabase.cpp in Sources */, DFC6F4B71AFF7CB10039A7FA /* kiss_fft.c in Sources */, E4991331174E5DAD00741B6D /* XBTFReader.cpp in Sources */, E4991345174E5E5C00741B6D /* GenericTouchActionHandler.cpp in Sources */, @@ -10685,7 +12651,6 @@ E499135D174E5EBE00741B6D /* XBMCOperations.cpp in Sources */, E499135E174E5EEF00741B6D /* AddonModuleXbmc.cpp in Sources */, E499135F174E5EEF00741B6D /* AddonModuleXbmcaddon.cpp in Sources */, - 2A7B2BDD1BD6F16600044BCD /* PVRSettings.cpp in Sources */, E4991360174E5EEF00741B6D /* AddonModuleXbmcgui.cpp in Sources */, E4991361174E5EEF00741B6D /* AddonModuleXbmcplugin.cpp in Sources */, E4991362174E5EEF00741B6D /* AddonModuleXbmcvfs.cpp in Sources */, @@ -10696,6 +12661,7 @@ E4991366174E5EEF00741B6D /* swig.cpp in Sources */, E4991367174E5EEF00741B6D /* XBPython.cpp in Sources */, E4991369174E5EEF00741B6D /* AnnouncementManager.cpp in Sources */, + E499136A174E5EEF00741B6D /* Builtins.cpp in Sources */, E499136B174E5EF700741B6D /* ConvUtils.cpp in Sources */, E499136C174E5EF700741B6D /* LinuxResourceCounter.cpp in Sources */, E499136D174E5EF700741B6D /* LinuxTimezone.cpp in Sources */, @@ -10703,19 +12669,29 @@ E499136F174E5EF700741B6D /* XFileUtils.cpp in Sources */, E4991370174E5EF700741B6D /* XHandle.cpp in Sources */, DF6A0D851A4584E80075BBFC /* OverrideFile.cpp in Sources */, - DF29BD031B5D913B00904347 /* EventsDirectory.cpp in Sources */, E4991371174E5EF700741B6D /* XMemUtils.cpp in Sources */, E4991372174E5EF700741B6D /* XTimeUtils.cpp in Sources */, E4991373174E5F0E00741B6D /* GUIDialogMusicInfo.cpp in Sources */, E4991374174E5F0E00741B6D /* GUIDialogMusicOSD.cpp in Sources */, + E4991375174E5F0E00741B6D /* GUIDialogMusicOverlay.cpp in Sources */, E4991376174E5F0E00741B6D /* GUIDialogSongInfo.cpp in Sources */, E4991377174E5F0E00741B6D /* GUIDialogVisualisationPresetList.cpp in Sources */, E4991378174E5F0E00741B6D /* MusicAlbumInfo.cpp in Sources */, E4991379174E5F0E00741B6D /* MusicArtistInfo.cpp in Sources */, E499137A174E5F0E00741B6D /* MusicInfoScanner.cpp in Sources */, E499137B174E5F0E00741B6D /* MusicInfoScraper.cpp in Sources */, - 7C8E022C1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */, - DF54F8041B6580C8000FCBA4 /* ContextMenuAddon.cpp in Sources */, + E499137C174E5F0E00741B6D /* GUIDialogKaraokeSongSelector.cpp in Sources */, + E499137D174E5F0E00741B6D /* GUIWindowKaraokeLyrics.cpp in Sources */, + E499137E174E5F0E00741B6D /* karaokelyrics.cpp in Sources */, + E499137F174E5F0E00741B6D /* karaokelyricscdg.cpp in Sources */, + E4991380174E5F0E00741B6D /* karaokelyricsfactory.cpp in Sources */, + E4991381174E5F0E00741B6D /* karaokelyricsmanager.cpp in Sources */, + E4991382174E5F0E00741B6D /* karaokelyricstext.cpp in Sources */, + E4991383174E5F0E00741B6D /* karaokelyricstextkar.cpp in Sources */, + E4991384174E5F0E00741B6D /* karaokelyricstextlrc.cpp in Sources */, + E4991385174E5F0E00741B6D /* karaokelyricstextustar.cpp in Sources */, + E4991386174E5F0E00741B6D /* karaokevideobackground.cpp in Sources */, + E4991387174E5F0E00741B6D /* karaokewindowbackground.cpp in Sources */, E4991388174E5F0E00741B6D /* MusicInfoTag.cpp in Sources */, E499138A174E5F0E00741B6D /* MusicInfoTagLoaderCDDA.cpp in Sources */, E499138B174E5F0E00741B6D /* MusicInfoTagLoaderDatabase.cpp in Sources */, @@ -10727,6 +12703,7 @@ E4991396174E5F0E00741B6D /* GUIWindowMusicNav.cpp in Sources */, E4991397174E5F0E00741B6D /* GUIWindowMusicPlaylist.cpp in Sources */, E4991398174E5F0E00741B6D /* GUIWindowMusicPlaylistEditor.cpp in Sources */, + E4991399174E5F0E00741B6D /* GUIWindowMusicSongs.cpp in Sources */, E499139A174E5F0E00741B6D /* GUIWindowVisualisation.cpp in Sources */, E499139B174E5F0E00741B6D /* Album.cpp in Sources */, E499139C174E5F0E00741B6D /* Artist.cpp in Sources */, @@ -10759,7 +12736,6 @@ E49913B6174E5F3C00741B6D /* AirPlayServer.cpp in Sources */, E49913B7174E5F3C00741B6D /* AirTunesServer.cpp in Sources */, E49913B8174E5F3C00741B6D /* cddb.cpp in Sources */, - 39BD2AD91B845D40004A5A15 /* DialogHelper.cpp in Sources */, E49913B9174E5F3C00741B6D /* DNSNameCache.cpp in Sources */, E49913BA174E5F3C00741B6D /* EventClient.cpp in Sources */, E49913BB174E5F3C00741B6D /* EventPacket.cpp in Sources */, @@ -10787,6 +12763,7 @@ E49913D0174E5F8100741B6D /* PeripheralNIC.cpp in Sources */, E49913D1174E5F8100741B6D /* PeripheralNyxboard.cpp in Sources */, E49913D2174E5F8100741B6D /* PeripheralTuner.cpp in Sources */, + E49913D3174E5F8600741B6D /* GUIDialogPeripheralManager.cpp in Sources */, E49913D4174E5F8600741B6D /* GUIDialogPeripheralSettings.cpp in Sources */, 395C2A1A1A9F074C00EBC7AD /* Locale.cpp in Sources */, E49913D5174E5F8600741B6D /* Peripherals.cpp in Sources */, @@ -10809,7 +12786,6 @@ E49913E6174E5F8D00741B6D /* PlayListXML.cpp in Sources */, E49913E7174E5F8D00741B6D /* SmartPlayList.cpp in Sources */, E49913E8174E5F9900741B6D /* CocoaPowerSyscall.cpp in Sources */, - 395938781AC310B00053A590 /* MessagePrinter.cpp in Sources */, E49913E9174E5F9900741B6D /* DPMSSupport.cpp in Sources */, E49913EA174E5F9900741B6D /* PowerManager.cpp in Sources */, E49913EB174E5FB000741B6D /* GUIDialogLockSettings.cpp in Sources */, @@ -10818,7 +12794,6 @@ E49913EE174E5FB000741B6D /* Profile.cpp in Sources */, E49913EF174E5FB000741B6D /* ProfilesManager.cpp in Sources */, E49913F0174E5FB000741B6D /* GUIViewStatePrograms.cpp in Sources */, - 7C8E023B1BA35D0B0072E8B2 /* PlayerBuiltins.cpp in Sources */, E49913F1174E5FB000741B6D /* GUIWindowPrograms.cpp in Sources */, E49913F2174E5FB000741B6D /* PVRClient.cpp in Sources */, E49913F3174E5FB000741B6D /* PVRClients.cpp in Sources */, @@ -10832,7 +12807,6 @@ E49913FD174E5FB000741B6D /* GUIDialogPVRGroupManager.cpp in Sources */, E49913FE174E5FB000741B6D /* GUIDialogPVRGuideInfo.cpp in Sources */, E49913FF174E5FB000741B6D /* GUIDialogPVRGuideOSD.cpp in Sources */, - 39C38CCB1BBFF1EE000F59F5 /* InputCodingTableKorean.cpp in Sources */, E4991400174E5FB000741B6D /* GUIDialogPVRGuideSearch.cpp in Sources */, E4991401174E5FB000741B6D /* GUIDialogPVRRecordingInfo.cpp in Sources */, E4991402174E5FB000741B6D /* GUIDialogPVRTimerSettings.cpp in Sources */, @@ -10841,7 +12815,6 @@ E4991405174E5FB900741B6D /* PVRTimerInfoTag.cpp in Sources */, E4991406174E5FB900741B6D /* PVRTimers.cpp in Sources */, E4991407174E5FB900741B6D /* GUIViewStatePVR.cpp in Sources */, - DF0E4AD01AD5984600A75430 /* PVRRadioRDSInfoTag.cpp in Sources */, E4991408174E5FB900741B6D /* GUIWindowPVRBase.cpp in Sources */, E4991409174E5FB900741B6D /* GUIWindowPVRChannels.cpp in Sources */, E499140B174E5FB900741B6D /* GUIWindowPVRGuide.cpp in Sources */, @@ -10880,6 +12853,7 @@ E4991437174E604700741B6D /* Implementation.cpp in Sources */, E4991438174E604700741B6D /* Atomics.cpp in Sources */, E4991439174E604700741B6D /* Event.cpp in Sources */, + E499143A174E604700741B6D /* LockFree.cpp in Sources */, E499143B174E604700741B6D /* SystemClock.cpp in Sources */, E499143C174E604700741B6D /* Thread.cpp in Sources */, E499143D174E604700741B6D /* Timer.cpp in Sources */, @@ -10889,6 +12863,7 @@ E499143F174E605900741B6D /* AliasShortcutUtils.cpp in Sources */, E4991440174E605900741B6D /* Archive.cpp in Sources */, E4991441174E605900741B6D /* AsyncFileCopy.cpp in Sources */, + E4991442174E605900741B6D /* AutoPtrHandle.cpp in Sources */, E4991443174E605900741B6D /* Base64.cpp in Sources */, E4991444174E605900741B6D /* BitstreamConverter.cpp in Sources */, E4991445174E605900741B6D /* BitstreamStats.cpp in Sources */, @@ -10938,7 +12913,6 @@ E4991474174E605900741B6D /* Stopwatch.cpp in Sources */, E4991475174E605900741B6D /* StreamDetails.cpp in Sources */, E4991476174E605900741B6D /* StreamUtils.cpp in Sources */, - DFEA4B4E1B5271A900562321 /* AddonCallbacksAudioDSP.cpp in Sources */, E4991477174E605900741B6D /* StringUtils.cpp in Sources */, E4991478174E605900741B6D /* SystemInfo.cpp in Sources */, E4991479174E605900741B6D /* TextSearch.cpp in Sources */, @@ -10948,17 +12922,18 @@ E499147E174E605900741B6D /* UrlOptions.cpp in Sources */, E499147F174E605900741B6D /* Variant.cpp in Sources */, E4991480174E605900741B6D /* Weather.cpp in Sources */, - DF29BCF81B5D911800904347 /* MediaLibraryEvent.cpp in Sources */, E4991481174E605900741B6D /* XBMCTinyXML.cpp in Sources */, 395F6DE31A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */, E4991482174E605900741B6D /* XMLUtils.cpp in Sources */, E4991483174E606500741B6D /* GUIDialogAudioSubtitleSettings.cpp in Sources */, + E4991484174E606500741B6D /* GUIDialogFileStacking.cpp in Sources */, E4991485174E606500741B6D /* GUIDialogFullScreenInfo.cpp in Sources */, E4991486174E606500741B6D /* GUIDialogTeletext.cpp in Sources */, 5EE4F9181A9FF36F002E20F8 /* CueInfoLoader.cpp in Sources */, E4991487174E606500741B6D /* GUIDialogVideoBookmarks.cpp in Sources */, E4991488174E606500741B6D /* GUIDialogVideoInfo.cpp in Sources */, E4991489174E606500741B6D /* GUIDialogVideoOSD.cpp in Sources */, + E499148A174E606500741B6D /* GUIDialogVideoOverlay.cpp in Sources */, E499148B174E606500741B6D /* GUIDialogVideoSettings.cpp in Sources */, E499148C174E606500741B6D /* GUIWindowFullScreen.cpp in Sources */, E499148D174E606500741B6D /* GUIWindowVideoBase.cpp in Sources */, @@ -10973,7 +12948,6 @@ E4991496174E606600741B6D /* VideoDbUrl.cpp in Sources */, E4991497174E606600741B6D /* VideoInfoDownloader.cpp in Sources */, E4991498174E606600741B6D /* VideoInfoScanner.cpp in Sources */, - DF0E4AC61AD597ED00A75430 /* DVDPlayerRadioRDS.cpp in Sources */, E4991499174E606600741B6D /* VideoInfoTag.cpp in Sources */, E499149A174E606600741B6D /* VideoReferenceClock.cpp in Sources */, E499149B174E606600741B6D /* VideoThumbLoader.cpp in Sources */, @@ -10991,13 +12965,12 @@ E49914A6174E607200741B6D /* GUIWindowLoginScreen.cpp in Sources */, E49914A7174E607200741B6D /* GUIWindowPointer.cpp in Sources */, E49914A8174E607200741B6D /* GUIWindowScreensaver.cpp in Sources */, - 7C8E02441BA35D0B0072E8B2 /* SkinBuiltins.cpp in Sources */, E49914A9174E607200741B6D /* GUIWindowScreensaverDim.cpp in Sources */, E49914AA174E607200741B6D /* GUIWindowStartup.cpp in Sources */, E49914AB174E607200741B6D /* GUIWindowSystemInfo.cpp in Sources */, - 7C8E022F1BA35D0B0072E8B2 /* GUIControlBuiltins.cpp in Sources */, E49914AC174E607200741B6D /* GUIWindowWeather.cpp in Sources */, E499152C174E640800741B6D /* Application.cpp in Sources */, + E499152D174E642900741B6D /* ApplicationMessenger.cpp in Sources */, E499152E174E642900741B6D /* AppParamParser.cpp in Sources */, E499152F174E642900741B6D /* Autorun.cpp in Sources */, E4991530174E642900741B6D /* AutoSwitch.cpp in Sources */, @@ -11014,10 +12987,8 @@ E499153B174E642900741B6D /* LangInfo.cpp in Sources */, E499153C174E642900741B6D /* MediaSource.cpp in Sources */, E499153D174E642900741B6D /* NfoFile.cpp in Sources */, - 7C8E02261BA35D0B0072E8B2 /* CECBuiltins.cpp in Sources */, E499153E174E642900741B6D /* PartyModeManager.cpp in Sources */, E499153F174E642900741B6D /* PasswordManager.cpp in Sources */, - 7C8E021A1BA35D0B0072E8B2 /* AddonBuiltins.cpp in Sources */, E4991540174E642900741B6D /* PlayListPlayer.cpp in Sources */, E4991541174E642900741B6D /* SectionLoader.cpp in Sources */, E4991542174E642900741B6D /* SystemGlobals.cpp in Sources */, @@ -11041,11 +13012,9 @@ E4991555174E656E00741B6D /* CallbackHandler.cpp in Sources */, E4991556174E656E00741B6D /* Control.cpp in Sources */, E4991557174E656E00741B6D /* Dialog.cpp in Sources */, - DFEA4B521B5271EE00562321 /* ActiveAEDSPAddon.cpp in Sources */, E4991558174E656E00741B6D /* File.cpp in Sources */, E4991559174E656E00741B6D /* InfoTagMusic.cpp in Sources */, E499155A174E656E00741B6D /* InfoTagVideo.cpp in Sources */, - 7CEE587E1B5A3FFB007C2B5A /* AudioDSPSettings.cpp in Sources */, E499155B174E656E00741B6D /* Keyboard.cpp in Sources */, E499155C174E656E00741B6D /* LanguageHook.cpp in Sources */, E499155D174E656E00741B6D /* ListItem.cpp in Sources */, @@ -11053,7 +13022,6 @@ E499155F174E656E00741B6D /* ModuleXbmcgui.cpp in Sources */, E4991560174E656E00741B6D /* ModuleXbmcplugin.cpp in Sources */, E4991561174E656E00741B6D /* ModuleXbmcvfs.cpp in Sources */, - 7C8E021D1BA35D0B0072E8B2 /* AndroidBuiltins.cpp in Sources */, E4991562174E656E00741B6D /* Monitor.cpp in Sources */, E4991563174E656E00741B6D /* Player.cpp in Sources */, E4991564174E656E00741B6D /* PlayList.cpp in Sources */, @@ -11074,7 +13042,6 @@ E4991582174E682F00741B6D /* AutoPool.mm in Sources */, E4991583174E684000741B6D /* CocoaInterface.mm in Sources */, E4991584174E684000741B6D /* DarwinUtils.mm in Sources */, - 7C8E02321BA35D0B0072E8B2 /* LibraryBuiltins.cpp in Sources */, E4991586174E684000741B6D /* OSXGNUReplacements.c in Sources */, E499158A174E68D800741B6D /* LinuxRendererGLES.cpp in Sources */, E499158B174E68EE00741B6D /* DVDCodecUtils.cpp in Sources */, @@ -11093,7 +13060,6 @@ F55BA71017AB2293002A36D1 /* RenderFlags.cpp in Sources */, F59EED7F17AD5174005BB7C6 /* ApplicationPlayer.cpp in Sources */, DF28DF4E17B8379E0077F41A /* ProfilesOperations.cpp in Sources */, - DF29BCE91B5D911800904347 /* AddonEvent.cpp in Sources */, DFD882F717DD1A5B001516FE /* AddonPythonInvoker.cpp in Sources */, DFD882E817DD189E001516FE /* StringValidation.cpp in Sources */, F500E35717F3412C004FC217 /* WinEvents.cpp in Sources */, @@ -11138,12 +13104,9 @@ 7CC7B6B41918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */, 7CC7B6B71918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */, 7CC7B6BA1918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */, - DF0E4ACB1AD5982500A75430 /* InfoTagRadioRDS.cpp in Sources */, 7CC7B6C1191869EA00DDB120 /* SettingCreator.cpp in Sources */, 7CC7B6C4191869EA00DDB120 /* SettingUtils.cpp in Sources */, 7CC7B6C919186A8800DDB120 /* SettingConditions.cpp in Sources */, - 42E2E1CA1B53F74D005C7E4E /* VideoLibraryRefreshingJob.cpp in Sources */, - DF5E699B1B28121E009A88C3 /* PVRTimerType.cpp in Sources */, 7CCDA0DC192753E30074CF51 /* PltAction.cpp in Sources */, 7CCDA0E5192753E30074CF51 /* PltArgument.cpp in Sources */, 7CCDA0EE192753E30074CF51 /* PltConstants.cpp in Sources */, @@ -11151,7 +13114,6 @@ 7CCDA100192753E30074CF51 /* PltCtrlPointTask.cpp in Sources */, 7CCDA109192753E30074CF51 /* PltDatagramStream.cpp in Sources */, 7CCDA112192753E30074CF51 /* PltDeviceData.cpp in Sources */, - DFEA4B501B5271EB00562321 /* ActiveAEDSP.cpp in Sources */, 7CCDA11B192753E30074CF51 /* PltDeviceHost.cpp in Sources */, 7CCDA124192753E30074CF51 /* PltEvent.cpp in Sources */, 7CCDA12D192753E30074CF51 /* PltHttp.cpp in Sources */, @@ -11167,9 +13129,7 @@ 7CCDA17E192753E30074CF51 /* PltStateVariable.cpp in Sources */, 7CCDA187192753E30074CF51 /* PltTaskManager.cpp in Sources */, 7CCDA190192753E30074CF51 /* PltThreadTask.cpp in Sources */, - 7C8E02201BA35D0B0072E8B2 /* ApplicationBuiltins.cpp in Sources */, 7CCDA199192753E30074CF51 /* PltUPnP.cpp in Sources */, - DF54F7FF1B6580AD000FCBA4 /* ContextMenuItem.cpp in Sources */, 7CCDA1A2192753E30074CF51 /* PltMediaConnect.cpp in Sources */, 7CCDA1AB192753E30074CF51 /* PltXbox360.cpp in Sources */, 7CCDA1B0192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */, @@ -11178,7 +13138,6 @@ 7CCDA1D1192753E30074CF51 /* PltMediaRenderer.cpp in Sources */, 7CCDA1DC192753E30074CF51 /* RdrConnectionManagerSCPD.cpp in Sources */, 7CCDA1E7192753E30074CF51 /* RenderingControlSCPD.cpp in Sources */, - 7C8E02381BA35D0B0072E8B2 /* PictureBuiltins.cpp in Sources */, 7CCDA1F4192753E30074CF51 /* ConnectionManagerSCPD.cpp in Sources */, 7CCDA1FF192753E30074CF51 /* ContentDirectorySCPD.cpp in Sources */, 7CCDA20A192753E30074CF51 /* ContentDirectorywSearchSCPD.cpp in Sources */, @@ -11206,7 +13165,6 @@ 7CCDA7D1192756250074CF51 /* NptHttp.cpp in Sources */, 7CCDA7DA192756250074CF51 /* NptJson.cpp in Sources */, 7CCDA7DD192756250074CF51 /* NptList.cpp in Sources */, - 7C8E02291BA35D0B0072E8B2 /* GUIBuiltins.cpp in Sources */, 7CCDA7E6192756250074CF51 /* NptLogging.cpp in Sources */, 7CCDA7E9192756250074CF51 /* NptMessaging.cpp in Sources */, 7CCDA7F2192756250074CF51 /* NptNetwork.cpp in Sources */, @@ -11218,7 +13176,6 @@ 7CCDA819192756250074CF51 /* NptSockets.cpp in Sources */, 7CCDA822192756250074CF51 /* NptStreams.cpp in Sources */, 7CCDA82B192756250074CF51 /* NptStrings.cpp in Sources */, - 7C226E3F1BA5F61D00185CE0 /* AddonCallbacksAudioEngine.cpp in Sources */, 7CCDA834192756250074CF51 /* NptSystem.cpp in Sources */, 7CCDA83D192756250074CF51 /* NptThreads.cpp in Sources */, 7CCDA846192756250074CF51 /* NptTime.cpp in Sources */, @@ -11229,7 +13186,6 @@ 7CCDA86D192756250074CF51 /* NptZip.cpp in Sources */, B5011E4219AF3B56005ADF89 /* PosixFile.cpp in Sources */, 7CCDAA83192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */, - 7C8E02351BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */, 7CCDAA86192756250074CF51 /* NptPosixEnvironment.cpp in Sources */, 7CCDAA8C192756250074CF51 /* NptPosixNetwork.cpp in Sources */, 7CCDAA8F192756250074CF51 /* NptPosixQueue.cpp in Sources */, @@ -11241,7 +13197,6 @@ 7CCDAC9019275CA70074CF51 /* NptBsdResolver.cpp in Sources */, 7CCDAC9319275CA70074CF51 /* NptBsdSockets.cpp in Sources */, 7CCDACA819275D1F0074CF51 /* NptStdcDebug.cpp in Sources */, - DF29BCFB1B5D911800904347 /* GUIViewStateEventLog.cpp in Sources */, 7CCDACB119275D1F0074CF51 /* NptStdcEnvironment.cpp in Sources */, 7CCDACC219275D790074CF51 /* NptAppleAutoreleasePool.mm in Sources */, 7CCDACCB19275D790074CF51 /* NptAppleLogConfig.mm in Sources */, @@ -11251,10 +13206,6 @@ 7CF34DA01930264A00D543C5 /* AudioEncoder.cpp in Sources */, 395C29F71A98B44B00EBC7AD /* AddonModuleXbmcwsgi.cpp in Sources */, 7CF80DCA19710DC2003B2B34 /* KeyboardLayout.cpp in Sources */, - DF2863B819918B07008994AB /* Gif.cpp in Sources */, - B179BD6C1AD8EA7B00EA8D49 /* InputCodingTableBaiduPY.cpp in Sources */, - B179BD6F1AD8EA7B00EA8D49 /* InputCodingTableBasePY.cpp in Sources */, - B179BD721AD8EA7B00EA8D49 /* InputCodingTableFactory.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -11269,6 +13220,14 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + DFF0F4901752838E002DA3A4 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + DFF0F4911752838E002DA3A4 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; E49910A8174D0E2A00741B6D /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( @@ -11322,6 +13281,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)", + "$(SRCROOT)/lib/SlingboxLib", "$(SRCROOT)/xbmc/interfaces/json-rpc", "\"$(SRCROOT)/xbmc/interfaces/python\"", "\"$(SRCROOT)/xbmc/interfaces/legacy\"", @@ -11381,6 +13341,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)", + "$(SRCROOT)/lib/SlingboxLib", "$(SRCROOT)/xbmc/interfaces/json-rpc", "\"$(SRCROOT)/xbmc/interfaces/python\"", "\"$(SRCROOT)/xbmc/interfaces/legacy\"", @@ -11449,6 +13410,116 @@ }; name = Release; }; + DFFC52CC17527B3100C937AB /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DF3C3C7C1752AB68000989C3 /* App-ATV2.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = NO; + EXECUTABLE_SUFFIX = .bin; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"", + ); + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = ""; + HEADER_SEARCH_PATHS = ( + $SRCROOT, + xbmc, + xbmc/osx, + xbmc/linux, + xbmc/cores/dvdplayer, + xbmc/cores/AudioEngine, + xbmc/cores/AudioEngine/Utils, + lib, + addons/library.xbmc.addon, + $XBMC_DEPENDS/include, + $XBMC_DEPENDS/include/mysql, + $XBMC_DEPENDS/include/freetype2, + $XBMC_DEPENDS/include/python2.6, + $XBMC_DEPENDS/include/libxml2, + ); + INFOPLIST_FILE = "$SRCROOT/xbmc/osx/atv2/XBMCATV2-Info.plist"; + INSTALL_PATH = "$(HOME)/Library/Bundles"; + IPHONEOS_DEPLOYMENT_TARGET = 4.2; + LIBRARY_SEARCH_PATHS = ( + "\"$(SRCROOT)\"", + "\"$(SRCROOT)/lib/SlingboxLib\"", + "\"$(SRCROOT)/xbmc/interfaces/json-rpc\"", + "\"$(SRCROOT)/xbmc/interfaces/legacy\"", + "\"$(SRCROOT)/xbmc/interfaces/python\"", + ); + PLIST_FILE_OUTPUT_FORMAT = xml; + PREBINDING = NO; + PRODUCT_NAME = Kodi; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "2,3"; + USER_HEADER_SEARCH_PATHS = "$XBMC_DEPENDS/include $XBMC_DEPENDS/include/mysql $XBMC_DEPENDS/include/freetype2 $XBMC_DEPENDS/include/python2.6"; + VALID_ARCHS = armv7; + WRAPPER_EXTENSION = frappliance; + XBMC_DEPENDS = "$(XBMC_DEPENDS_ROOT)/$(SDK_NAME)_$(CURRENT_ARCH)-target"; + }; + name = Debug; + }; + DFFC52CD17527B3100C937AB /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DF3C3C7C1752AB68000989C3 /* App-ATV2.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EXECUTABLE_SUFFIX = .bin; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks\"", + ); + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + HEADER_SEARCH_PATHS = ( + $SRCROOT, + xbmc, + xbmc/osx, + xbmc/linux, + xbmc/cores/dvdplayer, + xbmc/cores/AudioEngine, + xbmc/cores/AudioEngine/Utils, + lib, + addons/library.xbmc.addon, + $XBMC_DEPENDS/include, + $XBMC_DEPENDS/include/mysql, + $XBMC_DEPENDS/include/freetype2, + $XBMC_DEPENDS/include/python2.6, + $XBMC_DEPENDS/include/libxml2, + ); + INFOPLIST_FILE = "$SRCROOT/xbmc/osx/atv2/XBMCATV2-Info.plist"; + INSTALL_PATH = "$(HOME)/Library/Bundles"; + IPHONEOS_DEPLOYMENT_TARGET = 4.2; + LIBRARY_SEARCH_PATHS = ( + "\"$(SRCROOT)\"", + "\"$(SRCROOT)/lib/SlingboxLib\"", + "\"$(SRCROOT)/xbmc/interfaces/json-rpc\"", + "\"$(SRCROOT)/xbmc/interfaces/legacy\"", + "\"$(SRCROOT)/xbmc/interfaces/python\"", + ); + PLIST_FILE_OUTPUT_FORMAT = xml; + PREBINDING = NO; + PRODUCT_NAME = Kodi; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "2,3"; + USER_HEADER_SEARCH_PATHS = "$XBMC_DEPENDS/include $XBMC_DEPENDS/include/mysql $XBMC_DEPENDS/include/freetype2 $XBMC_DEPENDS/include/python2.6"; + VALID_ARCHS = armv7; + WRAPPER_EXTENSION = frappliance; + XBMC_DEPENDS = "$(XBMC_DEPENDS_ROOT)/$(SDK_NAME)_$(ARCHS)-target"; + ZERO_LINK = NO; + }; + name = Release; + }; E49910A3174D0D2600741B6D /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = E49910D0174E2DFF00741B6D /* App-iOS.xcconfig */; @@ -11459,8 +13530,7 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -11500,8 +13570,7 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -11552,7 +13621,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6E2FACC10E26DFA300DF79EA /* Build configuration list for PBXNativeTarget "Kodi.app" */ = { + 6E2FACC10E26DFA300DF79EA /* Build configuration list for PBXAggregateTarget "Kodi.app" */ = { isa = XCConfigurationList; buildConfigurations = ( 6E2FACBB0E26DF7A00DF79EA /* Debug */, @@ -11560,6 +13629,15 @@ ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; + }; + DFFC52CE17527B4F00C937AB /* Build configuration list for PBXNativeTarget "Kodi-ATV2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DFFC52CC17527B3100C937AB /* Debug */, + DFFC52CD17527B3100C937AB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; E49910A5174D0D2600741B6D /* Build configuration list for PBXNativeTarget "Kodi-iOS" */ = { isa = XCConfigurationList; diff -Nru kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.adsp/libKODI_adsp.cpp kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.adsp/libKODI_adsp.cpp --- kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.adsp/libKODI_adsp.cpp 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.adsp/libKODI_adsp.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,174 +0,0 @@ -/* - * Copyright (C) 2013-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include -#include -#include "../../../addons/library.kodi.adsp/libKODI_adsp.h" -#include "addons/AddonCallbacks.h" - -#ifdef _WIN32 -#include -#define DLLEXPORT __declspec(dllexport) -#else -#define DLLEXPORT -#endif - -using namespace std; - -extern "C" -{ - -DLLEXPORT void* ADSP_register_me(void *hdl) -{ - CB_ADSPLib *cb = NULL; - if (!hdl) - fprintf(stderr, "libKODI_adsp-ERROR: ADSPLib_register_me is called with NULL handle !!!\n"); - else - { - cb = ((AddonCB*)hdl)->ADSPLib_RegisterMe(((AddonCB*)hdl)->addonData); - if (!cb) - fprintf(stderr, "libKODI_adsp-ERROR: ADSPLib_register_me can't get callback table from KODI !!!\n"); - } - return cb; -} - -DLLEXPORT void ADSP_unregister_me(void *hdl, void* cb) -{ - if (hdl && cb) - ((AddonCB*)hdl)->ADSPLib_UnRegisterMe(((AddonCB*)hdl)->addonData, (CB_ADSPLib*)cb); -} - -DLLEXPORT void ADSP_add_menu_hook(void *hdl, void* cb, AE_DSP_MENUHOOK *hook) -{ - if (cb == NULL) - return; - - ((CB_ADSPLib*)cb)->AddMenuHook(((AddonCB*)hdl)->addonData, hook); -} - -DLLEXPORT void ADSP_remove_menu_hook(void *hdl, void* cb, AE_DSP_MENUHOOK *hook) -{ - if (cb == NULL) - return; - - ((CB_ADSPLib*)cb)->RemoveMenuHook(((AddonCB*)hdl)->addonData, hook); -} - -DLLEXPORT void ADSP_register_mode(void *hdl, void* cb, AE_DSP_MODES::AE_DSP_MODE *mode) -{ - if (cb == NULL) - return; - - ((CB_ADSPLib*)cb)->RegisterMode(((AddonCB*)hdl)->addonData, mode); -} - -DLLEXPORT void ADSP_unregister_mode(void *hdl, void* cb, AE_DSP_MODES::AE_DSP_MODE *mode) -{ - if (cb == NULL) - return; - - ((CB_ADSPLib*)cb)->UnregisterMode(((AddonCB*)hdl)->addonData, mode); -} - -///------------------------------------- -/// CAddonSoundPlay - -DLLEXPORT CAddonSoundPlay* ADSP_get_sound_play(void *hdl, void *cb, const char *filename) -{ - return new CAddonSoundPlay(hdl, cb, filename); -} - -DLLEXPORT void ADSP_release_sound_play(CAddonSoundPlay* p) -{ - delete p; -} - -CAddonSoundPlay::CAddonSoundPlay(void *hdl, void *cb, const char *filename) - : m_Filename(filename) -{ - m_PlayHandle = NULL; - if (!hdl || !cb) - fprintf(stderr, "libKODI_adsp-ERROR: ADSP_get_sound_play is called with NULL handle !!!\n"); - else - { - m_Handle = hdl; - m_cb = cb; - m_PlayHandle = ((CB_ADSPLib*)m_cb)->SoundPlay_GetHandle(((AddonCB*)m_Handle)->addonData, m_Filename.c_str()); - if (!m_PlayHandle) - fprintf(stderr, "libKODI_adsp-ERROR: ADSP_get_sound_play can't get callback table from KODI !!!\n"); - } -} - -CAddonSoundPlay::~CAddonSoundPlay() -{ - if (m_PlayHandle) - ((CB_ADSPLib*)m_cb)->SoundPlay_ReleaseHandle(((AddonCB*)m_Handle)->addonData, m_PlayHandle); -} - -void CAddonSoundPlay::Play() -{ - if (m_PlayHandle) - ((CB_ADSPLib*)m_cb)->SoundPlay_Play(((AddonCB*)m_Handle)->addonData, m_PlayHandle); -} - -void CAddonSoundPlay::Stop() -{ - if (m_PlayHandle) - ((CB_ADSPLib*)m_cb)->SoundPlay_Stop(((AddonCB*)m_Handle)->addonData, m_PlayHandle); -} - -bool CAddonSoundPlay::IsPlaying() -{ - if (!m_PlayHandle) - return false; - - return ((CB_ADSPLib*)m_cb)->SoundPlay_IsPlaying(((AddonCB*)m_Handle)->addonData, m_PlayHandle); -} - -void CAddonSoundPlay::SetChannel(AE_DSP_CHANNEL channel) -{ - if (m_PlayHandle) - ((CB_ADSPLib*)m_cb)->SoundPlay_SetChannel(((AddonCB*)m_Handle)->addonData, m_PlayHandle, channel); -} - -AE_DSP_CHANNEL CAddonSoundPlay::GetChannel() -{ - if (!m_PlayHandle) - return AE_DSP_CH_INVALID; - return ((CB_ADSPLib*)m_cb)->SoundPlay_GetChannel(((AddonCB*)m_Handle)->addonData, m_PlayHandle); -} - -void CAddonSoundPlay::SetVolume(float volume) -{ - if (m_PlayHandle) - ((CB_ADSPLib*)m_cb)->SoundPlay_SetVolume(((AddonCB*)m_Handle)->addonData, m_PlayHandle, volume); -} - -float CAddonSoundPlay::GetVolume() -{ - if (!m_PlayHandle) - return 0.0f; - - return ((CB_ADSPLib*)m_cb)->SoundPlay_GetVolume(((AddonCB*)m_Handle)->addonData, m_PlayHandle); -} - -}; diff -Nru kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.adsp/Makefile.in kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.adsp/Makefile.in --- kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.adsp/Makefile.in 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.adsp/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -ARCH=@ARCH@ -INCLUDES=-I. -I../../../xbmc/addons/include -I../../../xbmc -I../../../xbmc/cores/dvdplayer/DVDDemuxers -DEFINES+= -CXXFLAGS=-fPIC -LIBNAME=libKODI_adsp -OBJS=$(LIBNAME).o - -LIB_SHARED=../../../addons/library.kodi.adsp/$(LIBNAME)-$(ARCH).so - -all: $(LIB_SHARED) - -$(LIB_SHARED): $(OBJS) -ifeq ($(findstring osx,$(ARCH)), osx) - $(CXX) $(LDFLAGS) -Wl,-alias_list,@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper_mach_alias \ - -bundle -undefined dynamic_lookup -o $@ \ - @abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o $(OBJS) -else - $(CXX) $(CFLAGS) $(LDFLAGS) -shared -g -o $(LIB_SHARED) $(OBJS) -endif - -CLEAN_FILES = \ - $(LIB_SHARED) \ - -DISTCLEAN_FILES= \ - Makefile \ - -include ../../../Makefile.include diff -Nru kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.adsp/project/VS2010Express/libKODI_adsp.vcxproj kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.adsp/project/VS2010Express/libKODI_adsp.vcxproj --- kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.adsp/project/VS2010Express/libKODI_adsp.vcxproj 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.adsp/project/VS2010Express/libKODI_adsp.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {44F93C4D-85DD-4452-99BB-F1D196174024} - KODI_ADSP - Win32Proj - - - - - DynamicLibrary - false - MultiByte - - - DynamicLibrary - true - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\..\..\..\addons\library.kodi.adsp\ - Debug\ - ..\..\..\..\..\addons\library.kodi.adsp\ - Release\ - ..\..\..\..\..\addons\library.xbmc.addon\;$(IncludePath) - ..\..\..\..\..\addons\library.xbmc.addon\;$(IncludePath) - - - - ..\..\..\..\..\xbmc;..\..\..\..\..\xbmc\addons\include;..\..\..\..\..\xbmc\cores\dvdplayer\DVDDemuxers;..\..\..\..\..\addons\library.xbmc.addon;%(AdditionalIncludeDirectories) - VDR_EXPORTS;_WIN32PC;%(PreprocessorDefinitions) - Sync - - - - - ..\..\..\..\..\addons\library.kodi.adsp\$(ProjectName).dll - - - - - ..\..\..\..\..\xbmc;..\..\..\..\..\xbmc\addons\include;..\..\..\..\..\xbmc\cores\dvdplayer\DVDDemuxers;..\..\..\..\..\addons\library.xbmc.addon;%(AdditionalIncludeDirectories) - HAS_SDL_OPENGL;HAS_SDL;_USRDLL;XBMC_VDR_EXPORTS;_WIN32PC;%(PreprocessorDefinitions) - Sync - - - - - ..\..\..\..\..\addons\library.kodi.adsp\$(ProjectName).dll - - - - - - - - - diff -Nru kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.adsp/project/VS2010Express/libKODI_adsp.vcxproj.filters kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.adsp/project/VS2010Express/libKODI_adsp.vcxproj.filters --- kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.adsp/project/VS2010Express/libKODI_adsp.vcxproj.filters 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.adsp/project/VS2010Express/libKODI_adsp.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - - - - - {A463B136-5D8C-4995-A8D5-67FA2B90B6A8} - cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {EAFF7342-E9A9-4164-A40A-639A72C620DA} - h;hpp;hxx;hm;inl;inc;xsd - - - - - Source Files - - - diff -Nru kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.audioengine/libKODI_audioengine.cpp kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.audioengine/libKODI_audioengine.cpp --- kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.audioengine/libKODI_audioengine.cpp 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.audioengine/libKODI_audioengine.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,236 +0,0 @@ -/* - * Copyright (C) 2013-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include -#include -#include "../../../addons/library.kodi.audioengine/libKODI_audioengine.h" -#include "addons/AddonCallbacks.h" - -#ifdef _WIN32 -#include -#define DLLEXPORT __declspec(dllexport) -#else -#define DLLEXPORT -#endif - -using namespace std; - -#define LIBRARY_NAME "libKODI_audioengine" - -extern "C" -{ - -DLLEXPORT void* AudioEngine_register_me(void *hdl) -{ - CB_AudioEngineLib *cb = NULL; - if (!hdl) - fprintf(stderr, "%s-ERROR: AudioEngine_register_me is called with NULL handle !!!\n", LIBRARY_NAME); - else - { - cb = ((AddonCB*)hdl)->AudioEngineLib_RegisterMe(((AddonCB*)hdl)->addonData); - if (!cb) - fprintf(stderr, "%s-ERROR: AudioEngine_register_me can't get callback table from KODI !!!\n", LIBRARY_NAME); - } - return cb; -} - -DLLEXPORT void AudioEngine_unregister_me(void *hdl, void* cb) -{ - if (hdl && cb) - ((AddonCB*)hdl)->AudioEngineLib_UnRegisterMe(((AddonCB*)hdl)->addonData, (CB_AudioEngineLib*)cb); -} - -// --------------------------------------------- -// CAddonAEStream implementations -// --------------------------------------------- -DLLEXPORT CAddonAEStream* AudioEngine_make_stream(void *hdl, void *cb, AEDataFormat DataFormat, unsigned int SampleRate, unsigned int EncodedSampleRate, enum AEChannel *Channels, unsigned int Options) -{ - if (!hdl || !cb) - { - fprintf(stderr, "%s-ERROR: AudioEngine_register_me is called with NULL handle !!!\n", LIBRARY_NAME); - return NULL; - } - - AEStreamHandle *streamHandle = ((CB_AudioEngineLib*)cb)->MakeStream(DataFormat, SampleRate, EncodedSampleRate, Channels, Options); - if (!streamHandle) - { - fprintf(stderr, "%s-ERROR: AudioEngine_make_stream MakeStream failed!\n", LIBRARY_NAME); - return NULL; - } - - return new CAddonAEStream(hdl, cb, streamHandle); -} - -DLLEXPORT void AudioEngine_free_stream(CAddonAEStream *p) -{ - if (p) - { - delete p; - } -} - -DLLEXPORT bool AudioEngine_get_current_sink_Format(void *hdl, void *cb, AudioEngineFormat *SinkFormat) -{ - if (!cb) - { - return false; - } - - return ((CB_AudioEngineLib*)cb)->GetCurrentSinkFormat(((AddonCB*)hdl)->addonData, SinkFormat); -} - -CAddonAEStream::CAddonAEStream(void *Addon, void *Callbacks, AEStreamHandle *StreamHandle) -{ - m_AddonHandle = Addon; - m_Callbacks = Callbacks; - m_StreamHandle = StreamHandle; -} - -CAddonAEStream::~CAddonAEStream() -{ - if (m_StreamHandle) - { - ((CB_AudioEngineLib*)m_Callbacks)->FreeStream(m_StreamHandle); - m_StreamHandle = NULL; - } -} - -unsigned int CAddonAEStream::GetSpace() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetSpace(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -unsigned int CAddonAEStream::AddData(uint8_t* const *Data, unsigned int Offset, unsigned int Frames) -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_AddData(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle, Data, Offset, Frames); -} - -double CAddonAEStream::GetDelay() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetDelay(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -bool CAddonAEStream::IsBuffering() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_IsBuffering(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -double CAddonAEStream::GetCacheTime() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetCacheTime(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -double CAddonAEStream::GetCacheTotal() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetCacheTotal(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -void CAddonAEStream::Pause() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_Pause(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -void CAddonAEStream::Resume() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_Resume(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -void CAddonAEStream::Drain(bool Wait) -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_Drain(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle, Wait); -} - -bool CAddonAEStream::IsDraining() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_IsDraining(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -bool CAddonAEStream::IsDrained() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_IsDrained(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -void CAddonAEStream::Flush() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_Flush(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -float CAddonAEStream::GetVolume() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetVolume(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -void CAddonAEStream::SetVolume(float Volume) -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_SetVolume(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle, Volume); -} - -float CAddonAEStream::GetAmplification() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetAmplification(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -void CAddonAEStream::SetAmplification(float Amplify) -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_SetAmplification(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle, Amplify); -} - -const unsigned int CAddonAEStream::GetFrameSize() const -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetFrameSize(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -const unsigned int CAddonAEStream::GetChannelCount() const -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetChannelCount(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -const unsigned int CAddonAEStream::GetSampleRate() const -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetSampleRate(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -const unsigned int CAddonAEStream::GetEncodedSampleRate() const -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetEncodedSampleRate(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -const AEDataFormat CAddonAEStream::GetDataFormat() const -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetDataFormat(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -double CAddonAEStream::GetResampleRatio() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_GetResampleRatio(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} - -bool CAddonAEStream::SetResampleRatio(double Ratio) -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_SetResampleRatio(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle, Ratio); -} - -void CAddonAEStream::Discontinuity() -{ - return ((CB_AudioEngineLib*)m_Callbacks)->AEStream_Discontinuity(((AddonCB*)m_AddonHandle)->addonData, m_StreamHandle); -} -}; diff -Nru kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.audioengine/Makefile.in kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.audioengine/Makefile.in --- kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.audioengine/Makefile.in 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.audioengine/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -ARCH=@ARCH@ -INCLUDES=-I. -I../../../xbmc/addons/include -I../../../xbmc -DEFINES+= -CXXFLAGS=-fPIC -LIBNAME=libKODI_audioengine -OBJS=$(LIBNAME).o - -LIB_SHARED=../../../addons/library.kodi.audioengine/$(LIBNAME)-$(ARCH).so - -all: $(LIB_SHARED) - -$(LIB_SHARED): $(OBJS) -ifeq ($(findstring osx,$(ARCH)), osx) - $(CXX) $(LDFLAGS) -Wl,-alias_list,@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper_mach_alias \ - -bundle -undefined dynamic_lookup -o $@ \ - @abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o $(OBJS) -else - $(CXX) $(CFLAGS) $(LDFLAGS) -shared -g -o $(LIB_SHARED) $(OBJS) -endif - -CLEAN_FILES = \ - $(LIB_SHARED) \ - -DISTCLEAN_FILES= \ - Makefile \ - -include ../../../Makefile.include diff -Nru kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.audioengine/project/VS2010Express/libKODI_audioengine.vcxproj kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.audioengine/project/VS2010Express/libKODI_audioengine.vcxproj --- kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.audioengine/project/VS2010Express/libKODI_audioengine.vcxproj 2016-04-25 08:01:33.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.audioengine/project/VS2010Express/libKODI_audioengine.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - - - - - - - {6B96FD7D-26EE-415B-8858-27757A0B1273} - KODI_ADSP - Win32Proj - - - - - DynamicLibrary - false - MultiByte - - - DynamicLibrary - true - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\..\..\..\addons\library.kodi.audioengine\ - Debug\ - ..\..\..\..\..\addons\library.kodi.audioengine\ - Release\ - ..\..\..\..\..\addons\library.xbmc.addon\;$(IncludePath) - ..\..\..\..\..\addons\library.xbmc.addon\;$(IncludePath) - - - - ..\..\..\..\..\xbmc\;..\..\..\..\..\xbmc\addons\include\;..\..\..\..\..\addons\library.xbmc.addon\;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;VDR_EXPORTS;_WIN32PC;%(PreprocessorDefinitions) - Sync - - - - - ..\..\..\..\..\addons\library.kodi.audioengine\$(ProjectName).dll - - - - - ..\..\..\..\..\xbmc\;..\..\..\..\..\xbmc\addons\include\;..\..\..\..\..\addons\library.xbmc.addon\;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;HAS_SDL_OPENGL;HAS_SDL;_USRDLL;XBMC_VDR_EXPORTS;_WIN32PC;%(PreprocessorDefinitions) - Sync - - - - - ..\..\..\..\..\addons\library.kodi.audioengine\$(ProjectName).dll - - - - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.audioengine/project/VS2010Express/libKODI_audioengine.vcxproj.filters kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.audioengine/project/VS2010Express/libKODI_audioengine.vcxproj.filters --- kodi-16.1~git20160425.1001-final/lib/addons/library.kodi.audioengine/project/VS2010Express/libKODI_audioengine.vcxproj.filters 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/addons/library.kodi.audioengine/project/VS2010Express/libKODI_audioengine.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - {A463B136-5D8C-4995-A8D5-67FA2B90B6A8} - cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {EAFF7342-E9A9-4164-A40A-639A72C620DA} - h;hpp;hxx;hm;inl;inc;xsd - - - - - Source Files - - - - - Header Files - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/cximage-6.0/CxImage/ximamng.cpp kodi-15.2~git20151019.1039-final/lib/cximage-6.0/CxImage/ximamng.cpp --- kodi-16.1~git20160425.1001-final/lib/cximage-6.0/CxImage/ximamng.cpp 2016-04-25 08:01:34.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/cximage-6.0/CxImage/ximamng.cpp 2012-11-18 14:13:50.000000000 +0000 @@ -253,8 +253,6 @@ // read all while(pData->bReading){ retval = mng_display_resume(hmng); - if (retval != MNG_NEEDTIMERWAIT) - break; info.nNumFrames++; } diff -Nru kodi-16.1~git20160425.1001-final/lib/cximage-6.0/CxImage/ximapng.cpp kodi-15.2~git20151019.1039-final/lib/cximage-6.0/CxImage/ximapng.cpp --- kodi-16.1~git20160425.1001-final/lib/cximage-6.0/CxImage/ximapng.cpp 2016-04-25 08:01:34.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/cximage-6.0/CxImage/ximapng.cpp 2012-11-18 14:13:50.000000000 +0000 @@ -73,7 +73,6 @@ #endif /* Free all of the memory associated with the png_ptr and info_ptr */ delete [] row_pointers; - row_pointers = nullptr; png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); cx_throw(""); } @@ -468,7 +467,6 @@ } delete [] row_pointers; - row_pointers = nullptr; /* read the rest of the file, getting any additional chunks in info_ptr */ png_read_end(png_ptr, info_ptr); @@ -790,7 +788,6 @@ } delete [] row_pointers; - row_pointers = nullptr; //if necessary, restore the original palette if (!bGrayScale && head.biClrUsed && info.nBkgndIndex>0) diff -Nru kodi-16.1~git20160425.1001-final/lib/cximage-6.0/mng/libmng_hlapi.c kodi-15.2~git20151019.1039-final/lib/cximage-6.0/mng/libmng_hlapi.c --- kodi-16.1~git20160425.1001-final/lib/cximage-6.0/mng/libmng_hlapi.c 2016-04-25 08:01:34.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/cximage-6.0/mng/libmng_hlapi.c 2012-11-18 14:14:01.000000000 +0000 @@ -2434,8 +2434,6 @@ pData->bSuspended = MNG_FALSE; /* now reset this flag */ /* and continue reading */ iRetcode = mng_read_graphic (pData); - if (iRetcode) - return iRetcode; if (pData->bEOF) /* already at EOF ? */ { diff -Nru kodi-16.1~git20160425.1001-final/lib/cximage-6.0/raw/dcraw.c kodi-15.2~git20151019.1039-final/lib/cximage-6.0/raw/dcraw.c --- kodi-16.1~git20160425.1001-final/lib/cximage-6.0/raw/dcraw.c 2016-04-25 08:01:34.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/cximage-6.0/raw/dcraw.c 2015-10-19 08:39:15.000000000 +0000 @@ -820,8 +820,7 @@ int CLASS ljpeg_start (struct jhead *jh, int info_only) { - int c, tag; - ushort len; + int c, tag, len; uchar data[0x10000], *dp; init_decoder(); Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/lib/groovy/commons-lang-2.6.jar and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/lib/groovy/commons-lang-2.6.jar differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/lib/groovy/groovy-all-2.1.7.jar and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/lib/groovy/groovy-all-2.1.7.jar differ diff -Nru kodi-16.1~git20160425.1001-final/lib/libexif/ExifParse.cpp kodi-15.2~git20151019.1039-final/lib/libexif/ExifParse.cpp --- kodi-16.1~git20160425.1001-final/lib/libexif/ExifParse.cpp 2016-04-25 08:01:34.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libexif/ExifParse.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -83,7 +83,6 @@ #define TAG_FOCALLENGTH 0x920A #define TAG_MAKER_NOTE 0x927C // Not processed yet. Maybe in the future. #define TAG_USERCOMMENT 0x9286 -#define TAG_XP_COMMENT 0x9c9c #define TAG_FLASHPIX_VERSION 0xA000 // Not processed. #define TAG_COLOUR_SPACE 0xA001 // Not processed. Format int16u. Values: 1-RGB; 2-Adobe RGB 65535-Uncalibrated #define TAG_EXIF_IMAGEWIDTH 0xa002 @@ -420,7 +419,6 @@ int length = max(ByteCount, 0); length = min(length, MAX_COMMENT); strncpy(m_ExifInfo->Description, (char *)ValuePtr, length); - m_ExifInfo->Description[length] = '\0'; break; } case TAG_MAKE: strncpy(m_ExifInfo->CameraMake, (char *)ValuePtr, 32); break; @@ -477,22 +475,11 @@ int length = ByteCount - EXIF_COMMENT_CHARSET_LENGTH; length = min(length, MAX_COMMENT); memcpy(m_ExifInfo->Comments, ValuePtr + EXIF_COMMENT_CHARSET_LENGTH, length); - m_ExifInfo->Comments[length] = '\0'; // FixComment(comment); // Ensure comment is printable } } break; - case TAG_XP_COMMENT: - { - // The XP user comment field is always unicode (UCS-2) encoded - m_ExifInfo->XPCommentsCharset = EXIF_COMMENT_CHARSET_UNICODE; - size_t length = min(ByteCount, MAX_COMMENT); - memcpy(m_ExifInfo->XPComment, ValuePtr, length); - m_ExifInfo->XPComment[length] = '\0'; - } - break; - case TAG_FNUMBER: // Simplest way of expressing aperture, so I trust it the most. // (overwrite previously computd value if there is one) @@ -520,7 +507,10 @@ // Tends to be less accurate as distance increases. { float distance = (float)ConvertAnyFormat(ValuePtr, Format); - m_ExifInfo->Distance = distance; + if (distance < 0) + m_ExifInfo->Distance = distance; // infinite + else + m_ExifInfo->Distance = distance; } break; diff -Nru kodi-16.1~git20160425.1001-final/lib/libexif/JpegParse.cpp kodi-15.2~git20151019.1039-final/lib/libexif/JpegParse.cpp --- kodi-16.1~git20160425.1001-final/lib/libexif/JpegParse.cpp 2016-04-25 08:01:34.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libexif/JpegParse.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -100,12 +100,6 @@ //-------------------------------------------------------------------------- bool CJpegParse::GetSection (FILE *infile, const unsigned short sectionLength) { - if (sectionLength < 2) - { - printf("JpgParse: invalid section length"); - return false; - } - m_SectionBuffer = new unsigned char[sectionLength]; if (m_SectionBuffer == NULL) { @@ -206,9 +200,7 @@ if (m_SectionBuffer != NULL) { // CExifParse::FixComment(comment); // Ensure comment is printable - unsigned short length = min(itemlen - 2, MAX_COMMENT); - strncpy(m_ExifInfo.FileComment, (char *)&m_SectionBuffer[2], length); - m_ExifInfo.FileComment[length] = '\0'; + strncpy(m_ExifInfo.Comments, (char *)&m_SectionBuffer[2], min(itemlen-2, MAX_COMMENT)); } ReleaseSection(); break; diff -Nru kodi-16.1~git20160425.1001-final/lib/libexif/libexif.h kodi-15.2~git20151019.1039-final/lib/libexif/libexif.h --- kodi-16.1~git20160425.1001-final/lib/libexif/libexif.h 2016-04-25 08:01:34.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libexif/libexif.h 2015-10-19 08:39:15.000000000 +0000 @@ -81,7 +81,7 @@ #define EXIF_COMMENT_CHARSET_UNICODE 3 // Exif: Unicode (UTF-16) #define EXIF_COMMENT_CHARSET_JIS 4 // Exif: JIS X208-1990 -#define MAX_COMMENT 65533 // 2 bytes - 2 for the length param +#define MAX_COMMENT 2000 #define MAX_DATE_COPIES 10 typedef struct { @@ -108,11 +108,8 @@ int ISOequivalent; int LightSource; int CommentsCharset; // EXIF_COMMENT_CHARSET_* - int XPCommentsCharset; - char Comments[MAX_COMMENT + 1]; // +1 for null termination - char FileComment[MAX_COMMENT + 1]; - char XPComment[MAX_COMMENT + 1]; - char Description[MAX_COMMENT + 1]; + char Comments[MAX_COMMENT]; + char Description[MAX_COMMENT]; unsigned ThumbnailOffset; // Exif offset to thumbnail unsigned ThumbnailSize; // Size of thumbnail. diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun/hdhomerun.vcxproj kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun/hdhomerun.vcxproj --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun/hdhomerun.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun/hdhomerun.vcxproj 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,140 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + libhdhomerun_dll + {1E2FB608-3DD2-4021-A598-90008FA6DE85} + hdhomerun + Win32Proj + + + + + DynamicLibrary + false + Unicode + true + + + DynamicLibrary + true + Unicode + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)libs\$(ProjectName)\$(Configuration)\ + $(SolutionDir)objs\$(ProjectName)\$(Configuration)\ + $(SolutionDir)libs\$(ProjectName)\$(Configuration)\ + $(SolutionDir)objs\$(ProjectName)\$(Configuration)\ + AllRules.ruleset + + + AllRules.ruleset + + + Build + Build + hdhomerun + hdhomerun + + + + _USRDLL;DLL_EXPORT;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + CompileAsCpp + Sync + + + ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(OutDir)$(TargetName).pdb + + + $(OutDir)$(TargetName).lib + + + copy /B /Y "$(TargetPath)" "$(SolutionDir)..\..\system\$(TargetFileName)" + + + Copy Output + $(SolutionDir)..\..\system\$(TargetFileName) + $(TargetPath) + + + + + _USRDLL;DLL_EXPORT;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + Sync + + + CompileAsCpp + + + ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(OutDir)$(TargetName).pdb + + + $(OutDir)$(TargetName).lib + + + copy /B /Y "$(TargetPath)" "$(SolutionDir)..\..\system\$(TargetFileName)" + + + Copy Output + $(SolutionDir)..\..\system\$(TargetFileName) + $(TargetPath) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun/hdhomerun.vcxproj.filters kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun/hdhomerun.vcxproj.filters --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun/hdhomerun.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun/hdhomerun.vcxproj.filters 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,83 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_channels.c kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_channels.c --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_channels.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_channels.c 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,378 @@ +/* + * hdhomerun_channels.c + * + * Copyright © 2007-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#include "hdhomerun.h" + +#define FREQUENCY_RESOLUTION 62500 + +struct hdhomerun_channel_entry_t { + struct hdhomerun_channel_entry_t *next; + struct hdhomerun_channel_entry_t *prev; + uint32_t frequency; + uint8_t channel_number; + char name[16]; +}; + +struct hdhomerun_channel_list_t { + struct hdhomerun_channel_entry_t *head; + struct hdhomerun_channel_entry_t *tail; +}; + +struct hdhomerun_channelmap_range_t { + uint8_t channel_range_start; + uint8_t channel_range_end; + uint32_t frequency; + uint32_t spacing; +}; + +struct hdhomerun_channelmap_record_t { + const char *channelmap_prefix; + const char *channelmap; + const struct hdhomerun_channelmap_range_t *range_list; + const char *channelmap_scan_group; + const char *countrycodes; +}; + +/* AU antenna channels. Channels {0, 1, 2, 6, 7, 8, 9, 9A} are numbered {2, 3, 4, 5, 6, 7, 8, 9} by the HDHomeRun. */ +static const struct hdhomerun_channelmap_range_t hdhomerun_channelmap_range_au_bcast[] = { + { 2, 2, 48500000, 7000000}, + { 3, 4, 59500000, 7000000}, + { 5, 12, 177500000, 7000000}, + { 28, 69, 529500000, 7000000}, + { 0, 0, 0, 0} +}; + +/* AU cable channels. TBD. */ +static const struct hdhomerun_channelmap_range_t hdhomerun_channelmap_range_au_cable[] = { + { 0, 0, 0, 0} +}; + +/* EU antenna channels. */ +static const struct hdhomerun_channelmap_range_t hdhomerun_channelmap_range_eu_bcast[] = { + { 2, 4, 50500000, 7000000}, + { 5, 12, 177500000, 7000000}, + { 21, 69, 474000000, 8000000}, + { 0, 0, 0, 0} +}; + +/* EU cable channels. Channels do not have simple numbers - the HDHomeRun uses its own numbering scheme (subject to change). */ +static const struct hdhomerun_channelmap_range_t hdhomerun_channelmap_range_eu_cable[] = { + { 6, 7, 113000000, 8000000}, + { 9, 100, 138000000, 8000000}, + { 0, 0, 0, 0} +}; + +/* US antenna channels. */ +static const struct hdhomerun_channelmap_range_t hdhomerun_channelmap_range_us_bcast[] = { + { 2, 4, 57000000, 6000000}, + { 5, 6, 79000000, 6000000}, + { 7, 13, 177000000, 6000000}, + { 14, 69, 473000000, 6000000}, + { 0, 0, 0, 0} +}; + +/* US cable channels. */ +static const struct hdhomerun_channelmap_range_t hdhomerun_channelmap_range_us_cable[] = { + { 2, 4, 57000000, 6000000}, + { 5, 6, 79000000, 6000000}, + { 7, 13, 177000000, 6000000}, + { 14, 22, 123000000, 6000000}, + { 23, 94, 219000000, 6000000}, + { 95, 99, 93000000, 6000000}, + {100, 135, 651000000, 6000000}, + { 0, 0, 0, 0} +}; + +/* US cable channels (HRC). */ +static const struct hdhomerun_channelmap_range_t hdhomerun_channelmap_range_us_hrc[] = { + { 2, 4, 55752700, 6000300}, + { 5, 6, 79753900, 6000300}, + { 7, 13, 175758700, 6000300}, + { 14, 22, 121756000, 6000300}, + { 23, 94, 217760800, 6000300}, + { 95, 99, 91754500, 6000300}, + {100, 135, 649782400, 6000300}, + { 0, 0, 0, 0} +}; + +/* US cable channels (IRC). */ +static const struct hdhomerun_channelmap_range_t hdhomerun_channelmap_range_us_irc[] = { + { 2, 4, 57012500, 6000000}, + { 5, 6, 81012500, 6000000}, + { 7, 13, 177012500, 6000000}, + { 14, 22, 123012500, 6000000}, + { 23, 41, 219012500, 6000000}, + { 42, 42, 333025000, 6000000}, + { 43, 94, 339012500, 6000000}, + { 95, 97, 93012500, 6000000}, + { 98, 99, 111025000, 6000000}, + {100, 135, 651012500, 6000000}, + { 0, 0, 0, 0} +}; + +static const struct hdhomerun_channelmap_record_t hdhomerun_channelmap_table[] = { + {"au", "au-bcast", hdhomerun_channelmap_range_au_bcast, "au-bcast", "AU"}, + {"au", "au-cable", hdhomerun_channelmap_range_au_cable, "au-cable", "AU"}, + {"eu", "eu-bcast", hdhomerun_channelmap_range_eu_bcast, "eu-bcast", "EU"}, + {"eu", "eu-cable", hdhomerun_channelmap_range_eu_cable, "eu-cable", "EU"}, + {"tw", "tw-bcast", hdhomerun_channelmap_range_us_bcast, "tw-bcast", "TW"}, + {"tw", "tw-cable", hdhomerun_channelmap_range_us_cable, "tw-cable", "TW"}, + {"us", "us-bcast", hdhomerun_channelmap_range_us_bcast, "us-bcast", "CA US"}, + {"us", "us-cable", hdhomerun_channelmap_range_us_cable, "us-cable us-hrc us-irc", "CA US"}, + {"us", "us-hrc", hdhomerun_channelmap_range_us_hrc , "us-cable us-hrc us-irc", "CA US"}, + {"us", "us-irc", hdhomerun_channelmap_range_us_irc, "us-cable us-hrc us-irc", "CA US"}, + {NULL, NULL, NULL, NULL, NULL} +}; + +const char *hdhomerun_channelmap_convert_countrycode_to_channelmap_prefix(const char *countrycode) +{ + const struct hdhomerun_channelmap_record_t *record = hdhomerun_channelmap_table; + while (record->channelmap) { + if (strstr(record->countrycodes, countrycode)) { + return record->channelmap_prefix; + } + record++; + } + + return "eu"; +} + +const char *hdhomerun_channelmap_get_channelmap_scan_group(const char *channelmap) +{ + const struct hdhomerun_channelmap_record_t *record = hdhomerun_channelmap_table; + while (record->channelmap) { + if (strstr(channelmap, record->channelmap)) { + return record->channelmap_scan_group; + } + record++; + } + + return NULL; +} + +uint8_t hdhomerun_channel_entry_channel_number(struct hdhomerun_channel_entry_t *entry) +{ + return entry->channel_number; +} + +uint32_t hdhomerun_channel_entry_frequency(struct hdhomerun_channel_entry_t *entry) +{ + return entry->frequency; +} + +const char *hdhomerun_channel_entry_name(struct hdhomerun_channel_entry_t *entry) +{ + return entry->name; +} + +struct hdhomerun_channel_entry_t *hdhomerun_channel_list_first(struct hdhomerun_channel_list_t *channel_list) +{ + return channel_list->head; +} + +struct hdhomerun_channel_entry_t *hdhomerun_channel_list_last(struct hdhomerun_channel_list_t *channel_list) +{ + return channel_list->tail; +} + +struct hdhomerun_channel_entry_t *hdhomerun_channel_list_next(struct hdhomerun_channel_list_t *channel_list, struct hdhomerun_channel_entry_t *entry) +{ + return entry->next; +} + +struct hdhomerun_channel_entry_t *hdhomerun_channel_list_prev(struct hdhomerun_channel_list_t *channel_list, struct hdhomerun_channel_entry_t *entry) +{ + return entry->prev; +} + +uint32_t hdhomerun_channel_list_total_count(struct hdhomerun_channel_list_t *channel_list) +{ + uint32_t count = 0; + + struct hdhomerun_channel_entry_t *entry = hdhomerun_channel_list_first(channel_list); + while (entry) { + count++; + entry = hdhomerun_channel_list_next(channel_list, entry); + } + + return count; +} + +uint32_t hdhomerun_channel_list_frequency_count(struct hdhomerun_channel_list_t *channel_list) +{ + uint32_t count = 0; + uint32_t last_frequency = 0; + + struct hdhomerun_channel_entry_t *entry = hdhomerun_channel_list_first(channel_list); + while (entry) { + if (entry->frequency != last_frequency) { + last_frequency = entry->frequency; + count++; + } + + entry = hdhomerun_channel_list_next(channel_list, entry); + } + + return count; +} + +uint32_t hdhomerun_channel_frequency_truncate(uint32_t frequency) +{ + return (frequency / FREQUENCY_RESOLUTION) * FREQUENCY_RESOLUTION; +} + +uint32_t hdhomerun_channel_number_to_frequency(struct hdhomerun_channel_list_t *channel_list, uint8_t channel_number) +{ + struct hdhomerun_channel_entry_t *entry = hdhomerun_channel_list_first(channel_list); + while (entry) { + if (entry->channel_number == channel_number) { + return entry->frequency; + } + + entry = hdhomerun_channel_list_next(channel_list, entry); + } + + return 0; +} + +uint8_t hdhomerun_channel_frequency_to_number(struct hdhomerun_channel_list_t *channel_list, uint32_t frequency) +{ + frequency = hdhomerun_channel_frequency_truncate(frequency); + + struct hdhomerun_channel_entry_t *entry = hdhomerun_channel_list_first(channel_list); + while (entry) { + if (entry->frequency == frequency) { + return entry->channel_number; + } + if (entry->frequency > frequency) { + return 0; + } + + entry = hdhomerun_channel_list_next(channel_list, entry); + } + + return 0; +} + +static void hdhomerun_channel_list_build_insert(struct hdhomerun_channel_list_t *channel_list, struct hdhomerun_channel_entry_t *entry) +{ + struct hdhomerun_channel_entry_t *prev = NULL; + struct hdhomerun_channel_entry_t *next = channel_list->head; + + while (next) { + if (next->frequency > entry->frequency) { + break; + } + + prev = next; + next = next->next; + } + + entry->prev = prev; + entry->next = next; + + if (prev) { + prev->next = entry; + } else { + channel_list->head = entry; + } + + if (next) { + next->prev = entry; + } else { + channel_list->tail = entry; + } +} + +static void hdhomerun_channel_list_build_range(struct hdhomerun_channel_list_t *channel_list, const char *channelmap, const struct hdhomerun_channelmap_range_t *range) +{ + uint8_t channel_number; + for (channel_number = range->channel_range_start; channel_number <= range->channel_range_end; channel_number++) { + struct hdhomerun_channel_entry_t *entry = (struct hdhomerun_channel_entry_t *)calloc(1, sizeof(struct hdhomerun_channel_entry_t)); + if (!entry) { + return; + } + + entry->channel_number = channel_number; + entry->frequency = range->frequency + ((uint32_t)(channel_number - range->channel_range_start) * range->spacing); + entry->frequency = hdhomerun_channel_frequency_truncate(entry->frequency); + sprintf(entry->name, "%s:%u", channelmap, entry->channel_number); + + hdhomerun_channel_list_build_insert(channel_list, entry); + } +} + +static void hdhomerun_channel_list_build_ranges(struct hdhomerun_channel_list_t *channel_list, const struct hdhomerun_channelmap_record_t *record) +{ + const struct hdhomerun_channelmap_range_t *range = record->range_list; + while (range->frequency) { + hdhomerun_channel_list_build_range(channel_list, record->channelmap, range); + range++; + } +} + +void hdhomerun_channel_list_destroy(struct hdhomerun_channel_list_t *channel_list) +{ + while (channel_list->head) { + struct hdhomerun_channel_entry_t *entry = channel_list->head; + channel_list->head = entry->next; + free(entry); + } + + free(channel_list); +} + +struct hdhomerun_channel_list_t *hdhomerun_channel_list_create(const char *channelmap) +{ + struct hdhomerun_channel_list_t *channel_list = (struct hdhomerun_channel_list_t *)calloc(1, sizeof(struct hdhomerun_channel_list_t)); + if (!channel_list) { + return NULL; + } + + const struct hdhomerun_channelmap_record_t *record = hdhomerun_channelmap_table; + while (record->channelmap) { + if (!strstr(channelmap, record->channelmap)) { + record++; + continue; + } + + hdhomerun_channel_list_build_ranges(channel_list, record); + record++; + } + + if (!channel_list->head) { + free(channel_list); + return NULL; + } + + return channel_list; +} diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_channelscan.c kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_channelscan.c --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_channelscan.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_channelscan.c 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,325 @@ +/* + * hdhomerun_channelscan.c + * + * Copyright © 2007-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#include "hdhomerun.h" + +struct hdhomerun_channelscan_t { + struct hdhomerun_device_t *hd; + uint32_t scanned_channels; + struct hdhomerun_channel_list_t *channel_list; + struct hdhomerun_channel_entry_t *next_channel; +}; + +struct hdhomerun_channelscan_t *channelscan_create(struct hdhomerun_device_t *hd, const char *channelmap) +{ + struct hdhomerun_channelscan_t *scan = (struct hdhomerun_channelscan_t *)calloc(1, sizeof(struct hdhomerun_channelscan_t)); + if (!scan) { + return NULL; + } + + scan->hd = hd; + + scan->channel_list = hdhomerun_channel_list_create(channelmap); + if (!scan->channel_list) { + free(scan); + return NULL; + } + + scan->next_channel = hdhomerun_channel_list_last(scan->channel_list); + return scan; +} + +void channelscan_destroy(struct hdhomerun_channelscan_t *scan) +{ + free(scan); +} + +static int channelscan_find_lock(struct hdhomerun_channelscan_t *scan, uint32_t frequency, struct hdhomerun_channelscan_result_t *result) +{ + /* Set channel. */ + char channel_str[64]; + sprintf(channel_str, "auto:%ld", (unsigned long)frequency); + + int ret = hdhomerun_device_set_tuner_channel(scan->hd, channel_str); + if (ret <= 0) { + return ret; + } + + /* Wait for lock. */ + ret = hdhomerun_device_wait_for_lock(scan->hd, &result->status); + if (ret <= 0) { + return ret; + } + if (!result->status.lock_supported) { + return 1; + } + + /* Wait for symbol quality = 100%. */ + uint64_t timeout = getcurrenttime() + 5000; + while (1) { + ret = hdhomerun_device_get_tuner_status(scan->hd, NULL, &result->status); + if (ret <= 0) { + return ret; + } + + if (result->status.symbol_error_quality == 100) { + return 1; + } + + if (getcurrenttime() >= timeout) { + return 1; + } + + msleep(250); + } +} + +static void channelscan_extract_name(struct hdhomerun_channelscan_program_t *program, const char *line) +{ + /* Find start of name. */ + const char *start = strchr(line, ' '); + if (!start) { + return; + } + start++; + + start = strchr(start, ' '); + if (!start) { + return; + } + start++; + + /* Find end of name. */ + const char *end = strstr(start, " ("); + if (!end) { + end = strchr(line, 0); + } + + if (end <= start) { + return; + } + + /* Extract name. */ + size_t length = (size_t)(end - start); + if (length > sizeof(program->name) - 1) { + length = sizeof(program->name) - 1; + } + + strncpy(program->name, start, length); + program->name[length] = 0; +} + +static int channelscan_detect_programs(struct hdhomerun_channelscan_t *scan, struct hdhomerun_channelscan_result_t *result, bool_t *pchanged, bool_t *pincomplete) +{ + *pchanged = FALSE; + *pincomplete = FALSE; + + char *streaminfo; + int ret = hdhomerun_device_get_tuner_streaminfo(scan->hd, &streaminfo); + if (ret <= 0) { + return ret; + } + + char *line = streaminfo; + int program_count = 0; + + while (1) { + char *end = strchr(line, '\n'); + if (!end) { + break; + } + + *end = 0; + + unsigned long pat_crc; + if (sscanf(line, "crc=0x%lx", &pat_crc) == 1) { + result->pat_crc = pat_crc; + continue; + } + + struct hdhomerun_channelscan_program_t program; + memset(&program, 0, sizeof(program)); + + strncpy(program.program_str, line, sizeof(program.program_str)); + program.program_str[sizeof(program.program_str) - 1] = 0; + + unsigned int program_number; + unsigned int virtual_major, virtual_minor; + if (sscanf(line, "%u: %u.%u", &program_number, &virtual_major, &virtual_minor) != 3) { + if (sscanf(line, "%u: %u", &program_number, &virtual_major) != 2) { + continue; + } + virtual_minor = 0; + } + + program.program_number = program_number; + program.virtual_major = virtual_major; + program.virtual_minor = virtual_minor; + + channelscan_extract_name(&program, line); + + if (strstr(line, "(control)")) { + program.type = HDHOMERUN_CHANNELSCAN_PROGRAM_CONTROL; + } else if (strstr(line, "(encrypted)")) { + program.type = HDHOMERUN_CHANNELSCAN_PROGRAM_ENCRYPTED; + } else if (strstr(line, "(no data)")) { + program.type = HDHOMERUN_CHANNELSCAN_PROGRAM_NODATA; + *pincomplete = TRUE; + } else { + program.type = HDHOMERUN_CHANNELSCAN_PROGRAM_NORMAL; + if ((program.virtual_major == 0) || (program.name[0] == 0)) { + *pincomplete = TRUE; + } + } + + if (memcmp(&result->programs[program_count], &program, sizeof(program)) != 0) { + memcpy(&result->programs[program_count], &program, sizeof(program)); + *pchanged = TRUE; + } + + program_count++; + if (program_count >= HDHOMERUN_CHANNELSCAN_MAX_PROGRAM_COUNT) { + break; + } + + line = end + 1; + } + + if (program_count == 0) { + *pincomplete = TRUE; + } + if (result->program_count != program_count) { + result->program_count = program_count; + *pchanged = TRUE; + } + + return 1; +} + +int channelscan_advance(struct hdhomerun_channelscan_t *scan, struct hdhomerun_channelscan_result_t *result) +{ + memset(result, 0, sizeof(struct hdhomerun_channelscan_result_t)); + + struct hdhomerun_channel_entry_t *entry = scan->next_channel; + if (!entry) { + return 0; + } + + /* Combine channels with same frequency. */ + result->frequency = hdhomerun_channel_entry_frequency(entry); + strncpy(result->channel_str, hdhomerun_channel_entry_name(entry), sizeof(result->channel_str) - 1); + result->channel_str[sizeof(result->channel_str) - 1] = 0; + + while (1) { + entry = hdhomerun_channel_list_prev(scan->channel_list, entry); + if (!entry) { + scan->next_channel = NULL; + break; + } + + if (hdhomerun_channel_entry_frequency(entry) != result->frequency) { + scan->next_channel = entry; + break; + } + + char *ptr = strchr(result->channel_str, 0); + sprintf(ptr, ", %s", hdhomerun_channel_entry_name(entry)); + } + + return 1; +} + +int channelscan_detect(struct hdhomerun_channelscan_t *scan, struct hdhomerun_channelscan_result_t *result) +{ + scan->scanned_channels++; + + /* Find lock. */ + int ret = channelscan_find_lock(scan, result->frequency, result); + if (ret <= 0) { + return ret; + } + if (!result->status.lock_supported) { + return 1; + } + + /* Detect programs. */ + result->program_count = 0; + + uint64_t timeout = getcurrenttime() + 10000; + uint64_t complete_time = getcurrenttime() + 2000; + while (1) { + bool_t changed, incomplete; + ret = channelscan_detect_programs(scan, result, &changed, &incomplete); + if (ret <= 0) { + return ret; + } + + if (changed) { + complete_time = getcurrenttime() + 2000; + } + + if (!incomplete && (getcurrenttime() >= complete_time)) { + return 1; + } + + if (getcurrenttime() >= timeout) { + return 1; + } + + msleep(250); + } +} + +uint8_t channelscan_get_progress(struct hdhomerun_channelscan_t *scan) +{ + struct hdhomerun_channel_entry_t *entry = scan->next_channel; + if (!entry) { + return 100; + } + + uint32_t channels_remaining = 1; + uint32_t frequency = hdhomerun_channel_entry_frequency(entry); + + while (1) { + entry = hdhomerun_channel_list_prev(scan->channel_list, entry); + if (!entry) { + break; + } + + if (hdhomerun_channel_entry_frequency(entry) != frequency) { + channels_remaining++; + frequency = hdhomerun_channel_entry_frequency(entry); + } + } + + return scan->scanned_channels * 100 / (scan->scanned_channels + channels_remaining); +} diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_channelscan.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_channelscan.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_channelscan.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_channelscan.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,53 @@ +/* + * hdhomerun_channelscan.h + * + * Copyright © 2007-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define HDHOMERUN_CHANNELSCAN_PROGRAM_NORMAL 0 +#define HDHOMERUN_CHANNELSCAN_PROGRAM_NODATA 1 +#define HDHOMERUN_CHANNELSCAN_PROGRAM_CONTROL 2 +#define HDHOMERUN_CHANNELSCAN_PROGRAM_ENCRYPTED 3 + +struct hdhomerun_channelscan_t; + +extern LIBTYPE struct hdhomerun_channelscan_t *channelscan_create(struct hdhomerun_device_t *hd, const char *channelmap); +extern LIBTYPE void channelscan_destroy(struct hdhomerun_channelscan_t *scan); + +extern LIBTYPE int channelscan_advance(struct hdhomerun_channelscan_t *scan, struct hdhomerun_channelscan_result_t *result); +extern LIBTYPE int channelscan_detect(struct hdhomerun_channelscan_t *scan, struct hdhomerun_channelscan_result_t *result); +extern LIBTYPE uint8_t channelscan_get_progress(struct hdhomerun_channelscan_t *scan); + +#ifdef __cplusplus +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_channels.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_channels.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_channels.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_channels.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,63 @@ +/* + * hdhomerun_channels.h + * + * Copyright © 2007-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct hdhomerun_channel_entry_t; +struct hdhomerun_channel_list_t; + +extern LIBTYPE const char *hdhomerun_channelmap_convert_countrycode_to_channelmap_prefix(const char *countrycode); +extern LIBTYPE const char *hdhomerun_channelmap_get_channelmap_scan_group(const char *channelmap); + +extern LIBTYPE uint8_t hdhomerun_channel_entry_channel_number(struct hdhomerun_channel_entry_t *entry); +extern LIBTYPE uint32_t hdhomerun_channel_entry_frequency(struct hdhomerun_channel_entry_t *entry); +extern LIBTYPE const char *hdhomerun_channel_entry_name(struct hdhomerun_channel_entry_t *entry); + +extern LIBTYPE struct hdhomerun_channel_list_t *hdhomerun_channel_list_create(const char *channelmap); +extern LIBTYPE void hdhomerun_channel_list_destroy(struct hdhomerun_channel_list_t *channel_list); + +extern LIBTYPE struct hdhomerun_channel_entry_t *hdhomerun_channel_list_first(struct hdhomerun_channel_list_t *channel_list); +extern LIBTYPE struct hdhomerun_channel_entry_t *hdhomerun_channel_list_last(struct hdhomerun_channel_list_t *channel_list); +extern LIBTYPE struct hdhomerun_channel_entry_t *hdhomerun_channel_list_next(struct hdhomerun_channel_list_t *channel_list, struct hdhomerun_channel_entry_t *entry); +extern LIBTYPE struct hdhomerun_channel_entry_t *hdhomerun_channel_list_prev(struct hdhomerun_channel_list_t *channel_list, struct hdhomerun_channel_entry_t *entry); +extern LIBTYPE uint32_t hdhomerun_channel_list_total_count(struct hdhomerun_channel_list_t *channel_list); +extern LIBTYPE uint32_t hdhomerun_channel_list_frequency_count(struct hdhomerun_channel_list_t *channel_list); + +extern LIBTYPE uint32_t hdhomerun_channel_frequency_truncate(uint32_t frequency); +extern LIBTYPE uint32_t hdhomerun_channel_number_to_frequency(struct hdhomerun_channel_list_t *channel_list, uint8_t channel_number); +extern LIBTYPE uint8_t hdhomerun_channel_frequency_to_number(struct hdhomerun_channel_list_t *channel_list, uint32_t frequency); + +#ifdef __cplusplus +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_config.c kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_config.c --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_config.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_config.c 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,636 @@ +/* + * hdhomerun_config.c + * + * Copyright © 2006-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#include "hdhomerun.h" + +/* + * The console output format should be set to UTF-8, however in XP and Vista this breaks batch file processing. + * Attempting to restore on exit fails to restore if the program is terminated by the user. + * Solution - set the output format each printf. + */ +#if defined(__WINDOWS__) +#define printf console_printf +#define vprintf console_vprintf +#endif + +static const char *appname; + +struct hdhomerun_device_t *hd; + +static int help(void) +{ + printf("Usage:\n"); + printf("\t%s discover\n", appname); + printf("\t%s get help\n", appname); + printf("\t%s get \n", appname); + printf("\t%s set \n", appname); + printf("\t%s scan []\n", appname); + printf("\t%s save \n", appname); + printf("\t%s upgrade \n", appname); + return -1; +} + +static void extract_appname(const char *argv0) +{ + const char *ptr = strrchr(argv0, '/'); + if (ptr) { + argv0 = ptr + 1; + } + ptr = strrchr(argv0, '\\'); + if (ptr) { + argv0 = ptr + 1; + } + appname = argv0; +} + +static bool_t contains(const char *arg, const char *cmpstr) +{ + if (strcmp(arg, cmpstr) == 0) { + return TRUE; + } + + if (*arg++ != '-') { + return FALSE; + } + if (*arg++ != '-') { + return FALSE; + } + if (strcmp(arg, cmpstr) == 0) { + return TRUE; + } + + return FALSE; +} + +static uint32_t parse_ip_addr(const char *str) +{ + unsigned long a[4]; + if (sscanf(str, "%lu.%lu.%lu.%lu", &a[0], &a[1], &a[2], &a[3]) != 4) { + return 0; + } + + return (uint32_t)((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | (a[3] << 0)); +} + +static int discover_print(char *target_ip_str) +{ + uint32_t target_ip = 0; + if (target_ip_str) { + target_ip = parse_ip_addr(target_ip_str); + if (target_ip == 0) { + fprintf(stderr, "invalid ip address: %s\n", target_ip_str); + return -1; + } + } + + struct hdhomerun_discover_device_t result_list[64]; + int count = hdhomerun_discover_find_devices_custom(target_ip, HDHOMERUN_DEVICE_TYPE_TUNER, HDHOMERUN_DEVICE_ID_WILDCARD, result_list, 64); + if (count < 0) { + fprintf(stderr, "error sending discover request\n"); + return -1; + } + if (count == 0) { + printf("no devices found\n"); + return 0; + } + + int index; + for (index = 0; index < count; index++) { + struct hdhomerun_discover_device_t *result = &result_list[index]; + printf("hdhomerun device %08lX found at %u.%u.%u.%u\n", + (unsigned long)result->device_id, + (unsigned int)(result->ip_addr >> 24) & 0x0FF, (unsigned int)(result->ip_addr >> 16) & 0x0FF, + (unsigned int)(result->ip_addr >> 8) & 0x0FF, (unsigned int)(result->ip_addr >> 0) & 0x0FF + ); + } + + return count; +} + +static int cmd_get(const char *item) +{ + char *ret_value; + char *ret_error; + if (hdhomerun_device_get_var(hd, item, &ret_value, &ret_error) < 0) { + fprintf(stderr, "communication error sending request to hdhomerun device\n"); + return -1; + } + + if (ret_error) { + printf("%s\n", ret_error); + return 0; + } + + printf("%s\n", ret_value); + return 1; +} + +static int cmd_set_internal(const char *item, const char *value) +{ + char *ret_error; + if (hdhomerun_device_set_var(hd, item, value, NULL, &ret_error) < 0) { + fprintf(stderr, "communication error sending request to hdhomerun device\n"); + return -1; + } + + if (ret_error) { + printf("%s\n", ret_error); + return 0; + } + + return 1; +} + +static int cmd_set(const char *item, const char *value) +{ + if (strcmp(value, "-") == 0) { + char *buffer = NULL; + size_t pos = 0; + + while (1) { + buffer = (char *)realloc(buffer, pos + 1024); + if (!buffer) { + fprintf(stderr, "out of memory\n"); + return -1; + } + + size_t size = fread(buffer + pos, 1, 1024, stdin); + pos += size; + + if (size < 1024) { + break; + } + } + + buffer[pos] = 0; + + int ret = cmd_set_internal(item, buffer); + + free(buffer); + return ret; + } + + return cmd_set_internal(item, value); +} + +static void cmd_scan_printf(FILE *fp, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + if (fp) { + va_list apc; + va_copy(apc, ap); + + vfprintf(fp, fmt, apc); + fflush(fp); + + va_end(apc); + } + + vprintf(fmt, ap); + fflush(stdout); + + va_end(ap); +} + +static int cmd_scan(const char *tuner_str, const char *filename) +{ + if (hdhomerun_device_set_tuner_from_str(hd, tuner_str) <= 0) { + fprintf(stderr, "invalid tuner number\n"); + return -1; + } + + char *channelmap; + if (hdhomerun_device_get_tuner_channelmap(hd, &channelmap) <= 0) { + fprintf(stderr, "failed to query channelmap from device\n"); + return -1; + } + + const char *channelmap_scan_group = hdhomerun_channelmap_get_channelmap_scan_group(channelmap); + if (!channelmap_scan_group) { + fprintf(stderr, "unknown channelmap '%s'\n", channelmap); + return -1; + } + + if (hdhomerun_device_channelscan_init(hd, channelmap_scan_group) <= 0) { + fprintf(stderr, "failed to initialize channel scan\n"); + return -1; + } + + FILE *fp = NULL; + if (filename) { + fp = fopen(filename, "w"); + if (!fp) { + fprintf(stderr, "unable to create file: %s\n", filename); + return -1; + } + } + + int ret; + while (1) { + struct hdhomerun_channelscan_result_t result; + ret = hdhomerun_device_channelscan_advance(hd, &result); + if (ret <= 0) { + break; + } + + cmd_scan_printf(fp, "SCANNING: %lu (%s)\n", + result.frequency, result.channel_str + ); + + ret = hdhomerun_device_channelscan_detect(hd, &result); + if (ret <= 0) { + break; + } + + cmd_scan_printf(fp, "LOCK: %s (ss=%u snq=%u seq=%u)\n", + result.status.lock_str, result.status.signal_strength, + result.status.signal_to_noise_quality, result.status.symbol_error_quality + ); + + int i; + for (i = 0; i < result.program_count; i++) { + struct hdhomerun_channelscan_program_t *program = &result.programs[i]; + cmd_scan_printf(fp, "PROGRAM %s\n", program->program_str); + } + } + + if (fp) { + fclose(fp); + } + if (ret < 0) { + fprintf(stderr, "communication error sending request to hdhomerun device\n"); + } + return ret; +} + +static bool_t cmd_saving = FALSE; + +static void cmd_save_abort(int arg) +{ + cmd_saving = FALSE; +} + +static int cmd_save(const char *tuner_str, const char *filename) +{ + if (hdhomerun_device_set_tuner_from_str(hd, tuner_str) <= 0) { + fprintf(stderr, "invalid tuner number\n"); + return -1; + } + + FILE *fp; + if (strcmp(filename, "null") == 0) { + fp = NULL; + } else if (strcmp(filename, "-") == 0) { + fp = stdout; + } else { + fp = fopen(filename, "wb"); + if (!fp) { + fprintf(stderr, "unable to create file %s\n", filename); + return -1; + } + } + + int ret = hdhomerun_device_stream_start(hd); + if (ret <= 0) { + fprintf(stderr, "unable to start stream\n"); + return ret; + } + + signal(SIGINT, cmd_save_abort); + signal(SIGPIPE, cmd_save_abort); + + struct hdhomerun_video_stats_t stats_old, stats_cur; + hdhomerun_device_get_video_stats(hd, &stats_old); + + uint64_t next_progress = getcurrenttime() + 1000; + + cmd_saving = TRUE; + while (cmd_saving) { + uint64_t loop_start_time = getcurrenttime(); + + size_t actual_size; + uint8_t *ptr = hdhomerun_device_stream_recv(hd, VIDEO_DATA_BUFFER_SIZE_1S, &actual_size); + if (!ptr) { + msleep(64); + continue; + } + + if (fp) { + if (fwrite(ptr, 1, actual_size, fp) != actual_size) { + fprintf(stderr, "error writing output\n"); + return -1; + } + } + + if (loop_start_time >= next_progress) { + next_progress += 1000; + if (loop_start_time >= next_progress) { + next_progress = loop_start_time + 1000; + } + + hdhomerun_device_get_video_stats(hd, &stats_cur); + + if (stats_cur.overflow_error_count > stats_old.overflow_error_count) { + fprintf(stderr, "o"); + } else if (stats_cur.network_error_count > stats_old.network_error_count) { + fprintf(stderr, "n"); + } else if (stats_cur.transport_error_count > stats_old.transport_error_count) { + fprintf(stderr, "t"); + } else if (stats_cur.sequence_error_count > stats_old.sequence_error_count) { + fprintf(stderr, "s"); + } else { + fprintf(stderr, "."); + } + + stats_old = stats_cur; + fflush(stderr); + } + + int32_t delay = 64 - (int32_t)(getcurrenttime() - loop_start_time); + if (delay <= 0) { + continue; + } + + msleep(delay); + } + + if (fp) { + fclose(fp); + } + + hdhomerun_device_stream_stop(hd); + hdhomerun_device_get_video_stats(hd, &stats_cur); + + fprintf(stderr, "\n"); + fprintf(stderr, "-- Video statistics --\n"); + fprintf(stderr, "%u packets received, %u overflow errors, %u network errors, %u transport errors, %u sequence errors\n", + (unsigned int)stats_cur.packet_count, + (unsigned int)stats_cur.overflow_error_count, + (unsigned int)stats_cur.network_error_count, + (unsigned int)stats_cur.transport_error_count, + (unsigned int)stats_cur.sequence_error_count); + + return 0; +} + +static int cmd_upgrade(const char *filename) +{ + FILE *fp = fopen(filename, "rb"); + if (!fp) { + fprintf(stderr, "unable to open file %s\n", filename); + return -1; + } + + printf("uploading firmware...\n"); + if (hdhomerun_device_upgrade(hd, fp) <= 0) { + fprintf(stderr, "error sending upgrade file to hdhomerun device\n"); + fclose(fp); + return -1; + } + sleep(2); + + printf("upgrading firmware...\n"); + sleep(8); + + printf("rebooting...\n"); + int count = 0; + char *version_str; + while (1) { + if (hdhomerun_device_get_version(hd, &version_str, NULL) >= 0) { + break; + } + + count++; + if (count > 30) { + fprintf(stderr, "error finding device after firmware upgrade\n"); + fclose(fp); + return -1; + } + + sleep(1); + } + + printf("upgrade complete - now running firmware %s\n", version_str); + return 0; +} + +static int cmd_execute(void) +{ + char *ret_value; + char *ret_error; + if (hdhomerun_device_get_var(hd, "/sys/boot", &ret_value, &ret_error) < 0) { + fprintf(stderr, "communication error sending request to hdhomerun device\n"); + return -1; + } + + if (ret_error) { + printf("%s\n", ret_error); + return 0; + } + + char *end = ret_value + strlen(ret_value); + char *pos = ret_value; + + while (1) { + if (pos >= end) { + break; + } + + char *eol_r = strchr(pos, '\r'); + if (!eol_r) { + eol_r = end; + } + + char *eol_n = strchr(pos, '\n'); + if (!eol_n) { + eol_n = end; + } + + char *eol = min(eol_r, eol_n); + + char *sep = strchr(pos, ' '); + if (!sep || sep > eol) { + pos = eol + 1; + continue; + } + + *sep = 0; + *eol = 0; + + char *item = pos; + char *value = sep + 1; + + printf("set %s \"%s\"\n", item, value); + + cmd_set_internal(item, value); + + pos = eol + 1; + } + + return 1; +} + +static int main_cmd(int argc, char *argv[]) +{ + if (argc < 1) { + return help(); + } + + char *cmd = *argv++; argc--; + + if (contains(cmd, "key")) { + if (argc < 2) { + return help(); + } + uint32_t lockkey = strtoul(argv[0], NULL, 0); + hdhomerun_device_tuner_lockkey_use_value(hd, lockkey); + + cmd = argv[1]; + argv+=2; argc-=2; + } + + if (contains(cmd, "get")) { + if (argc < 1) { + return help(); + } + return cmd_get(argv[0]); + } + + if (contains(cmd, "set")) { + if (argc < 2) { + return help(); + } + return cmd_set(argv[0], argv[1]); + } + + if (contains(cmd, "scan")) { + if (argc < 1) { + return help(); + } + if (argc < 2) { + return cmd_scan(argv[0], NULL); + } else { + return cmd_scan(argv[0], argv[1]); + } + } + + if (contains(cmd, "save")) { + if (argc < 2) { + return help(); + } + return cmd_save(argv[0], argv[1]); + } + + if (contains(cmd, "upgrade")) { + if (argc < 1) { + return help(); + } + return cmd_upgrade(argv[0]); + } + + if (contains(cmd, "execute")) { + return cmd_execute(); + } + + return help(); +} + +static int main_internal(int argc, char *argv[]) +{ +#if defined(__WINDOWS__) + /* Initialize network socket support. */ + WORD wVersionRequested = MAKEWORD(2, 0); + WSADATA wsaData; + WSAStartup(wVersionRequested, &wsaData); +#endif + + extract_appname(argv[0]); + argv++; + argc--; + + if (argc == 0) { + return help(); + } + + char *id_str = *argv++; argc--; + if (contains(id_str, "help")) { + return help(); + } + if (contains(id_str, "discover")) { + if (argc < 1) { + return discover_print(NULL); + } else { + return discover_print(argv[0]); + } + } + + /* Device object. */ + hd = hdhomerun_device_create_from_str(id_str, NULL); + if (!hd) { + fprintf(stderr, "invalid device id: %s\n", id_str); + return -1; + } + + /* Device ID check. */ + uint32_t device_id_requested = hdhomerun_device_get_device_id_requested(hd); + if (!hdhomerun_discover_validate_device_id(device_id_requested)) { + fprintf(stderr, "invalid device id: %08lX\n", (unsigned long)device_id_requested); + } + + /* Connect to device and check model. */ + const char *model = hdhomerun_device_get_model_str(hd); + if (!model) { + fprintf(stderr, "unable to connect to device\n"); + hdhomerun_device_destroy(hd); + return -1; + } + + /* Command. */ + int ret = main_cmd(argc, argv); + + /* Cleanup. */ + hdhomerun_device_destroy(hd); + + /* Complete. */ + return ret; +} + +int main(int argc, char *argv[]) +{ + int ret = main_internal(argc, argv); + if (ret <= 0) { + return 1; + } + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_control.c kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_control.c --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_control.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_control.c 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,453 @@ +/* + * hdhomerun_control.c + * + * Copyright © 2006 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#include "hdhomerun.h" + +#define HDHOMERUN_CONTROL_SEND_TIMEOUT 5000 +#define HDHOMERUN_CONTROL_RECV_TIMEOUT 5000 +#define HDHOMERUN_CONTROL_UPGRADE_TIMEOUT 20000 + +struct hdhomerun_control_sock_t { + uint32_t desired_device_id; + uint32_t desired_device_ip; + uint32_t actual_device_id; + uint32_t actual_device_ip; + int sock; + struct hdhomerun_debug_t *dbg; + struct hdhomerun_pkt_t tx_pkt; + struct hdhomerun_pkt_t rx_pkt; +}; + +static void hdhomerun_control_close_sock(struct hdhomerun_control_sock_t *cs) +{ + if (cs->sock == -1) { + return; + } + + close(cs->sock); + cs->sock = -1; +} + +void hdhomerun_control_set_device(struct hdhomerun_control_sock_t *cs, uint32_t device_id, uint32_t device_ip) +{ + hdhomerun_control_close_sock(cs); + + cs->desired_device_id = device_id; + cs->desired_device_ip = device_ip; + cs->actual_device_id = 0; + cs->actual_device_ip = 0; +} + +struct hdhomerun_control_sock_t *hdhomerun_control_create(uint32_t device_id, uint32_t device_ip, struct hdhomerun_debug_t *dbg) +{ + struct hdhomerun_control_sock_t *cs = (struct hdhomerun_control_sock_t *)calloc(1, sizeof(struct hdhomerun_control_sock_t)); + if (!cs) { + hdhomerun_debug_printf(dbg, "hdhomerun_control_create: failed to allocate control object\n"); + return NULL; + } + + cs->dbg = dbg; + cs->sock = -1; + hdhomerun_control_set_device(cs, device_id, device_ip); + + return cs; +} + +void hdhomerun_control_destroy(struct hdhomerun_control_sock_t *cs) +{ + hdhomerun_control_close_sock(cs); + free(cs); +} + +static bool_t hdhomerun_control_connect_sock(struct hdhomerun_control_sock_t *cs) +{ + if (cs->sock != -1) { + return TRUE; + } + + if ((cs->desired_device_id == 0) && (cs->desired_device_ip == 0)) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_connect_sock: no device specified\n"); + return FALSE; + } + + /* Find device. */ + struct hdhomerun_discover_device_t result; + if (hdhomerun_discover_find_devices_custom(cs->desired_device_ip, HDHOMERUN_DEVICE_TYPE_WILDCARD, cs->desired_device_id, &result, 1) <= 0) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_connect_sock: device not found\n"); + return FALSE; + } + cs->actual_device_ip = result.ip_addr; + cs->actual_device_id = result.device_id; + + /* Create socket. */ + cs->sock = (int)socket(AF_INET, SOCK_STREAM, 0); + if (cs->sock == -1) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_connect_sock: failed to create socket (%d)\n", sock_getlasterror); + return FALSE; + } + + /* Set timeouts. */ + setsocktimeout(cs->sock, SOL_SOCKET, SO_SNDTIMEO, HDHOMERUN_CONTROL_SEND_TIMEOUT); + setsocktimeout(cs->sock, SOL_SOCKET, SO_RCVTIMEO, HDHOMERUN_CONTROL_RECV_TIMEOUT); + + /* Initiate connection. */ + struct sockaddr_in sock_addr; + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = htonl(cs->actual_device_ip); + sock_addr.sin_port = htons(HDHOMERUN_CONTROL_TCP_PORT); + if (connect(cs->sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != 0) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_connect_sock: failed to connect (%d)\n", sock_getlasterror); + hdhomerun_control_close_sock(cs); + return FALSE; + } + + /* Success. */ + return TRUE; +} + +uint32_t hdhomerun_control_get_device_id(struct hdhomerun_control_sock_t *cs) +{ + if (!hdhomerun_control_connect_sock(cs)) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_device_id: connect failed\n"); + return 0; + } + + return cs->actual_device_id; +} + +uint32_t hdhomerun_control_get_device_ip(struct hdhomerun_control_sock_t *cs) +{ + if (!hdhomerun_control_connect_sock(cs)) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_device_ip: connect failed\n"); + return 0; + } + + return cs->actual_device_ip; +} + +uint32_t hdhomerun_control_get_device_id_requested(struct hdhomerun_control_sock_t *cs) +{ + return cs->desired_device_id; +} + +uint32_t hdhomerun_control_get_device_ip_requested(struct hdhomerun_control_sock_t *cs) +{ + return cs->desired_device_ip; +} + +uint32_t hdhomerun_control_get_local_addr(struct hdhomerun_control_sock_t *cs) +{ + if (!hdhomerun_control_connect_sock(cs)) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_local_addr: connect failed\n"); + return 0; + } + + struct sockaddr_in sock_addr; + socklen_t sockaddr_size = sizeof(sock_addr); + if (getsockname(cs->sock, (struct sockaddr*)&sock_addr, &sockaddr_size) != 0) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_local_addr: getsockname failed (%d)\n", sock_getlasterror); + return 0; + } + + return ntohl(sock_addr.sin_addr.s_addr); +} + +static int hdhomerun_control_send_sock(struct hdhomerun_control_sock_t *cs, struct hdhomerun_pkt_t *tx_pkt) +{ + int length = (int)(tx_pkt->end - tx_pkt->start); + if (send(cs->sock, (char *)tx_pkt->start, (int)length, 0) != length) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_send_sock: send failed (%d)\n", sock_getlasterror); + hdhomerun_control_close_sock(cs); + return -1; + } + + return 1; +} + +static int hdhomerun_control_recv_sock(struct hdhomerun_control_sock_t *cs, struct hdhomerun_pkt_t *rx_pkt, uint16_t *ptype, uint64_t recv_timeout) +{ + uint64_t stop_time = getcurrenttime() + recv_timeout; + hdhomerun_pkt_reset(rx_pkt); + + while (getcurrenttime() < stop_time) { + struct timeval t; + t.tv_sec = 0; + t.tv_usec = 250000; + + fd_set readfds; + FD_ZERO(&readfds); + FD_SET(cs->sock, &readfds); + + if (select(cs->sock+1, &readfds, NULL, NULL, &t) < 0) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_recv_sock: select failed (%d)\n", sock_getlasterror); + hdhomerun_control_close_sock(cs); + return -1; + } + + if (!FD_ISSET(cs->sock, &readfds)) { + continue; + } + + int rx_length = recv(cs->sock, (char *)rx_pkt->end, (int)(rx_pkt->limit - rx_pkt->end), 0); + if (rx_length <= 0) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_recv_sock: recv failed (%d)\n", sock_getlasterror); + hdhomerun_control_close_sock(cs); + return -1; + } + rx_pkt->end += rx_length; + + int ret = hdhomerun_pkt_open_frame(rx_pkt, ptype); + if (ret < 0) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_recv_sock: frame error\n"); + hdhomerun_control_close_sock(cs); + return -1; + } + if (ret == 0) { + continue; + } + + return 1; + } + + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_recv_sock: timeout\n"); + hdhomerun_control_close_sock(cs); + return -1; +} + +static int hdhomerun_control_send_recv_internal(struct hdhomerun_control_sock_t *cs, struct hdhomerun_pkt_t *tx_pkt, struct hdhomerun_pkt_t *rx_pkt, uint16_t type, uint64_t recv_timeout) +{ + hdhomerun_pkt_seal_frame(tx_pkt, type); + + int i; + for (i = 0; i < 2; i++) { + if (cs->sock == -1) { + if (!hdhomerun_control_connect_sock(cs)) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_send_recv: connect failed\n"); + return -1; + } + } + + if (hdhomerun_control_send_sock(cs, tx_pkt) < 0) { + continue; + } + if (!rx_pkt) { + return 1; + } + + uint16_t rsp_type; + if (hdhomerun_control_recv_sock(cs, rx_pkt, &rsp_type, recv_timeout) < 0) { + continue; + } + if (rsp_type != type + 1) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_send_recv: unexpected frame type\n"); + hdhomerun_control_close_sock(cs); + continue; + } + + return 1; + } + + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_send_recv: failed\n"); + return -1; +} + +int hdhomerun_control_send_recv(struct hdhomerun_control_sock_t *cs, struct hdhomerun_pkt_t *tx_pkt, struct hdhomerun_pkt_t *rx_pkt, uint16_t type) +{ + return hdhomerun_control_send_recv_internal(cs, tx_pkt, rx_pkt, type, HDHOMERUN_CONTROL_RECV_TIMEOUT); +} + +static int hdhomerun_control_get_set(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, uint32_t lockkey, char **pvalue, char **perror) +{ + struct hdhomerun_pkt_t *tx_pkt = &cs->tx_pkt; + struct hdhomerun_pkt_t *rx_pkt = &cs->rx_pkt; + + /* Request. */ + hdhomerun_pkt_reset(tx_pkt); + + int name_len = (int)strlen(name) + 1; + if (tx_pkt->end + 3 + name_len > tx_pkt->limit) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: request too long\n"); + return -1; + } + hdhomerun_pkt_write_u8(tx_pkt, HDHOMERUN_TAG_GETSET_NAME); + hdhomerun_pkt_write_var_length(tx_pkt, name_len); + hdhomerun_pkt_write_mem(tx_pkt, (void *)name, name_len); + + if (value) { + int value_len = (int)strlen(value) + 1; + if (tx_pkt->end + 3 + value_len > tx_pkt->limit) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: request too long\n"); + return -1; + } + hdhomerun_pkt_write_u8(tx_pkt, HDHOMERUN_TAG_GETSET_VALUE); + hdhomerun_pkt_write_var_length(tx_pkt, value_len); + hdhomerun_pkt_write_mem(tx_pkt, (void *)value, value_len); + } + + if (lockkey != 0) { + if (tx_pkt->end + 6 > tx_pkt->limit) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: request too long\n"); + return -1; + } + hdhomerun_pkt_write_u8(tx_pkt, HDHOMERUN_TAG_GETSET_LOCKKEY); + hdhomerun_pkt_write_var_length(tx_pkt, 4); + hdhomerun_pkt_write_u32(tx_pkt, lockkey); + } + + /* Send/Recv. */ + if (hdhomerun_control_send_recv_internal(cs, tx_pkt, rx_pkt, HDHOMERUN_TYPE_GETSET_REQ, HDHOMERUN_CONTROL_RECV_TIMEOUT) < 0) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: send/recv error\n"); + return -1; + } + + /* Response. */ + while (1) { + uint8_t tag; + size_t len; + uint8_t *next = hdhomerun_pkt_read_tlv(rx_pkt, &tag, &len); + if (!next) { + break; + } + + switch (tag) { + case HDHOMERUN_TAG_GETSET_VALUE: + if (pvalue) { + *pvalue = (char *)rx_pkt->pos; + rx_pkt->pos[len] = 0; + } + if (perror) { + *perror = NULL; + } + return 1; + + case HDHOMERUN_TAG_ERROR_MESSAGE: + rx_pkt->pos[len] = 0; + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: %s\n", rx_pkt->pos); + + if (pvalue) { + *pvalue = NULL; + } + if (perror) { + *perror = (char *)rx_pkt->pos; + } + + return 0; + } + + rx_pkt->pos = next; + } + + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_get_set: missing response tags\n"); + return -1; +} + +int hdhomerun_control_get(struct hdhomerun_control_sock_t *cs, const char *name, char **pvalue, char **perror) +{ + return hdhomerun_control_get_set(cs, name, NULL, 0, pvalue, perror); +} + +int hdhomerun_control_set(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, char **pvalue, char **perror) +{ + return hdhomerun_control_get_set(cs, name, value, 0, pvalue, perror); +} + +int hdhomerun_control_set_with_lockkey(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, uint32_t lockkey, char **pvalue, char **perror) +{ + return hdhomerun_control_get_set(cs, name, value, lockkey, pvalue, perror); +} + +int hdhomerun_control_upgrade(struct hdhomerun_control_sock_t *cs, FILE *upgrade_file) +{ + struct hdhomerun_pkt_t *tx_pkt = &cs->tx_pkt; + struct hdhomerun_pkt_t *rx_pkt = &cs->rx_pkt; + uint32_t sequence = 0; + + /* Upload. */ + while (1) { + uint8_t data[256]; + size_t length = fread(data, 1, 256, upgrade_file); + if (length == 0) { + break; + } + + hdhomerun_pkt_reset(tx_pkt); + hdhomerun_pkt_write_u32(tx_pkt, sequence); + hdhomerun_pkt_write_mem(tx_pkt, data, length); + + if (hdhomerun_control_send_recv_internal(cs, tx_pkt, NULL, HDHOMERUN_TYPE_UPGRADE_REQ, 0) < 0) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_upgrade: send/recv failed\n"); + return -1; + } + + sequence += (uint32_t)length; + } + + if (sequence == 0) { + /* No data in file. Error, but no need to close connection. */ + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_upgrade: zero length file\n"); + return 0; + } + + /* Execute upgrade. */ + hdhomerun_pkt_reset(tx_pkt); + hdhomerun_pkt_write_u32(tx_pkt, 0xFFFFFFFF); + + if (hdhomerun_control_send_recv_internal(cs, tx_pkt, rx_pkt, HDHOMERUN_TYPE_UPGRADE_REQ, HDHOMERUN_CONTROL_UPGRADE_TIMEOUT) < 0) { + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_upgrade: send/recv failed\n"); + return -1; + } + + /* Check response. */ + while (1) { + uint8_t tag; + size_t len; + uint8_t *next = hdhomerun_pkt_read_tlv(rx_pkt, &tag, &len); + if (!next) { + break; + } + + switch (tag) { + case HDHOMERUN_TAG_ERROR_MESSAGE: + rx_pkt->pos[len] = 0; + hdhomerun_debug_printf(cs->dbg, "hdhomerun_control_upgrade: %s\n", (char *)rx_pkt->pos); + return 0; + + default: + break; + } + + rx_pkt->pos = next; + } + + return 1; +} diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_control.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_control.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_control.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_control.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,115 @@ +/* + * hdhomerun_control.h + * + * Copyright © 2006 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ +#ifdef __cplusplus +extern "C" { +#endif + +struct hdhomerun_control_sock_t; + +/* + * Create a control socket. + * + * This function will not attempt to connect to the device. + * The connection will be established when first used. + * + * uint32_t device_id = 32-bit device id of device. Set to HDHOMERUN_DEVICE_ID_WILDCARD to match any device ID. + * uint32_t device_ip = IP address of device. Set to 0 to auto-detect. + * struct hdhomerun_debug_t *dbg: Pointer to debug logging object. May be NULL. + * + * Returns a pointer to the newly created control socket. + * + * When no longer needed, the socket should be destroyed by calling hdhomerun_control_destroy. + */ +extern LIBTYPE struct hdhomerun_control_sock_t *hdhomerun_control_create(uint32_t device_id, uint32_t device_ip, struct hdhomerun_debug_t *dbg); +extern LIBTYPE void hdhomerun_control_destroy(struct hdhomerun_control_sock_t *cs); + +/* + * Get the actual device id or ip of the device. + * + * Returns 0 if the device id cannot be determined. + */ +extern LIBTYPE uint32_t hdhomerun_control_get_device_id(struct hdhomerun_control_sock_t *cs); +extern LIBTYPE uint32_t hdhomerun_control_get_device_ip(struct hdhomerun_control_sock_t *cs); +extern LIBTYPE uint32_t hdhomerun_control_get_device_id_requested(struct hdhomerun_control_sock_t *cs); +extern LIBTYPE uint32_t hdhomerun_control_get_device_ip_requested(struct hdhomerun_control_sock_t *cs); + +extern LIBTYPE void hdhomerun_control_set_device(struct hdhomerun_control_sock_t *cs, uint32_t device_id, uint32_t device_ip); + +/* + * Get the local machine IP address used when communicating with the device. + * + * This function is useful for determining the IP address to use with set target commands. + * + * Returns 32-bit IP address with native endianness, or 0 on error. + */ +extern LIBTYPE uint32_t hdhomerun_control_get_local_addr(struct hdhomerun_control_sock_t *cs); + +/* + * Low-level communication. + */ +extern LIBTYPE int hdhomerun_control_send_recv(struct hdhomerun_control_sock_t *cs, struct hdhomerun_pkt_t *tx_pkt, struct hdhomerun_pkt_t *rx_pkt, uint16_t type); + +/* + * Get/set a control variable on the device. + * + * const char *name: The name of var to get/set (c-string). The supported vars is device/firmware dependant. + * const char *value: The value to set (c-string). The format is device/firmware dependant. + + * char **pvalue: If provided, the caller-supplied char pointer will be populated with a pointer to the value + * string returned by the device, or NULL if the device returned an error string. The string will remain + * valid until the next call to a control sock function. + * char **perror: If provided, the caller-supplied char pointer will be populated with a pointer to the error + * string returned by the device, or NULL if the device returned an value string. The string will remain + * valid until the next call to a control sock function. + * + * Returns 1 if the operation was successful (pvalue set, perror NULL). + * Returns 0 if the operation was rejected (pvalue NULL, perror set). + * Returns -1 if a communication error occurs. + */ +extern LIBTYPE int hdhomerun_control_get(struct hdhomerun_control_sock_t *cs, const char *name, char **pvalue, char **perror); +extern LIBTYPE int hdhomerun_control_set(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, char **pvalue, char **perror); +extern LIBTYPE int hdhomerun_control_set_with_lockkey(struct hdhomerun_control_sock_t *cs, const char *name, const char *value, uint32_t lockkey, char **pvalue, char **perror); + +/* + * Upload new firmware to the device. + * + * FILE *upgrade_file: File pointer to read from. The file must have been opened in binary mode for reading. + * + * Returns 1 if the upload succeeded. + * Returns 0 if the upload was rejected. + * Returns -1 if an error occurs. + */ +extern LIBTYPE int hdhomerun_control_upgrade(struct hdhomerun_control_sock_t *cs, FILE *upgrade_file); + +#ifdef __cplusplus +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_debug.c kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_debug.c --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_debug.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_debug.c 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,464 @@ +/* + * hdhomerun_debug.c + * + * Copyright © 2006 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +/* + * The debug logging includes optional support for connecting to the + * Silicondust support server. This option should not be used without + * being explicitly enabled by the user. Debug information should be + * limited to information useful to diagnosing a problem. + * - Silicondust. + */ + +#include "hdhomerun.h" + +#if !defined(HDHOMERUN_DEBUG_HOST) +#define HDHOMERUN_DEBUG_HOST "debug.silicondust.com" +#endif +#if !defined(HDHOMERUN_DEBUG_PORT) +#define HDHOMERUN_DEBUG_PORT "8002" +#endif + +struct hdhomerun_debug_message_t +{ + struct hdhomerun_debug_message_t *next; + struct hdhomerun_debug_message_t *prev; + char buffer[2048]; +}; + +struct hdhomerun_debug_t +{ + pthread_t thread; + volatile bool_t enabled; + volatile bool_t terminate; + char *prefix; + + pthread_mutex_t print_lock; + pthread_mutex_t queue_lock; + pthread_mutex_t send_lock; + + struct hdhomerun_debug_message_t *queue_head; + struct hdhomerun_debug_message_t *queue_tail; + uint32_t queue_depth; + + uint64_t connect_delay; + + char *file_name; + FILE *file_fp; + int sock; +}; + +static THREAD_FUNC_PREFIX hdhomerun_debug_thread_execute(void *arg); + +struct hdhomerun_debug_t *hdhomerun_debug_create(void) +{ + struct hdhomerun_debug_t *dbg = (struct hdhomerun_debug_t *)calloc(1, sizeof(struct hdhomerun_debug_t)); + if (!dbg) { + return NULL; + } + + dbg->sock = -1; + + pthread_mutex_init(&dbg->print_lock, NULL); + pthread_mutex_init(&dbg->queue_lock, NULL); + pthread_mutex_init(&dbg->send_lock, NULL); + + if (pthread_create(&dbg->thread, NULL, &hdhomerun_debug_thread_execute, dbg) != 0) { + free(dbg); + return NULL; + } + + return dbg; +} + +/* Send lock held by caller */ +static void hdhomerun_debug_close_file(struct hdhomerun_debug_t *dbg) +{ + if (!dbg->file_fp) { + return; + } + + fclose(dbg->file_fp); + dbg->file_fp = NULL; +} + +/* Send lock held by caller */ +static void hdhomerun_debug_close_sock(struct hdhomerun_debug_t *dbg) +{ + if (dbg->sock == -1) { + return; + } + + close(dbg->sock); + dbg->sock = -1; +} + +void hdhomerun_debug_destroy(struct hdhomerun_debug_t *dbg) +{ + dbg->terminate = TRUE; + pthread_join(dbg->thread, NULL); + + hdhomerun_debug_close_file(dbg); + hdhomerun_debug_close_sock(dbg); + + if (dbg->prefix) { + free(dbg->prefix); + } + + free(dbg); +} + +void hdhomerun_debug_set_prefix(struct hdhomerun_debug_t *dbg, const char *prefix) +{ + pthread_mutex_lock(&dbg->print_lock); + + if (dbg->prefix) { + free(dbg->prefix); + dbg->prefix = NULL; + } + + if (prefix) { + dbg->prefix = strdup(prefix); + } + + pthread_mutex_unlock(&dbg->print_lock); +} + +void hdhomerun_debug_set_filename(struct hdhomerun_debug_t *dbg, const char *filename) +{ + pthread_mutex_lock(&dbg->send_lock); + + if (!filename && !dbg->file_name) { + pthread_mutex_unlock(&dbg->send_lock); + return; + } + if (filename && dbg->file_name) { + if (strcmp(filename, dbg->file_name) == 0) { + pthread_mutex_unlock(&dbg->send_lock); + return; + } + } + + hdhomerun_debug_close_file(dbg); + hdhomerun_debug_close_sock(dbg); + + if (dbg->file_name) { + free(dbg->file_name); + dbg->file_name = NULL; + } + if (filename) { + dbg->file_name = strdup(filename); + } + + pthread_mutex_unlock(&dbg->send_lock); +} + +void hdhomerun_debug_enable(struct hdhomerun_debug_t *dbg) +{ + pthread_mutex_lock(&dbg->send_lock); + + dbg->enabled = TRUE; + + pthread_mutex_unlock(&dbg->send_lock); +} + +void hdhomerun_debug_disable(struct hdhomerun_debug_t *dbg) +{ + pthread_mutex_lock(&dbg->send_lock); + + dbg->enabled = FALSE; + hdhomerun_debug_close_file(dbg); + hdhomerun_debug_close_sock(dbg); + + pthread_mutex_unlock(&dbg->send_lock); +} + +bool_t hdhomerun_debug_enabled(struct hdhomerun_debug_t *dbg) +{ + if (!dbg) { + return FALSE; + } + + return dbg->enabled; +} + +void hdhomerun_debug_flush(struct hdhomerun_debug_t *dbg, uint64_t timeout) +{ + timeout = getcurrenttime() + timeout; + + while (getcurrenttime() < timeout) { + pthread_mutex_lock(&dbg->queue_lock); + struct hdhomerun_debug_message_t *message = dbg->queue_tail; + pthread_mutex_unlock(&dbg->queue_lock); + + if (!message) { + return; + } + + msleep(10); + } +} + +void hdhomerun_debug_printf(struct hdhomerun_debug_t *dbg, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + hdhomerun_debug_vprintf(dbg, fmt, args); + va_end(args); +} + +void hdhomerun_debug_vprintf(struct hdhomerun_debug_t *dbg, const char *fmt, va_list args) +{ + if (!dbg) { + return; + } + if (!dbg->enabled) { + return; + } + + struct hdhomerun_debug_message_t *message = (struct hdhomerun_debug_message_t *)malloc(sizeof(struct hdhomerun_debug_message_t)); + if (!message) { + return; + } + + char *ptr = message->buffer; + char *end = message->buffer + sizeof(message->buffer) - 2; + *end = 0; + + /* + * Timestamp. + */ + time_t current_time = time(NULL); + ptr += strftime(ptr, end - ptr, "%Y%m%d-%H:%M:%S ", localtime(¤t_time)); + if (ptr > end) { + ptr = end; + } + + /* + * Debug prefix. + */ + pthread_mutex_lock(&dbg->print_lock); + + if (dbg->prefix) { + int len = snprintf(ptr, end - ptr, "%s ", dbg->prefix); + len = (len <= 0) ? 0 : len; + ptr += len; + if (ptr > end) { + ptr = end; + } + } + + pthread_mutex_unlock(&dbg->print_lock); + + /* + * Message text. + */ + int len = vsnprintf(ptr, end - ptr, fmt, args); + len = (len < 0) ? 0 : len; /* len does not include null */ + ptr += len; + if (ptr > end) { + ptr = end; + } + + /* + * Force newline. + */ + if ((ptr[-1] != '\n') && (ptr + 1 <= end)) { + *ptr++ = '\n'; + } + + /* + * Force NULL. + */ + if (ptr + 1 > end) { + ptr = end - 1; + } + *ptr++ = 0; + + /* + * Enqueue. + */ + pthread_mutex_lock(&dbg->queue_lock); + + message->prev = NULL; + message->next = dbg->queue_head; + dbg->queue_head = message; + if (message->next) { + message->next->prev = message; + } else { + dbg->queue_tail = message; + } + dbg->queue_depth++; + + pthread_mutex_unlock(&dbg->queue_lock); +} + +/* Send lock held by caller */ +static bool_t hdhomerun_debug_output_message_file(struct hdhomerun_debug_t *dbg, struct hdhomerun_debug_message_t *message) +{ + if (!dbg->file_fp) { + uint64_t current_time = getcurrenttime(); + if (current_time < dbg->connect_delay) { + return FALSE; + } + dbg->connect_delay = current_time + 30*1000; + + dbg->file_fp = fopen(dbg->file_name, "a"); + if (!dbg->file_fp) { + return FALSE; + } + } + + fprintf(dbg->file_fp, "%s", message->buffer); + fflush(dbg->file_fp); + + return TRUE; +} + +/* Send lock held by caller */ +#if defined(__CYGWIN__) +static bool_t hdhomerun_debug_output_message_sock(struct hdhomerun_debug_t *dbg, struct hdhomerun_debug_message_t *message) +{ + return TRUE; +} +#else +static bool_t hdhomerun_debug_output_message_sock(struct hdhomerun_debug_t *dbg, struct hdhomerun_debug_message_t *message) +{ + if (dbg->sock == -1) { + uint64_t current_time = getcurrenttime(); + if (current_time < dbg->connect_delay) { + return FALSE; + } + dbg->connect_delay = current_time + 30*1000; + + dbg->sock = (int)socket(AF_INET, SOCK_STREAM, 0); + if (dbg->sock == -1) { + return FALSE; + } + + struct addrinfo hints; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + struct addrinfo *sock_info; + if (getaddrinfo(HDHOMERUN_DEBUG_HOST, HDHOMERUN_DEBUG_PORT, &hints, &sock_info) != 0) { + hdhomerun_debug_close_sock(dbg); + return FALSE; + } + if (connect(dbg->sock, sock_info->ai_addr, (int)sock_info->ai_addrlen) != 0) { + freeaddrinfo(sock_info); + hdhomerun_debug_close_sock(dbg); + return FALSE; + } + freeaddrinfo(sock_info); + } + + size_t length = strlen(message->buffer); + if (send(dbg->sock, (char *)message->buffer, (int)length, 0) != length) { + hdhomerun_debug_close_sock(dbg); + return FALSE; + } + + return TRUE; +} +#endif + +static bool_t hdhomerun_debug_output_message(struct hdhomerun_debug_t *dbg, struct hdhomerun_debug_message_t *message) +{ + pthread_mutex_lock(&dbg->send_lock); + + if (!dbg->enabled) { + pthread_mutex_unlock(&dbg->send_lock); + return TRUE; + } + + bool_t ret; + if (dbg->file_name) { + ret = hdhomerun_debug_output_message_file(dbg, message); + } else { + ret = hdhomerun_debug_output_message_sock(dbg, message); + } + + pthread_mutex_unlock(&dbg->send_lock); + return ret; +} + +static void hdhomerun_debug_pop_and_free_message(struct hdhomerun_debug_t *dbg) +{ + pthread_mutex_lock(&dbg->queue_lock); + + struct hdhomerun_debug_message_t *message = dbg->queue_tail; + dbg->queue_tail = message->prev; + if (message->prev) { + message->prev->next = NULL; + } else { + dbg->queue_head = NULL; + } + dbg->queue_depth--; + + pthread_mutex_unlock(&dbg->queue_lock); + + free(message); +} + +static THREAD_FUNC_PREFIX hdhomerun_debug_thread_execute(void *arg) +{ + struct hdhomerun_debug_t *dbg = (struct hdhomerun_debug_t *)arg; + + while (!dbg->terminate) { + + pthread_mutex_lock(&dbg->queue_lock); + struct hdhomerun_debug_message_t *message = dbg->queue_tail; + uint32_t queue_depth = dbg->queue_depth; + pthread_mutex_unlock(&dbg->queue_lock); + + if (!message) { + msleep(250); + continue; + } + + if (queue_depth > 256) { + hdhomerun_debug_pop_and_free_message(dbg); + continue; + } + + if (!hdhomerun_debug_output_message(dbg, message)) { + msleep(250); + continue; + } + + hdhomerun_debug_pop_and_free_message(dbg); + } + + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_debug.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_debug.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_debug.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_debug.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,63 @@ +/* + * hdhomerun_debug.h + * + * Copyright © 2006 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +/* + * The debug logging includes optional support for connecting to the + * Silicondust support server. This option should not be used without + * being explicitly enabled by the user. Debug information should be + * limited to information useful to diagnosing a problem. + * - Silicondust. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct hdhomerun_debug_t; + +extern LIBTYPE struct hdhomerun_debug_t *hdhomerun_debug_create(void); +extern LIBTYPE void hdhomerun_debug_destroy(struct hdhomerun_debug_t *dbg); + +extern LIBTYPE void hdhomerun_debug_set_prefix(struct hdhomerun_debug_t *dbg, const char *prefix); +extern LIBTYPE void hdhomerun_debug_set_filename(struct hdhomerun_debug_t *dbg, const char *filename); +extern LIBTYPE void hdhomerun_debug_enable(struct hdhomerun_debug_t *dbg); +extern LIBTYPE void hdhomerun_debug_disable(struct hdhomerun_debug_t *dbg); +extern LIBTYPE bool_t hdhomerun_debug_enabled(struct hdhomerun_debug_t *dbg); + +extern LIBTYPE void hdhomerun_debug_flush(struct hdhomerun_debug_t *dbg, uint64_t timeout); + +extern LIBTYPE void hdhomerun_debug_printf(struct hdhomerun_debug_t *dbg, const char *fmt, ...); +extern LIBTYPE void hdhomerun_debug_vprintf(struct hdhomerun_debug_t *dbg, const char *fmt, va_list args); + +#ifdef __cplusplus +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_device.c kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_device.c --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_device.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_device.c 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,927 @@ +/* + * hdhomerun_device.c + * + * Copyright © 2006-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#include "hdhomerun.h" + +struct hdhomerun_device_t { + struct hdhomerun_control_sock_t *cs; + struct hdhomerun_video_sock_t *vs; + struct hdhomerun_debug_t *dbg; + struct hdhomerun_channelscan_t *scan; + unsigned int tuner; + uint32_t lockkey; + char name[32]; + char model[32]; +}; + +static void hdhomerun_device_set_update(struct hdhomerun_device_t *hd) +{ + /* Clear cached information. */ + *hd->model = 0; + + /* New name. */ + sprintf(hd->name, "%08lX-%u", (unsigned long)hdhomerun_control_get_device_id(hd->cs), hd->tuner); +} + +void hdhomerun_device_set_device(struct hdhomerun_device_t *hd, uint32_t device_id, uint32_t device_ip) +{ + hdhomerun_control_set_device(hd->cs, device_id, device_ip); + hdhomerun_device_set_update(hd); +} + +void hdhomerun_device_set_tuner(struct hdhomerun_device_t *hd, unsigned int tuner) +{ + hd->tuner = tuner; + hdhomerun_device_set_update(hd); +} + +struct hdhomerun_device_t *hdhomerun_device_create(uint32_t device_id, uint32_t device_ip, unsigned int tuner, struct hdhomerun_debug_t *dbg) +{ + struct hdhomerun_device_t *hd = (struct hdhomerun_device_t *)calloc(1, sizeof(struct hdhomerun_device_t)); + if (!hd) { + hdhomerun_debug_printf(dbg, "hdhomerun_device_create: failed to allocate device object\n"); + return NULL; + } + + hd->dbg = dbg; + + hd->cs = hdhomerun_control_create(0, 0, hd->dbg); + if (!hd->cs) { + hdhomerun_debug_printf(hd->dbg, "hdhomerun_device_create: failed to create control object\n"); + free(hd); + return NULL; + } + + hdhomerun_device_set_device(hd, device_id, device_ip); + hdhomerun_device_set_tuner(hd, tuner); + + return hd; +} + +void hdhomerun_device_destroy(struct hdhomerun_device_t *hd) +{ + if (hd->scan) { + channelscan_destroy(hd->scan); + } + + if (hd->vs) { + hdhomerun_video_destroy(hd->vs); + } + + hdhomerun_control_destroy(hd->cs); + + free(hd); +} + +static bool_t is_hex_char(char c) +{ + if ((c >= '0') && (c <= '9')) { + return TRUE; + } + if ((c >= 'A') && (c <= 'F')) { + return TRUE; + } + if ((c >= 'a') && (c <= 'f')) { + return TRUE; + } + return FALSE; +} + +static struct hdhomerun_device_t *hdhomerun_device_create_from_str_device_id(const char *device_str, struct hdhomerun_debug_t *dbg) +{ + int i; + const char *ptr = device_str; + for (i = 0; i < 8; i++) { + if (!is_hex_char(*ptr++)) { + return NULL; + } + } + + if (*ptr == 0) { + unsigned long device_id; + if (sscanf(device_str, "%lx", &device_id) != 1) { + return NULL; + } + return hdhomerun_device_create((uint32_t)device_id, 0, 0, dbg); + } + + if (*ptr == '-') { + unsigned long device_id; + unsigned int tuner; + if (sscanf(device_str, "%lx-%u", &device_id, &tuner) != 2) { + return NULL; + } + return hdhomerun_device_create((uint32_t)device_id, 0, tuner, dbg); + } + + return NULL; +} + +static struct hdhomerun_device_t *hdhomerun_device_create_from_str_ip(const char *device_str, struct hdhomerun_debug_t *dbg) +{ + unsigned long a[4]; + if (sscanf(device_str, "%lu.%lu.%lu.%lu", &a[0], &a[1], &a[2], &a[3]) != 4) { + return NULL; + } + + unsigned long device_ip = (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | (a[3] << 0); + return hdhomerun_device_create(HDHOMERUN_DEVICE_ID_WILDCARD, (uint32_t)device_ip, 0, dbg); +} + +static struct hdhomerun_device_t *hdhomerun_device_create_from_str_dns(const char *device_str, struct hdhomerun_debug_t *dbg) +{ +#if defined(__CYGWIN__) + return NULL; +#else + struct addrinfo hints; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + struct addrinfo *sock_info; + if (getaddrinfo(device_str, "65001", &hints, &sock_info) != 0) { + return NULL; + } + + struct sockaddr_in *sock_addr = (struct sockaddr_in *)sock_info->ai_addr; + uint32_t device_ip = ntohl(sock_addr->sin_addr.s_addr); + freeaddrinfo(sock_info); + + if (device_ip == 0) { + return NULL; + } + + return hdhomerun_device_create(HDHOMERUN_DEVICE_ID_WILDCARD, (uint32_t)device_ip, 0, dbg); +#endif +} + +struct hdhomerun_device_t *hdhomerun_device_create_from_str(const char *device_str, struct hdhomerun_debug_t *dbg) +{ + struct hdhomerun_device_t *device = hdhomerun_device_create_from_str_device_id(device_str, dbg); + if (device) { + return device; + } + + device = hdhomerun_device_create_from_str_ip(device_str, dbg); + if (device) { + return device; + } + + device = hdhomerun_device_create_from_str_dns(device_str, dbg); + if (device) { + return device; + } + + return NULL; +} + +int hdhomerun_device_set_tuner_from_str(struct hdhomerun_device_t *hd, const char *tuner_str) +{ + unsigned int tuner; + if (sscanf(tuner_str, "%u", &tuner) == 1) { + hdhomerun_device_set_tuner(hd, tuner); + return 1; + } + if (sscanf(tuner_str, "/tuner%u", &tuner) == 1) { + hdhomerun_device_set_tuner(hd, tuner); + return 1; + } + + return -1; +} + +uint32_t hdhomerun_device_get_device_id(struct hdhomerun_device_t *hd) +{ + return hdhomerun_control_get_device_id(hd->cs); +} + +uint32_t hdhomerun_device_get_device_ip(struct hdhomerun_device_t *hd) +{ + return hdhomerun_control_get_device_ip(hd->cs); +} + +uint32_t hdhomerun_device_get_device_id_requested(struct hdhomerun_device_t *hd) +{ + return hdhomerun_control_get_device_id_requested(hd->cs); +} + +uint32_t hdhomerun_device_get_device_ip_requested(struct hdhomerun_device_t *hd) +{ + return hdhomerun_control_get_device_ip_requested(hd->cs); +} + +unsigned int hdhomerun_device_get_tuner(struct hdhomerun_device_t *hd) +{ + return hd->tuner; +} + +struct hdhomerun_control_sock_t *hdhomerun_device_get_control_sock(struct hdhomerun_device_t *hd) +{ + return hd->cs; +} + +struct hdhomerun_video_sock_t *hdhomerun_device_get_video_sock(struct hdhomerun_device_t *hd) +{ + if (hd->vs) { + return hd->vs; + } + + hd->vs = hdhomerun_video_create(0, VIDEO_DATA_BUFFER_SIZE_1S * 2, hd->dbg); + if (!hd->vs) { + hdhomerun_debug_printf(hd->dbg, "hdhomerun_device_get_video_sock: failed to create video object\n"); + return NULL; + } + + return hd->vs; +} + +uint32_t hdhomerun_device_get_local_machine_addr(struct hdhomerun_device_t *hd) +{ + return hdhomerun_control_get_local_addr(hd->cs); +} + +static uint32_t hdhomerun_device_get_status_parse(const char *status_str, const char *tag) +{ + const char *ptr = strstr(status_str, tag); + if (!ptr) { + return 0; + } + + unsigned long value = 0; + sscanf(ptr + strlen(tag), "%lu", &value); + + return (uint32_t)value; +} + +static bool_t hdhomerun_device_get_tuner_status_lock_is_bcast(struct hdhomerun_tuner_status_t *status) +{ + if (strcmp(status->lock_str, "8vsb") == 0) { + return TRUE; + } + if (strncmp(status->lock_str, "t8", 2) == 0) { + return TRUE; + } + if (strncmp(status->lock_str, "t7", 2) == 0) { + return TRUE; + } + if (strncmp(status->lock_str, "t6", 2) == 0) { + return TRUE; + } + + return FALSE; +} + +uint32_t hdhomerun_device_get_tuner_status_ss_color(struct hdhomerun_tuner_status_t *status) +{ + unsigned int ss_yellow_min; + unsigned int ss_green_min; + + if (!status->lock_supported) { + return HDHOMERUN_STATUS_COLOR_NEUTRAL; + } + + if (hdhomerun_device_get_tuner_status_lock_is_bcast(status)) { + ss_yellow_min = 50; /* -30dBmV */ + ss_green_min = 75; /* -15dBmV */ + } else { + ss_yellow_min = 80; /* -12dBmV */ + ss_green_min = 90; /* -6dBmV */ + } + + if (status->signal_strength >= ss_green_min) { + return HDHOMERUN_STATUS_COLOR_GREEN; + } + if (status->signal_strength >= ss_yellow_min) { + return HDHOMERUN_STATUS_COLOR_YELLOW; + } + + return HDHOMERUN_STATUS_COLOR_RED; +} + +uint32_t hdhomerun_device_get_tuner_status_snq_color(struct hdhomerun_tuner_status_t *status) +{ + if (status->signal_to_noise_quality >= 70) { + return HDHOMERUN_STATUS_COLOR_GREEN; + } + if (status->signal_to_noise_quality >= 50) { + return HDHOMERUN_STATUS_COLOR_YELLOW; + } + + return HDHOMERUN_STATUS_COLOR_RED; +} + +uint32_t hdhomerun_device_get_tuner_status_seq_color(struct hdhomerun_tuner_status_t *status) +{ + if (status->symbol_error_quality >= 100) { + return HDHOMERUN_STATUS_COLOR_GREEN; + } + + return HDHOMERUN_STATUS_COLOR_RED; +} + +int hdhomerun_device_get_tuner_status(struct hdhomerun_device_t *hd, char **pstatus_str, struct hdhomerun_tuner_status_t *status) +{ + memset(status, 0, sizeof(struct hdhomerun_tuner_status_t)); + + char name[32]; + sprintf(name, "/tuner%u/status", hd->tuner); + + char *status_str; + int ret = hdhomerun_control_get(hd->cs, name, &status_str, NULL); + if (ret <= 0) { + return ret; + } + + if (pstatus_str) { + *pstatus_str = status_str; + } + + char *channel = strstr(status_str, "ch="); + if (channel) { + sscanf(channel + 3, "%31s", status->channel); + } + + char *lock = strstr(status_str, "lock="); + if (lock) { + sscanf(lock + 5, "%31s", status->lock_str); + } + + status->signal_strength = (unsigned int)hdhomerun_device_get_status_parse(status_str, "ss="); + status->signal_to_noise_quality = (unsigned int)hdhomerun_device_get_status_parse(status_str, "snq="); + status->symbol_error_quality = (unsigned int)hdhomerun_device_get_status_parse(status_str, "seq="); + status->raw_bits_per_second = hdhomerun_device_get_status_parse(status_str, "bps="); + status->packets_per_second = hdhomerun_device_get_status_parse(status_str, "pps="); + + status->signal_present = status->signal_strength >= 45; + + if (strcmp(status->lock_str, "none") != 0) { + if (status->lock_str[0] == '(') { + status->lock_unsupported = TRUE; + } else { + status->lock_supported = TRUE; + } + } + + return 1; +} + +int hdhomerun_device_get_tuner_streaminfo(struct hdhomerun_device_t *hd, char **pstreaminfo) +{ + char name[32]; + sprintf(name, "/tuner%u/streaminfo", hd->tuner); + return hdhomerun_control_get(hd->cs, name, pstreaminfo, NULL); +} + +int hdhomerun_device_get_tuner_channel(struct hdhomerun_device_t *hd, char **pchannel) +{ + char name[32]; + sprintf(name, "/tuner%u/channel", hd->tuner); + return hdhomerun_control_get(hd->cs, name, pchannel, NULL); +} + +int hdhomerun_device_get_tuner_channelmap(struct hdhomerun_device_t *hd, char **pchannelmap) +{ + char name[32]; + sprintf(name, "/tuner%u/channelmap", hd->tuner); + return hdhomerun_control_get(hd->cs, name, pchannelmap, NULL); +} + +int hdhomerun_device_get_tuner_filter(struct hdhomerun_device_t *hd, char **pfilter) +{ + char name[32]; + sprintf(name, "/tuner%u/filter", hd->tuner); + return hdhomerun_control_get(hd->cs, name, pfilter, NULL); +} + +int hdhomerun_device_get_tuner_program(struct hdhomerun_device_t *hd, char **pprogram) +{ + char name[32]; + sprintf(name, "/tuner%u/program", hd->tuner); + return hdhomerun_control_get(hd->cs, name, pprogram, NULL); +} + +int hdhomerun_device_get_tuner_target(struct hdhomerun_device_t *hd, char **ptarget) +{ + char name[32]; + sprintf(name, "/tuner%u/target", hd->tuner); + return hdhomerun_control_get(hd->cs, name, ptarget, NULL); +} + +int hdhomerun_device_get_tuner_plotsample(struct hdhomerun_device_t *hd, struct hdhomerun_plotsample_t **psamples, size_t *pcount) +{ + char name[32]; + sprintf(name, "/tuner%u/plotsample", hd->tuner); + + char *result; + int ret = hdhomerun_control_get(hd->cs, name, &result, NULL); + if (ret <= 0) { + return ret; + } + + struct hdhomerun_plotsample_t *samples = (struct hdhomerun_plotsample_t *)result; + *psamples = samples; + size_t count = 0; + + while (1) { + char *ptr = strchr(result, ' '); + if (!ptr) { + break; + } + *ptr++ = 0; + + unsigned long raw; + if (sscanf(result, "%lx", &raw) != 1) { + break; + } + + uint16_t real = (raw >> 12) & 0x0FFF; + if (real & 0x0800) { + real |= 0xF000; + } + + uint16_t imag = (raw >> 0) & 0x0FFF; + if (imag & 0x0800) { + imag |= 0xF000; + } + + samples->real = (int16_t)real; + samples->imag = (int16_t)imag; + samples++; + count++; + + result = ptr; + } + + *pcount = count; + return 1; +} + +int hdhomerun_device_get_tuner_lockkey_owner(struct hdhomerun_device_t *hd, char **powner) +{ + char name[32]; + sprintf(name, "/tuner%u/lockkey", hd->tuner); + return hdhomerun_control_get(hd->cs, name, powner, NULL); +} + +int hdhomerun_device_get_ir_target(struct hdhomerun_device_t *hd, char **ptarget) +{ + return hdhomerun_control_get(hd->cs, "/ir/target", ptarget, NULL); +} + +int hdhomerun_device_get_lineup_location(struct hdhomerun_device_t *hd, char **plocation) +{ + return hdhomerun_control_get(hd->cs, "/lineup/location", plocation, NULL); +} + +int hdhomerun_device_get_version(struct hdhomerun_device_t *hd, char **pversion_str, uint32_t *pversion_num) +{ + char *version_str; + int ret = hdhomerun_control_get(hd->cs, "/sys/version", &version_str, NULL); + if (ret <= 0) { + return ret; + } + + if (pversion_str) { + *pversion_str = version_str; + } + + if (pversion_num) { + unsigned long version_num; + if (sscanf(version_str, "%lu", &version_num) != 1) { + *pversion_num = 0; + } else { + *pversion_num = (uint32_t)version_num; + } + } + + return 1; +} + +int hdhomerun_device_set_tuner_channel(struct hdhomerun_device_t *hd, const char *channel) +{ + char name[32]; + sprintf(name, "/tuner%u/channel", hd->tuner); + return hdhomerun_control_set_with_lockkey(hd->cs, name, channel, hd->lockkey, NULL, NULL); +} + +int hdhomerun_device_set_tuner_channelmap(struct hdhomerun_device_t *hd, const char *channelmap) +{ + char name[32]; + sprintf(name, "/tuner%u/channelmap", hd->tuner); + return hdhomerun_control_set_with_lockkey(hd->cs, name, channelmap, hd->lockkey, NULL, NULL); +} + +int hdhomerun_device_set_tuner_filter(struct hdhomerun_device_t *hd, const char *filter) +{ + char name[32]; + sprintf(name, "/tuner%u/filter", hd->tuner); + return hdhomerun_control_set_with_lockkey(hd->cs, name, filter, hd->lockkey, NULL, NULL); +} + +static int hdhomerun_device_set_tuner_filter_by_array_append(char **pptr, char *end, uint16_t range_begin, uint16_t range_end) +{ + char *ptr = *pptr; + + size_t available = end - ptr; + size_t required; + + if (range_begin == range_end) { + required = snprintf(ptr, available, "0x%04x ", range_begin) + 1; + } else { + required = snprintf(ptr, available, "0x%04x-0x%04x ", range_begin, range_end) + 1; + } + + if (required > available) { + return FALSE; + } + + *pptr = strchr(ptr, 0); + return TRUE; +} + +int hdhomerun_device_set_tuner_filter_by_array(struct hdhomerun_device_t *hd, unsigned char filter_array[0x2000]) +{ + char filter[1024]; + char *ptr = filter; + char *end = filter + sizeof(filter); + + uint16_t range_begin = 0xFFFF; + uint16_t range_end = 0xFFFF; + + uint16_t i; + for (i = 0; i <= 0x1FFF; i++) { + if (!filter_array[i]) { + if (range_begin == 0xFFFF) { + continue; + } + if (!hdhomerun_device_set_tuner_filter_by_array_append(&ptr, end, range_begin, range_end)) { + return 0; + } + range_begin = 0xFFFF; + range_end = 0xFFFF; + continue; + } + + if (range_begin == 0xFFFF) { + range_begin = i; + range_end = i; + continue; + } + + range_end = i; + } + + if (range_begin != 0xFFFF) { + if (!hdhomerun_device_set_tuner_filter_by_array_append(&ptr, end, range_begin, range_end)) { + return 0; + } + } + + /* Remove trailing space. */ + if (ptr > filter) { + ptr--; + } + *ptr = 0; + + return hdhomerun_device_set_tuner_filter(hd, filter); +} + +int hdhomerun_device_set_tuner_program(struct hdhomerun_device_t *hd, const char *program) +{ + char name[32]; + sprintf(name, "/tuner%u/program", hd->tuner); + return hdhomerun_control_set_with_lockkey(hd->cs, name, program, hd->lockkey, NULL, NULL); +} + +int hdhomerun_device_set_tuner_target(struct hdhomerun_device_t *hd, char *target) +{ + char name[32]; + sprintf(name, "/tuner%u/target", hd->tuner); + return hdhomerun_control_set_with_lockkey(hd->cs, name, target, hd->lockkey, NULL, NULL); +} + +int hdhomerun_device_set_tuner_target_to_local_protocol(struct hdhomerun_device_t *hd, const char *protocol) +{ + /* Create video socket. */ + hdhomerun_device_get_video_sock(hd); + if (!hd->vs) { + return -1; + } + + /* Set target. */ + char target[64]; + uint32_t local_ip = hdhomerun_control_get_local_addr(hd->cs); + uint16_t local_port = hdhomerun_video_get_local_port(hd->vs); + sprintf(target, "%s://%u.%u.%u.%u:%u", + protocol, + (unsigned int)(local_ip >> 24) & 0xFF, (unsigned int)(local_ip >> 16) & 0xFF, + (unsigned int)(local_ip >> 8) & 0xFF, (unsigned int)(local_ip >> 0) & 0xFF, + (unsigned int)local_port + ); + + return hdhomerun_device_set_tuner_target(hd, target); +} + +int hdhomerun_device_set_tuner_target_to_local(struct hdhomerun_device_t *hd) +{ + return hdhomerun_device_set_tuner_target_to_local_protocol(hd, HDHOMERUN_TARGET_PROTOCOL_UDP); +} + +int hdhomerun_device_set_ir_target(struct hdhomerun_device_t *hd, const char *target) +{ + return hdhomerun_control_set(hd->cs, "/ir/target", target, NULL, NULL); +} + +int hdhomerun_device_set_lineup_location(struct hdhomerun_device_t *hd, const char *location) +{ + return hdhomerun_control_set(hd->cs, "/lineup/location", location, NULL, NULL); +} + +int hdhomerun_device_get_var(struct hdhomerun_device_t *hd, const char *name, char **pvalue, char **perror) +{ + return hdhomerun_control_get(hd->cs, name, pvalue, perror); +} + +int hdhomerun_device_set_var(struct hdhomerun_device_t *hd, const char *name, const char *value, char **pvalue, char **perror) +{ + return hdhomerun_control_set_with_lockkey(hd->cs, name, value, hd->lockkey, pvalue, perror); +} + +int hdhomerun_device_tuner_lockkey_request(struct hdhomerun_device_t *hd, char **perror) +{ + uint32_t new_lockkey = (uint32_t)getcurrenttime(); + + char name[32]; + sprintf(name, "/tuner%u/lockkey", hd->tuner); + + char new_lockkey_str[64]; + sprintf(new_lockkey_str, "%u", (unsigned int)new_lockkey); + + int ret = hdhomerun_control_set_with_lockkey(hd->cs, name, new_lockkey_str, hd->lockkey, NULL, perror); + if (ret <= 0) { + hd->lockkey = 0; + return ret; + } + + hd->lockkey = new_lockkey; + return ret; +} + +int hdhomerun_device_tuner_lockkey_release(struct hdhomerun_device_t *hd) +{ + if (hd->lockkey == 0) { + return 1; + } + + char name[32]; + sprintf(name, "/tuner%u/lockkey", hd->tuner); + int ret = hdhomerun_control_set_with_lockkey(hd->cs, name, "none", hd->lockkey, NULL, NULL); + + hd->lockkey = 0; + return ret; +} + +int hdhomerun_device_tuner_lockkey_force(struct hdhomerun_device_t *hd) +{ + char name[32]; + sprintf(name, "/tuner%u/lockkey", hd->tuner); + int ret = hdhomerun_control_set(hd->cs, name, "force", NULL, NULL); + + hd->lockkey = 0; + return ret; +} + +void hdhomerun_device_tuner_lockkey_use_value(struct hdhomerun_device_t *hd, uint32_t lockkey) +{ + hd->lockkey = lockkey; +} + +int hdhomerun_device_wait_for_lock(struct hdhomerun_device_t *hd, struct hdhomerun_tuner_status_t *status) +{ + /* Delay for SS reading to be valid (signal present). */ + msleep(250); + + /* Wait for up to 2.5 seconds for lock. */ + uint64_t timeout = getcurrenttime() + 2500; + while (1) { + /* Get status to check for lock. Quality numbers will not be valid yet. */ + int ret = hdhomerun_device_get_tuner_status(hd, NULL, status); + if (ret <= 0) { + return ret; + } + + if (!status->signal_present) { + return 1; + } + if (status->lock_supported || status->lock_unsupported) { + return 1; + } + + if (getcurrenttime() >= timeout) { + return 1; + } + + msleep(250); + } +} + +int hdhomerun_device_stream_start(struct hdhomerun_device_t *hd) +{ + /* Set target. */ + int ret = hdhomerun_device_stream_refresh_target(hd); + if (ret <= 0) { + return ret; + } + + /* Flush video buffer. */ + msleep(64); + hdhomerun_video_flush(hd->vs); + + /* Success. */ + return 1; +} + +int hdhomerun_device_stream_refresh_target(struct hdhomerun_device_t *hd) +{ + return hdhomerun_device_set_tuner_target_to_local_protocol(hd, HDHOMERUN_TARGET_PROTOCOL_RTP); +} + +uint8_t *hdhomerun_device_stream_recv(struct hdhomerun_device_t *hd, size_t max_size, size_t *pactual_size) +{ + if (!hd->vs) { + return NULL; + } + return hdhomerun_video_recv(hd->vs, max_size, pactual_size); +} + +void hdhomerun_device_stream_flush(struct hdhomerun_device_t *hd) +{ + hdhomerun_video_flush(hd->vs); +} + +void hdhomerun_device_stream_stop(struct hdhomerun_device_t *hd) +{ + hdhomerun_device_set_tuner_target(hd, "none"); +} + +int hdhomerun_device_channelscan_init(struct hdhomerun_device_t *hd, const char *channelmap) +{ + if (hd->scan) { + channelscan_destroy(hd->scan); + } + + hd->scan = channelscan_create(hd, channelmap); + if (!hd->scan) { + return -1; + } + + return 1; +} + +int hdhomerun_device_channelscan_advance(struct hdhomerun_device_t *hd, struct hdhomerun_channelscan_result_t *result) +{ + if (!hd->scan) { + return 0; + } + + int ret = channelscan_advance(hd->scan, result); + if (ret <= 0) { + channelscan_destroy(hd->scan); + hd->scan = NULL; + } + + return ret; +} + +int hdhomerun_device_channelscan_detect(struct hdhomerun_device_t *hd, struct hdhomerun_channelscan_result_t *result) +{ + if (!hd->scan) { + return 0; + } + + int ret = channelscan_detect(hd->scan, result); + if (ret <= 0) { + channelscan_destroy(hd->scan); + hd->scan = NULL; + } + + return ret; +} + +uint8_t hdhomerun_device_channelscan_get_progress(struct hdhomerun_device_t *hd) +{ + if (!hd->scan) { + return 0; + } + + return channelscan_get_progress(hd->scan); +} + +int hdhomerun_device_firmware_version_check(struct hdhomerun_device_t *hd, uint32_t features) +{ + uint32_t version; + if (hdhomerun_device_get_version(hd, NULL, &version) <= 0) { + return -1; + } + + if (version < 20070219) { + return 0; + } + + return 1; +} + +const char *hdhomerun_device_get_model_str(struct hdhomerun_device_t *hd) +{ + if (*hd->model) { + return hd->model; + } + + char *model_str; + int ret = hdhomerun_control_get(hd->cs, "/sys/model", &model_str, NULL); + if (ret < 0) { + return NULL; + } + if (ret == 0) { + model_str = "hdhomerun_atsc"; + } + + strncpy(hd->model, model_str, sizeof(hd->model) - 1); + hd->model[sizeof(hd->model) - 1] = 0; + + return hd->model; +} + +int hdhomerun_device_upgrade(struct hdhomerun_device_t *hd, FILE *upgrade_file) +{ + hdhomerun_control_set(hd->cs, "/tuner0/lockkey", "force", NULL, NULL); + hdhomerun_control_set(hd->cs, "/tuner0/channel", "none", NULL, NULL); + + hdhomerun_control_set(hd->cs, "/tuner1/lockkey", "force", NULL, NULL); + hdhomerun_control_set(hd->cs, "/tuner1/channel", "none", NULL, NULL); + + return hdhomerun_control_upgrade(hd->cs, upgrade_file); +} + +void hdhomerun_device_debug_print_video_stats(struct hdhomerun_device_t *hd) +{ + if (!hdhomerun_debug_enabled(hd->dbg)) { + return; + } + + char name[32]; + sprintf(name, "/tuner%u/debug", hd->tuner); + + char *debug_str; + char *error_str; + int ret = hdhomerun_control_get(hd->cs, name, &debug_str, &error_str); + if (ret < 0) { + hdhomerun_debug_printf(hd->dbg, "video dev: communication error getting debug stats\n"); + return; + } + + if (error_str) { + hdhomerun_debug_printf(hd->dbg, "video dev: %s\n", error_str); + } else { + hdhomerun_debug_printf(hd->dbg, "video dev: %s\n", debug_str); + } + + if (hd->vs) { + hdhomerun_video_debug_print_stats(hd->vs); + } +} + +void hdhomerun_device_get_video_stats(struct hdhomerun_device_t *hd, struct hdhomerun_video_stats_t *stats) +{ + hdhomerun_video_get_stats(hd->vs, stats); +} diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_device.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_device.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_device.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_device.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,280 @@ +/* + * hdhomerun_device.h + * + * Copyright © 2006-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define HDHOMERUN_DEVICE_MAX_TUNE_TO_LOCK_TIME 1500 +#define HDHOMERUN_DEVICE_MAX_LOCK_TO_DATA_TIME 2000 +#define HDHOMERUN_DEVICE_MAX_TUNE_TO_DATA_TIME (HDHOMERUN_DEVICE_MAX_TUNE_TO_LOCK_TIME + HDHOMERUN_DEVICE_MAX_LOCK_TO_DATA_TIME) + +#define HDHOMERUN_STATUS_COLOR_NEUTRAL 0xFFFFFFFF +#define HDHOMERUN_STATUS_COLOR_RED 0xFFFF0000 +#define HDHOMERUN_STATUS_COLOR_YELLOW 0xFFFFFF00 +#define HDHOMERUN_STATUS_COLOR_GREEN 0xFF00C000 + +#define HDHOMERUN_TARGET_PROTOCOL_UDP "udp" +#define HDHOMERUN_TARGET_PROTOCOL_RTP "rtp" + +/* + * Create a device object. + * + * Typically a device object will be created for each tuner. + * It is valid to have multiple device objects communicating with a single HDHomeRun. + * + * For example, a threaded application that streams video from 4 tuners (2 HDHomeRun devices) and has + * GUI feedback to the user of the selected tuner might use 5 device objects: 4 for streaming video + * (one per thread) and one for the GUI display that can just between tuners. + * + * This function will not attempt to connect to the device. + * The connection will be established when first used. + * + * uint32_t device_id = 32-bit device id of device. Set to HDHOMERUN_DEVICE_ID_WILDCARD to match any device ID. + * uint32_t device_ip = IP address of device. Set to 0 to auto-detect. + * unsigned int tuner = tuner index (0 or 1). Can be changed later by calling hdhomerun_device_set_tuner. + * struct hdhomerun_debug_t *dbg: Pointer to debug logging object. May be NULL. + * + * Returns a pointer to the newly created device object. + * + * When no longer needed, the socket should be destroyed by calling hdhomerun_device_destroy. + * + * The hdhomerun_device_create_from_str function creates a device object from the given device_str. + * The device_str parameter can be any of the following forms: + * + * - + * + * If the tuner index is not included in the device_str then it is set to zero. + * Use hdhomerun_device_set_tuner or hdhomerun_device_set_tuner_from_str to set the tuner. + * + * The hdhomerun_device_set_tuner_from_str function sets the tuner from the given tuner_str. + * The tuner_str parameter can be any of the following forms: + * + * /tuner + */ +extern LIBTYPE struct hdhomerun_device_t *hdhomerun_device_create(uint32_t device_id, uint32_t device_ip, unsigned int tuner, struct hdhomerun_debug_t *dbg); +extern LIBTYPE struct hdhomerun_device_t *hdhomerun_device_create_from_str(const char *device_str, struct hdhomerun_debug_t *dbg); +extern LIBTYPE void hdhomerun_device_destroy(struct hdhomerun_device_t *hd); + +/* + * Get the device id, ip, or tuner of the device instance. + */ +extern LIBTYPE uint32_t hdhomerun_device_get_device_id(struct hdhomerun_device_t *hd); +extern LIBTYPE uint32_t hdhomerun_device_get_device_ip(struct hdhomerun_device_t *hd); +extern LIBTYPE uint32_t hdhomerun_device_get_device_id_requested(struct hdhomerun_device_t *hd); +extern LIBTYPE uint32_t hdhomerun_device_get_device_ip_requested(struct hdhomerun_device_t *hd); +extern LIBTYPE unsigned int hdhomerun_device_get_tuner(struct hdhomerun_device_t *hd); + +extern LIBTYPE void hdhomerun_device_set_device(struct hdhomerun_device_t *hd, uint32_t device_id, uint32_t device_ip); +extern LIBTYPE void hdhomerun_device_set_tuner(struct hdhomerun_device_t *hd, unsigned int tuner); +extern LIBTYPE int hdhomerun_device_set_tuner_from_str(struct hdhomerun_device_t *hd, const char *tuner_str); + +/* + * Get the local machine IP address used when communicating with the device. + * + * This function is useful for determining the IP address to use with set target commands. + * + * Returns 32-bit IP address with native endianness, or 0 on error. + */ +extern LIBTYPE uint32_t hdhomerun_device_get_local_machine_addr(struct hdhomerun_device_t *hd); + +/* + * Get operations. + * + * struct hdhomerun_tuner_status_t *status = Pointer to caller supplied status struct to be populated with result. + * const char **p = Caller supplied char * to be updated to point to the result string. The string will remain + * valid until another call to a device function. + * + * Returns 1 if the operation was successful. + * Returns 0 if the operation was rejected. + * Returns -1 if a communication error occurred. + */ +extern LIBTYPE int hdhomerun_device_get_tuner_status(struct hdhomerun_device_t *hd, char **pstatus_str, struct hdhomerun_tuner_status_t *status); +extern LIBTYPE int hdhomerun_device_get_tuner_streaminfo(struct hdhomerun_device_t *hd, char **pstreaminfo); +extern LIBTYPE int hdhomerun_device_get_tuner_channel(struct hdhomerun_device_t *hd, char **pchannel); +extern LIBTYPE int hdhomerun_device_get_tuner_channelmap(struct hdhomerun_device_t *hd, char **pchannelmap); +extern LIBTYPE int hdhomerun_device_get_tuner_filter(struct hdhomerun_device_t *hd, char **pfilter); +extern LIBTYPE int hdhomerun_device_get_tuner_program(struct hdhomerun_device_t *hd, char **pprogram); +extern LIBTYPE int hdhomerun_device_get_tuner_target(struct hdhomerun_device_t *hd, char **ptarget); +extern LIBTYPE int hdhomerun_device_get_tuner_plotsample(struct hdhomerun_device_t *hd, struct hdhomerun_plotsample_t **psamples, size_t *pcount); +extern LIBTYPE int hdhomerun_device_get_tuner_lockkey_owner(struct hdhomerun_device_t *hd, char **powner); +extern LIBTYPE int hdhomerun_device_get_ir_target(struct hdhomerun_device_t *hd, char **ptarget); +extern LIBTYPE int hdhomerun_device_get_lineup_location(struct hdhomerun_device_t *hd, char **plocation); +extern LIBTYPE int hdhomerun_device_get_version(struct hdhomerun_device_t *hd, char **pversion_str, uint32_t *pversion_num); + +extern LIBTYPE uint32_t hdhomerun_device_get_tuner_status_ss_color(struct hdhomerun_tuner_status_t *status); +extern LIBTYPE uint32_t hdhomerun_device_get_tuner_status_snq_color(struct hdhomerun_tuner_status_t *status); +extern LIBTYPE uint32_t hdhomerun_device_get_tuner_status_seq_color(struct hdhomerun_tuner_status_t *status); + +extern LIBTYPE const char *hdhomerun_device_get_model_str(struct hdhomerun_device_t *hd); + +/* + * Set operations. + * + * const char * = String to send to device. + * + * Returns 1 if the operation was successful. + * Returns 0 if the operation was rejected. + * Returns -1 if a communication error occurred. + */ +extern LIBTYPE int hdhomerun_device_set_tuner_channel(struct hdhomerun_device_t *hd, const char *channel); +extern LIBTYPE int hdhomerun_device_set_tuner_channelmap(struct hdhomerun_device_t *hd, const char *channelmap); +extern LIBTYPE int hdhomerun_device_set_tuner_filter(struct hdhomerun_device_t *hd, const char *filter); +extern LIBTYPE int hdhomerun_device_set_tuner_filter_by_array(struct hdhomerun_device_t *hd, unsigned char filter_array[0x2000]); +extern LIBTYPE int hdhomerun_device_set_tuner_program(struct hdhomerun_device_t *hd, const char *program); +extern LIBTYPE int hdhomerun_device_set_tuner_target(struct hdhomerun_device_t *hd, char *target); +extern LIBTYPE int hdhomerun_device_set_tuner_target_to_local_protocol(struct hdhomerun_device_t *hd, const char *protocol); +extern LIBTYPE int hdhomerun_device_set_tuner_target_to_local(struct hdhomerun_device_t *hd); +extern LIBTYPE int hdhomerun_device_set_ir_target(struct hdhomerun_device_t *hd, const char *target); +extern LIBTYPE int hdhomerun_device_set_lineup_location(struct hdhomerun_device_t *hd, const char *location); + +/* + * Get/set a named control variable on the device. + * + * const char *name: The name of var to get/set (c-string). The supported vars is device/firmware dependant. + * const char *value: The value to set (c-string). The format is device/firmware dependant. + + * char **pvalue: If provided, the caller-supplied char pointer will be populated with a pointer to the value + * string returned by the device, or NULL if the device returned an error string. The string will remain + * valid until the next call to a control sock function. + * char **perror: If provided, the caller-supplied char pointer will be populated with a pointer to the error + * string returned by the device, or NULL if the device returned an value string. The string will remain + * valid until the next call to a control sock function. + * + * Returns 1 if the operation was successful (pvalue set, perror NULL). + * Returns 0 if the operation was rejected (pvalue NULL, perror set). + * Returns -1 if a communication error occurs. + */ +extern LIBTYPE int hdhomerun_device_get_var(struct hdhomerun_device_t *hd, const char *name, char **pvalue, char **perror); +extern LIBTYPE int hdhomerun_device_set_var(struct hdhomerun_device_t *hd, const char *name, const char *value, char **pvalue, char **perror); + +/* + * Tuner locking. + * + * The hdhomerun_device_tuner_lockkey_request function is used to obtain a lock + * or to verify that the hdhomerun_device object still holds the lock. + * Returns 1 if the lock request was successful and the lock was obtained. + * Returns 0 if the lock request was rejected. + * Returns -1 if a communication error occurs. + * + * The hdhomerun_device_tuner_lockkey_release function is used to release a + * previously held lock. If locking is used then this function must be called + * before destroying the hdhomerun_device object. + */ +extern LIBTYPE int hdhomerun_device_tuner_lockkey_request(struct hdhomerun_device_t *hd, char **perror); +extern LIBTYPE int hdhomerun_device_tuner_lockkey_release(struct hdhomerun_device_t *hd); +extern LIBTYPE int hdhomerun_device_tuner_lockkey_force(struct hdhomerun_device_t *hd); + +/* + * Intended only for non persistent connections; eg, hdhomerun_config. + */ +extern LIBTYPE void hdhomerun_device_tuner_lockkey_use_value(struct hdhomerun_device_t *hd, uint32_t lockkey); + +/* + * Wait for tuner lock after channel change. + * + * The hdhomerun_device_wait_for_lock function is used to detect/wait for a lock vs no lock indication + * after a channel change. + * + * It will return quickly if a lock is aquired. + * It will return quickly if there is no signal detected. + * Worst case it will time out after 1.5 seconds - the case where there is signal but no lock. + */ +extern LIBTYPE int hdhomerun_device_wait_for_lock(struct hdhomerun_device_t *hd, struct hdhomerun_tuner_status_t *status); + +/* + * Stream a filtered program or the unfiltered stream. + * + * The hdhomerun_device_stream_start function initializes the process and tells the device to start streamin data. + * + * uint16_t program_number = The program number to filer, or 0 for unfiltered. + * + * Returns 1 if the oprtation started successfully. + * Returns 0 if the operation was rejected. + * Returns -1 if a communication error occurs. + * + * The hdhomerun_device_stream_recv function should be called periodically to receive the stream data. + * The buffer can losslessly store 1 second of data, however a more typical call rate would be every 64ms. + * + * The hdhomerun_device_stream_stop function tells the device to stop streaming data. + */ +extern LIBTYPE int hdhomerun_device_stream_start(struct hdhomerun_device_t *hd); +extern LIBTYPE int hdhomerun_device_stream_refresh_target(struct hdhomerun_device_t *hd); +extern LIBTYPE uint8_t *hdhomerun_device_stream_recv(struct hdhomerun_device_t *hd, size_t max_size, size_t *pactual_size); +extern LIBTYPE void hdhomerun_device_stream_flush(struct hdhomerun_device_t *hd); +extern LIBTYPE void hdhomerun_device_stream_stop(struct hdhomerun_device_t *hd); + +/* + * Channel scan API. + */ +extern LIBTYPE int hdhomerun_device_channelscan_init(struct hdhomerun_device_t *hd, const char *channelmap); +extern LIBTYPE int hdhomerun_device_channelscan_advance(struct hdhomerun_device_t *hd, struct hdhomerun_channelscan_result_t *result); +extern LIBTYPE int hdhomerun_device_channelscan_detect(struct hdhomerun_device_t *hd, struct hdhomerun_channelscan_result_t *result); +extern LIBTYPE uint8_t hdhomerun_device_channelscan_get_progress(struct hdhomerun_device_t *hd); + +/* + * Check that the device is running the recommended firmware. + * + * uint32_t features: Reserved for future use. Set to zero. + * + * Returns 1 if the firmware meets the minimum requriements for all operations. + * Returns 0 if th firmware does not meet the minimum requriements for all operations. + * Returns -1 if an error occurs. + */ +extern LIBTYPE int hdhomerun_device_firmware_version_check(struct hdhomerun_device_t *hd, uint32_t features); + +/* + * Upload new firmware to the device. + * + * FILE *upgrade_file: File pointer to read from. The file must have been opened in binary mode for reading. + * + * Returns 1 if the upload succeeded. + * Returns 0 if the upload was rejected. + * Returns -1 if an error occurs. + */ +extern LIBTYPE int hdhomerun_device_upgrade(struct hdhomerun_device_t *hd, FILE *upgrade_file); + +/* + * Low level accessor functions. + */ +extern LIBTYPE struct hdhomerun_control_sock_t *hdhomerun_device_get_control_sock(struct hdhomerun_device_t *hd); +extern LIBTYPE struct hdhomerun_video_sock_t *hdhomerun_device_get_video_sock(struct hdhomerun_device_t *hd); + +/* + * Debug print internal stats. + */ +extern LIBTYPE void hdhomerun_device_debug_print_video_stats(struct hdhomerun_device_t *hd); +extern LIBTYPE void hdhomerun_device_get_video_stats(struct hdhomerun_device_t *hd, struct hdhomerun_video_stats_t *stats); + +#ifdef __cplusplus +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_dhcp.c kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_dhcp.c --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_dhcp.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_dhcp.c 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,248 @@ +/* + * hdhomerun_dhcp.c + * + * Copyright © 2006-2007 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#include "hdhomerun.h" +#include "hdhomerun_dhcp.h" + +struct dhcp_hdr_t { + uint8_t bootp_message_type; + uint8_t hardware_type; + uint8_t hardware_address_length; + uint8_t hops; + uint32_t transaction_id; + uint16_t seconds_elapsed; + uint16_t bootp_flags; + uint32_t client_ip; + uint32_t your_ip; + uint32_t next_server_ip; + uint32_t relay_agent_ip; + uint8_t client_mac[16]; + uint8_t server_host_name[64]; + uint8_t boot_file_name[128]; + uint32_t magic_cookie; +}; + +struct hdhomerun_dhcp_t { + int sock; + uint32_t local_address; + pthread_t thread; + volatile bool_t terminate; +}; + +static THREAD_FUNC_PREFIX hdhomerun_dhcp_thread_execute(void *arg); + +struct hdhomerun_dhcp_t *hdhomerun_dhcp_create(uint32_t bind_address) +{ + if (bind_address != 0) { + if ((bind_address & 0xFFFF0000) != 0xA9FE0000) { + return NULL; + } + } + + /* Create socket. */ + int sock = (int)socket(AF_INET, SOCK_DGRAM, 0); + if (sock == -1) { + return NULL; + } + + /* Set timeout. */ + setsocktimeout(sock, SOL_SOCKET, SO_RCVTIMEO, 1000); + + /* Allow broadcast. */ + int sock_opt = 1; + setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&sock_opt, sizeof(sock_opt)); + + /* Allow reuse. */ + sock_opt = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&sock_opt, sizeof(sock_opt)); + + /* Bind socket. */ + struct sockaddr_in sock_addr; + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = htonl(bind_address); + sock_addr.sin_port = htons(67); + if (bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != 0) { + close(sock); + return NULL; + } + + /* Allocate object. */ + struct hdhomerun_dhcp_t *dhcp = (struct hdhomerun_dhcp_t *)calloc(1, sizeof(struct hdhomerun_dhcp_t)); + if (!dhcp) { + close(sock); + return NULL; + } + + dhcp->sock = sock; + + if (bind_address != 0) { + dhcp->local_address = bind_address; + } else { + dhcp->local_address = 0xA9FEFFFF; + } + + /* Spawn thread. */ + if (pthread_create(&dhcp->thread, NULL, &hdhomerun_dhcp_thread_execute, dhcp) != 0) { + close(sock); + free(dhcp); + return NULL; + } + + /* Success. */ + return dhcp; +} + +void hdhomerun_dhcp_destroy(struct hdhomerun_dhcp_t *dhcp) +{ + dhcp->terminate = TRUE; + pthread_join(dhcp->thread, NULL); + + close(dhcp->sock); + free(dhcp); +} + +static void hdhomerun_dhcp_send(struct hdhomerun_dhcp_t *dhcp, uint8_t message_type, struct hdhomerun_pkt_t *pkt) +{ + pkt->pos = pkt->start; + struct dhcp_hdr_t *hdr = (struct dhcp_hdr_t *)pkt->pos; + pkt->pos += sizeof(struct dhcp_hdr_t); + pkt->end = pkt->pos; + + uint32_t remote_addr = 0xA9FE0000; + remote_addr |= (uint32_t)hdr->client_mac[4] << 8; + remote_addr |= (uint32_t)hdr->client_mac[5] << 0; + if ((remote_addr == 0xA9FE0000) || (remote_addr == 0xA9FEFFFF)) { + remote_addr = 0xA9FE8080; + } + + hdr->bootp_message_type = 0x02; + hdr->your_ip = htonl(remote_addr); + hdr->next_server_ip = htonl(0x00000000); + + hdhomerun_pkt_write_u8(pkt, 53); + hdhomerun_pkt_write_u8(pkt, 1); + hdhomerun_pkt_write_u8(pkt, message_type); + + hdhomerun_pkt_write_u8(pkt, 54); + hdhomerun_pkt_write_u8(pkt, 4); + hdhomerun_pkt_write_u32(pkt, dhcp->local_address); + + hdhomerun_pkt_write_u8(pkt, 51); + hdhomerun_pkt_write_u8(pkt, 4); + hdhomerun_pkt_write_u32(pkt, 7*24*60*60); + + hdhomerun_pkt_write_u8(pkt, 1); + hdhomerun_pkt_write_u8(pkt, 4); + hdhomerun_pkt_write_u32(pkt, 0xFFFF0000); + + hdhomerun_pkt_write_u8(pkt, 0xFF); + + while (pkt->pos < pkt->start + 300) { + hdhomerun_pkt_write_u8(pkt, 0x00); + } + + struct sockaddr_in sock_addr; + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = htonl(0xFFFFFFFF); + sock_addr.sin_port = htons(68); + + sendto(dhcp->sock, (char *)pkt->start, (int)(pkt->end - pkt->start), 0, (struct sockaddr *)&sock_addr, sizeof(sock_addr)); +} + +static void hdhomerun_dhcp_recv(struct hdhomerun_dhcp_t *dhcp, struct hdhomerun_pkt_t *pkt) +{ + pkt->pos = pkt->start; + struct dhcp_hdr_t *hdr = (struct dhcp_hdr_t *)pkt->pos; + pkt->pos += sizeof(struct dhcp_hdr_t); + if (pkt->pos > pkt->end) { + return; + } + + if (ntohl(hdr->magic_cookie) != 0x63825363) { + return; + } + + static uint8_t vendor[3] = {0x00, 0x18, 0xDD}; + if (memcmp(hdr->client_mac, vendor, 3) != 0) { + return; + } + + if (pkt->pos + 3 > pkt->end) { + return; + } + if (hdhomerun_pkt_read_u8(pkt) != 53) { + return; + } + if (hdhomerun_pkt_read_u8(pkt) != 1) { + return; + } + uint8_t message_type_val = hdhomerun_pkt_read_u8(pkt); + + switch (message_type_val) { + case 0x01: + hdhomerun_dhcp_send(dhcp, 0x02, pkt); + break; + case 0x03: + hdhomerun_dhcp_send(dhcp, 0x05, pkt); + break; + default: + return; + } +} + +static THREAD_FUNC_PREFIX hdhomerun_dhcp_thread_execute(void *arg) +{ + struct hdhomerun_dhcp_t *dhcp = (struct hdhomerun_dhcp_t *)arg; + struct hdhomerun_pkt_t pkt_inst; + + while (1) { + if (dhcp->terminate) { + return NULL; + } + + struct hdhomerun_pkt_t *pkt = &pkt_inst; + hdhomerun_pkt_reset(pkt); + + int rx_length = recv(dhcp->sock, (char *)pkt->end, (int)(pkt->limit - pkt->end), 0); + if (rx_length <= 0) { + if (!sock_getlasterror_socktimeout) { + sleep(1); + } + continue; + } + pkt->end += rx_length; + + hdhomerun_dhcp_recv(dhcp, pkt); + } +} diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_dhcp.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_dhcp.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_dhcp.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_dhcp.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,44 @@ +/* + * hdhomerun_dhcp.h + * + * Copyright © 2006 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct hdhomerun_dhcp_t; + +extern LIBTYPE struct hdhomerun_dhcp_t *hdhomerun_dhcp_create(uint32_t bind_address); +extern LIBTYPE void hdhomerun_dhcp_destroy(struct hdhomerun_dhcp_t *dhcp); + +#ifdef __cplusplus +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_discover.c kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_discover.c --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_discover.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_discover.c 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,506 @@ +/* + * hdhomerun_discover.c + * + * Copyright © 2006-2007 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#include "hdhomerun.h" + +#if defined(__CYGWIN__) || defined(__WINDOWS__) +#include +#include +#define USE_IPHLPAPI 1 +#else +#include +#include +#ifndef _SIZEOF_ADDR_IFREQ +#define _SIZEOF_ADDR_IFREQ(x) sizeof(x) +#endif +#endif + +#define HDHOMERUN_DISOCVER_MAX_SOCK_COUNT 16 + +struct hdhomerun_discover_sock_t { + int sock; + uint32_t local_ip; + uint32_t subnet_mask; +}; + +struct hdhomerun_discover_t { + struct hdhomerun_discover_sock_t socks[HDHOMERUN_DISOCVER_MAX_SOCK_COUNT]; + unsigned int sock_count; + struct hdhomerun_pkt_t tx_pkt; + struct hdhomerun_pkt_t rx_pkt; +}; + +static bool_t hdhomerun_discover_sock_create(struct hdhomerun_discover_t *ds, uint32_t local_ip, uint32_t subnet_mask) +{ + if (ds->sock_count >= HDHOMERUN_DISOCVER_MAX_SOCK_COUNT) { + return FALSE; + } + + /* Create socket. */ + int sock = (int)socket(AF_INET, SOCK_DGRAM, 0); + if (sock == -1) { + return FALSE; + } + + /* Set timeouts. */ + setsocktimeout(sock, SOL_SOCKET, SO_SNDTIMEO, 1000); + setsocktimeout(sock, SOL_SOCKET, SO_RCVTIMEO, 1000); + + /* Allow broadcast. */ + int sock_opt = 1; + setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&sock_opt, sizeof(sock_opt)); + + /* Bind socket. */ + struct sockaddr_in sock_addr; + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = htonl(local_ip); + sock_addr.sin_port = htons(0); + if (bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != 0) { + close(sock); + return FALSE; + } + + /* Write sock entry. */ + struct hdhomerun_discover_sock_t *dss = &ds->socks[ds->sock_count++]; + dss->sock = sock; + dss->local_ip = local_ip; + dss->subnet_mask = subnet_mask; + + return TRUE; +} + +#if defined(USE_IPHLPAPI) +static void hdhomerun_discover_sock_detect(struct hdhomerun_discover_t *ds) +{ + PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO)); + ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); + + DWORD Ret = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen); + if (Ret != NO_ERROR) { + free(pAdapterInfo); + if (Ret != ERROR_BUFFER_OVERFLOW) { + return; + } + pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen); + Ret = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen); + if (Ret != NO_ERROR) { + free(pAdapterInfo); + return; + } + } + + PIP_ADAPTER_INFO pAdapter = pAdapterInfo; + while (pAdapter) { + IP_ADDR_STRING *pIPAddr = &pAdapter->IpAddressList; + while (pIPAddr) { + uint32_t local_ip = ntohl(inet_addr(pIPAddr->IpAddress.String)); + uint32_t mask = ntohl(inet_addr(pIPAddr->IpMask.String)); + + if (local_ip == 0) { + pIPAddr = pIPAddr->Next; + continue; + } + + hdhomerun_discover_sock_create(ds, local_ip, mask); + pIPAddr = pIPAddr->Next; + } + + pAdapter = pAdapter->Next; + } + + free(pAdapterInfo); +} + +#else + +static void hdhomerun_discover_sock_detect(struct hdhomerun_discover_t *ds) +{ + int fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd == -1) { + return; + } + + struct ifconf ifc; + uint8_t buf[8192]; + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = (char *)buf; + + memset(buf, 0, sizeof(buf)); + + if (ioctl(fd, SIOCGIFCONF, &ifc) != 0) { + close(fd); + return; + } + + uint8_t *ptr = (uint8_t *)ifc.ifc_req; + uint8_t *end = (uint8_t *)&ifc.ifc_buf[ifc.ifc_len]; + + while (ptr <= end) { + struct ifreq *ifr = (struct ifreq *)ptr; + ptr += _SIZEOF_ADDR_IFREQ(*ifr); + + if (ioctl(fd, SIOCGIFADDR, ifr) != 0) { + continue; + } + struct sockaddr_in *addr_in = (struct sockaddr_in *)&(ifr->ifr_addr); + uint32_t local_ip = ntohl(addr_in->sin_addr.s_addr); + if (local_ip == 0) { + continue; + } + + if (ioctl(fd, SIOCGIFNETMASK, ifr) != 0) { + continue; + } + struct sockaddr_in *mask_in = (struct sockaddr_in *)&(ifr->ifr_addr); + uint32_t mask = ntohl(mask_in->sin_addr.s_addr); + + hdhomerun_discover_sock_create(ds, local_ip, mask); + } +} +#endif + +static struct hdhomerun_discover_t *hdhomerun_discover_create(void) +{ + struct hdhomerun_discover_t *ds = (struct hdhomerun_discover_t *)calloc(1, sizeof(struct hdhomerun_discover_t)); + if (!ds) { + return NULL; + } + + /* Create a routable socket. */ + if (!hdhomerun_discover_sock_create(ds, 0, 0)) { + free(ds); + return NULL; + } + + /* Detect & create local sockets. */ + hdhomerun_discover_sock_detect(ds); + + /* Success. */ + return ds; +} + +static void hdhomerun_discover_destroy(struct hdhomerun_discover_t *ds) +{ + unsigned int i; + for (i = 0; i < ds->sock_count; i++) { + struct hdhomerun_discover_sock_t *dss = &ds->socks[i]; + close(dss->sock); + } + + free(ds); +} + +static bool_t hdhomerun_discover_send_internal(struct hdhomerun_discover_t *ds, struct hdhomerun_discover_sock_t *dss, uint32_t target_ip, uint32_t device_type, uint32_t device_id) +{ + struct hdhomerun_pkt_t *tx_pkt = &ds->tx_pkt; + hdhomerun_pkt_reset(tx_pkt); + + hdhomerun_pkt_write_u8(tx_pkt, HDHOMERUN_TAG_DEVICE_TYPE); + hdhomerun_pkt_write_var_length(tx_pkt, 4); + hdhomerun_pkt_write_u32(tx_pkt, device_type); + hdhomerun_pkt_write_u8(tx_pkt, HDHOMERUN_TAG_DEVICE_ID); + hdhomerun_pkt_write_var_length(tx_pkt, 4); + hdhomerun_pkt_write_u32(tx_pkt, device_id); + hdhomerun_pkt_seal_frame(tx_pkt, HDHOMERUN_TYPE_DISCOVER_REQ); + + struct sockaddr_in sock_addr; + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = htonl(target_ip); + sock_addr.sin_port = htons(HDHOMERUN_DISCOVER_UDP_PORT); + + int length = (int)(tx_pkt->end - tx_pkt->start); + if (sendto(dss->sock, (char *)tx_pkt->start, length, 0, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != length) { + return FALSE; + } + + return TRUE; +} + +static bool_t hdhomerun_discover_send_wildcard_ip(struct hdhomerun_discover_t *ds, uint32_t device_type, uint32_t device_id) +{ + bool_t result = FALSE; + + /* + * Send subnet broadcast using each local ip socket. + * This will work with multiple separate 169.254.x.x interfaces. + */ + unsigned int i; + for (i = 1; i < ds->sock_count; i++) { + struct hdhomerun_discover_sock_t *dss = &ds->socks[i]; + uint32_t target_ip = dss->local_ip | ~dss->subnet_mask; + result |= hdhomerun_discover_send_internal(ds, dss, target_ip, device_type, device_id); + } + + /* + * If no local ip sockets then fall back to sending a global broadcast letting the OS choose the interface. + */ + if (!result) { + struct hdhomerun_discover_sock_t *dss = &ds->socks[0]; + result = hdhomerun_discover_send_internal(ds, dss, 0xFFFFFFFF, device_type, device_id); + } + + return result; +} + +static bool_t hdhomerun_discover_send_target_ip(struct hdhomerun_discover_t *ds, uint32_t target_ip, uint32_t device_type, uint32_t device_id) +{ + bool_t result = FALSE; + + /* + * Send targeted packet from any local ip that is in the same subnet. + * This will work with multiple separate 169.254.x.x interfaces. + */ + unsigned int i; + for (i = 1; i < ds->sock_count; i++) { + struct hdhomerun_discover_sock_t *dss = &ds->socks[i]; + if ((target_ip & dss->subnet_mask) != (dss->local_ip & dss->subnet_mask)) { + continue; + } + + result |= hdhomerun_discover_send_internal(ds, dss, target_ip, device_type, device_id); + } + + /* + * If target IP does not match a local subnet then fall back to letting the OS choose the gateway interface. + */ + if (!result) { + struct hdhomerun_discover_sock_t *dss = &ds->socks[0]; + result = hdhomerun_discover_send_internal(ds, dss, target_ip, device_type, device_id); + } + + return result; +} + +static bool_t hdhomerun_discover_send(struct hdhomerun_discover_t *ds, uint32_t target_ip, uint32_t device_type, uint32_t device_id) +{ + if (target_ip != 0) { + return hdhomerun_discover_send_target_ip(ds, target_ip, device_type, device_id); + } + + return hdhomerun_discover_send_wildcard_ip(ds, device_type, device_id); +} + +static int hdhomerun_discover_recv_internal(struct hdhomerun_discover_t *ds, struct hdhomerun_discover_sock_t *dss, struct hdhomerun_discover_device_t *result) +{ + struct hdhomerun_pkt_t *rx_pkt = &ds->rx_pkt; + hdhomerun_pkt_reset(rx_pkt); + + struct sockaddr_in sock_addr; + memset(&sock_addr, 0, sizeof(sock_addr)); + socklen_t sockaddr_size = sizeof(sock_addr); + + int rx_length = recvfrom(dss->sock, (char *)rx_pkt->end, (int)(rx_pkt->limit - rx_pkt->end), 0, (struct sockaddr *)&sock_addr, &sockaddr_size); + if (rx_length <= 0) { + /* Don't return error - windows machine on VPN can sometimes cause a sock error here but otherwise works. */ + return 0; + } + rx_pkt->end += rx_length; + + uint16_t type; + if (hdhomerun_pkt_open_frame(rx_pkt, &type) <= 0) { + return 0; + } + if (type != HDHOMERUN_TYPE_DISCOVER_RPY) { + return 0; + } + + result->ip_addr = ntohl(sock_addr.sin_addr.s_addr); + result->device_type = 0; + result->device_id = 0; + + while (1) { + uint8_t tag; + size_t len; + uint8_t *next = hdhomerun_pkt_read_tlv(rx_pkt, &tag, &len); + if (!next) { + break; + } + + switch (tag) { + case HDHOMERUN_TAG_DEVICE_TYPE: + if (len != 4) { + break; + } + result->device_type = hdhomerun_pkt_read_u32(rx_pkt); + break; + + case HDHOMERUN_TAG_DEVICE_ID: + if (len != 4) { + break; + } + result->device_id = hdhomerun_pkt_read_u32(rx_pkt); + break; + + default: + break; + } + + rx_pkt->pos = next; + } + + return 1; +} + +static int hdhomerun_discover_recv(struct hdhomerun_discover_t *ds, struct hdhomerun_discover_device_t *result) +{ + struct timeval t; + t.tv_sec = 0; + t.tv_usec = 250000; + + fd_set readfds; + FD_ZERO(&readfds); + int max_sock = -1; + + unsigned int i; + for (i = 0; i < ds->sock_count; i++) { + struct hdhomerun_discover_sock_t *dss = &ds->socks[i]; + FD_SET(dss->sock, &readfds); + if (dss->sock > max_sock) { + max_sock = dss->sock; + } + } + + if (select(max_sock+1, &readfds, NULL, NULL, &t) < 0) { + return -1; + } + + for (i = 0; i < ds->sock_count; i++) { + struct hdhomerun_discover_sock_t *dss = &ds->socks[i]; + if (!FD_ISSET(dss->sock, &readfds)) { + continue; + } + + if (hdhomerun_discover_recv_internal(ds, dss, result) <= 0) { + continue; + } + + return 1; + } + + return 0; +} + +static struct hdhomerun_discover_device_t *hdhomerun_discover_find_in_list(struct hdhomerun_discover_device_t result_list[], int count, uint32_t ip_addr) +{ + int index; + for (index = 0; index < count; index++) { + struct hdhomerun_discover_device_t *result = &result_list[index]; + if (result->ip_addr == ip_addr) { + return result; + } + } + + return NULL; +} + +static int hdhomerun_discover_find_devices_internal(struct hdhomerun_discover_t *ds, uint32_t target_ip, uint32_t device_type, uint32_t device_id, struct hdhomerun_discover_device_t result_list[], int max_count) +{ + int count = 0; + int attempt; + for (attempt = 0; attempt < 4; attempt++) { + if (!hdhomerun_discover_send(ds, target_ip, device_type, device_id)) { + return -1; + } + + uint64_t timeout = getcurrenttime() + 250; + while (getcurrenttime() < timeout) { + struct hdhomerun_discover_device_t *result = &result_list[count]; + + int ret = hdhomerun_discover_recv(ds, result); + if (ret < 0) { + return -1; + } + if (ret == 0) { + continue; + } + + /* Filter. */ + if (device_type != HDHOMERUN_DEVICE_TYPE_WILDCARD) { + if (device_type != result->device_type) { + continue; + } + } + if (device_id != HDHOMERUN_DEVICE_ID_WILDCARD) { + if (device_id != result->device_id) { + continue; + } + } + + /* Ensure not already in list. */ + if (hdhomerun_discover_find_in_list(result_list, count, result->ip_addr)) { + continue; + } + + /* Add to list. */ + count++; + if (count >= max_count) { + return count; + } + } + } + + return count; +} + +int hdhomerun_discover_find_devices_custom(uint32_t target_ip, uint32_t device_type, uint32_t device_id, struct hdhomerun_discover_device_t result_list[], int max_count) +{ + struct hdhomerun_discover_t *ds = hdhomerun_discover_create(); + if (!ds) { + return -1; + } + + int ret = hdhomerun_discover_find_devices_internal(ds, target_ip, device_type, device_id, result_list, max_count); + + hdhomerun_discover_destroy(ds); + return ret; +} + +bool_t hdhomerun_discover_validate_device_id(uint32_t device_id) +{ + static uint32_t lookup_table[16] = {0xA, 0x5, 0xF, 0x6, 0x7, 0xC, 0x1, 0xB, 0x9, 0x2, 0x8, 0xD, 0x4, 0x3, 0xE, 0x0}; + + uint32_t checksum = 0; + + checksum ^= lookup_table[(device_id >> 28) & 0x0F]; + checksum ^= (device_id >> 24) & 0x0F; + checksum ^= lookup_table[(device_id >> 20) & 0x0F]; + checksum ^= (device_id >> 16) & 0x0F; + checksum ^= lookup_table[(device_id >> 12) & 0x0F]; + checksum ^= (device_id >> 8) & 0x0F; + checksum ^= lookup_table[(device_id >> 4) & 0x0F]; + checksum ^= (device_id >> 0) & 0x0F; + + return (checksum == 0); +} + diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_discover.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_discover.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_discover.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_discover.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,69 @@ +/* + * hdhomerun_discover.h + * + * Copyright © 2006-2007 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ +#ifdef __cplusplus +extern "C" { +#endif + +struct hdhomerun_discover_device_t { + uint32_t ip_addr; + uint32_t device_type; + uint32_t device_id; +}; + +/* + * Find devices. + * + * The device information is stored in caller-supplied array of hdhomerun_discover_device_t vars. + * Multiple attempts are made to find devices. + * Execution time is 1 second. + * + * Set target_ip to zero to auto-detect IP address. + * + * Returns the number of devices found. + * Retruns -1 on error. + */ +extern LIBTYPE int hdhomerun_discover_find_devices_custom(uint32_t target_ip, uint32_t device_type, uint32_t device_id, struct hdhomerun_discover_device_t result_list[], int max_count); + +/* + * Verify that the device ID given is valid. + * + * The device ID contains a self-check sequence that detects common user input errors including + * single-digit errors and two digit transposition errors. + * + * Returns TRUE if valid. + * Returns FALSE if not valid. + */ +extern LIBTYPE bool_t hdhomerun_discover_validate_device_id(uint32_t device_id); + +#ifdef __cplusplus +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * hdhomerun.h + * + * Copyright © 2006-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#include "hdhomerun_os.h" +#include "hdhomerun_types.h" +#include "hdhomerun_pkt.h" +#include "hdhomerun_debug.h" +#include "hdhomerun_discover.h" +#include "hdhomerun_control.h" +#include "hdhomerun_video.h" +#include "hdhomerun_channels.h" +#include "hdhomerun_channelscan.h" +#include "hdhomerun_device.h" diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_os.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_os.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_os.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_os.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,49 @@ +/* + * hdhomerun_os.h + * + * Copyright © 2006-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#if defined(_WIN32) || defined(_WIN64) +#define __WINDOWS__ +#endif + +#if defined(__WINDOWS__) +#include "hdhomerun_os_windows.h" +#else +#include "hdhomerun_os_posix.h" +#endif + +#if !defined(TRUE) +#define TRUE 1 +#endif + +#if !defined(FALSE) +#define FALSE 0 +#endif diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_os_posix.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_os_posix.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_os_posix.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_os_posix.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,88 @@ +/* + * hdhomerun_os_posix.h + * + * Copyright © 2006-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#define _FILE_OFFSET_BITS 64 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(__ANDROID__) +#include +#else +#include +#endif +#include +#include +#include +#include + +typedef int bool_t; + +#define LIBTYPE +#define sock_getlasterror errno +#define sock_getlasterror_socktimeout (errno == EAGAIN) +#define console_vprintf vprintf +#define console_printf printf +#define THREAD_FUNC_PREFIX void * + +static inline int msleep(unsigned int ms) +{ + usleep(ms * 1000); + return 0; +} + +static inline uint64_t getcurrenttime(void) +{ + struct timeval t; + gettimeofday(&t, NULL); + return ((uint64_t)t.tv_sec * 1000) + (t.tv_usec / 1000); +} + +static inline int setsocktimeout(int s, int level, int optname, uint64_t timeout) +{ + struct timeval t; + t.tv_sec = timeout / 1000; + t.tv_usec = (timeout % 1000) * 1000; + return setsockopt(s, level, optname, (char *)&t, sizeof(t)); +} + +#define min(a,b) (((a)<(b))?(a):(b)) +#define max(a,b) (((a)>(b))?(a):(b)) + diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_os_windows.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_os_windows.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_os_windows.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_os_windows.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,183 @@ +/* + * hdhomerun_os_windows.h + * + * Copyright © 2006-2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#define _WINSOCKAPI_ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __MINGW__ +extern +int WSAAPI getaddrinfo( + const char *nodename, + const char *servname, + const struct addrinfo *hints, + struct addrinfo **res +); + +extern +void WSAAPI freeaddrinfo( + struct addrinfo *ai +); +#else +#include +#endif + + +#if defined(DLL_EXPORT) +#define LIBTYPE __declspec( dllexport ) +#elif defined(DLL_IMPORT) +#define LIBTYPE __declspec( dllimport ) +#else +#define LIBTYPE +#endif + +typedef int bool_t; +typedef signed __int8 int8_t; +typedef signed __int16 int16_t; +typedef signed __int32 int32_t; +typedef signed __int64 int64_t; +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +typedef HANDLE pthread_t; +typedef HANDLE pthread_mutex_t; + +#define socklen_t int +#define close closesocket +#define sock_getlasterror WSAGetLastError() +#define sock_getlasterror_socktimeout (WSAGetLastError() == WSAETIMEDOUT) +#ifndef va_copy +#define va_copy(x, y) x = y +#endif +#define atoll _atoi64 +#define strdup _strdup +#ifndef strcasecmp +#define strcasecmp _stricmp +#endif +#define snprintf _snprintf +#define fseeko _fseeki64 +#define ftello _ftelli64 +#define THREAD_FUNC_PREFIX DWORD WINAPI +#define SIGPIPE SIGABRT + +static inline int msleep(unsigned int ms) +{ + Sleep(ms); + return 0; +} + +static inline int sleep(unsigned int sec) +{ + Sleep(sec * 1000); + return 0; +} + +static inline uint64_t getcurrenttime(void) +{ + struct timeb tb; + ftime(&tb); + return ((uint64_t)tb.time * 1000) + tb.millitm; +} + +static inline int setsocktimeout(int s, int level, int optname, uint64_t timeout) +{ + int t = (int)timeout; + return setsockopt(s, level, optname, (char *)&t, sizeof(t)); +} + +static inline int pthread_create(pthread_t *tid, void *attr, LPTHREAD_START_ROUTINE start, void *arg) +{ + *tid = CreateThread(NULL, 0, start, arg, 0, NULL); + if (!*tid) { + return (int)GetLastError(); + } + return 0; +} + +static inline int pthread_join(pthread_t tid, void **value_ptr) +{ + while (1) { + DWORD ExitCode = 0; + if (!GetExitCodeThread(tid, &ExitCode)) { + return (int)GetLastError(); + } + if (ExitCode != STILL_ACTIVE) { + return 0; + } + } +} + +static inline void pthread_mutex_init(pthread_mutex_t *mutex, void *attr) +{ + *mutex = CreateMutex(NULL, FALSE, NULL); +} + +static inline void pthread_mutex_lock(pthread_mutex_t *mutex) +{ + WaitForSingleObject(*mutex, INFINITE); +} + +static inline void pthread_mutex_unlock(pthread_mutex_t *mutex) +{ + ReleaseMutex(*mutex); +} + +/* + * The console output format should be set to UTF-8, however in XP and Vista this breaks batch file processing. + * Attempting to restore on exit fails to restore if the program is terminated by the user. + * Solution - set the output format each printf. + */ +static inline void console_vprintf(const char *fmt, va_list ap) +{ + UINT cp = GetConsoleOutputCP(); + SetConsoleOutputCP(CP_UTF8); + vprintf(fmt, ap); + SetConsoleOutputCP(cp); +} + +static inline void console_printf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + console_vprintf(fmt, ap); + va_end(ap); +} diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_pkt.c kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_pkt.c --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_pkt.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_pkt.c 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,245 @@ +/* + * hdhomerun_pkt.c + * + * Copyright © 2005-2006 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#include "hdhomerun.h" + +struct hdhomerun_pkt_t *hdhomerun_pkt_create(void) +{ + struct hdhomerun_pkt_t *pkt = (struct hdhomerun_pkt_t *)calloc(1, sizeof(struct hdhomerun_pkt_t)); + if (!pkt) { + return NULL; + } + + hdhomerun_pkt_reset(pkt); + + return pkt; +} + +void hdhomerun_pkt_destroy(struct hdhomerun_pkt_t *pkt) +{ + free(pkt); +} + +void hdhomerun_pkt_reset(struct hdhomerun_pkt_t *pkt) +{ + pkt->limit = pkt->buffer + sizeof(pkt->buffer) - 4; + pkt->start = pkt->buffer + 1024; + pkt->end = pkt->start; + pkt->pos = pkt->start; +} + +static uint32_t hdhomerun_pkt_calc_crc(uint8_t *start, uint8_t *end) +{ + uint8_t *pos = start; + uint32_t crc = 0xFFFFFFFF; + while (pos < end) { + uint8_t x = (uint8_t)(crc) ^ *pos++; + crc >>= 8; + if (x & 0x01) crc ^= 0x77073096; + if (x & 0x02) crc ^= 0xEE0E612C; + if (x & 0x04) crc ^= 0x076DC419; + if (x & 0x08) crc ^= 0x0EDB8832; + if (x & 0x10) crc ^= 0x1DB71064; + if (x & 0x20) crc ^= 0x3B6E20C8; + if (x & 0x40) crc ^= 0x76DC4190; + if (x & 0x80) crc ^= 0xEDB88320; + } + return crc ^ 0xFFFFFFFF; +} + +uint8_t hdhomerun_pkt_read_u8(struct hdhomerun_pkt_t *pkt) +{ + uint8_t v = *pkt->pos++; + return v; +} + +uint16_t hdhomerun_pkt_read_u16(struct hdhomerun_pkt_t *pkt) +{ + uint16_t v; + v = (uint16_t)*pkt->pos++ << 8; + v |= (uint16_t)*pkt->pos++ << 0; + return v; +} + +uint32_t hdhomerun_pkt_read_u32(struct hdhomerun_pkt_t *pkt) +{ + uint32_t v; + v = (uint32_t)*pkt->pos++ << 24; + v |= (uint32_t)*pkt->pos++ << 16; + v |= (uint32_t)*pkt->pos++ << 8; + v |= (uint32_t)*pkt->pos++ << 0; + return v; +} + +size_t hdhomerun_pkt_read_var_length(struct hdhomerun_pkt_t *pkt) +{ + size_t length; + + if (pkt->pos + 1 > pkt->end) { + return (size_t)-1; + } + + length = (size_t)*pkt->pos++; + if (length & 0x0080) { + if (pkt->pos + 1 > pkt->end) { + return (size_t)-1; + } + + length &= 0x007F; + length |= (size_t)*pkt->pos++ << 7; + } + + return length; +} + +uint8_t *hdhomerun_pkt_read_tlv(struct hdhomerun_pkt_t *pkt, uint8_t *ptag, size_t *plength) +{ + if (pkt->pos + 2 > pkt->end) { + return NULL; + } + + *ptag = hdhomerun_pkt_read_u8(pkt); + *plength = hdhomerun_pkt_read_var_length(pkt); + + if (pkt->pos + *plength > pkt->end) { + return NULL; + } + + return pkt->pos + *plength; +} + +void hdhomerun_pkt_write_u8(struct hdhomerun_pkt_t *pkt, uint8_t v) +{ + *pkt->pos++ = v; + + if (pkt->pos > pkt->end) { + pkt->end = pkt->pos; + } +} + +void hdhomerun_pkt_write_u16(struct hdhomerun_pkt_t *pkt, uint16_t v) +{ + *pkt->pos++ = (uint8_t)(v >> 8); + *pkt->pos++ = (uint8_t)(v >> 0); + + if (pkt->pos > pkt->end) { + pkt->end = pkt->pos; + } +} + +void hdhomerun_pkt_write_u32(struct hdhomerun_pkt_t *pkt, uint32_t v) +{ + *pkt->pos++ = (uint8_t)(v >> 24); + *pkt->pos++ = (uint8_t)(v >> 16); + *pkt->pos++ = (uint8_t)(v >> 8); + *pkt->pos++ = (uint8_t)(v >> 0); + + if (pkt->pos > pkt->end) { + pkt->end = pkt->pos; + } +} + +void hdhomerun_pkt_write_var_length(struct hdhomerun_pkt_t *pkt, size_t v) +{ + if (v <= 127) { + *pkt->pos++ = (uint8_t)v; + } else { + *pkt->pos++ = (uint8_t)(v | 0x80); + *pkt->pos++ = (uint8_t)(v >> 7); + } + + if (pkt->pos > pkt->end) { + pkt->end = pkt->pos; + } +} + +void hdhomerun_pkt_write_mem(struct hdhomerun_pkt_t *pkt, const void *mem, size_t length) +{ + memcpy(pkt->pos, mem, length); + pkt->pos += length; + + if (pkt->pos > pkt->end) { + pkt->end = pkt->pos; + } +} + +int hdhomerun_pkt_open_frame(struct hdhomerun_pkt_t *pkt, uint16_t *ptype) +{ + pkt->pos = pkt->start; + + if (pkt->pos + 4 > pkt->end) { + return 0; + } + + *ptype = hdhomerun_pkt_read_u16(pkt); + size_t length = hdhomerun_pkt_read_u16(pkt); + pkt->pos += length; + + if (pkt->pos + 4 > pkt->end) { + pkt->pos = pkt->start; + return 0; + } + + uint32_t calc_crc = hdhomerun_pkt_calc_crc(pkt->start, pkt->pos); + + uint32_t packet_crc; + packet_crc = (uint32_t)*pkt->pos++ << 0; + packet_crc |= (uint32_t)*pkt->pos++ << 8; + packet_crc |= (uint32_t)*pkt->pos++ << 16; + packet_crc |= (uint32_t)*pkt->pos++ << 24; + if (calc_crc != packet_crc) { + return -1; + } + + pkt->start += 4; + pkt->end = pkt->start + length; + pkt->pos = pkt->start; + return 1; +} + +void hdhomerun_pkt_seal_frame(struct hdhomerun_pkt_t *pkt, uint16_t frame_type) +{ + size_t length = pkt->end - pkt->start; + + pkt->start -= 4; + pkt->pos = pkt->start; + hdhomerun_pkt_write_u16(pkt, frame_type); + hdhomerun_pkt_write_u16(pkt, (uint16_t)length); + + uint32_t crc = hdhomerun_pkt_calc_crc(pkt->start, pkt->end); + *pkt->end++ = (uint8_t)(crc >> 0); + *pkt->end++ = (uint8_t)(crc >> 8); + *pkt->end++ = (uint8_t)(crc >> 16); + *pkt->end++ = (uint8_t)(crc >> 24); + + pkt->pos = pkt->start; +} diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_pkt.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_pkt.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_pkt.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_pkt.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,177 @@ +/* + * hdhomerun_pkt.h + * + * Copyright © 2005-2006 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The discover protocol (UDP port 65001) and control protocol (TCP port 65001) + * both use the same packet based format: + * uint16_t Packet type + * uint16_t Payload length (bytes) + * uint8_t[] Payload data (0-n bytes). + * uint32_t CRC (Ethernet style 32-bit CRC) + * + * All variables are big-endian except for the crc which is little-endian. + * + * Valid values for the packet type are listed below as defines prefixed + * with "HDHOMERUN_TYPE_" + * + * Discovery: + * + * The payload for a discovery request or reply is a simple sequence of + * tag-length-value data: + * uint8_t Tag + * varlen Length + * uint8_t[] Value (0-n bytes) + * + * The length field can be one or two bytes long. + * For a length <= 127 bytes the length is expressed as a single byte. The + * most-significant-bit is clear indicating a single-byte length. + * For a length >= 128 bytes the length is expressed as a sequence of two bytes as follows: + * The first byte is contains the least-significant 7-bits of the length. The + * most-significant bit is then set (add 0x80) to indicate that it is a two byte length. + * The second byte contains the length shifted down 7 bits. + * + * A discovery request packet has a packet type of HDHOMERUN_TYPE_DISCOVER_REQ and should + * contain two tags: HDHOMERUN_TAG_DEVICE_TYPE and HDHOMERUN_TAG_DEVICE_ID. + * The HDHOMERUN_TAG_DEVICE_TYPE value should be set to HDHOMERUN_DEVICE_TYPE_TUNER. + * The HDHOMERUN_TAG_DEVICE_ID value should be set to HDHOMERUN_DEVICE_ID_WILDCARD to match + * all devices, or to the 32-bit device id number to match a single device. + * + * The discovery response packet has a packet type of HDHOMERUN_TYPE_DISCOVER_RPY and has the + * same format as the discovery request packet with the two tags: HDHOMERUN_TAG_DEVICE_TYPE and + * HDHOMERUN_TAG_DEVICE_ID. In the future additional tags may also be returned - unknown tags + * should be skipped and not treated as an error. + * + * Control get/set: + * + * The payload for a control get/set request is a simple sequence of tag-length-value data + * following the same format as for discover packets. + * + * A get request packet has a packet type of HDHOMERUN_TYPE_GETSET_REQ and should contain + * the tag: HDHOMERUN_TAG_GETSET_NAME. The HDHOMERUN_TAG_GETSET_NAME value should be a sequence + * of bytes forming a null-terminated string, including the NULL. The TLV length must include + * the NULL character so the length field should be set to strlen(str) + 1. + * + * A set request packet has a packet type of HDHOMERUN_TYPE_GETSET_REQ (same as a get request) + * and should contain two tags: HDHOMERUN_TAG_GETSET_NAME and HDHOMERUN_TAG_GETSET_VALUE. + * The HDHOMERUN_TAG_GETSET_NAME value should be a sequence of bytes forming a null-terminated + * string, including the NULL. + * The HDHOMERUN_TAG_GETSET_VALUE value should be a sequence of bytes forming a null-terminated + * string, including the NULL. + * + * The get and set reply packets have the packet type HDHOMERUN_TYPE_GETSET_RPY and have the same + * format as the set request packet with the two tags: HDHOMERUN_TAG_GETSET_NAME and + * HDHOMERUN_TAG_GETSET_VALUE. A set request is also implicit get request so the updated value is + * returned. + * + * If the device encounters an error handling the get or set request then the get/set reply packet + * will contain the tag HDHOMERUN_TAG_ERROR_MESSAGE. The format of the value is a sequence of + * bytes forming a null-terminated string, including the NULL. + * + * In the future additional tags may also be returned - unknown tags should be skipped and not + * treated as an error. + * + * Security note: The application should not rely on the NULL character being present. The + * application should write a NULL character based on the TLV length to protect the application + * from a potential attack. + * + * Firmware Upgrade: + * + * A firmware upgrade packet has a packet type of HDHOMERUN_TYPE_UPGRADE_REQ and has a fixed format: + * uint32_t Position in bytes from start of file. + * uint8_t[256] Firmware data (256 bytes) + * + * The data must be uploaded in 256 byte chunks and must be uploaded in order. + * The position number is in bytes so will increment by 256 each time. + * + * When all data is uploaded it should be signaled complete by sending another packet of type + * HDHOMERUN_TYPE_UPGRADE_REQ with payload of a single uint32_t with the value 0xFFFFFFFF. + */ + +#define HDHOMERUN_DISCOVER_UDP_PORT 65001 +#define HDHOMERUN_CONTROL_TCP_PORT 65001 + +#define HDHOMERUN_MAX_PACKET_SIZE 1460 +#define HDHOMERUN_MAX_PAYLOAD_SIZE 1452 + +#define HDHOMERUN_TYPE_DISCOVER_REQ 0x0002 +#define HDHOMERUN_TYPE_DISCOVER_RPY 0x0003 +#define HDHOMERUN_TYPE_GETSET_REQ 0x0004 +#define HDHOMERUN_TYPE_GETSET_RPY 0x0005 +#define HDHOMERUN_TYPE_UPGRADE_REQ 0x0006 +#define HDHOMERUN_TYPE_UPGRADE_RPY 0x0007 + +#define HDHOMERUN_TAG_DEVICE_TYPE 0x01 +#define HDHOMERUN_TAG_DEVICE_ID 0x02 +#define HDHOMERUN_TAG_GETSET_NAME 0x03 +#define HDHOMERUN_TAG_GETSET_VALUE 0x04 +#define HDHOMERUN_TAG_GETSET_LOCKKEY 0x15 +#define HDHOMERUN_TAG_ERROR_MESSAGE 0x05 + +#define HDHOMERUN_DEVICE_TYPE_WILDCARD 0xFFFFFFFF +#define HDHOMERUN_DEVICE_TYPE_TUNER 0x00000001 +#define HDHOMERUN_DEVICE_ID_WILDCARD 0xFFFFFFFF + +#define HDHOMERUN_MIN_PEEK_LENGTH 4 + +struct hdhomerun_pkt_t { + uint8_t *pos; + uint8_t *start; + uint8_t *end; + uint8_t *limit; + uint8_t buffer[3074]; +}; + +extern LIBTYPE struct hdhomerun_pkt_t *hdhomerun_pkt_create(void); +extern LIBTYPE void hdhomerun_pkt_destroy(struct hdhomerun_pkt_t *pkt); +extern LIBTYPE void hdhomerun_pkt_reset(struct hdhomerun_pkt_t *pkt); + +extern LIBTYPE uint8_t hdhomerun_pkt_read_u8(struct hdhomerun_pkt_t *pkt); +extern LIBTYPE uint16_t hdhomerun_pkt_read_u16(struct hdhomerun_pkt_t *pkt); +extern LIBTYPE uint32_t hdhomerun_pkt_read_u32(struct hdhomerun_pkt_t *pkt); +extern LIBTYPE size_t hdhomerun_pkt_read_var_length(struct hdhomerun_pkt_t *pkt); +extern LIBTYPE uint8_t *hdhomerun_pkt_read_tlv(struct hdhomerun_pkt_t *pkt, uint8_t *ptag, size_t *plength); + +extern LIBTYPE void hdhomerun_pkt_write_u8(struct hdhomerun_pkt_t *pkt, uint8_t v); +extern LIBTYPE void hdhomerun_pkt_write_u16(struct hdhomerun_pkt_t *pkt, uint16_t v); +extern LIBTYPE void hdhomerun_pkt_write_u32(struct hdhomerun_pkt_t *pkt, uint32_t v); +extern LIBTYPE void hdhomerun_pkt_write_var_length(struct hdhomerun_pkt_t *pkt, size_t v); +extern LIBTYPE void hdhomerun_pkt_write_mem(struct hdhomerun_pkt_t *pkt, const void *mem, size_t length); + +extern LIBTYPE bool_t hdhomerun_pkt_open_frame(struct hdhomerun_pkt_t *pkt, uint16_t *ptype); +extern LIBTYPE void hdhomerun_pkt_seal_frame(struct hdhomerun_pkt_t *pkt, uint16_t frame_type); + +#ifdef __cplusplus +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_types.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_types.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_types.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_types.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,72 @@ +/* + * hdhomerun_types.h + * + * Copyright © 2008 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +struct hdhomerun_device_t; + +struct hdhomerun_tuner_status_t { + char channel[32]; + char lock_str[32]; + bool_t signal_present; + bool_t lock_supported; + bool_t lock_unsupported; + unsigned int signal_strength; + unsigned int signal_to_noise_quality; + unsigned int symbol_error_quality; + uint32_t raw_bits_per_second; + uint32_t packets_per_second; +}; + +struct hdhomerun_channelscan_program_t { + char program_str[64]; + uint16_t program_number; + uint16_t virtual_major; + uint16_t virtual_minor; + uint16_t type; + char name[32]; +}; + +#define HDHOMERUN_CHANNELSCAN_MAX_PROGRAM_COUNT 64 + +struct hdhomerun_channelscan_result_t { + char channel_str[64]; + uint32_t channelmap; + uint32_t frequency; + struct hdhomerun_tuner_status_t status; + int program_count; + struct hdhomerun_channelscan_program_t programs[HDHOMERUN_CHANNELSCAN_MAX_PROGRAM_COUNT]; + uint32_t pat_crc; +}; + +struct hdhomerun_plotsample_t { + int16_t real; + int16_t imag; +}; diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_video.c kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_video.c --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_video.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_video.c 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,372 @@ +/* + * hdhomerun_video.c + * + * Copyright © 2006 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +#include "hdhomerun.h" + +struct hdhomerun_video_sock_t { + pthread_mutex_t lock; + uint8_t *buffer; + size_t buffer_size; + volatile size_t head; + volatile size_t tail; + size_t advance; + volatile bool_t terminate; + pthread_t thread; + int sock; + uint32_t rtp_sequence; + struct hdhomerun_debug_t *dbg; + volatile uint32_t packet_count; + volatile uint32_t transport_error_count; + volatile uint32_t network_error_count; + volatile uint32_t sequence_error_count; + volatile uint32_t overflow_error_count; + volatile uint8_t sequence[0x2000]; +}; + +static THREAD_FUNC_PREFIX hdhomerun_video_thread_execute(void *arg); + +struct hdhomerun_video_sock_t *hdhomerun_video_create(uint16_t listen_port, size_t buffer_size, struct hdhomerun_debug_t *dbg) +{ + /* Create object. */ + struct hdhomerun_video_sock_t *vs = (struct hdhomerun_video_sock_t *)calloc(1, sizeof(struct hdhomerun_video_sock_t)); + if (!vs) { + hdhomerun_debug_printf(dbg, "hdhomerun_video_create: failed to allocate video object\n"); + return NULL; + } + + vs->dbg = dbg; + vs->sock = -1; + pthread_mutex_init(&vs->lock, NULL); + + /* Reset sequence tracking. */ + hdhomerun_video_flush(vs); + + /* Buffer size. */ + vs->buffer_size = (buffer_size / VIDEO_DATA_PACKET_SIZE) * VIDEO_DATA_PACKET_SIZE; + if (vs->buffer_size == 0) { + hdhomerun_debug_printf(dbg, "hdhomerun_video_create: invalid buffer size (%lu bytes)\n", (unsigned long)buffer_size); + goto error; + } + vs->buffer_size += VIDEO_DATA_PACKET_SIZE; + + /* Create buffer. */ + vs->buffer = (uint8_t *)malloc(vs->buffer_size); + if (!vs->buffer) { + hdhomerun_debug_printf(dbg, "hdhomerun_video_create: failed to allocate buffer (%lu bytes)\n", (unsigned long)vs->buffer_size); + goto error; + } + + /* Create socket. */ + vs->sock = (int)socket(AF_INET, SOCK_DGRAM, 0); + if (vs->sock == -1) { + hdhomerun_debug_printf(dbg, "hdhomerun_video_create: failed to allocate socket\n"); + goto error; + } + + /* Expand socket buffer size. */ + int rx_size = 1024 * 1024; + setsockopt(vs->sock, SOL_SOCKET, SO_RCVBUF, (char *)&rx_size, sizeof(rx_size)); + + /* Set timeouts. */ + setsocktimeout(vs->sock, SOL_SOCKET, SO_SNDTIMEO, 1000); + setsocktimeout(vs->sock, SOL_SOCKET, SO_RCVTIMEO, 1000); + + /* Bind socket. */ + struct sockaddr_in sock_addr; + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); + sock_addr.sin_port = htons(listen_port); + if (bind(vs->sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) != 0) { + hdhomerun_debug_printf(dbg, "hdhomerun_video_create: failed to bind socket (port %u)\n", listen_port); + goto error; + } + + /* Start thread. */ + if (pthread_create(&vs->thread, NULL, &hdhomerun_video_thread_execute, vs) != 0) { + hdhomerun_debug_printf(dbg, "hdhomerun_video_create: failed to start thread\n"); + goto error; + } + + /* Success. */ + return vs; + +error: + if (vs->sock != -1) { + close(vs->sock); + } + if (vs->buffer) { + free(vs->buffer); + } + free(vs); + return NULL; +} + +void hdhomerun_video_destroy(struct hdhomerun_video_sock_t *vs) +{ + vs->terminate = TRUE; + pthread_join(vs->thread, NULL); + + close(vs->sock); + free(vs->buffer); + + free(vs); +} + +uint16_t hdhomerun_video_get_local_port(struct hdhomerun_video_sock_t *vs) +{ + struct sockaddr_in sock_addr; + socklen_t sockaddr_size = sizeof(sock_addr); + if (getsockname(vs->sock, (struct sockaddr*)&sock_addr, &sockaddr_size) != 0) { + hdhomerun_debug_printf(vs->dbg, "hdhomerun_video_get_local_port: getsockname failed (%d)\n", sock_getlasterror); + return 0; + } + + return ntohs(sock_addr.sin_port); +} + +static void hdhomerun_video_stats_ts_pkt(struct hdhomerun_video_sock_t *vs, uint8_t *ptr) +{ + uint16_t packet_identifier = ((uint16_t)(ptr[1] & 0x1F) << 8) | (uint16_t)ptr[2]; + if (packet_identifier == 0x1FFF) { + return; + } + + bool_t transport_error = ptr[1] >> 7; + if (transport_error) { + vs->transport_error_count++; + vs->sequence[packet_identifier] = 0xFF; + return; + } + + uint8_t continuity_counter = ptr[3] & 0x0F; + uint8_t previous_sequence = vs->sequence[packet_identifier]; + + if (continuity_counter == ((previous_sequence + 1) & 0x0F)) { + vs->sequence[packet_identifier] = continuity_counter; + return; + } + if (previous_sequence == 0xFF) { + vs->sequence[packet_identifier] = continuity_counter; + return; + } + if (continuity_counter == previous_sequence) { + return; + } + + vs->sequence_error_count++; + vs->sequence[packet_identifier] = continuity_counter; +} + +static void hdhomerun_video_parse_rtp(struct hdhomerun_video_sock_t *vs, struct hdhomerun_pkt_t *pkt) +{ + pkt->pos += 2; + uint32_t rtp_sequence = hdhomerun_pkt_read_u16(pkt); + pkt->pos += 8; + + if (rtp_sequence != ((vs->rtp_sequence + 1) & 0xFFFF)) { + if (vs->rtp_sequence != 0xFFFFFFFF) { + vs->network_error_count++; + + /* restart pid sequence check */ + memset((void *)vs->sequence, 0xFF, sizeof(vs->sequence)); + } + } + + vs->rtp_sequence = rtp_sequence; +} + +static THREAD_FUNC_PREFIX hdhomerun_video_thread_execute(void *arg) +{ + struct hdhomerun_video_sock_t *vs = (struct hdhomerun_video_sock_t *)arg; + struct hdhomerun_pkt_t pkt_inst; + + while (!vs->terminate) { + struct hdhomerun_pkt_t *pkt = &pkt_inst; + hdhomerun_pkt_reset(pkt); + + /* Receive. */ + int length = recv(vs->sock, (char *)pkt->end, VIDEO_RTP_DATA_PACKET_SIZE, 0); + pkt->end += length; + + if (length == VIDEO_RTP_DATA_PACKET_SIZE) { + hdhomerun_video_parse_rtp(vs, pkt); + length = (int)(pkt->end - pkt->pos); + } + + if (length != VIDEO_DATA_PACKET_SIZE) { + if (length > 0) { + /* Data received but not valid - ignore. */ + continue; + } + if (sock_getlasterror_socktimeout) { + /* Wait for more data. */ + continue; + } + vs->terminate = TRUE; + return NULL; + } + + pthread_mutex_lock(&vs->lock); + + /* Store in ring buffer. */ + size_t head = vs->head; + uint8_t *ptr = vs->buffer + head; + memcpy(ptr, pkt->pos, length); + + /* Stats. */ + vs->packet_count++; + hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 0); + hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 1); + hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 2); + hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 3); + hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 4); + hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 5); + hdhomerun_video_stats_ts_pkt(vs, ptr + TS_PACKET_SIZE * 6); + + /* Calculate new head. */ + head += length; + if (head >= vs->buffer_size) { + head -= vs->buffer_size; + } + + /* Check for buffer overflow. */ + if (head == vs->tail) { + vs->overflow_error_count++; + pthread_mutex_unlock(&vs->lock); + continue; + } + + /* Atomic update. */ + vs->head = head; + + pthread_mutex_unlock(&vs->lock); + } + + return NULL; +} + +uint8_t *hdhomerun_video_recv(struct hdhomerun_video_sock_t *vs, size_t max_size, size_t *pactual_size) +{ + pthread_mutex_lock(&vs->lock); + + size_t head = vs->head; + size_t tail = vs->tail; + + if (vs->advance > 0) { + tail += vs->advance; + if (tail >= vs->buffer_size) { + tail -= vs->buffer_size; + } + + /* Atomic update. */ + vs->tail = tail; + } + + if (head == tail) { + vs->advance = 0; + *pactual_size = 0; + pthread_mutex_unlock(&vs->lock); + return NULL; + } + + size_t size = (max_size / VIDEO_DATA_PACKET_SIZE) * VIDEO_DATA_PACKET_SIZE; + if (size == 0) { + vs->advance = 0; + *pactual_size = 0; + pthread_mutex_unlock(&vs->lock); + return NULL; + } + + size_t avail; + if (head > tail) { + avail = head - tail; + } else { + avail = vs->buffer_size - tail; + } + if (size > avail) { + size = avail; + } + vs->advance = size; + *pactual_size = size; + uint8_t *result = vs->buffer + tail; + + pthread_mutex_unlock(&vs->lock); + return result; +} + +void hdhomerun_video_flush(struct hdhomerun_video_sock_t *vs) +{ + pthread_mutex_lock(&vs->lock); + + vs->tail = vs->head; + vs->advance = 0; + + memset((void *)vs->sequence, 0xFF, sizeof(vs->sequence)); + + vs->rtp_sequence = 0xFFFFFFFF; + + vs->packet_count = 0; + vs->transport_error_count = 0; + vs->network_error_count = 0; + vs->sequence_error_count = 0; + vs->overflow_error_count = 0; + + pthread_mutex_unlock(&vs->lock); +} + +void hdhomerun_video_debug_print_stats(struct hdhomerun_video_sock_t *vs) +{ + struct hdhomerun_video_stats_t stats; + hdhomerun_video_get_stats(vs, &stats); + + hdhomerun_debug_printf(vs->dbg, "video sock: pkt=%ld net=%ld te=%ld miss=%ld drop=%ld\n", + stats.packet_count, stats.network_error_count, + stats.transport_error_count, stats.sequence_error_count, + stats.overflow_error_count + ); +} + +void hdhomerun_video_get_stats(struct hdhomerun_video_sock_t *vs, struct hdhomerun_video_stats_t *stats) +{ + memset(stats, 0, sizeof(struct hdhomerun_video_stats_t)); + + pthread_mutex_lock(&vs->lock); + + stats->packet_count = vs->packet_count; + stats->network_error_count = vs->network_error_count; + stats->transport_error_count = vs->transport_error_count; + stats->sequence_error_count = vs->sequence_error_count; + stats->overflow_error_count = vs->overflow_error_count; + + pthread_mutex_unlock(&vs->lock); +} diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_video.h kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_video.h --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/hdhomerun_video.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/hdhomerun_video.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,105 @@ +/* + * hdhomerun_video.h + * + * Copyright © 2006 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ +#ifdef __cplusplus +extern "C" { +#endif + +struct hdhomerun_video_sock_t; + +struct hdhomerun_video_stats_t { + uint32_t packet_count; + uint32_t network_error_count; + uint32_t transport_error_count; + uint32_t sequence_error_count; + uint32_t overflow_error_count; +}; + +#define TS_PACKET_SIZE 188 +#define VIDEO_DATA_PACKET_SIZE (188 * 7) +#define VIDEO_DATA_BUFFER_SIZE_1S (20000000 / 8) + +#define VIDEO_RTP_DATA_PACKET_SIZE ((188 * 7) + 12) + +/* + * Create a video/data socket. + * + * uint16_t listen_port: Port number to listen on. Set to 0 to auto-select. + * size_t buffer_size: Size of receive buffer. For 1 second of buffer use VIDEO_DATA_BUFFER_SIZE_1S. + * struct hdhomerun_debug_t *dbg: Pointer to debug logging object. May be NULL. + * + * Returns a pointer to the newly created control socket. + * + * When no longer needed, the socket should be destroyed by calling hdhomerun_control_destroy. + */ +extern LIBTYPE struct hdhomerun_video_sock_t *hdhomerun_video_create(uint16_t listen_port, size_t buffer_size, struct hdhomerun_debug_t *dbg); +extern LIBTYPE void hdhomerun_video_destroy(struct hdhomerun_video_sock_t *vs); + +/* + * Get the port the socket is listening on. + * + * Returns 16-bit port with native endianness, or 0 on error. + */ +extern LIBTYPE uint16_t hdhomerun_video_get_local_port(struct hdhomerun_video_sock_t *vs); + +/* + * Read data from buffer. + * + * size_t max_size: The maximum amount of data to be returned. + * size_t *pactual_size: The caller-supplied pactual_size value will be updated to contain the amount + * of data available to the caller. + * + * Returns a pointer to the data, or NULL if no data is available. + * The data will remain valid until another call to hdhomerun_video_recv. + * + * The amount of data returned will always be a multiple of VIDEO_DATA_PACKET_SIZE (1316). + * Attempting to read a single TS frame (188 bytes) will not return data as it is less than + * the minimum size. + * + * The buffer is implemented as a ring buffer. It is possible for this function to return a small + * amount of data when more is available due to the wrap-around case. + */ +extern LIBTYPE uint8_t *hdhomerun_video_recv(struct hdhomerun_video_sock_t *vs, size_t max_size, size_t *pactual_size); + +/* + * Flush the buffer. + */ +extern LIBTYPE void hdhomerun_video_flush(struct hdhomerun_video_sock_t *vs); + +/* + * Debug print internal stats. + */ +extern LIBTYPE void hdhomerun_video_debug_print_stats(struct hdhomerun_video_sock_t *vs); +extern LIBTYPE void hdhomerun_video_get_stats(struct hdhomerun_video_sock_t *vs, struct hdhomerun_video_stats_t *stats); + +#ifdef __cplusplus +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/lgpl.txt kodi-15.2~git20151019.1039-final/lib/libhdhomerun/lgpl.txt --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/lgpl.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/lgpl.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/Makefile.in kodi-15.2~git20151019.1039-final/lib/libhdhomerun/Makefile.in --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/Makefile.in 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +ARCH=@ARCH@ + +OBJS += hdhomerun_pkt.o +OBJS += hdhomerun_debug.o +OBJS += hdhomerun_discover.o +OBJS += hdhomerun_channels.o +OBJS += hdhomerun_channelscan.o +OBJS += hdhomerun_control.o +OBJS += hdhomerun_video.o +OBJS += hdhomerun_device.o + +CFLAGS += -Wall -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wpointer-arith -fPIC + +SLIBS += -lws2_32 +DEFINES += -D__MINGW__ + +SYSDIR=../../system +SO=hdhomerun-$(ARCH).so +SLIB=$(SYSDIR)/$(SO) + +$(SLIB): $(OBJS) +ifeq ($(findstring osx,$(ARCH)), osx) + $(CC) $(LDFLAGS) -Wl,-alias_list,@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper_mach_alias \ + -bundle -undefined dynamic_lookup -read_only_relocs suppress -o $@ \ + @abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o $(OBJS) +else + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -shared -o $@ -Wl,--unresolved-symbols=ignore-all -lm \ + `cat @abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.def` \ + @abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o +endif + +hdhomerun_dll : $(OBJS) + $(CC) $(CFLAGS) $(OBJS) $(SLIBS) -Wl,--out-implib,hdhomerun.lib -shared -o hdhomerun.dll + +hdhomerun_config hdhomerun_config.exe : $(OBJS) hdhomerun_config.o + $(CC) $(CFLAGS) $(OBJS) hdhomerun_config.o $(SLIBS) -lpthreadGC -liphlpapi -o $@ + +hdhomerun_mythconfig : $(LIBSRCS) hdhomerun_mythconfig.o + $(CC) $(CFLAGS) $(OBJS) hdhomerun_config.o $(SLIBS) -lpthreadGC -liphlpapi -lmysqlclient -o $@ + +include @abs_top_srcdir@/Makefile.include diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/Makefile.win32 kodi-15.2~git20151019.1039-final/lib/libhdhomerun/Makefile.win32 --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/Makefile.win32 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/Makefile.win32 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,26 @@ +ARCH=@ARCH@ + +OBJS += hdhomerun_pkt.o +OBJS += hdhomerun_debug.o +OBJS += hdhomerun_discover.o +OBJS += hdhomerun_channels.o +OBJS += hdhomerun_channelscan.o +OBJS += hdhomerun_control.o +OBJS += hdhomerun_video.o +OBJS += hdhomerun_device.o + +CFLAGS += -Wall -O2 -D__MINGW__ -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wpointer-arith +CC=gcc + +SLIBS += -lws2_32 -liphlpapi + +SYSDIR=../../../system +DLL=hdhomerun.dll +SLIB=$(SYSDIR)/$(DLL) + +hdhomerun_dll : $(OBJS) + gcc $(OBJS) $(SLIBS) -Wl,--out-implib,hdhomerun.lib -shared -o $(SLIB) + +clean : + rm $(OBJS) + rm hdhomerun.lib \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/libhdhomerun/README kodi-15.2~git20151019.1039-final/lib/libhdhomerun/README --- kodi-16.1~git20160425.1001-final/lib/libhdhomerun/README 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libhdhomerun/README 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +/* + * README + * + * Copyright 2005-2006 Silicondust Engineering Ltd. . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ + +Top level include file: hdhomerun.h + +Top level API: hdhomerun_device. See hdhomerun_device.h for documentation. + +The hdhomerun_device API should be used rather than the low level control and video APIs required with previous versions. + +Additional libraries required: +- pthread +- iphlpapi (windows only) diff -Nru kodi-16.1~git20160425.1001-final/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2008/ArraysTest1/ArraysTest1.vcproj kodi-15.2~git20151019.1039-final/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2008/ArraysTest1/ArraysTest1.vcproj --- kodi-16.1~git20160425.1001-final/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2008/ArraysTest1/ArraysTest1.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2008/ArraysTest1/ArraysTest1.vcproj 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/lib/libUPnP/patches/0036-platinum-add-xbmc-country-for-countries.patch kodi-15.2~git20151019.1039-final/lib/libUPnP/patches/0036-platinum-add-xbmc-country-for-countries.patch --- kodi-16.1~git20160425.1001-final/lib/libUPnP/patches/0036-platinum-add-xbmc-country-for-countries.patch 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libUPnP/patches/0036-platinum-add-xbmc-country-for-countries.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,103 +0,0 @@ -From 2f0e4019673a92b3c1e01fd2447bd05e7b231423 Mon Sep 17 00:00:00 2001 -From: montellese -Date: Sun, 8 Mar 2015 23:49:24 +0100 -Subject: [PATCH 1/3] platinum: add xbmc:country for countries - ---- - lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp | 2 ++ - lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h | 2 ++ - .../Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 11 +++++++++++ - .../Platinum/Source/Devices/MediaServer/PltMediaItem.h | 1 + - .../Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h | 2 +- - 5 files changed, 17 insertions(+), 1 deletion(-) - -diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp -index b58aa50..0f24ab3 100644 ---- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp -+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp -@@ -173,6 +173,8 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter) - mask |= PLT_FILTER_MASK_XBMC_ARTWORK; - } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER, len, true) == 0) { - mask |= PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER; -+ } else if (NPT_String::CompareN(s + i, PLT_FILTER_FIELD_XBMC_COUNTRY, len, true) == 0) { -+ mask |= PLT_FILTER_MASK_XBMC_COUNTRY; - } - - if (next_comma < 0) { -diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h -index fe1de45..49b92d0 100644 ---- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h -+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h -@@ -100,6 +100,7 @@ - #define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000400000000000) - #define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000800000000000) - #define PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER NPT_UINT64_C(0x0001000000000000) -+#define PLT_FILTER_MASK_XBMC_COUNTRY NPT_UINT64_C(0x0002000000000000) - - #define PLT_FILTER_FIELD_TITLE "dc:title" - #define PLT_FILTER_FIELD_CREATOR "dc:creator" -@@ -150,6 +151,7 @@ - #define PLT_FILTER_FIELD_XBMC_VOTES "xbmc:votes" - #define PLT_FILTER_FIELD_XBMC_ARTWORK "xbmc:artwork" - #define PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER "xbmc:uniqueidentifier" -+#define PLT_FILTER_FIELD_XBMC_COUNTRY "xbmc:country" - - extern const char* didl_header; - extern const char* didl_footer; -diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp -index f937df2..2e7d32b 100644 ---- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp -+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp -@@ -261,6 +261,7 @@ PLT_MediaObject::Reset() - m_XbmcInfo.votes = ""; - m_XbmcInfo.artwork.Clear(); - m_XbmcInfo.unique_identifier = ""; -+ m_XbmcInfo.countries.Clear(); - - m_Didl = ""; - -@@ -606,6 +607,16 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl) - didl += ""; - } - -+ // country -+ if (mask & PLT_FILTER_MASK_XBMC_COUNTRY) { -+ for (NPT_List::Iterator it = -+ m_XbmcInfo.countries.GetFirstItem(); it; ++it) { -+ didl += ""; -+ PLT_Didl::AppendXmlEscape(didl, (*it)); -+ didl += ""; -+ } -+ } -+ - // class is required - didl += " countries; - } PLT_XbmcInfo; - - typedef struct { -diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h -index 8fb23dd..9b25d58 100644 ---- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h -+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h -@@ -70,7 +70,7 @@ typedef struct PLT_CapabilitiesData { - typedef NPT_Reference PLT_CapabilitiesDataReference; - - // explicitely specify res otherwise WMP won't return a URL! --#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier" -+#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier,xbmc:country" - - /*---------------------------------------------------------------------- - | PLT_MediaContainerListener --- -1.9.5.msysgit.0 - diff -Nru kodi-16.1~git20160425.1001-final/lib/libUPnP/patches/0037-platinum-add-xbmc-userrating-for-user-ratings.patch kodi-15.2~git20151019.1039-final/lib/libUPnP/patches/0037-platinum-add-xbmc-userrating-for-user-ratings.patch --- kodi-16.1~git20160425.1001-final/lib/libUPnP/patches/0037-platinum-add-xbmc-userrating-for-user-ratings.patch 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libUPnP/patches/0037-platinum-add-xbmc-userrating-for-user-ratings.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,100 +0,0 @@ -From 6a10f12a22b3210beb18d09b11315cdd87a8c6eb Mon Sep 17 00:00:00 2001 -From: montellese -Date: Mon, 14 Sep 2015 08:40:15 +0200 -Subject: [PATCH 1/3] platinum: add xbmc:userrating for user ratings - ---- - lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp | 2 ++ - lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h | 2 ++ - lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 8 ++++++++ - lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h | 1 + - .../Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h | 2 +- - 5 files changed, 14 insertions(+), 1 deletion(-) - -diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp -index 0f24ab3..b1ba66f 100644 ---- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp -+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp -@@ -175,6 +175,8 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter) - mask |= PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER; - } else if (NPT_String::CompareN(s + i, PLT_FILTER_FIELD_XBMC_COUNTRY, len, true) == 0) { - mask |= PLT_FILTER_MASK_XBMC_COUNTRY; -+ } else if (NPT_String::CompareN(s + i, PLT_FILTER_FIELD_XBMC_USERRATING, len, true) == 0) { -+ mask |= PLT_FILTER_MASK_XBMC_USERRATING; - } - - if (next_comma < 0) { -diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h -index 49b92d0..1705f9c 100644 ---- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h -+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h -@@ -101,6 +101,7 @@ - #define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000800000000000) - #define PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER NPT_UINT64_C(0x0001000000000000) - #define PLT_FILTER_MASK_XBMC_COUNTRY NPT_UINT64_C(0x0002000000000000) -+#define PLT_FILTER_MASK_XBMC_USERRATING NPT_UINT64_C(0x0004000000000000) - - #define PLT_FILTER_FIELD_TITLE "dc:title" - #define PLT_FILTER_FIELD_CREATOR "dc:creator" -@@ -152,6 +153,7 @@ - #define PLT_FILTER_FIELD_XBMC_ARTWORK "xbmc:artwork" - #define PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER "xbmc:uniqueidentifier" - #define PLT_FILTER_FIELD_XBMC_COUNTRY "xbmc:country" -+#define PLT_FILTER_FIELD_XBMC_USERRATING "xbmc:userrating" - - extern const char* didl_header; - extern const char* didl_footer; -diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp -index 2e7d32b..01ef6e9 100644 ---- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp -+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp -@@ -262,6 +262,7 @@ PLT_MediaObject::Reset() - m_XbmcInfo.artwork.Clear(); - m_XbmcInfo.unique_identifier = ""; - m_XbmcInfo.countries.Clear(); -+ m_XbmcInfo.user_rating = 0; - - m_Didl = ""; - -@@ -617,6 +618,13 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl) - } - } - -+ // user rating -+ if (mask & PLT_FILTER_MASK_XBMC_USERRATING) { -+ didl += ""; -+ didl += NPT_String::FromInteger(m_XbmcInfo.user_rating); -+ didl += ""; -+ } -+ - // class is required - didl += " countries; -+ NPT_Int32 user_rating; - } PLT_XbmcInfo; - - typedef struct { -diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h -index 9b25d58..e52fb5a 100644 ---- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h -+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h -@@ -70,7 +70,7 @@ typedef struct PLT_CapabilitiesData { - typedef NPT_Reference PLT_CapabilitiesDataReference; - - // explicitely specify res otherwise WMP won't return a URL! --#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier,xbmc:country" -+#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier,xbmc:country,xbmc:userrating" - - /*---------------------------------------------------------------------- - | PLT_MediaContainerListener --- -1.9.5.msysgit.0 - diff -Nru kodi-16.1~git20160425.1001-final/lib/libUPnP/Platinum/Source/Core/PltDeviceData.cpp kodi-15.2~git20151019.1039-final/lib/libUPnP/Platinum/Source/Core/PltDeviceData.cpp --- kodi-16.1~git20160425.1001-final/lib/libUPnP/Platinum/Source/Core/PltDeviceData.cpp 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libUPnP/Platinum/Source/Core/PltDeviceData.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -57,8 +57,7 @@ m_DeviceType(device_type), m_FriendlyName(friendly_name), m_BootId(0), - m_NextBootId(0), - m_ConfigId(-1) + m_NextBootId(0) { if (uuid == NULL || strlen(uuid) == 0) { PLT_UPnPMessageHelper::GenerateGUID(m_UUID); diff -Nru kodi-16.1~git20160425.1001-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp kodi-15.2~git20151019.1039-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp --- kodi-16.1~git20160425.1001-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -173,10 +173,6 @@ mask |= PLT_FILTER_MASK_XBMC_ARTWORK; } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER, len, true) == 0) { mask |= PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER; - } else if (NPT_String::CompareN(s + i, PLT_FILTER_FIELD_XBMC_COUNTRY, len, true) == 0) { - mask |= PLT_FILTER_MASK_XBMC_COUNTRY; - } else if (NPT_String::CompareN(s + i, PLT_FILTER_FIELD_XBMC_USERRATING, len, true) == 0) { - mask |= PLT_FILTER_MASK_XBMC_USERRATING; } if (next_comma < 0) { diff -Nru kodi-16.1~git20160425.1001-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h kodi-15.2~git20151019.1039-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h --- kodi-16.1~git20160425.1001-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h 2015-10-19 08:39:15.000000000 +0000 @@ -100,8 +100,6 @@ #define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000400000000000) #define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000800000000000) #define PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER NPT_UINT64_C(0x0001000000000000) -#define PLT_FILTER_MASK_XBMC_COUNTRY NPT_UINT64_C(0x0002000000000000) -#define PLT_FILTER_MASK_XBMC_USERRATING NPT_UINT64_C(0x0004000000000000) #define PLT_FILTER_FIELD_TITLE "dc:title" #define PLT_FILTER_FIELD_CREATOR "dc:creator" @@ -152,8 +150,6 @@ #define PLT_FILTER_FIELD_XBMC_VOTES "xbmc:votes" #define PLT_FILTER_FIELD_XBMC_ARTWORK "xbmc:artwork" #define PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER "xbmc:uniqueidentifier" -#define PLT_FILTER_FIELD_XBMC_COUNTRY "xbmc:country" -#define PLT_FILTER_FIELD_XBMC_USERRATING "xbmc:userrating" extern const char* didl_header; extern const char* didl_footer; diff -Nru kodi-16.1~git20160425.1001-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp kodi-15.2~git20151019.1039-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp --- kodi-16.1~git20160425.1001-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp 2016-04-25 08:01:34.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -261,8 +261,6 @@ m_XbmcInfo.votes = ""; m_XbmcInfo.artwork.Clear(); m_XbmcInfo.unique_identifier = ""; - m_XbmcInfo.countries.Clear(); - m_XbmcInfo.user_rating = 0; m_Didl = ""; @@ -608,23 +606,6 @@ didl += ""; } - // country - if (mask & PLT_FILTER_MASK_XBMC_COUNTRY) { - for (NPT_List::Iterator it = - m_XbmcInfo.countries.GetFirstItem(); it; ++it) { - didl += ""; - PLT_Didl::AppendXmlEscape(didl, (*it)); - didl += ""; - } - } - - // user rating - if (mask & PLT_FILTER_MASK_XBMC_USERRATING) { - didl += ""; - didl += NPT_String::FromInteger(m_XbmcInfo.user_rating); - didl += ""; - } - // class is required didl += " countries; - NPT_Int32 user_rating; } PLT_XbmcInfo; typedef struct { diff -Nru kodi-16.1~git20160425.1001-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h kodi-15.2~git20151019.1039-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h --- kodi-16.1~git20160425.1001-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h 2015-10-19 08:39:15.000000000 +0000 @@ -70,7 +70,7 @@ typedef NPT_Reference PLT_CapabilitiesDataReference; // explicitely specify res otherwise WMP won't return a URL! -#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier,xbmc:country,xbmc:userrating" +#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier" /*---------------------------------------------------------------------- | PLT_MediaContainerListener diff -Nru kodi-16.1~git20160425.1001-final/lib/SlingboxLib/Makefile kodi-15.2~git20151019.1039-final/lib/SlingboxLib/Makefile --- kodi-16.1~git20160425.1001-final/lib/SlingboxLib/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/SlingboxLib/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,6 @@ +SRCS=SlingboxLib.cpp + +LIB=SlingboxLib.a + +include ../../Makefile.include +-include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS))) diff -Nru kodi-16.1~git20160425.1001-final/lib/SlingboxLib/patches/0001-Fix-alternative-CSlingbox-constructor.patch kodi-15.2~git20151019.1039-final/lib/SlingboxLib/patches/0001-Fix-alternative-CSlingbox-constructor.patch --- kodi-16.1~git20160425.1001-final/lib/SlingboxLib/patches/0001-Fix-alternative-CSlingbox-constructor.patch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/SlingboxLib/patches/0001-Fix-alternative-CSlingbox-constructor.patch 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,85 @@ +From 25c5ffe9eb2213fc18ab498320fbf9af79e1250d Mon Sep 17 00:00:00 2001 +From: Maks Naumov +Date: Mon, 25 Aug 2014 21:45:02 +0300 +Subject: [PATCH] SlingboxLib: Fix alternative CSlingbox constructor + +CSlingbox::CSlingbox(const char * szAddress, unsigned int uiPort /* = 5001 */) { + // Call default constructor + CSlingbox(); + ... +} + +"CSlingbox();" - object is created and immediately removed. +Therefore with CSlingbox(const char * szAddress, unsigned int uiPort /* = 5001 */) class members will not be initialized. +--- + lib/SlingboxLib/SlingboxLib.cpp | 32 +++++++++++++++++++------------- + lib/SlingboxLib/SlingboxLib.h | 1 + + 2 files changed, 20 insertions(+), 13 deletions(-) + +diff --git a/lib/SlingboxLib/SlingboxLib.cpp b/lib/SlingboxLib/SlingboxLib.cpp +index f2d7017..0632e6f 100644 +--- a/lib/SlingboxLib/SlingboxLib.cpp ++++ b/lib/SlingboxLib/SlingboxLib.cpp +@@ -41,24 +41,16 @@ typedef int socklen_t; + // Default constructor. + CSlingbox::CSlingbox() + { +- // Set all variables to default/invalid values +- m_socCommunication = INVALID_SOCKET; +- m_socStream = INVALID_SOCKET; +- memset(m_szAddress, 0, sizeof(m_szAddress)); +- m_uiPort = 0; +- m_usCode = 0; +- m_usSequence = 0; +- m_iChannel = -1; +- m_iInput = -1; +- memset(&m_receivedMessages, 0, sizeof(m_receivedMessages)); ++ // initialize all members ++ init(); + } + + // Alternative constructor used to set the address (IP or hostname) and port of the +-// Slingbox we want to connect to. If no port is specified default port 5001 is used. ++// Slingbox we want to connect to. If no port is specified default port 5001 is used. + CSlingbox::CSlingbox(const char * szAddress, unsigned int uiPort /* = 5001 */) + { +- // Call default constructor +- CSlingbox(); ++ // initialize all members ++ init(); + + // Set address and port variables to passed values + SetAddress(szAddress, uiPort); +@@ -74,6 +66,20 @@ CSlingbox::~CSlingbox() + CloseSocket(m_socCommunication); + } + ++// Function used to initialize class members ++void CSlingbox::init() ++{ ++ // Set all variables to default/invalid values ++ m_socCommunication = INVALID_SOCKET; ++ m_socStream = INVALID_SOCKET; ++ memset(m_szAddress, 0, sizeof(m_szAddress)); ++ m_uiPort = 0; ++ m_usCode = 0; ++ m_usSequence = 0; ++ m_iChannel = -1; ++ m_iInput = -1; ++ memset(&m_receivedMessages, 0, sizeof(m_receivedMessages)); ++} + // Function used to find a Slingbox. Address and port of found Slingbox can be + // retrieved with the GetAddress function afterwards. + bool CSlingbox::FindSlingbox(unsigned int uiTimeout /* = 10 */) +diff --git a/lib/SlingboxLib/SlingboxLib.h b/lib/SlingboxLib/SlingboxLib.h +index ad368f0..a8835bc 100644 +--- a/lib/SlingboxLib/SlingboxLib.h ++++ b/lib/SlingboxLib/SlingboxLib.h +@@ -91,6 +91,7 @@ class CSlingbox + bool SendIRCommand(uint8_t ucCommand); + + protected: ++ void init(); + // Function used to send and receive messages to and from the Slingbox + struct MessageHeader; + bool SendReceiveMessage(SOCKET socSocket, MessageHeader * pHeader, diff -Nru kodi-16.1~git20160425.1001-final/lib/SlingboxLib/SlingboxLib.cpp kodi-15.2~git20151019.1039-final/lib/SlingboxLib/SlingboxLib.cpp --- kodi-16.1~git20160425.1001-final/lib/SlingboxLib/SlingboxLib.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/SlingboxLib/SlingboxLib.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,992 @@ +// +// Copyright (C) 2010-2011 Stonyx +// http://www.stonyx.com +// +// This library is free software. You can redistribute it and/or modify it +// under the terms of the GNU General Public License Version 2 (or at your +// option any later version) as published by The Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// If you did not received a copy of the GNU General Public License along +// with this library see http://www.gnu.org/copyleft/gpl.html or write to +// The Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#include "SlingboxLib.h" + +#if defined _WIN32 || defined _WIN64 +#include +typedef int socklen_t; +#else +#include +#include +#include +#include +#include +#include +#include +#include +#define INVALID_SOCKET (SOCKET)(~0) +#define SOCKET_ERROR (-1) +#endif + +// ******************** +// Public Functions +// ******************** + +// Default constructor. +CSlingbox::CSlingbox() +{ + // initialize all members + init(); +} + +// Alternative constructor used to set the address (IP or hostname) and port of the +// Slingbox we want to connect to. If no port is specified default port 5001 is used. +CSlingbox::CSlingbox(const char * szAddress, unsigned int uiPort /* = 5001 */) +{ + // initialize all members + init(); + + // Set address and port variables to passed values + SetAddress(szAddress, uiPort); +} + +// Destructor. +CSlingbox::~CSlingbox() +{ + // Close all connections if they are still open + if (m_socStream != INVALID_SOCKET) + CloseSocket(m_socStream); + if (m_socCommunication != INVALID_SOCKET) + CloseSocket(m_socCommunication); +} + +// Function used to initialize class members +void CSlingbox::init() +{ + // Set all variables to default/invalid values + m_socCommunication = INVALID_SOCKET; + m_socStream = INVALID_SOCKET; + memset(m_szAddress, 0, sizeof(m_szAddress)); + m_uiPort = 0; + m_usCode = 0; + m_usSequence = 0; + m_iChannel = -1; + m_iInput = -1; + memset(&m_receivedMessages, 0, sizeof(m_receivedMessages)); +} +// Function used to find a Slingbox. Address and port of found Slingbox can be +// retrieved with the GetAddress function afterwards. +bool CSlingbox::FindSlingbox(unsigned int uiTimeout /* = 10 */) +{ + // Open a UDP connection + SOCKET socSocket = OpenSocket(NULL, 0, true); + if (socSocket != INVALID_SOCKET) + { + // Prepare and send data + uint32_t uiData[8]; + memset(uiData, 0, sizeof(uiData)); + uiData[0] = 0x00000101; + uiData[1] = 0x00000002; + if (Broadcast(socSocket, 5004, uiData, sizeof(uiData), uiTimeout) <= 0) + return false; + + // Reset address and port variables + memset(m_szAddress, 0, sizeof(m_szAddress)); + m_uiPort = 0; + + // Give the Slingbox time to respond + Wait(250); + + // Look for correct return message and properly set variables + if (!ReceiveMessage(socSocket, true, uiTimeout) || + !m_receivedMessages.bFindMessage || + strlen(m_szAddress) == 0 || m_uiPort == 0) + { + CloseSocket(socSocket); + return false; + } + + // Close socket + CloseSocket(socSocket); + } + else + { + return false; + } + + return true; +} + +// Function used to retrieve the address and port of a Slingbox found with the +// FindSlingbox function. +void CSlingbox::GetAddress(char * szAddress, unsigned int uiAddressLength, + unsigned int * uiPort) +{ + // Copy requested data into passed pointers + memset(szAddress, 0, uiAddressLength); + strncpy(szAddress, m_szAddress, uiAddressLength - 1); + *uiPort = m_uiPort; +} + +// Function used to set the address (IP or hostname) and port of the Slingbox we +// want to connect to. If no port is specified default port 5001 is used. +void CSlingbox::SetAddress(const char * szAddress, unsigned int uiPort /* = 5001 */) +{ + // Set address and port variables to passed values + strncpy(m_szAddress, szAddress, sizeof(m_szAddress) - 1); + m_uiPort = uiPort; +} + +// Function used to login into the Slingbox. +bool CSlingbox::Connect(bool bLoginAsAdmin, const char * szPassword) +{ + // Check if a communication connection is already open + if (m_socCommunication != INVALID_SOCKET) + return false; + +#if defined _WIN32 || defined _WIN64 + // Enable use of the Winsock DLL + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) + return false; +#endif + + // Open the communication connection + m_socCommunication = OpenSocket(m_szAddress, m_uiPort); + if (m_socCommunication == INVALID_SOCKET) + { +#if defined _WIN32 || defined _WIN64 + // Finish using the Winsock DLL + WSACleanup(); +#endif + + return false; + } + + // Prepare and send string + char * szString = "GET /stream.asf HTTP/1.1\r\nAccept: */*\r\n" + "Pragma: Sling-Connection-Type=Control, Session-Id=0\r\n\r\n"; + if (Send(m_socCommunication, (void *)szString, strlen(szString)) <= 0) + { + // Close the communication connection + CloseSocket(m_socCommunication); + m_socCommunication = INVALID_SOCKET; + +#if defined _WIN32 || defined _WIN64 + // Finish using the Winsock DLL + WSACleanup(); +#endif + + return false; + } + + // Invalidate variables + m_usCode = 0; + m_usSequence = 0; + m_iChannel = -1; + m_iInput = -1; + + // Prepare and send the connect message + ConnectMessage message(bLoginAsAdmin, szPassword); + if (!SendReceiveMessage(m_socCommunication, &message) || + !m_receivedMessages.bConnectMessage) + { + // Close the communication connection + CloseSocket(m_socCommunication); + m_socCommunication = INVALID_SOCKET; + +#if defined _WIN32 || defined _WIN64 + // Finish using the Winsock DLL + WSACleanup(); +#endif + + return false; + } + + // Check if we got a valid code + if (m_usCode == 0) + { + // Close the communication connection + CloseSocket(m_socCommunication); + m_socCommunication = INVALID_SOCKET; + +#if defined _WIN32 || defined _WIN64 + // Finish using the Winsock DLL + WSACleanup(); +#endif + + return false; + } + + return true; +} + +// Function used to send the initialization message and initialize the stream. +bool CSlingbox::InitializeStream() +{ + // Prepare and send start message + InitializationMessage message; + return SendReceiveMessage(m_socCommunication, &message) && + m_receivedMessages.bInitializationMessage; +} + +// Function used to set the stream settings. +bool CSlingbox::StreamSettings(Resolution eResolution /* = RESOLUTION320X240 */, + uint32_t uiVideoBitrate /* = 704 */, uint32_t uiFrameRate /* = 30 */, + uint32_t uiVideoSmoothing /* = 50 */, uint32_t uiAudioBitrate /* = 64 */, + uint32_t uiIFrameInterval /* = 10 */) +{ + // Check if a resolution was specified that requires encryption + if (eResolution == RESOLUTION320X480 || + eResolution == RESOLUTION640X240 || + eResolution == RESOLUTION640X480) + { + // Enable encryption to enable requested resolution + EncryptionMessage message; + if (!SendReceiveMessage(m_socCommunication, &message) || + !m_receivedMessages.bEncryptionMessage) + return false; + } + + // Create and send video message with all the stream details + SettingsMessage message(eResolution, uiVideoBitrate, uiFrameRate, uiVideoSmoothing, + uiAudioBitrate, uiIFrameInterval); + if (!SendReceiveMessage(m_socCommunication, &message) || + !m_receivedMessages.bSettingsMessage) + return false; + + // Give the Slingbox time to change settings + Wait(500); + + return true; +} + +// Function used to start the stream. +bool CSlingbox::StartStream() +{ + // Check if a stream connection is already open + if (m_socStream != INVALID_SOCKET) + return false; + + // Open a new connection + m_socStream = OpenSocket(m_szAddress, m_uiPort); + if (m_socStream != INVALID_SOCKET) + { + // Prepare and send string + char szString[128] = "GET /stream.asf HTTP/1.1\r\nAccept: */*\r\n" + "Pragma: Sling-Connection-Type=Stream, Session-Id="; + sprintf(&szString[strlen(szString)], "%u", m_usCode); + strcpy(&szString[strlen(szString)], "\r\n\r\n"); + if (Send(m_socStream, (void *)szString, strlen(szString)) <= 0) + { + // Close the stream connection + CloseSocket(m_socStream); + m_socStream = INVALID_SOCKET; + + return false; + } + + // Invalidate channel and input variables + m_iChannel = -1; + m_iInput = -1; + + // Give the Slingbox time to respond + Wait(250); + + // Check for correct return message + if (!ReceiveMessage(m_socCommunication) || + !(m_receivedMessages.bChannelStatusMessage || + m_receivedMessages.bInputStatusMessage)) + { + // Close the stream connection + CloseSocket(m_socStream); + m_socStream = INVALID_SOCKET; + + return false; + } + } + else + { + return false; + } + + return true; +} + +// Function used to read the stream. Returns number of bytes actually received +// or -1 if an error occured. +int CSlingbox::ReadStream(void * pBuffer, unsigned int uiSize) +{ + return Receive(m_socStream, pBuffer, uiSize); +} + +// Function used to stop the stream. +bool CSlingbox::StopStream() +{ + // Close the stream connection + bool bSuccess = CloseSocket(m_socStream); + m_socStream = INVALID_SOCKET; + + // Invalidate channel and input variables + m_iChannel = -1; + m_iInput = -1; + + return bSuccess; +} + +// Function used to disconnect from the Slingbox +bool CSlingbox::Disconnect() +{ + // Prepare variables + bool bSuccess = true; + + // Prepare and send the disconnect message + DisconnectMessage message; + if (!SendReceiveMessage(m_socCommunication, &message) || + !m_receivedMessages.bDisconnectMessage) + bSuccess = false; + + // Close the stream connection if it's still active + if (m_socStream != INVALID_SOCKET && !StopStream()) + bSuccess = false; + + // Close the communication connection + if (!CloseSocket(m_socCommunication)) + bSuccess = false; + m_socCommunication = INVALID_SOCKET; + +#if defined _WIN32 || defined _WIN64 + // Finish using the Winsock DLL + if (WSACleanup() != 0) + bSuccess = false; +#endif + + // Invalidate variables + m_usCode = 0; + m_usSequence = 0; + m_iChannel = -1; + m_iInput = -1; + + return bSuccess; +} + +// Function used to check if a connection to the Slingbox is active +bool CSlingbox::IsConnected() +{ + // Prepare and send status message + StatusMessage message; + return SendReceiveMessage(m_socCommunication, &message) && + m_receivedMessages.bStatusMessage; +} + +// Function used to change the channel up. +bool CSlingbox::ChannelUp() +{ + // Prepare and send channel message + ChannelMessage message; + message.Up(); + if (!SendMessage(m_socCommunication, &message)) + return false; + + // Invalidate channel variable + m_iChannel = -1; + + // Give the Slingbox time to change things + Wait(1000); + + // Check for return message + return ReceiveMessage(m_socCommunication) && + m_receivedMessages.bChannelMessage; +} + +// Function used to change the channel down. +bool CSlingbox::ChannelDown() +{ + // Prepare and send channel message + ChannelMessage message; + message.Down(); + if (!SendMessage(m_socCommunication, &message)) + return false; + + // Invalidate channel variable + m_iChannel = -1; + + // Give the Slingbox time to change things + Wait(1000); + + // Check for return message + return ReceiveMessage(m_socCommunication) && + m_receivedMessages.bChannelMessage; +} + +// Function used to set the channel. +bool CSlingbox::SetChannel(unsigned int uiChannel) +{ + // Prepare and send channel message + ChannelMessage message(uiChannel); + if (!SendMessage(m_socCommunication, &message)) + return false; + + // Invalidate channel variable + m_iChannel = -1; + + // Give the Slingbox time to change things + Wait(1000); + + // Check for return message + return ReceiveMessage(m_socCommunication) && + m_receivedMessages.bChannelMessage; +} + +// Function used to set the input. +bool CSlingbox::SetInput(unsigned int uiInput) +{ + // Prepare and send input message + InputMessage message(uiInput); + if (!SendMessage(m_socCommunication, &message)) + return false; + + // Invalidate input variable + m_iInput = -1; + + // Give the Slingbox time to change things + Wait(1000); + + // Check for return message + return ReceiveMessage(m_socCommunication) && + m_receivedMessages.bInputMessage; +} + +// Function used to get the current channel. Returns -1 if valid data is not +// available. +int CSlingbox::GetChannel() +{ + return m_iChannel; +} + +// Function used to get the current input. Returns -1 if valid data is not +// available. +int CSlingbox::GetInput() +{ + return m_iInput; +} + +// Function used to send IR commands. +bool CSlingbox::SendIRCommand(uint8_t ucCode) +{ + // Prepare and send IR message + IRMessage message(ucCode); + if (!SendMessage(m_socCommunication, &message)) + return false; + + // Give the Slingbox time to send command + Wait(1000); + + // Check for return message + return ReceiveMessage(m_socCommunication) && + m_receivedMessages.bIRMessage; +} + +// ******************** +// Protected Functions +// ******************** + +// Function used to send a message and receive messages. +bool CSlingbox::SendReceiveMessage(SOCKET socSocket, MessageHeader * pHeader, + bool bEncrypt /* = true */, unsigned int uiTimeout /* = 10 */) +{ + // Send message + if (!SendMessage(socSocket, pHeader, bEncrypt, uiTimeout)) + return false; + + // Give the Slingbox time to respond + Wait(250); + + // Receive messages + if (!ReceiveMessage(socSocket, false, uiTimeout)) + return false; + + return true; +} + +// Function used to send a messages to the Slingbox. +bool CSlingbox::SendMessage(SOCKET socSocket, MessageHeader * pHeader, + bool bEncode /* = true */, unsigned int uiTimeout /* = 10 */) +{ + // Set message code and sequence numbers + pHeader->m_usCode = m_usCode; + pHeader->m_usSequence = m_usSequence; + m_usSequence++; + + // Check if we need to encode the data from the message + if (bEncode) + { + void* pPointer = ((uint8_t *)pHeader) + sizeof(MessageHeader); + Encode(pPointer, pHeader->m_usSize); + pHeader->m_usEncoded = 0x2000; + } + + // Send the message + if (Send(socSocket, pHeader, sizeof(MessageHeader) + + pHeader->m_usSize, uiTimeout) <= 0) + return false; + + return true; +} + +// Function used to receive messages from the Slingbox and process them. +bool CSlingbox::ReceiveMessage(SOCKET socSocket, bool bUDPMessage /* = false */, + unsigned int uiTimeout /* = 10 */) +{ + // Prepare variables + bool bMessageReceived = false; + int iReceived; + int iProcessed = 0; + uint8_t ucBuffer[1024]; + sockaddr sSocketAddress; + memset(&sSocketAddress, 0, sizeof(sSocketAddress)); + + // Reset received messages struct + memset(&m_receivedMessages, 0, sizeof(m_receivedMessages)); + + // Get the data + if (bUDPMessage) + { + iReceived = ReceiveFrom(socSocket, ucBuffer, sizeof(ucBuffer), uiTimeout, + &sSocketAddress); + } + else + { + iReceived = Receive(socSocket, ucBuffer, sizeof(ucBuffer), uiTimeout); + } + + // Check for errors + if (iReceived == SOCKET_ERROR) + return false; + + // Loop until we've processed all received data + while (iProcessed < iReceived) + { + // Prepare pointer + MessageHeader * pHeader = (MessageHeader *)(ucBuffer + iProcessed); + + // Make sure it's a message and we got enough data to work with + if (pHeader->m_usHeader == 0x0101 && (iReceived - iProcessed) >= + (int)(sizeof(MessageHeader) + pHeader->m_usSize)) + { + // Signal that we've recevied a message + bMessageReceived = true; + + // Decode the message data + if (pHeader->m_usEncoded == 0x2000) + { + Decode((uint8_t *)pHeader + sizeof(MessageHeader), pHeader->m_usSize); + pHeader->m_usEncoded = 0x0000; + } + + // Find message + if (pHeader->m_usMessageID == 0x0002 && pHeader->m_usSize == 0x005C) + { + m_receivedMessages.bFindMessage = true; + + // Remove the port information from the structure received from ReceiveFrom + if (sSocketAddress.sa_family == AF_INET) + ((sockaddr_in *)&sSocketAddress)->sin_port = 0; + else if (sSocketAddress.sa_family == AF_INET6) + ((sockaddr_in6 *)&sSocketAddress)->sin6_port = 0; + + // Convert the address received from ReceiveFrom to a string +#if defined _WIN32 || defined _WIN64 + unsigned long ulSizeOfAddress = sizeof(m_szAddress); + WSAAddressToString(&sSocketAddress, sizeof(sSocketAddress), NULL, + m_szAddress, &ulSizeOfAddress); +#else + socklen_t iSizeOfAddress = sizeof(m_szAddress); + if (sSocketAddress.sa_family == AF_INET) + inet_ntop(sSocketAddress.sa_family, + &((sockaddr_in *)&sSocketAddress)->sin_addr, m_szAddress, iSizeOfAddress); + else if (sSocketAddress.sa_family == AF_INET6) + inet_ntop(sSocketAddress.sa_family, + &((sockaddr_in6 *)&sSocketAddress)->sin6_addr, m_szAddress, iSizeOfAddress); +#endif + + // Get the port information from the received data + m_uiPort = ucBuffer[120] + (ucBuffer[121] << 8); + } + // Connect message + else if (pHeader->m_usMessageID == 0x0067 && pHeader->m_usSize == 0x0008) + { + m_receivedMessages.bConnectMessage = true; + + m_usCode = pHeader->m_usCode; + } + // Initialization message + else if (pHeader->m_usMessageID == 0x007E) + { + m_receivedMessages.bInitializationMessage = true; + } + // Encryption message + else if (pHeader->m_usMessageID == 0x00A6) + { + m_receivedMessages.bEncryptionMessage = true; + } + // Settings message + else if (pHeader->m_usMessageID == 0x00B5) + { + m_receivedMessages.bSettingsMessage = true; + } + // Disconnect message + else if (pHeader->m_usMessageID == 0x0068) + { + m_receivedMessages.bDisconnectMessage = true; + } + // Status message + else if (pHeader->m_usMessageID == 0x0065 && pHeader->m_usSize == 0x0000) + { + m_receivedMessages.bStatusMessage = true; + } + // Channel message + else if (pHeader->m_usMessageID == 0x0089) + { + m_receivedMessages.bChannelMessage = true; + } + // Channel status massage + else if (pHeader->m_usMessageID == 0x0065 && pHeader->m_usSize == 0x0078) + { + m_receivedMessages.bChannelStatusMessage = true; + + m_iChannel = *(uint16_t *)((uint8_t *)pHeader + sizeof(MessageHeader)); + } + // Input message + else if (pHeader->m_usMessageID == 0x0085) + { + m_receivedMessages.bInputMessage = true; + } + // Input status message + else if (pHeader->m_usMessageID == 0x0065 && pHeader->m_usSize == 0x0008) + { + m_receivedMessages.bInputStatusMessage = true; + + m_iInput = *((uint8_t *)pHeader + sizeof(MessageHeader)); + } + // IR message + else if (pHeader->m_usMessageID == 0x0087) + { + m_receivedMessages.bIRMessage = true; + } + + // Increase our counter + iProcessed += sizeof(MessageHeader) + pHeader->m_usSize; + } + else + { + return bMessageReceived; + } + } + + return bMessageReceived; +} + +// Function used to encode data being send to the Slingbox. +void CSlingbox::Encode(void * pData, unsigned int iSize) +{ + for (unsigned int i = 0; i < iSize; i += 8) + { + // Prepare variables + const uint32_t ulKey[] = {0xBCDEAAAA, 0x87FBBBBA, 0x7CCCCFFA, 0xDDDDAABC}; + uint32_t ulVar1 = ((uint32_t *)&((uint8_t *)pData)[i])[0]; + uint32_t ulVar2 = ((uint32_t *)&((uint8_t *)pData)[i])[1]; + uint32_t ulVar3 = 0; + + // Encode + for (unsigned int j = 0; j < 32; j++) + { + ulVar3 -= 0x61C88647; + ulVar1 += ((ulVar2 >> 5) + ulKey[1]) ^ ((ulVar2 << 4) + ulKey[0]) ^ (ulVar3 + + ulVar2); + ulVar2 += ((ulVar1 >> 5) + ulKey[3]) ^ ((ulVar1 << 4) + ulKey[2]) ^ (ulVar3 + + ulVar1); + } + + // Finish up + ((uint32_t *)&((uint8_t *)pData)[i])[0] = ulVar1; + ((uint32_t *)&((uint8_t *)pData)[i])[1] = ulVar2; + } +} + +// Function used to decode data being received from the Slingbox. +void CSlingbox::Decode(void * pData, unsigned int iSize) +{ + for (unsigned int i = 0 ; i < iSize; i += 8 ) + { + // Prepare variables + const uint32_t ulKey[] = {0xBCDEAAAA, 0x87FBBBBA, 0x7CCCCFFA, 0xDDDDAABC}; + uint32_t ulVar1 = ((uint32_t *)&((uint8_t *)pData)[i])[0]; + uint32_t ulVar2 = ((uint32_t *)&((uint8_t *)pData)[i])[1]; + uint32_t ulVar3 = 0xC6EF3720; + + // Decode + for (unsigned int j = 0; j < 32; j++) + { + ulVar2 -= ((ulVar1 >> 5) + ulKey[3]) ^ ((ulVar1 << 4) + ulKey[2]) ^ (ulVar3 + + ulVar1); + ulVar1 -= ((ulVar2 >> 5) + ulKey[1]) ^ ((ulVar2 << 4) + ulKey[0]) ^ (ulVar3 + + ulVar2); + ulVar3 += 0x61C88647; + } + + // Finish up + ((uint32_t *)&((uint8_t *)pData)[i])[0] = ulVar1; + ((uint32_t *)&((uint8_t *)pData)[i])[1] = ulVar2; + } +} + +// Function used to open a new socket. +SOCKET CSlingbox::OpenSocket(const char * szAddress, unsigned int uiPort, + bool bUDP /* = false */) +{ + // Prepare needed variables + SOCKET socSocket = INVALID_SOCKET; + struct addrinfo * pAddressInfo; + struct addrinfo addressInfoHints; + struct addrinfo * pPointer; + memset(&addressInfoHints, 0, sizeof(addressInfoHints)); + addressInfoHints.ai_family = bUDP ? AF_INET : AF_UNSPEC; + addressInfoHints.ai_socktype = bUDP ? SOCK_DGRAM : SOCK_STREAM; + addressInfoHints.ai_protocol = bUDP ? IPPROTO_UDP : IPPROTO_TCP; + addressInfoHints.ai_flags = bUDP ? AI_PASSIVE : 0; + char szPort[32]; + sprintf(szPort, "%u", uiPort); + + // Get address info + if (getaddrinfo(szAddress, szPort, &addressInfoHints, &pAddressInfo) != 0) + return INVALID_SOCKET; + + // Loop thru all the received address info + for (pPointer = pAddressInfo; pPointer != NULL; pPointer = pPointer->ai_next) + { + // Open a new socket + socSocket = socket(pPointer->ai_family, pPointer->ai_socktype, + pPointer->ai_protocol); + if (socSocket != INVALID_SOCKET) + { + // Bind if we're using UDP + if (bUDP) + { + if (bind(socSocket, pAddressInfo->ai_addr, pAddressInfo->ai_addrlen) == 0) + { + break; + } + else + { + CloseSocket(socSocket); + socSocket = INVALID_SOCKET; + } + } + // Open a new connection if we're using TCP + else + { + if (connect(socSocket, pAddressInfo->ai_addr, pAddressInfo->ai_addrlen) == 0) + { + break; + } + else + { + CloseSocket(socSocket); + socSocket = INVALID_SOCKET; + } + } + } + } + + // Free variables + freeaddrinfo(pAddressInfo); + + return socSocket; +} + +// Function used to broadcast data to the local subnet. Returns the number of bytes +// actually sent or -1 if an error occured. +int CSlingbox::Broadcast(SOCKET socSocket, unsigned int uiPort, void * pBuffer, + unsigned int uiSize, unsigned int uiTimeout /* = 10 */) +{ + // Enable broadcasting +#if defined _WIN32 || defined _WIN64 + char vBroadcast = '1'; +#else + int vBroadcast = 1; +#endif + if (setsockopt(socSocket, SOL_SOCKET, SO_BROADCAST, &vBroadcast, + sizeof(vBroadcast)) != 0) + return SOCKET_ERROR; + + // Prepare variable + struct sockaddr sSocketAddress; + memset(&sSocketAddress, 0, sizeof(sSocketAddress)); + ((sockaddr_in *)&sSocketAddress)->sin_family = AF_INET; +#if defined _WIN32 || defined _WIN64 + ((sockaddr_in *)&sSocketAddress)->sin_addr.S_un.S_addr = htonl(0xFFFFFFFF); +#else + ((sockaddr_in *)&sSocketAddress)->sin_addr.s_addr = htonl(0xFFFFFFFF); +#endif + ((sockaddr_in *)&sSocketAddress)->sin_port = htons(uiPort); + + // Send the data + return SendTo(socSocket, pBuffer, uiSize, uiTimeout, &sSocketAddress); +} + +// Function used to send data. Returns the number of bytes actually sent +// or -1 if an error occured. +int CSlingbox::Send(SOCKET socSocket, void * pBuffer, unsigned int uiSize, + unsigned int uiTimeout /* = 10 */) +{ + // Prepare variables + int iFDS = socSocket + 1; + fd_set sendFDS; + FD_ZERO(&sendFDS); + FD_SET(socSocket, &sendFDS); + timeval timeOut; + timeOut.tv_sec = uiTimeout; + timeOut.tv_usec = 0; + int iResult; + unsigned int uiBytesSent = 0; + unsigned int uiBytesLeft = uiSize; + + // Loop until all data is sent + while (uiBytesSent < uiSize) + { + // Send the data once the socket is ready + if (select(iFDS, NULL, &sendFDS, NULL, &timeOut) > 0) + iResult = send(socSocket, (const char *)pBuffer + uiBytesSent, uiBytesLeft, 0); + else + return uiBytesSent; + + // Check for any errors + if (iResult == SOCKET_ERROR) + return SOCKET_ERROR; + + // Adjust variables + uiBytesSent += iResult; + uiBytesLeft -= iResult; + } + + return uiBytesSent; +} + +// Function used to send data to a specific address. Returns the number of bytes +// actually sent or -1 if an error occured. +int CSlingbox::SendTo(SOCKET socSocket, void * pBuffer, unsigned int uiSize, + unsigned int uiTimeout, struct sockaddr * pSocketAddress) +{ + // Prepare variables + int iFDS = socSocket + 1; + fd_set sendFDS; + FD_ZERO(&sendFDS); + FD_SET(socSocket, &sendFDS); + timeval timeOut; + timeOut.tv_sec = uiTimeout; + timeOut.tv_usec = 0; + int iResult; + unsigned int uiBytesSent = 0; + unsigned int uiBytesLeft = uiSize; + + // Loop until all data is sent + while (uiBytesSent < uiSize) + { + // Send the data once the socket is ready + if (select(iFDS, NULL, &sendFDS, NULL, &timeOut) > 0) + iResult = sendto(socSocket, (const char *)pBuffer + uiBytesSent, uiBytesLeft, 0, + pSocketAddress, sizeof(*pSocketAddress)); + else + return uiBytesSent; + + // Check for any errors + if (iResult == SOCKET_ERROR) + return SOCKET_ERROR; + + // Adjust variables + uiBytesSent += iResult; + uiBytesLeft -= iResult; + } + + return uiBytesSent; +} + +// Function used to receive data. Returns the number of bytes actually received +// or -1 if an error occured. +int CSlingbox::Receive(SOCKET socSocket, void * pBuffer, unsigned int uiSize, + unsigned int uiTimeout /* = 10 */) +{ + // Prepare needed variables + int iFDS = socSocket + 1; + fd_set readFDS; + FD_ZERO(&readFDS); + FD_SET(socSocket, &readFDS); + timeval timeValue; + timeValue.tv_sec = uiTimeout; + timeValue.tv_usec = 0; + + // Do the actual receiving of data after waiting for socket to be readable + if (select(iFDS, &readFDS, NULL, NULL, &timeValue) > 0) + return recv(socSocket, (char *)pBuffer, uiSize, 0); + else + return 0; +} + +// Function used to receive data and tell us from where. Returns the number of bytes +// actually received or -1 if an error occured. If successful, populates the +// pSocketAddress variable with details of where the data was received from. +int CSlingbox::ReceiveFrom(SOCKET socSocket, void * pBuffer, unsigned int uiSize, + unsigned int uiTimeout, struct sockaddr * pSocketAddress) +{ + // Prepare needed variables + int iFDS = socSocket + 1; + fd_set readFDS; + FD_ZERO(&readFDS); + FD_SET(socSocket, &readFDS); + timeval timeValue; + timeValue.tv_sec = uiTimeout; + timeValue.tv_usec = 0; + socklen_t iSizeOfAddress = sizeof(*pSocketAddress); + + // Do the actual receiving of data after waiting for socket to be readable + if (select(iFDS, &readFDS, NULL, NULL, &timeValue) > 0) + return recvfrom(socSocket, (char *)pBuffer, uiSize, 0, pSocketAddress, + &iSizeOfAddress); + else + return 0; +} + +// Function used to close a socket connection. +bool CSlingbox::CloseSocket(SOCKET socSocket) +{ +#if defined _WIN32 || defined _WIN64 + if (closesocket(socSocket) != 0) + return false; +#else + if (close(socSocket) != 0) + return false; +#endif + + return true; +} + +// Function used to wait on the Slingbox for various reasons +void CSlingbox::Wait(unsigned int uiMilliseconds) +{ +#if defined _WIN32 || defined _WIN64 + Sleep(uiMilliseconds); +#else + struct timespec time; + time.tv_sec = uiMilliseconds / 1000; + time.tv_nsec = (uiMilliseconds % 1000) * 1000000; + while (nanosleep(&time, &time) == -1 && errno == EINTR && + (time.tv_sec > 0 || time.tv_nsec > 0)); +#endif +} diff -Nru kodi-16.1~git20160425.1001-final/lib/SlingboxLib/SlingboxLib.h kodi-15.2~git20151019.1039-final/lib/SlingboxLib/SlingboxLib.h --- kodi-16.1~git20160425.1001-final/lib/SlingboxLib/SlingboxLib.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/SlingboxLib/SlingboxLib.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,409 @@ +// +// Copyright (C) 2010-2011 Stonyx +// http://www.stonyx.com +// +// This library is free software. You can redistribute it and/or modify it +// under the terms of the GNU General Public License Version 2 (or at your +// option any later version) as published by The Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// If you did not received a copy of the GNU General Public License along +// with this library see http://www.gnu.org/copyleft/gpl.html or write to +// The Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#include +#include + +#if defined _WIN32 || defined _WIN64 +#include +#elif !defined SOCKET +typedef int SOCKET; +#endif + +class CSlingbox +{ +public: + // Enum that represents all the possible Slingbox resolutions + enum Resolution + { + NOVIDEO = 0x00000000, + RESOLUTION128X96 = 0x00000008, + RESOLUTION160X120 = 0x00000002, + RESOLUTION176X120 = 0x00000004, + RESOLUTION224X176 = 0x00000009, + RESOLUTION256X192 = 0x0000000B, + RESOLUTION320X240 = 0x00000001, + RESOLUTION352X240 = 0x00000003, + RESOLUTION320X480 = 0x00000007, + RESOLUTION640X240 = 0x00000006, + RESOLUTION640X480 = 0x00000005 + }; + + // Constructors and destructors + CSlingbox(); + CSlingbox(const char * szAddress, unsigned int uiPort = 5001); + ~CSlingbox(); + + // Following function can be called instead of the SetAddress function and is used to + // find a Slingbox instead of manually setting address and port information + bool FindSlingbox(unsigned int uiTimeout = 10); + + // Function used to retrive information about a found Slingbox + void GetAddress(char * szAddress, unsigned int uiAddressLength, unsigned int * uiPort); + + // Following public functions are listed in order of suggested call sequence + void SetAddress(const char * szAddress, unsigned int uiPort = 5001); + bool Connect(bool bLoginAsAdmin, const char * szPassword); + bool InitializeStream(); + bool StreamSettings(Resolution eResolution = RESOLUTION320X240, + uint32_t uiVideoBitrate = 704, uint32_t uiFrameRate = 30, + uint32_t uiVideoSmoothing = 50, uint32_t uiAudioBitrate = 64, + uint32_t uiIFrameInterval = 10); + bool StartStream(); + int ReadStream(void * pBuffer, unsigned int uiSize); + bool StopStream(); + bool Disconnect(); + + // Function used to find out if a connecton to the Slingbox is active + bool IsConnected(); + + // Set channel/input related functions can be called anytime after InitializeStream + // has succeeded + bool ChannelUp(); + bool ChannelDown(); + bool SetChannel(unsigned int uiChannel); + bool SetInput(unsigned int uiInput); + + // Get channel function will usually return valid data after InitializeStream + // has succeeded + int GetChannel(); + + // Get input function will usually return valid data only when a stream is active + // (ie: after StartStream has succeeded and before StopStream is called) + int GetInput(); + + // Function used to send an IR command + bool SendIRCommand(uint8_t ucCommand); + +protected: + void init(); + // Function used to send and receive messages to and from the Slingbox + struct MessageHeader; + bool SendReceiveMessage(SOCKET socSocket, MessageHeader * pHeader, + bool bEncrypt = true, unsigned int uiTimeout = 10); + bool SendMessage(SOCKET socSocket, MessageHeader * pHeader, + bool bEncrypt = true, unsigned int uiTimeout = 10); + bool ReceiveMessage(SOCKET socSocket, bool bUDPMessage = false, + unsigned int uiTimeout = 10); + + // Functions used to encode and decode data to and from the Slingbox + void Encode(void * pData, unsigned int uiSize); + void Decode(void * pData, unsigned int uiSize); + + // Connection related functions + SOCKET OpenSocket(const char * szAddress, unsigned int uiPort, bool bUDP = false); + int Broadcast(SOCKET socSocket, unsigned int uiPort, void * pBuffer, + unsigned int uiSize, unsigned int uiTimeout = 10); + int Send(SOCKET socSocket, void * pBuffer, unsigned int uiSize, + unsigned int uiTimeout = 10); + int SendTo(SOCKET socSocket, void * pBuffer, unsigned int uiSize, + unsigned int uiTimeout, struct sockaddr * pSocketAddress); + int Receive(SOCKET socSocket, void * pBuffer, unsigned int uiSize, + unsigned int uiTimeout = 10); + int ReceiveFrom(SOCKET socSocket, void * pBuffer, unsigned int uiSize, + unsigned int uiTimeout, struct sockaddr * pSocketAddress); + bool CloseSocket(SOCKET socSocket); + + // Function used to wait on the Slingbox for various reasons + void Wait(unsigned int uiMilliseconds); + + // Protected member variables + SOCKET m_socCommunication; + SOCKET m_socStream; + char m_szAddress[1024]; + unsigned int m_uiPort; + uint16_t m_usCode; + uint16_t m_usSequence; + int m_iChannel; + int m_iInput; + + // Struct to define which messages were received + struct + { + bool bFindMessage; + bool bConnectMessage; + bool bInitializationMessage; + bool bEncryptionMessage; + bool bSettingsMessage; + bool bDisconnectMessage; + bool bStatusMessage; + bool bChannelMessage; + bool bInputMessage; + bool bChannelStatusMessage; + bool bInputStatusMessage; + bool bIRMessage; + } m_receivedMessages; + + // Struct to define the Slingbox message header + struct MessageHeader + { + uint16_t m_usHeader; // Always 0x0101 + uint16_t m_usCode; // Grabbed from the first packet from the Slingbox then + // always kept the same + uint16_t m_usMessageID; // Unique number to identify the message + uint16_t m_usVar4; // Always 0 + uint16_t m_usSequence; // Sequencial number (answer will have the same number) + uint16_t m_usDirection; // 0 from Slingbox and 0x8000 from software + uint16_t m_usVar7; + uint16_t m_usVar8; + uint16_t m_usSize; // Size of the buffer (without header) + uint16_t m_usEncoded; // 0x2000 if buffer is encoded + uint16_t m_usVar11; + uint16_t m_usVar12; + uint16_t m_usVar13; + uint16_t m_usVar14; + uint16_t m_usVar15; + uint16_t m_usVar16; + + // Struct constructor that sets all variables to default values + MessageHeader(uint16_t usMessageID, uint16_t usSize) + { + memset(this, 0, sizeof(MessageHeader)); + m_usHeader = 0x0101; + m_usMessageID = usMessageID; + m_usSize = usSize - sizeof(MessageHeader); + } + }; + + // Struct to define the login message + struct ConnectMessage : public MessageHeader + { + uint32_t m_uiUnknown; + uint16_t m_usAccess[16]; + uint16_t m_usPassword[16]; + uint16_t m_usID[66]; + + // Struct constructor that sets variables to default values and copies + // passed values into variables + ConnectMessage(bool bLoginAsAdmin, const char * szPassword) + :MessageHeader(0x0067, sizeof(ConnectMessage)) + { + m_uiUnknown = 0x00000000; + CopyCharToShort(m_usAccess, bLoginAsAdmin ? "admin" : "guest", 16); + CopyCharToShort(m_usPassword, szPassword, 16); + CopyCharToShort(m_usID, "Slingbox", 66); + } + + // Function to copy a char array into a short array + void CopyCharToShort(uint16_t * usTarget, const char * szSource, + unsigned int uiTargetSize) + { + memset(usTarget, 0, uiTargetSize * sizeof(uint16_t)); + for (unsigned int i = 0; i < uiTargetSize && szSource[i] != '\0'; i++) + { + usTarget[i] = (uint16_t)szSource[i]; + } + } + }; + + // Struct to define the initialization message + struct InitializationMessage : public MessageHeader + { + uint32_t m_uiVar1; + uint32_t m_uiVar2; + + // Struct constructor that sets all variables to default values + InitializationMessage() + :MessageHeader(0x007E, sizeof(InitializationMessage)) + { + m_uiVar1 = 0x00000001; + m_uiVar2 = 0x00000000; + } + }; + + // Struct to define the encryption message + struct EncryptionMessage : public MessageHeader + { + uint32_t m_uiData[24]; + + // Struct constructor that sets all variables to default values + EncryptionMessage() + :MessageHeader(0x00A6, sizeof(EncryptionMessage)) + { + memset(m_uiData, 0, 96); + m_uiData[0] = 0x00000100; + m_uiData[4] = 0x001D0000; + } + }; + + // Struct to define the settings message + struct SettingsMessage : public MessageHeader + { + uint32_t m_uiData[40]; + + // Struct constructor that sets variables to default values and copies + // passed values into variables + SettingsMessage(Resolution resolution, uint32_t uiVideoBitrate, + uint32_t uiFrameRate, uint32_t uiVideoSmoothing, uint32_t uiAudioBitrate, + uint32_t uiIFrameInterval) + :MessageHeader(0x00B5, sizeof(SettingsMessage)) + { + // Make sure all our values are within limits + if (uiVideoBitrate < 50) + uiVideoBitrate = 50; + if (uiVideoBitrate > 8000) + uiVideoBitrate = 8000; + + if (uiFrameRate < 1) + uiFrameRate = 1; + else if (uiFrameRate < 6) + uiFrameRate = 1; + else if (uiFrameRate < 10) + uiFrameRate = 6; + else if (uiFrameRate < 15) + uiFrameRate = 10; + else if (uiFrameRate < 20) + uiFrameRate = 15; + else if (uiFrameRate < 30) + uiFrameRate = 20; + else + uiFrameRate = 30; + + if (uiVideoSmoothing > 100) + uiVideoSmoothing = 100; + + if (uiAudioBitrate < 16) + uiAudioBitrate = 16; + else if (uiAudioBitrate < 20) + uiAudioBitrate = 16; + else if (uiAudioBitrate < 32) + uiAudioBitrate = 20; + else if (uiAudioBitrate < 40) + uiAudioBitrate = 32; + else if (uiAudioBitrate < 48) + uiAudioBitrate = 40; + else if (uiAudioBitrate < 64) + uiAudioBitrate = 48; + else if (uiAudioBitrate < 96) + uiAudioBitrate = 64; + else + uiAudioBitrate = 96; + + if (uiIFrameInterval > 30) + uiIFrameInterval = 30; + + // Set variables to default values and copy passed values into variables + m_uiData[0] = 0x000000FF; + m_uiData[1] = 0x000000FF; + m_uiData[2] = resolution; + m_uiData[3] = 0x00000001; + m_uiData[4] = uiVideoBitrate + (uiFrameRate << 16) + + (uiIFrameInterval << 24); + m_uiData[5] = 0x00000001 + (uiVideoSmoothing << 8); + m_uiData[6] = 0x00000003; + m_uiData[7] = 0x00000001; + m_uiData[8] = uiAudioBitrate; + m_uiData[9] = 0x00000003; + m_uiData[10] = 0x00000001; + m_uiData[11] = 0x46D4F252; + m_uiData[12] = 0x4C5D03E4; + m_uiData[13] = 0x04CA1F8D; + m_uiData[14] = 0xF1090089; + + for (int i = 15; i < 40; i++) + m_uiData[i] = 0x00000000; + } + }; + + // Struct to define the disconnect message + struct DisconnectMessage : public MessageHeader + { + DisconnectMessage() + :MessageHeader(0x0068, sizeof(DisconnectMessage)) + { + } + }; + + // Struct to define the status message + struct StatusMessage : public MessageHeader + { + StatusMessage() + :MessageHeader(0x0065, sizeof(StatusMessage)) + { + } + }; + + // Struct to define the channel message + struct ChannelMessage : public MessageHeader + { + uint32_t m_uiUpDown; // 0 = up & 1 = down when channel = 0 + uint32_t m_uiChannel; + uint32_t m_uiUnknown1; + uint32_t m_uiUnknown2; + + // Struct constructor that sets variables to default values and copies + // passed values into variables + ChannelMessage(uint32_t uiChannel = 0) + :MessageHeader(0x0089, sizeof(ChannelMessage)) + { + m_uiUpDown = 0x00000002; + m_uiChannel = uiChannel; + m_uiUnknown1 = 0xFF000000; + m_uiUnknown2 = 0x00000000; + } + + // Function that sets variables to values required to change the channel up + void Up() + { + m_uiUpDown = 0x00000000; + m_uiChannel = 0x00000000; + m_uiUnknown1 = 0x000000FF; + m_uiUnknown2 = 0x00000000; + } + + // Function that sets variables to values required to change the channel down + void Down() + { + m_uiUpDown = 0x00000001; + m_uiChannel = 0x00000000; + m_uiUnknown1 = 0x000000FF; + m_uiUnknown2 = 0x00000000; + } + }; + + // Struct to define the input message + struct InputMessage : public MessageHeader + { + uint8_t m_ucData[8]; + + // Struct constructor that sets variables to default values and copies + // passed values into variables + InputMessage(uint8_t ucInput) + :MessageHeader(0x0085, sizeof(InputMessage)) + { + memset(m_ucData, 0, sizeof(m_ucData)); + m_ucData[0] = ucInput; + } + }; + + // Struct to define the IR message + struct IRMessage : public MessageHeader + { + uint8_t m_ucData[480]; + + // Struct constructor that sets variables to default values and copies + // passed values into variables + IRMessage(uint8_t ucCode) + :MessageHeader(0x0087, sizeof(IRMessage)) + { + memset(m_ucData, 0, sizeof(m_ucData)); + m_ucData[0] = ucCode; + m_ucData[472] = 0xFF; + } + }; +}; diff -Nru kodi-16.1~git20160425.1001-final/lib/UnrarXLib/rar.cpp kodi-15.2~git20151019.1039-final/lib/UnrarXLib/rar.cpp --- kodi-16.1~git20160425.1001-final/lib/UnrarXLib/rar.cpp 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/UnrarXLib/rar.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -1,8 +1,9 @@ #include "rar.hpp" #include "UnrarX.hpp" +#include "guilib/GUIWindowManager.h" #include "filesystem/File.h" + #include "smallfn.cpp" -#include using namespace std; diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Binary/EffectBinaryFormat.h kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Binary/EffectBinaryFormat.h --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Binary/EffectBinaryFormat.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Binary/EffectBinaryFormat.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,679 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: EffectBinaryFormat.h -// -// Direct3D11 Effects Binary Format -// This is the binary file interface shared between the Effects -// compiler and runtime. -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma once - -namespace D3DX11Effects -{ - -////////////////////////////////////////////////////////////////////////// -// Version Control -////////////////////////////////////////////////////////////////////////// - -#define D3DX11_FXL_VERSION(_Major,_Minor) (('F' << 24) | ('X' << 16) | ((_Major) << 8) | (_Minor)) - -struct EVersionTag -{ - const char* m_pName; - DWORD m_Version; - uint32_t m_Tag; -}; - -// versions must be listed in ascending order -static const EVersionTag g_EffectVersions[] = -{ - { "fx_4_0", D3DX11_FXL_VERSION(4,0), 0xFEFF1001 }, - { "fx_4_1", D3DX11_FXL_VERSION(4,1), 0xFEFF1011 }, - { "fx_5_0", D3DX11_FXL_VERSION(5,0), 0xFEFF2001 }, -}; - - -////////////////////////////////////////////////////////////////////////// -// Reflection & Type structures -////////////////////////////////////////////////////////////////////////// - -// Enumeration of the possible left-hand side values of an assignment, -// divided up categorically by the type of block they may appear in -enum ELhsType -{ - ELHS_Invalid, - - // Pass block assignment types - - ELHS_PixelShaderBlock, // SBlock *pValue points to the block to apply - ELHS_VertexShaderBlock, - ELHS_GeometryShaderBlock, - ELHS_RenderTargetView, - ELHS_DepthStencilView, - - ELHS_RasterizerBlock, - ELHS_DepthStencilBlock, - ELHS_BlendBlock, - - ELHS_GenerateMips, // This is really a call to D3D::GenerateMips - - // Various SAssignment.Value.* - - ELHS_DS_StencilRef, // SAssignment.Value.pdValue - ELHS_B_BlendFactor, // D3D11_BLEND_CONFIG.BlendFactor, points to a float4 - ELHS_B_SampleMask, // D3D11_BLEND_CONFIG.SampleMask - - ELHS_GeometryShaderSO, // When setting SO assignments, GeometryShaderSO precedes the actual GeometryShader assn - - ELHS_ComputeShaderBlock, - ELHS_HullShaderBlock, - ELHS_DomainShaderBlock, - - // Rasterizer - - ELHS_FillMode = 0x20000, - ELHS_CullMode, - ELHS_FrontCC, - ELHS_DepthBias, - ELHS_DepthBiasClamp, - ELHS_SlopeScaledDepthBias, - ELHS_DepthClipEnable, - ELHS_ScissorEnable, - ELHS_MultisampleEnable, - ELHS_AntialiasedLineEnable, - - // Sampler - - ELHS_Filter = 0x30000, - ELHS_AddressU, - ELHS_AddressV, - ELHS_AddressW, - ELHS_MipLODBias, - ELHS_MaxAnisotropy, - ELHS_ComparisonFunc, - ELHS_BorderColor, - ELHS_MinLOD, - ELHS_MaxLOD, - ELHS_Texture, - - // DepthStencil - - ELHS_DepthEnable = 0x40000, - ELHS_DepthWriteMask, - ELHS_DepthFunc, - ELHS_StencilEnable, - ELHS_StencilReadMask, - ELHS_StencilWriteMask, - ELHS_FrontFaceStencilFailOp, - ELHS_FrontFaceStencilDepthFailOp, - ELHS_FrontFaceStencilPassOp, - ELHS_FrontFaceStencilFunc, - ELHS_BackFaceStencilFailOp, - ELHS_BackFaceStencilDepthFailOp, - ELHS_BackFaceStencilPassOp, - ELHS_BackFaceStencilFunc, - - // BlendState - - ELHS_AlphaToCoverage = 0x50000, - ELHS_BlendEnable, - ELHS_SrcBlend, - ELHS_DestBlend, - ELHS_BlendOp, - ELHS_SrcBlendAlpha, - ELHS_DestBlendAlpha, - ELHS_BlendOpAlpha, - ELHS_RenderTargetWriteMask, -}; - -enum EBlockType -{ - EBT_Invalid, - EBT_DepthStencil, - EBT_Blend, - EBT_Rasterizer, - EBT_Sampler, - EBT_Pass -}; - -enum EVarType -{ - EVT_Invalid, - EVT_Numeric, - EVT_Object, - EVT_Struct, - EVT_Interface, -}; - -enum EScalarType -{ - EST_Invalid, - EST_Float, - EST_Int, - EST_UInt, - EST_Bool, - EST_Count -}; - -enum ENumericLayout -{ - ENL_Invalid, - ENL_Scalar, - ENL_Vector, - ENL_Matrix, - ENL_Count -}; - -enum EObjectType -{ - EOT_Invalid, - EOT_String, - EOT_Blend, - EOT_DepthStencil, - EOT_Rasterizer, - EOT_PixelShader, - EOT_VertexShader, - EOT_GeometryShader, // Regular geometry shader - EOT_GeometryShaderSO, // Geometry shader with a attached StreamOut decl - EOT_Texture, - EOT_Texture1D, - EOT_Texture1DArray, - EOT_Texture2D, - EOT_Texture2DArray, - EOT_Texture2DMS, - EOT_Texture2DMSArray, - EOT_Texture3D, - EOT_TextureCube, - EOT_ConstantBuffer, - EOT_RenderTargetView, - EOT_DepthStencilView, - EOT_Sampler, - EOT_Buffer, - EOT_TextureCubeArray, - EOT_Count, - EOT_PixelShader5, - EOT_VertexShader5, - EOT_GeometryShader5, - EOT_ComputeShader5, - EOT_HullShader5, - EOT_DomainShader5, - EOT_RWTexture1D, - EOT_RWTexture1DArray, - EOT_RWTexture2D, - EOT_RWTexture2DArray, - EOT_RWTexture3D, - EOT_RWBuffer, - EOT_ByteAddressBuffer, - EOT_RWByteAddressBuffer, - EOT_StructuredBuffer, - EOT_RWStructuredBuffer, - EOT_RWStructuredBufferAlloc, - EOT_RWStructuredBufferConsume, - EOT_AppendStructuredBuffer, - EOT_ConsumeStructuredBuffer, -}; - -inline bool IsObjectTypeHelper(EVarType InVarType, - EObjectType InObjType, - EObjectType TargetObjType) -{ - return (InVarType == EVT_Object) && (InObjType == TargetObjType); -} - -inline bool IsSamplerHelper(EVarType InVarType, - EObjectType InObjType) -{ - return (InVarType == EVT_Object) && (InObjType == EOT_Sampler); -} - -inline bool IsStateBlockObjectHelper(EVarType InVarType, - EObjectType InObjType) -{ - return (InVarType == EVT_Object) && ((InObjType == EOT_Blend) || (InObjType == EOT_DepthStencil) || (InObjType == EOT_Rasterizer) || IsSamplerHelper(InVarType, InObjType)); -} - -inline bool IsShaderHelper(EVarType InVarType, - EObjectType InObjType) -{ - return (InVarType == EVT_Object) && ((InObjType == EOT_VertexShader) || - (InObjType == EOT_VertexShader5) || - (InObjType == EOT_HullShader5) || - (InObjType == EOT_DomainShader5) || - (InObjType == EOT_ComputeShader5) || - (InObjType == EOT_GeometryShader) || - (InObjType == EOT_GeometryShaderSO) || - (InObjType == EOT_GeometryShader5) || - (InObjType == EOT_PixelShader) || - (InObjType == EOT_PixelShader5)); -} - -inline bool IsShader5Helper(EVarType InVarType, - EObjectType InObjType) -{ - return (InVarType == EVT_Object) && ((InObjType == EOT_VertexShader5) || - (InObjType == EOT_HullShader5) || - (InObjType == EOT_DomainShader5) || - (InObjType == EOT_ComputeShader5) || - (InObjType == EOT_GeometryShader5) || - (InObjType == EOT_PixelShader5)); -} - -inline bool IsInterfaceHelper(EVarType InVarType, EObjectType InObjType) -{ - UNREFERENCED_PARAMETER(InObjType); - return (InVarType == EVT_Interface); -} - -inline bool IsShaderResourceHelper(EVarType InVarType, - EObjectType InObjType) -{ - return (InVarType == EVT_Object) && ((InObjType == EOT_Texture) || - (InObjType == EOT_Texture1D) || - (InObjType == EOT_Texture1DArray) || - (InObjType == EOT_Texture2D) || - (InObjType == EOT_Texture2DArray) || - (InObjType == EOT_Texture2DMS) || - (InObjType == EOT_Texture2DMSArray) || - (InObjType == EOT_Texture3D) || - (InObjType == EOT_TextureCube) || - (InObjType == EOT_TextureCubeArray) || - (InObjType == EOT_Buffer) || - (InObjType == EOT_StructuredBuffer) || - (InObjType == EOT_ByteAddressBuffer)); -} - -inline bool IsUnorderedAccessViewHelper(EVarType InVarType, - EObjectType InObjType) -{ - return (InVarType == EVT_Object) && - ((InObjType == EOT_RWTexture1D) || - (InObjType == EOT_RWTexture1DArray) || - (InObjType == EOT_RWTexture2D) || - (InObjType == EOT_RWTexture2DArray) || - (InObjType == EOT_RWTexture3D) || - (InObjType == EOT_RWBuffer) || - (InObjType == EOT_RWByteAddressBuffer) || - (InObjType == EOT_RWStructuredBuffer) || - (InObjType == EOT_RWStructuredBufferAlloc) || - (InObjType == EOT_RWStructuredBufferConsume) || - (InObjType == EOT_AppendStructuredBuffer) || - (InObjType == EOT_ConsumeStructuredBuffer)); -} - -inline bool IsRenderTargetViewHelper(EVarType InVarType, - EObjectType InObjType) -{ - return (InVarType == EVT_Object) && (InObjType == EOT_RenderTargetView); -} - -inline bool IsDepthStencilViewHelper(EVarType InVarType, - EObjectType InObjType) -{ - return (InVarType == EVT_Object) && (InObjType == EOT_DepthStencilView); -} - -inline bool IsObjectAssignmentHelper(ELhsType LhsType) -{ - switch(LhsType) - { - case ELHS_VertexShaderBlock: - case ELHS_HullShaderBlock: - case ELHS_DepthStencilView: - case ELHS_GeometryShaderBlock: - case ELHS_PixelShaderBlock: - case ELHS_ComputeShaderBlock: - case ELHS_DepthStencilBlock: - case ELHS_RasterizerBlock: - case ELHS_BlendBlock: - case ELHS_Texture: - case ELHS_RenderTargetView: - case ELHS_DomainShaderBlock: - return true; - } - return false; -} - - - - -// Effect file format structures ///////////////////////////////////////////// -// File format: -// File header (SBinaryHeader Header) -// Unstructured data block (uint8_t[Header.cbUnstructured)) -// Structured data block -// ConstantBuffer (SBinaryConstantBuffer CB) * Header.Effect.cCBs -// uint32_t NumAnnotations -// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized -// Variable data (SBinaryNumericVariable Var) * (CB.cVariables) -// uint32_t NumAnnotations -// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized -// Object variables (SBinaryObjectVariable Var) * (Header.cObjectVariables) *this structure is variable sized -// uint32_t NumAnnotations -// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized -// Interface variables (SBinaryInterfaceVariable Var) * (Header.cInterfaceVariables) *this structure is variable sized -// uint32_t NumAnnotations -// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized -// Groups (SBinaryGroup Group) * Header.cGroups -// uint32_t NumAnnotations -// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized -// Techniques (SBinaryTechnique Technique) * Group.cTechniques -// uint32_t NumAnnotations -// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized -// Pass (SBinaryPass Pass) * Technique.cPasses -// uint32_t NumAnnotations -// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized -// Pass assignments (SBinaryAssignment) * Pass.cAssignments - -struct SBinaryHeader -{ - struct SVarCounts - { - uint32_t cCBs; - uint32_t cNumericVariables; - uint32_t cObjectVariables; - }; - - uint32_t Tag; // should be equal to c_EffectFileTag - // this is used to identify ASCII vs Binary files - - SVarCounts Effect; - SVarCounts Pool; - - uint32_t cTechniques; - uint32_t cbUnstructured; - - uint32_t cStrings; - uint32_t cShaderResources; - - uint32_t cDepthStencilBlocks; - uint32_t cBlendStateBlocks; - uint32_t cRasterizerStateBlocks; - uint32_t cSamplers; - uint32_t cRenderTargetViews; - uint32_t cDepthStencilViews; - - uint32_t cTotalShaders; - uint32_t cInlineShaders; // of the aforementioned shaders, the number that are defined inline within pass blocks - - inline bool RequiresPool() const - { - return (Pool.cCBs != 0) || - (Pool.cNumericVariables != 0) || - (Pool.cObjectVariables != 0); - } -}; - -struct SBinaryHeader5 : public SBinaryHeader -{ - uint32_t cGroups; - uint32_t cUnorderedAccessViews; - uint32_t cInterfaceVariables; - uint32_t cInterfaceVariableElements; - uint32_t cClassInstanceElements; -}; - -// Constant buffer definition -struct SBinaryConstantBuffer -{ - // private flags - static const uint32_t c_IsTBuffer = (1 << 0); - static const uint32_t c_IsSingle = (1 << 1); - - uint32_t oName; // Offset to constant buffer name - uint32_t Size; // Size, in bytes - uint32_t Flags; - uint32_t cVariables; // # of variables inside this buffer - uint32_t ExplicitBindPoint; // Defined if the effect file specifies a bind point using the register keyword - // otherwise, -1 -}; - -struct SBinaryAnnotation -{ - uint32_t oName; // Offset to variable name - uint32_t oType; // Offset to type information (SBinaryType) - - // For numeric annotations: - // uint32_t oDefaultValue; // Offset to default initializer value - // - // For string annotations: - // uint32_t oStringOffsets[Elements]; // Elements comes from the type data at oType -}; - -struct SBinaryNumericVariable -{ - uint32_t oName; // Offset to variable name - uint32_t oType; // Offset to type information (SBinaryType) - uint32_t oSemantic; // Offset to semantic information - uint32_t Offset; // Offset in parent constant buffer - uint32_t oDefaultValue; // Offset to default initializer value - uint32_t Flags; // Explicit bind point -}; - -struct SBinaryInterfaceVariable -{ - uint32_t oName; // Offset to variable name - uint32_t oType; // Offset to type information (SBinaryType) - uint32_t oDefaultValue; // Offset to default initializer array (SBinaryInterfaceInitializer[Elements]) - uint32_t Flags; -}; - -struct SBinaryInterfaceInitializer -{ - uint32_t oInstanceName; - uint32_t ArrayIndex; -}; - -struct SBinaryObjectVariable -{ - uint32_t oName; // Offset to variable name - uint32_t oType; // Offset to type information (SBinaryType) - uint32_t oSemantic; // Offset to semantic information - uint32_t ExplicitBindPoint; // Used when a variable has been explicitly bound (register(XX)). -1 if not - - // Initializer data: - // - // The type structure pointed to by oType gives you Elements, - // VarType (must be EVT_Object), and ObjectType - // - // For ObjectType == EOT_Blend, EOT_DepthStencil, EOT_Rasterizer, EOT_Sampler - // struct - // { - // uint32_t cAssignments; - // SBinaryAssignment Assignments[cAssignments]; - // } Blocks[Elements] - // - // For EObjectType == EOT_Texture*, EOT_Buffer - // - // - // For EObjectType == EOT_*Shader, EOT_String - // uint32_t oData[Elements]; // offsets to a shader data block or a nullptr-terminated string - // - // For EObjectType == EOT_GeometryShaderSO - // SBinaryGSSOInitializer[Elements] - // - // For EObjectType == EOT_*Shader5 - // SBinaryShaderData5[Elements] -}; - -struct SBinaryGSSOInitializer -{ - uint32_t oShader; // Offset to shader bytecode data block - uint32_t oSODecl; // Offset to StreamOutput decl string -}; - -struct SBinaryShaderData5 -{ - uint32_t oShader; // Offset to shader bytecode data block - uint32_t oSODecls[4]; // Offset to StreamOutput decl strings - uint32_t cSODecls; // Count of valid oSODecls entries. - uint32_t RasterizedStream; // Which stream is used for rasterization - uint32_t cInterfaceBindings; // Count of interface bindings. - uint32_t oInterfaceBindings; // Offset to SBinaryInterfaceInitializer[cInterfaceBindings]. -}; - -struct SBinaryType -{ - uint32_t oTypeName; // Offset to friendly type name ("float4", "VS_OUTPUT") - EVarType VarType; // Numeric, Object, or Struct - uint32_t Elements; // # of array elements (0 for non-arrays) - uint32_t TotalSize; // Size in bytes; not necessarily Stride * Elements for arrays - // because of possible gap left in final register - uint32_t Stride; // If an array, this is the spacing between elements. - // For unpacked arrays, always divisible by 16-bytes (1 register). - // No support for packed arrays - uint32_t PackedSize; // Size, in bytes, of this data typed when fully packed - - struct SBinaryMember - { - uint32_t oName; // Offset to structure member name ("m_pFoo") - uint32_t oSemantic; // Offset to semantic ("POSITION0") - uint32_t Offset; // Offset, in bytes, relative to start of parent structure - uint32_t oType; // Offset to member's type descriptor - }; - - // the data that follows depends on the VarType: - // Numeric: SType::SNumericType - // Object: EObjectType - // Struct: - // struct - // { - // uint32_t cMembers; - // SBinaryMembers Members[cMembers]; - // } MemberInfo - // struct - // { - // uint32_t oBaseClassType; // Offset to type information (SBinaryType) - // uint32_t cInterfaces; - // uint32_t oInterfaceTypes[cInterfaces]; - // } SBinaryTypeInheritance - // Interface: (nothing) -}; - -struct SBinaryNumericType -{ - ENumericLayout NumericLayout : 3; // scalar (1x1), vector (1xN), matrix (NxN) - EScalarType ScalarType : 5; // float32, int32, int8, etc. - uint32_t Rows : 3; // 1 <= Rows <= 4 - uint32_t Columns : 3; // 1 <= Columns <= 4 - uint32_t IsColumnMajor : 1; // applies only to matrices - uint32_t IsPackedArray : 1; // if this is an array, indicates whether elements should be greedily packed -}; - -struct SBinaryTypeInheritance -{ - uint32_t oBaseClass; // Offset to base class type info or 0 if no base class. - uint32_t cInterfaces; - - // Followed by uint32_t[cInterfaces] with offsets to the type - // info of each interface. -}; - -struct SBinaryGroup -{ - uint32_t oName; - uint32_t cTechniques; -}; - -struct SBinaryTechnique -{ - uint32_t oName; - uint32_t cPasses; -}; - -struct SBinaryPass -{ - uint32_t oName; - uint32_t cAssignments; -}; - -enum ECompilerAssignmentType -{ - ECAT_Invalid, // Assignment-specific data (always in the unstructured blob) - ECAT_Constant, // -N SConstant structures - ECAT_Variable, // -nullptr terminated string with variable name ("foo") - ECAT_ConstIndex, // -SConstantIndex structure - ECAT_VariableIndex, // -SVariableIndex structure - ECAT_ExpressionIndex, // -SIndexedObjectExpression structure - ECAT_Expression, // -Data block containing FXLVM code - ECAT_InlineShader, // -Data block containing shader - ECAT_InlineShader5, // -Data block containing shader with extended 5.0 data (SBinaryShaderData5) -}; - -struct SBinaryAssignment -{ - uint32_t iState; // index into g_lvGeneral - uint32_t Index; // the particular index to assign to (see g_lvGeneral to find the # of valid indices) - ECompilerAssignmentType AssignmentType; - uint32_t oInitializer; // Offset of assignment-specific data - - struct SConstantIndex - { - uint32_t oArrayName; - uint32_t Index; - }; - - struct SVariableIndex - { - uint32_t oArrayName; - uint32_t oIndexVarName; - }; - - struct SIndexedObjectExpression - { - uint32_t oArrayName; - uint32_t oCode; - }; - - struct SInlineShader - { - uint32_t oShader; - uint32_t oSODecl; - }; -}; - -struct SBinaryConstant -{ - EScalarType Type; - union - { - BOOL bValue; - INT iValue; - float fValue; - }; -}; - -static_assert( sizeof(SBinaryHeader) == 76, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryHeader::SVarCounts) == 12, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryHeader5) == 96, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryConstantBuffer) == 20, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryAnnotation) == 8, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryNumericVariable) == 24, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryInterfaceVariable) == 16, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryInterfaceInitializer) == 8, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryObjectVariable) == 16, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryGSSOInitializer) == 8, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryShaderData5) == 36, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryType) == 24, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryType::SBinaryMember) == 16, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryNumericType) == 4, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryTypeInheritance) == 8, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryGroup) == 8, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryTechnique) == 8, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryPass) == 8, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryAssignment) == 16, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryAssignment::SConstantIndex) == 8, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryAssignment::SVariableIndex) == 8, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryAssignment::SIndexedObjectExpression) == 8, "FX11 binary size mismatch" ); -static_assert( sizeof(SBinaryAssignment::SInlineShader) == 8, "FX11 binary size mismatch" ); - -} // end namespace D3DX11Effects - diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Binary/EffectStateBase11.h kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Binary/EffectStateBase11.h --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Binary/EffectStateBase11.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Binary/EffectStateBase11.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: EffectStateBase11.h -// -// Direct3D 11 Effects States Header -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma once - -namespace D3DX11Effects -{ - -////////////////////////////////////////////////////////////////////////// -// Effect HLSL states and late resolve lists -////////////////////////////////////////////////////////////////////////// - -struct RValue -{ - const char *m_pName; - uint32_t m_Value; -}; - -#define RVALUE_END() { nullptr, 0U } -#define RVALUE_ENTRY(prefix, x) { #x, (uint32_t)prefix##x } - -enum ELhsType; - -struct LValue -{ - const char *m_pName; // name of the LHS side of expression - EBlockType m_BlockType; // type of block it can appear in - D3D_SHADER_VARIABLE_TYPE m_Type; // data type allows - uint32_t m_Cols; // number of [m_Type]'s required (1 for a scalar, 4 for a vector) - uint32_t m_Indices; // max index allowable (if LHS is an array; otherwise this is 1) - bool m_VectorScalar; // can be both vector and scalar (setting as a scalar sets all m_Indices values simultaneously) - const RValue *m_pRValue; // pointer to table of allowable RHS "late resolve" values - ELhsType m_LhsType; // ELHS_* enum value that corresponds to this entry - uint32_t m_Offset; // offset into the given block type where this value should be written - uint32_t m_Stride; // for vectors, byte stride between two consecutive values. if 0, m_Type's size is used -}; - -#define LVALUE_END() { nullptr, D3D_SVT_UINT, 0, 0, 0, nullptr } - -extern const LValue g_lvGeneral[]; -extern const uint32_t g_lvGeneralCount; - -} // end namespace D3DX11Effects diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Binary/EffectStates11.h kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Binary/EffectStates11.h --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Binary/EffectStates11.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Binary/EffectStates11.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,241 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: EffectStates11.h -// -// Direct3D 11 Effects States Header -// This file defines properties of states which can appear in -// state blocks and pass blocks. -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma once - -#include "EffectStateBase11.h" - -namespace D3DX11Effects -{ - -////////////////////////////////////////////////////////////////////////// -// Effect HLSL late resolve lists (state values) -////////////////////////////////////////////////////////////////////////// - -static const RValue g_rvNULL[] = -{ - { "nullptr", 0 }, - RVALUE_END() -}; - - -static const RValue g_rvBOOL[] = -{ - { "false", 0 }, - { "true", 1 }, - RVALUE_END() -}; - -static const RValue g_rvDEPTH_WRITE_MASK[] = -{ - { "ZERO", D3D11_DEPTH_WRITE_MASK_ZERO }, - { "ALL", D3D11_DEPTH_WRITE_MASK_ALL }, - RVALUE_END() -}; - -static const RValue g_rvFILL[] = -{ - { "WIREFRAME", D3D11_FILL_WIREFRAME }, - { "SOLID", D3D11_FILL_SOLID }, - RVALUE_END() -}; - -static const RValue g_rvFILTER[] = -{ - RVALUE_ENTRY(D3D11_FILTER_, MIN_MAG_MIP_POINT ), - RVALUE_ENTRY(D3D11_FILTER_, MIN_MAG_POINT_MIP_LINEAR ), - RVALUE_ENTRY(D3D11_FILTER_, MIN_POINT_MAG_LINEAR_MIP_POINT ), - RVALUE_ENTRY(D3D11_FILTER_, MIN_POINT_MAG_MIP_LINEAR ), - RVALUE_ENTRY(D3D11_FILTER_, MIN_LINEAR_MAG_MIP_POINT ), - RVALUE_ENTRY(D3D11_FILTER_, MIN_LINEAR_MAG_POINT_MIP_LINEAR ), - RVALUE_ENTRY(D3D11_FILTER_, MIN_MAG_LINEAR_MIP_POINT ), - RVALUE_ENTRY(D3D11_FILTER_, MIN_MAG_MIP_LINEAR ), - RVALUE_ENTRY(D3D11_FILTER_, ANISOTROPIC ), - RVALUE_ENTRY(D3D11_FILTER_, COMPARISON_MIN_MAG_MIP_POINT ), - RVALUE_ENTRY(D3D11_FILTER_, COMPARISON_MIN_MAG_POINT_MIP_LINEAR ), - RVALUE_ENTRY(D3D11_FILTER_, COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT ), - RVALUE_ENTRY(D3D11_FILTER_, COMPARISON_MIN_POINT_MAG_MIP_LINEAR ), - RVALUE_ENTRY(D3D11_FILTER_, COMPARISON_MIN_LINEAR_MAG_MIP_POINT ), - RVALUE_ENTRY(D3D11_FILTER_, COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR ), - RVALUE_ENTRY(D3D11_FILTER_, COMPARISON_MIN_MAG_LINEAR_MIP_POINT ), - RVALUE_ENTRY(D3D11_FILTER_, COMPARISON_MIN_MAG_MIP_LINEAR ), - RVALUE_ENTRY(D3D11_FILTER_, COMPARISON_ANISOTROPIC ), - RVALUE_END() -}; - -static const RValue g_rvBLEND[] = -{ - { "ZERO", D3D11_BLEND_ZERO }, - { "ONE", D3D11_BLEND_ONE }, - { "SRC_COLOR", D3D11_BLEND_SRC_COLOR }, - { "INV_SRC_COLOR", D3D11_BLEND_INV_SRC_COLOR }, - { "SRC_ALPHA", D3D11_BLEND_SRC_ALPHA }, - { "INV_SRC_ALPHA", D3D11_BLEND_INV_SRC_ALPHA }, - { "DEST_ALPHA", D3D11_BLEND_DEST_ALPHA }, - { "INV_DEST_ALPHA", D3D11_BLEND_INV_DEST_ALPHA }, - { "DEST_COLOR", D3D11_BLEND_DEST_COLOR }, - { "INV_DEST_COLOR", D3D11_BLEND_INV_DEST_COLOR }, - { "SRC_ALPHA_SAT", D3D11_BLEND_SRC_ALPHA_SAT }, - { "BLEND_FACTOR", D3D11_BLEND_BLEND_FACTOR }, - { "INV_BLEND_FACTOR", D3D11_BLEND_INV_BLEND_FACTOR }, - { "SRC1_COLOR", D3D11_BLEND_SRC1_COLOR }, - { "INV_SRC1_COLOR", D3D11_BLEND_INV_SRC1_COLOR }, - { "SRC1_ALPHA", D3D11_BLEND_SRC1_ALPHA }, - { "INV_SRC1_ALPHA", D3D11_BLEND_INV_SRC1_ALPHA }, - - RVALUE_END() -}; - -static const RValue g_rvTADDRESS[] = -{ - { "CLAMP", D3D11_TEXTURE_ADDRESS_CLAMP }, - { "WRAP", D3D11_TEXTURE_ADDRESS_WRAP }, - { "MIRROR", D3D11_TEXTURE_ADDRESS_MIRROR }, - { "BORDER", D3D11_TEXTURE_ADDRESS_BORDER }, - { "MIRROR_ONCE", D3D11_TEXTURE_ADDRESS_MIRROR_ONCE }, - RVALUE_END() -}; - -static const RValue g_rvCULL[] = -{ - { "NONE", D3D11_CULL_NONE }, - { "FRONT", D3D11_CULL_FRONT }, - { "BACK", D3D11_CULL_BACK }, - RVALUE_END() -}; - -static const RValue g_rvCMP[] = -{ - { "NEVER", D3D11_COMPARISON_NEVER }, - { "LESS", D3D11_COMPARISON_LESS }, - { "EQUAL", D3D11_COMPARISON_EQUAL }, - { "LESS_EQUAL", D3D11_COMPARISON_LESS_EQUAL }, - { "GREATER", D3D11_COMPARISON_GREATER }, - { "NOT_EQUAL", D3D11_COMPARISON_NOT_EQUAL }, - { "GREATER_EQUAL", D3D11_COMPARISON_GREATER_EQUAL }, - { "ALWAYS", D3D11_COMPARISON_ALWAYS }, - RVALUE_END() -}; - -static const RValue g_rvSTENCILOP[] = -{ - { "KEEP", D3D11_STENCIL_OP_KEEP }, - { "ZERO", D3D11_STENCIL_OP_ZERO }, - { "REPLACE", D3D11_STENCIL_OP_REPLACE }, - { "INCR_SAT", D3D11_STENCIL_OP_INCR_SAT }, - { "DECR_SAT", D3D11_STENCIL_OP_DECR_SAT }, - { "INVERT", D3D11_STENCIL_OP_INVERT }, - { "INCR", D3D11_STENCIL_OP_INCR }, - { "DECR", D3D11_STENCIL_OP_DECR }, - RVALUE_END() -}; - -static const RValue g_rvBLENDOP[] = -{ - { "ADD", D3D11_BLEND_OP_ADD }, - { "SUBTRACT", D3D11_BLEND_OP_SUBTRACT }, - { "REV_SUBTRACT", D3D11_BLEND_OP_REV_SUBTRACT }, - { "MIN", D3D11_BLEND_OP_MIN }, - { "MAX", D3D11_BLEND_OP_MAX }, - RVALUE_END() -}; - - -////////////////////////////////////////////////////////////////////////// -// Effect HLSL states -////////////////////////////////////////////////////////////////////////// - -#define strideof( s, m ) offsetof_fx(s,m[1]) - offsetof_fx(s,m[0]) - -const LValue g_lvGeneral[] = -{ - // RObjects - { "RasterizerState", EBT_Pass, D3D_SVT_RASTERIZER, 1, 1, false, nullptr, ELHS_RasterizerBlock, offsetof_fx(SPassBlock, BackingStore.pRasterizerBlock), 0 }, - { "DepthStencilState", EBT_Pass, D3D_SVT_DEPTHSTENCIL, 1, 1, false, nullptr, ELHS_DepthStencilBlock, offsetof_fx(SPassBlock, BackingStore.pDepthStencilBlock), 0 }, - { "BlendState", EBT_Pass, D3D_SVT_BLEND, 1, 1, false, nullptr, ELHS_BlendBlock, offsetof_fx(SPassBlock, BackingStore.pBlendBlock), 0 }, - { "RenderTargetView", EBT_Pass, D3D_SVT_RENDERTARGETVIEW, 1, 8, false, nullptr, ELHS_RenderTargetView, offsetof_fx(SPassBlock, BackingStore.pRenderTargetViews), 0 }, - { "DepthStencilView", EBT_Pass, D3D_SVT_DEPTHSTENCILVIEW, 1, 8, false, nullptr, ELHS_DepthStencilView, offsetof_fx(SPassBlock, BackingStore.pDepthStencilView), 0 }, - { "GenerateMips", EBT_Pass, D3D_SVT_TEXTURE, 1, 1, false, nullptr, ELHS_GenerateMips, 0, 0 }, - // Shaders - { "VertexShader", EBT_Pass, D3D_SVT_VERTEXSHADER, 1, 1, false, g_rvNULL, ELHS_VertexShaderBlock, offsetof_fx(SPassBlock, BackingStore.pVertexShaderBlock), 0 }, - { "PixelShader", EBT_Pass, D3D_SVT_PIXELSHADER, 1, 1, false, g_rvNULL, ELHS_PixelShaderBlock, offsetof_fx(SPassBlock, BackingStore.pPixelShaderBlock), 0 }, - { "GeometryShader", EBT_Pass, D3D_SVT_GEOMETRYSHADER, 1, 1, false, g_rvNULL, ELHS_GeometryShaderBlock, offsetof_fx(SPassBlock, BackingStore.pGeometryShaderBlock), 0 }, - // RObject config assignments - { "DS_StencilRef", EBT_Pass, D3D_SVT_UINT, 1, 1, false, nullptr, ELHS_DS_StencilRef, offsetof_fx(SPassBlock, BackingStore.StencilRef), 0 }, - { "AB_BlendFactor", EBT_Pass, D3D_SVT_FLOAT, 4, 1, false, nullptr, ELHS_B_BlendFactor, offsetof_fx(SPassBlock, BackingStore.BlendFactor), 0 }, - { "AB_SampleMask", EBT_Pass, D3D_SVT_UINT, 1, 1, false, nullptr, ELHS_B_SampleMask, offsetof_fx(SPassBlock, BackingStore.SampleMask), 0 }, - - { "FillMode", EBT_Rasterizer, D3D_SVT_UINT, 1, 1, false, g_rvFILL, ELHS_FillMode, offsetof_fx(SRasterizerBlock, BackingStore.FillMode), 0 }, - { "CullMode", EBT_Rasterizer, D3D_SVT_UINT, 1, 1, false, g_rvCULL, ELHS_CullMode, offsetof_fx(SRasterizerBlock, BackingStore.CullMode), 0 }, - { "FrontCounterClockwise", EBT_Rasterizer, D3D_SVT_BOOL, 1, 1, false, g_rvBOOL, ELHS_FrontCC, offsetof_fx(SRasterizerBlock, BackingStore.FrontCounterClockwise), 0 }, - { "DepthBias", EBT_Rasterizer, D3D_SVT_UINT, 1, 1, false, nullptr, ELHS_DepthBias, offsetof_fx(SRasterizerBlock, BackingStore.DepthBias), 0 }, - { "DepthBiasClamp", EBT_Rasterizer, D3D_SVT_FLOAT, 1, 1, false, nullptr, ELHS_DepthBiasClamp, offsetof_fx(SRasterizerBlock, BackingStore.DepthBiasClamp), 0 }, - { "SlopeScaledDepthBias", EBT_Rasterizer, D3D_SVT_FLOAT, 1, 1, false, nullptr, ELHS_SlopeScaledDepthBias, offsetof_fx(SRasterizerBlock, BackingStore.SlopeScaledDepthBias), 0 }, - { "DepthClipEnable", EBT_Rasterizer, D3D_SVT_BOOL, 1, 1, false, g_rvBOOL, ELHS_DepthClipEnable, offsetof_fx(SRasterizerBlock, BackingStore.DepthClipEnable), 0 }, - { "ScissorEnable", EBT_Rasterizer, D3D_SVT_BOOL, 1, 1, false, g_rvBOOL, ELHS_ScissorEnable, offsetof_fx(SRasterizerBlock, BackingStore.ScissorEnable), 0 }, - { "MultisampleEnable", EBT_Rasterizer, D3D_SVT_BOOL, 1, 1, false, g_rvBOOL, ELHS_MultisampleEnable, offsetof_fx(SRasterizerBlock, BackingStore.MultisampleEnable), 0 }, - { "AntialiasedLineEnable", EBT_Rasterizer, D3D_SVT_BOOL, 1, 1, false, g_rvBOOL, ELHS_AntialiasedLineEnable, offsetof_fx(SRasterizerBlock, BackingStore.AntialiasedLineEnable), 0 }, - - { "DepthEnable", EBT_DepthStencil, D3D_SVT_BOOL, 1, 1, false, g_rvBOOL, ELHS_DepthEnable, offsetof_fx(SDepthStencilBlock, BackingStore.DepthEnable), 0 }, - { "DepthWriteMask", EBT_DepthStencil, D3D_SVT_UINT, 1, 1, false, g_rvDEPTH_WRITE_MASK, ELHS_DepthWriteMask, offsetof_fx(SDepthStencilBlock, BackingStore.DepthWriteMask), 0 }, - { "DepthFunc", EBT_DepthStencil, D3D_SVT_UINT, 1, 1, false, g_rvCMP, ELHS_DepthFunc, offsetof_fx(SDepthStencilBlock, BackingStore.DepthFunc), 0 }, - { "StencilEnable", EBT_DepthStencil, D3D_SVT_BOOL, 1, 1, false, g_rvBOOL, ELHS_StencilEnable, offsetof_fx(SDepthStencilBlock, BackingStore.StencilEnable), 0 }, - { "StencilReadMask", EBT_DepthStencil, D3D_SVT_UINT8, 1, 1, false, nullptr, ELHS_StencilReadMask, offsetof_fx(SDepthStencilBlock, BackingStore.StencilReadMask), 0 }, - { "StencilWriteMask", EBT_DepthStencil, D3D_SVT_UINT8, 1, 1, false, nullptr, ELHS_StencilWriteMask, offsetof_fx(SDepthStencilBlock, BackingStore.StencilWriteMask), 0 }, - { "FrontFaceStencilFail", EBT_DepthStencil, D3D_SVT_UINT, 1, 1, false, g_rvSTENCILOP, ELHS_FrontFaceStencilFailOp, offsetof_fx(SDepthStencilBlock, BackingStore.FrontFace.StencilFailOp), 0 }, - { "FrontFaceStencilDepthFail", EBT_DepthStencil, D3D_SVT_UINT, 1, 1, false, g_rvSTENCILOP, ELHS_FrontFaceStencilDepthFailOp,offsetof_fx(SDepthStencilBlock, BackingStore.FrontFace.StencilDepthFailOp), 0 }, - { "FrontFaceStencilPass", EBT_DepthStencil, D3D_SVT_UINT, 1, 1, false, g_rvSTENCILOP, ELHS_FrontFaceStencilPassOp, offsetof_fx(SDepthStencilBlock, BackingStore.FrontFace.StencilPassOp), 0 }, - { "FrontFaceStencilFunc", EBT_DepthStencil, D3D_SVT_UINT, 1, 1, false, g_rvCMP, ELHS_FrontFaceStencilFunc, offsetof_fx(SDepthStencilBlock, BackingStore.FrontFace.StencilFunc), 0 }, - { "BackFaceStencilFail", EBT_DepthStencil, D3D_SVT_UINT, 1, 1, false, g_rvSTENCILOP, ELHS_BackFaceStencilFailOp, offsetof_fx(SDepthStencilBlock, BackingStore.BackFace.StencilFailOp), 0 }, - { "BackFaceStencilDepthFail", EBT_DepthStencil, D3D_SVT_UINT, 1, 1, false, g_rvSTENCILOP, ELHS_BackFaceStencilDepthFailOp,offsetof_fx(SDepthStencilBlock, BackingStore.BackFace.StencilDepthFailOp), 0 }, - { "BackFaceStencilPass", EBT_DepthStencil, D3D_SVT_UINT, 1, 1, false, g_rvSTENCILOP, ELHS_BackFaceStencilPassOp, offsetof_fx(SDepthStencilBlock, BackingStore.BackFace.StencilPassOp), 0 }, - { "BackFaceStencilFunc", EBT_DepthStencil, D3D_SVT_UINT, 1, 1, false, g_rvCMP, ELHS_BackFaceStencilFunc, offsetof_fx(SDepthStencilBlock, BackingStore.BackFace.StencilFunc), 0 }, - - { "AlphaToCoverageEnable", EBT_Blend, D3D_SVT_BOOL, 1, 1, false, g_rvBOOL, ELHS_AlphaToCoverage, offsetof_fx(SBlendBlock, BackingStore.AlphaToCoverageEnable), 0 }, - { "BlendEnable", EBT_Blend, D3D_SVT_BOOL, 1, 8, false, g_rvBOOL, ELHS_BlendEnable, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].BlendEnable), strideof(SBlendBlock, BackingStore.RenderTarget) }, - { "SrcBlend", EBT_Blend, D3D_SVT_UINT, 1, 8, true, g_rvBLEND, ELHS_SrcBlend, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].SrcBlend), strideof(SBlendBlock, BackingStore.RenderTarget) }, - { "DestBlend", EBT_Blend, D3D_SVT_UINT, 1, 8, true, g_rvBLEND, ELHS_DestBlend, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].DestBlend), strideof(SBlendBlock, BackingStore.RenderTarget) }, - { "BlendOp", EBT_Blend, D3D_SVT_UINT, 1, 8, true, g_rvBLENDOP, ELHS_BlendOp, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].BlendOp), strideof(SBlendBlock, BackingStore.RenderTarget) }, - { "SrcBlendAlpha", EBT_Blend, D3D_SVT_UINT, 1, 8, true, g_rvBLEND, ELHS_SrcBlendAlpha, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].SrcBlendAlpha), strideof(SBlendBlock, BackingStore.RenderTarget) }, - { "DestBlendAlpha", EBT_Blend, D3D_SVT_UINT, 1, 8, true, g_rvBLEND, ELHS_DestBlendAlpha, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].DestBlendAlpha), strideof(SBlendBlock, BackingStore.RenderTarget) }, - { "BlendOpAlpha", EBT_Blend, D3D_SVT_UINT, 1, 8, true, g_rvBLENDOP, ELHS_BlendOpAlpha, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].BlendOpAlpha), strideof(SBlendBlock, BackingStore.RenderTarget) }, - { "RenderTargetWriteMask", EBT_Blend, D3D_SVT_UINT8, 1, 8, false, nullptr, ELHS_RenderTargetWriteMask, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].RenderTargetWriteMask), strideof(SBlendBlock, BackingStore.RenderTarget) }, - - { "Filter", EBT_Sampler, D3D_SVT_UINT, 1, 1, false, g_rvFILTER, ELHS_Filter, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.Filter), 0 }, - { "AddressU", EBT_Sampler, D3D_SVT_UINT, 1, 1, false, g_rvTADDRESS, ELHS_AddressU, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.AddressU), 0 }, - { "AddressV", EBT_Sampler, D3D_SVT_UINT, 1, 1, false, g_rvTADDRESS, ELHS_AddressV, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.AddressV), 0 }, - { "AddressW", EBT_Sampler, D3D_SVT_UINT, 1, 1, false, g_rvTADDRESS, ELHS_AddressW, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.AddressW), 0 }, - { "MipLODBias", EBT_Sampler, D3D_SVT_FLOAT, 1, 1, false, nullptr, ELHS_MipLODBias, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.MipLODBias), 0 }, - { "MaxAnisotropy", EBT_Sampler, D3D_SVT_UINT, 1, 1, false, nullptr, ELHS_MaxAnisotropy, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.MaxAnisotropy), 0 }, - { "ComparisonFunc", EBT_Sampler, D3D_SVT_UINT, 1, 1, false, g_rvCMP, ELHS_ComparisonFunc, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.ComparisonFunc), 0 }, - { "BorderColor", EBT_Sampler, D3D_SVT_FLOAT, 4, 1, false, nullptr, ELHS_BorderColor, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.BorderColor), 0 }, - { "MinLOD", EBT_Sampler, D3D_SVT_FLOAT, 1, 1, false, nullptr, ELHS_MinLOD, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.MinLOD), 0 }, - { "MaxLOD", EBT_Sampler, D3D_SVT_FLOAT, 1, 1, false, nullptr, ELHS_MaxLOD, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.MaxLOD), 0 }, - { "Texture", EBT_Sampler, D3D_SVT_TEXTURE, 1, 1, false, g_rvNULL, ELHS_Texture, offsetof_fx(SSamplerBlock, BackingStore.pTexture), 0 }, - - // D3D11 - { "HullShader", EBT_Pass, D3D11_SVT_HULLSHADER, 1, 1, false, g_rvNULL, ELHS_HullShaderBlock, offsetof_fx(SPassBlock, BackingStore.pHullShaderBlock), 0 }, - { "DomainShader", EBT_Pass, D3D11_SVT_DOMAINSHADER, 1, 1, false, g_rvNULL, ELHS_DomainShaderBlock, offsetof_fx(SPassBlock, BackingStore.pDomainShaderBlock), 0 }, - { "ComputeShader", EBT_Pass, D3D11_SVT_COMPUTESHADER, 1, 1, false, g_rvNULL, ELHS_ComputeShaderBlock, offsetof_fx(SPassBlock, BackingStore.pComputeShaderBlock), 0 }, -}; - -#define NUM_STATES (sizeof(g_lvGeneral) / sizeof(LValue)) -#define MAX_VECTOR_SCALAR_INDEX 8 - -const uint32_t g_lvGeneralCount = NUM_STATES; - -} // end namespace D3DX11Effects diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Binary/SOParser.h kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Binary/SOParser.h --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Binary/SOParser.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Binary/SOParser.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,319 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: SOParser.h -// -// Direct3D 11 Effects Stream Out Decl Parser -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma once - -#include -#include - -namespace D3DX11Effects -{ - -////////////////////////////////////////////////////////////////////////// -// CSOParser -////////////////////////////////////////////////////////////////////////// - -class CSOParser -{ - - CEffectVector m_vDecls; // Set of parsed decl entries - D3D11_SO_DECLARATION_ENTRY m_newEntry; // Currently parsing entry - LPSTR m_SemanticString[D3D11_SO_BUFFER_SLOT_COUNT]; // Copy of strings - - static const size_t MAX_ERROR_SIZE = 254; - char m_pError[ MAX_ERROR_SIZE + 1 ]; // Error buffer - -public: - CSOParser() - { - ZeroMemory(&m_newEntry, sizeof(m_newEntry)); - ZeroMemory(m_SemanticString, sizeof(m_SemanticString)); - m_pError[0] = 0; - } - - ~CSOParser() - { - for( size_t Stream = 0; Stream < D3D11_SO_STREAM_COUNT; ++Stream ) - { - SAFE_DELETE_ARRAY( m_SemanticString[Stream] ); - } - } - - // Parse a single string, assuming stream 0 - HRESULT Parse( _In_z_ LPCSTR pString ) - { - m_vDecls.Clear(); - return Parse( 0, pString ); - } - - // Parse all 4 streams - HRESULT Parse( _In_z_ LPSTR pStreams[D3D11_SO_STREAM_COUNT] ) - { - HRESULT hr = S_OK; - m_vDecls.Clear(); - for( uint32_t iDecl=0; iDecl < D3D11_SO_STREAM_COUNT; ++iDecl ) - { - hr = Parse( iDecl, pStreams[iDecl] ); - if( FAILED(hr) ) - { - char str[16]; - sprintf_s( str, 16, " in stream %u.", iDecl ); - str[15] = 0; - strcat_s( m_pError, MAX_ERROR_SIZE, str ); - return hr; - } - } - return hr; - } - - // Return resulting declarations - D3D11_SO_DECLARATION_ENTRY *GetDeclArray() - { - return &m_vDecls[0]; - } - - char* GetErrorString() - { - return m_pError; - } - - uint32_t GetDeclCount() const - { - return m_vDecls.GetSize(); - } - - // Return resulting buffer strides - void GetStrides( uint32_t strides[4] ) - { - size_t len = GetDeclCount(); - strides[0] = strides[1] = strides[2] = strides[3] = 0; - - for( size_t i=0; i < len; i++ ) - { - strides[m_vDecls[i].OutputSlot] += m_vDecls[i].ComponentCount * sizeof(float); - } - } - -protected: - - // Parse a single string "[ :] [][.]; [[ :] [][.][;]]" - HRESULT Parse( _In_ uint32_t Stream, _In_z_ LPCSTR pString ) - { - HRESULT hr = S_OK; - - m_pError[0] = 0; - - if( pString == nullptr ) - return S_OK; - - uint32_t len = (uint32_t)strlen( pString ); - if( len == 0 ) - return S_OK; - - SAFE_DELETE_ARRAY( m_SemanticString[Stream] ); - VN( m_SemanticString[Stream] = new char[len + 1] ); - strcpy_s( m_SemanticString[Stream], len + 1, pString ); - - LPSTR pSemantic = m_SemanticString[Stream]; - - while( true ) - { - // Each decl entry is delimited by a semi-colon - LPSTR pSemi = strchr( pSemantic, ';' ); - - // strip leading and trailing spaces - LPSTR pEnd; - if( pSemi != nullptr ) - { - *pSemi = '\0'; - pEnd = pSemi - 1; - } - else - { - pEnd = pSemantic + strlen( pSemantic ); - } - while( isspace( (unsigned char)*pSemantic ) ) - pSemantic++; - while( pEnd > pSemantic && isspace( (unsigned char)*pEnd ) ) - { - *pEnd = '\0'; - pEnd--; - } - - if( *pSemantic != '\0' ) - { - VH( AddSemantic( pSemantic ) ); - m_newEntry.Stream = Stream; - - VH( m_vDecls.Add( m_newEntry ) ); - } - if( pSemi == nullptr ) - break; - pSemantic = pSemi + 1; - } - -lExit: - return hr; - } - - // Parse a single decl "[ :] [][.]" - HRESULT AddSemantic( _Inout_z_ LPSTR pSemantic ) - { - HRESULT hr = S_OK; - - assert( pSemantic ); - - ZeroMemory( &m_newEntry, sizeof(m_newEntry) ); - VH( ConsumeOutputSlot( &pSemantic ) ); - VH( ConsumeRegisterMask( pSemantic ) ); - VH( ConsumeSemanticIndex( pSemantic ) ); - - // pSenantic now contains only the SemanticName (all other fields were consumed) - if( strcmp( "$SKIP", pSemantic ) != 0 ) - { - m_newEntry.SemanticName = pSemantic; - } - -lExit: - return hr; - } - - // Parse optional mask "[.]" - HRESULT ConsumeRegisterMask( _Inout_z_ LPSTR pSemantic ) - { - HRESULT hr = S_OK; - const char *pFullMask1 = "xyzw"; - const char *pFullMask2 = "rgba"; - size_t stringLength; - size_t startComponent = 0; - LPCSTR p; - - assert( pSemantic ); - - pSemantic = strchr( pSemantic, '.' ); - - if( pSemantic == nullptr ) - { - m_newEntry.ComponentCount = 4; - return S_OK; - } - - *pSemantic = '\0'; - pSemantic++; - - stringLength = strlen( pSemantic ); - p = strstr(pFullMask1, pSemantic ); - if( p ) - { - startComponent = (uint32_t)( p - pFullMask1 ); - } - else - { - p = strstr( pFullMask2, pSemantic ); - if( p ) - startComponent = (uint32_t)( p - pFullMask2 ); - else - { - sprintf_s( m_pError, MAX_ERROR_SIZE, "ID3D11Effect::ParseSODecl - invalid mask declaration '%s'", pSemantic ); - VH( E_FAIL ); - } - - } - - if( stringLength == 0 ) - stringLength = 4; - - m_newEntry.StartComponent = (uint8_t)startComponent; - m_newEntry.ComponentCount = (uint8_t)stringLength; - -lExit: - return hr; - } - - // Parse optional output slot "[ :]" - HRESULT ConsumeOutputSlot( _Inout_z_ LPSTR* ppSemantic ) - { - assert( ppSemantic && *ppSemantic ); - _Analysis_assume_( ppSemantic && *ppSemantic ); - - HRESULT hr = S_OK; - LPSTR pColon = strchr( *ppSemantic, ':' ); - - if( pColon == nullptr ) - return S_OK; - - if( pColon == *ppSemantic ) - { - strcpy_s( m_pError, MAX_ERROR_SIZE, - "ID3D11Effect::ParseSODecl - Invalid output slot" ); - VH( E_FAIL ); - } - - *pColon = '\0'; - int outputSlot = atoi( *ppSemantic ); - if( outputSlot < 0 || outputSlot > 255 ) - { - strcpy_s( m_pError, MAX_ERROR_SIZE, - "ID3D11Effect::ParseSODecl - Invalid output slot" ); - VH( E_FAIL ); - } - m_newEntry.OutputSlot = (uint8_t)outputSlot; - - while( *ppSemantic < pColon ) - { - if( !isdigit( (unsigned char)**ppSemantic ) ) - { - sprintf_s( m_pError, MAX_ERROR_SIZE, "ID3D11Effect::ParseSODecl - Non-digit '%c' in output slot", **ppSemantic ); - VH( E_FAIL ); - } - (*ppSemantic)++; - } - - // skip the colon (which is now '\0') - (*ppSemantic)++; - - while( isspace( (unsigned char)**ppSemantic ) ) - (*ppSemantic)++; - -lExit: - return hr; - } - - // Parse optional index "[]" - HRESULT ConsumeSemanticIndex( _Inout_z_ LPSTR pSemantic ) - { - assert( pSemantic ); - - uint32_t uLen = (uint32_t)strlen( pSemantic ); - - // Grab semantic index - while( uLen > 0 && isdigit( (unsigned char)pSemantic[uLen - 1] ) ) - uLen--; - - if( isdigit( (unsigned char)pSemantic[uLen] ) ) - { - m_newEntry.SemanticIndex = atoi( pSemantic + uLen ); - pSemantic[uLen] = '\0'; - } - else - { - m_newEntry.SemanticIndex = 0; - } - - return S_OK; - } -}; - -} // end namespace D3DX11Effects diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/d3dxGlobal.cpp kodi-15.2~git20151019.1039-final/lib/win32/Effects11/d3dxGlobal.cpp --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/d3dxGlobal.cpp 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/d3dxGlobal.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,396 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: d3dxGlobal.cpp -// -// Direct3D 11 Effects implementation for helper data structures -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#include "pchfx.h" - -// VS 2010's stdint.h conflicts with intsafe.h -#pragma warning(push) -#pragma warning(disable : 4005) -#include -#pragma warning(pop) - -#include -#include - -namespace D3DX11Core -{ - -////////////////////////////////////////////////////////////////////////// -// CMemoryStream - A class to simplify reading binary data -////////////////////////////////////////////////////////////////////////// - -CMemoryStream::CMemoryStream() : m_pData(nullptr), m_cbData(0), m_readPtr(0) -{ -} - -CMemoryStream::~CMemoryStream() -{ -} - -_Use_decl_annotations_ -HRESULT CMemoryStream::SetData(const void *pData, size_t size) -{ - m_pData = (uint8_t*) pData; - m_cbData = size; - m_readPtr = 0; - - return S_OK; -} - -_Use_decl_annotations_ -HRESULT CMemoryStream::ReadAtOffset(size_t offset, size_t size, void **ppData) -{ - if (offset >= m_cbData) - return E_FAIL; - - m_readPtr = offset; - return Read(ppData, size); -} - -_Use_decl_annotations_ -HRESULT CMemoryStream::ReadAtOffset(size_t offset, LPCSTR *ppString) -{ - if (offset >= m_cbData) - return E_FAIL; - - m_readPtr = offset; - return Read(ppString); -} - -_Use_decl_annotations_ -HRESULT CMemoryStream::Read(void **ppData, size_t size) -{ - size_t temp = m_readPtr + size; - - if (temp < m_readPtr || temp > m_cbData) - return E_FAIL; - - *ppData = m_pData + m_readPtr; - m_readPtr = temp; - return S_OK; -} - -_Use_decl_annotations_ -HRESULT CMemoryStream::Read(uint32_t *pDword) -{ - uint32_t *pTempDword; - HRESULT hr; - - hr = Read((void**) &pTempDword, sizeof(uint32_t)); - if (FAILED(hr)) - return E_FAIL; - - *pDword = *pTempDword; - return S_OK; -} - -_Use_decl_annotations_ -HRESULT CMemoryStream::Read(LPCSTR *ppString) -{ - size_t iChar=m_readPtr; - for(; m_pData[iChar]; iChar++) - { - if (iChar > m_cbData) - return E_FAIL; - } - - *ppString = (LPCSTR) (m_pData + m_readPtr); - m_readPtr = iChar; - - return S_OK; -} - -size_t CMemoryStream::GetPosition() -{ - return m_readPtr; -} - -HRESULT CMemoryStream::Seek(_In_ size_t offset) -{ - if (offset > m_cbData) - return E_FAIL; - - m_readPtr = offset; - return S_OK; -} - -} - -////////////////////////////////////////////////////////////////////////// -// CDataBlock - used to dynamically build up the effect file in memory -////////////////////////////////////////////////////////////////////////// - -CDataBlock::CDataBlock() : - m_size(0), - m_maxSize(0), - m_pData(nullptr), - m_pNext(nullptr), - m_IsAligned(false) -{ -} - -CDataBlock::~CDataBlock() -{ - SAFE_DELETE_ARRAY(m_pData); - SAFE_DELETE(m_pNext); -} - -void CDataBlock::EnableAlignment() -{ - m_IsAligned = true; -} - -_Use_decl_annotations_ -HRESULT CDataBlock::AddData(const void *pvNewData, uint32_t bufferSize, CDataBlock **ppBlock) -{ - HRESULT hr = S_OK; - uint32_t bytesToCopy; - const uint8_t *pNewData = (const uint8_t*) pvNewData; - - if (m_maxSize == 0) - { - // This is a brand new DataBlock, fill it up - m_maxSize = std::max(8192, bufferSize); - - VN( m_pData = new uint8_t[m_maxSize] ); - } - - assert(m_pData == AlignToPowerOf2(m_pData, c_DataAlignment)); - - bytesToCopy = std::min(m_maxSize - m_size, bufferSize); - memcpy(m_pData + m_size, pNewData, bytesToCopy); - pNewData += bytesToCopy; - - if (m_IsAligned) - { - assert(m_size == AlignToPowerOf2(m_size, c_DataAlignment)); - m_size += AlignToPowerOf2(bytesToCopy, c_DataAlignment); - } - else - { - m_size += bytesToCopy; - } - - bufferSize -= bytesToCopy; - *ppBlock = this; - - if (bufferSize != 0) - { - assert(nullptr == m_pNext); // make sure we're not overwriting anything - - // Couldn't fit all data into this block, spill over into next - VN( m_pNext = new CDataBlock() ); - if (m_IsAligned) - { - m_pNext->EnableAlignment(); - } - VH( m_pNext->AddData(pNewData, bufferSize, ppBlock) ); - } - -lExit: - return hr; -} - -_Use_decl_annotations_ -void* CDataBlock::Allocate(uint32_t bufferSize, CDataBlock **ppBlock) -{ - void *pRetValue; - uint32_t temp = m_size + bufferSize; - - if (temp < m_size) - return nullptr; - - *ppBlock = this; - - if (m_maxSize == 0) - { - // This is a brand new DataBlock, fill it up - m_maxSize = std::max(8192, bufferSize); - - m_pData = new uint8_t[m_maxSize]; - if (!m_pData) - return nullptr; - memset(m_pData, 0xDD, m_maxSize); - } - else if (temp > m_maxSize) - { - assert(nullptr == m_pNext); // make sure we're not overwriting anything - - // Couldn't fit data into this block, spill over into next - m_pNext = new CDataBlock(); - if (!m_pNext) - return nullptr; - if (m_IsAligned) - { - m_pNext->EnableAlignment(); - } - - return m_pNext->Allocate(bufferSize, ppBlock); - } - - assert(m_pData == AlignToPowerOf2(m_pData, c_DataAlignment)); - - pRetValue = m_pData + m_size; - if (m_IsAligned) - { - assert(m_size == AlignToPowerOf2(m_size, c_DataAlignment)); - m_size = AlignToPowerOf2(temp, c_DataAlignment); - } - else - { - m_size = temp; - } - - return pRetValue; -} - - -////////////////////////////////////////////////////////////////////////// - -CDataBlockStore::CDataBlockStore() : - m_pFirst(nullptr), - m_pLast(nullptr), - m_Size(0), - m_Offset(0), - m_IsAligned(false) -{ -#if _DEBUG - m_cAllocations = 0; -#endif -} - -CDataBlockStore::~CDataBlockStore() -{ - // Can't just do SAFE_DELETE(m_pFirst) since it blows the stack when deleting long chains of data - CDataBlock* pData = m_pFirst; - while(pData) - { - CDataBlock* pCurrent = pData; - pData = pData->m_pNext; - pCurrent->m_pNext = nullptr; - delete pCurrent; - } - - // m_pLast will be deleted automatically -} - -void CDataBlockStore::EnableAlignment() -{ - m_IsAligned = true; -} - -_Use_decl_annotations_ -HRESULT CDataBlockStore::AddString(LPCSTR pString, uint32_t *pOffset) -{ - size_t strSize = strlen(pString) + 1; - assert( strSize <= 0xffffffff ); - return AddData(pString, (uint32_t)strSize, pOffset); -} - -_Use_decl_annotations_ -HRESULT CDataBlockStore::AddData(const void *pNewData, uint32_t bufferSize, uint32_t *pCurOffset) -{ - HRESULT hr = S_OK; - - if (bufferSize == 0) - { - if (pCurOffset) - { - *pCurOffset = 0; - } - goto lExit; - } - - if (!m_pFirst) - { - VN( m_pFirst = new CDataBlock() ); - if (m_IsAligned) - { - m_pFirst->EnableAlignment(); - } - m_pLast = m_pFirst; - } - - if (pCurOffset) - *pCurOffset = m_Size + m_Offset; - - VH( m_pLast->AddData(pNewData, bufferSize, &m_pLast) ); - m_Size += bufferSize; - -lExit: - return hr; -} - -void* CDataBlockStore::Allocate(_In_ uint32_t bufferSize) -{ - void *pRetValue = nullptr; - -#if _DEBUG - m_cAllocations++; -#endif - - if (!m_pFirst) - { - m_pFirst = new CDataBlock(); - if (!m_pFirst) - return nullptr; - - if (m_IsAligned) - { - m_pFirst->EnableAlignment(); - } - m_pLast = m_pFirst; - } - - if (FAILED(UIntAdd(m_Size, bufferSize, &m_Size))) - return nullptr; - - pRetValue = m_pLast->Allocate(bufferSize, &m_pLast); - if (!pRetValue) - return nullptr; - - return pRetValue; -} - -uint32_t CDataBlockStore::GetSize() -{ - return m_Size; -} - - -////////////////////////////////////////////////////////////////////////// - -#ifdef _DEBUG -_Use_decl_annotations_ -void __cdecl D3DXDebugPrintf(UINT lvl, LPCSTR szFormat, ...) -{ - UNREFERENCED_PARAMETER(lvl); - - char strA[4096]; - char strB[4096]; - - va_list ap; - va_start(ap, szFormat); - vsprintf_s(strA, sizeof(strA), szFormat, ap); - strA[4095] = '\0'; - va_end(ap); - - sprintf_s(strB, sizeof(strB), "Effects11: %s\r\n", strA); - - strB[4095] = '\0'; - - OutputDebugStringA(strB); -} -#endif // _DEBUG diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectAPI.cpp kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectAPI.cpp --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectAPI.cpp 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectAPI.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,335 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: EffectAPI.cpp -// -// Effect API entry point -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#include "pchfx.h" - -#include - -using namespace D3DX11Effects; - -//------------------------------------------------------------------------------------- - -struct handle_closer { void operator()(HANDLE h) { if (h) CloseHandle(h); } }; - -typedef public std::unique_ptr ScopedHandle; - -inline HANDLE safe_handle( HANDLE h ) { return (h == INVALID_HANDLE_VALUE) ? 0 : h; } - -//------------------------------------------------------------------------------------- - -static HRESULT LoadBinaryFromFile( _In_z_ LPCWSTR pFileName, _Inout_ std::unique_ptr& data, _Out_ uint32_t& size ) -{ - // open the file -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) - ScopedHandle hFile( safe_handle( CreateFile2( pFileName, - GENERIC_READ, - FILE_SHARE_READ, - OPEN_EXISTING, - nullptr ) ) ); -#else - ScopedHandle hFile( safe_handle( CreateFileW( pFileName, - GENERIC_READ, - FILE_SHARE_READ, - nullptr, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - nullptr ) ) ); -#endif - - if ( !hFile ) - { - return HRESULT_FROM_WIN32( GetLastError() ); - } - - // Get the file size - LARGE_INTEGER FileSize = { 0 }; - -#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) - FILE_STANDARD_INFO fileInfo; - if ( !GetFileInformationByHandleEx( hFile.get(), FileStandardInfo, &fileInfo, sizeof(fileInfo) ) ) - { - return HRESULT_FROM_WIN32( GetLastError() ); - } - FileSize = fileInfo.EndOfFile; -#else - GetFileSizeEx( hFile.get(), &FileSize ); -#endif - - // File is too big for 32-bit allocation or contains no data, so reject read - if ( !FileSize.LowPart || FileSize.HighPart > 0) - { - return E_FAIL; - } - - // create enough space for the file data - data.reset( new uint8_t[ FileSize.LowPart ] ); - if (!data) - { - return E_OUTOFMEMORY; - } - - // read the data in - DWORD BytesRead = 0; - if (!ReadFile( hFile.get(), - data.get(), - FileSize.LowPart, - &BytesRead, - nullptr - )) - { - return HRESULT_FROM_WIN32( GetLastError() ); - } - - if (BytesRead < FileSize.LowPart) - { - return E_FAIL; - } - - size = BytesRead; - - return S_OK; -} - -//-------------------------------------------------------------------------------------- - -_Use_decl_annotations_ -HRESULT WINAPI D3DX11CreateEffectFromMemory(LPCVOID pData, SIZE_T DataLength, UINT FXFlags, - ID3D11Device *pDevice, ID3DX11Effect **ppEffect, LPCSTR srcName ) -{ - if ( !pData || !DataLength || !pDevice || !ppEffect ) - return E_INVALIDARG; - -#ifdef _M_X64 - if ( DataLength > 0xFFFFFFFF ) - return E_INVALIDARG; -#endif - - HRESULT hr = S_OK; - - // Note that pData must point to a compiled effect, not HLSL - VN( *ppEffect = new CEffect( FXFlags & D3DX11_EFFECT_RUNTIME_VALID_FLAGS) ); - VH( ((CEffect*)(*ppEffect))->LoadEffect(pData, static_cast(DataLength) ) ); - VH( ((CEffect*)(*ppEffect))->BindToDevice(pDevice, (srcName) ? srcName : "D3DX11Effect" ) ); - -lExit: - if (FAILED(hr)) - { - SAFE_RELEASE(*ppEffect); - } - return hr; -} - -//-------------------------------------------------------------------------------------- - -_Use_decl_annotations_ -HRESULT WINAPI D3DX11CreateEffectFromFile( LPCWSTR pFileName, UINT FXFlags, ID3D11Device *pDevice, ID3DX11Effect **ppEffect ) -{ - if ( !pFileName || !pDevice || !ppEffect ) - return E_INVALIDARG; - - std::unique_ptr fileData; - uint32_t size; - HRESULT hr = LoadBinaryFromFile( pFileName, fileData, size ); - if ( FAILED(hr) ) - return hr; - - hr = S_OK; - - // Note that pData must point to a compiled effect, not HLSL - VN( *ppEffect = new CEffect( FXFlags & D3DX11_EFFECT_RUNTIME_VALID_FLAGS) ); - VH( ((CEffect*)(*ppEffect))->LoadEffect( fileData.get(), size ) ); - - // Create debug object name from input filename - CHAR strFileA[MAX_PATH]; - int result = WideCharToMultiByte( CP_ACP, WC_NO_BEST_FIT_CHARS, pFileName, -1, strFileA, MAX_PATH, nullptr, FALSE ); - if ( !result ) - { - DPF(0, "Failed to load effect file due to WC to MB conversion failure: %S", pFileName); - hr = E_FAIL; - goto lExit; - } - - const CHAR* pstrName = strrchr( strFileA, '\\' ); - if (!pstrName) - { - pstrName = strFileA; - } - else - { - pstrName++; - } - - VH( ((CEffect*)(*ppEffect))->BindToDevice(pDevice, pstrName) ); - -lExit: - if (FAILED(hr)) - { - SAFE_RELEASE(*ppEffect); - } - return hr; -} - - -//-------------------------------------------------------------------------------------- - -_Use_decl_annotations_ -HRESULT D3DX11CompileEffectFromMemory( LPCVOID pData, SIZE_T DataLength, LPCSTR srcName, - const D3D_SHADER_MACRO *pDefines, ID3DInclude *pInclude, UINT HLSLFlags, UINT FXFlags, - ID3D11Device *pDevice, ID3DX11Effect **ppEffect, ID3DBlob **ppErrors ) -{ - if ( !pData || !DataLength || !pDevice || !ppEffect ) - return E_INVALIDARG; - - if ( FXFlags & D3DCOMPILE_EFFECT_CHILD_EFFECT ) - { - DPF(0, "Effect pools (i.e. D3DCOMPILE_EFFECT_CHILD_EFFECT) not supported" ); - return E_NOTIMPL; - } - - ID3DBlob *blob = nullptr; - HRESULT hr = D3DCompile( pData, DataLength, srcName, pDefines, pInclude, "", "fx_5_0", HLSLFlags, FXFlags, &blob, ppErrors ); - if ( FAILED(hr) ) - { - DPF(0, "D3DCompile of fx_5_0 profile failed: %08X", hr ); - return hr; - } - - hr = S_OK; - - VN( *ppEffect = new CEffect( FXFlags & D3DX11_EFFECT_RUNTIME_VALID_FLAGS ) ); - VH( ((CEffect*)(*ppEffect))->LoadEffect(blob->GetBufferPointer(), static_cast( blob->GetBufferSize() ) ) ); - SAFE_RELEASE( blob ); - - VH( ((CEffect*)(*ppEffect))->BindToDevice(pDevice, (srcName) ? srcName : "D3DX11Effect" ) ); - -lExit: - if (FAILED(hr)) - { - SAFE_RELEASE(*ppEffect); - } - return hr; -} - -//-------------------------------------------------------------------------------------- - -_Use_decl_annotations_ -HRESULT D3DX11CompileEffectFromFile( LPCWSTR pFileName, - const D3D_SHADER_MACRO *pDefines, ID3DInclude *pInclude, UINT HLSLFlags, UINT FXFlags, - ID3D11Device *pDevice, ID3DX11Effect **ppEffect, ID3DBlob **ppErrors ) -{ - if ( !pFileName || !pDevice || !ppEffect ) - return E_INVALIDARG; - - if ( FXFlags & D3DCOMPILE_EFFECT_CHILD_EFFECT ) - { - DPF(0, "Effect pools (i.e. D3DCOMPILE_EFFECT_CHILD_EFFECT) not supported" ); - return E_NOTIMPL; - } - - ID3DBlob *blob = nullptr; - -#if (D3D_COMPILER_VERSION >= 46) && ( !defined(WINAPI_FAMILY) || ( (WINAPI_FAMILY != WINAPI_FAMILY_APP) && (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) ) ) - - HRESULT hr = D3DCompileFromFile( pFileName, pDefines, pInclude, "", "fx_5_0", HLSLFlags, FXFlags, &blob, ppErrors ); - if ( FAILED(hr) ) - { - DPF(0, "D3DCompileFromFile of fx_5_0 profile failed %08X: %S", hr, pFileName ); - return hr; - } - -#else // D3D_COMPILER_VERSION < 46 - - std::unique_ptr fileData; - uint32_t size; - HRESULT hr = LoadBinaryFromFile( pFileName, fileData, size ); - if ( FAILED(hr) ) - { - DPF(0, "Failed to load effect file %08X: %S", hr, pFileName); - return hr; - } - - // Create debug object name from input filename - CHAR strFileA[MAX_PATH]; - int result = WideCharToMultiByte( CP_ACP, WC_NO_BEST_FIT_CHARS, pFileName, -1, strFileA, MAX_PATH, nullptr, FALSE ); - if ( !result ) - { - DPF(0, "Failed to load effect file due to WC to MB conversion failure: %S", pFileName); - return E_FAIL; - } - - const CHAR* pstrName = strrchr( strFileA, '\\' ); - if (!pstrName) - { - pstrName = strFileA; - } - else - { - pstrName++; - } - - hr = D3DCompile( fileData.get(), size, pstrName, pDefines, pInclude, "", "fx_5_0", HLSLFlags, FXFlags, &blob, ppErrors ); - if ( FAILED(hr) ) - { - DPF(0, "D3DCompile of fx_5_0 profile failed: %08X", hr ); - return hr; - } - -#endif // D3D_COMPILER_VERSION - -#ifdef _M_X64 - if ( blob->GetBufferSize() > 0xFFFFFFFF ) - { - SAFE_RELEASE( blob ); - return E_FAIL; - } -#endif // _M_X64 - - hr = S_OK; - - VN( *ppEffect = new CEffect( FXFlags & D3DX11_EFFECT_RUNTIME_VALID_FLAGS ) ); - VH( ((CEffect*)(*ppEffect))->LoadEffect(blob->GetBufferPointer(), static_cast( blob->GetBufferSize() ) ) ); - SAFE_RELEASE( blob ); - -#if (D3D_COMPILER_VERSION >= 46) && ( !defined(WINAPI_FAMILY) || ( (WINAPI_FAMILY != WINAPI_FAMILY_APP) && (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) ) ) - // Create debug object name from input filename - CHAR strFileA[MAX_PATH]; - int result = WideCharToMultiByte( CP_ACP, WC_NO_BEST_FIT_CHARS, pFileName, -1, strFileA, MAX_PATH, nullptr, FALSE ); - if ( !result ) - { - DPF(0, "Failed to load effect file due to WC to MB conversion failure: %S", pFileName); - hr = E_FAIL; - goto lExit; - } - - const CHAR* pstrName = strrchr( strFileA, '\\' ); - if (!pstrName) - { - pstrName = strFileA; - } - else - { - pstrName++; - } -#endif - - VH( ((CEffect*)(*ppEffect))->BindToDevice(pDevice, pstrName) ); - -lExit: - if (FAILED(hr)) - { - SAFE_RELEASE(*ppEffect); - } - return hr; -} diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effect.h kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effect.h --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effect.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effect.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,1265 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: Effect.h -// -// Direct3D 11 Effects Header for ID3DX11Effect Implementation -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma once - -#include "EffectBinaryFormat.h" -#include "IUnknownImp.h" - -#ifdef _DEBUG -extern void __cdecl D3DXDebugPrintf(UINT lvl, _In_z_ _Printf_format_string_ LPCSTR szFormat, ...); -#define DPF D3DXDebugPrintf -#else -#define DPF -#endif - -#pragma warning(push) -#pragma warning(disable : 4481) -// VS 2010 considers 'override' to be a extension, but it's part of C++11 as of VS 2012 - -////////////////////////////////////////////////////////////////////////// - -using namespace D3DX11Core; - -namespace D3DX11Effects -{ - -////////////////////////////////////////////////////////////////////////// -// Forward defines -////////////////////////////////////////////////////////////////////////// - -struct SBaseBlock; -struct SShaderBlock; -struct SPassBlock; -struct SClassInstance; -struct SInterface; -struct SShaderResource; -struct SUnorderedAccessView; -struct SRenderTargetView; -struct SDepthStencilView; -struct SSamplerBlock; -struct SDepthStencilBlock; -struct SBlendBlock; -struct SRasterizerBlock; -struct SString; -struct SD3DShaderVTable; -struct SClassInstanceGlobalVariable; - -struct SAssignment; -struct SVariable; -struct SGlobalVariable; -struct SAnnotation; -struct SConstantBuffer; - -class CEffect; -class CEffectLoader; - -enum ELhsType; - -// Allows the use of 32-bit and 64-bit timers depending on platform type -typedef size_t Timer; - -////////////////////////////////////////////////////////////////////////// -// Reflection & Type structures -////////////////////////////////////////////////////////////////////////// - -// CEffectMatrix is used internally instead of float arrays -struct CEffectMatrix -{ - union - { - struct - { - float _11, _12, _13, _14; - float _21, _22, _23, _24; - float _31, _32, _33, _34; - float _41, _42, _43, _44; - - }; - float m[4][4]; - }; -}; - -struct CEffectVector4 -{ - float x; - float y; - float z; - float w; -}; - -union UDataPointer -{ - void *pGeneric; - uint8_t *pNumeric; - float *pNumericFloat; - uint32_t *pNumericDword; - int *pNumericInt; - BOOL *pNumericBool; - SString *pString; - SShaderBlock *pShader; - SBaseBlock *pBlock; - SBlendBlock *pBlend; - SDepthStencilBlock *pDepthStencil; - SRasterizerBlock *pRasterizer; - SInterface *pInterface; - SShaderResource *pShaderResource; - SUnorderedAccessView *pUnorderedAccessView; - SRenderTargetView *pRenderTargetView; - SDepthStencilView *pDepthStencilView; - SSamplerBlock *pSampler; - CEffectVector4 *pVector; - CEffectMatrix *pMatrix; - UINT_PTR Offset; -}; - -enum EMemberDataType -{ - MDT_ClassInstance, - MDT_BlendState, - MDT_DepthStencilState, - MDT_RasterizerState, - MDT_SamplerState, - MDT_Buffer, - MDT_ShaderResourceView, -}; - -struct SMemberDataPointer -{ - EMemberDataType Type; - union - { - IUnknown *pGeneric; - ID3D11ClassInstance *pD3DClassInstance; - ID3D11BlendState *pD3DEffectsManagedBlendState; - ID3D11DepthStencilState *pD3DEffectsManagedDepthStencilState; - ID3D11RasterizerState *pD3DEffectsManagedRasterizerState; - ID3D11SamplerState *pD3DEffectsManagedSamplerState; - ID3D11Buffer *pD3DEffectsManagedConstantBuffer; - ID3D11ShaderResourceView*pD3DEffectsManagedTextureBuffer; - } Data; -}; - -struct SType : public ID3DX11EffectType -{ - static const UINT_PTR c_InvalidIndex = (uint32_t) -1; - static const uint32_t c_ScalarSize = sizeof(uint32_t); - - // packing rule constants - static const uint32_t c_ScalarsPerRegister = 4; - static const uint32_t c_RegisterSize = c_ScalarsPerRegister * c_ScalarSize; // must be a power of 2!! - - EVarType VarType; // numeric, object, struct - uint32_t Elements; // # of array elements (0 for non-arrays) - char *pTypeName; // friendly name of the type: "VS_OUTPUT", "float4", etc. - - // *Size and stride values are always 0 for object types - // *Annotations adhere to packing rules (even though they do not reside in constant buffers) - // for consistency's sake - // - // Packing rules: - // *Structures and array elements are always register aligned - // *Single-row values (or, for column major matrices, single-column) are greedily - // packed unless doing so would span a register boundary, in which case they are - // register aligned - - uint32_t TotalSize; // Total size of this data type in a constant buffer from - // start to finish (padding in between elements is included, - // but padding at the end is not since that would require - // knowledge of the following data type). - - uint32_t Stride; // Number of bytes to advance between elements. - // Typically a multiple of 16 for arrays, vectors, matrices. - // For scalars and small vectors/matrices, this can be 4 or 8. - - uint32_t PackedSize; // Size, in bytes, of this data typed when fully packed - - union - { - SBinaryNumericType NumericType; - EObjectType ObjectType; // not all values of EObjectType are valid here (e.g. constant buffer) - struct - { - SVariable *pMembers; // array of type instances describing structure members - uint32_t Members; - BOOL ImplementsInterface; // true if this type implements an interface - BOOL HasSuperClass; // true if this type has a parent class - } StructType; - void* InterfaceType; // nothing for interfaces - }; - - - SType() : - VarType(EVT_Invalid), - Elements(0), - pTypeName(nullptr), - TotalSize(0), - Stride(0), - PackedSize(0) - { - C_ASSERT( sizeof(NumericType) <= sizeof(StructType) ); - C_ASSERT( sizeof(ObjectType) <= sizeof(StructType) ); - C_ASSERT( sizeof(InterfaceType) <= sizeof(StructType) ); - ZeroMemory( &StructType, sizeof(StructType) ); - } - - bool IsEqual(SType *pOtherType) const; - - bool IsObjectType(EObjectType ObjType) const - { - return IsObjectTypeHelper(VarType, ObjectType, ObjType); - } - bool IsShader() const - { - return IsShaderHelper(VarType, ObjectType); - } - bool BelongsInConstantBuffer() const - { - return (VarType == EVT_Numeric) || (VarType == EVT_Struct); - } - bool IsStateBlockObject() const - { - return IsStateBlockObjectHelper(VarType, ObjectType); - } - bool IsClassInstance() const - { - return (VarType == EVT_Struct) && StructType.ImplementsInterface; - } - bool IsInterface() const - { - return IsInterfaceHelper(VarType, ObjectType); - } - bool IsShaderResource() const - { - return IsShaderResourceHelper(VarType, ObjectType); - } - bool IsUnorderedAccessView() const - { - return IsUnorderedAccessViewHelper(VarType, ObjectType); - } - bool IsSampler() const - { - return IsSamplerHelper(VarType, ObjectType); - } - bool IsRenderTargetView() const - { - return IsRenderTargetViewHelper(VarType, ObjectType); - } - bool IsDepthStencilView() const - { - return IsDepthStencilViewHelper(VarType, ObjectType); - } - - uint32_t GetTotalUnpackedSize(_In_ bool IsSingleElement) const; - uint32_t GetTotalPackedSize(_In_ bool IsSingleElement) const; - HRESULT GetDescHelper(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc, _In_ bool IsSingleElement) const; - - STDMETHOD_(bool, IsValid)() override { return true; } - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc) override { return GetDescHelper(pDesc, false); } - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(_In_z_ LPCSTR Name) override; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(_In_z_ LPCSTR Semantic) override; - STDMETHOD_(LPCSTR, GetMemberName)(_In_ uint32_t Index) override; - STDMETHOD_(LPCSTR, GetMemberSemantic)(_In_ uint32_t Index) override; - - IUNKNOWN_IMP(SType, ID3DX11EffectType, IUnknown); -}; - -// Represents a type structure for a single element. -// It seems pretty trivial, but it has a different virtual table which enables -// us to accurately represent a type that consists of a single element -struct SSingleElementType : public ID3DX11EffectType -{ - SType *pType; - - STDMETHOD_(bool, IsValid)() override { return true; } - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc) override { return ((SType*)pType)->GetDescHelper(pDesc, true); } - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(uint32_t Index) override { return ((SType*)pType)->GetMemberTypeByIndex(Index); } - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(LPCSTR Name) override { return ((SType*)pType)->GetMemberTypeByName(Name); } - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(LPCSTR Semantic) override { return ((SType*)pType)->GetMemberTypeBySemantic(Semantic); } - STDMETHOD_(LPCSTR, GetMemberName)(uint32_t Index) override { return ((SType*)pType)->GetMemberName(Index); } - STDMETHOD_(LPCSTR, GetMemberSemantic)(uint32_t Index) override { return ((SType*)pType)->GetMemberSemantic(Index); } - - IUNKNOWN_IMP(SSingleElementType, ID3DX11EffectType, IUnknown); -}; - -////////////////////////////////////////////////////////////////////////// -// Block definitions -////////////////////////////////////////////////////////////////////////// - -void * GetBlockByIndex(EVarType VarType, EObjectType ObjectType, void *pBaseBlock, uint32_t Index); - -struct SBaseBlock -{ - EBlockType BlockType; - - bool IsUserManaged:1; - - uint32_t AssignmentCount; - SAssignment *pAssignments; - - SBaseBlock(); - - bool ApplyAssignments(CEffect *pEffect); - - inline SSamplerBlock *AsSampler() const - { - assert( BlockType == EBT_Sampler ); - return (SSamplerBlock*) this; - } - - inline SDepthStencilBlock *AsDepthStencil() const - { - assert( BlockType == EBT_DepthStencil ); - return (SDepthStencilBlock*) this; - } - - inline SBlendBlock *AsBlend() const - { - assert( BlockType == EBT_Blend ); - return (SBlendBlock*) this; - } - - inline SRasterizerBlock *AsRasterizer() const - { - assert( BlockType == EBT_Rasterizer ); - return (SRasterizerBlock*) this; - } - - inline SPassBlock *AsPass() const - { - assert( BlockType == EBT_Pass ); - return (SPassBlock*) this; - } -}; - -struct STechnique : public ID3DX11EffectTechnique -{ - char *pName; - - uint32_t PassCount; - SPassBlock *pPasses; - - uint32_t AnnotationCount; - SAnnotation *pAnnotations; - - bool InitiallyValid; - bool HasDependencies; - - STechnique(); - - STDMETHOD_(bool, IsValid)() override; - STDMETHOD(GetDesc)(_Out_ D3DX11_TECHNIQUE_DESC *pDesc) override; - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override; - - STDMETHOD_(ID3DX11EffectPass*, GetPassByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectPass*, GetPassByName)(_In_z_ LPCSTR Name) override; - - STDMETHOD(ComputeStateBlockMask)(_Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) override; - - IUNKNOWN_IMP(STechnique, ID3DX11EffectTechnique, IUnknown); -}; - -struct SGroup : public ID3DX11EffectGroup -{ - char *pName; - - uint32_t TechniqueCount; - STechnique *pTechniques; - - uint32_t AnnotationCount; - SAnnotation *pAnnotations; - - bool InitiallyValid; - bool HasDependencies; - - SGroup(); - - STDMETHOD_(bool, IsValid)() override; - STDMETHOD(GetDesc)(_Out_ D3DX11_GROUP_DESC *pDesc) override; - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override; - - STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByName)(_In_z_ LPCSTR Name) override; - - IUNKNOWN_IMP(SGroup, ID3DX11EffectGroup, IUnknown); -}; - -struct SPassBlock : SBaseBlock, public ID3DX11EffectPass -{ - struct - { - ID3D11BlendState* pBlendState; - FLOAT BlendFactor[4]; - uint32_t SampleMask; - ID3D11DepthStencilState *pDepthStencilState; - uint32_t StencilRef; - union - { - D3D11_SO_DECLARATION_ENTRY *pEntry; - char *pEntryDesc; - } GSSODesc; - - // Pass assignments can write directly into these - SBlendBlock *pBlendBlock; - SDepthStencilBlock *pDepthStencilBlock; - SRasterizerBlock *pRasterizerBlock; - uint32_t RenderTargetViewCount; - SRenderTargetView *pRenderTargetViews[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT]; - SDepthStencilView *pDepthStencilView; - SShaderBlock *pVertexShaderBlock; - SShaderBlock *pPixelShaderBlock; - SShaderBlock *pGeometryShaderBlock; - SShaderBlock *pComputeShaderBlock; - SShaderBlock *pDomainShaderBlock; - SShaderBlock *pHullShaderBlock; - } BackingStore; - - char *pName; - - uint32_t AnnotationCount; - SAnnotation *pAnnotations; - - CEffect *pEffect; - - bool InitiallyValid; // validity of all state objects and shaders in pass upon BindToDevice - bool HasDependencies; // if pass expressions or pass state blocks have dependencies on variables (if true, IsValid != InitiallyValid possibly) - - SPassBlock(); - - void ApplyPassAssignments(); - bool CheckShaderDependencies( _In_ const SShaderBlock* pBlock ); - bool CheckDependencies(); - - template - HRESULT GetShaderDescHelper(_Out_ D3DX11_PASS_SHADER_DESC *pDesc); - - STDMETHOD_(bool, IsValid)() override; - STDMETHOD(GetDesc)(_Out_ D3DX11_PASS_DESC *pDesc) override; - - STDMETHOD(GetVertexShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override; - STDMETHOD(GetGeometryShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override; - STDMETHOD(GetPixelShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override; - STDMETHOD(GetHullShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override; - STDMETHOD(GetDomainShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override; - STDMETHOD(GetComputeShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override; - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override; - - STDMETHOD(Apply)(_In_ uint32_t Flags, _In_ ID3D11DeviceContext* pContext) override; - - STDMETHOD(ComputeStateBlockMask)(_Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) override; - - IUNKNOWN_IMP(SPassBlock, ID3DX11EffectPass, IUnknown); -}; - -struct SDepthStencilBlock : SBaseBlock -{ - ID3D11DepthStencilState *pDSObject; - D3D11_DEPTH_STENCIL_DESC BackingStore; - bool IsValid; - - SDepthStencilBlock(); -}; - -struct SBlendBlock : SBaseBlock -{ - ID3D11BlendState *pBlendObject; - D3D11_BLEND_DESC BackingStore; - bool IsValid; - - SBlendBlock(); -}; - -struct SRasterizerBlock : SBaseBlock -{ - ID3D11RasterizerState *pRasterizerObject; - D3D11_RASTERIZER_DESC BackingStore; - bool IsValid; - - SRasterizerBlock(); -}; - -struct SSamplerBlock : SBaseBlock -{ - ID3D11SamplerState *pD3DObject; - struct - { - D3D11_SAMPLER_DESC SamplerDesc; - // Sampler "TEXTURE" assignments can write directly into this - SShaderResource *pTexture; - } BackingStore; - - SSamplerBlock(); -}; - -struct SInterface -{ - SClassInstanceGlobalVariable* pClassInstance; - - SInterface() - { - pClassInstance = nullptr; - } -}; - -struct SShaderResource -{ - ID3D11ShaderResourceView *pShaderResource; - - SShaderResource() - { - pShaderResource = nullptr; - } - -}; - -struct SUnorderedAccessView -{ - ID3D11UnorderedAccessView *pUnorderedAccessView; - - SUnorderedAccessView() - { - pUnorderedAccessView = nullptr; - } - -}; - -struct SRenderTargetView -{ - ID3D11RenderTargetView *pRenderTargetView; - - SRenderTargetView(); -}; - -struct SDepthStencilView -{ - ID3D11DepthStencilView *pDepthStencilView; - - SDepthStencilView(); -}; - - -template struct SShaderDependency -{ - uint32_t StartIndex; - uint32_t Count; - - T *ppFXPointers; // Array of ptrs to FX objects (CBs, SShaderResources, etc) - D3DTYPE *ppD3DObjects; // Array of ptrs to matching D3D objects - - SShaderDependency() - { - StartIndex = Count = 0; - - ppD3DObjects = nullptr; - ppFXPointers = nullptr; - } -}; - -typedef SShaderDependency SShaderCBDependency; -typedef SShaderDependency SShaderSamplerDependency; -typedef SShaderDependency SShaderResourceDependency; -typedef SShaderDependency SUnorderedAccessViewDependency; -typedef SShaderDependency SInterfaceDependency; - -// Shader VTables are used to eliminate branching in ApplyShaderBlock. -// The effect owns one D3DShaderVTables for each shader stage -struct SD3DShaderVTable -{ - void ( __stdcall ID3D11DeviceContext::*pSetShader)(ID3D11DeviceChild* pShader, ID3D11ClassInstance*const* ppClassInstances, uint32_t NumClassInstances); - void ( __stdcall ID3D11DeviceContext::*pSetConstantBuffers)(uint32_t StartConstantSlot, uint32_t NumBuffers, ID3D11Buffer *const *pBuffers); - void ( __stdcall ID3D11DeviceContext::*pSetSamplers)(uint32_t Offset, uint32_t NumSamplers, ID3D11SamplerState*const* pSamplers); - void ( __stdcall ID3D11DeviceContext::*pSetShaderResources)(uint32_t Offset, uint32_t NumResources, ID3D11ShaderResourceView *const *pResources); - HRESULT ( __stdcall ID3D11Device::*pCreateShader)(const void *pShaderBlob, size_t ShaderBlobSize, ID3D11ClassLinkage* pClassLinkage, ID3D11DeviceChild **ppShader); -}; - - -struct SShaderBlock -{ - enum ESigType - { - ST_Input, - ST_Output, - ST_PatchConstant, - }; - - struct SInterfaceParameter - { - char *pName; - uint32_t Index; - }; - - // this data is classified as reflection-only and will all be discarded at runtime - struct SReflectionData - { - uint8_t *pBytecode; - uint32_t BytecodeLength; - char *pStreamOutDecls[4]; // set with ConstructGSWithSO - uint32_t RasterizedStream; // set with ConstructGSWithSO - BOOL IsNullGS; - ID3D11ShaderReflection *pReflection; - uint32_t InterfaceParameterCount; // set with BindInterfaces (used for function interface parameters) - SInterfaceParameter *pInterfaceParameters; // set with BindInterfaces (used for function interface parameters) - }; - - bool IsValid; - SD3DShaderVTable *pVT; - - // This value is nullptr if the shader is nullptr or was never initialized - SReflectionData *pReflectionData; - - ID3D11DeviceChild *pD3DObject; - - uint32_t CBDepCount; - SShaderCBDependency *pCBDeps; - - uint32_t SampDepCount; - SShaderSamplerDependency *pSampDeps; - - uint32_t InterfaceDepCount; - SInterfaceDependency *pInterfaceDeps; - - uint32_t ResourceDepCount; - SShaderResourceDependency *pResourceDeps; - - uint32_t UAVDepCount; - SUnorderedAccessViewDependency *pUAVDeps; - - uint32_t TBufferDepCount; - SConstantBuffer **ppTbufDeps; - - ID3DBlob *pInputSignatureBlob; // The input signature is separated from the bytecode because it - // is always available, even after Optimize() has been called. - - SShaderBlock(SD3DShaderVTable *pVirtualTable = nullptr); - - EObjectType GetShaderType(); - - HRESULT OnDeviceBind(); - - // Public API helpers - HRESULT ComputeStateBlockMask(_Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask); - - HRESULT GetShaderDesc(_Out_ D3DX11_EFFECT_SHADER_DESC *pDesc, _In_ bool IsInline); - - HRESULT GetVertexShader(_Outptr_ ID3D11VertexShader **ppVS); - HRESULT GetGeometryShader(_Outptr_ ID3D11GeometryShader **ppGS); - HRESULT GetPixelShader(_Outptr_ ID3D11PixelShader **ppPS); - HRESULT GetHullShader(_Outptr_ ID3D11HullShader **ppHS); - HRESULT GetDomainShader(_Outptr_ ID3D11DomainShader **ppDS); - HRESULT GetComputeShader(_Outptr_ ID3D11ComputeShader **ppCS); - - HRESULT GetSignatureElementDesc(_In_ ESigType SigType, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc); -}; - - - -struct SString -{ - char *pString; - - SString(); -}; - - - -////////////////////////////////////////////////////////////////////////// -// Global Variable & Annotation structure/interface definitions -////////////////////////////////////////////////////////////////////////// - -// -// This is a general structure that can describe -// annotations, variables, and structure members -// -struct SVariable -{ - // For annotations/variables/variable members: - // 1) If numeric, pointer to data (for variables: points into backing store, - // for annotations, points into reflection heap) - // OR - // 2) If object, pointer to the block. If object array, subsequent array elements are found in - // contiguous blocks; the Nth block is found by (( *) pBlock) + N - // (this is because variables that are arrays of objects have their blocks allocated contiguously) - // - // For structure members: - // Offset of this member (in bytes) from parent structure (structure members must be numeric/struct) - UDataPointer Data; - union - { - uint32_t MemberDataOffsetPlus4; // 4 added so that 0 == nullptr can represent "unused" - SMemberDataPointer *pMemberData; - }; - - SType *pType; - char *pName; - char *pSemantic; - uint32_t ExplicitBindPoint; - - SVariable() - { - ZeroMemory(this, sizeof(*this)); - ExplicitBindPoint = uint32_t(-1); - } -}; - -// Template definitions for all of the various ID3DX11EffectVariable specializations -#include "EffectVariable.inl" - - -//////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectShaderVariable (SAnonymousShader implementation) -//////////////////////////////////////////////////////////////////////////////// - -struct SAnonymousShader : public TUncastableVariable, public ID3DX11EffectType -{ - SShaderBlock *pShaderBlock; - - SAnonymousShader(_In_ SShaderBlock *pBlock = nullptr); - - // ID3DX11EffectShaderVariable interface - STDMETHOD_(bool, IsValid)() override; - STDMETHOD_(ID3DX11EffectType*, GetType)() override; - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) override; - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override; - - STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(_In_z_ LPCSTR Name) override; - STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(_In_z_ LPCSTR Semantic) override; - - STDMETHOD_(ID3DX11EffectVariable*, GetElement)(_In_ uint32_t Index) override; - - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)() override; - - // other casts are handled by TUncastableVariable - STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)() override; - - STDMETHOD(SetRawValue)(_In_reads_bytes_(Count) const void *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetRawValue)(_Out_writes_bytes_(Count) void *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - - STDMETHOD(GetShaderDesc)(_In_ uint32_t ShaderIndex, _Out_ D3DX11_EFFECT_SHADER_DESC *pDesc) override; - - STDMETHOD(GetVertexShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11VertexShader **ppVS) override; - STDMETHOD(GetGeometryShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11GeometryShader **ppGS) override; - STDMETHOD(GetPixelShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11PixelShader **ppPS) override; - STDMETHOD(GetHullShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11HullShader **ppHS) override; - STDMETHOD(GetDomainShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11DomainShader **ppDS) override; - STDMETHOD(GetComputeShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11ComputeShader **ppCS) override; - - STDMETHOD(GetInputSignatureElementDesc)(_In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) override; - STDMETHOD(GetOutputSignatureElementDesc)(_In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) override; - STDMETHOD(GetPatchConstantSignatureElementDesc)(_In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) override; - - // ID3DX11EffectType interface - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc) override; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(_In_z_ LPCSTR Name) override; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(_In_z_ LPCSTR Semantic) override; - - STDMETHOD_(LPCSTR, GetMemberName)(_In_ uint32_t Index) override; - STDMETHOD_(LPCSTR, GetMemberSemantic)(_In_ uint32_t Index) override; - - IUNKNOWN_IMP(SAnonymousShader, ID3DX11EffectShaderVariable, ID3DX11EffectVariable); -}; - -//////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectConstantBuffer (SConstantBuffer implementation) -//////////////////////////////////////////////////////////////////////////////// - -struct SConstantBuffer : public TUncastableVariable, public ID3DX11EffectType -{ - ID3D11Buffer *pD3DObject; - SShaderResource TBuffer; // nullptr iff IsTbuffer == false - - uint8_t *pBackingStore; - uint32_t Size; // in bytes - - char *pName; - - uint32_t AnnotationCount; - SAnnotation *pAnnotations; - - uint32_t VariableCount; // # of variables contained in this cbuffer - SGlobalVariable *pVariables; // array of size [VariableCount], points into effect's contiguous variable list - uint32_t ExplicitBindPoint; // Used when a CB has been explicitly bound (register(bXX)). -1 if not - - bool IsDirty:1; // Set when any member is updated; cleared on CB apply - bool IsTBuffer:1; // true iff TBuffer.pShaderResource != nullptr - bool IsUserManaged:1; // Set if you don't want effects to update this buffer - bool IsEffectOptimized:1;// Set if the effect has been optimized - bool IsUsedByExpression:1;// Set if used by any expressions - bool IsUserPacked:1; // Set if the elements have user-specified offsets - bool IsSingle:1; // Set to true if you want to share this CB with cloned Effects - bool IsNonUpdatable:1; // Set to true if you want to share this CB with cloned Effects - - union - { - // These are used to store the original ID3D11Buffer* for use in UndoSetConstantBuffer - uint32_t MemberDataOffsetPlus4; // 4 added so that 0 == nullptr can represent "unused" - SMemberDataPointer *pMemberData; - }; - - CEffect *pEffect; - - SConstantBuffer() - { - pD3DObject = nullptr; - ZeroMemory(&TBuffer, sizeof(TBuffer)); - ExplicitBindPoint = uint32_t(-1); - pBackingStore = nullptr; - Size = 0; - pName = nullptr; - VariableCount = 0; - pVariables = nullptr; - AnnotationCount = 0; - pAnnotations = nullptr; - IsDirty = false; - IsTBuffer = false; - IsUserManaged = false; - IsEffectOptimized = false; - IsUsedByExpression = false; - IsUserPacked = false; - IsSingle = false; - IsNonUpdatable = false; - pEffect = nullptr; - } - - bool ClonedSingle() const; - - // ID3DX11EffectConstantBuffer interface - STDMETHOD_(bool, IsValid)() override; - STDMETHOD_(ID3DX11EffectType*, GetType)() override; - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) override; - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override; - - STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(_In_z_ LPCSTR Name) override; - STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(_In_z_ LPCSTR Semantic) override; - - STDMETHOD_(ID3DX11EffectVariable*, GetElement)(_In_ uint32_t Index) override; - - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)() override; - - // other casts are handled by TUncastableVariable - STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)() override; - - STDMETHOD(SetRawValue)(_In_reads_bytes_(Count) const void *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetRawValue)(_Out_writes_bytes_(Count) void *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - - STDMETHOD(SetConstantBuffer)(_In_ ID3D11Buffer *pConstantBuffer) override; - STDMETHOD(GetConstantBuffer)(_Outptr_ ID3D11Buffer **ppConstantBuffer) override; - STDMETHOD(UndoSetConstantBuffer)() override; - - STDMETHOD(SetTextureBuffer)(_In_ ID3D11ShaderResourceView *pTextureBuffer) override; - STDMETHOD(GetTextureBuffer)(_Outptr_ ID3D11ShaderResourceView **ppTextureBuffer) override; - STDMETHOD(UndoSetTextureBuffer)() override; - - // ID3DX11EffectType interface - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc) override; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(_In_z_ LPCSTR Name) override; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(_In_z_ LPCSTR Semantic) override; - - STDMETHOD_(LPCSTR, GetMemberName)(_In_ uint32_t Index) override; - STDMETHOD_(LPCSTR, GetMemberSemantic)(_In_ uint32_t Index) override; - - IUNKNOWN_IMP(SConstantBuffer, ID3DX11EffectConstantBuffer, ID3DX11EffectVariable); -}; - - -////////////////////////////////////////////////////////////////////////// -// Assignments -////////////////////////////////////////////////////////////////////////// - -enum ERuntimeAssignmentType -{ - ERAT_Invalid, - // [Destination] refers to the destination location, which is always the backing store of the pass/state block. - // [Source] refers to the current source of data, always coming from either a constant buffer's - // backing store (for numeric assignments), an object variable's block array, or an anonymous (unowned) block - - // Numeric variables: - ERAT_Constant, // Source is unused. - // No dependencies; this assignment can be safely removed after load. - ERAT_NumericVariable, // Source points to the CB's backing store where the value lives. - // 1 dependency: the variable itself. - ERAT_NumericConstIndex, // Source points to the CB's backing store where the value lives, offset by N. - // 1 dependency: the variable array being indexed. - ERAT_NumericVariableIndex, // Source points to the last used element of the variable in the CB's backing store. - // 2 dependencies: the index variable followed by the array variable. - - // Object variables: - ERAT_ObjectInlineShader, // An anonymous, immutable shader block pointer is copied to the destination immediately. - // No dependencies; this assignment can be safely removed after load. - ERAT_ObjectVariable, // A pointer to the block owned by the object variable is copied to the destination immediately. - // No dependencies; this assignment can be safely removed after load. - ERAT_ObjectConstIndex, // A pointer to the Nth block owned by an object variable is copied to the destination immediately. - // No dependencies; this assignment can be safely removed after load. - ERAT_ObjectVariableIndex, // Source points to the first block owned by an object variable array - // (the offset from this, N, is taken from another variable). - // 1 dependency: the variable being used to index the array. -}; - -struct SAssignment -{ - struct SDependency - { - SGlobalVariable *pVariable; - - SDependency() - { - pVariable = nullptr; - } - }; - - ELhsType LhsType; // PS, VS, DepthStencil etc. - - // The value of SAssignment.AssignmentType determines how the other fields behave - // (DependencyCount, pDependencies, Destination, and Source) - ERuntimeAssignmentType AssignmentType; - - Timer LastRecomputedTime; - - // see comments in ERuntimeAssignmentType for how dependencies and data pointers are handled - uint32_t DependencyCount; - SDependency *pDependencies; - - UDataPointer Destination; // This value never changes after load, and always refers to the backing store - UDataPointer Source; // This value, on the other hand, can change if variable- or expression- driven - - uint32_t DataSize : 16; // Size of the data element to be copied in bytes (if numeric) or - // stride of the block type (if object) - uint32_t MaxElements : 16; // Max allowable index (needed because we don't store object arrays as dependencies, - // and therefore have no way of getting their Element count) - - bool IsObjectAssignment() // True for Shader and RObject assignments (the type that appear in pass blocks) - { - return IsObjectAssignmentHelper(LhsType); - } - - SAssignment() - { - LhsType = ELHS_Invalid; - AssignmentType = ERAT_Invalid; - - Destination.pGeneric = nullptr; - Source.pGeneric = nullptr; - - LastRecomputedTime = 0; - DependencyCount = 0; - pDependencies = nullptr; - - DataSize = 0; - } -}; - -////////////////////////////////////////////////////////////////////////// -// Private effect heaps -////////////////////////////////////////////////////////////////////////// - -// Used to efficiently reallocate data -// 1) For every piece of data that needs reallocation, move it to its new location -// and add an entry into the table -// 2) For everyone that references one of these data blocks, do a quick table lookup -// to find the old pointer and then replace it with the new one -struct SPointerMapping -{ - void *pOld; - void *pNew; - - static bool AreMappingsEqual(const SPointerMapping &pMap1, const SPointerMapping &pMap2) - { - return (pMap1.pOld == pMap2.pOld); - } - - uint32_t Hash() - { - // hash the pointer itself - // (using the pointer as a hash would be very bad) - return ComputeHash((uint8_t*)&pOld, sizeof(pOld)); - } -}; - -typedef CEffectHashTableWithPrivateHeap CPointerMappingTable; - -// Assist adding data to a block of memory -class CEffectHeap -{ -protected: - uint8_t *m_pData; - uint32_t m_dwBufferSize; - uint32_t m_dwSize; - - template - HRESULT AddDataInternal(_In_reads_bytes_(dwSize) const void *pData, _In_ uint32_t dwSize, _Outptr_ void **ppPointer); - -public: - HRESULT ReserveMemory(uint32_t dwSize); - uint32_t GetSize(); - uint8_t* GetDataStart() { return m_pData; } - - // AddData and AddString append existing data to the buffer - they change m_dwSize. Users are - // not expected to modify the data pointed to by the return pointer - HRESULT AddString(_In_z_ const char *pString, _Outptr_result_z_ char **ppPointer); - HRESULT AddData(_In_reads_(dwSize) const void *pData, _In_ uint32_t dwSize, _Outptr_ void **ppPointer); - - // Allocate behaves like a standard new - it will allocate memory, move m_dwSize. The caller is - // expected to use the returned pointer - void* Allocate(uint32_t dwSize); - - // Move data from the general heap and optional free memory - HRESULT MoveData(_Inout_updates_bytes_(size) void **ppData, _In_ uint32_t size); - HRESULT MoveString(_Inout_updates_z_(1) char **ppStringData); - HRESULT MoveInterfaceParameters(_In_ uint32_t InterfaceCount, _Inout_updates_(1) SShaderBlock::SInterfaceParameter **ppInterfaces); - HRESULT MoveEmptyDataBlock(_Inout_updates_(1) void **ppData, _In_ uint32_t size); - - bool IsInHeap(_In_ void *pData) const - { - return (pData >= m_pData && pData < (m_pData + m_dwBufferSize)); - } - - CEffectHeap(); - ~CEffectHeap(); -}; - -class CEffectReflection -{ -public: - // Single memory block support - CEffectHeap m_Heap; -}; - - -class CEffect : public ID3DX11Effect -{ - friend struct SBaseBlock; - friend struct SPassBlock; - friend class CEffectLoader; - friend struct SConstantBuffer; - friend struct TSamplerVariable>; - friend struct TSamplerVariable>>; - -protected: - - uint32_t m_RefCount; - uint32_t m_Flags; - - // Private heap - all pointers should point into here - CEffectHeap m_Heap; - - // Reflection object - CEffectReflection *m_pReflection; - - // global variables in the effect (aka parameters) - uint32_t m_VariableCount; - SGlobalVariable *m_pVariables; - - // anonymous shader variables (one for every inline shader assignment) - uint32_t m_AnonymousShaderCount; - SAnonymousShader *m_pAnonymousShaders; - - // techniques within this effect (the actual data is located in each group) - uint32_t m_TechniqueCount; - - // groups within this effect - uint32_t m_GroupCount; - SGroup *m_pGroups; - SGroup *m_pNullGroup; - - uint32_t m_ShaderBlockCount; - SShaderBlock *m_pShaderBlocks; - - uint32_t m_DepthStencilBlockCount; - SDepthStencilBlock *m_pDepthStencilBlocks; - - uint32_t m_BlendBlockCount; - SBlendBlock *m_pBlendBlocks; - - uint32_t m_RasterizerBlockCount; - SRasterizerBlock *m_pRasterizerBlocks; - - uint32_t m_SamplerBlockCount; - SSamplerBlock *m_pSamplerBlocks; - - uint32_t m_MemberDataCount; - SMemberDataPointer *m_pMemberDataBlocks; - - uint32_t m_InterfaceCount; - SInterface *m_pInterfaces; - - uint32_t m_CBCount; - SConstantBuffer *m_pCBs; - - uint32_t m_StringCount; - SString *m_pStrings; - - uint32_t m_ShaderResourceCount; - SShaderResource *m_pShaderResources; - - uint32_t m_UnorderedAccessViewCount; - SUnorderedAccessView *m_pUnorderedAccessViews; - - uint32_t m_RenderTargetViewCount; - SRenderTargetView *m_pRenderTargetViews; - - uint32_t m_DepthStencilViewCount; - SDepthStencilView *m_pDepthStencilViews; - - Timer m_LocalTimer; - - // temporary index variable for assignment evaluation - uint32_t m_FXLIndex; - - ID3D11Device *m_pDevice; - ID3D11DeviceContext *m_pContext; - ID3D11ClassLinkage *m_pClassLinkage; - - // Master lists of reflection interfaces - CEffectVectorOwner m_pTypeInterfaces; - CEffectVectorOwner m_pMemberInterfaces; - - ////////////////////////////////////////////////////////////////////////// - // String & Type pooling - - typedef SType *LPSRUNTIMETYPE; - static bool AreTypesEqual(const LPSRUNTIMETYPE &pType1, const LPSRUNTIMETYPE &pType2) { return (pType1->IsEqual(pType2)); } - static bool AreStringsEqual(const LPCSTR &pStr1, const LPCSTR &pStr2) { return strcmp(pStr1, pStr2) == 0; } - - typedef CEffectHashTableWithPrivateHeap CTypeHashTable; - typedef CEffectHashTableWithPrivateHeap CStringHashTable; - - // These are used to pool types & type-related strings - // until Optimize() is called - CTypeHashTable *m_pTypePool; - CStringHashTable *m_pStringPool; - CDataBlockStore *m_pPooledHeap; - // After Optimize() is called, the type/string pools should be deleted and all - // remaining data should be migrated into the optimized type heap - CEffectHeap *m_pOptimizedTypeHeap; - - // Pools a string or type and modifies the pointer - void AddStringToPool(const char **ppString); - void AddTypeToPool(SType **ppType); - - HRESULT OptimizeTypes(_Inout_ CPointerMappingTable *pMappingTable, _In_ bool Cloning = false); - - - ////////////////////////////////////////////////////////////////////////// - // Runtime (performance critical) - - void ApplyShaderBlock(_In_ SShaderBlock *pBlock); - bool ApplyRenderStateBlock(_In_ SBaseBlock *pBlock); - bool ApplySamplerBlock(_In_ SSamplerBlock *pBlock); - void ApplyPassBlock(_Inout_ SPassBlock *pBlock); - bool EvaluateAssignment(_Inout_ SAssignment *pAssignment); - bool ValidateShaderBlock(_Inout_ SShaderBlock* pBlock ); - bool ValidatePassBlock(_Inout_ SPassBlock* pBlock ); - - ////////////////////////////////////////////////////////////////////////// - // Non-runtime functions (not performance critical) - - SGlobalVariable *FindLocalVariableByName(_In_z_ LPCSTR pVarName); // Looks in the current effect only - SGlobalVariable *FindVariableByName(_In_z_ LPCSTR pVarName); - SVariable *FindVariableByNameWithParsing(_In_z_ LPCSTR pVarName); - SConstantBuffer *FindCB(_In_z_ LPCSTR pName); - void ReplaceCBReference(_In_ SConstantBuffer *pOldBufferBlock, _In_ ID3D11Buffer *pNewBuffer); // Used by user-managed CBs - void ReplaceSamplerReference(_In_ SSamplerBlock *pOldSamplerBlock, _In_ ID3D11SamplerState *pNewSampler); - void AddRefAllForCloning( _In_ CEffect* pEffectSource ); - HRESULT CopyMemberInterfaces( _In_ CEffect* pEffectSource ); - HRESULT CopyStringPool( _In_ CEffect* pEffectSource, _Inout_ CPointerMappingTable& mappingTable ); - HRESULT CopyTypePool( _In_ CEffect* pEffectSource, _Inout_ CPointerMappingTable& mappingTableTypes, _Inout_ CPointerMappingTable& mappingTableStrings ); - HRESULT CopyOptimizedTypePool( _In_ CEffect* pEffectSource, _Inout_ CPointerMappingTable& mappingTableTypes ); - HRESULT RecreateCBs(); - HRESULT FixupMemberInterface( _Inout_ SMember* pMember, _In_ CEffect* pEffectSource, _Inout_ CPointerMappingTable& mappingTableStrings ); - - void ValidateIndex(_In_ uint32_t Elements); - - void IncrementTimer(); - void HandleLocalTimerRollover(); - - friend struct SConstantBuffer; - -public: - CEffect( uint32_t Flags = 0 ); - virtual ~CEffect(); - void ReleaseShaderRefection(); - - // Initialize must be called after the effect is created - HRESULT LoadEffect(_In_reads_bytes_(cbEffectBuffer) const void *pEffectBuffer, _In_ uint32_t cbEffectBuffer); - - // Once the effect is fully loaded, call BindToDevice to attach it to a device - HRESULT BindToDevice(_In_ ID3D11Device *pDevice, _In_z_ LPCSTR srcName ); - - Timer GetCurrentTime() const { return m_LocalTimer; } - - bool IsReflectionData(void *pData) const { return m_pReflection->m_Heap.IsInHeap(pData); } - bool IsRuntimeData(void *pData) const { return m_Heap.IsInHeap(pData); } - - ////////////////////////////////////////////////////////////////////////// - // Public interface - - // IUnknown - STDMETHOD(QueryInterface)(REFIID iid, _COM_Outptr_ LPVOID *ppv) override; - STDMETHOD_(ULONG, AddRef)() override; - STDMETHOD_(ULONG, Release)() override; - - // ID3DX11Effect - STDMETHOD_(bool, IsValid)() override { return true; } - - STDMETHOD(GetDevice)(_Outptr_ ID3D11Device** ppDevice) override; - - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_DESC *pDesc) override; - - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetConstantBufferByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetConstantBufferByName)(_In_z_ LPCSTR Name) override; - - STDMETHOD_(ID3DX11EffectVariable*, GetVariableByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectVariable*, GetVariableByName)(_In_z_ LPCSTR Name) override; - STDMETHOD_(ID3DX11EffectVariable*, GetVariableBySemantic)(_In_z_ LPCSTR Semantic) override; - - STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByName)(_In_z_ LPCSTR Name) override; - - STDMETHOD_(ID3DX11EffectGroup*, GetGroupByIndex)(_In_ uint32_t Index) override; - STDMETHOD_(ID3DX11EffectGroup*, GetGroupByName)(_In_z_ LPCSTR Name) override; - - STDMETHOD_(ID3D11ClassLinkage*, GetClassLinkage)() override; - - STDMETHOD(CloneEffect)(_In_ uint32_t Flags, _Outptr_ ID3DX11Effect** ppClonedEffect) override; - STDMETHOD(Optimize)() override; - STDMETHOD_(bool, IsOptimized)() override; - - ////////////////////////////////////////////////////////////////////////// - // New reflection helpers - - ID3DX11EffectType * CreatePooledSingleElementTypeInterface(_In_ SType *pType); - ID3DX11EffectVariable * CreatePooledVariableMemberInterface(_In_ TTopLevelVariable *pTopLevelEntity, - _In_ const SVariable *pMember, - _In_ const UDataPointer Data, _In_ bool IsSingleElement, _In_ uint32_t Index); - -}; - -} - -#pragma warning(pop) diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectLoad.cpp kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectLoad.cpp --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectLoad.cpp 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectLoad.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,4002 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: EffectLoad.cpp -// -// Direct3D Effects file loading code -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#include "pchfx.h" - -#include "EffectStates11.h" - -#define PRIVATENEW new(m_BulkHeap) - -namespace D3DX11Effects -{ - -static LPCSTR g_szEffectLoadArea = "D3D11EffectLoader"; - -SRasterizerBlock g_NullRasterizer; -SDepthStencilBlock g_NullDepthStencil; -SBlendBlock g_NullBlend; -SShaderResource g_NullTexture; -SInterface g_NullInterface; -SUnorderedAccessView g_NullUnorderedAccessView; -SRenderTargetView g_NullRenderTargetView; -SDepthStencilView g_NullDepthStencilView; - -// these VTables must be setup in the proper order: -// 1) SetShader -// 2) SetConstantBuffers -// 3) SetSamplers -// 4) SetShaderResources -// 5) CreateShader -SD3DShaderVTable g_vtPS = { - (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, uint32_t)) &ID3D11DeviceContext::PSSetShader, - &ID3D11DeviceContext::PSSetConstantBuffers, - &ID3D11DeviceContext::PSSetSamplers, - &ID3D11DeviceContext::PSSetShaderResources, - (HRESULT (__stdcall ID3D11Device::*)(const void *, size_t, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreatePixelShader -}; - -SD3DShaderVTable g_vtVS = { - (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, uint32_t)) &ID3D11DeviceContext::VSSetShader, - &ID3D11DeviceContext::VSSetConstantBuffers, - &ID3D11DeviceContext::VSSetSamplers, - &ID3D11DeviceContext::VSSetShaderResources, - (HRESULT (__stdcall ID3D11Device::*)(const void *, size_t, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreateVertexShader -}; - -SD3DShaderVTable g_vtGS = { - (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, uint32_t)) &ID3D11DeviceContext::GSSetShader, - &ID3D11DeviceContext::GSSetConstantBuffers, - &ID3D11DeviceContext::GSSetSamplers, - &ID3D11DeviceContext::GSSetShaderResources, - (HRESULT (__stdcall ID3D11Device::*)(const void *, size_t, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreateGeometryShader -}; - -SD3DShaderVTable g_vtHS = { - (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, uint32_t)) &ID3D11DeviceContext::HSSetShader, - &ID3D11DeviceContext::HSSetConstantBuffers, - &ID3D11DeviceContext::HSSetSamplers, - &ID3D11DeviceContext::HSSetShaderResources, - (HRESULT (__stdcall ID3D11Device::*)(const void *, size_t, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreateHullShader -}; - -SD3DShaderVTable g_vtDS = { - (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, uint32_t)) &ID3D11DeviceContext::DSSetShader, - &ID3D11DeviceContext::DSSetConstantBuffers, - &ID3D11DeviceContext::DSSetSamplers, - &ID3D11DeviceContext::DSSetShaderResources, - (HRESULT (__stdcall ID3D11Device::*)(const void *, size_t, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreateDomainShader -}; - -SD3DShaderVTable g_vtCS = { - (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, uint32_t)) &ID3D11DeviceContext::CSSetShader, - &ID3D11DeviceContext::CSSetConstantBuffers, - &ID3D11DeviceContext::CSSetSamplers, - &ID3D11DeviceContext::CSSetShaderResources, - (HRESULT (__stdcall ID3D11Device::*)(const void *, size_t, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreateComputeShader -}; - -SShaderBlock g_NullVS(&g_vtVS); -SShaderBlock g_NullGS(&g_vtGS); -SShaderBlock g_NullPS(&g_vtPS); -SShaderBlock g_NullHS(&g_vtHS); -SShaderBlock g_NullDS(&g_vtDS); -SShaderBlock g_NullCS(&g_vtCS); - -D3D_SHADER_VARIABLE_TYPE GetSimpleParameterTypeFromObjectType(EObjectType ObjectType) -{ - switch (ObjectType) - { - case EOT_String: - return D3D_SVT_STRING; - case EOT_Blend: - return D3D_SVT_BLEND; - case EOT_DepthStencil: - return D3D_SVT_DEPTHSTENCIL; - case EOT_Rasterizer: - return D3D_SVT_RASTERIZER; - case EOT_PixelShader: - case EOT_PixelShader5: - return D3D_SVT_PIXELSHADER; - case EOT_VertexShader: - case EOT_VertexShader5: - return D3D_SVT_VERTEXSHADER; - case EOT_GeometryShader: - case EOT_GeometryShaderSO: - case EOT_GeometryShader5: - return D3D_SVT_GEOMETRYSHADER; - case EOT_HullShader5: - return D3D_SVT_HULLSHADER; - case EOT_DomainShader5: - return D3D_SVT_DOMAINSHADER; - case EOT_ComputeShader5: - return D3D_SVT_COMPUTESHADER; - case EOT_RenderTargetView: - return D3D_SVT_RENDERTARGETVIEW; - case EOT_DepthStencilView: - return D3D_SVT_DEPTHSTENCILVIEW; - case EOT_Texture: - case EOT_Texture1D: - case EOT_Texture1DArray: - case EOT_Texture2D: - case EOT_Texture2DArray: - case EOT_Texture2DMS: - case EOT_Texture2DMSArray: - case EOT_Texture3D: - case EOT_TextureCube: - case EOT_TextureCubeArray: - return D3D_SVT_TEXTURE; - case EOT_Buffer: - return D3D_SVT_BUFFER; - case EOT_Sampler: - return D3D_SVT_SAMPLER; - case EOT_ByteAddressBuffer: - return D3D_SVT_BYTEADDRESS_BUFFER; - case EOT_StructuredBuffer: - return D3D_SVT_STRUCTURED_BUFFER; - case EOT_RWTexture1D: - return D3D_SVT_RWTEXTURE1D; - case EOT_RWTexture1DArray: - return D3D_SVT_RWTEXTURE1DARRAY; - case EOT_RWTexture2D: - return D3D_SVT_RWTEXTURE2D; - case EOT_RWTexture2DArray: - return D3D_SVT_RWTEXTURE2DARRAY; - case EOT_RWTexture3D: - return D3D_SVT_RWTEXTURE3D; - case EOT_RWBuffer: - return D3D_SVT_RWBUFFER; - case EOT_RWByteAddressBuffer: - return D3D_SVT_RWBYTEADDRESS_BUFFER; - case EOT_RWStructuredBuffer: - case EOT_RWStructuredBufferAlloc: - case EOT_RWStructuredBufferConsume: - return D3D_SVT_RWSTRUCTURED_BUFFER; - case EOT_AppendStructuredBuffer: - return D3D_SVT_APPEND_STRUCTURED_BUFFER; - case EOT_ConsumeStructuredBuffer: - return D3D_SVT_CONSUME_STRUCTURED_BUFFER; - default: - assert(0); - } - return D3D_SVT_VOID; -} - -inline HRESULT VerifyPointer(uint32_t oBase, uint32_t dwSize, uint32_t dwMaxSize) -{ - uint32_t dwAdd = oBase + dwSize; - if (dwAdd < oBase || dwAdd > dwMaxSize) - return E_FAIL; - return S_OK; -} - -////////////////////////////////////////////////////////////////////////// -// EffectHeap -// A simple class which assists in adding data to a block of memory -////////////////////////////////////////////////////////////////////////// - -CEffectHeap::CEffectHeap() : m_pData(nullptr), m_dwSize(0), m_dwBufferSize(0) -{ -} - -CEffectHeap::~CEffectHeap() -{ - SAFE_DELETE_ARRAY(m_pData); -} - -uint32_t CEffectHeap::GetSize() -{ - return m_dwSize; -} - -HRESULT CEffectHeap::ReserveMemory(uint32_t dwSize) -{ - HRESULT hr = S_OK; - - assert(!m_pData); - assert(dwSize == AlignToPowerOf2(dwSize, c_DataAlignment)); - - m_dwBufferSize = dwSize; - - VN( m_pData = new uint8_t[m_dwBufferSize] ); - - // make sure that we have machine word alignment - assert(m_pData == AlignToPowerOf2(m_pData, c_DataAlignment)); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT CEffectHeap::AddString(const char *pString, char **ppPointer) -{ - size_t size = strlen(pString) + 1; - assert( size <= 0xffffffff ); - return AddData(pString, (uint32_t)size, (void**) ppPointer); -} - -// This data is forcibly aligned, so make sure you account for that in calculating heap size -template -HRESULT CEffectHeap::AddDataInternal(_In_reads_bytes_(dwSize) const void *pData, _In_ uint32_t dwSize, _Outptr_ void **ppPointer) -{ - CCheckedDword chkFinalSize( m_dwSize ); - uint32_t finalSize; - HRESULT hr = S_OK; - - chkFinalSize += dwSize; - chkFinalSize += c_DataAlignment; // account for alignment - - VHD( chkFinalSize.GetValue(&finalSize), "Overflow while adding data to Effect heap." ); - - // align original value - finalSize = AlignToPowerOf2(finalSize - c_DataAlignment, c_DataAlignment); - VBD( finalSize <= m_dwBufferSize, "Overflow adding data to Effect heap." ); - - *ppPointer = m_pData + m_dwSize; - assert(*ppPointer == AlignToPowerOf2(*ppPointer, c_DataAlignment)); - - if( bCopyData ) - { - memcpy(*ppPointer, pData, dwSize); - } - m_dwSize = finalSize; - -lExit: - if (FAILED(hr)) - *ppPointer = nullptr; - - return hr; -} - -_Use_decl_annotations_ -HRESULT CEffectHeap::AddData(const void *pData, uint32_t dwSize, void **ppPointer) -{ - return AddDataInternal( pData, dwSize, ppPointer ); -} - -// Moves a string from the general heap to the private heap and modifies the pointer to -// point to the new memory block. -// The general heap is freed as a whole, so we don't worry about leaking the given string pointer. -// This data is forcibly aligned, so make sure you account for that in calculating heap size -_Use_decl_annotations_ -HRESULT CEffectHeap::MoveString(char **ppString) -{ - HRESULT hr; - char *pNewPointer; - - if (*ppString == nullptr) - return S_OK; - - hr = AddString(*ppString, &pNewPointer); - if ( SUCCEEDED(hr) ) - *ppString = pNewPointer; - - return hr; -} - -// Allocates space but does not move data -// The general heap is freed as a whole, so we don't worry about leaking the given string pointer. -// This data is forcibly aligned, so make sure you account for that in calculating heap size -_Use_decl_annotations_ -HRESULT CEffectHeap::MoveEmptyDataBlock(void **ppData, uint32_t size) -{ - HRESULT hr; - void *pNewPointer; - - hr = AddDataInternal(*ppData, size, &pNewPointer); - - if (SUCCEEDED(hr)) - { - *ppData = pNewPointer; - if (size == 0) - { - // To help catch bugs, set zero-byte blocks to null. There's no real reason to do this - *ppData = nullptr; - } - } - - return hr; -} - -// Moves an array of SInterfaceParameters from the general heap to the private heap and modifies the pointer to -// point to the new memory block. -// The general heap is freed as a whole, so we don't worry about leaking the given string pointer. -// This data is forcibly aligned, so make sure you account for that in calculating heap size -_Use_decl_annotations_ -HRESULT CEffectHeap::MoveInterfaceParameters(uint32_t InterfaceCount, SShaderBlock::SInterfaceParameter **ppInterfaces) -{ - HRESULT hr; - SShaderBlock::SInterfaceParameter *pNewPointer; - - if (*ppInterfaces == nullptr) - return S_OK; - - VBD( InterfaceCount <= D3D11_SHADER_MAX_INTERFACES, "Internal loading error: InterfaceCount > D3D11_SHADER_MAX_INTERFACES." ); - VH( AddData(*ppInterfaces, InterfaceCount * sizeof(SShaderBlock::SInterfaceParameter), (void**)&pNewPointer) ); - - for( size_t i=0; i < InterfaceCount; i++ ) - { - VH( MoveString( &pNewPointer[i].pName ) ); - } - - *ppInterfaces = pNewPointer; - -lExit: - return hr; -} - - -// Moves data from the general heap to the private heap and modifies the pointer to -// point to the new memory block -// The general heap is freed as a whole, so we don't worry about leaking the given pointer. -// This data is forcibly aligned, so make sure you account for that in calculating heap size -_Use_decl_annotations_ -HRESULT CEffectHeap::MoveData(void **ppData, uint32_t size) -{ - HRESULT hr; - void *pNewPointer; - - hr = AddData(*ppData, size, &pNewPointer); - if ( SUCCEEDED(hr) ) - { - *ppData = pNewPointer; - if (size == 0) - { - // To help catch bugs, set zero-byte blocks to null. There's no real reason to do this - *ppData = nullptr; - } - } - - return hr; -} - - -////////////////////////////////////////////////////////////////////////// -// Load API -////////////////////////////////////////////////////////////////////////// - -_Use_decl_annotations_ -HRESULT CEffect::LoadEffect(const void *pEffectBuffer, uint32_t cbEffectBuffer) -{ - HRESULT hr = S_OK; - CEffectLoader loader; - - if (!pEffectBuffer) - { - DPF(0, "%s: pEffectBuffer is nullptr.", g_szEffectLoadArea); - VH( E_INVALIDARG ); - } - - VH( loader.LoadEffect(this, pEffectBuffer, cbEffectBuffer) ); - -lExit: - if( FAILED( hr ) ) - { - // Release here because m_pShaderBlocks may still be in loader.m_BulkHeap if loading failed before we reallocated the memory - ReleaseShaderRefection(); - } - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// CEffectLoader -// A helper class which loads an effect -////////////////////////////////////////////////////////////////////////// - -_Use_decl_annotations_ -HRESULT CEffectLoader::GetUnstructuredDataBlock(uint32_t offset, uint32_t *pdwSize, void **ppData) -{ - HRESULT hr = S_OK; - uint32_t *pBlockSize; - - VH( m_msUnstructured.ReadAtOffset(offset, sizeof(*pBlockSize), (void**) &pBlockSize ) ); - *pdwSize = *pBlockSize; - - VH( m_msUnstructured.Read(ppData, *pdwSize) ); - -lExit: - return hr; -} - -// position in buffer is lost on error -// -// This function should be used in 1:1 conjunction with CEffectHeap::MoveString; -// that is, any string added to the reflection heap with this function -// must be relocated with MoveString at some point later on. -_Use_decl_annotations_ -HRESULT CEffectLoader::GetStringAndAddToReflection(uint32_t offset, char **ppString) -{ - HRESULT hr = S_OK; - LPCSTR pName; - size_t oldPos; - - if (offset == 0) - { - *ppString = nullptr; - goto lExit; - } - - oldPos = m_msUnstructured.GetPosition(); - - VH( m_msUnstructured.ReadAtOffset(offset, &pName) ); - m_ReflectionMemory += AlignToPowerOf2( (uint32_t)strlen(pName) + 1, c_DataAlignment); - *ppString = const_cast(pName); - - m_msUnstructured.Seek(oldPos); - -lExit: - return hr; -} - -// position in buffer is lost on error -// -// This function should be used in 1:1 conjunction with CEffectHeap::MoveInterfaceParameters; -// that is, any array of parameters added to the reflection heap with this function -// must be relocated with MoveInterfaceParameters at some point later on. -_Use_decl_annotations_ -HRESULT CEffectLoader::GetInterfaceParametersAndAddToReflection( uint32_t InterfaceCount, uint32_t offset, SShaderBlock::SInterfaceParameter **ppInterfaces ) -{ - HRESULT hr = S_OK; - SBinaryInterfaceInitializer* pInterfaceInitializer; - size_t oldPos; - - if (offset == 0) - { - *ppInterfaces = nullptr; - goto lExit; - } - - oldPos = m_msUnstructured.GetPosition(); - - VBD( InterfaceCount <= D3D11_SHADER_MAX_INTERFACES, "Internal loading error: InterfaceCount > D3D11_SHADER_MAX_INTERFACES." ); - m_ReflectionMemory += AlignToPowerOf2(InterfaceCount * sizeof(SShaderBlock::SInterfaceParameter), c_DataAlignment); - assert( ppInterfaces != 0 ); - _Analysis_assume_( ppInterfaces != 0 ); - (*ppInterfaces) = PRIVATENEW SShaderBlock::SInterfaceParameter[InterfaceCount]; - VN( *ppInterfaces ); - - VHD( m_msUnstructured.ReadAtOffset(offset, sizeof(SBinaryInterfaceInitializer) * InterfaceCount, (void**)&pInterfaceInitializer), - "Invalid pEffectBuffer: cannot read interface initializer." ); - - for( size_t i=0; i < InterfaceCount; i++ ) - { - (*ppInterfaces)[i].Index = pInterfaceInitializer[i].ArrayIndex; - VHD( m_msUnstructured.ReadAtOffset(pInterfaceInitializer[i].oInstanceName, const_cast(&(*ppInterfaces)[i].pName)), - "Invalid pEffectBuffer: cannot read interface initializer." ); - m_ReflectionMemory += AlignToPowerOf2( (uint32_t)strlen((*ppInterfaces)[i].pName) + 1, c_DataAlignment); - } - - m_msUnstructured.Seek(oldPos); - -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupCBPointer(_Inout_ SConstantBuffer **ppCB) -{ - HRESULT hr = S_OK; - - size_t index = (SConstantBuffer*)*ppCB - m_pOldCBs; - assert( index * sizeof(SConstantBuffer) == ((size_t)(SConstantBuffer*)*ppCB - (size_t)m_pOldCBs) ); - VBD( index < m_pEffect->m_CBCount, "Internal loading error: invalid constant buffer index." ); - *ppCB = (SConstantBuffer*)(m_pEffect->m_pCBs + index); - -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupShaderPointer(_Inout_ SShaderBlock **ppShaderBlock) -{ - HRESULT hr = S_OK; - if (*ppShaderBlock != &g_NullVS && *ppShaderBlock != &g_NullGS && *ppShaderBlock != &g_NullPS && - *ppShaderBlock != &g_NullHS && *ppShaderBlock != &g_NullDS && *ppShaderBlock != &g_NullCS && - *ppShaderBlock != nullptr) - { - size_t index = *ppShaderBlock - m_pOldShaders; - assert( index * sizeof(SShaderBlock) == ((size_t)*ppShaderBlock - (size_t)m_pOldShaders) ); - VBD( index < m_pEffect->m_ShaderBlockCount, "Internal loading error: invalid shader index." ); - *ppShaderBlock = m_pEffect->m_pShaderBlocks + index; - } -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupDSPointer(_Inout_ SDepthStencilBlock **ppDSBlock) -{ - HRESULT hr = S_OK; - if (*ppDSBlock != &g_NullDepthStencil && *ppDSBlock != nullptr) - { - size_t index = *ppDSBlock - m_pOldDS; - assert( index * sizeof(SDepthStencilBlock) == ((size_t)*ppDSBlock - (size_t)m_pOldDS) ); - VBD( index < m_pEffect->m_DepthStencilBlockCount, "Internal loading error: invalid depth-stencil state index." ); - *ppDSBlock = m_pEffect->m_pDepthStencilBlocks + index; - } -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupABPointer(_Inout_ SBlendBlock **ppABBlock) -{ - HRESULT hr = S_OK; - if (*ppABBlock != &g_NullBlend && *ppABBlock != nullptr) - { - size_t index = *ppABBlock - m_pOldAB; - assert( index * sizeof(SBlendBlock) == ((size_t)*ppABBlock - (size_t)m_pOldAB) ); - VBD( index < m_pEffect->m_BlendBlockCount, "Internal loading error: invalid blend state index." ); - *ppABBlock = m_pEffect->m_pBlendBlocks + index; - } -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupRSPointer(_Inout_ SRasterizerBlock **ppRSBlock) -{ - HRESULT hr = S_OK; - if (*ppRSBlock != &g_NullRasterizer && *ppRSBlock != nullptr) - { - size_t index = *ppRSBlock - m_pOldRS; - assert( index * sizeof(SRasterizerBlock) == ((size_t)*ppRSBlock - (size_t)m_pOldRS) ); - VBD( index < m_pEffect->m_RasterizerBlockCount, "Internal loading error: invalid rasterizer state index." ); - *ppRSBlock = m_pEffect->m_pRasterizerBlocks + index; - } -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupSamplerPointer(_Inout_ SSamplerBlock **ppSampler) -{ - HRESULT hr = S_OK; - size_t index = *ppSampler - m_pOldSamplers; - assert( index * sizeof(SSamplerBlock) == ((size_t)*ppSampler - (size_t)m_pOldSamplers) ); - VBD( index < m_pEffect->m_SamplerBlockCount, "Internal loading error: invalid sampler index." ); - *ppSampler = m_pEffect->m_pSamplerBlocks + index; - -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupInterfacePointer(_Inout_ SInterface **ppInterface, _In_ bool CheckBackgroundInterfaces) -{ - HRESULT hr = S_OK; - if (*ppInterface != &g_NullInterface && *ppInterface != nullptr) - { - size_t index = *ppInterface - m_pOldInterfaces; - if(index < m_OldInterfaceCount) - { - assert( index * sizeof(SInterface) == ((size_t)*ppInterface - (size_t)m_pOldInterfaces) ); - *ppInterface = m_pEffect->m_pInterfaces + index; - } - else - { - VBD( CheckBackgroundInterfaces, "Internal loading error: invalid interface pointer." ); - for( index=0; index < m_BackgroundInterfaces.GetSize(); index++ ) - { - if( *ppInterface == m_BackgroundInterfaces[ (uint32_t)index ] ) - { - // The interfaces m_BackgroundInterfaces were concatenated to the original ones in m_pEffect->m_pInterfaces - *ppInterface = m_pEffect->m_pInterfaces + (m_OldInterfaceCount + index); - break; - } - } - VBD( index < m_BackgroundInterfaces.GetSize(), "Internal loading error: invalid interface pointer." ); - } - } - -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupShaderResourcePointer(_Inout_ SShaderResource **ppResource) -{ - HRESULT hr = S_OK; - if (*ppResource != &g_NullTexture && *ppResource != nullptr) - { - size_t index = *ppResource - m_pOldShaderResources; - assert( index * sizeof(SShaderResource) == ((size_t)*ppResource - (size_t)m_pOldShaderResources) ); - - // could be a TBuffer or a texture; better check first - if (index < m_pEffect->m_ShaderResourceCount) - { - *ppResource = m_pEffect->m_pShaderResources + index; - } - else - { - // if this is a TBuffer, then the shader resource pointer - // actually points into a SConstantBuffer's TBuffer field - index = (SConstantBuffer*)*ppResource - (SConstantBuffer*)&m_pOldCBs->TBuffer; - assert( index * sizeof(SConstantBuffer) == ((size_t)(SConstantBuffer*)*ppResource - (size_t)(SConstantBuffer*)&m_pOldCBs->TBuffer) ); - VBD( index < m_pEffect->m_CBCount, "Internal loading error: invalid SRV index." ); - *ppResource = &m_pEffect->m_pCBs[index].TBuffer; - } - } - -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupUnorderedAccessViewPointer(_Inout_ SUnorderedAccessView **ppUnorderedAccessView) -{ - HRESULT hr = S_OK; - if (*ppUnorderedAccessView != &g_NullUnorderedAccessView && *ppUnorderedAccessView != nullptr) - { - size_t index = *ppUnorderedAccessView - m_pOldUnorderedAccessViews; - assert( index * sizeof(SUnorderedAccessView) == ((size_t)*ppUnorderedAccessView - (size_t)m_pOldUnorderedAccessViews) ); - - VBD( index < m_pEffect->m_UnorderedAccessViewCount, "Internal loading error: invalid UAV index." ); - *ppUnorderedAccessView = m_pEffect->m_pUnorderedAccessViews + index; - } - -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupRenderTargetViewPointer(_Inout_ SRenderTargetView **ppRenderTargetView) -{ - HRESULT hr = S_OK; - if (*ppRenderTargetView != &g_NullRenderTargetView && *ppRenderTargetView != nullptr) - { - size_t index = *ppRenderTargetView - m_pOldRenderTargetViews; - assert( index * sizeof(SRenderTargetView) == ((size_t)*ppRenderTargetView - (size_t)m_pOldRenderTargetViews) ); - VBD( index < m_pEffect->m_RenderTargetViewCount, "Internal loading error: invalid RTV index." ); - *ppRenderTargetView = m_pEffect->m_pRenderTargetViews + index; - } - -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupDepthStencilViewPointer(_Inout_ SDepthStencilView **ppDepthStencilView) -{ - HRESULT hr = S_OK; - if (*ppDepthStencilView != &g_NullDepthStencilView && *ppDepthStencilView != nullptr) - { - size_t index = *ppDepthStencilView - m_pOldDepthStencilViews; - assert( index * sizeof(SDepthStencilView) == ((size_t)*ppDepthStencilView - (size_t)m_pOldDepthStencilViews) ); - VBD( index < m_pEffect->m_DepthStencilViewCount, "Internal loading error: invalid DSV index." ); - *ppDepthStencilView = m_pEffect->m_pDepthStencilViews + index; - } - -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupStringPointer(_Inout_ SString **ppString) -{ - HRESULT hr = S_OK; - size_t index = *ppString - m_pOldStrings; - assert( index * sizeof(SString) == ((size_t)*ppString - (size_t)m_pOldStrings) ); - VBD(index < m_pEffect->m_StringCount, "Internal loading error: invalid string index." ); - *ppString = m_pEffect->m_pStrings + index; -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupMemberDataPointer(_Inout_ SMemberDataPointer **ppMemberData) -{ - HRESULT hr = S_OK; - size_t index = *ppMemberData - m_pOldMemberDataBlocks; - assert( index * sizeof(SMemberDataPointer) == ((size_t)*ppMemberData - (size_t)m_pOldMemberDataBlocks) ); - VBD( index < m_pEffect->m_MemberDataCount, "Internal loading error: invalid member block index." ); - *ppMemberData = m_pEffect->m_pMemberDataBlocks + index; -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupVariablePointer(_Inout_ SGlobalVariable **ppVar) -{ - HRESULT hr = S_OK; - size_t index = *ppVar - m_pOldVars; - - if( index < m_pEffect->m_VariableCount ) - { - assert( index * sizeof(SGlobalVariable) == ((size_t)*ppVar - (size_t)m_pOldVars) ); - *ppVar = m_pEffect->m_pVariables + index; - } - else if( m_pvOldMemberInterfaces ) - { - // When cloning, m_pvOldMemberInterfaces may be non-nullptr, and *ppVar may point to a variable in it. - const size_t Members = m_pvOldMemberInterfaces->GetSize(); - for( index=0; index < Members; index++ ) - { - if( (ID3DX11EffectVariable*)(*m_pvOldMemberInterfaces)[ (uint32_t)index] == (ID3DX11EffectVariable*)*ppVar ) - { - break; - } - } - VBD( index < Members, "Internal loading error: invalid member pointer." ); - *ppVar = (SGlobalVariable*)m_pEffect->m_pMemberInterfaces[ (uint32_t)index]; - } -lExit: - return hr; -} - -HRESULT CEffectLoader::FixupGroupPointer(_Inout_ SGroup **ppGroup) -{ - HRESULT hr = S_OK; - if( *ppGroup != nullptr ) - { - size_t index = *ppGroup - m_pOldGroups; - assert( index * sizeof(SGroup) == ((size_t)*ppGroup - (size_t)m_pOldGroups) ); - VBD( index < m_pEffect->m_GroupCount, "Internal loading error: invalid group index." ); - *ppGroup = m_pEffect->m_pGroups + index; - } -lExit: - return hr; -} - -static HRESULT GetEffectVersion( _In_ uint32_t effectFileTag, _Out_ DWORD* pVersion ) -{ - assert( pVersion != nullptr ); - if( !pVersion ) - return E_FAIL; - - for( size_t i = 0; i < _countof(g_EffectVersions); i++ ) - { - if( g_EffectVersions[i].m_Tag == effectFileTag ) - { - *pVersion = g_EffectVersions[i].m_Version; - return S_OK; - } - } - - return E_FAIL; -} - -_Use_decl_annotations_ -HRESULT CEffectLoader::LoadEffect(CEffect *pEffect, const void *pEffectBuffer, uint32_t cbEffectBuffer) -{ - - HRESULT hr = S_OK; - uint32_t i, varSize, cMemberDataBlocks; - CCheckedDword chkVariables = 0; - - // Used for cloning - m_pvOldMemberInterfaces = nullptr; - - m_BulkHeap.EnableAlignment(); - - assert(pEffect && pEffectBuffer); - m_pEffect = pEffect; - m_EffectMemory = m_ReflectionMemory = 0; - - VN( m_pEffect->m_pReflection = new CEffectReflection() ); - m_pReflection = m_pEffect->m_pReflection; - - // Begin effect load - VN( m_pEffect->m_pTypePool = new CEffect::CTypeHashTable ); - VN( m_pEffect->m_pStringPool = new CEffect::CStringHashTable ); - VN( m_pEffect->m_pPooledHeap = new CDataBlockStore ); - m_pEffect->m_pPooledHeap->EnableAlignment(); - m_pEffect->m_pTypePool->SetPrivateHeap(m_pEffect->m_pPooledHeap); - m_pEffect->m_pStringPool->SetPrivateHeap(m_pEffect->m_pPooledHeap); - - VH( m_pEffect->m_pTypePool->AutoGrow() ); - VH( m_pEffect->m_pStringPool->AutoGrow() ); - - // Load from blob - m_pData = (uint8_t*)pEffectBuffer; - m_dwBufferSize = cbEffectBuffer; - - VH( m_msStructured.SetData(m_pData, m_dwBufferSize) ); - - // At this point, we assume that the blob is valid - VHD( m_msStructured.Read((void**) &m_pHeader, sizeof(*m_pHeader)), "pEffectBuffer is too small." ); - - // Verify the version - if( FAILED( hr = GetEffectVersion( m_pHeader->Tag, &m_Version ) ) ) - { - DPF(0, "Effect version is unrecognized. This runtime supports fx_5_0 to %s.", g_EffectVersions[_countof(g_EffectVersions)-1].m_pName ); - VH( hr ); - } - - if( m_pHeader->RequiresPool() || m_pHeader->Pool.cObjectVariables > 0 || m_pHeader->Pool.cNumericVariables > 0 ) - { - DPF(0, "Effect11 does not support EffectPools." ); - VH( E_FAIL ); - } - - // Get shader block count - VBD( m_pHeader->cInlineShaders <= m_pHeader->cTotalShaders, "Invalid Effect header: cInlineShaders > cTotalShaders." ); - - // Make sure the counts for the Effect don't overflow - chkVariables = m_pHeader->Effect.cObjectVariables; - chkVariables += m_pHeader->Effect.cNumericVariables; - chkVariables += m_pHeader->cInterfaceVariables; - chkVariables *= sizeof(SGlobalVariable); - VH( chkVariables.GetValue(&varSize) ); - - // Make sure the counts for the SMemberDataPointers don't overflow - chkVariables = m_pHeader->cClassInstanceElements; - chkVariables += m_pHeader->cBlendStateBlocks; - chkVariables += m_pHeader->cRasterizerStateBlocks; - chkVariables += m_pHeader->cDepthStencilBlocks; - chkVariables += m_pHeader->cSamplers; - chkVariables += m_pHeader->Effect.cCBs; // Buffer (for CBuffers and TBuffers) - chkVariables += m_pHeader->Effect.cCBs; // SRV (for TBuffers) - VHD( chkVariables.GetValue(&cMemberDataBlocks), "Overflow: too many Effect variables." ); - - // Allocate effect resources - VN( m_pEffect->m_pCBs = PRIVATENEW SConstantBuffer[m_pHeader->Effect.cCBs] ); - VN( m_pEffect->m_pDepthStencilBlocks = PRIVATENEW SDepthStencilBlock[m_pHeader->cDepthStencilBlocks] ); - VN( m_pEffect->m_pRasterizerBlocks = PRIVATENEW SRasterizerBlock[m_pHeader->cRasterizerStateBlocks] ); - VN( m_pEffect->m_pBlendBlocks = PRIVATENEW SBlendBlock[m_pHeader->cBlendStateBlocks] ); - VN( m_pEffect->m_pSamplerBlocks = PRIVATENEW SSamplerBlock[m_pHeader->cSamplers] ); - - // we allocate raw bytes for variables because they are polymorphic types that need to be placement new'ed - VN( m_pEffect->m_pVariables = (SGlobalVariable *)PRIVATENEW uint8_t[varSize] ); - VN( m_pEffect->m_pAnonymousShaders = PRIVATENEW SAnonymousShader[m_pHeader->cInlineShaders] ); - - VN( m_pEffect->m_pGroups = PRIVATENEW SGroup[m_pHeader->cGroups] ); - VN( m_pEffect->m_pShaderBlocks = PRIVATENEW SShaderBlock[m_pHeader->cTotalShaders] ); - VN( m_pEffect->m_pStrings = PRIVATENEW SString[m_pHeader->cStrings] ); - VN( m_pEffect->m_pShaderResources = PRIVATENEW SShaderResource[m_pHeader->cShaderResources] ); - VN( m_pEffect->m_pUnorderedAccessViews = PRIVATENEW SUnorderedAccessView[m_pHeader->cUnorderedAccessViews] ); - VN( m_pEffect->m_pInterfaces = PRIVATENEW SInterface[m_pHeader->cInterfaceVariableElements] ); - VN( m_pEffect->m_pMemberDataBlocks = PRIVATENEW SMemberDataPointer[cMemberDataBlocks] ); - VN( m_pEffect->m_pRenderTargetViews = PRIVATENEW SRenderTargetView[m_pHeader->cRenderTargetViews] ); - VN( m_pEffect->m_pDepthStencilViews = PRIVATENEW SDepthStencilView[m_pHeader->cDepthStencilViews] ); - - uint32_t oStructured = m_pHeader->cbUnstructured + sizeof(SBinaryHeader5); - VHD( m_msStructured.Seek(oStructured), "Invalid pEffectBuffer: Missing structured data block." ); - VH( m_msUnstructured.SetData(m_pData + sizeof(SBinaryHeader5), oStructured - sizeof(SBinaryHeader5)) ); - - VH( LoadCBs() ); - VH( LoadObjectVariables() ); - VH( LoadInterfaceVariables() ); - VH( LoadGroups() ); - - // Build shader dependencies - for (i=0; im_ShaderBlockCount; i++) - { - VH( BuildShaderBlock(&m_pEffect->m_pShaderBlocks[i]) ); - } - - for( size_t iGroup=0; iGroupcGroups; iGroup++ ) - { - SGroup *pGroup = &m_pEffect->m_pGroups[iGroup]; - pGroup->HasDependencies = false; - - for( size_t iTechnique=0; iTechnique < pGroup->TechniqueCount; iTechnique++ ) - { - STechnique* pTech = &pGroup->pTechniques[iTechnique]; - pTech->HasDependencies = false; - - for( size_t iPass=0; iPass < pTech->PassCount; iPass++ ) - { - SPassBlock *pPass = &pTech->pPasses[iPass]; - - pTech->HasDependencies |= pPass->CheckDependencies(); - } - pGroup->HasDependencies |= pTech->HasDependencies; - } - } - - VH( InitializeReflectionDataAndMoveStrings() ); - VH( ReallocateReflectionData() ); - VH( ReallocateEffectData() ); - - VB( m_pReflection->m_Heap.GetSize() == m_ReflectionMemory ); - - // Verify that all of the various block/variable types were loaded - VBD( m_pEffect->m_VariableCount == (m_pHeader->Effect.cObjectVariables + m_pHeader->Effect.cNumericVariables + m_pHeader->cInterfaceVariables), "Internal loading error: mismatched variable count." ); - VBD( m_pEffect->m_ShaderBlockCount == m_pHeader->cTotalShaders, "Internal loading error: mismatched shader block count." ); - VBD( m_pEffect->m_AnonymousShaderCount == m_pHeader->cInlineShaders, "Internal loading error: mismatched anonymous variable count." ); - VBD( m_pEffect->m_ShaderResourceCount == m_pHeader->cShaderResources, "Internal loading error: mismatched SRV count." ); - VBD( m_pEffect->m_InterfaceCount == m_pHeader->cInterfaceVariableElements + m_BackgroundInterfaces.GetSize(), "Internal loading error: mismatched interface count." ); - VBD( m_pEffect->m_UnorderedAccessViewCount == m_pHeader->cUnorderedAccessViews, "Internal loading error: mismatched UAV count." ); - VBD( m_pEffect->m_MemberDataCount == cMemberDataBlocks, "Internal loading error: mismatched member data block count." ); - VBD( m_pEffect->m_RenderTargetViewCount == m_pHeader->cRenderTargetViews, "Internal loading error: mismatched RTV count." ); - VBD( m_pEffect->m_DepthStencilViewCount == m_pHeader->cDepthStencilViews, "Internal loading error: mismatched DSV count." ); - VBD( m_pEffect->m_DepthStencilBlockCount == m_pHeader->cDepthStencilBlocks, "Internal loading error: mismatched depth-stencil state count." ); - VBD( m_pEffect->m_BlendBlockCount == m_pHeader->cBlendStateBlocks, "Internal loading error: mismatched blend state count." ); - VBD( m_pEffect->m_RasterizerBlockCount == m_pHeader->cRasterizerStateBlocks, "Internal loading error: mismatched rasterizer state count." ); - VBD( m_pEffect->m_SamplerBlockCount == m_pHeader->cSamplers, "Internal loading error: mismatched sampler count." ); - VBD( m_pEffect->m_StringCount == m_pHeader->cStrings, "Internal loading error: mismatched string count." ); - - // Uncomment if you really need this information - // DPF(0, "Effect heap size: %d, reflection heap size: %d, allocations avoided: %d", m_EffectMemory, m_ReflectionMemory, m_BulkHeap.m_cAllocations); - -lExit: - return hr; -} - -// position in buffer is lost on error -_Use_decl_annotations_ -HRESULT CEffectLoader::LoadStringAndAddToPool(char **ppString, uint32_t dwOffset) -{ - HRESULT hr = S_OK; - char *pName; - uint32_t hash; - size_t oldPos; - CEffect::CStringHashTable::CIterator iter; - uint32_t len; - - if (dwOffset == 0) - { - *ppString = nullptr; - goto lExit; - } - - oldPos = m_msUnstructured.GetPosition(); - - VHD( m_msUnstructured.ReadAtOffset(dwOffset, (LPCSTR *) &pName), "Invalid pEffectBuffer: cannot read string." ); - len = (uint32_t)strlen(pName); - hash = ComputeHash((uint8_t *)pName, len); - if (FAILED(m_pEffect->m_pStringPool->FindValueWithHash(pName, hash, &iter))) - { - assert( m_pEffect->m_pPooledHeap != 0 ); - _Analysis_assume_( m_pEffect->m_pPooledHeap != 0 ); - VN( (*ppString) = new(*m_pEffect->m_pPooledHeap) char[len + 1] ); - memcpy(*ppString, pName, len + 1); - VHD( m_pEffect->m_pStringPool->AddValueWithHash(*ppString, hash), "Internal loading error: failed to add string to pool." ); - } - else - { - *ppString = const_cast(iter.GetData()); - } - - m_msUnstructured.Seek(oldPos); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT CEffectLoader::LoadTypeAndAddToPool(SType **ppType, uint32_t dwOffset) -{ - HRESULT hr = S_OK; - SBinaryType *psType; - SBinaryNumericType *pNumericType; - EObjectType *pObjectType; - uint32_t cMembers, iMember, cInterfaces; - uint32_t oBaseClassType; - SType temporaryType; - CEffect::CTypeHashTable::CIterator iter; - uint8_t *pHashBuffer; - uint32_t hash; - SVariable *pTempMembers = nullptr; - - m_HashBuffer.Empty(); - - VHD( m_msUnstructured.ReadAtOffset(dwOffset, sizeof(SBinaryType), (void**) &psType), "Invalid pEffectBuffer: cannot read type." ); - VHD( LoadStringAndAddToPool(&temporaryType.pTypeName, psType->oTypeName), "Invalid pEffectBuffer: cannot read type name." ); - temporaryType.VarType = psType->VarType; - temporaryType.Elements = psType->Elements; - temporaryType.TotalSize = psType->TotalSize; - temporaryType.Stride = psType->Stride; - temporaryType.PackedSize = psType->PackedSize; - - // sanity check elements, size, stride, etc. - uint32_t cElements = std::max(1, temporaryType.Elements); - VBD( cElements * temporaryType.Stride == AlignToPowerOf2(temporaryType.TotalSize, SType::c_RegisterSize), "Invalid pEffectBuffer: invalid type size." ); - VBD( temporaryType.Stride % SType::c_RegisterSize == 0, "Invalid pEffectBuffer: invalid type stride." ); - VBD( temporaryType.PackedSize <= temporaryType.TotalSize && temporaryType.PackedSize % cElements == 0, "Invalid pEffectBuffer: invalid type packed size." ); - - switch(temporaryType.VarType) - { - case EVT_Object: - VHD( m_msUnstructured.Read((void**) &pObjectType, sizeof(uint32_t)), "Invalid pEffectBuffer: cannot read object type." ); - temporaryType.ObjectType = *pObjectType; - VBD( temporaryType.VarType > EOT_Invalid && temporaryType.VarType < EOT_Count, "Invalid pEffectBuffer: invalid object type." ); - - VN( pHashBuffer = m_HashBuffer.AddRange(sizeof(temporaryType.VarType) + sizeof(temporaryType.Elements) + - sizeof(temporaryType.pTypeName) + sizeof(temporaryType.ObjectType)) ); - memcpy(pHashBuffer, &temporaryType.VarType, sizeof(temporaryType.VarType)); - pHashBuffer += sizeof(temporaryType.VarType); - memcpy(pHashBuffer, &temporaryType.Elements, sizeof(temporaryType.Elements)); - pHashBuffer += sizeof(temporaryType.Elements); - memcpy(pHashBuffer, &temporaryType.pTypeName, sizeof(temporaryType.pTypeName)); - pHashBuffer += sizeof(temporaryType.pTypeName); - memcpy(pHashBuffer, &temporaryType.ObjectType, sizeof(temporaryType.ObjectType)); - break; - - case EVT_Interface: - temporaryType.InterfaceType = nullptr; - - VN( pHashBuffer = m_HashBuffer.AddRange(sizeof(temporaryType.VarType) + sizeof(temporaryType.Elements) + - sizeof(temporaryType.pTypeName) + sizeof(temporaryType.ObjectType)) ); - memcpy(pHashBuffer, &temporaryType.VarType, sizeof(temporaryType.VarType)); - pHashBuffer += sizeof(temporaryType.VarType); - memcpy(pHashBuffer, &temporaryType.Elements, sizeof(temporaryType.Elements)); - pHashBuffer += sizeof(temporaryType.Elements); - memcpy(pHashBuffer, &temporaryType.pTypeName, sizeof(temporaryType.pTypeName)); - pHashBuffer += sizeof(temporaryType.pTypeName); - memcpy(pHashBuffer, &temporaryType.ObjectType, sizeof(temporaryType.ObjectType)); - break; - - case EVT_Numeric: - VHD( m_msUnstructured.Read((void**) &pNumericType, sizeof(SBinaryNumericType)), "Invalid pEffectBuffer: cannot read numeric type." ); - temporaryType.NumericType = *pNumericType; - VBD( temporaryType.NumericType.Rows >= 1 && temporaryType.NumericType.Rows <= 4 && - temporaryType.NumericType.Columns >= 1 && temporaryType.NumericType.Columns <= 4 && - temporaryType.NumericType.NumericLayout != ENL_Invalid && temporaryType.NumericType.NumericLayout < ENL_Count && - temporaryType.NumericType.ScalarType > EST_Invalid && temporaryType.NumericType.ScalarType < EST_Count, - "Invalid pEffectBuffer: invalid numeric type."); - - if (temporaryType.NumericType.NumericLayout != ENL_Matrix) - { - VBD( temporaryType.NumericType.IsColumnMajor == false, "Invalid pEffectBuffer: only matricies can be column major." ); - } - - VN( pHashBuffer = m_HashBuffer.AddRange(sizeof(temporaryType.VarType) + sizeof(temporaryType.Elements) + - sizeof(temporaryType.pTypeName) + sizeof(temporaryType.NumericType)) ); - memcpy(pHashBuffer, &temporaryType.VarType, sizeof(temporaryType.VarType)); - pHashBuffer += sizeof(temporaryType.VarType); - memcpy(pHashBuffer, &temporaryType.Elements, sizeof(temporaryType.Elements)); - pHashBuffer += sizeof(temporaryType.Elements); - memcpy(pHashBuffer, &temporaryType.pTypeName, sizeof(temporaryType.pTypeName)); - pHashBuffer += sizeof(temporaryType.pTypeName); - memcpy(pHashBuffer, &temporaryType.NumericType, sizeof(temporaryType.NumericType)); - break; - - case EVT_Struct: - VHD( m_msUnstructured.Read(&cMembers), "Invalid pEffectBuffer: cannot read struct." ); - - temporaryType.StructType.Members = cMembers; - - VN( pTempMembers = new SVariable[cMembers] ); - temporaryType.StructType.pMembers = pTempMembers; - - // read up all of the member descriptors at once - SBinaryType::SBinaryMember *psMember; - VHD( m_msUnstructured.Read((void**) &psMember, cMembers * sizeof(*psMember)), "Invalid pEffectBuffer: cannot read struct members." ); - - { - // Determine if this type implements an interface - VHD( m_msUnstructured.Read(&oBaseClassType), "Invalid pEffectBuffer: cannot read base class type." ); - VHD( m_msUnstructured.Read(&cInterfaces), "Invalid pEffectBuffer: cannot read interfaces." ); - if( cInterfaces > 0 ) - { - temporaryType.StructType.ImplementsInterface = 1; - temporaryType.StructType.HasSuperClass = ( oBaseClassType > 0 ) ? 1 : 0; - } - else if( oBaseClassType > 0 ) - { - // Get parent type and copy its ImplementsInterface - SType* pBaseClassType; - VH( LoadTypeAndAddToPool(&pBaseClassType, oBaseClassType) ); - temporaryType.StructType.ImplementsInterface = pBaseClassType->StructType.ImplementsInterface; - temporaryType.StructType.HasSuperClass = 1; - } - // Read (and ignore) the interface types - uint32_t *poInterface; - VHD( m_msUnstructured.Read((void**) &poInterface, cInterfaces * sizeof(poInterface)), "Invalid pEffectBuffer: cannot read interface types." ); - } - - uint32_t totalSize; - totalSize = 0; - for (iMember=0; iMemberData.Offset = psMember[iMember].Offset; - - VH( LoadTypeAndAddToPool(&pMember->pType, psMember[iMember].oType) ); - VH( LoadStringAndAddToPool(&pMember->pName, psMember[iMember].oName) ); - VH( LoadStringAndAddToPool(&pMember->pSemantic, psMember[iMember].oSemantic) ); - - totalSize = psMember[iMember].Offset + pMember->pType->TotalSize; - } - VBD( AlignToPowerOf2(totalSize, SType::c_RegisterSize) == temporaryType.Stride, "Internal loading error: invlid type size." ); - - VN( pHashBuffer = m_HashBuffer.AddRange(sizeof(temporaryType.VarType) + sizeof(temporaryType.Elements) + - sizeof(temporaryType.pTypeName) + sizeof(temporaryType.StructType.Members) + cMembers * sizeof(SVariable)) ); - - memcpy(pHashBuffer, &temporaryType.VarType, sizeof(temporaryType.VarType)); - pHashBuffer += sizeof(temporaryType.VarType); - memcpy(pHashBuffer, &temporaryType.Elements, sizeof(temporaryType.Elements)); - pHashBuffer += sizeof(temporaryType.Elements); - memcpy(pHashBuffer, &temporaryType.pTypeName, sizeof(temporaryType.pTypeName)); - pHashBuffer += sizeof(temporaryType.pTypeName); - memcpy(pHashBuffer, &temporaryType.StructType.Members, sizeof(temporaryType.StructType.Members)); - pHashBuffer += sizeof(temporaryType.StructType.Members); - memcpy(pHashBuffer, temporaryType.StructType.pMembers, cMembers * sizeof(SVariable)); - break; - - default: - assert(0); - VHD( E_FAIL, "Internal loading error: invalid variable type." ); - } - - hash = ComputeHash(&m_HashBuffer[0], m_HashBuffer.GetSize()); - if (FAILED(m_pEffect->m_pTypePool->FindValueWithHash(&temporaryType, hash, &iter))) - { - assert( m_pEffect->m_pPooledHeap != nullptr ); - - // allocate real member array, if necessary - if (temporaryType.VarType == EVT_Struct) - { - VN( temporaryType.StructType.pMembers = new(*m_pEffect->m_pPooledHeap) SVariable[temporaryType.StructType.Members] ); - memcpy(temporaryType.StructType.pMembers, pTempMembers, temporaryType.StructType.Members * sizeof(SVariable)); - } - - // allocate real type - VN( (*ppType) = new(*m_pEffect->m_pPooledHeap) SType ); - memcpy(*ppType, &temporaryType, sizeof(temporaryType)); - ZeroMemory(&temporaryType, sizeof(temporaryType)); - VH( m_pEffect->m_pTypePool->AddValueWithHash(*ppType, hash) ); - } - else - { - *ppType = iter.GetData(); - } - -lExit: - SAFE_DELETE_ARRAY(pTempMembers); - return hr; -} - -// Numeric data in annotations are tightly packed (unlike in CBs which follow D3D11 packing rules). This unpacks them. -uint32_t CEffectLoader::UnpackData(uint8_t *pDestData, uint8_t *pSrcData, uint32_t PackedDataSize, SType *pType, uint32_t *pBytesRead) -{ - uint32_t bytesRead = 0; - HRESULT hr = S_OK; - uint32_t elementsToCopy = std::max(pType->Elements, 1); - - switch (pType->VarType) - { - case EVT_Struct: - for (size_t i = 0; i < elementsToCopy; ++ i) - { - for (size_t j = 0; j < pType->StructType.Members; ++ j) - { - uint32_t br; - assert(PackedDataSize > bytesRead); - - VH( UnpackData(pDestData + pType->StructType.pMembers[j].Data.Offset, - pSrcData + bytesRead, PackedDataSize - bytesRead, - pType->StructType.pMembers[j].pType, &br) ); - - bytesRead += br; - } - pDestData += pType->Stride; - } - break; - - case EVT_Numeric: - if (pType->NumericType.IsPackedArray) - { - // No support for packed arrays - assert(0); - VHD(E_FAIL, "Internal loading error: packed arrays are not supported." ); - } - else - { - uint32_t bytesToCopy; - - if (pType->NumericType.IsColumnMajor) - { - uint32_t registers = pType->NumericType.Columns; - uint32_t entries = pType->NumericType.Rows; - bytesToCopy = entries * registers * SType::c_ScalarSize; - - for (size_t i = 0; i < elementsToCopy; ++ i) - { - for (size_t j = 0; j < registers; ++ j) - { - for (size_t k = 0; k < entries; ++ k) - { - // type cast to an arbitrary scalar - ((uint32_t*)pDestData)[k] = ((uint32_t*)pSrcData)[k * registers + j]; - } - pDestData += SType::c_RegisterSize; // advance to next register - } - pSrcData += bytesToCopy; - bytesRead += bytesToCopy; - } - } - else - { - uint32_t registers = pType->NumericType.Rows; - uint32_t entries = pType->NumericType.Columns; - bytesToCopy = entries * SType::c_ScalarSize; - - for (size_t i = 0; i < elementsToCopy; ++ i) - { - for (size_t j = 0; j < registers; ++ j) - { - memcpy(pDestData, pSrcData, bytesToCopy); - - pDestData += SType::c_RegisterSize; // advance to next register - pSrcData += bytesToCopy; - bytesRead += bytesToCopy; - } - } - } - } - break; - - default: - // shouldn't be called on non-struct/numeric types - assert(0); - VHD(E_FAIL, "Internal loading error: UnpackData should not be called on non-struct, non-numeric types." ); - } - -lExit: - *pBytesRead = bytesRead; - return hr; -} - -// Read info from the compiled blob and initialize a numeric variable -HRESULT CEffectLoader::LoadNumericVariable(_In_ SConstantBuffer *pParentCB) -{ - HRESULT hr = S_OK; - SBinaryNumericVariable *psVar; - SGlobalVariable *pVar; - SType *pType; - void *pDefaultValue; - - // Read variable info - VHD( m_msStructured.Read((void**) &psVar, sizeof(*psVar)), "Invalid pEffectBuffer: cannot read numeric variable." ); - VBD( m_pEffect->m_VariableCount < (m_pHeader->Effect.cObjectVariables + m_pHeader->Effect.cNumericVariables + m_pHeader->cInterfaceVariables), - "Internal loading error: invalid variable counts."); - pVar = &m_pEffect->m_pVariables[m_pEffect->m_VariableCount]; - - // Get type - VH( LoadTypeAndAddToPool(&pType, psVar->oType) ); - - // Make sure the right polymorphic type is created - VH( PlacementNewVariable(pVar, pType, false) ); - - if (psVar->Flags & D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT) - { - pVar->ExplicitBindPoint = psVar->Offset; - } - else - { - pVar->ExplicitBindPoint = uint32_t(-1); - } - - pVar->pEffect = m_pEffect; - pVar->pType = pType; - pVar->pCB = pParentCB; - pVar->Data.pGeneric = pParentCB->pBackingStore + psVar->Offset; - VBD( psVar->Offset + pVar->pType->TotalSize <= pVar->pCB->Size, "Invalid pEffectBuffer: invalid variable offset." ); - - if (pType->VarType == EVT_Struct && pType->StructType.ImplementsInterface && !pParentCB->IsTBuffer) - { - pVar->MemberDataOffsetPlus4 = m_pEffect->m_MemberDataCount * sizeof(SMemberDataPointer) + 4; - m_pEffect->m_MemberDataCount += std::max(pType->Elements,1); - } - - // Get name & semantic - VHD( GetStringAndAddToReflection(psVar->oName, &pVar->pName), "Invalid pEffectBuffer: cannot read variable name." ); - VHD( GetStringAndAddToReflection(psVar->oSemantic, &pVar->pSemantic), "Invalid pEffectBuffer: cannot read variable semantic." ); - - // Ensure the variable fits in the CBuffer and doesn't overflow - VBD( pType->TotalSize + psVar->Offset <= pParentCB->Size && - pType->TotalSize + psVar->Offset >= pType->TotalSize, "Invalid pEffectBuffer: variable does not fit in CB." ); - - ZeroMemory(pVar->Data.pGeneric, pType->TotalSize); - - // Get default value - if (0 != psVar->oDefaultValue) - { - uint32_t bytesUnpacked; - VHD( m_msUnstructured.ReadAtOffset(psVar->oDefaultValue, pType->PackedSize, &pDefaultValue), "Invalid pEffectBuffer: cannot read default value." ); - VH( UnpackData((uint8_t*) pVar->Data.pGeneric, (uint8_t*) pDefaultValue, pType->PackedSize, pType, &bytesUnpacked) ); - VBD( bytesUnpacked == pType->PackedSize, "Invalid pEffectBuffer: invalid type packed size."); - } - - // We need to use offsets until we fixup - pVar->Data.Offset = psVar->Offset; - - // Read annotations - VH( LoadAnnotations(&pVar->AnnotationCount, &pVar->pAnnotations) ); - - m_pEffect->m_VariableCount++; - -lExit: - return hr; -} - -// Read info from the compiled blob and initialize a constant buffer -HRESULT CEffectLoader::LoadCBs() -{ - HRESULT hr = S_OK; - uint32_t iCB, iVar; - - for (iCB=0; iCBEffect.cCBs; iCB++) - { - SBinaryConstantBuffer *psCB; - SConstantBuffer *pCB; - - VHD( m_msStructured.Read((void**) &psCB, sizeof(*psCB)), "Invalid pEffectBuffer: cannot read CB." ); - pCB = &m_pEffect->m_pCBs[iCB]; - - VHD( GetStringAndAddToReflection(psCB->oName, &pCB->pName), "Invalid pEffectBuffer: cannot read CB name." ); - - pCB->IsTBuffer = (psCB->Flags & SBinaryConstantBuffer::c_IsTBuffer) != 0 ? true : false; - pCB->IsSingle = (psCB->Flags & SBinaryConstantBuffer::c_IsSingle) != 0 ? true : false; - pCB->Size = psCB->Size; - pCB->ExplicitBindPoint = psCB->ExplicitBindPoint; - VBD( pCB->Size == AlignToPowerOf2(pCB->Size, SType::c_RegisterSize), "Invalid pEffectBuffer: CB size not a power of 2." ); - VN( pCB->pBackingStore = PRIVATENEW uint8_t[pCB->Size] ); - - pCB->MemberDataOffsetPlus4 = m_pEffect->m_MemberDataCount * sizeof(SMemberDataPointer) + 4; - m_pEffect->m_MemberDataCount += 2; - - // point this CB to variables that it owns - pCB->VariableCount = psCB->cVariables; - if (pCB->VariableCount > 0) - { - pCB->pVariables = &m_pEffect->m_pVariables[m_pEffect->m_VariableCount]; - } - else - { - pCB->pVariables = nullptr; - } - - // Read annotations - VH( LoadAnnotations(&pCB->AnnotationCount, &pCB->pAnnotations) ); - - for (iVar=0; iVarcVariables; iVar++) - { - VH( LoadNumericVariable(pCB) ); - } - } - - m_pEffect->m_CBCount = m_pHeader->Effect.cCBs; - -lExit: - return hr; -} - -// Used by LoadAssignment to initialize members on load -_Use_decl_annotations_ -HRESULT CEffectLoader::ExecuteConstantAssignment(const SBinaryConstant *pConstant, void *pLHS, D3D_SHADER_VARIABLE_TYPE lhsType) -{ - HRESULT hr = S_OK; - - switch(pConstant->Type) - { - case EST_UInt: - case EST_Int: - case EST_Bool: - switch(lhsType) - { - case D3D_SVT_BOOL: - case D3D_SVT_INT: - case D3D_SVT_UINT: - *(uint32_t*) pLHS = pConstant->iValue; - break; - - case D3D_SVT_UINT8: - *(uint8_t*) pLHS = (uint8_t) pConstant->iValue; - break; - - case D3D_SVT_FLOAT: - *(float*) pLHS = (float) pConstant->iValue; - break; - - default: - VHD( E_FAIL, "Internal loading error: invalid left-hand assignment type." ); - } - break; - - case EST_Float: - switch(lhsType) - { - case D3D_SVT_BOOL: - case D3D_SVT_INT: - case D3D_SVT_UINT: - *(uint32_t*) pLHS = (uint32_t) pConstant->fValue; - break; - - case D3D_SVT_UINT8: - *(uint8_t*) pLHS = (uint8_t) pConstant->fValue; - break; - - case D3D_SVT_FLOAT: - *(float*) pLHS = pConstant->fValue; - break; - - default: - VHD( E_FAIL, "Internal loading error: invalid left-hand assignment type." ); - } - break; - - default: - VHD( E_FAIL, "Internal loading error: invalid left-hand assignment type." ); - } - -lExit: - return hr; -} - - -// Read info from the compiled blob and initialize a set of assignments -_Use_decl_annotations_ -HRESULT CEffectLoader::LoadAssignments( uint32_t Assignments, SAssignment **ppAssignments, - uint8_t *pBackingStore, uint32_t *pRTVAssignments, uint32_t *pFinalAssignments ) -{ - HRESULT hr = S_OK; - uint32_t i, j; - - SBinaryAssignment *psAssignments; - uint32_t finalAssignments = 0; // the number of assignments worth keeping - uint32_t renderTargetViewAssns = 0; // Number of render target view assns, used by passes since SetRTV is a vararg call - - *pFinalAssignments = 0; - if (pRTVAssignments) - *pRTVAssignments = 0; - - VHD( m_msStructured.Read((void**) &psAssignments, sizeof(*psAssignments) * Assignments), "Invalid pEffectBuffer: cannot read assignments." ); - - // allocate enough room to store all of the assignments (even though some may go unused) - VN( (*ppAssignments) = PRIVATENEW SAssignment[Assignments] ) - - // - // In this loop, we read assignments 1-by-1, keeping some and discarding others. - // We write to the "next" assignment which is given by &(*ppAssignments)[finalAssignments]; - // if an assignment is worth keeping, we increment finalAssignments. - // This means that if you want to keep an assignment, you must be careful to initialize - // all members of SAssignment because old values from preceding discarded assignments might remain. - // - for (i = 0; i < Assignments; ++ i) - { - SGlobalVariable *pVarArray, *pVarIndex, *pVar; - const char *pGlobalVarName; - SAssignment *pAssignment = &(*ppAssignments)[finalAssignments]; - uint8_t *pLHS; - - VBD( psAssignments[i].iState < NUM_STATES, "Invalid pEffectBuffer: invalid assignment state." ); - VBD( psAssignments[i].Index < g_lvGeneral[psAssignments[i].iState].m_Indices, "Invalid pEffectBuffer: invalid assignment index." ); - - pAssignment->LhsType = g_lvGeneral[psAssignments[i].iState].m_LhsType; - - // Count RenderTargetView assignments - if (pAssignment->LhsType == ELHS_RenderTargetView) - renderTargetViewAssns++; - - switch (g_lvGeneral[psAssignments[i].iState].m_Type) - { - case D3D_SVT_UINT8: - assert(g_lvGeneral[psAssignments[i].iState].m_Cols == 1); // uint8_t arrays not supported - pAssignment->DataSize = sizeof(uint8_t); - // Store an offset for destination instead of a pointer so that it's easy to relocate it later - - break; - - case D3D_SVT_BOOL: - case D3D_SVT_INT: - case D3D_SVT_UINT: - case D3D_SVT_FLOAT: - pAssignment->DataSize = SType::c_ScalarSize * g_lvGeneral[psAssignments[i].iState].m_Cols; - break; - - case D3D_SVT_RASTERIZER: - pAssignment->DataSize = sizeof(SRasterizerBlock); - break; - - case D3D_SVT_DEPTHSTENCIL: - pAssignment->DataSize = sizeof(SDepthStencilBlock); - break; - - case D3D_SVT_BLEND: - pAssignment->DataSize = sizeof(SBlendBlock); - break; - - case D3D_SVT_VERTEXSHADER: - case D3D_SVT_GEOMETRYSHADER: - case D3D_SVT_PIXELSHADER: - case D3D_SVT_HULLSHADER: - case D3D_SVT_DOMAINSHADER: - case D3D_SVT_COMPUTESHADER: - pAssignment->DataSize = sizeof(SShaderBlock); - break; - - case D3D_SVT_TEXTURE: - case D3D_SVT_TEXTURE1D: - case D3D_SVT_TEXTURE2D: - case D3D_SVT_TEXTURE2DMS: - case D3D_SVT_TEXTURE3D: - case D3D_SVT_TEXTURECUBE: - case D3D_SVT_TEXTURECUBEARRAY: - case D3D_SVT_BYTEADDRESS_BUFFER: - case D3D_SVT_STRUCTURED_BUFFER: - pAssignment->DataSize = sizeof(SShaderResource); - break; - - case D3D_SVT_RENDERTARGETVIEW: - pAssignment->DataSize = sizeof(SRenderTargetView); - break; - - case D3D_SVT_DEPTHSTENCILVIEW: - pAssignment->DataSize = sizeof(SDepthStencilView); - break; - - case D3D_SVT_RWTEXTURE1D: - case D3D_SVT_RWTEXTURE1DARRAY: - case D3D_SVT_RWTEXTURE2D: - case D3D_SVT_RWTEXTURE2DARRAY: - case D3D_SVT_RWTEXTURE3D: - case D3D_SVT_RWBUFFER: - case D3D_SVT_RWBYTEADDRESS_BUFFER: - case D3D_SVT_RWSTRUCTURED_BUFFER: - case D3D_SVT_APPEND_STRUCTURED_BUFFER: - case D3D_SVT_CONSUME_STRUCTURED_BUFFER: - pAssignment->DataSize = sizeof(SUnorderedAccessView); - break; - - case D3D_SVT_INTERFACE_POINTER: - pAssignment->DataSize = sizeof(SInterface); - break; - - default: - assert(0); - VHD( E_FAIL, "Internal loading error: invalid assignment type."); - } - - uint32_t lhsStride; - if( g_lvGeneral[psAssignments[i].iState].m_Stride > 0 ) - lhsStride = g_lvGeneral[psAssignments[i].iState].m_Stride; - else - lhsStride = pAssignment->DataSize; - - // Store only the destination offset so that the backing store pointers can be easily fixed up later - pAssignment->Destination.Offset = g_lvGeneral[psAssignments[i].iState].m_Offset + lhsStride * psAssignments[i].Index; - - // As a result, you should use pLHS in this function instead of the destination pointer - pLHS = pBackingStore + pAssignment->Destination.Offset; - - switch (psAssignments[i].AssignmentType) - { - case ECAT_Constant: // e.g. LHS = 1; or LHS = nullptr; - uint32_t *pNumConstants; - SBinaryConstant *pConstants; - - VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, sizeof(uint32_t), (void**) &pNumConstants), "Invalid pEffectBuffer: cannot read NumConstants." ); - VHD( m_msUnstructured.Read((void **)&pConstants, sizeof(SBinaryConstant) * (*pNumConstants)), "Invalid pEffectBuffer: cannot read constants." ); - - if(pAssignment->IsObjectAssignment()) - { - // make sure this is a nullptr assignment - VBD( *pNumConstants == 1 && (pConstants[0].Type == EST_Int || pConstants[0].Type == EST_UInt) && pConstants[0].iValue == 0, - "Invalid pEffectBuffer: non-nullptr constant assignment to object."); - - switch (pAssignment->LhsType) - { - case ELHS_DepthStencilBlock: - *((void **)pLHS) = &g_NullDepthStencil; - break; - case ELHS_BlendBlock: - *((void **)pLHS) = &g_NullBlend; - break; - case ELHS_RasterizerBlock: - *((void **)pLHS) = &g_NullRasterizer; - break; - case ELHS_VertexShaderBlock: - *((void **)pLHS) = &g_NullVS; - break; - case ELHS_PixelShaderBlock: - *((void **)pLHS) = &g_NullPS; - break; - case ELHS_GeometryShaderBlock: - *((void **)pLHS) = &g_NullGS; - break; - case ELHS_HullShaderBlock: - *((void **)pLHS) = &g_NullHS; - break; - case ELHS_DomainShaderBlock: - *((void **)pLHS) = &g_NullDS; - break; - case ELHS_ComputeShaderBlock: - *((void **)pLHS) = &g_NullCS; - break; - case ELHS_Texture: - *((void **)pLHS) = &g_NullTexture; - break; - case ELHS_DepthStencilView: - *((void **)pLHS) = &g_NullDepthStencilView; - break; - case ELHS_RenderTargetView: - *((void **)pLHS) = &g_NullRenderTargetView; - break; - default: - assert(0); - } - } - else - { - VBD( *pNumConstants == g_lvGeneral[psAssignments[i].iState].m_Cols, "Internal loading error: mismatch constant count." ); - for (j = 0; j < *pNumConstants; ++ j) - { - VH( ExecuteConstantAssignment(pConstants + j, pLHS, g_lvGeneral[psAssignments[i].iState].m_Type) ); - pLHS += SType::c_ScalarSize; // arrays of constants will always be regular scalar sized, never byte-sized - } - } - - // Can get rid of this assignment - break; - - case ECAT_Variable: // e.g. LHS = myVar; - VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, &pGlobalVarName), "Invalid pEffectBuffer: cannot read variable name." ); - - VBD( pVar = m_pEffect->FindVariableByName(pGlobalVarName), "Loading error: cannot find variable name." ); - - if (pAssignment->IsObjectAssignment()) - { - VBD( pVar->pType->VarType == EVT_Object && - GetSimpleParameterTypeFromObjectType(pVar->pType->ObjectType) == g_lvGeneral[psAssignments[i].iState].m_Type, - "Loading error: invalid variable type or object type." ); - - // Write directly into the state block's backing store - *((void **)pLHS) = pVar->Data.pGeneric; - - // Now we can get rid of this assignment - } - else - { - VBD( pVar->pType->BelongsInConstantBuffer(), "Invalid pEffectBuffer: assignment type mismatch." ); - - pAssignment->DependencyCount = 1; - VN( pAssignment->pDependencies = PRIVATENEW SAssignment::SDependency[pAssignment->DependencyCount] ); - pAssignment->pDependencies->pVariable = pVar; - - // Store an offset for numeric values instead of a pointer so that it's easy to relocate it later - pAssignment->Source.Offset = pVar->Data.Offset; - pAssignment->AssignmentType = ERAT_NumericVariable; - - // Can't get rid of this assignment - ++ finalAssignments; - } - break; - - case ECAT_ConstIndex: // e.g. LHS = myGS[1] - SBinaryAssignment::SConstantIndex *psConstIndex; - - VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, sizeof(*psConstIndex), (void**) &psConstIndex), - "Invalid pEffectBuffer: cannot read assignment initializer." ); - VHD( m_msUnstructured.ReadAtOffset(psConstIndex->oArrayName, &pGlobalVarName), "Invalid pEffectBuffer: cannot read array name." ); - - VBD( pVarArray = m_pEffect->FindVariableByName(pGlobalVarName), "Loading error: cannot find array name." ); - - if (pAssignment->IsObjectAssignment()) - { - VBD( psConstIndex->Index < pVarArray->pType->Elements, "Invalid pEffectBuffer: out of bounds array index." ); - VBD( pVarArray->pType->VarType == EVT_Object && - GetSimpleParameterTypeFromObjectType(pVarArray->pType->ObjectType) == g_lvGeneral[psAssignments[i].iState].m_Type, - "Loading error: invalid variable type or object type." ); - - // Write directly into the state block's backing store - *((void **)pLHS) = GetBlockByIndex(pVarArray->pType->VarType, pVarArray->pType->ObjectType, pVarArray->Data.pGeneric, psConstIndex->Index); - VBD( nullptr != *((void **)pLHS), "Internal loading error: invalid block." ); - - // Now we can get rid of this assignment - } - else - { - VBD( pVarArray->pType->BelongsInConstantBuffer(), "Invalid pEffectBuffer: assignment type mismatch." ); - - pAssignment->DependencyCount = 1; - VN( pAssignment->pDependencies = PRIVATENEW SAssignment::SDependency[pAssignment->DependencyCount] ); - pAssignment->pDependencies->pVariable = pVarArray; - - CCheckedDword chkDataLen = psConstIndex->Index; - uint32_t dataLen; - chkDataLen *= SType::c_ScalarSize; - chkDataLen += pAssignment->DataSize; - VHD( chkDataLen.GetValue(&dataLen), "Overflow: assignment size." ); - VBD( dataLen <= pVarArray->pType->TotalSize, "Internal loading error: assignment size mismatch" ); - - pAssignment->Source.Offset = pVarArray->Data.Offset + psConstIndex->Index * SType::c_ScalarSize; - - // _NumericConstIndex is not used here because _NumericVariable - // does the same stuff in a more general fashion with no perf hit. - pAssignment->AssignmentType = ERAT_NumericVariable; - - // Can't get rid of this assignment - ++ finalAssignments; - } - break; - - case ECAT_VariableIndex: // e.g. LHS = myVar[numLights]; - SBinaryAssignment::SVariableIndex *psVarIndex; - - VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, sizeof(*psVarIndex), (void**) &psVarIndex), - "Invalid pEffectBuffer: cannot read assignment initializer." ); - VHD( m_msUnstructured.ReadAtOffset(psVarIndex->oArrayName, &pGlobalVarName), "Invalid pEffectBuffer: cannot read variable name." ); - VBD( pVarArray = m_pEffect->FindVariableByName(pGlobalVarName), "Loading error: cannot find variable name." ); - - VHD( m_msUnstructured.ReadAtOffset(psVarIndex->oIndexVarName, &pGlobalVarName), "Invalid pEffectBuffer: cannot read index variable name." ); - VBD( pVarIndex = m_pEffect->FindVariableByName(pGlobalVarName), "Loading error: cannot find index variable name." ); - - // Only support integer indices - VBD( pVarIndex->pType->VarType == EVT_Numeric && (pVarIndex->pType->NumericType.ScalarType == EST_Int || pVarIndex->pType->NumericType.ScalarType == EST_UInt), - "Invalid pEffectBuffer: invalid index variable type."); - VBD( pVarArray->pType->Elements > 0, "Invalid pEffectBuffer: array variable is not an array." ); - - pVarIndex->pCB->IsUsedByExpression = true; - - if (pAssignment->IsObjectAssignment()) - { - VBD( pVarArray->pType->VarType == EVT_Object && - GetSimpleParameterTypeFromObjectType(pVarArray->pType->ObjectType) == g_lvGeneral[psAssignments[i].iState].m_Type, - "Loading error: invalid variable type or object type." ); - - // MaxElements is only 16-bits wide - VBD( pVarArray->pType->Elements <= 0xFFFF, "Internal error: array size is too large." ); - pAssignment->MaxElements = pVarArray->pType->Elements; - - pAssignment->DependencyCount = 1; - VN( pAssignment->pDependencies = PRIVATENEW SAssignment::SDependency[pAssignment->DependencyCount] ); - pAssignment->pDependencies[0].pVariable = pVarIndex; - - // Point this assignment to the start of the variable's object array. - // When this assignment is dirty, we write the value of this pointer plus - // the index given by its one dependency directly into the destination - pAssignment->Source = pVarArray->Data; - pAssignment->AssignmentType = ERAT_ObjectVariableIndex; - } - else - { - VBD( pVarArray->pType->BelongsInConstantBuffer(), "Invalid pEffectBuffer: assignment type mismatch." ); - - pAssignment->DependencyCount = 2; - VN( pAssignment->pDependencies = PRIVATENEW SAssignment::SDependency[pAssignment->DependencyCount] ); - pAssignment->pDependencies[0].pVariable = pVarIndex; - pAssignment->pDependencies[1].pVariable = pVarArray; - - // When pVarIndex is updated, we update the source pointer. - // When pVarArray is updated, we copy data from the source to the destination. - pAssignment->Source.pGeneric = nullptr; - pAssignment->AssignmentType = ERAT_NumericVariableIndex; - } - - // Can't get rid of this assignment - ++ finalAssignments; - - break; - - case ECAT_ExpressionIndex:// e.g. LHS = myVar[a + b * c]; - case ECAT_Expression: // e.g. LHS = a + b * c; - // we do not support FXLVM - VHD( E_NOTIMPL, "FXLVM Expressions (complex assignments like myVar[i*2]) are not supported in Effects11." ); - break; - - case ECAT_InlineShader: - case ECAT_InlineShader5: - uint32_t cbShaderBin; - uint8_t *pShaderBin; - SShaderBlock *pShaderBlock; - SAnonymousShader *pAnonShader; - union - { - SBinaryAssignment::SInlineShader *psInlineShader; - SBinaryShaderData5 *psInlineShader5; - }; - - // Inline shader assignments must be object types - assert(pAssignment->IsObjectAssignment()); - - C_ASSERT( offsetof(SBinaryAssignment::SInlineShader,oShader) == offsetof(SBinaryShaderData5,oShader) ); - C_ASSERT( offsetof(SBinaryAssignment::SInlineShader,oSODecl) == offsetof(SBinaryShaderData5,oSODecls) ); - if( psAssignments[i].AssignmentType == ECAT_InlineShader ) - { - VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, sizeof(*psInlineShader), (void**) &psInlineShader), - "Invalid pEffectBuffer: cannot read inline shader." ); - } - else - { - VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, sizeof(*psInlineShader5), (void**) &psInlineShader5), - "Invalid pEffectBuffer: cannot read inline shader." ); - } - - VBD( m_pEffect->m_ShaderBlockCount < m_pHeader->cTotalShaders, "Internal loading error: shader count is out incorrect." ); - VBD( m_pEffect->m_AnonymousShaderCount < m_pHeader->cInlineShaders, "Internal loading error: anonymous shader count is out incorrect." ); - - pShaderBlock = &m_pEffect->m_pShaderBlocks[m_pEffect->m_ShaderBlockCount]; - pAnonShader = &m_pEffect->m_pAnonymousShaders[m_pEffect->m_AnonymousShaderCount]; - pAnonShader->pShaderBlock = pShaderBlock; - - ++ m_pEffect->m_ShaderBlockCount; - ++ m_pEffect->m_AnonymousShaderCount; - - // Write directly into the state block's backing store - *((void **)pLHS) = pShaderBlock; - - VHD( GetUnstructuredDataBlock(psInlineShader->oShader, &cbShaderBin, (void **) &pShaderBin), "Invalid pEffectBuffer: cannot read inline shader block." ); - - if (cbShaderBin > 0) - { - VN( pShaderBlock->pReflectionData = PRIVATENEW SShaderBlock::SReflectionData ); - - pShaderBlock->pReflectionData->BytecodeLength = cbShaderBin; - pShaderBlock->pReflectionData->pBytecode = (uint8_t*) pShaderBin; - pShaderBlock->pReflectionData->pStreamOutDecls[0] = - pShaderBlock->pReflectionData->pStreamOutDecls[1] = - pShaderBlock->pReflectionData->pStreamOutDecls[2] = - pShaderBlock->pReflectionData->pStreamOutDecls[3] = nullptr; - pShaderBlock->pReflectionData->RasterizedStream = 0; - pShaderBlock->pReflectionData->IsNullGS = FALSE; - pShaderBlock->pReflectionData->pReflection = nullptr; - pShaderBlock->pReflectionData->InterfaceParameterCount = 0; - pShaderBlock->pReflectionData->pInterfaceParameters = nullptr; - } - - switch (pAssignment->LhsType) - { - case ELHS_PixelShaderBlock: - pShaderBlock->pVT = &g_vtPS; - VBD( psInlineShader->oSODecl == 0, "Internal loading error: pixel shaders cannot have stream out decls." ); - break; - - case ELHS_GeometryShaderBlock: - pShaderBlock->pVT = &g_vtGS; - if( psAssignments[i].AssignmentType == ECAT_InlineShader ) - { - if (psInlineShader->oSODecl) - { - // This is a GS with SO - VHD( GetStringAndAddToReflection(psInlineShader->oSODecl, &pShaderBlock->pReflectionData->pStreamOutDecls[0]), - "Invalid pEffectBuffer: cannot read SO decl." ); - } - } - else - { - // This is a GS with addressable stream out - for( size_t iDecl=0; iDecl < psInlineShader5->cSODecls; ++iDecl ) - { - if (psInlineShader5->oSODecls[iDecl]) - { - VHD( GetStringAndAddToReflection(psInlineShader5->oSODecls[iDecl], &pShaderBlock->pReflectionData->pStreamOutDecls[iDecl]), - "Invalid pEffectBuffer: cannot read SO decl." ); - } - } - pShaderBlock->pReflectionData->RasterizedStream = psInlineShader5->RasterizedStream; - } - break; - - case ELHS_VertexShaderBlock: - pShaderBlock->pVT = &g_vtVS; - VBD( psInlineShader->oSODecl == 0, "Internal loading error: vertex shaders cannot have stream out decls." ); - break; - - case ELHS_HullShaderBlock: - pShaderBlock->pVT = &g_vtHS; - VBD( psInlineShader->oSODecl == 0, "Internal loading error: hull shaders cannot have stream out decls." ); - break; - - case ELHS_DomainShaderBlock: - pShaderBlock->pVT = &g_vtDS; - VBD( psInlineShader->oSODecl == 0, "Internal loading error: domain shaders cannot have stream out decls." ); - break; - - case ELHS_ComputeShaderBlock: - pShaderBlock->pVT = &g_vtCS; - VBD( psInlineShader->oSODecl == 0, "Internal loading error: compute shaders cannot have stream out decls." ); - break; - - case ELHS_GeometryShaderSO: - assert(0); // Should never happen - - default: - VHD( E_FAIL, "Internal loading error: invalid shader type." ); - } - - if( psAssignments[i].AssignmentType == ECAT_InlineShader5 ) - { - pShaderBlock->pReflectionData->InterfaceParameterCount = psInlineShader5->cInterfaceBindings; - VH( GetInterfaceParametersAndAddToReflection( psInlineShader5->cInterfaceBindings, psInlineShader5->oInterfaceBindings, &pShaderBlock->pReflectionData->pInterfaceParameters ) ); - } - - // Now we can get rid of this assignment - break; - - default: - assert(0); - - } - } - - *pFinalAssignments = finalAssignments; - if (pRTVAssignments) - *pRTVAssignments = renderTargetViewAssns; - -lExit: - return hr; -} - - -// Read info from the compiled blob and initialize an object variable -HRESULT CEffectLoader::LoadObjectVariables() -{ - HRESULT hr = S_OK; - - size_t cBlocks = m_pHeader->Effect.cObjectVariables; - - for (size_t iBlock=0; iBlockm_VariableCount < (m_pHeader->Effect.cObjectVariables + m_pHeader->Effect.cNumericVariables + m_pHeader->cInterfaceVariables), - "Internal loading error: variable count mismatch." ); - pVar = &m_pEffect->m_pVariables[m_pEffect->m_VariableCount]; - - // Get type - VH( LoadTypeAndAddToPool(&pType, psBlock->oType) ); - - // Make sure the right polymorphic type is created - VH( PlacementNewVariable(pVar, pType, false) ); - - pVar->pEffect = m_pEffect; - pVar->pType = pType; - pVar->pCB = nullptr; - pVar->ExplicitBindPoint = psBlock->ExplicitBindPoint; - - if( pType->IsStateBlockObject() ) - { - pVar->MemberDataOffsetPlus4 = m_pEffect->m_MemberDataCount * sizeof(SMemberDataPointer) + 4; - m_pEffect->m_MemberDataCount += std::max(pType->Elements,1); - } - - // Get name - VHD( GetStringAndAddToReflection(psBlock->oName, &pVar->pName), "Invalid pEffectBuffer: cannot read object variable name." ); - VHD( GetStringAndAddToReflection(psBlock->oSemantic, &pVar->pSemantic), "Invalid pEffectBuffer: cannot read object variable semantic." ); - - m_pEffect->m_VariableCount++; - elementsToRead = std::max(1, pType->Elements); - chkElementsTotal = elementsToRead; - - if (pType->IsStateBlockObject()) - { - // State blocks - EBlockType blockType; - uint32_t *maxBlockCount; - uint32_t *currentBlockCount; - - switch (pType->ObjectType) - { - case EOT_Blend: - pVar->Data.pBlock = &m_pEffect->m_pBlendBlocks[m_pEffect->m_BlendBlockCount]; - maxBlockCount = &m_pHeader->cBlendStateBlocks; - currentBlockCount = &m_pEffect->m_BlendBlockCount; - blockType = EBT_Blend; - break; - - case EOT_DepthStencil: - pVar->Data.pBlock = &m_pEffect->m_pDepthStencilBlocks[m_pEffect->m_DepthStencilBlockCount]; - maxBlockCount = &m_pHeader->cDepthStencilBlocks; - currentBlockCount = &m_pEffect->m_DepthStencilBlockCount; - blockType = EBT_DepthStencil; - break; - - case EOT_Rasterizer: - pVar->Data.pBlock = &m_pEffect->m_pRasterizerBlocks[m_pEffect->m_RasterizerBlockCount]; - maxBlockCount = &m_pHeader->cRasterizerStateBlocks; - currentBlockCount = &m_pEffect->m_RasterizerBlockCount; - blockType = EBT_Rasterizer; - break; - - default: - VB(pType->IsSampler()); - pVar->Data.pBlock = &m_pEffect->m_pSamplerBlocks[m_pEffect->m_SamplerBlockCount]; - maxBlockCount = &m_pHeader->cSamplers; - currentBlockCount = &m_pEffect->m_SamplerBlockCount; - blockType = EBT_Sampler; - } - - chkElementsTotal += *currentBlockCount; - VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: vaiable elements." ); - VBD( elementsTotal <= *maxBlockCount, "Internal loading error: element count overflow." ); - - *currentBlockCount += elementsToRead; - - for (uint32_t iElement = 0; iElement < elementsToRead; ++ iElement) - { - SBaseBlock *pCurrentBlock; - uint32_t cAssignments; - - pCurrentBlock = (SBaseBlock *) GetBlockByIndex(pVar->pType->VarType, pVar->pType->ObjectType, pVar->Data.pGeneric, iElement); - VBD( nullptr != pCurrentBlock, "Internal loading error: find state block." ); - - pCurrentBlock->BlockType = blockType; - - VHD( m_msStructured.Read(&cAssignments), "Invalid pEffectBuffer: cannot read state block assignments." ); - - VH( LoadAssignments( cAssignments, &pCurrentBlock->pAssignments, (uint8_t*)pCurrentBlock, nullptr, &pCurrentBlock->AssignmentCount ) ); - } - } - else if (pType->IsShader()) - { - // Shaders - - chkElementsTotal += m_pEffect->m_ShaderBlockCount; - VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: shader block count." ); - VBD( elementsTotal <= m_pHeader->cTotalShaders, "Invalid pEffectBuffer: shader count mismatch." ); - - pVar->Data.pShader = &m_pEffect->m_pShaderBlocks[m_pEffect->m_ShaderBlockCount]; - - for (size_t iElement=0; iElementm_pShaderBlocks[m_pEffect->m_ShaderBlockCount]; - m_pEffect->m_ShaderBlockCount++; - - // Get shader binary - switch (pType->ObjectType) - { - case EOT_VertexShader: - case EOT_GeometryShader: - case EOT_PixelShader: - VHD( m_msStructured.Read((void**)&pOffset, sizeof(*pOffset)), "Invalid pEffectBuffer: cannot read shader block." ); - break; - - case EOT_GeometryShaderSO: - VHD( m_msStructured.Read((void**)&psInlineGSSO4, sizeof(*psInlineGSSO4)), "Invalid pEffectBuffer: cannot read inline GS with SO." ); - break; - - case EOT_VertexShader5: - case EOT_GeometryShader5: - case EOT_HullShader5: - case EOT_DomainShader5: - case EOT_PixelShader5: - case EOT_ComputeShader5: - VHD( m_msStructured.Read((void**)&psInlineShader5, sizeof(*psInlineShader5)), "Invalid pEffectBuffer: cannot read inline shader." ); - break; - - default: - VH( E_FAIL ); - } - - VHD( GetUnstructuredDataBlock(*pOffset, &cbShaderBin, &pShaderBin), "Invalid pEffectBuffer: cannot read shader byte code." ); - - if (cbShaderBin > 0) - { - VN( pShaderBlock->pReflectionData = PRIVATENEW SShaderBlock::SReflectionData ); - - pShaderBlock->pReflectionData->BytecodeLength = cbShaderBin; - pShaderBlock->pReflectionData->pBytecode = (uint8_t*) pShaderBin; - pShaderBlock->pReflectionData->pStreamOutDecls[0] = - pShaderBlock->pReflectionData->pStreamOutDecls[1] = - pShaderBlock->pReflectionData->pStreamOutDecls[2] = - pShaderBlock->pReflectionData->pStreamOutDecls[3] = nullptr; - pShaderBlock->pReflectionData->RasterizedStream = 0; - pShaderBlock->pReflectionData->IsNullGS = FALSE; - pShaderBlock->pReflectionData->pReflection = nullptr; - pShaderBlock->pReflectionData->InterfaceParameterCount = 0; - pShaderBlock->pReflectionData->pInterfaceParameters = nullptr; - } - - switch (pType->ObjectType) - { - case EOT_PixelShader: - pShaderBlock->pVT = &g_vtPS; - break; - - case EOT_GeometryShaderSO: - // Get StreamOut decl - //VH( m_msStructured.Read(&dwOffset) ); - if (cbShaderBin > 0) - { - VHD( GetStringAndAddToReflection(psInlineGSSO4->oSODecl, &pShaderBlock->pReflectionData->pStreamOutDecls[0]), - "Invalid pEffectBuffer: cannot read stream out decl." ); - } - pShaderBlock->pVT = &g_vtGS; - break; - - case EOT_VertexShader5: - case EOT_GeometryShader5: - case EOT_HullShader5: - case EOT_DomainShader5: - case EOT_PixelShader5: - case EOT_ComputeShader5: - // Get StreamOut decls - if (cbShaderBin > 0) - { - for( size_t iDecl=0; iDecl < psInlineShader5->cSODecls; ++iDecl ) - { - VHD( GetStringAndAddToReflection(psInlineShader5->oSODecls[iDecl], &pShaderBlock->pReflectionData->pStreamOutDecls[iDecl]), - "Invalid pEffectBuffer: cannot read stream out decls." ); - } - pShaderBlock->pReflectionData->RasterizedStream = psInlineShader5->RasterizedStream; - pShaderBlock->pReflectionData->InterfaceParameterCount = psInlineShader5->cInterfaceBindings; - VH( GetInterfaceParametersAndAddToReflection( psInlineShader5->cInterfaceBindings, psInlineShader5->oInterfaceBindings, &pShaderBlock->pReflectionData->pInterfaceParameters ) ); - } - switch (pType->ObjectType) - { - case EOT_VertexShader5: - pShaderBlock->pVT = &g_vtVS; - break; - case EOT_GeometryShader5: - pShaderBlock->pVT = &g_vtGS; - break; - case EOT_HullShader5: - pShaderBlock->pVT = &g_vtHS; - break; - case EOT_DomainShader5: - pShaderBlock->pVT = &g_vtDS; - break; - case EOT_PixelShader5: - pShaderBlock->pVT = &g_vtPS; - break; - case EOT_ComputeShader5: - pShaderBlock->pVT = &g_vtCS; - break; - default: - VH( E_FAIL ); - } - break; - - case EOT_GeometryShader: - pShaderBlock->pVT = &g_vtGS; - break; - - case EOT_VertexShader: - pShaderBlock->pVT = &g_vtVS; - break; - - default: - VHD( E_FAIL, "Invalid pEffectBuffer: invalid shader type." ); - } - } - } - else if (pType->IsObjectType(EOT_String)) - { - // Strings - - chkElementsTotal += m_pEffect->m_StringCount; - VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: string object count." ); - VBD( elementsTotal <= m_pHeader->cStrings, "Invalid pEffectBuffer: string count mismatch." ); - - pVar->Data.pString = &m_pEffect->m_pStrings[m_pEffect->m_StringCount]; - - for (size_t iElement=0; iElementm_pStrings[m_pEffect->m_StringCount]; - m_pEffect->m_StringCount++; - - // Get string - VHD( m_msStructured.Read(&dwOffset), "Invalid pEffectBuffer: cannot read string offset." ); - VHD( GetStringAndAddToReflection(dwOffset, &pString->pString), "Invalid pEffectBuffer: cannot read string." ); - } - } - else if (pType->IsShaderResource()) - { - // Textures/buffers - - chkElementsTotal += m_pEffect->m_ShaderResourceCount; - VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: SRV object count." ); - VBD( elementsTotal <= m_pHeader->cShaderResources, "Invalid pEffectBuffer: SRV count mismatch." ); - - pVar->Data.pShaderResource = &m_pEffect->m_pShaderResources[m_pEffect->m_ShaderResourceCount]; - m_pEffect->m_ShaderResourceCount += elementsToRead; - } - else if (pType->IsUnorderedAccessView()) - { - // UnorderedAccessViews - - chkElementsTotal += m_pEffect->m_UnorderedAccessViewCount; - VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: UAV object count." ); - VBD( elementsTotal <= m_pHeader->cUnorderedAccessViews, "Invalid pEffectBuffer: UAV count mismatch." ); - - pVar->Data.pUnorderedAccessView = &m_pEffect->m_pUnorderedAccessViews[m_pEffect->m_UnorderedAccessViewCount]; - m_pEffect->m_UnorderedAccessViewCount += elementsToRead; - } - else if (pType->IsRenderTargetView()) - { - // RenderTargets - - chkElementsTotal += m_pEffect->m_RenderTargetViewCount; - VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: RTV object count." ); - VBD( elementsTotal <= m_pHeader->cRenderTargetViews, "Invalid pEffectBuffer: RTV count mismatch." ); - - pVar->Data.pRenderTargetView = &m_pEffect->m_pRenderTargetViews[m_pEffect->m_RenderTargetViewCount]; - m_pEffect->m_RenderTargetViewCount += elementsToRead; - } - else if (pType->IsDepthStencilView()) - { - // DepthStencilViews - - chkElementsTotal += m_pEffect->m_DepthStencilViewCount; - VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: DSV object count." ); - VBD( elementsTotal <= m_pHeader->cDepthStencilViews, "Invalid pEffectBuffer: DSV count mismatch." ); - - pVar->Data.pDepthStencilView = &m_pEffect->m_pDepthStencilViews[m_pEffect->m_DepthStencilViewCount]; - m_pEffect->m_DepthStencilViewCount += elementsToRead; - } - else - { - VHD( E_FAIL, "Invalid pEffectBuffer: DSV count mismatch." ); - } - - // Read annotations - VH( LoadAnnotations(&pVar->AnnotationCount, &pVar->pAnnotations) ); - } -lExit: - return hr; -} - - -// Read info from the compiled blob and initialize an interface variable -HRESULT CEffectLoader::LoadInterfaceVariables() -{ - HRESULT hr = S_OK; - uint32_t iBlock; - uint32_t cBlocks; - - cBlocks = m_pHeader->cInterfaceVariables; - - for (iBlock=0; iBlockm_VariableCount < (m_pHeader->Effect.cObjectVariables + m_pHeader->Effect.cNumericVariables + m_pHeader->cInterfaceVariables), - "Internal loading error: variable count mismatch." ); - pVar = &m_pEffect->m_pVariables[m_pEffect->m_VariableCount]; - - // Get type - VH( LoadTypeAndAddToPool(&pType, psBlock->oType) ); - - // Make sure the right polymorphic type is created - VH( PlacementNewVariable(pVar, pType, false) ); - - pVar->pEffect = m_pEffect; - pVar->pType = pType; - pVar->pCB = nullptr; - pVar->ExplicitBindPoint = (uint32_t)-1; - pVar->pSemantic = nullptr; - - // Get name - VHD( GetStringAndAddToReflection(psBlock->oName, &pVar->pName), "Invalid pEffectBuffer: cannot read interface name." ); - - m_pEffect->m_VariableCount++; - elementsToRead = std::max(1, pType->Elements); - chkElementsTotal = elementsToRead; - - VBD( pType->IsInterface(), "Internal loading error: invlaid type for interface." ); - - chkElementsTotal += m_pEffect->m_InterfaceCount; - VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: interface count." ); - VBD( elementsTotal <= m_pHeader->cInterfaceVariableElements, "Invalid pEffectBuffer: interface count mismatch." ); - - pVar->Data.pInterface = &m_pEffect->m_pInterfaces[m_pEffect->m_InterfaceCount]; - m_pEffect->m_InterfaceCount += elementsToRead; - - // Get default value - if (0 != psBlock->oDefaultValue) - { - VHD( m_msUnstructured.ReadAtOffset(psBlock->oDefaultValue, elementsToRead * sizeof(SBinaryInterfaceInitializer), &pDefaultValue), - "Invalid pEffectBuffer: cannot read interface initializer offset." ); - for( size_t i=0; i < elementsToRead; i++ ) - { - SBinaryInterfaceInitializer* pInterfaceInit = &((SBinaryInterfaceInitializer*)pDefaultValue)[i]; - LPCSTR pClassInstanceName; - VHD( m_msUnstructured.ReadAtOffset(pInterfaceInit->oInstanceName, &pClassInstanceName), "Invalid pEffectBuffer: cannot read interface initializer." ); - - SGlobalVariable *pCIVariable = m_pEffect->FindVariableByName(pClassInstanceName); - VBD( pCIVariable != nullptr, "Loading error: cannot find class instance for interface initializer." ); - VBD( pCIVariable->pType->IsClassInstance(), "Loading error: variable type mismatch for interface initializer." ); - if( pInterfaceInit->ArrayIndex == (uint32_t)-1 ) - { - VBD( pCIVariable->pType->Elements == 0, "Loading error: array mismatch for interface initializer." ); - pVar->Data.pInterface[i].pClassInstance = (SClassInstanceGlobalVariable*)pCIVariable; - } - else - { - VBD( pCIVariable->pType->Elements > 0, "Loading error: array mismatch for interface initializer." ); - VBD( pInterfaceInit->ArrayIndex < pCIVariable->pType->Elements, "Loading error: array index out of range." ); - - SMember* pMember = (SMember*)pCIVariable->GetElement( pInterfaceInit->ArrayIndex ); - VBD( pMember->IsValid(), "Loading error: cannot find member by name." ); - VBD( pMember->pType->IsClassInstance(), "Loading error: member type mismatch for interface initializer." ); - pVar->Data.pInterface[i].pClassInstance = (SClassInstanceGlobalVariable*)pMember; - } - } - } - - - // Read annotations - VH( LoadAnnotations(&pVar->AnnotationCount, &pVar->pAnnotations) ); - } -lExit: - return hr; -} - - -// Read info from the compiled blob and initialize a group (and contained techniques and passes) -HRESULT CEffectLoader::LoadGroups() -{ - HRESULT hr = S_OK; - uint32_t TechniquesInEffect = 0; - - for( size_t iGroup=0; iGroupcGroups; iGroup++ ) - { - SGroup *pGroup = &m_pEffect->m_pGroups[iGroup]; - SBinaryGroup *psGroup; - - // Read group info - VHD( m_msStructured.Read((void**) &psGroup, sizeof(*psGroup)), "Invalid pEffectBuffer: cannot read group." ); - pGroup->TechniqueCount = psGroup->cTechniques; - VN( pGroup->pTechniques = PRIVATENEW STechnique[pGroup->TechniqueCount] ); - VHD( GetStringAndAddToReflection(psGroup->oName, &pGroup->pName), "Invalid pEffectBuffer: cannot read group name." ); - - if( pGroup->pName == nullptr ) - { - VBD( m_pEffect->m_pNullGroup == nullptr, "Internal loading error: multiple nullptr groups." ); - m_pEffect->m_pNullGroup = pGroup; - } - - // Read annotations - VH( LoadAnnotations(&pGroup->AnnotationCount, &pGroup->pAnnotations) ); - - for( size_t iTechnique=0; iTechnique < psGroup->cTechniques; iTechnique++ ) - { - VH( LoadTechnique( &pGroup->pTechniques[iTechnique] ) ); - } - TechniquesInEffect += psGroup->cTechniques; - } - - VBD( TechniquesInEffect == m_pHeader->cTechniques, "Loading error: technique count mismatch." ); - m_pEffect->m_TechniqueCount = m_pHeader->cTechniques; - m_pEffect->m_GroupCount = m_pHeader->cGroups; - -lExit: - return hr; -} - - -// Read info from the compiled blob and initialize a technique (and contained passes) -HRESULT CEffectLoader::LoadTechnique( STechnique* pTech ) -{ - HRESULT hr = S_OK; - uint32_t iPass; - - SBinaryTechnique *psTech; - - // Read technique info - VHD( m_msStructured.Read((void**) &psTech, sizeof(*psTech)), "Invalid pEffectBuffer: cannot read technique." ); - pTech->PassCount = psTech->cPasses; - VN( pTech->pPasses = PRIVATENEW SPassBlock[pTech->PassCount] ); - VHD( GetStringAndAddToReflection(psTech->oName, &pTech->pName), "Invalid pEffectBuffer: cannot read technique name." ); - - // Read annotations - VH( LoadAnnotations(&pTech->AnnotationCount, &pTech->pAnnotations) ); - - for (iPass=0; iPasscPasses; iPass++) - { - SBinaryPass *psPass; - SPassBlock *pPass = &pTech->pPasses[iPass]; - - // Read pass info - VHD( m_msStructured.Read((void**) &psPass, sizeof(SBinaryPass)), "Invalid pEffectBuffer: cannot read pass." ); - VHD( GetStringAndAddToReflection(psPass->oName, &pPass->pName), "Invalid pEffectBuffer: cannot read pass name." ); - - // Read annotations - VH( LoadAnnotations(&pPass->AnnotationCount, &pPass->pAnnotations) ); - - VH( LoadAssignments( psPass->cAssignments, &pPass->pAssignments, (uint8_t*)pPass, &pPass->BackingStore.RenderTargetViewCount, &pPass->AssignmentCount ) ); - VBD( pPass->BackingStore.RenderTargetViewCount <= D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, "Invalid pEffectBuffer: too many RTVs in pass." ); - - // Initialize other pass information - pPass->pEffect = m_pEffect; - pPass->BlockType = EBT_Pass; - } - -lExit: - return hr; -} - - -// Read info from the compiled blob and initialize a set of annotations -HRESULT CEffectLoader::LoadAnnotations(uint32_t *pcAnnotations, SAnnotation **ppAnnotations) -{ - HRESULT hr = S_OK; - uint32_t cAnnotations, i, oData; - SAnnotation *pAnnotations = nullptr; - - VHD( m_msStructured.Read(&cAnnotations), "Invalid pEffectBuffer: cannot read anootation count." ); - - if (cAnnotations) - { - uint32_t annotationsSize; - CCheckedDword chkAnnotationsSize; - - chkAnnotationsSize = cAnnotations; - chkAnnotationsSize *= sizeof(SAnnotation); - VHD( chkAnnotationsSize.GetValue(&annotationsSize), "Overflow in annotations." ); - - // we allocate raw bytes for annotations because they are polymorphic types that need to be placement new'ed - VN( pAnnotations = (SAnnotation *) PRIVATENEW uint8_t[annotationsSize] ); - - for (i=0; ioType) ); - - // Make sure the right polymorphic type is created - VH( PlacementNewVariable(pAn, pType, true) ); - - pAn->pEffect = m_pEffect; - pAn->pType = pType; - - VHD( GetStringAndAddToReflection(psAnnotation->oName, &pAn->pName), "Invalid pEffectBuffer: cannot read annotation name." ); - - if (pType->IsObjectType(EOT_String)) - { - uint32_t cElements = std::max(1, pType->Elements); - uint32_t j; - VN( pAn->Data.pString = PRIVATENEW SString[cElements] ); - for (j = 0; j < cElements; ++ j) - { - // Read initializer offset - VHD( m_msStructured.Read(&oData), "Invalid pEffectBuffer: cannot read string." ); -#pragma warning( disable : 6011 ) - VHD( GetStringAndAddToReflection(oData, &pAn->Data.pString[j].pString), "Invalid pEffectBuffer: cannot read string initializer." ); - } - } - else if (pType->BelongsInConstantBuffer()) - { - void *pDefaultValue; - uint32_t bytesUnpacked; - - // Read initializer offset - VHD( m_msStructured.Read(&oData), "Invalid pEffectBuffer: cannot read annotation." ); - - VBD( oData != 0, "Invalid pEffectBuffer: invalid anotation offset." ); - - VN( pAn->Data.pGeneric = PRIVATENEW uint8_t[pType->TotalSize] ); - ZeroMemory(pAn->Data.pGeneric, pType->TotalSize); - VHD( m_msUnstructured.ReadAtOffset(oData, pType->PackedSize, &pDefaultValue), "Invalid pEffectBuffer: cannot read variable default value." ); - VH( UnpackData((uint8_t*) pAn->Data.pGeneric, (uint8_t*) pDefaultValue, pType->PackedSize, pType, &bytesUnpacked) ); - VBD( bytesUnpacked == pType->PackedSize, "Invalid pEffectBuffer: packed sizes to not match." ); - } - else - { - VHD( E_FAIL, "Invalid pEffectBuffer: invalid annotation type." ); - } - } - } - - *pcAnnotations = cAnnotations; - *ppAnnotations = pAnnotations; -lExit: - - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// Build shader block dependencies from shader metadata -////////////////////////////////////////////////////////////////////////// - -// -// Grabs shader resource dependency information from the bytecode of the shader -// (cbuffer, tbuffer, texture, buffer, sampler, and UAV dependencies), -// and sets up the given SShaderBlock to point to the dependencies within the effect -// -HRESULT CEffectLoader::GrabShaderData(SShaderBlock *pShaderBlock) -{ - HRESULT hr = S_OK; - CEffectVector vRanges[ER_Count], *pvRange; - - SRange *pRange = nullptr; - CEffectVector vTBuffers; - - ////////////////////////////////////////////////////////////////////////// - // Step 1: iterate through the resource binding structures and build - // an "optimized" list of all of the dependencies - - D3D11_SHADER_DESC ShaderDesc; - hr = pShaderBlock->pReflectionData->pReflection->GetDesc( &ShaderDesc ); - if ( FAILED(hr) ) - return hr; - - // Since we have the shader desc, let's find out if this is a nullptr GS - if( D3D11_SHVER_GET_TYPE( ShaderDesc.Version ) == D3D11_SHVER_VERTEX_SHADER && pShaderBlock->GetShaderType() == EOT_GeometryShader ) - { - pShaderBlock->pReflectionData->IsNullGS = true; - } - - pShaderBlock->CBDepCount = pShaderBlock->ResourceDepCount = pShaderBlock->TBufferDepCount = pShaderBlock->SampDepCount = 0; - pShaderBlock->UAVDepCount = pShaderBlock->InterfaceDepCount = 0; - - for(uint32_t i = 0; i < ShaderDesc.BoundResources; i++) - { - LPCSTR pName; - uint32_t bindPoint, size; - ERanges eRange = ER_CBuffer; - SShaderResource *pShaderResource = nullptr; - SUnorderedAccessView *pUnorderedAccessView = nullptr; - SSamplerBlock *pSampler = nullptr; - SConstantBuffer *pCB = nullptr; - SVariable *pVariable = nullptr; - bool isFX9TextureLoad = false; - D3D11_SHADER_INPUT_BIND_DESC ResourceDesc; - - pShaderBlock->pReflectionData->pReflection->GetResourceBindingDesc( i, &ResourceDesc ); - - // HUGE ASSUMPTION: the bindpoints we read in the shader metadata are sorted; - // i.e. bindpoints are steadily increasing - // If this assumption is not met, then we will hit an assert below - - pName = ResourceDesc.Name; - bindPoint = ResourceDesc.BindPoint; - size = ResourceDesc.BindCount; - - switch( ResourceDesc.Type ) - { - case D3D_SIT_CBUFFER: - eRange = ER_CBuffer; - - pCB = m_pEffect->FindCB(pName); - VBD( nullptr != pCB, "Loading error: cannot find cbuffer." ); - VBD( size == 1, "Loading error: cbuffer arrays are not supported." ); - break; - - case D3D_SIT_TBUFFER: - eRange = ER_Texture; - - pCB = m_pEffect->FindCB(pName); - VBD( nullptr != pCB, "Loading error: cannot find tbuffer." ); - VBD( false != pCB->IsTBuffer, "Loading error: cbuffer found where tbuffer is expected." ); - VBD( size == 1, "Loading error: tbuffer arrays are not supported." ); - pShaderResource = &pCB->TBuffer; - break; - - case D3D_SIT_TEXTURE: - case D3D_SIT_STRUCTURED: - case D3D_SIT_BYTEADDRESS: - { - eRange = ER_Texture; - - pVariable = m_pEffect->FindVariableByNameWithParsing(pName); - VBD( pVariable != nullptr, "Loading error: cannot find SRV variable." ); - uint32_t elements = std::max(1, pVariable->pType->Elements); - VBD( size <= elements, "Loading error: SRV array size mismatch." ); - - if (pVariable->pType->IsShaderResource()) - { - // this is just a straight texture assignment - pShaderResource = pVariable->Data.pShaderResource; - } - else - { - // This is a FX9/HLSL9-style texture load instruction that specifies only a sampler - VBD( pVariable->pType->IsSampler(), "Loading error: shader dependency is neither an SRV nor sampler."); - isFX9TextureLoad = true; - pSampler = pVariable->Data.pSampler; - // validate that all samplers actually used (i.e. based on size, not elements) in this variable have a valid TEXTURE assignment - for (size_t j = 0; j < size; ++ j) - { - if (nullptr == pSampler[j].BackingStore.pTexture) - { - // print spew appropriately for samplers vs sampler arrays - if (0 == pVariable->pType->Elements) - { - DPF(0, "%s: Sampler %s does not have a texture bound to it, even though the sampler is used in a DX9-style texture load instruction", g_szEffectLoadArea, pName); - } - else - { - DPF(0, "%s: Sampler %s[%u] does not have a texture bound to it, even though the sampler array is used in a DX9-style texture load instruction", g_szEffectLoadArea, pName, j); - } - - VH( E_FAIL ); - } - } - } - } - break; - - case D3D_SIT_UAV_RWTYPED: - case D3D_SIT_UAV_RWSTRUCTURED: - case D3D_SIT_UAV_RWBYTEADDRESS: - case D3D_SIT_UAV_APPEND_STRUCTURED: - case D3D_SIT_UAV_CONSUME_STRUCTURED: - case D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER: - eRange = ER_UnorderedAccessView; - - pVariable = m_pEffect->FindVariableByNameWithParsing(pName); - VBD( pVariable != nullptr, "Loading error: cannot find UAV variable." ); - VBD( size <= std::max(1, pVariable->pType->Elements), "Loading error: UAV array index out of range." ); - VBD( pVariable->pType->IsUnorderedAccessView(), "Loading error: UAV variable expected." ); - pUnorderedAccessView = pVariable->Data.pUnorderedAccessView; - break; - - case D3D_SIT_SAMPLER: - eRange = ER_Sampler; - - pVariable = m_pEffect->FindVariableByNameWithParsing(pName); - VBD( pVariable != nullptr, "Loading error: cannot find sampler variable." ); - VBD( size <= std::max(1, pVariable->pType->Elements), "Loading error: sampler array index out of range." ); - VBD( pVariable->pType->IsSampler(), "Loading error: sampler variable expected." ); - pSampler = pVariable->Data.pSampler; - break; - - default: - VHD( E_FAIL, "Internal loading error: unexpected shader dependency type." ); - }; - - // - // Here's where the "optimized" part comes in; whenever there's - // a resource dependency, see if it's located contiguous to - // an existing resource dependency and merge them together - // if possible - // - uint32_t rangeCount; - pvRange = &vRanges[eRange]; - rangeCount = pvRange->GetSize(); - - if ( rangeCount > 0 ) - { - // Can we continue an existing range? - pRange = &( (*pvRange)[rangeCount - 1] ); - - // Make sure that bind points are strictly increasing, - // otherwise this algorithm breaks and we'd get worse runtime performance - assert(pRange->last <= bindPoint); - - if ( pRange->last != bindPoint ) - { - if( eRange != ER_UnorderedAccessView ) - { - // No we can't. Begin a new range by setting rangeCount to 0 and triggering the next IF - rangeCount = 0; - } - else - { - // UAVs will always be located in one range, as they are more expensive to set - while(pRange->last < bindPoint) - { - VHD( pRange->vResources.Add(&g_NullUnorderedAccessView), "Internal loading error: cannot add UAV to range." ); - pRange->last++; - } - } - } - } - - if ( rangeCount == 0 ) - { - VN( pRange = pvRange->Add() ); - pRange->start = bindPoint; - } - - pRange->last = bindPoint + size; - - switch( ResourceDesc.Type ) - { - case D3D_SIT_CBUFFER: - VHD( pRange->vResources.Add(pCB), "Internal loading error: cannot add cbuffer to range." ); - break; - case D3D_SIT_TBUFFER: - VHD( pRange->vResources.Add(pShaderResource), "Internal loading error: cannot add tbuffer to range." ); - VHD( vTBuffers.Add( (SConstantBuffer*)pCB ), "Internal loading error: cannot add tbuffer to vector." ); - break; - case D3D_SIT_TEXTURE: - case D3D_SIT_STRUCTURED: - case D3D_SIT_BYTEADDRESS: - if (isFX9TextureLoad) - { - // grab all of the textures from each sampler - for (size_t j = 0; j < size; ++ j) - { - VHD( pRange->vResources.Add(pSampler[j].BackingStore.pTexture), "Internal loading error: cannot add SRV to range." ); - } - } - else - { - // add the whole array - for (size_t j = 0; j < size; ++ j) - { - VHD( pRange->vResources.Add(pShaderResource + j), "Internal loading error: cannot add SRV to range." ); - } - } - break; - case D3D_SIT_UAV_RWTYPED: - case D3D_SIT_UAV_RWSTRUCTURED: - case D3D_SIT_UAV_RWBYTEADDRESS: - case D3D_SIT_UAV_APPEND_STRUCTURED: - case D3D_SIT_UAV_CONSUME_STRUCTURED: - case D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER: - // add the whole array - for (size_t j = 0; j < size; ++ j) - { - VHD( pRange->vResources.Add(pUnorderedAccessView + j), "Internal loading error: cannot add UAV to range." ); - } - break; - case D3D_SIT_SAMPLER: - // add the whole array - for (size_t j = 0; j < size; ++ j) - { - VHD( pRange->vResources.Add(pSampler + j), "Internal loading error: cannot add sampler to range." ); - } - break; - default: - VHD( E_FAIL, "Internal loading error: unexpected shader dependency type." ); - } - } - - - ////////////////////////////////////////////////////////////////////////// - // Step 2: iterate through the interfaces and build - // an "optimized" list of all of the dependencies - - uint32_t NumInterfaces = pShaderBlock->pReflectionData->pReflection->GetNumInterfaceSlots(); - uint32_t CurInterfaceParameter = 0; - if( NumInterfaces > 0 ) - { - assert( ShaderDesc.ConstantBuffers > 0 ); - - for( uint32_t i=0; i < ShaderDesc.ConstantBuffers; i++ ) - { - ID3D11ShaderReflectionConstantBuffer* pCB = pShaderBlock->pReflectionData->pReflection->GetConstantBufferByIndex(i); - VN( pCB ); - D3D11_SHADER_BUFFER_DESC CBDesc; - VHD( pCB->GetDesc( &CBDesc ), "Internal loading error: cannot get CB desc." ); - if( CBDesc.Type != D3D11_CT_INTERFACE_POINTERS ) - { - continue; - } - - for( uint32_t iVar=0; iVar < CBDesc.Variables; iVar++ ) - { - ID3D11ShaderReflectionVariable* pInterfaceVar = pCB->GetVariableByIndex( iVar ); - VN( pInterfaceVar ); - D3D11_SHADER_VARIABLE_DESC InterfaceDesc; - VHD( pInterfaceVar->GetDesc(&InterfaceDesc), "Internal load error: cannot get IV desc."); - - LPCSTR pName; - uint32_t bindPoint, size; - SGlobalVariable *pVariable = nullptr; - SInterface *pInterface = nullptr; - uint32_t VariableElements; - - pName = InterfaceDesc.Name; - bindPoint = InterfaceDesc.StartOffset; - size = InterfaceDesc.Size; - - if( bindPoint == (uint32_t)-1 ) - { - continue; - } - - assert( InterfaceDesc.uFlags & D3D11_SVF_INTERFACE_POINTER ); - if( InterfaceDesc.uFlags & D3D11_SVF_INTERFACE_PARAMETER ) - { - // This interface pointer is a parameter to the shader - if( pShaderBlock->pReflectionData->InterfaceParameterCount == 0 ) - { - // There may be no interface parameters in this shader if it was compiled but had no interfaced bound to it. - // The shader cannot be set (correctly) in any pass. - continue; - } - else - { - VBD( CurInterfaceParameter < pShaderBlock->pReflectionData->InterfaceParameterCount, - "Internal loading error: interface count mismatch."); - SShaderBlock::SInterfaceParameter* pInterfaceInfo; - pInterfaceInfo = &pShaderBlock->pReflectionData->pInterfaceParameters[CurInterfaceParameter]; - ++CurInterfaceParameter; - SGlobalVariable *pParent = m_pEffect->FindVariableByName(pInterfaceInfo->pName); - VBD( pParent != nullptr, "Loading error: cannot find parent type." ); - if( pInterfaceInfo->Index == (uint32_t)-1 ) - { - pVariable = pParent; - VariableElements = pVariable->pType->Elements; - } - else - { - // We want a specific index of the variable (ex. "MyVar[2]") - VBD( size == 1, "Loading error: interface array type mismatch." ); - pVariable = (SGlobalVariable*)pParent->GetElement( pInterfaceInfo->Index ); - VBD( pVariable->IsValid(), "Loading error: interface array index out of range." ); - VariableElements = 0; - } - } - } - else - { - // This interface pointer is a global interface used in the shader - pVariable = m_pEffect->FindVariableByName(pName); - VBD( pVariable != nullptr, "Loading error: cannot find interface variable." ); - VariableElements = pVariable->pType->Elements; - } - VBD( size <= std::max(1, VariableElements), "Loading error: interface array size mismatch." ); - if( pVariable->pType->IsInterface() ) - { - pInterface = pVariable->Data.pInterface; - } - else if( pVariable->pType->IsClassInstance() ) - { - // For class instances, we create background interfaces which point to the class instance. This is done so - // the shader can always expect SInterface dependencies, rather than a mix of SInterfaces and class instances - VN( pInterface = PRIVATENEW SInterface[size] ); - if( VariableElements == 0 ) - { - assert( size == 1 ); - pInterface[0].pClassInstance = (SClassInstanceGlobalVariable*)pVariable; - m_BackgroundInterfaces.Add( &pInterface[0] ); - } - else - { - // Fill each element of the SInstance array individually - VBD( size == VariableElements, "Loading error: class instance array size mismatch." ); - for( uint32_t iElement=0; iElement < size; iElement++ ) - { - SGlobalVariable *pElement = (SGlobalVariable*)pVariable->GetElement( iElement ); - VBD( pElement->IsValid(), "Internal loading error: class instance array index out of range." ); - pInterface[iElement].pClassInstance = (SClassInstanceGlobalVariable*)pElement; - m_BackgroundInterfaces.Add( &pInterface[iElement] ); - } - } - } - else - { - VHD( E_FAIL, "Loading error: invalid interface initializer variable type."); - } - - // - // Here's where the "optimized" part comes in; whenever there's - // a resource dependency, see if it's located contiguous to - // an existing resource dependency and merge them together - // if possible - // - uint32_t rangeCount; - pvRange = &vRanges[ER_Interfaces]; - rangeCount = pvRange->GetSize(); - - VBD( rangeCount <= 1, "Internal loading error: invalid range count." ); - - if ( rangeCount == 0 ) - { - VN( pRange = pvRange->Add() ); - pRange->start = pRange->last = 0; - } - else - { - pRange = &( (*pvRange)[0] ); - } - - if( bindPoint < pRange->last ) - { - // add interfaces into the range that already exists - VBD( bindPoint + size < pRange->last, "Internal loading error: range overlap." ); - for( uint32_t j = 0; j < size; ++ j ) - { - pRange->vResources[j + bindPoint] = pInterface + j; - } - } - else - { - // add interfaces to the end of the range - - // add missing interface slots, if necessary - while(pRange->last < bindPoint) - { - VHD( pRange->vResources.Add(&g_NullInterface), "Internal loading error: cannot add nullptr interface to range." ); - pRange->last++; - } - - assert( bindPoint == pRange->last ); - for( size_t j=0; j < size; ++ j ) - { - VHD( pRange->vResources.Add(pInterface + j), "Internal loading error: cannot at interface to range." ); - } - pRange->last = bindPoint + size; - } - } - - // There is only one interface cbuffer - break; - } - } - - ////////////////////////////////////////////////////////////////////////// - // Step 3: allocate room in pShaderBlock for all of the dependency - // pointers and then hook them up - - pShaderBlock->SampDepCount = vRanges[ ER_Sampler ].GetSize(); - pShaderBlock->CBDepCount = vRanges[ ER_CBuffer ].GetSize(); - pShaderBlock->InterfaceDepCount = vRanges[ ER_Interfaces ].GetSize(); - pShaderBlock->ResourceDepCount = vRanges[ ER_Texture ].GetSize(); - pShaderBlock->UAVDepCount = vRanges[ ER_UnorderedAccessView ].GetSize(); - pShaderBlock->TBufferDepCount = vTBuffers.GetSize(); - - VN( pShaderBlock->pSampDeps = PRIVATENEW SShaderSamplerDependency[pShaderBlock->SampDepCount] ); - VN( pShaderBlock->pCBDeps = PRIVATENEW SShaderCBDependency[pShaderBlock->CBDepCount] ); - VN( pShaderBlock->pInterfaceDeps = PRIVATENEW SInterfaceDependency[pShaderBlock->InterfaceDepCount] ); - VN( pShaderBlock->pResourceDeps = PRIVATENEW SShaderResourceDependency[pShaderBlock->ResourceDepCount] ); - VN( pShaderBlock->pUAVDeps = PRIVATENEW SUnorderedAccessViewDependency[pShaderBlock->UAVDepCount] ); - VN( pShaderBlock->ppTbufDeps = PRIVATENEW SConstantBuffer*[pShaderBlock->TBufferDepCount] ); - - for (size_t i=0; iCBDepCount; ++i) - { - SShaderCBDependency *pDep = &pShaderBlock->pCBDeps[i]; - - pRange = &vRanges[ER_CBuffer][i]; - - pDep->StartIndex = pRange->start; - pDep->Count = pRange->last - pDep->StartIndex; - pDep->ppFXPointers = PRIVATENEW SConstantBuffer*[ pDep->Count ]; - pDep->ppD3DObjects = PRIVATENEW ID3D11Buffer*[ pDep->Count ]; - - assert(pDep->Count == pRange->vResources.GetSize()); - for (size_t j=0; jCount; ++j) - { - pDep->ppFXPointers[j] = (SConstantBuffer *)pRange->vResources[j]; - pDep->ppD3DObjects[j] = nullptr; - } - } - - for (size_t i=0; iSampDepCount; ++i) - { - SShaderSamplerDependency *pDep = &pShaderBlock->pSampDeps[i]; - - pRange = &vRanges[ER_Sampler][i]; - - pDep->StartIndex = pRange->start; - pDep->Count = pRange->last - pDep->StartIndex; - pDep->ppFXPointers = PRIVATENEW SSamplerBlock*[ pDep->Count ]; - pDep->ppD3DObjects = PRIVATENEW ID3D11SamplerState*[ pDep->Count ]; - - assert(pDep->Count == pRange->vResources.GetSize()); - for (size_t j=0; jCount; ++j) - { - pDep->ppFXPointers[j] = (SSamplerBlock *) pRange->vResources[j]; - pDep->ppD3DObjects[j] = nullptr; - } - } - - for (size_t i=0; iInterfaceDepCount; ++i) - { - SInterfaceDependency *pDep = &pShaderBlock->pInterfaceDeps[i]; - - pRange = &vRanges[ER_Interfaces][i]; - - pDep->StartIndex = pRange->start; - pDep->Count = pRange->last - pDep->StartIndex; - pDep->ppFXPointers = PRIVATENEW SInterface*[ pDep->Count ]; - pDep->ppD3DObjects = PRIVATENEW ID3D11ClassInstance*[ pDep->Count ]; - - assert(pDep->Count == pRange->vResources.GetSize()); - for (size_t j=0; jCount; ++j) - { - pDep->ppFXPointers[j] = (SInterface *) pRange->vResources[j]; - pDep->ppD3DObjects[j] = nullptr; - } - } - - for (size_t i=0; iResourceDepCount; ++i) - { - SShaderResourceDependency *pDep = &pShaderBlock->pResourceDeps[i]; - - pRange = &vRanges[ER_Texture][i]; - - pDep->StartIndex = pRange->start; - pDep->Count = pRange->last - pDep->StartIndex; - pDep->ppFXPointers = PRIVATENEW SShaderResource*[ pDep->Count ]; - pDep->ppD3DObjects = PRIVATENEW ID3D11ShaderResourceView*[ pDep->Count ]; - - assert(pDep->Count == pRange->vResources.GetSize()); - for (size_t j=0; jCount; ++j) - { - pDep->ppFXPointers[j] = (SShaderResource *) pRange->vResources[j]; - pDep->ppD3DObjects[j] = nullptr; - } - } - - for (size_t i=0; iUAVDepCount; ++i) - { - SUnorderedAccessViewDependency *pDep = &pShaderBlock->pUAVDeps[i]; - - pRange = &vRanges[ER_UnorderedAccessView][i]; - - pDep->StartIndex = pRange->start; - pDep->Count = pRange->last - pDep->StartIndex; - pDep->ppFXPointers = PRIVATENEW SUnorderedAccessView*[ pDep->Count ]; - pDep->ppD3DObjects = PRIVATENEW ID3D11UnorderedAccessView*[ pDep->Count ]; - - assert(pDep->Count == pRange->vResources.GetSize()); - for (size_t j=0; jCount; ++j) - { - pDep->ppFXPointers[j] = (SUnorderedAccessView *) pRange->vResources[j]; - pDep->ppD3DObjects[j] = nullptr; - } - } - - if (pShaderBlock->TBufferDepCount > 0) - { - memcpy(pShaderBlock->ppTbufDeps, &vTBuffers[0], pShaderBlock->TBufferDepCount * sizeof(SConstantBuffer*)); - } - -lExit: - return hr; -} - -// Create shader reflection interface and grab dependency info -HRESULT CEffectLoader::BuildShaderBlock(SShaderBlock *pShaderBlock) -{ - HRESULT hr = S_OK; - - // unused shader block? that's not right - VBD( pShaderBlock->pVT != nullptr, "Internal loading error: nullptr shader vtable." ); - - assert(pShaderBlock->pD3DObject == nullptr); - - if (nullptr == pShaderBlock->pReflectionData) - { - // File contains a shader variable without an assigned shader, or this is a null assignment. - // Usually, this is called by one of these guys: - // SetVertexShader( nullptr ); - // or - // vertexshader g_VS = nullptr; - return S_OK; - } - - // Initialize the reflection interface - VHD( D3DReflect( pShaderBlock->pReflectionData->pBytecode, pShaderBlock->pReflectionData->BytecodeLength, IID_ID3D11ShaderReflection, (void**)&pShaderBlock->pReflectionData->pReflection ), - "Internal loading error: cannot create shader reflection object." ); - - // Get dependencies - VH( GrabShaderData( pShaderBlock ) ); - - // Grab input signatures for VS - if( EOT_VertexShader == pShaderBlock->GetShaderType() ) - { - assert( pShaderBlock->pInputSignatureBlob == nullptr ); - VHD( D3DGetBlobPart( pShaderBlock->pReflectionData->pBytecode, pShaderBlock->pReflectionData->BytecodeLength, - D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, - &pShaderBlock->pInputSignatureBlob ), - "Internal loading error: cannot get input signature." ); - } - -lExit: - return hr; -} - -#undef PRIVATENEW - - -////////////////////////////////////////////////////////////////////////// -// Code to relocate data to private heaps (reflection & runtime effect) -// -// Important note about alignment: all reasonable chunks of data are -// machine word aligned (that is, any piece of data moved as a whole is -// aligned as a whole. This means that when computing m_ReflectionMemory -// or m_EffectMemory, each addition is aligned. This also means -// that, when later relocating that same memory, you must call MoveData -// or MoveString on the same chunks that were aligned. This is -// because: Align(a * b) != a * Align(b). -////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////// -// Reflection reallocation code -////////////////////////////////////////////////////////////////////////// - -HRESULT CEffectLoader::CalculateAnnotationSize(uint32_t cAnnotations, SAnnotation *pAnnotations) -{ - HRESULT hr = S_OK; - uint32_t i; - - m_ReflectionMemory += AlignToPowerOf2(cAnnotations * sizeof(SAnnotation), c_DataAlignment); - for (i=0; iBelongsInConstantBuffer()) - { - m_ReflectionMemory += AlignToPowerOf2(pAnnotations[i].pType->TotalSize, c_DataAlignment); - } - else - { - VBD( pAnnotations[i].pType->IsObjectType(EOT_String), "Invalid pEffectBuffer: invalid annotation type." ); - - uint32_t cElements = std::max(1, pAnnotations[i].pType->Elements); - - m_ReflectionMemory += AlignToPowerOf2(cElements * sizeof(SString), c_DataAlignment); - - } - } - -lExit: - return hr; -} - -HRESULT CEffectLoader::ReallocateAnnotationData(uint32_t cAnnotations, SAnnotation **ppAnnotations) -{ - HRESULT hr = S_OK; - uint32_t i; - SAnnotation *pAnnotations; - - VHD( m_pReflection->m_Heap.MoveData((void**) ppAnnotations, cAnnotations * sizeof(SAnnotation)), - "Internal loading error: cannot move annotation data." ); - pAnnotations = *ppAnnotations; - - for (i=0; ipEffect = m_pEffect; - - VHD( m_pReflection->m_Heap.MoveString(&pAn->pName), "Internal loading error: cannot move annotation name." ); - - // Reallocate type later - if (pAn->pType->BelongsInConstantBuffer()) - { - VHD( m_pReflection->m_Heap.MoveData( &pAn->Data.pGeneric, pAn->pType->TotalSize ), "Internal loading error: cannot move annotation data." ); - } - else if (pAnnotations[i].pType->IsObjectType(EOT_String)) - { - uint32_t cElements = std::max(1, pAn->pType->Elements); - - VHD( m_pReflection->m_Heap.MoveData((void**) &pAn->Data.pString, cElements * sizeof(SString)), "Internal loading error: cannot move annotation string." ); - for (size_t j = 0; j < cElements; ++ j) - { - VHD( m_pReflection->m_Heap.MoveString(&pAn->Data.pString[j].pString), "Internal loading error: cannot move annotation string element." ); - } - } - else - { - VHD( E_FAIL, "Invalid pEffectBuffer: invalid annotation type." ); - } - } - -lExit: - return hr; -} - -HRESULT CEffectLoader::InitializeReflectionDataAndMoveStrings( uint32_t KnownSize ) -{ - HRESULT hr = S_OK; - uint32_t cbStrings; - CEffectHeap *pHeap = &m_pReflection->m_Heap; - - // Get byte counts - cbStrings = m_pEffect->m_StringCount * sizeof( SString ); - - if( KnownSize ) - { - m_ReflectionMemory = KnownSize; - } - else - { - m_ReflectionMemory += AlignToPowerOf2(cbStrings, c_DataAlignment); - - for (size_t i=0; im_CBCount; i++) - { - VH( CalculateAnnotationSize(m_pEffect->m_pCBs[i].AnnotationCount, m_pEffect->m_pCBs[i].pAnnotations) ); - } - - for (size_t i=0; im_VariableCount; i++) - { - VH( CalculateAnnotationSize(m_pEffect->m_pVariables[i].AnnotationCount, m_pEffect->m_pVariables[i].pAnnotations) ); - } - - for (size_t i=0; im_GroupCount; i++) - { - VH( CalculateAnnotationSize(m_pEffect->m_pGroups[i].AnnotationCount, m_pEffect->m_pGroups[i].pAnnotations) ); - - for (size_t j=0; jm_pGroups[i].TechniqueCount; j++) - { - VH( CalculateAnnotationSize(m_pEffect->m_pGroups[i].pTechniques[j].AnnotationCount, m_pEffect->m_pGroups[i].pTechniques[j].pAnnotations) ); - - for (size_t k=0; km_pGroups[i].pTechniques[j].PassCount; k++) - { - VH( CalculateAnnotationSize(m_pEffect->m_pGroups[i].pTechniques[j].pPasses[k].AnnotationCount, m_pEffect->m_pGroups[i].pTechniques[j].pPasses[k].pAnnotations) ); - } - } - } - - // Calculate shader reflection data size - for (size_t i=0; im_ShaderBlockCount; i++) - { - if (nullptr != m_pEffect->m_pShaderBlocks[i].pReflectionData) - { - m_ReflectionMemory += AlignToPowerOf2(sizeof(SShaderBlock::SReflectionData), c_DataAlignment); - m_ReflectionMemory += AlignToPowerOf2(m_pEffect->m_pShaderBlocks[i].pReflectionData->BytecodeLength, c_DataAlignment); - // stream out decl is handled as a string, and thus its size is already factored because of GetStringAndAddToReflection - } - } - } - - VHD( pHeap->ReserveMemory(m_ReflectionMemory), "Internal loading error: failed to reserve reflection memory." ); - - // Strings are handled separately because we are moving them to reflection - m_pOldStrings = m_pEffect->m_pStrings; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pStrings, cbStrings), "Internal loading error: cannot move string data." ); - for(size_t i=0; im_StringCount; i++) - { - VHD( pHeap->MoveString( &m_pEffect->m_pStrings[i].pString), "Internal loading error: cannot move string pointer." ); - } - -lExit: - return hr; -} - -// Move all reflection data to private heap -HRESULT CEffectLoader::ReallocateReflectionData( bool Cloning ) -{ - HRESULT hr = S_OK; - CEffectHeap *pHeap = &m_pReflection->m_Heap; - - for(size_t i=0; im_CBCount; i++) - { - VHD( pHeap->MoveString( &m_pEffect->m_pCBs[i].pName ), "Internal loading error: cannot move CB name." ); - VH( ReallocateAnnotationData(m_pEffect->m_pCBs[i].AnnotationCount, &m_pEffect->m_pCBs[i].pAnnotations) ); - } - - for(size_t i=0; im_VariableCount; i++) - { - VHD( pHeap->MoveString( &m_pEffect->m_pVariables[i].pName ), "Internal loading error: cannot move variable name." ); - VHD( pHeap->MoveString( &m_pEffect->m_pVariables[i].pSemantic ), "Internal loading error: cannot move variable semantic." ); - VH( ReallocateAnnotationData(m_pEffect->m_pVariables[i].AnnotationCount, &m_pEffect->m_pVariables[i].pAnnotations) ); - } - - for(size_t i=0; im_GroupCount; i++) - { - VHD( pHeap->MoveString( &m_pEffect->m_pGroups[i].pName ), "Internal loading error: cannot move group name." ); - VH( ReallocateAnnotationData(m_pEffect->m_pGroups[i].AnnotationCount, &m_pEffect->m_pGroups[i].pAnnotations) ); - - for(size_t j=0; jm_pGroups[i].TechniqueCount; j++) - { - VHD( pHeap->MoveString( &m_pEffect->m_pGroups[i].pTechniques[j].pName ), "Internal loading error: cannot move technique name." ); - VH( ReallocateAnnotationData(m_pEffect->m_pGroups[i].pTechniques[j].AnnotationCount, &m_pEffect->m_pGroups[i].pTechniques[j].pAnnotations) ); - - for(size_t k=0; km_pGroups[i].pTechniques[j].PassCount; k++) - { - VHD( pHeap->MoveString( &m_pEffect->m_pGroups[i].pTechniques[j].pPasses[k].pName ), "Internal loading error: cannot move pass name." ); - VH( ReallocateAnnotationData(m_pEffect->m_pGroups[i].pTechniques[j].pPasses[k].AnnotationCount, &m_pEffect->m_pGroups[i].pTechniques[j].pPasses[k].pAnnotations) ); - } - } - } - - if( !Cloning ) - { - // When not cloning, every member in m_pMemberInterfaces is from a global variable, so we can take pName and pSemantic - // from the parent variable, which were updated above - for (size_t i = 0; i < m_pEffect->m_pMemberInterfaces.GetSize(); ++ i) - { - SMember* pMember = m_pEffect->m_pMemberInterfaces[i]; - SGlobalVariable* pTopLevelEntity = (SGlobalVariable*)pMember->pTopLevelEntity; - VH( FixupVariablePointer( &pTopLevelEntity ) ); - pMember->pName = pTopLevelEntity->pName; - pMember->pSemantic = pTopLevelEntity->pSemantic; - } - } - - // Move shader bytecode - for (size_t i=0; im_ShaderBlockCount; i++) - { - if (nullptr != m_pEffect->m_pShaderBlocks[i].pReflectionData) - { - VHD( pHeap->MoveData((void**)&m_pEffect->m_pShaderBlocks[i].pReflectionData, sizeof(SShaderBlock::SReflectionData)), - "Internal loading error: cannot move shader reflection block." ); - VHD( pHeap->MoveData((void**)&m_pEffect->m_pShaderBlocks[i].pReflectionData->pBytecode, m_pEffect->m_pShaderBlocks[i].pReflectionData->BytecodeLength), - "Internal loading error: cannot move shader bytecode."); - for( size_t iDecl=0; iDecl < D3D11_SO_STREAM_COUNT; ++iDecl ) - { - VHD( pHeap->MoveString(&m_pEffect->m_pShaderBlocks[i].pReflectionData->pStreamOutDecls[iDecl]), "Internal loading error: cannot move SO decl." ); - } - VH( pHeap->MoveInterfaceParameters(m_pEffect->m_pShaderBlocks[i].pReflectionData->InterfaceParameterCount, &m_pEffect->m_pShaderBlocks[i].pReflectionData->pInterfaceParameters ) ); - } - - } - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// Runtime effect reallocation code -////////////////////////////////////////////////////////////////////////// - -template HRESULT CEffectLoader::ReallocateBlockAssignments(T* &pBlocks, uint32_t cBlocks, T* pOldBlocks) -{ - HRESULT hr = S_OK; - CEffectHeap *pHeap = &m_pEffect->m_Heap; - - for(size_t i=0; iMoveData((void**) &pBlock->pAssignments, sizeof(SAssignment)*pBlock->AssignmentCount), "Internal loading error: cannot move assignment count." ); - - for (size_t j=0; jAssignmentCount; j++) - { - SAssignment *pAssignment = &pBlock->pAssignments[j]; - uint32_t cbDeps; - - // When cloning, convert pointers back into offsets - if( pOldBlocks ) - { - T *pOldBlock = &pOldBlocks[i]; - pAssignment->Destination.Offset = (uint32_t)( (UINT_PTR)pAssignment->Destination.pGeneric - (UINT_PTR)pOldBlock ) ; - } - - // Convert destination pointers from offset to real pointer - pAssignment->Destination.pGeneric = (uint8_t*) pBlock + pAssignment->Destination.Offset; - - // Make sure the data pointer points into the backing store - VBD( pAssignment->Destination.pGeneric >= &pBlock->BackingStore && - pAssignment->Destination.pGeneric < (uint8_t*) &pBlock->BackingStore + sizeof(pBlock->BackingStore), - "Internal loading error: assignment destination out of range." ); - - // Fixup dependencies - cbDeps = pAssignment->DependencyCount * sizeof(SAssignment::SDependency); - VHD( pHeap->MoveData((void**) &pAssignment->pDependencies, cbDeps), "Internal loading error: cannot move assignment dependencies." ); - - SGlobalVariable *pOldVariable = nullptr; - for(size_t iDep=0; iDepDependencyCount; iDep++) - { - SAssignment::SDependency *pDep = &pAssignment->pDependencies[iDep]; - // We ignore all but the last variable because below, we only use the last dependency - pOldVariable = pDep->pVariable; - VH( FixupVariablePointer(&pDep->pVariable) ); - } - - // Fixup source pointers - switch(pAssignment->LhsType) - { - case ELHS_VertexShaderBlock: - case ELHS_PixelShaderBlock: - case ELHS_GeometryShaderBlock: - case ELHS_HullShaderBlock: - case ELHS_DomainShaderBlock: - case ELHS_ComputeShaderBlock: - VH( FixupShaderPointer(&pAssignment->Source.pShader) ); - break; - - case ELHS_DepthStencilBlock: - VH( FixupDSPointer((SDepthStencilBlock**)&pAssignment->Source.pBlock) ); - break; - case ELHS_BlendBlock: - VH( FixupABPointer((SBlendBlock**) &pAssignment->Source.pBlock) ); - break; - case ELHS_RasterizerBlock: - VH( FixupRSPointer((SRasterizerBlock**) &pAssignment->Source.pBlock) ); - break; - - case ELHS_Texture: - VH( FixupShaderResourcePointer((SShaderResource**) &pAssignment->Source.pShaderResource) ); - break; - - default: - // Non-object assignment (must have at least one dependency or it would have been pruned by now) - assert( !pAssignment->IsObjectAssignment() && pAssignment->DependencyCount > 0 ); - - // Numeric variables must be relocated before this function is called - - switch (pAssignment->AssignmentType) - { - case ERAT_NumericVariable: - case ERAT_NumericVariableIndex: - // the variable or variable array is always the last dependency in the chain - SGlobalVariable *pVariable; - pVariable = pAssignment->pDependencies[pAssignment->DependencyCount - 1].pVariable; - assert( pVariable->pType->BelongsInConstantBuffer() && nullptr != pVariable->pCB ); - - // When cloning, convert pointers back into offsets - if( pOldBlocks ) - { - VBD( pOldVariable != nullptr, "Internal loading error: pOldVariable is nullptr." ); - pAssignment->Source.Offset = pAssignment->Source.pNumeric - pOldVariable->pCB->pBackingStore; - } - - // Convert from offset to pointer - pAssignment->Source.pNumeric = pVariable->pCB->pBackingStore + pAssignment->Source.Offset; - break; - - default: - // Shouldn't be able to get here - assert(0); - VHD( E_FAIL, "Loading error: invalid assignment type." ); - } - break; - - case ELHS_Invalid: - VHD( E_FAIL, "Loading error: invalid assignment type." ); - } - - assert(m_pEffect->m_LocalTimer > 0); - m_pEffect->EvaluateAssignment(pAssignment); - } - } - -lExit: - return hr; -} - -template uint32_t CEffectLoader::CalculateBlockAssignmentSize(T* &pBlocks, uint32_t cBlocks) -{ - uint32_t dwSize = 0; - - for(size_t i=0; iAssignmentCount * sizeof(SAssignment), c_DataAlignment); - - for (size_t j=0; jAssignmentCount; j++) - { - SAssignment *pAssignment = &pBlock->pAssignments[j]; - - dwSize += AlignToPowerOf2(pAssignment->DependencyCount * sizeof(SAssignment::SDependency), c_DataAlignment); - } - } - - return dwSize; -} - -HRESULT CEffectLoader::ReallocateShaderBlocks() -{ - HRESULT hr = S_OK; - CEffectHeap *pHeap = &m_pEffect->m_Heap; - const char* pError = "Internal loading error: cannot move shader data."; - - for (size_t i=0; im_ShaderBlockCount; i++) - { - SShaderBlock *pShader = &m_pEffect->m_pShaderBlocks[i]; - - // pShader->pReflection data and all of its members (bytecode, SO decl, etc.) are handled by ReallocateReflectionData() - VHD( pHeap->MoveData((void**) &pShader->pCBDeps, pShader->CBDepCount * sizeof(SShaderCBDependency)), pError ); - VHD( pHeap->MoveData((void**) &pShader->pSampDeps, pShader->SampDepCount * sizeof(SShaderSamplerDependency)), pError ); - VHD( pHeap->MoveData((void**) &pShader->pInterfaceDeps, pShader->InterfaceDepCount * sizeof(SInterfaceDependency)), pError ); - VHD( pHeap->MoveData((void**) &pShader->pResourceDeps, pShader->ResourceDepCount * sizeof(SShaderResourceDependency)), pError ); - VHD( pHeap->MoveData((void**) &pShader->pUAVDeps, pShader->UAVDepCount * sizeof(SUnorderedAccessViewDependency)), pError ); - VHD( pHeap->MoveData((void**) &pShader->ppTbufDeps, pShader->TBufferDepCount * sizeof(SConstantBuffer*)), pError ); - - for (size_t j=0; jCBDepCount; j++) - { - SShaderCBDependency *pCBDeps = &pShader->pCBDeps[j]; - VHD( pHeap->MoveData((void**) &pCBDeps->ppD3DObjects, pCBDeps->Count * sizeof(ID3D11Buffer*)), pError ); - VHD( pHeap->MoveData((void**) &pCBDeps->ppFXPointers, pCBDeps->Count * sizeof(SConstantBuffer*)), pError ); - - for (size_t k=0; kCount; k++) - { - VH( FixupCBPointer( &pCBDeps->ppFXPointers[k] ) ); - } - } - - for (size_t j=0; jSampDepCount; j++) - { - SShaderSamplerDependency *pSampDeps = &pShader->pSampDeps[j]; - VHD( pHeap->MoveData((void**) &pSampDeps->ppD3DObjects, pSampDeps->Count * sizeof(ID3D11SamplerState*)), pError ); - VHD( pHeap->MoveData((void**) &pSampDeps->ppFXPointers, pSampDeps->Count * sizeof(SSamplerBlock*)), pError ); - - for (size_t k=0; kCount; k++) - { - VH( FixupSamplerPointer(&pSampDeps->ppFXPointers[k]) ); - } - } - - for (size_t j=0; jInterfaceDepCount; j++) - { - SInterfaceDependency *pInterfaceDeps = &pShader->pInterfaceDeps[j]; - VHD( pHeap->MoveData((void**) &pInterfaceDeps->ppD3DObjects, pInterfaceDeps->Count * sizeof(ID3D11ClassInstance*)), pError ); - VHD( pHeap->MoveData((void**) &pInterfaceDeps->ppFXPointers, pInterfaceDeps->Count * sizeof(SInterface*)), pError ); - - for (size_t k=0; kCount; k++) - { - VH( FixupInterfacePointer(&pInterfaceDeps->ppFXPointers[k], true) ); - } - } - - for (size_t j=0; jResourceDepCount; j++) - { - SShaderResourceDependency *pResourceDeps = &pShader->pResourceDeps[j]; - VHD( pHeap->MoveData((void**) &pResourceDeps->ppD3DObjects, pResourceDeps->Count * sizeof(ID3D11ShaderResourceView*)), pError ); - VHD( pHeap->MoveData((void**) &pResourceDeps->ppFXPointers, pResourceDeps->Count * sizeof(SShaderResource*)), pError ); - - for (size_t k=0; kCount; k++) - { - VH( FixupShaderResourcePointer(&pResourceDeps->ppFXPointers[k]) ); - } - } - - for (size_t j=0; jUAVDepCount; j++) - { - SUnorderedAccessViewDependency *pUAVDeps = &pShader->pUAVDeps[j]; - VHD( pHeap->MoveData((void**) &pUAVDeps->ppD3DObjects, pUAVDeps->Count * sizeof(ID3D11UnorderedAccessView*)), pError ); - VHD( pHeap->MoveData((void**) &pUAVDeps->ppFXPointers, pUAVDeps->Count * sizeof(SUnorderedAccessView*)), pError ); - - for (size_t k=0; kCount; k++) - { - VH( FixupUnorderedAccessViewPointer(&pUAVDeps->ppFXPointers[k]) ); - } - } - - for (size_t j=0; jTBufferDepCount; j++) - { - VH( FixupCBPointer( &pShader->ppTbufDeps[j] ) ); - } - } - -lExit: - return hr; -} - - -uint32_t CEffectLoader::CalculateShaderBlockSize() -{ - uint32_t dwSize = 0; - - for (size_t i=0; im_ShaderBlockCount; i++) - { - SShaderBlock *pShader = &m_pEffect->m_pShaderBlocks[i]; - - dwSize += AlignToPowerOf2(pShader->CBDepCount * sizeof(SShaderCBDependency), c_DataAlignment); - dwSize += AlignToPowerOf2(pShader->SampDepCount * sizeof(SShaderSamplerDependency), c_DataAlignment); - dwSize += AlignToPowerOf2(pShader->InterfaceDepCount * sizeof(SInterfaceDependency), c_DataAlignment); - dwSize += AlignToPowerOf2(pShader->ResourceDepCount * sizeof(SShaderResourceDependency), c_DataAlignment); - dwSize += AlignToPowerOf2(pShader->UAVDepCount * sizeof(SUnorderedAccessViewDependency), c_DataAlignment); - dwSize += AlignToPowerOf2(pShader->TBufferDepCount * sizeof(SConstantBuffer*), c_DataAlignment); - - for (size_t j=0; jCBDepCount; j++) - { - SShaderCBDependency *pCBDeps = &pShader->pCBDeps[j]; - dwSize += AlignToPowerOf2(pCBDeps->Count * sizeof(ID3D11Buffer*), c_DataAlignment); - dwSize += AlignToPowerOf2(pCBDeps->Count * sizeof(SConstantBuffer*), c_DataAlignment); - } - - for (size_t j=0; jSampDepCount; j++) - { - SShaderSamplerDependency *pSampDeps = &pShader->pSampDeps[j]; - dwSize += AlignToPowerOf2(pSampDeps->Count * sizeof(ID3D11SamplerState*), c_DataAlignment); - dwSize += AlignToPowerOf2(pSampDeps->Count * sizeof(SSamplerBlock*), c_DataAlignment); - } - - for (size_t j=0; jInterfaceDepCount; j++) - { - SInterfaceDependency *pInterfaceDeps = &pShader->pInterfaceDeps[j]; - dwSize += AlignToPowerOf2(pInterfaceDeps->Count * sizeof(ID3D11ClassInstance*), c_DataAlignment); - dwSize += AlignToPowerOf2(pInterfaceDeps->Count * sizeof(SInterface*), c_DataAlignment); - } - - for (size_t j=0; jResourceDepCount; j++) - { - SShaderResourceDependency *pResourceDeps = &pShader->pResourceDeps[j]; - dwSize += AlignToPowerOf2(pResourceDeps->Count * sizeof(ID3D11ShaderResourceView*), c_DataAlignment); - dwSize += AlignToPowerOf2(pResourceDeps->Count * sizeof(SShaderResource*), c_DataAlignment); - } - - for (size_t j=0; jUAVDepCount; j++) - { - SUnorderedAccessViewDependency *pUAVDeps = &pShader->pUAVDeps[j]; - dwSize += AlignToPowerOf2(pUAVDeps->Count * sizeof(ID3D11UnorderedAccessView*), c_DataAlignment); - dwSize += AlignToPowerOf2(pUAVDeps->Count * sizeof(SUnorderedAccessView*), c_DataAlignment); - } - } - - return dwSize; -} - -// Move all (non-reflection) effect data to private heap -#pragma warning(push) -#pragma warning(disable: 4616 6239 ) -HRESULT CEffectLoader::ReallocateEffectData( bool Cloning ) -{ - HRESULT hr = S_OK; - CEffectHeap *pHeap = &m_pEffect->m_Heap; - uint32_t cbCBs = sizeof(SConstantBuffer) * m_pEffect->m_CBCount; - uint32_t cbVariables = sizeof(SGlobalVariable) * m_pEffect->m_VariableCount; - uint32_t cbGroups = sizeof(STechnique) * m_pEffect->m_GroupCount; - uint32_t cbShaders = sizeof(SShaderBlock) * m_pEffect->m_ShaderBlockCount; - uint32_t cbDS = sizeof(SDepthStencilBlock) * m_pEffect->m_DepthStencilBlockCount; - uint32_t cbAB = sizeof(SBlendBlock) * m_pEffect->m_BlendBlockCount; - uint32_t cbRS = sizeof(SRasterizerBlock) * m_pEffect->m_RasterizerBlockCount; - uint32_t cbSamplers = sizeof(SSamplerBlock) * m_pEffect->m_SamplerBlockCount; - uint32_t cbMemberDatas = sizeof(SMemberDataPointer) * m_pEffect->m_MemberDataCount; - uint32_t cbInterfaces = sizeof(SInterface) * m_pEffect->m_InterfaceCount; - uint32_t cbBackgroundInterfaces = sizeof(SInterface) * m_BackgroundInterfaces.GetSize(); - uint32_t cbShaderResources = sizeof(SShaderResource) * m_pEffect->m_ShaderResourceCount; - uint32_t cbUnorderedAccessViews = sizeof(SUnorderedAccessView) * m_pEffect->m_UnorderedAccessViewCount; - uint32_t cbRenderTargetViews = sizeof(SRenderTargetView) * m_pEffect->m_RenderTargetViewCount; - uint32_t cbDepthStencilViews = sizeof(SDepthStencilView) * m_pEffect->m_DepthStencilViewCount; - uint32_t cbAnonymousShaders = sizeof(SAnonymousShader) * m_pEffect->m_AnonymousShaderCount; - - // Calculate memory needed - m_EffectMemory += AlignToPowerOf2(cbCBs, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbVariables, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbGroups, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbShaders, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbMemberDatas, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbInterfaces + cbBackgroundInterfaces, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbShaderResources, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbUnorderedAccessViews, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbRenderTargetViews, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbDepthStencilViews, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbDS, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbAB, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbRS, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbSamplers, c_DataAlignment); - m_EffectMemory += AlignToPowerOf2(cbAnonymousShaders, c_DataAlignment); - - m_EffectMemory += CalculateShaderBlockSize(); - - for (size_t i=0; im_CBCount; i++) - { - SConstantBuffer *pCB = &m_pEffect->m_pCBs[i]; - - m_EffectMemory += AlignToPowerOf2(pCB->Size, c_DataAlignment); - } - - for (size_t i=0; im_GroupCount; i++) - { - SGroup *pGroup = &m_pEffect->m_pGroups[i]; - - m_EffectMemory += AlignToPowerOf2(pGroup->TechniqueCount * sizeof(STechnique), c_DataAlignment); - - for (size_t j=0; jTechniqueCount; j++) - { - STechnique *pTech = &pGroup->pTechniques[j]; - - m_EffectMemory += AlignToPowerOf2(pTech->PassCount * sizeof(SPassBlock), c_DataAlignment); - m_EffectMemory += CalculateBlockAssignmentSize(pTech->pPasses, pTech->PassCount); - } - }; - - m_EffectMemory += CalculateBlockAssignmentSize(m_pEffect->m_pBlendBlocks, m_pEffect->m_BlendBlockCount); - m_EffectMemory += CalculateBlockAssignmentSize(m_pEffect->m_pDepthStencilBlocks, m_pEffect->m_DepthStencilBlockCount); - m_EffectMemory += CalculateBlockAssignmentSize(m_pEffect->m_pRasterizerBlocks, m_pEffect->m_RasterizerBlockCount); - m_EffectMemory += CalculateBlockAssignmentSize(m_pEffect->m_pSamplerBlocks, m_pEffect->m_SamplerBlockCount); - - // Reserve memory - VHD( pHeap->ReserveMemory(m_EffectMemory), "Internal loading error: cannot reserve effect memory." ); - - // Move DataMemberPointer blocks - m_pOldMemberDataBlocks = m_pEffect->m_pMemberDataBlocks; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pMemberDataBlocks, cbMemberDatas), "Internal loading error: cannot move member data blocks." ); - - // Move CBs - m_pOldCBs = m_pEffect->m_pCBs; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pCBs, cbCBs), "Internal loading error: cannot move CB count." ); - for (size_t i=0; im_CBCount; i++) - { - SConstantBuffer *pCB = &m_pEffect->m_pCBs[i]; - - VHD( pHeap->MoveData((void**) &pCB->pBackingStore, pCB->Size), "Internal loading error: cannot move CB backing store." ); - - if( !Cloning ) - { - // When creating the effect, MemberDataOffsetPlus4 is used, not pMemberData - if( pCB->MemberDataOffsetPlus4 ) - { - pCB->pMemberData = (SMemberDataPointer*)( (uint8_t*)m_pEffect->m_pMemberDataBlocks + ( pCB->MemberDataOffsetPlus4 - 4 ) ); - } - } - else if (pCB->pMemberData) - { - // When cloning an effect, pMemberData points to valid data in the original effect - VH( FixupMemberDataPointer( &pCB->pMemberData ) ); - } - } - - // Move numeric variables; move all variable types - m_pOldVars = m_pEffect->m_pVariables; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pVariables, cbVariables), "Internal loading error: cannot move variable count." ); - for (size_t i=0; im_VariableCount; i++) - { - SGlobalVariable *pVar = &m_pEffect->m_pVariables[i]; - pVar->pEffect = m_pEffect; - - if( Cloning && pVar->pType->BelongsInConstantBuffer()) - { - // Convert pointer back to offset - // pVar->pCB refers to the old CB - pVar->Data.Offset = (UINT_PTR)pVar->Data.pGeneric - (UINT_PTR)pVar->pCB->pBackingStore; - } - - if (pVar->pCB) - { - VH( FixupCBPointer( &pVar->pCB ) ); - } - - if( !Cloning ) - { - // When creating the effect, MemberDataOffsetPlus4 is used, not pMemberData - if( pVar->MemberDataOffsetPlus4 ) - { - pVar->pMemberData = (SMemberDataPointer*)( (uint8_t*)m_pEffect->m_pMemberDataBlocks + ( pVar->MemberDataOffsetPlus4 - 4 ) ); - } - } - else if (pVar->pMemberData) - { - // When cloning an effect, pMemberData points to valid data in the original effect - VH( FixupMemberDataPointer( &pVar->pMemberData ) ); - } - - if (pVar->pType->BelongsInConstantBuffer()) - { - // Convert from offsets to pointers - pVar->Data.pGeneric = pVar->pCB->pBackingStore + pVar->Data.Offset; - } - } - - // Fixup each CB's array of child variable pointers - for (size_t i=0; im_CBCount; i++) - { - SConstantBuffer *pCB = &m_pEffect->m_pCBs[i]; - pCB->pEffect = m_pEffect; - - if (pCB->pVariables != nullptr) - { - VH( FixupVariablePointer(&pCB->pVariables) ); - } - } - - // Move shaders - m_pOldShaders = m_pEffect->m_pShaderBlocks; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pShaderBlocks, cbShaders), "Internal loading error: cannot move shader count." ); - - // Move interfaces, combining global interfaces and those that were created during shader initialization - m_pOldInterfaces = m_pEffect->m_pInterfaces; - m_OldInterfaceCount = m_pEffect->m_InterfaceCount; - VHD( pHeap->MoveEmptyDataBlock((void**) &m_pEffect->m_pInterfaces, cbInterfaces + cbBackgroundInterfaces), "Internal loading error: cannot move shader." ); - memcpy( m_pEffect->m_pInterfaces, m_pOldInterfaces, cbInterfaces ); - for( size_t i=0; i < m_BackgroundInterfaces.GetSize(); i++ ) - { - assert( m_BackgroundInterfaces[i] != nullptr ); - uint8_t* pDst = (uint8_t*)m_pEffect->m_pInterfaces + ( m_pEffect->m_InterfaceCount * sizeof(SInterface) ); - memcpy( pDst, m_BackgroundInterfaces[i], sizeof(SInterface) ); - m_pEffect->m_InterfaceCount++; - } - - m_pOldShaderResources = m_pEffect->m_pShaderResources; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pShaderResources, cbShaderResources), "Internal loading error: cannot move SRVs." ); - - m_pOldUnorderedAccessViews = m_pEffect->m_pUnorderedAccessViews; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pUnorderedAccessViews, cbUnorderedAccessViews), "Internal loading error: cannot move UAVS." ); - - m_pOldRenderTargetViews = m_pEffect->m_pRenderTargetViews; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pRenderTargetViews, cbRenderTargetViews), "Internal loading error: cannot move RTVs." ); - - m_pOldDepthStencilViews = m_pEffect->m_pDepthStencilViews; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pDepthStencilViews, cbDepthStencilViews), "Internal loading error: cannot move DSVs." ); - - m_pOldDS = m_pEffect->m_pDepthStencilBlocks; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pDepthStencilBlocks, cbDS), "Internal loading error: cannot move depth-stencil state blocks." ); - VH( ReallocateBlockAssignments(m_pEffect->m_pDepthStencilBlocks, m_pEffect->m_DepthStencilBlockCount, Cloning ? m_pOldDS : nullptr) ); - - m_pOldAB = m_pEffect->m_pBlendBlocks; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pBlendBlocks, cbAB), "Internal loading error: cannot move blend state blocks." ); - VH( ReallocateBlockAssignments(m_pEffect->m_pBlendBlocks, m_pEffect->m_BlendBlockCount, Cloning ? m_pOldAB : nullptr) ); - - m_pOldRS = m_pEffect->m_pRasterizerBlocks; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pRasterizerBlocks, cbRS), "Internal loading error: cannot move rasterizer state blocks." ); - VH( ReallocateBlockAssignments(m_pEffect->m_pRasterizerBlocks, m_pEffect->m_RasterizerBlockCount, Cloning ? m_pOldRS : nullptr) ); - - m_pOldSamplers = m_pEffect->m_pSamplerBlocks; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pSamplerBlocks, cbSamplers), "Internal loading error: cannot move samplers." ); - VH( ReallocateBlockAssignments(m_pEffect->m_pSamplerBlocks, m_pEffect->m_SamplerBlockCount, Cloning ? m_pOldSamplers : nullptr) ); - - // Fixup sampler backing stores - for (size_t i=0; im_SamplerBlockCount; ++i) - { - VH( FixupShaderResourcePointer(&m_pEffect->m_pSamplerBlocks[i].BackingStore.pTexture) ); - } - - // Fixup each interface's class instance variable pointer - for (size_t i=0; im_InterfaceCount; i++) - { - SInterface *pInterface = &m_pEffect->m_pInterfaces[i]; - - if (pInterface->pClassInstance != nullptr) - { - VH( FixupVariablePointer( (SGlobalVariable**)&pInterface->pClassInstance ) ); - } - } - - // Fixup pointers for non-numeric variables - for (size_t i=0; im_VariableCount; i++) - { - SGlobalVariable *pVar = &m_pEffect->m_pVariables[i]; - - if (pVar->pType->IsShader()) - { - VH( FixupShaderPointer(&pVar->Data.pShader) ); - } - else if (pVar->pType->IsShaderResource()) - { - VH( FixupShaderResourcePointer(&pVar->Data.pShaderResource) ); - } - else if (pVar->pType->IsUnorderedAccessView()) - { - VH( FixupUnorderedAccessViewPointer(&pVar->Data.pUnorderedAccessView) ); - } - else if (pVar->pType->IsInterface()) - { - VH( FixupInterfacePointer(&pVar->Data.pInterface, false) ); - } - else if (pVar->pType->IsObjectType(EOT_String)) - { - if( !m_pEffect->IsOptimized() ) - { - VH( FixupStringPointer(&pVar->Data.pString) ); - } - } - else if (pVar->pType->IsStateBlockObject()) - { - switch(pVar->pType->ObjectType) - { - case EOT_DepthStencil: - VH( FixupDSPointer((SDepthStencilBlock**) &pVar->Data.pBlock) ); - break; - case EOT_Blend: - VH( FixupABPointer((SBlendBlock**) &pVar->Data.pBlock) ); - break; - case EOT_Rasterizer: - VH( FixupRSPointer((SRasterizerBlock**) &pVar->Data.pBlock) ); - break; - case EOT_Sampler: - VB(pVar->pType->IsSampler()); - VH( FixupSamplerPointer((SSamplerBlock**) &pVar->Data.pBlock) ); - break; - default: - VH( E_FAIL ); - } - } - else if (pVar->pType->VarType == EVT_Struct || pVar->pType->VarType == EVT_Numeric) - { - if( pVar->pType->IsClassInstance() ) - { - // do nothing - } - else - { - // do nothing - } - } - else if (pVar->pType->IsRenderTargetView()) - { - VH( FixupRenderTargetViewPointer(&pVar->Data.pRenderTargetView) ); - } - else if (pVar->pType->IsDepthStencilView()) - { - VH( FixupDepthStencilViewPointer(&pVar->Data.pDepthStencilView) ); - } - else - { - VHD( E_FAIL, "Internal loading error: Invalid variable type." ); - } - } - - // Fixup created members - for (size_t i = 0; i < m_pEffect->m_pMemberInterfaces.GetSize(); ++ i) - { - SMember* pMember = m_pEffect->m_pMemberInterfaces[i]; - SGlobalVariable** ppTopLevelEntity = (SGlobalVariable**)&pMember->pTopLevelEntity; - VN( *ppTopLevelEntity ); - - // This might be set to false later, for supporting textures inside classes - const bool bGlobalMemberDataBlock = true; - - if( Cloning ) - { - if( pMember->pType->BelongsInConstantBuffer() ) - { - assert( pMember->Data.pGeneric == nullptr || (*ppTopLevelEntity)->pEffect->m_Heap.IsInHeap(pMember->Data.pGeneric) ); - pMember->Data.Offset = (uint32_t)( (uint8_t*)pMember->Data.pGeneric - (uint8_t*)(*ppTopLevelEntity)->pCB->pBackingStore ); - } - if( bGlobalMemberDataBlock && pMember->pMemberData ) - { - pMember->MemberDataOffsetPlus4 = (uint32_t)( (uint8_t*)pMember->pMemberData - (uint8_t*)(*ppTopLevelEntity)->pEffect->m_pMemberDataBlocks ) + 4; - } - } - - VH( FixupVariablePointer( ppTopLevelEntity ) ); - - if (pMember->pType->BelongsInConstantBuffer()) - { - // Convert from offsets to pointers - pMember->Data.pGeneric = (*ppTopLevelEntity)->pCB->pBackingStore + pMember->Data.Offset; - } - if( bGlobalMemberDataBlock && pMember->MemberDataOffsetPlus4 ) - { - pMember->pMemberData = (SMemberDataPointer*)( (uint8_t*)m_pEffect->m_pMemberDataBlocks + ( pMember->MemberDataOffsetPlus4 - 4 ) ); - } - } - - // Fixup shader data - VH( ReallocateShaderBlocks() ); - - // Move groups, techniques, and passes - m_pOldGroups = m_pEffect->m_pGroups; - VHD( pHeap->MoveData((void**) &m_pEffect->m_pGroups, cbGroups), "Internal loading error: cannot move groups." ); - for (size_t i=0; im_GroupCount; i++) - { - SGroup *pGroup = &m_pEffect->m_pGroups[i]; - uint32_t cbTechniques; - - cbTechniques = pGroup->TechniqueCount * sizeof(STechnique); - VHD( pHeap->MoveData((void**) &pGroup->pTechniques, cbTechniques), "Internal loading error: cannot move techniques." ); - - for (size_t j=0; jTechniqueCount; j++) - { - STechnique *pTech = &pGroup->pTechniques[j]; - uint32_t cbPass; - - cbPass = pTech->PassCount * sizeof(SPassBlock); - SPassBlock* pOldPasses = Cloning ? pTech->pPasses : nullptr; - VHD( pHeap->MoveData((void**) &pTech->pPasses, cbPass), "Internal loading error: cannot move passes." ); - - for (size_t iPass = 0; iPass < pTech->PassCount; ++ iPass) - { - pTech->pPasses[iPass].pEffect = m_pEffect; - - // Fixup backing store pointers in passes - VH( FixupABPointer((SBlendBlock**) &pTech->pPasses[iPass].BackingStore.pBlendBlock) ); - VH( FixupDSPointer((SDepthStencilBlock**) &pTech->pPasses[iPass].BackingStore.pDepthStencilBlock) ); - VH( FixupRSPointer((SRasterizerBlock**) &pTech->pPasses[iPass].BackingStore.pRasterizerBlock) ); - VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pVertexShaderBlock) ); - VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pPixelShaderBlock) ); - VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pGeometryShaderBlock) ); - VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pHullShaderBlock) ); - VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pDomainShaderBlock) ); - VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pComputeShaderBlock) ); - VH( FixupDepthStencilViewPointer( &pTech->pPasses[iPass].BackingStore.pDepthStencilView) ); - for (size_t iRT = 0; iRT < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; iRT++) - { - VH( FixupRenderTargetViewPointer( &pTech->pPasses[iPass].BackingStore.pRenderTargetViews[iRT] ) ); - } - } - - VH( ReallocateBlockAssignments( pTech->pPasses, pTech->PassCount, pOldPasses ) ); - } - } - VH( FixupGroupPointer( &m_pEffect->m_pNullGroup ) ); - - // Move anonymous shader variables - VHD( pHeap->MoveData((void **) &m_pEffect->m_pAnonymousShaders, cbAnonymousShaders), "Internal loading error: cannot move anonymous shaders." ); - for (size_t i=0; im_AnonymousShaderCount; ++i) - { - SAnonymousShader *pAnonymousShader = m_pEffect->m_pAnonymousShaders + i; - VH( FixupShaderPointer((SShaderBlock**) &pAnonymousShader->pShaderBlock) ); - } - - VBD( pHeap->GetSize() == m_EffectMemory, "Loading error: effect size mismatch." ); - -lExit: - return hr; -} -#pragma warning(pop) - -} diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectLoad.h kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectLoad.h --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectLoad.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectLoad.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,156 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: EffectLoad.h -// -// Direct3D 11 Effects header for the FX file loader -// A CEffectLoader is created at load time to facilitate loading -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma once - -namespace D3DX11Effects -{ - -// Ranges are used for dependency checking during load - -enum ERanges -{ - ER_CBuffer = 0, - ER_Texture, // Includes TBuffers - ER_Sampler, - ER_UnorderedAccessView, - ER_Interfaces, - ER_Count // This should be the size of the enum -}; - -struct SRange -{ - uint32_t start; - uint32_t last; - CEffectVector vResources; // should be (last - start) in length, resource type depends on the range type -}; - -// Used during load to validate assignments -D3D_SHADER_VARIABLE_TYPE GetSimpleParameterTypeFromObjectType(EObjectType ObjectType); - - -// A class to facilitate loading an Effect. This class is a friend of CEffect. -class CEffectLoader -{ - friend HRESULT CEffect::CloneEffect(_In_ uint32_t Flags, _Outptr_ ID3DX11Effect** ppClonedEffect ); - -protected: - // Load-time allocations that eventually get moved happen out of the TempHeap. This heap will grow as needed - CDataBlockStore m_BulkHeap; - - uint8_t *m_pData; - SBinaryHeader5 *m_pHeader; - DWORD m_Version; - - CEffect *m_pEffect; - CEffectReflection *m_pReflection; - - D3DX11Core::CMemoryStream m_msStructured; - D3DX11Core::CMemoryStream m_msUnstructured; - - // used to avoid repeated hash buffer allocations in LoadTypeAndAddToPool - CEffectVector m_HashBuffer; - - uint32_t m_dwBufferSize; // Size of data buffer in bytes - - // List of SInterface blocks created to back class instances bound to shaders - CEffectVector m_BackgroundInterfaces; - - // Pointers to pre-reallocation data - SGlobalVariable *m_pOldVars; - SShaderBlock *m_pOldShaders; - SDepthStencilBlock *m_pOldDS; - SBlendBlock *m_pOldAB; - SRasterizerBlock *m_pOldRS; - SConstantBuffer *m_pOldCBs; - SSamplerBlock *m_pOldSamplers; - uint32_t m_OldInterfaceCount; - SInterface *m_pOldInterfaces; - SShaderResource *m_pOldShaderResources; - SUnorderedAccessView *m_pOldUnorderedAccessViews; - SRenderTargetView *m_pOldRenderTargetViews; - SDepthStencilView *m_pOldDepthStencilViews; - SString *m_pOldStrings; - SMemberDataPointer *m_pOldMemberDataBlocks; - CEffectVectorOwner *m_pvOldMemberInterfaces; - SGroup *m_pOldGroups; - - uint32_t m_EffectMemory; // Effect private heap - uint32_t m_ReflectionMemory; // Reflection private heap - - // Loader helpers - HRESULT LoadCBs(); - HRESULT LoadNumericVariable(_In_ SConstantBuffer *pParentCB); - HRESULT LoadObjectVariables(); - HRESULT LoadInterfaceVariables(); - - HRESULT LoadTypeAndAddToPool(_Outptr_ SType **ppType, _In_ uint32_t dwOffset); - HRESULT LoadStringAndAddToPool(_Outptr_result_maybenull_z_ char **ppString, _In_ uint32_t dwOffset); - HRESULT LoadAssignments( _In_ uint32_t Assignments, _Out_writes_(Assignments) SAssignment **pAssignments, - _In_ uint8_t *pBackingStore, _Out_opt_ uint32_t *pRTVAssignments, _Out_opt_ uint32_t *pFinalAssignments ); - HRESULT LoadGroups(); - HRESULT LoadTechnique( STechnique* pTech ); - HRESULT LoadAnnotations(uint32_t *pcAnnotations, SAnnotation **ppAnnotations); - - HRESULT ExecuteConstantAssignment(_In_ const SBinaryConstant *pConstant, _Out_writes_bytes_(4) void *pLHS, _In_ D3D_SHADER_VARIABLE_TYPE lhsType); - uint32_t UnpackData(uint8_t *pDestData, uint8_t *pSrcData, uint32_t PackedDataSize, SType *pType, uint32_t *pBytesRead); - - // Build shader blocks - HRESULT ConvertRangesToBindings(SShaderBlock *pShaderBlock, CEffectVector *pvRanges ); - HRESULT GrabShaderData(SShaderBlock *pShaderBlock); - HRESULT BuildShaderBlock(SShaderBlock *pShaderBlock); - - // Memory compactors - HRESULT InitializeReflectionDataAndMoveStrings( uint32_t KnownSize = 0 ); - HRESULT ReallocateReflectionData( bool Cloning = false ); - HRESULT ReallocateEffectData( bool Cloning = false ); - HRESULT ReallocateShaderBlocks(); - template HRESULT ReallocateBlockAssignments(T* &pBlocks, uint32_t cBlocks, T* pOldBlocks = nullptr); - HRESULT ReallocateAnnotationData(uint32_t cAnnotations, SAnnotation **ppAnnotations); - - HRESULT CalculateAnnotationSize(uint32_t cAnnotations, SAnnotation *pAnnotations); - uint32_t CalculateShaderBlockSize(); - template uint32_t CalculateBlockAssignmentSize(T* &pBlocks, uint32_t cBlocks); - - HRESULT FixupCBPointer(_Inout_ SConstantBuffer **ppCB); - HRESULT FixupShaderPointer(_Inout_ SShaderBlock **ppShaderBlock); - HRESULT FixupDSPointer(_Inout_ SDepthStencilBlock **ppDSBlock); - HRESULT FixupABPointer(_Inout_ SBlendBlock **ppABBlock); - HRESULT FixupRSPointer(_Inout_ SRasterizerBlock **ppRSBlock); - HRESULT FixupInterfacePointer(_Inout_ SInterface **ppInterface, _In_ bool CheckBackgroundInterfaces); - HRESULT FixupShaderResourcePointer(_Inout_ SShaderResource **ppResource); - HRESULT FixupUnorderedAccessViewPointer(_Inout_ SUnorderedAccessView **ppResource); - HRESULT FixupRenderTargetViewPointer(_Inout_ SRenderTargetView **ppRenderTargetView); - HRESULT FixupDepthStencilViewPointer(_Inout_ SDepthStencilView **ppDepthStencilView); - HRESULT FixupSamplerPointer(_Inout_ SSamplerBlock **ppSampler); - HRESULT FixupVariablePointer(_Inout_ SGlobalVariable **ppVar); - HRESULT FixupStringPointer(_Inout_ SString **ppString); - HRESULT FixupMemberDataPointer(_Inout_ SMemberDataPointer **ppMemberData); - HRESULT FixupGroupPointer(_Inout_ SGroup **ppGroup); - - // Methods to retrieve data from the unstructured block - // (these do not make copies; they simply return pointers into the block) - HRESULT GetStringAndAddToReflection(_In_ uint32_t offset, _Outptr_result_maybenull_z_ char **ppPointer); // Returns a string from the file string block, updates m_EffectMemory - HRESULT GetUnstructuredDataBlock(_In_ uint32_t offset, _Out_ uint32_t *pdwSize, _Outptr_result_buffer_(*pdwSize) void **ppData); - // This function makes a copy of the array of SInterfaceParameters, but not a copy of the strings - HRESULT GetInterfaceParametersAndAddToReflection( _In_ uint32_t InterfaceCount, _In_ uint32_t offset, _Outptr_result_buffer_all_maybenull_(InterfaceCount) SShaderBlock::SInterfaceParameter **ppInterfaces ); -public: - - HRESULT LoadEffect(_In_ CEffect *pEffect, _In_reads_bytes_(cbEffectBuffer) const void *pEffectBuffer, _In_ uint32_t cbEffectBuffer); -}; - - -} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectNonRuntime.cpp kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectNonRuntime.cpp --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectNonRuntime.cpp 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectNonRuntime.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,3023 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: EffectNonRuntime.cpp -// -// D3DX11 Effect low-frequency utility functions -// These functions are not intended to be called regularly. They -// are typically called when creating, cloning, or optimizing an -// Effect, or reflecting a variable. -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#include "pchfx.h" -#include "SOParser.h" - -namespace D3DX11Effects -{ - -extern SUnorderedAccessView g_NullUnorderedAccessView; - -SBaseBlock::SBaseBlock() -: BlockType(EBT_Invalid) -, IsUserManaged(false) -, AssignmentCount(0) -, pAssignments(nullptr) -{ - -} - -SPassBlock::SPassBlock() -{ - pName = nullptr; - AnnotationCount = 0; - pAnnotations = nullptr; - InitiallyValid = true; - HasDependencies = false; - ZeroMemory(&BackingStore, sizeof(BackingStore)); -} - -STechnique::STechnique() -: pName(nullptr) -, PassCount(0) -, pPasses(nullptr) -, AnnotationCount(0) -, pAnnotations(nullptr) -, InitiallyValid( true ) -, HasDependencies( false ) -{ -} - -SGroup::SGroup() -: pName(nullptr) -, TechniqueCount(0) -, pTechniques(nullptr) -, AnnotationCount(0) -, pAnnotations(nullptr) -, InitiallyValid( true ) -, HasDependencies( false ) -{ -} - -SDepthStencilBlock::SDepthStencilBlock() -{ - pDSObject = nullptr; - ZeroMemory(&BackingStore, sizeof(BackingStore)); - IsValid = true; - - BackingStore.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - BackingStore.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - BackingStore.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - BackingStore.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - BackingStore.DepthEnable = true; - BackingStore.DepthFunc = D3D11_COMPARISON_LESS; - BackingStore.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - BackingStore.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - BackingStore.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - BackingStore.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - BackingStore.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - BackingStore.StencilEnable = false; - BackingStore.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; - BackingStore.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; -} - -SBlendBlock::SBlendBlock() -{ - pBlendObject = nullptr; - ZeroMemory(&BackingStore, sizeof(BackingStore)); - IsValid = true; - - BackingStore.AlphaToCoverageEnable = false; - BackingStore.IndependentBlendEnable = true; - for( size_t i=0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++ ) - { - BackingStore.RenderTarget[i].SrcBlend = D3D11_BLEND_ONE; - BackingStore.RenderTarget[i].DestBlend = D3D11_BLEND_ZERO; - BackingStore.RenderTarget[i].BlendOp = D3D11_BLEND_OP_ADD; - BackingStore.RenderTarget[i].SrcBlendAlpha = D3D11_BLEND_ONE; - BackingStore.RenderTarget[i].DestBlendAlpha = D3D11_BLEND_ZERO; - BackingStore.RenderTarget[i].BlendOpAlpha = D3D11_BLEND_OP_ADD; - memset(&BackingStore.RenderTarget[i].RenderTargetWriteMask, 0x0F, sizeof(BackingStore.RenderTarget[i].RenderTargetWriteMask)); - } -} - -SRasterizerBlock::SRasterizerBlock() -{ - pRasterizerObject = nullptr; - ZeroMemory(&BackingStore, sizeof(BackingStore)); - IsValid = true; - - BackingStore.AntialiasedLineEnable = false; - BackingStore.CullMode = D3D11_CULL_BACK; - BackingStore.DepthBias = D3D11_DEFAULT_DEPTH_BIAS; - BackingStore.DepthBiasClamp = D3D11_DEFAULT_DEPTH_BIAS_CLAMP; - BackingStore.FillMode = D3D11_FILL_SOLID; - BackingStore.FrontCounterClockwise = false; - BackingStore.MultisampleEnable = false; - BackingStore.ScissorEnable = false; - BackingStore.SlopeScaledDepthBias = D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS; - BackingStore.DepthClipEnable = true; -} - -SSamplerBlock::SSamplerBlock() -{ - pD3DObject = nullptr; - ZeroMemory(&BackingStore, sizeof(BackingStore)); - - BackingStore.SamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - BackingStore.SamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - BackingStore.SamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - BackingStore.SamplerDesc.BorderColor[3] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT; - BackingStore.SamplerDesc.BorderColor[2] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT; - BackingStore.SamplerDesc.BorderColor[1] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT; - BackingStore.SamplerDesc.BorderColor[0] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT; - BackingStore.SamplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; - BackingStore.SamplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - BackingStore.SamplerDesc.MaxAnisotropy = (UINT32) D3D11_DEFAULT_MAX_ANISOTROPY; - BackingStore.SamplerDesc.MipLODBias = D3D11_DEFAULT_MIP_LOD_BIAS; - BackingStore.SamplerDesc.MinLOD = -FLT_MAX; - BackingStore.SamplerDesc.MaxLOD = FLT_MAX; -} - -SShaderBlock::SShaderBlock(SD3DShaderVTable *pVirtualTable) -{ - IsValid = true; - - pVT = pVirtualTable; - - pReflectionData = nullptr; - - pD3DObject = nullptr; - - CBDepCount = 0; - pCBDeps = nullptr; - - SampDepCount = 0; - pSampDeps = nullptr; - - InterfaceDepCount = 0; - pInterfaceDeps = nullptr; - - ResourceDepCount = 0; - pResourceDeps = nullptr; - - UAVDepCount = 0; - pUAVDeps = nullptr; - - TBufferDepCount = 0; - ppTbufDeps = nullptr; - - pInputSignatureBlob = nullptr; -} - -HRESULT SShaderBlock::OnDeviceBind() -{ - HRESULT hr = S_OK; - uint32_t i, j; - - // Update all CB deps - for (i=0; ipD3DObject; - - if ( !pCBDeps[i].ppD3DObjects[j] ) - VH( E_FAIL ); - } - } - - // Update all sampler deps - for (i=0; ipD3DObject; - - if ( !pSampDeps[i].ppD3DObjects[j] ) - VH( E_FAIL ); - } - } - - // Texture deps will be set automatically on use since they are initially marked dirty. - -lExit: - return hr; -} - -extern SD3DShaderVTable g_vtVS; -extern SD3DShaderVTable g_vtGS; -extern SD3DShaderVTable g_vtPS; -extern SD3DShaderVTable g_vtHS; -extern SD3DShaderVTable g_vtDS; -extern SD3DShaderVTable g_vtCS; - -EObjectType SShaderBlock::GetShaderType() -{ - if (&g_vtVS == pVT) - return EOT_VertexShader; - else if (&g_vtGS == pVT) - return EOT_GeometryShader; - else if (&g_vtPS == pVT) - return EOT_PixelShader; - else if (&g_vtHS == pVT) - return EOT_HullShader5; - else if (&g_vtDS == pVT) - return EOT_DomainShader5; - else if (&g_vtCS == pVT) - return EOT_ComputeShader5; - - return EOT_Invalid; -} - -#define _SET_BIT(bytes, x) (bytes[x / 8] |= (1 << (x % 8))) - -HRESULT SShaderBlock::ComputeStateBlockMask(_Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) -{ - HRESULT hr = S_OK; - uint32_t i, j; - uint8_t *pSamplerMask = nullptr, *pShaderResourceMask = nullptr, *pConstantBufferMask = nullptr, *pUnorderedAccessViewMask = nullptr, *pInterfaceMask = nullptr; - - switch (GetShaderType()) - { - case EOT_VertexShader: - case EOT_VertexShader5: - pStateBlockMask->VS = 1; - pSamplerMask = pStateBlockMask->VSSamplers; - pShaderResourceMask = pStateBlockMask->VSShaderResources; - pConstantBufferMask = pStateBlockMask->VSConstantBuffers; - pInterfaceMask = pStateBlockMask->VSInterfaces; - pUnorderedAccessViewMask = nullptr; - break; - - case EOT_GeometryShader: - case EOT_GeometryShader5: - pStateBlockMask->GS = 1; - pSamplerMask = pStateBlockMask->GSSamplers; - pShaderResourceMask = pStateBlockMask->GSShaderResources; - pConstantBufferMask = pStateBlockMask->GSConstantBuffers; - pInterfaceMask = pStateBlockMask->GSInterfaces; - pUnorderedAccessViewMask = nullptr; - break; - - case EOT_PixelShader: - case EOT_PixelShader5: - pStateBlockMask->PS = 1; - pSamplerMask = pStateBlockMask->PSSamplers; - pShaderResourceMask = pStateBlockMask->PSShaderResources; - pConstantBufferMask = pStateBlockMask->PSConstantBuffers; - pInterfaceMask = pStateBlockMask->PSInterfaces; - pUnorderedAccessViewMask = &pStateBlockMask->PSUnorderedAccessViews; - break; - - case EOT_HullShader5: - pStateBlockMask->HS = 1; - pSamplerMask = pStateBlockMask->HSSamplers; - pShaderResourceMask = pStateBlockMask->HSShaderResources; - pConstantBufferMask = pStateBlockMask->HSConstantBuffers; - pInterfaceMask = pStateBlockMask->HSInterfaces; - pUnorderedAccessViewMask = nullptr; - break; - - case EOT_DomainShader5: - pStateBlockMask->DS = 1; - pSamplerMask = pStateBlockMask->DSSamplers; - pShaderResourceMask = pStateBlockMask->DSShaderResources; - pConstantBufferMask = pStateBlockMask->DSConstantBuffers; - pInterfaceMask = pStateBlockMask->DSInterfaces; - pUnorderedAccessViewMask = nullptr; - break; - - case EOT_ComputeShader5: - pStateBlockMask->CS = 1; - pSamplerMask = pStateBlockMask->CSSamplers; - pShaderResourceMask = pStateBlockMask->CSShaderResources; - pConstantBufferMask = pStateBlockMask->CSConstantBuffers; - pInterfaceMask = pStateBlockMask->CSInterfaces; - pUnorderedAccessViewMask = &pStateBlockMask->CSUnorderedAccessViews; - break; - - default: - assert(0); - VH(E_FAIL); - } - - for (i = 0; i < SampDepCount; ++ i) - { - for (j = 0; j < pSampDeps[i].Count; ++ j) - { - _SET_BIT(pSamplerMask, (pSampDeps[i].StartIndex + j)); - } - } - - for (i = 0; i < InterfaceDepCount; ++ i) - { - for (j = 0; j < pInterfaceDeps[i].Count; ++ j) - { - _SET_BIT(pInterfaceMask, (pInterfaceDeps[i].StartIndex + j)); - } - } - - for (i = 0; i < ResourceDepCount; ++ i) - { - for (j = 0; j < pResourceDeps[i].Count; ++ j) - { - _SET_BIT(pShaderResourceMask, (pResourceDeps[i].StartIndex + j)); - } - } - - for (i = 0; i < CBDepCount; ++ i) - { - for (j = 0; j < pCBDeps[i].Count; ++ j) - { - _SET_BIT(pConstantBufferMask, (pCBDeps[i].StartIndex + j)); - } - } - - for (i = 0; i < UAVDepCount; ++ i) - { - assert( pUnorderedAccessViewMask != 0 ); - _Analysis_assume_( pUnorderedAccessViewMask != 0 ); - for (j = 0; j < pUAVDeps[i].Count; ++ j) - { - if( pUAVDeps[i].ppFXPointers[j] != &g_NullUnorderedAccessView ) - _SET_BIT(pUnorderedAccessViewMask, (pUAVDeps[i].StartIndex + j)); - } - } - -lExit: - return hr; -} - -#undef _SET_BIT - -HRESULT SShaderBlock::GetShaderDesc(_Out_ D3DX11_EFFECT_SHADER_DESC *pDesc, _In_ bool IsInline) -{ - HRESULT hr = S_OK; - - ZeroMemory(pDesc, sizeof(*pDesc)); - - pDesc->pInputSignature = pInputSignatureBlob ? (const uint8_t*)pInputSignatureBlob->GetBufferPointer() : nullptr; - pDesc->IsInline = IsInline; - - if (nullptr != pReflectionData) - { - // initialize these only if present; otherwise leave them nullptr or 0 - pDesc->pBytecode = pReflectionData->pBytecode; - pDesc->BytecodeLength = pReflectionData->BytecodeLength; - for( size_t iDecl=0; iDecl < D3D11_SO_STREAM_COUNT; ++iDecl ) - { - pDesc->SODecls[iDecl] = pReflectionData->pStreamOutDecls[iDecl]; - } - pDesc->RasterizedStream = pReflectionData->RasterizedStream; - - // get # of input & output signature entries - assert( pReflectionData->pReflection != 0 ); - _Analysis_assume_( pReflectionData->pReflection != 0 ); - - D3D11_SHADER_DESC ShaderDesc; - hr = pReflectionData->pReflection->GetDesc( &ShaderDesc ); - if ( SUCCEEDED(hr) ) - { - pDesc->NumInputSignatureEntries = ShaderDesc.InputParameters; - pDesc->NumOutputSignatureEntries = ShaderDesc.OutputParameters; - pDesc->NumPatchConstantSignatureEntries = ShaderDesc.PatchConstantParameters; - } - } -lExit: - return hr; -} - -HRESULT SShaderBlock::GetVertexShader(_Outptr_ ID3D11VertexShader **ppVS) -{ - if (EOT_VertexShader == GetShaderType() || - EOT_VertexShader5 == GetShaderType()) - { - assert( pD3DObject != 0 ); - _Analysis_assume_( pD3DObject != 0 ); - *ppVS = static_cast( pD3DObject ); - SAFE_ADDREF(*ppVS); - return S_OK; - } - else - { - *ppVS = nullptr; - DPF(0, "ID3DX11EffectShaderVariable::GetVertexShader: This shader variable is not a vertex shader"); - return D3DERR_INVALIDCALL; - } -} - -HRESULT SShaderBlock::GetGeometryShader(_Outptr_ ID3D11GeometryShader **ppGS) -{ - if (EOT_GeometryShader == GetShaderType() || - EOT_GeometryShaderSO == GetShaderType() || - EOT_GeometryShader5 == GetShaderType()) - { - assert( pD3DObject != 0 ); - _Analysis_assume_( pD3DObject != 0 ); - *ppGS = static_cast( pD3DObject ); - SAFE_ADDREF(*ppGS); - return S_OK; - } - else - { - *ppGS = nullptr; - DPF(0, "ID3DX11EffectShaderVariable::GetGeometryShader: This shader variable is not a geometry shader"); - return D3DERR_INVALIDCALL; - } -} - -HRESULT SShaderBlock::GetPixelShader(_Outptr_ ID3D11PixelShader **ppPS) -{ - if (EOT_PixelShader == GetShaderType() || - EOT_PixelShader5 == GetShaderType()) - { - assert( pD3DObject != 0 ); - _Analysis_assume_( pD3DObject != 0 ); - *ppPS = static_cast( pD3DObject ); - SAFE_ADDREF(*ppPS); - return S_OK; - } - else - { - *ppPS = nullptr; - DPF(0, "ID3DX11EffectShaderVariable::GetPixelShader: This shader variable is not a pixel shader"); - return D3DERR_INVALIDCALL; - } -} - -HRESULT SShaderBlock::GetHullShader(_Outptr_ ID3D11HullShader **ppHS) -{ - if (EOT_HullShader5 == GetShaderType()) - { - assert( pD3DObject != 0 ); - _Analysis_assume_( pD3DObject != 0 ); - *ppHS = static_cast( pD3DObject ); - SAFE_ADDREF(*ppHS); - return S_OK; - } - else - { - *ppHS = nullptr; - DPF(0, "ID3DX11EffectShaderVariable::GetHullShader: This shader variable is not a hull shader"); - return D3DERR_INVALIDCALL; - } -} - -HRESULT SShaderBlock::GetDomainShader(_Outptr_ ID3D11DomainShader **ppDS) -{ - if (EOT_DomainShader5 == GetShaderType()) - { - assert( pD3DObject != 0 ); - _Analysis_assume_( pD3DObject != 0 ); - *ppDS = static_cast( pD3DObject ); - SAFE_ADDREF(*ppDS); - return S_OK; - } - else - { - *ppDS = nullptr; - DPF(0, "ID3DX11EffectShaderVariable::GetDomainShader: This shader variable is not a domain shader"); - return D3DERR_INVALIDCALL; - } -} - -HRESULT SShaderBlock::GetComputeShader(_Outptr_ ID3D11ComputeShader **ppCS) -{ - if (EOT_ComputeShader5 == GetShaderType()) - { - assert( pD3DObject != 0 ); - _Analysis_assume_( pD3DObject != 0 ); - *ppCS = static_cast( pD3DObject ); - SAFE_ADDREF(*ppCS); - return S_OK; - } - else - { - *ppCS = nullptr; - DPF(0, "ID3DX11EffectShaderVariable::GetComputeShader: This shader variable is not a compute shader"); - return D3DERR_INVALIDCALL; - } -} - -_Use_decl_annotations_ -HRESULT SShaderBlock::GetSignatureElementDesc(ESigType SigType, uint32_t Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) -{ - HRESULT hr = S_OK; - LPCSTR pFuncName = nullptr; - switch( SigType ) - { - case ST_Input: - pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc"; - break; - case ST_Output: - pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc"; - break; - case ST_PatchConstant: - pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc"; - break; - default: - assert( false ); - return E_FAIL; - }; - - if (nullptr != pReflectionData) - { - // get # of signature entries - assert( pReflectionData->pReflection != 0 ); - _Analysis_assume_( pReflectionData->pReflection != 0 ); - - D3D11_SHADER_DESC ShaderDesc; - VH( pReflectionData->pReflection->GetDesc( &ShaderDesc ) ); - - D3D11_SIGNATURE_PARAMETER_DESC ParamDesc ={0}; - if( pReflectionData->IsNullGS ) - { - switch( SigType ) - { - case ST_Input: - // The input signature for a null-GS is the output signature of the previous VS - SigType = ST_Output; - break; - case ST_PatchConstant: - // GeometryShaders cannot have patch constant signatures - return E_INVALIDARG; - }; - } - - switch( SigType ) - { - case ST_Input: - if( Element >= ShaderDesc.InputParameters ) - { - DPF( 0, "%s: Invalid Element index (%u) specified", pFuncName, Element ); - VH( E_INVALIDARG ); - } - VH( pReflectionData->pReflection->GetInputParameterDesc( Element, &ParamDesc ) ); - break; - case ST_Output: - if( Element >= ShaderDesc.OutputParameters ) - { - DPF( 0, "%s: Invalid Element index (%u) specified", pFuncName, Element ); - VH( E_INVALIDARG ); - } - VH( pReflectionData->pReflection->GetOutputParameterDesc( Element, &ParamDesc ) ); - break; - case ST_PatchConstant: - if( Element >= ShaderDesc.PatchConstantParameters ) - { - DPF( 0, "%s: Invalid Element index (%u) specified", pFuncName, Element ); - VH( E_INVALIDARG ); - } - VH( pReflectionData->pReflection->GetPatchConstantParameterDesc( Element, &ParamDesc ) ); - break; - }; - - pDesc->SemanticName = ParamDesc.SemanticName; - pDesc->SystemValueType = ParamDesc.SystemValueType; - - // Pixel shaders need to be special-cased as they don't technically output SVs - if( pDesc->SystemValueType == D3D_NAME_UNDEFINED && GetShaderType() == EOT_PixelShader && pDesc->SemanticName != 0 ) - { - if( _stricmp(pDesc->SemanticName, "SV_TARGET") == 0 ) - { - pDesc->SystemValueType = D3D_NAME_TARGET; - } - else if( _stricmp(pDesc->SemanticName, "SV_DEPTH") == 0 ) - { - pDesc->SystemValueType = D3D_NAME_DEPTH; - } - else if( _stricmp(pDesc->SemanticName, "SV_COVERAGE") == 0 ) - { - pDesc->SystemValueType = D3D_NAME_COVERAGE; - } - } - - pDesc->SemanticIndex = ParamDesc.SemanticIndex; - pDesc->Register = ParamDesc.Register; - pDesc->Mask = ParamDesc.Mask; - pDesc->ComponentType = ParamDesc.ComponentType; - pDesc->ReadWriteMask = ParamDesc.ReadWriteMask; - } - else - { - DPF(0, "%s: Cannot get signatures; shader bytecode is not present", pFuncName); - VH( D3DERR_INVALIDCALL ); - } - -lExit: - return hr; -} - -SString::SString() -{ - pString = nullptr; -} - -SRenderTargetView::SRenderTargetView() -{ - pRenderTargetView = nullptr; -} - -SDepthStencilView::SDepthStencilView() -{ - pDepthStencilView = nullptr; -} - -void * GetBlockByIndex(EVarType VarType, EObjectType ObjectType, void *pBaseBlock, uint32_t Index) -{ - switch( VarType ) - { - case EVT_Interface: - return (SInterface *)pBaseBlock + Index; - case EVT_Object: - switch (ObjectType) - { - case EOT_Blend: - return (SBlendBlock *)pBaseBlock + Index; - case EOT_DepthStencil: - return (SDepthStencilBlock *)pBaseBlock + Index; - case EOT_Rasterizer: - return (SRasterizerBlock *)pBaseBlock + Index; - case EOT_PixelShader: - case EOT_PixelShader5: - case EOT_GeometryShader: - case EOT_GeometryShaderSO: - case EOT_GeometryShader5: - case EOT_VertexShader: - case EOT_VertexShader5: - case EOT_HullShader5: - case EOT_DomainShader5: - case EOT_ComputeShader5: - return (SShaderBlock *)pBaseBlock + Index; - case EOT_String: - return (SString *)pBaseBlock + Index; - case EOT_Sampler: - return (SSamplerBlock *)pBaseBlock + Index; - case EOT_Buffer: - case EOT_Texture: - case EOT_Texture1D: - case EOT_Texture1DArray: - case EOT_Texture2D: - case EOT_Texture2DArray: - case EOT_Texture2DMS: - case EOT_Texture2DMSArray: - case EOT_Texture3D: - case EOT_TextureCube: - case EOT_TextureCubeArray: - case EOT_ByteAddressBuffer: - case EOT_StructuredBuffer: - return (SShaderResource *)pBaseBlock + Index; - case EOT_DepthStencilView: - return (SDepthStencilView *)pBaseBlock + Index; - case EOT_RenderTargetView: - return (SRenderTargetView *)pBaseBlock + Index; - case EOT_RWTexture1D: - case EOT_RWTexture1DArray: - case EOT_RWTexture2D: - case EOT_RWTexture2DArray: - case EOT_RWTexture3D: - case EOT_RWBuffer: - case EOT_RWByteAddressBuffer: - case EOT_RWStructuredBuffer: - case EOT_RWStructuredBufferAlloc: - case EOT_RWStructuredBufferConsume: - case EOT_AppendStructuredBuffer: - case EOT_ConsumeStructuredBuffer: - return (SUnorderedAccessView *)pBaseBlock + Index; - default: - assert(0); - return nullptr; - } - default: - assert(0); - return nullptr; - } -} - -//-------------------------------------------------------------------------------------- -// CEffect -//-------------------------------------------------------------------------------------- - -CEffect::CEffect( uint32_t Flags ) -{ - m_RefCount = 1; - - m_pVariables = nullptr; - m_pAnonymousShaders = nullptr; - m_pGroups = nullptr; - m_pNullGroup = nullptr; - m_pShaderBlocks = nullptr; - m_pDepthStencilBlocks = nullptr; - m_pBlendBlocks = nullptr; - m_pRasterizerBlocks = nullptr; - m_pSamplerBlocks = nullptr; - m_pCBs = nullptr; - m_pStrings = nullptr; - m_pMemberDataBlocks = nullptr; - m_pInterfaces = nullptr; - m_pShaderResources = nullptr; - m_pUnorderedAccessViews = nullptr; - m_pRenderTargetViews = nullptr; - m_pDepthStencilViews = nullptr; - m_pDevice = nullptr; - m_pClassLinkage = nullptr; - m_pContext = nullptr; - - m_VariableCount = 0; - m_AnonymousShaderCount = 0; - m_ShaderBlockCount = 0; - m_DepthStencilBlockCount = 0; - m_BlendBlockCount = 0; - m_RasterizerBlockCount = 0; - m_SamplerBlockCount = 0; - m_StringCount = 0; - m_MemberDataCount = 0; - m_InterfaceCount = 0; - m_ShaderResourceCount = 0; - m_UnorderedAccessViewCount = 0; - m_RenderTargetViewCount = 0; - m_DepthStencilViewCount = 0; - m_CBCount = 0; - m_TechniqueCount = 0; - m_GroupCount = 0; - - m_pReflection = nullptr; - m_LocalTimer = 1; - m_Flags = Flags; - m_FXLIndex = 0; - - m_pTypePool = nullptr; - m_pStringPool = nullptr; - m_pPooledHeap = nullptr; - m_pOptimizedTypeHeap = nullptr; -} - -void CEffect::ReleaseShaderRefection() -{ - for( size_t i = 0; i < m_ShaderBlockCount; ++ i ) - { - SAFE_RELEASE( m_pShaderBlocks[i].pInputSignatureBlob ); - if( m_pShaderBlocks[i].pReflectionData ) - { - SAFE_RELEASE( m_pShaderBlocks[i].pReflectionData->pReflection ); - } - } -} - -CEffect::~CEffect() -{ - ID3D11InfoQueue *pInfoQueue = nullptr; - - // Mute debug spew - if (m_pDevice) - { - HRESULT hr = m_pDevice->QueryInterface(__uuidof(ID3D11InfoQueue), (void**) &pInfoQueue); - if ( FAILED(hr) ) - pInfoQueue = nullptr; - } - - if (pInfoQueue) - { - D3D11_INFO_QUEUE_FILTER filter; - D3D11_MESSAGE_CATEGORY messageCategory = D3D11_MESSAGE_CATEGORY_STATE_SETTING; - ZeroMemory(&filter, sizeof(filter)); - - filter.DenyList.NumCategories = 1; - filter.DenyList.pCategoryList = &messageCategory; - pInfoQueue->PushStorageFilter(&filter); - } - - if( nullptr != m_pDevice ) - { - // if m_pDevice == nullptr, then we failed LoadEffect(), which means ReleaseShaderReflection was already called. - - // Release the shader reflection info, as it was not created on the private heap - // This must be called before we delete m_pReflection - ReleaseShaderRefection(); - } - - SAFE_DELETE( m_pReflection ); - SAFE_DELETE( m_pTypePool ); - SAFE_DELETE( m_pStringPool ); - SAFE_DELETE( m_pPooledHeap ); - SAFE_DELETE( m_pOptimizedTypeHeap ); - - // this code assumes the effect has been loaded & relocated, - // so check for that before freeing the resources - - if (nullptr != m_pDevice) - { - // Keep the following in line with AddRefAllForCloning - - assert(nullptr == m_pRasterizerBlocks || m_Heap.IsInHeap(m_pRasterizerBlocks)); - for (size_t i = 0; i < m_RasterizerBlockCount; ++ i) - { - SAFE_RELEASE(m_pRasterizerBlocks[i].pRasterizerObject); - } - - assert(nullptr == m_pBlendBlocks || m_Heap.IsInHeap(m_pBlendBlocks)); - for (size_t i = 0; i < m_BlendBlockCount; ++ i) - { - SAFE_RELEASE(m_pBlendBlocks[i].pBlendObject); - } - - assert(nullptr == m_pDepthStencilBlocks || m_Heap.IsInHeap(m_pDepthStencilBlocks)); - for (size_t i = 0; i < m_DepthStencilBlockCount; ++ i) - { - SAFE_RELEASE(m_pDepthStencilBlocks[i].pDSObject); - } - - assert(nullptr == m_pSamplerBlocks || m_Heap.IsInHeap(m_pSamplerBlocks)); - for (size_t i = 0; i < m_SamplerBlockCount; ++ i) - { - SAFE_RELEASE(m_pSamplerBlocks[i].pD3DObject); - } - - assert(nullptr == m_pShaderResources || m_Heap.IsInHeap(m_pShaderResources)); - for (size_t i = 0; i < m_ShaderResourceCount; ++ i) - { - SAFE_RELEASE(m_pShaderResources[i].pShaderResource); - } - - assert(nullptr == m_pUnorderedAccessViews || m_Heap.IsInHeap(m_pUnorderedAccessViews)); - for (size_t i = 0; i < m_UnorderedAccessViewCount; ++ i) - { - SAFE_RELEASE(m_pUnorderedAccessViews[i].pUnorderedAccessView); - } - - assert(nullptr == m_pRenderTargetViews || m_Heap.IsInHeap(m_pRenderTargetViews)); - for (size_t i = 0; i < m_RenderTargetViewCount; ++ i) - { - SAFE_RELEASE(m_pRenderTargetViews[i].pRenderTargetView); - } - - assert(nullptr == m_pDepthStencilViews || m_Heap.IsInHeap(m_pDepthStencilViews)); - for (size_t i = 0; i < m_DepthStencilViewCount; ++ i) - { - SAFE_RELEASE(m_pDepthStencilViews[i].pDepthStencilView); - } - - assert(nullptr == m_pMemberDataBlocks || m_Heap.IsInHeap(m_pMemberDataBlocks)); - for (size_t i = 0; i < m_MemberDataCount; ++ i) - { - switch( m_pMemberDataBlocks[i].Type ) - { - case MDT_ClassInstance: - SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DClassInstance); - break; - case MDT_BlendState: - SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedBlendState); - break; - case MDT_DepthStencilState: - SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedDepthStencilState); - break; - case MDT_RasterizerState: - SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedRasterizerState); - break; - case MDT_SamplerState: - SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedSamplerState); - break; - case MDT_Buffer: - SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedConstantBuffer); - break; - case MDT_ShaderResourceView: - SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedTextureBuffer); - break; - default: - assert( false ); - } - } - - assert(nullptr == m_pCBs || m_Heap.IsInHeap(m_pCBs)); - for (size_t i = 0; i < m_CBCount; ++ i) - { - SAFE_RELEASE(m_pCBs[i].TBuffer.pShaderResource); - SAFE_RELEASE(m_pCBs[i].pD3DObject); - } - - assert(nullptr == m_pShaderBlocks || m_Heap.IsInHeap(m_pShaderBlocks)); - _Analysis_assume_( m_ShaderBlockCount == 0 || m_pShaderBlocks != 0 ); - for (size_t i = 0; i < m_ShaderBlockCount; ++ i) - { - SAFE_RELEASE(m_pShaderBlocks[i].pD3DObject); - } - - SAFE_RELEASE( m_pDevice ); - } - SAFE_RELEASE( m_pClassLinkage ); - assert( m_pContext == nullptr ); - - // Restore debug spew - if (pInfoQueue) - { - pInfoQueue->PopStorageFilter(); - SAFE_RELEASE(pInfoQueue); - } -} - -// AddRef all D3D object when cloning -void CEffect::AddRefAllForCloning( _In_ CEffect* pEffectSource ) -{ -#ifdef NDEBUG - UNREFERENCED_PARAMETER(pEffectSource); -#endif - // Keep the following in line with ~CEffect - - assert( m_pDevice != nullptr ); - - for( size_t i = 0; i < m_ShaderBlockCount; ++ i ) - { - SAFE_ADDREF( m_pShaderBlocks[i].pInputSignatureBlob ); - if( m_pShaderBlocks[i].pReflectionData ) - { - SAFE_ADDREF( m_pShaderBlocks[i].pReflectionData->pReflection ); - } - } - - assert(nullptr == m_pRasterizerBlocks || pEffectSource->m_Heap.IsInHeap(m_pRasterizerBlocks)); - for ( size_t i = 0; i < m_RasterizerBlockCount; ++ i) - { - SAFE_ADDREF(m_pRasterizerBlocks[i].pRasterizerObject); - } - - assert(nullptr == m_pBlendBlocks || pEffectSource->m_Heap.IsInHeap(m_pBlendBlocks)); - for ( size_t i = 0; i < m_BlendBlockCount; ++ i) - { - SAFE_ADDREF(m_pBlendBlocks[i].pBlendObject); - } - - assert(nullptr == m_pDepthStencilBlocks || pEffectSource->m_Heap.IsInHeap(m_pDepthStencilBlocks)); - for ( size_t i = 0; i < m_DepthStencilBlockCount; ++ i) - { - SAFE_ADDREF(m_pDepthStencilBlocks[i].pDSObject); - } - - assert(nullptr == m_pSamplerBlocks || pEffectSource->m_Heap.IsInHeap(m_pSamplerBlocks)); - for ( size_t i = 0; i < m_SamplerBlockCount; ++ i) - { - SAFE_ADDREF(m_pSamplerBlocks[i].pD3DObject); - } - - assert(nullptr == m_pShaderResources || pEffectSource->m_Heap.IsInHeap(m_pShaderResources)); - for ( size_t i = 0; i < m_ShaderResourceCount; ++ i) - { - SAFE_ADDREF(m_pShaderResources[i].pShaderResource); - } - - assert(nullptr == m_pUnorderedAccessViews || pEffectSource->m_Heap.IsInHeap(m_pUnorderedAccessViews)); - for ( size_t i = 0; i < m_UnorderedAccessViewCount; ++ i) - { - SAFE_ADDREF(m_pUnorderedAccessViews[i].pUnorderedAccessView); - } - - assert(nullptr == m_pRenderTargetViews || pEffectSource->m_Heap.IsInHeap(m_pRenderTargetViews)); - for ( size_t i = 0; i < m_RenderTargetViewCount; ++ i) - { - SAFE_ADDREF(m_pRenderTargetViews[i].pRenderTargetView); - } - - assert(nullptr == m_pDepthStencilViews || pEffectSource->m_Heap.IsInHeap(m_pDepthStencilViews)); - for ( size_t i = 0; i < m_DepthStencilViewCount; ++ i) - { - SAFE_ADDREF(m_pDepthStencilViews[i].pDepthStencilView); - } - - assert(nullptr == m_pMemberDataBlocks || pEffectSource->m_Heap.IsInHeap(m_pMemberDataBlocks)); - for ( size_t i = 0; i < m_MemberDataCount; ++ i) - { - switch( m_pMemberDataBlocks[i].Type ) - { - case MDT_ClassInstance: - SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DClassInstance); - break; - case MDT_BlendState: - SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedBlendState); - break; - case MDT_DepthStencilState: - SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedDepthStencilState); - break; - case MDT_RasterizerState: - SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedRasterizerState); - break; - case MDT_SamplerState: - SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedSamplerState); - break; - case MDT_Buffer: - SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedConstantBuffer); - break; - case MDT_ShaderResourceView: - SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedTextureBuffer); - break; - default: - assert( false ); - } - } - - // There's no need to AddRef CBs, since they are recreated - assert(nullptr == m_pCBs || pEffectSource->m_Heap.IsInHeap(m_pCBs)); - for ( size_t i = 0; i < m_CBCount; ++ i) - { - SAFE_ADDREF(m_pCBs[i].TBuffer.pShaderResource); - SAFE_ADDREF(m_pCBs[i].pD3DObject); - } - - assert(nullptr == m_pShaderBlocks || pEffectSource->m_Heap.IsInHeap(m_pShaderBlocks)); - for ( size_t i = 0; i < m_ShaderBlockCount; ++ i) - { - SAFE_ADDREF(m_pShaderBlocks[i].pD3DObject); - } - - SAFE_ADDREF( m_pDevice ); - - SAFE_ADDREF( m_pClassLinkage ); - assert( m_pContext == nullptr ); -} - -_Use_decl_annotations_ -HRESULT CEffect::QueryInterface(REFIID iid, LPVOID *ppv) -{ - HRESULT hr = S_OK; - - if(nullptr == ppv) - { - DPF(0, "ID3DX11Effect::QueryInterface: nullptr parameter"); - hr = E_INVALIDARG; - goto EXIT; - } - - *ppv = nullptr; - if(IsEqualIID(iid, IID_IUnknown)) - { - *ppv = (IUnknown *) this; - } - else if(IsEqualIID(iid, IID_ID3DX11Effect)) - { - *ppv = (ID3DX11Effect *) this; - } - else - { - return E_NOINTERFACE; - } - - AddRef(); - -EXIT: - return hr; -} - -ULONG CEffect::AddRef() -{ - return ++ m_RefCount; -} - -ULONG CEffect::Release() -{ - if (-- m_RefCount > 0) - { - return m_RefCount; - } - else - { - delete this; - } - - return 0; -} - -// In all shaders, replace pOldBufferBlock with pNewBuffer, if pOldBufferBlock is a dependency -_Use_decl_annotations_ -void CEffect::ReplaceCBReference(SConstantBuffer *pOldBufferBlock, ID3D11Buffer *pNewBuffer) -{ - for (size_t iShaderBlock=0; iShaderBlockGetFeatureLevel() >= D3D_FEATURE_LEVEL_11_0 ); - - pDevice->AddRef(); - SAFE_RELEASE(m_pDevice); - m_pDevice = pDevice; - VH( m_pDevice->CreateClassLinkage( &m_pClassLinkage ) ); - SetDebugObjectName(m_pClassLinkage,srcName); - - // Create all constant buffers - SConstantBuffer *pCB = m_pCBs; - SConstantBuffer *pCBLast = m_pCBs + m_CBCount; - for(; pCB != pCBLast; pCB++) - { - SAFE_RELEASE(pCB->pD3DObject); - SAFE_RELEASE(pCB->TBuffer.pShaderResource); - - // This is a CBuffer - if (pCB->Size > 0) - { - if (pCB->IsTBuffer) - { - D3D11_BUFFER_DESC bufDesc; - // size is always register aligned - bufDesc.ByteWidth = pCB->Size; - bufDesc.Usage = D3D11_USAGE_DEFAULT; - bufDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - bufDesc.CPUAccessFlags = 0; - bufDesc.MiscFlags = 0; - - VH( pDevice->CreateBuffer( &bufDesc, nullptr, &pCB->pD3DObject) ); - SetDebugObjectName(pCB->pD3DObject, srcName ); - - D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc; - viewDesc.Format = DXGI_FORMAT_R32G32B32A32_UINT; - viewDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; - viewDesc.Buffer.ElementOffset = 0; - viewDesc.Buffer.ElementWidth = pCB->Size / SType::c_RegisterSize; - - VH( pDevice->CreateShaderResourceView( pCB->pD3DObject, &viewDesc, &pCB->TBuffer.pShaderResource) ); - SetDebugObjectName(pCB->TBuffer.pShaderResource, srcName ); - } - else - { - D3D11_BUFFER_DESC bufDesc; - // size is always register aligned - bufDesc.ByteWidth = pCB->Size; - bufDesc.Usage = D3D11_USAGE_DEFAULT; - bufDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - bufDesc.CPUAccessFlags = 0; - bufDesc.MiscFlags = 0; - - VH( pDevice->CreateBuffer( &bufDesc, nullptr, &pCB->pD3DObject) ); - SetDebugObjectName( pCB->pD3DObject, srcName ); - pCB->TBuffer.pShaderResource = nullptr; - } - - pCB->IsDirty = true; - } - else - { - pCB->IsDirty = false; - } - } - - // Create all RasterizerStates - SRasterizerBlock *pRB = m_pRasterizerBlocks; - SRasterizerBlock *pRBLast = m_pRasterizerBlocks + m_RasterizerBlockCount; - for(; pRB != pRBLast; pRB++) - { - SAFE_RELEASE(pRB->pRasterizerObject); - if( SUCCEEDED( m_pDevice->CreateRasterizerState( &pRB->BackingStore, &pRB->pRasterizerObject) ) ) - { - pRB->IsValid = true; - SetDebugObjectName( pRB->pRasterizerObject, srcName ); - } - else - pRB->IsValid = false; - } - - // Create all DepthStencils - SDepthStencilBlock *pDS = m_pDepthStencilBlocks; - SDepthStencilBlock *pDSLast = m_pDepthStencilBlocks + m_DepthStencilBlockCount; - for(; pDS != pDSLast; pDS++) - { - SAFE_RELEASE(pDS->pDSObject); - if( SUCCEEDED( m_pDevice->CreateDepthStencilState( &pDS->BackingStore, &pDS->pDSObject) ) ) - { - pDS->IsValid = true; - SetDebugObjectName( pDS->pDSObject, srcName ); - } - else - pDS->IsValid = false; - } - - // Create all BlendStates - SBlendBlock *pBlend = m_pBlendBlocks; - SBlendBlock *pBlendLast = m_pBlendBlocks + m_BlendBlockCount; - for(; pBlend != pBlendLast; pBlend++) - { - SAFE_RELEASE(pBlend->pBlendObject); - if( SUCCEEDED( m_pDevice->CreateBlendState( &pBlend->BackingStore, &pBlend->pBlendObject ) ) ) - { - pBlend->IsValid = true; - SetDebugObjectName( pBlend->pBlendObject, srcName ); - } - else - pBlend->IsValid = false; - } - - // Create all Samplers - SSamplerBlock *pSampler = m_pSamplerBlocks; - SSamplerBlock *pSamplerLast = m_pSamplerBlocks + m_SamplerBlockCount; - for(; pSampler != pSamplerLast; pSampler++) - { - SAFE_RELEASE(pSampler->pD3DObject); - - VH( m_pDevice->CreateSamplerState( &pSampler->BackingStore.SamplerDesc, &pSampler->pD3DObject) ); - SetDebugObjectName( pSampler->pD3DObject, srcName ); - } - - // Create all shaders - ID3D11ClassLinkage* neededClassLinkage = featureLevelGE11 ? m_pClassLinkage : nullptr; - SShaderBlock *pShader = m_pShaderBlocks; - SShaderBlock *pShaderLast = m_pShaderBlocks + m_ShaderBlockCount; - for(; pShader != pShaderLast; pShader++) - { - SAFE_RELEASE(pShader->pD3DObject); - - if (nullptr == pShader->pReflectionData) - { - // nullptr shader. It's one of these: - // PixelShader ps; - // or - // SetPixelShader( nullptr ); - continue; - } - - if (pShader->pReflectionData->pStreamOutDecls[0] || pShader->pReflectionData->pStreamOutDecls[1] || - pShader->pReflectionData->pStreamOutDecls[2] || pShader->pReflectionData->pStreamOutDecls[3] ) - { - // This is a geometry shader, process it's data - CSOParser soParser; - VH( soParser.Parse(pShader->pReflectionData->pStreamOutDecls) ); - uint32_t strides[4]; - soParser.GetStrides( strides ); - hr = m_pDevice->CreateGeometryShaderWithStreamOutput(pShader->pReflectionData->pBytecode, - pShader->pReflectionData->BytecodeLength, - soParser.GetDeclArray(), - soParser.GetDeclCount(), - strides, - featureLevelGE11 ? 4 : 1, - pShader->pReflectionData->RasterizedStream, - neededClassLinkage, - reinterpret_cast(&pShader->pD3DObject) ); - if (FAILED(hr)) - { - DPF(1, "ID3DX11Effect::Load - failed to create GeometryShader with StreamOutput decl: \"%s\"", soParser.GetErrorString() ); - pShader->IsValid = false; - hr = S_OK; - } - else - { - SetDebugObjectName( pShader->pD3DObject, srcName ); - } - } - else - { - // This is a regular shader - if( pShader->pReflectionData->RasterizedStream == D3D11_SO_NO_RASTERIZED_STREAM ) - pShader->IsValid = false; - else - { - if( FAILED( (m_pDevice->*(pShader->pVT->pCreateShader))( (uint32_t *) pShader->pReflectionData->pBytecode, pShader->pReflectionData->BytecodeLength, neededClassLinkage, &pShader->pD3DObject) ) ) - { - DPF(1, "ID3DX11Effect::Load - failed to create shader" ); - pShader->IsValid = false; - } - else - { - SetDebugObjectName( pShader->pD3DObject, srcName ); - } - } - } - - // Update all dependency pointers - VH( pShader->OnDeviceBind() ); - } - - // Initialize the member data pointers for all variables - uint32_t CurMemberData = 0; - for (uint32_t i = 0; i < m_VariableCount; ++ i) - { - if( m_pVariables[i].pMemberData ) - { - if( m_pVariables[i].pType->IsClassInstance() ) - { - for (uint32_t j = 0; j < std::max(m_pVariables[i].pType->Elements,1); ++j) - { - assert( CurMemberData < m_MemberDataCount ); - ID3D11ClassInstance** ppCI = &(m_pVariables[i].pMemberData + j)->Data.pD3DClassInstance; - (m_pVariables[i].pMemberData + j)->Type = MDT_ClassInstance; - (m_pVariables[i].pMemberData + j)->Data.pD3DClassInstance = nullptr; - if( m_pVariables[i].pType->TotalSize > 0 ) - { - // ignore failures in GetClassInstance; - m_pClassLinkage->GetClassInstance( m_pVariables[i].pName, j, ppCI ); - } - else - { - // The HLSL compiler optimizes out zero-sized classes, so we have to create class instances from scratch - if( FAILED( m_pClassLinkage->CreateClassInstance( m_pVariables[i].pType->pTypeName, 0, 0, 0, 0, ppCI ) ) ) - { - DPF(0, "ID3DX11Effect: Out of memory while trying to create new class instance interface"); - } - else - { - SetDebugObjectName( *ppCI, srcName ); - } - } - CurMemberData++; - } - } - else if( m_pVariables[i].pType->IsStateBlockObject() ) - { - for (size_t j = 0; j < std::max(m_pVariables[i].pType->Elements,1); ++j) - { - switch( m_pVariables[i].pType->ObjectType ) - { - case EOT_Blend: - (m_pVariables[i].pMemberData + j)->Type = MDT_BlendState; - (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedBlendState = nullptr; - break; - case EOT_Rasterizer: - (m_pVariables[i].pMemberData + j)->Type = MDT_RasterizerState; - (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedRasterizerState = nullptr; - break; - case EOT_DepthStencil: - (m_pVariables[i].pMemberData + j)->Type = MDT_DepthStencilState; - (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedDepthStencilState = nullptr; - break; - case EOT_Sampler: - (m_pVariables[i].pMemberData + j)->Type = MDT_SamplerState; - (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedSamplerState = nullptr; - break; - default: - VB( false ); - } - CurMemberData++; - } - } - else - { - VB( false ); - } - } - } - for(pCB = m_pCBs; pCB != pCBLast; pCB++) - { - (pCB->pMemberData + 0)->Type = MDT_Buffer; - (pCB->pMemberData + 0)->Data.pD3DEffectsManagedConstantBuffer = nullptr; - CurMemberData++; - (pCB->pMemberData + 1)->Type = MDT_ShaderResourceView; - (pCB->pMemberData + 1)->Data.pD3DEffectsManagedTextureBuffer = nullptr; - CurMemberData++; - } - - - // Determine which techniques and passes are known to be invalid - for( size_t iGroup=0; iGroup < m_GroupCount; iGroup++ ) - { - SGroup* pGroup = &m_pGroups[iGroup]; - pGroup->InitiallyValid = true; - - for( size_t iTech=0; iTech < pGroup->TechniqueCount; iTech++ ) - { - STechnique* pTechnique = &pGroup->pTechniques[iTech]; - pTechnique->InitiallyValid = true; - - for( size_t iPass = 0; iPass < pTechnique->PassCount; iPass++ ) - { - SPassBlock* pPass = &pTechnique->pPasses[iPass]; - pPass->InitiallyValid = true; - - if( pPass->BackingStore.pBlendBlock != nullptr && !pPass->BackingStore.pBlendBlock->IsValid ) - pPass->InitiallyValid = false; - if( pPass->BackingStore.pDepthStencilBlock != nullptr && !pPass->BackingStore.pDepthStencilBlock->IsValid ) - pPass->InitiallyValid = false; - if( pPass->BackingStore.pRasterizerBlock != nullptr && !pPass->BackingStore.pRasterizerBlock->IsValid ) - pPass->InitiallyValid = false; - if( pPass->BackingStore.pVertexShaderBlock != nullptr && !pPass->BackingStore.pVertexShaderBlock->IsValid ) - pPass->InitiallyValid = false; - if( pPass->BackingStore.pPixelShaderBlock != nullptr && !pPass->BackingStore.pPixelShaderBlock->IsValid ) - pPass->InitiallyValid = false; - if( pPass->BackingStore.pGeometryShaderBlock != nullptr && !pPass->BackingStore.pGeometryShaderBlock->IsValid ) - pPass->InitiallyValid = false; - if( pPass->BackingStore.pHullShaderBlock != nullptr && !pPass->BackingStore.pHullShaderBlock->IsValid ) - pPass->InitiallyValid = false; - if( pPass->BackingStore.pDomainShaderBlock != nullptr && !pPass->BackingStore.pDomainShaderBlock->IsValid ) - pPass->InitiallyValid = false; - if( pPass->BackingStore.pComputeShaderBlock != nullptr && !pPass->BackingStore.pComputeShaderBlock->IsValid ) - pPass->InitiallyValid = false; - - pTechnique->InitiallyValid &= pPass->InitiallyValid; - } - pGroup->InitiallyValid &= pTechnique->InitiallyValid; - } - } - -lExit: - return hr; -} - -// FindVariableByName, plus an understanding of literal indices -// This code handles A[i]. -// It does not handle anything else, like A.B, A[B[i]], A[B] -SVariable * CEffect::FindVariableByNameWithParsing(_In_z_ LPCSTR pName) -{ - SGlobalVariable *pVariable; - const uint32_t MAX_PARSABLE_NAME_LENGTH = 256; - char pScratchString[MAX_PARSABLE_NAME_LENGTH]; - - const char* pSource = pName; - char* pDest = pScratchString; - char* pEnd = pScratchString + MAX_PARSABLE_NAME_LENGTH; - - pVariable = nullptr; - - while( *pSource != 0 ) - { - if( pDest == pEnd ) - { - pVariable = FindLocalVariableByName(pName); - if( pVariable == nullptr ) - { - DPF( 0, "Name %s is too long to parse", pName ); - } - return pVariable; - } - - if( *pSource == '[' ) - { - // parse previous variable name - *pDest = 0; - assert( pVariable == nullptr ); - pVariable = FindLocalVariableByName(pScratchString); - if( pVariable == nullptr ) - { - return nullptr; - } - pDest = pScratchString; - } - else if( *pSource == ']' ) - { - // parse integer - *pDest = 0; - uint32_t index = atoi(pScratchString); - assert( pVariable != 0 ); - _Analysis_assume_( pVariable != 0 ); - pVariable = (SGlobalVariable*)pVariable->GetElement(index); - if( pVariable && !pVariable->IsValid() ) - { - pVariable = nullptr; - } - return pVariable; - } - else - { - // add character - *pDest = *pSource; - pDest++; - } - pSource++; - } - - if( pDest != pScratchString ) - { - // parse the variable name (there was no [i]) - *pDest = 0; - assert( pVariable == nullptr ); - pVariable = FindLocalVariableByName(pScratchString); - } - - return pVariable; -} - -SGlobalVariable * CEffect::FindVariableByName(_In_z_ LPCSTR pName) -{ - SGlobalVariable *pVariable; - - pVariable = FindLocalVariableByName(pName); - - return pVariable; -} - -SGlobalVariable * CEffect::FindLocalVariableByName(_In_z_ LPCSTR pName) -{ - SGlobalVariable *pVariable, *pVariableEnd; - - pVariableEnd = m_pVariables + m_VariableCount; - for (pVariable = m_pVariables; pVariable != pVariableEnd; pVariable++) - { - if (strcmp( pVariable->pName, pName) == 0) - { - return pVariable; - } - } - - return nullptr; -} - - -// -// Checks to see if two types are equivalent (either at runtime -// or during the type-pooling load process) -// -// Major assumption: if both types are structures, then their -// member types & names should already have been added to the pool, -// in which case their member type & name pointers should be equal. -// -// This is true because complex data types (structures) have all -// sub-types translated before the containing type is translated, -// which means that simple sub-types (numeric types) have already -// been pooled. -// -bool SType::IsEqual(SType *pOtherType) const -{ - if (VarType != pOtherType->VarType || Elements != pOtherType->Elements - || strcmp(pTypeName, pOtherType->pTypeName) != 0) - { - return false; - } - - switch (VarType) - { - case EVT_Struct: - { - if (StructType.Members != pOtherType->StructType.Members) - { - return false; - } - assert(StructType.pMembers != nullptr && pOtherType->StructType.pMembers != nullptr); - - uint32_t i; - for (i = 0; i < StructType.Members; ++ i) - { - // names for types must exist (not true for semantics) - assert(StructType.pMembers[i].pName != nullptr && pOtherType->StructType.pMembers[i].pName != nullptr); - - if (StructType.pMembers[i].pType != pOtherType->StructType.pMembers[i].pType || - StructType.pMembers[i].Data.Offset != pOtherType->StructType.pMembers[i].Data.Offset || - StructType.pMembers[i].pName != pOtherType->StructType.pMembers[i].pName || - StructType.pMembers[i].pSemantic != pOtherType->StructType.pMembers[i].pSemantic) - { - return false; - } - } - } - break; - - case EVT_Object: - { - if (ObjectType != pOtherType->ObjectType) - { - return false; - } - } - break; - - case EVT_Numeric: - { - if (NumericType.Rows != pOtherType->NumericType.Rows || - NumericType.Columns != pOtherType->NumericType.Columns || - NumericType.ScalarType != pOtherType->NumericType.ScalarType || - NumericType.NumericLayout != pOtherType->NumericType.NumericLayout || - NumericType.IsColumnMajor != pOtherType->NumericType.IsColumnMajor || - NumericType.IsPackedArray != pOtherType->NumericType.IsPackedArray) - { - return false; - } - } - break; - - case EVT_Interface: - { - // VarType and pTypeName handled above - } - break; - - default: - { - assert(0); - return false; - } - break; - } - - assert(TotalSize == pOtherType->TotalSize && Stride == pOtherType->Stride && PackedSize == pOtherType->PackedSize); - - return true; -} - -uint32_t SType::GetTotalUnpackedSize(_In_ bool IsSingleElement) const -{ - if (VarType == EVT_Object) - { - return 0; - } - else if (VarType == EVT_Interface) - { - return 0; - } - else if (Elements > 0 && IsSingleElement) - { - assert( ( TotalSize == 0 && Stride == 0 ) || - ( (TotalSize > (Stride * (Elements - 1))) && (TotalSize <= (Stride * Elements)) ) ); - return TotalSize - Stride * (Elements - 1); - } - else - { - return TotalSize; - } -} - -uint32_t SType::GetTotalPackedSize(_In_ bool IsSingleElement) const -{ - if (Elements > 0 && IsSingleElement) - { - assert(PackedSize % Elements == 0); - return PackedSize / Elements; - } - else - { - return PackedSize; - } -} - -SConstantBuffer *CEffect::FindCB(_In_z_ LPCSTR pName) -{ - uint32_t i; - - for (i=0; iFindValueWithHash(ptrMapping, ptrMapping.Hash(), &iter) ); - *ppType = (SType *) iter.GetData().pNew; - -lExit: - return hr; -} - -// Replace *ppString with the corresponding value in pMappingTable -// pMappingTable table describes how to map old string pointers to new string pointers -static HRESULT RemapString(_In_ char **ppString, _Inout_ CPointerMappingTable *pMappingTable) -{ - HRESULT hr = S_OK; - - SPointerMapping ptrMapping; - CPointerMappingTable::CIterator iter; - ptrMapping.pOld = *ppString; - VH( pMappingTable->FindValueWithHash(ptrMapping, ptrMapping.Hash(), &iter) ); - *ppString = (char *) iter.GetData().pNew; - -lExit: - return hr; -} - -// Used in cloning, copy m_pMemberInterfaces from pEffectSource to this -HRESULT CEffect::CopyMemberInterfaces( _In_ CEffect* pEffectSource ) -{ - HRESULT hr = S_OK; - - uint32_t Members = pEffectSource->m_pMemberInterfaces.GetSize(); - m_pMemberInterfaces.AddRange(Members); - uint32_t i=0; // after a failure, this holds the failing index - for(; i < Members; i++ ) - { - SMember* pOldMember = pEffectSource->m_pMemberInterfaces[i]; - if( pOldMember == nullptr ) - { - // During Optimization, m_pMemberInterfaces[i] was set to nullptr because it was an annotation - m_pMemberInterfaces[i] = nullptr; - continue; - } - - SMember *pNewMember; - assert( pOldMember->pTopLevelEntity != nullptr ); - - if (nullptr == (pNewMember = CreateNewMember((SType*)pOldMember->pType, false))) - { - DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface"); - VN( pNewMember ); - } - - pNewMember->pType = pOldMember->pType; - pNewMember->pName = pOldMember->pName; - pNewMember->pSemantic = pOldMember->pSemantic; - pNewMember->Data.pGeneric = pOldMember->Data.pGeneric; - pNewMember->IsSingleElement = pOldMember->IsSingleElement; - pNewMember->pTopLevelEntity = pOldMember->pTopLevelEntity; - pNewMember->pMemberData = pOldMember->pMemberData; - - m_pMemberInterfaces[i] = pNewMember; - } - -lExit: - if( FAILED(hr) ) - { - assert( i < Members ); - ZeroMemory( &m_pMemberInterfaces[i], sizeof(SMember) * ( Members - i ) ); - } - return hr; -} - -// Used in cloning, copy the string pool from pEffectSource to this and build mappingTable -// for use in RemapString -_Use_decl_annotations_ -HRESULT CEffect::CopyStringPool( CEffect* pEffectSource, CPointerMappingTable& mappingTable ) -{ - HRESULT hr = S_OK; - assert( m_pPooledHeap != 0 ); - _Analysis_assume_( m_pPooledHeap != 0 ); - VN( m_pStringPool = new CEffect::CStringHashTable ); - m_pStringPool->SetPrivateHeap(m_pPooledHeap); - VH( m_pStringPool->AutoGrow() ); - - CStringHashTable::CIterator stringIter; - - // move strings over, build mapping table - for (pEffectSource->m_pStringPool->GetFirstEntry(&stringIter); !pEffectSource->m_pStringPool->PastEnd(&stringIter); pEffectSource->m_pStringPool->GetNextEntry(&stringIter)) - { - SPointerMapping ptrMapping; - char *pString; - - const char* pOldString = stringIter.GetData(); - ptrMapping.pOld = (void*)pOldString; - uint32_t len = (uint32_t)strlen(pOldString); - uint32_t hash = ptrMapping.Hash(); - VN( pString = new(*m_pPooledHeap) char[len + 1] ); - ptrMapping.pNew = (void*)pString; - memcpy(ptrMapping.pNew, ptrMapping.pOld, len + 1); - VH( m_pStringPool->AddValueWithHash(pString, hash) ); - - VH( mappingTable.AddValueWithHash(ptrMapping, hash) ); - } - - // Uncomment to print string mapping - /* - CPointerMappingTable::CIterator mapIter; - for (mappingTable.GetFirstEntry(&mapIter); !mappingTable.PastEnd(&mapIter); mappingTable.GetNextEntry(&mapIter)) - { - SPointerMapping ptrMapping = mapIter.GetData(); - DPF(0, "string: 0x%x : 0x%x %s", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew, (char*)ptrMapping.pNew ); - }*/ - -lExit: - return hr; -} - -// Used in cloning, copy the unoptimized type pool from pEffectSource to this and build mappingTableTypes -// for use in RemapType. mappingTableStrings is the mapping table previously filled when copying strings. -_Use_decl_annotations_ -HRESULT CEffect::CopyTypePool( CEffect* pEffectSource, CPointerMappingTable& mappingTableTypes, CPointerMappingTable& mappingTableStrings ) -{ - HRESULT hr = S_OK; - assert( m_pPooledHeap != 0 ); - _Analysis_assume_( m_pPooledHeap != 0 ); - VN( m_pTypePool = new CEffect::CTypeHashTable ); - m_pTypePool->SetPrivateHeap(m_pPooledHeap); - VH( m_pTypePool->AutoGrow() ); - - CTypeHashTable::CIterator typeIter; - CPointerMappingTable::CIterator mapIter; - - // first pass: move types over, build mapping table - for (pEffectSource->m_pTypePool->GetFirstEntry(&typeIter); !pEffectSource->m_pTypePool->PastEnd(&typeIter); pEffectSource->m_pTypePool->GetNextEntry(&typeIter)) - { - SPointerMapping ptrMapping; - SType *pType; - - ptrMapping.pOld = typeIter.GetData(); - uint32_t hash = ptrMapping.Hash(); - VN( (ptrMapping.pNew) = new(*m_pPooledHeap) SType ); - memcpy(ptrMapping.pNew, ptrMapping.pOld, sizeof(SType)); - - pType = (SType *) ptrMapping.pNew; - - // if this is a struct, move its members to the newly allocated space - if (EVT_Struct == pType->VarType) - { - SVariable* pOldMembers = pType->StructType.pMembers; - VN( pType->StructType.pMembers = new(*m_pPooledHeap) SVariable[pType->StructType.Members] ); - memcpy(pType->StructType.pMembers, pOldMembers, pType->StructType.Members * sizeof(SVariable)); - } - - VH( m_pTypePool->AddValueWithHash(pType, hash) ); - VH( mappingTableTypes.AddValueWithHash(ptrMapping, hash) ); - } - - // second pass: fixup structure member & name pointers - for (mappingTableTypes.GetFirstEntry(&mapIter); !mappingTableTypes.PastEnd(&mapIter); mappingTableTypes.GetNextEntry(&mapIter)) - { - SPointerMapping ptrMapping = mapIter.GetData(); - - // Uncomment to print type mapping - //DPF(0, "type: 0x%x : 0x%x", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew ); - - SType *pType = (SType *) ptrMapping.pNew; - - if( pType->pTypeName ) - { - VH( RemapString(&pType->pTypeName, &mappingTableStrings) ); - } - - // if this is a struct, fix up its members' pointers - if (EVT_Struct == pType->VarType) - { - for (uint32_t i = 0; i < pType->StructType.Members; ++ i) - { - VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTableTypes) ); - if( pType->StructType.pMembers[i].pName ) - { - VH( RemapString(&pType->StructType.pMembers[i].pName, &mappingTableStrings) ); - } - if( pType->StructType.pMembers[i].pSemantic ) - { - VH( RemapString(&pType->StructType.pMembers[i].pSemantic, &mappingTableStrings) ); - } - } - } - } - -lExit: - return hr; -} - -// Used in cloning, copy the unoptimized type pool from pEffectSource to this and build mappingTableTypes -// for use in RemapType. mappingTableStrings is the mapping table previously filled when copying strings. -_Use_decl_annotations_ -HRESULT CEffect::CopyOptimizedTypePool( CEffect* pEffectSource, CPointerMappingTable& mappingTableTypes ) -{ - HRESULT hr = S_OK; - CEffectHeap* pOptimizedTypeHeap = nullptr; - - assert( pEffectSource->m_pOptimizedTypeHeap != 0 ); - _Analysis_assume_( pEffectSource->m_pOptimizedTypeHeap != 0 ); - assert( m_pTypePool == 0 ); - assert( m_pStringPool == 0 ); - assert( m_pPooledHeap == 0 ); - - VN( pOptimizedTypeHeap = new CEffectHeap ); - VH( pOptimizedTypeHeap->ReserveMemory( pEffectSource->m_pOptimizedTypeHeap->GetSize() ) ); - CPointerMappingTable::CIterator mapIter; - - // first pass: move types over, build mapping table - uint8_t* pReadTypes = pEffectSource->m_pOptimizedTypeHeap->GetDataStart(); - while( pEffectSource->m_pOptimizedTypeHeap->IsInHeap( pReadTypes ) ) - { - SPointerMapping ptrMapping; - SType *pType; - uint32_t moveSize; - - ptrMapping.pOld = ptrMapping.pNew = pReadTypes; - moveSize = sizeof(SType); - VH( pOptimizedTypeHeap->MoveData(&ptrMapping.pNew, moveSize) ); - pReadTypes += moveSize; - - pType = (SType *) ptrMapping.pNew; - - // if this is a struct, move its members to the newly allocated space - if (EVT_Struct == pType->VarType) - { - moveSize = pType->StructType.Members * sizeof(SVariable); - VH( pOptimizedTypeHeap->MoveData((void **)&pType->StructType.pMembers, moveSize) ); - pReadTypes += moveSize; - } - - VH( mappingTableTypes.AddValueWithHash(ptrMapping, ptrMapping.Hash()) ); - } - - // second pass: fixup structure member & name pointers - for (mappingTableTypes.GetFirstEntry(&mapIter); !mappingTableTypes.PastEnd(&mapIter); mappingTableTypes.GetNextEntry(&mapIter)) - { - SPointerMapping ptrMapping = mapIter.GetData(); - - // Uncomment to print type mapping - //DPF(0, "type: 0x%x : 0x%x", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew ); - - SType *pType = (SType *) ptrMapping.pNew; - - // if this is a struct, fix up its members' pointers - if (EVT_Struct == pType->VarType) - { - for (uint32_t i = 0; i < pType->StructType.Members; ++ i) - { - VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTableTypes) ); - } - } - } - -lExit: - return hr; -} - -// Used in cloning, create new ID3D11ConstantBuffers for each non-single CB -HRESULT CEffect::RecreateCBs() -{ - HRESULT hr = S_OK; - uint32_t i; // after a failure, this holds the failing index - - for (i = 0; i < m_CBCount; ++ i) - { - SConstantBuffer* pCB = &m_pCBs[i]; - - pCB->IsNonUpdatable = pCB->IsUserManaged || pCB->ClonedSingle(); - - if( pCB->Size > 0 && !pCB->ClonedSingle() ) - { - ID3D11Buffer** ppOriginalBuffer; - ID3D11ShaderResourceView** ppOriginalTBufferView; - - if( pCB->IsUserManaged ) - { - ppOriginalBuffer = &pCB->pMemberData[0].Data.pD3DEffectsManagedConstantBuffer; - ppOriginalTBufferView = &pCB->pMemberData[1].Data.pD3DEffectsManagedTextureBuffer; - } - else - { - ppOriginalBuffer = &pCB->pD3DObject; - ppOriginalTBufferView = &pCB->TBuffer.pShaderResource; - } - - VN( *ppOriginalBuffer ); - D3D11_BUFFER_DESC bufDesc; - (*ppOriginalBuffer)->GetDesc( &bufDesc ); - ID3D11Buffer* pNewBuffer = nullptr; - VH( m_pDevice->CreateBuffer( &bufDesc, nullptr, &pNewBuffer ) ); - SetDebugObjectName( pNewBuffer, "D3DX11Effect" ); - (*ppOriginalBuffer)->Release(); - (*ppOriginalBuffer) = pNewBuffer; - pNewBuffer = nullptr; - - if( pCB->IsTBuffer ) - { - VN( *ppOriginalTBufferView ); - D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc; - (*ppOriginalTBufferView)->GetDesc( &viewDesc ); - ID3D11ShaderResourceView* pNewView = nullptr; - VH( m_pDevice->CreateShaderResourceView( (*ppOriginalBuffer), &viewDesc, &pNewView) ); - SetDebugObjectName( pNewView, "D3DX11Effect" ); - (*ppOriginalTBufferView)->Release(); - (*ppOriginalTBufferView) = pNewView; - pNewView = nullptr; - } - else - { - assert( *ppOriginalTBufferView == nullptr ); - ReplaceCBReference( pCB, (*ppOriginalBuffer) ); - } - - pCB->IsDirty = true; - } - } - -lExit: - return hr; -} - -// Move Name and Semantic strings using mappingTableStrings -_Use_decl_annotations_ -HRESULT CEffect::FixupMemberInterface( SMember* pMember, CEffect* pEffectSource, CPointerMappingTable& mappingTableStrings ) -{ - HRESULT hr = S_OK; - - if( pMember->pName ) - { - if( pEffectSource->m_pReflection && pEffectSource->m_pReflection->m_Heap.IsInHeap(pMember->pName) ) - { - pMember->pName = (char*)((UINT_PTR)pMember->pName - (UINT_PTR)pEffectSource->m_pReflection->m_Heap.GetDataStart() + (UINT_PTR)m_pReflection->m_Heap.GetDataStart()); - } - else - { - VH( RemapString(&pMember->pName, &mappingTableStrings) ); - } - } - if( pMember->pSemantic ) - { - if( pEffectSource->m_pReflection && pEffectSource->m_pReflection->m_Heap.IsInHeap(pMember->pSemantic) ) - { - pMember->pSemantic = (char*)((UINT_PTR)pMember->pSemantic - (UINT_PTR)pEffectSource->m_pReflection->m_Heap.GetDataStart() + (UINT_PTR)m_pReflection->m_Heap.GetDataStart()); - } - else - { - VH( RemapString(&pMember->pSemantic, &mappingTableStrings) ); - } - } - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// Public API to create a copy of this effect -HRESULT CEffect::CloneEffect(_In_ uint32_t Flags, _Outptr_ ID3DX11Effect** ppClonedEffect ) -{ - HRESULT hr = S_OK; - CPointerMappingTable mappingTableTypes; - CPointerMappingTable mappingTableStrings; - - CEffectLoader loader; - CEffect* pNewEffect = nullptr; - CDataBlockStore* pTempHeap = nullptr; - - - VN( pNewEffect = new CEffect( m_Flags ) ); - if( Flags & D3DX11_EFFECT_CLONE_FORCE_NONSINGLE ) - { - // The effect is cloned as if there was no original, so don't mark it as cloned - pNewEffect->m_Flags &= ~(uint32_t)D3DX11_EFFECT_CLONE; - } - else - { - pNewEffect->m_Flags |= D3DX11_EFFECT_CLONE; - } - - pNewEffect->m_VariableCount = m_VariableCount; - pNewEffect->m_pVariables = m_pVariables; - pNewEffect->m_AnonymousShaderCount = m_AnonymousShaderCount; - pNewEffect->m_pAnonymousShaders = m_pAnonymousShaders; - pNewEffect->m_TechniqueCount = m_TechniqueCount; - pNewEffect->m_GroupCount = m_GroupCount; - pNewEffect->m_pGroups = m_pGroups; - pNewEffect->m_pNullGroup = m_pNullGroup; - pNewEffect->m_ShaderBlockCount = m_ShaderBlockCount; - pNewEffect->m_pShaderBlocks = m_pShaderBlocks; - pNewEffect->m_DepthStencilBlockCount = m_DepthStencilBlockCount; - pNewEffect->m_pDepthStencilBlocks = m_pDepthStencilBlocks; - pNewEffect->m_BlendBlockCount = m_BlendBlockCount; - pNewEffect->m_pBlendBlocks = m_pBlendBlocks; - pNewEffect->m_RasterizerBlockCount = m_RasterizerBlockCount; - pNewEffect->m_pRasterizerBlocks = m_pRasterizerBlocks; - pNewEffect->m_SamplerBlockCount = m_SamplerBlockCount; - pNewEffect->m_pSamplerBlocks = m_pSamplerBlocks; - pNewEffect->m_MemberDataCount = m_MemberDataCount; - pNewEffect->m_pMemberDataBlocks = m_pMemberDataBlocks; - pNewEffect->m_InterfaceCount = m_InterfaceCount; - pNewEffect->m_pInterfaces = m_pInterfaces; - pNewEffect->m_CBCount = m_CBCount; - pNewEffect->m_pCBs = m_pCBs; - pNewEffect->m_StringCount = m_StringCount; - pNewEffect->m_pStrings = m_pStrings; - pNewEffect->m_ShaderResourceCount = m_ShaderResourceCount; - pNewEffect->m_pShaderResources = m_pShaderResources; - pNewEffect->m_UnorderedAccessViewCount = m_UnorderedAccessViewCount; - pNewEffect->m_pUnorderedAccessViews = m_pUnorderedAccessViews; - pNewEffect->m_RenderTargetViewCount = m_RenderTargetViewCount; - pNewEffect->m_pRenderTargetViews = m_pRenderTargetViews; - pNewEffect->m_DepthStencilViewCount = m_DepthStencilViewCount; - pNewEffect->m_pDepthStencilViews = m_pDepthStencilViews; - pNewEffect->m_LocalTimer = m_LocalTimer; - pNewEffect->m_FXLIndex = m_FXLIndex; - pNewEffect->m_pDevice = m_pDevice; - pNewEffect->m_pClassLinkage = m_pClassLinkage; - - pNewEffect->AddRefAllForCloning( this ); - - - // m_pMemberInterfaces is a vector of cbuffer members that were created when the user called GetMemberBy* or GetElement - // or during Effect loading when an interface is initialized to a global class variable elment. - VH( pNewEffect->CopyMemberInterfaces( this ) ); - - loader.m_pvOldMemberInterfaces = &m_pMemberInterfaces; - loader.m_pEffect = pNewEffect; - loader.m_EffectMemory = loader.m_ReflectionMemory = 0; - - - // Move data from current effect to new effect - if( !IsOptimized() ) - { - VN( pNewEffect->m_pReflection = new CEffectReflection() ); - loader.m_pReflection = pNewEffect->m_pReflection; - - // make sure strings are moved before ReallocateEffectData - VH( loader.InitializeReflectionDataAndMoveStrings( m_pReflection->m_Heap.GetSize() ) ); - } - VH( loader.ReallocateEffectData( true ) ); - if( !IsOptimized() ) - { - VH( loader.ReallocateReflectionData( true ) ); - } - - - // Data structures for remapping type pointers and string pointers - VN( pTempHeap = new CDataBlockStore ); - pTempHeap->EnableAlignment(); - mappingTableTypes.SetPrivateHeap(pTempHeap); - mappingTableStrings.SetPrivateHeap(pTempHeap); - VH( mappingTableTypes.AutoGrow() ); - VH( mappingTableStrings.AutoGrow() ); - - if( !IsOptimized() ) - { - // Let's re-create the type pool and string pool - VN( pNewEffect->m_pPooledHeap = new CDataBlockStore ); - pNewEffect->m_pPooledHeap->EnableAlignment(); - - VH( pNewEffect->CopyStringPool( this, mappingTableStrings ) ); - VH( pNewEffect->CopyTypePool( this, mappingTableTypes, mappingTableStrings ) ); - } - else - { - // There's no string pool after optimizing. Let's re-create the type pool - VH( pNewEffect->CopyOptimizedTypePool( this, mappingTableTypes ) ); - } - - // fixup this effect's variable's types - VH( pNewEffect->OptimizeTypes(&mappingTableTypes, true) ); - VH( pNewEffect->RecreateCBs() ); - - - for (uint32_t i = 0; i < pNewEffect->m_pMemberInterfaces.GetSize(); ++ i) - { - SMember* pMember = pNewEffect->m_pMemberInterfaces[i]; - VH( pNewEffect->FixupMemberInterface( pMember, this, mappingTableStrings ) ); - } - - -lExit: - SAFE_DELETE( pTempHeap ); - if( FAILED( hr ) ) - { - SAFE_DELETE( pNewEffect ); - } - *ppClonedEffect = pNewEffect; - return hr; -} - -// Move all type pointers using pMappingTable. -// This is called after creating the optimized type pool or during cloning. -HRESULT CEffect::OptimizeTypes(_Inout_ CPointerMappingTable *pMappingTable, _In_ bool Cloning) -{ - HRESULT hr = S_OK; - - // find all child types, point them to the new location - for (size_t i = 0; i < m_VariableCount; ++ i) - { - VH( RemapType((SType**)&m_pVariables[i].pType, pMappingTable) ); - } - - uint32_t Members = m_pMemberInterfaces.GetSize(); - for( size_t i=0; i < Members; i++ ) - { - if( m_pMemberInterfaces[i] != nullptr ) - { - VH( RemapType((SType**)&m_pMemberInterfaces[i]->pType, pMappingTable) ); - } - } - - // when cloning, there may be annotations - if( Cloning ) - { - for (size_t iVar = 0; iVar < m_VariableCount; ++ iVar) - { - for(size_t i = 0; i < m_pVariables[iVar].AnnotationCount; ++ i ) - { - VH( RemapType((SType**)&m_pVariables[iVar].pAnnotations[i].pType, pMappingTable) ); - } - } - for (size_t iCB = 0; iCB < m_CBCount; ++ iCB) - { - for(size_t i = 0; i < m_pCBs[iCB].AnnotationCount; ++ i ) - { - VH( RemapType((SType**)&m_pCBs[iCB].pAnnotations[i].pType, pMappingTable) ); - } - } - for (size_t iGroup = 0; iGroup < m_GroupCount; ++ iGroup) - { - for(size_t i = 0; i < m_pGroups[iGroup].AnnotationCount; ++ i ) - { - VH( RemapType((SType**)&m_pGroups[iGroup].pAnnotations[i].pType, pMappingTable) ); - } - for(size_t iTech = 0; iTech < m_pGroups[iGroup].TechniqueCount; ++ iTech ) - { - for(size_t i = 0; i < m_pGroups[iGroup].pTechniques[iTech].AnnotationCount; ++ i ) - { - VH( RemapType((SType**)&m_pGroups[iGroup].pTechniques[iTech].pAnnotations[i].pType, pMappingTable) ); - } - for(size_t iPass = 0; iPass < m_pGroups[iGroup].pTechniques[iTech].PassCount; ++ iPass ) - { - for(size_t i = 0; i < m_pGroups[iGroup].pTechniques[iTech].pPasses[iPass].AnnotationCount; ++ i ) - { - VH( RemapType((SType**)&m_pGroups[iGroup].pTechniques[iTech].pPasses[iPass].pAnnotations[i].pType, pMappingTable) ); - } - } - } - } - } -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// Public API to shed this effect of its reflection data - -HRESULT CEffect::Optimize() -{ - HRESULT hr = S_OK; - CEffectHeap *pOptimizedTypeHeap = nullptr; - - if (IsOptimized()) - { - DPF(0, "ID3DX11Effect::Optimize: Effect has already been Optimize()'ed"); - return S_OK; - } - - // Delete annotations, names, semantics, and string data on variables - - for (size_t i = 0; i < m_VariableCount; ++ i) - { - m_pVariables[i].AnnotationCount = 0; - m_pVariables[i].pAnnotations = nullptr; - m_pVariables[i].pName = nullptr; - m_pVariables[i].pSemantic = nullptr; - - // 2) Point string variables to nullptr - if (m_pVariables[i].pType->IsObjectType(EOT_String)) - { - assert(nullptr != m_pVariables[i].Data.pString); - m_pVariables[i].Data.pString = nullptr; - } - } - - // Delete annotations and names on CBs - - for (size_t i = 0; i < m_CBCount; ++ i) - { - m_pCBs[i].AnnotationCount = 0; - m_pCBs[i].pAnnotations = nullptr; - m_pCBs[i].pName = nullptr; - m_pCBs[i].IsEffectOptimized = true; - } - - // Delete annotations and names on techniques and passes - - for (size_t i = 0; i < m_GroupCount; ++ i) - { - m_pGroups[i].AnnotationCount = 0; - m_pGroups[i].pAnnotations = nullptr; - m_pGroups[i].pName = nullptr; - - for (size_t j = 0; j < m_pGroups[i].TechniqueCount; ++ j) - { - m_pGroups[i].pTechniques[j].AnnotationCount = 0; - m_pGroups[i].pTechniques[j].pAnnotations = nullptr; - m_pGroups[i].pTechniques[j].pName = nullptr; - - for (size_t k = 0; k < m_pGroups[i].pTechniques[j].PassCount; ++ k) - { - m_pGroups[i].pTechniques[j].pPasses[k].AnnotationCount = 0; - m_pGroups[i].pTechniques[j].pPasses[k].pAnnotations = nullptr; - m_pGroups[i].pTechniques[j].pPasses[k].pName = nullptr; - } - } - }; - - // 2) Remove shader bytecode & stream out decls - // (all are contained within pReflectionData) - - for (size_t i = 0; i < m_ShaderBlockCount; ++ i) - { - if( m_pShaderBlocks[i].pReflectionData ) - { - // pReflection was not created with PRIVATENEW - SAFE_RELEASE( m_pShaderBlocks[i].pReflectionData->pReflection ); - - m_pShaderBlocks[i].pReflectionData = nullptr; - } - } - - uint32_t Members = m_pMemberInterfaces.GetSize(); - for( size_t i=0; i < Members; i++ ) - { - assert( m_pMemberInterfaces[i] != nullptr ); - if( IsReflectionData(m_pMemberInterfaces[i]->pTopLevelEntity) ) - { - assert( IsReflectionData(m_pMemberInterfaces[i]->Data.pGeneric) ); - - // This is checked when cloning (so we don't clone Optimized-out member variables) - m_pMemberInterfaces[i] = nullptr; - } - else - { - m_pMemberInterfaces[i]->pName = nullptr; - m_pMemberInterfaces[i]->pSemantic = nullptr; - } - } - - - - // get rid of the name/type hash tables and string data, - // then reallocate the type data and fix up this effect - CPointerMappingTable mappingTable; - CTypeHashTable::CIterator typeIter; - CPointerMappingTable::CIterator mapIter; - CCheckedDword chkSpaceNeeded = 0; - uint32_t spaceNeeded; - - // first pass: compute needed space - for (m_pTypePool->GetFirstEntry(&typeIter); !m_pTypePool->PastEnd(&typeIter); m_pTypePool->GetNextEntry(&typeIter)) - { - SType *pType = typeIter.GetData(); - - chkSpaceNeeded += AlignToPowerOf2(sizeof(SType), c_DataAlignment); - - // if this is a struct, allocate room for its members - if (EVT_Struct == pType->VarType) - { - chkSpaceNeeded += AlignToPowerOf2(pType->StructType.Members * sizeof(SVariable), c_DataAlignment); - } - } - - VH( chkSpaceNeeded.GetValue(&spaceNeeded) ); - - assert(nullptr == m_pOptimizedTypeHeap); - VN( pOptimizedTypeHeap = new CEffectHeap ); - VH( pOptimizedTypeHeap->ReserveMemory(spaceNeeded)); - - // use the private heap that we're about to destroy as scratch space for the mapping table - mappingTable.SetPrivateHeap(m_pPooledHeap); - VH( mappingTable.AutoGrow() ); - - // second pass: move types over, build mapping table - for (m_pTypePool->GetFirstEntry(&typeIter); !m_pTypePool->PastEnd(&typeIter); m_pTypePool->GetNextEntry(&typeIter)) - { - SPointerMapping ptrMapping; - SType *pType; - - ptrMapping.pOld = ptrMapping.pNew = typeIter.GetData(); - VH( pOptimizedTypeHeap->MoveData(&ptrMapping.pNew, sizeof(SType)) ); - - pType = (SType *) ptrMapping.pNew; - - // if this is a struct, move its members to the newly allocated space - if (EVT_Struct == pType->VarType) - { - VH( pOptimizedTypeHeap->MoveData((void **)&pType->StructType.pMembers, pType->StructType.Members * sizeof(SVariable)) ); - } - - VH( mappingTable.AddValueWithHash(ptrMapping, ptrMapping.Hash()) ); - } - - // third pass: fixup structure member & name pointers - for (mappingTable.GetFirstEntry(&mapIter); !mappingTable.PastEnd(&mapIter); mappingTable.GetNextEntry(&mapIter)) - { - SPointerMapping ptrMapping = mapIter.GetData(); - SType *pType = (SType *) ptrMapping.pNew; - - pType->pTypeName = nullptr; - - // if this is a struct, fix up its members' pointers - if (EVT_Struct == pType->VarType) - { - for (size_t i = 0; i < pType->StructType.Members; ++ i) - { - VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTable) ); - pType->StructType.pMembers[i].pName = nullptr; - pType->StructType.pMembers[i].pSemantic = nullptr; - } - } - } - - // fixup this effect's variable's types - VH( OptimizeTypes(&mappingTable) ); - - m_pOptimizedTypeHeap = pOptimizedTypeHeap; - pOptimizedTypeHeap = nullptr; - -#ifdef D3DX11_FX_PRINT_HASH_STATS - DPF(0, "Compiler string pool hash table statistics:"); - m_pTypePool->PrintHashTableStats(); - DPF(0, "Compiler type pool hash table statistics:"); - m_pStringPool->PrintHashTableStats(); -#endif // D3DX11_FX_PRINT_HASH_STATS - - SAFE_DELETE(m_pTypePool); - SAFE_DELETE(m_pStringPool); - SAFE_DELETE(m_pPooledHeap); - - DPF(0, "ID3DX11Effect::Optimize: %u bytes of reflection data freed.", m_pReflection->m_Heap.GetSize()); - SAFE_DELETE(m_pReflection); - m_Flags |= D3DX11_EFFECT_OPTIMIZED; - -lExit: - SAFE_DELETE(pOptimizedTypeHeap); - return hr; -} - -SMember * CreateNewMember(_In_ SType *pType, _In_ bool IsAnnotation) -{ - switch (pType->VarType) - { - case EVT_Struct: - if (IsAnnotation) - { - assert(sizeof(SNumericAnnotationMember) == sizeof(SMember)); - return (SMember*) new SNumericAnnotationMember; - } - else if (pType->StructType.ImplementsInterface) - { - assert(sizeof(SClassInstanceGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SClassInstanceGlobalVariableMember; - } - else - { - assert(sizeof(SNumericGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SNumericGlobalVariableMember; - } - break; - case EVT_Interface: - assert(sizeof(SInterfaceGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SInterfaceGlobalVariableMember; - break; - case EVT_Object: - switch (pType->ObjectType) - { - case EOT_String: - if (IsAnnotation) - { - assert(sizeof(SStringAnnotationMember) == sizeof(SMember)); - return (SMember*) new SStringAnnotationMember; - } - else - { - assert(sizeof(SStringGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SStringGlobalVariableMember; - } - - break; - case EOT_Texture: - case EOT_Texture1D: - case EOT_Texture1DArray: - case EOT_Texture2D: - case EOT_Texture2DArray: - case EOT_Texture2DMS: - case EOT_Texture2DMSArray: - case EOT_Texture3D: - case EOT_TextureCube: - case EOT_TextureCubeArray: - case EOT_Buffer: - case EOT_ByteAddressBuffer: - case EOT_StructuredBuffer: - assert(!IsAnnotation); - assert(sizeof(SShaderResourceGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SShaderResourceGlobalVariableMember; - break; - case EOT_RWTexture1D: - case EOT_RWTexture1DArray: - case EOT_RWTexture2D: - case EOT_RWTexture2DArray: - case EOT_RWTexture3D: - case EOT_RWBuffer: - case EOT_RWByteAddressBuffer: - case EOT_RWStructuredBuffer: - case EOT_RWStructuredBufferAlloc: - case EOT_RWStructuredBufferConsume: - case EOT_AppendStructuredBuffer: - case EOT_ConsumeStructuredBuffer: - assert(!IsAnnotation); - assert(sizeof(SUnorderedAccessViewGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SUnorderedAccessViewGlobalVariableMember; - break; - case EOT_VertexShader: - case EOT_VertexShader5: - case EOT_GeometryShader: - case EOT_GeometryShaderSO: - case EOT_GeometryShader5: - case EOT_PixelShader: - case EOT_PixelShader5: - case EOT_HullShader5: - case EOT_DomainShader5: - case EOT_ComputeShader5: - assert(!IsAnnotation); - assert(sizeof(SShaderGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SShaderGlobalVariableMember; - break; - case EOT_Blend: - assert(!IsAnnotation); - assert(sizeof(SBlendGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SBlendGlobalVariableMember; - break; - case EOT_Rasterizer: - assert(!IsAnnotation); - assert(sizeof(SRasterizerGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SRasterizerGlobalVariableMember; - break; - case EOT_DepthStencil: - assert(!IsAnnotation); - assert(sizeof(SDepthStencilGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SDepthStencilGlobalVariableMember; - break; - case EOT_Sampler: - assert(!IsAnnotation); - assert(sizeof(SSamplerGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SSamplerGlobalVariableMember; - break; - case EOT_DepthStencilView: - assert(!IsAnnotation); - assert(sizeof(SDepthStencilViewGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SDepthStencilViewGlobalVariableMember; - break; - case EOT_RenderTargetView: - assert(!IsAnnotation); - assert(sizeof(SRenderTargetViewGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SRenderTargetViewGlobalVariableMember; - break; - default: - assert(0); - DPF( 0, "Internal error: invalid object type." ); - return nullptr; - break; - } - break; - case EVT_Numeric: - switch (pType->NumericType.NumericLayout) - { - case ENL_Matrix: - if (IsAnnotation) - { - assert(sizeof(SMatrixAnnotationMember) == sizeof(SMember)); - return (SMember*) new SMatrixAnnotationMember; - } - else - { - assert(sizeof(SMatrixGlobalVariableMember) == sizeof(SMember)); - assert(sizeof(SMatrix4x4ColumnMajorGlobalVariableMember) == sizeof(SMember)); - assert(sizeof(SMatrix4x4RowMajorGlobalVariableMember) == sizeof(SMember)); - - if (pType->NumericType.Rows == 4 && pType->NumericType.Columns == 4) - { - if (pType->NumericType.IsColumnMajor) - { - return (SMember*) new SMatrix4x4ColumnMajorGlobalVariableMember; - } - else - { - return (SMember*) new SMatrix4x4RowMajorGlobalVariableMember; - } - } - else - { - return (SMember*) new SMatrixGlobalVariableMember; - } - } - break; - case ENL_Vector: - switch (pType->NumericType.ScalarType) - { - case EST_Float: - if (IsAnnotation) - { - assert(sizeof(SFloatVectorAnnotationMember) == sizeof(SMember)); - return (SMember*) new SFloatVectorAnnotationMember; - } - else - { - assert(sizeof(SFloatVectorGlobalVariableMember) == sizeof(SMember)); - assert(sizeof(SFloatVector4GlobalVariableMember) == sizeof(SMember)); - - if (pType->NumericType.Columns == 4) - { - return (SMember*) new SFloatVector4GlobalVariableMember; - } - else - { - return (SMember*) new SFloatVectorGlobalVariableMember; - } - } - break; - case EST_Bool: - if (IsAnnotation) - { - assert(sizeof(SBoolVectorAnnotationMember) == sizeof(SMember)); - return (SMember*) new SBoolVectorAnnotationMember; - } - else - { - assert(sizeof(SBoolVectorGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SBoolVectorGlobalVariableMember; - } - break; - case EST_UInt: - case EST_Int: - if (IsAnnotation) - { - assert(sizeof(SIntVectorAnnotationMember) == sizeof(SMember)); - return (SMember*) new SIntVectorAnnotationMember; - } - else - { - assert(sizeof(SIntVectorGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SIntVectorGlobalVariableMember; - } - break; - default: - assert(0); - DPF( 0, "Internal loading error: invalid vector type." ); - break; - } - break; - case ENL_Scalar: - switch (pType->NumericType.ScalarType) - { - case EST_Float: - if (IsAnnotation) - { - assert(sizeof(SFloatScalarAnnotationMember) == sizeof(SMember)); - return (SMember*) new SFloatScalarAnnotationMember; - } - else - { - assert(sizeof(SFloatScalarGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SFloatScalarGlobalVariableMember; - } - break; - case EST_UInt: - case EST_Int: - if (IsAnnotation) - { - assert(sizeof(SIntScalarAnnotationMember) == sizeof(SMember)); - return (SMember*) new SIntScalarAnnotationMember; - } - else - { - assert(sizeof(SIntScalarGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SIntScalarGlobalVariableMember; - } - break; - case EST_Bool: - if (IsAnnotation) - { - assert(sizeof(SBoolScalarAnnotationMember) == sizeof(SMember)); - return (SMember*) new SBoolScalarAnnotationMember; - } - else - { - assert(sizeof(SBoolScalarGlobalVariableMember) == sizeof(SMember)); - return (SMember*) new SBoolScalarGlobalVariableMember; - } - break; - default: - DPF( 0, "Internal loading error: invalid scalar type." ); - assert(0); - break; - } - break; - default: - assert(0); - DPF( 0, "Internal loading error: invalid numeric type." ); - break; - } - break; - default: - assert(0); - DPF( 0, "Internal loading error: invalid variable type." ); - break; - } - return nullptr; -} - -// Global variables are created in place because storage for them was allocated during LoadEffect -HRESULT PlacementNewVariable(_In_ void *pVar, _In_ SType *pType, _In_ bool IsAnnotation) -{ - switch (pType->VarType) - { - case EVT_Struct: - if (IsAnnotation) - { - assert(sizeof(SNumericAnnotation) == sizeof(SAnnotation)); - new(pVar) SNumericAnnotation(); - } - else if (pType->StructType.ImplementsInterface) - { - assert(sizeof(SClassInstanceGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SClassInstanceGlobalVariable; - } - else - { - assert(sizeof(SNumericGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SNumericGlobalVariable; - } - break; - case EVT_Interface: - assert(sizeof(SInterfaceGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SInterfaceGlobalVariable; - break; - case EVT_Object: - switch (pType->ObjectType) - { - case EOT_String: - if (IsAnnotation) - { - assert(sizeof(SStringAnnotation) == sizeof(SAnnotation)); - new(pVar) SStringAnnotation; - } - else - { - assert(sizeof(SStringGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SStringGlobalVariable; - } - - break; - case EOT_Texture: - case EOT_Texture1D: - case EOT_Texture1DArray: - case EOT_Texture2D: - case EOT_Texture2DArray: - case EOT_Texture2DMS: - case EOT_Texture2DMSArray: - case EOT_Texture3D: - case EOT_TextureCube: - case EOT_TextureCubeArray: - case EOT_Buffer: - case EOT_ByteAddressBuffer: - case EOT_StructuredBuffer: - assert(!IsAnnotation); - assert(sizeof(SShaderResourceGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SShaderResourceGlobalVariable; - break; - case EOT_RWTexture1D: - case EOT_RWTexture1DArray: - case EOT_RWTexture2D: - case EOT_RWTexture2DArray: - case EOT_RWTexture3D: - case EOT_RWBuffer: - case EOT_RWByteAddressBuffer: - case EOT_RWStructuredBuffer: - case EOT_RWStructuredBufferAlloc: - case EOT_RWStructuredBufferConsume: - case EOT_AppendStructuredBuffer: - case EOT_ConsumeStructuredBuffer: - assert(!IsAnnotation); - assert(sizeof(SUnorderedAccessViewGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SUnorderedAccessViewGlobalVariable; - break; - case EOT_VertexShader: - case EOT_VertexShader5: - case EOT_GeometryShader: - case EOT_GeometryShaderSO: - case EOT_GeometryShader5: - case EOT_PixelShader: - case EOT_PixelShader5: - case EOT_HullShader5: - case EOT_DomainShader5: - case EOT_ComputeShader5: - assert(!IsAnnotation); - assert(sizeof(SShaderGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SShaderGlobalVariable; - break; - case EOT_Blend: - assert(!IsAnnotation); - assert(sizeof(SBlendGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SBlendGlobalVariable; - break; - case EOT_Rasterizer: - assert(!IsAnnotation); - assert(sizeof(SRasterizerGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SRasterizerGlobalVariable; - break; - case EOT_DepthStencil: - assert(!IsAnnotation); - assert(sizeof(SDepthStencilGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SDepthStencilGlobalVariable; - break; - case EOT_Sampler: - assert(!IsAnnotation); - assert(sizeof(SSamplerGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SSamplerGlobalVariable; - break; - case EOT_RenderTargetView: - assert(!IsAnnotation); - assert(sizeof(SRenderTargetViewGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SRenderTargetViewGlobalVariable; - break; - case EOT_DepthStencilView: - assert(!IsAnnotation); - assert(sizeof(SDepthStencilViewGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SDepthStencilViewGlobalVariable; - break; - default: - assert(0); - DPF( 0, "Internal loading error: invalid object type." ); - return E_FAIL; - break; - } - break; - case EVT_Numeric: - switch (pType->NumericType.NumericLayout) - { - case ENL_Matrix: - if (IsAnnotation) - { - assert(sizeof(SMatrixAnnotation) == sizeof(SAnnotation)); - new(pVar) SMatrixAnnotation; - } - else - { - assert(sizeof(SMatrixGlobalVariable) == sizeof(SGlobalVariable)); - assert(sizeof(SMatrix4x4ColumnMajorGlobalVariable) == sizeof(SGlobalVariable)); - assert(sizeof(SMatrix4x4RowMajorGlobalVariable) == sizeof(SGlobalVariable)); - - if (pType->NumericType.Rows == 4 && pType->NumericType.Columns == 4) - { - if (pType->NumericType.IsColumnMajor) - { - new(pVar) SMatrix4x4ColumnMajorGlobalVariable; - } - else - { - new(pVar) SMatrix4x4RowMajorGlobalVariable; - } - } - else - { - new(pVar) SMatrixGlobalVariable; - } - } - break; - case ENL_Vector: - switch (pType->NumericType.ScalarType) - { - case EST_Float: - if (IsAnnotation) - { - assert(sizeof(SFloatVectorAnnotation) == sizeof(SAnnotation)); - new(pVar) SFloatVectorAnnotation; - } - else - { - assert(sizeof(SFloatVectorGlobalVariable) == sizeof(SGlobalVariable)); - assert(sizeof(SFloatVector4GlobalVariable) == sizeof(SGlobalVariable)); - - if (pType->NumericType.Columns == 4) - { - new(pVar) SFloatVector4GlobalVariable; - } - else - { - new(pVar) SFloatVectorGlobalVariable; - } - } - break; - case EST_Bool: - if (IsAnnotation) - { - assert(sizeof(SBoolVectorAnnotation) == sizeof(SAnnotation)); - new(pVar) SBoolVectorAnnotation; - } - else - { - assert(sizeof(SBoolVectorGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SBoolVectorGlobalVariable; - } - break; - case EST_UInt: - case EST_Int: - if (IsAnnotation) - { - assert(sizeof(SIntVectorAnnotation) == sizeof(SAnnotation)); - new(pVar) SIntVectorAnnotation; - } - else - { - assert(sizeof(SIntVectorGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SIntVectorGlobalVariable; - } - break; - } - break; - case ENL_Scalar: - switch (pType->NumericType.ScalarType) - { - case EST_Float: - if (IsAnnotation) - { - assert(sizeof(SFloatScalarAnnotation) == sizeof(SAnnotation)); - new(pVar) SFloatScalarAnnotation; - } - else - { - assert(sizeof(SFloatScalarGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SFloatScalarGlobalVariable; - } - break; - case EST_UInt: - case EST_Int: - if (IsAnnotation) - { - assert(sizeof(SIntScalarAnnotation) == sizeof(SAnnotation)); - new(pVar) SIntScalarAnnotation; - } - else - { - assert(sizeof(SIntScalarGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SIntScalarGlobalVariable; - } - break; - case EST_Bool: - if (IsAnnotation) - { - assert(sizeof(SBoolScalarAnnotation) == sizeof(SAnnotation)); - new(pVar) SBoolScalarAnnotation; - } - else - { - assert(sizeof(SBoolScalarGlobalVariable) == sizeof(SGlobalVariable)); - new(pVar) SBoolScalarGlobalVariable; - } - break; - default: - assert(0); - DPF( 0, "Internal loading error: invalid scalar type." ); - return E_FAIL; - break; - } - break; - default: - assert(0); - DPF( 0, "Internal loading error: invalid numeric type." ); - return E_FAIL; - break; - } - break; - default: - assert(0); - DPF( 0, "Internal loading error: invalid variable type." ); - return E_FAIL; - break; - } - return S_OK; -} - -} diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectReflection.cpp kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectReflection.cpp --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectReflection.cpp 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectReflection.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,2184 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: EffectReflection.cpp -// -// Direct3D 11 Effects public reflection APIs -// -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#include "pchfx.h" - -namespace D3DX11Effects -{ - -SEffectInvalidType g_InvalidType; - -SEffectInvalidScalarVariable g_InvalidScalarVariable; -SEffectInvalidVectorVariable g_InvalidVectorVariable; -SEffectInvalidMatrixVariable g_InvalidMatrixVariable; -SEffectInvalidStringVariable g_InvalidStringVariable; -SEffectInvalidClassInstanceVariable g_InvalidClassInstanceVariable; -SEffectInvalidInterfaceVariable g_InvalidInterfaceVariable; -SEffectInvalidShaderResourceVariable g_InvalidShaderResourceVariable; -SEffectInvalidUnorderedAccessViewVariable g_InvalidUnorderedAccessViewVariable; -SEffectInvalidRenderTargetViewVariable g_InvalidRenderTargetViewVariable; -SEffectInvalidDepthStencilViewVariable g_InvalidDepthStencilViewVariable; -SEffectInvalidConstantBuffer g_InvalidConstantBuffer; -SEffectInvalidShaderVariable g_InvalidShaderVariable; -SEffectInvalidBlendVariable g_InvalidBlendVariable; -SEffectInvalidDepthStencilVariable g_InvalidDepthStencilVariable; -SEffectInvalidRasterizerVariable g_InvalidRasterizerVariable; -SEffectInvalidSamplerVariable g_InvalidSamplerVariable; - -SEffectInvalidPass g_InvalidPass; -SEffectInvalidTechnique g_InvalidTechnique; -SEffectInvalidGroup g_InvalidGroup; - - -////////////////////////////////////////////////////////////////////////// -// Helper routine implementations -////////////////////////////////////////////////////////////////////////// - -ID3DX11EffectConstantBuffer * NoParentCB() -{ - DPF(0, "ID3DX11EffectVariable::GetParentConstantBuffer: Variable does not have a parent constant buffer"); - // have to typecast because the type of g_InvalidScalarVariable has not been declared yet - return &g_InvalidConstantBuffer; -} - -_Use_decl_annotations_ -ID3DX11EffectVariable * GetAnnotationByIndexHelper(const char *pClassName, uint32_t Index, uint32_t AnnotationCount, SAnnotation *pAnnotations) -{ - if (Index >= AnnotationCount) - { - DPF(0, "%s::GetAnnotationByIndex: Invalid index (%u, total: %u)", pClassName, Index, AnnotationCount); - return &g_InvalidScalarVariable; - } - - return pAnnotations + Index; -} - -_Use_decl_annotations_ -ID3DX11EffectVariable * GetAnnotationByNameHelper(const char *pClassName, LPCSTR Name, uint32_t AnnotationCount, SAnnotation *pAnnotations) -{ - uint32_t i; - for (i = 0; i < AnnotationCount; ++ i) - { - if (strcmp(pAnnotations[i].pName, Name) == 0) - { - return pAnnotations + i; - } - } - - DPF(0, "%s::GetAnnotationByName: Annotation [%s] not found", pClassName, Name); - return &g_InvalidScalarVariable; -} - -////////////////////////////////////////////////////////////////////////// -// Effect routines to pool interfaces -////////////////////////////////////////////////////////////////////////// - -ID3DX11EffectType * CEffect::CreatePooledSingleElementTypeInterface(_In_ SType *pType) -{ - if (IsOptimized()) - { - DPF(0, "ID3DX11Effect: Cannot create new type interfaces since the effect has been Optimize()'ed"); - return &g_InvalidType; - } - - for (size_t i = 0; i < m_pTypeInterfaces.GetSize(); ++ i) - { - if (m_pTypeInterfaces[i]->pType == pType) - { - return (SSingleElementType*)m_pTypeInterfaces[i]; - } - } - SSingleElementType *pNewType; - if (nullptr == (pNewType = new SSingleElementType)) - { - DPF(0, "ID3DX11Effect: Out of memory while trying to create new type interface"); - return &g_InvalidType; - } - - pNewType->pType = pType; - m_pTypeInterfaces.Add(pNewType); - - return pNewType; -} - -// Create a member variable (via GetMemberBy* or GetElement) -_Use_decl_annotations_ -ID3DX11EffectVariable * CEffect::CreatePooledVariableMemberInterface(TTopLevelVariable *pTopLevelEntity, - const SVariable *pMember, - const UDataPointer Data, bool IsSingleElement, uint32_t Index) -{ - bool IsAnnotation; - - if (IsOptimized()) - { - DPF(0, "ID3DX11Effect: Cannot create new variable interfaces since the effect has been Optimize()'ed"); - return &g_InvalidScalarVariable; - } - - for (size_t i = 0; i < m_pMemberInterfaces.GetSize(); ++ i) - { - if (m_pMemberInterfaces[i]->pType == pMember->pType && - m_pMemberInterfaces[i]->pName == pMember->pName && - m_pMemberInterfaces[i]->pSemantic == pMember->pSemantic && - m_pMemberInterfaces[i]->Data.pGeneric == Data.pGeneric && - m_pMemberInterfaces[i]->IsSingleElement == (uint32_t)IsSingleElement && - ((SMember*)m_pMemberInterfaces[i])->pTopLevelEntity == pTopLevelEntity) - { - return (ID3DX11EffectVariable *) m_pMemberInterfaces[i]; - } - } - - // is this annotation or runtime data? - if( pTopLevelEntity->pEffect->IsReflectionData(pTopLevelEntity) ) - { - assert( pTopLevelEntity->pEffect->IsReflectionData(Data.pGeneric) ); - IsAnnotation = true; - } - else - { - // if the heap is empty, we are still loading the Effect, and thus creating a member for a variable initializer - // ex. Interface myInt = myClassArray[2]; - if( pTopLevelEntity->pEffect->m_Heap.GetSize() > 0 ) - { - assert( pTopLevelEntity->pEffect->IsRuntimeData(pTopLevelEntity) ); - if (!pTopLevelEntity->pType->IsObjectType(EOT_String)) - { - // strings are funny; their data is reflection data, so ignore those - assert( pTopLevelEntity->pEffect->IsRuntimeData(Data.pGeneric) ); - } - } - IsAnnotation = false; - } - - SMember *pNewMember; - - if (nullptr == (pNewMember = CreateNewMember((SType*)pMember->pType, IsAnnotation))) - { - DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface"); - return &g_InvalidScalarVariable; - } - - pNewMember->pType = pMember->pType; - pNewMember->pName = pMember->pName; - pNewMember->pSemantic = pMember->pSemantic; - pNewMember->Data.pGeneric = Data.pGeneric; - pNewMember->IsSingleElement = IsSingleElement; - pNewMember->pTopLevelEntity = pTopLevelEntity; - - if( IsSingleElement && pMember->pMemberData ) - { - assert( !IsAnnotation ); - // This is an element of a global variable array - pNewMember->pMemberData = pMember->pMemberData + Index; - } - - if (FAILED(m_pMemberInterfaces.Add(pNewMember))) - { - SAFE_DELETE(pNewMember); - DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface"); - return &g_InvalidScalarVariable; - } - - return (ID3DX11EffectVariable *) pNewMember; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectType (SType, SSingleElementType implementations) -////////////////////////////////////////////////////////////////////////// - -static ID3DX11EffectType * GetTypeByIndexHelper(uint32_t Index, uint32_t VariableCount, - SVariable *pVariables, uint32_t SizeOfVariableType) -{ - static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeByIndex"; - - if (Index >= VariableCount) - { - DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, VariableCount); - return &g_InvalidType; - } - - SVariable *pVariable = (SVariable *)((uint8_t *)pVariables + Index * SizeOfVariableType); - if (nullptr == pVariable->pName) - { - DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName); - return &g_InvalidType; - } - - return (ID3DX11EffectType *) pVariable->pType; -} - -static ID3DX11EffectType * GetTypeByNameHelper(LPCSTR Name, uint32_t VariableCount, - SVariable *pVariables, uint32_t SizeOfVariableType) -{ - static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeByName"; - - if (nullptr == Name) - { - DPF(0, "%s: Parameter Name was nullptr.", pFuncName); - return &g_InvalidType; - } - - uint32_t i; - SVariable *pVariable; - - for (i = 0; i < VariableCount; ++ i) - { - pVariable = (SVariable *)((uint8_t *)pVariables + i * SizeOfVariableType); - if (nullptr == pVariable->pName) - { - DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName); - return &g_InvalidType; - } - if (strcmp(pVariable->pName, Name) == 0) - { - return (ID3DX11EffectType *) pVariable->pType; - } - } - - DPF(0, "%s: Member type [%s] not found", pFuncName, Name); - return &g_InvalidType; -} - - -static ID3DX11EffectType * GetTypeBySemanticHelper(LPCSTR Semantic, uint32_t VariableCount, - SVariable *pVariables, uint32_t SizeOfVariableType) -{ - static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeBySemantic"; - - if (nullptr == Semantic) - { - DPF(0, "%s: Parameter Semantic was nullptr.", pFuncName); - return &g_InvalidType; - } - - uint32_t i; - SVariable *pVariable; - - for (i = 0; i < VariableCount; ++ i) - { - pVariable = (SVariable *)((uint8_t *)pVariables + i * SizeOfVariableType); - if (nullptr == pVariable->pName) - { - DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName); - return &g_InvalidType; - } - if (nullptr != pVariable->pSemantic && - _stricmp(pVariable->pSemantic, Semantic) == 0) - { - return (ID3DX11EffectType *) pVariable->pType; - } - } - - DPF(0, "%s: Member type with semantic [%s] not found", pFuncName, Semantic); - return &g_InvalidType; -} - -ID3DX11EffectType * SType::GetMemberTypeByIndex(_In_ uint32_t Index) -{ - if (VarType != EVT_Struct) - { - DPF(0, "ID3DX11EffectType::GetMemberTypeByIndex: This interface does not refer to a structure"); - return &g_InvalidType; - } - - return GetTypeByIndexHelper(Index, StructType.Members, StructType.pMembers, sizeof(SVariable)); -} - -ID3DX11EffectType * SType::GetMemberTypeByName(_In_z_ LPCSTR Name) -{ - if (VarType != EVT_Struct) - { - DPF(0, "ID3DX11EffectType::GetMemberTypeByName: This interface does not refer to a structure"); - return &g_InvalidType; - } - - return GetTypeByNameHelper(Name, StructType.Members, StructType.pMembers, sizeof(SVariable)); -} - -ID3DX11EffectType * SType::GetMemberTypeBySemantic(_In_z_ LPCSTR Semantic) -{ - if (VarType != EVT_Struct) - { - DPF(0, "ID3DX11EffectType::GetMemberTypeBySemantic: This interface does not refer to a structure"); - return &g_InvalidType; - } - - return GetTypeBySemanticHelper(Semantic, StructType.Members, StructType.pMembers, sizeof(SVariable)); -} - -LPCSTR SType::GetMemberName(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberName"; - - if (VarType != EVT_Struct) - { - DPF(0, "%s: This interface does not refer to a structure", pFuncName); - return nullptr; - } - - if (Index >= StructType.Members) - { - DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, StructType.Members); - return nullptr; - } - - SVariable *pVariable = StructType.pMembers + Index; - - if (nullptr == pVariable->pName) - { - DPF(0, "%s: Cannot get member names; Effect has been Optimize()'ed", pFuncName); - return nullptr; - } - - return pVariable->pName; -} - -LPCSTR SType::GetMemberSemantic(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberSemantic"; - - if (VarType != EVT_Struct) - { - DPF(0, "%s: This interface does not refer to a structure", pFuncName); - return nullptr; - } - - if (Index >= StructType.Members) - { - DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, StructType.Members); - return nullptr; - } - - SVariable *pVariable = StructType.pMembers + Index; - - if (nullptr == pVariable->pName) - { - DPF(0, "%s: Cannot get member semantics; Effect has been Optimize()'ed", pFuncName); - return nullptr; - } - - return pVariable->pSemantic; -} - -HRESULT SType::GetDescHelper(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc, _In_ bool IsSingleElement) const -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectType::GetDesc"; - - VERIFYPARAMETER(pDesc); - - pDesc->TypeName = pTypeName; - - // intentionally return 0 so they know it's not a single element array - pDesc->Elements = IsSingleElement ? 0 : Elements; - pDesc->PackedSize = GetTotalPackedSize(IsSingleElement); - pDesc->UnpackedSize = GetTotalUnpackedSize(IsSingleElement); - pDesc->Stride = Stride; - - switch (VarType) - { - case EVT_Numeric: - switch (NumericType.NumericLayout) - { - case ENL_Matrix: - if (NumericType.IsColumnMajor) - { - pDesc->Class = D3D_SVC_MATRIX_COLUMNS; - } - else - { - pDesc->Class = D3D_SVC_MATRIX_ROWS; - } - break; - case ENL_Vector: - pDesc->Class = D3D_SVC_VECTOR; - break; - case ENL_Scalar: - pDesc->Class = D3D_SVC_SCALAR; - break; - default: - assert(0); - } - - switch (NumericType.ScalarType) - { - case EST_Bool: - pDesc->Type = D3D_SVT_BOOL; - break; - case EST_Int: - pDesc->Type = D3D_SVT_INT; - break; - case EST_UInt: - pDesc->Type = D3D_SVT_UINT; - break; - case EST_Float: - pDesc->Type = D3D_SVT_FLOAT; - break; - default: - assert(0); - } - - pDesc->Rows = NumericType.Rows; - pDesc->Columns = NumericType.Columns; - pDesc->Members = 0; - - break; - - case EVT_Struct: - pDesc->Rows = 0; - pDesc->Columns = 0; - pDesc->Members = StructType.Members; - if( StructType.ImplementsInterface ) - { - pDesc->Class = D3D_SVC_INTERFACE_CLASS; - } - else - { - pDesc->Class = D3D_SVC_STRUCT; - } - pDesc->Type = D3D_SVT_VOID; - break; - - case EVT_Interface: - pDesc->Rows = 0; - pDesc->Columns = 0; - pDesc->Members = 0; - pDesc->Class = D3D_SVC_INTERFACE_POINTER; - pDesc->Type = D3D_SVT_INTERFACE_POINTER; - break; - - case EVT_Object: - pDesc->Rows = 0; - pDesc->Columns = 0; - pDesc->Members = 0; - pDesc->Class = D3D_SVC_OBJECT; - - switch (ObjectType) - { - case EOT_String: - pDesc->Type = D3D_SVT_STRING; - break; - case EOT_Blend: - pDesc->Type = D3D_SVT_BLEND; - break; - case EOT_DepthStencil: - pDesc->Type = D3D_SVT_DEPTHSTENCIL; - break; - case EOT_Rasterizer: - pDesc->Type = D3D_SVT_RASTERIZER; - break; - case EOT_PixelShader: - case EOT_PixelShader5: - pDesc->Type = D3D_SVT_PIXELSHADER; - break; - case EOT_VertexShader: - case EOT_VertexShader5: - pDesc->Type = D3D_SVT_VERTEXSHADER; - break; - case EOT_GeometryShader: - case EOT_GeometryShaderSO: - case EOT_GeometryShader5: - pDesc->Type = D3D_SVT_GEOMETRYSHADER; - break; - case EOT_HullShader5: - pDesc->Type = D3D_SVT_HULLSHADER; - break; - case EOT_DomainShader5: - pDesc->Type = D3D_SVT_DOMAINSHADER; - break; - case EOT_ComputeShader5: - pDesc->Type = D3D_SVT_COMPUTESHADER; - break; - case EOT_Texture: - pDesc->Type = D3D_SVT_TEXTURE; - break; - case EOT_Texture1D: - pDesc->Type = D3D_SVT_TEXTURE1D; - break; - case EOT_Texture1DArray: - pDesc->Type = D3D_SVT_TEXTURE1DARRAY; - break; - case EOT_Texture2D: - pDesc->Type = D3D_SVT_TEXTURE2D; - break; - case EOT_Texture2DArray: - pDesc->Type = D3D_SVT_TEXTURE2DARRAY; - break; - case EOT_Texture2DMS: - pDesc->Type = D3D_SVT_TEXTURE2DMS; - break; - case EOT_Texture2DMSArray: - pDesc->Type = D3D_SVT_TEXTURE2DMSARRAY; - break; - case EOT_Texture3D: - pDesc->Type = D3D_SVT_TEXTURE3D; - break; - case EOT_TextureCube: - pDesc->Type = D3D_SVT_TEXTURECUBE; - break; - case EOT_TextureCubeArray: - pDesc->Type = D3D_SVT_TEXTURECUBEARRAY; - break; - case EOT_Buffer: - pDesc->Type = D3D_SVT_BUFFER; - break; - case EOT_Sampler: - pDesc->Type = D3D_SVT_SAMPLER; - break; - case EOT_RenderTargetView: - pDesc->Type = D3D_SVT_RENDERTARGETVIEW; - break; - case EOT_DepthStencilView: - pDesc->Type = D3D_SVT_DEPTHSTENCILVIEW; - break; - case EOT_RWTexture1D: - pDesc->Type = D3D_SVT_RWTEXTURE1D; - break; - case EOT_RWTexture1DArray: - pDesc->Type = D3D_SVT_RWTEXTURE1DARRAY; - break; - case EOT_RWTexture2D: - pDesc->Type = D3D_SVT_RWTEXTURE2D; - break; - case EOT_RWTexture2DArray: - pDesc->Type = D3D_SVT_RWTEXTURE2DARRAY; - break; - case EOT_RWTexture3D: - pDesc->Type = D3D_SVT_RWTEXTURE3D; - break; - case EOT_RWBuffer: - pDesc->Type = D3D_SVT_RWBUFFER; - break; - case EOT_ByteAddressBuffer: - pDesc->Type = D3D_SVT_BYTEADDRESS_BUFFER; - break; - case EOT_RWByteAddressBuffer: - pDesc->Type = D3D_SVT_RWBYTEADDRESS_BUFFER; - break; - case EOT_StructuredBuffer: - pDesc->Type = D3D_SVT_STRUCTURED_BUFFER; - break; - case EOT_RWStructuredBuffer: - case EOT_RWStructuredBufferAlloc: - case EOT_RWStructuredBufferConsume: - pDesc->Type = D3D_SVT_RWSTRUCTURED_BUFFER; - break; - case EOT_AppendStructuredBuffer: - pDesc->Type = D3D_SVT_APPEND_STRUCTURED_BUFFER; - break; - case EOT_ConsumeStructuredBuffer: - pDesc->Type = D3D_SVT_CONSUME_STRUCTURED_BUFFER; - break; - - default: - assert(0); - } - break; - - default: - assert(0); - } - -lExit: - return hr; - -} - -//////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectShaderVariable (SAnonymousShader implementation) -//////////////////////////////////////////////////////////////////////////////// - -SAnonymousShader::SAnonymousShader(_In_ SShaderBlock *pBlock) : pShaderBlock(pBlock) -{ -} - -bool SAnonymousShader::IsValid() -{ - return pShaderBlock && pShaderBlock->IsValid; -} - -ID3DX11EffectType * SAnonymousShader::GetType() -{ - return (ID3DX11EffectType *) this; -} - -HRESULT SAnonymousShader::GetDesc(_Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) -{ - pDesc->Annotations = 0; - pDesc->Flags = 0; - - pDesc->Name = "$Anonymous"; - pDesc->Semantic = nullptr; - pDesc->BufferOffset = 0; - - return S_OK; -} - -ID3DX11EffectVariable * SAnonymousShader::GetAnnotationByIndex(_In_ uint32_t Index) -{ - UNREFERENCED_PARAMETER(Index); - DPF(0, "ID3DX11EffectVariable::GetAnnotationByIndex: Anonymous shaders cannot have annotations"); - return &g_InvalidScalarVariable; -} - -ID3DX11EffectVariable * SAnonymousShader::GetAnnotationByName(_In_z_ LPCSTR Name) -{ - UNREFERENCED_PARAMETER(Name); - DPF(0, "ID3DX11EffectVariable::GetAnnotationByName: Anonymous shaders cannot have annotations"); - return &g_InvalidScalarVariable; -} - -ID3DX11EffectVariable * SAnonymousShader::GetMemberByIndex(_In_ uint32_t Index) -{ - UNREFERENCED_PARAMETER(Index); - DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Variable is not a structure"); - return &g_InvalidScalarVariable; -} - -ID3DX11EffectVariable * SAnonymousShader::GetMemberByName(_In_z_ LPCSTR Name) -{ - UNREFERENCED_PARAMETER(Name); - DPF(0, "ID3DX11EffectVariable::GetMemberByName: Variable is not a structure"); - return &g_InvalidScalarVariable; -} - -ID3DX11EffectVariable * SAnonymousShader::GetMemberBySemantic(_In_z_ LPCSTR Semantic) -{ - UNREFERENCED_PARAMETER(Semantic); - DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Variable is not a structure"); - return &g_InvalidScalarVariable; -} - -ID3DX11EffectVariable * SAnonymousShader::GetElement(_In_ uint32_t Index) -{ - UNREFERENCED_PARAMETER(Index); - DPF(0, "ID3DX11EffectVariable::GetElement: Anonymous shaders cannot have elements"); - return &g_InvalidScalarVariable; -} - -ID3DX11EffectConstantBuffer * SAnonymousShader::GetParentConstantBuffer() -{ - return NoParentCB(); -} - -ID3DX11EffectShaderVariable * SAnonymousShader::AsShader() -{ - return (ID3DX11EffectShaderVariable *) this; -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::SetRawValue(const void *pData, uint32_t Offset, uint32_t Count) -{ - UNREFERENCED_PARAMETER(pData); - UNREFERENCED_PARAMETER(Offset); - UNREFERENCED_PARAMETER(Count); - return ObjectSetRawValue(); -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::GetRawValue(void *pData, uint32_t Offset, uint32_t Count) -{ - UNREFERENCED_PARAMETER(pData); - UNREFERENCED_PARAMETER(Offset); - UNREFERENCED_PARAMETER(Count); - return ObjectGetRawValue(); -} - -#define ANONYMOUS_SHADER_INDEX_CHECK() \ - HRESULT hr = S_OK; \ - if (0 != ShaderIndex) \ - { \ - DPF(0, "%s: Invalid index specified", pFuncName); \ - VH(E_INVALIDARG); \ - } \ - -HRESULT SAnonymousShader::GetShaderDesc(_In_ uint32_t ShaderIndex, _Out_ D3DX11_EFFECT_SHADER_DESC *pDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetShaderDesc"; - - ANONYMOUS_SHADER_INDEX_CHECK(); - - hr = pShaderBlock->GetShaderDesc(pDesc, true); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::GetVertexShader(uint32_t ShaderIndex, ID3D11VertexShader **ppVS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetVertexShader"; - - ANONYMOUS_SHADER_INDEX_CHECK(); - - VH( pShaderBlock->GetVertexShader(ppVS) ); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::GetGeometryShader(uint32_t ShaderIndex, ID3D11GeometryShader **ppGS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetGeometryShader"; - - ANONYMOUS_SHADER_INDEX_CHECK(); - - VH( pShaderBlock->GetGeometryShader(ppGS) ); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::GetPixelShader(uint32_t ShaderIndex, ID3D11PixelShader **ppPS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPixelShader"; - - ANONYMOUS_SHADER_INDEX_CHECK(); - - VH( pShaderBlock->GetPixelShader(ppPS) ); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::GetHullShader(uint32_t ShaderIndex, ID3D11HullShader **ppHS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetHullShader"; - - ANONYMOUS_SHADER_INDEX_CHECK(); - - VH( pShaderBlock->GetHullShader(ppHS) ); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::GetDomainShader(uint32_t ShaderIndex, ID3D11DomainShader **ppDS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetDomainShader"; - - ANONYMOUS_SHADER_INDEX_CHECK(); - - VH( pShaderBlock->GetDomainShader(ppDS) ); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::GetComputeShader(uint32_t ShaderIndex, ID3D11ComputeShader **ppCS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetComputeShader"; - - ANONYMOUS_SHADER_INDEX_CHECK(); - - VH( pShaderBlock->GetComputeShader(ppCS) ); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::GetInputSignatureElementDesc(uint32_t ShaderIndex, uint32_t Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc"; - - ANONYMOUS_SHADER_INDEX_CHECK(); - - VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_Input, Element, pDesc) ); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::GetOutputSignatureElementDesc(uint32_t ShaderIndex, uint32_t Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc"; - - ANONYMOUS_SHADER_INDEX_CHECK(); - - VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_Output, Element, pDesc) ); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT SAnonymousShader::GetPatchConstantSignatureElementDesc(uint32_t ShaderIndex, uint32_t Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc"; - - ANONYMOUS_SHADER_INDEX_CHECK(); - - VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_PatchConstant, Element, pDesc) ); - -lExit: - return hr; -} - -HRESULT SAnonymousShader::GetDesc(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc) -{ - pDesc->Class = D3D_SVC_OBJECT; - - switch (pShaderBlock->GetShaderType()) - { - case EOT_VertexShader: - case EOT_VertexShader5: - pDesc->TypeName = "vertexshader"; - pDesc->Type = D3D_SVT_VERTEXSHADER; - break; - case EOT_GeometryShader: - case EOT_GeometryShader5: - pDesc->TypeName = "geometryshader"; - pDesc->Type = D3D_SVT_GEOMETRYSHADER; - break; - case EOT_PixelShader: - case EOT_PixelShader5: - pDesc->TypeName = "pixelshader"; - pDesc->Type = D3D_SVT_PIXELSHADER; - break; - case EOT_HullShader5: - pDesc->TypeName = "Hullshader"; - pDesc->Type = D3D_SVT_HULLSHADER; - break; - case EOT_DomainShader5: - pDesc->TypeName = "Domainshader"; - pDesc->Type = D3D_SVT_DOMAINSHADER; - break; - case EOT_ComputeShader5: - pDesc->TypeName = "Computeshader"; - pDesc->Type = D3D_SVT_COMPUTESHADER; - break; - } - - pDesc->Elements = 0; - pDesc->Members = 0; - pDesc->Rows = 0; - pDesc->Columns = 0; - pDesc->PackedSize = 0; - pDesc->UnpackedSize = 0; - pDesc->Stride = 0; - - return S_OK; -} - -ID3DX11EffectType * SAnonymousShader::GetMemberTypeByIndex(_In_ uint32_t Index) -{ - UNREFERENCED_PARAMETER(Index); - DPF(0, "ID3DX11EffectType::GetMemberTypeByIndex: This interface does not refer to a structure"); - return &g_InvalidType; -} - -ID3DX11EffectType * SAnonymousShader::GetMemberTypeByName(_In_z_ LPCSTR Name) -{ - UNREFERENCED_PARAMETER(Name); - DPF(0, "ID3DX11EffectType::GetMemberTypeByName: This interface does not refer to a structure"); - return &g_InvalidType; -} - -ID3DX11EffectType * SAnonymousShader::GetMemberTypeBySemantic(_In_z_ LPCSTR Semantic) -{ - UNREFERENCED_PARAMETER(Semantic); - DPF(0, "ID3DX11EffectType::GetMemberTypeBySemantic: This interface does not refer to a structure"); - return &g_InvalidType; -} - -LPCSTR SAnonymousShader::GetMemberName(_In_ uint32_t Index) -{ - UNREFERENCED_PARAMETER(Index); - DPF(0, "ID3DX11EffectType::GetMemberName: This interface does not refer to a structure"); - return nullptr; -} - -LPCSTR SAnonymousShader::GetMemberSemantic(_In_ uint32_t Index) -{ - UNREFERENCED_PARAMETER(Index); - DPF(0, "ID3DX11EffectType::GetMemberSemantic: This interface does not refer to a structure"); - return nullptr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectConstantBuffer (SConstantBuffer implementation) -////////////////////////////////////////////////////////////////////////// - -bool SConstantBuffer::IsValid() -{ - return true; -} - -ID3DX11EffectType * SConstantBuffer::GetType() -{ - return (ID3DX11EffectType *) this; -} - -HRESULT SConstantBuffer::GetDesc(_Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) -{ - pDesc->Annotations = AnnotationCount; - pDesc->Flags = 0; - - pDesc->Name = pName; - pDesc->Semantic = nullptr; - pDesc->BufferOffset = 0; - - if (ExplicitBindPoint != -1) - { - pDesc->ExplicitBindPoint = ExplicitBindPoint; - pDesc->Flags |= D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT; - } - else - { - pDesc->ExplicitBindPoint = 0; - } - - return S_OK; -} - -ID3DX11EffectVariable * SConstantBuffer::GetAnnotationByIndex(_In_ uint32_t Index) -{ - return GetAnnotationByIndexHelper("ID3DX11EffectVariable", Index, AnnotationCount, pAnnotations); -} - -ID3DX11EffectVariable * SConstantBuffer::GetAnnotationByName(_In_z_ LPCSTR Name) -{ - return GetAnnotationByNameHelper("ID3DX11EffectVariable", Name, AnnotationCount, pAnnotations); -} - -ID3DX11EffectVariable * SConstantBuffer::GetMemberByIndex(_In_ uint32_t Index) -{ - SGlobalVariable *pMember; - UDataPointer dataPtr; - - if (IsEffectOptimized) - { - DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Cannot get members; effect has been Optimize()'ed"); - return &g_InvalidScalarVariable; - } - - if (!GetVariableByIndexHelper(Index, VariableCount, (SGlobalVariable*)pVariables, - nullptr, &pMember, &dataPtr.pGeneric)) - { - return &g_InvalidScalarVariable; - } - - return (ID3DX11EffectVariable *) pMember; -} - -ID3DX11EffectVariable * SConstantBuffer::GetMemberByName(_In_z_ LPCSTR Name) -{ - SGlobalVariable *pMember; - UDataPointer dataPtr; - uint32_t index; - - if (IsEffectOptimized) - { - DPF(0, "ID3DX11EffectVariable::GetMemberByName: Cannot get members; effect has been Optimize()'ed"); - return &g_InvalidScalarVariable; - } - - if (!GetVariableByNameHelper(Name, VariableCount, (SGlobalVariable*)pVariables, - nullptr, &pMember, &dataPtr.pGeneric, &index)) - { - return &g_InvalidScalarVariable; - } - - return (ID3DX11EffectVariable *) pMember; -} - -ID3DX11EffectVariable * SConstantBuffer::GetMemberBySemantic(_In_z_ LPCSTR Semantic) -{ - SGlobalVariable *pMember; - UDataPointer dataPtr; - uint32_t index; - - if (IsEffectOptimized) - { - DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Cannot get members; effect has been Optimize()'ed"); - return &g_InvalidScalarVariable; - } - - if (!GetVariableBySemanticHelper(Semantic, VariableCount, (SGlobalVariable*)pVariables, - nullptr, &pMember, &dataPtr.pGeneric, &index)) - { - return &g_InvalidScalarVariable; - } - - return (ID3DX11EffectVariable *) pMember; -} - -ID3DX11EffectVariable * SConstantBuffer::GetElement(_In_ uint32_t Index) -{ - UNREFERENCED_PARAMETER(Index); - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetElement"; - DPF(0, "%s: This interface does not refer to an array", pFuncName); - return &g_InvalidScalarVariable; -} - -ID3DX11EffectConstantBuffer * SConstantBuffer::GetParentConstantBuffer() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetParentConstantBuffer"; - DPF(0, "%s: Constant buffers do not have parent constant buffers", pFuncName); - return &g_InvalidConstantBuffer; -} - -ID3DX11EffectConstantBuffer * SConstantBuffer::AsConstantBuffer() -{ - return (ID3DX11EffectConstantBuffer *) this; -} - -HRESULT SConstantBuffer::GetDesc(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc) -{ - pDesc->TypeName = IsTBuffer ? "tbuffer" : "cbuffer"; - pDesc->Class = D3D_SVC_OBJECT; - pDesc->Type = IsTBuffer ? D3D_SVT_TBUFFER : D3D_SVT_CBUFFER; - - pDesc->Elements = 0; - pDesc->Members = VariableCount; - pDesc->Rows = 0; - pDesc->Columns = 0; - - uint32_t i; - pDesc->PackedSize = 0; - for (i = 0; i < VariableCount; ++ i) - { - pDesc->PackedSize += pVariables[i].pType->PackedSize; - } - - pDesc->UnpackedSize = Size; - assert(pDesc->UnpackedSize >= pDesc->PackedSize); - - pDesc->Stride = AlignToPowerOf2(pDesc->UnpackedSize, SType::c_RegisterSize); - - return S_OK; -} - -ID3DX11EffectType * SConstantBuffer::GetMemberTypeByIndex(_In_ uint32_t Index) -{ - return GetTypeByIndexHelper(Index, VariableCount, pVariables, sizeof (SGlobalVariable)); -} - -ID3DX11EffectType * SConstantBuffer::GetMemberTypeByName(_In_z_ LPCSTR Name) -{ - return GetTypeByNameHelper(Name, VariableCount, pVariables, sizeof (SGlobalVariable)); -} - -ID3DX11EffectType * SConstantBuffer::GetMemberTypeBySemantic(_In_z_ LPCSTR Semantic) -{ - return GetTypeBySemanticHelper(Semantic, VariableCount, pVariables, sizeof (SGlobalVariable)); -} - -LPCSTR SConstantBuffer::GetMemberName(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberName"; - - if (IsEffectOptimized) - { - DPF(0, "%s: Cannot get member names; Effect has been Optimize()'ed", pFuncName); - return nullptr; - } - - if (Index >= VariableCount) - { - DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, VariableCount); - return nullptr; - } - - return pVariables[Index].pName; -} - -LPCSTR SConstantBuffer::GetMemberSemantic(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberSemantic"; - - if (IsEffectOptimized) - { - DPF(0, "%s: Cannot get member semantics; Effect has been Optimize()'ed", pFuncName); - return nullptr; - } - - if (Index >= VariableCount) - { - DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, VariableCount); - return nullptr; - } - - return pVariables[Index].pSemantic; -} - -_Use_decl_annotations_ -HRESULT SConstantBuffer::SetRawValue(const void *pData, uint32_t Offset, uint32_t Count) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectVariable::SetRawValue"; - - VERIFYPARAMETER(pData); - - if ((Offset + Count < Offset) || - (Count + (uint8_t*)pData < (uint8_t*)pData) || - ((Offset + Count) > Size)) - { - // overflow of some kind - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - if (IsUsedByExpression) - { - uint32_t i; - for (i = 0; i < VariableCount; ++ i) - { - ((SGlobalVariable*)pVariables)[i].DirtyVariable(); - } - } - else - { - IsDirty = true; - } - - memcpy(pBackingStore + Offset, pData, Count); - -lExit: - return hr; -} - -_Use_decl_annotations_ -HRESULT SConstantBuffer::GetRawValue(void *pData, uint32_t Offset, uint32_t Count) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetRawValue"; - - VERIFYPARAMETER(pData); - - if ((Offset + Count < Offset) || - (Count + (uint8_t*)pData < (uint8_t*)pData) || - ((Offset + Count) > Size)) - { - // overflow of some kind - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - memcpy(pData, pBackingStore + Offset, Count); - -lExit: - return hr; -} - -bool SConstantBuffer::ClonedSingle() const -{ - return IsSingle && ( pEffect->m_Flags & D3DX11_EFFECT_CLONE ); -} - -HRESULT SConstantBuffer::SetConstantBuffer(_In_ ID3D11Buffer *pConstantBuffer) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::SetConstantBuffer"; - - if (IsTBuffer) - { - DPF(0, "%s: This is a texture buffer; use SetTextureBuffer instead", pFuncName); - VH(D3DERR_INVALIDCALL); - } - - // Replace all references to the old shader block with this one - pEffect->ReplaceCBReference(this, pConstantBuffer); - - if( !IsUserManaged ) - { - // Save original cbuffer in case we UndoSet - assert( pMemberData[0].Type == MDT_Buffer ); - VB( pMemberData[0].Data.pD3DEffectsManagedConstantBuffer == nullptr ); - pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = pD3DObject; - pD3DObject = nullptr; - IsUserManaged = true; - IsNonUpdatable = true; - } - - SAFE_ADDREF( pConstantBuffer ); - SAFE_RELEASE( pD3DObject ); - pD3DObject = pConstantBuffer; - -lExit: - return hr; -} - -HRESULT SConstantBuffer::GetConstantBuffer(_Outptr_ ID3D11Buffer **ppConstantBuffer) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::GetConstantBuffer"; - - VERIFYPARAMETER(ppConstantBuffer); - - if (IsTBuffer) - { - DPF(0, "%s: This is a texture buffer; use GetTextureBuffer instead", pFuncName); - VH(D3DERR_INVALIDCALL); - } - - assert( pD3DObject ); - _Analysis_assume_( pD3DObject ); - *ppConstantBuffer = pD3DObject; - SAFE_ADDREF(*ppConstantBuffer); - -lExit: - return hr; -} - -HRESULT SConstantBuffer::UndoSetConstantBuffer() -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::UndoSetConstantBuffer"; - - if (IsTBuffer) - { - DPF(0, "%s: This is a texture buffer; use UndoSetTextureBuffer instead", pFuncName); - VH(D3DERR_INVALIDCALL); - } - - if( !IsUserManaged ) - { - return S_FALSE; - } - - // Replace all references to the old shader block with this one - pEffect->ReplaceCBReference(this, pMemberData[0].Data.pD3DEffectsManagedConstantBuffer); - - // Revert to original cbuffer - SAFE_RELEASE( pD3DObject ); - pD3DObject = pMemberData[0].Data.pD3DEffectsManagedConstantBuffer; - pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = nullptr; - IsUserManaged = false; - IsNonUpdatable = ClonedSingle(); - -lExit: - return hr; -} - -HRESULT SConstantBuffer::SetTextureBuffer(_In_ ID3D11ShaderResourceView *pTextureBuffer) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::SetTextureBuffer"; - - if (!IsTBuffer) - { - DPF(0, "%s: This is a constant buffer; use SetConstantBuffer instead", pFuncName); - VH(D3DERR_INVALIDCALL); - } - - if( !IsUserManaged ) - { - // Save original cbuffer and tbuffer in case we UndoSet - assert( pMemberData[0].Type == MDT_Buffer ); - VB( pMemberData[0].Data.pD3DEffectsManagedConstantBuffer == nullptr ); - pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = pD3DObject; - pD3DObject = nullptr; - assert( pMemberData[1].Type == MDT_ShaderResourceView ); - VB( pMemberData[1].Data.pD3DEffectsManagedTextureBuffer == nullptr ); - pMemberData[1].Data.pD3DEffectsManagedTextureBuffer = TBuffer.pShaderResource; - TBuffer.pShaderResource = nullptr; - IsUserManaged = true; - IsNonUpdatable = true; - } - - SAFE_ADDREF( pTextureBuffer ); - SAFE_RELEASE(pD3DObject); // won't be needing this anymore... - SAFE_RELEASE( TBuffer.pShaderResource ); - TBuffer.pShaderResource = pTextureBuffer; - -lExit: - return hr; -} - -HRESULT SConstantBuffer::GetTextureBuffer(_Outptr_ ID3D11ShaderResourceView **ppTextureBuffer) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::GetTextureBuffer"; - - VERIFYPARAMETER(ppTextureBuffer); - - if (!IsTBuffer) - { - DPF(0, "%s: This is a constant buffer; use GetConstantBuffer instead", pFuncName); - VH(D3DERR_INVALIDCALL); - } - - assert( TBuffer.pShaderResource ); - _Analysis_assume_( TBuffer.pShaderResource ); - *ppTextureBuffer = TBuffer.pShaderResource; - SAFE_ADDREF(*ppTextureBuffer); - -lExit: - return hr; -} - -HRESULT SConstantBuffer::UndoSetTextureBuffer() -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::UndoSetTextureBuffer"; - - if (!IsTBuffer) - { - DPF(0, "%s: This is a texture buffer; use UndoSetConstantBuffer instead", pFuncName); - VH(D3DERR_INVALIDCALL); - } - - if( !IsUserManaged ) - { - return S_FALSE; - } - - // Revert to original cbuffer - SAFE_RELEASE( pD3DObject ); - pD3DObject = pMemberData[0].Data.pD3DEffectsManagedConstantBuffer; - pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = nullptr; - SAFE_RELEASE( TBuffer.pShaderResource ); - TBuffer.pShaderResource = pMemberData[1].Data.pD3DEffectsManagedTextureBuffer; - pMemberData[1].Data.pD3DEffectsManagedTextureBuffer = nullptr; - IsUserManaged = false; - IsNonUpdatable = ClonedSingle(); - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectPass (CEffectPass implementation) -////////////////////////////////////////////////////////////////////////// - -bool SPassBlock::IsValid() -{ - if( HasDependencies ) - return pEffect->ValidatePassBlock( this ); - return InitiallyValid; -} - -HRESULT SPassBlock::GetDesc(_Out_ D3DX11_PASS_DESC *pDesc) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectPass::GetDesc"; - - VERIFYPARAMETER(pDesc); - - ZeroMemory(pDesc, sizeof(*pDesc)); - - pDesc->Name = pName; - pDesc->Annotations = AnnotationCount; - - SAssignment *pAssignment; - SAssignment *pLastAssn; - - pEffect->IncrementTimer(); - - pAssignment = pAssignments; - pLastAssn = pAssignments + AssignmentCount; - - for(; pAssignment < pLastAssn; pAssignment++) - { - pEffect->EvaluateAssignment(pAssignment); - } - - if( BackingStore.pVertexShaderBlock && BackingStore.pVertexShaderBlock->pInputSignatureBlob ) - { - // pInputSignatureBlob can be null if we're setting a nullptr VS "SetVertexShader( nullptr )" - pDesc->pIAInputSignature = (uint8_t*)BackingStore.pVertexShaderBlock->pInputSignatureBlob->GetBufferPointer(); - pDesc->IAInputSignatureSize = BackingStore.pVertexShaderBlock->pInputSignatureBlob->GetBufferSize(); - } - - pDesc->StencilRef = BackingStore.StencilRef; - pDesc->SampleMask = BackingStore.SampleMask; - pDesc->BlendFactor[0] = BackingStore.BlendFactor[0]; - pDesc->BlendFactor[1] = BackingStore.BlendFactor[1]; - pDesc->BlendFactor[2] = BackingStore.BlendFactor[2]; - pDesc->BlendFactor[3] = BackingStore.BlendFactor[3]; - -lExit: - return hr; -} - -extern SShaderBlock g_NullVS; -extern SShaderBlock g_NullGS; -extern SShaderBlock g_NullPS; -extern SShaderBlock g_NullHS; -extern SShaderBlock g_NullDS; -extern SShaderBlock g_NullCS; - -SAnonymousShader g_AnonymousNullVS(&g_NullVS); -SAnonymousShader g_AnonymousNullGS(&g_NullGS); -SAnonymousShader g_AnonymousNullPS(&g_NullPS); -SAnonymousShader g_AnonymousNullHS(&g_NullHS); -SAnonymousShader g_AnonymousNullDS(&g_NullDS); -SAnonymousShader g_AnonymousNullCS(&g_NullCS); - -template -HRESULT SPassBlock::GetShaderDescHelper(D3DX11_PASS_SHADER_DESC *pDesc) -{ - HRESULT hr = S_OK; - uint32_t i; - LPCSTR pFuncName = nullptr; - SShaderBlock *pShaderBlock = nullptr; - - ApplyPassAssignments(); - - switch (EShaderType) - { - case EOT_VertexShader: - case EOT_VertexShader5: - pFuncName = "ID3DX11EffectPass::GetVertexShaderDesc"; - pShaderBlock = BackingStore.pVertexShaderBlock; - break; - case EOT_PixelShader: - case EOT_PixelShader5: - pFuncName = "ID3DX11EffectPass::GetPixelShaderDesc"; - pShaderBlock = BackingStore.pPixelShaderBlock; - break; - case EOT_GeometryShader: - case EOT_GeometryShader5: - pFuncName = "ID3DX11EffectPass::GetGeometryShaderDesc"; - pShaderBlock = BackingStore.pGeometryShaderBlock; - break; - case EOT_HullShader5: -#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF") - pFuncName = "ID3DX11EffectPass::GetHullShaderDesc"; - pShaderBlock = BackingStore.pHullShaderBlock; - break; - case EOT_DomainShader5: -#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF") - pFuncName = "ID3DX11EffectPass::GetDomainShaderDesc"; - pShaderBlock = BackingStore.pDomainShaderBlock; - break; - case EOT_ComputeShader5: -#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF") - pFuncName = "ID3DX11EffectPass::GetComputeShaderDesc"; - pShaderBlock = BackingStore.pComputeShaderBlock; - break; - default: - assert(0); - } - - VERIFYPARAMETER(pDesc); - - // in case of error (or in case the assignment doesn't exist), return something reasonable - pDesc->pShaderVariable = &g_InvalidShaderVariable; - pDesc->ShaderIndex = 0; - - if (nullptr != pShaderBlock) - { - uint32_t elements, varCount, anonymousShaderCount; - SGlobalVariable *pVariables; - SAnonymousShader *pAnonymousShaders; - - if (pShaderBlock == &g_NullVS) - { - pDesc->pShaderVariable = &g_AnonymousNullVS; - pDesc->ShaderIndex = 0; - // we're done - goto lExit; - } - else if (pShaderBlock == &g_NullGS) - { - pDesc->pShaderVariable = &g_AnonymousNullGS; - pDesc->ShaderIndex = 0; - // we're done - goto lExit; - } - else if (pShaderBlock == &g_NullPS) - { - pDesc->pShaderVariable = &g_AnonymousNullPS; - pDesc->ShaderIndex = 0; - // we're done - goto lExit; - } - else if (pShaderBlock == &g_NullHS) - { - pDesc->pShaderVariable = &g_AnonymousNullHS; - pDesc->ShaderIndex = 0; - // we're done - goto lExit; - } - else if (pShaderBlock == &g_NullDS) - { - pDesc->pShaderVariable = &g_AnonymousNullDS; - pDesc->ShaderIndex = 0; - // we're done - goto lExit; - } - else if (pShaderBlock == &g_NullCS) - { - pDesc->pShaderVariable = &g_AnonymousNullCS; - pDesc->ShaderIndex = 0; - // we're done - goto lExit; - } - else - { - VB( pEffect->IsRuntimeData(pShaderBlock) ); - varCount = pEffect->m_VariableCount; - pVariables = pEffect->m_pVariables; - anonymousShaderCount = pEffect->m_AnonymousShaderCount; - pAnonymousShaders = pEffect->m_pAnonymousShaders; - } - - for (i = 0; i < varCount; ++ i) - { - elements = std::max(1, pVariables[i].pType->Elements); - // make sure the variable type matches, and don't forget about GeometryShaderSO's - if (pVariables[i].pType->IsShader()) - { - if (pShaderBlock >= pVariables[i].Data.pShader && pShaderBlock < pVariables[i].Data.pShader + elements) - { - pDesc->pShaderVariable = (ID3DX11EffectShaderVariable *)(pVariables + i); - pDesc->ShaderIndex = (uint32_t)(UINT_PTR)(pShaderBlock - pVariables[i].Data.pShader); - // we're done - goto lExit; - } - } - } - - for (i = 0; i < anonymousShaderCount; ++ i) - { - if (pShaderBlock == pAnonymousShaders[i].pShaderBlock) - { - VB(EShaderType == pAnonymousShaders[i].pShaderBlock->GetShaderType()) - pDesc->pShaderVariable = (pAnonymousShaders + i); - pDesc->ShaderIndex = 0; - // we're done - goto lExit; - } - } - - DPF(0, "%s: Internal error; shader not found", pFuncName); - VH( E_FAIL ); - } - -lExit: - return hr; -} - -HRESULT SPassBlock::GetVertexShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) -{ - return GetShaderDescHelper(pDesc); -} - -HRESULT SPassBlock::GetPixelShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) -{ - return GetShaderDescHelper(pDesc); -} - -HRESULT SPassBlock::GetGeometryShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) -{ - return GetShaderDescHelper(pDesc); -} - -HRESULT SPassBlock::GetHullShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) -{ - return GetShaderDescHelper(pDesc); -} - -HRESULT SPassBlock::GetDomainShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) -{ - return GetShaderDescHelper(pDesc); -} - -HRESULT SPassBlock::GetComputeShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) -{ - return GetShaderDescHelper(pDesc); -} - -ID3DX11EffectVariable * SPassBlock::GetAnnotationByIndex(_In_ uint32_t Index) -{ - return GetAnnotationByIndexHelper("ID3DX11EffectPass", Index, AnnotationCount, pAnnotations); -} - -ID3DX11EffectVariable * SPassBlock::GetAnnotationByName(_In_z_ LPCSTR Name) -{ - return GetAnnotationByNameHelper("ID3DX11EffectPass", Name, AnnotationCount, pAnnotations); -} - -HRESULT SPassBlock::Apply(_In_ uint32_t Flags, _In_ ID3D11DeviceContext* pContext) - -{ - UNREFERENCED_PARAMETER(Flags); - HRESULT hr = S_OK; - - // Flags are unused, so should be 0 - - - assert( pEffect->m_pContext == nullptr ); - pEffect->m_pContext = pContext; - pEffect->ApplyPassBlock(this); - pEffect->m_pContext = nullptr; - -lExit: - return hr; -} - -HRESULT SPassBlock::ComputeStateBlockMask(_Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) -{ - HRESULT hr = S_OK; - - // flags indicating whether the following shader types were caught by assignment checks or not - bool bVS = false, bGS = false, bPS = false, bHS = false, bDS = false, bCS = false; - - for (size_t i = 0; i < AssignmentCount; ++ i) - { - bool bShader = false; - - switch (pAssignments[i].LhsType) - { - case ELHS_VertexShaderBlock: - bVS = true; - bShader = true; - break; - case ELHS_GeometryShaderBlock: - bGS = true; - bShader = true; - break; - case ELHS_PixelShaderBlock: - bPS = true; - bShader = true; - break; - case ELHS_HullShaderBlock: - bHS = true; - bShader = true; - break; - case ELHS_DomainShaderBlock: - bDS = true; - bShader = true; - break; - case ELHS_ComputeShaderBlock: - bCS = true; - bShader = true; - break; - - case ELHS_RasterizerBlock: - pStateBlockMask->RSRasterizerState = 1; - break; - case ELHS_BlendBlock: - pStateBlockMask->OMBlendState = 1; - break; - case ELHS_DepthStencilBlock: - pStateBlockMask->OMDepthStencilState = 1; - break; - - default: - // ignore this assignment (must be a scalar/vector assignment associated with a state object) - break; - } - - if (bShader) - { - for (size_t j = 0; j < pAssignments[i].MaxElements; ++ j) - { - // compute state block mask for the union of ALL shaders - VH( pAssignments[i].Source.pShader[j].ComputeStateBlockMask(pStateBlockMask) ); - } - } - } - - // go over the state block objects in case there was no corresponding assignment - if (nullptr != BackingStore.pRasterizerBlock) - { - pStateBlockMask->RSRasterizerState = 1; - } - if (nullptr != BackingStore.pBlendBlock) - { - pStateBlockMask->OMBlendState = 1; - } - if (nullptr != BackingStore.pDepthStencilBlock) - { - pStateBlockMask->OMDepthStencilState = 1; - } - - // go over the shaders only if an assignment didn't already catch them - if (false == bVS && nullptr != BackingStore.pVertexShaderBlock) - { - VH( BackingStore.pVertexShaderBlock->ComputeStateBlockMask(pStateBlockMask) ); - } - if (false == bGS && nullptr != BackingStore.pGeometryShaderBlock) - { - VH( BackingStore.pGeometryShaderBlock->ComputeStateBlockMask(pStateBlockMask) ); - } - if (false == bPS && nullptr != BackingStore.pPixelShaderBlock) - { - VH( BackingStore.pPixelShaderBlock->ComputeStateBlockMask(pStateBlockMask) ); - } - if (false == bHS && nullptr != BackingStore.pHullShaderBlock) - { - VH( BackingStore.pHullShaderBlock->ComputeStateBlockMask(pStateBlockMask) ); - } - if (false == bDS && nullptr != BackingStore.pDomainShaderBlock) - { - VH( BackingStore.pDomainShaderBlock->ComputeStateBlockMask(pStateBlockMask) ); - } - if (false == bCS && nullptr != BackingStore.pComputeShaderBlock) - { - VH( BackingStore.pComputeShaderBlock->ComputeStateBlockMask(pStateBlockMask) ); - } - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectTechnique (STechnique implementation) -////////////////////////////////////////////////////////////////////////// - -bool STechnique::IsValid() -{ - if( HasDependencies ) - { - for( size_t i = 0; i < PassCount; i++ ) - { - if( !((SPassBlock*)pPasses)[i].IsValid() ) - return false; - } - return true; - } - return InitiallyValid; -} - -HRESULT STechnique::GetDesc(_Out_ D3DX11_TECHNIQUE_DESC *pDesc) -{ - HRESULT hr = S_OK; - - static LPCSTR pFuncName = "ID3DX11EffectTechnique::GetDesc"; - - VERIFYPARAMETER(pDesc); - - pDesc->Name = pName; - pDesc->Annotations = AnnotationCount; - pDesc->Passes = PassCount; - -lExit: - return hr; -} - -ID3DX11EffectVariable * STechnique::GetAnnotationByIndex(_In_ uint32_t Index) -{ - return GetAnnotationByIndexHelper("ID3DX11EffectTechnique", Index, AnnotationCount, pAnnotations); -} - -ID3DX11EffectVariable * STechnique::GetAnnotationByName(_In_z_ LPCSTR Name) -{ - return GetAnnotationByNameHelper("ID3DX11EffectTechnique", Name, AnnotationCount, pAnnotations); -} - -ID3DX11EffectPass * STechnique::GetPassByIndex(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11EffectTechnique::GetPassByIndex"; - - if (Index >= PassCount) - { - DPF(0, "%s: Invalid pass index (%u, total: %u)", pFuncName, Index, PassCount); - return &g_InvalidPass; - } - - return (ID3DX11EffectPass *)(pPasses + Index); -} - -ID3DX11EffectPass * STechnique::GetPassByName(_In_z_ LPCSTR Name) -{ - static LPCSTR pFuncName = "ID3DX11EffectTechnique::GetPassByName"; - - uint32_t i; - - for (i = 0; i < PassCount; ++ i) - { - if (nullptr != pPasses[i].pName && - strcmp(pPasses[i].pName, Name) == 0) - { - break; - } - } - - if (i == PassCount) - { - DPF(0, "%s: Pass [%s] not found", pFuncName, Name); - return &g_InvalidPass; - } - - return (ID3DX11EffectPass *)(pPasses + i); -} - -HRESULT STechnique::ComputeStateBlockMask(_Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) -{ - HRESULT hr = S_OK; - uint32_t i; - - _Analysis_assume_( PassCount == 0 || pPasses != 0 ); - for (i = 0; i < PassCount; ++ i) - { - VH( ((SPassBlock*)pPasses)[i].ComputeStateBlockMask(pStateBlockMask) ); - } - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectGroup (SGroup implementation) -////////////////////////////////////////////////////////////////////////// - -bool SGroup::IsValid() -{ - if( HasDependencies ) - { - for( size_t i = 0; i < TechniqueCount; i++ ) - { - if( !((STechnique*)pTechniques)[i].IsValid() ) - return false; - } - return true; - } - return InitiallyValid; -} - -HRESULT SGroup::GetDesc(_Out_ D3DX11_GROUP_DESC *pDesc) -{ - HRESULT hr = S_OK; - - static LPCSTR pFuncName = "ID3DX11EffectGroup::GetDesc"; - - VERIFYPARAMETER(pDesc); - - pDesc->Name = pName; - pDesc->Annotations = AnnotationCount; - pDesc->Techniques = TechniqueCount; - -lExit: - return hr; -} - -ID3DX11EffectVariable * SGroup::GetAnnotationByIndex(_In_ uint32_t Index) -{ - return GetAnnotationByIndexHelper("ID3DX11EffectGroup", Index, AnnotationCount, pAnnotations); -} - -ID3DX11EffectVariable * SGroup::GetAnnotationByName(_In_z_ LPCSTR Name) -{ - return GetAnnotationByNameHelper("ID3DX11EffectGroup", Name, AnnotationCount, pAnnotations); -} - -ID3DX11EffectTechnique * SGroup::GetTechniqueByIndex(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11EffectGroup::GetTechniqueByIndex"; - - if (Index >= TechniqueCount) - { - DPF(0, "%s: Invalid pass index (%u, total: %u)", pFuncName, Index, TechniqueCount); - return &g_InvalidTechnique; - } - - return (ID3DX11EffectTechnique *)(pTechniques + Index); -} - -ID3DX11EffectTechnique * SGroup::GetTechniqueByName(_In_z_ LPCSTR Name) -{ - static LPCSTR pFuncName = "ID3DX11EffectGroup::GetTechniqueByName"; - - uint32_t i; - - for (i = 0; i < TechniqueCount; ++ i) - { - if (nullptr != pTechniques[i].pName && - strcmp(pTechniques[i].pName, Name) == 0) - { - break; - } - } - - if (i == TechniqueCount) - { - DPF(0, "%s: Technique [%s] not found", pFuncName, Name); - return &g_InvalidTechnique; - } - - return (ID3DX11EffectTechnique *)(pTechniques + i); -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11Effect Public Reflection APIs (CEffect) -////////////////////////////////////////////////////////////////////////// - -HRESULT CEffect::GetDevice(_Outptr_ ID3D11Device **ppDevice) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11Effect::GetDevice"; - VERIFYPARAMETER(ppDevice); - - m_pDevice->AddRef(); - *ppDevice = m_pDevice; - -lExit: - return hr; -} - -HRESULT CEffect::GetDesc(_Out_ D3DX11_EFFECT_DESC *pDesc) -{ - HRESULT hr = S_OK; - - static LPCSTR pFuncName = "ID3DX11Effect::GetDesc"; - - VERIFYPARAMETER(pDesc); - - pDesc->ConstantBuffers = m_CBCount; - pDesc->GlobalVariables = m_VariableCount; - pDesc->Techniques = m_TechniqueCount; - pDesc->Groups = m_GroupCount; - pDesc->InterfaceVariables = m_InterfaceCount; - -lExit: - return hr; -} - -ID3DX11EffectConstantBuffer * CEffect::GetConstantBufferByIndex(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11Effect::GetConstantBufferByIndex"; - - if (Index < m_CBCount) - { - return m_pCBs + Index; - } - - DPF(0, "%s: Invalid constant buffer index", pFuncName); - return &g_InvalidConstantBuffer; -} - -ID3DX11EffectConstantBuffer * CEffect::GetConstantBufferByName(_In_z_ LPCSTR Name) -{ - static LPCSTR pFuncName = "ID3DX11Effect::GetConstantBufferByName"; - - if (IsOptimized()) - { - DPF(0, "%s: Cannot get constant buffer interfaces by name since the effect has been Optimize()'ed", pFuncName); - return &g_InvalidConstantBuffer; - } - - if (nullptr == Name) - { - DPF(0, "%s: Parameter Name was nullptr.", pFuncName); - return &g_InvalidConstantBuffer; - } - - for (uint32_t i = 0; i < m_CBCount; ++ i) - { - if (strcmp(m_pCBs[i].pName, Name) == 0) - { - return m_pCBs + i; - } - } - - DPF(0, "%s: Constant Buffer [%s] not found", pFuncName, Name); - return &g_InvalidConstantBuffer; -} - -ID3DX11EffectVariable * CEffect::GetVariableByIndex(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11Effect::GetVariableByIndex"; - - if (Index < m_VariableCount) - { - return m_pVariables + Index; - } - - DPF(0, "%s: Invalid variable index", pFuncName); - return &g_InvalidScalarVariable; -} - -ID3DX11EffectVariable * CEffect::GetVariableByName(_In_z_ LPCSTR Name) -{ - static LPCSTR pFuncName = "ID3DX11Effect::GetVariableByName"; - - if (IsOptimized()) - { - DPF(0, "%s: Cannot get variable interfaces by name since the effect has been Optimize()'ed", pFuncName); - return &g_InvalidScalarVariable; - } - - if (nullptr == Name) - { - DPF(0, "%s: Parameter Name was nullptr.", pFuncName); - return &g_InvalidScalarVariable; - } - - for (uint32_t i = 0; i < m_VariableCount; ++ i) - { - if (strcmp(m_pVariables[i].pName, Name) == 0) - { - return m_pVariables + i; - } - } - - DPF(0, "%s: Variable [%s] not found", pFuncName, Name); - return &g_InvalidScalarVariable; -} - -ID3DX11EffectVariable * CEffect::GetVariableBySemantic(_In_z_ LPCSTR Semantic) -{ - static LPCSTR pFuncName = "ID3DX11Effect::GetVariableBySemantic"; - - if (IsOptimized()) - { - DPF(0, "%s: Cannot get variable interfaces by semantic since the effect has been Optimize()'ed", pFuncName); - return &g_InvalidScalarVariable; - } - - if (nullptr == Semantic) - { - DPF(0, "%s: Parameter Semantic was nullptr.", pFuncName); - return &g_InvalidScalarVariable; - } - - uint32_t i; - - for (i = 0; i < m_VariableCount; ++ i) - { - if (nullptr != m_pVariables[i].pSemantic && - _stricmp(m_pVariables[i].pSemantic, Semantic) == 0) - { - return (ID3DX11EffectVariable *)(m_pVariables + i); - } - } - - DPF(0, "%s: Variable with semantic [%s] not found", pFuncName, Semantic); - return &g_InvalidScalarVariable; -} - -ID3DX11EffectTechnique * CEffect::GetTechniqueByIndex(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11Effect::GetTechniqueByIndex"; - - if( Index < m_TechniqueCount ) - { - for( size_t i=0; i < m_GroupCount; i++ ) - { - if( Index < m_pGroups[i].TechniqueCount ) - { - return (ID3DX11EffectTechnique *)(m_pGroups[i].pTechniques + Index); - } - Index -= m_pGroups[i].TechniqueCount; - } - assert( false ); - } - DPF(0, "%s: Invalid technique index (%u)", pFuncName, Index); - return &g_InvalidTechnique; -} - -ID3DX11EffectTechnique * CEffect::GetTechniqueByName(_In_z_ LPCSTR Name) -{ - static LPCSTR pFuncName = "ID3DX11Effect::GetTechniqueByName"; - const size_t MAX_GROUP_TECHNIQUE_SIZE = 256; - char NameCopy[MAX_GROUP_TECHNIQUE_SIZE]; - - if (IsOptimized()) - { - DPF(0, "ID3DX11Effect::GetTechniqueByName: Cannot get technique interfaces by name since the effect has been Optimize()'ed"); - return &g_InvalidTechnique; - } - - if (nullptr == Name) - { - DPF(0, "%s: Parameter Name was nullptr.", pFuncName); - return &g_InvalidTechnique; - } - - if( FAILED( strcpy_s( NameCopy, MAX_GROUP_TECHNIQUE_SIZE, Name ) ) ) - { - DPF( 0, "Group|Technique name has a length greater than %u.", MAX_GROUP_TECHNIQUE_SIZE ); - return &g_InvalidTechnique; - } - - char* pDelimiter = strchr( NameCopy, '|' ); - if( pDelimiter == nullptr ) - { - if ( m_pNullGroup == nullptr ) - { - DPF( 0, "The effect contains no default group." ); - return &g_InvalidTechnique; - } - - return m_pNullGroup->GetTechniqueByName( Name ); - } - - // separate group name and technique name - *pDelimiter = 0; - - return GetGroupByName( NameCopy )->GetTechniqueByName( pDelimiter + 1 ); -} - -ID3D11ClassLinkage * CEffect::GetClassLinkage() -{ - SAFE_ADDREF( m_pClassLinkage ); - return m_pClassLinkage; -} - -ID3DX11EffectGroup * CEffect::GetGroupByIndex(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11Effect::GetGroupByIndex"; - - if( Index < m_GroupCount ) - { - return (ID3DX11EffectGroup *)(m_pGroups + Index); - } - DPF(0, "%s: Invalid group index (%u)", pFuncName, Index); - return &g_InvalidGroup; -} - -ID3DX11EffectGroup * CEffect::GetGroupByName(_In_z_ LPCSTR Name) -{ - static LPCSTR pFuncName = "ID3DX11Effect::GetGroupByName"; - - if (IsOptimized()) - { - DPF(0, "ID3DX11Effect::GetGroupByName: Cannot get group interfaces by name since the effect has been Optimize()'ed"); - return &g_InvalidGroup; - } - - if (nullptr == Name || Name[0] == 0 ) - { - return m_pNullGroup ? (ID3DX11EffectGroup *)m_pNullGroup : &g_InvalidGroup; - } - - uint32_t i = 0; - for (; i < m_GroupCount; ++ i) - { - if (nullptr != m_pGroups[i].pName && - strcmp(m_pGroups[i].pName, Name) == 0) - { - break; - } - } - - if (i == m_GroupCount) - { - DPF(0, "%s: Group [%s] not found", pFuncName, Name); - return &g_InvalidGroup; - } - - return (ID3DX11EffectGroup *)(m_pGroups + i); -} - -} diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectRuntime.cpp kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectRuntime.cpp --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectRuntime.cpp 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectRuntime.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,722 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: EffectRuntime.cpp -// -// Direct3D 11 Effect runtime routines (performance critical) -// These functions are expected to be called at high frequency -// (when applying a pass). -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#include "pchfx.h" - -namespace D3DX11Effects -{ - // D3D11_KEEP_UNORDERED_ACCESS_VIEWS == (uint32_t)-1 - uint32_t g_pNegativeOnes[8] = { D3D11_KEEP_UNORDERED_ACCESS_VIEWS, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, - D3D11_KEEP_UNORDERED_ACCESS_VIEWS, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, - D3D11_KEEP_UNORDERED_ACCESS_VIEWS, D3D11_KEEP_UNORDERED_ACCESS_VIEWS }; - -bool SBaseBlock::ApplyAssignments(CEffect *pEffect) -{ - SAssignment *pAssignment = pAssignments; - SAssignment *pLastAssn = pAssignments + AssignmentCount; - bool bRecreate = false; - - for(; pAssignment < pLastAssn; pAssignment++) - { - bRecreate |= pEffect->EvaluateAssignment(pAssignment); - } - - return bRecreate; -} - -void SPassBlock::ApplyPassAssignments() -{ - SAssignment *pAssignment = pAssignments; - SAssignment *pLastAssn = pAssignments + AssignmentCount; - - pEffect->IncrementTimer(); - - for(; pAssignment < pLastAssn; pAssignment++) - { - pEffect->EvaluateAssignment(pAssignment); - } -} - -// Returns true if the shader uses global interfaces (since these interfaces can be updated through SetClassInstance) -bool SPassBlock::CheckShaderDependencies( _In_ const SShaderBlock* pBlock ) -{ - if( pBlock->InterfaceDepCount > 0 ) - { - assert( pBlock->InterfaceDepCount == 1 ); - for( size_t i=0; i < pBlock->pInterfaceDeps[0].Count; i++ ) - { - SInterface* pInterfaceDep = pBlock->pInterfaceDeps[0].ppFXPointers[i]; - if( pInterfaceDep > pEffect->m_pInterfaces && pInterfaceDep < (pEffect->m_pInterfaces + pEffect->m_InterfaceCount) ) - { - // This is a global interface pointer (as opposed to an SInterface created in a BindInterface call - return true; - } - } - } - return false; -} - -// Returns true if the pass (and sets HasDependencies) if the pass sets objects whose backing stores can be updated -#pragma warning(push) -#pragma warning(disable: 4616 6282) -bool SPassBlock::CheckDependencies() -{ - if( HasDependencies ) - return true; - - for( size_t i=0; i < AssignmentCount; i++ ) - { - if( pAssignments[i].DependencyCount > 0 ) - return HasDependencies = true; - } - if( BackingStore.pBlendBlock && BackingStore.pBlendBlock->AssignmentCount > 0 ) - { - for( size_t i=0; i < BackingStore.pBlendBlock->AssignmentCount; i++ ) - { - if( BackingStore.pBlendBlock->pAssignments[i].DependencyCount > 0 ) - return HasDependencies = true; - } - } - if( BackingStore.pDepthStencilBlock && BackingStore.pDepthStencilBlock->AssignmentCount > 0 ) - { - for( size_t i=0; i < BackingStore.pDepthStencilBlock->AssignmentCount; i++ ) - { - if( BackingStore.pDepthStencilBlock->pAssignments[i].DependencyCount > 0 ) - return HasDependencies = true; - } - } - if( BackingStore.pRasterizerBlock && BackingStore.pRasterizerBlock->AssignmentCount > 0 ) - { - for( size_t i=0; i < BackingStore.pRasterizerBlock->AssignmentCount; i++ ) - { - if( BackingStore.pRasterizerBlock->pAssignments[i].DependencyCount > 0 ) - return HasDependencies = true; - } - } - if( BackingStore.pVertexShaderBlock && CheckShaderDependencies( BackingStore.pVertexShaderBlock ) ) - { - return HasDependencies = true; - } - if( BackingStore.pGeometryShaderBlock && CheckShaderDependencies( BackingStore.pGeometryShaderBlock ) ) - { - return HasDependencies = true; - } - if( BackingStore.pPixelShaderBlock && CheckShaderDependencies( BackingStore.pPixelShaderBlock ) ) - { - return HasDependencies = true; - } - if( BackingStore.pHullShaderBlock && CheckShaderDependencies( BackingStore.pHullShaderBlock ) ) - { - return HasDependencies = true; - } - if( BackingStore.pDomainShaderBlock && CheckShaderDependencies( BackingStore.pDomainShaderBlock ) ) - { - return HasDependencies = true; - } - if( BackingStore.pComputeShaderBlock && CheckShaderDependencies( BackingStore.pComputeShaderBlock ) ) - { - return HasDependencies = true; - } - - return HasDependencies; -} -#pragma warning(pop) - -// Update constant buffer contents if necessary -inline void CheckAndUpdateCB_FX(ID3D11DeviceContext *pContext, SConstantBuffer *pCB) -{ - if (pCB->IsDirty && !pCB->IsNonUpdatable) - { - // CB out of date; rebuild it - pContext->UpdateSubresource(pCB->pD3DObject, 0, nullptr, pCB->pBackingStore, pCB->Size, pCB->Size); - pCB->IsDirty = false; - } -} - - -//-------------------------------------------------------------------------------------- -//-------------------------------------------------------------------------------------- - -// Set the shader and dependent state (SRVs, samplers, UAVs, interfaces) -void CEffect::ApplyShaderBlock(_In_ SShaderBlock *pBlock) -{ - SD3DShaderVTable *pVT = pBlock->pVT; - - // Apply constant buffers first (tbuffers are done later) - SShaderCBDependency *pCBDep = pBlock->pCBDeps; - SShaderCBDependency *pLastCBDep = pBlock->pCBDeps + pBlock->CBDepCount; - - for (; pCBDepppFXPointers); - - for (size_t i = 0; i < pCBDep->Count; ++ i) - { - CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)pCBDep->ppFXPointers[i]); - } - - (m_pContext->*(pVT->pSetConstantBuffers))(pCBDep->StartIndex, pCBDep->Count, pCBDep->ppD3DObjects); - } - - // Next, apply samplers - SShaderSamplerDependency *pSampDep = pBlock->pSampDeps; - SShaderSamplerDependency *pLastSampDep = pBlock->pSampDeps + pBlock->SampDepCount; - - for (; pSampDepppFXPointers); - - for (size_t i=0; iCount; i++) - { - if ( ApplyRenderStateBlock(pSampDep->ppFXPointers[i]) ) - { - // If the sampler was updated, its pointer will have changed - pSampDep->ppD3DObjects[i] = pSampDep->ppFXPointers[i]->pD3DObject; - } - } - (m_pContext->*(pVT->pSetSamplers))(pSampDep->StartIndex, pSampDep->Count, pSampDep->ppD3DObjects); - } - - // Set the UAVs - // UAV ranges were combined in EffectLoad. This code remains unchanged, however, so that ranges can be easily split - assert( pBlock->UAVDepCount < 2 ); - if( pBlock->UAVDepCount > 0 ) - { - SUnorderedAccessViewDependency *pUAVDep = pBlock->pUAVDeps; - assert(pUAVDep->ppFXPointers != 0); - _Analysis_assume_(pUAVDep->ppFXPointers != 0); - - for (size_t i=0; iCount; i++) - { - pUAVDep->ppD3DObjects[i] = pUAVDep->ppFXPointers[i]->pUnorderedAccessView; - } - - if( EOT_ComputeShader5 == pBlock->GetShaderType() ) - { - m_pContext->CSSetUnorderedAccessViews( pUAVDep->StartIndex, pUAVDep->Count, pUAVDep->ppD3DObjects, g_pNegativeOnes ); - } - else - { - // This call could be combined with the call to set render targets if both exist in the pass - m_pContext->OMSetRenderTargetsAndUnorderedAccessViews( D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL, nullptr, nullptr, pUAVDep->StartIndex, pUAVDep->Count, pUAVDep->ppD3DObjects, g_pNegativeOnes ); - } - } - - // TBuffers are funny: - // We keep two references to them. One is in as a standard texture dep, and that gets used for all sets - // The other is as a part of the TBufferDeps array, which tells us to rebuild the matching CBs. - // These two refs could be rolled into one, but then we would have to predicate on each CB or each texture. - SConstantBuffer **ppTB = pBlock->ppTbufDeps; - SConstantBuffer **ppLastTB = ppTB + pBlock->TBufferDepCount; - - for (; ppTBpResourceDeps; - SShaderResourceDependency *pLastResourceDep = pBlock->pResourceDeps + pBlock->ResourceDepCount; - - for (; pResourceDepppFXPointers != 0); - _Analysis_assume_(pResourceDep->ppFXPointers != 0); - - for (size_t i=0; iCount; i++) - { - pResourceDep->ppD3DObjects[i] = pResourceDep->ppFXPointers[i]->pShaderResource; - } - - (m_pContext->*(pVT->pSetShaderResources))(pResourceDep->StartIndex, pResourceDep->Count, pResourceDep->ppD3DObjects); - } - - // Update Interface dependencies - uint32_t Interfaces = 0; - ID3D11ClassInstance** ppClassInstances = nullptr; - assert( pBlock->InterfaceDepCount < 2 ); - if( pBlock->InterfaceDepCount > 0 ) - { - SInterfaceDependency *pInterfaceDep = pBlock->pInterfaceDeps; - assert(pInterfaceDep->ppFXPointers); - - ppClassInstances = pInterfaceDep->ppD3DObjects; - Interfaces = pInterfaceDep->Count; - for (size_t i=0; iCount; i++) - { - assert(pInterfaceDep->ppFXPointers != 0); - _Analysis_assume_(pInterfaceDep->ppFXPointers != 0); - SClassInstanceGlobalVariable* pCI = pInterfaceDep->ppFXPointers[i]->pClassInstance; - if( pCI ) - { - assert( pCI->pMemberData != 0 ); - _Analysis_assume_( pCI->pMemberData != 0 ); - pInterfaceDep->ppD3DObjects[i] = pCI->pMemberData->Data.pD3DClassInstance; - } - else - { - pInterfaceDep->ppD3DObjects[i] = nullptr; - } - } - } - - // Now set the shader - (m_pContext->*(pVT->pSetShader))(pBlock->pD3DObject, ppClassInstances, Interfaces); -} - -// Returns true if the block D3D data was recreated -bool CEffect::ApplyRenderStateBlock(_In_ SBaseBlock *pBlock) -{ - if( pBlock->IsUserManaged ) - { - return false; - } - - bool bRecreate = pBlock->ApplyAssignments(this); - - if (bRecreate) - { - switch (pBlock->BlockType) - { - case EBT_Sampler: - { - SSamplerBlock *pSBlock = pBlock->AsSampler(); - - assert(pSBlock->pD3DObject != 0); - _Analysis_assume_(pSBlock->pD3DObject != 0); - pSBlock->pD3DObject->Release(); - - HRESULT hr = m_pDevice->CreateSamplerState( &pSBlock->BackingStore.SamplerDesc, &pSBlock->pD3DObject ); - if ( SUCCEEDED(hr) ) - { - SetDebugObjectName(pSBlock->pD3DObject, "D3DX11Effect"); - } - } - break; - - case EBT_DepthStencil: - { - SDepthStencilBlock *pDSBlock = pBlock->AsDepthStencil(); - - assert(nullptr != pDSBlock->pDSObject); - SAFE_RELEASE( pDSBlock->pDSObject ); - if( SUCCEEDED( m_pDevice->CreateDepthStencilState( &pDSBlock->BackingStore, &pDSBlock->pDSObject ) ) ) - { - pDSBlock->IsValid = true; - SetDebugObjectName( pDSBlock->pDSObject, "D3DX11Effect" ); - } - else - pDSBlock->IsValid = false; - } - break; - - case EBT_Blend: - { - SBlendBlock *pBBlock = pBlock->AsBlend(); - - assert(nullptr != pBBlock->pBlendObject); - SAFE_RELEASE( pBBlock->pBlendObject ); - if( SUCCEEDED( m_pDevice->CreateBlendState( &pBBlock->BackingStore, &pBBlock->pBlendObject ) ) ) - { - pBBlock->IsValid = true; - SetDebugObjectName( pBBlock->pBlendObject, "D3DX11Effect" ); - } - else - pBBlock->IsValid = false; - } - break; - - case EBT_Rasterizer: - { - SRasterizerBlock *pRBlock = pBlock->AsRasterizer(); - - assert(nullptr != pRBlock->pRasterizerObject); - - SAFE_RELEASE( pRBlock->pRasterizerObject ); - if( SUCCEEDED( m_pDevice->CreateRasterizerState( &pRBlock->BackingStore, &pRBlock->pRasterizerObject ) ) ) - { - pRBlock->IsValid = true; - SetDebugObjectName( pRBlock->pRasterizerObject, "D3DX11Effect" ); - } - else - pRBlock->IsValid = false; - } - break; - - default: - assert(0); - } - } - - return bRecreate; -} - -void CEffect::ValidateIndex(_In_ uint32_t Elements) -{ - if (m_FXLIndex >= Elements) - { - DPF(0, "ID3DX11Effect: Overindexing variable array (size: %u, index: %u), using index = 0 instead", Elements, m_FXLIndex); - m_FXLIndex = 0; - } -} - -// Returns true if the assignment was changed -bool CEffect::EvaluateAssignment(_Inout_ SAssignment *pAssignment) -{ - bool bNeedUpdate = false; - SGlobalVariable *pVarDep0, *pVarDep1; - - switch (pAssignment->AssignmentType) - { - case ERAT_NumericVariable: - assert(pAssignment->DependencyCount == 1); - if (pAssignment->pDependencies[0].pVariable->LastModifiedTime >= pAssignment->LastRecomputedTime) - { - memcpy(pAssignment->Destination.pNumeric, pAssignment->Source.pNumeric, pAssignment->DataSize); - bNeedUpdate = true; - } - break; - - case ERAT_NumericVariableIndex: - assert(pAssignment->DependencyCount == 2); - pVarDep0 = pAssignment->pDependencies[0].pVariable; - pVarDep1 = pAssignment->pDependencies[1].pVariable; - - if (pVarDep0->LastModifiedTime >= pAssignment->LastRecomputedTime) - { - m_FXLIndex = *pVarDep0->Data.pNumericDword; - - ValidateIndex(pVarDep1->pType->Elements); - - // Array index variable is dirty, update the pointer - pAssignment->Source.pNumeric = pVarDep1->Data.pNumeric + pVarDep1->pType->Stride * m_FXLIndex; - - // Copy the new data - memcpy(pAssignment->Destination.pNumeric, pAssignment->Source.pNumeric, pAssignment->DataSize); - bNeedUpdate = true; - } - else if (pVarDep1->LastModifiedTime >= pAssignment->LastRecomputedTime) - { - // Only the array variable is dirty, copy the new data - memcpy(pAssignment->Destination.pNumeric, pAssignment->Source.pNumeric, pAssignment->DataSize); - bNeedUpdate = true; - } - break; - - case ERAT_ObjectVariableIndex: - assert(pAssignment->DependencyCount == 1); - pVarDep0 = pAssignment->pDependencies[0].pVariable; - if (pVarDep0->LastModifiedTime >= pAssignment->LastRecomputedTime) - { - m_FXLIndex = *pVarDep0->Data.pNumericDword; - ValidateIndex(pAssignment->MaxElements); - - // Array index variable is dirty, update the destination pointer - *((void **)pAssignment->Destination.pGeneric) = pAssignment->Source.pNumeric + - pAssignment->DataSize * m_FXLIndex; - bNeedUpdate = true; - } - break; - - default: - //case ERAT_Constant: -- These are consumed and discarded - //case ERAT_ObjectVariable: -- These are consumed and discarded - //case ERAT_ObjectConstIndex: -- These are consumed and discarded - //case ERAT_ObjectInlineShader: -- These are consumed and discarded - //case ERAT_NumericConstIndex: -- ERAT_NumericVariable should be generated instead - assert(0); - break; - } - - // Mark the assignment as not dirty - pAssignment->LastRecomputedTime = m_LocalTimer; - - return bNeedUpdate; -} - -// Returns false if this shader has interface dependencies which are nullptr (SetShader will fail). -bool CEffect::ValidateShaderBlock( _Inout_ SShaderBlock* pBlock ) -{ - if( !pBlock->IsValid ) - return false; - if( pBlock->InterfaceDepCount > 0 ) - { - assert( pBlock->InterfaceDepCount == 1 ); - for( size_t i=0; i < pBlock->pInterfaceDeps[0].Count; i++ ) - { - SInterface* pInterfaceDep = pBlock->pInterfaceDeps[0].ppFXPointers[i]; - assert( pInterfaceDep != 0 ); - _Analysis_assume_( pInterfaceDep != 0 ); - if( pInterfaceDep->pClassInstance == nullptr ) - { - return false; - } - } - } - return true; -} - -// Returns false if any state in the pass is invalid -bool CEffect::ValidatePassBlock( _Inout_ SPassBlock* pBlock ) -{ - pBlock->ApplyPassAssignments(); - - if (nullptr != pBlock->BackingStore.pBlendBlock) - { - ApplyRenderStateBlock(pBlock->BackingStore.pBlendBlock); - pBlock->BackingStore.pBlendState = pBlock->BackingStore.pBlendBlock->pBlendObject; - if( !pBlock->BackingStore.pBlendBlock->IsValid ) - return false; - } - - if( nullptr != pBlock->BackingStore.pDepthStencilBlock ) - { - ApplyRenderStateBlock( pBlock->BackingStore.pDepthStencilBlock ); - pBlock->BackingStore.pDepthStencilState = pBlock->BackingStore.pDepthStencilBlock->pDSObject; - if( !pBlock->BackingStore.pDepthStencilBlock->IsValid ) - return false; - } - - if( nullptr != pBlock->BackingStore.pRasterizerBlock ) - { - ApplyRenderStateBlock( pBlock->BackingStore.pRasterizerBlock ); - if( !pBlock->BackingStore.pRasterizerBlock->IsValid ) - return false; - } - - if( nullptr != pBlock->BackingStore.pVertexShaderBlock && !ValidateShaderBlock(pBlock->BackingStore.pVertexShaderBlock) ) - return false; - - if( nullptr != pBlock->BackingStore.pGeometryShaderBlock && !ValidateShaderBlock(pBlock->BackingStore.pGeometryShaderBlock) ) - return false; - - if( nullptr != pBlock->BackingStore.pPixelShaderBlock ) - { - if( !ValidateShaderBlock(pBlock->BackingStore.pPixelShaderBlock) ) - return false; - else if( pBlock->BackingStore.pPixelShaderBlock->UAVDepCount > 0 && - pBlock->BackingStore.RenderTargetViewCount > pBlock->BackingStore.pPixelShaderBlock->pUAVDeps[0].StartIndex ) - { - return false; - } - } - - if( nullptr != pBlock->BackingStore.pHullShaderBlock && !ValidateShaderBlock(pBlock->BackingStore.pHullShaderBlock) ) - return false; - - if( nullptr != pBlock->BackingStore.pDomainShaderBlock && !ValidateShaderBlock(pBlock->BackingStore.pDomainShaderBlock) ) - return false; - - if( nullptr != pBlock->BackingStore.pComputeShaderBlock && !ValidateShaderBlock(pBlock->BackingStore.pComputeShaderBlock) ) - return false; - - return true; -} - -// Set all state defined in the pass -void CEffect::ApplyPassBlock(_Inout_ SPassBlock *pBlock) -{ - pBlock->ApplyPassAssignments(); - - if (nullptr != pBlock->BackingStore.pBlendBlock) - { - ApplyRenderStateBlock(pBlock->BackingStore.pBlendBlock); -#ifdef FXDEBUG - if( !pBlock->BackingStore.pBlendBlock->IsValid ) - DPF( 0, "Pass::Apply - warning: applying invalid BlendState." ); -#endif - pBlock->BackingStore.pBlendState = pBlock->BackingStore.pBlendBlock->pBlendObject; - m_pContext->OMSetBlendState(pBlock->BackingStore.pBlendState, - pBlock->BackingStore.BlendFactor, - pBlock->BackingStore.SampleMask); - } - - if (nullptr != pBlock->BackingStore.pDepthStencilBlock) - { - ApplyRenderStateBlock(pBlock->BackingStore.pDepthStencilBlock); -#ifdef FXDEBUG - if( !pBlock->BackingStore.pDepthStencilBlock->IsValid ) - DPF( 0, "Pass::Apply - warning: applying invalid DepthStencilState." ); -#endif - pBlock->BackingStore.pDepthStencilState = pBlock->BackingStore.pDepthStencilBlock->pDSObject; - m_pContext->OMSetDepthStencilState(pBlock->BackingStore.pDepthStencilState, - pBlock->BackingStore.StencilRef); - } - - if (nullptr != pBlock->BackingStore.pRasterizerBlock) - { - ApplyRenderStateBlock(pBlock->BackingStore.pRasterizerBlock); -#ifdef FXDEBUG - if( !pBlock->BackingStore.pRasterizerBlock->IsValid ) - DPF( 0, "Pass::Apply - warning: applying invalid RasterizerState." ); -#endif - m_pContext->RSSetState(pBlock->BackingStore.pRasterizerBlock->pRasterizerObject); - } - - if (nullptr != pBlock->BackingStore.pRenderTargetViews[0]) - { - // Grab all render targets - ID3D11RenderTargetView *pRTV[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT]; - - assert(pBlock->BackingStore.RenderTargetViewCount <= D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT); - _Analysis_assume_(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT >= pBlock->BackingStore.RenderTargetViewCount); - - for (uint32_t i=0; iBackingStore.RenderTargetViewCount; i++) - { - pRTV[i] = pBlock->BackingStore.pRenderTargetViews[i]->pRenderTargetView; - } - - // This call could be combined with the call to set PS UAVs if both exist in the pass - m_pContext->OMSetRenderTargetsAndUnorderedAccessViews( pBlock->BackingStore.RenderTargetViewCount, pRTV, pBlock->BackingStore.pDepthStencilView->pDepthStencilView, 7, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, nullptr, nullptr ); - } - - if (nullptr != pBlock->BackingStore.pVertexShaderBlock) - { -#ifdef FXDEBUG - if( !pBlock->BackingStore.pVertexShaderBlock->IsValid ) - DPF( 0, "Pass::Apply - warning: applying invalid vertex shader." ); -#endif - ApplyShaderBlock(pBlock->BackingStore.pVertexShaderBlock); - } - - if (nullptr != pBlock->BackingStore.pPixelShaderBlock) - { -#ifdef FXDEBUG - if( !pBlock->BackingStore.pPixelShaderBlock->IsValid ) - DPF( 0, "Pass::Apply - warning: applying invalid pixel shader." ); -#endif - ApplyShaderBlock(pBlock->BackingStore.pPixelShaderBlock); - } - - if (nullptr != pBlock->BackingStore.pGeometryShaderBlock) - { -#ifdef FXDEBUG - if( !pBlock->BackingStore.pGeometryShaderBlock->IsValid ) - DPF( 0, "Pass::Apply - warning: applying invalid geometry shader." ); -#endif - ApplyShaderBlock(pBlock->BackingStore.pGeometryShaderBlock); - } - - if (nullptr != pBlock->BackingStore.pHullShaderBlock) - { -#ifdef FXDEBUG - if( !pBlock->BackingStore.pHullShaderBlock->IsValid ) - DPF( 0, "Pass::Apply - warning: applying invalid hull shader." ); -#endif - ApplyShaderBlock(pBlock->BackingStore.pHullShaderBlock); - } - - if (nullptr != pBlock->BackingStore.pDomainShaderBlock) - { -#ifdef FXDEBUG - if( !pBlock->BackingStore.pDomainShaderBlock->IsValid ) - DPF( 0, "Pass::Apply - warning: applying invalid domain shader." ); -#endif - ApplyShaderBlock(pBlock->BackingStore.pDomainShaderBlock); - } - - if (nullptr != pBlock->BackingStore.pComputeShaderBlock) - { -#ifdef FXDEBUG - if( !pBlock->BackingStore.pComputeShaderBlock->IsValid ) - DPF( 0, "Pass::Apply - warning: applying invalid compute shader." ); -#endif - ApplyShaderBlock(pBlock->BackingStore.pComputeShaderBlock); - } -} - -void CEffect::IncrementTimer() -{ - m_LocalTimer++; - -#ifndef _M_X64 -#if _DEBUG - if (m_LocalTimer > g_TimerRolloverCount) - { - DPF(0, "Rolling over timer (current time: %u, rollover cap: %u).", m_LocalTimer, g_TimerRolloverCount); -#else - if (m_LocalTimer >= 0x80000000) // check to see if we've exceeded ~2 billion - { -#endif - HandleLocalTimerRollover(); - - m_LocalTimer = 1; - } -#endif // _M_X64 -} - -// This function resets all timers, rendering all assignments dirty -// This is clearly bad for performance, but should only happen every few billion ticks -void CEffect::HandleLocalTimerRollover() -{ - uint32_t i, j, k; - - // step 1: update variables - for (i = 0; i < m_VariableCount; ++ i) - { - m_pVariables[i].LastModifiedTime = 0; - } - - // step 2: update assignments on all blocks (pass, depth stencil, rasterizer, blend, sampler) - for (uint32_t iGroup = 0; iGroup < m_GroupCount; ++ iGroup) - { - for (i = 0; i < m_pGroups[iGroup].TechniqueCount; ++ i) - { - for (j = 0; j < m_pGroups[iGroup].pTechniques[i].PassCount; ++ j) - { - for (k = 0; k < m_pGroups[iGroup].pTechniques[i].pPasses[j].AssignmentCount; ++ k) - { - m_pGroups[iGroup].pTechniques[i].pPasses[j].pAssignments[k].LastRecomputedTime = 0; - } - } - } - } - - for (i = 0; i < m_DepthStencilBlockCount; ++ i) - { - for (j = 0; j < m_pDepthStencilBlocks[i].AssignmentCount; ++ j) - { - m_pDepthStencilBlocks[i].pAssignments[j].LastRecomputedTime = 0; - } - } - - for (i = 0; i < m_RasterizerBlockCount; ++ i) - { - for (j = 0; j < m_pRasterizerBlocks[i].AssignmentCount; ++ j) - { - m_pRasterizerBlocks[i].pAssignments[j].LastRecomputedTime = 0; - } - } - - for (i = 0; i < m_BlendBlockCount; ++ i) - { - for (j = 0; j < m_pBlendBlocks[i].AssignmentCount; ++ j) - { - m_pBlendBlocks[i].pAssignments[j].LastRecomputedTime = 0; - } - } - - for (i = 0; i < m_SamplerBlockCount; ++ i) - { - for (j = 0; j < m_pSamplerBlocks[i].AssignmentCount; ++ j) - { - m_pSamplerBlocks[i].pAssignments[j].LastRecomputedTime = 0; - } - } -} - -} diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_DXSDK.sln kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_DXSDK.sln --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_DXSDK.sln 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_DXSDK.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Effects11", "Effects11_2010_DXSDK.vcxproj", "{DF460EAB-570D-4B50-9089-2E2FC801BF38}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Profile|Win32 = Profile|Win32 - Profile|x64 = Profile|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.ActiveCfg = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.Build.0 = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.ActiveCfg = Debug|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.Build.0 = Debug|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|Win32.ActiveCfg = Profile|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|Win32.Build.0 = Profile|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|x64.ActiveCfg = Profile|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|x64.Build.0 = Profile|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.ActiveCfg = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.Build.0 = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|x64.ActiveCfg = Release|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_DXSDK.vcxproj kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_DXSDK.vcxproj --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_DXSDK.vcxproj 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_DXSDK.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,412 +0,0 @@ - - - - -Debug -Win32 - - -Debug -x64 - - -Profile -Win32 - - -Profile -x64 - - -Release -Win32 - - -Release -x64 - - - -Effects11 -{DF460EAB-570D-4B50-9089-2E2FC801BF38} -Effects11 -Win32Proj - - - -StaticLibrary -Unicode - - -StaticLibrary -Unicode - - -StaticLibrary -true -Unicode - - -StaticLibrary -true -Unicode - - -StaticLibrary -true -Unicode - - -StaticLibrary -true -Unicode - - - - - - - - - - - - - - - - - - - - - - - - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Effects11 -$(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath) -$(DXSDK_DIR)Include;$(IncludePath) -$(DXSDK_DIR)Lib\x86;$(LibraryPath) - - - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Effects11 -$(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath) -$(DXSDK_DIR)Include;$(IncludePath) -$(DXSDK_DIR)Lib\x64;$(LibraryPath) - - - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Effects11 -$(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath) -$(DXSDK_DIR)Include;$(IncludePath) -$(DXSDK_DIR)Lib\x86;$(LibraryPath) - - - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Effects11 -$(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath) -$(DXSDK_DIR)Include;$(IncludePath) -$(DXSDK_DIR)Lib\x64;$(LibraryPath) - - - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Effects11 -$(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath) -$(DXSDK_DIR)Include;$(IncludePath) -$(DXSDK_DIR)Lib\x86;$(LibraryPath) - - - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Bin\Desktop_DXSDK\$(Platform)\$(Configuration)\ - Effects11 -$(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath) -$(DXSDK_DIR)Include;$(IncludePath) -$(DXSDK_DIR)Lib\x64;$(LibraryPath) - - - -Level4 -Disabled -MultiThreadedDebugDLL -false -true -Fast -StreamingSIMDExtensions2 -$(IntDir)$(TargetName).pdb -Sync -.\Binary;.\Inc;%(AdditionalIncludeDirectories) -pchfx.h - %(AdditionalOptions) -WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) -EditAndContinue -EnableFastChecks -Use - - - %(AdditionalOptions) -%(AdditionalDependencies) -Windows -true -true -true -true -MachineX86 -AsInvoker -%(DelayLoadDLLs) - - -false - - - - - - - - - - -Level4 -Disabled -MultiThreadedDebugDLL -false -true -Fast -$(IntDir)$(TargetName).pdb -Sync -.\Binary;.\Inc;%(AdditionalIncludeDirectories) -pchfx.h - %(AdditionalOptions) -WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) -EnableFastChecks -Use - - - %(AdditionalOptions) -%(AdditionalDependencies) -Windows -true -true -true -true -MachineX64 -AsInvoker -%(DelayLoadDLLs) - - -false - - - - - - - - - - -Level4 -MaxSpeed -MultiThreadedDLL -false -true -true -Fast -StreamingSIMDExtensions2 -$(IntDir)$(TargetName).pdb -Sync -.\Binary;.\Inc;%(AdditionalIncludeDirectories) -pchfx.h - %(AdditionalOptions) -WIN32;NDEBUG;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) -Use - - - %(AdditionalOptions) -%(AdditionalDependencies) -true -Windows -true -true -true -true -true -MachineX86 -AsInvoker -%(DelayLoadDLLs) - - -false - - - - - - - - - - -Level4 -MaxSpeed -MultiThreadedDLL -false -true -true -Fast -$(IntDir)$(TargetName).pdb -Sync -.\Binary;.\Inc;%(AdditionalIncludeDirectories) -pchfx.h - %(AdditionalOptions) -WIN32;NDEBUG;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) -Use - - - %(AdditionalOptions) -%(AdditionalDependencies) -true -Windows -true -true -true -true -true -MachineX64 -AsInvoker -%(DelayLoadDLLs) - - -false - - - - - - - - - - -Level4 -MaxSpeed -MultiThreadedDLL -false -true -true -Fast -StreamingSIMDExtensions2 -$(IntDir)$(TargetName).pdb -Sync -.\Binary;.\Inc;%(AdditionalIncludeDirectories) -pchfx.h - %(AdditionalOptions) -WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) -Use - - - %(AdditionalOptions) -%(AdditionalDependencies) -true -Windows -true -true -true -true -true -MachineX86 -AsInvoker -%(DelayLoadDLLs) - - -false - - - - - - - - - - -Level4 -MaxSpeed -MultiThreadedDLL -false -true -true -Fast -$(IntDir)$(TargetName).pdb -Sync -.\Binary;.\Inc;%(AdditionalIncludeDirectories) -pchfx.h - %(AdditionalOptions) -WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) -Use - - - %(AdditionalOptions) -%(AdditionalDependencies) -true -Windows -true -true -true -true -true -MachineX64 -AsInvoker -%(DelayLoadDLLs) - - -false - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_DXSDK.vcxproj.filters kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_DXSDK.vcxproj.filters --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_DXSDK.vcxproj.filters 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_DXSDK.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ - - - - -{8e114980-c1a3-4ada-ad7c-83caadf5daeb} -rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_SDK81.sln kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_SDK81.sln --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_SDK81.sln 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_SDK81.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Effects11", "Effects11_2010_SDK81.vcxproj", "{DF460EAB-570D-4B50-9089-2E2FC801BF38}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Profile|Win32 = Profile|Win32 - Profile|x64 = Profile|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.ActiveCfg = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.Build.0 = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.ActiveCfg = Debug|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.Build.0 = Debug|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|Win32.ActiveCfg = Profile|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|Win32.Build.0 = Profile|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|x64.ActiveCfg = Profile|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|x64.Build.0 = Profile|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.ActiveCfg = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.Build.0 = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|x64.ActiveCfg = Release|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_SDK81.vcxproj kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_SDK81.vcxproj --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_SDK81.vcxproj 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_SDK81.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,417 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Profile - Win32 - - - Profile - x64 - - - Release - Win32 - - - Release - x64 - - - - Effects11 - {DF460EAB-570D-4B50-9089-2E2FC801BF38} - Effects11 - Win32Proj - - - - StaticLibrary - Unicode - v100 - - - StaticLibrary - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Effects11 - - - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Effects11 - - - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Effects11 - - - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Effects11 - - - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Effects11 - - - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Bin\Desktop_2010\$(Platform)\$(Configuration)\ - Effects11 - - - - Level4 - Disabled - MultiThreadedDebugDLL - false - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) - EditAndContinue - EnableFastChecks - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - Windows - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - Disabled - MultiThreadedDebugDLL - false - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) - EnableFastChecks - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - Windows - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - WIN32;NDEBUG;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - WIN32;NDEBUG;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_SDK81.vcxproj.filters kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_SDK81.vcxproj.filters --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2010_SDK81.vcxproj.filters 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2010_SDK81.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ - - - - -{8e114980-c1a3-4ada-ad7c-83caadf5daeb} -rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2012.sln kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2012.sln --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2012.sln 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2012.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Effects11", "Effects11_2012.vcxproj", "{DF460EAB-570D-4B50-9089-2E2FC801BF38}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Profile|Win32 = Profile|Win32 - Profile|x64 = Profile|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.ActiveCfg = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.Build.0 = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.ActiveCfg = Debug|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.Build.0 = Debug|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|Win32.ActiveCfg = Profile|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|Win32.Build.0 = Profile|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|x64.ActiveCfg = Profile|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|x64.Build.0 = Profile|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.ActiveCfg = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.Build.0 = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|x64.ActiveCfg = Release|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2012.vcxproj kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2012.vcxproj --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2012.vcxproj 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2012.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,423 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Profile - Win32 - - - Profile - x64 - - - Release - Win32 - - - Release - x64 - - - - Effects11 - {DF460EAB-570D-4B50-9089-2E2FC801BF38} - Effects11 - Win32Proj - $(VCTargetsPath11) - - - - StaticLibrary - Unicode - v110 - - - StaticLibrary - Unicode - v110 - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - true - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Bin\Desktop_2012\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - - Level4 - Disabled - MultiThreadedDebugDLL - false - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - EditAndContinue - EnableFastChecks - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - Windows - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - Disabled - MultiThreadedDebugDLL - false - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - EnableFastChecks - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - Windows - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2012.vcxproj.filters kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2012.vcxproj.filters --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2012.vcxproj.filters 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2012.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ - - - - - {8e114980-c1a3-4ada-ad7c-83caadf5daeb} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2013.sln kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2013.sln --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2013.sln 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2013.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Effects11", "Effects11_2013.vcxproj", "{DF460EAB-570D-4B50-9089-2E2FC801BF38}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Profile|Win32 = Profile|Win32 - Profile|x64 = Profile|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.ActiveCfg = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.Build.0 = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.ActiveCfg = Debug|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.Build.0 = Debug|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|Win32.ActiveCfg = Profile|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|Win32.Build.0 = Profile|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|x64.ActiveCfg = Profile|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|x64.Build.0 = Profile|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.ActiveCfg = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.Build.0 = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|x64.ActiveCfg = Release|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2013.vcxproj kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2013.vcxproj --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2013.vcxproj 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2013.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,423 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Profile - Win32 - - - Profile - x64 - - - Release - Win32 - - - Release - x64 - - - - Effects11 - {DF460EAB-570D-4B50-9089-2E2FC801BF38} - Effects11 - Win32Proj - $(VCTargetsPath11) - - - - StaticLibrary - MultiByte - v120 - - - StaticLibrary - Unicode - v120 - - - StaticLibrary - false - Unicode - v120 - - - StaticLibrary - true - Unicode - v120 - - - StaticLibrary - true - Unicode - v120 - - - StaticLibrary - true - Unicode - v120 - - - - - - - - - - - - - - - - - - - - - - - - $(SolutionDir)libs\$(TargetName)\$(Configuration)\ - $(SolutionDir)objs\$(TargetName)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2013\$(Platform)\$(Configuration)\ - Bin\Desktop_2013\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - $(SolutionDir)libs\$(TargetName)\$(Configuration)\ - $(SolutionDir)objs\$(TargetName)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2013\$(Platform)\$(Configuration)\ - Bin\Desktop_2013\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - $(SolutionDir)libs\$(TargetName)\$(Configuration)\ - $(SolutionDir)objs\$(TargetName)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2013\$(Platform)\$(Configuration)\ - Bin\Desktop_2013\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - - Level4 - Disabled - MultiThreadedDebug - false - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;_HAS_ITERATOR_DEBUGGING=0;%(PreprocessorDefinitions) - ProgramDatabase - EnableFastChecks - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - Windows - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - Disabled - MultiThreadedDebugDLL - false - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - EnableFastChecks - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - Windows - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreaded - false - true - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2013.vcxproj.filters kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2013.vcxproj.filters --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2013.vcxproj.filters 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2013.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ - - - - - {8e114980-c1a3-4ada-ad7c-83caadf5daeb} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2015.sln kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2015.sln --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2015.sln 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2015.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Effects11", "Effects11_2015.vcxproj", "{DF460EAB-570D-4B50-9089-2E2FC801BF38}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Profile|Win32 = Profile|Win32 - Profile|x64 = Profile|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.ActiveCfg = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.Build.0 = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.ActiveCfg = Debug|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|x64.Build.0 = Debug|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|Win32.ActiveCfg = Profile|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|Win32.Build.0 = Profile|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|x64.ActiveCfg = Profile|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Profile|x64.Build.0 = Profile|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.ActiveCfg = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.Build.0 = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|x64.ActiveCfg = Release|x64 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2015.vcxproj kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2015.vcxproj --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2015.vcxproj 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2015.vcxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,422 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Profile - Win32 - - - Profile - x64 - - - Release - Win32 - - - Release - x64 - - - - Effects11 - {DF460EAB-570D-4B50-9089-2E2FC801BF38} - Effects11 - Win32Proj - - - - StaticLibrary - Unicode - v140 - - - StaticLibrary - Unicode - v140 - - - StaticLibrary - true - Unicode - v140 - - - StaticLibrary - true - Unicode - v140 - - - StaticLibrary - true - Unicode - v140 - - - StaticLibrary - true - Unicode - v140 - - - - - - - - - - - - - - - - - - - - - - - - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Bin\Desktop_2015\$(Platform)\$(Configuration)\ - Effects11 - AllRules.ruleset - - - - Level4 - Disabled - MultiThreadedDebugDLL - false - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - EditAndContinue - EnableFastChecks - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - Windows - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - Disabled - MultiThreadedDebugDLL - false - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - EnableFastChecks - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - Windows - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - StreamingSIMDExtensions2 - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX86 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - Level4 - MaxSpeed - MultiThreadedDLL - false - true - true - Fast - $(IntDir)$(TargetName).pdb - Sync - .\Binary;.\Inc;%(AdditionalIncludeDirectories) - pchfx.h - %(AdditionalOptions) - _WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) - Use - - - %(AdditionalOptions) - %(AdditionalDependencies) - true - Windows - true - true - true - true - true - MachineX64 - AsInvoker - %(DelayLoadDLLs) - - - false - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2015.vcxproj.filters kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2015.vcxproj.filters --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Effects11_2015.vcxproj.filters 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Effects11_2015.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ - - - - - {8e114980-c1a3-4ada-ad7c-83caadf5daeb} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectVariable.inl kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectVariable.inl --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/EffectVariable.inl 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/EffectVariable.inl 1970-01-01 00:00:00.000000000 +0000 @@ -1,4965 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: EffectVariable.inl -// -// Direct3D 11 Effects Variable reflection template -// These templates define the many Effect variable types. -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma warning(push) -#pragma warning(disable : 4127) - -////////////////////////////////////////////////////////////////////////// -// Invalid variable forward defines -////////////////////////////////////////////////////////////////////////// - -struct SEffectInvalidScalarVariable; -struct SEffectInvalidVectorVariable; -struct SEffectInvalidMatrixVariable; -struct SEffectInvalidStringVariable; -struct SEffectInvalidClassInstanceVariable; -struct SEffectInvalidInterfaceVariable; -struct SEffectInvalidShaderResourceVariable; -struct SEffectInvalidUnorderedAccessViewVariable; -struct SEffectInvalidRenderTargetViewVariable; -struct SEffectInvalidDepthStencilViewVariable; -struct SEffectInvalidConstantBuffer; -struct SEffectInvalidShaderVariable; -struct SEffectInvalidBlendVariable; -struct SEffectInvalidDepthStencilVariable; -struct SEffectInvalidRasterizerVariable; -struct SEffectInvalidSamplerVariable; -struct SEffectInvalidTechnique; -struct SEffectInvalidPass; -struct SEffectInvalidType; - -extern SEffectInvalidScalarVariable g_InvalidScalarVariable; -extern SEffectInvalidVectorVariable g_InvalidVectorVariable; -extern SEffectInvalidMatrixVariable g_InvalidMatrixVariable; -extern SEffectInvalidStringVariable g_InvalidStringVariable; -extern SEffectInvalidClassInstanceVariable g_InvalidClassInstanceVariable; -extern SEffectInvalidInterfaceVariable g_InvalidInterfaceVariable; -extern SEffectInvalidShaderResourceVariable g_InvalidShaderResourceVariable; -extern SEffectInvalidUnorderedAccessViewVariable g_InvalidUnorderedAccessViewVariable; -extern SEffectInvalidRenderTargetViewVariable g_InvalidRenderTargetViewVariable; -extern SEffectInvalidDepthStencilViewVariable g_InvalidDepthStencilViewVariable; -extern SEffectInvalidConstantBuffer g_InvalidConstantBuffer; -extern SEffectInvalidShaderVariable g_InvalidShaderVariable; -extern SEffectInvalidBlendVariable g_InvalidBlendVariable; -extern SEffectInvalidDepthStencilVariable g_InvalidDepthStencilVariable; -extern SEffectInvalidRasterizerVariable g_InvalidRasterizerVariable; -extern SEffectInvalidSamplerVariable g_InvalidSamplerVariable; -extern SEffectInvalidTechnique g_InvalidTechnique; -extern SEffectInvalidPass g_InvalidPass; -extern SEffectInvalidType g_InvalidType; - -enum ETemplateVarType -{ - ETVT_Bool, - ETVT_Int, - ETVT_Float, - ETVT_bool -}; - -////////////////////////////////////////////////////////////////////////// -// Invalid effect variable struct definitions -////////////////////////////////////////////////////////////////////////// - -struct SEffectInvalidType : public ID3DX11EffectType -{ - STDMETHOD_(bool, IsValid)() override { return false; } - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return &g_InvalidType; } - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(_In_z_ LPCSTR Name) override { UNREFERENCED_PARAMETER(Name); return &g_InvalidType; } - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(_In_z_ LPCSTR Semantic) override { UNREFERENCED_PARAMETER(Semantic); return &g_InvalidType; } - STDMETHOD_(LPCSTR, GetMemberName)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return nullptr; } - STDMETHOD_(LPCSTR, GetMemberSemantic)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return nullptr; } - IUNKNOWN_IMP(SEffectInvalidType, ID3DX11EffectType, IUnknown); -}; - -template -struct TEffectInvalidVariable : public IBaseInterface -{ -public: - STDMETHOD_(bool, IsValid)() override { return false; } - STDMETHOD_(ID3DX11EffectType*, GetType)() override { return &g_InvalidType; } - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return &g_InvalidScalarVariable; } - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override { UNREFERENCED_PARAMETER(Name); return &g_InvalidScalarVariable; } - - STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return &g_InvalidScalarVariable; } - STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(_In_z_ LPCSTR Name) override { UNREFERENCED_PARAMETER(Name); return &g_InvalidScalarVariable; } - STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(_In_z_ LPCSTR Semantic) override { UNREFERENCED_PARAMETER(Semantic); return &g_InvalidScalarVariable; } - - STDMETHOD_(ID3DX11EffectVariable*, GetElement)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return &g_InvalidScalarVariable; } - - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)() override { return &g_InvalidConstantBuffer; } - - STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)() override { return &g_InvalidScalarVariable; } - STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)() override { return &g_InvalidVectorVariable; } - STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)() override { return &g_InvalidMatrixVariable; } - STDMETHOD_(ID3DX11EffectStringVariable*, AsString)() override { return &g_InvalidStringVariable; } - STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)() override { return &g_InvalidClassInstanceVariable; } - STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)() override { return &g_InvalidInterfaceVariable; } - STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)() override { return &g_InvalidShaderResourceVariable; } - STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)() override { return &g_InvalidUnorderedAccessViewVariable; } - STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)() override { return &g_InvalidRenderTargetViewVariable; } - STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)() override { return &g_InvalidDepthStencilViewVariable; } - STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)() override { return &g_InvalidConstantBuffer; } - STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)() override { return &g_InvalidShaderVariable; } - STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)() override { return &g_InvalidBlendVariable; } - STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)() override { return &g_InvalidDepthStencilVariable; } - STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)() override { return &g_InvalidRasterizerVariable; } - STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)() override { return &g_InvalidSamplerVariable; } - - STDMETHOD(SetRawValue)(_In_reads_bytes_(Count) const void *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetRawValue)(_Out_writes_bytes_(Count) void *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } -}; - -struct SEffectInvalidScalarVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(SetFloat)(_In_ const float Value) override { UNREFERENCED_PARAMETER(Value); return E_FAIL; } - STDMETHOD(GetFloat)(_Out_ float *pValue) override { UNREFERENCED_PARAMETER(pValue); return E_FAIL; } - - STDMETHOD(SetFloatArray)(_In_reads_(Count) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetFloatArray)(_Out_writes_(Count) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - STDMETHOD(SetInt)(_In_ const int Value) override { UNREFERENCED_PARAMETER(Value); return E_FAIL; } - STDMETHOD(GetInt)(_Out_ int *pValue) override { UNREFERENCED_PARAMETER(pValue); return E_FAIL; } - - STDMETHOD(SetIntArray)(_In_reads_(Count) const int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetIntArray)(_Out_writes_(Count) int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - STDMETHOD(SetBool)(_In_ const bool Value) override { UNREFERENCED_PARAMETER(Value); return E_FAIL; } - STDMETHOD(GetBool)(_Out_ bool *pValue) override { UNREFERENCED_PARAMETER(pValue); return E_FAIL; } - - STDMETHOD(SetBoolArray)(_In_reads_(Count) const bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetBoolArray)(_Out_writes_(Count) bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidScalarVariable, ID3DX11EffectScalarVariable, ID3DX11EffectVariable); -}; - - -struct SEffectInvalidVectorVariable : public TEffectInvalidVariable -{ -public: - STDMETHOD(SetFloatVector)(_In_reads_(4) const float *pData) override { UNREFERENCED_PARAMETER(pData); return E_FAIL; }; - STDMETHOD(SetIntVector)(_In_reads_(4) const int *pData) override { UNREFERENCED_PARAMETER(pData); return E_FAIL; }; - STDMETHOD(SetBoolVector)(_In_reads_(4) const bool *pData) override { UNREFERENCED_PARAMETER(pData); return E_FAIL; }; - - STDMETHOD(GetFloatVector)(_Out_writes_(4) float *pData) override { UNREFERENCED_PARAMETER(pData); return E_FAIL; }; - STDMETHOD(GetIntVector)(_Out_writes_(4) int *pData) override { UNREFERENCED_PARAMETER(pData); return E_FAIL; }; - STDMETHOD(GetBoolVector)(_Out_writes_(4) bool *pData) override { UNREFERENCED_PARAMETER(pData); return E_FAIL; }; - - STDMETHOD(SetBoolVectorArray) (_In_reads_(4*Count) const bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; }; - STDMETHOD(SetIntVectorArray) (_In_reads_(4*Count) const int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; }; - STDMETHOD(SetFloatVectorArray)(_In_reads_(4*Count) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; }; - - STDMETHOD(GetBoolVectorArray) (_Out_writes_(4*Count) bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; }; - STDMETHOD(GetIntVectorArray) (_Out_writes_(4*Count) int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; }; - STDMETHOD(GetFloatVectorArray)(_Out_writes_(4*Count) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; }; - - IUNKNOWN_IMP(SEffectInvalidVectorVariable, ID3DX11EffectVectorVariable, ID3DX11EffectVariable); -}; - -struct SEffectInvalidMatrixVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(SetMatrix)(_In_reads_(16) const float *pData) override { UNREFERENCED_PARAMETER(pData); return E_FAIL; } - STDMETHOD(GetMatrix)(_Out_writes_(16) float *pData) override { UNREFERENCED_PARAMETER(pData); return E_FAIL; } - - STDMETHOD(SetMatrixArray)(_In_reads_(16*Count) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetMatrixArray)(_Out_writes_(16*Count) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - STDMETHOD(SetMatrixPointerArray)(_In_reads_(16*Count) const float **ppData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetMatrixPointerArray)(_Out_writes_(16*Count) float **ppData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - STDMETHOD(SetMatrixTranspose)(_In_reads_(16) const float *pData) override { UNREFERENCED_PARAMETER(pData); return E_FAIL; } - STDMETHOD(GetMatrixTranspose)(_Out_writes_(16) float *pData) override { UNREFERENCED_PARAMETER(pData); return E_FAIL; } - - STDMETHOD(SetMatrixTransposeArray)(_In_reads_(16*Count) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetMatrixTransposeArray)(_Out_writes_(16*Count) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - STDMETHOD(SetMatrixTransposePointerArray)(_In_reads_(16*Count) const float **ppData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetMatrixTransposePointerArray)(_Out_writes_(16*Count) float **ppData, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidMatrixVariable, ID3DX11EffectMatrixVariable, ID3DX11EffectVariable); -}; - -struct SEffectInvalidStringVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(GetString)(_Outptr_result_z_ LPCSTR *ppString) override { UNREFERENCED_PARAMETER(ppString); return E_FAIL; } - STDMETHOD(GetStringArray)(_Out_writes_(Count) LPCSTR *ppStrings, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppStrings); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidStringVariable, ID3DX11EffectStringVariable, ID3DX11EffectVariable); -}; - -struct SEffectInvalidClassInstanceVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(GetClassInstance)(_Outptr_ ID3D11ClassInstance **ppClassInstance) override { UNREFERENCED_PARAMETER(ppClassInstance); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidClassInstanceVariable, ID3DX11EffectClassInstanceVariable, ID3DX11EffectVariable); -}; - - -struct SEffectInvalidInterfaceVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(SetClassInstance)(_In_ ID3DX11EffectClassInstanceVariable *pEffectClassInstance) override - { UNREFERENCED_PARAMETER(pEffectClassInstance); return E_FAIL; } - STDMETHOD(GetClassInstance)(_Outptr_ ID3DX11EffectClassInstanceVariable **ppEffectClassInstance) override - { UNREFERENCED_PARAMETER(ppEffectClassInstance); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidInterfaceVariable, ID3DX11EffectInterfaceVariable, ID3DX11EffectVariable); -}; - - -struct SEffectInvalidShaderResourceVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(SetResource)(_In_ ID3D11ShaderResourceView *pResource) override { UNREFERENCED_PARAMETER(pResource); return E_FAIL; } - STDMETHOD(GetResource)(_Outptr_ ID3D11ShaderResourceView **ppResource) override { UNREFERENCED_PARAMETER(ppResource); return E_FAIL; } - - STDMETHOD(SetResourceArray)(_In_reads_(Count) ID3D11ShaderResourceView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppResources); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetResourceArray)(_Out_writes_(Count) ID3D11ShaderResourceView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppResources); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidShaderResourceVariable, ID3DX11EffectShaderResourceVariable, ID3DX11EffectVariable); -}; - - -struct SEffectInvalidUnorderedAccessViewVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(SetUnorderedAccessView)(_In_ ID3D11UnorderedAccessView *pResource) override { UNREFERENCED_PARAMETER(pResource); return E_FAIL; } - STDMETHOD(GetUnorderedAccessView)(_Outptr_ ID3D11UnorderedAccessView **ppResource) override { UNREFERENCED_PARAMETER(ppResource); return E_FAIL; } - - STDMETHOD(SetUnorderedAccessViewArray)(_In_reads_(Count) ID3D11UnorderedAccessView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppResources); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetUnorderedAccessViewArray)(_Out_writes_(Count) ID3D11UnorderedAccessView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppResources); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidUnorderedAccessViewVariable, ID3DX11EffectUnorderedAccessViewVariable, ID3DX11EffectVariable); -}; - - -struct SEffectInvalidRenderTargetViewVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(SetRenderTarget)(_In_ ID3D11RenderTargetView *pResource) override { UNREFERENCED_PARAMETER(pResource); return E_FAIL; } - STDMETHOD(GetRenderTarget)(_Outptr_ ID3D11RenderTargetView **ppResource) override { UNREFERENCED_PARAMETER(ppResource); return E_FAIL; } - - STDMETHOD(SetRenderTargetArray)(_In_reads_(Count) ID3D11RenderTargetView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppResources); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetRenderTargetArray)(_Out_writes_(Count) ID3D11RenderTargetView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppResources); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidRenderTargetViewVariable, ID3DX11EffectRenderTargetViewVariable, ID3DX11EffectVariable); -}; - - -struct SEffectInvalidDepthStencilViewVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(SetDepthStencil)(_In_ ID3D11DepthStencilView *pResource) override { UNREFERENCED_PARAMETER(pResource); return E_FAIL; } - STDMETHOD(GetDepthStencil)(_Outptr_ ID3D11DepthStencilView **ppResource) override { UNREFERENCED_PARAMETER(ppResource); return E_FAIL; } - - STDMETHOD(SetDepthStencilArray)(_In_reads_(Count) ID3D11DepthStencilView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppResources); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - STDMETHOD(GetDepthStencilArray)(_Out_writes_(Count) ID3D11DepthStencilView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override - { UNREFERENCED_PARAMETER(ppResources); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidDepthStencilViewVariable, ID3DX11EffectDepthStencilViewVariable, ID3DX11EffectVariable); -}; - - -struct SEffectInvalidConstantBuffer : public TEffectInvalidVariable -{ -public: - - STDMETHOD(SetConstantBuffer)(_In_ ID3D11Buffer *pConstantBuffer) override { UNREFERENCED_PARAMETER(pConstantBuffer); return E_FAIL; } - STDMETHOD(GetConstantBuffer)(_Outptr_ ID3D11Buffer **ppConstantBuffer) override { UNREFERENCED_PARAMETER(ppConstantBuffer); return E_FAIL; } - STDMETHOD(UndoSetConstantBuffer)() override { return E_FAIL; } - - STDMETHOD(SetTextureBuffer)(_In_ ID3D11ShaderResourceView *pTextureBuffer) override { UNREFERENCED_PARAMETER(pTextureBuffer); return E_FAIL; } - STDMETHOD(GetTextureBuffer)(_Outptr_ ID3D11ShaderResourceView **ppTextureBuffer) override { UNREFERENCED_PARAMETER(ppTextureBuffer); return E_FAIL; } - STDMETHOD(UndoSetTextureBuffer)() override { return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidConstantBuffer, ID3DX11EffectConstantBuffer, ID3DX11EffectVariable); -}; - -struct SEffectInvalidShaderVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(GetShaderDesc)(_In_ uint32_t ShaderIndex, _Out_ D3DX11_EFFECT_SHADER_DESC *pDesc) override - { UNREFERENCED_PARAMETER(ShaderIndex); UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - STDMETHOD(GetVertexShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11VertexShader **ppVS) override - { UNREFERENCED_PARAMETER(ShaderIndex); UNREFERENCED_PARAMETER(ppVS); return E_FAIL; } - STDMETHOD(GetGeometryShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11GeometryShader **ppGS) override - { UNREFERENCED_PARAMETER(ShaderIndex); UNREFERENCED_PARAMETER(ppGS); return E_FAIL; } - STDMETHOD(GetPixelShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11PixelShader **ppPS) override - { UNREFERENCED_PARAMETER(ShaderIndex); UNREFERENCED_PARAMETER(ppPS); return E_FAIL; } - STDMETHOD(GetHullShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11HullShader **ppHS) override - { UNREFERENCED_PARAMETER(ShaderIndex); UNREFERENCED_PARAMETER(ppHS); return E_FAIL; } - STDMETHOD(GetDomainShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11DomainShader **ppDS) override - { UNREFERENCED_PARAMETER(ShaderIndex); UNREFERENCED_PARAMETER(ppDS); return E_FAIL; } - STDMETHOD(GetComputeShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11ComputeShader **ppCS) override - { UNREFERENCED_PARAMETER(ShaderIndex); UNREFERENCED_PARAMETER(ppCS); return E_FAIL; } - - STDMETHOD(GetInputSignatureElementDesc)(_In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) override - { UNREFERENCED_PARAMETER(ShaderIndex); UNREFERENCED_PARAMETER(Element); UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - STDMETHOD(GetOutputSignatureElementDesc)(_In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) override - { UNREFERENCED_PARAMETER(ShaderIndex); UNREFERENCED_PARAMETER(Element); UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - STDMETHOD(GetPatchConstantSignatureElementDesc)(_In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) override - { UNREFERENCED_PARAMETER(ShaderIndex); UNREFERENCED_PARAMETER(Element); UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidShaderVariable, ID3DX11EffectShaderVariable, ID3DX11EffectVariable); -}; - -struct SEffectInvalidBlendVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(GetBlendState)(_In_ uint32_t Index, _Outptr_ ID3D11BlendState **ppState) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(ppState); return E_FAIL; } - STDMETHOD(SetBlendState)(_In_ uint32_t Index, _In_ ID3D11BlendState *pState) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(pState); return E_FAIL; } - STDMETHOD(UndoSetBlendState)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return E_FAIL; } - STDMETHOD(GetBackingStore)(_In_ uint32_t Index, _Out_ D3D11_BLEND_DESC *pDesc) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidBlendVariable, ID3DX11EffectBlendVariable, ID3DX11EffectVariable); -}; - -struct SEffectInvalidDepthStencilVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(GetDepthStencilState)(_In_ uint32_t Index, _Outptr_ ID3D11DepthStencilState **ppState) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(ppState); return E_FAIL; } - STDMETHOD(SetDepthStencilState)(_In_ uint32_t Index, _In_ ID3D11DepthStencilState *pState) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(pState); return E_FAIL; } - STDMETHOD(UndoSetDepthStencilState)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return E_FAIL; } - STDMETHOD(GetBackingStore)(_In_ uint32_t Index, _Out_ D3D11_DEPTH_STENCIL_DESC *pDesc) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidDepthStencilVariable, ID3DX11EffectDepthStencilVariable, ID3DX11EffectVariable); -}; - -struct SEffectInvalidRasterizerVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(GetRasterizerState)(_In_ uint32_t Index, _Outptr_ ID3D11RasterizerState **ppState) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(ppState); return E_FAIL; } - STDMETHOD(SetRasterizerState)(_In_ uint32_t Index, _In_ ID3D11RasterizerState *pState) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(pState); return E_FAIL; } - STDMETHOD(UndoSetRasterizerState)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return E_FAIL; } - STDMETHOD(GetBackingStore)(_In_ uint32_t Index, _Out_ D3D11_RASTERIZER_DESC *pDesc) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidRasterizerVariable, ID3DX11EffectRasterizerVariable, ID3DX11EffectVariable); -}; - -struct SEffectInvalidSamplerVariable : public TEffectInvalidVariable -{ -public: - - STDMETHOD(GetSampler)(_In_ uint32_t Index, _Outptr_ ID3D11SamplerState **ppSampler) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(ppSampler); return E_FAIL; } - STDMETHOD(SetSampler)(_In_ uint32_t Index, _In_ ID3D11SamplerState *pSampler) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(pSampler); return E_FAIL; } - STDMETHOD(UndoSetSampler)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return E_FAIL; } - STDMETHOD(GetBackingStore)(_In_ uint32_t Index, _Out_ D3D11_SAMPLER_DESC *pDesc) override - { UNREFERENCED_PARAMETER(Index); UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidSamplerVariable, ID3DX11EffectSamplerVariable, ID3DX11EffectVariable); -}; - -struct SEffectInvalidPass : public ID3DX11EffectPass -{ -public: - STDMETHOD_(bool, IsValid)() override { return false; } - STDMETHOD(GetDesc)(_Out_ D3DX11_PASS_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - STDMETHOD(GetVertexShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - STDMETHOD(GetGeometryShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - STDMETHOD(GetPixelShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - STDMETHOD(GetHullShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - STDMETHOD(GetDomainShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - STDMETHOD(GetComputeShaderDesc)(_Out_ D3DX11_PASS_SHADER_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return &g_InvalidScalarVariable; } - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override { UNREFERENCED_PARAMETER(Name); return &g_InvalidScalarVariable; } - - STDMETHOD(Apply)(_In_ uint32_t Flags, _In_ ID3D11DeviceContext* pContext) override - { UNREFERENCED_PARAMETER(Flags); UNREFERENCED_PARAMETER(pContext); return E_FAIL; } - STDMETHOD(ComputeStateBlockMask)(_Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) override { UNREFERENCED_PARAMETER(pStateBlockMask); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidPass, ID3DX11EffectPass, IUnknown); -}; - -struct SEffectInvalidTechnique : public ID3DX11EffectTechnique -{ -public: - STDMETHOD_(bool, IsValid)() override { return false; } - STDMETHOD(GetDesc)(_Out_ D3DX11_TECHNIQUE_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return &g_InvalidScalarVariable; } - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override { UNREFERENCED_PARAMETER(Name); return &g_InvalidScalarVariable; } - - STDMETHOD_(ID3DX11EffectPass*, GetPassByIndex)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return &g_InvalidPass; } - STDMETHOD_(ID3DX11EffectPass*, GetPassByName)(_In_z_ LPCSTR Name) override { UNREFERENCED_PARAMETER(Name); return &g_InvalidPass; } - - STDMETHOD(ComputeStateBlockMask)(_Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) override { UNREFERENCED_PARAMETER(pStateBlockMask); return E_FAIL; } - - IUNKNOWN_IMP(SEffectInvalidTechnique, ID3DX11EffectTechnique, IUnknown); -}; - -struct SEffectInvalidGroup : public ID3DX11EffectGroup -{ -public: - STDMETHOD_(bool, IsValid)() override { return false; } - STDMETHOD(GetDesc)(_Out_ D3DX11_GROUP_DESC *pDesc) override { UNREFERENCED_PARAMETER(pDesc); return E_FAIL; } - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return &g_InvalidScalarVariable; } - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override { UNREFERENCED_PARAMETER(Name); return &g_InvalidScalarVariable; } - - STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByIndex)(_In_ uint32_t Index) override { UNREFERENCED_PARAMETER(Index); return &g_InvalidTechnique; } - STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByName)(_In_z_ LPCSTR Name) override { UNREFERENCED_PARAMETER(Name); return &g_InvalidTechnique; } - - IUNKNOWN_IMP(SEffectInvalidGroup, ID3DX11EffectGroup, IUnknown); -}; - -////////////////////////////////////////////////////////////////////////// -// Helper routines -////////////////////////////////////////////////////////////////////////// - -// This is an annoying warning that pops up in retail builds because -// the code that jumps to "lExit" is conditionally not compiled. -// The only alternative is more #ifdefs in every function -#pragma warning( disable : 4102 ) // 'label' : unreferenced label - -#define VERIFYPARAMETER(x) \ -{ if (!(x)) { DPF(0, "%s: Parameter " #x " was nullptr.", pFuncName); \ - __BREAK_ON_FAIL; hr = E_INVALIDARG; goto lExit; } } - -static HRESULT AnnotationInvalidSetCall(LPCSTR pFuncName) -{ - DPF(0, "%s: Annotations are readonly", pFuncName); - return D3DERR_INVALIDCALL; -} - -static HRESULT ObjectSetRawValue() -{ - DPF(0, "ID3DX11EffectVariable::SetRawValue: Objects do not support ths call; please use the specific object accessors instead."); - return D3DERR_INVALIDCALL; -} - -static HRESULT ObjectGetRawValue() -{ - DPF(0, "ID3DX11EffectVariable::GetRawValue: Objects do not support ths call; please use the specific object accessors instead."); - return D3DERR_INVALIDCALL; -} - -ID3DX11EffectConstantBuffer * NoParentCB(); - -ID3DX11EffectVariable * GetAnnotationByIndexHelper(_In_z_ const char *pClassName, _In_ uint32_t Index, - _In_ uint32_t AnnotationCount, _In_reads_(AnnotationCount) SAnnotation *pAnnotations); - -ID3DX11EffectVariable * GetAnnotationByNameHelper(_In_z_ const char *pClassName, _In_z_ LPCSTR Name, - _In_ uint32_t AnnotationCount, _In_reads_(AnnotationCount) SAnnotation *pAnnotations); - -template -_Success_(return) -bool GetVariableByIndexHelper(_In_ uint32_t Index, _In_ uint32_t VariableCount, _In_reads_(VariableCount) SVarType *pVariables, - _In_opt_ uint8_t *pBaseAddress, _Outptr_ SVarType **ppMember, _Outptr_ void **ppDataPtr) -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetMemberByIndex"; - - if (Index >= VariableCount) - { - DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, VariableCount); - return false; - } - - *ppMember = pVariables + Index; - *ppDataPtr = pBaseAddress + (*ppMember)->Data.Offset; - return true; -} - -template -_Success_(return) -bool GetVariableByNameHelper(_In_z_ LPCSTR Name, _In_ uint32_t VariableCount, _In_reads_(VariableCount) SVarType *pVariables, - _In_opt_ uint8_t *pBaseAddress, _Outptr_ SVarType **ppMember, _Outptr_ void **ppDataPtr, _Out_ uint32_t* pIndex) -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetMemberByName"; - - if (nullptr == Name) - { - DPF(0, "%s: Parameter Name was nullptr.", pFuncName); - return false; - } - - bool bHasSuper = false; - - for (uint32_t i = 0; i < VariableCount; ++ i) - { - *ppMember = pVariables + i; - assert((*ppMember)->pName != 0); - _Analysis_assume_((*ppMember)->pName != 0); - if (strcmp((*ppMember)->pName, Name) == 0) - { - *ppDataPtr = pBaseAddress + (*ppMember)->Data.Offset; - *pIndex = i; - return true; - } - else if (i == 0 && - (*ppMember)->pName[0] == '$' && - strcmp((*ppMember)->pName, "$super") == 0) - { - bHasSuper = true; - } - } - - if (bHasSuper) - { - SVarType* pSuper = pVariables; - - return GetVariableByNameHelper(Name, - pSuper->pType->StructType.Members, - (SVarType*)pSuper->pType->StructType.pMembers, - pBaseAddress + pSuper->Data.Offset, - ppMember, - ppDataPtr, - pIndex); - } - - DPF(0, "%s: Variable [%s] not found", pFuncName, Name); - return false; -} - -template -_Success_(return) -bool GetVariableBySemanticHelper(_In_z_ LPCSTR Semantic, _In_ uint32_t VariableCount, _In_reads_(VariableCount) SVarType *pVariables, - _In_opt_ uint8_t *pBaseAddress, _Outptr_ SVarType **ppMember, _Outptr_ void **ppDataPtr, _Out_ uint32_t* pIndex) -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetMemberBySemantic"; - - if (nullptr == Semantic) - { - DPF(0, "%s: Parameter Semantic was nullptr.", pFuncName); - return false; - } - - for (uint32_t i = 0; i < VariableCount; ++ i) - { - *ppMember = pVariables + i; - if (nullptr != (*ppMember)->pSemantic && - _stricmp((*ppMember)->pSemantic, Semantic) == 0) - { - *ppDataPtr = pBaseAddress + (*ppMember)->Data.Offset; - *pIndex = i; - return true; - } - } - - DPF(0, "%s: Variable with semantic [%s] not found", pFuncName, Semantic); - return false; -} - -inline bool AreBoundsValid(_In_ uint32_t Offset, _In_ uint32_t Count, _In_ const void *pData, _In_ const SType *pType, _In_ uint32_t TotalUnpackedSize) -{ - if (Count == 0) return true; - uint32_t singleElementSize = pType->GetTotalUnpackedSize(true); - assert(singleElementSize <= pType->Stride); - - return ((Offset + Count >= Offset) && - ((Offset + Count) < ((uint32_t)-1) / pType->Stride) && - (Count * pType->Stride + (uint8_t*)pData >= (uint8_t*)pData) && - ((Offset + Count - 1) * pType->Stride + singleElementSize <= TotalUnpackedSize)); -} - -// Note that the branches in this code is based on template parameters and will be compiled out -template -__forceinline HRESULT CopyScalarValue(_In_ SRC_TYPE SrcValue, _Out_ void *pDest, _In_z_ const char *pFuncName) -{ - HRESULT hr = S_OK; -#ifdef _DEBUG - if (ValidatePtr) - VERIFYPARAMETER(pDest); -#else - UNREFERENCED_PARAMETER(pFuncName); -#endif - - switch (SourceType) - { - case ETVT_Bool: - switch (DestType) - { - case ETVT_Bool: - *(int*)pDest = (SrcValue != 0) ? -1 : 0; - break; - - case ETVT_Int: - *(int*)pDest = SrcValue ? 1 : 0; - break; - - case ETVT_Float: - *(float*)pDest = SrcValue ? 1.0f : 0.0f; - break; - - case ETVT_bool: - *(bool*)pDest = (SrcValue != 0) ? true : false; - break; - - default: - assert(0); - } - break; - - case ETVT_Int: - switch (DestType) - { - case ETVT_Bool: - *(int*)pDest = (SrcValue != 0) ? -1 : 0; - break; - - case ETVT_Int: - *(int*)pDest = (int) SrcValue; - break; - - case ETVT_Float: - *(float*)pDest = (float)(SrcValue); - break; - - case ETVT_bool: - *(bool*)pDest = (SrcValue != 0) ? true : false; - break; - - default: - assert(0); - } - break; - - case ETVT_Float: - switch (DestType) - { - case ETVT_Bool: - *(int*)pDest = (SrcValue != 0.0f) ? -1 : 0; - break; - - case ETVT_Int: - *(int*)pDest = (int) (SrcValue); - break; - - case ETVT_Float: - *(float*)pDest = (float) SrcValue; - break; - - case ETVT_bool: - *(bool*)pDest = (SrcValue != 0.0f) ? true : false; - break; - - default: - assert(0); - } - break; - - case ETVT_bool: - switch (DestType) - { - case ETVT_Bool: - *(int*)pDest = SrcValue ? -1 : 0; - break; - - case ETVT_Int: - *(int*)pDest = SrcValue ? 1 : 0; - break; - - case ETVT_Float: - *(float*)pDest = SrcValue ? 1.0f : 0.0f; - break; - - case ETVT_bool: - *(bool*)pDest = (SrcValue != 0) ? true : false; - break; - - default: - assert(0); - } - break; - - default: - assert(0); - } - -lExit: - return hr; -} - -#pragma warning(push) -#pragma warning( disable : 6103 ) -template -inline HRESULT SetScalarArray(_In_reads_(Count) const SRC_TYPE *pSrcValues, _Out_writes_(Count) DEST_TYPE *pDestValues, - _In_ uint32_t Offset, _In_ uint32_t Count, - _In_ const SType *pType, _In_ uint32_t TotalUnpackedSize, _In_z_ const char *pFuncName) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - VERIFYPARAMETER(pSrcValues); - -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pSrcValues, pType, TotalUnpackedSize)) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#else - UNREFERENCED_PARAMETER(TotalUnpackedSize); - UNREFERENCED_PARAMETER(pFuncName); -#endif - - uint32_t i, j, delta = pType->NumericType.IsPackedArray ? 1 : SType::c_ScalarsPerRegister; - pDestValues += Offset * delta; - for (i = 0, j = 0; j < Count; i += delta, ++ j) - { - // pDestValues[i] = (DEST_TYPE)pSrcValues[j]; - CopyScalarValue(pSrcValues[j], &pDestValues[i], "SetScalarArray"); - } - -lExit: - return hr; -} -#pragma warning(pop) - -#pragma warning( disable : 6103 ) -template -inline HRESULT GetScalarArray(_In_reads_(Count) SRC_TYPE *pSrcValues, _Out_writes_(Count) DEST_TYPE *pDestValues, - _In_ uint32_t Offset, _In_ uint32_t Count, - _In_ const SType *pType, _In_ uint32_t TotalUnpackedSize, _In_z_ const char *pFuncName) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - VERIFYPARAMETER(pDestValues); - -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pDestValues, pType, TotalUnpackedSize)) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#else - UNREFERENCED_PARAMETER(TotalUnpackedSize); - UNREFERENCED_PARAMETER(pFuncName); -#endif - - uint32_t i, j, delta = pType->NumericType.IsPackedArray ? 1 : SType::c_ScalarsPerRegister; - pSrcValues += Offset * delta; - for (i = 0, j = 0; j < Count; i += delta, ++ j) - { - // pDestValues[j] = (DEST_TYPE)pSrcValues[i]; - CopyScalarValue(pSrcValues[i], &pDestValues[j], "GetScalarArray"); - } - -lExit: - return hr; -} - - -////////////////////////////////////////////////////////////////////////// -// TVariable - implements type casting and member/element retrieval -////////////////////////////////////////////////////////////////////////// - -// requires that IBaseInterface contain SVariable's fields and support ID3DX11EffectVariable -template -struct TVariable : public IBaseInterface -{ - STDMETHOD_(bool, IsValid)() override { return true; } - - STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(_In_ uint32_t Index) - { - SVariable *pMember; - UDataPointer dataPtr; - TTopLevelVariable *pTopLevelEntity2 = GetTopLevelEntity(); - - if (((ID3DX11Effect*)pTopLevelEntity2->pEffect)->IsOptimized()) - { - DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Cannot get members; effect has been Optimize()'ed"); - return &g_InvalidScalarVariable; - } - - if (pType->VarType != EVT_Struct) - { - DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Variable is not a structure"); - return &g_InvalidScalarVariable; - } - - if (!GetVariableByIndexHelper(Index, pType->StructType.Members, pType->StructType.pMembers, - Data.pNumeric, &pMember, &dataPtr.pGeneric)) - { - return &g_InvalidScalarVariable; - } - - return pTopLevelEntity2->pEffect->CreatePooledVariableMemberInterface(pTopLevelEntity2, pMember, dataPtr, false, Index); - } - - STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(_In_z_ LPCSTR Name) - { - SVariable *pMember; - UDataPointer dataPtr; - uint32_t index; - TTopLevelVariable *pTopLevelEntity2 = GetTopLevelEntity(); - - if (pTopLevelEntity2->pEffect->IsOptimized()) - { - DPF(0, "ID3DX11EffectVariable::GetMemberByName: Cannot get members; effect has been Optimize()'ed"); - return &g_InvalidScalarVariable; - } - - if (pType->VarType != EVT_Struct) - { - DPF(0, "ID3DX11EffectVariable::GetMemberByName: Variable is not a structure"); - return &g_InvalidScalarVariable; - } - - if (!GetVariableByNameHelper(Name, pType->StructType.Members, pType->StructType.pMembers, - Data.pNumeric, &pMember, &dataPtr.pGeneric, &index)) - { - return &g_InvalidScalarVariable; - - } - - return pTopLevelEntity2->pEffect->CreatePooledVariableMemberInterface(pTopLevelEntity2, pMember, dataPtr, false, index); - } - - STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(_In_z_ LPCSTR Semantic) - { - SVariable *pMember; - UDataPointer dataPtr; - uint32_t index; - TTopLevelVariable *pTopLevelEntity2 = GetTopLevelEntity(); - - if (pTopLevelEntity2->pEffect->IsOptimized()) - { - DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Cannot get members; effect has been Optimize()'ed"); - return &g_InvalidScalarVariable; - } - - if (pType->VarType != EVT_Struct) - { - DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Variable is not a structure"); - return &g_InvalidScalarVariable; - } - - if (!GetVariableBySemanticHelper(Semantic, pType->StructType.Members, pType->StructType.pMembers, - Data.pNumeric, &pMember, &dataPtr.pGeneric, &index)) - { - return &g_InvalidScalarVariable; - - } - - return pTopLevelEntity2->pEffect->CreatePooledVariableMemberInterface(pTopLevelEntity2, pMember, dataPtr, false, index); - } - - STDMETHOD_(ID3DX11EffectVariable*, GetElement)(_In_ uint32_t Index) - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetElement"; - TTopLevelVariable *pTopLevelEntity2 = GetTopLevelEntity(); - UDataPointer dataPtr; - - if (pTopLevelEntity2->pEffect->IsOptimized()) - { - DPF(0, "ID3DX11EffectVariable::GetElement: Cannot get element; effect has been Optimize()'ed"); - return &g_InvalidScalarVariable; - } - - if (!IsArray()) - { - DPF(0, "%s: This interface does not refer to an array", pFuncName); - return &g_InvalidScalarVariable; - } - - if (Index >= pType->Elements) - { - DPF(0, "%s: Invalid element index (%u, total: %u)", pFuncName, Index, pType->Elements); - return &g_InvalidScalarVariable; - } - - if (pType->BelongsInConstantBuffer()) - { - dataPtr.pGeneric = Data.pNumeric + pType->Stride * Index; - } - else - { - dataPtr.pGeneric = GetBlockByIndex(pType->VarType, pType->ObjectType, Data.pGeneric, Index); - if (nullptr == dataPtr.pGeneric) - { - DPF(0, "%s: Internal error", pFuncName); - return &g_InvalidScalarVariable; - } - } - - return pTopLevelEntity2->pEffect->CreatePooledVariableMemberInterface(pTopLevelEntity2, (SVariable *) this, dataPtr, true, Index); - } - - STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsScalar"; - - if (pType->VarType != EVT_Numeric || - pType->NumericType.NumericLayout != ENL_Scalar) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidScalarVariable; - } - - return (ID3DX11EffectScalarVariable *) this; - } - - STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsVector"; - - if (pType->VarType != EVT_Numeric || - pType->NumericType.NumericLayout != ENL_Vector) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidVectorVariable; - } - - return (ID3DX11EffectVectorVariable *) this; - } - - STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsMatrix"; - - if (pType->VarType != EVT_Numeric || - pType->NumericType.NumericLayout != ENL_Matrix) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidMatrixVariable; - } - - return (ID3DX11EffectMatrixVariable *) this; - } - - STDMETHOD_(ID3DX11EffectStringVariable*, AsString)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsString"; - - if (!pType->IsObjectType(EOT_String)) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidStringVariable; - } - - return (ID3DX11EffectStringVariable *) this; - } - - STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsClassInstance"; - - if (!pType->IsClassInstance() ) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidClassInstanceVariable; - } - else if( pMemberData == nullptr ) - { - DPF(0, "%s: Non-global class instance variables (members of structs or classes) and class instances " - "inside tbuffers are not supported.", pFuncName ); - return &g_InvalidClassInstanceVariable; - } - - return (ID3DX11EffectClassInstanceVariable *) this; - } - - STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsInterface"; - - if (!pType->IsInterface()) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidInterfaceVariable; - } - - return (ID3DX11EffectInterfaceVariable *) this; - } - - STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsShaderResource"; - - if (!pType->IsShaderResource()) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidShaderResourceVariable; - } - - return (ID3DX11EffectShaderResourceVariable *) this; - } - - STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsUnorderedAccessView"; - - if (!pType->IsUnorderedAccessView()) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidUnorderedAccessViewVariable; - } - - return (ID3DX11EffectUnorderedAccessViewVariable *) this; - } - - STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsRenderTargetView"; - - if (!pType->IsRenderTargetView()) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidRenderTargetViewVariable; - } - - return (ID3DX11EffectRenderTargetViewVariable *) this; - } - - STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsDepthStencilView"; - - if (!pType->IsDepthStencilView()) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidDepthStencilViewVariable; - } - - return (ID3DX11EffectDepthStencilViewVariable *) this; - } - - STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsConstantBuffer"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidConstantBuffer; - } - - STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsShader"; - - if (!pType->IsShader()) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidShaderVariable; - } - - return (ID3DX11EffectShaderVariable *) this; - } - - STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsBlend"; - - if (!pType->IsObjectType(EOT_Blend)) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidBlendVariable; - } - - return (ID3DX11EffectBlendVariable *) this; - } - - STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsDepthStencil"; - - if (!pType->IsObjectType(EOT_DepthStencil)) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidDepthStencilVariable; - } - - return (ID3DX11EffectDepthStencilVariable *) this; - } - - STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsRasterizer"; - - if (!pType->IsObjectType(EOT_Rasterizer)) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidRasterizerVariable; - } - - return (ID3DX11EffectRasterizerVariable *) this; - } - - STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)() - { - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsSampler"; - - if (!pType->IsSampler()) - { - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidSamplerVariable; - } - - return (ID3DX11EffectSamplerVariable *) this; - } - - // Numeric variables should override this - STDMETHOD(SetRawValue)(_In_reads_bytes_(Count) const void *pData, _In_ uint32_t Offset, _In_ uint32_t Count) - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return ObjectSetRawValue(); } - STDMETHOD(GetRawValue)(_Out_writes_(Count) void *pData, _In_ uint32_t Offset, _In_ uint32_t Count) - { UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(Offset); UNREFERENCED_PARAMETER(Count); return ObjectGetRawValue(); } -}; - -////////////////////////////////////////////////////////////////////////// -// TTopLevelVariable - functionality for annotations and global variables -////////////////////////////////////////////////////////////////////////// - -template -struct TTopLevelVariable : public SVariable, public IBaseInterface -{ - // Required to create member/element variable interfaces - CEffect *pEffect; - - CEffect* GetEffect() - { - return pEffect; - } - - TTopLevelVariable() : pEffect (nullptr) - { - } - - uint32_t GetTotalUnpackedSize() - { - return ((SType*)pType)->GetTotalUnpackedSize(false); - } - - STDMETHOD_(ID3DX11EffectType*, GetType)() - { - return (ID3DX11EffectType*)(SType*)pType; - } - - TTopLevelVariable * GetTopLevelEntity() - { - return (TTopLevelVariable *)this; - } - - bool IsArray() - { - return (pType->Elements > 0); - } - -}; - -////////////////////////////////////////////////////////////////////////// -// TMember - functionality for structure/array members of other variables -////////////////////////////////////////////////////////////////////////// - -template -struct TMember : public SVariable, public IBaseInterface -{ - // Indicates that this is a single element of a containing array - uint32_t IsSingleElement : 1; - - // Required to create member/element variable interfaces - TTopLevelVariable *pTopLevelEntity; - - TMember() - { - IsSingleElement = false; - pTopLevelEntity = nullptr; - } - - CEffect* GetEffect() - { - return pTopLevelEntity->pEffect; - } - - uint32_t GetTotalUnpackedSize() - { - return pType->GetTotalUnpackedSize(IsSingleElement); - } - - STDMETHOD_(ID3DX11EffectType*, GetType)() override - { - if (IsSingleElement) - { - return pTopLevelEntity->pEffect->CreatePooledSingleElementTypeInterface( pType ); - } - else - { - return (ID3DX11EffectType*) pType; - } - } - - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) override - { - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetDesc"; - - VERIFYPARAMETER(pDesc != nullptr); - - pDesc->Name = pName; - pDesc->Semantic = pSemantic; - pDesc->Flags = 0; - - if (pTopLevelEntity->pEffect->IsReflectionData(pTopLevelEntity)) - { - // Is part of an annotation - assert(pTopLevelEntity->pEffect->IsReflectionData(Data.pGeneric)); - pDesc->Annotations = 0; - pDesc->BufferOffset = 0; - pDesc->Flags |= D3DX11_EFFECT_VARIABLE_ANNOTATION; - } - else - { - // Is part of a global variable - assert(pTopLevelEntity->pEffect->IsRuntimeData(pTopLevelEntity)); - if (!pTopLevelEntity->pType->IsObjectType(EOT_String)) - { - // strings are funny; their data is reflection data, so ignore those - assert(pTopLevelEntity->pEffect->IsRuntimeData(Data.pGeneric)); - } - - pDesc->Annotations = ((TGlobalVariable*)pTopLevelEntity)->AnnotationCount; - - SConstantBuffer *pCB = ((TGlobalVariable*)pTopLevelEntity)->pCB; - - if (pType->BelongsInConstantBuffer()) - { - assert(pCB != 0); - _Analysis_assume_(pCB != 0); - UINT_PTR offset = Data.pNumeric - pCB->pBackingStore; - assert(offset == (uint32_t)offset); - pDesc->BufferOffset = (uint32_t)offset; - assert(pDesc->BufferOffset >= 0 && pDesc->BufferOffset + GetTotalUnpackedSize() <= pCB->Size); - } - else - { - assert(pCB == nullptr); - pDesc->BufferOffset = 0; - } - } - -lExit: - return hr; - } - - TTopLevelVariable * GetTopLevelEntity() - { - return pTopLevelEntity; - } - - bool IsArray() - { - return (pType->Elements > 0 && !IsSingleElement); - } - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override - { return pTopLevelEntity->GetAnnotationByIndex(Index); } - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override - { return pTopLevelEntity->GetAnnotationByName(Name); } - - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)() override - { return pTopLevelEntity->GetParentConstantBuffer(); } - - // Annotations should never be able to go down this codepath - void DirtyVariable() - { - // make sure to call the global variable's version of dirty variable - ((TGlobalVariable*)pTopLevelEntity)->DirtyVariable(); - } -}; - -////////////////////////////////////////////////////////////////////////// -// TAnnotation - functionality for top level annotations -////////////////////////////////////////////////////////////////////////// - -template -struct TAnnotation : public TVariable > -{ - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) override - { - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetDesc"; - - VERIFYPARAMETER(pDesc != nullptr); - - pDesc->Name = pName; - pDesc->Semantic = pSemantic; - pDesc->Flags = D3DX11_EFFECT_VARIABLE_ANNOTATION; - pDesc->Annotations = 0; - pDesc->BufferOffset = 0; - pDesc->ExplicitBindPoint = 0; - -lExit: - return hr; - - } - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) override - { - UNREFERENCED_PARAMETER(Index); - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetAnnotationByIndex"; - DPF(0, "%s: Only variables may have annotations", pFuncName); - return &g_InvalidScalarVariable; - } - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) override - { - UNREFERENCED_PARAMETER(Name); - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetAnnotationByName"; - DPF(0, "%s: Only variables may have annotations", pFuncName); - return &g_InvalidScalarVariable; - } - - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)() override - { return NoParentCB(); } - - void DirtyVariable() - { - assert(0); - } -}; - -////////////////////////////////////////////////////////////////////////// -// TGlobalVariable - functionality for top level global variables -////////////////////////////////////////////////////////////////////////// - -template -struct TGlobalVariable : public TVariable > -{ - Timer LastModifiedTime; - - // if numeric, pointer to the constant buffer where this variable lives - SConstantBuffer *pCB; - - uint32_t AnnotationCount; - SAnnotation *pAnnotations; - - TGlobalVariable() : - LastModifiedTime(0), - pCB(nullptr), - AnnotationCount(0), - pAnnotations(nullptr) - { - } - - STDMETHOD(GetDesc)(_Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) - { - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetDesc"; - - VERIFYPARAMETER(pDesc != nullptr); - - pDesc->Name = pName; - pDesc->Semantic = pSemantic; - pDesc->Flags = 0; - pDesc->Annotations = AnnotationCount; - - if (pType->BelongsInConstantBuffer()) - { - assert(pCB != 0); - _Analysis_assume_(pCB != 0); - UINT_PTR offset = Data.pNumeric - pCB->pBackingStore; - assert(offset == (uint32_t)offset); - pDesc->BufferOffset = (uint32_t)offset; - assert(pDesc->BufferOffset >= 0 && pDesc->BufferOffset + GetTotalUnpackedSize() <= pCB->Size ); - } - else - { - assert(pCB == nullptr); - pDesc->BufferOffset = 0; - } - - if (ExplicitBindPoint != -1) - { - pDesc->ExplicitBindPoint = ExplicitBindPoint; - pDesc->Flags |= D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT; - } - else - { - pDesc->ExplicitBindPoint = 0; - } - -lExit: - return hr; - } - - // these are all well defined for global vars - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(_In_ uint32_t Index) - { - return GetAnnotationByIndexHelper("ID3DX11EffectVariable", Index, AnnotationCount, pAnnotations); - } - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(_In_z_ LPCSTR Name) - { - return GetAnnotationByNameHelper("ID3DX11EffectVariable", Name, AnnotationCount, pAnnotations); - } - - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)() - { - if (nullptr != pCB) - { - assert(pType->BelongsInConstantBuffer()); - return (ID3DX11EffectConstantBuffer*)pCB; - } - else - { - assert(!pType->BelongsInConstantBuffer()); - return &g_InvalidConstantBuffer; - } - } - - inline void DirtyVariable() - { - assert(pCB != 0); - _Analysis_assume_(pCB != 0); - pCB->IsDirty = true; - LastModifiedTime = pEffect->GetCurrentTime(); - } - -}; - -////////////////////////////////////////////////////////////////////////// -// TNumericVariable - implements raw set/get functionality -////////////////////////////////////////////////////////////////////////// - -// IMPORTANT NOTE: All of these numeric & object aspect classes MUST NOT -// add data members to the base variable classes. Otherwise type sizes -// will disagree between object & numeric variables and we cannot eaily -// create arrays of global variables using SGlobalVariable - -// Requires that IBaseInterface have SVariable's members, GetTotalUnpackedSize() and DirtyVariable() -template -struct TNumericVariable : public IBaseInterface -{ - STDMETHOD(SetRawValue)(_In_reads_bytes_(ByteCount) const void *pData, _In_ uint32_t ByteOffset, _In_ uint32_t ByteCount) override - { - if (IsAnnotation) - { - return AnnotationInvalidSetCall("ID3DX11EffectVariable::SetRawValue"); - } - else - { - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectVariable::SetRawValue"; - - VERIFYPARAMETER(pData); - - if ((ByteOffset + ByteCount < ByteOffset) || - (ByteCount + (uint8_t*)pData < (uint8_t*)pData) || - ((ByteOffset + ByteCount) > GetTotalUnpackedSize())) - { - // overflow of some kind - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - DirtyVariable(); - memcpy(Data.pNumeric + ByteOffset, pData, ByteCount); - -lExit: - return hr; - } - } - - STDMETHOD(GetRawValue)(_Out_writes_bytes_(ByteCount) void *pData, _In_ uint32_t ByteOffset, _In_ uint32_t ByteCount) override - { - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectVariable::GetRawValue"; - - VERIFYPARAMETER(pData); - - if ((ByteOffset + ByteCount < ByteOffset) || - (ByteCount + (uint8_t*)pData < (uint8_t*)pData) || - ((ByteOffset + ByteCount) > GetTotalUnpackedSize())) - { - // overflow of some kind - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - memcpy(pData, Data.pNumeric + ByteOffset, ByteCount); - -lExit: - return hr; - } -}; - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectScalarVariable (TFloatScalarVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TFloatScalarVariable : public TNumericVariable -{ - STDMETHOD(SetFloat)(_In_ const float Value) override; - STDMETHOD(GetFloat)(_Out_ float *pValue) override; - - STDMETHOD(SetFloatArray)(_In_reads_(Count) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetFloatArray)(_Out_writes_(Count) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - - STDMETHOD(SetInt)(_In_ const int Value) override; - STDMETHOD(GetInt)(_Out_ int *pValue) override; - - STDMETHOD(SetIntArray)(_In_reads_(Count) const int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetIntArray)(_Out_writes_(Count) int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - - STDMETHOD(SetBool)(_In_ const bool Value) override; - STDMETHOD(GetBool)(_Out_ bool *pValue) override; - - STDMETHOD(SetBoolArray)(_In_reads_(Count) const bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetBoolArray)(_Out_writes_(Count) bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; -}; - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::SetFloat(float Value) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloat"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return CopyScalarValue(Value, Data.pNumericFloat, pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::GetFloat(float *pValue) -{ - return CopyScalarValue(*Data.pNumericFloat, pValue, "ID3DX11EffectScalarVariable::GetFloat"); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::SetFloatArray(const float *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloatArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return SetScalarArray(pData, Data.pNumericFloat, Offset, Count, - pType, GetTotalUnpackedSize(), pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::GetFloatArray(float *pData, uint32_t Offset, uint32_t Count) -{ - return GetScalarArray(Data.pNumericFloat, pData, Offset, Count, - pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetFloatArray"); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::SetInt(const int Value) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetInt"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return CopyScalarValue(Value, Data.pNumericFloat, pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::GetInt(int *pValue) -{ - return CopyScalarValue(*Data.pNumericFloat, pValue, "ID3DX11EffectScalarVariable::GetInt"); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::SetIntArray(const int *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetIntArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return SetScalarArray(pData, Data.pNumericFloat, Offset, Count, - pType, GetTotalUnpackedSize(), pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::GetIntArray(int *pData, uint32_t Offset, uint32_t Count) -{ - return GetScalarArray(Data.pNumericFloat, pData, Offset, Count, - pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetIntArray"); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::SetBool(const bool Value) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBool"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return CopyScalarValue(Value, Data.pNumericFloat, pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::GetBool(bool *pValue) -{ - return CopyScalarValue(*Data.pNumericFloat, pValue, "ID3DX11EffectScalarVariable::GetBool"); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::SetBoolArray(const bool *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBoolArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return SetScalarArray(pData, Data.pNumericFloat, Offset, Count, - pType, GetTotalUnpackedSize(), pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TFloatScalarVariable::GetBoolArray(bool *pData, uint32_t Offset, uint32_t Count) -{ - return GetScalarArray(Data.pNumericFloat, pData, Offset, Count, - pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetBoolArray"); -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectScalarVariable (TIntScalarVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TIntScalarVariable : public TNumericVariable -{ - STDMETHOD(SetFloat)(_In_ const float Value) override; - STDMETHOD(GetFloat)(_Out_ float *pValue) override; - - STDMETHOD(SetFloatArray)(_In_reads_(Count) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetFloatArray)(_Out_writes_(Count) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - - STDMETHOD(SetInt)(_In_ const int Value) override; - STDMETHOD(GetInt)(_Out_ int *pValue) override; - - STDMETHOD(SetIntArray)(_In_reads_(Count) const int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetIntArray)(_Out_writes_(Count) int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - - STDMETHOD(SetBool)(_In_ const bool Value) override; - STDMETHOD(GetBool)(_Out_ bool *pValue) override; - - STDMETHOD(SetBoolArray)(_In_reads_(Count) const bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetBoolArray)(_Out_writes_(Count) bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; -}; - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::SetFloat(float Value) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloat"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return CopyScalarValue(Value, Data.pNumericInt, pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::GetFloat(float *pValue) -{ - return CopyScalarValue(*Data.pNumericInt, pValue, "ID3DX11EffectScalarVariable::GetFloat"); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::SetFloatArray(const float *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloatArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return SetScalarArray(pData, Data.pNumericInt, Offset, Count, - pType, GetTotalUnpackedSize(), pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::GetFloatArray(float *pData, uint32_t Offset, uint32_t Count) -{ - return GetScalarArray(Data.pNumericInt, pData, Offset, Count, - pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetFloatArray"); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::SetInt(const int Value) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetInt"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return CopyScalarValue(Value, Data.pNumericInt, pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::GetInt(int *pValue) -{ - return CopyScalarValue(*Data.pNumericInt, pValue, "ID3DX11EffectScalarVariable::GetInt"); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::SetIntArray(const int *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetIntArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return SetScalarArray(pData, Data.pNumericInt, Offset, Count, - pType, GetTotalUnpackedSize(), pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::GetIntArray(int *pData, uint32_t Offset, uint32_t Count) -{ - return GetScalarArray(Data.pNumericInt, pData, Offset, Count, - pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetIntArray"); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::SetBool(const bool Value) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBool"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return CopyScalarValue(Value, Data.pNumericInt, pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::GetBool(bool *pValue) -{ - return CopyScalarValue(*Data.pNumericInt, pValue, "ID3DX11EffectScalarVariable::GetBool"); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::SetBoolArray(const bool *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBoolArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return SetScalarArray(pData, Data.pNumericInt, Offset, Count, - pType, GetTotalUnpackedSize(), pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TIntScalarVariable::GetBoolArray(bool *pData, uint32_t Offset, uint32_t Count) -{ - return GetScalarArray(Data.pNumericInt, pData, Offset, Count, - pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetBoolArray"); -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectScalarVariable (TBoolScalarVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TBoolScalarVariable : public TNumericVariable -{ - STDMETHOD(SetFloat)(_In_ const float Value) override; - STDMETHOD(GetFloat)(_Out_ float *pValue) override; - - STDMETHOD(SetFloatArray)(_In_reads_(Count) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetFloatArray)(_Out_writes_(Count) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - - STDMETHOD(SetInt)(_In_ const int Value) override; - STDMETHOD(GetInt)(_Out_ int *pValue) override; - - STDMETHOD(SetIntArray)(_In_reads_(Count) const int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetIntArray)(_Out_writes_(Count) int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - - STDMETHOD(SetBool)(_In_ const bool Value) override; - STDMETHOD(GetBool)(_Out_ bool *pValue) override; - - STDMETHOD(SetBoolArray)(_In_reads_(Count) const bool *pData, uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetBoolArray)(_Out_writes_(Count) bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; -}; - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::SetFloat(float Value) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloat"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return CopyScalarValue(Value, Data.pNumericBool, pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::GetFloat(float *pValue) -{ - return CopyScalarValue(*Data.pNumericBool, pValue, "ID3DX11EffectScalarVariable::GetFloat"); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::SetFloatArray(const float *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloatArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return SetScalarArray(pData, Data.pNumericBool, Offset, Count, - pType, GetTotalUnpackedSize(), pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::GetFloatArray(float *pData, uint32_t Offset, uint32_t Count) -{ - return GetScalarArray(Data.pNumericBool, pData, Offset, Count, - pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetFloatArray"); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::SetInt(const int Value) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetInt"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return CopyScalarValue(Value, Data.pNumericBool, pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::GetInt(int *pValue) -{ - return CopyScalarValue(*Data.pNumericBool, pValue, "ID3DX11EffectScalarVariable::GetInt"); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::SetIntArray(const int *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetIntArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return SetScalarArray(pData, Data.pNumericBool, Offset, Count, - pType, GetTotalUnpackedSize(), pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::GetIntArray(int *pData, uint32_t Offset, uint32_t Count) -{ - return GetScalarArray(Data.pNumericBool, pData, Offset, Count, - pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetIntArray"); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::SetBool(const bool Value) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBool"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return CopyScalarValue(Value, Data.pNumericBool, pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::GetBool(bool *pValue) -{ - return CopyScalarValue(*Data.pNumericBool, pValue, "ID3DX11EffectScalarVariable::GetBool"); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::SetBoolArray(const bool *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBoolArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return SetScalarArray(pData, Data.pNumericBool, Offset, Count, - pType, GetTotalUnpackedSize(), pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TBoolScalarVariable::GetBoolArray(bool *pData, uint32_t Offset, uint32_t Count) -{ - return GetScalarArray(Data.pNumericBool, pData, Offset, Count, - pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetBoolArray"); -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectVectorVariable (TVectorVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TVectorVariable : public TNumericVariable -{ - STDMETHOD(SetBoolVector) (_In_reads_(4) const bool *pData) override; - STDMETHOD(SetIntVector) (_In_reads_(4) const int *pData) override; - STDMETHOD(SetFloatVector)(_In_reads_(4) const float *pData) override; - - STDMETHOD(GetBoolVector) (_Out_writes_(4) bool *pData) override; - STDMETHOD(GetIntVector) (_Out_writes_(4) int *pData) override; - STDMETHOD(GetFloatVector)(_Out_writes_(4) float *pData) override; - - - STDMETHOD(SetBoolVectorArray) (_In_reads_(Count*4) const bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(SetIntVectorArray) (_In_reads_(Count*4) const int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(SetFloatVectorArray)(_In_reads_(Count*4) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - - STDMETHOD(GetBoolVectorArray) (_Out_writes_(Count*4) bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetIntVectorArray) (_Out_writes_(Count*4) int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetFloatVectorArray)(_Out_writes_(Count*4) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; -}; - -// Note that branches in this code is based on template parameters and will be compiled out -#pragma warning (push) -#pragma warning (disable : 6101) -template -void __forceinline CopyDataWithTypeConversion(_Out_ void *pDest, - _In_ const void *pSource, - _In_ size_t dstVecSize, _In_ size_t srcVecSize, - _In_ size_t elementCount, _In_ size_t vecCount) -{ - switch (SourceType) - { - case ETVT_Bool: - switch (DestType) - { - case ETVT_Bool: - for (size_t j=0; j(pDest)[i] = reinterpret_cast(pSource)[i] ? -1 : 0; - - pDest = ((float*) pDest) + dstVecSize; - pSource = ((bool*) pSource) + srcVecSize; - } - break; - - case ETVT_Int: - for (size_t j=0; j(pDest)[i] = reinterpret_cast(pSource)[i] ? -1 : 0; - - pDest = ((float*) pDest) + dstVecSize; - pSource = ((bool*) pSource) + srcVecSize; - } - break; - - case ETVT_Float: - for (size_t j=0; j(pDest)[i] = reinterpret_cast(pSource)[i] ? -1.0f : 0.0f; - - pDest = ((float*) pDest) + dstVecSize; - pSource = ((bool*) pSource) + srcVecSize; - } - break; - - case ETVT_bool: - for (size_t j=0; j -_Use_decl_annotations_ -HRESULT TVectorVariable::SetFloatVector(const float *pData) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetFloatVector"; - -#ifdef _DEBUG - VERIFYPARAMETER(pData); -#endif - - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - CopyDataWithTypeConversion(Data.pVector, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, 1); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::GetFloatVector(float *pData) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetFloatVector"; - -#ifdef _DEBUG - VERIFYPARAMETER(pData); -#endif - - CopyDataWithTypeConversion(pData, Data.pVector, pType->NumericType.Columns, 4, pType->NumericType.Columns, 1); - -lExit: - return hr; -} - -// Int Vector - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::SetIntVector(const int *pData) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetIntVector"; - -#ifdef _DEBUG - VERIFYPARAMETER(pData); -#endif - - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - CopyDataWithTypeConversion(Data.pVector, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, 1); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::GetIntVector(int *pData) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetIntVector"; - VERIFYPARAMETER(pData); -#endif - - CopyDataWithTypeConversion(pData, Data.pVector, pType->NumericType.Columns, 4, pType->NumericType.Columns, 1); - -lExit: - return hr; -} - -// Bool Vector - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::SetBoolVector(const bool *pData) -{ - HRESULT hr = S_OK; - - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetBoolVector"; - -#ifdef _DEBUG - VERIFYPARAMETER(pData); -#endif - - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - CopyDataWithTypeConversion(Data.pVector, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, 1); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::GetBoolVector(bool *pData) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetBoolVector"; - VERIFYPARAMETER(pData); -#endif - - CopyDataWithTypeConversion(pData, Data.pVector, pType->NumericType.Columns, 4, pType->NumericType.Columns, 1); - -lExit: - return hr; -} - -// Vector Arrays ///////////////////////////////////////////////////////// - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::SetFloatVectorArray(const float *pData, uint32_t Offset, uint32_t Count) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetFloatVectorArray"; - -#ifdef _DEBUG -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize())) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - // ensure we don't write over the padding at the end of the vector array - CopyDataWithTypeConversion(Data.pVector + Offset, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, std::max(std::min((int)Count, (int)pType->Elements - (int)Offset), 0)); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::GetFloatVectorArray(float *pData, uint32_t Offset, uint32_t Count) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetFloatVectorArray"; -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize())) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - // ensure we don't read past the end of the vector array - CopyDataWithTypeConversion(pData, Data.pVector + Offset, pType->NumericType.Columns, 4, pType->NumericType.Columns, std::max(std::min((int)Count, (int)pType->Elements - (int)Offset), 0)); - -lExit: - return hr; -} - -// int - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::SetIntVectorArray(const int *pData, uint32_t Offset, uint32_t Count) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetIntVectorArray"; - -#ifdef _DEBUG -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize())) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - // ensure we don't write over the padding at the end of the vector array - CopyDataWithTypeConversion(Data.pVector + Offset, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, std::max(std::min((int)Count, (int)pType->Elements - (int)Offset), 0)); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::GetIntVectorArray(int *pData, uint32_t Offset, uint32_t Count) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetIntVectorArray"; - -#ifdef _DEBUG -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize())) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - // ensure we don't read past the end of the vector array - CopyDataWithTypeConversion(pData, Data.pVector + Offset, pType->NumericType.Columns, 4, pType->NumericType.Columns, std::max(std::min((int)Count, (int)pType->Elements - (int)Offset), 0)); - -lExit: - return hr; -} - -// bool - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::SetBoolVectorArray(const bool *pData, uint32_t Offset, uint32_t Count) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetBoolVectorArray"; - -#ifdef _DEBUG -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize())) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - // ensure we don't write over the padding at the end of the vector array - CopyDataWithTypeConversion(Data.pVector + Offset, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, std::max(std::min((int)Count, (int)pType->Elements - (int)Offset), 0)); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TVectorVariable::GetBoolVectorArray(bool *pData, uint32_t Offset, uint32_t Count) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetBoolVectorArray"; - -#ifdef _DEBUG -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize())) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - // ensure we don't read past the end of the vector array - CopyDataWithTypeConversion(pData, Data.pVector + Offset, pType->NumericType.Columns, 4, pType->NumericType.Columns, std::max(std::min((int)Count, (int)pType->Elements - (int)Offset), 0)); - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectVector4Variable (TVectorVariable implementation) [OPTIMIZED] -////////////////////////////////////////////////////////////////////////// - -template -struct TVector4Variable : public TVectorVariable -{ - STDMETHOD(SetFloatVector)(_In_reads_(4) const float *pData) override; - STDMETHOD(GetFloatVector)(_Out_writes_(4) float *pData) override; - - STDMETHOD(SetFloatVectorArray)(_In_reads_(Count*4) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetFloatVectorArray)(_Out_writes_(Count*4) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; -}; - -template -_Use_decl_annotations_ -HRESULT TVector4Variable::SetFloatVector(const float *pData) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetFloatVector"; - -#ifdef _DEBUG - VERIFYPARAMETER(pData); -#endif - - DirtyVariable(); - Data.pVector[0] = ((CEffectVector4*) pData)[0]; - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TVector4Variable::GetFloatVector(float *pData) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetFloatVector"; - -#ifdef _DEBUG - VERIFYPARAMETER(pData); -#endif - - memcpy(pData, Data.pVector, pType->NumericType.Columns * SType::c_ScalarSize); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TVector4Variable::SetFloatVectorArray(const float *pData, uint32_t Offset, uint32_t Count) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetFloatVectorArray"; - -#ifdef _DEBUG -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize())) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - DirtyVariable(); - // ensure we don't write over the padding at the end of the vector array - memcpy(Data.pVector + Offset, pData, std::min((Offset + Count) * sizeof(CEffectVector4), pType->TotalSize)); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TVector4Variable::GetFloatVectorArray(float *pData, uint32_t Offset, uint32_t Count) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetFloatVectorArray"; - -#ifdef _DEBUG -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize())) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#endif - - // ensure we don't read past the end of the vector array - memcpy(pData, Data.pVector + Offset, std::min((Offset + Count) * sizeof(CEffectVector4), pType->TotalSize)); - -lExit: - return hr; -} - - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectMatrixVariable (TMatrixVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TMatrixVariable : public TNumericVariable -{ - STDMETHOD(SetMatrix)(_In_reads_(16) const float *pData) override; - STDMETHOD(GetMatrix)(_Out_writes_(16) float *pData) override; - - STDMETHOD(SetMatrixArray)(_In_reads_(Count*16) const float *pData, uint32_t Offset, uint32_t Count) override; - STDMETHOD(GetMatrixArray)(_Out_writes_(Count*16) float *pData, uint32_t Offset, uint32_t Count) override; - - STDMETHOD(SetMatrixPointerArray)(_In_reads_(Count*16) const float **ppData, uint32_t Offset, uint32_t Count) override; - STDMETHOD(GetMatrixPointerArray)(_Out_writes_(Count*16) float **ppData, uint32_t Offset, uint32_t Count) override; - - STDMETHOD(SetMatrixTranspose)(_In_reads_(16) const float *pData) override; - STDMETHOD(GetMatrixTranspose)(_Out_writes_(16) float *pData) override; - - STDMETHOD(SetMatrixTransposeArray)(_In_reads_(Count*16) const float *pData, uint32_t Offset, uint32_t Count) override; - STDMETHOD(GetMatrixTransposeArray)(_Out_writes_(Count*16) float *pData, uint32_t Offset, uint32_t Count) override; - - STDMETHOD(SetMatrixTransposePointerArray)(_In_reads_(Count*16) const float **ppData, uint32_t Offset, uint32_t Count) override; - STDMETHOD(GetMatrixTransposePointerArray)(_Out_writes_(Count*16) float **ppData, uint32_t Offset, uint32_t Count) override; -}; - -#pragma warning (push) -#pragma warning (disable : 6101) -template -static void SetMatrixTransposeHelper(_In_ const SType *pType, _Out_writes_bytes_(64) uint8_t *pDestData, _In_reads_(16) const float* pMatrix) -{ - uint32_t registers, entries; - - if (Transpose) - { - // row major - registers = pType->NumericType.Rows; - entries = pType->NumericType.Columns; - } - else - { - // column major - registers = pType->NumericType.Columns; - entries = pType->NumericType.Rows; - } - _Analysis_assume_( registers <= 4 ); - _Analysis_assume_( entries <= 4 ); - - for (size_t i = 0; i < registers; ++ i) - { - for (size_t j = 0; j < entries; ++ j) - { -#pragma prefast(suppress:__WARNING_UNRELATED_LOOP_TERMINATION, "regs / entries <= 4") - ((float*)pDestData)[j] = ((float*)pMatrix)[j * 4 + i]; - } - pDestData += SType::c_RegisterSize; - } -} - -template -static void GetMatrixTransposeHelper(_In_ const SType *pType, _In_reads_bytes_(64) uint8_t *pSrcData, _Out_writes_(16) float* pMatrix) -{ - uint32_t registers, entries; - - if (Transpose) - { - // row major - registers = pType->NumericType.Rows; - entries = pType->NumericType.Columns; - } - else - { - // column major - registers = pType->NumericType.Columns; - entries = pType->NumericType.Rows; - } - _Analysis_assume_( registers <= 4 ); - _Analysis_assume_( entries <= 4 ); - - for (size_t i = 0; i < registers; ++ i) - { - for (size_t j = 0; j < entries; ++ j) - { - ((float*)pMatrix)[j * 4 + i] = ((float*)pSrcData)[j]; - } - pSrcData += SType::c_RegisterSize; - } -} - -template -HRESULT DoMatrixArrayInternal(_In_ const SType *pType, _In_ uint32_t TotalUnpackedSize, - _Out_ uint8_t *pEffectData, - void *pMatrixData, - _In_ uint32_t Offset, _In_ uint32_t Count, _In_z_ LPCSTR pFuncName) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pMatrixData, pType, TotalUnpackedSize)) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } -#else - UNREFERENCED_PARAMETER(TotalUnpackedSize); - UNREFERENCED_PARAMETER(pFuncName); -#endif - - if ((pType->NumericType.IsColumnMajor && Transpose) || (!pType->NumericType.IsColumnMajor && !Transpose)) - { - // fast path - uint32_t dataSize; - if (Transpose) - { - dataSize = ((pType->NumericType.Columns - 1) * 4 + pType->NumericType.Rows) * SType::c_ScalarSize; - } - else - { - dataSize = ((pType->NumericType.Rows - 1) * 4 + pType->NumericType.Columns) * SType::c_ScalarSize; - } - - for (size_t i = 0; i < Count; ++ i) - { - CEffectMatrix *pMatrix; - if (ExtraIndirection) - { - pMatrix = ((CEffectMatrix **)pMatrixData)[i]; - if (!pMatrix) - { - continue; - } - } - else - { - pMatrix = ((CEffectMatrix *)pMatrixData) + i; - } - - if (IsSetting) - { - memcpy(pEffectData + pType->Stride * (i + Offset), pMatrix, dataSize); - } - else - { - memcpy(pMatrix, pEffectData + pType->Stride * (i + Offset), dataSize); - } - } - } - else - { - // slow path - for (size_t i = 0; i < Count; ++ i) - { - CEffectMatrix *pMatrix; - if (ExtraIndirection) - { - pMatrix = ((CEffectMatrix **)pMatrixData)[i]; - if (!pMatrix) - { - continue; - } - } - else - { - pMatrix = ((CEffectMatrix *)pMatrixData) + i; - } - - if (IsSetting) - { - SetMatrixTransposeHelper(pType, pEffectData + pType->Stride * (i + Offset), (float*) pMatrix); - } - else - { - GetMatrixTransposeHelper(pType, pEffectData + pType->Stride * (i + Offset), (float*) pMatrix); - } - } - } - -lExit: - return hr; -} -#pragma warning (pop) - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::SetMatrix(const float *pData) -{ - static LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrix"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, const_cast(pData), 0, 1, pFuncName); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::GetMatrix(float *pData) -{ - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, pData, 0, 1, "ID3DX11EffectMatrixVariable::GetMatrix"); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::SetMatrixArray(const float *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrixArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, const_cast(pData), Offset, Count, "ID3DX11EffectMatrixVariable::SetMatrixArray"); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::GetMatrixArray(float *pData, uint32_t Offset, uint32_t Count) -{ - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, pData, Offset, Count, "ID3DX11EffectMatrixVariable::GetMatrixArray"); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::SetMatrixPointerArray(const float **ppData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrixPointerArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, const_cast(ppData), Offset, Count, "ID3DX11EffectMatrixVariable::SetMatrixPointerArray"); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::GetMatrixPointerArray(float **ppData, uint32_t Offset, uint32_t Count) -{ - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, ppData, Offset, Count, "ID3DX11EffectMatrixVariable::GetMatrixPointerArray"); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::SetMatrixTranspose(const float *pData) -{ - static LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrixTranspose"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, const_cast(pData), 0, 1, "ID3DX11EffectMatrixVariable::SetMatrixTranspose"); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::GetMatrixTranspose(float *pData) -{ - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, pData, 0, 1, "ID3DX11EffectMatrixVariable::GetMatrixTranspose"); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::SetMatrixTransposeArray(const float *pData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrixTransposeArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, const_cast(pData), Offset, Count, "ID3DX11EffectMatrixVariable::SetMatrixTransposeArray"); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::GetMatrixTransposeArray(float *pData, uint32_t Offset, uint32_t Count) -{ - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, pData, Offset, Count, "ID3DX11EffectMatrixVariable::GetMatrixTransposeArray"); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::SetMatrixTransposePointerArray(const float **ppData, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrixTransposePointerArray"; - if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName); - DirtyVariable(); - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, const_cast(ppData), Offset, Count, "ID3DX11EffectMatrixVariable::SetMatrixTransposePointerArray"); -} - -template -_Use_decl_annotations_ -HRESULT TMatrixVariable::GetMatrixTransposePointerArray(float **ppData, uint32_t Offset, uint32_t Count) -{ - return DoMatrixArrayInternal(pType, GetTotalUnpackedSize(), - Data.pNumeric, ppData, Offset, Count, "ID3DX11EffectMatrixVariable::GetMatrixTransposePointerArray"); -} - -// Optimize commonly used fast paths -// (non-annotations only!) -template -struct TMatrix4x4Variable : public TMatrixVariable -{ - STDMETHOD(SetMatrix)(_In_reads_(16) const float *pData) override; - STDMETHOD(GetMatrix)(_Out_writes_(16) float *pData) override; - - STDMETHOD(SetMatrixArray)(_In_reads_(16*Count) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetMatrixArray)(_Out_writes_(16*Count) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - - STDMETHOD(SetMatrixTranspose)(_In_reads_(16) const float *pData) override; - STDMETHOD(GetMatrixTranspose)(_Out_writes_(16) float *pData) override; - - STDMETHOD(SetMatrixTransposeArray)(_In_reads_(16*Count) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetMatrixTransposeArray)(_Out_writes_(16*Count) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) override; -}; - -inline static void Matrix4x4TransposeHelper(_In_reads_bytes_(64) const void *pSrc, _Out_writes_bytes_(64) void *pDst) -{ - uint8_t *pDestData = (uint8_t*)pDst; - uint32_t *pMatrix = (uint32_t*)pSrc; - - ((uint32_t*)pDestData)[0 * 4 + 0] = pMatrix[0 * 4 + 0]; - ((uint32_t*)pDestData)[0 * 4 + 1] = pMatrix[1 * 4 + 0]; - ((uint32_t*)pDestData)[0 * 4 + 2] = pMatrix[2 * 4 + 0]; - ((uint32_t*)pDestData)[0 * 4 + 3] = pMatrix[3 * 4 + 0]; - - ((uint32_t*)pDestData)[1 * 4 + 0] = pMatrix[0 * 4 + 1]; - ((uint32_t*)pDestData)[1 * 4 + 1] = pMatrix[1 * 4 + 1]; - ((uint32_t*)pDestData)[1 * 4 + 2] = pMatrix[2 * 4 + 1]; - ((uint32_t*)pDestData)[1 * 4 + 3] = pMatrix[3 * 4 + 1]; - - ((uint32_t*)pDestData)[2 * 4 + 0] = pMatrix[0 * 4 + 2]; - ((uint32_t*)pDestData)[2 * 4 + 1] = pMatrix[1 * 4 + 2]; - ((uint32_t*)pDestData)[2 * 4 + 2] = pMatrix[2 * 4 + 2]; - ((uint32_t*)pDestData)[2 * 4 + 3] = pMatrix[3 * 4 + 2]; - - ((uint32_t*)pDestData)[3 * 4 + 0] = pMatrix[0 * 4 + 3]; - ((uint32_t*)pDestData)[3 * 4 + 1] = pMatrix[1 * 4 + 3]; - ((uint32_t*)pDestData)[3 * 4 + 2] = pMatrix[2 * 4 + 3]; - ((uint32_t*)pDestData)[3 * 4 + 3] = pMatrix[3 * 4 + 3]; -} - -inline static void Matrix4x4Copy(_In_reads_bytes_(64) const void *pSrc, _Out_writes_bytes_(64) void *pDst) -{ -#if 1 - // In tests, this path ended up generating faster code both on x86 and x64 - // T1 - Matrix4x4Copy - this path - // T2 - Matrix4x4Transpose - // T1: 1.88 T2: 1.92 - with 32 bit copies - // T1: 1.85 T2: 1.80 - with 64 bit copies - - uint64_t *pDestData = (uint64_t*)pDst; - uint64_t *pMatrix = (uint64_t*)pSrc; - - pDestData[0 * 4 + 0] = pMatrix[0 * 4 + 0]; - pDestData[0 * 4 + 1] = pMatrix[0 * 4 + 1]; - pDestData[0 * 4 + 2] = pMatrix[0 * 4 + 2]; - pDestData[0 * 4 + 3] = pMatrix[0 * 4 + 3]; - - pDestData[1 * 4 + 0] = pMatrix[1 * 4 + 0]; - pDestData[1 * 4 + 1] = pMatrix[1 * 4 + 1]; - pDestData[1 * 4 + 2] = pMatrix[1 * 4 + 2]; - pDestData[1 * 4 + 3] = pMatrix[1 * 4 + 3]; -#else - uint32_t *pDestData = (uint32_t*)pDst; - uint32_t *pMatrix = (uint32_t*)pSrc; - - pDestData[0 * 4 + 0] = pMatrix[0 * 4 + 0]; - pDestData[0 * 4 + 1] = pMatrix[0 * 4 + 1]; - pDestData[0 * 4 + 2] = pMatrix[0 * 4 + 2]; - pDestData[0 * 4 + 3] = pMatrix[0 * 4 + 3]; - - pDestData[1 * 4 + 0] = pMatrix[1 * 4 + 0]; - pDestData[1 * 4 + 1] = pMatrix[1 * 4 + 1]; - pDestData[1 * 4 + 2] = pMatrix[1 * 4 + 2]; - pDestData[1 * 4 + 3] = pMatrix[1 * 4 + 3]; - - pDestData[2 * 4 + 0] = pMatrix[2 * 4 + 0]; - pDestData[2 * 4 + 1] = pMatrix[2 * 4 + 1]; - pDestData[2 * 4 + 2] = pMatrix[2 * 4 + 2]; - pDestData[2 * 4 + 3] = pMatrix[2 * 4 + 3]; - - pDestData[3 * 4 + 0] = pMatrix[3 * 4 + 0]; - pDestData[3 * 4 + 1] = pMatrix[3 * 4 + 1]; - pDestData[3 * 4 + 2] = pMatrix[3 * 4 + 2]; - pDestData[3 * 4 + 3] = pMatrix[3 * 4 + 3]; -#endif -} - - -// Note that branches in this code is based on template parameters and will be compiled out -#pragma warning (push) -#pragma warning (disable : 6101) -template -inline HRESULT DoMatrix4x4ArrayInternal(_In_ uint8_t *pEffectData, - _When_(IsSetting, _In_reads_bytes_(64 * Count)) - _When_(!IsSetting, _Out_writes_bytes_(64 * Count)) - void *pMatrixData, - _In_ uint32_t Offset, _In_ uint32_t Count -#ifdef _DEBUG - , _In_ const SType *pType, _In_ uint32_t TotalUnpackedSize, _In_z_ LPCSTR pFuncName -#endif - - ) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG -#pragma warning( suppress : 6001 ) - if (!AreBoundsValid(Offset, Count, pMatrixData, pType, TotalUnpackedSize)) - { - DPF(0, "%s: Invalid range specified", pFuncName); - VH(E_INVALIDARG); - } - - assert(pType->NumericType.IsColumnMajor == IsColumnMajor && pType->Stride == (4 * SType::c_RegisterSize)); -#endif - - if ((IsColumnMajor && Transpose) || (!IsColumnMajor && !Transpose)) - { - // fast path - for (size_t i = 0; i < Count; ++ i) - { - CEffectMatrix *pMatrix = ((CEffectMatrix *)pMatrixData) + i; - - if (IsSetting) - { - Matrix4x4Copy(pMatrix, pEffectData + 4 * SType::c_RegisterSize * (i + Offset)); - } - else - { - Matrix4x4Copy(pEffectData + 4 * SType::c_RegisterSize * (i + Offset), pMatrix); - } - } - } - else - { - // slow path - for (size_t i = 0; i < Count; ++ i) - { - CEffectMatrix *pMatrix = ((CEffectMatrix *)pMatrixData) + i; - - if (IsSetting) - { - Matrix4x4TransposeHelper((float*) pMatrix, pEffectData + 4 * SType::c_RegisterSize * (i + Offset)); - } - else - { - Matrix4x4TransposeHelper(pEffectData + 4 * SType::c_RegisterSize * (i + Offset), (float*) pMatrix); - } - } - } - -lExit: - return hr; -} -#pragma warning (pop) - -template -_Use_decl_annotations_ -HRESULT TMatrix4x4Variable::SetMatrix(const float *pData) -{ - DirtyVariable(); - return DoMatrix4x4ArrayInternal(Data.pNumeric, const_cast(pData), 0, 1 -#ifdef _DEBUG - , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::SetMatrix"); -#else - ); -#endif -} - -template -_Use_decl_annotations_ -HRESULT TMatrix4x4Variable::GetMatrix(float *pData) -{ - return DoMatrix4x4ArrayInternal(Data.pNumeric, pData, 0, 1 -#ifdef _DEBUG - , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::GetMatrix"); -#else - ); -#endif -} - -template -_Use_decl_annotations_ -HRESULT TMatrix4x4Variable::SetMatrixArray(const float *pData, uint32_t Offset, uint32_t Count) -{ - DirtyVariable(); - return DoMatrix4x4ArrayInternal(Data.pNumeric, const_cast(pData), Offset, Count -#ifdef _DEBUG - , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::SetMatrixArray"); -#else - ); -#endif -} - -template -_Use_decl_annotations_ -HRESULT TMatrix4x4Variable::GetMatrixArray(float *pData, uint32_t Offset, uint32_t Count) -{ - return DoMatrix4x4ArrayInternal(Data.pNumeric, pData, Offset, Count -#ifdef _DEBUG - , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::GetMatrixArray"); -#else - ); -#endif -} - -template -_Use_decl_annotations_ -HRESULT TMatrix4x4Variable::SetMatrixTranspose(const float *pData) -{ - DirtyVariable(); - return DoMatrix4x4ArrayInternal(Data.pNumeric, const_cast(pData), 0, 1 -#ifdef _DEBUG - , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::SetMatrixTranspose"); -#else - ); -#endif -} - -template -_Use_decl_annotations_ -HRESULT TMatrix4x4Variable::GetMatrixTranspose(float *pData) -{ - return DoMatrix4x4ArrayInternal(Data.pNumeric, pData, 0, 1 -#ifdef _DEBUG - , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::GetMatrixTranspose"); -#else - ); -#endif -} - -template -_Use_decl_annotations_ -HRESULT TMatrix4x4Variable::SetMatrixTransposeArray(const float *pData, uint32_t Offset, uint32_t Count) -{ - DirtyVariable(); - return DoMatrix4x4ArrayInternal(Data.pNumeric, const_cast(pData), Offset, Count -#ifdef _DEBUG - , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::SetMatrixTransposeArray"); -#else - ); -#endif -} - -template -_Use_decl_annotations_ -HRESULT TMatrix4x4Variable::GetMatrixTransposeArray(float *pData, uint32_t Offset, uint32_t Count) -{ - return DoMatrix4x4ArrayInternal(Data.pNumeric, pData, Offset, Count -#ifdef _DEBUG - , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::GetMatrixTransposeArray"); -#else - ); -#endif -} - -#ifdef _DEBUG - -// Useful object macro to check bounds and parameters -#define CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, Pointer) \ - HRESULT hr = S_OK; \ - VERIFYPARAMETER(Pointer) \ - uint32_t elements = IsArray() ? pType->Elements : 1; \ - \ - if ((Offset + Count < Offset) || (elements < Offset + Count)) \ - { \ - DPF(0, "%s: Invalid range specified", pFuncName); \ - VH(E_INVALIDARG); \ - } \ - -#define CHECK_OBJECT_SCALAR_BOUNDS(Index, Pointer) \ - HRESULT hr = S_OK; \ - VERIFYPARAMETER(Pointer) \ - uint32_t elements = IsArray() ? pType->Elements : 1; \ - \ - if (Index >= elements) \ - { \ - DPF(0, "%s: Invalid index specified", pFuncName); \ - VH(E_INVALIDARG); \ - } \ - -#define CHECK_SCALAR_BOUNDS(Index) \ - HRESULT hr = S_OK; \ - uint32_t elements = IsArray() ? pType->Elements : 1; \ - \ - if (Index >= elements) \ -{ \ - DPF(0, "%s: Invalid index specified", pFuncName); \ - VH(E_INVALIDARG); \ -} \ - -#else // _DEBUG - -#define CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, Pointer) \ - HRESULT hr = S_OK; \ - -#define CHECK_OBJECT_SCALAR_BOUNDS(Index, Pointer) \ - HRESULT hr = S_OK; \ - -#define CHECK_SCALAR_BOUNDS(Index) \ - HRESULT hr = S_OK; \ - -#endif // _DEBUG - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectStringVariable (TStringVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TStringVariable : public IBaseInterface -{ - STDMETHOD(GetString)(_Outptr_result_z_ LPCSTR *ppString) override; - STDMETHOD(GetStringArray)( _Out_writes_(Count) LPCSTR *ppStrings, _In_ uint32_t Offset, _In_ uint32_t Count ) override; -}; - -template -_Use_decl_annotations_ -HRESULT TStringVariable::GetString(LPCSTR *ppString) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectStringVariable::GetString"; - - VERIFYPARAMETER(ppString); - - if (GetTopLevelEntity()->pEffect->IsOptimized()) - { - DPF(0, "%s: Effect has been Optimize()'ed; all string/reflection data has been deleted", pFuncName); - return D3DERR_INVALIDCALL; - } - - assert(Data.pString != 0); - _Analysis_assume_(Data.pString != 0); - - *ppString = Data.pString->pString; - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -#pragma warning(suppress : 6054) -HRESULT TStringVariable::GetStringArray( LPCSTR *ppStrings, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectStringVariable::GetStringArray"; - - CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppStrings); - - if (GetTopLevelEntity()->pEffect->IsOptimized()) - { - DPF(0, "%s: Effect has been Optimize()'ed; all string/reflection data has been deleted", pFuncName); - return D3DERR_INVALIDCALL; - } - - assert(Data.pString != 0); - _Analysis_assume_(Data.pString != 0); - - for (size_t i = 0; i < Count; ++ i) - { - ppStrings[i] = (Data.pString + Offset + i)->pString; - } - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectClassInstanceVariable (TClassInstanceVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TClassInstanceVariable : public IBaseInterface -{ - STDMETHOD(GetClassInstance)(_Outptr_ ID3D11ClassInstance **ppClassInstance) override; -}; - -template -HRESULT TClassInstanceVariable::GetClassInstance(_Outptr_ ID3D11ClassInstance** ppClassInstance) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectClassInstanceVariable::GetClassInstance"; - - assert( pMemberData != 0 && pMemberData->Data.pD3DClassInstance != 0); - _Analysis_assume_( pMemberData != 0 && pMemberData->Data.pD3DClassInstance != 0); - *ppClassInstance = pMemberData->Data.pD3DClassInstance; - SAFE_ADDREF(*ppClassInstance); - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectInterfaceeVariable (TInterfaceVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TInterfaceVariable : public IBaseInterface -{ - STDMETHOD(SetClassInstance)(_In_ ID3DX11EffectClassInstanceVariable *pEffectClassInstance) override; - STDMETHOD(GetClassInstance)(_Outptr_ ID3DX11EffectClassInstanceVariable **ppEffectClassInstance) override; -}; - -template -HRESULT TInterfaceVariable::SetClassInstance(_In_ ID3DX11EffectClassInstanceVariable *pEffectClassInstance) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectInterfaceVariable::SetClassInstance"; - - // Note that we don't check if the types are compatible. The debug layer will complain if it is. - // IsValid() will not catch type mismatches. - SClassInstanceGlobalVariable* pCI = (SClassInstanceGlobalVariable*)pEffectClassInstance; - Data.pInterface->pClassInstance = pCI; - -lExit: - return hr; -} - -template -HRESULT TInterfaceVariable::GetClassInstance(_Outptr_ ID3DX11EffectClassInstanceVariable **ppEffectClassInstance) -{ - HRESULT hr = S_OK; - static LPCSTR pFuncName = "ID3DX11EffectInterfaceVariable::GetClassInstance"; - -#ifdef _DEBUG - VERIFYPARAMETER(ppEffectClassInstance); -#endif - - *ppEffectClassInstance = Data.pInterface->pClassInstance; - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectShaderResourceVariable (TShaderResourceVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TShaderResourceVariable : public IBaseInterface -{ - STDMETHOD(SetResource)(_In_ ID3D11ShaderResourceView *pResource) override; - STDMETHOD(GetResource)(_Outptr_ ID3D11ShaderResourceView **ppResource) override; - - STDMETHOD(SetResourceArray)(_In_reads_(Count) ID3D11ShaderResourceView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetResourceArray)(_Out_writes_(Count) ID3D11ShaderResourceView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override; -}; - -static LPCSTR GetTextureTypeNameFromEnum(_In_ EObjectType ObjectType) -{ - switch (ObjectType) - { - case EOT_Buffer: - return "Buffer"; - case EOT_Texture: - return "texture"; - case EOT_Texture1D: - case EOT_Texture1DArray: - return "Texture1D"; - case EOT_Texture2DMS: - case EOT_Texture2DMSArray: - return "Texture2DMS"; - case EOT_Texture2D: - case EOT_Texture2DArray: - return "Texture2D"; - case EOT_Texture3D: - return "Texture3D"; - case EOT_TextureCube: - return "TextureCube"; - case EOT_TextureCubeArray: - return "TextureCubeArray"; - case EOT_RWTexture1D: - case EOT_RWTexture1DArray: - return "RWTexture1D"; - case EOT_RWTexture2D: - case EOT_RWTexture2DArray: - return "RWTexture2D"; - case EOT_RWTexture3D: - return "RWTexture3D"; - case EOT_RWBuffer: - return "RWBuffer"; - case EOT_ByteAddressBuffer: - return "ByteAddressBuffer"; - case EOT_RWByteAddressBuffer: - return "RWByteAddressBuffer"; - case EOT_StructuredBuffer: - return "StructuredBuffe"; - case EOT_RWStructuredBuffer: - return "RWStructuredBuffer"; - case EOT_RWStructuredBufferAlloc: - return "RWStructuredBufferAlloc"; - case EOT_RWStructuredBufferConsume: - return "RWStructuredBufferConsume"; - case EOT_AppendStructuredBuffer: - return "AppendStructuredBuffer"; - case EOT_ConsumeStructuredBuffer: - return "ConsumeStructuredBuffer"; - } - return ""; -} - -static LPCSTR GetResourceDimensionNameFromEnum(_In_ D3D11_RESOURCE_DIMENSION ResourceDimension) -{ - switch (ResourceDimension) - { - case D3D11_RESOURCE_DIMENSION_BUFFER: - return "Buffer"; - case D3D11_RESOURCE_DIMENSION_TEXTURE1D: - return "Texture1D"; - case D3D11_RESOURCE_DIMENSION_TEXTURE2D: - return "Texture2D"; - case D3D11_RESOURCE_DIMENSION_TEXTURE3D: - return "Texture3D"; - } - return ""; -} - -static LPCSTR GetSRVDimensionNameFromEnum(_In_ D3D11_SRV_DIMENSION ViewDimension) -{ - switch (ViewDimension) - { - case D3D11_SRV_DIMENSION_BUFFER: - case D3D11_SRV_DIMENSION_BUFFEREX: - return "Buffer"; - case D3D11_SRV_DIMENSION_TEXTURE1D: - return "Texture1D"; - case D3D11_SRV_DIMENSION_TEXTURE1DARRAY: - return "Texture1DArray"; - case D3D11_SRV_DIMENSION_TEXTURE2D: - return "Texture2D"; - case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: - return "Texture2DArray"; - case D3D11_SRV_DIMENSION_TEXTURE2DMS: - return "Texture2DMS"; - case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: - return "Texture2DMSArray"; - case D3D11_SRV_DIMENSION_TEXTURE3D: - return "Texture3D"; - case D3D11_SRV_DIMENSION_TEXTURECUBE: - return "TextureCube"; - } - return ""; -} - -static LPCSTR GetUAVDimensionNameFromEnum(_In_ D3D11_UAV_DIMENSION ViewDimension) -{ - switch (ViewDimension) - { - case D3D11_UAV_DIMENSION_BUFFER: - return "Buffer"; - case D3D11_UAV_DIMENSION_TEXTURE1D: - return "RWTexture1D"; - case D3D11_UAV_DIMENSION_TEXTURE1DARRAY: - return "RWTexture1DArray"; - case D3D11_UAV_DIMENSION_TEXTURE2D: - return "RWTexture2D"; - case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: - return "RWTexture2DArray"; - case D3D11_UAV_DIMENSION_TEXTURE3D: - return "RWTexture3D"; - } - return ""; -} - -static LPCSTR GetRTVDimensionNameFromEnum(_In_ D3D11_RTV_DIMENSION ViewDimension) -{ - switch (ViewDimension) - { - case D3D11_RTV_DIMENSION_BUFFER: - return "Buffer"; - case D3D11_RTV_DIMENSION_TEXTURE1D: - return "Texture1D"; - case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: - return "Texture1DArray"; - case D3D11_RTV_DIMENSION_TEXTURE2D: - return "Texture2D"; - case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: - return "Texture2DArray"; - case D3D11_RTV_DIMENSION_TEXTURE2DMS: - return "Texture2DMS"; - case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: - return "Texture2DMSArray"; - case D3D11_RTV_DIMENSION_TEXTURE3D: - return "Texture3D"; - } - return ""; -} - -static LPCSTR GetDSVDimensionNameFromEnum(_In_ D3D11_DSV_DIMENSION ViewDimension) -{ - switch (ViewDimension) - { - case D3D11_DSV_DIMENSION_TEXTURE1D: - return "Texture1D"; - case D3D11_DSV_DIMENSION_TEXTURE1DARRAY: - return "Texture1DArray"; - case D3D11_DSV_DIMENSION_TEXTURE2D: - return "Texture2D"; - case D3D11_DSV_DIMENSION_TEXTURE2DARRAY: - return "Texture2DArray"; - case D3D11_DSV_DIMENSION_TEXTURE2DMS: - return "Texture2DMS"; - case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY: - return "Texture2DMSArray"; - } - return ""; -} - -static HRESULT ValidateTextureType(_In_ ID3D11ShaderResourceView *pView, _In_ EObjectType ObjectType, _In_z_ LPCSTR pFuncName) -{ - if (nullptr != pView) - { - D3D11_SHADER_RESOURCE_VIEW_DESC desc; - pView->GetDesc(&desc); - switch (ObjectType) - { - case EOT_Texture: - if (desc.ViewDimension != D3D11_SRV_DIMENSION_BUFFER && desc.ViewDimension != D3D11_SRV_DIMENSION_BUFFEREX) - return S_OK; - break; - case EOT_Buffer: - if (desc.ViewDimension != D3D11_SRV_DIMENSION_BUFFER && desc.ViewDimension != D3D11_SRV_DIMENSION_BUFFEREX) - break; - if (desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFEREX && (desc.BufferEx.Flags & D3D11_BUFFEREX_SRV_FLAG_RAW)) - { - DPF(0, "%s: Resource type mismatch; %s expected, ByteAddressBuffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType)); - return E_INVALIDARG; - } - else - { - ID3D11Buffer* pBuffer = nullptr; - pView->GetResource( (ID3D11Resource**)&pBuffer ); - assert( pBuffer != nullptr ); - D3D11_BUFFER_DESC BufDesc; - pBuffer->GetDesc( &BufDesc ); - SAFE_RELEASE( pBuffer ); - if( BufDesc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED ) - { - DPF(0, "%s: Resource type mismatch; %s expected, StructuredBuffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType)); - return E_INVALIDARG; - } - else - { - return S_OK; - } - } - break; - case EOT_Texture1D: - case EOT_Texture1DArray: - if (desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE1D || - desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE1DARRAY) - return S_OK; - break; - case EOT_Texture2D: - case EOT_Texture2DArray: - if (desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE2D || - desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE2DARRAY) - return S_OK; - break; - case EOT_Texture2DMS: - case EOT_Texture2DMSArray: - if (desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE2DMS || - desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY) - return S_OK; - break; - case EOT_Texture3D: - if (desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE3D) - return S_OK; - break; - case EOT_TextureCube: - case EOT_TextureCubeArray: - if (desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURECUBE || - desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURECUBEARRAY) - return S_OK; - break; - case EOT_ByteAddressBuffer: - if (desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFEREX && (desc.BufferEx.Flags & D3D11_BUFFEREX_SRV_FLAG_RAW)) - return S_OK; - break; - case EOT_StructuredBuffer: - if (desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFEREX || desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFER) - { - ID3D11Buffer* pBuffer = nullptr; - pView->GetResource( (ID3D11Resource**)&pBuffer ); - assert( pBuffer != nullptr ); - D3D11_BUFFER_DESC BufDesc; - pBuffer->GetDesc( &BufDesc ); - SAFE_RELEASE( pBuffer ); - if( BufDesc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED ) - { - return S_OK; - } - else - { - DPF(0, "%s: Resource type mismatch; %s expected, non-structured Buffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType)); - return E_INVALIDARG; - } - } - break; - default: - assert(0); // internal error, should never get here - return E_FAIL; - } - - - DPF(0, "%s: Resource type mismatch; %s expected, %s provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType), GetSRVDimensionNameFromEnum(desc.ViewDimension)); - return E_INVALIDARG; - } - return S_OK; -} - -template -_Use_decl_annotations_ -HRESULT TShaderResourceVariable::SetResource(ID3D11ShaderResourceView *pResource) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectShaderResourceVariable::SetResource"; - - VH(ValidateTextureType(pResource, pType->ObjectType, pFuncName)); -#endif - - // Texture variables don't need to be dirtied. - SAFE_ADDREF(pResource); - SAFE_RELEASE(Data.pShaderResource->pShaderResource); - Data.pShaderResource->pShaderResource = pResource; - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderResourceVariable::GetResource(ID3D11ShaderResourceView **ppResource) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectShaderResourceVariable::GetResource"; - - VERIFYPARAMETER(ppResource); -#endif - - assert(Data.pShaderResource != 0 && Data.pShaderResource->pShaderResource != 0); - _Analysis_assume_(Data.pShaderResource != 0 && Data.pShaderResource->pShaderResource != 0); - *ppResource = Data.pShaderResource->pShaderResource; - SAFE_ADDREF(*ppResource); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderResourceVariable::SetResourceArray(ID3D11ShaderResourceView **ppResources, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderResourceVariable::SetResourceArray"; - - CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources); - -#ifdef _DEBUG - for (size_t i = 0; i < Count; ++ i) - { - VH(ValidateTextureType(ppResources[i], pType->ObjectType, pFuncName)); - } -#endif - - // Texture variables don't need to be dirtied. - for (size_t i = 0; i < Count; ++ i) - { - SShaderResource *pResourceBlock = Data.pShaderResource + Offset + i; - SAFE_ADDREF(ppResources[i]); - SAFE_RELEASE(pResourceBlock->pShaderResource); - pResourceBlock->pShaderResource = ppResources[i]; - } - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderResourceVariable::GetResourceArray(ID3D11ShaderResourceView **ppResources, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderResourceVariable::GetResourceArray"; - - CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources); - - for (size_t i = 0; i < Count; ++ i) - { - ppResources[i] = (Data.pShaderResource + Offset + i)->pShaderResource; - SAFE_ADDREF(ppResources[i]); - } - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectUnorderedAccessViewVariable (TUnorderedAccessViewVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TUnorderedAccessViewVariable : public IBaseInterface -{ - STDMETHOD(SetUnorderedAccessView)(_In_ ID3D11UnorderedAccessView *pResource) override; - STDMETHOD(GetUnorderedAccessView)(_Outptr_ ID3D11UnorderedAccessView **ppResource) override; - - STDMETHOD(SetUnorderedAccessViewArray)(_In_reads_(Count) ID3D11UnorderedAccessView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetUnorderedAccessViewArray)(_Out_writes_(Count) ID3D11UnorderedAccessView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override; -}; - -static HRESULT ValidateTextureType(_In_ ID3D11UnorderedAccessView *pView, _In_ EObjectType ObjectType, _In_z_ LPCSTR pFuncName) -{ - if (nullptr != pView) - { - D3D11_UNORDERED_ACCESS_VIEW_DESC desc; - pView->GetDesc(&desc); - switch (ObjectType) - { - case EOT_RWBuffer: - if (desc.ViewDimension != D3D11_UAV_DIMENSION_BUFFER) - break; - if (desc.Buffer.Flags & D3D11_BUFFER_UAV_FLAG_RAW) - { - DPF(0, "%s: Resource type mismatch; %s expected, RWByteAddressBuffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType)); - return E_INVALIDARG; - } - else - { - ID3D11Buffer* pBuffer = nullptr; - pView->GetResource( (ID3D11Resource**)&pBuffer ); - assert( pBuffer != nullptr ); - D3D11_BUFFER_DESC BufDesc; - pBuffer->GetDesc( &BufDesc ); - SAFE_RELEASE( pBuffer ); - if( BufDesc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED ) - { - DPF(0, "%s: Resource type mismatch; %s expected, an RWStructuredBuffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType)); - return E_INVALIDARG; - } - else - { - return S_OK; - } - } - break; - case EOT_RWTexture1D: - case EOT_RWTexture1DArray: - if (desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE1D || - desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE1DARRAY) - return S_OK; - break; - case EOT_RWTexture2D: - case EOT_RWTexture2DArray: - if (desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE2D || - desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE2DARRAY) - return S_OK; - break; - case EOT_RWTexture3D: - if (desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE3D) - return S_OK; - break; - case EOT_RWByteAddressBuffer: - if (desc.ViewDimension == D3D11_UAV_DIMENSION_BUFFER && (desc.Buffer.Flags & D3D11_BUFFER_UAV_FLAG_RAW)) - return S_OK; - break; - case EOT_RWStructuredBuffer: - if (desc.ViewDimension == D3D11_UAV_DIMENSION_BUFFER) - { - ID3D11Buffer* pBuffer = nullptr; - pView->GetResource( (ID3D11Resource**)&pBuffer ); - assert( pBuffer != nullptr ); - D3D11_BUFFER_DESC BufDesc; - pBuffer->GetDesc( &BufDesc ); - SAFE_RELEASE( pBuffer ); - if( BufDesc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED ) - { - return S_OK; - } - else - { - DPF(0, "%s: Resource type mismatch; %s expected, non-structured Buffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType)); - return E_INVALIDARG; - } - } - break; - case EOT_RWStructuredBufferAlloc: - case EOT_RWStructuredBufferConsume: - if (desc.ViewDimension != D3D11_UAV_DIMENSION_BUFFER) - break; - if (desc.Buffer.Flags & D3D11_BUFFER_UAV_FLAG_COUNTER) - { - return S_OK; - } - else - { - DPF(0, "%s: Resource type mismatch; %s expected, non-Counter buffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType)); - return E_INVALIDARG; - } - break; - case EOT_AppendStructuredBuffer: - case EOT_ConsumeStructuredBuffer: - if (desc.ViewDimension != D3D11_UAV_DIMENSION_BUFFER) - break; - if (desc.Buffer.Flags & D3D11_BUFFER_UAV_FLAG_APPEND) - { - return S_OK; - } - else - { - DPF(0, "%s: Resource type mismatch; %s expected, non-Append buffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType)); - return E_INVALIDARG; - } - break; - default: - assert(0); // internal error, should never get here - return E_FAIL; - } - - - DPF(0, "%s: Resource type mismatch; %s expected, %s provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType), GetUAVDimensionNameFromEnum(desc.ViewDimension)); - return E_INVALIDARG; - } - return S_OK; -} - -template -_Use_decl_annotations_ -HRESULT TUnorderedAccessViewVariable::SetUnorderedAccessView(ID3D11UnorderedAccessView *pResource) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectUnorderedAccessViewVariable::SetUnorderedAccessView"; - - VH(ValidateTextureType(pResource, pType->ObjectType, pFuncName)); -#endif - - // UAV variables don't need to be dirtied. - SAFE_ADDREF(pResource); - SAFE_RELEASE(Data.pUnorderedAccessView->pUnorderedAccessView); - Data.pUnorderedAccessView->pUnorderedAccessView = pResource; - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TUnorderedAccessViewVariable::GetUnorderedAccessView(ID3D11UnorderedAccessView **ppResource) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectUnorderedAccessViewVariable::GetUnorderedAccessView"; - - VERIFYPARAMETER(ppResource); -#endif - - assert(Data.pUnorderedAccessView != 0 && Data.pUnorderedAccessView->pUnorderedAccessView != 0); - _Analysis_assume_(Data.pUnorderedAccessView != 0 && Data.pUnorderedAccessView->pUnorderedAccessView != 0); - *ppResource = Data.pUnorderedAccessView->pUnorderedAccessView; - SAFE_ADDREF(*ppResource); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TUnorderedAccessViewVariable::SetUnorderedAccessViewArray(ID3D11UnorderedAccessView **ppResources, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectUnorderedAccessViewVariable::SetUnorderedAccessViewArray"; - - CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources); - -#ifdef _DEBUG - for (size_t i = 0; i < Count; ++ i) - { - VH(ValidateTextureType(ppResources[i], pType->ObjectType, pFuncName)); - } -#endif - - // Texture variables don't need to be dirtied. - for (size_t i = 0; i < Count; ++ i) - { - SUnorderedAccessView *pResourceBlock = Data.pUnorderedAccessView + Offset + i; - SAFE_ADDREF(ppResources[i]); - SAFE_RELEASE(pResourceBlock->pUnorderedAccessView); - pResourceBlock->pUnorderedAccessView = ppResources[i]; - } - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TUnorderedAccessViewVariable::GetUnorderedAccessViewArray(ID3D11UnorderedAccessView **ppResources, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectUnorderedAccessViewVariable::GetUnorderedAccessViewArray"; - - CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources); - - for (size_t i = 0; i < Count; ++ i) - { - ppResources[i] = (Data.pUnorderedAccessView + Offset + i)->pUnorderedAccessView; - SAFE_ADDREF(ppResources[i]); - } - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectRenderTargetViewVariable (TRenderTargetViewVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TRenderTargetViewVariable : public IBaseInterface -{ - STDMETHOD(SetRenderTarget)(_In_ ID3D11RenderTargetView *pResource) override; - STDMETHOD(GetRenderTarget)(_Outptr_ ID3D11RenderTargetView **ppResource) override; - - STDMETHOD(SetRenderTargetArray)(_In_reads_(Count) ID3D11RenderTargetView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetRenderTargetArray)(_Out_writes_(Count) ID3D11RenderTargetView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override; -}; - - -template -_Use_decl_annotations_ -HRESULT TRenderTargetViewVariable::SetRenderTarget(ID3D11RenderTargetView *pResource) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3DX11EffectRenderTargetVariable::SetRenderTarget"; -#endif - - // Texture variables don't need to be dirtied. - SAFE_ADDREF(pResource); - SAFE_RELEASE(Data.pRenderTargetView->pRenderTargetView); - Data.pRenderTargetView->pRenderTargetView = pResource; - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TRenderTargetViewVariable::GetRenderTarget(ID3D11RenderTargetView **ppResource) -{ - HRESULT hr = S_OK; - - assert(Data.pRenderTargetView->pRenderTargetView != 0); - _Analysis_assume_(Data.pRenderTargetView->pRenderTargetView != 0); - *ppResource = Data.pRenderTargetView->pRenderTargetView; - SAFE_ADDREF(*ppResource); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TRenderTargetViewVariable::SetRenderTargetArray(ID3D11RenderTargetView **ppResources, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectRenderTargetVariable::SetRenderTargetArray"; - - CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources); - - // Texture variables don't need to be dirtied. - for (size_t i = 0; i < Count; ++ i) - { - SRenderTargetView *pResourceBlock = Data.pRenderTargetView + Offset + i; - SAFE_ADDREF(ppResources[i]); - SAFE_RELEASE(pResourceBlock->pRenderTargetView); - pResourceBlock->pRenderTargetView = ppResources[i]; - } - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TRenderTargetViewVariable::GetRenderTargetArray(ID3D11RenderTargetView **ppResources, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3DX11EffectRenderTargetVariable::GetRenderTargetArray"; - - CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources); - - for (size_t i = 0; i < Count; ++ i) - { - ppResources[i] = (Data.pRenderTargetView + Offset + i)->pRenderTargetView; - SAFE_ADDREF(ppResources[i]); - } - -lExit: - return hr; -} - -////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectDepthStencilViewVariable (TDepthStencilViewVariable implementation) -////////////////////////////////////////////////////////////////////////// - -template -struct TDepthStencilViewVariable : public IBaseInterface -{ - STDMETHOD(SetDepthStencil)(_In_ ID3D11DepthStencilView *pResource) override; - STDMETHOD(GetDepthStencil)(_Outptr_ ID3D11DepthStencilView **ppResource) override; - - STDMETHOD(SetDepthStencilArray)(_In_reads_(Count) ID3D11DepthStencilView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override; - STDMETHOD(GetDepthStencilArray)(_Out_writes_(Count) ID3D11DepthStencilView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) override; -}; - - -template -_Use_decl_annotations_ -HRESULT TDepthStencilViewVariable::SetDepthStencil(ID3D11DepthStencilView *pResource) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3D11DepthStencilViewVariable::SetDepthStencil"; - -#endif - - // Texture variables don't need to be dirtied. - SAFE_ADDREF(pResource); - SAFE_RELEASE(Data.pDepthStencilView->pDepthStencilView); - Data.pDepthStencilView->pDepthStencilView = pResource; - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TDepthStencilViewVariable::GetDepthStencil(ID3D11DepthStencilView **ppResource) -{ - HRESULT hr = S_OK; - -#ifdef _DEBUG - static LPCSTR pFuncName = "ID3D11DepthStencilViewVariable::GetDepthStencil"; - - VERIFYPARAMETER(ppResource); -#endif - - assert(Data.pDepthStencilView->pDepthStencilView != 0); - _Analysis_assume_(Data.pDepthStencilView->pDepthStencilView != 0); - *ppResource = Data.pDepthStencilView->pDepthStencilView; - SAFE_ADDREF(*ppResource); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TDepthStencilViewVariable::SetDepthStencilArray(ID3D11DepthStencilView **ppResources, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3D11DepthStencilViewVariable::SetDepthStencilArray"; - - CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources); - - // Texture variables don't need to be dirtied. - for (size_t i = 0; i < Count; ++ i) - { - SDepthStencilView *pResourceBlock = Data.pDepthStencilView + Offset + i; - SAFE_ADDREF(ppResources[i]); - SAFE_RELEASE(pResourceBlock->pDepthStencilView); - pResourceBlock->pDepthStencilView = ppResources[i]; - } - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TDepthStencilViewVariable::GetDepthStencilArray(ID3D11DepthStencilView **ppResources, uint32_t Offset, uint32_t Count) -{ - static LPCSTR pFuncName = "ID3D11DepthStencilViewVariable::GetDepthStencilArray"; - - CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources); - - for (size_t i = 0; i < Count; ++ i) - { - ppResources[i] = (Data.pDepthStencilView + Offset + i)->pDepthStencilView; - SAFE_ADDREF(ppResources[i]); - } - -lExit: - return hr; -} - -//////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectShaderVariable (TShaderVariable implementation) -//////////////////////////////////////////////////////////////////////////////// - -template -struct TShaderVariable : public IBaseInterface -{ - STDMETHOD(GetShaderDesc)(_In_ uint32_t ShaderIndex, _Out_ D3DX11_EFFECT_SHADER_DESC *pDesc) override; - - STDMETHOD(GetVertexShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11VertexShader **ppVS) override; - STDMETHOD(GetGeometryShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11GeometryShader **ppGS) override; - STDMETHOD(GetPixelShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11PixelShader **ppPS) override; - STDMETHOD(GetHullShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11HullShader **ppHS) override; - STDMETHOD(GetDomainShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11DomainShader **ppDS) override; - STDMETHOD(GetComputeShader)(_In_ uint32_t ShaderIndex, _Outptr_ ID3D11ComputeShader **ppCS) override; - - STDMETHOD(GetInputSignatureElementDesc)(_In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) override; - STDMETHOD(GetOutputSignatureElementDesc)(_In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) override; - STDMETHOD(GetPatchConstantSignatureElementDesc)(_In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) override; - - STDMETHOD_(bool, IsValid)(); -}; - -template -_Use_decl_annotations_ -HRESULT TShaderVariable::GetShaderDesc(uint32_t ShaderIndex, D3DX11_EFFECT_SHADER_DESC *pDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetShaderDesc"; - - CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, pDesc); - - hr = Data.pShader[ShaderIndex].GetShaderDesc(pDesc, false); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderVariable::GetVertexShader(uint32_t ShaderIndex, ID3D11VertexShader **ppVS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetVertexShader"; - - CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppVS); - - VH( Data.pShader[ShaderIndex].GetVertexShader(ppVS) ); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderVariable::GetGeometryShader(uint32_t ShaderIndex, ID3D11GeometryShader **ppGS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetGeometryShader"; - - CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppGS); - - VH( Data.pShader[ShaderIndex].GetGeometryShader(ppGS) ); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderVariable::GetPixelShader(uint32_t ShaderIndex, ID3D11PixelShader **ppPS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPixelShader"; - - CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppPS); - - VH( Data.pShader[ShaderIndex].GetPixelShader(ppPS) ); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderVariable::GetHullShader(uint32_t ShaderIndex, ID3D11HullShader **ppHS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetHullShader"; - - CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppHS); - - VH( Data.pShader[ShaderIndex].GetHullShader(ppHS) ); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderVariable::GetDomainShader(uint32_t ShaderIndex, ID3D11DomainShader **ppDS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetDomainShader"; - - CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppDS); - - VH( Data.pShader[ShaderIndex].GetDomainShader(ppDS) ); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderVariable::GetComputeShader(uint32_t ShaderIndex, ID3D11ComputeShader **ppCS) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetComputeShader"; - - CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppCS); - - VH( Data.pShader[ShaderIndex].GetComputeShader(ppCS) ); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderVariable::GetInputSignatureElementDesc(uint32_t ShaderIndex, uint32_t Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc"; - - CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, pDesc); - - VH( Data.pShader[ShaderIndex].GetSignatureElementDesc(SShaderBlock::ST_Input, Element, pDesc) ); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderVariable::GetOutputSignatureElementDesc(uint32_t ShaderIndex, uint32_t Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc"; - - CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, pDesc); - - VH( Data.pShader[ShaderIndex].GetSignatureElementDesc(SShaderBlock::ST_Output, Element, pDesc) ); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TShaderVariable::GetPatchConstantSignatureElementDesc(uint32_t ShaderIndex, uint32_t Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc"; - - CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, pDesc); - - VH( Data.pShader[ShaderIndex].GetSignatureElementDesc(SShaderBlock::ST_PatchConstant, Element, pDesc) ); - -lExit: - return hr; -} - -template -bool TShaderVariable::IsValid() -{ - uint32_t numElements = IsArray()? pType->Elements : 1; - bool valid = true; - while( numElements > 0 && ( valid = Data.pShader[ numElements-1 ].IsValid ) ) - numElements--; - return valid; -} - -//////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectBlendVariable (TBlendVariable implementation) -//////////////////////////////////////////////////////////////////////////////// - -template -struct TBlendVariable : public IBaseInterface -{ -public: - STDMETHOD(GetBlendState)(_In_ uint32_t Index, _Outptr_ ID3D11BlendState **ppState) override; - STDMETHOD(SetBlendState)(_In_ uint32_t Index, _In_ ID3D11BlendState *pState) override; - STDMETHOD(UndoSetBlendState)(_In_ uint32_t Index) override; - STDMETHOD(GetBackingStore)(_In_ uint32_t Index, _Out_ D3D11_BLEND_DESC *pDesc) override; - STDMETHOD_(bool, IsValid)() override; -}; - -template -_Use_decl_annotations_ -HRESULT TBlendVariable::GetBlendState(uint32_t Index, ID3D11BlendState **ppState) -{ - static LPCSTR pFuncName = "ID3DX11EffectBlendVariable::GetBlendState"; - - CHECK_OBJECT_SCALAR_BOUNDS(Index, ppState); - - assert(Data.pBlend[Index].pBlendObject != 0); - _Analysis_assume_(Data.pBlend[Index].pBlendObject != 0); - *ppState = Data.pBlend[Index].pBlendObject; - SAFE_ADDREF(*ppState); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TBlendVariable::SetBlendState(uint32_t Index, ID3D11BlendState *pState) -{ - static LPCSTR pFuncName = "ID3DX11EffectBlendState::SetBlendState"; - - CHECK_SCALAR_BOUNDS(Index); - - if( !Data.pBlend[Index].IsUserManaged ) - { - // Save original state object in case we UndoSet - assert( pMemberData[Index].Type == MDT_BlendState ); - VB( pMemberData[Index].Data.pD3DEffectsManagedBlendState == nullptr ); - pMemberData[Index].Data.pD3DEffectsManagedBlendState = Data.pBlend[Index].pBlendObject; - Data.pBlend[Index].pBlendObject = nullptr; - Data.pBlend[Index].IsUserManaged = true; - } - - SAFE_ADDREF( pState ); - SAFE_RELEASE( Data.pBlend[Index].pBlendObject ); - Data.pBlend[Index].pBlendObject = pState; - Data.pBlend[Index].IsValid = true; -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TBlendVariable::UndoSetBlendState(uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11EffectBlendState::UndoSetBlendState"; - - CHECK_SCALAR_BOUNDS(Index); - - if( !Data.pBlend[Index].IsUserManaged ) - { - return S_FALSE; - } - - // Revert to original state object - SAFE_RELEASE( Data.pBlend[Index].pBlendObject ); - Data.pBlend[Index].pBlendObject = pMemberData[Index].Data.pD3DEffectsManagedBlendState; - pMemberData[Index].Data.pD3DEffectsManagedBlendState = nullptr; - Data.pBlend[Index].IsUserManaged = false; - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TBlendVariable::GetBackingStore(uint32_t Index, D3D11_BLEND_DESC *pBlendDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectBlendVariable::GetBackingStore"; - - CHECK_OBJECT_SCALAR_BOUNDS(Index, pBlendDesc); - - if( Data.pBlend[Index].IsUserManaged ) - { - if( Data.pBlend[Index].pBlendObject ) - { - Data.pBlend[Index].pBlendObject->GetDesc( pBlendDesc ); - } - else - { - *pBlendDesc = CD3D11_BLEND_DESC( D3D11_DEFAULT ); - } - } - else - { - SBlendBlock *pBlock = Data.pBlend + Index; - if (pBlock->ApplyAssignments(GetTopLevelEntity()->pEffect)) - { - pBlock->pAssignments[0].LastRecomputedTime = 0; // Force a recreate of this block the next time ApplyRenderStateBlock is called - } - - memcpy( pBlendDesc, &pBlock->BackingStore, sizeof(D3D11_BLEND_DESC) ); - } - -lExit: - return hr; -} - -template -bool TBlendVariable::IsValid() -{ - uint32_t numElements = IsArray()? pType->Elements : 1; - bool valid = true; - while( numElements > 0 && ( valid = Data.pBlend[ numElements-1 ].IsValid ) ) - numElements--; - return valid; -} - - -//////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectDepthStencilVariable (TDepthStencilVariable implementation) -//////////////////////////////////////////////////////////////////////////////// - -template -struct TDepthStencilVariable : public IBaseInterface -{ -public: - STDMETHOD(GetDepthStencilState)(_In_ uint32_t Index, _Outptr_ ID3D11DepthStencilState **ppState) override; - STDMETHOD(SetDepthStencilState)(_In_ uint32_t Index, _In_ ID3D11DepthStencilState *pState) override; - STDMETHOD(UndoSetDepthStencilState)(_In_ uint32_t Index) override; - STDMETHOD(GetBackingStore)(_In_ uint32_t Index, _Out_ D3D11_DEPTH_STENCIL_DESC *pDesc) override; - STDMETHOD_(bool, IsValid)() override; -}; - -template -_Use_decl_annotations_ -HRESULT TDepthStencilVariable::GetDepthStencilState(uint32_t Index, ID3D11DepthStencilState **ppState) -{ - static LPCSTR pFuncName = "ID3DX11EffectDepthStencilVariable::GetDepthStencilState"; - - CHECK_OBJECT_SCALAR_BOUNDS(Index, ppState); - - assert(Data.pDepthStencil[Index].pDSObject != 0); - _Analysis_assume_(Data.pDepthStencil[Index].pDSObject != 0); - *ppState = Data.pDepthStencil[Index].pDSObject; - SAFE_ADDREF(*ppState); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TDepthStencilVariable::SetDepthStencilState(uint32_t Index, ID3D11DepthStencilState *pState) -{ - static LPCSTR pFuncName = "ID3DX11EffectDepthStencilState::SetDepthStencilState"; - - CHECK_SCALAR_BOUNDS(Index); - - if( !Data.pDepthStencil[Index].IsUserManaged ) - { - // Save original state object in case we UndoSet - assert( pMemberData[Index].Type == MDT_DepthStencilState ); - VB( pMemberData[Index].Data.pD3DEffectsManagedDepthStencilState == nullptr ); - pMemberData[Index].Data.pD3DEffectsManagedDepthStencilState = Data.pDepthStencil[Index].pDSObject; - Data.pDepthStencil[Index].pDSObject = nullptr; - Data.pDepthStencil[Index].IsUserManaged = true; - } - - SAFE_ADDREF( pState ); - SAFE_RELEASE( Data.pDepthStencil[Index].pDSObject ); - Data.pDepthStencil[Index].pDSObject = pState; - Data.pDepthStencil[Index].IsValid = true; -lExit: - return hr; -} - -template -HRESULT TDepthStencilVariable::UndoSetDepthStencilState(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11EffectDepthStencilState::UndoSetDepthStencilState"; - - CHECK_SCALAR_BOUNDS(Index); - - if( !Data.pDepthStencil[Index].IsUserManaged ) - { - return S_FALSE; - } - - // Revert to original state object - SAFE_RELEASE( Data.pDepthStencil[Index].pDSObject ); - Data.pDepthStencil[Index].pDSObject = pMemberData[Index].Data.pD3DEffectsManagedDepthStencilState; - pMemberData[Index].Data.pD3DEffectsManagedDepthStencilState = nullptr; - Data.pDepthStencil[Index].IsUserManaged = false; - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TDepthStencilVariable::GetBackingStore(uint32_t Index, D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectDepthStencilVariable::GetBackingStore"; - - CHECK_OBJECT_SCALAR_BOUNDS(Index, pDepthStencilDesc); - - if( Data.pDepthStencil[Index].IsUserManaged ) - { - if( Data.pDepthStencil[Index].pDSObject ) - { - Data.pDepthStencil[Index].pDSObject->GetDesc( pDepthStencilDesc ); - } - else - { - *pDepthStencilDesc = CD3D11_DEPTH_STENCIL_DESC( D3D11_DEFAULT ); - } - } - else - { - SDepthStencilBlock *pBlock = Data.pDepthStencil + Index; - if (pBlock->ApplyAssignments(GetTopLevelEntity()->pEffect)) - { - pBlock->pAssignments[0].LastRecomputedTime = 0; // Force a recreate of this block the next time ApplyRenderStateBlock is called - } - - memcpy(pDepthStencilDesc, &pBlock->BackingStore, sizeof(D3D11_DEPTH_STENCIL_DESC)); - } - -lExit: - return hr; -} - -template -bool TDepthStencilVariable::IsValid() -{ - uint32_t numElements = IsArray()? pType->Elements : 1; - bool valid = true; - while( numElements > 0 && ( valid = Data.pDepthStencil[ numElements-1 ].IsValid ) ) - numElements--; - return valid; -} - -//////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectRasterizerVariable (TRasterizerVariable implementation) -//////////////////////////////////////////////////////////////////////////////// - -template -struct TRasterizerVariable : public IBaseInterface -{ -public: - - STDMETHOD(GetRasterizerState)(_In_ uint32_t Index, _Outptr_ ID3D11RasterizerState **ppState) override; - STDMETHOD(SetRasterizerState)(_In_ uint32_t Index, _In_ ID3D11RasterizerState *pState) override; - STDMETHOD(UndoSetRasterizerState)(_In_ uint32_t Index) override; - STDMETHOD(GetBackingStore)(_In_ uint32_t Index, _Out_ D3D11_RASTERIZER_DESC *pDesc) override; - STDMETHOD_(bool, IsValid)() override; -}; - -template -_Use_decl_annotations_ -HRESULT TRasterizerVariable::GetRasterizerState(uint32_t Index, ID3D11RasterizerState **ppState) -{ - static LPCSTR pFuncName = "ID3DX11EffectRasterizerVariable::GetRasterizerState"; - - CHECK_OBJECT_SCALAR_BOUNDS(Index, ppState); - - assert(Data.pRasterizer[Index].pRasterizerObject != 0); - _Analysis_assume_(Data.pRasterizer[Index].pRasterizerObject != 0); - *ppState = Data.pRasterizer[Index].pRasterizerObject; - SAFE_ADDREF(*ppState); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TRasterizerVariable::SetRasterizerState(uint32_t Index, ID3D11RasterizerState *pState) -{ - static LPCSTR pFuncName = "ID3DX11EffectRasterizerState::SetRasterizerState"; - - CHECK_SCALAR_BOUNDS(Index); - - if( !Data.pRasterizer[Index].IsUserManaged ) - { - // Save original state object in case we UndoSet - assert( pMemberData[Index].Type == MDT_RasterizerState ); - VB( pMemberData[Index].Data.pD3DEffectsManagedRasterizerState == nullptr ); - pMemberData[Index].Data.pD3DEffectsManagedRasterizerState = Data.pRasterizer[Index].pRasterizerObject; - Data.pRasterizer[Index].pRasterizerObject = nullptr; - Data.pRasterizer[Index].IsUserManaged = true; - } - - SAFE_ADDREF( pState ); - SAFE_RELEASE( Data.pRasterizer[Index].pRasterizerObject ); - Data.pRasterizer[Index].pRasterizerObject = pState; - Data.pRasterizer[Index].IsValid = true; -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TRasterizerVariable::UndoSetRasterizerState(uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11EffectRasterizerState::UndoSetRasterizerState"; - - CHECK_SCALAR_BOUNDS(Index); - - if( !Data.pRasterizer[Index].IsUserManaged ) - { - return S_FALSE; - } - - // Revert to original state object - SAFE_RELEASE( Data.pRasterizer[Index].pRasterizerObject ); - Data.pRasterizer[Index].pRasterizerObject = pMemberData[Index].Data.pD3DEffectsManagedRasterizerState; - pMemberData[Index].Data.pD3DEffectsManagedRasterizerState = nullptr; - Data.pRasterizer[Index].IsUserManaged = false; - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TRasterizerVariable::GetBackingStore(uint32_t Index, D3D11_RASTERIZER_DESC *pRasterizerDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectRasterizerVariable::GetBackingStore"; - - CHECK_OBJECT_SCALAR_BOUNDS(Index, pRasterizerDesc); - - if( Data.pRasterizer[Index].IsUserManaged ) - { - if( Data.pRasterizer[Index].pRasterizerObject ) - { - Data.pRasterizer[Index].pRasterizerObject->GetDesc( pRasterizerDesc ); - } - else - { - *pRasterizerDesc = CD3D11_RASTERIZER_DESC( D3D11_DEFAULT ); - } - } - else - { - SRasterizerBlock *pBlock = Data.pRasterizer + Index; - if (pBlock->ApplyAssignments(GetTopLevelEntity()->pEffect)) - { - pBlock->pAssignments[0].LastRecomputedTime = 0; // Force a recreate of this block the next time ApplyRenderStateBlock is called - } - - memcpy(pRasterizerDesc, &pBlock->BackingStore, sizeof(D3D11_RASTERIZER_DESC)); - } - -lExit: - return hr; -} - -template -bool TRasterizerVariable::IsValid() -{ - uint32_t numElements = IsArray()? pType->Elements : 1; - bool valid = true; - while( numElements > 0 && ( valid = Data.pRasterizer[ numElements-1 ].IsValid ) ) - numElements--; - return valid; -} - -//////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectSamplerVariable (TSamplerVariable implementation) -//////////////////////////////////////////////////////////////////////////////// - -template -struct TSamplerVariable : public IBaseInterface -{ -public: - - STDMETHOD(GetSampler)(_In_ uint32_t Index, _Outptr_ ID3D11SamplerState **ppSampler) override; - STDMETHOD(SetSampler)(_In_ uint32_t Index, _In_ ID3D11SamplerState *pSampler) override; - STDMETHOD(UndoSetSampler)(_In_ uint32_t Index) override; - STDMETHOD(GetBackingStore)(_In_ uint32_t Index, _Out_ D3D11_SAMPLER_DESC *pDesc) override; -}; - -template -_Use_decl_annotations_ -HRESULT TSamplerVariable::GetSampler(uint32_t Index, ID3D11SamplerState **ppSampler) -{ - static LPCSTR pFuncName = "ID3DX11EffectSamplerVariable::GetSampler"; - - CHECK_OBJECT_SCALAR_BOUNDS(Index, ppSampler); - - _Analysis_assume_( Data.pSampler[Index].pD3DObject != 0 ); - *ppSampler = Data.pSampler[Index].pD3DObject; - SAFE_ADDREF(*ppSampler); - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TSamplerVariable::SetSampler(uint32_t Index, ID3D11SamplerState *pSampler) -{ - static LPCSTR pFuncName = "ID3DX11EffectSamplerState::SetSampler"; - - CHECK_SCALAR_BOUNDS(Index); - - // Replace all references to the old shader block with this one - GetEffect()->ReplaceSamplerReference(&Data.pSampler[Index], pSampler); - - if( !Data.pSampler[Index].IsUserManaged ) - { - // Save original state object in case we UndoSet - assert( pMemberData[Index].Type == MDT_SamplerState ); - VB( pMemberData[Index].Data.pD3DEffectsManagedSamplerState == nullptr ); - pMemberData[Index].Data.pD3DEffectsManagedSamplerState = Data.pSampler[Index].pD3DObject; - Data.pSampler[Index].pD3DObject = nullptr; - Data.pSampler[Index].IsUserManaged = true; - } - - SAFE_ADDREF( pSampler ); - SAFE_RELEASE( Data.pSampler[Index].pD3DObject ); - Data.pSampler[Index].pD3DObject = pSampler; -lExit: - return hr; -} - -template -HRESULT TSamplerVariable::UndoSetSampler(_In_ uint32_t Index) -{ - static LPCSTR pFuncName = "ID3DX11EffectSamplerState::UndoSetSampler"; - - CHECK_SCALAR_BOUNDS(Index); - - if( !Data.pSampler[Index].IsUserManaged ) - { - return S_FALSE; - } - - // Replace all references to the old shader block with this one - GetEffect()->ReplaceSamplerReference(&Data.pSampler[Index], pMemberData[Index].Data.pD3DEffectsManagedSamplerState); - - // Revert to original state object - SAFE_RELEASE( Data.pSampler[Index].pD3DObject ); - Data.pSampler[Index].pD3DObject = pMemberData[Index].Data.pD3DEffectsManagedSamplerState; - pMemberData[Index].Data.pD3DEffectsManagedSamplerState = nullptr; - Data.pSampler[Index].IsUserManaged = false; - -lExit: - return hr; -} - -template -_Use_decl_annotations_ -HRESULT TSamplerVariable::GetBackingStore(uint32_t Index, D3D11_SAMPLER_DESC *pDesc) -{ - static LPCSTR pFuncName = "ID3DX11EffectSamplerVariable::GetBackingStore"; - - CHECK_OBJECT_SCALAR_BOUNDS(Index, pDesc); - - if( Data.pSampler[Index].IsUserManaged ) - { - if( Data.pSampler[Index].pD3DObject ) - { - Data.pSampler[Index].pD3DObject->GetDesc( pDesc ); - } - else - { - *pDesc = CD3D11_SAMPLER_DESC( D3D11_DEFAULT ); - } - } - else - { - SSamplerBlock *pBlock = Data.pSampler + Index; - if (pBlock->ApplyAssignments(GetTopLevelEntity()->pEffect)) - { - pBlock->pAssignments[0].LastRecomputedTime = 0; // Force a recreate of this block the next time ApplyRenderStateBlock is called - } - - memcpy(pDesc, &pBlock->BackingStore.SamplerDesc, sizeof(D3D11_SAMPLER_DESC)); - } - -lExit: - return hr; -} - -//////////////////////////////////////////////////////////////////////////////// -// TUncastableVariable -//////////////////////////////////////////////////////////////////////////////// - -template -struct TUncastableVariable : public IBaseInterface -{ - STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)() override; - STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)() override; - STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)() override; - STDMETHOD_(ID3DX11EffectStringVariable*, AsString)() override; - STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)() override; - STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)() override; - STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)() override; - STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)() override; - STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)() override; - STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)() override; - STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)() override; - STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)() override; - STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)() override; - STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)() override; - STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)() override; - STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)() override; -}; - -template -ID3DX11EffectScalarVariable * TUncastableVariable::AsScalar() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsScalar"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidScalarVariable; -} - -template -ID3DX11EffectVectorVariable * TUncastableVariable::AsVector() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsVector"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidVectorVariable; -} - -template -ID3DX11EffectMatrixVariable * TUncastableVariable::AsMatrix() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsMatrix"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidMatrixVariable; -} - -template -ID3DX11EffectStringVariable * TUncastableVariable::AsString() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsString"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidStringVariable; -} - -template -ID3DX11EffectClassInstanceVariable * TUncastableVariable::AsClassInstance() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsClassInstance"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidClassInstanceVariable; -} - -template -ID3DX11EffectInterfaceVariable * TUncastableVariable::AsInterface() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsInterface"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidInterfaceVariable; -} - -template -ID3DX11EffectShaderResourceVariable * TUncastableVariable::AsShaderResource() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsShaderResource"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidShaderResourceVariable; -} - -template -ID3DX11EffectUnorderedAccessViewVariable * TUncastableVariable::AsUnorderedAccessView() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsUnorderedAccessView"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidUnorderedAccessViewVariable; -} - -template -ID3DX11EffectRenderTargetViewVariable * TUncastableVariable::AsRenderTargetView() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsRenderTargetView"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidRenderTargetViewVariable; -} - -template -ID3DX11EffectDepthStencilViewVariable * TUncastableVariable::AsDepthStencilView() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsDepthStencilView"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidDepthStencilViewVariable; -} - -template -ID3DX11EffectConstantBuffer * TUncastableVariable::AsConstantBuffer() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsConstantBuffer"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidConstantBuffer; -} - -template -ID3DX11EffectShaderVariable * TUncastableVariable::AsShader() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsShader"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidShaderVariable; -} - -template -ID3DX11EffectBlendVariable * TUncastableVariable::AsBlend() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsBlend"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidBlendVariable; -} - -template -ID3DX11EffectDepthStencilVariable * TUncastableVariable::AsDepthStencil() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsDepthStencil"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidDepthStencilVariable; -} - -template -ID3DX11EffectRasterizerVariable * TUncastableVariable::AsRasterizer() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsRasterizer"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidRasterizerVariable; -} - -template -ID3DX11EffectSamplerVariable * TUncastableVariable::AsSampler() -{ - static LPCSTR pFuncName = "ID3DX11EffectVariable::AsSampler"; - DPF(0, "%s: Invalid typecast", pFuncName); - return &g_InvalidSamplerVariable; -} - -//////////////////////////////////////////////////////////////////////////////// -// Macros to instantiate the myriad templates -//////////////////////////////////////////////////////////////////////////////// - -// generates a global variable, annotation, global variable member, and annotation member of each struct type -#define GenerateReflectionClasses(Type, BaseInterface) \ -struct S##Type##GlobalVariable : public T##Type##Variable, false> { IUNKNOWN_IMP(S##Type##GlobalVariable, BaseInterface, ID3DX11EffectVariable); }; \ -struct S##Type##Annotation : public T##Type##Variable, true> { IUNKNOWN_IMP(S##Type##Annotation, BaseInterface, ID3DX11EffectVariable);}; \ -struct S##Type##GlobalVariableMember : public T##Type##Variable >, false> { IUNKNOWN_IMP(S##Type##GlobalVariableMember, BaseInterface, ID3DX11EffectVariable); }; \ -struct S##Type##AnnotationMember : public T##Type##Variable >, true> { IUNKNOWN_IMP(S##Type##AnnotationMember, BaseInterface, ID3DX11EffectVariable); }; - -#define GenerateVectorReflectionClasses(Type, BaseType, BaseInterface) \ -struct S##Type##GlobalVariable : public TVectorVariable, false, BaseType> { IUNKNOWN_IMP(S##Type##GlobalVariable, BaseInterface, ID3DX11EffectVariable); }; \ -struct S##Type##Annotation : public TVectorVariable, true, BaseType> { IUNKNOWN_IMP(S##Type##Annotation, BaseInterface, ID3DX11EffectVariable);}; \ -struct S##Type##GlobalVariableMember : public TVectorVariable >, false, BaseType> { IUNKNOWN_IMP(S##Type##GlobalVariableMember, BaseInterface, ID3DX11EffectVariable);}; \ -struct S##Type##AnnotationMember : public TVectorVariable >, true, BaseType> { IUNKNOWN_IMP(S##Type##AnnotationMember, BaseInterface, ID3DX11EffectVariable);}; - -#define GenerateReflectionGlobalOnlyClasses(Type) \ -struct S##Type##GlobalVariable : public T##Type##Variable > { IUNKNOWN_IMP(S##Type##GlobalVariable, ID3DX11Effect##Type##Variable, ID3DX11EffectVariable); }; \ -struct S##Type##GlobalVariableMember : public T##Type##Variable > > { IUNKNOWN_IMP(S##Type##GlobalVariableMember, ID3DX11Effect##Type##Variable, ID3DX11EffectVariable); }; \ - -GenerateReflectionClasses(Numeric, ID3DX11EffectVariable); -GenerateReflectionClasses(FloatScalar, ID3DX11EffectScalarVariable); -GenerateReflectionClasses(IntScalar, ID3DX11EffectScalarVariable); -GenerateReflectionClasses(BoolScalar, ID3DX11EffectScalarVariable); -GenerateVectorReflectionClasses(FloatVector, ETVT_Float, ID3DX11EffectVectorVariable); -GenerateVectorReflectionClasses(BoolVector, ETVT_Bool, ID3DX11EffectVectorVariable); -GenerateVectorReflectionClasses(IntVector, ETVT_Int, ID3DX11EffectVectorVariable); -GenerateReflectionClasses(Matrix, ID3DX11EffectMatrixVariable); -GenerateReflectionClasses(String, ID3DX11EffectStringVariable); -GenerateReflectionGlobalOnlyClasses(ClassInstance); -GenerateReflectionGlobalOnlyClasses(Interface); -GenerateReflectionGlobalOnlyClasses(ShaderResource); -GenerateReflectionGlobalOnlyClasses(UnorderedAccessView); -GenerateReflectionGlobalOnlyClasses(RenderTargetView); -GenerateReflectionGlobalOnlyClasses(DepthStencilView); -GenerateReflectionGlobalOnlyClasses(Shader); -GenerateReflectionGlobalOnlyClasses(Blend); -GenerateReflectionGlobalOnlyClasses(DepthStencil); -GenerateReflectionGlobalOnlyClasses(Rasterizer); -GenerateReflectionGlobalOnlyClasses(Sampler); - -// Optimized matrix classes -struct SMatrix4x4ColumnMajorGlobalVariable : public TMatrix4x4Variable, true> { IUNKNOWN_IMP(SMatrix4x4ColumnMajorGlobalVariable, ID3DX11EffectMatrixVariable, ID3DX11EffectVariable); }; -struct SMatrix4x4RowMajorGlobalVariable : public TMatrix4x4Variable, false> { IUNKNOWN_IMP(SMatrix4x4RowMajorGlobalVariable, ID3DX11EffectMatrixVariable, ID3DX11EffectVariable); }; - -struct SMatrix4x4ColumnMajorGlobalVariableMember : public TMatrix4x4Variable >, true> { IUNKNOWN_IMP(SMatrix4x4ColumnMajorGlobalVariableMember, ID3DX11EffectMatrixVariable, ID3DX11EffectVariable); }; -struct SMatrix4x4RowMajorGlobalVariableMember : public TMatrix4x4Variable >, false> { IUNKNOWN_IMP(SMatrix4x4RowMajorGlobalVariableMember, ID3DX11EffectMatrixVariable, ID3DX11EffectVariable); }; - -// Optimized vector classes -struct SFloatVector4GlobalVariable : public TVector4Variable > { IUNKNOWN_IMP(SFloatVector4GlobalVariable, ID3DX11EffectVectorVariable, ID3DX11EffectVariable); }; -struct SFloatVector4GlobalVariableMember : public TVector4Variable > > { IUNKNOWN_IMP(SFloatVector4GlobalVariableMember, ID3DX11EffectVectorVariable, ID3DX11EffectVariable); }; - -// These 3 classes should never be used directly - -// The "base" global variable struct (all global variables should be the same size in bytes, -// but we pick this as the default). -struct SGlobalVariable : public TGlobalVariable -{ - -}; - -// The "base" annotation struct (all annotations should be the same size in bytes, -// but we pick this as the default). -struct SAnnotation : public TAnnotation -{ - -}; - -// The "base" variable member struct (all annotation/global variable members should be the -// same size in bytes, but we pick this as the default). -struct SMember : public TVariable > -{ - -}; - -// creates a new variable of the appropriate polymorphic type where pVar was -HRESULT PlacementNewVariable(_In_ void *pVar, _In_ SType *pType, _In_ bool IsAnnotation); -SMember * CreateNewMember(_In_ SType *pType, _In_ bool IsAnnotation); - -#pragma warning(pop) diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/inc/d3dx11effect.h kodi-15.2~git20151019.1039-final/lib/win32/Effects11/inc/d3dx11effect.h --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/inc/d3dx11effect.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/inc/d3dx11effect.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,1231 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: D3DX11Effect.h -// -// Direct3D 11 Effect Types & APIs Header -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma once - -#define D3DX11_EFFECTS_VERSION 1111 - -#if defined(_XBOX_ONE) && defined(_TITLE) -#include -#define DCOMMON_H_INCLUDED -#define NO_D3D11_DEBUG_NAME -#elif (_WIN32_WINNT >= 0x0602) || defined(_WIN7_PLATFORM_UPDATE) -#include -#include -#else -#include -#include -#endif - -#pragma comment( lib, "d3dcompiler.lib" ) -#pragma comment( lib, "dxguid.lib" ) - -// VS 2010's stdint.h conflicts with intsafe.h -#pragma warning(push) -#pragma warning(disable : 4005) -#include -#pragma warning(pop) - -#if defined(_MSC_VER) && (_MSC_VER<1610) && !defined(_In_reads_) -#define _Analysis_assume_(exp) __analysis_assume(exp) -#define _In_reads_(exp) _In_count_x_(exp) -#define _In_reads_opt_(exp) _In_opt_count_x_(exp) -#define _In_reads_bytes_(exp) _In_bytecount_x_(exp) -#define _Inout_updates_(exp) _Inout_cap_x_(exp) -#define _Inout_updates_z_(exp) _Inout_z_cap_x_(exp) -#define _Inout_updates_bytes_(exp) _Inout_bytecap_x_(exp) -#define _Out_writes_(exp) _Out_cap_x_(exp) -#define _Out_writes_bytes_(exp) _Out_bytecap_x_(exp) -#define _Outptr_ _Deref_out_ -#define _Outptr_result_z_ _Deref_out_z_ -#define _Outptr_opt_result_maybenull_ _Deref_opt_out_opt_ -#define _Outptr_result_maybenull_z_ _Deref_opt_out_opt_z_ -#define _Outptr_result_buffer_(exp) _Deref_post_cap_x_(exp) -#define _Outptr_result_buffer_all_maybenull_(exp) _Deref_post_opt_cap_x_(exp) -#define _COM_Outptr_ _Deref_out_ -#define _When_(test,exp) -#endif - -#ifndef _Use_decl_annotations_ -#define _Use_decl_annotations_ -#endif - -////////////////////////////////////////////////////////////////////////////// -// File contents: -// -// 1) Stateblock enums, structs, interfaces, flat APIs -// 2) Effect enums, structs, interfaces, flat APIs -////////////////////////////////////////////////////////////////////////////// - -#ifndef D3DX11_BYTES_FROM_BITS -#define D3DX11_BYTES_FROM_BITS(x) (((x) + 7) / 8) -#endif // D3DX11_BYTES_FROM_BITS - -#ifndef D3DERR_INVALIDCALL -#define D3DERR_INVALIDCALL MAKE_HRESULT( 1, 0x876, 2156 ) -#endif - -struct D3DX11_STATE_BLOCK_MASK -{ - uint8_t VS; - uint8_t VSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)]; - uint8_t VSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)]; - uint8_t VSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)]; - uint8_t VSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)]; - - uint8_t HS; - uint8_t HSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)]; - uint8_t HSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)]; - uint8_t HSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)]; - uint8_t HSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)]; - - uint8_t DS; - uint8_t DSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)]; - uint8_t DSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)]; - uint8_t DSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)]; - uint8_t DSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)]; - - uint8_t GS; - uint8_t GSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)]; - uint8_t GSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)]; - uint8_t GSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)]; - uint8_t GSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)]; - - uint8_t PS; - uint8_t PSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)]; - uint8_t PSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)]; - uint8_t PSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)]; - uint8_t PSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)]; - uint8_t PSUnorderedAccessViews; - - uint8_t CS; - uint8_t CSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)]; - uint8_t CSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)]; - uint8_t CSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)]; - uint8_t CSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)]; - uint8_t CSUnorderedAccessViews; - - uint8_t IAVertexBuffers[D3DX11_BYTES_FROM_BITS(D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT)]; - uint8_t IAIndexBuffer; - uint8_t IAInputLayout; - uint8_t IAPrimitiveTopology; - - uint8_t OMRenderTargets; - uint8_t OMDepthStencilState; - uint8_t OMBlendState; - - uint8_t RSViewports; - uint8_t RSScissorRects; - uint8_t RSRasterizerState; - - uint8_t SOBuffers; - - uint8_t Predication; -}; - -//---------------------------------------------------------------------------- -// D3DX11_EFFECT flags: -// ------------------------------------- -// -// These flags are passed in when creating an effect, and affect -// the runtime effect behavior: -// -// (Currently none) -// -// -// These flags are set by the effect runtime: -// -// D3DX11_EFFECT_OPTIMIZED -// This effect has been optimized. Reflection functions that rely on -// names/semantics/strings should fail. This is set when Optimize() is -// called, but CEffect::IsOptimized() should be used to test for this. -// -// D3DX11_EFFECT_CLONE -// This effect is a clone of another effect. Single CBs will never be -// updated when internal variable values are changed. -// This flag is not set when the D3DX11_EFFECT_CLONE_FORCE_NONSINGLE flag -// is used in cloning. -// -//---------------------------------------------------------------------------- - -#define D3DX11_EFFECT_OPTIMIZED (1 << 21) -#define D3DX11_EFFECT_CLONE (1 << 22) - -// Mask of valid D3DCOMPILE_EFFECT flags for D3DX11CreateEffect* -#define D3DX11_EFFECT_RUNTIME_VALID_FLAGS (0) - -//---------------------------------------------------------------------------- -// D3DX11_EFFECT_VARIABLE flags: -// ---------------------------- -// -// These flags describe an effect variable (global or annotation), -// and are returned in D3DX11_EFFECT_VARIABLE_DESC::Flags. -// -// D3DX11_EFFECT_VARIABLE_ANNOTATION -// Indicates that this is an annotation on a technique, pass, or global -// variable. Otherwise, this is a global variable. Annotations cannot -// be shared. -// -// D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT -// Indicates that the variable has been explicitly bound using the -// register keyword. -//---------------------------------------------------------------------------- - -#define D3DX11_EFFECT_VARIABLE_ANNOTATION (1 << 1) -#define D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT (1 << 2) - -//---------------------------------------------------------------------------- -// D3DX11_EFFECT_CLONE flags: -// ---------------------------- -// -// These flags modify the effect cloning process and are passed into Clone. -// -// D3DX11_EFFECT_CLONE_FORCE_NONSINGLE -// Ignore all "single" qualifiers on cbuffers. All cbuffers will have their -// own ID3D11Buffer's created in the cloned effect. -//---------------------------------------------------------------------------- - -#define D3DX11_EFFECT_CLONE_FORCE_NONSINGLE (1 << 0) - - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectType ////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DX11_EFFECT_TYPE_DESC: -// -// Retrieved by ID3DX11EffectType::GetDesc() -//---------------------------------------------------------------------------- - -struct D3DX11_EFFECT_TYPE_DESC -{ - LPCSTR TypeName; // Name of the type - // (e.g. "float4" or "MyStruct") - - D3D_SHADER_VARIABLE_CLASS Class; // (e.g. scalar, vector, object, etc.) - D3D_SHADER_VARIABLE_TYPE Type; // (e.g. float, texture, vertexshader, etc.) - - uint32_t Elements; // Number of elements in this type - // (0 if not an array) - uint32_t Members; // Number of members - // (0 if not a structure) - uint32_t Rows; // Number of rows in this type - // (0 if not a numeric primitive) - uint32_t Columns; // Number of columns in this type - // (0 if not a numeric primitive) - - uint32_t PackedSize; // Number of bytes required to represent - // this data type, when tightly packed - uint32_t UnpackedSize; // Number of bytes occupied by this data - // type, when laid out in a constant buffer - uint32_t Stride; // Number of bytes to seek between elements, - // when laid out in a constant buffer -}; - -typedef interface ID3DX11EffectType ID3DX11EffectType; -typedef interface ID3DX11EffectType *LPD3D11EFFECTTYPE; - -// {4250D721-D5E5-491F-B62B-587C43186285} -DEFINE_GUID(IID_ID3DX11EffectType, - 0x4250d721, 0xd5e5, 0x491f, 0xb6, 0x2b, 0x58, 0x7c, 0x43, 0x18, 0x62, 0x85); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectType - -DECLARE_INTERFACE_(ID3DX11EffectType, IUnknown) -{ - // IUnknown - - // ID3DX11EffectType - STDMETHOD_(bool, IsValid)(THIS) PURE; - STDMETHOD(GetDesc)(THIS_ _Out_ D3DX11_EFFECT_TYPE_DESC *pDesc) PURE; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(THIS_ _In_z_ LPCSTR Name) PURE; - STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(THIS_ _In_z_ LPCSTR Semantic) PURE; - STDMETHOD_(LPCSTR, GetMemberName)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(LPCSTR, GetMemberSemantic)(THIS_ _In_ uint32_t Index) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectVariable ////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DX11_EFFECT_VARIABLE_DESC: -// -// Retrieved by ID3DX11EffectVariable::GetDesc() -//---------------------------------------------------------------------------- - -struct D3DX11_EFFECT_VARIABLE_DESC -{ - LPCSTR Name; // Name of this variable, annotation, - // or structure member - LPCSTR Semantic; // Semantic string of this variable - // or structure member (nullptr for - // annotations or if not present) - - uint32_t Flags; // D3DX11_EFFECT_VARIABLE_* flags - uint32_t Annotations; // Number of annotations on this variable - // (always 0 for annotations) - - uint32_t BufferOffset; // Offset into containing cbuffer or tbuffer - // (always 0 for annotations or variables - // not in constant buffers) - - uint32_t ExplicitBindPoint; // Used if the variable has been explicitly bound - // using the register keyword. Check Flags for - // D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT; -}; - -typedef interface ID3DX11EffectVariable ID3DX11EffectVariable; -typedef interface ID3DX11EffectVariable *LPD3D11EFFECTVARIABLE; - -// {036A777D-B56E-4B25-B313-CC3DDAB71873} -DEFINE_GUID(IID_ID3DX11EffectVariable, - 0x036a777d, 0xb56e, 0x4b25, 0xb3, 0x13, 0xcc, 0x3d, 0xda, 0xb7, 0x18, 0x73); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectVariable - -// Forward defines -typedef interface ID3DX11EffectScalarVariable ID3DX11EffectScalarVariable; -typedef interface ID3DX11EffectVectorVariable ID3DX11EffectVectorVariable; -typedef interface ID3DX11EffectMatrixVariable ID3DX11EffectMatrixVariable; -typedef interface ID3DX11EffectStringVariable ID3DX11EffectStringVariable; -typedef interface ID3DX11EffectClassInstanceVariable ID3DX11EffectClassInstanceVariable; -typedef interface ID3DX11EffectInterfaceVariable ID3DX11EffectInterfaceVariable; -typedef interface ID3DX11EffectShaderResourceVariable ID3DX11EffectShaderResourceVariable; -typedef interface ID3DX11EffectUnorderedAccessViewVariable ID3DX11EffectUnorderedAccessViewVariable; -typedef interface ID3DX11EffectRenderTargetViewVariable ID3DX11EffectRenderTargetViewVariable; -typedef interface ID3DX11EffectDepthStencilViewVariable ID3DX11EffectDepthStencilViewVariable; -typedef interface ID3DX11EffectConstantBuffer ID3DX11EffectConstantBuffer; -typedef interface ID3DX11EffectShaderVariable ID3DX11EffectShaderVariable; -typedef interface ID3DX11EffectBlendVariable ID3DX11EffectBlendVariable; -typedef interface ID3DX11EffectDepthStencilVariable ID3DX11EffectDepthStencilVariable; -typedef interface ID3DX11EffectRasterizerVariable ID3DX11EffectRasterizerVariable; -typedef interface ID3DX11EffectSamplerVariable ID3DX11EffectSamplerVariable; - -DECLARE_INTERFACE_(ID3DX11EffectVariable, IUnknown) -{ - // IUnknown - - // ID3DX11EffectVariable - STDMETHOD_(bool, IsValid)(THIS) PURE; - STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE; - STDMETHOD(GetDesc)(THIS_ _Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE; - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ _In_z_ LPCSTR Name) PURE; - - STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ _In_z_ LPCSTR Name) PURE; - STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ _In_z_ LPCSTR Semantic) PURE; - - STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ _In_ uint32_t Index) PURE; - - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE; - - STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE; - STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE; - STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE; - STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE; - STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE; - STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE; - STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE; - STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE; - STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE; - STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE; - STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE; - STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE; - STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE; - STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE; - STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE; - STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE; - - STDMETHOD(SetRawValue)(THIS_ _In_reads_bytes_(ByteCount) const void *pData, _In_ uint32_t ByteOffset, _In_ uint32_t ByteCount) PURE; - STDMETHOD(GetRawValue)(THIS_ _Out_writes_bytes_(ByteCount) void *pData, _In_ uint32_t ByteOffset, _In_ uint32_t ByteCount) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectScalarVariable //////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectScalarVariable ID3DX11EffectScalarVariable; -typedef interface ID3DX11EffectScalarVariable *LPD3D11EFFECTSCALARVARIABLE; - -// {921EF2E5-A65D-4E92-9FC6-4E9CC09A4ADE} -DEFINE_GUID(IID_ID3DX11EffectScalarVariable, - 0x921ef2e5, 0xa65d, 0x4e92, 0x9f, 0xc6, 0x4e, 0x9c, 0xc0, 0x9a, 0x4a, 0xde); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectScalarVariable - -DECLARE_INTERFACE_(ID3DX11EffectScalarVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectScalarVariable - STDMETHOD(SetFloat)(THIS_ _In_ const float Value) PURE; - STDMETHOD(GetFloat)(THIS_ _Out_ float *pValue) PURE; - - STDMETHOD(SetFloatArray)(THIS_ _In_reads_(Count) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetFloatArray)(THIS_ _Out_writes_(Count) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - - STDMETHOD(SetInt)(THIS_ _In_ const int Value) PURE; - STDMETHOD(GetInt)(THIS_ _Out_ int *pValue) PURE; - - STDMETHOD(SetIntArray)(THIS_ _In_reads_(Count) const int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetIntArray)(THIS_ _Out_writes_(Count) int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - - STDMETHOD(SetBool)(THIS_ _In_ const bool Value) PURE; - STDMETHOD(GetBool)(THIS_ _Out_ bool *pValue) PURE; - - STDMETHOD(SetBoolArray)(THIS_ _In_reads_(Count) const bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetBoolArray)(THIS_ _Out_writes_(Count) bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectVectorVariable //////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectVectorVariable ID3DX11EffectVectorVariable; -typedef interface ID3DX11EffectVectorVariable *LPD3D11EFFECTVECTORVARIABLE; - -// {5E785D4A-D87B-48D8-B6E6-0F8CA7E7467A} -DEFINE_GUID(IID_ID3DX11EffectVectorVariable, - 0x5e785d4a, 0xd87b, 0x48d8, 0xb6, 0xe6, 0x0f, 0x8c, 0xa7, 0xe7, 0x46, 0x7a); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectVectorVariable - -DECLARE_INTERFACE_(ID3DX11EffectVectorVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectVectorVariable - STDMETHOD(SetBoolVector) (THIS_ _In_reads_(4) const bool *pData) PURE; - STDMETHOD(SetIntVector) (THIS_ _In_reads_(4) const int *pData) PURE; - STDMETHOD(SetFloatVector)(THIS_ _In_reads_(4) const float *pData) PURE; - - STDMETHOD(GetBoolVector) (THIS_ _Out_writes_(4) bool *pData) PURE; - STDMETHOD(GetIntVector) (THIS_ _Out_writes_(4) int *pData) PURE; - STDMETHOD(GetFloatVector)(THIS_ _Out_writes_(4) float *pData) PURE; - - STDMETHOD(SetBoolVectorArray) (THIS_ _In_reads_(Count*4) const bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(SetIntVectorArray) (THIS_ _In_reads_(Count*4) const int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(SetFloatVectorArray)(THIS_ _In_reads_(Count*4) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - - STDMETHOD(GetBoolVectorArray) (THIS_ _Out_writes_(Count*4) bool *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetIntVectorArray) (THIS_ _Out_writes_(Count*4) int *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetFloatVectorArray)(THIS_ _Out_writes_(Count*4) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectMatrixVariable //////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectMatrixVariable ID3DX11EffectMatrixVariable; -typedef interface ID3DX11EffectMatrixVariable *LPD3D11EFFECTMATRIXVARIABLE; - -// {E1096CF4-C027-419A-8D86-D29173DC803E} -DEFINE_GUID(IID_ID3DX11EffectMatrixVariable, - 0xe1096cf4, 0xc027, 0x419a, 0x8d, 0x86, 0xd2, 0x91, 0x73, 0xdc, 0x80, 0x3e); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectMatrixVariable - -DECLARE_INTERFACE_(ID3DX11EffectMatrixVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectMatrixVariable - STDMETHOD(SetMatrix)(THIS_ _In_reads_(16) const float *pData) PURE; - STDMETHOD(GetMatrix)(THIS_ _Out_writes_(16) float *pData) PURE; - - STDMETHOD(SetMatrixArray)(THIS_ _In_reads_(Count*16) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetMatrixArray)(THIS_ _Out_writes_(Count*16) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - - STDMETHOD(SetMatrixPointerArray)(_In_reads_(Count*16) const float **ppData, uint32_t Offset, uint32_t Count) PURE; - STDMETHOD(GetMatrixPointerArray)(_Out_writes_(Count*16) float **ppData, uint32_t Offset, uint32_t Count) PURE; - - STDMETHOD(SetMatrixTranspose)(THIS_ _In_reads_(16) const float *pData) PURE; - STDMETHOD(GetMatrixTranspose)(THIS_ _Out_writes_(16) float *pData) PURE; - - STDMETHOD(SetMatrixTransposeArray)(THIS_ _In_reads_(Count*16) const float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetMatrixTransposeArray)(THIS_ _Out_writes_(Count*16) float *pData, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - - STDMETHOD(SetMatrixTransposePointerArray)(_In_reads_(Count*16) const float **ppData, uint32_t Offset, uint32_t Count) PURE; - STDMETHOD(GetMatrixTransposePointerArray)(_Out_writes_(Count*16) float **ppData, uint32_t Offset, uint32_t Count) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectStringVariable //////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectStringVariable ID3DX11EffectStringVariable; -typedef interface ID3DX11EffectStringVariable *LPD3D11EFFECTSTRINGVARIABLE; - -// {F355C818-01BE-4653-A7CC-60FFFEDDC76D} -DEFINE_GUID(IID_ID3DX11EffectStringVariable, - 0xf355c818, 0x01be, 0x4653, 0xa7, 0xcc, 0x60, 0xff, 0xfe, 0xdd, 0xc7, 0x6d); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectStringVariable - -DECLARE_INTERFACE_(ID3DX11EffectStringVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectStringVariable - STDMETHOD(GetString)(THIS_ _Outptr_result_z_ LPCSTR *ppString) PURE; - STDMETHOD(GetStringArray)(THIS_ _Out_writes_(Count) LPCSTR *ppStrings, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectClassInstanceVariable //////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectClassInstanceVariable ID3DX11EffectClassInstanceVariable; -typedef interface ID3DX11EffectClassInstanceVariable *LPD3D11EFFECTCLASSINSTANCEVARIABLE; - -// {926A8053-2A39-4DB4-9BDE-CF649ADEBDC1} -DEFINE_GUID(IID_ID3DX11EffectClassInstanceVariable, - 0x926a8053, 0x2a39, 0x4db4, 0x9b, 0xde, 0xcf, 0x64, 0x9a, 0xde, 0xbd, 0xc1); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectClassInstanceVariable - -DECLARE_INTERFACE_(ID3DX11EffectClassInstanceVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectClassInstanceVariable - STDMETHOD(GetClassInstance)(_Outptr_ ID3D11ClassInstance** ppClassInstance) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectInterfaceVariable //////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectInterfaceVariable ID3DX11EffectInterfaceVariable; -typedef interface ID3DX11EffectInterfaceVariable *LPD3D11EFFECTINTERFACEVARIABLE; - -// {516C8CD8-1C80-40A4-B19B-0688792F11A5} -DEFINE_GUID(IID_ID3DX11EffectInterfaceVariable, - 0x516c8cd8, 0x1c80, 0x40a4, 0xb1, 0x9b, 0x06, 0x88, 0x79, 0x2f, 0x11, 0xa5); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectInterfaceVariable - -DECLARE_INTERFACE_(ID3DX11EffectInterfaceVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectInterfaceVariable - STDMETHOD(SetClassInstance)(_In_ ID3DX11EffectClassInstanceVariable *pEffectClassInstance) PURE; - STDMETHOD(GetClassInstance)(_Outptr_ ID3DX11EffectClassInstanceVariable **ppEffectClassInstance) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectShaderResourceVariable //////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectShaderResourceVariable ID3DX11EffectShaderResourceVariable; -typedef interface ID3DX11EffectShaderResourceVariable *LPD3D11EFFECTSHADERRESOURCEVARIABLE; - -// {350DB233-BBE0-485C-9BFE-C0026B844F89} -DEFINE_GUID(IID_ID3DX11EffectShaderResourceVariable, - 0x350db233, 0xbbe0, 0x485c, 0x9b, 0xfe, 0xc0, 0x02, 0x6b, 0x84, 0x4f, 0x89); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectShaderResourceVariable - -DECLARE_INTERFACE_(ID3DX11EffectShaderResourceVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectShaderResourceVariable - STDMETHOD(SetResource)(THIS_ _In_ ID3D11ShaderResourceView *pResource) PURE; - STDMETHOD(GetResource)(THIS_ _Outptr_ ID3D11ShaderResourceView **ppResource) PURE; - - STDMETHOD(SetResourceArray)(THIS_ _In_reads_(Count) ID3D11ShaderResourceView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetResourceArray)(THIS_ _Out_writes_(Count) ID3D11ShaderResourceView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectUnorderedAccessViewVariable //////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectUnorderedAccessViewVariable ID3DX11EffectUnorderedAccessViewVariable; -typedef interface ID3DX11EffectUnorderedAccessViewVariable *LPD3D11EFFECTUNORDEREDACCESSVIEWVARIABLE; - -// {79B4AC8C-870A-47D2-B05A-8BD5CC3EE6C9} -DEFINE_GUID(IID_ID3DX11EffectUnorderedAccessViewVariable, - 0x79b4ac8c, 0x870a, 0x47d2, 0xb0, 0x5a, 0x8b, 0xd5, 0xcc, 0x3e, 0xe6, 0xc9); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectUnorderedAccessViewVariable - -DECLARE_INTERFACE_(ID3DX11EffectUnorderedAccessViewVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectUnorderedAccessViewVariable - STDMETHOD(SetUnorderedAccessView)(THIS_ _In_ ID3D11UnorderedAccessView *pResource) PURE; - STDMETHOD(GetUnorderedAccessView)(THIS_ _Outptr_ ID3D11UnorderedAccessView **ppResource) PURE; - - STDMETHOD(SetUnorderedAccessViewArray)(THIS_ _In_reads_(Count) ID3D11UnorderedAccessView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetUnorderedAccessViewArray)(THIS_ _Out_writes_(Count) ID3D11UnorderedAccessView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectRenderTargetViewVariable ////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectRenderTargetViewVariable ID3DX11EffectRenderTargetViewVariable; -typedef interface ID3DX11EffectRenderTargetViewVariable *LPD3D11EFFECTRENDERTARGETVIEWVARIABLE; - -// {D5066909-F40C-43F8-9DB5-057C2A208552} -DEFINE_GUID(IID_ID3DX11EffectRenderTargetViewVariable, - 0xd5066909, 0xf40c, 0x43f8, 0x9d, 0xb5, 0x05, 0x7c, 0x2a, 0x20, 0x85, 0x52); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectRenderTargetViewVariable - -DECLARE_INTERFACE_(ID3DX11EffectRenderTargetViewVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectRenderTargetViewVariable - STDMETHOD(SetRenderTarget)(THIS_ _In_ ID3D11RenderTargetView *pResource) PURE; - STDMETHOD(GetRenderTarget)(THIS_ _Outptr_ ID3D11RenderTargetView **ppResource) PURE; - - STDMETHOD(SetRenderTargetArray)(THIS_ _In_reads_(Count) ID3D11RenderTargetView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetRenderTargetArray)(THIS_ _Out_writes_(Count) ID3D11RenderTargetView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectDepthStencilViewVariable ////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectDepthStencilViewVariable ID3DX11EffectDepthStencilViewVariable; -typedef interface ID3DX11EffectDepthStencilViewVariable *LPD3D11EFFECTDEPTHSTENCILVIEWVARIABLE; - -// {33C648AC-2E9E-4A2E-9CD6-DE31ACC5B347} -DEFINE_GUID(IID_ID3DX11EffectDepthStencilViewVariable, - 0x33c648ac, 0x2e9e, 0x4a2e, 0x9c, 0xd6, 0xde, 0x31, 0xac, 0xc5, 0xb3, 0x47); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectDepthStencilViewVariable - -DECLARE_INTERFACE_(ID3DX11EffectDepthStencilViewVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectDepthStencilViewVariable - STDMETHOD(SetDepthStencil)(THIS_ _In_ ID3D11DepthStencilView *pResource) PURE; - STDMETHOD(GetDepthStencil)(THIS_ _Outptr_ ID3D11DepthStencilView **ppResource) PURE; - - STDMETHOD(SetDepthStencilArray)(THIS_ _In_reads_(Count) ID3D11DepthStencilView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; - STDMETHOD(GetDepthStencilArray)(THIS_ _Out_writes_(Count) ID3D11DepthStencilView **ppResources, _In_ uint32_t Offset, _In_ uint32_t Count) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectConstantBuffer //////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectConstantBuffer ID3DX11EffectConstantBuffer; -typedef interface ID3DX11EffectConstantBuffer *LPD3D11EFFECTCONSTANTBUFFER; - -// {2CB6C733-82D2-4000-B3DA-6219D9A99BF2} -DEFINE_GUID(IID_ID3DX11EffectConstantBuffer, - 0x2cb6c733, 0x82d2, 0x4000, 0xb3, 0xda, 0x62, 0x19, 0xd9, 0xa9, 0x9b, 0xf2); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectConstantBuffer - -DECLARE_INTERFACE_(ID3DX11EffectConstantBuffer, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectConstantBuffer - STDMETHOD(SetConstantBuffer)(THIS_ _In_ ID3D11Buffer *pConstantBuffer) PURE; - STDMETHOD(UndoSetConstantBuffer)(THIS) PURE; - STDMETHOD(GetConstantBuffer)(THIS_ _Outptr_ ID3D11Buffer **ppConstantBuffer) PURE; - - STDMETHOD(SetTextureBuffer)(THIS_ _In_ ID3D11ShaderResourceView *pTextureBuffer) PURE; - STDMETHOD(UndoSetTextureBuffer)(THIS) PURE; - STDMETHOD(GetTextureBuffer)(THIS_ _Outptr_ ID3D11ShaderResourceView **ppTextureBuffer) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectShaderVariable //////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DX11_EFFECT_SHADER_DESC: -// -// Retrieved by ID3DX11EffectShaderVariable::GetShaderDesc() -//---------------------------------------------------------------------------- - -struct D3DX11_EFFECT_SHADER_DESC -{ - const uint8_t *pInputSignature; // Passed into CreateInputLayout, - // valid on VS and GS only - - bool IsInline; // Is this an anonymous shader variable - // resulting from an inline shader assignment? - - - // -- The following fields are not valid after Optimize() -- - const uint8_t *pBytecode; // Shader bytecode - uint32_t BytecodeLength; - - LPCSTR SODecls[D3D11_SO_STREAM_COUNT]; // Stream out declaration string (for GS with SO) - uint32_t RasterizedStream; - - uint32_t NumInputSignatureEntries; // Number of entries in the input signature - uint32_t NumOutputSignatureEntries; // Number of entries in the output signature - uint32_t NumPatchConstantSignatureEntries; // Number of entries in the patch constant signature -}; - - -typedef interface ID3DX11EffectShaderVariable ID3DX11EffectShaderVariable; -typedef interface ID3DX11EffectShaderVariable *LPD3D11EFFECTSHADERVARIABLE; - -// {7508B344-020A-4EC7-9118-62CDD36C88D7} -DEFINE_GUID(IID_ID3DX11EffectShaderVariable, - 0x7508b344, 0x020a, 0x4ec7, 0x91, 0x18, 0x62, 0xcd, 0xd3, 0x6c, 0x88, 0xd7); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectShaderVariable - -DECLARE_INTERFACE_(ID3DX11EffectShaderVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectShaderVariable - STDMETHOD(GetShaderDesc)(THIS_ _In_ uint32_t ShaderIndex, _Out_ D3DX11_EFFECT_SHADER_DESC *pDesc) PURE; - - STDMETHOD(GetVertexShader)(THIS_ _In_ uint32_t ShaderIndex, _Outptr_ ID3D11VertexShader **ppVS) PURE; - STDMETHOD(GetGeometryShader)(THIS_ _In_ uint32_t ShaderIndex, _Outptr_ ID3D11GeometryShader **ppGS) PURE; - STDMETHOD(GetPixelShader)(THIS_ _In_ uint32_t ShaderIndex, _Outptr_ ID3D11PixelShader **ppPS) PURE; - STDMETHOD(GetHullShader)(THIS_ _In_ uint32_t ShaderIndex, _Outptr_ ID3D11HullShader **ppHS) PURE; - STDMETHOD(GetDomainShader)(THIS_ _In_ uint32_t ShaderIndex, _Outptr_ ID3D11DomainShader **ppDS) PURE; - STDMETHOD(GetComputeShader)(THIS_ _In_ uint32_t ShaderIndex, _Outptr_ ID3D11ComputeShader **ppCS) PURE; - - STDMETHOD(GetInputSignatureElementDesc)(THIS_ _In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) PURE; - STDMETHOD(GetOutputSignatureElementDesc)(THIS_ _In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) PURE; - STDMETHOD(GetPatchConstantSignatureElementDesc)(THIS_ _In_ uint32_t ShaderIndex, _In_ uint32_t Element, _Out_ D3D11_SIGNATURE_PARAMETER_DESC *pDesc) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectBlendVariable ///////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectBlendVariable ID3DX11EffectBlendVariable; -typedef interface ID3DX11EffectBlendVariable *LPD3D11EFFECTBLENDVARIABLE; - -// {D664F4D7-3B81-4805-B277-C1DF58C39F53} -DEFINE_GUID(IID_ID3DX11EffectBlendVariable, - 0xd664f4d7, 0x3b81, 0x4805, 0xb2, 0x77, 0xc1, 0xdf, 0x58, 0xc3, 0x9f, 0x53); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectBlendVariable - -DECLARE_INTERFACE_(ID3DX11EffectBlendVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectBlendVariable - STDMETHOD(GetBlendState)(THIS_ _In_ uint32_t Index, _Outptr_ ID3D11BlendState **ppState) PURE; - STDMETHOD(SetBlendState)(THIS_ _In_ uint32_t Index, _In_ ID3D11BlendState *pState) PURE; - STDMETHOD(UndoSetBlendState)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD(GetBackingStore)(THIS_ _In_ uint32_t Index, _Out_ D3D11_BLEND_DESC *pDesc) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectDepthStencilVariable ////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectDepthStencilVariable ID3DX11EffectDepthStencilVariable; -typedef interface ID3DX11EffectDepthStencilVariable *LPD3D11EFFECTDEPTHSTENCILVARIABLE; - -// {69B5751B-61A5-48E5-BD41-D93988111563} -DEFINE_GUID(IID_ID3DX11EffectDepthStencilVariable, - 0x69b5751b, 0x61a5, 0x48e5, 0xbd, 0x41, 0xd9, 0x39, 0x88, 0x11, 0x15, 0x63); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectDepthStencilVariable - -DECLARE_INTERFACE_(ID3DX11EffectDepthStencilVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectDepthStencilVariable - STDMETHOD(GetDepthStencilState)(THIS_ _In_ uint32_t Index, _Outptr_ ID3D11DepthStencilState **ppState) PURE; - STDMETHOD(SetDepthStencilState)(THIS_ _In_ uint32_t Index, _In_ ID3D11DepthStencilState *pState) PURE; - STDMETHOD(UndoSetDepthStencilState)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD(GetBackingStore)(THIS_ _In_ uint32_t Index, _Out_ D3D11_DEPTH_STENCIL_DESC *pDesc) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectRasterizerVariable //////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectRasterizerVariable ID3DX11EffectRasterizerVariable; -typedef interface ID3DX11EffectRasterizerVariable *LPD3D11EFFECTRASTERIZERVARIABLE; - -// {53A262F6-5F74-4151-A132-E3DD19A62C9D} -DEFINE_GUID(IID_ID3DX11EffectRasterizerVariable, - 0x53a262f6, 0x5f74, 0x4151, 0xa1, 0x32, 0xe3, 0xdd, 0x19, 0xa6, 0x2c, 0x9d); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectRasterizerVariable - -DECLARE_INTERFACE_(ID3DX11EffectRasterizerVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectRasterizerVariable - STDMETHOD(GetRasterizerState)(THIS_ _In_ uint32_t Index, _Outptr_ ID3D11RasterizerState **ppState) PURE; - STDMETHOD(SetRasterizerState)(THIS_ _In_ uint32_t Index, _In_ ID3D11RasterizerState *pState) PURE; - STDMETHOD(UndoSetRasterizerState)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD(GetBackingStore)(THIS_ _In_ uint32_t Index, _Out_ D3D11_RASTERIZER_DESC *pDesc) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectSamplerVariable /////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -typedef interface ID3DX11EffectSamplerVariable ID3DX11EffectSamplerVariable; -typedef interface ID3DX11EffectSamplerVariable *LPD3D11EFFECTSAMPLERVARIABLE; - -// {C6402E55-1095-4D95-8931-F92660513DD9} -DEFINE_GUID(IID_ID3DX11EffectSamplerVariable, - 0xc6402e55, 0x1095, 0x4d95, 0x89, 0x31, 0xf9, 0x26, 0x60, 0x51, 0x3d, 0xd9); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectSamplerVariable - -DECLARE_INTERFACE_(ID3DX11EffectSamplerVariable, ID3DX11EffectVariable) -{ - // IUnknown - // ID3DX11EffectVariable - - // ID3DX11EffectSamplerVariable - STDMETHOD(GetSampler)(THIS_ _In_ uint32_t Index, _Outptr_ ID3D11SamplerState **ppSampler) PURE; - STDMETHOD(SetSampler)(THIS_ _In_ uint32_t Index, _In_ ID3D11SamplerState *pSampler) PURE; - STDMETHOD(UndoSetSampler)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD(GetBackingStore)(THIS_ _In_ uint32_t Index, _Out_ D3D11_SAMPLER_DESC *pDesc) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectPass ////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DX11_PASS_DESC: -// -// Retrieved by ID3DX11EffectPass::GetDesc() -//---------------------------------------------------------------------------- - -struct D3DX11_PASS_DESC -{ - LPCSTR Name; // Name of this pass (nullptr if not anonymous) - uint32_t Annotations; // Number of annotations on this pass - - uint8_t *pIAInputSignature; // Signature from VS or GS (if there is no VS) - // or nullptr if neither exists - size_t IAInputSignatureSize; // Singature size in bytes - - uint32_t StencilRef; // Specified in SetDepthStencilState() - uint32_t SampleMask; // Specified in SetBlendState() - FLOAT BlendFactor[4]; // Specified in SetBlendState() -}; - -//---------------------------------------------------------------------------- -// D3DX11_PASS_SHADER_DESC: -// -// Retrieved by ID3DX11EffectPass::Get**ShaderDesc() -//---------------------------------------------------------------------------- - -struct D3DX11_PASS_SHADER_DESC -{ - ID3DX11EffectShaderVariable *pShaderVariable; // The variable that this shader came from. - // If this is an inline shader assignment, - // the returned interface will be an - // anonymous shader variable, which is - // not retrievable any other way. It's - // name in the variable description will - // be "$Anonymous". - // If there is no assignment of this type in - // the pass block, pShaderVariable != nullptr, - // but pShaderVariable->IsValid() == false. - - uint32_t ShaderIndex; // The element of pShaderVariable (if an array) - // or 0 if not applicable -}; - -typedef interface ID3DX11EffectPass ID3DX11EffectPass; -typedef interface ID3DX11EffectPass *LPD3D11EFFECTPASS; - -// {3437CEC4-4AC1-4D87-8916-F4BD5A41380C} -DEFINE_GUID(IID_ID3DX11EffectPass, - 0x3437cec4, 0x4ac1, 0x4d87, 0x89, 0x16, 0xf4, 0xbd, 0x5a, 0x41, 0x38, 0x0c); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectPass - -DECLARE_INTERFACE_(ID3DX11EffectPass, IUnknown) -{ - // IUnknown - - // ID3DX11EffectPass - STDMETHOD_(bool, IsValid)(THIS) PURE; - STDMETHOD(GetDesc)(THIS_ _Out_ D3DX11_PASS_DESC *pDesc) PURE; - - STDMETHOD(GetVertexShaderDesc)(THIS_ _Out_ D3DX11_PASS_SHADER_DESC *pDesc) PURE; - STDMETHOD(GetGeometryShaderDesc)(THIS_ _Out_ D3DX11_PASS_SHADER_DESC *pDesc) PURE; - STDMETHOD(GetPixelShaderDesc)(THIS_ _Out_ D3DX11_PASS_SHADER_DESC *pDesc) PURE; - STDMETHOD(GetHullShaderDesc)(THIS_ _Out_ D3DX11_PASS_SHADER_DESC *pDesc) PURE; - STDMETHOD(GetDomainShaderDesc)(THIS_ _Out_ D3DX11_PASS_SHADER_DESC *pDesc) PURE; - STDMETHOD(GetComputeShaderDesc)(THIS_ _Out_ D3DX11_PASS_SHADER_DESC *pDesc) PURE; - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ _In_z_ LPCSTR Name) PURE; - - STDMETHOD(Apply)(THIS_ _In_ uint32_t Flags, _In_ ID3D11DeviceContext* pContext) PURE; - - STDMETHOD(ComputeStateBlockMask)(THIS_ _Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectTechnique ///////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DX11_TECHNIQUE_DESC: -// -// Retrieved by ID3DX11EffectTechnique::GetDesc() -//---------------------------------------------------------------------------- - -struct D3DX11_TECHNIQUE_DESC -{ - LPCSTR Name; // Name of this technique (nullptr if not anonymous) - uint32_t Passes; // Number of passes contained within - uint32_t Annotations; // Number of annotations on this technique -}; - -typedef interface ID3DX11EffectTechnique ID3DX11EffectTechnique; -typedef interface ID3DX11EffectTechnique *LPD3D11EFFECTTECHNIQUE; - -// {51198831-1F1D-4F47-BD76-41CB0835B1DE} -DEFINE_GUID(IID_ID3DX11EffectTechnique, - 0x51198831, 0x1f1d, 0x4f47, 0xbd, 0x76, 0x41, 0xcb, 0x08, 0x35, 0xb1, 0xde); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectTechnique - -DECLARE_INTERFACE_(ID3DX11EffectTechnique, IUnknown) -{ - // IUnknown - - // ID3DX11EffectTechnique - STDMETHOD_(bool, IsValid)(THIS) PURE; - STDMETHOD(GetDesc)(THIS_ _Out_ D3DX11_TECHNIQUE_DESC *pDesc) PURE; - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ _In_z_ LPCSTR Name) PURE; - - STDMETHOD_(ID3DX11EffectPass*, GetPassByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectPass*, GetPassByName)(THIS_ _In_z_ LPCSTR Name) PURE; - - STDMETHOD(ComputeStateBlockMask)(THIS_ _Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11EffectTechnique ///////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DX11_GROUP_DESC: -// -// Retrieved by ID3DX11EffectTechnique::GetDesc() -//---------------------------------------------------------------------------- - -struct D3DX11_GROUP_DESC -{ - LPCSTR Name; // Name of this group (only nullptr if global) - uint32_t Techniques; // Number of techniques contained within - uint32_t Annotations; // Number of annotations on this group -}; - -typedef interface ID3DX11EffectGroup ID3DX11EffectGroup; -typedef interface ID3DX11EffectGroup *LPD3D11EFFECTGROUP; - -// {03074acf-97de-485f-b201-cb775264afd6} -DEFINE_GUID(IID_ID3DX11EffectGroup, - 0x03074acf, 0x97de, 0x485f, 0xb2, 0x01, 0xcb, 0x77, 0x52, 0x64, 0xaf, 0xd6); - -#undef INTERFACE -#define INTERFACE ID3DX11EffectGroup - -DECLARE_INTERFACE_(ID3DX11EffectGroup, IUnknown) -{ - // IUnknown - - // ID3DX11EffectGroup - STDMETHOD_(bool, IsValid)(THIS) PURE; - STDMETHOD(GetDesc)(THIS_ _Out_ D3DX11_GROUP_DESC *pDesc) PURE; - - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ _In_z_ LPCSTR Name) PURE; - - STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByName)(THIS_ _In_z_ LPCSTR Name) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// ID3DX11Effect ////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -//---------------------------------------------------------------------------- -// D3DX11_EFFECT_DESC: -// -// Retrieved by ID3DX11Effect::GetDesc() -//---------------------------------------------------------------------------- - -struct D3DX11_EFFECT_DESC -{ - uint32_t ConstantBuffers; // Number of constant buffers in this effect - uint32_t GlobalVariables; // Number of global variables in this effect - uint32_t InterfaceVariables; // Number of global interfaces in this effect - uint32_t Techniques; // Number of techniques in this effect - uint32_t Groups; // Number of groups in this effect -}; - -typedef interface ID3DX11Effect ID3DX11Effect; -typedef interface ID3DX11Effect *LPD3D11EFFECT; - -// {FA61CA24-E4BA-4262-9DB8-B132E8CAE319} -DEFINE_GUID(IID_ID3DX11Effect, - 0xfa61ca24, 0xe4ba, 0x4262, 0x9d, 0xb8, 0xb1, 0x32, 0xe8, 0xca, 0xe3, 0x19); - -#undef INTERFACE -#define INTERFACE ID3DX11Effect - -DECLARE_INTERFACE_(ID3DX11Effect, IUnknown) -{ - // IUnknown - - // ID3DX11Effect - STDMETHOD_(bool, IsValid)(THIS) PURE; - - STDMETHOD(GetDevice)(THIS_ _Outptr_ ID3D11Device** ppDevice) PURE; - - STDMETHOD(GetDesc)(THIS_ _Out_ D3DX11_EFFECT_DESC *pDesc) PURE; - - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetConstantBufferByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectConstantBuffer*, GetConstantBufferByName)(THIS_ _In_z_ LPCSTR Name) PURE; - - STDMETHOD_(ID3DX11EffectVariable*, GetVariableByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectVariable*, GetVariableByName)(THIS_ _In_z_ LPCSTR Name) PURE; - STDMETHOD_(ID3DX11EffectVariable*, GetVariableBySemantic)(THIS_ _In_z_ LPCSTR Semantic) PURE; - - STDMETHOD_(ID3DX11EffectGroup*, GetGroupByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectGroup*, GetGroupByName)(THIS_ _In_z_ LPCSTR Name) PURE; - - STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByIndex)(THIS_ _In_ uint32_t Index) PURE; - STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByName)(THIS_ _In_z_ LPCSTR Name) PURE; - - STDMETHOD_(ID3D11ClassLinkage*, GetClassLinkage)(THIS) PURE; - - STDMETHOD(CloneEffect)(THIS_ _In_ uint32_t Flags, _Outptr_ ID3DX11Effect** ppClonedEffect ) PURE; - STDMETHOD(Optimize)(THIS) PURE; - STDMETHOD_(bool, IsOptimized)(THIS) PURE; -}; - -////////////////////////////////////////////////////////////////////////////// -// APIs ////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -//---------------------------------------------------------------------------- -// D3DX11CreateEffectFromMemory -// -// Creates an effect instance from a compiled effect in memory -// -// Parameters: -// -// [in] -// -// pData -// Blob of compiled effect data -// DataLength -// Length of the data blob -// FXFlags -// Flags pertaining to Effect creation -// pDevice -// Pointer to the D3D11 device on which to create Effect resources -// srcName [optional] -// ASCII string to use for debug object naming -// -// [out] -// -// ppEffect -// Address of the newly created Effect interface -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI D3DX11CreateEffectFromMemory( _In_reads_bytes_(DataLength) LPCVOID pData, - _In_ SIZE_T DataLength, - _In_ UINT FXFlags, - _In_ ID3D11Device *pDevice, - _Outptr_ ID3DX11Effect **ppEffect, - _In_opt_z_ LPCSTR srcName = nullptr ); - -//---------------------------------------------------------------------------- -// D3DX11CreateEffectFromFile -// -// Creates an effect instance from a compiled effect data file -// -// Parameters: -// -// [in] -// -// pFileName -// Compiled effect file -// FXFlags -// Flags pertaining to Effect creation -// pDevice -// Pointer to the D3D11 device on which to create Effect resources -// -// [out] -// -// ppEffect -// Address of the newly created Effect interface -// -//---------------------------------------------------------------------------- - -HRESULT WINAPI D3DX11CreateEffectFromFile( _In_z_ LPCWSTR pFileName, - _In_ UINT FXFlags, - _In_ ID3D11Device *pDevice, - _Outptr_ ID3DX11Effect **ppEffect ); - -//---------------------------------------------------------------------------- -// D3DX11CompileEffectFromMemory -// -// Complies an effect shader source file in memory and then creates an effect instance -// -// Parameters: -// -// [in] -// -// pData -// Pointer to FX shader as an ASCII string -// DataLength -// Length of the FX shader ASCII string -// srcName [optional] -// ASCII string to use for debug object naming -// pDefines [optional] -// A NULL-terminated array of shader macros -// pInclude [optional] -// A pointer to an include interface -// HLSLFlags -// HLSL compile options (see D3DCOMPILE flags) -// FXFlags -// Flags pertaining to Effect compilation (see D3DCOMPILE_EFFECT flags) -// pDevice -// Pointer to the D3D11 device on which to create Effect resources -// -// [out] -// -// ppEffect -// Address of the newly created Effect interface -// -//---------------------------------------------------------------------------- - -HRESULT D3DX11CompileEffectFromMemory( _In_reads_bytes_(DataLength) LPCVOID pData, - _In_ SIZE_T DataLength, - _In_opt_z_ LPCSTR srcName, - _In_opt_ const D3D_SHADER_MACRO *pDefines, - _In_opt_ ID3DInclude *pInclude, - _In_ UINT HLSLFlags, - _In_ UINT FXFlags, - _In_ ID3D11Device *pDevice, - _Out_ ID3DX11Effect **ppEffect, - _Outptr_opt_result_maybenull_ ID3DBlob **ppErrors ); - -//---------------------------------------------------------------------------- -// D3DX11CompileEffectFromFile -// -// Complies an effect shader source file and then creates an effect instance -// -// Parameters: -// -// [in] -// -// pFileName -// FX shader source file -// pDefines [optional] -// A NULL-terminated array of shader macros -// pInclude [optional] -// A pointer to an include interface -// HLSLFlags -// HLSL compile options (see D3DCOMPILE flags) -// FXFlags -// Flags pertaining to Effect compilation (see D3DCOMPILE_EFFECT flags) -// pDevice -// Pointer to the D3D11 device on which to create Effect resources -// -// [out] -// -// ppEffect -// Address of the newly created Effect interface -// -//---------------------------------------------------------------------------- - -HRESULT D3DX11CompileEffectFromFile( _In_z_ LPCWSTR pFileName, - _In_opt_ const D3D_SHADER_MACRO *pDefines, - _In_opt_ ID3DInclude *pInclude, - _In_ UINT HLSLFlags, - _In_ UINT FXFlags, - _In_ ID3D11Device *pDevice, - _Out_ ID3DX11Effect **ppEffect, - _Outptr_opt_result_maybenull_ ID3DBlob **ppErrors ); - -#ifdef __cplusplus -} -#endif //__cplusplus diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/inc/d3dxGlobal.h kodi-15.2~git20151019.1039-final/lib/win32/Effects11/inc/d3dxGlobal.h --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/inc/d3dxGlobal.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/inc/d3dxGlobal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,1283 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: D3DXGlobal.h -// -// Direct3D 11 Effects helper defines and data structures -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma once - -#include -#include - -namespace D3DX11Debug -{ - // Helper sets a D3D resource name string (used by PIX and debug layer leak reporting). - inline void SetDebugObjectName(_In_ ID3D11DeviceChild* resource, _In_z_ const char *name ) - { - #if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) - resource->SetPrivateData( WKPDID_D3DDebugObjectName, static_cast(strlen(name)), name ); - #else - UNREFERENCED_PARAMETER(resource); - UNREFERENCED_PARAMETER(name); - #endif - } - - template - inline void SetDebugObjectName(_In_ ID3D11DeviceChild* resource, _In_z_ const char (&name)[TNameLength]) - { - #if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) - resource->SetPrivateData(WKPDID_D3DDebugObjectName, TNameLength - 1, name); - #else - UNREFERENCED_PARAMETER(resource); - UNREFERENCED_PARAMETER(name); - #endif - } -} - -using namespace D3DX11Debug; - -#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p) = nullptr; } } -#define SAFE_ADDREF(p) { if (p) { (p)->AddRef(); } } - -#define SAFE_DELETE_ARRAY(p) { delete [](p); p = nullptr; } -#define SAFE_DELETE(p) { delete (p); p = nullptr; } - -#if FXDEBUG -#define __BREAK_ON_FAIL { __debugbreak(); } -#else -#define __BREAK_ON_FAIL -#endif - -#define VA(x, action) { hr = (x); if (FAILED(hr)) { action; __BREAK_ON_FAIL; return hr; } } -#define VNA(x,action) { if (!(x)) { action; __BREAK_ON_FAIL; hr = E_OUTOFMEMORY; goto lExit; } } -#define VBA(x,action) { if (!(x)) { action; __BREAK_ON_FAIL; hr = E_FAIL; goto lExit; } } -#define VHA(x,action) { hr = (x); if (FAILED(hr)) { action; __BREAK_ON_FAIL; goto lExit; } } - -#define V(x) { VA (x, 0) } -#define VN(x) { VNA(x, 0) } -#define VB(x) { VBA(x, 0) } -#define VH(x) { VHA(x, 0) } - -#define VBD(x,str) { VBA(x, DPF(1,str)) } -#define VHD(x,str) { VHA(x, DPF(1,str)) } - -#define VEASSERT(x) { hr = (x); if (FAILED(hr)) { __BREAK_ON_FAIL; assert(!#x); goto lExit; } } -#define VNASSERT(x) { if (!(x)) { __BREAK_ON_FAIL; assert(!#x); hr = E_OUTOFMEMORY; goto lExit; } } - -#define D3DX11FLTASSIGN(a,b) { *reinterpret_cast< UINT32* >(&(a)) = *reinterpret_cast< UINT32* >(&(b)); } - -// Preferred data alignment -- must be a power of 2! -static const uint32_t c_DataAlignment = sizeof(UINT_PTR); - -inline uint32_t AlignToPowerOf2(uint32_t Value, uint32_t Alignment) -{ - assert((Alignment & (Alignment - 1)) == 0); - // to align to 2^N, add 2^N - 1 and AND with all but lowest N bits set - _Analysis_assume_(Alignment > 0 && Value < MAXDWORD - Alignment); - return (Value + Alignment - 1) & (~(Alignment - 1)); -} - -inline void * AlignToPowerOf2(void *pValue, UINT_PTR Alignment) -{ - assert((Alignment & (Alignment - 1)) == 0); - // to align to 2^N, add 2^N - 1 and AND with all but lowest N bits set - return (void *)(((UINT_PTR)pValue + Alignment - 1) & (~((UINT_PTR)Alignment - 1))); -} - -namespace D3DX11Core -{ - -////////////////////////////////////////////////////////////////////////// -// CMemoryStream - A class to simplify reading binary data -////////////////////////////////////////////////////////////////////////// -class CMemoryStream -{ - uint8_t *m_pData; - size_t m_cbData; - size_t m_readPtr; - -public: - HRESULT SetData(_In_reads_bytes_(size) const void *pData, _In_ size_t size); - - HRESULT Read(_Out_ uint32_t *pUint); - HRESULT Read(_Outptr_result_buffer_(size) void **ppData, _In_ size_t size); - HRESULT Read(_Outptr_ LPCSTR *ppString); - - HRESULT ReadAtOffset(_In_ size_t offset, _In_ size_t size, _Outptr_result_buffer_(size) void **ppData); - HRESULT ReadAtOffset(_In_ size_t offset, _Outptr_result_z_ LPCSTR *ppString); - - size_t GetPosition(); - HRESULT Seek(_In_ size_t offset); - - CMemoryStream(); - ~CMemoryStream(); -}; - -} - -#if defined(_DEBUG) && !defined(_M_X64) - -namespace D3DX11Debug -{ - -// This variable indicates how many ticks to go before rolling over -// all of the timer variables in the FX system. -// It is read from the system registry in debug builds; in retail the high bit is simply tested. - -_declspec(selectany) unsigned int g_TimerRolloverCount = 0x80000000; -} - -#endif // _DEBUG && !_M_X64 - - -////////////////////////////////////////////////////////////////////////// -// CEffectVector - A vector implementation -////////////////////////////////////////////////////////////////////////// - -template class CEffectVector -{ -protected: -#if _DEBUG - T *m_pCastData; // makes debugging easier to have a casted version of the data -#endif // _DEBUG - - uint8_t *m_pData; - uint32_t m_MaxSize; - uint32_t m_CurSize; - - HRESULT Grow() - { - return Reserve(m_CurSize + 1); - } - - HRESULT Reserve(_In_ uint32_t DesiredSize) - { - if (DesiredSize > m_MaxSize) - { - uint8_t *pNewData; - uint32_t newSize = std::max(m_MaxSize * 2, DesiredSize); - - if (newSize < 16) - newSize = 16; - - if ((newSize < m_MaxSize) || (newSize < m_CurSize) || (newSize >= UINT_MAX / sizeof(T))) - { - m_hLastError = E_OUTOFMEMORY; - return m_hLastError; - } - - pNewData = new uint8_t[newSize * sizeof(T)]; - if (pNewData == nullptr) - { - m_hLastError = E_OUTOFMEMORY; - return m_hLastError; - } - - if (m_pData) - { - memcpy(pNewData, m_pData, m_CurSize * sizeof(T)); - delete []m_pData; - } - - m_pData = pNewData; - m_MaxSize = newSize; - } -#if _DEBUG - m_pCastData = (T*) m_pData; -#endif // _DEBUG - return S_OK; - } - -public: - HRESULT m_hLastError; - - CEffectVector() : m_hLastError(S_OK), m_pData(nullptr), m_CurSize(0), m_MaxSize(0) - { -#if _DEBUG - m_pCastData = nullptr; -#endif // _DEBUG - } - - ~CEffectVector() - { - Clear(); - } - - // cleanly swaps two vectors -- useful for when you want - // to reallocate a vector and copy data over, then swap them back - void SwapVector(_Out_ CEffectVector &vOther) - { - uint8_t tempData[sizeof(*this)]; - - memcpy(tempData, this, sizeof(*this)); - memcpy(this, &vOther, sizeof(*this)); - memcpy(&vOther, tempData, sizeof(*this)); - } - - HRESULT CopyFrom(_In_ const CEffectVector &vOther) - { - HRESULT hr = S_OK; - Clear(); - VN( m_pData = new uint8_t[vOther.m_MaxSize * sizeof(T)] ); - - m_CurSize = vOther.m_CurSize; - m_MaxSize = vOther.m_MaxSize; - m_hLastError = vOther.m_hLastError; - - for (size_t i = 0; i < m_CurSize; ++ i) - { - ((T*)m_pData)[i] = ((T*)vOther.m_pData)[i]; - } - -lExit: - -#if _DEBUG - m_pCastData = (T*) m_pData; -#endif // _DEBUG - - return hr; - } - - void Clear() - { - Empty(); - SAFE_DELETE_ARRAY(m_pData); - m_MaxSize = 0; -#if _DEBUG - m_pCastData = nullptr; -#endif // _DEBUG - } - - void ClearWithoutDestructor() - { - m_CurSize = 0; - m_hLastError = S_OK; - SAFE_DELETE_ARRAY(m_pData); - m_MaxSize = 0; - -#if _DEBUG - m_pCastData = nullptr; -#endif // _DEBUG - } - - void Empty() - { - - // manually invoke destructor on all elements - for (size_t i = 0; i < m_CurSize; ++ i) - { - ((T*)m_pData + i)->~T(); - } - m_CurSize = 0; - m_hLastError = S_OK; - } - - T* Add() - { - if (FAILED(Grow())) - return nullptr; - - // placement new - return new((T*)m_pData + (m_CurSize ++)) T; - } - - T* AddRange(_In_ uint32_t count) - { - if (m_CurSize + count < m_CurSize) - { - m_hLastError = E_OUTOFMEMORY; - return nullptr; - } - - if (FAILED(Reserve(m_CurSize + count))) - return nullptr; - - T *pData = (T*)m_pData + m_CurSize; - for (size_t i = 0; i < count; ++ i) - { - new(pData + i) T; - } - m_CurSize += count; - return pData; - } - - HRESULT Add(_In_ const T& var) - { - if (FAILED(Grow())) - return m_hLastError; - - memcpy((T*)m_pData + m_CurSize, &var, sizeof(T)); - m_CurSize++; - - return S_OK; - } - - HRESULT AddRange(_In_reads_(count) const T *pVar, _In_ uint32_t count) - { - if (m_CurSize + count < m_CurSize) - { - m_hLastError = E_OUTOFMEMORY; - return m_hLastError; - } - - if (FAILED(Reserve(m_CurSize + count))) - return m_hLastError; - - memcpy((T*)m_pData + m_CurSize, pVar, count * sizeof(T)); - m_CurSize += count; - - return S_OK; - } - - HRESULT Insert(_In_ const T& var, _In_ uint32_t index) - { - assert(index < m_CurSize); - - if (FAILED(Grow())) - return m_hLastError; - - memmove((T*)m_pData + index + 1, (T*)m_pData + index, (m_CurSize - index) * sizeof(T)); - memcpy((T*)m_pData + index, &var, sizeof(T)); - m_CurSize++; - - return S_OK; - } - - HRESULT InsertRange(_In_reads_(count) const T *pVar, _In_ uint32_t index, _In_ uint32_t count) - { - assert(index < m_CurSize); - - if (m_CurSize + count < m_CurSize) - { - m_hLastError = E_OUTOFMEMORY; - return m_hLastError; - } - - if (FAILED(Reserve(m_CurSize + count))) - return m_hLastError; - - memmove((T*)m_pData + index + count, (T*)m_pData + index, (m_CurSize - index) * sizeof(T)); - memcpy((T*)m_pData + index, pVar, count * sizeof(T)); - m_CurSize += count; - - return S_OK; - } - - inline T& operator[](_In_ size_t index) - { - assert(index < m_CurSize); - return ((T*)m_pData)[index]; - } - - // Deletes element at index and shifts all other values down - void Delete(_In_ uint32_t index) - { - assert(index < m_CurSize); - - -- m_CurSize; - memmove((T*)m_pData + index, (T*)m_pData + index + 1, (m_CurSize - index) * sizeof(T)); - } - - // Deletes element at index and moves the last element into its place - void QuickDelete(_In_ uint32_t index) - { - assert(index < m_CurSize); - - -- m_CurSize; - memcpy((T*)m_pData + index, (T*)m_pData + m_CurSize, sizeof(T)); - } - - inline uint32_t GetSize() const - { - return m_CurSize; - } - - inline T* GetData() const - { - return (T*)m_pData; - } - - uint32_t FindIndexOf(_In_ const void *pEntry) const - { - for (size_t i = 0; i < m_CurSize; ++ i) - { - if (((T*)m_pData + i) == pEntry) - return i; - } - - return -1; - } - - void Sort(int (__cdecl *pfnCompare)(const void *pElem1, const void *pElem2)) - { - qsort(m_pData, m_CurSize, sizeof(T), pfnCompare); - } -}; - -////////////////////////////////////////////////////////////////////////// -// CEffectVectorOwner - implements a vector of ptrs to objects. The vector owns the objects. -////////////////////////////////////////////////////////////////////////// -template class CEffectVectorOwner : public CEffectVector -{ -public: - ~CEffectVectorOwner() - { - Clear(); - - for (size_t i=0; i::Delete(index); - } -}; - -////////////////////////////////////////////////////////////////////////// -// Checked uint32_t, uint64_t -// Use CheckedNumber only with uint32_t and uint64_t -////////////////////////////////////////////////////////////////////////// -template class CheckedNumber -{ - T m_Value; - bool m_bValid; - -public: - CheckedNumber() : m_Value(0), m_bValid(true) - { - } - - CheckedNumber(const T &value) : m_Value(value), m_bValid(true) - { - } - - CheckedNumber(const CheckedNumber &value) : m_bValid(value.m_bValid), m_Value(value.m_Value) - { - } - - CheckedNumber &operator+(const CheckedNumber &other) - { - CheckedNumber Res(*this); - return Res+=other; - } - - CheckedNumber &operator+=(const CheckedNumber &other) - { - if (!other.m_bValid) - { - m_bValid = false; - } - else - { - m_Value += other.m_Value; - - if (m_Value < other.m_Value) - m_bValid = false; - } - - return *this; - } - - CheckedNumber &operator*(const CheckedNumber &other) - { - CheckedNumber Res(*this); - return Res*=other; - } - - CheckedNumber &operator*=(const CheckedNumber &other) - { - if (!other.m_bValid) - { - m_bValid = false; - } - else - { - if (other.m_Value != 0) - { - if (m_Value > MaxValue / other.m_Value) - { - m_bValid = false; - } - } - m_Value *= other.m_Value; - } - - return *this; - } - - HRESULT GetValue(_Out_ T *pValue) - { - if (!m_bValid) - { - *pValue = uint32_t(-1); - return E_FAIL; - } - - *pValue = m_Value; - return S_OK; - } -}; - -typedef CheckedNumber CCheckedDword; -typedef CheckedNumber CCheckedDword64; - - -////////////////////////////////////////////////////////////////////////// -// Data Block Store - A linked list of allocations -////////////////////////////////////////////////////////////////////////// - -class CDataBlock -{ -protected: - uint32_t m_size; - uint32_t m_maxSize; - uint8_t *m_pData; - CDataBlock *m_pNext; - - bool m_IsAligned; // Whether or not to align the data to c_DataAlignment - -public: - // AddData appends an existing use buffer to the data block - HRESULT AddData(_In_reads_bytes_(bufferSize) const void *pNewData, _In_ uint32_t bufferSize, _Outptr_ CDataBlock **ppBlock); - - // Allocate reserves bufferSize bytes of contiguous memory and returns a pointer to the user - void* Allocate(_In_ uint32_t bufferSize, _Outptr_ CDataBlock **ppBlock); - - void EnableAlignment(); - - CDataBlock(); - ~CDataBlock(); - - friend class CDataBlockStore; -}; - - -class CDataBlockStore -{ -protected: - CDataBlock *m_pFirst; - CDataBlock *m_pLast; - uint32_t m_Size; - uint32_t m_Offset; // m_Offset gets added to offsets returned from AddData & AddString. Use this to set a global for the entire string block - bool m_IsAligned; // Whether or not to align the data to c_DataAlignment - -public: -#if _DEBUG - uint32_t m_cAllocations; -#endif - -public: - HRESULT AddString(_In_z_ LPCSTR pString, _Inout_ uint32_t *pOffset); - // Writes a null-terminated string to buffer - - HRESULT AddData(_In_reads_bytes_(bufferSize) const void *pNewData, _In_ uint32_t bufferSize, _Inout_ uint32_t *pOffset); - // Writes data block to buffer - - // Memory allocator support - void* Allocate(_In_ uint32_t bufferSize); - uint32_t GetSize(); - void EnableAlignment(); - - CDataBlockStore(); - ~CDataBlockStore(); -}; - -// Custom allocator that uses CDataBlockStore -// The trick is that we never free, so we don't have to keep as much state around -// Use PRIVATENEW in CEffectLoader - -static void* __cdecl operator new(_In_ size_t s, _In_ CDataBlockStore &pAllocator) -{ -#ifdef _M_X64 - assert( s <= 0xffffffff ); -#endif - return pAllocator.Allocate( (uint32_t)s ); -} - -static void __cdecl operator delete(_In_opt_ void* p, _In_ CDataBlockStore &pAllocator) -{ - UNREFERENCED_PARAMETER(p); - UNREFERENCED_PARAMETER(pAllocator); -} - - -////////////////////////////////////////////////////////////////////////// -// Hash table -////////////////////////////////////////////////////////////////////////// - -#define HASH_MIX(a,b,c) \ -{ \ - a -= b; a -= c; a ^= (c>>13); \ - b -= c; b -= a; b ^= (a<<8); \ - c -= a; c -= b; c ^= (b>>13); \ - a -= b; a -= c; a ^= (c>>12); \ - b -= c; b -= a; b ^= (a<<16); \ - c -= a; c -= b; c ^= (b>>5); \ - a -= b; a -= c; a ^= (c>>3); \ - b -= c; b -= a; b ^= (a<<10); \ - c -= a; c -= b; c ^= (b>>15); \ -} - -static uint32_t ComputeHash(_In_reads_bytes_(cbToHash) const uint8_t *pb, _In_ uint32_t cbToHash) -{ - uint32_t cbLeft = cbToHash; - - uint32_t a; - uint32_t b; - a = b = 0x9e3779b9; // the golden ratio; an arbitrary value - - uint32_t c = 0; - - while (cbLeft >= 12) - { - const uint32_t *pdw = reinterpret_cast(pb); - - a += pdw[0]; - b += pdw[1]; - c += pdw[2]; - - HASH_MIX(a,b,c); - pb += 12; - cbLeft -= 12; - } - - c += cbToHash; - - switch(cbLeft) // all the case statements fall through - { - case 11: c+=((uint32_t) pb[10] << 24); - case 10: c+=((uint32_t) pb[9] << 16); - case 9 : c+=((uint32_t) pb[8] << 8); - // the first byte of c is reserved for the length - case 8 : b+=((uint32_t) pb[7] << 24); - case 7 : b+=((uint32_t) pb[6] << 16); - case 6 : b+=((uint32_t) pb[5] << 8); - case 5 : b+=pb[4]; - case 4 : a+=((uint32_t) pb[3] << 24); - case 3 : a+=((uint32_t) pb[2] << 16); - case 2 : a+=((uint32_t) pb[1] << 8); - case 1 : a+=pb[0]; - } - - HASH_MIX(a,b,c); - - return c; -} - -static uint32_t ComputeHashLower(_In_reads_bytes_(cbToHash) const uint8_t *pb, _In_ uint32_t cbToHash) -{ - uint32_t cbLeft = cbToHash; - - uint32_t a; - uint32_t b; - a = b = 0x9e3779b9; // the golden ratio; an arbitrary value - uint32_t c = 0; - - while (cbLeft >= 12) - { - uint8_t pbT[12]; - for( size_t i = 0; i < 12; i++ ) - pbT[i] = (uint8_t)tolower(pb[i]); - - uint32_t *pdw = reinterpret_cast(pbT); - - a += pdw[0]; - b += pdw[1]; - c += pdw[2]; - - HASH_MIX(a,b,c); - pb += 12; - cbLeft -= 12; - } - - c += cbToHash; - - uint8_t pbT[12]; - for( size_t i = 0; i < cbLeft; i++ ) - pbT[i] = (uint8_t)tolower(pb[i]); - - switch(cbLeft) // all the case statements fall through - { - case 11: c+=((uint32_t) pbT[10] << 24); - case 10: c+=((uint32_t) pbT[9] << 16); - case 9 : c+=((uint32_t) pbT[8] << 8); - // the first byte of c is reserved for the length - case 8 : b+=((uint32_t) pbT[7] << 24); - case 7 : b+=((uint32_t) pbT[6] << 16); - case 6 : b+=((uint32_t) pbT[5] << 8); - case 5 : b+=pbT[4]; - case 4 : a+=((uint32_t) pbT[3] << 24); - case 3 : a+=((uint32_t) pbT[2] << 16); - case 2 : a+=((uint32_t) pbT[1] << 8); - case 1 : a+=pbT[0]; - } - - HASH_MIX(a,b,c); - - return c; -} - -static uint32_t ComputeHash(_In_z_ LPCSTR pString) -{ - return ComputeHash(reinterpret_cast(pString), (uint32_t)strlen(pString)); -} - - -// 1) these numbers are prime -// 2) each is slightly less than double the last -// 4) each is roughly in between two powers of 2; -// (2^n hash table sizes are VERY BAD; they effectively truncate your -// precision down to the n least significant bits of the hash) -static const uint32_t c_PrimeSizes[] = -{ - 11, - 23, - 53, - 97, - 193, - 389, - 769, - 1543, - 3079, - 6151, - 12289, - 24593, - 49157, - 98317, - 196613, - 393241, - 786433, - 1572869, - 3145739, - 6291469, - 12582917, - 25165843, - 50331653, - 100663319, - 201326611, - 402653189, - 805306457, - 1610612741, -}; - -template -class CEffectHashTable -{ -protected: - - struct SHashEntry - { - uint32_t Hash; - T Data; - SHashEntry *pNext; - }; - - // Array of hash entries - SHashEntry **m_rgpHashEntries; - uint32_t m_NumHashSlots; - uint32_t m_NumEntries; - bool m_bOwnHashEntryArray; - -public: - class CIterator - { - friend class CEffectHashTable; - - protected: - SHashEntry **ppHashSlot; - SHashEntry *pHashEntry; - - public: - T GetData() - { - assert(pHashEntry != 0); - _Analysis_assume_(pHashEntry != 0); - return pHashEntry->Data; - } - - uint32_t GetHash() - { - assert(pHashEntry != 0); - _Analysis_assume_(pHashEntry != 0); - return pHashEntry->Hash; - } - }; - - CEffectHashTable() : m_rgpHashEntries(nullptr), m_NumHashSlots(0), m_NumEntries(0), m_bOwnHashEntryArray(false) - { - } - - HRESULT Initialize(_In_ const CEffectHashTable *pOther) - { - HRESULT hr = S_OK; - SHashEntry **rgpNewHashEntries = nullptr; - uint32_t valuesMigrated = 0; - uint32_t actualSize; - - Cleanup(); - - actualSize = pOther->m_NumHashSlots; - VN( rgpNewHashEntries = new SHashEntry*[actualSize] ); - - ZeroMemory(rgpNewHashEntries, sizeof(SHashEntry*) * actualSize); - - // Expensive operation: rebuild the hash table - CIterator iter, nextIter; - pOther->GetFirstEntry(&iter); - while (!pOther->PastEnd(&iter)) - { - uint32_t index = iter.GetHash() % actualSize; - - // we need to advance to the next element - // before we seize control of this element and move - // it to the new table - nextIter = iter; - pOther->GetNextEntry(&nextIter); - - // seize this hash entry, migrate it to the new table - SHashEntry *pNewEntry; - VN( pNewEntry = new SHashEntry ); - - pNewEntry->pNext = rgpNewHashEntries[index]; - pNewEntry->Data = iter.pHashEntry->Data; - pNewEntry->Hash = iter.pHashEntry->Hash; - rgpNewHashEntries[index] = pNewEntry; - - iter = nextIter; - ++ valuesMigrated; - } - - assert(valuesMigrated == pOther->m_NumEntries); - - m_rgpHashEntries = rgpNewHashEntries; - m_NumHashSlots = actualSize; - m_NumEntries = pOther->m_NumEntries; - m_bOwnHashEntryArray = true; - rgpNewHashEntries = nullptr; - -lExit: - SAFE_DELETE_ARRAY( rgpNewHashEntries ); - return hr; - } - -protected: - void CleanArray() - { - if (m_bOwnHashEntryArray) - { - SAFE_DELETE_ARRAY(m_rgpHashEntries); - m_bOwnHashEntryArray = false; - } - } - -public: - void Cleanup() - { - for (size_t i = 0; i < m_NumHashSlots; ++ i) - { - SHashEntry *pCurrentEntry = m_rgpHashEntries[i]; - SHashEntry *pTempEntry; - while (nullptr != pCurrentEntry) - { - pTempEntry = pCurrentEntry->pNext; - SAFE_DELETE(pCurrentEntry); - pCurrentEntry = pTempEntry; - -- m_NumEntries; - } - } - CleanArray(); - m_NumHashSlots = 0; - assert(m_NumEntries == 0); - } - - ~CEffectHashTable() - { - Cleanup(); - } - - static uint32_t GetNextHashTableSize(_In_ uint32_t DesiredSize) - { - // figure out the next logical size to use - for (size_t i = 0; i < _countof(c_PrimeSizes); ++i ) - { - if (c_PrimeSizes[i] >= DesiredSize) - { - return c_PrimeSizes[i]; - } - } - - return DesiredSize; - } - - // O(n) function - // Grows to the next suitable size (based off of the prime number table) - // DesiredSize is merely a suggestion - HRESULT Grow(_In_ uint32_t DesiredSize, - _In_ uint32_t ProvidedArraySize = 0, - _In_reads_opt_(ProvidedArraySize) void** ProvidedArray = nullptr, - _In_ bool OwnProvidedArray = false) - { - HRESULT hr = S_OK; - SHashEntry **rgpNewHashEntries = nullptr; - uint32_t valuesMigrated = 0; - uint32_t actualSize; - - VB( DesiredSize > m_NumHashSlots ); - - actualSize = GetNextHashTableSize(DesiredSize); - - if (ProvidedArray && - ProvidedArraySize >= actualSize) - { - rgpNewHashEntries = reinterpret_cast(ProvidedArray); - } - else - { - OwnProvidedArray = true; - - VN( rgpNewHashEntries = new SHashEntry*[actualSize] ); - } - - ZeroMemory(rgpNewHashEntries, sizeof(SHashEntry*) * actualSize); - - // Expensive operation: rebuild the hash table - CIterator iter, nextIter; - GetFirstEntry(&iter); - while (!PastEnd(&iter)) - { - uint32_t index = iter.GetHash() % actualSize; - - // we need to advance to the next element - // before we seize control of this element and move - // it to the new table - nextIter = iter; - GetNextEntry(&nextIter); - - // seize this hash entry, migrate it to the new table - iter.pHashEntry->pNext = rgpNewHashEntries[index]; - rgpNewHashEntries[index] = iter.pHashEntry; - - iter = nextIter; - ++ valuesMigrated; - } - - assert(valuesMigrated == m_NumEntries); - - CleanArray(); - m_rgpHashEntries = rgpNewHashEntries; - m_NumHashSlots = actualSize; - m_bOwnHashEntryArray = OwnProvidedArray; - -lExit: - return hr; - } - - HRESULT AutoGrow() - { - // arbitrary heuristic -- grow if 1:1 - if (m_NumEntries >= m_NumHashSlots) - { - // grows this hash table so that it is roughly 50% full - return Grow(m_NumEntries * 2 + 1); - } - return S_OK; - } - -#if _DEBUG - void PrintHashTableStats() - { - if (m_NumHashSlots == 0) - { - DPF(0, "Uninitialized hash table!"); - return; - } - - float variance = 0.0f; - float mean = (float)m_NumEntries / (float)m_NumHashSlots; - uint32_t unusedSlots = 0; - - DPF(0, "Hash table slots: %d, Entries in table: %d", m_NumHashSlots, m_NumEntries); - - for (size_t i = 0; i < m_NumHashSlots; ++ i) - { - uint32_t entries = 0; - SHashEntry *pCurrentEntry = m_rgpHashEntries[i]; - - while (nullptr != pCurrentEntry) - { - SHashEntry *pCurrentEntry2 = m_rgpHashEntries[i]; - - // check other hash entries in this slot for hash collisions or duplications - while (pCurrentEntry2 != pCurrentEntry) - { - if (pCurrentEntry->Hash == pCurrentEntry2->Hash) - { - if (pfnIsEqual(pCurrentEntry->Data, pCurrentEntry2->Data)) - { - assert(0); - DPF(0, "Duplicate entry (identical hash, identical data) found!"); - } - else - { - DPF(0, "Hash collision (hash: %d)", pCurrentEntry->Hash); - } - } - pCurrentEntry2 = pCurrentEntry2->pNext; - } - - pCurrentEntry = pCurrentEntry->pNext; - ++ entries; - } - - if (0 == entries) - { - ++ unusedSlots; - } - - // mean must be greater than 0 at this point - variance += (float)entries * (float)entries / mean; - } - - variance /= std::max(1.0f, (m_NumHashSlots - 1)); - variance -= (mean * mean); - - DPF(0, "Mean number of entries per slot: %f, Standard deviation: %f, Unused slots; %d", mean, variance, unusedSlots); - } -#endif // _DEBUG - - // S_OK if element is found, E_FAIL otherwise - HRESULT FindValueWithHash(_In_ T Data, _In_ uint32_t Hash, _Out_ CIterator *pIterator) - { - assert(m_NumHashSlots > 0); - - uint32_t index = Hash % m_NumHashSlots; - SHashEntry *pEntry = m_rgpHashEntries[index]; - while (nullptr != pEntry) - { - if (Hash == pEntry->Hash && pfnIsEqual(pEntry->Data, Data)) - { - pIterator->ppHashSlot = m_rgpHashEntries + index; - pIterator->pHashEntry = pEntry; - return S_OK; - } - pEntry = pEntry->pNext; - } - return E_FAIL; - } - - // S_OK if element is found, E_FAIL otherwise - HRESULT FindFirstMatchingValue(_In_ uint32_t Hash, _Out_ CIterator *pIterator) - { - assert(m_NumHashSlots > 0); - - uint32_t index = Hash % m_NumHashSlots; - SHashEntry *pEntry = m_rgpHashEntries[index]; - while (nullptr != pEntry) - { - if (Hash == pEntry->Hash) - { - pIterator->ppHashSlot = m_rgpHashEntries + index; - pIterator->pHashEntry = pEntry; - return S_OK; - } - pEntry = pEntry->pNext; - } - return E_FAIL; - } - - // Adds data at the specified hash slot without checking for existence - HRESULT AddValueWithHash(_In_ T Data, _In_ uint32_t Hash) - { - HRESULT hr = S_OK; - - assert(m_NumHashSlots > 0); - - SHashEntry *pHashEntry; - uint32_t index = Hash % m_NumHashSlots; - - VN( pHashEntry = new SHashEntry ); - pHashEntry->pNext = m_rgpHashEntries[index]; - pHashEntry->Data = Data; - pHashEntry->Hash = Hash; - m_rgpHashEntries[index] = pHashEntry; - - ++ m_NumEntries; - -lExit: - return hr; - } - - // Iterator code: - // - // CMyHashTable::CIterator myIt; - // for (myTable.GetFirstEntry(&myIt); !myTable.PastEnd(&myIt); myTable.GetNextEntry(&myIt) - // { myTable.GetData(&myIt); } - void GetFirstEntry(_Out_ CIterator *pIterator) - { - SHashEntry **ppEnd = m_rgpHashEntries + m_NumHashSlots; - pIterator->ppHashSlot = m_rgpHashEntries; - while (pIterator->ppHashSlot < ppEnd) - { - if (nullptr != *(pIterator->ppHashSlot)) - { - pIterator->pHashEntry = *(pIterator->ppHashSlot); - return; - } - ++ pIterator->ppHashSlot; - } - } - - bool PastEnd(_Inout_ CIterator *pIterator) - { - SHashEntry **ppEnd = m_rgpHashEntries + m_NumHashSlots; - assert(pIterator->ppHashSlot >= m_rgpHashEntries && pIterator->ppHashSlot <= ppEnd); - return (pIterator->ppHashSlot == ppEnd); - } - - void GetNextEntry(_Inout_ CIterator *pIterator) - { - SHashEntry **ppEnd = m_rgpHashEntries + m_NumHashSlots; - assert(pIterator->ppHashSlot >= m_rgpHashEntries && pIterator->ppHashSlot <= ppEnd); - assert(pIterator->pHashEntry != 0); - _Analysis_assume_(pIterator->pHashEntry != 0); - - pIterator->pHashEntry = pIterator->pHashEntry->pNext; - if (nullptr != pIterator->pHashEntry) - { - return; - } - - ++ pIterator->ppHashSlot; - while (pIterator->ppHashSlot < ppEnd) - { - pIterator->pHashEntry = *(pIterator->ppHashSlot); - if (nullptr != pIterator->pHashEntry) - { - return; - } - ++ pIterator->ppHashSlot; - } - // hit the end of the list, ppHashSlot == ppEnd - } - - void RemoveEntry(_Inout_ CIterator *pIterator) - { - SHashEntry *pTemp; - SHashEntry **ppPrev; - SHashEntry **ppEnd = m_rgpHashEntries + m_NumHashSlots; - - assert(pIterator && !PastEnd(pIterator)); - ppPrev = pIterator->ppHashSlot; - pTemp = *ppPrev; - while (pTemp) - { - if (pTemp == pIterator->pHashEntry) - { - *ppPrev = pTemp->pNext; - pIterator->ppHashSlot = ppEnd; - delete pTemp; - return; - } - ppPrev = &pTemp->pNext; - pTemp = pTemp->pNext; - } - - // Should never get here - assert(0); - } - -}; - -// Allocates the hash slots on the regular heap (since the -// hash table can grow), but all hash entries are allocated on -// a private heap - -template -class CEffectHashTableWithPrivateHeap : public CEffectHashTable -{ -protected: - CDataBlockStore *m_pPrivateHeap; - -public: - CEffectHashTableWithPrivateHeap() - { - m_pPrivateHeap = nullptr; - } - - void Cleanup() - { - CleanArray(); - m_NumHashSlots = 0; - m_NumEntries = 0; - } - - ~CEffectHashTableWithPrivateHeap() - { - Cleanup(); - } - - // Call this only once - void SetPrivateHeap(_In_ CDataBlockStore *pPrivateHeap) - { - assert(nullptr == m_pPrivateHeap); - m_pPrivateHeap = pPrivateHeap; - } - - // Adds data at the specified hash slot without checking for existence - HRESULT AddValueWithHash(_In_ T Data, _In_ uint32_t Hash) - { - HRESULT hr = S_OK; - - assert(m_pPrivateHeap); - _Analysis_assume_(m_pPrivateHeap); - assert(m_NumHashSlots > 0); - - SHashEntry *pHashEntry; - uint32_t index = Hash % m_NumHashSlots; - - VN( pHashEntry = new(*m_pPrivateHeap) SHashEntry ); - pHashEntry->pNext = m_rgpHashEntries[index]; - pHashEntry->Data = Data; - pHashEntry->Hash = Hash; - m_rgpHashEntries[index] = pHashEntry; - - ++ m_NumEntries; - -lExit: - return hr; - } -}; diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/IUnknownImp.h kodi-15.2~git20151019.1039-final/lib/win32/Effects11/IUnknownImp.h --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/IUnknownImp.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/IUnknownImp.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: IUnknownImp.h -// -// Direct3D 11 Effects Helper for COM interop -// -// Lifetime for most Effects objects is based on the the lifetime of the master -// effect, so the reference count is not used. -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma once - -#define IUNKNOWN_IMP(Class, Interface, BaseInterface) \ - \ -HRESULT STDMETHODCALLTYPE Class##::QueryInterface(REFIID iid, _COM_Outptr_ LPVOID *ppv) override \ -{ \ - if( !ppv ) \ - return E_INVALIDARG; \ - \ - *ppv = nullptr; \ - if(IsEqualIID(iid, IID_IUnknown)) \ - { \ - *ppv = (IUnknown*)((Interface*)this); \ - } \ - else if(IsEqualIID(iid, IID_##Interface)) \ - { \ - *ppv = (Interface *)this; \ - } \ - else if(IsEqualIID(iid, IID_##BaseInterface)) \ - { \ - *ppv = (BaseInterface *)this; \ - } \ - else \ - { \ - return E_NOINTERFACE; \ - } \ - \ - return S_OK; \ -} \ - \ -ULONG STDMETHODCALLTYPE Class##::AddRef() override \ -{ \ - return 1; \ -} \ - \ -ULONG STDMETHODCALLTYPE Class##::Release() override \ -{ \ - return 0; \ -} diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Microsoft Public License.rtf kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Microsoft Public License.rtf --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Microsoft Public License.rtf 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Microsoft Public License.rtf 1970-01-01 00:00:00.000000000 +0000 @@ -1,234 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} -{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f36\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;} -{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Verdana;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} -{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} -{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f40\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f41\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\f43\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f44\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f45\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f46\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\f47\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f48\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f50\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f51\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} -{\f53\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f54\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f55\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f56\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} -{\f57\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f58\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f380\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f381\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} -{\f383\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f384\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f387\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f388\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} -{\f400\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f401\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\f403\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f404\fbidi \froman\fcharset162\fprq2 Cambria Tur;} -{\f407\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f408\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\f420\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;}{\f421\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;} -{\f423\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f424\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}{\f425\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f426\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);} -{\f427\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f428\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f429\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);}{\f430\fbidi \fswiss\fcharset238\fprq2 Verdana CE;} -{\f431\fbidi \fswiss\fcharset204\fprq2 Verdana Cyr;}{\f433\fbidi \fswiss\fcharset161\fprq2 Verdana Greek;}{\f434\fbidi \fswiss\fcharset162\fprq2 Verdana Tur;}{\f437\fbidi \fswiss\fcharset186\fprq2 Verdana Baltic;} -{\f438\fbidi \fswiss\fcharset163\fprq2 Verdana (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} -{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} -{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} -{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; -\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp }{\*\defpap -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 -\f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 -\f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \slink15 \sqformat \spriority9 heading 1;}{\s2\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 -\f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \slink16 \sqformat \spriority9 heading 2;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* -\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\*\cs15 \additive -\rtlch\fcs1 \ab\af0\afs32 \ltrch\fcs0 \b\f36\fs32\kerning32 \sbasedon10 \slink1 \slocked \spriority9 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\ai\af0\afs28 \ltrch\fcs0 \b\i\f36\fs28 \sbasedon10 \slink2 \slocked \spriority9 Heading 2 Char;}{ -\s17\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs16\alang1025 \ltrch\fcs0 \f38\fs16\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext17 \slink18 \ssemihidden \sunhideused \styrsid7424395 Balloon Text;} -{\*\cs18 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 \sbasedon10 \slink17 \slocked \ssemihidden \styrsid7424395 Balloon Text Char;}{\*\cs19 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 -\sbasedon10 \ssemihidden \sunhideused \styrsid4538388 annotation reference;}{\s20\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs20\alang1025 \ltrch\fcs0 \f1\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext20 \slink21 \ssemihidden \sunhideused \styrsid4538388 annotation text;}{\*\cs21 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1 \sbasedon10 \slink20 \slocked \ssemihidden \styrsid4538388 Comment Text Char;}{ -\s22\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs20\alang1025 \ltrch\fcs0 \b\f1\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon20 \snext20 \slink23 \ssemihidden \sunhideused \styrsid4538388 -annotation subject;}{\*\cs23 \additive \rtlch\fcs1 \ab\af1 \ltrch\fcs0 \b\f1 \sbasedon21 \slink22 \slocked \ssemihidden \styrsid4538388 Comment Subject Char;}}{\*\rsidtbl \rsid213160\rsid284417\rsid417145\rsid481196\rsid551334\rsid723397\rsid786968 -\rsid1382437\rsid1390003\rsid1521043\rsid1530955\rsid1708989\rsid1783212\rsid1903779\rsid2431884\rsid3165084\rsid3416120\rsid3419781\rsid3754103\rsid3768194\rsid3831520\rsid4538130\rsid4538388\rsid4552277\rsid4680449\rsid4729674\rsid4865270\rsid4987534 -\rsid5128131\rsid5186068\rsid5601121\rsid5864350\rsid6186044\rsid6311778\rsid6384507\rsid6434687\rsid6561471\rsid6910344\rsid6947552\rsid7033180\rsid7424395\rsid7682010\rsid7690850\rsid7744081\rsid8151618\rsid8196281\rsid8198206\rsid8342723\rsid8350925 -\rsid8722561\rsid8852349\rsid8934457\rsid8944153\rsid9573035\rsid9635349\rsid9638545\rsid9724918\rsid10044820\rsid10095979\rsid10228618\rsid10449644\rsid10494075\rsid11166278\rsid11166751\rsid11285353\rsid11366513\rsid11494815\rsid11932529\rsid12061202 -\rsid12533699\rsid12536400\rsid12916885\rsid13264736\rsid13322831\rsid13440556\rsid13455614\rsid13597357\rsid13768671\rsid14097590\rsid14157399\rsid14229900\rsid14305025\rsid14314735\rsid14436896\rsid14565916\rsid14572556\rsid14688892\rsid14752433 -\rsid14904394\rsid15086147\rsid15749945\rsid15814398\rsid15927751\rsid16071312\rsid16126175\rsid16279402\rsid16391569\rsid16404661\rsid16452939\rsid16537688\rsid16606866\rsid16674896}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1 -\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\title Microsoft Permissive License (Ms-PL)}{\author Jonr}{\operator Chuck Walbourn}{\creatim\yr2007\mo2\dy23\hr15\min10}{\revtim\yr2011\mo8\dy15\hr15\min2} -{\printim\yr2006\mo9\dy28\hr8\min46}{\version3}{\edmins1}{\nofpages1}{\nofwords391}{\nofchars2230}{\*\company Microsoft}{\nofcharsws2616}{\vern49273}}{\*\userprops {\propname _NewReviewCycle}\proptype30{\staticval }}{\*\xmlnstbl {\xmlns1 http://schemas.mi -crosoft.com/office/word/2003/wordml}{\xmlns2 urn:schemas-microsoft-com:office:smarttags}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\hyphcaps0\horzdoc\dghspace120\dgvspace120 -\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\splytwnine\ftnlytwnine\htmautsp\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot10494075 -\newtblstyruls\nogrowautofit\utinl \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}} -{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (} -{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar -\s1\ql \li0\ri0\sb180\nowidctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af1\afs31 \ltrch\fcs0 -\fs31\cf1\kerning36\insrsid10494075\charrsid14688892 Microsoft}{\rtlch\fcs1 \af1\afs31 \ltrch\fcs0 \fs31\cf1\kerning36\insrsid10494075 }{\rtlch\fcs1 \af1\afs31 \ltrch\fcs0 \fs31\cf1\kerning36\insrsid5601121 Public}{\rtlch\fcs1 \af1\afs31 \ltrch\fcs0 -\fs31\cf1\kerning36\insrsid14688892 }{\rtlch\fcs1 \af1\afs31 \ltrch\fcs0 \fs31\cf1\kerning36\insrsid10494075 License (Ms-PL}{\rtlch\fcs1 \af1\afs31 \ltrch\fcs0 \fs31\cf1\kerning36\insrsid4552277 )}{\rtlch\fcs1 \af1\afs31 \ltrch\fcs0 -\fs31\cf1\kerning36\insrsid10494075 -\par }\pard\plain \ltrpar\ql \li0\ri0\sl336\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af39\afs17 \ltrch\fcs0 -\b\f39\fs17\insrsid10494075 -\par This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. -\par }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid6910344 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af39\afs23 \ltrch\fcs0 -\b\f39\fs23\insrsid10494075 1. Definitions -\par }\pard\plain \ltrpar\ql \li0\ri0\sl336\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid10494075 The terms \'93reproduce,\'94 \'93reproduction}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid7744081 ,}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 \'94 }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid551334 \'93derivative works,\'94}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid7744081\charrsid7744081 }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 and \'93distribution\'94 have the same meaning here as under -{\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname country-region}}U.S.{\*\xmlclose}{\*\xmlclose} copyright law. -\par }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid12536400 A \'93contribution\'94 is the original software}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid4865270 ,}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid12536400 }{\rtlch\fcs1 -\af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid11932529 or}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid12536400 any additions or changes to the software. -\par }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid551334 A \'93c}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid551334\charrsid551334 ontributor\'94 }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid12536400 is}{\rtlch\fcs1 \af39\afs17 -\ltrch\fcs0 \f39\fs17\insrsid12536400\charrsid551334 }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid551334\charrsid551334 any person that }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid12536400 -distributes its contribution under this license.}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid14229900 {\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid4729674\delrsid4729674 }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 \'93Licensed patents -\'94 }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid12536400 are }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid3831520 a contributor\rquote s }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 patent claims }{\rtlch\fcs1 -\af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid3831520 that }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 read directly on }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid3831520 its contribution.}{\rtlch\fcs1 \af1 \ltrch\fcs0 -\insrsid14229900\charrsid14229900 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af39\afs23 \ltrch\fcs0 -\b\f39\fs23\insrsid5186068 -\par }{\rtlch\fcs1 \ab\af39\afs23 \ltrch\fcs0 \b\f39\fs23\insrsid10494075 2. Grant of Rights -\par }\pard\plain \ltrpar\ql \li0\ri0\sl336\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid10494075 (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid3754103 each contributor }{\rtlch\fcs1 \af39\afs17 -\ltrch\fcs0 \f39\fs17\insrsid10494075 grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid3754103 its contribution}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid10494075 , prepare derivative works of }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid3754103 its contribution}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid12536400 ,}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid10494075 and distribute }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid3754103 its contribution}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 or any derivative works that you create. -\par (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid9724918 each contributor }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid10494075 grants you a non-exclusive, worldwide, royalty-free license under }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid15814398 its }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 -licensed patents to make, have made, use, sell, offer for sale, }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid1390003 import, }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 and/or otherwise dispose of }{\rtlch\fcs1 \af39\afs17 -\ltrch\fcs0 \f39\fs17\insrsid8944153 its contribution in }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 the software or derivative works of }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid8944153 the contribution in }{\rtlch\fcs1 -\af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 the software. -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af39\afs23 \ltrch\fcs0 -\b\f39\fs23\insrsid5186068 -\par }{\rtlch\fcs1 \ab\af39\afs23 \ltrch\fcs0 \b\f39\fs23\insrsid10494075 3. Conditions and Limitations -\par }\pard\plain \ltrpar\ql \li0\ri0\sl336\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \f1\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid1530955 }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 (A) No Trademark License- This license does not grant you rights to use }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid1708989 any contributors\rquote }{ -\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 name, logo, or trademarks. -\par (B) If you }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid8934457 bring a patent claim against }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10095979 any contributor}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 - over patents that you }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid6947552 claim }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid7682010 are }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid6947552 infringe}{\rtlch\fcs1 -\af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid7682010 d by}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 the software, your }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid7682010 patent }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid10494075 license}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid7682010 from such contributor}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 to the software ends automatically. -\par (C) If you distribute }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid3165084 any portion of }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 -the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. -\par (D) If you distribute }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid15749945 any portion of the }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 software in source code form}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid14904394 ,}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 you may do so only under this license}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid6384507 }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid14904394 by including }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 a complete copy of this license with your distribution}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid6384507 .}{\rtlch\fcs1 \af39\afs17 -\ltrch\fcs0 \f39\fs17\insrsid10494075 }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid6384507 I}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 f you distribute }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid15749945 -any portion of }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 the software in compiled or object code form}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid16452939 ,}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 - you may only do so under a license that complies with this license. -\par }\pard \ltrpar\ql \li0\ri0\sl336\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid14572556 {\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 (E) The software is licensed \'93as-is.\'94 You bear the risk of using it. }{ -\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid284417 The contributors }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 -give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid1783212 the contributors }{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 \f39\fs17\insrsid10494075 exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.}{\rtlch\fcs1 \af39\afs17 \ltrch\fcs0 -\f39\fs17\insrsid10494075\charrsid14572556 -\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a -9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad -5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 -b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 -0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 -a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f -c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 -0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 -a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 -6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b -4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b -4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f -7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 -615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad -79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b -5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab -999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 -699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 -8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 -0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f -9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be -15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 -3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d -32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a -f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 -e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb -44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a -6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c -3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 -5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 -b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 -c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e -51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 -b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff -6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 -9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 -b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 -59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 -2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 -656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 -350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 -52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 -73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 -0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 -000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 -0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 -000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 -00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3; -\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8; -\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdqformat1 \lsdpriority39 \lsdlocked0 toc 1;\lsdqformat1 \lsdpriority39 \lsdlocked0 toc 2;\lsdqformat1 \lsdpriority39 \lsdlocked0 toc 3;\lsdqformat1 \lsdpriority39 \lsdlocked0 toc 4; -\lsdqformat1 \lsdpriority39 \lsdlocked0 toc 5;\lsdqformat1 \lsdpriority39 \lsdlocked0 toc 6;\lsdqformat1 \lsdpriority39 \lsdlocked0 toc 7;\lsdqformat1 \lsdpriority39 \lsdlocked0 toc 8;\lsdqformat1 \lsdpriority39 \lsdlocked0 toc 9; -\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid; -\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography; -\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000808a -33fc965bcc01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/pchfx.h kodi-15.2~git20151019.1039-final/lib/win32/Effects11/pchfx.h --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/pchfx.h 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/pchfx.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: pchfx.h -// -// Direct3D 11 shader effects precompiled header -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// http://go.microsoft.com/fwlink/p/?LinkId=271568 -//-------------------------------------------------------------------------------------- - -#pragma once - -#pragma warning(disable : 4102 4127 4201 4505 4616 4706 6326) - -#ifndef NOMINMAX -#define NOMINMAX -#endif - -#include - -#if defined(_XBOX_ONE) && defined(_TITLE) -#include -#include -#define DCOMMON_H_INCLUDED -#define NO_D3D11_DEBUG_NAME -#elif (_WIN32_WINNT >= 0x0602) || defined(_WIN7_PLATFORM_UPDATE) -#include -#include -#else -#include -#include -#endif - -#ifndef _WIN32_WINNT_WIN8 -#define _WIN32_WINNT_WIN8 0x0602 -#endif - -#undef DEFINE_GUID -#include "INITGUID.h" - -#include "d3dx11effect.h" - -#define UNUSED -1 - -////////////////////////////////////////////////////////////////////////// - -#define offsetof_fx( a, b ) (uint32_t)offsetof( a, b ) - -#include "d3dxGlobal.h" - -#include -#include - -#include "Effect.h" -#include "EffectStateBase11.h" -#include "EffectLoad.h" - diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Windows81SDKVS12_x64.props kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Windows81SDKVS12_x64.props --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Windows81SDKVS12_x64.props 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Windows81SDKVS12_x64.props 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - $(ProgramFiles)\Windows Kits\8.1\bin\x64;$(ExecutablePath) - $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ProgramFiles)\Windows Kits\8.1\Include\winrt;$(IncludePath) - $(ProgramFiles)\Windows Kits\8.1\lib\winv6.3\um\x64;$(LibraryPath) - $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ProgramFiles)\Windows Kits\8.1\Include\winrt;$(ExcludePath) - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Windows81SDKVS12_x86.props kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Windows81SDKVS12_x86.props --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Windows81SDKVS12_x86.props 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Windows81SDKVS12_x86.props 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - $(ProgramFiles)\Windows Kits\8.1\bin\x86;$(ExecutablePath) - $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ProgramFiles)\Windows Kits\8.1\Include\winrt;$(IncludePath) - $(ProgramFiles)\Windows Kits\8.1\lib\winv6.3\um\x86;$(LibraryPath) - $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ProgramFiles)\Windows Kits\8.1\Include\winrt;$(ExcludePath) - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Windows81SDK_x64.props kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Windows81SDK_x64.props --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Windows81SDK_x64.props 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Windows81SDK_x64.props 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - $(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSdkDir)bin\NETFX 4.0 Tools;$(ProgramFiles)\Windows Kits\8.1\bin\x86;$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(FrameworkSDKDir)\bin;$(MSBuildToolsPath32);$(VSInstallDir);$(SystemRoot)\SysWow64;$(FxCopDir);$(PATH) - $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ProgramFiles)\Windows Kits\8.1\Include\winrt;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(FrameworkSDKDir)\include; - $(VCInstallDir)lib\amd64;$(VCInstallDir)atlmfc\lib\amd64;$(ProgramFiles)\Windows Kits\8.1\lib\winv6.3\um\x64;$(FrameworkSDKDir)\lib\x64 - $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ProgramFiles)\Windows Kits\8.1\Include\winrt;$(FrameworkSDKDir)\include;$(MSBuildToolsPath32);$(VCInstallDir)atlmfc\lib;$(VCInstallDir)lib; - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Windows81SDK_x86.props kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Windows81SDK_x86.props --- kodi-16.1~git20160425.1001-final/lib/win32/Effects11/Windows81SDK_x86.props 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/lib/win32/Effects11/Windows81SDK_x86.props 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - $(VCInstallDir)bin;$(WindowsSdkDir)bin\NETFX 4.0 Tools;$(ProgramFiles)\Windows Kits\8.1\bin\x86;$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(FrameworkSDKDir)\bin;$(MSBuildToolsPath32);$(VSInstallDir);$(SystemRoot)\SysWow64;$(FxCopDir);$(PATH) - $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ProgramFiles)\Windows Kits\8.1\Include\winrt;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(FrameworkSDKDir)\include; - $(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(ProgramFiles)\Windows Kits\8.1\lib\winv6.3\um\x86;$(FrameworkSDKDir)\lib - $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ProgramFiles)\Windows Kits\8.1\Include\winrt;$(FrameworkSDKDir)\include;$(MSBuildToolsPath32);$(VCInstallDir)atlmfc\lib;$(VCInstallDir)lib; - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/Makefile.in kodi-15.2~git20151019.1039-final/Makefile.in --- kodi-16.1~git20160425.1001-final/Makefile.in 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/Makefile.in 2015-10-19 08:39:14.000000000 +0000 @@ -27,6 +27,7 @@ xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitles.a DIRECTORY_ARCHIVES=$(DVDPLAYER_ARCHIVES) \ + lib/SlingboxLib/SlingboxLib.a \ xbmc/addons/addons.a \ xbmc/cdrip/cdrip.a \ xbmc/contrib/kissfft/kissfft.a \ @@ -43,13 +44,11 @@ xbmc/dbwrappers/dbwrappers.a \ xbmc/dialogs/dialogs.a \ xbmc/epg/epg.a \ - xbmc/events/events.a \ xbmc/filesystem/MusicDatabaseDirectory/musicdatabasedirectory.a \ xbmc/filesystem/VideoDatabaseDirectory/videodatabasedirectory.a \ xbmc/filesystem/filesystem.a \ xbmc/guilib/guilib.a \ xbmc/input/input.a \ - xbmc/interfaces/builtins/builtins.a \ xbmc/interfaces/generic/interfaces-generic.a \ xbmc/interfaces/info/info.a \ xbmc/interfaces/interfaces.a \ @@ -58,16 +57,13 @@ xbmc/interfaces/python/python_binding.a \ xbmc/linux/linux.a \ xbmc/listproviders/listproviders.a \ - xbmc/main/posix/MessagePrinter.a \ xbmc/media/media.a \ - xbmc/messaging/messaging.a \ - xbmc/messaging/helpers/messagingHelpers.a \ xbmc/music/dialogs/musicdialogs.a \ xbmc/music/infoscanner/musicscanner.a \ + xbmc/music/karaoke/karaoke.a \ xbmc/music/music.a \ xbmc/music/tags/musictags.a \ xbmc/music/windows/musicwindows.a \ - xbmc/network/dacp/dacp.a \ xbmc/network/websocket/websocket.a \ xbmc/network/network.a \ xbmc/peripherals/bus/peripheral-bus.a \ @@ -122,6 +118,7 @@ ifeq (@USE_OPENGLES@,1) DIRECTORY_ARCHIVES += xbmc/rendering/gles/rendering_gles.a DIRECTORY_ARCHIVES += xbmc/windowing/egl/windowing_egl.a +DIRECTORY_ARCHIVES += xbmc/visualizations/EGLHelpers/eglhelpers.a endif ifeq (@USE_UPNP@,1) @@ -133,6 +130,9 @@ DIRECTORY_ARCHIVES += xbmc/network/mdns/mdns.a endif +INSTALL_FILTER = .*visualization\.dxspectrum.* +INSTALL_FILTER += .*visualization\.milkdrop.* + ifeq ($(findstring osx,@ARCH@),osx) DIRECTORY_ARCHIVES += xbmc/osx/osx.a DIRECTORY_ARCHIVES += xbmc/network/osx/network.a @@ -157,8 +157,6 @@ DIRECTORY_ARCHIVES += xbmc/windowing/X11/windowing_X11.a else DIRECTORY_ARCHIVES += xbmc/input/linux/input_linux.a -DIRECTORY_ARCHIVES += xbmc/input/touch/input_touch.a -DIRECTORY_ARCHIVES += xbmc/input/touch/generic/input_touch_generic.a DIRECTORY_ARCHIVES += xbmc/network/linux/network_linux.a DIRECTORY_ARCHIVES += xbmc/powermanagement/linux/powermanagement_linux.a DIRECTORY_ARCHIVES += xbmc/storage/linux/storage_linux.a @@ -189,13 +187,49 @@ LIB_DIRS=\ lib/cximage-6.0 \ lib/libexif \ + lib/libhdhomerun \ lib/cpluff \ lib/xbmc-dll-symbols +SS_DIRS= +ifneq (@DISABLE_RSXS@,1) + SS_DIRS+= xbmc/screensavers/rsxs-0.9/xbmc +else + INSTALL_FILTER+= .*screensaver\.rsxs.* +endif + +ifneq (@DISABLE_SPECTRUM@,1) + VIS_DIRS+= xbmc/visualizations/OpenGLSpectrum +else + INSTALL_FILTER+= .*visualization\.glspectrum.* +endif + +ifneq (@DISABLE_WAVEFORM@,1) + VIS_DIRS+= xbmc/visualizations/WaveForm +else + INSTALL_FILTER+= .*visualization\.waveform.* +endif + +ifneq (@DISABLE_FISHBMC@,1) + VIS_DIRS+= xbmc/visualizations/fishBMC +else + INSTALL_FILTER+= .*visualization\.fishbmc.* +endif + +ifneq (@DISABLE_PROJECTM@,1) + VIS_DIRS+= xbmc/visualizations/XBMCProjectM +else + INSTALL_FILTER+= .*visualization\.projectm.* +endif + +ifneq (@DISABLE_GOOM@,1) + VIS_DIRS+=xbmc/visualizations/Goom +else + INSTALL_FILTER+= .*visualization\.goom.* +endif + LIBADDON_DIRS=\ lib/addons/library.xbmc.addon \ - lib/addons/library.kodi.adsp \ - lib/addons/library.kodi.audioengine \ lib/addons/library.xbmc.codec \ lib/addons/library.xbmc.pvr \ lib/addons/library.kodi.guilib \ @@ -284,7 +318,7 @@ include Makefile.include -.PHONY : dllloader exports eventclients \ +.PHONY : dllloader exports visualizations screensavers eventclients \ dvdpcodecs dvdpextcodecs imagelib codecs externals force skins libaddon check \ testframework testsuite @@ -330,10 +364,22 @@ $(MAKE) -C xbmc/cores/DllLoader/exports wrapper.def dllloader: exports xbmc/cores/DllLoader/dllloader.a +ifeq (@USE_OPENGLES@,1) +EGLHELPERS=xbmc/visualizations/EGLHelpers/eglhelpers.a +endif + +$(VIS_DIRS): force exports $(EGLHELPERS) + $(MAKE) -C $@ + +$(SS_DIRS): force exports + $(MAKE) -C $@ + +visualizations: $(VIS_DIRS) + +screensavers: $(SS_DIRS) + libaddon: exports $(MAKE) -C lib/addons/library.xbmc.addon - $(MAKE) -C lib/addons/library.kodi.adsp - $(MAKE) -C lib/addons/library.kodi.audioengine $(MAKE) -C lib/addons/library.xbmc.codec $(MAKE) -C lib/addons/library.kodi.guilib $(MAKE) -C lib/addons/library.xbmc.pvr @@ -357,18 +403,21 @@ endif libexif: dllloader $(MAKE) -C lib/libexif +libhdhomerun: dllloader + $(MAKE) -C lib/libhdhomerun imagelib: dllloader $(MAKE) -C lib/cximage-6.0 codecs: dvdpcodecs dvdpextcodecs -libs: $(LIBSSE4) imagelib libexif system/libcpluff-@ARCH@.so +libs: $(LIBSSE4) libhdhomerun imagelib libexif system/libcpluff-@ARCH@.so -externals: codecs libs libaddon +externals: codecs libs visualizations screensavers libaddon xcode_depends: \ - codecs libs eventclients skins libaddon + codecs libs visualizations screensavers eventclients skins libaddon \ + lib/SlingboxLib/SlingboxLib.a DYNOBJSXBMC= \ xbmc/linux/linux.a \ @@ -396,7 +445,7 @@ @FFMPEG_LIBDIR@/libpostproc.a \ @FFMPEG_LIBDIR@/libswscale.a DYNOBJSXBMC+= $(FFMPEGOBJS) -LIBS+= @GNUTLS_ALL_LIBS@ @VORBISENC_ALL_LIBS@ @DCADEC_ALL_LIBS@ +LIBS+= @GNUTLS_ALL_LIBS@ @VORBISENC_ALL_LIBS@ $(FFMPEGOBJS): dvdpcodecs endif @@ -414,7 +463,7 @@ BIN_DIRS = $(dir $(DIRECTORY_ARCHIVES)) $(dir $(NWAOBJSXBMC)) $(dir $(MAINOBJS)) DIRS= $(BIN_DIRS) $(EC_DIRS) $(DVDPCODECS_DIRS) \ - $(LIB_DIRS) $(LIBADDON_DIRS) $(SKIN_DIRS) xbmc/main + $(LIB_DIRS) $(SS_DIRS) $(VIS_DIRS) $(LIBADDON_DIRS) $(SKIN_DIRS) xbmc/main $(NWAOBJSXBMC) $(DIRECTORY_ARCHIVES) $(MAINOBJS): force @$(MAKE) $(if $(V),,-s) -C $(@D) @@ -595,13 +644,17 @@ for d in $(DVDPCODECS_DIRS); do if test -f $$d/Makefile; then $(MAKE) -C $$d clean; fi; done clean-libs: for d in $(LIB_DIRS); do if test -f $$d/Makefile; then $(MAKE) -C $$d clean; fi; done +clean-screensavers: + for d in $(SS_DIRS); do if test -f $$d/Makefile; then $(MAKE) -C $$d clean; fi; done +clean-visualisations: + for d in $(VIS_DIRS); do if test -f $$d/Makefile; then $(MAKE) -C $$d clean; fi; done clean-libaddons: for d in $(LIBADDON_DIRS); do if test -f $$d/Makefile; then $(MAKE) -C $$d clean; fi; done clean-codecs: clean-dvdpcodecs clean-externals: clean-codecs clean-eventclients clean-libs \ - clean-libaddons + clean-screensavers clean-visualisations clean-libaddons ifeq (1,@GTEST_CONFIGURED@) check: testsuite diff -Nru kodi-16.1~git20160425.1001-final/Makefile.include.in kodi-15.2~git20151019.1039-final/Makefile.include.in --- kodi-16.1~git20160425.1001-final/Makefile.include.in 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/Makefile.include.in 2015-10-19 08:39:14.000000000 +0000 @@ -1,5 +1,5 @@ AR=@AR@ -ARFLAGS=crs +ARFLAGS=crus RM=rm -rf SHELL=@SHELL@ ARCH=@ARCH@ @@ -37,14 +37,10 @@ CFLAGS_FOR_BUILD+=@CFLAGS_FOR_BUILD@ LDFLAGS+=@LDFLAGS@ LDFLAGS_FOR_BUILD+=@LDFLAGS_FOR_BUILD@ -INCLUDES+=-I@abs_top_srcdir@ INCLUDES+=-I@abs_top_srcdir@/lib INCLUDES+=-I@abs_top_srcdir@/xbmc -INCLUDES+=-I@abs_top_srcdir@/xbmc/addons/include INCLUDES+=-I@abs_top_srcdir@/addons/library.kodi.guilib INCLUDES+=-I@abs_top_srcdir@/addons/library.xbmc.addon -INCLUDES+=-I@abs_top_srcdir@/addons/library.kodi.adsp -INCLUDES+=-I@abs_top_srcdir@/addons/library.kodi.audioengine INCLUDES+=-I@abs_top_srcdir@/addons/library.xbmc.pvr INCLUDES+=-I@abs_top_srcdir@/addons/library.xbmc.codec INCLUDES+=$(sort @INCLUDES@) @@ -95,22 +91,22 @@ %.o: %.cpp @rm -f $@ - $(SILENT_CPP) $(CXX) -MF $*.d -MD -c $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(CPPFLAGS) $< -o $@ \ + $(SILENT_CPP) $(CXX) -MF $*.d -MD -c $(CXXFLAGS) $(DEFINES) $(INCLUDES) $< -o $@ \ && $(GEN_DEPS) %.o: %.cc @rm -f $@ - $(SILENT_CPP) $(CXX) -MF $*.d -MD -c $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(CPPFLAGS) $< -o $@ \ + $(SILENT_CPP) $(CXX) -MF $*.d -MD -c $(CXXFLAGS) $(DEFINES) $(INCLUDES) $< -o $@ \ && $(GEN_DEPS) %.o: %.c @rm -f $@ - $(SILENT_CC) $(CC) -MF $*.d -MD -c $(CFLAGS) $(DEFINES) $(INCLUDES) $(CPPFLAGS) $< -o $@ \ + $(SILENT_CC) $(CC) -MF $*.d -MD -c $(CFLAGS) $(DEFINES) $(INCLUDES) $< -o $@ \ && $(GEN_DEPS) %.o: %.C @rm -f $@ - $(SILENT_CPP) $(CXX) -MF $*.d -MD -c $(CFLAGS) $(DEFINES) $(INCLUDES) $(CPPFLAGS) $< -o $@ \ + $(SILENT_CPP) $(CXX) -MF $*.d -MD -c $(CFLAGS) $(DEFINES) $(INCLUDES) $< -o $@ \ && $(GEN_DEPS) %.o: %.S Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/media/Splash.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/media/Splash.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/media/weather.zip and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/media/weather.zip differ diff -Nru kodi-16.1~git20160425.1001-final/project/BuildDependencies/DownloadBuildDeps.bat kodi-15.2~git20151019.1039-final/project/BuildDependencies/DownloadBuildDeps.bat --- kodi-16.1~git20160425.1001-final/project/BuildDependencies/DownloadBuildDeps.bat 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/BuildDependencies/DownloadBuildDeps.bat 2015-10-19 08:39:15.000000000 +0000 @@ -2,31 +2,23 @@ SETLOCAL -REM If KODI_MIRROR is not set externally to this script, set it to the default mirror URL -IF "%KODI_MIRROR%" == "" SET KODI_MIRROR=http://mirrors.kodi.tv -echo Downloading from mirror %KODI_MIRROR% - -REM Locate the BuildDependencies directory, based on the path of this script -SET BUILD_DEPS_PATH=%~dp0 -SET APP_PATH=%BUILD_DEPS_PATH%\..\.. -SET TMP_PATH=%BUILD_DEPS_PATH%\scripts\tmp +SET CUR_PATH=%CD% +SET APP_PATH=%CD%\..\.. +SET TMP_PATH=%CD%\scripts\tmp -REM Change to the BuildDependencies directory, if we're not there already -PUSHD %BUILD_DEPS_PATH% - -REM Can't run rmdir and md back to back. access denied error otherwise. +rem can't run rmdir and md back to back. access denied error otherwise. IF EXIST lib rmdir lib /S /Q IF EXIST include rmdir include /S /Q IF EXIST %TMP_PATH% rmdir %TMP_PATH% /S /Q IF $%1$ == $$ ( - SET DL_PATH="%BUILD_DEPS_PATH%\downloads" + SET DL_PATH="%CD%\downloads" ) ELSE ( SET DL_PATH="%1" ) -SET WGET=%BUILD_DEPS_PATH%\bin\wget -SET ZIP=%BUILD_DEPS_PATH%\..\Win32BuildSetup\tools\7z\7za +SET WGET=%CUR_PATH%\bin\wget +SET ZIP=%CUR_PATH%\..\Win32BuildSetup\tools\7z\7za IF NOT EXIST %DL_PATH% md %DL_PATH% @@ -41,22 +33,10 @@ start /b /wait cmd.exe /c get_formed.cmd IF NOT EXIST %FORMED_OK_FLAG% ( ECHO ERROR: Not all formed packages are ready! - ECHO. - ECHO I tried to get the packages from %KODI_MIRROR%; - ECHO if this download mirror seems to be having problems, try choosing another from - ECHO the list on http://mirrors.kodi.tv/list.html, and setting %%KODI_MIRROR%% to - ECHO point to it, like so: - ECHO C:\^> SET KODI_MIRROR=http://example.com/pub/xbmc/ - ECHO. - ECHO Then, rerun this script. EXIT /B 101 ) -rmdir %TMP_PATH% /S /Q - -REM Restore the previous current directory -POPD - -ENDLOCAL +cd %CUR_PATH% +rmdir %TMP_PATH% /S /Q EXIT /B 0 diff -Nru kodi-16.1~git20160425.1001-final/project/BuildDependencies/DownloadMingwBuildEnv.bat kodi-15.2~git20151019.1039-final/project/BuildDependencies/DownloadMingwBuildEnv.bat --- kodi-16.1~git20160425.1001-final/project/BuildDependencies/DownloadMingwBuildEnv.bat 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/BuildDependencies/DownloadMingwBuildEnv.bat 2015-10-19 08:39:15.000000000 +0000 @@ -2,31 +2,25 @@ SETLOCAL -REM If KODI_MIRROR is not set externally to this script, set it to the default mirror URL -IF "%KODI_MIRROR%" == "" SET KODI_MIRROR=http://mirrors.kodi.tv -echo Downloading from mirror %KODI_MIRROR% +SET MSYS_INSTALL_PATH="%CD%\msys" +SET MINGW_INSTALL_PATH="%CD%\msys\mingw" -REM Locate the BuildDependencies directory, based on the path of this script -SET BUILD_DEPS_PATH=%~dp0 -SET APP_PATH=%BUILD_DEPS_PATH%\..\.. -SET TMP_PATH=%BUILD_DEPS_PATH%\scripts\tmp +SET CUR_PATH=%CD% +SET APP_PATH=%CD%\..\.. +SET TMP_PATH=%CD%\scripts\tmp -SET MSYS_INSTALL_PATH="%BUILD_DEPS_PATH%\msys" -SET MINGW_INSTALL_PATH="%BUILD_DEPS_PATH%\msys\mingw" - - -REM can't run rmdir and md back to back. access denied error otherwise. +rem can't run rmdir and md back to back. access denied error otherwise. IF EXIST %MSYS_INSTALL_PATH% rmdir %MSYS_INSTALL_PATH% /S /Q IF EXIST %TMP_PATH% rmdir %TMP_PATH% /S /Q IF $%1$ == $$ ( - SET DL_PATH="%BUILD_DEPS_PATH%\downloads2" + SET DL_PATH="%CD%\downloads2" ) ELSE ( SET DL_PATH="%1" ) -SET WGET=%BUILD_DEPS_PATH%\bin\wget -SET ZIP=%BUILD_DEPS_PATH%\..\Win32BuildSetup\tools\7z\7za +SET WGET=%CUR_PATH%\bin\wget +SET ZIP=%CUR_PATH%\..\Win32BuildSetup\tools\7z\7za IF NOT EXIST %DL_PATH% md %DL_PATH% @@ -34,15 +28,15 @@ IF NOT EXIST %MINGW_INSTALL_PATH% md %MINGW_INSTALL_PATH% IF NOT EXIST %TMP_PATH% md %TMP_PATH% -PUSHD %BUILD_DEPS_PATH%\scripts +cd scripts CALL get_msys_env.bat IF EXIST %TMP_PATH% rmdir %TMP_PATH% /S /Q CALL get_mingw_env.bat -POPD +cd %CUR_PATH% -REM update fstab to install path +rem update fstab to install path SET FSTAB=%MINGW_INSTALL_PATH% SET FSTAB=%FSTAB:\=/% SET FSTAB=%FSTAB:"=% @@ -52,12 +46,12 @@ SET FSTAB=%FSTAB:"=% ECHO %FSTAB% /xbmc>>"%MSYS_INSTALL_PATH%\etc\fstab" -REM insert call to vsvars32.bat in msys.bat -PUSHD %MSYS_INSTALL_PATH% +rem insert call to vsvars32.bat in msys.bat +cd %MSYS_INSTALL_PATH% Move msys.bat msys.bat_dist ECHO CALL "%VS120COMNTOOLS%vsvars32.bat">>msys.bat TYPE msys.bat_dist>>msys.bat -POPD +cd %CUR_PATH% IF EXIST %TMP_PATH% rmdir %TMP_PATH% /S /Q diff -Nru kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/0_package.list kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/0_package.list --- kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/0_package.list 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/0_package.list 2015-10-19 08:39:15.000000000 +0000 @@ -8,17 +8,16 @@ ;PLEASE KEEP THIS LIST IN ALPHABETICAL ORDER! boost-1.46.1-headers-win32.7z bzip2-1.0.5-win32.7z -crossguid-8f399e8bd4-win32.7z curl-7.42.1-win32.7z dnssd-541-win32.zip doxygen-1.8.2-win32.7z fontconfig-2.8.0-win32.7z freetype-2.4.6-win32-3.7z -giflib-5.1.1-win32.7z +giflib-5.0.5p-win32.7z gnutls-3.2.3-win32.zip jsonschemabuilder-1.0.0-win32-3.7z libass-0.12.1-win32.7z -libbluray-0.8.1-win32-vc120.7z +libbluray-0.4.0-win32.zip libcdio-0.83-win32-2.7z libcec-3.0.0-win32-2.7z libexpat_2.0.1-win32.7z @@ -35,7 +34,7 @@ librtmp-20150114-git-a107ce-win32.7z libsdl-1.2.10-win32.7z libsdl_image-1.2.14-win32.7z -libshairplay-52fd9db-win32.7z +libshairplay-41a66c9-win32.7z libssh-0.5.0-1-win32.zip libvorbis-vc100-1.3.1-win32.7z libxml2-2.7.8_1-win32.7z @@ -49,5 +48,5 @@ sqlite-3.8.6-win32-vc120.7z swig-2.0.7-win32-1.7z taglib-1.9.1-patched-win32-vc120.7z -texturepacker-1.0.6-win32.7z +texturepacker-1.0.2-win32.7z tinyxml-2.6.2_3-win32-vc120.7z diff -Nru kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/dlextract.bat kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/dlextract.bat --- kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/dlextract.bat 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/dlextract.bat 2015-10-19 08:39:15.000000000 +0000 @@ -1,23 +1,14 @@ @ECHO OFF -REM Turn on delayed variable expansion so that we can interpolate environment variables in the URLs -SETLOCAL enableDelayedExpansion - echo Downloading %1 echo -------------- cd %DL_PATH% FOR /F "eol=; tokens=1,2" %%f IN (%2) DO ( - set MIRROR=%%g - set MIRROR=!MIRROR:$KODI_MIRROR=%KODI_MIRROR%! - echo !MIRROR! %%f +echo %%f %%g IF NOT EXIST %%f ( - %WGET% "!MIRROR!%%f" - IF NOT EXIST %%f ( - echo Failed to download file %%f from !MIRROR! - EXIT /B 1 - ) + %WGET% "%%g/%%f" ) ELSE ( echo Already have %%f ) @@ -32,18 +23,8 @@ FOR /F "eol=; tokens=1,2" %%f IN (%2) DO ( %ZIP% x -y %%f - IF %ERRORLEVEL% NEQ 0 ( - echo Failed to unpack archive %%f - EXIT /B 2 - ) ) FOR /F "tokens=*" %%f IN ('dir /B "*.tar"') DO ( %ZIP% x -y %%f - IF %ERRORLEVEL% NEQ 0 ( - echo Failed to unpack archive %%f - EXIT /B 2 - ) -) - -ENDLOCAL +) \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/get_formed.cmd kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/get_formed.cmd --- kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/get_formed.cmd 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/get_formed.cmd 2015-10-19 08:39:15.000000000 +0000 @@ -2,9 +2,6 @@ SETLOCAL -REM So that we can expand variables inside of IF and FOR -SETLOCAL enableDelayedExpansion - REM Check presence of required file dir 0_package.list >NUL 2>NUL || ( ECHO 0_package.list not found! @@ -17,36 +14,17 @@ del /F /Q "%FORMED_OK_FLAG%" || EXIT /B 4 ) -REM Clear the "failures" list -SET FORMED_FAILED_LIST=%TMP_PATH%\failed-formed-packages -IF EXIST %FORMED_FAILED_LIST% ( - del /F /Q "%FORMED_FAILED_LIST%" || EXIT /B 4 -) - -REM If KODI_MIRROR is not set externally to this script, set it to the default mirror URL -IF "%KODI_MIRROR%" == "" SET KODI_MIRROR=http://mirrors.kodi.tv -echo Downloading from mirror %KODI_MIRROR% - - CALL :setStageName Starting downloads of formed packages... SET SCRIPT_PATH=%CD% CD %DL_PATH% || EXIT /B 10 FOR /F "eol=; tokens=1" %%f IN (%SCRIPT_PATH%\0_package.list) DO ( - CALL :processFile %%f +CALL :processFile %%f +IF ERRORLEVEL 1 EXIT /B %ERRORLEVEL% ) -REM Report any errors -IF EXIST %FORMED_FAILED_LIST% ( - CALL :setStageName Some formed packages had errors - ECHO. - FOR /F "tokens=1,2 delims=|" %%x IN (%FORMED_FAILED_LIST%) DO @ECHO %%x: - %%y - ECHO. - EXIT /B 101 -) ELSE ( - CALL :setStageName All formed packages ready. - ECHO %DATE% %TIME% > "%FORMED_OK_FLAG%" - EXIT /B 0 -) +CALL :setStageName All formed packages ready. +ECHO %DATE% %TIME% > "%FORMED_OK_FLAG%" +EXIT /B 0 REM End of main body @@ -58,8 +36,7 @@ ECHO Using downloaded %1 ) ELSE ( CALL :setSubStageName Downloading %1... - SET DOWNLOAD_URL=%KODI_MIRROR%/build-deps/win32/%1 - %WGET% "!DOWNLOAD_URL!" || ECHO %1^|Download of !DOWNLOAD_URL! failed >> %FORMED_FAILED_LIST% && EXIT /B 7 + %WGET% "http://mirrors.xbmc.org/build-deps/win32/%1" || EXIT /B 7 TITLE Getting %1 ) @@ -74,8 +51,6 @@ del /f "%1" SET RetryDownload=NO GOTO startDownloadingFile - ) ELSE ( - ECHO %1^|Can't extract files from archive %1 >> %FORMED_FAILED_LIST% ) exit /B 6 ) @@ -83,17 +58,17 @@ dir /A:-D "%~n1\*.*" >NUL 2>NUL && ( CALL :setSubStageName Pre-Cleaning %1... REM Remove any non-dir files in extracted ".\packagename\" -FOR /F %%f IN ('dir /B /A:-D "%~n1\*.*"') DO (del "%~n1\%%f" /F /Q || (ECHO %1^|Failed to pre-clean %~n1\%%f >> %FORMED_FAILED_LIST% && EXIT /B 4)) +FOR /F %%f IN ('dir /B /A:-D "%~n1\*.*"') DO (del "%~n1\%%f" /F /Q || EXIT /B 4) ) CALL :setSubStageName Copying %1 to build tree... REM Copy only content of extracted ".\packagename\" -XCOPY "%~n1\*" "%APP_PATH%\" /E /I /Y /F /R /H /K || (ECHO %1^|Failed to copy package contents to build tree >> %FORMED_FAILED_LIST% && EXIT /B 5) +XCOPY "%~n1\*" "%APP_PATH%\" /E /I /Y /F /R /H /K || EXIT /B 5 dir /A:-D * >NUL 2>NUL && ( CALL :setSubStageName Post-Cleaning %1... REM Delete package archive and possible garbage -FOR /F %%f IN ('dir /B /A:-D') DO (del %%f /F /Q || (ECHO %1^|Failed to post-clean %%f >> %FORMED_FAILED_LIST% && EXIT /B 4)) +FOR /F %%f IN ('dir /B /A:-D') DO (del %%f /F /Q || EXIT /B 4) ) ECHO. diff -Nru kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/get_mingw_env.bat kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/get_mingw_env.bat --- kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/get_mingw_env.bat 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/get_mingw_env.bat 2015-10-19 08:39:15.000000000 +0000 @@ -6,7 +6,6 @@ IF NOT EXIST %TMP_PATH% md %TMP_PATH% CALL dlextract.bat mingw_env %FILES% -IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL% cd %TMP_PATH% diff -Nru kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/get_mingw_env.txt kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/get_mingw_env.txt --- kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/get_mingw_env.txt 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/get_mingw_env.txt 2015-10-19 08:39:15.000000000 +0000 @@ -1,32 +1,31 @@ -; filename mirror source of the file -mingwrt-4.0.3-1-mingw32-dev.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/Base/ -mingwrt-4.0.3-1-mingw32-dll.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/Base/ -w32api-4.0.3-1-mingw32-dev.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/Base/ -gcc-core-4.6.2-1-mingw32-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/BaseSystem/GCC/Version4/gcc-4.6.2-1/ -gcc-c++-4.6.2-1-mingw32-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/BaseSystem/GCC/Version4/gcc-4.6.2-1/ -libstdc++-4.6.2-1-mingw32-dll-6.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/BaseSystem/GCC/Version4/gcc-4.6.2-1/ -libgcc-4.6.2-1-mingw32-dll-1.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/BaseSystem/GCC/Version4/gcc-4.6.2-1/ -binutils-2.22-1-mingw32-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/BaseSystem/GNU-Binutils/binutils-2.22/ -yasm-1.2.0-win32.exe $KODI_MIRROR/build-deps/win32/mingw-msys/ http://www.tortall.net/projects/yasm/releases/ -dlfcn-win32-static-r19.tar.bz2 $KODI_MIRROR/build-deps/win32/mingw-msys/ http://code.google.com/p/dlfcn-win32/downloads/list -libexpat-2.0.1-1-mingw32-dev.tar.gz $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/expat/expat-2.0.1-1/ -libz-1.2.5-1-mingw32-dev.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/zlib/zlib-1.2.5-1-mingw32/ -libgmp-5.0.1-1-mingw32-dll-10.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/gmp/gmp-5.0.1-1/ -libmpc-0.8.1-1-mingw32-dll-2.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/mpc/mpc-0.8.1-1/ -libmpfr-2.4.1-1-mingw32-dll-1.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/mpfr/mpfr-2.4.1-1/ -automake1.11-1.11.1-1-mingw32-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/automake/automake1.11/automake1.11-1.11.1-1/ -libtool-2.4-1-mingw32-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/libtool/libtool-2.4-1/ -mads_1.9.3.7z $KODI_MIRROR/build-deps/win32/mingw-msys/ http://mads.atari8.info/ -xasm-3.0.2-windows.zip $KODI_MIRROR/build-deps/win32/mingw-msys/ http://atariarea.krap.pl/x-asm/ -plibc-0.1.6.zip $KODI_MIRROR/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/plibc/files/plibc/0.1.6/ -pthreads-w32-2.9.0-mingw32-pre-20110507-2-dev.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/pthreads-w32/pthreads-w32-2.9.0-pre-20110507-2/pthreads-w32-2.9.0-mingw32-pre-20110507-2-dev.tar.lzma -libpthreadgc-2.9.0-mingw32-pre-20110507-2-dll-2.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/Base/pthreads-w32/pthreads-w32-2.9.0-pre-20110507-2/libpthreadgc-2.9.0-mingw32-pre-20110507-2-dll-2.tar.lzma -gettext-0.17-1-mingw32-dev.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/gettext/gettext-0.17-1/gettext-0.17-1-mingw32-dev.tar.lzma -libgettextpo-0.17-1-mingw32-dll-0.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/gettext/gettext-0.17-1/libgettextpo-0.17-1-mingw32-dll-0.tar.lzma -libintl-0.17-1-mingw32-dll-8.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/gettext/gettext-0.17-1/ -libiconv-1.13.1-1-mingw32-dll-2.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/libiconv/libiconv-1.13.1-1/ -libiconv-1.13.1-1-mingw32-dev.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/libiconv/libiconv-1.13.1-1/ -make-3.82-5-mingw32-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/Extension/make/make-3.82-mingw32/ -pkg-config-lite-0.28-1_bin-win32.zip $KODI_MIRROR/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/pkgconfiglite/files/http://sourceforge.net/projects/pkgconfiglite/files/ -gnutls-3.2.3-mingw32.zip $KODI_MIRROR/build-deps/win32/mingw-msys/ ftp://ftp.gnutls.org/gcrypt/gnutls/w32/ -libdcadec-git-396e75652-win32.zip $KODI_MIRROR/build-deps/win32/mingw-msys/ https://github.com/foo86/dcadec/ +; filename mirror source of the file +mingwrt-4.0.3-1-mingw32-dev.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/Base/ +mingwrt-4.0.3-1-mingw32-dll.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/Base/ +w32api-4.0.3-1-mingw32-dev.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/Base/ +gcc-core-4.6.2-1-mingw32-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/BaseSystem/GCC/Version4/gcc-4.6.2-1/ +gcc-c++-4.6.2-1-mingw32-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/BaseSystem/GCC/Version4/gcc-4.6.2-1/ +libstdc++-4.6.2-1-mingw32-dll-6.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/BaseSystem/GCC/Version4/gcc-4.6.2-1/ +libgcc-4.6.2-1-mingw32-dll-1.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/BaseSystem/GCC/Version4/gcc-4.6.2-1/ +binutils-2.22-1-mingw32-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/BaseSystem/GNU-Binutils/binutils-2.22/ +yasm-1.2.0-win32.exe http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://www.tortall.net/projects/yasm/releases/ +dlfcn-win32-static-r19.tar.bz2 http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://code.google.com/p/dlfcn-win32/downloads/list +libexpat-2.0.1-1-mingw32-dev.tar.gz http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/expat/expat-2.0.1-1/ +libz-1.2.5-1-mingw32-dev.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/zlib/zlib-1.2.5-1-mingw32/ +libgmp-5.0.1-1-mingw32-dll-10.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/gmp/gmp-5.0.1-1/ +libmpc-0.8.1-1-mingw32-dll-2.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/mpc/mpc-0.8.1-1/ +libmpfr-2.4.1-1-mingw32-dll-1.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/mpfr/mpfr-2.4.1-1/ +automake1.11-1.11.1-1-mingw32-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/automake/automake1.11/automake1.11-1.11.1-1/ +libtool-2.4-1-mingw32-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/libtool/libtool-2.4-1/ +mads_1.9.3.7z http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://mads.atari8.info/ +xasm-3.0.2-windows.zip http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://atariarea.krap.pl/x-asm/ +plibc-0.1.6.zip http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/plibc/files/plibc/0.1.6/ +pthreads-w32-2.9.0-mingw32-pre-20110507-2-dev.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/pthreads-w32/pthreads-w32-2.9.0-pre-20110507-2/pthreads-w32-2.9.0-mingw32-pre-20110507-2-dev.tar.lzma +libpthreadgc-2.9.0-mingw32-pre-20110507-2-dll-2.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/Base/pthreads-w32/pthreads-w32-2.9.0-pre-20110507-2/libpthreadgc-2.9.0-mingw32-pre-20110507-2-dll-2.tar.lzma +gettext-0.17-1-mingw32-dev.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/gettext/gettext-0.17-1/gettext-0.17-1-mingw32-dev.tar.lzma +libgettextpo-0.17-1-mingw32-dll-0.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MinGW/gettext/gettext-0.17-1/libgettextpo-0.17-1-mingw32-dll-0.tar.lzma +libintl-0.17-1-mingw32-dll-8.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/gettext/gettext-0.17-1/ +libiconv-1.13.1-1-mingw32-dll-2.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/libiconv/libiconv-1.13.1-1/ +libiconv-1.13.1-1-mingw32-dev.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/libiconv/libiconv-1.13.1-1/ +make-3.82-5-mingw32-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/mingw/files/MinGW/Extension/make/make-3.82-mingw32/ +pkg-config-lite-0.28-1_bin-win32.zip http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://sourceforge.net/projects/pkgconfiglite/files/http://sourceforge.net/projects/pkgconfiglite/files/ +gnutls-3.2.3-mingw32.zip http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ ftp://ftp.gnutls.org/gcrypt/gnutls/w32/ diff -Nru kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/get_msys_env.bat kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/get_msys_env.bat --- kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/get_msys_env.bat 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/get_msys_env.bat 2015-10-19 08:39:15.000000000 +0000 @@ -4,7 +4,6 @@ SET FILES=%LOC_PATH%\get_msys_env.txt CALL dlextract.bat msys_env %FILES% -IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL% cd %TMP_PATH% diff -Nru kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/get_msys_env.txt kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/get_msys_env.txt --- kodi-16.1~git20160425.1001-final/project/BuildDependencies/scripts/get_msys_env.txt 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/BuildDependencies/scripts/get_msys_env.txt 2015-10-19 08:39:15.000000000 +0000 @@ -1,32 +1,32 @@ -; filename mirror source of the file -msysCORE-1.0.17-1-msys-1.0.17-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/msys-core/msys-1.0.17-1/ -msysCORE-1.0.17-1-msys-1.0.17-ext.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/msys-core/msys-1.0.17-1/ -libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/regex/regex-1.20090805-2/ -libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/termcap/termcap-0.20050421_1-2/ -gettext-0.17-2-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/gettext/gettext-0.17-2/ -libintl-0.17-2-msys-dll-8.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/gettext/gettext-0.17-2/ -libiconv-1.13.1-2-msys-1.0.13-dll-2.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/libiconv/libiconv-1.13.1-2/ -coreutils-5.97-3-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/coreutils/coreutils-5.97-3/ -bash-3.1.17-4-msys-1.0.16-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/bash/bash-3.1.17-4/ -rxvt-2.7.2-3-msys-1.0.14-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/rxvt/rxvt-2.7.2-3/ -make-3.81-3-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/make/make-3.81-3/ -sed-4.2.1-2-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/sed/sed-4.2.1-2/ -grep-2.5.4-2-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/grep/grep-2.5.4-2/ -diffutils-2.8.7.20071206cvs-3-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/diffutils/diffutils-2.8.7.20071206cvs-3/ -tar-1.23-1-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/tar/tar-1.23-1/ -gzip-1.3.12-2-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/gzip/gzip-1.3.12-2/ -gawk-3.1.7-2-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/gawk/gawk-3.1.7-2/ -xz-4.999.9beta_20100401-1-msys-1.0.13-bin.tar.gz $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/xz/xz-4.999.9beta_20100401-1/ -patch-2.6.1-1-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/patch/patch-2.6.1-1/ -perl-5.6.1_2-2-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/perl/perl-5.6.1_2-2/ -libcrypt-1.1_1-3-msys-1.0.13-dll-0.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/crypt/crypt-1.1_1-3/ -autoconf-2.68-1-msys-1.0.17-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/autoconf/autoconf-2.68-1/ -m4-1.4.14-1-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/m4/m4-1.4.14-1/ +; filename mirror source of the file +msysCORE-1.0.17-1-msys-1.0.17-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/msys-core/msys-1.0.17-1/ +msysCORE-1.0.17-1-msys-1.0.17-ext.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/msys-core/msys-1.0.17-1/ +libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/regex/regex-1.20090805-2/ +libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/termcap/termcap-0.20050421_1-2/ +gettext-0.17-2-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/gettext/gettext-0.17-2/ +libintl-0.17-2-msys-dll-8.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/gettext/gettext-0.17-2/ +libiconv-1.13.1-2-msys-1.0.13-dll-2.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/libiconv/libiconv-1.13.1-2/ +coreutils-5.97-3-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/coreutils/coreutils-5.97-3/ +bash-3.1.17-4-msys-1.0.16-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/bash/bash-3.1.17-4/ +rxvt-2.7.2-3-msys-1.0.14-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/rxvt/rxvt-2.7.2-3/ +make-3.81-3-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/make/make-3.81-3/ +sed-4.2.1-2-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/sed/sed-4.2.1-2/ +grep-2.5.4-2-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/grep/grep-2.5.4-2/ +diffutils-2.8.7.20071206cvs-3-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/diffutils/diffutils-2.8.7.20071206cvs-3/ +tar-1.23-1-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/tar/tar-1.23-1/ +gzip-1.3.12-2-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/gzip/gzip-1.3.12-2/ +gawk-3.1.7-2-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/gawk/gawk-3.1.7-2/ +xz-4.999.9beta_20100401-1-msys-1.0.13-bin.tar.gz http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/BaseSystem/xz/xz-4.999.9beta_20100401-1/ +patch-2.6.1-1-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/patch/patch-2.6.1-1/ +perl-5.6.1_2-2-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/perl/perl-5.6.1_2-2/ +libcrypt-1.1_1-3-msys-1.0.13-dll-0.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/crypt/crypt-1.1_1-3/ +autoconf-2.68-1-msys-1.0.17-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/autoconf/autoconf-2.68-1/ +m4-1.4.14-1-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/m4/m4-1.4.14-1/ ; to get pr.exe -coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2 $KODI_MIRROR/build-deps/win32/mingw-msys/ http://www.finalmediaplayer.com/downloads/3rdparty/ +coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2 http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://www.finalmediaplayer.com/downloads/3rdparty/ ; for xargs.exe -findutils-4.4.2-2-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/findutils/findutils-4.4.2-2/ -automake-1.11.1-1-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/automake/automake-1.11.1-1/ -mktemp-1.6-2-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/mktemp/mktemp-1.6-2/ -texinfo-4.13a-2-msys-1.0.13-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/texinfo/texinfo-4.13a-2/ -libtool-2.4-1-msys-1.0.15-bin.tar.lzma $KODI_MIRROR/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/libtool/libtool-2.4-1/libtool-2.4-1-msys-1.0.15-bin.tar.lzma +findutils-4.4.2-2-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/findutils/findutils-4.4.2-2/ +automake-1.11.1-1-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/automake/automake-1.11.1-1/ +mktemp-1.6-2-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/mktemp/mktemp-1.6-2/ +texinfo-4.13a-2-msys-1.0.13-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/texinfo/texinfo-4.13a-2/ +libtool-2.4-1-msys-1.0.15-bin.tar.lzma http://mirrors.xbmc.org/build-deps/win32/mingw-msys/ http://downloads.sourceforge.net/project/mingw/MSYS/libtool/libtool-2.4-1/libtool-2.4-1-msys-1.0.15-bin.tar.lzma \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.modplug/audiodecoder.modplug.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.modplug/audiodecoder.modplug.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.modplug/audiodecoder.modplug.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.modplug/audiodecoder.modplug.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audiodecoder.modplug https://github.com/notspiff/audiodecoder.modplug 5ae7349 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.modplug/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.modplug/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.modplug/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.modplug/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.nosefart/audiodecoder.nosefart.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.nosefart/audiodecoder.nosefart.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.nosefart/audiodecoder.nosefart.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.nosefart/audiodecoder.nosefart.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audiodecoder.nosefart https://github.com/notspiff/audiodecoder.nosefart 936313f diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.nosefart/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.nosefart/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.nosefart/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.nosefart/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.sidplay/audiodecoder.sidplay.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.sidplay/audiodecoder.sidplay.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.sidplay/audiodecoder.sidplay.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.sidplay/audiodecoder.sidplay.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audiodecoder.sidplay https://github.com/notspiff/audiodecoder.sidplay 27b2c05 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.sidplay/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.sidplay/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.sidplay/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.sidplay/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.snesapu/audiodecoder.snesapu.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.snesapu/audiodecoder.snesapu.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.snesapu/audiodecoder.snesapu.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.snesapu/audiodecoder.snesapu.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audiodecoder.snesapu https://github.com/notspiff/audiodecoder.snesapu 399d1d3 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.snesapu/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.snesapu/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.snesapu/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.snesapu/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.stsound/audiodecoder.stsound.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.stsound/audiodecoder.stsound.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.stsound/audiodecoder.stsound.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.stsound/audiodecoder.stsound.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audiodecoder.stsound https://github.com/notspiff/audiodecoder.stsound f6fbae9 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.stsound/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.stsound/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.stsound/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.stsound/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.timidity/audiodecoder.timidity.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.timidity/audiodecoder.timidity.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.timidity/audiodecoder.timidity.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.timidity/audiodecoder.timidity.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audiodecoder.timidity https://github.com/notspiff/audiodecoder.timidity da5eb9a diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.timidity/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.timidity/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.timidity/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.timidity/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +!windows \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.vgmstream/audiodecoder.vgmstream.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.vgmstream/audiodecoder.vgmstream.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.vgmstream/audiodecoder.vgmstream.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.vgmstream/audiodecoder.vgmstream.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audiodecoder.vgmstream https://github.com/notspiff/audiodecoder.vgmstream 7723f91 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.vgmstream/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.vgmstream/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audiodecoder.vgmstream/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audiodecoder.vgmstream/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.flac/audioencoder.flac.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.flac/audioencoder.flac.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.flac/audioencoder.flac.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.flac/audioencoder.flac.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audioencoder.flac https://github.com/xbmc/audioencoder.flac 8e67185 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.flac/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.flac/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.flac/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.flac/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +!ios \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.lame/audioencoder.lame.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.lame/audioencoder.lame.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.lame/audioencoder.lame.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.lame/audioencoder.lame.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audioencoder.lame https://github.com/xbmc/audioencoder.lame b283cd5 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.lame/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.lame/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.lame/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.lame/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.vorbis/audioencoder.vorbis.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.vorbis/audioencoder.vorbis.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.vorbis/audioencoder.vorbis.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.vorbis/audioencoder.vorbis.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audioencoder.vorbis https://github.com/xbmc/audioencoder.vorbis 15d619d diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.vorbis/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.vorbis/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.vorbis/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.vorbis/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.wav/audioencoder.wav.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.wav/audioencoder.wav.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.wav/audioencoder.wav.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.wav/audioencoder.wav.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +audioencoder.wav https://github.com/xbmc/audioencoder.wav 797c990 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.wav/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.wav/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/audioencoder.wav/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/audioencoder.wav/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.argustv/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.argustv/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.argustv/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.argustv/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.argustv/pvr.argustv.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.argustv/pvr.argustv.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.argustv/pvr.argustv.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.argustv/pvr.argustv.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.argustv https://github.com/kodi-pvr/pvr.argustv 32f0327 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.demo/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.demo/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.demo/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.demo/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.demo/pvr.demo.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.demo/pvr.demo.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.demo/pvr.demo.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.demo/pvr.demo.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.demo https://github.com/kodi-pvr/pvr.demo 3b2cd18 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.dvblink/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.dvblink/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.dvblink/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.dvblink/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.dvblink/pvr.dvblink.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.dvblink/pvr.dvblink.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.dvblink/pvr.dvblink.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.dvblink/pvr.dvblink.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.dvblink https://github.com/kodi-pvr/pvr.dvblink cf756e9 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.dvbviewer/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.dvbviewer/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.dvbviewer/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.dvbviewer/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.dvbviewer/pvr.dvbviewer.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.dvbviewer/pvr.dvbviewer.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.dvbviewer/pvr.dvbviewer.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.dvbviewer/pvr.dvbviewer.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.dvbviewer https://github.com/kodi-pvr/pvr.dvbviewer cbfd455 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.filmon/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.filmon/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.filmon/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.filmon/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.filmon/pvr.filmon.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.filmon/pvr.filmon.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.filmon/pvr.filmon.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.filmon/pvr.filmon.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.filmon https://github.com/kodi-pvr/pvr.filmon 67abb56 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.hts/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.hts/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.hts/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.hts/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.hts/pvr.hts.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.hts/pvr.hts.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.hts/pvr.hts.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.hts/pvr.hts.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.hts https://github.com/kodi-pvr/pvr.hts 016b0b3 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.iptvsimple/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.iptvsimple/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.iptvsimple/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.iptvsimple/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.iptvsimple/pvr.iptvsimple.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.iptvsimple/pvr.iptvsimple.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.iptvsimple/pvr.iptvsimple.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.iptvsimple/pvr.iptvsimple.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.iptvsimple https://github.com/kodi-pvr/pvr.iptvsimple 23defeb diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.mediaportal.tvserver/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.mediaportal.tvserver/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.mediaportal.tvserver/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.mediaportal.tvserver/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.mediaportal.tvserver/pvr.mediaportal.tvserver.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.mediaportal.tvserver/pvr.mediaportal.tvserver.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.mediaportal.tvserver/pvr.mediaportal.tvserver.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.mediaportal.tvserver/pvr.mediaportal.tvserver.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.mediaportal.tvserver https://github.com/kodi-pvr/pvr.mediaportal.tvserver 29809d1 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.mythtv/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.mythtv/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.mythtv/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.mythtv/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.mythtv/pvr.mythtv.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.mythtv/pvr.mythtv.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.mythtv/pvr.mythtv.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.mythtv/pvr.mythtv.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.mythtv https://github.com/kodi-pvr/pvr.mythtv 8cb158c diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.nextpvr/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.nextpvr/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.nextpvr/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.nextpvr/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.nextpvr/pvr.nextpvr.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.nextpvr/pvr.nextpvr.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.nextpvr/pvr.nextpvr.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.nextpvr/pvr.nextpvr.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.nextpvr https://github.com/kodi-pvr/pvr.nextpvr 3a205e4 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.njoy/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.njoy/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.njoy/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.njoy/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.njoy/pvr.njoy.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.njoy/pvr.njoy.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.njoy/pvr.njoy.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.njoy/pvr.njoy.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.njoy https://github.com/kodi-pvr/pvr.njoy 4f88a09 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.pctv/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.pctv/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.pctv/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.pctv/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.pctv/pvr.pctv.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.pctv/pvr.pctv.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.pctv/pvr.pctv.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.pctv/pvr.pctv.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.pctv https://github.com/kodi-pvr/pvr.pctv bca8165 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.stalker/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.stalker/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.stalker/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.stalker/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.stalker/pvr.stalker.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.stalker/pvr.stalker.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.stalker/pvr.stalker.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.stalker/pvr.stalker.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.stalker https://github.com/kodi-pvr/pvr.stalker a89afb8 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vbox/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vbox/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vbox/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vbox/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vbox/pvr.vbox.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vbox/pvr.vbox.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vbox/pvr.vbox.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vbox/pvr.vbox.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.vbox https://github.com/kodi-pvr/pvr.vbox 0b1d571 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vdr.vnsi/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vdr.vnsi/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vdr.vnsi/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vdr.vnsi/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vdr.vnsi/pvr.vdr.vnsi.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vdr.vnsi/pvr.vdr.vnsi.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vdr.vnsi/pvr.vdr.vnsi.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vdr.vnsi/pvr.vdr.vnsi.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.vdr.vnsi https://github.com/kodi-pvr/pvr.vdr.vnsi 550a4a2 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vuplus/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vuplus/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vuplus/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vuplus/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vuplus/pvr.vuplus.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vuplus/pvr.vuplus.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.vuplus/pvr.vuplus.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.vuplus/pvr.vuplus.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.vuplus https://github.com/kodi-pvr/pvr.vuplus 96115e9 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.wmc/platforms.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.wmc/platforms.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.wmc/platforms.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.wmc/platforms.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +all \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.wmc/pvr.wmc.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.wmc/pvr.wmc.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/addons/pvr.wmc/pvr.wmc.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/addons/pvr.wmc/pvr.wmc.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +pvr.wmc https://github.com/kodi-pvr/pvr.wmc e19c3e9 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/bootstrap/bootstrap.cmake kodi-15.2~git20151019.1039-final/project/cmake/addons/bootstrap/bootstrap.cmake --- kodi-16.1~git20160425.1001-final/project/cmake/addons/bootstrap/bootstrap.cmake 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/bootstrap/bootstrap.cmake 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) - -# make sure that the installation location has been specified -if(NOT CMAKE_INSTALL_PREFIX) - message(FATAL_ERROR "CMAKE_INSTALL_PREFIX has not been specified") -endif() - -# figure out which addons to bootstrap (defaults to all) -if(NOT ADDONS_TO_BUILD) - set(ADDONS_TO_BUILD "all") -else() - separate_arguments(ADDONS_TO_BUILD) -endif() - -# find all addon definitions and go through them -file(GLOB_RECURSE ADDON_DEFINITIONS ${PROJECT_SOURCE_DIR}/*.txt) -foreach(ADDON_DEFINITION_FILE ${ADDON_DEFINITIONS}) - # ignore platforms.txt - if(NOT (ADDON_DEFINITION_FILE MATCHES platforms.txt)) - # read the addon definition file - file(STRINGS ${ADDON_DEFINITION_FILE} ADDON_DEFINITION) - separate_arguments(ADDON_DEFINITION) - - # extract the addon definition's identifier - list(GET ADDON_DEFINITION 0 ADDON_ID) - - # check if the addon definition should be built - list(FIND ADDONS_TO_BUILD ${ADDON_ID} ADDONS_TO_BUILD_IDX) - if(ADDONS_TO_BUILD_IDX GREATER -1 OR "${ADDONS_TO_BUILD}" STREQUAL "all") - # get the path to the addon definition directory - get_filename_component(ADDON_DEFINITION_DIR ${ADDON_DEFINITION_FILE} PATH) - - # install the addon definition - message(STATUS "Bootstrapping ${ADDON_ID} addon...") - file(INSTALL ${ADDON_DEFINITION_DIR} DESTINATION ${CMAKE_INSTALL_PREFIX}) - endif() - endif() -endforeach() diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/bootstrap/CMakeLists.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/bootstrap/CMakeLists.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/bootstrap/CMakeLists.txt 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/bootstrap/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,95 +0,0 @@ -project(kodi-addons-bootstrap) - -cmake_minimum_required(VERSION 2.8) - -list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) - -# make sure CMAKE_INSTALL_PREFIX is properly set -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR NOT CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/../addons") -endif() -list(APPEND CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX}) - -# figure out where the build directory is located -if(NOT BUILD_DIR) - set(BUILD_DIR "${CMAKE_BINARY_DIR}/build") -else() - file(TO_CMAKE_PATH "${BUILD_DIR}" BUILD_DIR) -endif() -get_filename_component(BUILD_DIR "${BUILD_DIR}" ABSOLUTE) - -# make sure that the repositories to build have been specified -if(NOT REPOSITORY_TO_BUILD) - set(REPOSITORY_TO_BUILD_DEFAULT ON) - set(REPOSITORY_TO_BUILD "all") - set(REPOSITORY_REVISION "") - message(STATUS "Bootstrapping all repositories") -else() - set(REPOSITORY_TO_BUILD_DEFAULT OFF) - message(STATUS "Bootstrapping following repository: ${REPOSITORY_TO_BUILD}") -endif() - -# figure out which addons to bootstrap (defaults to all) -if(NOT ADDONS_TO_BUILD) - set(ADDONS_TO_BUILD "all") - message(STATUS "Bootstrapping all addons") -else() - message(STATUS "Bootstrapping following addons: ${ADDONS_TO_BUILD}") -endif() - -include(ExternalProject) - -function(bootstrap_repo repo_id repo_url repo_revision) - message(STATUS "Bootstrapping addons from ${repo_id} (${repo_url} ${repo_revision})...") - externalproject_add(${repo_id} - GIT_REPOSITORY ${repo_url} - GIT_TAG ${repo_revision} - PREFIX ${BUILD_DIR}/${repo_id} - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND ${CMAKE_COMMAND} - -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} - -DPROJECT_SOURCE_DIR= - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DADDONS_TO_BUILD=${ADDONS_TO_BUILD} - -P ${PROJECT_SOURCE_DIR}/bootstrap.cmake - ) -endfunction() - -# look for all addons repository definitions -set(REPOSITORY_TO_BUILD_FOUND OFF) -file(GLOB repos repositories/*.txt) -foreach(repo ${repos}) - file(STRINGS ${repo} repo_definition) - separate_arguments(repo_definition) - list(GET repo_definition 0 repo_id) - - list(FIND REPOSITORY_TO_BUILD ${repo_id} idx) - if(idx GREATER -1 OR REPOSITORY_TO_BUILD STREQUAL "all") - set(REPOSITORY_TO_BUILD_FOUND ON) - - # get the URL of the repository - list(GET repo_definition 1 repo_url) - - # get the revision of the repository if not provided as an argument - if(NOT REPOSITORY_REVISION) - list(GET repo_definition 2 repo_revision) - else() - set(repo_revision "${REPOSITORY_REVISION}") - endif() - - bootstrap_repo(${repo_id} ${repo_url} ${repo_revision}) - endif() -endforeach() - -# if we have been asked to bootstrap a specific repository (not the default one) and -# it couldn't be found in the predefined repository definitions we assume that it's a -# URL to a specific repository -if(NOT REPOSITORY_TO_BUILD_DEFAULT AND NOT REPOSITORY_TO_BUILD_FOUND) - # default to the master branch if no revision has been provided - if(NOT REPOSITORY_REVISION) - set(REPOSITORY_REVISION "master") - endif() - - bootstrap_repo(binary-addons-custom ${REPOSITORY_TO_BUILD} ${REPOSITORY_REVISION}) -endif() diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/bootstrap/README.md kodi-15.2~git20151019.1039-final/project/cmake/addons/bootstrap/README.md --- kodi-16.1~git20160425.1001-final/project/cmake/addons/bootstrap/README.md 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/bootstrap/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -# KODI ADDON DEFINITIONS BOOTSTRAPPING -This directory contains the cmake-based buildsystem for addon definitions -bootstrapping which downloads the addon definitions from one or more addon -definitions repositories. These addon definitions are then used by the addon -buildsystem to figure out which addons and which versions to build. It looks -into the "repositories" sub-directory and parses all *.txt files recursively. -Each addon definitions repository must have its own .txt file which -must follow the following defined format: -``` - -``` -where -* `` is the identification of the repository. -* `` must be the URL of the git repository containing the addon - definitions -* `` must be a valid git tag/branch/commit in the addon - definitions repository's git repository which will be used for the build - -The buildsystem uses the following variables (which can be passed into it when -executing cmake with the `-D=` option): -* `CMAKE_INSTALL_PREFIX` points to the directory where the downloaded addon -definitions will be installed to (defaults to `../addons`). -* `BUILD_DIR` points to the directory where the addon definitions repositories -will be downloaded to. -* `REPOSITORY_TO_BUILD` specifies a single addon definitions repository to be -downloaded and processed (defaults to `"all"`). -* `REPOSITORY_REVISION` specifies the git revision in the addon definitions -repository which will be used for the build. This option is only valid in -combination with the `REPOSITORY_TO_BUILD` option (defaults to the git -revision specified in the repository's definition file). -* `ADDONS_TO_BUILD` is a quoted, space delimited list of ``s that -should be bootstrapped (default is `"all"`). - -To trigger the cmake-based buildsystem the following command must be executed -with being the path to this directory (absolute or relative, allowing for -in-source and out-of-source builds). -``` -cmake -G -``` - -cmake supports multiple generators, see -http://www.cmake.org/cmake/help/v2.8.8/cmake.html#section_Generators for a list. - -In case of additional options the call might look like this -``` -cmake [-G ] \ - -DCMAKE_INSTALL_PREFIX="" -``` \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/bootstrap/repositories/binary-addons.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/bootstrap/repositories/binary-addons.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/bootstrap/repositories/binary-addons.txt 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/bootstrap/repositories/binary-addons.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -binary-addons https://github.com/xbmc/repo-binary-addons.git Jarvis diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/CMakeLists.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/CMakeLists.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/CMakeLists.txt 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/CMakeLists.txt 2015-10-19 08:39:15.000000000 +0000 @@ -1,31 +1,15 @@ project(kodi-addons) -if(WIN32) - # there seems to be a bug in the CMake generator implementation in CMake 2.8.x releases for WIN32 - cmake_minimum_required(VERSION 3.0) -else() - cmake_minimum_required(VERSION 2.8) -endif() +cmake_minimum_required(VERSION 2.8) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) -option(ADDON_TARBALL_CACHING "Cache downloaded addon source tarballs?" ON) -if(ADDON_TARBALL_CACHING) - message(STATUS "Addon source tarball caching is enabled") -else() - message(STATUS "Addon source tarball caching is disabled") -endif() - if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() if(NOT CORE_SYSTEM_NAME) - if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") - set(CORE_SYSTEM_NAME "osx") - else() - string(TOLOWER ${CMAKE_SYSTEM_NAME} CORE_SYSTEM_NAME) - endif() + string(TOLOWER ${CMAKE_SYSTEM_NAME} CORE_SYSTEM_NAME) endif() include(ExternalProject) @@ -81,7 +65,6 @@ set(BUILD_ARGS -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DCMAKE_INSTALL_PREFIX:PATH= -DPACKAGE_CONFIG_PATH=${DEPENDS_PATH}/lib/pkgconfig - -DDEPENDS_PATH=${DEPENDS_PATH} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_USER_MAKE_RULES_OVERRIDE=${CMAKE_USER_MAKE_RULES_OVERRIDE} -DCMAKE_USER_MAKE_RULES_OVERRIDE_CXX=${CMAKE_USER_MAKE_RULES_OVERRIDE_CXX} @@ -95,26 +78,16 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON) endif() -option(PACKAGE_ZIP "Prepare built addons for packaging" OFF) if(PACKAGE_ZIP) # needed for project installing - list(APPEND BUILD_ARGS -DPACKAGE_ZIP=ON) - - # figure out where to store the packaged ZIP archives - if(NOT PACKAGE_DIR) - set(PACKAGE_DIR "${BUILD_DIR}/zips") - else() - file(TO_CMAKE_PATH "${PACKAGE_DIR}" PACKAGE_DIR) - endif() - list(APPEND BUILD_ARGS -DPACKAGE_DIR=${PACKAGE_DIR}) - - MESSAGE(STATUS "ZIP packaging enabled (destination: ${PACKAGE_DIR})") + list(APPEND BUILD_ARGS -DPACKAGE_ZIP=1) + MESSAGE("package zip specified") endif() if(CMAKE_TOOLCHAIN_FILE) list(APPEND BUILD_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - MESSAGE(STATUS "Toolchain specified") - MESSAGE(STATUS ${BUILD_ARGS}) + MESSAGE("toolchain specified") + MESSAGE(${BUILD_ARGS}) endif() if(NOT ADDONS_TO_BUILD) @@ -124,15 +97,7 @@ separate_arguments(ADDONS_TO_BUILD) endif() -if(NOT ADDONS_DEFINITION_DIR) - set(ADDONS_DEFINITION_DIR ${PROJECT_SOURCE_DIR}/addons) -else() - file(TO_CMAKE_PATH "${ADDONS_DEFINITION_DIR}" ADDONS_DEFINITION_DIR) -endif() -get_filename_component(ADDONS_DEFINITION_DIR "${ADDONS_DEFINITION_DIR}" ABSOLUTE) - if(ADDON_SRC_PREFIX) - get_filename_component(ADDON_SRC_PREFIX "${ADDON_SRC_PREFIX}" ABSOLUTE) message(STATUS "Overriding addon source directory prefix: ${ADDON_SRC_PREFIX}") endif() @@ -156,15 +121,13 @@ # include check_target_platform() function include(${APP_ROOT}/project/cmake/scripts/common/check_target_platform.cmake) +# check install permissions set(ADDON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}) -if(NOT WIN32) - # check install permissions - check_install_permissions(${CMAKE_INSTALL_PREFIX} can_write) - if(NOT ${can_write} AND CMAKE_SYSTEM_NAME STREQUAL "Linux") - set(NEED_SUDO TRUE) - set(ADDON_INSTALL_DIR ${CMAKE_BINARY_DIR}/.install) - message(STATUS "NEED_SUDO: ${NEED_SUDO}") - endif() +check_install_permissions(${CMAKE_INSTALL_PREFIX} can_write) +if(NOT ${can_write} AND CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(NEED_SUDO TRUE) + set(ADDON_INSTALL_DIR ${CMAKE_BINARY_DIR}/.install) + message(STATUS "NEED_SUDO: ${NEED_SUDO}") endif() ### prepare the build environment for the binary addons @@ -180,61 +143,17 @@ ### add the depends subdirectory for any general dependencies add_subdirectory(depends) -# add a custom target "package-addons" which will package and install all addons -add_custom_target(package-addons) - ### get and build all the binary addons # look for all the addons to be built -file(GLOB_RECURSE addons ${ADDONS_DEFINITION_DIR}/*.txt) - -#if there are no addons assume that bootstrapping hasn't happened yet -if(NOT addons) - message(STATUS "Bootstrapping all default repositories as no addons were found...") - set(BOOTSTRAP_BUILD_DIR "${BUILD_DIR}/bootstrap") - - # make sure that the bootstraps build addon exists - if(NOT EXISTS ${BOOTSTRAP_BUILD_DIR}) - file(MAKE_DIRECTORY ${BOOTSTRAP_BUILD_DIR}) - endif() - - # generate the bootstrap buildsystem - execute_process(COMMAND ${CMAKE_COMMAND} ${PROJECT_SOURCE_DIR}/bootstrap - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX:PATH=${ADDONS_DEFINITION_DIR} - -DBUILD_DIR:PATH=${BOOTSTRAP_BUILD_DIR} - -DADDONS_TO_BUILD=${ADDONS_TO_BUILD} - WORKING_DIRECTORY ${BOOTSTRAP_BUILD_DIR}) - - # execute the generated bootstrap buildsystem - execute_process(COMMAND ${CMAKE_COMMAND} --build ${BOOTSTRAP_BUILD_DIR} - WORKING_DIRECTORY ${BOOTSTRAP_BUILD_DIR}) - - # now look for all the addons to be built again - file(GLOB_RECURSE addons ${ADDONS_DEFINITION_DIR}/*.txt) - - if(NOT addons) - message(FATAL_ERROR "No addons available to be built") - endif() -endif() - +file(GLOB_RECURSE addons ${PROJECT_SOURCE_DIR}/addons/*.txt) foreach(addon ${addons}) if(NOT (addon MATCHES platforms.txt)) file(STRINGS ${addon} def) separate_arguments(def) list(GET def 0 id) - set(ADDON_FOUND FALSE) - # try to find a perfect match list(FIND ADDONS_TO_BUILD ${id} idx) - if(idx GREATER -1 OR "${ADDONS_TO_BUILD}" STREQUAL "all") - set(ADDON_FOUND TRUE) - # Maybe we have a regex - elseif(id MATCHES "${ADDONS_TO_BUILD}") - message(STATUS "Pattern ${ADDONS_TO_BUILD} matches ${id}, building addon") - set(ADDON_FOUND TRUE) - endif() - - if(ADDON_FOUND) + if(idx GREATER -1 OR ADDONS_TO_BUILD STREQUAL "all") get_filename_component(dir ${addon} PATH) # check if the addon has a platforms.txt @@ -263,19 +182,6 @@ if(deflength GREATER 2 AND "${SOURCE_DIR}" STREQUAL "") list(GET def 2 revision) - # we need access to a git executable - find_package(Git REQUIRED) - - # resolve revision to git hash - execute_process(COMMAND ${GIT_EXECUTABLE} ls-remote ${url} ${revision} OUTPUT_VARIABLE revision_hash) - # git ls-remote only works on branches and tag names but not on revisions - if(NOT "${revision_hash}" STREQUAL "") - string(REPLACE "\t" ";" revision_list ${revision_hash}) - list(GET revision_list 0 revision_hash) - message(STATUS "${id}: git branch/tag ${revision} resolved to hash: ${revision_hash}") - set(revision ${revision_hash}) - endif() - # Note: downloading specific revisions via http in the format below is probably github specific # if we ever use other repositories, this might need adapting set(url ${url}/archive/${revision}.tar.gz) @@ -306,7 +212,7 @@ # download the addon if necessary if(NOT "${archive_name}" STREQUAL "") # download and extract the addon - if(NOT ADDON_TARBALL_CACHING OR NOT EXISTS ${BUILD_DIR}/download/${archive_name}.tar.gz) + if(NOT EXISTS ${BUILD_DIR}/download/${archive_name}.tar.gz) # cleanup any of the previously downloaded archives of this addon file(GLOB archives "${BUILD_DIR}/download/${id}*.tar.gz") if(archives) @@ -371,25 +277,6 @@ add_dependencies(${id} ${${id}_DEPS}) endif() endif() - - if(CROSS_AUTOCONF AND AUTOCONF_FILES) - if(EXISTS ${SOURCE_DIR}/bootstrap/autoreconf.txt) - file(STRINGS ${SOURCE_DIR}/bootstrap/autoreconf.txt conf_dirs) - foreach(conf_dir ${conf_dirs}) - foreach(afile ${AUTOCONF_FILES}) - message(STATUS "copying ${afile} to ${SOURCE_DIR}/${conf_dir}") - file(COPY ${afile} DESTINATION ${SOURCE_DIR}/${conf_dir}) - endforeach() - endforeach() - endif() - endif() - - # create a forwarding target to the addon-package target - add_custom_target(package-${id} - COMMAND ${CMAKE_COMMAND} --build ${id}-prefix/src/${id}-build --target addon-package - DEPENDS ${id}) - add_dependencies(package-addons package-${id}) - else() message(FATAL_ERROR "${id}: invalid or missing addon source directory at ${SOURCE_DIR}") endif() diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/depends/common/kodi-platform/deps.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/depends/common/kodi-platform/deps.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/depends/common/kodi-platform/deps.txt 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/depends/common/kodi-platform/deps.txt 2015-06-14 19:32:49.000000000 +0000 @@ -1,2 +1,3 @@ +kodi tinyxml platform diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/depends/common/kodi-platform/kodi-platform.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/depends/common/kodi-platform/kodi-platform.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/depends/common/kodi-platform/kodi-platform.txt 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/depends/common/kodi-platform/kodi-platform.txt 2015-10-19 08:39:15.000000000 +0000 @@ -1 +1 @@ -kodi-platform https://github.com/xbmc/kodi-platform 15edaf78d6307eaa5e1d17028122d8bce9d55aa2 +kodi-platform https://github.com/xbmc/kodi-platform 054a42f66 diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/depends/common/platform/platform.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/depends/common/platform/platform.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/depends/common/platform/platform.txt 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/depends/common/platform/platform.txt 2015-10-19 08:39:15.000000000 +0000 @@ -1 +1 @@ -platform https://github.com/Pulse-Eight/platform.git 081032fdb0daf16d443692c37e3ffc62732399ac +platform http://mirrors.kodi.tv/build-deps/sources/platform-1.0.10.tar.gz diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/depends/common/tinyxml/tinyxml.txt kodi-15.2~git20151019.1039-final/project/cmake/addons/depends/common/tinyxml/tinyxml.txt --- kodi-16.1~git20160425.1001-final/project/cmake/addons/depends/common/tinyxml/tinyxml.txt 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/depends/common/tinyxml/tinyxml.txt 2015-10-19 08:39:15.000000000 +0000 @@ -1 +1 @@ -tinyxml http://mirrors.kodi.tv/build-deps/sources/tinyxml-2.6.2_2.tar.gz +tinyxml http://mirrors.xbmc.org/build-deps/sources/tinyxml-2.6.2_2.tar.gz diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/addons/README kodi-15.2~git20151019.1039-final/project/cmake/addons/README --- kodi-16.1~git20160425.1001-final/project/cmake/addons/README 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/addons/README 2015-10-19 08:39:15.000000000 +0000 @@ -1,8 +1,7 @@ KODI ADDONS =========== This directory contains the cmake-based buildsystem for addons. It looks into -the directory pointed to by the ADDONS_DEFINITION_DIR option (which defaults to -the "addons" sub-directory) and parses all *.txt files recursively. Each addon +the "addons" sub-directory and parses all *.txt files recursively. Each addon must have its own .txt file in a separate sub-directory which must follow one of the defined format: @@ -23,26 +22,13 @@ * platforms.txt: List of platforms to build an addon for (or "all"). It is also supported to specify negated platforms with a leading exclamation mark (i), e.g. "!windows". - Available platforms are: linux, windows, osx, ios, android, rbpi, freebsd - -ATTENTION: If no addon definitions could be found the buildsystem assumes that - the bootstrapping of the addon definition repositories hasn't been - performed yet and automatically executes the addon bootstrapping - buildsystem located in the "bootstrap" sub-directory with the default - settings (i.e. all addons from all pre-defined addon definition - repositories are bootstrapped into the directory pointed to by the - ADDONS_DEFINITION_DIR option). + Available platforms are: linux, windows, darwin, ios, android, rbpi The buildsystem uses the following variables (which can be passed into it when executing cmake with the -D= option) to e.g. access specific paths: - * ADDONS_TO_BUILD has two variations, which are tested in order: - - a quoted, space delimited list of s that - you want to build (default is "all"). - - a regular expression that every is matched against - e.g.: ADDONS_TO_BUILD=pvr.* to build all pvr addons - * ADDONS_DEFINITION_DIR points to the directory containing the definitions - for the addons to be built. + * ADDONS_TO_BUILD is a quoted, space delimited list of s that + you want to build (default is "all"). * ADDON_SRC_PREFIX can be used to override the addon repository location. It must point to the locally available parent directory of the addon(s) to build will be appended to this path automatically @@ -59,15 +45,11 @@ absolute representation of ../../.. starting from this directory). * BUILD_DIR points to the directory where the addons and their dependencies will be downloaded and built. - * PACKAGE_ZIP=ON means that the add-ons will be 'packaged' into a common folder, + * PACKAGE_ZIP=1 will mean the add-ons will be 'packaged' into a common folder, rather than being placed in /lib/kodi/addons and /share/kodi/addons. - * PACKAGE_DIR points to the directory where the ZIP archived addons will be - stored after they have been packaged (defaults to /zips) * ARCH_DEFINES specifies the platform-specific C/C++ preprocessor defines (defaults to empty). - * ADDON_TARBALL_CACHING specifies whether downloaded addon source tarballs - should be cached or not (defaults to ON). The buildsystem makes some assumptions about the environment which must be met by whoever uses it: diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/kodi-config.cmake.in kodi-15.2~git20151019.1039-final/project/cmake/kodi-config.cmake.in --- kodi-16.1~git20160425.1001-final/project/cmake/kodi-config.cmake.in 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/kodi-config.cmake.in 2015-10-19 08:39:15.000000000 +0000 @@ -3,27 +3,13 @@ SET(APP_NAME_UC @APP_NAME_UC@) SET(APP_VERSION_MAJOR @APP_VERSION_MAJOR@) SET(APP_VERSION_MINOR @APP_VERSION_MINOR@) -IF(NOT @APP_NAME_UC@_PREFIX) - SET(@APP_NAME_UC@_PREFIX @APP_PREFIX@) -ENDIF() -IF(NOT @APP_NAME_UC@_INCLUDE_DIR) - SET(@APP_NAME_UC@_INCLUDE_DIR @APP_INCLUDE_DIR@) -ENDIF() -IF(NOT @APP_NAME_UC@_LIB_DIR) - SET(@APP_NAME_UC@_LIB_DIR @APP_LIB_DIR@) -ENDIF() +SET(@APP_NAME_UC@_PREFIX @APP_PREFIX@) +SET(@APP_NAME_UC@_INCLUDE_DIR @APP_INCLUDE_DIR@) +SET(@APP_NAME_UC@_LIB_DIR @APP_LIB_DIR@) IF(NOT WIN32) SET(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} @CXX11_SWITCH@") ENDIF() LIST(APPEND CMAKE_MODULE_PATH @APP_LIB_DIR@) ADD_DEFINITIONS(@ARCH_DEFINES@ -DBUILD_KODI_ADDON) -if(NOT CORE_SYSTEM_NAME) - if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") - set(CORE_SYSTEM_NAME "osx") - else() - string(TOLOWER ${CMAKE_SYSTEM_NAME} CORE_SYSTEM_NAME) - endif() -endif() - include(addon-helpers) diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/platform/darwin/defines.txt kodi-15.2~git20151019.1039-final/project/cmake/platform/darwin/defines.txt --- kodi-16.1~git20160425.1001-final/project/cmake/platform/darwin/defines.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/platform/darwin/defines.txt 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1 @@ +-DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX -D_LINUX diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/platform/osx/defines.txt kodi-15.2~git20151019.1039-final/project/cmake/platform/osx/defines.txt --- kodi-16.1~git20160425.1001-final/project/cmake/platform/osx/defines.txt 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/platform/osx/defines.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ --DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX -D_LINUX diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/scripts/common/addon-helpers.cmake kodi-15.2~git20151019.1039-final/project/cmake/scripts/common/addon-helpers.cmake --- kodi-16.1~git20160425.1001-final/project/cmake/scripts/common/addon-helpers.cmake 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/scripts/common/addon-helpers.cmake 2015-10-19 08:39:15.000000000 +0000 @@ -10,23 +10,13 @@ COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target package) macro(add_cpack_workaround target version ext) - if(NOT PACKAGE_DIR) - set(PACKAGE_DIR "${CMAKE_INSTALL_PREFIX}/zips") - endif() - add_custom_command(TARGET addon-package PRE_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory ${PACKAGE_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_PACKAGE_DIRECTORY}/addon-${target}-${version}.${ext} ${PACKAGE_DIR}/${target}-${version}.${ext}) + COMMAND ${CMAKE_COMMAND} -E rename addon-${target}-${version}.${ext} ${target}-${version}.${ext}) endmacro() # Grab the version from a given add-on's addon.xml macro (addon_version dir prefix) - IF(EXISTS ${PROJECT_SOURCE_DIR}/${dir}/addon.xml.in) - FILE(READ ${PROJECT_SOURCE_DIR}/${dir}/addon.xml.in ADDONXML) - ELSE() - FILE(READ ${dir}/addon.xml ADDONXML) - ENDIF() - + FILE(READ ${dir}/addon.xml ADDONXML) STRING(REGEX MATCH "]*version.?=.?.[0-9\\.]+" VERSION_STRING ${ADDONXML}) STRING(REGEX REPLACE ".*version=.([0-9\\.]+).*" "\\1" ${prefix}_VERSION ${VERSION_STRING}) message(STATUS ${prefix}_VERSION=${${prefix}_VERSION}) @@ -44,25 +34,6 @@ SET_TARGET_PROPERTIES(${target} PROPERTIES PREFIX "lib") ENDIF(OS STREQUAL "android") - # get the library's location - SET(LIBRARY_LOCATION $) - # get the library's filename - if("${CORE_SYSTEM_NAME}" STREQUAL "android") - # for android we need the filename without any version numbers - set(LIBRARY_FILENAME $) - else() - SET(LIBRARY_FILENAME $) - endif() - - # if there's an addon.xml.in we need to generate the addon.xml - IF(EXISTS ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in) - SET(PLATFORM ${CORE_SYSTEM_NAME}) - - FILE(READ ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in addon_file) - STRING(CONFIGURE "${addon_file}" addon_file_conf @ONLY) - FILE(GENERATE OUTPUT ${PROJECT_SOURCE_DIR}/${target}/addon.xml CONTENT "${addon_file_conf}") - ENDIF() - # set zip as default if addon-package is called without PACKAGE_XXX SET(CPACK_GENERATOR "ZIP") SET(ext "zip") @@ -80,40 +51,26 @@ set(CPACK_COMPONENTS_IGNORE_GROUPS 1) list(APPEND CPACK_COMPONENTS_ALL ${target}-${${prefix}_VERSION}) # Pack files together to create an archive - INSTALL(DIRECTORY ${target} DESTINATION ./ COMPONENT ${target}-${${prefix}_VERSION} PATTERN "addon.xml.in" EXCLUDE) + INSTALL(DIRECTORY ${target} DESTINATION ./ COMPONENT ${target}-${${prefix}_VERSION}) IF(WIN32) - if(NOT CPACK_PACKAGE_DIRECTORY) - # determine the temporary path - file(TO_CMAKE_PATH "$ENV{TEMP}" WIN32_TEMP_PATH) - string(LENGTH "${WIN32_TEMP_PATH}" WIN32_TEMP_PATH_LENGTH) - string(LENGTH "${PROJECT_BINARY_DIR}" PROJECT_BINARY_DIR_LENGTH) - - # check if the temporary path is shorter than the default packaging directory path - if(WIN32_TEMP_PATH_LENGTH GREATER 0 AND WIN32_TEMP_PATH_LENGTH LESS PROJECT_BINARY_DIR_LENGTH) - # set the directory used by CPack for packaging to the temp directory - set(CPACK_PACKAGE_DIRECTORY ${WIN32_TEMP_PATH}) - endif() - endif() - + # get the installation location for the addon's target + get_property(dll_location TARGET ${target} PROPERTY LOCATION) # in case of a VC++ project the installation location contains a $(Configuration) VS variable # we replace it with ${CMAKE_BUILD_TYPE} (which doesn't cover the case when the build configuration # is changed within Visual Studio) - string(REPLACE "$(Configuration)" "${CMAKE_BUILD_TYPE}" LIBRARY_LOCATION "${LIBRARY_LOCATION}") + string(REPLACE "$(Configuration)" "${CMAKE_BUILD_TYPE}" dll_location "${dll_location}") # install the generated DLL file - INSTALL(PROGRAMS ${LIBRARY_LOCATION} DESTINATION ${target} + INSTALL(PROGRAMS ${dll_location} DESTINATION ${target} COMPONENT ${target}-${${prefix}_VERSION}) IF(CMAKE_BUILD_TYPE MATCHES Debug) # for debug builds also install the PDB file - get_filename_component(LIBRARY_DIR ${LIBRARY_LOCATION} DIRECTORY) - INSTALL(FILES ${LIBRARY_DIR}/${target}.pdb DESTINATION ${target} + get_filename_component(dll_directory ${dll_location} DIRECTORY) + INSTALL(FILES ${dll_directory}/${target}.pdb DESTINATION ${target} COMPONENT ${target}-${${prefix}_VERSION}) ENDIF() ELSE(WIN32) - if(NOT CPACK_PACKAGE_DIRECTORY) - set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}) - endif() INSTALL(TARGETS ${target} DESTINATION ${target} COMPONENT ${target}-${${prefix}_VERSION}) ENDIF(WIN32) @@ -135,7 +92,7 @@ set(CMAKE_INSTALL_LIBDIR "lib/${APP_NAME_LC}") endif() INSTALL(TARGETS ${target} DESTINATION ${CMAKE_INSTALL_LIBDIR}/addons/${target}) - INSTALL(DIRECTORY ${target} DESTINATION share/${APP_NAME_LC}/addons PATTERN "addon.xml.in" EXCLUDE) + INSTALL(DIRECTORY ${target} DESTINATION share/${APP_NAME_LC}/addons) ENDIF(PACKAGE_ZIP OR PACKAGE_TGZ) endmacro() diff -Nru kodi-16.1~git20160425.1001-final/project/cmake/scripts/common/prepare-env.cmake kodi-15.2~git20151019.1039-final/project/cmake/scripts/common/prepare-env.cmake --- kodi-16.1~git20160425.1001-final/project/cmake/scripts/common/prepare-env.cmake 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/cmake/scripts/common/prepare-env.cmake 2015-10-19 08:39:15.000000000 +0000 @@ -21,11 +21,6 @@ message(FATAL_ERROR "Could not determine app version! make sure that ${APP_ROOT}/version.txt exists") endif() -# in case we need to download something, set KODI_MIRROR to the default if not alread set -if(NOT DEFINED KODI_MIRROR) - set(KODI_MIRROR "http://mirrors.kodi.tv") -endif() - ### copy all the addon binding header files to include/kodi # make sure include/kodi exists and is empty set(APP_LIB_DIR ${DEPENDS_PATH}/lib/${APP_NAME_LC}) @@ -102,7 +97,7 @@ else() set(PATCH_ARCHIVE_NAME "patch-2.5.9-7-bin-1") set(PATCH_ARCHIVE "${PATCH_ARCHIVE_NAME}.zip") - set(PATCH_URL "${KODI_MIRROR}/build-deps/win32/${PATCH_ARCHIVE}") + set(PATCH_URL "http://mirrors.xbmc.org/build-deps/win32/${PATCH_ARCHIVE}") set(PATCH_DOWNLOAD ${BUILD_DIR}/download/${PATCH_ARCHIVE}) # download the archive containing patch.exe diff -Nru kodi-16.1~git20160425.1001-final/project/VS2010Express/XBMC for Windows.sln kodi-15.2~git20151019.1039-final/project/VS2010Express/XBMC for Windows.sln --- kodi-16.1~git20160425.1001-final/project/VS2010Express/XBMC for Windows.sln 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/VS2010Express/XBMC for Windows.sln 2015-10-19 08:39:15.000000000 +0000 @@ -1,17 +1,19 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.40629.0 +# Visual Studio Express 2013 for Windows Desktop +VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Kodi", "XBMC.vcxproj", "{3A68081D-E8F9-4523-9436-530DE9E5530A}" ProjectSection(ProjectDependencies) = postProject {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} = {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} - {DF460EAB-570D-4B50-9089-2E2FC801BF38} = {DF460EAB-570D-4B50-9089-2E2FC801BF38} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libPlatinum", "libPlatinum.vcxproj", "{B2975495-FBE4-4F94-AAC5-B21A9842BF50}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnrarXLib", "UnrarXLib.vcxproj", "{FE0A91C0-E30A-47CD-8A92-A508C9292452}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "visMilkdrop", "..\..\xbmc\visualizations\Milkdrop\Plugin.vcxproj", "{5E479372-4F34-426D-AA1E-9879E94C105D}" +EndProject +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageLib_dll", "..\..\lib\cximage-6.0\ImageLib.vcxproj", "{3B424C94-2005-44CC-BFB1-4B6C89090732}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageLib_jasper", "..\..\lib\cximage-6.0\jasper\jasper.vcxproj", "{3843C3D4-E5A6-4030-87EC-E7EE57242106}" @@ -32,10 +34,16 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libexif_dll", "..\..\lib\libexif\libexif.vcxproj", "{AD20A3E2-09CB-42DB-9A70-27F7CDC886CE}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "visDirectxSpectrum", "..\..\xbmc\visualizations\DirectXSpectrum\directx_spectrum.vcxproj", "{0D91724A-E6F6-4708-AF47-9F88BBE2114C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "visWaveform", "..\..\xbmc\visualizations\WaveForm\Waveform.vcxproj", "{D450FE9A-CE56-4496-B4AB-379094E642F2}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "squish", "..\..\tools\depends\native\libsquish-native\src\vs7\squish\squish_2010.vcxproj", "{6A8518C3-D81A-4428-BD7F-C37933088AC1}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpluff", "..\..\lib\cpluff\libcpluff\win32\cpluff.vcxproj", "{88968763-3D6B-48A8-B495-CC8C187FAC02}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libhdhomerun_dll", "..\..\lib\libhdhomerun\hdhomerun\hdhomerun.vcxproj", "{1E2FB608-3DD2-4021-A598-90008FA6DE85}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libXBMC_addon", "..\..\lib\addons\library.xbmc.addon\project\VS2010Express\libXBMC_addon.vcxproj", "{2DCEA60B-4EBC-4DB7-9FBD-297C1EFD95D7}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libKODI_guilib", "..\..\lib\addons\library.kodi.guilib\project\VS2010Express\libKODI_guilib.vcxproj", "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}" @@ -53,11 +61,10 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libXBMC_codec", "..\..\lib\addons\library.xbmc.codec\project\VS2010Express\libXBMC_codec.vcxproj", "{F8F1290B-1188-4810-86C9-88178A31D2AF}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Effects11", "..\..\lib\win32\Effects11\Effects11_2013.vcxproj", "{DF460EAB-570D-4B50-9089-2E2FC801BF38}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libKODI_adsp", "..\..\lib\addons\library.kodi.adsp\project\VS2010Express\libKODI_adsp.vcxproj", "{44F93C4D-85DD-4452-99BB-F1D196174024}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libKODI_audioengine", "..\..\lib\addons\library.kodi.audioengine\project\VS2010Express\libKODI_audioengine.vcxproj", "{6B96FD7D-26EE-415B-8858-27757A0B1273}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "visVortex", "..\..\xbmc\visualizations\Vortex\Vortex\Vortex.vcxproj", "{AFF288D5-8A77-4817-8DD9-364E183CDBF8}" + ProjectSection(ProjectDependencies) = postProject + {034B1D02-CA92-455D-8866-DB95BEE49C10} = {034B1D02-CA92-455D-8866-DB95BEE49C10} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -84,6 +91,36 @@ {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Debug|Win32.Build.0 = Debug|Win32 {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Release|Win32.ActiveCfg = Release|Win32 {FE0A91C0-E30A-47CD-8A92-A508C9292452}.Release|Win32.Build.0 = Release|Win32 + {00700E12-A63B-4E54-B962-4011A90584BD}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 + {00700E12-A63B-4E54-B962-4011A90584BD}.Debug Testsuite|Win32.Build.0 = Debug|Win32 + {00700E12-A63B-4E54-B962-4011A90584BD}.Debug|Win32.ActiveCfg = Debug|Win32 + {00700E12-A63B-4E54-B962-4011A90584BD}.Debug|Win32.Build.0 = Debug|Win32 + {00700E12-A63B-4E54-B962-4011A90584BD}.Release|Win32.ActiveCfg = Release|Win32 + {00700E12-A63B-4E54-B962-4011A90584BD}.Release|Win32.Build.0 = Release|Win32 + {5E479372-4F34-426D-AA1E-9879E94C105D}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 + {5E479372-4F34-426D-AA1E-9879E94C105D}.Debug Testsuite|Win32.Build.0 = Debug|Win32 + {5E479372-4F34-426D-AA1E-9879E94C105D}.Debug|Win32.ActiveCfg = Debug|Win32 + {5E479372-4F34-426D-AA1E-9879E94C105D}.Debug|Win32.Build.0 = Debug|Win32 + {5E479372-4F34-426D-AA1E-9879E94C105D}.Release|Win32.ActiveCfg = Release|Win32 + {5E479372-4F34-426D-AA1E-9879E94C105D}.Release|Win32.Build.0 = Release|Win32 + {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 + {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Debug Testsuite|Win32.Build.0 = Debug|Win32 + {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Debug|Win32.ActiveCfg = Debug|Win32 + {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Debug|Win32.Build.0 = Debug|Win32 + {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Release|Win32.ActiveCfg = Release|Win32 + {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Release|Win32.Build.0 = Release|Win32 + {19B16CD0-3B47-47B7-AB0E-81EF2BF1B187}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 + {19B16CD0-3B47-47B7-AB0E-81EF2BF1B187}.Debug Testsuite|Win32.Build.0 = Debug|Win32 + {19B16CD0-3B47-47B7-AB0E-81EF2BF1B187}.Debug|Win32.ActiveCfg = Debug|Win32 + {19B16CD0-3B47-47B7-AB0E-81EF2BF1B187}.Debug|Win32.Build.0 = Debug|Win32 + {19B16CD0-3B47-47B7-AB0E-81EF2BF1B187}.Release|Win32.ActiveCfg = Release|Win32 + {19B16CD0-3B47-47B7-AB0E-81EF2BF1B187}.Release|Win32.Build.0 = Release|Win32 + {22B25AEC-7223-46FC-8356-4418327EFDE1}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 + {22B25AEC-7223-46FC-8356-4418327EFDE1}.Debug Testsuite|Win32.Build.0 = Debug|Win32 + {22B25AEC-7223-46FC-8356-4418327EFDE1}.Debug|Win32.ActiveCfg = Debug|Win32 + {22B25AEC-7223-46FC-8356-4418327EFDE1}.Debug|Win32.Build.0 = Debug|Win32 + {22B25AEC-7223-46FC-8356-4418327EFDE1}.Release|Win32.ActiveCfg = Release|Win32 + {22B25AEC-7223-46FC-8356-4418327EFDE1}.Release|Win32.Build.0 = Release|Win32 {3B424C94-2005-44CC-BFB1-4B6C89090732}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 {3B424C94-2005-44CC-BFB1-4B6C89090732}.Debug Testsuite|Win32.Build.0 = Debug|Win32 {3B424C94-2005-44CC-BFB1-4B6C89090732}.Debug|Win32.ActiveCfg = Debug|Win32 @@ -144,6 +181,24 @@ {AD20A3E2-09CB-42DB-9A70-27F7CDC886CE}.Debug|Win32.Build.0 = Debug (DLL)|Win32 {AD20A3E2-09CB-42DB-9A70-27F7CDC886CE}.Release|Win32.ActiveCfg = Release (DLL)|Win32 {AD20A3E2-09CB-42DB-9A70-27F7CDC886CE}.Release|Win32.Build.0 = Release (DLL)|Win32 + {0D91724A-E6F6-4708-AF47-9F88BBE2114C}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 + {0D91724A-E6F6-4708-AF47-9F88BBE2114C}.Debug Testsuite|Win32.Build.0 = Debug|Win32 + {0D91724A-E6F6-4708-AF47-9F88BBE2114C}.Debug|Win32.ActiveCfg = Debug|Win32 + {0D91724A-E6F6-4708-AF47-9F88BBE2114C}.Debug|Win32.Build.0 = Debug|Win32 + {0D91724A-E6F6-4708-AF47-9F88BBE2114C}.Release|Win32.ActiveCfg = Release|Win32 + {0D91724A-E6F6-4708-AF47-9F88BBE2114C}.Release|Win32.Build.0 = Release|Win32 + {DD4818AE-7E35-40B7-A6A0-0FF83AA1C916}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 + {DD4818AE-7E35-40B7-A6A0-0FF83AA1C916}.Debug Testsuite|Win32.Build.0 = Debug|Win32 + {DD4818AE-7E35-40B7-A6A0-0FF83AA1C916}.Debug|Win32.ActiveCfg = Debug|Win32 + {DD4818AE-7E35-40B7-A6A0-0FF83AA1C916}.Debug|Win32.Build.0 = Debug|Win32 + {DD4818AE-7E35-40B7-A6A0-0FF83AA1C916}.Release|Win32.ActiveCfg = Release|Win32 + {DD4818AE-7E35-40B7-A6A0-0FF83AA1C916}.Release|Win32.Build.0 = Release|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Debug Testsuite|Win32.Build.0 = Debug|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Debug|Win32.Build.0 = Debug|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Release|Win32.ActiveCfg = Release|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Release|Win32.Build.0 = Release|Win32 {6A8518C3-D81A-4428-BD7F-C37933088AC1}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 {6A8518C3-D81A-4428-BD7F-C37933088AC1}.Debug Testsuite|Win32.Build.0 = Debug|Win32 {6A8518C3-D81A-4428-BD7F-C37933088AC1}.Debug|Win32.ActiveCfg = Debug|Win32 @@ -156,6 +211,12 @@ {88968763-3D6B-48A8-B495-CC8C187FAC02}.Debug|Win32.Build.0 = Debug|Win32 {88968763-3D6B-48A8-B495-CC8C187FAC02}.Release|Win32.ActiveCfg = Release|Win32 {88968763-3D6B-48A8-B495-CC8C187FAC02}.Release|Win32.Build.0 = Release|Win32 + {1E2FB608-3DD2-4021-A598-90008FA6DE85}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 + {1E2FB608-3DD2-4021-A598-90008FA6DE85}.Debug Testsuite|Win32.Build.0 = Debug|Win32 + {1E2FB608-3DD2-4021-A598-90008FA6DE85}.Debug|Win32.ActiveCfg = Debug|Win32 + {1E2FB608-3DD2-4021-A598-90008FA6DE85}.Debug|Win32.Build.0 = Debug|Win32 + {1E2FB608-3DD2-4021-A598-90008FA6DE85}.Release|Win32.ActiveCfg = Release|Win32 + {1E2FB608-3DD2-4021-A598-90008FA6DE85}.Release|Win32.Build.0 = Release|Win32 {2DCEA60B-4EBC-4DB7-9FBD-297C1EFD95D7}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 {2DCEA60B-4EBC-4DB7-9FBD-297C1EFD95D7}.Debug|Win32.ActiveCfg = Debug|Win32 {2DCEA60B-4EBC-4DB7-9FBD-297C1EFD95D7}.Debug|Win32.Build.0 = Debug|Win32 @@ -193,24 +254,12 @@ {F8F1290B-1188-4810-86C9-88178A31D2AF}.Debug|Win32.Build.0 = Debug|Win32 {F8F1290B-1188-4810-86C9-88178A31D2AF}.Release|Win32.ActiveCfg = Release|Win32 {F8F1290B-1188-4810-86C9-88178A31D2AF}.Release|Win32.Build.0 = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug Testsuite|Win32.Build.0 = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.ActiveCfg = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Debug|Win32.Build.0 = Debug|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.ActiveCfg = Release|Win32 - {DF460EAB-570D-4B50-9089-2E2FC801BF38}.Release|Win32.Build.0 = Release|Win32 - {44F93C4D-85DD-4452-99BB-F1D196174024}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 - {44F93C4D-85DD-4452-99BB-F1D196174024}.Debug Testsuite|Win32.Build.0 = Debug|Win32 - {44F93C4D-85DD-4452-99BB-F1D196174024}.Debug|Win32.ActiveCfg = Debug|Win32 - {44F93C4D-85DD-4452-99BB-F1D196174024}.Debug|Win32.Build.0 = Debug|Win32 - {44F93C4D-85DD-4452-99BB-F1D196174024}.Release|Win32.ActiveCfg = Release|Win32 - {44F93C4D-85DD-4452-99BB-F1D196174024}.Release|Win32.Build.0 = Release|Win32 - {6B96FD7D-26EE-415B-8858-27757A0B1273}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 - {6B96FD7D-26EE-415B-8858-27757A0B1273}.Debug Testsuite|Win32.Build.0 = Debug|Win32 - {6B96FD7D-26EE-415B-8858-27757A0B1273}.Debug|Win32.ActiveCfg = Debug|Win32 - {6B96FD7D-26EE-415B-8858-27757A0B1273}.Debug|Win32.Build.0 = Debug|Win32 - {6B96FD7D-26EE-415B-8858-27757A0B1273}.Release|Win32.ActiveCfg = Release|Win32 - {6B96FD7D-26EE-415B-8858-27757A0B1273}.Release|Win32.Build.0 = Release|Win32 + {AFF288D5-8A77-4817-8DD9-364E183CDBF8}.Debug Testsuite|Win32.ActiveCfg = Debug|Win32 + {AFF288D5-8A77-4817-8DD9-364E183CDBF8}.Debug Testsuite|Win32.Build.0 = Debug|Win32 + {AFF288D5-8A77-4817-8DD9-364E183CDBF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {AFF288D5-8A77-4817-8DD9-364E183CDBF8}.Debug|Win32.Build.0 = Debug|Win32 + {AFF288D5-8A77-4817-8DD9-364E183CDBF8}.Release|Win32.ActiveCfg = Release|Win32 + {AFF288D5-8A77-4817-8DD9-364E183CDBF8}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff -Nru kodi-16.1~git20160425.1001-final/project/VS2010Express/XbmcThreads.vcxproj kodi-15.2~git20151019.1039-final/project/VS2010Express/XbmcThreads.vcxproj --- kodi-16.1~git20160425.1001-final/project/VS2010Express/XbmcThreads.vcxproj 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/VS2010Express/XbmcThreads.vcxproj 2015-10-19 08:39:15.000000000 +0000 @@ -13,6 +13,7 @@ + @@ -30,6 +31,7 @@ + diff -Nru kodi-16.1~git20160425.1001-final/project/VS2010Express/XbmcThreads.vcxproj.filters kodi-15.2~git20151019.1039-final/project/VS2010Express/XbmcThreads.vcxproj.filters --- kodi-16.1~git20160425.1001-final/project/VS2010Express/XbmcThreads.vcxproj.filters 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/VS2010Express/XbmcThreads.vcxproj.filters 2015-10-19 08:39:15.000000000 +0000 @@ -3,6 +3,7 @@ + @@ -20,6 +21,7 @@ + diff -Nru kodi-16.1~git20160425.1001-final/project/VS2010Express/XBMC.vcxproj kodi-15.2~git20151019.1039-final/project/VS2010Express/XBMC.vcxproj --- kodi-16.1~git20160425.1001-final/project/VS2010Express/XBMC.vcxproj 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/VS2010Express/XBMC.vcxproj 2015-10-19 08:39:15.000000000 +0000 @@ -63,19 +63,19 @@ XBMC\$(Configuration)\objs\ XBMC\$(Configuration)\ XBMC\$(Configuration)\objs\ - $(WindowsSDK_IncludePath);$(DXSDK_DIR)Include;$(IncludePath) - $(WindowsSDK_IncludePath);$(DXSDK_DIR)Include;$(IncludePath) - $(WindowsSDK_LibraryPath_x86);$(DXSDK_DIR)Lib\x86;$(LibraryPath) - $(WindowsSDK_LibraryPath_x86);$(DXSDK_DIR)Lib\x86;$(LibraryPath) - $(WindowsSDK_IncludePath);$(DXSDK_DIR)Include;$(IncludePath) - $(WindowsSDK_LibraryPath_x86);$(DXSDK_DIR)Lib\x86;$(LibraryPath) + $(DXSDK_DIR)Include;$(IncludePath) + $(DXSDK_DIR)Include;$(IncludePath) + $(DXSDK_DIR)Lib\x86;$(LibraryPath) + $(DXSDK_DIR)Lib\x86;$(LibraryPath) + $(DXSDK_DIR)Include;$(IncludePath) + $(DXSDK_DIR)Lib\x86;$(LibraryPath) $(ProjectName)-test - ..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32\Effects11\inc;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.kodi.guilib;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;shaders;..\..\tools\depends\native\libsquish-native\src;%(AdditionalIncludeDirectories);XBMC\$(Configuration);..\..\addons\library.xbmc.adsp + ..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.kodi.guilib;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;..\..\tools\depends\native\libsquish-native\src;%(AdditionalIncludeDirectories) NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;D3D_DEBUG_INFO;__STDC_CONSTANT_MACROS;_SECURE_SCL=0;TAGLIB_STATIC;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi";%(PreprocessorDefinitions) Async Use @@ -86,12 +86,12 @@ /IGNORE:4089 /ignore:4254 %(AdditionalOptions) - d3d11.lib;DInput8.lib;DSound.lib;winmm.lib;CrossGuidd.lib;Mpr.lib;Iphlpapi.lib;PowrProf.lib;setupapi.lib;dwmapi.lib;yajl.lib;dxguid.lib;%(AdditionalDependencies) + D3dx9.lib;DInput8.lib;DSound.lib;winmm.lib;Mpr.lib;Iphlpapi.lib;PowrProf.lib;setupapi.lib;dwmapi.lib;yajl.lib;dxguid.lib;%(AdditionalDependencies) $(OutDir)$(ProjectName).exe libcpmt;libc;msvcrt;libcmt;msvcrtd;msvcprtd;%(IgnoreSpecificDefaultLibraries) - libxslt.dll;dnssd.dll;dwmapi.dll;ssh.dll;sqlite3.dll;avcodec-56.dll;avfilter-5.dll;avformat-56.dll;avutil-54.dll;postproc-53.dll;swresample-1.dll;swscale-3.dll;d3dcompiler_47.dll;%(DelayLoadDLLs) + libxslt.dll;dnssd.dll;dwmapi.dll;ssh.dll;sqlite3.dll;avcodec-56.dll;avfilter-5.dll;avformat-56.dll;avutil-54.dll;postproc-53.dll;swresample-1.dll;swscale-3.dll;%(DelayLoadDLLs) $(OutDir)$(ProjectName).pdb @@ -104,14 +104,10 @@ VC90.CRT.x86.manifest;win81.manifest;%(AdditionalManifestFiles) true - - - copy “$(WindowsSdkDir)redist\d3d\x86\D3DCompile*.DLL” “$(TargetDir)” - - ..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32\Effects11\inc;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.kodi.guilib;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;shaders;..\..\lib\gtest\include;..\..\tools\depends\native\libsquish-native\src;%(AdditionalIncludeDirectories);XBMC\$(Configuration);..\..\addons\library.xbmc.adsp + ..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.kodi.guilib;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;..\..\lib\gtest\include;..\..\tools\depends\native\libsquish-native\src;%(AdditionalIncludeDirectories) _CONSOLE;NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;D3D_DEBUG_INFO;__STDC_CONSTANT_MACROS;_SECURE_SCL=0;TAGLIB_STATIC;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi";%(PreprocessorDefinitions) Async Use @@ -122,14 +118,14 @@ /IGNORE:4089 /ignore:4254 %(AdditionalOptions) - d3d11.lib;DInput8.lib;DSound.lib;winmm.lib;CrossGuidd.lib;ws2_32.lib;Mpr.lib;Iphlpapi.lib;PowrProf.lib;setupapi.lib;dwmapi.lib;strmiids.lib;dxguid.lib;mfuuid.lib;comctl32.lib;yajl.lib;%(AdditionalDependencies) + D3dx9.lib;DInput8.lib;DSound.lib;winmm.lib;ws2_32.lib;Mpr.lib;Iphlpapi.lib;PowrProf.lib;setupapi.lib;dwmapi.lib;strmiids.lib;dxguid.lib;mfuuid.lib;comctl32.lib;yajl.lib;%(AdditionalDependencies) $(OutDir)$(ProjectName)-test.exe libc;msvcrt;libcmt;msvcrtd;msvcprtd;%(IgnoreSpecificDefaultLibraries) - libxslt.dll;dnssd.dll;dwmapi.dll;ssh.dll;sqlite3.dll;avcodec-56.dll;avfilter-5.dll;avformat-56.dll;avutil-54.dll;postproc-53.dll;swresample-1.dll;swscale-3.dll;d3dcompiler_47.dll;%(DelayLoadDLLs) + libxslt.dll;dnssd.dll;dwmapi.dll;ssh.dll;sqlite3.dll;avcodec-56.dll;avfilter-5.dll;avformat-56.dll;avutil-54.dll;postproc-53.dll;swresample-1.dll;swscale-3.dll;%(DelayLoadDLLs) $(OutDir)$(ProjectName).pdb Console @@ -142,14 +138,10 @@ VC90.CRT.x86.manifest;win81.manifest;%(AdditionalManifestFiles) true - - - copy “$(WindowsSdkDir)redist\d3d\x86\D3DCompile*.DLL” “$(TargetDir)” - - ..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32\Effects11\inc;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.kodi.guilib;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;shaders;..\..\tools\depends\native\libsquish-native\src;%(AdditionalIncludeDirectories);XBMC\$(Configuration);..\..\addons\library.xbmc.adsp + ..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.kodi.guilib;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;..\..\tools\depends\native\libsquish-native\src;%(AdditionalIncludeDirectories) NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;__STDC_CONSTANT_MACROS;TAGLIB_STATIC;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi";%(PreprocessorDefinitions) Async Use @@ -160,10 +152,10 @@ /IGNORE:4089 /ignore:4254 %(AdditionalOptions) - d3d11.lib;DInput8.lib;DSound.lib;winmm.lib;CrossGuid.lib;Mpr.lib;Iphlpapi.lib;PowrProf.lib;setupapi.lib;dwmapi.lib;yajl.lib;dxguid.lib;%(AdditionalDependencies) + D3dx9.lib;DInput8.lib;DSound.lib;winmm.lib;Mpr.lib;Iphlpapi.lib;PowrProf.lib;setupapi.lib;dwmapi.lib;yajl.lib;dxguid.lib;%(AdditionalDependencies) $(OutDir)$(ProjectName).exe libc;msvcrt;libci;msvcprt;%(IgnoreSpecificDefaultLibraries) - libxslt.dll;dnssd.dll;dwmapi.dll;ssh.dll;sqlite3.dll;avcodec-56.dll;avfilter-5.dll;avformat-56.dll;avutil-54.dll;postproc-53.dll;swresample-1.dll;swscale-3.dll;d3dcompiler_47.dll;%(DelayLoadDLLs) + libxslt.dll;dnssd.dll;dwmapi.dll;ssh.dll;sqlite3.dll;avcodec-56.dll;avfilter-5.dll;avformat-56.dll;avutil-54.dll;postproc-53.dll;swresample-1.dll;swscale-3.dll;%(DelayLoadDLLs) true $(OutDir)$(ProjectName).pdb true @@ -175,45 +167,38 @@ VC90.CRT.x86.manifest;win81.manifest;%(AdditionalManifestFiles) true - - - copy "$(WindowsSdkDir)redist\d3d\x86\D3DCompile*.DLL" "$(TargetDir)" - + - - - + - - + - CompileAsCpp @@ -228,11 +213,6 @@ - - - - - @@ -314,16 +294,8 @@ - - - - - - - - @@ -348,6 +320,8 @@ + + @@ -388,6 +362,8 @@ + + @@ -426,22 +402,19 @@ - - - + - @@ -489,7 +462,6 @@ - @@ -522,12 +494,8 @@ - - - - @@ -540,23 +508,7 @@ - - - - - - - - - - - - - - - - - + @@ -592,7 +544,6 @@ - @@ -635,22 +586,14 @@ - - true - - - - true - - - + @@ -658,6 +601,18 @@ + + + + + + + + + + + + @@ -666,7 +621,6 @@ - @@ -675,11 +629,11 @@ + - @@ -739,6 +693,7 @@ + @@ -748,7 +703,6 @@ - @@ -779,26 +733,22 @@ - - - - @@ -811,9 +761,6 @@ - - - @@ -879,29 +826,19 @@ - - - - + - - - - - - - @@ -943,20 +880,8 @@ - - - - - - - - - - - - @@ -971,27 +896,16 @@ - - - - - - - - - - - @@ -1000,23 +914,6 @@ - - - - - - - - - - - - - - - - - @@ -1040,7 +937,6 @@ - @@ -1074,17 +970,11 @@ - - - - - - + - @@ -1094,18 +984,12 @@ - - - - - - @@ -1161,8 +1045,6 @@ - - @@ -1216,6 +1098,8 @@ + + @@ -1246,6 +1130,8 @@ + + @@ -1305,7 +1191,6 @@ - @@ -1320,6 +1205,7 @@ + @@ -1564,12 +1450,14 @@ + + @@ -1589,7 +1477,6 @@ - Create Create @@ -1601,19 +1488,22 @@ + + true + + - @@ -1683,6 +1573,7 @@ + @@ -1770,10 +1661,15 @@ - + + true + true + true + + @@ -1789,14 +1685,13 @@ - + - @@ -1848,13 +1743,13 @@ + - @@ -1953,6 +1848,7 @@ + @@ -1985,6 +1881,7 @@ + @@ -1992,6 +1889,18 @@ + + + + + + + + + + + + @@ -2005,6 +1914,7 @@ + @@ -2037,6 +1947,7 @@ + @@ -2074,14 +1985,12 @@ - - @@ -2131,7 +2040,6 @@ - @@ -2147,7 +2055,7 @@ - + @@ -2213,12 +2121,14 @@ + + @@ -2239,7 +2149,6 @@ - @@ -2258,13 +2167,13 @@ + - @@ -2360,6 +2269,7 @@ + @@ -2446,9 +2356,6 @@ {c8f6c172-56f2-4e76-b5fa-c3b423b31be7} - - {df460eab-570d-4b50-9089-2e2fc801bf38} - {6a8518c3-d81a-4428-bd7f-c37933088ac1} true @@ -2629,358 +2536,6 @@ %(RelativeDir)..\python\generated\%(Filename).cpp - - - true - true - true - - - - - - - - - - - - - - - - - - - - - PS - Pixel - PS - Pixel - PS - Pixel - - - - - - - false - false - false - false - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - PS - false - false - Pixel - - - PS - Pixel - - - PS - false - false - Pixel - - - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - PS - false - false - Pixel - - - PS - Pixel - - - PS - false - false - Pixel - - - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - PS - false - false - Pixel - - - PS - Pixel - - - PS - false - false - Pixel - - - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - PS - false - false - Pixel - - - PS - Pixel - - - PS - false - false - Pixel - - - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - PS - false - false - Pixel - - - PS - Pixel - - - PS - false - false - Pixel - - - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - PS - false - false - Pixel - - - PS - Pixel - - - PS - false - false - Pixel - - - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - PS - false - false - Pixel - - - PS - Pixel - - - PS - false - false - Pixel - - - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - PS - false - false - Pixel - - - PS - Pixel - - - PS - false - false - Pixel - - - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - PS - false - false - Pixel - - - PS - Pixel - - - PS - false - false - Pixel - - - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - PS - false - false - Pixel - - - PS - Pixel - - - PS - false - false - Pixel - - - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - - VS - Vertex - 4.0_level_9_1 - VS - Vertex - 4.0_level_9_1 - VS - Vertex - 4.0_level_9_1 - - - - - - - false - false - %(Filename) - shaders\%(Filename).h - %(Filename) - shaders\%(Filename).h - false - false - %(Filename) - shaders\%(Filename).h - /Qstrip_reflect - /Qstrip_reflect - /Qstrip_reflect - - @@ -2990,4 +2545,4 @@ - + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/VS2010Express/XBMC.vcxproj.filters kodi-15.2~git20151019.1039-final/project/VS2010Express/XBMC.vcxproj.filters --- kodi-16.1~git20160425.1001-final/project/VS2010Express/XBMC.vcxproj.filters 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/VS2010Express/XBMC.vcxproj.filters 2015-10-19 08:39:15.000000000 +0000 @@ -112,6 +112,9 @@ {dbf79aa0-53a6-4bec-855b-e8d2cbb73689} + + {9d2be696-b6dd-4be1-aa8c-260816b48c12} + {d0d6c121-8cef-4bf9-aba5-bff57ae46e26} @@ -190,6 +193,9 @@ {dbfd4898-7df3-4393-8b04-ab0cc1265c33} + + {dfa70c36-927b-4540-b505-35919e64eb3d} + {cea579fc-bdd7-499e-a6a6-07d681d1ab24} @@ -316,9 +322,6 @@ {43526341-7b96-462d-9f71-685e426251ec} - - {2afb92ce-e9ac-4458-80e7-3384ccfffa3c} - {1bdb0045-3341-49b7-8d6f-30a53f812350} @@ -337,36 +340,6 @@ {d811b1d1-5e81-4d89-9173-f02818c897ab} - - {9fe3f6e1-16d1-4437-b859-1b183adcef22} - - - {bc76faa4-e05e-4f08-b332-a91d7bc3207f} - - - {33ec4ead-1923-47c2-8a7f-44561adaebf3} - - - {e8f91abe-5d75-4a38-b576-8d971f5fa64b} - - - {b2cf6073-0796-485b-a2f8-0b54851262b3} - - - {378b3a72-20d2-4482-8dbb-91f041290ceb} - - - {ae30b290-9c36-46d4-a286-3f3b7afd2f93} - - - {87d4e872-1a96-49a2-9ef0-78dd9fc30da9} - - - {b0eadc46-feeb-4aca-9898-590e6b8d29b3} - - - {248ffbc4-43f5-4aaf-b259-2dd4f840fcef} - @@ -381,6 +354,9 @@ win32 + + win32 + cores @@ -399,6 +375,9 @@ cores\dvdplayer + + cores\dvdplayer + cores\dvdplayer @@ -417,9 +396,6 @@ cores\dvdplayer - - cores\dvdplayer - cores\dvdplayer @@ -621,6 +597,9 @@ cores\VideoRenderers + + cores\VideoRenderers + cores\VideoRenderers @@ -756,7 +735,7 @@ addons - + addons @@ -771,9 +750,6 @@ addons - - addons - addons @@ -801,6 +777,39 @@ + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + music @@ -907,6 +916,9 @@ + + guilib + guilib @@ -1039,9 +1051,6 @@ guilib - - guilib - guilib @@ -1159,6 +1168,9 @@ music\dialogs + + music\dialogs + music\dialogs @@ -1189,6 +1201,9 @@ music\windows + + music\windows + music\windows @@ -1360,6 +1375,9 @@ utils + + utils + utils @@ -1489,6 +1507,9 @@ video\dialogs + + video\dialogs + video\dialogs @@ -1507,6 +1528,9 @@ video\dialogs + + video\dialogs + video\dialogs @@ -1543,6 +1567,9 @@ dialogs + + interfaces + interfaces @@ -1663,9 +1690,6 @@ pvr\dialogs - - pvr\dialogs - pvr\dialogs @@ -1687,9 +1711,6 @@ pvr\channels - - pvr\channels - pvr\addons @@ -1741,6 +1762,9 @@ addons + + libs\SlingboxLib + dialogs @@ -1840,6 +1864,9 @@ peripherals\devices + + peripherals\dialogs + peripherals\dialogs @@ -1936,6 +1963,12 @@ filesystem + + filesystem + + + filesystem + filesystem @@ -2023,6 +2056,12 @@ filesystem + + filesystem + + + filesystem + filesystem @@ -2187,11 +2226,11 @@ utils + - @@ -2265,6 +2304,9 @@ utils + + music\karaoke + utils @@ -2497,9 +2539,6 @@ interfaces\legacy - - interfaces\legacy - interfaces\legacy @@ -2927,27 +2966,6 @@ cores\dvdplayer\DVDDemuxers - - settings - - - cores\AudioEngine\DSPAddons - - - cores\AudioEngine\DSPAddons - - - cores\AudioEngine\DSPAddons - - - cores\AudioEngine\DSPAddons - - - cores\AudioEngine\DSPAddons - - - addons - utils @@ -3066,12 +3084,6 @@ test - - settings\dialogs - - - settings\dialogs - utils @@ -3084,150 +3096,9 @@ contrib\kissfft - - pvr\timers - - - win32 - - - network\dacp - - - addons - - - pictures - - - main - - - main\win32 - - - main\win32 - - - messaging - windows - - input - - - input - - - input - - - filesystem - - - events\windows - - - events\windows - - - events - - - events - - - events - - - events - - - events - - - filesystem - - - filesystem - - - filesystem - - - video\jobs - - - guilib - - - messaging\helpers - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - addons - - - input - - - music\tags - - - pvr - @@ -3263,6 +3134,9 @@ cores\dvdplayer + + cores\dvdplayer + cores\dvdplayer @@ -3281,9 +3155,6 @@ cores\dvdplayer - - cores\dvdplayer - cores\dvdplayer @@ -3563,6 +3434,9 @@ cores\VideoRenderers + + cores\VideoRenderers + cores\VideoRenderers @@ -3704,7 +3578,7 @@ addons - + addons @@ -3725,9 +3599,6 @@ addons - - addons - addons @@ -3752,6 +3623,42 @@ guilib + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + + + music\karaoke + music @@ -3859,6 +3766,9 @@ + + guilib + guilib @@ -4000,9 +3910,6 @@ guilib - - guilib - guilib @@ -4159,6 +4066,9 @@ music\dialogs + + music\dialogs + music\dialogs @@ -4189,6 +4099,9 @@ music\windows + + music\windows + music\windows @@ -4375,6 +4288,9 @@ utils + + utils + utils @@ -4519,6 +4435,9 @@ video\dialogs + + video\dialogs + video\dialogs @@ -4537,6 +4456,9 @@ video\dialogs + + video\dialogs + video\dialogs @@ -4582,6 +4504,9 @@ dialogs + + interfaces + interfaces @@ -4711,9 +4636,6 @@ pvr\dialogs - - pvr\dialogs - pvr\dialogs @@ -4732,9 +4654,6 @@ pvr\channels - - pvr\channels - pvr\addons @@ -4789,6 +4708,9 @@ addons + + libs\SlingboxLib + dialogs @@ -4822,9 +4744,6 @@ guilib - - guilib - guilib @@ -4900,6 +4819,9 @@ peripherals\devices + + peripherals\dialogs + peripherals\dialogs @@ -4957,6 +4879,12 @@ filesystem + + filesystem + + + filesystem + filesystem @@ -5047,6 +4975,12 @@ filesystem + + filesystem + + + filesystem + filesystem @@ -5273,11 +5207,11 @@ video + - @@ -5449,9 +5383,6 @@ interfaces\legacy - - interfaces\legacy - interfaces\legacy @@ -5575,6 +5506,9 @@ guilib + + music\karaoke + video @@ -5941,30 +5875,6 @@ cores\dvdplayer\DVDDemuxers - - settings - - - cores\AudioEngine\DSPAddons - - - cores\AudioEngine\DSPAddons - - - cores\AudioEngine\DSPAddons - - - cores\AudioEngine\DSPAddons - - - cores\AudioEngine\DSPAddons - - - addons - - - addons - utils @@ -6043,7 +5953,7 @@ addons - + addons @@ -6082,186 +5992,9 @@ contrib\kissfft - - pvr\timers - - - win32 - - - guiinfo - - - network\dacp - - - settings\dialogs - - - addons - - - pictures - - - main\win32 - - - messaging - - - messaging - - - messaging - - - settings\dialogs - windows - - input - - - input - - - input - - - input - - - filesystem - - - events\windows - - - events\windows - - - events - - - events - - - events - - - events - - - events - - - events - - - events - - - events - - - filesystem - - - filesystem - - - filesystem - - - filesystem - - - video\jobs - - - utils\win32 - - - utils\win32 - - - guilib - - - messaging\helpers - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - interfaces\builtins - - - addons - - - cores\AudioEngine\Utils - - - utils - - - input - - - music\tags - - - pvr - @@ -6307,45 +6040,4 @@ interfaces\swig - - - shaders - - - shaders - - - shaders - - - shaders - - - shaders - - - shaders - - - shaders - - - shaders - - - shaders - - - shaders - - - shaders - - - shaders - - - shaders - - - + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/Win32BuildSetup/buildffmpeg.sh kodi-15.2~git20151019.1039-final/project/Win32BuildSetup/buildffmpeg.sh --- kodi-16.1~git20160425.1001-final/project/Win32BuildSetup/buildffmpeg.sh 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/Win32BuildSetup/buildffmpeg.sh 2015-10-19 08:39:15.000000000 +0000 @@ -84,8 +84,7 @@ --enable-runtime-cpudetect \ --enable-dxva2 \ --cpu=i686 \ ---enable-gnutls \ ---enable-libdcadec" +--enable-gnutls" echo configuring $LIBNAME ./configure --extra-cflags="-fno-common -I/xbmc/lib/win32/ffmpeg_dxva2 -DNDEBUG" --extra-ldflags="-L/xbmc/system/players/dvdplayer" ${OPTIONS} && @@ -104,4 +103,4 @@ #remove the bgprocessfile for signaling the process end if [ -f $BGPROCESSFILE ]; then rm $BGPROCESSFILE -fi +fi \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/project/Win32BuildSetup/BuildSetup.bat kodi-15.2~git20151019.1039-final/project/Win32BuildSetup/BuildSetup.bat --- kodi-16.1~git20160425.1001-final/project/Win32BuildSetup/BuildSetup.bat 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/Win32BuildSetup/BuildSetup.bat 2015-10-19 08:39:15.000000000 +0000 @@ -64,7 +64,6 @@ set EXE= "..\VS2010Express\XBMC\%buildconfig%\%APP_NAME%.exe" set PDB= "..\VS2010Express\XBMC\%buildconfig%\%APP_NAME%.pdb" - set D3D= "..\VS2010Express\XBMC\%buildconfig%\D3DCompile*.DLL" :: sets the BRANCH env var call getbranch.bat @@ -188,6 +187,12 @@ Echo addons\repository.pvr-ios.xbmc.org\>>exclude.txt Echo addons\repository.pvr-osx32.xbmc.org\>>exclude.txt Echo addons\repository.pvr-osx64.xbmc.org\>>exclude.txt + Echo addons\screensaver.rsxs.euphoria\>>exclude.txt + Echo addons\screensaver.rsxs.plasma\>>exclude.txt + Echo addons\screensaver.rsxs.solarwinds\>>exclude.txt + Echo addons\visualization.fishbmc\>>exclude.txt + Echo addons\visualization.projectm\>>exclude.txt + Echo addons\visualization.glspectrum\>>exclude.txt rem Exclude skins as they're copied by their own script Echo addons\skin.re-touched\>>exclude.txt Echo addons\skin.confluence\>>exclude.txt @@ -195,7 +200,6 @@ md BUILD_WIN32\application xcopy %EXE% BUILD_WIN32\application > NUL - xcopy %D3D% BUILD_WIN32\application > NUL xcopy ..\..\userdata BUILD_WIN32\application\userdata /E /Q /I /Y /EXCLUDE:exclude.txt > NUL copy ..\..\copying.txt BUILD_WIN32\application > NUL copy ..\..\LICENSE.GPL BUILD_WIN32\application > NUL diff -Nru kodi-16.1~git20160425.1001-final/project/Win32BuildSetup/genNsisIncludes.bat kodi-15.2~git20151019.1039-final/project/Win32BuildSetup/genNsisIncludes.bat --- kodi-16.1~git20160425.1001-final/project/Win32BuildSetup/genNsisIncludes.bat 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/Win32BuildSetup/genNsisIncludes.bat 2015-10-19 08:39:15.000000000 +0000 @@ -1,12 +1,13 @@ @ECHO OFF rem Application for Windows install script -rem Copyright (C) 2005-2015 Team XBMC -rem http://kodi.tv +rem Copyright (C) 2005-2013 Team XBMC +rem http://xbmc.org rem Script by chadoe rem This script generates NullSoft NSIS installer include files for application's add-ons -rem "SectionIn" defines on what level the section is selected by default +rem and addons rem 1. Full / 2. Normal / 3. Minimal +rem languages IF EXIST *-addons.nsi del *-addons.nsi > NUL SETLOCAL ENABLEDELAYEDEXPANSION @@ -15,14 +16,14 @@ IF EXIST BUILD_WIN32\addons\pvr.* ( ECHO SectionGroup "PVR Add-ons" SecPvrAddons >> pvr-addons.nsi FOR /F "tokens=*" %%P IN ('dir /B /AD BUILD_WIN32\addons\pvr.*') DO ( - FOR /f "delims=<" %%N in ('powershell.exe -ExecutionPolicy Unrestricted -command "& {[xml]$a = get-content BUILD_WIN32\addons\%%P\addon.xml;$a.addon.name}"') do ( - ECHO Section "%%N" SecPvrAddons!Counter! >> pvr-addons.nsi - ECHO SectionIn 1 2 >> pvr-addons.nsi - ECHO SetOutPath "$INSTDIR\addons\%%P" >> pvr-addons.nsi - ECHO File /r "${app_root}\addons\%%P\*.*" >> pvr-addons.nsi - ECHO SectionEnd >> pvr-addons.nsi - SET /A Counter = !Counter! + 1 - ) + SET "output=%%P" + SET output=!output:pvr.=! + ECHO Section "!output!" SecPvrAddons!Counter! >> pvr-addons.nsi + ECHO SectionIn 1 #section is in installtype Full >> pvr-addons.nsi + ECHO SetOutPath "$INSTDIR\addons\%%P" >> pvr-addons.nsi + ECHO File /r "${app_root}\addons\%%P\*.*" >> pvr-addons.nsi + ECHO SectionEnd >> pvr-addons.nsi + SET /A Counter = !Counter! + 1 ) ECHO SectionGroupEnd >> pvr-addons.nsi ) @@ -31,14 +32,14 @@ IF EXIST BUILD_WIN32\addons\audiodecoder.* ( ECHO SectionGroup "Audio Decoder Add-ons" SecAudioDecoderAddons >> audiodecoder-addons.nsi FOR /F "tokens=*" %%P IN ('dir /B /AD BUILD_WIN32\addons\audiodecoder.*') DO ( - FOR /f "delims=<" %%N in ('powershell.exe -ExecutionPolicy Unrestricted -command "& {[xml]$a = get-content BUILD_WIN32\addons\%%P\addon.xml;$a.addon.name}"') do ( - ECHO Section "%%N" SecAudioDecoderAddons!Counter! >> audiodecoder-addons.nsi - ECHO SectionIn 1 >> audiodecoder-addons.nsi - ECHO SetOutPath "$INSTDIR\addons\%%P" >> audiodecoder-addons.nsi - ECHO File /r "${app_root}\addons\%%P\*.*" >> audiodecoder-addons.nsi - ECHO SectionEnd >> audiodecoder-addons.nsi - SET /A Counter = !Counter! + 1 - ) + SET "output=%%P" + SET output=!output:audiodecoder.=! + ECHO Section "!output!" SecAudioDecoderAddons!Counter! >> audiodecoder-addons.nsi + ECHO SectionIn 1 2 3 #section is in installtype Full >> audiodecoder-addons.nsi + ECHO SetOutPath "$INSTDIR\addons\%%P" >> audiodecoder-addons.nsi + ECHO File /r "${app_root}\addons\%%P\*.*" >> audiodecoder-addons.nsi + ECHO SectionEnd >> audiodecoder-addons.nsi + SET /A Counter = !Counter! + 1 ) ECHO SectionGroupEnd >> audiodecoder-addons.nsi ) @@ -47,78 +48,30 @@ IF EXIST BUILD_WIN32\addons\audioencoder.* ( ECHO SectionGroup "Audio Encoder Add-ons" SecAudioEncoderAddons >> audioencoder-addons.nsi FOR /F "tokens=*" %%P IN ('dir /B /AD BUILD_WIN32\addons\audioencoder.*') DO ( - FOR /f "delims=<" %%N in ('powershell.exe -ExecutionPolicy Unrestricted -command "& {[xml]$a = get-content BUILD_WIN32\addons\%%P\addon.xml;$a.addon.name}"') do ( - ECHO Section "%%N" SecAudioEncoderAddons!Counter! >> audioencoder-addons.nsi - ECHO SectionIn 1 2 3 >> audioencoder-addons.nsi - ECHO SetOutPath "$INSTDIR\addons\%%P" >> audioencoder-addons.nsi - ECHO File /r "${app_root}\addons\%%P\*.*" >> audioencoder-addons.nsi - ECHO SectionEnd >> audioencoder-addons.nsi - SET /A Counter = !Counter! + 1 - ) - ) - ECHO SectionGroupEnd >> audioencoder-addons.nsi -) - -SET Counter=1 -IF EXIST BUILD_WIN32\addons\adsp.* ( - ECHO SectionGroup "Audio DSP Add-ons" SecAudioDSPAddons >> audiodsp-addons.nsi - FOR /F "tokens=*" %%P IN ('dir /B /AD BUILD_WIN32\addons\adsp.*') DO ( - FOR /f "delims=<" %%N in ('powershell.exe -ExecutionPolicy Unrestricted -command "& {[xml]$a = get-content BUILD_WIN32\addons\%%P\addon.xml;$a.addon.name}"') do ( - ECHO Section "%%N" SecAudioDSPAddons!Counter! >> audiodsp-addons.nsi - ECHO SectionIn 1 2 >> audiodsp-addons.nsi - ECHO SetOutPath "$INSTDIR\addons\%%P" >> audiodsp-addons.nsi - ECHO File /r "${app_root}\addons\%%P\*.*" >> audiodsp-addons.nsi - ECHO SectionEnd >> audiodsp-addons.nsi - SET /A Counter = !Counter! + 1 - ) - ) - ECHO SectionGroupEnd >> audiodsp-addons.nsi -) - -SET Counter=1 -IF EXIST BUILD_WIN32\addons\screensaver.* ( - ECHO SectionGroup "Screensaver Add-ons" SecScreensaverAddons >> screensaver-addons.nsi - FOR /F "tokens=*" %%P IN ('dir /B /AD BUILD_WIN32\addons\screensaver.*') DO ( SET "output=%%P" - SET output=!output:screensaver.=! - ECHO Section "!output!" SecScreensaverAddons!Counter! >> screensaver-addons.nsi - ECHO SectionIn 1 2 3 #section is in installtype Full >> screensaver-addons.nsi - ECHO SetOutPath "$INSTDIR\addons\%%P" >> screensaver-addons.nsi - ECHO File /r "${app_root}\addons\%%P\*.*" >> screensaver-addons.nsi - ECHO SectionEnd >> screensaver-addons.nsi + SET output=!output:audioencoder.=! + ECHO Section "!output!" SecAudioEncoderAddons!Counter! >> audioencoder-addons.nsi + ECHO SectionIn 1 2 3 #section is in installtype Full >> audioencoder-addons.nsi + ECHO SetOutPath "$INSTDIR\addons\%%P" >> audioencoder-addons.nsi + ECHO File /r "${app_root}\addons\%%P\*.*" >> audioencoder-addons.nsi + ECHO SectionEnd >> audioencoder-addons.nsi SET /A Counter = !Counter! + 1 ) - ECHO SectionGroupEnd >> screensaver-addons.nsi -) - -SET Counter=1 -IF EXIST BUILD_WIN32\addons\visualization.* ( - ECHO SectionGroup "Music Visualization Add-ons" SecVisualizationAddons >> visualization-addons.nsi - FOR /F "tokens=*" %%P IN ('dir /B /AD BUILD_WIN32\addons\visualization.*') DO ( - SET "output=%%P" - SET output=!output:visualization.=! - ECHO Section "!output!" SecVisualizationAddons!Counter! >> visualization-addons.nsi - ECHO SectionIn 1 2 3 #section is in installtype Full >> visualization-addons.nsi - ECHO SetOutPath "$INSTDIR\addons\%%P" >> visualization-addons.nsi - ECHO File /r "${app_root}\addons\%%P\*.*" >> visualization-addons.nsi - ECHO SectionEnd >> visualization-addons.nsi - SET /A Counter = !Counter! + 1 - ) - ECHO SectionGroupEnd >> visualization-addons.nsi + ECHO SectionGroupEnd >> audioencoder-addons.nsi ) SET Counter=1 IF EXIST BUILD_WIN32\addons\skin.* ( ECHO SectionGroup "Skin Add-ons" SecSkinAddons >> skin-addons.nsi FOR /F "tokens=*" %%P IN ('dir /B /AD BUILD_WIN32\addons\skin.*') DO ( - FOR /f "delims=<" %%N in ('powershell.exe -ExecutionPolicy Unrestricted -command "& {[xml]$a = get-content BUILD_WIN32\addons\%%P\addon.xml;$a.addon.name}"') do ( - ECHO Section "%%N" SecSkinAddons!Counter! >> skin-addons.nsi - ECHO SectionIn 1 >> skin-addons.nsi - ECHO SetOutPath "$INSTDIR\addons\%%P" >> skin-addons.nsi - ECHO File /r "${app_root}\addons\%%P\*.*" >> skin-addons.nsi - ECHO SectionEnd >> skin-addons.nsi - SET /A Counter = !Counter! + 1 - ) + SET "output=%%P" + SET output=!output:skin.=! + ECHO Section "!output!" SecSkinAddons!Counter! >> skin-addons.nsi + ECHO SectionIn 1 #section is in installtype Full >> skin-addons.nsi + ECHO SetOutPath "$INSTDIR\addons\%%P" >> skin-addons.nsi + ECHO File /r "${app_root}\addons\%%P\*.*" >> skin-addons.nsi + ECHO SectionEnd >> skin-addons.nsi + SET /A Counter = !Counter! + 1 ) ECHO SectionGroupEnd >> skin-addons.nsi ) diff -Nru kodi-16.1~git20160425.1001-final/project/Win32BuildSetup/genNsisInstaller.nsi kodi-15.2~git20151019.1039-final/project/Win32BuildSetup/genNsisInstaller.nsi --- kodi-16.1~git20160425.1001-final/project/Win32BuildSetup/genNsisInstaller.nsi 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/Win32BuildSetup/genNsisInstaller.nsi 2015-10-19 08:39:15.000000000 +0000 @@ -33,6 +33,7 @@ Var StartMenuFolder Var PageProfileState + Var DirectXSetupError Var VSRedistSetupError Var /GLOBAL CleanDestDir @@ -280,11 +281,8 @@ ;*-addons.nsi are generated by genNsisIncludes.bat !include /nonfatal "audiodecoder-addons.nsi" !include /nonfatal "audioencoder-addons.nsi" -!include /nonfatal "audiodsp-addons.nsi" !include /nonfatal "pvr-addons.nsi" !include /nonfatal "skin-addons.nsi" -!include /nonfatal "screensaver-addons.nsi" -!include /nonfatal "visualization-addons.nsi" ;-------------------------------- ;Descriptions @@ -400,10 +398,35 @@ SectionGroupEnd +;-------------------------------- +;DirectX web-installer Section +!define DXVERSIONDLL "$SYSDIR\D3DX9_43.dll" +Section "DirectX Install" SEC_DIRECTX + SectionIn 1 2 #section is in install type Full/Normal and when not installed + DetailPrint "Running DirectX Setup..." + SetOutPath "$TEMP\dxsetup" + File "${app_root}\..\dependencies\dxsetup\*.*" + ExecWait '"$TEMP\dxsetup\dxsetup.exe" /silent' $DirectXSetupError + RMDir /r "$TEMP\dxsetup" + SetOutPath "$INSTDIR" + DetailPrint "Finished DirectX Setup" +SectionEnd + +Section "-Check DirectX installation" SEC_DIRECTXCHECK + + IfFileExists ${DXVERSIONDLL} +2 0 + MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "DirectX9 wasn't installed properly.$\nPlease download the DirectX End-User Runtime from Microsoft and install it again." + +SectionEnd + Function .onInit ${IfNot} ${AtLeastWinVista} MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Windows Vista or above required.$\nThis program can not be run on Windows XP" Quit ${EndIf} + # set section 'SEC_DIRECTX' as selected and read-only if required dx version not found + IfFileExists ${DXVERSIONDLL} +3 0 + IntOp $0 ${SF_SELECTED} | ${SF_RO} + SectionSetFlags ${SEC_DIRECTX} $0 StrCpy $CleanDestDir "-1" FunctionEnd diff -Nru kodi-16.1~git20160425.1001-final/project/Win32BuildSetup/getdeploydependencies.bat kodi-15.2~git20151019.1039-final/project/Win32BuildSetup/getdeploydependencies.bat --- kodi-16.1~git20160425.1001-final/project/Win32BuildSetup/getdeploydependencies.bat 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/project/Win32BuildSetup/getdeploydependencies.bat 2015-10-19 08:39:15.000000000 +0000 @@ -1,28 +1,24 @@ @echo off -REM If KODI_MIRROR is not set externally to this script, set it to the default mirror URL -IF "%KODI_MIRROR%" == "" SET KODI_MIRROR=http://mirrors.kodi.tv -echo Downloading from mirror %KODI_MIRROR% - - -:: Following commands expect this script's parent directory to be the current directory, so make sure that's so -PUSHD %~dp0 - if not exist dependencies\vcredist\2008 mkdir dependencies\vcredist\2008 if not exist dependencies\vcredist\2010 mkdir dependencies\vcredist\2010 if not exist dependencies\vcredist\2013 mkdir dependencies\vcredist\2013 if not exist dependencies\vcredist\2008\vcredist_x86.exe ( echo Downloading vc90 redist... - ..\BuildDependencies\bin\wget -nv -O dependencies\vcredist\2008\vcredist_x86.exe %KODI_MIRROR%/build-deps/win32/vcredist/2008/vcredist_x86.exe + ..\BuildDependencies\bin\wget -nv -O dependencies\vcredist\2008\vcredist_x86.exe http://mirrors.xbmc.org/build-deps/win32/vcredist/2008/vcredist_x86.exe ) if not exist dependencies\vcredist\2010\vcredist_x86.exe ( echo Downloading vc100 redist... - ..\BuildDependencies\bin\wget -nv -O dependencies\vcredist\2010\vcredist_x86.exe %KODI_MIRROR%/build-deps/win32/vcredist/2010/vcredist_x86.exe + ..\BuildDependencies\bin\wget -nv -O dependencies\vcredist\2010\vcredist_x86.exe http://mirrors.xbmc.org/build-deps/win32/vcredist/2010/vcredist_x86.exe ) if not exist dependencies\vcredist\2013\vcredist_x86.exe ( echo Downloading vc120 redist... - ..\BuildDependencies\bin\wget -nv -O dependencies\vcredist\2013\vcredist_x86.exe %KODI_MIRROR%/build-deps/win32/vcredist/2013/vcredist_x86.exe + ..\BuildDependencies\bin\wget -nv -O dependencies\vcredist\2013\vcredist_x86.exe http://mirrors.xbmc.org/build-deps/win32/vcredist/2013/vcredist_x86.exe ) -:: Restore the previous current directory -POPD +if not exist dependencies\dxsetup mkdir dependencies\dxsetup +for %%f in (DSETUP.dll dsetup32.dll dxdllreg_x86.cab DXSETUP.exe dxupdate.cab Jun2010_D3DCompiler_43_x86.cab Jun2010_d3dx9_43_x86.cab) do ( + if not exist dependencies\dxsetup\%%f ( + ..\BuildDependencies\bin\wget -nv -O dependencies\dxsetup\%%f http://mirrors.xbmc.org/build-deps/win32/dxsetup/%%f + ) +) diff -Nru kodi-16.1~git20160425.1001-final/README.md kodi-15.2~git20151019.1039-final/README.md --- kodi-16.1~git20160425.1001-final/README.md 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/README.md 2015-10-19 08:39:14.000000000 +0000 @@ -1,5 +1,3 @@ -[![Build Status](https://travis-ci.org/xbmc/xbmc.svg?branch=Jarvis)](https://travis-ci.org/xbmc/xbmc) - #### About Kodi is an award-winning free and open source (GPL) software media player and @@ -45,7 +43,6 @@ ##### Useful links * [Kodi wiki] (http://kodi.wiki/) -* [Kodi bug tracker] (http://trac.kodi.tv) * [Kodi community forums] (http://forum.kodi.tv/) * [Kodi website] (http://kodi.tv) diff -Nru kodi-16.1~git20160425.1001-final/system/keyboardlayouts/chinese.xml kodi-15.2~git20151019.1039-final/system/keyboardlayouts/chinese.xml --- kodi-16.1~git20160425.1001-final/system/keyboardlayouts/chinese.xml 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keyboardlayouts/chinese.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ - - - - - - 0123456789 - qwertyuiop - asdfghjkl - zxcvbnm - - - 0123456789 - QWERTYUIOP - ASDFGHJKL - ZXCVBNM - - - )!@#$%^&*( - []{}-_=+;: - '",.<>/?\| - `~ - - - - - 0123456789 - qwertyuiop - asdfghjkl - zxcvbnm - - - 0123456789 - QWERTYUIOP - ASDFGHJKL - ZXCVBNM - - - )!@#$%^&*( - []{}-_=+;: - '",.<>/?\| - `~ - - - diff -Nru kodi-16.1~git20160425.1001-final/system/keyboardlayouts/czech.xml kodi-15.2~git20151019.1039-final/system/keyboardlayouts/czech.xml --- kodi-16.1~git20160425.1001-final/system/keyboardlayouts/czech.xml 2015-11-04 04:00:19.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keyboardlayouts/czech.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ - - - - - - ťěščřžýáíéó( - qwertzuiopú) - asdfghjklůď_ - /yxcvbnmň:.- - - - ŤĚŠČŘŽÝÁÍÉÓ( - QWERTZUIOPÚ) - ASDFGHJKLŮĎ_ - \YXCVBNMŇ:.- - - - 1234567890% - +@#$~^&*{}= - []()/"'`;! - \|<>,.?:-_ - - - diff -Nru kodi-16.1~git20160425.1001-final/system/keyboardlayouts/english.xml kodi-15.2~git20151019.1039-final/system/keyboardlayouts/english.xml --- kodi-16.1~git20160425.1001-final/system/keyboardlayouts/english.xml 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keyboardlayouts/english.xml 2015-10-19 08:39:15.000000000 +0000 @@ -8,14 +8,14 @@ 1234567890 qwertyuiop - asdfghjkl: - zxcvbnm./@ + asdfghjkl + zxcvbnm 1234567890 QWERTYUIOP - ASDFGHJKL: - ZXCVBNM./@ + ASDFGHJKL + ZXCVBNM )!@#$%^&*( @@ -29,13 +29,13 @@ 1234567890 azertyuiop qsdfghjklm - wxcvbn:./@ + wxcvbn 1234567890 AZERTYUIOP QSDFGHJKLM - WXCVBN:./@ + WXCVBN )!@#$%^&*( @@ -49,13 +49,13 @@ 0123456789 abcdefghij klmnopqrst - uvwxyz:./@ + uvwxyz 0123456789 ABCDEFGHIJ KLMNOPQRST - UVWXYZ:./@ + UVWXYZ )!@#$%^&*( diff -Nru kodi-16.1~git20160425.1001-final/system/keyboardlayouts/french.xml kodi-15.2~git20151019.1039-final/system/keyboardlayouts/french.xml --- kodi-16.1~git20160425.1001-final/system/keyboardlayouts/french.xml 2016-02-06 04:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keyboardlayouts/french.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ - - - - - - 1234567890°+ - azertyuiop^$ - qsdfghjklmù* - <wxcvbn,;:!& - - - 1234567890@= - AZERTYUIOP¨£ - QSDFGHJKLM%µ - >WXCVBN?./§² - - - ()[]{}~"'`-_ - #|\€¤ÆŒæœüÜÙ - àâçéèêëîïôöû - ÀÂÇÉÈÊËÎÏÔÖÛ - - - \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/system/keyboardlayouts/korean.xml kodi-15.2~git20151019.1039-final/system/keyboardlayouts/korean.xml --- kodi-16.1~git20160425.1001-final/system/keyboardlayouts/korean.xml 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keyboardlayouts/korean.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ - - - - - - 0123456789 - ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋ - ㅌㅍㅎㄲㄸㅃㅆㅉㅏㅑㅓ - ㅕㅗㅛㅜㅠㅡㅣㅐㅔㅒㅖ - - - 0123456789 - ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋ - ㅌㅍㅎㄲㄸㅃㅆㅉㅏㅑㅓ - ㅕㅗㅛㅜㅠㅡㅣㅐㅔㅒㅖ - - - )!@#$%^&*( - []{}-_=+;: - '",.<>/?\| - `~ - - - diff -Nru kodi-16.1~git20160425.1001-final/system/keymaps/gamepad.xml kodi-15.2~git20151019.1039-final/system/keymaps/gamepad.xml --- kodi-16.1~git20160425.1001-final/system/keymaps/gamepad.xml 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keymaps/gamepad.xml 2015-04-26 07:35:25.000000000 +0000 @@ -18,10 +18,9 @@ - - - - + + + diff -Nru kodi-16.1~git20160425.1001-final/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml kodi-15.2~git20151019.1039-final/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml --- kodi-16.1~git20160425.1001-final/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml 2016-04-25 08:01:43.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml 2015-04-26 07:35:25.000000000 +0000 @@ -600,10 +600,10 @@ - + - + diff -Nru kodi-16.1~git20160425.1001-final/system/keymaps/keyboard.xml kodi-15.2~git20151019.1039-final/system/keymaps/keyboard.xml --- kodi-16.1~git20160425.1001-final/system/keymaps/keyboard.xml 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keymaps/keyboard.xml 2015-10-19 08:39:15.000000000 +0000 @@ -1,28 +1,40 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -40,22 +52,15 @@ PageUp PageDown Select - ContextMenu Select - ContextMenu Back - Back - ActivateWindow(Home) Back - Menu - ActivateWindow(PlayerControls) + ActivateWindow(PlayerControls) ActivateWindow(shutdownmenu) PreviousMenu Info ContextMenu - Menu ContextMenu - Menu Pause Stop SkipNext @@ -99,11 +104,6 @@ ActivateWindow(RadioChannels) ActivateWindow(TVRecordings) ActivateWindow(TVTimers) - - ActivateWindow(TVChannels) - ActivateWindow(MyVideos) - ActivateWindow(MyMusic) - ActivateWindow(MyPictures) Back @@ -111,10 +111,7 @@ ActivateWindow(Favourites) - ActivateWindow(Favourites) - ActivateWindow(Settings) ActivateWindow(Home) - ActivateWindow(Home) Mute VolumeDown VolumeUp @@ -142,8 +139,6 @@ SkipNext SkipPrevious Info - Record - PreviousMenu VolumeUp VolumeDown Mute @@ -156,12 +151,11 @@ ActivateWindow(TVChannels) ActivateWindow(TVChannels) ActivateWindow(RadioChannels) - + Notification(MCEKeypress, DVD subtitle, 3) Notification(MCEKeypress, DVD audio, 3) ReloadKeymaps ToggleDebug - ToggleDirtyRegionVisualization @@ -173,89 +167,53 @@ info ShutDown() - ActivateWindow(ShutdownMenu) - Left - Right - Up - Down - Select - Select Backspace - Backspace - PreviousMenu - Move - PreviousMenu + Move Delete Rename - PreviousMenu - Red - Green - Yellow - Blue Delete Rename - PreviousMenu - Red - Green - Yellow - Blue - Move - PreviousMenu + Move Delete Rename - Red - Green - Yellow - Blue Delete Rename - Red - Green - Yellow - Blue - - - PreviousMenu - - Highlight Delete Move Rename - Highlight - ActivateWindow(Home) @@ -264,7 +222,6 @@ Delete MoveItemUp MoveItemDown - ActivateWindow(Home) @@ -272,7 +229,6 @@ MoveItemUp MoveItemDown Delete - ActivateWindow(Home) @@ -280,14 +236,12 @@ Playlist Queue Delete - ActivateWindow(Home) Playlist Queue - ActivateWindow(Home) @@ -297,22 +251,15 @@ StepForward StepBack Fullscreen - Stop - Fullscreen - Stop - Seek(-7) + Seek(-7) BigStepForward BigStepBack OSD OSD - PlayPause - PlayPause OSD - OSD Info CodecInfo AspectRatio - AspectRatio ShowSubtitles SubtitleAlign NextSubtitle @@ -324,7 +271,6 @@ Fullscreen Playlist ActivateWindow(Teletext) - ActivateWindow(Teletext) SubtitleShiftUp SubtitleShiftDown SkipNext @@ -346,12 +292,11 @@ Back Back OSD - OSD - Back + Back @@ -363,17 +308,12 @@ IncreaseRating DecreaseRating Fullscreen - Stop - Fullscreen - Stop OSD OSD OSD - OSD Info

ActivateWindow(VisualisationPresetList)

Addon.Default.OpenSettings(xbmc.player.musicviz) - Addon.Default.OpenSettings(xbmc.player.musicviz) ActivateWindow(MusicPlaylist) StepBack StepForward @@ -393,12 +333,10 @@ SkipNext SkipPrevious Back - Back Info CodecInfo

ActivateWindow(VisualisationPresetList)

Addon.Default.OpenSettings(xbmc.player.musicviz) - Addon.Default.OpenSettings(xbmc.player.musicviz) ActivateWindow(MusicPlaylist) @@ -413,7 +351,6 @@ CodecInfo

ActivateWindow(VisualisationPresetList)

Back - Back ActivateWindow(MusicPlaylist) @@ -428,7 +365,6 @@ CodecInfo

Back

Back - Back ActivateWindow(MusicPlaylist) @@ -453,7 +389,6 @@ Rotate Rotate Rotate - ActivateWindow(Home) @@ -474,7 +409,6 @@ Back - Back Back Info CodecInfo @@ -485,11 +419,9 @@ BigStepForward BigStepBack OSD - OSD Info CodecInfo AspectRatio - AspectRatio ShowSubtitles NextSubtitle AudioDelay @@ -522,7 +454,6 @@ Delete Playlist ToggleWatched - ActivateWindow(Home) @@ -530,7 +461,6 @@ Playlist Queue ToggleWatched - ActivateWindow(Home) @@ -539,13 +469,11 @@ Delete MoveItemUp MoveItemDown - ActivateWindow(Home) Delete - ActivateWindow(Home) @@ -554,17 +482,20 @@ Back + + + info + + Back Back - ActivateWindow(Home) Back - ActivateWindow(Home) @@ -575,67 +506,45 @@ Back Back Pause - ActivateWindow(Home) Back - Back - Red - Green - Yellow - Blue Close - Close MoveItemUp MoveItemDown - ActivateWindow(Home) Close - Close StepBack StepForward - Up - Down - OSD - OSD - ActivateWindow(PVROSDChannels) - ActivateWindow(PVROSDChannels) - ChannelUp - ChannelDown + ChannelUp + ChannelDown StepBack StepForward - Up - Down - OSD - OSD - ActivateWindow(PVROSDChannels) - ActivateWindow(PVROSDChannels) - ChannelUp - ChannelDown + ChannelUp + ChannelDown Close Close - Close Close @@ -643,19 +552,16 @@ Close Close - Close PreviousMenu - PreviousMenu Highlight - ActivateWindow(Home) @@ -666,46 +572,19 @@ Back - ActivateWindow(Home) Delete - ActivateWindow(Home) Red - Red Green - Green Yellow - Yellow Blue - Blue - ActivateWindow(Home) - - - ActivateWindow(Home) - - - - - ActivateWindow(Home) - - - - - ActivateWindow(Home) - - - - - ActivateWindow(Home) - - diff -Nru kodi-16.1~git20160425.1001-final/system/keymaps/mouse.xml kodi-15.2~git20151019.1039-final/system/keymaps/mouse.xml --- kodi-16.1~git20160425.1001-final/system/keymaps/mouse.xml 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keymaps/mouse.xml 2015-04-04 00:00:13.000000000 +0000 @@ -29,11 +29,4 @@ NextPicture - - - Info - - - - diff -Nru kodi-16.1~git20160425.1001-final/system/keymaps/remote.xml kodi-15.2~git20151019.1039-final/system/keymaps/remote.xml --- kodi-16.1~git20160425.1001-final/system/keymaps/remote.xml 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keymaps/remote.xml 2015-10-19 08:39:15.000000000 +0000 @@ -1,36 +1,40 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -48,8 +52,7 @@ PageUp PageDown Back - ContextMenu - Menu + PreviousMenu PreviousMenu PreviousMenu ContextMenu @@ -67,7 +70,7 @@ ActivateWindow(MyVideos) ActivateWindow(MyMusic) ActivateWindow(MyPictures) - ActivateWindow(Videos,TvShows) + ActivateWindow(TVChannels) ActivateWindow(TVGuide) ActivateWindow(TVChannels) ActivateWindow(RadioChannels) @@ -377,7 +380,7 @@ - Back + BackSpace Shift Symbols Number0 @@ -418,7 +421,7 @@ Number8 Number9 Enter - Back + BackSpace @@ -574,20 +577,16 @@ StepBack StepForward - Up - Down - ChannelUp - ChannelDown + ChannelUp + ChannelDown StepBack StepForward - Up - Down - ChannelUp - ChannelDown + ChannelUp + ChannelDown @@ -598,16 +597,6 @@ Close Close Close - Number0 - Number1 - number2 - number3 - number4 - number5 - number6 - number7 - number8 - number9 @@ -618,60 +607,8 @@ Close Close Close - Number0 - Number1 - number2 - number3 - number4 - number5 - number6 - number7 - number8 - number9 - - - Number0 - Number1 - number2 - number3 - number4 - number5 - number6 - number7 - number8 - number9 - - - - - Number0 - Number1 - number2 - number3 - number4 - number5 - number6 - number7 - number8 - number9 - - - - - Number0 - Number1 - number2 - number3 - number4 - number5 - number6 - number7 - number8 - number9 - - PreviousMenu @@ -690,4 +627,4 @@ Blue - \ No newline at end of file + diff -Nru kodi-16.1~git20160425.1001-final/system/keymaps/touchscreen.xml kodi-15.2~git20151019.1039-final/system/keymaps/touchscreen.xml --- kodi-16.1~git20160425.1001-final/system/keymaps/touchscreen.xml 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/keymaps/touchscreen.xml 2015-06-14 19:32:49.000000000 +0000 @@ -11,17 +11,8 @@ SwipeRight SwipeUp SwipeDown - SwitchPlayer - ActivateWindow(PlayerControls) - - - Select - Highlight - Highlight - - StepBack @@ -29,39 +20,29 @@ ChapterOrBigStepForward ChapterOrBigStepBack Seek(-7) - SkipNext - SkipPrevious - Playlist - PlayPause - - - Back - - StepBack StepForward SkipNext SkipPrevious - SkipNext - SkipPrevious - Playlist - PlayPause ZoomGesture RotateGesture - PreviousPicture - NextPicture - Pause - Info + + + Select + Highlight + Highlight + + Up @@ -71,33 +52,4 @@ NextCalibration - - - SkipNext - SkipPrevious - - - - - Back - Back - - - - - Back - - - - - Up - Down - - - - - ChannelUp - ChannelDown - - - \ No newline at end of file + diff -Nru kodi-16.1~git20160425.1001-final/system/library/music/files.xml kodi-15.2~git20151019.1039-final/system/library/music/files.xml --- kodi-16.1~git20160425.1001-final/system/library/music/files.xml 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/library/music/files.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - DefaultFolder.png - sources://music - diff -Nru kodi-16.1~git20160425.1001-final/system/Lircmap.xml kodi-15.2~git20151019.1039-final/system/Lircmap.xml --- kodi-16.1~git20160425.1001-final/system/Lircmap.xml 2015-11-02 01:00:12.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/Lircmap.xml 2015-10-19 08:39:15.000000000 +0000 @@ -86,7 +86,7 @@ KEY_POWER KEY_VIDEO KEY_AUDIO - LiveTV + LiveTV KEY_EPG KEY_1 KEY_2 @@ -412,7 +412,7 @@ - cx23885_remote + cx23885_remote KEY_LEFT KEY_RIGHT KEY_UP @@ -438,8 +438,8 @@ KEY_REWIND KEY_VOLUMEUP KEY_VOLUMEDOWN - KEY_CHANNELUP - KEY_CHANNELDOWN + KEY_CHANNELUP + KEY_CHANNELDOWN KEY_NEXTSONG KEY_NEXT KEY_PREVIOUSSONG @@ -456,7 +456,7 @@ KEY_CAMERA KEY_TV KEY_RADIO - KEY_TUNER + KEY_TUNER KEY_1 KEY_2 KEY_3 @@ -556,8 +556,8 @@ KEY_REWIND KEY_VOLUMEUP KEY_VOLUMEDOWN - KEY_CHANNELUP - KEY_CHANNELDOWN + KEY_CHANNELUP + KEY_CHANNELDOWN KEY_NEXT KEY_PREVIOUS KEY_EPG @@ -574,7 +574,7 @@ KEY_VIDEO KEY_AUDIO KEY_CAMERA - KEY_TUNER + KEY_TUNER KEY_TV KEY_TEXT KEY_NUMERIC_1 diff -Nru kodi-16.1~git20160425.1001-final/system/peripherals.xml kodi-15.2~git20151019.1039-final/system/peripherals.xml --- kodi-16.1~git20160425.1001-final/system/peripherals.xml 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/peripherals.xml 2015-10-19 08:39:15.000000000 +0000 @@ -19,8 +19,7 @@ - - + diff -Nru kodi-16.1~git20160425.1001-final/system/playercorefactory.xml kodi-15.2~git20151019.1039-final/system/playercorefactory.xml --- kodi-16.1~git20160425.1001-final/system/playercorefactory.xml 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/playercorefactory.xml 2015-10-19 08:39:15.000000000 +0000 @@ -11,7 +11,7 @@ - + diff -Nru kodi-16.1~git20160425.1001-final/system/settings/android.xml kodi-15.2~git20151019.1039-final/system/settings/android.xml --- kodi-16.1~git20160425.1001-final/system/settings/android.xml 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/settings/android.xml 2015-10-19 08:38:32.000000000 +0000 @@ -8,13 +8,6 @@
- - - - false - - - @@ -22,15 +15,6 @@ 2 true - - - - - - HAS_MEDIACODEC - 2 - true - diff -Nru kodi-16.1~git20160425.1001-final/system/settings/darwin_ios_atv2.xml kodi-15.2~git20151019.1039-final/system/settings/darwin_ios_atv2.xml --- kodi-16.1~git20160425.1001-final/system/settings/darwin_ios_atv2.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/settings/darwin_ios_atv2.xml 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,15 @@ + + +
+ + + + false + + + false + + + +
+
diff -Nru kodi-16.1~git20160425.1001-final/system/settings/settings.xml kodi-15.2~git20151019.1039-final/system/settings/settings.xml --- kodi-16.1~git20160425.1001-final/system/settings/settings.xml 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/settings/settings.xml 2015-10-19 08:39:15.000000000 +0000 @@ -29,7 +29,7 @@ - +
1 @@ -40,7 +40,7 @@ - + 1 @@ -51,7 +51,7 @@ - + 2 @@ -79,32 +79,19 @@ - + 0 resource.uisounds.confluence - kodi.resource.uisounds - true - - - - - - installed - - - - 2 - 5 - - 0 - 1 - 10 + skinsounds - + + + +
@@ -241,7 +228,7 @@ - + @@ -476,16 +463,6 @@ false - - 0 - false - - - - 1 - false - - @@ -520,7 +497,7 @@ 1 original - audiostreamlanguages + streamlanguages @@ -610,7 +587,6 @@ - @@ -886,7 +862,7 @@ 1 original - subtitlestreamlanguages + streamlanguages @@ -1002,7 +978,7 @@ 1 English - subtitledownloadlanguages + streamlanguages , 1 @@ -1093,18 +1069,6 @@ - - 1 - 1 - - - - - - - - - 1 0 @@ -1159,7 +1123,7 @@ 4 - metadata.local + metadata.musicvideos.theaudiodb.com xbmc.metadata.scraper.musicvideos @@ -1409,42 +1373,6 @@ - - - 1 - true - - - - 1 - false - - - true - - - - 2 - 10 - - 0 - 1 - 20 - - - 14050 - - - true - true - - - - 2 - false - - -
@@ -1484,30 +1412,27 @@ 2 - 0 + 0 - pvrrecordmargins + 0 + 1 + 60 - + + 14044 + 2 - 0 - - pvrrecordmargins - - - - - 2 0 - - - - + 0 + 1 + 60 - + + 14044 + @@ -1637,14 +1562,6 @@ - - - - 4 - true - - -
@@ -1837,7 +1754,7 @@ 0 - visualization.spectrum + visualization.glspectrum xbmc.player.musicviz true @@ -1862,6 +1779,13 @@ 16016 + + 2 + %D + + 16016 + + 4 @@ -1872,6 +1796,16 @@ 16016 + + 4 + + + true + + + 16016 + + 4 @@ -1882,6 +1816,16 @@ 16016 + + 4 + + + true + + + 16016 + + 0 true @@ -1949,6 +1893,94 @@ + + HAS_KARAOKE + + + 2 + false + + + + 2 + false + + true + + + + + + + 2 + arial.ttf + + fonts + + + true + + + + + 2 + 36 + + 16 + 2 + 74 + + + true + + + + + + 2 + 0 + + + + + + + + + + true + + + + + 2 + DEFAULT + + charsets + + + true + + + + + + + 2 + + true + + + + + 2 + + true + + + + + @@ -1972,11 +2004,21 @@
+ + 0 + true + + 1 true + + 1 + true + + 1 true @@ -2114,9 +2156,6 @@ 1 65535 - - - @@ -2298,7 +2337,7 @@ true - + 3 true @@ -2556,61 +2595,8 @@ - - 2 - false - - - - - false - - false - false - - - - - - - 0 - false - - - - audiooutput.dspaddonsenabled - audiooutput.dspaddonsenabled - - - - - - - 1 - - - - - audiooutput.dspsettings - - - - - - 1 - - - - - audiooutput.dspresetdb - - - - - - 0 1 @@ -2842,7 +2828,7 @@ 512 102400 - + 14048 @@ -2891,32 +2877,8 @@ - + - - 1 - true - - - - 1 - false - - true - - - - - 1 - - true - - - true - - - - 1 false diff -Nru kodi-16.1~git20160425.1001-final/system/settings/win32.xml kodi-15.2~git20151019.1039-final/system/settings/win32.xml --- kodi-16.1~git20160425.1001-final/system/settings/win32.xml 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/settings/win32.xml 2015-04-04 00:00:13.000000000 +0000 @@ -7,6 +7,15 @@
+
+ + + + HAS_GL + + + +
diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/convolution-4x4_d3d.fx kodi-15.2~git20151019.1039-final/system/shaders/convolution-4x4_d3d.fx --- kodi-16.1~git20160425.1001-final/system/shaders/convolution-4x4_d3d.fx 2016-01-11 16:50:50.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/convolution-4x4_d3d.fx 2015-10-19 08:39:15.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2015 Team XBMC + * Copyright (C) 2005-2010-2013 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -18,73 +18,62 @@ * */ -texture2D g_Texture; -texture2D g_KernelTexture; -float2 g_StepXY; -float2 g_viewPort; -float2 g_colorRange; - -SamplerState RGBSampler : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; - Filter = MIN_MAG_MIP_POINT; -}; +texture g_Texture; +texture g_KernelTexture; +float2 g_StepXY; + +sampler RGBSampler = + sampler_state { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MinFilter = POINT; + MagFilter = POINT; + }; -SamplerState KernelSampler : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; - Filter = MIN_MAG_MIP_LINEAR; -}; +sampler KernelSampler = + sampler_state + { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MinFilter = LINEAR; + MagFilter = LINEAR; + }; -struct VS_INPUT +struct VS_OUTPUT { float4 Position : POSITION; float2 TextureUV : TEXCOORD0; }; -struct VS_OUTPUT +struct PS_OUTPUT { - float2 TextureUV : TEXCOORD0; - float4 Position : SV_POSITION; + float4 RGBColor : COLOR0; }; -// -// VS for rendering in screen space -// -VS_OUTPUT VS(VS_INPUT In) -{ - VS_OUTPUT output = (VS_OUTPUT)0; - output.Position.x = (In.Position.x / (g_viewPort.x / 2.0)) - 1; - output.Position.y = -(In.Position.y / (g_viewPort.y / 2.0)) + 1; - output.Position.z = output.Position.z; - output.Position.w = 1.0; - output.TextureUV = In.TextureUV; - - return output; -} - -inline half4 weight(float pos) +half4 weight(float pos) { + half4 w; #ifdef HAS_RGBA - half4 w = g_KernelTexture.Sample(KernelSampler, pos); + w = tex1D(KernelSampler, pos); #else - half4 w = g_KernelTexture.Sample(KernelSampler, pos).bgra; + w = tex1D(KernelSampler, pos).bgra; #endif -#ifndef HAS_FLOAT_TEXTURE - w = w * 2.0 - 1.0; -#endif +#ifdef HAS_FLOAT_TEXTURE return w; +#else + return w * 2.0 - 1.0; +#endif } -inline half3 pixel(float xpos, float ypos) +half3 pixel(float xpos, float ypos) { - return g_Texture.Sample(RGBSampler, float2(xpos, ypos)).rgb; + return tex2D(RGBSampler, float2(xpos, ypos)).rgb; } -inline half3 getLine(float ypos, float4 xpos, half4 linetaps) +half3 getLine(float ypos, float4 xpos, half4 linetaps) { return pixel(xpos.r, ypos) * linetaps.r + @@ -93,33 +82,42 @@ pixel(xpos.a, ypos) * linetaps.a; } -float4 CONVOLUTION4x4(float2 TextureUV : TEXCOORD0) : SV_TARGET +PS_OUTPUT CONVOLUTION4x4(VS_OUTPUT In) { - float2 f = frac(TextureUV / g_StepXY + float2(0.5, 0.5)); + PS_OUTPUT OUT; + + float2 pos = In.TextureUV + g_StepXY * 0.5; + float2 f = frac(pos / g_StepXY); - half4 linetaps = weight(1.0 - f.x); + half4 linetaps = weight(1.0 - f.x); half4 columntaps = weight(1.0 - f.y); // kernel generation code made sure taps add up to 1, no need to adjust here. - float2 xystart = (-1.0 - f) * g_StepXY + TextureUV; - float4 xpos = xystart.x + g_StepXY.x * float4(0.0, 1.0, 2.0, 3.0); - float4 ypos = xystart.y + g_StepXY.y * float4(0.0, 1.0, 2.0, 3.0); - - float3 rgb = - getLine(ypos.x, xpos, linetaps) * columntaps.r + - getLine(ypos.y, xpos, linetaps) * columntaps.g + - getLine(ypos.z, xpos, linetaps) * columntaps.b + - getLine(ypos.w, xpos, linetaps) * columntaps.a; + float2 xystart = (-1.0 - f) * g_StepXY + In.TextureUV; + float4 xpos = float4( + xystart.x, + xystart.x + g_StepXY.x, + xystart.x + g_StepXY.x * 2.0, + xystart.x + g_StepXY.x * 3.0); + + OUT.RGBColor.rgb = + getLine(xystart.y , xpos, linetaps) * columntaps.r + + getLine(xystart.y + g_StepXY.y , xpos, linetaps) * columntaps.g + + getLine(xystart.y + g_StepXY.y * 2.0, xpos, linetaps) * columntaps.b + + getLine(xystart.y + g_StepXY.y * 3.0, xpos, linetaps) * columntaps.a; - return float4(g_colorRange.x + g_colorRange.y * saturate(rgb), 1.0); + OUT.RGBColor.a = 1.0; + return OUT; } -technique11 SCALER_T +technique SCALER_T { pass P0 { - SetVertexShader( CompileShader( vs_4_0_level_9_1, VS() ) ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, CONVOLUTION4x4() ) ); + PixelShader = compile ps_3_0 CONVOLUTION4x4(); + ZEnable = False; + FillMode = Solid; + FogEnable = False; } }; diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/convolution-6x6_d3d.fx kodi-15.2~git20151019.1039-final/system/shaders/convolution-6x6_d3d.fx --- kodi-16.1~git20160425.1001-final/system/shaders/convolution-6x6_d3d.fx 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/convolution-6x6_d3d.fx 2015-10-19 08:39:15.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2015 Team XBMC + * Copyright (C) 2005-2010-2013 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -18,73 +18,62 @@ * */ -texture2D g_Texture; -texture2D g_KernelTexture; -float2 g_StepXY; -float2 g_viewPort; -float2 g_colorRange; - -SamplerState RGBSampler : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; - Filter = MIN_MAG_MIP_POINT; -}; +texture g_Texture; +texture g_KernelTexture; +float2 g_StepXY; + +sampler RGBSampler = + sampler_state { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MinFilter = POINT; + MagFilter = POINT; + }; -SamplerState KernelSampler : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; - Filter = MIN_MAG_MIP_LINEAR; -}; +sampler KernelSampler = + sampler_state + { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MinFilter = LINEAR; + MagFilter = LINEAR; + }; -struct VS_INPUT +struct VS_OUTPUT { float4 Position : POSITION; float2 TextureUV : TEXCOORD0; }; -struct VS_OUTPUT +struct PS_OUTPUT { - float2 TextureUV : TEXCOORD0; - float4 Position : SV_POSITION; + float4 RGBColor : COLOR0; }; -// -// VS for rendering in screen space -// -VS_OUTPUT VS(VS_INPUT In) -{ - VS_OUTPUT output = (VS_OUTPUT)0; - output.Position.x = (In.Position.x / (g_viewPort.x / 2.0)) - 1; - output.Position.y = -(In.Position.y / (g_viewPort.y / 2.0)) + 1; - output.Position.z = output.Position.z; - output.Position.w = 1.0; - output.TextureUV = In.TextureUV; - - return output; -} - half3 weight(float pos) { + half3 w; #ifdef HAS_RGBA - half3 w = g_KernelTexture.Sample(KernelSampler, pos).rgb; + w = tex1D(KernelSampler, pos).rgb; #else - half3 w = g_KernelTexture.Sample(KernelSampler, pos).bgr; + w = tex1D(KernelSampler, pos).bgr; #endif -#ifndef HAS_FLOAT_TEXTURE - w = w * 2.0 - 1.0; -#endif +#ifdef HAS_FLOAT_TEXTURE return w; +#else + return w * 2.0 - 1.0; +#endif } -inline half3 pixel(float xpos, float ypos) +half3 pixel(float xpos, float ypos) { - return g_Texture.Sample(RGBSampler, float2(xpos, ypos)).rgb; + return tex2D(RGBSampler, float2(xpos, ypos)).rgb; } -inline half3 getLine(float ypos, float3 xpos1, float3 xpos2, half3 linetaps1, half3 linetaps2) +half3 getLine(float ypos, float3 xpos1, float3 xpos2, half3 linetaps1, half3 linetaps2) { return pixel(xpos1.r, ypos) * linetaps1.r + @@ -95,9 +84,12 @@ pixel(xpos2.b, ypos) * linetaps2.b; } -float4 CONVOLUTION6x6(in float2 TextureUV : TEXCOORD0) : SV_TARGET +PS_OUTPUT CONVOLUTION6x6(VS_OUTPUT In) { - float2 f = frac(TextureUV / g_StepXY + 0.5); + PS_OUTPUT OUT; + + float2 pos = In.TextureUV + g_StepXY * 0.5; + float2 f = frac(pos / g_StepXY); half3 linetaps1 = weight((1.0 - f.x) / 2.0); half3 linetaps2 = weight((1.0 - f.x) / 2.0 + 0.5); @@ -106,28 +98,34 @@ // kernel generation code made sure taps add up to 1, no need to adjust here. - float2 xystart = (-2.0 - f) * g_StepXY + TextureUV; - float3 xpos1 = xystart.x + g_StepXY.x * float3(0.0, 1.0, 2.0); - float3 xpos2 = xystart.x + g_StepXY.x * float3(3.0, 4.0, 5.0); - float3 ypos1 = xystart.y + g_StepXY.y * float3(0.0, 1.0, 2.0); - float3 ypos2 = xystart.y + g_StepXY.y * float3(3.0, 4.0, 5.0); - - float3 rgb = - getLine(ypos1.x, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.r + - getLine(ypos1.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.r + - getLine(ypos1.z, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.g + - getLine(ypos2.x, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.g + - getLine(ypos2.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.b + - getLine(ypos2.z, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.b; + float2 xystart = (-2.0 - f) * g_StepXY + In.TextureUV; + float3 xpos1 = float3( + xystart.x, + xystart.x + g_StepXY.x, + xystart.x + g_StepXY.x * 2.0); + float3 xpos2 = half3( + xystart.x + g_StepXY.x * 3.0, + xystart.x + g_StepXY.x * 4.0, + xystart.x + g_StepXY.x * 5.0); + + OUT.RGBColor.rgb = getLine(xystart.y , xpos1, xpos2, linetaps1, linetaps2) * columntaps1.r + + getLine(xystart.y + g_StepXY.y , xpos1, xpos2, linetaps1, linetaps2) * columntaps2.r + + getLine(xystart.y + g_StepXY.y * 2.0, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.g + + getLine(xystart.y + g_StepXY.y * 3.0, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.g + + getLine(xystart.y + g_StepXY.y * 4.0, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.b + + getLine(xystart.y + g_StepXY.y * 5.0, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.b; - return float4(g_colorRange.x + g_colorRange.y * saturate(rgb), 1.0); + OUT.RGBColor.a = 1.0; + return OUT; } -technique11 SCALER_T +technique SCALER_T { pass P0 { - SetVertexShader( CompileShader( vs_4_0_level_9_1, VS() ) ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, CONVOLUTION6x6() ) ); + PixelShader = compile ps_3_0 CONVOLUTION6x6(); + ZEnable = False; + FillMode = Solid; + FogEnable = False; } }; diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/convolutionsep-4x4_d3d.fx kodi-15.2~git20151019.1039-final/system/shaders/convolutionsep-4x4_d3d.fx --- kodi-16.1~git20160425.1001-final/system/shaders/convolutionsep-4x4_d3d.fx 2016-01-11 16:50:50.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/convolutionsep-4x4_d3d.fx 2015-10-19 08:39:15.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2015 Team XBMC + * Copyright (C) 2005-2013 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -18,129 +18,166 @@ * */ -texture2D g_Texture; -texture2D g_KernelTexture; -float4 g_StepXY; -float2 g_viewPort; -float2 g_colorRange; - -SamplerState RGBSampler : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; - Filter = MIN_MAG_POINT_MIP_LINEAR; -}; +texture g_Texture; +texture g_KernelTexture; +texture g_IntermediateTexture; +float2 g_StepXY_P0; +float2 g_StepXY_P1; + +sampler RGBSampler = + sampler_state { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MipFilter = LINEAR; + MinFilter = POINT; + MagFilter = POINT; + }; -SamplerState KernelSampler : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; - Filter = MIN_MAG_MIP_LINEAR; -}; +sampler KernelSampler = + sampler_state + { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MipFilter = LINEAR; + MinFilter = LINEAR; + MagFilter = LINEAR; + }; + +sampler IntermediateSampler = + sampler_state { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MipFilter = LINEAR; + MinFilter = POINT; + MagFilter = POINT; + }; -struct VS_INPUT +struct VS_OUTPUT { float4 Position : POSITION; float2 TextureUV : TEXCOORD0; }; -struct VS_OUTPUT +struct PS_OUTPUT { - float2 TextureUV : TEXCOORD0; - float4 Position : SV_POSITION; + float4 RGBColor : COLOR0; }; -// -// VS for rendering in screen space -// -VS_OUTPUT VS(VS_INPUT In) -{ - VS_OUTPUT output = (VS_OUTPUT)0; - output.Position.x = (In.Position.x / (g_viewPort.x / 2.0)) - 1; - output.Position.y = -(In.Position.y / (g_viewPort.y / 2.0)) + 1; - output.Position.z = output.Position.z; - output.Position.w = 1.0; - output.TextureUV = In.TextureUV; - - return output; -} - -inline half4 weight(float pos) +half4 weight(float pos) { + half4 w; #ifdef HAS_RGBA - half4 w = g_KernelTexture.Sample(KernelSampler, pos); + w = tex1D(KernelSampler, pos); #else - half4 w = g_KernelTexture.Sample(KernelSampler, pos).bgra; + w = tex1D(KernelSampler, pos).bgra; #endif -#ifndef HAS_FLOAT_TEXTURE - w = w * 2.0 - 1.0; -#endif +#ifdef HAS_FLOAT_TEXTURE return w; +#else + return w * 2.0 - 1.0; +#endif } -inline half3 pixel(float xpos, float ypos) +half3 pixel(sampler samp, float xpos, float ypos) { - return g_Texture.Sample(RGBSampler, float2(xpos, ypos)).rgb; + return tex2D(samp, float2(xpos, ypos)).rgb; } // Code for first pass - horizontal -inline half3 getLine(float ypos, float4 xpos, half4 linetaps) +half3 getLine(float ypos, float4 xpos, half4 linetaps) { return - pixel(xpos.r, ypos) * linetaps.r + - pixel(xpos.g, ypos) * linetaps.g + - pixel(xpos.b, ypos) * linetaps.b + - pixel(xpos.a, ypos) * linetaps.a; + pixel(RGBSampler, xpos.r, ypos) * linetaps.r + + pixel(RGBSampler, xpos.g, ypos) * linetaps.g + + pixel(RGBSampler, xpos.b, ypos) * linetaps.b + + pixel(RGBSampler, xpos.a, ypos) * linetaps.a; } -float4 CONVOLUTION4x4Horiz(in float2 TextureUV : TEXCOORD0) : SV_TARGET +PS_OUTPUT CONVOLUTION4x4Horiz(VS_OUTPUT In) { - float2 f = frac(TextureUV / g_StepXY.xy + 0.5); + PS_OUTPUT OUT; + + float2 pos = In.TextureUV + g_StepXY_P0 * 0.5; + float2 f = frac(pos / g_StepXY_P0); + half4 linetaps = weight(1.0 - f.x); // kernel generation code made sure taps add up to 1, no need to adjust here. - float xystart = (-1.0 - f.x) * g_StepXY.x + TextureUV.x; - float4 xpos = xystart + g_StepXY.x * float4(0.0, 1.0, 2.0, 3.0); - return float4(getLine(TextureUV.y, xpos, linetaps), 1.0f); + float2 xystart; + xystart.x = (-1.0 - f.x) * g_StepXY_P0.x + In.TextureUV.x; + xystart.y = In.TextureUV.y; + + float4 xpos = float4( + xystart.x, + xystart.x + g_StepXY_P0.x, + xystart.x + g_StepXY_P0.x * 2.0, + xystart.x + g_StepXY_P0.x * 3.0); + + OUT.RGBColor.rgb = getLine(xystart.y, xpos, linetaps); + OUT.RGBColor.a = 1.0; + + return OUT; } // Code for second pass - vertical -inline half3 getRow(float xpos, float4 ypos, half4 columntaps) +half3 getRow(float xpos, float4 ypos, half4 columntaps) { return - pixel(xpos, ypos.r) * columntaps.r + - pixel(xpos, ypos.g) * columntaps.g + - pixel(xpos, ypos.b) * columntaps.b + - pixel(xpos, ypos.a) * columntaps.a; + pixel(IntermediateSampler, xpos, ypos.r) * columntaps.r + + pixel(IntermediateSampler, xpos, ypos.g) * columntaps.g + + pixel(IntermediateSampler, xpos, ypos.b) * columntaps.b + + pixel(IntermediateSampler, xpos, ypos.a) * columntaps.a; } -float4 CONVOLUTION4x4Vert(in float2 TextureUV : TEXCOORD0) : SV_TARGET +PS_OUTPUT CONVOLUTION4x4Vert(VS_OUTPUT In) { - float2 f = frac(TextureUV / g_StepXY.zw + 0.5); + PS_OUTPUT OUT; + + float2 pos = In.TextureUV + g_StepXY_P1 * 0.5; + float2 f = frac(pos / g_StepXY_P1); + half4 columntaps = weight(1.0 - f.y); // kernel generation code made sure taps add up to 1, no need to adjust here. - float xystart = (-1.0 - f.y) * g_StepXY.w + TextureUV.y; - float4 ypos = xystart + g_StepXY.w * float4(0.0, 1.0, 2.0, 3.0); - return float4(g_colorRange.x + g_colorRange.y * saturate(getRow(TextureUV.x, ypos, columntaps)), 1.0); + float2 xystart; + xystart.x = In.TextureUV.x; + xystart.y = (-1.0 - f.y) * g_StepXY_P1.y + In.TextureUV.y; + + float4 ypos = float4( + xystart.y, + xystart.y + g_StepXY_P1.y, + xystart.y + g_StepXY_P1.y * 2.0, + xystart.y + g_StepXY_P1.y * 3.0); + + OUT.RGBColor.rgb = getRow(xystart.x, ypos, columntaps); + OUT.RGBColor.a = 1.0; + + return OUT; } -technique11 SCALER_T +technique SCALER_T { pass P0 { - SetVertexShader( CompileShader( vs_4_0_level_9_1, VS() ) ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, CONVOLUTION4x4Horiz() ) ); + PixelShader = compile ps_3_0 CONVOLUTION4x4Horiz(); + ZEnable = False; + FillMode = Solid; + FogEnable = False; } pass P1 { - SetVertexShader( CompileShader( vs_4_0_level_9_1, VS() ) ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, CONVOLUTION4x4Vert() ) ); + PixelShader = compile ps_3_0 CONVOLUTION4x4Vert(); + ZEnable = False; + FillMode = Solid; + FogEnable = False; } }; diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/convolutionsep-6x6_d3d.fx kodi-15.2~git20151019.1039-final/system/shaders/convolutionsep-6x6_d3d.fx --- kodi-16.1~git20160425.1001-final/system/shaders/convolutionsep-6x6_d3d.fx 2016-01-11 16:50:50.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/convolutionsep-6x6_d3d.fx 2015-10-19 08:39:15.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2015 Team XBMC + * Copyright (C) 2005-2013 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -18,99 +18,117 @@ * */ -texture2D g_Texture; -texture2D g_KernelTexture; -float4 g_StepXY; -float2 g_viewPort; -float2 g_colorRange; - -SamplerState RGBSampler : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; - Filter = MIN_MAG_POINT_MIP_LINEAR; -}; +texture g_Texture; +texture g_KernelTexture; +texture g_IntermediateTexture; +float2 g_StepXY_P0; +float2 g_StepXY_P1; + +sampler RGBSampler = + sampler_state { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MipFilter = LINEAR; + MinFilter = POINT; + MagFilter = POINT; + }; -SamplerState KernelSampler : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; - Filter = MIN_MAG_MIP_LINEAR; -}; +sampler KernelSampler = + sampler_state + { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MipFilter = LINEAR; + MinFilter = LINEAR; + MagFilter = LINEAR; + }; + +sampler IntermediateSampler = + sampler_state { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MipFilter = LINEAR; + MinFilter = POINT; + MagFilter = POINT; + }; -struct VS_INPUT +struct VS_OUTPUT { float4 Position : POSITION; float2 TextureUV : TEXCOORD0; }; -struct VS_OUTPUT +struct PS_OUTPUT { - float2 TextureUV : TEXCOORD0; - float4 Position : SV_POSITION; + float4 RGBColor : COLOR0; }; -// -// VS for rendering in screen space -// -VS_OUTPUT VS(VS_INPUT In) -{ - VS_OUTPUT output = (VS_OUTPUT)0; - output.Position.x = (In.Position.x / (g_viewPort.x / 2.0)) - 1; - output.Position.y = -(In.Position.y / (g_viewPort.y / 2.0)) + 1; - output.Position.z = output.Position.z; - output.Position.w = 1.0; - output.TextureUV = In.TextureUV; - - return output; -} - -inline half3 weight(float pos) +half3 weight(float pos) { + half3 w; #ifdef HAS_RGBA - half3 w = g_KernelTexture.Sample(KernelSampler, pos).rgb; + w = tex1D(KernelSampler, pos).rgb; #else - half3 w = g_KernelTexture.Sample(KernelSampler, pos).bgr; + w = tex1D(KernelSampler, pos).bgr; #endif -#ifndef HAS_FLOAT_TEXTURE - w = w * 2.0 - 1.0; -#endif +#ifdef HAS_FLOAT_TEXTURE return w; +#else + return w * 2.0 - 1.0; +#endif } -inline half3 pixel(float xpos, float ypos) +half3 pixel(sampler samp, float xpos, float ypos) { - return g_Texture.Sample(RGBSampler, float2(xpos, ypos)).rgb; + return tex2D(samp, float2(xpos, ypos)).rgb; } +// Code for first pass - horizontal + half3 getLine(float ypos, float3 xpos1, float3 xpos2, half3 linetaps1, half3 linetaps2) { return - pixel(xpos1.r, ypos) * linetaps1.r + - pixel(xpos1.g, ypos) * linetaps2.r + - pixel(xpos1.b, ypos) * linetaps1.g + - pixel(xpos2.r, ypos) * linetaps2.g + - pixel(xpos2.g, ypos) * linetaps1.b + - pixel(xpos2.b, ypos) * linetaps2.b; + pixel(RGBSampler, xpos1.r, ypos) * linetaps1.r + + pixel(RGBSampler, xpos1.g, ypos) * linetaps2.r + + pixel(RGBSampler, xpos1.b, ypos) * linetaps1.g + + pixel(RGBSampler, xpos2.r, ypos) * linetaps2.g + + pixel(RGBSampler, xpos2.g, ypos) * linetaps1.b + + pixel(RGBSampler, xpos2.b, ypos) * linetaps2.b; } -// Code for first pass - horizontal -float4 CONVOLUTION6x6Horiz(in float2 TextureUV : TEXCOORD0) : SV_TARGET +PS_OUTPUT CONVOLUTION6x6Horiz(VS_OUTPUT In) { - float2 f = frac(TextureUV / g_StepXY.xy + 0.5); + PS_OUTPUT OUT; + + float2 pos = In.TextureUV + g_StepXY_P0 * 0.5; + float2 f = frac(pos / g_StepXY_P0); half3 linetaps1 = weight((1.0 - f.x) / 2.0); half3 linetaps2 = weight((1.0 - f.x) / 2.0 + 0.5); // kernel generation code made sure taps add up to 1, no need to adjust here. - float xstart = (-2.0 - f.x) * g_StepXY.x + TextureUV.x; + float2 xystart; + xystart.x = (-2.0 - f.x) * g_StepXY_P0.x + In.TextureUV.x; + xystart.y = In.TextureUV.y; + + float3 xpos1 = float3( + xystart.x, + xystart.x + g_StepXY_P0.x, + xystart.x + g_StepXY_P0.x * 2.0); + float3 xpos2 = half3( + xystart.x + g_StepXY_P0.x * 3.0, + xystart.x + g_StepXY_P0.x * 4.0, + xystart.x + g_StepXY_P0.x * 5.0); - float3 xpos1 = xstart + g_StepXY.x * float3(0.0, 1.0, 2.0); - float3 xpos2 = xstart + g_StepXY.x * float3(3.0, 4.0, 5.0); + OUT.RGBColor.rgb = getLine(xystart.y, xpos1, xpos2, linetaps1, linetaps2); + OUT.RGBColor.a = 1.0; - return float4(getLine(TextureUV.y, xpos1, xpos2, linetaps1, linetaps2), 1.0); + return OUT; } // Code for second pass - vertical @@ -118,41 +136,59 @@ half3 getRow(float xpos, float3 ypos1, float3 ypos2, half3 columntaps1, half3 columntaps2) { return - pixel(xpos, ypos1.r) * columntaps1.r + - pixel(xpos, ypos1.g) * columntaps2.r + - pixel(xpos, ypos1.b) * columntaps1.g + - pixel(xpos, ypos2.r) * columntaps2.g + - pixel(xpos, ypos2.g) * columntaps1.b + - pixel(xpos, ypos2.b) * columntaps2.b; + pixel(IntermediateSampler, xpos, ypos1.r) * columntaps1.r + + pixel(IntermediateSampler, xpos, ypos1.g) * columntaps2.r + + pixel(IntermediateSampler, xpos, ypos1.b) * columntaps1.g + + pixel(IntermediateSampler, xpos, ypos2.r) * columntaps2.g + + pixel(IntermediateSampler, xpos, ypos2.g) * columntaps1.b + + pixel(IntermediateSampler, xpos, ypos2.b) * columntaps2.b; } -float4 CONVOLUTION6x6Vert(in float2 TextureUV : TEXCOORD0) : SV_TARGET +PS_OUTPUT CONVOLUTION6x6Vert(VS_OUTPUT In) { - float2 f = frac(TextureUV / g_StepXY.zw + 0.5); + PS_OUTPUT OUT; + + float2 pos = In.TextureUV + g_StepXY_P1 * 0.5; + float2 f = frac(pos / g_StepXY_P1); half3 columntaps1 = weight((1.0 - f.y) / 2.0); half3 columntaps2 = weight((1.0 - f.y) / 2.0 + 0.5); // kernel generation code made sure taps add up to 1, no need to adjust here. - float ystart = (-2.0 - f.y) * g_StepXY.w + TextureUV.y; + float2 xystart; + xystart.x = In.TextureUV.x; + xystart.y = (-2.0 - f.y) * g_StepXY_P1.y + In.TextureUV.y; + + float3 ypos1 = float3( + xystart.y, + xystart.y + g_StepXY_P1.y, + xystart.y + g_StepXY_P1.y * 2.0); + float3 ypos2 = half3( + xystart.y + g_StepXY_P1.y * 3.0, + xystart.y + g_StepXY_P1.y * 4.0, + xystart.y + g_StepXY_P1.y * 5.0); - float3 ypos1 = ystart + g_StepXY.w * float3(0.0, 1.0, 2.0); - float3 ypos2 = ystart + g_StepXY.w * float3(3.0, 4.0, 5.0); + OUT.RGBColor.rgb = getRow(xystart.x, ypos1, ypos2, columntaps1, columntaps2); + OUT.RGBColor.a = 1.0; - return float4(g_colorRange.x + g_colorRange.y * saturate(getRow(TextureUV.x, ypos1, ypos2, columntaps1, columntaps2)), 1.0); + return OUT; } -technique11 SCALER_T +technique SCALER_T { pass P0 { - SetVertexShader( CompileShader( vs_4_0_level_9_1, VS() ) ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, CONVOLUTION6x6Horiz() ) ); + PixelShader = compile ps_3_0 CONVOLUTION6x6Horiz(); + ZEnable = False; + FillMode = Solid; + FogEnable = False; } pass P1 { - SetVertexShader( CompileShader( vs_4_0_level_9_1, VS() ) ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, CONVOLUTION6x6Vert() ) ); + PixelShader = compile ps_3_0 CONVOLUTION6x6Vert(); + ZEnable = False; + FillMode = Solid; + FogEnable = False; } }; diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_checkerboard_left.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_checkerboard_left.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_checkerboard_left.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_checkerboard_left.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#define STEREO_MODE_SHADER - -Texture2D texView : register(t0); - -cbuffer cbViewPort : register(b1) -{ - float g_viewPortX; - float g_viewPortY; - float g_viewPortWidth; - float g_viewPortHeigh; -}; - -#include "guishader_common.hlsl" - -float4 PS(PS_INPUT input) : SV_TARGET -{ - return StereoCheckerboard(input, STEREO_LEFT_EYE_INDEX); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_checkerboard_right.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_checkerboard_right.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_checkerboard_right.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_checkerboard_right.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#define STEREO_MODE_SHADER - -Texture2D texView : register(t0); - -cbuffer cbViewPort : register(b1) -{ - float g_viewPortX; - float g_viewPortY; - float g_viewPortWidth; - float g_viewPortHeigh; -}; - -#include "guishader_common.hlsl" - -float4 PS(PS_INPUT input) : SV_TARGET -{ - return StereoCheckerboard(input, STEREO_RIGHT_EYE_INDEX); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_common.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_common.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_common.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_common.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -struct VS_INPUT -{ - float4 pos : POSITION; - float4 color: COLOR0; - float2 tex : TEXCOORD0; - float2 tex2 : TEXCOORD1; -}; - -struct PS_INPUT -{ - float4 pos : SV_POSITION; - float4 color: COLOR0; - float2 tex : TEXCOORD0; - float2 tex2 : TEXCOORD1; -}; - -SamplerState LinearSampler : register(s0) -{ - Filter = MIN_MAG_MIP_LINEAR; - AddressU = CLAMP; - AddressV = CLAMP; - Comparison = NEVER; -}; - -cbuffer cbWorld : register(b0) -{ - float4x4 worldViewProj; - float blackLevel; - float colorRange; -}; - -inline float4 adjustColorRange(float4 color) -{ - return float4(blackLevel + colorRange * color.rgb, color.a); -} - -#define STEREO_LEFT_EYE_INDEX 0 -#define STEREO_RIGHT_EYE_INDEX 1 - -#ifdef STEREO_MODE_SHADER - -inline float4 StereoInterlaced(PS_INPUT input, int eye) -{ - uint pixelY = abs(trunc(input.tex.y * g_viewPortHeigh)); - uint odd = pixelY % 2; - - if ((odd == 0 && !eye) || (odd != 0 && eye)) - return float4(texView.Sample(LinearSampler, input.tex).rgb, 1.0); - else - return float4(0.0, 0.0, 0.0, 0.0); -} - -inline float4 StereoCheckerboard(PS_INPUT input, int eye) -{ - uint pixelX = abs(trunc(input.tex.x * g_viewPortWidth)); - uint pixelY = abs(trunc(input.tex.y * g_viewPortHeigh)); - uint odd = (pixelX + pixelY) % 2; - - if ((odd == 0 && !eye) || (odd != 0 && eye)) - return float4(texView.Sample(LinearSampler, input.tex).rgb, 1.0); - else - return float4(0.0, 0.0, 0.0, 0.0); -} - -#endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_default.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_default.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_default.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_default.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "guishader_common.hlsl" - -float4 PS(PS_INPUT input) : SV_TARGET -{ - return adjustColorRange(input.color); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_fonts.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_fonts.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_fonts.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_fonts.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "guishader_common.hlsl" - -Texture2D texFont : register(t0); - -float4 PS(PS_INPUT input) : SV_TARGET -{ - input.color.a *= texFont.Sample(LinearSampler, input.tex).r; - return adjustColorRange(input.color); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_interlaced_left.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_interlaced_left.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_interlaced_left.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_interlaced_left.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#define STEREO_MODE_SHADER - -Texture2D texView : register(t0); - -cbuffer cbViewPort : register(b1) -{ - float g_viewPortX; - float g_viewPortY; - float g_viewPortWidth; - float g_viewPortHeigh; -}; - -#include "guishader_common.hlsl" - -float4 PS(PS_INPUT input) : SV_TARGET -{ - return StereoInterlaced(input, STEREO_LEFT_EYE_INDEX); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_interlaced_right.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_interlaced_right.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_interlaced_right.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_interlaced_right.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#define STEREO_MODE_SHADER - -Texture2D texView : register(t0); - -cbuffer cbViewPort : register(b1) -{ - float g_viewPortX; - float g_viewPortY; - float g_viewPortWidth; - float g_viewPortHeigh; -}; - -#include "guishader_common.hlsl" - -float4 PS(PS_INPUT input) : SV_TARGET -{ - return StereoInterlaced(input, STEREO_RIGHT_EYE_INDEX); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_multi_texture_blend.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_multi_texture_blend.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_multi_texture_blend.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_multi_texture_blend.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "guishader_common.hlsl" - -Texture2D txDiffuse[2] : register(t0); - -float4 PS(PS_INPUT input) : SV_TARGET -{ - return adjustColorRange(input.color * txDiffuse[0].Sample(LinearSampler, input.tex) - * txDiffuse[1].Sample(LinearSampler, input.tex2)); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_texture.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_texture.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_texture.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_texture.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "guishader_common.hlsl" - -Texture2D texMain : register(t0); - -float4 PS(PS_INPUT input) : SV_TARGET -{ - return adjustColorRange(input.color * texMain.Sample(LinearSampler, input.tex)); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_texture_noblend.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_texture_noblend.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_texture_noblend.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_texture_noblend.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "guishader_common.hlsl" - -Texture2D texMain : register(t0); - -float4 PS(PS_INPUT input) : SV_TARGET -{ - return texMain.Sample(LinearSampler, input.tex); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_vert.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_vert.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_vert.hlsl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_vert.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "guishader_common.hlsl" - -PS_INPUT VS(VS_INPUT input) -{ - PS_INPUT output = (PS_INPUT)0; - output.pos = mul(input.pos, worldViewProj); - output.color = input.color; - output.tex = input.tex; - output.tex2 = input.tex2; - - return output; -} diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_video_control.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_video_control.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_video_control.hlsl 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_video_control.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "guishader_common.hlsl" - -Texture2D texVideo : register(t0); - -SamplerState DynamicSampler : register(s1) -{ - Filter = MIN_MAG_MIP_POINT; // default - AddressU = CLAMP; - AddressV = CLAMP; - Comparison = NEVER; -}; - -float4 PS(PS_INPUT input) : SV_TARGET -{ - float4 current = texVideo.Sample(DynamicSampler, input.tex); - - float4 diffuse = float4(input.color.rrr, 1.0f); - float4 specular = float4(input.color.ggg, 1.0f); - current *= diffuse * 2.0; - current.a = input.color.a; - current.rgb += specular.rgb - 0.5; - - return adjustColorRange(current); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/guishader_video.hlsl kodi-15.2~git20151019.1039-final/system/shaders/guishader_video.hlsl --- kodi-16.1~git20160425.1001-final/system/shaders/guishader_video.hlsl 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/guishader_video.hlsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "guishader_common.hlsl" - -Texture2D texVideo : register(t0); - -SamplerState DynamicSampler : register(s1) -{ - Filter = MIN_MAG_MIP_POINT; // default - AddressU = CLAMP; - AddressV = CLAMP; - Comparison = NEVER; -}; - -float4 PS(PS_INPUT input) : SV_TARGET -{ - return adjustColorRange(texVideo.Sample(DynamicSampler, input.tex)); -} - - diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/testshader.fx kodi-15.2~git20151019.1039-final/system/shaders/testshader.fx --- kodi-16.1~git20160425.1001-final/system/shaders/testshader.fx 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/testshader.fx 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +float4 TEST() : COLOR +{ + return float4(0.0, 0.0, 0.0, 0.0); +} + +technique TEST_T +{ + pass P0 + { + PixelShader = compile ps_2_0 TEST(); + } +}; diff -Nru kodi-16.1~git20160425.1001-final/system/shaders/yuv2rgb_d3d.fx kodi-15.2~git20151019.1039-final/system/shaders/yuv2rgb_d3d.fx --- kodi-16.1~git20160425.1001-final/system/shaders/yuv2rgb_d3d.fx 2016-04-24 12:10:26.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/system/shaders/yuv2rgb_d3d.fx 2015-10-19 08:39:15.000000000 +0000 @@ -18,81 +18,64 @@ * */ -texture2D g_Texture[3]; -float4x4 g_ColorMatrix; -float2 g_StepXY; -float2 g_viewPort; +texture g_YTexture; +texture g_UTexture; +texture g_VTexture; +float4x4 g_ColorMatrix; +float2 g_StepXY; + +sampler YSampler = + sampler_state { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MinFilter = LINEAR; + MagFilter = LINEAR; + }; + +sampler USampler = + sampler_state { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MinFilter = LINEAR; + MagFilter = LINEAR; + }; +sampler VSampler = + sampler_state + { + Texture = ; + AddressU = CLAMP; + AddressV = CLAMP; + MinFilter = LINEAR; + MagFilter = LINEAR; + }; -SamplerState YUVSampler : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; - Filter = MIN_MAG_MIP_LINEAR; -}; -#ifdef NV12_SNORM_UV -SamplerState UVSamplerSNORM : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; - Filter = MIN_MAG_MIP_POINT; -}; -#endif - -struct VS_INPUT +struct VS_OUTPUT { float4 Position : POSITION; float2 TextureY : TEXCOORD0; - float2 TextureUV : TEXCOORD1; + float2 TextureU : TEXCOORD1; + float2 TextureV : TEXCOORD2; }; -struct VS_OUTPUT +struct PS_OUTPUT { - float2 TextureY : TEXCOORD0; - float2 TextureUV : TEXCOORD1; - float4 Position : SV_POSITION; + float4 RGBColor : COLOR0; }; -VS_OUTPUT VS(VS_INPUT In) +PS_OUTPUT YUV2RGB( VS_OUTPUT In) { - VS_OUTPUT output = (VS_OUTPUT)0; - output.Position.x = (In.Position.x / (g_viewPort.x / 2.0)) - 1; - output.Position.y = -(In.Position.y / (g_viewPort.y / 2.0)) + 1; - output.Position.z = output.Position.z; - output.Position.w = 1.0; - output.TextureY = In.TextureY; - output.TextureUV = In.TextureUV; - - return output; -} - -#ifdef NV12_SNORM_UV -inline float unormU(float c) -{ - c *= 0.5; - if (c < 0.0) c += 1.0; - return saturate(c); -} -inline float2 unormUV(float2 rg) -{ - return float2(unormU(rg.x), unormU(rg.y)); -} -#endif - -float4 YUV2RGB(VS_OUTPUT In) : SV_TARGET -{ -#if defined(XBMC_YV12) //|| defined(XBMC_NV12) - float4 YUV = float4(g_Texture[0].Sample(YUVSampler, In.TextureY ).r - , g_Texture[1].Sample(YUVSampler, In.TextureUV).r - , g_Texture[2].Sample(YUVSampler, In.TextureUV).r + PS_OUTPUT OUT; +#if defined(XBMC_YV12) + float4 YUV = float4(tex2D (YSampler, In.TextureY).x + , tex2D (USampler, In.TextureU).x + , tex2D (VSampler, In.TextureV).x , 1.0); #elif defined(XBMC_NV12) - float4 YUV = float4(g_Texture[0].Sample(YUVSampler, In.TextureY).r - #if defined(NV12_SNORM_UV) - , unormUV(g_Texture[1].Sample(UVSamplerSNORM, In.TextureUV).rg) - #else - , g_Texture[1].Sample(YUVSampler, In.TextureUV).rg - #endif + float4 YUV = float4(tex2D (YSampler, In.TextureY).x + , tex2D (USampler, In.TextureU).ra , 1.0); #elif defined(XBMC_YUY2) || defined(XBMC_UYVY) // The HLSL compiler is smart enough to optimize away these redundant assignments. @@ -104,8 +87,8 @@ //y axis will be correctly interpolated by opengl //x axis will not, so we grab two pixels at the center of two columns and interpolate ourselves - float4 c1 = g_Texture[0].Sample(YUVSampler, float2(pos.x + ((0.5 - f.x) * stepxy.x), pos.y)); - float4 c2 = g_Texture[0].Sample(YUVSampler, float2(pos.x + ((1.5 - f.x) * stepxy.x), pos.y)); + float4 c1 = tex2D(YSampler, float2(pos.x + ((0.5 - f.x) * stepxy.x), pos.y)); + float4 c2 = tex2D(YSampler, float2(pos.x + ((1.5 - f.x) * stepxy.x), pos.y)); /* each pixel has two Y subpixels and one UV subpixel YUV Y YUV @@ -123,14 +106,18 @@ float4 YUV = float4(outY, outUV, 1.0); #endif - return mul(YUV, g_ColorMatrix); + OUT.RGBColor = mul(YUV, g_ColorMatrix); + OUT.RGBColor.a = 1.0; + return OUT; } -technique11 YUV2RGB_T +technique YUV2RGB_T { pass P0 { - SetVertexShader( CompileShader( vs_4_0_level_9_1, VS() ) ); - SetPixelShader( CompileShader( ps_4_0_level_9_1, YUV2RGB() ) ); + PixelShader = compile ps_2_0 YUV2RGB(); + ZEnable = False; + FillMode = Solid; + FogEnable = False; } }; diff -Nru kodi-16.1~git20160425.1001-final/tools/android/packaging/Makefile.in kodi-15.2~git20151019.1039-final/tools/android/packaging/Makefile.in --- kodi-16.1~git20160425.1001-final/tools/android/packaging/Makefile.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/android/packaging/Makefile.in 2015-10-19 08:39:15.000000000 +0000 @@ -5,10 +5,10 @@ libplist.so libshairplay.so \ libxbogg.so libxbvorbis.so libxbvorbisfile.so libxbmpeg2.so \ libxbmpeg2convert.so libnfs.so libass.so \ - libbluray.so libsmbclient.so libgif.so + libbluray.so libsmbclient.so PLATFORM_OBJS = -EXCLUDED_ADDONS = +EXCLUDED_ADDONS = screensaver.rsxs.euphoria visualization.dxspectrum visualization.milkdrop visualization.projectm XBMCROOT = $(shell cd $(CURDIR)/../../..; pwd) COPYDIRS = system addons media @@ -113,7 +113,6 @@ cp -fp media/drawable-xxhdpi/ic_launcher.png xbmc/res/drawable-xxhdpi/ic_launcher.png cp -fp media/drawable-xhdpi/banner.png xbmc/res/drawable-xhdpi/banner.png cp xbmc/strings.xml xbmc/res/values/ - cp xbmc/activity_main.xml xbmc/res/layout/ mkdir -p tmp/res; $(AAPT) c -S xbmc/res -C tmp/res; cp -r -n xbmc/res tmp/ || true $(AAPT) p -f -I $(SDKROOT)/platforms/$(SDK_PLATFORM)/android.jar -S tmp/res/ -M xbmc/AndroidManifest.xml -F images/@APP_NAME_LC@app-debug-skeleton.apk -J xbmc/src @rm -rf tmp/ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/android/packaging/media/drawable-xhdpi/banner.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/android/packaging/media/drawable-xhdpi/banner.png differ diff -Nru kodi-16.1~git20160425.1001-final/tools/android/packaging/xbmc/activity_main.xml.in kodi-15.2~git20151019.1039-final/tools/android/packaging/xbmc/activity_main.xml.in --- kodi-16.1~git20160425.1001-final/tools/android/packaging/xbmc/activity_main.xml.in 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/android/packaging/xbmc/activity_main.xml.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - diff -Nru kodi-16.1~git20160425.1001-final/tools/android/packaging/xbmc/AndroidManifest.xml.in kodi-15.2~git20151019.1039-final/tools/android/packaging/xbmc/AndroidManifest.xml.in --- kodi-16.1~git20160425.1001-final/tools/android/packaging/xbmc/AndroidManifest.xml.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/android/packaging/xbmc/AndroidManifest.xml.in 2015-10-19 08:39:15.000000000 +0000 @@ -11,9 +11,7 @@ - - @@ -82,16 +80,6 @@ android:name="android.app.lib_name" android:value="@APP_NAME_LC@" /> - - - - - - - - - - diff -Nru kodi-16.1~git20160425.1001-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in kodi-15.2~git20151019.1039-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in --- kodi-16.1~git20160425.1001-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in 2015-07-06 19:37:23.000000000 +0000 @@ -1,82 +1,29 @@ package org.xbmc.@APP_NAME_LC@; import android.app.NativeActivity; -import android.content.ComponentName; import android.content.Intent; import android.media.AudioManager; import android.os.Bundle; import android.util.Log; import android.view.View; -import android.view.Surface; -import android.widget.RelativeLayout; -import android.graphics.Color; import android.graphics.PixelFormat; import android.os.Handler; -import org.xbmc.@APP_NAME_LC@.XBMCVideoView; -public class Main extends NativeActivity +public class Main extends NativeActivity { - private static final String TAG = "@APP_NAME_LC@"; - private XBMCSettingsContentObserver mSettingsContentObserver; - private XBMCVideoView mVideoView = null; - private RelativeLayout mVideoLayout = null; - private View thisView = null; + private View thisView; private Handler handler = new Handler(); native void _onNewIntent(Intent intent); - public Main() + public Main() { super(); } - public Surface getVideoViewSurface() - { - return mVideoView.getSurface(); - } - - public void setVideoViewSurfaceRect(final int left, final int top, final int right, final int bottom) - { - runOnUiThread(new Runnable() - { - @Override - public void run() - { - android.widget.RelativeLayout.LayoutParams mp = new android.widget.RelativeLayout.LayoutParams(mVideoView.getLayoutParams()); - mp.setMargins(left, top, mVideoLayout.getWidth() - right, mVideoLayout.getHeight() - bottom); - mVideoView.setLayoutParams(mp); - mVideoView.requestLayout(); - } - }); - } - - public void clearVideoView() - { - runOnUiThread(new Runnable() - { - @Override - public void run() - { - mVideoView.clearSurface(); - } - }); - } - - public void registerMediaButtonEventReceiver() - { - AudioManager manager = (AudioManager) getSystemService(AUDIO_SERVICE); - manager.registerMediaButtonEventReceiver(new ComponentName(getPackageName(), XBMCBroadcastReceiver.class.getName())); - } - - public void unregisterMediaButtonEventReceiver() - { - AudioManager manager = (AudioManager) getSystemService(AUDIO_SERVICE); - manager.unregisterMediaButtonEventReceiver(new ComponentName(getPackageName(), XBMCBroadcastReceiver.class.getName())); - } - @Override - public void onCreate(Bundle savedInstanceState) + public void onCreate(Bundle savedInstanceState) { // The dynamic linker on droid is a mess. // Depending on version, it might not be able to properly resolve @@ -89,15 +36,8 @@ System.loadLibrary("@APP_NAME_LC@"); super.onCreate(savedInstanceState); - getWindow().setFormat(PixelFormat.TRANSPARENT); - - setContentView(R.layout.activity_main); - mVideoView = (XBMCVideoView)findViewById(R.id.VideoView1); - mVideoView.getHolder().setFormat(PixelFormat.TRANSPARENT); - mVideoLayout = (RelativeLayout) findViewById(R.id.VideoLayout); - setVolumeControlStream(AudioManager.STREAM_MUSIC); - + mSettingsContentObserver = new XBMCSettingsContentObserver(this, new Handler()); getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver ); diff -Nru kodi-16.1~git20160425.1001-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in kodi-15.2~git20151019.1039-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in --- kodi-16.1~git20160425.1001-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in 2015-07-14 18:01:42.000000000 +0000 @@ -683,23 +683,15 @@ mStateMachine.sendEmptyMessage(Checking); String curArch = ""; - String curArch2 = ""; - try - { + try { curArch = Build.CPU_ABI.substring(0,3); - } catch (IndexOutOfBoundsException e) - { + } catch (IndexOutOfBoundsException e) { mErrorMsg = "Error! Unexpected architecture: " + Build.CPU_ABI; Log.e(TAG, mErrorMsg); mState = InError; - } - try - { - curArch2 = Build.CPU_ABI2.substring(0,3); - } catch (IndexOutOfBoundsException e) {} + } - if (mState != InError) - { + if (mState != InError) { // Check if we are on the proper arch // Read the properties @@ -709,10 +701,8 @@ Properties properties = new Properties(); properties.load(xbmcprop); - if (!curArch.equalsIgnoreCase(properties.getProperty("native_arch")) - && !curArch2.equalsIgnoreCase(properties.getProperty("native_arch"))) - { - mErrorMsg = "This @APP_NAME@ package is not compatible with your device (device=" + curArch + " vs. package=" + properties.getProperty("native_arch") +").\nPlease check the Kodi Android wiki for more information."; + if (!curArch.equalsIgnoreCase(properties.getProperty("native_arch"))) { + mErrorMsg = "This @APP_NAME@ package is not compatible with your device (" + curArch + " vs. " + properties.getProperty("native_arch") +").\nPlease check the Kodi Android wiki for more information."; Log.e(TAG, mErrorMsg); mState = InError; } @@ -737,7 +727,7 @@ Log.e(TAG, mErrorMsg); mState = InError; } else { - ret = CheckCpuFeature("neon") || CheckCpuFeature("aarch64") || CheckCpuFeature("asimd"); // aarch64 is always neon; asimd feature also represents neon + ret = CheckCpuFeature("neon") || CheckCpuFeature("aarch64"); //aarch64 is always neon if (!ret) { mErrorMsg = "This @APP_NAME@ package is not compatible with your device (NEON).\nPlease check the Kodi Android wiki for more information."; Log.e(TAG, mErrorMsg); diff -Nru kodi-16.1~git20160425.1001-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java.in kodi-15.2~git20151019.1039-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java.in --- kodi-16.1~git20160425.1001-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java.in 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,123 +0,0 @@ -package org.xbmc.@APP_NAME_LC@; - -import javax.microedition.khronos.egl.EGL10; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.egl.EGLContext; -import javax.microedition.khronos.egl.EGLDisplay; -import javax.microedition.khronos.egl.EGLSurface; - -import android.R.bool; -import android.opengl.GLES20; -import android.util.AttributeSet; -import android.util.Log; -import android.view.Surface; -import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; - -public class XBMCVideoView extends SurfaceView implements - SurfaceHolder.Callback -{ - private static final String TAG = "XBMCVideoPlayView"; - public boolean mHasHolder = false; - - public XBMCVideoView(Context context) - { - super(context); - getHolder().addCallback(this); - } - - public XBMCVideoView(Context context, AttributeSet attrs) - { - this(context, attrs, 0); - getHolder().addCallback(this); - } - - public XBMCVideoView(Context context, AttributeSet attrs, int defStyle) - { - super(context, attrs, defStyle); - getHolder().addCallback(this); - } - - /** - * Clears the playback surface to black. - */ - public void clearSurface() - { - if (!mHasHolder) - return; - - // Have to go EGL to allow reuse of surface - - final int EGL_OPENGL_ES2_BIT = 4; - final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; - - EGL10 egl = (EGL10) EGLContext.getEGL(); - EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); - egl.eglInitialize(display, null); - - int[] attribList = - { EGL10.EGL_RED_SIZE, 8, EGL10.EGL_GREEN_SIZE, 8, EGL10.EGL_BLUE_SIZE, 8, - EGL10.EGL_ALPHA_SIZE, 8, EGL10.EGL_RENDERABLE_TYPE, - EGL_OPENGL_ES2_BIT, EGL10.EGL_NONE, 0, // placeholder for - // recordable [@-3] - EGL10.EGL_NONE }; - EGLConfig[] configs = new EGLConfig[1]; - int[] numConfigs = new int[1]; - egl.eglChooseConfig(display, attribList, configs, configs.length, - numConfigs); - EGLConfig config = configs[0]; - EGLContext context = egl.eglCreateContext(display, config, - EGL10.EGL_NO_CONTEXT, new int[] - { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE }); - EGLSurface eglSurface = egl.eglCreateWindowSurface(display, config, - this, new int[] - { EGL10.EGL_NONE }); - - egl.eglMakeCurrent(display, eglSurface, eglSurface, context); - GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); - egl.eglSwapBuffers(display, eglSurface); - egl.eglDestroySurface(display, eglSurface); - egl.eglMakeCurrent(display, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, - EGL10.EGL_NO_CONTEXT); - egl.eglDestroyContext(display, context); - egl.eglTerminate(display); - } - - public Surface getSurface() - { - if (!mHasHolder) - { - return null; - } else - { - Log.d(TAG, "getSurface() = " + getHolder().getSurface()); - return getHolder().getSurface(); - } - } - - @Override - public void surfaceCreated(SurfaceHolder holder) - { - Log.d(TAG, "Created"); - mHasHolder = true; - } - - @Override - public void surfaceChanged(SurfaceHolder holder, int format, int width, - int height) - { - Log.d(TAG, "Changed, format:" + format + ", width:" + width - + ", height:" + height); - } - - @Override - public void surfaceDestroyed(SurfaceHolder holder) - { - Log.d(TAG, "Destroyed"); - mHasHolder = false; - } -} diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/android/make-binary-addons kodi-15.2~git20151019.1039-final/tools/buildsteps/android/make-binary-addons --- kodi-16.1~git20160425.1001-final/tools/buildsteps/android/make-binary-addons 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/android/make-binary-addons 2015-06-14 19:32:49.000000000 +0000 @@ -8,8 +8,8 @@ rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME ALL_BINARY_ADDONS_BUILT="1" -#only build binary addons when requested by env/jenkins -if [ "$BUILD_BINARY_ADDONS" == "true" ] +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] then for addon in $BINARY_ADDONS do diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/androidx86/make-binary-addons kodi-15.2~git20151019.1039-final/tools/buildsteps/androidx86/make-binary-addons --- kodi-16.1~git20160425.1001-final/tools/buildsteps/androidx86/make-binary-addons 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/androidx86/make-binary-addons 2015-06-14 19:32:49.000000000 +0000 @@ -8,8 +8,8 @@ rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME ALL_BINARY_ADDONS_BUILT="1" -#only build binary addons when requested by env/jenkins -if [ "$BUILD_BINARY_ADDONS" == "true" ] +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] then for addon in $BINARY_ADDONS do diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/configure-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/configure-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/configure-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/configure-depends 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,12 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + cd $WORKSPACE/tools/depends;./configure \ + --with-tarballs=/Users/Shared/xbmc-depends/tarballs \ + --host=arm-apple-darwin \ + --with-sdk=$SDK_VERSION \ + --prefix=$XBMC_DEPENDS_ROOT +fi diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/configure-xbmc kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/configure-xbmc --- kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/configure-xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/configure-xbmc 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,5 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + +make -C $WORKSPACE/tools/depends/target/xbmc diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/make-binary-addons kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/make-binary-addons --- kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/make-binary-addons 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/make-binary-addons 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,28 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +#clear the build failed file +rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS V=99 VERBOSE=1 || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #mark the build failure in the filesystem but leave jenkins running + tagFailedBuild $WORKSPACE/project/cmake +fi diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/make-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/make-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/make-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/make-depends 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(rebuildDepends)" == "1" ] +then + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulDependsBuild +fi + diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/make-native-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/make-native-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/make-native-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/make-native-depends 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] && [ "$BINARY_ADDONS_CLEAN_NATIVETOOLS" != "0" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/make-xbmc kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/make-xbmc --- kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/make-xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/make-xbmc 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + +cd $WORKSPACE;make -j$BUILDTHREADS xcode_depends +cd $WORKSPACE;xcodebuild -project Kodi.xcodeproj -target Kodi-ATV2 -configuration $Configuration build \ + ONLY_ACTIVE_ARCH=YES ARCHS=armv7 VALID_ARCHS=armv7 \ + SDKROOT=iphoneos$SDK_VERSION XBMC_DEPENDS_ROOT=$XBMC_DEPENDS_ROOT CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO + diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/package kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/package --- kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/package 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/package 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,13 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + +#ensure that dpkg tools are used from our toolchain +export PATH=$XBMC_DEPENDS_ROOT/buildtools-native/bin/:$PATH + +cd $WORKSPACE/tools/darwin/packaging/atv2/;sh mkdeb-atv2.sh $Configuration + +#rename for upload +#e.x. kodi-20130314-8c2fb31-Frodo-atv2.deb +UPLOAD_FILENAME="kodi-$(getBuildRevDateStr)-atv2.deb" +mv *.deb $UPLOAD_FILENAME diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/prepare-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/prepare-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/prepare-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/prepare-depends 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,15 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + +#clean without depends for skipping depends build if possible +#also skip binary addons (pvr, audioencoder) as long as they are deployed in tree +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} + +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + #clean up the rest too + cd $WORKSPACE;git clean -xffd + cd $WORKSPACE/tools/depends/;./bootstrap +fi diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/prepare-xbmc kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/prepare-xbmc --- kodi-16.1~git20160425.1001-final/tools/buildsteps/atv2/prepare-xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/atv2/prepare-xbmc 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,10 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + + +#build binary addons before building xbmc... +#make sure that binary_addons don't clean the native tools +#here (e.x. on release builds where pathChanged always returns 1 +BINARY_ADDONS_CLEAN_NATIVETOOLS="0" +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/defaultenv kodi-15.2~git20151019.1039-final/tools/buildsteps/defaultenv --- kodi-16.1~git20160425.1001-final/tools/buildsteps/defaultenv 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/defaultenv 2015-10-19 08:39:15.000000000 +0000 @@ -10,16 +10,28 @@ BINARY_ADDONS_ROOT=tools/depends/target BINARY_ADDONS="binary-addons" -DEPLOYED_BINARY_ADDONS="-e /addons" +DEPLOYED_BINARY_ADDONS="-e addons" #set platform defaults #$XBMC_PLATFORM_DIR matches the platform subdirs! case $XBMC_PLATFORM_DIR in + atv2) + DEFAULT_SDK_VERSION=8.1 + DEFAULT_XBMC_DEPENDS_ROOT=$WORKSPACE/tools/depends/xbmc-depends + DEFAULT_CONFIGURATION="Debug" + ;; + ios) DEFAULT_SDK_VERSION=8.1 DEFAULT_XBMC_DEPENDS_ROOT=$WORKSPACE/tools/depends/xbmc-depends DEFAULT_CONFIGURATION="Debug" ;; + + osx32) + DEFAULT_SDK_VERSION=10.10 + DEFAULT_XBMC_DEPENDS_ROOT=$WORKSPACE/tools/depends/xbmc-depends + DEFAULT_CONFIGURATION="Debug" + ;; osx64) DEFAULT_SDK_VERSION=10.10 diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/ios/make-binary-addons kodi-15.2~git20151019.1039-final/tools/buildsteps/ios/make-binary-addons --- kodi-16.1~git20160425.1001-final/tools/buildsteps/ios/make-binary-addons 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/ios/make-binary-addons 2015-06-14 19:32:49.000000000 +0000 @@ -8,8 +8,8 @@ rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME ALL_BINARY_ADDONS_BUILT="1" -#only build binary addons when requested by env/jenkins -if [ "$BUILD_BINARY_ADDONS" == "true" ] +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] then for addon in $BINARY_ADDONS do diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/configure-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/configure-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/configure-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/configure-depends 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + cd $WORKSPACE/tools/depends;./configure \ + --with-toolchain=/usr --prefix=$XBMC_DEPENDS_ROOT --host=i686-linux-gnu --with-tarballs=$TARBALLS +fi diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/configure-xbmc kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/configure-xbmc --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/configure-xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/configure-xbmc 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,5 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +make -C $WORKSPACE/tools/depends/target/xbmc diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/make-binary-addons kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/make-binary-addons --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/make-binary-addons 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/make-binary-addons 2015-06-14 19:32:49.000000000 +0000 @@ -0,0 +1,28 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +#clear the build failed file +rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS V=99 VERBOSE=1 || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #mark the build failure in the filesystem but leave jenkins running + tagFailedBuild $WORKSPACE/project/cmake +fi diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/make-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/make-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/make-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/make-depends 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS || make && tagSuccessFulBuild $WORKSPACE/tools/depends +fi + diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/make-native-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/make-native-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/make-native-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/make-native-depends 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] && [ "$BINARY_ADDONS_CLEAN_NATIVETOOLS" != "0" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/make-xbmc kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/make-xbmc --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/make-xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/make-xbmc 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,5 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +cd $WORKSPACE;make -j$BUILDTHREADS || make diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/package kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/package --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/package 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/package 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,5 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +#nothing for linux atm diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/prepare-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/prepare-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/prepare-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/prepare-depends 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,15 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +#clean without depends for skipping depends build if possible +#also skip binary addons (pvr, audioencoder) as long as they are deployed in tree +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} + +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + #clean up the rest too + cd $WORKSPACE;git clean -xffd + cd $WORKSPACE/tools/depends/;./bootstrap +fi diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/prepare-xbmc kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/prepare-xbmc --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/prepare-xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/prepare-xbmc 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +#build binary addons before building xbmc... +#make sure that binary_addons don't clean the native tools +#here (e.x. on release builds where pathChanged always returns 1 +BINARY_ADDONS_CLEAN_NATIVETOOLS="0" +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/run-tests kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/run-tests --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux32/run-tests 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux32/run-tests 2014-10-23 03:00:34.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +cd $WORKSPACE;make -j$BUILDTHREADS testsuite +cd $WORKSPACE;./kodi-test --gtest_output=xml:gtestresults.xml +awk '{ if ($1 == ""; else print $0;}' gtestresults.xml > gtestresults-skipped.xml +rm gtestresults.xml +mv gtestresults-skipped.xml gtestresults.xml diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/linux64/make-binary-addons kodi-15.2~git20151019.1039-final/tools/buildsteps/linux64/make-binary-addons --- kodi-16.1~git20160425.1001-final/tools/buildsteps/linux64/make-binary-addons 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/linux64/make-binary-addons 2015-06-14 19:32:49.000000000 +0000 @@ -8,8 +8,8 @@ rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME ALL_BINARY_ADDONS_BUILT="1" -#only build binary addons when requested by env/jenkins -if [ "$BUILD_BINARY_ADDONS" == "true" ] +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] then for addon in $BINARY_ADDONS do diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/configure-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/configure-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/configure-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/configure-depends 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,12 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + cd $WORKSPACE/tools/depends;./configure \ + --with-tarballs=/Users/Shared/xbmc-depends/tarballs \ + --host=i386-apple-darwin \ + --with-sdk=$SDK_VERSION \ + --prefix=$XBMC_DEPENDS_ROOT +fi diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/configure-xbmc kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/configure-xbmc --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/configure-xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/configure-xbmc 2013-12-14 01:01:42.000000000 +0000 @@ -0,0 +1,5 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +make -C $WORKSPACE/tools/depends/target/xbmc diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/make-binary-addons kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/make-binary-addons --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/make-binary-addons 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/make-binary-addons 2015-06-14 19:32:49.000000000 +0000 @@ -0,0 +1,28 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +#clear the build failed file +rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS V=99 VERBOSE=1 || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #mark the build failure in the filesystem but leave jenkins running + tagFailedBuild $WORKSPACE/project/cmake +fi diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/make-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/make-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/make-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/make-depends 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi + diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/make-native-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/make-native-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/make-native-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/make-native-depends 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] && [ "$BINARY_ADDONS_CLEAN_NATIVETOOLS" != "0" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/make-xbmc kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/make-xbmc --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/make-xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/make-xbmc 2014-10-23 03:00:34.000000000 +0000 @@ -0,0 +1,8 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +cd $WORKSPACE;make -j$BUILDTHREADS xcode_depends + +cd $WORKSPACE;xcodebuild -sdk macosx$SDK_VERSION -project Kodi.xcodeproj -target Kodi.app ONLY_ACTIVE_ARCH=YES \ + ARCHS=i386 VALID_ARCHS=i386 XBMC_DEPENDS_ROOT=$XBMC_DEPENDS_ROOT -configuration $Configuration build diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/package kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/package --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/package 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/package 2014-10-23 03:00:34.000000000 +0000 @@ -0,0 +1,10 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +cd $WORKSPACE/tools/darwin/packaging/osx/; sh ./mkdmg-osx.sh $Configuration + +#rename for upload +#e.x. kodi-20130314-8c2fb31-Frodo-i386.dmg +UPLOAD_FILENAME="kodi-$(getBuildRevDateStr)-i386.dmg" +mv *.dmg $UPLOAD_FILENAME diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/prepare-depends kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/prepare-depends --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/prepare-depends 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/prepare-depends 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,15 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +#clean without depends for skipping depends build if possible +#also skip binary addons (pvr, audioencoder) as long as they are deployed in tree +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} + +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + #clean up the rest too + cd $WORKSPACE;git clean -xffd + cd $WORKSPACE/tools/depends/;./bootstrap +fi diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/prepare-xbmc kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/prepare-xbmc --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/prepare-xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/prepare-xbmc 2015-04-04 00:00:13.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +#build binary addons before building xbmc... +#make sure that binary_addons don't clean the native tools +#here (e.x. on release builds where pathChanged always returns 1 +BINARY_ADDONS_CLEAN_NATIVETOOLS="0" +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/run-tests kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/run-tests --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx32/run-tests 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx32/run-tests 2014-10-23 03:00:34.000000000 +0000 @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +cd $WORKSPACE;make -j$BUILDTHREADS testsuite +cd $WORKSPACE;./kodi-test --gtest_output=xml:gtestresults.xml +awk '{ if ($1 == ""; else print $0;}' gtestresults.xml > gtestresults-skipped.xml +rm gtestresults.xml +mv gtestresults-skipped.xml gtestresults.xml diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/osx64/make-binary-addons kodi-15.2~git20151019.1039-final/tools/buildsteps/osx64/make-binary-addons --- kodi-16.1~git20160425.1001-final/tools/buildsteps/osx64/make-binary-addons 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/osx64/make-binary-addons 2015-06-14 19:32:49.000000000 +0000 @@ -8,8 +8,8 @@ rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME ALL_BINARY_ADDONS_BUILT="1" -#only build binary addons when requested by env/jenkins -if [ "$BUILD_BINARY_ADDONS" == "true" ] +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] then for addon in $BINARY_ADDONS do diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/rbpi/config-xbmc-makefile kodi-15.2~git20151019.1039-final/tools/buildsteps/rbpi/config-xbmc-makefile --- kodi-16.1~git20160425.1001-final/tools/buildsteps/rbpi/config-xbmc-makefile 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/rbpi/config-xbmc-makefile 2015-10-19 08:39:15.000000000 +0000 @@ -14,7 +14,8 @@ --disable-sdl --disable-x11 --disable-xrandr --disable-openmax \ --disable-optical-drive --disable-dvdcss --disable-joystick \ --disable-crystalhd --disable-vtbdecoder --disable-vaapi \ - --disable-vdpau --disable-alsa + --disable-vdpau --disable-projectm --disable-rsxs --disable-fishbmc \ + --disable-alsa all: $(SOURCE)/libxbmc.so diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/rbpi/make-binary-addons kodi-15.2~git20151019.1039-final/tools/buildsteps/rbpi/make-binary-addons --- kodi-16.1~git20160425.1001-final/tools/buildsteps/rbpi/make-binary-addons 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/rbpi/make-binary-addons 2015-06-14 19:32:49.000000000 +0000 @@ -8,8 +8,8 @@ rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME ALL_BINARY_ADDONS_BUILT="1" -#only build binary addons when requested by env/jenkins -if [ "$BUILD_BINARY_ADDONS" == "true" ] +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] then for addon in $BINARY_ADDONS do diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/win32/bootstrap-addons.bat kodi-15.2~git20151019.1039-final/tools/buildsteps/win32/bootstrap-addons.bat --- kodi-16.1~git20160425.1001-final/tools/buildsteps/win32/bootstrap-addons.bat 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/win32/bootstrap-addons.bat 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -@ECHO OFF - -SETLOCAL - -SET EXITCODE=0 - -SET clean=false -if "%1" == "clean" ( - SET clean=true -) ELSE ( - IF "%1" NEQ "" ( - SET REPOSITORY=%1 - - IF "%2" NEQ "" ( - SET REPOSITORY_REVISION=%2 - ) - ) -) - -rem set Visual C++ build environment -call "%VS120COMNTOOLS%..\..\VC\bin\vcvars32.bat" - -SET WORKDIR=%WORKSPACE% - -IF "%WORKDIR%" == "" ( - rem resolve the relative path - SETLOCAL EnableDelayedExpansion - PUSHD ..\..\.. - SET WORKDIR=!CD! - POPD - SETLOCAL DisableDelayedExpansion -) - -rem setup some paths that we need later -SET CUR_PATH=%CD% -SET BASE_PATH=%WORKDIR%\project\cmake -SET ADDONS_PATH=%BASE_PATH%\addons -SET ADDONS_BOOTSTRAP_PATH=%ADDONS_PATH%\bootstrap -SET BOOTSTRAP_BUILD_PATH=%ADDONS_PATH%\build\bootstrap -SET ADDONS_DEFINITION_PATH=%ADDONS_PATH%\addons - -IF %clean% == true ( - rem remove the build directory if it exists - IF EXIST "%BOOTSTRAP_BUILD_PATH%" ( - ECHO Cleaning build directory... - RMDIR "%BOOTSTRAP_BUILD_PATH%" /S /Q > NUL - ) - - rem clean the addons definition path if it exists - IF EXIST "%ADDONS_DEFINITION_PATH%" ( - ECHO Cleaning bootstrapped addons... - RMDIR "%ADDONS_DEFINITION_PATH%" /S /Q > NUL - ) - - GOTO END -) - -rem create the build directory -IF NOT EXIST "%BOOTSTRAP_BUILD_PATH%" MKDIR "%BOOTSTRAP_BUILD_PATH%" - -rem create the addons definition directory -IF NOT EXIST "%ADDONS_DEFINITION_PATH%" MKDIR "%ADDONS_DEFINITION_PATH%" - -rem go into the build directory -CD "%BOOTSTRAP_BUILD_PATH%" - -ECHO -------------------------------------------------- -ECHO Bootstrapping addons -ECHO -------------------------------------------------- - -rem execute cmake to generate makefiles processable by nmake -cmake "%ADDONS_BOOTSTRAP_PATH%" -G "NMake Makefiles" ^ - -DCMAKE_BUILD_TYPE=Release ^ - -DCMAKE_INSTALL_PREFIX=%ADDONS_DEFINITION_PATH% ^ - -DBUILD_DIR=%BOOTSTRAP_BUILD_PATH% ^ - -DREPOSITORY_TO_BUILD="%REPOSITORY%" ^ - -DREPOSITORY_REVISION="%REPOSITORY_REVISION%" -IF ERRORLEVEL 1 ( - ECHO cmake error level: %ERRORLEVEL% - GOTO ERROR -) - -rem execute nmake to prepare the buildsystem -nmake -IF ERRORLEVEL 1 ( - ECHO nmake failed with error level: %ERRORLEVEL% -) -rem everything was fine -GOTO END - -:ERROR -rem something went wrong -ECHO Failed to bootstrap addons -SET EXITCODE=1 - -:END -rem go back to the original directory -cd %CUR_PATH% - -rem exit the script with the defined exitcode -EXIT /B %EXITCODE% diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/win32/make-addons.bat kodi-15.2~git20151019.1039-final/tools/buildsteps/win32/make-addons.bat --- kodi-16.1~git20160425.1001-final/tools/buildsteps/win32/make-addons.bat 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/win32/make-addons.bat 2015-10-19 08:39:15.000000000 +0000 @@ -6,7 +6,6 @@ SET install=false SET clean=false -SET package=false SET addon= SETLOCAL EnableDelayedExpansion @@ -15,11 +14,9 @@ SET install=true ) ELSE ( IF %%b == clean ( SET clean=true - ) ELSE ( IF %%b == package ( - SET package=true ) ELSE ( SET addon=!addon! %%b - ))) + )) ) SETLOCAL DisableDelayedExpansion @@ -29,12 +26,7 @@ SET WORKDIR=%WORKSPACE% IF "%WORKDIR%" == "" ( - rem resolve the relative path - SETLOCAL EnableDelayedExpansion - PUSHD ..\..\.. - SET WORKDIR=!CD! - POPD - SETLOCAL DisableDelayedExpansion + SET WORKDIR=%CD%\..\..\.. ) rem setup some paths that we need later @@ -58,13 +50,11 @@ IF %clean% == true ( rem remove the build directory if it exists IF EXIST "%ADDONS_BUILD_PATH%" ( - ECHO Cleaning build directory... RMDIR "%ADDONS_BUILD_PATH%" /S /Q > NUL ) rem remove the build directory if it exists IF EXIST "%ADDON_DEPENDS_PATH%" ( - ECHO Cleaning dependencies... RMDIR "%ADDON_DEPENDS_PATH%" /S /Q > NUL ) @@ -111,7 +101,7 @@ -DAPP_ROOT=%WORKDIR% ^ -DBUILD_DIR=%ADDONS_BUILD_PATH% ^ -DDEPENDS_PATH=%ADDON_DEPENDS_PATH% ^ - -DPACKAGE_ZIP=ON ^ + -DPACKAGE_ZIP=1 ^ -DADDONS_TO_BUILD="%ADDONS_TO_BUILD%" IF ERRORLEVEL 1 ( ECHO cmake error level: %ERRORLEVEL% > %ERRORFILE% @@ -139,17 +129,7 @@ ECHO nmake %%a error level: %ERRORLEVEL% > %ERRORFILE% ECHO %%a >> %ADDONS_FAILURE_FILE% ) ELSE ( - if %package% == true ( - nmake package-%%a - IF ERRORLEVEL 1 ( - ECHO nmake package-%%a error level: %ERRORLEVEL% > %ERRORFILE% - ECHO %%a >> %ADDONS_FAILURE_FILE% - ) ELSE ( - ECHO %%a >> %ADDONS_SUCCESS_FILE% - ) - ) ELSE ( - ECHO %%a >> %ADDONS_SUCCESS_FILE% - ) + ECHO %%a >> %ADDONS_SUCCESS_FILE% ) ) diff -Nru kodi-16.1~git20160425.1001-final/tools/buildsteps/win32/make-mingwlibs.bat kodi-15.2~git20151019.1039-final/tools/buildsteps/win32/make-mingwlibs.bat --- kodi-16.1~git20160425.1001-final/tools/buildsteps/win32/make-mingwlibs.bat 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/buildsteps/win32/make-mingwlibs.bat 2015-10-19 08:39:15.000000000 +0000 @@ -1,6 +1,4 @@ @ECHO OFF -SETLOCAL - rem batch file to compile mingw libs via BuildSetup SET WORKDIR=%WORKSPACE% rem set M$ env @@ -17,13 +15,9 @@ ) IF "%WORKDIR%"=="" ( - SET WORKDIR=%~dp0\..\..\.. + SET WORKDIR=%CD%\..\..\.. ) -REM Prepend the msys and mingw paths onto %PATH% -SET MSYS_INSTALL_PATH=%WORKDIR%\project\BuildDependencies\msys -SET PATH=%MSYS_INSTALL_PATH%\mingw\bin;%MSYS_INSTALL_PATH%\bin;%PATH% - SET ERRORFILE=%WORKDIR%\project\Win32BuildSetup\errormingw SET BS_DIR=%WORKDIR%\project\Win32BuildSetup @@ -59,6 +53,4 @@ ECHO failed to build mingw libs EXIT /B 1 ) - EXIT /B 0 - -ENDLOCAL + EXIT /B 0 \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/tools/codegenerator/GenerateSWIGBindings.bat kodi-15.2~git20151019.1039-final/tools/codegenerator/GenerateSWIGBindings.bat --- kodi-16.1~git20160425.1001-final/tools/codegenerator/GenerateSWIGBindings.bat 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/codegenerator/GenerateSWIGBindings.bat 2015-10-19 08:39:15.000000000 +0000 @@ -3,7 +3,7 @@ SET cur_dir=%CD% SET base_dir=%cur_dir%\..\.. -SET groovy_dir=%base_dir%\tools\codegenerator\groovy +SET groovy_dir=%base_dir%\lib\groovy SET generator_dir=%base_dir%\tools\codegenerator SET bin_dir=%cur_dir%\..\BuildDependencies\bin SET java_exe=java.exe @@ -29,7 +29,7 @@ rem run swig to generate the XML used by groovy to generate the python bindings "%bin_dir%\swig\swig.exe" -w401 -c++ -outdir "%python_generated_dir%" -o "%python_generated_dir%\%2.xml" -xml -I"%base_Dir%\xbmc" -xmllang python "%swig_dir%\%2.i" rem run groovy to generate the python bindings -"%java_exe%" -cp "%groovy_dir%\groovy-all-2.4.4.jar;%groovy_dir%\commons-lang-2.6.jar;%generator_dir%;%python_dir%" groovy.ui.GroovyMain "%generator_dir%\Generator.groovy" "%python_generated_dir%\%2.xml" "%python_dir%\PythonSwig.cpp.template" "%python_generated_dir%\%2.cpp" "%doxygen_dir%" +"%java_exe%" -cp "%groovy_dir%\groovy-all-2.1.7.jar;%groovy_dir%\commons-lang-2.6.jar;%generator_dir%;%python_dir%" groovy.ui.GroovyMain "%generator_dir%\Generator.groovy" "%python_generated_dir%\%2.xml" "%python_dir%\PythonSwig.cpp.template" "%python_generated_dir%\%2.cpp" "%doxygen_dir%" rem delete the XML file generated by SWIG as it's not needed anymore del "%python_generated_dir%\%2.xml" > NUL @@ -37,4 +37,4 @@ rmdir "%doxygen_dir%" /S /Q > NUL rem go back to the initial directory -cd "%cur_dir%" +cd "%cur_dir%" \ No newline at end of file Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/codegenerator/groovy/commons-lang-2.6.jar and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/codegenerator/groovy/commons-lang-2.6.jar differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/codegenerator/groovy/groovy-all-2.4.4.jar and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/codegenerator/groovy/groovy-all-2.4.4.jar differ diff -Nru kodi-16.1~git20160425.1001-final/tools/darwin/Configurations/App-ATV2.xcconfig kodi-15.2~git20151019.1039-final/tools/darwin/Configurations/App-ATV2.xcconfig --- kodi-16.1~git20160425.1001-final/tools/darwin/Configurations/App-ATV2.xcconfig 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/darwin/Configurations/App-ATV2.xcconfig 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,25 @@ +// +// Copyright (C) 2012-2013 Team XBMC +// http://xbmc.org +// +// This Program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or (at your option) +// any later version. +// +// This Program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with XBMC; see the file COPYING. If not, see +// . +// +// + +#include "App-iOS.xcconfig" + +OTHER_LDFLAGS = -Wl,-undefined,dynamic_lookup -Wl,-read_only_relocs,suppress $(XBMC_OTHER_LDFLAGS_COMMON) + +GCC_PREPROCESSOR_DEFINITIONS = TARGET_DARWIN_IOS TARGET_DARWIN_IOS_ATV2 $(inherited) diff -Nru kodi-16.1~git20160425.1001-final/tools/darwin/Configurations/App-iOS.xcconfig kodi-15.2~git20151019.1039-final/tools/darwin/Configurations/App-iOS.xcconfig --- kodi-16.1~git20160425.1001-final/tools/darwin/Configurations/App-iOS.xcconfig 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/darwin/Configurations/App-iOS.xcconfig 2015-10-19 08:39:15.000000000 +0000 @@ -40,9 +40,6 @@ DEAD_CODE_STRIPPING = NO OTHER_CPLUSPLUSFLAGS = $(inherited) $(OTHER_CFLAGS) -Wreorder -OTHER_LDFLAGS = $(XBMC_OTHER_LDFLAGS_COMMON) +OTHER_LDFLAGS = $(XBMC_OTHER_LDFLAGS_COMMON) -weak_framework VideoToolbox GCC_PREPROCESSOR_DEFINITIONS = TARGET_DARWIN_IOS $(inherited) - -// set this to YES once we have a deployment target of at least ios 6.0 -ENABLE_BITCODE = NO diff -Nru kodi-16.1~git20160425.1001-final/tools/darwin/Configurations/App.xcconfig.in kodi-15.2~git20151019.1039-final/tools/darwin/Configurations/App.xcconfig.in --- kodi-16.1~git20160425.1001-final/tools/darwin/Configurations/App.xcconfig.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/darwin/Configurations/App.xcconfig.in 2015-10-19 08:39:15.000000000 +0000 @@ -22,10 +22,10 @@ HEADER_SEARCH_PATHS = $(inherited) $SRCROOT xbmc xbmc/linux xbmc/osx xbmc/cores/dvdplayer lib $XBMC_DEPENDS/include $XBMC_DEPENDS/include/libcec $XBMC_DEPENDS/include/mysql $XBMC_DEPENDS/include/freetype2 $XBMC_DEPENDS/include/python2.6 -LIBRARY_SEARCH_PATHS = $(inherited) $(SRCROOT) $(SRCROOT)/xbmc/interfaces/json-rpc "$(SRCROOT)/xbmc/interfaces/python" "$(SRCROOT)/xbmc/interfaces/legacy" +LIBRARY_SEARCH_PATHS = $(inherited) $(SRCROOT) $(SRCROOT)/lib/SlingboxLib $(SRCROOT)/xbmc/interfaces/json-rpc "$(SRCROOT)/xbmc/interfaces/python" "$(SRCROOT)/xbmc/interfaces/legacy" FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SDKROOT)/System/Library/PrivateFrameworks/" "$(SDKROOT)/System/Library/Frameworks/" -XBMC_OTHER_LDFLAGS_COMMON = $(inherited) -Wl,-headerpad_max_install_names -Wl,-all_load -L$XBMC_DEPENDS/lib -lbz2 -lintl -lexpat -lssl -lgpg-error -lresolv -lffi -lssh -llzo2 -lpcre -lpcrecpp -lfribidi -lfreetype -lfontconfig -lsqlite3 -ltinyxml -lmicrohttpd -lsmbclient -lpython2.6 -lyajl -ljpeg -lcrypto -lgcrypt -lavdevice -lavfilter -lavcodec -lavformat -lpostproc -lavutil -ldcadec -lswresample -lswscale -ltag -L$XBMC_DEPENDS/lib/mysql -lmysqlclient -lxml2 -lxslt -lnettle -lgmp -lhogweed -lgnutls -lsquish -lcrossguid -lz -lm -liconv +XBMC_OTHER_LDFLAGS_COMMON = $(inherited) -Wl,-headerpad_max_install_names -Wl,-all_load -L$XBMC_DEPENDS/lib -lbz2 -lintl -lexpat -lssl -lgpg-error -lresolv -lffi -lssh -llzo2 -lpcre -lpcrecpp -lfribidi -lfreetype -lfontconfig -lsqlite3 -ltinyxml -lmicrohttpd -lsmbclient -lpython2.6 -lyajl -ljpeg -lcrypto -lgcrypt -lavdevice -lavfilter -lavcodec -lavformat -lpostproc -lavutil -lswresample -lswscale -ltag -L$XBMC_DEPENDS/lib/mysql -lmysqlclient -lxml2 -lxslt -lnettle -lgmp -lhogweed -lgnutls -lsquish CLANG_CXX_LANGUAGE_STANDARD = c++0x CLANG_CXX_LIBRARY = libc++ diff -Nru kodi-16.1~git20160425.1001-final/tools/darwin/packaging/atv2/mkdeb-atv2.sh.in kodi-15.2~git20151019.1039-final/tools/darwin/packaging/atv2/mkdeb-atv2.sh.in --- kodi-16.1~git20160425.1001-final/tools/darwin/packaging/atv2/mkdeb-atv2.sh.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/darwin/packaging/atv2/mkdeb-atv2.sh.in 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,136 @@ +#!/bin/sh +# usage: ./mkdeb-atv2.sh release/debug (case insensitive) +# Allows us to run mkdeb-atv2.sh from anywhere in the three, rather than the tools/darwin/packaging/atv2 folder only +XBMC_DEPENDS_ROOT=@DEPENDS_ROOT_FOR_XCODE@ +SWITCH=`echo $1 | tr [A-Z] [a-z]` +DIRNAME=`dirname $0` +DSYM_TARGET_DIR=/Users/Shared/xbmc-depends/dSyms +DSYM_FILENAME=@APP_NAME@.frappliance.dSYM + +if [ ${SWITCH:-""} = "debug" ]; then + echo "Packaging Debug target for ATV2" + APP="$DIRNAME/../../../../build/Debug-iphoneos/@APP_NAME@.frappliance" + DSYM="$DIRNAME/../../../../build/Debug-iphoneos/$DSYM_FILENAME" +elif [ ${SWITCH:-""} = "release" ]; then + echo "Packaging Release target for ATV2" + APP="$DIRNAME/../../../../build/Release-iphoneos/@APP_NAME@.frappliance" + DSYM="$DIRNAME/../../../../build/Release-iphoneos/$DSYM_FILENAME" + echo $APP +else + echo "You need to specify the build target" + exit 1 +fi + +#copy bzip2 of dsym to xbmc-depends install dir +if [ -d $DSYM ]; then + if [ -d $DSYM_TARGET_DIR ]; then + tar -C $DSYM/.. -c $DSYM_FILENAME/ | bzip2 > $DSYM_TARGET_DIR/`$DIRNAME/../gitrev-posix`-${DSYM_FILENAME}.tar.bz2 + fi +fi + +if [ ! -d $APP ]; then + echo "@APP_NAME@.frappliance not found! are you sure you built $1 target?" + exit 1 +fi +if [ -f "$XBMC_DEPENDS_ROOT/buildtools-native/bin/fakeroot" ]; then + SUDO="$XBMC_DEPENDS_ROOT/buildtools-native/bin/fakeroot" +elif [ -f "/usr/libexec/fauxsu/libfauxsu.dylib" ]; then + export DYLD_INSERT_LIBRARIES=/usr/libexec/fauxsu/libfauxsu.dylib +elif [ -f "/usr/bin/sudo" ]; then + SUDO="/usr/bin/sudo" +fi +if [ -f "$XBMC_DEPENDS_ROOT/buildtools-native/bin/dpkg-deb" ]; then + # make sure we pickup our tar, gnutar will fail when dpkg -i + bin_path=$(cd ${XBMC_DEPENDS_ROOT}/buildtools-native/bin; pwd) + export PATH=${bin_path}:${PATH} +fi + +PACKAGE=org.xbmc.@APP_NAME_LC@-atv2 + +VERSION=@APP_VERSION_MAJOR@.@APP_VERSION_MINOR@ +REVISION=0 + +if [ "@APP_VERSION_TAG_LC@" != "" ]; then + REVISION=$REVISION~@APP_VERSION_TAG_LC@ +fi + +ARCHIVE=${PACKAGE}_${VERSION}-${REVISION}_iphoneos-arm.deb +SIZE="$(du -s -k ${APP} | awk '{print $1}')" + +echo Creating $PACKAGE package version $VERSION revision $REVISION +${SUDO} rm -rf $DIRNAME/$PACKAGE +${SUDO} rm -rf $DIRNAME/$ARCHIVE + +# create debian control file. +mkdir -p $DIRNAME/$PACKAGE/DEBIAN +echo "Package: $PACKAGE" > $DIRNAME/$PACKAGE/DEBIAN/control +echo "Priority: Extra" >> $DIRNAME/$PACKAGE/DEBIAN/control +echo "Name: @APP_NAME@-ATV2" >> $DIRNAME/$PACKAGE/DEBIAN/control +echo "Depends: curl, org.awkwardtv.whitelist, com.nito.updatebegone, org.xbmc.@APP_NAME_LC@-seatbeltunlock" >> $DIRNAME/$PACKAGE/DEBIAN/control +echo "Version: $VERSION-$REVISION" >> $DIRNAME/$PACKAGE/DEBIAN/control +echo "Architecture: iphoneos-arm" >> $DIRNAME/$PACKAGE/DEBIAN/control +echo "Installed-Size: $SIZE" >> $DIRNAME/$PACKAGE/DEBIAN/control +echo "Description: @APP_NAME@ Entertainment Center for AppleTV 2" >> $DIRNAME/$PACKAGE/DEBIAN/control +echo "Homepage: http://kodi.tv/" >> $DIRNAME/$PACKAGE/DEBIAN/control +echo "Maintainer: Memphiz" >> $DIRNAME/$PACKAGE/DEBIAN/control +echo "Author: Team-@APP_NAME@" >> $DIRNAME/$PACKAGE/DEBIAN/control +echo "Section: Multimedia" >> $DIRNAME/$PACKAGE/DEBIAN/control + +# prerm: called on remove and upgrade - get rid of existing bits. +echo "#!/bin/sh" > $DIRNAME/$PACKAGE/DEBIAN/prerm +echo "find /Applications/@APP_NAME@.frappliance -delete" >> $DIRNAME/$PACKAGE/DEBIAN/prerm +echo "if [ \"\`uname -r\`\" = \"10.3.1\" ]; then" >> $DIRNAME/$PACKAGE/DEBIAN/prerm +echo " find /Applications/Lowtide.app/Appliances/@APP_NAME@.frappliance -delete" >> $DIRNAME/$PACKAGE/DEBIAN/prerm +echo "else" >> $DIRNAME/$PACKAGE/DEBIAN/prerm +echo " find /Applications/AppleTV.app/Appliances/@APP_NAME@.frappliance -delete" >> $DIRNAME/$PACKAGE/DEBIAN/prerm +echo "fi" >> $DIRNAME/$PACKAGE/DEBIAN/prerm +chmod +x $DIRNAME/$PACKAGE/DEBIAN/prerm + +# postinst: symlink @APP_NAME@.frappliance into correct location and reload Lowtide/AppleTV. +echo "#!/bin/sh" > $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "chown -R mobile:mobile /Applications/@APP_NAME@.frappliance" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "cp /Applications/@APP_NAME@.frappliance/AppIcon.png /Applications/AppleTV.app/com.apple.frontrow.appliance.@APP_NAME_LC@\@720p.png" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "mkdir -p /private/var/mobile/Library/Caches/AppleTV/MainMenu/" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "cp /Applications/@APP_NAME@.frappliance/AppIcon.png /private/var/mobile/Library/Caches/AppleTV/MainMenu/com.apple.frontrow.appliance.@APP_NAME_LC@@720.png" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "cp /Applications/@APP_NAME@.frappliance/AppIcon.png /Applications/@APP_NAME@.frappliance/TopRowIcon.png" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "if [ \"\`uname -r\`\" = \"10.3.1\" ]; then" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo " ln -sf /Applications/@APP_NAME@.frappliance /Applications/Lowtide.app/Appliances/@APP_NAME@.frappliance" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo " killall Lowtide" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "else" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo " mkdir -p /Applications/AppleTV.app/Appliances" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo " ln -sf /Applications/@APP_NAME@.frappliance /Applications/AppleTV.app/Appliances/@APP_NAME@.frappliance" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo " killall AppleTV" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "fi" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "FILE=/var/mobile/Media/Photos/seas0nTV.png" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "if [ -f \$FILE ]; then" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo " echo \"File \$FILE exists. removing...\"" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo " rm \$FILE" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +echo "fi" >> $DIRNAME/$PACKAGE/DEBIAN/postinst +cat $DIRNAME/../migrate_to_kodi_ios.sh >> $DIRNAME/$PACKAGE/DEBIAN/postinst +chmod +x $DIRNAME/$PACKAGE/DEBIAN/postinst + +# prep @APP_NAME@.frappliance +mkdir -p $DIRNAME/$PACKAGE/Applications +cp -r $APP $DIRNAME/$PACKAGE/Applications/ +find $DIRNAME/$PACKAGE/Applications/ -name '.svn' -exec rm -rf {} \; +find $DIRNAME/$PACKAGE/Applications/ -name '.git*' -exec rm -rf {} \; +find $DIRNAME/$PACKAGE/Applications/ -name '.DS_Store' -exec rm -rf {} \; +find $DIRNAME/$PACKAGE/Applications/ -name '*.xcent' -exec rm -rf {} \; + +# set ownership to root:root +${SUDO} chown -R 0:0 $DIRNAME/$PACKAGE + +echo Packaging $PACKAGE +# Tell tar, pax, etc. on Mac OS X 10.4+ not to archive +# extended attributes (e.g. resource forks) to ._* archive members. +# Also allows archiving and extracting actual ._* files. +export COPYFILE_DISABLE=true +export COPY_EXTENDED_ATTRIBUTES_DISABLE=true +# +${SUDO} dpkg-deb -bZ lzma $DIRNAME/$PACKAGE $DIRNAME/$ARCHIVE +${SUDO} chown 501:20 $DIRNAME/$ARCHIVE +dpkg-deb --info $DIRNAME/$ARCHIVE +dpkg-deb --contents $DIRNAME/$ARCHIVE + +# clean up by removing package dir +${SUDO} rm -rf $DIRNAME/$PACKAGE Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/darwin/packaging/media/atv2/AppIcon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/darwin/packaging/media/atv2/AppIcon.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/darwin/packaging/media/atv2/TopShelf.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/darwin/packaging/media/atv2/TopShelf.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/darwin/packaging/seatbeltunlock/03e48c66a9cae1ff768eb3fe7981c499.patch and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/darwin/packaging/seatbeltunlock/03e48c66a9cae1ff768eb3fe7981c499.patch differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/darwin/packaging/seatbeltunlock/12313417e3afeba6531255af58cb5283.patch and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/darwin/packaging/seatbeltunlock/12313417e3afeba6531255af58cb5283.patch differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/darwin/packaging/seatbeltunlock/42d00865f281bb662b6ce447c9815e59.patch and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/darwin/packaging/seatbeltunlock/42d00865f281bb662b6ce447c9815e59.patch differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/darwin/packaging/seatbeltunlock/5a28620a15c15d41e1ae836dd1f95f8d.patch and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/darwin/packaging/seatbeltunlock/5a28620a15c15d41e1ae836dd1f95f8d.patch differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/darwin/packaging/seatbeltunlock/f387cee7d7d302ec9e740632f44f1352.patch and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/darwin/packaging/seatbeltunlock/f387cee7d7d302ec9e740632f44f1352.patch differ diff -Nru kodi-16.1~git20160425.1001-final/tools/darwin/packaging/seatbeltunlock/mkdeb-seatbeltunlock.sh.in kodi-15.2~git20151019.1039-final/tools/darwin/packaging/seatbeltunlock/mkdeb-seatbeltunlock.sh.in --- kodi-16.1~git20160425.1001-final/tools/darwin/packaging/seatbeltunlock/mkdeb-seatbeltunlock.sh.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/darwin/packaging/seatbeltunlock/mkdeb-seatbeltunlock.sh.in 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,121 @@ +#!/bin/sh +XBMC_DEPENDS_ROOT=@DEPENDS_ROOT_FOR_XCODE@ +DIRNAME=`dirname $0` + +if [ -f "/usr/bin/sudo" ]; then + SUDO="/usr/bin/sudo" +fi + +if [ -f "${XBMC_DEPENDS_ROOT}/buildtools-native/bin/dpkg-deb" ]; then + # make sure we pickup our tar, gnutar will fail when dpkg -i + bin_path=$(cd ${XBMC_DEPENDS_ROOT}/buildtools-native/bin; pwd) + export PATH=${bin_path}:${PATH} +fi + +DPKGDEB="dpkg-deb" + +PACKAGE=org.xbmc.@APP_NAME_LC@-seatbeltunlock + +VERSION=1.0 +REVISION=5 +ARCHIVE=${PACKAGE}_${VERSION}-${REVISION}_iphoneos-arm.deb + +echo Creating $PACKAGE package version $VERSION revision $REVISION +${SUDO} rm -rf $PACKAGE +${SUDO} rm -rf $ARCHIVE + +# create debian control file +mkdir -p $PACKAGE/DEBIAN +echo "Package: $PACKAGE" > $PACKAGE/DEBIAN/control +echo "Priority: Extra" >> $PACKAGE/DEBIAN/control +echo "Depends: coreutils, bsdiff, gawk" >> $PACKAGE/DEBIAN/control +echo "Name: @APP_NAME@ seatbelt unlock for AppleTV 2" >> $PACKAGE/DEBIAN/control +echo "Version: $VERSION-$REVISION" >> $PACKAGE/DEBIAN/control +echo "Architecture: iphoneos-arm" >> $PACKAGE/DEBIAN/control +echo "Description: @APP_NAME@ tweeks, removes seatbelt" >> $PACKAGE/DEBIAN/control +echo "Homepage: http://kodi.tv/" >> $PACKAGE/DEBIAN/control +echo "Maintainer: Scott Davilla" >> $PACKAGE/DEBIAN/control +echo "Author: Team-@APP_NAME@" >> $PACKAGE/DEBIAN/control +echo "Section: Tweaks" >> $PACKAGE/DEBIAN/control + +# postinst: find lowtide/appletv, binary patch out seatbelt-profile key, +# rm/mv replace lowtide/appletv. Last step is critical as profiles are +# vnode based and there might be an existing file vnode profile. +echo "#!/bin/sh" > $PACKAGE/DEBIAN/postinst +echo "if [ \"\`uname -r\`\" = \"10.3.1\" ]; then" >> $PACKAGE/DEBIAN/postinst +echo " BINPATH=/Applications/Lowtide.app/Lowtide" >> $PACKAGE/DEBIAN/postinst +echo " echo \"Found ATV2 running ios 4.1/Lowtide\"" >> $PACKAGE/DEBIAN/postinst +echo "else" >> $PACKAGE/DEBIAN/postinst +echo " BINPATH=/Applications/AppleTV.app/AppleTV" >> $PACKAGE/DEBIAN/postinst +echo " echo \"Found ATV2 running ios 4.2+/AppleTV\"" >> $PACKAGE/DEBIAN/postinst +echo "fi" >> $PACKAGE/DEBIAN/postinst +echo "case \`md5sum \$BINPATH | awk '{print \$1}'\` in" >> $PACKAGE/DEBIAN/postinst +echo " 12313417e3afeba6531255af58cb5283 )" >> $PACKAGE/DEBIAN/postinst +echo " echo \"Found 4.1 (8M89):Removing seatbelt profile key from Lowtide\"" >> $PACKAGE/DEBIAN/postinst +echo " bspatch /Applications/Lowtide.app/Lowtide /var/tmp/Lowtide-nosb /var/tmp/k12313417e3afeba6531255af58cb5283.patch" >> $PACKAGE/DEBIAN/postinst +echo " rm /var/tmp/k12313417e3afeba6531255af58cb5283.patch" >> $PACKAGE/DEBIAN/postinst +echo " chmod 755 /var/tmp/Lowtide-nosb" >> $PACKAGE/DEBIAN/postinst +echo " mv -f /Applications/Lowtide.app/Lowtide /Applications/Lowtide.app/Lowtide_org" >> $PACKAGE/DEBIAN/postinst +echo " mv /var/tmp/Lowtide-nosb /Applications/Lowtide.app/Lowtide" >> $PACKAGE/DEBIAN/postinst +echo " killall Lowtide ;;" >> $PACKAGE/DEBIAN/postinst +echo " 5a28620a15c15d41e1ae836dd1f95f8d )" >> $PACKAGE/DEBIAN/postinst +echo " echo \"Found 4.2.1 (8C154):Removing seatbelt profile key from AppleTV\"" >> $PACKAGE/DEBIAN/postinst +echo " bspatch /Applications/AppleTV.app/AppleTV /var/tmp/AppleTV-nosb /var/tmp/k5a28620a15c15d41e1ae836dd1f95f8d.patch" >> $PACKAGE/DEBIAN/postinst +echo " rm /var/tmp/k5a28620a15c15d41e1ae836dd1f95f8d.patch" >> $PACKAGE/DEBIAN/postinst +echo " chmod 755 /var/tmp/AppleTV-nosb" >> $PACKAGE/DEBIAN/postinst +echo " mv -f /Applications/AppleTV.app/AppleTV /Applications/AppleTV.app/AppleTV_org" >> $PACKAGE/DEBIAN/postinst +echo " mv /var/tmp/AppleTV-nosb /Applications/AppleTV.app/AppleTV" >> $PACKAGE/DEBIAN/postinst +echo " killall AppleTV ;;" >> $PACKAGE/DEBIAN/postinst +echo " 03e48c66a9cae1ff768eb3fe7981c499 )" >> $PACKAGE/DEBIAN/postinst +echo " echo \"Found 4.3 (8F202):Removing seatbelt profile key from AppleTV\"" >> $PACKAGE/DEBIAN/postinst +echo " bspatch /Applications/AppleTV.app/AppleTV /var/tmp/AppleTV-nosb /var/tmp/k03e48c66a9cae1ff768eb3fe7981c499.patch" >> $PACKAGE/DEBIAN/postinst +echo " rm /var/tmp/k03e48c66a9cae1ff768eb3fe7981c499.patch" >> $PACKAGE/DEBIAN/postinst +echo " chmod 755 /var/tmp/AppleTV-nosb" >> $PACKAGE/DEBIAN/postinst +echo " mv -f /Applications/AppleTV.app/AppleTV /Applications/AppleTV.app/AppleTV_org" >> $PACKAGE/DEBIAN/postinst +echo " mv /var/tmp/AppleTV-nosb /Applications/AppleTV.app/AppleTV" >> $PACKAGE/DEBIAN/postinst +echo " killall AppleTV ;;" >> $PACKAGE/DEBIAN/postinst +echo " 42d00865f281bb662b6ce447c9815e59 )" >> $PACKAGE/DEBIAN/postinst +echo " echo \"Found 4.3.2 (8F305):Removing seatbelt profile key from AppleTV\"" >> $PACKAGE/DEBIAN/postinst +echo " bspatch /Applications/AppleTV.app/AppleTV /var/tmp/AppleTV-nosb /var/tmp/k42d00865f281bb662b6ce447c9815e59.patch" >> $PACKAGE/DEBIAN/postinst +echo " rm /var/tmp/k42d00865f281bb662b6ce447c9815e59.patch" >> $PACKAGE/DEBIAN/postinst +echo " chmod 755 /var/tmp/AppleTV-nosb" >> $PACKAGE/DEBIAN/postinst +echo " mv -f /Applications/AppleTV.app/AppleTV /Applications/AppleTV.app/AppleTV_org" >> $PACKAGE/DEBIAN/postinst +echo " mv /var/tmp/AppleTV-nosb /Applications/AppleTV.app/AppleTV" >> $PACKAGE/DEBIAN/postinst +echo " killall AppleTV ;;" >> $PACKAGE/DEBIAN/postinst +echo " f387cee7d7d302ec9e740632f44f1352 )" >> $PACKAGE/DEBIAN/postinst +echo " echo \"Found 6.1 (10B144b):Removing seatbelt profile key from AppleTV\"" >> $PACKAGE/DEBIAN/postinst +echo " bspatch /Applications/AppleTV.app/AppleTV /var/tmp/AppleTV-nosb /var/tmp/kf387cee7d7d302ec9e740632f44f1352.patch" >> $PACKAGE/DEBIAN/postinst +echo " rm /var/tmp/kf387cee7d7d302ec9e740632f44f1352.patch" >> $PACKAGE/DEBIAN/postinst +echo " chmod 755 /var/tmp/AppleTV-nosb" >> $PACKAGE/DEBIAN/postinst +echo " mv -f /Applications/AppleTV.app/AppleTV /Applications/AppleTV.app/AppleTV_org" >> $PACKAGE/DEBIAN/postinst +echo " mv /var/tmp/AppleTV-nosb /Applications/AppleTV.app/AppleTV" >> $PACKAGE/DEBIAN/postinst +echo " killall AppleTV ;;" >> $PACKAGE/DEBIAN/postinst + +echo " * )" >> $PACKAGE/DEBIAN/postinst +echo " echo \"Frontrow app md5sum is unknown, not patching\" ;;" >> $PACKAGE/DEBIAN/postinst +echo "esac" >> $PACKAGE/DEBIAN/postinst +chmod +x $PACKAGE/DEBIAN/postinst + +# create the patch directory and copy in patch +mkdir -p $PACKAGE/var/tmp +cp 12313417e3afeba6531255af58cb5283.patch $PACKAGE/var/tmp/k12313417e3afeba6531255af58cb5283.patch +cp 5a28620a15c15d41e1ae836dd1f95f8d.patch $PACKAGE/var/tmp/k5a28620a15c15d41e1ae836dd1f95f8d.patch +cp 03e48c66a9cae1ff768eb3fe7981c499.patch $PACKAGE/var/tmp/k03e48c66a9cae1ff768eb3fe7981c499.patch +cp 42d00865f281bb662b6ce447c9815e59.patch $PACKAGE/var/tmp/k42d00865f281bb662b6ce447c9815e59.patch +cp f387cee7d7d302ec9e740632f44f1352.patch $PACKAGE/var/tmp/kf387cee7d7d302ec9e740632f44f1352.patch + +# set ownership to root:root +${SUDO} chown -R 0:0 $PACKAGE + +echo Packaging $PACKAGE +# Tell tar, pax, etc. on Mac OS X 10.4+ not to archive +# extended attributes (e.g. resource forks) to ._* archive members. +# Also allows archiving and extracting actual ._* files. +export COPYFILE_DISABLE=true +export COPY_EXTENDED_ATTRIBUTES_DISABLE=true +${DPKGDEB} -b $PACKAGE $ARCHIVE +${DPKGDEB} --info $ARCHIVE +${DPKGDEB} --contents $ARCHIVE + +# clean up by removing package dir +${SUDO} rm -rf $PACKAGE diff -Nru kodi-16.1~git20160425.1001-final/tools/darwin/Support/Codesign.command kodi-15.2~git20151019.1039-final/tools/darwin/Support/Codesign.command --- kodi-16.1~git20160425.1001-final/tools/darwin/Support/Codesign.command 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/darwin/Support/Codesign.command 2015-10-19 08:39:15.000000000 +0000 @@ -1,6 +1,6 @@ #!/bin/bash -#this is the list of binaries we have to sign for being able to run un-jailbroken +#this is the list of binaries we have to sign for beeing able to run un-jailbroken LIST_BINARY_EXTENSIONS="dylib so 0 vis pvr" export CODESIGN_ALLOCATE=`xcodebuild -find codesign_allocate` @@ -28,7 +28,7 @@ codesign -v -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/" #if user has set a code_sign_identity different from iPhone Developer we do a real codesign (for deployment on non-jailbroken devices) - if ! [ -z "${CODE_SIGN_IDENTITY}" ] && [ "${CODE_SIGN_IDENTITY}" == "iPhone Developer" ] && [ "${CODE_SIGN_IDENTITY}" != "Don't Code Sign" ]; then + if ! [ -z "${CODE_SIGN_IDENTITY}" ] && [ "${CODE_SIGN_IDENTITY}" != "iPhone Developer" ] && [ "${CODE_SIGN_IDENTITY}" != "Don't Code Sign" ]; then echo Doing a full bundle sign using genuine identity "${CODE_SIGN_IDENTITY}" for binext in $LIST_BINARY_EXTENSIONS do diff -Nru kodi-16.1~git20160425.1001-final/tools/darwin/Support/copyframeworks-atv2.command kodi-15.2~git20151019.1039-final/tools/darwin/Support/copyframeworks-atv2.command --- kodi-16.1~git20160425.1001-final/tools/darwin/Support/copyframeworks-atv2.command 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/darwin/Support/copyframeworks-atv2.command 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,130 @@ +#!/bin/bash + +#set -x + +function check_dyloaded_depends +{ + b=$(find "$EXTERNAL_LIBS" -name $1 -print) + if [ -f "$b" ]; then + #echo "Processing $b" + if [ ! -f "$TARGET_FRAMEWORKS/$(basename $b)" ]; then + echo " Packaging $b" + cp -f "$b" "$TARGET_FRAMEWORKS/" + chmod u+w "$TARGET_FRAMEWORKS/$(basename $b)" + fi + for a in $(otool -L "$b" | grep "$EXTERNAL_LIBS" | awk ' { print $1 } ') ; do + if [ -f "$a" ]; then + if [ ! -f "$TARGET_FRAMEWORKS/$(basename $a)" ]; then + echo " Packaging $a" + cp -f "$a" "$TARGET_FRAMEWORKS/" + chmod u+w "$TARGET_FRAMEWORKS/$(basename $a)" + install_name_tool -change "$a" "$DYLIB_NAMEPATH/$(basename $a)" "$TARGET_FRAMEWORKS/$(basename $b)" + fi + fi + done + fi +} + +function check_xbmc_dylib_depends +{ + REWIND="1" + while [ $REWIND = "1" ] + do + let REWIND="0" + for b in $(find "$1" -type f -name "$2" -print) ; do + #echo "Processing $b" + install_name_tool -id "$(basename $b)" "$b" + for a in $(otool -L "$b" | grep "$EXTERNAL_LIBS" | awk ' { print $1 } ') ; do + #echo " Packaging $a" + if [ ! -f "$TARGET_FRAMEWORKS/$(basename $a)" ]; then + echo " Packaging $a" + cp -f "$a" "$TARGET_FRAMEWORKS/" + chmod u+w "$TARGET_FRAMEWORKS/$(basename $a)" + let REWIND="1" + fi + install_name_tool -change "$a" "$DYLIB_NAMEPATH/$(basename $a)" "$b" + done + done + done +} + +EXTERNAL_LIBS=$XBMC_DEPENDS + +TARGET_NAME=$PRODUCT_NAME.$WRAPPER_EXTENSION +TARGET_CONTENTS=$TARGET_BUILD_DIR/$TARGET_NAME + +TARGET_BINARY=$TARGET_CONTENTS/$APP_NAME +TARGET_FRAMEWORKS=$TARGET_CONTENTS/Frameworks +DYLIB_NAMEPATH=@executable_path/Appliances/$APP_NAME.frappliance/Frameworks +XBMC_HOME=$TARGET_CONTENTS/AppData/AppHome + +mkdir -p "$TARGET_CONTENTS" +mkdir -p "$TARGET_CONTENTS/AppData/AppHome" +# start clean so we don't keep old dylibs +rm -rf "$TARGET_CONTENTS/Frameworks" +mkdir -p "$TARGET_CONTENTS/Frameworks" + +echo "Package $TARGET_BUILD_DIR/$APP_NAME" + +# Copy all of XBMC's dylib dependencies and rename their locations to inside the Framework +echo "Checking $TARGET_BINARY dylib dependencies" +for a in $(otool -L "$TARGET_BINARY" | grep "$EXTERNAL_LIBS" | awk ' { print $1 } ') ; do + echo " Packaging $a" + cp -f "$a" "$TARGET_FRAMEWORKS/" + chmod u+w "$TARGET_FRAMEWORKS/$(basename $a)" + install_name_tool -change "$a" "$DYLIB_NAMEPATH/$(basename $a)" "$TARGET_BINARY" +done + +if [ "$SDK_NAME" = "iphoneos6.0" ] ; then + echo "Fixing $TARGET_BINARY VideoToolbox dylib name" + VTB_SDK6=/System/Library/Frameworks/VideoToolbox.framework/VideoToolbox + VTB_SDK5=/System/Library/PrivateFrameworks/VideoToolbox.framework/VideoToolbox + install_name_tool -change "$VTB_SDK6" "$VTB_SDK5" "$TARGET_BINARY" +fi + +echo "Package $EXTERNAL_LIBS/lib/python2.6" +mkdir -p "$TARGET_CONTENTS/Frameworks/lib" +PYTHONSYNC="rsync -aq --exclude .DS_Store --exclude *.a --exclude *.exe --exclude test --exclude tests" +${PYTHONSYNC} "$EXTERNAL_LIBS/lib/python2.6" "$TARGET_FRAMEWORKS/lib/" +rm -rf "$TARGET_FRAMEWORKS/lib/python2.6/config" + +echo "Checking $TARGET_FRAMEWORKS/lib/python2.6 *.so for dylib dependencies" +check_xbmc_dylib_depends "$TARGET_FRAMEWORKS"/lib/python2.6 "*.so" + +echo "Checking $XBMC_HOME/system *.so for dylib dependencies" +check_xbmc_dylib_depends "$XBMC_HOME"/system "*.so" + +echo "Checking $XBMC_HOME/addons *.so for dylib dependencies" +check_xbmc_dylib_depends "$XBMC_HOME"/addons "*.so" + +echo "Checking $XBMC_HOME/addons *.pvr for dylib dependencies" +check_xbmc_dylib_depends "$XBMC_HOME"/addons "*.pvr" + +echo "Checking $XBMC_HOME/addons *.xbs for dylib dependencies" +check_xbmc_dylib_depends "$XBMC_HOME"/addons "*.xbs" + +echo "Checking xbmc/DllPaths_generated.h for dylib dependencies" +for a in $(grep .dylib "$SRCROOT"/xbmc/DllPaths_generated.h | awk '{print $3}' | sed s/\"//g) ; do + check_dyloaded_depends $a +done + +echo "Checking $TARGET_FRAMEWORKS for missing dylib dependencies" +REWIND="1" +while [ $REWIND = "1" ] +do + let REWIND="0" + for b in "$TARGET_FRAMEWORKS/"*dylib* ; do + #echo " Processing $b" + for a in $(otool -L "$b" | grep "$EXTERNAL_LIBS" | awk ' { print $1 } ') ; do + #echo "Processing $a" + if [ ! -f "$TARGET_FRAMEWORKS/$(basename $a)" ]; then + echo " Packaging $a" + cp -f "$a" "$TARGET_FRAMEWORKS/" + chmod u+w "$TARGET_FRAMEWORKS/$(basename $a)" + let REWIND="1" + fi + install_name_tool -change "$a" "$DYLIB_NAMEPATH/$(basename $a)" "$TARGET_FRAMEWORKS/$(basename $b)" + done + done +done + diff -Nru kodi-16.1~git20160425.1001-final/tools/darwin/Support/copyframeworks-ios.command kodi-15.2~git20151019.1039-final/tools/darwin/Support/copyframeworks-ios.command --- kodi-16.1~git20160425.1001-final/tools/darwin/Support/copyframeworks-ios.command 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/darwin/Support/copyframeworks-ios.command 2015-08-14 16:41:50.000000000 +0000 @@ -75,6 +75,12 @@ install_name_tool -change "$a" "$DYLIB_NAMEPATH/$(basename $a)" "$TARGET_BINARY" done +echo "Fixing $TARGET_BINARY VideoToolbox dylib name" +VTB_SDK6=/System/Library/Frameworks/VideoToolbox.framework/VideoToolbox +VTB_SDK5=/System/Library/PrivateFrameworks/VideoToolbox.framework/VideoToolbox +install_name_tool -change "$VTB_SDK6" "$VTB_SDK5" "$TARGET_BINARY" + + echo "Package $EXTERNAL_LIBS/lib/python2.6" mkdir -p "$TARGET_CONTENTS/Frameworks/lib" PYTHONSYNC="rsync -aq --exclude .DS_Store --exclude *.a --exclude *.exe --exclude test --exclude tests" diff -Nru kodi-16.1~git20160425.1001-final/tools/darwin/Support/CopyRootFiles-atv2.command kodi-15.2~git20151019.1039-final/tools/darwin/Support/CopyRootFiles-atv2.command --- kodi-16.1~git20160425.1001-final/tools/darwin/Support/CopyRootFiles-atv2.command 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/darwin/Support/CopyRootFiles-atv2.command 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,52 @@ +#!/bin/bash + +echo "copy root files" + +if [ "$ACTION" = build ] ; then + +# for external testing +TARGET_NAME=$PRODUCT_NAME.$WRAPPER_EXTENSION +#SRCROOT=/Users/Shared/xbmc_svn/$APP_NAME +#TARGET_BUILD_DIR=/Users/Shared/xbmc_svn/$APP_NAME/build/Debug + +# rsync command with exclusions for items we don't want in the app package +SYNC="rsync -aq --exclude .git* --exclude .DS_Store* --exclude *.dll --exclude *.DLL --exclude *linux.* --exclude *x86-osx.* --exclude *.zlib --exclude *.a --exclude *.pyd --exclude *x86-osx.so --exclude *powerpc-osx.so" + +# rsync command for skins. jpg, png exclusion is handled during sync +# if a Textures.xbt file is found +SKINSYNC="rsync -aq --exclude .git* --exclude CVS* --exclude .svn* --exclude .cvsignore* --exclude .cvspass* --exclude .DS_Store* --exclude *.dll --exclude *.DLL --exclude *linux.* --exclude *.bat" + +# rsync command for including everything but the skins +ADDONSYNC="rsync -aq --exclude .git* --exclude CVS* --exclude .svn* --exclude .cvsignore* --exclude .cvspass* --exclude .DS_Store* --exclude addons/skin.confluence --exclude addons/skin.re-touched --exclude screensaver.rsxs* --exclude visualization.*" + +# binary name is Kodi but we build Kodi.bin so to get a clean binary each time +mv $TARGET_BUILD_DIR/$TARGET_NAME/$APP_NAME.bin $TARGET_BUILD_DIR/$TARGET_NAME/$APP_NAME + +mkdir -p "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome" +mkdir -p "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/addons" +mkdir -p "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/media" +mkdir -p "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/system" +mkdir -p "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/userdata" +mkdir -p "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/media" +mkdir -p "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/tools/darwin/runtime" + +${SYNC} "$SRCROOT/LICENSE.GPL" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/" +${SYNC} "$SRCROOT/xbmc/osx/Credits.html" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/" +${ADDONSYNC} "$SRCROOT/addons" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome" +${SYNC} "$SRCROOT/addons/visualization.glspectrum" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/addons" +${SYNC} "$SRCROOT/addons/visualization.waveform" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/addons" +${SYNC} "$SRCROOT/media" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome" + +SYNCSKIN_A=${SKINSYNC} +if [ -f "$SRCROOT/addons/skin.confluence/media/Textures.xbt" ]; then +SYNCSKIN_A="${SKINSYNC} --exclude *.png --exclude *.jpg" +fi +${SYNCSKIN_A} "$SRCROOT/addons/skin.confluence" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/addons" +${SYNC} "$SRCROOT/addons/skin.confluence/backgrounds" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/addons/skin.confluence" +${SYNC} "$SRCROOT/addons/skin.confluence/icon.png" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/addons/skin.confluence" + +${SYNC} "$SRCROOT/system" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome" +${SYNC} "$SRCROOT/userdata" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome" + +fi + diff -Nru kodi-16.1~git20160425.1001-final/tools/darwin/Support/CopyRootFiles-ios.command kodi-15.2~git20151019.1039-final/tools/darwin/Support/CopyRootFiles-ios.command --- kodi-16.1~git20160425.1001-final/tools/darwin/Support/CopyRootFiles-ios.command 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/darwin/Support/CopyRootFiles-ios.command 2015-10-19 08:39:15.000000000 +0000 @@ -17,7 +17,7 @@ SKINSYNC="rsync -aq --exclude .git* --exclude CVS* --exclude .svn* --exclude .cvsignore* --exclude .cvspass* --exclude .DS_Store* --exclude *.dll --exclude *.DLL --exclude *linux.* --exclude *.bat" # rsync command for including everything but the skins -ADDONSYNC="rsync -aq --exclude .git* --exclude CVS* --exclude .svn* --exclude .cvsignore* --exclude .cvspass* --exclude .DS_Store* --exclude addons/skin.confluence --exclude addons/skin.re-touched --exclude visualization.*" +ADDONSYNC="rsync -aq --exclude .git* --exclude CVS* --exclude .svn* --exclude .cvsignore* --exclude .cvspass* --exclude .DS_Store* --exclude addons/skin.confluence --exclude addons/skin.re-touched --exclude screensaver.rsxs* --exclude visualization.*" # binary name is Kodi but we build Kodi.bin so to get a clean binary each time mv $TARGET_BUILD_DIR/$TARGET_NAME/$APP_NAME.bin $TARGET_BUILD_DIR/$TARGET_NAME/$APP_NAME @@ -33,6 +33,8 @@ ${SYNC} "$SRCROOT/LICENSE.GPL" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/" ${SYNC} "$SRCROOT/xbmc/osx/Credits.html" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/" ${ADDONSYNC} "$SRCROOT/addons" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome" +${SYNC} "$SRCROOT/addons/visualization.glspectrum" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/addons" +${SYNC} "$SRCROOT/addons/visualization.waveform" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome/addons" ${SYNC} "$SRCROOT/media" "$TARGET_BUILD_DIR/$TARGET_NAME/AppData/AppHome" # sync touch skin if it exists diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/configure.ac kodi-15.2~git20151019.1039-final/tools/depends/configure.ac --- kodi-16.1~git20160425.1001-final/tools/depends/configure.ac 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/configure.ac 2015-10-19 08:39:15.000000000 +0000 @@ -227,7 +227,6 @@ 10.8);; 10.9);; 10.10);; - 10.11);; *) AC_MSG_ERROR(error in configure of --with-sdk=$use_sdk) esac @@ -278,7 +277,6 @@ 6.*);; 7.*);; 8.*);; - 9.*);; *) AC_MSG_ERROR(error in configure of --with-sdk=$use_sdk) ;; @@ -287,7 +285,7 @@ platform_os="ios" tmp_flags="-mcpu=cortex-a8 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp -pipe -Wno-trigraphs -fpascal-strings -O3 -Wreturn-type -Wunused-variable -fmessage-length=0 -gdwarf-2" platform_cflags+=" $tmp_flags" - platform_ldflags+=" -L$use_sdk_path/usr/lib/system -Wl,-segalign,4000" + platform_ldflags+=" -L$use_sdk_path/usr/lib/system" platform_cxxflags+=" $tmp_flags" ;; esac diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/Makefile.include.in kodi-15.2~git20151019.1039-final/tools/depends/Makefile.include.in --- kodi-16.1~git20160425.1001-final/tools/depends/Makefile.include.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/Makefile.include.in 2015-10-19 08:39:15.000000000 +0000 @@ -32,10 +32,7 @@ ENABLE_GPLV3=@use_gplv3@ HAS_LIBCRYSTAX=@has_libcrystax@ -BASE_URL=http://mirrors.kodi.tv/build-deps/sources -ifneq ($(KODI_MIRROR),) -BASE_URL=$(KODI_MIRROR)/build-deps/sources -endif +BASE_URL=http://mirrors.xbmc.org/build-deps/sources RETRIEVE_TOOL_FLAGS=-Ls --create-dirs -f -O ARCHIVE_TOOL_FLAGS=--strip-components=1 -xf CONFIG_SUB=@prefix@/@tool_dir@/share/automake-1.11/config.sub diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/cmake-native/darwin_enable_tbd_support.patch kodi-15.2~git20151019.1039-final/tools/depends/native/cmake-native/darwin_enable_tbd_support.patch --- kodi-16.1~git20160425.1001-final/tools/depends/native/cmake-native/darwin_enable_tbd_support.patch 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/cmake-native/darwin_enable_tbd_support.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -diff --git a/Modules/Platform/Darwin.cmake b/Modules/Platform/Darwin.cmake -index 4e4810a..bb085ac 100644 (file) ---- a/Modules/Platform/Darwin.cmake -+++ b/Modules/Platform/Darwin.cmake -@@ -53,7 +53,7 @@ set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -Wl,-headerpad_max_install_ - set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -Wl,-headerpad_max_install_names") - set(CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,") - set(CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,") --set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".so" ".a") -+set(CMAKE_FIND_LIBRARY_SUFFIXES ".tbd" ".dylib" ".so" ".a") - - # hack: if a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old build tree - # (where install_name_tool was hardcoded) and where CMAKE_INSTALL_NAME_TOOL isn't in the cache - diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/cmake-native/Makefile kodi-15.2~git20151019.1039-final/tools/depends/native/cmake-native/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/native/cmake-native/Makefile 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/cmake-native/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -3,7 +3,7 @@ DEPS= ../../Makefile.include.in Makefile APPNAME=cmake -VERSION=3.3.2 +VERSION=2.8.12 SOURCE=$(APPNAME)-$(VERSION) ARCHIVE=$(SOURCE).tar.gz @@ -11,11 +11,6 @@ SETENV=CC=$(CC_FOR_BUILD) CXX=$(CXX_FOR_BUILD) LD=$(LD_FOR_BUILD) CFLAGS=$(NATIVE_CFLAGS) \ CXXFLAGS=$(NATIVE_CXXFLAGS) LDFLAGS=$(NATIVE_LDFLAGS) - -ifeq ($(NATIVE_OS), osx) - SETENV+=SDKROOT=$(shell xcrun --show-sdk-path) -endif - CONFIGURE=./bootstrap --prefix=$(NATIVEPREFIX) --system-curl APP=$(PLATFORM)/bin/$(APPNAME) @@ -30,7 +25,6 @@ $(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) -rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) - cd $(PLATFORM); patch -p1 < ../darwin_enable_tbd_support.patch cd $(PLATFORM); $(SETENV) $(CONFIGURE) $(APP): $(PLATFORM) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/gas-preprocessor-native/gas-preprocessor.pl kodi-15.2~git20151019.1039-final/tools/depends/native/gas-preprocessor-native/gas-preprocessor.pl --- kodi-16.1~git20160425.1001-final/tools/depends/native/gas-preprocessor-native/gas-preprocessor.pl 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/gas-preprocessor-native/gas-preprocessor.pl 2015-10-19 08:39:15.000000000 +0000 @@ -63,7 +63,7 @@ $force_thumb = 1; } elsif ($opt eq "-arch") { $arch = shift; - die "unknown arch: '$arch'\n" if not exists $canonical_arch{$arch}; + die "unknown arch: '$arch'\n" if not exists $comments{$arch}; } elsif ($opt eq "-as-type") { $as_type = shift; die "unknown as type: '$as_type'\n" if $as_type !~ /^((apple-)?(gas|clang)|armasm)$/; @@ -429,7 +429,7 @@ sub handle_set { my $line = $_[0]; - if ($line =~ /\.(?:set|equ)\s+(\S*)\s*,\s*(.*)/) { + if ($line =~ /\.set\s+(.*),\s*(.*)/) { $symbols{$1} = eval_expr($2); return 1; } @@ -874,7 +874,7 @@ # Don't interpret e.g. bic as b with ic as conditional code if ($cond !~ /|$arm_cond_codes/) { # Not actually a branch - } elsif ($target =~ /^(\d+)([bf])$/) { + } elsif ($target =~ /(\d+)([bf])/) { # The target is a local label $line = handle_local_label($line, $1, $2); $line =~ s/\b$instr\b/$&.w/ if $width eq ""; @@ -888,12 +888,12 @@ } # ALIGN in armasm syntax is the actual number of bytes - if ($line =~ /\.(?:p2)?align\s+(\d+)/) { + if ($line =~ /\.align\s+(\d+)/) { my $align = 1 << $1; - $line =~ s/\.(?:p2)?align\s(\d+)/ALIGN $align/; + $line =~ s/\.align\s(\d+)/ALIGN $align/; } # Convert gas style [r0, :128] into armasm [r0@128] alignment specification - $line =~ s/\[([^\[,]+),?\s*:(\d+)\]/[$1\@$2]/g; + $line =~ s/\[([^\[]+),\s*:(\d+)\]/[$1\@$2]/g; # armasm treats logical values {TRUE} and {FALSE} separately from # numeric values - logical operators and values can't be intermixed @@ -930,7 +930,7 @@ # Misc bugs/deficiencies: # armasm seems unable to parse e.g. "vmov s0, s1" without a type # qualifier, thus add .f32. - $line =~ s/^(\s+(?:vmov|vadd))(\s+s\d+\s*,\s*s\d+)/$1.f32$2/; + $line =~ s/^(\s+(?:vmov|vadd))(\s+s)/$1.f32$2/; # armasm is unable to parse &0x - add spacing $line =~ s/&0x/& 0x/g; } @@ -939,17 +939,16 @@ # Convert register post indexing to a separate add instruction. # This converts e.g. "ldr r0, [r1], r2" into "ldr r0, [r1]", # "add r1, r1, r2". - $line =~ s/((?:ldr|str)[bh]?)\s+(\w+),\s*\[(\w+)\],\s*(\w+)/$1 $2, [$3]\n\tadd $3, $3, $4/g; + $line =~ s/(ldr|str)\s+(\w+),\s*\[(\w+)\],\s*(\w+)/$1 $2, [$3]\n\tadd $3, $3, $4/g; # Convert "mov pc, lr" into "bx lr", since the former only works # for switching from arm to thumb (and only in armv7), but not # from thumb to arm. s/mov\s*pc\s*,\s*lr/bx lr/g; - # Convert stmdb/ldmia/stmfd/ldmfd/ldm with only one register into a plain str/ldr with post-increment/decrement. - # Wide thumb2 encoding requires at least two registers in register list while all other encodings support one register too. - $line =~ s/stm(?:db|fd)\s+sp!\s*,\s*\{([^,-]+)\}/str $1, [sp, #-4]!/g; - $line =~ s/ldm(?:ia|fd)?\s+sp!\s*,\s*\{([^,-]+)\}/ldr $1, [sp], #4/g; + # Convert stmdb/ldmia with only one register into a plain str/ldr with post-increment/decrement + $line =~ s/stmdb\s+sp!\s*,\s*\{([^,-]+)\}/str $1, [sp, #-4]!/g; + $line =~ s/ldmia\s+sp!\s*,\s*\{([^,-]+)\}/ldr $1, [sp], #4/g; $line =~ s/\.arm/.thumb/x; } @@ -979,9 +978,6 @@ $line =~ s/\.int/.long/x; $line =~ s/\.float/.single/x; } - if ($as_type eq "apple-gas") { - $line =~ s/vmrs\s+APSR_nzcv/fmrx r15/x; - } if ($as_type eq "armasm") { $line =~ s/\.global/EXPORT/x; $line =~ s/\.int/dcd/x; @@ -990,15 +986,11 @@ $line =~ s/\.word/dcd/x; $line =~ s/\.short/dcw/x; $line =~ s/\.byte/dcb/x; - $line =~ s/\.quad/dcq/x; - $line =~ s/\.ascii/dcb/x; - $line =~ s/\.asciz(.*)$/dcb\1,0/x; $line =~ s/\.thumb/THUMB/x; $line =~ s/\.arm/ARM/x; # The alignment in AREA is the power of two, just as .align in gas - $line =~ s/\.text/AREA |.text|, CODE, READONLY, ALIGN=4, CODEALIGN/; + $line =~ s/\.text/AREA |.text|, CODE, READONLY, ALIGN=2, CODEALIGN/; $line =~ s/(\s*)(.*)\.rodata/$1AREA |.rodata|, DATA, READONLY, ALIGN=5/; - $line =~ s/\.data/AREA |.data|, DATA, ALIGN=5/; $line =~ s/fmxr/vmsr/; $line =~ s/fmrx/vmrs/; diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/giflib-native/Makefile kodi-15.2~git20151019.1039-final/tools/depends/native/giflib-native/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/native/giflib-native/Makefile 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/giflib-native/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -5,7 +5,7 @@ # lib name, version LIBNAME=giflib -VERSION=5.1.0 +VERSION=5.0.5 SOURCE=$(LIBNAME)-$(VERSION) ARCHIVE=$(SOURCE).tar.bz2 diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/libsdl_image-native/Makefile kodi-15.2~git20151019.1039-final/tools/depends/native/libsdl_image-native/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/native/libsdl_image-native/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/libsdl_image-native/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +include ../../Makefile.include +PREFIX=$(NATIVEPREFIX) +PLATFORM=$(NATIVEPLATFORM) +DEPS=Makefile ../../Makefile.include.in + +# lib name, version +LIBNAME=SDL_image +VERSION=1.2.7 +SOURCE=$(LIBNAME)-$(VERSION) +ARCHIVE=$(SOURCE).tar.gz + +# configuration settings +CONFIGURE=./configure --prefix=$(PREFIX) \ + --disable-jpg-shared --disable-png-shared --disable-tif-shared --disable-sdltest + +LIBDYLIB=$(PLATFORM)/.libs/lib$(LIBNAME).a + +all: .installed-$(PLATFORM) + +$(TARBALLS_LOCATION)/$(ARCHIVE): + cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) + +$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) + rm -rf $(PLATFORM); mkdir -p $(PLATFORM) + cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + echo $(PLATFORM) > .gitignore + cd $(PLATFORM); $(CONFIGURE) + +$(LIBDYLIB): $(PLATFORM) + $(MAKE) -C $(PLATFORM) + +.installed-$(PLATFORM): $(LIBDYLIB) + $(MAKE) -C $(PLATFORM) install + touch $@ + +clean: + $(MAKE) -C $(PLATFORM) clean + rm -f .installed-$(PLATFORM) + +distclean:: + rm -rf $(PLATFORM) .installed-$(PLATFORM) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/libsdl-native/01-SDL_SetWidthHeight.patch kodi-15.2~git20151019.1039-final/tools/depends/native/libsdl-native/01-SDL_SetWidthHeight.patch --- kodi-16.1~git20160425.1001-final/tools/depends/native/libsdl-native/01-SDL_SetWidthHeight.patch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/libsdl-native/01-SDL_SetWidthHeight.patch 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,33 @@ +Index: include/SDL_video.h +=================================================================== +--- include/SDL_video.h (revision 4116) ++++ include/SDL_video.h (working copy) +@@ -324,6 +324,11 @@ + extern DECLSPEC SDL_Rect ** SDLCALL SDL_ListModes(SDL_PixelFormat *format, Uint32 flags); + + /** ++* Alter the width and height of the current surface to the given sizes. ++*/ ++extern DECLSPEC void SDLCALL SDL_SetWidthHeight(int width, int height); ++ ++/** + * Set up a video mode with the specified width, height and bits-per-pixel. + * + * If 'bpp' is 0, it is treated as the current display bits per pixel. + +Index: src/video/SDL_video.c +=================================================================== +--- src/video/SDL_video.c (revision 4116) ++++ src/video/SDL_video.c (working copy) +@@ -1956,3 +1956,11 @@ + return(0); + } + } ++ ++void SDL_SetWidthHeight(int width, int height) ++{ ++ if (current_video != NULL && current_video->screen != NULL) { ++ current_video->screen->w = width; ++ current_video->screen->h = height; ++ } ++} diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/libsdl-native/02-OSX_interpretKeyEvents.patch kodi-15.2~git20151019.1039-final/tools/depends/native/libsdl-native/02-OSX_interpretKeyEvents.patch --- kodi-16.1~git20160425.1001-final/tools/depends/native/libsdl-native/02-OSX_interpretKeyEvents.patch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/libsdl-native/02-OSX_interpretKeyEvents.patch 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,15 @@ +--- src/video/quartz/SDL_QuartzEvents.m 2009-10-13 07:07:14.000000000 +0800 ++++ src/video/quartz/SDL_QuartzEvents.m 2013-08-03 09:12:27.000000000 +0800 +@@ -280,7 +280,11 @@ + the scancode/keysym. + */ + if (SDL_TranslateUNICODE && state == SDL_PRESSED) { +- [field_edit interpretKeyEvents:[NSArray arrayWithObject:event]]; ++ NSResponder *firstResponder = [[NSApp keyWindow] firstResponder]; ++ if ([NSStringFromClass([firstResponder class]) isEqual:@"OSXTextInputResponder"]) ++ [firstResponder interpretKeyEvents:[NSArray arrayWithObject:event]]; ++ else ++ [field_edit interpretKeyEvents:[NSArray arrayWithObject:event]]; + chars = [ event characters ]; + numChars = [ chars length ]; + if (numChars > 0) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/libsdl-native/03-mavericks-compile.patch kodi-15.2~git20151019.1039-final/tools/depends/native/libsdl-native/03-mavericks-compile.patch --- kodi-16.1~git20160425.1001-final/tools/depends/native/libsdl-native/03-mavericks-compile.patch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/libsdl-native/03-mavericks-compile.patch 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,12 @@ +--- src/video/quartz/SDL_QuartzVideo.h.orig 2013-10-27 16:51:48.000000000 +0100 ++++ src/video/quartz/SDL_QuartzVideo.h 2013-10-27 16:52:13.000000000 +0100 +@@ -91,7 +91,9 @@ + CGDirectDisplayID display; /* 0 == main display (only support single display) */ + const void *mode; /* current mode of the display */ + const void *save_mode; /* original mode of the display */ ++#if (MAC_OS_X_VERSION_MIN_REQUIRED < 1070) + CGDirectPaletteRef palette; /* palette of an 8-bit display */ ++#endif + NSOpenGLContext *gl_context; /* OpenGL rendering context */ + NSGraphicsContext *nsgfx_context; /* Cocoa graphics context */ + Uint32 width, height, bpp; /* frequently used data about the display */ diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/libsdl-native/Makefile kodi-15.2~git20151019.1039-final/tools/depends/native/libsdl-native/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/native/libsdl-native/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/libsdl-native/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,43 @@ +include ../../Makefile.include +PREFIX=$(NATIVEPREFIX) +PLATFORM=$(NATIVEPLATFORM) +DEPS= ../../Makefile.include.in 01-SDL_SetWidthHeight.patch 02-OSX_interpretKeyEvents.patch 03-mavericks-compile.patch Makefile + +# lib name, version +LIBNAME=SDL +VERSION=1.2.15 +SOURCE=$(LIBNAME)-$(VERSION) +ARCHIVE=$(SOURCE).tar.gz + +# configuration settings +CONFIGURE=./configure --prefix=$(PREFIX) \ + --without-x --disable-video-x11 --disable-video-directfb --enable-nasm=no + +LIBDYLIB=$(PLATFORM)/build/.libs/lib$(LIBNAME).a + +all: .installed-$(PLATFORM) + +$(TARBALLS_LOCATION)/$(ARCHIVE): + cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) + +$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) + rm -rf $(PLATFORM); mkdir -p $(PLATFORM) + cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + cd $(PLATFORM); patch -p0 < ../01-SDL_SetWidthHeight.patch + cd $(PLATFORM); patch -p0 < ../02-OSX_interpretKeyEvents.patch + cd $(PLATFORM); patch -p0 < ../03-mavericks-compile.patch + cd $(PLATFORM); $(CONFIGURE) + +$(LIBDYLIB): $(PLATFORM) + $(MAKE) -j 1 -C $(PLATFORM) + +.installed-$(PLATFORM): $(LIBDYLIB) + $(MAKE) -C $(PLATFORM) install + touch $@ + +clean: + $(MAKE) -C $(PLATFORM) clean + rm -f .installed-$(PLATFORM) + +distclean:: + rm -rf $(PLATFORM) .installed-$(PLATFORM) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/Makefile kodi-15.2~git20151019.1039-final/tools/depends/native/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/native/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -7,9 +7,9 @@ NATIVE= m4-native gettext-native autoconf-native automake-native \ libtool-native pkg-config-native yasm-native cmake-native \ gas-preprocessor-native python26-native zlib-native \ - pcre-native swig-native rpl-native libsquish-native \ + pcre-native swig-native rpl-native libsdl_image-native libsquish-native \ tiff-native libpng-native libjpeg-turbo-native liblzo2-native giflib-native \ - distribute-native distutilscross-native JsonSchemaBuilder TexturePacker \ + libsdl-native distribute-native distutilscross-native JsonSchemaBuilder TexturePacker \ google-breakpad-native @@ -33,6 +33,7 @@ libpng-native: zlib-native tiff-native: libjpeg-turbo-native swig-native: pcre-native +libsdl_image-native: libsdl-native libpng-native libjpeg-turbo-native tiff-native distribute-native: python26-native distutilscross-native: python26-native distribute-native tar-native: xz-native diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/configure.ac kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/configure.ac --- kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/configure.ac 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/configure.ac 2015-10-19 08:39:15.000000000 +0000 @@ -19,7 +19,7 @@ PKG_CHECK_MODULES([PNG], [libpng], - [INCLUDES="$PNG_CFLAGS"; LIBS="$LIBS $(${PKG_CONFIG} --silence-errors --static --libs libpng)"], + [INCLUDES="$PNG_CFLAGS"; LIBS="$LIBS $(pkg-config --silence-errors --static --libs libpng)"], AC_MSG_ERROR("libpng not found")) AC_CHECK_HEADER([gif_lib.h],, AC_MSG_ERROR("gif_lib.h not found")) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/decoder/GIFDecoder.cpp kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/decoder/GIFDecoder.cpp --- kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/decoder/GIFDecoder.cpp 2016-01-12 04:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/decoder/GIFDecoder.cpp 2015-04-04 00:00:13.000000000 +0000 @@ -34,25 +34,26 @@ GifHelper *gifImage = new GifHelper(); if (gifImage->LoadGif(filename.c_str())) { - auto extractedFrames = gifImage->GetFrames(); + std::vector extractedFrames = gifImage->GetFrames(); n = extractedFrames.size(); if (n > 0) { - unsigned int height = gifImage->GetHeight(); - unsigned int width = gifImage->GetWidth(); - unsigned int pitch = gifImage->GetPitch(); - unsigned int frameSize = pitch * height; for (unsigned int i = 0; i < extractedFrames.size(); i++) { DecodedFrame frame; - frame.rgbaImage.pixels = (char *)new char[frameSize]; - memcpy(frame.rgbaImage.pixels, extractedFrames[i]->m_pImage, frameSize); - frame.rgbaImage.height = height; - frame.rgbaImage.width = width; + frame.rgbaImage.pixels = (char *)new char[extractedFrames[i].m_imageSize]; + memcpy(frame.rgbaImage.pixels, extractedFrames[i].m_pImage, extractedFrames[i].m_imageSize); + frame.rgbaImage.height = extractedFrames[i].m_height; + frame.rgbaImage.width = extractedFrames[i].m_width; frame.rgbaImage.bbp = 32; - frame.rgbaImage.pitch = pitch; - frame.delay = extractedFrames[i]->m_delay; + frame.rgbaImage.pitch = extractedFrames[i].m_pitch; + + frame.delay = extractedFrames[i].m_delay; + frame.disposal = extractedFrames[i].m_disposal; + frame.x = extractedFrames[i].m_left; + frame.y = extractedFrames[i].m_top; + frames.frameList.push_back(frame); } diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/decoder/GifHelper.cpp kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/decoder/GifHelper.cpp --- kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/decoder/GifHelper.cpp 2016-02-05 08:18:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/decoder/GifHelper.cpp 2015-04-04 00:00:13.000000000 +0000 @@ -33,134 +33,134 @@ unsigned int buffSize; unsigned int readPosition; - Gifreader() : buffer(nullptr), buffSize(0), readPosition(0) {} + Gifreader() : buffer(NULL), buffSize(0), readPosition(0) {} }; +int ReadFromMemory(GifFileType* gif, GifByteType* gifbyte, int len) +{ + unsigned int alreadyRead = ((Gifreader*)gif->UserData)->readPosition; + unsigned int buffSizeLeft = ((Gifreader*)gif->UserData)->buffSize - alreadyRead; + int readBytes = len; + + if (len <= 0) + readBytes = 0; + + if ((unsigned int)len > buffSizeLeft) + readBytes = buffSizeLeft; + + if (readBytes > 0) + { + unsigned char* src = ((Gifreader*)gif->UserData)->buffer + alreadyRead; + memcpy(gifbyte, src, readBytes); + ((Gifreader*)gif->UserData)->readPosition += readBytes; + } + return readBytes; +} + int ReadFromVfs(GifFileType* gif, GifByteType* gifbyte, int len) { - CFile *gifFile = static_cast(gif->UserData); - return gifFile->Read(gifbyte, len); + CFile *gifFile = (CFile *)gif->UserData; + return (int)gifFile->Read(gifbyte, len); } + GifHelper::GifHelper() : m_imageSize(0), m_pitch(0), m_loops(0), m_numFrames(0), m_filename(""), - m_gif(nullptr), - m_pTemplate(nullptr), + m_gif(NULL), + m_hasBackground(false), + m_pTemplate(NULL), m_isAnimated(-1) { - m_gifFile = new CFile(); + m_backColor = new COLOR(); + memset(m_backColor, 0, sizeof(COLOR)); + m_frames.clear(); } GifHelper::~GifHelper() { - Close(m_gif); - Release(); - delete m_gifFile; -} - -bool GifHelper::Open(GifFileType*& gif, void *dataPtr, InputFunc readFunc) -{ - int err = 0; -#if GIFLIB_MAJOR == 5 - gif = DGifOpen(dataPtr, readFunc, &err); + int err; +#if GIFLIB_MAJOR >= 5 && GIFLIB_MINOR >= 1 + DGifCloseFile(m_gif, &err); #else - gif = DGifOpen(dataPtr, readFunc); - if (!gif) - err = GifLastError(); + err = DGifCloseFile(m_gif); #endif - - if (!gif) + if (err == D_GIF_ERR_CLOSE_FAILED) { - fprintf(stderr, "Gif::Open(): Could not open file %s. Reason: %s\n", m_filename.c_str(), GifErrorString(err)); - return false; + fprintf(stderr, "Gif::~Gif(): D_GIF_ERR_CLOSE_FAILED\n"); + free(m_gif); } - - return true; -} - -void GifHelper::Close(GifFileType* gif) -{ - int err = 0; - int reason = 0; -#if GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1 - err = DGifCloseFile(gif, &reason); -#else - err = DGifCloseFile(gif); -#if GIFLIB_MAJOR < 5 - reason = GifLastError(); -#endif - if (err == GIF_ERROR) - free(gif); -#endif - if (err == GIF_ERROR) - { - fprintf(stderr, "GifHelper::Close(): closing file %s failed. Reason: %s\n", m_filename.c_str(), Reason(reason)); - } -} - -const char* GifHelper::Reason(int reason) -{ - const char* err = GifErrorString(reason); - if (err) - return err; - - return "unknown"; - + Release(); + delete m_backColor; } void GifHelper::Release() { delete[] m_pTemplate; - m_pTemplate = nullptr; + m_pTemplate = NULL; m_globalPalette.clear(); m_frames.clear(); } -void GifHelper::ConvertColorTable(std::vector &dest, ColorMapObject* src, unsigned int size) +void GifHelper::ConvertColorTable(std::vector &dest, ColorMapObject* src, unsigned int size) { for (unsigned int i = 0; i < size; ++i) { - GifColor c; + COLOR c; c.r = src->Colors[i].Red; c.g = src->Colors[i].Green; c.b = src->Colors[i].Blue; - c.a = 0xff; + c.x = 0xff; dest.push_back(c); } } -bool GifHelper::LoadGifMetaData(GifFileType* gif) +bool GifHelper::LoadGifMetaData(GifFileType* file) { - if (!Slurp(gif)) + if (DGifSlurp(m_gif) == GIF_ERROR) + { +#if GIFLIB_MAJOR >= 5 + const char* error = GifErrorString(m_gif->Error); + if (error) + fprintf(stderr, "Gif::LoadGif(): Could not read file %s - %s\n", m_filename.c_str(), error); +#else + int error = GifLastError(); + if (error) + fprintf(stderr, "Gif::LoadGif(): Could not read file %s - %d\n", m_filename.c_str(), error); +#endif + else + fprintf(stderr, "Gif::LoadGif(): Could not read file %s (reasons unknown)\n", m_filename.c_str()); return false; + } - m_height = gif->SHeight; - m_width = gif->SWidth; + m_height = m_gif->SHeight; + m_width = m_gif->SWidth; if (!m_height || !m_width) { fprintf(stderr, "Gif::LoadGif(): Zero sized image. File %s\n", m_filename.c_str()); return false; } - m_numFrames = gif->ImageCount; + m_numFrames = m_gif->ImageCount; if (m_numFrames > 0) { - ExtensionBlock* extb = gif->SavedImages[0].ExtensionBlocks; +#if GIFLIB_MAJOR >= 5 + GraphicsControlBlock GCB; + DGifSavedExtensionToGCB(m_gif, 0, &GCB); + ExtensionBlock* extb = m_gif->SavedImages[0].ExtensionBlocks; if (extb && extb->Function == APPLICATION_EXT_FUNC_CODE) { // Read number of loops - if (++extb && extb->Function == CONTINUE_EXT_FUNC_CODE) + if(++extb && extb->Function == CONTINUE_EXT_FUNC_CODE) { - uint8_t low = static_cast(extb->Bytes[1]); - uint8_t high = static_cast(extb->Bytes[2]); - m_loops = UNSIGNED_LITTLE_ENDIAN(low, high); + m_loops = UNSIGNED_LITTLE_ENDIAN(extb->Bytes[1],extb->Bytes[2]); } } +#endif } else { @@ -168,7 +168,7 @@ return false; } - m_pitch = m_width * sizeof(GifColor); + m_pitch = m_width * sizeof(COLOR); m_imageSize = m_pitch * m_height; unsigned long memoryUsage = m_numFrames * m_imageSize; if (memoryUsage > GIF_MAX_MEMORY) @@ -183,28 +183,31 @@ bool GifHelper::LoadGifMetaData(const char* file) { - m_gifFile->Close(); - if (!m_gifFile->Open(file) || !Open(m_gif, m_gifFile, ReadFromVfs)) - return false; - - return LoadGifMetaData(m_gif); -} + int err = 0; + + if (m_gifFile.Open(file)) +#if GIFLIB_MAJOR >= 5 + m_gif = DGifOpen(&m_gifFile, ReadFromVfs, &err); +#else + m_gif = DGifOpen(&m_gifFile, ReadFromVfs); +#endif -bool GifHelper::Slurp(GifFileType* gif) -{ - if (DGifSlurp(gif) == GIF_ERROR) + if (!m_gif) { - int reason = 0; -#if GIFLIB_MAJOR == 5 - reason = gif->Error; +#if GIFLIB_MAJOR >= 5 + const char* error = GifErrorString(err); + if (error) + fprintf(stderr, "Gif::LoadGif(): Could not open file %s - %s\n", m_filename.c_str(), error); #else - reason = GifLastError(); + int error = GifLastError(); + if (error) + fprintf(stderr, "Gif::LoadGif(): Could not open file %s - %d\n", m_filename.c_str(), error); #endif - fprintf(stderr, "Gif::LoadGif(): Could not read file %s. Reason: %s\n", m_filename.c_str(), GifErrorString(reason)); + else + fprintf(stderr, "Gif::LoadGif(): Could not open file %s (reasons unknown)\n", m_filename.c_str()); return false; } - - return true; + return LoadGifMetaData(m_gif); } bool GifHelper::LoadGif(const char* file) @@ -217,19 +220,7 @@ { InitTemplateAndColormap(); - int extractedFrames = ExtractFrames(m_numFrames); - if (extractedFrames < 0) - { - fprintf(stderr, "Gif::LoadGif(): Could not extract any frame. File %s\n", m_filename.c_str()); - return false; - } - else if (extractedFrames < (int)m_numFrames) - { - fprintf(stderr, "Gif::LoadGif(): Could only extract %d/%d frames. File %s\n", extractedFrames, m_numFrames, m_filename.c_str()); - m_numFrames = extractedFrames; - } - - return true; + return ExtractFrames(m_numFrames); } catch (std::bad_alloc& ba) { @@ -239,6 +230,40 @@ } } +bool GifHelper::IsAnimated(const char* file) +{ + if (m_isAnimated < 0) + { + m_isAnimated = 0; + + GifFileType *gif = NULL; + FILE *gifFile; + int err = 0; + gifFile = fopen(file, "rb"); + if (gifFile != NULL) + { +#if GIFLIB_MAJOR >= 5 + gif = DGifOpen(&gifFile, ReadFromVfs, &err); +#else + gif = DGifOpen(&gifFile, ReadFromVfs); +#endif + } + + if (gif) + { + if (DGifSlurp(gif) && gif->ImageCount > 1) + m_isAnimated = 1; +#if GIFLIB_MAJOR >= 5 && GIFLIB_MINOR >= 1 + DGifCloseFile(gif, NULL); +#else + DGifCloseFile(gif); +#endif + fclose(gifFile); + } + } + return m_isAnimated > 0; +} + void GifHelper::InitTemplateAndColormap() { m_pTemplate = new unsigned char[m_imageSize]; @@ -248,156 +273,155 @@ { m_globalPalette.clear(); ConvertColorTable(m_globalPalette, m_gif->SColorMap, m_gif->SColorMap->ColorCount); + + // draw the canvas + *m_backColor = m_globalPalette[m_gif->SBackGroundColor]; + m_hasBackground = true; + + for (unsigned int i = 0; i < m_height * m_width; ++i) + { + unsigned char *dest = m_pTemplate + (i *sizeof(COLOR)); + memcpy(dest, m_backColor, sizeof(COLOR)); + } } else m_globalPalette.clear(); } -bool GifHelper::GcbToFrame(GifFrame &frame, unsigned int imgIdx) +bool GifHelper::gcbToFrame(GifFrame &frame, unsigned int imgIdx) { int transparent = -1; frame.m_delay = 0; frame.m_disposal = 0; - +#if GIFLIB_MAJOR >= 5 if (m_gif->ImageCount > 0) { -#if GIFLIB_MAJOR == 5 GraphicsControlBlock gcb; - if (DGifSavedExtensionToGCB(m_gif, imgIdx, &gcb)) + if (!DGifSavedExtensionToGCB(m_gif, imgIdx, &gcb)) { - // delay in ms - frame.m_delay = gcb.DelayTime * 10; - frame.m_disposal = gcb.DisposalMode; - transparent = gcb.TransparentColor; + const char* error = GifErrorString(m_gif->Error); + if (error) + fprintf(stderr, "Gif::ExtractFrames(): Could not read GraphicsControlBlock of frame %d - %s\n", imgIdx, error); + else + fprintf(stderr, "Gif::ExtractFrames(): Could not read GraphicsControlBlock of frame %d (reasons unknown)\n", imgIdx); + return false; } + // delay in ms + frame.m_delay = gcb.DelayTime * 10; + frame.m_disposal = gcb.DisposalMode; + transparent = gcb.TransparentColor; + } #else + if (m_gif->ImageCount > 0) + { ExtensionBlock* extb = m_gif->SavedImages[imgIdx].ExtensionBlocks; while (extb && extb->Function != GRAPHICS_EXT_FUNC_CODE) extb++; - if (extb && extb->ByteCount == 4) + if (extb) { - uint8_t low = static_cast(extb->Bytes[1]); - uint8_t high = static_cast(extb->Bytes[2]); - frame.m_delay = UNSIGNED_LITTLE_ENDIAN(low, high) * 10; - frame.m_disposal = (extb->Bytes[0] >> 2) & 0x07; - if (extb->Bytes[0] & 0x01) - { - transparent = static_cast(extb->Bytes[3]); - } + frame.m_delay = UNSIGNED_LITTLE_ENDIAN(extb->Bytes[1], extb->Bytes[2]) * 10; + frame.m_disposal = (extb->Bytes[0] >> 2) & 0x7; + if (extb->Bytes[0] & 0x1) + transparent = extb->Bytes[3]; else transparent = -1; } -#endif } +#endif if (transparent >= 0 && (unsigned)transparent < frame.m_palette.size()) - frame.m_palette[transparent].a = 0; + frame.m_palette[transparent].x = 0; return true; } -int GifHelper::ExtractFrames(unsigned int count) +bool GifHelper::ExtractFrames(unsigned int count) { if (!m_gif) - return -1; + return false; if (!m_pTemplate) { fprintf(stderr, "Gif::ExtractFrames(): No frame template available\n"); - return -1; + return false; } - int extracted = 0; for (unsigned int i = 0; i < count; i++) { - FramePtr frame(new GifFrame); + GifFrame frame; SavedImage savedImage = m_gif->SavedImages[i]; GifImageDesc imageDesc = m_gif->SavedImages[i].ImageDesc; - frame->m_height = imageDesc.Height; - frame->m_width = imageDesc.Width; - frame->m_top = imageDesc.Top; - frame->m_left = imageDesc.Left; - - if (frame->m_top + frame->m_height > m_height || frame->m_left + frame->m_width > m_width - || !frame->m_width || !frame->m_height - || frame->m_width > m_width || frame->m_height > m_height) - { - fprintf(stderr, "Gif::ExtractFrames(): Illegal frame dimensions: width: %d, height: %d, left: %d, top: %d instead of (%d,%d), skip it\n", - frame->m_width, frame->m_height, frame->m_left, frame->m_top, m_width, m_height); - continue; + frame.m_height = imageDesc.Height; + frame.m_width = imageDesc.Width; + frame.m_top = imageDesc.Top; + frame.m_left = imageDesc.Left; + frame.m_pitch = m_pitch; + + if (frame.m_top + frame.m_height > m_height || frame.m_left + frame.m_width > m_width + || !frame.m_width || !frame.m_height) + { + fprintf(stderr, "Gif::ExtractFrames(): Illegal frame dimensions: width: %d, height: %d, left: %d, top: %d instead of (%d,%d)\n", + frame.m_width, frame.m_height, frame.m_left, frame.m_top, m_width, m_height); + return false; } if (imageDesc.ColorMap) { - frame->m_palette.clear(); - ConvertColorTable(frame->m_palette, imageDesc.ColorMap, imageDesc.ColorMap->ColorCount); - // TODO save a backup of the palette for frames without a table in case there's no global table. + frame.m_palette.clear(); + ConvertColorTable(frame.m_palette, imageDesc.ColorMap, imageDesc.ColorMap->ColorCount); + // TODO save a backup of the palette for frames without a table in case there's no gloabl table. } else if (m_gif->SColorMap) { - frame->m_palette = m_globalPalette; - } - else - { - fprintf(stderr, "Gif::ExtractFrames(): No color map found for frame %d, skip it\n", i); - continue; + frame.m_palette = m_globalPalette; } // fill delay, disposal and transparent color into frame - if (!GcbToFrame(*frame, i)) - { - fprintf(stderr, "Gif::ExtractFrames(): Corrupted Graphics Control Block for frame %d, skip it\n", i); - continue; - } + if (!gcbToFrame(frame, i)) + return false; - frame->m_pImage = new unsigned char[m_imageSize]; - frame->m_imageSize = m_imageSize; - memcpy(frame->m_pImage, m_pTemplate, m_imageSize); + frame.m_pImage = new unsigned char[m_imageSize]; + frame.m_imageSize = m_imageSize; + memcpy(frame.m_pImage, m_pTemplate, m_imageSize); - ConstructFrame(*frame, savedImage.RasterBits); + ConstructFrame(frame, savedImage.RasterBits); - if (!PrepareTemplate(*frame)) - { - fprintf(stderr, "Gif::ExtractFrames(): Could not prepare template after frame %d, skip it\n", i); - continue; - } + if(!PrepareTemplate(frame)) + return false; - extracted++; m_frames.push_back(frame); } - return extracted; + return true; } void GifHelper::ConstructFrame(GifFrame &frame, const unsigned char* src) const { - size_t paletteSize = frame.m_palette.size(); - for (unsigned int dest_y = frame.m_top, src_y = 0; src_y < frame.m_height; ++dest_y, ++src_y) { - unsigned char *to = frame.m_pImage + (dest_y * m_pitch) + (frame.m_left * sizeof(GifColor)); + unsigned char *to = frame.m_pImage + (dest_y * m_pitch) + (frame.m_left * sizeof(COLOR)); const unsigned char *from = src + (src_y * frame.m_width); for (unsigned int src_x = 0; src_x < frame.m_width; ++src_x) { - unsigned char index = *from++; - - if (index >= paletteSize) + COLOR col = frame.m_palette[*from++]; + if (col.x != 0) { - fprintf(stderr, "Gif::ConstructFrame(): Pixel (%d,%d) has no valid palette entry, skip it\n", src_x, src_y); - continue; + *to++ = col.b; + *to++ = col.g; + *to++ = col.r; + *to++ = col.x; + } + else + { + to += 4; } - - GifColor col = frame.m_palette[index]; - if (col.a != 0) - memcpy(to, &col, sizeof(GifColor)); - - to += 4; } } } -bool GifHelper::PrepareTemplate(GifFrame &frame) +bool GifHelper::PrepareTemplate(const GifFrame &frame) { +#if GIFLIB_MAJOR >= 5 switch (frame.m_disposal) { /* No disposal specified. */ @@ -407,92 +431,140 @@ memcpy(m_pTemplate, frame.m_pImage, m_imageSize); break; - /* - Clear the frame's area to transparency. - The disposal names is misleading. Do not restore to the background color because - this part of the specification is ignored by all browsers/image viewers. - */ + /* Set area too background color */ case DISPOSE_BACKGROUND: - { - ClearFrameAreaToTransparency(m_pTemplate, frame); - break; - } - /* Restore to previous content */ - case DISPOSE_PREVIOUS: - { - - /* - * This disposal method makes no sense for the first frame - * Since browsers etc. handle that too, we'll fall back to DISPOSE_DO_NOT - */ - if (m_frames.empty()) { - frame.m_disposal = DISPOSE_DO_NOT; - return PrepareTemplate(frame); + if (!m_hasBackground) + { + fprintf(stderr, "Gif::PrepareTemplate(): Disposal method DISPOSE_BACKGROUND encountered, but the gif has no background.\n"); + return false; + } + SetFrameAreaToBack(m_pTemplate, frame); + break; } - - bool valid = false; - - for (int i = m_frames.size() - 1; i >= 0; --i) + /* Restore to previous content */ + case DISPOSE_PREVIOUS: { - if (m_frames[i]->m_disposal != DISPOSE_PREVIOUS) + bool valid = false; + + for (int i = m_frames.size() - 1 ; i >= 0; --i) + { + if (m_frames[i].m_disposal != DISPOSE_PREVIOUS) + { + memcpy(m_pTemplate, m_frames[i].m_pImage, m_imageSize); + valid = true; + break; + } + } + if (!valid) { - memcpy(m_pTemplate, m_frames[i]->m_pImage, m_imageSize); - valid = true; - break; + fprintf(stderr, "Gif::PrepareTemplate(): Disposal method DISPOSE_PREVIOUS encountered, but could not find a suitable frame.\n"); + return false; } + break; } - if (!valid) + default: { - fprintf(stderr, "Gif::PrepareTemplate(): Disposal method DISPOSE_PREVIOUS encountered, but could not find a suitable frame.\n"); + fprintf(stderr, "Gif::PrepareTemplate(): Unknown disposal method: %d\n", frame.m_disposal); return false; } - break; - } - default: - { - fprintf(stderr, "Gif::PrepareTemplate(): Unknown disposal method: %d. Using DISPOSAL_UNSPECIFIED, the animation might be wrong now.\n", frame.m_disposal); - frame.m_disposal = DISPOSAL_UNSPECIFIED; - return PrepareTemplate(frame); - } } +#endif return true; } -void GifHelper::ClearFrameAreaToTransparency(unsigned char* dest, const GifFrame &frame) +void GifHelper::SetFrameAreaToBack(unsigned char* dest, const GifFrame &frame) { for (unsigned int dest_y = frame.m_top, src_y = 0; src_y < frame.m_height; ++dest_y, ++src_y) { - unsigned char *to = dest + (dest_y * m_pitch) + (frame.m_left * sizeof(GifColor)); + unsigned char *to = dest + (dest_y * m_pitch) + (frame.m_left * sizeof(COLOR)); for (unsigned int src_x = 0; src_x < frame.m_width; ++src_x) { - to += 3; - *to++ = 0; + memcpy(to, m_backColor, sizeof(COLOR)); + to += 4; } } } +bool GifHelper::LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height) +{ + if (!buffer || !bufSize || !width || !height) + return false; + + Gifreader reader; + reader.buffer = buffer; + reader.buffSize = bufSize; + + int err = 0; +#if GIFLIB_MAJOR >= 5 + m_gif = DGifOpen((void *)&reader, (InputFunc)&ReadFromMemory, &err); +#else + m_gif = DGifOpen((void *)&reader, (InputFunc)&ReadFromMemory); +#endif + if (!m_gif) + { +#if GIFLIB_MAJOR >= 5 + const char* error = GifErrorString(err); + if (error) + fprintf(stderr, "Gif::LoadImageFromMemory(): Could not open gif from memory - %s\n", error); +#else + int error = GifLastError(); + if (error) + fprintf(stderr, "Gif::LoadImageFromMemory(): Could not open gif from memory - %d\n", error); +#endif + else + fprintf(stderr, "Gif::LoadImageFromMemory(): Could not open gif from memory (reasons unknown)\n"); + return false; + } + + if (!LoadGifMetaData(m_gif)) + return false; + + m_originalWidth = m_width; + m_originalHeight = m_height; + + try + { + InitTemplateAndColormap(); + + if (!ExtractFrames(m_numFrames)) + return false; + } + catch (std::bad_alloc& ba) + { + fprintf(stderr, "Gif::LoadImageFromMemory(): Out of memory while extracting gif frames - %s\n", ba.what()); + Release(); + return false; + } + + return true; +} + GifFrame::GifFrame() : - m_pImage(nullptr), + m_pImage(NULL), m_delay(0), m_imageSize(0), m_height(0), m_width(0), m_top(0), m_left(0), - m_disposal(0) + m_disposal(0), + m_transparent(0), + m_pitch(0) {} GifFrame::GifFrame(const GifFrame& src) : - m_pImage(nullptr), + m_pImage(NULL), m_delay(src.m_delay), m_imageSize(src.m_imageSize), m_height(src.m_height), m_width(src.m_width), m_top(src.m_top), m_left(src.m_left), - m_disposal(src.m_disposal) + m_disposal(src.m_disposal), + m_transparent(src.m_transparent), + m_pitch(src.m_pitch) { if (src.m_pImage) { @@ -509,5 +581,5 @@ GifFrame::~GifFrame() { delete[] m_pImage; - m_pImage = nullptr; + m_pImage = NULL; } diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/decoder/GifHelper.h kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/decoder/GifHelper.h --- kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/decoder/GifHelper.h 2016-01-12 04:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/decoder/GifHelper.h 2015-04-04 00:00:13.000000000 +0000 @@ -21,36 +21,13 @@ #pragma once #include "gif_lib.h" -#ifndef CONTINUE_EXT_FUNC_CODE -#define CONTINUE_EXT_FUNC_CODE 0 -#endif - -#ifndef DISPOSAL_UNSPECIFIED -#define DISPOSAL_UNSPECIFIED 0 -#endif - -#ifndef DISPOSE_DO_NOT -#define DISPOSE_DO_NOT 1 -#endif - -#ifndef DISPOSE_BACKGROUND -#define DISPOSE_BACKGROUND 2 -#endif - -#ifndef DISPOSE_PREVIOUS -#define DISPOSE_PREVIOUS 3 -#endif - #include #include -#include #include "SimpleFS.h" + #pragma pack(1) -struct GifColor -{ - uint8_t b, g, r, a; -}; +struct COLOR { unsigned char b, g, r, x; }; // Windows GDI expects 4bytes per color #pragma pack() class CFile; @@ -62,13 +39,12 @@ GifFrame(); virtual ~GifFrame(); + void Release(); - unsigned char* m_pImage; - unsigned int m_delay; - -private: GifFrame(const GifFrame& src); + unsigned char* m_pImage; + unsigned int m_delay; unsigned int m_top; unsigned int m_left; unsigned int m_disposal; @@ -76,7 +52,10 @@ unsigned int m_width; unsigned int m_pitch; unsigned int m_imageSize; - std::vector m_palette; + +private: + + std::vector m_palette; int m_transparent; }; @@ -85,24 +64,22 @@ class GifHelper { friend class GifFrame; - - typedef std::shared_ptr FramePtr; - public: GifHelper(); virtual ~GifHelper(); - + bool LoadGifMetaData(const char* file); bool LoadGif(const char* file); - std::vector& GetFrames() { return m_frames; } + virtual bool LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height); + //virtual bool Decode(const unsigned char *pixels, unsigned int pitch, unsigned int format); + bool IsAnimated(const char* file); + std::vector& GetFrames() { return m_frames; } unsigned int GetPitch() const { return m_pitch; } unsigned int GetNumLoops() const { return m_loops; } - unsigned int GetWidth() const { return m_width; } - unsigned int GetHeight() const { return m_height; } private: - std::vector m_frames; + std::vector m_frames; unsigned int m_imageSize; unsigned int m_pitch; unsigned int m_loops; @@ -111,11 +88,11 @@ std::string m_filename; GifFileType* m_gif; bool m_hasBackground; - GifColor* m_backColor; - std::vector m_globalPalette; + COLOR* m_backColor; + std::vector m_globalPalette; unsigned char* m_pTemplate; int m_isAnimated; - CFile* m_gifFile; + CFile m_gifFile; unsigned int m_width; unsigned int m_height; @@ -124,106 +101,13 @@ unsigned int m_orientation; bool m_hasAlpha; - bool Open(GifFileType *& gif, void * dataPtr, InputFunc readFunc); - void Close(GifFileType * gif); - - const char* Reason(int reason); - - bool LoadGifMetaData(const char* file); - bool Slurp(GifFileType* gif); void InitTemplateAndColormap(); - bool LoadGifMetaData(GifFileType* gif); - static void ConvertColorTable(std::vector &dest, ColorMapObject* src, unsigned int size); - bool GcbToFrame(GifFrame &frame, unsigned int imgIdx); - int ExtractFrames(unsigned int count); - void ClearFrameAreaToTransparency(unsigned char* dest, const GifFrame &frame); + bool LoadGifMetaData(GifFileType* file); + static void ConvertColorTable(std::vector &dest, ColorMapObject* src, unsigned int size); + bool gcbToFrame(GifFrame &frame, unsigned int imgIdx); + bool ExtractFrames(unsigned int count); + void SetFrameAreaToBack(unsigned char* dest, const GifFrame &frame); void ConstructFrame(GifFrame &frame, const unsigned char* src) const; - bool PrepareTemplate(GifFrame &frame); + bool PrepareTemplate(const GifFrame &frame); void Release(); - -#if GIFLIB_MAJOR != 5 - /* - taken from giflib 5.1.0 - */ - const char* GifErrorString(int ErrorCode) - { - const char *Err; - - switch (ErrorCode) { - case E_GIF_ERR_OPEN_FAILED: - Err = "Failed to open given file"; - break; - case E_GIF_ERR_WRITE_FAILED: - Err = "Failed to write to given file"; - break; - case E_GIF_ERR_HAS_SCRN_DSCR: - Err = "Screen descriptor has already been set"; - break; - case E_GIF_ERR_HAS_IMAG_DSCR: - Err = "Image descriptor is still active"; - break; - case E_GIF_ERR_NO_COLOR_MAP: - Err = "Neither global nor local color map"; - break; - case E_GIF_ERR_DATA_TOO_BIG: - Err = "Number of pixels bigger than width * height"; - break; - case E_GIF_ERR_NOT_ENOUGH_MEM: - Err = "Failed to allocate required memory"; - break; - case E_GIF_ERR_DISK_IS_FULL: - Err = "Write failed (disk full?)"; - break; - case E_GIF_ERR_CLOSE_FAILED: - Err = "Failed to close given file"; - break; - case E_GIF_ERR_NOT_WRITEABLE: - Err = "Given file was not opened for write"; - break; - case D_GIF_ERR_OPEN_FAILED: - Err = "Failed to open given file"; - break; - case D_GIF_ERR_READ_FAILED: - Err = "Failed to read from given file"; - break; - case D_GIF_ERR_NOT_GIF_FILE: - Err = "Data is not in GIF format"; - break; - case D_GIF_ERR_NO_SCRN_DSCR: - Err = "No screen descriptor detected"; - break; - case D_GIF_ERR_NO_IMAG_DSCR: - Err = "No Image Descriptor detected"; - break; - case D_GIF_ERR_NO_COLOR_MAP: - Err = "Neither global nor local color map"; - break; - case D_GIF_ERR_WRONG_RECORD: - Err = "Wrong record type detected"; - break; - case D_GIF_ERR_DATA_TOO_BIG: - Err = "Number of pixels bigger than width * height"; - break; - case D_GIF_ERR_NOT_ENOUGH_MEM: - Err = "Failed to allocate required memory"; - break; - case D_GIF_ERR_CLOSE_FAILED: - Err = "Failed to close given file"; - break; - case D_GIF_ERR_NOT_READABLE: - Err = "Given file was not opened for read"; - break; - case D_GIF_ERR_IMAGE_DEFECT: - Err = "Image is defective, decoding aborted"; - break; - case D_GIF_ERR_EOF_TOO_SOON: - Err = "Image EOF detected before image complete"; - break; - default: - Err = NULL; - break; - } - return Err; - } -#endif }; diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/decoder/IDecoder.h kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/decoder/IDecoder.h --- kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/decoder/IDecoder.h 2016-01-12 04:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/decoder/IDecoder.h 2015-04-04 00:00:13.000000000 +0000 @@ -37,8 +37,10 @@ class DecodedFrame { public: - DecodedFrame() : delay(0) { } + DecodedFrame() : x(0), y(0), disposal(0), delay(0) { } RGBAImage rgbaImage; /* rgbaimage for this frame */ + int x, y; /* Frame offset position */ + int disposal; /* Disposal code */ int delay; /* Frame delay in ms */ }; diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/Makefile.am kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/Makefile.am --- kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/Makefile.am 2016-04-25 03:00:07.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/Makefile.am 2015-10-19 08:39:15.000000000 +0000 @@ -2,7 +2,7 @@ AM_CFLAGS = -DTARGET_POSIX -DUSE_LZO_PACKING AM_CFLAGS += @EXTRA_DEFINES@ -AM_CXXFLAGS = $(AM_CFLAGS) -std=c++11 +AM_CXXFLAGS = $(AM_CFLAGS) AM_CPPFLAGS = \ -I. \ diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/TexturePacker.cpp kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/TexturePacker.cpp --- kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/TexturePacker.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/TexturePacker.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -32,7 +32,6 @@ #include #include "guilib/XBTF.h" -#include "guilib/XBTFReader.h" #include "DecoderManager.h" @@ -82,7 +81,7 @@ } } -void CreateSkeletonHeaderImpl(CXBTFWriter& xbtfWriter, std::string fullPath, std::string relativePath) +void CreateSkeletonHeaderImpl(CXBTF& xbtf, std::string fullPath, std::string relativePath) { struct dirent* dp; struct stat stat_p; @@ -109,7 +108,7 @@ tmpPath += "/"; } - CreateSkeletonHeaderImpl(xbtfWriter, fullPath + DIR_SEPARATOR + dp->d_name, tmpPath + dp->d_name); + CreateSkeletonHeaderImpl(xbtf, fullPath + DIR_SEPARATOR + dp->d_name, tmpPath + dp->d_name); } else if (DecoderManager::IsSupportedGraphicsFile(dp->d_name)) { @@ -124,7 +123,7 @@ CXBTFFile file; file.SetPath(fileName); - xbtfWriter.AddFile(file); + xbtf.GetFiles().push_back(file); } } } @@ -137,10 +136,10 @@ } } -void CreateSkeletonHeader(CXBTFWriter& xbtfWriter, std::string fullPath) +void CreateSkeletonHeader(CXBTF& xbtf, std::string fullPath) { std::string temp; - CreateSkeletonHeaderImpl(xbtfWriter, fullPath, temp); + CreateSkeletonHeaderImpl(xbtf, fullPath, temp); } CXBTFFrame appendContent(CXBTFWriter &writer, int width, int height, unsigned char *data, unsigned int size, unsigned int format, bool hasAlpha, unsigned int flags) @@ -286,7 +285,7 @@ puts(" -help Show this screen."); puts(" -input Input directory. Default: current dir"); puts(" -output Output directory/filename. Default: Textures.xpr"); - puts(" -dupecheck Enable duplicate file detection. Reduces output file size. Default: off"); + puts(" -dupecheck Enable duplicate file detection. Reduces output file size. Default: on"); puts(" -use_lzo Use lz0 packing. Default: on"); puts(" -use_dxt Use DXT compression. Default: on"); puts(" -use_none Use No compression. Default: off"); @@ -321,25 +320,25 @@ int createBundle(const std::string& InputDir, const std::string& OutputFile, double maxMSE, unsigned int flags, bool dupecheck) { - CXBTFWriter writer(OutputFile); - if (!writer.Create()) - { - fprintf(stderr, "Error creating file\n"); - return 1; - } - map hashes; vector dupes; - CreateSkeletonHeader(writer, InputDir); - - std::vector files = writer.GetFiles(); - dupes.resize(files.size()); + CXBTF xbtf; + CreateSkeletonHeader(xbtf, InputDir); + dupes.resize(xbtf.GetFiles().size()); if (!dupecheck) { for (unsigned int i=0;i& files = xbtf.GetFiles(); for (size_t i = 0; i < files.size(); i++) { struct MD5Context ctx; @@ -359,7 +358,7 @@ if (!loaded) { - fprintf(stderr, "...unable to load image %s\n", file.GetPath().c_str()); + fprintf(stderr, "...unable to load image %s\n", file.GetPath()); continue; } @@ -374,7 +373,7 @@ if (checkDupe(&ctx,hashes,dupes,i)) { - printf("**** duplicate of %s\n", files[dupes[i]].GetPath().c_str()); + printf("**** duplicate of %s\n", files[dupes[i]].GetPath()); file.GetFrames().insert(file.GetFrames().end(), files[dupes[i]].GetFrames().begin(), files[dupes[i]].GetFrames().end()); @@ -396,8 +395,6 @@ } DecoderManager::FreeDecodedFrames(frames); file.SetLoop(0); - - writer.UpdateFile(file); } if (!writer.UpdateHeader(dupes)) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/Win32/TexturePacker.vcxproj kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/Win32/TexturePacker.vcxproj --- kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/Win32/TexturePacker.vcxproj 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/Win32/TexturePacker.vcxproj 2015-10-19 08:39:15.000000000 +0000 @@ -45,9 +45,9 @@ $(SolutionDir)$(Configuration)\ $(Configuration)\ false - $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;..\..\..\..\..\..\project\BuildDependencies\include;$(IncludePath) + $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;..\..\..\..\..\..\project\BuildDependencies\include $(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib;..\..\..\..\..\..\project\BuildDependencies\lib - $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;..\..\..\..\..\..\project\BuildDependencies\include;$(IncludePath) + $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;..\..\..\..\..\..\project\BuildDependencies\include $(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib;..\..\..\..\..\..\project\BuildDependencies\lib Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/Win32/version.rc and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/Win32/version.rc differ diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/XBTFWriter.cpp kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/XBTFWriter.cpp --- kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/XBTFWriter.cpp 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/XBTFWriter.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -18,50 +18,47 @@ * */ +#include "XBTFWriter.h" #define __STDC_FORMAT_MACROS #include +#include "guilib/XBTF.h" +#include "utils/EndianSwap.h" #if defined(TARGET_FREEBSD) || defined(TARGET_DARWIN) #include #elif !defined(TARGET_DARWIN) #include #endif #include -#include - -#include "XBTFWriter.h" -#include "guilib/XBTFReader.h" -#include "utils/EndianSwap.h" - #define WRITE_STR(str, size, file) fwrite(str, size, 1, file) #define WRITE_U32(i, file) { uint32_t _n = Endian_SwapLE32(i); fwrite(&_n, 4, 1, file); } #define WRITE_U64(i, file) { uint64_t _n = i; _n = Endian_SwapLE64(i); fwrite(&_n, 8, 1, file); } -CXBTFWriter::CXBTFWriter(const std::string& outputFile) - : m_outputFile(outputFile), - m_file(nullptr), - m_data(nullptr), - m_size(0) -{ } - -CXBTFWriter::~CXBTFWriter() +CXBTFWriter::CXBTFWriter(CXBTF& xbtf, const std::string& outputFile) : m_xbtf(xbtf) { - Close(); + m_outputFile = outputFile; + m_file = NULL; + m_data = NULL; + m_size = 0; } bool CXBTFWriter::Create() { m_file = fopen(m_outputFile.c_str(), "wb"); - if (m_file == nullptr) + if (m_file == NULL) + { return false; + } return true; } bool CXBTFWriter::Close() { - if (m_file == nullptr || m_data == nullptr) + if (m_file == NULL || m_data == NULL) + { return false; + } fwrite(m_data, 1, m_size, m_file); @@ -73,12 +70,12 @@ void CXBTFWriter::Cleanup() { free(m_data); - m_data = nullptr; + m_data = NULL; m_size = 0; if (m_file) { fclose(m_file); - m_file = nullptr; + m_file = NULL; } } @@ -86,7 +83,7 @@ { unsigned char *new_data = (unsigned char *)realloc(m_data, m_size + length); - if (new_data == nullptr) + if (new_data == NULL) { // OOM - cleanup and fail Cleanup(); return false; @@ -102,31 +99,31 @@ bool CXBTFWriter::UpdateHeader(const std::vector& dupes) { - if (m_file == nullptr) + if (m_file == NULL) + { return false; + } - uint64_t headerSize = GetHeaderSize(); - uint64_t offset = headerSize; + uint64_t offset = m_xbtf.GetHeaderSize(); - WRITE_STR(XBTF_MAGIC.c_str(), 4, m_file); - WRITE_STR(XBTF_VERSION.c_str(), 1, m_file); + WRITE_STR(XBTF_MAGIC, 4, m_file); + WRITE_STR(XBTF_VERSION, 1, m_file); - auto files = GetFiles(); + std::vector& files = m_xbtf.GetFiles(); WRITE_U32(files.size(), m_file); for (size_t i = 0; i < files.size(); i++) { CXBTFFile& file = files[i]; - // Convert path to lower case and store it into a fixed size array because - // we need to store the path as a fixed length 256 byte character array. - std::string path = file.GetPath(); - char pathMem[CXBTFFile::MaximumPathLength]; - memset(pathMem, 0, sizeof(pathMem)); - - for (std::string::iterator ch = path.begin(); ch != path.end(); ++ch) - pathMem[std::distance(path.begin(), ch)] = tolower(*ch); + // Convert path to lower case + char* ch = file.GetPath(); + while (*ch) + { + *ch = tolower(*ch); + ch++; + } - WRITE_STR(pathMem, CXBTFFile::MaximumPathLength, m_file); + WRITE_STR(file.GetPath(), 256, m_file); WRITE_U32(file.GetLoop(), m_file); std::vector& frames = file.GetFrames(); @@ -154,9 +151,9 @@ // Sanity check int64_t pos = ftell(m_file); - if (pos != static_cast(headerSize)) + if (pos != (int64_t)m_xbtf.GetHeaderSize()) { - printf("Expected header size (%" PRIu64 ") != actual size (%" PRId64 ")\n", headerSize, pos); + printf("Expected header size (%" PRId64 ") != actual size (%" PRId64 ")\n", m_xbtf.GetHeaderSize(), pos); return false; } diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/XBTFWriter.h kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/XBTFWriter.h --- kodi-16.1~git20160425.1001-final/tools/depends/native/TexturePacker/src/XBTFWriter.h 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/native/TexturePacker/src/XBTFWriter.h 2015-10-19 08:39:15.000000000 +0000 @@ -25,14 +25,12 @@ #include #include -#include "guilib/XBTF.h" +class CXBTF; -class CXBTFWriter : public CXBTFBase +class CXBTFWriter { public: - CXBTFWriter(const std::string& outputFile); - ~CXBTFWriter(); - + CXBTFWriter(CXBTF& xbtf, const std::string& outputFile); bool Create(); bool Close(); bool AppendContent(unsigned char const* data, size_t length); @@ -41,6 +39,7 @@ private: void Cleanup(); + CXBTF& m_xbtf; std::string m_outputFile; FILE* m_file; unsigned char *m_data; diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/README kodi-15.2~git20151019.1039-final/tools/depends/README --- kodi-16.1~git20160425.1001-final/tools/depends/README 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/README 2015-10-19 08:39:15.000000000 +0000 @@ -29,27 +29,3 @@ Native toolchain ./configure --with-toolchain=/usr --prefix=/opt/xbmc-deps --host=x86_64-linux-gnu - -Details: - We build a native tools for platforms that do not have the native tools we need. OSX is - the largest builder of native tools as there is not much present. No cmake, no autotools, etc. - - Cross compiling is a real pain is the rear :) Generally there are three forms, - autotools (configure/make), cmake driven, and hand crafted makefile. In term - of usage, 90 percent are autotools, followed by cmake and hand crafted makefiles. - Some libs need patching, most do not. Lib versions are picked for a reason, be prepared - for robust testing if you go bumping libs. Never commit bumps unless you have also done - a complete distclean nuke of EVERYTHING and rebuild from scratch on ALL platforms. - Epic fail if this is not tested. - - 1) autotool driven tend to be simple PROVIDED the authors followed proper autotool format. - Try with $(CONFIGURE) 1st, if problem, try adding $(AUTORECONF) -vif before the - $(CONFIGURE). Some are do silly things and only a config.site can correct the errors. - So watch for this in the config.site.in. config.site rules and this is the only way - to handle bad autotool behavior. - - 2) cmake driven tend to be simple, setup cmake flags right and go. On rare cases, you might - need to diddle the native cmake setup. - - 3) hand crafted Makefiles typically require manual sed tweeks or patching. - diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/Backrow/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/Backrow/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/Backrow/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/Backrow/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,25 @@ +include ../../Makefile.include +DEPS= ../../Makefile.include + +SOURCE=Backrow +ARCHIVE=$(SOURCE).tar.gz +# Specific download location +BASE_URL=http://xbmc-for-atv2.googlecode.com/svn/trunk/Backrow + +all: .installed-$(PLATFORM) + +$(TARBALLS_LOCATION)/$(ARCHIVE): + cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) + +$(PLATFORM)/$(SOURCE): $(TARBALLS_LOCATION)/$(ARCHIVE) + mkdir -p $(PLATFORM)/$(SOURCE) + cd $(PLATFORM)/$(SOURCE);$(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + +.installed-$(PLATFORM): $(PLATFORM)/$(SOURCE) + mkdir -p $(PREFIX)/include + cp -pR $(PLATFORM)/$(SOURCE) $(PREFIX)/include/ + touch $@ + +clean: +distclean:: + rm -rf $(SOURCE) .installed-$(PLATFORM) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/config-binaddons.site.in kodi-15.2~git20151019.1039-final/tools/depends/target/config-binaddons.site.in --- kodi-16.1~git20160425.1001-final/tools/depends/target/config-binaddons.site.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/config-binaddons.site.in 2015-10-19 08:39:15.000000000 +0000 @@ -58,6 +58,14 @@ ac_cv_func_gethostbyname_r=no ac_cv_header_sys_un_h=yes +#rsxs/projectm +jm_cv_func_gettimeofday_clobber=no +mac_cv_pkg_ldflags=-lz +if test "@platform_os@" = "osx"; then + ac_cv_func_strnlen_working=no + ac_cv_header_stdbool_h=yes +fi + #gnutls gl_cv_func_gettimeofday_clobber=no diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/config.site.in kodi-15.2~git20151019.1039-final/tools/depends/target/config.site.in --- kodi-16.1~git20160425.1001-final/tools/depends/target/config.site.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/config.site.in 2015-10-19 08:39:15.000000000 +0000 @@ -66,6 +66,14 @@ ac_cv_func_gethostbyname_r=no ac_cv_header_sys_un_h=yes +#rsxs/projectm +jm_cv_func_gettimeofday_clobber=no +mac_cv_pkg_ldflags=-lz +if test "@platform_os@" = "osx"; then + ac_cv_func_strnlen_working=no + ac_cv_header_stdbool_h=yes +fi + #gnutls gl_cv_func_gettimeofday_clobber=no diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/crossguid/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/crossguid/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/crossguid/Makefile 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/crossguid/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ --include ../../Makefile.include -DEPS = Makefile - -# lib name, version -LIBNAME=crossguid -VERSION=8f399e8bd4 -SOURCE=$(LIBNAME)-$(VERSION) -ARCHIVE=$(SOURCE).tar.gz - - -ifeq ($(CROSS_COMPILING), yes) - DEPS += ../../Makefile.include -else - CXXFLAGS += -std=c++11 - ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) - - ifeq ($(PLATFORM),) - PLATFORM = native - TARBALLS_LOCATION = $(ROOT_DIR) - BASE_URL := http://mirrors.kodi.tv/build-deps/sources - RETRIEVE_TOOL := curl -Ls --create-dirs -f -O - ARCHIVE_TOOL := tar --strip-components=1 -xf - endif -endif - - -# define specifying the native GUID implementation to use -GUID_PLATFORM_DEFINE=GUID_LIBUUID -ifeq ($(OS),osx) - GUID_PLATFORM_DEFINE=GUID_CFUUID -endif -ifeq ($(OS),ios) - GUID_PLATFORM_DEFINE=GUID_CFUUID -endif - -LIBDYLIB=$(PLATFORM)/lib$(LIBNAME).a - -.PHONY: .installed-$(PLATFORM) - -all: .installed-$(PLATFORM) $(PREFIX)/lib/lib$(LIBNAME).a -$(PREFIX)/lib/lib$(LIBNAME).a: - @make .installed-$(PLATFORM) - -$(TARBALLS_LOCATION)/$(ARCHIVE): - cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) - -$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) -ifeq ($(PREFIX),) - @echo - @echo "ERROR: please set PREFIX to the kodi install path e.g. make PREFIX=/usr/local" - @exit 1 -endif - rm -rf $(PLATFORM); mkdir -p $(PLATFORM) - cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) - -$(LIBDYLIB): $(PLATFORM) - cd $(PLATFORM); $(CXX) -c guid.cpp -o guid.o $(CXXFLAGS) -D$(GUID_PLATFORM_DEFINE) - cd $(PLATFORM); $(AR) rvs lib$(LIBNAME).a guid.o - -.installed-$(PLATFORM): $(LIBDYLIB) - @[ -d $(PREFIX)/include ] || mkdir -p $(PREFIX)/include - @[ -d $(PREFIX)/lib ] || mkdir $(PREFIX)/lib - cp $(PLATFORM)/guid.h $(PREFIX)/include/ - cp $(LIBDYLIB) $(PREFIX)/lib/ - touch $@ - -clean: - rm -rf $(PLATFORM) .installed-$(PLATFORM) - -distclean:: - rm -rf $(PLATFORM) .installed-$(PLATFORM) - diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/ffmpeg/autobuild.sh kodi-15.2~git20151019.1039-final/tools/depends/target/ffmpeg/autobuild.sh --- kodi-16.1~git20160425.1001-final/tools/depends/target/ffmpeg/autobuild.sh 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/ffmpeg/autobuild.sh 2015-10-19 08:39:15.000000000 +0000 @@ -159,7 +159,6 @@ --disable-mips32r2 \ --disable-mipsdspr1 \ --disable-mipsdspr2 \ - --enable-libdcadec \ ${FLAGS} make -j ${BUILDTHREADS} Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/depends/target/ffmpeg/ffmpeg-2.6.4-Isengard.tar.gz and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/depends/target/ffmpeg/ffmpeg-2.6.4-Isengard.tar.gz differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/tools/depends/target/ffmpeg/ffmpeg-2.8.6-Jarvis-16.0.tar.gz and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/tools/depends/target/ffmpeg/ffmpeg-2.8.6-Jarvis-16.0.tar.gz differ diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/ffmpeg/FFMPEG-VERSION kodi-15.2~git20151019.1039-final/tools/depends/target/ffmpeg/FFMPEG-VERSION --- kodi-16.1~git20160425.1001-final/tools/depends/target/ffmpeg/FFMPEG-VERSION 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/ffmpeg/FFMPEG-VERSION 2015-10-19 08:39:15.000000000 +0000 @@ -1,5 +1,5 @@ LIBNAME=ffmpeg BASE_URL=https://github.com/xbmc/FFmpeg/archive -VERSION=2.8.6-Jarvis-16.0 +VERSION=2.6.4-Isengard ARCHIVE=$(LIBNAME)-$(VERSION).tar.gz diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/ffmpeg/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/ffmpeg/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/ffmpeg/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/ffmpeg/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -19,7 +19,6 @@ ffmpg_config += --enable-encoder=ac3 --enable-encoder=aac ffmpg_config += --enable-encoder=wmav2 --enable-protocol=http ffmpg_config += --enable-gnutls -ffmpg_config += --enable-libdcadec ifeq ($(CROSS_COMPILING), yes) ffmpg_config += --arch=$(CPU) --enable-cross-compile @@ -44,9 +43,8 @@ endif ifeq ($(OS), osx) ffmpg_config += --disable-outdev=sdl - ffmpg_config += --disable-decoder=mpeg_xvmc --enable-vda --disable-crystalhd --disable-videotoolbox + ffmpg_config += --disable-decoder=mpeg_xvmc --enable-vda --disable-crystalhd ffmpg_config += --target-os=darwin - ffmpg_config += --disable-securetransport endif ifeq ($(findstring arm, $(CPU)), arm) ffmpg_config += --enable-pic --disable-armv5te --disable-armv6t2 diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/giflib/01-android.patch kodi-15.2~git20151019.1039-final/tools/depends/target/giflib/01-android.patch --- kodi-16.1~git20160425.1001-final/tools/depends/target/giflib/01-android.patch 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/giflib/01-android.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ ---- lib/egif_lib.c Thu Aug 29 19:56:40 2013 -+++ lib/egif_libnew.c Thu Mar 13 10:08:38 2014 -@@ -22,6 +22,15 @@ - #endif /* _WIN32 */ - #include - -+#if defined(ANDROID) -+#if !defined(S_IREAD) -+#define S_IREAD S_IRUSR -+#endif -+#if !defined(S_IWRITE) -+#define S_IWRITE S_IWUSR -+#endif -+#endif -+ - #include "gif_lib.h" - #include "gif_lib_private.h" - diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/giflib/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/giflib/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/giflib/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/giflib/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -include ../../Makefile.include -DEPS= ../../Makefile.include Makefile - -# lib name, version -LIBNAME=giflib -VERSION=5.1.0 -SOURCE=$(LIBNAME)-$(VERSION) -ARCHIVE=$(SOURCE).tar.bz2 - -# configuration settings -CONFIGURE=./configure --prefix=$(PREFIX) - -LIBDYLIB=$(PLATFORM)/lib/.libs/$(LIBNAME).a - -CLEAN_FILES=$(ARCHIVE) $(PLATFORM) - -all: .installed-$(PLATFORM) - -$(TARBALLS_LOCATION)/$(ARCHIVE): - cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) - -$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) - -rm -rf $(PLATFORM); mkdir -p $(PLATFORM) - cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) -ifeq ($(OS),android) - cd $(PLATFORM); patch -p0 < ../01-android.patch -endif - cd $(PLATFORM); $(CONFIGURE) - -$(LIBDYLIB): $(PLATFORM) - $(MAKE) -C $(PLATFORM) - -.installed-$(PLATFORM): $(LIBDYLIB) - $(MAKE) -C $(PLATFORM) install -ifeq ($(OS),android) - rm -f $(PREFIX)/lib/libgif.la $(PREFIX)/lib/libgif.so $(PREFIX)/lib/libgif.so.7 - mv -f $(PREFIX)/lib/libgif.so.7.0.0 $(PREFIX)/lib/libgif.so - $(RPL) -e "libgif.so.7" "libgif.so\x00\x00" $(PREFIX)/lib/libgif.so - -$(READELF) --dynamic $(PREFIX)/lib/libgif.so | grep ibrary -endif - touch $@ -clean: - $(MAKE) -C $(PLATFORM) clean - rm -r .installed-$(PLATFORM) - rm -rf $(PLATFORM) - -distclean:: - rm -rf $(PLATFORM) .installed-$(PLATFORM) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/gmp/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/gmp/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/gmp/Makefile 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/gmp/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -21,9 +21,6 @@ ifeq ($(OS),ios) CONFIGURE_FLAGS=CC_FOR_BUILD=llvm-gcc CPP_FOR_BUILD="llvm-gcc -E" --disable-assembly endif -ifeq ($(OS),osx) -CONFIGURE_FLAGS=--with-pic -endif # configuration settings CONFIGURE=cp -f $(CONFIG_SUB) $(CONFIG_GUESS) .; \ diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libbluray/android.patch kodi-15.2~git20151019.1039-final/tools/depends/target/libbluray/android.patch --- kodi-16.1~git20160425.1001-final/tools/depends/target/libbluray/android.patch 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libbluray/android.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - src/file/mount.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/file/mount.c b/src/file/mount.c -index 6382d8b..4f5392a 100644 ---- a/src/file/mount.c -+++ b/src/file/mount.c -@@ -44,6 +44,7 @@ char *mount_get_mountpoint(const char *device_path) - return str_dup(device_path); - } - -+#ifndef ANDROID - FILE *f = setmntent ("/proc/self/mounts", "r"); - if (f) { - struct mntent* m; -@@ -61,6 +62,7 @@ char *mount_get_mountpoint(const char *device_path) - } - endmntent (f); - } -+#endif - #endif /* HAVE_MNTENT_H */ - - return str_dup(device_path); diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libbluray/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/libbluray/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/libbluray/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libbluray/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -3,14 +3,13 @@ # lib name, version LIBNAME=libbluray -VERSION=0.8.1 +VERSION=0.2.1 SOURCE=$(LIBNAME)-$(VERSION) ARCHIVE=$(SOURCE).tar.bz2 # configuration settings CONFIGURE=./configure --prefix=$(PREFIX) --exec-prefix=$(PREFIX) \ - --disable-examples --disable-doxygen-doc \ - --disable-bdjava --without-libxml2 --without-freetype + --disable-examples --disable-doxygen-doc LIBDYLIB=$(PLATFORM)/src/.libs/libbluray.la @@ -23,10 +22,8 @@ rm -rf $(PLATFORM); mkdir -p $(PLATFORM) cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) # libbluray has borked Makefile.am with respect to CFLAGS, remove the offending line - sed -i -e "s|CFLAGS=|#CFLAGS=|" $(PLATFORM)/Makefile.am -ifeq ($(OS),android) - cd $(PLATFORM); patch -p1 < ../android.patch -endif + sed -i -e "s|CFLAGS=|#CFLAGS=|" $(PLATFORM)/src/Makefile.am + sed -i -e "s|CFLAGS=|#CFLAGS=|" $(PLATFORM)/src/examples/Makefile.am cd $(PLATFORM); ./bootstrap cd $(PLATFORM); $(CONFIGURE) @@ -37,7 +34,7 @@ $(MAKE) -C $(PLATFORM) install ifeq ($(OS),android) rm -f $(PREFIX)/lib/libbluray.la $(PREFIX)/lib/libbluray.so $(PREFIX)/lib/libbluray.so.1 - mv -f $(PREFIX)/lib/libbluray.so.1.8.1 $(PREFIX)/lib/libbluray.so + mv -f $(PREFIX)/lib/libbluray.so.1.0.0 $(PREFIX)/lib/libbluray.so $(RPL) -e "libbluray.so.1" "libbluray.so\x00\x00" $(PREFIX)/lib/libbluray.so -$(READELF) --dynamic $(PREFIX)/lib/libbluray.so | grep ibrary endif diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libdcadec/libdcadec_android.patch kodi-15.2~git20151019.1039-final/tools/depends/target/libdcadec/libdcadec_android.patch --- kodi-16.1~git20160425.1001-final/tools/depends/target/libdcadec/libdcadec_android.patch 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libdcadec/libdcadec_android.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -diff --git a/libdcadec/dca_stream.c b/libdcadec/dca_stream.c -index 156f874..acbd139 100644 ---- a/libdcadec/dca_stream.c -+++ b/libdcadec/dca_stream.c -@@ -37,7 +37,7 @@ - #if (defined _WIN32) - #define DCA_FGETC _fgetc_nolock - #elif (defined _BSD_SOURCE) --#define DCA_FGETC fgetc_unlocked -+#define DCA_FGETC fgetc - #else - #define DCA_FGETC fgetc - #endif diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libdcadec/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/libdcadec/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/libdcadec/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libdcadec/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ --include ../../Makefile.include -DEPS= Makefile - -# lib name, version -LIBNAME=libdcadec -VERSION=git-2a9186e3 -SOURCE=$(LIBNAME)-$(VERSION) -ARCHIVE=$(SOURCE).tar.gz - -ifeq ($(CROSS_COMPILING), yes) - DEPS += ../../Makefile.include libdcadec_android.patch - EXTRA_FLAGS = CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" AR="$(AR)" -else - ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) - - ifeq ($(PLATFORM),) - PLATFORM = native - TARBALLS_LOCATION = $(ROOT_DIR) - BASE_URL := http://mirrors.kodi.tv/build-deps/sources - RETRIEVE_TOOL := curl -Ls --create-dirs -f -O - ARCHIVE_TOOL := tar --strip-components=1 -xf - endif -endif - - -# configuration settings - -LIBDYLIB=$(PLATFORM)/.libs/$(LIBNAME).a - -CFLAGS += -std=gnu99 - -all: $(LIBDYLIB) .installed-$(PLATFORM) - -$(TARBALLS_LOCATION)/$(ARCHIVE): - cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) - -$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) -ifeq ($(PREFIX),) - @echo - @echo "ERROR: please set PREFIX to the kodi install path e.g. make PREFIX=/usr/local" - @exit 1 -endif - - rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) - cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) -ifeq ($(OS),android) - cd $(PLATFORM); patch -p1 < ../libdcadec_android.patch -endif - -$(LIBDYLIB): $(PLATFORM) - $(MAKE) -C $(PLATFORM) PREFIX=$(PREFIX) $(EXTRA_FLAGS) - -.installed-$(PLATFORM): $(LIBDYLIB) - $(MAKE) -C $(PLATFORM) PREFIX=$(PREFIX) $(EXTRA_FLAGS) install - touch $@ - -clean: - $(MAKE) -C $(PLATFORM) clean - rm -f .installed-$(PLATFORM) - -distclean:: - rm -rf $(PLATFORM) .installed-$(PLATFORM) libdcadec-*.tar.gz diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libgpg-error/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/libgpg-error/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/libgpg-error/Makefile 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libgpg-error/Makefile 2013-12-14 01:01:43.000000000 +0000 @@ -3,7 +3,7 @@ # lib name, version LIBNAME=libgpg-error -VERSION=1.20 +VERSION=1.12 SOURCE=$(LIBNAME)-$(VERSION) ARCHIVE=$(SOURCE).tar.bz2 @@ -27,14 +27,6 @@ cd $(PLATFORM); $(CONFIGURE) $(LIBDYLIB): $(PLATFORM) -ifeq ($(OS),osx) - $(MAKE) -C $(PLATFORM)/src gen-posix-lock-obj - $(PLATFORM)/src/gen-posix-lock-obj > $(PLATFORM)/src/syscfg/tmp.h - mv $(PLATFORM)/src/syscfg/tmp.h $(PLATFORM)/src/syscfg/$$(awk 'NR==1 {print $$2}' $(PLATFORM)/src/syscfg/tmp.h) -endif -ifeq ($(OS),android) - cp $(PLATFORM)/src/syscfg/lock-obj-pub.arm-unknown-linux-androideabi.h $(PLATFORM)/src/syscfg/lock-obj-pub.linux-android.h -endif $(MAKE) -C $(PLATFORM) .installed-$(PLATFORM): $(LIBDYLIB) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libmp3lame/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/libmp3lame/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/libmp3lame/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libmp3lame/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,41 @@ +include ../../Makefile.include +DEPS= ../../Makefile.include Makefile + +# lib name, version +LIBNAME=lame +VERSION=3.99.5 +SOURCE=$(LIBNAME)-$(VERSION) +ARCHIVE=$(SOURCE).tar.gz + +# configuration settings +CONFIGURE=cp -f $(CONFIG_SUB) $(CONFIG_GUESS) .; \ + ./configure --prefix=$(PREFIX) --disable-gtktest --disable-frontend --disable-decoder + +LIBDYLIB=$(PLATFORM)/libmp3lame/.libs/libmp3lame.a + +CLEAN_FILES=$(ARCHIVE) $(PLATFORM) + +all: .installed-$(PLATFORM) + +$(TARBALLS_LOCATION)/$(ARCHIVE): + cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) + +$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) + rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) + cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + cd $(PLATFORM); $(CONFIGURE) + +$(LIBDYLIB): $(PLATFORM) + $(MAKE) -C $(PLATFORM)/libmp3lame + +.installed-$(PLATFORM): $(LIBDYLIB) + $(MAKE) -C $(PLATFORM)/include install + $(MAKE) -C $(PLATFORM)/libmp3lame install + touch $@ + +clean: + $(MAKE) -C $(PLATFORM) clean + rm -f .installed-$(PLATFORM) + +distclean:: + rm -rf $(PLATFORM) .installed-$(PLATFORM) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libshairplay/02-fixipv4ipv6race.patch kodi-15.2~git20151019.1039-final/tools/depends/target/libshairplay/02-fixipv4ipv6race.patch --- kodi-16.1~git20160425.1001-final/tools/depends/target/libshairplay/02-fixipv4ipv6race.patch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libshairplay/02-fixipv4ipv6race.patch 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,27 @@ +From ac9240fa569df5a10d534a4cd45740a44ee00f63 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Juho=20V=C3=A4h=C3=A4-Herttua?= +Date: Mon, 24 Mar 2014 20:35:29 +0200 +Subject: [PATCH] Fix #23 on issue tracker. + +There is a race condition if IPv4 and IPv6 connections come at the same time. +--- + src/lib/httpd.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/lib/httpd.c b/src/lib/httpd.c +index 1d9e7e2..f081c5e 100644 +--- a/src/lib/httpd.c ++++ b/src/lib/httpd.c +@@ -237,7 +237,8 @@ struct httpd_s { + continue; + } + } +- if (httpd->server_fd6 != -1 && FD_ISSET(httpd->server_fd6, &rfds)) { ++ if (httpd->open_connections < httpd->max_connections && ++ httpd->server_fd6 != -1 && FD_ISSET(httpd->server_fd6, &rfds)) { + ret = httpd_accept_connection(httpd, httpd->server_fd6, 1); + if (ret == -1) { + break; +-- +1.8.5.5 + diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libshairplay/03-fixpasswordauthitunes.patch kodi-15.2~git20151019.1039-final/tools/depends/target/libshairplay/03-fixpasswordauthitunes.patch --- kodi-16.1~git20160425.1001-final/tools/depends/target/libshairplay/03-fixpasswordauthitunes.patch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libshairplay/03-fixpasswordauthitunes.patch 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,22 @@ +From 8e6795779558d2828aef14078fefbcadd5323fa6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Juho=20V=C3=A4h=C3=A4-Herttua?= +Date: Mon, 24 Mar 2014 21:43:59 +0200 +Subject: [PATCH] Make password authentication work on iTunes again, fixes #20. + +--- + src/lib/raop.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +diff --git a/src/lib/raop.c b/src/lib/raop.c +index e5c6539..a58e92f 100644 +--- a/src/lib/raop.c.orig 2013-04-17 15:17:49.000000000 +0200 ++++ b/src/lib/raop.c 2014-03-24 23:22:30.000000000 +0100 +@@ -139,7 +139,7 @@ + } + + res = http_response_init("RTSP/1.0", 200, "OK"); +- if (strlen(raop->password)) { ++ if (strcmp(method, "OPTIONS") && strlen(raop->password)) { + const char *authorization; + + authorization = http_request_get_header(request, "Authorization"); diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libshairplay/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/libshairplay/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/libshairplay/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libshairplay/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -3,7 +3,7 @@ # lib name, version LIBNAME=shairplay -VERSION=498bc5b +VERSION=139d5ef SOURCE=$(LIBNAME)-$(VERSION) ARCHIVE=$(SOURCE).tar.bz2 @@ -21,6 +21,11 @@ $(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) rm -rf $(PLATFORM); mkdir -p $(PLATFORM) cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) +ifeq ($(OS),ios) + cd $(PLATFORM); patch -p1 < ../xcode-llmvfix.patch +endif + cd $(PLATFORM); patch -p1 < ../02-fixipv4ipv6race.patch + cd $(PLATFORM); patch -p1 < ../03-fixpasswordauthitunes.patch cd $(PLATFORM); $(AUTORECONF) -vif cd $(PLATFORM); $(CONFIGURE) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libshairplay/xcode-llmvfix.patch kodi-15.2~git20151019.1039-final/tools/depends/target/libshairplay/xcode-llmvfix.patch --- kodi-16.1~git20160425.1001-final/tools/depends/target/libshairplay/xcode-llmvfix.patch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libshairplay/xcode-llmvfix.patch 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,18 @@ +--- a/src/lib/dnssd.c 2013-10-26 16:39:10.000000000 -0400 ++++ b/src/lib/dnssd.c 2013-10-26 16:38:32.000000000 -0400 +@@ -12,6 +12,13 @@ + * Lesser General Public License for more details. + */ + ++#ifndef __has_feature // Optional of course. ++ #define __has_feature(x) 0 // Compatibility with non-clang compilers. ++#endif ++#ifndef __has_extension ++ #define __has_extension __has_feature // Compatibility with pre-3.0 compilers. ++#endif ++ + #include + #include + #include + + diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libssh/fix-gcc-5-compile.patch kodi-15.2~git20151019.1039-final/tools/depends/target/libssh/fix-gcc-5-compile.patch --- kodi-16.1~git20160425.1001-final/tools/depends/target/libssh/fix-gcc-5-compile.patch 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libssh/fix-gcc-5-compile.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ ---- include/libssh/pki_priv.h 2015-11-05 09:39:40.011875890 +0100 -+++ include/libssh/pki_priv.h 2015-11-05 09:39:34.151849945 +0100 -@@ -29,7 +29,7 @@ - #define ECDSA_HEADER_END "-----END EC PRIVATE KEY-----" - - #define ssh_pki_log(...) \ -- _ssh_pki_log(__FUNCTION__, __VA_ARGS__) -+ _ssh_pki_log(__extension__ __FUNCTION__, __VA_ARGS__) - void _ssh_pki_log(const char *function, - const char *format, ...) PRINTF_ATTRIBUTE(2, 3); - ---- include/libssh/priv.h 2015-11-05 09:39:40.011875890 +0100 -+++ include/libssh/priv.h 2015-11-05 09:41:01.272239916 +0100 -@@ -179,7 +179,7 @@ - const char *function, - const char *buffer); - #define SSH_LOG(priority, ...) \ -- _ssh_log(priority, __FUNCTION__, __VA_ARGS__) -+ _ssh_log(priority, __extension__ __FUNCTION__, __VA_ARGS__) - - /* LEGACY */ - void ssh_log_common(struct ssh_common_struct *common, -@@ -197,18 +197,18 @@ - }; - - #define ssh_set_error(error, code, ...) \ -- _ssh_set_error(error, code, __FUNCTION__, __VA_ARGS__) -+ _ssh_set_error(error, code, __extension__ __FUNCTION__, __VA_ARGS__) - void _ssh_set_error(void *error, - int code, - const char *function, - const char *descr, ...) PRINTF_ATTRIBUTE(4, 5); - - #define ssh_set_error_oom(error) \ -- _ssh_set_error_oom(error, __FUNCTION__) -+ _ssh_set_error_oom(error, __extension__ __FUNCTION__) - void _ssh_set_error_oom(void *error, const char *function); - - #define ssh_set_error_invalid(error) \ -- _ssh_set_error_invalid(error, __FUNCTION__) -+ _ssh_set_error_invalid(error, __extension__ __FUNCTION__) - void _ssh_set_error_invalid(void *error, const char *function); - - ---- src/auth.c 2014-12-27 11:30:13.000000000 +0100 -+++ src/auth.c 2015-11-05 09:42:41.732698584 +0100 -@@ -1548,7 +1548,7 @@ - * This should not happen - */ - rc = SSH_AUTH_ERROR; -- ssh_set_error(session,SSH_FATAL,"Invalid state in %s", __FUNCTION__); -+ ssh_set_error(session,SSH_FATAL,"Invalid state in %s", __extension__ __FUNCTION__); - } - return rc; - } diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libssh/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/libssh/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/libssh/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libssh/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -23,8 +23,7 @@ cd $(PLATFORM); patch -p0 < ../ntohl.patch cd $(PLATFORM); patch -p0 < ../md5.patch cd $(PLATFORM); patch -p1 < ../darwin.patch - cd $(PLATFORM); patch -p0 < ../fix-gcc-5-compile.patch - sed -ie "s|-fstack-protector|-fno-stack-protector|" "$(PLATFORM)/cmake/Modules/DefineCompilerFlags.cmake" + sed -ie "s|-fstack-protector|-fnostack-protector|" "$(PLATFORM)/cmake/Modules/DefineCompilerFlags.cmake" sed -ie "s|add_subdirectory(examples)||" "$(PLATFORM)/CMakeLists.txt" cd $(PLATFORM)/build; $(CMAKE) -DWITH_STATIC_LIB=1 -DWITH_EXAMPLES=0 -DTHREADS_PTHREAD_ARG=0 -DWITH_GSSAPI=0 VERBOSE=1 .. @@ -35,7 +34,6 @@ make -C $(PLATFORM)/build install rm -f $(PREFIX)/lib/libssh.so $(PREFIX)/lib/libssh.so.4.3.0 $(PREFIX)/lib/libssh.so.4 rm -f $(PREFIX)/lib/libssh.*dylib* - rm -f $(PREFIX)/lib/libssh_threads.*dylib* touch $@ clean: diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/libuuid/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/libuuid/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/libuuid/Makefile 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/libuuid/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -include ../../Makefile.include -DEPS= ../../Makefile.include Makefile - -# We use uuid from e2fsprogs since this easily cross-compiles on android, while util-linux does not. -# lib name, version -LIBNAME=libuuid -VERSION=1.42.13 -SOURCE=e2fsprogs-1.42.13 -ARCHIVE=$(SOURCE).tar.xz - - -LIBDYLIB=$(PLATFORM)/lib/$(LIBNAME).a - -all: .installed-$(PLATFORM) - -$(TARBALLS_LOCATION)/$(ARCHIVE): - cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) - -$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) - rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) - cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) - cd $(PLATFORM); ./configure --prefix=$(PREFIX) --disable-fsck - -$(LIBDYLIB): $(PLATFORM) - cd $(PLATFORM)/lib/uuid ; $(MAKE) -j1 - -.installed-$(PLATFORM): $(LIBDYLIB) - cd $(PLATFORM)/lib/uuid ; $(MAKE) -j1 install - touch $@ - -clean: - $(MAKE) -C $(PLATFORM) clean - rm -f .installed-$(PLATFORM) - -distclean:: - rm -rf $(PLATFORM) .installed-$(PLATFORM) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -14,10 +14,10 @@ libmodplug librtmp libxml2 yajl libmicrohttpd mysql libffi \ python26 libshairplay \ libplist libcec libbluray boost tinyxml dummy-libxbmc \ - libamplayer libssh taglib libusb libnfs \ - pythonmodule-pil libxslt ffmpeg platform crossguid libdcadec giflib + libamplayer libssh taglib libusb libnfs libmp3lame \ + pythonmodule-pil libxslt ffmpeg platform -FFMPEG_DEPENDS = gnutls libdcadec +FFMPEG_DEPENDS = gnutls ifeq ($(ENABLE_GPLV3),yes) DEPENDS+=samba-gplv3 libcdio-gplv3 @@ -26,6 +26,7 @@ endif ifeq ($(OS),ios) + DEPENDS += Backrow EXCLUDED_DEPENDS = libcec libusb endif @@ -35,8 +36,7 @@ endif ifeq ($(OS),android) - DEPENDS += mdnsresponder android-sources-ics google-breakpad libuuid - CROSSGUID_DEPS = libuuid + DEPENDS += mdnsresponder android-sources-ics google-breakpad endif DEPENDS := $(filter-out $(EXCLUDED_DEPENDS),$(DEPENDS)) @@ -56,7 +56,6 @@ ALSA_LIB= LINUX_SYSTEM_LIBS= ifeq ($(OS),linux) - DEPENDS += libuuid #not for raspberry pi ifneq ($(TARGET_PLATFORM),raspberry-pi) DEPENDS += libsdl2 linux-system-libs @@ -64,7 +63,6 @@ endif DEPENDS += alsa-lib ALSA_LIB = alsa-lib - CROSSGUID_DEPS = libuuid endif .PHONY: $(DEPENDS) @@ -87,9 +85,10 @@ libcdio: $(ICONV) libplist: libxml2 $(ZLIB) libbluray: $(ICONV) libxml2 -libssh: openssl $(ZLIB) +libssh: openssl mysql: openssl libzip: $(ZLIB) +libmp3lame: $(ICONV) libpng: $(ZLIB) openssl: $(ZLIB) gnutls: nettle $(ZLIB) @@ -99,7 +98,6 @@ libxslt: libgcrypt ffmpeg: $(ICONV) $(ZLIB) bzip2 libvorbis $(FFMPEG_DEPENDS) libcec: platform -crossguid: $(CROSSGUID_DEPS) .installed-$(PLATFORM): $(DEPENDS) touch $@ diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/samba-gplv3/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/samba-gplv3/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/samba-gplv3/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/samba-gplv3/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -50,8 +50,7 @@ .installed-$(PLATFORM): $(LIBDYLIB) $(MAKE) -C $(PLATFORM)/source3 installlibsmbclient ifeq (darwin, $(findstring darwin, $(HOST))) - mv $(PREFIX)/lib/libsmbclient.dylib.0 $(PREFIX)/lib/libsmbclient.dylib - install_name_tool -id $(PREFIX)/lib/libsmbclient.dylib $(PREFIX)/lib/libsmbclient.dylib + install_name_tool -id $(PREFIX)/lib/libsmbclient.dylib.0 $(PREFIX)/lib/libsmbclient.dylib.0 endif ifeq ($(OS),android) rm -f $(PREFIX)/lib/libsmbclient.so diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/sqlite3/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/sqlite3/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/sqlite3/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/sqlite3/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -9,7 +9,7 @@ # configuration settings export CXXFLAGS+=-DSQLITE_ENABLE_COLUMN_METADATA=1 -export CFLAGS+=-DSQLITE_TEMP_STORE=3 -DSQLITE_DEFAULT_MMAP_SIZE=0x10000000 +export CFLAGS+=-DSQLITE_TEMP_STORE=3 export TCLLIBDIR=/dev/null CONFIGURE=cp -f $(CONFIG_SUB) $(CONFIG_GUESS) .; \ ./configure --prefix=$(PREFIX) --disable-shared \ @@ -30,10 +30,6 @@ ifeq ($(OS),android) cd $(PLATFORM); patch -p0 < ../fix-32bits-on-64bits.patch endif -# seems MAP_POPULATE is broken on aarch64 -ifneq ($(OS),android) - cd $(PLATFORM); patch -p1 < ../sqlite3.c.patch -endif cd $(PLATFORM); $(CONFIGURE) $(LIBDYLIB): $(PLATFORM) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/sqlite3/sqlite3.c.patch kodi-15.2~git20151019.1039-final/tools/depends/target/sqlite3/sqlite3.c.patch --- kodi-16.1~git20160425.1001-final/tools/depends/target/sqlite3/sqlite3.c.patch 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/sqlite3/sqlite3.c.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -diff --git a/sqlite3.c b/sqlite3.c -index 1344938..c437252 100644 ---- a/sqlite3.c -+++ b/sqlite3.c -@@ -30750,7 +30750,11 @@ static void unixRemapfile( - pNew = osMremap(pOrig, nReuse, nNew, MREMAP_MAYMOVE); - zErr = "mremap"; - #else -+#if defined(MAP_POPULATE) -+ pNew = osMmap(pReq, nNew-nReuse, flags, MAP_SHARED | MAP_POPULATE, h, nReuse); -+#else - pNew = osMmap(pReq, nNew-nReuse, flags, MAP_SHARED, h, nReuse); -+#endif - if( pNew!=MAP_FAILED ){ - if( pNew!=pReq ){ - osMunmap(pNew, nNew - nReuse); -@@ -30769,7 +30773,11 @@ static void unixRemapfile( - - /* If pNew is still NULL, try to create an entirely new mapping. */ - if( pNew==0 ){ -+#if defined(MAP_POPULATE) -+ pNew = osMmap(0, nNew, flags, MAP_SHARED | MAP_POPULATE, h, 0); -+#else - pNew = osMmap(0, nNew, flags, MAP_SHARED, h, 0); -+#endif - } - - if( pNew==MAP_FAILED ){ diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/Toolchain_binaddons.cmake.in kodi-15.2~git20151019.1039-final/tools/depends/target/Toolchain_binaddons.cmake.in --- kodi-16.1~git20160425.1001-final/tools/depends/target/Toolchain_binaddons.cmake.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/Toolchain_binaddons.cmake.in 2015-10-19 08:39:15.000000000 +0000 @@ -12,8 +12,6 @@ if("${OS}" STREQUAL "android") set(CORE_SYSTEM_NAME android) list(APPEND CMAKE_FIND_ROOT_PATH @use_toolchain@/sysroot/usr) -elseif("${OS}" STREQUAL "osx") - set(CORE_SYSTEM_NAME osx) elseif("${OS}" STREQUAL "ios") set(CORE_SYSTEM_NAME ios) elseif("${PLATFORM}" STREQUAL "raspberry-pi") @@ -26,9 +24,9 @@ if("${OS}" STREQUAL "ios" OR "${OS}" STREQUAL "osx") set(CMAKE_OSX_SYSROOT @use_sdk_path@) - list(APPEND CMAKE_FIND_ROOT_PATH ${CMAKE_OSX_SYSROOT} ${CMAKE_OSX_SYSROOT}/usr /usr/X11R6) - set(CMAKE_LIBRARY_PATH @CMAKE_FIND_ROOT_PATH@/lib:@use_sdk_path@/lib:/usr/X11R6/lib) - set(CMAKE_INCLUDE_PATH @CMAKE_FIND_ROOT_PATH@/include:@use_sdk_path@/include:/usr/X11R6/include) + list(APPEND CMAKE_FIND_ROOT_PATH ${CMAKE_OSX_SYSROOT} ${CMAKE_OSX_SYSROOT}/usr) + set(CMAKE_LIBRARY_PATH @CMAKE_FIND_ROOT_PATH@/lib:@use_sdk_path@/lib) + set(CMAKE_INCLUDE_PATH @CMAKE_FIND_ROOT_PATH@/include:@use_sdk_path@/include) endif() # specify the cross compiler @@ -39,11 +37,10 @@ set(CMAKE_C_FLAGS "@platform_cflags@ @platform_includes@") set(CMAKE_CXX_FLAGS "@platform_cxxflags@ @platform_includes@") set(CMAKE_CPP_FLAGS "@platform_cflags@ @platform_includes@") -set(CMAKE_LD_FLAGS "@platform_ldflags@") set(ENV{CFLAGS} ${CMAKE_C_FLAGS}) set(ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS}) set(ENV{CPPFLAGS} ${CMAKE_CPP_FLAGS}) -set(ENV{LDFLAGS} ${CMAKE_LD_FLAGS}) +SET(ENV{LDFLAGS} "@platform_ldflags@") # search for programs in the build host directories set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/target/xbmc/Makefile kodi-15.2~git20151019.1039-final/tools/depends/target/xbmc/Makefile --- kodi-16.1~git20160425.1001-final/tools/depends/target/xbmc/Makefile 2016-04-24 12:10:26.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/target/xbmc/Makefile 2015-10-19 08:38:32.000000000 +0000 @@ -13,7 +13,7 @@ ./configure --prefix=$(PREFIX) $(DEBUG) ifeq ($(OS),android) -CONFIGURE += --enable-codec=amcodec --enable-breakpad --disable-libcec +CONFIGURE += --enable-codec=libstagefright,amcodec --enable-breakpad endif ifeq ($(Configuration),Release) diff -Nru kodi-16.1~git20160425.1001-final/tools/depends/xbmc-addons.include kodi-15.2~git20151019.1039-final/tools/depends/xbmc-addons.include --- kodi-16.1~git20160425.1001-final/tools/depends/xbmc-addons.include 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/depends/xbmc-addons.include 2015-10-19 08:39:15.000000000 +0000 @@ -22,7 +22,7 @@ CMAKE_EXTRA = ifeq (darwin, $(findstring darwin, $(HOST))) INSTALL_PREFIX = ../../../../../addons/ - CMAKE_EXTRA = -DPACKAGE_ZIP=ON + CMAKE_EXTRA = -DPACKAGE_ZIP=1 endif ifneq ($(PREFIX),) @@ -74,23 +74,22 @@ linux-system-libs: mkdir -p $(ADDON_DEPS_DIR)/lib/pkgconfig $(ADDON_DEPS_DIR)/include - [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/x11.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/x*.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/ - [ -f $(ADDON_DEPS_DIR)/lib/libX11.so ] || ln -s /usr/lib/$(HOST)/libX11.so* $(ADDON_DEPS_DIR)/lib/ - [ -L $(ADDON_DEPS_DIR)/include/X11 ] || ln -s /usr/include/X11 $(ADDON_DEPS_DIR)/include/X11 - [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/xproto.pc ] || ln -s /usr/share/pkgconfig/x*.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/ + [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/x11.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/x11.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/x11.pc + [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/xproto.pc ] || ln -s /usr/share/pkgconfig/xproto.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/xproto.pc [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/kbproto.pc ] || ln -s /usr/share/pkgconfig/kbproto.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/kbproto.pc - [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/damageproto.pc ] || ln -s /usr/share/pkgconfig/damageproto.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/damageproto.pc - [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/fixesproto.pc ] || ln -s /usr/share/pkgconfig/fixesproto.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/fixesproto.pc + [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/xcb.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/xcb.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/xcb.pc [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/pthread-stubs.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/pthread-stubs.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/pthread-stubs.pc + [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/xau.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/xau.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/xau.pc + [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/xdmcp.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/xdmcp.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/xdmcp.pc + [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/xext.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/xext.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/xext.pc + [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/xextproto.pc ] || ln -s /usr/share/pkgconfig/xextproto.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/xextproto.pc + [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/xt.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/xt.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/xt.pc [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/ice.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/ice.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/ice.pc [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/sm.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/sm.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/sm.pc + [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/xmu.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/xmu.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/xmu.pc [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/libdrm.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/libdrm.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/libdrm.pc [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/gl.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/gl.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/gl.pc - [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/glu.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/glu.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/glu.pc - [ -f $(ADDON_DEPS_DIR)/lib/pkgconfig/glew.pc ] || ln -s /usr/lib/$(HOST)/pkgconfig/glew.pc $(ADDON_DEPS_DIR)/lib/pkgconfig/glew.pc [ -f $(ADDON_DEPS_DIR)/lib/libGL.so ] || \ (ln -s /usr/lib/$(HOST)/mesa $(ADDON_DEPS_DIR)/lib/mesa && ln -s $(ADDON_DEPS_DIR)/lib/mesa/libGL.so $(ADDON_DEPS_DIR)/lib/libGL.so) - [ -f $(ADDON_DEPS_DIR)/lib/libGLEW.so ] || ln -s /usr/lib/$(HOST)/libGLEW.so* $(ADDON_DEPS_DIR)/lib/ - [ -L $(ADDON_DEPS_DIR)/include/GL ] || ln -s /usr/include/GL $(ADDON_DEPS_DIR)/include/GL - [ -f $(ADDON_DEPS_DIR)/lib/libm.so ] || ln -s /usr/lib/$(HOST)/libm.so $(ADDON_DEPS_DIR)/lib/ + [ -f $(ADDON_DEPS_DIR)/include/GL ] || ln -s /usr/include/GL $(ADDON_DEPS_DIR)/include/GL diff -Nru kodi-16.1~git20160425.1001-final/tools/EventClients/Clients/Kodi Send/kodi-send.py kodi-15.2~git20151019.1039-final/tools/EventClients/Clients/Kodi Send/kodi-send.py --- kodi-16.1~git20160425.1001-final/tools/EventClients/Clients/Kodi Send/kodi-send.py 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/EventClients/Clients/Kodi Send/kodi-send.py 2015-10-19 08:39:15.000000000 +0000 @@ -19,13 +19,13 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # -import sys, os +import sys import getopt from socket import * try: from kodi.xbmcclient import * except: - sys.path.append(os.path.join(os.path.realpath(os.path.dirname(__file__)), '../../lib/python')) + sys.path.append('../../lib/python') from xbmcclient import * def usage(): diff -Nru kodi-16.1~git20160425.1001-final/tools/Linux/kodi.desktop kodi-15.2~git20151019.1039-final/tools/Linux/kodi.desktop --- kodi-16.1~git20160425.1001-final/tools/Linux/kodi.desktop 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/Linux/kodi.desktop 2015-10-19 08:39:15.000000000 +0000 @@ -1,7 +1,7 @@ [Desktop Entry] Version=1.0 -Name=Kodi media center -GenericName=Media center +Name=Kodi Media Center +GenericName=Media Center Comment=Manage and view your media Exec=kodi Icon=kodi diff -Nru kodi-16.1~git20160425.1001-final/tools/Linux/kodi.sh.in kodi-15.2~git20151019.1039-final/tools/Linux/kodi.sh.in --- kodi-16.1~git20160425.1001-final/tools/Linux/kodi.sh.in 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/Linux/kodi.sh.in 2015-10-19 08:39:15.000000000 +0000 @@ -45,7 +45,7 @@ migrate_home() { - [ "$(basename $0)" = "xbmc" ] && echo "WARNING: Running ${bin_name} as "xbmc" is deprecated and will be removed in later versions, please switch to using the ${bin_name} binary" + [ "$(basename $0)" = "xbmc" ] && echo "WARNING: running ${bin_name} as "xbmc" is deprecated and will be removed in later versions, please switch to using the ${bin_name} binary" #check if data migration is needed if [ -d "${HOME}/.xbmc" ] && [ ! -d "${USERDATA_DIR}" ]; then @@ -78,14 +78,14 @@ echo "############## $APP CRASH LOG ###############" >> $FILE echo >> $FILE echo "################ SYSTEM INFO ################" >> $FILE - printf " Date: " >> $FILE + echo -n " Date: " >> $FILE date >> $FILE echo " $APP Options: $*" >> $FILE - printf " Arch: " >> $FILE + echo -n " Arch: " >> $FILE uname -m >> $FILE - printf " Kernel: " >> $FILE + echo -n " Kernel: " >> $FILE uname -rvs >> $FILE - printf " Release: " >> $FILE + echo -n " Release: " >> $FILE if [ -f /etc/os-release ]; then . /etc/os-release echo $NAME $VERSION >> $FILE @@ -115,7 +115,7 @@ # find in userdata dir single_stacktrace "$HOME" 5 # try /proc/sys/kernel/core_pattern - [ -d $(dirname $(cat /proc/sys/kernel/core_pattern)) ] && single_stacktrace $(dirname $(cat /proc/sys/kernel/core_pattern)) 1 + [ -d "$(dirname $(cat /proc/sys/kernel/core_pattern))" ] && single_stacktrace "$(dirname $(cat /proc/sys/kernel/core_pattern))" 1 else echo "gdb not installed, can't get stack trace." >> $FILE fi @@ -129,7 +129,7 @@ echo >> $FILE else echo "Logfile not found in the usual place." >> $FILE - echo "Please attach it separately." >> $FILE + echo "Please attach it seperately." >> $FILE echo "Use pastebin.com or similar for forums or IRC." >> $FILE fi echo >> $FILE diff -Nru kodi-16.1~git20160425.1001-final/tools/Linux/kodi-standalone.sh.in kodi-15.2~git20151019.1039-final/tools/Linux/kodi-standalone.sh.in --- kodi-16.1~git20160425.1001-final/tools/Linux/kodi-standalone.sh.in 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/Linux/kodi-standalone.sh.in 2015-10-19 08:39:15.000000000 +0000 @@ -47,7 +47,7 @@ CRASHCOUNT=$((CRASHCOUNT+1)) if [ $(($CRASHCOUNT >= 3)) = "1" ]; then # Too many, bail out LOOP=0 - echo "${APP} has exited in an unclean state 3 times in the last ${DIFF} seconds." + echo "${APP} has exited uncleanly 3 times in the last ${DIFF} seconds." echo "Something is probably wrong" fi fi diff -Nru kodi-16.1~git20160425.1001-final/tools/Linux/kodi-xsession.desktop.in kodi-15.2~git20151019.1039-final/tools/Linux/kodi-xsession.desktop.in --- kodi-16.1~git20160425.1001-final/tools/Linux/kodi-xsession.desktop.in 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/Linux/kodi-xsession.desktop.in 2015-10-19 08:39:15.000000000 +0000 @@ -1,6 +1,6 @@ [Desktop Entry] Name=@APP_NAME@ -Comment=This session will start @APP_NAME@ media center +Comment=This session will start @APP_NAME@ Media Center Exec=@APP_NAME_LC@-standalone TryExec=@APP_NAME_LC@-standalone Type=Application diff -Nru kodi-16.1~git20160425.1001-final/tools/Linux/packaging/README.debian kodi-15.2~git20151019.1039-final/tools/Linux/packaging/README.debian --- kodi-16.1~git20160425.1001-final/tools/Linux/packaging/README.debian 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/Linux/packaging/README.debian 2015-10-19 08:39:15.000000000 +0000 @@ -1,12 +1,12 @@ ---- How to build a Kodi Debian package --- +--- How to build a XBMC debian package --- There are two available build methods: 1.) debuild / debhelper - Requirements: debhelper, devscripts, all Kodi build deps + Requirements: debhelper, devscripts, all Xbmc build deps sudo apt-get install debhelper devscripts - sudo apt-get build-dep kodi (if you have on of our repos/ppas added, else read docs/README.linux or docs/README.ubuntu) + sudo apt-get build-dep xbmc (if you have on of our repos/ppas added, else read docs/README.linux or docs/README.ubuntu) - Result: Debian package for your host distribution and architecture only + Result: debian package for your host distribution and architecture only Recommended for local installs Example Usage: ./mk-debian-package.sh @@ -16,11 +16,11 @@ For a comprehensive example how to setup pbuilder read: https://wiki.ubuntu.com/PbuilderHowto - Result: Debian package for arbitrary Debian based distributions and architectures. + Result: debian package for arbitrary debian based distributions and architectures Recommended for hosting your own apt repository or (clean room) compile testing for various distributions Example Usage: - RELEASEV=16 \ + RELEASEV=13 \ DISTS=-"unstable" \ ARCHS="i386 amd64" \ BUILDER="pdebuild" \ diff -Nru kodi-16.1~git20160425.1001-final/tools/rbp/depends/xbmc/Makefile kodi-15.2~git20151019.1039-final/tools/rbp/depends/xbmc/Makefile --- kodi-16.1~git20160425.1001-final/tools/rbp/depends/xbmc/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/rbp/depends/xbmc/Makefile 2015-10-19 08:39:15.000000000 +0000 @@ -12,7 +12,7 @@ --enable-gles --disable-sdl --disable-x11 --disable-xrandr --disable-openmax \ --disable-optical-drive --disable-dvdcss --disable-joystick --disable-debug \ --disable-crystalhd --disable-vtbdecoder --disable-vaapi --disable-vdpau \ - --disable-pulse --with-platform=raspberry-pi --enable-optimizations \ + --disable-pulse --disable-projectm --with-platform=raspberry-pi --enable-optimizations \ --enable-libcec --enable-player=omxplayer all: configure diff -Nru kodi-16.1~git20160425.1001-final/tools/rbp/setup-sdk.sh kodi-15.2~git20151019.1039-final/tools/rbp/setup-sdk.sh --- kodi-16.1~git20160425.1001-final/tools/rbp/setup-sdk.sh 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/rbp/setup-sdk.sh 2015-10-19 08:39:15.000000000 +0000 @@ -23,14 +23,9 @@ if [ -d $XBMCPREFIX ] then - [ -O $XBMCPREFIX ] || { command -v sudo >/dev/null 2>&1 && SUDO="sudo"; } + [ -O $XBMCPREFIX ] || SUDO="sudo" else - [ -w $(dirname $XBMCPREFIX) ] || { command -v sudo >/dev/null 2>&1 && SUDO="sudo"; } -fi - -if [ -z "$KODI_MIRROR" ] -then - KODI_MIRROR="http://mirrors.kodi.tv" + [ -w $(dirname $XBMCPREFIX) ] || SUDO="sudo" fi $SUDO mkdir -p $XBMCPREFIX @@ -44,7 +39,7 @@ echo "TOOLCHAIN=$TOOLCHAIN" >> $SCRIPT_PATH/Makefile.include echo "BUILDROOT=$BUILDROOT" >> $SCRIPT_PATH/Makefile.include echo "USE_BUILDROOT=$USE_BUILDROOT" >> $SCRIPT_PATH/Makefile.include -echo "BASE_URL=${KODI_MIRROR}/build-deps/darwin-libs" >> $SCRIPT_PATH/Makefile.include +echo "BASE_URL=http://mirrors.xbmc.org/build-deps/darwin-libs" >> $SCRIPT_PATH/Makefile.include echo "TARBALLS_LOCATION=$TARBALLS" >> $SCRIPT_PATH/Makefile.include echo "RETRIEVE_TOOL=/usr/bin/curl" >> $SCRIPT_PATH/Makefile.include echo "RETRIEVE_TOOL_FLAGS=-Ls --create-dirs --output \$(TARBALLS_LOCATION)/\$(ARCHIVE)" >> $SCRIPT_PATH/Makefile.include diff -Nru kodi-16.1~git20160425.1001-final/tools/windows/prepare-binary-addons-dev.bat kodi-15.2~git20151019.1039-final/tools/windows/prepare-binary-addons-dev.bat --- kodi-16.1~git20160425.1001-final/tools/windows/prepare-binary-addons-dev.bat 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/tools/windows/prepare-binary-addons-dev.bat 2015-10-19 08:39:15.000000000 +0000 @@ -84,7 +84,7 @@ -DAPP_ROOT=%WORKDIR% ^ -DBUILD_DIR=%ADDONS_BUILD_PATH% ^ -DDEPENDS_PATH=%ADDON_DEPENDS_PATH% ^ - -DPACKAGE_ZIP=ON ^ + -DPACKAGE_ZIP=1 ^ -DADDONS_TO_BUILD="%ADDONS_TO_BUILD%" IF ERRORLEVEL 1 ( ECHO cmake error level: %ERRORLEVEL% > %ERRORFILE% diff -Nru kodi-16.1~git20160425.1001-final/.travis.yml kodi-15.2~git20151019.1039-final/.travis.yml --- kodi-16.1~git20160425.1001-final/.travis.yml 2016-04-25 08:01:32.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/.travis.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ -# Kodi's travis-ci.org integration file - -# NOTES: -# The travis-ci Gods have environmental concerns with verbosity and clang/xcode builds. -# A nice message is presented in such cases: -# "The log length has exceeded the limit of 4 MB (this usually means that the test suite is raising the -# same exception over and over). The job has been terminated" -# -# travis-ci has a problem with python 2.7 (see https://github.com/travis-ci/travis-ci/issues/4948) so we mark -# used language as 'generic' to work around it - -# TODO: -# integrate with slack -# make it perfect... or not ;-r - - -language: generic -# - cpp -# - python - -# python: -# - "2.7" - -# Define the build matrix -# -# Travis defaults to building on Ubuntu Precise when building on Linux. We need Trusty in order to get up -# to date versions of cmake and g++. -# -matrix: - fast_finish: true - include: - - os: linux - dist: trusty - sudo: required - compiler: gcc - -# Prepare system -# -# Prepare the system to install prerequisites or dependencies -# -before_install: - -# Linux -# -# Install team-xbmc/xbmc-ppa-build-depends for some dependencies and ppa:wsnipex/vaapi for libda-dev 1.6.0. -# Stupid libda-dev 1.3.0 does not work on Trusty. -# - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - sudo add-apt-repository -y ppa:team-xbmc/xbmc-ppa-build-depends - && sudo add-apt-repository -y ppa:wsnipex/vaapi - && sudo apt-get update -qq; fi - -# Install dependencies -# -# Install any prerequisites or dependencies necessary to run our builds -# -install: - -# Linux dependencies -# - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - sudo apt-get install -qq automake autopoint build-essential cmake curl dcadec-dev default-jre gawk gdc - gettext git-core gperf libasound2-dev libass-dev libboost-dev libboost-thread-dev libbz2-dev libcap-dev libcdio-dev - libcrossguid-dev libcurl3 libcurl4-openssl-dev libdbus-1-dev libfontconfig-dev libegl1-mesa-dev libfreetype6-dev - libfribidi-dev libgif-dev libglew-dev libiso9660-dev libjasper-dev libjpeg-dev libltdl-dev liblzo2-dev - libmicrohttpd-dev libmodplug-dev libmpeg2-4-dev libmpeg3-dev libmysqlclient-dev libnfs-dev libogg-dev libpcre3-dev - libplist-dev libpng-dev libpulse-dev libsdl2-dev libsmbclient-dev libsqlite3-dev libssh-dev libssl-dev libtiff-dev - libtag1-dev libtinyxml-dev libtool libudev-dev libusb-dev libva-dev libvdpau-dev libvorbis-dev libvorbisenc2 - libxml2-dev libxmu-dev libxrandr-dev libxrender-dev libxslt1-dev libxt-dev libyajl-dev mesa-utils nasm pmount - python-dev python-imaging python-sqlite swig unzip uuid-dev yasm zip zlib1g-dev; fi - -# Prepare builds -# -before_script: - -# Linux -# - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - cd $TRAVIS_BUILD_DIR/ - && ./bootstrap - && ./configure; fi - -# Actually build -# -script: make -j3 - -# Disable annoying emails -# -notifications: - email: false diff -Nru kodi-16.1~git20160425.1001-final/userdata/RssFeeds.xml kodi-15.2~git20151019.1039-final/userdata/RssFeeds.xml --- kodi-16.1~git20160425.1001-final/userdata/RssFeeds.xml 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/userdata/RssFeeds.xml 2014-01-04 06:34:15.000000000 +0000 @@ -3,8 +3,8 @@ - http://feeds.kodi.tv/xbmc - http://feeds.kodi.tv/latest_xbmc_addons - http://feeds.kodi.tv/updated_xbmc_addons + http://feeds.xbmc.org/xbmc + http://feeds.xbmc.org/latest_xbmc_addons + http://feeds.xbmc.org/updated_xbmc_addons diff -Nru kodi-16.1~git20160425.1001-final/VERSION kodi-15.2~git20151019.1039-final/VERSION --- kodi-16.1~git20160425.1001-final/VERSION 2016-04-25 08:01:49.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/VERSION 2015-10-19 08:39:25.000000000 +0000 @@ -1 +1 @@ -c327c53 +02e7013 diff -Nru kodi-16.1~git20160425.1001-final/version.txt kodi-15.2~git20151019.1039-final/version.txt --- kodi-16.1~git20160425.1001-final/version.txt 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/version.txt 2015-10-19 08:39:15.000000000 +0000 @@ -1,11 +1,11 @@ APP_NAME Kodi COMPANY_NAME XBMC-Foundation WEBSITE http://kodi.tv -VERSION_MAJOR 16 -VERSION_MINOR 1 +VERSION_MAJOR 15 +VERSION_MINOR 2 VERSION_TAG -VERSION_CODE 161000 -ADDON_API 16.1.000 +VERSION_CODE 152000 +ADDON_API 15.2.000 # Notes: # Change AC_INIT in configure.ac diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/addon-bindings.mk kodi-15.2~git20151019.1039-final/xbmc/addons/addon-bindings.mk --- kodi-16.1~git20160425.1001-final/xbmc/addons/addon-bindings.mk 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/addon-bindings.mk 2015-10-19 08:39:16.000000000 +0000 @@ -1,9 +1,6 @@ BINDINGS =xbmc/addons/include/xbmc_addon_cpp_dll.h BINDINGS+=xbmc/addons/include/xbmc_addon_dll.h BINDINGS+=xbmc/addons/include/xbmc_addon_types.h -BINDINGS+=xbmc/addons/include/kodi_adsp_dll.h -BINDINGS+=xbmc/addons/include/kodi_adsp_types.h -BINDINGS+=xbmc/addons/include/kodi_audioengine_types.h BINDINGS+=xbmc/addons/include/xbmc_audioenc_dll.h BINDINGS+=xbmc/addons/include/xbmc_audioenc_types.h BINDINGS+=xbmc/addons/include/kodi_audiodec_dll.h @@ -18,8 +15,6 @@ BINDINGS+=xbmc/addons/include/xbmc_vis_types.h BINDINGS+=xbmc/addons/include/xbmc_stream_utils.hpp BINDINGS+=addons/library.xbmc.addon/libXBMC_addon.h -BINDINGS+=addons/library.kodi.adsp/libKODI_adsp.h -BINDINGS+=addons/library.kodi.audioengine/libKODI_audioengine.h BINDINGS+=addons/library.kodi.guilib/libKODI_guilib.h BINDINGS+=addons/library.xbmc.pvr/libXBMC_pvr.h BINDINGS+=addons/library.xbmc.codec/libXBMC_codec.h diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksAddon.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksAddon.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksAddon.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksAddon.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -180,12 +180,6 @@ { CLog::Log(LOGDEBUG, "CAddonCallbacksAddon - %s - add-on '%s' requests setting '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str(), strSettingName); - if (strcasecmp(strSettingName, "__addonpath__") == 0) - { - strcpy((char*) settingValue, addonHelper->m_addon->Path().c_str()); - return true; - } - if (!addonHelper->m_addon->ReloadSettings()) { CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - could't get settings for add-on '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str()); @@ -210,12 +204,13 @@ type == "folder" || type == "action" || type == "music" || type == "pictures" || type == "programs" || type == "fileenum" || - type == "file" || type == "labelenum") + type == "file") { strcpy((char*) settingValue, addonHelper->m_addon->GetSetting(id).c_str()); return true; } - else if (type == "number" || type == "enum") + else if (type == "number" || type == "enum" || + type == "labelenum") { *(int*) settingValue = (int) atoi(addonHelper->m_addon->GetSetting(id).c_str()); return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksAudioDSP.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksAudioDSP.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksAudioDSP.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksAudioDSP.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,272 +0,0 @@ -/* - * Copyright (C) 2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "Application.h" -#include "AddonCallbacksAudioDSP.h" -#include "settings/AdvancedSettings.h" -#include "utils/log.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSPMode.h" -#include "cores/AudioEngine/Interfaces/AESound.h" -#include "cores/AudioEngine/AEFactory.h" -#include "dialogs/GUIDialogKaiToast.h" - -using namespace ActiveAE; - -namespace ADDON -{ - -CAddonCallbacksADSP::CAddonCallbacksADSP(CAddon* addon) -{ - m_addon = addon; - m_callbacks = new CB_ADSPLib; - - /* write KODI audio DSP specific add-on function addresses to callback table */ - m_callbacks->AddMenuHook = ADSPAddMenuHook; - m_callbacks->RemoveMenuHook = ADSPRemoveMenuHook; - m_callbacks->RegisterMode = ADSPRegisterMode; - m_callbacks->UnregisterMode = ADSPUnregisterMode; - - m_callbacks->SoundPlay_GetHandle = ADSPSoundPlay_GetHandle; - m_callbacks->SoundPlay_ReleaseHandle = ADSPSoundPlay_ReleaseHandle; - m_callbacks->SoundPlay_Play = ADSPSoundPlay_Play; - m_callbacks->SoundPlay_Stop = ADSPSoundPlay_Stop; - m_callbacks->SoundPlay_IsPlaying = ADSPSoundPlay_IsPlaying; - m_callbacks->SoundPlay_SetChannel = ADSPSoundPlay_SetChannel; - m_callbacks->SoundPlay_GetChannel = ADSPSoundPlay_GetChannel; - m_callbacks->SoundPlay_SetVolume = ADSPSoundPlay_SetVolume; - m_callbacks->SoundPlay_GetVolume = ADSPSoundPlay_GetVolume; -} - -CAddonCallbacksADSP::~CAddonCallbacksADSP() -{ - /* delete the callback table */ - delete m_callbacks; -} - -CActiveAEDSPAddon *CAddonCallbacksADSP::GetAudioDSPAddon(void *addonData) -{ - CAddonCallbacks *addon = static_cast(addonData); - if (!addon || !addon->GetHelperADSP()) - { - CLog::Log(LOGERROR, "Audio DSP - %s - called with a null pointer", __FUNCTION__); - return NULL; - } - - return dynamic_cast(addon->GetHelperADSP()->m_addon); -} - -void CAddonCallbacksADSP::ADSPAddMenuHook(void *addonData, AE_DSP_MENUHOOK *hook) -{ - CActiveAEDSPAddon *client = GetAudioDSPAddon(addonData); - if (!hook || !client) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid handler data", __FUNCTION__); - return; - } - - AE_DSP_MENUHOOKS *hooks = client->GetMenuHooks(); - if (hooks) - { - AE_DSP_MENUHOOK hookInt; - hookInt.iHookId = hook->iHookId; - hookInt.iLocalizedStringId = hook->iLocalizedStringId; - hookInt.category = hook->category; - hookInt.iRelevantModeId = hook->iRelevantModeId; - hookInt.bNeedPlayback = hook->bNeedPlayback; - - /* add this new hook */ - hooks->push_back(hookInt); - } -} - -void CAddonCallbacksADSP::ADSPRemoveMenuHook(void *addonData, AE_DSP_MENUHOOK *hook) -{ - CActiveAEDSPAddon *client = GetAudioDSPAddon(addonData); - if (!hook || !client) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid handler data", __FUNCTION__); - return; - } - - AE_DSP_MENUHOOKS *hooks = client->GetMenuHooks(); - if (hooks) - { - for (unsigned int i = 0; i < hooks->size(); i++) - { - if (hooks->at(i).iHookId == hook->iHookId) - { - /* remove this hook */ - hooks->erase(hooks->begin()+i); - break; - } - } - } -} - -void CAddonCallbacksADSP::ADSPRegisterMode(void* addonData, AE_DSP_MODES::AE_DSP_MODE* mode) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!mode || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid mode data", __FUNCTION__); - return; - } - - CActiveAEDSPMode transferMode(*mode, addon->GetID()); - int idMode = transferMode.AddUpdate(); - mode->iUniqueDBModeId = idMode; - - if (idMode > AE_DSP_INVALID_ADDON_ID) - { - CLog::Log(LOGDEBUG, "Audio DSP - %s - successfull registered mode %s of %s adsp-addon", __FUNCTION__, mode->strModeName, addon->Name().c_str()); - } - else - { - CLog::Log(LOGERROR, "Audio DSP - %s - failed to register mode %s of %s adsp-addon", __FUNCTION__, mode->strModeName, addon->Name().c_str()); - } -} - -void CAddonCallbacksADSP::ADSPUnregisterMode(void* addonData, AE_DSP_MODES::AE_DSP_MODE* mode) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!mode || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid mode data", __FUNCTION__); - return; - } - - CActiveAEDSPMode transferMode(*mode, addon->GetID()); - transferMode.Delete(); -} - -ADSPHANDLE CAddonCallbacksADSP::ADSPSoundPlay_GetHandle(void *addonData, const char *filename) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!filename || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid sound play data", __FUNCTION__); - return NULL; - } - - IAESound *sound = CAEFactory::MakeSound(filename); - if (!sound) - { - CLog::Log(LOGERROR, "Audio DSP - %s - failed to make sound play data", __FUNCTION__); - return NULL; - } - - return sound; -} - -void CAddonCallbacksADSP::ADSPSoundPlay_ReleaseHandle(void *addonData, ADSPHANDLE handle) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!handle || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid sound play data", __FUNCTION__); - return; - } - - CAEFactory::FreeSound((IAESound*)handle); -} - -void CAddonCallbacksADSP::ADSPSoundPlay_Play(void *addonData, ADSPHANDLE handle) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!handle || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid sound play data", __FUNCTION__); - return; - } - ((IAESound*)handle)->Play(); -} - -void CAddonCallbacksADSP::ADSPSoundPlay_Stop(void *addonData, ADSPHANDLE handle) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!handle || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid sound play data", __FUNCTION__); - return; - } - ((IAESound*)handle)->Stop(); -} - -bool CAddonCallbacksADSP::ADSPSoundPlay_IsPlaying(void *addonData, ADSPHANDLE handle) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!handle || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid sound play data", __FUNCTION__); - return false; - } - return ((IAESound*)handle)->IsPlaying(); -} - -void CAddonCallbacksADSP::ADSPSoundPlay_SetChannel(void *addonData, ADSPHANDLE handle, AE_DSP_CHANNEL channel) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!handle || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid sound play data", __FUNCTION__); - return; - } - - ((IAESound*)handle)->SetChannel(CActiveAEDSP::GetKODIChannel(channel)); -} - -AE_DSP_CHANNEL CAddonCallbacksADSP::ADSPSoundPlay_GetChannel(void *addonData, ADSPHANDLE handle) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!handle || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid sound play data", __FUNCTION__); - return AE_DSP_CH_INVALID; - } - - return CActiveAEDSP::GetDSPChannel(((IAESound*)handle)->GetChannel()); -} - -void CAddonCallbacksADSP::ADSPSoundPlay_SetVolume(void *addonData, ADSPHANDLE handle, float volume) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!handle || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid sound play data", __FUNCTION__); - return; - } - - ((IAESound*)handle)->SetVolume(volume); -} - -float CAddonCallbacksADSP::ADSPSoundPlay_GetVolume(void *addonData, ADSPHANDLE handle) -{ - CActiveAEDSPAddon *addon = GetAudioDSPAddon(addonData); - if (!handle || !addon) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid sound play data", __FUNCTION__); - return 0.0f; - } - - return ((IAESound*)handle)->GetVolume(); -} - -}; /* namespace ADDON */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksAudioDSP.h kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksAudioDSP.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksAudioDSP.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksAudioDSP.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,155 +0,0 @@ -#pragma once -/* - * Copyright (C) 2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "AddonCallbacks.h" -#include "include/kodi_adsp_types.h" - -namespace ActiveAE -{ - class CActiveAEDSPAddon; -} - -namespace ADDON -{ - -/*! - * Callbacks for a audio DSP add-on to KODI. - * - * Also translates the addon's C structures to KODI's C++ structures. - */ -class CAddonCallbacksADSP -{ -public: - CAddonCallbacksADSP(CAddon* addon); - ~CAddonCallbacksADSP(void); - - /*! - * @return The callback table. - */ - CB_ADSPLib *GetCallbacks() { return m_callbacks; } - - /*! - * @brief Add or replace a menu hook for the menu for this add-on - * @param addonData A pointer to the add-on. - * @param hook The hook to add. - */ - static void ADSPAddMenuHook(void* addonData, AE_DSP_MENUHOOK* hook); - - /*! - * @brief Remove a menu hook for the menu for this add-on - * @param addonData A pointer to the add-on. - * @param hook The hook to remove. - */ - static void ADSPRemoveMenuHook(void* addonData, AE_DSP_MENUHOOK* hook); - - /*! - * @brief Add or replace master mode information inside audio dsp database. - * Becomes identifier written inside mode to iModeID if it was 0 (undefined) - * @param mode The master mode to add or update inside database - */ - static void ADSPRegisterMode(void* addonData, AE_DSP_MODES::AE_DSP_MODE* mode); - - /*! - * @brief Remove a master mode from audio dsp database - * @param mode The Mode to remove - */ - static void ADSPUnregisterMode(void* addonData, AE_DSP_MODES::AE_DSP_MODE* mode); - - /*! @name KODI background sound play handling */ - //@{ - /*! - * @brief Get a handle to open a gui sound wave playback - * @param addonData A pointer to the add-on. - * @param filename the related wave file to open - * @return pointer to sound play handle - */ - static ADSPHANDLE ADSPSoundPlay_GetHandle(void *addonData, const char *filename); - - /*! - * @brief Release the selected handle on KODI - * @param addonData A pointer to the add-on. - * @param handle pointer to sound play handle - */ - static void ADSPSoundPlay_ReleaseHandle(void *addonData, ADSPHANDLE handle); - - /*! - * @brief Start the wave file playback - * @param addonData A pointer to the add-on. - * @param handle pointer to sound play handle - */ - static void ADSPSoundPlay_Play(void *addonData, ADSPHANDLE handle); - - /*! - * @brief Stop the wave file playback - * @param addonData A pointer to the add-on. - * @param handle pointer to sound play handle - */ - static void ADSPSoundPlay_Stop(void *addonData, ADSPHANDLE handle); - - /*! - * @brief Ask that the playback of wave is in progress - * @param addonData A pointer to the add-on. - * @param handle pointer to sound play handle - * @return true if playing - */ - static bool ADSPSoundPlay_IsPlaying(void *addonData, ADSPHANDLE handle); - - /*! - * @brief Set the optional playback channel position, if not used it is on all channels - * @param addonData A pointer to the add-on. - * @param handle pointer to sound play handle - * @param used channel pointer for the playback, AE_DSP_CH_INVALID for on all - */ - static void ADSPSoundPlay_SetChannel(void *addonData, ADSPHANDLE handle, AE_DSP_CHANNEL channel); - - /*! - * @brief Get the selected playback channel position - * @param addonData A pointer to the add-on. - * @param handle pointer to sound play handle - * @return the used channel pointer for the playback, AE_DSP_CH_INVALID for on all - */ - static AE_DSP_CHANNEL ADSPSoundPlay_GetChannel(void *addonData, ADSPHANDLE handle); - - /*! - * @brief Set the volume for the wave file playback - * @param addonData A pointer to the add-on. - * @param handle pointer to sound play handle - * @param volume for the file playback - */ - static void ADSPSoundPlay_SetVolume(void *addonData, ADSPHANDLE handle, float volume); - - /*! - * @brief Get the volume which is set for the playback - * @param addonData A pointer to the add-on. - * @param handle pointer to sound play handle - * @return current volume for the file playback - */ - static float ADSPSoundPlay_GetVolume(void *addonData, ADSPHANDLE handle); - //@} - -private: - static ActiveAE::CActiveAEDSPAddon* GetAudioDSPAddon(void* addonData); - - CB_ADSPLib *m_callbacks; /*!< callback addresses */ - CAddon *m_addon; /*!< the addon */ -}; - -}; /* namespace ADDON */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksAudioEngine.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksAudioEngine.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksAudioEngine.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksAudioEngine.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,430 +0,0 @@ -/* - * Copyright (C) 2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "AddonCallbacksAudioEngine.h" -#include "cores/AudioEngine/AEFactory.h" -#include "cores/AudioEngine/Interfaces/AEStream.h" -#include "cores/AudioEngine/Utils/AEChannelData.h" -#include "utils/log.h" -#include "include/kodi_audioengine_types.h" - -namespace ADDON -{ - -CAddonCallbacksAudioEngine::CAddonCallbacksAudioEngine(CAddon* addon) -{ - m_addon = addon; - m_callbacks = new CB_AudioEngineLib; - - // write KODI audio DSP specific add-on function addresses to callback table - m_callbacks->MakeStream = AudioEngine_MakeStream; - m_callbacks->FreeStream = AudioEngine_FreeStream; - m_callbacks->GetCurrentSinkFormat = AudioEngine_GetCurrentSinkFormat; - - // AEStream add-on function callback table - m_callbacks->AEStream_GetSpace = AEStream_GetSpace; - m_callbacks->AEStream_AddData = AEStream_AddData; - m_callbacks->AEStream_GetDelay = AEStream_GetDelay; - m_callbacks->AEStream_IsBuffering = AEStream_IsBuffering; - m_callbacks->AEStream_GetCacheTime = AEStream_GetCacheTime; - m_callbacks->AEStream_GetCacheTotal = AEStream_GetCacheTotal; - m_callbacks->AEStream_Pause = AEStream_Pause; - m_callbacks->AEStream_Resume = AEStream_Resume; - m_callbacks->AEStream_Drain = AEStream_Drain; - m_callbacks->AEStream_IsDraining = AEStream_IsDraining; - m_callbacks->AEStream_IsDrained = AEStream_IsDrained; - m_callbacks->AEStream_Flush = AEStream_Flush; - m_callbacks->AEStream_GetVolume = AEStream_GetVolume; - m_callbacks->AEStream_SetVolume = AEStream_SetVolume; - m_callbacks->AEStream_GetAmplification = AEStream_GetAmplification; - m_callbacks->AEStream_SetAmplification = AEStream_SetAmplification; - m_callbacks->AEStream_GetFrameSize = AEStream_GetFrameSize; - m_callbacks->AEStream_GetChannelCount = AEStream_GetChannelCount; - m_callbacks->AEStream_GetSampleRate = AEStream_GetSampleRate; - m_callbacks->AEStream_GetEncodedSampleRate = AEStream_GetEncodedSampleRate; - m_callbacks->AEStream_GetDataFormat = AEStream_GetDataFormat; - m_callbacks->AEStream_GetResampleRatio = AEStream_GetResampleRatio; - m_callbacks->AEStream_SetResampleRatio = AEStream_SetResampleRatio; - m_callbacks->AEStream_Discontinuity = AEStream_Discontinuity; -} - -AEStreamHandle* CAddonCallbacksAudioEngine::AudioEngine_MakeStream(AEDataFormat DataFormat, unsigned int SampleRate, unsigned int EncodedSampleRate, enum AEChannel *Channels, unsigned int Options) -{ - if (!Channels) - { - CLog::Log(LOGERROR, "CAddonCallbacksAudioEngine - %s - Invalid input! Channels is a NULL pointer!", __FUNCTION__); - return NULL; - } - - CAEChannelInfo channelInfo(Channels); - return CAEFactory::MakeStream(DataFormat, SampleRate, EncodedSampleRate, channelInfo, Options); -} - -void CAddonCallbacksAudioEngine::AudioEngine_FreeStream(AEStreamHandle *StreamHandle) -{ - if (!StreamHandle) - { - CLog::Log(LOGERROR, "CAddonCallbacksAudioEngine - %s - invalid stream data", __FUNCTION__); - return; - } - - CAEFactory::FreeStream((IAEStream*)StreamHandle); -} - -bool CAddonCallbacksAudioEngine::AudioEngine_GetCurrentSinkFormat(void *AddonData, AudioEngineFormat *SinkFormat) -{ - if (!AddonData || !SinkFormat) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid input data!", __FUNCTION__); - return false; - } - - AEAudioFormat AESinkFormat; - if (!CAEFactory::GetEngine() || !CAEFactory::GetEngine()->GetCurrentSinkFormat(AESinkFormat)) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - failed to get current sink format from AE!", __FUNCTION__); - return false; - } - - SinkFormat->m_channelCount = AESinkFormat.m_channelLayout.Count(); - for (unsigned int ch = 0; ch < SinkFormat->m_channelCount; ch++) - { - SinkFormat->m_channels[ch] = AESinkFormat.m_channelLayout[ch]; - } - - SinkFormat->m_dataFormat = AESinkFormat.m_dataFormat; - SinkFormat->m_sampleRate = AESinkFormat.m_sampleRate; - SinkFormat->m_encodedRate = AESinkFormat.m_encodedRate; - SinkFormat->m_frames = AESinkFormat.m_frames; - SinkFormat->m_frameSamples = AESinkFormat.m_frameSamples; - SinkFormat->m_frameSize = AESinkFormat.m_frameSize; - - return true; -} - -CAddonCallbacksAudioEngine::~CAddonCallbacksAudioEngine() -{ - /* delete the callback table */ - delete m_callbacks; -} - -unsigned int CAddonCallbacksAudioEngine::AEStream_GetSpace(void *AddonData, AEStreamHandle *StreamHandle) -{ - if (!AddonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return 0; - } - - return ((IAEStream*)StreamHandle)->GetSpace(); -} - -unsigned int CAddonCallbacksAudioEngine::AEStream_AddData(void *AddonData, AEStreamHandle *StreamHandle, uint8_t* const *Data, unsigned int Offset, unsigned int Frames) -{ - if (!AddonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return 0; - } - - return ((IAEStream*)StreamHandle)->AddData(Data, Offset, Frames); -} - -double CAddonCallbacksAudioEngine::AEStream_GetDelay(void *AddonData, AEStreamHandle *StreamHandle) -{ - if (!AddonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return -1.0; - } - - return ((IAEStream*)StreamHandle)->GetDelay(); -} - -bool CAddonCallbacksAudioEngine::AEStream_IsBuffering(void *AddonData, AEStreamHandle *StreamHandle) -{ - if (!AddonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return false; - } - - return ((IAEStream*)StreamHandle)->IsBuffering(); -} - -double CAddonCallbacksAudioEngine::AEStream_GetCacheTime(void *AddonData, AEStreamHandle *StreamHandle) -{ - if (!AddonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return -1.0; - } - - return ((IAEStream*)StreamHandle)->GetCacheTime(); -} - -double CAddonCallbacksAudioEngine::AEStream_GetCacheTotal(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return -1.0; - } - - return ((IAEStream*)StreamHandle)->GetCacheTotal(); -} - -void CAddonCallbacksAudioEngine::AEStream_Pause(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return; - } - - ((IAEStream*)StreamHandle)->Pause(); -} - -void CAddonCallbacksAudioEngine::AEStream_Resume(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return; - } - - ((IAEStream*)StreamHandle)->Resume(); -} - -void CAddonCallbacksAudioEngine::AEStream_Drain(void *AddonData, AEStreamHandle *StreamHandle, bool Wait) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return; - } - - ((IAEStream*)StreamHandle)->Drain(Wait); -} - -bool CAddonCallbacksAudioEngine::AEStream_IsDraining(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return false; - } - - return ((IAEStream*)StreamHandle)->IsDraining(); -} - -bool CAddonCallbacksAudioEngine::AEStream_IsDrained(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return false; - } - - return ((IAEStream*)StreamHandle)->IsDrained(); -} - -void CAddonCallbacksAudioEngine::AEStream_Flush(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return; - } - - ((IAEStream*)StreamHandle)->Flush(); -} - -float CAddonCallbacksAudioEngine::AEStream_GetVolume(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return -1.0f; - } - - return ((IAEStream*)StreamHandle)->GetVolume(); -} - -void CAddonCallbacksAudioEngine::AEStream_SetVolume(void *AddonData, AEStreamHandle *StreamHandle, float Volume) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return; - } - - ((IAEStream*)StreamHandle)->SetVolume(Volume); -} - -float CAddonCallbacksAudioEngine::AEStream_GetAmplification(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return -1.0f; - } - - return ((IAEStream*)StreamHandle)->GetAmplification(); -} - -void CAddonCallbacksAudioEngine::AEStream_SetAmplification(void *AddonData, AEStreamHandle *StreamHandle, float Amplify) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return; - } - - ((IAEStream*)StreamHandle)->SetAmplification(Amplify); -} - -const unsigned int CAddonCallbacksAudioEngine::AEStream_GetFrameSize(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return 0; - } - - return ((IAEStream*)StreamHandle)->GetFrameSize(); -} - -const unsigned int CAddonCallbacksAudioEngine::AEStream_GetChannelCount(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return 0; - } - - return ((IAEStream*)StreamHandle)->GetChannelCount(); -} - -const unsigned int CAddonCallbacksAudioEngine::AEStream_GetSampleRate(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return 0; - } - - return ((IAEStream*)StreamHandle)->GetSampleRate(); -} - -const unsigned int CAddonCallbacksAudioEngine::AEStream_GetEncodedSampleRate(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return 0; - } - - return ((IAEStream*)StreamHandle)->GetEncodedSampleRate(); -} - -const AEDataFormat CAddonCallbacksAudioEngine::AEStream_GetDataFormat(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return AE_FMT_INVALID; - } - - return ((IAEStream*)StreamHandle)->GetDataFormat(); -} - -double CAddonCallbacksAudioEngine::AEStream_GetResampleRatio(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return -1.0f; - } - - return ((IAEStream*)StreamHandle)->GetResampleRatio(); -} - -bool CAddonCallbacksAudioEngine::AEStream_SetResampleRatio(void *AddonData, AEStreamHandle *StreamHandle, double Ratio) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return false; - } - - return ((IAEStream*)StreamHandle)->SetResampleRatio(Ratio); -} - -void CAddonCallbacksAudioEngine::AEStream_Discontinuity(void *AddonData, AEStreamHandle *StreamHandle) -{ - // prevent compiler warnings - void *addonData = AddonData; - if (!addonData || !StreamHandle) - { - CLog::Log(LOGERROR, "libKODI_audioengine - %s - invalid stream data", __FUNCTION__); - return; - } - - ((IAEStream*)StreamHandle)->Discontinuity(); -} - -}; /* namespace ADDON */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksAudioEngine.h kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksAudioEngine.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksAudioEngine.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksAudioEngine.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,220 +0,0 @@ -#pragma once -/* - * Copyright (C) 2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "AddonCallbacks.h" -#include "include/kodi_audioengine_types.h" - -namespace ADDON -{ - -/*! - * Callbacks for Kodi's AudioEngine. - */ -class CAddonCallbacksAudioEngine -{ -public: - CAddonCallbacksAudioEngine(CAddon* Addon); - ~CAddonCallbacksAudioEngine(); - - /*! - * @return The callback table. - */ - CB_AudioEngineLib *GetCallbacks() { return m_callbacks; } - - /** - * Creates and returns a new handle to an IAEStream in the format specified, this function should never fail - * @param dataFormat The data format the incoming audio will be in (eg, AE_FMT_S16LE) - * @param sampleRate The sample rate of the audio data (eg, 48000) - * @prarm encodedSampleRate The sample rate of the encoded audio data if AE_IS_RAW(dataFormat) - * @param channelLayout The order of the channels in the audio data - * @param options A bit field of stream options (see: enum AEStreamOptions) - * @return a new Handle to an IAEStream that will accept data in the requested format - */ - static AEStreamHandle* AudioEngine_MakeStream(AEDataFormat DataFormat, unsigned int SampleRate, unsigned int EncodedSampleRate, enum AEChannel *Channels, unsigned int Options); - - /** - * This method will remove the specifyed stream from the engine. - * For OSX/IOS this is essential to reconfigure the audio output. - * @param stream The stream to be altered - * @return NULL - */ - static void AudioEngine_FreeStream(AEStreamHandle *StreamHandle); - - /** - * Get the current sink data format - * - * @param Current sink data format. For more details see AudioEngineFormat. - * @return Returns true on success, else false. - */ - static bool AudioEngine_GetCurrentSinkFormat(void *AddonData, AudioEngineFormat *SinkFormat); - - /** - * Returns the amount of space available in the stream - * @return The number of bytes AddData will consume - */ - static unsigned int AEStream_GetSpace(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Add planar or interleaved PCM data to the stream - * @param data array of pointers to the planes - * @param offset to frame in frames - * @param frames number of frames - * @param pts timestamp - * @return The number of frames consumed - */ - static unsigned int AEStream_AddData(void *AddonData, AEStreamHandle *StreamHandle, uint8_t* const *Data, unsigned int Offset, unsigned int Frames); - - /** - * Returns the time in seconds that it will take - * for the next added packet to be heard from the speakers. - * @return seconds - */ - static double AEStream_GetDelay(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Returns if the stream is buffering - * @return True if the stream is buffering - */ - static bool AEStream_IsBuffering(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Returns the time in seconds that it will take - * to underrun the cache if no sample is added. - * @return seconds - */ - static double AEStream_GetCacheTime(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Returns the total time in seconds of the cache - * @return seconds - */ - static double AEStream_GetCacheTotal(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Pauses the stream playback - */ - static void AEStream_Pause(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Resumes the stream after pausing - */ - static void AEStream_Resume(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Start draining the stream - * @note Once called AddData will not consume more data. - */ - static void AEStream_Drain(void *AddonData, AEStreamHandle *StreamHandle, bool Wait); - - /** - * Returns true if the is stream draining - */ - static bool AEStream_IsDraining(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Returns true if the is stream has finished draining - */ - static bool AEStream_IsDrained(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Flush all buffers dropping the audio data - */ - static void AEStream_Flush(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Return the stream's current volume level - * @return The volume level between 0.0 and 1.0 - */ - static float AEStream_GetVolume(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Set the stream's volume level - * @param volume The new volume level between 0.0 and 1.0 - */ - static void AEStream_SetVolume(void *AddonData, AEStreamHandle *StreamHandle, float Volume); - - /** - * Gets the stream's volume amplification in linear units. - * @return The volume amplification factor between 1.0 and 1000.0 - */ - static float AEStream_GetAmplification(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Sets the stream's volume amplification in linear units. - * @param The volume amplification factor between 1.0 and 1000.0 - */ - static void AEStream_SetAmplification(void *AddonData, AEStreamHandle *StreamHandle, float Amplify); - - /** - * Returns the size of one audio frame in bytes (channelCount * resolution) - * @return The size in bytes of one frame - */ - static const unsigned int AEStream_GetFrameSize(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Returns the number of channels the stream is configured to accept - * @return The channel count - */ - static const unsigned int AEStream_GetChannelCount(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Returns the stream's sample rate, if the stream is using a dynamic sample rate, this value will NOT reflect any changes made by calls to SetResampleRatio() - * @return The stream's sample rate (eg, 48000) - */ - static const unsigned int AEStream_GetSampleRate(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Returns the stream's encoded sample rate if the stream is RAW - * @return The stream's encoded sample rate - */ - static const unsigned int AEStream_GetEncodedSampleRate(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Return the data format the stream has been configured with - * @return The stream's data format (eg, AE_FMT_S16LE) - */ - static const AEDataFormat AEStream_GetDataFormat(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Return the resample ratio - * @note This will return an undefined value if the stream is not resampling - * @return the current resample ratio or undefined if the stream is not resampling - */ - static double AEStream_GetResampleRatio(void *AddonData, AEStreamHandle *StreamHandle); - - /** - * Sets the resample ratio - * @note This function may return false if the stream is not resampling, if you wish to use this be sure to set the AESTREAM_FORCE_RESAMPLE option - * @param ratio the new sample rate ratio, calculated by ((double)desiredRate / (double)GetSampleRate()) - */ - static bool AEStream_SetResampleRatio(void *AddonData, AEStreamHandle *StreamHandle, double Ratio); - - /** - * Sginal a clock change - */ - static void AEStream_Discontinuity(void *AddonData, AEStreamHandle *StreamHandle); - -private: - CB_AudioEngineLib *m_callbacks; /*!< callback addresses */ - CAddon *m_addon; /*!< the addon */ -}; - -}; /* namespace ADDON */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksCodec.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksCodec.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksCodec.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksCodec.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,9 +19,6 @@ */ #include "Addon.h" - -#include - #include "AddonCallbacksCodec.h" #include "utils/StringUtils.h" @@ -29,7 +26,6 @@ #include "libavcodec/avcodec.h" } - namespace ADDON { class CCodecIds @@ -37,7 +33,7 @@ public: virtual ~CCodecIds(void) {} - static CCodecIds& GetInstance() + static CCodecIds& Get(void) { static CCodecIds _instance; return _instance; @@ -111,7 +107,7 @@ xbmc_codec_t CAddonCallbacksCodec::GetCodecByName(const void* addonData, const char* strCodecName) { (void)addonData; - return CCodecIds::GetInstance().GetCodecByName(strCodecName); + return CCodecIds::Get().GetCodecByName(strCodecName); } }; /* namespace ADDON */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacks.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacks.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacks.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacks.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,8 +21,6 @@ #include "Addon.h" #include "AddonCallbacks.h" #include "AddonCallbacksAddon.h" -#include "AddonCallbacksAudioDSP.h" -#include "AddonCallbacksAudioEngine.h" #include "AddonCallbacksCodec.h" #include "AddonCallbacksGUI.h" #include "AddonCallbacksPVR.h" @@ -37,8 +35,6 @@ m_addon = addon; m_callbacks = new AddonCB; m_helperAddon = NULL; - m_helperADSP = NULL; - m_helperAudioEngine = NULL; m_helperGUI = NULL; m_helperPVR = NULL; m_helperCODEC = NULL; @@ -47,10 +43,6 @@ m_callbacks->addonData = this; m_callbacks->AddOnLib_RegisterMe = CAddonCallbacks::AddOnLib_RegisterMe; m_callbacks->AddOnLib_UnRegisterMe = CAddonCallbacks::AddOnLib_UnRegisterMe; - m_callbacks->ADSPLib_RegisterMe = CAddonCallbacks::ADSPLib_RegisterMe; - m_callbacks->ADSPLib_UnRegisterMe = CAddonCallbacks::ADSPLib_UnRegisterMe; - m_callbacks->AudioEngineLib_RegisterMe = CAddonCallbacks::AudioEngineLib_RegisterMe; - m_callbacks->AudioEngineLib_UnRegisterMe = CAddonCallbacks::AudioEngineLib_UnRegisterMe; m_callbacks->CODECLib_RegisterMe = CAddonCallbacks::CODECLib_RegisterMe; m_callbacks->CODECLib_UnRegisterMe = CAddonCallbacks::CODECLib_UnRegisterMe; m_callbacks->GUILib_RegisterMe = CAddonCallbacks::GUILib_RegisterMe; @@ -63,10 +55,6 @@ { delete m_helperAddon; m_helperAddon = NULL; - delete m_helperADSP; - m_helperADSP = NULL; - delete m_helperAudioEngine; - m_helperAudioEngine = NULL; delete m_helperCODEC; m_helperCODEC = NULL; delete m_helperGUI; @@ -104,59 +92,6 @@ addon->m_helperAddon = NULL; } -CB_ADSPLib* CAddonCallbacks::ADSPLib_RegisterMe(void *addonData) -{ - CAddonCallbacks* addon = (CAddonCallbacks*) addonData; - if (addon == NULL) - { - CLog::Log(LOGERROR, "CAddonCallbacks - %s - called with a null pointer", __FUNCTION__); - return NULL; - } - - addon->m_helperADSP = new CAddonCallbacksADSP(addon->m_addon); - return addon->m_helperADSP->GetCallbacks(); -} - -void CAddonCallbacks::ADSPLib_UnRegisterMe(void *addonData, CB_ADSPLib *cbTable) -{ - CAddonCallbacks* addon = (CAddonCallbacks*) addonData; - if (addon == NULL) - { - CLog::Log(LOGERROR, "CAddonCallbacks - %s - called with a null pointer", __FUNCTION__); - return; - } - - delete addon->m_helperADSP; - addon->m_helperADSP = NULL; -} - -CB_AudioEngineLib* CAddonCallbacks::AudioEngineLib_RegisterMe(void *addonData) -{ - CAddonCallbacks* addon = (CAddonCallbacks*) addonData; - if (addon == NULL) - { - CLog::Log(LOGERROR, "CAddonCallbacks - %s - called with a null pointer", __FUNCTION__); - return NULL; - } - - addon->m_helperAudioEngine = new CAddonCallbacksAudioEngine(addon->m_addon); - return addon->m_helperAudioEngine->GetCallbacks(); -} - -void CAddonCallbacks::AudioEngineLib_UnRegisterMe(void *addonData, CB_AudioEngineLib *cbTable) -{ - CAddonCallbacks* addon = (CAddonCallbacks*) addonData; - if (addon == NULL) - { - CLog::Log(LOGERROR, "CAddonCallbacks - %s - called with a null pointer", __FUNCTION__); - return; - } - - delete addon->m_helperAudioEngine; - addon->m_helperAudioEngine = NULL; -} - - CB_CODECLib* CAddonCallbacks::CODECLib_RegisterMe(void *addonData) { CAddonCallbacks* addon = (CAddonCallbacks*) addonData; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksGUI.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksGUI.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksGUI.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksGUI.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,8 +19,7 @@ */ #include "Application.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" +#include "ApplicationMessenger.h" #include "Addon.h" #include "AddonCallbacksGUI.h" #include "utils/log.h" @@ -29,7 +28,6 @@ #include "filesystem/File.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" #include "guilib/TextureManager.h" @@ -41,6 +39,7 @@ #include "guilib/GUIKeyboardFactory.h" #include "dialogs/GUIDialogNumeric.h" #include "dialogs/GUIDialogOK.h" +#include "dialogs/GUIDialogYesNo.h" #include "dialogs/GUIDialogFileBrowser.h" #include "dialogs/GUIDialogTextViewer.h" #include "dialogs/GUIDialogSelect.h" @@ -50,8 +49,7 @@ #define CONTROL_BTNSORTASC 4 #define CONTROL_LABELFILES 12 -using namespace KODI::MESSAGING; -using KODI::MESSAGING::HELPERS::DialogResponse; +using namespace std; namespace ADDON { @@ -699,7 +697,7 @@ StringUtils::ToLower(lowerKey); Lock(); - std::string value = pWindow->GetProperty(lowerKey).asString(); + string value = pWindow->GetProperty(lowerKey).asString(); Unlock(); return strdup(value.c_str()); @@ -1617,7 +1615,7 @@ if (!helper || !handle) return NULL; - std::string string = ((CFileItem*)handle)->GetProperty(key).asString(); + string string = ((CFileItem*)handle)->GetProperty(key).asString(); char *buffer = (char*) malloc (string.length()+1); strcpy(buffer, string.c_str()); return buffer; @@ -1669,7 +1667,7 @@ bool CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetInputWithHead(char &aTextString, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, bool hiddenInput, unsigned int autoCloseMs) { std::string str = &aTextString; - bool bRet = CGUIKeyboardFactory::ShowAndGetInput(str, CVariant{strHeading}, allowEmptyResult, hiddenInput, autoCloseMs); + bool bRet = CGUIKeyboardFactory::ShowAndGetInput(str, strHeading, allowEmptyResult, hiddenInput, autoCloseMs); if (bRet) strncpy(&aTextString, str.c_str(), iMaxStringSize); return bRet; @@ -1850,12 +1848,12 @@ //@{ void CAddonCallbacksGUI::Dialog_OK_ShowAndGetInputSingleText(const char *heading, const char *text) { - CGUIDialogOK::ShowAndGetInput(CVariant{heading}, CVariant{text}); + CGUIDialogOK::ShowAndGetInput(heading, text); } void CAddonCallbacksGUI::Dialog_OK_ShowAndGetInputLineText(const char *heading, const char *line0, const char *line1, const char *line2) { - CGUIDialogOK::ShowAndGetInput(CVariant{heading}, CVariant{line0}, CVariant{line1}, CVariant{line2}); + CGUIDialogOK::ShowAndGetInput(heading, line0, line1, line2); } //@} @@ -1863,22 +1861,17 @@ //@{ bool CAddonCallbacksGUI::Dialog_YesNo_ShowAndGetInputSingleText(const char *heading, const char *text, bool& bCanceled, const char *noLabel, const char *yesLabel) { - DialogResponse result = HELPERS::ShowYesNoDialogText(heading, text, noLabel, yesLabel); - bCanceled = result == DialogResponse::CANCELLED; - return result == DialogResponse::YES; + return CGUIDialogYesNo::ShowAndGetInput(heading, text, bCanceled, noLabel, yesLabel); } bool CAddonCallbacksGUI::Dialog_YesNo_ShowAndGetInputLineText(const char *heading, const char *line0, const char *line1, const char *line2, const char *noLabel, const char *yesLabel) { - return HELPERS::ShowYesNoDialogLines(heading, line0, line1, line2, noLabel, yesLabel) == - DialogResponse::YES; + return CGUIDialogYesNo::ShowAndGetInput(heading, line0, line1, line2, noLabel, yesLabel); } bool CAddonCallbacksGUI::Dialog_YesNo_ShowAndGetInputLineButtonText(const char *heading, const char *line0, const char *line1, const char *line2, bool &bCanceled, const char *noLabel, const char *yesLabel) { - DialogResponse result = HELPERS::ShowYesNoDialogLines(heading, line0, line1, line2, noLabel, yesLabel); - bCanceled = result == DialogResponse::CANCELLED; - return result == DialogResponse::YES; + return CGUIDialogYesNo::ShowAndGetInput(heading, line0, line1, line2, bCanceled, noLabel, yesLabel); } //@} @@ -1889,7 +1882,7 @@ CGUIDialogTextViewer* pDialog = (CGUIDialogTextViewer*)g_windowManager.GetWindow(WINDOW_DIALOG_TEXT_VIEWER); pDialog->SetHeading(heading); pDialog->SetText(text); - pDialog->Open(); + pDialog->DoModal(); } //@} @@ -1899,7 +1892,7 @@ { CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); - pDialog->SetHeading(CVariant{heading}); + pDialog->SetHeading(heading); for (unsigned int i = 0; i < size; i++) pDialog->Add(entries[i]); @@ -1907,7 +1900,7 @@ if (selected > 0) pDialog->SetSelected(selected); - pDialog->Open(); + pDialog->DoModal(); return pDialog->GetSelectedLabel(); } //@} @@ -2179,15 +2172,21 @@ bool CGUIAddonWindowDialog::OnMessage(CGUIMessage &message) { if (message.GetMessage() == GUI_MSG_WINDOW_DEINIT) + { + CGUIWindow *pWindow = g_windowManager.GetWindow(g_windowManager.GetActiveWindow()); + if (pWindow) + g_windowManager.ShowOverlay(pWindow->GetOverlayState()); return CGUIWindow::OnMessage(message); - + } return CGUIAddonWindow::OnMessage(message); } void CGUIAddonWindowDialog::Show(bool show /* = true */) { unsigned int iCount = g_graphicsContext.exit(); - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ADDON_DIALOG, 1, show ? 1 : 0, static_cast(this)); + ThreadMessage tMsg = {TMSG_GUI_ADDON_DIALOG, 1, show ? 1 : 0}; + tMsg.lpVoid = this; + CApplicationMessenger::Get().SendMessage(tMsg, true); g_graphicsContext.restore(iCount); } @@ -2205,7 +2204,7 @@ // this dialog is derived from GUiMediaWindow // make sure it is rendered last - m_renderOrder = RENDER_ORDER_DIALOG; + m_renderOrder = 1; while (m_bRunning && !g_application.m_bStop) { g_windowManager.ProcessRenderLoop(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacks.h kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacks.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacks.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacks.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,11 +22,7 @@ #include #include "../../addons/library.kodi.guilib/libKODI_guilib.h" -#include "../../addons/library.kodi.adsp/libKODI_adsp.h" -#include "../../addons/library.kodi.audioengine/libKODI_audioengine.h" #include "cores/dvdplayer/DVDDemuxers/DVDDemuxUtils.h" -#include "addons/include/kodi_adsp_types.h" -#include "addons/include/kodi_audioengine_types.h" #include "addons/include/xbmc_pvr_types.h" #include "addons/include/xbmc_codec_types.h" @@ -366,105 +362,6 @@ GUIDialog_Select Dialog_Select; } CB_GUILib; -typedef void (*ADSPAddMenuHook)(void *addonData, AE_DSP_MENUHOOK *hook); -typedef void (*ADSPRemoveMenuHook)(void *addonData, AE_DSP_MENUHOOK *hook); -typedef void (*ADSPRegisterMode)(void *addonData, AE_DSP_MODES::AE_DSP_MODE *mode); -typedef void (*ADSPUnregisterMode)(void *addonData, AE_DSP_MODES::AE_DSP_MODE *mode); - -typedef ADSPHANDLE (*ADSPSoundPlay_GetHandle)(void *addonData, const char *filename); -typedef void (*ADSPSoundPlay_ReleaseHandle)(void *addonData, ADSPHANDLE handle); -typedef void (*ADSPSoundPlay_Play)(void *addonData, ADSPHANDLE handle); -typedef void (*ADSPSoundPlay_Stop)(void *addonData, ADSPHANDLE handle); -typedef bool (*ADSPSoundPlay_IsPlaying)(void *addonData, ADSPHANDLE handle); -typedef void (*ADSPSoundPlay_SetChannel)(void *addonData, ADSPHANDLE handle, AE_DSP_CHANNEL channel); -typedef AE_DSP_CHANNEL (*ADSPSoundPlay_GetChannel)(void *addonData, ADSPHANDLE handle); -typedef void (*ADSPSoundPlay_SetVolume)(void *addonData, ADSPHANDLE handle, float volume); -typedef float (*ADSPSoundPlay_GetVolume)(void *addonData, ADSPHANDLE handle); - -typedef struct CB_ADSPLib -{ - ADSPAddMenuHook AddMenuHook; - ADSPRemoveMenuHook RemoveMenuHook; - ADSPRegisterMode RegisterMode; - ADSPUnregisterMode UnregisterMode; - - ADSPSoundPlay_GetHandle SoundPlay_GetHandle; - ADSPSoundPlay_ReleaseHandle SoundPlay_ReleaseHandle; - ADSPSoundPlay_Play SoundPlay_Play; - ADSPSoundPlay_Stop SoundPlay_Stop; - ADSPSoundPlay_IsPlaying SoundPlay_IsPlaying; - ADSPSoundPlay_SetChannel SoundPlay_SetChannel; - ADSPSoundPlay_GetChannel SoundPlay_GetChannel; - ADSPSoundPlay_SetVolume SoundPlay_SetVolume; - ADSPSoundPlay_GetVolume SoundPlay_GetVolume; -} CB_ADSPLib; - -// --------------------------------------- -// libKODI_audioengine definitions -// --------------------------------------- -typedef AEStreamHandle* (*AudioEngine_MakeStream)(AEDataFormat DataFormat, unsigned int SampleRate, unsigned int EncodedSampleRate, enum AEChannel *ChannelLayout, unsigned int Options); -typedef void (*AudioEngine_FreeStream)(AEStreamHandle *stream); -typedef bool (*AudioEngine_GetCurrentSinkFormat)(void *addonData, AudioEngineFormat *SinkFormat); - -// Audio Engine Stream definitions -typedef unsigned int (*AudioEngine_Stream_GetSpace)(void *addonData, AEStreamHandle *handle); -typedef unsigned int (*AudioEngine_Stream_AddData)(void *addonData, AEStreamHandle *handle, uint8_t* const *Data, unsigned int Offset, unsigned int Frames); -typedef double (*AudioEngine_Stream_GetDelay)(void *addonData, AEStreamHandle *handle); -typedef bool (*AudioEngine_Stream_IsBuffering)(void *addonData, AEStreamHandle *handle); -typedef double (*AudioEngine_Stream_GetCacheTime)(void *addonData, AEStreamHandle *handle); -typedef double (*AudioEngine_Stream_GetCacheTotal)(void *addonData, AEStreamHandle *handle); -typedef void (*AudioEngine_Stream_Pause)(void *addonData, AEStreamHandle *handle); -typedef void (*AudioEngine_Stream_Resume)(void *addonData, AEStreamHandle *handle); -typedef void (*AudioEngine_Stream_Drain)(void *addonData, AEStreamHandle *handle, bool Wait); -typedef bool (*AudioEngine_Stream_IsDraining)(void *addonData, AEStreamHandle *handle); -typedef bool (*AudioEngine_Stream_IsDrained)(void *addonData, AEStreamHandle *handle); -typedef void (*AudioEngine_Stream_Flush)(void *addonData, AEStreamHandle *handle); -typedef float (*AudioEngine_Stream_GetVolume)(void *addonData, AEStreamHandle *handle); -typedef void (*AudioEngine_Stream_SetVolume)(void *addonData, AEStreamHandle *handle, float Volume); -typedef float (*AudioEngine_Stream_GetAmplification)(void *addonData, AEStreamHandle *handle); -typedef void (*AudioEngine_Stream_SetAmplification)(void *addonData, AEStreamHandle *handle, float Amplify); -typedef const unsigned int (*AudioEngine_Stream_GetFrameSize)(void *addonData, AEStreamHandle *handle); -typedef const unsigned int (*AudioEngine_Stream_GetChannelCount)(void *addonData, AEStreamHandle *handle); -typedef const unsigned int (*AudioEngine_Stream_GetSampleRate)(void *addonData, AEStreamHandle *handle); -typedef const unsigned int (*AudioEngine_Stream_GetEncodedSampleRate)(void *addonData, AEStreamHandle *handle); -typedef const AEDataFormat (*AudioEngine_Stream_GetDataFormat)(void *addonData, AEStreamHandle *handle); -typedef double (*AudioEngine_Stream_GetResampleRatio)(void *addonData, AEStreamHandle *handle); -typedef bool (*AudioEngine_Stream_SetResampleRatio)(void *addonData, AEStreamHandle *handle, double Ratio); -typedef void (*AudioEngine_Stream_Discontinuity)(void *addonData, AEStreamHandle *handle); - -typedef struct CB_AudioEngineLib -{ - AudioEngine_MakeStream MakeStream; - AudioEngine_FreeStream FreeStream; - AudioEngine_GetCurrentSinkFormat GetCurrentSinkFormat; - - // AudioEngine stream callbacks - AudioEngine_Stream_GetSpace AEStream_GetSpace; - AudioEngine_Stream_AddData AEStream_AddData; - AudioEngine_Stream_GetDelay AEStream_GetDelay; - AudioEngine_Stream_IsBuffering AEStream_IsBuffering; - AudioEngine_Stream_GetCacheTime AEStream_GetCacheTime; - AudioEngine_Stream_GetCacheTotal AEStream_GetCacheTotal; - AudioEngine_Stream_Pause AEStream_Pause; - AudioEngine_Stream_Resume AEStream_Resume; - AudioEngine_Stream_Drain AEStream_Drain; - AudioEngine_Stream_IsDraining AEStream_IsDraining; - AudioEngine_Stream_IsDrained AEStream_IsDrained; - AudioEngine_Stream_Flush AEStream_Flush; - AudioEngine_Stream_GetVolume AEStream_GetVolume; - AudioEngine_Stream_SetVolume AEStream_SetVolume; - AudioEngine_Stream_GetAmplification AEStream_GetAmplification; - AudioEngine_Stream_SetAmplification AEStream_SetAmplification; - AudioEngine_Stream_GetFrameSize AEStream_GetFrameSize; - AudioEngine_Stream_GetChannelCount AEStream_GetChannelCount; - AudioEngine_Stream_GetSampleRate AEStream_GetSampleRate; - AudioEngine_Stream_GetEncodedSampleRate AEStream_GetEncodedSampleRate; - AudioEngine_Stream_GetDataFormat AEStream_GetDataFormat; - AudioEngine_Stream_GetResampleRatio AEStream_GetResampleRatio; - AudioEngine_Stream_SetResampleRatio AEStream_SetResampleRatio; - AudioEngine_Stream_Discontinuity AEStream_Discontinuity; -} CB_AudioEngineLib; - typedef void (*PVRTransferEpgEntry)(void *userData, const ADDON_HANDLE handle, const EPG_TAG *epgentry); typedef void (*PVRTransferChannelEntry)(void *userData, const ADDON_HANDLE handle, const PVR_CHANNEL *chan); typedef void (*PVRTransferTimerEntry)(void *userData, const ADDON_HANDLE handle, const PVR_TIMER *timer); @@ -506,10 +403,6 @@ typedef CB_AddOnLib* (*XBMCAddOnLib_RegisterMe)(void *addonData); typedef void (*XBMCAddOnLib_UnRegisterMe)(void *addonData, CB_AddOnLib *cbTable); -typedef CB_ADSPLib* (*KODIADSPLib_RegisterMe)(void *addonData); -typedef void (*KODIADSPLib_UnRegisterMe)(void *addonData, CB_ADSPLib *cbTable); -typedef CB_AudioEngineLib* (*KODIAudioEngineLib_RegisterMe)(void *addonData); -typedef void (*KODIAudioEngineLib_UnRegisterMe)(void *addonData, CB_AudioEngineLib *cbTable); typedef CB_CODECLib* (*XBMCCODECLib_RegisterMe)(void *addonData); typedef void (*XBMCCODECLib_UnRegisterMe)(void *addonData, CB_CODECLib *cbTable); typedef CB_GUILib* (*XBMCGUILib_RegisterMe)(void *addonData); @@ -523,16 +416,12 @@ void *addonData; XBMCAddOnLib_RegisterMe AddOnLib_RegisterMe; XBMCAddOnLib_UnRegisterMe AddOnLib_UnRegisterMe; - KODIAudioEngineLib_RegisterMe AudioEngineLib_RegisterMe; - KODIAudioEngineLib_UnRegisterMe AudioEngineLib_UnRegisterMe; XBMCCODECLib_RegisterMe CODECLib_RegisterMe; XBMCCODECLib_UnRegisterMe CODECLib_UnRegisterMe; XBMCGUILib_RegisterMe GUILib_RegisterMe; XBMCGUILib_UnRegisterMe GUILib_UnRegisterMe; XBMCPVRLib_RegisterMe PVRLib_RegisterMe; XBMCPVRLib_UnRegisterMe PVRLib_UnRegisterMe; - KODIADSPLib_RegisterMe ADSPLib_RegisterMe; - KODIADSPLib_UnRegisterMe ADSPLib_UnRegisterMe; } AddonCB; @@ -541,8 +430,6 @@ class CAddon; class CAddonCallbacksAddon; -class CAddonCallbacksADSP; -class CAddonCallbacksAudioEngine; class CAddonCallbacksCodec; class CAddonCallbacksGUI; class CAddonCallbacksPVR; @@ -556,10 +443,6 @@ static CB_AddOnLib* AddOnLib_RegisterMe(void *addonData); static void AddOnLib_UnRegisterMe(void *addonData, CB_AddOnLib *cbTable); - static CB_ADSPLib* ADSPLib_RegisterMe(void *addonData); - static void ADSPLib_UnRegisterMe(void *addonData, CB_ADSPLib *cbTable); - static CB_AudioEngineLib* AudioEngineLib_RegisterMe(void *addonData); - static void AudioEngineLib_UnRegisterMe(void *addonData, CB_AudioEngineLib *cbTable); static CB_CODECLib* CODECLib_RegisterMe(void *addonData); static void CODECLib_UnRegisterMe(void *addonData, CB_CODECLib *cbTable); static CB_GUILib* GUILib_RegisterMe(void *addonData); @@ -568,8 +451,6 @@ static void PVRLib_UnRegisterMe(void *addonData, CB_PVRLib *cbTable); CAddonCallbacksAddon *GetHelperAddon() { return m_helperAddon; } - CAddonCallbacksADSP *GetHelperADSP() { return m_helperADSP; } - CAddonCallbacksAudioEngine *GetHelperAudioEngine() { return m_helperAudioEngine; } CAddonCallbacksCodec *GetHelperCodec() { return m_helperCODEC; } CAddonCallbacksGUI *GetHelperGUI() { return m_helperGUI; } CAddonCallbacksPVR *GetHelperPVR() { return m_helperPVR; } @@ -578,8 +459,6 @@ AddonCB *m_callbacks; CAddon *m_addon; CAddonCallbacksAddon *m_helperAddon; - CAddonCallbacksADSP *m_helperADSP; - CAddonCallbacksAudioEngine *m_helperAudioEngine; CAddonCallbacksCodec *m_helperCODEC; CAddonCallbacksGUI *m_helperGUI; CAddonCallbacksPVR *m_helperPVR; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksPVR.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksPVR.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonCallbacksPVR.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonCallbacksPVR.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,8 +20,6 @@ #include "Application.h" #include "AddonCallbacksPVR.h" -#include "events/EventLog.h" -#include "events/NotificationEvent.h" #include "utils/log.h" #include "utils/StringUtils.h" #include "dialogs/GUIDialogKaiToast.h" @@ -213,8 +211,12 @@ return; } - /* Note: channel can be NULL here, for instance for epg-based repeating timers ("record on any channel" condition). */ CPVRChannelPtr channel = g_PVRChannelGroups->GetByUniqueID(timer->iClientChannelUid, client->GetID()); + if (!channel) + { + CLog::Log(LOGERROR, "PVR - %s - cannot find channel %d on client %d", __FUNCTION__, timer->iClientChannelUid, client->GetID()); + return; + } /* transfer this entry to the timers container */ CPVRTimerInfoTagPtr transferTimer(new CPVRTimerInfoTag(*timer, channel, client->GetID())); @@ -252,7 +254,12 @@ return; } - std::string strLine1 = StringUtils::Format(g_localizeStrings.Get(bOnOff ? 19197 : 19198).c_str(), client->Name().c_str()); + std::string strLine1; + if (bOnOff) + strLine1 = StringUtils::Format(g_localizeStrings.Get(19197).c_str(), client->Name().c_str()); + else + strLine1 = StringUtils::Format(g_localizeStrings.Get(19198).c_str(), client->Name().c_str()); + std::string strLine2; if (strName) strLine2 = strName; @@ -261,7 +268,6 @@ /* display a notification for 5 seconds */ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, strLine1, strLine2, 5000, false); - CEventLog::GetInstance().Add(EventPtr(new CNotificationEvent(client->Name(), strLine1, client->Icon(), strLine2))); CLog::Log(LOGDEBUG, "PVR - %s - recording %s on client '%s'. name='%s' filename='%s'", __FUNCTION__, bOnOff ? "started" : "finished", client->Name().c_str(), strName, strFileName); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Addon.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/Addon.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/Addon.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Addon.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,27 +19,13 @@ */ #include "Addon.h" - -#include -#include -#include -#include - #include "AddonManager.h" #include "addons/Service.h" #include "ContextMenuManager.h" +#include "settings/Settings.h" #include "filesystem/Directory.h" #include "filesystem/File.h" -#include "RepositoryUpdater.h" -#include "settings/Settings.h" #include "system.h" -#include "URL.h" -#include "Util.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "utils/Variant.h" - #ifdef HAS_PYTHON #include "interfaces/python/XBPython.h" #endif @@ -49,9 +35,18 @@ #ifdef TARGET_FREEBSD #include "freebsd/FreeBSDGNUReplacements.h" #endif +#include "utils/log.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "URL.h" +#include "Util.h" +#include +#include +#include using XFILE::CDirectory; using XFILE::CFile; +using namespace std; namespace ADDON { @@ -99,10 +94,8 @@ {"xbmc.audioencoder", ADDON_AUDIOENCODER, 200, "DefaultAddonAudioEncoder.png" }, {"kodi.audiodecoder", ADDON_AUDIODECODER, 201, "DefaultAddonAudioDecoder.png" }, {"xbmc.service", ADDON_SERVICE, 24018, "DefaultAddonService.png" }, - {"kodi.resource.images", ADDON_RESOURCE_IMAGES, 24035, "DefaultAddonImages.png" }, {"kodi.resource.language", ADDON_RESOURCE_LANGUAGE, 24026, "DefaultAddonLanguage.png" }, {"kodi.resource.uisounds", ADDON_RESOURCE_UISOUNDS, 24006, "DefaultAddonUISounds.png" }, - {"kodi.adsp", ADDON_ADSPDLL, 24135, "DefaultAddonAudioDSP.png" }, }; const std::string TranslateType(const ADDON::TYPE &type, bool pretty/*=false*/) @@ -146,7 +139,7 @@ #define EMPTY_IF(x,y) \ { \ - std::string fan=CAddonMgr::GetInstance().GetExtValue(metadata->configuration, x); \ + std::string fan=CAddonMgr::Get().GetExtValue(metadata->configuration, x); \ if (fan == "true") \ y.clear(); \ } @@ -169,20 +162,20 @@ fanart = URIUtils::AddFileToFolder(path, "fanart.jpg"); changelog = URIUtils::AddFileToFolder(path, "changelog.txt"); // Grab more detail from the props... - const cp_extension_t *metadata = CAddonMgr::GetInstance().GetExtension(ext->plugin, "xbmc.addon.metadata"); //plugin, "xbmc.addon.metadata"); //plugin, "kodi.addon.metadata"); + metadata = CAddonMgr::Get().GetExtension(ext->plugin, "kodi.addon.metadata"); if (metadata) { - summary = CAddonMgr::GetInstance().GetTranslatedString(metadata->configuration, "summary"); - description = CAddonMgr::GetInstance().GetTranslatedString(metadata->configuration, "description"); - disclaimer = CAddonMgr::GetInstance().GetTranslatedString(metadata->configuration, "disclaimer"); - license = CAddonMgr::GetInstance().GetExtValue(metadata->configuration, "license"); + summary = CAddonMgr::Get().GetTranslatedString(metadata->configuration, "summary"); + description = CAddonMgr::Get().GetTranslatedString(metadata->configuration, "description"); + disclaimer = CAddonMgr::Get().GetTranslatedString(metadata->configuration, "disclaimer"); + license = CAddonMgr::Get().GetExtValue(metadata->configuration, "license"); std::string language; - language = CAddonMgr::GetInstance().GetExtValue(metadata->configuration, "language"); + language = CAddonMgr::Get().GetExtValue(metadata->configuration, "language"); if (!language.empty()) - extrainfo.insert(std::make_pair("language",language)); - broken = CAddonMgr::GetInstance().GetExtValue(metadata->configuration, "broken"); + extrainfo.insert(make_pair("language",language)); + broken = CAddonMgr::Get().GetExtValue(metadata->configuration, "broken"); EMPTY_IF("nofanart",fanart) EMPTY_IF("noicon",icon) EMPTY_IF("nochangelog",changelog) @@ -261,8 +254,8 @@ if (!plugin) return; for (unsigned int i = 0; i < plugin->num_imports; ++i) - dependencies.insert(std::make_pair(std::string(plugin->imports[i].plugin_id), - std::make_pair(AddonVersion(SS(plugin->imports[i].version)), plugin->imports[i].optional != 0))); + dependencies.insert(make_pair(std::string(plugin->imports[i].plugin_id), + make_pair(AddonVersion(SS(plugin->imports[i].version)), plugin->imports[i].optional != 0))); } /** @@ -363,9 +356,6 @@ case ADDON_PVRDLL: ext = ADDON_PVRDLL_EXT; break; - case ADDON_ADSPDLL: - ext = ADDON_DSP_AUDIO_EXT; - break; case ADDON_SCRIPT: case ADDON_SCRIPT_LIBRARY: case ADDON_SCRIPT_LYRICS: @@ -389,11 +379,6 @@ { switch (m_props.type) { - case ADDON_PVRDLL: - case ADDON_ADSPDLL: - case ADDON_AUDIOENCODER: - case ADDON_AUDIODECODER: - case ADDON_VIZ: case ADDON_SCREENSAVER: case ADDON_SCRIPT: case ADDON_SCRIPT_LIBRARY: @@ -407,35 +392,23 @@ case ADDON_SCRAPER_MUSICVIDEOS: case ADDON_SCRAPER_TVSHOWS: case ADDON_SCRAPER_LIBRARY: + case ADDON_PVRDLL: case ADDON_PLUGIN: case ADDON_WEB_INTERFACE: case ADDON_SERVICE: case ADDON_REPOSITORY: + case ADDON_AUDIOENCODER: case ADDON_CONTEXT_ITEM: - m_strLibName = CAddonMgr::GetInstance().GetExtValue(extension->configuration, "@library"); + case ADDON_AUDIODECODER: + { + std::string temp = CAddonMgr::Get().GetExtValue(extension->configuration, "@library"); + m_strLibName = temp; + } break; default: m_strLibName.clear(); break; } - - // if library attribute isn't present, look for a system-dependent one - if (m_strLibName.empty()) - { - switch (m_props.type) - { - case ADDON_ADSPDLL: - case ADDON_AUDIODECODER: - case ADDON_AUDIOENCODER: - case ADDON_PVRDLL: - case ADDON_VIZ: - case ADDON_SCREENSAVER: - m_strLibName = CAddonMgr::GetInstance().GetPlatformLibraryName(extension->configuration); - break; - default: - break; - } - } } } @@ -447,7 +420,7 @@ // Path where the language strings reside std::string chosenPath = URIUtils::AddFileToFolder(m_props.path, "resources/language/"); - m_hasStrings = m_strings.Load(chosenPath, CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_LANGUAGE)); + m_hasStrings = m_strings.Load(chosenPath, CSettings::Get().GetString("locale.language")); return m_checkedStrings = true; } @@ -525,14 +498,9 @@ return m_userSettingsLoaded; } -bool CAddon::HasSettingsToSave() const -{ - return !m_settings.empty(); -} - void CAddon::SaveSettings(void) { - if (!HasSettingsToSave()) + if (m_settings.empty()) return; // no settings to save // break down the path into directories @@ -553,7 +521,7 @@ doc.SaveFile(m_userSettingsPath); m_userSettingsLoaded = true; - CAddonMgr::GetInstance().ReloadSettings(ID());//push the settings changes to the running addon instance + CAddonMgr::Get().ReloadSettings(ID());//push the settings changes to the running addon instance #ifdef HAS_PYTHON g_pythonParser.OnSettingsChanged(ID()); #endif @@ -564,7 +532,7 @@ if (!LoadSettings()) return ""; // no settings available - std::map::const_iterator i = m_settings.find(key); + map::const_iterator i = m_settings.find(key); if (i != m_settings.end()) return i->second; return ""; @@ -613,7 +581,7 @@ { TiXmlElement node("settings"); doc.InsertEndChild(node); - for (std::map::const_iterator i = m_settings.begin(); i != m_settings.end(); ++i) + for (map::const_iterator i = m_settings.begin(); i != m_settings.end(); ++i) { TiXmlElement nodeSetting("setting"); nodeSetting.SetAttribute("id", i->first.c_str()); @@ -658,32 +626,27 @@ { // If the addon is a special, call enabled handler AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(id, addon, ADDON_PVRDLL) || - CAddonMgr::GetInstance().GetAddon(id, addon, ADDON_ADSPDLL)) + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_PVRDLL)) return addon->OnEnabled(); - if (CAddonMgr::GetInstance().GetAddon(id, addon, ADDON_SERVICE)) + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE)) std::static_pointer_cast(addon)->Start(); - if (CAddonMgr::GetInstance().GetAddon(id, addon, ADDON_CONTEXT_ITEM)) - CContextMenuManager::GetInstance().Register(std::static_pointer_cast(addon)); - - if (CAddonMgr::GetInstance().GetAddon(id, addon, ADDON_REPOSITORY)) - CRepositoryUpdater::GetInstance().ScheduleUpdate(); //notify updater there is a new addon + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_CONTEXT_ITEM)) + CContextMenuManager::Get().Register(std::static_pointer_cast(addon)); } void OnDisabled(const std::string& id) { AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(id, addon, ADDON_PVRDLL, false) || - CAddonMgr::GetInstance().GetAddon(id, addon, ADDON_ADSPDLL, false)) + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_PVRDLL, false)) return addon->OnDisabled(); - if (CAddonMgr::GetInstance().GetAddon(id, addon, ADDON_SERVICE, false)) + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE, false)) std::static_pointer_cast(addon)->Stop(); - if (CAddonMgr::GetInstance().GetAddon(id, addon, ADDON_CONTEXT_ITEM, false)) - CContextMenuManager::GetInstance().Unregister(std::static_pointer_cast(addon)); + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_CONTEXT_ITEM, false)) + CContextMenuManager::Get().Unregister(std::static_pointer_cast(addon)); } void OnPreInstall(const AddonPtr& addon) @@ -691,11 +654,11 @@ //Before installing we need to stop/unregister any local addon //that have this id, regardless of what the 'new' addon is. AddonPtr localAddon; - if (CAddonMgr::GetInstance().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) std::static_pointer_cast(localAddon)->Stop(); - if (CAddonMgr::GetInstance().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) - CContextMenuManager::GetInstance().Unregister(std::static_pointer_cast(localAddon)); + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) + CContextMenuManager::Get().Unregister(std::static_pointer_cast(localAddon)); //Fallback to the pre-install callback in the addon. //BUG: If primary extension point have changed we're calling the wrong method. @@ -705,14 +668,11 @@ void OnPostInstall(const AddonPtr& addon, bool update, bool modal) { AddonPtr localAddon; - if (CAddonMgr::GetInstance().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) std::static_pointer_cast(localAddon)->Start(); - if (CAddonMgr::GetInstance().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) - CContextMenuManager::GetInstance().Register(std::static_pointer_cast(localAddon)); - - if (CAddonMgr::GetInstance().GetAddon(addon->ID(), localAddon, ADDON_REPOSITORY)) - CRepositoryUpdater::GetInstance().ScheduleUpdate(); //notify updater there is a new addon or version + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) + CContextMenuManager::Get().Register(std::static_pointer_cast(localAddon)); addon->OnPostInstall(update, modal); } @@ -720,11 +680,11 @@ void OnPreUnInstall(const AddonPtr& addon) { AddonPtr localAddon; - if (CAddonMgr::GetInstance().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) std::static_pointer_cast(localAddon)->Stop(); - if (CAddonMgr::GetInstance().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) - CContextMenuManager::GetInstance().Unregister(std::static_pointer_cast(localAddon)); + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) + CContextMenuManager::Get().Unregister(std::static_pointer_cast(localAddon)); addon->OnPreUnInstall(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonDatabase.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonDatabase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonDatabase.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonDatabase.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,19 +19,15 @@ */ #include "AddonDatabase.h" - -#include -#include - #include "addons/AddonManager.h" -#include "dbwrappers/dataset.h" #include "utils/log.h" -#include "utils/StringUtils.h" #include "utils/Variant.h" +#include "utils/StringUtils.h" #include "XBDateTime.h" - +#include "dbwrappers/dataset.h" using namespace ADDON; +using namespace std; CAddonDatabase::CAddonDatabase() { @@ -75,7 +71,7 @@ m_pDS->exec("CREATE TABLE broken (id integer primary key, addonID text, reason text)\n"); CLog::Log(LOGINFO, "create blacklist table"); - m_pDS->exec("CREATE TABLE blacklist (id integer primary key, addonID text)\n"); + m_pDS->exec("CREATE TABLE blacklist (id integer primary key, addonID text, version text)\n"); CLog::Log(LOGINFO, "create package table"); m_pDS->exec("CREATE TABLE package (id integer primary key, addonID text, filename text, hash text)\n"); @@ -117,13 +113,6 @@ { m_pDS->exec("CREATE TABLE system (id integer primary key, addonID text)\n"); } - if (version < 20) - { - m_pDS->exec("CREATE TABLE tmp (id INTEGER PRIMARY KEY, addonID TEXT)"); - m_pDS->exec("INSERT INTO tmp (addonID) SELECT addonID FROM blacklist GROUP BY addonID"); - m_pDS->exec("DROP TABLE blacklist"); - m_pDS->exec("ALTER TABLE tmp RENAME TO blacklist"); - } } int CAddonDatabase::GetAddonId(const ADDON::AddonPtr& item) @@ -153,23 +142,23 @@ addon->ID().c_str(), addon->Version().asString().c_str(), addon->Author().c_str(),addon->Disclaimer().c_str(), addon->MinVersion().asString().c_str()); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); int idAddon = (int)m_pDS->lastinsertid(); sql = PrepareSQL("insert into addonlinkrepo (idRepo, idAddon) values (%i,%i)",idRepo,idAddon); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); const InfoMap &info = addon->ExtraInfo(); for (InfoMap::const_iterator i = info.begin(); i != info.end(); ++i) { sql = PrepareSQL("insert into addonextra(id, key, value) values (%i, '%s', '%s')", idAddon, i->first.c_str(), i->second.c_str()); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } const ADDONDEPS &deps = addon->GetDeps(); for (ADDONDEPS::const_iterator i = deps.begin(); i != deps.end(); ++i) { sql = PrepareSQL("insert into dependencies(id, addon, version, optional) values (%i, '%s', '%s', %i)", idAddon, i->first.c_str(), i->second.first.asString().c_str(), i->second.second ? 1 : 0); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } return idAddon; } @@ -180,84 +169,37 @@ return -1; } -std::pair CAddonDatabase::GetAddonVersion(const std::string &id) +AddonVersion CAddonDatabase::GetAddonVersion(const std::string &id) { - auto empty = std::make_pair(AddonVersion("0.0.0"), ""); + AddonVersion maxversion("0.0.0"); try { - if (NULL == m_pDB.get()) return empty; - if (NULL == m_pDS2.get()) return empty; - - std::vector> versions; - if (GetAvailableVersions(id, versions) && versions.size() > 0) - return *std::max_element(versions.begin(), versions.end()); - } - catch (...) - { - CLog::Log(LOGERROR, "%s failed on addon %s", __FUNCTION__, id.c_str()); - } - return empty; -} + if (NULL == m_pDB.get()) return maxversion; + if (NULL == m_pDS2.get()) return maxversion; -bool CAddonDatabase::GetAvailableVersions(const std::string& addonId, - std::vector>& versionsInfo) -{ - try - { - if (NULL == m_pDB.get()) return false; - if (NULL == m_pDS.get()) return false; + // there may be multiple addons with this id (eg from different repositories) in the database, + // so we want to retrieve the latest version. Order by version won't work as the database + // won't know that 1.10 > 1.2, so grab them all and order outside + std::string sql = PrepareSQL("select version from addon where addonID='%s'",id.c_str()); + m_pDS2->query(sql.c_str()); - std::string sql = PrepareSQL( - "SELECT addon.version, repo.addonID AS repoID FROM addon " - "JOIN addonlinkrepo ON addonlinkrepo.idAddon=addon.id " - "JOIN repo ON repo.id=addonlinkrepo.idRepo " - "WHERE NOT EXISTS (SELECT * FROM disabled WHERE disabled.addonID=repoID) " - "AND NOT EXISTS (SELECT * FROM broken WHERE broken.addonID=addon.addonID) " - "AND addon.addonID='%s'", addonId.c_str()); + if (m_pDS2->eof()) + return maxversion; - m_pDS->query(sql.c_str()); - while (!m_pDS->eof()) + while (!m_pDS2->eof()) { - AddonVersion version(m_pDS->fv(0).get_asString()); - std::string repo = m_pDS->fv(1).get_asString(); - versionsInfo.push_back(std::make_pair(version, repo)); - m_pDS->next(); + AddonVersion version(m_pDS2->fv(0).get_asString()); + if (version > maxversion) + maxversion = version; + m_pDS2->next(); } - return true; - } - catch (...) - { - CLog::Log(LOGERROR, "%s failed on addon %s", __FUNCTION__, addonId.c_str()); - } - return false; -} - -bool CAddonDatabase::GetAddon(const std::string& addonID, const AddonVersion& version, const std::string& repoId, AddonPtr& addon) -{ - try - { - if (NULL == m_pDB.get()) return false; - if (NULL == m_pDS.get()) return false; - - std::string sql = PrepareSQL( - "SELECT addon.id, addon.addonID, repo.addonID AS repoID FROM addon " - "JOIN addonlinkrepo ON addonlinkrepo.idAddon=addon.id " - "JOIN repo ON repo.id=addonlinkrepo.idRepo " - "WHERE addon.addonID='%s' AND addon.version='%s' AND repoID='%s'", - addonID.c_str(), version.asString().c_str(), repoId.c_str()); - - m_pDS->query(sql.c_str()); - if (m_pDS->eof()) - return false; - - return GetAddon(m_pDS->fv(0).get_asInt(), addon); + return maxversion; } catch (...) { - CLog::Log(LOGERROR, "%s failed on addon %s", __FUNCTION__, addonID.c_str()); + CLog::Log(LOGERROR, "%s failed on addon %s", __FUNCTION__, id.c_str()); } - return false; - + return maxversion; } bool CAddonDatabase::GetAddon(const std::string& id, AddonPtr& addon) @@ -271,7 +213,7 @@ // so we want to retrieve the latest version. Order by version won't work as the database // won't know that 1.10 > 1.2, so grab them all and order outside std::string sql = PrepareSQL("select id,version from addon where addonID='%s'",id.c_str()); - m_pDS2->query(sql); + m_pDS2->query(sql.c_str()); if (m_pDS2->eof()) return false; @@ -298,6 +240,29 @@ return false; } +bool CAddonDatabase::GetRepoForAddon(const std::string& addonID, std::string& repo) +{ + try + { + if (NULL == m_pDB.get()) return false; + if (NULL == m_pDS2.get()) return false; + + std::string sql = PrepareSQL("select repo.addonID from repo join addonlinkrepo on repo.id=addonlinkrepo.idRepo join addon on addonlinkrepo.idAddon=addon.id where addon.addonID like '%s'", addonID.c_str()); + m_pDS2->query(sql.c_str()); + if (!m_pDS2->eof()) + { + repo = m_pDS2->fv(0).get_asString(); + m_pDS2->close(); + return true; + } + } + catch (...) + { + CLog::Log(LOGERROR, "%s failed for addon %s", __FUNCTION__, addonID.c_str()); + } + return false; +} + bool CAddonDatabase::GetAddon(int id, AddonPtr &addon) { try @@ -319,7 +284,7 @@ sql += PrepareSQL(" WHERE addon.id=%i", id); - m_pDS2->query(sql); + m_pDS2->query(sql.c_str()); if (!m_pDS2->eof()) { const dbiplus::query_data &data = m_pDS2->get_result_set().records; @@ -345,9 +310,9 @@ { const dbiplus::sql_record* const record = *i; if (!record->at(addonextra_key).get_asString().empty()) - props.extrainfo.insert(std::make_pair(record->at(addonextra_key).get_asString(), record->at(addonextra_value).get_asString())); + props.extrainfo.insert(make_pair(record->at(addonextra_key).get_asString(), record->at(addonextra_value).get_asString())); if (!m_pDS2->fv(dependencies_addon).get_asString().empty()) - props.dependencies.insert(std::make_pair(record->at(dependencies_addon).get_asString(), std::make_pair(AddonVersion(record->at(dependencies_version).get_asString()), record->at(dependencies_optional).get_asBool()))); + props.dependencies.insert(make_pair(record->at(dependencies_addon).get_asString(), make_pair(AddonVersion(record->at(dependencies_version).get_asString()), record->at(dependencies_optional).get_asBool()))); } addon = CAddonMgr::AddonFromProps(props); @@ -383,7 +348,7 @@ sql += PrepareSQL(" AND a.type = '%s'", strType.c_str()); } - m_pDS->query(sql); + m_pDS->query(sql.c_str()); while (!m_pDS->eof()) { AddonPtr addon; @@ -409,7 +374,7 @@ if (NULL == m_pDS.get()) return; std::string sql = PrepareSQL("select id from repo where addonID='%s'",id.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (!m_pDS->eof()) DeleteRepository(m_pDS->fv(0).get_asInt()); } @@ -427,15 +392,15 @@ if (NULL == m_pDS.get()) return; std::string sql = PrepareSQL("delete from repo where id=%i",idRepo); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); sql = PrepareSQL("delete from addon where id in (select idAddon from addonlinkrepo where idRepo=%i)",idRepo); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); sql = PrepareSQL("delete from addonextra where id in (select idAddon from addonlinkrepo where idRepo=%i)",idRepo); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); sql = PrepareSQL("delete from dependencies where id in (select idAddon from addonlinkrepo where idRepo=%i)",idRepo); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); sql = PrepareSQL("delete from addonlinkrepo where idRepo=%i",idRepo); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } catch (...) @@ -456,15 +421,12 @@ if (idRepo > -1) DeleteRepository(idRepo); - if (!SetLastChecked(id, version, CDateTime::GetCurrentDateTime().GetAsDBDateTime())) - return -1; - BeginTransaction(); - sql = PrepareSQL("UPDATE repo SET checksum='%s', version='%s' WHERE addonID='%s'", - checksum.c_str(), version.asString().c_str(), id.c_str()); - - m_pDS->exec(sql); + CDateTime time = CDateTime::GetCurrentDateTime(); + sql = PrepareSQL("insert into repo (id,addonID,checksum,lastcheck,version) values (NULL,'%s','%s','%s','%s')", + id.c_str(), checksum.c_str(), time.GetAsDBDateTime().c_str(), version.asString().c_str()); + m_pDS->exec(sql.c_str()); idRepo = (int)m_pDS->lastinsertid(); for (unsigned int i=0;iquery(strSQL); + m_pDS->query(strSQL.c_str()); if (!m_pDS->eof()) { checksum = m_pDS->fv("checksum").get_asString(); @@ -503,50 +465,63 @@ return -1; } -std::pair CAddonDatabase::LastChecked(const std::string& id) +CDateTime CAddonDatabase::GetRepoTimestamp(const std::string& id) { CDateTime date; - AddonVersion version("0.0.0"); try { - if (m_pDB.get() != nullptr && m_pDS.get() != nullptr) + if (NULL == m_pDB.get()) return date; + if (NULL == m_pDS.get()) return date; + + std::string strSQL = PrepareSQL("select * from repo where addonID='%s'",id.c_str()); + m_pDS->query(strSQL.c_str()); + if (!m_pDS->eof()) { - std::string strSQL = PrepareSQL("select * from repo where addonID='%s'",id.c_str()); - m_pDS->query(strSQL); - if (!m_pDS->eof()) - { - date.SetFromDBDateTime(m_pDS->fv("lastcheck").get_asString()); - version = AddonVersion(m_pDS->fv("version").get_asString()); - } + date.SetFromDBDateTime(m_pDS->fv("lastcheck").get_asString()); + return date; } } catch (...) { CLog::Log(LOGERROR, "%s failed on repo '%s'", __FUNCTION__, id.c_str()); } - return std::make_pair(date, version); + return date; } -bool CAddonDatabase::SetLastChecked(const std::string& id, - const ADDON::AddonVersion& version, const std::string& time) +AddonVersion CAddonDatabase::GetRepoVersion(const std::string& id) +{ + AddonVersion version("0.0.0"); + try + { + if (NULL == m_pDB.get()) return version; + if (NULL == m_pDS2.get()) return version; + + std::string strSQL = PrepareSQL("select * from repo where addonID='%s'",id.c_str()); + m_pDS->query(strSQL.c_str()); + if (!m_pDS->eof()) + { + return AddonVersion(m_pDS->fv("version").get_asString()); + } + } + catch (...) + { + CLog::Log(LOGERROR, "%s failed on addon %s", __FUNCTION__, id.c_str()); + } + return version; +} + +bool CAddonDatabase::SetRepoTimestamp(const std::string& id, const std::string& time, const ADDON::AddonVersion& version) { try { if (NULL == m_pDB.get()) return false; if (NULL == m_pDS.get()) return false; - std::string sql = PrepareSQL("SELECT * FROM repo WHERE addonID='%s'", id.c_str()); - m_pDS->query(sql); - - if (m_pDS->eof()) - sql = PrepareSQL("INSERT INTO repo (id, addonID, lastcheck, version) " - "VALUES (NULL, '%s', '%s', '%s')", id.c_str(), time.c_str(), version.asString().c_str()); - else - sql = PrepareSQL("UPDATE repo SET lastcheck='%s', version='%s' WHERE addonID='%s'", - time.c_str(), version.asString().c_str(), id.c_str()); + std::string sql = PrepareSQL("UPDATE repo SET lastcheck='%s', version='%s' WHERE addonID='%s'", + time.c_str(), version.asString().c_str(), id.c_str()); + m_pDS->exec(sql.c_str()); - m_pDS->exec(sql); return true; } catch (...) @@ -556,29 +531,19 @@ return false; } -bool CAddonDatabase::GetRepositoryContent(const std::string& id, VECADDONS& addons) +bool CAddonDatabase::GetRepository(int id, VECADDONS& addons) { try { if (NULL == m_pDB.get()) return false; if (NULL == m_pDS.get()) return false; - std::string query = PrepareSQL("select id from repo where addonID='%s'" - " AND checksum != '' and lastcheck != ''", id.c_str()); - m_pDS->query(query); - if (m_pDS->eof()) - return false; - - query = PrepareSQL("SELECT addon.id FROM addon " - "JOIN addonlinkrepo ON addonlinkrepo.idAddon=addon.id " - "WHERE addonlinkrepo.idRepo=%i GROUP BY addon.addonID", - m_pDS->fv(0).get_asInt()); - - m_pDS->query(query); + std::string strSQL = PrepareSQL("select * from addonlinkrepo where idRepo=%i",id); + m_pDS->query(strSQL.c_str()); while (!m_pDS->eof()) { AddonPtr addon; - if (GetAddon(m_pDS->fv(0).get_asInt(), addon)) + if (GetAddon(m_pDS->fv("idAddon").get_asInt(),addon)) addons.push_back(addon); m_pDS->next(); } @@ -586,6 +551,25 @@ } catch (...) { + CLog::Log(LOGERROR, "%s failed on repo %i", __FUNCTION__, id); + } + return false; +} + +bool CAddonDatabase::GetRepository(const std::string& id, VECADDONS& addons) +{ + try + { + if (NULL == m_pDB.get()) return false; + if (NULL == m_pDS.get()) return false; + + std::string strSQL = PrepareSQL("select id from repo where addonID='%s'",id.c_str()); + m_pDS->query(strSQL.c_str()); + if (!m_pDS->eof()) + return GetRepository(m_pDS->fv(0).get_asInt(),addons); + } + catch (...) + { CLog::Log(LOGERROR, "%s failed on repo %s", __FUNCTION__, id.c_str()); } return false; @@ -602,7 +586,7 @@ strSQL=PrepareSQL("SELECT addonID FROM addon WHERE name LIKE '%%%s%%' OR summary LIKE '%%%s%%' OR description LIKE '%%%s%%'", search.c_str(), search.c_str(), search.c_str()); CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) return false; while (!m_pDS->eof()) @@ -689,6 +673,14 @@ addonID.c_str(), reason.c_str())); } +bool CAddonDatabase::HasAddon(const std::string &addonID) +{ + std::string strWhereClause = PrepareSQL("addonID = '%s'", addonID.c_str()); + std::string strHasAddon = GetSingleValue("addon", "id", strWhereClause); + + return !strHasAddon.empty(); +} + bool CAddonDatabase::IsAddonDisabled(const std::string &addonID) { try @@ -697,7 +689,7 @@ if (NULL == m_pDS.get()) return false; std::string sql = PrepareSQL("select id from disabled where addonID='%s'", addonID.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); bool ret = !m_pDS->eof(); // in the disabled table -> disabled m_pDS->close(); return ret; @@ -717,7 +709,7 @@ if (NULL == m_pDS.get()) return false; std::string sql = PrepareSQL("SELECT addonID FROM disabled"); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); while (!m_pDS->eof()) { addons.push_back(m_pDS->fv(0).get_asString()); @@ -733,22 +725,30 @@ return false; } -bool CAddonDatabase::GetBlacklisted(std::vector& addons) +bool CAddonDatabase::IsSystemPVRAddonEnabled(const std::string &addonID) +{ + std::string strWhereClause = PrepareSQL("addonID = '%s'", addonID.c_str()); + std::string strEnabled = GetSingleValue("pvrenabled", "id", strWhereClause); + + return !strEnabled.empty(); +} + +std::string CAddonDatabase::IsAddonBroken(const std::string &addonID) +{ + return GetSingleValue(PrepareSQL("SELECT reason FROM broken WHERE addonID='%s'", addonID.c_str())); +} + +bool CAddonDatabase::HasDisabledAddons() { try { if (NULL == m_pDB.get()) return false; if (NULL == m_pDS.get()) return false; - std::string sql = PrepareSQL("SELECT addonID FROM blacklist"); - m_pDS->query(sql); - while (!m_pDS->eof()) - { - addons.push_back(m_pDS->fv(0).get_asString()); - m_pDS->next(); - } + m_pDS->query("select count(id) from disabled"); + bool ret = !m_pDS->eof() && m_pDS->fv(0).get_asInt() > 0; // have rows -> have disabled addons m_pDS->close(); - return true; + return ret; } catch (...) { @@ -757,43 +757,48 @@ return false; } -std::string CAddonDatabase::IsAddonBroken(const std::string &addonID) -{ - return GetSingleValue(PrepareSQL("SELECT reason FROM broken WHERE addonID='%s'", addonID.c_str())); -} - -bool CAddonDatabase::BlacklistAddon(const std::string& addonID) +bool CAddonDatabase::BlacklistAddon(const std::string& addonID, + const std::string& version) { try { if (NULL == m_pDB.get()) return false; if (NULL == m_pDS.get()) return false; - std::string sql = PrepareSQL("INSERT INTO blacklist(id, addonID) VALUES(NULL, '%s')", addonID.c_str()); + std::string sql = PrepareSQL("insert into blacklist(id, addonID, version) values(NULL, '%s', '%s')", addonID.c_str(),version.c_str()); m_pDS->exec(sql); + return true; } catch (...) { - CLog::Log(LOGERROR, "%s failed on addon '%s'", __FUNCTION__, addonID.c_str()); + CLog::Log(LOGERROR, "%s failed on addon '%s' for version '%s'", __FUNCTION__, addonID.c_str(),version.c_str()); } return false; } -bool CAddonDatabase::RemoveAddonFromBlacklist(const std::string& addonID) +bool CAddonDatabase::IsAddonBlacklisted(const std::string& addonID, + const std::string& version) +{ + std::string where = PrepareSQL("addonID='%s' and version='%s'",addonID.c_str(),version.c_str()); + return !GetSingleValue("blacklist","addonID",where).empty(); +} + +bool CAddonDatabase::RemoveAddonFromBlacklist(const std::string& addonID, + const std::string& version) { try { if (NULL == m_pDB.get()) return false; if (NULL == m_pDS.get()) return false; - std::string sql = PrepareSQL("DELETE FROM blacklist WHERE addonID='%s'", addonID.c_str()); + std::string sql = PrepareSQL("delete from blacklist where addonID='%s' and version='%s'",addonID.c_str(),version.c_str()); m_pDS->exec(sql); return true; } catch (...) { - CLog::Log(LOGERROR, "%s failed on addon '%s'", __FUNCTION__, addonID.c_str()); + CLog::Log(LOGERROR, "%s failed on addon '%s' for version '%s'", __FUNCTION__, addonID.c_str(),version.c_str()); } return false; } @@ -858,7 +863,7 @@ return false; std::string sql = PrepareSQL("select id from system where addonID='%s'", addonID.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); bool ret = !m_pDS->eof(); m_pDS->close(); return ret; @@ -869,10 +874,3 @@ } return false; } - -void CAddonDatabase::OnPostUnInstall(const std::string& addonId) -{ - DisableAddon(addonId, false); - RemoveAddonFromBlacklist(addonId); - DeleteRepository(addonId); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonDatabase.h kodi-15.2~git20151019.1039-final/xbmc/addons/AddonDatabase.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonDatabase.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonDatabase.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,12 +19,10 @@ * */ -#include -#include - -#include "addons/Addon.h" #include "dbwrappers/Database.h" +#include "addons/Addon.h" #include "FileItem.h" +#include class CAddonDatabase : public CDatabase { @@ -36,40 +34,35 @@ int GetAddonId(const ADDON::AddonPtr& item); int AddAddon(const ADDON::AddonPtr& item, int idRepo); bool GetAddon(const std::string& addonID, ADDON::AddonPtr& addon); - - /*! \brief Get an addon with a specific version and repository. */ - bool GetAddon(const std::string& addonID, const ADDON::AddonVersion& version, const std::string& repoId, ADDON::AddonPtr& addon); - bool GetAddons(ADDON::VECADDONS& addons, const ADDON::TYPE &type = ADDON::ADDON_UNKNOWN); /*! Get the addon IDs that has been set to disabled */ bool GetDisabled(std::vector& addons); - bool GetAvailableVersions(const std::string& addonId, - std::vector>& versionsInfo); - - /*! Get the most recent version for an add-on and the repo id it belongs to*/ - std::pair GetAddonVersion(const std::string &id); + /*! \brief grab the (largest) add-on version for an add-on */ + ADDON::AddonVersion GetAddonVersion(const std::string &id); + /*! \brief Grab the repository from which a given addon came + \param addonID - the id of the addon in question + \param repo [out] - the id of the repository + \return true if a repo was found, false otherwise. + */ + bool GetRepoForAddon(const std::string& addonID, std::string& repo); int AddRepository(const std::string& id, const ADDON::VECADDONS& addons, const std::string& checksum, const ADDON::AddonVersion& version); void DeleteRepository(const std::string& id); void DeleteRepository(int id); int GetRepoChecksum(const std::string& id, std::string& checksum); + bool GetRepository(const std::string& id, ADDON::VECADDONS& addons); + bool GetRepository(int id, ADDON::VECADDONS& addons); + bool SetRepoTimestamp(const std::string& id, const std::string& timestamp, const ADDON::AddonVersion& version); - /*! - \brief Get addons in repository `id` - \param id id of the repository - \returns true on success, false on error or if repository have never been synced. - */ - bool GetRepositoryContent(const std::string& id, ADDON::VECADDONS& addons); - bool SetLastChecked(const std::string& id, const ADDON::AddonVersion& version, const std::string& timestamp); - - /*! - \brief Retrieve the time a repository was last checked and the version it was for + /*! \brief Retrieve the time a repository was last checked \param id id of the repo - \return last time the repo was checked, or invalid CDateTime if never checked - */ - std::pair LastChecked(const std::string& id); + \return last time the repo was checked, current time if not available + \sa SetRepoTimestamp */ + CDateTime GetRepoTimestamp(const std::string& id); + + ADDON::AddonVersion GetRepoVersion(const std::string& id); bool Search(const std::string& search, ADDON::VECADDONS& items); static void SetPropertiesFromAddon(const ADDON::AddonPtr& addon, CFileItemPtr& item); @@ -82,12 +75,26 @@ \sa IsAddonDisabled, HasDisabledAddons */ bool DisableAddon(const std::string &addonID, bool disable = true); + /*! \brief Checks if an addon is in the database. + \param addonID id of the addon to be checked + \return true if addon is in database, false if addon is not in database yet */ + bool HasAddon(const std::string &addonID); + /*! \brief Check whether an addon has been disabled via DisableAddon. \param addonID id of the addon to check \return true if the addon is disabled, false otherwise \sa DisableAddon, HasDisabledAddons */ bool IsAddonDisabled(const std::string &addonID); + /*! \brief Check whether we have disabled addons. + \return true if we have disabled addons, false otherwise + \sa DisableAddon, IsAddonDisabled */ + bool HasDisabledAddons(); + + /*! @deprecated only here to allow clean upgrades from earlier pvr versions + */ + bool IsSystemPVRAddonEnabled(const std::string &addonID); + /*! \brief Mark an addon as broken Sets a flag that this addon has been marked as broken in the repository. \param addonID id of the addon to mark as broken @@ -102,9 +109,10 @@ \sa BreakAddon */ std::string IsAddonBroken(const std::string &addonID); - bool BlacklistAddon(const std::string& addonID); - bool RemoveAddonFromBlacklist(const std::string& addonID); - bool GetBlacklisted(std::vector& addons); + bool BlacklistAddon(const std::string& addonID, const std::string& version); + bool IsAddonBlacklisted(const std::string& addonID, const std::string& version); + bool RemoveAddonFromBlacklist(const std::string& addonID, + const std::string& version); /*! \brief Store an addon's package filename and that file's hash for future verification \param addonID id of the addon we're adding a package for @@ -143,15 +151,12 @@ */ bool IsSystemAddonRegistered(const std::string &addonID); - /*! Clear internal fields that shouldn't be kept around indefinitely */ - void OnPostUnInstall(const std::string& addonId); - protected: virtual void CreateTables(); virtual void CreateAnalytics(); virtual void UpdateTables(int version); virtual int GetMinSchemaVersion() const { return 15; } - virtual int GetSchemaVersion() const { return 20; } + virtual int GetSchemaVersion() const { return 19; } const char *GetBaseDBName() const { return "Addons"; } bool GetAddon(int id, ADDON::AddonPtr& addon); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonDll.h kodi-15.2~git20151019.1039-final/xbmc/addons/AddonDll.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonDll.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonDll.h 2015-10-19 08:39:16.000000000 +0000 @@ -34,7 +34,6 @@ #include "interfaces/IAnnouncer.h" #include "interfaces/AnnouncementManager.h" #include "utils/XMLUtils.h" -#include "utils/Variant.h" #include "Util.h" namespace ADDON @@ -66,6 +65,7 @@ protected: void HandleException(std::exception &e, const char* context); bool Initialized() { return m_initialized; } + virtual void BuildLibName(const cp_extension_t *ext = NULL) {} virtual bool LoadSettings(); TheStruct* m_pStruct; TheProps* m_pInfo; @@ -94,6 +94,20 @@ : CAddon(ext), m_bIsChild(false) { + // if library attribute isn't present, look for a system-dependent one + if (ext && m_strLibName.empty()) + { +#if defined(TARGET_ANDROID) + m_strLibName = CAddonMgr::Get().GetExtValue(ext->configuration, "@library_android"); +#elif defined(TARGET_LINUX) || defined(TARGET_FREEBSD) + m_strLibName = CAddonMgr::Get().GetExtValue(ext->configuration, "@library_linux"); +#elif defined(TARGET_WINDOWS) && defined(HAS_DX) + m_strLibName = CAddonMgr::Get().GetExtValue(ext->configuration, "@library_windx"); +#elif defined(TARGET_DARWIN) + m_strLibName = CAddonMgr::Get().GetExtValue(ext->configuration, "@library_osx"); +#endif + } + m_pStruct = NULL; m_initialized = false; m_pDll = NULL; @@ -213,9 +227,6 @@ template ADDON_STATUS CAddonDll::Create() { - /* ensure that a previous instance is destroyed */ - Destroy(); - ADDON_STATUS status(ADDON_STATUS_UNKNOWN); CLog::Log(LOGDEBUG, "ADDON: Dll Initializing - %s", Name().c_str()); m_initialized = false; @@ -235,7 +246,7 @@ if (status == ADDON_STATUS_OK) { m_initialized = true; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().AddAnnouncer(this); + ANNOUNCEMENT::CAnnouncementManager::Get().AddAnnouncer(this); } else if ((status == ADDON_STATUS_NEED_SETTINGS) || (status == ADDON_STATUS_NEED_SAVEDSETTINGS)) { @@ -256,6 +267,9 @@ HandleException(e, "m_pDll->Create"); } + if (!m_initialized) + SAFE_DELETE(m_pHelpers); + return status; } @@ -298,7 +312,7 @@ template void CAddonDll::Destroy() { - ANNOUNCEMENT::CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + ANNOUNCEMENT::CAnnouncementManager::Get().RemoveAnnouncer(this); /* Unload library file */ try diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Addon.h kodi-15.2~git20151019.1039-final/xbmc/addons/Addon.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/Addon.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Addon.h 2015-10-19 08:39:16.000000000 +0000 @@ -28,7 +28,6 @@ class TiXmlElement; class CAddonCallbacksAddon; -class CVariant; typedef struct cp_plugin_info_t cp_plugin_info_t; typedef struct cp_extension_t cp_extension_t; @@ -115,13 +114,13 @@ \return true if the addon has settings, false otherwise \sa LoadSettings, LoadUserSettings, SaveSettings, HasUserSettings, GetSetting, UpdateSetting */ - virtual bool HasSettings(); + bool HasSettings(); /*! \brief Check whether the user has configured this addon or not \return true if previously saved settings are found, false otherwise \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, GetSetting, UpdateSetting */ - virtual bool HasUserSettings(); + bool HasUserSettings(); /*! \brief Save any user configured settings \sa LoadSettings, LoadUserSettings, HasSettings, HasUserSettings, GetSetting, UpdateSetting @@ -133,7 +132,7 @@ \param value the value that the setting should take \sa LoadSettings, LoadUserSettings, SaveSettings, HasSettings, HasUserSettings, GetSetting */ - virtual void UpdateSetting(const std::string& key, const std::string& value); + void UpdateSetting(const std::string& key, const std::string& value); /*! \brief Retrieve a particular settings value If a previously configured user setting is available, we return it's value, else we return the default (if available) @@ -148,7 +147,6 @@ // properties TYPE Type() const { return m_props.type; } - virtual TYPE FullType() const { return Type(); } bool IsType(TYPE type) const { return type == m_props.type; } AddonProps Props() const { return m_props; } AddonProps& Props() { return m_props; } @@ -204,7 +202,7 @@ virtual void OnPostInstall(bool update, bool modal) {}; virtual void OnPreUnInstall() {}; virtual void OnPostUnInstall() {}; - virtual bool CanInstall() { return true; } + virtual bool CanInstall(const std::string& referer) { return true; } protected: friend class CAddonCallbacksAddon; @@ -222,12 +220,7 @@ \return true if user settings exist, false otherwise \sa LoadSettings, SaveSettings, HasSettings, HasUserSettings, GetSetting, UpdateSetting */ - virtual bool LoadUserSettings(); - - /* \brief Whether there are settings to be saved - \sa SaveSettings - */ - virtual bool HasSettingsToSave() const; + bool LoadUserSettings(); /*! \brief Parse settings from an XML document \param doc XML document to parse for settings @@ -235,13 +228,13 @@ \return true if settings are loaded, false otherwise \sa SettingsToXML */ - virtual bool SettingsFromXML(const CXBMCTinyXML &doc, bool loadDefaults = false); + bool SettingsFromXML(const CXBMCTinyXML &doc, bool loadDefaults = false); - /*! \brief Write settings into an XML document + /*! \brief Parse settings into an XML document \param doc XML document to receive the settings \sa SettingsFromXML */ - virtual void SettingsToXML(CXBMCTinyXML &doc) const; + void SettingsToXML(CXBMCTinyXML &doc) const; CXBMCTinyXML m_addonXmlDoc; std::string m_strLibName; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonInstaller.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonInstaller.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonInstaller.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonInstaller.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,40 +19,36 @@ */ #include "AddonInstaller.h" -#include "events/EventLog.h" -#include "events/AddonManagementEvent.h" -#include "events/NotificationEvent.h" #include "utils/log.h" #include "utils/FileUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "Util.h" #include "guilib/LocalizeStrings.h" #include "filesystem/Directory.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" +#include "ApplicationMessenger.h" #include "filesystem/FavouritesDirectory.h" #include "utils/JobManager.h" +#include "dialogs/GUIDialogYesNo.h" #include "addons/AddonManager.h" #include "addons/Repository.h" #include "guilib/GUIWindowManager.h" // for callback #include "GUIUserMessages.h" // for callback #include "utils/StringUtils.h" +#include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogExtendedProgressBar.h" #include "URL.h" #include +using namespace std; using namespace XFILE; using namespace ADDON; -using namespace KODI::MESSAGING; -using KODI::MESSAGING::HELPERS::DialogResponse; -struct find_map : public std::binary_function +struct find_map : public binary_function { bool operator() (CAddonInstaller::JobMap::value_type t, unsigned int id) const { @@ -61,12 +57,13 @@ }; CAddonInstaller::CAddonInstaller() + : m_repoUpdateJob(nullptr) { } CAddonInstaller::~CAddonInstaller() { } -CAddonInstaller &CAddonInstaller::GetInstance() +CAddonInstaller &CAddonInstaller::Get() { static CAddonInstaller addonInstaller; return addonInstaller; @@ -74,12 +71,26 @@ void CAddonInstaller::OnJobComplete(unsigned int jobID, bool success, CJob* job) { + if (success) + CAddonMgr::Get().FindAddons(); + CSingleLock lock(m_critSection); - JobMap::iterator i = find_if(m_downloadJobs.begin(), m_downloadJobs.end(), bind2nd(find_map(), jobID)); - if (i != m_downloadJobs.end()) - m_downloadJobs.erase(i); - lock.Leave(); - PrunePackageCache(); + if (strncmp(job->GetType(), "repoupdate", 10) == 0) + { + // repo job finished + m_repoUpdateDone.Set(); + m_repoUpdateJob = nullptr; + lock.Leave(); + } + else + { + // download job + JobMap::iterator i = find_if(m_downloadJobs.begin(), m_downloadJobs.end(), bind2nd(find_map(), jobID)); + if (i != m_downloadJobs.end()) + m_downloadJobs.erase(i); + lock.Leave(); + PrunePackageCache(); + } CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE); g_windowManager.SendThreadMessage(msg); @@ -109,7 +120,7 @@ void CAddonInstaller::GetInstallList(VECADDONS &addons) const { CSingleLock lock(m_critSection); - std::vector addonIDs; + vector addonIDs; for (JobMap::const_iterator i = m_downloadJobs.begin(); i != m_downloadJobs.end(); ++i) { if (i->second.jobID) @@ -119,7 +130,7 @@ CAddonDatabase database; database.Open(); - for (std::vector::iterator it = addonIDs.begin(); it != addonIDs.end(); ++it) + for (vector::iterator it = addonIDs.begin(); it != addonIDs.end(); ++it) { AddonPtr addon; if (database.GetAddon(*it, addon)) @@ -159,7 +170,7 @@ return false; // we assume that addons that are enabled don't get to this routine (i.e. that GetAddon() has been called) - if (CAddonMgr::GetInstance().GetAddon(addonID, addon, ADDON_UNKNOWN, false)) + if (CAddonMgr::Get().GetAddon(addonID, addon, ADDON_UNKNOWN, false)) return false; // addon is installed but disabled, and the user has specifically activated something that needs // the addon - should we enable it? @@ -170,66 +181,45 @@ return false; // if specified ask the user if he wants it installed - if (promptForInstall) - { - if (HELPERS::ShowYesNoDialogLines(CVariant{24076}, CVariant{24100}, CVariant{addon->Name()}, CVariant{24101}) != - DialogResponse::YES) - { - return false; - } - } + if (promptForInstall && + !CGUIDialogYesNo::ShowAndGetInput(24076, 24100, addon->Name().c_str(), 24101)) + return false; - if (!InstallOrUpdate(addonID, false, true)) + if (!Install(addonID, true, "", false, true)) return false; - return CAddonMgr::GetInstance().GetAddon(addonID, addon); + return CAddonMgr::Get().GetAddon(addonID, addon); } -bool CAddonInstaller::InstallOrUpdate(const std::string &addonID, bool background /* = true */, bool modal /* = false */) +bool CAddonInstaller::Install(const std::string &addonID, bool force /* = false */, const std::string &referer /* = "" */, bool background /* = true */, bool modal /* = false */) { AddonPtr addon; - CAddonMgr::GetInstance().GetAddon(addonID, addon, ADDON_UNKNOWN, false); + bool addonInstalled = CAddonMgr::Get().GetAddon(addonID, addon, ADDON_UNKNOWN, false); + if (addonInstalled && !force) + return true; - // check whether we have it available in a repository - RepositoryPtr repo; - if (!GetRepoForAddon(addonID, repo)) - return false; + if (referer.empty()) + { + if (!g_passwordManager.CheckMenuLock(WINDOW_ADDON_BROWSER)) + return false; + } + // check whether we have it available in a repository std::string hash; - if (!CAddonInstallJob::GetAddonWithHash(addonID, repo->ID(), addon, hash)) + if (!CAddonInstallJob::GetAddonWithHash(addonID, addon, hash)) return false; - return DoInstall(addon, repo, hash, background, modal); + return DoInstall(addon, hash, addonInstalled, referer, background, modal); } -void CAddonInstaller::Install(const std::string& addonId, const AddonVersion& version, const std::string& repoId) -{ - CLog::Log(LOGDEBUG, "CAddonInstaller: installing '%s' version '%s' from repository '%s'", - addonId.c_str(), version.asString().c_str(), repoId.c_str()); - - AddonPtr addon; - CAddonDatabase database; - - if (!database.Open() || !database.GetAddon(addonId, version, repoId, addon)) - return; - - AddonPtr repo; - if (!CAddonMgr::GetInstance().GetAddon(repoId, repo, ADDON_REPOSITORY)) - return; - - std::string hash = std::static_pointer_cast(repo)->GetAddonHash(addon); - DoInstall(addon, std::static_pointer_cast(repo), hash, true, false); -} - -bool CAddonInstaller::DoInstall(const AddonPtr &addon, const RepositoryPtr& repo, - const std::string &hash /* = "" */, bool background /* = true */, bool modal /* = false */) +bool CAddonInstaller::DoInstall(const AddonPtr &addon, const std::string &hash /* = "" */, bool update /* = false */, const std::string &referer /* = "" */, bool background /* = true */, bool modal /* = false */) { // check whether we already have the addon installing CSingleLock lock(m_critSection); if (m_downloadJobs.find(addon->ID()) != m_downloadJobs.end()) return false; - CAddonInstallJob* installJob = new CAddonInstallJob(addon, repo, hash); + CAddonInstallJob* installJob = new CAddonInstallJob(addon, hash, update, referer); if (background) { unsigned int jobID = CJobManager::GetInstance().AddJob(installJob, this); @@ -259,8 +249,6 @@ if (!g_passwordManager.CheckMenuLock(WINDOW_ADDON_BROWSER)) return false; - CLog::Log(LOGDEBUG, "CAddonInstaller: installing from zip '%s'", CURL::GetRedacted(path).c_str()); - // grab the descriptive XML document from the zip, and read it in CFileItemList items; // BUG: some zip files return a single item (root folder) that we think is stored, so we don't use the zip:// protocol @@ -268,9 +256,7 @@ CURL zipDir = URIUtils::CreateArchivePath("zip", pathToUrl, ""); if (!CDirectory::GetDirectory(zipDir, items) || items.Size() != 1 || !items[0]->m_bIsFolder) { - CEventLog::GetInstance().AddWithNotification( - EventPtr(new CNotificationEvent(24045, StringUtils::Format(g_localizeStrings.Get(24143).c_str(), path.c_str()), - "special://xbmc/media/icon256x256.png", EventLevelError))); + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(24045), path, TOAST_DISPLAY_TIME, false); return false; } @@ -279,42 +265,33 @@ CXBMCTinyXML xml; AddonPtr addon; - if (xml.LoadFile(archive) && CAddonMgr::GetInstance().LoadAddonDescriptionFromMemory(xml.RootElement(), addon)) + if (xml.LoadFile(archive) && CAddonMgr::Get().LoadAddonDescriptionFromMemory(xml.RootElement(), addon)) { // set the correct path addon->Props().path = items[0]->GetPath(); addon->Props().icon = URIUtils::AddFileToFolder(items[0]->GetPath(), "icon.png"); // install the addon - return DoInstall(addon, RepositoryPtr()); + return DoInstall(addon); } - CEventLog::GetInstance().AddWithNotification( - EventPtr(new CNotificationEvent(24045, StringUtils::Format(g_localizeStrings.Get(24143).c_str(), path.c_str()), - "special://xbmc/media/icon256x256.png", EventLevelError))); + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(24045), path, TOAST_DISPLAY_TIME, false); return false; } bool CAddonInstaller::CheckDependencies(const AddonPtr &addon, CAddonDatabase *database /* = NULL */) { - std::pair failedDep; - return CheckDependencies(addon, failedDep, database); -} - -bool CAddonInstaller::CheckDependencies(const AddonPtr &addon, std::pair &failedDep, CAddonDatabase *database /* = NULL */) -{ std::vector preDeps; preDeps.push_back(addon->ID()); CAddonDatabase localDB; if (!database) database = &localDB; - return CheckDependencies(addon, preDeps, *database, failedDep); + return CheckDependencies(addon, preDeps, *database); } bool CAddonInstaller::CheckDependencies(const AddonPtr &addon, - std::vector& preDeps, CAddonDatabase &database, - std::pair &failedDep) + std::vector& preDeps, CAddonDatabase &database) { if (addon == NULL) return true; // a NULL addon has no dependencies @@ -329,7 +306,7 @@ const AddonVersion &version = i->second.first; bool optional = i->second.second; AddonPtr dep; - bool haveAddon = CAddonMgr::GetInstance().GetAddon(addonID, dep); + bool haveAddon = CAddonMgr::Get().GetAddon(addonID, dep); if ((haveAddon && !dep->MeetsVersion(version)) || (!haveAddon && !optional)) { // we have it but our version isn't good enough, or we don't have it and we need it @@ -338,11 +315,6 @@ // we don't have it in a repo, or we have it but the version isn't good enough, so dep isn't satisfied. CLog::Log(LOGDEBUG, "CAddonInstallJob[%s]: requires %s version %s which is not available", addon->ID().c_str(), addonID.c_str(), version.asString().c_str()); database.Close(); - - // fill in the details of the failed dependency - failedDep.first = addonID; - failedDep.second = version.asString(); - return false; } } @@ -351,7 +323,7 @@ // TODO: should we assume that installed deps are OK? if (dep && std::find(preDeps.begin(), preDeps.end(), dep->ID()) == preDeps.end()) { - if (!CheckDependencies(dep, preDeps, database, failedDep)) + if (!CheckDependencies(dep, preDeps, database)) { database.Close(); preDeps.push_back(dep->ID()); @@ -364,6 +336,94 @@ return true; } +CDateTime CAddonInstaller::LastRepoUpdate() const +{ + CDateTime update; + CAddonDatabase database; + if (!database.Open()) + return update; + + VECADDONS addons; + CAddonMgr::Get().GetAddons(ADDON_REPOSITORY, addons); + for (unsigned int i = 0; i < addons.size(); i++) + { + CDateTime lastUpdate = database.GetRepoTimestamp(addons[i]->ID()); + if (lastUpdate.IsValid() && lastUpdate > update) + update = lastUpdate; + } + + return update; +} + +void CAddonInstaller::UpdateRepos(bool force /*= false*/, bool wait /*= false*/, bool showProgress /*= false*/) +{ + CSingleLock lock(m_critSection); + if (m_repoUpdateJob != nullptr) + { + //Hook up dialog to running job + if (showProgress && !m_repoUpdateJob->HasProgressIndicator()) + { + auto* dialog = static_cast(g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS)); + if (dialog) + m_repoUpdateJob->SetProgressIndicators(dialog->GetHandle(g_localizeStrings.Get(24092)), nullptr); + } + + if (wait) + { + // wait for our job to complete + lock.Leave(); + CLog::Log(LOGDEBUG, "%s - waiting for repository update job to finish...", __FUNCTION__); + m_repoUpdateDone.Wait(); + } + return; + } + + // don't run repo update jobs while on the login screen which runs under the master profile + if(!force && (g_windowManager.GetActiveWindow() & WINDOW_ID_MASK) == WINDOW_LOGIN_SCREEN) + return; + + if (!force && m_repoUpdateWatch.IsRunning() && m_repoUpdateWatch.GetElapsedSeconds() < 600) + return; + + CAddonDatabase database; + if (!database.Open()) + return; + + m_repoUpdateWatch.StartZero(); + + VECADDONS addons; + if (CAddonMgr::Get().GetAddons(ADDON_REPOSITORY, addons)) + { + for (const auto& repo : addons) + { + CDateTime lastUpdate = database.GetRepoTimestamp(repo->ID()); + if (force || !lastUpdate.IsValid() || lastUpdate + CDateTimeSpan(0, 24, 0, 0) < CDateTime::GetCurrentDateTime() + || repo->Version() != database.GetRepoVersion(repo->ID())) + { + CLog::Log(LOGDEBUG, "Checking repositories for updates (triggered by %s)", repo->Name().c_str()); + + m_repoUpdateJob = new CRepositoryUpdateJob(addons); + if (showProgress) + { + auto* dialog = static_cast(g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS)); + if (dialog) + m_repoUpdateJob->SetProgressIndicators(dialog->GetHandle(g_localizeStrings.Get(24092)), nullptr); + } + CJobManager::GetInstance().AddJob(m_repoUpdateJob, this); + if (wait) + { + // wait for our job to complete + lock.Leave(); + CLog::Log(LOGDEBUG, "%s - waiting for this repository update job to finish...", __FUNCTION__); + m_repoUpdateDone.Wait(); + } + + return; + } + } + } +} + bool CAddonInstaller::HasJob(const std::string& ID) const { CSingleLock lock(m_critSection); @@ -424,37 +484,6 @@ delete it->second; } -void CAddonInstaller::InstallUpdates(bool includeBlacklisted /* = false */) -{ - VECADDONS addons = CAddonMgr::GetInstance().GetOutdated(); - if (addons.empty()) - return; - - for (const auto& addon : addons) - { - if (includeBlacklisted || !CAddonMgr::GetInstance().IsBlacklisted(addon->ID())) - CAddonInstaller::GetInstance().InstallOrUpdate(addon->ID()); - } -} - -bool CAddonInstaller::GetRepoForAddon(const std::string& addonId, RepositoryPtr& repoPtr) -{ - CAddonDatabase database; - if (!database.Open()) - return false; - - auto repoId = database.GetAddonVersion(addonId).second; - if (repoId.empty()) - return false; - - AddonPtr tmp; - if (!CAddonMgr::GetInstance().GetAddon(repoId, tmp, ADDON_REPOSITORY)) - return false; - - repoPtr = std::static_pointer_cast(tmp); - return true; -} - int64_t CAddonInstaller::EnumeratePackageFolder(std::map& result) { CFileItemList items; @@ -476,16 +505,38 @@ return size; } -CAddonInstallJob::CAddonInstallJob(const AddonPtr &addon, const AddonPtr &repo, const std::string &hash /* = "" */) +CAddonInstallJob::CAddonInstallJob(const AddonPtr &addon, const std::string &hash /* = "" */, bool update /* = false */, const std::string &referer /* = "" */) : m_addon(addon), - m_repo(repo), - m_hash(hash) + m_hash(hash), + m_update(update), + m_referer(referer) +{ } + +AddonPtr CAddonInstallJob::GetRepoForAddon(const AddonPtr& addon) { - AddonPtr dummy; - m_update = CAddonMgr::GetInstance().GetAddon(addon->ID(), dummy, ADDON_UNKNOWN, false); + AddonPtr repoPtr; + + CAddonDatabase database; + if (!database.Open()) + return repoPtr; + + std::string repo; + if (!database.GetRepoForAddon(addon->ID(), repo)) + return repoPtr; + + if (!CAddonMgr::Get().GetAddon(repo, repoPtr)) + return repoPtr; + + if (std::dynamic_pointer_cast(repoPtr) == NULL) + { + repoPtr.reset(); + return repoPtr; + } + + return repoPtr; } -bool CAddonInstallJob::GetAddonWithHash(const std::string& addonID, const std::string& repoID, ADDON::AddonPtr& addon, std::string& hash) +bool CAddonInstallJob::GetAddonWithHash(const std::string& addonID, ADDON::AddonPtr& addon, std::string& hash) { CAddonDatabase database; if (!database.Open()) @@ -494,11 +545,15 @@ if (!database.GetAddon(addonID, addon)) return false; - AddonPtr repo; - if (!CAddonMgr::GetInstance().GetAddon(repoID, repo, ADDON_REPOSITORY)) + AddonPtr ptr = GetRepoForAddon(addon); + if (ptr == NULL) + return false; + + RepositoryPtr repo = std::dynamic_pointer_cast(ptr); + if (repo == NULL) return false; - hash = std::static_pointer_cast(repo)->GetAddonHash(addon); + hash = repo->GetAddonHash(addon); return true; } @@ -509,17 +564,16 @@ // check whether all the dependencies are available or not SetText(g_localizeStrings.Get(24058)); - std::pair failedDep; - if (!CAddonInstaller::GetInstance().CheckDependencies(m_addon, failedDep)) + if (!CAddonInstaller::Get().CheckDependencies(m_addon)) { - std::string details = StringUtils::Format(g_localizeStrings.Get(24142).c_str(), failedDep.first.c_str(), failedDep.second.c_str()); - CLog::Log(LOGERROR, "CAddonInstallJob[%s]: %s", m_addon->ID().c_str(), details.c_str()); - ReportInstallError(m_addon->ID(), m_addon->ID(), details); + CLog::Log(LOGERROR, "CAddonInstallJob[%s]: dependency check failed", m_addon->ID().c_str()); + ReportInstallError(m_addon->ID(), m_addon->ID(), g_localizeStrings.Get(24044)); return false; } + AddonPtr repoPtr = GetRepoForAddon(m_addon); std::string installFrom; - if (!m_repo || m_repo->Props().libname.empty()) + if (!repoPtr || repoPtr->Props().libname.empty()) { // Addons are installed by downloading the .zip package on the server to the local // packages folder, then extracting from the local .zip package into the addons folder @@ -557,6 +611,13 @@ if (!CFile::Exists(package)) { std::string path(m_addon->Path()); + if (!m_referer.empty() && URIUtils::IsInternetStream(path)) + { + CURL url(path); + url.SetProtocolOptions(m_referer); + path = url.Get(); + } + if (!DownloadPackage(path, dest)) { CFile::Delete(package); @@ -603,30 +664,28 @@ installFrom = archivedFiles[0]->GetPath(); } - m_repo.reset(); + repoPtr.reset(); } // run any pre-install functions ADDON::OnPreInstall(m_addon); // perform install - if (!Install(installFrom, m_repo)) + if (!Install(installFrom, repoPtr)) return false; - CAddonMgr::GetInstance().UnregisterAddon(m_addon->ID()); - CAddonMgr::GetInstance().FindAddons(); + // run any post-install guff + if (!IsModal() && CSettings::Get().GetBool("general.addonnotifications")) + CGUIDialogKaiToast::QueueNotification(m_addon->Icon(), m_addon->Name(), + g_localizeStrings.Get(m_update ? 24065 : 24064), + TOAST_DISPLAY_TIME, false, TOAST_DISPLAY_TIME); - AddonPtr local; - if (CAddonMgr::GetInstance().GetAddon(m_addon->ID(), local, ADDON_UNKNOWN, false)) - { - CEventLog::GetInstance().Add( - EventPtr(new CAddonManagementEvent(local, m_update ? 24065 : 24064)), - !IsModal() && CSettings::GetInstance().GetBool(CSettings::SETTING_GENERAL_ADDONNOTIFICATIONS), false); - } ADDON::OnPostInstall(m_addon, m_update, IsModal()); - //Enable it if it was previously disabled - CAddonMgr::GetInstance().EnableAddon(m_addon->ID()); + //Clear addon from the disabled table + CAddonDatabase database; + database.Open(); + database.DisableAddon(m_addon->ID(), false); // and we're done! MarkFinished(); @@ -702,6 +761,7 @@ return false; // The first thing we do is install dependencies + std::string referer = StringUtils::Format("Referer=%s-%s.zip",m_addon->ID().c_str(),m_addon->Version().asString().c_str()); for (ADDONDEPS::iterator it = deps.begin(); it != deps.end(); ++it) { if (it->first != "xbmc.metadata") @@ -710,20 +770,22 @@ const AddonVersion &version = it->second.first; bool optional = it->second.second; AddonPtr dependency; - bool haveAddon = CAddonMgr::GetInstance().GetAddon(addonID, dependency, ADDON_UNKNOWN, false); + bool haveAddon = CAddonMgr::Get().GetAddon(addonID, dependency); if ((haveAddon && !dependency->MeetsVersion(version)) || (!haveAddon && !optional)) { // we have it but our version isn't good enough, or we don't have it and we need it + bool force = dependency != NULL; // dependency is already queued up for install - ::Install will fail // instead we wait until the Job has finished. note that we // recall install on purpose in case prior installation failed - if (CAddonInstaller::GetInstance().HasJob(addonID)) + if (CAddonInstaller::Get().HasJob(addonID)) { - while (CAddonInstaller::GetInstance().HasJob(addonID)) + while (CAddonInstaller::Get().HasJob(addonID)) Sleep(50); + force = false; - if (!CAddonMgr::GetInstance().IsAddonInstalled(addonID)) + if (!CAddonMgr::Get().IsAddonInstalled(addonID)) { CLog::Log(LOGERROR, "CAddonInstallJob[%s]: failed to install dependency %s", m_addon->ID().c_str(), addonID.c_str()); ReportInstallError(m_addon->ID(), m_addon->ID(), g_localizeStrings.Get(24085)); @@ -733,18 +795,16 @@ // don't have the addon or the addon isn't new enough - grab it (no new job for these) else if (IsModal()) { - RepositoryPtr repoForDep; AddonPtr addon; std::string hash; - if (!CAddonInstaller::GetRepoForAddon(addonID, repoForDep) || - !CAddonInstallJob::GetAddonWithHash(addonID, repoForDep->ID(), addon, hash)) + if (!CAddonInstallJob::GetAddonWithHash(addonID, addon, hash)) { CLog::Log(LOGERROR, "CAddonInstallJob[%s]: failed to find dependency %s", m_addon->ID().c_str(), addonID.c_str()); ReportInstallError(m_addon->ID(), m_addon->ID(), g_localizeStrings.Get(24085)); return false; } - CAddonInstallJob dependencyJob(addon, repoForDep, hash); + CAddonInstallJob dependencyJob(addon, hash, force, referer); // pass our progress indicators to the temporary job and don't allow it to // show progress or information updates (no progress, title or text changes) @@ -757,7 +817,7 @@ return false; } } - else if (!CAddonInstaller::GetInstance().InstallOrUpdate(addonID, false)) + else if (!CAddonInstaller::Get().Install(addonID, force, referer, false)) { CLog::Log(LOGERROR, "CAddonInstallJob[%s]: failed to install dependency %s", m_addon->ID().c_str(), addonID.c_str()); ReportInstallError(m_addon->ID(), m_addon->ID(), g_localizeStrings.Get(24085)); @@ -798,7 +858,7 @@ AddonPtr addon; if (!DoFileOperation(CFileOperationJob::ActionReplace, install, "special://home/addons/", false) || - !CAddonMgr::GetInstance().LoadAddonDescription(addonFolder, addon)) + !CAddonMgr::Get().LoadAddonDescription(addonFolder, addon)) { // failed extraction or failed to load addon description DeleteAddon(addonFolder); @@ -808,12 +868,16 @@ ReportInstallError(addonID, addonID); return false; } + + // Update the addon manager so that it has the newly installed add-on. + CAddonMgr::Get().FindAddons(); } SetProgress(100); return true; } + void CAddonInstallJob::ReportInstallError(const std::string& addonID, const std::string& fileName, const std::string& message /* = "" */) { AddonPtr addon; @@ -827,30 +891,32 @@ MarkFinished(); std::string msg = message; - EventPtr activity; if (addon != NULL) { AddonPtr addon2; - CAddonMgr::GetInstance().GetAddon(addonID, addon2); + CAddonMgr::Get().GetAddon(addonID, addon2); if (msg.empty()) msg = g_localizeStrings.Get(addon2 != NULL ? 113 : 114); - activity = EventPtr(new CAddonManagementEvent(addon, EventLevelError, msg)); if (IsModal()) - CGUIDialogOK::ShowAndGetInput(CVariant{m_addon->Name()}, CVariant{msg}); + CGUIDialogOK::ShowAndGetInput(m_addon->Name(), msg); + else + CGUIDialogKaiToast::QueueNotification(addon->Icon(), addon->Name(), msg, TOAST_DISPLAY_TIME, false); } else { - activity = - EventPtr(new CNotificationEvent(24045, - !msg.empty() ? msg : StringUtils::Format(g_localizeStrings.Get(24143).c_str(), fileName.c_str()), - EventLevelError)); - + if (msg.empty()) + msg = g_localizeStrings.Get(114); if (IsModal()) - CGUIDialogOK::ShowAndGetInput(CVariant{fileName}, CVariant{msg}); + CGUIDialogOK::ShowAndGetInput(fileName, msg); + else + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, fileName, msg, TOAST_DISPLAY_TIME, false); } +} - CEventLog::GetInstance().Add(activity, !IsModal(), false); +std::string CAddonInstallJob::AddonID() const +{ + return m_addon ? m_addon->ID() : ""; } CAddonUnInstallJob::CAddonUnInstallJob(const AddonPtr &addon) @@ -861,13 +927,12 @@ { ADDON::OnPreUnInstall(m_addon); - //TODO: looks broken. it just calls the repo with the most recent version, not the owner - RepositoryPtr repoPtr; - CAddonInstaller::GetRepoForAddon(m_addon->ID(), repoPtr); - if (repoPtr != NULL && !repoPtr->Props().libname.empty()) + AddonPtr repoPtr = CAddonInstallJob::GetRepoForAddon(m_addon); + RepositoryPtr therepo = std::dynamic_pointer_cast(repoPtr); + if (therepo != NULL && !therepo->Props().libname.empty()) { CFileItemList dummy; - std::string s = StringUtils::Format("plugin://%s/?action=uninstall&package=%s", repoPtr->ID().c_str(), m_addon->ID().c_str()); + std::string s = StringUtils::Format("plugin://%s/?action=uninstall&package=%s", therepo->ID().c_str(), m_addon->ID().c_str()); if (!CDirectory::GetDirectory(s, dummy)) return false; } @@ -875,7 +940,7 @@ { //Unregister addon with the manager to ensure nothing tries //to interact with it while we are uninstalling. - CAddonMgr::GetInstance().UnregisterAddon(m_addon->ID()); + CAddonMgr::Get().UnregisterAddon(m_addon->ID()); if (!DeleteAddon(m_addon->Path())) { @@ -885,18 +950,6 @@ } ClearFavourites(); - - AddonPtr addon; - CAddonDatabase database; - // try to get the addon object from the repository as the local one does not exist anymore - // if that doesn't work fall back to the local one - if (!database.Open() || !database.GetAddon(m_addon->ID(), addon) || addon == NULL) - addon = m_addon; - CEventLog::GetInstance().Add(EventPtr(new CAddonManagementEvent(addon, 24144))); - - CAddonMgr::GetInstance().OnPostUnInstall(m_addon->ID()); - database.OnPostUnInstall(m_addon->ID()); - ADDON::OnPostUnInstall(m_addon); return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonInstaller.h kodi-15.2~git20151019.1039-final/xbmc/addons/AddonInstaller.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonInstaller.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonInstaller.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,13 +19,11 @@ * */ -#include - +#include "utils/FileOperationJob.h" #include "addons/Addon.h" #include "addons/Repository.h" -#include "threads/Event.h" -#include "utils/FileOperationJob.h" #include "utils/Stopwatch.h" +#include "threads/Event.h" class CAddonDatabase; @@ -39,7 +37,7 @@ class CAddonInstaller : public IJobCallback { public: - static CAddonInstaller &GetInstance(); + static CAddonInstaller &Get(); bool IsDownloading() const; void GetInstallList(ADDON::VECADDONS &addons) const; @@ -57,12 +55,14 @@ /*! \brief Install an addon if it is available in a repository \param addonID the addon ID of the item to install + \param force whether to force the install even if the addon is already installed (eg for updating). Defaults to false. + \param referer string to use for referer for http fetch. Set to previous version when updating, parent when fetching a dependency \param background whether to install in the background or not. Defaults to true. \param modal whether to show a modal dialog when not installing in background \return true on successful install, false on failure. \sa DoInstall */ - bool InstallOrUpdate(const std::string &addonID, bool background = true, bool modal = false); + bool Install(const std::string &addonID, bool force = false, const std::string &referer="", bool background = true, bool modal = false); /*! \brief Install an addon from the given zip path \param path the zip file to install from @@ -71,27 +71,22 @@ */ bool InstallFromZip(const std::string &path); - /*! Install an addon with a specific version and repository */ - void Install(const std::string& addonId, const ADDON::AddonVersion& version, const std::string& repoId); - - /*! \brief Check whether dependencies of an addon exist or are installable. - Iterates through the addon's dependencies, checking they're installed or installable. - Each dependency must also satisfies CheckDependencies in turn. - \param addon the addon to check - \param database the database instance to update. Defaults to NULL. - \return true if dependencies are available, false otherwise. - */ - bool CheckDependencies(const ADDON::AddonPtr &addon, CAddonDatabase *database = NULL); - /*! \brief Check whether dependencies of an addon exist or are installable. Iterates through the addon's dependencies, checking they're installed or installable. Each dependency must also satisfies CheckDependencies in turn. \param addon the addon to check - \param failedDep Dependency addon that isn't available \param database the database instance to update. Defaults to NULL. \return true if dependencies are available, false otherwise. */ - bool CheckDependencies(const ADDON::AddonPtr &addon, std::pair &failedDep, CAddonDatabase *database = NULL); + bool CheckDependencies(const ADDON::AddonPtr &addon, CAddonDatabase *database = NULL); + + /*! \brief Update all repositories (if needed) + Runs through all available repositories and queues an update of them if they + need it (according to the set timeouts) or if forced. Optionally busy wait + until the repository updates are complete. + \param force whether we should run an update regardless of the normal update cycle. Defaults to false. + \param wait whether we should busy wait for the updates to be performed. Defaults to false. + */ /*! \brief Check if an installation job for a given add-on is already queued up * \param ID The ID of the add-on @@ -99,17 +94,15 @@ */ bool HasJob(const std::string& ID) const; - void InstallUpdates(bool includeBlacklisted = false); + /*! \brief Fetch the last repository update time. + \return the last time a repository was updated. + */ + CDateTime LastRepoUpdate() const; + void UpdateRepos(bool force = false, bool wait = false, bool showProgress = false); void OnJobComplete(unsigned int jobID, bool success, CJob* job); void OnJobProgress(unsigned int jobID, unsigned int progress, unsigned int total, const CJob *job); - /*! \brief Get the repository which hosts the most recent version of add-on - * \param addon The add-on to find the repository for - * \param repo [out] The hosting repository - */ - static bool GetRepoForAddon(const std::string& addonId, ADDON::RepositoryPtr& repo); - class CDownloadJob { public: @@ -133,13 +126,13 @@ /*! \brief Install an addon from a repository or zip \param addon the AddonPtr describing the addon - \param repo the repository to install addon from \param hash the hash to verify the install. Defaults to "". + \param update whether this is an update of an existing addon, or a new install. Defaults to false. + \param referer string to use for referer for http fetch. Defaults to "". \param background whether to install in the background or not. Defaults to true. \return true on successful install, false on failure. */ - bool DoInstall(const ADDON::AddonPtr &addon, const ADDON::RepositoryPtr &repo, - const std::string &hash = "", bool background = true, bool modal = false); + bool DoInstall(const ADDON::AddonPtr &addon, const std::string &hash = "", bool update = false, const std::string &referer = "", bool background = true, bool modal = false); /*! \brief Check whether dependencies of an addon exist or are installable. Iterates through the addon's dependencies, checking they're installed or installable. @@ -147,32 +140,45 @@ \param addon the addon to check \param preDeps previous dependencies encountered during recursion. aids in avoiding infinite recursion \param database database instance to update - \param failedDep Dependency addon that isn't available \return true if dependencies are available, false otherwise. */ - bool CheckDependencies(const ADDON::AddonPtr &addon, std::vector& preDeps, CAddonDatabase &database, std::pair &failedDep); + bool CheckDependencies(const ADDON::AddonPtr &addon, std::vector& preDeps, CAddonDatabase &database); void PrunePackageCache(); int64_t EnumeratePackageFolder(std::map& result); CCriticalSection m_critSection; JobMap m_downloadJobs; + CStopWatch m_repoUpdateWatch; ///< repository updates are done based on this counter + ADDON::CRepositoryUpdateJob* m_repoUpdateJob; + CEvent m_repoUpdateDone; ///< event set when the repository updates are complete }; class CAddonInstallJob : public CFileOperationJob { public: - CAddonInstallJob(const ADDON::AddonPtr &addon, const ADDON::AddonPtr &repo, const std::string &hash = ""); + CAddonInstallJob(const ADDON::AddonPtr &addon, const std::string &hash = "", bool update = false, const std::string &referer = ""); virtual bool DoWork(); + /*! \brief return the id of the addon being installed + \return id of the installing addon + */ + std::string AddonID() const; + + /*! \brief Find which repository hosts an add-on + * \param addon The add-on to find the repository for + * \return The hosting repository + */ + static ADDON::AddonPtr GetRepoForAddon(const ADDON::AddonPtr& addon); + /*! \brief Find the add-on and itshash for the given add-on ID * \param addonID ID of the add-on to find * \param addon Add-on with the given add-on ID * \param hash Hash of the add-on * \return True if the add-on and its hash were found, false otherwise. */ - static bool GetAddonWithHash(const std::string& addonID, const std::string &repoID, ADDON::AddonPtr& addon, std::string& hash); + static bool GetAddonWithHash(const std::string& addonID, ADDON::AddonPtr& addon, std::string& hash); private: void OnPreInstall(); @@ -195,9 +201,9 @@ void ReportInstallError(const std::string& addonID, const std::string& fileName, const std::string& message = ""); ADDON::AddonPtr m_addon; - ADDON::AddonPtr m_repo; std::string m_hash; bool m_update; + std::string m_referer; }; class CAddonUnInstallJob : public CFileOperationJob diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonManager.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonManager.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -17,42 +17,23 @@ * . * */ - -#include "AddonManager.h" - #include -#include - +#include "AddonManager.h" #include "Addon.h" -#include "addons/ImageResource.h" -#include "addons/LanguageResource.h" -#include "addons/UISoundsResource.h" -#include "addons/Webinterface.h" -#include "AudioDecoder.h" #include "AudioEncoder.h" -#include "ContextMenuAddon.h" +#include "AudioDecoder.h" #include "ContextMenuManager.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" -#include "DllAudioDSP.h" #include "DllLibCPluff.h" -#include "events/AddonManagementEvent.h" -#include "events/EventLog.h" +#include "LanguageResource.h" +#include "UISoundsResource.h" +#include "utils/StringUtils.h" +#include "utils/JobManager.h" +#include "threads/SingleLock.h" #include "LangInfo.h" -#include "PluginSource.h" -#include "Repository.h" -#include "Scraper.h" -#include "Service.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" -#include "Skin.h" -#include "system.h" -#include "threads/SingleLock.h" -#include "Util.h" -#include "utils/JobManager.h" #include "utils/log.h" -#include "utils/StringUtils.h" #include "utils/XBMCTinyXML.h" - #ifdef HAS_VISUALISATION #include "Visualisation.h" #endif @@ -62,7 +43,18 @@ #ifdef HAS_PVRCLIENTS #include "pvr/addons/PVRClient.h" #endif +//#ifdef HAS_SCRAPERS +#include "Scraper.h" +//#endif +#include "PluginSource.h" +#include "Repository.h" +#include "Skin.h" +#include "Service.h" +#include "ContextItemAddon.h" +#include "Util.h" +#include "addons/Webinterface.h" +using namespace std; using namespace XFILE; namespace ADDON @@ -77,7 +69,7 @@ * */ -std::map CAddonMgr::m_managers; +map CAddonMgr::m_managers; AddonPtr CAddonMgr::Factory(const cp_extension_t *props) { @@ -127,7 +119,6 @@ case ADDON_VIZ: case ADDON_SCREENSAVER: case ADDON_PVRDLL: - case ADDON_ADSPDLL: case ADDON_AUDIOENCODER: case ADDON_AUDIODECODER: { // begin temporary platform handling for Dlls @@ -140,7 +131,7 @@ } if (type == ADDON_SCREENSAVER) { // Python screensaver - std::string library = CAddonMgr::GetInstance().GetExtValue(props->configuration, "@library"); + std::string library = CAddonMgr::Get().GetExtValue(props->configuration, "@library"); if (URIUtils::HasExtension(library, ".py")) return AddonPtr(new CScreenSaver(props)); } @@ -149,8 +140,17 @@ { // built in audio encoder return AddonPtr(new CAudioEncoder(props)); } - - value = GetPlatformLibraryName(props->plugin->extensions->configuration); + std::string tograb; +#if defined(TARGET_ANDROID) + tograb = "@library_android"; +#elif defined(TARGET_LINUX) || defined(TARGET_FREEBSD) + tograb = "@library_linux"; +#elif defined(TARGET_WINDOWS) && defined(HAS_DX) + tograb = "@library_windx"; +#elif defined(TARGET_DARWIN) + tograb = "@library_osx"; +#endif + value = GetExtValue(props->plugin->extensions->configuration, tograb.c_str()); if (value.empty()) break; if (type == ADDON_VIZ) @@ -165,10 +165,6 @@ return AddonPtr(new PVR::CPVRClient(props)); #endif } - else if (type == ADDON_ADSPDLL) - { - return AddonPtr(new ActiveAE::CActiveAEDSPAddon(props)); - } else if (type == ADDON_AUDIOENCODER) return AddonPtr(new CAudioEncoder(props)); else if (type == ADDON_AUDIODECODER) @@ -178,8 +174,6 @@ } case ADDON_SKIN: return AddonPtr(new CSkinInfo(props)); - case ADDON_RESOURCE_IMAGES: - return AddonPtr(new CImageResource(props)); case ADDON_RESOURCE_LANGUAGE: return AddonPtr(new CLanguageResource(props)); case ADDON_RESOURCE_UISOUNDS: @@ -189,7 +183,7 @@ case ADDON_REPOSITORY: return AddonPtr(new CRepository(props)); case ADDON_CONTEXT_ITEM: - return AddonPtr(new CContextMenuAddon(props)); + return AddonPtr(new CContextItemAddon(props)); default: break; } @@ -236,7 +230,7 @@ DeInit(); } -CAddonMgr &CAddonMgr::GetInstance() +CAddonMgr &CAddonMgr::Get() { static CAddonMgr sAddonMgr; return sAddonMgr; @@ -268,7 +262,6 @@ bool CAddonMgr::Init() { - CSingleLock lock(m_critSection); m_cpluff = new DllLibCPluff; m_cpluff->Load(); @@ -316,7 +309,7 @@ } status = m_cpluff->register_logger(m_cp_context, cp_logger, - &CAddonMgr::GetInstance(), clog_to_cp(g_advancedSettings.m_logLevel)); + &CAddonMgr::Get(), clog_to_cp(g_advancedSettings.m_logLevel)); if (status != CP_OK) { CLog::Log(LOGERROR, "ADDONS: Fatal Error, cp_register_logger() returned status: %i", status); @@ -346,10 +339,6 @@ m_database.GetDisabled(disabled); m_disabled.insert(disabled.begin(), disabled.end()); - std::vector blacklisted; - m_database.GetBlacklisted(blacklisted); - m_updateBlacklist.insert(blacklisted.begin(), blacklisted.end()); - VECADDONS repos; if (GetAddons(ADDON_REPOSITORY, repos)) { @@ -363,7 +352,7 @@ void CAddonMgr::DeInit() { - if (m_cpluff && m_cpluff->IsLoaded()) + if (m_cpluff) m_cpluff->destroy(); delete m_cpluff; m_cpluff = NULL; @@ -456,23 +445,46 @@ return false; } -VECADDONS CAddonMgr::GetOutdated() +bool CAddonMgr::GetAllOutdatedAddons(VECADDONS &addons, bool getLocalVersion /*= false*/) { CSingleLock lock(m_critSection); - auto isUpdated = [&](const AddonPtr& addon) + for (int i = ADDON_UNKNOWN+1; i < ADDON_MAX; ++i) { - return addon->Version() >= m_database.GetAddonVersion(addon->ID()).first; - }; + VECADDONS temp; + if (CAddonMgr::Get().GetAddons((TYPE)i, temp, true)) + { + AddonPtr repoAddon; + for (unsigned int j = 0; j < temp.size(); j++) + { + // Ignore duplicates due to add-ons with multiple extension points + bool found = false; + for (VECADDONS::const_iterator addonIt = addons.begin(); addonIt != addons.end(); ++addonIt) + { + if ((*addonIt)->ID() == temp[j]->ID()) + found = true; + } - VECADDONS addons; - GetAllAddons(addons, true); - addons.erase(std::remove_if(addons.begin(), addons.end(), isUpdated), addons.end()); - return addons; + if (found || !m_database.GetAddon(temp[j]->ID(), repoAddon)) + continue; + + if (temp[j]->Version() < repoAddon->Version() && + !m_database.IsAddonBlacklisted(temp[j]->ID(), + repoAddon->Version().asString().c_str())) + { + if (getLocalVersion) + repoAddon->Props().version = temp[j]->Version(); + addons.push_back(repoAddon); + } + } + } + } + return !addons.empty(); } bool CAddonMgr::HasOutdatedAddons() { - return !GetOutdated().empty(); + VECADDONS dummy; + return GetAllOutdatedAddons(dummy); } bool CAddonMgr::GetAddons(const TYPE &type, VECADDONS &addons, bool enabled /* = true */) @@ -543,31 +555,31 @@ switch (type) { case ADDON_VIZ: - setting = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICPLAYER_VISUALISATION); + setting = CSettings::Get().GetString("musicplayer.visualisation"); break; case ADDON_SCREENSAVER: - setting = CSettings::GetInstance().GetString(CSettings::SETTING_SCREENSAVER_MODE); + setting = CSettings::Get().GetString("screensaver.mode"); break; case ADDON_SCRAPER_ALBUMS: - setting = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER); + setting = CSettings::Get().GetString("musiclibrary.albumsscraper"); break; case ADDON_SCRAPER_ARTISTS: - setting = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER); + setting = CSettings::Get().GetString("musiclibrary.artistsscraper"); break; case ADDON_SCRAPER_MOVIES: - setting = CSettings::GetInstance().GetString(CSettings::SETTING_SCRAPERS_MOVIESDEFAULT); + setting = CSettings::Get().GetString("scrapers.moviesdefault"); break; case ADDON_SCRAPER_MUSICVIDEOS: - setting = CSettings::GetInstance().GetString(CSettings::SETTING_SCRAPERS_MUSICVIDEOSDEFAULT); + setting = CSettings::Get().GetString("scrapers.musicvideosdefault"); break; case ADDON_SCRAPER_TVSHOWS: - setting = CSettings::GetInstance().GetString(CSettings::SETTING_SCRAPERS_TVSHOWSDEFAULT); + setting = CSettings::Get().GetString("scrapers.tvshowsdefault"); break; case ADDON_WEB_INTERFACE: - setting = CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_WEBSKIN); + setting = CSettings::Get().GetString("services.webskin"); break; case ADDON_RESOURCE_LANGUAGE: - setting = CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_LANGUAGE); + setting = CSettings::Get().GetString("locale.language"); break; default: return false; @@ -580,37 +592,28 @@ switch (type) { case ADDON_VIZ: - CSettings::GetInstance().SetString(CSettings::SETTING_MUSICPLAYER_VISUALISATION, addonID); + CSettings::Get().SetString("musicplayer.visualisation",addonID); break; case ADDON_SCREENSAVER: - CSettings::GetInstance().SetString(CSettings::SETTING_SCREENSAVER_MODE, addonID); + CSettings::Get().SetString("screensaver.mode",addonID); break; case ADDON_SCRAPER_ALBUMS: - CSettings::GetInstance().SetString(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER, addonID); + CSettings::Get().SetString("musiclibrary.albumsscraper",addonID); break; case ADDON_SCRAPER_ARTISTS: - CSettings::GetInstance().SetString(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER, addonID); + CSettings::Get().SetString("musiclibrary.artistsscraper",addonID); break; case ADDON_SCRAPER_MOVIES: - CSettings::GetInstance().SetString(CSettings::SETTING_SCRAPERS_MOVIESDEFAULT, addonID); + CSettings::Get().SetString("scrapers.moviesdefault",addonID); break; case ADDON_SCRAPER_MUSICVIDEOS: - CSettings::GetInstance().SetString(CSettings::SETTING_SCRAPERS_MUSICVIDEOSDEFAULT, addonID); + CSettings::Get().SetString("scrapers.musicvideosdefault",addonID); break; case ADDON_SCRAPER_TVSHOWS: - CSettings::GetInstance().SetString(CSettings::SETTING_SCRAPERS_TVSHOWSDEFAULT, addonID); + CSettings::Get().SetString("scrapers.tvshowsdefault",addonID); break; case ADDON_RESOURCE_LANGUAGE: - CSettings::GetInstance().SetString(CSettings::SETTING_LOCALE_LANGUAGE, addonID); - break; - case ADDON_SCRIPT_WEATHER: - CSettings::GetInstance().SetString(CSettings::SETTING_WEATHER_ADDON, addonID); - break; - case ADDON_SKIN: - CSettings::GetInstance().SetString(CSettings::SETTING_LOOKANDFEEL_SKIN, addonID); - break; - case ADDON_RESOURCE_UISOUNDS: - CSettings::GetInstance().SetString(CSettings::SETTING_LOOKANDFEEL_SOUNDSKIN, addonID); + CSettings::Get().SetString("locale.language", addonID); break; default: return false; @@ -644,6 +647,7 @@ void CAddonMgr::UnregisterAddon(const std::string& ID) { CSingleLock lock(m_critSection); + m_disabled.erase(ID); if (m_cpluff && m_cp_context) { m_cpluff->uninstall_plugin(m_cp_context, ID.c_str()); @@ -653,35 +657,6 @@ } } -void CAddonMgr::OnPostUnInstall(const std::string& id) -{ - CSingleLock lock(m_critSection); - m_disabled.erase(id); - m_updateBlacklist.erase(id); -} - -bool CAddonMgr::RemoveFromUpdateBlacklist(const std::string& id) -{ - CSingleLock lock(m_critSection); - if (!IsBlacklisted(id)) - return true; - return m_database.RemoveAddonFromBlacklist(id) && m_updateBlacklist.erase(id) > 0; -} - -bool CAddonMgr::AddToUpdateBlacklist(const std::string& id) -{ - CSingleLock lock(m_critSection); - if (IsBlacklisted(id)) - return true; - return m_database.BlacklistAddon(id) && m_updateBlacklist.insert(id).second; -} - -bool CAddonMgr::IsBlacklisted(const std::string& id) const -{ - CSingleLock lock(m_critSection); - return m_updateBlacklist.find(id) != m_updateBlacklist.end(); -} - bool CAddonMgr::DisableAddon(const std::string& id) { CSingleLock lock(m_critSection); @@ -695,10 +670,6 @@ if (!m_disabled.insert(id).second) return false; - AddonPtr addon; - if (GetAddon(id, addon, ADDON_UNKNOWN, false) && addon != NULL) - CEventLog::GetInstance().Add(EventPtr(new CAddonManagementEvent(addon, 24141))); - //success ADDON::OnDisabled(id); return true; @@ -715,10 +686,6 @@ if (m_disabled.erase(id) == 0) return false; - AddonPtr addon; - if (GetAddon(id, addon, ADDON_UNKNOWN, false) && addon != NULL) - CEventLog::GetInstance().Add(EventPtr(new CAddonManagementEvent(addon, 24064))); - //success ADDON::OnEnabled(id); return true; @@ -746,8 +713,7 @@ return false; // installed PVR addons can always be disabled - if (localAddon->Type() == ADDON_PVRDLL || - localAddon->Type() == ADDON_ADSPDLL) + if (localAddon->Type() == ADDON_PVRDLL) return true; // installed audio decoder addons can always be disabled @@ -881,14 +847,10 @@ return AddonPtr(new CAddonLibrary(addonProps)); case ADDON_PVRDLL: return AddonPtr(new PVR::CPVRClient(addonProps)); - case ADDON_ADSPDLL: - return AddonPtr(new ActiveAE::CActiveAEDSPAddon(addonProps)); case ADDON_AUDIOENCODER: return AddonPtr(new CAudioEncoder(addonProps)); case ADDON_AUDIODECODER: return AddonPtr(new CAudioDecoder(addonProps)); - case ADDON_RESOURCE_IMAGES: - return AddonPtr(new CImageResource(addonProps)); case ADDON_RESOURCE_LANGUAGE: return AddonPtr(new CLanguageResource(addonProps)); case ADDON_RESOURCE_UISOUNDS: @@ -896,7 +858,7 @@ case ADDON_REPOSITORY: return AddonPtr(new CRepository(addonProps)); case ADDON_CONTEXT_ITEM: - return AddonPtr(new CContextMenuAddon(addonProps)); + return AddonPtr(new CContextItemAddon(addonProps)); default: break; } @@ -913,27 +875,23 @@ return false; const cp_extension_t *metadata = GetExtension(plugin, "xbmc.addon.metadata"); // platforms; - if (CAddonMgr::GetInstance().GetExtList(metadata->configuration, "platform", platforms)) + vector platforms; + if (CAddonMgr::Get().GetExtList(metadata->configuration, "platform", platforms)) { - for (std::vector::const_iterator platform = platforms.begin(); platform != platforms.end(); ++platform) + for (vector::const_iterator platform = platforms.begin(); platform != platforms.end(); ++platform) { if (*platform == "all") return true; #if defined(TARGET_ANDROID) if (*platform == "android") #elif defined(TARGET_LINUX) || defined(TARGET_FREEBSD) - if (*platform == "linux" -#if defined(TARGET_FREEBSD) - || *platform == "freebsd" -#endif - ) + if (*platform == "linux") #elif defined(TARGET_WINDOWS) && defined(HAS_DX) - if (*platform == "windx" || *platform == "windows") + if (*platform == "windx") #elif defined(TARGET_DARWIN_OSX) // Remove this after Frodo and add an architecture filter // in addition to platform. @@ -987,7 +945,7 @@ return NULL; } -std::string CAddonMgr::GetExtValue(cp_cfg_element_t *base, const char *path) const +std::string CAddonMgr::GetExtValue(cp_cfg_element_t *base, const char *path) { const char *value = ""; if (base && (value = m_cpluff->lookup_cfg_value(base, path))) @@ -996,7 +954,7 @@ return ""; } -bool CAddonMgr::GetExtList(cp_cfg_element_t *base, const char *path, std::vector &result) const +bool CAddonMgr::GetExtList(cp_cfg_element_t *base, const char *path, vector &result) const { result.clear(); if (!base || !path) @@ -1008,35 +966,6 @@ return true; } -std::string CAddonMgr::GetPlatformLibraryName(cp_cfg_element_t *base) const -{ - std::string libraryName; -#if defined(TARGET_ANDROID) - libraryName = GetExtValue(base, "@library_android"); -#elif defined(TARGET_LINUX) || defined(TARGET_FREEBSD) -#if defined(TARGET_FREEBSD) - libraryName = GetExtValue(base, "@library_freebsd"); - if (libraryName.empty()) -#elif defined(TARGET_RASPBERRY_PI) - libraryName = GetExtValue(base, "@library_rbpi"); - if (libraryName.empty()) -#endif - libraryName = GetExtValue(base, "@library_linux"); -#elif defined(TARGET_WINDOWS) && defined(HAS_DX) - libraryName = GetExtValue(base, "@library_windx"); - if (libraryName.empty()) - libraryName = GetExtValue(base, "@library_windows"); -#elif defined(TARGET_DARWIN) -#if defined(TARGET_DARWIN_IOS) - libraryName = GetExtValue(base, "@library_ios"); - if (libraryName.empty()) -#endif - libraryName = GetExtValue(base, "@library_osx"); -#endif - - return libraryName; -} - AddonPtr CAddonMgr::GetAddonFromDescriptor(const cp_plugin_info_t *info, const std::string& type) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonManager.h kodi-15.2~git20151019.1039-final/xbmc/addons/AddonManager.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonManager.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -71,7 +71,7 @@ class CAddonMgr : public Observable { public: - static CAddonMgr &GetInstance(); + static CAddonMgr &Get(); bool ReInit() { DeInit(); return Init(); } bool Init(); void DeInit(); @@ -97,10 +97,12 @@ void AddToUpdateableAddons(AddonPtr &pAddon); void RemoveFromUpdateableAddons(AddonPtr &pAddon); bool ReloadSettings(const std::string &id); - - /*! \brief Get addons with available updates */ - VECADDONS GetOutdated(); - + /*! \brief Get all addons with available updates + \param addons List to fill with all outdated addons + \param getLocalVersion Whether to get the local addon version or the addon verion from the repository + \return True if there are outdated addons otherwise false + */ + bool GetAllOutdatedAddons(VECADDONS &addons, bool getLocalVersion = false); /*! \brief Checks if there is any addon with available updates \return True if there are outdated addons otherwise false */ @@ -112,9 +114,6 @@ void FindAddons(); void UnregisterAddon(const std::string& ID); - /*! Hook for clearing internal state after uninstall. */ - void OnPostUnInstall(const std::string& id); - /*! \brief Disable an addon. Returns true on success, false on failure. */ bool DisableAddon(const std::string& ID); @@ -149,12 +148,8 @@ */ bool CanAddonBeInstalled(const AddonPtr& addon); - bool AddToUpdateBlacklist(const std::string& id); - bool RemoveFromUpdateBlacklist(const std::string& id); - bool IsBlacklisted(const std::string& id) const; - /* libcpluff */ - std::string GetExtValue(cp_cfg_element_t *base, const char *path) const; + std::string GetExtValue(cp_cfg_element_t *base, const char *path); /*! \brief Retrieve an element from a given configuration element \param base the base configuration element. @@ -183,10 +178,6 @@ const cp_extension_t *GetExtension(const cp_plugin_info_t *props, const char *extension) const; - /*! \brief Retrieves the platform-specific library name from the given configuration element - */ - std::string GetPlatformLibraryName(cp_cfg_element_t *base) const; - /*! \brief Load the addon in the given path This loads the addon using c-pluff which parses the addon descriptor file. \param path folder that contains the addon. @@ -253,7 +244,6 @@ virtual ~CAddonMgr(); std::set m_disabled; - std::set m_updateBlacklist; static std::map m_managers; CCriticalSection m_critSection; CAddonDatabase m_database; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonStatusHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonStatusHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonStatusHandler.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonStatusHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,7 @@ #include "AddonStatusHandler.h" #include "AddonManager.h" #include "threads/SingleLock.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "guilib/GUIWindowManager.h" #include "GUIDialogAddonSettings.h" #include "dialogs/GUIDialogYesNo.h" @@ -29,9 +29,6 @@ #include "settings/Settings.h" #include "utils/log.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" - -using namespace KODI::MESSAGING; namespace ADDON { @@ -49,7 +46,7 @@ CAddonStatusHandler::CAddonStatusHandler(const std::string &addonID, ADDON_STATUS status, std::string message, bool sameThread) : CThread(("AddonStatus " + addonID).c_str()) { - if (!CAddonMgr::GetInstance().GetAddon(addonID, m_addon)) + if (!CAddonMgr::Get().GetAddon(addonID, m_addon)) return; CLog::Log(LOGINFO, "Called Add-on status handler for '%u' of clientName:%s, clientID:%s (same Thread=%s)", status, m_addon->Name().c_str(), m_addon->ID().c_str(), sameThread ? "yes" : "no"); @@ -92,7 +89,7 @@ { if (m_addon->Type() == ADDON_PVRDLL) { - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_HIDECONNECTIONLOSTWARNING)) + if (!CSettings::Get().GetBool("pvrmanager.hideconnectionlostwarning")) CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, m_addon->Name().c_str(), g_localizeStrings.Get(36030)); // connection lost // TODO handle disconnects after the add-on's been initialised } @@ -101,13 +98,16 @@ CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!pDialog) return; - pDialog->SetHeading(CVariant{heading}); - pDialog->SetLine(1, CVariant{24070}); - pDialog->SetLine(2, CVariant{24073}); - pDialog->Open(); + pDialog->SetHeading(heading); + pDialog->SetLine(1, 24070); + pDialog->SetLine(2, 24073); + + //send message and wait for user input + ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_YES_NO, g_windowManager.GetActiveWindow()}; + CApplicationMessenger::Get().SendMessage(tMsg, true); if (pDialog->IsConfirmed()) - CAddonMgr::GetInstance().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, false); + CAddonMgr::Get().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, false); } } /* Request to restart the AddOn and data structures need updated */ @@ -116,11 +116,14 @@ CGUIDialogOK* pDialog = (CGUIDialogOK*)g_windowManager.GetWindow(WINDOW_DIALOG_OK); if (!pDialog) return; - pDialog->SetHeading(CVariant{heading}); - pDialog->SetLine(1, CVariant{24074}); - pDialog->Open(); + pDialog->SetHeading(heading); + pDialog->SetLine(1, 24074); + + //send message and wait for user input + ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_OK, g_windowManager.GetActiveWindow()}; + CApplicationMessenger::Get().SendMessage(tMsg, true); - CAddonMgr::GetInstance().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, true); + CAddonMgr::Get().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, true); } /* Some required settings are missing/invalid */ else if ((m_status == ADDON_STATUS_NEED_SETTINGS) || (m_status == ADDON_STATUS_NEED_SAVEDSETTINGS)) @@ -128,11 +131,14 @@ CGUIDialogYesNo* pDialogYesNo = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!pDialogYesNo) return; - pDialogYesNo->SetHeading(CVariant{heading}); - pDialogYesNo->SetLine(1, CVariant{24070}); - pDialogYesNo->SetLine(2, CVariant{24072}); - pDialogYesNo->SetLine(3, CVariant{m_message}); - pDialogYesNo->Open(); + pDialogYesNo->SetHeading(heading); + pDialogYesNo->SetLine(1, 24070); + pDialogYesNo->SetLine(2, 24072); + pDialogYesNo->SetLine(3, m_message); + + //send message and wait for user input + ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_YES_NO, g_windowManager.GetActiveWindow()}; + CApplicationMessenger::Get().SendMessage(tMsg, true); if (!pDialogYesNo->IsConfirmed()) return; @@ -143,7 +149,7 @@ { //todo doesn't dialogaddonsettings save these automatically? should do m_addon->SaveSettings(); - CAddonMgr::GetInstance().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, true); + CAddonMgr::Get().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, true); } } /* A unknown event has occurred */ @@ -152,11 +158,14 @@ CGUIDialogOK* pDialog = (CGUIDialogOK*)g_windowManager.GetWindow(WINDOW_DIALOG_OK); if (!pDialog) return; - pDialog->SetHeading(CVariant{heading}); - pDialog->SetLine(1, CVariant{24070}); - pDialog->SetLine(2, CVariant{24071}); - pDialog->SetLine(3, CVariant{m_message}); - pDialog->Open(); + pDialog->SetHeading(heading); + pDialog->SetLine(1, 24070); + pDialog->SetLine(2, 24071); + pDialog->SetLine(3, m_message); + + //send message and wait for user input + ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_OK, g_windowManager.GetActiveWindow()}; + CApplicationMessenger::Get().SendMessage(tMsg, true); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonVersion.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AddonVersion.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonVersion.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonVersion.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -100,11 +100,6 @@ return (CompareComponent(mRevision.c_str(), other.mRevision.c_str()) < 0); } - bool AddonVersion::operator>(const AddonVersion & other) const - { - return !(*this <= other); - } - bool AddonVersion::operator==(const AddonVersion& other) const { return mEpoch == other.mEpoch @@ -112,21 +107,6 @@ && CompareComponent(mRevision.c_str(), other.mRevision.c_str()) == 0; } - bool AddonVersion::operator!=(const AddonVersion & other) const - { - return !(*this == other); - } - - bool AddonVersion::operator<=(const AddonVersion& other) const - { - return *this < other || *this == other; - } - - bool AddonVersion::operator>=(const AddonVersion & other) const - { - return !(*this < other); - } - bool AddonVersion::empty() const { return mEpoch == 0 && mUpstream == "0.0.0" && mRevision.empty(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AddonVersion.h kodi-15.2~git20151019.1039-final/xbmc/addons/AddonVersion.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/AddonVersion.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AddonVersion.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,6 +19,7 @@ */ #include +#include namespace ADDON { @@ -34,8 +35,7 @@ See here for more info: http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version */ - class AddonVersion - { + class AddonVersion : public boost::totally_ordered { public: AddonVersion(const AddonVersion& other) { *this = other; } explicit AddonVersion(const std::string& version); @@ -46,12 +46,8 @@ const std::string &Revision() const { return mRevision; } AddonVersion& operator=(const AddonVersion& other); - bool operator< (const AddonVersion& other) const; - bool operator> (const AddonVersion& other) const; - bool operator<=(const AddonVersion& other) const; - bool operator>=(const AddonVersion& other) const; + bool operator<(const AddonVersion& other) const; bool operator==(const AddonVersion& other) const; - bool operator!=(const AddonVersion& other) const; std::string asString() const; bool empty() const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AudioDecoder.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AudioDecoder.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AudioDecoder.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AudioDecoder.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,15 +25,15 @@ CAudioDecoder::CAudioDecoder(const cp_extension_t* ext) : AudioDecoderDll(ext), - m_extension(CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@extension")), - m_mimetype(CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@mimetype")), + m_extension(CAddonMgr::Get().GetExtValue(ext->configuration, "@extension")), + m_mimetype(CAddonMgr::Get().GetExtValue(ext->configuration, "@mimetype")), m_context(NULL), - m_tags(CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@tags") == "true"), - m_tracks(CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@tracks") == "true"), + m_tags(CAddonMgr::Get().GetExtValue(ext->configuration, "@tags") == "true"), + m_tracks(CAddonMgr::Get().GetExtValue(ext->configuration, "@tracks") == "true"), m_channel(NULL) { - m_CodecName = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@name"); - m_strExt = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@name")+"stream"; + m_CodecName = CAddonMgr::Get().GetExtValue(ext->configuration, "@name"); + m_strExt = CAddonMgr::Get().GetExtValue(ext->configuration, "@name")+"stream"; } AddonPtr CAudioDecoder::Clone() const diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/AudioEncoder.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/AudioEncoder.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/AudioEncoder.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/AudioEncoder.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,7 @@ CAudioEncoder::CAudioEncoder(const cp_extension_t* ext) : AudioEncoderDll(ext), - extension(CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@extension")), + extension(CAddonMgr::Get().GetExtValue(ext->configuration, "@extension")), m_context(NULL) { } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/ContextItemAddon.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/ContextItemAddon.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/ContextItemAddon.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/ContextItemAddon.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2013-2015 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "ContextItemAddon.h" +#include "AddonManager.h" +#include "ContextMenuManager.h" +#include "GUIInfoManager.h" +#include "interfaces/info/InfoBool.h" +#include "utils/StringUtils.h" +#include + +using namespace std; + +namespace ADDON +{ + +CContextItemAddon::CContextItemAddon(const AddonProps &props) + : CAddon(props) +{ } + +CContextItemAddon::~CContextItemAddon() +{ } + +CContextItemAddon::CContextItemAddon(const cp_extension_t *ext) + : CAddon(ext) +{ + ELEMENTS items; + if (CAddonMgr::Get().GetExtElements(ext->configuration, "item", items)) + { + cp_cfg_element_t *item = items[0]; + + m_label = CAddonMgr::Get().GetExtValue(item, "label"); + m_parent = CAddonMgr::Get().GetExtValue(item, "parent"); + + string visible = CAddonMgr::Get().GetExtValue(item, "visible"); + if (visible.empty()) + visible = "false"; + + m_visCondition = g_infoManager.Register(visible, 0); + } +} + +std::string CContextItemAddon::GetLabel() +{ + if (StringUtils::IsNaturalNumber(m_label)) + return GetString(boost::lexical_cast(m_label.c_str())); + return m_label; +} + +bool CContextItemAddon::IsVisible(const CFileItemPtr& item) const +{ + return item && m_visCondition && m_visCondition->Get(item.get()); +} + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/ContextItemAddon.h kodi-15.2~git20151019.1039-final/xbmc/addons/ContextItemAddon.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/ContextItemAddon.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/ContextItemAddon.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,66 @@ +#pragma once +/* + * Copyright (C) 2013-2015 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include +#include +#include "Addon.h" + +class CFileItem; +typedef std::shared_ptr CFileItemPtr; + +namespace INFO +{ + class InfoBool; + typedef std::shared_ptr InfoPtr; +} + +namespace ADDON +{ + class CContextItemAddon : public CAddon + { + public: + CContextItemAddon(const cp_extension_t *ext); + CContextItemAddon(const AddonProps &props); + virtual ~CContextItemAddon(); + + std::string GetLabel(); + + /*! + * \brief Get the parent category of this context item. + * + * \details Returns empty string if at root level or + * CONTEXT_MENU_GROUP_MANAGE when it should be in the 'manage' submenu. + */ + const std::string& GetParent() const { return m_parent; } + + /*! + * \brief Returns true if this contex menu should be visible for given item. + */ + bool IsVisible(const CFileItemPtr& item) const; + + private: + std::string m_label; + std::string m_parent; + INFO::InfoPtr m_visCondition; + }; + + typedef std::shared_ptr ContextItemAddonPtr; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/ContextMenuAddon.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/ContextMenuAddon.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/ContextMenuAddon.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/ContextMenuAddon.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2013-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "ContextMenuAddon.h" -#include "AddonManager.h" -#include "ContextMenuManager.h" -#include "ContextMenuItem.h" -#include "GUIInfoManager.h" -#include "interfaces/info/InfoBool.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include - - -namespace ADDON -{ - -CContextMenuAddon::CContextMenuAddon(const AddonProps &props) - : CAddon(props) -{ } - -CContextMenuAddon::~CContextMenuAddon() -{ } - -CContextMenuAddon::CContextMenuAddon(const cp_extension_t *ext) - : CAddon(ext) -{ - cp_cfg_element_t* menu = CAddonMgr::GetInstance().GetExtElement(ext->configuration, "menu"); - if (menu) - { - int tmp = 0; - ParseMenu(menu, "", tmp); - } - else - { - //backwards compatibility. add first item definition - ELEMENTS items; - if (CAddonMgr::GetInstance().GetExtElements(ext->configuration, "item", items)) - { - cp_cfg_element_t *item = items[0]; - - std::string visCondition = CAddonMgr::GetInstance().GetExtValue(item, "visible"); - if (visCondition.empty()) - visCondition = "false"; - - std::string parent = CAddonMgr::GetInstance().GetExtValue(item, "parent") == "kodi.core.manage" - ? CContextMenuManager::MANAGE.m_groupId : CContextMenuManager::MAIN.m_groupId; - - CContextMenuItem menuItem = CContextMenuItem::CreateItem( - CAddonMgr::GetInstance().GetExtValue(item, "label"), - parent, - LibPath(), - g_infoManager.Register(visCondition, 0)); - - m_items.push_back(menuItem); - } - } -} - -void CContextMenuAddon::ParseMenu(cp_cfg_element_t* elem, const std::string& parent, int& anonGroupCount) -{ - auto menuLabel = CAddonMgr::GetInstance().GetExtValue(elem, "label"); - auto menuId = CAddonMgr::GetInstance().GetExtValue(elem, "@id"); - - if (menuId.empty()) - { - //anonymous group. create a new unique internal id. - std::stringstream ss; - ss << ID() << ++anonGroupCount; - menuId = ss.str(); - } - - m_items.push_back(CContextMenuItem::CreateGroup(menuLabel, parent, menuId)); - - ELEMENTS subMenus; - if (CAddonMgr::GetInstance().GetExtElements(elem, "menu", subMenus)) - for (const auto& subMenu : subMenus) - ParseMenu(subMenu, menuId, anonGroupCount); - - ELEMENTS items; - if (CAddonMgr::GetInstance().GetExtElements(elem, "item", items)) - { - for (const auto& item : items) - { - auto label = CAddonMgr::GetInstance().GetExtValue(item, "label"); - auto visCondition = CAddonMgr::GetInstance().GetExtValue(item, "visible"); - auto library = CAddonMgr::GetInstance().GetExtValue(item, "@library"); - - if (!label.empty() && !library.empty() && !visCondition.empty()) - { - auto menu = CContextMenuItem::CreateItem( - label, - menuId, - URIUtils::AddFileToFolder(Path(), library), - g_infoManager.Register(visCondition, 0)); - - m_items.push_back(menu); - } - } - } -} - -std::vector CContextMenuAddon::GetItems() -{ - //Return a copy which owns `this` - std::vector ret = m_items; - for (CContextMenuItem& menuItem : ret) - menuItem.m_addon = this->shared_from_this(); - return ret; -} - -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/ContextMenuAddon.h kodi-15.2~git20151019.1039-final/xbmc/addons/ContextMenuAddon.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/ContextMenuAddon.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/ContextMenuAddon.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -#pragma once -/* - * Copyright (C) 2013-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include "Addon.h" - -class CContextMenuItem; -typedef struct cp_cfg_element_t cp_cfg_element_t; - - -namespace ADDON -{ - class CContextMenuAddon : public CAddon - { - public: - CContextMenuAddon(const cp_extension_t *ext); - CContextMenuAddon(const AddonProps &props); - virtual ~CContextMenuAddon(); - - std::vector GetItems(); - - private: - void ParseMenu(cp_cfg_element_t* elem, const std::string& parent, int& anonGroupCount); - std::vector m_items; - }; - - typedef std::shared_ptr ContextItemAddonPtr; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/DllAudioDSP.h kodi-15.2~git20151019.1039-final/xbmc/addons/DllAudioDSP.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/DllAudioDSP.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/DllAudioDSP.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -#pragma once -/* - * Copyright (C) 2012-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "DllAddon.h" -#include "include/kodi_adsp_types.h" - -class DllAudioDSP : public DllAddon -{ - // this is populated via Macro calls in DllAddon.h -}; - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/GUIDialogAddonInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/GUIDialogAddonInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/GUIDialogAddonInfo.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/GUIDialogAddonInfo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,42 +19,36 @@ */ #include "GUIDialogAddonInfo.h" - -#include "addons/AddonInstaller.h" +#include "dialogs/GUIDialogYesNo.h" +#include "dialogs/GUIDialogOK.h" #include "addons/AddonManager.h" #include "AddonDatabase.h" #include "FileItem.h" #include "filesystem/Directory.h" #include "GUIDialogAddonSettings.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" #include "dialogs/GUIDialogContextMenu.h" #include "dialogs/GUIDialogTextViewer.h" -#include "dialogs/GUIDialogOK.h" -#include "dialogs/GUIDialogSelect.h" -#include "dialogs/GUIDialogYesNo.h" #include "GUIUserMessages.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" -#include "settings/Settings.h" #include "utils/JobManager.h" #include "utils/FileOperationJob.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "utils/log.h" -#include "utils/Variant.h" +#include "addons/AddonInstaller.h" #include "Util.h" -#include "interfaces/builtins/Builtins.h" - -#include +#include "interfaces/Builtins.h" #define CONTROL_BTN_INSTALL 6 #define CONTROL_BTN_ENABLE 7 #define CONTROL_BTN_UPDATE 8 #define CONTROL_BTN_SETTINGS 9 #define CONTROL_BTN_CHANGELOG 10 +#define CONTROL_BTN_ROLLBACK 11 #define CONTROL_BTN_SELECT 12 -#define CONTROL_BTN_AUTOUPDATE 13 +using namespace std; using namespace ADDON; using namespace XFILE; @@ -92,15 +86,6 @@ } if (iControl == CONTROL_BTN_INSTALL) { - if (m_localAddon) - { - if (m_localAddon->Type() == ADDON_ADSPDLL && ActiveAE::CActiveAEDSP::GetInstance().IsProcessing()) - { - CGUIDialogOK::ShowAndGetInput(24137, 0, 24138, 0); - return true; - } - } - if (!m_localAddon) { OnInstall(); @@ -114,20 +99,11 @@ } else if (iControl == CONTROL_BTN_SELECT) { - OnSelect(); + OnLaunch(); return true; } else if (iControl == CONTROL_BTN_ENABLE) { - if (m_localAddon) - { - if (m_localAddon->Type() == ADDON_ADSPDLL && ActiveAE::CActiveAEDSP::GetInstance().IsProcessing()) - { - CGUIDialogOK::ShowAndGetInput(24137, 0, 24138, 0); - return true; - } - } - OnEnable(!m_item->GetProperty("Addon.Enabled").asBoolean()); return true; } @@ -141,9 +117,9 @@ OnChangeLog(); return true; } - else if (iControl == CONTROL_BTN_AUTOUPDATE) + else if (iControl == CONTROL_BTN_ROLLBACK) { - OnToggleAutoUpdates(); + OnRollback(); return true; } } @@ -176,7 +152,12 @@ { bool isInstalled = NULL != m_localAddon.get(); bool isEnabled = isInstalled && m_item->GetProperty("Addon.Enabled").asBoolean(); - bool canDisable = isInstalled && CAddonMgr::GetInstance().CanAddonBeDisabled(m_localAddon->ID()); + bool isUpdatable = isInstalled && m_item->GetProperty("Addon.UpdateAvail").asBoolean(); + bool isExecutable = isInstalled && (m_localAddon->Type() == ADDON_PLUGIN || m_localAddon->Type() == ADDON_SCRIPT); + if (isInstalled) + GrabRollbackVersions(); + + bool canDisable = isInstalled && CAddonMgr::Get().CanAddonBeDisabled(m_localAddon->ID()); bool canInstall = !isInstalled && m_item->GetProperty("Addon.Broken").empty(); bool isRepo = (isInstalled && m_localAddon->Type() == ADDON_REPOSITORY) || (m_addon && m_addon->Type() == ADDON_REPOSITORY); @@ -186,176 +167,33 @@ CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_ENABLE, canDisable); SET_CONTROL_LABEL(CONTROL_BTN_ENABLE, isEnabled ? 24021 : 24022); - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_UPDATE, isInstalled); - - bool autoUpdatesOn = CSettings::GetInstance().GetInt(CSettings::SETTING_GENERAL_ADDONUPDATES) == AUTO_UPDATES_ON; - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_AUTOUPDATE, isInstalled && autoUpdatesOn); - SET_CONTROL_SELECTED(GetID(), CONTROL_BTN_AUTOUPDATE, isInstalled && autoUpdatesOn && - !CAddonMgr::GetInstance().IsBlacklisted(m_localAddon->ID())); - SET_CONTROL_LABEL(CONTROL_BTN_AUTOUPDATE, 21340); - - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_SELECT, isEnabled && (CanOpen() || - CanRun() || (CanUse() && !m_localAddon->IsInUse()))); - SET_CONTROL_LABEL(CONTROL_BTN_SELECT, CanUse() ? 21480 : (CanOpen() ? 21478 : 21479)); - + CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_UPDATE, isUpdatable); CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_SETTINGS, isInstalled && m_localAddon->HasSettings()); + CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_SELECT, isExecutable); CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_CHANGELOG, !isRepo); + CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_ROLLBACK, m_rollbackVersions.size() > 1); } -static const std::string LOCAL_CACHE = "special_local_cache"; - -static bool CompareVersion(const std::pair& lhs, const std::pair& rhs) -{ - return lhs.first > rhs.first; -}; - void CGUIDialogAddonInfo::OnUpdate() { - if (!m_localAddon) - return; - - CAddonDatabase database; - if (!database.Open()) - return; - - std::vector> versions; - if (!database.GetAvailableVersions(m_localAddon->ID(), versions)) - return; - - CFileItemList items; - if (XFILE::CDirectory::GetDirectory("special://home/addons/packages/", items, ".zip", DIR_FLAG_NO_FILE_DIRS)) - { - for (int i = 0; i < items.Size(); ++i) - { - std::string packageId; - std::string versionString; - if (AddonVersion::SplitFileName(packageId, versionString, items[i]->GetLabel())) - { - if (packageId == m_localAddon->ID()) - { - std::string hash; - std::string path(items[i]->GetPath()); - if (database.GetPackageHash(m_localAddon->ID(), items[i]->GetPath(), hash)) - { - std::string md5 = CUtil::GetFileMD5(path); - if (md5 == hash) - versions.push_back(std::make_pair(AddonVersion(versionString), LOCAL_CACHE)); - } - } - } - } - } - - if (versions.empty()) - { - CGUIDialogOK::ShowAndGetInput(CVariant{21341}, CVariant{21342}); - return; - } - - auto* dialog = static_cast(g_windowManager.GetWindow(WINDOW_DIALOG_SELECT)); - dialog->Reset(); - dialog->SetHeading(CVariant{21338}); - dialog->SetUseDetails(true); - - std::stable_sort(versions.begin(), versions.end(), CompareVersion); - - for (const auto& versionInfo : versions) - { - CFileItem item(StringUtils::Format(g_localizeStrings.Get(21339).c_str(), versionInfo.first.asString().c_str())); - if (versionInfo.first == m_localAddon->Version()) - item.Select(true); - - AddonPtr repo; - if (versionInfo.second == LOCAL_CACHE) - { - item.SetProperty("Addon.Summary", g_localizeStrings.Get(24095)); - item.SetIconImage("DefaultAddonRepository.png"); - dialog->Add(item); - } - else if (CAddonMgr::GetInstance().GetAddon(versionInfo.second, repo, ADDON_REPOSITORY)) - { - item.SetProperty("Addon.Summary", repo->Name()); - item.SetIconImage(repo->Icon()); - dialog->Add(item); - } - } - - dialog->Open(); - if (dialog->IsConfirmed()) - { - Close(); - - auto selected = versions.at(dialog->GetSelectedLabel()); - - //turn auto updating off if downgrading - if (selected.first < m_localAddon->Version()) - CAddonMgr::GetInstance().AddToUpdateBlacklist(m_localAddon->ID()); - - if (selected.second == LOCAL_CACHE) - CAddonInstaller::GetInstance().InstallFromZip(StringUtils::Format("special://home/addons/packages/%s-%s.zip", - m_localAddon->ID().c_str(), selected.first.asString().c_str())); - else - CAddonInstaller::GetInstance().Install(m_addon->ID(), selected.first, selected.second); - } -} - -void CGUIDialogAddonInfo::OnToggleAutoUpdates() -{ - CGUIMessage msg(GUI_MSG_IS_SELECTED, GetID(), CONTROL_BTN_AUTOUPDATE); - if (OnMessage(msg)) - { - bool selected = msg.GetParam1() == 1; - if (selected) - CAddonMgr::GetInstance().RemoveFromUpdateBlacklist(m_localAddon->ID()); - else - CAddonMgr::GetInstance().AddToUpdateBlacklist(m_localAddon->ID()); - } + std::string referer = StringUtils::Format("Referer=%s-%s.zip",m_localAddon->ID().c_str(),m_localAddon->Version().asString().c_str()); + CAddonInstaller::Get().Install(m_addon->ID(), true, referer); // force install + Close(); } void CGUIDialogAddonInfo::OnInstall() { - if (!g_passwordManager.CheckMenuLock(WINDOW_ADDON_BROWSER)) - return; - - if (!m_addon) - return; - - CAddonInstaller::GetInstance().InstallOrUpdate(m_addon->ID()); + CAddonInstaller::Get().Install(m_addon->ID()); Close(); } -void CGUIDialogAddonInfo::OnSelect() +void CGUIDialogAddonInfo::OnLaunch() { if (!m_localAddon) return; Close(); - - if (CanOpen() || CanRun()) - CBuiltins::GetInstance().Execute("RunAddon(" + m_localAddon->ID() + ")"); - else if (CanUse()) - CAddonMgr::GetInstance().SetDefault(m_localAddon->Type(), m_localAddon->ID()); -} - -bool CGUIDialogAddonInfo::CanOpen() const -{ - return m_localAddon && m_localAddon->Type() == ADDON_PLUGIN; -} - -bool CGUIDialogAddonInfo::CanRun() const -{ - return m_localAddon && m_localAddon->Type() == ADDON_SCRIPT; -} - -bool CGUIDialogAddonInfo::CanUse() const -{ - return m_localAddon && ( - m_localAddon->Type() == ADDON_SKIN || - m_localAddon->Type() == ADDON_SCREENSAVER || - m_localAddon->Type() == ADDON_VIZ || - m_localAddon->Type() == ADDON_SCRIPT_WEATHER || - m_localAddon->Type() == ADDON_RESOURCE_LANGUAGE || - m_localAddon->Type() == ADDON_RESOURCE_UISOUNDS); + CBuiltins::Execute("RunAddon(" + m_localAddon->ID() + ")"); } bool CGUIDialogAddonInfo::PromptIfDependency(int heading, int line2) @@ -364,8 +202,8 @@ return false; VECADDONS addons; - std::vector deps; - CAddonMgr::GetInstance().GetAllAddons(addons); + vector deps; + CAddonMgr::Get().GetAllAddons(addons); for (VECADDONS::const_iterator it = addons.begin(); it != addons.end();++it) { @@ -376,9 +214,9 @@ if (!deps.empty()) { - std::string line0 = StringUtils::Format(g_localizeStrings.Get(24046).c_str(), m_localAddon->Name().c_str()); - std::string line1 = StringUtils::Join(deps, ", "); - CGUIDialogOK::ShowAndGetInput(CVariant{heading}, CVariant{std::move(line0)}, CVariant{std::move(line1)}, CVariant{line2}); + string line0 = StringUtils::Format(g_localizeStrings.Get(24046).c_str(), m_localAddon->Name().c_str()); + string line1 = StringUtils::Join(deps, ", "); + CGUIDialogOK::ShowAndGetInput(heading, line0, line1, line2); return true; } return false; @@ -397,11 +235,11 @@ return; // prompt user to be sure - if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{24037}, CVariant{750})) + if (!CGUIDialogYesNo::ShowAndGetInput(24037, 750)) return; CJobManager::GetInstance().AddJob(new CAddonUnInstallJob(m_localAddon), - &CAddonInstaller::GetInstance()); + &CAddonInstaller::Get()); Close(); } @@ -417,9 +255,9 @@ return; if (enable) - CAddonMgr::GetInstance().EnableAddon(m_localAddon->ID()); + CAddonMgr::Get().EnableAddon(m_localAddon->ID()); else - CAddonMgr::GetInstance().DisableAddon(m_localAddon->ID()); + CAddonMgr::Get().DisableAddon(m_localAddon->ID()); SetItem(m_item); UpdateControls(); g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE); @@ -459,10 +297,50 @@ pDlgInfo->SetText(m_item->GetProperty("Addon.Changelog").asString()); m_changelog = true; - pDlgInfo->Open(); + pDlgInfo->DoModal(); m_changelog = false; } +void CGUIDialogAddonInfo::OnRollback() +{ + if (!g_passwordManager.CheckMenuLock(WINDOW_ADDON_BROWSER)) + return; + + CGUIDialogContextMenu* dlg = (CGUIDialogContextMenu*)g_windowManager.GetWindow(WINDOW_DIALOG_CONTEXT_MENU); + CAddonDatabase database; + database.Open(); + + CContextButtons buttons; + for (unsigned int i=0;iVersion().asString()) + label += " "+g_localizeStrings.Get(24094); + if (database.IsAddonBlacklisted(m_localAddon->ID(),label)) + label += " "+g_localizeStrings.Get(24095); + + buttons.Add(i,label); + } + int choice; + if ((choice=dlg->ShowAndGetChoice(buttons)) > -1) + { + // blacklist everything newer + for (unsigned int j=choice+1;jID(),m_rollbackVersions[j]); + std::string path = "special://home/addons/packages/"; + path += m_localAddon->ID()+"-"+m_rollbackVersions[choice]+".zip"; + + //FIXME: this is probably broken + // needed as cpluff won't downgrade + if (!m_localAddon->IsType(ADDON_SERVICE)) + //we will handle this for service addons in CAddonInstallJob::OnPostInstall + CAddonMgr::Get().UnregisterAddon(m_localAddon->ID()); + CAddonInstaller::Get().InstallFromZip(path); + database.RemoveAddonFromBlacklist(m_localAddon->ID(),m_rollbackVersions[choice]); + Close(); + } +} + bool CGUIDialogAddonInfo::ShowForItem(const CFileItemPtr& item) { CGUIDialogAddonInfo* dialog = (CGUIDialogAddonInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_ADDON_INFO); @@ -471,18 +349,19 @@ if (!dialog->SetItem(item)) return false; - dialog->Open(); + dialog->DoModal(); return true; } bool CGUIDialogAddonInfo::SetItem(const CFileItemPtr& item) { *m_item = *item; + m_rollbackVersions.clear(); // grab the local addon, if it's available m_localAddon.reset(); m_addon.reset(); - if (CAddonMgr::GetInstance().GetAddon(item->GetProperty("Addon.ID").asString(), m_localAddon)) // sets m_localAddon if installed regardless of enabled state + if (CAddonMgr::Get().GetAddon(item->GetProperty("Addon.ID").asString(), m_localAddon)) // sets m_localAddon if installed regardless of enabled state m_item->SetProperty("Addon.Enabled", "true"); else m_item->SetProperty("Addon.Enabled", "false"); @@ -498,9 +377,9 @@ database.Open(); VECADDONS addons; if (m_addon) - database.GetRepositoryContent(m_addon->ID(), addons); + database.GetRepository(m_addon->ID(), addons); else if (m_localAddon) // sanity - database.GetRepositoryContent(m_localAddon->ID(), addons); + database.GetRepository(m_localAddon->ID(), addons); int tot=0; for (int i = ADDON_UNKNOWN+1;im_bIsFolder) + continue; + std::string ID, version; + AddonVersion::SplitFileName(ID,version,items[i]->GetLabel()); + if (ID == m_localAddon->ID()) + { + std::string hash, path(items[i]->GetPath()); + if (db.GetPackageHash(m_localAddon->ID(), path, hash)) + { + std::string md5 = CUtil::GetFileMD5(path); + if (md5 == hash) + m_rollbackVersions.push_back(version); + else /* The package has been corrupted */ + { + CLog::Log(LOGWARNING, "%s: Removing corrupt addon package %s.", __FUNCTION__, path.c_str()); + CFile::Delete(path); + db.RemovePackage(path); + } + } + } + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/GUIDialogAddonInfo.h kodi-15.2~git20151019.1039-final/xbmc/addons/GUIDialogAddonInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/GUIDialogAddonInfo.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/GUIDialogAddonInfo.h 2015-10-19 08:39:16.000000000 +0000 @@ -41,8 +41,7 @@ // job callback void OnJobComplete(unsigned int jobID, bool success, CJob* job); - -private: +protected: void OnInitWindow(); /*! \brief Set the item to display addon info on. @@ -58,19 +57,8 @@ void OnEnable(bool enable); void OnSettings(); void OnChangeLog(); - void OnSelect(); - void OnToggleAutoUpdates(); - - /*! Returns true if current addon can be opened (i.e is a plugin)*/ - bool CanOpen() const; - - /*! Returns true if current addon can be run (i.e is a script)*/ - bool CanRun() const; - - /*! - * Returns true if current addon is of a type that can only have one activly - * in use at a time and can be changed (e.g skins)*/ - bool CanUse() const; + void OnRollback(); + void OnLaunch(); /*! \brief check if the add-on is a dependency of others, and if so prompt the user. \param heading the label for the heading of the prompt dialog @@ -84,5 +72,9 @@ ADDON::AddonPtr m_localAddon; unsigned int m_jobid; bool m_changelog; + + // rollback data + void GrabRollbackVersions(); + std::vector m_rollbackVersions; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/GUIDialogAddonSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/GUIDialogAddonSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/GUIDialogAddonSettings.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/GUIDialogAddonSettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -37,7 +37,7 @@ #include "input/Key.h" #include "filesystem/Directory.h" #include "guilib/GUIWindowManager.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "guilib/GUIKeyboardFactory.h" #include "FileItem.h" #include "settings/AdvancedSettings.h" @@ -49,10 +49,9 @@ #include "utils/log.h" #include "URL.h" #include "utils/XMLUtils.h" -#include "utils/Variant.h" +using namespace std; using namespace ADDON; -using namespace KODI::MESSAGING; using XFILE::CDirectory; #define CONTROL_SETTINGS_AREA 2 @@ -214,12 +213,12 @@ pDialog->m_addon = addon; pDialog->m_saveToDisk = saveToDisk; - pDialog->Open(); + pDialog->DoModal(); ret = true; } else { // addon does not support settings, inform user - CGUIDialogOK::ShowAndGetInput(CVariant{24000}, CVariant{24030}); + CGUIDialogOK::ShowAndGetInput(24000, 24030); } return ret; @@ -251,7 +250,7 @@ StringUtils::Replace(action, "$ID", m_addon->ID()); if (option) bCloseDialog = (strcmpi(option, "close") == 0); - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, action); + CApplicationMessenger::Get().ExecBuiltIn(action); } break; } @@ -277,7 +276,7 @@ if (bEncoded) value = CURL::Decode(value); - if (CGUIKeyboardFactory::ShowAndGetInput(value, CVariant{label}, true, bHidden)) + if (CGUIKeyboardFactory::ShowAndGetInput(value, label, true, bHidden)) { // if hidden hide input if (bHidden) @@ -305,11 +304,11 @@ CGUIDialogSelect *pDlg = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); if (pDlg) { - pDlg->SetHeading(CVariant{label}); + pDlg->SetHeading(label.c_str()); pDlg->Reset(); int selected = -1; - std::vector valuesVec; + vector valuesVec; if (setting->Attribute("values")) StringUtils::Tokenize(setting->Attribute("values"), valuesVec, "|"); else if (setting->Attribute("lvalues")) @@ -336,7 +335,7 @@ if (selected == (int)i || (selected < 0 && StringUtils::EqualsNoCase(valuesVec[i], value))) pDlg->SetSelected(i); // FIXME: the SetSelected() does not select "i", it always defaults to the first position } - pDlg->Open(); + pDlg->DoModal(); int iSelected = pDlg->GetSelectedLabel(); if (iSelected >= 0) { @@ -355,7 +354,7 @@ // setup the shares VECSOURCES *shares = NULL; if (source && strcmpi(source, "") != 0) - shares = CMediaSourceSettings::GetInstance().GetSources(source); + shares = CMediaSourceSettings::Get().GetSources(source); VECSOURCES localShares; if (!shares) @@ -421,7 +420,7 @@ bool bUseFileDirectories = false; if (option) { - std::vector options = StringUtils::Split(option, '|'); + vector options = StringUtils::Split(option, '|'); bUseThumbs = find(options.begin(), options.end(), "usethumbs") != options.end(); bUseFileDirectories = find(options.begin(), options.end(), "treatasfolder") != options.end(); } @@ -464,9 +463,9 @@ const char *strType = setting->Attribute("addontype"); if (strType) { - std::vector addonTypes = StringUtils::Split(strType, ','); - std::vector types; - for (std::vector::iterator i = addonTypes.begin(); i != addonTypes.end(); ++i) + vector addonTypes = StringUtils::Split(strType, ','); + vector types; + for (vector::iterator i = addonTypes.begin(); i != addonTypes.end(); ++i) { StringUtils::Trim(*i); ADDON::TYPE type = TranslateType(*i); @@ -480,7 +479,7 @@ if (multiSelect) { // construct vector of addon IDs (IDs are comma seperated in single string) - std::vector addonIDs = StringUtils::Split(value, ','); + vector addonIDs = StringUtils::Split(value, ','); if (CGUIWindowAddonBrowser::SelectAddonID(types, addonIDs, false) == 1) { value = StringUtils::Join(addonIDs, ","); @@ -554,7 +553,7 @@ { UpdateFromControls(); - for (std::map::iterator i = m_settings.begin(); i != m_settings.end(); ++i) + for (map::iterator i = m_settings.begin(); i != m_settings.end(); ++i) m_addon->UpdateSetting(i->first, i->second); if (m_saveToDisk) @@ -721,7 +720,7 @@ ((CGUIButtonControl *)pControl)->SetLabel2(GetAddonNames(value)); else if (type == "select" && !lvalues.empty()) { - std::vector valuesVec = StringUtils::Split(lvalues, '|'); + vector valuesVec = StringUtils::Split(lvalues, '|'); int selected = atoi(value.c_str()); if (selected >= 0 && selected < (int)valuesVec.size()) { @@ -747,8 +746,8 @@ } else if ((type == "enum" || type == "labelenum") && !id.empty()) { - std::vector valuesVec; - std::vector entryVec; + vector valuesVec; + vector entryVec; pControl = new CGUISpinControlEx(*pOriginalSpin); if (!pControl) return; @@ -802,7 +801,7 @@ ((CGUISpinControlEx *)pControl)->SetText(label); ((CGUISpinControlEx *)pControl)->SetFloatValue(1.0f); - std::vector items = GetFileEnumValues(values, XMLUtils::GetAttribute(setting, "mask"), XMLUtils::GetAttribute(setting, "option")); + vector items = GetFileEnumValues(values, XMLUtils::GetAttribute(setting, "mask"), XMLUtils::GetAttribute(setting, "option")); for (unsigned int i = 0; i < items.size(); ++i) { ((CGUISpinControlEx *)pControl)->AddLabel(items[i], i); @@ -853,7 +852,7 @@ float fMin = 0.0f; float fMax = 100.0f; float fInc = 1.0f; - std::vector range = StringUtils::Split(XMLUtils::GetAttribute(setting, "range"), ','); + vector range = StringUtils::Split(XMLUtils::GetAttribute(setting, "range"), ','); if (range.size() > 1) { fMin = (float)atof(range[0].c_str()); @@ -910,13 +909,13 @@ std::string CGUIDialogAddonSettings::GetAddonNames(const std::string& addonIDslist) const { std::string retVal; - std::vector addons = StringUtils::Split(addonIDslist, ','); - for (std::vector::const_iterator it = addons.begin(); it != addons.end() ; ++it) + vector addons = StringUtils::Split(addonIDslist, ','); + for (vector::const_iterator it = addons.begin(); it != addons.end() ; ++it) { if (!retVal.empty()) retVal += ", "; AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(*it ,addon)) + if (CAddonMgr::Get().GetAddon(*it ,addon)) retVal += addon->Name(); else retVal += *it; @@ -924,7 +923,7 @@ return retVal; } -std::vector CGUIDialogAddonSettings::GetFileEnumValues(const std::string &path, const std::string &mask, const std::string &options) const +vector CGUIDialogAddonSettings::GetFileEnumValues(const std::string &path, const std::string &mask, const std::string &options) const { // Create our base path, used for type "fileenum" settings // replace $PROFILE with the profile path of the plugin/script @@ -942,7 +941,7 @@ else CDirectory::GetDirectory(fullPath, items, "", XFILE::DIR_FLAG_NO_FILE_DIRS); - std::vector values; + vector values; for (int i = 0; i < items.Size(); ++i) { CFileItemPtr pItem = items[i]; @@ -991,7 +990,7 @@ bool bCondition = true; bool bCompare = true; bool bControlDependend = false;//flag if the condition depends on another control - std::vector conditionVec; + vector conditionVec; if (condition.find("+") != std::string::npos) StringUtils::Tokenize(condition, conditionVec, "+"); @@ -1004,7 +1003,7 @@ for (unsigned int i = 0; i < conditionVec.size(); i++) { - std::vector condVec; + vector condVec; if (!TranslateSingleString(conditionVec[i], condVec)) continue; const CGUIControl* control2 = GetControl(controlId + atoi(condVec[1].c_str())); @@ -1070,7 +1069,7 @@ return bCondition; } -bool CGUIDialogAddonSettings::TranslateSingleString(const std::string &strCondition, std::vector &condVec) +bool CGUIDialogAddonSettings::TranslateSingleString(const std::string &strCondition, vector &condVec) { std::string strTest = strCondition; StringUtils::ToLower(strTest); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/GUIViewStateAddonBrowser.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/GUIViewStateAddonBrowser.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/GUIViewStateAddonBrowser.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/GUIViewStateAddonBrowser.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -68,7 +68,7 @@ share.strName = g_localizeStrings.Get(24998); m_sources.push_back(share); } - if (CAddonMgr::GetInstance().HasOutdatedAddons()) + if (CAddonMgr::Get().HasOutdatedAddons()) { CMediaSource share; share.strPath = "addons://outdated/"; @@ -76,7 +76,7 @@ share.strName = g_localizeStrings.Get(24043); // "Available updates" m_sources.push_back(share); } - if (CAddonMgr::GetInstance().HasAddons(ADDON_REPOSITORY, true)) + if (CAddonMgr::Get().HasAddons(ADDON_REPOSITORY, true)) { CMediaSource share; share.strPath = "addons://repos/"; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/GUIWindowAddonBrowser.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/GUIWindowAddonBrowser.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/GUIWindowAddonBrowser.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/GUIWindowAddonBrowser.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,6 @@ #include "GUIWindowAddonBrowser.h" #include "addons/AddonManager.h" -#include "addons/RepositoryUpdater.h" #include "GUIDialogAddonInfo.h" #include "GUIDialogAddonSettings.h" #include "dialogs/GUIDialogBusy.h" @@ -37,15 +36,12 @@ #include "settings/Settings.h" #include "settings/MediaSourceSettings.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "AddonDatabase.h" #include "storage/MediaManager.h" #include "LangInfo.h" #include "input/Key.h" #include "ContextMenuManager.h" -#include - #define CONTROL_AUTOUPDATE 5 #define CONTROL_SHUTUP 6 #define CONTROL_FOREIGNFILTER 7 @@ -54,6 +50,7 @@ using namespace ADDON; using namespace XFILE; +using namespace std; CGUIWindowAddonBrowser::CGUIWindowAddonBrowser(void) : CGUIMediaWindow(WINDOW_ADDON_BROWSER, "AddonBrowser.xml") @@ -92,35 +89,35 @@ { const CGUIControl *control = GetControl(CONTROL_AUTOUPDATE); if (control && control->GetControlType() == CGUIControl::GUICONTROL_BUTTON) - CSettings::GetInstance().SetInt(CSettings::SETTING_GENERAL_ADDONUPDATES, (CSettings::GetInstance().GetInt(CSettings::SETTING_GENERAL_ADDONUPDATES)+1) % AUTO_UPDATES_MAX); + CSettings::Get().SetInt("general.addonupdates", (CSettings::Get().GetInt("general.addonupdates")+1) % AUTO_UPDATES_MAX); else - CSettings::GetInstance().SetInt(CSettings::SETTING_GENERAL_ADDONUPDATES, (CSettings::GetInstance().GetInt(CSettings::SETTING_GENERAL_ADDONUPDATES) == 0) ? 1 : 0); + CSettings::Get().SetInt("general.addonupdates", (CSettings::Get().GetInt("general.addonupdates") == 0) ? 1 : 0); UpdateButtons(); return true; } else if (iControl == CONTROL_SHUTUP) { - CSettings::GetInstance().ToggleBool(CSettings::SETTING_GENERAL_ADDONNOTIFICATIONS); - CSettings::GetInstance().Save(); + CSettings::Get().ToggleBool("general.addonnotifications"); + CSettings::Get().Save(); return true; } else if (iControl == CONTROL_FOREIGNFILTER) { - CSettings::GetInstance().ToggleBool(CSettings::SETTING_GENERAL_ADDONFOREIGNFILTER); - CSettings::GetInstance().Save(); + CSettings::Get().ToggleBool("general.addonforeignfilter"); + CSettings::Get().Save(); Refresh(); return true; } else if (iControl == CONTROL_BROKENFILTER) { - CSettings::GetInstance().ToggleBool(CSettings::SETTING_GENERAL_ADDONBROKENFILTER); - CSettings::GetInstance().Save(); + CSettings::Get().ToggleBool("general.addonbrokenfilter"); + CSettings::Get().Save(); Refresh(); return true; } else if (iControl == CONTROL_CHECK_FOR_UPDATES) { - CRepositoryUpdater::GetInstance().CheckForUpdates(true); + CAddonInstaller::Get().UpdateRepos(true, false, true); return true; } else if (m_viewControl.HasControl(iControl)) // list/thumb control @@ -165,9 +162,9 @@ void CGUIWindowAddonBrowser::SetProperties() { - auto lastUpdated = CRepositoryUpdater::GetInstance().LastUpdated(); - SetProperty("Updated", lastUpdated.IsValid() ? - lastUpdated.GetAsLocalizedDateTime() : g_localizeStrings.Get(21337)); + auto lastChecked = CAddonInstaller::Get().LastRepoUpdate(); + if (lastChecked.IsValid()) + SetProperty("Updated", lastChecked.GetAsLocalizedDateTime()); } void CGUIWindowAddonBrowser::GetContextButtons(int itemNumber, CContextButtons& buttons) @@ -182,13 +179,11 @@ buttons.Add(CONTEXT_BUTTON_INFO, 24003); AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(addonId, addon, ADDON_UNKNOWN, false) && addon->HasSettings()) + if (CAddonMgr::Get().GetAddon(addonId, addon, ADDON_UNKNOWN, false) && addon->HasSettings()) buttons.Add(CONTEXT_BUTTON_SETTINGS, 24020); - if (CAddonMgr::GetInstance().GetAddon(addonId, addon, ADDON_REPOSITORY)) - buttons.Add(CONTEXT_BUTTON_CHECK_FOR_UPDATES, 24034); } - CContextMenuManager::GetInstance().AddVisibleItems(pItem, buttons); + CContextMenuManager::Get().AddVisibleItems(pItem, buttons); } bool CGUIWindowAddonBrowser::OnContextButton(int itemNumber, CONTEXT_BUTTON button) @@ -205,15 +200,9 @@ else if (button == CONTEXT_BUTTON_SETTINGS) { AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(addonId, addon, ADDON_UNKNOWN, false)) + if (CAddonMgr::Get().GetAddon(addonId, addon, ADDON_UNKNOWN, false)) return CGUIDialogAddonSettings::ShowAndGetInput(addon); } - else if (button == CONTEXT_BUTTON_CHECK_FOR_UPDATES) - { - AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(addonId, addon, ADDON_REPOSITORY)) - CRepositoryUpdater::GetInstance().CheckForUpdates(std::static_pointer_cast(addon), true); - } } return CGUIMediaWindow::OnContextButton(itemNumber, button); @@ -223,7 +212,13 @@ { virtual void Run() { - CAddonInstaller::GetInstance().InstallUpdates(true); + VECADDONS addons; + CAddonMgr::Get().GetAllOutdatedAddons(addons, true); // get local + for (VECADDONS::iterator i = addons.begin(); i != addons.end(); ++i) + { + std::string referer = StringUtils::Format("Referer=%s-%s.zip",(*i)->ID().c_str(),(*i)->Version().asString().c_str()); + CAddonInstaller::Get().Install((*i)->ID(), true, referer); // force install + } } }; @@ -234,27 +229,30 @@ if (item->GetPath() == "addons://install/") { // pop up filebrowser to grab an installed folder - VECSOURCES shares = *CMediaSourceSettings::GetInstance().GetSources("files"); + VECSOURCES shares = *CMediaSourceSettings::Get().GetSources("files"); g_mediaManager.GetLocalDrives(shares); g_mediaManager.GetNetworkLocations(shares); std::string path; if (CGUIDialogFileBrowser::ShowAndGetFile(shares, "*.zip", g_localizeStrings.Get(24041), path)) - CAddonInstaller::GetInstance().InstallFromZip(path); + CAddonInstaller::Get().InstallFromZip(path); return true; } if (item->GetPath() == "addons://update_all/") { + // fire off a threaded update of all addons UpdateAddons updater; - return CGUIDialogBusy::Wait(&updater); + if (CGUIDialogBusy::Wait(&updater)) + return Update("addons://downloading/"); + return true; } if (!item->m_bIsFolder) { // cancel a downloading job if (item->HasProperty("Addon.Downloading")) { - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{24000}, item->GetProperty("Addon.Name"), CVariant{24066}, CVariant{""})) + if (CGUIDialogYesNo::ShowAndGetInput(24000, item->GetProperty("Addon.Name").asString(), 24066, "")) { - if (CAddonInstaller::GetInstance().Cancel(item->GetProperty("Addon.ID").asString())) + if (CAddonInstaller::Get().Cancel(item->GetProperty("Addon.ID").asString())) Refresh(); } return true; @@ -274,7 +272,7 @@ const CGUIControl *control = GetControl(CONTROL_AUTOUPDATE); if (control && control->GetControlType() == CGUIControl::GUICONTROL_BUTTON) { // set label - CSettingInt *setting = (CSettingInt *)CSettings::GetInstance().GetSetting(CSettings::SETTING_GENERAL_ADDONUPDATES); + CSettingInt *setting = (CSettingInt *)CSettings::Get().GetSetting("general.addonupdates"); if (setting) { const StaticIntegerSettingOptions& options = setting->GetOptions(); @@ -290,11 +288,11 @@ } else { // old skin with toggle button - set on if auto updates are on - SET_CONTROL_SELECTED(GetID(),CONTROL_AUTOUPDATE, CSettings::GetInstance().GetInt(CSettings::SETTING_GENERAL_ADDONUPDATES) == AUTO_UPDATES_ON); + SET_CONTROL_SELECTED(GetID(),CONTROL_AUTOUPDATE, CSettings::Get().GetInt("general.addonupdates") == AUTO_UPDATES_ON); } - SET_CONTROL_SELECTED(GetID(),CONTROL_SHUTUP, CSettings::GetInstance().GetBool(CSettings::SETTING_GENERAL_ADDONNOTIFICATIONS)); - SET_CONTROL_SELECTED(GetID(),CONTROL_FOREIGNFILTER, CSettings::GetInstance().GetBool(CSettings::SETTING_GENERAL_ADDONFOREIGNFILTER)); - SET_CONTROL_SELECTED(GetID(),CONTROL_BROKENFILTER, CSettings::GetInstance().GetBool(CSettings::SETTING_GENERAL_ADDONBROKENFILTER)); + SET_CONTROL_SELECTED(GetID(),CONTROL_SHUTUP, CSettings::Get().GetBool("general.addonnotifications")); + SET_CONTROL_SELECTED(GetID(),CONTROL_FOREIGNFILTER, CSettings::Get().GetBool("general.addonforeignfilter")); + SET_CONTROL_SELECTED(GetID(),CONTROL_BROKENFILTER, CSettings::Get().GetBool("general.addonbrokenfilter")); CONTROL_ENABLE(CONTROL_CHECK_FOR_UPDATES); bool allowFilter = CAddonsDirectory::IsRepoDirectory(CURL(m_vecItems->GetPath())); @@ -323,13 +321,14 @@ return true; } -bool CGUIWindowAddonBrowser::GetDirectory(const std::string& strDirectory, CFileItemList& items) +bool CGUIWindowAddonBrowser::GetDirectory(const std::string& strDirectory, + CFileItemList& items) { bool result; if (URIUtils::PathEquals(strDirectory, "addons://downloading/")) { VECADDONS addons; - CAddonInstaller::GetInstance().GetInstallList(addons); + CAddonInstaller::Get().GetInstallList(addons); CURL url(strDirectory); CAddonsDirectory::GenerateAddonListing(url, addons, items, g_localizeStrings.Get(24067)); @@ -350,11 +349,11 @@ { result = CGUIMediaWindow::GetDirectory(strDirectory, items); - if (result && CAddonsDirectory::IsRepoDirectory(CURL(strDirectory))) + if (CAddonsDirectory::IsRepoDirectory(CURL(strDirectory))) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_GENERAL_ADDONFOREIGNFILTER)) + if (CSettings::Get().GetBool("general.addonforeignfilter")) { - int i = 0; + int i=0; while (i < items.Size()) { auto prop = items[i]->GetProperty("Addon.Language"); @@ -364,15 +363,14 @@ ++i; } } - if (CSettings::GetInstance().GetBool(CSettings::SETTING_GENERAL_ADDONBROKENFILTER)) + if (CSettings::Get().GetBool("general.addonbrokenfilter")) { for (int i = items.Size() - 1; i >= 0; i--) { if (!items[i]->GetProperty("Addon.Broken").empty()) - { - //check if it's installed + { //check if it's installed AddonPtr addon; - if (!CAddonMgr::GetInstance().GetAddon(items[i]->GetProperty("Addon.ID").asString(), addon)) + if (!CAddonMgr::Get().GetAddon(items[i]->GetProperty("Addon.ID").asString(), addon)) items.Remove(i); } } @@ -380,16 +378,18 @@ } } - if (strDirectory.empty() && CAddonInstaller::GetInstance().IsDownloading()) + if (strDirectory.empty() && CAddonInstaller::Get().IsDownloading()) { - CFileItemPtr item(new CFileItem("addons://downloading/", true)); + CFileItemPtr item(new CFileItem("addons://downloading/",true)); item->SetLabel(g_localizeStrings.Get(24067)); item->SetLabelPreformated(true); item->SetIconImage("DefaultNetwork.png"); items.Add(item); } - for (int i = 0; i < items.Size(); ++i) + items.SetContent("addons"); + + for (int i=0;im_bIsFolder) return; unsigned int percent; - if (CAddonInstaller::GetInstance().GetProgress(item->GetProperty("Addon.ID").asString(), percent)) + if (CAddonInstaller::Get().GetProgress(item->GetProperty("Addon.ID").asString(), percent)) { std::string progress = StringUtils::Format(g_localizeStrings.Get(24042).c_str(), percent); item->SetProperty("Addon.Status", progress); @@ -427,21 +427,21 @@ int CGUIWindowAddonBrowser::SelectAddonID(TYPE type, std::string &addonID, bool showNone /* = false */, bool showDetails /* = true */, bool showInstalled /* = true */, bool showInstallable /*= false */, bool showMore /* = true */) { - std::vector types; + vector types; types.push_back(type); return SelectAddonID(types, addonID, showNone, showDetails, showInstalled, showInstallable, showMore); } -int CGUIWindowAddonBrowser::SelectAddonID(ADDON::TYPE type, std::vector &addonIDs, bool showNone /* = false */, bool showDetails /* = true */, bool multipleSelection /* = true */, bool showInstalled /* = true */, bool showInstallable /* = false */, bool showMore /* = true */) +int CGUIWindowAddonBrowser::SelectAddonID(ADDON::TYPE type, vector &addonIDs, bool showNone /* = false */, bool showDetails /* = true */, bool multipleSelection /* = true */, bool showInstalled /* = true */, bool showInstallable /* = false */, bool showMore /* = true */) { - std::vector types; + vector types; types.push_back(type); return SelectAddonID(types, addonIDs, showNone, showDetails, multipleSelection, showInstalled, showInstallable, showMore); } -int CGUIWindowAddonBrowser::SelectAddonID(const std::vector &types, std::string &addonID, bool showNone /* = false */, bool showDetails /* = true */, bool showInstalled /* = true */, bool showInstallable /* = false */, bool showMore /* = true */) +int CGUIWindowAddonBrowser::SelectAddonID(const vector &types, std::string &addonID, bool showNone /* = false */, bool showDetails /* = true */, bool showInstalled /* = true */, bool showInstallable /* = false */, bool showMore /* = true */) { - std::vector addonIDs; + vector addonIDs; if (!addonID.empty()) addonIDs.push_back(addonID); int retval = SelectAddonID(types, addonIDs, showNone, showDetails, false, showInstalled, showInstallable, showMore); @@ -452,7 +452,7 @@ return retval; } -int CGUIWindowAddonBrowser::SelectAddonID(const std::vector &types, std::vector &addonIDs, bool showNone /* = false */, bool showDetails /* = true */, bool multipleSelection /* = true */, bool showInstalled /* = true */, bool showInstallable /* = false */, bool showMore /* = true */) +int CGUIWindowAddonBrowser::SelectAddonID(const vector &types, vector &addonIDs, bool showNone /* = false */, bool showDetails /* = true */, bool multipleSelection /* = true */, bool showInstalled /* = true */, bool showInstallable /* = false */, bool showMore /* = true */) { // if we shouldn't show neither installed nor installable addons the list will be empty if (!showInstalled && !showInstallable) @@ -467,7 +467,7 @@ return 0; // get rid of any invalid addon types - std::vector validTypes(types.size()); + vector validTypes(types.size()); std::copy_if(types.begin(), types.end(), validTypes.begin(), [](ADDON::TYPE type) { return type != ADDON_UNKNOWN; }); if (validTypes.empty()) @@ -477,7 +477,7 @@ VECADDONS addons; if (showInstalled) { - for (std::vector::const_iterator type = validTypes.begin(); type != validTypes.end(); ++type) + for (vector::const_iterator type = validTypes.begin(); type != validTypes.end(); ++type) { VECADDONS typeAddons; if (*type == ADDON_AUDIO) @@ -489,7 +489,7 @@ else if (*type == ADDON_VIDEO) CAddonsDirectory::GetScriptsAndPlugins("video", typeAddons); else - CAddonMgr::GetInstance().GetAddons(*type, typeAddons); + CAddonMgr::Get().GetAddons(*type, typeAddons); addons.insert(addons.end(), typeAddons.begin(), typeAddons.end()); } @@ -507,7 +507,7 @@ // check if the addon matches one of the provided addon types bool matchesType = false; - for (std::vector::const_iterator type = validTypes.begin(); type != validTypes.end(); ++type) + for (vector::const_iterator type = validTypes.begin(); type != validTypes.end(); ++type) { if (pAddon->IsType(*type)) { @@ -517,13 +517,13 @@ } // only show addons that match one of the provided addon types and that aren't disabled - if (matchesType && !CAddonMgr::GetInstance().IsAddonDisabled(pAddon->ID())) + if (matchesType && !CAddonMgr::Get().IsAddonDisabled(pAddon->ID())) { // check if the addon is installed - bool isInstalled = CAddonMgr::GetInstance().IsAddonInstalled(pAddon->ID()); + bool isInstalled = CAddonMgr::Get().IsAddonInstalled(pAddon->ID()); // check if the addon is installed or can be installed - if ((showInstallable || showMore) && !isInstalled && CAddonMgr::GetInstance().CanAddonBeInstalled(pAddon)) + if ((showInstallable || showMore) && !isInstalled && CAddonMgr::Get().CanAddonBeInstalled(pAddon)) { ++addon; continue; @@ -560,14 +560,14 @@ return 0; std::string heading; - for (std::vector::const_iterator type = validTypes.begin(); type != validTypes.end(); ++type) + for (vector::const_iterator type = validTypes.begin(); type != validTypes.end(); ++type) { if (!heading.empty()) heading += ", "; heading += TranslateType(*type, true); } - dialog->SetHeading(CVariant{std::move(heading)}); + dialog->SetHeading(heading); dialog->Reset(); dialog->SetUseDetails(showDetails); @@ -593,16 +593,16 @@ if (addonIDs.size() > 0) { - for (std::vector::const_iterator it = addonIDs.begin(); it != addonIDs.end() ; ++it) + for (vector::const_iterator it = addonIDs.begin(); it != addonIDs.end() ; ++it) { CFileItemPtr item = items.Get(*it); if (item) item->Select(true); } } - dialog->SetItems(items); + dialog->SetItems(&items); dialog->SetMultiSelection(multipleSelection); - dialog->Open(); + dialog->DoModal(); // if the "Get More" button has been pressed and we haven't shown the // installable addons so far show a list of installable addons @@ -613,9 +613,10 @@ return 0; addonIDs.clear(); - for (int i : dialog->GetSelectedItems()) + const CFileItemList& list = dialog->GetSelectedItems(); + for (int i = 0; i < list.Size(); i++) { - const CFileItemPtr& item = items.Get(i); + const CFileItemPtr& item = list.Get(i); // check if one of the selected addons needs to be installed if (showInstallable) @@ -626,16 +627,16 @@ const AddonPtr& addon = itAddon->second; // if the addon isn't installed we need to install it - if (!CAddonMgr::GetInstance().IsAddonInstalled(addon->ID())) + if (!CAddonMgr::Get().IsAddonInstalled(addon->ID())) { AddonPtr installedAddon; - if (!CAddonInstaller::GetInstance().InstallModal(addon->ID(), installedAddon, false)) + if (!CAddonInstaller::Get().InstallModal(addon->ID(), installedAddon, false)) continue; } // if the addon is disabled we need to enable it - if (CAddonMgr::GetInstance().IsAddonDisabled(addon->ID())) - CAddonMgr::GetInstance().EnableAddon(addon->ID()); + if (CAddonMgr::Get().IsAddonDisabled(addon->ID())) + CAddonMgr::Get().EnableAddon(addon->ID()); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/IAddon.h kodi-15.2~git20151019.1039-final/xbmc/addons/IAddon.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/IAddon.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/IAddon.h 2015-10-19 08:39:16.000000000 +0000 @@ -18,14 +18,12 @@ * . * */ - -#include +#include #include -#include #include #include -#include +#include class TiXmlElement; @@ -37,7 +35,6 @@ ADDON_VIZ, ADDON_SKIN, ADDON_PVRDLL, - ADDON_ADSPDLL, ADDON_SCRIPT, ADDON_SCRIPT_WEATHER, ADDON_SUBTITLE_MODULE, @@ -55,7 +52,6 @@ ADDON_AUDIOENCODER, ADDON_CONTEXT_ITEM, ADDON_AUDIODECODER, - ADDON_RESOURCE_IMAGES, ADDON_RESOURCE_LANGUAGE, ADDON_RESOURCE_UISOUNDS, ADDON_VIDEO, // virtual addon types @@ -90,7 +86,6 @@ virtual ~IAddon() {}; virtual AddonPtr Clone() const =0; virtual TYPE Type() const =0; - virtual TYPE FullType() const =0; virtual bool IsType(TYPE type) const =0; virtual AddonProps Props() const =0; virtual AddonProps& Props() =0; @@ -129,7 +124,7 @@ virtual void OnPostInstall(bool update, bool modal) =0; virtual void OnPreUnInstall() =0; virtual void OnPostUnInstall() =0; - virtual bool CanInstall() =0; + virtual bool CanInstall(const std::string& referer) =0; protected: virtual bool LoadSettings(bool bForce = false) =0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/ImageResource.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/ImageResource.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/ImageResource.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/ImageResource.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -/* -* Copyright (C) 2005-2013 Team XBMC -* http://xbmc.org -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ -#include "ImageResource.h" -#include "URL.h" -#include "addons/AddonManager.h" -#include "filesystem/File.h" -#include "filesystem/XbtManager.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" - -namespace ADDON -{ - -CImageResource::CImageResource(const cp_extension_t *ext) - : CResource(ext) -{ - if (ext != nullptr) - m_type = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@type"); -} - -CImageResource::CImageResource(const CImageResource &rhs) - : CResource(rhs) -{ } - -AddonPtr CImageResource::Clone() const -{ - return AddonPtr(new CImageResource(*this)); -} - -void CImageResource::OnPreUnInstall() -{ - CURL xbtUrl; - if (!HasXbt(xbtUrl)) - return; - - // if there's an XBT we need to remove it from the XBT manager - XFILE::CXbtManager::GetInstance().Release(xbtUrl); -} - -bool CImageResource::IsAllowed(const std::string &file) const -{ - // check if the file path points to a directory - if (URIUtils::HasSlashAtEnd(file, true)) - return true; - - std::string ext = URIUtils::GetExtension(file); - return file.empty() || - StringUtils::EqualsNoCase(ext, ".png") || - StringUtils::EqualsNoCase(ext, ".jpg"); -} - -std::string CImageResource::GetFullPath(const std::string &filePath) const -{ - // check if there's an XBT file which might contain the file. if not just return the usual full path - CURL xbtUrl; - if (!HasXbt(xbtUrl)) - return CResource::GetFullPath(filePath); - - // append the file path to the xbt:// URL - return URIUtils::AddFileToFolder(xbtUrl.Get(), filePath); -} - -bool CImageResource::HasXbt(CURL& xbtUrl) const -{ - std::string resourcePath = GetResourcePath(); - std::string xbtPath = URIUtils::AddFileToFolder(resourcePath, "Textures.xbt"); - if (!XFILE::CFile::Exists(xbtPath)) - return false; - - // translate it into a xbt:// URL - xbtUrl = URIUtils::CreateArchivePath("xbt", CURL(xbtPath)); - - return true; -} - -} /* namespace ADDON */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/ImageResource.h kodi-15.2~git20151019.1039-final/xbmc/addons/ImageResource.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/ImageResource.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/ImageResource.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -#pragma once -/* - * Copyright (C) 2014 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include - -#include "addons/Resource.h" - -class CURL; - -namespace ADDON -{ - -//! \brief A collection of images. The collection can have a type. -class CImageResource : public CResource -{ -public: - CImageResource(const AddonProps &props) - : CResource(props) - { } - CImageResource(const cp_extension_t *ext); - virtual ~CImageResource() { } - - virtual AddonPtr Clone() const; - virtual void OnPreUnInstall(); - - virtual bool IsAllowed(const std::string &file) const; - virtual std::string GetFullPath(const std::string &filePath) const; - - //! \brief Returns type of image collection - const std::string& GetType() const { return m_type; } - -private: - CImageResource(const CImageResource &rhs); - - bool HasXbt(CURL& xbtUrl) const; - - std::string m_type; //!< Type of images -}; - -} /* namespace ADDON */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/include/kodi_adsp_dll.h kodi-15.2~git20151019.1039-final/xbmc/addons/include/kodi_adsp_dll.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/include/kodi_adsp_dll.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/include/kodi_adsp_dll.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,566 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#ifndef __KODI_AUDIODSP_H__ -#define __KODI_AUDIODSP_H__ - -/*! - * @file kodi_adsp_dll.h - * @section sec1 Basic audio dsp addon interface description - * @author Team KODI - * @date 10. May 2014 - * @version 0.1.5 - * - * @subsection sec1_1 General - * @li The basic support on the addon is supplied with the - * AE_DSP_ADDON_CAPABILITIES data which becomes asked over - * GetAddonCapabilities(...), further the addon must register his available - * modes on startup with the RegisterMode(...) callback function (see - * libKODI_adsp.h). If one of this two points is not set the addon becomes - * ignored for the chain step. - * - * @subsection sec1_2 Processing - * @li On start of new stream the addon becomes called with StreamCreate(...) - * to check about given values that it support it basically and can create - * his structure, if nothing is supported it can return AE_DSP_ERROR_IGNORE_ME. - * - * @li As next step StreamIsModeSupported(...) becomes called for every - * available and enabled modes, is separated due to more as one available mode - * on the addon is possible, if the mode is not supported it can also be return - * AE_DSP_ERROR_IGNORE_ME. - * - If mode is a resample mode and returns no error it becomes asked with - * InputResampleSampleRate(...) or OutputResampleSampleRate(...) (relevant - * to his type) about his given sample rate. - * - About the from user selected master processing mode the related addon - * becomes called now with MasterProcessSetMode(...) to handle it's - * selectionon the addon given by the own addon type identifier or by - * KODI's useddatabase id, also the currently used stream type (e.g. - * Music or Video) is send. - * - If the addon supports only one master mode it can ignore this function - * and return always AE_DSP_ERROR_NO_ERROR. - * - If the master mode is set the addon becomes asked about the from him - * given output channel layout related to up- or downmix modes, if - * nothing becomes changed on the layout it can return -1. - * - The MasterProcessSetMode(...) is also called if from user a another - * mode becomes selected. - * - * @li Then as last step shortly before the first process call becomes executed - * the addon is called one time with StreamInitialize(...) to inform that - * processing is started on the given settings. - * - This function becomes also called on all add-ons if the master process - * becomes changed. - * - Also every process after StreamInitialize on the addon mode becomes asked - * with _..._ProcessNeededSamplesize(...) about required memory size for the - * output of his data, if no other size is required it can return 0. - * - * @li From now the processing becomes handled for the different steps with - * _..._Process(...). - * - Further it becomes asked with _..._GetDelay(...) about his processing - * time as float value in seconds, needed for video and audio alignment. - * - * @li On the end of the processing if the source becomes stopped the - * StreamDestroy(...) function becomes called on all active processing add-ons. - * - * @note - * The StreamCreate(...) can be becomes called for a new stream before the - * previous was closed with StreamDestroy(...) ! To have a speed improve. - */ - -#include "xbmc_addon_dll.h" -#include "kodi_adsp_types.h" - -/*! - * Functions that the Audio DSP add-on must implement, but some can be empty. - * - * The 'remarks' field indicates which methods should be implemented, and which - * ones are optional. - */ - -extern "C" -{ - /*! @name Audio DSP add-on methods */ - //@{ - /*! - * Get the KODI_AE_DSP_API_VERSION that was used to compile this add-on. - * Used to check if this add-on is compatible with KODI. - * @return The KODI_AE_DSP_API_VERSION that was used to compile this add-on. - * @remarks Valid implementation required. - */ - const char* GetAudioDSPAPIVersion(void); - - /*! - * Get the KODI_AE_DSP_MIN_API_VERSION that was used to compile this add-on. - * Used to check if this add-on is compatible with KODI. - * @return The KODI_AE_DSP_MIN_API_VERSION that was used to compile this add-on. - * @remarks Valid implementation required. - */ - const char* GetMinimumAudioDSPAPIVersion(void); - - /*! - * @brief Get the KODI_GUI_API_VERSION that was used to compile this add-on. - * Used to check if this add-on is compatible with KODI. - * @return The KODI_GUI_API_VERSION that was used to compile this add-on. - * @remarks Valid implementation required. - */ - const char* GetGUIAPIVersion(void); - - /*! - * @brief Get the KODI_GUI_MIN_API_VERSION that was used to compile this - * add-on. - * Used to check if this add-on is compatible with KODI. - * @return The KODI_GUI_MIN_API_VERSION that was used to compile this add-on. - * @remarks Valid implementation required. - */ - const char* GetMinimumGUIAPIVersion(void); - - /*! - * @brief Get the list of features that this add-on provides. - * Called by KODI to query the add-ons capabilities. - * Used to check which options should be presented in the DSP, which methods - * to call, etc. - * All capabilities that the add-on supports should be set to true. - * @param pCapabilities The add-ons capabilities. - * @return AE_DSP_ERROR_NO_ERROR if the properties were fetched successfully. - * @remarks Valid implementation required. - */ - AE_DSP_ERROR GetAddonCapabilities(AE_DSP_ADDON_CAPABILITIES *pCapabilities); - - /*! - * @return The name reported by the back end that will be displayed in the - * UI. - * @remarks Valid implementation required. - */ - const char* GetDSPName(void); - - /*! - * @return The version string reported by the back end that will be displayed - * in the UI. - * @remarks Valid implementation required. - */ - const char* GetDSPVersion(void); - - /*! - * @brief Call one of the menu hooks (if supported). - * Supported AE_DSP_MENUHOOK instances have to be added in ADDON_Create(), - * by calling AddMenuHook() on the callback. - * @param menuhook The hook to call. - * @param item The selected item for which the hook was called. - * @return AE_DSP_ERROR_NO_ERROR if the hook was called successfully. - * @remarks Optional. Return AE_DSP_ERROR_NOT_IMPLEMENTED if this add-on - * won't provide this function. - */ - AE_DSP_ERROR CallMenuHook(const AE_DSP_MENUHOOK& menuhook, const AE_DSP_MENUHOOK_DATA &item); - //@} - - /** @name DSP processing control, used to open and close a stream - * @remarks Valid implementation required. - */ - //@{ - /*! - * @brief Set up Audio DSP with selected audio settings (use the basic - * present audio stream data format). - * Used to detect available add-ons for present stream, as example stereo - * surround upmix not needed on 5.1 audio stream. - * @param addonSettings The add-ons audio settings. - * @param pProperties The properties of the currently playing stream. - * @param handle On this becomes addon informated about stream id and can set function addresses which need on calls - * @return AE_DSP_ERROR_NO_ERROR if the properties were fetched successfully - * and data can be performed. AE_DSP_ERROR_IGNORE_ME if format is not - * supported, but without fault. - * @remarks Valid implementation required. - */ - AE_DSP_ERROR StreamCreate(const AE_DSP_SETTINGS *addonSettings, const AE_DSP_STREAM_PROPERTIES* pProperties, ADDON_HANDLE handle); - - /*! - * Remove the selected id from currently used DSP processes - * @param handle identification data for stream - * @return AE_DSP_ERROR_NO_ERROR if the becomes found and removed - * @remarks Valid implementation required. - */ - AE_DSP_ERROR StreamDestroy(const ADDON_HANDLE handle); - - /*! - * @brief Ask the add-on about a requested processing mode that it is - * supported on the current stream. Is called about every add-on mode after - * successed StreamCreate. - * @param handle identification data for stream - * @param type The processing mode type, see AE_DSP_MODE_TYPE for definitions - * @param mode_id The mode inside add-on which must be performed on call. Id - * is set from add-on by iModeNumber on AE_DSP_MODE structure during - * RegisterMode callback, - * @param unique_db_mode_id The Mode unique id generated from dsp database. - * @return AE_DSP_ERROR_NO_ERROR if the properties were fetched successfully - * or if the stream is not supported the add-on must return - * AE_DSP_ERROR_IGNORE_ME. - * @remarks Valid implementation required. - */ - AE_DSP_ERROR StreamIsModeSupported(const ADDON_HANDLE handle, AE_DSP_MODE_TYPE type, unsigned int mode_id, int unique_db_mode_id); - - /*! - * @brief Set up Audio DSP with selected audio settings (detected on data of - * first present audio packet) - * @param addonSettings The add-ons audio settings. - * @return AE_DSP_ERROR_NO_ERROR if the properties were fetched successfully. - * @remarks Valid implementation required. - */ - AE_DSP_ERROR StreamInitialize(const ADDON_HANDLE handle, const AE_DSP_SETTINGS *addonSettings); - //@} - - /** @name DSP input processing - * @remarks Only used by KODI if bSupportsInputProcess is set to true. - */ - //@{ - /*! - * @brief DSP input processing - * Can be used to have unchanged stream.. - * All DSP add-ons allowed to-do this. - * @param handle identification data for stream - * @param array_in Pointer to data memory - * @param samples Amount of samples inside array_in - * @return true if work was OK - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - bool InputProcess(const ADDON_HANDLE handle, const float **array_in, unsigned int samples); - //@} - - /** @name DSP pre-resampling - * @remarks Only used by KODI if bSupportsInputResample is set to true. - */ - //@{ - /*! - * @brief If the add-on operate with buffered arrays and the output size can - * be higher as the input it becomes asked about needed size before any - * InputResampleProcess call. - * @param handle identification data for stream - * @return The needed size of output array or 0 if no changes within it - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - unsigned int InputResampleProcessNeededSamplesize(const ADDON_HANDLE handle); - - /*! - * @brief DSP re sample processing before master. - * Here a high quality resample can be performed. - * Only one DSP add-on is allowed to-do this! - * @param handle identification data for stream - * @param array_in Pointer to input data memory - * @param array_out Pointer to output data memory - * @param samples Amount of samples inside array_in - * @return Amount of samples processed - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - unsigned int InputResampleProcess(const ADDON_HANDLE handle, float **array_in, float **array_out, unsigned int samples); - - /*! - * @brief Returns the re-sampling generated new sample rate used before the - * master process - * @param handle identification data for stream - * @return The new sample rate - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - int InputResampleSampleRate(const ADDON_HANDLE handle); - - /*! - * @brief Returns the time in seconds that it will take - * for the next added packet to be returned to KODI. - * @param handle identification data for stream - * @return the delay in seconds - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - float InputResampleGetDelay(const ADDON_HANDLE handle); - //@} - - /** @name DSP Pre processing - * @remarks Only used by KODI if bSupportsPreProcess is set to true. - */ - //@{ - /*! - * @brief If the addon operate with buffered arrays and the output size can - * be higher as the input it becomes asked about needed size before any - * PreProcess call. - * @param handle identification data for stream - * @param mode_id The mode inside add-on which must be performed on call. Id - * is set from add-on by iModeNumber on AE_DSP_MODE structure during - * RegisterMode callback and can be defined from add-on as a structure - * pointer or anything else what is needed to find it. - * @return The needed size of output array or 0 if no changes within it - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - unsigned int PreProcessNeededSamplesize(const ADDON_HANDLE handle, unsigned int mode_id); - - /*! - * @brief Returns the time in seconds that it will take - * for the next added packet to be returned to KODI. - * @param handle identification data for stream - * @param mode_id The mode inside add-on which must be performed on call. Id - * is set from add-on by iModeNumber on AE_DSP_MODE structure during - * RegisterMode callback and can be defined from add-on as a structure - * pointer or anything else what is needed to find it. - * @return the delay in seconds - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - float PreProcessGetDelay(const ADDON_HANDLE handle, unsigned int mode_id); - - /*! - * @brief DSP preprocessing - * All DSP add-ons allowed to-do this. - * @param handle identification data for stream - * @param mode_id The mode inside add-on which must be performed on call. Id - * is set from add-on by iModeNumber on AE_DSP_MODE structure during - * RegisterMode callback and can be defined from add-on as a structure - * pointer or anything else what is needed to find it. - * @param array_in Pointer to input data memory - * @param array_out Pointer to output data memory - * @param samples Amount of samples inside array_in - * @return Amount of samples processed - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - unsigned int PreProcess(const ADDON_HANDLE handle, unsigned int mode_id, float **array_in, float **array_out, unsigned int samples); - //@} - - /** @name DSP Master processing - * @remarks Only used by KODI if bSupportsMasterProcess is set to true. - */ - //@{ - /*! - * @brief Set the active master process mode - * @param handle identification data for stream - * @param type Requested stream type for the selected master mode - * @param mode_id The Mode identifier. - * @param unique_db_mode_id The Mode unique id generated from DSP database. - * @return AE_DSP_ERROR_NO_ERROR if the setup was successful - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - AE_DSP_ERROR MasterProcessSetMode(const ADDON_HANDLE handle, AE_DSP_STREAMTYPE type, unsigned int mode_id, int unique_db_mode_id); - - /*! - * @brief If the add-on operate with buffered arrays and the output size can - * be higher as the input it becomes asked about needed size before any - * MasterProcess call. - * @param handle identification data for stream - * @return The needed size of output array or 0 if no changes within it - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - unsigned int MasterProcessNeededSamplesize(const ADDON_HANDLE handle); - - /*! - * @brief Returns the time in seconds that it will take - * for the next added packet to be returned to KODI. - * @param handle identification data for stream - * @return the delay in seconds - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - float MasterProcessGetDelay(const ADDON_HANDLE handle); - - /*! - * @brief Returns the from selected master mode performed channel alignment - * @param handle identification data for stream - * @retval out_channel_present_flags the exact channel present flags after - * performed up-/downmix - * @return the amount channels - * @remarks Optional. Must be used and set if a channel up- or downmix is - * processed from the active master mode - */ - int MasterProcessGetOutChannels(const ADDON_HANDLE handle, unsigned long &out_channel_present_flags); - - /*! - * @brief Master processing becomes performed with it - * Here a channel up-mix/down-mix for stereo surround sound can be performed - * Only one DSP add-on is allowed to-do this! - * @param handle identification data for stream - * @param array_in Pointer to input data memory - * @param array_out Pointer to output data memory - * @param samples Amount of samples inside array_in - * @return Amount of samples processed - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - unsigned int MasterProcess(const ADDON_HANDLE handle, float **array_in, float **array_out, unsigned int samples); - - /*! - * Used to get a information string about the processed work to show on skin - * @return A string to show - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - const char *MasterProcessGetStreamInfoString(const ADDON_HANDLE handle); - //@} - - /** @name DSP Post processing - * @remarks Only used by KODI if bSupportsPostProcess is set to true. - */ - //@{ - /*! - * If the add-on operate with buffered arrays and the output size can be - * higher as the input it becomes asked about needed size before any - * PostProcess call. - * @param handle identification data for stream - * @param mode_id The mode inside add-on which must be performed on call. Id - * is set from add-on by iModeNumber on AE_DSP_MODE structure during - * RegisterMode callback, and can be defined from add-on as a structure - * pointer or anything else what is needed to find it. - * @return The needed size of output array or 0 if no changes within it - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - unsigned int PostProcessNeededSamplesize(const ADDON_HANDLE handle, unsigned int mode_id); - - /*! - * Returns the time in seconds that it will take - * for the next added packet to be returned to KODI. - * @param handle identification data for stream - * @param mode_id The mode inside add-on which must be performed on call. Id - * is set from add-on by iModeNumber on AE_DSP_MODE structure during - * RegisterMode callback, and can be defined from add-on as a structure - * pointer or anything else what is needed to find it. - * @return the delay in seconds - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - float PostProcessGetDelay(const ADDON_HANDLE handle, unsigned int mode_id); - - /*! - * @brief DSP post processing - * On the post processing can be things performed with additional channel - * upmix like 6.1 to 7.1 - * or frequency/volume corrections, speaker distance handling, equalizer... . - * All DSP add-ons allowed to-do this. - * @param handle identification data for stream - * @param mode_id The mode inside add-on which must be performed on call. Id - * is set from add-on by iModeNumber on AE_DSP_MODE structure during - * RegisterMode callback, and can be defined from add-on as a structure - * pointer or anything else what is needed to find it. - * @param array_in Pointer to input data memory - * @param array_out Pointer to output data memory - * @param samples Amount of samples inside array_in - * @return Amount of samples processed - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - unsigned int PostProcess(const ADDON_HANDLE handle, unsigned int mode_id, float **array_in, float **array_out, unsigned int samples); - //@} - - /** @name DSP Post re-sampling - * @remarks Only used by KODI if bSupportsOutputResample is set to true. - */ - //@{ - /*! - * @brief If the add-on operate with buffered arrays and the output size - * can be higher as the input - * it becomes asked about needed size before any OutputResampleProcess call. - * @param handle identification data for stream - * @return The needed size of output array or 0 if no changes within it - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - unsigned int OutputResampleProcessNeededSamplesize(const ADDON_HANDLE handle); - - /*! - * @brief Re-sampling after master processing becomes performed with it if - * needed, only - * one add-on can perform it. - * @param handle identification data for stream - * @param array_in Pointer to input data memory - * @param array_out Pointer to output data memory - * @param samples Amount of samples inside array_in - * @return Amount of samples processed - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - unsigned int OutputResampleProcess(const ADDON_HANDLE handle, float **array_in, float **array_out, unsigned int samples); - - /*! - * @brief Returns the re-sampling generated new sample rate used after the - * master process. - * @param handle identification data for stream - * @return The new sample rate - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - int OutputResampleSampleRate(const ADDON_HANDLE handle); - - /*! - * @brief Returns the time in seconds that it will take for the next added - * packet to be returned to KODI. - * @param handle identification data for stream - * @return the delay in seconds - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with - * GetAddonCapabilities - */ - float OutputResampleGetDelay(const ADDON_HANDLE handle); - //@} - - // function to export the above structure to KODI - void __declspec(dllexport) get_addon(struct AudioDSP* pDSP) - { - pDSP->GetAudioDSPAPIVersion = GetAudioDSPAPIVersion; - pDSP->GetMinimumAudioDSPAPIVersion = GetMinimumAudioDSPAPIVersion; - pDSP->GetGUIAPIVersion = GetGUIAPIVersion; - pDSP->GetMinimumGUIAPIVersion = GetMinimumGUIAPIVersion; - pDSP->GetAddonCapabilities = GetAddonCapabilities; - pDSP->GetDSPName = GetDSPName; - pDSP->GetDSPVersion = GetDSPVersion; - pDSP->MenuHook = CallMenuHook; - - pDSP->StreamCreate = StreamCreate; - pDSP->StreamDestroy = StreamDestroy; - pDSP->StreamIsModeSupported = StreamIsModeSupported; - pDSP->StreamInitialize = StreamInitialize; - - pDSP->InputProcess = InputProcess; - - pDSP->InputResampleProcessNeededSamplesize = InputResampleProcessNeededSamplesize; - pDSP->InputResampleProcess = InputResampleProcess; - pDSP->InputResampleGetDelay = InputResampleGetDelay; - pDSP->InputResampleSampleRate = InputResampleSampleRate; - - pDSP->PreProcessNeededSamplesize = PreProcessNeededSamplesize; - pDSP->PreProcessGetDelay = PreProcessGetDelay; - pDSP->PreProcess = PreProcess; - - pDSP->MasterProcessSetMode = MasterProcessSetMode; - pDSP->MasterProcessNeededSamplesize = MasterProcessNeededSamplesize; - pDSP->MasterProcessGetDelay = MasterProcessGetDelay; - pDSP->MasterProcessGetOutChannels = MasterProcessGetOutChannels; - pDSP->MasterProcess = MasterProcess; - pDSP->MasterProcessGetStreamInfoString = MasterProcessGetStreamInfoString; - - pDSP->PostProcessNeededSamplesize = PostProcessNeededSamplesize; - pDSP->PostProcessGetDelay = PostProcessGetDelay; - pDSP->PostProcess = PostProcess; - - pDSP->OutputResampleProcessNeededSamplesize = OutputResampleProcessNeededSamplesize; - pDSP->OutputResampleProcess = OutputResampleProcess; - pDSP->OutputResampleSampleRate = OutputResampleSampleRate; - pDSP->OutputResampleGetDelay = OutputResampleGetDelay; - }; -}; - -#endif // __KODI_AUDIODSP_H__ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/include/kodi_adsp_types.h kodi-15.2~git20151019.1039-final/xbmc/addons/include/kodi_adsp_types.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/include/kodi_adsp_types.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/include/kodi_adsp_types.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,526 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -/*! - * Common data structures shared between KODI and KODI's audio DSP add-ons - */ - -#ifndef __AUDIODSP_TYPES_H__ -#define __AUDIODSP_TYPES_H__ - -#ifdef TARGET_WINDOWS -#include -#else -#ifndef __cdecl -#define __cdecl -#endif -#ifndef __declspec -#define __declspec(X) -#endif -#endif - -#include - -#include "xbmc_addon_types.h" -#include "xbmc_codec_types.h" - -#undef ATTRIBUTE_PACKED -#undef PRAGMA_PACK_BEGIN -#undef PRAGMA_PACK_END - -#if defined(__GNUC__) -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) -#define ATTRIBUTE_PACKED __attribute__ ((packed)) -#define PRAGMA_PACK 0 -#endif -#endif - -#if !defined(ATTRIBUTE_PACKED) -#define ATTRIBUTE_PACKED -#define PRAGMA_PACK 1 -#endif - -#define AE_DSP_ADDON_STRING_LENGTH 1024 - -#define AE_DSP_STREAM_MAX_STREAMS 8 -#define AE_DSP_STREAM_MAX_MODES 32 - -/* current Audio DSP API version */ -#define KODI_AE_DSP_API_VERSION "0.1.8" - -/* min. Audio DSP API version */ -#define KODI_AE_DSP_MIN_API_VERSION "0.1.8" - -#ifdef __cplusplus -extern "C" { -#endif - - typedef unsigned int AE_DSP_STREAM_ID; - - /*! - * @brief Audio DSP add-on error codes - */ - typedef enum - { - AE_DSP_ERROR_NO_ERROR = 0, /*!< @brief no error occurred */ - AE_DSP_ERROR_UNKNOWN = -1, /*!< @brief an unknown error occurred */ - AE_DSP_ERROR_IGNORE_ME = -2, /*!< @brief the used input stream can not processed and add-on want to ignore */ - AE_DSP_ERROR_NOT_IMPLEMENTED = -3, /*!< @brief the method that KODI called is not implemented by the add-on */ - AE_DSP_ERROR_REJECTED = -4, /*!< @brief the command was rejected by the DSP */ - AE_DSP_ERROR_INVALID_PARAMETERS = -5, /*!< @brief the parameters of the method that was called are invalid for this operation */ - AE_DSP_ERROR_INVALID_SAMPLERATE = -6, /*!< @brief the processed samplerate is not supported */ - AE_DSP_ERROR_INVALID_IN_CHANNELS = -7, /*!< @brief the processed input channel format is not supported */ - AE_DSP_ERROR_INVALID_OUT_CHANNELS = -8, /*!< @brief the processed output channel format is not supported */ - AE_DSP_ERROR_FAILED = -9, /*!< @brief the command failed */ - } AE_DSP_ERROR; - - /*! - * @brief The possible DSP channels (used as pointer inside arrays) - */ - typedef enum - { - AE_DSP_CH_INVALID = -1, - AE_DSP_CH_FL = 0, - AE_DSP_CH_FR, - AE_DSP_CH_FC, - AE_DSP_CH_LFE, - AE_DSP_CH_BL, - AE_DSP_CH_BR, - AE_DSP_CH_FLOC, - AE_DSP_CH_FROC, - AE_DSP_CH_BC, - AE_DSP_CH_SL, - AE_DSP_CH_SR, - AE_DSP_CH_TFL, - AE_DSP_CH_TFR, - AE_DSP_CH_TFC, - AE_DSP_CH_TC, - AE_DSP_CH_TBL, - AE_DSP_CH_TBR, - AE_DSP_CH_TBC, - AE_DSP_CH_BLOC, - AE_DSP_CH_BROC, - - AE_DSP_CH_MAX - } AE_DSP_CHANNEL; - - /*! - * @brief Present channel flags - */ - typedef enum - { - AE_DSP_PRSNT_CH_UNDEFINED = 0, - AE_DSP_PRSNT_CH_FL = 1<<0, - AE_DSP_PRSNT_CH_FR = 1<<1, - AE_DSP_PRSNT_CH_FC = 1<<2, - AE_DSP_PRSNT_CH_LFE = 1<<3, - AE_DSP_PRSNT_CH_BL = 1<<4, - AE_DSP_PRSNT_CH_BR = 1<<5, - AE_DSP_PRSNT_CH_FLOC = 1<<6, - AE_DSP_PRSNT_CH_FROC = 1<<7, - AE_DSP_PRSNT_CH_BC = 1<<8, - AE_DSP_PRSNT_CH_SL = 1<<9, - AE_DSP_PRSNT_CH_SR = 1<<10, - AE_DSP_PRSNT_CH_TFL = 1<<11, - AE_DSP_PRSNT_CH_TFR = 1<<12, - AE_DSP_PRSNT_CH_TFC = 1<<13, - AE_DSP_PRSNT_CH_TC = 1<<14, - AE_DSP_PRSNT_CH_TBL = 1<<15, - AE_DSP_PRSNT_CH_TBR = 1<<16, - AE_DSP_PRSNT_CH_TBC = 1<<17, - AE_DSP_PRSNT_CH_BLOC = 1<<18, - AE_DSP_PRSNT_CH_BROC = 1<<19 - } AE_DSP_CHANNEL_PRESENT; - - /** - * @brief The various stream type formats - * Used for audio DSP processing to know input audio type - */ - typedef enum - { - AE_DSP_ASTREAM_INVALID = -1, - AE_DSP_ASTREAM_BASIC = 0, - AE_DSP_ASTREAM_MUSIC, - AE_DSP_ASTREAM_MOVIE, - AE_DSP_ASTREAM_GAME, - AE_DSP_ASTREAM_APP, - AE_DSP_ASTREAM_PHONE, - AE_DSP_ASTREAM_MESSAGE, - - AE_DSP_ASTREAM_AUTO, - AE_DSP_ASTREAM_MAX - } AE_DSP_STREAMTYPE; - - /*! - * @brief Add-ons supported audio stream type flags - * used on master mode information on AE_DSP_MODES to know - * on which audio stream the master mode is supported - */ - typedef enum - { - AE_DSP_PRSNT_ASTREAM_BASIC = 1<<0, - AE_DSP_PRSNT_ASTREAM_MUSIC = 1<<1, - AE_DSP_PRSNT_ASTREAM_MOVIE = 1<<2, - AE_DSP_PRSNT_ASTREAM_GAME = 1<<3, - AE_DSP_PRSNT_ASTREAM_APP = 1<<4, - AE_DSP_PRSNT_ASTREAM_MESSAGE = 1<<5, - AE_DSP_PRSNT_ASTREAM_PHONE = 1<<6, - } AE_DSP_ASTREAM_PRESENT; - - /** - * @brief The various base type formats - * Used for audio DSP processing to know input audio source - */ - typedef enum - { - AE_DSP_ABASE_INVALID = -1, - AE_DSP_ABASE_STEREO = 0, - AE_DSP_ABASE_MONO, - AE_DSP_ABASE_MULTICHANNEL, - AE_DSP_ABASE_AC3, - AE_DSP_ABASE_EAC3, - AE_DSP_ABASE_DTS, - AE_DSP_ABASE_DTSHD_MA, - AE_DSP_ABASE_DTSHD_HRA, - AE_DSP_ABASE_TRUEHD, - AE_DSP_ABASE_MLP, - AE_DSP_ABASE_FLAC, - - AE_DSP_ABASE_MAX - } AE_DSP_BASETYPE; - - - /** - * @brief The from KODI in settings requested audio process quality. - * The KODI internal used quality levels is translated to this values - * for usage on DSP processing add-ons. Is present on iQualityLevel - * inside AE_DSP_SETTINGS. - */ - typedef enum - { - AE_DSP_QUALITY_UNKNOWN = -1, /*!< @brief Unset, unknown or incorrect quality level */ - AE_DSP_QUALITY_DEFAULT = 0, /*!< @brief Engine's default quality level */ - - /* Basic quality levels */ - AE_DSP_QUALITY_LOW = 20, /*!< @brief Low quality level */ - AE_DSP_QUALITY_MID = 30, /*!< @brief Standard quality level */ - AE_DSP_QUALITY_HIGH = 50, /*!< @brief Best sound processing quality */ - - /* Optional quality levels */ - AE_DSP_QUALITY_REALLYHIGH = 100 /*!< @brief Uncompromising optional quality level, usually with unmeasurable and unnoticeable improvement */ - } AE_DSP_QUALITY; - - /*! - * @brief Audio DSP menu hook categories. - * Used to identify on AE_DSP_MENUHOOK given add-on related skin dialog/windows. - * Except AE_DSP_MENUHOOK_ALL and AE_DSP_MENUHOOK_SETTING are the menus available - * from DSP playback dialogue which can be opened over KODI file context menu and over - * button on full screen OSD window. - * - * Menu hook AE_DSP_MENUHOOK_SETTING is available from DSP processing setup dialogue. - */ - typedef enum - { - AE_DSP_MENUHOOK_UNKNOWN =-1, /*!< @brief unknown menu hook */ - AE_DSP_MENUHOOK_ALL = 0, /*!< @brief all categories */ - AE_DSP_MENUHOOK_PRE_PROCESS = 1, /*!< @brief for pre processing */ - AE_DSP_MENUHOOK_MASTER_PROCESS = 2, /*!< @brief for master processing */ - AE_DSP_MENUHOOK_POST_PROCESS = 3, /*!< @brief for post processing */ - AE_DSP_MENUHOOK_RESAMPLE = 4, /*!< @brief for re sample */ - AE_DSP_MENUHOOK_MISCELLANEOUS = 5, /*!< @brief for miscellaneous dialogues */ - AE_DSP_MENUHOOK_INFORMATION = 6, /*!< @brief dialogue to show processing information */ - AE_DSP_MENUHOOK_SETTING = 7, /*!< @brief for settings */ - } AE_DSP_MENUHOOK_CAT; - - /*! - * @brief Menu hooks that are available in the menus while playing a stream via this add-on. - */ - typedef struct AE_DSP_MENUHOOK - { - unsigned int iHookId; /*!< @brief (required) this hook's identifier */ - unsigned int iLocalizedStringId; /*!< @brief (required) the id of the label for this hook in g_localizeStrings */ - AE_DSP_MENUHOOK_CAT category; /*!< @brief (required) category of menu hook */ - unsigned int iRelevantModeId; /*!< @brief (required) except category AE_DSP_MENUHOOK_SETTING and AE_DSP_MENUHOOK_ALL must be the related mode id present here */ - bool bNeedPlayback; /*!< @brief (required) set to true if menu hook need playback and active processing */ - } ATTRIBUTE_PACKED AE_DSP_MENUHOOK; - - /*! - * @brief Properties passed to the Create() method of an add-on. - */ - typedef struct AE_DSP_PROPERTIES - { - const char* strUserPath; /*!< @brief path to the user profile */ - const char* strAddonPath; /*!< @brief path to this add-on */ - } AE_DSP_PROPERTIES; - - /*! - * @brief Audio DSP add-on capabilities. All capabilities are set to "false" as default. - * If a capability is set to true, then the corresponding methods from kodi_audiodsp_dll.h need to be implemented. - */ - typedef struct AE_DSP_ADDON_CAPABILITIES - { - bool bSupportsInputProcess; /*!< @brief true if this add-on provides audio input processing */ - bool bSupportsInputResample; /*!< @brief true if this add-on provides audio resample before master handling */ - bool bSupportsPreProcess; /*!< @brief true if this add-on provides audio pre processing */ - bool bSupportsMasterProcess; /*!< @brief true if this add-on provides audio master processing */ - bool bSupportsPostProcess; /*!< @brief true if this add-on provides audio post processing */ - bool bSupportsOutputResample; /*!< @brief true if this add-on provides audio re sample after master handling */ - } ATTRIBUTE_PACKED AE_DSP_ADDON_CAPABILITIES; - - /*! - * @brief Audio processing settings for in and out arrays - * Send on creation and before first processed audio packet to add-on - */ - typedef struct AE_DSP_SETTINGS - { - AE_DSP_STREAM_ID iStreamID; /*!< @brief id of the audio stream packets */ - AE_DSP_STREAMTYPE iStreamType; /*!< @brief the input stream type source eg, Movie or Music */ - int iInChannels; /*!< @brief the amount of input channels */ - unsigned long lInChannelPresentFlags; /*!< @brief the exact channel mapping flags of input */ - int iInFrames; /*!< @brief the input frame size from KODI */ - unsigned int iInSamplerate; /*!< @brief the basic sample rate of the audio packet */ - int iProcessFrames; /*!< @brief the processing frame size inside add-on's */ - unsigned int iProcessSamplerate; /*!< @brief the sample rate after input resample present in master processing */ - int iOutChannels; /*!< @brief the amount of output channels */ - unsigned long lOutChannelPresentFlags; /*!< @brief the exact channel mapping flags for output */ - int iOutFrames; /*!< @brief the final out frame size for KODI */ - unsigned int iOutSamplerate; /*!< @brief the final sample rate of the audio packet */ - bool bInputResamplingActive; /*!< @brief if a re-sampling is performed before master processing this flag is set to true */ - bool bStereoUpmix; /*!< @brief true if the stereo upmix setting on kodi is set */ - int iQualityLevel; /*!< @brief the from KODI selected quality level for signal processing */ - /*! - * @note about "iProcessSamplerate" and "iProcessFrames" is set from KODI after call of StreamCreate on input re sample add-on, if re-sampling - * and processing is handled inside the same add-on, this value must be ignored! - */ - } ATTRIBUTE_PACKED AE_DSP_SETTINGS; - - /*! - * @brief Stream profile properties - * Can be used to detect best master processing mode and for post processing methods. - */ -//@{ - - /*! - * @brief Dolby profile types. Given from several formats, e.g. Dolby Digital or TrueHD - * Used on AE_DSP_PROFILE_AC3_EAC3 and AE_DSP_PROFILE_MLP_TRUEHD - */ - #define AE_DSP_PROFILE_DOLBY_NONE 0 - #define AE_DSP_PROFILE_DOLBY_SURROUND 1 - #define AE_DSP_PROFILE_DOLBY_PLII 2 - #define AE_DSP_PROFILE_DOLBY_PLIIX 3 - #define AE_DSP_PROFILE_DOLBY_PLIIZ 4 - #define AE_DSP_PROFILE_DOLBY_EX 5 - #define AE_DSP_PROFILE_DOLBY_HEADPHONE 6 - - /*! - * @brief DTS/DTS HD profile types - * Used on AE_DSP_PROFILE_DTS_DTSHD - */ - #define AE_DSP_PROFILE_DTS 0 - #define AE_DSP_PROFILE_DTS_ES 1 - #define AE_DSP_PROFILE_DTS_96_24 2 - #define AE_DSP_PROFILE_DTS_HD_HRA 3 - #define AE_DSP_PROFILE_DTS_HD_MA 4 - - /*! - * @brief AC3/EAC3 based service types - * Used on AE_DSP_PROFILE_AC3_EAC3 - */ - #define AE_DSP_SERVICE_TYPE_MAIN 0 - #define AE_DSP_SERVICE_TYPE_EFFECTS 1 - #define AE_DSP_SERVICE_TYPE_VISUALLY_IMPAIRED 2 - #define AE_DSP_SERVICE_TYPE_HEARING_IMPAIRED 3 - #define AE_DSP_SERVICE_TYPE_DIALOGUE 4 - #define AE_DSP_SERVICE_TYPE_COMMENTARY 5 - #define AE_DSP_SERVICE_TYPE_EMERGENCY 6 - #define AE_DSP_SERVICE_TYPE_VOICE_OVER 7 - #define AE_DSP_SERVICE_TYPE_KARAOKE 8 - - /*! - * @brief AC3/EAC3 based room types - * Present on AE_DSP_PROFILE_AC3_EAC3 and can be used for frequency corrections - * at post processing, e.g. THX Re-Equalization - */ - #define AE_DSP_ROOM_TYPE_UNDEFINED 0 - #define AE_DSP_ROOM_TYPE_SMALL 1 - #define AE_DSP_ROOM_TYPE_LARGE 2 - - /*! - * @brief AC3/EAC3 stream profile properties - */ - //! @todo add handling for it (currently never becomes set) - typedef struct AE_DSP_PROFILE_AC3_EAC3 - { - unsigned int iProfile; /*!< defined by AE_DSP_PROFILE_DOLBY_* */ - unsigned int iServiceType; /*!< defined by AE_DSP_SERVICE_TYPE_* */ - unsigned int iRoomType; /*!< defined by AE_DSP_ROOM_TYPE_* (NOTICE: Information about it currently not supported from ffmpeg and must be implemented) */ - } ATTRIBUTE_PACKED AE_DSP_PROFILE_AC3_EAC3; - - /*! - * @brief MLP/Dolby TrueHD stream profile properties - */ - //! @todo add handling for it (currently never becomes set) - typedef struct AE_DSP_PROFILE_MLP_TRUEHD - { - unsigned int iProfile; /*!< defined by AE_DSP_PROFILE_DOLBY_* */ - } ATTRIBUTE_PACKED AE_DSP_PROFILE_MLP_TRUEHD; - - /*! - * @brief DTS/DTS HD stream profile properties - */ - //! @todo add handling for it (currently never becomes set) - typedef struct AE_DSP_PROFILE_DTS_DTSHD - { - unsigned int iProfile; /*!< defined by AE_DSP_PROFILE_DTS* */ - bool bSurroundMatrix; /*!< if set to true given 2.0 stream is surround encoded */ - } ATTRIBUTE_PACKED AE_DSP_PROFILE_DTS_DTSHD; - - union AE_DSP_PROFILE - { - AE_DSP_PROFILE_AC3_EAC3 ac3_eac3; /*!< Dolby Digital/Digital+ profile data */ - AE_DSP_PROFILE_MLP_TRUEHD mlp_truehd; /*!< MLP or Dolby TrueHD profile data */ - AE_DSP_PROFILE_DTS_DTSHD dts_dtshd; /*!< DTS/DTS-HD profile data */ - }; - //@} - - /*! - * @brief Audio DSP stream properties - * Used to check for the DSP add-on that the stream is supported, - * as example Dolby Digital Ex processing is only required on Dolby Digital with 5.1 layout - */ - typedef struct AE_DSP_STREAM_PROPERTIES - { - AE_DSP_STREAM_ID iStreamID; /*!< @brief stream id of the audio stream packets */ - AE_DSP_STREAMTYPE iStreamType; /*!< @brief the input stream type source eg, Movie or Music */ - int iBaseType; /*!< @brief the input stream base type source eg, Dolby Digital */ - const char* strName; /*!< @brief the audio stream name */ - const char* strCodecId; /*!< @brief codec id string of the audio stream */ - const char* strLanguage; /*!< @brief language id of the audio stream */ - int iIdentifier; /*!< @brief audio stream id inside player */ - int iChannels; /*!< @brief amount of basic channels */ - int iSampleRate; /*!< @brief sample rate */ - AE_DSP_PROFILE Profile; /*!< @brief current running stream profile data */ - } ATTRIBUTE_PACKED AE_DSP_STREAM_PROPERTIES; - - /*! - * @brief Audio DSP mode categories - */ - typedef enum - { - AE_DSP_MODE_TYPE_UNDEFINED = -1, /*!< @brief undefined type, never be used from add-on! */ - AE_DSP_MODE_TYPE_INPUT_RESAMPLE = 0, /*!< @brief for input re sample */ - AE_DSP_MODE_TYPE_PRE_PROCESS = 1, /*!< @brief for preprocessing */ - AE_DSP_MODE_TYPE_MASTER_PROCESS = 2, /*!< @brief for master processing */ - AE_DSP_MODE_TYPE_POST_PROCESS = 3, /*!< @brief for post processing */ - AE_DSP_MODE_TYPE_OUTPUT_RESAMPLE = 4, /*!< @brief for output re sample */ - AE_DSP_MODE_TYPE_MAX = 5 - } AE_DSP_MODE_TYPE; - - /*! - * @brief Audio DSP master mode information - * Used to get all available modes for current input stream - */ - typedef struct AE_DSP_MODES - { - unsigned int iModesCount; /*!< @brief (required) count of how much modes are in AE_DSP_MODES */ - struct AE_DSP_MODE - { - int iUniqueDBModeId; /*!< @brief (required) the inside add-on used identifier for the mode, set by KODI's audio DSP database */ - AE_DSP_MODE_TYPE iModeType; /*!< @brief (required) the processong mode type, see AE_DSP_MODE_TYPE */ - char strModeName[AE_DSP_ADDON_STRING_LENGTH]; /*!< @brief (required) the addon name of the mode, used on KODI's logs */ - - unsigned int iModeNumber; /*!< @brief (required) number of this mode on the add-on, is used on process functions with value "mode_id" */ - unsigned int iModeSupportTypeFlags; /*!< @brief (required) flags about supported input types for this mode, see AE_DSP_ASTREAM_PRESENT */ - bool bHasSettingsDialog; /*!< @brief (required) if setting dialog(s) are available it must be set to true */ - bool bIsDisabled; /*!< @brief (optional) true if this mode is marked as disabled and not enabled default, only relevant for master processes, all other types always disabled as default */ - - unsigned int iModeName; /*!< @brief (required) the name id of the mode for this hook in g_localizeStrings */ - unsigned int iModeSetupName; /*!< @brief (optional) the name id of the mode inside settings for this hook in g_localizeStrings */ - unsigned int iModeDescription; /*!< @brief (optional) the description id of the mode for this hook in g_localizeStrings */ - unsigned int iModeHelp; /*!< @brief (optional) help string id for inside DSP settings dialog of the mode for this hook in g_localizeStrings */ - - char strOwnModeImage[AE_DSP_ADDON_STRING_LENGTH]; /*!< @brief (optional) flag image for the mode */ - char strOverrideModeImage[AE_DSP_ADDON_STRING_LENGTH]; /*!< @brief (optional) image to override KODI Image for the mode, eg. Dolby Digital with Dolby Digital Ex (only used on master modes) */ - } mode[AE_DSP_STREAM_MAX_MODES]; /*!< @brief Modes array storage */ - } ATTRIBUTE_PACKED AE_DSP_MODES; - - /*! - * @brief Audio DSP menu hook data - */ - typedef struct AE_DSP_MENUHOOK_DATA - { - AE_DSP_MENUHOOK_CAT category; /*!< @brief (required) related menuhook data category */ - union data { - AE_DSP_STREAM_ID iStreamId; /*!< @brief currently only stream id is used, is used as union to have extension possibility */ - } data; /*!< @brief related category related data */ - } ATTRIBUTE_PACKED AE_DSP_MENUHOOK_DATA; - - /*! - * @brief Structure to transfer the methods from kodi_audiodsp_dll.h to KODI - */ - struct AudioDSP - { - const char* (__cdecl* GetAudioDSPAPIVersion) (void); - const char* (__cdecl* GetMinimumAudioDSPAPIVersion) (void); - const char* (__cdecl* GetGUIAPIVersion) (void); - const char* (__cdecl* GetMinimumGUIAPIVersion) (void); - AE_DSP_ERROR (__cdecl* GetAddonCapabilities) (AE_DSP_ADDON_CAPABILITIES*); - const char* (__cdecl* GetDSPName) (void); - const char* (__cdecl* GetDSPVersion) (void); - AE_DSP_ERROR (__cdecl* MenuHook) (const AE_DSP_MENUHOOK&, const AE_DSP_MENUHOOK_DATA&); - - AE_DSP_ERROR (__cdecl* StreamCreate) (const AE_DSP_SETTINGS*, const AE_DSP_STREAM_PROPERTIES*, ADDON_HANDLE); - AE_DSP_ERROR (__cdecl* StreamDestroy) (const ADDON_HANDLE); - AE_DSP_ERROR (__cdecl* StreamIsModeSupported) (const ADDON_HANDLE, AE_DSP_MODE_TYPE, unsigned int, int); - AE_DSP_ERROR (__cdecl* StreamInitialize) (const ADDON_HANDLE, const AE_DSP_SETTINGS*); - - bool (__cdecl* InputProcess) (const ADDON_HANDLE, const float**, unsigned int); - - unsigned int (__cdecl* InputResampleProcessNeededSamplesize) (const ADDON_HANDLE); - unsigned int (__cdecl* InputResampleProcess) (const ADDON_HANDLE, float**, float**, unsigned int); - float (__cdecl* InputResampleGetDelay) (const ADDON_HANDLE); - int (__cdecl* InputResampleSampleRate) (const ADDON_HANDLE); - - unsigned int (__cdecl* PreProcessNeededSamplesize) (const ADDON_HANDLE, unsigned int); - float (__cdecl* PreProcessGetDelay) (const ADDON_HANDLE, unsigned int); - unsigned int (__cdecl* PreProcess) (const ADDON_HANDLE, unsigned int, float**, float**, unsigned int); - - AE_DSP_ERROR (__cdecl* MasterProcessSetMode) (const ADDON_HANDLE, AE_DSP_STREAMTYPE, unsigned int, int); - unsigned int (__cdecl* MasterProcessNeededSamplesize) (const ADDON_HANDLE); - float (__cdecl* MasterProcessGetDelay) (const ADDON_HANDLE); - int (__cdecl* MasterProcessGetOutChannels) (const ADDON_HANDLE, unsigned long&); - unsigned int (__cdecl* MasterProcess) (const ADDON_HANDLE, float**, float**, unsigned int); - const char* (__cdecl* MasterProcessGetStreamInfoString) (const ADDON_HANDLE); - - unsigned int (__cdecl* PostProcessNeededSamplesize) (const ADDON_HANDLE, unsigned int); - float (__cdecl* PostProcessGetDelay) (const ADDON_HANDLE, unsigned int); - unsigned int (__cdecl* PostProcess) (const ADDON_HANDLE, unsigned int, float**, float**, unsigned int); - - unsigned int (__cdecl* OutputResampleProcessNeededSamplesize)(const ADDON_HANDLE); - unsigned int (__cdecl* OutputResampleProcess) (const ADDON_HANDLE, float**, float**, unsigned int); - float (__cdecl* OutputResampleGetDelay) (const ADDON_HANDLE); - int (__cdecl* OutputResampleSampleRate) (const ADDON_HANDLE); - }; - -#ifdef __cplusplus -} -#endif - -#endif //__AUDIODSP_TYPES_H__ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/include/kodi_audioengine_types.h kodi-15.2~git20151019.1039-final/xbmc/addons/include/kodi_audioengine_types.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/include/kodi_audioengine_types.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/include/kodi_audioengine_types.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -/*! - * Common data structures shared between KODI and KODI's binary add-ons - */ - -#ifndef __AUDIOENGINE_TYPES_H__ -#define __AUDIOENGINE_TYPES_H__ - -#ifdef TARGET_WINDOWS -#include -#else -#ifndef __cdecl -#define __cdecl -#endif -#ifndef __declspec -#define __declspec(X) -#endif -#endif - -#include - -#undef ATTRIBUTE_PACKED -#undef PRAGMA_PACK_BEGIN -#undef PRAGMA_PACK_END - -#if defined(__GNUC__) -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) -#define ATTRIBUTE_PACKED __attribute__ ((packed)) -#define PRAGMA_PACK 0 -#endif -#endif - -#if !defined(ATTRIBUTE_PACKED) -#define ATTRIBUTE_PACKED -#define PRAGMA_PACK 1 -#endif - -/* current Audio DSP API version */ -#define KODI_AUDIOENGINE_API_VERSION "0.0.1" - -/* min. Audio DSP API version */ -#define KODI_AUDIOENGINE_MIN_API_VERSION "0.0.1" - - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * A stream handle pointer, which is only used internally by the addon stream handle - */ - typedef void AEStreamHandle; - - /** - * The audio format structure that fully defines a stream's audio information - */ - typedef struct AudioEngineFormat - { - /** - * The stream's data format (eg, AE_FMT_S16LE) - */ - enum AEDataFormat m_dataFormat; - - /** - * The stream's sample rate (eg, 48000) - */ - unsigned int m_sampleRate; - - /** - * The encoded streams sample rate if a bitstream, otherwise undefined - */ - unsigned int m_encodedRate; - - /** - * The amount of used speaker channels - */ - unsigned int m_channelCount; - - /** - * The stream's channel layout - */ - enum AEChannel m_channels[AE_CH_MAX]; - - /** - * The number of frames per period - */ - unsigned int m_frames; - - /** - * The number of samples in one frame - */ - unsigned int m_frameSamples; - - /** - * The size of one frame in bytes - */ - unsigned int m_frameSize; - - AudioEngineFormat() - { - m_dataFormat = AE_FMT_INVALID; - m_sampleRate = 0; - m_encodedRate = 0; - m_frames = 0; - m_frameSamples = 0; - m_frameSize = 0; - m_channelCount = 0; - - for (unsigned int ch = 0; ch < AE_CH_MAX; ch++) - { - m_channels[ch] = AE_CH_NULL; - } - } - - bool compareFormat(const AudioEngineFormat *fmt) - { - if (!fmt) - { - return false; - } - - if (m_dataFormat != fmt->m_dataFormat || - m_sampleRate != fmt->m_sampleRate || - m_encodedRate != fmt->m_encodedRate || - m_frames != fmt->m_frames || - m_frameSamples != fmt->m_frameSamples || - m_frameSize != fmt->m_frameSize || - m_channelCount != fmt->m_channelCount) - { - return false; - } - - for (unsigned int ch = 0; ch < AE_CH_MAX; ch++) - { - if (fmt->m_channels[ch] != m_channels[ch]) - { - return false; - } - } - - return true; - } - } AudioEngineFormat; - -#ifdef __cplusplus -} -#endif - -#endif //__AUDIOENGINE_TYPES_H__ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/include/NOTE kodi-15.2~git20151019.1039-final/xbmc/addons/include/NOTE --- kodi-16.1~git20160425.1001-final/xbmc/addons/include/NOTE 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/include/NOTE 2015-10-19 08:39:16.000000000 +0000 @@ -10,6 +10,3 @@ The current PVR API version can be found in xbmc_pvr_types.h: XBMC_PVR_API_VERSION - -The current audio DSP API version can be found in kodi_adsp_types.h: -KODI_AE_DSP_API_VERSION diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/include/xbmc_epg_types.h kodi-15.2~git20151019.1039-final/xbmc/addons/include/xbmc_epg_types.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/include/xbmc_epg_types.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/include/xbmc_epg_types.h 2015-10-19 08:39:16.000000000 +0000 @@ -61,10 +61,6 @@ /* Set EPGTAG.iGenreType to EPG_GENRE_USE_STRING to transfer genre strings to XBMC */ #define EPG_GENRE_USE_STRING 0x100 -/* EPG_TAG.iFlags values */ -const unsigned int EPG_TAG_FLAG_UNDEFINED = 0x00000000; /*!< @brief nothing special to say about this entry */ -const unsigned int EPG_TAG_FLAG_IS_SERIES = 0x00000001; /*!< @brief this EPG entry is part of a series */ - #ifdef __cplusplus extern "C" { #endif @@ -98,7 +94,6 @@ int iEpisodeNumber; /*!< @brief (optional) episode number */ int iEpisodePartNumber; /*!< @brief (optional) episode part number */ const char * strEpisodeName; /*!< @brief (optional) episode name */ - unsigned int iFlags; /*!< @brief (optional) bit field of independent flags associated with the EPG entry */ } ATTRIBUTE_PACKED EPG_TAG; #ifdef __cplusplus diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/include/xbmc_pvr_dll.h kodi-15.2~git20151019.1039-final/xbmc/addons/include/xbmc_pvr_dll.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/include/xbmc_pvr_dll.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/include/xbmc_pvr_dll.h 2015-10-19 08:39:16.000000000 +0000 @@ -330,15 +330,6 @@ */ PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY edl[], int *size); - /*! - * Retrieve the timer types supported by the backend. - * @param types out: The function has to write the definition of the supported timer types into this array. - * @param typesCount in: The maximum size of the list, out: the actual size of the list. default: PVR_ADDON_TIMERTYPE_ARRAY_SIZE - * @return PVR_ERROR_NO_ERROR if the types were successfully written to the array. - * @remarks Required if bSupportsTimers is set to true. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. - */ - PVR_ERROR GetTimerTypes(PVR_TIMER_TYPE types[], int *typesCount); - //@} /** @name PVR timer methods * @remarks Only used by XBMC is bSupportsTimers is set to true. @@ -630,12 +621,6 @@ const char* GetBackendHostname(); /*! - * Check if timeshift is active - * @return true if timeshift is active - */ - bool IsTimeshifting(); - - /*! * Called by XBMC to assign the function pointers of this add-on to pClient. * @param pClient The struct to assign the function pointers to. */ @@ -679,7 +664,6 @@ pClient->GetRecordingLastPlayedPosition = GetRecordingLastPlayedPosition; pClient->GetRecordingEdl = GetRecordingEdl; - pClient->GetTimerTypes = GetTimerTypes; pClient->GetTimersAmount = GetTimersAmount; pClient->GetTimers = GetTimers; pClient->AddTimer = AddTimer; @@ -720,8 +704,6 @@ pClient->GetBufferTimeEnd = GetBufferTimeEnd; pClient->GetBackendHostname = GetBackendHostname; - - pClient->IsTimeshifting = IsTimeshifting; }; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/include/xbmc_pvr_types.h kodi-15.2~git20151019.1039-final/xbmc/addons/include/xbmc_pvr_types.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/include/xbmc_pvr_types.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/include/xbmc_pvr_types.h 2015-10-19 08:39:16.000000000 +0000 @@ -65,101 +65,26 @@ #define PRAGMA_PACK 1 #endif -#define PVR_ADDON_NAME_STRING_LENGTH 1024 -#define PVR_ADDON_URL_STRING_LENGTH 1024 -#define PVR_ADDON_DESC_STRING_LENGTH 1024 -#define PVR_ADDON_INPUT_FORMAT_STRING_LENGTH 32 -#define PVR_ADDON_EDL_LENGTH 32 -#define PVR_ADDON_TIMERTYPE_ARRAY_SIZE 32 -#define PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE 512 -#define PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE_SMALL 128 -#define PVR_ADDON_TIMERTYPE_STRING_LENGTH 64 +#define PVR_ADDON_NAME_STRING_LENGTH 1024 +#define PVR_ADDON_URL_STRING_LENGTH 1024 +#define PVR_ADDON_DESC_STRING_LENGTH 1024 +#define PVR_ADDON_INPUT_FORMAT_STRING_LENGTH 32 +#define PVR_ADDON_EDL_LENGTH 32 /* using the default avformat's MAX_STREAMS value to be safe */ #define PVR_STREAM_MAX_STREAMS 20 /* current PVR API version */ -#define XBMC_PVR_API_VERSION "4.1.0" +#define XBMC_PVR_API_VERSION "1.9.6" /* min. PVR API version */ -#define XBMC_PVR_MIN_API_VERSION "4.1.0" +#define XBMC_PVR_MIN_API_VERSION "1.9.6" #ifdef __cplusplus extern "C" { #endif /*! - * @brief numeric PVR timer type definitions (PVR_TIMER.iTimerType values) - */ - const unsigned int PVR_TIMER_TYPE_NONE = 0; /*!< @brief "Null" value for a numeric timer type. */ - - /*! - * @brief special PVR_TIMER.iClientIndex value to indicate that a timer has not (yet) a valid client index. - */ - const unsigned int PVR_TIMER_NO_CLIENT_INDEX = 0; /*!< @brief timer has not (yet) a valid client index. */ - - /*! - * @brief special PVR_TIMER.iParentClientIndex value to indicate that a timer has no parent. - */ - const unsigned int PVR_TIMER_NO_PARENT = PVR_TIMER_NO_CLIENT_INDEX; /*!< @brief timer has no parent; it was not scheduled by a repeating timer. */ - - /*! - * @brief special PVR_TIMER.iEpgUid value to indicate that a timer has no EPG event uid. - */ - const unsigned int PVR_TIMER_NO_EPG_UID = 0; /*!< @brief timer has no EPG event uid. */ - - /*! - * @brief special PVR_TIMER.iClientChannelUid value to indicate "any channel". Useful for some repeating timer types. - */ - const int PVR_TIMER_ANY_CHANNEL = -1; /*!< @brief denotes "any channel", not a specific one. */ - - /*! - * @brief PVR timer type attributes (PVR_TIMER_TYPE.iAttributes values) - */ - const unsigned int PVR_TIMER_TYPE_ATTRIBUTE_NONE = 0x00000000; - - const unsigned int PVR_TIMER_TYPE_IS_MANUAL = 0x00000001; /*!< @brief defines whether this is a type for manual (time-based) or epg-based timers */ - const unsigned int PVR_TIMER_TYPE_IS_REPEATING = 0x00000002; /*!< @brief defines whether this is a type for repeating or one-shot timers */ - const unsigned int PVR_TIMER_TYPE_IS_READONLY = 0x00000004; /*!< @brief timers of this type must not be edited by Kodi */ - const unsigned int PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES = 0x00000008; /*!< @brief timers of this type must not be created by Kodi. All other operations are allowed, though */ - - const unsigned int PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE = 0x00000010; /*!< @brief this type supports enabling/disabling of the timer (PVR_TIMER.state SCHEDULED|DISBALED) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_CHANNELS = 0x00000020; /*!< @brief this type supports channels (PVR_TIMER.iClientChannelUid) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_START_TIME = 0x00000040; /*!< @brief this type supports a recording start time (PVR_TIMER.startTime) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_TITLE_EPG_MATCH = 0x00000080; /*!< @brief this type supports matching epg episode title using PVR_TIMER.strEpgSearchString */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_FULLTEXT_EPG_MATCH = 0x00000100; /*!< @brief this type supports matching "more" epg data (not just episode title) using PVR_TIMER.strEpgSearchString. Setting FULLTEXT_EPG_MATCH implies TITLE_EPG_MATCH */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_FIRST_DAY = 0x00000200; /*!< @brief this type supports a first day the timer gets active (PVR_TIMER.firstday) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_WEEKDAYS = 0x00000400; /*!< @brief this type supports weekdays for defining the recording schedule (PVR_TIMER.iWeekdays) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_RECORD_ONLY_NEW_EPISODES = 0x00000800; /*!< @brief this type supports the "record only new episodes" feature (PVR_TIMER.iPreventDuplicateEpisodes) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_START_END_MARGIN = 0x00001000; /*!< @brief this type supports pre and post record time (PVR_TIMER.iMarginStart, PVR_TIMER.iMarginEnd) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_PRIORITY = 0x00002000; /*!< @brief this type supports recording priority (PVR_TIMER.iPriority) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_LIFETIME = 0x00004000; /*!< @brief this type supports recording lifetime (PVR_TIMER.iLifetime) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_RECORDING_FOLDERS = 0x00008000; /*!< @brief this type supports placing recordings in user defined folders (PVR_TIMER.strDirectory) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_RECORDING_GROUP = 0x00010000; /*!< @brief this type supports a list of recording groups (PVR_TIMER.iRecordingGroup) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_END_TIME = 0x00020000; /*!< @brief this type supports a recording end time (PVR_TIMER.endTime) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_START_ANYTIME = 0x00040000; /*!< @brief enables an 'Any Time' over-ride option for startTime (using PVR_TIMER.bStartAnyTime) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_END_ANYTIME = 0x00080000; /*!< @brief enables a separate 'Any Time' over-ride for endTime (using PVR_TIMER.bEndAnyTime) */ - const unsigned int PVR_TIMER_TYPE_SUPPORTS_MAX_RECORDINGS = 0x00100000; /*!< @brief this type supports specifying a maximum recordings setting' (PVR_TIMER.iMaxRecordings) */ - const unsigned int PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE = 0x00200000; /*!< @brief this type shold not appear on any create menus which don't provide an associated EPG tag */ - const unsigned int PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE = 0x00400000; /*!< @brief this type should not appear on any create menus which provide an associated EPG tag */ - const unsigned int PVR_TIMER_TYPE_REQUIRES_EPG_SERIES_ON_CREATE = 0x00800000; /*!< @brief this type should not appear on any create menus unless associated with an EPG tag with 'series' attributes (EPG_TAG.iFlags & EPG_TAG_FLAG_IS_SERIES || EPG_TAG.iSeriesNumber > 0 || EPG_TAG.iEpisodeNumber > 0 || EPG_TAG.iEpisodePartNumber > 0). Implies PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE */ - - /*! - * @brief PVR timer weekdays (PVR_TIMER.iWeekdays values) - */ - const unsigned int PVR_WEEKDAY_NONE = 0x00; - const unsigned int PVR_WEEKDAY_MONDAY = 0x01; - const unsigned int PVR_WEEKDAY_TUESDAY = 0x02; - const unsigned int PVR_WEEKDAY_WEDNESDAY = 0x04; - const unsigned int PVR_WEEKDAY_THURSDAY = 0x08; - const unsigned int PVR_WEEKDAY_FRIDAY = 0x10; - const unsigned int PVR_WEEKDAY_SATURDAY = 0x20; - const unsigned int PVR_WEEKDAY_SUNDAY = 0x40; - const unsigned int PVR_WEEKDAY_ALLDAYS = PVR_WEEKDAY_MONDAY | PVR_WEEKDAY_TUESDAY | PVR_WEEKDAY_WEDNESDAY | - PVR_WEEKDAY_THURSDAY | PVR_WEEKDAY_FRIDAY | PVR_WEEKDAY_SATURDAY | - PVR_WEEKDAY_SUNDAY; - - /*! * @brief PVR add-on error codes */ typedef enum @@ -181,7 +106,7 @@ */ typedef enum { - PVR_TIMER_STATE_NEW = 0, /*!< @brief the timer was just created on the backend and is not yet active. This state must not be used for timers just created on the client side. */ + PVR_TIMER_STATE_NEW = 0, /*!< @brief a new, unsaved timer */ PVR_TIMER_STATE_SCHEDULED = 1, /*!< @brief the timer is scheduled for recording */ PVR_TIMER_STATE_RECORDING = 2, /*!< @brief the timer is currently recordings */ PVR_TIMER_STATE_COMPLETED = 3, /*!< @brief the recording completed successfully */ @@ -189,8 +114,7 @@ PVR_TIMER_STATE_CANCELLED = 5, /*!< @brief the timer was scheduled, but was canceled */ PVR_TIMER_STATE_CONFLICT_OK = 6, /*!< @brief the scheduled timer conflicts with another one, but will be recorded */ PVR_TIMER_STATE_CONFLICT_NOK = 7, /*!< @brief the scheduled timer conflicts with another one and won't be recorded */ - PVR_TIMER_STATE_ERROR = 8, /*!< @brief the timer is scheduled, but can't be recorded for some reason */ - PVR_TIMER_STATE_DISABLED = 9, /*!< @brief the timer was disabled by the user, can be enabled via setting the state to PVR_TIMER_STATE_SCHEDULED */ + PVR_TIMER_STATE_ERROR = 8 /*!< @brief the timer is scheduled, but can't be recorded for some reason */ } PVR_TIMER_STATE; /*! @@ -234,6 +158,7 @@ bool bSupportsChannelSettings; /*!< @brief true if this add-on supports the following functions: DeleteChannel, RenameChannel, MoveChannel, DialogChannelSettings and DialogAddChannel */ bool bHandlesInputStream; /*!< @brief true if this add-on provides an input stream. false if XBMC handles the stream. */ bool bHandlesDemuxing; /*!< @brief true if this add-on demultiplexes packets. */ + bool bSupportsRecordingFolders; /*!< @brief true if the backend supports timers / recordings in folders. */ bool bSupportsRecordingPlayCount; /*!< @brief true if the backend supports play count for recordings. */ bool bSupportsLastPlayedPosition; /*!< @brief true if the backend supports store/retrieve of last played position for recordings. */ bool bSupportsRecordingEdl; /*!< @brief true if the backend supports retrieving an edit decision list for recordings. */ @@ -330,117 +255,34 @@ } ATTRIBUTE_PACKED PVR_CHANNEL_GROUP_MEMBER; /*! - * @brief Representation of a timer's attribute integer value. - */ - typedef struct PVR_TIMER_TYPE_ATTRIBUTE_INT_VALUE - { - int iValue; /*!< @brief (required) an integer value for a certain timer attribute */ - char strDescription[PVR_ADDON_TIMERTYPE_STRING_LENGTH]; /*!< @brief (optional) a localized string describing the value. If left blank, Kodi will - generate a suitable representation (like the integer value as string) */ - } ATTRIBUTE_PACKED PVR_TIMER_TYPE_ATTRIBUTE_INT_VALUE; - - /*! - * @brief Representation of a timer type. - */ - typedef struct PVR_TIMER_TYPE - { - unsigned int iId; /*!< @brief (required) this type's identifier. Ids must be > PVR_TIMER_TYPE_NONE. */ - unsigned int iAttributes; /*!< @brief (required) defines the attributes for this type (PVR_TIMER_TYPE_* constants). */ - char strDescription[PVR_ADDON_TIMERTYPE_STRING_LENGTH]; /*!< @brief (optional) a short localized string describing the purpose of the type. (e.g. - "Any time at this channel if title matches"). If left blank, Kodi will generate a - description based on the attributes REPEATING and MANUAL. (e.g. "Repeating EPG-based." */ - /* priority value definitions */ - unsigned int iPrioritiesSize; /*!< @brief (required) Count of possible values for PVR_TMER.iPriority. 0 means priority - is not supported by this timer type or no own value definition wanted, but to use Kodi defaults - of 1..100. */ - PVR_TIMER_TYPE_ATTRIBUTE_INT_VALUE - priorities[PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE]; /*!< @brief (optional) Array containing the possible values for PVR_TMER.iPriority. Must be - filled if iPrioritiesSize > 0 */ - int iPrioritiesDefault; /*!< @brief (optional) The default value for PVR_TMER.iPriority. Must be filled if iPrioritiesSize > 0 */ - - /* lifetime value definitions */ - unsigned int iLifetimesSize; /*!< @brief (required) Count of possible values for PVR_TMER.iLifetime. 0 means lifetime - is not supported by this timer type or no own value definition wanted, but to use Kodi defaults - of 1..365. */ - PVR_TIMER_TYPE_ATTRIBUTE_INT_VALUE - lifetimes[PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE]; /*!< @brief (optional) Array containing the possible values for PVR_TMER.iLifetime. Must be - filled if iLifetimesSize > 0 */ - int iLifetimesDefault; /*!< @brief (optional) The default value for PVR_TMER.iLifetime. Must be filled if iLifetimesSize > 0 */ - - /* prevent duplicate episodes value definitions */ - unsigned int iPreventDuplicateEpisodesSize; /*!< @brief (required) Count of possible values for PVR_TMER.iPreventDuplicateEpisodes. 0 means duplicate - episodes prevention is not supported by this timer type or no own value definition wanted, but to use - Kodi defaults. */ - PVR_TIMER_TYPE_ATTRIBUTE_INT_VALUE - preventDuplicateEpisodes[PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE]; - /*!< @brief (optional) Array containing the possible values for PVR_TMER.iPreventDuplicateEpisodes.. Must - be filled if iPreventDuplicateEpisodesSize > 0 */ - unsigned int iPreventDuplicateEpisodesDefault; /*!< @brief (optional) The default value for PVR_TMER.iPreventDuplicateEpisodesSize. Must be filled if iPreventDuplicateEpisodesSize > 0 */ - - /* recording folder list value definitions */ - unsigned int iRecordingGroupSize; /*!< @brief (required) Count of possible values of PVR_TIMER.iRecordingGroup. 0 means folder lists are not supported by this timer type */ - PVR_TIMER_TYPE_ATTRIBUTE_INT_VALUE - recordingGroup[PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE]; - /*!< @brief (optional) Array containing the possible values of PVR_TMER.iRecordingGroup. Must be filled if iRecordingGroupSize > 0 */ - unsigned int iRecordingGroupDefault; /*!< @brief (optional) The default value for PVR_TIMER.iRecordingGroup. Must be filled in if PVR_TIMER.iRecordingGroupSize > 0 */ - - /* max recordings value definitions */ - unsigned int iMaxRecordingsSize; /*!< @brief (required) Count of possible values of PVR_TIMER.iMaxRecordings. 0 means max recordings are not supported by this timer type */ - PVR_TIMER_TYPE_ATTRIBUTE_INT_VALUE - maxRecordings[PVR_ADDON_TIMERTYPE_VALUES_ARRAY_SIZE_SMALL]; - /*!< @brief (optional) Array containing the possible values of PVR_TMER.iMaxRecordings. */ - int iMaxRecordingsDefault; /*!< @brief (optional) The default value for PVR_TIMER.iMaxRecordings. Must be filled in if PVR_TIMER.iMaxRecordingsSize > 0 */ - - } ATTRIBUTE_PACKED PVR_TIMER_TYPE; - - /*! * @brief Representation of a timer event. */ typedef struct PVR_TIMER { - unsigned int iClientIndex; /*!< @brief (required) the index of this timer given by the client. PVR_TIMER_NO_CLIENT_INDEX indicates that the index was not yet set by the client, for example for new timers created by - Kodi and passed the first time to the client. A valid index must be greater than PVR_TIMER_NO_CLIENT_INDEX. */ - unsigned int iParentClientIndex; /*!< @brief (optional) for timers scheduled by a repeating timer, the index of the repeating timer that scheduled this timer (it's PVR_TIMER.iClientIndex value). Use PVR_TIMER_NO_PARENT - to indicate that this timer was no scheduled by a repeating timer. */ - int iClientChannelUid; /*!< @brief (optional) unique identifier of the channel to record on. PVR_TIMER_ANY_CHANNEL will denote "any channel", not a specifoc one. */ - time_t startTime; /*!< @brief (optional) start time of the recording in UTC. Instant timers that are sent to the add-on by Kodi will have this value set to 0.*/ - time_t endTime; /*!< @brief (optional) end time of the recording in UTC. */ - bool bStartAnyTime; /*!< @brief (optional) for EPG based (not Manual) timers indicates startTime does not apply. Default = false */ - bool bEndAnyTime; /*!< @brief (optional) for EPG based (not Manual) timers indicates endTime does not apply. Default = false */ + unsigned int iClientIndex; /*!< @brief (required) the index of this timer given by the client */ + int iClientChannelUid; /*!< @brief (required) unique identifier of the channel to record on */ + time_t startTime; /*!< @brief (required) start time of the recording in UTC. instant timers that are sent to the add-on by xbmc will have this value set to 0 */ + time_t endTime; /*!< @brief (required) end time of the recording in UTC */ PVR_TIMER_STATE state; /*!< @brief (required) the state of this timer */ - unsigned int iTimerType; /*!< @brief (required) the type of this timer. It is private to the addon and can be freely defined by the addon. The value must be greater than PVR_TIMER_TYPE_NONE. - Kodi does not interpret this value (except for checking for PVR_TIMER_TYPE_NONE), but will pass the right id to the addon with every PVR_TIMER instance, thus the addon easily can determine - the timer type. */ - char strTitle[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (required) a title for this timer */ - char strEpgSearchString[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (optional) a string used to search epg data for repeating epg-based timers. Format is backend-dependent, for example regexp */ - bool bFullTextEpgSearch; /*!< @brief (optional) indicates, whether strEpgSearchString is to match against the epg episode title only or also against "other" epg data (backend-dependent) */ - char strDirectory[PVR_ADDON_URL_STRING_LENGTH]; /*!< @brief (optional) the (relative) directory where the recording will be stored in */ + char strTitle[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (optional) title of this timer */ + char strDirectory[PVR_ADDON_URL_STRING_LENGTH]; /*!< @brief (optional) the directory where the recording will be stored in */ char strSummary[PVR_ADDON_DESC_STRING_LENGTH]; /*!< @brief (optional) the summary for this timer */ int iPriority; /*!< @brief (optional) the priority of this timer */ - int iLifetime; /*!< @brief (optional) lifetime of recordings created by this timer. > 0 days after which recordings will be deleted by the backend, < 0 addon defined integer list reference, == 0 disabled */ - int iMaxRecordings; /*!< @brief (optional) maximum number of recordings this timer shall create. > 0 number of recordings, < 0 addon defined integer list reference, == 0 disabled */ - unsigned int iRecordingGroup; /*!< @brief (optional) integer ref to addon/backend defined list of recording groups*/ - time_t firstDay; /*!< @brief (optional) the first day this timer is active, for repeating timers */ - unsigned int iWeekdays; /*!< @brief (optional) week days, for repeating timers */ - unsigned int iPreventDuplicateEpisodes; /*!< @brief (optional) 1 if backend should only record new episodes in case of a repeating epg-based timer, 0 if all episodes shall be recorded (no duplicate detection). Actual algorithm for - duplicate detection is defined by the backend. Addons may define own values for different duplicate detection algorithms, thus this is not just a bool.*/ - unsigned int iEpgUid; /*!< @brief (optional) epg event id. Use PVR_TIMER_NO_EPG_UID to state that there is no EPG event id available for this timer. Values greater than PVR_TIMER_NO_EPG_UID represent a valid epg event id. */ + int iLifetime; /*!< @brief (optional) lifetimer of this timer in days */ + bool bIsRepeating; /*!< @brief (optional) true if this is a recurring timer */ + time_t firstDay; /*!< @brief (optional) the first day this recording is active in case of a repeating event */ + int iWeekdays; /*!< @brief (optional) weekday mask */ + int iEpgUid; /*!< @brief (optional) epg event id */ unsigned int iMarginStart; /*!< @brief (optional) if set, the backend starts the recording iMarginStart minutes before startTime. */ unsigned int iMarginEnd; /*!< @brief (optional) if set, the backend ends the recording iMarginEnd minutes after endTime. */ int iGenreType; /*!< @brief (optional) genre type */ int iGenreSubType; /*!< @brief (optional) genre sub type */ } ATTRIBUTE_PACKED PVR_TIMER; - /*! * @brief Representation of a recording. */ typedef struct PVR_RECORDING { char strRecordingId[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (required) unique id of the recording on the client. */ char strTitle[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (required) the title of this recording */ - char strEpisodeName[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (optional) episode name (also known as subtitle) */ - int iSeriesNumber; /*!< @brief (optional) series number (usually called season). Set to "0" for specials/pilot. For 'invalid' see iEpisodeNumber or set to -1 */ - int iEpisodeNumber; /*!< @brief (optional) episode number within the "iSeriesNumber" season. For 'invalid' set to -1 or iSeriesNumber=iEpisodeNumber=0 to show both are invalid */ - int iYear; /*!< @brief (optional) year of first release (use to identify a specific movie re-make) / first airing for TV shows. Set to '0' for invalid. */ - char strStreamURL[PVR_ADDON_URL_STRING_LENGTH]; /*!< @brief (required) stream URL to access this recording */ char strDirectory[PVR_ADDON_URL_STRING_LENGTH]; /*!< @brief (optional) directory of this recording on the client */ char strPlotOutline[PVR_ADDON_DESC_STRING_LENGTH]; /*!< @brief (optional) plot outline */ @@ -531,7 +373,6 @@ PVR_ERROR (__cdecl* SetRecordingLastPlayedPosition)(const PVR_RECORDING&, int); int (__cdecl* GetRecordingLastPlayedPosition)(const PVR_RECORDING&); PVR_ERROR (__cdecl* GetRecordingEdl)(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*); - PVR_ERROR (__cdecl* GetTimerTypes)(PVR_TIMER_TYPE[], int*); int (__cdecl* GetTimersAmount)(void); PVR_ERROR (__cdecl* GetTimers)(ADDON_HANDLE); PVR_ERROR (__cdecl* AddTimer)(const PVR_TIMER&); @@ -567,7 +408,6 @@ time_t (__cdecl* GetBufferTimeStart)(void); time_t (__cdecl* GetBufferTimeEnd)(void); const char* (__cdecl* GetBackendHostname)(void); - bool (__cdecl* IsTimeshifting)(void); } PVRClient; #ifdef __cplusplus diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/LanguageResource.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/LanguageResource.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/LanguageResource.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/LanguageResource.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,18 +21,16 @@ #include "LangInfo.h" #include "addons/AddonManager.h" #include "dialogs/GUIDialogKaiToast.h" +#include "dialogs/GUIDialogYesNo.h" #include "guilib/GUIWindowManager.h" #include "settings/Settings.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" -#include "messaging/helpers/DialogHelper.h" - -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; +#define LANGUAGE_SETTING "locale.language" #define LANGUAGE_ADDON_PREFIX "resource.language." +using namespace std; + namespace ADDON { @@ -43,25 +41,25 @@ if (ext != NULL) { // parse attributes - std::string locale = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@locale"); + std::string locale = CAddonMgr::Get().GetExtValue(ext->configuration, "@locale"); m_locale = CLocale::FromString(locale); // parse - cp_cfg_element_t *charsetsElement = CAddonMgr::GetInstance().GetExtElement(ext->configuration, "charsets"); + cp_cfg_element_t *charsetsElement = CAddonMgr::Get().GetExtElement(ext->configuration, "charsets"); if (charsetsElement != NULL) { - m_charsetGui = CAddonMgr::GetInstance().GetExtValue(charsetsElement, "gui"); - m_forceUnicodeFont = CAddonMgr::GetInstance().GetExtValue(charsetsElement, "gui@unicodefont") == "true"; - m_charsetSubtitle = CAddonMgr::GetInstance().GetExtValue(charsetsElement, "subtitle"); + m_charsetGui = CAddonMgr::Get().GetExtValue(charsetsElement, "gui"); + m_forceUnicodeFont = CAddonMgr::Get().GetExtValue(charsetsElement, "gui@unicodefont") == "true"; + m_charsetSubtitle = CAddonMgr::Get().GetExtValue(charsetsElement, "subtitle"); } // parse - cp_cfg_element_t *dvdElement = CAddonMgr::GetInstance().GetExtElement(ext->configuration, "dvd"); + cp_cfg_element_t *dvdElement = CAddonMgr::Get().GetExtElement(ext->configuration, "dvd"); if (dvdElement != NULL) { - m_dvdLanguageMenu = CAddonMgr::GetInstance().GetExtValue(dvdElement, "menu"); - m_dvdLanguageAudio = CAddonMgr::GetInstance().GetExtValue(dvdElement, "audio"); - m_dvdLanguageSubtitle = CAddonMgr::GetInstance().GetExtValue(dvdElement, "subtitle"); + m_dvdLanguageMenu = CAddonMgr::Get().GetExtValue(dvdElement, "menu"); + m_dvdLanguageAudio = CAddonMgr::Get().GetExtValue(dvdElement, "audio"); + m_dvdLanguageSubtitle = CAddonMgr::Get().GetExtValue(dvdElement, "subtitle"); } // fall back to the language of the addon if a DVD language is not defined if (m_dvdLanguageMenu.empty()) @@ -72,7 +70,7 @@ m_dvdLanguageSubtitle = m_locale.GetLanguageCode(); // parse - cp_cfg_element_t *sorttokensElement = CAddonMgr::GetInstance().GetExtElement(ext->configuration, "sorttokens"); + cp_cfg_element_t *sorttokensElement = CAddonMgr::Get().GetExtElement(ext->configuration, "sorttokens"); if (sorttokensElement != NULL) { for (size_t i = 0; i < sorttokensElement->num_children; ++i) @@ -82,7 +80,7 @@ tokenElement.value != NULL) { std::string token(tokenElement.value); - std::string separators = CAddonMgr::GetInstance().GetExtValue(&tokenElement, "@separators"); + std::string separators = CAddonMgr::Get().GetExtValue(&tokenElement, "@separators"); if (separators.empty()) separators = " ._"; @@ -107,14 +105,13 @@ bool CLanguageResource::IsInUse() const { - return StringUtils::EqualsNoCase(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_LANGUAGE), ID()); + return StringUtils::EqualsNoCase(CSettings::Get().GetString(LANGUAGE_SETTING), ID()); } void CLanguageResource::OnPostInstall(bool update, bool modal) { if (IsInUse() || - (!update && !modal && - (HELPERS::ShowYesNoDialogText(CVariant{Name()}, CVariant{24132}) == DialogResponse::YES))) + (!update && !modal && CGUIDialogYesNo::ShowAndGetInput(Name(), 24132))) { CGUIDialogKaiToast *toast = (CGUIDialogKaiToast *)g_windowManager.GetWindow(WINDOW_DIALOG_KAI_TOAST); if (toast) @@ -126,7 +123,7 @@ if (IsInUse()) g_langInfo.SetLanguage(ID()); else - CSettings::GetInstance().SetString(CSettings::SETTING_LOCALE_LANGUAGE, ID()); + CSettings::Get().SetString(LANGUAGE_SETTING, ID()); } } @@ -159,7 +156,7 @@ std::string addonId = GetAddonId(locale); AddonPtr addon; - if (!CAddonMgr::GetInstance().GetAddon(addonId, addon, ADDON_RESOURCE_LANGUAGE, true)) + if (!CAddonMgr::Get().GetAddon(addonId, addon, ADDON_RESOURCE_LANGUAGE, true)) return false; legacyLanguage = addon->Name(); @@ -174,7 +171,7 @@ VECADDONS addons; if (!languageAddons.empty()) addons = languageAddons; - else if (!CAddonMgr::GetInstance().GetAddons(ADDON_RESOURCE_LANGUAGE, addons, true) || addons.empty()) + else if (!CAddonMgr::Get().GetAddons(ADDON_RESOURCE_LANGUAGE, addons, true) || addons.empty()) return false; // try to find a language that matches the old language in name or id diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Makefile kodi-15.2~git20151019.1039-final/xbmc/addons/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/addons/Makefile 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -1,8 +1,6 @@ SRCS=Addon.cpp \ AddonCallbacks.cpp \ AddonCallbacksAddon.cpp \ - AddonCallbacksAudioDSP.cpp \ - AddonCallbacksAudioEngine.cpp \ AddonCallbacksCodec.cpp \ AddonCallbacksGUI.cpp \ AddonCallbacksPVR.cpp \ @@ -12,17 +10,15 @@ AddonStatusHandler.cpp \ AddonVersion.cpp \ AudioEncoder.cpp \ - ContextMenuAddon.cpp \ + ContextItemAddon.cpp \ AudioDecoder.cpp \ GUIDialogAddonInfo.cpp \ GUIDialogAddonSettings.cpp \ GUIViewStateAddonBrowser.cpp \ GUIWindowAddonBrowser.cpp \ - ImageResource.cpp \ LanguageResource.cpp \ PluginSource.cpp \ Repository.cpp \ - RepositoryUpdater.cpp \ Scraper.cpp \ ScreenSaver.cpp \ Service.cpp \ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/PluginSource.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/PluginSource.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/PluginSource.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/PluginSource.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -17,14 +17,12 @@ * . * */ - #include "PluginSource.h" - -#include - #include "AddonManager.h" #include "utils/StringUtils.h" +using namespace std; + namespace ADDON { @@ -44,7 +42,7 @@ std::string provides; if (ext) { - provides = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "provides"); + provides = CAddonMgr::Get().GetExtValue(ext->configuration, "provides"); if (!provides.empty()) Props().extrainfo.insert(make_pair("provides", provides)); } @@ -60,8 +58,8 @@ { if (!content.empty()) { - std::vector provides = StringUtils::Split(content, ' '); - for (std::vector::const_iterator i = provides.begin(); i != provides.end(); ++i) + vector provides = StringUtils::Split(content, ' '); + for (vector::const_iterator i = provides.begin(); i != provides.end(); ++i) { Content content = Translate(*i); if (content != UNKNOWN) @@ -86,20 +84,6 @@ return CPluginSource::UNKNOWN; } -TYPE CPluginSource::FullType() const -{ - if (Provides(VIDEO)) - return ADDON_VIDEO; - if (Provides(AUDIO)) - return ADDON_AUDIO; - if (Provides(IMAGE)) - return ADDON_IMAGE; - if (Provides(EXECUTABLE)) - return ADDON_EXECUTABLE; - - return CAddon::FullType(); -} - bool CPluginSource::IsType(TYPE type) const { return ((type == ADDON_VIDEO && Provides(VIDEO)) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/PluginSource.h kodi-15.2~git20151019.1039-final/xbmc/addons/PluginSource.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/PluginSource.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/PluginSource.h 2015-10-19 08:39:16.000000000 +0000 @@ -34,7 +34,6 @@ CPluginSource(const AddonProps &props); virtual ~CPluginSource() {} virtual AddonPtr Clone() const; - virtual TYPE FullType() const; virtual bool IsType(TYPE type) const; bool Provides(const Content& content) const { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Repository.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/Repository.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/Repository.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Repository.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,41 +18,28 @@ * */ -#include "Repository.h" - #include -#include - +#include "Repository.h" #include "addons/AddonDatabase.h" #include "addons/AddonInstaller.h" #include "addons/AddonManager.h" -#include "addons/RepositoryUpdater.h" -#include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogYesNo.h" -#include "events/AddonManagementEvent.h" -#include "events/EventLog.h" -#include "FileItem.h" -#include "filesystem/CurlFile.h" -#include "filesystem/Directory.h" +#include "dialogs/GUIDialogKaiToast.h" #include "filesystem/File.h" -#include "filesystem/ZipFile.h" -#include "messaging/helpers/DialogHelper.h" +#include "filesystem/Directory.h" #include "settings/Settings.h" -#include "TextureDatabase.h" -#include "URL.h" -#include "utils/JobManager.h" #include "utils/log.h" -#include "utils/Mime.h" +#include "utils/JobManager.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "utils/XBMCTinyXML.h" +#include "FileItem.h" +#include "TextureDatabase.h" +#include "URL.h" +using namespace std; using namespace XFILE; using namespace ADDON; -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; AddonPtr CRepository::Clone() const { @@ -72,38 +59,38 @@ { AddonVersion version("0.0.0"); AddonPtr addonver; - if (CAddonMgr::GetInstance().GetAddon("xbmc.addon", addonver)) + if (CAddonMgr::Get().GetAddon("xbmc.addon", addonver)) version = addonver->Version(); for (size_t i = 0; i < ext->configuration->num_children; ++i) { if(ext->configuration->children[i].name && strcmp(ext->configuration->children[i].name, "dir") == 0) { - AddonVersion min_version(CAddonMgr::GetInstance().GetExtValue(&ext->configuration->children[i], "@minversion")); + AddonVersion min_version(CAddonMgr::Get().GetExtValue(&ext->configuration->children[i], "@minversion")); if (min_version <= version) { DirInfo dir; dir.version = min_version; - dir.checksum = CAddonMgr::GetInstance().GetExtValue(&ext->configuration->children[i], "checksum"); - dir.compressed = CAddonMgr::GetInstance().GetExtValue(&ext->configuration->children[i], "info@compressed") == "true"; - dir.info = CAddonMgr::GetInstance().GetExtValue(&ext->configuration->children[i], "info"); - dir.datadir = CAddonMgr::GetInstance().GetExtValue(&ext->configuration->children[i], "datadir"); - dir.zipped = CAddonMgr::GetInstance().GetExtValue(&ext->configuration->children[i], "datadir@zip") == "true"; - dir.hashes = CAddonMgr::GetInstance().GetExtValue(&ext->configuration->children[i], "hashes") == "true"; + dir.checksum = CAddonMgr::Get().GetExtValue(&ext->configuration->children[i], "checksum"); + dir.compressed = CAddonMgr::Get().GetExtValue(&ext->configuration->children[i], "info@compressed") == "true"; + dir.info = CAddonMgr::Get().GetExtValue(&ext->configuration->children[i], "info"); + dir.datadir = CAddonMgr::Get().GetExtValue(&ext->configuration->children[i], "datadir"); + dir.zipped = CAddonMgr::Get().GetExtValue(&ext->configuration->children[i], "datadir@zip") == "true"; + dir.hashes = CAddonMgr::Get().GetExtValue(&ext->configuration->children[i], "hashes") == "true"; m_dirs.push_back(dir); } } } // backward compatibility - if (!CAddonMgr::GetInstance().GetExtValue(ext->configuration, "info").empty()) + if (!CAddonMgr::Get().GetExtValue(ext->configuration, "info").empty()) { DirInfo info; - info.checksum = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "checksum"); - info.compressed = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "info@compressed") == "true"; - info.info = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "info"); - info.datadir = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "datadir"); - info.zipped = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "datadir@zip") == "true"; - info.hashes = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "hashes") == "true"; + info.checksum = CAddonMgr::Get().GetExtValue(ext->configuration, "checksum"); + info.compressed = CAddonMgr::Get().GetExtValue(ext->configuration, "info@compressed") == "true"; + info.info = CAddonMgr::Get().GetExtValue(ext->configuration, "info"); + info.datadir = CAddonMgr::Get().GetExtValue(ext->configuration, "datadir"); + info.zipped = CAddonMgr::Get().GetExtValue(ext->configuration, "datadir@zip") == "true"; + info.hashes = CAddonMgr::Get().GetExtValue(ext->configuration, "hashes") == "true"; m_dirs.push_back(info); } } @@ -118,7 +105,7 @@ { } -std::string CRepository::FetchChecksum(const std::string& url) +string CRepository::FetchChecksum(const string& url) { CFile file; try @@ -142,9 +129,9 @@ } } -std::string CRepository::GetAddonHash(const AddonPtr& addon) const +string CRepository::GetAddonHash(const AddonPtr& addon) const { - std::string checksum; + string checksum; DirList::const_iterator it; for (it = m_dirs.begin();it != m_dirs.end(); ++it) if (URIUtils::IsInPath(addon->Path(), it->datadir)) @@ -153,7 +140,7 @@ { checksum = FetchChecksum(addon->Path()+".md5"); size_t pos = checksum.find_first_of(" \n"); - if (pos != std::string::npos) + if (pos != string::npos) return checksum.substr(0, pos); } return checksum; @@ -165,47 +152,29 @@ x = y; \ } - -bool CRepository::FetchIndex(const std::string& url, VECADDONS& addons) +bool CRepository::Parse(const DirInfo& dir, VECADDONS &result) { - XFILE::CCurlFile http; - http.SetContentEncoding("gzip"); - - std::string content; - if (!http.Get(url, content)) - return false; - - if (URIUtils::HasExtension(url, ".gz") - || CMime::GetFileTypeFromMime(http.GetMimeType()) == CMime::EFileType::FileTypeGZip) + string file = dir.info; + if (dir.compressed) { - CLog::Log(LOGDEBUG, "CRepository '%s' is gzip. decompressing", url.c_str()); - std::string buffer; - if (!CZipFile::DecompressGzip(content, buffer)) - return false; - content = std::move(buffer); + CURL url(dir.info); + string opts = url.GetProtocolOptions(); + if (!opts.empty()) + opts += "&"; + url.SetProtocolOptions(opts+"Encoding=gzip"); + file = url.Get(); } CXBMCTinyXML doc; - if (!doc.Parse(content) || !doc.RootElement() - || !CAddonMgr::GetInstance().AddonsFromRepoXML(doc.RootElement(), addons)) + if (doc.LoadFile(file) && doc.RootElement() && + CAddonMgr::Get().AddonsFromRepoXML(doc.RootElement(), result)) { - CLog::Log(LOGERROR, "CRepository: Failed to parse addons.xml. Malformated."); - return false; - } - return true; -} - -bool CRepository::Parse(const DirInfo& dir, VECADDONS& addons) -{ - if (!FetchIndex(dir.info, addons)) - return false; - - for (IVECADDONS i = addons.begin(); i != addons.end(); ++i) + for (IVECADDONS i = result.begin(); i != result.end(); ++i) { AddonPtr addon = *i; if (dir.zipped) { - std::string file = StringUtils::Format("%s/%s-%s.zip", addon->ID().c_str(), addon->ID().c_str(), addon->Version().asString().c_str()); + string file = StringUtils::Format("%s/%s-%s.zip", addon->ID().c_str(), addon->ID().c_str(), addon->Version().asString().c_str()); addon->Props().path = URIUtils::AddFileToFolder(dir.datadir,file); SET_IF_NOT_EMPTY(addon->Props().icon,URIUtils::AddFileToFolder(dir.datadir,addon->ID()+"/icon.png")) file = StringUtils::Format("%s/changelog-%s.txt", addon->ID().c_str(), addon->Version().asString().c_str()); @@ -220,163 +189,212 @@ SET_IF_NOT_EMPTY(addon->Props().fanart,URIUtils::AddFileToFolder(dir.datadir,addon->ID()+"/fanart.jpg")) } } - return true; + return true; + } + return false; } +void CRepository::OnPostInstall(bool update, bool modal) +{ + // force refresh of addon repositories + CAddonInstaller::Get().UpdateRepos(true, false, true); +} -CRepositoryUpdateJob::CRepositoryUpdateJob(const RepositoryPtr& repo) : m_repo(repo) {} - - -bool CRepositoryUpdateJob::DoWork() +void CRepository::OnPostUnInstall() { - CLog::Log(LOGDEBUG, "CRepositoryUpdateJob[%s] checking for updates.", m_repo->ID().c_str()); CAddonDatabase database; database.Open(); + database.DeleteRepository(ID()); - std::string oldChecksum; - if (database.GetRepoChecksum(m_repo->ID(), oldChecksum) == -1) - oldChecksum = ""; - - std::string newChecksum; - VECADDONS addons; - auto status = FetchIfChanged(oldChecksum, newChecksum, addons); - - database.SetLastChecked(m_repo->ID(), m_repo->Version(), - CDateTime::GetCurrentDateTime().GetAsDBDateTime()); - - MarkFinished(); + // force refresh of addon repositories + CAddonInstaller::Get().UpdateRepos(true, false, true); +} - if (status == STATUS_ERROR) - return false; +CRepositoryUpdateJob::CRepositoryUpdateJob(const VECADDONS &repos) + : m_repos(repos) +{ +} - if (status == STATUS_NOT_MODIFIED) +void MergeAddons(map &addons, const VECADDONS &new_addons) +{ + for (VECADDONS::const_iterator it = new_addons.begin(); it != new_addons.end(); ++it) { - CLog::Log(LOGDEBUG, "CRepositoryUpdateJob[%s] checksum not changed.", m_repo->ID().c_str()); - return true; + map::iterator existing = addons.find((*it)->ID()); + if (existing != addons.end()) + { // already got it - replace if we have a newer version + if (existing->second->Version() < (*it)->Version()) + existing->second = *it; + } + else + addons.insert(make_pair((*it)->ID(), *it)); } +} - //Invalidate art. +bool CRepositoryUpdateJob::DoWork() +{ + map addons; + for (VECADDONS::const_iterator i = m_repos.begin(); i != m_repos.end(); ++i) { - CTextureDatabase textureDB; - textureDB.Open(); - textureDB.BeginMultipleExecute(); - - for (const auto& addon : addons) - { - AddonPtr oldAddon; - if (database.GetAddon(addon->ID(), oldAddon) && addon->Version() > oldAddon->Version()) - { - if (!addon->Props().icon.empty() || !addon->Props().fanart.empty()) - CLog::Log(LOGDEBUG, "CRepository: invalidating cached art for '%s'", addon->ID().c_str()); - if (!addon->Props().icon.empty()) - textureDB.InvalidateCachedTexture(addon->Props().icon); - if (!addon->Props().fanart.empty()) - textureDB.InvalidateCachedTexture(addon->Props().fanart); - } - } - textureDB.CommitMultipleExecute(); + const RepositoryPtr repo = std::dynamic_pointer_cast(*i); + VECADDONS newAddons; + if (GrabAddons(repo, newAddons)) + MergeAddons(addons, newAddons); } + if (addons.empty()) + return true; //Nothing to do - database.AddRepository(m_repo->ID(), addons, newChecksum, m_repo->Version()); - - //Update broken status + // check for updates + CAddonDatabase database; + database.Open(); database.BeginMultipleExecute(); - for (const auto& addon : addons) - { - AddonPtr localAddon; - CAddonMgr::GetInstance().GetAddon(addon->ID(), localAddon); - if (localAddon && localAddon->Version() > addon->Version()) - //We have a newer verison locally - continue; + CTextureDatabase textureDB; + textureDB.Open(); + textureDB.BeginMultipleExecute(); + VECADDONS notifications; + for (map::const_iterator i = addons.begin(); i != addons.end(); ++i) + { + // manager told us to feck off + if (ShouldCancel(0,0)) + break; - if (database.GetAddonVersion(addon->ID()).first > addon->Version()) - //Newer version in db (ie. in a different repo) - continue; + AddonPtr newAddon = i->second; + bool deps_met = CAddonInstaller::Get().CheckDependencies(newAddon, &database); + if (!deps_met && newAddon->Props().broken.empty()) + newAddon->Props().broken = "DEPSNOTMET"; + + // invalidate the art associated with this item + if (!newAddon->Props().fanart.empty()) + textureDB.InvalidateCachedTexture(newAddon->Props().fanart); + if (!newAddon->Props().icon.empty()) + textureDB.InvalidateCachedTexture(newAddon->Props().icon); + + AddonPtr addon; + CAddonMgr::Get().GetAddon(newAddon->ID(),addon); + if (addon && newAddon->Version() > addon->Version() && + !database.IsAddonBlacklisted(newAddon->ID(),newAddon->Version().asString()) && + deps_met) + { + if (CSettings::Get().GetInt("general.addonupdates") == AUTO_UPDATES_ON) + { + string referer; + if (URIUtils::IsInternetStream(newAddon->Path())) + referer = StringUtils::Format("Referer=%s-%s.zip",addon->ID().c_str(),addon->Version().asString().c_str()); - bool depsMet = CAddonInstaller::GetInstance().CheckDependencies(addon); - if (!depsMet && addon->Props().broken.empty()) - addon->Props().broken = "DEPSNOTMET"; + if (newAddon->CanInstall(referer)) + CAddonInstaller::Get().Install(addon->ID(), true, referer); + } + else + notifications.push_back(addon); + } - if (localAddon) + // Check if we should mark the add-on as broken. We may have a newer version + // of this add-on in the database or installed - if so, we keep it unbroken. + bool haveNewer = (addon && addon->Version() > newAddon->Version()) || + database.GetAddonVersion(newAddon->ID()) > newAddon->Version(); + if (!haveNewer) { - bool brokenInDb = !database.IsAddonBroken(addon->ID()).empty(); - if (!addon->Props().broken.empty() && !brokenInDb) + if (!newAddon->Props().broken.empty()) { - //newly broken - int line = 24096; - if (addon->Props().broken == "DEPSNOTMET") - line = 24104; - if (HELPERS::ShowYesNoDialogLines(CVariant{addon->Name()}, CVariant{line}, CVariant{24097}, CVariant{""}) - == DialogResponse::YES) + if (database.IsAddonBroken(newAddon->ID()).empty()) { - CAddonMgr::GetInstance().DisableAddon(addon->ID()); + std::string line = g_localizeStrings.Get(24096); + if (newAddon->Props().broken == "DEPSNOTMET") + line = g_localizeStrings.Get(24104); + if (addon && CGUIDialogYesNo::ShowAndGetInput(newAddon->Name(), line, 24097, "")) + CAddonMgr::Get().DisableAddon(newAddon->ID()); } - - CLog::Log(LOGDEBUG, "CRepositoryUpdateJob[%s] addon '%s' marked broken. reason: \"%s\"", - m_repo->ID().c_str(), addon->ID().c_str(), addon->Props().broken.c_str()); - - CEventLog::GetInstance().Add(EventPtr(new CAddonManagementEvent(addon, 24096))); - } - else if (addon->Props().broken.empty() && brokenInDb) - { - //Unbroken - CLog::Log(LOGDEBUG, "CRepositoryUpdateJob[%s] addon '%s' unbroken", - m_repo->ID().c_str(), addon->ID().c_str()); } + database.BreakAddon(newAddon->ID(), newAddon->Props().broken); } - - //Update broken status - database.BreakAddon(addon->ID(), addon->Props().broken); } database.CommitMultipleExecute(); + textureDB.CommitMultipleExecute(); + MarkFinished(); + if (!notifications.empty() && CSettings::Get().GetBool("general.addonnotifications")) + { + if (notifications.size() == 1) + CGUIDialogKaiToast::QueueNotification(notifications[0]->Icon(), + g_localizeStrings.Get(24061), + notifications[0]->Name(),TOAST_DISPLAY_TIME,false,TOAST_DISPLAY_TIME); + else + CGUIDialogKaiToast::QueueNotification("", + g_localizeStrings.Get(24001), + g_localizeStrings.Get(24061),TOAST_DISPLAY_TIME,false,TOAST_DISPLAY_TIME); + } + return true; } -CRepositoryUpdateJob::FetchStatus CRepositoryUpdateJob::FetchIfChanged(const std::string& oldChecksum, - std::string& checksum, VECADDONS& addons) +bool CRepositoryUpdateJob::GrabAddons(const RepositoryPtr& repo, VECADDONS& addons) { - SetText(StringUtils::Format(g_localizeStrings.Get(24093).c_str(), m_repo->Name().c_str())); - const unsigned int total = m_repo->m_dirs.size() * 2; + SetText(StringUtils::Format(g_localizeStrings.Get(24093).c_str(), repo->Name().c_str())); + const unsigned int total = repo->m_dirs.size() * 2; - checksum = ""; - for (auto it = m_repo->m_dirs.cbegin(); it != m_repo->m_dirs.cend(); ++it) + if (ShouldCancel(0, total)) + return false; + + CAddonDatabase database; + database.Open(); + string oldReposum; + if (!database.GetRepoChecksum(repo->ID(), oldReposum)) + oldReposum = ""; + + string reposum; + for (CRepository::DirList::const_iterator it = repo->m_dirs.begin(); it != repo->m_dirs.end(); ++it) { + if (ShouldCancel(std::distance(repo->m_dirs.cbegin(), it), total)) + return false; if (!it->checksum.empty()) { - if (ShouldCancel(std::distance(m_repo->m_dirs.cbegin(), it), total)) - return STATUS_ERROR; - - auto dirsum = CRepository::FetchChecksum(it->checksum); + const string dirsum = CRepository::FetchChecksum(it->checksum); if (dirsum.empty()) { - CLog::Log(LOGERROR, "CRepositoryUpdateJob[%s] failed read checksum for " - "directory '%s'", m_repo->ID().c_str(), it->info.c_str()); - return STATUS_ERROR; + CLog::Log(LOGERROR, "Failed to fetch checksum for directory listing %s for repository %s. ", (*it).info.c_str(), repo->ID().c_str()); + return false; } - checksum += dirsum; + reposum += dirsum; } } - if (oldChecksum == checksum && !oldChecksum.empty()) - return STATUS_NOT_MODIFIED; - - for (auto it = m_repo->m_dirs.cbegin(); it != m_repo->m_dirs.cend(); ++it) + if (oldReposum != reposum || oldReposum.empty()) { - if (ShouldCancel(m_repo->m_dirs.size() + std::distance(m_repo->m_dirs.cbegin(), it), total)) - return STATUS_ERROR; + map uniqueAddons; + for (CRepository::DirList::const_iterator it = repo->m_dirs.begin(); it != repo->m_dirs.end(); ++it) + { + if (ShouldCancel(repo->m_dirs.size() + std::distance(repo->m_dirs.cbegin(), it), total)) + return false; + VECADDONS addons; + if (!CRepository::Parse(*it, addons)) + { //TODO: Hash is invalid and should not be saved, but should we fail? + //We can still report a partial addon listing. + CLog::Log(LOGERROR, "Failed to read directory listing %s for repository %s. ", (*it).info.c_str(), repo->ID().c_str()); + return false; + } + MergeAddons(uniqueAddons, addons); + } - VECADDONS tmp; - if (!CRepository::Parse(*it, tmp)) + bool add = true; + if (!repo->Props().libname.empty()) { - CLog::Log(LOGERROR, "CRepositoryUpdateJob[%s] failed to read or parse " - "directory '%s'", m_repo->ID().c_str(), it->info.c_str()); - return STATUS_ERROR; + CFileItemList dummy; + string s = StringUtils::Format("plugin://%s/?action=update", repo->ID().c_str()); + add = CDirectory::GetDirectory(s, dummy); + } + if (add) + { + for (map::const_iterator i = uniqueAddons.begin(); i != uniqueAddons.end(); ++i) + addons.push_back(i->second); + database.AddRepository(repo->ID(), addons, reposum, repo->Version()); } - addons.insert(addons.end(), tmp.begin(), tmp.end()); } - + else + { + CLog::Log(LOGDEBUG, "Checksum for repository %s not changed.", repo->ID().c_str()); + database.GetRepository(repo->ID(), addons); + database.SetRepoTimestamp(repo->ID(), CDateTime::GetCurrentDateTime().GetAsDBDateTime(), repo->Version()); + } SetProgress(total, total); - return STATUS_OK; + return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Repository.h kodi-15.2~git20151019.1039-final/xbmc/addons/Repository.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/Repository.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Repository.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,8 @@ namespace ADDON { + class CRepository; + typedef std::shared_ptr RepositoryPtr; class CRepository : public CAddon { public: @@ -57,35 +59,25 @@ static bool Parse(const DirInfo& dir, VECADDONS& addons); static std::string FetchChecksum(const std::string& url); + virtual void OnPostInstall(bool update, bool modal); + virtual void OnPostUnInstall(); + private: CRepository(const CRepository &rhs); - - static bool FetchIndex(const std::string& url, VECADDONS& addons); }; - typedef std::shared_ptr RepositoryPtr; - - class CRepositoryUpdateJob : public CProgressJob { public: - CRepositoryUpdateJob(const RepositoryPtr& repo); + CRepositoryUpdateJob(const VECADDONS& repos); virtual ~CRepositoryUpdateJob() {} - virtual bool DoWork(); - const RepositoryPtr& GetAddon() const { return m_repo; }; + virtual const char *GetType() const { return "repoupdate"; }; + virtual bool DoWork(); private: - enum FetchStatus - { - STATUS_OK, - STATUS_NOT_MODIFIED, - STATUS_ERROR - }; - - FetchStatus FetchIfChanged(const std::string& oldChecksum, - std::string& checksum, VECADDONS& addons); + bool GrabAddons(const RepositoryPtr& repo, VECADDONS& addons); - const RepositoryPtr m_repo; + VECADDONS m_repos; }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/RepositoryUpdater.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/RepositoryUpdater.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/RepositoryUpdater.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/RepositoryUpdater.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,200 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "RepositoryUpdater.h" -#include "Application.h" -#include "GUIUserMessages.h" -#include "addons/AddonInstaller.h" -#include "addons/AddonManager.h" -#include "dialogs/GUIDialogExtendedProgressBar.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "guilib/GUIWindowManager.h" -#include "settings/Settings.h" -#include "threads/SingleLock.h" -#include "utils/JobManager.h" -#include "utils/log.h" -#include -#include - -namespace ADDON -{ - -CRepositoryUpdater::CRepositoryUpdater() : - m_timer(this), - m_doneEvent(true) -{} - -CRepositoryUpdater &CRepositoryUpdater::GetInstance() -{ - static CRepositoryUpdater instance; - return instance; -} - -void CRepositoryUpdater::Start() -{ - ScheduleUpdate(); -} - -void CRepositoryUpdater::OnJobComplete(unsigned int jobID, bool success, CJob* job) -{ - CSingleLock lock(m_criticalSection); - m_jobs.erase(std::find(m_jobs.begin(), m_jobs.end(), job)); - if (m_jobs.empty()) - { - CLog::Log(LOGDEBUG, "CRepositoryUpdater: done."); - m_doneEvent.Set(); - - if (CSettings::GetInstance().GetInt(CSettings::SETTING_GENERAL_ADDONUPDATES) == AUTO_UPDATES_NOTIFY) - { - VECADDONS hasUpdate = CAddonMgr::GetInstance().GetOutdated(); - if (!hasUpdate.empty()) - { - if (hasUpdate.size() == 1) - CGUIDialogKaiToast::QueueNotification( - hasUpdate[0]->Icon(), hasUpdate[0]->Name(), g_localizeStrings.Get(24068), - TOAST_DISPLAY_TIME, false, TOAST_DISPLAY_TIME); - else - CGUIDialogKaiToast::QueueNotification( - "", g_localizeStrings.Get(24001), g_localizeStrings.Get(24061), - TOAST_DISPLAY_TIME, false, TOAST_DISPLAY_TIME); - } - } - - if (CSettings::GetInstance().GetInt(CSettings::SETTING_GENERAL_ADDONUPDATES) == AUTO_UPDATES_ON) - CAddonInstaller::GetInstance().InstallUpdates(); - - ScheduleUpdate(); - - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE); - g_windowManager.SendThreadMessage(msg); - } -} - -void CRepositoryUpdater::CheckForUpdates(bool showProgress) -{ - VECADDONS addons; - if (CAddonMgr::GetInstance().GetAddons(ADDON_REPOSITORY, addons) && !addons.empty()) - { - CSingleLock lock(m_criticalSection); - for (const auto& addon : addons) - CheckForUpdates(std::static_pointer_cast(addon), showProgress); - } -} - -static void SetProgressIndicator(CRepositoryUpdateJob* job) -{ - auto* dialog = static_cast(g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS)); - if (dialog) - job->SetProgressIndicators(dialog->GetHandle(g_localizeStrings.Get(24092)), nullptr); -} - -void CRepositoryUpdater::CheckForUpdates(const ADDON::RepositoryPtr& repo, bool showProgress) -{ - CSingleLock lock(m_criticalSection); - auto job = std::find_if(m_jobs.begin(), m_jobs.end(), - [&](CRepositoryUpdateJob* job){ return job->GetAddon()->ID() == repo->ID(); }); - - if (job == m_jobs.end()) - { - auto* job = new CRepositoryUpdateJob(repo); - m_jobs.push_back(job); - m_doneEvent.Reset(); - if (showProgress) - SetProgressIndicator(job); - CJobManager::GetInstance().AddJob(job, this, CJob::PRIORITY_LOW); - } - else - { - if (showProgress && !(*job)->HasProgressIndicator()) - SetProgressIndicator(*job); - } -} - -void CRepositoryUpdater::Await() -{ - m_doneEvent.Wait(); -} - -void CRepositoryUpdater::OnTimeout() -{ - //workaround - if (g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO || - g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) - { - CLog::Log(LOGDEBUG,"CRepositoryUpdater: busy playing. postponing scheduled update"); - m_timer.RestartAsync(2 * 60 * 1000); - return; - } - - CLog::Log(LOGDEBUG,"CRepositoryUpdater: running scheduled update"); - CheckForUpdates(); -} - -void CRepositoryUpdater::OnSettingChanged(const CSetting* setting) -{ - if (setting->GetId() == CSettings::SETTING_GENERAL_ADDONUPDATES) - ScheduleUpdate(); -} - -CDateTime CRepositoryUpdater::LastUpdated() const -{ - VECADDONS repos; - if (!CAddonMgr::GetInstance().GetAddons(ADDON_REPOSITORY, repos) || repos.empty()) - return CDateTime(); - - CAddonDatabase db; - db.Open(); - std::vector updateTimes; - std::transform(repos.begin(), repos.end(), std::back_inserter(updateTimes), - [&](const AddonPtr& repo) - { - auto lastCheck = db.LastChecked(repo->ID()); - if (lastCheck.first.IsValid() && lastCheck.second == repo->Version()) - return lastCheck.first; - return CDateTime(); - }); - - return *std::min_element(updateTimes.begin(), updateTimes.end()); -} - -void CRepositoryUpdater::ScheduleUpdate() -{ - const CDateTimeSpan interval(0, 24, 0, 0); - - CSingleLock lock(m_criticalSection); - m_timer.Stop(true); - - if (CSettings::GetInstance().GetInt(CSettings::SETTING_GENERAL_ADDONUPDATES) == AUTO_UPDATES_NEVER) - return; - - if (!CAddonMgr::GetInstance().HasAddons(ADDON_REPOSITORY)) - return; - - auto prev = LastUpdated(); - auto next = std::max(CDateTime::GetCurrentDateTime(), prev + interval); - int delta = std::max(1, (next - CDateTime::GetCurrentDateTime()).GetSecondsTotal() * 1000); - - CLog::Log(LOGDEBUG,"CRepositoryUpdater: previous update at %s, next at %s", - prev.GetAsLocalizedDateTime().c_str(), next.GetAsLocalizedDateTime().c_str()); - - if (!m_timer.Start(delta)) - CLog::Log(LOGERROR,"CRepositoryUpdater: failed to start timer"); -} -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/RepositoryUpdater.h kodi-15.2~git20151019.1039-final/xbmc/addons/RepositoryUpdater.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/RepositoryUpdater.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/RepositoryUpdater.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "addons/Repository.h" -#include "dialogs/GUIDialogExtendedProgressBar.h" -#include "threads/CriticalSection.h" -#include "threads/Timer.h" -#include "XBDateTime.h" -#include - -namespace ADDON -{ - -class CRepositoryUpdater : private ITimerCallback, private IJobCallback, public ISettingCallback -{ -public: - static CRepositoryUpdater& GetInstance(); - - virtual ~CRepositoryUpdater() {} - - void Start(); - - /** - * Check a single repository for updates. - */ - void CheckForUpdates(const ADDON::RepositoryPtr& repo, bool showProgress=false); - - /** - * Check all repositories for updates. - */ - void CheckForUpdates(bool showProgress=false); - - /** - * Wait for any pending/in-progress updates to complete. - */ - void Await(); - - /** - * Schedule an automatic update to run based on settings and previous update - * times. May be called when there are external changes this updater must know - * about. Any previously scheduled update will be cancelled. - */ - void ScheduleUpdate(); - - /** - * Returns the time of the last check (oldest). Invalid time if never checked. - */ - CDateTime LastUpdated() const; - - virtual void OnSettingChanged(const CSetting* setting) override; - -private: - CRepositoryUpdater(); - CRepositoryUpdater(const CRepositoryUpdater&) = delete; - CRepositoryUpdater(CRepositoryUpdater&&) = delete; - CRepositoryUpdater& operator=(const CRepositoryUpdater&) = delete; - CRepositoryUpdater& operator=(CRepositoryUpdater&&) = delete; - - virtual void OnJobComplete(unsigned int jobID, bool success, CJob *job) override; - - virtual void OnTimeout() override; - - CCriticalSection m_criticalSection; - CTimer m_timer; - CEvent m_doneEvent; - std::vector m_jobs; -}; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Resource.h kodi-15.2~git20151019.1039-final/xbmc/addons/Resource.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/Resource.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Resource.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,7 +22,6 @@ #include #include "addons/Addon.h" -#include "utils/URIUtils.h" namespace ADDON { @@ -36,11 +35,6 @@ virtual bool IsAllowed(const std::string &file) const = 0; - virtual std::string GetFullPath(const std::string &filePath) const - { - return URIUtils::AddFileToFolder(GetResourcePath(), filePath); - } - protected: CResource(const AddonProps &props) : CAddon(props) @@ -51,11 +45,6 @@ CResource(const CResource &rhs) : CAddon(rhs) { } - - std::string GetResourcePath() const - { - return URIUtils::AddFileToFolder(Path(), "resources"); - } }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Scraper.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/Scraper.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/Scraper.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Scraper.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -44,6 +44,7 @@ #include #include +using namespace std; using namespace XFILE; using namespace MUSIC_GRABBER; using namespace VIDEO; @@ -129,9 +130,9 @@ { if (ext) { - m_language = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@language"); - m_requiressettings = CAddonMgr::GetInstance().GetExtValue(ext->configuration,"@requiressettings") == "true"; - std::string persistence = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@cachepersistence"); + m_language = CAddonMgr::Get().GetExtValue(ext->configuration, "@language"); + m_requiressettings = CAddonMgr::Get().GetExtValue(ext->configuration,"@requiressettings") == "true"; + std::string persistence = CAddonMgr::Get().GetExtValue(ext->configuration, "@cachepersistence"); if (!persistence.empty()) m_persistence.SetFromTimeString(persistence); } @@ -198,7 +199,7 @@ if (!LoadSettings()) return ""; - std::stringstream stream; + stringstream stream; CXBMCTinyXML doc; SettingsToXML(doc); if (doc.RootElement()) @@ -237,10 +238,10 @@ // is XML output by chained functions, possibly recursively // the CCurlFile object is passed in so that URL fetches can be canceled from other threads // throws CScraperError abort on internal failures (e.g., parse errors) -std::vector CScraper::Run(const std::string& function, - const CScraperUrl& scrURL, - CCurlFile& http, - const std::vector* extras) +vector CScraper::Run(const std::string& function, + const CScraperUrl& scrURL, + CCurlFile& http, + const vector* extras) { if (!Load()) throw CScraperError(); @@ -264,7 +265,7 @@ throw CScraperError(); } - std::vector result; + vector result; result.push_back(strXML); TiXmlElement* xchain = doc.RootElement()->FirstChildElement(); // skip children of the root element until or @@ -277,7 +278,7 @@ if (szFunction) { CScraperUrl scrURL2; - std::vector extras; + vector extras; // for , pass the contained text as a parameter; for , as URL content if (strcmp(xchain->Value(),"chain")==0) { @@ -292,7 +293,7 @@ // url or the parameters to a chain, we can safely clear it here // to fix this issue m_parser.m_param[0].clear(); - std::vector result2 = RunNoThrow(szFunction,scrURL2,http,&extras); + vector result2 = RunNoThrow(szFunction,scrURL2,http,&extras); result.insert(result.end(),result2.begin(),result2.end()); } xchain = xchain->NextSiblingElement(); @@ -306,12 +307,12 @@ // just like Run, but returns an empty list instead of throwing in case of error // don't use in new code; errors should be handled appropriately -std::vector CScraper::RunNoThrow(const std::string& function, +vector CScraper::RunNoThrow(const std::string& function, const CScraperUrl& url, XFILE::CCurlFile& http, - const std::vector* extras) + const vector* extras) { - std::vector vcs; + vector vcs; try { vcs = Run(function, url, http, extras); @@ -326,7 +327,7 @@ std::string CScraper::InternalRun(const std::string& function, const CScraperUrl& scrURL, CCurlFile& http, - const std::vector* extras) + const vector* extras) { // walk the list of input URLs and fetch each into parser parameters unsigned int i; @@ -369,7 +370,7 @@ bool bOptional = itr->second.second; - if (CAddonMgr::GetInstance().GetAddon((*itr).first, dep)) + if (CAddonMgr::Get().GetAddon((*itr).first, dep)) { CXBMCTinyXML doc; if (dep->Type() == ADDON_SCRAPER_LIBRARY && doc.LoadFile(dep->LibPath())) @@ -427,11 +428,11 @@ return scurlRet; // scraper function takes contents of .nfo file, returns XML (see below) - std::vector vcsIn; + vector vcsIn; vcsIn.push_back(sNfoContent); CScraperUrl scurl; CCurlFile fcurl; - std::vector vcsOut = Run("NfoUrl", scurl, fcurl, &vcsIn); + vector vcsOut = Run("NfoUrl", scurl, fcurl, &vcsIn); if (vcsOut.empty() || vcsOut[0].empty()) return scurlRet; if (vcsOut.size() > 1) @@ -489,11 +490,11 @@ CScraperUrl scurlRet; // scraper function takes an external ID, returns XML (see below) - std::vector vcsIn; + vector vcsIn; vcsIn.push_back(externalID); CScraperUrl scurl; CCurlFile fcurl; - std::vector vcsOut = Run("ResolveIDToUrl", scurl, fcurl, &vcsIn); + vector vcsOut = Run("ResolveIDToUrl", scurl, fcurl, &vcsIn); if (vcsOut.empty() || vcsOut[0].empty()) return scurlRet; if (vcsOut.size() > 1) @@ -572,7 +573,7 @@ if (!fFirst) StringUtils::Replace(sTitle, '-',' '); - std::vector vcsIn(1); + vector vcsIn(1); g_charsetConverter.utf8To(SearchStringEncoding(), sTitle, vcsIn[0]); vcsIn[0] = CURL::Encode(vcsIn[0]); if (fFirst && !sYear.empty()) @@ -580,7 +581,7 @@ // request a search URL from the title/filename/etc. CScraperUrl scurl; - std::vector vcsOut = Run("CreateSearchUrl", scurl, fcurl, &vcsIn); + vector vcsOut = Run("CreateSearchUrl", scurl, fcurl, &vcsIn); if (vcsOut.empty()) { CLog::Log(LOGDEBUG, "%s: CreateSearchUrl failed", __FUNCTION__); @@ -596,7 +597,7 @@ bool fSort(true); std::set stsDupeCheck; bool fResults(false); - for (std::vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) + for (vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) { CXBMCTinyXML doc; doc.Parse(*i, TIXML_ENCODING_UTF8); @@ -697,13 +698,13 @@ // scraper function is given the album and artist as parameters and // returns an XML element parseable by CScraperUrl - std::vector extras(2); + std::vector extras(2); g_charsetConverter.utf8To(SearchStringEncoding(), sAlbum, extras[0]); g_charsetConverter.utf8To(SearchStringEncoding(), sArtist, extras[1]); extras[0] = CURL::Encode(extras[0]); extras[1] = CURL::Encode(extras[1]); CScraperUrl scurl; - std::vector vcsOut = RunNoThrow("CreateAlbumSearchUrl", scurl, fcurl, &extras); + vector vcsOut = RunNoThrow("CreateAlbumSearchUrl", scurl, fcurl, &extras); if (vcsOut.size() > 1) CLog::Log(LOGWARNING, "%s: scraper returned multiple results; using first", __FUNCTION__); @@ -726,7 +727,7 @@ vcsOut = RunNoThrow("GetAlbumSearchResults", scurl, fcurl); // parse the returned XML into a vector of album objects - for (std::vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) + for (vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) { CXBMCTinyXML doc; doc.Parse(*i, TIXML_ENCODING_UTF8); @@ -794,11 +795,11 @@ // scraper function is given the artist as parameter and // returns an XML element parseable by CScraperUrl - std::vector extras(1); + std::vector extras(1); g_charsetConverter.utf8To(SearchStringEncoding(), sArtist, extras[0]); extras[0] = CURL::Encode(extras[0]); CScraperUrl scurl; - std::vector vcsOut = RunNoThrow("CreateArtistSearchUrl", scurl, fcurl, &extras); + vector vcsOut = RunNoThrow("CreateArtistSearchUrl", scurl, fcurl, &extras); if (vcsOut.empty() || vcsOut[0].empty()) return vcari; @@ -818,7 +819,7 @@ vcsOut = RunNoThrow("GetArtistSearchResults", scurl, fcurl); // parse the returned XML into a vector of artist objects - for (std::vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) + for (vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) { CXBMCTinyXML doc; doc.Parse(*i, TIXML_ENCODING_UTF8); @@ -871,12 +872,12 @@ scurl.m_url[0].m_url.c_str(), Name().c_str(), Path().c_str(), ADDON::TranslateContent(Content()).c_str(), Version().asString().c_str()); - std::vector vcsIn; + vector vcsIn; vcsIn.push_back(scurl.m_url[0].m_url); - std::vector vcsOut = RunNoThrow("GetEpisodeList", scurl, fcurl, &vcsIn); + vector vcsOut = RunNoThrow("GetEpisodeList", scurl, fcurl, &vcsIn); // parse the XML response - for (std::vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) + for (vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) { CXBMCTinyXML doc; doc.Parse(*i); @@ -935,14 +936,14 @@ video.Reset(); std::string sFunc = fMovie ? "GetDetails" : "GetEpisodeDetails"; - std::vector vcsIn; + vector vcsIn; vcsIn.push_back(scurl.strId); vcsIn.push_back(scurl.m_url[0].m_url); - std::vector vcsOut = RunNoThrow(sFunc, scurl, fcurl, &vcsIn); + vector vcsOut = RunNoThrow(sFunc, scurl, fcurl, &vcsIn); // parse XML output bool fRet(false); - for (std::vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) + for (vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) { CXBMCTinyXML doc; doc.Parse(*i, TIXML_ENCODING_UTF8); @@ -973,11 +974,11 @@ scurl.m_url[0].m_url.c_str(), Name().c_str(), Path().c_str(), ADDON::TranslateContent(Content()).c_str(), Version().asString().c_str()); - std::vector vcsOut = RunNoThrow("GetAlbumDetails", scurl, fcurl); + vector vcsOut = RunNoThrow("GetAlbumDetails", scurl, fcurl); // parse the returned XML into an album object (see CAlbum::Load for details) bool fRet(false); - for (std::vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) + for (vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) { CXBMCTinyXML doc; doc.Parse(*i, TIXML_ENCODING_UTF8); @@ -1005,15 +1006,15 @@ ADDON::TranslateContent(Content()).c_str(), Version().asString().c_str()); // pass in the original search string for chaining to search other sites - std::vector vcIn; + vector vcIn; vcIn.push_back(sSearch); vcIn[0] = CURL::Encode(vcIn[0]); - std::vector vcsOut = RunNoThrow("GetArtistDetails", scurl, fcurl, &vcIn); + vector vcsOut = RunNoThrow("GetArtistDetails", scurl, fcurl, &vcIn); // ok, now parse the xml file bool fRet(false); - for (std::vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) + for (vector::const_iterator i = vcsOut.begin(); i != vcsOut.end(); ++i) { CXBMCTinyXML doc; doc.Parse(*i, TIXML_ENCODING_UTF8); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/ScreenSaver.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/ScreenSaver.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/ScreenSaver.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/ScreenSaver.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,14 +20,13 @@ #include "ScreenSaver.h" #include "guilib/GraphicContext.h" #include "interfaces/generic/ScriptInvocationManager.h" -#include "settings/Settings.h" #include "utils/AlarmClock.h" #include "windowing/WindowingFactory.h" // What sound does a python screensaver make? #define SCRIPT_ALARM "sssssscreensaver" -#define SCRIPT_TIMEOUT 15 // seconds +#define SCRIPT_TIMEOUT 5 // seconds namespace ADDON { @@ -43,20 +42,15 @@ return AddonPtr(new CScreenSaver(*this)); } -bool CScreenSaver::IsInUse() const -{ - return CSettings::GetInstance().GetString(CSettings::SETTING_SCREENSAVER_MODE) == ID(); -} - bool CScreenSaver::CreateScreenSaver() { - if (CScriptInvocationManager::GetInstance().HasLanguageInvoker(LibPath())) + if (CScriptInvocationManager::Get().HasLanguageInvoker(LibPath())) { // Don't allow a previously-scheduled alarm to kill our new screensaver g_alarmClock.Stop(SCRIPT_ALARM, true); - if (!CScriptInvocationManager::GetInstance().Stop(LibPath())) - CScriptInvocationManager::GetInstance().ExecuteAsync(LibPath(), Clone()); + if (!CScriptInvocationManager::Get().Stop(LibPath())) + CScriptInvocationManager::Get().ExecuteAsync(LibPath(), Clone()); return true; } // pass it the screen width,height @@ -66,7 +60,7 @@ m_pInfo = new SCR_PROPS; #ifdef HAS_DX - m_pInfo->device = g_Windowing.Get3D11Context(); + m_pInfo->device = g_Windowing.Get3DDevice(); #else m_pInfo->device = NULL; #endif @@ -108,10 +102,6 @@ #ifdef HAS_PYTHON if (URIUtils::HasExtension(LibPath(), ".py")) { - /* FIXME: This is a hack but a proper fix is non-trivial. Basically this code - * makes sure the addon gets terminated after we've moved out of the screensaver window. - * If we don't do this, we may simply lockup. - */ g_alarmClock.Start(SCRIPT_ALARM, SCRIPT_TIMEOUT, "StopScript(" + LibPath() + ")", true, false); return; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/ScreenSaver.h kodi-15.2~git20151019.1039-final/xbmc/addons/ScreenSaver.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/ScreenSaver.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/ScreenSaver.h 2015-10-19 08:39:16.000000000 +0000 @@ -35,7 +35,6 @@ CScreenSaver(const char *addonID); virtual ~CScreenSaver() {} virtual AddonPtr Clone() const; - virtual bool IsInUse() const; // Things that MUST be supplied by the child classes bool CreateScreenSaver(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Service.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/Service.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/Service.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Service.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,6 +23,8 @@ #include "utils/log.h" #include "system.h" +using namespace std; + namespace ADDON { @@ -31,7 +33,7 @@ { BuildServiceType(); - std::string start = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@start"); + std::string start = CAddonMgr::Get().GetExtValue(ext->configuration, "@start"); if (start == "startup") m_startOption = STARTUP; } @@ -55,7 +57,7 @@ { #ifdef HAS_PYTHON case PYTHON: - ret = (CScriptInvocationManager::GetInstance().ExecuteAsync(LibPath(), this->shared_from_this()) != -1); + ret = (CScriptInvocationManager::Get().ExecuteAsync(LibPath(), this->shared_from_this()) != -1); break; #endif @@ -76,7 +78,7 @@ { #ifdef HAS_PYTHON case PYTHON: - ret = CScriptInvocationManager::GetInstance().Stop(LibPath()); + ret = CScriptInvocationManager::Get().Stop(LibPath()); break; #endif @@ -95,7 +97,7 @@ std::string ext; size_t p = str.find_last_of('.'); - if (p != std::string::npos) + if (p != string::npos) ext = str.substr(p + 1); #ifdef HAS_PYTHON diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Skin.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/Skin.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/Skin.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Skin.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,117 +22,29 @@ #include "AddonManager.h" #include "Util.h" #include "dialogs/GUIDialogKaiToast.h" -// fallback for new skin resolution code -#include "filesystem/Directory.h" +#include "dialogs/GUIDialogYesNo.h" #include "filesystem/File.h" #include "filesystem/SpecialProtocol.h" #include "guilib/GUIWindowManager.h" #include "guilib/WindowIDs.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" #include "settings/Settings.h" #include "settings/lib/Setting.h" +#include "utils/URIUtils.h" #include "utils/log.h" #include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "utils/XMLUtils.h" -#include "utils/Variant.h" +#include "ApplicationMessenger.h" -#define XML_SETTINGS "settings" -#define XML_SETTING "setting" -#define XML_ATTR_TYPE "type" -#define XML_ATTR_NAME "name" -#define XML_ATTR_ID "id" +// fallback for new skin resolution code +#include "filesystem/Directory.h" +using namespace std; using namespace XFILE; -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; std::shared_ptr g_SkinInfo; namespace ADDON { -bool CSkinSetting::Serialize(TiXmlElement* parent) const -{ - if (parent == nullptr) - return false; - - TiXmlElement setting(XML_SETTING); - setting.SetAttribute(XML_ATTR_ID, name.c_str()); - setting.SetAttribute(XML_ATTR_TYPE, GetType()); - - if (!SerializeSetting(&setting)) - return false; - - parent->InsertEndChild(setting); - - return true; -} - -bool CSkinSetting::Deserialize(const TiXmlElement* element) -{ - if (element == nullptr) - return false; - - name = XMLUtils::GetAttribute(element, XML_ATTR_ID); - - // backwards compatibility for guisettings.xml - if (name.empty()) - name = XMLUtils::GetAttribute(element, XML_ATTR_NAME); - - return true; -} - -bool CSkinSettingString::Deserialize(const TiXmlElement* element) -{ - value.clear(); - - if (!CSkinSetting::Deserialize(element)) - return false; - - if (element->FirstChild() != nullptr) - value = element->FirstChild()->Value(); - - return true; -} - -bool CSkinSettingString::SerializeSetting(TiXmlElement* element) const -{ - if (element == nullptr) - return false; - - TiXmlText xmlValue(value); - element->InsertEndChild(xmlValue); - - return true; -} - -bool CSkinSettingBool::Deserialize(const TiXmlElement* element) -{ - value = false; - - if (!CSkinSetting::Deserialize(element)) - return false; - - if (element->FirstChild() != nullptr) - value = StringUtils::EqualsNoCase(element->FirstChild()->ValueStr(), "true"); - - return true; -} - -bool CSkinSettingBool::SerializeSetting(TiXmlElement* element) const -{ - if (element == nullptr) - return false; - - TiXmlText xmlValue(value ? "true" : "false"); - element->InsertEndChild(xmlValue); - - return true; -} - CSkinInfo::CSkinInfo(const AddonProps &props, const RESOLUTION_INFO &resolution) : CAddon(props), m_defaultRes(resolution), m_version(""), m_effectsSlowDown(1.f), m_debugging(false) { @@ -142,17 +54,17 @@ : CAddon(ext), m_version(""), m_effectsSlowDown(1.f) { ELEMENTS elements; - if (CAddonMgr::GetInstance().GetExtElements(ext->configuration, "res", elements)) + if (CAddonMgr::Get().GetExtElements(ext->configuration, "res", elements)) { for (ELEMENTS::iterator i = elements.begin(); i != elements.end(); ++i) { - int width = atoi(CAddonMgr::GetInstance().GetExtValue(*i, "@width").c_str()); - int height = atoi(CAddonMgr::GetInstance().GetExtValue(*i, "@height").c_str()); - bool defRes = CAddonMgr::GetInstance().GetExtValue(*i, "@default") == "true"; - std::string folder = CAddonMgr::GetInstance().GetExtValue(*i, "@folder"); + int width = atoi(CAddonMgr::Get().GetExtValue(*i, "@width").c_str()); + int height = atoi(CAddonMgr::Get().GetExtValue(*i, "@height").c_str()); + bool defRes = CAddonMgr::Get().GetExtValue(*i, "@default") == "true"; + std::string folder = CAddonMgr::Get().GetExtValue(*i, "@folder"); float aspect = 0; - std::string strAspect = CAddonMgr::GetInstance().GetExtValue(*i, "@aspect"); - std::vector fracs = StringUtils::Split(strAspect, ':'); + std::string strAspect = CAddonMgr::Get().GetExtValue(*i, "@aspect"); + vector fracs = StringUtils::Split(strAspect, ':'); if (fracs.size() == 2) aspect = (float)(atof(fracs[0].c_str())/atof(fracs[1].c_str())); if (width > 0 && height > 0) @@ -167,17 +79,17 @@ } else { // no resolutions specified -> backward compatibility - std::string defaultWide = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@defaultwideresolution"); + std::string defaultWide = CAddonMgr::Get().GetExtValue(ext->configuration, "@defaultwideresolution"); if (defaultWide.empty()) - defaultWide = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@defaultresolution"); + defaultWide = CAddonMgr::Get().GetExtValue(ext->configuration, "@defaultresolution"); TranslateResolution(defaultWide, m_defaultRes); } - std::string str = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@effectslowdown"); + std::string str = CAddonMgr::Get().GetExtValue(ext->configuration, "@effectslowdown"); if (!str.empty()) m_effectsSlowDown = (float)atof(str.c_str()); - m_debugging = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@debugging") == "true"; + m_debugging = CAddonMgr::Get().GetExtValue(ext->configuration, "@debugging") == "true"; LoadStartupWindows(ext); @@ -212,9 +124,6 @@ void CSkinInfo::Start() { - if (!LoadUserSettings()) - CLog::Log(LOGWARNING, "CSkinInfo: failed to load skin settings"); - if (!m_resolutions.size()) { // try falling back to whatever resolutions exist in the directory CFileItemList items; @@ -290,9 +199,9 @@ int CSkinInfo::GetStartWindow() const { - int windowID = CSettings::GetInstance().GetInt(CSettings::SETTING_LOOKANDFEEL_STARTUPWINDOW); + int windowID = CSettings::Get().GetInt("lookandfeel.startupwindow"); assert(m_startupWindows.size()); - for (std::vector::const_iterator it = m_startupWindows.begin(); it != m_startupWindows.end(); ++it) + for (vector::const_iterator it = m_startupWindows.begin(); it != m_startupWindows.end(); ++it) { if (windowID == (*it).m_id) return windowID; @@ -358,7 +267,7 @@ bool CSkinInfo::IsInUse() const { // Could extend this to prompt for reverting to the standard skin perhaps - return CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKIN) == ID(); + return CSettings::Get().GetString("lookandfeel.skin") == ID(); } const INFO::CSkinVariableString* CSkinInfo::CreateSkinVariable(const std::string& name, int context) @@ -369,13 +278,12 @@ void CSkinInfo::OnPreInstall() { if (IsInUse()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "UnloadSkin"); + CApplicationMessenger::Get().ExecBuiltIn("UnloadSkin", true); } void CSkinInfo::OnPostInstall(bool update, bool modal) { - if (IsInUse() || (!update && !modal && - HELPERS::ShowYesNoDialogText(CVariant{Name()}, CVariant{24099}) == DialogResponse::YES)) + if (IsInUse() || (!update && !modal && CGUIDialogYesNo::ShowAndGetInput(Name(), 24099))) { CGUIDialogKaiToast *toast = (CGUIDialogKaiToast *)g_windowManager.GetWindow(WINDOW_DIALOG_KAI_TOAST); if (toast) @@ -383,10 +291,10 @@ toast->ResetTimer(); toast->Close(true); } - if (CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKIN) == ID()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "ReloadSkin"); + if (CSettings::Get().GetString("lookandfeel.skin") == ID()) + CApplicationMessenger::Get().ExecBuiltIn("ReloadSkin", true); else - CSettings::GetInstance().SetString(CSettings::SETTING_LOOKANDFEEL_SKIN, ID()); + CSettings::Get().SetString("lookandfeel.skin", ID()); } } @@ -402,11 +310,11 @@ // any other *.xml files are additional color themes on top of this one. // add the default label - list.push_back(std::make_pair(g_localizeStrings.Get(15109), "SKINDEFAULT")); // the standard defaults.xml will be used! + list.push_back(make_pair(g_localizeStrings.Get(15109), "SKINDEFAULT")); // the standard defaults.xml will be used! // Search for colors in the Current skin! - std::vector vecColors; - std::string strPath = URIUtils::AddFileToFolder(g_SkinInfo->Path(), "colors"); + vector vecColors; + string strPath = URIUtils::AddFileToFolder(g_SkinInfo->Path(), "colors"); CFileItemList items; CDirectory::GetDirectory(CSpecialProtocol::TranslatePathConvertCase(strPath), items, ".xml"); @@ -424,7 +332,7 @@ list.push_back(make_pair(vecColors[i], vecColors[i])); // try to find the best matching value - for (std::vector< std::pair >::const_iterator it = list.begin(); it != list.end(); ++it) + for (vector< pair >::const_iterator it = list.begin(); it != list.end(); ++it) { if (StringUtils::EqualsNoCase(it->second, settingValue)) current = settingValue; @@ -459,9 +367,9 @@ if (idAttr != NULL) { if (idLocAttr) - list.push_back(std::make_pair(g_localizeStrings.Get(atoi(idLocAttr)), idAttr)); + list.push_back(make_pair(g_localizeStrings.Get(atoi(idLocAttr)), idAttr)); else - list.push_back(std::make_pair(idAttr, idAttr)); + list.push_back(make_pair(idAttr, idAttr)); if (StringUtils::EqualsNoCase(idAttr, settingValue)) currentValueSet = true; @@ -480,6 +388,50 @@ current = list[0].second; } +void CSkinInfo::SettingOptionsSkinSoundFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) +{ + std::string settingValue = ((const CSettingString*)setting)->GetValue(); + current = "SKINDEFAULT"; + + list.push_back(make_pair(g_localizeStrings.Get(474), "OFF")); + + if (CDirectory::Exists(URIUtils::AddFileToFolder(g_SkinInfo->Path(), "sounds"))) + list.push_back(make_pair(g_localizeStrings.Get(15106), "SKINDEFAULT")); + + ADDON::VECADDONS addons; + if (ADDON::CAddonMgr::Get().GetAddons(ADDON::ADDON_RESOURCE_UISOUNDS, addons)) + { + for (const auto& addon : addons) + list.push_back(make_pair(addon->Name(), addon->ID())); + } + + //Add sounds from special directories + CFileItemList items; + CDirectory::GetDirectory("special://xbmc/sounds/", items); + CDirectory::GetDirectory("special://home/sounds/", items); + for (int i = 0; i < items.Size(); i++) + { + CFileItemPtr pItem = items[i]; + if (pItem->m_bIsFolder) + { + if (StringUtils::EqualsNoCase(pItem->GetLabel(), ".svn") || + StringUtils::EqualsNoCase(pItem->GetLabel(), "fonts") || + StringUtils::EqualsNoCase(pItem->GetLabel(), "media")) + continue; + list.push_back(make_pair(pItem->GetLabel(), pItem->GetLabel())); + } + } + + sort(list.begin() + 2, list.end()); + + // try to find the best matching value + for (vector< pair >::const_iterator it = list.begin(); it != list.end(); ++it) + { + if (StringUtils::EqualsNoCase(it->second, settingValue)) + current = settingValue; + } +} + void CSkinInfo::SettingOptionsSkinThemesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) { // get the choosen theme and remove the extension from the current theme (backward compat) @@ -494,7 +446,7 @@ list.push_back(make_pair(g_localizeStrings.Get(15109), "SKINDEFAULT")); // the standard Textures.xpr/xbt will be used // search for themes in the current skin! - std::vector vecTheme; + vector vecTheme; CUtil::GetSkinThemes(vecTheme); // sort the themes for GUI and list them @@ -502,7 +454,7 @@ list.push_back(make_pair(vecTheme[i], vecTheme[i])); // try to find the best matching value - for (std::vector< std::pair >::const_iterator it = list.begin(); it != list.end(); ++it) + for (vector< pair >::const_iterator it = list.begin(); it != list.end(); ++it) { if (StringUtils::EqualsNoCase(it->second, settingValue)) current = settingValue; @@ -514,11 +466,11 @@ int settingValue = ((const CSettingInt *)setting)->GetValue(); current = -1; - const std::vector &startupWindows = g_SkinInfo->GetStartupWindows(); + const vector &startupWindows = g_SkinInfo->GetStartupWindows(); - for (std::vector::const_iterator it = startupWindows.begin(); it != startupWindows.end(); ++it) + for (vector::const_iterator it = startupWindows.begin(); it != startupWindows.end(); ++it) { - std::string windowName = it->m_name; + string windowName = it->m_name; if (StringUtils::IsNaturalNumber(windowName)) windowName = g_localizeStrings.Get(atoi(windowName.c_str())); int windowID = it->m_id; @@ -534,224 +486,4 @@ current = list[0].second; } -void CSkinInfo::ToggleDebug() -{ - m_debugging = !m_debugging; -} - -int CSkinInfo::TranslateString(const std::string &setting) -{ - // run through and see if we have this setting - for (const auto& it : m_strings) - { - if (StringUtils::EqualsNoCase(setting, it.second->name)) - return it.first; - } - - // didn't find it - insert it - CSkinSettingStringPtr skinString(new CSkinSettingString()); - skinString->name = setting; - - int number = m_bools.size() + m_strings.size(); - m_strings.insert(std::pair(number, skinString)); - - return number; -} - -const std::string& CSkinInfo::GetString(int setting) const -{ - const auto& it = m_strings.find(setting); - if (it != m_strings.end()) - return it->second->value; - - return StringUtils::Empty; -} - -void CSkinInfo::SetString(int setting, const std::string &label) -{ - auto&& it = m_strings.find(setting); - if (it != m_strings.end()) - { - it->second->value = label; - return; - } - - CLog::Log(LOGFATAL, "%s: unknown setting (%d) requested", __FUNCTION__, setting); - assert(false); -} - -int CSkinInfo::TranslateBool(const std::string &setting) -{ - // run through and see if we have this setting - for (const auto& it : m_bools) - { - if (StringUtils::EqualsNoCase(setting, it.second->name)) - return it.first; - } - - // didn't find it - insert it - CSkinSettingBoolPtr skinBool(new CSkinSettingBool()); - skinBool->name = setting; - - int number = m_bools.size() + m_strings.size(); - m_bools.insert(std::pair(number, skinBool)); - - return number; -} - -bool CSkinInfo::GetBool(int setting) const -{ - const auto& it = m_bools.find(setting); - if (it != m_bools.end()) - return it->second->value; - - // default is to return false - return false; -} - -void CSkinInfo::SetBool(int setting, bool set) -{ - auto&& it = m_bools.find(setting); - if (it != m_bools.end()) - { - it->second->value = set; - return; - } - - CLog::Log(LOGFATAL, "%s: unknown setting (%d) requested", __FUNCTION__, setting); - assert(false); -} - -void CSkinInfo::Reset(const std::string &setting) -{ - // run through and see if we have this setting as a string - for (auto& it : m_strings) - { - if (StringUtils::EqualsNoCase(setting, it.second->name)) - { - it.second->value.clear(); - return; - } - } - - // and now check for the skin bool - for (auto& it : m_bools) - { - if (StringUtils::EqualsNoCase(setting, it.second->name)) - { - it.second->value = false; - return; - } - } -} - -void CSkinInfo::Reset() -{ - // clear all the settings and strings from this skin. - for (auto& it : m_bools) - it.second->value = false; - - for (auto& it : m_strings) - it.second->value.clear(); -} - -std::set CSkinInfo::ParseSettings(const TiXmlElement* rootElement) -{ - std::set settings; - if (rootElement == nullptr) - return settings; - - const TiXmlElement *settingElement = rootElement->FirstChildElement(XML_SETTING); - while (settingElement != nullptr) - { - CSkinSettingPtr setting = ParseSetting(settingElement); - if (setting != nullptr) - settings.insert(setting); - - settingElement = settingElement->NextSiblingElement(XML_SETTING); - } - - return settings; -} - -CSkinSettingPtr CSkinInfo::ParseSetting(const TiXmlElement* element) -{ - if (element == nullptr) - return CSkinSettingPtr(); - - std::string settingType = XMLUtils::GetAttribute(element, XML_ATTR_TYPE); - CSkinSettingPtr setting; - if (settingType == "string") - setting = CSkinSettingPtr(new CSkinSettingString()); - else if (settingType == "bool") - setting = CSkinSettingPtr(new CSkinSettingBool()); - else - return CSkinSettingPtr(); - - if (setting == nullptr) - return CSkinSettingPtr(); - - if (!setting->Deserialize(element)) - return CSkinSettingPtr(); - - return setting; -} - -bool CSkinInfo::HasSettingsToSave() const -{ - return !m_strings.empty() || !m_bools.empty(); -} - -bool CSkinInfo::SettingsFromXML(const CXBMCTinyXML &doc, bool loadDefaults /* = false */) -{ - const TiXmlElement *rootElement = doc.RootElement(); - if (rootElement == nullptr || rootElement->ValueStr().compare(XML_SETTINGS) != 0) - { - CLog::Log(LOGWARNING, "CSkinInfo: no tag found"); - return false; - } - - m_strings.clear(); - m_bools.clear(); - - int number = 0; - std::set settings = ParseSettings(rootElement); - for (const auto& setting : settings) - { - if (setting->GetType() == "string") - m_strings.insert(std::pair(number++, std::dynamic_pointer_cast(setting))); - else if (setting->GetType() == "bool") - m_bools.insert(std::pair(number++, std::dynamic_pointer_cast(setting))); - else - CLog::Log(LOGWARNING, "CSkinInfo: ignoring setting of unknwon type \"%s\"", setting->GetType().c_str()); - } - - return true; -} - -void CSkinInfo::SettingsToXML(CXBMCTinyXML &doc) const -{ - // add the tag - TiXmlElement rootElement(XML_SETTINGS); - TiXmlNode *settingsNode = doc.InsertEndChild(rootElement); - if (settingsNode == NULL) - { - CLog::Log(LOGWARNING, "CSkinInfo: could not create tag"); - return; - } - - TiXmlElement* settingsElement = settingsNode->ToElement(); - for (const auto& it : m_bools) - { - if (!it.second->Serialize(settingsElement)) - CLog::Log(LOGWARNING, "CSkinInfo: failed to save string setting \"%s\"", it.second->name.c_str()); - } - - for (const auto& it : m_strings) - { - if (!it.second->Serialize(settingsElement)) - CLog::Log(LOGWARNING, "CSkinInfo: failed to save bool setting \"%s\"", it.second->name.c_str()); - } -} - } /*namespace ADDON*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Skin.h kodi-15.2~git20151019.1039-final/xbmc/addons/Skin.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/Skin.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Skin.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,15 +20,11 @@ * */ -#include -#include #include -#include -#include "addons/Addon.h" +#include "Addon.h" #include "guilib/GraphicContext.h" // needed for the RESOLUTION members #include "guilib/GUIIncludes.h" // needed for the GUIInclude member - #define CREDIT_LINE_LENGTH 50 class CSetting; @@ -36,62 +32,6 @@ namespace ADDON { -class CSkinSetting -{ -public: - virtual ~CSkinSetting() { } - - bool Serialize(TiXmlElement* parent) const; - - virtual std::string GetType() const = 0; - - virtual bool Deserialize(const TiXmlElement* element); - - std::string name; - -protected: - virtual bool SerializeSetting(TiXmlElement* element) const = 0; -}; - -typedef std::shared_ptr CSkinSettingPtr; - -class CSkinSettingString : public CSkinSetting -{ -public: - virtual ~CSkinSettingString() { } - - virtual std::string GetType() const { return "string"; } - - virtual bool Deserialize(const TiXmlElement* element); - - std::string value; - -protected: - virtual bool SerializeSetting(TiXmlElement* element) const; -}; - -typedef std::shared_ptr CSkinSettingStringPtr; - -class CSkinSettingBool : public CSkinSetting -{ -public: - CSkinSettingBool() - : value(false) - { } - virtual ~CSkinSettingBool() { } - - virtual std::string GetType() const { return "bool"; } - - virtual bool Deserialize(const TiXmlElement* element); - - bool value; - -protected: - virtual bool SerializeSetting(TiXmlElement* element) const; -}; - -typedef std::shared_ptr CSkinSettingBoolPtr; - class CSkinInfo : public CAddon { public: @@ -170,32 +110,14 @@ const std::string& GetCurrentAspect() const { return m_currentAspect; } void LoadIncludes(); - void ToggleDebug(); const INFO::CSkinVariableString* CreateSkinVariable(const std::string& name, int context); static void SettingOptionsSkinColorsFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); static void SettingOptionsSkinFontsFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); + static void SettingOptionsSkinSoundFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); static void SettingOptionsSkinThemesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); static void SettingOptionsStartupWindowsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - /*! \brief Don't handle skin settings like normal addon settings - */ - virtual bool HasSettings() { return false; } - virtual bool HasUserSettings() { return false; } - - int TranslateString(const std::string &setting); - const std::string& GetString(int setting) const; - void SetString(int setting, const std::string &label); - - int TranslateBool(const std::string &setting); - bool GetBool(int setting) const; - void SetBool(int setting, bool set); - - void Reset(const std::string &setting); - void Reset(); - - static std::set ParseSettings(const TiXmlElement* rootElement); - virtual void OnPreInstall(); virtual void OnPostInstall(bool update, bool modal); protected: @@ -215,13 +137,6 @@ bool LoadStartupWindows(const cp_extension_t *ext); - static CSkinSettingPtr ParseSetting(const TiXmlElement* element); - - virtual bool HasSettingsDefinition() const { return false; } - virtual bool HasSettingsToSave() const; - virtual bool SettingsFromXML(const CXBMCTinyXML &doc, bool loadDefaults = false); - virtual void SettingsToXML(CXBMCTinyXML &doc) const; - RESOLUTION_INFO m_defaultRes; std::vector m_resolutions; @@ -233,10 +148,6 @@ std::vector m_startupWindows; bool m_debugging; - -private: - std::map m_strings; - std::map m_bools; }; } /*namespace ADDON*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/UISoundsResource.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/UISoundsResource.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/UISoundsResource.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/UISoundsResource.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -40,7 +40,7 @@ bool CUISoundsResource::IsInUse() const { - return CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SOUNDSKIN) == ID(); + return CSettings::Get().GetString("lookandfeel.soundskin") == ID(); } void CUISoundsResource::OnPostInstall(bool update, bool modal) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Visualisation.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/Visualisation.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/Visualisation.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Visualisation.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,13 +20,11 @@ #include "system.h" #include "Visualisation.h" #include "GUIInfoManager.h" -#include "guiinfo/GUIInfoLabels.h" #include "Application.h" #include "guilib/GraphicContext.h" #include "guilib/WindowIDs.h" #include "music/tags/MusicInfoTag.h" #include "settings/AdvancedSettings.h" -#include "settings/Settings.h" #include "windowing/WindowingFactory.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" @@ -36,6 +34,7 @@ #include "filesystem/SpecialProtocol.h" #endif +using namespace std; using namespace MUSIC_INFO; using namespace ADDON; @@ -66,8 +65,8 @@ bool CVisualisation::Create(int x, int y, int w, int h, void *device) { m_pInfo = new VIS_PROPS; -#ifdef HAS_DX - m_pInfo->device = g_Windowing.Get3D11Context(); + #ifdef HAS_DX + m_pInfo->device = g_Windowing.Get3DDevice(); #else m_pInfo->device = NULL; #endif @@ -97,7 +96,7 @@ return false; } - m_hasPresets = GetPresets(); + GetPresets(); if (GetSubModules()) m_pInfo->submodule = strdup(CSpecialProtocol::TranslatePath(m_submodules.front()).c_str()); @@ -209,8 +208,8 @@ if ( action == VIS_ACTION_UPDATE_TRACK && param ) { const CMusicInfoTag* tag = (const CMusicInfoTag*)param; - std::string artist(tag->GetArtistString()); - std::string albumArtist(tag->GetAlbumArtistString()); + std::string artist(StringUtils::Join(tag->GetArtist(), g_advancedSettings.m_musicItemSeparator)); + std::string albumArtist(StringUtils::Join(tag->GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator)); std::string genre(StringUtils::Join(tag->GetGenre(), g_advancedSettings.m_musicItemSeparator)); VisTrack track; @@ -225,7 +224,7 @@ track.discNumber = tag->GetDiscNumber(); track.duration = tag->GetDuration(); track.year = tag->GetYear(); - track.rating = tag->GetUserrating(); + track.rating = tag->GetRating(); return m_pStruct->OnAction(action, &track); } @@ -263,13 +262,13 @@ return; // Save our audio data in the buffers - std::unique_ptr pBuffer ( new CAudioBuffer(iAudioDataLength) ); + unique_ptr pBuffer ( new CAudioBuffer(AUDIO_BUFFER_SIZE) ); pBuffer->Set(pAudioData, iAudioDataLength); m_vecBuffers.push_back( pBuffer.release() ); if ( (int)m_vecBuffers.size() < m_iNumBuffers) return ; - std::unique_ptr ptrAudioBuffer ( m_vecBuffers.front() ); + unique_ptr ptrAudioBuffer ( m_vecBuffers.front() ); m_vecBuffers.pop_front(); // Fourier transform the data if the vis wants it... if (m_bWantsFreq) @@ -282,11 +281,11 @@ m_transform->calc(psAudioData, m_fFreq); // Transfer data to our visualisation - AudioData(psAudioData, iAudioDataLength, m_fFreq, AUDIO_BUFFER_SIZE/2); // half due to complex-conjugate + AudioData(psAudioData, AUDIO_BUFFER_SIZE, m_fFreq, AUDIO_BUFFER_SIZE/2); // half due to complex-conjugate } else { // Transfer data to our visualisation - AudioData(ptrAudioBuffer->Get(), iAudioDataLength, NULL, 0); + AudioData(ptrAudioBuffer->Get(), AUDIO_BUFFER_SIZE, NULL, 0); } return ; } @@ -474,7 +473,3 @@ return ""; } -bool CVisualisation::IsInUse() const -{ - return CSettings::GetInstance().GetString(CSettings::SETTING_MUSICPLAYER_VISUALISATION) == ID(); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Visualisation.h kodi-15.2~git20151019.1039-final/xbmc/addons/Visualisation.h --- kodi-16.1~git20160425.1001-final/xbmc/addons/Visualisation.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Visualisation.h 2015-10-19 08:39:16.000000000 +0000 @@ -61,7 +61,6 @@ CVisualisation(const cp_extension_t *ext) : CAddonDll(ext) {} virtual void OnInitialize(int iChannels, int iSamplesPerSec, int iBitsPerSample); virtual void OnAudioData(const float* pAudioData, int iAudioDataLength); - virtual bool IsInUse() const; bool Create(int x, int y, int w, int h, void *device); void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const std::string &strSongName); void AudioData(const float *pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength); @@ -70,7 +69,6 @@ void GetInfo(VIS_INFO *info); bool OnAction(VIS_ACTION action, void *param = NULL); bool UpdateTrack(); - bool HasPresets() { return m_hasPresets; }; bool HasSubModules() { return !m_submodules.empty(); } bool IsLocked(); unsigned GetPreset(); @@ -108,7 +106,6 @@ bool m_bWantsFreq; float m_fFreq[AUDIO_BUFFER_SIZE]; // Frequency data bool m_bCalculate_Freq; // True if the vis wants freq data - bool m_hasPresets; std::unique_ptr m_transform; // track information diff -Nru kodi-16.1~git20160425.1001-final/xbmc/addons/Webinterface.cpp kodi-15.2~git20151019.1039-final/xbmc/addons/Webinterface.cpp --- kodi-16.1~git20160425.1001-final/xbmc/addons/Webinterface.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/addons/Webinterface.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -38,14 +38,14 @@ m_entryPoint(WEBINTERFACE_DEFAULT_ENTRY_POINT) { // determine the type of the webinterface - std::string webinterfaceType = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@type"); + std::string webinterfaceType = CAddonMgr::Get().GetExtValue(ext->configuration, "@type"); if (StringUtils::EqualsNoCase(webinterfaceType.c_str(), "wsgi")) m_type = WebinterfaceTypeWsgi; else if (!webinterfaceType.empty() && !StringUtils::EqualsNoCase(webinterfaceType.c_str(), "static") && !StringUtils::EqualsNoCase(webinterfaceType.c_str(), "html")) CLog::Log(LOGWARNING, "Webinterface addon \"%s\" has specified an unsupported type \"%s\"", ID().c_str(), webinterfaceType.c_str()); // determine the entry point of the webinterface - std::string entryPoint = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@entry"); + std::string entryPoint = CAddonMgr::Get().GetExtValue(ext->configuration, "@entry"); if (!entryPoint.empty()) m_entryPoint = entryPoint; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/AndroidFeatures.cpp kodi-15.2~git20151019.1039-final/xbmc/android/activity/AndroidFeatures.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/AndroidFeatures.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/AndroidFeatures.cpp 2015-04-04 00:00:14.000000000 +0000 @@ -63,14 +63,3 @@ return version; } -int CAndroidFeatures::GetCPUCount() -{ - static int count = -1; - - if (count == -1) - { - count = android_getCpuCount(); - } - return count; -} - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/AndroidFeatures.h kodi-15.2~git20151019.1039-final/xbmc/android/activity/AndroidFeatures.h --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/AndroidFeatures.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/AndroidFeatures.h 2015-04-04 00:00:14.000000000 +0000 @@ -27,5 +27,4 @@ static bool HasNeon(); static int GetVersion(); - static int GetCPUCount(); -}; +}; \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/AndroidKey.cpp kodi-15.2~git20151019.1039-final/xbmc/android/activity/AndroidKey.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/AndroidKey.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/AndroidKey.cpp 2015-06-14 19:32:50.000000000 +0000 @@ -58,7 +58,7 @@ { AKEYCODE_DPAD_CENTER , XBMCK_RETURN }, { AKEYCODE_VOLUME_UP , XBMCK_LAST }, { AKEYCODE_VOLUME_DOWN , XBMCK_LAST }, - { AKEYCODE_POWER , XBMCK_LAST }, + { AKEYCODE_POWER , XBMCK_POWER }, { AKEYCODE_CAMERA , XBMCK_LAST }, { AKEYCODE_CLEAR , XBMCK_LAST }, { AKEYCODE_A , XBMCK_a }, @@ -117,6 +117,12 @@ { AKEYCODE_MENU , XBMCK_MENU }, { AKEYCODE_NOTIFICATION , XBMCK_LAST }, { AKEYCODE_SEARCH , XBMCK_LAST }, + { AKEYCODE_MEDIA_PLAY_PAUSE, XBMCK_MEDIA_PLAY_PAUSE }, + { AKEYCODE_MEDIA_STOP , XBMCK_MEDIA_STOP }, + { AKEYCODE_MEDIA_NEXT , XBMCK_MEDIA_NEXT_TRACK }, + { AKEYCODE_MEDIA_PREVIOUS , XBMCK_MEDIA_PREV_TRACK }, + { AKEYCODE_MEDIA_REWIND , XBMCK_MEDIA_REWIND }, + { AKEYCODE_MEDIA_FAST_FORWARD , XBMCK_MEDIA_FASTFORWARD }, { AKEYCODE_MUTE , XBMCK_LAST }, { AKEYCODE_PAGE_UP , XBMCK_PAGEUP }, { AKEYCODE_PAGE_DOWN , XBMCK_PAGEDOWN }, @@ -145,6 +151,10 @@ { AKEYCODE_SCROLL_LOCK , XBMCK_SCROLLOCK }, { AKEYCODE_INSERT , XBMCK_INSERT }, { AKEYCODE_FORWARD , XBMCK_MEDIA_FASTFORWARD }, + { AKEYCODE_MEDIA_PLAY , XBMCK_MEDIA_PLAY_PAUSE }, + { AKEYCODE_MEDIA_PAUSE , XBMCK_MEDIA_PLAY_PAUSE }, + { AKEYCODE_MEDIA_RECORD , XBMCK_RECORD }, + { AKEYCODE_MEDIA_EJECT , XBMCK_EJECT }, { AKEYCODE_GUIDE , XBMCK_GUIDE }, { AKEYCODE_SETTINGS , XBMCK_SETTINGS }, { AKEYCODE_INFO , XBMCK_INFO }, @@ -152,43 +162,13 @@ { AKEYCODE_PROG_GREEN , XBMCK_GREEN }, { AKEYCODE_PROG_YELLOW , XBMCK_YELLOW }, { AKEYCODE_PROG_BLUE , XBMCK_BLUE }, - - { AKEYCODE_F1 , XBMCK_F1 }, - { AKEYCODE_F2 , XBMCK_F2 }, - { AKEYCODE_F3 , XBMCK_F3 }, - { AKEYCODE_F4 , XBMCK_F4 }, - { AKEYCODE_F5 , XBMCK_F5 }, - { AKEYCODE_F6 , XBMCK_F6 }, - { AKEYCODE_F7 , XBMCK_F7 }, - { AKEYCODE_F8 , XBMCK_F8 }, - { AKEYCODE_F9 , XBMCK_F9 }, - { AKEYCODE_F10 , XBMCK_F10 }, - { AKEYCODE_F11 , XBMCK_F11 }, - { AKEYCODE_F12 , XBMCK_F12 }, }; -static KeyMap MediakeyMap[] = { - { AKEYCODE_MEDIA_PLAY_PAUSE, XBMCK_MEDIA_PLAY_PAUSE }, - { AKEYCODE_MEDIA_STOP , XBMCK_MEDIA_STOP }, - { AKEYCODE_MEDIA_NEXT , XBMCK_MEDIA_NEXT_TRACK }, - { AKEYCODE_MEDIA_PREVIOUS , XBMCK_MEDIA_PREV_TRACK }, - { AKEYCODE_MEDIA_REWIND , XBMCK_MEDIA_REWIND }, - { AKEYCODE_MEDIA_FAST_FORWARD , XBMCK_MEDIA_FASTFORWARD }, - { AKEYCODE_MEDIA_PLAY , XBMCK_MEDIA_PLAY_PAUSE }, - { AKEYCODE_MEDIA_PAUSE , XBMCK_MEDIA_PLAY_PAUSE }, - { AKEYCODE_MEDIA_RECORD , XBMCK_RECORD }, - { AKEYCODE_MEDIA_EJECT , XBMCK_EJECT }, -}; - -bool CAndroidKey::m_handleMediaKeys = false; - bool CAndroidKey::onKeyboardEvent(AInputEvent *event) { if (event == NULL) return false; - bool ret = true; - int32_t flags = AKeyEvent_getFlags(event); int32_t state = AKeyEvent_getMetaState(event); int32_t action = AKeyEvent_getAction(event); @@ -209,21 +189,6 @@ break; } } - if (sym == XBMCK_UNKNOWN) - { - for (unsigned int index = 0; index < sizeof(MediakeyMap) / sizeof(KeyMap); index++) - { - if (keycode == MediakeyMap[index].nativeKey) - { - sym = MediakeyMap[index].xbmcKey; - break; - } - } - if (sym != XBMCK_UNKNOWN) - { - ret = m_handleMediaKeys; - } - } // check if this is a key we don't want to handle if (sym == XBMCK_LAST || sym == XBMCK_UNKNOWN) @@ -260,7 +225,7 @@ (state & AMETA_SYM_ON) ? "yes" : "no"); #endif XBMC_Key((uint8_t)keycode, sym, modifiers, unicode, false); - break; + return true; case AKEY_EVENT_ACTION_UP: #if 1 @@ -271,7 +236,7 @@ (state & AMETA_SYM_ON) ? "yes" : "no"); #endif XBMC_Key((uint8_t)keycode, sym, modifiers, unicode, true); - break; + return true; case AKEY_EVENT_ACTION_MULTIPLE: #if 1 @@ -281,7 +246,6 @@ (state & AMETA_SHIFT_ON) ? "yes" : "no", (state & AMETA_SYM_ON) ? "yes" : "no"); #endif - return false; break; default: @@ -292,11 +256,10 @@ (state & AMETA_SHIFT_ON) ? "yes" : "no", (state & AMETA_SYM_ON) ? "yes" : "no"); #endif - return false; break; } - return ret; + return false; } void CAndroidKey::XBMC_Key(uint8_t code, uint16_t key, uint16_t modifiers, uint16_t unicode, bool up) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/AndroidKey.h kodi-15.2~git20151019.1039-final/xbmc/android/activity/AndroidKey.h --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/AndroidKey.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/AndroidKey.h 2014-12-18 01:01:55.000000000 +0000 @@ -32,10 +32,6 @@ ~CAndroidKey() {}; bool onKeyboardEvent(AInputEvent *event); - - static void SetHandleMediaKeys(bool enable) { m_handleMediaKeys = enable; } - static void XBMC_Key(uint8_t code, uint16_t key, uint16_t modifiers, uint16_t unicode, bool up); - -protected: - static bool m_handleMediaKeys; + void XBMC_Key(uint8_t code, uint16_t key, uint16_t modifiers, uint16_t unicode, bool up); + void XBMC_JoyButton(uint8_t id, uint8_t button, bool up); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/android_main.cpp kodi-15.2~git20151019.1039-final/xbmc/android/activity/android_main.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/android_main.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/android_main.cpp 2015-07-06 19:37:23.000000000 +0000 @@ -27,8 +27,6 @@ #include "utils/StringUtils.h" #include "CompileInfo.h" -#include "android/activity/JNIMainActivity.h" - // copied from new android_native_app_glue.c static void process_input(struct android_app* app, struct android_poll_source* source) { AInputEvent* event = NULL; @@ -100,14 +98,14 @@ JNINativeMethod mOnNewIntent = { "_onNewIntent", "(Landroid/content/Intent;)V", - (void*)&CJNIMainActivity::_onNewIntent + (void*)&CJNIApplicationMainActivity::_onNewIntent }; env->RegisterNatives(cMain, &mOnNewIntent, 1); JNINativeMethod mCallNative = { "_callNative", "(JJ)V", - (void*)&CJNIMainActivity::_callNative + (void*)&CJNIApplicationMainActivity::_callNative }; env->RegisterNatives(cMain, &mCallNative, 1); } @@ -140,7 +138,7 @@ JNINativeMethod mOnVolumeChanged = { "_onVolumeChanged", "(I)V", - (void*)&CJNIMainActivity::_onVolumeChanged + (void*)&CJNIApplicationMainActivity::_onVolumeChanged }; env->RegisterNatives(cSettingsObserver, &mOnVolumeChanged, 1); } @@ -151,7 +149,7 @@ JNINativeMethod mOnAudioFocusChange = { "_onAudioFocusChange", "(I)V", - (void*)&CJNIMainActivity::_onAudioFocusChange + (void*)&CJNIApplicationMainActivity::_onAudioFocusChange }; env->RegisterNatives(cAudioFocusChangeListener, &mOnAudioFocusChange, 1); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/AndroidTouch.cpp kodi-15.2~git20151019.1039-final/xbmc/android/activity/AndroidTouch.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/AndroidTouch.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/AndroidTouch.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,12 +25,12 @@ CAndroidTouch::CAndroidTouch() : m_dpi(160) { - CGenericTouchInputHandler::GetInstance().RegisterHandler(&CGenericTouchActionHandler::GetInstance()); + CGenericTouchInputHandler::Get().RegisterHandler(&CGenericTouchActionHandler::Get()); } CAndroidTouch::~CAndroidTouch() { - CGenericTouchInputHandler::GetInstance().UnregisterHandler(); + CGenericTouchInputHandler::Get().UnregisterHandler(); } bool CAndroidTouch::onTouchEvent(AInputEvent* event) @@ -82,11 +82,11 @@ // first update all touch pointers for (unsigned int pointer = 0; pointer < numPointers; pointer++) - CGenericTouchInputHandler::GetInstance().UpdateTouchPointer(pointer, AMotionEvent_getX(event, pointer), AMotionEvent_getY(event, pointer), + CGenericTouchInputHandler::Get().UpdateTouchPointer(pointer, AMotionEvent_getX(event, pointer), AMotionEvent_getY(event, pointer), AMotionEvent_getEventTime(event), m_dpi / 16.0f); // now send the event - return CGenericTouchInputHandler::GetInstance().HandleTouchInput(touchEvent, x, y, time, touchPointer, size); + return CGenericTouchInputHandler::Get().HandleTouchInput(touchEvent, x, y, time, touchPointer, size); } void CAndroidTouch::setDPI(uint32_t dpi) @@ -95,6 +95,6 @@ { m_dpi = dpi; - CGenericTouchInputHandler::GetInstance().SetScreenDPI(m_dpi); + CGenericTouchInputHandler::Get().SetScreenDPI(m_dpi); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/EventLoop.cpp kodi-15.2~git20151019.1039-final/xbmc/android/activity/EventLoop.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/EventLoop.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/EventLoop.cpp 2014-12-18 01:01:55.000000000 +0000 @@ -24,7 +24,8 @@ #include -#define IS_FROM_SOURCE(v, s) ((v & s) == s) +typeof(AMotionEvent_getAxisValue) *p_AMotionEvent_getAxisValue; +typeof(AMotionEvent_getButtonState) *p_AMotionEvent_getButtonState; CEventLoop::CEventLoop(android_app* application) : m_enabled(false), @@ -48,6 +49,12 @@ m_activityHandler = &activityHandler; m_inputHandler = &inputHandler; + // missing in early NDKs, is present in r9b+ + p_AMotionEvent_getAxisValue = (typeof(AMotionEvent_getAxisValue)*) dlsym(RTLD_DEFAULT, "AMotionEvent_getAxisValue"); + // missing in NDK + p_AMotionEvent_getButtonState = (typeof(AMotionEvent_getButtonState)*) dlsym(RTLD_DEFAULT, "AMotionEvent_getButtonState"); + CXBMCApp::android_printf("CEventLoop: AMotionEvent_getAxisValue: %p, AMotionEvent_getButtonState: %p", p_AMotionEvent_getAxisValue, p_AMotionEvent_getButtonState); + CXBMCApp::android_printf("CEventLoop: starting event loop"); while (1) { @@ -145,7 +152,7 @@ switch(type) { case AINPUT_EVENT_TYPE_KEY: - if (IS_FROM_SOURCE(source, AINPUT_SOURCE_GAMEPAD) || IS_FROM_SOURCE(source, AINPUT_SOURCE_JOYSTICK)) + if (source & AINPUT_SOURCE_GAMEPAD || source & AINPUT_SOURCE_JOYSTICK) { if (m_inputHandler->onJoyStickKeyEvent(event)) return true; @@ -153,12 +160,19 @@ rtn = m_inputHandler->onKeyboardEvent(event); break; case AINPUT_EVENT_TYPE_MOTION: - if (IS_FROM_SOURCE(source, AINPUT_SOURCE_TOUCHSCREEN)) - rtn = m_inputHandler->onTouchEvent(event); - else if (IS_FROM_SOURCE(source, AINPUT_SOURCE_MOUSE)) - rtn = m_inputHandler->onMouseEvent(event); - else if (IS_FROM_SOURCE(source, AINPUT_SOURCE_GAMEPAD) || IS_FROM_SOURCE(source, AINPUT_SOURCE_JOYSTICK)) - rtn = m_inputHandler->onJoyStickMotionEvent(event); + switch(source) + { + case AINPUT_SOURCE_TOUCHSCREEN: + rtn = m_inputHandler->onTouchEvent(event); + break; + case AINPUT_SOURCE_MOUSE: + rtn = m_inputHandler->onMouseEvent(event); + break; + case AINPUT_SOURCE_GAMEPAD: + case AINPUT_SOURCE_JOYSTICK: + rtn = m_inputHandler->onJoyStickMotionEvent(event); + break; + } break; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/JNIMainActivity.cpp kodi-15.2~git20151019.1039-final/xbmc/android/activity/JNIMainActivity.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/JNIMainActivity.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/JNIMainActivity.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "JNIMainActivity.h" - -#include "android/jni/Activity.h" -#include "android/jni/Intent.h" -#include "android/jni/jutils/jutils-details.hpp" - -using namespace jni; - -CJNIMainActivity* CJNIMainActivity::m_appInstance(NULL); - -CJNIMainActivity::CJNIMainActivity(const ANativeActivity *nativeActivity) - : CJNIActivity(nativeActivity) -{ - m_appInstance = this; -} - -CJNIMainActivity::~CJNIMainActivity() -{ - m_appInstance = NULL; -} - -void CJNIMainActivity::_onNewIntent(JNIEnv *env, jobject context, jobject intent) -{ - (void)env; - (void)context; - if (m_appInstance) - m_appInstance->onNewIntent(CJNIIntent(jhobject(intent))); -} - -void CJNIMainActivity::_callNative(JNIEnv *env, jobject context, jlong funcAddr, jlong variantAddr) -{ - (void)env; - (void)context; - ((void (*)(CVariant *))funcAddr)((CVariant *)variantAddr); -} - -void CJNIMainActivity::runNativeOnUiThread(void (*callback)(CVariant *), CVariant* variant) -{ - call_method(m_context, - "runNativeOnUiThread", "(JJ)V", (jlong)callback, (jlong)variant); -} - -void CJNIMainActivity::_onVolumeChanged(JNIEnv *env, jobject context, jint volume) -{ - (void)env; - (void)context; - if(m_appInstance) - m_appInstance->onVolumeChanged(volume); -} - -void CJNIMainActivity::_onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange) -{ - (void)env; - (void)context; - if(m_appInstance) - m_appInstance->onAudioFocusChange(focusChange); -} - -CJNISurface CJNIMainActivity::getVideoViewSurface() -{ - return call_method(m_context, - "getVideoViewSurface", "()Landroid/view/Surface;"); -} - -void CJNIMainActivity::clearVideoView() -{ - call_method(m_context, - "clearVideoView", "()V"); -} - -void CJNIMainActivity::setVideoViewSurfaceRect(int l, int t, int r, int b) -{ - call_method(m_context, - "setVideoViewSurfaceRect", "(IIII)V", l, t, r, b); -} - -void CJNIMainActivity::registerMediaButtonEventReceiver() -{ - call_method(m_context, - "registerMediaButtonEventReceiver", "()V"); -} - -void CJNIMainActivity::unregisterMediaButtonEventReceiver() -{ - call_method(m_context, - "unregisterMediaButtonEventReceiver", "()V"); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/JNIMainActivity.h kodi-15.2~git20151019.1039-final/xbmc/android/activity/JNIMainActivity.h --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/JNIMainActivity.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/JNIMainActivity.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "android/jni/Activity.h" -#include "android/jni/Surface.h" - -class CJNIMainActivity : public CJNIActivity -{ -public: - CJNIMainActivity(const ANativeActivity *nativeActivity); - ~CJNIMainActivity(); - - static CJNIMainActivity* GetAppInstance() { return m_appInstance; } - - static void _onNewIntent(JNIEnv *env, jobject context, jobject intent); - static void _onVolumeChanged(JNIEnv *env, jobject context, jint volume); - static void _onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange); - - static void _callNative(JNIEnv *env, jobject context, jlong funcAddr, jlong variantAddr); - static void runNativeOnUiThread(void (*callback)(CVariant *), CVariant *variant); - static void registerMediaButtonEventReceiver(); - static void unregisterMediaButtonEventReceiver(); - - CJNISurface getVideoViewSurface(); - void clearVideoView(); - void setVideoViewSurfaceRect(int l, int t, int r, int b); - -private: - static CJNIMainActivity *m_appInstance; - -protected: - virtual void onNewIntent(CJNIIntent intent)=0; - virtual void onVolumeChanged(int volume)=0; - virtual void onAudioFocusChange(int focusChange)=0; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/android/activity/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/Makefile.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/Makefile.in 2014-12-18 01:01:55.000000000 +0000 @@ -17,7 +17,6 @@ SRCS += GraphicBuffer.cpp SRCS += EventLoop.cpp SRCS += XBMCApp.cpp -SRCS += JNIMainActivity.cpp OBJS += $(APP_GLUE) $(CPU_OBJ) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/XBMCApp.cpp kodi-15.2~git20151019.1039-final/xbmc/android/activity/XBMCApp.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/XBMCApp.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/XBMCApp.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -43,13 +43,12 @@ #include "windowing/WinEvents.h" #include "guilib/GUIWindowManager.h" #include "utils/log.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "utils/StringUtils.h" #include "utils/Variant.h" #include "AppParamParser.h" #include "XbmcContext.h" #include -#include "cores/AudioEngine/AEFactory.h" #include "android/jni/JNIThreading.h" #include "android/jni/BroadcastReceiver.h" #include "android/jni/Intent.h" @@ -65,6 +64,8 @@ #include "android/jni/System.h" #include "android/jni/ApplicationInfo.h" #include "android/jni/StatFs.h" +#include "android/jni/BitmapDrawable.h" +#include "android/jni/Bitmap.h" #include "android/jni/CharSequence.h" #include "android/jni/URI.h" #include "android/jni/Cursor.h" @@ -76,15 +77,12 @@ #endif #include "android/jni/Window.h" #include "android/jni/WindowManager.h" -#include "android/jni/KeyEvent.h" -#include "AndroidKey.h" #include "CompileInfo.h" #define GIGABYTES 1073741824 using namespace std; -using namespace KODI::MESSAGING; template void* thread_run(void* obj) @@ -100,13 +98,12 @@ ANativeWindow* CXBMCApp::m_window = NULL; int CXBMCApp::m_batteryLevel = 0; bool CXBMCApp::m_hasFocus = false; -bool CXBMCApp::m_headsetPlugged = false; CCriticalSection CXBMCApp::m_applicationsMutex; std::vector CXBMCApp::m_applications; CXBMCApp::CXBMCApp(ANativeActivity* nativeActivity) - : CJNIMainActivity(nativeActivity) + : CJNIApplicationMainActivity(nativeActivity) , CJNIBroadcastReceiver("org/xbmc/kodi/XBMCBroadcastReceiver") { m_xbmcappinstance = this; @@ -156,10 +153,9 @@ void CXBMCApp::onResume() { android_printf("%s: ", __PRETTY_FUNCTION__); - - // Some intent filters MUST be registered in code rather than through the manifest CJNIIntentFilter intentFilter; intentFilter.addAction("android.intent.action.BATTERY_CHANGED"); + intentFilter.addAction("android.intent.action.DREAMING_STOPPED"); intentFilter.addAction("android.intent.action.SCREEN_ON"); registerReceiver(*this, intentFilter); @@ -168,11 +164,6 @@ else g_application.WakeUpScreenSaverAndDPMS(); - CJNIAudioManager audioManager(getSystemService("audio")); - m_headsetPlugged = audioManager.isWiredHeadsetOn() || audioManager.isBluetoothA2dpOn(); - - unregisterMediaButtonEventReceiver(); - // Clear the applications cache. We could have installed/deinstalled apps { CSingleLock lock(m_applicationsMutex); @@ -183,13 +174,8 @@ void CXBMCApp::onPause() { android_printf("%s: ", __PRETTY_FUNCTION__); - if (g_application.m_pPlayer->IsPlaying()) - { - if (g_application.m_pPlayer->IsPlayingVideo()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_STOP))); - else - registerMediaButtonEventReceiver(); - } + + unregisterReceiver(*this); #if defined(HAS_LIBAMCODEC) if (aml_permissions()) @@ -260,7 +246,7 @@ void CXBMCApp::onResizeWindow() { android_printf("%s: ", __PRETTY_FUNCTION__); - m_window = NULL; + m_window=NULL; m_windowCreated.Reset(); // no need to do anything because we are fixed in fullscreen landscape mode } @@ -273,7 +259,6 @@ if (!m_exiting) { XBMC_DestroyDisplay(); - m_window = NULL; XBMC_Pause(true); } } @@ -365,11 +350,6 @@ return m_hasFocus; } -bool CXBMCApp::IsHeadsetPlugged() -{ - return m_headsetPlugged; -} - void CXBMCApp::run() { int status = 0; @@ -419,27 +399,26 @@ void CXBMCApp::XBMC_Pause(bool pause) { android_printf("XBMC_Pause(%s)", pause ? "true" : "false"); + // Only send the PAUSE action if we are pausing XBMC and video is currently playing + if (pause && g_application.m_pPlayer->IsPlayingVideo() && !g_application.m_pPlayer->IsPaused()) + CApplicationMessenger::Get().SendAction(CAction(ACTION_PAUSE), WINDOW_INVALID, true); } void CXBMCApp::XBMC_Stop() { - CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT); + CApplicationMessenger::Get().Quit(); } bool CXBMCApp::XBMC_SetupDisplay() { android_printf("XBMC_SetupDisplay()"); - bool result; - CApplicationMessenger::GetInstance().SendMsg(TMSG_DISPLAY_SETUP, -1, -1, static_cast(&result)); - return result; + return CApplicationMessenger::Get().SetupDisplay(); } bool CXBMCApp::XBMC_DestroyDisplay() { android_printf("XBMC_DestroyDisplay()"); - bool result; - CApplicationMessenger::GetInstance().SendMsg(TMSG_DISPLAY_DESTROY, -1, -1, static_cast(&result)); - return result; + return CApplicationMessenger::Get().DestroyDisplay(); } int CXBMCApp::SetBuffersGeometry(int width, int height, int format) @@ -505,8 +484,6 @@ void CXBMCApp::OnPlayBackStarted() { AcquireAudioFocus(); - registerMediaButtonEventReceiver(); - CAndroidKey::SetHandleMediaKeys(true); } void CXBMCApp::OnPlayBackPaused() @@ -521,15 +498,11 @@ void CXBMCApp::OnPlayBackStopped() { - CAndroidKey::SetHandleMediaKeys(false); - unregisterMediaButtonEventReceiver(); ReleaseAudioFocus(); } void CXBMCApp::OnPlayBackEnded() { - CAndroidKey::SetHandleMediaKeys(false); - unregisterMediaButtonEventReceiver(); ReleaseAudioFocus(); } @@ -541,17 +514,16 @@ CJNIList packageList = GetPackageManager().getInstalledApplications(CJNIPackageManager::GET_ACTIVITIES); int numPackages = packageList.size(); for (int i = 0; i < numPackages; i++) - { - CJNIIntent intent = GetPackageManager().getLaunchIntentForPackage(packageList.get(i).packageName); + { + androidPackage newPackage; + newPackage.packageName = packageList.get(i).packageName; + newPackage.packageLabel = GetPackageManager().getApplicationLabel(packageList.get(i)).toString(); + CJNIIntent intent = GetPackageManager().getLaunchIntentForPackage(newPackage.packageName); if (!intent && CJNIBuild::SDK_INT >= 21) - intent = GetPackageManager().getLeanbackLaunchIntentForPackage(packageList.get(i).packageName); + intent = GetPackageManager().getLeanbackLaunchIntentForPackage(newPackage.packageName); if (!intent) continue; - androidPackage newPackage; - newPackage.packageName = packageList.get(i).packageName; - newPackage.packageLabel = GetPackageManager().getApplicationLabel(packageList.get(i)).toString(); - newPackage.icon = packageList.get(i).icon; m_applications.push_back(newPackage); } } @@ -559,6 +531,34 @@ return m_applications; } +bool CXBMCApp::GetIconSize(const string &packageName, int *width, int *height) +{ + JNIEnv* env = xbmc_jnienv(); + AndroidBitmapInfo info; + CJNIBitmapDrawable drawable = (CJNIBitmapDrawable)GetPackageManager().getApplicationIcon(packageName); + CJNIBitmap icon(drawable.getBitmap()); + AndroidBitmap_getInfo(env, icon.get_raw(), &info); + *width = info.width; + *height = info.height; + return true; +} + +bool CXBMCApp::GetIcon(const string &packageName, void* buffer, unsigned int bufSize) +{ + void *bitmapBuf = NULL; + JNIEnv* env = xbmc_jnienv(); + CJNIBitmapDrawable drawable = (CJNIBitmapDrawable)GetPackageManager().getApplicationIcon(packageName); + CJNIBitmap bitmap(drawable.getBitmap()); + AndroidBitmap_lockPixels(env, bitmap.get_raw(), &bitmapBuf); + if (bitmapBuf) + { + memcpy(buffer, bitmapBuf, bufSize); + AndroidBitmap_unlockPixels(env, bitmap.get_raw()); + return true; + } + return false; +} + bool CXBMCApp::HasLaunchIntent(const string &package) { return GetPackageManager().getLaunchIntentForPackage(package) != NULL; @@ -734,53 +734,8 @@ if (action == "android.intent.action.BATTERY_CHANGED") m_batteryLevel = intent.getIntExtra("level",-1); else if (action == "android.intent.action.DREAMING_STOPPED" || action == "android.intent.action.SCREEN_ON") - { if (HasFocus()) g_application.WakeUpScreenSaverAndDPMS(); - } - else if (action == "android.intent.action.HEADSET_PLUG" || action == "android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED") - { - bool newstate; - if (action == "android.intent.action.HEADSET_PLUG") - newstate = (intent.getIntExtra("state", 0) != 0); - else - newstate = (intent.getIntExtra("android.bluetooth.profile.extra.STATE", 0) == 2 /* STATE_CONNECTED */); - - if (newstate != m_headsetPlugged) - { - m_headsetPlugged = newstate; - CAEFactory::DeviceChange(); - } - } - else if (action == "android.intent.action.MEDIA_BUTTON") - { - CJNIKeyEvent keyevt = (CJNIKeyEvent)intent.getParcelableExtra(CJNIIntent::EXTRA_KEY_EVENT); - - int keycode = keyevt.getKeyCode(); - bool up = (keyevt.getAction() == CJNIKeyEvent::ACTION_UP); - - CLog::Log(LOGINFO, "Got MEDIA_BUTTON intent: %d, up:%s", keycode, up ? "true" : "false"); - if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_RECORD) - CAndroidKey::XBMC_Key(keycode, XBMCK_RECORD, 0, 0, up); - else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_EJECT) - CAndroidKey::XBMC_Key(keycode, XBMCK_EJECT, 0, 0, up); - else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_FAST_FORWARD) - CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_FASTFORWARD, 0, 0, up); - else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_NEXT) - CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_NEXT_TRACK, 0, 0, up); - else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_PAUSE) - CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_PLAY_PAUSE, 0, 0, up); - else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_PLAY) - CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_PLAY_PAUSE, 0, 0, up); - else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_PLAY_PAUSE) - CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_PLAY_PAUSE, 0, 0, up); - else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_PREVIOUS) - CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_PREV_TRACK, 0, 0, up); - else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_REWIND) - CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_REWIND, 0, 0, up); - else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_STOP) - CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_STOP, 0, 0, up); - } } void CXBMCApp::onNewIntent(CJNIIntent intent) @@ -788,29 +743,21 @@ std::string action = intent.getAction(); if (action == "android.intent.action.VIEW") { - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PLAY, 1, 0, static_cast( - new CFileItem(GetFilenameFromIntent(intent)))); + std::string playFile = GetFilenameFromIntent(intent); + CApplicationMessenger::Get().MediaPlay(playFile); } } void CXBMCApp::onVolumeChanged(int volume) { - // System volume was used; Reset Kodi volume to 100% if it'not, already - if (g_application.GetVolume(false) != 1.0) - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast( - new CAction(ACTION_VOLUME_SET, static_cast(CXBMCApp::GetMaxSystemVolume())))); + CApplicationMessenger::Get().SendAction(CAction(ACTION_VOLUME_SET, (float)volume), WINDOW_INVALID, false); } void CXBMCApp::onAudioFocusChange(int focusChange) { CXBMCApp::android_printf("Audio Focus changed: %d", focusChange); - if (focusChange == CJNIAudioManager::AUDIOFOCUS_LOSS) - { - unregisterMediaButtonEventReceiver(); - - if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_PAUSE))); - } + if (focusChange == CJNIAudioManager::AUDIOFOCUS_LOSS && g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) + CApplicationMessenger::Get().SendAction(CAction(ACTION_PAUSE), WINDOW_INVALID, true); } void CXBMCApp::SetupEnv() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/activity/XBMCApp.h kodi-15.2~git20151019.1039-final/xbmc/android/activity/XBMCApp.h --- kodi-16.1~git20160425.1001-final/xbmc/android/activity/XBMCApp.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/activity/XBMCApp.h 2015-10-19 08:39:16.000000000 +0000 @@ -35,8 +35,6 @@ #include "android/jni/AudioManager.h" #include "threads/Event.h" -#include "JNIMainActivity.h" - // forward delares class CJNIWakeLock; class CAESinkAUDIOTRACK; @@ -48,16 +46,15 @@ unsigned int width; unsigned int height; void *pixels; -}; +}; struct androidPackage { std::string packageName; std::string packageLabel; - int icon; }; -class CXBMCApp : public IActivityHandler, public CJNIMainActivity, public CJNIBroadcastReceiver, public CJNIAudioManagerAudioFocusChangeListener +class CXBMCApp : public IActivityHandler, public CJNIApplicationMainActivity, public CJNIBroadcastReceiver, public CJNIAudioManagerAudioFocusChangeListener { public: CXBMCApp(ANativeActivity *nativeActivity); @@ -93,10 +90,11 @@ static int GetBatteryLevel(); static bool EnableWakeLock(bool on); static bool HasFocus(); - static bool IsHeadsetPlugged(); static bool StartActivity(const std::string &package, const std::string &intent = std::string(), const std::string &dataType = std::string(), const std::string &dataURI = std::string()); static std::vector GetApplications(); + static bool GetIconSize(const std::string &packageName, int *width, int *height); + static bool GetIcon(const std::string &packageName, void* buffer, unsigned int bufSize); /*! * \brief If external storage is available, it returns the path for the external storage (for the specified type) @@ -120,8 +118,6 @@ static void OnPlayBackStopped(); static void OnPlayBackEnded(); - static CXBMCApp* get() { return m_xbmcappinstance; } - protected: // limit who can access Volume friend class CAESinkAUDIOTRACK; @@ -142,7 +138,6 @@ static CJNIWakeLock *m_wakeLock; static int m_batteryLevel; static bool m_hasFocus; - static bool m_headsetPlugged; bool m_firstrun; bool m_exiting; pthread_t m_thread; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/Activity.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/Activity.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/Activity.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/Activity.cpp 2015-07-06 19:37:23.000000000 +0000 @@ -41,3 +41,58 @@ "moveTaskToBack", "(Z)Z", nonRoot); } + +///////////////////////////////////////////////// +/// \brief CJNIApplicationMainActivity::CJNIApplicationMainActivity +/// \param nativeActivity +/// + +CJNIApplicationMainActivity* CJNIApplicationMainActivity::m_appInstance(NULL); + +CJNIApplicationMainActivity::CJNIApplicationMainActivity(const ANativeActivity *nativeActivity) + : CJNIActivity(nativeActivity) +{ + m_appInstance = this; +} + +CJNIApplicationMainActivity::~CJNIApplicationMainActivity() +{ + m_appInstance = NULL; +} + +void CJNIApplicationMainActivity::_onNewIntent(JNIEnv *env, jobject context, jobject intent) +{ + (void)env; + (void)context; + if (m_appInstance) + m_appInstance->onNewIntent(CJNIIntent(jhobject(intent))); +} + +void CJNIApplicationMainActivity::_callNative(JNIEnv *env, jobject context, jlong funcAddr, jlong variantAddr) +{ + (void)env; + (void)context; + ((void (*)(CVariant *))funcAddr)((CVariant *)variantAddr); +} + +void CJNIApplicationMainActivity::runNativeOnUiThread(void (*callback)(CVariant *), CVariant* variant) +{ + call_method(m_context, + "runNativeOnUiThread", "(JJ)V", (jlong)callback, (jlong)variant); +} + +void CJNIApplicationMainActivity::_onVolumeChanged(JNIEnv *env, jobject context, jint volume) +{ + (void)env; + (void)context; + if(m_appInstance) + m_appInstance->onVolumeChanged(volume); +} + +void CJNIApplicationMainActivity::_onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange) +{ + (void)env; + (void)context; + if(m_appInstance) + m_appInstance->onAudioFocusChange(focusChange); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/Activity.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/Activity.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/Activity.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/Activity.h 2015-07-06 19:37:23.000000000 +0000 @@ -37,3 +37,29 @@ CJNIActivity(); }; +/////////////////////////////////// + +class CJNIApplicationMainActivity : public CJNIActivity +{ +public: + CJNIApplicationMainActivity(const ANativeActivity *nativeActivity); + ~CJNIApplicationMainActivity(); + + static CJNIApplicationMainActivity* GetAppInstance() { return m_appInstance; } + + static void _onNewIntent(JNIEnv *env, jobject context, jobject intent); + static void _onVolumeChanged(JNIEnv *env, jobject context, jint volume); + static void _onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange); + + static void _callNative(JNIEnv *env, jobject context, jlong funcAddr, jlong variantAddr); + static void runNativeOnUiThread(void (*callback)(CVariant *), CVariant *variant); + +private: + static CJNIApplicationMainActivity *m_appInstance; + +protected: + virtual void onNewIntent(CJNIIntent intent)=0; + virtual void onVolumeChanged(int volume)=0; + virtual void onAudioFocusChange(int focusChange)=0; +}; + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/ApplicationInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/ApplicationInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/ApplicationInfo.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/ApplicationInfo.cpp 2014-12-18 01:01:55.000000000 +0000 @@ -23,7 +23,7 @@ using namespace jni; -CJNIApplicationInfo::CJNIApplicationInfo(const jhobject &object) : CJNIPackageItemInfo(object) +CJNIApplicationInfo::CJNIApplicationInfo(const jhobject &object) : CJNIBase(object) ,sourceDir( jcast(get_field(m_object, "sourceDir"))) ,publicSourceDir( jcast(get_field(m_object, "publicSourceDir"))) ,dataDir( jcast(get_field(m_object, "dataDir"))) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/ApplicationInfo.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/ApplicationInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/ApplicationInfo.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/ApplicationInfo.h 2014-12-18 01:01:55.000000000 +0000 @@ -20,9 +20,8 @@ */ #include "JNIBase.h" -#include "PackageItemInfo.h" -class CJNIApplicationInfo : public CJNIPackageItemInfo +class CJNIApplicationInfo : public CJNIBase { public: CJNIApplicationInfo(const jni::jhobject &object); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/AudioManager.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/AudioManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/AudioManager.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/AudioManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,6 @@ #include "jutils/jutils-details.hpp" -#include "android/activity/JNIMainActivity.h" #include using namespace jni; @@ -81,20 +80,6 @@ "(Landroid/media/AudioManager$OnAudioFocusChangeListener;)I", listener.get_raw()); } -bool CJNIAudioManager::isBluetoothA2dpOn() -{ - return call_method(m_object, - "isBluetoothA2dpOn", - "()Z"); -} - -bool CJNIAudioManager::isWiredHeadsetOn() -{ - return call_method(m_object, - "isWiredHeadsetOn", - "()Z"); -} - ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// CJNIAudioManagerAudioFocusChangeListener* CJNIAudioManagerAudioFocusChangeListener::m_listenerInstance(NULL); @@ -102,7 +87,7 @@ CJNIAudioManagerAudioFocusChangeListener::CJNIAudioManagerAudioFocusChangeListener() : CJNIBase("org/xbmc/kodi/XBMCOnAudioFocusChangeListener") { - CJNIMainActivity *appInstance = CJNIMainActivity::GetAppInstance(); + CJNIApplicationMainActivity *appInstance = CJNIApplicationMainActivity::GetAppInstance(); if (!appInstance) return; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/AudioManager.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/AudioManager.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/AudioManager.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/AudioManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -51,8 +51,6 @@ int requestAudioFocus(const CJNIAudioManagerAudioFocusChangeListener &listener, int streamType, int durationHint); int abandonAudioFocus (const CJNIAudioManagerAudioFocusChangeListener &listener); - bool isBluetoothA2dpOn(); - bool isWiredHeadsetOn(); static void PopulateStaticFields(); static int STREAM_MUSIC; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/BroadcastReceiver.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/BroadcastReceiver.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/BroadcastReceiver.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/BroadcastReceiver.cpp 2015-04-04 00:00:14.000000000 +0000 @@ -25,14 +25,12 @@ #include "ClassLoader.h" #include "jutils/jutils-details.hpp" -#include "android/activity/JNIMainActivity.h" - using namespace jni; CJNIBroadcastReceiver *CJNIBroadcastReceiver::m_receiverInstance(NULL); CJNIBroadcastReceiver::CJNIBroadcastReceiver(const std::string &className) : CJNIBase(className) { - CJNIMainActivity *appInstance = CJNIMainActivity::GetAppInstance(); + CJNIApplicationMainActivity *appInstance = CJNIApplicationMainActivity::GetAppInstance(); if (!appInstance || className.empty()) return; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/Context.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/Context.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/Context.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/Context.cpp 2015-04-06 03:00:10.000000000 +0000 @@ -45,9 +45,6 @@ #include "Window.h" #include "View.h" #include "Build.h" -#include "DisplayMetrics.h" -#include "Intent.h" -#include "KeyEvent.h" #include @@ -87,9 +84,6 @@ CJNIMediaFormat::PopulateStaticFields(); CJNIView::PopulateStaticFields(); CJNIBuild::PopulateStaticFields(); - CJNIDisplayMetrics::PopulateStaticFields(); - CJNIIntent::PopulateStaticFields(); - CJNIKeyEvent::PopulateStaticFields(); } CJNIPackageManager CJNIContext::GetPackageManager() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/DisplayMetrics.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/DisplayMetrics.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/DisplayMetrics.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/DisplayMetrics.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "DisplayMetrics.h" -#include "jutils/jutils-details.hpp" - -using namespace jni; -const char *CJNIDisplayMetrics::m_classname = "android/util/DisplayMetrics"; - -int CJNIDisplayMetrics::DENSITY_DEFAULT(-1); -int CJNIDisplayMetrics::DENSITY_HIGH(-1); -int CJNIDisplayMetrics::DENSITY_LOW(-1); -int CJNIDisplayMetrics::DENSITY_MEDIUM(-1); -int CJNIDisplayMetrics::DENSITY_TV(-1); -int CJNIDisplayMetrics::DENSITY_XHIGH(-1); -int CJNIDisplayMetrics::DENSITY_XXHIGH(-1); -int CJNIDisplayMetrics::DENSITY_XXXHIGH(-1); - -void CJNIDisplayMetrics::PopulateStaticFields() -{ - jhclass clazz = find_class(m_classname); - - DENSITY_DEFAULT = get_static_field(clazz, "DENSITY_DEFAULT"); - DENSITY_HIGH = get_static_field(clazz, "DENSITY_HIGH"); - DENSITY_LOW = get_static_field(clazz, "DENSITY_LOW"); - DENSITY_MEDIUM = get_static_field(clazz, "DENSITY_MEDIUM"); - DENSITY_TV = get_static_field(clazz, "DENSITY_TV"); - DENSITY_XHIGH = get_static_field(clazz, "DENSITY_XHIGH"); - if(CJNIBase::GetSDKVersion() >= 16) - DENSITY_XXHIGH = get_static_field(clazz, "DENSITY_XXHIGH"); - if(CJNIBase::GetSDKVersion() >= 18) - DENSITY_XXXHIGH = get_static_field(clazz, "DENSITY_XXXHIGH"); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/DisplayMetrics.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/DisplayMetrics.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/DisplayMetrics.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/DisplayMetrics.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -#pragma once -/* - * Copyright (C) 2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "JNIBase.h" - -class CJNIDisplayMetrics -{ -public: - static int DENSITY_DEFAULT; - static int DENSITY_HIGH; - static int DENSITY_LOW; - static int DENSITY_MEDIUM; - static int DENSITY_TV; - static int DENSITY_XHIGH; - static int DENSITY_XXHIGH; - static int DENSITY_XXXHIGH; - - static void PopulateStaticFields(); - -private: - CJNIDisplayMetrics(); - ~CJNIDisplayMetrics() {}; - static const char *m_classname; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/Intent.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/Intent.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/Intent.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/Intent.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,14 +24,6 @@ using namespace jni; -std::string CJNIIntent::EXTRA_KEY_EVENT; - -void CJNIIntent::PopulateStaticFields() -{ - jhclass clazz = find_class("android/content/Intent"); - EXTRA_KEY_EVENT = jcast(get_static_field(clazz,"EXTRA_KEY_EVENT")); -} - CJNIIntent::CJNIIntent(const std::string &action) : CJNIBase("android/content/Intent") { if(action.empty()) @@ -73,20 +65,6 @@ jcast(name), defaultValue); } -std::string CJNIIntent::getStringExtra(const std::string &name) const -{ - return jcast(call_method(m_object, - "getStringExtra", "(Ljava/lang/String;I)Ljava/lang/String;", - jcast(name))); -} - -jni::jhobject CJNIIntent::getParcelableExtra(const std::string &name) const -{ - return call_method(m_object, - "getParcelableExtra", "(Ljava/lang/String;)Landroid/os/Parcelable;", - jcast(name)); -} - bool CJNIIntent::hasExtra(const std::string &name) const { return call_method(m_object, diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/Intent.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/Intent.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/Intent.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/Intent.h 2015-10-19 08:39:16.000000000 +0000 @@ -35,8 +35,6 @@ std::string getType() const ; int getIntExtra(const std::string &name, int defaultValue) const; - std::string getStringExtra(const std::string &name) const; - jni::jhobject getParcelableExtra(const std::string &name) const; bool hasExtra(const std::string &name) const; bool hasCategory(const std::string &category) const; @@ -54,7 +52,4 @@ void setPackage(const std::string &packageName); void setType(const std::string &type); CJNIURI getData() const; - - static void PopulateStaticFields(); - static std::string EXTRA_KEY_EVENT; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/KeyEvent.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/KeyEvent.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/KeyEvent.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/KeyEvent.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "KeyEvent.h" - -#include "jutils/jutils-details.hpp" - -using namespace jni; - -int CJNIKeyEvent::ACTION_DOWN; -int CJNIKeyEvent::ACTION_UP; - -int CJNIKeyEvent::KEYCODE_MEDIA_RECORD; -int CJNIKeyEvent::KEYCODE_MEDIA_EJECT; -int CJNIKeyEvent::KEYCODE_MEDIA_FAST_FORWARD; -int CJNIKeyEvent::KEYCODE_MEDIA_NEXT ; -int CJNIKeyEvent::KEYCODE_MEDIA_PAUSE; -int CJNIKeyEvent::KEYCODE_MEDIA_PLAY; -int CJNIKeyEvent::KEYCODE_MEDIA_PLAY_PAUSE; -int CJNIKeyEvent::KEYCODE_MEDIA_PREVIOUS; -int CJNIKeyEvent::KEYCODE_MEDIA_REWIND; -int CJNIKeyEvent::KEYCODE_MEDIA_STOP; - -void CJNIKeyEvent::PopulateStaticFields() -{ - jhclass clazz = find_class("android/view/KeyEvent"); - ACTION_DOWN = (get_static_field(clazz, "ACTION_DOWN")); - ACTION_UP = (get_static_field(clazz, "ACTION_UP")); - KEYCODE_MEDIA_RECORD = (get_static_field(clazz, "KEYCODE_MEDIA_RECORD")); - KEYCODE_MEDIA_EJECT = (get_static_field(clazz, "KEYCODE_MEDIA_EJECT")); - KEYCODE_MEDIA_FAST_FORWARD = (get_static_field(clazz, "KEYCODE_MEDIA_FAST_FORWARD")); - KEYCODE_MEDIA_NEXT = (get_static_field(clazz, "KEYCODE_MEDIA_NEXT")); - KEYCODE_MEDIA_PAUSE = (get_static_field(clazz, "KEYCODE_MEDIA_PAUSE")); - KEYCODE_MEDIA_PLAY = (get_static_field(clazz, "KEYCODE_MEDIA_PLAY")); - KEYCODE_MEDIA_PLAY_PAUSE = (get_static_field(clazz, "KEYCODE_MEDIA_PLAY_PAUSE")); - KEYCODE_MEDIA_PREVIOUS = (get_static_field(clazz, "KEYCODE_MEDIA_PREVIOUS")); - KEYCODE_MEDIA_REWIND = (get_static_field(clazz, "KEYCODE_MEDIA_REWIND")); - KEYCODE_MEDIA_STOP = (get_static_field(clazz, "KEYCODE_MEDIA_STOP")); -} - -int CJNIKeyEvent::getKeyCode() -{ - return call_method(m_object, - "getKeyCode", "()I"); -} - -int CJNIKeyEvent::getAction() -{ - return call_method(m_object, - "getAction", "()I"); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/KeyEvent.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/KeyEvent.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/KeyEvent.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/KeyEvent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -#pragma once -/* - * Copyright (C) 2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "JNIBase.h" - -class CJNIKeyEventAudioFocusChangeListener : public CJNIBase -{ -public: - CJNIKeyEventAudioFocusChangeListener(const jni::jhobject &object) : CJNIBase(object) {}; - virtual ~CJNIKeyEventAudioFocusChangeListener() {}; - - static void _onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange); - -protected: - CJNIKeyEventAudioFocusChangeListener(); - - virtual void onAudioFocusChange(int focusChange)=0; - -private: - static CJNIKeyEventAudioFocusChangeListener *m_listenerInstance; -}; - -class CJNIKeyEvent : public CJNIBase -{ -public: - CJNIKeyEvent(const jni::jhobject &object) : CJNIBase(object) {}; - ~CJNIKeyEvent() {}; - - int getKeyCode(); - int getAction(); - - static void PopulateStaticFields(); - static int ACTION_DOWN; - static int ACTION_UP; - - static int KEYCODE_MEDIA_RECORD; - static int KEYCODE_MEDIA_EJECT; - static int KEYCODE_MEDIA_FAST_FORWARD; - static int KEYCODE_MEDIA_NEXT ; - static int KEYCODE_MEDIA_PAUSE; - static int KEYCODE_MEDIA_PLAY; - static int KEYCODE_MEDIA_PLAY_PAUSE; - static int KEYCODE_MEDIA_PREVIOUS; - static int KEYCODE_MEDIA_REWIND; - static int KEYCODE_MEDIA_STOP; - -private: - CJNIKeyEvent(); -}; - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/android/jni/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/Makefile.in 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/Makefile.in 2015-07-06 19:37:23.000000000 +0000 @@ -54,10 +54,6 @@ SRCS += SystemProperties.cpp SRCS += Display.cpp SRCS += WindowManager.cpp -SRCS += Resources.cpp -SRCS += PackageItemInfo.cpp -SRCS += DisplayMetrics.cpp -SRCS += KeyEvent.cpp LIB = jni.a diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/MediaFormat.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/MediaFormat.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/MediaFormat.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/MediaFormat.cpp 2014-12-18 01:01:55.000000000 +0000 @@ -40,7 +40,6 @@ std::string CJNIMediaFormat::KEY_CHANNEL_MASK; std::string CJNIMediaFormat::KEY_AAC_PROFILE; std::string CJNIMediaFormat::KEY_FLAC_COMPRESSION_LEVEL; -std::string CJNIMediaFormat::KEY_ROTATION; const char *CJNIMediaFormat::m_classname = "android/media/MediaFormat"; void CJNIMediaFormat::PopulateStaticFields() @@ -63,11 +62,6 @@ KEY_CHANNEL_MASK = jcast(get_static_field(clazz, "KEY_CHANNEL_MASK")); KEY_AAC_PROFILE = jcast(get_static_field(clazz, "KEY_AAC_PROFILE")); KEY_FLAC_COMPRESSION_LEVEL = jcast(get_static_field(clazz, "KEY_FLAC_COMPRESSION_LEVEL")); - - if(GetSDKVersion() >= 23) - { - KEY_ROTATION = jcast(get_static_field(clazz, "KEY_ROTATION")); - } } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/MediaFormat.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/MediaFormat.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/MediaFormat.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/MediaFormat.h 2014-12-18 01:01:55.000000000 +0000 @@ -60,7 +60,6 @@ static std::string KEY_CHANNEL_MASK; static std::string KEY_AAC_PROFILE; static std::string KEY_FLAC_COMPRESSION_LEVEL; - static std::string KEY_ROTATION; private: CJNIMediaFormat(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/PackageItemInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/PackageItemInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/PackageItemInfo.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/PackageItemInfo.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "PackageItemInfo.h" -#include "jutils/jutils-details.hpp" - -using namespace jni; -const char *CJNIPackageItemInfo::m_classname = "android/content/pm/PackageItemInfo"; - -CJNIPackageItemInfo::CJNIPackageItemInfo(const jhobject &object) : CJNIBase(object) - ,icon( get_field(m_object, "icon")) -{ -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/PackageItemInfo.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/PackageItemInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/PackageItemInfo.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/PackageItemInfo.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -#pragma once -/* - * Copyright (C) 2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "JNIBase.h" - -class CJNIPackageItemInfo : public CJNIBase -{ -public: - CJNIPackageItemInfo(const jni::jhobject &object); - - int icon; - -protected: - CJNIPackageItemInfo(); - ~CJNIPackageItemInfo() {}; - static const char *m_classname; - -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/PackageManager.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/PackageManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/PackageManager.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/PackageManager.cpp 2014-12-21 04:00:24.000000000 +0000 @@ -24,7 +24,6 @@ #include "List.h" #include "CharSequence.h" #include "ApplicationInfo.h" -#include "Resources.h" #include "jutils/jutils-details.hpp" using namespace jni; @@ -72,16 +71,3 @@ flags); } -CJNIResources CJNIPackageManager::getResourcesForApplication(const std::string &package) -{ - return call_method(m_object, - "getResourcesForApplication", "(Ljava/lang/String;)Landroid/content/res/Resources;", - jcast(package)); -} - -CJNIResources CJNIPackageManager::getResourcesForApplication(const CJNIApplicationInfo &info) -{ - return call_method(m_object, - "getResourcesForApplication", "(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/Resources;", - info.get_raw()); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/PackageManager.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/PackageManager.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/PackageManager.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/PackageManager.h 2014-12-21 04:00:24.000000000 +0000 @@ -26,7 +26,6 @@ class CJNIDrawable; class CJNIApplicationInfo; class CJNICharSequence; -class CJNIResources; class CJNIPackageManager : public CJNIBase { @@ -39,8 +38,6 @@ CJNIDrawable getApplicationIcon(const std::string &package); CJNIList getInstalledApplications(int flags); CJNICharSequence getApplicationLabel(const CJNIApplicationInfo &info); - CJNIResources getResourcesForApplication(const std::string &package); - CJNIResources getResourcesForApplication(const CJNIApplicationInfo &info); static void PopulateStaticFields(); static int GET_ACTIVITIES; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/Resources.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/Resources.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/Resources.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/Resources.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Resources.h" -#include "Drawable.h" -#include "jutils/jutils-details.hpp" - -using namespace jni; - -CJNIDrawable CJNIResources::getDrawableForDensity(int id, int density) -{ - return call_method(m_object, - "getDrawableForDensity", "(II)Landroid/graphics/drawable/Drawable;", - id, density); -} - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/Resources.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/Resources.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/Resources.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/Resources.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -#pragma once -/* - * Copyright (C) 2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "JNIBase.h" -#include "List.h" - -class CJNIDrawable; - -class CJNIResources : public CJNIBase -{ -public: - CJNIResources(const jni::jhobject &object) : CJNIBase(object) {}; - ~CJNIResources() {}; - - CJNIDrawable getDrawableForDensity(int id, int density); - -private: - CJNIResources(); -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/Surface.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/Surface.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/Surface.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/Surface.cpp 2014-12-18 01:01:55.000000000 +0000 @@ -41,10 +41,6 @@ ROTATION_270= get_static_field(clazz, "ROTATION_270"); } -CJNISurface::CJNISurface() - : CJNIBase(CJNISurface::m_classname) -{ -} CJNISurface::CJNISurface(const CJNISurfaceTexture &surfaceTexture) : CJNIBase(m_classname) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/Surface.h kodi-15.2~git20151019.1039-final/xbmc/android/jni/Surface.h --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/Surface.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/Surface.h 2014-12-18 01:01:55.000000000 +0000 @@ -25,7 +25,6 @@ class CJNISurface : public CJNIBase { public: - CJNISurface(); CJNISurface(const CJNISurfaceTexture &surfaceTexture); CJNISurface(const jni::jhobject &object) : CJNIBase(object) {}; ~CJNISurface() {}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/android/jni/SurfaceTexture.cpp kodi-15.2~git20151019.1039-final/xbmc/android/jni/SurfaceTexture.cpp --- kodi-16.1~git20160425.1001-final/xbmc/android/jni/SurfaceTexture.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/android/jni/SurfaceTexture.cpp 2015-04-04 00:00:14.000000000 +0000 @@ -26,7 +26,6 @@ #include "jutils/jutils-details.hpp" -#include "android/activity/JNIMainActivity.h" #include using namespace jni; @@ -38,7 +37,7 @@ CJNISurfaceTextureOnFrameAvailableListener::CJNISurfaceTextureOnFrameAvailableListener() : CJNIBase("org/xbmc/kodi/XBMCOnFrameAvailableListener") { - CJNIMainActivity *appInstance = CJNIMainActivity::GetAppInstance(); + CJNIApplicationMainActivity *appInstance = CJNIApplicationMainActivity::GetAppInstance(); if (!appInstance) return; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/Application.cpp kodi-15.2~git20151019.1039-final/xbmc/Application.cpp --- kodi-16.1~git20160425.1001-final/xbmc/Application.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/Application.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see + * along with XBMC; see the file COPYING. If not, see * . * */ @@ -22,9 +22,7 @@ #include "threads/SystemClock.h" #include "system.h" #include "Application.h" -#include "events/EventLog.h" -#include "events/NotificationEvent.h" -#include "interfaces/builtins/Builtins.h" +#include "interfaces/Builtins.h" #include "utils/Variant.h" #include "utils/Splash.h" #include "LangInfo.h" @@ -35,7 +33,6 @@ #include "cores/IPlayer.h" #include "cores/dvdplayer/DVDFileInfo.h" #include "cores/AudioEngine/AEFactory.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" #include "cores/AudioEngine/Utils/AEUtil.h" #include "PlayListPlayer.h" #include "Autorun.h" @@ -58,9 +55,7 @@ #include "guilib/GUIAudioManager.h" #include "GUIPassword.h" #include "input/InertialScrollingHandler.h" -#include "messaging/ThreadMessage.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" +#include "ApplicationMessenger.h" #include "SectionLoader.h" #include "cores/DllLoader/DllLoaderContainer.h" #include "GUIUserMessages.h" @@ -90,16 +85,15 @@ #include "settings/AdvancedSettings.h" #include "settings/DisplaySettings.h" #include "settings/MediaSettings.h" -#include "settings/SkinSettings.h" #include "guilib/LocalizeStrings.h" #include "utils/CPUInfo.h" #include "utils/SeekHandler.h" #include "input/KeyboardLayoutManager.h" -#if HAVE_SDL_VERSION == 1 +#if SDL_VERSION == 1 #include -#elif HAVE_SDL_VERSION == 2 +#elif SDL_VERSION == 2 #include #endif @@ -120,6 +114,9 @@ #ifdef HAS_VIDEO_PLAYBACK #include "cores/VideoRenderers/RenderManager.h" #endif +#ifdef HAS_KARAOKE +#include "music/karaoke/karaokelyricsmanager.h" +#endif #include "network/ZeroconfBrowser.h" #ifndef TARGET_POSIX #include "threads/platform/win/Win32Exception.h" @@ -135,6 +132,7 @@ #endif #include "interfaces/AnnouncementManager.h" #include "peripherals/Peripherals.h" +#include "peripherals/dialogs/GUIDialogPeripheralManager.h" #include "peripherals/devices/PeripheralImon.h" #include "music/infoscanner/MusicInfoScanner.h" @@ -147,6 +145,7 @@ // Dialog includes #include "video/dialogs/GUIDialogVideoBookmarks.h" +#include "dialogs/GUIDialogYesNo.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogSubMenu.h" @@ -167,7 +166,6 @@ #include "utils/XMLUtils.h" #include "addons/AddonInstaller.h" #include "addons/AddonManager.h" -#include "addons/RepositoryUpdater.h" #include "music/tags/MusicInfoTag.h" #include "music/tags/MusicInfoTagLoaderFactory.h" #include "CompileInfo.h" @@ -222,9 +220,8 @@ #include "cores/FFmpeg.h" #include "utils/CharsetConverter.h" -#include "pictures/GUIWindowSlideShow.h" -#include "windows/GUIWindowLoginScreen.h" +using namespace std; using namespace ADDON; using namespace XFILE; #ifdef HAS_DVD_DRIVE @@ -243,13 +240,9 @@ using namespace PVR; using namespace EPG; using namespace PERIPHERALS; -using namespace KODI::MESSAGING; -using namespace ActiveAE; using namespace XbmcThreads; -using KODI::MESSAGING::HELPERS::DialogResponse; - // uncomment this if you want to use release libs in the debug build. // Atm this saves you 7 mb of memory #define USE_RELEASE_LIBS @@ -259,13 +252,12 @@ //extern IDirectSoundRenderer* m_pAudioDecoder; CApplication::CApplication(void) : m_pPlayer(new CApplicationPlayer) - , m_saveSkinOnUnloading(true) - , m_autoExecScriptExecuted(false) , m_itemCurrentFile(new CFileItem) , m_stackFileItemToUpdate(new CFileItem) , m_progressTrackingVideoResumeBookmark(*new CBookmark) , m_progressTrackingItem(new CFileItem) , m_musicInfoScanner(new CMusicInfoScanner) + , m_playerController(new CPlayerController) , m_fallbackLanguageLoaded(false) { m_network = NULL; @@ -283,6 +275,7 @@ m_bPlaybackStarting = false; m_ePlayState = PLAY_STATE_NONE; m_skinReverting = false; + m_loggingIn = false; #ifdef HAS_GLX XInitThreads(); @@ -290,6 +283,9 @@ /* for now always keep this around */ +#ifdef HAS_KARAOKE + m_pKaraokeMgr = new CKaraokeLyricsManager(); +#endif m_currentStack = new CFileItemList; m_bPresentFrame = false; @@ -324,7 +320,12 @@ #endif delete m_currentStack; +#ifdef HAS_KARAOKE + delete m_pKaraokeMgr; +#endif + delete m_dpms; + delete m_playerController; delete m_pInertialScrollingHandler; delete m_pPlayer; @@ -337,7 +338,7 @@ { case XBMC_QUIT: if (!g_application.m_bStop) - CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT); + CApplicationMessenger::Get().Quit(); break; case XBMC_VIDEORESIZE: if (g_windowManager.Initialized() && @@ -345,9 +346,9 @@ { g_Windowing.SetWindowResolution(newEvent.resize.w, newEvent.resize.h); g_graphicsContext.SetVideoResolution(RES_WINDOW, true); - CSettings::GetInstance().SetInt(CSettings::SETTING_WINDOW_WIDTH, newEvent.resize.w); - CSettings::GetInstance().SetInt(CSettings::SETTING_WINDOW_HEIGHT, newEvent.resize.h); - CSettings::GetInstance().Save(); + CSettings::Get().SetInt("window.width", newEvent.resize.w); + CSettings::Get().SetInt("window.height", newEvent.resize.h); + CSettings::Get().Save(); } break; case XBMC_VIDEOMOVE: @@ -357,7 +358,7 @@ // when fullscreen, remain fullscreen and resize to the dimensions of the new screen RESOLUTION newRes = (RESOLUTION) g_Windowing.DesktopResolution(g_Windowing.GetCurrentScreen()); if (newRes != g_graphicsContext.GetVideoResolution()) - CDisplaySettings::GetInstance().SetCurrentResolution(newRes, true); + CDisplaySettings::Get().SetCurrentResolution(newRes, true); } else #endif @@ -366,7 +367,7 @@ } break; case XBMC_USEREVENT: - CApplicationMessenger::GetInstance().PostMsg(static_cast(newEvent.user.code)); + CApplicationMessenger::Get().UserEvent(newEvent.user.code); break; case XBMC_APPCOMMAND: return g_application.OnAppCommand(newEvent.appcommand.action); @@ -378,7 +379,7 @@ g_application.OnAction(CAction(ACTION_MOUSE_MOVE, 0, static_cast(newEvent.focus.x), static_cast(newEvent.focus.y), 0, 0)); break; default: - return CInputManager::GetInstance().OnEvent(newEvent); + return CInputManager::Get().OnEvent(newEvent); } return true; } @@ -439,16 +440,10 @@ SetupNetwork(); Preflight(); - // here we register all global classes for the CApplicationMessenger, - // after that we can send messages to the corresponding modules - CApplicationMessenger::GetInstance().RegisterReceiver(this); - CApplicationMessenger::GetInstance().RegisterReceiver(&g_playlistPlayer); - CApplicationMessenger::GetInstance().RegisterReceiver(&g_infoManager); - for (int i = RES_HDTV_1080i; i <= RES_PAL60_16x9; i++) { g_graphicsContext.ResetScreenParameters((RESOLUTION)i); - g_graphicsContext.ResetOverscan((RESOLUTION)i, CDisplaySettings::GetInstance().GetResolutionInfo(i).Overscan); + g_graphicsContext.ResetOverscan((RESOLUTION)i, CDisplaySettings::Get().GetResolutionInfo(i).Overscan); } #ifdef TARGET_POSIX @@ -493,10 +488,10 @@ // Init our DllLoaders emu env init_emu_environ(); - CProfilesManager::GetInstance().Load(); + CProfilesManager::Get().Load(); CLog::Log(LOGNOTICE, "-----------------------------------------------------------------------"); - CLog::Log(LOGNOTICE, "Starting %s (%s). Platform: %s %s %d-bit", CSysInfo::GetAppName().c_str(), CSysInfo::GetVersion().c_str(), + CLog::Log(LOGNOTICE, "Starting %s (%s). Platform: %s %s %d-bit", g_infoManager.GetAppName().c_str(), g_infoManager.GetVersion().c_str(), g_sysinfo.GetBuildTargetPlatformName().c_str(), g_sysinfo.GetBuildTargetCpuFamily().c_str(), g_sysinfo.GetXbmcBitness()); std::string buildType; @@ -508,13 +503,15 @@ buildType = "Unknown"; #endif std::string specialVersion; -#if defined(TARGET_RASPBERRY_PI) +#if defined(TARGET_DARWIN_IOS_ATV2) + specialVersion = " (version for AppleTV2)"; +#elif defined(TARGET_RASPBERRY_PI) specialVersion = " (version for Raspberry Pi)"; //#elif defined(some_ID) // uncomment for special version/fork // specialVersion = " (version for XXXX)"; #endif - CLog::Log(LOGNOTICE, "Using %s %s x%d build%s", buildType.c_str(), CSysInfo::GetAppName().c_str(), g_sysinfo.GetXbmcBitness(), specialVersion.c_str()); - CLog::Log(LOGNOTICE, "%s compiled " __DATE__ " by %s for %s %s %d-bit %s (%s)", CSysInfo::GetAppName().c_str(), g_sysinfo.GetUsedCompilerNameAndVer().c_str(), g_sysinfo.GetBuildTargetPlatformName().c_str(), + CLog::Log(LOGNOTICE, "Using %s %s x%d build%s", buildType.c_str(), g_infoManager.GetAppName().c_str(), g_sysinfo.GetXbmcBitness(), specialVersion.c_str()); + CLog::Log(LOGNOTICE, "%s compiled " __DATE__ " by %s for %s %s %d-bit %s (%s)", g_infoManager.GetAppName().c_str(), g_sysinfo.GetUsedCompilerNameAndVer().c_str(), g_sysinfo.GetBuildTargetPlatformName().c_str(), g_sysinfo.GetBuildTargetCpuFamily().c_str(), g_sysinfo.GetXbmcBitness(), g_sysinfo.GetBuildTargetPlatformVersionDecoded().c_str(), g_sysinfo.GetBuildTargetPlatformVersion().c_str()); @@ -616,26 +613,26 @@ // Initialize default Settings - don't move CLog::Log(LOGNOTICE, "load settings..."); - if (!CSettings::GetInstance().Initialize()) + if (!CSettings::Get().Initialize()) return false; g_powerManager.SetDefaults(); // load the actual values - if (!CSettings::GetInstance().Load()) + if (!CSettings::Get().Load()) { CLog::Log(LOGFATAL, "unable to load settings"); return false; } - CSettings::GetInstance().SetLoaded(); + CSettings::Get().SetLoaded(); CLog::Log(LOGINFO, "creating subdirectories"); - CLog::Log(LOGINFO, "userdata folder: %s", CURL::GetRedacted(CProfilesManager::GetInstance().GetProfileUserDataFolder()).c_str()); - CLog::Log(LOGINFO, "recording folder: %s", CURL::GetRedacted(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_RECORDINGPATH)).c_str()); - CLog::Log(LOGINFO, "screenshots folder: %s", CURL::GetRedacted(CSettings::GetInstance().GetString(CSettings::SETTING_DEBUG_SCREENSHOTPATH)).c_str()); - CDirectory::Create(CProfilesManager::GetInstance().GetUserDataFolder()); - CDirectory::Create(CProfilesManager::GetInstance().GetProfileUserDataFolder()); - CProfilesManager::GetInstance().CreateProfileFolders(); + CLog::Log(LOGINFO, "userdata folder: %s", CProfilesManager::Get().GetProfileUserDataFolder().c_str()); + CLog::Log(LOGINFO, "recording folder: %s", CSettings::Get().GetString("audiocds.recordingpath").c_str()); + CLog::Log(LOGINFO, "screenshots folder: %s", CSettings::Get().GetString("debug.screenshotpath").c_str()); + CDirectory::Create(CProfilesManager::Get().GetUserDataFolder()); + CDirectory::Create(CProfilesManager::Get().GetProfileUserDataFolder()); + CProfilesManager::Get().CreateProfileFolders(); update_emu_environ();//apply the GUI settings @@ -653,24 +650,24 @@ // restore AE's previous volume state SetHardwareVolume(m_volumeLevel); CAEFactory::SetMute (m_muted); - CAEFactory::SetSoundMode(CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_GUISOUNDMODE)); + CAEFactory::SetSoundMode(CSettings::Get().GetInt("audiooutput.guisoundmode")); // initialize m_replayGainSettings - m_replayGainSettings.iType = CSettings::GetInstance().GetInt(CSettings::SETTING_MUSICPLAYER_REPLAYGAINTYPE); - m_replayGainSettings.iPreAmp = CSettings::GetInstance().GetInt(CSettings::SETTING_MUSICPLAYER_REPLAYGAINPREAMP); - m_replayGainSettings.iNoGainPreAmp = CSettings::GetInstance().GetInt(CSettings::SETTING_MUSICPLAYER_REPLAYGAINNOGAINPREAMP); - m_replayGainSettings.bAvoidClipping = CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICPLAYER_REPLAYGAINAVOIDCLIPPING); + m_replayGainSettings.iType = CSettings::Get().GetInt("musicplayer.replaygaintype"); + m_replayGainSettings.iPreAmp = CSettings::Get().GetInt("musicplayer.replaygainpreamp"); + m_replayGainSettings.iNoGainPreAmp = CSettings::Get().GetInt("musicplayer.replaygainnogainpreamp"); + m_replayGainSettings.bAvoidClipping = CSettings::Get().GetBool("musicplayer.replaygainavoidclipping"); // initialize the addon database (must be before the addon manager is init'd) - CDatabaseManager::GetInstance().Initialize(true); + CDatabaseManager::Get().Initialize(true); #ifdef HAS_PYTHON - CScriptInvocationManager::GetInstance().RegisterLanguageInvocationHandler(&g_pythonParser, ".py"); + CScriptInvocationManager::Get().RegisterLanguageInvocationHandler(&g_pythonParser, ".py"); #endif // HAS_PYTHON // start-up Addons Framework // currently bails out if either cpluff Dll is unavailable or system dir can not be scanned - if (!CAddonMgr::GetInstance().Init()) + if (!CAddonMgr::Get().Init()) { CLog::Log(LOGFATAL, "CApplication::Create: Unable to start CAddonMgr"); return false; @@ -678,10 +675,10 @@ // Create the Mouse, Keyboard, Remote, and Joystick devices // Initialize after loading settings to get joystick deadzone setting - CInputManager::GetInstance().InitializeInputs(); + CInputManager::Get().InitializeInputs(); // load the keyboard layouts - if (!CKeyboardLayoutManager::GetInstance().Load()) + if (!CKeyboardLayoutManager::Get().Load()) { CLog::Log(LOGFATAL, "CApplication::Create: Unable to load keyboard layouts"); return false; @@ -762,31 +759,31 @@ // Retrieve the matching resolution based on GUI settings bool sav_res = false; - CDisplaySettings::GetInstance().SetCurrentResolution(CDisplaySettings::GetInstance().GetDisplayResolution()); - CLog::Log(LOGNOTICE, "Checking resolution %i", CDisplaySettings::GetInstance().GetCurrentResolution()); - if (!g_graphicsContext.IsValidResolution(CDisplaySettings::GetInstance().GetCurrentResolution())) + CDisplaySettings::Get().SetCurrentResolution(CDisplaySettings::Get().GetDisplayResolution()); + CLog::Log(LOGNOTICE, "Checking resolution %i", CDisplaySettings::Get().GetCurrentResolution()); + if (!g_graphicsContext.IsValidResolution(CDisplaySettings::Get().GetCurrentResolution())) { CLog::Log(LOGNOTICE, "Setting safe mode %i", RES_DESKTOP); // defer saving resolution after window was created - CDisplaySettings::GetInstance().SetCurrentResolution(RES_DESKTOP); + CDisplaySettings::Get().SetCurrentResolution(RES_DESKTOP); sav_res = true; } // update the window resolution - g_Windowing.SetWindowResolution(CSettings::GetInstance().GetInt(CSettings::SETTING_WINDOW_WIDTH), CSettings::GetInstance().GetInt(CSettings::SETTING_WINDOW_HEIGHT)); + g_Windowing.SetWindowResolution(CSettings::Get().GetInt("window.width"), CSettings::Get().GetInt("window.height")); - if (g_advancedSettings.m_startFullScreen && CDisplaySettings::GetInstance().GetCurrentResolution() == RES_WINDOW) + if (g_advancedSettings.m_startFullScreen && CDisplaySettings::Get().GetCurrentResolution() == RES_WINDOW) { // defer saving resolution after window was created - CDisplaySettings::GetInstance().SetCurrentResolution(RES_DESKTOP); + CDisplaySettings::Get().SetCurrentResolution(RES_DESKTOP); sav_res = true; } - if (!g_graphicsContext.IsValidResolution(CDisplaySettings::GetInstance().GetCurrentResolution())) + if (!g_graphicsContext.IsValidResolution(CDisplaySettings::Get().GetCurrentResolution())) { // Oh uh - doesn't look good for starting in their wanted screenmode CLog::Log(LOGERROR, "The screen resolution requested is not valid, resetting to a valid mode"); - CDisplaySettings::GetInstance().SetCurrentResolution(RES_DESKTOP); + CDisplaySettings::Get().SetCurrentResolution(RES_DESKTOP); sav_res = true; } if (!InitWindow()) @@ -795,10 +792,10 @@ } if (sav_res) - CDisplaySettings::GetInstance().SetCurrentResolution(RES_DESKTOP, true); + CDisplaySettings::Get().SetCurrentResolution(RES_DESKTOP, true); if (g_advancedSettings.m_splashImage) - CSplash::GetInstance().Show(); + CSplash::Get().Show(); // The key mappings may already have been loaded by a peripheral CLog::Log(LOGINFO, "load keymapping"); @@ -816,17 +813,39 @@ return true; } -bool CApplication::InitWindow(RESOLUTION res) +bool CApplication::InitWindow() { - if (res == RES_INVALID) - res = CDisplaySettings::GetInstance().GetCurrentResolution(); + RESOLUTION res = CDisplaySettings::Get().GetCurrentResolution(); + +#ifdef TARGET_DARWIN_OSX + // force initial window creation to be windowed, if fullscreen, it will switch to it below + // fixes the white screen of death if starting fullscreen and switching to windowed. + bool bFullScreen = false; + if (!g_Windowing.CreateNewWindow(CSysInfo::GetAppName(), bFullScreen, CDisplaySettings::Get().GetResolutionInfo(RES_WINDOW), OnEvent)) + { + CLog::Log(LOGFATAL, "CApplication::Create: Unable to create window"); + return false; + } +#elif defined(TARGET_ANDROID) + // We might come from a refresh rate switch destroying the native window; use the renderer resolution + if (g_graphicsContext.GetVideoResolution() != RES_INVALID) + res = g_graphicsContext.GetVideoResolution(); + RESOLUTION_INFO res_info = CDisplaySettings::Get().GetResolutionInfo(res); bool bFullScreen = res != RES_WINDOW; - if (!g_Windowing.CreateNewWindow(CSysInfo::GetAppName(), bFullScreen, CDisplaySettings::GetInstance().GetResolutionInfo(res), OnEvent)) + if (!g_Windowing.CreateNewWindow(CSysInfo::GetAppName(), bFullScreen, res_info, OnEvent)) + { + CLog::Log(LOGFATAL, "CApplication::Create: Unable to create window"); + return false; + } +#else + bool bFullScreen = CDisplaySettings::Get().GetCurrentResolution() != RES_WINDOW; + if (!g_Windowing.CreateNewWindow(CSysInfo::GetAppName(), bFullScreen, CDisplaySettings::Get().GetCurrentResolutionInfo(), OnEvent)) { CLog::Log(LOGFATAL, "CApplication::Create: Unable to create window"); return false; } +#endif if (!g_Windowing.InitRenderSystem()) { @@ -1082,6 +1101,7 @@ CDirectory::Create("special://home/addons"); CDirectory::Create("special://home/addons/packages"); CDirectory::Create("special://home/media"); + CDirectory::Create("special://home/sounds"); CDirectory::Create("special://home/system"); CDirectory::Create("special://masterprofile/"); CDirectory::Create("special://temp/"); @@ -1102,17 +1122,13 @@ #endif { CDirectory::Create("special://xbmc/addons"); + CDirectory::Create("special://xbmc/sounds"); } // load the language and its translated strings if (!LoadLanguage(false)) return false; - CEventLog::GetInstance().Add(EventPtr(new CNotificationEvent( - StringUtils::Format(g_localizeStrings.Get(177).c_str(), g_sysinfo.GetAppName().c_str()), - StringUtils::Format(g_localizeStrings.Get(178).c_str(), g_sysinfo.GetAppName().c_str()), - "special://xbmc/media/icon256x256.png", EventLevelBasic))); - g_peripherals.Initialise(); // Load curl so curl_global_init gets called before any service threads @@ -1128,7 +1144,7 @@ g_curlInterface.Unload(); // initialize (and update as needed) our databases - CDatabaseManager::GetInstance().Initialize(); + CDatabaseManager::Get().Initialize(); StartServices(); @@ -1137,7 +1153,7 @@ bool uiInitializationFinished = true; if (g_windowManager.Initialized()) { - CSettings::GetInstance().GetSetting(CSettings::SETTING_POWERMANAGEMENT_DISPLAYSOFF)->SetRequirementsMet(m_dpms->IsSupported()); + CSettings::Get().GetSetting("powermanagement.displaysoff")->SetRequirementsMet(m_dpms->IsSupported()); g_windowManager.CreateWindows(); /* window id's 3000 - 3100 are reserved for python */ @@ -1149,22 +1165,22 @@ g_windowManager.ActivateWindow(WINDOW_SPLASH); // Make sure we have at least the default skin - std::string defaultSkin = ((const CSettingString*)CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKIN))->GetDefault(); - if (!LoadSkin(CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKIN)) && !LoadSkin(defaultSkin)) + string defaultSkin = ((const CSettingString*)CSettings::Get().GetSetting("lookandfeel.skin"))->GetDefault(); + if (!LoadSkin(CSettings::Get().GetString("lookandfeel.skin")) && !LoadSkin(defaultSkin)) { CLog::Log(LOGERROR, "Default skin '%s' not found! Terminating..", defaultSkin.c_str()); return false; } - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MASTERLOCK_STARTUPLOCK) && - CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && - !CProfilesManager::GetInstance().GetMasterProfile().getLockCode().empty()) + if (CSettings::Get().GetBool("masterlock.startuplock") && + CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && + !CProfilesManager::Get().GetMasterProfile().getLockCode().empty()) { g_passwordManager.CheckStartUpLock(); } // check if we should use the login screen - if (CProfilesManager::GetInstance().UsingLoginScreen()) + if (CProfilesManager::Get().UsingLoginScreen()) { // the login screen still needs to perform additional initialization uiInitializationFinished = false; @@ -1176,7 +1192,7 @@ #ifdef HAS_JSONRPC CJSONRPC::Initialize(); #endif - ADDON::CAddonMgr::GetInstance().StartServices(false); + ADDON::CAddonMgr::Get().StartServices(false); // start the PVR manager StartPVRManager(); @@ -1188,8 +1204,7 @@ // the startup window is considered part of the initialization as it most likely switches to the final window uiInitializationFinished = firstWindow != WINDOW_STARTUP_ANIM; - CStereoscopicsManager::GetInstance().Initialize(); - CApplicationMessenger::GetInstance().SendMsg(TMSG_SETAUDIODSPSTATE, ACTIVE_AE_DSP_STATE_ON, ACTIVE_AE_DSP_SYNC_ACTIVATE); // send a blocking message to active AudioDSP engine + CStereoscopicsManager::Get().Initialize(); } } @@ -1198,7 +1213,7 @@ #ifdef HAS_JSONRPC CJSONRPC::Initialize(); #endif - ADDON::CAddonMgr::GetInstance().StartServices(false); + ADDON::CAddonMgr::Get().StartServices(false); } g_sysinfo.Refresh(); @@ -1206,24 +1221,21 @@ CLog::Log(LOGINFO, "removing tempfiles"); CUtil::RemoveTempFiles(); - if (!CProfilesManager::GetInstance().UsingLoginScreen()) + if (!CProfilesManager::Get().UsingLoginScreen()) { UpdateLibraries(); - SetLoggingIn(false); + SetLoggingIn(true); } m_slowTimer.StartZero(); - CAddonMgr::GetInstance().StartServices(true); + CAddonMgr::Get().StartServices(true); // configure seek handler - CSeekHandler::GetInstance().Configure(); + CSeekHandler::Get().Configure(); // register action listeners - RegisterActionListener(&CSeekHandler::GetInstance()); - RegisterActionListener(&CPlayerController::GetInstance()); - - CRepositoryUpdater::GetInstance().Start(); + RegisterActionListener(&CSeekHandler::Get()); CLog::Log(LOGNOTICE, "initialize done"); @@ -1233,7 +1245,7 @@ ResetScreenSaver(); #ifdef HAS_SDL_JOYSTICK - CInputManager::GetInstance().SetEnabledJoystick(CSettings::GetInstance().GetBool(CSettings::SETTING_INPUT_ENABLEJOYSTICK) && + CInputManager::Get().SetEnabledJoystick(CSettings::Get().GetBool("input.enablejoystick") && CPeripheralImon::GetCountOfImonsConflictWithDInput() == 0 ); #endif @@ -1254,51 +1266,51 @@ { case ES_WEBSERVER: // the callback will take care of starting/stopping webserver - ret = CSettings::GetInstance().SetBool(CSettings::SETTING_SERVICES_WEBSERVER, bStart); + ret = CSettings::Get().SetBool("services.webserver", bStart); break; case ES_AIRPLAYSERVER: // the callback will take care of starting/stopping airplay - ret = CSettings::GetInstance().SetBool(CSettings::SETTING_SERVICES_AIRPLAY, bStart); + ret = CSettings::Get().SetBool("services.airplay", bStart); break; case ES_JSONRPCSERVER: // the callback will take care of starting/stopping jsonrpc server - ret = CSettings::GetInstance().SetBool(CSettings::SETTING_SERVICES_ESENABLED, bStart); + ret = CSettings::Get().SetBool("services.esenabled", bStart); break; case ES_UPNPSERVER: // the callback will take care of starting/stopping upnp server - ret = CSettings::GetInstance().SetBool(CSettings::SETTING_SERVICES_UPNPSERVER, bStart); + ret = CSettings::Get().SetBool("services.upnpserver", bStart); break; case ES_UPNPRENDERER: // the callback will take care of starting/stopping upnp renderer - ret = CSettings::GetInstance().SetBool(CSettings::SETTING_SERVICES_UPNPRENDERER, bStart); + ret = CSettings::Get().SetBool("services.upnprenderer", bStart); break; case ES_EVENTSERVER: // the callback will take care of starting/stopping event server - ret = CSettings::GetInstance().SetBool(CSettings::SETTING_SERVICES_ESENABLED, bStart); + ret = CSettings::Get().SetBool("services.esenabled", bStart); break; case ES_ZEROCONF: // the callback will take care of starting/stopping zeroconf - ret = CSettings::GetInstance().SetBool(CSettings::SETTING_SERVICES_ZEROCONF, bStart); + ret = CSettings::Get().SetBool("services.zeroconf", bStart); break; default: ret = false; break; } - CSettings::GetInstance().Save(); + CSettings::Get().Save(); return ret; } void CApplication::StartPVRManager() { - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_ENABLED)) + if (!CSettings::Get().GetBool("pvrmanager.enabled")) return; g_PVRManager.Start(true); @@ -1340,113 +1352,86 @@ return; const std::string &settingId = setting->GetId(); - // check if we should ignore this change event due to changing skins in which case we have to - // change several settings and each one of them could lead to a complete skin reload which would - // result in multiple skin reloads. Therefore we manually specify to ignore specific settings - // which are going to be changed. - if (settingId == m_skinReloadSettingIgnore) - { - m_skinReloadSettingIgnore.clear(); - return; - } - - if (settingId == CSettings::SETTING_LOOKANDFEEL_SKIN || - settingId == CSettings::SETTING_LOOKANDFEEL_FONT || - settingId == CSettings::SETTING_LOOKANDFEEL_SKINTHEME || - settingId == CSettings::SETTING_LOOKANDFEEL_SKINCOLORS) - { - // if the skin changes and the current color/theme/font is not the default one, reset - // the it to the default value - if (settingId == CSettings::SETTING_LOOKANDFEEL_SKIN) + if (settingId == "lookandfeel.skin" || + settingId == "lookandfeel.font" || + settingId == "lookandfeel.skincolors") + { + // if the skin changes and the current theme is not the default one, reset + // the theme to the default value (which will also change lookandfeel.skincolors + // which in turn will reload the skin. Similarly, if the current skin font is not + // the default, reset it as well. + if (settingId == "lookandfeel.skin" && CSettings::Get().GetString("lookandfeel.skintheme") != "SKINDEFAULT") { - CSetting* skinRelatedSetting = CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS); - if (!skinRelatedSetting->IsDefault()) - { - m_skinReloadSettingIgnore = skinRelatedSetting->GetId(); - skinRelatedSetting->Reset(); - } - - skinRelatedSetting = CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKINTHEME); - if (!skinRelatedSetting->IsDefault()) - { - m_skinReloadSettingIgnore = skinRelatedSetting->GetId(); - skinRelatedSetting->Reset(); - } - - setting = CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_FONT); - if (!setting->IsDefault()) - { - m_skinReloadSettingIgnore = skinRelatedSetting->GetId(); - skinRelatedSetting->Reset(); - } + CSettings::Get().SetString("lookandfeel.skintheme", "SKINDEFAULT"); + return; } - else if (settingId == CSettings::SETTING_LOOKANDFEEL_SKINTHEME) + if (settingId == "lookandfeel.skin" && CSettings::Get().GetString("lookandfeel.font") != "Default") { - CSettingString* skinColorsSetting = static_cast(CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS)); - m_skinReloadSettingIgnore = skinColorsSetting->GetId(); - - // we also need to adjust the skin color setting - std::string colorTheme = ((CSettingString*)setting)->GetValue(); - URIUtils::RemoveExtension(colorTheme); - if (setting->IsDefault() || StringUtils::EqualsNoCase(colorTheme, "Textures")) - skinColorsSetting->Reset(); - else - skinColorsSetting->SetValue(colorTheme); + CSettings::Get().SetString("lookandfeel.font", "Default"); + return; } - // reset the settings to ignore during changing skins - m_skinReloadSettingIgnore.clear(); + // Reset sounds setting if new skin doen't provide sounds + if (settingId == "lookandfeel.skin" && CSettings::Get().GetString("lookandfeel.soundskin") == "SKINDEFAULT") + { + ADDON::AddonPtr addon; + if (CAddonMgr::Get().GetAddon(((CSettingString*)setting)->GetValue(), addon, ADDON_SKIN)) + { + if (!CDirectory::Exists(URIUtils::AddFileToFolder(addon->Path(), "sounds"))) + CSettings::Get().GetSetting("lookandfeel.soundskin")->Reset(); + } + } - // now we can finally reload skins std::string builtin("ReloadSkin"); - if (settingId == CSettings::SETTING_LOOKANDFEEL_SKIN && !m_skinReverting) + if (settingId == "lookandfeel.skin" && !m_skinReverting) builtin += "(confirm)"; - CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, builtin); + CApplicationMessenger::Get().ExecBuiltIn(builtin); } - else if (settingId == CSettings::SETTING_LOOKANDFEEL_SKINZOOM) + else if (settingId == "lookandfeel.skintheme") + { + // also set the default color theme + std::string colorTheme = ((CSettingString*)setting)->GetValue(); + URIUtils::RemoveExtension(colorTheme); + if (StringUtils::EqualsNoCase(colorTheme, "Textures")) + colorTheme = "defaults"; + + // check if we have to change the skin color + // if yes, it will trigger a call to ReloadSkin() in + // it's OnSettingChanged() callback + // if no we have to call ReloadSkin() ourselves + if (!StringUtils::EqualsNoCase(colorTheme, CSettings::Get().GetString("lookandfeel.skincolors"))) + CSettings::Get().SetString("lookandfeel.skincolors", colorTheme); + else + CApplicationMessenger::Get().ExecBuiltIn("ReloadSkin"); + } + else if (settingId == "lookandfeel.skinzoom") { CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_WINDOW_RESIZE); g_windowManager.SendThreadMessage(msg); } else if (StringUtils::StartsWithNoCase(settingId, "audiooutput.")) { - if (settingId == CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED) - { - if (((CSettingBool *) setting)->GetValue()) - { - CApplicationMessenger::GetInstance().PostMsg(TMSG_SETAUDIODSPSTATE, ACTIVE_AE_DSP_STATE_ON, ACTIVE_AE_DSP_SYNC_ACTIVATE); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_RESTART); // send non blocking media restart message - } - else - { - CAEFactory::OnSettingsChange(settingId); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_RESTART); // send non blocking media restart message - CApplicationMessenger::GetInstance().PostMsg(TMSG_SETAUDIODSPSTATE, ACTIVE_AE_DSP_STATE_OFF); - } - return; - } - // AE is master of audio settings and needs to be informed first CAEFactory::OnSettingsChange(settingId); - if (settingId == CSettings::SETTING_AUDIOOUTPUT_GUISOUNDMODE) + if (settingId == "audiooutput.guisoundmode") { CAEFactory::SetSoundMode(((CSettingInt*)setting)->GetValue()); } // this tells player whether to open an audio stream passthrough or PCM // if this is changed, audio stream has to be reopened - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH) + else if (settingId == "audiooutput.passthrough") { - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_RESTART); + CApplicationMessenger::Get().MediaRestart(false); } } - else if (StringUtils::EqualsNoCase(settingId, CSettings::SETTING_MUSICPLAYER_REPLAYGAINTYPE)) + else if (StringUtils::EqualsNoCase(settingId, "musicplayer.replaygaintype")) m_replayGainSettings.iType = ((CSettingInt*)setting)->GetValue(); - else if (StringUtils::EqualsNoCase(settingId, CSettings::SETTING_MUSICPLAYER_REPLAYGAINPREAMP)) + else if (StringUtils::EqualsNoCase(settingId, "musicplayer.replaygainpreamp")) m_replayGainSettings.iPreAmp = ((CSettingInt*)setting)->GetValue(); - else if (StringUtils::EqualsNoCase(settingId, CSettings::SETTING_MUSICPLAYER_REPLAYGAINNOGAINPREAMP)) + else if (StringUtils::EqualsNoCase(settingId, "musicplayer.replaygainnogainpreamp")) m_replayGainSettings.iNoGainPreAmp = ((CSettingInt*)setting)->GetValue(); - else if (StringUtils::EqualsNoCase(settingId, CSettings::SETTING_MUSICPLAYER_REPLAYGAINAVOIDCLIPPING)) + else if (StringUtils::EqualsNoCase(settingId, "musicplayer.replaygainavoidclipping")) m_replayGainSettings.bAvoidClipping = ((CSettingBool*)setting)->GetValue(); } @@ -1456,25 +1441,25 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_LOOKANDFEEL_SKINSETTINGS) + if (settingId == "lookandfeel.skinsettings") g_windowManager.ActivateWindow(WINDOW_SKIN_SETTINGS); - else if (settingId == CSettings::SETTING_SCREENSAVER_PREVIEW) + else if (settingId == "screensaver.preview") ActivateScreenSaver(true); - else if (settingId == CSettings::SETTING_SCREENSAVER_SETTINGS) + else if (settingId == "screensaver.settings") { AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(CSettings::GetInstance().GetString(CSettings::SETTING_SCREENSAVER_MODE), addon, ADDON_SCREENSAVER)) + if (CAddonMgr::Get().GetAddon(CSettings::Get().GetString("screensaver.mode"), addon, ADDON_SCREENSAVER)) CGUIDialogAddonSettings::ShowAndGetInput(addon); } - else if (settingId == CSettings::SETTING_AUDIOCDS_SETTINGS) + else if (settingId == "audiocds.settings") { AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_ENCODER), addon, ADDON_AUDIOENCODER)) + if (CAddonMgr::Get().GetAddon(CSettings::Get().GetString("audiocds.encoder"), addon, ADDON_AUDIOENCODER)) CGUIDialogAddonSettings::ShowAndGetInput(addon); } - else if (settingId == CSettings::SETTING_VIDEOSCREEN_GUICALIBRATION) + else if (settingId == "videoscreen.guicalibration") g_windowManager.ActivateWindow(WINDOW_SCREEN_CALIBRATION); - else if (settingId == CSettings::SETTING_VIDEOSCREEN_TESTPATTERN) + else if (settingId == "videoscreen.testpattern") g_windowManager.ActivateWindow(WINDOW_TEST_PATTERN); } @@ -1483,8 +1468,9 @@ if (setting == NULL) return false; + const std::string &settingId = setting->GetId(); #if defined(HAS_LIBAMCODEC) - if (setting->GetId() == CSettings::SETTING_VIDEOPLAYER_USEAMCODEC) + if (settingId == "videoplayer.useamcodec") { // Do not permit amcodec to be used on non-aml platforms. // The setting will be hidden but the default value is true, @@ -1497,14 +1483,14 @@ } #endif #if defined(TARGET_ANDROID) - if (setting->GetId() == CSettings::SETTING_VIDEOPLAYER_USESTAGEFRIGHT) + if (settingId == "videoplayer.usestagefright") { CSettingBool *usestagefright = (CSettingBool*)setting; return usestagefright->SetValue(false); } #endif #if defined(TARGET_DARWIN_OSX) - if (setting->GetId() == CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE) + if (settingId == "audiooutput.audiodevice") { CSettingString *audioDevice = (CSettingString*)setting; // Gotham and older didn't enumerate audio devices per stream on osx @@ -1540,32 +1526,32 @@ CGUIMessage msg(GUI_MSG_LOAD_SKIN, -1, g_windowManager.GetActiveWindow()); g_windowManager.SendMessage(msg); - std::string newSkin = CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKIN); + string newSkin = CSettings::Get().GetString("lookandfeel.skin"); if (LoadSkin(newSkin)) { /* The Reset() or SetString() below will cause recursion, so the m_skinReverting boolean is set so as to not prompt the user as to whether they want to keep the current skin. */ if (confirm && !m_skinReverting) { - if (HELPERS::ShowYesNoDialogText(CVariant{13123}, CVariant{13111}, CVariant{""}, CVariant{""}, 10000) != - DialogResponse::YES) + bool cancelled; + if (!CGUIDialogYesNo::ShowAndGetInput(13123, 13111, cancelled, "", "", 10000)) { m_skinReverting = true; if (oldSkin.empty()) - CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKIN)->Reset(); + CSettings::Get().GetSetting("lookandfeel.skin")->Reset(); else - CSettings::GetInstance().SetString(CSettings::SETTING_LOOKANDFEEL_SKIN, oldSkin); + CSettings::Get().SetString("lookandfeel.skin", oldSkin); } } } else { // skin failed to load - we revert to the default only if we didn't fail loading the default - std::string defaultSkin = ((CSettingString*)CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKIN))->GetDefault(); + string defaultSkin = ((CSettingString*)CSettings::Get().GetSetting("lookandfeel.skin"))->GetDefault(); if (newSkin != defaultSkin) { m_skinReverting = true; - CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKIN)->Reset(); + CSettings::Get().GetSetting("lookandfeel.skin")->Reset(); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(24102), g_localizeStrings.Get(24103)); } } @@ -1580,9 +1566,15 @@ const TiXmlElement *audioElement = settings->FirstChildElement("audio"); if (audioElement != NULL) { +#ifndef TARGET_ANDROID XMLUtils::GetBoolean(audioElement, "mute", m_muted); if (!XMLUtils::GetFloat(audioElement, "fvolumelevel", m_volumeLevel, VOLUME_MINIMUM, VOLUME_MAXIMUM)) m_volumeLevel = VOLUME_MAXIMUM; +#else + // Use system volume settings + m_volumeLevel = CXBMCApp::GetSystemVolume(); + m_muted = (m_volumeLevel == 0); +#endif } return true; @@ -1607,7 +1599,7 @@ bool CApplication::LoadSkin(const std::string& skinID) { AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(skinID, addon, ADDON_SKIN)) + if (CAddonMgr::Get().GetAddon(skinID, addon, ADDON_SKIN)) { if (LoadSkin(std::dynamic_pointer_cast(addon))) return true; @@ -1621,13 +1613,7 @@ if (!skin) return false; - // start/prepare the skin skin->Start(); - - // migrate any skin-specific settings that are still stored in guisettings.xml - CSkinSettings::GetInstance().MigrateSettings(skin); - - // check if the skin has been properly loaded and if it has a Home.xml if (!skin->HasSkinFile("Home.xml")) return false; @@ -1655,7 +1641,7 @@ CGUIWindow* pWindow = g_windowManager.GetWindow(currentWindow); if (pWindow) iCtrlID = pWindow->GetFocusedControlID(); - std::vector currentModelessWindows; + vector currentModelessWindows; g_windowManager.GetActiveModelessWindows(currentModelessWindows); UnloadSkin(); @@ -1668,15 +1654,15 @@ g_graphicsContext.SetMediaDir(skin->Path()); g_directoryCache.ClearSubPaths(skin->Path()); - g_colorManager.Load(CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS)); + g_colorManager.Load(CSettings::Get().GetString("lookandfeel.skincolors")); - g_fontManager.LoadFonts(CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_FONT)); + g_fontManager.LoadFonts(CSettings::Get().GetString("lookandfeel.font")); // load in the skin strings std::string langPath = URIUtils::AddFileToFolder(skin->Path(), "language"); URIUtils::AddSlashAtEnd(langPath); - g_localizeStrings.LoadSkinStrings(langPath, CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_LANGUAGE)); + g_localizeStrings.LoadSkinStrings(langPath, CSettings::Get().GetString("locale.language")); g_SkinInfo->LoadIncludes(); @@ -1698,16 +1684,23 @@ g_windowManager.AddMsgTarget(&g_playlistPlayer); g_windowManager.AddMsgTarget(&g_infoManager); g_windowManager.AddMsgTarget(&g_fontManager); - g_windowManager.AddMsgTarget(&CStereoscopicsManager::GetInstance()); + g_windowManager.AddMsgTarget(&CStereoscopicsManager::Get()); g_windowManager.SetCallback(*this); g_windowManager.Initialize(); - CTextureCache::GetInstance().Initialize(); + CTextureCache::Get().Initialize(); g_audioManager.Enable(true); g_audioManager.Load(); if (g_SkinInfo->HasSkinFile("DialogFullScreenInfo.xml")) g_windowManager.Add(new CGUIDialogFullScreenInfo); + { // we can't register visible condition in dialog's ctor because infomanager is cleared when unloading skin + CGUIDialog *overlay = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_VIDEO_OVERLAY); + if (overlay) overlay->SetVisibleCondition("skin.hasvideooverlay"); + overlay = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_MUSIC_OVERLAY); + if (overlay) overlay->SetVisibleCondition("skin.hasmusicoverlay"); + } + CLog::Log(LOGINFO, " skin loaded..."); // leave the graphics lock @@ -1720,8 +1713,7 @@ for (unsigned int i = 0; i < currentModelessWindows.size(); i++) { CGUIDialog *dialog = (CGUIDialog *)g_windowManager.GetWindow(currentModelessWindows[i]); - if (dialog) - dialog->Open(); + if (dialog) dialog->Show(); } if (iCtrlID != -1) { @@ -1748,15 +1740,10 @@ { CLog::Log(LOGINFO, "Unloading old skin %s...", forReload ? "for reload " : ""); - if (g_SkinInfo != nullptr && m_saveSkinOnUnloading) - g_SkinInfo->SaveSettings(); - else if (!m_saveSkinOnUnloading) - m_saveSkinOnUnloading = true; - g_audioManager.Enable(false); g_windowManager.DeInitialize(); - CTextureCache::GetInstance().Deinitialize(); + CTextureCache::Get().Deinitialize(); // remove the skin-dependent window g_windowManager.Delete(WINDOW_DIALOG_FULLSCREEN_INFO); @@ -1832,7 +1819,7 @@ CGUIControlFactory::GetConditionalVisibility(pRootElement, visibleCondition); if (StringUtils::EqualsNoCase(strType, "dialog")) - pWindow = new CGUIDialog(id + WINDOW_HOME, skinFile, visibleCondition.empty() ? DialogModalityType::MODAL : DialogModalityType::MODELESS); + pWindow = new CGUIDialog(id + WINDOW_HOME, skinFile); else if (StringUtils::EqualsNoCase(strType, "submenu")) pWindow = new CGUIDialogSubMenu(id + WINDOW_HOME, skinFile); else if (StringUtils::EqualsNoCase(strType, "buttonmenu")) @@ -1869,7 +1856,18 @@ // g_graphicsContext.AcquireCurrentContext(); g_graphicsContext.Lock(); - + + // dont show GUI when playing full screen video + if (g_graphicsContext.IsFullScreenVideo()) + { + // close window overlays + CGUIDialog *overlay = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_VIDEO_OVERLAY); + if (overlay) overlay->Close(true); + overlay = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_MUSIC_OVERLAY); + if (overlay) overlay->Close(true); + + } + bool hasRendered = g_windowManager.Render(); g_graphicsContext.Unlock(); @@ -1898,7 +1896,7 @@ MEASURE_FUNCTION; - int vsync_mode = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOSCREEN_VSYNC); + int vsync_mode = CSettings::Get().GetInt("videoscreen.vsync"); bool hasRendered = false; bool limitFrames = false; @@ -1930,7 +1928,7 @@ limitFrames = true; // not using vsync. vsync = false; } - else if ((g_infoManager.GetFPS() > g_graphicsContext.GetFPS() + 10) && g_infoManager.GetFPS() > 1000.0f / singleFrameTime) + else if ((g_infoManager.GetFPS() > g_graphicsContext.GetFPS() + 10) && g_infoManager.GetFPS() > 1000 / singleFrameTime) { limitFrames = true; // using vsync, but it isn't working. vsync = false; @@ -2108,7 +2106,7 @@ } if (action.IsMouse()) - CInputManager::GetInstance().SetMouseActive(true); + CInputManager::Get().SetMouseActive(true); if (action.GetID() == ACTION_CREATE_EPISODE_BOOKMARK) @@ -2158,10 +2156,10 @@ // built in functions : execute the built-in if (action.GetID() == ACTION_BUILT_IN_FUNCTION) { - if (!CBuiltins::GetInstance().IsSystemPowerdownCommand(action.GetName()) || + if (!CBuiltins::IsSystemPowerdownCommand(action.GetName()) || g_PVRManager.CanSystemPowerdown()) { - CBuiltins::GetInstance().Execute(action.GetName()); + CBuiltins::Execute(action.GetName()); m_navigationTimer.StartZero(); } return true; @@ -2194,16 +2192,16 @@ if (tag) { *m_itemCurrentFile->GetMusicInfoTag() = *tag; - char rating = tag->GetUserrating(); + char rating = tag->GetRating(); bool needsUpdate(false); if (rating > '0' && action.GetID() == ACTION_DECREASE_RATING) { - m_itemCurrentFile->GetMusicInfoTag()->SetUserrating(rating - 1); + m_itemCurrentFile->GetMusicInfoTag()->SetRating(rating - 1); needsUpdate = true; } else if (rating < '5' && action.GetID() == ACTION_INCREASE_RATING) { - m_itemCurrentFile->GetMusicInfoTag()->SetUserrating(rating + 1); + m_itemCurrentFile->GetMusicInfoTag()->SetRating(rating + 1); needsUpdate = true; } if (needsUpdate) @@ -2211,40 +2209,7 @@ CMusicDatabase db; if (db.Open()) // OpenForWrite() ? { - db.SetSongUserrating(m_itemCurrentFile->GetPath(), m_itemCurrentFile->GetMusicInfoTag()->GetUserrating()); - db.Close(); - } - // send a message to all windows to tell them to update the fileitem (eg playlistplayer, media windows) - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_ITEM, 0, m_itemCurrentFile); - g_windowManager.SendMessage(msg); - } - } - return true; - } - else if ((action.GetID() == ACTION_INCREASE_RATING || action.GetID() == ACTION_DECREASE_RATING) && m_pPlayer->IsPlayingVideo()) - { - const CVideoInfoTag *tag = g_infoManager.GetCurrentMovieTag(); - if (tag) - { - *m_itemCurrentFile->GetVideoInfoTag() = *tag; - int rating = tag->m_iUserRating; - bool needsUpdate(false); - if (rating > 1 && action.GetID() == ACTION_DECREASE_RATING) - { - m_itemCurrentFile->GetVideoInfoTag()->m_iUserRating = rating - 1; - needsUpdate = true; - } - else if (rating < 10 && action.GetID() == ACTION_INCREASE_RATING) - { - m_itemCurrentFile->GetVideoInfoTag()->m_iUserRating = rating + 1; - needsUpdate = true; - } - if (needsUpdate) - { - CVideoDatabase db; - if (db.Open()) - { - db.SetVideoUserRating(m_itemCurrentFile->GetVideoInfoTag()->m_iDbId, m_itemCurrentFile->GetVideoInfoTag()->m_iUserRating, m_itemCurrentFile->GetVideoInfoTag()->m_type); + db.SetSongRating(m_itemCurrentFile->GetPath(), m_itemCurrentFile->GetMusicInfoTag()->GetRating()); db.Close(); } // send a message to all windows to tell them to update the fileitem (eg playlistplayer, media windows) @@ -2276,9 +2241,7 @@ // Player ignored action; popup the OSD if ((action.GetID() == ACTION_MOUSE_MOVE && (action.GetAmount(2) || action.GetAmount(3))) // filter "false" mouse move from touch || action.GetID() == ACTION_MOUSE_LEFT_CLICK) - { - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_TRIGGER_OSD))); - } + CApplicationMessenger::Get().SendAction(CAction(ACTION_TRIGGER_OSD), WINDOW_INVALID, false); } // stop : stops playing current audio song @@ -2298,7 +2261,7 @@ } // forward action to graphic context and see if it can handle it - if (CStereoscopicsManager::GetInstance().OnAction(action)) + if (CStereoscopicsManager::Get().OnAction(action)) return true; if (m_pPlayer->IsPlaying()) @@ -2318,6 +2281,9 @@ if (!m_pPlayer->IsPaused() && m_pPlayer->GetPlaySpeed() != 1) m_pPlayer->SetPlaySpeed(1, g_application.m_muted); + #ifdef HAS_KARAOKE + m_pKaraokeMgr->SetPaused( m_pPlayer->IsPaused() ); +#endif g_audioManager.Enable(m_pPlayer->IsPaused()); return true; } @@ -2358,8 +2324,6 @@ { // calculate the speed based on the amount the button is held down int iPower = (int)(action.GetAmount() * MAX_FFWD_SPEED + 0.5f); - // amount can be negative, for example rewind and forward share the same axis - iPower = std::abs(iPower); // returns 0 -> MAX_FFWD_SPEED int iSpeed = 1 << iPower; if (iSpeed != 1 && action.GetID() == ACTION_ANALOG_REWIND) @@ -2390,6 +2354,9 @@ if (m_pPlayer->CanRecord()) m_pPlayer->Record(!m_pPlayer->IsRecording()); } + + if (m_playerController->OnAction(action)) + return true; } @@ -2399,8 +2366,8 @@ { VECPLAYERCORES cores; CFileItem item(*m_itemCurrentFile.get()); - CPlayerCoreFactory::GetInstance().GetPlayers(item, cores); - PLAYERCOREID core = CPlayerCoreFactory::GetInstance().SelectPlayerDialog(cores); + CPlayerCoreFactory::Get().GetPlayers(item, cores); + PLAYERCOREID core = CPlayerCoreFactory::Get().SelectPlayerDialog(cores); if(core != EPC_NONE) { g_application.m_eForcedNextPlayer = core; @@ -2411,8 +2378,8 @@ else { VECPLAYERCORES cores; - CPlayerCoreFactory::GetInstance().GetRemotePlayers(cores); - PLAYERCOREID core = CPlayerCoreFactory::GetInstance().SelectPlayerDialog(cores); + CPlayerCoreFactory::Get().GetRemotePlayers(cores); + PLAYERCOREID core = CPlayerCoreFactory::Get().SelectPlayerDialog(cores); if(core != EPC_NONE) { CFileItem item; @@ -2433,8 +2400,8 @@ if (action.GetID() == ACTION_TOGGLE_DIGITAL_ANALOG) { - bool passthrough = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH); - CSettings::GetInstance().SetBool(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH, !passthrough); + bool passthrough = CSettings::Get().GetBool("audiooutput.passthrough"); + CSettings::Get().SetBool("audiooutput.passthrough", !passthrough); if (g_windowManager.GetActiveWindow() == WINDOW_SETTINGS_SYSTEM) { @@ -2445,7 +2412,7 @@ } // Check for global volume control - if ((action.GetAmount() && (action.GetID() == ACTION_VOLUME_UP || action.GetID() == ACTION_VOLUME_DOWN)) || action.GetID() == ACTION_VOLUME_SET) + if ((action.GetAmount() && (action.GetID() == ACTION_VOLUME_UP || action.GetID() == ACTION_VOLUME_DOWN) || action.GetID() == ACTION_VOLUME_SET)) { if (!m_pPlayer->IsPassthrough()) { @@ -2492,304 +2459,6 @@ return false; } -int CApplication::GetMessageMask() -{ - return TMSG_MASK_APPLICATION; -} - -void CApplication::OnApplicationMessage(ThreadMessage* pMsg) -{ - switch (pMsg->dwMessage) - { - case TMSG_POWERDOWN: - Stop(EXITCODE_POWERDOWN); - g_powerManager.Powerdown(); - break; - - case TMSG_QUIT: - Stop(EXITCODE_QUIT); - break; - - case TMSG_SHUTDOWN: - HandleShutdownMessage(); - break; - - case TMSG_RENDERER_FLUSH: - g_renderManager.Flush(); - break; - - case TMSG_HIBERNATE: - g_powerManager.Hibernate(); - break; - - case TMSG_SUSPEND: - g_powerManager.Suspend(); - break; - - case TMSG_RESTART: - case TMSG_RESET: - Stop(EXITCODE_REBOOT); - g_powerManager.Reboot(); - break; - - case TMSG_RESTARTAPP: -#if defined(TARGET_WINDOWS) || defined(TARGET_LINUX) - Stop(EXITCODE_RESTARTAPP); -#endif - break; - - case TMSG_INHIBITIDLESHUTDOWN: - InhibitIdleShutdown(pMsg->param1 != 0); - break; - - case TMSG_ACTIVATESCREENSAVER: - ActivateScreenSaver(); - break; - - case TMSG_VOLUME_SHOW: - { - CAction action(pMsg->param1); - ShowVolumeBar(&action); - } - break; - -#ifdef TARGET_ANDROID - case TMSG_DISPLAY_SETUP: - // We might come from a refresh rate switch destroying the native window; use the context resolution - *static_cast(pMsg->lpVoid) = InitWindow(g_graphicsContext.GetVideoResolution()); - SetRenderGUI(true); - break; - - case TMSG_DISPLAY_DESTROY: - *static_cast(pMsg->lpVoid) = DestroyWindow(); - SetRenderGUI(false); - break; -#endif - - case TMSG_SETPVRMANAGERSTATE: - if (pMsg->param1 != 0) - StartPVRManager(); - else - StopPVRManager(); - break; - - case TMSG_SETAUDIODSPSTATE: - if(pMsg->param1 == ACTIVE_AE_DSP_STATE_ON) - ActiveAE::CActiveAEDSP::GetInstance().Activate(pMsg->param2 == ACTIVE_AE_DSP_ASYNC_ACTIVATE); - else if(pMsg->param1 == ACTIVE_AE_DSP_STATE_OFF) - ActiveAE::CActiveAEDSP::GetInstance().Deactivate(); - break; - - case TMSG_START_ANDROID_ACTIVITY: - { -#if defined(TARGET_ANDROID) - if (pMsg->params.size()) - { - CXBMCApp::StartActivity(pMsg->params[0], - pMsg->params.size() > 1 ? pMsg->params[1] : "", - pMsg->params.size() > 2 ? pMsg->params[2] : "", - pMsg->params.size() > 3 ? pMsg->params[3] : ""); - } -#endif - } - break; - - case TMSG_NETWORKMESSAGE: - getNetwork().NetworkMessage((CNetwork::EMESSAGE)pMsg->param1, pMsg->param2); - break; - - case TMSG_SETLANGUAGE: - SetLanguage(pMsg->strParam); - break; - - - case TMSG_SWITCHTOFULLSCREEN: - if (g_windowManager.GetActiveWindow() != WINDOW_FULLSCREEN_VIDEO) - SwitchToFullScreen(true); - break; - - case TMSG_VIDEORESIZE: - { - XBMC_Event newEvent; - memset(&newEvent, 0, sizeof(newEvent)); - newEvent.type = XBMC_VIDEORESIZE; - newEvent.resize.w = pMsg->param1; - newEvent.resize.h = pMsg->param2; - OnEvent(newEvent); - g_windowManager.MarkDirty(); - } - break; - - case TMSG_SETVIDEORESOLUTION: - g_graphicsContext.SetVideoResolution(static_cast(pMsg->param1), pMsg->param2 == 1); - break; - - case TMSG_TOGGLEFULLSCREEN: - g_graphicsContext.Lock(); - g_graphicsContext.ToggleFullScreenRoot(); - g_graphicsContext.Unlock(); - break; - - case TMSG_MINIMIZE: - Minimize(); - break; - - case TMSG_EXECUTE_OS: - /* Suspend AE temporarily so exclusive or hog-mode sinks */ - /* don't block external player's access to audio device */ - if (!CAEFactory::Suspend()) - { - CLog::Log(LOGNOTICE, "%s: Failed to suspend AudioEngine before launching external program", __FUNCTION__); - } -#if defined( TARGET_POSIX) && !defined(TARGET_DARWIN) - CUtil::RunCommandLine(pMsg->strParam.c_str(), (pMsg->param1 == 1)); -#elif defined(TARGET_WINDOWS) - CWIN32Util::XBMCShellExecute(pMsg->strParam.c_str(), (pMsg->param1 == 1)); -#endif - /* Resume AE processing of XBMC native audio */ - if (!CAEFactory::Resume()) - { - CLog::Log(LOGFATAL, "%s: Failed to restart AudioEngine after return from external player", __FUNCTION__); - } - break; - - case TMSG_EXECUTE_SCRIPT: - CScriptInvocationManager::GetInstance().ExecuteAsync(pMsg->strParam); - break; - - case TMSG_EXECUTE_BUILT_IN: - CBuiltins::GetInstance().Execute(pMsg->strParam.c_str()); - break; - - case TMSG_PICTURE_SHOW: - { - CGUIWindowSlideShow *pSlideShow = static_cast(g_windowManager.GetWindow(WINDOW_SLIDESHOW)); - if (!pSlideShow) return; - - // stop playing file - if (g_application.m_pPlayer->IsPlayingVideo()) g_application.StopPlaying(); - - if (g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO) - g_windowManager.PreviousWindow(); - - g_application.ResetScreenSaver(); - g_application.WakeUpScreenSaverAndDPMS(); - - g_graphicsContext.Lock(); - - if (g_windowManager.GetActiveWindow() != WINDOW_SLIDESHOW) - g_windowManager.ActivateWindow(WINDOW_SLIDESHOW); - if (URIUtils::IsZIP(pMsg->strParam) || URIUtils::IsRAR(pMsg->strParam)) // actually a cbz/cbr - { - CFileItemList items; - CURL pathToUrl; - if (URIUtils::IsZIP(pMsg->strParam)) - pathToUrl = URIUtils::CreateArchivePath("zip", CURL(pMsg->strParam), ""); - else - pathToUrl = URIUtils::CreateArchivePath("rar", CURL(pMsg->strParam), ""); - - CUtil::GetRecursiveListing(pathToUrl.Get(), items, g_advancedSettings.m_pictureExtensions, XFILE::DIR_FLAG_NO_FILE_DIRS); - if (items.Size() > 0) - { - pSlideShow->Reset(); - for (int i = 0; iAdd(items[i].get()); - } - pSlideShow->Select(items[0]->GetPath()); - } - } - else - { - CFileItem item(pMsg->strParam, false); - pSlideShow->Reset(); - pSlideShow->Add(&item); - pSlideShow->Select(pMsg->strParam); - } - g_graphicsContext.Unlock(); - } - break; - - case TMSG_PICTURE_SLIDESHOW: - { - CGUIWindowSlideShow *pSlideShow = static_cast(g_windowManager.GetWindow(WINDOW_SLIDESHOW)); - if (!pSlideShow) return; - - if (g_application.m_pPlayer->IsPlayingVideo()) - g_application.StopPlaying(); - - g_graphicsContext.Lock(); - pSlideShow->Reset(); - - CFileItemList items; - std::string strPath = pMsg->strParam; - std::string extensions = g_advancedSettings.m_pictureExtensions; - if (pMsg->param1) - extensions += "|.tbn"; - CUtil::GetRecursiveListing(strPath, items, extensions); - - if (items.Size() > 0) - { - for (int i = 0; iAdd(items[i].get()); - pSlideShow->StartSlideShow(); //Start the slideshow! - } - - if (g_windowManager.GetActiveWindow() != WINDOW_SLIDESHOW) - { - if (items.Size() == 0) - { - CSettings::GetInstance().SetString(CSettings::SETTING_SCREENSAVER_MODE, "screensaver.xbmc.builtin.dim"); - g_application.ActivateScreenSaver(); - } - else - g_windowManager.ActivateWindow(WINDOW_SLIDESHOW); - } - - g_graphicsContext.Unlock(); - } - break; - - case TMSG_LOADPROFILE: - CGUIWindowLoginScreen::LoadProfile(pMsg->param1); - break; - - default: - CLog::Log(LOGERROR, "%s: Unhandled threadmessage sent, %u", __FUNCTION__, pMsg->dwMessage); - break; - } -} - -void CApplication::HandleShutdownMessage() -{ - switch (CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE)) - { - case POWERSTATE_SHUTDOWN: - CApplicationMessenger::GetInstance().PostMsg(TMSG_POWERDOWN); - break; - - case POWERSTATE_SUSPEND: - CApplicationMessenger::GetInstance().PostMsg(TMSG_SUSPEND); - break; - - case POWERSTATE_HIBERNATE: - CApplicationMessenger::GetInstance().PostMsg(TMSG_HIBERNATE); - break; - - case POWERSTATE_QUIT: - CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT); - break; - - case POWERSTATE_MINIMIZE: - CApplicationMessenger::GetInstance().PostMsg(TMSG_MINIMIZE); - break; - - default: - CLog::Log(LOGERROR, "%s: No valid shutdownstate matched", __FUNCTION__); - break; - } -} - void CApplication::FrameMove(bool processEvents, bool processGUI) { MEASURE_FUNCTION; @@ -2811,19 +2480,19 @@ { if (!toast->IsDialogRunning()) { - toast->Open(); + toast->Show(); } } g_graphicsContext.Unlock(); } CWinEvents::MessagePump(); - CInputManager::GetInstance().Process(g_windowManager.GetActiveWindowID(), frameTime); + CInputManager::Get().Process(g_windowManager.GetActiveWindowID(), frameTime); if (processGUI && m_renderGUI) { m_pInertialScrollingHandler->ProcessInertialScroll(frameTime); - CSeekHandler::GetInstance().Process(); + CSeekHandler::Get().Process(); } } if (processGUI && m_renderGUI) @@ -2835,7 +2504,7 @@ // This code reduces rendering fps of the GUI layer when playing videos in fullscreen mode // it makes only sense on architectures with multiple layers if (g_graphicsContext.IsFullScreenVideo() && !m_pPlayer->IsPausedPlayback() && g_renderManager.IsVideoLayer()) - fps = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_LIMITGUIUPDATE); + fps = CSettings::Get().GetInt("videoplayer.limitguiupdate"); #endif unsigned int now = XbmcThreads::SystemClockMillis(); @@ -2860,10 +2529,10 @@ { g_windowManager.DestroyWindows(); - CAddonMgr::GetInstance().DeInit(); + CAddonMgr::Get().DeInit(); CLog::Log(LOGNOTICE, "closing down remote control service"); - CInputManager::GetInstance().DisableRemoteControl(); + CInputManager::Get().DisableRemoteControl(); CLog::Log(LOGNOTICE, "unload sections"); @@ -2889,7 +2558,7 @@ #endif DllLoaderContainer::Clear(); g_playlistPlayer.Clear(); - CSettings::GetInstance().Uninitialize(); + CSettings::Get().Uninitialize(); g_advancedSettings.Clear(); #ifdef TARGET_POSIX @@ -2926,7 +2595,7 @@ { CVariant vExitCode(CVariant::VariantTypeObject); vExitCode["exitcode"] = exitCode; - CAnnouncementManager::GetInstance().Announce(System, "xbmc", "OnQuit", vExitCode); + CAnnouncementManager::Get().Announce(System, "xbmc", "OnQuit", vExitCode); // Abort any active screensaver WakeUpScreenSaverAndDPMS(); @@ -2942,10 +2611,10 @@ g_sysinfo.SetTotalUptime(g_sysinfo.GetTotalUptime() + (int)(CTimeUtils::GetFrameTime() / 60000)); // Update the settings information (volume, uptime etc. need saving) - if (CFile::Exists(CProfilesManager::GetInstance().GetSettingsFile())) + if (CFile::Exists(CProfilesManager::Get().GetSettingsFile())) { CLog::Log(LOGNOTICE, "Saving settings"); - CSettings::GetInstance().Save(); + CSettings::Get().Save(); } else CLog::Log(LOGNOTICE, "Not saving settings (settings.xml is not present)"); @@ -2960,18 +2629,17 @@ // stop scanning before we kill the network and so on if (m_musicInfoScanner->IsScanning()) - m_musicInfoScanner->Stop(true); + m_musicInfoScanner->Stop(); - if (CVideoLibraryQueue::GetInstance().IsRunning()) - CVideoLibraryQueue::GetInstance().CancelAllJobs(); + if (CVideoLibraryQueue::Get().IsRunning()) + CVideoLibraryQueue::Get().CancelAllJobs(); - CApplicationMessenger::GetInstance().SendMsg(TMSG_SETAUDIODSPSTATE, ACTIVE_AE_DSP_STATE_OFF); // send a blocking message to deactivate AudioDSP engine - CApplicationMessenger::GetInstance().Cleanup(); + CApplicationMessenger::Get().Cleanup(); CLog::Log(LOGNOTICE, "stop player"); m_pPlayer->ClosePlayer(); - CAnnouncementManager::GetInstance().Deinitialize(); + CAnnouncementManager::Get().Deinitialize(); StopPVRManager(); StopServices(); @@ -3014,16 +2682,15 @@ g_mediaManager.Stop(); // Stop services before unloading Python - CAddonMgr::GetInstance().StopServices(false); + CAddonMgr::Get().StopServices(false); // unregister action listeners - UnregisterActionListener(&CSeekHandler::GetInstance()); - UnregisterActionListener(&CPlayerController::GetInstance()); + UnregisterActionListener(&CSeekHandler::Get()); // stop all remaining scripts; must be done after skin has been unloaded, // not before some windows still need it when deinitializing during skin // unloading - CScriptInvocationManager::GetInstance().Uninitialize(); + CScriptInvocationManager::Get().Uninitialize(); g_Windowing.DestroyRenderSystem(); g_Windowing.DestroyWindow(); @@ -3081,7 +2748,7 @@ CGUIDialogCache* dlgCache = new CGUIDialogCache(5000, g_localizeStrings.Get(10214), item.GetLabel()); //is or could be a playlist - std::unique_ptr pPlayList (CPlayListFactory::Create(item)); + unique_ptr pPlayList (CPlayListFactory::Create(item)); bool gotPlayList = (pPlayList.get() && pPlayList->Load(item.GetPath())); if (dlgCache) @@ -3193,7 +2860,7 @@ // Also, this is really just a hack for the slow load up times we have // A much better solution is a fast reader of FPS and fileLength // that we can use on a file to get it's time. - std::vector times; + vector times; bool haveTimes(false); CVideoDatabase dbs; if (dbs.Open()) @@ -3287,8 +2954,7 @@ SaveFileState(true); // Switch to default options - CMediaSettings::GetInstance().GetCurrentVideoSettings() = CMediaSettings::GetInstance().GetDefaultVideoSettings(); - CMediaSettings::GetInstance().GetCurrentAudioSettings() = CMediaSettings::GetInstance().GetDefaultAudioSettings(); + CMediaSettings::Get().GetCurrentVideoSettings() = CMediaSettings::Get().GetDefaultVideoSettings(); // see if we have saved options in the database m_pPlayer->SetPlaySpeed(1, g_application.m_muted); @@ -3316,7 +2982,7 @@ } else #endif - CGUIDialogOK::ShowAndGetInput(CVariant{435}, CVariant{436}); + CGUIDialogOK::ShowAndGetInput(435, 436); return PLAYBACK_OK; } @@ -3377,7 +3043,7 @@ if( m_eForcedNextPlayer != EPC_NONE ) eNewCore = m_eForcedNextPlayer; else if( m_pPlayer->GetCurrentPlayer() == EPC_NONE ) - eNewCore = CPlayerCoreFactory::GetInstance().GetDefaultPlayer(item); + eNewCore = CPlayerCoreFactory::Get().GetDefaultPlayer(item); else eNewCore = m_pPlayer->GetCurrentPlayer(); } @@ -3447,7 +3113,7 @@ if (m_eForcedNextPlayer != EPC_NONE) eNewCore = m_eForcedNextPlayer; else - eNewCore = CPlayerCoreFactory::GetInstance().GetDefaultPlayer(item); + eNewCore = CPlayerCoreFactory::Get().GetDefaultPlayer(item); } // this really aught to be inside !bRestart, but since PlayStack @@ -3456,23 +3122,30 @@ if (item.IsVideo() && playlist == PLAYLIST_VIDEO && g_playlistPlayer.GetPlaylist(playlist).size() > 1) { // playing from a playlist by the looks // don't switch to fullscreen if we are not playing the first item... - options.fullscreen = !g_playlistPlayer.HasPlayedFirstFile() && g_advancedSettings.m_fullScreenOnMovieStart && !CMediaSettings::GetInstance().DoesVideoStartWindowed(); + options.fullscreen = !g_playlistPlayer.HasPlayedFirstFile() && g_advancedSettings.m_fullScreenOnMovieStart && !CMediaSettings::Get().DoesVideoStartWindowed(); } else if(m_itemCurrentFile->IsStack() && m_currentStack->Size() > 0) { // TODO - this will fail if user seeks back to first file in stack if(m_currentStackPosition == 0 || m_itemCurrentFile->m_lStartOffset == STARTOFFSET_RESUME) - options.fullscreen = g_advancedSettings.m_fullScreenOnMovieStart && !CMediaSettings::GetInstance().DoesVideoStartWindowed(); + options.fullscreen = g_advancedSettings.m_fullScreenOnMovieStart && !CMediaSettings::Get().DoesVideoStartWindowed(); else options.fullscreen = false; // reset this so we don't think we are resuming on seek m_itemCurrentFile->m_lStartOffset = 0; } else - options.fullscreen = g_advancedSettings.m_fullScreenOnMovieStart && !CMediaSettings::GetInstance().DoesVideoStartWindowed(); + options.fullscreen = g_advancedSettings.m_fullScreenOnMovieStart && !CMediaSettings::Get().DoesVideoStartWindowed(); // reset VideoStartWindowed as it's a temp setting - CMediaSettings::GetInstance().SetVideoStartWindowed(false); + CMediaSettings::Get().SetVideoStartWindowed(false); + +#ifdef HAS_KARAOKE + //We have to stop parsing a cdg before mplayer is deallocated + // WHY do we have to do this???? + if (m_pKaraokeMgr) + m_pKaraokeMgr->Stop(); +#endif { CSingleLock lock(m_playStateMutex); @@ -3645,7 +3318,7 @@ CVariant data(CVariant::VariantTypeObject); data["end"] = true; - CAnnouncementManager::GetInstance().Announce(Player, "xbmc", "OnStop", m_itemCurrentFile, data); + CAnnouncementManager::Get().Announce(Player, "xbmc", "OnStop", m_itemCurrentFile, data); CGUIMessage msg(GUI_MSG_PLAYBACK_ENDED, 0, 0); g_windowManager.SendThreadMessage(msg); @@ -3707,7 +3380,7 @@ CVariant data(CVariant::VariantTypeObject); data["end"] = false; - CAnnouncementManager::GetInstance().Announce(Player, "xbmc", "OnStop", m_itemCurrentFile, data); + CAnnouncementManager::Get().Announce(Player, "xbmc", "OnStop", m_itemCurrentFile, data); CGUIMessage msg( GUI_MSG_PLAYBACK_STOPPED, 0, 0 ); g_windowManager.SendThreadMessage(msg); @@ -3725,7 +3398,7 @@ CVariant param; param["player"]["speed"] = 0; param["player"]["playerid"] = g_playlistPlayer.GetCurrentPlaylist(); - CAnnouncementManager::GetInstance().Announce(Player, "xbmc", "OnPause", m_itemCurrentFile, param); + CAnnouncementManager::Get().Announce(Player, "xbmc", "OnPause", m_itemCurrentFile, param); } void CApplication::OnPlayBackResumed() @@ -3740,7 +3413,7 @@ CVariant param; param["player"]["speed"] = 1; param["player"]["playerid"] = g_playlistPlayer.GetCurrentPlaylist(); - CAnnouncementManager::GetInstance().Announce(Player, "xbmc", "OnPlay", m_itemCurrentFile, param); + CAnnouncementManager::Get().Announce(Player, "xbmc", "OnPlay", m_itemCurrentFile, param); } void CApplication::OnPlayBackSpeedChanged(int iSpeed) @@ -3752,7 +3425,7 @@ CVariant param; param["player"]["speed"] = iSpeed; param["player"]["playerid"] = g_playlistPlayer.GetCurrentPlaylist(); - CAnnouncementManager::GetInstance().Announce(Player, "xbmc", "OnSpeedChanged", m_itemCurrentFile, param); + CAnnouncementManager::Get().Announce(Player, "xbmc", "OnSpeedChanged", m_itemCurrentFile, param); } void CApplication::OnPlayBackSeek(int iTime, int seekOffset) @@ -3763,10 +3436,10 @@ CVariant param; CJSONUtils::MillisecondsToTimeObject(iTime, param["player"]["time"]); - CJSONUtils::MillisecondsToTimeObject(seekOffset, param["player"]["seekoffset"]); + CJSONUtils::MillisecondsToTimeObject(seekOffset, param["player"]["seekoffset"]);; param["player"]["playerid"] = g_playlistPlayer.GetCurrentPlaylist(); param["player"]["speed"] = m_pPlayer->GetPlaySpeed(); - CAnnouncementManager::GetInstance().Announce(Player, "xbmc", "OnSeek", m_itemCurrentFile, param); + CAnnouncementManager::Get().Announce(Player, "xbmc", "OnSeek", m_itemCurrentFile, param); g_infoManager.SetDisplayAfterSeek(2500, seekOffset); } @@ -3791,15 +3464,14 @@ void CApplication::SaveFileState(bool bForeground /* = false */) { - if (!CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases()) + if (!CProfilesManager::Get().GetCurrentProfile().canWriteDatabases()) return; CJob* job = new CSaveFileStateJob(*m_progressTrackingItem, *m_stackFileItemToUpdate, m_progressTrackingVideoResumeBookmark, m_progressTrackingPlayCountUpdate, - CMediaSettings::GetInstance().GetCurrentVideoSettings(), - CMediaSettings::GetInstance().GetCurrentAudioSettings()); + CMediaSettings::Get().GetCurrentVideoSettings()); if (bForeground) { @@ -3864,7 +3536,7 @@ } // Update bookmark for save - m_progressTrackingVideoResumeBookmark.player = CPlayerCoreFactory::GetInstance().GetPlayerName(m_pPlayer->GetCurrentPlayer()); + m_progressTrackingVideoResumeBookmark.player = CPlayerCoreFactory::Get().GetPlayerName(m_pPlayer->GetCurrentPlayer()); m_progressTrackingVideoResumeBookmark.playerState = m_pPlayer->GetPlayerState(); m_progressTrackingVideoResumeBookmark.thumbNailImage.clear(); @@ -3896,12 +3568,12 @@ CVideoDatabase dbs; if (dbs.Open()) { - CLog::Log(LOGDEBUG, "Loading settings for %s", CURL::GetRedacted(item.GetPath()).c_str()); - + CLog::Log(LOGDEBUG, "Loading settings for %s", item.GetPath().c_str()); + // Load stored settings if they exist, otherwise use default - if (!dbs.GetVideoSettings(item, CMediaSettings::GetInstance().GetCurrentVideoSettings())) - CMediaSettings::GetInstance().GetCurrentVideoSettings() = CMediaSettings::GetInstance().GetDefaultVideoSettings(); - + if (!dbs.GetVideoSettings(item, CMediaSettings::Get().GetCurrentVideoSettings())) + CMediaSettings::Get().GetCurrentVideoSettings() = CMediaSettings::Get().GetDefaultVideoSettings(); + dbs.Close(); } } @@ -3911,6 +3583,11 @@ int iWin = g_windowManager.GetActiveWindow(); if ( m_pPlayer->IsPlaying() ) { +#ifdef HAS_KARAOKE + if( m_pKaraokeMgr ) + m_pKaraokeMgr->Stop(); +#endif + m_pPlayer->CloseFile(); // turn off visualisation window when stopping @@ -3959,7 +3636,7 @@ m_dpmsIsActive = false; m_dpmsIsManual = false; SetRenderGUI(true); - CAnnouncementManager::GetInstance().Announce(GUI, "xbmc", "OnDPMSDeactivated"); + CAnnouncementManager::Get().Announce(GUI, "xbmc", "OnDPMSDeactivated"); return m_dpms->DisablePowerSaving(); } else @@ -3969,7 +3646,7 @@ m_dpmsIsActive = true; m_dpmsIsManual = manual; SetRenderGUI(false); - CAnnouncementManager::GetInstance().Announce(GUI, "xbmc", "OnDPMSActivated"); + CAnnouncementManager::Get().Announce(GUI, "xbmc", "OnDPMSActivated"); return true; } } @@ -4000,7 +3677,7 @@ // allow listeners to ignore the deactivation if it preceeds a powerdown/suspend etc CVariant data(CVariant::VariantTypeObject); data["shuttingdown"] = bPowerOffKeyPressed; - CAnnouncementManager::GetInstance().Announce(GUI, "xbmc", "OnScreensaverDeactivated", data); + CAnnouncementManager::Get().Announce(GUI, "xbmc", "OnScreensaverDeactivated", data); #ifdef TARGET_ANDROID // Screensaver deactivated -> acquire wake lock CXBMCApp::EnableWakeLock(true); @@ -4019,9 +3696,9 @@ if (m_bScreenSave && m_screenSaver) { if (m_iScreenSaveLock == 0) - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && - (CProfilesManager::GetInstance().UsingLoginScreen() || CSettings::GetInstance().GetBool(CSettings::SETTING_MASTERLOCK_STARTUPLOCK)) && - CProfilesManager::GetInstance().GetCurrentProfile().getLockMode() != LOCK_MODE_EVERYONE && + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && + (CProfilesManager::Get().UsingLoginScreen() || CSettings::Get().GetBool("masterlock.startuplock")) && + CProfilesManager::Get().GetCurrentProfile().getLockMode() != LOCK_MODE_EVERYONE && m_screenSaver->ID() != "screensaver.xbmc.builtin.dim" && m_screenSaver->ID() != "screensaver.xbmc.builtin.black" && !m_screenSaver->ID().empty() && m_screenSaver->ID() != "visualization") { m_iScreenSaveLock = 2; @@ -4054,7 +3731,7 @@ if (g_windowManager.GetActiveWindow() == WINDOW_SCREENSAVER) g_windowManager.PreviousWindow(); // show the previous window if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(ACTION_STOP))); + CApplicationMessenger::Get().SendAction(CAction(ACTION_STOP), WINDOW_SLIDESHOW); } return true; } @@ -4069,10 +3746,10 @@ bool maybeScreensaver = !m_dpmsIsActive && !m_bScreenSave - && !CSettings::GetInstance().GetString(CSettings::SETTING_SCREENSAVER_MODE).empty(); + && !CSettings::Get().GetString("screensaver.mode").empty(); bool maybeDPMS = !m_dpmsIsActive && m_dpms->IsSupported() - && CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_DISPLAYSOFF) > 0; + && CSettings::Get().GetInt("powermanagement.displaysoff") > 0; // Has the screen saver window become active? if (maybeScreensaver && g_windowManager.IsWindowActive(WINDOW_SCREENSAVER)) @@ -4094,7 +3771,7 @@ if ((m_pPlayer->IsPlayingVideo() && !m_pPlayer->IsPaused()) // * Are we playing some music in fullscreen vis? || (m_pPlayer->IsPlayingAudio() && g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION - && !CSettings::GetInstance().GetString(CSettings::SETTING_MUSICPLAYER_VISUALISATION).empty())) + && !CSettings::Get().GetString("musicplayer.visualisation").empty())) { ResetScreenSaverTimer(); return; @@ -4104,13 +3781,13 @@ // DPMS has priority (it makes the screensaver not needed) if (maybeDPMS - && elapsed > CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_DISPLAYSOFF) * 60) + && elapsed > CSettings::Get().GetInt("powermanagement.displaysoff") * 60) { ToggleDPMS(false); WakeUpScreenSaver(); } else if (maybeScreensaver - && elapsed > CSettings::GetInstance().GetInt(CSettings::SETTING_SCREENSAVER_TIME) * 60) + && elapsed > CSettings::Get().GetInt("screensaver.time") * 60) { ActivateScreenSaver(); } @@ -4121,7 +3798,7 @@ // the type of screensaver displayed void CApplication::ActivateScreenSaver(bool forceType /*= false */) { - if (m_pPlayer->IsPlayingAudio() && CSettings::GetInstance().GetBool(CSettings::SETTING_SCREENSAVER_USEMUSICVISINSTEAD) && !CSettings::GetInstance().GetString(CSettings::SETTING_MUSICPLAYER_VISUALISATION).empty()) + if (m_pPlayer->IsPlayingAudio() && CSettings::Get().GetBool("screensaver.usemusicvisinstead") && !CSettings::Get().GetString("musicplayer.visualisation").empty()) { // just activate the visualisation if user toggled the usemusicvisinstead option g_windowManager.ActivateWindow(WINDOW_VISUALISATION); return; @@ -4131,19 +3808,19 @@ // Get Screensaver Mode m_screenSaver.reset(); - if (!CAddonMgr::GetInstance().GetAddon(CSettings::GetInstance().GetString(CSettings::SETTING_SCREENSAVER_MODE), m_screenSaver)) + if (!CAddonMgr::Get().GetAddon(CSettings::Get().GetString("screensaver.mode"), m_screenSaver)) m_screenSaver.reset(new CScreenSaver("")); - CAnnouncementManager::GetInstance().Announce(GUI, "xbmc", "OnScreensaverActivated"); + CAnnouncementManager::Get().Announce(GUI, "xbmc", "OnScreensaverActivated"); // disable screensaver lock from the login screen m_iScreenSaveLock = g_windowManager.GetActiveWindow() == WINDOW_LOGIN_SCREEN ? 1 : 0; if (!forceType) { // set to Dim in the case of a dialog on screen or playing video - if (g_windowManager.HasModalDialog() || (m_pPlayer->IsPlayingVideo() && CSettings::GetInstance().GetBool(CSettings::SETTING_SCREENSAVER_USEDIMONPAUSE)) || g_PVRManager.IsRunningChannelScan()) + if (g_windowManager.HasModalDialog() || (m_pPlayer->IsPlayingVideo() && CSettings::Get().GetBool("screensaver.usedimonpause")) || g_PVRManager.IsRunningChannelScan()) { - if (!CAddonMgr::GetInstance().GetAddon("screensaver.xbmc.builtin.dim", m_screenSaver)) + if (!CAddonMgr::Get().GetAddon("screensaver.xbmc.builtin.dim", m_screenSaver)) m_screenSaver.reset(new CScreenSaver("")); } } @@ -4168,7 +3845,7 @@ if (m_bInhibitIdleShutdown || m_pPlayer->IsPlaying() || m_pPlayer->IsPausedPlayback() // is something playing? || m_musicInfoScanner->IsScanning() - || CVideoLibraryQueue::GetInstance().IsRunning() + || CVideoLibraryQueue::Get().IsRunning() || g_windowManager.IsWindowActive(WINDOW_DIALOG_PROGRESS) // progress dialog is onscreen || !g_PVRManager.CanSystemPowerdown(false)) { @@ -4177,13 +3854,13 @@ } float elapsed = m_shutdownTimer.IsRunning() ? m_shutdownTimer.GetElapsedSeconds() : 0.f; - if ( elapsed > CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNTIME) * 60 ) + if ( elapsed > CSettings::Get().GetInt("powermanagement.shutdowntime") * 60 ) { // Since it is a sleep instead of a shutdown, let's set everything to reset when we wake up. m_shutdownTimer.Stop(); // Sleep the box - CApplicationMessenger::GetInstance().PostMsg(TMSG_SHUTDOWN); + CApplicationMessenger::Get().Shutdown(); } } @@ -4222,7 +3899,7 @@ g_windowManager.Delete(WINDOW_SPLASH); if (m_fallbackLanguageLoaded) - CGUIDialogOK::ShowAndGetInput(CVariant{24133}, CVariant{24134}); + CGUIDialogOK::ShowAndGetInput(24133, 24134); // show info dialog about moved configuration files if needed ShowAppMigrationMessage(); @@ -4232,7 +3909,7 @@ case GUI_MSG_PLAYBACK_STARTED: { -#ifdef TARGET_DARWIN_IOS +#ifdef TARGET_DARWIN CDarwinUtils::SetScheduling(message.GetMessage()); #endif CPlayList playList = g_playlistPlayer.GetPlaylist(g_playlistPlayer.GetCurrentPlaylist()); @@ -4261,7 +3938,31 @@ CVariant param; param["player"]["speed"] = 1; param["player"]["playerid"] = g_playlistPlayer.GetCurrentPlaylist(); - CAnnouncementManager::GetInstance().Announce(Player, "xbmc", "OnPlay", m_itemCurrentFile, param); + CAnnouncementManager::Get().Announce(Player, "xbmc", "OnPlay", m_itemCurrentFile, param); + + if (m_pPlayer->IsPlayingAudio()) + { + // Start our cdg parser as appropriate +#ifdef HAS_KARAOKE + if (m_pKaraokeMgr && CSettings::Get().GetBool("karaoke.enabled") && !m_itemCurrentFile->IsInternetStream()) + { + m_pKaraokeMgr->Stop(); + if (m_itemCurrentFile->IsMusicDb()) + { + if (!m_itemCurrentFile->HasMusicInfoTag() || !m_itemCurrentFile->GetMusicInfoTag()->Loaded()) + { + IMusicInfoTagLoader* tagloader = CMusicInfoTagLoaderFactory::CreateLoader(*m_itemCurrentFile); + tagloader->Load(m_itemCurrentFile->GetPath(),*m_itemCurrentFile->GetMusicInfoTag()); + delete tagloader; + } + m_pKaraokeMgr->Start(m_itemCurrentFile->GetMusicInfoTag()->GetURL()); + } + else + m_pKaraokeMgr->Start(m_itemCurrentFile->GetPath()); + } +#endif + } + return true; } break; @@ -4322,7 +4023,11 @@ case GUI_MSG_PLAYBACK_ENDED: case GUI_MSG_PLAYLISTPLAYER_STOPPED: { -#ifdef TARGET_DARWIN_IOS +#ifdef HAS_KARAOKE + if (m_pKaraokeMgr ) + m_pKaraokeMgr->Stop(); +#endif +#ifdef TARGET_DARWIN CDarwinUtils::SetScheduling(message.GetMessage()); #endif // first check if we still have items in the stack to play @@ -4384,7 +4089,7 @@ if (!m_pPlayer->IsPlayingAudio() && g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_NONE && g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION) { - CSettings::GetInstance().Save(); // save vis settings + CSettings::Get().Save(); // save vis settings WakeUpScreenSaverAndDPMS(); g_windowManager.PreviousWindow(); } @@ -4393,13 +4098,13 @@ if (!m_pPlayer->IsPlayingAudio() && (m_itemCurrentFile->IsCDDA() || m_itemCurrentFile->IsOnDVD()) && !g_mediaManager.IsDiscInDrive() && g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION) { // yes, disable vis - CSettings::GetInstance().Save(); // save vis settings + CSettings::Get().Save(); // save vis settings WakeUpScreenSaverAndDPMS(); g_windowManager.PreviousWindow(); } if (IsEnableTestMode()) - CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT); + CApplicationMessenger::Get().Quit(); return true; } break; @@ -4418,30 +4123,27 @@ break; case GUI_MSG_EXECUTE: if (message.GetNumStringParams()) - return ExecuteXBMCAction(message.GetStringParam(), message.GetItem()); + return ExecuteXBMCAction(message.GetStringParam()); break; } return false; } -bool CApplication::ExecuteXBMCAction(std::string actionStr, const CGUIListItemPtr &item /* = NULL */) +bool CApplication::ExecuteXBMCAction(std::string actionStr) { // see if it is a user set string //We don't know if there is unsecure information in this yet, so we //postpone any logging const std::string in_actionStr(actionStr); - if (item) - actionStr = CGUIInfoLabel::GetItemLabel(actionStr, item.get()); - else - actionStr = CGUIInfoLabel::GetLabel(actionStr); + actionStr = CGUIInfoLabel::GetLabel(actionStr); // user has asked for something to be executed - if (CBuiltins::GetInstance().HasCommand(actionStr)) + if (CBuiltins::HasCommand(actionStr)) { - if (!CBuiltins::GetInstance().IsSystemPowerdownCommand(actionStr) || + if (!CBuiltins::IsSystemPowerdownCommand(actionStr) || g_PVRManager.CanSystemPowerdown()) - CBuiltins::GetInstance().Execute(actionStr); + CBuiltins::Execute(actionStr); } else { @@ -4456,7 +4158,7 @@ #ifdef HAS_PYTHON if (item.IsPythonScript()) { // a python script - CScriptInvocationManager::GetInstance().ExecuteAsync(item.GetPath()); + CScriptInvocationManager::Get().ExecuteAsync(item.GetPath()); } else #endif @@ -4487,7 +4189,7 @@ if (CFile::Exists("special://home/.kodi_data_was_migrated") && !CFile::Exists("special://home/.kodi_migration_info_shown")) { - CGUIDialogOK::ShowAndGetInput(CVariant{24128}, CVariant{24129}); + CGUIDialogOK::ShowAndGetInput(24128, 24129); CFile tmpFile; // create the file which will prevent this dialog from appearing in the future tmpFile.OpenForWrite("special://home/.kodi_migration_info_shown"); @@ -4504,26 +4206,26 @@ // process messages which have to be send to the gui // (this can only be done after g_windowManager.Render()) - CApplicationMessenger::GetInstance().ProcessWindowMessages(); + CApplicationMessenger::Get().ProcessWindowMessages(); - if (m_autoExecScriptExecuted) + if (m_loggingIn) { - m_autoExecScriptExecuted = false; + m_loggingIn = false; // autoexec.py - profile std::string strAutoExecPy = CSpecialProtocol::TranslatePath("special://profile/autoexec.py"); if (XFILE::CFile::Exists(strAutoExecPy)) - CScriptInvocationManager::GetInstance().ExecuteAsync(strAutoExecPy); + CScriptInvocationManager::Get().ExecuteAsync(strAutoExecPy); else CLog::Log(LOGDEBUG, "no profile autoexec.py (%s) found, skipping", strAutoExecPy.c_str()); } // handle any active scripts - CScriptInvocationManager::GetInstance().Process(); + CScriptInvocationManager::Get().Process(); // process messages, even if a movie is playing - CApplicationMessenger::GetInstance().ProcessMessages(); + CApplicationMessenger::Get().ProcessMessages(); if (g_application.m_bStop) return; //we're done, everything has been unloaded // check how far we are through playing the current item @@ -4577,9 +4279,9 @@ // Check if we need to shutdown (if enabled). #if defined(TARGET_DARWIN) - if (CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNTIME) && g_advancedSettings.m_fullScreen) + if (CSettings::Get().GetInt("powermanagement.shutdowntime") && g_advancedSettings.m_fullScreen) #else - if (CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNTIME)) + if (CSettings::Get().GetInt("powermanagement.shutdowntime")) #endif { CheckShutdown(); @@ -4595,6 +4297,11 @@ // check for any idle curl connections g_curlInterface.CheckIdle(); +#ifdef HAS_KARAOKE + if ( m_pKaraokeMgr ) + m_pKaraokeMgr->ProcessSlow(); +#endif + if (!m_pPlayer->IsPlayingVideo()) g_largeTextureManager.CleanupUnusedImages(); @@ -4626,6 +4333,10 @@ g_mediaManager.ProcessEvents(); + if (!m_pPlayer->IsPlayingVideo() && + CSettings::Get().GetInt("general.addonupdates") != AUTO_UPDATES_NEVER) + CAddonInstaller::Get().UpdateRepos(); + CAEFactory::GarbageCollect(); // if we don't render the gui there's no reason to start the screensaver. @@ -4726,7 +4437,7 @@ CGUIDialog *volumeBar = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_VOLUME_BAR); if (volumeBar) { - volumeBar->Open(); + volumeBar->Show(); if (action) volumeBar->OnAction(*action); } @@ -4811,7 +4522,7 @@ CVariant data(CVariant::VariantTypeObject); data["volume"] = GetVolume(); data["muted"] = m_muted; - CAnnouncementManager::GetInstance().Announce(Application, "xbmc", "OnVolumeChanged", data); + CAnnouncementManager::Get().Announce(Application, "xbmc", "OnVolumeChanged", data); // if player has volume control, set it. if (m_pPlayer->ControlsVolume()) @@ -4824,13 +4535,13 @@ int CApplication::GetSubtitleDelay() const { // converts subtitle delay to a percentage - return int(((float)(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay + g_advancedSettings.m_videoSubsDelayRange)) / (2 * g_advancedSettings.m_videoSubsDelayRange)*100.0f + 0.5f); + return int(((float)(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay + g_advancedSettings.m_videoSubsDelayRange)) / (2 * g_advancedSettings.m_videoSubsDelayRange)*100.0f + 0.5f); } int CApplication::GetAudioDelay() const { // converts audio delay to a percentage - return int(((float)(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay + g_advancedSettings.m_videoAudioDelayRange)) / (2 * g_advancedSettings.m_videoAudioDelayRange)*100.0f + 0.5f); + return int(((float)(CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay + g_advancedSettings.m_videoAudioDelayRange)) / (2 * g_advancedSettings.m_videoAudioDelayRange)*100.0f + 0.5f); } // Returns the total time in seconds of the current media. Fractional @@ -4914,11 +4625,11 @@ else { // seeking to a new file m_currentStackPosition = i; - CFileItem *item = new CFileItem(*(*m_currentStack)[i]); - item->m_lStartOffset = static_cast((dTime - startOfNewFile) * 75.0); + CFileItem item(*(*m_currentStack)[i]); + item.m_lStartOffset = (long)((dTime - startOfNewFile) * 75.0); // don't just call "PlayFile" here, as we are quite likely called from the // player thread, so we won't be able to delete ourselves. - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 1, 0, static_cast(item)); + CApplicationMessenger::Get().PlayFile(item, true); } return; } @@ -4962,10 +4673,10 @@ float stackedTotalTime = (float) GetTotalTime(); // We need to take into account the stack's total time vs. currently playing file's total time if (stackedTotalTime > 0.0f) - return std::min( 100.0f, GetPercentage() + (m_pPlayer->GetCachePercentage() * m_pPlayer->GetTotalTime() * 0.001f / stackedTotalTime ) ); + return min( 100.0f, GetPercentage() + (m_pPlayer->GetCachePercentage() * m_pPlayer->GetTotalTime() * 0.001f / stackedTotalTime ) ); } else - return std::min( 100.0f, m_pPlayer->GetPercentage() + m_pPlayer->GetCachePercentage() ); + return min( 100.0f, m_pPlayer->GetPercentage() + m_pPlayer->GetCachePercentage() ); } return 0.0f; } @@ -5030,22 +4741,22 @@ void CApplication::UpdateLibraries() { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_UPDATEONSTARTUP)) + if (CSettings::Get().GetBool("videolibrary.updateonstartup")) { CLog::LogF(LOGNOTICE, "Starting video library startup scan"); - StartVideoScan("", !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_BACKGROUNDUPDATE)); + StartVideoScan("", !CSettings::Get().GetBool("videolibrary.backgroundupdate")); } - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_UPDATEONSTARTUP)) + if (CSettings::Get().GetBool("musiclibrary.updateonstartup")) { CLog::LogF(LOGNOTICE, "Starting music library startup scan"); - StartMusicScan("", !CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_BACKGROUNDUPDATE)); + StartMusicScan("", !CSettings::Get().GetBool("musiclibrary.backgroundupdate")); } } bool CApplication::IsVideoScanning() const { - return CVideoLibraryQueue::GetInstance().IsScanningLibrary(); + return CVideoLibraryQueue::Get().IsScanningLibrary(); } bool CApplication::IsMusicScanning() const @@ -5055,7 +4766,7 @@ void CApplication::StopVideoScan() { - CVideoLibraryQueue::GetInstance().StopLibraryScanning(); + CVideoLibraryQueue::Get().StopLibraryScanning(); } void CApplication::StopMusicScan() @@ -5066,19 +4777,19 @@ void CApplication::StartVideoCleanup(bool userInitiated /* = true */) { - if (userInitiated && CVideoLibraryQueue::GetInstance().IsRunning()) + if (userInitiated && CVideoLibraryQueue::Get().IsRunning()) return; std::set paths; if (userInitiated) - CVideoLibraryQueue::GetInstance().CleanLibraryModal(paths); + CVideoLibraryQueue::Get().CleanLibraryModal(paths); else - CVideoLibraryQueue::GetInstance().CleanLibrary(paths, true); + CVideoLibraryQueue::Get().CleanLibrary(paths, true); } void CApplication::StartVideoScan(const std::string &strDirectory, bool userInitiated /* = true */, bool scanAll /* = false */) { - CVideoLibraryQueue::GetInstance().ScanLibrary(strDirectory, scanAll, userInitiated); + CVideoLibraryQueue::Get().ScanLibrary(strDirectory, scanAll, userInitiated); } void CApplication::StartMusicCleanup(bool userInitiated /* = true */) @@ -5102,9 +4813,9 @@ if (!flags) { // setup default flags - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_DOWNLOADINFO)) + if (CSettings::Get().GetBool("musiclibrary.downloadinfo")) flags |= CMusicInfoScanner::SCAN_ONLINE; - if (!userInitiated || CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_BACKGROUNDUPDATE)) + if (!userInitiated || CSettings::Get().GetBool("musiclibrary.backgroundupdate")) flags |= CMusicInfoScanner::SCAN_BACKGROUND; } @@ -5221,10 +4932,10 @@ bool CApplication::SetLanguage(const std::string &strLanguage) { // nothing to be done if the language hasn't changed - if (strLanguage == CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_LANGUAGE)) + if (strLanguage == CSettings::Get().GetString("locale.language")) return true; - return CSettings::GetInstance().SetString(CSettings::SETTING_LOCALE_LANGUAGE, strLanguage); + return CSettings::Get().SetString("locale.language", strLanguage); } bool CApplication::LoadLanguage(bool reload) @@ -5234,24 +4945,12 @@ return false; // set the proper audio and subtitle languages - g_langInfo.SetAudioLanguage(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_AUDIOLANGUAGE)); - g_langInfo.SetSubtitleLanguage(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_SUBTITLELANGUAGE)); + g_langInfo.SetAudioLanguage(CSettings::Get().GetString("locale.audiolanguage")); + g_langInfo.SetSubtitleLanguage(CSettings::Get().GetString("locale.subtitlelanguage")); return true; } -void CApplication::SetLoggingIn(bool switchingProfiles) -{ - // don't save skin settings on unloading when logging into another profile - // because in that case we have already loaded the new profile and - // would therefore write the previous skin's settings into the new profile - // instead of into the previous one - m_saveSkinOnUnloading = !switchingProfiles; - - // make sure that the autoexec.py script is executed after logging in - m_autoExecScriptExecuted = true; -} - void CApplication::CloseNetworkShares() { CLog::Log(LOGDEBUG,"CApplication::CloseNetworkShares: Closing all network shares"); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/Application.h kodi-15.2~git20151019.1039-final/xbmc/Application.h --- kodi-16.1~git20160425.1001-final/xbmc/Application.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/Application.h 2015-10-19 08:39:15.000000000 +0000 @@ -24,20 +24,15 @@ #include "XBApplicationEx.h" #include "guilib/IMsgTargetCallback.h" -#include "guilib/Resolution.h" #include "utils/GlobalsHandling.h" -#include "messaging/IMessageTarget.h" #include -#include #include class CAction; class CFileItem; class CFileItemList; class CKey; - - namespace ADDON { class CSkinInfo; @@ -49,6 +44,7 @@ { class CAutorun; } +class CPlayerController; #include "cores/IPlayerCallback.h" #include "cores/playercorefactory/PlayerCoreFactory.h" @@ -73,6 +69,7 @@ #include "interfaces/IActionListener.h" class CSeekHandler; +class CKaraokeLyricsManager; class CInertialScrollingHandler; class DPMSSupport; class CSplash; @@ -116,8 +113,7 @@ }; class CApplication : public CXBApplicationEx, public IPlayerCallback, public IMsgTargetCallback, - public ISettingCallback, public ISettingsHandler, public ISubSettings, - public KODI::MESSAGING::IMessageTarget + public ISettingCallback, public ISettingsHandler, public ISubSettings { friend class CApplicationPlayer; public: @@ -135,16 +131,16 @@ CApplication(void); virtual ~CApplication(void); - virtual bool Initialize() override; - virtual void FrameMove(bool processEvents, bool processGUI = true) override; - virtual void Render() override; + virtual bool Initialize(); + virtual void FrameMove(bool processEvents, bool processGUI = true); + virtual void Render(); virtual bool RenderNoPresent(); virtual void Preflight(); - virtual bool Create() override; - virtual bool Cleanup() override; + virtual bool Create(); + virtual bool Cleanup(); bool CreateGUI(); - bool InitWindow(RESOLUTION res = RES_INVALID); + bool InitWindow(); bool DestroyWindow(); void StartServices(); void StopServices(); @@ -162,21 +158,17 @@ const std::string& CurrentFile(); CFileItem& CurrentFileItem(); CFileItem& CurrentUnstackedItem(); - virtual bool OnMessage(CGUIMessage& message) override; + virtual bool OnMessage(CGUIMessage& message); PLAYERCOREID GetCurrentPlayer(); - virtual void OnPlayBackEnded() override; - virtual void OnPlayBackStarted() override; - virtual void OnPlayBackPaused() override; - virtual void OnPlayBackResumed() override; - virtual void OnPlayBackStopped() override; - virtual void OnQueueNextItem() override; - virtual void OnPlayBackSeek(int iTime, int seekOffset) override; - virtual void OnPlayBackSeekChapter(int iChapter) override; - virtual void OnPlayBackSpeedChanged(int iSpeed) override; - - virtual int GetMessageMask() override; - virtual void OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg) override; - + virtual void OnPlayBackEnded(); + virtual void OnPlayBackStarted(); + virtual void OnPlayBackPaused(); + virtual void OnPlayBackResumed(); + virtual void OnPlayBackStopped(); + virtual void OnQueueNextItem(); + virtual void OnPlayBackSeek(int iTime, int seekOffset); + virtual void OnPlayBackSeekChapter(int iChapter); + virtual void OnPlayBackSpeedChanged(int iSpeed); bool PlayMedia(const CFileItem& item, int iPlaylist = PLAYLIST_MUSIC); bool PlayMediaSync(const CFileItem& item, int iPlaylist = PLAYLIST_MUSIC); bool ProcessAndStartPlaylist(const std::string& strPlayList, PLAYLIST::CPlayList& playlist, int iPlaylist, int track=0); @@ -204,7 +196,7 @@ void CloseNetworkShares(); void ShowAppMigrationMessage(); - virtual void Process() override; + virtual void Process(); void ProcessSlow(); void ResetScreenSaver(); float GetVolume(bool percentage = true) const; @@ -283,7 +275,7 @@ void UpdateLibraries(); void CheckMusicPlaylist(); - bool ExecuteXBMCAction(std::string action, const CGUIListItemPtr &item = NULL); + bool ExecuteXBMCAction(std::string action); static bool OnEvent(XBMC_Event& newEvent); @@ -318,6 +310,8 @@ PlayState m_ePlayState; CCriticalSection m_playStateMutex; + CKaraokeLyricsManager* m_pKaraokeMgr; + PLAYERCOREID m_eForcedNextPlayer; std::string m_strPlayListFile; @@ -369,7 +363,7 @@ bool SwitchToFullScreen(bool force = false); - void SetRenderGUI(bool renderGUI) override; + void SetRenderGUI(bool renderGUI); bool GetRenderGUI() const { return m_renderGUI; }; bool SetLanguage(const std::string &strLanguage); @@ -377,7 +371,7 @@ ReplayGainSettings& GetReplayGainSettings() { return m_replayGainSettings; } - void SetLoggingIn(bool switchingProfiles); + void SetLoggingIn(bool loggingIn) { m_loggingIn = loggingIn; } /*! \brief Register an action listener. @@ -391,14 +385,14 @@ void UnregisterActionListener(IActionListener *listener); protected: - virtual bool OnSettingsSaving() const override; + virtual bool OnSettingsSaving() const; - virtual bool Load(const TiXmlNode *settings) override; - virtual bool Save(TiXmlNode *settings) const override; + virtual bool Load(const TiXmlNode *settings); + virtual bool Save(TiXmlNode *settings) const; - virtual void OnSettingChanged(const CSetting *setting) override; - virtual void OnSettingAction(const CSetting *setting) override; - virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode) override; + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); + virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode); bool LoadSkin(const std::string& skinID); bool LoadSkin(const std::shared_ptr& skin); @@ -411,10 +405,8 @@ bool NotifyActionListeners(const CAction &action) const; bool m_skinReverting; - std::string m_skinReloadSettingIgnore; - bool m_saveSkinOnUnloading; - bool m_autoExecScriptExecuted; + bool m_loggingIn; #if defined(TARGET_DARWIN_IOS) friend class CWinEventsIOS; @@ -494,10 +486,7 @@ bool InitDirectoriesWin32(); void CreateUserDirs(); - /*! \brief Helper method to determine how to handle TMSG_SHUTDOWN - */ - void HandleShutdownMessage(); - + CPlayerController *m_playerController; CInertialScrollingHandler *m_pInertialScrollingHandler; CNetwork *m_network; #ifdef HAS_PERFORMANCE_SAMPLE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/ApplicationMessenger.cpp kodi-15.2~git20151019.1039-final/xbmc/ApplicationMessenger.cpp --- kodi-16.1~git20160425.1001-final/xbmc/ApplicationMessenger.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/ApplicationMessenger.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,1415 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "system.h" +#include "ApplicationMessenger.h" +#include "Application.h" + +#include "PlayListPlayer.h" +#include "Util.h" +#include "pictures/GUIWindowSlideShow.h" +#include "interfaces/Builtins.h" +#include "interfaces/generic/ScriptInvocationManager.h" +#include "network/Network.h" +#include "utils/log.h" +#include "utils/URIUtils.h" +#include "utils/Variant.h" +#include "guilib/GUIWindowManager.h" +#include "settings/AdvancedSettings.h" +#include "settings/Settings.h" +#include "FileItem.h" +#include "guilib/GUIDialog.h" +#include "input/Key.h" +#include "guilib/GUIKeyboardFactory.h" +#include "guilib/Resolution.h" +#include "GUIInfoManager.h" +#include "cores/VideoRenderers/RenderManager.h" +#include "cores/AudioEngine/AEFactory.h" +#include "music/tags/MusicInfoTag.h" + +#include "peripherals/Peripherals.h" +#include "powermanagement/PowerManager.h" + +#ifdef TARGET_WINDOWS +#include "WIN32Util.h" +#define CHalManager CWIN32Util +#elif defined(TARGET_DARWIN) +#include "osx/CocoaInterface.h" +#endif +#include "addons/AddonCallbacksGUI.h" +#include "guilib/LocalizeStrings.h" +#include "threads/SingleLock.h" +#include "URL.h" + +#include "playlists/PlayList.h" + +#include "pvr/PVRManager.h" +#include "windows/GUIWindowLoginScreen.h" + +#include "utils/GlobalsHandling.h" +#if defined(TARGET_ANDROID) + #include "xbmc/android/activity/XBMCApp.h" +#endif + +using namespace PVR; +using namespace std; +using namespace MUSIC_INFO; +using namespace PERIPHERALS; + +CDelayedMessage::CDelayedMessage(ThreadMessage& msg, unsigned int delay) : CThread("DelayedMessage") +{ + m_msg.dwMessage = msg.dwMessage; + m_msg.param1 = msg.param1; + m_msg.param2 = msg.param2; + m_msg.waitEvent = msg.waitEvent; + m_msg.lpVoid = msg.lpVoid; + m_msg.strParam = msg.strParam; + m_msg.params = msg.params; + + m_delay = delay; +} + +void CDelayedMessage::Process() +{ + Sleep(m_delay); + + if (!m_bStop) + CApplicationMessenger::Get().SendMessage(m_msg, false); +} + + +CApplicationMessenger& CApplicationMessenger::Get() +{ + return s_messenger; +} + +CApplicationMessenger::CApplicationMessenger() +{ +} + +CApplicationMessenger::~CApplicationMessenger() +{ + Cleanup(); +} + +void CApplicationMessenger::Cleanup() +{ + CSingleLock lock (m_critSection); + + while (!m_vecMessages.empty()) + { + ThreadMessage* pMsg = m_vecMessages.front(); + + if (pMsg->waitEvent) + pMsg->waitEvent->Set(); + + delete pMsg; + m_vecMessages.pop(); + } + + while (!m_vecWindowMessages.empty()) + { + ThreadMessage* pMsg = m_vecWindowMessages.front(); + + if (pMsg->waitEvent) + pMsg->waitEvent->Set(); + + delete pMsg; + m_vecWindowMessages.pop(); + } +} + +void CApplicationMessenger::SendMessage(ThreadMessage& message, bool wait) +{ + message.waitEvent.reset(); + std::shared_ptr waitEvent; + if (wait) + { // check that we're not being called from our application thread, else we'll be waiting + // forever! + if (!g_application.IsCurrentThread()) + { + message.waitEvent.reset(new CEvent(true)); + waitEvent = message.waitEvent; + } + else + { + //OutputDebugString("Attempting to wait on a SendMessage() from our application thread will cause lockup!\n"); + //OutputDebugString("Sending immediately\n"); + ProcessMessage(&message); + return; + } + } + + CSingleLock lock (m_critSection); + + if (g_application.m_bStop) + { + if (message.waitEvent) + message.waitEvent.reset(); + return; + } + + ThreadMessage* msg = new ThreadMessage(); + msg->dwMessage = message.dwMessage; + msg->param1 = message.param1; + msg->param2 = message.param2; + msg->waitEvent = message.waitEvent; + msg->lpVoid = message.lpVoid; + msg->strParam = message.strParam; + msg->params = message.params; + + if (msg->dwMessage == TMSG_DIALOG_DOMODAL) + m_vecWindowMessages.push(msg); + else + m_vecMessages.push(msg); + lock.Leave(); // this releases the lock on the vec of messages and + // allows the ProcessMessage to execute and therefore + // delete the message itself. Therefore any accesss + // of the message itself after this point consittutes + // a race condition (yarc - "yet another race condition") + // + if (waitEvent) // ... it just so happens we have a spare reference to the + // waitEvent ... just for such contingencies :) + { + // ensure the thread doesn't hold the graphics lock + CSingleExit exit(g_graphicsContext); + waitEvent->Wait(); + } +} + +void CApplicationMessenger::ProcessMessages() +{ + // process threadmessages + CSingleLock lock (m_critSection); + while (!m_vecMessages.empty()) + { + ThreadMessage* pMsg = m_vecMessages.front(); + //first remove the message from the queue, else the message could be processed more then once + m_vecMessages.pop(); + + //Leave here as the message might make another + //thread call processmessages or sendmessage + + std::shared_ptr waitEvent = pMsg->waitEvent; + lock.Leave(); // <- see the large comment in SendMessage ^ + + ProcessMessage(pMsg); + if (waitEvent) + waitEvent->Set(); + delete pMsg; + + lock.Enter(); + } +} + +void CApplicationMessenger::ProcessMessage(ThreadMessage *pMsg) +{ + switch (pMsg->dwMessage) + { + case TMSG_SHUTDOWN: + { + switch (CSettings::Get().GetInt("powermanagement.shutdownstate")) + { + case POWERSTATE_SHUTDOWN: + Powerdown(); + break; + + case POWERSTATE_SUSPEND: + Suspend(); + break; + + case POWERSTATE_HIBERNATE: + Hibernate(); + break; + + case POWERSTATE_QUIT: + Quit(); + break; + + case POWERSTATE_MINIMIZE: + Minimize(); + break; + + case TMSG_RENDERER_FLUSH: + g_renderManager.Flush(); + break; + } + } + break; + + case TMSG_POWERDOWN: + { + g_application.Stop(EXITCODE_POWERDOWN); + g_powerManager.Powerdown(); + } + break; + + case TMSG_QUIT: + { + g_application.Stop(EXITCODE_QUIT); + } + break; + + case TMSG_HIBERNATE: + { + g_powerManager.Hibernate(); + } + break; + + case TMSG_SUSPEND: + { + g_powerManager.Suspend(); + } + break; + + case TMSG_RESTART: + case TMSG_RESET: + { + g_application.Stop(EXITCODE_REBOOT); + g_powerManager.Reboot(); + } + break; + + case TMSG_RESTARTAPP: + { +#if defined(TARGET_WINDOWS) || defined(TARGET_LINUX) + g_application.Stop(EXITCODE_RESTARTAPP); +#endif + } + break; + + case TMSG_INHIBITIDLESHUTDOWN: + { + g_application.InhibitIdleShutdown(pMsg->param1 != 0); + } + break; + + case TMSG_ACTIVATESCREENSAVER: + { + g_application.ActivateScreenSaver(); + } + break; + + case TMSG_MEDIA_PLAY: + { + // first check if we were called from the PlayFile() function + if (pMsg->lpVoid && pMsg->param2 == 0) + { + CFileItem *item = (CFileItem *)pMsg->lpVoid; + g_application.PlayFile(*item, pMsg->param1 != 0); + delete item; + return; + } + // restore to previous window if needed + if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW || + g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO || + g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION) + g_windowManager.PreviousWindow(); + + g_application.ResetScreenSaver(); + g_application.WakeUpScreenSaverAndDPMS(); + + //g_application.StopPlaying(); + // play file + if(pMsg->lpVoid) + { + CFileItemList *list = (CFileItemList *)pMsg->lpVoid; + + if (list->Size() > 0) + { + int playlist = PLAYLIST_MUSIC; + for (int i = 0; i < list->Size(); i++) + { + if ((*list)[i]->IsVideo()) + { + playlist = PLAYLIST_VIDEO; + break; + } + } + + g_playlistPlayer.ClearPlaylist(playlist); + g_playlistPlayer.SetCurrentPlaylist(playlist); + //For single item lists try PlayMedia. This covers some more cases where a playlist is not appropriate + //It will fall through to PlayFile + if (list->Size() == 1 && !(*list)[0]->IsPlayList()) + g_application.PlayMedia(*((*list)[0]), playlist); + else + { + // Handle "shuffled" option if present + if (list->HasProperty("shuffled") && list->GetProperty("shuffled").isBoolean()) + g_playlistPlayer.SetShuffle(playlist, list->GetProperty("shuffled").asBoolean(), false); + // Handle "repeat" option if present + if (list->HasProperty("repeat") && list->GetProperty("repeat").isInteger()) + g_playlistPlayer.SetRepeat(playlist, (PLAYLIST::REPEAT_STATE)list->GetProperty("repeat").asInteger(), false); + + g_playlistPlayer.Add(playlist, (*list)); + g_playlistPlayer.Play(pMsg->param1); + } + } + + delete list; + } + else if (pMsg->param1 == PLAYLIST_MUSIC || pMsg->param1 == PLAYLIST_VIDEO) + { + if (g_playlistPlayer.GetCurrentPlaylist() != pMsg->param1) + g_playlistPlayer.SetCurrentPlaylist(pMsg->param1); + + PlayListPlayerPlay(pMsg->param2); + } + } + break; + + case TMSG_MEDIA_RESTART: + g_application.Restart(true); + break; + + case TMSG_PICTURE_SHOW: + { + CGUIWindowSlideShow *pSlideShow = (CGUIWindowSlideShow *)g_windowManager.GetWindow(WINDOW_SLIDESHOW); + if (!pSlideShow) return ; + + // stop playing file + if (g_application.m_pPlayer->IsPlayingVideo()) g_application.StopPlaying(); + + if (g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO) + g_windowManager.PreviousWindow(); + + g_application.ResetScreenSaver(); + g_application.WakeUpScreenSaverAndDPMS(); + + g_graphicsContext.Lock(); + + if (g_windowManager.GetActiveWindow() != WINDOW_SLIDESHOW) + g_windowManager.ActivateWindow(WINDOW_SLIDESHOW); + if (URIUtils::IsZIP(pMsg->strParam) || URIUtils::IsRAR(pMsg->strParam)) // actually a cbz/cbr + { + CFileItemList items; + CURL pathToUrl; + if (URIUtils::IsZIP(pMsg->strParam)) + pathToUrl = URIUtils::CreateArchivePath("zip", CURL(pMsg->strParam), ""); + else + pathToUrl = URIUtils::CreateArchivePath("rar", CURL(pMsg->strParam), ""); + + CUtil::GetRecursiveListing(pathToUrl.Get(), items, g_advancedSettings.m_pictureExtensions, XFILE::DIR_FLAG_NO_FILE_DIRS); + if (items.Size() > 0) + { + pSlideShow->Reset(); + for (int i=0;iAdd(items[i].get()); + } + pSlideShow->Select(items[0]->GetPath()); + } + } + else + { + CFileItem item(pMsg->strParam, false); + pSlideShow->Reset(); + pSlideShow->Add(&item); + pSlideShow->Select(pMsg->strParam); + } + g_graphicsContext.Unlock(); + } + break; + + case TMSG_PICTURE_SLIDESHOW: + { + CGUIWindowSlideShow *pSlideShow = (CGUIWindowSlideShow *)g_windowManager.GetWindow(WINDOW_SLIDESHOW); + if (!pSlideShow) return ; + + if (g_application.m_pPlayer->IsPlayingVideo()) + g_application.StopPlaying(); + + g_graphicsContext.Lock(); + pSlideShow->Reset(); + + CFileItemList items; + std::string strPath = pMsg->strParam; + std::string extensions = g_advancedSettings.m_pictureExtensions; + if (pMsg->param1) + extensions += "|.tbn"; + CUtil::GetRecursiveListing(strPath, items, extensions); + + if (items.Size() > 0) + { + for (int i=0;iAdd(items[i].get()); + pSlideShow->StartSlideShow(); //Start the slideshow! + } + + if (g_windowManager.GetActiveWindow() != WINDOW_SLIDESHOW) + { + if(items.Size() == 0) + { + CSettings::Get().SetString("screensaver.mode", "screensaver.xbmc.builtin.dim"); + g_application.ActivateScreenSaver(); + } + else + g_windowManager.ActivateWindow(WINDOW_SLIDESHOW); + } + + g_graphicsContext.Unlock(); + } + break; + + case TMSG_SETLANGUAGE: + g_application.SetLanguage(pMsg->strParam); + break; + case TMSG_MEDIA_STOP: + { + // restore to previous window if needed + bool stopSlideshow = true; + bool stopVideo = true; + bool stopMusic = true; + if (pMsg->param1 >= PLAYLIST_MUSIC && pMsg->param1 <= PLAYLIST_PICTURE) + { + stopSlideshow = (pMsg->param1 == PLAYLIST_PICTURE); + stopVideo = (pMsg->param1 == PLAYLIST_VIDEO); + stopMusic = (pMsg->param1 == PLAYLIST_MUSIC); + } + + if ((stopSlideshow && g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) || + (stopVideo && g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO) || + (stopMusic && g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION)) + g_windowManager.PreviousWindow(); + + g_application.ResetScreenSaver(); + g_application.WakeUpScreenSaverAndDPMS(); + + // stop playing file + if (g_application.m_pPlayer->IsPlaying()) g_application.StopPlaying(); + } + break; + + case TMSG_MEDIA_PAUSE: + if (g_application.m_pPlayer->HasPlayer()) + { + g_application.ResetScreenSaver(); + g_application.WakeUpScreenSaverAndDPMS(); + g_application.m_pPlayer->Pause(); + } + break; + + case TMSG_MEDIA_UNPAUSE: + if (g_application.m_pPlayer->IsPausedPlayback()) + { + g_application.ResetScreenSaver(); + g_application.WakeUpScreenSaverAndDPMS(); + g_application.m_pPlayer->Pause(); + } + break; + + case TMSG_MEDIA_PAUSE_IF_PLAYING: + if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) + { + g_application.ResetScreenSaver(); + g_application.WakeUpScreenSaverAndDPMS(); + g_application.m_pPlayer->Pause(); + } + break; + + case TMSG_SWITCHTOFULLSCREEN: + if(g_windowManager.GetActiveWindow() != WINDOW_FULLSCREEN_VIDEO) + g_application.SwitchToFullScreen(true); + break; + + case TMSG_SETVIDEORESOLUTION: + { + RESOLUTION res = (RESOLUTION)pMsg->param1; + bool forceUpdate = pMsg->param2 == 1 ? true : false; + g_graphicsContext.SetVideoResolution(res, forceUpdate); + } + break; + + case TMSG_VIDEORESIZE: + { + XBMC_Event newEvent; + memset(&newEvent, 0, sizeof(newEvent)); + newEvent.type = XBMC_VIDEORESIZE; + newEvent.resize.w = pMsg->param1; + newEvent.resize.h = pMsg->param2; + g_application.OnEvent(newEvent); + g_windowManager.MarkDirty(); + } + break; + + case TMSG_TOGGLEFULLSCREEN: + g_graphicsContext.Lock(); + g_graphicsContext.ToggleFullScreenRoot(); + g_graphicsContext.Unlock(); + break; + + case TMSG_MINIMIZE: + g_application.Minimize(); + break; + + case TMSG_EXECUTE_OS: + /* Suspend AE temporarily so exclusive or hog-mode sinks */ + /* don't block external player's access to audio device */ + if (!CAEFactory::Suspend()) + { + CLog::Log(LOGNOTICE, "%s: Failed to suspend AudioEngine before launching external program",__FUNCTION__); + } +#if defined( TARGET_POSIX) && !defined(TARGET_DARWIN) + CUtil::RunCommandLine(pMsg->strParam.c_str(), (pMsg->param1 == 1)); +#elif defined(TARGET_WINDOWS) + CWIN32Util::XBMCShellExecute(pMsg->strParam.c_str(), (pMsg->param1 == 1)); +#endif + /* Resume AE processing of XBMC native audio */ + if (!CAEFactory::Resume()) + { + CLog::Log(LOGFATAL, "%s: Failed to restart AudioEngine after return from external player",__FUNCTION__); + } + break; + + case TMSG_EXECUTE_SCRIPT: + CScriptInvocationManager::Get().ExecuteAsync(pMsg->strParam); + break; + + case TMSG_EXECUTE_BUILT_IN: + CBuiltins::Execute(pMsg->strParam.c_str()); + break; + + case TMSG_PLAYLISTPLAYER_PLAY: + if (pMsg->param1 != -1) + g_playlistPlayer.Play(pMsg->param1); + else + g_playlistPlayer.Play(); + break; + + case TMSG_PLAYLISTPLAYER_PLAY_SONG_ID: + if (pMsg->param1 != -1) + { + bool *result = (bool*)pMsg->lpVoid; + *result = g_playlistPlayer.PlaySongId(pMsg->param1); + } + else + g_playlistPlayer.Play(); + break; + + case TMSG_PLAYLISTPLAYER_NEXT: + g_playlistPlayer.PlayNext(); + break; + + case TMSG_PLAYLISTPLAYER_PREV: + g_playlistPlayer.PlayPrevious(); + break; + + case TMSG_PLAYLISTPLAYER_ADD: + if(pMsg->lpVoid) + { + CFileItemList *list = (CFileItemList *)pMsg->lpVoid; + + g_playlistPlayer.Add(pMsg->param1, (*list)); + delete list; + } + break; + + case TMSG_PLAYLISTPLAYER_INSERT: + if (pMsg->lpVoid) + { + CFileItemList *list = (CFileItemList *)pMsg->lpVoid; + g_playlistPlayer.Insert(pMsg->param1, (*list), pMsg->param2); + delete list; + } + break; + + case TMSG_PLAYLISTPLAYER_REMOVE: + if (pMsg->param1 != -1) + g_playlistPlayer.Remove(pMsg->param1,pMsg->param2); + break; + + case TMSG_PLAYLISTPLAYER_CLEAR: + g_playlistPlayer.ClearPlaylist(pMsg->param1); + break; + + case TMSG_PLAYLISTPLAYER_SHUFFLE: + g_playlistPlayer.SetShuffle(pMsg->param1, pMsg->param2 > 0); + break; + + case TMSG_PLAYLISTPLAYER_REPEAT: + g_playlistPlayer.SetRepeat(pMsg->param1, (PLAYLIST::REPEAT_STATE)pMsg->param2); + break; + + case TMSG_PLAYLISTPLAYER_GET_ITEMS: + if (pMsg->lpVoid) + { + PLAYLIST::CPlayList playlist = g_playlistPlayer.GetPlaylist(pMsg->param1); + CFileItemList *list = (CFileItemList *)pMsg->lpVoid; + + for (int i = 0; i < playlist.size(); i++) + list->Add(CFileItemPtr(new CFileItem(*playlist[i]))); + } + break; + + case TMSG_PLAYLISTPLAYER_SWAP: + if (pMsg->lpVoid) + { + vector *indexes = (vector *)pMsg->lpVoid; + if (indexes->size() == 2) + g_playlistPlayer.Swap(pMsg->param1, indexes->at(0), indexes->at(1)); + delete indexes; + } + break; + + // Window messages below here... + case TMSG_DIALOG_DOMODAL: //doModel of window + { + CGUIDialog* pDialog = (CGUIDialog*)g_windowManager.GetWindow(pMsg->param1); + if (!pDialog) return ; + pDialog->DoModal(); + } + break; + + case TMSG_NETWORKMESSAGE: + { + g_application.getNetwork().NetworkMessage((CNetwork::EMESSAGE)pMsg->param1, pMsg->param2); + } + break; + + case TMSG_GUI_DO_MODAL: + { + CGUIDialog *pDialog = (CGUIDialog *)pMsg->lpVoid; + if (pDialog) + pDialog->DoModal(pMsg->param1, pMsg->strParam); + } + break; + + case TMSG_GUI_SHOW: + { + CGUIDialog *pDialog = (CGUIDialog *)pMsg->lpVoid; + if (pDialog) + pDialog->Show(); + } + break; + + case TMSG_GUI_WINDOW_CLOSE: + { + CGUIWindow *window = (CGUIWindow *)pMsg->lpVoid; + if (window) + window->Close(pMsg->param2 & 0x1 ? true : false, pMsg->param1, pMsg->param2 & 0x2 ? true : false); + } + break; + + case TMSG_GUI_ACTIVATE_WINDOW: + { + g_windowManager.ActivateWindow(pMsg->param1, pMsg->params, pMsg->param2 & 0x1 ? true : false, pMsg->param2 & 0x2 ? true : false); + } + break; + + case TMSG_GUI_ADDON_DIALOG: + { + if (pMsg->lpVoid) + { // TODO: This is ugly - really these python dialogs should just be normal XBMC dialogs + ((ADDON::CGUIAddonWindowDialog *) pMsg->lpVoid)->Show_Internal(pMsg->param2 > 0); + } + } + break; + +#ifdef HAS_PYTHON + case TMSG_GUI_PYTHON_DIALOG: + { + // This hack is not much better but at least I don't need to make ApplicationMessenger + // know about Addon (Python) specific classes. + CAction caction(pMsg->param1); + ((CGUIWindow*)pMsg->lpVoid)->OnAction(caction); + } + break; +#endif + + case TMSG_GUI_ACTION: + { + if (pMsg->lpVoid) + { + CAction *action = (CAction *)pMsg->lpVoid; + if (pMsg->param1 == WINDOW_INVALID) + g_application.OnAction(*action); + else + { + CGUIWindow *pWindow = g_windowManager.GetWindow(pMsg->param1); + if (pWindow) + pWindow->OnAction(*action); + else + CLog::Log(LOGWARNING, "Failed to get window with ID %i to send an action to", pMsg->param1); + } + delete action; + } + } + break; + + case TMSG_GUI_MESSAGE: + { + if (pMsg->lpVoid) + { + CGUIMessage *message = (CGUIMessage *)pMsg->lpVoid; + g_windowManager.SendMessage(*message, pMsg->param1); + delete message; + } + } + break; + + case TMSG_GUI_INFOLABEL: + { + if (pMsg->lpVoid) + { + vector *infoLabels = (vector *)pMsg->lpVoid; + for (unsigned int i = 0; i < pMsg->params.size(); i++) + infoLabels->push_back(g_infoManager.GetLabel(g_infoManager.TranslateString(pMsg->params[i]))); + } + } + break; + case TMSG_GUI_INFOBOOL: + { + if (pMsg->lpVoid) + { + vector *infoLabels = (vector *)pMsg->lpVoid; + for (unsigned int i = 0; i < pMsg->params.size(); i++) + infoLabels->push_back(g_infoManager.EvaluateBool(pMsg->params[i])); + } + } + break; + + case TMSG_CALLBACK: + { + ThreadMessageCallback *callback = (ThreadMessageCallback*)pMsg->lpVoid; + callback->callback(callback->userptr); + } + break; + + case TMSG_VOLUME_SHOW: + { + CAction action(pMsg->param1); + g_application.ShowVolumeBar(&action); + } + break; + + case TMSG_DISPLAY_SETUP: + { + *((bool*)pMsg->lpVoid) = g_application.InitWindow(); + g_application.SetRenderGUI(true); + } + break; + + case TMSG_DISPLAY_DESTROY: + { + *((bool*)pMsg->lpVoid) = g_application.DestroyWindow(); + g_application.SetRenderGUI(false); + } + break; + + case TMSG_UPDATE_CURRENT_ITEM: + { + CFileItem* item = (CFileItem*)pMsg->lpVoid; + if (!item) + return; + if (pMsg->param1 == 1 && item->HasMusicInfoTag()) // only grab music tag + g_infoManager.SetCurrentSongTag(*item->GetMusicInfoTag()); + else if (pMsg->param1 == 2 && item->HasVideoInfoTag()) // only grab video tag + g_infoManager.SetCurrentVideoTag(*item->GetVideoInfoTag()); + else + g_infoManager.SetCurrentItem(*item); + delete item; + break; + } + + case TMSG_LOADPROFILE: + { + CGUIWindowLoginScreen::LoadProfile(pMsg->param1); + break; + } + case TMSG_CECTOGGLESTATE: + { + *((bool*)pMsg->lpVoid) = g_peripherals.ToggleDeviceState(STATE_SWITCH_TOGGLE); + break; + } + case TMSG_CECACTIVATESOURCE: + { + g_peripherals.ToggleDeviceState(STATE_ACTIVATE_SOURCE); + break; + } + case TMSG_CECSTANDBY: + { + g_peripherals.ToggleDeviceState(STATE_STANDBY); + break; + } + case TMSG_START_ANDROID_ACTIVITY: + { +#if defined(TARGET_ANDROID) + if (pMsg->params.size()) + { + CXBMCApp::StartActivity(pMsg->params[0], + pMsg->params.size() > 1 ? pMsg->params[1] : "", + pMsg->params.size() > 2 ? pMsg->params[2] : "", + pMsg->params.size() > 3 ? pMsg->params[3] : ""); + } +#endif + break; + } + case TMSG_SETPVRMANAGERSTATE: + { + if (pMsg->param1 != 0) + g_application.StartPVRManager(); + else + g_application.StopPVRManager(); + } + } +} + +void CApplicationMessenger::ProcessWindowMessages() +{ + CSingleLock lock (m_critSection); + //message type is window, process window messages + while (!m_vecWindowMessages.empty()) + { + ThreadMessage* pMsg = m_vecWindowMessages.front(); + //first remove the message from the queue, else the message could be processed more then once + m_vecWindowMessages.pop(); + + // leave here in case we make more thread messages from this one + + std::shared_ptr waitEvent = pMsg->waitEvent; + lock.Leave(); // <- see the large comment in SendMessage ^ + + ProcessMessage(pMsg); + if (waitEvent) + waitEvent->Set(); + delete pMsg; + + lock.Enter(); + } +} + +int CApplicationMessenger::SetResponse(std::string response) +{ + CSingleLock lock (m_critBuffer); + bufferResponse=response; + lock.Leave(); + return 0; +} + +std::string CApplicationMessenger::GetResponse() +{ + std::string tmp; + CSingleLock lock (m_critBuffer); + tmp=bufferResponse; + lock.Leave(); + return tmp; +} + +void CApplicationMessenger::ExecBuiltIn(const std::string &command, bool wait) +{ + ThreadMessage tMsg = {TMSG_EXECUTE_BUILT_IN}; + tMsg.strParam = command; + SendMessage(tMsg, wait); +} + +void CApplicationMessenger::MediaPlay(string filename) +{ + CFileItem item(filename, false); + MediaPlay(item); +} + +void CApplicationMessenger::MediaPlay(const CFileItem &item, bool wait) +{ + CFileItemList list; + list.Add(CFileItemPtr(new CFileItem(item))); + + MediaPlay(list, 0, wait); +} + +void CApplicationMessenger::MediaPlay(const CFileItemList &list, int song, bool wait) +{ + ThreadMessage tMsg = {TMSG_MEDIA_PLAY}; + CFileItemList* listcopy = new CFileItemList(); + listcopy->Copy(list); + tMsg.lpVoid = (void*)listcopy; + tMsg.param1 = song; + tMsg.param2 = 1; + SendMessage(tMsg, wait); +} + +void CApplicationMessenger::MediaPlay(int playlistid, int song /* = -1 */) +{ + ThreadMessage tMsg = {TMSG_MEDIA_PLAY}; + tMsg.lpVoid = NULL; + tMsg.param1 = playlistid; + tMsg.param2 = song; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayFile(const CFileItem &item, bool bRestart /*= false*/) +{ + ThreadMessage tMsg = {TMSG_MEDIA_PLAY}; + CFileItem *pItem = new CFileItem(item); + tMsg.lpVoid = (void *)pItem; + tMsg.param1 = bRestart ? 1 : 0; + tMsg.param2 = 0; + SendMessage(tMsg, false); +} + +void CApplicationMessenger::MediaStop(bool bWait /* = true */, int playlistid /* = -1 */) +{ + ThreadMessage tMsg = {TMSG_MEDIA_STOP}; + tMsg.param1 = playlistid; + SendMessage(tMsg, bWait); +} + +void CApplicationMessenger::MediaPause() +{ + ThreadMessage tMsg = {TMSG_MEDIA_PAUSE}; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::MediaUnPause() +{ + ThreadMessage tMsg = {TMSG_MEDIA_UNPAUSE}; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::MediaPauseIfPlaying() +{ + ThreadMessage tMsg = {TMSG_MEDIA_PAUSE_IF_PLAYING}; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::MediaRestart(bool bWait) +{ + ThreadMessage tMsg = {TMSG_MEDIA_RESTART}; + SendMessage(tMsg, bWait); +} + +void CApplicationMessenger::PlayListPlayerPlay() +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_PLAY, -1}; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayListPlayerPlay(int iSong) +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_PLAY, iSong}; + SendMessage(tMsg, true); +} + +bool CApplicationMessenger::PlayListPlayerPlaySongId(int songId) +{ + bool returnState; + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_PLAY_SONG_ID, songId}; + tMsg.lpVoid = (void *)&returnState; + SendMessage(tMsg, true); + return returnState; +} + +void CApplicationMessenger::PlayListPlayerNext() +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_NEXT}; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayListPlayerPrevious() +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_PREV}; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayListPlayerAdd(int playlist, const CFileItem &item) +{ + CFileItemList list; + list.Add(CFileItemPtr(new CFileItem(item))); + + PlayListPlayerAdd(playlist, list); +} + +void CApplicationMessenger::PlayListPlayerAdd(int playlist, const CFileItemList &list) +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_ADD}; + CFileItemList* listcopy = new CFileItemList(); + listcopy->Copy(list); + tMsg.lpVoid = (void*)listcopy; + tMsg.param1 = playlist; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayListPlayerInsert(int playlist, const CFileItem &item, int index) +{ + CFileItemList list; + list.Add(CFileItemPtr(new CFileItem(item))); + PlayListPlayerInsert(playlist, list, index); +} + +void CApplicationMessenger::PlayListPlayerInsert(int playlist, const CFileItemList &list, int index) +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_INSERT}; + CFileItemList* listcopy = new CFileItemList(); + listcopy->Copy(list); + tMsg.lpVoid = (void *)listcopy; + tMsg.param1 = playlist; + tMsg.param2 = index; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayListPlayerRemove(int playlist, int position) +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_REMOVE, playlist, position}; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayListPlayerClear(int playlist) +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_CLEAR}; + tMsg.param1 = playlist; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayListPlayerShuffle(int playlist, bool shuffle) +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_SHUFFLE}; + tMsg.param1 = playlist; + tMsg.param2 = shuffle ? 1 : 0; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayListPlayerGetItems(int playlist, CFileItemList &list) +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_GET_ITEMS}; + tMsg.param1 = playlist; + tMsg.lpVoid = (void *)&list; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayListPlayerSwap(int playlist, int indexItem1, int indexItem2) +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_SWAP}; + tMsg.param1 = playlist; + vector *indexes = new vector(); + indexes->push_back(indexItem1); + indexes->push_back(indexItem2); + tMsg.lpVoid = (void *)indexes; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PlayListPlayerRepeat(int playlist, int repeatState) +{ + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_REPEAT}; + tMsg.param1 = playlist; + tMsg.param2 = repeatState; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::PictureShow(string filename) +{ + ThreadMessage tMsg = {TMSG_PICTURE_SHOW}; + tMsg.strParam = filename; + SendMessage(tMsg); +} + +void CApplicationMessenger::PictureSlideShow(string pathname, bool addTBN /* = false */) +{ + unsigned int dwMessage = TMSG_PICTURE_SLIDESHOW; + ThreadMessage tMsg = {dwMessage}; + tMsg.strParam = pathname; + tMsg.param1 = addTBN ? 1 : 0; + SendMessage(tMsg); +} + +void CApplicationMessenger::SetGUILanguage(const std::string &strLanguage) +{ + ThreadMessage tMsg = {TMSG_SETLANGUAGE}; + tMsg.strParam = strLanguage; + SendMessage(tMsg); +} + +void CApplicationMessenger::Shutdown() +{ + ThreadMessage tMsg = {TMSG_SHUTDOWN}; + SendMessage(tMsg); +} + +void CApplicationMessenger::Powerdown() +{ + ThreadMessage tMsg = {TMSG_POWERDOWN}; + SendMessage(tMsg); +} + +void CApplicationMessenger::Quit() +{ + ThreadMessage tMsg = {TMSG_QUIT}; + SendMessage(tMsg); +} + +void CApplicationMessenger::Hibernate() +{ + ThreadMessage tMsg = {TMSG_HIBERNATE}; + SendMessage(tMsg); +} + +void CApplicationMessenger::Suspend() +{ + ThreadMessage tMsg = {TMSG_SUSPEND}; + SendMessage(tMsg); +} + +void CApplicationMessenger::Restart() +{ + ThreadMessage tMsg = {TMSG_RESTART}; + SendMessage(tMsg); +} + +void CApplicationMessenger::Reset() +{ + ThreadMessage tMsg = {TMSG_RESET}; + SendMessage(tMsg); +} + +void CApplicationMessenger::RestartApp() +{ + ThreadMessage tMsg = {TMSG_RESTARTAPP}; + SendMessage(tMsg); +} + +void CApplicationMessenger::InhibitIdleShutdown(bool inhibit) +{ + ThreadMessage tMsg = {TMSG_INHIBITIDLESHUTDOWN, inhibit}; + SendMessage(tMsg); +} + +void CApplicationMessenger::ActivateScreensaver() +{ + ThreadMessage tMsg = {TMSG_ACTIVATESCREENSAVER}; + SendMessage(tMsg); +} + +void CApplicationMessenger::NetworkMessage(int dwMessage, int dwParam) +{ + ThreadMessage tMsg = {TMSG_NETWORKMESSAGE, dwMessage, dwParam}; + SendMessage(tMsg); +} + +void CApplicationMessenger::SwitchToFullscreen() +{ + /* FIXME: ideally this call should return upon a successfull switch but currently + is causing deadlocks between the dvdplayer destructor and the rendermanager + */ + ThreadMessage tMsg = {TMSG_SWITCHTOFULLSCREEN}; + SendMessage(tMsg, false); +} + +void CApplicationMessenger::Minimize(bool wait) +{ + ThreadMessage tMsg = {TMSG_MINIMIZE}; + SendMessage(tMsg, wait); +} + +void CApplicationMessenger::DoModal(CGUIDialog *pDialog, int iWindowID, const std::string ¶m) +{ + ThreadMessage tMsg = {TMSG_GUI_DO_MODAL}; + tMsg.lpVoid = pDialog; + tMsg.param1 = iWindowID; + tMsg.strParam = param; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::ExecOS(const std::string &command, bool waitExit) +{ + ThreadMessage tMsg = {TMSG_EXECUTE_OS}; + tMsg.strParam = command; + tMsg.param1 = waitExit ? 1 : 0; + SendMessage(tMsg, false); +} + +void CApplicationMessenger::UserEvent(int code) +{ + ThreadMessage tMsg = {(unsigned int)code}; + SendMessage(tMsg, false); +} + +void CApplicationMessenger::Show(CGUIDialog *pDialog) +{ + ThreadMessage tMsg = {TMSG_GUI_SHOW}; + tMsg.lpVoid = pDialog; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::Close(CGUIWindow *window, bool forceClose, bool waitResult /*= true*/, int nextWindowID /*= 0*/, bool enableSound /*= true*/) +{ + ThreadMessage tMsg = {TMSG_GUI_WINDOW_CLOSE, nextWindowID}; + tMsg.param2 = (forceClose ? 0x01 : 0) | (enableSound ? 0x02 : 0); + tMsg.lpVoid = window; + SendMessage(tMsg, waitResult); +} + +void CApplicationMessenger::ActivateWindow(int windowID, const vector ¶ms, bool swappingWindows, bool force /* = false */) +{ + ThreadMessage tMsg = {TMSG_GUI_ACTIVATE_WINDOW, windowID}; + tMsg.param2 = (swappingWindows ? 0x01 : 0) | (force ? 0x02 : 0); + tMsg.params = params; + SendMessage(tMsg, true); +} + +void CApplicationMessenger::SendAction(const CAction &action, int windowID, bool waitResult) +{ + ThreadMessage tMsg = {TMSG_GUI_ACTION}; + tMsg.param1 = windowID; + tMsg.lpVoid = new CAction(action); + SendMessage(tMsg, waitResult); +} + +void CApplicationMessenger::SendGUIMessage(const CGUIMessage &message, int windowID, bool waitResult) +{ + ThreadMessage tMsg = {TMSG_GUI_MESSAGE}; + tMsg.param1 = windowID == WINDOW_INVALID ? 0 : windowID; + tMsg.lpVoid = new CGUIMessage(message); + SendMessage(tMsg, waitResult); +} + +void CApplicationMessenger::SendText(const std::string &aTextString, bool closeKeyboard /* = false */) +{ + if (CGUIKeyboardFactory::SendTextToActiveKeyboard(aTextString, closeKeyboard)) + return; + + CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow()); + if (!window) + return; + + CGUIMessage msg(GUI_MSG_SET_TEXT, 0, window->GetFocusedControlID()); + msg.SetLabel(aTextString); + msg.SetParam1(closeKeyboard ? 1 : 0); + SendGUIMessage(msg, window->GetID()); +} + +vector CApplicationMessenger::GetInfoLabels(const vector &properties) +{ + vector infoLabels; + + ThreadMessage tMsg = {TMSG_GUI_INFOLABEL}; + tMsg.params = properties; + tMsg.lpVoid = (void*)&infoLabels; + SendMessage(tMsg, true); + return infoLabels; +} + +vector CApplicationMessenger::GetInfoBooleans(const vector &properties) +{ + vector infoLabels; + + ThreadMessage tMsg = {TMSG_GUI_INFOBOOL}; + tMsg.params = properties; + tMsg.lpVoid = (void*)&infoLabels; + SendMessage(tMsg, true); + return infoLabels; +} + +void CApplicationMessenger::ShowVolumeBar(bool up) +{ + ThreadMessage tMsg = {TMSG_VOLUME_SHOW}; + tMsg.param1 = up ? ACTION_VOLUME_UP : ACTION_VOLUME_DOWN; + SendMessage(tMsg, false); +} + +bool CApplicationMessenger::SetupDisplay() +{ + bool result; + + ThreadMessage tMsg = {TMSG_DISPLAY_SETUP}; + tMsg.lpVoid = (void*)&result; + SendMessage(tMsg, true); + + return result; +} + +bool CApplicationMessenger::DestroyDisplay() +{ + bool result; + + ThreadMessage tMsg = {TMSG_DISPLAY_DESTROY}; + tMsg.lpVoid = (void*)&result; + SendMessage(tMsg, true); + + return result; +} + +void CApplicationMessenger::SetCurrentSongTag(const CMusicInfoTag& tag) +{ + CFileItem* item = new CFileItem(tag); + ThreadMessage tMsg = {TMSG_UPDATE_CURRENT_ITEM}; + tMsg.param1 = 1; + tMsg.lpVoid = (void*)item; + SendMessage(tMsg, false); +} + +void CApplicationMessenger::SetCurrentVideoTag(const CVideoInfoTag& tag) +{ + CFileItem* item = new CFileItem(tag); + ThreadMessage tMsg = {TMSG_UPDATE_CURRENT_ITEM}; + tMsg.param1 = 2; + tMsg.lpVoid = (void*)item; + SendMessage(tMsg, false); +} + +void CApplicationMessenger::SetCurrentItem(const CFileItem& item) +{ + CFileItem* item2 = new CFileItem(item); + ThreadMessage tMsg = {TMSG_UPDATE_CURRENT_ITEM}; + tMsg.lpVoid = (void*)item2; + SendMessage(tMsg, false); +} + +void CApplicationMessenger::LoadProfile(unsigned int idx) +{ + ThreadMessage tMsg = {TMSG_LOADPROFILE}; + tMsg.param1 = idx; + SendMessage(tMsg, false); +} + +void CApplicationMessenger::StartAndroidActivity(const vector ¶ms) +{ + ThreadMessage tMsg = {TMSG_START_ANDROID_ACTIVITY}; + tMsg.params = params; + SendMessage(tMsg, false); +} + +bool CApplicationMessenger::CECToggleState() +{ + bool result; + + ThreadMessage tMsg = {TMSG_CECTOGGLESTATE}; + tMsg.lpVoid = (void*)&result; + SendMessage(tMsg, true); + + return result; +} + +void CApplicationMessenger::CECActivateSource() +{ + ThreadMessage tMsg = {TMSG_CECACTIVATESOURCE}; + SendMessage(tMsg, false); +} + +void CApplicationMessenger::CECStandby() +{ + ThreadMessage tMsg = {TMSG_CECSTANDBY}; + SendMessage(tMsg, false); +} + +void CApplicationMessenger::SetPVRManagerState(bool onOff) +{ + ThreadMessage tMsg = {TMSG_SETPVRMANAGERSTATE}; + tMsg.param1 = onOff ? 1 : 0; + SendMessage(tMsg, false); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/ApplicationMessenger.h kodi-15.2~git20151019.1039-final/xbmc/ApplicationMessenger.h --- kodi-16.1~git20160425.1001-final/xbmc/ApplicationMessenger.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/ApplicationMessenger.h 2015-10-19 08:39:15.000000000 +0000 @@ -0,0 +1,281 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "guilib/WindowIDs.h" +#include "threads/Thread.h" +#include + +#include +#include "utils/GlobalsHandling.h" + +class CFileItem; +class CFileItemList; +class CGUIDialog; +class CGUIWindow; +class CGUIMessage; +class CVideoInfoTag; +class CAction; + +namespace MUSIC_INFO +{ + class CMusicInfoTag; +} + +// defines here +#define TMSG_DIALOG_DOMODAL 100 +#define TMSG_EXECUTE_SCRIPT 102 +#define TMSG_EXECUTE_BUILT_IN 103 +#define TMSG_EXECUTE_OS 104 + +#define TMSG_MEDIA_PLAY 200 +#define TMSG_MEDIA_STOP 201 +// the PAUSE is indeed a PLAYPAUSE +#define TMSG_MEDIA_PAUSE 202 +#define TMSG_MEDIA_RESTART 203 +#define TMSG_MEDIA_UNPAUSE 204 +#define TMSG_MEDIA_PAUSE_IF_PLAYING 205 + +#define TMSG_PLAYLISTPLAYER_PLAY 210 +#define TMSG_PLAYLISTPLAYER_NEXT 211 +#define TMSG_PLAYLISTPLAYER_PREV 212 +#define TMSG_PLAYLISTPLAYER_ADD 213 +#define TMSG_PLAYLISTPLAYER_CLEAR 214 +#define TMSG_PLAYLISTPLAYER_SHUFFLE 215 +#define TMSG_PLAYLISTPLAYER_GET_ITEMS 216 +#define TMSG_PLAYLISTPLAYER_PLAY_SONG_ID 217 +#define TMSG_PLAYLISTPLAYER_INSERT 218 +#define TMSG_PLAYLISTPLAYER_REMOVE 219 +#define TMSG_PLAYLISTPLAYER_SWAP 223 +#define TMSG_PLAYLISTPLAYER_REPEAT 224 +#define TMSG_UPDATE_CURRENT_ITEM 225 + +#define TMSG_PICTURE_SHOW 220 +#define TMSG_PICTURE_SLIDESHOW 221 + +#define TMSG_SHUTDOWN 300 +#define TMSG_POWERDOWN 301 +#define TMSG_QUIT 302 +#define TMSG_HIBERNATE 303 +#define TMSG_SUSPEND 304 +#define TMSG_RESTART 305 +#define TMSG_RESET 306 +#define TMSG_RESTARTAPP 307 +#define TMSG_SWITCHTOFULLSCREEN 308 +#define TMSG_MINIMIZE 309 +#define TMSG_TOGGLEFULLSCREEN 310 +#define TMSG_SETLANGUAGE 311 +#define TMSG_RENDERER_FLUSH 312 +#define TMSG_INHIBITIDLESHUTDOWN 313 +#define TMSG_LOADPROFILE 314 +#define TMSG_ACTIVATESCREENSAVER 315 +#define TMSG_CECTOGGLESTATE 316 +#define TMSG_CECACTIVATESOURCE 317 +#define TMSG_CECSTANDBY 318 +#define TMSG_SETVIDEORESOLUTION 319 +#define TMSG_SETPVRMANAGERSTATE 320 +#define TMSG_VIDEORESIZE 321 + +#define TMSG_NETWORKMESSAGE 500 + +#define TMSG_GUI_DO_MODAL 600 +#define TMSG_GUI_SHOW 601 +#define TMSG_GUI_ACTIVATE_WINDOW 604 +#define TMSG_GUI_PYTHON_DIALOG 605 +#define TMSG_GUI_WINDOW_CLOSE 606 +#define TMSG_GUI_ACTION 607 +#define TMSG_GUI_INFOLABEL 608 +#define TMSG_GUI_INFOBOOL 609 +#define TMSG_GUI_ADDON_DIALOG 610 +#define TMSG_GUI_MESSAGE 611 +#define TMSG_START_ANDROID_ACTIVITY 612 + +#define TMSG_CALLBACK 800 + +#define TMSG_VOLUME_SHOW 900 + +#define TMSG_DISPLAY_SETUP 1000 +#define TMSG_DISPLAY_DESTROY 1001 + +typedef struct +{ + unsigned int dwMessage; + int param1; + int param2; + std::string strParam; + std::vector params; + std::shared_ptr waitEvent; + void* lpVoid; +} +ThreadMessage; + +class CDelayedMessage : public CThread +{ + public: + CDelayedMessage(ThreadMessage& msg, unsigned int delay); + virtual void Process(); + + private: + unsigned int m_delay; + ThreadMessage m_msg; +}; + +struct ThreadMessageCallback +{ + void (*callback)(void *userptr); + void *userptr; +}; + +class CApplicationMessenger; +namespace xbmcutil +{ + template class GlobalsSingleton; +} + +class CApplicationMessenger +{ +public: + /*! + \brief The only way through which the global instance of the CApplicationMessenger should be accessed. + \return the global instance. + */ + static CApplicationMessenger& Get(); + + void Cleanup(); + // if a message has to be send to the gui, use MSG_TYPE_WINDOW instead + void SendMessage(ThreadMessage& msg, bool wait = false); + void ProcessMessages(); // only call from main thread. + void ProcessWindowMessages(); + + + void MediaPlay(std::string filename); + void MediaPlay(const CFileItem &item, bool wait = true); + void MediaPlay(const CFileItemList &item, int song = 0, bool wait = true); + void MediaPlay(int playlistid, int song = -1); + void MediaStop(bool bWait = true, int playlistid = -1); + void MediaPause(); + void MediaUnPause(); + void MediaPauseIfPlaying(); + void MediaRestart(bool bWait); + + void PlayListPlayerPlay(); + void PlayListPlayerPlay(int iSong); + bool PlayListPlayerPlaySongId(int songId); + void PlayListPlayerNext(); + void PlayListPlayerPrevious(); + void PlayListPlayerAdd(int playlist, const CFileItem &item); + void PlayListPlayerAdd(int playlist, const CFileItemList &list); + void PlayListPlayerClear(int playlist); + void PlayListPlayerShuffle(int playlist, bool shuffle); + void PlayListPlayerGetItems(int playlist, CFileItemList &list); + void PlayListPlayerInsert(int playlist, const CFileItem &item, int position); + void PlayListPlayerInsert(int playlist, const CFileItemList &list, int position); + void PlayListPlayerRemove(int playlist, int position); + void PlayListPlayerSwap(int playlist, int indexItem1, int indexItem2); + void PlayListPlayerRepeat(int playlist, int repeatState); + + void PlayFile(const CFileItem &item, bool bRestart = false); // thread safe version of g_application.PlayFile() + void PictureShow(std::string filename); + void PictureSlideShow(std::string pathname, bool addTBN = false); + void SetGUILanguage(const std::string &strLanguage); + void Shutdown(); + void Powerdown(); + void Quit(); + void Hibernate(); + void Suspend(); + void Restart(); + void RestartApp(); + void Reset(); + void InhibitIdleShutdown(bool inhibit); + void ActivateScreensaver(); + void SwitchToFullscreen(); // + void Minimize(bool wait = false); + void ExecOS(const std::string &command, bool waitExit = false); + void UserEvent(int code); + //! \brief Set the tag for the currently playing song + void SetCurrentSongTag(const MUSIC_INFO::CMusicInfoTag& tag); + //! \brief Set the tag for the currently playing video + void SetCurrentVideoTag(const CVideoInfoTag& tag); + //! \brief Set the currently currently item + void SetCurrentItem(const CFileItem& item); + + void LoadProfile(unsigned int idx); + bool CECToggleState(); + void CECActivateSource(); + void CECStandby(); + + std::string GetResponse(); + int SetResponse(std::string response); + void ExecBuiltIn(const std::string &command, bool wait = false); + + void NetworkMessage(int dwMessage, int dwParam = 0); + + void DoModal(CGUIDialog *pDialog, int iWindowID, const std::string ¶m = ""); + void Show(CGUIDialog *pDialog); + void Close(CGUIWindow *window, bool forceClose, bool waitResult = true, int nextWindowID = 0, bool enableSound = true); + void ActivateWindow(int windowID, const std::vector ¶ms, bool swappingWindows, bool force = false); + void SendAction(const CAction &action, int windowID = WINDOW_INVALID, bool waitResult=true); + + //! \brief Send text to currently focused window / keyboard. + void SendText(const std::string &aTextString, bool closeKeyboard = false); + + /*! \brief Send a GUIMessage, optionally waiting before it's processed to return. + Should be used to send messages to the GUI from other threads. + \param msg the GUIMessage to send. + \param windowID optional window to send the message to (defaults to no specified window). + \param waitResult whether to wait for the result (defaults to false). + */ + void SendGUIMessage(const CGUIMessage &msg, int windowID = WINDOW_INVALID, bool waitResult=false); + + std::vector GetInfoLabels(const std::vector &properties); + std::vector GetInfoBooleans(const std::vector &properties); + + void ShowVolumeBar(bool up); + + /*! \brief Used to enable/disable PVR system without waiting. + \param onOff if true it becomes switched on otherwise off + */ + void SetPVRManagerState(bool onOff); + + bool SetupDisplay(); + bool DestroyDisplay(); + void StartAndroidActivity(const std::vector ¶ms); + + virtual ~CApplicationMessenger(); +private: + // private construction, and no assignements; use the provided singleton methods + friend class xbmcutil::GlobalsSingleton; + CApplicationMessenger(); + CApplicationMessenger(const CApplicationMessenger&); + CApplicationMessenger const& operator=(CApplicationMessenger const&); + void ProcessMessage(ThreadMessage *pMsg); + + std::queue m_vecMessages; + std::queue m_vecWindowMessages; + CCriticalSection m_critSection; + CCriticalSection m_critBuffer; + std::string bufferResponse; +}; + +XBMC_GLOBAL_REF(CApplicationMessenger,s_messenger); +#define s_messenger XBMC_GLOBAL_USE(CApplicationMessenger) + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/ApplicationPlayer.cpp kodi-15.2~git20151019.1039-final/xbmc/ApplicationPlayer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/ApplicationPlayer.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/ApplicationPlayer.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -86,7 +86,7 @@ if (!m_pPlayer) { m_eCurrentPlayer = newCore; - m_pPlayer.reset(CPlayerCoreFactory::GetInstance().CreatePlayer(newCore, callback)); + m_pPlayer.reset(CPlayerCoreFactory::Get().CreatePlayer(newCore, callback)); } } @@ -171,12 +171,6 @@ return PLAYLIST_NONE; } -bool CApplicationPlayer::HasRDS() const -{ - std::shared_ptr player = GetInternal(); - return (player && player->HasRDS()); -} - bool CApplicationPlayer::IsPaused() const { std::shared_ptr player = GetInternal(); @@ -204,11 +198,6 @@ return (IsPlaying() && HasVideo()); } -bool CApplicationPlayer::IsPlayingRDS() const -{ - return (IsPlaying() && HasRDS()); -} - void CApplicationPlayer::Pause() { std::shared_ptr player = GetInternal(); @@ -417,15 +406,6 @@ return NULL; } -std::string CApplicationPlayer::GetRadioText(unsigned int line) -{ - std::shared_ptr player = GetInternal(); - if (player) - return player->GetRadioText(line); - else - return ""; -} - int64_t CApplicationPlayer::GetTotalTime() const { std::shared_ptr player = GetInternal(); @@ -544,7 +524,7 @@ player->SetAudioStream(iStream); m_iAudioStream = iStream; m_audioStreamUpdate.Set(1000); - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioStream = iStream; + CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream = iStream; } } @@ -563,7 +543,7 @@ player->SetSubtitle(iStream); m_iSubtitleStream = iStream; m_subtitleStreamUpdate.Set(1000); - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleStream = iStream; + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream = iStream; } } @@ -573,8 +553,8 @@ if (player) { player->SetSubtitleVisible(bVisible); - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleOn = bVisible; - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleStream = player->GetSubtitle(); + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn = bVisible; + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream = player->GetSubtitle(); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/ApplicationPlayer.h kodi-15.2~git20151019.1039-final/xbmc/ApplicationPlayer.h --- kodi-16.1~git20160425.1001-final/xbmc/ApplicationPlayer.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/ApplicationPlayer.h 2015-10-19 08:39:15.000000000 +0000 @@ -112,7 +112,6 @@ void GetSubtitleStreamInfo(int index, SPlayerSubtitleStreamInfo &info); bool GetSubtitleVisible(); TextCacheStruct_t* GetTeletextCache(); - std::string GetRadioText(unsigned int line); int64_t GetTime() const; int64_t GetDisplayTime() const; int64_t GetTotalTime() const; @@ -121,7 +120,6 @@ bool HasAudio() const; bool HasMenu() const; bool HasVideo() const; - bool HasRDS() const; bool IsCaching() const; bool IsInMenu() const; bool IsPaused() const; @@ -130,7 +128,6 @@ bool IsPlaying() const; bool IsPlayingAudio() const; bool IsPlayingVideo() const; - bool IsPlayingRDS() const; bool IsRecording() const; void LoadPage(int p, int sp, unsigned char* buffer); bool OnAction(const CAction &action); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/AppParamParser.cpp kodi-15.2~git20151019.1039-final/xbmc/AppParamParser.cpp --- kodi-16.1~git20160425.1001-final/xbmc/AppParamParser.cpp 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/AppParamParser.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -19,12 +19,12 @@ */ #include "AppParamParser.h" +#include "GUIInfoManager.h" #include "PlayListPlayer.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "settings/AdvancedSettings.h" #include "utils/log.h" -#include "utils/SystemInfo.h" #include "utils/StringUtils.h" #include "input/InputManager.h" #ifdef TARGET_WINDOWS @@ -35,8 +35,6 @@ #endif #include -using namespace KODI::MESSAGING; - CAppParamParser::CAppParamParser() { m_testmode = false; @@ -57,13 +55,13 @@ { if ((argv[next][0] != '-') && (argv[next][0] == '/')) { - CInputManager::GetInstance().SetRemoteControlName(argv[next]); + CInputManager::Get().SetRemoteControlName(argv[next]); i++; } } } else if (strnicmp(argv[i], "-n", 2) == 0 || strnicmp(argv[i], "--nolirc", 8) == 0) - CInputManager::GetInstance().DisableRemoteControl(); + CInputManager::Get().DisableRemoteControl(); if (stricmp(argv[i], "-d") == 0) { @@ -82,23 +80,23 @@ void CAppParamParser::DisplayVersion() { - printf("%s Media Center %s\n", CSysInfo::GetVersion().c_str(), CSysInfo::GetAppName().c_str()); - printf("Copyright (C) 2005-2013 Team %s - http://kodi.tv\n", CSysInfo::GetAppName().c_str()); + printf("%s Media Center %s\n", g_infoManager.GetVersion().c_str(), g_infoManager.GetAppName().c_str()); + printf("Copyright (C) 2005-2013 Team %s - http://kodi.tv\n", g_infoManager.GetAppName().c_str()); exit(0); } void CAppParamParser::DisplayHelp() { - std::string lcAppName = CSysInfo::GetAppName(); + std::string lcAppName = g_infoManager.GetAppName(); StringUtils::ToLower(lcAppName); printf("Usage: %s [OPTION]... [FILE]...\n\n", lcAppName.c_str()); printf("Arguments:\n"); printf(" -d \t\tdelay seconds before starting\n"); - printf(" -fs\t\t\tRuns %s in full screen\n", CSysInfo::GetAppName().c_str()); - printf(" --standalone\t\t%s runs in a stand alone environment without a window \n", CSysInfo::GetAppName().c_str()); + printf(" -fs\t\t\tRuns %s in full screen\n", g_infoManager.GetAppName().c_str()); + printf(" --standalone\t\t%s runs in a stand alone environment without a window \n", g_infoManager.GetAppName().c_str()); printf("\t\t\tmanager and supporting applications. For example, that\n"); printf("\t\t\tenables network settings.\n"); - printf(" -p or --portable\t%s will look for configurations in install folder instead of ~/.%s\n", CSysInfo::GetAppName().c_str(), lcAppName.c_str()); + printf(" -p or --portable\t%s will look for configurations in install folder instead of ~/.%s\n", g_infoManager.GetAppName().c_str(), lcAppName.c_str()); printf(" --legacy-res\t\tEnables screen resolutions such as PAL, NTSC, etc.\n"); #ifdef HAS_LIRC printf(" -l or --lircdev\tLircDevice to use default is " LIRC_DEVICE " .\n"); @@ -157,5 +155,6 @@ g_playlistPlayer.SetCurrentPlaylist(0); } - CApplicationMessenger::GetInstance().PostMsg(TMSG_PLAYLISTPLAYER_PLAY, -1); + ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_PLAY, -1}; + CApplicationMessenger::Get().SendMessage(tMsg, false); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/Autorun.cpp kodi-15.2~git20151019.1039-final/xbmc/Autorun.cpp --- kodi-16.1~git20160425.1001-final/xbmc/Autorun.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/Autorun.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -21,10 +21,9 @@ #include "system.h" #ifdef HAS_DVD_DRIVE -#include "Autorun.h" - #include +#include "Autorun.h" #include "Application.h" #include "GUIPassword.h" #include "GUIUserMessages.h" @@ -33,8 +32,6 @@ #include "filesystem/Directory.h" #include "filesystem/DirectoryFactory.h" #include "filesystem/File.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" #include "profiles/ProfilesManager.h" #include "settings/Settings.h" #include "playlists/PlayList.h" @@ -42,11 +39,10 @@ #include "guilib/LocalizeStrings.h" #include "storage/MediaManager.h" #include "video/VideoDatabase.h" +#include "dialogs/GUIDialogYesNo.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "utils/log.h" -#include "utils/Variant.h" - #ifdef HAS_CDDA_RIPPER #include "cdrip/CDDARipper.h" #endif @@ -54,9 +50,6 @@ using namespace XFILE; using namespace PLAYLIST; using namespace MEDIA_DETECT; -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; CAutorun::CAutorun() { @@ -79,8 +72,8 @@ g_application.ResetScreenSaver(); g_application.WakeUpScreenSaverAndDPMS(); // turn off the screensaver if it's active #ifdef HAS_CDDA_RIPPER - if (CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOCDS_AUTOACTION) == AUTOCD_RIP && - pInfo->IsAudio(1) && !CProfilesManager::GetInstance().GetCurrentProfile().musicLocked()) + if (CSettings::Get().GetInt("audiocds.autoaction") == AUTOCD_RIP && + pInfo->IsAudio(1) && !CProfilesManager::Get().GetCurrentProfile().musicLocked()) { CCDDARipper::GetInstance().RipCD(); } @@ -91,7 +84,7 @@ bool CAutorun::PlayDisc(const std::string& path, bool bypassSettings, bool startFromBeginning) { - if ( !bypassSettings && CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOCDS_AUTOACTION) != AUTOCD_PLAY && !CSettings::GetInstance().GetBool(CSettings::SETTING_DVDS_AUTORUN)) + if ( !bypassSettings && CSettings::Get().GetInt("audiocds.autoaction") != AUTOCD_PLAY && !CSettings::Get().GetBool("dvds.autorun")) return false; int nSize = g_playlistPlayer.GetPlaylist( PLAYLIST_MUSIC ).size(); @@ -153,9 +146,9 @@ bool bAllowMusic = true; if (!g_passwordManager.IsMasterLockUnlocked(false)) { - bAllowVideo = !CProfilesManager::GetInstance().GetCurrentProfile().videoLocked(); -// bAllowPictures = !CProfilesManager::GetInstance().GetCurrentProfile().picturesLocked(); - bAllowMusic = !CProfilesManager::GetInstance().GetCurrentProfile().musicLocked(); + bAllowVideo = !CProfilesManager::Get().GetCurrentProfile().videoLocked(); +// bAllowPictures = !CProfilesManager::Get().GetCurrentProfile().picturesLocked(); + bAllowMusic = !CProfilesManager::Get().GetCurrentProfile().musicLocked(); } // is this a root folder we have to check the content to determine a disc type @@ -178,7 +171,7 @@ // Check if the current foldername indicates a DVD structure (name is "VIDEO_TS") if (StringUtils::EqualsNoCase(name, "VIDEO_TS") && bAllowVideo - && (bypassSettings || CSettings::GetInstance().GetBool(CSettings::SETTING_DVDS_AUTORUN))) + && (bypassSettings || CSettings::Get().GetBool("dvds.autorun"))) { std::string path = URIUtils::AddFileToFolder(pItem->GetPath(), "VIDEO_TS.IFO"); if(!CFile::Exists(path)) @@ -202,7 +195,7 @@ // A BR should also include an "AACS" folder for encryption, Sony-BRs can also include update folders for PS3 (PS3_UPDATE / PS3_VPRM). // ToDo: for the time beeing, the DVD autorun settings are used to determine if the BR should be started automatically. if (StringUtils::EqualsNoCase(name, "BDMV") && bAllowVideo - && (bypassSettings || CSettings::GetInstance().GetBool(CSettings::SETTING_DVDS_AUTORUN))) + && (bypassSettings || CSettings::Get().GetBool("dvds.autorun"))) { CFileItemPtr item(new CFileItem(URIUtils::AddFileToFolder(pItem->GetPath(), "index.bdmv"), false)); item->SetLabel(g_mediaManager.GetDiskLabel(strDrive)); @@ -243,7 +236,7 @@ // Standard Content HD DVD (few discs?) if (StringUtils::EqualsNoCase(name, "HVDVD_TS") && bAllowVideo - && (bypassSettings || CSettings::GetInstance().GetBool(CSettings::SETTING_DVDS_AUTORUN))) + && (bypassSettings || CSettings::Get().GetBool("dvds.autorun"))) { if (hddvdname == "") { @@ -277,8 +270,7 @@ ecount++; asize = asize + items[j]->m_dwSize; } - if (ecount > 0) - asize = asize / ecount; + asize = asize / ecount; // Put largest files in alphabetical order to top of new list. for (int j = 0; j < items.Size(); j++) if (items[j]->m_dwSize >= asize) @@ -304,7 +296,7 @@ item.m_lStartOffset = STARTOFFSET_RESUME; // get playername - std::string hddvdplayer = CPlayerCoreFactory::GetInstance().GetPlayerName(CPlayerCoreFactory::GetInstance().GetDefaultPlayer(item)); + std::string hddvdplayer = CPlayerCoreFactory::Get().GetPlayerName(CPlayerCoreFactory::Get().GetDefaultPlayer(item)); // Single *.xpl or *.ifo files require an external player to handle playback. // If no matching rule was found, DVDPlayer will be default player. @@ -336,7 +328,7 @@ // If a file format was extracted we are sure this is a VCD. Autoplay if settings indicate we should. if (!strExt.empty() && bAllowVideo - && (bypassSettings || CSettings::GetInstance().GetBool(CSettings::SETTING_DVDS_AUTORUN))) + && (bypassSettings || CSettings::Get().GetBool("dvds.autorun"))) { CFileItemList items; CDirectory::GetDirectory(pItem->GetPath(), items, strExt); @@ -365,12 +357,12 @@ } // check video first - if (!nAddedToPlaylist && !bPlaying && (bypassSettings || CSettings::GetInstance().GetBool(CSettings::SETTING_DVDS_AUTORUN))) + if (!nAddedToPlaylist && !bPlaying && (bypassSettings || CSettings::Get().GetBool("dvds.autorun"))) { // stack video files CFileItemList tempItems; tempItems.Append(vecItems); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_STACKVIDEOS)) + if (CSettings::Get().GetBool("myvideos.stackvideos")) tempItems.Stack(); CFileItemList itemlist; @@ -410,7 +402,7 @@ } } // then music - if (!bPlaying && (bypassSettings || CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOCDS_AUTOACTION) == AUTOCD_PLAY) && bAllowMusic) + if (!bPlaying && (bypassSettings || CSettings::Get().GetInt("audiocds.autoaction") == AUTOCD_PLAY) && bAllowMusic) { for (int i = 0; i < vecItems.Size(); i++) { @@ -497,9 +489,7 @@ bool CAutorun::PlayDiscAskResume(const std::string& path) { - return PlayDisc(path, true, !CanResumePlayDVD(path) || - HELPERS::ShowYesNoDialogText(CVariant{341}, CVariant{""}, CVariant{13404}, CVariant{12021}) == - DialogResponse::YES); + return PlayDisc(path, true, !CanResumePlayDVD(path) || CGUIDialogYesNo::ShowAndGetInput(341, "", "", "", 13404, 12021)); } bool CAutorun::CanResumePlayDVD(const std::string& path) @@ -518,10 +508,10 @@ void CAutorun::SettingOptionAudioCdActionsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) { - list.push_back(std::make_pair(g_localizeStrings.Get(16018), AUTOCD_NONE)); - list.push_back(std::make_pair(g_localizeStrings.Get(14098), AUTOCD_PLAY)); + list.push_back(make_pair(g_localizeStrings.Get(16018), AUTOCD_NONE)); + list.push_back(make_pair(g_localizeStrings.Get(14098), AUTOCD_PLAY)); #ifdef HAS_CDDA_RIPPER - list.push_back(std::make_pair(g_localizeStrings.Get(14096), AUTOCD_RIP)); + list.push_back(make_pair(g_localizeStrings.Get(14096), AUTOCD_RIP)); #endif } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/Autorun.h kodi-15.2~git20151019.1039-final/xbmc/Autorun.h --- kodi-16.1~git20160425.1001-final/xbmc/Autorun.h 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/Autorun.h 2015-10-19 08:39:15.000000000 +0000 @@ -33,7 +33,6 @@ #ifdef HAS_DVD_DRIVE #include -#include #include namespace XFILE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/AutoSwitch.cpp kodi-15.2~git20151019.1039-final/xbmc/AutoSwitch.cpp --- kodi-16.1~git20160425.1001-final/xbmc/AutoSwitch.cpp 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/AutoSwitch.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -44,7 +44,7 @@ int iSortMethod = -1; int iPercent = 0; int iCurrentWindow = g_windowManager.GetActiveWindow(); - bool bHideParentFolderItems = !CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS); + bool bHideParentFolderItems = !CSettings::Get().GetBool("filelists.showparentdiritems"); switch (iCurrentWindow) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/BackgroundInfoLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/BackgroundInfoLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/BackgroundInfoLoader.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/BackgroundInfoLoader.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -22,7 +22,8 @@ #include "FileItem.h" #include "threads/SingleLock.h" #include "utils/log.h" -#include "URL.h" + +using namespace std; CBackgroundInfoLoader::CBackgroundInfoLoader() : m_thread (NULL) { @@ -47,7 +48,7 @@ OnLoaderStart(); // Stage 1: All "fast" stuff we have already cached - for (std::vector::const_iterator iter = m_vecItems.begin(); iter != m_vecItems.end(); ++iter) + for (vector::const_iterator iter = m_vecItems.begin(); iter != m_vecItems.end(); ++iter) { CFileItemPtr pItem = *iter; @@ -62,12 +63,12 @@ } catch (...) { - CLog::Log(LOGERROR, "CBackgroundInfoLoader::LoadItemCached - Unhandled exception for item %s", CURL::GetRedacted(pItem->GetPath()).c_str()); + CLog::Log(LOGERROR, "CBackgroundInfoLoader::LoadItemCached - Unhandled exception for item %s", pItem->GetPath().c_str()); } } // Stage 2: All "slow" stuff that we need to lookup - for (std::vector::const_iterator iter = m_vecItems.begin(); iter != m_vecItems.end(); ++iter) + for (vector::const_iterator iter = m_vecItems.begin(); iter != m_vecItems.end(); ++iter) { CFileItemPtr pItem = *iter; @@ -82,7 +83,7 @@ } catch (...) { - CLog::Log(LOGERROR, "CBackgroundInfoLoader::LoadItemLookup - Unhandled exception for item %s", CURL::GetRedacted(pItem->GetPath()).c_str()); + CLog::Log(LOGERROR, "CBackgroundInfoLoader::LoadItemLookup - Unhandled exception for item %s", pItem->GetPath().c_str()); } } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cdrip/CDDARipJob.cpp kodi-15.2~git20151019.1039-final/xbmc/cdrip/CDDARipJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cdrip/CDDARipJob.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cdrip/CDDARipJob.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -90,7 +90,7 @@ int iTrack = atoi(m_input.substr(13, m_input.size() - 13 - 5).c_str()); std::string strLine0 = StringUtils::Format("%02i. %s - %s", iTrack, - m_tag.GetArtistString().c_str(), + StringUtils::Join(m_tag.GetArtist(), g_advancedSettings.m_musicItemSeparator).c_str(), m_tag.GetTitle().c_str()); handle->SetText(strLine0); @@ -180,8 +180,8 @@ CEncoder* CCDDARipJob::SetupEncoder(CFile& reader) { CEncoder* encoder = NULL; - if (CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_ENCODER) == "audioencoder.xbmc.builtin.aac" || - CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_ENCODER) == "audioencoder.xbmc.builtin.wma") + if (CSettings::Get().GetString("audiocds.encoder") == "audioencoder.xbmc.builtin.aac" || + CSettings::Get().GetString("audiocds.encoder") == "audioencoder.xbmc.builtin.wma") { std::shared_ptr enc(new CEncoderFFmpeg()); encoder = new CEncoder(enc); @@ -189,7 +189,7 @@ else { AddonPtr addon; - CAddonMgr::GetInstance().GetAddon(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_ENCODER), addon); + CAddonMgr::Get().GetAddon(CSettings::Get().GetString("audiocds.encoder"), addon); if (addon) { std::shared_ptr aud = std::static_pointer_cast(addon); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cdrip/CDDARipper.cpp kodi-15.2~git20151019.1039-final/xbmc/cdrip/CDDARipper.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cdrip/CDDARipper.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cdrip/CDDARipper.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -40,13 +40,13 @@ #include "storage/MediaManager.h" #include "utils/log.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "settings/MediaSourceSettings.h" #include "Application.h" #include "music/MusicDatabase.h" #include "addons/AddonManager.h" #include "addons/AudioEncoder.h" +using namespace std; using namespace ADDON; using namespace XFILE; using namespace MUSIC_INFO; @@ -87,7 +87,7 @@ AddJob(new CCDDARipJob(pItem->GetPath(),strFile, *pItem->GetMusicInfoTag(), - CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOCDS_ENCODER))); + CSettings::Get().GetInt("audiocds.encoder"))); return true; } @@ -112,7 +112,7 @@ { CFileItemPtr pItem = vecItems[i]; CMusicInfoTagLoaderFactory factory; - std::unique_ptr pLoader (factory.CreateLoader(*pItem)); + unique_ptr pLoader (factory.CreateLoader(*pItem)); if (NULL != pLoader.get()) { pLoader->Load(pItem->GetPath(), *pItem->GetMusicInfoTag()); // get tag from file @@ -139,11 +139,11 @@ if (item->GetPath().find(".cdda") == std::string::npos) continue; - bool eject = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOCDS_EJECTONRIP) && + bool eject = CSettings::Get().GetBool("audiocds.ejectonrip") && i == vecItems.Size()-1; AddJob(new CCDDARipJob(item->GetPath(),strFile, *item->GetMusicInfoTag(), - CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOCDS_ENCODER), eject)); + CSettings::Get().GetInt("audiocds.encoder"), eject)); } return true; @@ -151,7 +151,7 @@ bool CCDDARipper::CreateAlbumDir(const MUSIC_INFO::CMusicInfoTag& infoTag, std::string& strDirectory, int& legalType) { - CSettingPath *recordingpathSetting = (CSettingPath*)CSettings::GetInstance().GetSetting(CSettings::SETTING_AUDIOCDS_RECORDINGPATH); + CSettingPath *recordingpathSetting = (CSettingPath*)CSettings::Get().GetSetting("audiocds.recordingpath"); if (recordingpathSetting != NULL) { strDirectory = recordingpathSetting->GetValue(); @@ -168,7 +168,7 @@ // no rip path has been set, show error CLog::Log(LOGERROR, "Error: CDDARipPath has not been set"); g_graphicsContext.Lock(); - CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{608}); + CGUIDialogOK::ShowAndGetInput(257, 608); g_graphicsContext.Unlock(); return false; } @@ -209,7 +209,7 @@ // use audiocds.trackpathformat setting to format // directory name where CD tracks will be stored, // use only format part ending at the last '/' - strAlbumDir = CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_TRACKPATHFORMAT); + strAlbumDir = CSettings::Get().GetString("audiocds.trackpathformat"); size_t pos = strAlbumDir.find_last_of("/\\"); if (pos == std::string::npos) return ""; // no directory @@ -219,9 +219,9 @@ // replace %A with album artist name if (strAlbumDir.find("%A") != std::string::npos) { - std::string strAlbumArtist = infoTag.GetAlbumArtistString(); + std::string strAlbumArtist = StringUtils::Join(infoTag.GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator); if (strAlbumArtist.empty()) - strAlbumArtist = infoTag.GetArtistString(); + strAlbumArtist = StringUtils::Join(infoTag.GetArtist(), g_advancedSettings.m_musicItemSeparator); if (strAlbumArtist.empty()) strAlbumArtist = "Unknown Artist"; else @@ -276,7 +276,7 @@ // get track file name format from audiocds.trackpathformat setting, // use only format part starting from the last '/' - std::string strFormat = CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_TRACKPATHFORMAT); + std::string strFormat = CSettings::Get().GetString("audiocds.trackpathformat"); size_t pos = strFormat.find_last_of("/\\"); if (pos != std::string::npos) strFormat.erase(0, pos+1); @@ -290,7 +290,7 @@ track = StringUtils::Format("%s%02i", "Track-", trackNumber); AddonPtr addon; - CAddonMgr::GetInstance().GetAddon(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_ENCODER), addon); + CAddonMgr::Get().GetAddon(CSettings::Get().GetString("audiocds.encoder"), addon); if (addon) { std::shared_ptr enc = std::static_pointer_cast(addon); @@ -308,7 +308,7 @@ { std::string dir = URIUtils::GetDirectory(((CCDDARipJob*)job)->GetOutput()); bool unimportant; - int source = CUtil::GetMatchingSource(dir, *CMediaSourceSettings::GetInstance().CMediaSourceSettings::GetSources("music"), unimportant); + int source = CUtil::GetMatchingSource(dir, *CMediaSourceSettings::Get().CMediaSourceSettings::GetSources("music"), unimportant); CMusicDatabase database; database.Open(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cdrip/EncoderFFmpeg.cpp kodi-15.2~git20151019.1039-final/xbmc/cdrip/EncoderFFmpeg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cdrip/EncoderFFmpeg.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cdrip/EncoderFFmpeg.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -88,7 +88,7 @@ } AddonPtr addon; - CAddonMgr::GetInstance().GetAddon(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_ENCODER), addon); + CAddonMgr::Get().GetAddon(CSettings::Get().GetString("audiocds.encoder"), addon); if (addon) { m_Format->bit_rate = (128+32*strtol(addon->GetSetting("bitrate").c_str(), NULL, 10))*1000; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/commons/typeindex.h kodi-15.2~git20151019.1039-final/xbmc/commons/typeindex.h --- kodi-16.1~git20160425.1001-final/xbmc/commons/typeindex.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/commons/typeindex.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include + +/** + * This struct represents a pre-introduction of the std::type_index for RTTI + * which is only availalbe in C++11. + */ + +namespace XbmcCommons +{ + /** + @brief The class type_index provides a simple wrapper for type_info + which can be used as an index type in associative containers (23.6) + and in unordered associative containers (23.7). + */ + struct type_index + { + inline type_index(const std::type_info& __rhs) + : _M_target(&__rhs) { } + + inline bool + operator==(const type_index& __rhs) const + { return *_M_target == *__rhs._M_target; } + + inline bool + operator!=(const type_index& __rhs) const + { return *_M_target != *__rhs._M_target; } + + inline bool + operator<(const type_index& __rhs) const + { return _M_target->before(*__rhs._M_target) != 0; } + + inline bool + operator<=(const type_index& __rhs) const + { return !__rhs._M_target->before(*_M_target); } + + inline bool + operator>(const type_index& __rhs) const + { return __rhs._M_target->before(*_M_target) != 0; } + + inline bool + operator>=(const type_index& __rhs) const + { return !_M_target->before(*__rhs._M_target); } + + inline const char* + name() const + { return _M_target->name(); } + + private: + const std::type_info* _M_target; + }; + + template struct hash; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/ContextMenuItem.cpp kodi-15.2~git20151019.1039-final/xbmc/ContextMenuItem.cpp --- kodi-16.1~git20160425.1001-final/xbmc/ContextMenuItem.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/ContextMenuItem.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "ContextMenuItem.h" -#include "addons/Addon.h" -#include "addons/AddonManager.h" -#include "addons/ContextMenuAddon.h" -#include "addons/IAddon.h" -#include "interfaces/generic/ScriptInvocationManager.h" -#include "interfaces/python/ContextItemAddonInvoker.h" -#include "interfaces/python/XBPython.h" -#include "utils/StringUtils.h" -#include - - -std::string CContextMenuItem::GetLabel() const -{ - if (!m_addon) - return ""; - - if (StringUtils::IsNaturalNumber(m_label)) - return m_addon->GetString(boost::lexical_cast(m_label.c_str())); - - return m_label; -} - -bool CContextMenuItem::IsVisible(const CFileItemPtr& item) const -{ - return IsGroup() || (item && m_condition && m_condition->Get(item.get())); -} - -bool CContextMenuItem::IsParentOf(const CContextMenuItem& other) const -{ - return !m_groupId.empty() && (m_groupId == other.m_parent); -} - -bool CContextMenuItem::IsGroup() const -{ - return !m_groupId.empty(); -} - -bool CContextMenuItem::Execute(const CFileItemPtr& item) const -{ - if (!item || !m_addon || m_library.empty() || IsGroup()) - return false; - - LanguageInvokerPtr invoker(new CContextItemAddonInvoker(&g_pythonParser, item)); - return (CScriptInvocationManager::GetInstance().ExecuteAsync(m_library, invoker, m_addon) != -1); -} - -bool CContextMenuItem::operator==(const CContextMenuItem& other) const -{ - if (IsGroup() && other.IsGroup()) - return (m_groupId == other.m_groupId && m_parent == other.m_parent); - - return (IsGroup() == other.IsGroup()) - && (m_parent == other.m_parent) - && (m_library == other.m_library) - && ((!m_addon && !other.m_addon) || (m_addon && other.m_addon && m_addon->ID() == other.m_addon->ID())); -} - -std::string CContextMenuItem::ToString() const -{ - if (IsGroup()) - return StringUtils::Format("CContextMenuItem[group, id=%s, parent=%s, addon=%s]", - m_groupId.c_str(), m_parent.c_str(), m_addon ? m_addon->ID().c_str() : "null"); - else - return StringUtils::Format("CContextMenuItem[item, parent=%s, library=%s, addon=%s]", - m_parent.c_str(), m_library.c_str(), m_addon ? m_addon->ID().c_str() : "null"); -} - -CContextMenuItem CContextMenuItem::CreateGroup(const std::string& label, const std::string& parent, const std::string& groupId) -{ - CContextMenuItem menuItem; - menuItem.m_label = label; - menuItem.m_parent = parent; - menuItem.m_groupId = groupId; - return menuItem; -} - -CContextMenuItem CContextMenuItem::CreateItem(const std::string& label, const std::string& parent, const std::string& library, const INFO::InfoPtr& condition) -{ - CContextMenuItem menuItem; - menuItem.m_label = label; - menuItem.m_parent = parent; - menuItem.m_library = library; - menuItem.m_condition = condition; - return menuItem; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/ContextMenuItem.h kodi-15.2~git20151019.1039-final/xbmc/ContextMenuItem.h --- kodi-16.1~git20160425.1001-final/xbmc/ContextMenuItem.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/ContextMenuItem.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include "addons/ContextMenuAddon.h" -#include "addons/IAddon.h" -#include "dialogs/GUIDialogContextMenu.h" - -namespace ADDON -{ - class CContextMenuAddon; -} - -class CContextMenuItem -{ -public: - std::string GetLabel() const; - bool IsVisible(const CFileItemPtr& item) const; - bool IsParentOf(const CContextMenuItem& menuItem) const; - bool IsGroup() const; - bool Execute(const CFileItemPtr& item) const; - bool operator==(const CContextMenuItem& other) const; - std::string ToString() const; - - static CContextMenuItem CreateGroup( - const std::string& label, - const std::string& parent, - const std::string& groupId); - - static CContextMenuItem CreateItem( - const std::string& label, - const std::string& parent, - const std::string& library, - const INFO::InfoPtr& condition); - - friend class ADDON::CContextMenuAddon; - -private: - std::string m_label; - std::string m_parent; - std::string m_groupId; - std::string m_library; - INFO::InfoPtr m_condition; - ADDON::AddonPtr m_addon; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/ContextMenuManager.cpp kodi-15.2~git20151019.1039-final/xbmc/ContextMenuManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/ContextMenuManager.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/ContextMenuManager.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -19,31 +19,26 @@ */ #include "ContextMenuManager.h" -#include "ContextMenuItem.h" #include "addons/Addon.h" #include "addons/AddonManager.h" -#include "addons/ContextMenuAddon.h" +#include "addons/ContextItemAddon.h" #include "addons/IAddon.h" #include "interfaces/generic/ScriptInvocationManager.h" #include "interfaces/python/ContextItemAddonInvoker.h" #include "interfaces/python/XBPython.h" -#include "utils/log.h" using namespace ADDON; -typedef std::pair Item; - -const CContextMenuItem CContextMenuManager::MAIN = CContextMenuItem::CreateGroup("", "", "kodi.core.main"); -const CContextMenuItem CContextMenuManager::MANAGE = CContextMenuItem::CreateGroup("", "", "kodi.core.manage"); +typedef std::map::value_type ValueType; CContextMenuManager::CContextMenuManager() - : m_nextButtonId(CONTEXT_BUTTON_FIRST_ADDON) + : m_iCurrentContextId(CONTEXT_BUTTON_FIRST_ADDON) { Init(); } -CContextMenuManager& CContextMenuManager::GetInstance() +CContextMenuManager& CContextMenuManager::Get() { static CContextMenuManager mgr; return mgr; @@ -51,32 +46,20 @@ void CContextMenuManager::Init() { + //Make sure we load all context items on first usage... VECADDONS addons; - if (CAddonMgr::GetInstance().GetAddons(ADDON_CONTEXT_ITEM, addons)) + if (CAddonMgr::Get().GetAddons(ADDON_CONTEXT_ITEM, addons)) + { for (const auto& addon : addons) - Register(std::static_pointer_cast(addon)); + Register(std::static_pointer_cast(addon)); + } } void CContextMenuManager::Register(const ContextItemAddonPtr& cm) { if (!cm) return; - - for (const auto& menuItem : cm->GetItems()) - { - auto existing = std::find_if(m_items.begin(), m_items.end(), - [&](const Item& kv){ return kv.second == menuItem; }); - if (existing != m_items.end()) - { - if (!menuItem.GetLabel().empty()) - existing->second = menuItem; - } - else - { - m_items.push_back(std::make_pair(m_nextButtonId, menuItem)); - ++m_nextButtonId; - } - } + m_contextAddons[m_iCurrentContextId++] = cm; } bool CContextMenuManager::Unregister(const ContextItemAddonPtr& cm) @@ -84,88 +67,47 @@ if (!cm) return false; - const auto menuItems = cm->GetItems(); + auto it = std::find_if(m_contextAddons.begin(), m_contextAddons.end(), + [&](const ValueType& value){ return value.second->ID() == cm->ID(); }); - auto it = std::remove_if(m_items.begin(), m_items.end(), - [&](const Item& kv) - { - if (kv.second.IsGroup()) - return false; //keep in case other items use them - return std::find(menuItems.begin(), menuItems.end(), kv.second) != menuItems.end(); - } - ); - m_items.erase(it, m_items.end()); - return true; + if (it != m_contextAddons.end()) + { + m_contextAddons.erase(it); + return true; + } + return false; } -bool CContextMenuManager::IsVisible( - const CContextMenuItem& menuItem, const CContextMenuItem& root, const CFileItemPtr& fileItem) +ContextItemAddonPtr CContextMenuManager::GetContextItemByID(unsigned int id) { - if (menuItem.GetLabel().empty() || !root.IsParentOf(menuItem)) - return false; - - if (menuItem.IsGroup()) - return std::any_of(m_items.begin(), m_items.end(), - [&](const Item& kv){ return menuItem.IsParentOf(kv.second) && kv.second.IsVisible(fileItem); }); - - return menuItem.IsVisible(fileItem); + auto it = m_contextAddons.find(id); + if (it != m_contextAddons.end()) + return it->second; + return ContextItemAddonPtr(); } -void CContextMenuManager::AddVisibleItems( - const CFileItemPtr& item, CContextButtons& list, const CContextMenuItem& root /* = CContextMenuItem::MAIN */) +void CContextMenuManager::AddVisibleItems(const CFileItemPtr& item, CContextButtons& list, const std::string& parent /* = "" */) { if (!item) return; - const int initialSize = list.size(); - - for (const auto& kv : m_items) - if (IsVisible(kv.second, root, item)) - list.push_back(std::make_pair(kv.first, kv.second.GetLabel())); - - if (root == MAIN || root == MANAGE) + for (const auto& kv : m_contextAddons) { - std::stable_sort(list.begin() + initialSize, list.end(), - [](const std::pair& lhs, const std::pair& rhs) - { - return lhs.second < rhs.second; - } - ); + if (kv.second->GetParent() == parent && kv.second->IsVisible(item)) + list.push_back(std::make_pair(kv.first, kv.second->GetLabel())); } } - -bool CContextMenuManager::OnClick(unsigned int id, const CFileItemPtr& item) +bool CContextMenuManager::Execute(unsigned int id, const CFileItemPtr& item) { if (!item) return false; - auto it = std::find_if(m_items.begin(), m_items.end(), - [id](const Item& kv){ return kv.first == id; }); - if (it == m_items.end()) - { - CLog::Log(LOGERROR, "CContextMenuManager: unknown button id '%u'", id); + const ContextItemAddonPtr addon = GetContextItemByID(id); + if (!addon || !addon->IsVisible(item)) return false; - } - - CContextMenuItem menuItem = it->second; - if (menuItem.IsGroup()) - { - CLog::Log(LOGDEBUG, "CContextMenuManager: showing group '%s'", menuItem.ToString().c_str()); - CContextButtons choices; - AddVisibleItems(item, choices, menuItem); - if (choices.empty()) - { - CLog::Log(LOGERROR, "CContextMenuManager: no items in group '%s'", menuItem.ToString().c_str()); - return false; - } - int choice = CGUIDialogContextMenu::ShowAndGetChoice(choices); - if (choice == -1) - return false; - - return OnClick(choice, item); - } - return menuItem.Execute(item); + LanguageInvokerPtr invoker(new CContextItemAddonInvoker(&g_pythonParser, item)); + return (CScriptInvocationManager::Get().ExecuteAsync(addon->LibPath(), invoker, addon) != -1); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/ContextMenuManager.h kodi-15.2~git20151019.1039-final/xbmc/ContextMenuManager.h --- kodi-16.1~git20160425.1001-final/xbmc/ContextMenuManager.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/ContextMenuManager.h 2015-10-19 08:39:15.000000000 +0000 @@ -19,39 +19,33 @@ * */ -#include -#include - -#include "addons/ContextMenuAddon.h" -#include "ContextMenuItem.h" +#include +#include "addons/ContextItemAddon.h" #include "dialogs/GUIDialogContextMenu.h" +#define CONTEXT_MENU_GROUP_MANAGE "kodi.core.manage" class CContextMenuManager { public: - static const CContextMenuItem MAIN; - static const CContextMenuItem MANAGE; - - static CContextMenuManager& GetInstance(); + static CContextMenuManager& Get(); /*! - * \param id - id of the context button clicked on. - * \param item - the selected file item. - * \return true on success, otherwise false. + * \brief Executes a context menu item. + * \param id - id of the context button to execute. + * \param item - the currently selected item. + * \return true if executed successfully, false otherwise */ - bool OnClick(unsigned int id, const CFileItemPtr& item); + bool Execute(unsigned int id, const CFileItemPtr& item); /*! * \brief Adds all registered context item to the list. * \param item - the currently selected item. * \param list - the context menu. - * \param root - the context menu responsible for this call. + * \param parent - the ID of the context menu. Empty string if the root menu. + * CONTEXT_MENU_GROUP_MANAGE if the 'manage' submenu. */ - void AddVisibleItems( - const CFileItemPtr& item, - CContextButtons& list, - const CContextMenuItem& root = MAIN); + void AddVisibleItems(const CFileItemPtr& item, CContextButtons& list, const std::string& parent = ""); /*! * \brief Adds a context item to this manager. @@ -71,11 +65,14 @@ virtual ~CContextMenuManager() {} void Init(); - bool IsVisible( - const CContextMenuItem& menuItem, - const CContextMenuItem& root, - const CFileItemPtr& fileItem); - std::vector> m_items; - unsigned int m_nextButtonId; + /*! + * \brief Get a context menu item by its assigned id. + * \param id - the button id of the context item. + * \return the addon or NULL if no item with given id is registered. + */ + ADDON::ContextItemAddonPtr GetContextItemByID(const unsigned int id); + + std::map m_contextAddons; + unsigned int m_iCurrentContextId; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/AEFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/AEFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/AEFactory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/AEFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -171,23 +171,23 @@ bool CAEFactory::SupportsRaw(AEDataFormat format, int samplerate) { // check if passthrough is enabled - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH)) + if (!CSettings::Get().GetBool("audiooutput.passthrough")) return false; // fixed config disabled passthrough - if (CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CONFIG) == AE_CONFIG_FIXED) + if (CSettings::Get().GetInt("audiooutput.config") == AE_CONFIG_FIXED) return false; // check if the format is enabled in settings - if (format == AE_FMT_AC3 && !CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_AC3PASSTHROUGH)) + if (format == AE_FMT_AC3 && !CSettings::Get().GetBool("audiooutput.ac3passthrough")) return false; - if (format == AE_FMT_DTS && !CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DTSPASSTHROUGH)) + if (format == AE_FMT_DTS && !CSettings::Get().GetBool("audiooutput.dtspassthrough")) return false; - if (format == AE_FMT_EAC3 && !CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_EAC3PASSTHROUGH)) + if (format == AE_FMT_EAC3 && !CSettings::Get().GetBool("audiooutput.eac3passthrough")) return false; - if (format == AE_FMT_TRUEHD && !CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_TRUEHDPASSTHROUGH)) + if (format == AE_FMT_TRUEHD && !CSettings::Get().GetBool("audiooutput.truehdpassthrough")) return false; - if (format == AE_FMT_DTSHD && !CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DTSHDPASSTHROUGH)) + if (format == AE_FMT_DTSHD && !CSettings::Get().GetBool("audiooutput.dtshdpassthrough")) return false; if(AE) @@ -378,7 +378,7 @@ AE->UnregisterAudioCallback(); } -bool CAEFactory::IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool CAEFactory::IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting) { if (setting == NULL || value.empty() || !AE) return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/AEFactory.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/AEFactory.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/AEFactory.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/AEFactory.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,7 +19,6 @@ * */ -#include #include #include "Interfaces/AE.h" @@ -68,7 +67,7 @@ static void SettingOptionsAudioDevicesPassthroughFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); static void SettingOptionsAudioQualityLevelsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); static void SettingOptionsAudioStreamsilenceFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - static bool IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting, void *data); + static bool IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting); static void KeepConfiguration(unsigned int millis); static void DeviceChange(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/AEResampleFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/AEResampleFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/AEResampleFactory.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/AEResampleFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -31,7 +31,7 @@ IAEResample *CAEResampleFactory::Create(uint32_t flags /* = 0 */) { #if defined(TARGET_RASPBERRY_PI) - if (!(flags & AERESAMPLEFACTORY_QUICK_RESAMPLE) && CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_PROCESSQUALITY) == AE_QUALITY_GPU) + if (!(flags & AERESAMPLEFACTORY_QUICK_RESAMPLE) && CSettings::Get().GetInt("audiooutput.processquality") == AE_QUALITY_GPU) return new CActiveAEResamplePi(); #endif return new CActiveAEResampleFFMPEG(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPAddon.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPAddon.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPAddon.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPAddon.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,898 +0,0 @@ -/* - * Copyright (C) 2010-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include -#include "Application.h" -#include "ActiveAEDSPAddon.h" -#include "ActiveAEDSP.h" -#include "commons/Exception.h" -#include "settings/AdvancedSettings.h" -#include "settings/Settings.h" -#include "utils/log.h" -#include "utils/StringUtils.h" - -using namespace ADDON; -using namespace ActiveAE; - -#define DEFAULT_INFO_STRING_VALUE "unknown" - -CActiveAEDSPAddon::CActiveAEDSPAddon(const AddonProps& props) : - CAddonDll(props), - m_apiVersion("0.0.0") -{ - ResetProperties(); -} - -CActiveAEDSPAddon::CActiveAEDSPAddon(const cp_extension_t *ext) : - CAddonDll(ext), - m_apiVersion("0.0.0") -{ - ResetProperties(); -} - -CActiveAEDSPAddon::~CActiveAEDSPAddon(void) -{ - Destroy(); - SAFE_DELETE(m_pInfo); -} - -void CActiveAEDSPAddon::OnDisabled() -{ - // restart the ADSP manager if we're disabling a client - if (CActiveAEDSP::GetInstance().IsActivated()) - CActiveAEDSP::GetInstance().Activate(true); -} - -void CActiveAEDSPAddon::OnEnabled() -{ - // restart the ADSP manager if we're enabling a client - CActiveAEDSP::GetInstance().Activate(true); -} - -AddonPtr CActiveAEDSPAddon::GetRunningInstance() const -{ - if (CActiveAEDSP::GetInstance().IsActivated()) - { - AddonPtr adspAddon; - if (CActiveAEDSP::GetInstance().GetAudioDSPAddon(ID(), adspAddon)) - return adspAddon; - } - return CAddon::GetRunningInstance(); -} - -void CActiveAEDSPAddon::OnPreInstall() -{ - // stop the ADSP manager, so running ADSP add-ons are stopped and closed - CActiveAEDSP::GetInstance().Deactivate(); -} - -void CActiveAEDSPAddon::OnPostInstall(bool restart, bool update) -{ - // (re)start the ADSP manager - CActiveAEDSP::GetInstance().Activate(true); -} - -void CActiveAEDSPAddon::OnPreUnInstall() -{ - // stop the ADSP manager, so running ADSP add-ons are stopped and closed - CActiveAEDSP::GetInstance().Deactivate(); -} - -void CActiveAEDSPAddon::OnPostUnInstall() -{ - if (CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED)) - CActiveAEDSP::GetInstance().Activate(true); -} - -bool CActiveAEDSPAddon::CanInstall() -{ - if (!CActiveAEDSP::GetInstance().InstallAddonAllowed(ID())) - { - CActiveAEDSP::GetInstance().MarkAsOutdated(ID()); - return false; - } - return CAddon::CanInstall(); -} - -void CActiveAEDSPAddon::ResetProperties(int iClientId /* = AE_DSP_INVALID_ADDON_ID */) -{ - /* initialise members */ - SAFE_DELETE(m_pInfo); - m_pInfo = new AE_DSP_PROPERTIES; - m_strUserPath = CSpecialProtocol::TranslatePath(Profile()); - m_pInfo->strUserPath = m_strUserPath.c_str(); - m_strAddonPath = CSpecialProtocol::TranslatePath(Path()); - m_pInfo->strAddonPath = m_strAddonPath.c_str(); - m_menuhooks.clear(); - m_bReadyToUse = false; - m_isInUse = false; - m_iClientId = iClientId; - m_strAudioDSPVersion = DEFAULT_INFO_STRING_VALUE; - m_strFriendlyName = DEFAULT_INFO_STRING_VALUE; - m_strAudioDSPName = DEFAULT_INFO_STRING_VALUE; - m_isPreProcessing = false; - m_isPreResampling = false; - m_isMasterProcessing = false; - m_isPostResampling = false; - m_isPostProcessing = false; - memset(&m_addonCapabilities, 0, sizeof(m_addonCapabilities)); - m_apiVersion = AddonVersion("0.0.0"); -} - -ADDON_STATUS CActiveAEDSPAddon::Create(int iClientId) -{ - ADDON_STATUS status(ADDON_STATUS_UNKNOWN); - if (iClientId <= AE_DSP_INVALID_ADDON_ID) - return status; - - /* ensure that a previous instance is destroyed */ - Destroy(); - - /* reset all properties to defaults */ - ResetProperties(iClientId); - - /* initialise the add-on */ - bool bReadyToUse(false); - CLog::Log(LOGDEBUG, "ActiveAE DSP - %s - creating audio dsp add-on instance '%s'", __FUNCTION__, Name().c_str()); - try - { - if ((status = CAddonDll::Create()) == ADDON_STATUS_OK) - bReadyToUse = GetAddonProperties(); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - m_bReadyToUse = bReadyToUse; - - return status; -} - -bool CActiveAEDSPAddon::DllLoaded(void) const -{ - try - { - return CAddonDll::DllLoaded(); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - } - - return false; -} - -void CActiveAEDSPAddon::Destroy(void) -{ - /* reset 'ready to use' to false */ - if (!m_bReadyToUse) - return; - m_bReadyToUse = false; - - CLog::Log(LOGDEBUG, "ActiveAE DSP - %s - destroying audio dsp add-on '%s'", __FUNCTION__, GetFriendlyName().c_str()); - - /* destroy the add-on */ - try - { - CAddonDll::Destroy(); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - /* reset all properties to defaults */ - ResetProperties(); -} - -void CActiveAEDSPAddon::ReCreate(void) -{ - int iClientID(m_iClientId); - Destroy(); - - /* recreate the instance */ - Create(iClientID); -} - -bool CActiveAEDSPAddon::ReadyToUse(void) const -{ - return m_bReadyToUse; -} - -int CActiveAEDSPAddon::GetID(void) const -{ - return m_iClientId; -} - -bool CActiveAEDSPAddon::IsInUse() const -{ - return m_isInUse; -}; - -bool CActiveAEDSPAddon::IsCompatibleAPIVersion(const ADDON::AddonVersion &minVersion, const ADDON::AddonVersion &version) -{ - AddonVersion myMinVersion = AddonVersion(KODI_AE_DSP_MIN_API_VERSION); - AddonVersion myVersion = AddonVersion(KODI_AE_DSP_API_VERSION); - return (version >= myMinVersion && minVersion <= myVersion); -} - -bool CActiveAEDSPAddon::IsCompatibleGUIAPIVersion(const ADDON::AddonVersion &minVersion, const ADDON::AddonVersion &version) -{ - AddonVersion myMinVersion = AddonVersion(KODI_GUILIB_MIN_API_VERSION); - AddonVersion myVersion = AddonVersion(KODI_GUILIB_API_VERSION); - return (version >= myMinVersion && minVersion <= myVersion); -} - -bool CActiveAEDSPAddon::CheckAPIVersion(void) -{ - /* check the API version */ - AddonVersion minVersion = AddonVersion(KODI_AE_DSP_MIN_API_VERSION); - try - { - m_apiVersion = AddonVersion(m_pStruct->GetAudioDSPAPIVersion()); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException("GetAudioDSPAPIVersion()"); - return false; - } - - if (!IsCompatibleAPIVersion(minVersion, m_apiVersion)) - { - CLog::Log(LOGERROR, "ActiveAE DSP - Add-on '%s' is using an incompatible API version. KODI minimum API version = '%s', add-on API version '%s'", Name().c_str(), minVersion.asString().c_str(), m_apiVersion.asString().c_str()); - return false; - } - - /* check the GUI API version */ - AddonVersion guiVersion = AddonVersion("0.0.0"); - minVersion = AddonVersion(KODI_GUILIB_MIN_API_VERSION); - try - { - guiVersion = AddonVersion(m_pStruct->GetGUIAPIVersion()); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException("GetGUIAPIVersion()"); - return false; - } - - if (!IsCompatibleGUIAPIVersion(minVersion, guiVersion)) - { - CLog::Log(LOGERROR, "ActiveAE DSP - Add-on '%s' is using an incompatible GUI API version. KODI minimum GUI API version = '%s', add-on GUI API version '%s'", Name().c_str(), minVersion.asString().c_str(), guiVersion.asString().c_str()); - return false; - } - - return true; -} - -bool CActiveAEDSPAddon::GetAddonProperties(void) -{ - std::string strDSPName, strFriendlyName, strAudioDSPVersion; - AE_DSP_ADDON_CAPABILITIES addonCapabilities; - - /* get the capabilities */ - try - { - memset(&addonCapabilities, 0, sizeof(addonCapabilities)); - AE_DSP_ERROR retVal = m_pStruct->GetAddonCapabilities(&addonCapabilities); - if (retVal != AE_DSP_ERROR_NO_ERROR) - { - CLog::Log(LOGERROR, "ActiveAE DSP - couldn't get the capabilities for add-on '%s'. Please contact the developer of this add-on: %s", GetFriendlyName().c_str(), Author().c_str()); - return false; - } - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException("GetAddonCapabilities()"); - return false; - } - - /* get the name of the dsp addon */ - try - { - strDSPName = m_pStruct->GetDSPName(); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException("GetDSPName()"); - return false; - } - - /* display name = backend name string */ - strFriendlyName = StringUtils::Format("%s", strDSPName.c_str()); - - /* backend version number */ - try - { - strAudioDSPVersion = m_pStruct->GetDSPVersion(); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException("GetDSPVersion()"); - return false; - } - - /* update the members */ - m_strAudioDSPName = strDSPName; - m_strFriendlyName = strFriendlyName; - m_strAudioDSPVersion = strAudioDSPVersion; - m_addonCapabilities = addonCapabilities; - - return true; -} - -AE_DSP_ADDON_CAPABILITIES CActiveAEDSPAddon::GetAddonCapabilities(void) const -{ - AE_DSP_ADDON_CAPABILITIES addonCapabilities(m_addonCapabilities); - return addonCapabilities; -} - -const std::string &CActiveAEDSPAddon::GetAudioDSPName(void) const -{ - return m_strAudioDSPName; -} - -const std::string &CActiveAEDSPAddon::GetAudioDSPVersion(void) const -{ - return m_strAudioDSPVersion; -} - -const std::string &CActiveAEDSPAddon::GetFriendlyName(void) const -{ - return m_strFriendlyName; -} - -bool CActiveAEDSPAddon::HaveMenuHooks(AE_DSP_MENUHOOK_CAT cat) const -{ - if (m_bReadyToUse && m_menuhooks.size() > 0) - { - for (unsigned int i = 0; i < m_menuhooks.size(); ++i) - { - if (m_menuhooks[i].category == cat || m_menuhooks[i].category == AE_DSP_MENUHOOK_ALL) - return true; - } - } - return false; -} - -AE_DSP_MENUHOOKS *CActiveAEDSPAddon::GetMenuHooks(void) -{ - return &m_menuhooks; -} - -void CActiveAEDSPAddon::CallMenuHook(const AE_DSP_MENUHOOK &hook, AE_DSP_MENUHOOK_DATA &hookData) -{ - if (!m_bReadyToUse || hookData.category == AE_DSP_MENUHOOK_UNKNOWN) - return; - - try - { - m_pStruct->MenuHook(hook, hookData); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } -} - -AE_DSP_ERROR CActiveAEDSPAddon::StreamCreate(const AE_DSP_SETTINGS *addonSettings, const AE_DSP_STREAM_PROPERTIES* pProperties, ADDON_HANDLE handle) -{ - AE_DSP_ERROR retVal(AE_DSP_ERROR_UNKNOWN); - - try - { - retVal = m_pStruct->StreamCreate(addonSettings, pProperties, handle); - if (retVal == AE_DSP_ERROR_NO_ERROR) - m_isInUse = true; - LogError(retVal, __FUNCTION__); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return retVal; -} - -void CActiveAEDSPAddon::StreamDestroy(const ADDON_HANDLE handle) -{ - try - { - m_pStruct->StreamDestroy(handle); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - m_isInUse = false; -} - -bool CActiveAEDSPAddon::StreamIsModeSupported(const ADDON_HANDLE handle, AE_DSP_MODE_TYPE type, unsigned int addon_mode_id, int unique_db_mode_id) -{ - try - { - AE_DSP_ERROR retVal = m_pStruct->StreamIsModeSupported(handle, type, addon_mode_id, unique_db_mode_id); - if (retVal == AE_DSP_ERROR_NO_ERROR) - return true; - else if (retVal != AE_DSP_ERROR_IGNORE_ME) - LogError(retVal, __FUNCTION__); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return false; -} - -AE_DSP_ERROR CActiveAEDSPAddon::StreamInitialize(const ADDON_HANDLE handle, const AE_DSP_SETTINGS *addonSettings) -{ - AE_DSP_ERROR retVal(AE_DSP_ERROR_UNKNOWN); - - try - { - retVal = m_pStruct->StreamInitialize(handle, addonSettings); - LogError(retVal, __FUNCTION__); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return retVal; -} - -bool CActiveAEDSPAddon::InputProcess(const ADDON_HANDLE handle, const float **array_in, unsigned int samples) -{ - try - { - return m_pStruct->InputProcess(handle, array_in, samples); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -unsigned int CActiveAEDSPAddon::InputResampleProcessNeededSamplesize(const ADDON_HANDLE handle) -{ - try - { - return m_pStruct->InputResampleProcessNeededSamplesize(handle); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -unsigned int CActiveAEDSPAddon::InputResampleProcess(const ADDON_HANDLE handle, float **array_in, float **array_out, unsigned int samples) -{ - try - { - return m_pStruct->InputResampleProcess(handle, array_in, array_out, samples); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -int CActiveAEDSPAddon::InputResampleSampleRate(const ADDON_HANDLE handle) -{ - try - { - return m_pStruct->InputResampleSampleRate(handle); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return -1; -} - -float CActiveAEDSPAddon::InputResampleGetDelay(const ADDON_HANDLE handle) -{ - try - { - return m_pStruct->InputResampleGetDelay(handle); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0.0f; -} - -unsigned int CActiveAEDSPAddon::PreProcessNeededSamplesize(const ADDON_HANDLE handle, unsigned int mode_id) -{ - try - { - return m_pStruct->PreProcessNeededSamplesize(handle, mode_id); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -float CActiveAEDSPAddon::PreProcessGetDelay(const ADDON_HANDLE handle, unsigned int mode_id) -{ - try - { - return m_pStruct->PreProcessGetDelay(handle, mode_id); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0.0f; -} - -unsigned int CActiveAEDSPAddon::PreProcess(const ADDON_HANDLE handle, unsigned int mode_id, float **array_in, float **array_out, unsigned int samples) -{ - try - { - return m_pStruct->PostProcess(handle, mode_id, array_in, array_out, samples); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -AE_DSP_ERROR CActiveAEDSPAddon::MasterProcessSetMode(const ADDON_HANDLE handle, AE_DSP_STREAMTYPE type, unsigned int mode_id, int unique_db_mode_id) -{ - AE_DSP_ERROR retVal(AE_DSP_ERROR_UNKNOWN); - - try - { - retVal = m_pStruct->MasterProcessSetMode(handle, type, mode_id, unique_db_mode_id); - LogError(retVal, __FUNCTION__); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return retVal; -} - -unsigned int CActiveAEDSPAddon::MasterProcessNeededSamplesize(const ADDON_HANDLE handle) -{ - try - { - return m_pStruct->MasterProcessNeededSamplesize(handle); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -float CActiveAEDSPAddon::MasterProcessGetDelay(const ADDON_HANDLE handle) -{ - try - { - return m_pStruct->MasterProcessGetDelay(handle); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0.0f; -} - -int CActiveAEDSPAddon::MasterProcessGetOutChannels(const ADDON_HANDLE handle, unsigned long &out_channel_present_flags) -{ - try - { - return m_pStruct->MasterProcessGetOutChannels(handle, out_channel_present_flags); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return -1; -} - -unsigned int CActiveAEDSPAddon::MasterProcess(const ADDON_HANDLE handle, float **array_in, float **array_out, unsigned int samples) -{ - try - { - return m_pStruct->MasterProcess(handle, array_in, array_out, samples); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -std::string CActiveAEDSPAddon::MasterProcessGetStreamInfoString(const ADDON_HANDLE handle) -{ - std::string strReturn; - - if (!m_bReadyToUse) - return strReturn; - - try - { - strReturn = m_pStruct->MasterProcessGetStreamInfoString(handle); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return strReturn; -} - -unsigned int CActiveAEDSPAddon::PostProcessNeededSamplesize(const ADDON_HANDLE handle, unsigned int mode_id) -{ - try - { - return m_pStruct->PostProcessNeededSamplesize(handle, mode_id); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -float CActiveAEDSPAddon::PostProcessGetDelay(const ADDON_HANDLE handle, unsigned int mode_id) -{ - try - { - return m_pStruct->PostProcessGetDelay(handle, mode_id); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0.0f; -} - -unsigned int CActiveAEDSPAddon::PostProcess(const ADDON_HANDLE handle, unsigned int mode_id, float **array_in, float **array_out, unsigned int samples) -{ - try - { - return m_pStruct->PostProcess(handle, mode_id, array_in, array_out, samples); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -unsigned int CActiveAEDSPAddon::OutputResampleProcessNeededSamplesize(const ADDON_HANDLE handle) -{ - try - { - return m_pStruct->OutputResampleProcessNeededSamplesize(handle); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -unsigned int CActiveAEDSPAddon::OutputResampleProcess(const ADDON_HANDLE handle, float **array_in, float **array_out, unsigned int samples) -{ - try - { - return m_pStruct->OutputResampleProcess(handle, array_in, array_out, samples); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0; -} - -int CActiveAEDSPAddon::OutputResampleSampleRate(const ADDON_HANDLE handle) -{ - try - { - return m_pStruct->OutputResampleSampleRate(handle); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return -1; -} - -float CActiveAEDSPAddon::OutputResampleGetDelay(const ADDON_HANDLE handle) -{ - try - { - return m_pStruct->OutputResampleGetDelay(handle); - } - XBMCCOMMONS_HANDLE_UNCHECKED - catch (...) - { - LogUnhandledException(__FUNCTION__); - Destroy(); - } - - return 0.0f; -} - -bool CActiveAEDSPAddon::SupportsInputInfoProcess(void) const -{ - return m_addonCapabilities.bSupportsInputProcess; -} - -bool CActiveAEDSPAddon::SupportsInputResample(void) const -{ - return m_addonCapabilities.bSupportsInputResample; -} - -bool CActiveAEDSPAddon::SupportsPreProcess(void) const -{ - return m_addonCapabilities.bSupportsPreProcess; -} - -bool CActiveAEDSPAddon::SupportsMasterProcess(void) const -{ - return m_addonCapabilities.bSupportsMasterProcess; -} - -bool CActiveAEDSPAddon::SupportsPostProcess(void) const -{ - return m_addonCapabilities.bSupportsPostProcess; -} - -bool CActiveAEDSPAddon::SupportsOutputResample(void) const -{ - return m_addonCapabilities.bSupportsOutputResample; -} - -const char *CActiveAEDSPAddon::ToString(const AE_DSP_ERROR error) -{ - switch (error) - { - case AE_DSP_ERROR_NO_ERROR: - return "no error"; - case AE_DSP_ERROR_NOT_IMPLEMENTED: - return "not implemented"; - case AE_DSP_ERROR_REJECTED: - return "rejected by the backend"; - case AE_DSP_ERROR_INVALID_PARAMETERS: - return "invalid parameters for this method"; - case AE_DSP_ERROR_INVALID_SAMPLERATE: - return "invalid samplerate for this method"; - case AE_DSP_ERROR_INVALID_IN_CHANNELS: - return "invalid input channel layout for this method"; - case AE_DSP_ERROR_INVALID_OUT_CHANNELS: - return "invalid output channel layout for this method"; - case AE_DSP_ERROR_FAILED: - return "the command failed"; - case AE_DSP_ERROR_UNKNOWN: - default: - return "unknown error"; - } -} - -bool CActiveAEDSPAddon::LogError(const AE_DSP_ERROR error, const char *strMethod) const -{ - if (error != AE_DSP_ERROR_NO_ERROR && error != AE_DSP_ERROR_IGNORE_ME) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - addon '%s' returned an error: %s", - strMethod, GetFriendlyName().c_str(), ToString(error)); - return false; - } - return true; -} - -void CActiveAEDSPAddon::LogUnhandledException(const char *strFunctionName) const -{ - CLog::Log(LOGERROR, "ActiveAE DSP - Unhandled exception caught while trying to call '%s' on add-on '%s', becomes diabled. Please contact the developer of this add-on: %s", strFunctionName, GetFriendlyName().c_str(), Author().c_str()); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPAddon.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPAddon.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPAddon.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPAddon.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,435 +0,0 @@ -#pragma once -/* - * Copyright (C) 2010-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "addons/Addon.h" -#include "addons/AddonDll.h" -#include "addons/DllAudioDSP.h" - -namespace ActiveAE -{ - class CActiveAEDSPAddon; - - typedef std::vector AE_DSP_MENUHOOKS; - typedef std::shared_ptr AE_DSP_ADDON; - - #define AE_DSP_INVALID_ADDON_ID (-1) - - /*! - * Interface from KODI to a Audio DSP add-on. - * - * Also translates KODI's C++ structures to the addon's C structures. - */ - class CActiveAEDSPAddon : public ADDON::CAddonDll - { - public: - CActiveAEDSPAddon(const ADDON::AddonProps& props); - CActiveAEDSPAddon(const cp_extension_t *ext); - ~CActiveAEDSPAddon(void); - - virtual void OnDisabled(); - virtual void OnEnabled(); - virtual ADDON::AddonPtr GetRunningInstance() const; - virtual void OnPreInstall(); - virtual void OnPostInstall(bool restart, bool update); - virtual void OnPreUnInstall(); - virtual void OnPostUnInstall(); - virtual bool CanInstall(); - - /** @name Audio DSP add-on methods */ - //@{ - /*! - * @brief Initialise the instance of this add-on. - * @param iClientId The ID of this add-on. - */ - ADDON_STATUS Create(int iClientId); - - /*! - * @return True when the dll for this add-on was loaded, false otherwise (e.g. unresolved symbols) - */ - bool DllLoaded(void) const; - - /*! - * @brief Destroy the instance of this add-on. - */ - void Destroy(void); - - /*! - * @brief Destroy and recreate this add-on. - */ - void ReCreate(void); - - /*! - * @return True if this instance is initialised, false otherwise. - */ - bool ReadyToUse(void) const; - - /*! - * @return The ID of this instance. - */ - int GetID(void) const; - - /*! - * @return The false if this addon is currently not used. - */ - virtual bool IsInUse() const; - //@} - - /** @name Audio DSP processing methods */ - //@{ - /*! - * @brief Query this add-on's capabilities. - * @return pCapabilities The add-on's capabilities. - */ - AE_DSP_ADDON_CAPABILITIES GetAddonCapabilities(void) const; - - /*! - * @return The name reported by the backend. - */ - const std::string &GetAudioDSPName(void) const; - - /*! - * @return The version string reported by the backend. - */ - const std::string &GetAudioDSPVersion(void) const; - - /*! - * @return A friendly name for this add-on that can be used in log messages. - */ - const std::string &GetFriendlyName(void) const; - - /*! - * @return True if this add-on has menu hooks, false otherwise. - */ - bool HaveMenuHooks(AE_DSP_MENUHOOK_CAT cat) const; - - /*! - * @return The menu hooks for this add-on. - */ - AE_DSP_MENUHOOKS *GetMenuHooks(void); - - /*! - * @brief Call one of the menu hooks of this addon. - * @param hook The hook to call. - * @param item The selected file item for which the hook was called. - */ - void CallMenuHook(const AE_DSP_MENUHOOK &hook, AE_DSP_MENUHOOK_DATA &hookData); - - /*! - * Set up Audio DSP with selected audio settings (use the basic present audio stream data format) - * Used to detect available addons for present stream, as example stereo surround upmix not needed on 5.1 audio stream - * @param addonSettings The add-on's audio settings. - * @param pProperties The properties of the currently playing stream. - * @return AE_DSP_ERROR_NO_ERROR if the properties were fetched successfully and data can be performed. AE_DSP_ERROR_IGNORE_ME if format is not supported, but without fault. - */ - AE_DSP_ERROR StreamCreate(const AE_DSP_SETTINGS *addonSettings, const AE_DSP_STREAM_PROPERTIES* pProperties, ADDON_HANDLE handle); - - /*! - * Remove the selected id from currently used dsp processes - * @param id The stream id - */ - void StreamDestroy(const ADDON_HANDLE handle); - - /*! - * @brief Ask the addon about a requested processing mode that it is supported on the current - * stream. Is called about every addon mode after successed StreamCreate. - * @param id The stream id - * @param addon_mode_id The mode inside addon which must be performed on call. Id is set from addon by iModeNumber on AE_DSP_MODE structure during RegisterMode callback, - * @param unique_mode_id The Mode unique id generated from dsp database. - * @return true if supported - */ - bool StreamIsModeSupported(const ADDON_HANDLE handle, AE_DSP_MODE_TYPE type, unsigned int addon_mode_id, int unique_db_mode_id); - - /*! - * Set up Audio DSP with selected audio settings (detected on data of first present audio packet) - * @param addonSettings The add-on's audio settings. - * @return AE_DSP_ERROR_NO_ERROR if the properties were fetched successfully. - */ - AE_DSP_ERROR StreamInitialize(const ADDON_HANDLE handle, const AE_DSP_SETTINGS *addonSettings); - - /*! - * @brief DSP input processing - * Can be used to have unchanged stream.. - * All DSP add-ons allowed to-do this. - * @param id The stream id - * @param array_in Pointer to data memory - * @param samples Amount of samples inside array_in - * @return true if work was OK - * @remarks Optional. Is set by AE_DSP_ADDON_CAPABILITIES and asked with GetAddonCapabilities - */ - bool InputProcess(const ADDON_HANDLE handle, const float **array_in, unsigned int samples); - - /*! - * If the add-on operate with buffered arrays and the output size can be higher as the input - * it becomes asked about needed size before any InputResampleProcess call. - * @param id The stream id - * @return The needed size of output array or 0 if no changes within it - */ - unsigned int InputResampleProcessNeededSamplesize(const ADDON_HANDLE handle); - - /*! - * @brief DSP re sample processing before master Here a high quality resample can be performed. - * Only one DSP add-on is allowed to-do this! - * @param id The stream id - * @param array_in Pointer to input data memory - * @param array_out Pointer to output data memory - * @param samples Amount of samples inside array_in - * @return Amount of samples processed - */ - unsigned int InputResampleProcess(const ADDON_HANDLE handle, float **array_in, float **array_out, unsigned int samples); - - /*! - * Returns the re-sampling generated new sample rate used before the master process - * @param id The stream id - * @return The new sample rate - */ - int InputResampleSampleRate(const ADDON_HANDLE handle); - - /*! - * Returns the time in seconds that it will take - * for the next added packet to be heard from the speakers. - * @param id The stream id - * @return the delay in seconds - */ - float InputResampleGetDelay(const ADDON_HANDLE handle); - - /*! - * If the addon operate with buffered arrays and the output size can be higher as the input - * it becomes asked about needed size before any PreProcess call. - * @param id The stream id - * @param mode_id The mode inside add-on which must be performed on call. Id is set from add-on by iModeNumber on AE_DSP_MODE structure during RegisterMode callback, - * and can be defined from add-on as a structure pointer or anything else what is needed to find it. - * @return The needed size of output array or 0 if no changes within it - */ - unsigned int PreProcessNeededSamplesize(const ADDON_HANDLE handle, unsigned int mode_id); - - /*! - * Returns the time in seconds that it will take - * for the next added packet to be heard from the speakers. - * @param id The stream id - * @param mode_id The mode inside add-on which must be performed on call. Id is set from add-on by iModeNumber on AE_DSP_MODE structure during RegisterMode callback, - * and can be defined from add-on as a structure pointer or anything else what is needed to find it. - * @return the delay in seconds - */ - float PreProcessGetDelay(const ADDON_HANDLE handle, unsigned int mode_id); - - /*! - * @brief DSP preprocessing - * All DSP add-ons allowed to-do this. - * @param id The stream id - * @param mode_id The mode inside add-on which must be performed on call. Id is set from add-on by iModeNumber on AE_DSP_MODE structure during RegisterMode callback, - * and can be defined from add-on as a structure pointer or anything else what is needed to find it. - * @param array_in Pointer to input data memory - * @param array_out Pointer to output data memory - * @param samples Amount of samples inside array_in - * @return Amount of samples processed - */ - unsigned int PreProcess(const ADDON_HANDLE handle, unsigned int mode_id, float **array_in, float **array_out, unsigned int samples); - - /*! - * @brief Set the active master process mode - * @param id The stream id - * @param type Requested stream type for the selected master mode - * @param mode_id The Mode identifier. - * @param unique_mode_id The Mode unique id generated from DSP database. - * @return AE_DSP_ERROR_NO_ERROR if the setup was successful - */ - AE_DSP_ERROR MasterProcessSetMode(const ADDON_HANDLE handle, AE_DSP_STREAMTYPE type, unsigned int mode_id, int unique_db_mode_id); - - /*! - * @brief If the add-on operate with buffered arrays and the output size can be higher as the input - * it becomes asked about needed size before any MasterProcess call. - * @param id The stream id - * @return The needed size of output array or 0 if no changes within it - */ - unsigned int MasterProcessNeededSamplesize(const ADDON_HANDLE handle); - - /*! - * @brief Returns the time in seconds that it will take - * for the next added packet to be heard from the speakers. - * @param id The stream id - * @return the delay in seconds - */ - float MasterProcessGetDelay(const ADDON_HANDLE handle); - - /*! - * @brief Returns the from selected master mode performed channel alignment - * @param id The stream id - * @retval out_channel_present_flags the exact channel present flags after performed up-/downmix - * @return the amount channels - */ - int MasterProcessGetOutChannels(const ADDON_HANDLE handle, unsigned long &out_channel_present_flags); - - /*! - * @brief Master processing becomes performed with it - * Here a channel up-mix/down-mix for stereo surround sound can be performed - * Only one DSP add-on is allowed to-do this! - * @param id The stream id - * @param array_in Pointer to input data memory - * @param array_out Pointer to output data memory - * @param samples Amount of samples inside array_in - * @return Amount of samples processed - */ - unsigned int MasterProcess(const ADDON_HANDLE handle, float **array_in, float **array_out, unsigned int samples); - - /*! - * @brief Get a from addon generated information string - * @param id The stream id - * @return Info string - */ - std::string MasterProcessGetStreamInfoString(const ADDON_HANDLE handle); - - /*! - * If the add-on operate with buffered arrays and the output size can be higher as the input - * it becomes asked about needed size before any PostProcess call. - * @param id The stream id - * @param mode_id The mode inside add-on which must be performed on call. Id is set from add-on by iModeNumber on AE_DSP_MODE structure during RegisterMode callback, - * and can be defined from add-on as a structure pointer or anything else what is needed to find it. - * @return The needed size of output array or 0 if no changes within it - */ - unsigned int PostProcessNeededSamplesize(const ADDON_HANDLE handle, unsigned int mode_id); - - /*! - * Returns the time in seconds that it will take - * for the next added packet to be heard from the speakers. - * @param id The stream id - * @param mode_id The mode inside add-on which must be performed on call. Id is set from add-on by iModeNumber on AE_DSP_MODE structure during RegisterMode callback, - * and can be defined from add-on as a structure pointer or anything else what is needed to find it. - * @return the delay in seconds - */ - float PostProcessGetDelay(const ADDON_HANDLE handle, unsigned int mode_id); - - /*! - * @brief DSP post processing - * @param id The stream id - * @param mode_id The mode inside add-on which must be performed on call. Id is set from add-on by iModeNumber on AE_DSP_MODE structure during RegisterMode callback, - * and can be defined from add-on as a structure pointer or anything else what is needed to find it. - * @param array_in Pointer to input data memory - * @param array_out Pointer to output data memory - * @param samples Amount of samples inside array_in - * @return Amount of samples processed - */ - unsigned int PostProcess(const ADDON_HANDLE handle, unsigned int mode_id, float **array_in, float **array_out, unsigned int samples); - - /*! - * @brief If the add-on operate with buffered arrays and the output size can be higher as the input - * it becomes asked about needed size before any OutputResampleProcess call. - * @param id The stream id - * @return The needed size of output array or 0 if no changes within it - */ - unsigned int OutputResampleProcessNeededSamplesize(const ADDON_HANDLE handle); - - /*! - * @brief Re-sampling after master processing becomes performed with it if needed, only - * one add-on can perform it. - * @param id The stream id - * @param array_in Pointer to input data memory - * @param array_out Pointer to output data memory - * @param samples Amount of samples inside array_in - * @return Amount of samples processed - */ - unsigned int OutputResampleProcess(const ADDON_HANDLE handle, float **array_in, float **array_out, unsigned int samples); - - /*! - * Returns the re-sampling generated new sample rate used after the master process - * @param id The stream id - * @return The new sample rate - */ - int OutputResampleSampleRate(const ADDON_HANDLE handle); - - /*! - * Returns the time in seconds that it will take - * for the next added packet to be heard from the speakers. - * @param id The stream id - * @return the delay in seconds - */ - float OutputResampleGetDelay(const ADDON_HANDLE handle); - - bool SupportsInputInfoProcess(void) const; - bool SupportsPreProcess(void) const; - bool SupportsInputResample(void) const; - bool SupportsMasterProcess(void) const; - bool SupportsPostProcess(void) const; - bool SupportsOutputResample(void) const; - - static const char *ToString(const AE_DSP_ERROR error); - - private: - /*! - * @brief Checks whether the provided API version is compatible with KODI - * @param minVersion The add-on's KODI_AE_DSP_MIN_API_VERSION version - * @param version The add-on's KODI_AE_DSP_API_VERSION version - * @return True when compatible, false otherwise - */ - static bool IsCompatibleAPIVersion(const ADDON::AddonVersion &minVersion, const ADDON::AddonVersion &version); - - /*! - * @brief Checks whether the provided GUI API version is compatible with KODI - * @param minVersion The add-on's KODI_GUILIB_MIN_API_VERSION version - * @param version The add-on's KODI_GUILIB_API_VERSION version - * @return True when compatible, false otherwise - */ - static bool IsCompatibleGUIAPIVersion(const ADDON::AddonVersion &minVersion, const ADDON::AddonVersion &version); - - /*! - * @brief Request the API version from the add-on, and check if it's compatible - * @return True when compatible, false otherwise. - */ - bool CheckAPIVersion(void); - - /*! - * @brief Resets all class members to their defaults. Called by the constructors. - */ - void ResetProperties(int iClientId = AE_DSP_INVALID_ADDON_ID); - - bool GetAddonProperties(void); - - bool LogError(const AE_DSP_ERROR error, const char *strMethod) const; - void LogUnhandledException(const char *strFunctionName) const; - - bool m_bReadyToUse; /*!< true if this add-on is connected to the audio DSP, false otherwise */ - bool m_isInUse; /*!< true if this add-on currentyl processing data */ - AE_DSP_MENUHOOKS m_menuhooks; /*!< the menu hooks for this add-on */ - int m_iClientId; /*!< database ID of the audio DSP */ - - /* cached data */ - std::string m_strAudioDSPName; /*!< the cached audio DSP version */ - bool m_bGotAudioDSPName; /*!< true if the audio DSP name has already been fetched */ - std::string m_strAudioDSPVersion; /*!< the cached audio DSP version */ - bool m_bGotAudioDSPVersion; /*!< true if the audio DSP version has already been fetched */ - std::string m_strFriendlyName; /*!< the cached friendly name */ - bool m_bGotFriendlyName; /*!< true if the friendly name has already been fetched */ - AE_DSP_ADDON_CAPABILITIES m_addonCapabilities; /*!< the cached add-on capabilities */ - bool m_bGotAddonCapabilities; /*!< true if the add-on capabilities have already been fetched */ - - /* stored strings to make sure const char* members in AE_DSP_PROPERTIES stay valid */ - std::string m_strUserPath; /*!< @brief translated path to the user profile */ - std::string m_strAddonPath ; /*!< @brief translated path to this add-on */ - - CCriticalSection m_critSection; - - bool m_isPreProcessing; - bool m_isPreResampling; - bool m_isMasterProcessing; - bool m_isPostResampling; - bool m_isPostProcessing; - ADDON::AddonVersion m_apiVersion; - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1162 +0,0 @@ -/* - * Copyright (C) 2010-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "ActiveAEDSP.h" - -#include - -extern "C" { -#include "libavutil/channel_layout.h" -} - -#include "ActiveAEDSPProcess.h" -#include "addons/AddonInstaller.h" -#include "addons/GUIDialogAddonSettings.h" -#include "Application.h" -#include "cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h" -#include "cores/AudioEngine/Interfaces/AEResample.h" -#include "cores/AudioEngine/Utils/AEUtil.h" -#include "cores/IPlayer.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "dialogs/GUIDialogOK.h" -#include "dialogs/GUIDialogSelect.h" -#include "guiinfo/GUIInfoLabels.h" -#include "guilib/GUIWindowManager.h" -#include "GUIUserMessages.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" -#include "settings/AdvancedSettings.h" -#include "settings/dialogs/GUIDialogAudioDSPManager.h" -#include "settings/MediaSettings.h" -#include "settings/MediaSourceSettings.h" -#include "settings/Settings.h" -#include "utils/JobManager.h" -#include "utils/StringUtils.h" - - -using namespace ADDON; -using namespace ActiveAE; -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; - -#define MIN_DSP_ARRAY_SIZE 4096 - -/*! @name Master audio dsp control class */ -//@{ -CActiveAEDSP::CActiveAEDSP() - : CThread("ActiveAEDSP") - , m_isActive(false) - , m_noAddonWarningDisplayed(false) - , m_usedProcessesCnt(0) - , m_activeProcessId(-1) - , m_isValidAudioDSPSettings(false) -{ - Cleanup(); -} - -CActiveAEDSP::~CActiveAEDSP() -{ - /* Deactivate all present dsp addons */ - Deactivate(); - CLog::Log(LOGDEBUG, "ActiveAE DSP - destroyed"); -} - -CActiveAEDSP &CActiveAEDSP::GetInstance() -{ - static CActiveAEDSP activeAEDSPManagerInstance; - return activeAEDSPManagerInstance; -} -//@} - -/*! @name initialization and configuration methods */ -//@{ -class CActiveAEDSPStartJob : public CJob -{ -public: - CActiveAEDSPStartJob() {} - ~CActiveAEDSPStartJob(void) {} - - bool DoWork(void) - { - CActiveAEDSP::GetInstance().Activate(false); - return true; - } -}; - -void CActiveAEDSP::Activate(bool bAsync /* = false */) -{ - if (bAsync) - { - CActiveAEDSPStartJob *job = new CActiveAEDSPStartJob(); - CJobManager::GetInstance().AddJob(job, NULL); - return; - } - - /* first stop and remove any audio dsp add-on's */ - Deactivate(); - - CSingleLock lock(m_critSection); - - CLog::Log(LOGNOTICE, "ActiveAE DSP - starting"); - - /* don't start if Settings->System->Audio->Audio DSP isn't checked */ - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED)) - return; - - Cleanup(); - - /* create and open database */ - m_databaseDSP.Open(); - - Create(); - SetPriority(-1); -} - -class CActiveAEDSPModeUpdateJob : public CJob -{ -public: - CActiveAEDSPModeUpdateJob() {} - ~CActiveAEDSPModeUpdateJob(void) {} - - bool DoWork(void) - { - CActiveAEDSP::GetInstance().TriggerModeUpdate(false); - return true; - } -}; - -void CActiveAEDSP::TriggerModeUpdate(bool bAsync /* = true */) -{ - if (bAsync) - { - CActiveAEDSPModeUpdateJob *job = new CActiveAEDSPModeUpdateJob(); - CJobManager::GetInstance().AddJob(job, NULL); - return; - } - - CLog::Log(LOGINFO, "ActiveAE DSP - %s - Update mode selections", __FUNCTION__); - - if (!m_databaseDSP.IsOpen()) - { - CLog::Log(LOGERROR, "ActiveAE DSP - failed to open the database"); - return; - } - - for (unsigned int i = 0; i < AE_DSP_MODE_TYPE_MAX; ++i) - { - m_modes[i].clear(); - m_databaseDSP.GetModes(m_modes[i], i); - } - - /* - * if any dsp processing is active restart playback - */ - if (m_usedProcessesCnt > 0) - { - CLog::Log(LOGNOTICE, "ActiveAE DSP - restarting playback after disabled dsp system"); - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_RESTART); - } -} - -void CActiveAEDSP::Deactivate(void) -{ - /* check whether the audio dsp is loaded */ - if (!m_isActive) - return; - - /* stop thread */ - StopThread(); - - CSingleLock lock(m_critSection); - - CLog::Log(LOGNOTICE, "ActiveAE DSP - stopping"); - - /* destroy all addons */ - for (AE_DSP_ADDONMAP_ITR itr = m_addonMap.begin(); itr != m_addonMap.end(); ++itr) - itr->second->Destroy(); - - m_addonMap.clear(); - - /* unload all data */ - Cleanup(); - - /* close database */ - if (m_databaseDSP.IsOpen()) - m_databaseDSP.Close(); -} - -void CActiveAEDSP::Cleanup(void) -{ - CActiveAEDSPProcessPtr tmp; - for (unsigned int i = 0; i < AE_DSP_STREAM_MAX_STREAMS; ++i) - m_usedProcesses[i] = tmp; - - m_isActive = false; - m_usedProcessesCnt = 0; - m_isValidAudioDSPSettings = false; - m_noAddonWarningDisplayed = false; - m_outdatedAddons.clear(); - - for (unsigned int i = 0; i < AE_DSP_MODE_TYPE_MAX; ++i) - m_modes[i].clear(); -} - -bool CActiveAEDSP::InstallAddonAllowed(const std::string &strAddonId) const -{ - return !m_isActive || - !IsInUse(strAddonId) || - m_usedProcessesCnt == 0; -} - -void CActiveAEDSP::MarkAsOutdated(const std::string& strAddonId) -{ - if (IsActivated() && CSettings::GetInstance().GetInt(CSettings::SETTING_GENERAL_ADDONUPDATES) == AUTO_UPDATES_ON) - { - CSingleLock lock(m_critSection); - m_outdatedAddons.push_back(strAddonId); - } -} - -bool CActiveAEDSP::HasOutdatedAddons(std::vector &outdatedAddons) -{ - CSingleLock lock(m_critSection); - if (!m_outdatedAddons.empty()) - { - outdatedAddons = m_outdatedAddons; - return true; - } - return false; -} - -void CActiveAEDSP::ResetDatabase(void) -{ - CLog::Log(LOGNOTICE, "ActiveAE DSP - clearing the audio DSP database"); - - if (IsProcessing()) - { - CLog::Log(LOGNOTICE, "ActiveAE DSP - stopping playback"); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_STOP); - } - - /* stop the thread */ - Deactivate(); - - if (m_databaseDSP.Open()) - { - m_databaseDSP.DeleteModes(); - m_databaseDSP.DeleteActiveDSPSettings(); - m_databaseDSP.DeleteAddons(); - - m_databaseDSP.Close(); - } - - CLog::Log(LOGNOTICE, "ActiveAE DSP - database cleared"); - - if (CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED)) - { - CLog::Log(LOGNOTICE, "ActiveAE DSP - restarting the audio DSP handler"); - m_databaseDSP.Open(); - Cleanup(); - Activate(); - } -} -//@} - -/*! @name Settings and action callback methods (OnAction currently unused */ -//@{ -void CActiveAEDSP::OnSettingAction(const CSetting *setting) -{ - if (setting == NULL) - return; - - const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_AUDIOOUTPUT_DSPSETTINGS) - { - if (IsActivated()) - { - CGUIDialogAudioDSPManager *dialog = (CGUIDialogAudioDSPManager *)g_windowManager.GetWindow(WINDOW_DIALOG_AUDIO_DSP_MANAGER); - if (dialog) - dialog->Open(); - } - } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_DSPRESETDB) - { - if (HELPERS::ShowYesNoDialogLines(CVariant{19098}, CVariant{36440}, CVariant{750}) == - DialogResponse::YES) - { - CDateTime::ResetTimezoneBias(); - ResetDatabase(); - } - } -} -//@} - -/*! @name addon installation callback methods */ -//@{ -bool CActiveAEDSP::RequestRestart(AddonPtr addon, bool bDataChanged) -{ - return StopAudioDSPAddon(addon, true); -} - -bool CActiveAEDSP::RequestRemoval(AddonPtr addon) -{ - return StopAudioDSPAddon(addon, false); -} - -bool CActiveAEDSP::IsInUse(const std::string &strAddonId) const -{ - CSingleLock lock(m_critSection); - - for (AE_DSP_ADDONMAP_CITR citr = m_addonMap.begin(); citr != m_addonMap.end(); ++citr) - if (!CAddonMgr::GetInstance().IsAddonDisabled(citr->second->ID()) && citr->second->ID() == strAddonId) - return true; - return false; -} - -bool CActiveAEDSP::IsKnownAudioDSPAddon(const AddonPtr &addon) const -{ - // database IDs start at 1 - return GetAudioDSPAddonId(addon) > 0; -} - -int CActiveAEDSP::GetAudioDSPAddonId(const AddonPtr &addon) const -{ - CSingleLock lock(m_critUpdateSection); - - for (AE_DSP_ADDONMAP_CITR citr = m_addonMap.begin(); citr != m_addonMap.end(); ++citr) - { - if (citr->second->ID() == addon->ID()) - return citr->first; - } - - return -1; -} -//@} - -/*! @name GUIInfoManager calls */ -//@{ -bool CActiveAEDSP::TranslateBoolInfo(DWORD dwInfo) const -{ - bool bReturn(false); - - CSingleLock lock(m_critSection); - - if (!IsProcessing() || !m_usedProcesses[m_activeProcessId]) - return bReturn; - - switch (dwInfo) - { - case ADSP_IS_ACTIVE: - bReturn = true; - break; - case ADSP_HAS_INPUT_RESAMPLE: - bReturn = m_usedProcesses[m_activeProcessId]->HasActiveModes(AE_DSP_MODE_TYPE_INPUT_RESAMPLE); - break; - case ADSP_HAS_PRE_PROCESS: - bReturn = m_usedProcesses[m_activeProcessId]->HasActiveModes(AE_DSP_MODE_TYPE_PRE_PROCESS); - break; - case ADSP_HAS_MASTER_PROCESS: - bReturn = m_usedProcesses[m_activeProcessId]->HasActiveModes(AE_DSP_MODE_TYPE_MASTER_PROCESS); - break; - case ADSP_HAS_POST_PROCESS: - bReturn = m_usedProcesses[m_activeProcessId]->HasActiveModes(AE_DSP_MODE_TYPE_POST_PROCESS); - break; - case ADSP_HAS_OUTPUT_RESAMPLE: - bReturn = m_usedProcesses[m_activeProcessId]->HasActiveModes(AE_DSP_MODE_TYPE_OUTPUT_RESAMPLE); - break; - case ADSP_MASTER_ACTIVE: - bReturn = m_usedProcesses[m_activeProcessId]->GetActiveMasterMode() != NULL; - break; - default: - break; - }; - - return bReturn; -} - -bool CActiveAEDSP::TranslateCharInfo(DWORD dwInfo, std::string &strValue) const -{ - bool bReturn(true); - - CSingleLock lock(m_critSection); - - if (!IsProcessing() || !m_usedProcesses[m_activeProcessId]) - return false; - - CActiveAEDSPModePtr activeMaster = m_usedProcesses[m_activeProcessId]->GetActiveMasterMode(); - if (activeMaster == NULL) - return false; - - switch (dwInfo) - { - case ADSP_ACTIVE_STREAM_TYPE: - strValue = g_localizeStrings.Get(GetStreamTypeName(m_usedProcesses[m_activeProcessId]->GetUsedStreamType())); - break; - case ADSP_DETECTED_STREAM_TYPE: - strValue = g_localizeStrings.Get(GetStreamTypeName(m_usedProcesses[m_activeProcessId]->GetDetectedStreamType())); - break; - case ADSP_MASTER_NAME: - { - AE_DSP_ADDON addon; - int modeId = activeMaster->ModeID(); - if (modeId == AE_DSP_MASTER_MODE_ID_PASSOVER || modeId >= AE_DSP_MASTER_MODE_ID_INTERNAL_TYPES) - strValue = g_localizeStrings.Get(activeMaster->ModeName()); - else if (CActiveAEDSP::GetInstance().GetAudioDSPAddon(activeMaster->AddonID(), addon)) - strValue = addon->GetString(activeMaster->ModeName()); - } - break; - case ADSP_MASTER_INFO: - bReturn = m_usedProcesses[m_activeProcessId]->GetMasterModeStreamInfoString(strValue); - break; - case ADSP_MASTER_OWN_ICON: - strValue = activeMaster->IconOwnModePath(); - break; - case ADSP_MASTER_OVERRIDE_ICON: - strValue = activeMaster->IconOverrideModePath(); - break; - default: - strValue.clear(); - bReturn = false; - break; - }; - - return bReturn; -} -//@} - -/*! @name Current processing streams control function methods */ -//@{ -CAEChannelInfo CActiveAEDSP::GetInternalChannelLayout(AEStdChLayout stdLayout) -{ - uint64_t channelLayoutOut; - switch (stdLayout) - { - default: - case AE_CH_LAYOUT_2_0: - channelLayoutOut = AV_CH_LAYOUT_STEREO; - break; - case AE_CH_LAYOUT_2_1: - channelLayoutOut = AV_CH_LAYOUT_2POINT1; - break; - case AE_CH_LAYOUT_3_0: - channelLayoutOut = AV_CH_LAYOUT_SURROUND; - break; - case AE_CH_LAYOUT_3_1: - channelLayoutOut = AV_CH_LAYOUT_3POINT1; - break; - case AE_CH_LAYOUT_4_0: - channelLayoutOut = AV_CH_LAYOUT_2_2; - break; - case AE_CH_LAYOUT_4_1: - channelLayoutOut = AV_CH_LAYOUT_2_2|AV_CH_LOW_FREQUENCY; - break; - case AE_CH_LAYOUT_5_0: - channelLayoutOut = AV_CH_LAYOUT_5POINT0; - break; - case AE_CH_LAYOUT_5_1: - channelLayoutOut = AV_CH_LAYOUT_5POINT1; - break; - case AE_CH_LAYOUT_7_0: - channelLayoutOut = AV_CH_LAYOUT_7POINT0; - break; - case AE_CH_LAYOUT_7_1: - channelLayoutOut = AV_CH_LAYOUT_7POINT1; - break; - } - return CAEUtil::GetAEChannelLayout(channelLayoutOut); -} - -bool CActiveAEDSP::CreateDSPs(unsigned int &streamId, CActiveAEDSPProcessPtr &process, const AEAudioFormat &inputFormat, const AEAudioFormat &outputFormat, bool upmix, - AEQuality quality, enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type, - int profile, bool wasActive) -{ - if (!IsActivated() || m_usedProcessesCnt >= AE_DSP_STREAM_MAX_STREAMS) - return false; - - CSingleLock lock(m_critSection); - - AE_DSP_STREAMTYPE requestedStreamType = LoadCurrentAudioSettings(); - - CActiveAEDSPProcessPtr usedProc; - if (wasActive && streamId != (unsigned int)-1 && streamId < AE_DSP_STREAM_MAX_STREAMS) - { - if (m_usedProcesses[streamId] != NULL) - { - usedProc = m_usedProcesses[streamId]; - } - } - else - { - for (unsigned int i = 0; i < AE_DSP_STREAM_MAX_STREAMS; ++i) - { - /* find a free position */ - if (m_usedProcesses[i] == NULL) - { - usedProc = CActiveAEDSPProcessPtr(new CActiveAEDSPProcess(i)); - streamId = i; - break; - } - } - } - - if (usedProc == NULL) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - can't find active processing class", __FUNCTION__); - return false; - } - - if (!usedProc->Create(inputFormat, outputFormat, upmix, quality, requestedStreamType, matrix_encoding, audio_service_type, profile)) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - Creation of processing class failed", __FUNCTION__); - return false; - } - - if (!wasActive) - { - process = usedProc; - m_activeProcessId = streamId; - m_usedProcesses[streamId] = usedProc; - m_usedProcessesCnt++; - } - return true; -} - -void CActiveAEDSP::DestroyDSPs(unsigned int streamId) -{ - CSingleLock lock(m_critSection); - - if (streamId != (unsigned int)-1 && m_usedProcesses[streamId] != NULL) - { - m_usedProcesses[streamId]->Destroy(); - m_usedProcesses[streamId] = CActiveAEDSPProcessPtr(); - --m_usedProcessesCnt; - } - if (m_usedProcessesCnt == 0) - { - m_activeProcessId = -1; - } -} - -CActiveAEDSPProcessPtr CActiveAEDSP::GetDSPProcess(unsigned int streamId) -{ - CSingleLock lock(m_critSection); - - if (streamId != (unsigned int)-1 && m_usedProcesses[streamId]) - return m_usedProcesses[streamId]; - return CActiveAEDSPProcessPtr(); -} - -unsigned int CActiveAEDSP::GetProcessingStreamsAmount(void) -{ - CSingleLock lock(m_critSection); - return m_usedProcessesCnt; -} - -unsigned int CActiveAEDSP::GetActiveStreamId(void) -{ - CSingleLock lock(m_critSection); - - return m_activeProcessId; -} - -const AE_DSP_MODELIST &CActiveAEDSP::GetAvailableModes(AE_DSP_MODE_TYPE modeType) -{ - static AE_DSP_MODELIST emptyArray; - if (modeType < 0 || modeType >= AE_DSP_MODE_TYPE_MAX) - return emptyArray; - - CSingleLock lock(m_critSection); - return m_modes[modeType]; -} - -/*! @name addon update process methods */ -//@{ -bool CActiveAEDSP::StopAudioDSPAddon(AddonPtr addon, bool bRestart) -{ - CSingleLock lock(m_critSection); - - int iId = GetAudioDSPAddonId(addon); - AE_DSP_ADDON mappedAddon; - if (GetReadyAudioDSPAddon(iId, mappedAddon)) - { - if (bRestart) - mappedAddon->ReCreate(); - else - mappedAddon->Destroy(); - - return true; - } - - return false; -} - -bool CActiveAEDSP::UpdateAndInitialiseAudioDSPAddons(bool bInitialiseAllAudioDSPAddons /* = false */) -{ - bool bReturn(true); - VECADDONS map; - VECADDONS disableAddons; - { - CSingleLock lock(m_critUpdateSection); - map = m_addons; - } - - if (map.size() == 0) - return false; - - for (unsigned iAddonPtr = 0; iAddonPtr < map.size(); ++iAddonPtr) - { - const AddonPtr dspAddon = map.at(iAddonPtr); - bool bEnabled = !CAddonMgr::GetInstance().IsAddonDisabled(dspAddon->ID()); - - if (!bEnabled && IsKnownAudioDSPAddon(dspAddon)) - { - CSingleLock lock(m_critUpdateSection); - /* stop the dsp addon and remove it from the db */ - StopAudioDSPAddon(dspAddon, false); - VECADDONS::iterator addonPtr = std::find(m_addons.begin(), m_addons.end(), dspAddon); - if (addonPtr != m_addons.end()) - m_addons.erase(addonPtr); - - } - else if (bEnabled && (bInitialiseAllAudioDSPAddons || !IsKnownAudioDSPAddon(dspAddon) || !IsReadyAudioDSPAddon(dspAddon))) - { - bool bDisabled(false); - - /* register the add-on in the audio dsp db, and create the CActiveAEDSPAddon instance */ - int iAddonId = RegisterAudioDSPAddon(dspAddon); - if (iAddonId < 0) - { - /* failed to register or create the add-on, disable it */ - CLog::Log(LOGWARNING, "ActiveAE DSP - %s - failed to register add-on %s, disabling it", __FUNCTION__, dspAddon->Name().c_str()); - disableAddons.push_back(dspAddon); - bDisabled = true; - } - else - { - ADDON_STATUS status(ADDON_STATUS_UNKNOWN); - AE_DSP_ADDON addon; - { - CSingleLock lock(m_critUpdateSection); - if (!GetAudioDSPAddon(iAddonId, addon)) - { - CLog::Log(LOGWARNING, "ActiveAE DSP - %s - failed to find add-on %s, disabling it", __FUNCTION__, dspAddon->Name().c_str()); - disableAddons.push_back(dspAddon); - bDisabled = true; - } - } - - /* re-check the enabled status. newly installed dsps get disabled when they're added to the db */ - if (!bDisabled && !CAddonMgr::GetInstance().IsAddonDisabled(addon->ID()) && (status = addon->Create(iAddonId)) != ADDON_STATUS_OK) - { - CLog::Log(LOGWARNING, "ActiveAE DSP - %s - failed to create add-on %s, status = %d", __FUNCTION__, dspAddon->Name().c_str(), status); - if (!addon.get() || !addon->DllLoaded() || status == ADDON_STATUS_PERMANENT_FAILURE) - { - /* failed to load the dll of this add-on, disable it */ - CLog::Log(LOGWARNING, "ActiveAE DSP - %s - failed to load the dll for add-on %s, disabling it", __FUNCTION__, dspAddon->Name().c_str()); - disableAddons.push_back(dspAddon); - bDisabled = true; - } - } - } - - if (bDisabled && IsActivated()) - CGUIDialogOK::ShowAndGetInput(24070, 24071, 16029, 0); - } - } - - /* disable add-ons that failed to initialise */ - if (disableAddons.size() > 0) - { - CSingleLock lock(m_critUpdateSection); - for (VECADDONS::iterator itr = disableAddons.begin(); itr != disableAddons.end(); ++itr) - { - /* disable in the add-on db */ - CAddonMgr::GetInstance().DisableAddon((*itr)->ID()); - - /* remove from the audio dsp add-on list */ - VECADDONS::iterator addonPtr = std::find(m_addons.begin(), m_addons.end(), *itr); - if (addonPtr != m_addons.end()) - m_addons.erase(addonPtr); - } - } - - return bReturn; -} - -bool CActiveAEDSP::UpdateAddons(void) -{ - VECADDONS addons; - AE_DSP_ADDON dspAddon; - bool bReturn(CAddonMgr::GetInstance().GetAddons(ADDON_ADSPDLL, addons, true)); - size_t usableAddons; - - if (bReturn) - { - CSingleLock lock(m_critUpdateSection); - m_addons = addons; - } - - usableAddons = m_addons.size(); - - /* handle "new" addons which aren't yet in the db - these have to be added first */ - for (VECADDONS::const_iterator itr = addons.begin(); itr != addons.end(); ++itr) - { - dspAddon = std::dynamic_pointer_cast(*itr); - - if (RegisterAudioDSPAddon(dspAddon) < 0) - { - CAddonMgr::GetInstance().DisableAddon(dspAddon->ID()); - --usableAddons; - } - } - - if ((!bReturn || usableAddons == 0) && !m_noAddonWarningDisplayed && - !CAddonMgr::GetInstance().HasAddons(ADDON_ADSPDLL, false) && - IsActivated()) - { - // No audio DSP add-ons could be found - // You need a add-on installed for the process of audio DSP signal. System becomes disabled. - m_noAddonWarningDisplayed = true; - CGUIDialogOK::ShowAndGetInput(CVariant{19273}, CVariant{19274}); - CSettings::GetInstance().SetBool(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED, false); - CGUIMessage msg(GUI_MSG_UPDATE, WINDOW_SETTINGS_SYSTEM, 0); - CApplicationMessenger::GetInstance().SendGUIMessage(msg); - CApplicationMessenger::GetInstance().PostMsg(TMSG_SETAUDIODSPSTATE, ACTIVE_AE_DSP_STATE_OFF); - } - - return bReturn; -} - -void CActiveAEDSP::Notify(const Observable &obs, const ObservableMessage msg) -{ - if (msg == ObservableMessageAddons) - UpdateAddons(); -} - -void CActiveAEDSP::Process(void) -{ - bool bCheckedEnabledAddonsOnStartup(false); - - CAddonMgr::GetInstance().RegisterAddonMgrCallback(ADDON_ADSPDLL, this); - CAddonMgr::GetInstance().RegisterObserver(this); - - m_isActive = true; - - UpdateAddons(); - - while (!g_application.m_bStop && !m_bStop) - { - UpdateAndInitialiseAudioDSPAddons(); - - if (!bCheckedEnabledAddonsOnStartup) - { - bCheckedEnabledAddonsOnStartup = true; - if (HasEnabledAudioDSPAddons()) - TriggerModeUpdate(false); - else if (!m_noAddonWarningDisplayed) - ShowDialogNoAddonsEnabled(); - } - else - { - Sleep(1000); - } - } - - m_isActive = false; -} - -void CActiveAEDSP::ShowDialogNoAddonsEnabled(void) -{ - if (!IsActivated()) - return; - - CGUIDialogOK::ShowAndGetInput(15048, 15049, 0, 0); - - std::vector params; - params.push_back("addons://disabled/kodi.adsp"); - params.push_back("return"); - g_windowManager.ActivateWindow(WINDOW_ADDON_BROWSER, params); -} - -int CActiveAEDSP::RegisterAudioDSPAddon(AddonPtr addon) -{ - int iAddonId(-1); - - if (CAddonMgr::GetInstance().IsAddonDisabled(addon->ID())) - return -1; - - CLog::Log(LOGDEBUG, "ActiveAE DSP - %s - registering add-on '%s'", __FUNCTION__, addon->Name().c_str()); - - if (!m_databaseDSP.IsOpen()) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - failed to get the database", __FUNCTION__); - return -1; - } - - /* check whether we already know this dsp addon */ - iAddonId = m_databaseDSP.GetAudioDSPAddonId(addon->ID()); - - /* try to register the new dsp addon in the db */ - if (iAddonId < 0) - { - if ((iAddonId = m_databaseDSP.Persist(addon)) < 0) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - can't add dsp addon '%s' to the database", __FUNCTION__, addon->Name().c_str()); - return -1; - } - } - - AE_DSP_ADDON dspAddon; - /* load and initialise the dsp addon libraries */ - { - CSingleLock lock(m_critSection); - AE_DSP_ADDONMAP_CITR existingAddon = m_addonMap.find(iAddonId); - if (existingAddon != m_addonMap.end()) - { - /* return existing addon */ - dspAddon = existingAddon->second; - } - else - { - /* create a new addon instance */ - dspAddon = std::dynamic_pointer_cast (addon); - m_addonMap.insert(std::make_pair(iAddonId, dspAddon)); - } - } - - if (iAddonId < 0) - CLog::Log(LOGERROR, "ActiveAE DSP - %s - can't register dsp add-on '%s'", __FUNCTION__, addon->Name().c_str()); - - return iAddonId; -} -//@} - -/*! @name Played source settings methods - * @note for save of settings see CSaveFileStateJob */ -//@{ -AE_DSP_STREAMTYPE CActiveAEDSP::LoadCurrentAudioSettings(void) -{ - CSingleLock lock(m_critSection); - - AE_DSP_STREAMTYPE type = AE_DSP_ASTREAM_INVALID; - - if (g_application.m_pPlayer->HasPlayer()) - { - CFileItem currentFile(g_application.CurrentFileItem()); - - /* load the persisted audio settings and set them as current */ - CAudioSettings loadedAudioSettings = CMediaSettings::GetInstance().GetDefaultAudioSettings(); - m_databaseDSP.GetActiveDSPSettings(currentFile, loadedAudioSettings); - - CMediaSettings::GetInstance().GetCurrentAudioSettings() = loadedAudioSettings; - type = (AE_DSP_STREAMTYPE) loadedAudioSettings.m_MasterStreamTypeSel; - - /* settings can be saved on next audio stream change */ - m_isValidAudioDSPSettings = true; - } - return type; -} -//@} - -/*! @name Backend methods */ -//@{ - -bool CActiveAEDSP::IsProcessing(void) const -{ - return m_isActive && m_usedProcessesCnt > 0; -} - -bool CActiveAEDSP::IsActivated(void) const -{ - return m_isActive; -} - -int CActiveAEDSP::EnabledAudioDSPAddonAmount(void) const -{ - int iReturn(0); - CSingleLock lock(m_critUpdateSection); - - for (AE_DSP_ADDONMAP_CITR citr = m_addonMap.begin(); citr != m_addonMap.end(); ++citr) - { - if (!CAddonMgr::GetInstance().IsAddonDisabled(citr->second->ID())) - ++iReturn; - } - - return iReturn; -} - -bool CActiveAEDSP::HasEnabledAudioDSPAddons(void) const -{ - return EnabledAudioDSPAddonAmount() > 0; -} - -int CActiveAEDSP::GetEnabledAudioDSPAddons(AE_DSP_ADDONMAP &addons) const -{ - int iReturn(0); - CSingleLock lock(m_critUpdateSection); - - for (AE_DSP_ADDONMAP_CITR citr = m_addonMap.begin(); citr != m_addonMap.end(); ++citr) - { - if (!CAddonMgr::GetInstance().IsAddonDisabled(citr->second->ID())) - { - addons.insert(std::make_pair(citr->second->GetID(), citr->second)); - ++iReturn; - } - } - - return iReturn; -} - -int CActiveAEDSP::ReadyAudioDSPAddonAmount(void) const -{ - int iReturn(0); - CSingleLock lock(m_critUpdateSection); - - for (AE_DSP_ADDONMAP_CITR citr = m_addonMap.begin(); citr != m_addonMap.end(); ++citr) - { - if (citr->second->ReadyToUse()) - ++iReturn; - } - - return iReturn; -} - -bool CActiveAEDSP::HasReadyAudioDSPAddons(void) const -{ - return ReadyAudioDSPAddonAmount() > 0; -} - -bool CActiveAEDSP::IsReadyAudioDSPAddon(int iAddonId) const -{ - AE_DSP_ADDON addon; - return GetReadyAudioDSPAddon(iAddonId, addon); -} - -bool CActiveAEDSP::IsReadyAudioDSPAddon(const AddonPtr &addon) -{ - CSingleLock lock(m_critUpdateSection); - - for (AE_DSP_ADDONMAP_CITR citr = m_addonMap.begin(); citr != m_addonMap.end(); ++citr) - { - if (citr->second->ID() == addon->ID()) - return citr->second->ReadyToUse(); - } - - return false; -} - -int CActiveAEDSP::GetReadyAddons(AE_DSP_ADDONMAP &addons) const -{ - int iReturn(0); - CSingleLock lock(m_critSection); - - for (AE_DSP_ADDONMAP_CITR citr = m_addonMap.begin(); citr != m_addonMap.end(); ++citr) - { - if (citr->second->ReadyToUse()) - { - addons.insert(std::make_pair(citr->second->GetID(), citr->second)); - ++iReturn; - } - } - - return iReturn; -} - -bool CActiveAEDSP::GetReadyAudioDSPAddon(int iAddonId, AE_DSP_ADDON &addon) const -{ - if (GetAudioDSPAddon(iAddonId, addon)) - return addon->ReadyToUse(); - return false; -} - -bool CActiveAEDSP::GetAudioDSPAddonName(int iAddonId, std::string &strName) const -{ - bool bReturn(false); - AE_DSP_ADDON addon; - if ((bReturn = GetReadyAudioDSPAddon(iAddonId, addon)) == true) - strName = addon->GetAudioDSPName(); - - return bReturn; -} - -bool CActiveAEDSP::GetAudioDSPAddon(int iAddonId, AE_DSP_ADDON &addon) const -{ - bool bReturn(false); - if (iAddonId <= AE_DSP_INVALID_ADDON_ID) - return bReturn; - - CSingleLock lock(m_critUpdateSection); - - AE_DSP_ADDONMAP_CITR citr = m_addonMap.find(iAddonId); - if (citr != m_addonMap.end()) - { - addon = citr->second; - bReturn = true; - } - - return bReturn; -} - -bool CActiveAEDSP::GetAudioDSPAddon(const std::string &strId, AddonPtr &addon) const -{ - CSingleLock lock(m_critUpdateSection); - for (AE_DSP_ADDONMAP_CITR citr = m_addonMap.begin(); citr != m_addonMap.end(); ++citr) - { - if (citr->second->ID() == strId) - { - addon = citr->second; - return true; - } - } - return false; -} -//@} - -/*! @name Menu hook methods */ -//@{ -bool CActiveAEDSP::HaveMenuHooks(AE_DSP_MENUHOOK_CAT cat, int iDSPAddonID) -{ - for (AE_DSP_ADDONMAP_CITR citr = m_addonMap.begin(); citr != m_addonMap.end(); ++citr) - { - if (citr->second->ReadyToUse()) - { - if (citr->second->HaveMenuHooks(cat)) - { - if (iDSPAddonID > 0 && citr->second->GetID() == iDSPAddonID) - return true; - else if (iDSPAddonID < 0) - return true; - } - else if (cat == AE_DSP_MENUHOOK_SETTING) - { - AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(citr->second->ID(), addon) && addon->HasSettings()) - return true; - } - } - } - - return false; -} - -bool CActiveAEDSP::GetMenuHooks(int iDSPAddonID, AE_DSP_MENUHOOK_CAT cat, AE_DSP_MENUHOOKS &hooks) -{ - bool bReturn(false); - - if (iDSPAddonID < 0) - return bReturn; - - AE_DSP_ADDON addon; - if (GetReadyAudioDSPAddon(iDSPAddonID, addon) && addon->HaveMenuHooks(cat)) - { - AE_DSP_MENUHOOKS *addonhooks = addon->GetMenuHooks(); - for (unsigned int i = 0; i < addonhooks->size(); ++i) - { - if (cat == AE_DSP_MENUHOOK_ALL || addonhooks->at(i).category == cat) - { - hooks.push_back(addonhooks->at(i)); - bReturn = true; - } - } - } - - return bReturn; -} -//@} - -/*! @name General helper functions */ -//@{ -enum AEChannel CActiveAEDSP::GetKODIChannel(AE_DSP_CHANNEL channel) -{ - switch (channel) - { - case AE_DSP_CH_FL: return AE_CH_FL; - case AE_DSP_CH_FR: return AE_CH_FR; - case AE_DSP_CH_FC: return AE_CH_FC; - case AE_DSP_CH_LFE: return AE_CH_LFE; - case AE_DSP_CH_BL: return AE_CH_BL; - case AE_DSP_CH_BR: return AE_CH_BR; - case AE_DSP_CH_FLOC: return AE_CH_FLOC; - case AE_DSP_CH_FROC: return AE_CH_FROC; - case AE_DSP_CH_BC: return AE_CH_BC; - case AE_DSP_CH_SL: return AE_CH_SL; - case AE_DSP_CH_SR: return AE_CH_SR; - case AE_DSP_CH_TC: return AE_CH_TC; - case AE_DSP_CH_TFL: return AE_CH_TFL; - case AE_DSP_CH_TFC: return AE_CH_TFC; - case AE_DSP_CH_TFR: return AE_CH_TFR; - case AE_DSP_CH_TBL: return AE_CH_TBL; - case AE_DSP_CH_TBC: return AE_CH_TBC; - case AE_DSP_CH_TBR: return AE_CH_TBR; - default: - return AE_CH_NULL; - } -} - -AE_DSP_CHANNEL CActiveAEDSP::GetDSPChannel(enum AEChannel channel) -{ - switch (channel) - { - case AE_CH_FL: return AE_DSP_CH_FL; - case AE_CH_FR: return AE_DSP_CH_FR; - case AE_CH_FC: return AE_DSP_CH_FC; - case AE_CH_LFE: return AE_DSP_CH_LFE; - case AE_CH_BL: return AE_DSP_CH_BL; - case AE_CH_BR: return AE_DSP_CH_BR; - case AE_CH_FLOC: return AE_DSP_CH_FLOC; - case AE_CH_FROC: return AE_DSP_CH_FROC; - case AE_CH_BC: return AE_DSP_CH_BC; - case AE_CH_SL: return AE_DSP_CH_SL; - case AE_CH_SR: return AE_DSP_CH_SR; - case AE_CH_TC: return AE_DSP_CH_TC; - case AE_CH_TFL: return AE_DSP_CH_TFL; - case AE_CH_TFC: return AE_DSP_CH_TFC; - case AE_CH_TFR: return AE_DSP_CH_TFR; - case AE_CH_TBL: return AE_DSP_CH_TBL; - case AE_CH_TBC: return AE_DSP_CH_TBC; - case AE_CH_TBR: return AE_DSP_CH_TBR; - default: - return AE_DSP_CH_INVALID; - } -} - -/*! - * Contains string name id's related to the AE_DSP_ASTREAM_ values - */ -const int CActiveAEDSP::m_StreamTypeNameTable[] = -{ - 15004, //!< "Basic" - 249, //!< "Music" - 157, //!< "Video" - 15016, //!< "Games" - 15005, //!< "Application" - 15006, //!< "Phone" - 15007, //!< "Message" - 14061 //!< "Auto" -}; - -int CActiveAEDSP::GetStreamTypeName(unsigned int streamType) -{ - if (streamType > AE_DSP_ASTREAM_AUTO) - return -1; - return m_StreamTypeNameTable[streamType]; -} -//@} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,545 +0,0 @@ -/* - * Copyright (C) 2012-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "ActiveAEDSPDatabase.h" -#include "ActiveAEDSP.h" - -#include "URL.h" -#include "dbwrappers/dataset.h" -#include "settings/AdvancedSettings.h" -#include "settings/MediaSettings.h" -#include "utils/log.h" -#include "utils/StringUtils.h" - -using namespace dbiplus; -using namespace ActiveAE; -using namespace ADDON; - -#define ADSPDB_DEBUGGING 0 - -bool CActiveAEDSPDatabase::Open() -{ - return CDatabase::Open(g_advancedSettings.m_databaseADSP); -} - -void CActiveAEDSPDatabase::CreateTables() -{ - BeginTransaction(); - CLog::Log(LOGINFO, "Audio DSP - %s - creating tables", __FUNCTION__); - - CLog::Log(LOGDEBUG, "Audio DSP - %s - creating table 'addons'", __FUNCTION__); - m_pDS->exec( - "CREATE TABLE addons (" - "idAddon integer primary key, " - "sName varchar(64), " - "sUid varchar(32)" - ")" - ); - - CLog::Log(LOGDEBUG, "Audio DSP - %s - creating table 'modes'", __FUNCTION__); - m_pDS->exec( - "CREATE TABLE modes (" - "idMode integer primary key, " - "iType integer, " - "iPosition integer, " - "iStreamTypeFlags integer, " - "iBaseType integer, " - "bIsEnabled bool, " - "sOwnIconPath varchar(255), " - "sOverrideIconPath varchar(255), " - "iModeName integer, " - "iModeSetupName integer, " - "iModeHelp integer, " - "iModeDescription integer, " - "sAddonModeName varchar(64), " - "iAddonId integer, " - "iAddonModeNumber integer, " - "bHasSettings bool" - ")" - ); - - CLog::Log(LOGDEBUG, "Audio DSP - %s - create settings table", __FUNCTION__); - m_pDS->exec( - "CREATE TABLE settings (" - "id integer primary key, " - "strPath varchar(255), " - "strFileName varchar(255), " - "MasterStreamTypeSel integer, " - "MasterStreamType integer, " - "MasterBaseType integer, " - "MasterModeId integer" - ")" - ); - - // disable all Audio DSP add-on when started the first time - ADDON::VECADDONS addons; - if (CAddonMgr::GetInstance().GetAddons(ADDON_ADSPDLL, addons, true)) - { - for (IVECADDONS it = addons.begin(); it != addons.end(); ++it) - CAddonMgr::GetInstance().DisableAddon(it->get()->ID()); - } -} - -void CActiveAEDSPDatabase::CreateAnalytics() -{ - CLog::Log(LOGINFO, "Audio DSP - %s - creating indices", __FUNCTION__); - m_pDS->exec("CREATE UNIQUE INDEX idx_mode_iAddonId_iAddonModeNumber on modes(iAddonId, iAddonModeNumber);"); - m_pDS->exec("CREATE UNIQUE INDEX ix_settings ON settings ( id )\n"); -} - -void CActiveAEDSPDatabase::UpdateTables(int iVersion) -{ -} - -/********** Mode methods **********/ - -bool CActiveAEDSPDatabase::ContainsModes(int modeType) -{ - return !GetSingleValue(PrepareSQL("SELECT 1 FROM modes WHERE modes.iType='%i'", modeType)).empty(); -} - -bool CActiveAEDSPDatabase::DeleteModes(void) -{ - CLog::Log(LOGDEBUG, "Audio DSP - %s - deleting all modes from the database", __FUNCTION__); - return DeleteValues("modes"); -} - -bool CActiveAEDSPDatabase::DeleteModes(int modeType) -{ - /* invalid addon Id */ - if (modeType <= 0) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid mode type id: %i", __FUNCTION__, modeType); - return false; - } - - CLog::Log(LOGDEBUG, "Audio DSP - %s - deleting all modes from type '%i' from the database", __FUNCTION__, modeType); - - Filter filter; - filter.AppendWhere(PrepareSQL("iType = %u", modeType)); - - return DeleteValues("modes", filter); -} - -bool CActiveAEDSPDatabase::DeleteAddonModes(int addonId) -{ - /* invalid addon Id */ - if (addonId <= 0) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid add-on id: %i", __FUNCTION__, addonId); - return false; - } - - CLog::Log(LOGDEBUG, "Audio DSP - %s - deleting all modes from add-on '%i' from the database", __FUNCTION__, addonId); - - Filter filter; - filter.AppendWhere(PrepareSQL("iAddonId = %u", addonId)); - - return DeleteValues("modes", filter); -} - -bool CActiveAEDSPDatabase::DeleteMode(const CActiveAEDSPMode &mode) -{ - /* invalid mode */ - if (mode.ModeID() <= 0) - return false; - - CLog::Log(LOGDEBUG, "Audio DSP - %s - deleting mode '%s' from the database", __FUNCTION__, mode.AddonModeName().c_str()); - - Filter filter; - filter.AppendWhere(PrepareSQL("idMode = %u", mode.ModeID())); - - return DeleteValues("modes", filter); -} - -bool CActiveAEDSPDatabase::PersistModes(std::vector &modes, int modeType) -{ - bool bReturn(true); - - for (unsigned int iModePtr = 0; iModePtr < modes.size(); ++iModePtr) - { - CActiveAEDSPModePtr member = modes.at(iModePtr); - if (!member->IsInternal() && (member->IsChanged() || member->IsNew())) - { - bReturn &= AddUpdateMode(*member); - } - } - - bReturn &= CommitInsertQueries(); - - return bReturn; -} - -bool CActiveAEDSPDatabase::UpdateMode(int modeType, bool active, int addonId, int addonModeNumber, int listNumber) -{ - return ExecuteQuery(PrepareSQL("UPDATE modes SET iPosition=%i,bIsEnabled=%i WHERE modes.iAddonId=%i AND modes.iAddonModeNumber=%i AND modes.iType=%i", - listNumber, - (active ? 1 : 0), - addonId, - addonModeNumber, - modeType)); -} - -bool CActiveAEDSPDatabase::AddUpdateMode(CActiveAEDSPMode &mode) -{ - bool bReturn(true); - - try - { - if (mode.IsInternal()) - return false; - - if (NULL == m_pDB.get()) return false; - if (NULL == m_pDS.get()) return false; - std::string strSQL = PrepareSQL("SELECT * FROM modes WHERE modes.iAddonId=%i AND modes.iAddonModeNumber=%i AND modes.iType=%i", mode.AddonID(), mode.AddonModeNumber(), mode.ModeType()); - - m_pDS->query( strSQL ); - if (m_pDS->num_rows() > 0) - { - /* get user selected settings */ - mode.m_iModeId = m_pDS->fv("idMode").get_asInt(); - mode.m_iModePosition = m_pDS->fv("iPosition").get_asInt(); - mode.m_iBaseType = (AE_DSP_BASETYPE)m_pDS->fv("iBaseType").get_asInt(); - mode.m_bIsEnabled = m_pDS->fv("bIsEnabled").get_asBool(); - m_pDS->close(); - - /* update addon related settings */ - strSQL = PrepareSQL( - "UPDATE modes set " - "iStreamTypeFlags=%i, " - "sOwnIconPath='%s', " - "sOverrideIconPath='%s', " - "iModeName=%i, " - "iModeSetupName=%i, " - "iModeHelp=%i, " - "iModeDescription=%i, " - "sAddonModeName='%s', " - "bHasSettings=%i " - "WHERE modes.iAddonId=%i AND modes.iAddonModeNumber=%i AND modes.iType=%i", - mode.StreamTypeFlags(), - mode.IconOwnModePath().c_str(), - mode.IconOverrideModePath().c_str(), - mode.ModeName(), - mode.ModeSetupName(), - mode.ModeHelp(), - mode.ModeDescription(), - mode.AddonModeName().c_str(), - (mode.HasSettingsDialog() ? 1 : 0), - mode.AddonID(), mode.AddonModeNumber(), mode.ModeType()); - bReturn = m_pDS->exec(strSQL); - } - else - { // add the items - m_pDS->close(); - strSQL = PrepareSQL( - "INSERT INTO modes (" - "iType, " - "iPosition, " - "iStreamTypeFlags, " - "iBaseType, " - "bIsEnabled, " - "sOwnIconPath, " - "sOverrideIconPath, " - "iModeName, " - "iModeSetupName, " - "iModeHelp, " - "iModeDescription, " - "sAddonModeName, " - "iAddonId, " - "iAddonModeNumber, " - "bHasSettings) " - "VALUES (%i, %i, %i, %i, %i, '%s', '%s', %i, %i, %i, %i, '%s', %i, %i, %i)", - mode.ModeType(), - mode.ModePosition(), - mode.StreamTypeFlags(), - mode.BaseType(), - (mode.IsEnabled() ? 1 : 0), - mode.IconOwnModePath().c_str(), - mode.IconOverrideModePath().c_str(), - mode.ModeName(), - mode.ModeSetupName(), - mode.ModeHelp(), - mode.ModeDescription(), - mode.AddonModeName().c_str(), - mode.AddonID(), - mode.AddonModeNumber(), - (mode.HasSettingsDialog() ? 1 : 0)); - bReturn = m_pDS->exec(strSQL); - } - } - catch (...) - { - CLog::Log(LOGERROR, "Audio DSP - %s - (Addon='%i', Mode='%i', Name: %s) failed", __FUNCTION__, mode.AddonID(), mode.AddonModeNumber(), mode.AddonModeName().c_str()); - } - return bReturn; -} - -int CActiveAEDSPDatabase::GetModeId(const CActiveAEDSPMode &mode) -{ - std::string id = GetSingleValue(PrepareSQL("SELECT * from modes WHERE modes.iAddonId=%i and modes.iAddonModeNumber=%i and modes.iType=%i", mode.AddonID(), mode.AddonModeNumber(), mode.ModeType())); - if (id.empty()) - return -1; - return strtol(id.c_str(), NULL, 10); -} - -int CActiveAEDSPDatabase::GetModes(AE_DSP_MODELIST &results, int modeType) -{ - int iReturn(0); - - std::string strQuery=PrepareSQL("SELECT * FROM modes WHERE modes.iType=%i ORDER BY iPosition", modeType); - - m_pDS->query( strQuery ); - if (m_pDS->num_rows() > 0) - { - try - { - while (!m_pDS->eof()) - { - CActiveAEDSPModePtr mode = CActiveAEDSPModePtr(new CActiveAEDSPMode()); - - mode->m_iModeId = m_pDS->fv("idMode").get_asInt(); - mode->m_iModeType = (AE_DSP_MODE_TYPE)m_pDS->fv("iType").get_asInt(); - mode->m_iModePosition = m_pDS->fv("iPosition").get_asInt(); - mode->m_iStreamTypeFlags = m_pDS->fv("iStreamTypeFlags").get_asInt(); - mode->m_iBaseType = (AE_DSP_BASETYPE)m_pDS->fv("iBaseType").get_asInt(); - mode->m_bIsEnabled = m_pDS->fv("bIsEnabled").get_asBool(); - mode->m_strOwnIconPath = m_pDS->fv("sOwnIconPath").get_asString(); - mode->m_strOverrideIconPath = m_pDS->fv("sOverrideIconPath").get_asString(); - mode->m_iModeName = m_pDS->fv("iModeName").get_asInt(); - mode->m_iModeSetupName = m_pDS->fv("iModeSetupName").get_asInt(); - mode->m_iModeHelp = m_pDS->fv("iModeHelp").get_asInt(); - mode->m_iModeDescription = m_pDS->fv("iModeDescription").get_asInt(); - mode->m_strModeName = m_pDS->fv("sAddonModeName").get_asString(); - mode->m_iAddonId = m_pDS->fv("iAddonId").get_asInt(); - mode->m_iAddonModeNumber = m_pDS->fv("iAddonModeNumber").get_asInt(); - mode->m_bHasSettingsDialog = m_pDS->fv("bHasSettings").get_asBool(); - -#ifdef ADSPDB_DEBUGGING - CLog::Log(LOGDEBUG, "Audio DSP - %s - mode '%s' loaded from the database", __FUNCTION__, mode->m_strModeName.c_str()); -#endif - AE_DSP_ADDON addon; - if (CActiveAEDSP::GetInstance().GetAudioDSPAddon(mode->m_iAddonId, addon)) - results.push_back(AE_DSP_MODEPAIR(mode, addon)); - - m_pDS->next(); - ++iReturn; - } - m_pDS->close(); - } - catch (...) - { - CLog::Log(LOGERROR, "Audio DSP - %s - couldn't load modes from the database", __FUNCTION__); - } - } - else - { - CLog::Log(LOGERROR, "Audio DSP - %s - query failed", __FUNCTION__); - } - - m_pDS->close(); - return iReturn; -} - -/********** Settings methods **********/ - -bool CActiveAEDSPDatabase::DeleteActiveDSPSettings() -{ - CLog::Log(LOGDEBUG, "Audio DSP - %s - deleting all active dsp settings from the database", __FUNCTION__); - return DeleteValues("settings"); -} - -bool CActiveAEDSPDatabase::DeleteActiveDSPSettings(const CFileItem &item) -{ - std::string strPath, strFileName; - URIUtils::Split(item.GetPath(), strPath, strFileName); - return ExecuteQuery(PrepareSQL("DELETE FROM settings WHERE settings.strPath='%s' and settings.strFileName='%s'", strPath.c_str() , strFileName.c_str())); -} - -bool CActiveAEDSPDatabase::GetActiveDSPSettings(const CFileItem &item, CAudioSettings &settings) -{ - try - { - if (NULL == m_pDB.get()) return false; - if (NULL == m_pDS.get()) return false; - std::string strPath, strFileName; - URIUtils::Split(item.GetPath(), strPath, strFileName); - std::string strSQL=PrepareSQL("SELECT * FROM settings WHERE settings.strPath='%s' and settings.strFileName='%s'", strPath.c_str() , strFileName.c_str()); - - m_pDS->query( strSQL ); - if (m_pDS->num_rows() > 0) - { // get the audio dsp settings info - settings.m_MasterStreamTypeSel = m_pDS->fv("MasterStreamTypeSel").get_asInt(); - int type = m_pDS->fv("MasterStreamType").get_asInt(); - int base = m_pDS->fv("MasterBaseType").get_asInt(); - settings.m_MasterStreamType = type; - settings.m_MasterStreamBase = base; - settings.m_MasterModes[type][base] = m_pDS->fv("MasterModeId").get_asInt(); - - /*! if auto mode is selected, copy the identifier of previous used processor to the auto mode entry */ - settings.m_MasterModes[settings.m_MasterStreamTypeSel][base] = settings.m_MasterModes[type][base]; - - m_pDS->close(); - return true; - } - m_pDS->close(); - } - catch (...) - { - CLog::Log(LOGERROR, "%s failed", __FUNCTION__); - } - return false; -} - -void CActiveAEDSPDatabase::SetActiveDSPSettings(const CFileItem &item, const CAudioSettings &setting) -{ - try - { - if (NULL == m_pDB.get()) return ; - if (NULL == m_pDS.get()) return ; - std::string strPath, strFileName; - URIUtils::Split(item.GetPath(), strPath, strFileName); - std::string strSQL = StringUtils::Format("select * from settings WHERE settings.strPath='%s' and settings.strFileName='%s'", strPath.c_str() , strFileName.c_str()); - m_pDS->query( strSQL ); - if (m_pDS->num_rows() > 0) - { - m_pDS->close(); - // update the item - strSQL=PrepareSQL( - "update settings set " - "MasterStreamTypeSel=%i," - "MasterStreamType=%i," - "MasterBaseType=%i," - "MasterModeId=%i," - "WHERE settings.strPath='%s' and settings.strFileName='%s'\n", - setting.m_MasterStreamTypeSel, - setting.m_MasterStreamType, - setting.m_MasterStreamBase, - setting.m_MasterModes[setting.m_MasterStreamType][setting.m_MasterStreamBase], - strPath.c_str(), - strFileName.c_str()); - m_pDS->exec(strSQL); - return ; - } - else - { // add the items - m_pDS->close(); - strSQL= "INSERT INTO settings (" - "id, " - "strPath," - "strFileName," - "MasterStreamTypeSel," - "MasterStreamType," - "MasterBaseType," - "MasterModeId) " - "VALUES "; - strSQL += PrepareSQL("(NULL,'%s','%s',%i,%i,%i,%i)", - strPath.c_str(), - strFileName.c_str(), - setting.m_MasterStreamTypeSel, - setting.m_MasterStreamType, - setting.m_MasterStreamBase, - setting.m_MasterModes[setting.m_MasterStreamType][setting.m_MasterStreamBase]); - m_pDS->exec(strSQL); - } - } - catch (...) - { - CLog::Log(LOGERROR, "%s (%s) failed", __FUNCTION__, item.GetPath().c_str()); - } -} - -void CActiveAEDSPDatabase::EraseActiveDSPSettings() -{ - CLog::Log(LOGINFO, "Deleting dsp settings information for all files"); - ExecuteQuery(PrepareSQL("DELETE from settings")); -} - -void CActiveAEDSPDatabase::SplitPath(const std::string& strFileNameAndPath, std::string& strPath, std::string& strFileName) -{ - if (URIUtils::IsStack(strFileNameAndPath) || StringUtils::StartsWithNoCase(strFileNameAndPath, "rar://") || StringUtils::StartsWithNoCase(strFileNameAndPath, "zip://")) - { - URIUtils::GetParentPath(strFileNameAndPath,strPath); - strFileName = strFileNameAndPath; - } - else if (URIUtils::IsPlugin(strFileNameAndPath)) - { - CURL url(strFileNameAndPath); - strPath = url.GetWithoutFilename(); - strFileName = strFileNameAndPath; - } - else - URIUtils::Split(strFileNameAndPath,strPath, strFileName); -} - -/********** Audio DSP add-on methods **********/ - -bool CActiveAEDSPDatabase::DeleteAddons() -{ - CLog::Log(LOGDEBUG, "Audio DSP - %s - deleting all add-on's from the database", __FUNCTION__); - - return DeleteValues("addons"); -} - -bool CActiveAEDSPDatabase::Delete(const std::string &strAddonUid) -{ - /* invalid addon uid */ - if (strAddonUid.empty()) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid addon uid", __FUNCTION__); - return false; - } - - Filter filter; - filter.AppendWhere(PrepareSQL("sUid = '%s'", strAddonUid.c_str())); - - return DeleteValues("addons", filter); -} - -int CActiveAEDSPDatabase::GetAudioDSPAddonId(const std::string &strAddonUid) -{ - std::string strWhereClause = PrepareSQL("sUid = '%s'", strAddonUid.c_str()); - std::string strValue = GetSingleValue("addons", "idAddon", strWhereClause); - - if (strValue.empty()) - return -1; - - return strtol(strValue.c_str(), NULL, 10); -} - -int CActiveAEDSPDatabase::Persist(const AddonPtr& addon) -{ - int iReturn(-1); - - /* invalid addon uid or name */ - if (addon->Name().empty() || addon->ID().empty()) - { - CLog::Log(LOGERROR, "Audio DSP - %s - invalid add-on uid or name", __FUNCTION__); - return iReturn; - } - - std::string strQuery = PrepareSQL("REPLACE INTO addons (sName, sUid) VALUES ('%s', '%s');", - addon->Name().c_str(), addon->ID().c_str()); - - if (ExecuteQuery(strQuery)) - iReturn = (int) m_pDS->lastinsertid(); - - return iReturn; -} - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,216 +0,0 @@ -#pragma once -/* - * Copyright (C) 2012-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "ActiveAEDSPMode.h" - -class CAudioSettings; - -namespace ActiveAE -{ - class CActiveAEDSPAddon; - class CActiveAEDSPProcess; - - /** The audio DSP database */ - - class CActiveAEDSPDatabase : public CDatabase - { - public: - /*! - * @brief Create a new instance of the audio DSP database. - */ - CActiveAEDSPDatabase(void) {}; - virtual ~CActiveAEDSPDatabase(void) {}; - - /*! - * @brief Open the database. - * @return True if it was opened successfully, false otherwise. - */ - virtual bool Open(); - - /*! - * @brief Get the minimal database version that is required to operate correctly. - * @return The minimal database version. - */ - virtual int GetMinVersion() const { return 1; }; - - /*! - * @brief Get the default sqlite database filename. - * @return The default filename. - */ - const char *GetBaseDBName() const { return "ADSP"; }; - - /*! @name mode methods */ - //@{ - /*! - * @brief Used to check for present mode types - * @param modeType The mode type identfier - * @return True if modes present of given type - */ - bool ContainsModes(int modeType); - - /*! - * @brief Remove all modes from the database. - * @return True if all modes were removed, false otherwise. - */ - bool DeleteModes(void); - - /*! - * @brief Remove all modes from the database of a type. - * @param modeType The mode type identfier of functions to delete. - * @return True if the modes were deleted, false otherwise. - */ - bool DeleteModes(int modeType); - - /*! - * @brief Remove all modes from a add-on from the database. - * @param addonId The add-on identifier to delete the modes for. - * @return True if the modes were deleted, false otherwise. - */ - bool DeleteAddonModes(int addonId); - - /*! - * @brief Remove a mode entry from the database - * @param mode The mode to remove. - * @return True if the mode was removed, false otherwise. - */ - bool DeleteMode(const CActiveAEDSPMode &mode); - - /*! - * @brief Add or update mode entries in the database - * @param modes The modes to persist. - * @param modeType If true, don't write immediately - * @return True when persisted or queued, false otherwise. - */ - bool PersistModes(std::vector &modes, int modeType); - - /*! - * @brief Update user selectable mode settings inside database - * @param modeType the mode type to get - * @param active true if the mode is enabled - * @param addonId the addon id of this mode - * @param addonModeNumber the from addon set mode number - * @param listNumber the list number on processing chain - * @return True if the modes were updated, false otherwise. - */ - bool UpdateMode(int modeType, bool active, int addonId, int addonModeNumber, int listNumber); - - /*! - * @brief Add or if present update mode inside database - * @param addon The add-on to check the modes for. - * @return True if the modes were updated or added, false otherwise. - */ - bool AddUpdateMode(CActiveAEDSPMode &mode); - - /*! - * @brief Get id of mode inside database - * @param mode The mode to check for inside the database - * @return The id or -1 if not found - */ - int GetModeId(const CActiveAEDSPMode &mode); - - /*! - * @brief Get the list of modes from type on database - * @param results The mode group to store the results in. - * @param modeType the mode type to get - * @return The amount of modes that were added. - */ - int GetModes(AE_DSP_MODELIST &results, int modeType); - //@} - - /*! @name Add-on methods */ - //@{ - /*! - * @brief Remove all add-on information from the database. - * @return True if all add-on's were removed successfully. - */ - bool DeleteAddons(); - - /*! - * @brief Remove a add-on from the database - * @param strAddonUid The unique ID of the add-on. - * @return True if the add-on was removed successfully, false otherwise. - */ - bool Delete(const std::string &strAddonUid); - - /*! - * @brief Get the database ID of a add-on. - * @param strAddonUid The unique ID of the add-on. - * @return The database ID of the add-on or -1 if it wasn't found. - */ - int GetAudioDSPAddonId(const std::string &strAddonUid); - - /*! - * @brief Add a add-on to the database if it's not already in there. - * @param addon The pointer to the addon class - * @return The database ID of the client. - */ - int Persist(const ADDON::AddonPtr &addon); - //@} - - /*! @name Settings methods */ - //@{ - - /*! - * @brief Remove all active dsp settings from the database. - * @return True if all dsp data were removed successfully, false if not. - */ - bool DeleteActiveDSPSettings(); - - /*! - * @brief Remove active dsp settings from the database for file. - * @return True if dsp data were removed successfully, false if not. - */ - bool DeleteActiveDSPSettings(const CFileItem &item); - - /*! - * @brief GetVideoSettings() obtains any saved video settings for the current file. - * @return Returns true if the settings exist, false otherwise. - */ - bool GetActiveDSPSettings(const CFileItem &item, CAudioSettings &settings); - - /*! - * @brief Sets the settings for a particular used file - */ - void SetActiveDSPSettings(const CFileItem &item, const CAudioSettings &settings); - - /*! - * @brief EraseActiveDSPSettings() Erases the dsp Settings table and reconstructs it - */ - void EraseActiveDSPSettings(); - //@} - - private: - /*! - * @brief Create the audio DSP database tables. - */ - virtual void CreateTables(); - virtual void CreateAnalytics(); - - /*! - * @brief Update an old version of the database. - * @param version The version to update the database from. - */ - virtual void UpdateTables(int version); - virtual int GetSchemaVersion() const { return 0; } - - void SplitPath(const std::string& strFileNameAndPath, std::string& strPath, std::string& strFileName); - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,468 +0,0 @@ -#pragma once -/* - * Copyright (C) 2010-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "addons/AddonDatabase.h" -#include "cores/AudioEngine/Utils/AEAudioFormat.h" -#include "cores/AudioEngine/Interfaces/AE.h" -#include "threads/CriticalSection.h" -#include "threads/Thread.h" -#include "utils/Observer.h" -#include "messaging/IMessageTarget.h" - -#include "ActiveAEDSPAddon.h" -#include "ActiveAEDSPDatabase.h" -#include "ActiveAEDSPMode.h" - -#define ACTIVE_AE_DSP_STATE_OFF 0 -#define ACTIVE_AE_DSP_STATE_ON 1 - -#define ACTIVE_AE_DSP_SYNC_ACTIVATE 0 -#define ACTIVE_AE_DSP_ASYNC_ACTIVATE 1 - -extern "C" { -#include "libavcodec/avcodec.h" -} - -class CAction; - -namespace ActiveAE -{ - class CActiveAEDSPProcess; - class CActiveAEDSPAddon; - - typedef std::shared_ptr CActiveAEDSPProcessPtr; - typedef std::map< int, AE_DSP_ADDON > AE_DSP_ADDONMAP; - typedef std::map< int, AE_DSP_ADDON >::iterator AE_DSP_ADDONMAP_ITR; - typedef std::map< int, AE_DSP_ADDON >::const_iterator AE_DSP_ADDONMAP_CITR; - - #define g_AEDSPManager CActiveAEDSP::GetInstance() - - //@{ - /*! - * Static dsp handling class - */ - class CActiveAEDSP : public ADDON::IAddonMgrCallback, - public ISettingCallback, - public Observer, - private CThread - { - /*! @name Master audio dsp control class */ - //@{ - private: - /*! - * @brief Create a new CActiveAEDSP instance, which handles all audio DSP related operations in KODI. - */ - CActiveAEDSP(void); - - public: - /*! - * @brief Stop the ActiveAEDSP and destroy all objects it created. - */ - virtual ~CActiveAEDSP(); - - /*! - * @brief Get the instance of the ActiveAEDSP. - * @return The ActiveAEDSP instance. - */ - static CActiveAEDSP &GetInstance(); - //@} - - /*! @name initialization and configuration methods */ - //@{ - /*! - * @brief Activate the addon dsp processing and start the backend info update thread. - */ - void Activate(bool bAsync = false); - - /*! - * @brief Stops dsp processing and the backend info update thread. - */ - void Deactivate(void); - - /*! - * @brief Delete all objects and processing classes. - */ - void Cleanup(void); - - /*! - * @brief Reset the audio dsp database to it's initial state and delete all the data inside. - */ - void ResetDatabase(void); - - /*! - * @brief Check whether an add-on can be upgraded or installed without restarting the audio dsp, when the add-on is in use - * @param strAddonId The add-on to check. - * @return True when the add-on can be installed, false otherwise. - */ - bool InstallAddonAllowed(const std::string& strAddonId) const; - - /*! - * @brief Mark an add-on as outdated so it will be upgrade when it's possible again - * @param strAddonId The add-on to mark as outdated - */ - void MarkAsOutdated(const std::string& strAddonId); - - /*! - * @brief Mark an add-on as outdated so it will be upgrade when it's possible again - * @param outdatedAddons The generated list of outdated add-on's - * @return True when outdated addons are present. - */ - bool HasOutdatedAddons(std::vector &outdatedAddons); - - /*! - * @brief Get the audio dsp database pointer. - * @return The audio dsp database. - */ - CActiveAEDSPDatabase *GetADSPDatabase(void) { return &m_databaseDSP; } - //@} - - /*! @name Settings and action callback methods */ - //@{ - virtual void OnSettingAction(const CSetting *setting) override; - //@} - - /*! @name Backend methods */ - //@{ - /*! - * @return True when processing is possible - */ - bool IsActivated(void) const; - - /*! - * @return True when processing is active - */ - bool IsProcessing(void) const; - - /*! - * @brief Get all ready audio dsp addons. - * @param addons Store the active addons in this map. - * @return The amount of added audio dsp addons. - */ - int GetReadyAddons(AE_DSP_ADDONMAP &addons) const; - //@} - - /*! @name addon installation callback methods */ - //@{ - /*! - * @brief Restart a single audio dsp addon add-on. - * @param addon The add-on to restart. - * @param bDataChanged True if the addon's data changed, false otherwise (unused). - * @return True if the audio dsp addon was found and restarted, false otherwise. - */ - virtual bool RequestRestart(ADDON::AddonPtr addon, bool bDataChanged) override; - - /*! - * @brief Remove a single audio dsp add-on. - * @param addon The add-on to remove. - * @return True if it was found and removed, false otherwise. - */ - virtual bool RequestRemoval(ADDON::AddonPtr addon) override; - - /*! - * @brief Checks whether an add-on is loaded - * @param strAddonId The add-on id to check - * @return True when in use, false otherwise - */ - bool IsInUse(const std::string& strAddonId) const; - - /*! - * @brief Stop a audio dsp addon. - * @param addon The dsp addon to stop. - * @param bRestart If true, restart the addon. - * @return True if the it was found, false otherwise. - */ - bool StopAudioDSPAddon(ADDON::AddonPtr addon, bool bRestart); - - /*! - * @brief Notify about required messages - * @param obs - * @param msg The observed message type - */ - void Notify(const Observable &obs, const ObservableMessage msg) override; - - /*! - * @return The amount of enabled audio dsp addons. - */ - int EnabledAudioDSPAddonAmount(void) const; - - /*! - * @return True when at least one audio dsp addon is known and enabled, false otherwise. - */ - bool HasEnabledAudioDSPAddons(void) const; - - /*! - * @brief Get all enabled audio dsp addons. - * @param addons Store the enabled addons in this map. - * @return The amount of enabled audio addons. - */ - int GetEnabledAudioDSPAddons(AE_DSP_ADDONMAP &addons) const; - - /*! - * @return The amount of ready audio dsp addons on current stream. - */ - int ReadyAudioDSPAddonAmount(void) const; - - /*! - * @brief Check whether there are any ready audio dsp addons. - * @return True if at least one audio dsp addon is ready. - */ - bool HasReadyAudioDSPAddons(void) const; - - /*! - * @brief Check whether a audio dsp addon ID points to a valid and ready add-on. - * @param iAddonId The addon ID. - * @return True when the addon ID is valid and ready, false otherwise. - */ - bool IsReadyAudioDSPAddon(int iAddonId) const; - - /*! - * @brief Check whether a audio dsp addon pointer points to a valid and ready add-on. - * @param addon The addon addon pointer. - * @return True when the addon pointer is valid and ready, false otherwise. - */ - bool IsReadyAudioDSPAddon(const ADDON::AddonPtr& addon); - - /*! - * @brief Get the instance of the audio dsp addon. - * @param strId The string id of the addon to get. - * @param addon The audio dsp addon. - * @return True if the addon was found, false otherwise. - */ - bool GetAudioDSPAddon(const std::string &strId, ADDON::AddonPtr &addon) const; - - /*! - * @brief Get the instance of the audio dsp addon. - * @param iAddonId The id of the addon to get. - * @param addon The audio dsp addon. - * @return True if the addon was found, false otherwise. - */ - bool GetAudioDSPAddon(int iAddonId, AE_DSP_ADDON &addon) const; - - /*! - * @brief Get the friendly name for the audio dsp addon with the given id. - * @param iAddonId The id of the addon. - * @param strName The friendly name of the audio dsp addon or an empty string when it wasn't found. - * @return True if it was found, false otherwise. - */ - bool GetAudioDSPAddonName(int iAddonId, std::string &strName) const; - //@} - - /*! @name GUIInfoManager calls */ - //@{ - /*! - * @brief Get a GUIInfoManager boolean. - * @param dwInfo The boolean to get. - * @return The requested boolean or false if it wasn't found. - */ - bool TranslateBoolInfo(DWORD dwInfo) const; - - /*! - * @brief Get a GUIInfoManager character string. - * @param dwInfo The string to get. - * @return The requested string or an empty one if it wasn't found. - */ - bool TranslateCharInfo(DWORD dwInfo, std::string &strValue) const; - //@} - - /*! @name Current processing streams control function methods */ - //@{ - /*!> - * Get the channel position defination for given channel layout - * @param stdLayout The layout identifier - * @return the from given identifier set channel information class - */ - CAEChannelInfo GetInternalChannelLayout(AEStdChLayout stdLayout); - - /*!> - * Create the dsp processing with check of all addons about the used input and output audio format. - * @param streamId The id of this stream - * @param inputFormat The used audio stream input format - * @param outputFormat Audio output format which is needed to send to the sinks - * @param quality The requested quality from settings - * @param wasActive if it is true a recreation of present stream control becomes performed (process class becomes not deleted) - * @return True if the dsp processing becomes available - */ - bool CreateDSPs(unsigned int &streamId, CActiveAEDSPProcessPtr &process, const AEAudioFormat &inputFormat, const AEAudioFormat &outputFormat, - bool upmix, AEQuality quality, enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type, - int profile, bool wasActive = false); - - /*!> - * Destroy all allocated dsp addons for this stream id and stops the processing. - * @param streamId The id of this stream - */ - void DestroyDSPs(unsigned int streamId); - - /*!> - * Get the dsp processing class of given stream id - * @param streamId The id of this stream - */ - CActiveAEDSPProcessPtr GetDSPProcess(unsigned int streamId); - - /*!> - * Get the amount of used dsp process stream handlers - * @return Returns amount of processes - */ - unsigned int GetProcessingStreamsAmount(void); - - /*!> - * Get the currently active processing stream id - * @return Stream id, or max unsigned int value (-1) if not active - */ - unsigned int GetActiveStreamId(void); - - /*!> - * Used to get all available modes on currently enabled add-ons - * It is used from CActiveAEDSPProcess to get a sorted modes list for a processing - * over the add-ons, several call to the same addon is possible with different mode id's. - * @param modeType The type to get - * @return modes Pointer to a buffer array where all available modes of type written in - */ - const AE_DSP_MODELIST &GetAvailableModes(AE_DSP_MODE_TYPE modeType); - - /*! - * @brief Load the settings for the current audio from the database. - * @return If it was present inside settings it return the type of this settings - */ - AE_DSP_STREAMTYPE LoadCurrentAudioSettings(void); - - /*! - * @brief Perfoms a update of all processing calls over the add-ons - * @param bAsync if true the update becomes performed on background - */ - void TriggerModeUpdate(bool bAsync = true); - //@} - - /*! @name Menu hook methods */ - //@{ - /*! - * @brief Check whether a audio dsp addon has any audio DSP specific menu entries. - * @param cat The category to know - * @param iAddonId The ID of the addon to get the menu entries for. Get the menu for the active channel if iAddonId < 0. - * @return True if the dsp addon has any menu hooks, false otherwise. - * @note The main usage for this method is to have bigger modifiable addon setting dialogs which make the usage of - * standard addon settings dialog as option to it - * see kodi_adsp_types.h for available types - */ - bool HaveMenuHooks(AE_DSP_MENUHOOK_CAT cat, int iAddonId = -1); - - /*! - * @brief Get the menu hooks for a dsp addon. - * @param iDSPAddonID The dsp addon to get the hooks for. - * @param cat The requested menu category - * @param hooks The container to add the hooks to. - * @return True if the hooks were added successfully (if any), false otherwise. - * @note The main usage for this method is to have bigger modifiable addon setting dialogs, the basic addon settings dialog - * can't be opened with it (is only in the menu list from ProcessMenuHooks) - * see kodi_adsp_types.h for available types - */ - bool GetMenuHooks(int iDSPAddonID, AE_DSP_MENUHOOK_CAT cat, AE_DSP_MENUHOOKS &hooks); - //@} - - /*! @name General helper functions */ - //@{ - /*! - * @brief Translate audio dsp channel flag to KODI channel flag - */ - static enum AEChannel GetKODIChannel(AE_DSP_CHANNEL channel); - - /*! - * @brief Translate KODI channel flag to audio dsp channel flag - */ - static AE_DSP_CHANNEL GetDSPChannel(enum AEChannel channel); - - /*! - * @brief Get name label id to given stream type id - */ - static int GetStreamTypeName(unsigned int streamType); - //@} - - protected: - /*! - * @brief Thread to which updates the backend information - */ - virtual void Process(void) override; - - private: - /*! - * @brief Update add-ons from the AddonManager - * @return True when updated, false otherwise - */ - bool UpdateAddons(void); - - /*! - * @brief Show a dialog to guide new users who have no dsp addons enabled. - */ - void ShowDialogNoAddonsEnabled(void); - - /*! - * @brief Check whether a dsp addon is registered. - * @param addon The dsp addon to check. - * @return True if this addon is registered, false otherwise. - */ - bool IsKnownAudioDSPAddon(const ADDON::AddonPtr& addon) const; - - /*! - * @brief Check whether there are any new audio dsp add-ons enabled or whether any of the known addons has been disabled. - * @param bInitialiseAllAudioDSPAddons True to initialise all dsp addons, false to only initialise new dsp addons. - * @return True if all addons were updated successfully, false otherwise. - */ - bool UpdateAndInitialiseAudioDSPAddons(bool bInitialiseAllAudioDSPAddons = false); - - /*! - * @brief Initialise and connect a dsp addon. - * @param addon The dsp addon to initialise. - * @param newRegistration pass in pointer to bool to return whether the client was newly registered. - * @return The id of the addon if it was created or found in the existing addon map, -1 otherwise. - */ - int RegisterAudioDSPAddon(ADDON::AddonPtr addon); - - /*! - * @brief Get the instance of the dsp addon, if it's ready. - * @param iAddonId The id of the dsp addon to get. - * @param addon The addon data pointer. - * @return True if the addon is ready, false otherwise. - */ - bool GetReadyAudioDSPAddon(int iAddonId, AE_DSP_ADDON &addon) const; - - /*! - * @brief Get the dsp related Id for selected addon - * @param addon The addon class pointer. - * @return the id of the asked addon, -1 if not available - */ - int GetAudioDSPAddonId(const ADDON::AddonPtr& addon) const; - - static const int m_StreamTypeNameTable[]; /*!< Table for stream type strings related to type id */ - bool m_isActive; /*!< set to true if all available dsp addons are loaded */ - ADDON::VECADDONS m_addons; /*!< List of all currently usable addons */ - AE_DSP_ADDONMAP m_addonMap; /*!< a map of all known audio dsp addons */ - bool m_noAddonWarningDisplayed; /*!< true when a warning was displayed that no add-ons were found, false otherwise */ - CActiveAEDSPDatabase m_databaseDSP; /*!< the database for all audio DSP related data */ - CCriticalSection m_critSection; /*!< Critical lock for control functions */ - CCriticalSection m_critUpdateSection; /*!< Critical lock for update thread related functions */ - unsigned int m_usedProcessesCnt; /*!< the amount of used addon processes */ - CActiveAEDSPProcessPtr m_usedProcesses[AE_DSP_STREAM_MAX_STREAMS]; /*!< Pointer to active process performing classes */ - unsigned int m_activeProcessId; /*!< The currently active audio stream id of a playing file source */ - bool m_isValidAudioDSPSettings; /*!< if settings load was successfull it becomes true */ - AE_DSP_MODELIST m_modes[AE_DSP_MODE_TYPE_MAX]; /*!< list of currently used dsp processing calls */ - std::vector m_outdatedAddons; - }; - //@} -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,430 +0,0 @@ -/* - * Copyright (C) 2010-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "ActiveAEDSPMode.h" -#include "ActiveAEDSPDatabase.h" -#include "ActiveAEDSP.h" -#include "utils/StringUtils.h" - -using namespace ActiveAE; - -bool CActiveAEDSPMode::operator==(const CActiveAEDSPMode &right) const -{ - return (m_iModeId == right.m_iModeId && - m_iAddonId == right.m_iAddonId && - m_iAddonModeNumber == right.m_iAddonModeNumber && - m_iModeType == right.m_iModeType && - m_iModePosition == right.m_iModePosition); -} - -bool CActiveAEDSPMode::operator!=(const CActiveAEDSPMode &right) const -{ - return !(*this == right); -} - -CActiveAEDSPMode::CActiveAEDSPMode() -{ - m_iModeType = AE_DSP_MODE_TYPE_UNDEFINED; - m_iModeId = -1; - m_iModePosition = -1; - m_bIsEnabled = false; - m_strOwnIconPath = ""; - m_strOverrideIconPath = ""; - m_iStreamTypeFlags = 0; - m_iBaseType = AE_DSP_ABASE_INVALID; - m_iModeName = -1; - m_iModeSetupName = -1; - m_iModeDescription = -1; - m_iModeHelp = -1; - m_bChanged = false; - m_bIsInternal = false; - m_bHasSettingsDialog = false; - - m_fCPUUsage = 0.0f; - - m_iAddonId = -1; - m_iAddonModeNumber = -1; - m_strModeName = ""; -} - -CActiveAEDSPMode::CActiveAEDSPMode(int modeId, const AE_DSP_BASETYPE baseType) -{ - m_iModeType = AE_DSP_MODE_TYPE_MASTER_PROCESS; - m_iModeId = modeId; - m_iModePosition = 0; - m_bIsEnabled = true; - m_strOwnIconPath = ""; - m_strOverrideIconPath = ""; - m_iStreamTypeFlags = AE_DSP_PRSNT_ASTREAM_BASIC | - AE_DSP_PRSNT_ASTREAM_MUSIC | - AE_DSP_PRSNT_ASTREAM_MOVIE/* | - AE_DSP_PRSNT_ASTREAM_GAME | - AE_DSP_PRSNT_ASTREAM_APP | - AE_DSP_PRSNT_ASTREAM_PHONE | - AE_DSP_PRSNT_ASTREAM_MESSAGE*/; - m_iBaseType = baseType; - - switch (modeId) - { - case AE_DSP_MASTER_MODE_ID_PASSOVER: - m_iModeName = 16039; - m_iModeDescription = -1; - m_iModeHelp = -1; - m_iModeSetupName = -1; - m_strModeName = "Passover"; - break; - case AE_DSP_MASTER_MODE_ID_INTERNAL_STEREO_UPMIX: - m_iModeName = 252; - m_iModeDescription = 36364; - m_iModeHelp = -1; - m_iModeSetupName = -1; - m_strModeName = "Stereo Upmix"; - break; - default: - m_iModeName = 16039; - m_iModeDescription = -1; - m_iModeHelp = -1; - m_iModeSetupName = -1; - m_strModeName = "Unknown"; - break; - }; - - m_bChanged = false; - m_bIsInternal = true; - m_bHasSettingsDialog = false; - - m_fCPUUsage = 0.0f; - - m_iAddonId = -1; - m_iAddonModeNumber = -1; -} - -CActiveAEDSPMode::CActiveAEDSPMode(const AE_DSP_MODES::AE_DSP_MODE &mode, int iAddonId) -{ - m_iModeType = mode.iModeType; - m_iModePosition = -1; - m_iModeId = mode.iUniqueDBModeId; - m_iAddonId = iAddonId; - m_iBaseType = AE_DSP_ABASE_INVALID; - m_bIsEnabled = m_iModeType == AE_DSP_MODE_TYPE_MASTER_PROCESS ? !mode.bIsDisabled : false; - m_strOwnIconPath = mode.strOwnModeImage; - m_strOverrideIconPath = mode.strOverrideModeImage; - m_iStreamTypeFlags = mode.iModeSupportTypeFlags; - m_iModeName = mode.iModeName; - m_iModeSetupName = mode.iModeSetupName; - m_iModeDescription = mode.iModeDescription; - m_iModeHelp = mode.iModeHelp; - m_iAddonModeNumber = mode.iModeNumber; - m_strModeName = mode.strModeName; - m_bHasSettingsDialog = mode.bHasSettingsDialog; - m_bChanged = false; - m_bIsInternal = false; - - m_fCPUUsage = 0.0f; - - if (m_strModeName.empty()) - m_strModeName = StringUtils::Format("%s %d", g_localizeStrings.Get(15023).c_str(), m_iModeId); -} - -CActiveAEDSPMode::CActiveAEDSPMode(const CActiveAEDSPMode &mode) -{ - *this = mode; -} - -CActiveAEDSPMode &CActiveAEDSPMode::operator=(const CActiveAEDSPMode &mode) -{ - m_iModeId = mode.m_iModeId; - m_iModeType = mode.m_iModeType; - m_iModePosition = mode.m_iModePosition; - m_bIsEnabled = mode.m_bIsEnabled; - m_strOwnIconPath = mode.m_strOwnIconPath; - m_strOverrideIconPath = mode.m_strOverrideIconPath; - m_iStreamTypeFlags = mode.m_iStreamTypeFlags; - m_iBaseType = mode.m_iBaseType; - m_iModeName = mode.m_iModeName; - m_iModeSetupName = mode.m_iModeSetupName; - m_iModeDescription = mode.m_iModeDescription; - m_iModeHelp = mode.m_iModeHelp; - m_iAddonId = mode.m_iAddonId; - m_iAddonModeNumber = mode.m_iAddonModeNumber; - m_strModeName = mode.m_strModeName; - m_bChanged = mode.m_bChanged; - m_bIsInternal = mode.m_bIsInternal; - m_bHasSettingsDialog = mode.m_bHasSettingsDialog; - m_fCPUUsage = mode.m_fCPUUsage; - - return *this; -} - -/********** General mode related functions **********/ - -bool CActiveAEDSPMode::IsNew(void) const -{ - CSingleLock lock(m_critSection); - return m_iModeId <= 0; -} - -bool CActiveAEDSPMode::IsChanged(void) const -{ - CSingleLock lock(m_critSection); - return m_bChanged; -} - - -bool CActiveAEDSPMode::IsInternal(void) const -{ - CSingleLock lock(m_critSection); - return m_bIsInternal; -} - -bool CActiveAEDSPMode::IsEnabled(void) const -{ - CSingleLock lock(m_critSection); - return m_bIsEnabled; -} - -bool CActiveAEDSPMode::SetEnabled(bool bIsEnabled) -{ - CSingleLock lock(m_critSection); - - if (m_bIsEnabled != bIsEnabled) - { - /* update the Enabled flag */ - m_bIsEnabled = bIsEnabled; - SetChanged(); - m_bChanged = true; - - return true; - } - - return false; -} - -int CActiveAEDSPMode::ModePosition(void) const -{ - CSingleLock lock(m_critSection); - return m_iModePosition; -} - -bool CActiveAEDSPMode::SetModePosition(int iModePosition) -{ - CSingleLock lock(m_critSection); - if (m_iModePosition != iModePosition) - { - /* update the type */ - m_iModePosition = iModePosition; - SetChanged(); - m_bChanged = true; - - return true; - } - - return false; -} - -bool CActiveAEDSPMode::SupportStreamType(AE_DSP_STREAMTYPE streamType, unsigned int flags) -{ - if (streamType == AE_DSP_ASTREAM_BASIC && (flags & AE_DSP_PRSNT_ASTREAM_BASIC)) return true; - else if (streamType == AE_DSP_ASTREAM_MUSIC && (flags & AE_DSP_PRSNT_ASTREAM_MUSIC)) return true; - else if (streamType == AE_DSP_ASTREAM_MOVIE && (flags & AE_DSP_PRSNT_ASTREAM_MOVIE)) return true; - else if (streamType == AE_DSP_ASTREAM_GAME && (flags & AE_DSP_PRSNT_ASTREAM_GAME)) return true; - else if (streamType == AE_DSP_ASTREAM_APP && (flags & AE_DSP_PRSNT_ASTREAM_APP)) return true; - else if (streamType == AE_DSP_ASTREAM_PHONE && (flags & AE_DSP_PRSNT_ASTREAM_PHONE)) return true; - else if (streamType == AE_DSP_ASTREAM_MESSAGE && (flags & AE_DSP_PRSNT_ASTREAM_MESSAGE)) return true; - return false; -} - -bool CActiveAEDSPMode::SupportStreamType(AE_DSP_STREAMTYPE streamType) const -{ - return SupportStreamType(streamType, m_iStreamTypeFlags); -} - -/********** Mode user interface related data functions **********/ - -int CActiveAEDSPMode::ModeName(void) const -{ - CSingleLock lock(m_critSection); - return m_iModeName; -} - -int CActiveAEDSPMode::ModeSetupName(void) const -{ - CSingleLock lock(m_critSection); - return m_iModeSetupName; -} - -int CActiveAEDSPMode::ModeDescription(void) const -{ - CSingleLock lock(m_critSection); - return m_iModeDescription; -} - -int CActiveAEDSPMode::ModeHelp(void) const -{ - CSingleLock lock(m_critSection); - return m_iModeHelp; -} - -const std::string &CActiveAEDSPMode::IconOwnModePath(void) const -{ - CSingleLock lock(m_critSection); - return m_strOwnIconPath; -} - -const std::string &CActiveAEDSPMode::IconOverrideModePath(void) const -{ - CSingleLock lock(m_critSection); - return m_strOverrideIconPath; -} - - -/********** Master mode type related functions **********/ - -bool CActiveAEDSPMode::SetBaseType(AE_DSP_BASETYPE baseType) -{ - CSingleLock lock(m_critSection); - if (m_iBaseType != baseType) - { - /* update the mode base */ - m_iBaseType = baseType; - SetChanged(); - m_bChanged = true; - - return true; - } - - return false; -} - -AE_DSP_BASETYPE CActiveAEDSPMode::BaseType(void) const -{ - CSingleLock lock(m_critSection); - return m_iBaseType; -} - - -/********** Audio DSP database related functions **********/ - -int CActiveAEDSPMode::ModeID(void) const -{ - CSingleLock lock(m_critSection); - return m_iModeId; -} - -int CActiveAEDSPMode::AddUpdate(bool force) -{ - if (!force) - { - // not changed - CSingleLock lock(m_critSection); - if (!m_bChanged && m_iModeId > 0) - return m_iModeId; - } - - CActiveAEDSPDatabase *database = CActiveAEDSP::GetInstance().GetADSPDatabase(); - if (!database || !database->IsOpen()) - { - CLog::Log(LOGERROR, "ActiveAE DSP - failed to open the database"); - return -1; - } - - database->AddUpdateMode(*this); - m_iModeId = database->GetModeId(*this); - - return m_iModeId; -} - -bool CActiveAEDSPMode::Delete(void) -{ - CActiveAEDSPDatabase *database = CActiveAEDSP::GetInstance().GetADSPDatabase(); - if (!database || !database->IsOpen()) - { - CLog::Log(LOGERROR, "ActiveAE DSP - failed to open the database"); - return false; - } - - return database->DeleteMode(*this); -} - -bool CActiveAEDSPMode::IsKnown(void) const -{ - CActiveAEDSPDatabase *database = CActiveAEDSP::GetInstance().GetADSPDatabase(); - if (!database || !database->IsOpen()) - { - CLog::Log(LOGERROR, "ActiveAE DSP - failed to open the database"); - return false; - } - - return database->GetModeId(*this) > 0; -} - - -/********** Dynamic processing related data methods **********/ - -void CActiveAEDSPMode::SetCPUUsage(float percent) -{ - CSingleLock lock(m_critSection); - m_fCPUUsage = percent; -} - -float CActiveAEDSPMode::CPUUsage(void) const -{ - CSingleLock lock(m_critSection); - return m_fCPUUsage; -} - - -/********** Fixed addon related Mode methods **********/ - -int CActiveAEDSPMode::AddonID(void) const -{ - CSingleLock lock(m_critSection); - return m_iAddonId; -} - -unsigned int CActiveAEDSPMode::AddonModeNumber(void) const -{ - CSingleLock lock(m_critSection); - return m_iAddonModeNumber; -} - -AE_DSP_MODE_TYPE CActiveAEDSPMode::ModeType(void) const -{ - CSingleLock lock(m_critSection); - return m_iModeType; -} - -const std::string &CActiveAEDSPMode::AddonModeName(void) const -{ - CSingleLock lock(m_critSection); - return m_strModeName; -} - -bool CActiveAEDSPMode::HasSettingsDialog(void) const -{ - CSingleLock lock(m_critSection); - return m_bHasSettingsDialog; -} - -unsigned int CActiveAEDSPMode::StreamTypeFlags(void) const -{ - CSingleLock lock(m_critSection); - return m_iStreamTypeFlags; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPMode.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,325 +0,0 @@ -#pragma once -/* - * Copyright (C) 2010-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include - -#include "ActiveAEDSPAddon.h" -#include "threads/CriticalSection.h" -#include "utils/Observer.h" - -namespace ActiveAE -{ - class CActiveAEDSPMode; - class CActiveAEDSPDatabase; - - typedef std::shared_ptr CActiveAEDSPModePtr; - typedef std::pair AE_DSP_MODEPAIR; - typedef std::vector AE_DSP_MODELIST; - - #define AE_DSP_MASTER_MODE_ID_INTERNAL_TYPES 0xFF00 - #define AE_DSP_MASTER_MODE_ID_INTERNAL_STEREO_UPMIX (AE_DSP_MASTER_MODE_ID_INTERNAL_TYPES) /*!< Used to for internal stereo upmix over ffmpeg */ - #define AE_DSP_MASTER_MODE_ID_PASSOVER 0 /*!< Used to ignore master processing */ - #define AE_DSP_MASTER_MODE_ID_INVALID -1 - - /*! - * DSP Mode information class - */ - //@{ - class CActiveAEDSPMode : public Observable - { - public: - /*! @brief Create a new mode */ - CActiveAEDSPMode(); - - /*! - * @brief Create a KODI internal processing mode infomation class - * @param modeId internal processing mode identifier - * @param baseType the used base of this internal mode - * @note this creation is only used to get a internal bypass mode (no addon call process mode) - */ - CActiveAEDSPMode(int modeId, const AE_DSP_BASETYPE baseType); - - /*! - * @brief Create the class about from addon given values - * @param mode the from addon set identification structure - * @param iAddonId the addon identification of the given data - */ - CActiveAEDSPMode(const AE_DSP_MODES::AE_DSP_MODE &mode, int iAddonId); - - /*! - * @brief Create a new class about given class - * @param mode the parent mode to copy data from - */ - CActiveAEDSPMode(const CActiveAEDSPMode &mode); - - bool operator ==(const CActiveAEDSPMode &right) const; - bool operator !=(const CActiveAEDSPMode &right) const; - CActiveAEDSPMode &operator=(const CActiveAEDSPMode &mode); - - /*! @name General mode related functions - * @note changes are not written inside database and must be performed with AddUpdate call - */ - //@{ - /*! - * @brief Check this mode as known or new one - * @return true if this mode is new and not stored inside database - */ - bool IsNew(void) const; - - /*! - * @brief Check this mode about data changes - * @return true if anything becomes changed on the mode data - */ - bool IsChanged(void) const; - - /*! - * @brief Check this mode about source - * @return true if internal KODI mode - */ - bool IsInternal(void) const; - - /*! - * @brief Check this mode is enabled for usage - * @return true if enabled - */ - bool IsEnabled(void) const; - - /*! - * @brief Enable or disable the usage of this mode - * @param bIsEnabled true to enable - * @return true if set was successful - */ - bool SetEnabled(bool bIsEnabled); - - /*! - * @brief Get the mode process chain position inside his mode type - * @return the mode process position or -1 not set - */ - int ModePosition(void) const; - - /*! - * @brief Set the mode process chain position inside his mode type - * @param iModePosition the process chain position - * @return true if the position becomes set and a database update becomes required - */ - bool SetModePosition(int iModePosition); - - /*! - * @brief Ask about stream type to given flags - * @param streamType the type to ask - * @param flags the stream types flags to check in accordance with AE_DSP_ASTREAM_PRESENT - * @return true if the mode is set as enabled under the flags - */ - static bool SupportStreamType(AE_DSP_STREAMTYPE streamType, unsigned int flags); - - /*! - * @brief Ask this mode about stream type - * @param streamType the type to ask - * @return true if the mode is set as enabled of this mode - */ - bool SupportStreamType(AE_DSP_STREAMTYPE streamType) const; - //@} - - /*! @name Mode user interface related data functions - */ - //@{ - /*! - * @brief Get the mode name string identification code - * @return the identifier code on addon strings or -1 if unset - */ - int ModeName(void) const; - - /*! - * @brief Get the mode name string identification code used on setup entries - * @return the identifier code on addon strings or -1 if unset - */ - int ModeSetupName(void) const; - - /*! - * @brief Get the mode help string identification code used as help text on dsp manager helper dialog - * @return the identifier code on addon strings or -1 if unset - */ - int ModeHelp(void) const; - - /*! - * @brief Get the mode description string identification code used as small help text on dsp manager dialog - * @return the identifier code on addon strings or -1 if unset - */ - int ModeDescription(void) const; - - /*! - * @brief Get the path to a from addon set mode identification image - * @return the path to the image or empty if not present - */ - const std::string &IconOwnModePath(void) const; - - /*! - * @brief Get the path to a from addon set mode identification image to overirde the from KODI used one, e.g. Dolby Digital with Dolby Digital EX - * @return the path to the image or empty if not present - */ - const std::string &IconOverrideModePath(void) const; - //@} - - /*! @name Master mode type related functions - */ - //@{ - /*! - * @brief Get the used base type of this mode - * @return the base type - */ - AE_DSP_BASETYPE BaseType(void) const; - - /*! - * @brief Set the used base type of this mode - * @return baseType the base type to set - * @return true if the position becomes set and a database update becomes required - */ - bool SetBaseType(AE_DSP_BASETYPE baseType); - //@} - - /*! @name Audio DSP database related functions - */ - //@{ - /*! - * @brief Get the identifier of this mode used on database - * @return the mode identifier or -1 if unknown and not safed to database - */ - int ModeID(void) const; - - /*! - * @brief Add or update this mode to the audio DSP database - * @param force if it is false it write only to the database on uknown id or if a change was inside the mode - * @return the database identifier of this mode, or -1 if a error was occurred - */ - int AddUpdate(bool force = false); - - /*! - * @brief Delete this mode from the audio dsp database - * @return true if deletion was successful - */ - bool Delete(void); - - /*! - * @brief Ask database about this mode that it is alread known - * @return true if present inside database - */ - bool IsKnown(void) const; - //@} - - /*! @name Dynamic processing related functions - */ - //@{ - /*! - * @brief Get the cpu usage of this mode - * @return percent The percent value (0.0 - 100.0) - * @note only be usable if mode is active in process chain - */ - float CPUUsage(void) const; - - /*! - * @brief Set the cpu usage of this mode if active and in process list - * @param percent The percent value (0.0 - 100.0) - */ - void SetCPUUsage(float percent); - //@} - - /*! @name Fixed audio dsp add-on related mode functions - */ - //@{ - /*! - * @brief Get the addon identifier - * @return returns the inside addon database used identifier of this mode based addon - */ - int AddonID(void) const; - - /*! - * @brief Get the addon processing mode identifier - * @return returns the from addon itself set identifier of this mode - */ - unsigned int AddonModeNumber(void) const; - - /*! - * @brief The processing mode type identifier of this mode - * @return returns the mode type, it should be never AE_DSP_MODE_TYPE_UNDEFINED - */ - AE_DSP_MODE_TYPE ModeType(void) const; - - /*! - * @brief Get the addon mode name - * @return returns the from addon set name of this mode, used for log messages - */ - const std::string &AddonModeName(void) const; - - /*! - * @brief Have this mode settings dialogs - * @return returns true if one or more dialogs are available to this mode - * @note if it is true the addon menu hook database can be checked with the addon mode identifier - */ - bool HasSettingsDialog(void) const; - - /*! - * @brief Get the from addon mode supported stream type flags - * @return returns the flags in accordance with AE_DSP_ASTREAM_PRESENT - */ - unsigned int StreamTypeFlags(void) const; - //@} - - private: - friend class CActiveAEDSPDatabase; - - /*! @name KODI related mode data - */ - //@{ - AE_DSP_MODE_TYPE m_iModeType; /*!< the processing mode type */ - int m_iModePosition; /*!< the processing mode position */ - int m_iModeId; /*!< the identifier given to this mode by the DSP database */ - AE_DSP_BASETYPE m_iBaseType; /*!< The stream source coding format */ - bool m_bIsEnabled; /*!< true if this mode is enabled, false if not */ - std::string m_strOwnIconPath; /*!< the path to the icon for this mode */ - std::string m_strOverrideIconPath; /*!< the path to the icon for this mode */ - int m_iModeName; /*!< the name id for this mode used by KODI */ - int m_iModeSetupName; /*!< the name id for this mode inside settings used by KODI */ - int m_iModeDescription; /*!< the description id for this mode used by KODI */ - int m_iModeHelp; /*!< the help id for this mode used by KODI */ - bool m_bChanged; /*!< true if anything in this entry was changed that needs to be persisted */ - bool m_bIsInternal; /*!< true if this mode is an internal KODI mode */ - std::string m_strModeName; /*!< the log name of this mode on the Addon or inside KODI */ - //@} - - /*! @name Dynamic processing related data - */ - //@{ - float m_fCPUUsage; /*!< if mode is active the used cpu force in percent is set here */ - //@} - - /*! @name Audio dsp add-on related mode data - */ - //@{ - int m_iAddonId; /*!< the identifier of the Addon that serves this mode */ - unsigned int m_iAddonModeNumber; /*!< the mode number on the Addon */ - bool m_bHasSettingsDialog; /*!< the mode have a own settings dialog */ - unsigned int m_iStreamTypeFlags; /*!< The stream content type flags in accordance with AE_DSP_ASTREAM_PRESENT */ - //@} - - CCriticalSection m_critSection; - }; - //@} -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1858 +0,0 @@ -/* - * Copyright (C) 2010-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "ActiveAEDSPProcess.h" - -#include - -extern "C" { -#include "libavutil/channel_layout.h" -#include "libavutil/opt.h" -} - -#include "ActiveAEDSPMode.h" -#include "Application.h" -#include "cores/AudioEngine/AEResampleFactory.h" -#include "cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h" -#include "cores/AudioEngine/Utils/AEUtil.h" -#include "cores/IPlayer.h" -#include "settings/MediaSettings.h" -#include "utils/TimeUtils.h" - -using namespace ADDON; -using namespace ActiveAE; - -#define MIN_DSP_ARRAY_SIZE 4096 - -CActiveAEDSPProcess::CActiveAEDSPProcess(AE_DSP_STREAM_ID streamId) - : m_streamId(streamId) -{ - m_channelLayoutIn = 0; /* Undefined input channel layout */ - m_channelLayoutOut = 0; /* Undefined output channel layout */ - m_streamTypeUsed = AE_DSP_ASTREAM_INVALID; - m_NewStreamType = AE_DSP_ASTREAM_INVALID; - m_NewMasterMode = AE_DSP_MASTER_MODE_ID_INVALID; - m_forceInit = false; - m_resamplerDSPProcessor = NULL; - m_convertInput = NULL; - m_convertOutput = NULL; - m_iLastProcessTime = 0; - - /*! - * Create predefined process arrays on every supported channel for audio dsp's. - * All are set if used or not for safety reason and unsued ones can be used from - * dsp addons as buffer arrays. - * If a bigger size is neeeded it becomes reallocated during DSP processing. - */ - m_processArraySize = MIN_DSP_ARRAY_SIZE; - for (int i = 0; i < AE_DSP_CH_MAX; ++i) - { - m_processArray[0][i] = (float*)calloc(m_processArraySize, sizeof(float)); - m_processArray[1][i] = (float*)calloc(m_processArraySize, sizeof(float)); - } -} - -CActiveAEDSPProcess::~CActiveAEDSPProcess() -{ - ResetStreamFunctionsSelection(); - - if (m_resamplerDSPProcessor) - { - delete m_resamplerDSPProcessor; - m_resamplerDSPProcessor = NULL; - } - - /* Clear the buffer arrays */ - for (int i = 0; i < AE_DSP_CH_MAX; ++i) - { - if(m_processArray[0][i]) - free(m_processArray[0][i]); - if(m_processArray[1][i]) - free(m_processArray[1][i]); - } - - if (m_convertInput) - swr_free(&m_convertInput); - if (m_convertOutput) - swr_free(&m_convertOutput); -} - -void CActiveAEDSPProcess::ResetStreamFunctionsSelection() -{ - m_NewMasterMode = AE_DSP_MASTER_MODE_ID_INVALID; - m_NewStreamType = AE_DSP_ASTREAM_INVALID; - m_addon_InputResample.Clear(); - m_addon_OutputResample.Clear(); - - m_addons_InputProc.clear(); - m_addons_PreProc.clear(); - m_addons_MasterProc.clear(); - m_addons_PostProc.clear(); - m_usedMap.clear(); -} - -bool CActiveAEDSPProcess::Create(const AEAudioFormat &inputFormat, const AEAudioFormat &outputFormat, bool upmix, AEQuality quality, AE_DSP_STREAMTYPE iStreamType, - enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type, int profile) -{ - m_inputFormat = inputFormat; /*!< Input format of processed stream */ - m_outputFormat = outputFormat; /*!< Output format of required stream (set from ADSP system on startup, to have ffmpeg compatible format */ - m_outputSamplerate = m_inputFormat.m_sampleRate; /*!< If no resampler addon is present output samplerate is the same as input */ - m_outputFrames = m_inputFormat.m_frames; - m_streamQuality = quality; /*!< from KODI on settings selected resample quality, also passed to addons to support different quality */ - m_dataFormat = AE_FMT_FLOAT; /*!< the base stream format, hard set to float */ - m_activeMode = AE_DSP_MASTER_MODE_ID_PASSOVER; /*!< Reset the pointer for m_MasterModes about active master process, set here during mode selection */ - m_ffMpegMatrixEncoding = matrix_encoding; - m_ffMpegAudioServiceType= audio_service_type; - m_ffMpegProfile = profile; - - CSingleLock lock(m_restartSection); - - CLog::Log(LOGDEBUG, "ActiveAE DSP - %s - Audio DSP processing id %d created:", __FUNCTION__, m_streamId); - - m_convertInput = swr_alloc_set_opts(m_convertInput, - CAEUtil::GetAVChannelLayout(m_inputFormat.m_channelLayout), - AV_SAMPLE_FMT_FLTP, - m_inputFormat.m_sampleRate, - CAEUtil::GetAVChannelLayout(m_inputFormat.m_channelLayout), - CAEUtil::GetAVSampleFormat(m_inputFormat.m_dataFormat), - m_inputFormat.m_sampleRate, - 0, NULL); - if (m_convertInput == NULL) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - DSP input convert with data format '%s' not supported!", __FUNCTION__, CAEUtil::DataFormatToStr(inputFormat.m_dataFormat)); - return false; - } - - if (swr_init(m_convertInput) < 0) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - DSP input convert failed", __FUNCTION__); - return false; - } - - m_convertOutput = swr_alloc_set_opts(m_convertOutput, - CAEUtil::GetAVChannelLayout(m_outputFormat.m_channelLayout), - CAEUtil::GetAVSampleFormat(m_outputFormat.m_dataFormat), - m_outputFormat.m_sampleRate, - CAEUtil::GetAVChannelLayout(m_outputFormat.m_channelLayout), - AV_SAMPLE_FMT_FLTP, - m_outputFormat.m_sampleRate, - 0, NULL); - if (m_convertOutput == NULL) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - DSP output convert with data format '%s' not supported!", __FUNCTION__, CAEUtil::DataFormatToStr(outputFormat.m_dataFormat)); - return false; - } - - if (swr_init(m_convertOutput) < 0) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - DSP output convert failed", __FUNCTION__); - return false; - } - - ResetStreamFunctionsSelection(); - - CFileItem currentFile(g_application.CurrentFileItem()); - - m_streamTypeDetected = DetectStreamType(¤tFile); - - if (iStreamType == AE_DSP_ASTREAM_AUTO) - m_streamTypeUsed = m_streamTypeDetected; - else if (iStreamType >= AE_DSP_ASTREAM_BASIC || iStreamType < AE_DSP_ASTREAM_AUTO) - m_streamTypeUsed = iStreamType; - else - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - Unknown audio stream type, falling back to basic", __FUNCTION__); - m_streamTypeUsed = AE_DSP_ASTREAM_BASIC; - } - - /*! - * Set general stream information about the processed stream - */ - - if (g_application.m_pPlayer->GetAudioStreamCount() > 0) - { - int identifier = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioStream; - if(identifier < 0) - identifier = g_application.m_pPlayer->GetAudioStream(); - if (identifier < 0) - identifier = 0; - - SPlayerAudioStreamInfo info; - g_application.m_pPlayer->GetAudioStreamInfo(identifier, info); - - m_addonStreamProperties.strName = info.name.c_str(); - m_addonStreamProperties.strLanguage = info.language.c_str(); - m_addonStreamProperties.strCodecId = info.audioCodecName.c_str(); - m_addonStreamProperties.iIdentifier = identifier; - m_addonStreamProperties.iSampleRate = info.samplerate; - m_addonStreamProperties.iChannels = info.channels; - } - else - { - m_addonStreamProperties.strName = "Unknown"; - m_addonStreamProperties.strLanguage = ""; - m_addonStreamProperties.strCodecId = ""; - m_addonStreamProperties.iIdentifier = m_streamId; - m_addonStreamProperties.iSampleRate = m_inputFormat.m_sampleRate; - m_addonStreamProperties.iChannels = m_inputFormat.m_channelLayout.Count(); - } - - m_addonStreamProperties.iStreamID = m_streamId; - m_addonStreamProperties.iStreamType = m_streamTypeUsed; - m_addonStreamProperties.iBaseType = GetBaseType(&m_addonStreamProperties); - - /*! - * Create the profile about additional stream related data, e.g. the different Dolby Digital stream flags - */ - CreateStreamProfile(); - - /*! - * Set exact input and output format settings - */ - m_addonSettings.iStreamID = m_streamId; - m_addonSettings.iStreamType = m_streamTypeUsed; - m_addonSettings.lInChannelPresentFlags = 0; /*!< Reset input channel present flags, becomes set on next steps */ - m_addonSettings.iInChannels = m_inputFormat.m_channelLayout.Count();/*!< The from stream given channel amount */ - m_addonSettings.iInFrames = m_inputFormat.m_frames; /*!< Input frames given */ - m_addonSettings.iInSamplerate = m_inputFormat.m_sampleRate; /*!< The basic input samplerate from stream source */ - m_addonSettings.iProcessFrames = m_inputFormat.m_frames; /*!< Default the same as input frames, if input resampler is present it becomes corrected */ - m_addonSettings.iProcessSamplerate = m_inputFormat.m_sampleRate; /*!< Default the same as input samplerate, if input resampler is present it becomes corrected */ - m_addonSettings.lOutChannelPresentFlags = 0; /*!< Reset output channel present flags, becomes set on next steps */ - m_addonSettings.iOutChannels = m_outputFormat.m_channelLayout.Count(); /*!< The for output required amount of channels */ - m_addonSettings.iOutFrames = m_outputFormat.m_frames; /*! Output frames requested */ - m_addonSettings.iOutSamplerate = m_outputFormat.m_sampleRate; /*!< The required sample rate for pass over resampling on ActiveAEResample */ - m_addonSettings.bStereoUpmix = upmix; /*! Stereo upmix value given from KODI settings */ - m_addonSettings.bInputResamplingActive = false; /*! Becomes true if input resampling is in use */ - m_addonSettings.iQualityLevel = m_streamQuality; /*! Requested stream processing quality, is optional and can be from addon ignored */ - - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_FL)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_FL; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_FR)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_FR; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_FC)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_FC; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_LFE)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_LFE; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_BL)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_BL; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_BR)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_BR; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_FLOC)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_FLOC; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_FROC)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_FROC; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_BC)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_BC; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_SL)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_SL; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_SR)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_SR; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_TFL)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TFL; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_TFR)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TFR; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_TFC)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TFC; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_TC)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TC; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_TBL)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TBL; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_TBR)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TBR; - if (m_inputFormat.m_channelLayout.HasChannel(AE_CH_TBC)) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TBC; - - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_FL)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_FL; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_FR)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_FR; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_FC)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_FC; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_LFE)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_LFE; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_BL)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_BL; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_BR)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_BR; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_FLOC)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_FLOC; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_FROC)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_FROC; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_BC)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_BC; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_SL)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_SL; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_SR)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_SR; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_TFL)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TFL; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_TFR)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TFR; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_TFC)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TFC; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_TC)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TC; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_TBL)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TBL; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_TBR)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TBR; - if (m_outputFormat.m_channelLayout.HasChannel(AE_CH_TBC)) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TBC; - - /*! - * Setup off mode, used if dsp master processing is set off, required to have data - * for stream information functions. - */ - sDSPProcessHandle internalMode; - internalMode.Clear(); - internalMode.iAddonModeNumber = AE_DSP_MASTER_MODE_ID_PASSOVER; - internalMode.pMode = CActiveAEDSPModePtr(new CActiveAEDSPMode(internalMode.iAddonModeNumber, (AE_DSP_BASETYPE)m_addonStreamProperties.iBaseType)); - internalMode.iLastTime = 0; - m_addons_MasterProc.push_back(internalMode); - m_activeMode = AE_DSP_MASTER_MODE_ID_PASSOVER; - - if (upmix && m_addonSettings.iInChannels <= 2) - { - internalMode.Clear(); - internalMode.iAddonModeNumber = AE_DSP_MASTER_MODE_ID_INTERNAL_STEREO_UPMIX; - internalMode.pMode = CActiveAEDSPModePtr(new CActiveAEDSPMode(internalMode.iAddonModeNumber, (AE_DSP_BASETYPE)m_addonStreamProperties.iBaseType)); - internalMode.iLastTime = 0; - m_addons_MasterProc.push_back(internalMode); - } - - /*! - * Load all selected processing types, stored in a database and available from addons - */ - AE_DSP_ADDONMAP addonMap; - if (CActiveAEDSP::GetInstance().GetEnabledAudioDSPAddons(addonMap) > 0) - { - int foundInputResamplerId = -1; /*!< Used to prevent double call of StreamCreate if input stream resampling is together with outer processing types */ - - /*! - * First find input resample addon to become information about processing sample rate and - * load one allowed before master processing & final resample addon - */ - CLog::Log(LOGDEBUG, " ---- DSP input resample addon ---"); - const AE_DSP_MODELIST listInputResample = CActiveAEDSP::GetInstance().GetAvailableModes(AE_DSP_MODE_TYPE_INPUT_RESAMPLE); - if (listInputResample.size() == 0) - CLog::Log(LOGDEBUG, " | - no input resample addon present or enabled"); - for (unsigned int i = 0; i < listInputResample.size(); ++i) - { - /// For resample only one call is allowed. Use first one and ignore everything else. - CActiveAEDSPModePtr pMode = listInputResample[i].first; - AE_DSP_ADDON addon = listInputResample[i].second; - if (!CAddonMgr::GetInstance().IsAddonDisabled(addon->ID()) && addon->SupportsInputResample() && pMode->IsEnabled()) - { - ADDON_HANDLE_STRUCT handle; - AE_DSP_ERROR err = addon->StreamCreate(&m_addonSettings, &m_addonStreamProperties, &handle); - if (err == AE_DSP_ERROR_NO_ERROR) - { - if (addon->StreamIsModeSupported(&handle, pMode->ModeType(), pMode->AddonModeNumber(), pMode->ModeID())) - { - int processSamplerate = addon->InputResampleSampleRate(&handle); - if (processSamplerate == (int)m_inputFormat.m_sampleRate) - { - CLog::Log(LOGDEBUG, " | - input resample addon %s ignored, input sample rate %i the same as process rate", addon->GetFriendlyName().c_str(), m_inputFormat.m_sampleRate); - } - else if (processSamplerate > 0) - { - CLog::Log(LOGDEBUG, " | - %s with resampling from %i to %i", addon->GetAudioDSPName().c_str(), m_inputFormat.m_sampleRate, processSamplerate); - - m_outputSamplerate = processSamplerate; /*!< overwrite output sample rate with the new rate */ - m_outputFrames = (int) ceil((1.0 * processSamplerate) / m_addonSettings.iInSamplerate * m_addonSettings.iInFrames); - m_addonSettings.iProcessSamplerate = m_outputSamplerate; /*!< the processing sample rate required for all behind called processes */ - m_addonSettings.iProcessFrames = m_outputFrames; - m_addonSettings.bInputResamplingActive = true; - - m_addon_InputResample.iAddonModeNumber = pMode->AddonModeNumber(); - m_addon_InputResample.pMode = pMode; - m_addon_InputResample.pAddon = addon; - m_addon_InputResample.iLastTime = 0; - } - else - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - input resample addon %s return invalid samplerate and becomes disabled", __FUNCTION__, addon->GetFriendlyName().c_str()); - } - - unsigned int id = addon->GetID(); - m_addon_Handles[id] = handle; - foundInputResamplerId = id; - m_usedMap.insert(std::make_pair(id, addon)); - } - } - else if (err != AE_DSP_ERROR_IGNORE_ME) - CLog::Log(LOGERROR, "ActiveAE DSP - %s - input resample addon creation failed on %s with %s", __FUNCTION__, addon->GetAudioDSPName().c_str(), CActiveAEDSPAddon::ToString(err)); - break; - } - } - - /*! - * Now init all other dsp relavant addons - */ - for (AE_DSP_ADDONMAP_ITR itr = addonMap.begin(); itr != addonMap.end(); ++itr) - { - AE_DSP_ADDON addon = itr->second; - int id = addon->GetID(); - if (!CAddonMgr::GetInstance().IsAddonDisabled(addon->ID()) && id != foundInputResamplerId) - { - ADDON_HANDLE_STRUCT handle; - AE_DSP_ERROR err = addon->StreamCreate(&m_addonSettings, &m_addonStreamProperties, &handle); - if (err == AE_DSP_ERROR_NO_ERROR) - { - m_addon_Handles[id] = handle; - m_usedMap.insert(std::make_pair(id, addon)); - } - else if (err == AE_DSP_ERROR_IGNORE_ME) - continue; - else - CLog::Log(LOGERROR, "ActiveAE DSP - %s - addon creation failed on %s with %s", __FUNCTION__, addon->GetAudioDSPName().c_str(), CActiveAEDSPAddon::ToString(err)); - } - } - - for (AE_DSP_ADDONMAP_ITR itr = m_usedMap.begin(); itr != m_usedMap.end(); ++itr) - { - AE_DSP_ADDON addon = itr->second; - if (addon->SupportsInputInfoProcess()) - { - sDSPProcessHandle modeHandle; - modeHandle.pAddon = addon; - modeHandle.handle = m_addon_Handles[addon->GetID()]; - m_addons_InputProc.push_back(modeHandle); - } - } - - /*! - * Load all required pre process dsp addon functions - */ - CLog::Log(LOGDEBUG, " ---- DSP active pre process modes ---"); - const AE_DSP_MODELIST listPreProcess = CActiveAEDSP::GetInstance().GetAvailableModes(AE_DSP_MODE_TYPE_PRE_PROCESS); - for (unsigned int i = 0; i < listPreProcess.size(); ++i) - { - CActiveAEDSPModePtr pMode = listPreProcess[i].first; - AE_DSP_ADDON addon = listPreProcess[i].second; - int id = addon->GetID(); - - if (m_usedMap.find(id) == m_usedMap.end()) - continue; - if (!CAddonMgr::GetInstance().IsAddonDisabled(addon->ID()) && addon->SupportsPreProcess() && pMode->IsEnabled() && - addon->StreamIsModeSupported(&m_addon_Handles[id], pMode->ModeType(), pMode->AddonModeNumber(), pMode->ModeID())) - { - CLog::Log(LOGDEBUG, " | - %i - %s (%s)", i, pMode->AddonModeName().c_str(), addon->GetAudioDSPName().c_str()); - - sDSPProcessHandle modeHandle; - modeHandle.iAddonModeNumber = pMode->AddonModeNumber(); - modeHandle.pMode = pMode; - modeHandle.pAddon = addon; - modeHandle.iLastTime = 0; - modeHandle.handle = m_addon_Handles[id]; - m_addons_PreProc.push_back(modeHandle); - } - } - if (m_addons_PreProc.empty()) - CLog::Log(LOGDEBUG, " | - no pre processing addon's present or enabled"); - - /*! - * Load all available master modes from addons and put together with database - */ - CLog::Log(LOGDEBUG, " ---- DSP active master process modes ---"); - const AE_DSP_MODELIST listMasterProcess = CActiveAEDSP::GetInstance().GetAvailableModes(AE_DSP_MODE_TYPE_MASTER_PROCESS); - for (unsigned int i = 0; i < listMasterProcess.size(); ++i) - { - CActiveAEDSPModePtr pMode = listMasterProcess[i].first; - AE_DSP_ADDON addon = listMasterProcess[i].second; - int id = addon->GetID(); - - if (m_usedMap.find(id) == m_usedMap.end()) - continue; - if (!CAddonMgr::GetInstance().IsAddonDisabled(addon->ID()) && addon->SupportsMasterProcess() && pMode->IsEnabled() && - addon->StreamIsModeSupported(&m_addon_Handles[id], pMode->ModeType(), pMode->AddonModeNumber(), pMode->ModeID())) - { - CLog::Log(LOGDEBUG, " | - %i - %s (%s)", i, pMode->AddonModeName().c_str(), addon->GetAudioDSPName().c_str()); - - sDSPProcessHandle modeHandle; - modeHandle.iAddonModeNumber = pMode->AddonModeNumber(); - modeHandle.pMode = pMode; - modeHandle.pAddon = addon; - modeHandle.iLastTime = 0; - modeHandle.handle = m_addon_Handles[id]; - modeHandle.pMode->SetBaseType((AE_DSP_BASETYPE)m_addonStreamProperties.iBaseType); - m_addons_MasterProc.push_back(modeHandle); - } - } - if (m_addons_MasterProc.empty()) - CLog::Log(LOGDEBUG, " | - no master processing addon's present or enabled"); - - /*! - * Get selected source for current input - */ - int modeID = CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterModes[m_addonStreamProperties.iStreamType][m_addonStreamProperties.iBaseType]; - if (modeID == AE_DSP_MASTER_MODE_ID_INVALID) - modeID = AE_DSP_MASTER_MODE_ID_PASSOVER; - - for (unsigned int ptr = 0; ptr < m_addons_MasterProc.size(); ++ptr) - { - CActiveAEDSPModePtr mode = m_addons_MasterProc.at(ptr).pMode; - if (mode->ModeID() == modeID) - { - m_activeMode = (int)ptr; - CLog::Log(LOGDEBUG, " | -- %s (selected)", mode->AddonModeName().c_str()); - break; - } - } - - /*! - * Setup the one allowed master processing addon and inform about selected mode - */ - m_activeModeOutChannels = -1; - if (m_addons_MasterProc[m_activeMode].pAddon) - { - AE_DSP_ERROR err = m_addons_MasterProc[m_activeMode].pAddon->MasterProcessSetMode(&m_addons_MasterProc[m_activeMode].handle, m_addonStreamProperties.iStreamType, m_addons_MasterProc[m_activeMode].pMode->AddonModeNumber(), m_addons_MasterProc[m_activeMode].pMode->ModeID()); - if (err != AE_DSP_ERROR_NO_ERROR) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - addon master mode selection failed on %s with Mode '%s' with %s", - __FUNCTION__, - m_addons_MasterProc[m_activeMode].pAddon->GetAudioDSPName().c_str(), - m_addons_MasterProc[m_activeMode].pMode->AddonModeName().c_str(), - CActiveAEDSPAddon::ToString(err)); - m_addons_MasterProc.erase(m_addons_MasterProc.begin()+m_activeMode); - m_activeMode = AE_DSP_MASTER_MODE_ID_PASSOVER; - } - else - m_activeModeOutChannels = m_addons_MasterProc[m_activeMode].pAddon->MasterProcessGetOutChannels(&m_addons_MasterProc[m_activeMode].handle, m_activeModeOutChannelsPresent); - } - else - { - CLog::Log(LOGDEBUG, " | -- No master process selected!"); - } - - /*! - * Load all required post process dsp addon functions - */ - CLog::Log(LOGDEBUG, " ---- DSP active post process modes ---"); - const AE_DSP_MODELIST listPostProcess = CActiveAEDSP::GetInstance().GetAvailableModes(AE_DSP_MODE_TYPE_POST_PROCESS); - for (unsigned int i = 0; i < listPostProcess.size(); ++i) - { - CActiveAEDSPModePtr pMode = listPostProcess[i].first; - AE_DSP_ADDON addon = listPostProcess[i].second; - int id = addon->GetID(); - - if (m_usedMap.find(id) == m_usedMap.end()) - continue; - - if (!CAddonMgr::GetInstance().IsAddonDisabled(addon->ID()) && addon->SupportsPostProcess() && pMode->IsEnabled() && - addon->StreamIsModeSupported(&m_addon_Handles[id], pMode->ModeType(), pMode->AddonModeNumber(), pMode->ModeID())) - { - CLog::Log(LOGDEBUG, " | - %i - %s (%s)", i, pMode->AddonModeName().c_str(), addon->GetAudioDSPName().c_str()); - - sDSPProcessHandle modeHandle; - modeHandle.iAddonModeNumber = pMode->AddonModeNumber(); - modeHandle.pMode = pMode; - modeHandle.pAddon = addon; - modeHandle.iLastTime = 0; - modeHandle.handle = m_addon_Handles[id]; - m_addons_PostProc.push_back(modeHandle); - } - } - if (m_addons_PostProc.empty()) - CLog::Log(LOGDEBUG, " | - no post processing addon's present or enabled"); - - /*! - * Load one allowed addon for resampling after final post processing - */ - CLog::Log(LOGDEBUG, " ---- DSP post resample addon ---"); - if (m_addonSettings.iProcessSamplerate != m_outputFormat.m_sampleRate) - { - const AE_DSP_MODELIST listOutputResample = CActiveAEDSP::GetInstance().GetAvailableModes(AE_DSP_MODE_TYPE_OUTPUT_RESAMPLE); - if (listOutputResample.size() == 0) - CLog::Log(LOGDEBUG, " | - no final post resample addon present or enabled, becomes performed by KODI"); - for (unsigned int i = 0; i < listOutputResample.size(); ++i) - { - /// For resample only one call is allowed. Use first one and ignore everything else. - CActiveAEDSPModePtr pMode = listOutputResample[i].first; - AE_DSP_ADDON addon = listOutputResample[i].second; - int id = addon->GetID(); - - if (m_usedMap.find(id) != m_usedMap.end() && - !CAddonMgr::GetInstance().IsAddonDisabled(addon->ID()) && addon->SupportsOutputResample() && pMode->IsEnabled() && - addon->StreamIsModeSupported(&m_addon_Handles[id], pMode->ModeType(), pMode->AddonModeNumber(), pMode->ModeID())) - { - int outSamplerate = addon->OutputResampleSampleRate(&m_addon_Handles[id]); - if (outSamplerate > 0) - { - CLog::Log(LOGDEBUG, " | - %s with resampling to %i", addon->GetAudioDSPName().c_str(), outSamplerate); - - m_outputSamplerate = outSamplerate; - m_outputFrames = (int) ceil((1.0 * outSamplerate) / m_addonSettings.iProcessSamplerate * m_addonSettings.iProcessFrames); - - m_addon_OutputResample.iAddonModeNumber = pMode->AddonModeNumber(); - m_addon_OutputResample.pMode = pMode; - m_addon_OutputResample.pAddon = addon; - m_addon_OutputResample.iLastTime = 0; - m_addon_OutputResample.handle = m_addon_Handles[id]; - } - else - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - post resample addon %s return invalid samplerate and becomes disabled", __FUNCTION__, addon->GetFriendlyName().c_str()); - } - break; - } - } - } - else - { - CLog::Log(LOGDEBUG, " | - no final resampling needed, process and final samplerate the same"); - } - } - - /*! - * Initialize fallback matrix mixer - */ - InitFFMpegDSPProcessor(); - - if (CLog::GetLogLevel() == LOGDEBUG) // Speed improve - { - CLog::Log(LOGDEBUG, " ---- Input stream ----"); - CLog::Log(LOGDEBUG, " | Identifier : %d", m_addonStreamProperties.iIdentifier); - CLog::Log(LOGDEBUG, " | Stream Type : %s", m_addonStreamProperties.iStreamType == AE_DSP_ASTREAM_BASIC ? "Basic" : - m_addonStreamProperties.iStreamType == AE_DSP_ASTREAM_MUSIC ? "Music" : - m_addonStreamProperties.iStreamType == AE_DSP_ASTREAM_MOVIE ? "Movie" : - m_addonStreamProperties.iStreamType == AE_DSP_ASTREAM_GAME ? "Game" : - m_addonStreamProperties.iStreamType == AE_DSP_ASTREAM_APP ? "App" : - m_addonStreamProperties.iStreamType == AE_DSP_ASTREAM_PHONE ? "Phone" : - m_addonStreamProperties.iStreamType == AE_DSP_ASTREAM_MESSAGE ? "Message" : - "Unknown"); - CLog::Log(LOGDEBUG, " | Name : %s", m_addonStreamProperties.strName); - CLog::Log(LOGDEBUG, " | Language : %s", m_addonStreamProperties.strLanguage); - CLog::Log(LOGDEBUG, " | Codec : %s", m_addonStreamProperties.strCodecId); - CLog::Log(LOGDEBUG, " | Sample Rate : %d", m_addonStreamProperties.iSampleRate); - CLog::Log(LOGDEBUG, " | Channels : %d", m_addonStreamProperties.iChannels); - CLog::Log(LOGDEBUG, " ---- Input format ----"); - CLog::Log(LOGDEBUG, " | Sample Rate : %d", m_addonSettings.iInSamplerate); - CLog::Log(LOGDEBUG, " | Sample Format : %s", CAEUtil::DataFormatToStr(m_inputFormat.m_dataFormat)); - CLog::Log(LOGDEBUG, " | Channel Count : %d", m_inputFormat.m_channelLayout.Count()); - CLog::Log(LOGDEBUG, " | Channel Layout : %s", ((std::string)m_inputFormat.m_channelLayout).c_str()); - CLog::Log(LOGDEBUG, " | Frames : %d", m_addonSettings.iInFrames); - CLog::Log(LOGDEBUG, " ---- Process format ----"); - CLog::Log(LOGDEBUG, " | Sample Rate : %d", m_addonSettings.iProcessSamplerate); - CLog::Log(LOGDEBUG, " | Sample Format : %s", "AE_FMT_FLOATP"); - CLog::Log(LOGDEBUG, " | Frames : %d", m_addonSettings.iProcessFrames); - CLog::Log(LOGDEBUG, " | Internal processing : %s", m_resamplerDSPProcessor ? "yes" : "no"); - CLog::Log(LOGDEBUG, " ---- Output format ----"); - CLog::Log(LOGDEBUG, " | Sample Rate : %d", m_outputSamplerate); - CLog::Log(LOGDEBUG, " | Sample Format : %s", CAEUtil::DataFormatToStr(m_outputFormat.m_dataFormat)); - CLog::Log(LOGDEBUG, " | Channel Count : %d", m_outputFormat.m_channelLayout.Count()); - CLog::Log(LOGDEBUG, " | Channel Layout : %s", ((std::string)m_outputFormat.m_channelLayout).c_str()); - CLog::Log(LOGDEBUG, " | Frames : %d", m_outputFrames); - } - - m_forceInit = true; - return true; -} - -void CActiveAEDSPProcess::InitFFMpegDSPProcessor() -{ - /*! - * If ffmpeg resampler is already present delete it first to create it from new - */ - if (m_resamplerDSPProcessor) - { - delete m_resamplerDSPProcessor; - m_resamplerDSPProcessor = NULL; - } - - /*! - * if the amount of input channels is higher as output and the active master mode gives more channels out or if it is not set of it - * a forced channel downmix becomes enabled. - */ - bool upmix = m_addonSettings.bStereoUpmix && m_addons_MasterProc[m_activeMode].pMode->ModeID() == AE_DSP_MASTER_MODE_ID_INTERNAL_STEREO_UPMIX ? true : false; - if (upmix || (m_addonSettings.iInChannels > m_addonSettings.iOutChannels && (m_activeModeOutChannels <= 0 || m_activeModeOutChannels > m_addonSettings.iOutChannels))) - { - m_resamplerDSPProcessor = CAEResampleFactory::Create(); - if (!m_resamplerDSPProcessor->Init(CAEUtil::GetAVChannelLayout(m_outputFormat.m_channelLayout), - m_outputFormat.m_channelLayout.Count(), - m_addonSettings.iProcessSamplerate, - AV_SAMPLE_FMT_FLTP, sizeof(float) << 3, 0, - CAEUtil::GetAVChannelLayout(m_inputFormat.m_channelLayout), - m_inputFormat.m_channelLayout.Count(), - m_addonSettings.iProcessSamplerate, - AV_SAMPLE_FMT_FLTP, sizeof(float) << 3, 0, - upmix, - true, - NULL, - m_streamQuality, - true)) - { - delete m_resamplerDSPProcessor; - m_resamplerDSPProcessor = NULL; - - CLog::Log(LOGERROR, "ActiveAE DSP - %s - Initialize of channel mixer failed", __FUNCTION__); - } - } -} - -bool CActiveAEDSPProcess::CreateStreamProfile() -{ - bool ret = true; - - switch (m_addonStreamProperties.iBaseType) - { - case AE_DSP_ABASE_AC3: - case AE_DSP_ABASE_EAC3: - { - unsigned int iProfile; - switch (m_ffMpegMatrixEncoding) - { - case AV_MATRIX_ENCODING_DOLBY: - iProfile = AE_DSP_PROFILE_DOLBY_SURROUND; - break; - case AV_MATRIX_ENCODING_DPLII: - iProfile = AE_DSP_PROFILE_DOLBY_PLII; - break; - case AV_MATRIX_ENCODING_DPLIIX: - iProfile = AE_DSP_PROFILE_DOLBY_PLIIX; - break; - case AV_MATRIX_ENCODING_DPLIIZ: - iProfile = AE_DSP_PROFILE_DOLBY_PLIIZ; - break; - case AV_MATRIX_ENCODING_DOLBYEX: - iProfile = AE_DSP_PROFILE_DOLBY_EX; - break; - case AV_MATRIX_ENCODING_DOLBYHEADPHONE: - iProfile = AE_DSP_PROFILE_DOLBY_HEADPHONE; - break; - case AV_MATRIX_ENCODING_NONE: - default: - iProfile = AE_DSP_PROFILE_DOLBY_NONE; - break; - } - - unsigned int iServiceType; - switch (m_ffMpegAudioServiceType) - { - case AV_AUDIO_SERVICE_TYPE_EFFECTS: - iServiceType = AE_DSP_SERVICE_TYPE_EFFECTS; - break; - case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED: - iServiceType = AE_DSP_SERVICE_TYPE_VISUALLY_IMPAIRED; - break; - case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED: - iServiceType = AE_DSP_SERVICE_TYPE_HEARING_IMPAIRED; - break; - case AV_AUDIO_SERVICE_TYPE_DIALOGUE: - iServiceType = AE_DSP_SERVICE_TYPE_DIALOGUE; - break; - case AV_AUDIO_SERVICE_TYPE_COMMENTARY: - iServiceType = AE_DSP_SERVICE_TYPE_COMMENTARY; - break; - case AV_AUDIO_SERVICE_TYPE_EMERGENCY: - iServiceType = AE_DSP_SERVICE_TYPE_EMERGENCY; - break; - case AV_AUDIO_SERVICE_TYPE_VOICE_OVER: - iServiceType = AE_DSP_SERVICE_TYPE_VOICE_OVER; - break; - case AV_AUDIO_SERVICE_TYPE_KARAOKE: - iServiceType = AE_DSP_SERVICE_TYPE_KARAOKE; - break; - case AV_AUDIO_SERVICE_TYPE_MAIN: - default: - iServiceType = AE_DSP_SERVICE_TYPE_MAIN; - break; - } - m_addonStreamProperties.Profile.ac3_eac3.iProfile = iProfile; - m_addonStreamProperties.Profile.ac3_eac3.iServiceType = iServiceType; - break; - } - case AE_DSP_ABASE_DTS: - case AE_DSP_ABASE_DTSHD_HRA: - case AE_DSP_ABASE_DTSHD_MA: - { - - unsigned int iProfile; - switch (m_ffMpegProfile) - { - case FF_PROFILE_DTS_ES: - iProfile = AE_DSP_PROFILE_DTS_ES; - break; - case FF_PROFILE_DTS_96_24: - iProfile = AE_DSP_PROFILE_DTS_96_24; - break; - case FF_PROFILE_DTS_HD_HRA: - iProfile = AE_DSP_PROFILE_DTS_HD_HRA; - break; - case FF_PROFILE_DTS_HD_MA: - iProfile = AE_DSP_PROFILE_DTS_HD_MA; - break; - case FF_PROFILE_DTS: - default: - iProfile = AE_DSP_PROFILE_DTS; - break; - } - - m_addonStreamProperties.Profile.dts_dtshd.iProfile = iProfile; - m_addonStreamProperties.Profile.dts_dtshd.bSurroundMatrix = m_ffMpegMatrixEncoding == AV_MATRIX_ENCODING_DOLBY ? true : false; - break; - } - case AE_DSP_ABASE_TRUEHD: - case AE_DSP_ABASE_MLP: - { - unsigned int iProfile; - switch (m_ffMpegMatrixEncoding) - { - case AV_MATRIX_ENCODING_DOLBY: - iProfile = AE_DSP_PROFILE_DOLBY_SURROUND; - break; - case AV_MATRIX_ENCODING_DPLII: - iProfile = AE_DSP_PROFILE_DOLBY_PLII; - break; - case AV_MATRIX_ENCODING_DPLIIX: - iProfile = AE_DSP_PROFILE_DOLBY_PLIIX; - break; - case AV_MATRIX_ENCODING_DPLIIZ: - iProfile = AE_DSP_PROFILE_DOLBY_PLIIZ; - break; - case AV_MATRIX_ENCODING_DOLBYEX: - iProfile = AE_DSP_PROFILE_DOLBY_EX; - break; - case AV_MATRIX_ENCODING_DOLBYHEADPHONE: - iProfile = AE_DSP_PROFILE_DOLBY_HEADPHONE; - break; - case AV_MATRIX_ENCODING_NONE: - default: - iProfile = AE_DSP_PROFILE_DOLBY_NONE; - break; - } - - m_addonStreamProperties.Profile.mlp_truehd.iProfile = iProfile; - break; - } - case AE_DSP_ABASE_FLAC: - break; - default: - ret = false; - break; - } - - return ret; -} - -void CActiveAEDSPProcess::Destroy() -{ - CSingleLock lock(m_restartSection); - - if (!CActiveAEDSP::GetInstance().IsActivated()) - return; - - for (AE_DSP_ADDONMAP_ITR itr = m_usedMap.begin(); itr != m_usedMap.end(); ++itr) - { - itr->second->StreamDestroy(&m_addon_Handles[itr->first]); - } - - ResetStreamFunctionsSelection(); -} - -void CActiveAEDSPProcess::ForceReinit() -{ - CSingleLock lock(m_restartSection); - m_forceInit = true; -} - -AE_DSP_STREAMTYPE CActiveAEDSPProcess::DetectStreamType(const CFileItem *item) -{ - AE_DSP_STREAMTYPE detected = AE_DSP_ASTREAM_BASIC; - if (item->HasMusicInfoTag()) - detected = AE_DSP_ASTREAM_MUSIC; - else if (item->HasVideoInfoTag() || g_application.m_pPlayer->HasVideo()) - detected = AE_DSP_ASTREAM_MOVIE; -// else if (item->HasVideoInfoTag()) -// detected = AE_DSP_ASTREAM_GAME; -// else if (item->HasVideoInfoTag()) -// detected = AE_DSP_ASTREAM_APP; -// else if (item->HasVideoInfoTag()) -// detected = AE_DSP_ASTREAM_MESSAGE; -// else if (item->HasVideoInfoTag()) -// detected = AE_DSP_ASTREAM_PHONE; - else - detected = AE_DSP_ASTREAM_BASIC; - - return detected; -} - -AE_DSP_STREAM_ID CActiveAEDSPProcess::GetStreamId() const -{ - return m_streamId; -} - -unsigned int CActiveAEDSPProcess::GetInputChannels() -{ - return m_inputFormat.m_channelLayout.Count(); -} - -std::string CActiveAEDSPProcess::GetInputChannelNames() -{ - return m_inputFormat.m_channelLayout; -} - -unsigned int CActiveAEDSPProcess::GetInputSamplerate() -{ - return m_inputFormat.m_sampleRate; -} - -unsigned int CActiveAEDSPProcess::GetProcessSamplerate() -{ - return m_addonSettings.iProcessSamplerate; -} - -unsigned int CActiveAEDSPProcess::GetOutputChannels() -{ - return m_outputFormat.m_channelLayout.Count(); -} - -std::string CActiveAEDSPProcess::GetOutputChannelNames() -{ - return m_outputFormat.m_channelLayout; -} - -unsigned int CActiveAEDSPProcess::GetOutputSamplerate() -{ - return m_outputSamplerate; -} - -unsigned int CActiveAEDSPProcess::GetOutputFrames() -{ - return m_outputFrames; -} - -float CActiveAEDSPProcess::GetCPUUsage(void) const -{ - return m_fLastProcessUsage; -} - -CAEChannelInfo CActiveAEDSPProcess::GetChannelLayout() -{ - return m_outputFormat.m_channelLayout; -} - -AEDataFormat CActiveAEDSPProcess::GetDataFormat() -{ - return m_dataFormat; -} - -AEAudioFormat CActiveAEDSPProcess::GetInputFormat() -{ - return m_inputFormat; -} - -AE_DSP_STREAMTYPE CActiveAEDSPProcess::GetDetectedStreamType() -{ - return m_streamTypeDetected; -} - -AE_DSP_STREAMTYPE CActiveAEDSPProcess::GetUsedStreamType() -{ - return m_streamTypeUsed; -} - -AE_DSP_BASETYPE CActiveAEDSPProcess::GetBaseType(AE_DSP_STREAM_PROPERTIES *props) -{ - if (!strcmp(props->strCodecId, "ac3")) - return AE_DSP_ABASE_AC3; - else if (!strcmp(props->strCodecId, "eac3")) - return AE_DSP_ABASE_EAC3; - else if (!strcmp(props->strCodecId, "dca") || !strcmp(props->strCodecId, "dts")) - return AE_DSP_ABASE_DTS; - else if (!strcmp(props->strCodecId, "dtshd_hra")) - return AE_DSP_ABASE_DTSHD_HRA; - else if (!strcmp(props->strCodecId, "dtshd_ma")) - return AE_DSP_ABASE_DTSHD_MA; - else if (!strcmp(props->strCodecId, "truehd")) - return AE_DSP_ABASE_TRUEHD; - else if (!strcmp(props->strCodecId, "mlp")) - return AE_DSP_ABASE_MLP; - else if (!strcmp(props->strCodecId, "flac")) - return AE_DSP_ABASE_FLAC; - else if (props->iChannels > 2) - return AE_DSP_ABASE_MULTICHANNEL; - else if (props->iChannels == 2) - return AE_DSP_ABASE_STEREO; - else - return AE_DSP_ABASE_MONO; -} - -AE_DSP_BASETYPE CActiveAEDSPProcess::GetUsedBaseType() -{ - return GetBaseType(&m_addonStreamProperties); -} - -bool CActiveAEDSPProcess::GetMasterModeStreamInfoString(std::string &strInfo) -{ - if (m_activeMode <= AE_DSP_MASTER_MODE_ID_PASSOVER) - { - strInfo = ""; - return true; - } - - if (m_activeMode < 0 || !m_addons_MasterProc[m_activeMode].pAddon) - return false; - - strInfo = m_addons_MasterProc[m_activeMode].pAddon->MasterProcessGetStreamInfoString(&m_addons_MasterProc[m_activeMode].handle); - - return true; -} - -bool CActiveAEDSPProcess::GetMasterModeTypeInformation(AE_DSP_STREAMTYPE &streamTypeUsed, AE_DSP_BASETYPE &baseType, int &iModeID) -{ - streamTypeUsed = (AE_DSP_STREAMTYPE)m_addonStreamProperties.iStreamType; - - if (m_activeMode < 0) - return false; - - baseType = m_addons_MasterProc[m_activeMode].pMode->BaseType(); - iModeID = m_addons_MasterProc[m_activeMode].pMode->ModeID(); - return true; -} - -const char *CActiveAEDSPProcess::GetStreamTypeName(AE_DSP_STREAMTYPE iStreamType) -{ - return iStreamType == AE_DSP_ASTREAM_BASIC ? "Basic" : - iStreamType == AE_DSP_ASTREAM_MUSIC ? "Music" : - iStreamType == AE_DSP_ASTREAM_MOVIE ? "Movie" : - iStreamType == AE_DSP_ASTREAM_GAME ? "Game" : - iStreamType == AE_DSP_ASTREAM_APP ? "App" : - iStreamType == AE_DSP_ASTREAM_PHONE ? "Phone" : - iStreamType == AE_DSP_ASTREAM_MESSAGE ? "Message" : - iStreamType == AE_DSP_ASTREAM_AUTO ? "Automatic" : - "Unknown"; -} - -bool CActiveAEDSPProcess::MasterModeChange(int iModeID, AE_DSP_STREAMTYPE iStreamType) -{ - bool bReturn = false; - bool bSwitchStreamType = iStreamType != AE_DSP_ASTREAM_INVALID; - - /* The Mode is already used and need not to set up again */ - if (m_addons_MasterProc[m_activeMode].pMode->ModeID() == iModeID && !bSwitchStreamType) - return true; - - CSingleLock lock(m_restartSection); - - CLog::Log(LOGDEBUG, "ActiveAE DSP - %s - Audio DSP processing id %d mode change:", __FUNCTION__, m_streamId); - if (bSwitchStreamType && m_streamTypeUsed != iStreamType) - { - AE_DSP_STREAMTYPE old = m_streamTypeUsed; - CLog::Log(LOGDEBUG, " ---- Input stream ----"); - if (iStreamType == AE_DSP_ASTREAM_AUTO) - m_streamTypeUsed = m_streamTypeDetected; - else if (iStreamType >= AE_DSP_ASTREAM_BASIC || iStreamType < AE_DSP_ASTREAM_AUTO) - m_streamTypeUsed = iStreamType; - else - { - CLog::Log(LOGWARNING, "ActiveAE DSP - %s - Unknown audio stream type, falling back to basic", __FUNCTION__); - m_streamTypeUsed = AE_DSP_ASTREAM_BASIC; - } - - CLog::Log(LOGDEBUG, " | Stream Type change : From '%s' to '%s'", GetStreamTypeName(old), GetStreamTypeName(m_streamTypeUsed)); - } - - /*! - * Set the new stream type to the addon settings and properties structures. - * If the addon want to use another stream type, it can be becomes written inside - * the m_addonStreamProperties.iStreamType. - */ - m_addonStreamProperties.iStreamType = m_streamTypeUsed; - m_addonSettings.iStreamType = m_streamTypeUsed; - m_activeModeOutChannels = -1; - - if (iModeID <= AE_DSP_MASTER_MODE_ID_PASSOVER) - { - CLog::Log(LOGINFO, "ActiveAE DSP - Switching master mode off"); - m_activeMode = 0; - bReturn = true; - } - else - { - CActiveAEDSPModePtr mode; - for (unsigned int ptr = 0; ptr < m_addons_MasterProc.size(); ++ptr) - { - mode = m_addons_MasterProc.at(ptr).pMode; - if (mode->ModeID() == iModeID && mode->IsEnabled()) - { - if (m_addons_MasterProc[ptr].pAddon) - { - AE_DSP_ERROR err = m_addons_MasterProc[ptr].pAddon->MasterProcessSetMode(&m_addons_MasterProc[ptr].handle, m_addonStreamProperties.iStreamType, mode->AddonModeNumber(), mode->ModeID()); - if (err != AE_DSP_ERROR_NO_ERROR) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - addon master mode selection failed on %s with Mode '%s' with %s", - __FUNCTION__, - m_addons_MasterProc[ptr].pAddon->GetAudioDSPName().c_str(), - mode->AddonModeName().c_str(), - CActiveAEDSPAddon::ToString(err)); - } - else - { - CLog::Log(LOGINFO, "ActiveAE DSP - Switching master mode to '%s' as '%s' on '%s'", - mode->AddonModeName().c_str(), - GetStreamTypeName((AE_DSP_STREAMTYPE)m_addonStreamProperties.iStreamType), - m_addons_MasterProc[ptr].pAddon->GetAudioDSPName().c_str()); - - m_activeMode = (int)ptr; - m_activeModeOutChannels = m_addons_MasterProc[m_activeMode].pAddon->MasterProcessGetOutChannels(&m_addons_MasterProc[ptr].handle, m_activeModeOutChannelsPresent); - bReturn = true; - } - } - else if (mode->ModeID() >= AE_DSP_MASTER_MODE_ID_INTERNAL_TYPES) - { - CLog::Log(LOGINFO, "ActiveAE DSP - Switching master mode to internal '%s' as '%s'", - mode->AddonModeName().c_str(), - GetStreamTypeName((AE_DSP_STREAMTYPE)m_addonStreamProperties.iStreamType)); - - m_activeMode = (int)ptr; - m_activeModeOutChannels = -1; - bReturn = true; - } - break; - } - } - } - - /*! - * Initialize fallback matrix mixer - */ - InitFFMpegDSPProcessor(); - - return bReturn; -} - -void CActiveAEDSPProcess::ClearArray(float **array, unsigned int samples) -{ - unsigned int presentFlag = 1; - for (int i = 0; i < AE_DSP_CH_MAX; ++i) - { - if (m_addonSettings.lOutChannelPresentFlags & presentFlag) - memset(array[i], 0, samples*sizeof(float)); - presentFlag <<= 1; - } -} - -bool CActiveAEDSPProcess::Process(CSampleBuffer *in, CSampleBuffer *out) -{ - CSingleLock lock(m_restartSection); - - bool needDSPAddonsReinit = m_forceInit; - uint64_t iTime = static_cast(XbmcThreads::SystemClockMillis()) * 10000; - int64_t hostFrequency = CurrentHostFrequency(); - unsigned int frames = in->pkt->nb_samples; - - /* Detect interleaved input stream channel positions if unknown or changed */ - if (m_channelLayoutIn != in->pkt->config.channel_layout) - { - m_channelLayoutIn = in->pkt->config.channel_layout; - - m_idx_in[AE_CH_FL] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_FRONT_LEFT); - m_idx_in[AE_CH_FR] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_FRONT_RIGHT); - m_idx_in[AE_CH_FC] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_FRONT_CENTER); - m_idx_in[AE_CH_LFE] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_LOW_FREQUENCY); - m_idx_in[AE_CH_BL] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_BACK_LEFT); - m_idx_in[AE_CH_BR] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_BACK_RIGHT); - m_idx_in[AE_CH_FLOC] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_FRONT_LEFT_OF_CENTER); - m_idx_in[AE_CH_FROC] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_FRONT_RIGHT_OF_CENTER); - m_idx_in[AE_CH_BC] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_BACK_CENTER); - m_idx_in[AE_CH_SL] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_SIDE_LEFT); - m_idx_in[AE_CH_SR] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_SIDE_RIGHT); - m_idx_in[AE_CH_TC] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_TOP_CENTER); - m_idx_in[AE_CH_TFL] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_TOP_FRONT_LEFT); - m_idx_in[AE_CH_TFC] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_TOP_FRONT_CENTER); - m_idx_in[AE_CH_TFR] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_TOP_FRONT_RIGHT); - m_idx_in[AE_CH_TBL] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_TOP_BACK_LEFT); - m_idx_in[AE_CH_TBC] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_TOP_BACK_CENTER); - m_idx_in[AE_CH_TBR] = av_get_channel_layout_channel_index(m_channelLayoutIn, AV_CH_TOP_BACK_RIGHT); - - needDSPAddonsReinit = true; - } - - /* Detect also interleaved output stream channel positions if unknown or changed */ - if (m_channelLayoutOut != out->pkt->config.channel_layout) - { - m_channelLayoutOut = out->pkt->config.channel_layout; - - m_idx_out[AE_CH_FL] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_FRONT_LEFT); - m_idx_out[AE_CH_FR] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_FRONT_RIGHT); - m_idx_out[AE_CH_FC] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_FRONT_CENTER); - m_idx_out[AE_CH_LFE] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_LOW_FREQUENCY); - m_idx_out[AE_CH_BL] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_BACK_LEFT); - m_idx_out[AE_CH_BR] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_BACK_RIGHT); - m_idx_out[AE_CH_FLOC] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_FRONT_LEFT_OF_CENTER); - m_idx_out[AE_CH_FROC] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_FRONT_RIGHT_OF_CENTER); - m_idx_out[AE_CH_BC] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_BACK_CENTER); - m_idx_out[AE_CH_SL] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_SIDE_LEFT); - m_idx_out[AE_CH_SR] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_SIDE_RIGHT); - m_idx_out[AE_CH_TC] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_TOP_CENTER); - m_idx_out[AE_CH_TFL] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_TOP_FRONT_LEFT); - m_idx_out[AE_CH_TFC] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_TOP_FRONT_CENTER); - m_idx_out[AE_CH_TFR] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_TOP_FRONT_RIGHT); - m_idx_out[AE_CH_TBL] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_TOP_BACK_LEFT); - m_idx_out[AE_CH_TBC] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_TOP_BACK_CENTER); - m_idx_out[AE_CH_TBR] = av_get_channel_layout_channel_index(m_channelLayoutOut, AV_CH_TOP_BACK_RIGHT); - - needDSPAddonsReinit = true; - } - - if (needDSPAddonsReinit) - { - m_addonSettings.lInChannelPresentFlags = 0; - if (m_idx_in[AE_CH_FL] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_FL; - if (m_idx_in[AE_CH_FR] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_FR; - if (m_idx_in[AE_CH_FC] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_FC; - if (m_idx_in[AE_CH_LFE] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_LFE; - if (m_idx_in[AE_CH_BL] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_BL; - if (m_idx_in[AE_CH_BR] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_BR; - if (m_idx_in[AE_CH_FLOC] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_FLOC; - if (m_idx_in[AE_CH_FROC] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_FROC; - if (m_idx_in[AE_CH_BC] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_BC; - if (m_idx_in[AE_CH_SL] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_SL; - if (m_idx_in[AE_CH_SR] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_SR; - if (m_idx_in[AE_CH_TFL] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TFL; - if (m_idx_in[AE_CH_TFR] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TFR; - if (m_idx_in[AE_CH_TFC] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TFC; - if (m_idx_in[AE_CH_TC] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TC; - if (m_idx_in[AE_CH_TBL] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TBL; - if (m_idx_in[AE_CH_TBR] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TBR; - if (m_idx_in[AE_CH_TBC] >= 0) m_addonSettings.lInChannelPresentFlags |= AE_DSP_PRSNT_CH_TBC; - - m_addonSettings.lOutChannelPresentFlags = 0; - if (m_idx_out[AE_CH_FL] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_FL; - if (m_idx_out[AE_CH_FR] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_FR; - if (m_idx_out[AE_CH_FC] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_FC; - if (m_idx_out[AE_CH_LFE] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_LFE; - if (m_idx_out[AE_CH_BL] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_BL; - if (m_idx_out[AE_CH_BR] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_BR; - if (m_idx_out[AE_CH_FLOC] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_FLOC; - if (m_idx_out[AE_CH_FROC] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_FROC; - if (m_idx_out[AE_CH_BC] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_BC; - if (m_idx_out[AE_CH_SL] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_SL; - if (m_idx_out[AE_CH_SR] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_SR; - if (m_idx_out[AE_CH_TFL] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TFL; - if (m_idx_out[AE_CH_TFR] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TFR; - if (m_idx_out[AE_CH_TFC] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TFC; - if (m_idx_out[AE_CH_TC] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TC; - if (m_idx_out[AE_CH_TBL] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TBL; - if (m_idx_out[AE_CH_TBR] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TBR; - if (m_idx_out[AE_CH_TBC] >= 0) m_addonSettings.lOutChannelPresentFlags |= AE_DSP_PRSNT_CH_TBC; - - m_addonSettings.iStreamID = m_streamId; - m_addonSettings.iInChannels = in->pkt->config.channels; - m_addonSettings.iOutChannels = out->pkt->config.channels; - m_addonSettings.iInSamplerate = in->pkt->config.sample_rate; - m_addonSettings.iProcessSamplerate = m_addon_InputResample.pAddon ? m_addon_InputResample.pAddon->InputResampleSampleRate(&m_addon_InputResample.handle) : m_addonSettings.iInSamplerate; - m_addonSettings.iOutSamplerate = m_addon_OutputResample.pAddon ? m_addon_OutputResample.pAddon->OutputResampleSampleRate(&m_addon_OutputResample.handle) : m_addonSettings.iProcessSamplerate; - - if (m_NewMasterMode >= 0) - { - MasterModeChange(m_NewMasterMode, m_NewStreamType); - m_NewMasterMode = AE_DSP_MASTER_MODE_ID_INVALID; - m_NewStreamType = AE_DSP_ASTREAM_INVALID; - } - - for (AE_DSP_ADDONMAP_ITR itr = m_usedMap.begin(); itr != m_usedMap.end(); ++itr) - { - AE_DSP_ERROR err = itr->second->StreamInitialize(&m_addon_Handles[itr->first], &m_addonSettings); - if (err != AE_DSP_ERROR_NO_ERROR) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - addon initialize failed on %s with %s", __FUNCTION__, itr->second->GetAudioDSPName().c_str(), CActiveAEDSPAddon::ToString(err)); - } - } - - RecheckProcessArray(frames); - ClearArray(m_processArray[0], m_processArraySize); - ClearArray(m_processArray[1], m_processArraySize); - - m_forceInit = false; - m_iLastProcessTime = static_cast(XbmcThreads::SystemClockMillis()) * 10000; - m_iLastProcessUsage = 0; - m_fLastProcessUsage = 0.0f; - - /** - * Setup ffmpeg convert array for input stream - */ - SetFFMpegDSPProcessorArray(m_ffMpegConvertArray, m_processArray[0], NULL); - } - - int64_t startTime; - float **lastOutArray = m_processArray[0]; - unsigned int togglePtr = 1; - - /** - * Convert to required planar float format inside dsp system - */ - if (swr_convert(m_convertInput, (uint8_t **)m_ffMpegConvertArray[0], m_processArraySize, (const uint8_t **)in->pkt->data , frames) < 0) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - input audio convert failed", __FUNCTION__); - return false; - } - - /**********************************************/ - /** DSP Processing Algorithms following here **/ - /**********************************************/ - - /** - * DSP input processing - * Can be used to have unchanged input stream.. - * All DSP addons allowed todo this. - */ - for (unsigned int i = 0; i < m_addons_InputProc.size(); ++i) - { - if (!m_addons_InputProc[i].pAddon->InputProcess(&m_addons_InputProc[i].handle, (const float **)lastOutArray, frames)) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - input process failed on addon No. %i", __FUNCTION__, i); - return false; - } - } - - /** - * DSP resample processing before master - * Here a high quality resample can be performed. - * Only one DSP addon is allowed todo this! - */ - if (m_addon_InputResample.pAddon) - { - startTime = CurrentHostCounter(); - - frames = m_addon_InputResample.pAddon->InputResampleProcess(&m_addon_InputResample.handle, lastOutArray, m_processArray[togglePtr], frames); - if (frames == 0) - return false; - - m_addon_InputResample.iLastTime += 1000 * 10000 * (CurrentHostCounter() - startTime) / hostFrequency; - - lastOutArray = m_processArray[togglePtr]; - togglePtr ^= 1; - } - - /** - * DSP pre processing - * All DSP addons allowed todo this and order of it set on settings. - */ - for (unsigned int i = 0; i < m_addons_PreProc.size(); ++i) - { - startTime = CurrentHostCounter(); - - frames = m_addons_PreProc[i].pAddon->PreProcess(&m_addons_PreProc[i].handle, m_addons_PreProc[i].iAddonModeNumber, lastOutArray, m_processArray[togglePtr], frames); - if (frames == 0) - return false; - - m_addons_PreProc[i].iLastTime += 1000 * 10000 * (CurrentHostCounter() - startTime) / hostFrequency; - - lastOutArray = m_processArray[togglePtr]; - togglePtr ^= 1; - } - - /** - * DSP master processing - * Here a channel upmix/downmix for stereo surround sound can be performed - * Only one DSP addon is allowed todo this! - */ - if (m_addons_MasterProc[m_activeMode].pAddon) - { - startTime = CurrentHostCounter(); - - frames = m_addons_MasterProc[m_activeMode].pAddon->MasterProcess(&m_addons_MasterProc[m_activeMode].handle, lastOutArray, m_processArray[togglePtr], frames); - if (frames == 0) - return false; - - m_addons_MasterProc[m_activeMode].iLastTime += 1000 * 10000 * (CurrentHostCounter() - startTime) / hostFrequency; - - lastOutArray = m_processArray[togglePtr]; - togglePtr ^= 1; - } - - /** - * Perform fallback channel mixing if input channel alignment is different - * from output and not becomes processed by active master processing mode or - * perform ffmpeg related internal master processes. - */ - if (m_resamplerDSPProcessor) - { - startTime = CurrentHostCounter(); - - if (needDSPAddonsReinit) - SetFFMpegDSPProcessorArray(m_ffMpegProcessArray, lastOutArray, m_processArray[togglePtr]); - - frames = m_resamplerDSPProcessor->Resample((uint8_t**)m_ffMpegProcessArray[FFMPEG_PROC_ARRAY_OUT], frames, (uint8_t**)m_ffMpegProcessArray[FFMPEG_PROC_ARRAY_IN], frames, 1.0); - if (frames <= 0) - { - CLog::Log(LOGERROR, "CActiveAEResample::Resample - resample failed"); - return false; - } - - m_addons_MasterProc[m_activeMode].iLastTime += 1000 * 10000 * (CurrentHostCounter() - startTime) / hostFrequency; - - lastOutArray = m_processArray[togglePtr]; - togglePtr ^= 1; - } - - /** - * DSP post processing - * On the post processing can be things performed with additional channel upmix like 6.1 to 7.1 - * or frequency/volume corrections, speaker distance handling, equalizer... . - * All DSP addons allowed todo this and order of it set on settings. - */ - for (unsigned int i = 0; i < m_addons_PostProc.size(); ++i) - { - startTime = CurrentHostCounter(); - - frames = m_addons_PostProc[i].pAddon->PostProcess(&m_addons_PostProc[i].handle, m_addons_PostProc[i].iAddonModeNumber, lastOutArray, m_processArray[togglePtr], frames); - if (frames == 0) - return false; - - m_addons_PostProc[i].iLastTime += 1000 * 10000 * (CurrentHostCounter() - startTime) / hostFrequency; - - lastOutArray = m_processArray[togglePtr]; - togglePtr ^= 1; - } - - /** - * DSP resample processing behind master - * Here a high quality resample can be performed. - * Only one DSP addon is allowed todo this! - */ - if (m_addon_OutputResample.pAddon) - { - startTime = CurrentHostCounter(); - - frames = m_addon_OutputResample.pAddon->OutputResampleProcess(&m_addon_OutputResample.handle, lastOutArray, m_processArray[togglePtr], frames); - if (frames == 0) - return false; - - m_addon_OutputResample.iLastTime += 1000 * 10000 * (CurrentHostCounter() - startTime) / hostFrequency; - - lastOutArray = m_processArray[togglePtr]; - togglePtr ^= 1; - } - - /** - * Setup ffmpeg convert array for output stream, performed here to now last array - */ - if (needDSPAddonsReinit) - SetFFMpegDSPProcessorArray(m_ffMpegConvertArray, NULL, lastOutArray); - - /** - * Convert back to required output format - */ - if (swr_convert(m_convertOutput, (uint8_t **)out->pkt->data, m_processArraySize, (const uint8_t **)m_ffMpegConvertArray[1], frames) < 0) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - output audio convert failed", __FUNCTION__); - return false; - } - out->pkt->nb_samples = frames; - - /** - * Update cpu process percent usage values for modes and total (every second) - */ - if (iTime >= m_iLastProcessTime + 1000*10000) - CalculateCPUUsage(iTime); - - return true; -} - -bool CActiveAEDSPProcess::RecheckProcessArray(unsigned int inputFrames) -{ - /* Check for big enough array */ - unsigned int framesNeeded; - unsigned int framesOut = m_processArraySize; - - if (inputFrames > framesOut) - framesOut = inputFrames; - - if (m_addon_InputResample.pAddon) - { - framesNeeded = m_addon_InputResample.pAddon->InputResampleProcessNeededSamplesize(&m_addon_InputResample.handle); - if (framesNeeded > framesOut) - framesOut = framesNeeded; - } - - for (unsigned int i = 0; i < m_addons_PreProc.size(); ++i) - { - framesNeeded = m_addons_PreProc[i].pAddon->PreProcessNeededSamplesize(&m_addons_PreProc[i].handle, m_addons_PreProc[i].iAddonModeNumber); - if (framesNeeded > framesOut) - framesOut = framesNeeded; - } - - if (m_addons_MasterProc[m_activeMode].pAddon) - { - framesNeeded = m_addons_MasterProc[m_activeMode].pAddon->MasterProcessNeededSamplesize(&m_addons_MasterProc[m_activeMode].handle); - if (framesNeeded > framesOut) - framesOut = framesNeeded; - } - - for (unsigned int i = 0; i < m_addons_PostProc.size(); ++i) - { - framesNeeded = m_addons_PostProc[i].pAddon->PostProcessNeededSamplesize(&m_addons_PostProc[i].handle, m_addons_PostProc[i].iAddonModeNumber); - if (framesNeeded > framesOut) - framesOut = framesNeeded; - } - - if (m_addon_OutputResample.pAddon) - { - framesNeeded = m_addon_OutputResample.pAddon->OutputResampleProcessNeededSamplesize(&m_addon_OutputResample.handle); - if (framesNeeded > framesOut) - framesOut = framesNeeded; - } - - if (framesOut > m_processArraySize) - { - if (!ReallocProcessArray(framesOut)) - return false; - - m_processArraySize = framesOut; - } - return true; -} - -bool CActiveAEDSPProcess::ReallocProcessArray(unsigned int requestSize) -{ - m_processArraySize = requestSize + MIN_DSP_ARRAY_SIZE / 10; - for (int i = 0; i < AE_DSP_CH_MAX; ++i) - { - m_processArray[0][i] = (float*)realloc(m_processArray[0][i], m_processArraySize*sizeof(float)); - m_processArray[1][i] = (float*)realloc(m_processArray[1][i], m_processArraySize*sizeof(float)); - if (m_processArray[0][i] == NULL || m_processArray[1][i] == NULL) - { - CLog::Log(LOGERROR, "ActiveAE DSP - %s - realloc of process data array failed", __FUNCTION__); - return false; - } - } - return true; -} - -// in this function the usage for each adsp-mode in percent is calculated -void CActiveAEDSPProcess::CalculateCPUUsage(uint64_t iTime) -{ - int64_t iUsage = CThread::GetCurrentThread()->GetAbsoluteUsage(); - - if (iTime != m_iLastProcessTime) - { - // calculate usage only if we don't divide by zero - if (m_iLastProcessUsage > 0 && m_iLastProcessTime > 0) - { - m_fLastProcessUsage = (float)(iUsage - m_iLastProcessUsage) / (float)(iTime - m_iLastProcessTime) * 100.0f; - } - - float dTFactor = 100.0f / (float)(iTime - m_iLastProcessTime); - - if(m_addon_InputResample.pMode) - { - m_addon_InputResample.pMode->SetCPUUsage((float)(m_addon_InputResample.iLastTime)*dTFactor); - m_addon_InputResample.iLastTime = 0; - } - - for (unsigned int i = 0; i < m_addons_PreProc.size(); ++i) - { - m_addons_PreProc[i].pMode->SetCPUUsage((float)(m_addons_PreProc[i].iLastTime)*dTFactor); - m_addons_PreProc[i].iLastTime = 0; - } - - if (m_addons_MasterProc[m_activeMode].pMode) - { - m_addons_MasterProc[m_activeMode].pMode->SetCPUUsage((float)(m_addons_MasterProc[m_activeMode].iLastTime)*dTFactor); - m_addons_MasterProc[m_activeMode].iLastTime = 0; - } - - for (unsigned int i = 0; i < m_addons_PostProc.size(); ++i) - { - m_addons_PostProc[i].pMode->SetCPUUsage((float)(m_addons_PostProc[i].iLastTime)*dTFactor); - m_addons_PostProc[i].iLastTime = 0; - } - - if (m_addon_OutputResample.pMode) - { - m_addon_OutputResample.pMode->SetCPUUsage((float)(m_addon_OutputResample.iLastTime)*dTFactor); - m_addon_OutputResample.iLastTime = 0; - } - } - - m_iLastProcessUsage = iUsage; - m_iLastProcessTime = iTime; -} - -void CActiveAEDSPProcess::SetFFMpegDSPProcessorArray(float *array_ffmpeg[2][AE_DSP_CH_MAX], float **array_in, float **array_out) -{ - /*! - * Setup ffmpeg resampler channel setup, this way is not my favorite but it works to become - * the correct channel alignment on the given input and output signal. - * The problem is, the process array of ffmpeg is not fixed and for every selected channel setup - * the positions are different. For this case a translation from the fixed dsp stream format to - * ffmpeg format must be performed. It use a separate process array table which becomes set by - * already present channel memory storage. - */ - - //! Initialize input channel alignmment for ffmpeg process array - if (array_in) - { - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_FL) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_FL]] = array_in[AE_DSP_CH_FL]; - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_FR]] = array_in[AE_DSP_CH_FR]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_FC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_FC]] = array_in[AE_DSP_CH_FC]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_LFE) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_LFE]] = array_in[AE_DSP_CH_LFE]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_BL) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_BL]] = array_in[AE_DSP_CH_BL]; - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_BR]] = array_in[AE_DSP_CH_BR]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_FLOC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_FLOC]] = array_in[AE_DSP_CH_FLOC]; - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_FROC]] = array_in[AE_DSP_CH_FROC]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_BC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_BC]] = array_in[AE_DSP_CH_BC]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_SL) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_SL]] = array_in[AE_DSP_CH_SL]; - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_SR]] = array_in[AE_DSP_CH_SR]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_TFL) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_TFL]] = array_in[AE_DSP_CH_TFL]; - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_TFR]] = array_in[AE_DSP_CH_TFR]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_TFC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_TFC]] = array_in[AE_DSP_CH_TFC]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_TC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_TC]] = array_in[AE_DSP_CH_TC]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_TBL) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_TBL]] = array_in[AE_DSP_CH_TBL]; - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_TBR]] = array_in[AE_DSP_CH_TBR]; - } - if (m_addonSettings.lInChannelPresentFlags & AE_DSP_PRSNT_CH_TBC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_IN][m_idx_in[AE_CH_TBC]] = array_in[AE_DSP_CH_TBC]; - } - } - - if (array_out) - { - //! Initialize output channel alignmment for ffmpeg process array - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_FL) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_FL]] = array_out[AE_DSP_CH_FL]; - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_FR]] = array_out[AE_DSP_CH_FR]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_FC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_FC]] = array_out[AE_DSP_CH_FC]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_LFE) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_LFE]] = array_out[AE_DSP_CH_LFE]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_BL) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_BL]] = array_out[AE_DSP_CH_BL]; - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_BR]] = array_out[AE_DSP_CH_BR]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_FLOC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_FLOC]] = array_out[AE_DSP_CH_FLOC]; - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_FROC]] = array_out[AE_DSP_CH_FROC]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_BC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_BC]] = array_out[AE_DSP_CH_BC]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_SL) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_SL]] = array_out[AE_DSP_CH_SL]; - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_SR]] = array_out[AE_DSP_CH_SR]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_TFL) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_TFL]] = array_out[AE_DSP_CH_TFL]; - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_TFR]] = array_out[AE_DSP_CH_TFR]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_TFC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_TFC]] = array_out[AE_DSP_CH_TFC]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_TC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_TC]] = array_out[AE_DSP_CH_TC]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_TBL) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_TBL]] = array_out[AE_DSP_CH_TBL]; - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_TBR]] = array_out[AE_DSP_CH_TBR]; - } - if (m_addonSettings.lOutChannelPresentFlags & AE_DSP_PRSNT_CH_TBC) - { - array_ffmpeg[FFMPEG_PROC_ARRAY_OUT][m_idx_out[AE_CH_TBC]] = array_out[AE_DSP_CH_TBC]; - } - } -} - -float CActiveAEDSPProcess::GetDelay() -{ - float delay = 0.0f; - - CSingleLock lock(m_critSection); - - if (m_addon_InputResample.pAddon) - delay += m_addon_InputResample.pAddon->InputResampleGetDelay(&m_addon_InputResample.handle); - - for (unsigned int i = 0; i < m_addons_PreProc.size(); ++i) - delay += m_addons_PreProc[i].pAddon->PreProcessGetDelay(&m_addons_PreProc[i].handle, m_addons_PreProc[i].iAddonModeNumber); - - if (m_addons_MasterProc[m_activeMode].pAddon) - delay += m_addons_MasterProc[m_activeMode].pAddon->MasterProcessGetDelay(&m_addons_MasterProc[m_activeMode].handle); - - for (unsigned int i = 0; i < m_addons_PostProc.size(); ++i) - delay += m_addons_PostProc[i].pAddon->PostProcessGetDelay(&m_addons_PostProc[i].handle, m_addons_PostProc[i].iAddonModeNumber); - - if (m_addon_OutputResample.pAddon) - delay += m_addon_OutputResample.pAddon->OutputResampleGetDelay(&m_addon_OutputResample.handle); - - return delay; -} - -bool CActiveAEDSPProcess::HasActiveModes(AE_DSP_MODE_TYPE type) -{ - bool bReturn(false); - - CSingleLock lock(m_critSection); - - switch (type) - { - case AE_DSP_MODE_TYPE_INPUT_RESAMPLE: - if (m_addon_InputResample.pAddon != NULL) - bReturn = true; - break; - case AE_DSP_MODE_TYPE_PRE_PROCESS: - if (!m_addons_PreProc.empty()) - bReturn = true; - break; - case AE_DSP_MODE_TYPE_MASTER_PROCESS: - if (!m_addons_MasterProc.empty()) - bReturn = true; - break; - case AE_DSP_MODE_TYPE_POST_PROCESS: - if (!m_addons_PostProc.empty()) - bReturn = true; - break; - case AE_DSP_MODE_TYPE_OUTPUT_RESAMPLE: - if (m_addon_OutputResample.pAddon != NULL) - bReturn = true; - break; - default: - break; - }; - - return bReturn; -} - -void CActiveAEDSPProcess::GetActiveModes(AE_DSP_MODE_TYPE type, std::vector &modes) -{ - CSingleLock lock(m_critSection); - - if (m_addon_InputResample.pAddon != NULL && (type == AE_DSP_MODE_TYPE_UNDEFINED || type == AE_DSP_MODE_TYPE_INPUT_RESAMPLE)) - modes.push_back(m_addon_InputResample.pMode); - - if (type == AE_DSP_MODE_TYPE_UNDEFINED || type == AE_DSP_MODE_TYPE_PRE_PROCESS) - for (unsigned int i = 0; i < m_addons_PreProc.size(); ++i) - modes.push_back(m_addons_PreProc[i].pMode); - - if (m_addons_MasterProc[m_activeMode].pAddon != NULL && (type == AE_DSP_MODE_TYPE_UNDEFINED || type == AE_DSP_MODE_TYPE_MASTER_PROCESS)) - modes.push_back(m_addons_MasterProc[m_activeMode].pMode); - - if (type == AE_DSP_MODE_TYPE_UNDEFINED || type == AE_DSP_MODE_TYPE_POST_PROCESS) - for (unsigned int i = 0; i < m_addons_PostProc.size(); ++i) - modes.push_back(m_addons_PostProc[i].pMode); - - if (m_addon_OutputResample.pAddon != NULL && (type == AE_DSP_MODE_TYPE_UNDEFINED || type == AE_DSP_MODE_TYPE_OUTPUT_RESAMPLE)) - modes.push_back(m_addon_OutputResample.pMode); -} - -void CActiveAEDSPProcess::GetAvailableMasterModes(AE_DSP_STREAMTYPE streamType, std::vector &modes) -{ - CSingleLock lock(m_critSection); - - for (unsigned int i = 0; i < m_addons_MasterProc.size(); ++i) - { - if (m_addons_MasterProc[i].pMode->SupportStreamType(streamType)) - modes.push_back(m_addons_MasterProc[i].pMode); - } -} - -int CActiveAEDSPProcess::GetActiveMasterModeID() -{ - CSingleLock lock(m_critSection); - - return m_activeMode < 0 ? AE_DSP_MASTER_MODE_ID_INVALID : m_addons_MasterProc[m_activeMode].pMode->ModeID(); -} - -CActiveAEDSPModePtr CActiveAEDSPProcess::GetActiveMasterMode() const -{ - CSingleLock lock(m_critSection); - - CActiveAEDSPModePtr mode; - - if (m_activeMode < 0) - return mode; - - mode = m_addons_MasterProc[m_activeMode].pMode; - return mode; -} - -bool CActiveAEDSPProcess::SetMasterMode(AE_DSP_STREAMTYPE streamType, int iModeID, bool bSwitchStreamType) -{ - /*! - * if the unique master mode id is already used a reinit is not needed - */ - if (m_addons_MasterProc[m_activeMode].pMode->ModeID() == iModeID && !bSwitchStreamType) - return true; - - CSingleLock lock(m_restartSection); - - m_NewMasterMode = iModeID; - m_NewStreamType = bSwitchStreamType ? streamType : AE_DSP_ASTREAM_INVALID; - m_forceInit = true; - return true; -} - -bool CActiveAEDSPProcess::IsMenuHookModeActive(AE_DSP_MENUHOOK_CAT category, int iAddonId, unsigned int iModeNumber) -{ - std::vector *addons = NULL; - - switch (category) - { - case AE_DSP_MENUHOOK_MASTER_PROCESS: - addons = &m_addons_MasterProc; - break; - case AE_DSP_MENUHOOK_PRE_PROCESS: - addons = &m_addons_PreProc; - break; - case AE_DSP_MENUHOOK_POST_PROCESS: - addons = &m_addons_PostProc; - break; - case AE_DSP_MENUHOOK_RESAMPLE: - { - if (m_addon_InputResample.iAddonModeNumber > 0 && - m_addon_InputResample.pMode && - m_addon_InputResample.pMode->AddonID() == iAddonId && - m_addon_InputResample.pMode->AddonModeNumber() == iModeNumber) - return true; - - if (m_addon_OutputResample.iAddonModeNumber > 0 && - m_addon_OutputResample.pMode && - m_addon_OutputResample.pMode->AddonID() == iAddonId && - m_addon_OutputResample.pMode->AddonModeNumber() == iModeNumber) - return true; - } - default: - break; - } - - if (addons) - { - for (unsigned int i = 0; i < addons->size(); ++i) - { - if (addons->at(i).iAddonModeNumber > 0 && - addons->at(i).pMode->AddonID() == iAddonId && - addons->at(i).pMode->AddonModeNumber() == iModeNumber) - return true; - } - } - return false; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,353 +0,0 @@ -#pragma once -/* - * Copyright (C) 2010-2014 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include - -#include "ActiveAEDSP.h" - -extern "C" { -#include "libavcodec/avcodec.h" -#include "libswresample/swresample.h" -} - -namespace ActiveAE -{ - class CSampleBuffer; - class IAEResample; - class CActiveAEResample; - - //@{ - /*! - * Individual DSP Processing class - */ - class CActiveAEDSPProcess - { - public: - CActiveAEDSPProcess(AE_DSP_STREAM_ID streamId); - virtual ~CActiveAEDSPProcess(); - - //@{ - /*!> - * Create the dsp processing with check of all addons about the used input and output audio format. - * @param inputFormat The used audio stream input format - * @param outputFormat Audio output format which is needed to send to the sinks - * @param upmix stereo upmix value from KODI settings is passed in with it - * @param quality The requested quality from settings - * @param streamType The input stream type to find allowed master process dsp addons for it, e.g. AE_DSP_ASTREAM_MUSIC - * @return True if the dsp processing becomes available - */ - bool Create(const AEAudioFormat &inputFormat, const AEAudioFormat &outputFormat, bool upmix, AEQuality quality, AE_DSP_STREAMTYPE streamType, - enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type, int profile); - - /*!> - * Destroy all allocated dsp addons for this stream id and stops the processing. - */ - void Destroy(); - - /*!> - * Force processing function (Process(...)) to perform a reinitialization of addons and data - */ - void ForceReinit(); - - /*!> - * Get the stream id for this processing class - */ - AE_DSP_STREAM_ID GetStreamId() const; - - /*!> - * Get the currently used input stream format - * @note used to have a fallback to normal operation without dsp - */ - AEAudioFormat GetInputFormat(); - - /*!> - * Get the incoming channels amount for this class - */ - unsigned int GetInputChannels(); - - /*!> - * Get the incoming sample rate for this class - */ - unsigned int GetInputSamplerate(); - - /*!> - * Get the incoming channel names as string - */ - std::string GetInputChannelNames(); - - /*!> - * Get the inside addons used samplerate for this class - */ - unsigned int GetProcessSamplerate(); - - /*!> - * Get the outgoing channels amount for this class - */ - unsigned int GetOutputChannels(); - - /*!> - * Get the outgoing channel names - */ - std::string GetOutputChannelNames(); - - /*!> - * Get the used output samplerate for this class - */ - unsigned int GetOutputSamplerate(); - - /*!> - * Get the used output frames for this class - */ - unsigned int GetOutputFrames(); - - /*!> - * Get the amount of percent what the cpu need to process complete dsp stream - * @return The current cpu usage - */ - float GetCPUUsage(void) const; - - /*!> - * Get the channel layout which is passed out from it - * @return Channel information class - */ - CAEChannelInfo GetChannelLayout(); - - /*!> - * Get the currently used output data fromat - * @note Is normally float - */ - AEDataFormat GetDataFormat(); - - /*!> - * It returns the on input source detected stream type, not always the active one. - */ - AE_DSP_STREAMTYPE GetDetectedStreamType(); - - /*!> - * Get the currently on addons processed audio stream type which is set from KODI, - * it is user selectable or if auto mode is enabled it becomes detected upon the - * stream input source, eg. Movie, Music... - */ - AE_DSP_STREAMTYPE GetUsedStreamType(); - - /*!> - * Get the currently on addons processed audio base type which is detected from KODI. - * The base type is relevant to the type of input source, eg. Mono, Stereo, Dolby Digital... - */ - AE_DSP_BASETYPE GetUsedBaseType(); - - /*!> - * Used to check for active modes to given type on running stream id - * @param type The type to get, AE_DSP_MODE_TYPE_UNDEFINED to get from all types - * @return true if any of selected type is present - */ - bool HasActiveModes(AE_DSP_MODE_TYPE type); - - /*!> - * Used to get all active mode classes to given type on running stream id - * @param type The type to get, AE_DSP_MODE_TYPE_UNDEFINED to get from all types - * @retval modes The active modes classes in process chain list - */ - void GetActiveModes(AE_DSP_MODE_TYPE type, std::vector &modes); - - /*!> - * Used to get all available Master modes on current stream and base type. - * It is used to get informations about selectable modes and can be used as information - * for the gui to make the mode selection available. - * @param streamType the stream type to check about available master modes, e.g. AE_DSP_ASTREAM_MUSIC - * @retval modes Pointer to a buffer array where all available master mode written in - */ - void GetAvailableMasterModes(AE_DSP_STREAMTYPE streamType, std::vector &modes); - - /*!> - * Get the 32 bit individual identification code of the running master mode - * @return The identification code, or 0 if no master process is running - */ - int GetActiveMasterModeID(); - - /*!> - * Returns the information class from the currently used dsp addon - * @return pointer to the info class, or unitialized class if no master processing present - */ - CActiveAEDSPModePtr GetActiveMasterMode() const; - - /*!> - * Change master mode with the 32 bit individual identification code, the change - * is not directly performed in this function, is changed on next processing - * calls and must be observed that it becomes changed. - * @param streamType Stream type on the selection of the master mode - * @param iModeID The database identification code of the mode - * @param bSwitchStreamType force switching to given stream type - * @return True if the mode is allowed and can become changed - */ - bool SetMasterMode(AE_DSP_STREAMTYPE streamType, int iModeID, bool bSwitchStreamType = false); - - /*!> - * Read a description string from currently processed audio dsp master mode. - * It can be used to show additional stream information as string on the skin. - * The addon can have more stream information. - * @retval strInfo Pointer to a string where it is written in - * @return Returns false if no master processing is enabled - */ - bool GetMasterModeStreamInfoString(std::string &strInfo); - - /*!> - * Get all dsp addon relavant information to detect processing mode type and base values. - * @retval streamTypeUsed The current stream type processed by addon - * @retval baseType The current base type type processed by addon - * @retval iModeID The database identification code of the mode - * @return Returns false if no master processing is enabled - */ - bool GetMasterModeTypeInformation(AE_DSP_STREAMTYPE &streamTypeUsed, AE_DSP_BASETYPE &baseType, int &iModeID); - - /*!> - * Used check that asked addon with his mode id is used on given stream identifier - * @param category The type to get - * @param iAddonId The ID of the addon to get the menu entries for it - * @param iModeNumber From addon defined identifier of the mode - * @return true if in use - */ - bool IsMenuHookModeActive(AE_DSP_MENUHOOK_CAT category, int iAddonId, unsigned int iModeNumber); - - protected: - friend class CActiveAEBufferPoolResample; - - /*!> - * Master processing - * @param in the ActiveAE input samples - * @param out the processed ActiveAE output samples - * @return true if processing becomes performed correct - */ - bool Process(CSampleBuffer *in, CSampleBuffer *out); - - /*!> - * Returns the time in seconds that it will take - * for the next added packet to be heard from the speakers. - * @return seconds - */ - float GetDelay(); - //@} - private: - //@{ - /*! - * Helper functions - */ - void InitFFMpegDSPProcessor(); - bool CreateStreamProfile(); - void ResetStreamFunctionsSelection(); - AE_DSP_STREAMTYPE DetectStreamType(const CFileItem *item); - const char *GetStreamTypeName(AE_DSP_STREAMTYPE iStreamType); - void ClearArray(float **array, unsigned int samples); - bool MasterModeChange(int iModeID, AE_DSP_STREAMTYPE iStreamType = AE_DSP_ASTREAM_INVALID); - AE_DSP_BASETYPE GetBaseType(AE_DSP_STREAM_PROPERTIES *props); - bool RecheckProcessArray(unsigned int inputFrames); - bool ReallocProcessArray(unsigned int requestSize); - void CalculateCPUUsage(uint64_t iTime); - void SetFFMpegDSPProcessorArray(float *array_ffmpeg[2][AE_DSP_CH_MAX], float **array_in, float **array_out); - //@} - //@{ - /*! - * Data - */ - const AE_DSP_STREAM_ID m_streamId; /*!< stream id of this class, is a increase/decrease number of the amount of process streams */ - AE_DSP_STREAMTYPE m_streamTypeDetected; /*! The detected stream type of the stream from the source of it */ - AE_DSP_STREAMTYPE m_streamTypeUsed; /*!< The currently used stream type */ - bool m_forceInit; /*!< if set to true the process function perform a reinitialization of addons and data */ - AE_DSP_ADDONMAP m_usedMap; /*!< a map of all currently used audio dsp add-on's */ - AEAudioFormat m_inputFormat; /*!< the used input stream format */ - AEAudioFormat m_outputFormat; /*!< the from XBMX requested output format */ - unsigned int m_outputSamplerate; /*!< the currently active output samplerate can be become changed from addon resamplers */ - unsigned int m_outputFrames; /*!< the maximum present output frames */ - AEQuality m_streamQuality; /*!< from KODI requested stream quality, based also to addons */ - enum AEDataFormat m_dataFormat; /*!< The inside addon system used data format, currently fixed to float */ - AE_DSP_SETTINGS m_addonSettings; /*!< the current stream's settings passed to dsp add-ons */ - AE_DSP_STREAM_PROPERTIES m_addonStreamProperties; /*!< the current stream's properties (eg. stream type) passed to dsp add-ons */ - int m_NewMasterMode; /*!< if master mode is changed it set here and handled by process function */ - AE_DSP_STREAMTYPE m_NewStreamType; /*!< if stream type is changed it set here and handled by process function */ - enum AVMatrixEncoding m_ffMpegMatrixEncoding; - enum AVAudioServiceType m_ffMpegAudioServiceType; - int m_ffMpegProfile; - SwrContext *m_convertInput; - SwrContext *m_convertOutput; - - CCriticalSection m_critSection; - CCriticalSection m_restartSection; - - /*!> - * Selected dsp addon functions - */ - struct sDSPProcessHandle - { - void Clear() - { - iAddonModeNumber = -1; - iLastTime = 0; - } - unsigned int iAddonModeNumber; /*!< The identifier, send from addon during mode registration and can be used from addon to select mode from a function table */ - CActiveAEDSPModePtr pMode; /*!< Processing mode information data */ - AE_DSP_ADDON pAddon; /*!< Addon control class */ - ADDON_HANDLE_STRUCT handle; - uint64_t iLastTime; /*!< last processing time of the mode */ - }; - std::vector m_addons_InputProc; /*!< Input processing list, called to all enabled dsp addons with the basic unchanged input stream, is read only. */ - sDSPProcessHandle m_addon_InputResample; /*!< Input stream resampling over one on settings enabled input resample function only on one addon */ - std::vector m_addons_PreProc; /*!< Input stream preprocessing function calls set and aligned from dsp settings stored inside database */ - std::vector m_addons_MasterProc; /*!< The current from user selected master processing function on addon */ - int m_activeMode; /*!< the current used master mode, is a pointer to m_addons_MasterProc */ - int m_activeModeOutChannels; /*!< Amount of channels given from active master mode or -1 if unhandled */ - unsigned long m_activeModeOutChannelsPresent; /*! The exact present flags of output processing channels from active master mode */ - std::vector m_addons_PostProc; /*!< Output stream postprocessing function calls set and aligned from dsp settings stored inside database */ - sDSPProcessHandle m_addon_OutputResample; /*!< Output stream resampling over one on settings enabled output resample function only on one addon */ - std::map m_addon_Handles; /*!< Handle identifier for the called dsp functions */ - - /*!> - * Process arrays - */ - float *m_processArray[2][AE_DSP_CH_MAX]; - unsigned int m_processArraySize; - - /*!> - * CPU usage data - */ - uint64_t m_iLastProcessTime; - uint64_t m_iLastProcessUsage; - float m_fLastProcessUsage; - - /*!> - * Internal ffmpeg process data - */ - #define FFMPEG_PROC_ARRAY_IN 0 - #define FFMPEG_PROC_ARRAY_OUT 1 - IAEResample *m_resamplerDSPProcessor; /*!< ffmpeg resampler usage for down mix of input stream to required output channel alignment or internal processing*/ - float *m_ffMpegConvertArray[2][AE_DSP_CH_MAX]; /*!< the process array memory pointers for ffmpeg used for format convert. No own memory only addresses taken from m_processArray in correct ffmpeg channel alignment */ - float *m_ffMpegProcessArray[2][AE_DSP_CH_MAX]; /*!< the process array memory pointers for ffmpeg. No own memory only addresses taken from m_processArray in correct ffmpeg channel alignment */ - - /*!> - * Index pointers for interleaved audio streams to detect correct channel alignment - */ - int m_idx_in[AE_CH_MAX]; - uint64_t m_channelLayoutIn; - int m_idx_out[AE_CH_MAX]; - uint64_t m_channelLayoutOut; - //@} - }; - //@} -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -102,12 +102,12 @@ { Reset(); - bool ac3 = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_AC3PASSTHROUGH); + bool ac3 = CSettings::Get().GetBool("audiooutput.ac3passthrough"); AVCodec *codec = NULL; #if 0 /* the DCA encoder is currently useless for transcode, it creates a 196 kHz DTS-HD like mongrel which is useless for SPDIF */ - bool dts = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DTSPASSTHROUGH); + bool dts = CSettings::Get().GetBool("audiooutput.dtspassthrough"); if (dts && (!ac3 || g_advancedSettings.m_audioTranscodeTo.Equals("dts"))) { m_CodecName = "DTS"; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,6 @@ #include "ActiveAEBuffer.h" #include "cores/AudioEngine/AEFactory.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.h" #include "cores/AudioEngine/Engines/ActiveAE/ActiveAE.h" #include "cores/AudioEngine/Utils/AEUtil.h" #include "cores/AudioEngine/AEResampleFactory.h" @@ -148,102 +147,33 @@ m_drain = false; m_empty = true; m_procSample = NULL; - m_dspSample = NULL; - m_dspBuffer = NULL; m_resampleRatio = 1.0; m_resampleQuality = quality; + m_changeResampler = false; m_forceResampler = false; m_stereoUpmix = false; m_normalize = true; - m_useResampler = false; - m_useDSP = false; - m_bypassDSP = false; - m_changeResampler = false; - m_changeDSP = false; } CActiveAEBufferPoolResample::~CActiveAEBufferPoolResample() { delete m_resampler; - if (m_useDSP) - CActiveAEDSP::GetInstance().DestroyDSPs(m_streamId); - if (m_dspBuffer) - delete m_dspBuffer; } -void CActiveAEBufferPoolResample::SetExtraData(int profile, enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type) -{ - m_Profile = profile; - m_MatrixEncoding = matrix_encoding; - m_AudioServiceType = audio_service_type; - - if (m_useDSP) - ChangeAudioDSP(); -} - -bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap, bool upmix, bool normalize, bool useDSP) +bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap, bool upmix, bool normalize) { CActiveAEBufferPool::Create(totaltime); m_remap = remap; m_stereoUpmix = upmix; - m_useResampler = m_changeResampler; /* if m_changeResampler is true on Create, system require the usage of resampler */ - - /* - * On first used resample class, DSP signal processing becomes performed. - * For the signal processing the input data for CActiveAEResample must be - * modified to have a full supported audio stream with all available - * channels, for this reason also some in resample used functions must be - * disabled. - * - * The reason to perform this before CActiveAEResample is to have a unmodified - * stream with the basic data to have best quality like for surround upmix. - * - * The value m_streamId and address pointer m_processor are passed a pointers - * to CActiveAEDSP::GetInstance().CreateDSPs and set from it. - */ - if ((useDSP || m_changeDSP) && !m_bypassDSP) - { - m_dspFormat = m_inputFormat; - m_useDSP = CActiveAEDSP::GetInstance().CreateDSPs(m_streamId, m_processor, m_dspFormat, m_format, upmix, m_resampleQuality, m_MatrixEncoding, m_AudioServiceType, m_Profile); - if (m_useDSP) - { - - m_inputFormat.m_channelLayout = m_processor->GetChannelLayout(); /* Overide input format with DSP's supported format */ - m_inputFormat.m_sampleRate = m_processor->GetOutputSamplerate(); /* Overide input format with DSP's generated samplerate */ - m_inputFormat.m_dataFormat = m_processor->GetDataFormat(); /* Overide input format with DSP's processed data format, normally it is float */ - m_inputFormat.m_frames = m_processor->GetOutputFrames(); - m_forceResampler = true; /* Force load of ffmpeg resampler, required to detect exact input and output channel alignment pointers */ - if (m_processor->GetChannelLayout().Count() > 2) /* Disable upmix for CActiveAEResample if DSP layout > 2.0, becomes perfomed by DSP */ - upmix = false; - - m_dspBuffer = new CActiveAEBufferPool(m_inputFormat); /* Get dsp processing buffer class, based on dsp output format */ - m_dspBuffer->Create(totaltime); - } - } - m_changeDSP = false; - m_normalize = true; if ((m_format.m_channelLayout.Count() < m_inputFormat.m_channelLayout.Count() && !normalize)) m_normalize = false; - /* - * Compare the input format with output, if there is one different format, perform the - * kodi based resample processing. - * - * The input format can be become modified if addon dsp processing is enabled. For this - * reason somethings are no more required for it. As example, if resampling is performed - * by the addons it is no more required here, also the channel layout can be modified - * from addons. The output data format from dsp is always float and if something other - * is required here, the CActiveAEResample must change it. - */ if (m_inputFormat.m_channelLayout != m_format.m_channelLayout || m_inputFormat.m_sampleRate != m_format.m_sampleRate || m_inputFormat.m_dataFormat != m_format.m_dataFormat || m_forceResampler) - m_useResampler = true; - - if (m_useResampler || m_changeResampler) { m_resampler = CAEResampleFactory::Create(); m_resampler->Init(CAEUtil::GetAVChannelLayout(m_format.m_channelLayout), @@ -272,15 +202,7 @@ void CActiveAEBufferPoolResample::ChangeResampler() { - if (m_resampler) - { - delete m_resampler; - m_resampler = NULL; - } - - bool upmix = m_stereoUpmix; - if (m_useDSP && m_processor && m_processor->GetChannelLayout().Count() > 2) - upmix = false; + delete m_resampler; m_resampler = CAEResampleFactory::Create(); m_resampler->Init(CAEUtil::GetAVChannelLayout(m_format.m_channelLayout), @@ -295,7 +217,7 @@ CAEUtil::GetAVSampleFormat(m_inputFormat.m_dataFormat), CAEUtil::DataFormatToUsedBits(m_inputFormat.m_dataFormat), CAEUtil::DataFormatToDitherBits(m_inputFormat.m_dataFormat), - upmix, + m_stereoUpmix, m_normalize, m_remap ? &m_format.m_channelLayout : NULL, m_resampleQuality, @@ -304,56 +226,6 @@ m_changeResampler = false; } -void CActiveAEBufferPoolResample::ChangeAudioDSP() -{ - /* if dsp was enabled before reset input format, also used for failed dsp creation */ - bool wasActive = false; - if (m_useDSP && m_processor != NULL) - { - m_inputFormat = m_processor->GetInputFormat(); - wasActive = true; - } - - m_useDSP = CActiveAEDSP::GetInstance().CreateDSPs(m_streamId, m_processor, m_dspFormat, m_format, m_stereoUpmix, m_resampleQuality, m_MatrixEncoding, m_AudioServiceType, m_Profile, wasActive); - if (m_useDSP) - { - m_inputFormat.m_channelLayout = m_processor->GetChannelLayout(); /* Overide input format with DSP's supported format */ - m_inputFormat.m_sampleRate = m_processor->GetOutputSamplerate(); /* Overide input format with DSP's generated samplerate */ - m_inputFormat.m_dataFormat = m_processor->GetDataFormat(); /* Overide input format with DSP's processed data format, normally it is float */ - m_inputFormat.m_frames = m_processor->GetOutputFrames(); - m_changeResampler = true; /* Force load of ffmpeg resampler, required to detect exact input and output channel alignment pointers */ - } - else if (wasActive) - { - /* - * Check now after the dsp processing becomes disabled, that the resampler is still - * required, if not unload it also. - */ - if (m_inputFormat.m_channelLayout == m_format.m_channelLayout && - m_inputFormat.m_sampleRate == m_format.m_sampleRate && - m_inputFormat.m_dataFormat == m_format.m_dataFormat && - !m_useResampler) - { - delete m_resampler; - m_resampler = NULL; - delete m_dspBuffer; - m_dspBuffer = NULL; - m_changeResampler = false; - } - else - m_changeResampler = true; - - m_useDSP = false; - CActiveAEDSP::GetInstance().DestroyDSPs(m_streamId); - } - else - { - m_useDSP = false; - } - - m_changeDSP = false; -} - bool CActiveAEBufferPoolResample::ResampleBuffers(int64_t timestamp) { bool busy = false; @@ -361,12 +233,9 @@ if (!m_resampler) { - if (m_changeDSP || m_changeResampler) + if (m_changeResampler) { - if (m_changeDSP) - ChangeAudioDSP(); - if (m_changeResampler) - ChangeResampler(); + ChangeResampler(); return true; } while(!m_inputSamples.empty()) @@ -397,14 +266,14 @@ bool hasInput = !m_inputSamples.empty(); - if (hasInput || skipInput || m_drain || m_changeResampler || m_changeDSP) + if (hasInput || skipInput || m_drain || m_changeResampler) { if (!m_procSample) { m_procSample = GetFreeBuffer(); } - if (hasInput && !skipInput && !m_changeResampler && !m_changeDSP) + if (hasInput && !skipInput && !m_changeResampler) { in = m_inputSamples.front(); m_inputSamples.pop_front(); @@ -412,28 +281,6 @@ else in = NULL; - /* - * DSP need always a available input packet! To pass it step by step - * over all enabled addons and processing segments. - */ - if (m_useDSP && in) - { - if (!m_dspSample) - m_dspSample = m_dspBuffer->GetFreeBuffer(); - - if (m_dspSample && m_processor->Process(in, m_dspSample)) - { - in->Return(); - in = m_dspSample; - m_dspSample = NULL; - } - else - { - in->Return(); - in = NULL; - } - } - int start = m_procSample->pkt->nb_samples * m_procSample->pkt->bytes_per_sample * m_procSample->pkt->config.channels / @@ -483,7 +330,7 @@ m_procSample->pkt_start_offset = m_procSample->pkt->nb_samples; m_procSample->timestamp = m_lastSamplePts - bufferedSamples/m_format.m_sampleRate*1000; - if ((m_drain || m_changeResampler || m_changeDSP) && m_empty) + if ((m_drain || m_changeResampler) && m_empty) { if (m_fillPackets && m_procSample->pkt->nb_samples != 0) { @@ -508,8 +355,6 @@ m_outputSamples.push_back(m_procSample); m_procSample = NULL; - if (m_changeDSP) - ChangeAudioDSP(); if (m_changeResampler) ChangeResampler(); } @@ -534,8 +379,6 @@ if (m_procSample) delay += m_procSample->pkt->nb_samples / m_procSample->pkt->config.sample_rate; - if (m_dspSample) - delay += m_dspSample->pkt->nb_samples / m_dspSample->pkt->config.sample_rate; for(itBuf=m_inputSamples.begin(); itBuf!=m_inputSamples.end(); ++itBuf) { @@ -553,11 +396,6 @@ delay += (float)samples / m_format.m_sampleRate; } - if (m_useDSP) - { - delay += m_processor->GetDelay(); - } - return delay; } @@ -568,11 +406,6 @@ m_procSample->Return(); m_procSample = NULL; } - if (m_dspSample) - { - m_dspSample->Return(); - m_dspSample = NULL; - } while (!m_inputSamples.empty()) { m_inputSamples.front()->Return(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,6 @@ #include "cores/AudioEngine/Utils/AEAudioFormat.h" #include "cores/AudioEngine/Interfaces/AE.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" #include extern "C" { @@ -96,42 +95,28 @@ public: CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat, AEQuality quality); virtual ~CActiveAEBufferPoolResample(); - virtual bool Create(unsigned int totaltime, bool remap, bool upmix, bool normalize = true, bool useDSP = false); - void SetExtraData(int profile, enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type); + virtual bool Create(unsigned int totaltime, bool remap, bool upmix, bool normalize = true); void ChangeResampler(); - void ChangeAudioDSP(); bool ResampleBuffers(int64_t timestamp = 0); float GetDelay(); void Flush(); AEAudioFormat m_inputFormat; - AEAudioFormat m_dspFormat; std::deque m_inputSamples; std::deque m_outputSamples; CSampleBuffer *m_procSample; IAEResample *m_resampler; - CSampleBuffer *m_dspSample; - CActiveAEBufferPool *m_dspBuffer; - CActiveAEDSPProcessPtr m_processor; uint8_t *m_planes[16]; bool m_fillPackets; bool m_drain; bool m_empty; - bool m_useResampler; - bool m_useDSP; - bool m_bypassDSP; bool m_changeResampler; bool m_forceResampler; - bool m_changeDSP; double m_resampleRatio; AEQuality m_resampleQuality; bool m_stereoUpmix; bool m_normalize; bool m_remap; int64_t m_lastSamplePts; - unsigned int m_streamId; - enum AVMatrixEncoding m_MatrixEncoding; - enum AVAudioServiceType m_AudioServiceType; - int m_Profile; }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,8 +23,6 @@ using namespace ActiveAE; #include "ActiveAESound.h" #include "ActiveAEStream.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.h" #include "cores/AudioEngine/Utils/AEUtil.h" #include "cores/AudioEngine/AEResampleFactory.h" #include "cores/AudioEngine/Encoders/AEEncoderFFmpeg.h" @@ -44,7 +42,6 @@ m_sinkSampleRate = sampleRate; m_bufferedSamples = 0; m_suspended = false; - m_hasDSP = false; m_playingPTS = 0; m_clockId = 0; } @@ -157,30 +154,6 @@ return m_suspended; } -void CEngineStats::SetDSP(bool state) -{ - CSingleLock lock(m_lock); - m_hasDSP = state; -} - -void CEngineStats::SetCurrentSinkFormat(AEAudioFormat SinkFormat) -{ - CSingleLock lock(m_lock); - m_sinkFormat = SinkFormat; -} - -bool CEngineStats::HasDSP() -{ - CSingleLock lock(m_lock); - return m_hasDSP; -} - -AEAudioFormat CEngineStats::GetCurrentSinkFormat() -{ - CSingleLock lock(m_lock); - return m_sinkFormat; -} - CActiveAE::CActiveAE() : CThread("ActiveAE"), m_controlPort("OutputControlPort", &m_inMsgEvent, &m_outMsgEvent), @@ -202,7 +175,6 @@ m_audioCallback = NULL; m_vizInitialized = false; m_sinkHasVolume = false; - m_aeGUISoundForce = false; m_stats.Reset(44100); } @@ -550,13 +522,6 @@ par->stream->m_resampleBuffers->m_resampleRatio = par->parameter.double_par; } return; - case CActiveAEControlProtocol::STREAMFFMPEGINFO: - MsgStreamFFmpegInfo *info; - info = (MsgStreamFFmpegInfo*)msg->data; - info->stream->m_profile = info->profile; - info->stream->m_matrixEncoding = info->matrix_encoding; - info->stream->m_audioServiceType = info->audio_service_type; - return; case CActiveAEControlProtocol::STREAMFADE: MsgStreamFade *fade; fade = (MsgStreamFade*)msg->data; @@ -581,15 +546,11 @@ case CActiveAEDataProtocol::PLAYSOUND: CActiveAESound *sound; sound = *(CActiveAESound**)msg->data; + if (m_settings.guisoundmode == AE_SOUND_OFF || + (m_settings.guisoundmode == AE_SOUND_IDLE && !m_streams.empty())) + return; if (sound) { - m_aeGUISoundForce = m_settings.dspaddonsenabled && sound->GetChannel() != AE_CH_NULL; - - if ((m_settings.guisoundmode == AE_SOUND_OFF || - (m_settings.guisoundmode == AE_SOUND_IDLE && !m_streams.empty())) && - !m_aeGUISoundForce) - return; - SoundState st = {sound, 0}; m_sounds_playing.push_back(st); m_extTimeout = 0; @@ -1149,12 +1110,9 @@ } m_internalFormat = outputFormat; - bool isRaw; std::list::iterator it; for(it=m_streams.begin(); it!=m_streams.end(); ++it) { - isRaw = AE_IS_RAW((*it)->m_format.m_dataFormat); - if (!(*it)->m_inputBuffers) { // align input buffers with period of sink or encoder @@ -1175,16 +1133,9 @@ } if (!(*it)->m_resampleBuffers) { - bool useDSP = !isRaw ? m_settings.dspaddonsenabled : false; - (*it)->m_resampleBuffers = new CActiveAEBufferPoolResample((*it)->m_inputBuffers->m_format, outputFormat, m_settings.resampleQuality); (*it)->m_resampleBuffers->m_forceResampler = (*it)->m_forceResampler; - (*it)->m_resampleBuffers->m_bypassDSP = (*it)->m_bypassDSP; - if (useDSP && !(*it)->m_resampleBuffers->m_bypassDSP) - (*it)->m_resampleBuffers->SetExtraData((*it)->m_profile, (*it)->m_matrixEncoding, (*it)->m_audioServiceType); - (*it)->m_resampleBuffers->Create(MAX_CACHE_LEVEL*1000, false, m_settings.stereoupmix, m_settings.normalizelevels, useDSP); - - m_stats.SetDSP(useDSP); + (*it)->m_resampleBuffers->Create(MAX_CACHE_LEVEL*1000, false, m_settings.stereoupmix, m_settings.normalizelevels); } if (m_mode == MODE_TRANSCODE || m_streams.size() > 1) (*it)->m_resampleBuffers->m_fillPackets = true; @@ -1244,8 +1195,7 @@ if (!CompareFormat(oldInternalFormat, m_internalFormat)) { if (m_settings.guisoundmode == AE_SOUND_ALWAYS || - (m_settings.guisoundmode == AE_SOUND_IDLE && m_streams.empty()) || - m_aeGUISoundForce) + (m_settings.guisoundmode == AE_SOUND_IDLE && m_streams.empty())) { std::vector::iterator it; for (it = m_sounds.begin(); it != m_sounds.end(); ++it) @@ -1302,11 +1252,6 @@ if (streamMsg->options & AESTREAM_FORCE_RESAMPLE) stream->m_forceResampler = true; - if(streamMsg->options & AESTREAM_BYPASS_ADSP) - { - stream->m_bypassDSP = true; - } - m_streams.push_back(stream); return stream; @@ -1415,8 +1360,6 @@ { if (it->sound == sound) { - if (sound->GetChannel() != AE_CH_NULL) - m_aeGUISoundForce = false; m_sounds_playing.erase(it); return; } @@ -1450,27 +1393,13 @@ !m_settings.normalizelevels) normalize = false; - /* Disable upmix if DSP layout > 2.0, becomes perfomed by DSP */ - bool ignoreUpmix = false; - if (m_settings.dspaddonsenabled && (*it)->m_resampleBuffers->m_useDSP && (*it)->m_resampleBuffers->m_processor->GetChannelLayout().Count() > 2) - ignoreUpmix = true; - - if ((*it)->m_resampleBuffers->m_useResampler && + if ((*it)->m_resampleBuffers && (*it)->m_resampleBuffers->m_resampler && (((*it)->m_resampleBuffers->m_resampleQuality != m_settings.resampleQuality) || - (((*it)->m_resampleBuffers->m_stereoUpmix != m_settings.stereoupmix) && !ignoreUpmix) || + (((*it)->m_resampleBuffers->m_stereoUpmix != m_settings.stereoupmix)) || ((*it)->m_resampleBuffers->m_normalize != normalize))) { (*it)->m_resampleBuffers->m_changeResampler = true; } - if ((*it)->m_resampleBuffers->m_useDSP != m_settings.dspaddonsenabled || - ((*it)->m_resampleBuffers->m_useDSP && - (((*it)->m_resampleBuffers->m_resampleQuality != m_settings.resampleQuality) || - ((*it)->m_resampleBuffers->m_stereoUpmix != m_settings.stereoupmix)))) - { - (*it)->m_resampleBuffers->m_changeDSP = true; - } - - (*it)->m_resampleBuffers->m_useDSP = m_settings.dspaddonsenabled; (*it)->m_resampleBuffers->m_resampleQuality = m_settings.resampleQuality; (*it)->m_resampleBuffers->m_stereoUpmix = m_settings.stereoupmix; (*it)->m_resampleBuffers->m_normalize = normalize; @@ -1518,34 +1447,30 @@ // consider user channel layout for those cases // 1. input stream is multichannel // 2. stereo upmix is selected - // 3. audio dsp is used - // 4. fixed mode + // 3. fixed mode if ((format.m_channelLayout.Count() > 2) || settings.stereoupmix || - settings.dspaddonsenabled || (settings.config == AE_CONFIG_FIXED)) { - AEStdChLayout stdChannelLayout; + CAEChannelInfo stdLayout; switch (settings.channels) { default: - case 0: stdChannelLayout = AE_CH_LAYOUT_2_0; break; - case 1: stdChannelLayout = AE_CH_LAYOUT_2_0; break; - case 2: stdChannelLayout = AE_CH_LAYOUT_2_1; break; - case 3: stdChannelLayout = AE_CH_LAYOUT_3_0; break; - case 4: stdChannelLayout = AE_CH_LAYOUT_3_1; break; - case 5: stdChannelLayout = AE_CH_LAYOUT_4_0; break; - case 6: stdChannelLayout = AE_CH_LAYOUT_4_1; break; - case 7: stdChannelLayout = AE_CH_LAYOUT_5_0; break; - case 8: stdChannelLayout = AE_CH_LAYOUT_5_1; break; - case 9: stdChannelLayout = AE_CH_LAYOUT_7_0; break; - case 10: stdChannelLayout = AE_CH_LAYOUT_7_1; break; + case 0: stdLayout = AE_CH_LAYOUT_2_0; break; + case 1: stdLayout = AE_CH_LAYOUT_2_0; break; + case 2: stdLayout = AE_CH_LAYOUT_2_1; break; + case 3: stdLayout = AE_CH_LAYOUT_3_0; break; + case 4: stdLayout = AE_CH_LAYOUT_3_1; break; + case 5: stdLayout = AE_CH_LAYOUT_4_0; break; + case 6: stdLayout = AE_CH_LAYOUT_4_1; break; + case 7: stdLayout = AE_CH_LAYOUT_5_0; break; + case 8: stdLayout = AE_CH_LAYOUT_5_1; break; + case 9: stdLayout = AE_CH_LAYOUT_7_0; break; + case 10: stdLayout = AE_CH_LAYOUT_7_1; break; } - CAEChannelInfo stdLayout(stdChannelLayout); - - if (m_settings.config == AE_CONFIG_FIXED || settings.dspaddonsenabled || (settings.stereoupmix && format.m_channelLayout.Count() <= 2)) - format.m_channelLayout = CActiveAEDSP::GetInstance().GetInternalChannelLayout(stdChannelLayout); + if (m_settings.config == AE_CONFIG_FIXED || (settings.stereoupmix && format.m_channelLayout.Count() <= 2)) + format.m_channelLayout = stdLayout; else if (m_extKeepConfig && (settings.config == AE_CONFIG_AUTO) && (oldMode != MODE_RAW)) format.m_channelLayout = m_internalFormat.m_channelLayout; else @@ -1656,7 +1581,6 @@ m_sinkHasVolume = data->hasVolume; m_stats.SetSinkCacheTotal(data->cacheTotal); m_stats.SetSinkLatency(data->latency); - m_stats.SetCurrentSinkFormat(m_sinkFormat); } reply->Release(); } @@ -1665,9 +1589,6 @@ CLog::Log(LOGERROR, "ActiveAE::%s - failed to init", __FUNCTION__); m_stats.SetSinkCacheTotal(0); m_stats.SetSinkLatency(0); - AEAudioFormat invalidFormat; - invalidFormat.m_dataFormat = AE_FMT_INVALID; - m_stats.SetCurrentSinkFormat(invalidFormat); m_extError = true; return false; } @@ -2028,7 +1949,7 @@ { // copy the samples into the viz input buffer CSampleBuffer *viz = m_vizBuffersInput->GetFreeBuffer(); - int samples = out->pkt->nb_samples; + int samples = std::min(512, out->pkt->nb_samples); int bytes = samples * out->pkt->config.channels / out->pkt->planes * out->pkt->bytes_per_sample; for(int i= 0; i < out->pkt->planes; i++) { @@ -2051,7 +1972,8 @@ break; else { - int samples = buf->pkt->nb_samples; + int samples; + samples = std::min(512, buf->pkt->nb_samples); m_audioCallback->OnAudioData((float*)(buf->pkt->data[0]), samples); buf->Return(); m_vizBuffers->m_outputSamples.pop_front(); @@ -2224,30 +2146,28 @@ void CActiveAE::LoadSettings() { - m_settings.device = CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE); - m_settings.passthoughdevice = CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE); - - m_settings.config = CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CONFIG); - m_settings.channels = (m_sink.GetDeviceType(m_settings.device) == AE_DEVTYPE_IEC958) ? AE_CH_LAYOUT_2_0 : CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CHANNELS); - m_settings.samplerate = CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_SAMPLERATE); - - m_settings.dspaddonsenabled = IsSettingVisible(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED) ? CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED) : false; + m_settings.device = CSettings::Get().GetString("audiooutput.audiodevice"); + m_settings.passthoughdevice = CSettings::Get().GetString("audiooutput.passthroughdevice"); - m_settings.stereoupmix = IsSettingVisible(CSettings::SETTING_AUDIOOUTPUT_STEREOUPMIX) ? CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_STEREOUPMIX) : false; - m_settings.normalizelevels = !CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_MAINTAINORIGINALVOLUME); - m_settings.guisoundmode = CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_GUISOUNDMODE); + m_settings.config = CSettings::Get().GetInt("audiooutput.config"); + m_settings.channels = (m_sink.GetDeviceType(m_settings.device) == AE_DEVTYPE_IEC958) ? AE_CH_LAYOUT_2_0 : CSettings::Get().GetInt("audiooutput.channels"); + m_settings.samplerate = CSettings::Get().GetInt("audiooutput.samplerate"); + + m_settings.stereoupmix = IsSettingVisible("audiooutput.stereoupmix") ? CSettings::Get().GetBool("audiooutput.stereoupmix") : false; + m_settings.normalizelevels = !CSettings::Get().GetBool("audiooutput.maintainoriginalvolume"); + m_settings.guisoundmode = CSettings::Get().GetInt("audiooutput.guisoundmode"); - m_settings.passthrough = m_settings.config == AE_CONFIG_FIXED ? false : CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH); + m_settings.passthrough = m_settings.config == AE_CONFIG_FIXED ? false : CSettings::Get().GetBool("audiooutput.passthrough"); if (!m_sink.HasPassthroughDevice()) m_settings.passthrough = false; - m_settings.ac3passthrough = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_AC3PASSTHROUGH); - m_settings.ac3transcode = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_AC3TRANSCODE); - m_settings.eac3passthrough = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_EAC3PASSTHROUGH); - m_settings.truehdpassthrough = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_TRUEHDPASSTHROUGH); - m_settings.dtspassthrough = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DTSPASSTHROUGH); - m_settings.dtshdpassthrough = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DTSHDPASSTHROUGH); + m_settings.ac3passthrough = CSettings::Get().GetBool("audiooutput.ac3passthrough"); + m_settings.ac3transcode = CSettings::Get().GetBool("audiooutput.ac3transcode"); + m_settings.eac3passthrough = CSettings::Get().GetBool("audiooutput.eac3passthrough"); + m_settings.truehdpassthrough = CSettings::Get().GetBool("audiooutput.truehdpassthrough"); + m_settings.dtspassthrough = CSettings::Get().GetBool("audiooutput.dtspassthrough"); + m_settings.dtshdpassthrough = CSettings::Get().GetBool("audiooutput.dtshdpassthrough"); - m_settings.resampleQuality = static_cast(CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_PROCESSQUALITY)); + m_settings.resampleQuality = static_cast(CSettings::Get().GetInt("audiooutput.processquality")); } bool CActiveAE::Initialize() @@ -2256,7 +2176,7 @@ Message *reply; if (m_controlPort.SendOutMessageSync(CActiveAEControlProtocol::INIT, &reply, - 60000)) + 10000)) { bool success = reply->signal == CActiveAEControlProtocol::ACC; reply->Release(); @@ -2295,23 +2215,23 @@ void CActiveAE::OnSettingsChange(const std::string& setting) { - if (setting == CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE || - setting == CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE || - setting == CSettings::SETTING_AUDIOOUTPUT_CONFIG || - setting == CSettings::SETTING_AUDIOOUTPUT_AC3PASSTHROUGH || - setting == CSettings::SETTING_AUDIOOUTPUT_AC3TRANSCODE || - setting == CSettings::SETTING_AUDIOOUTPUT_EAC3PASSTHROUGH || - setting == CSettings::SETTING_AUDIOOUTPUT_DTSPASSTHROUGH || - setting == CSettings::SETTING_AUDIOOUTPUT_TRUEHDPASSTHROUGH || - setting == CSettings::SETTING_AUDIOOUTPUT_DTSHDPASSTHROUGH || - setting == CSettings::SETTING_AUDIOOUTPUT_CHANNELS || - setting == CSettings::SETTING_AUDIOOUTPUT_STEREOUPMIX || - setting == CSettings::SETTING_AUDIOOUTPUT_STREAMSILENCE || - setting == CSettings::SETTING_AUDIOOUTPUT_PROCESSQUALITY || - setting == CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH || - setting == CSettings::SETTING_AUDIOOUTPUT_SAMPLERATE || - setting == CSettings::SETTING_AUDIOOUTPUT_MAINTAINORIGINALVOLUME || - setting == CSettings::SETTING_AUDIOOUTPUT_GUISOUNDMODE) + if (setting == "audiooutput.passthroughdevice" || + setting == "audiooutput.audiodevice" || + setting == "audiooutput.config" || + setting == "audiooutput.ac3passthrough" || + setting == "audiooutput.ac3transcode" || + setting == "audiooutput.eac3passthrough" || + setting == "audiooutput.dtspassthrough" || + setting == "audiooutput.truehdpassthrough" || + setting == "audiooutput.dtshdpassthrough" || + setting == "audiooutput.channels" || + setting == "audiooutput.stereoupmix" || + setting == "audiooutput.streamsilence" || + setting == "audiooutput.processquality" || + setting == "audiooutput.passthrough" || + setting == "audiooutput.samplerate" || + setting == "audiooutput.maintainoriginalvolume" || + setting == "audiooutput.guisoundmode") { m_controlPort.SendOutMessage(CActiveAEControlProtocol::RECONFIGURE); } @@ -2319,7 +2239,7 @@ bool CActiveAE::SupportsRaw(AEDataFormat format, int samplerate) { - if (!m_sink.SupportsFormat(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE), format, samplerate)) + if (!m_sink.SupportsFormat(CSettings::Get().GetString("audiooutput.passthroughdevice"), format, samplerate)) return false; return true; @@ -2332,18 +2252,18 @@ bool CActiveAE::HasStereoAudioChannelCount() { - std::string device = CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE); - int numChannels = (m_sink.GetDeviceType(device) == AE_DEVTYPE_IEC958) ? AE_CH_LAYOUT_2_0 : CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CHANNELS); - bool passthrough = CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CONFIG) == AE_CONFIG_FIXED ? false : CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH); + std::string device = CSettings::Get().GetString("audiooutput.audiodevice"); + int numChannels = (m_sink.GetDeviceType(device) == AE_DEVTYPE_IEC958) ? AE_CH_LAYOUT_2_0 : CSettings::Get().GetInt("audiooutput.channels"); + bool passthrough = CSettings::Get().GetInt("audiooutput.config") == AE_CONFIG_FIXED ? false : CSettings::Get().GetBool("audiooutput.passthrough"); return numChannels == AE_CH_LAYOUT_2_0 && ! (passthrough && - CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_AC3PASSTHROUGH) && - CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_AC3TRANSCODE)); + CSettings::Get().GetBool("audiooutput.ac3passthrough") && + CSettings::Get().GetBool("audiooutput.ac3transcode")); } bool CActiveAE::HasHDAudioChannelCount() { - std::string device = CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE); - int numChannels = (m_sink.GetDeviceType(device) == AE_DEVTYPE_IEC958) ? AE_CH_LAYOUT_2_0 : CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CHANNELS); + std::string device = CSettings::Get().GetString("audiooutput.audiodevice"); + int numChannels = (m_sink.GetDeviceType(device) == AE_DEVTYPE_IEC958) ? AE_CH_LAYOUT_2_0 : CSettings::Get().GetInt("audiooutput.channels"); return numChannels > AE_CH_LAYOUT_5_1; } @@ -2361,72 +2281,53 @@ bool CActiveAE::IsSettingVisible(const std::string &settingId) { - if (settingId == CSettings::SETTING_AUDIOOUTPUT_SAMPLERATE) + if (settingId == "audiooutput.samplerate") { - if (m_sink.GetDeviceType(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE)) == AE_DEVTYPE_IEC958) + if (m_sink.GetDeviceType(CSettings::Get().GetString("audiooutput.audiodevice")) == AE_DEVTYPE_IEC958) return true; - if (CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CONFIG) == AE_CONFIG_FIXED) + if (CSettings::Get().GetInt("audiooutput.config") == AE_CONFIG_FIXED) return true; } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_CHANNELS) + else if (settingId == "audiooutput.channels") { - if (m_sink.GetDeviceType(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE)) != AE_DEVTYPE_IEC958) + if (m_sink.GetDeviceType(CSettings::Get().GetString("audiooutput.audiodevice")) != AE_DEVTYPE_IEC958) return true; } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH) + else if (settingId == "audiooutput.passthrough") { - if (m_sink.HasPassthroughDevice() && CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CONFIG) != AE_CONFIG_FIXED) + if (m_sink.HasPassthroughDevice() && CSettings::Get().GetInt("audiooutput.config") != AE_CONFIG_FIXED) return true; } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_TRUEHDPASSTHROUGH) + else if (settingId == "audiooutput.truehdpassthrough") { - if (m_sink.SupportsFormat(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE), AE_FMT_TRUEHD, 192000) && - CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CONFIG) != AE_CONFIG_FIXED) + if (m_sink.SupportsFormat(CSettings::Get().GetString("audiooutput.passthroughdevice"), AE_FMT_TRUEHD, 192000) && + CSettings::Get().GetInt("audiooutput.config") != AE_CONFIG_FIXED) return true; } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_DTSHDPASSTHROUGH) + else if (settingId == "audiooutput.dtshdpassthrough") { - if (m_sink.SupportsFormat(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE), AE_FMT_DTSHD, 192000) && - CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CONFIG) != AE_CONFIG_FIXED) + if (m_sink.SupportsFormat(CSettings::Get().GetString("audiooutput.passthroughdevice"), AE_FMT_DTSHD, 192000) && + CSettings::Get().GetInt("audiooutput.config") != AE_CONFIG_FIXED) return true; } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_EAC3PASSTHROUGH) + else if (settingId == "audiooutput.eac3passthrough") { - if (m_sink.SupportsFormat(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE), AE_FMT_EAC3, 192000) && - CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CONFIG) != AE_CONFIG_FIXED) + if (m_sink.SupportsFormat(CSettings::Get().GetString("audiooutput.passthroughdevice"), AE_FMT_EAC3, 192000) && + CSettings::Get().GetInt("audiooutput.config") != AE_CONFIG_FIXED) return true; } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_STEREOUPMIX) + else if (settingId == "audiooutput.stereoupmix") { if (m_sink.HasPassthroughDevice() || - CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CHANNELS) > AE_CH_LAYOUT_2_0) + CSettings::Get().GetInt("audiooutput.channels") > AE_CH_LAYOUT_2_0) return true; } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_AC3TRANSCODE) + else if (settingId == "audiooutput.ac3transcode") { if (m_sink.HasPassthroughDevice() && - CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_AC3PASSTHROUGH) && - CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CONFIG) != AE_CONFIG_FIXED && - (CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CHANNELS) <= AE_CH_LAYOUT_2_0 || m_sink.GetDeviceType(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE)) == AE_DEVTYPE_IEC958)) - return true; - } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED) - { - if (m_sink.GetDeviceType(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE)) != AE_DEVTYPE_IEC958) - { - return true; - } - } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_DSPSETTINGS) - { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED) && - m_sink.GetDeviceType(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE)) != AE_DEVTYPE_IEC958) - return true; - } - else if (settingId == CSettings::SETTING_AUDIOOUTPUT_DSPRESETDB) - { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED) && - m_sink.GetDeviceType(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE)) != AE_DEVTYPE_IEC958) + CSettings::Get().GetBool("audiooutput.ac3passthrough") && + CSettings::Get().GetInt("audiooutput.config") != AE_CONFIG_FIXED && + (CSettings::Get().GetInt("audiooutput.channels") <= AE_CH_LAYOUT_2_0 || m_sink.GetDeviceType(CSettings::Get().GetString("audiooutput.audiodevice")) == AE_DEVTYPE_IEC958)) return true; } return false; @@ -2510,16 +2411,6 @@ m_controlPort.SendOutMessage(CActiveAEControlProtocol::DEVICECHANGE); } -bool CActiveAE::HasDSP() -{ - return m_stats.HasDSP(); -}; - -AEAudioFormat CActiveAE::GetCurrentSinkFormat() -{ - return m_stats.GetCurrentSinkFormat(); -} - void CActiveAE::OnLostDevice() { Message *reply; @@ -2756,9 +2647,8 @@ */ void CActiveAE::ResampleSounds() { - if ((m_settings.guisoundmode == AE_SOUND_OFF || - (m_settings.guisoundmode == AE_SOUND_IDLE && !m_streams.empty())) && - !m_aeGUISoundForce) + if (m_settings.guisoundmode == AE_SOUND_OFF || + (m_settings.guisoundmode == AE_SOUND_IDLE && !m_streams.empty())) return; std::vector::iterator it; @@ -2794,21 +2684,6 @@ dst_config.bits_per_sample = CAEUtil::DataFormatToUsedBits(m_internalFormat.m_dataFormat); dst_config.dither_bits = CAEUtil::DataFormatToDitherBits(m_internalFormat.m_dataFormat); - AEChannel testChannel = sound->GetChannel(); - CAEChannelInfo outChannels; - if (sound->GetSound(true)->config.channels == 1 && testChannel != AE_CH_NULL) - { - for (unsigned int out=0; out < m_internalFormat.m_channelLayout.Count(); out++) - { - if (m_internalFormat.m_channelLayout[out] == AE_CH_FC && testChannel != AE_CH_FC) /// To become center clear on position test ?????? - outChannels += AE_CH_FL; - else if (m_internalFormat.m_channelLayout[out] == testChannel) - outChannels += AE_CH_FC; - else - outChannels += m_internalFormat.m_channelLayout[out]; - } - } - IAEResample *resampler = CAEResampleFactory::Create(AERESAMPLEFACTORY_QUICK_RESAMPLE); resampler->Init(dst_config.channel_layout, dst_config.channels, @@ -2824,7 +2699,7 @@ orig_config.dither_bits, false, true, - outChannels.Count() > 0 ? &outChannels : NULL, + NULL, m_settings.resampleQuality, false); @@ -2962,17 +2837,6 @@ &msg, sizeof(MsgStreamParameter)); } -void CActiveAE::SetStreamFFmpegInfo(CActiveAEStream *stream, int profile, enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type) -{ - MsgStreamFFmpegInfo msg; - msg.stream = stream; - msg.profile = profile; - msg.matrix_encoding = matrix_encoding; - msg.audio_service_type = audio_service_type; - - m_controlPort.SendOutMessage(CActiveAEControlProtocol::STREAMFFMPEGINFO, &msg, sizeof(MsgStreamFFmpegInfo)); -} - void CActiveAE::SetStreamFade(CActiveAEStream *stream, float from, float target, unsigned int millis) { MsgStreamFade msg; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h 2015-10-19 08:39:16.000000000 +0000 @@ -62,7 +62,6 @@ bool stereoupmix; bool normalizelevels; bool passthrough; - bool dspaddonsenabled; int config; int guisoundmode; unsigned int samplerate; @@ -89,7 +88,6 @@ STREAMAMP, STREAMRESAMPLERATIO, STREAMFADE, - STREAMFFMPEGINFO, STOPSOUND, GETSTATE, DISPLAYLOST, @@ -148,7 +146,6 @@ { float float_par; double double_par; - int int_par; } parameter; }; @@ -160,14 +157,6 @@ unsigned int millis; }; -struct MsgStreamFFmpegInfo -{ - CActiveAEStream *stream; - int profile; - enum AVMatrixEncoding matrix_encoding; - enum AVAudioServiceType audio_service_type; -}; - class CEngineStats { public: @@ -182,13 +171,9 @@ int64_t GetPlayingPTS(); int Discontinuity(bool reset = false); void SetSuspended(bool state); - void SetDSP(bool state); - void SetCurrentSinkFormat(AEAudioFormat SinkFormat); void SetSinkCacheTotal(float time) { m_sinkCacheTotal = time; } void SetSinkLatency(float time) { m_sinkLatency = time; } bool IsSuspended(); - bool HasDSP(); - AEAudioFormat GetCurrentSinkFormat(); CCriticalSection *GetLock() { return &m_lock; } protected: int64_t m_playingPTS; @@ -199,8 +184,6 @@ unsigned int m_sinkSampleRate; AEDelayStatus m_sinkDelay; bool m_suspended; - bool m_hasDSP; - AEAudioFormat m_sinkFormat; CCriticalSection m_lock; }; @@ -253,8 +236,6 @@ virtual bool IsSettingVisible(const std::string &settingId); virtual void KeepConfiguration(unsigned int millis); virtual void DeviceChange(); - virtual bool HasDSP(); - virtual AEAudioFormat GetCurrentSinkFormat(); virtual void RegisterAudioCallback(IAudioCallback* pCallback); virtual void UnregisterAudioCallback(); @@ -279,7 +260,6 @@ void SetStreamReplaygain(CActiveAEStream *stream, float rgain); void SetStreamVolume(CActiveAEStream *stream, float volume); void SetStreamResampleRatio(CActiveAEStream *stream, double ratio); - void SetStreamFFmpegInfo(CActiveAEStream *stream, int profile, enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type); void SetStreamFade(CActiveAEStream *stream, float from, float target, unsigned int millis); protected: @@ -380,6 +360,5 @@ // polled via the interface float m_aeVolume; bool m_aeMuted; - bool m_aeGUISoundForce; }; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResampleFFMPEG.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResampleFFMPEG.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResampleFFMPEG.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResampleFFMPEG.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,8 +19,6 @@ * */ -#include "cores/AudioEngine/Utils/AEChannelInfo.h" -#include "cores/AudioEngine/Utils/AEAudioFormat.h" #include "cores/AudioEngine/Interfaces/AE.h" #include "cores/AudioEngine/Interfaces/AEResample.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -922,7 +922,7 @@ if (m_extStreaming) m_extSilenceTimeout = XbmcThreads::EndTime::InfiniteValue; else if (m_extAppFocused) - m_extSilenceTimeout = CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_STREAMSILENCE) * 60000; + m_extSilenceTimeout = CSettings::Get().GetInt("audiooutput.streamsilence") * 60000; else m_extSilenceTimeout = 0; m_extSilenceTimer.Set(m_extSilenceTimeout); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -38,8 +38,7 @@ CActiveAESound::CActiveAESound(const std::string &filename) : IAESound (filename), m_filename (filename), - m_volume (1.0f ), - m_channel (AE_CH_NULL) + m_volume (1.0f ) { m_orig_sound = NULL; m_dst_sound = NULL; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.h 2015-10-19 08:39:16.000000000 +0000 @@ -37,8 +37,6 @@ virtual void Stop(); virtual bool IsPlaying(); - virtual void SetChannel(AEChannel channel) { m_channel = channel; } - virtual AEChannel GetChannel() { return m_channel; } virtual void SetVolume(float volume) { m_volume = std::max(0.0f, std::min(1.0f, volume)); } virtual float GetVolume() { return m_volume; } @@ -64,7 +62,6 @@ bool m_isSeekPossible; int m_fileSize; float m_volume; - AEChannel m_channel; CSoundPacket *m_orig_sound; CSoundPacket *m_dst_sound; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -53,7 +53,6 @@ m_streamFreeBuffers = 0; m_streamIsBuffering = false; m_streamIsFlushed = false; - m_bypassDSP = false; m_streamSlave = NULL; m_leftoverBuffer = new uint8_t[m_format.m_frameSize]; m_leftoverBytes = 0; @@ -61,9 +60,6 @@ m_remapper = NULL; m_remapBuffer = NULL; m_streamResampleRatio = 1.0; - m_profile = 0; - m_matrixEncoding = AV_MATRIX_ENCODING_NONE; - m_audioServiceType = AV_AUDIO_SERVICE_TYPE_MAIN; } CActiveAEStream::~CActiveAEStream() @@ -448,11 +444,6 @@ return true; } -void CActiveAEStream::SetFFmpegInfo(int profile, enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type) -{ - AE.SetStreamFFmpegInfo(this, profile, matrix_encoding, audio_service_type); -} - void CActiveAEStream::FadeVolume(float from, float target, unsigned int time) { if (time == 0 || AE_IS_RAW(m_format.m_dataFormat)) @@ -468,11 +459,6 @@ return m_streamFading; } -bool CActiveAEStream::HasDSP() -{ - return AE.HasDSP(); -} - const unsigned int CActiveAEStream::GetFrameSize() const { return m_format.m_frameSize; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h 2015-10-19 08:39:16.000000000 +0000 @@ -62,7 +62,6 @@ virtual void SetVolume(float volume); virtual void SetReplayGain(float factor); virtual void SetAmplification(float amplify); - virtual void SetFFmpegInfo(int profile, enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type); virtual const unsigned int GetFrameSize() const; virtual const unsigned int GetChannelCount() const; @@ -79,7 +78,6 @@ virtual bool IsFading(); virtual void RegisterSlave(IAEStream *stream); virtual void Discontinuity(); - virtual bool HasDSP(); protected: @@ -95,7 +93,6 @@ int m_streamFreeBuffers; bool m_streamIsBuffering; bool m_streamIsFlushed; - bool m_bypassDSP; IAEStream *m_streamSlave; CCriticalSection m_streamLock; uint8_t *m_leftoverBuffer; @@ -124,9 +121,6 @@ float m_fadingBase; float m_fadingTarget; int m_fadingTime; - int m_profile; - enum AVMatrixEncoding m_matrixEncoding; - enum AVAudioServiceType m_audioServiceType; bool m_forceResampler; }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Interfaces/AE.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Interfaces/AE.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Interfaces/AE.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Interfaces/AE.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,10 +19,9 @@ * */ -#include #include +#include #include -#include #include "system.h" @@ -251,18 +250,5 @@ * Instruct AE to re-initialize, e.g. after ELD change event */ virtual void DeviceChange() {return; } - - /** - * Indicates if dsp addon system is active. - */ - virtual bool HasDSP() { return false; }; - - /** - * Get the current sink data format - * - * @param Current sink data format. For more details see AEAudioFormat. - * @return Returns true on success, else false. - */ - virtual bool GetCurrentSinkFormat(AEAudioFormat &SinkFormat) { return false; } }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Interfaces/AESound.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Interfaces/AESound.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Interfaces/AESound.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Interfaces/AESound.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,6 @@ */ #include -#include "cores/AudioEngine/Utils/AEAudioFormat.h" class IAESound { @@ -39,12 +38,6 @@ /* return true if the sound is currently playing */ virtual bool IsPlaying() = 0; - /* set the playback channel of this sound, AE_CH_NULL for all */ - virtual void SetChannel(AEChannel channel) = 0; - - /* get the current playback channel of this sound, AE_CH_NULL for all */ - virtual AEChannel GetChannel() = 0; - /* set the playback volume of this sound */ virtual void SetVolume(float volume) = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Interfaces/AEStream.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Interfaces/AEStream.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Interfaces/AEStream.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Interfaces/AEStream.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,13 +20,18 @@ */ #include "cores/AudioEngine/Utils/AEAudioFormat.h" -#include "cores/AudioEngine/Utils/AEStreamData.h" #include "cores/IAudioCallback.h" #include -extern "C" { -#include "libavcodec/avcodec.h" -} +/** + * Bit options to pass to IAE::GetStream + */ +enum AEStreamOptions +{ + AESTREAM_FORCE_RESAMPLE = 0x01, /* force resample even if rates match */ + AESTREAM_PAUSED = 0x02, /* create the stream paused */ + AESTREAM_AUTOSTART = 0x04 /* autostart the stream when enough data is buffered */ +}; /** * IAEStream Stream Interface for streaming audio @@ -155,14 +160,6 @@ virtual void SetAmplification(float amplify) = 0; /** - * Sets the stream ffmpeg informations if present. - + @param profile - * @param matrix_encoding - * @param audio_service_type - */ - virtual void SetFFmpegInfo(int profile, enum AVMatrixEncoding matrix_encoding, enum AVAudioServiceType audio_service_type) = 0; - - /** * Returns the size of one audio frame in bytes (channelCount * resolution) * @return The size in bytes of one frame */ @@ -242,10 +239,5 @@ * Sginal a clock change */ virtual void Discontinuity() = 0; - - /** - * Indicates if dsp addon system is active. - */ - virtual bool HasDSP() = 0; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Makefile.in 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Makefile.in 2015-10-19 08:39:16.000000000 +0000 @@ -57,12 +57,6 @@ endif endif -SRCS += DSPAddons/ActiveAEDSP.cpp -SRCS += DSPAddons/ActiveAEDSPMode.cpp -SRCS += DSPAddons/ActiveAEDSPAddon.cpp -SRCS += DSPAddons/ActiveAEDSPDatabase.cpp -SRCS += DSPAddons/ActiveAEDSPProcess.cpp - SRCS += Utils/AEChannelInfo.cpp SRCS += Utils/AEBuffer.cpp SRCS += Utils/AEUtil.cpp diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -208,6 +208,7 @@ bool CAESinkAUDIOTRACK::Initialize(AEAudioFormat &format, std::string &device) { + m_lastFormat = format; m_format = format; m_volume = -1; @@ -217,7 +218,7 @@ m_passthrough = false; #if defined(HAS_LIBAMCODEC) - if (aml_present() && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEAMCODEC)) + if (CSettings::Get().GetBool("videoplayer.useamcodec")) aml_set_audio_passthrough(m_passthrough); #endif @@ -364,13 +365,30 @@ m_frames_written = 0; } +bool CAESinkAUDIOTRACK::HasVolume() +{ + return true; +} + +void CAESinkAUDIOTRACK::SetVolume(float scale) +{ + // Ignore in passthrough + if (m_passthrough) + return; + + if (!m_at_jni) + return; + + CXBMCApp::SetSystemVolume(scale); +} + void CAESinkAUDIOTRACK::EnumerateDevicesEx(AEDeviceInfoList &list, bool force) { m_info.m_channels.Reset(); m_info.m_dataFormats.clear(); m_info.m_sampleRates.clear(); - m_info.m_deviceType = AE_DEVTYPE_PCM; + m_info.m_deviceType = AE_DEVTYPE_HDMI; m_info.m_deviceName = "AudioTrack"; m_info.m_displayName = "android"; m_info.m_displayNameExtra = "audiotrack"; @@ -382,25 +400,19 @@ #else m_info.m_channels = KnownChannels; #endif - m_info.m_dataFormats.push_back(AE_FMT_S16LE); - m_info.m_sampleRates.push_back(CJNIAudioTrack::getNativeOutputSampleRate(CJNIAudioManager::STREAM_MUSIC)); - - if (!CXBMCApp::IsHeadsetPlugged()) + int test_sample[] = { 44100, 48000, 96000, 192000 }; + int test_sample_sz = sizeof(test_sample) / sizeof(int); + for (int i=0; i 0) @@ -555,6 +560,7 @@ } else device.m_deviceType = AE_DEVTYPE_PCM; +#endif // add channel info CAEChannelInfo channel_info; @@ -574,7 +580,9 @@ device.m_dataFormats.push_back(AE_FMT_S16LE); //device.m_dataFormats.push_back(AE_FMT_S24LE3); //device.m_dataFormats.push_back(AE_FMT_S32LE); - device.m_dataFormats.push_back(AE_FMT_FLOAT); + // AE_FMT_FLOAT is 3% slower on atv2 + // then S16LE - so leave it out for now + //device.m_dataFormats.push_back(AE_FMT_FLOAT); CLog::Log(LOGDEBUG, "EnumerateDevices:Device(%s)" , device.m_deviceName.c_str()); @@ -616,9 +624,13 @@ AudioStreamBasicDescription audioFormat = {}; - if (format.m_dataFormat == AE_FMT_FLOAT) - audioFormat.mFormatFlags |= kLinearPCMFormatFlagIsFloat; - else// this will be selected when AE wants AC3 or DTS or anything other then float + // AE_FMT_FLOAT is 3% slower on atv2 + // then S16LE - so leave it out for now + // just leave the code commented in here + // as it might come handy at some point maybe ... + //if (format.m_dataFormat == AE_FMT_FLOAT) + // audioFormat.mFormatFlags |= kLinearPCMFormatFlagIsFloat; + //else// this will be selected when AE wants AC3 or DTS or anything other then float { audioFormat.mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger; if (AE_IS_RAW(format.m_dataFormat)) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Sinks/AESinkDARWINOSX.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Sinks/AESinkDARWINOSX.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Sinks/AESinkDARWINOSX.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Sinks/AESinkDARWINOSX.h 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,7 @@ #include "cores/AudioEngine/Sinks/osx/CoreAudioDevice.h" class AERingBuffer; -struct AEDelayStatus; +class AEDelayStatus; class CAESinkDARWINOSX : public IAESink { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp 2015-04-26 07:35:26.000000000 +0000 @@ -192,7 +192,7 @@ else tmp_hWnd = g_hWnd; - CLog::Log(LOGDEBUG, __FUNCTION__": Using Window handle: %p", tmp_hWnd); + CLog::Log(LOGDEBUG, __FUNCTION__": Using Window handle: %d", tmp_hWnd); hr = m_pDSound->SetCooperativeLevel(tmp_hWnd, DSSCL_PRIORITY); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Sinks/AESinkPi.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Sinks/AESinkPi.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Sinks/AESinkPi.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Sinks/AESinkPi.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -191,11 +191,11 @@ m_initDevice = device; m_initFormat = format; - if (m_passthrough || CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE) == "PI:HDMI") + if (m_passthrough || CSettings::Get().GetString("audiooutput.audiodevice") == "PI:HDMI") m_output = AESINKPI_HDMI; - else if (CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE) == "PI:Analogue") + else if (CSettings::Get().GetString("audiooutput.audiodevice") == "PI:Analogue") m_output = AESINKPI_ANALOGUE; - else if (CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE) == "PI:Both") + else if (CSettings::Get().GetString("audiooutput.audiodevice") == "PI:Both") m_output = AESINKPI_BOTH; else assert(0); @@ -222,7 +222,7 @@ CLog::Log(LOGDEBUG, "%s:%s Format:%d Channels:%d Samplerate:%d framesize:%d bufsize:%d bytes/s=%.2f dest=%s", CLASSNAME, __func__, m_format.m_dataFormat, channels, m_format.m_sampleRate, m_format.m_frameSize, m_format.m_frameSize * m_format.m_frames, 1.0/m_sinkbuffer_sec_per_byte, - CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE).c_str()); + CSettings::Get().GetString("audiooutput.audiodevice").c_str()); OMX_ERRORTYPE omx_err = OMX_ErrorNone; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,6 +26,8 @@ #include "guilib/LocalizeStrings.h" #include "Application.h" +using namespace std; + static const char *ContextStateToString(pa_context_state s) { switch (s) @@ -181,7 +183,7 @@ if (!p || !p->IsInitialized()) return; - if(i && i->has_volume && !i->corked) + if(i && i->has_volume) p->UpdateInternalVolume(&(i->volume)); } @@ -373,8 +375,8 @@ { CAEDeviceInfo device; bool valid = true; - device.m_deviceName = std::string(i->name); - device.m_displayName = std::string(i->description); + device.m_deviceName = string(i->name); + device.m_displayName = string(i->description); if (i->active_port && i->active_port->description) device.m_displayNameExtra = std::string((i->active_port->description)).append(" (PULSEAUDIO)"); else @@ -593,27 +595,23 @@ pa_stream_set_write_callback(m_Stream, StreamRequestCallback, m_MainLoop); pa_stream_set_latency_update_callback(m_Stream, StreamLatencyUpdateCallback, m_MainLoop); - // default buffer construction - // align with AE's max buffer - unsigned int latency = m_BytesPerSecond / 2.5; // 400 ms - unsigned int process_time = latency / 4; // 100 ms - if(sinkStruct.isHWDevice) - { - // on hw devices buffers can be further reduced - // 200ms max latency - // 50ms min packet size - latency = m_BytesPerSecond / 5; - process_time = latency / 4; - } - pa_buffer_attr buffer_attr; - buffer_attr.fragsize = latency; - buffer_attr.maxlength = (uint32_t) -1; - buffer_attr.minreq = process_time; - buffer_attr.prebuf = (uint32_t) -1; - buffer_attr.tlength = latency; - if (pa_stream_connect_playback(m_Stream, isDefaultDevice ? NULL : device.c_str(), &buffer_attr, ((pa_stream_flags)(PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_ADJUST_LATENCY)), NULL, NULL) < 0) + // 200ms max latency + // 50ms min packet size + if(sinkStruct.isHWDevice || isDefaultDevice) + { + unsigned int latency = m_BytesPerSecond / 5; + unsigned int process_time = latency / 4; + memset(&buffer_attr, 0, sizeof(buffer_attr)); + buffer_attr.tlength = (uint32_t) latency; + buffer_attr.minreq = (uint32_t) process_time; + buffer_attr.maxlength = (uint32_t) -1; + buffer_attr.prebuf = (uint32_t) -1; + buffer_attr.fragsize = (uint32_t) latency; + } + + if (pa_stream_connect_playback(m_Stream, isDefaultDevice ? NULL : device.c_str(), sinkStruct.isHWDevice ? &buffer_attr : NULL, ((pa_stream_flags)(PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_ADJUST_LATENCY)), NULL, NULL) < 0) { CLog::Log(LOGERROR, "PulseAudio: Failed to connect stream to output"); pa_threaded_mainloop_unlock(m_MainLoop); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Utils/AEAudioFormat.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Utils/AEAudioFormat.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Utils/AEAudioFormat.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Utils/AEAudioFormat.h 2015-10-19 08:39:16.000000000 +0000 @@ -85,17 +85,5 @@ m_frameSize == fmt.m_frameSize; } - AEAudioFormat& operator=(const AEAudioFormat& fmt) - { - m_dataFormat = fmt.m_dataFormat; - m_sampleRate = fmt.m_sampleRate; - m_encodedRate = fmt.m_encodedRate; - m_channelLayout = fmt.m_channelLayout; - m_frames = fmt.m_frames; - m_frameSamples = fmt.m_frameSamples; - m_frameSize = fmt.m_frameSize; - - return *this; - } } AEAudioFormat; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Utils/AEChannelInfo.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Utils/AEChannelInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Utils/AEChannelInfo.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Utils/AEChannelInfo.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,11 +25,7 @@ #include "AEChannelData.h" -class CHelper_libKODI_audioengine; - class CAEChannelInfo { - friend class CHelper_libKODI_audioengine; - public: CAEChannelInfo(); CAEChannelInfo(const enum AEChannel* rhs); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Utils/AEStreamData.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Utils/AEStreamData.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Utils/AEStreamData.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Utils/AEStreamData.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#pragma once -/* - * Copyright (C) 2010-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -/** - * Bit options to pass to IAE::MakeStream - */ -enum AEStreamOptions -{ - AESTREAM_FORCE_RESAMPLE = 1 << 0, /* force resample even if rates match */ - AESTREAM_PAUSED = 1 << 1, /* create the stream paused */ - AESTREAM_AUTOSTART = 1 << 2, /* autostart the stream when enough data is buffered */ - AESTREAM_BYPASS_ADSP = 1 << 3 /* if this option is set the ADSP-System is bypassed and the raw stream will be passed through IAESink */ -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Utils/AEUtil.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Utils/AEUtil.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Utils/AEUtil.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Utils/AEUtil.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -31,6 +31,8 @@ #include "libavutil/channel_layout.h" } +using namespace std; + /* declare the rng seed and initialize it */ unsigned int CAEUtil::m_seed = (unsigned int)(CurrentHostCounter() / 1000.0f); #ifdef __SSE2__ @@ -38,22 +40,21 @@ MEMALIGN(16, __m128i CAEUtil::m_sseSeed) = _mm_set_epi32(CAEUtil::m_seed, CAEUtil::m_seed+1, CAEUtil::m_seed, CAEUtil::m_seed+1); #endif -void AEDelayStatus::SetDelay(double d) +void AEDelayStatus::SetDelay(double d) { delay = d; - maxcorrection = d; - tick = CurrentHostCounter(); + tick = CurrentHostCounter(); } double AEDelayStatus::GetDelay() { - double d = 0; - if (tick) - d = (double)(CurrentHostCounter() - tick) / CurrentHostFrequency(); - if (d > maxcorrection) - d = maxcorrection; - - return delay - d; + double d = delay; + if(tick) + d -= (double)(CurrentHostCounter() - tick) / CurrentHostFrequency(); + if(d < 0) + return 0.0; + else + return d; } CAEChannelInfo CAEUtil::GuessChLayout(const unsigned int channels) @@ -556,33 +557,6 @@ return channelLayout; } - -CAEChannelInfo CAEUtil::GetAEChannelLayout(uint64_t layout) -{ - CAEChannelInfo channelLayout; - channelLayout.Reset(); - - if (layout & AV_CH_FRONT_LEFT) channelLayout += AE_CH_FL; - if (layout & AV_CH_FRONT_RIGHT) channelLayout += AE_CH_FR; - if (layout & AV_CH_FRONT_CENTER) channelLayout += AE_CH_FC; - if (layout & AV_CH_LOW_FREQUENCY) channelLayout += AE_CH_LFE; - if (layout & AV_CH_BACK_LEFT) channelLayout += AE_CH_BL; - if (layout & AV_CH_BACK_RIGHT) channelLayout += AE_CH_BR; - if (layout & AV_CH_FRONT_LEFT_OF_CENTER) channelLayout += AE_CH_FLOC; - if (layout & AV_CH_FRONT_RIGHT_OF_CENTER) channelLayout += AE_CH_FROC; - if (layout & AV_CH_BACK_CENTER) channelLayout += AE_CH_BC; - if (layout & AV_CH_SIDE_LEFT) channelLayout += AE_CH_SL; - if (layout & AV_CH_SIDE_RIGHT) channelLayout += AE_CH_SR; - if (layout & AV_CH_TOP_CENTER) channelLayout += AE_CH_TC; - if (layout & AV_CH_TOP_FRONT_LEFT) channelLayout += AE_CH_TFL; - if (layout & AV_CH_TOP_FRONT_CENTER) channelLayout += AE_CH_TFC; - if (layout & AV_CH_TOP_FRONT_RIGHT) channelLayout += AE_CH_TFR; - if (layout & AV_CH_TOP_BACK_LEFT) channelLayout += AE_CH_BL; - if (layout & AV_CH_TOP_BACK_CENTER) channelLayout += AE_CH_BC; - if (layout & AV_CH_TOP_BACK_RIGHT) channelLayout += AE_CH_BR; - - return channelLayout; -} AVSampleFormat CAEUtil::GetAVSampleFormat(AEDataFormat format) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Utils/AEUtil.h kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Utils/AEUtil.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/AudioEngine/Utils/AEUtil.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/AudioEngine/Utils/AEUtil.h 2015-10-19 08:39:16.000000000 +0000 @@ -64,16 +64,14 @@ { AEDelayStatus() : delay(0.0) - , maxcorrection(0.0) , tick(0) {} void SetDelay(double d); double GetDelay(); - double delay; // delay in sink currently - double maxcorrection; // time correction must not be greater than sink delay - int64_t tick; // timestamp when delay was calculated + double delay; /*!< delay in sink currently */ + int64_t tick; /*!< timestamp when delay was calculated */ }; /** @@ -228,7 +226,6 @@ static bool S16NeedsByteSwap(AEDataFormat in, AEDataFormat out); static uint64_t GetAVChannelLayout(CAEChannelInfo &info); - static CAEChannelInfo GetAEChannelLayout(uint64_t layout); static AVSampleFormat GetAVSampleFormat(AEDataFormat format); static uint64_t GetAVChannel(enum AEChannel aechannel); static int GetAVChannelIndex(enum AEChannel aechannel, uint64_t layout); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/exports/emu_kernel32.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/exports/emu_kernel32.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/exports/emu_kernel32.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/exports/emu_kernel32.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -41,8 +41,9 @@ #include #include #include +using namespace std; -std::vector m_vecAtoms; +vector m_vecAtoms; //#define API_DEBUG @@ -55,7 +56,7 @@ { if (nAtom < 1 || nAtom > m_vecAtoms.size() ) return 0; nAtom--; - std::string& strAtom = m_vecAtoms[nAtom]; + string& strAtom = m_vecAtoms[nAtom]; strcpy(lpBuffer, strAtom.c_str()); return strAtom.size(); } @@ -64,7 +65,7 @@ { for (int i = 0; i < (int)m_vecAtoms.size(); ++i) { - std::string& strAtom = m_vecAtoms[i]; + string& strAtom = m_vecAtoms[i]; if (strAtom == lpString) return i + 1; } return 0; @@ -272,8 +273,8 @@ { CLog::Log(LOGDEBUG, " Processor architecture %d\n", si->wProcessorArchitecture); CLog::Log(LOGDEBUG, " Page size: %d\n", si->dwPageSize); - CLog::Log(LOGDEBUG, " Minimum app address: %p\n", si->lpMinimumApplicationAddress); - CLog::Log(LOGDEBUG, " Maximum app address: %p\n", si->lpMaximumApplicationAddress); + CLog::Log(LOGDEBUG, " Minimum app address: %d\n", si->lpMinimumApplicationAddress); + CLog::Log(LOGDEBUG, " Maximum app address: %d\n", si->lpMaximumApplicationAddress); CLog::Log(LOGDEBUG, " Active processor mask: 0x%x\n", si->dwActiveProcessorMask); CLog::Log(LOGDEBUG, " Number of processors: %d\n", si->dwNumberOfProcessors); CLog::Log(LOGDEBUG, " Processor type: 0x%x\n", si->dwProcessorType); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -79,6 +79,7 @@ #include "utils/Environment.h" #include "utils/StringUtils.h" +using namespace std; using namespace XFILE; struct SDirData @@ -141,29 +142,29 @@ { // using external python, it's build looking for xxx/lib/python2.6 // so point it to frameworks which is where python2.6 is located - dll_putenv(std::string("PYTHONPATH=" + + dll_putenv(string("PYTHONPATH=" + CSpecialProtocol::TranslatePath("special://frameworks")).c_str()); - dll_putenv(std::string("PYTHONHOME=" + + dll_putenv(string("PYTHONHOME=" + CSpecialProtocol::TranslatePath("special://frameworks")).c_str()); - dll_putenv(std::string("PATH=.;" + + dll_putenv(string("PATH=.;" + CSpecialProtocol::TranslatePath("special://xbmc") + ";" + CSpecialProtocol::TranslatePath("special://frameworks")).c_str()); } else { - dll_putenv(std::string("PYTHONPATH=" + + dll_putenv(string("PYTHONPATH=" + CSpecialProtocol::TranslatePath("special://xbmc/system/python/DLLs") + ";" + CSpecialProtocol::TranslatePath("special://xbmc/system/python/Lib")).c_str()); - dll_putenv(std::string("PYTHONHOME=" + + dll_putenv(string("PYTHONHOME=" + CSpecialProtocol::TranslatePath("special://xbmc/system/python")).c_str()); - dll_putenv(std::string("PATH=.;" + CSpecialProtocol::TranslatePath("special://xbmc") + ";" + + dll_putenv(string("PATH=.;" + CSpecialProtocol::TranslatePath("special://xbmc") + ";" + CSpecialProtocol::TranslatePath("special://xbmc/system/python")).c_str()); } #if defined(TARGET_ANDROID) - std::string apkPath = getenv("XBMC_ANDROID_APK"); + string apkPath = getenv("XBMC_ANDROID_APK"); apkPath += "/assets/python2.6"; - dll_putenv(std::string("PYTHONHOME=" + apkPath).c_str()); + dll_putenv(string("PYTHONHOME=" + apkPath).c_str()); dll_putenv("PYTHONOPTIMIZE="); dll_putenv("PYTHONNOUSERSITE=1"); dll_putenv("PYTHONPATH="); @@ -194,22 +195,22 @@ extern "C" void __stdcall update_emu_environ() { // Use a proxy, if the GUI was configured as such - if (CSettings::GetInstance().GetBool(CSettings::SETTING_NETWORK_USEHTTPPROXY) - && !CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYSERVER).empty() - && CSettings::GetInstance().GetInt(CSettings::SETTING_NETWORK_HTTPPROXYPORT) > 0 - && CSettings::GetInstance().GetInt(CSettings::SETTING_NETWORK_HTTPPROXYTYPE) == 0) + if (CSettings::Get().GetBool("network.usehttpproxy") + && !CSettings::Get().GetString("network.httpproxyserver").empty() + && CSettings::Get().GetInt("network.httpproxyport") > 0 + && CSettings::Get().GetInt("network.httpproxytype") == 0) { std::string strProxy; - if (!CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYUSERNAME).empty() && - !CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYPASSWORD).empty()) + if (!CSettings::Get().GetString("network.httpproxyusername").empty() && + !CSettings::Get().GetString("network.httpproxypassword").empty()) { strProxy = StringUtils::Format("%s:%s@", - CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYUSERNAME).c_str(), - CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYPASSWORD).c_str()); + CSettings::Get().GetString("network.httpproxyusername").c_str(), + CSettings::Get().GetString("network.httpproxypassword").c_str()); } - strProxy += CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYSERVER); - strProxy += StringUtils::Format(":%d", CSettings::GetInstance().GetInt(CSettings::SETTING_NETWORK_HTTPPROXYPORT)); + strProxy += CSettings::Get().GetString("network.httpproxyserver"); + strProxy += StringUtils::Format(":%d", CSettings::Get().GetInt("network.httpproxyport")); CEnvironment::setenv( "HTTP_PROXY", "http://" + strProxy, true ); CEnvironment::setenv( "HTTPS_PROXY", "http://" + strProxy, true ); @@ -854,18 +855,18 @@ // non-local files. handle through IDirectory-class - only supports '*.bah' or '*.*' std::string strURL(file); std::string strMask; - if (url.GetFileName().find("*.*") != std::string::npos) + if (url.GetFileName().find("*.*") != string::npos) { std::string strReplaced = url.GetFileName(); StringUtils::Replace(strReplaced, "*.*",""); url.SetFileName(strReplaced); } - else if (url.GetFileName().find("*.") != std::string::npos) + else if (url.GetFileName().find("*.") != string::npos) { strMask = URIUtils::GetExtension(url.GetFileName()); url.SetFileName(url.GetFileName().substr(0, url.GetFileName().find("*."))); } - else if (url.GetFileName().find("*") != std::string::npos) + else if (url.GetFileName().find("*") != string::npos) { std::string strReplaced = url.GetFileName(); StringUtils::Replace(strReplaced, "*",""); @@ -1233,7 +1234,7 @@ int fd = dll_open(filename, convert_fmode(mode)); if (fd >= 0) { - file = g_emuFileWrapper.GetStreamByDescriptor(fd); + file = g_emuFileWrapper.GetStreamByDescriptor(fd);; } return file; @@ -1751,7 +1752,7 @@ } else if (!IS_STD_STREAM(stream)) { - clearerr(stream); + return clearerr(stream); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/exports/wrapper.c kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/exports/wrapper.c --- kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/exports/wrapper.c 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/exports/wrapper.c 2015-10-19 08:39:16.000000000 +0000 @@ -197,7 +197,7 @@ void __wrap_clearerr(FILE *stream) { - dll_clearerr(stream); + return dll_clearerr(stream); } int __wrap_feof(FILE *stream) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/LibraryLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/LibraryLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/LibraryLoader.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/LibraryLoader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -42,7 +42,7 @@ size_t pos = m_fileName.find_last_of('/'); if (pos != std::string::npos) return &m_fileName.at(pos); - return m_fileName.c_str(); + return ""; } const char *LibraryLoader::GetFileName() const diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/SoLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/SoLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/SoLoader.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/SoLoader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -72,6 +72,7 @@ void SoLoader::Unload() { + CLog::Log(LOGDEBUG, "Unloading: %s\n", GetName()); if (m_soHandle) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/Win32DllLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/Win32DllLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/Win32DllLoader.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/Win32DllLoader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -31,8 +31,6 @@ #include "exports/emu_kernel32.h" #include "exports/emu_msvcrt.h" -#include - extern "C" FILE _iob[]; extern "C" FARPROC WINAPI dllWin32GetProcAddress(HMODULE hModule, LPCSTR function); @@ -249,7 +247,7 @@ if (!image_base) { - CLog::Log(LOGERROR, "%s - unable to GetModuleHandle for dll %s", __FUNCTION__, dll.c_str()); + CLog::Log(LOGERROR, "%s - unable to GetModuleHandle for dll %s", dll.c_str()); return; } @@ -261,7 +259,7 @@ if (!imp_desc) { - CLog::Log(LOGERROR, "%s - unable to get import directory for dll %s", __FUNCTION__, dll.c_str()); + CLog::Log(LOGERROR, "%s - unable to get import directory for dll %s", dll.c_str()); return; } @@ -426,14 +424,10 @@ extern "C" FARPROC __stdcall dllWin32GetProcAddress(HMODULE hModule, LPCSTR function) { - // if the high-order word is zero, then lpProcName is the function's ordinal value - if (reinterpret_cast(function) > std::numeric_limits::max()) - { - // first check whether this function is one of the ones we need to wrap - void *fixup = NULL; - if (FunctionNeedsWrapping(win32_exports, function, &fixup)) - return (FARPROC)fixup; - } + // first check whether this function is one of the ones we need to wrap + void *fixup = NULL; + if (FunctionNeedsWrapping(win32_exports, function, &fixup)) + return (FARPROC)fixup; // Nope return GetProcAddress(hModule, function); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/Win32DllLoader.h kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/Win32DllLoader.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/DllLoader/Win32DllLoader.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/DllLoader/Win32DllLoader.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,8 +22,6 @@ * */ -#include - #include "LibraryLoader.h" class Win32DllLoader : public LibraryLoader diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/DummyVideoPlayer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/DummyVideoPlayer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/DummyVideoPlayer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/DummyVideoPlayer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -87,10 +87,16 @@ g_graphicsContext.Lock(); if (g_graphicsContext.IsFullScreenVideo()) { +#ifdef HAS_DX + g_Windowing.Get3DDevice()->BeginScene(); +#endif g_graphicsContext.Clear(); g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false); Render(); g_application.RenderNoPresent(); +#ifdef HAS_DX + g_Windowing.Get3DDevice()->EndScene(); +#endif } g_graphicsContext.Unlock(); } @@ -262,13 +268,13 @@ { const CRect vw = g_graphicsContext.GetViewWindow(); #ifdef HAS_DX - unsigned num = 1; - D3D11_VIEWPORT newviewport; - g_Windowing.Get3D11Context()->RSGetViewports(&num, &newviewport); - newviewport.MinDepth = 0.0f; - newviewport.MaxDepth = 1.0f; - newviewport.TopLeftX = (DWORD)vw.x1; - newviewport.TopLeftY = (DWORD)vw.y1; + D3DVIEWPORT9 newviewport; + D3DVIEWPORT9 oldviewport; + g_Windowing.Get3DDevice()->GetViewport(&oldviewport); + newviewport.MinZ = 0.0f; + newviewport.MaxZ = 1.0f; + newviewport.X = (DWORD)vw.x1; + newviewport.Y = (DWORD)vw.y1; newviewport.Width = (DWORD)vw.Width(); newviewport.Height = (DWORD)vw.Height(); g_graphicsContext.SetClipRegion(vw.x1, vw.y1, vw.Width(), vw.Height()); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDAudio.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDAudio.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDAudio.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDAudio.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,9 @@ #include "cores/AudioEngine/Interfaces/AEStream.h" #include "settings/MediaSettings.h" +using namespace std; + + CDVDAudio::CDVDAudio(volatile bool &bStop) : m_bStop(bStop) { @@ -81,10 +84,7 @@ else m_SecondsPerByte = 0.0; - if (m_pAudioStream->HasDSP()) - m_pAudioStream->SetFFmpegInfo(audioframe.profile, audioframe.matrix_encoding, audioframe.audio_service_type); - - SetDynamicRangeCompression((long)(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification * 100)); + SetDynamicRangeCompression((long)(CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification * 100)); return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,8 +29,8 @@ #include "libavutil/opt.h" } -#include "settings/Settings.h" #if defined(TARGET_DARWIN) +#include "settings/Settings.h" #include "cores/AudioEngine/Utils/AEUtil.h" #endif @@ -54,15 +54,10 @@ bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { - AVCodec* pCodec = NULL; + AVCodec* pCodec; m_bOpenedCodec = false; - if (hints.codec == AV_CODEC_ID_DTS && CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_SUPPORTSDTSHDCPUDECODING)) - pCodec = avcodec_find_decoder_by_name("libdcadec"); - - if (!pCodec) - pCodec = avcodec_find_decoder(hints.codec); - + pCodec = avcodec_find_decoder(hints.codec); if (!pCodec) { CLog::Log(LOGDEBUG,"CDVDAudioCodecFFmpeg::Open() Unable to find codec %d", hints.codec); @@ -77,7 +72,6 @@ if (pCodec->capabilities & CODEC_CAP_TRUNCATED) m_pCodecContext->flags |= CODEC_FLAG_TRUNCATED; - m_matrixEncoding = AV_MATRIX_ENCODING_NONE; m_channels = 0; m_pCodecContext->channels = hints.channels; m_pCodecContext->sample_rate = hints.samplerate; @@ -111,7 +105,6 @@ m_pFrame1 = av_frame_alloc(); m_bOpenedCodec = true; m_iSampleFormat = AV_SAMPLE_FMT_NONE; - m_matrixEncoding = AV_MATRIX_ENCODING_NONE; return true; } @@ -155,21 +148,6 @@ iBytesUsed = iSize; } - if (m_pFrame1->nb_side_data) - { - for (int i = 0; i < m_pFrame1->nb_side_data; i++) - { - AVFrameSideData *sd = m_pFrame1->side_data[i]; - if (sd->data) - { - if (sd->type == AV_FRAME_DATA_MATRIXENCODING) - { - m_matrixEncoding = *(enum AVMatrixEncoding*)sd->data; - } - } - } - } - return iBytesUsed; } @@ -232,25 +210,6 @@ return 0; } -enum AVMatrixEncoding CDVDAudioCodecFFmpeg::GetMatrixEncoding() -{ - return m_matrixEncoding; -} - -enum AVAudioServiceType CDVDAudioCodecFFmpeg::GetAudioServiceType() -{ - if (m_pCodecContext) - return m_pCodecContext->audio_service_type; - return AV_AUDIO_SERVICE_TYPE_MAIN; -} - -int CDVDAudioCodecFFmpeg::GetProfile() -{ - if (m_pCodecContext) - return m_pCodecContext->profile; - return 0; -} - static unsigned count_bits(int64_t value) { unsigned bits = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h 2015-10-19 08:39:16.000000000 +0000 @@ -45,15 +45,11 @@ virtual enum AEDataFormat GetDataFormat(); virtual const char* GetName() { return "FFmpeg"; } virtual int GetBitRate(); - virtual enum AVMatrixEncoding GetMatrixEncoding(); - virtual enum AVAudioServiceType GetAudioServiceType(); - virtual int GetProfile(); protected: - AVCodecContext* m_pCodecContext; - enum AVSampleFormat m_iSampleFormat; - CAEChannelInfo m_channelLayout; - enum AVMatrixEncoding m_matrixEncoding; + AVCodecContext* m_pCodecContext; + enum AVSampleFormat m_iSampleFormat; + CAEChannelInfo m_channelLayout; AVFrame* m_pFrame1; int m_gotFrame; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodec.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodec.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodec.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodec.h 2015-10-19 08:39:16.000000000 +0000 @@ -58,9 +58,6 @@ int sample_rate; int encoded_sample_rate; bool passthrough; - enum AVAudioServiceType audio_service_type; - enum AVMatrixEncoding matrix_encoding; - int profile; } DVDAudioFrame; class CDVDAudioCodec @@ -113,9 +110,6 @@ frame.encoded_sample_rate = GetEncodedSampleRate(); frame.passthrough = NeedPassthrough(); frame.pts = DVD_NOPTS_VALUE; - frame.matrix_encoding = GetMatrixEncoding(); - frame.audio_service_type = GetAudioServiceType(); - frame.profile = GetProfile(); // compute duration. if (frame.sample_rate) frame.duration = ((double)frame.nb_frames * DVD_TIME_BASE) / frame.sample_rate; @@ -177,19 +171,4 @@ * should return amount of data decoded has buffered in preparation for next audio frame */ virtual int GetBufferSize() { return 0; } - - /* - * should return the ffmpeg matrix encoding type - */ - virtual enum AVMatrixEncoding GetMatrixEncoding() { return AV_MATRIX_ENCODING_NONE; } - - /* - * should return the ffmpeg audio service type - */ - virtual enum AVAudioServiceType GetAudioServiceType() { return AV_AUDIO_SERVICE_TYPE_MAIN; } - - /* - * should return the ffmpeg profile value - */ - virtual int GetProfile() { return 0; } }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,6 +24,9 @@ #include "utils/log.h" #include "cores/FFmpeg.h" #include "Util.h" +#ifdef HAS_DX +#include "cores/dvdplayer/DVDCodecs/Video/DXVA.h" +#endif #ifdef TARGET_WINDOWS #pragma comment(lib, "avcodec.lib") @@ -270,7 +273,7 @@ struct SwsContext *ctx = sws_getContext(pSrc->iWidth, pSrc->iHeight, PIX_FMT_YUV420P, pPicture->iWidth, pPicture->iHeight, (AVPixelFormat)dstformat, - SWS_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); + SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); sws_scale(ctx, src, srcStride, 0, pSrc->iHeight, dst, dstStride); sws_freeContext(ctx); } @@ -353,6 +356,64 @@ return true; } +bool CDVDCodecUtils::CopyDXVA2Picture(YV12Image* pImage, DVDVideoPicture *pSrc) +{ +#ifdef HAS_DX + // TODO: Optimize this later using shaders/swscale/etc. + switch (pSrc->extended_format) + { + case MAKEFOURCC('N','V','1','2'): + { + IDirect3DSurface9* surface = (IDirect3DSurface9*)(pSrc->dxva->surface); + + D3DLOCKED_RECT rectangle; + if (FAILED(surface->LockRect(&rectangle, NULL, 0))) + return false; + + // Copy Y + uint8_t* bits = (uint8_t*)(rectangle.pBits); + uint8_t* d = pImage->plane[0]; + for (unsigned y = 0; y < pSrc->iHeight; y++) + { + memcpy(d, bits, pSrc->iWidth); + bits += rectangle.Pitch; + d += pImage->stride[0]; + } + + D3DSURFACE_DESC desc; + if (FAILED(surface->GetDesc(&desc))) + return false; + + // Copy packed UV + uint8_t *s_uv = ((uint8_t*)(rectangle.pBits)) + desc.Height * rectangle.Pitch; + uint8_t *d_uv = pImage->plane[1]; + for (unsigned y = 0; y < pSrc->iHeight >> 1; y++) + { + memcpy(d_uv, s_uv, pSrc->iWidth); + s_uv += rectangle.Pitch; + d_uv += pImage->stride[1]; + } + + if (FAILED(surface->UnlockRect())) + return false; + } + return true; + + // Future... + /*case MAKEFOURCC('Y','V','1','2'): + return true;*/ + + /*case MAKEFOURCC('Y','V','V','Y'): + return true;*/ + + default: + CLog::Log(LOGWARNING, "CDVDCodecUtils::CopyDXVA2Picture colorspace not supported"); + return false; + } +#endif + return false; +} + bool CDVDCodecUtils::IsVP3CompatibleWidth(int width) { // known hardware limitation of purevideo 3 (VP3). (the Nvidia 9400 is a purevideo 3 chip) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.h 2015-10-19 08:39:16.000000000 +0000 @@ -37,6 +37,7 @@ static DVDVideoPicture* ConvertToYUV422PackedPicture(DVDVideoPicture *pSrc, ERenderFormat format); static bool CopyNV12Picture(YV12Image* pImage, DVDVideoPicture *pSrc); static bool CopyYUV422PackedPicture(YV12Image* pImage, DVDVideoPicture *pSrc); + static bool CopyDXVA2Picture(YV12Image* pImage, DVDVideoPicture *pSrc); static bool IsVP3CompatibleWidth(int width); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -209,7 +209,7 @@ #if defined(HAS_LIBAMCODEC) // amcodec can handle dvd playback. - if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEAMCODEC)) + if (!hint.software && CSettings::Get().GetBool("videoplayer.useamcodec")) { switch(hint.codec) { @@ -234,7 +234,7 @@ #endif #if defined(TARGET_DARWIN_OSX) - if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVDA) && !g_advancedSettings.m_useFfmpegVda) + if (!hint.software && CSettings::Get().GetBool("videoplayer.usevda") && !g_advancedSettings.m_useFfmpegVda) { if (hint.codec == AV_CODEC_ID_H264 && !hint.ptsinvalid) { @@ -244,7 +244,7 @@ #endif #if defined(HAVE_VIDEOTOOLBOXDECODER) - if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVIDEOTOOLBOX)) + if (!hint.software && CSettings::Get().GetBool("videoplayer.usevideotoolbox")) { if (g_sysinfo.HasVideoToolBoxDecoder()) { @@ -263,23 +263,7 @@ #endif #if defined(TARGET_ANDROID) - if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMEDIACODECSURFACE)) - { - switch(hint.codec) - { - case AV_CODEC_ID_MPEG4: - case AV_CODEC_ID_MSMPEG4V2: - case AV_CODEC_ID_MSMPEG4V3: - // Avoid h/w decoder for SD; Those files might use features - // not supported and can easily be soft-decoded - if (hint.width <= 800) - break; - default: - CLog::Log(LOGINFO, "MediaCodec (Surface) Video Decoder..."); - if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(true), hint, options)) ) return pCodec; - } - } - if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMEDIACODEC)) + if (!hint.software && CSettings::Get().GetBool("videoplayer.usemediacodec")) { switch(hint.codec) { @@ -292,13 +276,13 @@ break; default: CLog::Log(LOGINFO, "MediaCodec Video Decoder..."); - if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(false), hint, options)) ) return pCodec; + if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(), hint, options)) ) return pCodec; } } #endif #if defined(HAVE_LIBOPENMAX) - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEOMX) && !hint.software ) + if (CSettings::Get().GetBool("videoplayer.useomx") && !hint.software ) { if (hint.codec == AV_CODEC_ID_H264 || hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_VC1) { @@ -308,7 +292,7 @@ #endif #if defined(HAS_MMAL) - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMMAL) && !hint.software ) + if (CSettings::Get().GetBool("videoplayer.usemmal") && !hint.software ) { if (hint.codec == AV_CODEC_ID_H264 || hint.codec == AV_CODEC_ID_H263 || hint.codec == AV_CODEC_ID_MPEG4 || hint.codec == AV_CODEC_ID_MPEG1VIDEO || hint.codec == AV_CODEC_ID_MPEG2VIDEO || @@ -321,7 +305,7 @@ #endif #if defined(HAS_LIBSTAGEFRIGHT) - if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USESTAGEFRIGHT)) + if (!hint.software && CSettings::Get().GetBool("videoplayer.usestagefright")) { switch(hint.codec) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder708.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder708.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder708.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder708.cpp 2015-10-19 08:38:33.000000000 +0000 @@ -990,25 +990,6 @@ } } -bool check_current_packet_complete (cc708_service_decoder *decoders) -{ - int len = decoders[0].parent->m_current_packet[0] & 0x3F; // 6 least significants bits - if (decoders[0].parent->m_current_packet_length == 0) - return false; - - if (len==0) // This is well defined in EIA-708; no magic. - len=128; - else - len=len*2; - - // Note that len here is the length including the header - if (decoders[0].parent->m_current_packet_length == len) // Is this possible? - { - return true; - } - return false; -} - void process_current_packet (cc708_service_decoder *decoders) { int seq = (decoders[0].parent->m_current_packet[0] & 0xC0) >> 6; // Two most significants bits @@ -1096,13 +1077,8 @@ decode_cc(decoders[0].parent->m_cc608decoder, (uint8_t*)data+i, 3); break; case 2: - if (cc_valid==0) // This ends the previous packet if complete - { - if (check_current_packet_complete(decoders)) - { - process_current_packet(decoders); - } - } + if (cc_valid==0) // This ends the previous packet + process_current_packet(decoders); else { if (decoders[0].parent->m_current_packet_length < 254) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder.c kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder.c --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder.c 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder.c 2015-10-19 08:39:16.000000000 +0000 @@ -575,6 +575,8 @@ uint32_t i; for (i = 0; i - #include "DVDOverlaySSA.h" #include "DVDStreamInfo.h" #include "DVDCodecs/DVDCodecs.h" #include "DVDClock.h" #include "Util.h" +#include "utils/AutoPtrHandle.h" #include "utils/StringUtils.h" +using namespace AUTOPTR; +using namespace std; CDVDOverlayCodecSSA::CDVDOverlayCodecSSA() : CDVDOverlayCodec("SSA Subtitle Decoder") { @@ -90,7 +91,7 @@ { line = lines[i]; StringUtils::Trim(line); - std::unique_ptr layer(new char[line.length() + 1]); + auto_aptr layer(new char[line.length()+1]); if(sscanf(line.c_str(), "%*[^:]:%[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d" , layer.get(), &sh, &sm, &ss, &sc, &eh,&em, &es, &ec) != 9) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecTX3G.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecTX3G.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecTX3G.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecTX3G.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -67,7 +67,7 @@ m_pOverlay = NULL; // stupid, this comes from a static global in GUIWindowFullScreen.cpp uint32_t colormap[8] = { 0xFFFFFF00, 0xFFFFFFFF, 0xFF0099FF, 0xFF00FF00, 0xFFCCFF00, 0xFF00FFFF, 0xFFE5E5E5, 0xFFC0C0C0 }; - m_textColor = colormap[CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_COLOR)]; + m_textColor = colormap[CSettings::Get().GetInt("subtitles.color")]; } CDVDOverlayCodecTX3G::~CDVDOverlayCodecTX3G() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -41,10 +41,6 @@ #include "utils/BitstreamConverter.h" #endif -extern "C" { -#include "libavutil/avutil.h" -} // extern "C" - #include #include #include @@ -96,11 +92,18 @@ virtual int codec_set_cntl_mode(codec_para_t *pcodec, unsigned int mode)=0; virtual int codec_set_cntl_avthresh(codec_para_t *pcodec, unsigned int avthresh)=0; virtual int codec_set_cntl_syncthresh(codec_para_t *pcodec, unsigned int syncthresh)=0; + + // grab these from libamplayer + virtual int h263vld(unsigned char *inbuf, unsigned char *outbuf, int inbuf_len, int s263)=0; + virtual int decodeble_h263(unsigned char *buf)=0; + + // grab this from amffmpeg so we do not have to load DllAvUtil + virtual AVRational av_d2q(double d, int max)=0; }; class DllLibAmCodec : public DllDynamic, DllLibamCodecInterface { - // libamcodec is static linked into libamplayer.so or libamcodec.so + // libamcodec is static linked into libamplayer.so DECLARE_DLL_WRAPPER(DllLibAmCodec, "libamplayer.so") DEFINE_METHOD1(int, codec_init, (codec_para_t *p1)) @@ -119,6 +122,11 @@ DEFINE_METHOD2(int, codec_set_cntl_avthresh, (codec_para_t *p1, unsigned int p2)) DEFINE_METHOD2(int, codec_set_cntl_syncthresh,(codec_para_t *p1, unsigned int p2)) + DEFINE_METHOD4(int, h263vld, (unsigned char *p1, unsigned char *p2, int p3, int p4)) + DEFINE_METHOD1(int, decodeble_h263, (unsigned char *p1)) + + DEFINE_METHOD2(AVRational, av_d2q, (double p1, int p2)) + BEGIN_METHOD_RESOLVE() RESOLVE_METHOD(codec_init) RESOLVE_METHOD(codec_close) @@ -135,6 +143,11 @@ RESOLVE_METHOD(codec_set_cntl_mode) RESOLVE_METHOD(codec_set_cntl_avthresh) RESOLVE_METHOD(codec_set_cntl_syncthresh) + + RESOLVE_METHOD(h263vld) + RESOLVE_METHOD(decodeble_h263) + + RESOLVE_METHOD(av_d2q) END_METHOD_RESOLVE() public: @@ -150,11 +163,11 @@ // order matters, so pay attention // to codec_para_t in codec_types.h - CBitstreamConverter::write_bits(&bs, 32, -1); // CODEC_HANDLE handle, init to invalid - CBitstreamConverter::write_bits(&bs, 32, -1); // CODEC_HANDLE cntl_handle - CBitstreamConverter::write_bits(&bs, 32, -1); // CODEC_HANDLE sub_handle + CBitstreamConverter::write_bits(&bs, 32, 0); // CODEC_HANDLE handle + CBitstreamConverter::write_bits(&bs, 32, 0); // CODEC_HANDLE cntl_handle + CBitstreamConverter::write_bits(&bs, 32, 0); // CODEC_HANDLE sub_handle - CBitstreamConverter::write_bits(&bs, 32, -1); // CODEC_HANDLE audio_utils_handle + CBitstreamConverter::write_bits(&bs, 32, 0); // CODEC_HANDLE audio_utils_handle CBitstreamConverter::write_bits(&bs, 32, p_in->stream_type); // stream_type_t stream_type @@ -199,10 +212,6 @@ #else // direct struct usage, we do not know which flavor // so just use what we get from headers and pray. - p_out->handle = -1; //init to invalid - p_out->cntl_handle = -1; - p_out->sub_handle = -1; - p_out->audio_utils_handle = -1; p_out->has_video = 1; p_out->noblock = p_in->noblock; p_out->video_pid = p_in->video_pid; @@ -326,6 +335,8 @@ unsigned int video_ratio64; unsigned int video_rate; unsigned int video_rotation_degree; + int flv_flag; + int h263_decodable; int extrasize; uint8_t *extradata; DllLibAmCodec *m_dll; @@ -1239,6 +1250,47 @@ else if (para->video_codec_type == VIDEO_DEC_FORMAT_H263) { return PLAYER_UNSUPPORT; + unsigned char *vld_buf; + int vld_len, vld_buf_size = para->video_width * para->video_height * 2; + + if (!pkt->data_size) { + return PLAYER_SUCCESS; + } + + if ((pkt->data[0] == 0) && (pkt->data[1] == 0) && (pkt->data[2] == 1) && (pkt->data[3] == 0xb6)) { + return PLAYER_SUCCESS; + } + + vld_buf = (unsigned char*)malloc(vld_buf_size); + if (!vld_buf) { + return PLAYER_NOMEM; + } + + if (para->flv_flag) { + vld_len = para->m_dll->h263vld(pkt->data, vld_buf, pkt->data_size, 1); + } else { + if (0 == para->h263_decodable) { + para->h263_decodable = para->m_dll->decodeble_h263(pkt->data); + if (0 == para->h263_decodable) { + CLog::Log(LOGDEBUG, "[%s]h263 unsupport video and audio, exit", __FUNCTION__); + return PLAYER_UNSUPPORT; + } + } + vld_len = para->m_dll->h263vld(pkt->data, vld_buf, pkt->data_size, 0); + } + + if (vld_len > 0) { + if (pkt->buf) { + free(pkt->buf); + } + pkt->buf = vld_buf; + pkt->buf_size = vld_buf_size; + pkt->data = pkt->buf; + pkt->data_size = vld_len; + } else { + free(vld_buf); + pkt->data_size = 0; + } } } else if (para->video_format == VFORMAT_VC1) { if (para->video_codec_type == VIDEO_DEC_FORMAT_WMV3) { @@ -1386,17 +1438,8 @@ am_private = new am_private_t; memset(am_private, 0, sizeof(am_private_t)); m_dll = new DllLibAmCodec; - if(!m_dll->Load()) - { - CLog::Log(LOGWARNING, "CAMLCodec::CAMLCodec libamplayer.so not found, trying libamcodec.so instead"); - m_dll->SetFile("libamcodec.so"); - m_dll->Load(); - } + m_dll->Load(); am_private->m_dll = m_dll; - am_private->vcodec.handle = -1; //init to invalid - am_private->vcodec.cntl_handle = -1; - am_private->vcodec.sub_handle = -1; - am_private->vcodec.audio_utils_handle = -1; } @@ -1441,9 +1484,9 @@ am_private->video_pid = hints.pid; // handle video ratio - AVRational video_ratio = av_d2q(1, SHRT_MAX); + AVRational video_ratio = m_dll->av_d2q(1, SHRT_MAX); //if (!hints.forced_aspect) - // video_ratio = av_d2q(hints.aspect, SHRT_MAX); + // video_ratio = m_dll->av_d2q(hints.aspect, SHRT_MAX); am_private->video_ratio = ((int32_t)video_ratio.num << 16) | video_ratio.den; am_private->video_ratio64 = ((int64_t)video_ratio.num << 32) | video_ratio.den; @@ -1518,6 +1561,13 @@ if (am_private->video_codec_type == VIDEO_DEC_FORMAT_UNKNOW) am_private->video_codec_type = codec_tag_to_vdec_type(am_private->video_codec_id); + am_private->flv_flag = 0; + if (am_private->video_codec_id == AV_CODEC_ID_FLV1) + { + am_private->video_codec_tag = CODEC_TAG_F263; + am_private->flv_flag = 1; + } + CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder " "hints.width(%d), hints.height(%d), hints.codec(%d), hints.codec_tag(%d), hints.pid(%d)", hints.width, hints.height, hints.codec, hints.codec_tag, hints.pid); @@ -1630,12 +1680,12 @@ g_renderManager.RegisterRenderUpdateCallBack((const void*)this, RenderUpdateCallBack); g_renderManager.RegisterRenderFeaturesCallBack((const void*)this, RenderFeaturesCallBack); - m_display_rect = CRect(0, 0, CDisplaySettings::GetInstance().GetCurrentResolutionInfo().iWidth, CDisplaySettings::GetInstance().GetCurrentResolutionInfo().iHeight); + m_display_rect = CRect(0, 0, CDisplaySettings::Get().GetCurrentResolutionInfo().iWidth, CDisplaySettings::Get().GetCurrentResolutionInfo().iHeight); std::string strScaler; SysfsUtils::GetString("/sys/class/ppmgr/ppscaler", strScaler); if (strScaler.find("enabled") == std::string::npos) // Scaler not enabled, use screen size - m_display_rect = CRect(0, 0, CDisplaySettings::GetInstance().GetCurrentResolutionInfo().iScreenWidth, CDisplaySettings::GetInstance().GetCurrentResolutionInfo().iScreenHeight); + m_display_rect = CRect(0, 0, CDisplaySettings::Get().GetCurrentResolutionInfo().iScreenWidth, CDisplaySettings::Get().GetCurrentResolutionInfo().iScreenHeight); /* // if display is set to 1080xxx, then disable deinterlacer for HD content @@ -1784,8 +1834,7 @@ // loop until we write all into codec, am_pkt.isvalid // will get set to zero once everything is consumed. // PLAYER_SUCCESS means all is ok, not all bytes were written. - int loop = 0; - while (am_private->am_pkt.isvalid && loop < 100) + while (am_private->am_pkt.isvalid) { // abort on any errors. if (write_av_packet(am_private, &am_private->am_pkt) != PLAYER_SUCCESS) @@ -1793,12 +1842,6 @@ if (am_private->am_pkt.isvalid) CLog::Log(LOGDEBUG, "CAMLCodec::Decode: write_av_packet looping"); - loop++; - } - if (loop == 100) - { - // Decoder got stuck; Reset - Reset(); } // if we seek, then GetTimeSize is wrong as @@ -1980,7 +2023,7 @@ double app_pts = GetPlayerPtsSeconds(); // add in audio delay/display latency contribution - double offset = g_renderManager.GetDisplayLatency() - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay; + double offset = g_renderManager.GetDisplayLatency() - CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay; // correct video pts by user set delay and rendering delay app_pts += offset; @@ -2100,14 +2143,14 @@ { std::string stereo_mode; - switch(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_StereoMode) + switch(CMediaSettings::Get().GetCurrentVideoSettings().m_StereoMode) { case RENDER_STEREO_MODE_SPLIT_VERTICAL: stereo_mode = "left_right"; break; case RENDER_STEREO_MODE_SPLIT_HORIZONTAL: stereo_mode = "top_bottom"; break; default: stereo_mode = m_hints.stereo_mode; break; } - if(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_StereoInvert) + if(CMediaSettings::Get().GetCurrentVideoSettings().m_StereoInvert) stereo_mode = RenderManager::GetStereoModeInvert(stereo_mode); return stereo_mode; } @@ -2127,20 +2170,20 @@ bool update = false; // video zoom adjustment. - float zoom = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount; + float zoom = CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount; if ((int)(zoom * 1000) != (int)(m_zoom * 1000)) { m_zoom = zoom; } // video contrast adjustment. - int contrast = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast; + int contrast = CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast; if (contrast != m_contrast) { SetVideoContrast(contrast); m_contrast = contrast; } // video brightness adjustment. - int brightness = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness; + int brightness = CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness; if (brightness != m_brightness) { SetVideoBrightness(brightness); @@ -2148,7 +2191,7 @@ } // video view mode - int view_mode = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode; + int view_mode = CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode; if (m_view_mode != view_mode) { m_view_mode = view_mode; @@ -2203,7 +2246,7 @@ } CRect gui, display; - gui = CRect(0, 0, CDisplaySettings::GetInstance().GetCurrentResolutionInfo().iWidth, CDisplaySettings::GetInstance().GetCurrentResolutionInfo().iHeight); + gui = CRect(0, 0, CDisplaySettings::Get().GetCurrentResolutionInfo().iWidth, CDisplaySettings::Get().GetCurrentResolutionInfo().iHeight); #ifdef TARGET_ANDROID display = m_display_rect; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DllLibStageFrightCodec.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DllLibStageFrightCodec.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DllLibStageFrightCodec.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DllLibStageFrightCodec.h 2015-10-19 08:39:16.000000000 +0000 @@ -28,23 +28,16 @@ #include "DVDVideoCodec.h" class CApplication; +class CApplicationMessenger; class CWinSystemEGL; class CAdvancedSettings; -namespace KODI -{ - namespace MESSAGING - { - class CApplicationMessenger; - } -} - class DllLibStageFrightCodecInterface { public: virtual ~DllLibStageFrightCodecInterface() {} - virtual void* create_stf(CApplication* application, KODI::MESSAGING::CApplicationMessenger* applicationMessenger, CWinSystemEGL* windowing, CAdvancedSettings* advsettings)=0; + virtual void* create_stf(CApplication* application, CApplicationMessenger* applicationMessenger, CWinSystemEGL* windowing, CAdvancedSettings* advsettings)=0; virtual void destroy_stf(void*)=0; virtual bool stf_Open(void*, CDVDStreamInfo &hints) = 0; @@ -63,7 +56,7 @@ class DllLibStageFrightCodec : public DllDynamic, DllLibStageFrightCodecInterface { DECLARE_DLL_WRAPPER(DllLibStageFrightCodec, DLL_PATH_LIBSTAGEFRIGHTICS) - DEFINE_METHOD4(void*, create_stf, (CApplication* p1, KODI::MESSAGING::CApplicationMessenger* p2, CWinSystemEGL* p3, CAdvancedSettings* p4)) + DEFINE_METHOD4(void*, create_stf, (CApplication* p1, CApplicationMessenger* p2, CWinSystemEGL* p3, CAdvancedSettings* p4)) DEFINE_METHOD1(void, destroy_stf, (void* p1)) DEFINE_METHOD2(bool, stf_Open, (void* p1, CDVDStreamInfo &p2)) DEFINE_METHOD1(void, stf_Dispose, (void* p1)) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DllVideoToolBox.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DllVideoToolBox.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DllVideoToolBox.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DllVideoToolBox.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ -#pragma once - -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see - * . - * - */ - -#include "DynamicDll.h" - -#if defined(__cplusplus) -extern "C" -{ -#endif - -#pragma pack(push, 4) - -//----------------------------------------------------------------------------------- -// /System/Library/PrivateFrameworks/VideoToolbox.framework -enum VTFormat { - kVTFormatJPEG = 'jpeg', // kCMVideoCodecType_JPEG - kVTFormatH264 = 'avc1', // kCMVideoCodecType_H264 (MPEG-4 Part 10)) - kVTFormatMPEG4Video = 'mp4v', // kCMVideoCodecType_MPEG4Video (MPEG-4 Part 2) - kVTFormatMPEG2Video = 'mp2v' // kCMVideoCodecType_MPEG2Video -}; -enum { - kVTDecoderNoErr = 0, - kVTDecoderHardwareNotSupportedErr = -12470, - kVTDecoderFormatNotSupportedErr = -12471, - kVTDecoderConfigurationError = -12472, - kVTDecoderDecoderFailedErr = -12473, -}; -enum { - kVTDecodeInfo_Asynchronous = 1UL << 0, - kVTDecodeInfo_FrameDropped = 1UL << 1 -}; -enum { - // tells the decoder not to bother returning a CVPixelBuffer - // in the outputCallback. The output callback will still be called. - kVTDecoderDecodeFlags_DontEmitFrame = 1 << 1, -}; -enum { - // decode and return buffers for all frames currently in flight. - kVTDecoderFlush_EmitFrames = 1 << 0 -}; - -typedef UInt32 VTFormatId; -typedef CFTypeRef VTDecompressionSessionRef; - -typedef void (*VTDecompressionOutputCallbackFunc)( - void *refCon, - CFDictionaryRef frameInfo, - OSStatus status, - UInt32 infoFlags, - CVBufferRef imageBuffer); - -typedef struct _VTDecompressionOutputCallback VTDecompressionOutputCallback; -struct _VTDecompressionOutputCallback { - VTDecompressionOutputCallbackFunc callback; - void *refcon; -}; - -extern CFStringRef kVTVideoDecoderSpecification_EnableSandboxedVideoDecoder; - -OSStatus VTDecompressionSessionCreate( - CFAllocatorRef allocator, - CMFormatDescriptionRef videoFormatDescription, - CFTypeRef sessionOptions, - CFDictionaryRef destinationPixelBufferAttributes, - VTDecompressionOutputCallback *outputCallback, - VTDecompressionSessionRef *session); - -OSStatus VTDecompressionSessionDecodeFrame( - VTDecompressionSessionRef session, CMSampleBufferRef sbuf, - uint32_t decoderFlags, CFDictionaryRef frameInfo, uint32_t unk1); - -OSStatus VTDecompressionSessionCopyProperty(VTDecompressionSessionRef session, CFTypeRef key, void* unk, CFTypeRef * value); -OSStatus VTDecompressionSessionCopySupportedPropertyDictionary(VTDecompressionSessionRef session, CFDictionaryRef * dict); -OSStatus VTDecompressionSessionSetProperty(VTDecompressionSessionRef session, CFStringRef propName, CFTypeRef propValue); -void VTDecompressionSessionInvalidate(VTDecompressionSessionRef session); -OSStatus VTDecompressionSessionWaitForAsynchronousFrames(VTDecompressionSessionRef session); -#pragma pack(pop) - -#if defined(__cplusplus) -} -#endif - -class DllVideoToolBoxInterface -{ -public: - virtual ~DllVideoToolBoxInterface() {} - - virtual OSStatus VTDecompressionSessionCreate(CFAllocatorRef allocator, CMFormatDescriptionRef videoFormatDescription, CFTypeRef sessionOptions, CFDictionaryRef destinationPixelBufferAttributes, VTDecompressionOutputCallback *outputCallback, VTDecompressionSessionRef *session) = 0; - virtual OSStatus VTDecompressionSessionDecodeFrame(VTDecompressionSessionRef session, CMSampleBufferRef sbuf, uint32_t decoderFlags, CFDictionaryRef frameInfo, uint32_t unk1) = 0; - virtual OSStatus VTDecompressionSessionCopyProperty(VTDecompressionSessionRef session, CFTypeRef key, void* unk, CFTypeRef * value) = 0; - virtual OSStatus VTDecompressionSessionCopySupportedPropertyDictionary(VTDecompressionSessionRef session, CFDictionaryRef * dict) = 0; - virtual OSStatus VTDecompressionSessionSetProperty(VTDecompressionSessionRef session, CFStringRef propName, CFTypeRef propValue) = 0; - virtual void VTDecompressionSessionInvalidate(VTDecompressionSessionRef session) = 0; - virtual OSStatus VTDecompressionSessionWaitForAsynchronousFrames(VTDecompressionSessionRef session) = 0; -}; - -// load from private framework path - needed for ios 5.x -class DllVideoToolBoxPrivate : public DllDynamic, public DllVideoToolBoxInterface -{ - DECLARE_DLL_WRAPPER(DllVideoToolBoxPrivate, "/System/Library/PrivateFrameworks/VideoToolbox.framework/VideoToolbox") - DEFINE_METHOD6(OSStatus, VTDecompressionSessionCreate, (CFAllocatorRef p1, CMFormatDescriptionRef p2, CFTypeRef p3, CFDictionaryRef p4, VTDecompressionOutputCallback *p5, VTDecompressionSessionRef *p6)) - DEFINE_METHOD5(OSStatus, VTDecompressionSessionDecodeFrame, (VTDecompressionSessionRef p1, CMSampleBufferRef p2, uint32_t p3, CFDictionaryRef p4, uint32_t p5)) - DEFINE_METHOD4(OSStatus, VTDecompressionSessionCopyProperty, (VTDecompressionSessionRef p1, CFTypeRef p2, void* p3, CFTypeRef * p4)) - DEFINE_METHOD2(OSStatus, VTDecompressionSessionCopySupportedPropertyDictionary, (VTDecompressionSessionRef p1, CFDictionaryRef * p2)) - DEFINE_METHOD3(OSStatus, VTDecompressionSessionSetProperty, (VTDecompressionSessionRef p1, CFStringRef p2, CFTypeRef p3)) - DEFINE_METHOD1(void, VTDecompressionSessionInvalidate, (VTDecompressionSessionRef p1)) - DEFINE_METHOD1(OSStatus, VTDecompressionSessionWaitForAsynchronousFrames, (VTDecompressionSessionRef p1)) - - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD_RENAME(VTDecompressionSessionCreate, VTDecompressionSessionCreate) - RESOLVE_METHOD_RENAME(VTDecompressionSessionDecodeFrame, VTDecompressionSessionDecodeFrame) - RESOLVE_METHOD_RENAME(VTDecompressionSessionCopyProperty, VTDecompressionSessionCopyProperty) - RESOLVE_METHOD_RENAME(VTDecompressionSessionCopySupportedPropertyDictionary, VTDecompressionSessionCopySupportedPropertyDictionary) - RESOLVE_METHOD_RENAME(VTDecompressionSessionSetProperty, VTDecompressionSessionSetProperty) - RESOLVE_METHOD_RENAME(VTDecompressionSessionInvalidate, VTDecompressionSessionInvalidate) - RESOLVE_METHOD_RENAME(VTDecompressionSessionWaitForAsynchronousFrames, VTDecompressionSessionWaitForAsynchronousFrames) - END_METHOD_RESOLVE() -}; - -// load from public framework path -> available for >= ios 6.0 -class DllVideoToolBoxPublic : public DllDynamic, public DllVideoToolBoxInterface -{ - DECLARE_DLL_WRAPPER(DllVideoToolBoxPublic, "/System/Library/Frameworks/VideoToolbox.framework/VideoToolbox") - DEFINE_METHOD6(OSStatus, VTDecompressionSessionCreate, (CFAllocatorRef p1, CMFormatDescriptionRef p2, CFTypeRef p3, CFDictionaryRef p4, VTDecompressionOutputCallback *p5, VTDecompressionSessionRef *p6)) - DEFINE_METHOD5(OSStatus, VTDecompressionSessionDecodeFrame, (VTDecompressionSessionRef p1, CMSampleBufferRef p2, uint32_t p3, CFDictionaryRef p4, uint32_t p5)) - DEFINE_METHOD4(OSStatus, VTDecompressionSessionCopyProperty, (VTDecompressionSessionRef p1, CFTypeRef p2, void* p3, CFTypeRef * p4)) - DEFINE_METHOD2(OSStatus, VTDecompressionSessionCopySupportedPropertyDictionary, (VTDecompressionSessionRef p1, CFDictionaryRef * p2)) - DEFINE_METHOD3(OSStatus, VTDecompressionSessionSetProperty, (VTDecompressionSessionRef p1, CFStringRef p2, CFTypeRef p3)) - DEFINE_METHOD1(void, VTDecompressionSessionInvalidate, (VTDecompressionSessionRef p1)) - DEFINE_METHOD1(OSStatus, VTDecompressionSessionWaitForAsynchronousFrames, (VTDecompressionSessionRef p1)) - - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD_RENAME(VTDecompressionSessionCreate, VTDecompressionSessionCreate) - RESOLVE_METHOD_RENAME(VTDecompressionSessionDecodeFrame, VTDecompressionSessionDecodeFrame) - RESOLVE_METHOD_RENAME(VTDecompressionSessionCopyProperty, VTDecompressionSessionCopyProperty) - RESOLVE_METHOD_RENAME(VTDecompressionSessionCopySupportedPropertyDictionary, VTDecompressionSessionCopySupportedPropertyDictionary) - RESOLVE_METHOD_RENAME(VTDecompressionSessionSetProperty, VTDecompressionSessionSetProperty) - RESOLVE_METHOD_RENAME(VTDecompressionSessionInvalidate, VTDecompressionSessionInvalidate) - RESOLVE_METHOD_RENAME(VTDecompressionSessionWaitForAsynchronousFrames, VTDecompressionSessionWaitForAsynchronousFrames) - END_METHOD_RESOLVE() -}; - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp 2015-10-19 08:38:33.000000000 +0000 @@ -90,7 +90,7 @@ m_pFormatName = "am-mpeg2"; break; case AV_CODEC_ID_H264: - if ((!aml_support_h264_4k2k()) && ((m_hints.width > 1920) || (m_hints.height > 1088))) + if ((aml_get_device_type() != AML_DEVICE_TYPE_M8 && aml_get_device_type() != AML_DEVICE_TYPE_M8M2) && ((m_hints.width > 1920) || (m_hints.height > 1088))) { // 4K is supported only on Amlogic S802/S812 chip return false; @@ -144,8 +144,8 @@ m_pFormatName = "am-avs"; break; case AV_CODEC_ID_HEVC: - if (aml_support_hevc()) { - if (!aml_support_hevc_4k2k() && ((m_hints.width > 1920) || (m_hints.height > 1088))) + if ((aml_get_device_type() == AML_DEVICE_TYPE_M8B) || (aml_get_device_type() == AML_DEVICE_TYPE_M8M2)) { + if ((aml_get_device_type() == AML_DEVICE_TYPE_M8B) && ((m_hints.width > 1920) || (m_hints.height > 1088))) { // 4K HEVC is supported only on Amlogic S812 chip return false; @@ -195,11 +195,11 @@ m_videobuffer.iDisplayHeight = m_videobuffer.iHeight; if (m_hints.aspect > 0.0 && !m_hints.forced_aspect) { - m_videobuffer.iDisplayWidth = ((int)lrint(m_videobuffer.iHeight * m_hints.aspect)) & ~3; + m_videobuffer.iDisplayWidth = ((int)lrint(m_videobuffer.iHeight * m_hints.aspect)) & -3; if (m_videobuffer.iDisplayWidth > m_videobuffer.iWidth) { m_videobuffer.iDisplayWidth = m_videobuffer.iWidth; - m_videobuffer.iDisplayHeight = ((int)lrint(m_videobuffer.iWidth / m_hints.aspect)) & ~3; + m_videobuffer.iDisplayHeight = ((int)lrint(m_videobuffer.iWidth / m_hints.aspect)) & -3; } } @@ -283,11 +283,11 @@ pDvdVideoPicture->iDisplayHeight = pDvdVideoPicture->iHeight; if (m_aspect_ratio > 1.0 && !m_hints.forced_aspect) { - pDvdVideoPicture->iDisplayWidth = ((int)lrint(pDvdVideoPicture->iHeight * m_aspect_ratio)) & ~3; + pDvdVideoPicture->iDisplayWidth = ((int)lrint(pDvdVideoPicture->iHeight * m_aspect_ratio)) & -3; if (pDvdVideoPicture->iDisplayWidth > pDvdVideoPicture->iWidth) { pDvdVideoPicture->iDisplayWidth = pDvdVideoPicture->iWidth; - pDvdVideoPicture->iDisplayHeight = ((int)lrint(pDvdVideoPicture->iWidth / m_aspect_ratio)) & ~3; + pDvdVideoPicture->iDisplayHeight = ((int)lrint(pDvdVideoPicture->iWidth / m_aspect_ratio)) & -3; } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,16 +29,13 @@ #include "DVDVideoCodecAndroidMediaCodec.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "DVDClock.h" #include "threads/Atomics.h" #include "utils/BitstreamConverter.h" #include "utils/CPUInfo.h" #include "utils/log.h" #include "settings/AdvancedSettings.h" -#include "android/activity/XBMCApp.h" -#include "cores/VideoRenderers/RenderManager.h" -#include "cores/VideoRenderers/RenderFlags.h" #include "android/jni/ByteBuffer.h" #include "android/jni/MediaCodec.h" @@ -55,8 +52,6 @@ #include -using namespace KODI::MESSAGING; - static bool CanSurfaceRenderBlackList(const std::string &name) { // All devices 'should' be capiable of surface rendering @@ -175,7 +170,10 @@ { // paranoid checks assert(m_index >= 0); + assert(m_texture > 0); assert(m_codec != NULL); + assert(m_surfacetexture != NULL); + assert(m_frameready != NULL); } CDVDMediaCodecInfo::~CDVDMediaCodecInfo() @@ -220,8 +218,7 @@ // then wait for rendered frame to become avaliable. if (render) - if (m_frameready) - m_frameready->Reset(); + m_frameready->Reset(); m_codec->releaseOutputBuffer(m_index, render); m_isReleased = true; @@ -296,38 +293,15 @@ } } -void CDVDMediaCodecInfo::RenderUpdate(const CRect &SrcRect, const CRect &DestRect) -{ - CSingleLock lock(m_section); - - static CRect cur_rect; - - if (!m_valid) - return; - - if (DestRect != cur_rect) - { - CXBMCApp::get()->setVideoViewSurfaceRect(DestRect.x1, DestRect.y1, DestRect.x2, DestRect.y2); - cur_rect = DestRect; - - // setVideoViewSurfaceRect is async, so skip rendering this frame - ReleaseOutputBuffer(false); - } - else - ReleaseOutputBuffer(true); -} - - /*****************************************************************************/ /*****************************************************************************/ -CDVDVideoCodecAndroidMediaCodec::CDVDVideoCodecAndroidMediaCodec(bool surface_render) +CDVDVideoCodecAndroidMediaCodec::CDVDVideoCodecAndroidMediaCodec() : m_formatname("mediacodec") , m_opened(false) , m_surface(NULL) , m_textureId(0) , m_bitstream(NULL) , m_render_sw(false) -, m_render_surface(surface_render) { memset(&m_videobuffer, 0x00, sizeof(DVDVideoPicture)); memset(&m_demux_pkt, 0, sizeof(m_demux_pkt)); @@ -347,12 +321,6 @@ return false; } - if (hints.orientation && m_render_surface && CJNIMediaFormat::GetSDKVersion() < 23) - { - CLog::Log(LOGERROR, "CDVDVideoCodecAndroidMediaCodec::Open - %s\n", "Surface does not support orientation before API 23"); - return false; - } - m_drop = false; m_hints = hints; @@ -379,10 +347,6 @@ m_mime = "video/x-vnd.on2.vp8"; m_formatname = "amc-vpX"; break; - case AV_CODEC_ID_VP9: - m_mime = "video/x-vnd.on2.vp9"; - m_formatname = "amc-vp9"; - break; case AV_CODEC_ID_AVS: case AV_CODEC_ID_CAVS: case AV_CODEC_ID_H264: @@ -418,78 +382,18 @@ } } break; - case AV_CODEC_ID_WMV3: - if (m_hints.extrasize == 4 || m_hints.extrasize == 5) - { - // Convert to SMPTE 421M-2006 Annex-L - static char annexL_hdr1[] = {0x8e, 0x01, 0x00, 0xc5, 0x04, 0x00, 0x00, 0x00}; - static char annexL_hdr2[] = {0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - free(m_hints.extradata); - m_hints.extrasize = 36; - m_hints.extradata = malloc(m_hints.extrasize); - - unsigned int offset = 0; - char buf[4]; - memcpy(m_hints.extradata, annexL_hdr1, sizeof(annexL_hdr1)); - offset += sizeof(annexL_hdr1); - memcpy(&((char *)(m_hints.extradata))[offset], hints.extradata, 4); - offset += 4; - BS_WL32(buf, hints.height); - memcpy(&((char *)(m_hints.extradata))[offset], buf, 4); - offset += 4; - BS_WL32(buf, hints.width); - memcpy(&((char *)(m_hints.extradata))[offset], buf, 4); - offset += 4; - memcpy(&((char *)(m_hints.extradata))[offset], annexL_hdr2, sizeof(annexL_hdr2)); - } - - m_mime = "video/x-ms-wmv"; - m_formatname = "amc-wmv"; - break; case AV_CODEC_ID_VC1: - { - if (m_hints.extrasize < 16) - return false; - - // Reduce extradata to first SEQ header - unsigned int seq_offset = 0; - for (; seq_offset <= m_hints.extrasize-4; ++seq_offset) - { - char *ptr = &((char*)m_hints.extradata)[seq_offset]; - if (ptr[0] == 0x00 && ptr[1] == 0x00 && ptr[2] == 0x01 && ptr[3] == 0x0f) - break; - } - if (seq_offset > m_hints.extrasize-4) - return false; - - if (seq_offset) - { - free(m_hints.extradata); - m_hints.extrasize -= seq_offset; - m_hints.extradata = malloc(m_hints.extrasize); - memcpy(m_hints.extradata, &((char *)(hints.extradata))[seq_offset], m_hints.extrasize); - } - + case AV_CODEC_ID_WMV3: m_mime = "video/wvc1"; + //m_mime = "video/wmv9"; m_formatname = "amc-vc1"; break; - } default: CLog::Log(LOGDEBUG, "CDVDVideoCodecAndroidMediaCodec:: Unknown hints.codec(%d)", hints.codec); return false; break; } - if (m_render_surface) - { - m_videosurface = CXBMCApp::get()->getVideoViewSurface(); - if (!m_videosurface) - return false; - } - - if (m_render_surface) - m_formatname += "(S)"; - // CJNIMediaCodec::createDecoderByXXX doesn't handle errors nicely, // it crashes if the codec isn't found. This is fixed in latest AOSP, // but not in current 4.1 devices. So 1st search for a matching codec, then create it. @@ -562,7 +466,6 @@ SAFE_DELETE(m_bitstream); return false; } - m_render_surface = false; } // setup a YUV420P DVDVideoPicture buffer. @@ -603,8 +506,6 @@ m_opened = false; - g_renderManager.RegisterRenderUpdateCallBack((const void*)NULL, NULL); - // release any retained demux packets if (m_demux_pkt.pData) free(m_demux_pkt.pData); @@ -636,8 +537,6 @@ xbmc_jnienv()->ExceptionClear(); } ReleaseSurfaceTexture(); - if (m_render_surface) - CXBMCApp::get()->clearVideoView(); SAFE_DELETE(m_bitstream); } @@ -715,34 +614,9 @@ iSize = size; } // fetch a pointer to the ByteBuffer backing store - uint8_t *dst_ptr = (uint8_t*)xbmc_jnienv()->GetDirectBufferAddress(m_input[index].get_raw()); + void *dst_ptr = xbmc_jnienv()->GetDirectBufferAddress(m_input[index].get_raw()); if (dst_ptr) - { - // Codec specifics - switch(m_hints.codec) - { - case AV_CODEC_ID_VC1: - { - if (iSize >= 4 && pData[0] == 0x00 && pData[1] == 0x00 && pData[2] == 0x01 && (pData[3] == 0x0d || pData[3] == 0x0f)) - memcpy(dst_ptr, pData, iSize); - else - { - dst_ptr[0] = 0x00; - dst_ptr[1] = 0x00; - dst_ptr[2] = 0x01; - dst_ptr[3] = 0x0d; - memcpy(dst_ptr+4, pData, iSize); - iSize += 4; - } - - break; - } - - default: - memcpy(dst_ptr, pData, iSize); - break; - } - } + memcpy(dst_ptr, pData, iSize); // Translate from dvdplayer dts/pts to MediaCodec pts, // pts WILL get re-ordered by MediaCodec if needed. @@ -846,7 +720,7 @@ bool CDVDVideoCodecAndroidMediaCodec::ClearPicture(DVDVideoPicture* pDvdVideoPicture) { - if (pDvdVideoPicture->format == RENDER_FMT_MEDIACODEC || pDvdVideoPicture->format == RENDER_FMT_MEDIACODECSURFACE) + if (pDvdVideoPicture->format == RENDER_FMT_MEDIACODEC) SAFE_RELEASE(pDvdVideoPicture->mediacodec); memset(pDvdVideoPicture, 0x00, sizeof(DVDVideoPicture)); @@ -888,10 +762,7 @@ return; for (size_t i = 0; i < m_inflight.size(); i++) - { m_inflight[i]->Validate(false); - m_inflight[i]->Release(); - } m_inflight.clear(); for (size_t i = 0; i < m_output.size(); i++) @@ -910,11 +781,6 @@ m_mime.c_str(), m_hints.width, m_hints.height); // some android devices forget to default the demux input max size mediaformat.setInteger(CJNIMediaFormat::KEY_MAX_INPUT_SIZE, 0); - if (CJNIMediaFormat::GetSDKVersion() >= 23 && m_render_surface) - { - // Handle rotation - mediaformat.setInteger(CJNIMediaFormat::KEY_ROTATION, m_hints.orientation); - } // handle codec extradata if (m_hints.extrasize) @@ -954,16 +820,12 @@ } else { - if (m_render_surface) - m_codec->configure(mediaformat, m_videosurface, crypto, flags); - else - m_codec->configure(mediaformat, *m_surface, crypto, flags); + m_codec->configure(mediaformat, *m_surface, crypto, flags); } // always, check/clear jni exceptions. if (xbmc_jnienv()->ExceptionCheck()) { CLog::Log(LOGERROR, "CDVDVideoCodecAndroidMediaCodec::ExceptionCheck: configure"); - xbmc_jnienv()->ExceptionDescribe(); xbmc_jnienv()->ExceptionClear(); return false; } @@ -974,7 +836,6 @@ if (xbmc_jnienv()->ExceptionCheck()) { CLog::Log(LOGERROR, "CDVDVideoCodecAndroidMediaCodec::ExceptionCheck: start"); - xbmc_jnienv()->ExceptionDescribe(); xbmc_jnienv()->ExceptionClear(); return false; } @@ -990,7 +851,7 @@ { int rtn = 0; - int64_t timeout_us = 10000; + int64_t timeout_us = 1000; CJNIMediaCodecBufferInfo bufferInfo; int index = m_codec->dequeueOutputBuffer(bufferInfo, timeout_us); if (xbmc_jnienv()->ExceptionCheck()) @@ -1195,16 +1056,8 @@ if (!m_render_sw) { - if (m_render_surface) - { - CLog::Log(LOGDEBUG, "CDVDVideoCodecAndroidMediaCodec:: Multi-Surface Rendering"); - m_videobuffer.format = RENDER_FMT_MEDIACODECSURFACE; - } - else - { - CLog::Log(LOGDEBUG, "CDVDVideoCodecAndroidMediaCodec:: Direct Surface Rendering"); - m_videobuffer.format = RENDER_FMT_MEDIACODEC; - } + CLog::Log(LOGDEBUG, "CDVDVideoCodecAndroidMediaCodec:: Direct Surface Rendering"); + m_videobuffer.format = RENDER_FMT_MEDIACODEC; } else { @@ -1350,11 +1203,11 @@ m_videobuffer.iDisplayHeight = crop_bottom + 1 - crop_top; if (m_hints.aspect > 1.0 && !m_hints.forced_aspect) { - m_videobuffer.iDisplayWidth = ((int)lrint(m_videobuffer.iHeight * m_hints.aspect)) & ~3; + m_videobuffer.iDisplayWidth = ((int)lrint(m_videobuffer.iHeight * m_hints.aspect)) & -3; if (m_videobuffer.iDisplayWidth > m_videobuffer.iWidth) { m_videobuffer.iDisplayWidth = m_videobuffer.iWidth; - m_videobuffer.iDisplayHeight = ((int)lrint(m_videobuffer.iWidth / m_hints.aspect)) & ~3; + m_videobuffer.iDisplayHeight = ((int)lrint(m_videobuffer.iWidth / m_hints.aspect)) & -3; } } @@ -1371,7 +1224,7 @@ void CDVDVideoCodecAndroidMediaCodec::InitSurfaceTexture(void) { - if (m_render_sw || m_render_surface) + if (m_render_sw) return; // We MUST create the GLES texture on the main thread @@ -1405,8 +1258,12 @@ callbackData.callback = &CallbackInitSurfaceTexture; callbackData.userptr = (void*)this; + ThreadMessage msg; + msg.dwMessage = TMSG_CALLBACK; + msg.lpVoid = (void*)&callbackData; + // wait for it. - CApplicationMessenger::GetInstance().SendMsg(TMSG_CALLBACK, -1, -1, static_cast(&callbackData)); + CApplicationMessenger::Get().SendMessage(msg, true); } return; @@ -1414,7 +1271,7 @@ void CDVDVideoCodecAndroidMediaCodec::ReleaseSurfaceTexture(void) { - if (m_render_sw || m_render_surface) + if (m_render_sw) return; // it is safe to delete here even though these items diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.h 2015-10-19 08:38:33.000000000 +0000 @@ -28,8 +28,6 @@ #include "DVDStreamInfo.h" #include "threads/Thread.h" #include "threads/SingleLock.h" -#include "android/jni/Surface.h" -#include "guilib/Geometry.h" class CJNISurface; class CJNISurfaceTexture; @@ -68,7 +66,6 @@ int GetTextureID() const; void GetTransformMatrix(float *textureMatrix); void UpdateTexImage(); - void RenderUpdate(const CRect &SrcRect, const CRect &DestRect); private: // private because we are reference counted @@ -91,7 +88,7 @@ class CDVDVideoCodecAndroidMediaCodec : public CDVDVideoCodec { public: - CDVDVideoCodecAndroidMediaCodec(bool surface_render = false); + CDVDVideoCodecAndroidMediaCodec(); virtual ~CDVDVideoCodecAndroidMediaCodec(); // required overrides @@ -104,7 +101,7 @@ virtual void SetDropState(bool bDrop); virtual int GetDataSize(void); virtual double GetTimeSize(void); - virtual const char* GetName(void) { return m_formatname.c_str(); } + virtual const char* GetName(void) { return m_formatname; } virtual unsigned GetAllowedReferences(); protected: @@ -122,13 +119,12 @@ std::string m_mime; std::string m_codecname; int m_colorFormat; - std::string m_formatname; + const char *m_formatname; bool m_opened; bool m_drop; CJNISurface *m_surface; unsigned int m_textureId; - CJNISurface m_videosurface; // we need these as shared_ptr because CDVDVideoCodecAndroidMediaCodec // will get deleted before CLinuxRendererGLES is shut down and // CLinuxRendererGLES refs them via CDVDMediaCodecInfo. @@ -145,7 +141,6 @@ DVDVideoPicture m_videobuffer; bool m_render_sw; - bool m_render_surface; int m_src_offset[4]; int m_src_stride[4]; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,7 @@ #include "settings/Settings.h" #include "settings/lib/Setting.h" -bool CDVDVideoCodec::IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool CDVDVideoCodec::IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting) { if (setting == NULL || value.empty()) return false; @@ -39,18 +39,18 @@ // nvidia does only need mpeg-4 setting if (isNvidia) { - if (settingId == CSettings::SETTING_VIDEOPLAYER_USEVDPAUMPEG4) + if (settingId == "videoplayer.usevdpaumpeg4") return true; return false; //will also hide intel settings on nvidia hardware } else if (isIntel) // intel needs vc1, mpeg-2 and mpeg4 setting { - if (settingId == CSettings::SETTING_VIDEOPLAYER_USEVAAPIMPEG4) + if (settingId == "videoplayer.usevaapimpeg4") return true; - if (settingId == CSettings::SETTING_VIDEOPLAYER_USEVAAPIVC1) + if (settingId == "videoplayer.usevaapivc1") return true; - if (settingId == CSettings::SETTING_VIDEOPLAYER_USEVAAPIMPEG2) + if (settingId == "videoplayer.usevaapimpeg2") return true; return false; //this will also hide nvidia settings on intel hardware @@ -60,15 +60,19 @@ return true; } -bool CDVDVideoCodec::IsCodecDisabled(const std::map &map, AVCodecID id) +bool CDVDVideoCodec::IsCodecDisabled(DVDCodecAvailableType* map, unsigned int size, AVCodecID id) { - auto codec = map.find(id); - if (codec != map.end()) + int index = -1; + for (unsigned int i = 0; i < size; ++i) { - return (!CSettings::GetInstance().GetBool(codec->second) || - !CDVDVideoCodec::IsSettingVisible("unused", "unused", - CSettings::GetInstance().GetSetting(codec->second), - NULL)); + if(map[i].codec == id) + { + index = (int) i; + break; + } } + if(index > -1) + return (!CSettings::Get().GetBool(map[index].setting) || !CDVDVideoCodec::IsSettingVisible("unused", "unused", CSettings::Get().GetSetting(map[index].setting))); + return false; //don't disable what we don't have } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -68,6 +68,8 @@ #include "libavfilter/buffersrc.h" } +using namespace std; + enum DecoderState { STATE_NONE, @@ -108,7 +110,7 @@ while(*cur != PIX_FMT_NONE) { #ifdef HAVE_LIBVDPAU - if(VDPAU::CDecoder::IsVDPAUFormat(*cur) && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVDPAU)) + if(VDPAU::CDecoder::IsVDPAUFormat(*cur) && CSettings::Get().GetBool("videoplayer.usevdpau")) { CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::GetFormat - Creating VDPAU(%ix%i)", avctx->width, avctx->height); VDPAU::CDecoder* vdp = new VDPAU::CDecoder(); @@ -122,7 +124,7 @@ } #endif #ifdef HAS_DX - if(DXVA::CDecoder::Supports(*cur) && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEDXVA2)) + if(DXVA::CDecoder::Supports(*cur) && CSettings::Get().GetBool("videoplayer.usedxva2")) { CLog::Log(LOGNOTICE, "CDVDVideoCodecFFmpeg::GetFormat - Creating DXVA(%ix%i)", avctx->width, avctx->height); DXVA::CDecoder* dec = new DXVA::CDecoder(); @@ -137,7 +139,7 @@ #endif #ifdef HAVE_LIBVA // mpeg4 vaapi decoding is disabled - if(*cur == PIX_FMT_VAAPI_VLD && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVAAPI)) + if(*cur == PIX_FMT_VAAPI_VLD && CSettings::Get().GetBool("videoplayer.usevaapi")) { VAAPI::CDecoder* dec = new VAAPI::CDecoder(); if(dec->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount) == true) @@ -151,7 +153,7 @@ #endif #ifdef TARGET_DARWIN_OSX - if (*cur == AV_PIX_FMT_VDA && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVDA) && g_advancedSettings.m_useFfmpegVda) + if (*cur == AV_PIX_FMT_VDA && CSettings::Get().GetBool("videoplayer.usevda") && g_advancedSettings.m_useFfmpegVda) { VDA::CDecoder* dec = new VDA::CDecoder(); if(dec->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount)) @@ -243,19 +245,19 @@ { bool tryhw = false; #ifdef HAVE_LIBVDPAU - if(CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVDPAU)) + if(CSettings::Get().GetBool("videoplayer.usevdpau")) tryhw = true; #endif #ifdef HAVE_LIBVA - if(CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVAAPI)) + if(CSettings::Get().GetBool("videoplayer.usevaapi")) tryhw = true; #endif #ifdef HAS_DX - if(CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEDXVA2)) + if(CSettings::Get().GetBool("videoplayer.usedxva2")) tryhw = true; #endif #ifdef TARGET_DARWIN_OSX - if(CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVDA)) + if(CSettings::Get().GetBool("videoplayer.usevda")) tryhw = true; #endif if (tryhw && m_decoderState == STATE_NONE) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,6 @@ #include #include -#include #include "cores/VideoRenderers/RenderFormats.h" @@ -35,6 +34,12 @@ class CSetting; +struct DVDCodecAvailableType +{ + AVCodecID codec; + const char* setting; +}; + // when modifying these structures, make sure you update all codecs accordingly #define FRAME_TYPE_UNDEF 0 #define FRAME_TYPE_I 1 @@ -280,12 +285,12 @@ * Hide or Show Settings depending on the currently running hardware * */ - static bool IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting, void *data); + static bool IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting); /** * Interact with user settings so that user disabled codecs are disabled */ - static bool IsCodecDisabled(const std::map &map, AVCodecID id); + static bool IsCodecDisabled(DVDCodecAvailableType* map, unsigned int size, AVCodecID id); /* For calculation of dropping requirements player asks for some information. * diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecOpenMax.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecOpenMax.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecOpenMax.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecOpenMax.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -52,7 +52,7 @@ bool CDVDVideoCodecOpenMax::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { // we always qualify even if DVDFactoryCodec does this too. - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEOMX) && !hints.software) + if (CSettings::Get().GetBool("videoplayer.useomx") && !hints.software) { m_convert_bitstream = false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecStageFright.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecStageFright.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecStageFright.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecStageFright.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,15 +33,13 @@ #include "DVDVideoCodecStageFright.h" #include "utils/log.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "windowing/WindowingFactory.h" #include "settings/AdvancedSettings.h" #include "DllLibStageFrightCodec.h" #define CLASSNAME "CDVDVideoCodecStageFright" - -using namespace KODI::MESSAGING; //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// @@ -66,7 +64,7 @@ bool CDVDVideoCodecStageFright::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { // we always qualify even if DVDFactoryCodec does this too. - if (CSettings::GetInstance().GetBool("videoplayer.usestagefright") && !hints.software) + if (CSettings::Get().GetBool("videoplayer.usestagefright") && !hints.software) { m_convert_bitstream = false; CLog::Log(LOGDEBUG, @@ -118,15 +116,10 @@ case CODEC_ID_VP8: m_pFormatName = "stf-vpx"; break; - case AV_CODEC_ID_VP9: - m_pFormatName = "stf-vp9"; - break; - case AV_CODEC_ID_WMV3: + case CODEC_ID_WMV3: + case CODEC_ID_VC1: m_pFormatName = "stf-wmv"; break; - case AV_CODEC_ID_VC1: - m_pFormatName = "stf-vc1"; - break; default: return false; break; @@ -136,7 +129,7 @@ return false; m_stf_dll->EnableDelayedUnload(false); - m_stf_handle = m_stf_dll->create_stf(&g_application, &CApplicationMessenger::GetInstance(), &g_Windowing, &g_advancedSettings); + m_stf_handle = m_stf_dll->create_stf(&g_application, &CApplicationMessenger::Get(), &g_Windowing, &g_advancedSettings); if (!m_stf_dll->stf_Open(m_stf_handle, hints)) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,6 @@ #include "cores/dvdplayer/DVDCodecs/DVDCodecUtils.h" #include "cores/FFmpeg.h" #include "osx/CocoaInterface.h" -#include "osx/DarwinUtils.h" #include "windowing/WindowingFactory.h" #include "utils/BitstreamConverter.h" #include "utils/log.h" @@ -158,7 +157,7 @@ bool CDVDVideoCodecVDA::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVDA) && !hints.software) + if (CSettings::Get().GetBool("videoplayer.usevda") && !hints.software) { CCocoaAutoPool pool; @@ -356,8 +355,6 @@ } CFRelease(decoderConfiguration); CFRelease(destinationImageBufferAttributes); - if (CDarwinUtils::DeviceHasLeakyVDA()) - CFRelease(pixelFormat); if (status != kVDADecoderNoErr) { if (status == kVDADecoderDecoderFailedErr) @@ -391,11 +388,6 @@ free(m_videobuffer.data[2]), m_videobuffer.data[2] = NULL; m_videobuffer.iFlags = 0; } - else - { - while (m_queue_depth) - DisplayQueuePop(); - } if (m_bitstream) delete m_bitstream, m_bitstream = NULL; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -38,14 +38,80 @@ #include "libavformat/avformat.h" } -#include "DllVideoToolBox.h" - #if defined(__cplusplus) extern "C" { #endif #pragma pack(push, 4) + +//----------------------------------------------------------------------------------- +// /System/Library/PrivateFrameworks/VideoToolbox.framework +enum VTFormat { + kVTFormatJPEG = 'jpeg', // kCMVideoCodecType_JPEG + kVTFormatH264 = 'avc1', // kCMVideoCodecType_H264 (MPEG-4 Part 10)) + kVTFormatMPEG4Video = 'mp4v', // kCMVideoCodecType_MPEG4Video (MPEG-4 Part 2) + kVTFormatMPEG2Video = 'mp2v' // kCMVideoCodecType_MPEG2Video +}; +enum { + kVTDecoderNoErr = 0, + kVTDecoderHardwareNotSupportedErr = -12470, + kVTDecoderFormatNotSupportedErr = -12471, + kVTDecoderConfigurationError = -12472, + kVTDecoderDecoderFailedErr = -12473, +}; +enum { + kVTDecodeInfo_Asynchronous = 1UL << 0, + kVTDecodeInfo_FrameDropped = 1UL << 1 +}; +enum { + // tells the decoder not to bother returning a CVPixelBuffer + // in the outputCallback. The output callback will still be called. + kVTDecoderDecodeFlags_DontEmitFrame = 1 << 1, +}; +enum { + // decode and return buffers for all frames currently in flight. + kVTDecoderFlush_EmitFrames = 1 << 0 +}; + +typedef UInt32 VTFormatId; +typedef CFTypeRef VTDecompressionSessionRef; + +typedef void (*VTDecompressionOutputCallbackFunc)( + void *refCon, + CFDictionaryRef frameInfo, + OSStatus status, + UInt32 infoFlags, + CVBufferRef imageBuffer); + +typedef struct _VTDecompressionOutputCallback VTDecompressionOutputCallback; +struct _VTDecompressionOutputCallback { + VTDecompressionOutputCallbackFunc callback; + void *refcon; +}; + +extern CFStringRef kVTVideoDecoderSpecification_EnableSandboxedVideoDecoder; + +extern OSStatus VTDecompressionSessionCreate( + CFAllocatorRef allocator, + CMFormatDescriptionRef videoFormatDescription, + CFTypeRef sessionOptions, + CFDictionaryRef destinationPixelBufferAttributes, + VTDecompressionOutputCallback *outputCallback, + VTDecompressionSessionRef *session); + +extern OSStatus VTDecompressionSessionDecodeFrame( + VTDecompressionSessionRef session, CMSampleBufferRef sbuf, + uint32_t decoderFlags, CFDictionaryRef frameInfo, uint32_t unk1); + +extern OSStatus VTDecompressionSessionCopyProperty(VTDecompressionSessionRef session, CFTypeRef key, void* unk, CFTypeRef * value); +extern OSStatus VTDecompressionSessionCopySupportedPropertyDictionary(VTDecompressionSessionRef session, CFDictionaryRef * dict); +extern OSStatus VTDecompressionSessionSetProperty(VTDecompressionSessionRef session, CFStringRef propName, CFTypeRef propValue); +extern void VTDecompressionSessionInvalidate(VTDecompressionSessionRef session); +extern void VTDecompressionSessionRelease(VTDecompressionSessionRef session); +extern VTDecompressionSessionRef VTDecompressionSessionRetain(VTDecompressionSessionRef session); +extern OSStatus VTDecompressionSessionWaitForAsynchronousFrames(VTDecompressionSessionRef session); + //----------------------------------------------------------------------------------- // /System/Library/Frameworks/CoreMedia.framework union @@ -136,7 +202,7 @@ free(attrs_str); } - status = CDVDVideoCodecVideoToolBox::GetDllImpl()->VTDecompressionSessionCopyProperty(dpc->session, prop_name, NULL, &prop_value); + status = VTDecompressionSessionCopyProperty(dpc->session, prop_name, NULL, &prop_value); if (status == kVTDecoderNoErr) { char *value_str; @@ -164,7 +230,7 @@ CFDictionaryRef dict; OSStatus status; - status = CDVDVideoCodecVideoToolBox::GetDllImpl()->VTDecompressionSessionCopySupportedPropertyDictionary(session, &dict); + status = VTDecompressionSessionCopySupportedPropertyDictionary(session, &dict); if (status != kVTDecoderNoErr) goto error; CFDictionaryApplyFunction(dict, (CFDictionaryApplierFunction)vtdec_session_dump_property, &dpc); @@ -971,8 +1037,6 @@ //----------------------------------------------------------------------------------- //----------------------------------------------------------------------------------- -DllVideoToolBoxInterface *CDVDVideoCodecVideoToolBox::m_pLibVTB = NULL; - CDVDVideoCodecVideoToolBox::CDVDVideoCodecVideoToolBox() : CDVDVideoCodec() { m_fmt_desc = NULL; @@ -989,63 +1053,17 @@ memset(&m_videobuffer, 0, sizeof(DVDVideoPicture)); m_DropPictures = false; m_sort_time_offset = 0.0; - - if (m_pLibVTB == NULL) - { - if (CDarwinUtils::GetIOSVersion() < 6.0) - { - m_pLibVTB = new DllVideoToolBoxPrivate(); - } - else - { - m_pLibVTB = new DllVideoToolBoxPublic();// todo - load the public version - } - } } CDVDVideoCodecVideoToolBox::~CDVDVideoCodecVideoToolBox() { Dispose(); pthread_mutex_destroy(&m_queue_mutex); - if (m_pLibVTB != NULL) - { - delete m_pLibVTB; - m_pLibVTB = NULL; // its a static! - } -} - -bool CDVDVideoCodecVideoToolBox::HandleDyLoad() -{ - bool ret = true; - if (CDarwinUtils::GetIOSVersion() < 6.0) - { - if(!((DllVideoToolBoxPrivate *)m_pLibVTB)->IsLoaded()) - { - if(!((DllVideoToolBoxPrivate *)m_pLibVTB)->Load()) - { - CLog::Log(LOGERROR,"VideoToolBox: Error loading private VideoToolBox framework (%s).",__FUNCTION__); - ret = false; //fatal - } - } - } - else - { - if(!((DllVideoToolBoxPublic *)m_pLibVTB)->IsLoaded()) - { - if(!((DllVideoToolBoxPublic *)m_pLibVTB)->Load()) - { - CLog::Log(LOGERROR,"VideoToolBox: Error loading public VideoToolBox framework (%s).",__FUNCTION__); - ret = false; //fatal - } - } - } - return ret; } - bool CDVDVideoCodecVideoToolBox::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVIDEOTOOLBOX) && !hints.software) + if (CSettings::Get().GetBool("videoplayer.usevideotoolbox") && !hints.software) { int width = hints.width; int height = hints.height; @@ -1056,9 +1074,6 @@ unsigned int extrasize = hints.extrasize; // extra data for codec to use uint8_t *extradata = (uint8_t*)hints.extradata; // size of extra data - if (!HandleDyLoad()) - return false; - switch(profile) { case FF_PROFILE_H264_HIGH_10: @@ -1313,7 +1328,7 @@ OSStatus status; double sort_time; uint32_t decoderFlags = 0; - CFDictionaryRef frameInfo = NULL; + CFDictionaryRef frameInfo = NULL;; CMSampleBufferRef sampleBuff = NULL; AVIOContext *pb = NULL; int demux_size = 0; @@ -1372,7 +1387,7 @@ } // submit for decoding - status = GetDllImpl()->VTDecompressionSessionDecodeFrame(m_vt_session, sampleBuff, decoderFlags, frameInfo, 0); + status = VTDecompressionSessionDecodeFrame(m_vt_session, sampleBuff, decoderFlags, frameInfo, 0); if (status != kVTDecoderNoErr) { CLog::Log(LOGNOTICE, "%s - VTDecompressionSessionDecodeFrame returned(%d)", @@ -1389,7 +1404,7 @@ } // wait for decoding to finish - status = GetDllImpl()->VTDecompressionSessionWaitForAsynchronousFrames(m_vt_session); + status = VTDecompressionSessionWaitForAsynchronousFrames(m_vt_session); if (status != kVTDecoderNoErr) { CLog::Log(LOGNOTICE, "%s - VTDecompressionSessionWaitForAsynchronousFrames returned(%d)", @@ -1418,7 +1433,7 @@ void CDVDVideoCodecVideoToolBox::Reset(void) { // flush decoder - GetDllImpl()->VTDecompressionSessionWaitForAsynchronousFrames(m_vt_session); + VTDecompressionSessionWaitForAsynchronousFrames(m_vt_session); while (m_queue_depth) DisplayQueuePop(); @@ -1554,7 +1569,7 @@ outputCallback.callback = VTDecoderCallback; outputCallback.refcon = this; - status = GetDllImpl()->VTDecompressionSessionCreate( + status = VTDecompressionSessionCreate( NULL, // CFAllocatorRef allocator fmt_desc, NULL, // CFTypeRef sessionOptions @@ -1580,7 +1595,7 @@ { if (m_vt_session) { - GetDllImpl()->VTDecompressionSessionInvalidate((VTDecompressionSessionRef)m_vt_session); + VTDecompressionSessionInvalidate((VTDecompressionSessionRef)m_vt_session); CFRelease((VTDecompressionSessionRef)m_vt_session); m_vt_session = NULL; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.h 2015-10-19 08:38:33.000000000 +0000 @@ -27,8 +27,6 @@ #include #include -class DllVideoToolBoxInterface; - // tracks a frame in and output queue in display order typedef struct frame_queue { double dts; @@ -47,8 +45,6 @@ CDVDVideoCodecVideoToolBox(); virtual ~CDVDVideoCodecVideoToolBox(); - static DllVideoToolBoxInterface *GetDllImpl() { return m_pLibVTB; } - // Required overrides virtual bool Open(CDVDStreamInfo &hints, CDVDCodecOptions &options); virtual void Dispose(void); @@ -60,7 +56,6 @@ virtual const char* GetName(void) { return (const char*)m_pFormatName; } protected: - bool HandleDyLoad(); void DisplayQueuePop(void); void CreateVTSession(int width, int height, CMFormatDescriptionRef fmt_desc); void DestroyVTSession(void); @@ -83,7 +78,6 @@ bool m_convert_bytestream; bool m_convert_3byteTo4byteNALSize; - static DllVideoToolBoxInterface *m_pLibVTB;//the framework }; #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoPPFFmpeg.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoPPFFmpeg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoPPFFmpeg.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoPPFFmpeg.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -143,7 +143,7 @@ if (m_deinterlace) m_pTarget->iFlags &= ~DVP_FLAG_INTERLACED; m_pTarget->iFrameType = m_pSource->iFrameType; - m_pTarget->iRepeatPicture = m_pSource->iRepeatPicture; + m_pTarget->iRepeatPicture = m_pSource->iRepeatPicture;; m_pTarget->iDuration = m_pSource->iDuration; m_pTarget->qp_table = m_pSource->qp_table; m_pTarget->qstride = m_pSource->qstride; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,20 +24,29 @@ // which we don't use here #define FF_API_OLD_SAMPLE_FMT 0 +#include #include -#include -#include #include -#include -#include "cores/VideoRenderers/RenderManager.h" +#include +#include +#include "libavcodec/dxva2.h" #include "../DVDCodecUtils.h" + #include "DXVA.h" +#include "windowing/WindowingFactory.h" +#include "settings/Settings.h" +#include +#include "utils/AutoPtrHandle.h" +#include "utils/StringUtils.h" #include "settings/AdvancedSettings.h" +#include "cores/VideoRenderers/RenderManager.h" #include "utils/Log.h" -#include "utils/StringUtils.h" -#include "windowing/WindowingFactory.h" + +#define ALLOW_ADDING_SURFACES 0 using namespace DXVA; +using namespace AUTOPTR; +using namespace std; static void RelBufferS(void *opaque, uint8_t *data) { ((CDecoder*)opaque)->RelBuffer(data); } @@ -45,16 +54,17 @@ static int GetBufferS(AVCodecContext *avctx, AVFrame *pic, int flags) { return ((CDecoder*)((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetHardware())->GetBuffer(avctx, pic, flags); } + DEFINE_GUID(DXVADDI_Intel_ModeH264_A, 0x604F8E64,0x4951,0x4c54,0x88,0xFE,0xAB,0xD2,0x5C,0x15,0xB3,0xD6); DEFINE_GUID(DXVADDI_Intel_ModeH264_C, 0x604F8E66,0x4951,0x4c54,0x88,0xFE,0xAB,0xD2,0x5C,0x15,0xB3,0xD6); DEFINE_GUID(DXVADDI_Intel_ModeH264_E, 0x604F8E68,0x4951,0x4c54,0x88,0xFE,0xAB,0xD2,0x5C,0x15,0xB3,0xD6); DEFINE_GUID(DXVADDI_Intel_ModeVC1_E , 0xBCC5DB6D,0xA2B6,0x4AF0,0xAC,0xE4,0xAD,0xB1,0xF7,0x87,0xBC,0x89); -// redefine DXVA_NoEncrypt with other macro, solves unresolved external symbol linker error -#ifdef DXVA_NoEncrypt -#undef DXVA_NoEncrypt +#if _MSC_VER < 1700 +DEFINE_GUID(DXVA_ModeMPEG2and1_VLD, 0x86695f12,0x340e,0x4f04,0x9f,0xd3,0x92,0x53,0xdd,0x32,0x74,0x60); +// When exposed by an accelerator, indicates compliance with the August 2010 spec update +DEFINE_GUID(DXVA_ModeVC1_D2010, 0x1b81beA4,0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5); #endif -DEFINE_GUID(DXVA_NoEncrypt, 0x1b81beD0, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); typedef struct { const char *name; @@ -64,10 +74,10 @@ /* XXX Prefered modes must come first */ static const dxva2_mode_t dxva2_modes[] = { - { "MPEG2 VLD", &D3D11_DECODER_PROFILE_MPEG2_VLD, AV_CODEC_ID_MPEG2VIDEO }, - { "MPEG1/2 VLD", &D3D11_DECODER_PROFILE_MPEG2and1_VLD, AV_CODEC_ID_MPEG2VIDEO }, - { "MPEG2 MoComp", &D3D11_DECODER_PROFILE_MPEG2_MOCOMP, 0 }, - { "MPEG2 IDCT", &D3D11_DECODER_PROFILE_MPEG2_IDCT, 0 }, + { "MPEG2 VLD", &DXVA2_ModeMPEG2_VLD, AV_CODEC_ID_MPEG2VIDEO }, + { "MPEG1/2 VLD", &DXVA_ModeMPEG2and1_VLD, AV_CODEC_ID_MPEG2VIDEO }, + { "MPEG2 MoComp", &DXVA2_ModeMPEG2_MoComp, 0 }, + { "MPEG2 IDCT", &DXVA2_ModeMPEG2_IDCT, 0 }, #ifndef FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO /* We must prefer Intel specific ones if the flag doesn't exists */ @@ -77,31 +87,31 @@ { "Intel VC-1 VLD", &DXVADDI_Intel_ModeVC1_E, 0 }, #endif - { "H.264 variable-length decoder (VLD), FGT", &D3D11_DECODER_PROFILE_H264_VLD_FGT, AV_CODEC_ID_H264 }, - { "H.264 VLD, no FGT", &D3D11_DECODER_PROFILE_H264_VLD_NOFGT, AV_CODEC_ID_H264 }, - { "H.264 IDCT, FGT", &D3D11_DECODER_PROFILE_H264_IDCT_FGT, 0, }, - { "H.264 inverse discrete cosine transform (IDCT), no FGT", &D3D11_DECODER_PROFILE_H264_IDCT_NOFGT, 0, }, - { "H.264 MoComp, FGT", &D3D11_DECODER_PROFILE_H264_MOCOMP_FGT, 0, }, - { "H.264 motion compensation (MoComp), no FGT", &D3D11_DECODER_PROFILE_H264_MOCOMP_NOFGT, 0, }, - - { "Windows Media Video 8 MoComp", &D3D11_DECODER_PROFILE_WMV8_MOCOMP, 0 }, - { "Windows Media Video 8 post processing", &D3D11_DECODER_PROFILE_WMV8_POSTPROC, 0 }, - - { "Windows Media Video 9 IDCT", &D3D11_DECODER_PROFILE_WMV9_IDCT, 0 }, - { "Windows Media Video 9 MoComp", &D3D11_DECODER_PROFILE_WMV9_MOCOMP, 0 }, - { "Windows Media Video 9 post processing", &D3D11_DECODER_PROFILE_WMV9_POSTPROC, 0 }, - - { "VC-1 VLD", &D3D11_DECODER_PROFILE_VC1_VLD, AV_CODEC_ID_VC1 }, - { "VC-1 VLD", &D3D11_DECODER_PROFILE_VC1_VLD, AV_CODEC_ID_WMV3 }, - { "VC-1 VLD 2010", &D3D11_DECODER_PROFILE_VC1_D2010, AV_CODEC_ID_VC1 }, - { "VC-1 VLD 2010", &D3D11_DECODER_PROFILE_VC1_D2010, AV_CODEC_ID_WMV3 }, - { "VC-1 IDCT", &D3D11_DECODER_PROFILE_VC1_IDCT, 0 }, - { "VC-1 MoComp", &D3D11_DECODER_PROFILE_VC1_MOCOMP, 0 }, - { "VC-1 post processing", &D3D11_DECODER_PROFILE_VC1_POSTPROC, 0 }, + { "H.264 variable-length decoder (VLD), FGT", &DXVA2_ModeH264_F, AV_CODEC_ID_H264 }, + { "H.264 VLD, no FGT", &DXVA2_ModeH264_E, AV_CODEC_ID_H264 }, + { "H.264 IDCT, FGT", &DXVA2_ModeH264_D, 0, }, + { "H.264 inverse discrete cosine transform (IDCT), no FGT", &DXVA2_ModeH264_C, 0, }, + { "H.264 MoComp, FGT", &DXVA2_ModeH264_B, 0, }, + { "H.264 motion compensation (MoComp), no FGT", &DXVA2_ModeH264_A, 0, }, + + { "Windows Media Video 8 MoComp", &DXVA2_ModeWMV8_B, 0 }, + { "Windows Media Video 8 post processing", &DXVA2_ModeWMV8_A, 0 }, + + { "Windows Media Video 9 IDCT", &DXVA2_ModeWMV9_C, 0 }, + { "Windows Media Video 9 MoComp", &DXVA2_ModeWMV9_B, 0 }, + { "Windows Media Video 9 post processing", &DXVA2_ModeWMV9_A, 0 }, + + { "VC-1 VLD", &DXVA2_ModeVC1_D, AV_CODEC_ID_VC1 }, + { "VC-1 VLD", &DXVA2_ModeVC1_D, AV_CODEC_ID_WMV3 }, + { "VC-1 VLD 2010", &DXVA_ModeVC1_D2010, AV_CODEC_ID_VC1 }, + { "VC-1 VLD 2010", &DXVA_ModeVC1_D2010, AV_CODEC_ID_WMV3 }, + { "VC-1 IDCT", &DXVA2_ModeVC1_C, 0 }, + { "VC-1 MoComp", &DXVA2_ModeVC1_B, 0 }, + { "VC-1 post processing", &DXVA2_ModeVC1_A, 0 }, /* HEVC / H.265 */ - { "HEVC / H.265 variable-length decoder, main", &D3D11_DECODER_PROFILE_HEVC_VLD_MAIN, AV_CODEC_ID_HEVC }, - { "HEVC / H.265 variable-length decoder, main10", &D3D11_DECODER_PROFILE_HEVC_VLD_MAIN10, 0 }, + { "HEVC / H.265 variable-length decoder, main", &DXVA_ModeHEVC_VLD_Main, AV_CODEC_ID_HEVC }, + { "HEVC / H.265 variable-length decoder, main10", &DXVA_ModeHEVC_VLD_Main10, 0 }, #ifdef FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO /* Intel specific modes (only useful on older GPUs) */ @@ -115,11 +125,10 @@ }; // Prefered targets must be first -static const DXGI_FORMAT render_targets_dxgi[] = { - DXGI_FORMAT_NV12, - DXGI_FORMAT_P010, - DXGI_FORMAT_P016, - DXGI_FORMAT_UNKNOWN +static const D3DFORMAT render_targets[] = { + (D3DFORMAT)MAKEFOURCC('N','V','1','2'), + (D3DFORMAT)MAKEFOURCC('Y','V','1','2'), + D3DFMT_UNKNOWN }; // List of PCI Device ID of ATI cards with UVD or UVD+ decoding block. @@ -206,94 +215,22 @@ if (IsEqualGUID(*dxva2_modes[i].guid, *guid)) return &dxva2_modes[i]; } - return nullptr; -} - -//----------------------------------------------------------------------------- -// DXVA to D3D11 Video API Wrapper -//----------------------------------------------------------------------------- - -CDXVADecoderWrapper::CDXVADecoderWrapper(ID3D11VideoContext* pContext, ID3D11VideoDecoder* pDecoder) - : m_refs(1), m_pContext(pContext), m_pDecoder(pDecoder) -{ - assert(pContext != nullptr); - assert(pDecoder != nullptr); - m_pContext->AddRef(); - m_pDecoder->AddRef(); -}; - -CDXVADecoderWrapper::~CDXVADecoderWrapper() -{ - SAFE_RELEASE(m_pContext); - SAFE_RELEASE(m_pDecoder); -}; - -STDMETHODIMP_(ULONG) CDXVADecoderWrapper::AddRef(void) -{ - return AtomicIncrement(&m_refs); -} - -STDMETHODIMP_(ULONG) CDXVADecoderWrapper::Release(void) -{ - long refs = AtomicDecrement(&m_refs); - assert(refs >= 0); - if (refs == 0) delete this; - return refs; -}; - -STDMETHODIMP CDXVADecoderWrapper::GetBuffer(UINT BufferType, void **ppBuffer, UINT *pBufferSize) -{ - return m_pContext->GetDecoderBuffer(m_pDecoder, (D3D11_VIDEO_DECODER_BUFFER_TYPE)BufferType, pBufferSize, ppBuffer); -}; - -STDMETHODIMP CDXVADecoderWrapper::ReleaseBuffer(UINT BufferType) -{ - return m_pContext->ReleaseDecoderBuffer(m_pDecoder, (D3D11_VIDEO_DECODER_BUFFER_TYPE)BufferType); -}; - -STDMETHODIMP CDXVADecoderWrapper::BeginFrame(IDirect3DSurface9 *pRenderTarget, void *pvPVPData) -{ - return m_pContext->DecoderBeginFrame(m_pDecoder, reinterpret_cast(pRenderTarget), 0, pvPVPData); -}; - -STDMETHODIMP CDXVADecoderWrapper::EndFrame(HANDLE *pHandleComplete) -{ - return m_pContext->DecoderEndFrame(m_pDecoder); -}; - -STDMETHODIMP CDXVADecoderWrapper::Execute(const DXVA2_DecodeExecuteParams *pExecuteParams) -{ - D3D11_VIDEO_DECODER_BUFFER_DESC buffer[4]; - for (size_t i = 0; i < pExecuteParams->NumCompBuffers; i++) - { - ZeroMemory(&buffer[i], sizeof(D3D11_VIDEO_DECODER_BUFFER_DESC)); - buffer[i].BufferType = (D3D11_VIDEO_DECODER_BUFFER_TYPE)pExecuteParams->pCompressedBuffers[i].CompressedBufferType; - buffer[i].BufferIndex = pExecuteParams->pCompressedBuffers[i].BufferIndex; - buffer[i].DataOffset = pExecuteParams->pCompressedBuffers[i].DataOffset; - buffer[i].DataSize = pExecuteParams->pCompressedBuffers[i].DataSize; - buffer[i].FirstMBaddress = pExecuteParams->pCompressedBuffers[i].FirstMBaddress; - buffer[i].NumMBsInBuffer = pExecuteParams->pCompressedBuffers[i].NumMBsInBuffer; - buffer[i].Width = pExecuteParams->pCompressedBuffers[i].Width; - buffer[i].Height = pExecuteParams->pCompressedBuffers[i].Height; - buffer[i].Stride = pExecuteParams->pCompressedBuffers[i].Stride; - buffer[i].ReservedBits = pExecuteParams->pCompressedBuffers[i].ReservedBits; - buffer[i].pIV = pExecuteParams->pCompressedBuffers[i].pvPVPState; - } - return m_pContext->SubmitDecoderBuffers(m_pDecoder, pExecuteParams->NumCompBuffers, buffer); + return NULL; } //----------------------------------------------------------------------------- // DXVA Context //----------------------------------------------------------------------------- -CDXVAContext *CDXVAContext::m_context = nullptr; +CDXVAContext *CDXVAContext::m_context = NULL; CCriticalSection CDXVAContext::m_section; +HMODULE CDXVAContext::m_dlHandle = NULL; +DXVA2CreateVideoServicePtr CDXVAContext::m_DXVA2CreateVideoService = NULL; CDXVAContext::CDXVAContext() { - m_context = nullptr; + m_context = NULL; m_refCount = 0; - m_service = nullptr; - m_vcontext = nullptr; + m_service = NULL; m_atiWorkaround = false; } @@ -309,7 +246,7 @@ { Close(); delete this; - m_context = nullptr; + m_context = 0; } } @@ -319,6 +256,19 @@ DestroyContext(); } +bool CDXVAContext::LoadSymbols() +{ + CSingleLock lock(m_section); + if (m_dlHandle == NULL) + m_dlHandle = LoadLibraryEx("dxva2.dll", NULL, 0); + if (m_dlHandle == NULL) + return false; + m_DXVA2CreateVideoService = (DXVA2CreateVideoServicePtr)GetProcAddress(m_dlHandle, "DXVA2CreateVideoService"); + if (m_DXVA2CreateVideoService == NULL) + return false; + return true; +} + bool CDXVAContext::EnsureContext(CDXVAContext **ctx, CDecoder *decoder) { CSingleLock lock(m_section); @@ -333,11 +283,11 @@ m_context = new CDXVAContext(); *ctx = m_context; { - if (!m_context->CreateContext()) + if (!m_context->LoadSymbols() || !m_context->CreateContext()) { delete m_context; - m_context = nullptr; - *ctx = nullptr; + m_context = 0; + *ctx = NULL; return false; } } @@ -352,13 +302,7 @@ bool CDXVAContext::CreateContext() { - if ( FAILED(g_Windowing.Get3D11Device()->QueryInterface(__uuidof(ID3D11VideoDevice), reinterpret_cast(&m_service))) - || FAILED(g_Windowing.GetImmediateContext()->QueryInterface(__uuidof(ID3D11VideoContext), reinterpret_cast(&m_vcontext)))) - { - CLog::Log(LOGWARNING, __FUNCTION__" - failed to get Video Device and Context."); - return false; - } - + m_DXVA2CreateVideoService(g_Windowing.Get3DDevice(), IID_IDirectXVideoDecoderService, (void**)&m_service); QueryCaps(); // Some older Ati devices can only open a single decoder at a given time @@ -376,82 +320,88 @@ void CDXVAContext::DestroyContext() { - delete[] m_input_list; + CoTaskMemFree(m_input_list); SAFE_RELEASE(m_service); - SAFE_RELEASE(m_vcontext); } void CDXVAContext::QueryCaps() { - m_input_count = m_service->GetVideoDecoderProfileCount(); - - m_input_list = new GUID[m_input_count]; + HRESULT res = m_service->GetDecoderDeviceGuids(&m_input_count, &m_input_list); + if (FAILED(res)) + { + CLog::Log(LOGNOTICE, "%s - failed getting device guids", __FUNCTION__); + return; + } + for (unsigned i = 0; i < m_input_count; i++) { - if (FAILED(m_service->GetVideoDecoderProfile(i, &m_input_list[i]))) - { - CLog::Log(LOGNOTICE, "%s - failed getting device guids", __FUNCTION__); - return; - } - const dxva2_mode_t *mode = dxva2_find_mode(&m_input_list[i]); + const GUID *g = &m_input_list[i]; + const dxva2_mode_t *mode = dxva2_find_mode(g); if (mode) CLog::Log(LOGDEBUG, "DXVA - supports '%s'", mode->name); else - CLog::Log(LOGDEBUG, "DXVA - supports %s", GUIDToString(m_input_list[i]).c_str()); + CLog::Log(LOGDEBUG, "DXVA - supports %s", GUIDToString(*g).c_str()); } } -bool CDXVAContext::GetInputAndTarget(int codec, GUID &inGuid, DXGI_FORMAT &outFormat) +bool CDXVAContext::GetInputAndTarget(int codec, GUID &inGuid, D3DFORMAT &outFormat) { - outFormat = DXGI_FORMAT_UNKNOWN; + outFormat = D3DFMT_UNKNOWN; + UINT output_count = 0; + D3DFORMAT *output_list = NULL; // iterate through our predifined dxva modes and find the first matching for desired codec - // once we found a mode, get a target we support in render_targets_dxgi DXGI_FORMAT_UNKNOWN - for (const dxva2_mode_t* mode = dxva2_modes; mode->name && outFormat == DXGI_FORMAT_UNKNOWN; mode++) + // once we found a mode, get a target we support in render_targets + for (const dxva2_mode_t* mode = dxva2_modes; mode->name && outFormat == D3DFMT_UNKNOWN; mode++) { if (mode->codec != codec) continue; - for (unsigned i = 0; i < m_input_count && outFormat == DXGI_FORMAT_UNKNOWN; i++) + for (unsigned i = 0; i < m_input_count && outFormat == D3DFMT_UNKNOWN; i++) { if (!IsEqualGUID(m_input_list[i], *mode->guid)) continue; CLog::Log(LOGDEBUG, "DXVA - trying '%s'", mode->name); - for (unsigned j = 0; render_targets_dxgi[j] != DXGI_FORMAT_UNKNOWN && outFormat == DXGI_FORMAT_UNKNOWN; j++) + HRESULT res = m_service->GetDecoderRenderTargets(m_input_list[i], &output_count, &output_list); + if (FAILED(res)) { - BOOL supported; - HRESULT res = m_service->CheckVideoDecoderFormat(&m_input_list[i], render_targets_dxgi[j], &supported); - if (FAILED(res)) - { - CLog::Log(LOGNOTICE, "%s - failed check supported decoder format.", __FUNCTION__); - break; - } - if (supported) + CLog::Log(LOGNOTICE, "%s - failed getting render targets", __FUNCTION__); + break; + } + + for (unsigned j = 0; render_targets[j] != D3DFMT_UNKNOWN && outFormat == D3DFMT_UNKNOWN; j++) + { + for (unsigned k = 0; k < output_count; k++) { - inGuid = m_input_list[i]; - outFormat = render_targets_dxgi[j]; - break; + if (output_list[k] == render_targets[j]) + { + inGuid = m_input_list[i]; + outFormat = output_list[k]; + break; + } } } } } - if (outFormat == DXGI_FORMAT_UNKNOWN) + CoTaskMemFree(output_list); + + if (outFormat == D3DFMT_UNKNOWN) return false; return true; } -bool CDXVAContext::GetConfig(const D3D11_VIDEO_DECODER_DESC *format, D3D11_VIDEO_DECODER_CONFIG &config) +bool CDXVAContext::GetConfig(GUID &inGuid, const DXVA2_VideoDesc *format, DXVA2_ConfigPictureDecode &config) { // find what decode configs are available UINT cfg_count = 0; - HRESULT res = m_service->GetVideoDecoderConfigCount(format, &cfg_count); - + DXVA2_ConfigPictureDecode *cfg_list = NULL; + HRESULT res = m_service->GetDecoderConfigurations(inGuid, format, NULL, &cfg_count, &cfg_list); if (FAILED(res)) { - CLog::Log(LOGNOTICE, "%s - failed getting decoder configuration count", __FUNCTION__); + CLog::Log(LOGNOTICE, "%s - failed getting decoder configuration", __FUNCTION__); return false; } @@ -459,27 +409,21 @@ unsigned bitstream = 2; // ConfigBitstreamRaw = 2 is required for Poulsbo and handles skipping better with nVidia for (unsigned i = 0; i< cfg_count; i++) { - D3D11_VIDEO_DECODER_CONFIG pConfig = {0}; - if (FAILED(m_service->GetVideoDecoderConfig(format, i, &pConfig))) - { - CLog::Log(LOGNOTICE, "%s - failed getting decoder configuration", __FUNCTION__); - return false; - } - CLog::Log(LOGDEBUG, "DXVA - config %d: bitstream type %d%s", i, - pConfig.ConfigBitstreamRaw, - IsEqualGUID(pConfig.guidConfigBitstreamEncryption, DXVA_NoEncrypt) ? "" : ", encrypted"); - + cfg_list[i].ConfigBitstreamRaw, + IsEqualGUID(cfg_list[i].guidConfigBitstreamEncryption, DXVA_NoEncrypt) ? "" : ", encrypted"); // select first available - if (config.ConfigBitstreamRaw == 0 && pConfig.ConfigBitstreamRaw != 0) - config = pConfig; + if (config.ConfigBitstreamRaw == 0 && cfg_list[i].ConfigBitstreamRaw != 0) + config = cfg_list[i]; // overide with preferred if found - if (config.ConfigBitstreamRaw != bitstream && pConfig.ConfigBitstreamRaw == bitstream) - config = pConfig; + if (config.ConfigBitstreamRaw != bitstream && cfg_list[i].ConfigBitstreamRaw == bitstream) + config = cfg_list[i]; } + CoTaskMemFree(cfg_list); + if (!config.ConfigBitstreamRaw) { CLog::Log(LOGDEBUG, "DXVA - failed to find a raw input bitstream"); @@ -489,51 +433,21 @@ return true; } -bool CDXVAContext::CreateSurfaces(D3D11_VIDEO_DECODER_DESC format, unsigned int count, unsigned int alignment, ID3D11VideoDecoderOutputView **surfaces) +bool CDXVAContext::CreateSurfaces(int width, int height, D3DFORMAT format, unsigned int count, LPDIRECT3DSURFACE9 *surfaces) { - HRESULT hr = S_OK; - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - - CD3D11_TEXTURE2D_DESC texDesc(format.OutputFormat, - FFALIGN(format.SampleWidth, alignment), - FFALIGN(format.SampleHeight, alignment), - count, 1, D3D11_BIND_DECODER); - - ID3D11Texture2D *texture = nullptr; - if (FAILED(pDevice->CreateTexture2D(&texDesc, NULL, &texture))) + HRESULT res = m_service->CreateSurface((width + 15) & ~15, (height + 15) & ~15, count, format, + D3DPOOL_DEFAULT, 0, DXVA2_VideoDecoderRenderTarget, + surfaces, NULL); + if (FAILED(res)) { - CLog::Log(LOGERROR, "%s - failed creating decoder texture array", __FUNCTION__); + CLog::Log(LOGNOTICE, "%s - failed creating surfaces", __FUNCTION__); return false; } - D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC vdovDesc = {0}; - vdovDesc.DecodeProfile = format.Guid; - vdovDesc.Texture2D.ArraySlice = 0; - vdovDesc.ViewDimension = D3D11_VDOV_DIMENSION_TEXTURE2D; - - size_t i; - for (i = 0; i < count; ++i) - { - vdovDesc.Texture2D.ArraySlice = D3D11CalcSubresource(0, i, texDesc.MipLevels); - hr = m_service->CreateVideoDecoderOutputView(texture, &vdovDesc, &surfaces[i]); - if (FAILED(hr)) - { - CLog::Log(LOGERROR, "%s - failed creating surfaces", __FUNCTION__); - break; - } - } - SAFE_RELEASE(texture); - - if (FAILED(hr)) - { - for (size_t j = 0; j < i; ++j) - SAFE_RELEASE(surfaces[j]); - } - - return SUCCEEDED(hr); + return true; } -bool CDXVAContext::CreateDecoder(D3D11_VIDEO_DECODER_DESC *format, const D3D11_VIDEO_DECODER_CONFIG *config, CDXVADecoderWrapper **decoder) +bool CDXVAContext::CreateDecoder(GUID &inGuid, DXVA2_VideoDesc *format, const DXVA2_ConfigPictureDecode *config, LPDIRECT3DSURFACE9 *surfaces, unsigned int count, IDirectXVideoDecoder **decoder) { CSingleLock lock(m_section); @@ -542,12 +456,9 @@ { if (!m_atiWorkaround || retry > 0) { - ID3D11VideoDecoder* pDecoder = nullptr; - HRESULT res = m_service->CreateVideoDecoder(format, config, &pDecoder); + HRESULT res = m_service->CreateVideoDecoder(inGuid, format, config, surfaces, count, decoder); if (!FAILED(res)) { - *decoder = new CDXVADecoderWrapper(m_vcontext, pDecoder); - SAFE_RELEASE(pDecoder); return true; } } @@ -593,14 +504,14 @@ Reset(); } -void CSurfaceContext::AddSurface(ID3D11View* view) +void CSurfaceContext::AddSurface(IDirect3DSurface9* surf) { CSingleLock lock(m_section); - m_state[view] = 0; - m_freeViews.push_back(view); + m_state[surf] = 0; + m_freeSurfaces.push_back(surf); } -void CSurfaceContext::ClearReference(ID3D11View* surf) +void CSurfaceContext::ClearReference(IDirect3DSurface9* surf) { CSingleLock lock(m_section); if (m_state.find(surf) == m_state.end()) @@ -611,11 +522,11 @@ m_state[surf] &= ~SURFACE_USED_FOR_REFERENCE; if (m_state[surf] == 0) { - m_freeViews.push_back(surf); + m_freeSurfaces.push_back(surf); } } -bool CSurfaceContext::MarkRender(ID3D11View* surf) +bool CSurfaceContext::MarkRender(IDirect3DSurface9* surf) { CSingleLock lock(m_section); if (m_state.find(surf) == m_state.end()) @@ -623,17 +534,17 @@ CLog::Log(LOGWARNING, "%s - surface invalid", __FUNCTION__); return false; } - std::list::iterator it; - it = std::find(m_freeViews.begin(), m_freeViews.end(), surf); - if (it != m_freeViews.end()) + std::list::iterator it; + it = std::find(m_freeSurfaces.begin(), m_freeSurfaces.end(), surf); + if (it != m_freeSurfaces.end()) { - m_freeViews.erase(it); + m_freeSurfaces.erase(it); } m_state[surf] |= SURFACE_USED_FOR_RENDER; return true; } -void CSurfaceContext::ClearRender(ID3D11View* surf) +void CSurfaceContext::ClearRender(IDirect3DSurface9* surf) { CSingleLock lock(m_section); if (m_state.find(surf) == m_state.end()) @@ -644,11 +555,11 @@ m_state[surf] &= ~SURFACE_USED_FOR_RENDER; if (m_state[surf] == 0) { - m_freeViews.push_back(surf); + m_freeSurfaces.push_back(surf); } } -bool CSurfaceContext::IsValid(ID3D11View* surf) +bool CSurfaceContext::IsValid(IDirect3DSurface9* surf) { CSingleLock lock(m_section); if (m_state.find(surf) != m_state.end()) @@ -657,39 +568,39 @@ return false; } -ID3D11View* CSurfaceContext::GetFree(ID3D11View* surf) +IDirect3DSurface9* CSurfaceContext::GetFree(IDirect3DSurface9* surf) { CSingleLock lock(m_section); if (m_state.find(surf) != m_state.end()) { - std::list::iterator it; - it = std::find(m_freeViews.begin(), m_freeViews.end(), surf); - if (it == m_freeViews.end()) + std::list::iterator it; + it = std::find(m_freeSurfaces.begin(), m_freeSurfaces.end(), surf); + if (it == m_freeSurfaces.end()) { CLog::Log(LOGWARNING, "%s - surface not free", __FUNCTION__); } else { - m_freeViews.erase(it); + m_freeSurfaces.erase(it); m_state[surf] = SURFACE_USED_FOR_REFERENCE; return surf; } } - if (!m_freeViews.empty()) + if (!m_freeSurfaces.empty()) { - ID3D11View* freeSurf = m_freeViews.front(); - m_freeViews.pop_front(); + IDirect3DSurface9* freeSurf = m_freeSurfaces.front(); + m_freeSurfaces.pop_front(); m_state[freeSurf] = SURFACE_USED_FOR_REFERENCE; return freeSurf; } - return nullptr; + return NULL; } -ID3D11View* CSurfaceContext::GetAtIndex(unsigned int idx) +IDirect3DSurface9* CSurfaceContext::GetAtIndex(unsigned int idx) { if (idx >= m_state.size()) - return nullptr; - std::map::iterator it = m_state.begin(); + return NULL; + std::map::iterator it = m_state.begin(); for (unsigned int i = 0; i < idx; i++) ++it; return it->first; @@ -698,11 +609,9 @@ void CSurfaceContext::Reset() { CSingleLock lock(m_section); - for (std::map::iterator it = m_state.begin(); it != m_state.end(); ++it) - { + for (map::iterator it = m_state.begin(); it != m_state.end(); ++it) it->first->Release(); - } - m_freeViews.clear(); + m_freeSurfaces.clear(); m_state.clear(); } @@ -715,13 +624,13 @@ bool CSurfaceContext::HasFree() { CSingleLock lock(m_section); - return !m_freeViews.empty(); + return !m_freeSurfaces.empty(); } bool CSurfaceContext::HasRefs() { CSingleLock lock(m_section); - for (std::map::iterator it = m_state.begin(); it != m_state.end(); ++it) + for (map::iterator it = m_state.begin(); it != m_state.end(); ++it) { if (it->second & SURFACE_USED_FOR_REFERENCE) return true; @@ -740,7 +649,7 @@ CRenderPicture::~CRenderPicture() { - surface_context->ClearRender(view); + surface_context->ClearRender(surface); surface_context->Release(); } @@ -753,24 +662,23 @@ { m_event.Set(); m_state = DXVA_OPEN; - m_device = nullptr; - m_decoder = nullptr; + m_device = NULL; + m_decoder = NULL; m_refs = 0; m_shared = 0; - m_surface_context = nullptr; - m_presentPicture = nullptr; - m_dxva_context = nullptr; + m_surface_context = NULL; + m_presentPicture = NULL; + m_dxva_context = NULL; memset(&m_format, 0, sizeof(m_format)); m_context = (dxva_context*)calloc(1, sizeof(dxva_context)); - m_context->cfg = reinterpret_cast(calloc(1, sizeof(DXVA2_ConfigPictureDecode))); - m_context->surface = reinterpret_cast(calloc(32, sizeof(IDirect3DSurface9*))); - m_surface_alignment = 16; + m_context->cfg = (DXVA2_ConfigPictureDecode*)calloc(1, sizeof(DXVA2_ConfigPictureDecode)); + m_context->surface = (IDirect3DSurface9**)calloc(32, sizeof(IDirect3DSurface9*)); g_Windowing.Register(this); } CDecoder::~CDecoder() { - CLog::Log(LOGDEBUG, "%s - destructing decoder, %p", __FUNCTION__, this); + CLog::Log(LOGDEBUG, "%s - destructing decoder, %ld", __FUNCTION__, this); g_Windowing.Unregister(this); Close(); free(m_context->surface); @@ -801,7 +709,7 @@ CLog::Log(LOGNOTICE, "%s - closing decoder", __FUNCTION__); m_dxva_context->Release(this); } - m_dxva_context = nullptr; + m_dxva_context = NULL; } static bool CheckH264L41(AVCodecContext *avctx) @@ -815,7 +723,7 @@ static bool IsL41LimitedATI() { - DXGI_ADAPTER_DESC AIdentifier = g_Windowing.GetAIdentifier(); + D3DADAPTER_IDENTIFIER9 AIdentifier = g_Windowing.GetAIdentifier(); if(AIdentifier.VendorId == PCIV_ATI) { @@ -832,7 +740,7 @@ { // Some nVidia VP3 hardware cannot do certain macroblock widths - DXGI_ADAPTER_DESC AIdentifier = g_Windowing.GetAIdentifier(); + D3DADAPTER_IDENTIFIER9 AIdentifier = g_Windowing.GetAIdentifier(); if(AIdentifier.VendorId == PCIV_nVidia && !CDVDCodecUtils::IsVP3CompatibleWidth(avctx->coded_width)) @@ -904,23 +812,114 @@ if (!CDXVAContext::EnsureContext(&m_dxva_context, this)) return false; - if (!m_dxva_context->GetInputAndTarget(avctx->codec_id, m_format.Guid, m_format.OutputFormat)) + if (!m_dxva_context->GetInputAndTarget(avctx->codec_id, m_input, m_format.Format)) { CLog::Log(LOGDEBUG, "DXVA - unable to find an input/output format combination"); return false; } - CLog::Log(LOGDEBUG, "DXVA - Selected input/output format: %d", m_format.OutputFormat); CLog::Log(LOGDEBUG, "DXVA - source requires %d references", avctx->refs); - if (m_format.Guid == DXVADDI_Intel_ModeH264_E && avctx->refs > 11) + if (m_input == DXVADDI_Intel_ModeH264_E && avctx->refs > 11) { - const dxva2_mode_t *mode = dxva2_find_mode(&m_format.Guid); + const dxva2_mode_t *mode = dxva2_find_mode(&m_input); CLog::Log(LOGWARNING, "DXVA - too many references %d for selected decoder '%s'.", avctx->refs, mode->name); return false; } m_format.SampleWidth = avctx->coded_width; m_format.SampleHeight = avctx->coded_height; + m_format.SampleFormat.SampleFormat = DXVA2_SampleProgressiveFrame; + m_format.SampleFormat.VideoLighting = DXVA2_VideoLighting_dim; + + if (avctx->color_range == AVCOL_RANGE_JPEG) + m_format.SampleFormat.NominalRange = DXVA2_NominalRange_0_255; + else if(avctx->color_range == AVCOL_RANGE_MPEG) + m_format.SampleFormat.NominalRange = DXVA2_NominalRange_16_235; + else + m_format.SampleFormat.NominalRange = DXVA2_NominalRange_Unknown; + + switch(avctx->chroma_sample_location) + { + case AVCHROMA_LOC_LEFT: + m_format.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_Horizontally_Cosited + | DXVA2_VideoChromaSubsampling_Vertically_AlignedChromaPlanes; + break; + case AVCHROMA_LOC_CENTER: + m_format.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_Vertically_AlignedChromaPlanes; + break; + case AVCHROMA_LOC_TOPLEFT: + m_format.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_Horizontally_Cosited + | DXVA2_VideoChromaSubsampling_Vertically_Cosited; + break; + default: + m_format.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_Unknown; + } + + switch(avctx->colorspace) + { + case AVCOL_SPC_BT709: + m_format.SampleFormat.VideoTransferMatrix = DXVA2_VideoTransferMatrix_BT709; + break; + case AVCOL_SPC_BT470BG: + case AVCOL_SPC_SMPTE170M: + m_format.SampleFormat.VideoTransferMatrix = DXVA2_VideoTransferMatrix_BT601; + break; + case AVCOL_SPC_SMPTE240M: + m_format.SampleFormat.VideoTransferMatrix = DXVA2_VideoTransferMatrix_SMPTE240M; + break; + case AVCOL_SPC_FCC: + case AVCOL_SPC_UNSPECIFIED: + case AVCOL_SPC_RGB: + default: + m_format.SampleFormat.VideoTransferMatrix = DXVA2_VideoTransferMatrix_Unknown; + } + + switch(avctx->color_primaries) + { + case AVCOL_PRI_BT709: + m_format.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_BT709; + break; + case AVCOL_PRI_BT470M: + m_format.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_BT470_2_SysM; + break; + case AVCOL_PRI_BT470BG: + m_format.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_BT470_2_SysBG; + break; + case AVCOL_PRI_SMPTE170M: + m_format.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_SMPTE170M; + break; + case AVCOL_PRI_SMPTE240M: + m_format.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_SMPTE240M; + break; + case AVCOL_PRI_FILM: + case AVCOL_PRI_UNSPECIFIED: + default: + m_format.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_Unknown; + } + + switch(avctx->color_trc) + { + case AVCOL_TRC_BT709: + m_format.SampleFormat.VideoTransferFunction = DXVA2_VideoTransFunc_709; + break; + case AVCOL_TRC_GAMMA22: + m_format.SampleFormat.VideoTransferFunction = DXVA2_VideoTransFunc_22; + break; + case AVCOL_TRC_GAMMA28: + m_format.SampleFormat.VideoTransferFunction = DXVA2_VideoTransFunc_28; + break; + default: + m_format.SampleFormat.VideoTransferFunction = DXVA2_VideoTransFunc_Unknown; + } + + if (avctx->time_base.den > 0 && avctx->time_base.num > 0) + { + m_format.InputSampleFreq.Numerator = avctx->time_base.num; + m_format.InputSampleFreq.Denominator = avctx->time_base.den; + } + m_format.OutputFrameFreq = m_format.InputSampleFreq; + m_format.UABProtectionLevel = FALSE; + m_format.Reserved = 0; if (surfaces > m_shared) m_shared = surfaces; @@ -938,23 +937,11 @@ else m_refs = 2; } - /* decoding MPEG-2 requires additional alignment on some Intel GPUs, - but it causes issues for H.264 on certain AMD GPUs..... */ - if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO) - m_surface_alignment = 32; - /* the HEVC DXVA2 spec asks for 128 pixel aligned surfaces to ensure - all coding features have enough room to work with */ - else if (avctx->codec_id == AV_CODEC_ID_HEVC) - m_surface_alignment = 128; - else - m_surface_alignment = 16; - - - D3D11_VIDEO_DECODER_CONFIG config = {0}; - if (!m_dxva_context->GetConfig(&m_format, config)) + DXVA2_ConfigPictureDecode config = {}; + if (!m_dxva_context->GetConfig(m_input, &m_format, config)) return false; - memcpy((void *)m_context->cfg, &config, sizeof(DXVA2_ConfigPictureDecode)); + *const_cast(m_context->cfg) = config; m_surface_context = new CSurfaceContext(); @@ -968,8 +955,9 @@ mainctx->hwaccel_context = m_context; m_avctx = mainctx; - DXGI_ADAPTER_DESC AIdentifier = g_Windowing.GetAIdentifier(); - if (AIdentifier.VendorId == PCIV_Intel && m_format.Guid == DXVADDI_Intel_ModeH264_E) + + D3DADAPTER_IDENTIFIER9 AIdentifier = g_Windowing.GetAIdentifier(); + if (AIdentifier.VendorId == PCIV_Intel && m_input == DXVADDI_Intel_ModeH264_E) { #ifdef FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO m_context->workaround |= FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO; @@ -1001,11 +989,11 @@ if(frame) { - if (m_surface_context->IsValid(reinterpret_cast(frame->data[3]))) + if (m_surface_context->IsValid((IDirect3DSurface9*)frame->data[3])) { m_presentPicture = new CRenderPicture(m_surface_context); - m_presentPicture->view = reinterpret_cast(frame->data[3]); - m_surface_context->MarkRender(m_presentPicture->view); + m_presentPicture->surface = (IDirect3DSurface9*)frame->data[3]; + m_surface_context->MarkRender(m_presentPicture->surface); return VC_BUFFER | VC_PICTURE; } CLog::Log(LOGWARNING, "DXVA - ignoring invalid surface"); @@ -1022,7 +1010,7 @@ picture->dxva = m_presentPicture; picture->format = RENDER_FMT_DXVA; - picture->extended_format = (unsigned int)m_format.OutputFormat; + picture->extended_format = (unsigned int)m_format.Format; return true; } @@ -1068,8 +1056,13 @@ if(avctx->refs > m_refs) { CLog::Log(LOGWARNING, "CDecoder::Check - number of required reference frames increased, recreating decoder"); +#if ALLOW_ADDING_SURFACES + if(!OpenDecoder()) + return VC_ERROR; +#else Close(); return VC_FLUSHED; +#endif } } @@ -1078,19 +1071,20 @@ && avctx->codec_id != AV_CODEC_ID_VC1 && avctx->codec_id != AV_CODEC_ID_WMV3) return 0; - - D3D11_VIDEO_DECODER_EXTENSION data = {0}; + + DXVA2_DecodeExecuteParams params = {}; + DXVA2_DecodeExtensionData data = {}; union { DXVA_Status_H264 h264; DXVA_Status_VC1 vc1; } status = {}; - /* I'm not sure, but MSDN says nothing about extentions functions in D3D11, try to using with same way as in DX9 */ + params.pExtensionData = &data; data.Function = DXVA_STATUS_REPORTING_FUNCTION; data.pPrivateOutputData = &status; data.PrivateOutputDataSize = avctx->codec_id == AV_CODEC_ID_H264 ? sizeof(DXVA_Status_H264) : sizeof(DXVA_Status_VC1); HRESULT hr; - if (FAILED(hr = m_dxva_context->GetVideoContext()->DecoderExtension(m_decoder->m_pDecoder, &data))) + if(FAILED( hr = m_decoder->Execute(¶ms))) { CLog::Log(LOGWARNING, "DXVA - failed to get decoder status - 0x%08X", hr); return VC_ERROR; @@ -1112,22 +1106,22 @@ bool CDecoder::OpenDecoder() { SAFE_RELEASE(m_decoder); - m_context->decoder = nullptr; + m_context->decoder = NULL; m_context->surface_count = m_refs + 1 + 1 + m_shared; // refs + 1 decode + 1 libavcodec safety + processor buffer - CLog::Log(LOGDEBUG, "DXVA - allocating %d surfaces with format %d", m_context->surface_count, m_format.OutputFormat); + CLog::Log(LOGDEBUG, "DXVA - allocating %d surfaces", m_context->surface_count); - if (!m_dxva_context->CreateSurfaces(m_format, m_context->surface_count, m_surface_alignment, - reinterpret_cast(m_context->surface))) + if (!m_dxva_context->CreateSurfaces(m_format.SampleWidth, m_format.SampleHeight, m_format.Format, + m_context->surface_count, m_context->surface)) return false; for(unsigned i = 0; i < m_context->surface_count; i++) { - m_surface_context->AddSurface(reinterpret_cast(m_context->surface[i])); + m_surface_context->AddSurface(m_context->surface[i]); } - if (!m_dxva_context->CreateDecoder(&m_format, reinterpret_cast((DXVA2_ConfigPictureDecode*)m_context->cfg), &m_decoder)) + if (!m_dxva_context->CreateDecoder(m_input, &m_format, m_context->cfg, m_context->surface, m_context->surface_count, &m_decoder)) return false; m_context->decoder = m_decoder; @@ -1144,16 +1138,14 @@ void CDecoder::RelBuffer(uint8_t *data) { - { - CSingleLock lock(m_section); - ID3D11VideoDecoderOutputView* view = (ID3D11VideoDecoderOutputView*)(uintptr_t)data; + CSingleLock lock(m_section); + IDirect3DSurface9* surface = (IDirect3DSurface9*)(uintptr_t)data; - if (!m_surface_context->IsValid(view)) - { - CLog::Log(LOGWARNING, "%s - return of invalid surface", __FUNCTION__); - } - m_surface_context->ClearReference(view); + if (!m_surface_context->IsValid(surface)) + { + CLog::Log(LOGWARNING, "%s - return of invalid surface", __FUNCTION__); } + m_surface_context->ClearReference(surface); IHardwareDecoder::Release(); } @@ -1165,11 +1157,11 @@ if (!m_decoder) return -1; - ID3D11View* view = reinterpret_cast(pic->data[3]); - view = m_surface_context->GetFree(view != nullptr ? view : nullptr); - if (view == nullptr) + IDirect3DSurface9* surf = (IDirect3DSurface9*)(uintptr_t)pic->data[3]; + surf = m_surface_context->GetFree(surf != 0 ? surf : NULL); + if (surf == NULL) { - CLog::Log(LOGERROR, "%s - no surface available", __FUNCTION__); + CLog::Log(LOGERROR, "%s - no surface available - dec: %d, render: %d", __FUNCTION__); m_state = DXVA_LOST; return -1; } @@ -1178,12 +1170,12 @@ for(unsigned i = 0; i < 4; i++) { - pic->data[i] = nullptr; + pic->data[i] = NULL; pic->linesize[i] = 0; } - pic->data[0] = (uint8_t*)view; - pic->data[3] = (uint8_t*)view; + pic->data[0] = (uint8_t*)surf; + pic->data[3] = (uint8_t*)surf; AVBufferRef *buffer = av_buffer_create(pic->data[3], 0, RelBufferS, this, 0); if (!buffer) { @@ -1202,6 +1194,7 @@ return m_shared; } + void CDecoder::CloseDXVADecoder() { CSingleLock lock(m_section); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,14 +19,15 @@ */ #pragma once -#include -#include +#include "libavcodec/avcodec.h" #include "DVDCodecs/Video/DVDVideoCodecFFmpeg.h" -#include "DVDResource.h" #include "guilib/D3DResource.h" -#include "libavcodec/avcodec.h" -#include "libavcodec/dxva2.h" #include "threads/Event.h" +#include "DVDResource.h" +#include +#include +#include +#include namespace DXVA { @@ -47,21 +48,21 @@ CSurfaceContext(); ~CSurfaceContext(); - void AddSurface(ID3D11View* view); - void ClearReference(ID3D11View* view); - bool MarkRender(ID3D11View* view); - void ClearRender(ID3D11View* view); - bool IsValid(ID3D11View* view); - ID3D11View* GetFree(ID3D11View* view); - ID3D11View* GetAtIndex(unsigned int idx); + void AddSurface(IDirect3DSurface9* surf); + void ClearReference(IDirect3DSurface9* surf); + bool MarkRender(IDirect3DSurface9* surf); + void ClearRender(IDirect3DSurface9* surf); + bool IsValid(IDirect3DSurface9* surf); + IDirect3DSurface9* GetFree(IDirect3DSurface9* surf); + IDirect3DSurface9* GetAtIndex(unsigned int idx); void Reset(); int Size(); bool HasFree(); bool HasRefs(); protected: - std::map m_state; - std::list m_freeViews; + std::map m_state; + std::list m_freeSurfaces; CCriticalSection m_section; }; @@ -71,62 +72,35 @@ public: CRenderPicture(CSurfaceContext *context); ~CRenderPicture(); - ID3D11View* view; + IDirect3DSurface9* surface; protected: CSurfaceContext *surface_context; }; -//----------------------------------------------------------------------------- -// DXVA to D3D11 Video API Wrapper -//----------------------------------------------------------------------------- -class CDXVADecoderWrapper : public IDirectXVideoDecoder -{ -public: - CDXVADecoderWrapper(ID3D11VideoContext* pContext, ID3D11VideoDecoder* pDecoder); - ~CDXVADecoderWrapper(); - // unused - STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject) { return E_NOTIMPL; }; - STDMETHODIMP_(ULONG) AddRef(void); - STDMETHODIMP_(ULONG) Release(void); - // unused - STDMETHODIMP GetVideoDecoderService(IDirectXVideoDecoderService **ppService) { return E_NOTIMPL; }; - // unused - STDMETHODIMP GetCreationParameters(GUID *pDeviceGuid, DXVA2_VideoDesc *pVideoDesc, DXVA2_ConfigPictureDecode *pConfig, - IDirect3DSurface9 ***pDecoderRenderTargets, UINT *pNumSurfaces) { return E_NOTIMPL; }; - STDMETHODIMP GetBuffer(UINT BufferType, void **ppBuffer, UINT *pBufferSize); - STDMETHODIMP ReleaseBuffer(UINT BufferType); - STDMETHODIMP BeginFrame(IDirect3DSurface9 *pRenderTarget, void *pvPVPData); - STDMETHODIMP EndFrame(HANDLE *pHandleComplete); - STDMETHODIMP Execute(const DXVA2_DecodeExecuteParams *pExecuteParams); - - ID3D11VideoDecoder* m_pDecoder; -private: - volatile long m_refs; - ID3D11VideoContext* m_pContext; -}; - +typedef HRESULT(__stdcall *DXVA2CreateVideoServicePtr)(IDirect3DDevice9* pDD, REFIID riid, void** ppService); class CDecoder; class CDXVAContext { public: static bool EnsureContext(CDXVAContext **ctx, CDecoder *decoder); - bool GetInputAndTarget(int codec, GUID &inGuid, DXGI_FORMAT &outFormat); - bool GetConfig(const D3D11_VIDEO_DECODER_DESC *format, D3D11_VIDEO_DECODER_CONFIG &config); - bool CreateSurfaces(D3D11_VIDEO_DECODER_DESC format, unsigned int count, unsigned int alignment, ID3D11VideoDecoderOutputView **surfaces); - bool CreateDecoder(D3D11_VIDEO_DECODER_DESC *format, const D3D11_VIDEO_DECODER_CONFIG *config, CDXVADecoderWrapper **decoder); + bool GetInputAndTarget(int codec, GUID &inGuid, D3DFORMAT &outFormat); + bool GetConfig(GUID &inGuid, const DXVA2_VideoDesc *format, DXVA2_ConfigPictureDecode &config); + bool CreateSurfaces(int width, int height, D3DFORMAT format, unsigned int count, LPDIRECT3DSURFACE9 *surfaces); + bool CreateDecoder(GUID &inGuid, DXVA2_VideoDesc *format, const DXVA2_ConfigPictureDecode *config, LPDIRECT3DSURFACE9 *surfaces, unsigned int count, IDirectXVideoDecoder **decoder); void Release(CDecoder *decoder); - ID3D11VideoContext* GetVideoContext() { return m_vcontext; } private: CDXVAContext(); void Close(); + bool LoadSymbols(); bool CreateContext(); void DestroyContext(); void QueryCaps(); bool IsValidDecoder(CDecoder *decoder); static CDXVAContext *m_context; static CCriticalSection m_section; - ID3D11VideoContext* m_vcontext; - ID3D11VideoDevice* m_service; + static HMODULE m_dlHandle; + static DXVA2CreateVideoServicePtr m_DXVA2CreateVideoService; + IDirectXVideoDecoderService* m_service; int m_refCount; UINT m_input_count; GUID *m_input_list; @@ -150,6 +124,7 @@ virtual unsigned GetAllowedReferences(); virtual long Release(); + bool OpenTarget(const GUID &guid); bool OpenDecoder(); int GetBuffer(AVCodecContext *avctx, AVFrame *pic, int flags); void RelBuffer(uint8_t *data); @@ -170,9 +145,10 @@ virtual void OnLostDevice() { CSingleLock lock(m_section); m_state = DXVA_LOST; m_event.Reset(); } virtual void OnResetDevice() { CSingleLock lock(m_section); m_state = DXVA_RESET; m_event.Set(); } - CDXVADecoderWrapper* m_decoder; + IDirectXVideoDecoder* m_decoder; HANDLE m_device; - D3D11_VIDEO_DECODER_DESC m_format; + GUID m_input; + DXVA2_VideoDesc m_format; int m_refs; CRenderPicture *m_presentPicture; @@ -183,7 +159,7 @@ AVCodecContext* m_avctx; unsigned int m_shared; - unsigned int m_surface_alignment; + CCriticalSection m_section; CEvent m_event; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightInterface.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightInterface.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightInterface.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightInterface.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,7 @@ #include "windowing/WindowingFactory.h" #include "settings/AdvancedSettings.h" -void* create_stf(CApplication* application, KODI::MESSAGING::CApplicationMessenger* applicationMessenger, CWinSystemEGL* windowing, CAdvancedSettings* advsettings) +void* create_stf(CApplication* application, CApplicationMessenger* applicationMessenger, CWinSystemEGL* windowing, CAdvancedSettings* advsettings) { return (void*)new CStageFrightVideo(application, applicationMessenger, windowing, advsettings); } @@ -83,3 +83,4 @@ { ((CStageFrightVideo*)stf)->ReleaseBuffer(eglimg); } + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightInterface.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightInterface.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightInterface.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightInterface.h 2015-10-19 08:39:16.000000000 +0000 @@ -24,20 +24,13 @@ class CStageFrightVideo; class CApplication; +class CApplicationMessenger; class CWinSystemEGL; class CAdvancedSettings; -namespace KODI -{ - namespace MESSAGING - { - class CApplicationMessenger; - } -} - extern "C" { - void* create_stf(CApplication* application, KODI::MESSAGING::CApplicationMessenger* applicationMessenger, CWinSystemEGL* windowing, CAdvancedSettings* advsettings); + void* create_stf(CApplication* application, CApplicationMessenger* applicationMessenger, CWinSystemEGL* windowing, CAdvancedSettings* advsettings); void destroy_stf(void*); bool stf_Open(void*, CDVDStreamInfo &hints); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideo.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideo.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,7 @@ #include "threads/Thread.h" #include "threads/Event.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "settings/AdvancedSettings.h" #include "android/jni/Build.h" @@ -55,7 +55,6 @@ #define EGL_IMAGE_PRESERVED_KHR 0x30D2 using namespace android; -using namespace KODI::MESSAGING; static int64_t pts_dtoi(double pts) { @@ -449,20 +448,11 @@ return false; mimetype = "video/x-vnd.on2.vp8"; break; - case AV_CODEC_ID_VP9: - if (p->m_g_advancedSettings->m_stagefrightConfig.useVPXcodec == 0) - return false; - mimetype = "video/x-vnd.on2.vp9"; - break; - case AV_CODEC_ID_WMV3: - if (p->m_g_advancedSettings->m_stagefrightConfig.useVC1codec == 0) - return false; - mimetype = "video/x-ms-wmv"; - break; - case AV_CODEC_ID_VC1: + case CODEC_ID_VC1: + case CODEC_ID_WMV3: if (p->m_g_advancedSettings->m_stagefrightConfig.useVC1codec == 0) return false; - mimetype = "video/wvc1"; + mimetype = "video/vc1"; break; default: return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideo.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideo.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideo.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideo.h 2015-10-19 08:39:16.000000000 +0000 @@ -24,15 +24,8 @@ #include "cores/dvdplayer/DVDStreamInfo.h" #include "DVDVideoCodec.h" -namespace KODI -{ - namespace MESSAGING - { - class CApplicationMessenger; - } -} - class CApplication; +class CApplicationMessenger; class CWinSystemEGL; class CAdvancedSettings; class CStageFrightVideoPrivate; @@ -42,7 +35,7 @@ class CStageFrightVideo { public: - CStageFrightVideo(CApplication* application, KODI::MESSAGING::CApplicationMessenger* applicationMessenger, CWinSystemEGL* windowing, CAdvancedSettings* advsettings); + CStageFrightVideo(CApplication* application, CApplicationMessenger* applicationMessenger, CWinSystemEGL* windowing, CAdvancedSettings* advsettings); virtual ~CStageFrightVideo(); bool Open(CDVDStreamInfo &hints); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideoPrivate.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideoPrivate.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideoPrivate.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideoPrivate.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,7 +29,7 @@ #include #include "windowing/egl/EGLWrapper.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "windowing/WindowingFactory.h" #include "settings/AdvancedSettings.h" #include "utils/log.h" @@ -40,8 +40,6 @@ #define CLASSNAME "CStageFrightVideoPrivate" -using namespace KODI::MESSAGING; - GLint glerror; #define CheckEglError(x) while((glerror = eglGetError()) != EGL_SUCCESS) CLog::Log(LOGERROR, "EGL error in %s: %x",x, glerror); #define CheckGlError(x) while((glerror = glGetError()) != GL_NO_ERROR) CLog::Log(LOGERROR, "GL error in %s: %x",x, glerror); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideoPrivate.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideoPrivate.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideoPrivate.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/libstagefrightICS/StageFrightVideoPrivate.h 2015-10-19 08:39:16.000000000 +0000 @@ -65,14 +65,7 @@ class CWinSystemEGL; class CAdvancedSettings; class CApplication; - -namespace KODI -{ - namespace MESSAGING - { - class CApplicationMessenger; - } -} +class CApplicationMessenger; struct stSlot { @@ -129,7 +122,7 @@ GLint mTexMatrixHandle; CApplication* m_g_application; - KODI::MESSAGING::CApplicationMessenger* m_g_applicationMessenger; + CApplicationMessenger* m_g_applicationMessenger; CWinSystemEGL* m_g_Windowing; CAdvancedSettings* m_g_advancedSettings; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -35,7 +35,7 @@ #include "utils/TimeUtils.h" #include "settings/Settings.h" #include "settings/MediaSettings.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "Application.h" #include "threads/Atomics.h" #include "guilib/GUIWindowManager.h" @@ -46,8 +46,6 @@ #include "linux/RBP.h" -using namespace KODI::MESSAGING; - #define CLASSNAME "CMMALVideoBuffer" CMMALVideoBuffer::CMMALVideoBuffer(CMMALVideo *omv) @@ -108,8 +106,8 @@ m_interlace_mode = MMAL_InterlaceProgressive; m_interlace_method = VS_INTERLACEMETHOD_NONE; + m_startframe = false; m_decoderPts = DVD_NOPTS_VALUE; - m_demuxerPts = DVD_NOPTS_VALUE; m_dec = NULL; m_dec_input = NULL; @@ -512,10 +510,10 @@ { CSingleLock lock(m_sharedSection); if (g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "%s::%s usemmal:%d software:%d %dx%d pool:%p", CLASSNAME, __func__, CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMMAL), hints.software, hints.width, hints.height, options.m_opaque_pointer); + CLog::Log(LOGDEBUG, "%s::%s usemmal:%d software:%d %dx%d pool:%p", CLASSNAME, __func__, CSettings::Get().GetBool("videoplayer.usemmal"), hints.software, hints.width, hints.height, options.m_opaque_pointer); // we always qualify even if DVDFactoryCodec does this too. - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMMAL) || hints.software) + if (!CSettings::Get().GetBool("videoplayer.usemmal") || hints.software) return false; m_hints = hints; @@ -623,11 +621,6 @@ m_dec_input->format->es->video.width = ALIGN_UP(m_hints.width, 32); m_dec_input->format->es->video.height = ALIGN_UP(m_hints.height, 16); } - if (hints.fpsrate > 0 && hints.fpsscale > 0) - { - m_dec_input->format->es->video.frame_rate.num = hints.fpsrate; - m_dec_input->format->es->video.frame_rate.den = hints.fpsscale; - } m_dec_input->format->flags |= MMAL_ES_FORMAT_FLAG_FRAMED; error_concealment.hdr.id = MMAL_PARAMETER_VIDEO_DECODE_ERROR_CONCEALMENT; @@ -641,7 +634,7 @@ if (status != MMAL_SUCCESS) CLog::Log(LOGERROR, "%s::%s Failed to enable extra buffers on %s (status=%x %s)", CLASSNAME, __func__, m_dec_input->name, status, mmal_status_to_string(status)); - status = mmal_port_parameter_set_uint32(m_dec_input, MMAL_PARAMETER_VIDEO_INTERPOLATE_TIMESTAMPS, 1); + status = mmal_port_parameter_set_uint32(m_dec_input, MMAL_PARAMETER_VIDEO_INTERPOLATE_TIMESTAMPS, 0); if (status != MMAL_SUCCESS) CLog::Log(LOGERROR, "%s::%s Failed to disable interpolate timestamps mode on %s (status=%x %s)", CLASSNAME, __func__, m_dec_input->name, status, mmal_status_to_string(status)); @@ -707,6 +700,7 @@ return false; Prime(); + m_startframe = false; m_preroll = !m_hints.stills; m_speed = DVD_PLAYSPEED_NORMAL; @@ -793,9 +787,11 @@ mmal_buffer_header_reset(buffer); buffer->cmd = 0; + if (!m_startframe && pts == DVD_NOPTS_VALUE) + pts = 0; buffer->pts = pts == DVD_NOPTS_VALUE ? MMAL_TIME_UNKNOWN : pts; buffer->dts = dts == DVD_NOPTS_VALUE ? MMAL_TIME_UNKNOWN : dts; - if (m_hints.ptsinvalid) buffer->pts = MMAL_TIME_UNKNOWN; + if (buffer->dts != MMAL_TIME_UNKNOWN) buffer->pts = MMAL_TIME_UNKNOWN; buffer->length = demuxer_bytes > buffer->alloc_size ? buffer->alloc_size : demuxer_bytes; // set a flag so we can identify primary frames from generated frames (deinterlace) buffer->flags = MMAL_BUFFER_HEADER_FLAG_USER0; @@ -820,18 +816,13 @@ if (demuxer_bytes == 0) { - EDEINTERLACEMODE deinterlace_request = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode; - EINTERLACEMETHOD interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod); - bool deinterlace = m_interlace_mode != MMAL_InterlaceProgressive; + pthread_mutex_lock(&m_output_mutex); + m_startframe = true; + pthread_mutex_unlock(&m_output_mutex); + EDEINTERLACEMODE deinterlace_request = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; + EINTERLACEMETHOD interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod); - // we don't keep up when running at 60fps in the background so switch to half rate - if (!g_graphicsContext.IsFullScreenVideo()) - { - if (interlace_method == VS_INTERLACEMETHOD_MMAL_ADVANCED) - interlace_method = VS_INTERLACEMETHOD_MMAL_ADVANCED_HALF; - if (interlace_method == VS_INTERLACEMETHOD_MMAL_BOB) - interlace_method = VS_INTERLACEMETHOD_MMAL_BOB_HALF; - } + bool deinterlace = m_interlace_mode != MMAL_InterlaceProgressive; if (m_hints.stills || deinterlace_request == VS_DEINTERLACEMODE_OFF || interlace_method == VS_INTERLACEMETHOD_NONE) deinterlace = false; @@ -856,13 +847,13 @@ break; } int ret = 0; - if (pts != DVD_NOPTS_VALUE) - m_demuxerPts = pts; - else if (dts != DVD_NOPTS_VALUE) - m_demuxerPts = dts; - double queued = m_decoderPts != DVD_NOPTS_VALUE && m_demuxerPts != DVD_NOPTS_VALUE ? m_demuxerPts - m_decoderPts : 0.0; - if (mmal_queue_length(m_dec_input_pool->queue) > 0 && !m_demux_queue_length && queued <= DVD_MSEC_TO_TIME(1000)) + double queued = m_decoderPts != DVD_NOPTS_VALUE && pts != DVD_NOPTS_VALUE ? pts - m_decoderPts : 0.0; + if (mmal_queue_length(m_dec_input_pool->queue) > 0 && !m_demux_queue_length && queued <= DVD_MSEC_TO_TIME(500)) + { + if (g_advancedSettings.CanLogComponent(LOGVIDEO)) + CLog::Log(LOGDEBUG, "%s::%s - got space for output: demux_queue(%d) space(%d) queued(%.2f)", CLASSNAME, __func__, m_demux_queue_length, mmal_queue_length(m_dec_input_pool->queue) * m_dec_input->buffer_size, queued*1e-6); ret |= VC_BUFFER; + } else m_preroll = false; @@ -871,14 +862,18 @@ if (!m_output_ready.empty() && !m_preroll) { + if (g_advancedSettings.CanLogComponent(LOGVIDEO)) + CLog::Log(LOGDEBUG, "%s::%s - got output picture:%d", CLASSNAME, __func__, m_output_ready.size()); ret |= VC_PICTURE; } if (!ret) + { + if (g_advancedSettings.CanLogComponent(LOGVIDEO)) + CLog::Log(LOGDEBUG, "%s::%s - Nothing to do: ready_queue(%d) demux_queue(%d) space(%d) preroll(%d)", + CLASSNAME, __func__, m_output_ready.size(), m_demux_queue_length, mmal_queue_length(m_dec_input_pool->queue) * m_dec_input->buffer_size, m_preroll); + lock.Leave(); Sleep(10); // otherwise we busy spin - - if (g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "%s::%s - ret(%x) pics(%d) demux_queue(%d) space(%d) queued(%.2f) preroll(%d)", CLASSNAME, __func__, ret, m_output_ready.size(), m_demux_queue_length, mmal_queue_length(m_dec_input_pool->queue) * m_dec_input->buffer_size, queued*1e-6, m_preroll); - + } return ret; } @@ -945,8 +940,8 @@ SendCodecConfigData(); Prime(); } + m_startframe = false; m_decoderPts = DVD_NOPTS_VALUE; - m_demuxerPts = DVD_NOPTS_VALUE; m_preroll = !m_hints.stills && (m_speed == DVD_PLAYSPEED_NORMAL || m_speed == DVD_PLAYSPEED_PAUSE); } @@ -1039,7 +1034,7 @@ if (pDvdVideoPicture->pts != DVD_NOPTS_VALUE) m_decoderPts = pDvdVideoPicture->pts; else - m_decoderPts = pDvdVideoPicture->dts; + m_decoderPts = pDvdVideoPicture->dts; // xxx is DVD_NOPTS_VALUE better? return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h 2015-10-19 08:39:16.000000000 +0000 @@ -126,7 +126,7 @@ // Components MMAL_INTERLACETYPE_T m_interlace_mode; EINTERLACEMETHOD m_interlace_method; - double m_demuxerPts; + bool m_startframe; double m_decoderPts; int m_speed; bool m_preroll; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMax.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMax.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMax.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMax.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,7 @@ #include "DVDVideoCodec.h" #include "utils/log.h" #include "utils/TimeUtils.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "Application.h" #include @@ -41,8 +41,6 @@ #include #include -using namespace KODI::MESSAGING; - #define CLASSNAME "COpenMax" //////////////////////////////////////////////////////////////////////////////////////////// diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMaxVideo.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMaxVideo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMaxVideo.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMaxVideo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,7 @@ #include "utils/log.h" #include "utils/TimeUtils.h" #include "guilib/GUIWindowManager.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "Application.h" #include @@ -41,8 +41,6 @@ #include #include -using namespace KODI::MESSAGING; - #if 1 //#define OMX_DEBUG_EMPTYBUFFERDONE #define OMX_DEBUG_VERBOSE @@ -751,7 +749,11 @@ callbackData.callback = &CallbackAllocOMXEGLTextures; callbackData.userptr = (void *)this; - CApplicationMessenger::GetInstance().SendMsg(TMSG_CALLBACK, -1, -1, static_cast(&callbackData)); + ThreadMessage tMsg; + tMsg.dwMessage = TMSG_CALLBACK; + tMsg.lpVoid = (void*)&callbackData; + + CApplicationMessenger::Get().SendMessage(tMsg, true); omx_err = OMX_ErrorNone; } @@ -1223,8 +1225,12 @@ deleteInfo->callback.callback = &OpenMaxDeleteTextures; deleteInfo->callback.userptr = (void *)deleteInfo; + ThreadMessage tMsg; + tMsg.dwMessage = TMSG_CALLBACK; + tMsg.lpVoid = (void*)&deleteInfo->callback; + // HACK, this should be synchronous, but it's not possible since Stop blocks the GUI thread. - CApplicationMessenger::GetInstance().PostMsg(TMSG_CALLBACK, -1, -1, static_cast(deleteInfo)); + CApplicationMessenger::Get().SendMessage(tMsg, false); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -451,6 +451,16 @@ // VAAPI //----------------------------------------------------------------------------- +// settings codecs mapping +DVDCodecAvailableType g_vaapi_available[] = { + { AV_CODEC_ID_H263, "videoplayer.usevaapimpeg4" }, + { AV_CODEC_ID_MPEG4, "videoplayer.usevaapimpeg4" }, + { AV_CODEC_ID_WMV3, "videoplayer.usevaapivc1" }, + { AV_CODEC_ID_VC1, "videoplayer.usevaapivc1" }, + { AV_CODEC_ID_MPEG2VIDEO, "videoplayer.usevaapimpeg2" }, +}; +const size_t settings_count = sizeof(g_vaapi_available) / sizeof(DVDCodecAvailableType); + CDecoder::CDecoder() : m_vaapiOutput(&m_inMsgEvent) { m_vaapiConfig.videoSurfaces = &m_videoSurfaces; @@ -490,14 +500,7 @@ } // check if user wants to decode this format with VAAPI - std::map settings_map = { - { AV_CODEC_ID_H263, CSettings::SETTING_VIDEOPLAYER_USEVAAPIMPEG4 }, - { AV_CODEC_ID_MPEG4, CSettings::SETTING_VIDEOPLAYER_USEVAAPIMPEG4 }, - { AV_CODEC_ID_WMV3, CSettings::SETTING_VIDEOPLAYER_USEVAAPIVC1 }, - { AV_CODEC_ID_VC1, CSettings::SETTING_VIDEOPLAYER_USEVAAPIVC1 }, - { AV_CODEC_ID_MPEG2VIDEO, CSettings::SETTING_VIDEOPLAYER_USEVAAPIMPEG2 }, - }; - if (CDVDVideoCodec::IsCodecDisabled(settings_map, avctx->codec_id)) + if (CDVDVideoCodec::IsCodecDisabled(g_vaapi_available, settings_count, avctx->codec_id)) return false; if (g_advancedSettings.CanLogComponent(LOGVIDEO)) @@ -561,15 +564,6 @@ } break; } -#if VA_CHECK_VERSION(0,38,0) - case AV_CODEC_ID_HEVC: - { - profile = VAProfileHEVCMain; - if (!m_vaapiConfig.context->SupportsProfile(profile)) - return false; - break; - } -#endif case AV_CODEC_ID_WMV3: profile = VAProfileVC1Main; if (!m_vaapiConfig.context->SupportsProfile(profile)) @@ -592,7 +586,7 @@ return false; } - if (avctx->codec_id == AV_CODEC_ID_H264) + if(avctx->codec_id == AV_CODEC_ID_H264) { m_vaapiConfig.maxReferences = avctx->refs; if (m_vaapiConfig.maxReferences > 16) @@ -600,8 +594,6 @@ if (m_vaapiConfig.maxReferences < 5) m_vaapiConfig.maxReferences = 5; } - else if (avctx->codec_id == AV_CODEC_ID_HEVC) - m_vaapiConfig.maxReferences = 16; else m_vaapiConfig.maxReferences = 2; @@ -735,14 +727,12 @@ void CDecoder::FFReleaseBuffer(uint8_t *data) { - { - VASurfaceID surf; + VASurfaceID surf; - CSingleLock lock(m_DecoderSection); + CSingleLock lock(m_DecoderSection); - surf = (VASurfaceID)(uintptr_t)data; - m_videoSurfaces.ClearReference(surf); - } + surf = (VASurfaceID)(uintptr_t)data; + m_videoSurfaces.ClearReference(surf); IHardwareDecoder::Release(); } @@ -1178,7 +1168,7 @@ vaapi->ReturnRenderPicture(this); vaapi->ReleasePicReference(); - return 0; + return refCount; } void CVaapiRenderPicture::ReturnUnused() @@ -1863,8 +1853,8 @@ m_config.stats->SetCanSkipDeint(false); - EDEINTERLACEMODE mode = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode; - EINTERLACEMETHOD method = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod; + EDEINTERLACEMODE mode = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; + EINTERLACEMETHOD method = CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod; bool interlaced = m_currentPicture.DVDPic.iFlags & DVP_FLAG_INTERLACED; if (!(flags & DVD_CODEC_CTRL_NO_POSTPROC) && @@ -1932,7 +1922,7 @@ if (!m_pp) { m_config.stats->SetVpp(false); - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_PREFERVAAPIRENDER)) + if (!CSettings::Get().GetBool("videoplayer.prefervaapirender")) m_pp = new CFFmpegPostproc(); else m_pp = new CSkipPostproc(); @@ -3300,7 +3290,7 @@ else if (method == VS_INTERLACEMETHOD_RENDER_BOB) return true; else if (method == VS_INTERLACEMETHOD_NONE && - !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_PREFERVAAPIRENDER)) + !CSettings::Get().GetBool("videoplayer.prefervaapirender")) return true; return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,6 @@ #include "system.h" #ifdef TARGET_DARWIN_OSX #include "osx/CocoaInterface.h" -#include "osx/DarwinUtils.h" #include "DVDVideoCodec.h" #include "DVDCodecs/DVDCodecUtils.h" #include "utils/log.h" @@ -31,6 +30,7 @@ #include "libavcodec/vda.h" } +using namespace std; using namespace VDA; @@ -162,8 +162,6 @@ CFRelease(config_info); CFRelease(io_surface_properties); CFRelease(cv_pix_fmt); - if (CDarwinUtils::DeviceHasLeakyVDA()) - CFRelease(cv_pix_fmt); CFRelease(buffer_attributes); if(status != kVDADecoderNoErr) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -45,6 +45,16 @@ #define ARSIZE(x) (sizeof(x) / sizeof((x)[0])) +// settings codecs mapping +DVDCodecAvailableType g_vdpau_available[] = { + { AV_CODEC_ID_H263, "videoplayer.usevdpaumpeg4" }, + { AV_CODEC_ID_MPEG4, "videoplayer.usevdpaumpeg4" }, + { AV_CODEC_ID_WMV3, "videoplayer.usevdpauvc1" }, + { AV_CODEC_ID_VC1, "videoplayer.usevdpauvc1" }, + { AV_CODEC_ID_MPEG2VIDEO, "videoplayer.usevdpaumpeg2" }, +}; +const size_t settings_count = sizeof(g_vdpau_available) / sizeof(DVDCodecAvailableType); + CDecoder::Desc decoder_profiles[] = { {"MPEG1", VDP_DECODER_PROFILE_MPEG1}, {"MPEG2_SIMPLE", VDP_DECODER_PROFILE_MPEG2_SIMPLE}, @@ -56,9 +66,6 @@ {"VC1_MAIN", VDP_DECODER_PROFILE_VC1_MAIN}, {"VC1_ADVANCED", VDP_DECODER_PROFILE_VC1_ADVANCED}, {"MPEG4_PART2_ASP", VDP_DECODER_PROFILE_MPEG4_PART2_ASP}, -#ifdef VDP_DECODER_PROFILE_HEVC_MAIN -{"HEVC_MAIN", VDP_DECODER_PROFILE_HEVC_MAIN}, -#endif }; const size_t decoder_profile_count = sizeof(decoder_profiles)/sizeof(CDecoder::Desc); @@ -484,14 +491,7 @@ // nvidia is whitelisted despite for mpeg-4 we need to query user settings if ((gpuvendor.compare(0, 6, "nvidia") != 0) || (avctx->codec_id == AV_CODEC_ID_MPEG4) || (avctx->codec_id == AV_CODEC_ID_H263)) { - std::map settings_map = { - { AV_CODEC_ID_H263, CSettings::SETTING_VIDEOPLAYER_USEVDPAUMPEG4 }, - { AV_CODEC_ID_MPEG4, CSettings::SETTING_VIDEOPLAYER_USEVDPAUMPEG4 }, - { AV_CODEC_ID_WMV3, CSettings::SETTING_VIDEOPLAYER_USEVDPAUVC1 }, - { AV_CODEC_ID_VC1, CSettings::SETTING_VIDEOPLAYER_USEVDPAUVC1 }, - { AV_CODEC_ID_MPEG2VIDEO, CSettings::SETTING_VIDEOPLAYER_USEVDPAUMPEG2 }, - }; - if (CDVDVideoCodec::IsCodecDisabled(settings_map, avctx->codec_id)) + if (CDVDVideoCodec::IsCodecDisabled(g_vdpau_available, settings_count, avctx->codec_id)) return false; } @@ -844,12 +844,6 @@ vdp_decoder_profile = VDP_DECODER_PROFILE_H264_HIGH; vdp_chroma_type = VDP_CHROMA_TYPE_420; break; -#ifdef VDP_DECODER_PROFILE_HEVC_MAIN - case AV_CODEC_ID_HEVC: - vdp_decoder_profile = VDP_DECODER_PROFILE_HEVC_MAIN; - vdp_chroma_type = VDP_CHROMA_TYPE_420; - break; -#endif case AV_CODEC_ID_WMV3: vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_MAIN; vdp_chroma_type = VDP_CHROMA_TYPE_420; @@ -888,18 +882,12 @@ ReadFormatOf(avctx->codec_id, vdp_decoder_profile, m_vdpauConfig.vdpChromaType); - if (avctx->codec_id == AV_CODEC_ID_H264) + if(avctx->codec_id == AV_CODEC_ID_H264) { m_vdpauConfig.maxReferences = ref_frames; if (m_vdpauConfig.maxReferences > 16) m_vdpauConfig.maxReferences = 16; if (m_vdpauConfig.maxReferences < 5) m_vdpauConfig.maxReferences = 5; } - else if (avctx->codec_id == AV_CODEC_ID_HEVC) - { - // The DPB works quite differently in hevc and there isn't a per-file max - // reference number, so we force the maximum number (source: upstream ffmpeg) - m_vdpauConfig.maxReferences = 16; - } else m_vdpauConfig.maxReferences = 2; @@ -1458,20 +1446,7 @@ break; case M_TOP_CONFIGURED: - if (port == &m_controlPort) - { - switch (signal) - { - case CMixerControlProtocol::FLUSH: - Flush(); - msg->Reply(CMixerControlProtocol::ACC); - m_state = M_TOP_CONFIGURED_WAIT1; - return; - default: - break; - } - } - else if (port == &m_dataPort) + if (port == &m_dataPort) { switch (signal) { @@ -1740,30 +1715,30 @@ SetHWUpscaling(); m_Upscale = m_config.upscale; } - if (m_Brightness != CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness || - m_Contrast != CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast || + if (m_Brightness != CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness || + m_Contrast != CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast || m_ColorMatrix != m_mixerInput[1].DVDPic.color_matrix) { SetColor(); - m_Brightness = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness; - m_Contrast = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast; + m_Brightness = CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness; + m_Contrast = CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast; m_ColorMatrix = m_mixerInput[1].DVDPic.color_matrix; } - if (m_NoiseReduction != CMediaSettings::GetInstance().GetCurrentVideoSettings().m_NoiseReduction) + if (m_NoiseReduction != CMediaSettings::Get().GetCurrentVideoSettings().m_NoiseReduction) { - m_NoiseReduction = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_NoiseReduction; + m_NoiseReduction = CMediaSettings::Get().GetCurrentVideoSettings().m_NoiseReduction; SetNoiseReduction(); } - if (m_Sharpness != CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Sharpness) + if (m_Sharpness != CMediaSettings::Get().GetCurrentVideoSettings().m_Sharpness) { - m_Sharpness = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Sharpness; + m_Sharpness = CMediaSettings::Get().GetCurrentVideoSettings().m_Sharpness; SetSharpness(); } - if (m_DeintMode != CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode || - m_Deint != CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod) + if (m_DeintMode != CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode || + m_Deint != CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod) { - m_DeintMode = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode; - m_Deint = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod; + m_DeintMode = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; + m_Deint = CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod; SetDeinterlacing(); } } @@ -1892,10 +1867,10 @@ { VdpStatus vdp_st; - if (m_Brightness != CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness) - m_Procamp.brightness = (float)((CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness)-50) / 100; - if (m_Contrast != CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast) - m_Procamp.contrast = (float)((CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast)+50) / 100; + if (m_Brightness != CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness) + m_Procamp.brightness = (float)((CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness)-50) / 100; + if (m_Contrast != CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast) + m_Procamp.contrast = (float)((CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast)+50) / 100; VdpColorStandard colorStandard; switch(m_mixerInput[1].DVDPic.color_matrix) @@ -1921,7 +1896,7 @@ } VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX }; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_LIMITEDRANGE)) + if (CSettings::Get().GetBool("videoscreen.limitedrange")) { float studioCSC[3][4]; GenerateStudioCSCMatrix(colorStandard, studioCSC); @@ -1950,7 +1925,7 @@ VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL }; VdpStatus vdp_st; - if (!CMediaSettings::GetInstance().GetCurrentVideoSettings().m_NoiseReduction) + if (!CMediaSettings::Get().GetCurrentVideoSettings().m_NoiseReduction) { VdpBool enabled[]= {0}; vdp_st = m_config.context->GetProcs().vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); @@ -1960,8 +1935,8 @@ VdpBool enabled[]={1}; vdp_st = m_config.context->GetProcs().vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); CheckStatus(vdp_st, __LINE__); - void* nr[] = { &CMediaSettings::GetInstance().GetCurrentVideoSettings().m_NoiseReduction }; - CLog::Log(LOGNOTICE,"Setting Noise Reduction to %f",CMediaSettings::GetInstance().GetCurrentVideoSettings().m_NoiseReduction); + void* nr[] = { &CMediaSettings::Get().GetCurrentVideoSettings().m_NoiseReduction }; + CLog::Log(LOGNOTICE,"Setting Noise Reduction to %f",CMediaSettings::Get().GetCurrentVideoSettings().m_NoiseReduction); vdp_st = m_config.context->GetProcs().vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attributes), attributes, nr); CheckStatus(vdp_st, __LINE__); } @@ -1975,7 +1950,7 @@ VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL }; VdpStatus vdp_st; - if (!CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Sharpness) + if (!CMediaSettings::Get().GetCurrentVideoSettings().m_Sharpness) { VdpBool enabled[]={0}; vdp_st = m_config.context->GetProcs().vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); @@ -1985,15 +1960,15 @@ VdpBool enabled[]={1}; vdp_st = m_config.context->GetProcs().vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); CheckStatus(vdp_st, __LINE__); - void* sh[] = { &CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Sharpness }; - CLog::Log(LOGNOTICE,"Setting Sharpness to %f",CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Sharpness); + void* sh[] = { &CMediaSettings::Get().GetCurrentVideoSettings().m_Sharpness }; + CLog::Log(LOGNOTICE,"Setting Sharpness to %f",CMediaSettings::Get().GetCurrentVideoSettings().m_Sharpness); vdp_st = m_config.context->GetProcs().vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attributes), attributes, sh); CheckStatus(vdp_st, __LINE__); } EINTERLACEMETHOD CMixer::GetDeinterlacingMethod(bool log /* = false */) { - EINTERLACEMETHOD method = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod; + EINTERLACEMETHOD method = CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod; if (method == VS_INTERLACEMETHOD_AUTO) { int deint = -1; @@ -2027,7 +2002,7 @@ if (m_videoMixer == VDP_INVALID_HANDLE) return; - EDEINTERLACEMODE mode = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode; + EDEINTERLACEMODE mode = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; EINTERLACEMETHOD method = GetDeinterlacingMethod(true); VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL, @@ -2074,7 +2049,7 @@ SetDeintSkipChroma(); - m_config.useInteropYuv = !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVDPAUMIXER); + m_config.useInteropYuv = !CSettings::Get().GetBool("videoplayer.usevdpaumixer"); } void CMixer::SetDeintSkipChroma() @@ -2268,7 +2243,7 @@ m_vdpError = false; m_config.upscale = g_advancedSettings.m_videoVDPAUScaling; - m_config.useInteropYuv = !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVDPAUMIXER); + m_config.useInteropYuv = !CSettings::Get().GetBool("videoplayer.usevdpaumixer"); CreateVdpauMixer(); } @@ -2328,7 +2303,7 @@ m_config.stats->SetCanSkipDeint(false); - EDEINTERLACEMODE mode = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode; + EDEINTERLACEMODE mode = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; EINTERLACEMETHOD method = GetDeinterlacingMethod(); bool interlaced = m_mixerInput[1].DVDPic.iFlags & DVP_FLAG_INTERLACED; m_SeenInterlaceFlag |= interlaced; @@ -2388,7 +2363,7 @@ DVP_FLAG_REPEAT_TOP_FIELD | DVP_FLAG_INTERLACED); - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod = VS_INTERLACEMETHOD_AUTO; + CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod = VS_INTERLACEMETHOD_AUTO; } } else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxBXA.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxBXA.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxBXA.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxBXA.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,18 +26,20 @@ // AirTunes audio Demuxer. +using namespace std; + class CDemuxStreamAudioBXA : public CDemuxStreamAudio { CDVDDemuxBXA *m_parent; - std::string m_codec; + string m_codec; public: - CDemuxStreamAudioBXA(CDVDDemuxBXA *parent, const std::string& codec) + CDemuxStreamAudioBXA(CDVDDemuxBXA *parent, const string& codec) : m_parent(parent) , m_codec(codec) {} - void GetStreamInfo(std::string& strInfo) + void GetStreamInfo(string& strInfo) { strInfo = StringUtils::Format("%s", m_codec.c_str()); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxCDDA.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxCDDA.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxCDDA.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxCDDA.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,11 +25,13 @@ // CDDA audio demuxer based on AirTunes audio Demuxer. +using namespace std; + class CDemuxStreamAudioCDDA : public CDemuxStreamAudio { public: - void GetStreamInfo(std::string& strInfo) + void GetStreamInfo(string& strInfo) { strInfo = "pcm"; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,11 +25,6 @@ strInfo = "Teletext Data Stream"; } -void CDemuxStreamRadioRDS::GetStreamInfo(std::string& strInfo) -{ - strInfo = "Radio Data Stream (RDS)"; -} - void CDemuxStreamAudio::GetStreamType(std::string& strInfo) { char sInfo[64]; @@ -115,19 +110,6 @@ return iCounter; } -const int CDVDDemux::GetNrOfRadioRDSStreams() -{ - int iCounter = 0; - - for (int i = 0; i < GetNrOfStreams(); i++) - { - CDemuxStream* pStream = GetStream(i); - if (pStream->type == STREAM_RADIO_RDS) iCounter++; - } - - return iCounter; -} - CDemuxStreamAudio* CDVDDemux::GetStreamFromAudioId(int iAudioIndex) { int counter = -1; @@ -183,20 +165,6 @@ } return NULL; } - -const CDemuxStreamRadioRDS* CDVDDemux::GetStreamFromRadioRDSId(int iRadioRDSIndex) -{ - int counter = -1; - for (int i = 0; i < GetNrOfStreams(); i++) - { - CDemuxStream* pStream = GetStream(i); - - if (pStream->type == STREAM_RADIO_RDS) counter++; - if (iRadioRDSIndex == counter) - return (CDemuxStreamRadioRDS*)pStream; - } - return NULL; -} void CDemuxStream::GetStreamName( std::string& strInfo ) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,30 +18,7 @@ * */ -#include "DVDDemuxFFmpeg.h" - -#include - -#include "commons/Exception.h" -#include "cores/FFmpeg.h" -#include "DVDClock.h" // for DVD_TIME_BASE -#include "DVDDemuxUtils.h" -#include "DVDInputStreams/DVDInputStream.h" -#include "DVDInputStreams/DVDInputStreamFFmpeg.h" -#include "filesystem/CurlFile.h" -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "settings/AdvancedSettings.h" -#include "settings/Settings.h" #include "system.h" -#include "threads/SystemClock.h" -#include "URL.h" -#include "utils/log.h" -#include "utils/StringUtils.h" - -#ifdef HAVE_LIBBLURAY -#include "DVDInputStreams/DVDInputStreamBluray.h" -#endif #ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS #endif @@ -51,12 +28,30 @@ #ifdef TARGET_POSIX #include "stdint.h" #endif +#include "DVDDemuxFFmpeg.h" +#include "DVDInputStreams/DVDInputStream.h" +#ifdef HAVE_LIBBLURAY +#include "DVDInputStreams/DVDInputStreamBluray.h" +#endif +#include "DVDInputStreams/DVDInputStreamFFmpeg.h" +#include "DVDDemuxUtils.h" +#include "DVDClock.h" // for DVD_TIME_BASE +#include "commons/Exception.h" +#include "settings/AdvancedSettings.h" +#include "settings/Settings.h" +#include "filesystem/File.h" +#include "filesystem/CurlFile.h" +#include "filesystem/Directory.h" +#include "utils/log.h" +#include "threads/SystemClock.h" +#include "utils/StringUtils.h" +#include "URL.h" +#include "cores/FFmpeg.h" extern "C" { #include "libavutil/opt.h" } - struct StereoModeConversionMap { const char* name; @@ -444,16 +439,6 @@ if (m_streaminfo) { - for (unsigned int i = 0; i < m_pFormatContext->nb_streams; i++) - { - AVStream *st = m_pFormatContext->streams[i]; - if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && st->codec->codec_id == AV_CODEC_ID_DTS) - { - AVCodec* pCodec = avcodec_find_decoder_by_name("libdcadec"); - if (pCodec) - st->codec->codec = pCodec; - } - } /* to speed up dvd switches, only analyse very short */ if(m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD)) av_opt_set_int(m_pFormatContext, "analyzeduration", 500000, 0); @@ -1029,25 +1014,16 @@ return m_stream_index.size(); } -double CDVDDemuxFFmpeg::SelectAspect(AVStream* st, bool& forced) +static double SelectAspect(AVStream* st, bool* forced) { - // trust matroshka container - if (m_bMatroska && st->sample_aspect_ratio.num != 0) - { - forced = true; - return av_q2d(st->sample_aspect_ratio); - } - - forced = false; + *forced = false; /* if stream aspect is 1:1 or 0:0 use codec aspect */ - if((st->sample_aspect_ratio.den == 1 || st->sample_aspect_ratio.den == 0) && - (st->sample_aspect_ratio.num == 1 || st->sample_aspect_ratio.num == 0) && - st->codec->sample_aspect_ratio.num != 0) - { + if((st->sample_aspect_ratio.den == 1 || st->sample_aspect_ratio.den == 0) + && (st->sample_aspect_ratio.num == 1 || st->sample_aspect_ratio.num == 0) + && st->codec->sample_aspect_ratio.num != 0) return av_q2d(st->codec->sample_aspect_ratio); - } - forced = true; + *forced = true; if(st->sample_aspect_ratio.num != 0) return av_q2d(st->sample_aspect_ratio); @@ -1192,7 +1168,7 @@ st->iWidth = pStream->codec->width; st->iHeight = pStream->codec->height; - st->fAspect = SelectAspect(pStream, st->bForcedAspect) * pStream->codec->width / pStream->codec->height; + st->fAspect = SelectAspect(pStream, &st->bForcedAspect) * pStream->codec->width / pStream->codec->height; st->iOrientation = 0; st->iBitsPerPixel = pStream->codec->bits_per_coded_sample; @@ -1233,7 +1209,7 @@ } case AVMEDIA_TYPE_SUBTITLE: { - if (pStream->codec->codec_id == AV_CODEC_ID_DVB_TELETEXT && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_TELETEXTENABLED)) + if (pStream->codec->codec_id == AV_CODEC_ID_DVB_TELETEXT && CSettings::Get().GetBool("videoplayer.teletextenabled")) { CDemuxStreamTeletext* st = new CDemuxStreamTeletext(); stream = st; @@ -1291,6 +1267,9 @@ } } + // set ffmpeg type + stream->orig_type = pStream->codec->codec_type; + // generic stuff if (pStream->duration != (int64_t)AV_NOPTS_VALUE) stream->iDuration = (int)((pStream->duration / AV_TIME_BASE) & 0xFFFFFFFF); @@ -1308,7 +1287,7 @@ if (langTag) strncpy(stream->language, langTag->value, 3); - if( stream->type != STREAM_NONE && pStream->codec->extradata && pStream->codec->extradata_size > 0 ) + if( pStream->codec->extradata && pStream->codec->extradata_size > 0 ) { stream->ExtraSize = pStream->codec->extradata_size; stream->ExtraData = new uint8_t[pStream->codec->extradata_size]; @@ -1557,9 +1536,9 @@ { int idx = m_pFormatContext->programs[m_program]->stream_index[i]; CDemuxStream *stream = GetStreamInternal(idx); - if (!stream) + if(!stream) return true; - if (m_pFormatContext->streams[idx]->codec->codec_id != stream->codec) + if(m_pFormatContext->streams[idx]->codec->codec_type != stream->orig_type) return true; } return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h 2015-10-19 08:39:16.000000000 +0000 @@ -80,6 +80,7 @@ }; +#define FFMPEG_FILE_BUFFER_SIZE 32768 // default reading size for ffmpeg #define FFMPEG_DVDNAV_BUFFER_SIZE 2048 // for dvd's struct StereoModeConversionMap; @@ -142,7 +143,6 @@ std::string ConvertCodecToInternalStereoMode(const std::string &mode, const StereoModeConversionMap *conversionMap); void GetL16Parameters(int &channels, int &samplerate); - double SelectAspect(AVStream* st, bool& forced); CCriticalSection m_critSection; std::map m_streams; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h 2015-10-19 08:39:16.000000000 +0000 @@ -52,8 +52,7 @@ STREAM_VIDEO, // video stream STREAM_DATA, // data stream STREAM_SUBTITLE,// subtitle stream - STREAM_TELETEXT, // Teletext data stream - STREAM_RADIO_RDS // Radio RDS data stream + STREAM_TELETEXT // Teletext data stream }; enum StreamSource { @@ -92,6 +91,7 @@ disabled = false; changes = 0; flags = FLAG_NONE; + orig_type = 0; } virtual ~CDemuxStream() @@ -128,6 +128,8 @@ int changes; // increment on change which player may need to know about + int orig_type; // type of original source + enum EFlags { FLAG_NONE = 0x0000 , FLAG_DEFAULT = 0x0001 @@ -221,16 +223,6 @@ virtual void GetStreamInfo(std::string& strInfo); }; -class CDemuxStreamRadioRDS : public CDemuxStream -{ -public: - CDemuxStreamRadioRDS() : CDemuxStream() - { - type = STREAM_RADIO_RDS; - } - virtual void GetStreamInfo(std::string& strInfo); -}; - class CDVDDemux { public: @@ -341,11 +333,6 @@ int GetNrOfTeletextStreams(); /* - * return nr of rds streams, 0 if none - */ - const int GetNrOfRadioRDSStreams(); - - /* * return the audio stream, or NULL if it does not exist */ CDemuxStreamAudio* GetStreamFromAudioId(int iAudioIndex); @@ -366,11 +353,6 @@ CDemuxStreamTeletext* GetStreamFromTeletextId(int iTeletextIndex); /* - * return the rds stream, or NULL if it does not exist - */ - const CDemuxStreamRadioRDS* GetStreamFromRadioRDSId(int iRadioRDSIndex); - - /* * return a user-presentable codec name of the given stream */ virtual void GetStreamCodecName(int iStreamId, std::string &strName) {}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxPVRClient.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxPVRClient.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxPVRClient.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxPVRClient.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,6 @@ #include "utils/log.h" #include "pvr/PVRManager.h" #include "pvr/addons/PVRClients.h" -#include "settings/Settings.h" #include "../DVDClock.h" #define FF_MAX_EXTRADATA_SIZE ((1 << 28) - FF_INPUT_BUFFER_PADDING_SIZE) @@ -385,19 +384,6 @@ if (!m_streams[i]) m_streams[i] = new CDemuxStreamTeletext(); } - else if (props.stream[i].iCodecType == XBMC_CODEC_TYPE_RDS && - CSettings::GetInstance().GetBool("pvrplayback.enableradiords")) - { - CDemuxStreamRadioRDS* st = NULL; - if (stm) - { - st = dynamic_cast(stm); - if (!st || (st->codec != (AVCodecID)props.stream[i].iCodecId)) - DisposeStream(i); - } - if (!m_streams[i]) - m_streams[i] = new CDemuxStreamRadioRDS(); - } else if (props.stream[i].iCodecType == XBMC_CODEC_TYPE_SUBTITLE) { CDemuxStreamSubtitlePVRClient* st = NULL; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxVobsub.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxVobsub.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxVobsub.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxVobsub.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,6 +29,8 @@ #include +using namespace std; + CDVDDemuxVobsub::CDVDDemuxVobsub() { } @@ -42,16 +44,16 @@ m_Streams.clear(); } -bool CDVDDemuxVobsub::Open(const std::string& filename, int source, const std::string& subfilename) +bool CDVDDemuxVobsub::Open(const string& filename, int source, const string& subfilename) { m_Filename = filename; m_source = source; - std::unique_ptr pStream(new CDVDSubtitleStream()); + unique_ptr pStream(new CDVDSubtitleStream()); if(!pStream->Open(filename)) return false; - std::string vobsub = subfilename; + string vobsub = subfilename; if ( vobsub == "") { vobsub = filename; @@ -60,7 +62,7 @@ } m_Input.reset(CDVDFactoryInputStream::CreateInputStream(NULL, vobsub, "")); - if(!m_Input.get() || !m_Input->Open(vobsub.c_str(), "video/x-vobsub", false)) + if(!m_Input.get() || !m_Input->Open(vobsub.c_str(), "video/x-vobsub")) return false; m_Demuxer.reset(new CDVDDemuxFFmpeg()); @@ -145,7 +147,7 @@ DemuxPacket* CDVDDemuxVobsub::Read() { - std::vector::iterator current; + vector::iterator current; do { if(m_Timestamp == m_Timestamps.end()) return NULL; @@ -193,7 +195,7 @@ bool CDVDDemuxVobsub::ParseId(SState& state, char* line) { - std::unique_ptr stream(new CStream(this)); + unique_ptr stream(new CStream(this)); while(*line == ' ') line++; strncpy(stream->language, line, 2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,6 +33,7 @@ #include "pvr/PVRManager.h" #include "pvr/addons/PVRClients.h" +using namespace std; using namespace PVR; CDVDDemux* CDVDFactoryDemuxer::CreateDemuxer(CDVDInputStream* pInputStream, bool fileinfo) @@ -45,7 +46,7 @@ { // audio/x-xbmc-pcm this is the used codec for AirTunes // (apples audio only streaming) - std::unique_ptr demuxer(new CDVDDemuxBXA()); + unique_ptr demuxer(new CDVDDemuxBXA()); if(demuxer->Open(pInputStream)) return demuxer.release(); else @@ -60,7 +61,7 @@ { CLog::Log(LOGDEBUG, "DVDFactoryDemuxer: Stream is probably CD audio. Creating CDDA demuxer."); - std::unique_ptr demuxer(new CDVDDemuxCDDA()); + unique_ptr demuxer(new CDVDDemuxCDDA()); if (demuxer->Open(pInputStream)) { return demuxer.release(); @@ -76,7 +77,7 @@ /* check so we got the meta information as requested in our http header */ if( header->GetValue("icy-metaint").length() > 0 ) { - std::unique_ptr demuxer(new CDVDDemuxShoutcast()); + unique_ptr demuxer(new CDVDDemuxShoutcast()); if(demuxer->Open(pInputStream)) return demuxer.release(); else @@ -99,7 +100,7 @@ /* Used for MediaPortal PVR addon (uses PVR otherstream for playback of rtsp streams) */ if (pOtherStream->IsStreamType(DVDSTREAM_TYPE_FFMPEG)) { - std::unique_ptr demuxer(new CDVDDemuxFFmpeg()); + unique_ptr demuxer(new CDVDDemuxFFmpeg()); if(demuxer->Open(pOtherStream, streaminfo)) return demuxer.release(); else @@ -114,7 +115,7 @@ if (g_PVRClients->GetPlayingClient(client) && client->HandlesDemuxing()) { - std::unique_ptr demuxer(new CDVDDemuxPVRClient()); + unique_ptr demuxer(new CDVDDemuxPVRClient()); if(demuxer->Open(pInputStream)) return demuxer.release(); else @@ -129,7 +130,7 @@ streaminfo = !useFastswitch; } - std::unique_ptr demuxer(new CDVDDemuxFFmpeg()); + unique_ptr demuxer(new CDVDDemuxFFmpeg()); if(demuxer->Open(pInputStream, streaminfo, fileinfo)) return demuxer.release(); else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxSPU.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxSPU.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDDemuxSPU.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDDemuxSPU.cpp 2015-10-19 08:38:33.000000000 +0000 @@ -104,7 +104,7 @@ else pSPUData->iNeededSize = iSize; // set presentation time stamp - pSPUData->pts = pts; + if (pts > 0) pSPUData->pts = pts; } // allocate data if not already done ( done in blocks off 16384 bytes ) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDFileInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDFileInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDFileInfo.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDFileInfo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -64,7 +64,7 @@ if (!input.get()) return false; - if (!input->Open(path.c_str(), "", true)) + if (!input->Open(path.c_str(), "")) return false; demux.reset(CDVDFactoryDemuxer::CreateDemuxer(input.get(), true)); @@ -120,7 +120,7 @@ return false; } - if (!pInputStream->Open(strPath.c_str(), "", true)) + if (!pInputStream->Open(strPath.c_str(), "")) { CLog::Log(LOGERROR, "InputStream: Error opening, %s", redactPath.c_str()); if (pInputStream) @@ -352,7 +352,7 @@ return false; } - if (pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD) || !pInputStream->Open(playablePath.c_str(), "", true)) + if (pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD) || !pInputStream->Open(playablePath.c_str(), "")) { delete pInputStream; return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDFactoryInputStream.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDFactoryInputStream.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDFactoryInputStream.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDFactoryInputStream.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,7 @@ #include "DVDInputStreamNavigator.h" #include "DVDInputStreamFFmpeg.h" #include "DVDInputStreamPVRManager.h" +#include "DVDInputStreamTV.h" #include "DVDInputStreamRTMP.h" #ifdef HAVE_LIBBLURAY #include "DVDInputStreamBluray.h" @@ -39,12 +40,10 @@ #include "utils/URIUtils.h" -CDVDInputStream* CDVDFactoryInputStream::CreateInputStream(IDVDPlayer* pPlayer, const std::string& file, const std::string& content, bool contentlookup) +CDVDInputStream* CDVDFactoryInputStream::CreateInputStream(IDVDPlayer* pPlayer, const std::string& file, const std::string& content) { CFileItem item(file.c_str(), false); - item.SetMimeType(content); - if(item.IsDiscImage()) { #ifdef HAVE_LIBBLURAY @@ -87,6 +86,8 @@ || file.substr(0, 7) == "mmst://" || file.substr(0, 7) == "mmsh://") return new CDVDInputStreamFFmpeg(); + else if(file.substr(0, 8) == "sling://") + return new CDVDInputStreamTV(); #ifdef ENABLE_DVDINPUTSTREAM_STACK else if(file.substr(0, 8) == "stack://") return new CDVDInputStreamStack(); @@ -103,14 +104,7 @@ { if (item.IsType(".m3u8")) return new CDVDInputStreamFFmpeg(); - - if (contentlookup) - { - // request header - item.SetMimeType(""); - item.FillInMimeType(); - } - + item.FillInMimeType(); if (item.GetMimeType() == "application/vnd.apple.mpegurl") return new CDVDInputStreamFFmpeg(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDFactoryInputStream.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDFactoryInputStream.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDFactoryInputStream.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDFactoryInputStream.h 2015-10-19 08:39:16.000000000 +0000 @@ -28,5 +28,5 @@ class CDVDFactoryInputStream { public: - static CDVDInputStream* CreateInputStream(IDVDPlayer* pPlayer, const std::string& file, const std::string& content, bool contentlookup = true); + static CDVDInputStream* CreateInputStream(IDVDPlayer* pPlayer, const std::string& file, const std::string& content); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -38,11 +38,10 @@ #include "dialogs/GUIDialogKaiToast.h" #include "guilib/LocalizeStrings.h" #include "settings/DiscSettings.h" -#include "utils/LangCodeExpander.h" -#include "filesystem/SpecialProtocol.h" #define LIBBLURAY_BYTESEEK 0 +using namespace std; using namespace XFILE; void DllLibbluray::file_close(BD_FILE_H *file) @@ -188,7 +187,6 @@ { m_title = NULL; m_clip = (uint32_t)-1; - m_angle = 0; m_playlist = (uint32_t)-1; m_menu = false; m_bd = NULL; @@ -215,11 +213,6 @@ delete m_dll; } -void CDVDInputStreamBluray::Abort() -{ - m_hold = HOLD_EXIT; -} - bool CDVDInputStreamBluray::IsEOF() { return false; @@ -260,7 +253,7 @@ } -bool CDVDInputStreamBluray::Open(const char* strFile, const std::string& content, bool contentLookup) +bool CDVDInputStreamBluray::Open(const char* strFile, const std::string& content) { if(m_player == NULL) return false; @@ -361,7 +354,7 @@ return false; } - int mode = CSettings::GetInstance().GetInt(CSettings::SETTING_DISC_PLAYBACK); + int mode = CSettings::Get().GetInt("disc.playback"); if (URIUtils::HasExtension(filename, ".mpls")) { @@ -391,8 +384,19 @@ if(m_navmode) { - SetupPlayerSettings(); - + int region = CSettings::Get().GetInt("dvds.playerregion"); + if(region == 0) + { + CLog::Log(LOGWARNING, "CDVDInputStreamBluray::Open - region dvd must be set in setting, assuming region 1"); + region = 1; + } + m_dll->bd_set_player_setting (m_bd, BLURAY_PLAYER_SETTING_REGION_CODE, region); + m_dll->bd_set_player_setting (m_bd, BLURAY_PLAYER_SETTING_PARENTAL, 0); + m_dll->bd_set_player_setting (m_bd, BLURAY_PLAYER_SETTING_PLAYER_PROFILE, 0); + m_dll->bd_set_player_setting_str(m_bd, BLURAY_PLAYER_SETTING_AUDIO_LANG, g_langInfo.GetDVDAudioLanguage().c_str()); + m_dll->bd_set_player_setting_str(m_bd, BLURAY_PLAYER_SETTING_PG_LANG, g_langInfo.GetDVDSubtitleLanguage().c_str()); + m_dll->bd_set_player_setting_str(m_bd, BLURAY_PLAYER_SETTING_MENU_LANG, g_langInfo.GetDVDMenuLanguage().c_str()); + m_dll->bd_set_player_setting_str(m_bd, BLURAY_PLAYER_SETTING_COUNTRY_CODE, "us"); m_dll->bd_register_overlay_proc (m_bd, this, bluray_overlay_cb); #ifdef HAVE_LIBBLURAY_BDJ m_dll->bd_register_argb_overlay_proc (m_bd, this, bluray_overlay_argb_cb, NULL); @@ -582,8 +586,6 @@ case BD_EVENT_SECONDARY_VIDEO: case BD_EVENT_SECONDARY_VIDEO_SIZE: case BD_EVENT_SECONDARY_VIDEO_STREAM: - case BD_EVENT_PLAYMARK: - break; case BD_EVENT_NONE: break; @@ -609,8 +611,7 @@ if(m_hold == HOLD_HELD) return 0; - if( m_hold == HOLD_ERROR - || m_hold == HOLD_EXIT) + if(m_hold == HOLD_ERROR) return -1; result = m_dll->bd_read_ext (m_bd, buf, buf_size, &m_event); @@ -712,7 +713,7 @@ , (*it)->x + (*it)->width , (*it)->y + (*it)->height); - std::vector rem = old.SubtractRect(ovr); + vector rem = old.SubtractRect(ovr); /* if no overlap we are done */ if(rem.size() == 1 && !(rem[0] != old)) @@ -722,7 +723,7 @@ } SOverlays add; - for(std::vector::iterator itr = rem.begin(); itr != rem.end(); ++itr) + for(vector::iterator itr = rem.begin(); itr != rem.end(); ++itr) { SOverlay overlay(new CDVDOverlayImage(*(*it) , itr->x1 @@ -1016,7 +1017,7 @@ CDVDInputStream::ENextStream CDVDInputStreamBluray::NextStream() { - if(!m_navmode || m_hold == HOLD_EXIT) + if(!m_navmode) return NEXTSTREAM_NONE; if (m_hold == HOLD_ERROR) @@ -1127,39 +1128,4 @@ return m_navmode; } -void CDVDInputStreamBluray::SetupPlayerSettings() -{ - int region = CSettings::GetInstance().GetInt(CSettings::SETTING_BLURAY_PLAYERREGION); - if ( region != BLURAY_REGION_A - && region != BLURAY_REGION_B - && region != BLURAY_REGION_C) - { - CLog::Log(LOGWARNING, "CDVDInputStreamBluray::Open - Blu-ray region must be set in setting, assuming region A"); - region = BLURAY_REGION_A; - } - m_dll->bd_set_player_setting(m_bd, BLURAY_PLAYER_SETTING_REGION_CODE, region); - m_dll->bd_set_player_setting(m_bd, BLURAY_PLAYER_SETTING_PARENTAL, 99); - m_dll->bd_set_player_setting(m_bd, BLURAY_PLAYER_SETTING_PLAYER_PROFILE, BLURAY_PLAYER_PROFILE_2_v2_0); - - std::string langCode; - g_LangCodeExpander.ConvertToISO6392T(g_langInfo.GetDVDAudioLanguage(), langCode); - m_dll->bd_set_player_setting_str(m_bd, BLURAY_PLAYER_SETTING_AUDIO_LANG, langCode.c_str()); - - g_LangCodeExpander.ConvertToISO6392T(g_langInfo.GetDVDSubtitleLanguage(), langCode); - m_dll->bd_set_player_setting_str(m_bd, BLURAY_PLAYER_SETTING_PG_LANG, langCode.c_str()); - - g_LangCodeExpander.ConvertToISO6392T(g_langInfo.GetDVDMenuLanguage(), langCode); - m_dll->bd_set_player_setting_str(m_bd, BLURAY_PLAYER_SETTING_MENU_LANG, langCode.c_str()); - - g_LangCodeExpander.ConvertToISO6391(g_langInfo.GetRegionLocale(), langCode); - m_dll->bd_set_player_setting_str(m_bd, BLURAY_PLAYER_SETTING_COUNTRY_CODE, langCode.c_str()); - -#ifdef HAVE_LIBBLURAY_BDJ - std::string cacheDir = CSpecialProtocol::TranslatePath("special://userdata/cache/bluray/cache"); - std::string persitentDir = CSpecialProtocol::TranslatePath("special://userdata/cache/bluray/persistent"); - m_dll->bd_set_player_setting_str(m_bd, 400, persitentDir.c_str()); - m_dll->bd_set_player_setting_str(m_bd, 401, cacheDir.c_str()); -#endif -} - #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.h 2015-10-19 08:39:16.000000000 +0000 @@ -30,7 +30,6 @@ #include #include #include -#include } #define MAX_PLAYLIST_ID 99999 @@ -49,12 +48,11 @@ public: CDVDInputStreamBluray(IDVDPlayer* player); virtual ~CDVDInputStreamBluray(); - virtual bool Open(const char* strFile, const std::string &content, bool contentLookup); + virtual bool Open(const char* strFile, const std::string &content); virtual void Close(); virtual int Read(uint8_t* buf, int buf_size); virtual int64_t Seek(int64_t offset, int whence); virtual bool Pause(double dTime) { return false; }; - void Abort(); virtual bool IsEOF(); virtual int64_t GetLength(); virtual int GetBlockSize() { return 6144; } @@ -157,14 +155,10 @@ HOLD_HELD, HOLD_DATA, HOLD_STILL, - HOLD_ERROR, - HOLD_EXIT + HOLD_ERROR } m_hold; BD_EVENT m_event; #ifdef HAVE_LIBBLURAY_BDJ struct bd_argb_buffer_s m_argb; #endif - - private: - void SetupPlayerSettings(); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStream.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStream.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStream.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStream.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,14 +24,13 @@ CDVDInputStream::CDVDInputStream(DVDStreamType streamType) { m_streamType = streamType; - m_contentLookup = true; } CDVDInputStream::~CDVDInputStream() { } -bool CDVDInputStream::Open(const char* strFile, const std::string &content, bool contentLookup) +bool CDVDInputStream::Open(const char* strFile, const std::string &content) { CURL url(strFile); @@ -42,7 +41,6 @@ m_strFileName = url.Get(); m_content = content; - m_contentLookup = contentLookup; return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFFmpeg.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFFmpeg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFFmpeg.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFFmpeg.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -48,14 +48,14 @@ return false; } -bool CDVDInputStreamFFmpeg::Open(const char* strFile, const std::string& content, bool contentLookup) +bool CDVDInputStreamFFmpeg::Open(const char* strFile, const std::string& content) { CFileItem item(strFile, false); std::string selected; if (item.IsInternetStream() && (item.IsType(".m3u8") || content == "application/vnd.apple.mpegurl")) { // get the available bandwidth and determine the most appropriate stream - int bandwidth = CSettings::GetInstance().GetInt(CSettings::SETTING_NETWORK_BANDWIDTH); + int bandwidth = CSettings::Get().GetInt("network.bandwidth"); if(bandwidth <= 0) bandwidth = INT_MAX; selected = PLAYLIST::CPlayListM3U::GetBestBandwidthStream(strFile, bandwidth); @@ -66,7 +66,7 @@ } } - if (!CDVDInputStream::Open(strFile, content, contentLookup)) + if (!CDVDInputStream::Open(strFile, content)) return false; m_can_pause = true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFFmpeg.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFFmpeg.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFFmpeg.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFFmpeg.h 2015-10-19 08:39:16.000000000 +0000 @@ -29,7 +29,7 @@ public: CDVDInputStreamFFmpeg(); virtual ~CDVDInputStreamFFmpeg(); - virtual bool Open(const char* strFile, const std::string &content, bool contentLookup); + virtual bool Open(const char* strFile, const std::string &content); virtual void Close(); virtual int Read(uint8_t* buf, int buf_size); virtual int64_t Seek(int64_t offset, int whence); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -43,9 +43,9 @@ return !m_pFile || m_eof; } -bool CDVDInputStreamFile::Open(const char* strFile, const std::string& content, bool contentLookup) +bool CDVDInputStreamFile::Open(const char* strFile, const std::string& content) { - if (!CDVDInputStream::Open(strFile, content, contentLookup)) + if (!CDVDInputStream::Open(strFile, content)) return false; m_pFile = new CFile(); @@ -53,10 +53,6 @@ return false; unsigned int flags = READ_TRUNCATED | READ_BITRATE | READ_CHUNKED; - - // If this file is audio and/or video (= not a subtitle) flag to caller - if (!CFileItem(strFile).IsSubtitle()) - flags |= READ_AUDIO_VIDEO; /* * There are 4 buffer modes available (configurable in as.xml) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.h 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,7 @@ public: CDVDInputStreamFile(); virtual ~CDVDInputStreamFile(); - virtual bool Open(const char* strFile, const std::string &content, bool contentLookup); + virtual bool Open(const char* strFile, const std::string &content); virtual void Close(); virtual int Read(uint8_t* buf, int buf_size); virtual int64_t Seek(int64_t offset, int whence); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStream.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStream.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStream.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStream.h 2015-10-19 08:39:16.000000000 +0000 @@ -149,7 +149,7 @@ CDVDInputStream(DVDStreamType m_streamType); virtual ~CDVDInputStream(); - virtual bool Open(const char* strFileName, const std::string& content, bool contentLookup); + virtual bool Open(const char* strFileName, const std::string& content); virtual void Close() = 0; virtual int Read(uint8_t* buf, int buf_size) = 0; virtual int64_t Seek(int64_t offset, int whence) = 0; @@ -180,8 +180,6 @@ void SetFileItem(const CFileItem& item); - bool ContentLookup() { return m_contentLookup; } - protected: DVDStreamType m_streamType; std::string m_strFileName; @@ -189,5 +187,4 @@ BitstreamStats m_stats; std::string m_content; CFileItem m_item; - bool m_contentLookup; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamHttp.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamHttp.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamHttp.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamHttp.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -50,9 +50,9 @@ return true; } -bool CDVDInputStreamHttp::Open(const char* strFile, const std::string& content, bool contentLookup) +bool CDVDInputStreamHttp::Open(const char* strFile, const std::string& content) { - if (!CDVDInputStream::Open(strFile, content, contentLookup)) return false; + if (!CDVDInputStream::Open(strFile, content)) return false; m_pFile = new CCurlFile(); if (!m_pFile) return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamHttp.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamHttp.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamHttp.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamHttp.h 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,7 @@ public: CDVDInputStreamHttp(); virtual ~CDVDInputStreamHttp(); - virtual bool Open(const char* strFile, const std::string& content, bool contentLookup); + virtual bool Open(const char* strFile, const std::string& content); virtual void Close(); virtual int Read(uint8_t* buf, int buf_size); virtual int64_t Seek(int64_t offset, int whence); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamMemory.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamMemory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamMemory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamMemory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -40,9 +40,9 @@ return false; } -bool CDVDInputStreamMemory::Open(const char* strFile, const std::string& content, bool contentLookup) +bool CDVDInputStreamMemory::Open(const char* strFile, const std::string& content) { - if (!CDVDInputStream::Open(strFile, content, contentLookup)) return false; + if (!CDVDInputStream::Open(strFile, content)) return false; return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamMemory.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamMemory.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamMemory.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamMemory.h 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,7 @@ public: CDVDInputStreamMemory(); virtual ~CDVDInputStreamMemory(); - virtual bool Open(const char* strFile, const std::string& content, bool contentLookup); + virtual bool Open(const char* strFile, const std::string& content); virtual void Close(); virtual int Read(uint8_t* buf, int buf_size); virtual int64_t Seek(int64_t offset, int whence); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -63,9 +63,9 @@ Close(); } -bool CDVDInputStreamNavigator::Open(const char* strFile, const std::string& content, bool contentLookup) +bool CDVDInputStreamNavigator::Open(const char* strFile, const std::string& content) { - if (!CDVDInputStream::Open(strFile, "video/x-dvd-mpeg", contentLookup)) + if (!CDVDInputStream::Open(strFile, "video/x-dvd-mpeg")) return false; // load libdvdnav.dll @@ -102,7 +102,7 @@ return false; } - int region = CSettings::GetInstance().GetInt(CSettings::SETTING_DVDS_PLAYERREGION); + int region = CSettings::Get().GetInt("dvds.playerregion"); int mask = 0; if(region > 0) mask = 1 << (region-1); @@ -177,7 +177,7 @@ } // jump directly to title menu - if(CSettings::GetInstance().GetBool(CSettings::SETTING_DVDS_AUTOMENU)) + if(CSettings::Get().GetBool("dvds.automenu")) { int len, event; uint8_t buf[2048]; @@ -476,8 +476,7 @@ { uint64_t* times = NULL; uint64_t duration; - //dvdnav_describe_title_chapters returns 0 on failure and NULL for times - int entries = m_dll.dvdnav_describe_title_chapters(m_dvdnav, m_iTitle, ×, &duration); + int entries = static_cast(m_dll.dvdnav_describe_title_chapters(m_dvdnav, m_iTitle, ×, &duration)); if (entries != m_iPartCount) CLog::Log(LOGDEBUG, "%s - Number of chapters/positions differ: Chapters %d, positions %d\n", __FUNCTION__, m_iPartCount, entries); @@ -558,6 +557,12 @@ m_iTime = (int) ( m_dll.dvdnav_convert_time( &(pci->pci_gi.e_eltm) ) + m_iCellStart ) / 90; + if (m_bCheckButtons) + { + CheckButtons(); + m_bCheckButtons = false; + } + iNavresult = m_pDVDPlayer->OnDVDNavResult((void*)pci, DVDNAV_NAV_PACKET); } break; @@ -683,9 +688,9 @@ void CDVDInputStreamNavigator::CheckButtons() { - if (m_dvdnav && m_bCheckButtons) + if (m_dvdnav) { - m_bCheckButtons = false; + pci_t* pci = m_dll.dvdnav_get_current_nav_pci(m_dvdnav); int iCurrentButton = GetCurrentButton(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h 2015-10-19 08:39:16.000000000 +0000 @@ -77,7 +77,7 @@ CDVDInputStreamNavigator(IDVDPlayer* player); virtual ~CDVDInputStreamNavigator(); - virtual bool Open(const char* strFile, const std::string& content, bool contentLookup); + virtual bool Open(const char* strFile, const std::string& content); virtual void Close(); virtual int Read(uint8_t* buf, int buf_size); virtual int64_t Seek(int64_t offset, int whence); @@ -143,12 +143,12 @@ bool GetDVDTitleString(std::string& titleStr); bool GetDVDSerialString(std::string& serialStr); - void CheckButtons(); - protected: int ProcessBlock(uint8_t* buffer, int* read); + void CheckButtons(); + /** * XBMC : the audio stream id we use in xbmc * external : the audio stream id that is used in libdvdnav diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -74,7 +74,7 @@ return !m_pFile || m_eof; } -bool CDVDInputStreamPVRManager::Open(const char* strFile, const std::string& content, bool contentLookup) +bool CDVDInputStreamPVRManager::Open(const char* strFile, const std::string& content) { /* Open PVR File for both cases, to have access to ILiveTVInterface and * IRecordable @@ -84,7 +84,7 @@ m_pRecordable = ((CPVRFile*)m_pFile)->GetRecordable(); CURL url(strFile); - if (!CDVDInputStream::Open(strFile, content, contentLookup)) return false; + if (!CDVDInputStream::Open(strFile, content)) return false; if (!m_pFile->Open(url)) { delete m_pFile; @@ -111,15 +111,15 @@ m_pOtherStream = CDVDFactoryInputStream::CreateInputStream(m_pPlayer, transFile, content); if (!m_pOtherStream) { - CLog::Log(LOGERROR, "CDVDInputStreamPVRManager::Open - unable to create input stream for [%s]", CURL::GetRedacted(transFile).c_str()); + CLog::Log(LOGERROR, "CDVDInputStreamPVRManager::Open - unable to create input stream for [%s]", transFile.c_str()); return false; } else m_pOtherStream->SetFileItem(m_item); - if (!m_pOtherStream->Open(transFile.c_str(), content, contentLookup)) + if (!m_pOtherStream->Open(transFile.c_str(), content)) { - CLog::Log(LOGERROR, "CDVDInputStreamPVRManager::Open - error opening [%s]", CURL::GetRedacted(transFile).c_str()); + CLog::Log(LOGERROR, "CDVDInputStreamPVRManager::Open - error opening [%s]", transFile.c_str()); delete m_pFile; m_pFile = NULL; m_pLiveTV = NULL; @@ -130,10 +130,9 @@ } } - ResetScanTimeout((unsigned int) CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPLAYBACK_SCANTIME) * 1000); + ResetScanTimeout((unsigned int) CSettings::Get().GetInt("pvrplayback.scantime") * 1000); m_content = content; - m_contentLookup = contentLookup; - CLog::Log(LOGDEBUG, "CDVDInputStreamPVRManager::Open - stream opened: %s", CURL::GetRedacted(transFile).c_str()); + CLog::Log(LOGDEBUG, "CDVDInputStreamPVRManager::Open - stream opened: %s", transFile.c_str()); return true; } @@ -264,20 +263,15 @@ bool CDVDInputStreamPVRManager::SelectChannelByNumber(unsigned int iChannelNumber) { PVR_CLIENT client; - CPVRChannelPtr currentChannel(g_PVRManager.GetCurrentChannel()); - CFileItemPtr item(g_PVRChannelGroups->Get(currentChannel->IsRadio())->GetSelectedGroup()->GetByChannelNumber(iChannelNumber)); - if (!item) - return false; - if (!SupportsChannelSwitch()) { - return CloseAndOpen(item->GetPath().c_str()); + CPVRChannelPtr channel(g_PVRManager.GetCurrentChannel()); + CFileItemPtr item(g_PVRChannelGroups->Get(channel->IsRadio())->GetSelectedGroup()->GetByChannelNumber(iChannelNumber)); + if (item) + return CloseAndOpen(item->GetPath().c_str()); } else if (m_pLiveTV) - { - if (item->HasPVRChannelInfoTag()) - return m_pLiveTV->SelectChannelById(item->GetPVRChannelInfoTag()->ChannelID()); - } + return m_pLiveTV->SelectChannel(iChannelNumber); return false; } @@ -294,7 +288,7 @@ } else if (m_pLiveTV) { - return m_pLiveTV->SelectChannelById(channel->ChannelID()); + return m_pLiveTV->SelectChannel(channel->ChannelNumber()); } return false; @@ -379,7 +373,7 @@ { Close(); - if (Open(strFile, m_content, m_contentLookup)) + if (Open(strFile, m_content)) { return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -45,7 +45,7 @@ public: CDVDInputStreamPVRManager(IDVDPlayer* pPlayer); virtual ~CDVDInputStreamPVRManager(); - virtual bool Open(const char* strFile, const std::string &content, bool contentLookup); + virtual bool Open(const char* strFile, const std::string &content); virtual void Close(); virtual int Read(uint8_t* buf, int buf_size); virtual int64_t Seek(int64_t offset, int whence); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamRTMP.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamRTMP.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamRTMP.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamRTMP.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -35,6 +35,7 @@ #include using namespace XFILE; +using namespace std; static int RTMP_level=0; extern "C" @@ -134,7 +135,7 @@ { NULL } }; -bool CDVDInputStreamRTMP::Open(const char* strFile, const std::string& content, bool contentLookup) +bool CDVDInputStreamRTMP::Open(const char* strFile, const std::string& content) { if (m_sStreamPlaying) { @@ -142,7 +143,7 @@ m_sStreamPlaying = NULL; } - if (!m_rtmp || !CDVDInputStream::Open(strFile, "video/x-flv", contentLookup)) + if (!m_rtmp || !CDVDInputStream::Open(strFile, "video/x-flv")) return false; CSingleLock lock(m_RTMPSection); @@ -165,7 +166,7 @@ */ std::string url = strFile; size_t iPosBlank = url.find(' '); - if (iPosBlank != std::string::npos && (url.find("live=true") != std::string::npos || url.find("live=1") != std::string::npos)) + if (iPosBlank != string::npos && (url.find("live=true") != string::npos || url.find("live=1") != string::npos)) { m_canSeek = false; m_canPause = false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamRTMP.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamRTMP.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamRTMP.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamRTMP.h 2015-10-19 08:39:16.000000000 +0000 @@ -32,7 +32,7 @@ public: CDVDInputStreamRTMP(); virtual ~CDVDInputStreamRTMP(); - virtual bool Open(const char* strFile, const std::string &content, bool contentLookup); + virtual bool Open(const char* strFile, const std::string &content); virtual void Close(); virtual int Read(uint8_t* buf, int buf_size); virtual int64_t Seek(int64_t offset, int whence); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamStack.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamStack.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamStack.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamStack.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,7 @@ #include using namespace XFILE; +using namespace std; CDVDInputStreamStack::CDVDInputStreamStack() : CDVDInputStream(DVDSTREAM_TYPE_FILE) { @@ -45,9 +46,9 @@ return m_eof; } -bool CDVDInputStreamStack::Open(const char* path, const std::string& content, bool contentLookup) +bool CDVDInputStreamStack::Open(const char* path, const std::string& content) { - if (!CDVDInputStream::Open(path, content, contentLookup)) + if (!CDVDInputStream::Open(path, content)) return false; CStackDirectory dir; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamStack.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamStack.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamStack.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamStack.h 2015-10-19 08:39:16.000000000 +0000 @@ -29,7 +29,7 @@ CDVDInputStreamStack(); virtual ~CDVDInputStreamStack(); - virtual bool Open(const char* path, const std::string &content, bool contentLookup); + virtual bool Open(const char* path, const std::string &content); virtual void Close(); virtual int Read(uint8_t* buf, int buf_size); virtual int64_t Seek(int64_t offset, int whence); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamTV.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamTV.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamTV.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamTV.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "DVDInputStreamTV.h" +#include "filesystem/SlingboxFile.h" +#include "URL.h" + +using namespace XFILE; + +CDVDInputStreamTV::CDVDInputStreamTV() : CDVDInputStream(DVDSTREAM_TYPE_TV) +{ + m_pFile = NULL; + m_pRecordable = NULL; + m_pLiveTV = NULL; + m_eof = true; +} + +CDVDInputStreamTV::~CDVDInputStreamTV() +{ + Close(); +} + +bool CDVDInputStreamTV::IsEOF() +{ + return !m_pFile || m_eof; +} + +bool CDVDInputStreamTV::Open(const char* strFile, const std::string& content) +{ + if (!CDVDInputStream::Open(strFile, content)) return false; + + if (strncmp(strFile, "sling://", 8) == 0) + { + m_pFile = new CSlingboxFile(); + m_pLiveTV = ((CSlingboxFile*)m_pFile)->GetLiveTV(); + m_pRecordable = NULL; + } + + CURL url(strFile); + // open file in binary mode + if (!m_pFile->Open(url)) + { + delete m_pFile; + m_pFile = NULL; + return false; + } + m_eof = false; + return true; +} + +// close file and reset everyting +void CDVDInputStreamTV::Close() +{ + if (m_pFile) + { + m_pFile->Close(); + delete m_pFile; + } + + CDVDInputStream::Close(); + m_pFile = NULL; + m_pLiveTV = NULL; + m_eof = true; +} + +int CDVDInputStreamTV::Read(uint8_t* buf, int buf_size) +{ + if(!m_pFile) return -1; + + ssize_t ret = m_pFile->Read(buf, buf_size); + + if (ret < 0) + return -1; // player will retry read in case of error until playback is stopped + + /* we currently don't support non completing reads */ + if (ret == 0) + m_eof = true; + + return (int)ret; +} + +int64_t CDVDInputStreamTV::Seek(int64_t offset, int whence) +{ + if(!m_pFile) return -1; + int64_t ret = m_pFile->Seek(offset, whence); + + /* if we succeed, we are not eof anymore */ + if( ret >= 0 ) m_eof = false; + + return ret; +} + +int64_t CDVDInputStreamTV::GetLength() +{ + if (!m_pFile) return 0; + return m_pFile->GetLength(); +} + + +int CDVDInputStreamTV::GetTotalTime() +{ + if(!m_pLiveTV) return -1; + return m_pLiveTV->GetTotalTime(); +} + +int CDVDInputStreamTV::GetTime() +{ + if(!m_pLiveTV) return -1; + return m_pLiveTV->GetStartTime(); +} + +bool CDVDInputStreamTV::NextChannel(bool preview/* = false*/) +{ + if(!m_pLiveTV) return false; + return m_pLiveTV->NextChannel(); +} + +bool CDVDInputStreamTV::PrevChannel(bool preview/* = false*/) +{ + if(!m_pLiveTV) return false; + return m_pLiveTV->PrevChannel(); +} + +bool CDVDInputStreamTV::SelectChannelByNumber(unsigned int channel) +{ + if(!m_pLiveTV) return false; + return m_pLiveTV->SelectChannel(channel); +} + +bool CDVDInputStreamTV::UpdateItem(CFileItem& item) +{ + if(m_pLiveTV) + return m_pLiveTV->UpdateItem(item); + return false; +} + +bool CDVDInputStreamTV::SeekTime(int iTimeInMsec) +{ + return false; +} + +CDVDInputStream::ENextStream CDVDInputStreamTV::NextStream() +{ + if(!m_pFile) return NEXTSTREAM_NONE; + if(m_pFile->SkipNext()) + { + m_eof = false; + return NEXTSTREAM_OPEN; + } + return NEXTSTREAM_NONE; +} + +bool CDVDInputStreamTV::CanRecord() +{ + if(m_pRecordable) + return m_pRecordable->CanRecord(); + return false; +} +bool CDVDInputStreamTV::IsRecording() +{ + if(m_pRecordable) + return m_pRecordable->IsRecording(); + return false; +} +bool CDVDInputStreamTV::Record(bool bOnOff) +{ + if(m_pRecordable) + return m_pRecordable->Record(bOnOff); + return false; +} + +int CDVDInputStreamTV::GetBlockSize() +{ + if(m_pFile) + return m_pFile->GetChunkSize(); + else + return 0; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamTV.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamTV.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamTV.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamTV.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,74 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "DVDInputStream.h" + +namespace XFILE { +class IFile; +class ILiveTVInterface; +class IRecordable; +} + +class CDVDInputStreamTV + : public CDVDInputStream + , public CDVDInputStream::IChannel + , public CDVDInputStream::IDisplayTime +{ +public: + CDVDInputStreamTV(); + virtual ~CDVDInputStreamTV(); + virtual bool Open(const char* strFile, const std::string &content); + virtual void Close(); + virtual int Read(uint8_t* buf, int buf_size); + virtual int64_t Seek(int64_t offset, int whence); + virtual bool Pause(double dTime) { return false; }; + virtual bool IsEOF(); + virtual int64_t GetLength(); + + virtual ENextStream NextStream(); + virtual int GetBlockSize(); + + bool NextChannel(bool preview = false); + bool PrevChannel(bool preview = false); + bool SelectChannelByNumber(unsigned int channel); + + int GetTotalTime(); + int GetTime(); + + static bool SeekTime(int iTimeInMsec); + + bool CanRecord(); + bool IsRecording(); + bool Record(bool bOnOff); + + bool CanPause() { return false; }; + bool CanSeek() { return false; }; + + bool UpdateItem(CFileItem& item); + +protected: + XFILE::IFile* m_pFile; + XFILE::ILiveTVInterface* m_pLiveTV; + XFILE::IRecordable* m_pRecordable; + bool m_eof; +}; + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/Makefile kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDInputStreams/Makefile 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDInputStreams/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -12,6 +12,7 @@ DVDInputStreamRTMP.cpp \ DVDInputStreamPVRManager.cpp \ DVDInputStreamStack.cpp \ + DVDInputStreamTV.cpp \ DVDStateSerializer.cpp \ LIB= DVDInputStreams.a diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDMessage.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDMessage.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDMessage.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDMessage.h 2015-10-19 08:39:16.000000000 +0000 @@ -68,8 +68,6 @@ PLAYER_CHANNEL_NEXT, // switches to next playback channel PLAYER_CHANNEL_PREV, // switches to previous playback channel - PLAYER_CHANNEL_PREVIEW_NEXT, // switches to next channel preview (does not switch the channel) - PLAYER_CHANNEL_PREVIEW_PREV, // switches to previous channel preview (does not switch the channel) PLAYER_CHANNEL_SELECT_NUMBER, // switches to the channel with the provided channel number PLAYER_CHANNEL_SELECT, // switches to the provided channel PLAYER_STARTED, // sent whenever a sub player has finished it's first frame after open diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDMessageQueue.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDMessageQueue.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDMessageQueue.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDMessageQueue.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,9 @@ #include "DVDClock.h" #include "utils/MathUtils.h" -CDVDMessageQueue::CDVDMessageQueue(const std::string &owner) : m_hEvent(true), m_owner(owner) +using namespace std; + +CDVDMessageQueue::CDVDMessageQueue(const string &owner) : m_hEvent(true), m_owner(owner) { m_iDataSize = 0; m_bAbortRequest = false; @@ -157,7 +159,7 @@ return MSGQ_NOT_INITIALIZED; } - if(m_list.empty() && m_bEmptied == false && priority == 0 && m_owner != "teletext" && m_owner != "rds") + if(m_list.empty() && m_bEmptied == false && priority == 0 && m_owner != "teletext") { #if !defined(TARGET_RASPBERRY_PI) CLog::Log(LOGWARNING, "CDVDMessageQueue(%s)::Get - asked for new data packet, with nothing available", m_owner.c_str()); @@ -254,9 +256,9 @@ return 0; if(IsDataBased()) - return std::min(100, 100 * m_iDataSize / m_iMaxDataSize); + return min(100, 100 * m_iDataSize / m_iMaxDataSize); - return std::min(100, MathUtils::round_int(100.0 * m_TimeSize * (m_TimeFront - m_TimeBack) / DVD_TIME_BASE )); + return min(100, MathUtils::round_int(100.0 * m_TimeSize * (m_TimeFront - m_TimeBack) / DVD_TIME_BASE )); } int CDVDMessageQueue::GetTimeSize() const diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDOverlayContainer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDOverlayContainer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDOverlayContainer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDOverlayContainer.cpp 2015-10-19 08:38:33.000000000 +0000 @@ -172,8 +172,6 @@ { CSingleLock lock(*this); - pStream->CheckButtons(); - //Update any forced overlays. for(VecOverlays::iterator it = m_overlays.begin(); it != m_overlays.end(); ++it ) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -42,11 +42,13 @@ #define PROPDIVMAX 40.0 #define INTEGRAL 200.0 +using namespace std; + void CPTSInputQueue::Add(int64_t bytes, double pts) { CSingleLock lock(m_sync); - m_list.insert(m_list.begin(), std::make_pair(bytes, pts)); + m_list.insert(m_list.begin(), make_pair(bytes, pts)); } void CPTSInputQueue::Flush() @@ -181,7 +183,7 @@ m_synctype = SYNC_DISCON; m_setsynctype = SYNC_DISCON; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK)) + if (CSettings::Get().GetBool("videoplayer.usedisplayasclock")) m_setsynctype = SYNC_RESAMPLE; m_prevsynctype = -1; @@ -476,15 +478,15 @@ void CDVDPlayerAudio::UpdatePlayerInfo() { std::ostringstream s; - s << "aq:" << std::setw(2) << std::min(99,m_messageQueue.GetLevel() + MathUtils::round_int(100.0/8.0*m_dvdAudio.GetCacheTime())) << "%"; - s << ", Kb/s:" << std::fixed << std::setprecision(2) << (double)GetAudioBitrate() / 1024.0; + s << "aq:" << setw(2) << min(99,m_messageQueue.GetLevel() + MathUtils::round_int(100.0/8.0*m_dvdAudio.GetCacheTime())) << "%"; + s << ", Kb/s:" << fixed << setprecision(2) << (double)GetAudioBitrate() / 1024.0; //print the inverse of the resample ratio, since that makes more sense //if the resample ratio is 0.5, then we're playing twice as fast if (m_synctype == SYNC_RESAMPLE) - s << ", rr:" << std::fixed << std::setprecision(5) << 1.0 / m_resampleratio; + s << ", rr:" << fixed << setprecision(5) << 1.0 / m_resampleratio; - s << ", att:" << std::fixed << std::setprecision(1) << log(GetCurrentAttenuation()) * 20.0f << " dB"; + s << ", att:" << fixed << setprecision(1) << log(GetCurrentAttenuation()) * 20.0f << " dB"; SInfo info; info.info = s.str(); @@ -890,7 +892,7 @@ return true; } -std::string CDVDPlayerAudio::GetPlayerInfo() +string CDVDPlayerAudio::GetPlayerInfo() { CSingleLock lock(m_info_section); return m_info.info; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerAudio.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerAudio.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerAudio.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerAudio.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,16 +19,16 @@ */ #pragma once -#include -#include +#include "threads/Thread.h" #include "DVDAudio.h" #include "DVDClock.h" #include "DVDMessageQueue.h" #include "DVDStreamInfo.h" -#include "IDVDPlayer.h" -#include "threads/Thread.h" #include "utils/BitstreamStats.h" +#include "IDVDPlayer.h" + +#include class CDVDPlayer; class CDVDAudioCodec; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,6 @@ #include "system.h" #include "DVDPlayer.h" -#include "DVDPlayerRadioRDS.h" #include "DVDInputStreams/DVDInputStream.h" #include "DVDInputStreams/DVDFactoryInputStream.h" @@ -45,7 +44,7 @@ #include "guilib/GUIWindowManager.h" #include "guilib/StereoscopicsManager.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "DVDDemuxers/DVDDemuxCC.h" #ifdef HAS_VIDEO_PLAYBACK @@ -82,8 +81,8 @@ #endif #include "DVDPlayerAudio.h" +using namespace std; using namespace PVR; -using namespace KODI::MESSAGING; void CSelectionStreams::Clear(StreamType type, StreamSource source) { @@ -137,8 +136,6 @@ private: std::string audiolang; bool original; - bool nosub; - bool onlyforced; public: /** \brief The class' operator() decides if the given (subtitle) SelectionStream is relevant wrt. * preferred subtitle language and audio language. If the subtitle is relevant false false is returned. @@ -153,28 +150,15 @@ */ PredicateSubtitleFilter(std::string& lang) : audiolang(lang), - original(StringUtils::EqualsNoCase(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_SUBTITLELANGUAGE), "original")), - nosub(StringUtils::EqualsNoCase(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_SUBTITLELANGUAGE), "none")), - onlyforced(StringUtils::EqualsNoCase(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_SUBTITLELANGUAGE), "forced_only")) + original(StringUtils::EqualsNoCase(CSettings::Get().GetString("locale.subtitlelanguage"), "original")) { }; bool operator()(const SelectionStream& ss) const { - if (ss.type_index == CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleStream) + if (ss.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream) return false; - if (nosub) - return true; - - if (onlyforced) - { - if ((ss.flags & CDemuxStream::FLAG_FORCED) && g_LangCodeExpander.CompareISO639Codes(ss.language, audiolang)) - return false; - else - return true; - } - if(STREAM_SOURCE_MASK(ss.source) == STREAM_SOURCE_DEMUX_SUB || STREAM_SOURCE_MASK(ss.source) == STREAM_SOURCE_TEXT) return false; @@ -197,25 +181,25 @@ static bool PredicateAudioPriority(const SelectionStream& lh, const SelectionStream& rh) { - PREDICATE_RETURN(lh.type_index == CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioStream - , rh.type_index == CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioStream); + PREDICATE_RETURN(lh.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream + , rh.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream); - if(!StringUtils::EqualsNoCase(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_AUDIOLANGUAGE), "original")) + if(!StringUtils::EqualsNoCase(CSettings::Get().GetString("locale.audiolanguage"), "original")) { std::string audio_language = g_langInfo.GetAudioLanguage(); PREDICATE_RETURN(g_LangCodeExpander.CompareISO639Codes(audio_language, lh.language) , g_LangCodeExpander.CompareISO639Codes(audio_language, rh.language)); - bool hearingimp = CSettings::GetInstance().GetBool(CSettings::SETTING_ACCESSIBILITY_AUDIOHEARING); + bool hearingimp = CSettings::Get().GetBool("accessibility.audiohearing"); PREDICATE_RETURN(!hearingimp ? !(lh.flags & CDemuxStream::FLAG_HEARING_IMPAIRED) : lh.flags & CDemuxStream::FLAG_HEARING_IMPAIRED , !hearingimp ? !(rh.flags & CDemuxStream::FLAG_HEARING_IMPAIRED) : rh.flags & CDemuxStream::FLAG_HEARING_IMPAIRED); - bool visualimp = CSettings::GetInstance().GetBool(CSettings::SETTING_ACCESSIBILITY_AUDIOVISUAL); + bool visualimp = CSettings::Get().GetBool("accessibility.audiovisual"); PREDICATE_RETURN(!visualimp ? !(lh.flags & CDemuxStream::FLAG_VISUAL_IMPAIRED) : lh.flags & CDemuxStream::FLAG_VISUAL_IMPAIRED , !visualimp ? !(rh.flags & CDemuxStream::FLAG_VISUAL_IMPAIRED) : rh.flags & CDemuxStream::FLAG_VISUAL_IMPAIRED); } - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_PREFERDEFAULTFLAG)) + if (CSettings::Get().GetBool("videoplayer.preferdefaultflag")) { PREDICATE_RETURN(lh.flags & CDemuxStream::FLAG_DEFAULT , rh.flags & CDemuxStream::FLAG_DEFAULT); @@ -254,8 +238,8 @@ public: PredicateSubtitlePriority(std::string& lang) : audiolang(lang), - original(StringUtils::EqualsNoCase(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_SUBTITLELANGUAGE), "original")), - subson(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleOn), + original(StringUtils::EqualsNoCase(CSettings::Get().GetString("locale.subtitlelanguage"), "original")), + subson(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn), filter(lang) { }; @@ -270,8 +254,8 @@ PREDICATE_RETURN(relevant(lh) , relevant(rh)); - PREDICATE_RETURN(lh.type_index == CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleStream - , rh.type_index == CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleStream); + PREDICATE_RETURN(lh.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream + , rh.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream); // prefer external subs PREDICATE_RETURN(STREAM_SOURCE_MASK(lh.source) == STREAM_SOURCE_DEMUX_SUB || STREAM_SOURCE_MASK(lh.source) == STREAM_SOURCE_TEXT @@ -298,7 +282,7 @@ PREDICATE_RETURN(g_LangCodeExpander.CompareISO639Codes(subtitle_language, lh.language) , g_LangCodeExpander.CompareISO639Codes(subtitle_language, rh.language)); - bool hearingimp = CSettings::GetInstance().GetBool(CSettings::SETTING_ACCESSIBILITY_SUBHEARING); + bool hearingimp = CSettings::Get().GetBool("accessibility.subhearing"); PREDICATE_RETURN(!hearingimp ? !(lh.flags & CDemuxStream::FLAG_HEARING_IMPAIRED) : lh.flags & CDemuxStream::FLAG_HEARING_IMPAIRED , !hearingimp ? !(rh.flags & CDemuxStream::FLAG_HEARING_IMPAIRED) : rh.flags & CDemuxStream::FLAG_HEARING_IMPAIRED); } @@ -377,8 +361,6 @@ return IndexOf(type, p.m_CurrentSubtitle.source, p.m_CurrentSubtitle.id); else if(type == STREAM_TELETEXT) return IndexOf(type, p.m_CurrentTeletext.source, p.m_CurrentTeletext.id); - else if(type == STREAM_RADIO_RDS) - return IndexOf(type, p.m_CurrentRadioRDS.source, p.m_CurrentRadioRDS.id); return -1; } @@ -424,7 +406,7 @@ if(input && input->IsStreamType(DVDSTREAM_TYPE_DVD)) { CDVDInputStreamNavigator* nav = (CDVDInputStreamNavigator*)input; - std::string filename = nav->GetFileName(); + string filename = nav->GetFileName(); int source = Source(STREAM_SOURCE_NAV, filename); int count; @@ -466,7 +448,7 @@ } else if(demuxer) { - std::string filename = demuxer->GetFileName(); + string filename = demuxer->GetFileName(); int count = demuxer->GetNrOfStreams(); int source; if(input) /* hack to know this is sub decoder */ @@ -536,11 +518,10 @@ void CDVDPlayer::CreatePlayers() { #ifdef HAS_OMXPLAYER - bool omx_suitable = !OMXPlayerUnsuitable(m_HasVideo, m_HasAudio, m_pDemuxer, m_pInputStream, m_SelectionStreams); - if (m_omxplayer_mode != omx_suitable) + if (m_omxplayer_mode && OMXPlayerUnsuitable(m_HasVideo, m_HasAudio, m_pDemuxer, m_pInputStream, m_SelectionStreams)) { DestroyPlayers(); - m_omxplayer_mode = omx_suitable; + m_omxplayer_mode = false; } #endif if (m_players_created) @@ -560,7 +541,6 @@ } m_dvdPlayerSubtitle = new CDVDPlayerSubtitle(&m_overlayContainer); m_dvdPlayerTeletext = new CDVDTeletextData(); - m_dvdPlayerRadioRDS = new CDVDRadioRDSData(); m_players_created = true; } @@ -572,7 +552,6 @@ delete m_dvdPlayerAudio; delete m_dvdPlayerSubtitle; delete m_dvdPlayerTeletext; - delete m_dvdPlayerRadioRDS; m_players_created = false; } @@ -583,7 +562,6 @@ m_CurrentVideo(STREAM_VIDEO, DVDPLAYER_VIDEO), m_CurrentSubtitle(STREAM_SUBTITLE, DVDPLAYER_SUBTITLE), m_CurrentTeletext(STREAM_TELETEXT, DVDPLAYER_TELETEXT), - m_CurrentRadioRDS(STREAM_RADIO_RDS, DVDPLAYER_RDS), m_messenger("player"), m_ready(true), m_DemuxerPausePending(false) @@ -618,10 +596,10 @@ m_OmxPlayerState.bOmxWaitAudio = false; m_OmxPlayerState.bOmxSentEOFs = false; m_OmxPlayerState.threshold = 0.2f; - m_OmxPlayerState.current_deinterlace = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode; + m_OmxPlayerState.current_deinterlace = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; m_OmxPlayerState.interlace_method = VS_INTERLACEMETHOD_MAX; #ifdef HAS_OMXPLAYER - m_omxplayer_mode = CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEOMXPLAYER); + m_omxplayer_mode = CSettings::Get().GetBool("videoplayer.useomxplayer"); #else m_omxplayer_mode = false; #endif @@ -725,7 +703,6 @@ m_CurrentAudio.Clear(); m_CurrentSubtitle.Clear(); m_CurrentTeletext.Clear(); - m_CurrentRadioRDS.Clear(); m_messenger.Init(); @@ -747,7 +724,7 @@ m_filename = g_mediaManager.TranslateDevicePath(""); } - m_pInputStream = CDVDFactoryInputStream::CreateInputStream(this, m_filename, m_mimetype, m_item.ContentLookup()); + m_pInputStream = CDVDFactoryInputStream::CreateInputStream(this, m_filename, m_mimetype); if(m_pInputStream == NULL) { CLog::Log(LOGERROR, "CDVDPlayer::OpenInputStream - unable to create input stream for [%s]", m_filename.c_str()); @@ -756,7 +733,7 @@ else m_pInputStream->SetFileItem(m_item); - if (!m_pInputStream->Open(m_filename.c_str(), m_mimetype, m_item.ContentLookup())) + if (!m_pInputStream->Open(m_filename.c_str(), m_mimetype)) { CLog::Log(LOGERROR, "CDVDPlayer::OpenInputStream - error opening [%s]", m_filename.c_str()); return false; @@ -794,11 +771,11 @@ } } // end loop over all subtitle files - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleCached = true; + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleCached = true; } - SetAVDelay(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay); - SetSubTitleDelay(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay); + SetAVDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay); + SetSubTitleDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay); m_clock.Reset(); m_dvd.Clear(); m_errorCount = 0; @@ -885,7 +862,7 @@ CloseStream(m_CurrentAudio, true); // enable or disable subtitles - bool visible = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleOn; + bool visible = CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn; // open subtitle stream SelectionStream as = m_SelectionStreams.Get(STREAM_AUDIO, GetAudioStream()); @@ -920,17 +897,6 @@ } if(!valid) CloseStream(m_CurrentTeletext, false); - - // open RDS stream - streams = m_SelectionStreams.Get(STREAM_RADIO_RDS); - valid = false; - for(SelectionStreams::iterator it = streams.begin(); it != streams.end() && !valid; ++it) - { - if(OpenStream(m_CurrentRadioRDS, it->id, it->source)) - valid = true; - } - if(!valid) - CloseStream(m_CurrentRadioRDS, false); } bool CDVDPlayer::ReadPacket(DemuxPacket*& packet, CDemuxStream*& stream) @@ -1143,9 +1109,9 @@ if(m_PlayerOptions.state.size() > 0) ptr->SetState(m_PlayerOptions.state); else if(CDVDInputStreamNavigator* nav = dynamic_cast(m_pInputStream)) - nav->EnableSubtitleStream(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleOn); + nav->EnableSubtitleStream(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn); - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleCached = true; + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleCached = true; } if(!OpenDemuxStream()) @@ -1163,7 +1129,7 @@ { if (!m_OmxPlayerState.av_clock.OMXInitialize(&m_clock)) m_bAbortRequest = true; - if (CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE) != ADJUST_REFRESHRATE_OFF) + if (CSettings::Get().GetInt("videoplayer.adjustrefreshrate") != ADJUST_REFRESHRATE_OFF) m_OmxPlayerState.av_clock.HDMIClockSync(); m_OmxPlayerState.av_clock.OMXStateIdle(); m_OmxPlayerState.av_clock.OMXStateExecute(); @@ -1422,14 +1388,11 @@ m_dvdPlayerSubtitle->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); if(m_CurrentTeletext.inited) m_dvdPlayerTeletext->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); - if(m_CurrentRadioRDS.inited) - m_dvdPlayerRadioRDS->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); m_CurrentAudio.inited = false; m_CurrentVideo.inited = false; m_CurrentSubtitle.inited = false; m_CurrentTeletext.inited = false; - m_CurrentRadioRDS.inited = false; // if we are caching, start playing it again SetCaching(CACHESTATE_DONE); @@ -1456,7 +1419,6 @@ m_CurrentVideo.started = false; m_CurrentSubtitle.started = false; m_CurrentTeletext.started = false; - m_CurrentRadioRDS.started = false; break; } @@ -1469,10 +1431,9 @@ CheckBetterStream(m_CurrentVideo, pStream); CheckBetterStream(m_CurrentSubtitle, pStream); CheckBetterStream(m_CurrentTeletext, pStream); - CheckBetterStream(m_CurrentRadioRDS, pStream); // demux video stream - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SUBTITLES_PARSECAPTIONS) && CheckIsCurrent(m_CurrentVideo, pStream, pPacket)) + if (CSettings::Get().GetBool("subtitles.parsecaptions") && CheckIsCurrent(m_CurrentVideo, pStream, pPacket)) { if (m_pCCDemuxer) { @@ -1550,8 +1511,6 @@ ProcessSubData(pStream, pPacket); else if (CheckIsCurrent(m_CurrentTeletext, pStream, pPacket)) ProcessTeletextData(pStream, pPacket); - else if (CheckIsCurrent(m_CurrentRadioRDS, pStream, pPacket)) - ProcessRadioRDSData(pStream, pPacket); else { pStream->SetDiscard(AVDISCARD_ALL); @@ -1672,22 +1631,6 @@ m_dvdPlayerTeletext->SendMessage(new CDVDMsgDemuxerPacket(pPacket, drop)); } -void CDVDPlayer::ProcessRadioRDSData(CDemuxStream* pStream, DemuxPacket* pPacket) -{ - CheckStreamChanges(m_CurrentRadioRDS, pStream); - - UpdateTimestamps(m_CurrentRadioRDS, pPacket); - - bool drop = false; - if (CheckPlayerInit(m_CurrentRadioRDS)) - drop = true; - - if (CheckSceneSkip(m_CurrentRadioRDS)) - drop = true; - - m_dvdPlayerRadioRDS->SendMessage(new CDVDMsgDemuxerPacket(pPacket, drop)); -} - bool CDVDPlayer::GetCachingTimes(double& level, double& delay, double& offset) { if(!m_pInputStream || !m_pDemuxer) @@ -1918,7 +1861,7 @@ { error = (int)DVD_TIME_TO_MSEC(m_clock.GetClock()) - m_SpeedState.lastseekpts; - if(std::abs(error) > 1000) + if(abs(error) > 1000) { CLog::Log(LOGDEBUG, "CDVDPlayer::Process - Seeking to catch up"); m_SpeedState.lastseekpts = (int)DVD_TIME_TO_MSEC(m_clock.GetClock()); @@ -1993,8 +1936,6 @@ m_CurrentSubtitle.startpts = current.dts; if(m_CurrentTeletext.startpts != DVD_NOPTS_VALUE) m_CurrentTeletext.startpts = current.dts; - if(m_CurrentRadioRDS.startpts != DVD_NOPTS_VALUE) - m_CurrentRadioRDS.startpts = current.dts; } if(current.dts < current.startpts) @@ -2076,7 +2017,7 @@ /* send a playback state structure periodically */ if(current.dts_state == DVD_NOPTS_VALUE - || std::abs(current.dts - current.dts_state) > DVD_MSEC_TO_TIME(200)) + || abs(current.dts - current.dts_state) > DVD_MSEC_TO_TIME(200)) { current.dts_state = current.dts; if (current.inited) @@ -2128,7 +2069,8 @@ } /* if it's large scale jump, correct for it after having confirmed the jump */ - if(pPacket->dts + DVD_MSEC_TO_TIME(500) < current.dts_end()) + if(pPacket->dts + DVD_MSEC_TO_TIME(100) < current.dts_end() && + current.lastdts + DVD_MSEC_TO_TIME(100) < current.dts_end()) { CLog::Log(LOGDEBUG, "CDVDPlayer::CheckContinuity - resync backward :%d, prev:%f, curr:%f, diff:%f" , current.type, current.dts, pPacket->dts, pPacket->dts - current.dts); @@ -2204,7 +2146,7 @@ || m_CurrentVideo.dts == DVD_NOPTS_VALUE) return; - const int64_t clock = m_omxplayer_mode ? GetTime() : DVD_TIME_TO_MSEC(std::min(m_CurrentAudio.dts, m_CurrentVideo.dts) + m_offset_pts); + const int64_t clock = m_omxplayer_mode ? GetTime() : DVD_TIME_TO_MSEC(min(m_CurrentAudio.dts, m_CurrentVideo.dts) + m_offset_pts); CEdl::Cut cut; if(!m_Edl.InCut(clock, &cut)) @@ -2297,8 +2239,6 @@ return m_dvdPlayerSubtitle; if(target == DVDPLAYER_TELETEXT) return m_dvdPlayerTeletext; - if(target == DVDPLAYER_RDS) - return m_dvdPlayerRadioRDS; return NULL; } @@ -2328,7 +2268,6 @@ CloseStream(m_CurrentSubtitle, false); // clear overlay container CloseStream(m_CurrentTeletext, !m_bAbortRequest); - CloseStream(m_CurrentRadioRDS, !m_bAbortRequest); // destroy objects SAFE_DELETE(m_pDemuxer); @@ -2625,12 +2564,12 @@ #ifdef HAS_VIDEO_PLAYBACK // when using fast channel switching some shortcuts are taken which // means we'll have to update the view mode manually - g_renderManager.SetViewMode(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode); + g_renderManager.SetViewMode(CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); #endif }else { CLog::Log(LOGWARNING, "%s - failed to switch channel. playback stopped", __FUNCTION__); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_STOP); + CApplicationMessenger::Get().MediaStop(false); } } else if (pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_SELECT) && m_messenger.GetPacketCount(CDVDMsg::PLAYER_CHANNEL_SELECT) == 0) @@ -2644,19 +2583,16 @@ }else { CLog::Log(LOGWARNING, "%s - failed to switch channel. playback stopped", __FUNCTION__); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_STOP); + CApplicationMessenger::Get().MediaStop(false); } } - else if (pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_NEXT) || pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_PREV) || - pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_PREVIEW_NEXT) || pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_PREVIEW_PREV)) + else if (pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_NEXT) || pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_PREV)) { CDVDInputStream::IChannel* input = dynamic_cast(m_pInputStream); - if (input) + if(input) { bool bSwitchSuccessful(false); - bool bShowPreview(pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_PREVIEW_NEXT) || - pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_PREVIEW_PREV) || - CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPLAYBACK_CHANNELENTRYTIMEOUT) > 0); + bool bShowPreview(CSettings::Get().GetInt("pvrplayback.channelentrytimeout") > 0); if (!bShowPreview) { @@ -2664,21 +2600,17 @@ FlushBuffers(false); } - if (pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_NEXT) || pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_PREVIEW_NEXT)) + if(pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_NEXT)) bSwitchSuccessful = input->NextChannel(bShowPreview); else bSwitchSuccessful = input->PrevChannel(bShowPreview); - if (bSwitchSuccessful) + if(bSwitchSuccessful) { if (bShowPreview) { UpdateApplication(0); - - if (pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_PREVIEW_NEXT) || pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_PREVIEW_PREV)) - m_ChannelEntryTimeOut.SetInfinite(); - else - m_ChannelEntryTimeOut.Set(CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPLAYBACK_CHANNELENTRYTIMEOUT)); + m_ChannelEntryTimeOut.Set(CSettings::Get().GetInt("pvrplayback.channelentrytimeout")); } else { @@ -2690,14 +2622,14 @@ #ifdef HAS_VIDEO_PLAYBACK // when using fast channel switching some shortcuts are taken which // means we'll have to update the view mode manually - g_renderManager.SetViewMode(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode); + g_renderManager.SetViewMode(CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); #endif } } else { CLog::Log(LOGWARNING, "%s - failed to switch channel. playback stopped", __FUNCTION__); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_STOP); + CApplicationMessenger::Get().MediaStop(false); } } } @@ -2792,7 +2724,7 @@ m_dvdPlayerVideo->SendMessage(new CDVDMsg(CDVDMsg::PLAYER_STARTED), 1); if (state == CACHESTATE_PVR) - m_pInputStream->ResetScanTimeout((unsigned int) CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPLAYBACK_SCANTIME) * 1000); + m_pInputStream->ResetScanTimeout((unsigned int) CSettings::Get().GetInt("pvrplayback.scantime") * 1000); } if(state == CACHESTATE_PLAY @@ -2869,11 +2801,6 @@ return m_HasAudio; } -bool CDVDPlayer::HasRDS() const -{ - return m_CurrentRadioRDS.id >= 0; -} - bool CDVDPlayer::IsPassthrough() const { return m_dvdPlayerAudio->IsPassthrough(); @@ -2895,7 +2822,7 @@ if (!m_State.canseek) return; - if (bLargeStep && bChapterOverride && GetChapter() > 0 && GetChapterCount() > 1) + if (bLargeStep && bChapterOverride && GetChapter() > 0) { if (!bPlus) { @@ -3245,14 +3172,6 @@ return m_dvdPlayerTeletext->LoadPage(p, sp, buffer); } -std::string CDVDPlayer::GetRadioText(unsigned int line) -{ - if (m_CurrentRadioRDS.id < 0) - return ""; - - return m_dvdPlayerRadioRDS->GetRadioText(line); -} - void CDVDPlayer::SeekTime(int64_t iTime) { int seekOffset = (int)(iTime - GetTime()); @@ -3345,7 +3264,7 @@ if(!m_pSubtitleDemuxer || m_pSubtitleDemuxer->GetFileName() != st.filename) { CLog::Log(LOGNOTICE, "Opening Subtitle file: %s", st.filename.c_str()); - std::unique_ptr demux(new CDVDDemuxVobsub()); + unique_ptr demux(new CDVDDemuxVobsub()); if(!demux->Open(st.filename, source, st.filename2)) return false; m_pSubtitleDemuxer = demux.release(); @@ -3419,9 +3338,6 @@ case STREAM_TELETEXT: res = OpenTeletextStream(hint); break; - case STREAM_RADIO_RDS: - res = OpenRadioRDSStream(hint); - break; default: res = false; break; @@ -3508,7 +3424,7 @@ // set framerate if not set by demuxer if (hint.fpsrate == 0 || hint.fpsscale == 0) { - int fpsidx = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPLAYBACK_FPS); + int fpsidx = CSettings::Get().GetInt("pvrplayback.fps"); if (fpsidx == 1) { hint.fpsscale = 1000; @@ -3527,7 +3443,7 @@ hint.stills = true; if (hint.stereo_mode.empty()) - hint.stereo_mode = CStereoscopicsManager::GetInstance().DetectStereoModeByString(m_filename); + hint.stereo_mode = CStereoscopicsManager::Get().DetectStereoModeByString(m_filename); if(hint.flags & AV_DISPOSITION_ATTACHED_PIC) return false; @@ -3599,17 +3515,6 @@ return true; } -bool CDVDPlayer::OpenRadioRDSStream(CDVDStreamInfo& hint) -{ - if (!m_dvdPlayerRadioRDS->CheckStream(hint)) - return false; - - if(!OpenStreamPlayer(m_CurrentRadioRDS, hint, true)) - return false; - - return true; -} - bool CDVDPlayer::CloseStream(CCurrentStream& current, bool bWaitForBuffers) { if (current.id < 0) @@ -3687,10 +3592,6 @@ m_CurrentTeletext.dts = DVD_NOPTS_VALUE; m_CurrentTeletext.startpts = startpts; - m_CurrentRadioRDS.inited = false; - m_CurrentRadioRDS.dts = DVD_NOPTS_VALUE; - m_CurrentRadioRDS.startpts = startpts; - if(queued) { m_dvdPlayerAudio->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_RESET)); @@ -3698,7 +3599,6 @@ m_dvdPlayerVideo->SendMessage(new CDVDMsg(CDVDMsg::VIDEO_NOSKIP)); m_dvdPlayerSubtitle->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_RESET)); m_dvdPlayerTeletext->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_RESET)); - m_dvdPlayerRadioRDS->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_RESET)); SynchronizePlayers(SYNCSOURCE_ALL); } else @@ -3707,7 +3607,6 @@ m_dvdPlayerVideo->Flush(); m_dvdPlayerSubtitle->Flush(); m_dvdPlayerTeletext->Flush(); - m_dvdPlayerRadioRDS->Flush(); // clear subtitle and menu overlays m_overlayContainer.Clear(); @@ -3731,7 +3630,6 @@ m_CurrentVideo.started = false; m_CurrentSubtitle.started = false; m_CurrentTeletext.started = false; - m_CurrentRadioRDS.started = false; } if(pts != DVD_NOPTS_VALUE && sync) @@ -3988,9 +3886,9 @@ { bool bReturn(false); - if (CSettings::GetInstance().GetInt(CSettings::SETTING_PVRMENU_DISPLAYCHANNELINFO) > 0) + if (CSettings::Get().GetInt("pvrmenu.displaychannelinfo") > 0) { - g_PVRManager.ShowPlayerInfo(CSettings::GetInstance().GetInt(CSettings::SETTING_PVRMENU_DISPLAYCHANNELINFO)); + g_PVRManager.ShowPlayerInfo(CSettings::Get().GetInt("pvrmenu.displaychannelinfo")); bReturn = true; } @@ -4145,7 +4043,7 @@ return true; else { - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_TRIGGER_OSD))); + CApplicationMessenger::Get().SendAction(CAction(ACTION_TRIGGER_OSD), WINDOW_INVALID, false); // Trigger the osd return false; } } @@ -4196,44 +4094,20 @@ case ACTION_MOVE_UP: case ACTION_NEXT_ITEM: case ACTION_CHANNEL_UP: - { - bool bPreview(action.GetID() == ACTION_MOVE_UP && // only up/down shows a preview, all others do switch - CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPLAYBACK_CONFIRMCHANNELSWITCH)); - - if (bPreview) - m_messenger.Put(new CDVDMsg(CDVDMsg::PLAYER_CHANNEL_PREVIEW_NEXT)); - else - { - m_messenger.Put(new CDVDMsg(CDVDMsg::PLAYER_CHANNEL_NEXT)); - - if (CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPLAYBACK_CHANNELENTRYTIMEOUT) == 0) - g_infoManager.SetDisplayAfterSeek(); - } - + m_messenger.Put(new CDVDMsg(CDVDMsg::PLAYER_CHANNEL_NEXT)); + g_infoManager.SetDisplayAfterSeek(); ShowPVRChannelInfo(); return true; - } + break; case ACTION_MOVE_DOWN: case ACTION_PREV_ITEM: case ACTION_CHANNEL_DOWN: - { - bool bPreview(action.GetID() == ACTION_MOVE_DOWN && // only up/down shows a preview, all others do switch - CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPLAYBACK_CONFIRMCHANNELSWITCH)); - - if (bPreview) - m_messenger.Put(new CDVDMsg(CDVDMsg::PLAYER_CHANNEL_PREVIEW_PREV)); - else - { - m_messenger.Put(new CDVDMsg(CDVDMsg::PLAYER_CHANNEL_PREV)); - - if (CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPLAYBACK_CHANNELENTRYTIMEOUT) == 0) - g_infoManager.SetDisplayAfterSeek(); - } - + m_messenger.Put(new CDVDMsg(CDVDMsg::PLAYER_CHANNEL_PREV)); + g_infoManager.SetDisplayAfterSeek(); ShowPVRChannelInfo(); return true; - } + break; case ACTION_CHANNEL_SWITCH: { @@ -4370,7 +4244,7 @@ { int a = m_dvdPlayerAudio->GetLevel(); int v = m_dvdPlayerVideo->GetLevel(); - return std::max(a, v) * 8000.0 / 100; + return max(a, v) * 8000.0 / 100; } void CDVDPlayer::GetVideoStreamInfo(SPlayerVideoStreamInfo &info) @@ -4486,7 +4360,7 @@ stream.flags = static_cast(info.flag); } - return m_SelectionStreams.IndexOf(STREAM_SUBTITLE, m_SelectionStreams.Source(STREAM_SOURCE_DEMUX_SUB, filename), 0); + return m_SelectionStreams.IndexOf(STREAM_SUBTITLE, m_SelectionStreams.Source(STREAM_SOURCE_DEMUX_SUB, filename), 0);; } if(ext == ".sub") { @@ -4641,14 +4515,14 @@ double level, delay, offset; if(GetCachingTimes(level, delay, offset)) { - state.cache_delay = std::max(0.0, delay); - state.cache_level = std::max(0.0, std::min(1.0, level)); + state.cache_delay = max(0.0, delay); + state.cache_level = max(0.0, min(1.0, level)); state.cache_offset = offset; } else { state.cache_delay = 0.0; - state.cache_level = std::min(1.0, GetQueueTime() / 8000.0); + state.cache_level = min(1.0, GetQueueTime() / 8000.0); state.cache_offset = GetQueueTime() / state.time_total; } @@ -4683,7 +4557,7 @@ if(pStream->UpdateItem(item)) { g_application.CurrentFileItem() = item; - CApplicationMessenger::GetInstance().PostMsg(TMSG_UPDATE_CURRENT_ITEM, 0, -1, static_cast(new CFileItem(item))); + CApplicationMessenger::Get().SetCurrentItem(item); } } m_UpdateApplication = CDVDClock::GetAbsoluteClock(); @@ -4762,9 +4636,6 @@ bool CDVDPlayer::SwitchChannel(const CPVRChannelPtr &channel) { - if (g_PVRManager.IsPlayingChannel(channel)) - return false; // desired channel already active, nothing to do. - if (!g_PVRManager.CheckParentalLock(channel)) return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayer.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayer.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayer.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayer.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,22 +20,21 @@ * */ -#include - #include "cores/IPlayer.h" -#include "DVDClock.h" +#include "threads/Thread.h" + +#include "IDVDPlayer.h" + #include "DVDMessageQueue.h" -#include "DVDPlayerRadioRDS.h" +#include "DVDClock.h" +#include "DVDPlayerVideo.h" #include "DVDPlayerSubtitle.h" #include "DVDPlayerTeletext.h" -#include "DVDPlayerVideo.h" + #include "Edl.h" #include "FileItem.h" -#include "IDVDPlayer.h" -#include "system.h" -#include "threads/SystemClock.h" -#include "threads/Thread.h" #include "utils/StreamDetails.h" +#include "threads/SystemClock.h" #ifdef HAS_OMXPLAYER #include "OMXCore.h" @@ -43,7 +42,6 @@ #include "linux/RBP.h" #else - // dummy class to avoid ifdefs where calls are made class OMXClock { @@ -211,7 +209,6 @@ #define DVDPLAYER_VIDEO 2 #define DVDPLAYER_SUBTITLE 3 #define DVDPLAYER_TELETEXT 4 -#define DVDPLAYER_RDS 5 class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer { @@ -225,7 +222,6 @@ virtual bool IsPaused() const; virtual bool HasVideo() const; virtual bool HasAudio() const; - virtual bool HasRDS() const; virtual bool IsPassthrough() const; virtual bool CanSeek(); virtual void Seek(bool bPlus, bool bLargeStep, bool bChapterOverride); @@ -264,8 +260,6 @@ virtual TextCacheStruct_t* GetTeletextCache(); virtual void LoadPage(int p, int sp, unsigned char* buffer); - virtual std::string GetRadioText(unsigned int line); - virtual int GetChapterCount(); virtual int GetChapter(); virtual void GetChapterName(std::string& strChapterName, int chapterIdx=-1); @@ -326,7 +320,6 @@ bool OpenVideoStream(CDVDStreamInfo& hint, bool reset = true); bool OpenSubtitleStream(CDVDStreamInfo& hint); bool OpenTeletextStream(CDVDStreamInfo& hint); - bool OpenRadioRDSStream(CDVDStreamInfo& hint); /** \brief Switches forced subtitles to forced subtitles matching the language of the current audio track. * If these are not available, subtitles are disabled. @@ -341,7 +334,6 @@ void ProcessVideoData(CDemuxStream* pStream, DemuxPacket* pPacket); void ProcessSubData(CDemuxStream* pStream, DemuxPacket* pPacket); void ProcessTeletextData(CDemuxStream* pStream, DemuxPacket* pPacket); - void ProcessRadioRDSData(CDemuxStream* pStream, DemuxPacket* pPacket); bool ShowPVRChannelInfo(); @@ -410,7 +402,6 @@ CCurrentStream m_CurrentVideo; CCurrentStream m_CurrentSubtitle; CCurrentStream m_CurrentTeletext; - CCurrentStream m_CurrentRadioRDS; CSelectionStreams m_SelectionStreams; @@ -432,7 +423,6 @@ IDVDStreamPlayerAudio *m_dvdPlayerAudio; // audio part CDVDPlayerSubtitle *m_dvdPlayerSubtitle; // subtitle part CDVDTeletextData *m_dvdPlayerTeletext; // teletext part - CDVDRadioRDSData *m_dvdPlayerRadioRDS; // rds part CDVDClock m_clock; // master clock CDVDOverlayContainer m_overlayContainer; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1750 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this Software; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html - * - */ - -//#define RDS_IMPROVE_CHECK 1 - -/* - * The RDS decoder bases partly on the source of the VDR radio plugin. - * http://www.egal-vdr.de/plugins/ - * and reworked a bit with references from SPB 490, IEC62106 - * and several other documents. - * - * A lot more information is sendet which is currently unused and partly - * not required. - */ - -#include "Application.h" -#include "DVDClock.h" -#include "DVDStreamInfo.h" -#include "GUIInfoManager.h" -#include "GUIUserMessages.h" -#include "DVDCodecs/DVDCodecs.h" -#include "DVDCodecs/DVDFactoryCodec.h" -#include "DVDCodecs/Video/DVDVideoCodecFFmpeg.h" -#include "DVDDemuxers/DVDDemuxUtils.h" -#include "DVDDemuxers/DVDFactoryDemuxer.h" -#include "DVDInputStreams/DVDInputStream.h" -#include "DVDInputStreams/DVDFactoryInputStream.h" -#include "cores/FFmpeg.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "filesystem/SpecialProtocol.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "interfaces/AnnouncementManager.h" -#include "messaging/ApplicationMessenger.h" -#include "music/tags/MusicInfoTag.h" -#include "pictures/Picture.h" -#include "pvr/channels/PVRChannel.h" -#include "pvr/channels/PVRRadioRDSInfoTag.h" -#include "settings/Settings.h" -#include "threads/SingleLock.h" -#include "utils/CharsetConverter.h" -#include "utils/StringUtils.h" -#include "utils/log.h" - -#include "DVDPlayerRadioRDS.h" - -using namespace XFILE; -using namespace PVR; -using namespace KODI::MESSAGING; - -/** - * Universal Encoder Communication Protocol (UECP) - * List of defined commands - * iaw.: SPB 490 - */ - -/// UECP Message element pointers (different on several commands) -#define UECP_ME_MEC 0 // Message Element Code -#define UECP_ME_DSN 1 // Data Set Number -#define UECP_ME_PSN 2 // Program Service Number -#define UECP_ME_MEL 3 // Message Element data Length -#define UECP_ME_DATA 4 // - -/// RDS message commands -#define UECP_RDS_PI 0x01 // Program Identification -#define UECP_RDS_PS 0x02 // Program Service name -#define UECP_RDS_PIN 0x06 // Program Item Number -#define UECP_RDS_DI 0x04 // Decoder Identification and dynamic PTY indicator -#define UECP_RDS_TA_TP 0x03 // Traffic Announcement identification / Traffic Program identification -#define UECP_RDS_MS 0x05 // Music/Speech switch -#define UECP_RDS_PTY 0x07 // Program TYpe -#define UECP_RDS_PTYN 0x3A // Program TYpe Name -#define UECP_RDS_RT 0x0A // RadioText -#define UECP_RDS_AF 0x13 // Alternative Frequencies list -#define UECP_RDS_EON_AF 0x14 // Enhanced Other Networks information -#define UECP_SLOW_LABEL_CODES 0x1A // Slow Labeling codes -#define UECP_LINKAGE_INFO 0x2E // Linkage information - -/// Open Data Application commands -#define UECP_ODA_CONF_SHORT_MSG_CMD 0x40 // ODA configuration and short message command -#define UECP_ODA_IDENT_GROUP_USAGE_SEQ 0x41 // ODA identification group usage sequence -#define UECP_ODA_FREE_FORMAT_GROUP 0x42 // ODA free-format group -#define UECP_ODA_REL_PRIOR_GROUP_SEQ 0x43 // ODA relative priority group sequence -#define UECP_ODA_BURST_MODE_CONTROL 0x44 // ODA “Burst mode” control -#define UECP_ODA_SPINN_WHEEL_TIMING_CTL 0x45 // ODA “Spinning Wheel” timing control -#define UECP_ODA_DATA 0x46 // ODA Data -#define UECP_ODA_DATA_CMD_ACCESS_RIGHT 0x47 // ODA data command access right - -/// DAB -#define UECP_DAB_DYN_LABEL_CMD 0x48 // DAB: Dynamic Label command -#define UECP_DAB_DYN_LABEL_MSG 0xAA // DAB: Dynamic Label message (DL) - -/// Transparent data commands -#define UECP_TDC_TDC 0x26 // TDC -#define UECP_TDC_EWS 0x2B // EWS -#define UECP_TDC_IH 0x25 // IH -#define UECP_TDC_TMC 0x30 // TMC -#define UECP_TDC_FREE_FMT_GROUP 0x24 // Free-format group - -/// Paging commands -#define UECP_PAGING_CALL_WITHOUT_MESSAGE 0x0C -#define UECP_PAGING_CALL_NUMERIC_MESSAGE_10DIGITS 0x08 -#define UECP_PAGING_CALL_NUMERIC_MESSAGE_18DIGITS 0x20 -#define UECP_PAGING_CALL_ALPHANUMERIC_MESSAGE_80CHARACTERS 0x1B -#define UECP_INTERNATIONAL_PAGING_NUMERIC_MESSAGE_15DIGITS 0x11 -#define UECP_INTERNATIONAL_PAGING_FUNCTIONS_MESSAGE 0x10 -#define UECP_TRANSMITTER_NETWORK_GROUP_DESIGNATION 0x12 -#define UECP_EPP_TM_INFO 0x31 -#define UECP_EPP_CALL_WITHOUT_ADDITIONAL_MESSAGE 0x32 -#define UECP_EPP_NATIONAL_INTERNATIONAL_CALL_ALPHANUMERIC_MESSAGE 0x33 -#define UECP_EPP_NATIONAL_INTERNATIONAL_CALL_VARIABLE_LENGTH_NUMERIC_MESSAGE 0x34 -#define UECP_EPP_NATIONAL_INTERNATIONAL_CALL_VARIABLE_LENGTH_FUNCTIONS_MESSAGE 0x35 - -/// Clock setting and control -#define UECP_CLOCK_RTC 0x0D // Real time clock -#define UECP_CLOCK_RTC_CORR 0x09 // Real time clock correction -#define UECP_CLOCK_CT_ON_OFF 0x19 // CT On/Off - -/// RDS adjustment and control -#define RDS_ON_OFF 0x1E -#define RDS_PHASE 0x22 -#define RDS_LEVEL 0x0E - -/// ARI adjustment and control -#define UECP_ARI_ARI_ON_OFF 0x21 -#define UECP_ARI_ARI_AREA (BK) 0x0F -#define UECP_ARI_ARI_LEVEL 0x1F - -/// Control and set up commands -#define UECP_CTR_SITE_ADDRESS 0x23 -#define UECP_CTR_ENCODER_ADDRESS 0x27 -#define UECP_CTR_MAKE_PSN_LIST 0x28 -#define UECP_CTR_PSN_ENABLE_DISABLE 0x0B -#define UECP_CTR_COMMUNICATION_MODE 0x2C -#define UECP_CTR_TA_CONTROL 0x2A -#define UECP_CTR_EON_TA_CONTROL 0x15 -#define UECP_CTR_REFERENCE_INPUT_SEL 0x1D -#define UECP_CTR_DATA_SET_SELECT 0x1C // Data set select -#define UECP_CTR_GROUP_SEQUENCE 0x16 -#define UECP_CTR_GROUP_VAR_CODE_SEQ 0x29 -#define UECP_CTR_EXTENDED_GROUP_SEQ 0x38 -#define UECP_CTR_PS_CHAR_CODE_TBL_SEL 0x2F -#define UECP_CTR_ENCODER_ACCESS_RIGHT 0x3A -#define UECP_CTR_COM_PORT_CONF_MODE 0x3B -#define UECP_CTR_COM_PORT_CONF_SPEED 0x3C -#define UECP_CTR_COM_PORT_CONF_TMEOUT 0x3D - -/// Other commands -#define UECP_OTHER_RASS 0xda - -/// Bi-directional commands (Remote and configuration commands) -#define BIDIR_MESSAGE_ACKNOWLEDGMENT 0x18 -#define BIDIR_REQUEST_MESSAGE 0x17 - -/// Specific message commands -#define SPEC_MFG_SPECIFIC_CMD 0x2D - -/** - * RDS and RBDS relevant - */ - -/// RDS Programm type id's -enum { - RDS_PTY_NONE = 0, - RDS_PTY_NEWS, - RDS_PTY_CURRENT_AFFAIRS, - RDS_PTY_INFORMATION, - RDS_PTY_SPORT, - RDS_PTY_EDUCATION, - RDS_PTY_DRAMA, - RDS_PTY_CULTURE, - RDS_PTY_SCIENCE, - RDS_PTY_VARIED, - RDS_PTY_POP_MUSIC, - RDS_PTY_ROCK_MUSIC, - RDS_PTY_MOR_MUSIC, - RDS_PTY_LIGHT_CLASSICAL, - RDS_PTY_SERIOUS_CLASSICAL, - RDS_PTY_OTHER_MUSIC, - RDS_PTY_WEATHER, - RDS_PTY_FINANCE, - RDS_PTY_CHILDRENS_PROGRAMMES, - RDS_PTY_SOCIAL_AFFAIRS, - RDS_PTY_RELIGION, - RDS_PTY_PHONE_IN, - RDS_PTY_TRAVEL, - RDS_PTY_LEISURE, - RDS_PTY_JAZZ_MUSIC, - RDS_PTY_COUNTRY_MUSIC, - RDS_PTY_NATIONAL_MUSIC, - RDS_PTY_OLDIES_MUSIC, - RDS_PTY_FOLK_MUSIC, - RDS_PTY_DOCUMENTARY, - RDS_PTY_ALARM_TEST, - RDS_PTY_ALARM -}; - -/// RBDS Programm type id's -enum { - RBDS_PTY_NONE = 0, - RBDS_PTY_NEWS, - RBDS_PTY_INFORMATION, - RBDS_PTY_SPORT, - RBDS_PTY_TALK, - RBDS_PTY_ROCK_MUSIC, - RBDS_PTY_CLASSIC_ROCK_MUSIC, - RBDS_PTY_ADULT_HITS, - RBDS_PTY_SOFT_ROCK, - RBDS_PTY_TOP_40, - RBDS_PTY_COUNTRY, - RBDS_PTY_OLDIES, - RBDS_PTY_SOFT, - RBDS_PTY_NOSTALGIA, - RBDS_PTY_JAZZ, - RBDS_PTY_CLASSICAL, - RBDS_PTY_R__B, - RBDS_PTY_SOFT_R__B, - RBDS_PTY_LANGUAGE, - RBDS_PTY_RELIGIOUS_MUSIC, - RBDS_PTY_RELIGIOUS_TALK, - RBDS_PTY_PERSONALITY, - RBDS_PTY_PUBLIC, - RBDS_PTY_COLLEGE, - RBDS_PTY_WEATHER = 29, - RBDS_PTY_EMERGENCY_TEST, - RBDS_PTY_EMERGENCY -}; - -/// RadioText+ message type id's -enum { - RTPLUS_DUMMY_CLASS = 0, - - RTPLUS_ITEM_TITLE = 1, - RTPLUS_ITEM_ALBUM = 2, - RTPLUS_ITEM_TRACKNUMBER = 3, - RTPLUS_ITEM_ARTIST = 4, - RTPLUS_ITEM_COMPOSITION = 5, - RTPLUS_ITEM_MOVEMENT = 6, - RTPLUS_ITEM_CONDUCTOR = 7, - RTPLUS_ITEM_COMPOSER = 8, - RTPLUS_ITEM_BAND = 9, - RTPLUS_ITEM_COMMENT = 10, - RTPLUS_ITEM_GENRE = 11, - - RTPLUS_INFO_NEWS = 12, - RTPLUS_INFO_NEWS_LOCAL = 13, - RTPLUS_INFO_STOCKMARKET = 14, - RTPLUS_INFO_SPORT = 15, - RTPLUS_INFO_LOTTERY = 16, - RTPLUS_INFO_HOROSCOPE = 17, - RTPLUS_INFO_DAILY_DIVERSION = 18, - RTPLUS_INFO_HEALTH = 19, - RTPLUS_INFO_EVENT = 20, - RTPLUS_INFO_SZENE = 21, - RTPLUS_INFO_CINEMA = 22, - RTPLUS_INFO_STUPIDITY_MACHINE = 23, - RTPLUS_INFO_DATE_TIME = 24, - RTPLUS_INFO_WEATHER = 25, - RTPLUS_INFO_TRAFFIC = 26, - RTPLUS_INFO_ALARM = 27, - RTPLUS_INFO_ADVERTISEMENT = 28, - RTPLUS_INFO_URL = 29, - RTPLUS_INFO_OTHER = 30, - - RTPLUS_STATIONNAME_SHORT = 31, - RTPLUS_STATIONNAME_LONG = 32, - - RTPLUS_PROGRAMME_NOW = 33, - RTPLUS_PROGRAMME_NEXT = 34, - RTPLUS_PROGRAMME_PART = 35, - RTPLUS_PROGRAMME_HOST = 36, - RTPLUS_PROGRAMME_EDITORIAL_STAFF = 37, - RTPLUS_PROGRAMME_FREQUENCY= 38, - RTPLUS_PROGRAMME_HOMEPAGE = 39, - RTPLUS_PROGRAMME_SUBCHANNEL = 40, - - RTPLUS_PHONE_HOTLINE = 41, - RTPLUS_PHONE_STUDIO = 42, - RTPLUS_PHONE_OTHER = 43, - - RTPLUS_SMS_STUDIO = 44, - RTPLUS_SMS_OTHER = 45, - - RTPLUS_EMAIL_HOTLINE = 46, - RTPLUS_EMAIL_STUDIO = 47, - RTPLUS_EMAIL_OTHER = 48, - - RTPLUS_MMS_OTHER = 49, - - RTPLUS_CHAT = 50, - RTPLUS_CHAT_CENTER = 51, - - RTPLUS_VOTE_QUESTION = 52, - RTPLUS_VOTE_CENTER = 53, - - RTPLUS_PLACE = 59, - RTPLUS_APPOINTMENT = 60, - RTPLUS_IDENTIFIER = 61, - RTPLUS_PURCHASE = 62, - RTPLUS_GET_DATA = 63 -}; - -/* page 71, Annex D, table D.1 in the standard and Annex N */ -static const char *piCountryCodes_A[15][7]= -{ - // 0 1 2 3 4 5 6 - {"US","__","AI","BO","GT","__","__"}, // 1 - {"US","__","AG","CO","HN","__","__"}, // 2 - {"US","__","EC","JM","AW","__","__"}, // 3 - {"US","__","FK","MQ","__","__","__"}, // 4 - {"US","__","BB","GF","MS","__","__"}, // 5 - {"US","__","BZ","PY","TT","__","__"}, // 6 - {"US","__","KY","NI","PE","__","__"}, // 7 - {"US","__","CR","__","SR","__","__"}, // 8 - {"US","__","CU","PA","UY","__","__"}, // 9 - {"US","__","AR","DM","KN","__","__"}, // A - {"US","CA","BR","DO","LC","MX","__"}, // B - {"__","CA","BM","CL","SV","VC","__"}, // C - {"US","CA","AN","GD","HT","MX","__"}, // D - {"US","CA","GP","TC","VE","MX","__"}, // E - {"__","GL","BS","GY","__","VG","PM"} // F -}; - -static const char *piCountryCodes_D[15][7]= -{ - // 0 1 2 3 4 5 6 - {"CM","NA","SL","__","__","__","__"}, // 1 - {"CF","LR","ZW","__","__","__","__"}, // 2 - {"DJ","GH","MZ","EH","__","__","__"}, // 3 - {"MG","MR","UG","xx","__","__","__"}, // 4 - {"ML","ST","SZ","RW","__","__","__"}, // 5 - {"AO","CV","KE","LS","__","__","__"}, // 6 - {"GQ","SN","SO","__","__","__","__"}, // 7 - {"GA","GM","NE","SC","__","__","__"}, // 8 - {"GN","BI","TD","__","__","__","__"}, // 9 - {"ZA","AC","GW","MU","__","__","__"}, // A - {"BF","BW","ZR","__","__","__","__"}, // B - {"CG","KM","CI","SD","__","__","__"}, // C - {"TG","TZ","Zanzibar","__","__","__","__"}, // D - {"BJ","ET","ZM","__","__","__","__"}, // E - {"MW","NG","__","__","__","__","__"} // F -}; - -static const char *piCountryCodes_E[15][7]= -{ - // 0 1 2 3 4 5 6 - {"DE","GR","MA","__","MD","__","__"}, - {"DZ","CY","CZ","IE","EE","__","__"}, - {"AD","SM","PL","TR","KG","__","__"}, - {"IL","CH","VA","MK","__","__","__"}, - {"IT","JO","SK","TJ","__","__","__"}, - {"BE","FI","SY","__","UA","__","__"}, - {"RU","LU","TN","__","__","__","__"}, - {"PS","BG","__","NL","PT","__","__"}, - {"AL","DK","LI","LV","SI","__","__"}, // 9 - {"AT","GI","IS","LB","AM","__","__"}, // A - {"HU","IQ","MC","AZ","UZ","__","__"}, // B - {"MT","GB","LT","HR","GE","__","__"}, // C - {"DE","LY","YU","KZ","__","__","__"}, // D - {"__","RO","ES","SE","TM","__","__"}, // E - {"EG","FR","NO","BY","BA","__","__"} // F -}; - -static const char *piCountryCodes_F[15][7]= -{ - // 0 1 2 3 4 5 6 - {"AU","KI","KW","LA","__","__","__"}, // 1 - {"AU","BT","QA","TH","__","__","__"}, // 2 - {"AU","BD","KH","TO","__","__","__"}, // 3 - {"AU","PK","WS","__","__","__","__"}, // 4 - {"AU","FJ","IN","__","__","__","__"}, // 5 - {"AU","OM","MO","__","__","__","__"}, // 6 - {"AU","NR","VN","__","__","__","__"}, // 7 - {"AU","IR","PH","__","__","__","__"}, // 8 - {"SA","NZ","JP","PG","__","__","__"}, // 9 - {"AF","SB","SG","__","__","__","__"}, // A - {"MM","BN","MV","YE","__","__","__"}, // B - {"CN","LK","ID","__","__","__","__"}, // C - {"KP","TW","AE","__","__","__","__"}, // D - {"BH","KR","NP","FM","__","__","__"}, // E - {"MY","HK","VU","MN","__","__","__"} // F -}; - -/* see page 84, Annex J in the standard */ -static const std::string piRDSLanguageCodes[128]= -{ - // 0 1 2 3 4 5 6 7 8 9 A B C D E F - "___", "alb", "bre", "cat", "hrv", "wel", "cze", "dan", "ger", "eng", "spa", "epo", "est", "baq", "fae", "fre", // 0 - "fry", "gle", "gla", "glg", "ice", "ita", "smi", "lat", "lav", "ltz", "lit", "hun", "mlt", "dut", "nor", "oci", // 1 - "pol", "por", "rum", "rom", "srp", "slo", "slv", "fin", "swe", "tur", "nld", "wln", "___", "___", "___", "___", // 2 - "___", "___", "___", "___", "___", "___", "___", "___", "___", "___", "___", "___", "___", "___", "___", "___", // 3 - "___", "___", "___", "___", "___", "zul", "vie", "uzb", "urd", "ukr", "tha", "tel", "tat", "tam", "tgk", "swa", // 4 - "srn", "som", "sin", "sna", "scc", "rue", "rus", "que", "pus", "pan", "per", "pap", "ori", "nep", "nde", "mar", // 5 - "mol", "mys", "mlg", "mkd", "_?_", "kor", "khm", "kaz", "kan", "jpn", "ind", "hin", "heb", "hau", "grn", "guj", // 6 - "gre", "geo", "ful", "prs", "chv", "chi", "bur", "bul", "ben", "bel", "bam", "aze", "asm", "arm", "ara", "amh" // 7 -}; - -/* ----------------------------------------------------------------------------------------------------------- */ - -#define EntityChars 56 -static const char *entitystr[EntityChars] = { "'", "&", """, ">", "<", "©", "×", " ", - "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "°", - "À", "Á", "Â", "Ã", "à", "á", "â", "ã", - "È", "É", "Ê", "Ë", "è", "é", "ê", "ë", - "Ì", "Í", "Î", "Ï", "ì", "í", "î", "ï", - "Ò", "Ó", "Ô", "Õ", "ò", "ó", "ô", "õ", - "Ù", "Ú", "Û", "Ñ", "ù", "ú", "û", "ñ" }; -static const char *entitychar[EntityChars] = { "'", "&", "\"", ">", "<", "c", "*", " ", - "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "°", - "À", "Á", "Â", "Ã", "à", "á", "â", "ã", - "È", "É", "Ê", "Ë", "è", "é", "ê", "ë", - "Ì", "Í", "Î", "Ï", "ì", "í", "î", "ï", - "Ò", "Ó", "Ô", "Õ", "ò", "ó", "ô", "õ", - "Ù", "Ú", "Û", "Ñ", "ù", "ú", "û", "ñ" }; - -// RDS-Chartranslation: 0x80..0xff -static unsigned char sRDSAddChar[128] = -{ - 0xe1, 0xe0, 0xe9, 0xe8, 0xed, 0xec, 0xf3, 0xf2, - 0xfa, 0xf9, 0xd1, 0xc7, 0x8c, 0xdf, 0x8e, 0x8f, - 0xe2, 0xe4, 0xea, 0xeb, 0xee, 0xef, 0xf4, 0xf6, - 0xfb, 0xfc, 0xf1, 0xe7, 0x9c, 0x9d, 0x9e, 0x9f, - 0xaa, 0xa1, 0xa9, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xa3, 0xab, 0xac, 0xad, 0xae, 0xaf, - 0xba, 0xb9, 0xb2, 0xb3, 0xb1, 0xa1, 0xb6, 0xb7, - 0xb5, 0xbf, 0xf7, 0xb0, 0xbc, 0xbd, 0xbe, 0xa7, - 0xc1, 0xc0, 0xc9, 0xc8, 0xcd, 0xcc, 0xd3, 0xd2, - 0xda, 0xd9, 0xca, 0xcb, 0xcc, 0xcd, 0xd0, 0xcf, - 0xc2, 0xc4, 0xca, 0xcb, 0xce, 0xcf, 0xd4, 0xd6, - 0xdb, 0xdc, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xc3, 0xc5, 0xc6, 0xe3, 0xe4, 0xdd, 0xd5, 0xd8, - 0xde, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xf0, - 0xe3, 0xe5, 0xe6, 0xf3, 0xf4, 0xfd, 0xf5, 0xf8, - 0xfe, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff -}; - -static char *rds_entitychar(char *text) -{ - int i = 0, l, lof, lre, space; - char *temp; - - while (i < EntityChars) - { - if ((temp = strstr(text, entitystr[i])) != NULL) - { - l = strlen(entitystr[i]); - lof = (temp-text); - if (strlen(text) < RT_MEL) - { - lre = strlen(text) - lof - l; - space = 1; - } - else - { - lre = RT_MEL - 1 - lof - l; - space = 0; - } - memmove(text+lof, entitychar[i], 1); - memmove(text+lof+1, temp+l, lre); - if (space != 0) - memmove(text+lof+1+lre, " ", l-1); - } - else - ++i; - } - - return text; -} - -static unsigned short crc16_ccitt(const unsigned char *data, int len, bool skipfirst) -{ - // CRC16-CCITT: x^16 + x^12 + x^5 + 1 - // with start 0xffff and result invers - unsigned short crc = 0xffff; - - if (skipfirst) - ++data; - - while (len--) - { - crc = (crc >> 8) | (crc << 8); - crc ^= *data++; - crc ^= (crc & 0xff) >> 4; - crc ^= (crc << 8) << 4; - crc ^= ((crc & 0xff) << 4) << 1; - } - - return ~(crc); -} - - -/// --- CDVDRadioRDSData ------------------------------------------------------------ - -CDVDRadioRDSData::CDVDRadioRDSData() - : CThread("DVDRDSData") - , m_speed(DVD_PLAYSPEED_NORMAL) - , m_messageQueue("rds") -{ - CLog::Log(LOGDEBUG, "Radio UECP (RDS) Processor - new %s", __FUNCTION__); - - m_messageQueue.SetMaxDataSize(40 * 256 * 1024); -} - -CDVDRadioRDSData::~CDVDRadioRDSData() -{ - CLog::Log(LOGDEBUG, "Radio UECP (RDS) Processor - delete %s", __FUNCTION__); - StopThread(); -} - -bool CDVDRadioRDSData::CheckStream(CDVDStreamInfo &hints) -{ - if (hints.type == STREAM_RADIO_RDS) - return true; - - return false; -} - -bool CDVDRadioRDSData::OpenStream(CDVDStreamInfo &hints) -{ - m_messageQueue.Init(); - if (hints.type == STREAM_RADIO_RDS) - { - Flush(); - CLog::Log(LOGNOTICE, "Creating UECP (RDS) data thread"); - Create(); - } - return true; -} - -void CDVDRadioRDSData::CloseStream(bool bWaitForBuffers) -{ - // wait until buffers are empty - if (bWaitForBuffers) m_messageQueue.WaitUntilEmpty(); - - m_messageQueue.Abort(); - - // wait for decode_video thread to end - CLog::Log(LOGNOTICE, "Radio UECP (RDS) Processor - waiting for data thread to exit"); - - StopThread(); // will set this->m_bStop to true - - m_messageQueue.End(); - m_currentInfoTag.reset(); -} - -void CDVDRadioRDSData::ResetRDSCache() -{ - CSingleLock lock(m_critSection); - - m_currentFileUpdate = false; - - m_UECPDataStart = false; - m_UECPDatabStuff = false; - m_UECPDataIndex = 0; - - m_RDS_IsRBDS = false; - m_RDS_SlowLabelingCodesPresent = false; - - m_PI_Current = 0; - m_PI_CountryCode = 0; - m_PI_ProgramType = 0; - m_PI_ProgramReferenceNumber = 0; - - m_EPP_TM_INFO_ExtendedCountryCode = 0; - - m_PS_Present = false; - m_PS_Index = 0; - for (int i = 0; i < PS_TEXT_ENTRIES; ++i) - { - memset(m_PS_Text[i], 0x20, 8); - m_PS_Text[i][8] = 0; - } - - m_DI_IsStereo = true; - m_DI_ArtificialHead = false; - m_DI_Compressed = false; - m_DI_DynamicPTY = false; - - m_TA_TP_TrafficAdvisory = false; - m_TA_TP_TrafficVolume = 0.0; - - m_MS_SpeechActive = false; - - m_PTY = 0; - memset(m_PTYN, 0x20, 8); - m_PTYN[8] = 0; - m_PTYN_Present = false; - - m_RT_Present = false; - m_RT_MaxSize = 4; - m_RT_NewItem = false; - m_RT_Index = 0; - for (int i = 0; i < 5; ++i) - memset(m_RT_Text[i], 0, RT_MEL); - m_RT.clear(); - - m_RTPlus_TToggle = false; - m_RTPlus_Present = false; - m_RTPlus_Show = false; - m_RTPlus_iToggle = 0; - m_RTPlus_ItemToggle = 1; - m_RTPlus_Title[0] = 0; - m_RTPlus_Artist[0] = 0; - m_RTPlus_Starttime = time(NULL); - m_RTPlus_GenrePresent = false; - - m_currentInfoTag = CPVRRadioRDSInfoTag::CreateDefaultTag(); - m_currentChannel = g_application.CurrentFileItem().GetPVRChannelInfoTag(); - g_application.CurrentFileItem().SetPVRRadioRDSInfoTag(m_currentInfoTag); - g_infoManager.SetCurrentItem(g_application.CurrentFileItem()); - - // send a message to all windows to tell them to update the radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CDVDRadioRDSData::Process() -{ - CLog::Log(LOGNOTICE, "Radio UECP (RDS) Processor - running thread"); - - while (!m_bStop) - { - CDVDMsg* pMsg; - int iPriority = (m_speed == DVD_PLAYSPEED_PAUSE) ? 1 : 0; - MsgQueueReturnCode ret = m_messageQueue.Get(&pMsg, 2000, iPriority); - - if (ret == MSGQ_TIMEOUT) - { - /* Timeout for RDS is not a bad thing, so we continue without error */ - continue; - } - - if (MSGQ_IS_ERROR(ret)) - { - CLog::Log(LOGERROR, "Got MSGQ_ABORT or MSGO_IS_ERROR return true (%i)", ret); - break; - } - - if (pMsg->IsType(CDVDMsg::DEMUXER_PACKET)) - { - CSingleLock lock(m_critSection); - - DemuxPacket* pPacket = ((CDVDMsgDemuxerPacket*)pMsg)->GetPacket(); - - ProcessUECP(pPacket->pData, pPacket->iSize); - } - else if (pMsg->IsType(CDVDMsg::PLAYER_SETSPEED)) - { - m_speed = static_cast(pMsg)->m_value; - } - else if (pMsg->IsType(CDVDMsg::GENERAL_FLUSH) - || pMsg->IsType(CDVDMsg::GENERAL_RESET)) - { - ResetRDSCache(); - } - pMsg->Release(); - } -} - -void CDVDRadioRDSData::Flush() -{ - if(!m_messageQueue.IsInited()) - return; - /* flush using message as this get's called from dvdplayer thread */ - /* and any demux packet that has been taken out of queue need to */ - /* be disposed of before we flush */ - m_messageQueue.Flush(); - m_messageQueue.Put(new CDVDMsg(CDVDMsg::GENERAL_FLUSH)); -} - -void CDVDRadioRDSData::OnExit() -{ - CLog::Log(LOGNOTICE, "Radio UECP (RDS) Processor - thread end"); -} - -std::string CDVDRadioRDSData::GetRadioText(unsigned int line) -{ - std::string str = ""; - - if (m_RT_Present) - { - if (line > MAX_RADIOTEXT_LISTSIZE) - return ""; - - if ((int)line+1 > m_RT_MaxSize) - { - m_RT_MaxSize = line+1; - return ""; - } - if (m_RT.size() <= line) - return ""; - - return m_RT[line]; - } - else if (m_PS_Present) - { - std::string temp = ""; - int ind = (m_PS_Index == 0) ? 11 : m_PS_Index - 1; - for (int i = ind+1; i < PS_TEXT_ENTRIES; ++i) - { - temp += m_PS_Text[i]; - temp += ' '; - } - for (int i = 0; i <= ind; ++i) - { - temp += m_PS_Text[i]; - temp += ' '; - } - - if (line == 0) - str.insert(0, temp, 6*9, 6*9); - else if (line == 1) - str.insert(0, temp.c_str(), 6*9); - } - return str; -} - -void CDVDRadioRDSData::SetRadioStyle(std::string genre) -{ - g_application.CurrentFileItem().GetMusicInfoTag()->SetGenre(genre); - m_currentInfoTag->SetProgStyle(genre); - m_currentFileUpdate = true; - - CLog::Log(LOGDEBUG, "Radio UECP (RDS) Processor - %s - Stream genre set to %s", __FUNCTION__, genre.c_str()); -} - -void CDVDRadioRDSData::ProcessUECP(const unsigned char *data, unsigned int len) -{ - for (unsigned int i = 0; i < len; ++i) - { - if (data[i] == UECP_DATA_START) //!< Start - { - m_UECPDataIndex = -1; - m_UECPDataStart = true; - m_UECPDatabStuff = false; - } - - if (m_UECPDataStart) - { - //! byte-stuffing reverse: 0xfd00->0xfd, 0xfd01->0xfe, 0xfd02->0xff - if (m_UECPDatabStuff == true) - { - switch (data[i]) - { - case 0x00: m_UECPData[m_UECPDataIndex] = 0xfd; break; - case 0x01: m_UECPData[m_UECPDataIndex] = 0xfe; break; - case 0x02: m_UECPData[m_UECPDataIndex] = 0xff; break; - default: m_UECPData[++m_UECPDataIndex] = data[i]; // should never be - } - m_UECPDatabStuff = false; - } - else - { - m_UECPData[++m_UECPDataIndex] = data[i]; - } - - if (data[i] == 0xfd && m_UECPDataIndex > 0) //!< stuffing found - m_UECPDatabStuff = true; - - if (m_UECPDataIndex >= UECP_SIZE_MAX) //!< max. UECP data length, garbage ? - { - CLog::Log(LOGERROR, "Radio UECP (RDS) Processor - Error(TS): too long, garbage ?"); - m_UECPDataStart = false; - } - } - - if (m_UECPDataStart == true && data[i] == UECP_DATA_STOP && m_currentInfoTag) //!< End - { - m_UECPDataStart = false; - - if (m_UECPDataIndex < 9) - { - CLog::Log(LOGERROR, "Radio UECP (RDS) Processor - Error(TS): too short -> garbage ?"); - } - else - { - //! crc16-check - unsigned short crc16 = crc16_ccitt(m_UECPData, m_UECPDataIndex-3, 1); - if (crc16 != (m_UECPData[m_UECPDataIndex-2]<<8) + m_UECPData[m_UECPDataIndex-1]) - { - CLog::Log(LOGERROR, "Radio UECP (RDS) Processor - Error(TS): wrong CRC # calc = %04x <> transmit = %02x%02x", - crc16, m_UECPData[m_UECPDataIndex-2], m_UECPData[m_UECPDataIndex-1]); - } - else - { - m_UECPDataDeadBreak = false; - - unsigned int ret = 0; - unsigned int ptr = 5; - unsigned int len = m_UECPDataIndex-7; - do - { - uint8_t *msg = m_UECPData+ptr; //!< Current selected UECP message element (increased if more as one element is in frame) - switch (msg[UECP_ME_MEC]) - { - case UECP_RDS_PI: ret = DecodePI(msg); break; //!< Program Identification - case UECP_RDS_PS: ret = DecodePS(msg); break; //!< Program Service name (PS) - case UECP_RDS_DI: ret = DecodeDI(msg); break; //!< Decoder Identification and dynamic PTY indicator - case UECP_RDS_TA_TP: ret = DecodeTA_TP(msg); break; //!< Traffic Announcement and Traffic Programme bits. - case UECP_RDS_MS: ret = DecodeMS(msg); break; //!< Music/Speech switch - case UECP_RDS_PTY: ret = DecodePTY(msg); break; //!< Program Type - case UECP_RDS_PTYN: ret = DecodePTYN(msg); break; //!< Program Type Name - case UECP_RDS_RT: ret = DecodeRT(msg, len); break; //!< RadioText - case UECP_ODA_DATA: ret = DecodeODA(msg, len); break; //!< Open Data Application - case UECP_OTHER_RASS: m_UECPDataDeadBreak = true; break; //!< Radio screen show (RaSS) (not present, before on SWR radio) - case UECP_CLOCK_RTC: ret = DecodeRTC(msg); break; //!< Real time clock - case UECP_TDC_TMC: ret = DecodeTMC(msg, len); break; //!< Traffic message channel - case UECP_EPP_TM_INFO: ret = DecodeEPPTransmitterInfo(msg); break; //!< EPP transmitter information - case UECP_SLOW_LABEL_CODES: ret = DecodeSlowLabelingCodes(msg); break; //!< Slow Labeling codes - case UECP_DAB_DYN_LABEL_CMD: ret = DecodeDABDynLabelCmd(msg, len); break; //!< DAB: Dynamic Label command - case UECP_DAB_DYN_LABEL_MSG: ret = DecodeDABDynLabelMsg(msg, len); break; //!< DAB: Dynamic Label message (DL) - case UECP_RDS_AF: ret = DecodeAF(msg, len); break; //!< Alternative Frequencies list - case UECP_RDS_EON_AF: ret = DecodeEonAF(msg, len); break; //!< EON Alternative Frequencies list - case UECP_TDC_TDC: ret = DecodeTDC(msg, len); break; //!< Transparent Data Channel - case UECP_LINKAGE_INFO: ret = 5; break; //!< Linkage information - case UECP_TDC_EWS: ret = 6; break; //!< Emergency warning system - case UECP_RDS_PIN: ret = 5; break; //!< Program Item Number - case UECP_TDC_IH: ret = 7; break; //!< In-house applications (Should be ignored) - case UECP_TDC_FREE_FMT_GROUP: ret = 7; break; //!< Free-format group (unused) - case UECP_ODA_CONF_SHORT_MSG_CMD: ret = 8; break; //!< ODA Configuration and Short Message Command (unused) - case UECP_CLOCK_RTC_CORR: ret = 3; break; //!< Real time clock correction (unused) - case UECP_CLOCK_CT_ON_OFF: ret = 2; break; //!< Real time clock on/off (unused) - default: -#ifdef RDS_IMPROVE_CHECK - printf("Unknown UECP data packet = 0x%02X\n", msg[UECP_ME_MEC]); -#endif - m_UECPDataDeadBreak = true; - break; - } - ptr += ret; - len -= ret; - } - while (ptr < m_UECPDataIndex-5 && !m_UECPDataDeadBreak && !m_bStop); - - if (m_currentFileUpdate && !m_bStop) - { - g_infoManager.SetCurrentItem(g_application.CurrentFileItem()); - m_currentFileUpdate = false; - } - } - } - } - } -} - -unsigned int CDVDRadioRDSData::DecodePI(uint8_t *msgElement) -{ - uint16_t PICode = (msgElement[3] << 8) | msgElement[4]; - if (m_PI_Current != PICode) - { - m_PI_Current = PICode; - - m_PI_CountryCode = (m_PI_Current>>12) & 0x0F; - m_PI_ProgramType = (m_PI_Current>>8) & 0x0F; - m_PI_ProgramReferenceNumber = m_PI_Current & 0xFF; - - CLog::Log(LOGINFO, "Radio UECP (RDS) Processor - PI code changed to Country %X, Type %X and reference no. %i", m_PI_CountryCode, m_PI_ProgramType, m_PI_ProgramReferenceNumber); - } - - return 5; -} - -unsigned int CDVDRadioRDSData::DecodePS(uint8_t *msgElement) -{ - uint8_t *text = msgElement+3; - - for (int i = 0; i < 8; ++i) - { - if (text[i] <= 0xfe) - m_PS_Text[m_PS_Index][i] = (text[i] >= 0x80) ? sRDSAddChar[text[i]-0x80] : text[i]; //!< additional rds-character, see RBDS-Standard, Annex E - } - - ++m_PS_Index; - if (m_PS_Index >= PS_TEXT_ENTRIES) - m_PS_Index = 0; - - m_PS_Present = true; - return 11; -} - -unsigned int CDVDRadioRDSData::DecodeDI(uint8_t *msgElement) -{ - bool value; - - value = msgElement[3] & 1; - if (m_DI_IsStereo != value) - { - CLog::Log(LOGDEBUG, "Radio UECP (RDS) Processor - %s - Stream changed over to %s", __FUNCTION__, value ? "Stereo" : "Mono"); - m_DI_IsStereo = value; - } - - value = msgElement[3] & 2; - if (m_DI_ArtificialHead != value) - { - CLog::Log(LOGDEBUG, "Radio UECP (RDS) Processor - %s - Stream changed over to %sArtificial Head", __FUNCTION__, value ? "" : "Not "); - m_DI_ArtificialHead = value; - } - - value = msgElement[3] & 4; - if (m_DI_ArtificialHead != value) - { - CLog::Log(LOGDEBUG, "Radio UECP (RDS) Processor - %s - Stream changed over to %sCompressed Head", __FUNCTION__, value ? "" : "Not "); - m_DI_ArtificialHead = value; - } - - value = msgElement[3] & 8; - if (m_DI_DynamicPTY != value) - { - CLog::Log(LOGDEBUG, "Radio UECP (RDS) Processor - %s - Stream changed over to %s PTY", __FUNCTION__, value ? "dynamic" : "static"); - m_DI_DynamicPTY = value; - } - - return 4; -} - -unsigned int CDVDRadioRDSData::DecodeTA_TP(uint8_t *msgElement) -{ - uint8_t dsn = msgElement[1]; - bool traffic_announcement = msgElement[3] & 1; - bool traffic_programme = msgElement[3] & 2; - - if (traffic_announcement && !m_TA_TP_TrafficAdvisory && traffic_programme && dsn == 0 && CSettings::GetInstance().GetBool("pvrplayback.trafficadvisory")) - { - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(19021), g_localizeStrings.Get(29930)); - m_TA_TP_TrafficAdvisory = true; - m_TA_TP_TrafficVolume = g_application.GetVolume(); - float trafAdvVol = (float)CSettings::GetInstance().GetInt("pvrplayback.trafficadvisoryvolume"); - if (trafAdvVol) - g_application.SetVolume(m_TA_TP_TrafficVolume+trafAdvVol); - - CVariant data(CVariant::VariantTypeObject); - data["on"] = true; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::PVR, "xbmc", "RDSRadioTA", data); - } - - if (!traffic_announcement && m_TA_TP_TrafficAdvisory && CSettings::GetInstance().GetBool("pvrplayback.trafficadvisory")) - { - m_TA_TP_TrafficAdvisory = false; - g_application.SetVolume(m_TA_TP_TrafficVolume); - - CVariant data(CVariant::VariantTypeObject); - data["on"] = false; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::PVR, "xbmc", "RDSRadioTA", data); - } - - return 4; -} - -unsigned int CDVDRadioRDSData::DecodeMS(uint8_t *msgElement) -{ - bool speechActive = msgElement[3] == 0; - if (m_MS_SpeechActive != speechActive) - { - m_currentInfoTag->SetSpeechActive(m_MS_SpeechActive); - CLog::Log(LOGDEBUG, "Radio UECP (RDS) Processor - %s - Stream changed over to %s", __FUNCTION__, speechActive ? "Speech" : "Music"); - m_MS_SpeechActive = speechActive; - } - - return 4; -} - -/*! - * EBU - SPB 490 - 3.3.7 and 62106IEC:1999 - 3.2.1.2, Message Name: Programme Type - * Message Element Code: 07 - */ -//! @todo Improve and test alarm message -typedef struct { const char *style_name; int name; } pty_skin_info; -pty_skin_info pty_skin_info_table[32][2] = -{ - { { "none", 29940 }, { "none", 29940 } }, - { { "news", 29941 }, { "news", 29941 } }, - { { "currentaffairs", 29942 }, { "information", 29943 } }, - { { "information", 29943 }, { "sport", 29944 } }, - { { "sport", 29944 }, { "talk", 29939 } }, - { { "education", 29945 }, { "rockmusic", 29951 } }, - { { "drama", 29946 }, { "classicrockmusic",29977 } }, - { { "cultures", 29947 }, { "adulthits", 29937 } }, - { { "science", 29948 }, { "softrock", 29938 } }, - { { "variedspeech", 29949 }, { "top40", 29972 } }, - { { "popmusic", 29950 }, { "countrymusic", 29965 } }, - { { "rockmusic", 29951 }, { "oldiesmusic", 29967 } }, - { { "easylistening", 29952 }, { "softmusic", 29936 } }, - { { "lightclassics", 29953 }, { "nostalgia", 29979 } }, - { { "seriousclassics",29954 }, { "jazzmusic", 29964 } }, - { { "othermusic", 29955 }, { "classical", 29978 } }, - { { "weather", 29956 }, { "randb", 29975 } }, - { { "finance", 29957 }, { "softrandb", 29976 } }, - { { "childrensprogs", 29958 }, { "language", 29932 } }, - { { "socialaffairs", 29959 }, { "religiousmusic", 29973 } }, - { { "religion", 29960 }, { "religioustalk", 29974 } }, - { { "phonein", 29961 }, { "personality", 29934 } }, - { { "travelandtouring",29962 },{ "public", 29935 } }, - { { "leisureandhobby",29963 }, { "college", 29933 } }, - { { "jazzmusic", 29964 }, { "spanishtalk", 29927 } }, - { { "countrymusic", 29965 }, { "spanishmusic", 29928 } }, - { { "nationalmusic", 29966 }, { "hiphop", 29929 } }, - { { "oldiesmusic", 29967 }, { "", -1 } }, - { { "folkmusic", 29968 }, { "", -1 } }, - { { "documentary", 29969 }, { "weather", 29956 } }, - { { "alarmtest", 29970 }, { "alarmtest", 29970 } }, - { { "alarm-alarm", 29971 }, { "alarm-alarm", 29971 } } -}; - -unsigned int CDVDRadioRDSData::DecodePTY(uint8_t *msgElement) -{ - int pty = msgElement[3]; - if (pty >= 0 && pty < 32 && m_PTY != pty) - { - m_PTY = pty; - - // save info - m_currentInfoTag->SetRadioStyle(pty_skin_info_table[m_PTY][m_RDS_IsRBDS].style_name); - if (!m_RTPlus_GenrePresent && !m_PTYN_Present) - SetRadioStyle(g_localizeStrings.Get(pty_skin_info_table[m_PTY][m_RDS_IsRBDS].name)); - - if (m_PTY == RDS_PTY_ALARM_TEST) - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(29931), g_localizeStrings.Get(29970), TOAST_DISPLAY_TIME, false); - - if (m_PTY == RDS_PTY_ALARM) - { - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(29931), g_localizeStrings.Get(29971), TOAST_DISPLAY_TIME*2, true); - } - } - - return 4; -} - -unsigned int CDVDRadioRDSData::DecodePTYN(uint8_t *msgElement) -{ - // decode Text - uint8_t *text = msgElement+3; - - for (int i = 0; i < 8; ++i) - { - if (text[i] <= 0xfe) - m_PTYN[i] = (text[i] >= 0x80) ? sRDSAddChar[text[i]-0x80] : text[i]; - } - - m_PTYN_Present = true; - - if (!m_RTPlus_GenrePresent) - { - std::string progTypeName = StringUtils::Format("%s: %s", g_localizeStrings.Get(pty_skin_info_table[m_PTY][m_RDS_IsRBDS].name).c_str(), m_PTYN); - SetRadioStyle(progTypeName); - } - - return 11; -} - -inline void rtrim_str(std::string &text) -{ - for (int i = text.length()-1; i >= 0; --i) - { - if (text[i] == ' ' || text[i] == '\t' || text[i] == '\n' || text[i] == '\r') - text[i] = 0; - else - break; - } -} - -unsigned int CDVDRadioRDSData::DecodeRT(uint8_t *msgElement, unsigned int len) -{ - if (!m_RT_Present) - { - m_currentInfoTag->SetPlayingRadiotext(true); - m_RT_Present = true; - } - - int bufConf = (msgElement[UECP_ME_DATA] >> 5) & 0x03; - unsigned int msgLength = msgElement[UECP_ME_MEL]; - if (msgLength > len-2) - { - CLog::Log(LOGERROR, "Radio UECP (RDS) - %s - RT-Error: Length=0 or not correct (MFL= %d, MEL= %d)\n", __FUNCTION__, len, msgLength); - m_UECPDataDeadBreak = true; - return 0; - } - else if (msgLength == 0 || (msgLength == 1 && bufConf == 0)) - { - m_RT.clear(); - m_RT_Index = 0; - for (int i = 0; i < 5; ++i) - memset(m_RT_Text[i], 0, RT_MEL); - } - else - { - // bool flagToogle = msgElement[UECP_ME_DATA] & 0x01 ? true : false; - // int txQty = (msgElement[UECP_ME_DATA] >> 1) & 0x0F; - // int bufConf = (msgElement[UECP_ME_DATA] >> 5) & 0x03; - - //! byte 4 = RT-Status bitcodet (0=AB-flagcontrol, 1-4=Transmission-Number, 5+6=Buffer-Config, ingnored, always 0x01 ?) - char temptext[RT_MEL]; - memset(temptext, 0x0, RT_MEL); - for (unsigned int i = 1, ii = 0; i < msgLength; ++i) - { - if (msgElement[UECP_ME_DATA+i] <= 0xfe) // additional rds-character, see RBDS-Standard, Annex E - temptext[ii++] = (msgElement[UECP_ME_DATA+i] >= 0x80) ? sRDSAddChar[msgElement[UECP_ME_DATA+i]-0x80] : msgElement[UECP_ME_DATA+i]; - } - memcpy(m_RTPlus_WorkText, temptext, RT_MEL); - rds_entitychar(temptext); - - // check repeats - bool repeat = false; - for (int ind = 0; ind < m_RT_MaxSize; ++ind) - { - if (memcmp(m_RT_Text[ind], temptext, RT_MEL) == 0) - repeat = true; - } - if (!repeat) - { - memcpy(m_RT_Text[m_RT_Index], temptext, RT_MEL); - - std::string rdsline = m_RT_Text[m_RT_Index]; - rtrim_str(rdsline); - g_charsetConverter.unknownToUTF8(rdsline); - m_RT.push_front(StringUtils::Trim(rdsline)); - - if ((int)m_RT.size() > m_RT_MaxSize) - m_RT.pop_back(); - - ++m_RT_Index; - if (m_RT_Index >= m_RT_MaxSize) - m_RT_Index = 0; - } - m_RTPlus_iToggle = 0x03; // Bit 0/1 = Title/Artist - } - return msgLength+4; -} - -#define UECP_CLOCK_YEAR 1 -#define UECP_CLOCK_MONTH 2 -#define UECP_CLOCK_DAY 3 -#define UECP_CLOCK_HOURS 4 -#define UECP_CLOCK_MINUTES 5 -#define UECP_CLOCK_SECONDS 6 -#define UECP_CLOCK_CENTSEC 7 -#define UECP_CLOCK_LOCALOFFSET 8 -unsigned int CDVDRadioRDSData::DecodeRTC(uint8_t *msgElement) -{ - uint8_t hours = msgElement[UECP_CLOCK_HOURS]; - uint8_t minutes = msgElement[UECP_CLOCK_MINUTES]; - bool minus = msgElement[UECP_CLOCK_LOCALOFFSET] & 0x20; - if (minus) - { - if (msgElement[UECP_CLOCK_LOCALOFFSET] >> 1) - hours -= msgElement[UECP_CLOCK_LOCALOFFSET] >> 1; - if (msgElement[UECP_CLOCK_LOCALOFFSET] & 1) - minutes -= 30; - } - else - { - if (msgElement[UECP_CLOCK_LOCALOFFSET] >> 1) - hours += msgElement[UECP_CLOCK_LOCALOFFSET] >> 1; - if (msgElement[UECP_CLOCK_LOCALOFFSET] & 1) - minutes += 30; - } - m_RTC_DateTime.SetDateTime(msgElement[UECP_CLOCK_YEAR], msgElement[UECP_CLOCK_MONTH], msgElement[UECP_CLOCK_DAY], - hours, minutes, msgElement[UECP_CLOCK_SECONDS]); - - CLog::Log(LOGDEBUG, "Radio UECP (RDS) - %s - Current RDS Data Time: %02i.%02i.%02i - UTC: %02i:%02i:%02i,0.%is - Local: %c%i min", - __FUNCTION__, msgElement[UECP_CLOCK_DAY], msgElement[UECP_CLOCK_MONTH], msgElement[UECP_CLOCK_YEAR], - msgElement[UECP_CLOCK_HOURS], msgElement[UECP_CLOCK_MINUTES], msgElement[UECP_CLOCK_SECONDS], - msgElement[UECP_CLOCK_CENTSEC], minus ? '-' : '+', msgElement[UECP_CLOCK_LOCALOFFSET]*30); - - CVariant data(CVariant::VariantTypeObject); - data["dateTime"] = (m_RTC_DateTime.IsValid()) ? m_RTC_DateTime.GetAsRFC1123DateTime() : ""; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::PVR, "xbmc", "RDSRadioRTC", data); - - return 8; -} - -unsigned int CDVDRadioRDSData::DecodeODA(uint8_t *msgElement, unsigned int len) -{ - unsigned int procData = msgElement[1]; - if (procData == 0 || procData > len-2) - { - CLog::Log(LOGERROR, "Radio UECP (RDS) - Invalid ODA data size"); - m_UECPDataDeadBreak = true; - return 0; - } - - switch ((msgElement[2]<<8)+msgElement[3]) // ODA-ID - { - case 0x4bd7: //!< RT+ - procData = DecodeRTPlus(msgElement, len); - break; - case 0x0d45: //!< TMC Alert-C - case 0xcd46: - SendTMCSignal(msgElement[4], msgElement+5); - break; - default: - m_UECPDataDeadBreak = true; -#ifdef RDS_IMPROVE_CHECK - printf("[RDS-ODA AID '%02x%02x' not used -> End]\n", msgElement[2], msgElement[3]); -#endif // RDS_IMPROVE_CHECK - break; - } - return procData; -} - -unsigned int CDVDRadioRDSData::DecodeRTPlus(uint8_t *msgElement, unsigned int len) -{ - if (m_RTPlus_iToggle == 0) // RTplus tags V2.1, only if RT - return 10; - - if (!m_RTPlus_Present) - { - m_currentInfoTag->SetPlayingRadiotextPlus(true); - m_RTPlus_Present = true; - } - - if (msgElement[1] > len-2 || msgElement[1] != 8) // byte 6 = MEL, only 8 byte for 2 tags - { - CLog::Log(LOGERROR, "Radio UECP (RDS) - %s - RTp-Error: Length not correct (MEL= %d)", __FUNCTION__, msgElement[1]); - m_UECPDataDeadBreak = true; - return 0; - } - unsigned int rtp_typ[2], rtp_start[2], rtp_len[2]; - // byte 2+3 = ApplicationID, always 0x4bd7 - // byte 4 = Applicationgroup Typecode / PTY ? - // bit 10#4 = Item Togglebit - // bit 10#3 = Item Runningbit321 - // Tag1: bit 10#2..11#5 = Contenttype, 11#4..12#7 = Startmarker, 12#6..12#1 = Length - rtp_typ[0] = (0x38 & msgElement[5]<<3) | msgElement[6]>>5; - rtp_start[0] = (0x3e & msgElement[6]<<1) | msgElement[7]>>7; - rtp_len[0] = 0x3f & msgElement[7]>>1; - // Tag2: bit 12#0..13#3 = Contenttype, 13#2..14#5 = Startmarker, 14#4..14#0 = Length(5bit) - rtp_typ[1] = (0x20 & msgElement[7]<<5) | msgElement[8]>>3; - rtp_start[1] = (0x38 & msgElement[8]<<3) | msgElement[9]>>5; - rtp_len[1] = 0x1f & msgElement[9]; - - /// Hack for error on BR Classic - if ((msgElement[5]&0x10) && (msgElement[5]&0x08) && rtp_typ[0] == RTPLUS_INFO_URL && rtp_typ[1] == RTPLUS_ITEM_ARTIST) - return 10; - - // save info - MUSIC_INFO::CMusicInfoTag *currentMusic = g_application.CurrentFileItem().GetMusicInfoTag(); - - for (int i = 0; i < 2; ++i) - { - if (rtp_start[i]+rtp_len[i]+1 >= RT_MEL) // length-error - { - CLog::Log(LOGERROR, "Radio UECP (RDS) - %s - (tag#%d = Typ/Start/Len): %d/%d/%d (Start+Length > 'RT-MEL' !)", __FUNCTION__, i+1, rtp_typ[i], rtp_start[i], rtp_len[i]); - } - else - { - // +Memory - memset(m_RTPlus_Temptext, 0x20, RT_MEL); - memcpy(m_RTPlus_Temptext, m_RTPlus_WorkText+rtp_start[i], rtp_len[i]+1); - m_RTPlus_Temptext[rtp_len[i]+1] = 0; - rds_entitychar(m_RTPlus_Temptext); - switch (rtp_typ[i]) - { - case RTPLUS_DUMMY_CLASS: - break; - case RTPLUS_ITEM_TITLE: // Item-Title... - if ((msgElement[5] & 0x08) > 0 && (m_RTPlus_iToggle & 0x01) == 0x01) - { - m_RTPlus_iToggle -= 0x01; - if (memcmp(m_RTPlus_Title, m_RTPlus_Temptext, RT_MEL) != 0 || (msgElement[5] & 0x10) != m_RTPlus_ItemToggle) - { - memcpy(m_RTPlus_Title, m_RTPlus_Temptext, RT_MEL); - if (m_RTPlus_Show && m_RTPlus_iTime.GetElapsedSeconds() > 1) - m_RTPlus_iDiffs = (int) m_RTPlus_iTime.GetElapsedSeconds(); - if (!m_RT_NewItem) - { - m_RTPlus_Starttime = time(NULL); - m_RTPlus_iTime.StartZero(); - m_RTPlus_Artist[0] = 0; - } - m_RT_NewItem = (!m_RT_NewItem) ? true : false; - m_RTPlus_Show = m_RTPlus_TToggle = true; - } - } - break; - case RTPLUS_ITEM_ALBUM: - m_currentInfoTag->SetAlbum(m_RTPlus_Temptext); - currentMusic->SetAlbum(m_RTPlus_Temptext); - break; - case RTPLUS_ITEM_TRACKNUMBER: - m_currentInfoTag->SetAlbumTrackNumber(atoi(m_RTPlus_Temptext)); - currentMusic->SetAlbumId(atoi(m_RTPlus_Temptext)); - break; - case RTPLUS_ITEM_ARTIST: // Item-Artist.. - if ((msgElement[5] & 0x08) > 0 && (m_RTPlus_iToggle & 0x02) == 0x02) - { - m_RTPlus_iToggle -= 0x02; - if (memcmp(m_RTPlus_Artist, m_RTPlus_Temptext, RT_MEL) != 0 || (msgElement[5] & 0x10) != m_RTPlus_ItemToggle) - { - memcpy(m_RTPlus_Artist, m_RTPlus_Temptext, RT_MEL); - if (m_RTPlus_Show && m_RTPlus_iTime.GetElapsedSeconds() > 1) - m_RTPlus_iDiffs = (int) m_RTPlus_iTime.GetElapsedSeconds(); - if (!m_RT_NewItem) - { - m_RTPlus_Starttime = time(NULL); - m_RTPlus_iTime.StartZero(); - m_RTPlus_Title[0] = 0; - } - m_RT_NewItem = (!m_RT_NewItem) ? true : false; - m_RTPlus_Show = m_RTPlus_TToggle = true; - } - } - break; - case RTPLUS_ITEM_CONDUCTOR: - m_currentInfoTag->SetConductor(m_RTPlus_Temptext); - break; - case RTPLUS_ITEM_COMPOSER: - case RTPLUS_ITEM_COMPOSITION: - m_currentInfoTag->SetComposer(m_RTPlus_Temptext); - if (m_currentInfoTag->GetRadioStyle() == "unknown") - m_currentInfoTag->SetRadioStyle("classical"); - break; - case RTPLUS_ITEM_BAND: - m_currentInfoTag->SetBand(m_RTPlus_Temptext); - break; - case RTPLUS_ITEM_COMMENT: - m_currentInfoTag->SetComment(m_RTPlus_Temptext); - break; - case RTPLUS_ITEM_GENRE: - { - std::string str = m_RTPlus_Temptext; - g_charsetConverter.unknownToUTF8(str); - m_RTPlus_GenrePresent = true; - m_currentInfoTag->SetProgStyle(str); - } - break; - case RTPLUS_INFO_NEWS: // Info_News - m_currentInfoTag->SetInfoNews(m_RTPlus_Temptext); - break; - case RTPLUS_INFO_NEWS_LOCAL: // Info_NewsLocal - m_currentInfoTag->SetInfoNewsLocal(m_RTPlus_Temptext); - break; - case RTPLUS_INFO_STOCKMARKET: // Info_Stockmarket - m_currentInfoTag->SetInfoStock(m_RTPlus_Temptext); - break; - case RTPLUS_INFO_SPORT: // Info_Sport - m_currentInfoTag->SetInfoSport(m_RTPlus_Temptext); - break; - case RTPLUS_INFO_LOTTERY: // Info_Lottery - m_currentInfoTag->SetInfoLottery(m_RTPlus_Temptext); - break; - case RTPLUS_INFO_HOROSCOPE: - m_currentInfoTag->SetInfoHoroscope(m_RTPlus_Temptext); - break; - case RTPLUS_INFO_CINEMA: - m_currentInfoTag->SetInfoCinema(m_RTPlus_Temptext); - break; - case RTPLUS_INFO_WEATHER: // Info_Weather/ - m_currentInfoTag->SetInfoWeather(m_RTPlus_Temptext); - break; - case RTPLUS_INFO_URL: // Info_Url - if (m_currentInfoTag->GetProgWebsite().empty()) - m_currentInfoTag->SetProgWebsite(m_RTPlus_Temptext); - break; - case RTPLUS_INFO_OTHER: // Info_Other - m_currentInfoTag->SetInfoOther(m_RTPlus_Temptext); - break; - case RTPLUS_STATIONNAME_LONG: // Programme_Stationname.Long - m_currentInfoTag->SetProgStation(m_RTPlus_Temptext); - break; - case RTPLUS_PROGRAMME_NOW: // Programme_Now - m_currentInfoTag->SetProgNow(m_RTPlus_Temptext); - break; - case RTPLUS_PROGRAMME_NEXT: // Programme_Next - m_currentInfoTag->SetProgNext(m_RTPlus_Temptext); - break; - case RTPLUS_PROGRAMME_HOST: // Programme_Host - m_currentInfoTag->SetProgHost(m_RTPlus_Temptext); - break; - case RTPLUS_PROGRAMME_EDITORIAL_STAFF: // Programme_EditorialStaff - m_currentInfoTag->SetEditorialStaff(m_RTPlus_Temptext); - break; - case RTPLUS_PROGRAMME_HOMEPAGE: // Programme_Homepage - m_currentInfoTag->SetProgWebsite(m_RTPlus_Temptext); - break; - case RTPLUS_PHONE_HOTLINE: // Phone_Hotline - m_currentInfoTag->SetPhoneHotline(m_RTPlus_Temptext); - break; - case RTPLUS_PHONE_STUDIO: // Phone_Studio - m_currentInfoTag->SetPhoneStudio(m_RTPlus_Temptext); - break; - case RTPLUS_SMS_STUDIO: // SMS_Studio - m_currentInfoTag->SetSMSStudio(m_RTPlus_Temptext); - break; - case RTPLUS_EMAIL_HOTLINE: // Email_Hotline - m_currentInfoTag->SetEMailHotline(m_RTPlus_Temptext); - break; - case RTPLUS_EMAIL_STUDIO: // Email_Studio - m_currentInfoTag->SetEMailStudio(m_RTPlus_Temptext); - break; - /** - * Currently unused radiotext plus messages - * Must be check where present and if it is usable - */ - case RTPLUS_ITEM_MOVEMENT: - case RTPLUS_INFO_DAILY_DIVERSION: - case RTPLUS_INFO_HEALTH: - case RTPLUS_INFO_EVENT: - case RTPLUS_INFO_SZENE: - case RTPLUS_INFO_STUPIDITY_MACHINE: - case RTPLUS_INFO_TRAFFIC: - case RTPLUS_INFO_ALARM: - case RTPLUS_INFO_ADVERTISEMENT: - case RTPLUS_PROGRAMME_PART: - case RTPLUS_PROGRAMME_FREQUENCY: - case RTPLUS_PROGRAMME_SUBCHANNEL: - case RTPLUS_PHONE_OTHER: - case RTPLUS_SMS_OTHER: - case RTPLUS_EMAIL_OTHER: - case RTPLUS_MMS_OTHER: - case RTPLUS_CHAT: - case RTPLUS_CHAT_CENTER: - case RTPLUS_VOTE_QUESTION: - case RTPLUS_VOTE_CENTER: - case RTPLUS_PLACE: - case RTPLUS_APPOINTMENT: - case RTPLUS_IDENTIFIER: - case RTPLUS_PURCHASE: - case RTPLUS_GET_DATA: -#ifdef RDS_IMPROVE_CHECK - printf(" RTp-Unkn. : %02i - %s\n", rtp_typ[i], m_RTPlus_Temptext); - break; -#endif // RDS_IMPROVE_CHECK - /// Unused and not needed data informations - case RTPLUS_STATIONNAME_SHORT: //!< Must be rechecked under DAB - case RTPLUS_INFO_DATE_TIME: - break; - default: - break; - } - } - } - - // Title-end @ no Item-Running' - if ((msgElement[5] & 0x08) == 0) - { - m_RTPlus_Title[0] = 0; - m_RTPlus_Artist[0] = 0; - m_currentInfoTag->ResetSongInformation(); - currentMusic->SetAlbum(""); - if (m_RTPlus_GenrePresent) - { - m_currentInfoTag->SetProgStyle(""); - m_RTPlus_GenrePresent = false; - } - - if (m_RTPlus_Show) - { - m_RTPlus_Show = false; - m_RTPlus_TToggle = true; - m_RTPlus_iDiffs = (int) m_RTPlus_iTime.GetElapsedSeconds(); - m_RTPlus_Starttime = time(NULL); - } - m_RT_NewItem = false; - } - - if (m_RTPlus_TToggle) - { -#ifdef RDS_IMPROVE_CHECK - { - struct tm tm_store; - struct tm *ts = localtime_r(&m_RTPlus_Starttime, &tm_store); - if (m_RTPlus_iDiffs > 0) - printf(" StartTime : %02d:%02d:%02d (last Title elapsed = %d s)\n", ts->tm_hour, ts->tm_min, ts->tm_sec, m_RTPlus_iDiffs); - else - printf(" StartTime : %02d:%02d:%02d\n", ts->tm_hour, ts->tm_min, ts->tm_sec); - printf(" RTp-Title : %s\n RTp-Artist: %s\n", m_RTPlus_Title, m_RTPlus_Artist); - } -#endif // RDS_IMPROVE_CHECK - m_RTPlus_ItemToggle = msgElement[5] & 0x10; - m_RTPlus_TToggle = false; - m_RTPlus_iDiffs = 0; - - std::string str; - - str = m_RTPlus_Artist; - m_currentInfoTag->SetArtist(str); - if (str.empty() && !m_currentInfoTag->GetComposer().empty()) - str = m_currentInfoTag->GetComposer(); - else if (str.empty() && !m_currentInfoTag->GetConductor().empty()) - str = m_currentInfoTag->GetConductor(); - else if (str.empty() && !m_currentInfoTag->GetBand().empty()) - str = m_currentInfoTag->GetBand(); - - if (!str.empty()) - g_charsetConverter.unknownToUTF8(str); - else if (m_currentChannel) - str = m_currentChannel->ChannelName(); - currentMusic->SetArtist(str); - - str = m_RTPlus_Title; - g_charsetConverter.unknownToUTF8(str); - currentMusic->SetTitle(str); - m_currentInfoTag->SetTitle(str); - m_currentFileUpdate = true; - } - m_RTPlus_iToggle = 0; - - return 10; -} - -unsigned int CDVDRadioRDSData::DecodeTMC(uint8_t *msgElement, unsigned int len) -{ - unsigned int msgElementLength = msgElement[1]; - if (msgElementLength == 0) - msgElementLength = 6; - if (msgElementLength + 2 > len) - { - m_UECPDataDeadBreak = true; - return 0; - } - - for (unsigned int i = 0; i < msgElementLength; i += 5) - SendTMCSignal(msgElement[2], msgElement+3+i); - - return msgElementLength + 2; -} - -unsigned int CDVDRadioRDSData::DecodeEPPTransmitterInfo(uint8_t *msgElement) -{ - if (!m_RDS_SlowLabelingCodesPresent && m_PI_CountryCode != 0) - { - int codeHigh = msgElement[2]&0xF0; - int codeLow = msgElement[2]&0x0F; - if (codeLow > 7) - { - CLog::Log(LOGERROR, "Radio RDS - %s - invalid country code 0x%02X%02X", __FUNCTION__, codeHigh, codeLow); - return 7; - } - - std::string countryName; - switch (codeHigh) - { - case 0xA0: - countryName = piCountryCodes_A[m_PI_CountryCode-1][codeLow]; - break; - case 0xD0: - countryName = piCountryCodes_D[m_PI_CountryCode-1][codeLow]; - break; - case 0xE0: - countryName = piCountryCodes_E[m_PI_CountryCode-1][codeLow]; - break; - case 0xF0: - countryName = piCountryCodes_F[m_PI_CountryCode-1][codeLow]; - break; - default: - CLog::Log(LOGERROR, "Radio RDS - %s - invalid extended country region code:%02X%02X", __FUNCTION__, codeHigh, codeLow); - return 7; - } - - m_RDS_IsRBDS = countryName == "US" ? true : false; - - m_currentInfoTag->SetCountry(countryName); - } - - return 7; -} - -/* SLOW LABELLING: see page 23 in the standard - * for paging see page 90, Annex M in the standard (NOT IMPLEMENTED) - * for extended country codes see page 69, Annex D.2 in the standard - * for language codes see page 84, Annex J in the standard - * for emergency warning systems (EWS) see page 53 in the standard */ -#define VARCODE_PAGING_EXTCOUNTRYCODE 0 -#define VARCODE_TMC_IDENT 1 -#define VARCODE_PAGING_IDENT 2 -#define VARCODE_LANGUAGE_CODES 3 -#define VARCODE_OWN_BROADCASTER 6 -#define VARCODE_EWS_CHANNEL_IDENT 7 -unsigned int CDVDRadioRDSData::DecodeSlowLabelingCodes(uint8_t *msgElement) -{ - uint16_t slowLabellingCode = (msgElement[2]<<8 | msgElement[3]) & 0xfff; - int VariantCode = (msgElement[2]>>4) & 0x7; - - switch (VariantCode) - { - case VARCODE_PAGING_EXTCOUNTRYCODE: // paging + ecc - { - // int paging = (slowLabellingCode>>8)&0x0f; unused - - if (m_PI_CountryCode != 0) - { - int codeHigh = slowLabellingCode&0xF0; - int codeLow = slowLabellingCode&0x0F; - if (codeLow > 5) - { - CLog::Log(LOGERROR, "Radio RDS - %s - invalid country code 0x%02X%02X", __FUNCTION__, codeHigh, codeLow); - return 4; - } - - std::string countryName; - switch (codeHigh) - { - case 0xA0: - countryName = piCountryCodes_A[m_PI_CountryCode-1][codeLow]; - break; - case 0xD0: - countryName = piCountryCodes_D[m_PI_CountryCode-1][codeLow]; - break; - case 0xE0: - countryName = piCountryCodes_E[m_PI_CountryCode-1][codeLow]; - break; - case 0xF0: - countryName = piCountryCodes_F[m_PI_CountryCode-1][codeLow]; - break; - default: - CLog::Log(LOGERROR, "Radio RDS - %s - invalid extended country region code:%02X%02X", __FUNCTION__, codeHigh, codeLow); - return 4; - } - - m_currentInfoTag->SetCountry(countryName); - } - break; - } - case VARCODE_LANGUAGE_CODES: // language codes - if (slowLabellingCode > 1 && slowLabellingCode < 0x80) - m_currentInfoTag->SetLanguage(piRDSLanguageCodes[slowLabellingCode]); - else - CLog::Log(LOGERROR, "Radio RDS - %s - invalid language code %i", __FUNCTION__, slowLabellingCode); - break; - - case VARCODE_TMC_IDENT: // TMC identification - case VARCODE_PAGING_IDENT: // Paging identification - case VARCODE_OWN_BROADCASTER: - case VARCODE_EWS_CHANNEL_IDENT: - default: - break; - } - - m_RDS_SlowLabelingCodesPresent = true; - return 4; -} - -/*! - * currently unused need to be checked on DAB, processed here to have length of it - */ -unsigned int CDVDRadioRDSData::DecodeDABDynLabelCmd(uint8_t *msgElement, unsigned int len) -{ - unsigned int msgElementLength = msgElement[1]; - if (msgElementLength < 1 || msgElementLength + 2 > len) - { - m_UECPDataDeadBreak = true; - return 0; - } - - return msgElementLength+2; -} - -/*! - * currently unused need to be checked on DAB, processed here to have length of it - */ -unsigned int CDVDRadioRDSData::DecodeDABDynLabelMsg(uint8_t *msgElement, unsigned int len) -{ - unsigned int msgElementLength = msgElement[1]; - if (msgElementLength < 2 || msgElementLength + 2 > len) - { - m_UECPDataDeadBreak = true; - return 0; - } - - return msgElementLength+2; -} - -/*! - * unused processed here to have length of it - */ -unsigned int CDVDRadioRDSData::DecodeAF(uint8_t *msgElement, unsigned int len) -{ - unsigned int msgElementLength = msgElement[3]; - if (msgElementLength < 3 || msgElementLength + 4 > len) - { - m_UECPDataDeadBreak = true; - return 0; - } - - return msgElementLength+4; -} - -/*! - * unused processed here to have length of it - */ -unsigned int CDVDRadioRDSData::DecodeEonAF(uint8_t *msgElement, unsigned int len) -{ - unsigned int msgElementLength = msgElement[3]; - if (msgElementLength < 4 || msgElementLength + 4 > len) - { - m_UECPDataDeadBreak = true; - return 0; - } - - return msgElementLength+4; -} - -/*! - * unused processed here to have length of it - */ -unsigned int CDVDRadioRDSData::DecodeTDC(uint8_t *msgElement, unsigned int len) -{ - unsigned int msgElementLength = msgElement[1]; - if (msgElementLength < 2 || msgElementLength+2 > len) - { - m_UECPDataDeadBreak = true; - return 0; - } - - return msgElementLength+2; -} - -void CDVDRadioRDSData::SendTMCSignal(unsigned int flags, uint8_t *data) -{ - if (!CSettings::GetInstance().GetBool("pvrplayback.sendrdstrafficmsg")) - return; - - if (!(flags & 0x80) && (memcmp(data, m_TMC_LastData, 5) == 0)) - return; - - memcpy(m_TMC_LastData, data, 5); - - if (m_currentChannel) - { - CVariant msg(CVariant::VariantTypeObject); - msg["channel"] = m_currentChannel->ChannelName(); - msg["ident"] = m_PI_Current; - msg["flags"] = flags; - msg["x"] = m_TMC_LastData[0]; - msg["y"] = (unsigned int)(m_TMC_LastData[1]<<8 | m_TMC_LastData[2]); - msg["z"] = (unsigned int)(m_TMC_LastData[3]<<8 | m_TMC_LastData[4]); - - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::PVR, "xbmc", "RDSRadioTMC", msg); - } -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerRadioRDS.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerRadioRDS.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerRadioRDS.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerRadioRDS.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this Software; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include - -#include "IDVDPlayer.h" -#include "DVDMessageQueue.h" -#include "FileItem.h" -#include "threads/Thread.h" -#include "utils/Stopwatch.h" - -class CDVDStreamInfo; - -/// --- CDVDRadioRDSData ------------------------------------------------------------ - -#define UECP_DATA_START 0xFE /*!< A data record starts with the start byte */ -#define UECP_DATA_STOP 0xFF /*!< A data record stops with the stop byte */ -#define UECP_SIZE_MAX 263 /*!< The Max possible size of a UECP packet - max. 255(MSG)+4(ADD/SQC/MFL)+2(CRC)+2(Start/Stop) of RDS-data */ -#define RT_MEL 65 -#define MAX_RTPC 50 -#define MAX_RADIOTEXT_LISTSIZE 6 - -class CDVDRadioRDSData : public CThread, public IDVDStreamPlayer -{ -public: - CDVDRadioRDSData(); - virtual ~CDVDRadioRDSData(); - - bool CheckStream(CDVDStreamInfo &hints); - bool OpenStream(CDVDStreamInfo &hints); - void CloseStream(bool bWaitForBuffers); - void Flush(); - - // waits until all available data has been rendered - void WaitForBuffers() { m_messageQueue.WaitUntilEmpty(); } - bool AcceptsData() const { return !m_messageQueue.IsFull(); } - void SendMessage(CDVDMsg* pMsg, int priority = 0) { if(m_messageQueue.IsInited()) m_messageQueue.Put(pMsg, priority); } - void FlushMessages() { m_messageQueue.Flush(); } - bool IsInited() const { return true; } - bool IsStalled() const { return true; } - - std::string GetRadioText(unsigned int line); - -protected: - virtual void OnExit(); - virtual void Process(); - -private: - void ResetRDSCache(); - void ProcessUECP(const unsigned char *Data, unsigned int Length); - - inline unsigned int DecodePI(uint8_t *msgElement); - inline unsigned int DecodePS(uint8_t *msgElement); - inline unsigned int DecodeDI(uint8_t *msgElement); - inline unsigned int DecodeTA_TP(uint8_t *msgElement); - inline unsigned int DecodeMS(uint8_t *msgElement); - inline unsigned int DecodePTY(uint8_t *msgElement); - inline unsigned int DecodePTYN(uint8_t *msgElement); - inline unsigned int DecodeRT(uint8_t *msgElement, unsigned int len); - inline unsigned int DecodeRTC(uint8_t *msgElement); - inline unsigned int DecodeODA(uint8_t *msgElement, unsigned int len); - inline unsigned int DecodeRTPlus(uint8_t *msgElement, unsigned int len); - inline unsigned int DecodeTMC(uint8_t *msgElement, unsigned int len); - inline unsigned int DecodeEPPTransmitterInfo(uint8_t *msgElement); - inline unsigned int DecodeSlowLabelingCodes(uint8_t *msgElement); - inline unsigned int DecodeDABDynLabelCmd(uint8_t *msgElement, unsigned int len); - inline unsigned int DecodeDABDynLabelMsg(uint8_t *msgElement, unsigned int len); - inline unsigned int DecodeAF(uint8_t *msgElement, unsigned int len); - inline unsigned int DecodeEonAF(uint8_t *msgElement, unsigned int len); - inline unsigned int DecodeTDC(uint8_t *msgElement, unsigned int len); - - void SendTMCSignal(unsigned int flags, uint8_t *data); - void SetRadioStyle(std::string genre); - - PVR::CPVRRadioRDSInfoTagPtr m_currentInfoTag; - PVR::CPVRChannelPtr m_currentChannel; - bool m_currentFileUpdate; - int m_speed; - CCriticalSection m_critSection; - CDVDMessageQueue m_messageQueue; - - uint8_t m_UECPData[UECP_SIZE_MAX+1]; - unsigned int m_UECPDataIndex; - bool m_UECPDataStart; - bool m_UECPDatabStuff; - bool m_UECPDataDeadBreak; - - bool m_RDS_IsRBDS; - bool m_RDS_SlowLabelingCodesPresent; - - uint16_t m_PI_Current; - unsigned int m_PI_CountryCode; - unsigned int m_PI_ProgramType; - unsigned int m_PI_ProgramReferenceNumber; - - unsigned int m_EPP_TM_INFO_ExtendedCountryCode; - - #define PS_TEXT_ENTRIES 12 - bool m_PS_Present; - int m_PS_Index; - char m_PS_Text[PS_TEXT_ENTRIES][9]; - - bool m_DI_IsStereo; - bool m_DI_ArtificialHead; - bool m_DI_Compressed; - bool m_DI_DynamicPTY; - - bool m_TA_TP_TrafficAdvisory; - float m_TA_TP_TrafficVolume; - - bool m_MS_SpeechActive; - - int m_PTY; - char m_PTYN[9]; - bool m_PTYN_Present; - - bool m_RT_Present; - std::deque m_RT; - int m_RT_Index; - int m_RT_MaxSize; - bool m_RT_NewItem; - char m_RT_Text[6][RT_MEL+1]; - - bool m_RTPlus_Present; - uint8_t m_RTPlus_WorkText[RT_MEL+1]; - bool m_RTPlus_TToggle; - int m_RTPlus_iDiffs; - CStopWatch m_RTPlus_iTime; - bool m_RTPlus_GenrePresent; - char m_RTPlus_Temptext[RT_MEL]; - bool m_RTPlus_Show; - char m_RTPlus_Title[RT_MEL]; - char m_RTPlus_Artist[RT_MEL]; - int m_RTPlus_iToggle; - unsigned int m_RTPlus_ItemToggle; - time_t m_RTPlus_Starttime; - - CDateTime m_RTC_DateTime; ///< From RDS transmitted date / time data - - uint8_t m_TMC_LastData[5]; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerSubtitle.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerSubtitle.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerSubtitle.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerSubtitle.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -31,6 +31,8 @@ #include "config.h" #endif +using namespace std; + CDVDPlayerSubtitle::CDVDPlayerSubtitle(CDVDOverlayContainer* pOverlayContainer) { m_pOverlayContainer = pOverlayContainer; @@ -131,7 +133,7 @@ pMsg->Release(); } -bool CDVDPlayerSubtitle::OpenStream(CDVDStreamInfo &hints, std::string &filename) +bool CDVDPlayerSubtitle::OpenStream(CDVDStreamInfo &hints, string &filename) { CSingleLock lock(m_section); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerTeletext.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerTeletext.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerTeletext.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerTeletext.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,6 +24,8 @@ #include "utils/log.h" #include "threads/SingleLock.h" +using namespace std; + const uint8_t rev_lut[32] = { 0x00,0x08,0x04,0x0c, /* upper nibble */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -41,6 +41,7 @@ #include #include "utils/log.h" +using namespace std; using namespace RenderManager; class CPulldownCorrection @@ -219,8 +220,8 @@ m_bFpsInvalid = (hint.fpsrate == 0 || hint.fpsscale == 0); m_pullupCorrection.ResetVFRDetection(); - m_bCalcFrameRate = CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK) || - CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE) != ADJUST_REFRESHRATE_OFF; + m_bCalcFrameRate = CSettings::Get().GetBool("videoplayer.usedisplayasclock") || + CSettings::Get().GetInt("videoplayer.adjustrefreshrate") != ADJUST_REFRESHRATE_OFF; ResetFrameRateCalc(); m_iDroppedRequest = 0; @@ -546,8 +547,8 @@ m_pVideoCodec->SetDropState(bRequestDrop); // ask codec to do deinterlacing if possible - EDEINTERLACEMODE mDeintMode = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode; - EINTERLACEMETHOD mInt = g_renderManager.AutoInterlaceMethod(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod); + EDEINTERLACEMODE mDeintMode = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; + EINTERLACEMETHOD mInt = g_renderManager.AutoInterlaceMethod(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod); unsigned int mFilters = 0; @@ -680,7 +681,7 @@ } } - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_PostProcess) + if (CMediaSettings::Get().GetCurrentVideoSettings().m_PostProcess) { if (!sPostProcessType.empty()) sPostProcessType += ","; @@ -928,7 +929,6 @@ case RENDER_FMT_EGLIMG: return "EGLIMG"; case RENDER_FMT_BYPASS: return "BYPASS"; case RENDER_FMT_MEDIACODEC:return "MEDIACODEC"; - case RENDER_FMT_MEDIACODECSURFACE:return "MEDIACODECSURFACE"; case RENDER_FMT_IMXMAP: return "IMXMAP"; case RENDER_FMT_MMAL: return "MMAL"; case RENDER_FMT_NONE: return "NONE"; @@ -940,14 +940,14 @@ { std::string stereo_mode; - switch(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_StereoMode) + switch(CMediaSettings::Get().GetCurrentVideoSettings().m_StereoMode) { case RENDER_STEREO_MODE_SPLIT_VERTICAL: stereo_mode = "left_right"; break; case RENDER_STEREO_MODE_SPLIT_HORIZONTAL: stereo_mode = "top_bottom"; break; default: stereo_mode = m_hints.stereo_mode; break; } - if(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_StereoInvert) + if(CMediaSettings::Get().GetCurrentVideoSettings().m_StereoInvert) stereo_mode = GetStereoModeInvert(stereo_mode); return stereo_mode; } @@ -968,7 +968,7 @@ #ifdef HAS_VIDEO_PLAYBACK double config_framerate = m_bFpsInvalid ? 0.0 : m_fFrameRate; double render_framerate = g_graphicsContext.GetFPS(); - if (CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE) == ADJUST_REFRESHRATE_OFF) + if (CSettings::Get().GetInt("videoplayer.adjustrefreshrate") == ADJUST_REFRESHRATE_OFF) render_framerate = config_framerate; bool changerefresh = !m_bFpsInvalid && (m_output.framerate == 0.0 || fmod(m_output.framerate, config_framerate) != 0.0) && @@ -1157,7 +1157,7 @@ // timestamp when we think next picture should be displayed based on current duration m_FlipTimeStamp = iCurrentClock; - m_FlipTimeStamp += std::max(0.0, iSleepTime); + m_FlipTimeStamp += max(0.0, iSleepTime); m_FlipTimePts = pts; if ((pPicture->iFlags & DVP_FLAG_DROPPED)) @@ -1219,10 +1219,10 @@ std::string CDVDPlayerVideo::GetPlayerInfo() { std::ostringstream s; - s << "fr:" << std::fixed << std::setprecision(3) << m_fFrameRate; - s << ", vq:" << std::setw(2) << std::min(99,GetLevel()) << "%"; + s << "fr:" << fixed << setprecision(3) << m_fFrameRate; + s << ", vq:" << setw(2) << min(99,GetLevel()) << "%"; s << ", dc:" << m_codecname; - s << ", Mb/s:" << std::fixed << std::setprecision(2) << (double)GetVideoBitrate() / (1024.0*1024.0); + s << ", Mb/s:" << fixed << setprecision(2) << (double)GetVideoBitrate() / (1024.0*1024.0); s << ", drop:" << m_iDroppedFrames; s << ", skip:" << g_renderManager.GetSkippedFrames(); @@ -1247,7 +1247,7 @@ m_iFrameRateLength = 1; m_iFrameRateErr = 0; - m_bAllowDrop = (!m_bCalcFrameRate && CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ScalingMethod != VS_SCALINGMETHOD_AUTO) || + m_bAllowDrop = (!m_bCalcFrameRate && CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod != VS_SCALINGMETHOD_AUTO) || g_advancedSettings.m_videoFpsDetect == 0; } @@ -1265,7 +1265,7 @@ return DVD_NOPTS_VALUE; else if (m_speed == DVD_PLAYSPEED_NORMAL) { - iRenderPts -= std::max(0.0, DVD_SEC_TO_TIME(iSleepTime)); + iRenderPts -= max(0.0, DVD_SEC_TO_TIME(iSleepTime)); if (iRenderPts < 0) iRenderPts = 0; @@ -1283,7 +1283,7 @@ //only calculate the framerate if sync playback to display is on, adjust refreshrate is on, //or scaling method is set to auto - if (!m_bCalcFrameRate && CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ScalingMethod != VS_SCALINGMETHOD_AUTO) + if (!m_bCalcFrameRate && CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod != VS_SCALINGMETHOD_AUTO) { ResetFrameRateCalc(); return; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDFactorySubtitle.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDFactorySubtitle.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDFactorySubtitle.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDFactorySubtitle.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,7 +29,10 @@ #include "DVDSubtitleParserSSA.h" #include "DVDSubtitleParserVplayer.h" -CDVDSubtitleParser* CDVDFactorySubtitle::CreateParser(std::string& strFile) +using namespace std; + + +CDVDSubtitleParser* CDVDFactorySubtitle::CreateParser(string& strFile) { char line[1024]; int i; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserMicroDVD.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserMicroDVD.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserMicroDVD.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserMicroDVD.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,7 +26,9 @@ #include "utils/log.h" #include "DVDSubtitleTagMicroDVD.h" -CDVDSubtitleParserMicroDVD::CDVDSubtitleParserMicroDVD(CDVDSubtitleStream* stream, const std::string& filename) +using namespace std; + +CDVDSubtitleParserMicroDVD::CDVDSubtitleParserMicroDVD(CDVDSubtitleStream* stream, const string& filename) : CDVDSubtitleParserText(stream, filename), m_framerate( DVD_TIME_BASE / 25.0 ) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserMPL2.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserMPL2.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserMPL2.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserMPL2.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,7 +25,9 @@ #include "DVDStreamInfo.h" #include "DVDSubtitleTagMicroDVD.h" -CDVDSubtitleParserMPL2::CDVDSubtitleParserMPL2(CDVDSubtitleStream* stream, const std::string& filename) +using namespace std; + +CDVDSubtitleParserMPL2::CDVDSubtitleParserMPL2(CDVDSubtitleStream* stream, const string& filename) : CDVDSubtitleParserText(stream, filename), m_framerate(DVD_TIME_BASE / 10.0) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSami.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSami.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSami.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSami.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,9 @@ #include "utils/URIUtils.h" #include "DVDSubtitleTagSami.h" -CDVDSubtitleParserSami::CDVDSubtitleParserSami(CDVDSubtitleStream* pStream, const std::string& filename) +using namespace std; + +CDVDSubtitleParserSami::CDVDSubtitleParserSami(CDVDSubtitleStream* pStream, const string& filename) : CDVDSubtitleParserText(pStream, filename) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSSA.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSSA.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSSA.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSSA.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,9 @@ #include "DVDClock.h" #include "utils/log.h" -CDVDSubtitleParserSSA::CDVDSubtitleParserSSA(CDVDSubtitleStream* pStream, const std::string& strFile) +using namespace std; + +CDVDSubtitleParserSSA::CDVDSubtitleParserSSA(CDVDSubtitleStream* pStream, const string& strFile) : CDVDSubtitleParserText(pStream, strFile) { m_libass = new CDVDSubtitlesLibass(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSubrip.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSubrip.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSubrip.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserSubrip.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,9 @@ #include "utils/StringUtils.h" #include "DVDSubtitleTagSami.h" -CDVDSubtitleParserSubrip::CDVDSubtitleParserSubrip(CDVDSubtitleStream* pStream, const std::string& strFile) +using namespace std; + +CDVDSubtitleParserSubrip::CDVDSubtitleParserSubrip(CDVDSubtitleStream* pStream, const string& strFile) : CDVDSubtitleParserText(pStream, strFile) { } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserVplayer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserVplayer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserVplayer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParserVplayer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,9 @@ #include "DVDClock.h" #include "utils/RegExp.h" -CDVDSubtitleParserVplayer::CDVDSubtitleParserVplayer(CDVDSubtitleStream* pStream, const std::string& strFile) +using namespace std; + +CDVDSubtitleParserVplayer::CDVDSubtitleParserVplayer(CDVDSubtitleStream* pStream, const string& strFile) : CDVDSubtitleParserText(pStream, strFile), m_framerate(DVD_TIME_BASE) { } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,6 +29,8 @@ #include "threads/SingleLock.h" #include "guilib/GraphicContext.h" +using namespace std; + static void libass_log(int level, const char *fmt, va_list args, void *data) { if(level >= 5) @@ -76,10 +78,10 @@ return; //Setting default font to the Arial in \media\fonts (used if FontConfig fails) - strPath = URIUtils::AddFileToFolder("special://home/media/Fonts/", CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_FONT)); + strPath = URIUtils::AddFileToFolder("special://home/media/Fonts/", CSettings::Get().GetString("subtitles.font")); if (!XFILE::CFile::Exists(strPath)) - strPath = URIUtils::AddFileToFolder("special://xbmc/media/Fonts/", CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_FONT)); - int fc = !CSettings::GetInstance().GetBool(CSettings::SETTING_SUBTITLES_OVERRIDEASSFONTS); + strPath = URIUtils::AddFileToFolder("special://xbmc/media/Fonts/", CSettings::Get().GetString("subtitles.font")); + int fc = !CSettings::Get().GetBool("subtitles.overrideassfonts"); m_dll.ass_set_margins(m_renderer, 0, 0, 0, 0); m_dll.ass_set_use_margins(m_renderer, 0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleStream.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleStream.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleStream.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleStream.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -30,6 +30,7 @@ #include "utils/log.h" #include "utils/URIUtils.h" +using namespace std; CDVDSubtitleStream::CDVDSubtitleStream() { @@ -39,11 +40,11 @@ { } -bool CDVDSubtitleStream::Open(const std::string& strFile) +bool CDVDSubtitleStream::Open(const string& strFile) { CDVDInputStream* pInputStream; pInputStream = CDVDFactoryInputStream::CreateInputStream(NULL, strFile, ""); - if (pInputStream && pInputStream->Open(strFile.c_str(), "", false)) + if (pInputStream && pInputStream->Open(strFile.c_str(), "")) { // prepare buffer size_t totalread = 0; @@ -145,17 +146,17 @@ { case SEEK_CUR: { - m_stringstream.seekg(offset, std::ios::cur); + m_stringstream.seekg(offset, ios::cur); break; } case SEEK_END: { - m_stringstream.seekg(offset, std::ios::end); + m_stringstream.seekg(offset, ios::end); break; } case SEEK_SET: { - m_stringstream.seekg(offset, std::ios::beg); + m_stringstream.seekg(offset, ios::beg); break; } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDTSCorrection.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDTSCorrection.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDTSCorrection.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDTSCorrection.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,8 @@ #define MAXERR DVD_MSEC_TO_TIME(2.5) +using namespace std; + CPullupCorrection::CPullupCorrection() { ResetVFRDetection(); @@ -38,7 +40,6 @@ m_minframeduration = DVD_NOPTS_VALUE; m_maxframeduration = DVD_NOPTS_VALUE; m_VFRCounter = 0; - m_patternCounter = 0; } void CPullupCorrection::Flush() @@ -80,7 +81,7 @@ return; //get the current pattern in the ringbuffer - std::vector pattern; + vector pattern; GetPattern(pattern); //check if the pattern is the same as the saved pattern @@ -90,7 +91,6 @@ if (m_haspattern) { m_VFRCounter++; - m_lastPattern = m_pattern; CLog::Log(LOGDEBUG, "CPullupCorrection: pattern lost on diff %f, number of losses %i", GetDiff(0), m_VFRCounter); Flush(); } @@ -115,11 +115,6 @@ m_haspattern = true; m_patternlength = m_pattern.size(); - if (!CheckPattern(m_lastPattern)) - { - m_patternCounter++; - } - double frameduration = CalcFrameDuration(); CLog::Log(LOGDEBUG, "CPullupCorrection: detected pattern of length %i: %s, frameduration: %f", (int)pattern.size(), GetPatternStr().c_str(), frameduration); @@ -174,7 +169,7 @@ //difftypesbuff[1] the one added before that etc //get the difftypes - std::vector difftypes; + vector difftypes; GetDifftypes(difftypes); //mark each diff with what difftype it is @@ -232,7 +227,7 @@ } //calculate the different types of diffs we have -void CPullupCorrection::GetDifftypes(std::vector& difftypes) +void CPullupCorrection::GetDifftypes(vector& difftypes) { for (int i = 0; i < m_ringfill; i++) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDTSCorrection.h kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDTSCorrection.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/DVDTSCorrection.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/DVDTSCorrection.h 2015-10-19 08:38:33.000000000 +0000 @@ -25,7 +25,6 @@ #define DIFFRINGSIZE 120 #define VFR_DETECTION_THRESHOLD 3 -#define VFR_PATTERN_THRESHOLD 2 class CPullupCorrection { @@ -41,7 +40,7 @@ double GetMaxFrameDuration(void) { return m_maxframeduration; } double GetMinFrameDuration(void) { return m_minframeduration; } bool HasFullBuffer() { return m_ringfill == DIFFRINGSIZE; } - bool VFRDetection(void) { return ((m_VFRCounter >= VFR_DETECTION_THRESHOLD) && (m_patternCounter >= VFR_PATTERN_THRESHOLD)); } + bool VFRDetection(void) { return (m_VFRCounter >= VFR_DETECTION_THRESHOLD); } private: double m_prevpts; //last pts added @@ -64,16 +63,15 @@ double CalcFrameDuration(); //calculates the frame duration from m_pattern - std::vector m_pattern, m_lastPattern; //the last saved pattern - int m_patternpos; //the position of the pattern in the ringbuffer, moves one to the past each time a pts is added + std::vector m_pattern; //the last saved pattern + int m_patternpos; //the position of the pattern in the ringbuffer, moves one to the past each time a pts is added double m_ptscorrection; //the correction needed for the last added pts double m_trackingpts; //tracked pts for smoothing the timestamps double m_frameduration; //frameduration exposed to dvdplayer, used for calculating the fps double m_maxframeduration; //Max value detected for frame duration (for VFR files case) double m_minframeduration; //Min value detected for frame duration (for VFR files case) - bool m_haspattern; //for the log and detecting VFR files case - int m_patternlength; //for the codec info - int m_VFRCounter; //retry counter for VFR detection - int m_patternCounter; - std::string GetPatternStr(); //also for the log + bool m_haspattern; //for the log and detecting VFR files case + int m_patternlength; //for the codec info + int m_VFRCounter; //retry counter for VFR detection + std::string GetPatternStr(); //also for the log }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/Edl.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/Edl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/Edl.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/Edl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,6 +29,8 @@ #include "pvr/recordings/PVRRecordings.h" #include "pvr/PVRManager.h" +using namespace std; + #define COMSKIP_HEADER "FILE PROCESSING COMPLETE" #define VIDEOREDO_HEADER "2" #define VIDEOREDO_TAG_CUT "" @@ -183,7 +185,7 @@ continue; } - std::vector strFields(2); + vector strFields(2); strFields[0] = buffer1; strFields[1] = buffer2; @@ -202,7 +204,7 @@ { if (strFields[i].find(":") != std::string::npos) // HH:MM:SS.sss format { - std::vector fieldParts = StringUtils::Split(strFields[i], '.'); + vector fieldParts = StringUtils::Split(strFields[i], '.'); if (fieldParts.size() == 1) // No ms { iCutStartEnd[i] = StringUtils::TimeStringToSeconds(fieldParts[0]) * (int64_t)1000; // seconds to ms @@ -705,7 +707,7 @@ } else { - std::vector::iterator pCurrentCut; + vector::iterator pCurrentCut; for (pCurrentCut = m_vecCuts.begin(); pCurrentCut != m_vecCuts.end(); ++pCurrentCut) { if (cut.start < pCurrentCut->start) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/cores/dvdplayer/Makefile.in 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/dvdplayer/Makefile.in 2015-10-19 08:39:16.000000000 +0000 @@ -10,7 +10,6 @@ SRCS += DVDOverlayRenderer.cpp SRCS += DVDPlayer.cpp SRCS += DVDPlayerAudio.cpp -SRCS += DVDPlayerRadioRDS.cpp SRCS += DVDPlayerSubtitle.cpp SRCS += DVDPlayerTeletext.cpp SRCS += DVDPlayerVideo.cpp diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/ExternalPlayer/ExternalPlayer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/ExternalPlayer/ExternalPlayer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/ExternalPlayer/ExternalPlayer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/ExternalPlayer/ExternalPlayer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -35,7 +35,6 @@ #include "URL.h" #include "utils/XMLUtils.h" #include "utils/log.h" -#include "utils/Variant.h" #include "cores/AudioEngine/AEFactory.h" #include "input/InputManager.h" #if defined(TARGET_WINDOWS) @@ -339,14 +338,13 @@ { CSingleLock lock(g_graphicsContext); m_dialog = (CGUIDialogOK *)g_windowManager.GetWindow(WINDOW_DIALOG_OK); - m_dialog->SetHeading(CVariant{23100}); - m_dialog->SetLine(1, CVariant{23104}); - m_dialog->SetLine(2, CVariant{23105}); - m_dialog->SetLine(3, CVariant{23106}); + m_dialog->SetHeading(23100); + m_dialog->SetLine(1, 23104); + m_dialog->SetLine(2, 23105); + m_dialog->SetLine(3, 23106); } - if (!m_bAbortRequest) - m_dialog->Open(); + if (!m_bAbortRequest) m_dialog->DoModal(); } m_bIsPlaying = false; @@ -411,8 +409,8 @@ si.wShowWindow = m_hideconsole ? SW_HIDE : SW_SHOW; std::wstring WstrPath, WstrSwitches; - g_charsetConverter.utf8ToW(strPath, WstrPath, false); - g_charsetConverter.utf8ToW(strSwitches, WstrSwitches, false); + g_charsetConverter.utf8ToW(strPath, WstrPath); + g_charsetConverter.utf8ToW(strSwitches, WstrSwitches); if (m_bAbortRequest) return false; @@ -461,13 +459,13 @@ { CLog::Log(LOGNOTICE, "%s: %s", __FUNCTION__, strSwitches); - bool remoteUsed = CInputManager::GetInstance().IsRemoteControlEnabled(); - CInputManager::GetInstance().DisableRemoteControl(); + bool remoteUsed = CInputManager::Get().IsRemoteControlEnabled(); + CInputManager::Get().DisableRemoteControl(); int ret = system(strSwitches); if (remoteUsed) - CInputManager::GetInstance().EnableRemoteControl(); + CInputManager::Get().EnableRemoteControl(); if (ret != 0) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/FFmpeg.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/FFmpeg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/FFmpeg.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/FFmpeg.cpp 2014-12-18 01:01:55.000000000 +0000 @@ -24,7 +24,6 @@ #include "utils/StringUtils.h" #include "threads/Thread.h" #include "settings/AdvancedSettings.h" -#include "URL.h" #include /* callback for the ffmpeg lock manager */ @@ -117,18 +116,8 @@ int pos, start = 0; while( (pos = buffer.find_first_of('\n', start)) >= 0 ) { - if(pos > start) - { - std::vector toLog = StringUtils::Split(buffer.substr(start, pos - start), "from '"); - if (toLog.size() > 1) - { - size_t pos = toLog[1].find_first_of('\''); - std::string url = CURL::GetRedacted(toLog[1].substr(0, pos - 1)); - toLog[0] += url + toLog[1].substr(pos); - } - - CLog::Log(type, "%s%s", prefix.c_str(), toLog[0].c_str()); - } + if(pos>start) + CLog::Log(type, "%s%s", prefix.c_str(), buffer.substr(start, pos-start).c_str()); start = pos+1; } buffer.erase(0, start); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/FFmpeg.h kodi-15.2~git20151019.1039-final/xbmc/cores/FFmpeg.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/FFmpeg.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/FFmpeg.h 2015-10-19 08:39:16.000000000 +0000 @@ -74,4 +74,3 @@ void ff_avutil_log(void* ptr, int level, const char* format, va_list va); void ff_flush_avutil_log_buffers(void); -#define FFMPEG_FILE_BUFFER_SIZE 32768 // default reading size for ffmpeg diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/IPlayer.h kodi-15.2~git20151019.1039-final/xbmc/cores/IPlayer.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/IPlayer.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/IPlayer.h 2015-10-19 08:39:16.000000000 +0000 @@ -141,7 +141,6 @@ virtual bool IsPaused() const = 0; virtual bool HasVideo() const = 0; virtual bool HasAudio() const = 0; - virtual bool HasRDS() const { return false; } virtual bool IsPassthrough() const { return false;} virtual bool CanSeek() {return true;} virtual void Seek(bool bPlus = true, bool bLargeStep = false, bool bChapterOverride = false) = 0; @@ -186,8 +185,6 @@ virtual TextCacheStruct_t* GetTeletextCache() { return NULL; }; virtual void LoadPage(int p, int sp, unsigned char* buffer) {}; - virtual std::string GetRadioText(unsigned int line) { return ""; }; - virtual int GetChapterCount() { return 0; } virtual int GetChapter() { return -1; } virtual void GetChapterName(std::string& strChapterName, int chapterIdx = -1) { return; } @@ -208,14 +205,6 @@ */ virtual int64_t GetTime() { return 0; } /*! - \brief Sets the current time. This - can be used for injecting the current time. - This is not to be confused with a seek. It just - can be used if endless streams contain multiple - tracks in reality (like with airtunes) - */ - virtual void SetTime(int64_t time) { } - /*! \brief time of frame on screen in milliseconds */ virtual int64_t GetDisplayTime() { return GetTime(); } @@ -223,12 +212,6 @@ \brief total time in milliseconds */ virtual int64_t GetTotalTime() { return 0; } - /*! - \brief Set the total time in milliseconds - this can be used for injecting the duration in case - its not available in the underlaying decoder (airtunes for example) - */ - virtual void SetTotalTime(int64_t time) { } virtual void GetVideoStreamInfo(SPlayerVideoStreamInfo &info){}; virtual int GetSourceBitrate(){ return 0;} virtual bool GetStreamDetails(CStreamDetails &details){ return false;} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,7 +26,6 @@ #include "cores/AudioEngine/Utils/AEUtil.h" #include "cores/AudioEngine/AEFactory.h" -#include "settings/Settings.h" // the size of the audio_render output port buffers #define AUDIO_DECODE_OUTPUT_BUFFER (32*1024) @@ -63,15 +62,10 @@ bool COMXAudioCodecOMX::Open(CDVDStreamInfo &hints) { - AVCodec* pCodec = NULL; + AVCodec* pCodec; m_bOpenedCodec = false; - if (hints.codec == AV_CODEC_ID_DTS && CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_SUPPORTSDTSHDCPUDECODING)) - pCodec = avcodec_find_decoder_by_name("libdcadec"); - - if (!pCodec) - pCodec = avcodec_find_decoder(hints.codec); - + pCodec = avcodec_find_decoder(hints.codec); if (!pCodec) { CLog::Log(LOGDEBUG,"COMXAudioCodecOMX::Open() Unable to find codec %d", hints.codec); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXAudio.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXAudio.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXAudio.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXAudio.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -136,7 +136,7 @@ return false; } - SetDynamicRangeCompression((long)(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification * 100)); + SetDynamicRangeCompression((long)(CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification * 100)); UpdateAttenuation(); if( m_omx_mixer.IsInitialized() ) @@ -155,7 +155,7 @@ // round up to power of 2 m_pcm_output.nChannels = m_OutputChannels > 4 ? 8 : m_OutputChannels > 2 ? 4 : m_OutputChannels; /* limit samplerate (through resampling) if requested */ - m_pcm_output.nSamplingRate = std::min(std::max((int)m_pcm_output.nSamplingRate, 8000), CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_SAMPLERATE)); + m_pcm_output.nSamplingRate = std::min(std::max((int)m_pcm_output.nSamplingRate, 8000), CSettings::Get().GetInt("audiooutput.samplerate")); m_pcm_output.nPortIndex = m_omx_mixer.GetOutputPort(); omx_err = m_omx_mixer.SetParameter(OMX_IndexParamAudioPcm, &m_pcm_output); @@ -248,7 +248,7 @@ { // By default audio_render is the clock master, and if output samples don't fit the timestamps, it will speed up/slow down the clock. // This tends to be better for maintaining audio sync and avoiding audio glitches, but can affect video/display sync - if(CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK) || m_output == AESINKPI_BOTH) + if(CSettings::Get().GetBool("videoplayer.usedisplayasclock") || m_output == AESINKPI_BOTH) { OMX_CONFIG_BOOLEANTYPE configBool; OMX_INIT_STRUCTURE(configBool); @@ -274,7 +274,7 @@ { // By default audio_render is the clock master, and if output samples don't fit the timestamps, it will speed up/slow down the clock. // This tends to be better for maintaining audio sync and avoiding audio glitches, but can affect video/display sync - if(CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK)) + if(CSettings::Get().GetBool("videoplayer.usedisplayasclock")) { OMX_CONFIG_BOOLEANTYPE configBool; OMX_INIT_STRUCTURE(configBool); @@ -570,11 +570,11 @@ } SetCodingType(format.m_dataFormat); - if (m_Passthrough || CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE) == "PI:HDMI") + if (m_Passthrough || CSettings::Get().GetString("audiooutput.audiodevice") == "PI:HDMI") m_output = AESINKPI_HDMI; - else if (CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE) == "PI:Analogue") + else if (CSettings::Get().GetString("audiooutput.audiodevice") == "PI:Analogue") m_output = AESINKPI_ANALOGUE; - else if (CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE) == "PI:Both") + else if (CSettings::Get().GetString("audiooutput.audiodevice") == "PI:Both") m_output = AESINKPI_BOTH; else assert(0); @@ -598,11 +598,11 @@ if (!m_Passthrough) { - bool upmix = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_STEREOUPMIX); - bool normalize = !CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_MAINTAINORIGINALVOLUME); + bool upmix = CSettings::Get().GetBool("audiooutput.stereoupmix"); + bool normalize = !CSettings::Get().GetBool("audiooutput.maintainoriginalvolume"); void *remapLayout = NULL; - CAEChannelInfo stdLayout = (enum AEStdChLayout)CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CHANNELS); + CAEChannelInfo stdLayout = (enum AEStdChLayout)CSettings::Get().GetInt("audiooutput.channels"); // ignore layout setting for analogue if (m_output == AESINKPI_ANALOGUE || m_output == AESINKPI_BOTH) @@ -611,7 +611,7 @@ CAEChannelInfo resolvedMap = channelMap; resolvedMap.ResolveChannels(stdLayout); - if (CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOOUTPUT_CONFIG) == AE_CONFIG_FIXED || (upmix && channelMap.Count() <= 2)) + if (CSettings::Get().GetInt("audiooutput.config") == AE_CONFIG_FIXED || (upmix && channelMap.Count() <= 2)) resolvedMap = stdLayout; uint64_t m_dst_chan_layout = GetAVChannelLayout(resolvedMap); @@ -725,8 +725,6 @@ m_wave_header.dwChannelMask = m_src_chan_layout; } - else - SetAudioProps(m_Passthrough, 0); m_SampleRate = m_format.m_sampleRate; m_BitsPerSample = CAEUtil::DataFormatToBits(m_format.m_dataFormat); @@ -1204,7 +1202,7 @@ if(pts > m_last_pts) m_last_pts = pts; else - omx_buffer->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN; + omx_buffer->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;; } else if (m_last_pts == pts) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXHelper.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXHelper.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXHelper.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXHelper.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -44,27 +44,18 @@ bool OMXPlayerUnsuitable(bool m_HasVideo, bool m_HasAudio, CDVDDemux* m_pDemuxer, CDVDInputStream* m_pInputStream, CSelectionStreams &m_SelectionStreams) { - // if no OMXPlayer acceleration then it is not suitable - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEOMXPLAYER)) - return true; // if no MMAL acceleration stick with omxplayer regardless - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMMAL)) + if (!CSettings::Get().GetBool("videoplayer.usemmal")) return false; // omxplayer only handles Pi sink - if (CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE) != "PI:Analogue" && - CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE) != "PI:HDMI" && - CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE) != "PI:Both") + if (CSettings::Get().GetString("audiooutput.audiodevice") != "PI:Analogue" && + CSettings::Get().GetString("audiooutput.audiodevice") != "PI:HDMI" && + CSettings::Get().GetString("audiooutput.audiodevice") != "PI:Both") { CLog::Log(LOGNOTICE, "%s OMXPlayer unsuitable due to audio sink", __func__); return true; } - // omxplayer doesn't handle ac3 transcode - if (CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_AC3TRANSCODE)) - { - CLog::Log(LOGNOTICE, "%s OMXPlayer unsuitable due to ac3transcode", __func__); - return true; - } if (m_pDemuxer) { // find video stream @@ -75,7 +66,7 @@ { int iStream = it->id; CDemuxStream *stream = m_pDemuxer->GetStream(iStream); - if(!stream || stream->disabled || stream->flags & AV_DISPOSITION_ATTACHED_PIC) + if(!stream || stream->disabled) continue; CDVDStreamInfo hint(*stream, true); @@ -130,19 +121,19 @@ bool audio_fifo_low = false, video_fifo_low = false, audio_fifo_high = false, video_fifo_high = false; if (m_OmxPlayerState.interlace_method == VS_INTERLACEMETHOD_MAX) - m_OmxPlayerState.interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod); + m_OmxPlayerState.interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod); // if deinterlace setting has changed, we should close and open video - if (m_OmxPlayerState.current_deinterlace != CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode || + if (m_OmxPlayerState.current_deinterlace != CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode || (m_OmxPlayerState.current_deinterlace != VS_DEINTERLACEMODE_OFF && - m_OmxPlayerState.interlace_method != g_renderManager.AutoInterlaceMethod(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod))) + m_OmxPlayerState.interlace_method != g_renderManager.AutoInterlaceMethod(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod))) { CLog::Log(LOGNOTICE, "%s - Reopen stream due to interlace change (%d,%d,%d,%d)", __FUNCTION__, - m_OmxPlayerState.current_deinterlace, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode, - m_OmxPlayerState.interlace_method, g_renderManager.AutoInterlaceMethod(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod)); + m_OmxPlayerState.current_deinterlace, CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode, + m_OmxPlayerState.interlace_method, g_renderManager.AutoInterlaceMethod(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod)); - m_OmxPlayerState.current_deinterlace = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode; - m_OmxPlayerState.interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod); + m_OmxPlayerState.current_deinterlace = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; + m_OmxPlayerState.interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod); reopen_stream = true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXImage.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXImage.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXImage.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXImage.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -154,7 +154,7 @@ bool COMXImage::ClampLimits(unsigned int &width, unsigned int &height, unsigned int m_width, unsigned int m_height, bool transposed) { - RESOLUTION_INFO& res_info = CDisplaySettings::GetInstance().GetResolutionInfo(g_graphicsContext.GetVideoResolution()); + RESOLUTION_INFO& res_info = CDisplaySettings::Get().GetResolutionInfo(g_graphicsContext.GetVideoResolution()); unsigned int max_width = width; unsigned int max_height = height; const unsigned int gui_width = transposed ? res_info.iHeight:res_info.iWidth; @@ -263,7 +263,7 @@ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - GLenum type = CSettings::GetInstance().GetBool("videoscreen.textures32") ? GL_UNSIGNED_BYTE:GL_UNSIGNED_SHORT_5_6_5; + GLenum type = CSettings::Get().GetBool("videoscreen.textures32") ? GL_UNSIGNED_BYTE:GL_UNSIGNED_SHORT_5_6_5; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex->width, tex->height, 0, GL_RGB, type, 0); tex->egl_image = eglCreateImageKHR(egl_display, egl_context, EGL_GL_TEXTURE_2D_KHR, (EGLClientBuffer)tex->texture, NULL); if (!tex->egl_image) @@ -601,10 +601,7 @@ m_orientation = 0; if(!m_image_size) - { - CLog::Log(LOGERROR, "%s::%s %s m_image_size unexpected (%lu)\n", CLASSNAME, __func__, m_filename, m_image_size); return OMX_IMAGE_CodingMax; - } uint8_t *p = m_image_buffer; uint8_t *q = m_image_buffer + m_image_size; @@ -851,14 +848,17 @@ } } - else - CLog::Log(LOGERROR, "%s::%s error unsupported image format\n", CLASSNAME, __func__); // apply input orientation m_orientation = m_orientation ^ orientation; if(m_orientation < 0 || m_orientation >= 8) m_orientation = 0; + if(eCompressionFormat == OMX_IMAGE_CodingMax) + { + CLog::Log(LOGERROR, "%s::%s error unsupported image format\n", CLASSNAME, __func__); + } + if(progressive) { CLog::Log(LOGWARNING, "%s::%s progressive images not supported by decoder\n", CLASSNAME, __func__); @@ -881,7 +881,7 @@ m_filename = inputFile.c_str(); if(!m_pFile.Open(inputFile, 0)) { - CLog::Log(LOGERROR, "%s::%s %s not found\n", CLASSNAME, __func__, m_filename); + CLog::Log(LOGERROR, "%s::%s %s not found\n", CLASSNAME, __func__, inputFile.c_str()); return false; } @@ -893,13 +893,13 @@ if(!m_image_size) { - CLog::Log(LOGERROR, "%s::%s %s m_image_size zero\n", CLASSNAME, __func__, m_filename); + CLog::Log(LOGERROR, "%s::%s %s m_image_size zero\n", CLASSNAME, __func__, inputFile.c_str()); return false; } m_image_buffer = (uint8_t *)malloc(m_image_size); if(!m_image_buffer) { - CLog::Log(LOGERROR, "%s::%s %s m_image_buffer null (%lu)\n", CLASSNAME, __func__, m_filename, m_image_size); + CLog::Log(LOGERROR, "%s::%s %s m_image_buffer null (%lu)\n", CLASSNAME, __func__, inputFile.c_str(), m_image_size); return false; } @@ -907,9 +907,15 @@ m_pFile.Close(); OMX_IMAGE_CODINGTYPE eCompressionFormat = GetCodingType(m_width, m_height, orientation); - if(eCompressionFormat != OMX_IMAGE_CodingJPEG || m_width < 1 || m_height < 1) + if(eCompressionFormat != OMX_IMAGE_CodingJPEG) + { + CLog::Log(LOGERROR, "%s::%s %s GetCodingType=0x%x\n", CLASSNAME, __func__, inputFile.c_str(), eCompressionFormat); + return false; + } + + if(m_width < 1 || m_height < 1) { - CLog::Log(LOGDEBUG, "%s::%s %s GetCodingType=0x%x (%dx%x)\n", CLASSNAME, __func__, m_filename, eCompressionFormat, m_width, m_height); + CLog::Log(LOGERROR, "%s::%s %s m_width=%d m_height=%d\n", CLASSNAME, __func__, inputFile.c_str(), m_width, m_height); return false; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXPlayerAudio.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXPlayerAudio.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXPlayerAudio.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXPlayerAudio.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -495,7 +495,6 @@ { m_flush = true; m_messageQueue.Flush(); - m_messageQueue.Flush(CDVDMsg::GENERAL_EOF); m_messageQueue.Put( new CDVDMsg(CDVDMsg::GENERAL_FLUSH), 1); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXPlayerVideo.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXPlayerVideo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXPlayerVideo.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXPlayerVideo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -115,7 +115,7 @@ bool OMXPlayerVideo::OpenStream(CDVDStreamInfo &hints) { m_hints = hints; - m_hdmi_clock_sync = (CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE) != ADJUST_REFRESHRATE_OFF); + m_hdmi_clock_sync = (CSettings::Get().GetInt("videoplayer.adjustrefreshrate") != ADJUST_REFRESHRATE_OFF); m_started = false; m_flush = false; m_stalled = m_messageQueue.GetPacketCount(CDVDMsg::DEMUXER_PACKET) == 0; @@ -268,14 +268,14 @@ { std::string stereo_mode; - switch(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_StereoMode) + switch(CMediaSettings::Get().GetCurrentVideoSettings().m_StereoMode) { case RENDER_STEREO_MODE_SPLIT_VERTICAL: stereo_mode = "left_right"; break; case RENDER_STEREO_MODE_SPLIT_HORIZONTAL: stereo_mode = "top_bottom"; break; default: stereo_mode = m_hints.stereo_mode; break; } - if(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_StereoInvert) + if(CMediaSettings::Get().GetCurrentVideoSettings().m_StereoInvert) stereo_mode = GetStereoModeInvert(stereo_mode); return stereo_mode; } @@ -490,12 +490,12 @@ double pts = pPacket->pts; if (dts != DVD_NOPTS_VALUE) - dts += m_iVideoDelay - DVD_SEC_TO_TIME(g_renderManager.GetDisplayLatency()); + dts += m_iVideoDelay; if (pts != DVD_NOPTS_VALUE) - pts += m_iVideoDelay - DVD_SEC_TO_TIME(g_renderManager.GetDisplayLatency()); + pts += m_iVideoDelay; - m_omxVideo.Decode(pPacket->pData, pPacket->iSize, dts, m_hints.ptsinvalid ? DVD_NOPTS_VALUE : pts); + m_omxVideo.Decode(pPacket->pData, pPacket->iSize, dts, dts == DVD_NOPTS_VALUE ? pts : DVD_NOPTS_VALUE); if (pts == DVD_NOPTS_VALUE) pts = dts; @@ -535,7 +535,6 @@ { m_flush = true; m_messageQueue.Flush(); - m_messageQueue.Flush(CDVDMsg::GENERAL_EOF); m_messageQueue.Put(new CDVDMsg(CDVDMsg::GENERAL_FLUSH), 1); } @@ -560,7 +559,7 @@ else m_fForcedAspectRatio = 0.0; - bool bVideoDecoderOpen = m_omxVideo.Open(m_hints, m_av_clock, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode, m_hdmi_clock_sync); + bool bVideoDecoderOpen = m_omxVideo.Open(m_hints, m_av_clock, CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode, m_hdmi_clock_sync); m_omxVideo.RegisterResolutionUpdateCallBack((void *)this, ResolutionUpdateCallBack); if(!bVideoDecoderOpen) @@ -678,7 +677,7 @@ CLog::Log(LOGDEBUG, "OMXPlayerVideo::%s %d,%d,%d,%d -> %d,%d,%d,%d (%d,%d,%d,%d,%s)", __func__, (int)SrcRect.x1, (int)SrcRect.y1, (int)SrcRect.x2, (int)SrcRect.y2, (int)DestRect.x1, (int)DestRect.y1, (int)DestRect.x2, (int)DestRect.y2, - video_stereo_mode, display_stereo_mode, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_StereoInvert, g_graphicsContext.GetStereoView(), OMXPlayerVideo::GetStereoMode().c_str()); + video_stereo_mode, display_stereo_mode, CMediaSettings::Get().GetCurrentVideoSettings().m_StereoInvert, g_graphicsContext.GetStereoView(), OMXPlayerVideo::GetStereoMode().c_str()); m_src_rect = SrcRect; m_dst_rect = DestRect; @@ -689,8 +688,8 @@ // might need to scale up m_dst_rect to display size as video decodes // to separate video plane that is at display size. RESOLUTION res = g_graphicsContext.GetVideoResolution(); - CRect gui(0, 0, CDisplaySettings::GetInstance().GetResolutionInfo(res).iWidth, CDisplaySettings::GetInstance().GetResolutionInfo(res).iHeight); - CRect display(0, 0, CDisplaySettings::GetInstance().GetResolutionInfo(res).iScreenWidth, CDisplaySettings::GetInstance().GetResolutionInfo(res).iScreenHeight); + CRect gui(0, 0, CDisplaySettings::Get().GetResolutionInfo(res).iWidth, CDisplaySettings::Get().GetResolutionInfo(res).iHeight); + CRect display(0, 0, CDisplaySettings::Get().GetResolutionInfo(res).iScreenWidth, CDisplaySettings::Get().GetResolutionInfo(res).iScreenHeight); switch (video_stereo_mode) { @@ -750,8 +749,8 @@ void OMXPlayerVideo::ResolutionUpdateCallBack(uint32_t width, uint32_t height, float framerate, float display_aspect) { RESOLUTION res = g_graphicsContext.GetVideoResolution(); - uint32_t video_width = CDisplaySettings::GetInstance().GetResolutionInfo(res).iScreenWidth; - uint32_t video_height = CDisplaySettings::GetInstance().GetResolutionInfo(res).iScreenHeight; + uint32_t video_width = CDisplaySettings::Get().GetResolutionInfo(res).iScreenWidth; + uint32_t video_height = CDisplaySettings::Get().GetResolutionInfo(res).iScreenHeight; unsigned flags = 0; ERenderFormat format = RENDER_FMT_BYPASS; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXVideo.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXVideo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/omxplayer/OMXVideo.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/omxplayer/OMXVideo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -252,7 +252,7 @@ if(m_deinterlace) { - EINTERLACEMETHOD interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod); + EINTERLACEMETHOD interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod); bool advanced_deinterlace = (interlace_method == VS_INTERLACEMETHOD_MMAL_ADVANCED || interlace_method == VS_INTERLACEMETHOD_MMAL_ADVANCED_HALF) && port_image.format.video.nFrameWidth * port_image.format.video.nFrameHeight <= 576 * 720; bool half_framerate = interlace_method == VS_INTERLACEMETHOD_MMAL_ADVANCED_HALF || interlace_method == VS_INTERLACEMETHOD_MMAL_BOB_HALF; @@ -582,7 +582,7 @@ } // request portsettingschanged on refresh rate change - if (CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE) == ADJUST_REFRESHRATE_ALWAYS) + if (CSettings::Get().GetInt("videoplayer.adjustrefreshrate") == ADJUST_REFRESHRATE_ALWAYS) { notifications.nIndex = OMX_IndexParamPortDefinition; omx_err = m_omx_decoder.SetParameter((OMX_INDEXTYPE)OMX_IndexConfigRequestCallback, ¬ifications); @@ -758,19 +758,6 @@ if (demuxer_content && demuxer_bytes > 0) { - OMX_U32 nFlags = 0; - - if(m_setStartTime) - { - nFlags |= OMX_BUFFERFLAG_STARTTIME; - CLog::Log(LOGDEBUG, "OMXVideo::Decode VDec : setStartTime %f\n", (pts == DVD_NOPTS_VALUE ? 0.0 : pts) / DVD_TIME_BASE); - m_setStartTime = false; - } - if (pts == DVD_NOPTS_VALUE && dts == DVD_NOPTS_VALUE) - nFlags |= OMX_BUFFERFLAG_TIME_UNKNOWN; - else if (pts == DVD_NOPTS_VALUE) - nFlags |= OMX_BUFFERFLAG_TIME_IS_DTS; - while(demuxer_bytes) { // 500ms timeout @@ -781,9 +768,21 @@ return false; } - omx_buffer->nFlags = nFlags; + omx_buffer->nFlags = 0; omx_buffer->nOffset = 0; omx_buffer->nTimeStamp = ToOMXTime((uint64_t)(pts != DVD_NOPTS_VALUE ? pts : dts != DVD_NOPTS_VALUE ? dts : 0)); + + if(m_setStartTime) + { + omx_buffer->nFlags |= OMX_BUFFERFLAG_STARTTIME; + CLog::Log(LOGDEBUG, "OMXVideo::Decode VDec : setStartTime %f\n", (pts == DVD_NOPTS_VALUE ? 0.0 : pts) / DVD_TIME_BASE); + m_setStartTime = false; + } + else if (pts == DVD_NOPTS_VALUE && dts == DVD_NOPTS_VALUE) + omx_buffer->nFlags |= OMX_BUFFERFLAG_TIME_UNKNOWN; + else if (pts == DVD_NOPTS_VALUE) + omx_buffer->nFlags |= OMX_BUFFERFLAG_TIME_IS_DTS; + omx_buffer->nFilledLen = std::min((OMX_U32)demuxer_bytes, omx_buffer->nAllocLen); memcpy(omx_buffer->pBuffer, demuxer_content, omx_buffer->nFilledLen); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/AudioDecoder.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/AudioDecoder.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/AudioDecoder.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/AudioDecoder.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -73,13 +73,13 @@ m_eof = false; // get correct cache size - unsigned int filecache = CSettings::GetInstance().GetInt(CSettings::SETTING_CACHEAUDIO_INTERNET); + unsigned int filecache = CSettings::Get().GetInt("cacheaudio.internet"); if ( file.IsHD() ) - filecache = CSettings::GetInstance().GetInt(CSettings::SETTING_CACHE_HARDDISK); + filecache = CSettings::Get().GetInt("cache.harddisk"); else if ( file.IsOnDVD() ) - filecache = CSettings::GetInstance().GetInt(CSettings::SETTING_CACHEAUDIO_DVDROM); + filecache = CSettings::Get().GetInt("cacheaudio.dvdrom"); else if ( file.IsOnLAN() ) - filecache = CSettings::GetInstance().GetInt(CSettings::SETTING_CACHEAUDIO_LAN); + filecache = CSettings::Get().GetInt("cacheaudio.lan"); // create our codec m_codec=CodecFactory::CreateCodecDemux(file.GetPath(), file.GetMimeType(), filecache * 1024); @@ -156,12 +156,6 @@ return m_codec->Seek(time); } -void CAudioDecoder::SetTotalTime(int64_t time) -{ - if (m_codec) - m_codec->m_TotalTime = time; -} - int64_t CAudioDecoder::TotalTime() { if (m_codec) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/AudioDecoder.h kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/AudioDecoder.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/AudioDecoder.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/AudioDecoder.h 2015-10-19 08:39:16.000000000 +0000 @@ -63,7 +63,6 @@ bool CanSeek() { if (m_codec) return m_codec->CanSeek(); else return false; }; int64_t Seek(int64_t time); int64_t TotalTime(); - void SetTotalTime(int64_t time); void Start() { m_canPlay = true;}; // cause a pre-buffered stream to start. int GetStatus() { return m_status; }; void SetStatus(int status) { m_status = status; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/CodecFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/CodecFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/CodecFactory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/CodecFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,7 @@ std::string fileType = strFileType; StringUtils::ToLower(fileType); VECADDONS codecs; - CAddonMgr::GetInstance().GetAddons(ADDON_AUDIODECODER, codecs); + CAddonMgr::Get().GetAddons(ADDON_AUDIODECODER, codecs); for (size_t i=0;i dec(std::static_pointer_cast(codecs[i])); @@ -58,7 +58,7 @@ if (!content.empty()) { VECADDONS codecs; - CAddonMgr::GetInstance().GetAddons(ADDON_AUDIODECODER, codecs); + CAddonMgr::Get().GetAddons(ADDON_AUDIODECODER, codecs); for (size_t i=0;i dec(std::static_pointer_cast(codecs[i])); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/DVDPlayerCodec.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/DVDPlayerCodec.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/DVDPlayerCodec.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/DVDPlayerCodec.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -87,9 +87,7 @@ return false; } - // TODO: - // convey CFileItem::ContentLookup() into Open() - if (!m_pInputStream->Open(strFileToOpen.c_str(), m_strContentType, true)) + if (!m_pInputStream->Open(strFileToOpen.c_str(), m_strContentType)) { CLog::Log(LOGERROR, "%s: Error opening file %s", __FUNCTION__, strFileToOpen.c_str()); if (m_pInputStream) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/PAPlayer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/PAPlayer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/PAPlayer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/PAPlayer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -74,9 +74,7 @@ m_audioCallback (NULL ), m_FileItem (new CFileItem()), m_jobCounter (0), - m_continueStream (false), - m_newForcedPlayerTime(-1), - m_newForcedTotalTime (-1) + m_continueStream (false) { memset(&m_playerGUIData, 0, sizeof(m_playerGUIData)); } @@ -244,7 +242,7 @@ bool PAPlayer::OpenFile(const CFileItem& file, const CPlayerOptions &options) { - m_defaultCrossfadeMS = CSettings::GetInstance().GetInt(CSettings::SETTING_MUSICPLAYER_CROSSFADE) * 1000; + m_defaultCrossfadeMS = CSettings::Get().GetInt("musicplayer.crossfade") * 1000; if (m_streams.size() > 1 || !m_defaultCrossfadeMS || m_isPaused) { @@ -295,12 +293,12 @@ if(file.IsCDDA()) m_upcomingCrossfadeMS = 0; else - m_upcomingCrossfadeMS = m_defaultCrossfadeMS = CSettings::GetInstance().GetInt(CSettings::SETTING_MUSICPLAYER_CROSSFADE) * 1000; + m_upcomingCrossfadeMS = m_defaultCrossfadeMS = CSettings::Get().GetInt("musicplayer.crossfade") * 1000; if (m_upcomingCrossfadeMS) { if (m_streams.size() == 0 || ( - file.HasMusicInfoTag() && !CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICPLAYER_CROSSFADEALBUMTRACKS) && + file.HasMusicInfoTag() && !CSettings::Get().GetBool("musicplayer.crossfadealbumtracks") && m_FileItem->HasMusicInfoTag() && (m_FileItem->GetMusicInfoTag()->GetAlbum() != "") && (m_FileItem->GetMusicInfoTag()->GetAlbum() == file.GetMusicInfoTag()->GetAlbum()) && @@ -455,8 +453,7 @@ void PAPlayer::UpdateStreamInfoPlayNextAtFrame(StreamInfo *si, unsigned int crossFadingTime) { - // if no crossfading or cue sheet, wait for eof - if (si && (crossFadingTime || si->m_endOffset)) + if (si) { int64_t streamTotalTime = si->m_decoder.TotalTime(); if (si->m_endOffset) @@ -577,18 +574,6 @@ CThread::Sleep(10); } - if (m_newForcedPlayerTime != -1) - { - SetTimeInternal(m_newForcedPlayerTime); - m_newForcedPlayerTime = -1; - } - - if (m_newForcedTotalTime != -1) - { - SetTotalTimeInternal(m_newForcedTotalTime); - m_newForcedTotalTime = -1; - } - GetTimeInternal(); //update for GUI } @@ -946,33 +931,6 @@ return (int64_t)time; } -void PAPlayer::SetTotalTimeInternal(int64_t time) -{ - CSharedLock lock(m_streamsLock); - if (!m_currentStream) - return; - - m_currentStream->m_decoder.SetTotalTime(time); - UpdateGUIData(m_currentStream); -} - -void PAPlayer::SetTimeInternal(int64_t time) -{ - CSharedLock lock(m_streamsLock); - if (!m_currentStream) - return; - - m_currentStream->m_framesSent = time / 1000 * m_currentStream->m_sampleRate; - - if (m_currentStream->m_stream) - m_currentStream->m_framesSent += m_currentStream->m_stream->GetDelay() * m_currentStream->m_sampleRate; -} - -void PAPlayer::SetTime(int64_t time) -{ - m_newForcedPlayerTime = time; -} - int64_t PAPlayer::GetTime() { return m_playerGUIData.m_time; @@ -990,11 +948,6 @@ total -= m_currentStream->m_startOffset; return total; } - -void PAPlayer::SetTotalTime(int64_t time) -{ - m_newForcedTotalTime = time; -} int64_t PAPlayer::GetTotalTime() { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/PAPlayer.h kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/PAPlayer.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/paplayer/PAPlayer.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/paplayer/PAPlayer.h 2015-10-19 08:39:16.000000000 +0000 @@ -64,10 +64,8 @@ virtual void ToFFRW(int iSpeed = 0); virtual int GetCacheLevel() const; virtual int64_t GetTotalTime(); - virtual void SetTotalTime(int64_t time); virtual void GetAudioStreamInfo(int index, SPlayerAudioStreamInfo &info); virtual int64_t GetTime(); - virtual void SetTime(int64_t time); virtual void SeekTime(int64_t iTime = 0); virtual bool SkipNext(); virtual void GetAudioCapabilities(std::vector &audioCaps) {} @@ -145,8 +143,6 @@ int m_jobCounter; CEvent m_jobEvent; bool m_continueStream; - int64_t m_newForcedPlayerTime; - int64_t m_newForcedTotalTime; bool QueueNextFileEx(const CFileItem &file, bool fadeIn = true, bool job = false); void SoftStart(bool wait = false); @@ -161,7 +157,5 @@ void UpdateStreamInfoPlayNextAtFrame(StreamInfo *si, unsigned int crossFadingTime); void UpdateGUIData(StreamInfo *si); int64_t GetTimeInternal(); - void SetTimeInternal(int64_t time); - void SetTotalTimeInternal(int64_t time); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,7 @@ #include "FileItem.h" #include "profiles/ProfilesManager.h" #include "settings/AdvancedSettings.h" +#include "utils/AutoPtrHandle.h" #include "PlayerCoreConfig.h" #include "PlayerSelectionRule.h" #include "guilib/LocalizeStrings.h" @@ -35,6 +36,8 @@ #define PLAYERCOREFACTORY_XML "playercorefactory.xml" +using namespace AUTOPTR; + CPlayerCoreFactory::CPlayerCoreFactory() { } @@ -46,7 +49,7 @@ delete *it; } -CPlayerCoreFactory& CPlayerCoreFactory::GetInstance() +CPlayerCoreFactory& CPlayerCoreFactory::Get() { static CPlayerCoreFactory sPlayerCoreFactory; return sPlayerCoreFactory; @@ -55,7 +58,7 @@ void CPlayerCoreFactory::OnSettingsLoaded() { LoadConfiguration("special://xbmc/system/" PLAYERCOREFACTORY_XML, true); - LoadConfiguration(CProfilesManager::GetInstance().GetUserDataItem(PLAYERCOREFACTORY_XML), false); + LoadConfiguration(CProfilesManager::Get().GetUserDataItem(PLAYERCOREFACTORY_XML), false); } /* generic function to make a vector unique, removes later duplicates */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/playercorefactory/PlayerCoreFactory.h kodi-15.2~git20151019.1039-final/xbmc/cores/playercorefactory/PlayerCoreFactory.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/playercorefactory/PlayerCoreFactory.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/playercorefactory/PlayerCoreFactory.h 2015-10-19 08:39:16.000000000 +0000 @@ -58,9 +58,9 @@ class CPlayerCoreFactory : public ISettingsHandler { public: - static CPlayerCoreFactory& GetInstance(); + static CPlayerCoreFactory& Get(); - virtual void OnSettingsLoaded() override; + virtual void OnSettingsLoaded(); PLAYERCOREID GetPlayerCore(const std::string& strCoreName) const; CPlayerCoreConfig* GetPlayerConfig(const std::string& strCoreName) const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/playercorefactory/PlayerSelectionRule.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/playercorefactory/PlayerSelectionRule.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/playercorefactory/PlayerSelectionRule.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/playercorefactory/PlayerSelectionRule.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -74,7 +74,7 @@ m_bStreamDetails = m_audioCodec.length() > 0 || m_audioChannels.length() > 0 || m_videoCodec.length() > 0 || m_videoResolution.length() > 0 || m_videoAspect.length() > 0; - if (m_bStreamDetails && !CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_EXTRACTFLAGS)) + if (m_bStreamDetails && !CSettings::Get().GetBool("myvideos.extractflags")) { CLog::Log(LOGWARNING, "CPlayerSelectionRule::Initialize: rule: %s needs media flagging, which is disabled", m_name.c_str()); } @@ -181,7 +181,7 @@ { if (!m_playerCoreId) { - m_playerCoreId = CPlayerCoreFactory::GetInstance().GetPlayerCore(m_playerName); + m_playerCoreId = CPlayerCoreFactory::Get().GetPlayerCore(m_playerName); } return m_playerCoreId; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/BaseRenderer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/BaseRenderer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/BaseRenderer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/BaseRenderer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,6 @@ #include "system.h" -#include // std::abs(int) prototype #include #include "BaseRenderer.h" #include "settings/DisplaySettings.h" @@ -84,7 +83,7 @@ // Adjust refreshrate to match source fps #if !defined(TARGET_DARWIN_IOS) - if (CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE) != ADJUST_REFRESHRATE_OFF) + if (CSettings::Get().GetInt("videoplayer.adjustrefreshrate") != ADJUST_REFRESHRATE_OFF) { float weight; if (!FindResolutionFromOverride(fps, weight, false)) //find a refreshrate from overrides @@ -118,7 +117,7 @@ if (!fallback && (fps < override.fpsmin || fps > override.fpsmax)) continue; - for (size_t j = (int)RES_DESKTOP; j < CDisplaySettings::GetInstance().ResolutionInfoSize(); j++) + for (size_t j = (int)RES_DESKTOP; j < CDisplaySettings::Get().ResolutionInfoSize(); j++) { RESOLUTION_INFO info = g_graphicsContext.GetResInfo((RESOLUTION)j); @@ -178,7 +177,7 @@ curr.strMode.c_str(), m_resolution, fps, weight); //get the resolution with the refreshrate closest to 60 hertz - for (size_t i = (int)RES_DESKTOP; i < CDisplaySettings::GetInstance().ResolutionInfoSize(); i++) + for (size_t i = (int)RES_DESKTOP; i < CDisplaySettings::Get().ResolutionInfoSize(); i++) { RESOLUTION_INFO info = g_graphicsContext.GetResInfo((RESOLUTION)i); @@ -199,7 +198,7 @@ if (MathUtils::round_int(curr.fRefreshRate) != 60) { CLog::Log(LOGDEBUG, "60 hertz refreshrate not available, choosing highest"); - for (size_t i = (int)RES_DESKTOP; i < CDisplaySettings::GetInstance().ResolutionInfoSize(); i++) + for (size_t i = (int)RES_DESKTOP; i < CDisplaySettings::Get().ResolutionInfoSize(); i++) { RESOLUTION_INFO info = g_graphicsContext.GetResInfo((RESOLUTION)i); @@ -223,22 +222,13 @@ RESOLUTION CBaseRenderer::FindClosestResolution(float fps, float multiplier, RESOLUTION current, float& weight) { RESOLUTION_INFO curr = g_graphicsContext.GetResInfo(current); - RESOLUTION orig_res = CDisplaySettings::GetInstance().GetCurrentResolution(); - - if (orig_res <= RES_DESKTOP) - orig_res = RES_DESKTOP; - - RESOLUTION_INFO orig = g_graphicsContext.GetResInfo(orig_res); float fRefreshRate = fps; float last_diff = fRefreshRate; - int curr_diff = std::abs((int) m_sourceWidth - curr.iScreenWidth); - int loop_diff = 0; - // Find closest refresh rate - for (size_t i = (int)RES_DESKTOP; i < CDisplaySettings::GetInstance().ResolutionInfoSize(); i++) + for (size_t i = (int)RES_DESKTOP; i < CDisplaySettings::Get().ResolutionInfoSize(); i++) { const RESOLUTION_INFO info = g_graphicsContext.GetResInfo((RESOLUTION)i); @@ -249,25 +239,7 @@ || info.iScreen != curr.iScreen || (info.dwFlags & D3DPRESENTFLAG_MODEMASK) != (curr.dwFlags & D3DPRESENTFLAG_MODEMASK) || info.fRefreshRate < (fRefreshRate * multiplier / 1.001) - 0.001) - { - // evaluate all higher modes and evalute them - // concerning dimension and refreshrate weight - // skip lower resolutions - if (((int) m_sourceWidth < orig.iScreenWidth) // orig res large enough - || (info.iScreenWidth < orig.iScreenWidth) // new width would be smaller - || (info.iScreenHeight < orig.iScreenHeight) // new height would be smaller - || (info.dwFlags & D3DPRESENTFLAG_MODEMASK) != (curr.dwFlags & D3DPRESENTFLAG_MODEMASK)) // don't switch to interlaced modes - { - continue; - } - } - - // Allow switching to larger resolution: - // e.g. if m_sourceWidth == 3840 and we have a 3840 mode - use this one - // if it has a matching fps mode, which is evaluated below - - loop_diff = std::abs((int) m_sourceWidth - info.iScreenWidth); - curr_diff = std::abs((int) m_sourceWidth - curr.iScreenWidth); + continue; // For 3D choose the closest refresh rate if(CONF_FLAGS_STEREO_MODE_MASK(m_iFlags)) @@ -288,9 +260,6 @@ int c_weight = MathUtils::round_int(RefreshWeight(curr.fRefreshRate, fRefreshRate * multiplier) * 1000.0); int i_weight = MathUtils::round_int(RefreshWeight(info.fRefreshRate, fRefreshRate * multiplier) * 1000.0); - RESOLUTION current_bak = current; - RESOLUTION_INFO curr_bak = curr; - // Closer the better, prefer higher refresh rate if the same if ((i_weight < c_weight) || (i_weight == c_weight && info.fRefreshRate > curr.fRefreshRate)) @@ -298,21 +267,6 @@ current = (RESOLUTION)i; curr = info; } - // use case 1080p50 vs 3840x2160@25 for 3840@25 content - // prefer the higher resolution of 3840 - if (i_weight == c_weight && (loop_diff < curr_diff)) - { - current = (RESOLUTION)i; - curr = info; - } - // same as above but iterating with 3840@25 set and overwritten - // by e.g. 1080@50 - restore backup in that case - // to give priority to the better matching width - if (i_weight == c_weight && (loop_diff > curr_diff)) - { - current = current_bak; - curr = curr_bak; - } } } @@ -394,50 +348,7 @@ } - int diffX = 0; - int diffY = 0; - int centerX = 0; - int centerY = 0; - - if (changeAspect)// we are either rotating by 90 or 270 degrees which inverts aspect ratio - { - int newWidth = m_destRect.Height(); // new width is old height - int newHeight = m_destRect.Width(); // new height is old width - int diffWidth = newWidth - m_destRect.Width(); // difference between old and new width - int diffHeight = newHeight - m_destRect.Height(); // difference between old and new height - - // if the new width is bigger then the old or - // the new height is bigger then the old - we need to scale down - if (diffWidth > 0 || diffHeight > 0 ) - { - float aspectRatio = GetAspectRatio(); - // scale to fit screen width because - // the difference in width is bigger then the - // difference in height - if (diffWidth > diffHeight) - { - newWidth = m_destRect.Width(); // clamp to the width of the old dest rect - newHeight *= aspectRatio; - } - else // scale to fit screen height - { - newHeight = m_destRect.Height(); // clamp to the height of the old dest rect - newWidth /= aspectRatio; - } - } - - // calculate the center point of the view - centerX = m_viewRect.x1 + m_viewRect.Width() / 2; - centerY = m_viewRect.y1 + m_viewRect.Height() / 2; - - // calculate the number of pixels we need to go in each - // x direction from the center point - diffX = newWidth / 2; - // calculate the number of pixels we need to go in each - // y direction from the center point - diffY = newHeight / 2; - - } + int diff = (int) ((m_destRect.Height() - m_destRect.Width()) / 2); for (int destIdx=0, srcIdx=pointOffset; destIdx < 4; destIdx++) { @@ -448,21 +359,21 @@ { switch (srcIdx) { - case 0:// top left - m_rotatedDestCoords[destIdx].x = centerX - diffX; - m_rotatedDestCoords[destIdx].y = centerY - diffY; + case 0: + m_rotatedDestCoords[destIdx].x -= diff; + m_rotatedDestCoords[destIdx].y += diff; break; - case 1:// top right - m_rotatedDestCoords[destIdx].x = centerX + diffX; - m_rotatedDestCoords[destIdx].y = centerY - diffY; + case 1: + m_rotatedDestCoords[destIdx].x += diff; + m_rotatedDestCoords[destIdx].y += diff; break; - case 2:// bottom right - m_rotatedDestCoords[destIdx].x = centerX + diffX; - m_rotatedDestCoords[destIdx].y = centerY + diffY; + case 2: + m_rotatedDestCoords[destIdx].x += diff; + m_rotatedDestCoords[destIdx].y -= diff; break; - case 3:// bottom left - m_rotatedDestCoords[destIdx].x = centerX - diffX; - m_rotatedDestCoords[destIdx].y = centerY + diffY; + case 3: + m_rotatedDestCoords[destIdx].x -= diff; + m_rotatedDestCoords[destIdx].y -= diff; break; } } @@ -513,7 +424,7 @@ // allow a certain error to maximize screen size float fCorrection = screenWidth / screenHeight / outputFrameRatio - 1.0f; - float fAllowed = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ERRORINASPECT) * 0.01f; + float fAllowed = CSettings::Get().GetInt("videoplayer.errorinaspect") * 0.01f; if(fCorrection > fAllowed) fCorrection = fAllowed; if(fCorrection < - fAllowed) fCorrection = - fAllowed; @@ -704,15 +615,15 @@ break; } - CalcNormalDisplayRect(m_viewRect.x1, m_viewRect.y1, m_viewRect.Width(), m_viewRect.Height(), GetAspectRatio() * CDisplaySettings::GetInstance().GetPixelRatio(), CDisplaySettings::GetInstance().GetZoomAmount(), CDisplaySettings::GetInstance().GetVerticalShift()); + CalcNormalDisplayRect(m_viewRect.x1, m_viewRect.y1, m_viewRect.Width(), m_viewRect.Height(), GetAspectRatio() * CDisplaySettings::Get().GetPixelRatio(), CDisplaySettings::Get().GetZoomAmount(), CDisplaySettings::Get().GetVerticalShift()); } void CBaseRenderer::SetViewMode(int viewMode) { - if (viewMode < ViewModeNormal || viewMode > ViewModeStretch16x9Nonlin) + if (viewMode < ViewModeNormal || viewMode > ViewModeCustom) viewMode = ViewModeNormal; - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode = viewMode; + CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode = viewMode; // get our calibrated full screen resolution RESOLUTION res = GetResolution(); @@ -724,7 +635,7 @@ float sourceFrameRatio = GetAspectRatio(); bool is43 = (sourceFrameRatio < 8.f/(3.f*sqrt(3.f)) && - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode == ViewModeNormal); + CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode == ViewModeNormal); // Splitres scaling factor float xscale = (float)info.iScreenWidth / (float)info.iWidth; @@ -733,74 +644,70 @@ screenWidth *= xscale; screenHeight *= yscale; - CDisplaySettings::GetInstance().SetVerticalShift(0.0f); - CDisplaySettings::GetInstance().SetNonLinearStretched(false); + CDisplaySettings::Get().SetVerticalShift(0.0f); + CDisplaySettings::Get().SetNonLinearStretched(false); - if ( CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode == ViewModeZoom || - (is43 && CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_STRETCH43) == ViewModeZoom)) + if ( CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode == ViewModeZoom || + (is43 && CSettings::Get().GetInt("videoplayer.stretch43") == ViewModeZoom)) { // zoom image so no black bars - CDisplaySettings::GetInstance().SetPixelRatio(1.0); + CDisplaySettings::Get().SetPixelRatio(1.0); // calculate the desired output ratio - float outputFrameRatio = sourceFrameRatio * CDisplaySettings::GetInstance().GetPixelRatio() / info.fPixelRatio; + float outputFrameRatio = sourceFrameRatio * CDisplaySettings::Get().GetPixelRatio() / info.fPixelRatio; // now calculate the correct zoom amount. First zoom to full height. float newHeight = screenHeight; float newWidth = newHeight * outputFrameRatio; - CDisplaySettings::GetInstance().SetZoomAmount(newWidth / screenWidth); + CDisplaySettings::Get().SetZoomAmount(newWidth / screenWidth); if (newWidth < screenWidth) { // zoom to full width newWidth = screenWidth; newHeight = newWidth / outputFrameRatio; - CDisplaySettings::GetInstance().SetZoomAmount(newHeight / screenHeight); + CDisplaySettings::Get().SetZoomAmount(newHeight / screenHeight); } } - else if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode == ViewModeStretch4x3) + else if (CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode == ViewModeStretch4x3) { // stretch image to 4:3 ratio - CDisplaySettings::GetInstance().SetZoomAmount(1.0); + CDisplaySettings::Get().SetZoomAmount(1.0); if (res == RES_PAL_4x3 || res == RES_PAL60_4x3 || res == RES_NTSC_4x3 || res == RES_HDTV_480p_4x3) { // stretch to the limits of the 4:3 screen. // incorrect behaviour, but it's what the users want, so... - CDisplaySettings::GetInstance().SetPixelRatio((screenWidth / screenHeight) * info.fPixelRatio / sourceFrameRatio); + CDisplaySettings::Get().SetPixelRatio((screenWidth / screenHeight) * info.fPixelRatio / sourceFrameRatio); } else { - // now we need to set CDisplaySettings::GetInstance().GetPixelRatio() so that + // now we need to set CDisplaySettings::Get().GetPixelRatio() so that // fOutputFrameRatio = 4:3. - CDisplaySettings::GetInstance().SetPixelRatio((4.0f / 3.0f) / sourceFrameRatio); + CDisplaySettings::Get().SetPixelRatio((4.0f / 3.0f) / sourceFrameRatio); } } - else if ( CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode == ViewModeWideZoom || - (is43 && CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_STRETCH43) == ViewModeWideZoom)) + else if ( CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode == ViewModeWideZoom || + (is43 && CSettings::Get().GetInt("videoplayer.stretch43") == ViewModeWideZoom)) { // super zoom float stretchAmount = (screenWidth / screenHeight) * info.fPixelRatio / sourceFrameRatio; - CDisplaySettings::GetInstance().SetPixelRatio(pow(stretchAmount, float(2.0/3.0))); - CDisplaySettings::GetInstance().SetZoomAmount(pow(stretchAmount, float((stretchAmount < 1.0) ? -1.0/3.0 : 1.0/3.0))); - CDisplaySettings::GetInstance().SetNonLinearStretched(true); - } - else if ( CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode == ViewModeStretch16x9 || - (is43 && (CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_STRETCH43) == ViewModeStretch16x9 || - CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_STRETCH43) == ViewModeStretch16x9Nonlin))) + CDisplaySettings::Get().SetPixelRatio(pow(stretchAmount, float(2.0/3.0))); + CDisplaySettings::Get().SetZoomAmount(pow(stretchAmount, float((stretchAmount < 1.0) ? -1.0/3.0 : 1.0/3.0))); + CDisplaySettings::Get().SetNonLinearStretched(true); + } + else if ( CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode == ViewModeStretch16x9 || + (is43 && CSettings::Get().GetInt("videoplayer.stretch43") == ViewModeStretch16x9)) { // stretch image to 16:9 ratio - CDisplaySettings::GetInstance().SetZoomAmount(1.0); + CDisplaySettings::Get().SetZoomAmount(1.0); if (res == RES_PAL_4x3 || res == RES_PAL60_4x3 || res == RES_NTSC_4x3 || res == RES_HDTV_480p_4x3) - { // now we need to set CDisplaySettings::GetInstance().GetPixelRatio() so that + { // now we need to set CDisplaySettings::Get().GetPixelRatio() so that // outputFrameRatio = 16:9. - CDisplaySettings::GetInstance().SetPixelRatio((16.0f / 9.0f) / sourceFrameRatio); + CDisplaySettings::Get().SetPixelRatio((16.0f / 9.0f) / sourceFrameRatio); } else { // stretch to the limits of the 16:9 screen. // incorrect behaviour, but it's what the users want, so... - CDisplaySettings::GetInstance().SetPixelRatio((screenWidth / screenHeight) * info.fPixelRatio / sourceFrameRatio); + CDisplaySettings::Get().SetPixelRatio((screenWidth / screenHeight) * info.fPixelRatio / sourceFrameRatio); } - if (is43) - CDisplaySettings::GetInstance().SetNonLinearStretched(CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_STRETCH43) == ViewModeStretch16x9Nonlin); - } - else if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode == ViewModeOriginal) + else if (CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode == ViewModeOriginal) { // zoom image so that the height is the original size - CDisplaySettings::GetInstance().SetPixelRatio(1.0); + CDisplaySettings::Get().SetPixelRatio(1.0); // get the size of the media file // calculate the desired output ratio - float outputFrameRatio = sourceFrameRatio * CDisplaySettings::GetInstance().GetPixelRatio() / info.fPixelRatio; + float outputFrameRatio = sourceFrameRatio * CDisplaySettings::Get().GetPixelRatio() / info.fPixelRatio; // now calculate the correct zoom amount. First zoom to full width. float newHeight = screenWidth / outputFrameRatio; if (newHeight > screenHeight) @@ -808,25 +715,25 @@ newHeight = screenHeight; } // now work out the zoom amount so that no zoom is done - CDisplaySettings::GetInstance().SetZoomAmount(m_sourceHeight / newHeight); + CDisplaySettings::Get().SetZoomAmount(m_sourceHeight / newHeight); } - else if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode == ViewModeCustom) + else if (CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode == ViewModeCustom) { - CDisplaySettings::GetInstance().SetZoomAmount(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount); - CDisplaySettings::GetInstance().SetPixelRatio(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomPixelRatio); - CDisplaySettings::GetInstance().SetNonLinearStretched(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomNonLinStretch); - CDisplaySettings::GetInstance().SetVerticalShift(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomVerticalShift); + CDisplaySettings::Get().SetZoomAmount(CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount); + CDisplaySettings::Get().SetPixelRatio(CMediaSettings::Get().GetCurrentVideoSettings().m_CustomPixelRatio); + CDisplaySettings::Get().SetNonLinearStretched(CMediaSettings::Get().GetCurrentVideoSettings().m_CustomNonLinStretch); + CDisplaySettings::Get().SetVerticalShift(CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift); } - else // if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode == ViewModeNormal) + else // if (CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode == ViewModeNormal) { - CDisplaySettings::GetInstance().SetPixelRatio(1.0); - CDisplaySettings::GetInstance().SetZoomAmount(1.0); + CDisplaySettings::Get().SetPixelRatio(1.0); + CDisplaySettings::Get().SetZoomAmount(1.0); } - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount = CDisplaySettings::GetInstance().GetZoomAmount(); - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomPixelRatio = CDisplaySettings::GetInstance().GetPixelRatio(); - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomNonLinStretch = CDisplaySettings::GetInstance().IsNonLinearStretched(); - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomVerticalShift = CDisplaySettings::GetInstance().GetVerticalShift(); + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount = CDisplaySettings::Get().GetZoomAmount(); + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomPixelRatio = CDisplaySettings::Get().GetPixelRatio(); + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomNonLinStretch = CDisplaySettings::Get().IsNonLinearStretched(); + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift = CDisplaySettings::Get().GetVerticalShift(); } void CBaseRenderer::MarkDirty() @@ -839,6 +746,8 @@ list.push_back(make_pair(g_localizeStrings.Get(13416), RENDER_METHOD_AUTO)); #ifdef HAS_DX + if (CSysInfo::IsWindowsVersionAtLeast(CSysInfo::WindowsVersionWin7)) + list.push_back(make_pair(g_localizeStrings.Get(16326), RENDER_METHOD_DXVAHD)); list.push_back(make_pair(g_localizeStrings.Get(16319), RENDER_METHOD_DXVA)); list.push_back(make_pair(g_localizeStrings.Get(13431), RENDER_METHOD_D3D_PS)); list.push_back(make_pair(g_localizeStrings.Get(13419), RENDER_METHOD_SOFTWARE)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/BaseRenderer.h kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/BaseRenderer.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/BaseRenderer.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/BaseRenderer.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,14 +20,13 @@ * */ -#include #include #include "guilib/Resolution.h" #include "guilib/Geometry.h" #include "RenderFormats.h" #include "RenderFeatures.h" - + #define MAX_PLANES 3 #define MAX_FIELDS 3 #define NUM_BUFFERS 6 @@ -64,6 +63,7 @@ RENDER_METHOD_SOFTWARE, RENDER_METHOD_D3D_PS, RENDER_METHOD_DXVA, + RENDER_METHOD_DXVAHD, RENDER_OVERLAYS = 99 // to retain compatibility }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/DXVA.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/DXVA.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/DXVA.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/DXVA.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,731 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifdef HAS_DX + +#include +#include +#include +#include + +#include "DXVA.h" +#include "windowing/WindowingFactory.h" +#include "settings/Settings.h" +#include "settings/MediaSettings.h" +#include "utils/AutoPtrHandle.h" +#include "utils/StringUtils.h" +#include "settings/AdvancedSettings.h" +#include "cores/VideoRenderers/RenderManager.h" +#include "RenderFlags.h" +#include "win32/WIN32Util.h" +#include "utils/Log.h" + +#include + +using namespace DXVA; +using namespace AUTOPTR; +using namespace std; + +DEFINE_GUID(DXVA2_VideoProcATIVectorAdaptiveDevice, 0x3C5323C1,0x6fb7,0x44f5,0x90,0x81,0x05,0x6b,0xf2,0xee,0x44,0x9d); +DEFINE_GUID(DXVA2_VideoProcATIMotionAdaptiveDevice, 0x552C0DAD,0xccbc,0x420b,0x83,0xc8,0x74,0x94,0x3c,0xf9,0xf1,0xa6); +DEFINE_GUID(DXVA2_VideoProcATIAdaptiveDevice, 0x6E8329FF,0xb642,0x418b,0xbc,0xf0,0xbc,0xb6,0x59,0x1e,0x25,0x5f); +DEFINE_GUID(DXVA2_VideoProcNVidiaAdaptiveDevice, 0x6CB69578,0x7617,0x4637,0x91,0xE5,0x1C,0x02,0xDB,0x81,0x02,0x85); +DEFINE_GUID(DXVA2_VideoProcIntelEdgeDevice, 0xBF752EF6,0x8CC4,0x457A,0xBE,0x1B,0x08,0xBD,0x1C,0xAE,0xEE,0x9F); +DEFINE_GUID(DXVA2_VideoProcNVidiaUnknownDevice, 0xF9F19DA5,0x3B09,0x4B2F,0x9D,0x89,0xC6,0x47,0x53,0xE3,0xEA,0xAB); + +typedef struct { + const char *name; + const GUID *guid; +} dxva2_device_t; + +static const dxva2_device_t dxva2_devices[] = { + { "Progressive Device", &DXVA2_VideoProcProgressiveDevice }, + { "Bob Device", &DXVA2_VideoProcBobDevice }, + { "Vector Adaptative Device", &DXVA2_VideoProcATIVectorAdaptiveDevice }, + { "Motion Adaptative Device", &DXVA2_VideoProcATIMotionAdaptiveDevice }, + { "Adaptative Device", &DXVA2_VideoProcATIAdaptiveDevice }, + { "Spatial-temporal device", &DXVA2_VideoProcNVidiaAdaptiveDevice }, + { "Edge directed device", &DXVA2_VideoProcIntelEdgeDevice }, + { "Unknown device (nVidia)", &DXVA2_VideoProcNVidiaUnknownDevice }, + { NULL, NULL } +}; + +typedef struct { + const char *name; + unsigned flags; +} dxva2_deinterlacetech_t; + +static const dxva2_deinterlacetech_t dxva2_deinterlacetechs[] = { + { "Inverse Telecine", DXVA2_DeinterlaceTech_InverseTelecine }, + { "Motion vector steered", DXVA2_DeinterlaceTech_MotionVectorSteered }, + { "Pixel adaptive", DXVA2_DeinterlaceTech_PixelAdaptive }, + { "Field adaptive", DXVA2_DeinterlaceTech_FieldAdaptive }, + { "Edge filtering", DXVA2_DeinterlaceTech_EdgeFiltering }, + { "Median filtering", DXVA2_DeinterlaceTech_MedianFiltering }, + { "Bob vertical stretch 4-tap", DXVA2_DeinterlaceTech_BOBVerticalStretch4Tap }, + { "Bob vertical stretch", DXVA2_DeinterlaceTech_BOBVerticalStretch }, + { "Bob line replicate", DXVA2_DeinterlaceTech_BOBLineReplicate }, + { "Unknown", DXVA2_DeinterlaceTech_Unknown }, + { NULL, 0 } +}; + +// Prefered targets must be first +static const D3DFORMAT render_targets[] = { + (D3DFORMAT)MAKEFOURCC('N','V','1','2'), + (D3DFORMAT)MAKEFOURCC('Y','V','1','2'), + D3DFMT_UNKNOWN +}; + +typedef struct { + DWORD VendorID; + DWORD DeviceID; +} pci_device; + +// List of devices that drop frames with a deinterlacing processor for progressive material. +static const pci_device NoDeintProcForProgDevices[] = { + { PCIV_nVidia, 0x0865 }, // ION + { PCIV_nVidia, 0x0874 }, // ION + { PCIV_nVidia, 0x0876 }, // ION + { PCIV_nVidia, 0x087D }, // ION + { PCIV_nVidia, 0x087E }, // ION LE + { PCIV_nVidia, 0x087F }, // ION LE + { 0 , 0x0000 } +}; + +static std::string GUIDToString(const GUID& guid) +{ + std::string buffer = StringUtils::Format("%08X-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x" + , guid.Data1, guid.Data2, guid.Data3 + , guid.Data4[0], guid.Data4[1] + , guid.Data4[2], guid.Data4[3], guid.Data4[4] + , guid.Data4[5], guid.Data4[6], guid.Data4[7]); + return buffer; +} + +static const dxva2_device_t *dxva2_find_device(const GUID *guid) +{ + for (unsigned i = 0; dxva2_devices[i].name; i++) { + if (IsEqualGUID(*dxva2_devices[i].guid, *guid)) + return &dxva2_devices[i]; + } + return NULL; +} + +static const dxva2_deinterlacetech_t *dxva2_find_deinterlacetech(unsigned flags) +{ + for (unsigned i = 0; dxva2_deinterlacetechs[i].name; i++) { + if (dxva2_deinterlacetechs[i].flags == flags) + return &dxva2_deinterlacetechs[i]; + } + return NULL; +} + +#define SCOPE(type, var) std::shared_ptr var##_holder(var, CoTaskMemFree); + +CCriticalSection CProcessor::m_dlSection; +HMODULE CProcessor::m_dlHandle = NULL; +DXVA2CreateVideoServicePtr CProcessor::m_DXVA2CreateVideoService = NULL; + +CProcessor::CProcessor() +{ + m_service = NULL; + m_process = NULL; + g_Windowing.Register(this); + + m_context = NULL; + m_progressive = true; +} + +CProcessor::~CProcessor() +{ + g_Windowing.Unregister(this); + UnInit(); +} + +void CProcessor::UnInit() +{ + CSingleLock lock(m_section); + Close(); + SAFE_RELEASE(m_service); +} + +void CProcessor::Close() +{ + CSingleLock lock(m_section); + SAFE_RELEASE(m_process); + SAFE_RELEASE(m_context); +} + +bool CProcessor::UpdateSize(const DXVA2_VideoDesc& dsc) +{ + // TODO: print the D3FORMAT text version in log + CLog::Log(LOGDEBUG, "DXVA - checking samples array size using %d render target", dsc.Format); + + GUID* deint_guid_list = NULL; + unsigned guid_count = 0; + if (FAILED(m_service->GetVideoProcessorDeviceGuids(&dsc, &guid_count, &deint_guid_list))) + return false; + + SCOPE(GUID, deint_guid_list); + + for (unsigned i = 0; i < guid_count; i++) + { + DXVA2_VideoProcessorCaps caps; + CHECK(m_service->GetVideoProcessorCaps(deint_guid_list[i], &dsc, D3DFMT_X8R8G8B8, &caps)); + if (caps.NumBackwardRefSamples + caps.NumForwardRefSamples > m_size) + { + m_size = caps.NumBackwardRefSamples + caps.NumForwardRefSamples; + CLog::Log(LOGDEBUG, "DXVA - updated maximum samples count to %d", m_size); + } + m_max_back_refs = std::max(caps.NumBackwardRefSamples, m_max_back_refs); + m_max_fwd_refs = std::max(caps.NumForwardRefSamples, m_max_fwd_refs); + } + + return true; +} + +bool CProcessor::PreInit() +{ + if (!LoadSymbols()) + return false; + + UnInit(); + + CSingleLock lock(m_section); + + if (FAILED(m_DXVA2CreateVideoService(g_Windowing.Get3DDevice(), IID_IDirectXVideoProcessorService, (void**)&m_service))) + return false; + + m_size = 0; + + // We try to find the maximum count of reference frames using a standard resolution and all known render target formats + DXVA2_VideoDesc dsc = {}; + dsc.SampleWidth = 640; + dsc.SampleHeight = 480; + dsc.SampleFormat.SampleFormat = DXVA2_SampleFieldInterleavedOddFirst; + + m_max_back_refs = 0; + m_max_fwd_refs = 0; + + for (unsigned i = 0; render_targets[i] != D3DFMT_UNKNOWN; i++) + { + dsc.Format = render_targets[i]; + if (!UpdateSize(dsc)) + CLog::Log(LOGDEBUG, "DXVA - render target not supported by processor"); + } + + m_size = m_max_back_refs + 1 + m_max_fwd_refs + 2; // refs + 1 display + 2 safety frames + + return true; +} + +bool CProcessor::Open(UINT width, UINT height, unsigned int flags, unsigned int format, unsigned int extended_format) +{ + Close(); + + CSingleLock lock(m_section); + + if (!m_service) + return false; + + DXVA2_VideoDesc dsc; + memset(&dsc, 0, sizeof(DXVA2_VideoDesc)); + + dsc.SampleWidth = width; + dsc.SampleHeight = height; + dsc.SampleFormat.VideoLighting = DXVA2_VideoLighting_dim; + + switch (CONF_FLAGS_CHROMA_MASK(flags)) + { + case CONF_FLAGS_CHROMA_LEFT: + dsc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_Horizontally_Cosited + | DXVA2_VideoChromaSubsampling_Vertically_AlignedChromaPlanes; + break; + case CONF_FLAGS_CHROMA_CENTER: + dsc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_Vertically_AlignedChromaPlanes; + break; + case CONF_FLAGS_CHROMA_TOPLEFT: + dsc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_Horizontally_Cosited + | DXVA2_VideoChromaSubsampling_Vertically_Cosited; + break; + default: + dsc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_Unknown; + } + + if (flags & CONF_FLAGS_YUV_FULLRANGE) + dsc.SampleFormat.NominalRange = DXVA2_NominalRange_0_255; + else + dsc.SampleFormat.NominalRange = DXVA2_NominalRange_16_235; + + switch (CONF_FLAGS_YUVCOEF_MASK(flags)) + { + case CONF_FLAGS_YUVCOEF_240M: + dsc.SampleFormat.VideoTransferMatrix = DXVA2_VideoTransferMatrix_SMPTE240M; + break; + case CONF_FLAGS_YUVCOEF_BT601: + dsc.SampleFormat.VideoTransferMatrix = DXVA2_VideoTransferMatrix_BT601; + break; + case CONF_FLAGS_YUVCOEF_BT709: + dsc.SampleFormat.VideoTransferMatrix = DXVA2_VideoTransferMatrix_BT709; + break; + default: + dsc.SampleFormat.VideoTransferMatrix = DXVA2_VideoTransferMatrix_Unknown; + } + + switch (CONF_FLAGS_COLPRI_MASK(flags)) + { + case CONF_FLAGS_COLPRI_BT709: + dsc.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_BT709; + break; + case CONF_FLAGS_COLPRI_BT470M: + dsc.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_BT470_2_SysM; + break; + case CONF_FLAGS_COLPRI_BT470BG: + dsc.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_BT470_2_SysBG; + break; + case CONF_FLAGS_COLPRI_170M: + dsc.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_SMPTE170M; + break; + case CONF_FLAGS_COLPRI_240M: + dsc.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_SMPTE240M; + break; + default: + dsc.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_Unknown; + } + + switch (CONF_FLAGS_TRC_MASK(flags)) + { + case CONF_FLAGS_TRC_BT709: + dsc.SampleFormat.VideoTransferFunction = DXVA2_VideoTransFunc_709; + break; + case CONF_FLAGS_TRC_GAMMA22: + dsc.SampleFormat.VideoTransferFunction = DXVA2_VideoTransFunc_22; + break; + case CONF_FLAGS_TRC_GAMMA28: + dsc.SampleFormat.VideoTransferFunction = DXVA2_VideoTransFunc_28; + break; + default: + dsc.SampleFormat.VideoTransferFunction = DXVA2_VideoTransFunc_Unknown; + } + + m_desc = dsc; + + if (format == RENDER_FMT_DXVA) + m_desc.Format = (D3DFORMAT)extended_format; + else + { + // Only NV12 software colorspace conversion is implemented for now + m_desc.Format = (D3DFORMAT)MAKEFOURCC('N','V','1','2'); + if (!CreateSurfaces()) + return false; + } + + // frame flags are not available to do the complete calculation of the deinterlacing mode, as done in Render() + // It's OK, as it doesn't make any difference for all hardware except the few GPUs on the quirk list. + // And for those GPUs, the correct values will be calculated with the first Render() and the correct processor + // will replace the one allocated here, before the user sees anything. + // It's a bit inefficient, that's all. + m_deinterlace_mode = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; + m_interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod);; + + EvaluateQuirkNoDeintProcForProg(); + + if (g_advancedSettings.m_DXVANoDeintProcForProgressive || m_quirk_nodeintprocforprog) + CLog::Log(LOGNOTICE, "DXVA: Auto deinterlacing mode workaround activated. Deinterlacing processor will be used only for interlaced frames."); + + if (!OpenProcessor()) + return false; + + return true; +} + +void CProcessor::EvaluateQuirkNoDeintProcForProg() +{ + D3DADAPTER_IDENTIFIER9 AIdentifier = g_Windowing.GetAIdentifier(); + + for (unsigned idx = 0; NoDeintProcForProgDevices[idx].VendorID != 0; idx++) + { + if(NoDeintProcForProgDevices[idx].VendorID == AIdentifier.VendorId + && NoDeintProcForProgDevices[idx].DeviceID == AIdentifier.DeviceId) + { + m_quirk_nodeintprocforprog = true; + return; + } + } + m_quirk_nodeintprocforprog = false; +} + +bool CProcessor::SelectProcessor() +{ + // The CProcessor can be run after dxva or software decoding, possibly after software deinterlacing. + + // Deinterlace mode off: force progressive + // Deinterlace mode auto or force, with a dxva deinterlacing method: create an deinterlacing capable processor. The frame flags will tell it to deinterlace or not. + m_progressive = m_deinterlace_mode == VS_DEINTERLACEMODE_OFF + || ( m_interlace_method != VS_INTERLACEMETHOD_DXVA_BOB + && m_interlace_method != VS_INTERLACEMETHOD_DXVA_BEST); + + if (m_progressive) + m_desc.SampleFormat.SampleFormat = DXVA2_SampleProgressiveFrame; + else + m_desc.SampleFormat.SampleFormat = DXVA2_SampleFieldInterleavedEvenFirst; + + GUID* guid_list; + unsigned guid_count; + CHECK(m_service->GetVideoProcessorDeviceGuids(&m_desc, &guid_count, &guid_list)); + SCOPE(GUID, guid_list); + + if(guid_count == 0) + { + CLog::Log(LOGDEBUG, "DXVA - unable to find any processors"); + return false; + } + + for(unsigned i = 0; i < guid_count; i++) + { + const GUID* g = &guid_list[i]; + const dxva2_device_t* device = dxva2_find_device(g); + + if (device) + { + CLog::Log(LOGDEBUG, "DXVA - processor found %s", device->name); + } + else + { + CHECK(m_service->GetVideoProcessorCaps(*g, &m_desc, D3DFMT_X8R8G8B8, &m_caps)); + const dxva2_deinterlacetech_t* tech = dxva2_find_deinterlacetech(m_caps.DeinterlaceTechnology); + if (tech != NULL) + CLog::Log(LOGDEBUG, "DXVA - unknown processor %s found, deinterlace technology %s", GUIDToString(*g).c_str(), tech->name); + else + CLog::Log(LOGDEBUG, "DXVA - unknown processor %s found, unknown technology", GUIDToString(*g).c_str()); + } + } + + if (m_progressive) + m_device = DXVA2_VideoProcProgressiveDevice; + else if(m_interlace_method == VS_INTERLACEMETHOD_DXVA_BEST) + m_device = guid_list[0]; + else + m_device = DXVA2_VideoProcBobDevice; + + return true; +} + +bool CProcessor::OpenProcessor() +{ + if (!SelectProcessor()) + return false; + + SAFE_RELEASE(m_process); + + const dxva2_device_t* device = dxva2_find_device(&m_device); + if (device) + CLog::Log(LOGDEBUG, "DXVA - processor selected %s", device->name); + else + CLog::Log(LOGDEBUG, "DXVA - processor selected %s", GUIDToString(m_device).c_str()); + + D3DFORMAT rtFormat = D3DFMT_X8R8G8B8; + CHECK(m_service->GetVideoProcessorCaps(m_device, &m_desc, rtFormat, &m_caps)) + + /* HACK for Intel Egde Device. + * won't work if backward refs is equals value from the capabilities * + * Possible reasons are: * + * 1) The device capabilities are incorrectly reported * + * 2) The device is broken */ + if (IsEqualGUID(m_device, DXVA2_VideoProcIntelEdgeDevice)) + m_caps.NumBackwardRefSamples = 0; + + if (m_caps.DeviceCaps & DXVA2_VPDev_SoftwareDevice) + CLog::Log(LOGDEBUG, "DXVA - processor is software device"); + + if (m_caps.DeviceCaps & DXVA2_VPDev_EmulatedDXVA1) + CLog::Log(LOGDEBUG, "DXVA - processor is emulated dxva1"); + + CLog::Log(LOGDEBUG, "DXVA - processor requires %d past frames and %d future frames", m_caps.NumBackwardRefSamples, m_caps.NumForwardRefSamples); + + if (m_caps.NumBackwardRefSamples + m_caps.NumForwardRefSamples + 3 > m_size) + { + CLog::Log(LOGERROR, "DXVA - used an incorrect number of reference frames creating processor"); + return false; + } + + CHECK(m_service->CreateVideoProcessor(m_device, &m_desc, rtFormat, 0, &m_process)); + + CHECK(m_service->GetProcAmpRange(m_device, &m_desc, rtFormat, DXVA2_ProcAmp_Brightness, &m_brightness)); + CHECK(m_service->GetProcAmpRange(m_device, &m_desc, rtFormat, DXVA2_ProcAmp_Contrast , &m_contrast)); + CHECK(m_service->GetProcAmpRange(m_device, &m_desc, rtFormat, DXVA2_ProcAmp_Hue , &m_hue)); + CHECK(m_service->GetProcAmpRange(m_device, &m_desc, rtFormat, DXVA2_ProcAmp_Saturation, &m_saturation)); + + return true; +} + +bool CProcessor::CreateSurfaces() +{ + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + LPDIRECT3DSURFACE9 surfaces[32]; + for (unsigned idx = 0; idx < m_size; idx++) + { + CHECK(pD3DDevice->CreateOffscreenPlainSurface( + (m_desc.SampleWidth + 15) & ~15, + (m_desc.SampleHeight + 15) & ~15, + m_desc.Format, + D3DPOOL_DEFAULT, + &surfaces[idx], + NULL)); + } + + m_context = new CSurfaceContext(); + for (int i = 0; i < m_size; i++) + { + m_context->AddSurface(surfaces[i]); + } + + return true; +} + +CRenderPicture *CProcessor::Convert(DVDVideoPicture* picture) +{ + if (picture->format != RENDER_FMT_YUV420P) + { + CLog::Log(LOGERROR, "%s - colorspace not supported by processor, skipping frame.", __FUNCTION__); + return NULL; + } + + IDirect3DSurface9* surface = m_context->GetFree(NULL); + if (!surface) + { + CLog::Log(LOGERROR, "%s - no free video surface", __FUNCTION__); + return NULL; + } + + D3DLOCKED_RECT rectangle; + if (FAILED(surface->LockRect(&rectangle, NULL, 0))) + { + CLog::Log(LOGERROR, "%s - could not lock rect", __FUNCTION__); + m_context->ClearReference(surface); + return NULL; + } + + // Convert to NV12 - Luma + // TODO: Optimize this later using shaders/swscale/etc. + uint8_t *s = picture->data[0]; + uint8_t* bits = (uint8_t*)(rectangle.pBits); + for (unsigned y = 0; y < picture->iHeight; y++) + { + memcpy(bits, s, picture->iWidth); + s += picture->iLineSize[0]; + bits += rectangle.Pitch; + } + D3DSURFACE_DESC desc; + if (FAILED(surface->GetDesc(&desc))) + { + CLog::Log(LOGERROR, "%s - could not get surface descriptor", __FUNCTION__); + m_context->ClearReference(surface); + return NULL; + } + // Convert to NV12 - Chroma + uint8_t *s_u, *s_v, *d_uv; + for (unsigned y = 0; y < picture->iHeight / 2; y++) + { + s_u = picture->data[1] + (y * picture->iLineSize[1]); + s_v = picture->data[2] + (y * picture->iLineSize[2]); + d_uv = ((uint8_t*)(rectangle.pBits)) + (desc.Height + y) * rectangle.Pitch; + for (unsigned x = 0; x < picture->iWidth / 2; x++) + { + *d_uv++ = *s_u++; + *d_uv++ = *s_v++; + } + } + if (FAILED(surface->UnlockRect())) + { + CLog::Log(LOGERROR, "%s - failed to unlock surface", __FUNCTION__); + m_context->ClearReference(surface); + return NULL; + } + + m_context->ClearReference(surface); + m_context->MarkRender(surface); + CRenderPicture *pic = new CRenderPicture(m_context); + pic->surface = surface; + return pic; +} + +static DXVA2_Fixed32 ConvertRange(const DXVA2_ValueRange& range, int value, int min, int max, int def) +{ + if(value > def) + return DXVA2FloatToFixed( DXVA2FixedToFloat(range.DefaultValue) + + (DXVA2FixedToFloat(range.MaxValue) - DXVA2FixedToFloat(range.DefaultValue)) + * (value - def) / (max - def) ); + else if(value < def) + return DXVA2FloatToFixed( DXVA2FixedToFloat(range.DefaultValue) + + (DXVA2FixedToFloat(range.MinValue) - DXVA2FixedToFloat(range.DefaultValue)) + * (value - def) / (min - def) ); + else + return range.DefaultValue; +} + +bool CProcessor::Render(CRect src, CRect dst, IDirect3DSurface9* target, IDirect3DSurface9** source, DWORD flags, UINT frameIdx) +{ + CSingleLock lock(m_section); + + if (!source[2]) + return false; + + // With auto deinterlacing, the Ion Gen. 1 drops some frames with deinterlacing processor + progressive flags for progressive material. + // For that GPU (or when specified by an advanced setting), use the progressive processor. + // This is at the expense of the switch speed when video interlacing flags change and a deinterlacing processor is actually required. + EDEINTERLACEMODE mode = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; + if (g_advancedSettings.m_DXVANoDeintProcForProgressive || m_quirk_nodeintprocforprog) + mode = (flags & RENDER_FLAG_FIELD0 || flags & RENDER_FLAG_FIELD1) ? VS_DEINTERLACEMODE_FORCE : VS_DEINTERLACEMODE_OFF; + EINTERLACEMETHOD method = g_renderManager.AutoInterlaceMethod(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod); + if(m_interlace_method != method + || m_deinterlace_mode != mode + || !m_process) + { + m_deinterlace_mode = mode; + m_interlace_method = method; + + if (!OpenProcessor()) + return false; + } + + D3DSURFACE_DESC desc; + CHECK(target->GetDesc(&desc)); + CRect rectTarget(0, 0, desc.Width, desc.Height); + CWIN32Util::CropSource(src, dst, rectTarget); + RECT sourceRECT = { src.x1, src.y1, src.x2, src.y2 }; + RECT dstRECT = { dst.x1, dst.y1, dst.x2, dst.y2 }; + + // set sample format for progressive and interlaced + UINT sampleFormat = DXVA2_SampleProgressiveFrame; + if (flags & RENDER_FLAG_FIELD0 && flags & RENDER_FLAG_TOP) + sampleFormat = DXVA2_SampleFieldInterleavedEvenFirst; + else if (flags & RENDER_FLAG_FIELD1 && flags & RENDER_FLAG_BOT) + sampleFormat = DXVA2_SampleFieldInterleavedEvenFirst; + if (flags & RENDER_FLAG_FIELD0 && flags & RENDER_FLAG_BOT) + sampleFormat = DXVA2_SampleFieldInterleavedOddFirst; + if (flags & RENDER_FLAG_FIELD1 && flags & RENDER_FLAG_TOP) + sampleFormat = DXVA2_SampleFieldInterleavedOddFirst; + + // How to prepare the samples array for VideoProcessBlt + // - always provide current picture + the number of forward and backward references required by the current processor. + // - provide the surfaces in the array in increasing temporal order + // - at the start of playback, there may not be enough samples available. Use SampleFormat.SampleFormat = DXVA2_SampleUnknown for the missing samples. + + unsigned int providedPast = 0; + for (int i = 3; i < 8; i++) + { + if (source[i]) + providedPast++; + } + unsigned int providedFuture = 0; + for (int i = 1; i >= 0; i--) + { + if (source[i]) + providedFuture++; + } + int futureFrames = std::min(providedFuture, m_caps.NumForwardRefSamples); + int pastFrames = std::min(providedPast, m_caps.NumBackwardRefSamples); + + int count = 1 + pastFrames + futureFrames; + auto_aptr samp(new DXVA2_VideoSample[count]); + + int start = 2 - futureFrames; + int end = 2 + pastFrames; + int sampIdx = 0; + for (int i = end; i >= start; i--) + { + if (!source[i]) + continue; + + DXVA2_VideoSample& vs = samp[sampIdx]; + vs.SrcSurface = source[i]; + vs.SrcRect = sourceRECT; + vs.DstRect = dstRECT; + vs.SampleData = 0; + vs.Start = frameIdx + (sampIdx - pastFrames) * 2; + vs.End = vs.Start + 2; + vs.PlanarAlpha = DXVA2_Fixed32OpaqueAlpha(); + vs.SampleFormat = m_desc.SampleFormat; + vs.SampleFormat.SampleFormat = sampleFormat; + + // Override the sample format when the processor doesn't need to deinterlace or when deinterlacing is forced and flags are missing. + if (m_progressive) + vs.SampleFormat.SampleFormat = DXVA2_SampleProgressiveFrame; + else if (m_deinterlace_mode == VS_DEINTERLACEMODE_FORCE && vs.SampleFormat.SampleFormat == DXVA2_SampleProgressiveFrame) + vs.SampleFormat.SampleFormat = DXVA2_SampleFieldInterleavedEvenFirst; + + sampIdx++; + } + + + DXVA2_VideoProcessBltParams blt = {}; + blt.TargetFrame = frameIdx; + if (flags & RENDER_FLAG_FIELD1) + blt.TargetFrame += 1; + blt.TargetRect = dstRECT; + blt.ConstrictionSize.cx = 0; + blt.ConstrictionSize.cy = 0; + + blt.DestFormat.VideoTransferFunction = DXVA2_VideoTransFunc_sRGB; + blt.DestFormat.SampleFormat = DXVA2_SampleProgressiveFrame; + if(g_Windowing.UseLimitedColor()) + blt.DestFormat.NominalRange = DXVA2_NominalRange_16_235; + else + blt.DestFormat.NominalRange = DXVA2_NominalRange_0_255; + blt.Alpha = DXVA2_Fixed32OpaqueAlpha(); + + blt.ProcAmpValues.Brightness = ConvertRange( m_brightness, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness + , 0, 100, 50); + blt.ProcAmpValues.Contrast = ConvertRange( m_contrast, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast + , 0, 100, 50); + blt.ProcAmpValues.Hue = m_hue.DefaultValue; + blt.ProcAmpValues.Saturation = m_saturation.DefaultValue; + + blt.BackgroundColor.Y = 0x1000; + blt.BackgroundColor.Cb = 0x8000; + blt.BackgroundColor.Cr = 0x8000; + blt.BackgroundColor.Alpha = 0xffff; + + /* HACK to kickstart certain DXVA drivers (poulsbo) which oddly * + * won't render anything until someting else have been rendered. */ + g_Windowing.Get3DDevice()->SetFVF( D3DFVF_XYZ ); + float verts[2][3]= {}; + g_Windowing.Get3DDevice()->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 1, verts, 3*sizeof(float)); + + CHECK(m_process->VideoProcessBlt(target, &blt, &samp[0], count, NULL)); + return true; +} + +bool CProcessor::LoadSymbols() +{ + CSingleLock lock(m_dlSection); + + if(m_dlHandle == NULL) + m_dlHandle = LoadLibraryEx("dxva2.dll", NULL, 0); + if(m_dlHandle == NULL) + return false; + m_DXVA2CreateVideoService = (DXVA2CreateVideoServicePtr)GetProcAddress(m_dlHandle, "DXVA2CreateVideoService"); + if(m_DXVA2CreateVideoService == NULL) + return false; + return true; +} + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/DXVA.h kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/DXVA.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/DXVA.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/DXVA.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ +#pragma once + +#include "DVDCodecs/Video/DVDVideoCodecFFmpeg.h" +#include "DVDCodecs/Video/DXVA.h" +#include "guilib/D3DResource.h" +#include "threads/Event.h" +#include +#include +#include +#include "settings/VideoSettings.h" +#include "guilib/Geometry.h" + +namespace DXVA { + +class CProcessor + : public ID3DResource +{ +public: + CProcessor(); + ~CProcessor(); + + virtual bool PreInit(); + virtual void UnInit(); + virtual bool Open(UINT width, UINT height, unsigned int flags, unsigned int format, unsigned int extended_format); + virtual void Close(); + virtual CRenderPicture *Convert(DVDVideoPicture* picture); + virtual bool Render(CRect src, CRect dst, IDirect3DSurface9* target, IDirect3DSurface9** source, DWORD flags, UINT frameIdx); + virtual unsigned Size() { if (m_service) return m_size; return 0; } + virtual unsigned PastRefs() { return m_max_back_refs; } + + virtual void OnCreateDevice() {} + virtual void OnDestroyDevice() { CSingleLock lock(m_section); Close(); } + virtual void OnLostDevice() { CSingleLock lock(m_section); Close(); } + virtual void OnResetDevice() { CSingleLock lock(m_section); Close(); } + +protected: + virtual bool LoadSymbols(); + virtual bool UpdateSize(const DXVA2_VideoDesc& dsc); + virtual bool CreateSurfaces(); + virtual bool OpenProcessor(); + virtual bool SelectProcessor(); + virtual void EvaluateQuirkNoDeintProcForProg(); + + IDirectXVideoProcessorService* m_service; + IDirectXVideoProcessor* m_process; + GUID m_device; + + DXVA2_VideoProcessorCaps m_caps; + DXVA2_VideoDesc m_desc; + + DXVA2_ValueRange m_brightness; + DXVA2_ValueRange m_contrast; + DXVA2_ValueRange m_hue; + DXVA2_ValueRange m_saturation; + unsigned m_size; + unsigned m_max_back_refs; + unsigned m_max_fwd_refs; + EDEINTERLACEMODE m_deinterlace_mode; + EINTERLACEMETHOD m_interlace_method; + bool m_progressive; // true for progressive source or to force ignoring interlacing flags. + + CCriticalSection m_section; + CSurfaceContext* m_context; + bool m_quirk_nodeintprocforprog; + static CCriticalSection m_dlSection; + static HMODULE m_dlHandle; + static DXVA2CreateVideoServicePtr m_DXVA2CreateVideoService; +}; + +}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/DXVAHD.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/DXVAHD.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/DXVAHD.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/DXVAHD.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,42 +23,66 @@ // setting that here because otherwise SampleFormat is defined to AVSampleFormat // which we don't use here #define FF_API_OLD_SAMPLE_FMT 0 -#define DEFAULT_STREAM_INDEX (0) -#include #include +#include +#include +#include + #include "DXVAHD.h" +#include "windowing/WindowingFactory.h" +#include "settings/Settings.h" +#include "settings/MediaSettings.h" +#include "utils/AutoPtrHandle.h" +#include "utils/StringUtils.h" +#include "settings/AdvancedSettings.h" #include "cores/VideoRenderers/RenderManager.h" #include "RenderFlags.h" -#include "settings/AdvancedSettings.h" -#include "settings/MediaSettings.h" -#include "utils/Log.h" -#include "utils/win32/memcpy_sse2.h" #include "win32/WIN32Util.h" -#include "windowing/WindowingFactory.h" +#include "utils/Log.h" using namespace DXVA; +using namespace AUTOPTR; +using namespace std; + +#define CHECK(a) \ +do { \ + HRESULT res = a; \ + if(FAILED(res)) \ + { \ + CLog::Log(LOGERROR, __FUNCTION__" - failed executing "#a" at line %d with error %x", __LINE__, res); \ + return false; \ + } \ +} while(0); #define LOGIFERROR(a) \ do { \ HRESULT res = a; \ if(FAILED(res)) \ { \ - CLog::Log(LOGERROR, "%s - failed executing "#a" at line %d with error %x", __FUNCTION__, __LINE__, res); \ + CLog::Log(LOGERROR, __FUNCTION__" - failed executing "#a" at line %d with error %x", __LINE__, res); \ } \ } while(0); +static std::string GUIDToString(const GUID& guid) +{ + std::string buffer = StringUtils::Format("%08X-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x" + , guid.Data1, guid.Data2, guid.Data3 + , guid.Data4[0], guid.Data4[1] + , guid.Data4[2], guid.Data4[3], guid.Data4[4] + , guid.Data4[5], guid.Data4[6], guid.Data4[7]); + return buffer; +} + +DXVAHDCreateVideoServicePtr CProcessorHD::m_DXVAHDCreateVideoService = NULL; + CProcessorHD::CProcessorHD() { - m_pVideoDevice = nullptr; - m_pVideoContext = nullptr; - m_pEnumerator = nullptr; - m_pVideoProcessor = nullptr; + m_pDXVAHD = NULL; + m_pDXVAVP = NULL; g_Windowing.Register(this); - m_context = nullptr; - m_width = 0; - m_height = 0; + m_context = NULL; } CProcessorHD::~CProcessorHD() @@ -71,15 +95,13 @@ { CSingleLock lock(m_section); Close(); - SAFE_RELEASE(m_pVideoDevice); - SAFE_RELEASE(m_pVideoContext); + SAFE_RELEASE(m_pDXVAHD); } void CProcessorHD::Close() { CSingleLock lock(m_section); - SAFE_RELEASE(m_pEnumerator); - SAFE_RELEASE(m_pVideoProcessor); + SAFE_RELEASE(m_pDXVAVP); SAFE_RELEASE(m_context); } @@ -90,153 +112,104 @@ bool CProcessorHD::PreInit() { - SAFE_RELEASE(m_pVideoDevice); - SAFE_RELEASE(m_pVideoContext); - - if ( FAILED(g_Windowing.Get3D11Device()->QueryInterface(__uuidof(ID3D11VideoDevice), reinterpret_cast(&m_pVideoDevice))) - || FAILED(g_Windowing.GetImmediateContext()->QueryInterface(__uuidof(ID3D11VideoContext), reinterpret_cast(&m_pVideoContext)))) + if (!LoadSymbols()) { - CLog::Log(LOGWARNING, __FUNCTION__" - failed to get video devices."); + CLog::Log(LOGWARNING, __FUNCTION__" - DXVAHD not loaded."); return false; } - D3D11_VIDEO_PROCESSOR_CONTENT_DESC desc1; - ZeroMemory(&desc1, sizeof(D3D11_VIDEO_PROCESSOR_CONTENT_DESC)); - desc1.InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST; - desc1.InputWidth = 640; - desc1.InputHeight = 480; - desc1.OutputWidth = 640; - desc1.OutputHeight = 480; - desc1.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL; + UnInit(); - // try to create video enum - if (FAILED(m_pVideoDevice->CreateVideoProcessorEnumerator(&desc1, &m_pEnumerator))) - { - CLog::Log(LOGWARNING, "%s - failed to create Video Enumerator.", __FUNCTION__); - return false; - } + CSingleLock lock(m_section); - memset(&m_texDesc, 0, sizeof(D3D11_TEXTURE2D_DESC)); - return true; -} + DXVAHD_RATIONAL fps = { 60, 1 }; + DXVAHD_CONTENT_DESC desc; + desc.InputFrameFormat = DXVAHD_FRAME_FORMAT_PROGRESSIVE; + desc.InputFrameRate = fps; + desc.InputWidth = 640; + desc.InputHeight = 480; + desc.OutputFrameRate = fps; + desc.OutputWidth = 640; + desc.OutputHeight = 480; + + HRESULT cvres = m_DXVAHDCreateVideoService( (IDirect3DDevice9Ex*)g_Windowing.Get3DDevice() + , &desc + , DXVAHD_DEVICE_USAGE_OPTIMAL_QUALITY + , NULL + , &m_pDXVAHD ); -void CProcessorHD::ApplySupportedFormats(std::vector *formats) -{ - // do not check for NV12 it supported by default - UINT flags; - if (SUCCEEDED(m_pEnumerator->CheckVideoProcessorFormat(DXGI_FORMAT_P010, &flags)) - && (flags & D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_INPUT)) - { - // TODO: temporary disabled - //formats->push_back(RENDER_FMT_YUV420P10); - } - if (SUCCEEDED(m_pEnumerator->CheckVideoProcessorFormat(DXGI_FORMAT_P016, &flags)) - && (flags & D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_INPUT)) + if(FAILED(cvres)) { - // TODO: temporary disabled - //formats->push_back(RENDER_FMT_YUV420P16); - } -} - -bool CProcessorHD::InitProcessor() -{ - SAFE_RELEASE(m_pEnumerator); + if(cvres == E_NOINTERFACE) + CLog::Log(LOGNOTICE, __FUNCTION__" - The Direct3d device doesn't support DXVA-HD."); + else + CLog::Log(LOGERROR, __FUNCTION__" - failed to create DXVAHD device %x", cvres); - CLog::Log(LOGDEBUG, "%s - Initing Video Enumerator with params: %dx%d.", __FUNCTION__, m_width, m_height); + return false; + } - D3D11_VIDEO_PROCESSOR_CONTENT_DESC contentDesc; - ZeroMemory(&contentDesc, sizeof(contentDesc)); - contentDesc.InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST; - contentDesc.InputWidth = m_width; - contentDesc.InputHeight = m_height; - contentDesc.OutputWidth = m_width; - contentDesc.OutputHeight = m_height; - contentDesc.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL; + CHECK(m_pDXVAHD->GetVideoProcessorDeviceCaps( &m_VPDevCaps )); - if (FAILED(m_pVideoDevice->CreateVideoProcessorEnumerator(&contentDesc, &m_pEnumerator))) + if (m_VPDevCaps.VideoProcessorCount == 0) { - CLog::Log(LOGWARNING, "%s - failed to reinit Video Enumerator with new params.", __FUNCTION__); + CLog::Log(LOGWARNING, __FUNCTION__" - unable to find any video processor. GPU drivers doesn't support DXVA-HD."); return false; } - if (FAILED(m_pEnumerator->GetVideoProcessorCaps(&m_vcaps))) + // Create the array of video processor caps. + DXVAHD_VPCAPS* pVPCaps = new (std::nothrow) DXVAHD_VPCAPS[ m_VPDevCaps.VideoProcessorCount ]; + if (pVPCaps == NULL) { - CLog::Log(LOGWARNING, "%s - failed to get processor caps.", __FUNCTION__); + CLog::Log(LOGERROR, __FUNCTION__" - unable to create video processor caps array. Out of memory."); return false; } - CLog::Log(LOGDEBUG, "%s - Video processor has %d rate conversion.", __FUNCTION__, m_vcaps.RateConversionCapsCount); - CLog::Log(LOGDEBUG, "%s - Video processor has %#x feature caps.", __FUNCTION__, m_vcaps.FeatureCaps); - CLog::Log(LOGDEBUG, "%s - Video processor has %#x device caps.", __FUNCTION__, m_vcaps.DeviceCaps); - CLog::Log(LOGDEBUG, "%s - Video processor has %#x input format caps.", __FUNCTION__, m_vcaps.InputFormatCaps); - CLog::Log(LOGDEBUG, "%s - Video processor has %d max input streams.", __FUNCTION__, m_vcaps.MaxInputStreams); - CLog::Log(LOGDEBUG, "%s - Video processor has %d max stream states.", __FUNCTION__, m_vcaps.MaxStreamStates); - - if (0 != (m_vcaps.FeatureCaps & D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_STEREO)) - m_bStereoEnabled = true; + HRESULT hr = m_pDXVAHD->GetVideoProcessorCaps( m_VPDevCaps.VideoProcessorCount, pVPCaps ); + if(FAILED(hr)) + { + CLog::Log(LOGERROR, __FUNCTION__" - failed get processor caps with error %x.", hr); - if (0 != (m_vcaps.FeatureCaps & D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_LEGACY)) - CLog::Log(LOGWARNING, "%s - The video driver does not support full video processing capabilities.", __FUNCTION__); + delete [] pVPCaps; + return false; + } m_max_back_refs = 0; m_max_fwd_refs = 0; - m_procIndex = 0; - unsigned maxProcCaps = 0; - // try to find best processor - for (unsigned int i = 0; i < m_vcaps.RateConversionCapsCount; i++) + for (unsigned int i = 0; i < m_VPDevCaps.VideoProcessorCount; i++) { - D3D11_VIDEO_PROCESSOR_RATE_CONVERSION_CAPS convCaps; - LOGIFERROR(m_pEnumerator->GetVideoProcessorRateConversionCaps(i, &convCaps)) + if (pVPCaps[i].FutureFrames > m_max_fwd_refs) + { + m_max_fwd_refs = pVPCaps[i].FutureFrames; + } - // check only deintelace caps - if ((convCaps.ProcessorCaps & 15) > maxProcCaps) + if (pVPCaps[i].PastFrames > m_max_back_refs) { - m_procIndex = i; - maxProcCaps = convCaps.ProcessorCaps & 15; + m_max_back_refs = pVPCaps[i].PastFrames; } } - CLog::Log(LOGDEBUG, "%s - Selected video processor index: %d.", __FUNCTION__, m_procIndex); - - LOGIFERROR(m_pEnumerator->GetVideoProcessorRateConversionCaps(m_procIndex, &m_rateCaps)) - m_max_fwd_refs = m_rateCaps.FutureFrames; - m_max_back_refs = m_rateCaps.PastFrames; - - CLog::Log(LOGNOTICE, "%s - Supported deinterlace methods: Blend:%s, Bob:%s, Adaptive:%s, MoComp:%s.", __FUNCTION__, - (m_rateCaps.ProcessorCaps & 0x1) != 0 ? "yes" : "no", // BLEND - (m_rateCaps.ProcessorCaps & 0x2) != 0 ? "yes" : "no", // BOB - (m_rateCaps.ProcessorCaps & 0x4) != 0 ? "yes" : "no", // ADAPTIVE - (m_rateCaps.ProcessorCaps & 0x8) != 0 ? "yes" : "no" // MOTION_COMPENSATION - ); - - CLog::Log(LOGDEBUG, "%s - Selected video processor allows %d future frames and %d past frames.", __FUNCTION__, m_rateCaps.FutureFrames, m_rateCaps.PastFrames); - m_size = m_max_back_refs + 1 + m_max_fwd_refs + 2; // refs + 1 display + 2 safety frames // Get the image filtering capabilities. for (long i = 0; i < NUM_FILTERS; i++) { - if (m_vcaps.FilterCaps & (1 << i)) + if (m_VPDevCaps.FilterCaps & (1 << i)) { - ZeroMemory(&m_Filters[i].Range, sizeof(D3D11_VIDEO_PROCESSOR_FILTER_RANGE)); - if (FAILED(m_pEnumerator->GetVideoProcessorFilterRange(PROCAMP_FILTERS[i], &m_Filters[i].Range))) - { - m_Filters[i].bSupported = false; - continue; - } + m_pDXVAHD->GetVideoProcessorFilterRange(PROCAMP_FILTERS[i], &m_Filters[i].Range); m_Filters[i].bSupported = true; - CLog::Log(LOGDEBUG, "%s - Filter %d has following params - max: %d, min: %d, default: %d", __FUNCTION__, - PROCAMP_FILTERS[i], m_Filters[i].Range.Maximum, m_Filters[i].Range.Minimum, m_Filters[i].Range.Default); } else { - CLog::Log(LOGDEBUG, "%s - Filter %d not supported by processor.", __FUNCTION__, PROCAMP_FILTERS[i]); - m_Filters[i].bSupported = false; } } + m_VPCaps = pVPCaps[0]; + m_device = m_VPCaps.VPGuid; + + delete [] pVPCaps; + return true; } @@ -246,65 +219,33 @@ CSingleLock lock(m_section); + if (!m_pDXVAHD) + { + return false; + } + m_width = width; m_height = height; m_flags = flags; m_renderFormat = format; - if (!InitProcessor()) - return false; - if (g_advancedSettings.m_DXVANoDeintProcForProgressive) { - CLog::Log(LOGNOTICE, "%s - Auto deinterlacing mode workaround activated. Deinterlacing processor will be used only for interlaced frames.", __FUNCTION__); - } - - UINT uiFlags; - // check default output format DXGI_FORMAT_B8G8R8A8_UNORM (as render target) - if ( S_OK != m_pEnumerator->CheckVideoProcessorFormat(DXGI_FORMAT_B8G8R8A8_UNORM, &uiFlags) - || 0 == (uiFlags & D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_OUTPUT)) - { - CLog::Log(LOGERROR, "%s - Unsupported output format.", __FUNCTION__); - return false; + CLog::Log(LOGNOTICE, __FUNCTION__" - Auto deinterlacing mode workaround activated. Deinterlacing processor will be used only for interlaced frames."); } if (format == RENDER_FMT_DXVA) { - m_textureFormat = (DXGI_FORMAT)extended_format; - - // this was checked by decoder, but check again. - if ( S_OK != m_pEnumerator->CheckVideoProcessorFormat(m_textureFormat, &uiFlags) - || 0 == (uiFlags & D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_INPUT)) - { - CLog::Log(LOGERROR, "%s - Unsupported input format.", __FUNCTION__); - return false; - } + m_format = (D3DFORMAT)extended_format; } else { // Only NV12 software colorspace conversion is implemented for now - m_textureFormat = DXGI_FORMAT_NV12; // default - - if (format == RENDER_FMT_YUV420P) - m_textureFormat = DXGI_FORMAT_NV12; - if (format == RENDER_FMT_YUV420P10) - m_textureFormat = DXGI_FORMAT_P010; - if (format == RENDER_FMT_YUV420P16) - m_textureFormat = DXGI_FORMAT_P016; - - if ( S_OK != m_pEnumerator->CheckVideoProcessorFormat(m_textureFormat, &uiFlags) - || 0 == (uiFlags & D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_INPUT)) - { - CLog::Log(LOGERROR, "%s - Unsupported input format.", __FUNCTION__); - return false; - } - + m_format = (D3DFORMAT)MAKEFOURCC('N','V','1','2'); if (!CreateSurfaces()) return false; } - CLog::Log(LOGDEBUG, "%s - Creating processor with input format: (%d).", __FUNCTION__, m_textureFormat); - if (!OpenProcessor()) { return false; @@ -315,432 +256,267 @@ bool CProcessorHD::ReInit() { - return PreInit() && Open(m_width, m_height, m_flags, m_renderFormat, m_textureFormat); + return PreInit() && (m_renderFormat == RENDER_FMT_DXVA || CreateSurfaces()); } bool CProcessorHD::OpenProcessor() { // restore the device if it was lost - if (!m_pEnumerator && !ReInit()) + if (!m_pDXVAHD && !ReInit()) + { return false; + } - SAFE_RELEASE(m_pVideoProcessor); + SAFE_RELEASE(m_pDXVAVP); - CLog::Log(LOGDEBUG, "%s - Creating video processor.", __FUNCTION__); + CLog::Log(LOGDEBUG, __FUNCTION__" - processor selected %s.", GUIDToString(m_device).c_str()); - // create processor - // There is a MSFT bug when creating processor it might throw first-chance exception - HRESULT hr = m_pVideoDevice->CreateVideoProcessor(m_pEnumerator, m_procIndex, &m_pVideoProcessor); - if (FAILED(hr)) - { - CLog::Log(LOGDEBUG, "%s - Failed creating video processor with error %x.", __FUNCTION__, hr); - return false; - } + CHECK(m_pDXVAHD->CreateVideoProcessor(&m_device, &m_pDXVAVP)); - D3D11_VIDEO_PROCESSOR_COLOR_SPACE cs + DXVAHD_STREAM_STATE_D3DFORMAT_DATA d3dformat = { m_format }; + CHECK(m_pDXVAVP->SetVideoProcessStreamState( 0, DXVAHD_STREAM_STATE_D3DFORMAT + , sizeof(d3dformat), &d3dformat )); + + DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE_DATA data = { - 0, // 0 - Playback, 1 - Processing - 0, // 0 - Full (0-255), 1 - Limited (16-235) - m_flags & CONF_FLAGS_YUVCOEF_BT709 ? 1 : 0, // 0 - BT.601, 1 - BT.709 - m_flags & CONF_FLAGS_YUV_FULLRANGE ? 1 : 0, // 0 - Conventional YCbCr, 1 - xvYCC - 0, // 2 - Full luminance range [0-255], 1 - Studio luminance range [16-235], 0 - driver defaults + 0, // Type: 0=Video, 1=Graphics + 0, // RGB_Range: 0=Full, 1=Limited + m_flags & CONF_FLAGS_YUVCOEF_BT709 ? 1 : 0, // YCbCr_Matrix: 0=BT.601, 1=BT.709 + m_flags & CONF_FLAGS_YUV_FULLRANGE ? 1 : 0 // YCbCr_xvYCC: 0=Conventional YCbCr, 1=xvYCC }; - if (m_vcaps.DeviceCaps & D3D11_VIDEO_PROCESSOR_DEVICE_CAPS_NOMINAL_RANGE) - cs.Nominal_Range = m_flags & CONF_FLAGS_YUV_FULLRANGE ? 2 : 1; - m_pVideoContext->VideoProcessorSetStreamColorSpace(m_pVideoProcessor, DEFAULT_STREAM_INDEX, &cs); - - // Output background color (black) - D3D11_VIDEO_COLOR color = {}; - color.YCbCr = { 0.0625f, 0.5f, 0.5f, 1.0f }; // black color - m_pVideoContext->VideoProcessorSetOutputBackgroundColor(m_pVideoProcessor, TRUE, &color); - - // the following code is unneeded, keep it for reference only - /*if (0 != (m_vcaps.FeatureCaps & D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_ALPHA_FILL)) - { - CLog::Log(LOGDEBUG, "%s - Processor supports alfa fill feature.", __FUNCTION__); - //m_pVideoContext->VideoProcessorSetStreamAlpha(m_pVideoProcessor, DEFAULT_STREAM_INDEX, true, 1.0f); - //m_pVideoContext->VideoProcessorSetOutputAlphaFillMode(m_pVideoProcessor, D3D11_VIDEO_PROCESSOR_ALPHA_FILL_MODE_BACKGROUND, DEFAULT_STREAM_INDEX); - } - else - CLog::Log(LOGDEBUG, "%s - Processor doesn't support alfa fill feature.", __FUNCTION__); + CHECK(m_pDXVAVP->SetVideoProcessStreamState( 0, DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE + , sizeof(data), &data )); - // Output rate (repeat frames) - if (0 != (m_rateCaps.ProcessorCaps & D3D11_VIDEO_PROCESSOR_PROCESSOR_CAPS_FRAME_RATE_CONVERSION)) - { - CLog::Log(LOGDEBUG, "%s - Processor supports frame rate conversion feature.", __FUNCTION__); - //m_pVideoContext->VideoProcessorSetStreamOutputRate(m_pVideoProcessor, DEFAULT_STREAM_INDEX, D3D11_VIDEO_PROCESSOR_OUTPUT_RATE_NORMAL, TRUE, NULL); - } - else - CLog::Log(LOGDEBUG, "%s - Processor doesn't support frame rate conversion feature.", __FUNCTION__);*/ + DXVAHD_COLOR_YCbCrA bgColor = { 0.0625f, 0.5f, 0.5f, 1.0f }; // black color + DXVAHD_COLOR backgroundColor; + backgroundColor.YCbCr = bgColor; + DXVAHD_BLT_STATE_BACKGROUND_COLOR_DATA backgroundData = { true, backgroundColor }; // {YCbCr, DXVAHD_COLOR} + CHECK(m_pDXVAVP->SetVideoProcessBltState( DXVAHD_BLT_STATE_BACKGROUND_COLOR + , sizeof (backgroundData), &backgroundData )); + + DXVAHD_STREAM_STATE_ALPHA_DATA alpha = { true, 1.0f }; + CHECK(m_pDXVAVP->SetVideoProcessStreamState( 0, DXVAHD_STREAM_STATE_ALPHA + , sizeof(alpha), &alpha )); return true; } bool CProcessorHD::CreateSurfaces() { - HRESULT hr; - size_t idx; - ID3D11Device* pD3DDevice = g_Windowing.Get3D11Device(); - - // we cannot use texture array (like in decoder) for USAGE_DYNAMIC, so create separete textures - CD3D11_TEXTURE2D_DESC texDesc(m_textureFormat, FFALIGN(m_width, 16), FFALIGN(m_height, 16), 1, 1, D3D11_BIND_DECODER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); - D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC pivd = { 0, D3D11_VPIV_DIMENSION_TEXTURE2D }; - pivd.Texture2D.ArraySlice = 0; - pivd.Texture2D.MipSlice = 0; - - ID3D11VideoProcessorInputView* views[32] = { 0 }; - CLog::Log(LOGDEBUG, "%s - Creating %d processor surfaces with format %d.", __FUNCTION__, m_size, m_textureFormat); - - for (idx = 0; idx < m_size; idx++) - { - ID3D11Texture2D* pTexture = nullptr; - hr = pD3DDevice->CreateTexture2D(&texDesc, NULL, &pTexture); - if (FAILED(hr)) - break; - - hr = m_pVideoDevice->CreateVideoProcessorInputView(pTexture, m_pEnumerator, &pivd, &views[idx]); - SAFE_RELEASE(pTexture); - if (FAILED(hr)) - break; - } - - if (idx != m_size) - { - // something goes wrong - CLog::Log(LOGERROR, "%s - Failed to create processor surfaces.", __FUNCTION__); - for (unsigned idx = 0; idx < m_size; idx++) - { - SAFE_RELEASE(views[idx]); - } - return false; + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + LPDIRECT3DSURFACE9 surfaces[32]; + for (unsigned idx = 0; idx < m_size; idx++) + { + CHECK(pD3DDevice->CreateOffscreenPlainSurface( + (m_width + 15) & ~15, + (m_height + 15) & ~15, + m_format, + m_VPDevCaps.InputPool, + &surfaces[idx], + NULL)); } m_context = new CSurfaceContext(); - for (unsigned int i = 0; i < m_size; i++) + for (int i = 0; i < m_size; i++) { - m_context->AddSurface(views[i]); + m_context->AddSurface(surfaces[i]); } - m_texDesc = texDesc; return true; } -CRenderPicture *CProcessorHD::Convert(DVDVideoPicture* picture) -{ - // RENDER_FMT_YUV420P -> DXGI_FORMAT_NV12 - // RENDER_FMT_YUV420P10 -> DXGI_FORMAT_P010 - // RENDER_FMT_YUV420P16 -> DXGI_FORMAT_P016 - if ( picture->format != RENDER_FMT_YUV420P - && picture->format != RENDER_FMT_YUV420P10 - && picture->format != RENDER_FMT_YUV420P16) - { - CLog::Log(LOGERROR, "%s - colorspace not supported by processor, skipping frame.", __FUNCTION__); - return nullptr; - } - - ID3D11View* pView = m_context->GetFree(nullptr); - if (!pView) - { - CLog::Log(LOGERROR, "%s - no free video surface", __FUNCTION__); - return nullptr; - } - - ID3D11VideoProcessorInputView* view = reinterpret_cast(pView); - - ID3D11Resource* pResource = nullptr; - view->GetResource(&pResource); - - D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC vpivd; - view->GetDesc(&vpivd); - UINT subresource = D3D11CalcSubresource(0, vpivd.Texture2D.ArraySlice, 1); - - D3D11_MAPPED_SUBRESOURCE rectangle; - ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext(); - if (FAILED(pContext->Map(pResource, subresource, D3D11_MAP_WRITE_DISCARD, 0, &rectangle))) - { - CLog::Log(LOGERROR, "%s - could not lock rect", __FUNCTION__); - m_context->ClearReference(view); - return nullptr; - } - - if (picture->format == RENDER_FMT_YUV420P) - { - uint8_t* pData = static_cast(rectangle.pData); - uint8_t* dst[] = { pData, pData + m_texDesc.Height * rectangle.RowPitch }; - int dstStride[] = { rectangle.RowPitch, rectangle.RowPitch }; - convert_yuv420_nv12(picture->data, picture->iLineSize, picture->iHeight, picture->iWidth, dst, dstStride); - } - else - { - // TODO: Optimize this later using sse2/sse4 - uint16_t * d_y = static_cast(rectangle.pData); - uint16_t * d_uv = d_y + m_texDesc.Height * rectangle.RowPitch; - // Convert to NV12 - Luma - for (size_t line = 0; line < picture->iHeight; ++line) - { - uint16_t * y = (uint16_t*)(picture->data[0] + picture->iLineSize[0] * line); - uint16_t * d = d_y + rectangle.RowPitch * line; - memcpy(d, y, picture->iLineSize[0]); - } - // Convert to NV12 - Chroma - size_t chromaWidth = (picture->iWidth + 1) >> 1; - size_t chromaHeight = picture->iHeight >> 1; - for (size_t line = 0; line < chromaHeight; ++line) - { - uint16_t * u = (uint16_t*)picture->data[1] + line * picture->iLineSize[1]; - uint16_t * v = (uint16_t*)picture->data[2] + line * picture->iLineSize[2]; - uint16_t * d = d_uv + line * rectangle.RowPitch; - for (size_t x = 0; x < chromaWidth; x++) - { - *d++ = *u++; - *d++ = *v++; - } - } - } - pContext->Unmap(pResource, subresource); - SAFE_RELEASE(pResource); - - m_context->ClearReference(view); - m_context->MarkRender(view); - CRenderPicture *pic = new CRenderPicture(m_context); - pic->view = view; - return pic; -} - -bool CProcessorHD::ApplyFilter(D3D11_VIDEO_PROCESSOR_FILTER filter, int value, int min, int max, int def) +bool CProcessorHD::ApplyFilter(DXVAHD_FILTER filter, int value, int min, int max, int def) { if (filter >= NUM_FILTERS) return false; // Unsupported filter. Ignore. if (!m_Filters[filter].bSupported) + { return false; + } - D3D11_VIDEO_PROCESSOR_FILTER_RANGE range = m_Filters[filter].Range; + DXVAHD_FILTER_RANGE_DATA range = m_Filters[filter].Range; int val; if(value > def) + { val = range.Default + (range.Maximum - range.Default) * (value - def) / (max - def); + } else if(value < def) - val = range.Default + (range.Minimum - range.Default) * (value - def) / (min - def); - else - val = range.Default; - - m_pVideoContext->VideoProcessorSetStreamFilter(m_pVideoProcessor, DEFAULT_STREAM_INDEX, filter, val != range.Default, val); - return true; -} - -ID3D11VideoProcessorInputView* CProcessorHD::GetInputView(ID3D11View* view) -{ - ID3D11VideoProcessorInputView* inputView = nullptr; - if (m_context) // we have own context so the view will be processor input view { - inputView = reinterpret_cast(view); - inputView->AddRef(); // it will be released in Render method - - return inputView; + val = range.Default + (range.Minimum - range.Default) * (value - def) / (min - def); } - - // the view came from decoder - ID3D11VideoDecoderOutputView* decoderView = reinterpret_cast(view); - if (!decoderView) + else { - CLog::Log(LOGERROR, __FUNCTION__" - cannot get view."); - return nullptr; + val = range.Default; } - ID3D11Resource* resource = nullptr; - D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC vdovd; - decoderView->GetDesc(&vdovd); - decoderView->GetResource(&resource); - - D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC vpivd = { 0 }; - vpivd.FourCC = 0; // if zero, the driver uses the DXGI format; must be 0 on level 9.x - vpivd.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D; - vpivd.Texture2D.ArraySlice = vdovd.Texture2D.ArraySlice; - vpivd.Texture2D.MipSlice = 0; + DXVAHD_STREAM_STATE_FILTER_DATA data = { true, val }; + DXVAHD_STREAM_STATE state = static_cast(DXVAHD_STREAM_STATE_FILTER_BRIGHTNESS + filter); - if (FAILED(m_pVideoDevice->CreateVideoProcessorInputView(resource, m_pEnumerator, &vpivd, &inputView))) - { - CLog::Log(LOGERROR, __FUNCTION__" - cannot create processor view."); - } - resource->Release(); - - return inputView; + return !FAILED( m_pDXVAVP->SetVideoProcessStreamState( 0, state, sizeof(data), &data ) ); } -bool CProcessorHD::Render(CRect src, CRect dst, ID3D11Resource* target, ID3D11View** views, DWORD flags, UINT frameIdx, UINT rotation) +bool CProcessorHD::Render(CRect src, CRect dst, IDirect3DSurface9* target, IDirect3DSurface9** source, DWORD flags, UINT frameIdx) { - HRESULT hr; CSingleLock lock(m_section); // restore processor if it was lost - if (!m_pVideoProcessor && !OpenProcessor()) + if(!m_pDXVAVP && !OpenProcessor()) + { return false; + } - if (!views[2]) + if (!source[2]) return false; - EDEINTERLACEMODE deinterlace_mode = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode; + EDEINTERLACEMODE deinterlace_mode = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; if (g_advancedSettings.m_DXVANoDeintProcForProgressive) deinterlace_mode = (flags & RENDER_FLAG_FIELD0 || flags & RENDER_FLAG_FIELD1) ? VS_DEINTERLACEMODE_FORCE : VS_DEINTERLACEMODE_OFF; - EINTERLACEMETHOD interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod); - - bool progressive = deinterlace_mode == VS_DEINTERLACEMODE_OFF; + EINTERLACEMETHOD interlace_method = g_renderManager.AutoInterlaceMethod(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod); + bool progressive = deinterlace_mode == VS_DEINTERLACEMODE_OFF + || ( interlace_method != VS_INTERLACEMETHOD_DXVA_BOB + && interlace_method != VS_INTERLACEMETHOD_DXVA_BEST); + + D3DSURFACE_DESC desc; + CHECK(target->GetDesc(&desc)); + CRect rectTarget(0, 0, desc.Width, desc.Height); + CWIN32Util::CropSource(src, dst, rectTarget); RECT sourceRECT = { src.x1, src.y1, src.x2, src.y2 }; RECT dstRECT = { dst.x1, dst.y1, dst.x2, dst.y2 }; - D3D11_VIDEO_FRAME_FORMAT dxvaFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE; + DXVAHD_FRAME_FORMAT dxvaFrameFormat = DXVAHD_FRAME_FORMAT_PROGRESSIVE; unsigned int providedPast = 0; for (int i = 3; i < 8; i++) { - if (views[i]) + if (source[i]) providedPast++; } unsigned int providedFuture = 0; for (int i = 1; i >= 0; i--) { - if (views[i]) + if (source[i]) providedFuture++; } - int futureFrames = std::min(providedFuture, m_rateCaps.FutureFrames); - int pastFrames = std::min(providedPast, m_rateCaps.PastFrames); + int futureFrames = std::min(providedFuture, m_VPCaps.FutureFrames); + int pastFrames = std::min(providedPast, m_VPCaps.PastFrames); - D3D11_VIDEO_PROCESSOR_STREAM stream_data = { 0 }; + DXVAHD_STREAM_DATA stream_data = { 0 }; stream_data.Enable = TRUE; stream_data.PastFrames = pastFrames; stream_data.FutureFrames = futureFrames; - stream_data.ppPastSurfaces = new ID3D11VideoProcessorInputView*[pastFrames]; - stream_data.ppFutureSurfaces = new ID3D11VideoProcessorInputView*[futureFrames]; - stream_data.pInputSurfaceRight = nullptr; - stream_data.ppPastSurfacesRight = nullptr; - stream_data.ppFutureSurfacesRight = nullptr; + stream_data.ppPastSurfaces = new IDirect3DSurface9*[pastFrames]; + stream_data.ppFutureSurfaces = new IDirect3DSurface9*[futureFrames]; int start = 2 - futureFrames; int end = 2 + pastFrames; - D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC pivd; - ZeroMemory(&pivd, sizeof(D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC)); - pivd.FourCC = 0; - pivd.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D; - pivd.Texture2D.ArraySlice = 0; - pivd.Texture2D.MipSlice = 0; - for (int i = start; i <= end; i++) { - if (!views[i]) + if (!source[i]) continue; if (i > 2) { // frames order should be { ?, T-3, T-2, T-1 } - stream_data.ppPastSurfaces[2 + pastFrames - i] = GetInputView(views[i]); + stream_data.ppPastSurfaces[2+pastFrames-i] = source[i]; } else if (i == 2) { - stream_data.pInputSurface = GetInputView(views[2]); + stream_data.pInputSurface = source[2]; } else if (i < 2) { // frames order should be { T+1, T+2, T+3, .. } - stream_data.ppFutureSurfaces[1 - i] = GetInputView(views[i]); + stream_data.ppFutureSurfaces[1-i] = source[i]; } } if (flags & RENDER_FLAG_FIELD0 && flags & RENDER_FLAG_TOP) - dxvaFrameFormat = D3D11_VIDEO_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST; + dxvaFrameFormat = DXVAHD_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST; else if (flags & RENDER_FLAG_FIELD1 && flags & RENDER_FLAG_BOT) - dxvaFrameFormat = D3D11_VIDEO_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST; + dxvaFrameFormat = DXVAHD_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST; if (flags & RENDER_FLAG_FIELD0 && flags & RENDER_FLAG_BOT) - dxvaFrameFormat = D3D11_VIDEO_FRAME_FORMAT_INTERLACED_BOTTOM_FIELD_FIRST; + dxvaFrameFormat = DXVAHD_FRAME_FORMAT_INTERLACED_BOTTOM_FIELD_FIRST; if (flags & RENDER_FLAG_FIELD1 && flags & RENDER_FLAG_TOP) - dxvaFrameFormat = D3D11_VIDEO_FRAME_FORMAT_INTERLACED_BOTTOM_FIELD_FIRST; + dxvaFrameFormat = DXVAHD_FRAME_FORMAT_INTERLACED_BOTTOM_FIELD_FIRST; // Override the sample format when the processor doesn't need to deinterlace or when deinterlacing is forced and flags are missing. if (progressive) { - dxvaFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE; + dxvaFrameFormat = DXVAHD_FRAME_FORMAT_PROGRESSIVE; } else if (deinterlace_mode == VS_DEINTERLACEMODE_FORCE - && dxvaFrameFormat == D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE) + && dxvaFrameFormat == DXVAHD_FRAME_FORMAT_PROGRESSIVE) { - dxvaFrameFormat = D3D11_VIDEO_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST; + dxvaFrameFormat = DXVAHD_FRAME_FORMAT_INTERLACED_TOP_FIELD_FIRST; } - bool frameProgressive = dxvaFrameFormat == D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE; + bool frameProgressive = dxvaFrameFormat == DXVAHD_FRAME_FORMAT_PROGRESSIVE; // Progressive or Interlaced video at normal rate. stream_data.InputFrameOrField = frameIdx; stream_data.OutputIndex = flags & RENDER_FLAG_FIELD1 && !frameProgressive ? 1 : 0; - // input format - m_pVideoContext->VideoProcessorSetStreamFrameFormat(m_pVideoProcessor, DEFAULT_STREAM_INDEX, dxvaFrameFormat); - // Source rect - m_pVideoContext->VideoProcessorSetStreamSourceRect(m_pVideoProcessor, DEFAULT_STREAM_INDEX, TRUE, &sourceRECT); - // Stream dest rect - m_pVideoContext->VideoProcessorSetStreamDestRect(m_pVideoProcessor, DEFAULT_STREAM_INDEX, TRUE, &dstRECT); - // Output rect - m_pVideoContext->VideoProcessorSetOutputTargetRect(m_pVideoProcessor, TRUE, &dstRECT); - // Output color space - // don't apply any color range conversion, this will be fixed at later stage. - D3D11_VIDEO_PROCESSOR_COLOR_SPACE colorSpace = {}; - colorSpace.Usage = 0; // 0 - playback, 1 - video processing - colorSpace.RGB_Range = 0; // 0 - 0-255, 1 - 16-235 - colorSpace.YCbCr_Matrix = 1; // 0 - BT.601, 1 = BT.709 - colorSpace.YCbCr_xvYCC = 1; // 0 - Conventional YCbCr, 1 - xvYCC - colorSpace.Nominal_Range = 2; // 2 - 0-255, 1 = 16-235, 0 - undefined - - m_pVideoContext->VideoProcessorSetOutputColorSpace(m_pVideoProcessor, &colorSpace); - - ApplyFilter(D3D11_VIDEO_PROCESSOR_FILTER_BRIGHTNESS, - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness, 0, 100, 50); - ApplyFilter(D3D11_VIDEO_PROCESSOR_FILTER_CONTRAST, - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast, 0, 100, 50); - ApplyFilter(D3D11_VIDEO_PROCESSOR_FILTER_HUE, 50, 0, 100, 50); - ApplyFilter(D3D11_VIDEO_PROCESSOR_FILTER_SATURATION, 50, 0, 100, 50); - // Rotation - m_pVideoContext->VideoProcessorSetStreamRotation(m_pVideoProcessor, DEFAULT_STREAM_INDEX, (rotation != 0), (D3D11_VIDEO_PROCESSOR_ROTATION)(rotation / 90)); - - // - // Create Output View of Output Surfaces. - // - D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC OutputViewDesc; - ZeroMemory(&OutputViewDesc, sizeof(OutputViewDesc)); - OutputViewDesc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D; - OutputViewDesc.Texture2D.MipSlice = 0; - OutputViewDesc.Texture2DArray.ArraySize = 0; // 2 for stereo - OutputViewDesc.Texture2DArray.MipSlice = 0; - OutputViewDesc.Texture2DArray.FirstArraySlice = 0; - - ID3D11VideoProcessorOutputView* pOutputView; - hr = m_pVideoDevice->CreateVideoProcessorOutputView(target, m_pEnumerator, &OutputViewDesc, &pOutputView); - if (S_OK != hr) - CLog::Log(FAILED(hr) ? LOGERROR : LOGWARNING, __FUNCTION__" - Device returns result '%x' while creating processor output.", hr); - - if (SUCCEEDED(hr)) - { - hr = m_pVideoContext->VideoProcessorBlt(m_pVideoProcessor, pOutputView, frameIdx, 1, &stream_data); - if (S_OK != hr) - { - CLog::Log(FAILED(hr) ? LOGERROR : LOGWARNING, __FUNCTION__" - Device returns result '%x' while VideoProcessorBlt execution.", hr); - } - } + DXVAHD_STREAM_STATE_FRAME_FORMAT_DATA frame_format = { dxvaFrameFormat }; + LOGIFERROR( m_pDXVAVP->SetVideoProcessStreamState( 0, DXVAHD_STREAM_STATE_FRAME_FORMAT + , sizeof(frame_format), &frame_format ) ); + + DXVAHD_STREAM_STATE_DESTINATION_RECT_DATA dstRect = { true, dstRECT }; + LOGIFERROR( m_pDXVAVP->SetVideoProcessStreamState( 0, DXVAHD_STREAM_STATE_DESTINATION_RECT + , sizeof(dstRect), &dstRect)); + + DXVAHD_STREAM_STATE_SOURCE_RECT_DATA srcRect = { true, sourceRECT }; + LOGIFERROR( m_pDXVAVP->SetVideoProcessStreamState( 0, DXVAHD_STREAM_STATE_SOURCE_RECT + , sizeof(srcRect), &srcRect)); + + ApplyFilter( DXVAHD_FILTER_BRIGHTNESS, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness + , 0, 100, 50); + ApplyFilter( DXVAHD_FILTER_CONTRAST, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast + , 0, 100, 50); + + unsigned int uiRange = g_Windowing.UseLimitedColor() ? 1 : 0; + DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE_DATA colorData = + { + 0, // 0 = playback, 1 = video processing + uiRange, // 0 = 0-255, 1 = 16-235 + 1, // 0 = BT.601, 1 = BT.709 + 1 // 0 = Conventional YCbCr, 1 = xvYCC + }; - SAFE_RELEASE(pOutputView); - SAFE_RELEASE(stream_data.pInputSurface); + LOGIFERROR( m_pDXVAVP->SetVideoProcessBltState( DXVAHD_BLT_STATE_OUTPUT_COLOR_SPACE + , sizeof(colorData), &colorData )); - for (unsigned i = 0; i < stream_data.PastFrames; ++i) - SAFE_RELEASE(stream_data.ppPastSurfaces[i]); + DXVAHD_BLT_STATE_TARGET_RECT_DATA targetRect = { true, dstRECT }; + LOGIFERROR( m_pDXVAVP->SetVideoProcessBltState( DXVAHD_BLT_STATE_TARGET_RECT + , sizeof(targetRect), &targetRect ) ); - for (unsigned i = 0; i < stream_data.FutureFrames; ++i) - SAFE_RELEASE(stream_data.ppFutureSurfaces[i]); + HRESULT hr = m_pDXVAVP->VideoProcessBltHD(target, frameIdx, 1, &stream_data); + if(FAILED(hr)) + { + CLog::Log(LOGERROR, __FUNCTION__" - failed executing VideoProcessBltHD with error %x", hr); + } - delete[] stream_data.ppPastSurfaces; + delete [] stream_data.ppPastSurfaces; delete [] stream_data.ppFutureSurfaces; return !FAILED(hr); } +bool CProcessorHD::LoadSymbols() +{ + CSingleLock lock(m_dlSection); + if(m_dlHandle == NULL) + m_dlHandle = LoadLibraryEx("dxva2.dll", NULL, 0); + if(m_dlHandle == NULL) + return false; + m_DXVAHDCreateVideoService = (DXVAHDCreateVideoServicePtr)GetProcAddress(m_dlHandle, "DXVAHD_CreateDevice"); + if(m_DXVAHDCreateVideoService == NULL) + return false; + return true; +} + #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/DXVAHD.h kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/DXVAHD.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/DXVAHD.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/DXVAHD.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,28 +19,29 @@ */ #pragma once +#include "threads/Event.h" +#include "DXVA.h" #include -#include -#include "DVDCodecs/Video/DVDVideoCodecFFmpeg.h" -#include "DVDCodecs/Video/DXVA.h" -#include "guilib/D3DResource.h" #include "guilib/Geometry.h" +#include namespace DXVA { -// ProcAmp filters d3d11 filters -const D3D11_VIDEO_PROCESSOR_FILTER PROCAMP_FILTERS[] = +// ProcAmp filters +const DXVAHD_FILTER PROCAMP_FILTERS[] = { - D3D11_VIDEO_PROCESSOR_FILTER_BRIGHTNESS, - D3D11_VIDEO_PROCESSOR_FILTER_CONTRAST, - D3D11_VIDEO_PROCESSOR_FILTER_HUE, - D3D11_VIDEO_PROCESSOR_FILTER_SATURATION + DXVAHD_FILTER_BRIGHTNESS, + DXVAHD_FILTER_CONTRAST, + DXVAHD_FILTER_HUE, + DXVAHD_FILTER_SATURATION }; const DWORD NUM_FILTERS = ARRAYSIZE(PROCAMP_FILTERS); -class CProcessorHD : ID3DResource - //: public CProcessor +typedef HRESULT (__stdcall *DXVAHDCreateVideoServicePtr)(IDirect3DDevice9Ex *pD3DDevice, const DXVAHD_CONTENT_DESC *pContentDesc, DXVAHD_DEVICE_USAGE Usage, PDXVAHDSW_Plugin pPlugin, IDXVAHD_Device **ppDevice); + +class CProcessorHD + : public CProcessor { public: CProcessorHD(); @@ -50,11 +51,9 @@ virtual void UnInit(); virtual bool Open(UINT width, UINT height, unsigned int flags, unsigned int format, unsigned int extended_format); virtual void Close(); - virtual CRenderPicture *Convert(DVDVideoPicture* picture); - virtual bool Render(CRect src, CRect dst, ID3D11Resource* target, ID3D11View **views, DWORD flags, UINT frameIdx, UINT rotation); - virtual unsigned Size() { if (m_pVideoProcessor) return m_size; return 0; } + virtual bool Render(CRect src, CRect dst, IDirect3DSurface9* target, IDirect3DSurface9 **source, DWORD flags, UINT frameIdx); + virtual unsigned Size() { if (m_pDXVAHD) return m_size; return 0; } virtual unsigned PastRefs() { return m_max_back_refs; } - virtual void ApplySupportedFormats(std::vector * formats); virtual void OnCreateDevice() {} virtual void OnDestroyDevice() { CSingleLock lock(m_section); UnInit(); } @@ -62,43 +61,31 @@ virtual void OnResetDevice() { CSingleLock lock(m_section); Close(); } protected: + virtual bool LoadSymbols(); virtual bool UpdateSize(const DXVA2_VideoDesc& dsc); virtual bool ReInit(); - virtual bool InitProcessor(); virtual bool CreateSurfaces(); virtual bool OpenProcessor(); - virtual bool ApplyFilter(D3D11_VIDEO_PROCESSOR_FILTER filter, int value, int min, int max, int def); - ID3D11VideoProcessorInputView* GetInputView(ID3D11View* view); + virtual bool ApplyFilter(DXVAHD_FILTER filter, int value, int min, int max, int def); + IDXVAHD_Device *m_pDXVAHD; // DXVA-HD device. + IDXVAHD_VideoProcessor *m_pDXVAVP; // DXVA-HD video processor. + DXVAHD_VPDEVCAPS m_VPDevCaps; + DXVAHD_VPCAPS m_VPCaps; unsigned int m_width; unsigned int m_height; + D3DFORMAT m_format; unsigned int m_flags; unsigned int m_renderFormat; - unsigned m_size; - unsigned m_max_back_refs; - unsigned m_max_fwd_refs; struct ProcAmpInfo { - bool bSupported; - D3D11_VIDEO_PROCESSOR_FILTER_RANGE Range; + bool bSupported; + DXVAHD_FILTER_RANGE_DATA Range; }; ProcAmpInfo m_Filters[NUM_FILTERS]; - // dx 11 - DXGI_FORMAT m_textureFormat; - ID3D11VideoDevice* m_pVideoDevice; - ID3D11VideoContext* m_pVideoContext; - ID3D11VideoProcessorEnumerator* m_pEnumerator; - D3D11_VIDEO_PROCESSOR_CAPS m_vcaps; - ID3D11VideoProcessor* m_pVideoProcessor; - bool m_bStereoEnabled = false; - CSurfaceContext* m_context; - CCriticalSection m_section; - - unsigned int m_procIndex; - D3D11_VIDEO_PROCESSOR_RATE_CONVERSION_CAPS m_rateCaps; - D3D11_TEXTURE2D_DESC m_texDesc; + static DXVAHDCreateVideoServicePtr m_DXVAHDCreateVideoService; }; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -283,7 +283,7 @@ // Calculate the input frame aspect ratio. CalculateFrameAspectRatio(d_width, d_height); ChooseBestResolution(fps); - SetViewMode(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode); + SetViewMode(CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); ManageDisplay(); m_bConfigured = true; @@ -719,7 +719,7 @@ m_bConfigured = false; m_bValidated = false; UnInit(); - m_resolution = CDisplaySettings::GetInstance().GetCurrentResolution(); + m_resolution = CDisplaySettings::Get().GetCurrentResolution(); if ( m_resolution == RES_WINDOW ) m_resolution = RES_DESKTOP; @@ -767,13 +767,13 @@ void CLinuxRendererGL::UpdateVideoFilter() { - bool pixelRatioChanged = (CDisplaySettings::GetInstance().GetPixelRatio() > 1.001f || CDisplaySettings::GetInstance().GetPixelRatio() < 0.999f) != + bool pixelRatioChanged = (CDisplaySettings::Get().GetPixelRatio() > 1.001f || CDisplaySettings::Get().GetPixelRatio() < 0.999f) != (m_pixelRatio > 1.001f || m_pixelRatio < 0.999f); bool nonLinStretchChanged = false; - if (m_nonLinStretchGui != CDisplaySettings::GetInstance().IsNonLinearStretched() || pixelRatioChanged) + if (m_nonLinStretchGui != CDisplaySettings::Get().IsNonLinearStretched() || pixelRatioChanged) { - m_nonLinStretchGui = CDisplaySettings::GetInstance().IsNonLinearStretched(); - m_pixelRatio = CDisplaySettings::GetInstance().GetPixelRatio(); + m_nonLinStretchGui = CDisplaySettings::Get().IsNonLinearStretched(); + m_pixelRatio = CDisplaySettings::Get().GetPixelRatio(); m_reloadShaders = 1; nonLinStretchChanged = true; @@ -789,7 +789,7 @@ } } - if (m_scalingMethodGui == CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ScalingMethod && !nonLinStretchChanged) + if (m_scalingMethodGui == CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod && !nonLinStretchChanged) return; //recompile YUV shader when non-linear stretch is turned on/off @@ -797,7 +797,7 @@ if (m_nonLinStretch || nonLinStretchChanged) m_reloadShaders = 1; - m_scalingMethodGui = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ScalingMethod; + m_scalingMethodGui = CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod; m_scalingMethod = m_scalingMethodGui; if(!Supports(m_scalingMethod)) @@ -925,7 +925,7 @@ } else { - int requestedMethod = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_RENDERMETHOD); + int requestedMethod = CSettings::Get().GetInt("videoplayer.rendermethod"); CLog::Log(LOGDEBUG, "GL: Requested render method: %d", requestedMethod); if (m_pYUVShader) @@ -1251,8 +1251,8 @@ glActiveTextureARB(GL_TEXTURE0); VerifyGLState(); - m_pYUVShader->SetBlack(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); - m_pYUVShader->SetContrast(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast * 0.02f); + m_pYUVShader->SetBlack(CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + m_pYUVShader->SetContrast(CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); m_pYUVShader->SetWidth(planes[0].texwidth); m_pYUVShader->SetHeight(planes[0].texheight); @@ -1261,7 +1261,7 @@ if (g_application.m_pPlayer->IsInMenu()) m_pYUVShader->SetNonLinStretch(1.0); else - m_pYUVShader->SetNonLinStretch(pow(CDisplaySettings::GetInstance().GetPixelRatio(), g_advancedSettings.m_videoNonLinStretchRatio)); + m_pYUVShader->SetNonLinStretch(pow(CDisplaySettings::Get().GetPixelRatio(), g_advancedSettings.m_videoNonLinStretchRatio)); if (field == FIELD_TOP) m_pYUVShader->SetField(1); @@ -1370,8 +1370,8 @@ m_fbo.fbo.BeginRender(); VerifyGLState(); - m_pYUVShader->SetBlack(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); - m_pYUVShader->SetContrast(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast * 0.02f); + m_pYUVShader->SetBlack(CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + m_pYUVShader->SetContrast(CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); m_pYUVShader->SetWidth(planes[0].texwidth); m_pYUVShader->SetHeight(planes[0].texheight); m_pYUVShader->SetNonLinStretch(1.0); @@ -1485,7 +1485,7 @@ if (g_application.m_pPlayer->IsInMenu()) m_pVideoFilterShader->SetNonLinStretch(1.0); else - m_pVideoFilterShader->SetNonLinStretch(pow(CDisplaySettings::GetInstance().GetPixelRatio(), g_advancedSettings.m_videoNonLinStretchRatio)); + m_pVideoFilterShader->SetNonLinStretch(pow(CDisplaySettings::Get().GetPixelRatio(), g_advancedSettings.m_videoNonLinStretchRatio)); m_pVideoFilterShader->Enable(); } @@ -1589,7 +1589,7 @@ if (g_application.m_pPlayer->IsInMenu()) m_pVideoFilterShader->SetNonLinStretch(1.0); else - m_pVideoFilterShader->SetNonLinStretch(pow(CDisplaySettings::GetInstance().GetPixelRatio(), g_advancedSettings.m_videoNonLinStretchRatio)); + m_pVideoFilterShader->SetNonLinStretch(pow(CDisplaySettings::Get().GetPixelRatio(), g_advancedSettings.m_videoNonLinStretchRatio)); m_pVideoFilterShader->Enable(); } @@ -3149,11 +3149,11 @@ } if (imaging==1 && - ((CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness!=50) || - (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast!=50))) + ((CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness!=50) || + (CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast!=50))) { - GLfloat brightness = ((GLfloat)CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness - 50.0f)/100.0f; - GLfloat contrast = ((GLfloat)CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast)/50.0f; + GLfloat brightness = ((GLfloat)CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness - 50.0f)/100.0f;; + GLfloat contrast = ((GLfloat)CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast)/50.0f; glPixelTransferf(GL_RED_SCALE , contrast); glPixelTransferf(GL_GREEN_SCALE, contrast); @@ -3240,7 +3240,7 @@ { if(feature == RENDERFEATURE_BRIGHTNESS) { - if ((m_renderMethod & RENDER_VDPAU) && !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_LIMITEDRANGE)) + if ((m_renderMethod & RENDER_VDPAU) && !CSettings::Get().GetBool("videoscreen.limitedrange")) return true; if (m_renderMethod & RENDER_VAAPI) @@ -3253,7 +3253,7 @@ if(feature == RENDERFEATURE_CONTRAST) { - if ((m_renderMethod & RENDER_VDPAU) && !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_LIMITEDRANGE)) + if ((m_renderMethod & RENDER_VDPAU) && !CSettings::Get().GetBool("videoscreen.limitedrange")) return true; if (m_renderMethod & RENDER_VAAPI) @@ -3346,7 +3346,8 @@ } #ifdef TARGET_DARWIN_IOS - // iOS does not have the ponies for YADIF + // iOS has not the power for YADIF - TODO evaluate if its + // enough to disable it for TARGET_DARWIN_IOS_ATV2 if(method == VS_INTERLACEMETHOD_DEINTERLACE) return false; #endif @@ -3388,7 +3389,7 @@ // if scaling is below level, avoid hq scaling float scaleX = fabs(((float)m_sourceWidth - m_destRect.Width())/m_sourceWidth)*100; float scaleY = fabs(((float)m_sourceHeight - m_destRect.Height())/m_sourceHeight)*100; - int minScale = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_HQSCALERS); + int minScale = CSettings::Get().GetInt("videoplayer.hqscalers"); if (scaleX < minScale && scaleY < minScale) return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -230,7 +230,7 @@ // Calculate the input frame aspect ratio. CalculateFrameAspectRatio(d_width, d_height); ChooseBestResolution(fps); - SetViewMode(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode); + SetViewMode(CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); ManageDisplay(); m_bConfigured = true; @@ -594,59 +594,6 @@ return; } -#ifdef TARGET_ANDROID - else if (m_renderMethod & RENDER_MEDIACODECSURFACE) - { - CDVDMediaCodecInfo *mci = m_buffers[m_iYV12RenderBuffer].mediacodec; - if (mci) - { - // this hack is needed to get the 2D mode of a 3D movie going - RENDER_STEREO_MODE stereo_mode = g_graphicsContext.GetStereoMode(); - if (stereo_mode) - g_graphicsContext.SetStereoView(RENDER_STEREO_VIEW_LEFT); - - ManageDisplay(); - - if (stereo_mode) - g_graphicsContext.SetStereoView(RENDER_STEREO_VIEW_OFF); - - CRect dstRect(m_destRect); - CRect srcRect(m_sourceRect); - switch (stereo_mode) - { - case RENDER_STEREO_MODE_SPLIT_HORIZONTAL: - dstRect.y2 *= 2.0; - srcRect.y2 *= 2.0; - break; - - case RENDER_STEREO_MODE_SPLIT_VERTICAL: - dstRect.x2 *= 2.0; - srcRect.x2 *= 2.0; - break; - - default: - break; - } - - // Handle orientation - switch (m_renderOrientation) - { - case 90: - case 270: - { - int diff = (int) ((dstRect.Height() - dstRect.Width()) / 2); - dstRect = CRect(dstRect.x1 - diff, dstRect.y1, dstRect.x2 + diff, dstRect.y2); - break; - } - - default: - break; - } - - mci->RenderUpdate(srcRect, dstRect); - } - } -#endif #ifdef HAS_IMXVPU else if (m_renderMethod & RENDER_IMXMAP) { @@ -753,7 +700,7 @@ m_bConfigured = false; m_bValidated = false; UnInit(); - m_resolution = CDisplaySettings::GetInstance().GetCurrentResolution(); + m_resolution = CDisplaySettings::Get().GetCurrentResolution(); if ( m_resolution == RES_WINDOW ) m_resolution = RES_DESKTOP; @@ -775,7 +722,6 @@ #endif #if defined(TARGET_ANDROID) m_formats.push_back(RENDER_FMT_MEDIACODEC); - m_formats.push_back(RENDER_FMT_MEDIACODECSURFACE); #endif #ifdef HAS_IMXVPU m_formats.push_back(RENDER_FMT_IMXMAP); @@ -789,9 +735,9 @@ void CLinuxRendererGLES::UpdateVideoFilter() { - if (m_scalingMethodGui == CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ScalingMethod) + if (m_scalingMethodGui == CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod) return; - m_scalingMethodGui = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ScalingMethod; + m_scalingMethodGui = CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod; m_scalingMethod = m_scalingMethodGui; if(!Supports(m_scalingMethod)) @@ -855,7 +801,7 @@ #ifdef TARGET_DARWIN_IOS float ios_version = CDarwinUtils::GetIOSVersion(); #endif - int requestedMethod = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_RENDERMETHOD); + int requestedMethod = CSettings::Get().GetInt("videoplayer.rendermethod"); CLog::Log(LOGDEBUG, "GL: Requested render method: %d", requestedMethod); ReleaseShaders(); @@ -882,12 +828,6 @@ m_renderMethod = RENDER_MEDIACODEC; break; } - else if (m_format == RENDER_FMT_MEDIACODECSURFACE) - { - CLog::Log(LOGNOTICE, "GL: Using MediaCodec (Surface) render method"); - m_renderMethod = RENDER_MEDIACODECSURFACE; - break; - } else if (m_format == RENDER_FMT_IMXMAP) { CLog::Log(LOGNOTICE, "GL: Using IMXMAP render method"); @@ -962,7 +902,7 @@ m_textureCreate = &CLinuxRendererGLES::CreateCVRefTexture; m_textureDelete = &CLinuxRendererGLES::DeleteCVRefTexture; } - else if (m_format == RENDER_FMT_BYPASS || m_format == RENDER_FMT_MEDIACODECSURFACE) + else if (m_format == RENDER_FMT_BYPASS) { m_textureUpload = &CLinuxRendererGLES::UploadBYPASSTexture; m_textureCreate = &CLinuxRendererGLES::CreateBYPASSTexture; @@ -1103,8 +1043,6 @@ SAFE_RELEASE(buf.mediacodec); } } - if ( m_renderMethod & RENDER_MEDIACODECSURFACE ) - SAFE_RELEASE(buf.mediacodec); #endif #ifdef HAS_IMXVPU if (m_renderMethod & RENDER_IMXMAP) @@ -1115,7 +1053,7 @@ void CLinuxRendererGLES::Render(DWORD flags, int index) { // If rendered directly by the hardware - if (m_renderMethod & RENDER_BYPASS || m_renderMethod & RENDER_MEDIACODECSURFACE) + if (m_renderMethod & RENDER_BYPASS) return; // obtain current field, if interlaced @@ -1222,8 +1160,8 @@ else pYUVShader = m_pYUVProgShader; - pYUVShader->SetBlack(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); - pYUVShader->SetContrast(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast * 0.02f); + pYUVShader->SetBlack(CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + pYUVShader->SetContrast(CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); pYUVShader->SetWidth(im.width); pYUVShader->SetHeight(im.height); if (field == FIELD_TOP) @@ -1342,8 +1280,8 @@ m_fbo.BeginRender(); VerifyGLState(); - m_pYUVProgShader->SetBlack(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); - m_pYUVProgShader->SetContrast(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast * 0.02f); + m_pYUVProgShader->SetBlack(CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + m_pYUVProgShader->SetContrast(CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); m_pYUVProgShader->SetWidth(im.width); m_pYUVProgShader->SetHeight(im.height); if (field == FIELD_TOP) @@ -1492,9 +1430,9 @@ g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA); GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); - glUniform1f(contrastLoc, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast * 0.02f); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); - glUniform1f(brightnessLoc, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip GLfloat ver[4][4]; @@ -1562,9 +1500,9 @@ g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA); GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); - glUniform1f(contrastLoc, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast * 0.02f); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); - glUniform1f(brightnessLoc, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip GLfloat ver[4][4]; @@ -1653,9 +1591,9 @@ g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA); GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); - glUniform1f(contrastLoc, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast * 0.02f); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); - glUniform1f(brightnessLoc, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip GLfloat ver[4][4]; @@ -1748,9 +1686,9 @@ g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA_OES); GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); - glUniform1f(contrastLoc, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast * 0.02f); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); - glUniform1f(brightnessLoc, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); glUniformMatrix4fv(g_Windowing.GUIShaderGetCoord0Matrix(), 1, GL_FALSE, m_textureMatrix); @@ -1838,9 +1776,9 @@ g_Windowing.EnableGUIShader(SM_TEXTURE_RGBA); GLint contrastLoc = g_Windowing.GUIShaderGetContrast(); - glUniform1f(contrastLoc, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast * 0.02f); + glUniform1f(contrastLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast * 0.02f); GLint brightnessLoc = g_Windowing.GUIShaderGetBrightness(); - glUniform1f(brightnessLoc, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); + glUniform1f(brightnessLoc, CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * 0.01f - 0.5f); GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip GLfloat ver[4][4]; @@ -1898,7 +1836,7 @@ return false; // If rendered directly by the hardware - if (m_renderMethod & RENDER_BYPASS || m_renderMethod & RENDER_MEDIACODECSURFACE) + if (m_renderMethod & RENDER_BYPASS) { capture->BeginRender(); capture->EndRender(); @@ -2900,14 +2838,11 @@ return itr != m_renderFeatures.end(); } - if (!(m_renderMethod & RENDER_MEDIACODECSURFACE)) - { - if(feature == RENDERFEATURE_BRIGHTNESS) - return true; + if(feature == RENDERFEATURE_BRIGHTNESS) + return true; - if(feature == RENDERFEATURE_CONTRAST) - return true; - } + if(feature == RENDERFEATURE_CONTRAST) + return true; if(feature == RENDERFEATURE_GAMMA) return false; @@ -2991,9 +2926,6 @@ return false; } - if(m_renderMethod & RENDER_MEDIACODECSURFACE) - return false; - if(m_renderMethod & RENDER_CVREF) return false; @@ -3035,9 +2967,6 @@ if(m_renderMethod & RENDER_IMXMAP) return false; - if (m_renderMethod & RENDER_MEDIACODECSURFACE) - return false; - if(method == VS_SCALINGMETHOD_NEAREST || method == VS_SCALINGMETHOD_LINEAR) return true; @@ -3065,9 +2994,6 @@ if(m_renderMethod & RENDER_MEDIACODEC) return VS_INTERLACEMETHOD_RENDER_BOB_INVERTED; - if(m_renderMethod & RENDER_MEDIACODECSURFACE) - return VS_INTERLACEMETHOD_NONE; - if(m_renderMethod & RENDER_CVREF) return VS_INTERLACEMETHOD_NONE; @@ -3089,8 +3015,7 @@ if(m_format == RENDER_FMT_OMXEGL || m_format == RENDER_FMT_CVBREF || m_format == RENDER_FMT_EGLIMG || - m_format == RENDER_FMT_MEDIACODEC || - m_format == RENDER_FMT_MEDIACODECSURFACE) + m_format == RENDER_FMT_MEDIACODEC) info.optimal_buffer_size = 2; else if(m_format == RENDER_FMT_IMXMAP) { @@ -3189,7 +3114,7 @@ bool CLinuxRendererGLES::IsGuiLayer() { - if (m_format == RENDER_FMT_BYPASS || m_format == RENDER_FMT_IMXMAP || m_format == RENDER_FMT_MEDIACODECSURFACE) + if (m_format == RENDER_FMT_BYPASS || m_format == RENDER_FMT_IMXMAP) return false; else return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/LinuxRendererGLES.h kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/LinuxRendererGLES.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/LinuxRendererGLES.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/LinuxRendererGLES.h 2015-10-19 08:38:33.000000000 +0000 @@ -93,8 +93,7 @@ RENDER_BYPASS = 0x100, RENDER_EGLIMG = 0x200, RENDER_MEDIACODEC = 0x400, - RENDER_MEDIACODECSURFACE = 0x800, - RENDER_IMXMAP = 0x1000 + RENDER_IMXMAP = 0x800 }; enum RenderQuality diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/MMALRenderer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/MMALRenderer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/MMALRenderer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/MMALRenderer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,7 +19,6 @@ */ #include "Util.h" -#include "threads/Atomics.h" #include "MMALRenderer.h" #include "cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h" #include "filesystem/File.h" @@ -40,44 +39,6 @@ #define MMAL_DEBUG_VERBOSE #endif - -CYUVVideoBuffer::CYUVVideoBuffer() -{ - m_refs = 0; - mmal_buffer = 0; -} - -CYUVVideoBuffer::~CYUVVideoBuffer() -{ - m_refs = 0; - mmal_buffer = 0; -} - -CYUVVideoBuffer *CYUVVideoBuffer::Acquire() -{ - long count = AtomicIncrement(&m_refs); -#ifdef MMAL_DEBUG_VERBOSE - CLog::Log(LOGDEBUG, "%s::%s omvb:%p mmal:%p ref:%ld", CLASSNAME, __func__, this, mmal_buffer, count); -#endif - (void)count; - return this; -} - -long CYUVVideoBuffer::Release() -{ - long count = AtomicDecrement(&m_refs); -#ifdef MMAL_DEBUG_VERBOSE - CLog::Log(LOGDEBUG, "%s::%s omvb:%p mmal:%p ref:%ld", CLASSNAME, __func__, this, mmal_buffer, count); -#endif - if (count == 0) - { - mmal_buffer_header_release(mmal_buffer); - delete this; - } - else assert(count > 0); - return count; -} - CRenderInfo CMMALRenderer::GetRenderInfo() { CSingleLock lock(m_sharedSection); @@ -106,26 +67,21 @@ void CMMALRenderer::vout_input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { + #if defined(MMAL_DEBUG_VERBOSE) + CMMALVideoBuffer *omvb = (CMMALVideoBuffer *)buffer->user_data; + CLog::Log(LOGDEBUG, "%s::%s port:%p buffer %p (%p), len %d cmd:%x f:%x", CLASSNAME, __func__, port, buffer, omvb, buffer->length, buffer->cmd, buffer->flags); + #endif + assert(!(buffer->flags & MMAL_BUFFER_HEADER_FLAG_TRANSMISSION_FAILED)); buffer->flags &= ~MMAL_BUFFER_HEADER_FLAG_USER2; if (m_format == RENDER_FMT_MMAL) { CMMALVideoBuffer *omvb = (CMMALVideoBuffer *)buffer->user_data; - assert(buffer == omvb->mmal_buffer); -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s port:%p omvb:%p mmal:%p len:%d cmd:%x flags:%x flight:%d", CLASSNAME, __func__, port, omvb, omvb->mmal_buffer, buffer->length, buffer->cmd, buffer->flags, m_inflight); -#endif omvb->Release(); } else if (m_format == RENDER_FMT_YUV420P) { - CYUVVideoBuffer *omvb = (CYUVVideoBuffer *)buffer->user_data; - assert(buffer == omvb->mmal_buffer); -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s port:%p omvb:%p mmal:%p len:%d cmd:%x flags:%x flight:%d", CLASSNAME, __func__, port, omvb, omvb->mmal_buffer, buffer->length, buffer->cmd, buffer->flags, m_inflight); -#endif - m_inflight--; - omvb->Release(); + mmal_buffer_header_release(buffer); } else assert(0); } @@ -251,7 +207,6 @@ m_bConfigured = false; m_bMMALConfigured = false; m_iYV12RenderBuffer = 0; - m_inflight = 0; } CMMALRenderer::~CMMALRenderer() @@ -286,11 +241,6 @@ m_iFlags = flags; CLog::Log(LOGDEBUG, "%s::%s - %dx%d->%dx%d@%.2f flags:%x format:%d ext:%x orient:%d", CLASSNAME, __func__, width, height, d_width, d_height, fps, flags, format, extended_format, orientation); - if (format != RENDER_FMT_YUV420P && format != RENDER_FMT_BYPASS && format != RENDER_FMT_MMAL) - { - CLog::Log(LOGERROR, "%s::%s - format:%d not supported", CLASSNAME, __func__, format); - return false; - } m_RenderUpdateCallBackFn = NULL; m_RenderUpdateCallBackCtx = NULL; @@ -300,7 +250,7 @@ ChooseBestResolution(fps); m_destWidth = g_graphicsContext.GetResInfo(m_resolution).iWidth; m_destHeight = g_graphicsContext.GetResInfo(m_resolution).iHeight; - SetViewMode(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode); + SetViewMode(CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); ManageDisplay(); m_bMMALConfigured = init_vout(format); @@ -311,19 +261,16 @@ int CMMALRenderer::GetImage(YV12Image *image, int source, bool readonly) { - if (!image || source < 0) - { #if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - invalid: image:%p source:%d ro:%d flight:%d", CLASSNAME, __func__, image, source, readonly, m_inflight); + CLog::Log(LOGDEBUG, "%s::%s - %p %d %d", CLASSNAME, __func__, image, source, readonly); #endif + if (!image) return -1; + + if( source < 0) return -1; - } if (m_format == RENDER_FMT_MMAL) { -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - MMAL: image:%p source:%d ro:%d flight:%d", CLASSNAME, __func__, image, source, readonly, m_inflight); -#endif } else if (m_format == RENDER_FMT_YUV420P) { @@ -337,7 +284,6 @@ return -1; } - m_inflight++; mmal_buffer_header_reset(buffer); buffer->length = 3 * pitch * aligned_height >> 1; @@ -360,16 +306,10 @@ image->plane[1] = image->plane[0] + image->planesize[0]; image->plane[2] = image->plane[1] + image->planesize[1]; + CLog::Log(LOGDEBUG, "%s::%s - %p %d", CLASSNAME, __func__, buffer, source); YUVBUFFER &buf = m_buffers[source]; memset(&buf, 0, sizeof buf); - buf.YUVBuffer = new CYUVVideoBuffer; - if (!buf.YUVBuffer) - return -1; - buf.YUVBuffer->mmal_buffer = buffer; -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - YUV: image:%p source:%d ro:%d omvb:%p mmal:%p flight:%d", CLASSNAME, __func__, image, source, readonly, buf.YUVBuffer, buffer, m_inflight); -#endif - buf.YUVBuffer->Acquire(); + buf.mmal_buffer = buffer; } else assert(0); @@ -379,44 +319,21 @@ void CMMALRenderer::ReleaseBuffer(int idx) { CSingleLock lock(m_sharedSection); - if (!m_bMMALConfigured) - { -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - not configured: source:%d", CLASSNAME, __func__, idx); -#endif + if (!m_bMMALConfigured || m_format == RENDER_FMT_BYPASS) return; - } - if (m_format == RENDER_FMT_BYPASS) - { -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - bypass: source:%d", CLASSNAME, __func__, idx); -#endif - return; - } - YUVBUFFER *buffer = &m_buffers[idx]; - if (m_format == RENDER_FMT_MMAL) - { - CMMALVideoBuffer *omvb = buffer->MMALBuffer; #if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - MMAL: source:%d omvb:%p mmal:%p", CLASSNAME, __func__, idx, omvb, omvb ? omvb->mmal_buffer:NULL); + CLog::Log(LOGDEBUG, "%s::%s - %d (%p)", CLASSNAME, __func__, idx, m_buffers[idx].MMALBuffer); #endif - SAFE_RELEASE(buffer->MMALBuffer); - } - else if (m_format == RENDER_FMT_YUV420P) - { - CYUVVideoBuffer *omvb = buffer->YUVBuffer; -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - YUV: source:%d omvb:%p mmal:%p flight:%d", CLASSNAME, __func__, idx, omvb, omvb ? omvb->mmal_buffer:NULL, m_inflight); -#endif - if (omvb && omvb->mmal_buffer) - SAFE_RELEASE(buffer->YUVBuffer); - } - else assert(0); + YUVBUFFER &buf = m_buffers[idx]; + SAFE_RELEASE(buf.MMALBuffer); } void CMMALRenderer::ReleaseImage(int source, bool preserve) { +#if defined(MMAL_DEBUG_VERBOSE) + CLog::Log(LOGDEBUG, "%s::%s - %d %d (%p)", CLASSNAME, __func__, source, preserve, m_buffers[source].MMALBuffer); +#endif } void CMMALRenderer::Reset() @@ -443,14 +360,11 @@ { CSingleLock lock(m_sharedSection); int source = m_iYV12RenderBuffer; - - if (!m_bConfigured) - { #if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - not configured: clear:%d flags:%x alpha:%d source:%d", CLASSNAME, __func__, clear, flags, alpha, source); + CLog::Log(LOGDEBUG, "%s::%s - %d %x %d %d", CLASSNAME, __func__, clear, flags, alpha, source); #endif - return; - } + + if (!m_bConfigured) return; if (g_graphicsContext.GetStereoMode()) g_graphicsContext.SetStereoView(RENDER_STEREO_VIEW_LEFT); @@ -464,22 +378,18 @@ (*m_RenderUpdateCallBackFn)(m_RenderUpdateCallBackCtx, m_sourceRect, m_destRect); if (m_format == RENDER_FMT_BYPASS) - { -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - bypass: clear:%d flags:%x alpha:%d source:%d", CLASSNAME, __func__, clear, flags, alpha, source); -#endif return; - } + SetVideoRect(m_sourceRect, m_destRect); YUVBUFFER *buffer = &m_buffers[source]; if (m_format == RENDER_FMT_MMAL) { CMMALVideoBuffer *omvb = buffer->MMALBuffer; - if (omvb && omvb->mmal_buffer) + if (omvb) { #if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - MMAL: clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p mflags:%x", CLASSNAME, __func__, clear, flags, alpha, source, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags); + CLog::Log(LOGDEBUG, "%s::%s %p (%p) f:%x", CLASSNAME, __func__, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags); #endif // we only want to upload frames once if (omvb->mmal_buffer->flags & MMAL_BUFFER_HEADER_FLAG_USER1) @@ -493,23 +403,18 @@ } else if (m_format == RENDER_FMT_YUV420P) { - CYUVVideoBuffer *omvb = buffer->YUVBuffer; - if (omvb && omvb->mmal_buffer) + if (buffer->mmal_buffer) { -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - YUV: clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p mflags:%x", CLASSNAME, __func__, clear, flags, alpha, source, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags); -#endif + CLog::Log(LOGDEBUG, "%s::%s - %p %d f:%x", CLASSNAME, __func__, buffer->mmal_buffer, source, buffer->mmal_buffer->flags); // we only want to upload frames once - if (omvb->mmal_buffer->flags & MMAL_BUFFER_HEADER_FLAG_USER1) + if (buffer->mmal_buffer->flags & MMAL_BUFFER_HEADER_FLAG_USER1) return; // sanity check it is not on display - omvb->Acquire(); - omvb->mmal_buffer->flags |= MMAL_BUFFER_HEADER_FLAG_USER1 | MMAL_BUFFER_HEADER_FLAG_USER2; - omvb->mmal_buffer->user_data = omvb; - mmal_port_send_buffer(m_vout_input, omvb->mmal_buffer); + buffer->mmal_buffer->flags |= MMAL_BUFFER_HEADER_FLAG_USER1 | MMAL_BUFFER_HEADER_FLAG_USER2; + mmal_port_send_buffer(m_vout_input, buffer->mmal_buffer); } else - CLog::Log(LOGDEBUG, "%s::%s - No buffer to update: clear:%d flags:%x alpha:%d source:%d", CLASSNAME, __func__, clear, flags, alpha, source); + CLog::Log(LOGDEBUG, "%s::%s - No buffer to update", CLASSNAME, __func__); } else assert(0); } @@ -518,15 +423,10 @@ { CSingleLock lock(m_sharedSection); if (!m_bConfigured || m_format == RENDER_FMT_BYPASS) - { -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - not configured: source:%d", CLASSNAME, __func__, source); -#endif return; - } #if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - source:%d", CLASSNAME, __func__, source); + CLog::Log(LOGDEBUG, "%s::%s - %d", CLASSNAME, __func__, source); #endif m_iYV12RenderBuffer = source; @@ -540,7 +440,7 @@ m_iFlags = 0; - m_resolution = CDisplaySettings::GetInstance().GetCurrentResolution(); + m_resolution = CDisplaySettings::Get().GetCurrentResolution(); if ( m_resolution == RES_WINDOW ) m_resolution = RES_DESKTOP; @@ -560,9 +460,6 @@ void CMMALRenderer::ReleaseBuffers() { -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s", CLASSNAME, __func__); -#endif for (int i=0; i::iterator it = render.begin(); it != render.end(); ++it) { COverlay* o = *it; @@ -335,7 +335,7 @@ int targetHeight = MathUtils::round_int(target.Height()); int useMargin; - int subalign = CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_ALIGN); + int subalign = CSettings::Get().GetInt("subtitles.align"); if(subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE || subalign == SUBTITLE_ALIGN_TOP_OUTSIDE ||(subalign == SUBTITLE_ALIGN_MANUAL && g_advancedSettings.m_videoAssFixedWorks)) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/OverlayRendererDX.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/OverlayRendererDX.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/OverlayRendererDX.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/OverlayRendererDX.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,14 +18,13 @@ * */ -#include "Application.h" -#include "cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayImage.h" -#include "cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySpu.h" -#include "cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySSA.h" -#include "guilib/D3DResource.h" #include "OverlayRenderer.h" #include "OverlayRendererUtil.h" #include "OverlayRendererDX.h" +#include "cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayImage.h" +#include "cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySpu.h" +#include "cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySSA.h" +#include "Application.h" #include "windowing/WindowingFactory.h" #include "utils/log.h" @@ -37,34 +36,128 @@ #ifdef HAS_DX using namespace OVERLAY; -using namespace DirectX; #define USE_PREMULTIPLIED_ALPHA 1 #define ALPHA_CHANNEL_OFFSET 3 static bool LoadTexture(int width, int height, int stride - , DXGI_FORMAT format + , D3DFORMAT format , const void* pixels , float* u, float* v , CD3DTexture* texture) { - if (!texture->Create(width, height, 1, D3D11_USAGE_IMMUTABLE, format, pixels, stride)) + + if (!texture->Create(width, height, 1, g_Windowing.DefaultD3DUsage(), format, g_Windowing.DefaultD3DPool())) { - CLog::Log(LOGERROR, "%s - failed to allocate texture.", __FUNCTION__); + CLog::Log(LOGERROR, "LoadTexture - failed to allocate texture"); return false; } - D3D11_TEXTURE2D_DESC desc = {}; - if (!texture->GetDesc(&desc)) + int bpp; + if (format == D3DFMT_A8) + bpp = 1; + else if(format == D3DFMT_A8R8G8B8) + bpp = 4; + else + ASSERT(0); + + D3DSURFACE_DESC desc; + if(!texture->GetLevelDesc(0, &desc)) { - CLog::Log(LOGERROR, "%s - failed to get texture description.", __FUNCTION__); + CLog::Log(LOGERROR, "LoadTexture - failed to get level description"); texture->Release(); return false; } - ASSERT(format == desc.Format || (format == DXGI_FORMAT_R8_UNORM && desc.Format == DXGI_FORMAT_B8G8R8A8_UNORM)); + ASSERT(format == desc.Format || (format == D3DFMT_A8 && desc.Format == D3DFMT_A8R8G8B8)); + + // Some old hardware doesn't have D3DFMT_A8 and returns D3DFMT_A8R8G8B8 textures instead + int destbpp; + if (desc.Format == D3DFMT_A8) + destbpp = 1; + else if(desc.Format == D3DFMT_A8R8G8B8) + destbpp = 4; + else + ASSERT(0); + + *u = (float)width / desc.Width; + *v = (float)height / desc.Height; + + D3DLOCKED_RECT lr; + if (!texture->LockRect(0, &lr, NULL, D3DLOCK_DISCARD)) + { + CLog::Log(LOGERROR, __FUNCTION__" - failed to lock texture"); + texture->Release(); + return false; + } + + uint8_t* src = (uint8_t*)pixels; + uint8_t* dst = (uint8_t*)lr.pBits; + + if (bpp == destbpp) + { + for (int y = 0; y < height; y++) + { + memcpy(dst, src, bpp * width); + src += stride; + dst += lr.Pitch; + } + } + else if (bpp == 1 && destbpp == 4) + { + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + dst[x*destbpp + ALPHA_CHANNEL_OFFSET] = src[x]; + src += stride; + dst += lr.Pitch; + } + } + + if((unsigned)width < desc.Width) + { + uint8_t* src = (uint8_t*)pixels + bpp *(width - 1); + uint8_t* dst = (uint8_t*)lr.pBits + bpp * width; + + if (bpp == destbpp) + { + for (int y = 0; y < height; y++) + { + memcpy(dst, src, bpp); + src += stride; + dst += lr.Pitch; + } + } + else if (bpp == 1 && destbpp == 4) + { + for (int y = 0; y < height; y++) + { + dst[ALPHA_CHANNEL_OFFSET] = src[0]; + src += stride; + dst += lr.Pitch; + } + } + } + + if((unsigned)height < desc.Height) + { + uint8_t* src = (uint8_t*)pixels + stride * (height - 1); + uint8_t* dst = (uint8_t*)lr.pBits + lr.Pitch * height; + + if (bpp == destbpp) + memcpy(dst, src, bpp * width); + else if (bpp == 1 && destbpp == 4) + { + for (int x = 0; x < width; x++) + dst[x*destbpp + ALPHA_CHANNEL_OFFSET] = src[x]; + } + } - *u = float(width) / desc.Width; - *v = float(height) / desc.Height; + if (!texture->UnlockRect(0)) + { + CLog::Log(LOGERROR, __FUNCTION__" - failed to unlock texture"); + texture->Release(); + return false; + } return true; } @@ -78,6 +171,7 @@ m_x = 0.0f; m_y = 0.0f; m_count = 0; + m_fvf = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1; SQuads quads; if(!convert_quad(images, quads)) @@ -87,7 +181,7 @@ if(!LoadTexture(quads.size_x , quads.size_y , quads.size_x - , DXGI_FORMAT_R8_UNORM + , D3DFMT_A8 , quads.data , &u, &v , &m_texture)) @@ -95,46 +189,62 @@ return; } - Vertex* vt = new Vertex[6 * quads.count], *vt_orig = vt; + if (!m_vertex.Create(sizeof(VERTEX) * 6 * quads.count, D3DUSAGE_WRITEONLY, m_fvf, g_Windowing.DefaultD3DPool())) + { + CLog::Log(LOGERROR, "%s - failed to create vertex buffer", __FUNCTION__); + m_texture.Release(); + return; + } + + VERTEX* vt = NULL; SQuad* vs = quads.quad; - float scale_u = u / quads.size_x; - float scale_v = v / quads.size_y; + if (!m_vertex.Lock(0, 0, (void**)&vt, 0)) + { + CLog::Log(LOGERROR, "%s - failed to lock vertex buffer", __FUNCTION__); + m_texture.Release(); + return; + } + + float scale_u = u / quads.size_x; + float scale_v = v / quads.size_y; float scale_x = 1.0f / width; float scale_y = 1.0f / height; - for (int i = 0; i < quads.count; i++) + for(int i = 0; i < quads.count; i++) { - for (int s = 0; s < 6; s++) + for(int s = 0; s < 6; s++) { - CD3DHelper::XMStoreColor(&vt[s].color, vs->a, vs->r, vs->g, vs->b); - vt[s].pos = XMFLOAT3(scale_x, scale_y, 0.0f); - vt[s].texCoord = XMFLOAT2(scale_u, scale_v); - vt[s].texCoord2 = XMFLOAT2(0.0f, 0.0f); + vt[s].c = D3DCOLOR_ARGB(vs->a, vs->r, vs->g, vs->b); + vt[s].z = 0.0f; + vt[s].x = scale_x; + vt[s].y = scale_y; + vt[s].u = scale_u; + vt[s].v = scale_v; } - vt[0].pos.x *= vs->x; - vt[0].texCoord.x *= vs->u; - vt[0].pos.y *= vs->y; - vt[0].texCoord.y *= vs->v; - - vt[1].pos.x *= vs->x + vs->w; - vt[1].texCoord.x *= vs->u + vs->w; - vt[1].pos.y *= vs->y; - vt[1].texCoord.y *= vs->v; - - vt[2].pos.x *= vs->x; - vt[2].texCoord.x *= vs->u; - vt[2].pos.y *= vs->y + vs->h; - vt[2].texCoord.y *= vs->v + vs->h; + vt[0].x *= vs->x; + vt[0].u *= vs->u; + vt[0].y *= vs->y; + vt[0].v *= vs->v; + + vt[1].x *= vs->x + vs->w; + vt[1].u *= vs->u + vs->w; + vt[1].y *= vs->y; + vt[1].v *= vs->v; + + vt[2].x *= vs->x; + vt[2].u *= vs->u; + vt[2].y *= vs->y + vs->h; + vt[2].v *= vs->v + vs->h; vt[3] = vt[1]; - vt[4].pos.x *= vs->x + vs->w; - vt[4].texCoord.x *= vs->u + vs->w; - vt[4].pos.y *= vs->y + vs->h; - vt[4].texCoord.y *= vs->v + vs->h; + vt[4].x *= vs->x + vs->w; + vt[4].u *= vs->u + vs->w; + vt[4].y *= vs->y + vs->h; + vt[4].v *= vs->v + vs->h; vt[5] = vt[2]; @@ -142,16 +252,8 @@ vt += 6; } - vt = vt_orig; - m_count = quads.count; - - if (!m_vertex.Create(D3D11_BIND_VERTEX_BUFFER, 6 * quads.count, sizeof(Vertex), DXGI_FORMAT_UNKNOWN, D3D11_USAGE_IMMUTABLE, vt)) - { - CLog::Log(LOGERROR, "%s - failed to create vertex buffer", __FUNCTION__); - m_texture.Release(); - } - - delete[] vt; + m_vertex.Unlock(); + m_count = quads.count; } COverlayQuadsDX::~COverlayQuadsDX() @@ -163,34 +265,60 @@ if (m_count == 0) return; - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); + D3DXMATRIX orig; + LPDIRECT3DDEVICE9 device = g_Windowing.Get3DDevice(); + device->GetTransform(D3DTS_WORLD, &orig); + + D3DXMATRIX world = orig; + D3DXMATRIX trans, scale; + + D3DXMatrixTranslation(&trans, state.x - 0.5f + , state.y - 0.5f + , 0.0f); + + D3DXMatrixScaling (&scale, state.width + , state.height + , 1.0f); + + D3DXMatrixMultiply(&world, &world, &scale); + D3DXMatrixMultiply(&world, &world, &trans); + + device->SetTransform(D3DTS_WORLD, &world); + + device->SetTexture( 0, m_texture.Get() ); + device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + device->SetSamplerState(0, D3DSAMP_ADDRESSU , D3DTADDRESS_CLAMP); + device->SetSamplerState(0, D3DSAMP_ADDRESSV , D3DTADDRESS_CLAMP); + + device->SetTextureStageState(0, D3DTSS_COLOROP , D3DTOP_SELECTARG1 ); + device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE ); + device->SetTextureStageState(0, D3DTSS_ALPHAOP , D3DTOP_MODULATE ); + device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + + device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + device->SetRenderState( D3DRS_LIGHTING , FALSE ); + device->SetRenderState( D3DRS_ZENABLE , FALSE ); + device->SetRenderState( D3DRS_FOGENABLE, FALSE ); + + device->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE ); + device->SetRenderState( D3DRS_ALPHAREF , 0 ); + device->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); + device->SetRenderState( D3DRS_FILLMODE , D3DFILL_SOLID ); + device->SetRenderState( D3DRS_CULLMODE , D3DCULL_NONE ); + + device->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); + device->SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA ); + device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + device->SetFVF(m_fvf); + device->SetStreamSource(0, m_vertex.Get(), 0, sizeof(VERTEX)); + device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, m_count*2); - XMMATRIX world = pGUIShader->GetWorld(); - XMMATRIX trans = XMMatrixTranslation(state.x, state.y, 0.0f); - XMMATRIX scale = XMMatrixScaling(state.width, state.height, 1.0f); - - pGUIShader->SetWorld(XMMatrixMultiply(XMMatrixMultiply(world, scale), trans)); - - const unsigned stride = sizeof(Vertex); - const unsigned offset = 0; - - ID3D11Buffer* vertexBuffer = m_vertex.Get(); - // Set the vertex buffer to active in the input assembler so it can be rendered. - pContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); - // Set the type of primitive that should be rendered from this vertex buffer, in this case triangles. - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - g_Windowing.SetAlphaBlendEnable(true); - pGUIShader->Begin(SHADER_METHOD_RENDER_FONT); - - ID3D11ShaderResourceView* views[] = { m_texture.GetShaderResource() }; - pGUIShader->SetShaderViews(1, views); - pGUIShader->Draw(m_count * 6, 0); - - // restoring transformation - pGUIShader->SetWorld(world); - pGUIShader->RestoreBuffers(); + device->SetTexture(0, NULL); + device->SetTransform(D3DTS_WORLD, &orig); } COverlayImageDX::~COverlayImageDX() @@ -285,75 +413,131 @@ void COverlayImageDX::Load(uint32_t* rgba, int width, int height, int stride) { + m_fvf = D3DFVF_XYZ | D3DFVF_TEX1; + float u, v; if(!LoadTexture(width , height , stride - , DXGI_FORMAT_B8G8R8A8_UNORM + , D3DFMT_A8R8G8B8 , rgba , &u, &v , &m_texture)) return; - Vertex* vt = new Vertex[6]; - - vt[0].texCoord = XMFLOAT2(0.0f, 0.0f); - vt[0].pos = XMFLOAT3(0.0f, 0.0f, 0.0f); + if (!m_vertex.Create(sizeof(VERTEX) * 6, D3DUSAGE_WRITEONLY, m_fvf, g_Windowing.DefaultD3DPool())) + { + CLog::Log(LOGERROR, "%s - failed to create vertex buffer", __FUNCTION__); + m_texture.Release(); + return; + } - vt[1].texCoord = XMFLOAT2(u, 0.0f); - vt[1].pos = XMFLOAT3(1.0f, 0.0f, 0.0f); + VERTEX* vt = NULL; + if (!m_vertex.Lock(0, 0, (void**)&vt, 0)) + { + CLog::Log(LOGERROR, "%s - failed to lock texture", __FUNCTION__); + m_texture.Release(); + m_vertex.Release(); + return; + } - vt[2].texCoord = XMFLOAT2(0.0f, v); - vt[2].pos = XMFLOAT3(0.0f, 1.0f, 0.0f); + vt[0].u = 0.0f; + vt[0].v = 0.0f; + vt[0].x = 0.0f; + vt[0].y = 0.0f; + vt[0].z = 0.0f; + + vt[1].u = u; + vt[1].v = 0.0f; + vt[1].x = 1.0f; + vt[1].y = 0.0f; + vt[1].z = 0.0f; + + vt[2].u = 0.0f; + vt[2].v = v; + vt[2].x = 0.0f; + vt[2].y = 1.0f; + vt[2].z = 0.0f; vt[3] = vt[1]; - vt[4].texCoord = XMFLOAT2(u, v); - vt[4].pos = XMFLOAT3(1.0f, 1.0f, 0.0f); + vt[4].u = u; + vt[4].v = v; + vt[4].x = 1.0f; + vt[4].y = 1.0f; + vt[4].z = 0.0f; vt[5] = vt[2]; - if (!m_vertex.Create(D3D11_BIND_VERTEX_BUFFER, 6, sizeof(Vertex), DXGI_FORMAT_UNKNOWN, D3D11_USAGE_IMMUTABLE, vt)) - { - CLog::Log(LOGERROR, "%s - failed to create vertex buffer", __FUNCTION__); - m_texture.Release(); - } - - delete[] vt; + m_vertex.Unlock(); } void COverlayImageDX::Render(SRenderState &state) { - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - XMMATRIX world = pGUIShader->GetWorld(); - XMMATRIX trans = m_pos == POSITION_RELATIVE - ? XMMatrixTranslation(state.x - state.width * 0.5f, state.y - state.height * 0.5f, 0.0f) - : XMMatrixTranslation(state.x, state.y, 0.0f), - scale = XMMatrixScaling(state.width, state.height, 1.0f); - - pGUIShader->SetWorld(XMMatrixMultiply(XMMatrixMultiply(world, scale), trans)); - - const unsigned stride = m_vertex.GetStride(); - const unsigned offset = 0; - - ID3D11Buffer* vertexBuffer = m_vertex.Get(); - // Set the vertex buffer to active in the input assembler so it can be rendered. - pContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); - // Set the type of primitive that should be rendered from this vertex buffer, in this case triangles. - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - pGUIShader->Begin(SHADER_METHOD_RENDER_TEXTURE_NOBLEND); - g_Windowing.SetAlphaBlendEnable(true); - - ID3D11ShaderResourceView* views[] = { m_texture.GetShaderResource() }; - pGUIShader->SetShaderViews(1, views); - pGUIShader->Draw(6, 0); - - // restoring transformation - pGUIShader->SetWorld(world); - pGUIShader->RestoreBuffers(); + D3DXMATRIX orig; + LPDIRECT3DDEVICE9 device = g_Windowing.Get3DDevice(); + device->GetTransform(D3DTS_WORLD, &orig); + + D3DXMATRIX world = orig; + D3DXMATRIX trans, scale; + + if(m_pos == POSITION_RELATIVE) + D3DXMatrixTranslation(&trans, state.x - state.width * 0.5f - 0.5f + , state.y - state.height * 0.5f - 0.5f + , 0.0f); + else + D3DXMatrixTranslation(&trans, state.x - 0.5f + , state.y - 0.5f + , 0.0f); + + D3DXMatrixScaling (&scale, state.width + , state.height + , 1.0f); + + D3DXMatrixMultiply(&world, &world, &scale); + D3DXMatrixMultiply(&world, &world, &trans); + + device->SetTransform(D3DTS_WORLD, &world); + + device->SetTexture( 0, m_texture.Get() ); + device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + device->SetSamplerState(0, D3DSAMP_ADDRESSU , D3DTADDRESS_CLAMP); + device->SetSamplerState(0, D3DSAMP_ADDRESSV , D3DTADDRESS_CLAMP); + + device->SetTextureStageState(0, D3DTSS_COLOROP , D3DTOP_SELECTARG1 ); + device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + device->SetTextureStageState(0, D3DTSS_ALPHAOP , D3DTOP_SELECTARG1 ); + device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + + device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + device->SetRenderState( D3DRS_LIGHTING , FALSE ); + device->SetRenderState( D3DRS_ZENABLE , FALSE ); + device->SetRenderState( D3DRS_FOGENABLE, FALSE ); + + device->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE ); + device->SetRenderState( D3DRS_ALPHAREF , 0 ); + device->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); + device->SetRenderState( D3DRS_FILLMODE , D3DFILL_SOLID ); + device->SetRenderState( D3DRS_CULLMODE , D3DCULL_NONE ); + device->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); + +#if USE_PREMULTIPLIED_ALPHA + device->SetRenderState( D3DRS_SRCBLEND , D3DBLEND_ONE ); +#else + device->SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA ); +#endif + device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + + device->SetFVF(m_fvf); + device->SetStreamSource(0, m_vertex.Get(), 0, sizeof(VERTEX)); + device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); + + device->SetTexture( 0, NULL ); + device->SetTransform(D3DTS_WORLD, &orig); } #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/OverlayRendererDX.h kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/OverlayRendererDX.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/OverlayRendererDX.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/OverlayRendererDX.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,7 +19,6 @@ */ #pragma once - #include "OverlayRenderer.h" #include "guilib/D3DResource.h" @@ -42,10 +41,16 @@ void Render(SRenderState& state); - int m_count; - DWORD m_fvf; - CD3DTexture m_texture; - CD3DBuffer m_vertex; + struct VERTEX { + FLOAT x, y, z; + DWORD c; + FLOAT u, v; + }; + + int m_count; + DWORD m_fvf; + CD3DTexture m_texture; + CD3DVertexBuffer m_vertex; }; class COverlayImageDX @@ -59,10 +64,15 @@ void Load(uint32_t* rgba, int width, int height, int stride); void Render(SRenderState& state); - DWORD m_fvf; - CD3DTexture m_texture; - CD3DBuffer m_vertex; - bool m_pma; + struct VERTEX { + FLOAT x, y, z; + FLOAT u, v; + }; + + DWORD m_fvf; + CD3DTexture m_texture; + CD3DVertexBuffer m_vertex; + bool m_pma; }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/OverlayRendererGUI.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/OverlayRendererGUI.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/OverlayRendererGUI.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/OverlayRendererGUI.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -45,7 +45,7 @@ static CGUITextLayout* GetFontLayout() { if (CUtil::IsUsingTTFSubtitles()) - { std::string font_file = CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_FONT); + { std::string font_file = CSettings::Get().GetString("subtitles.font"); std::string font_path = URIUtils::AddFileToFolder("special://home/media/Fonts/", font_file); if (!XFILE::CFile::Exists(font_path)) font_path = URIUtils::AddFileToFolder("special://xbmc/media/Fonts/", font_file); @@ -54,17 +54,17 @@ RESOLUTION_INFO pal(720, 576, 0); CGUIFont *subtitle_font = g_fontManager.LoadTTF("__subtitle__" , font_path - , color[CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_COLOR)] + , color[CSettings::Get().GetInt("subtitles.color")] , 0 - , CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_HEIGHT) - , CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_STYLE) + , CSettings::Get().GetInt("subtitles.height") + , CSettings::Get().GetInt("subtitles.style") , false, 1.0f, 1.0f, &pal, true); CGUIFont *border_font = g_fontManager.LoadTTF("__subtitleborder__" , font_path , 0xFF000000 , 0 - , CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_HEIGHT) - , CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_STYLE) + , CSettings::Get().GetInt("subtitles.height") + , CSettings::Get().GetInt("subtitles.style") , true, 1.0f, 1.0f, &pal, true); if (!subtitle_font || !border_font) CLog::Log(LOGERROR, "CGUIWindowFullScreen::OnMessage(WINDOW_INIT) - Unable to load subtitle font"); @@ -115,7 +115,7 @@ m_layout = GetFontLayout(); - m_subalign = CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_ALIGN); + m_subalign = CSettings::Get().GetInt("subtitles.align"); if (m_subalign == SUBTITLE_ALIGN_MANUAL) { m_align = ALIGN_SUBTITLE; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/OverlayRendererUtil.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/OverlayRendererUtil.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/OverlayRendererUtil.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/OverlayRendererUtil.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -303,7 +303,7 @@ if(g_graphicsContext.GetStereoMode() != RENDER_STEREO_MODE_MONO && g_graphicsContext.GetStereoMode() != RENDER_STEREO_MODE_OFF) { - depth = CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_STEREOSCOPICDEPTH); + depth = CSettings::Get().GetInt("subtitles.stereoscopicdepth"); depth *= (g_graphicsContext.GetStereoView() == RENDER_STEREO_VIEW_LEFT ? 1 : -1); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/RenderCapture.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/RenderCapture.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/RenderCapture.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/RenderCapture.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -314,10 +314,9 @@ CRenderCaptureDX::CRenderCaptureDX() { - m_renderTexture = nullptr; - m_renderSurface = nullptr; - m_copySurface = nullptr; - m_query = nullptr; + m_renderSurface = NULL; + m_copySurface = NULL; + m_query = NULL; m_surfaceWidth = 0; m_surfaceHeight = 0; @@ -339,19 +338,17 @@ void CRenderCaptureDX::BeginRender() { - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - CD3D11_QUERY_DESC queryDesc(D3D11_QUERY_OCCLUSION); + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); if (!m_asyncChecked) { - m_asyncSupported = S_OK == pDevice->CreateQuery(&queryDesc, nullptr); + m_asyncSupported = pD3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, NULL) == D3D_OK; if (m_flags & CAPTUREFLAG_CONTINUOUS) { if (!m_asyncSupported) - CLog::Log(LOGWARNING, "CRenderCaptureDX: D3D11_QUERY_OCCLUSION not supported, performance might suffer"); + CLog::Log(LOGWARNING, "CRenderCaptureDX: D3DQUERYTYPE_OCCLUSION not supported, performance might suffer"); if (!UseOcclusionQuery()) - CLog::Log(LOGWARNING, "CRenderCaptureDX: D3D11_QUERY_OCCLUSION disabled, performance might suffer"); + CLog::Log(LOGWARNING, "CRenderCaptureDX: D3DQUERYTYPE_OCCLUSION disabled, performance might suffer"); } m_asyncChecked = true; @@ -363,44 +360,29 @@ { if (m_renderSurface) { - while(m_renderSurface->Release() > 0) {} - m_renderSurface = nullptr; + while(m_renderSurface->Release() > 0); + m_renderSurface = NULL; } if (m_copySurface) { - while (m_copySurface->Release() > 0) {} - m_copySurface = nullptr; + while (m_copySurface->Release() > 0); + m_copySurface = NULL; } - CD3D11_TEXTURE2D_DESC texDesc(DXGI_FORMAT_B8G8R8A8_UNORM, m_width, m_height, 1, 1, D3D11_BIND_RENDER_TARGET); - result = pDevice->CreateTexture2D(&texDesc, nullptr, &m_renderTexture); - if (S_OK != result) + result = pD3DDevice->CreateRenderTarget(m_width, m_height, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &m_renderSurface, NULL); + if (result != D3D_OK) { - CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateTexture2D (RENDER_TARGET) failed %s", + CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateRenderTarget failed %s", g_Windowing.GetErrorDescription(result).c_str()); SetState(CAPTURESTATE_FAILED); return; } - CD3D11_RENDER_TARGET_VIEW_DESC rtDesc(D3D11_RTV_DIMENSION_TEXTURE2D); - result = pDevice->CreateRenderTargetView(m_renderTexture, &rtDesc, &m_renderSurface); - if (S_OK != result) + result = pD3DDevice->CreateOffscreenPlainSurface(m_width, m_height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &m_copySurface, NULL); + if (result != D3D_OK) { - CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateRenderTargetView failed %s", - g_Windowing.GetErrorDescription(result).c_str()); - SetState(CAPTURESTATE_FAILED); - return; - } - - texDesc.BindFlags = 0; - texDesc.Usage = D3D11_USAGE_STAGING; - texDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - - result = pDevice->CreateTexture2D(&texDesc, nullptr, &m_copySurface); - if (S_OK != result) - { - CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateTexture2D (USAGE_STAGING) failed %s", + CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateOffscreenPlainSurface failed %s", g_Windowing.GetErrorDescription(result).c_str()); SetState(CAPTURESTATE_FAILED); return; @@ -417,23 +399,30 @@ m_pixels = new uint8_t[m_bufferSize]; } - pContext->OMSetRenderTargets(1, &m_renderSurface, nullptr); + result = pD3DDevice->SetRenderTarget(0, m_renderSurface); + if (result != D3D_OK) + { + CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: SetRenderTarget failed %s", + g_Windowing.GetErrorDescription(result).c_str()); + SetState(CAPTURESTATE_FAILED); + return; + } if (m_asyncSupported && UseOcclusionQuery()) { //generate an occlusion query if we don't have one if (!m_query) { - result = pDevice->CreateQuery(&queryDesc, &m_query); - if (S_OK != result) + result = pD3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, &m_query); + if (result != D3D_OK) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateQuery failed %s", g_Windowing.GetErrorDescription(result).c_str()); m_asyncSupported = false; if (m_query) { - while (m_query->Release() > 0) {} - m_query = nullptr; + while (m_query->Release() > 0); + m_query = NULL; } } } @@ -443,26 +432,26 @@ //don't use an occlusion query, clean up any old one if (m_query) { - while (m_query->Release() > 0) {} - m_query = nullptr; + while (m_query->Release() > 0); + m_query = NULL; } } if (m_query) - g_Windowing.GetImmediateContext()->Begin(m_query); + m_query->Issue(D3DISSUE_BEGIN); } void CRenderCaptureDX::EndRender() { - g_Windowing.FinishCommandList(); - ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext(); - - pContext->CopyResource(m_copySurface, m_renderTexture); + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + //GetRenderTargetData should be async on most drivers, + //so the render thread doesn't have to wait for the gpu to copy the data to m_copySurface + pD3DDevice->GetRenderTargetData(m_renderSurface, m_copySurface); if (m_query) { - pContext->End(m_query); - pContext->GetData(m_query, nullptr, 0, 0); //flush the query request + m_query->Issue(D3DISSUE_END); + m_query->GetData(NULL, 0, D3DGETDATA_FLUSH); //flush the query request } if (m_flags & CAPTUREFLAG_IMMEDIATELY) @@ -476,12 +465,12 @@ if (m_query) { //if the result of the occlusion query is available, the data is probably also written into m_copySurface - HRESULT result = g_Windowing.GetImmediateContext()->GetData(m_query, nullptr, 0, 0); - if (S_OK == result) + HRESULT result = m_query->GetData(NULL, 0, D3DGETDATA_FLUSH); + if (result == S_OK) { SurfaceToBuffer(); } - else if (S_FALSE != result) + else if (result != S_FALSE) { CLog::Log(LOGERROR, "CRenderCaptureDX::ReadOut: GetData failed"); SurfaceToBuffer(); @@ -495,22 +484,20 @@ void CRenderCaptureDX::SurfaceToBuffer() { - ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext(); - - D3D11_MAPPED_SUBRESOURCE lockedRect; - if (pContext->Map(m_copySurface, 0, D3D11_MAP_READ, 0, &lockedRect) == S_OK) + D3DLOCKED_RECT lockedRect; + if (m_copySurface->LockRect(&lockedRect, NULL, D3DLOCK_READONLY) == D3D_OK) { //if pitch is same, do a direct copy, otherwise copy one line at a time - if (lockedRect.RowPitch == m_width * 4) + if (lockedRect.Pitch == m_width * 4) { - memcpy(m_pixels, lockedRect.pData, m_width * m_height * 4); + memcpy(m_pixels, lockedRect.pBits, m_width * m_height * 4); } else { for (unsigned int y = 0; y < m_height; y++) - memcpy(m_pixels + y * m_width * 4, (uint8_t*)lockedRect.pData + y * lockedRect.RowPitch, m_width * 4); + memcpy(m_pixels + y * m_width * 4, (uint8_t*)lockedRect.pBits + y * lockedRect.Pitch, m_width * 4); } - pContext->Unmap(m_copySurface, 0); + m_copySurface->UnlockRect(); SetState(CAPTURESTATE_DONE); } else @@ -536,26 +523,20 @@ { if (m_renderSurface) { - while (m_renderSurface->Release() > 0) {} - m_renderSurface = nullptr; - } - - if (m_renderTexture) - { - while (m_renderTexture->Release() > 0) {} - m_renderTexture = nullptr; + while (m_renderSurface->Release() > 0); + m_renderSurface = NULL; } if (m_copySurface) { - while (m_copySurface->Release() > 0) {} - m_copySurface = nullptr; + while (m_copySurface->Release() > 0); + m_copySurface = NULL; } if (m_query) { - while (m_query->Release() > 0) {} - m_query = nullptr; + while (m_query->Release() > 0); + m_query = NULL; } m_surfaceWidth = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/RenderCapture.h kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/RenderCapture.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/RenderCapture.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/RenderCapture.h 2015-10-19 08:39:16.000000000 +0000 @@ -278,12 +278,12 @@ void SurfaceToBuffer(); void CleanupDX(); - ID3D11Texture2D* m_renderTexture; - ID3D11RenderTargetView* m_renderSurface; - ID3D11Texture2D* m_copySurface; - ID3D11Query* m_query; - unsigned int m_surfaceWidth; - unsigned int m_surfaceHeight; + LPDIRECT3DSURFACE9 m_renderSurface; + LPDIRECT3DSURFACE9 m_copySurface; + LPDIRECT3DQUERY9 m_query; + + unsigned int m_surfaceWidth; + unsigned int m_surfaceHeight; }; class CRenderCapture : public CRenderCaptureDX diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/RenderFormats.h kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/RenderFormats.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/RenderFormats.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/RenderFormats.h 2015-10-19 08:38:33.000000000 +0000 @@ -40,7 +40,6 @@ RENDER_FMT_BYPASS, RENDER_FMT_EGLIMG, RENDER_FMT_MEDIACODEC, - RENDER_FMT_MEDIACODECSURFACE, RENDER_FMT_IMXMAP, RENDER_FMT_MMAL, }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/RenderManager.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/RenderManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/RenderManager.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/RenderManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,7 +32,7 @@ #include "utils/StringUtils.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "settings/AdvancedSettings.h" #include "settings/MediaSettings.h" #include "settings/Settings.h" @@ -62,11 +62,8 @@ #include "../dvdplayer/DVDCodecs/Video/VAAPI.h" #endif -using namespace KODI::MESSAGING; - #define MAXPRESENTDELAY 0.500 - /* at any point we want an exclusive lock on rendermanager */ /* we must make sure we don't have a graphiccontext lock */ /* these two functions allow us to step out from that lock */ @@ -270,7 +267,7 @@ if( flags & CONF_FLAGS_FULLSCREEN ) { lock.Leave(); - CApplicationMessenger::GetInstance().PostMsg(TMSG_SWITCHTOFULLSCREEN); + CApplicationMessenger::Get().SwitchToFullscreen(); lock.Enter(); } lock2.Enter(); @@ -502,8 +499,9 @@ } else { + ThreadMessage msg = {TMSG_RENDERER_FLUSH}; m_flushEvent.Reset(); - CApplicationMessenger::GetInstance().PostMsg(TMSG_RENDERER_FLUSH); + CApplicationMessenger::Get().SendMessage(msg, false); if (!m_flushEvent.WaitMSec(1000)) { CLog::Log(LOGERROR, "%s - timed out waiting for renderer to flush", __FUNCTION__); @@ -685,8 +683,8 @@ EPRESENTMETHOD presentmethod; - EDEINTERLACEMODE deinterlacemode = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_DeinterlaceMode; - EINTERLACEMETHOD interlacemethod = AutoInterlaceMethodInternal(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_InterlaceMethod); + EDEINTERLACEMODE deinterlacemode = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode; + EINTERLACEMETHOD interlacemethod = AutoInterlaceMethodInternal(CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod); if(g_advancedSettings.m_videoDisableBackgroundDeinterlace && !g_graphicsContext.IsFullScreenVideo()) deinterlacemode = VS_DEINTERLACEMODE_OFF; @@ -776,7 +774,7 @@ { float fps; - if (CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOSCREEN_VSYNC) != VSYNC_DISABLED) + if (CSettings::Get().GetInt("videoscreen.vsync") != VSYNC_DISABLED) { fps = (float)g_VideoReferenceClock.GetRefreshRate(); if (fps <= 0) fps = g_graphicsContext.GetFPS(); @@ -991,6 +989,10 @@ { CDVDCodecUtils::CopyYUV422PackedPicture(&image, &pic); } + else if(pic.format == RENDER_FMT_DXVA) + { + CDVDCodecUtils::CopyDXVA2Picture(&image, &pic); + } #ifdef HAVE_LIBVDPAU else if(pic.format == RENDER_FMT_VDPAU || pic.format == RENDER_FMT_VDPAU_420) @@ -1018,7 +1020,7 @@ m_pRenderer->AddProcessor(pic.stf, pic.eglimg, index); #endif #if defined(TARGET_ANDROID) - else if(pic.format == RENDER_FMT_MEDIACODEC || pic.format == RENDER_FMT_MEDIACODECSURFACE) + else if(pic.format == RENDER_FMT_MEDIACODEC) m_pRenderer->AddProcessor(pic.mediacodec, index); #endif #ifdef HAS_IMXVPU @@ -1144,7 +1146,7 @@ m_overlays.Release(m_free.front()); // return buffer level - return m_queued.size() + m_discard.size(); + return m_queued.size() + m_discard.size();; } void CXBMCRenderManager::PrepareNextRender() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/VideoShaders/VideoFilterShader.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/VideoShaders/VideoFilterShader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/VideoShaders/VideoFilterShader.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/VideoShaders/VideoFilterShader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -38,6 +38,7 @@ #endif using namespace Shaders; +using namespace std; ////////////////////////////////////////////////////////////////////// // BaseVideoFilterShader - base class for video filter shaders @@ -55,7 +56,7 @@ m_stretch = 0.0f; - std::string shaderv = + string shaderv = "varying vec2 cord;" "void main()" "{" @@ -65,7 +66,7 @@ "}"; VertexShader()->SetSource(shaderv); - std::string shaderp = + string shaderp = "uniform sampler2D img;" "varying vec2 cord;" "void main()" @@ -81,8 +82,8 @@ m_method = method; m_kernelTex1 = 0; - std::string shadername; - std::string defines; + string shadername; + string defines; #if defined(HAS_GL) m_floattex = glewIsSupported("GL_ARB_texture_float"); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,27 +21,22 @@ #ifdef HAS_DX #include "WinVideoFilter.h" -#include "ConvolutionKernels.h" -#include -#include "FileSystem/File.h" -#include "guilib/GraphicContext.h" -#include "Util.h" -#include "utils/log.h" -#include "win32/WIN32Util.h" #include "windowing/WindowingFactory.h" -#include "YUV2RGBShader.h" +#include "../../../utils/log.h" +#include "../../../FileSystem/File.h" #include - -using namespace DirectX::PackedVector; +#include "ConvolutionKernels.h" +#include "YUV2RGBShader.h" +#include "win32/WIN32Util.h" +#include "Util.h" CYUV2RGBMatrix::CYUV2RGBMatrix() { - m_NeedRecalc = true; - m_blacklevel = 0.0f; - m_contrast = 0.0f; - m_flags = 0; - m_limitedRange = false; - m_format = RENDER_FMT_NONE; + m_NeedRecalc = true; + m_blacklevel = 0.0f; + m_contrast = 0.0f; + m_flags = 0; + m_format = RENDER_FMT_NONE; } void CYUV2RGBMatrix::SetParameters(float contrast, float blacklevel, unsigned int flags, ERenderFormat format) @@ -66,14 +61,9 @@ m_NeedRecalc = true; m_format = format; } - if (m_limitedRange != g_Windowing.UseLimitedColor()) - { - m_NeedRecalc = true; - m_limitedRange = g_Windowing.UseLimitedColor(); - } } -XMFLOAT4X4* CYUV2RGBMatrix::Matrix() +D3DXMATRIX* CYUV2RGBMatrix::Matrix() { if (m_NeedRecalc) { @@ -108,43 +98,25 @@ { if (m_effect.Get()) m_effect.Release(); + if (m_vb.Get()) m_vb.Release(); - if (m_ib.Get()) - m_ib.Release(); - SAFE_RELEASE(m_inputLayout); } -bool CWinShader::CreateVertexBuffer(unsigned int vertCount, unsigned int vertSize) +bool CWinShader::CreateVertexBuffer(DWORD FVF, unsigned int vertCount, unsigned int vertSize, unsigned int primitivesCount) { - if (!m_vb.Create(D3D11_BIND_VERTEX_BUFFER, vertCount, vertSize, DXGI_FORMAT_UNKNOWN, D3D11_USAGE_DYNAMIC)) - return false; - - uint16_t id[4] = { 3, 0, 2, 1 }; - if (!m_ib.Create(D3D11_BIND_INDEX_BUFFER, ARRAYSIZE(id), sizeof(uint16_t), DXGI_FORMAT_R16_UINT, D3D11_USAGE_IMMUTABLE, id)) + if (!m_vb.Create(vertCount * vertSize, D3DUSAGE_WRITEONLY, FVF, g_Windowing.DefaultD3DPool())) return false; - m_vbsize = vertCount * vertSize; + m_FVF = FVF; m_vertsize = vertSize; - + m_primitivesCount = primitivesCount; return true; } -bool CWinShader::CreateInputLayout(D3D11_INPUT_ELEMENT_DESC *layout, unsigned numElements) -{ - D3DX11_PASS_DESC desc = {}; - if (FAILED(m_effect.Get()->GetTechniqueByIndex(0)->GetPassByIndex(0)->GetDesc(&desc))) - { - CLog::Log(LOGERROR, __FUNCTION__": Failed to get first pass description."); - return false; - } - - return S_OK == g_Windowing.Get3D11Device()->CreateInputLayout(layout, numElements, desc.pIAInputSignature, desc.IAInputSignatureSize, &m_inputLayout); -} - bool CWinShader::LockVertexBuffer(void **data) { - if (!m_vb.Map(data)) + if (!m_vb.Lock(0, m_vbsize, data, 0)) { CLog::Log(LOGERROR, __FUNCTION__" - failed to lock vertex buffer"); return false; @@ -154,7 +126,7 @@ bool CWinShader::UnlockVertexBuffer() { - if (!m_vb.Unmap()) + if (!m_vb.Unlock()) { CLog::Log(LOGERROR, __FUNCTION__" - failed to unlock vertex buffer"); return false; @@ -185,59 +157,56 @@ return true; } -bool CWinShader::Execute(std::vector *vecRT, unsigned int vertexIndexStep) +bool CWinShader::Execute(std::vector *vecRT, unsigned int vertexIndexStep) { - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - ID3D11RenderTargetView* oldRT = nullptr; + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + LPDIRECT3DSURFACE9 oldRT = 0; // The render target will be overriden: save the caller's original RT - if (vecRT != nullptr && !vecRT->empty()) - pContext->OMGetRenderTargets(1, &oldRT, nullptr); + if (vecRT != NULL && !vecRT->empty()) + pD3DDevice->GetRenderTarget(0, &oldRT); + + pD3DDevice->SetFVF(m_FVF); + pD3DDevice->SetStreamSource(0, m_vb.Get(), 0, m_vertsize); UINT cPasses, iPass; - if (!m_effect.Begin(&cPasses, 0)) + if (!m_effect.Begin( &cPasses, 0 )) { CLog::Log(LOGERROR, __FUNCTION__" - failed to begin d3d effect"); return false; } - ID3D11Buffer* vertexBuffer = m_vb.Get(); - ID3D11Buffer* indexBuffer = m_ib.Get(); - unsigned int stride = m_vb.GetStride(); - unsigned int offset = 0; - pContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); - pContext->IASetIndexBuffer(indexBuffer, m_ib.GetFormat(), 0); - pContext->IASetInputLayout(m_inputLayout); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - - for (iPass = 0; iPass < cPasses; iPass++) + for( iPass = 0; iPass < cPasses; iPass++ ) { - if (vecRT != nullptr && vecRT->size() > iPass) - pContext->OMSetRenderTargets(1, &vecRT->at(iPass), nullptr); - - SetStepParams(iPass); - - if (!m_effect.BeginPass(iPass)) + if (!m_effect.BeginPass( iPass )) { CLog::Log(LOGERROR, __FUNCTION__" - failed to begin d3d effect pass"); break; } - pContext->DrawIndexed(4, 0, iPass * vertexIndexStep); + if (vecRT != NULL && vecRT->size() > iPass) + pD3DDevice->SetRenderTarget(0, (*vecRT)[iPass]); + + HRESULT hr = pD3DDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, iPass * vertexIndexStep, m_primitivesCount); + if (FAILED(hr)) + CLog::Log(LOGERROR, __FUNCTION__" - failed DrawPrimitive %08X", hr); if (!m_effect.EndPass()) CLog::Log(LOGERROR, __FUNCTION__" - failed to end d3d effect pass"); - - CD3DHelper::PSClearShaderResources(pContext); } if (!m_effect.End()) CLog::Log(LOGERROR, __FUNCTION__" - failed to end d3d effect"); - if (oldRT != nullptr) + if (oldRT != 0) { - pContext->OMSetRenderTargets(1, &oldRT, nullptr); + pD3DDevice->SetRenderTarget(0, oldRT); oldRT->Release(); } + + // MSDN says: Setting a new render target will cause the viewport + // to be set to the full size of the new render target. + // So we need restore our viewport + g_Windowing.RestoreViewPort(); return true; } @@ -245,7 +214,7 @@ bool CYUV2RGBShader::Create(unsigned int sourceWidth, unsigned int sourceHeight, ERenderFormat fmt) { - CWinShader::CreateVertexBuffer(4, sizeof(CUSTOMVERTEX)); + CWinShader::CreateVertexBuffer(D3DFVF_XYZRHW | D3DFVF_TEX3, 4, sizeof(CUSTOMVERTEX), 2); m_sourceWidth = sourceWidth; m_sourceHeight = sourceHeight; @@ -255,33 +224,81 @@ DefinesMap defines; - switch (fmt) + if (fmt == RENDER_FMT_YUV420P16) { - case RENDER_FMT_YUV420P: - case RENDER_FMT_YUV420P10: - case RENDER_FMT_YUV420P16: defines["XBMC_YV12"] = ""; texWidth = sourceWidth; - break; - case RENDER_FMT_NV12: + + if(!m_YUVPlanes[0].Create(texWidth , m_sourceHeight , 1, 0, D3DFMT_L16, D3DPOOL_DEFAULT) + || !m_YUVPlanes[1].Create(texWidth / 2, m_sourceHeight / 2, 1, 0, D3DFMT_L16, D3DPOOL_DEFAULT) + || !m_YUVPlanes[2].Create(texWidth / 2, m_sourceHeight / 2, 1, 0, D3DFMT_L16, D3DPOOL_DEFAULT)) + { + CLog::Log(LOGERROR, __FUNCTION__": Failed to create 16 bit YV12 planes."); + return false; + } + } + else if (fmt == RENDER_FMT_YUV420P10) + { + defines["XBMC_YV12"] = ""; + texWidth = sourceWidth; + + if(!m_YUVPlanes[0].Create(texWidth , m_sourceHeight , 1, 0, D3DFMT_L16, D3DPOOL_DEFAULT) + || !m_YUVPlanes[1].Create(texWidth / 2, m_sourceHeight / 2, 1, 0, D3DFMT_L16, D3DPOOL_DEFAULT) + || !m_YUVPlanes[2].Create(texWidth / 2, m_sourceHeight / 2, 1, 0, D3DFMT_L16, D3DPOOL_DEFAULT)) + { + CLog::Log(LOGERROR, __FUNCTION__": Failed to create 10 bit YV12 planes."); + return false; + } + } + else if (fmt == RENDER_FMT_YUV420P) + { + defines["XBMC_YV12"] = ""; + texWidth = sourceWidth; + + if(!m_YUVPlanes[0].Create(texWidth , m_sourceHeight , 1, 0, D3DFMT_L8, D3DPOOL_DEFAULT) + || !m_YUVPlanes[1].Create(texWidth / 2, m_sourceHeight / 2, 1, 0, D3DFMT_L8, D3DPOOL_DEFAULT) + || !m_YUVPlanes[2].Create(texWidth / 2, m_sourceHeight / 2, 1, 0, D3DFMT_L8, D3DPOOL_DEFAULT)) + { + CLog::Log(LOGERROR, __FUNCTION__": Failed to create YV12 planes."); + return false; + } + } + else if (fmt == RENDER_FMT_NV12) + { defines["XBMC_NV12"] = ""; texWidth = sourceWidth; - // FL 9.x doesn't support DXGI_FORMAT_R8G8_UNORM, so we have to use SNORM and correct values in shader - if (!g_Windowing.IsFormatSupport(DXGI_FORMAT_R8G8_UNORM, D3D11_FORMAT_SUPPORT_TEXTURE2D)) - defines["NV12_SNORM_UV"] = ""; - break; - case RENDER_FMT_UYVY422: - defines["XBMC_UYVY"] = ""; - texWidth = sourceWidth >> 1; - break; - case RENDER_FMT_YUYV422: + + if(!m_YUVPlanes[0].Create(texWidth , m_sourceHeight , 1, 0, D3DFMT_L8, D3DPOOL_DEFAULT) + || !m_YUVPlanes[1].Create(texWidth / 2, m_sourceHeight / 2, 1, 0, D3DFMT_A8L8, D3DPOOL_DEFAULT)) + { + CLog::Log(LOGERROR, __FUNCTION__": Failed to create NV12 planes."); + return false; + } + } + else if (fmt == RENDER_FMT_YUYV422) + { defines["XBMC_YUY2"] = ""; texWidth = sourceWidth >> 1; - break; - default: - return false; - break; + + if(!m_YUVPlanes[0].Create(texWidth , m_sourceHeight , 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT)) + { + CLog::Log(LOGERROR, __FUNCTION__": Failed to create YUY2 planes."); + return false; + } + } + else if (fmt == RENDER_FMT_UYVY422) + { + defines["XBMC_UYVY"] = ""; + texWidth = sourceWidth >> 1; + + if(!m_YUVPlanes[0].Create(texWidth , m_sourceHeight , 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT)) + { + CLog::Log(LOGERROR, __FUNCTION__": Failed to create UYVY planes."); + return false; + } } + else + return false; m_texSteps[0] = 1.0f/(float)texWidth; m_texSteps[1] = 1.0f/(float)sourceHeight; @@ -294,87 +311,85 @@ return false; } - // Create input layout - D3D11_INPUT_ELEMENT_DESC layout[] = - { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - }; - - if (!CWinShader::CreateInputLayout(layout, ARRAYSIZE(layout))) - { - CLog::Log(LOGERROR, __FUNCTION__": Failed to create input layout for Input Assembler."); - return false; - } return true; } -void CYUV2RGBShader::Render(CRect sourceRect, CPoint dest[], +void CYUV2RGBShader::Render(CRect sourceRect, CRect destRect, float contrast, float brightness, unsigned int flags, YUVBuffer* YUVbuf) { - PrepareParameters(sourceRect, dest, + PrepareParameters(sourceRect, destRect, contrast, brightness, flags); + UploadToGPU(YUVbuf); SetShaderParameters(YUVbuf); - Execute(nullptr, 4); + Execute(NULL,4); } CYUV2RGBShader::~CYUV2RGBShader() { + for(unsigned i = 0; i < MAX_PLANES; i++) + { + if (m_YUVPlanes[i].Get()) + m_YUVPlanes[i].Release(); + } } void CYUV2RGBShader::PrepareParameters(CRect sourceRect, - CPoint dest[], + CRect destRect, float contrast, float brightness, unsigned int flags) { - if (m_sourceRect != sourceRect - || m_dest[0] != dest[0] || m_dest[1] != dest[1] - || m_dest[2] != dest[2] || m_dest[3] != dest[3]) + //See RGB renderer for comment on this + #define CHROMAOFFSET_HORIZ 0.25f + + if (m_sourceRect != sourceRect || m_destRect != destRect) { m_sourceRect = sourceRect; - for (size_t i = 0; i < 4; ++i) - m_dest[i] = dest[i]; + m_destRect = destRect; CUSTOMVERTEX* v; CWinShader::LockVertexBuffer((void**)&v); - v[0].x = m_dest[0].x; - v[0].y = m_dest[0].y; - v[0].z = 0.0f; + v[0].x = destRect.x1; + v[0].y = destRect.y1; v[0].tu = sourceRect.x1 / m_sourceWidth; v[0].tv = sourceRect.y1 / m_sourceHeight; - v[0].tu2 = (sourceRect.x1 / 2.0f) / (m_sourceWidth>>1); - v[0].tv2 = (sourceRect.y1 / 2.0f) / (m_sourceHeight>>1); + v[0].tu2 = v[0].tu3 = (sourceRect.x1 / 2.0f + CHROMAOFFSET_HORIZ) / (m_sourceWidth>>1); + v[0].tv2 = v[0].tv3 = (sourceRect.y1 / 2.0f + CHROMAOFFSET_HORIZ) / (m_sourceHeight>>1); - v[1].x = m_dest[1].x; - v[1].y = m_dest[1].y; - v[1].z = 0.0f; + v[1].x = destRect.x2; + v[1].y = destRect.y1; v[1].tu = sourceRect.x2 / m_sourceWidth; v[1].tv = sourceRect.y1 / m_sourceHeight; - v[1].tu2 = (sourceRect.x2 / 2.0f) / (m_sourceWidth>>1); - v[1].tv2 = (sourceRect.y1 / 2.0f) / (m_sourceHeight>>1); + v[1].tu2 = v[1].tu3 = (sourceRect.x2 / 2.0f + CHROMAOFFSET_HORIZ) / (m_sourceWidth>>1); + v[1].tv2 = v[1].tv3 = (sourceRect.y1 / 2.0f + CHROMAOFFSET_HORIZ) / (m_sourceHeight>>1); - v[2].x = m_dest[2].x; - v[2].y = m_dest[2].y; - v[2].z = 0.0f; + v[2].x = destRect.x2; + v[2].y = destRect.y2; v[2].tu = sourceRect.x2 / m_sourceWidth; v[2].tv = sourceRect.y2 / m_sourceHeight; - v[2].tu2 = (sourceRect.x2 / 2.0f) / (m_sourceWidth>>1); - v[2].tv2 = (sourceRect.y2 / 2.0f) / (m_sourceHeight>>1); + v[2].tu2 = v[2].tu3 = (sourceRect.x2 / 2.0f + CHROMAOFFSET_HORIZ) / (m_sourceWidth>>1); + v[2].tv2 = v[2].tv3 = (sourceRect.y2 / 2.0f + CHROMAOFFSET_HORIZ) / (m_sourceHeight>>1); - v[3].x = m_dest[3].x; - v[3].y = m_dest[3].y; - v[3].z = 0.0f; + v[3].x = destRect.x1; + v[3].y = destRect.y2; v[3].tu = sourceRect.x1 / m_sourceWidth; v[3].tv = sourceRect.y2 / m_sourceHeight; - v[3].tu2 = (sourceRect.x1 / 2.0f) / (m_sourceWidth>>1); - v[3].tv2 = (sourceRect.y2 / 2.0f) / (m_sourceHeight>>1); + v[3].tu2 = v[3].tu3 = (sourceRect.x1 / 2.0f + CHROMAOFFSET_HORIZ) / (m_sourceWidth>>1); + v[3].tv2 = v[3].tv3 = (sourceRect.y2 / 2.0f + CHROMAOFFSET_HORIZ) / (m_sourceHeight>>1); + // -0.5 offset to compensate for D3D rasterization + // set z and rhw + for(int i = 0; i < 4; i++) + { + v[i].x -= 0.5; + v[i].y -= 0.5; + v[i].z = 0.0f; + v[i].rhw = 1.0f; + } CWinShader::UnlockVertexBuffer(); } @@ -386,22 +401,40 @@ void CYUV2RGBShader::SetShaderParameters(YUVBuffer* YUVbuf) { - m_effect.SetTechnique("YUV2RGB_T"); - SVideoPlane *planes = YUVbuf->planes; - ID3D11ShaderResourceView* ppSRView[3] = - { - planes[0].texture.GetShaderResource(), - planes[1].texture.GetShaderResource(), - planes[2].texture.GetShaderResource(), - }; - m_effect.SetResources("g_Texture", ppSRView, YUVbuf->GetActivePlanes()); m_effect.SetMatrix("g_ColorMatrix", m_matrix.Matrix()); + m_effect.SetTechnique("YUV2RGB_T"); + m_effect.SetTexture("g_YTexture", m_YUVPlanes[0]); + if (YUVbuf->GetActivePlanes() > 1) + m_effect.SetTexture("g_UTexture", m_YUVPlanes[1]); + if (YUVbuf->GetActivePlanes() > 2) + m_effect.SetTexture("g_VTexture", m_YUVPlanes[2]); m_effect.SetFloatArray("g_StepXY", m_texSteps, ARRAY_SIZE(m_texSteps)); +} + +bool CYUV2RGBShader::UploadToGPU(YUVBuffer* YUVbuf) +{ + const POINT point = { 0, 0 }; + + for (unsigned int i = 0; iGetActivePlanes(); i++) + { + const RECT rect = { 0, 0, YUVbuf->planes[i].texture.GetWidth(), YUVbuf->planes[i].texture.GetHeight() }; + IDirect3DSurface9 *src, *dest; + if(FAILED(YUVbuf->planes[i].texture.Get()->GetSurfaceLevel(0, &src))) + CLog::Log(LOGERROR, __FUNCTION__": Failed to retrieve level 0 surface for source YUV plane %d", i); + if (FAILED(m_YUVPlanes[i].Get()->GetSurfaceLevel(0, &dest))) + CLog::Log(LOGERROR, __FUNCTION__": Failed to retrieve level 0 surface for destination YUV plane %d", i); - UINT numPorts = 1; - D3D11_VIEWPORT viewPort; - g_Windowing.Get3D11Context()->RSGetViewports(&numPorts, &viewPort); - m_effect.SetFloatArray("g_viewPort", &viewPort.Width, 2); + if (FAILED(g_Windowing.Get3DDevice()->UpdateSurface(src, &rect, dest, &point))) + { + CLog::Log(LOGERROR, __FUNCTION__": Failed to copy plane %d from sysmem to vidmem.", i); + src->Release(); + dest->Release(); + return false; + } + src->Release(); + dest->Release(); + } + return true; } //================================================================================== @@ -414,21 +447,21 @@ bool CConvolutionShader::ChooseKernelD3DFormat() { - if (g_Windowing.IsFormatSupport(DXGI_FORMAT_R16G16B16A16_FLOAT, D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) + if (g_Windowing.IsTextureFormatOk(D3DFMT_A16B16G16R16F, 0)) { - m_KernelFormat = DXGI_FORMAT_R16G16B16A16_FLOAT; + m_KernelFormat = D3DFMT_A16B16G16R16F; m_floattex = true; m_rgba = true; } - else if (g_Windowing.IsFormatSupport(DXGI_FORMAT_R8G8B8A8_UNORM, D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) + else if (g_Windowing.IsTextureFormatOk(D3DFMT_A8B8G8R8, 0)) { - m_KernelFormat = DXGI_FORMAT_R8G8B8A8_UNORM; + m_KernelFormat = D3DFMT_A8B8G8R8; m_floattex = false; m_rgba = true; } - else if (g_Windowing.IsFormatSupport(DXGI_FORMAT_B8G8R8A8_UNORM, D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) + else if (g_Windowing.IsTextureFormatOk(D3DFMT_A8R8G8B8, 0)) { - m_KernelFormat = DXGI_FORMAT_B8G8R8A8_UNORM; + m_KernelFormat = D3DFMT_A8R8G8B8; m_floattex = false; m_rgba = false; } @@ -441,30 +474,38 @@ bool CConvolutionShader::CreateHQKernel(ESCALINGMETHOD method) { CConvolutionKernel kern(method, 256); + + if (!m_HQKernelTexture.Create(kern.GetSize(), 1, 1, g_Windowing.DefaultD3DUsage(), m_KernelFormat, g_Windowing.DefaultD3DPool())) + { + CLog::Log(LOGERROR, __FUNCTION__": Failed to create kernel texture."); + return false; + } + void *kernelVals; int kernelValsSize; if (m_floattex) { float *rawVals = kern.GetFloatPixels(); - HALF* float16Vals = new HALF[kern.GetSize() * 4]; - - XMConvertFloatToHalfStream(float16Vals, sizeof(HALF), rawVals, sizeof(float), kern.GetSize()*4); + D3DXFLOAT16* float16Vals = new D3DXFLOAT16[kern.GetSize()*4]; + for(int i = 0; i < kern.GetSize()*4; i++) + float16Vals[i] = rawVals[i]; kernelVals = float16Vals; - kernelValsSize = sizeof(HALF)*kern.GetSize() * 4; + kernelValsSize = sizeof(D3DXFLOAT16)*kern.GetSize()*4; } else { kernelVals = kern.GetUint8Pixels(); - kernelValsSize = sizeof(uint8_t)*kern.GetSize() * 4; + kernelValsSize = sizeof(uint8_t)*kern.GetSize()*4; } - if (!m_HQKernelTexture.Create(kern.GetSize(), 1, 1, D3D11_USAGE_IMMUTABLE, m_KernelFormat, kernelVals, kernelValsSize)) - { - CLog::Log(LOGERROR, __FUNCTION__": Failed to create kernel texture."); - return false; - } + D3DLOCKED_RECT lr; + if (!m_HQKernelTexture.LockRect(0, &lr, NULL, D3DLOCK_DISCARD)) + CLog::Log(LOGERROR, __FUNCTION__": Failed to lock kernel texture."); + memcpy(lr.pBits, kernelVals, kernelValsSize); + if (!m_HQKernelTexture.UnlockRect(0)) + CLog::Log(LOGERROR, __FUNCTION__": Failed to unlock kernel texture."); if (m_floattex) delete[] kernelVals; @@ -498,7 +539,7 @@ return false; } - CWinShader::CreateVertexBuffer(4, sizeof(CUSTOMVERTEX)); + CWinShader::CreateVertexBuffer(D3DFVF_XYZRHW | D3DFVF_TEX1, 4, sizeof(CUSTOMVERTEX), 2); DefinesMap defines; if (m_floattex) @@ -515,26 +556,19 @@ if (!CreateHQKernel(method)) return false; - // Create input layout - D3D11_INPUT_ELEMENT_DESC layout[] = - { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - }; - return CWinShader::CreateInputLayout(layout, ARRAYSIZE(layout)); + return true; } void CConvolutionShader1Pass::Render(CD3DTexture &sourceTexture, unsigned int sourceWidth, unsigned int sourceHeight, unsigned int destWidth, unsigned int destHeight, CRect sourceRect, - CRect destRect, - bool useLimitedRange) + CRect destRect) { PrepareParameters(sourceWidth, sourceHeight, sourceRect, destRect); float texSteps[] = { 1.0f/(float)sourceWidth, 1.0f/(float)sourceHeight}; - SetShaderParameters(sourceTexture, &texSteps[0], ARRAY_SIZE(texSteps), useLimitedRange); - Execute(nullptr, 4); + SetShaderParameters(sourceTexture, &texSteps[0], ARRAY_SIZE(texSteps)); + Execute(NULL,4); } void CConvolutionShader1Pass::PrepareParameters(unsigned int sourceWidth, unsigned int sourceHeight, @@ -554,53 +588,49 @@ v[0].x = destRect.x1; v[0].y = destRect.y1; - v[0].z = 0; v[0].tu = sourceRect.x1 / sourceWidth; v[0].tv = sourceRect.y1 / sourceHeight; v[1].x = destRect.x2; v[1].y = destRect.y1; - v[1].z = 0; v[1].tu = sourceRect.x2 / sourceWidth; v[1].tv = sourceRect.y1 / sourceHeight; v[2].x = destRect.x2; v[2].y = destRect.y2; - v[2].z = 0; v[2].tu = sourceRect.x2 / sourceWidth; v[2].tv = sourceRect.y2 / sourceHeight; v[3].x = destRect.x1; v[3].y = destRect.y2; - v[3].z = 0; v[3].tu = sourceRect.x1 / sourceWidth; v[3].tv = sourceRect.y2 / sourceHeight; + // -0.5 offset to compensate for D3D rasterization + // set z and rhw + for(int i = 0; i < 4; i++) + { + v[i].x -= 0.5; + v[i].y -= 0.5; + v[i].z = 0.0f; + v[i].rhw = 1.0f; + } + CWinShader::UnlockVertexBuffer(); } } -void CConvolutionShader1Pass::SetShaderParameters(CD3DTexture &sourceTexture, float* texSteps, int texStepsCount, bool useLimitedRange) +void CConvolutionShader1Pass::SetShaderParameters(CD3DTexture &sourceTexture, float* texSteps, int texStepsCount) { m_effect.SetTechnique( "SCALER_T" ); m_effect.SetTexture( "g_Texture", sourceTexture ) ; m_effect.SetTexture( "g_KernelTexture", m_HQKernelTexture ); m_effect.SetFloatArray("g_StepXY", texSteps, texStepsCount); - UINT numVP = 1; - D3D11_VIEWPORT viewPort = {}; - g_Windowing.Get3D11Context()->RSGetViewports(&numVP, &viewPort); - m_effect.SetFloatArray("g_viewPort", &viewPort.Width, 2); - float colorRange[2] = - { - (useLimitedRange ? 16.f : 0.f) / 255.f, - (useLimitedRange ? (235.f - 16.f) : 255.f) / 255.f, - }; - m_effect.SetFloatArray("g_colorRange", colorRange, _countof(colorRange)); } //================================================================================== -CConvolutionShaderSeparable::CConvolutionShaderSeparable() : CConvolutionShader() +CConvolutionShaderSeparable::CConvolutionShaderSeparable() { m_sourceWidth = -1; m_sourceHeight = -1; @@ -640,7 +670,7 @@ return false; } - CWinShader::CreateVertexBuffer(8, sizeof(CUSTOMVERTEX)); + CWinShader::CreateVertexBuffer(D3DFVF_XYZRHW | D3DFVF_TEX1, 8, sizeof(CUSTOMVERTEX), 2); DefinesMap defines; if (m_floattex) @@ -657,55 +687,50 @@ if (!CreateHQKernel(method)) return false; - // Create input layout - D3D11_INPUT_ELEMENT_DESC layout[] = - { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - }; - return CWinShader::CreateInputLayout(layout, ARRAYSIZE(layout)); + return true; } void CConvolutionShaderSeparable::Render(CD3DTexture &sourceTexture, unsigned int sourceWidth, unsigned int sourceHeight, unsigned int destWidth, unsigned int destHeight, CRect sourceRect, - CRect destRect, - bool useLimitedRange) + CRect destRect) { + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + if(m_destWidth != destWidth || m_sourceHeight != sourceHeight) CreateIntermediateRenderTarget(destWidth, sourceHeight); PrepareParameters(sourceWidth, sourceHeight, destWidth, destHeight, sourceRect, destRect); - float texSteps[] = - { - 1.0f / static_cast(sourceWidth), - 1.0f / static_cast(sourceHeight), - 1.0f / static_cast(destWidth), - 1.0f / static_cast(sourceHeight) - }; - SetShaderParameters(sourceTexture, texSteps, 4, useLimitedRange); - - Execute(nullptr, 4); - - // we changed view port, so we need to restore our real viewport. - g_Windowing.RestoreViewPort(); + float texSteps1[] = { 1.0f/(float)sourceWidth, 1.0f/(float)sourceHeight}; + float texSteps2[] = { 1.0f/(float)destWidth, 1.0f/(float)(sourceHeight)}; + SetShaderParameters(sourceTexture, &texSteps1[0], ARRAY_SIZE(texSteps1), &texSteps2[0], ARRAY_SIZE(texSteps2)); + + // This part should be cleaned up, but how? + std::vector rts; + LPDIRECT3DSURFACE9 intRT, currentRT; + m_IntermediateTarget.GetSurfaceLevel(0, &intRT); + pD3DDevice->GetRenderTarget(0, ¤tRT); + rts.push_back(intRT); + rts.push_back(currentRT); + Execute(&rts, 4); + intRT->Release(); + currentRT->Release(); } CConvolutionShaderSeparable::~CConvolutionShaderSeparable() { if (m_IntermediateTarget.Get()) m_IntermediateTarget.Release(); - SAFE_RELEASE(m_oldRenderTarget); } bool CConvolutionShaderSeparable::ChooseIntermediateD3DFormat() { - D3D11_FORMAT_SUPPORT usage = D3D11_FORMAT_SUPPORT_RENDER_TARGET; + DWORD usage = D3DUSAGE_RENDERTARGET; // Need a float texture, as the output of the first pass can contain negative values. - if (g_Windowing.IsFormatSupport(DXGI_FORMAT_R16G16B16A16_FLOAT, usage)) m_IntermediateFormat = DXGI_FORMAT_R16G16B16A16_FLOAT; - else if (g_Windowing.IsFormatSupport(DXGI_FORMAT_R32G32B32A32_FLOAT, usage)) m_IntermediateFormat = DXGI_FORMAT_R32G32B32A32_FLOAT; + if (g_Windowing.IsTextureFormatOk(D3DFMT_A16B16G16R16F, usage)) m_IntermediateFormat = D3DFMT_A16B16G16R16F; + else if (g_Windowing.IsTextureFormatOk(D3DFMT_A32B32G32R32F, usage)) m_IntermediateFormat = D3DFMT_A32B32G32R32F; else { CLog::Log(LOGNOTICE, __FUNCTION__": no float format available for the intermediate render target"); @@ -722,7 +747,7 @@ if (m_IntermediateTarget.Get()) m_IntermediateTarget.Release(); - if (!m_IntermediateTarget.Create(width, height, 1, D3D11_USAGE_DEFAULT, m_IntermediateFormat)) + if(!m_IntermediateTarget.Create(width, height, 1, D3DUSAGE_RENDERTARGET, m_IntermediateFormat, D3DPOOL_DEFAULT)) { CLog::Log(LOGERROR, __FUNCTION__": render target creation failed."); return false; @@ -732,9 +757,26 @@ bool CConvolutionShaderSeparable::ClearIntermediateRenderTarget() { - float color[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - ID3D11RenderTargetView* intermediateRT = m_IntermediateTarget.GetRenderTarget(); - g_Windowing.Get3D11Context()->ClearRenderTargetView(intermediateRT, color); + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + + LPDIRECT3DSURFACE9 currentRT; + pD3DDevice->GetRenderTarget(0, ¤tRT); + + LPDIRECT3DSURFACE9 intermediateRT; + m_IntermediateTarget.GetSurfaceLevel(0, &intermediateRT); + + pD3DDevice->SetRenderTarget(0, intermediateRT); + + pD3DDevice->Clear(0L, NULL, D3DCLEAR_TARGET, 0L, 1.0f, 0L); + + pD3DDevice->SetRenderTarget(0, currentRT); + currentRT->Release(); + intermediateRT->Release(); + + // MSDN says: Setting a new render target will cause the viewport + // to be set to the full size of the new render target. + // So we need restore our viewport + g_Windowing.RestoreViewPort(); return true; } @@ -747,6 +789,10 @@ || m_destWidth != destWidth || m_destHeight != destHeight || m_sourceRect != sourceRect || m_destRect != destRect) { + // fixme better: clearing the whole render target when changing the source/dest rect is not optimal. + // Problem is that the edges of the final picture may retain content when the rects change. + // For example when changing zoom value, the edges can retain content from the previous zoom value. + // Playing with coordinates was unsuccessful so far, this is a quick fix for release. ClearIntermediateRenderTarget(); m_sourceWidth = sourceWidth; @@ -761,7 +807,7 @@ // Alter rectangles the destination rectangle exceeds the intermediate target width when zooming and causes artifacts. // Work on the parameters rather than the members to avoid disturbing the parameter change detection the next time the function is called - CRect tgtRect(0, 0, static_cast(destWidth), static_cast(destHeight)); + CRect tgtRect(0, 0, destWidth, destHeight); CWIN32Util::CropSource(sourceRect, destRect, tgtRect); // Manipulate the coordinates to work only on the active parts of the textures, @@ -774,25 +820,21 @@ v[0].x = 0; v[0].y = 0; - v[0].z = 0; v[0].tu = sourceRect.x1 / sourceWidth; v[0].tv = sourceRect.y1 / sourceHeight; v[1].x = destRect.x2 - destRect.x1; v[1].y = 0; - v[1].z = 0; v[1].tu = sourceRect.x2 / sourceWidth; v[1].tv = sourceRect.y1 / sourceHeight; v[2].x = destRect.x2 - destRect.x1; v[2].y = sourceRect.y2 - sourceRect.y1; - v[2].z = 0; v[2].tu = sourceRect.x2 / sourceWidth; v[2].tv = sourceRect.y2 / sourceHeight; v[3].x = 0; v[3].y = sourceRect.y2 - sourceRect.y1; - v[3].z = 0; v[3].tu = sourceRect.x1 / sourceWidth; v[3].tv = sourceRect.y2 / sourceHeight; @@ -800,127 +842,58 @@ v[4].x = destRect.x1; v[4].y = destRect.y1; - v[4].z = 0; v[4].tu = 0; v[4].tv = 0; v[5].x = destRect.x2; v[5].y = destRect.y1; - v[5].z = 0; v[5].tu = (destRect.x2 - destRect.x1) / destWidth; v[5].tv = 0; v[6].x = destRect.x2; v[6].y = destRect.y2; - v[6].z = 0; v[6].tu = (destRect.x2 - destRect.x1) / destWidth; v[6].tv = (sourceRect.y2 - sourceRect.y1) / sourceHeight; v[7].x = destRect.x1; v[7].y = destRect.y2; - v[7].z = 0; v[7].tu = 0; v[7].tv = (sourceRect.y2 - sourceRect.y1) / sourceHeight; + // -0.5 offset to compensate for D3D rasterization + // set z and rhw + for(int i = 0; i < 8; i++) + { + v[i].x -= 0.5; + v[i].y -= 0.5; + v[i].z = 0.0f; + v[i].rhw = 1.0f; + } + CWinShader::UnlockVertexBuffer(); } } -void CConvolutionShaderSeparable::SetShaderParameters(CD3DTexture &sourceTexture, float* texSteps, int texStepsCount, bool useLimitedRange) +void CConvolutionShaderSeparable::SetShaderParameters(CD3DTexture &sourceTexture, float* texSteps1, int texStepsCount1, float* texSteps2, int texStepsCount2) { m_effect.SetTechnique( "SCALER_T" ); - m_effect.SetTexture( "g_Texture", sourceTexture ); + m_effect.SetTexture( "g_Texture", sourceTexture ) ; m_effect.SetTexture( "g_KernelTexture", m_HQKernelTexture ); - m_effect.SetFloatArray("g_StepXY", texSteps, texStepsCount); - float colorRange[2] = - { - (useLimitedRange ? 16.f : 0.f) / 255.f, - (useLimitedRange ? (235.f - 16.f) : 255.f) / 255.f, - }; - m_effect.SetFloatArray("g_colorRange", colorRange, _countof(colorRange)); -} - -void CConvolutionShaderSeparable::SetStepParams(UINT iPass) -{ - CD3D11_VIEWPORT viewPort(.0f, .0f, .0f, .0f); - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - - if (iPass == 0) - { - // store old RT - pContext->OMGetRenderTargets(1, &m_oldRenderTarget, nullptr); - // setting new RT - ID3D11RenderTargetView* newRT = m_IntermediateTarget.GetRenderTarget(); - pContext->OMSetRenderTargets(1, &newRT, nullptr); - // new viewport - viewPort = CD3D11_VIEWPORT(0.0f, 0.0f, - static_cast(m_IntermediateTarget.GetWidth()), - static_cast(m_IntermediateTarget.GetHeight())); - // reset scissor - g_Windowing.ResetScissors(); - } - else if (iPass == 1) - { - if (m_oldRenderTarget) - { - // get dimention of old render target - ID3D11Resource* rtResource = nullptr; - m_oldRenderTarget->GetResource(&rtResource); - ID3D11Texture2D* rtTexture = nullptr; - if (SUCCEEDED(rtResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&rtTexture)))) - { - D3D11_TEXTURE2D_DESC rtDescr = {}; - rtTexture->GetDesc(&rtDescr); - viewPort = CD3D11_VIEWPORT(0.0f, 0.0f, - static_cast(rtDescr.Width), - static_cast(rtDescr.Height)); - } - SAFE_RELEASE(rtTexture); - SAFE_RELEASE(rtResource); - } - else - { - // current RT is null so try to restore viewport - CRect winViewPort; - g_Windowing.GetViewPort(winViewPort); - viewPort = CD3D11_VIEWPORT(winViewPort.x1, winViewPort.y1, winViewPort.Width(), winViewPort.Height()); - } - pContext->OMSetRenderTargets(1, &m_oldRenderTarget, nullptr); - SAFE_RELEASE(m_oldRenderTarget); - // at the second pass m_IntermediateTarget is a source of data - m_effect.SetTexture("g_Texture", m_IntermediateTarget); - // restore scissor - g_Windowing.SetScissors(g_graphicsContext.StereoCorrection(g_graphicsContext.GetScissors())); - } - // seting view port - pContext->RSSetViewports(1, &viewPort); - // pass viewport dimention to the shaders - m_effect.SetFloatArray("g_viewPort", &viewPort.Width, 2); + m_effect.SetTexture( "g_IntermediateTexture", m_IntermediateTarget ) ; + m_effect.SetFloatArray("g_StepXY_P0", texSteps1, texStepsCount1); + m_effect.SetFloatArray("g_StepXY_P1", texSteps2, texStepsCount2); } + //========================================================== -#define SHADER_SOURCE(...) #__VA_ARGS__ bool CTestShader::Create() { - std::string strShader = SHADER_SOURCE( - float4 TEST() : SV_TARGET - { - return float4(0.0, 0.0, 0.0, 0.0); - } - - technique11 TEST_T - { - pass P0 - { - SetPixelShader(CompileShader(ps_4_0_level_9_1, TEST())); - } - }; - ); + std::string effectString = "special://xbmc/system/shaders/testshader.fx"; - if (!m_effect.Create(strShader, nullptr)) + if(!LoadEffect(effectString, NULL)) { - CLog::Log(LOGERROR, __FUNCTION__": Failed to create test shader: %s", strShader.c_str()); + CLog::Log(LOGERROR, __FUNCTION__": Failed to load shader %s.", effectString.c_str()); return false; } return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.h kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,25 +25,22 @@ #include "../../guilib/Geometry.h" #include "../WinRenderer.h" #include "../RenderFormats.h" -#include -using namespace DirectX; class CYUV2RGBMatrix { public: CYUV2RGBMatrix(); void SetParameters(float contrast, float blacklevel, unsigned int flags, ERenderFormat format); - XMFLOAT4X4* Matrix(); + D3DXMATRIX* Matrix(); private: bool m_NeedRecalc; float m_contrast; float m_blacklevel; unsigned int m_flags; - bool m_limitedRange; ERenderFormat m_format; - XMFLOAT4X4 m_mat; + D3DXMATRIX m_mat; }; class CWinShader @@ -51,26 +48,25 @@ protected: CWinShader() : m_vbsize(0), + m_FVF(0), m_vertsize(0), - m_inputLayout(nullptr) + m_primitivesCount(0) {} virtual ~CWinShader(); - virtual bool CreateVertexBuffer(unsigned int vertCount, unsigned int vertSize); + virtual bool CreateVertexBuffer(DWORD FVF, unsigned int vertCount, unsigned int vertSize, unsigned int primitivesCount); virtual bool LockVertexBuffer(void **data); virtual bool UnlockVertexBuffer(); virtual bool LoadEffect(const std::string& filename, DefinesMap* defines); - virtual bool Execute(std::vector *vecRT, unsigned int vertexIndexStep); - virtual void SetStepParams(UINT stepIndex) { } - virtual bool CreateInputLayout(D3D11_INPUT_ELEMENT_DESC *layout, unsigned numElements); + virtual bool Execute(std::vector *vecRT, unsigned int vertexIndexStep); CD3DEffect m_effect; private: - CD3DBuffer m_vb; - CD3DBuffer m_ib; - unsigned int m_vbsize; - unsigned int m_vertsize; - ID3D11InputLayout* m_inputLayout; + CD3DVertexBuffer m_vb; + unsigned int m_vbsize; + DWORD m_FVF; + unsigned int m_vertsize; + unsigned int m_primitivesCount; }; class CYUV2RGBShader : public CWinShader @@ -78,7 +74,7 @@ public: virtual bool Create(unsigned int sourceWidth, unsigned int sourceHeight, ERenderFormat fmt); virtual void Render(CRect sourceRect, - CPoint dest[], + CRect destRect, float contrast, float brightness, unsigned int flags, @@ -86,7 +82,7 @@ CYUV2RGBShader() : m_sourceWidth (0), m_sourceHeight(0), - m_format (RENDER_FMT_NONE) + m_format (RENDER_FMT_NONE) { memset(&m_texSteps,0,sizeof(m_texSteps)); } @@ -94,24 +90,27 @@ protected: virtual void PrepareParameters(CRect sourceRect, - CPoint dest[], + CRect destRect, float contrast, float brightness, unsigned int flags); virtual void SetShaderParameters(YUVBuffer* YUVbuf); + virtual bool UploadToGPU(YUVBuffer* YUVbuf); private: - CYUV2RGBMatrix m_matrix; - unsigned int m_sourceWidth, m_sourceHeight; - CRect m_sourceRect; - CPoint m_dest[4]; - ERenderFormat m_format; - float m_texSteps[2]; + CYUV2RGBMatrix m_matrix; + unsigned int m_sourceWidth, m_sourceHeight; + CRect m_sourceRect, m_destRect; + ERenderFormat m_format; + CD3DTexture m_YUVPlanes[3]; + float m_texSteps[2]; struct CUSTOMVERTEX { FLOAT x, y, z; + FLOAT rhw; FLOAT tu, tv; // Y Texture coordinates - FLOAT tu2, tv2; // U and V Textures coordinates + FLOAT tu2, tv2; // U Texture coordinates + FLOAT tu3, tv3; // V Texture coordinates }; }; @@ -123,22 +122,21 @@ unsigned int sourceWidth, unsigned int sourceHeight, unsigned int destWidth, unsigned int destHeight, CRect sourceRect, - CRect destRect, - bool useLimitedRange) = 0; - CConvolutionShader() : CWinShader() {} + CRect destRect) = 0; virtual ~CConvolutionShader(); protected: virtual bool ChooseKernelD3DFormat(); virtual bool CreateHQKernel(ESCALINGMETHOD method); - CD3DTexture m_HQKernelTexture; - DXGI_FORMAT m_KernelFormat; - bool m_floattex; - bool m_rgba; + CD3DTexture m_HQKernelTexture; + D3DFORMAT m_KernelFormat; + bool m_floattex; + bool m_rgba; struct CUSTOMVERTEX { FLOAT x, y, z; + FLOAT rhw; FLOAT tu, tv; }; }; @@ -151,15 +149,14 @@ unsigned int sourceWidth, unsigned int sourceHeight, unsigned int destWidth, unsigned int destHeight, CRect sourceRect, - CRect destRect, - bool useLimitedRange); - CConvolutionShader1Pass() : CConvolutionShader(), m_sourceWidth(0), m_sourceHeight(0) {} + CRect destRect); + CConvolutionShader1Pass() : m_sourceWidth (0), m_sourceHeight(0) {} protected: virtual void PrepareParameters(unsigned int sourceWidth, unsigned int sourceHeight, CRect sourceRect, CRect destRect); - virtual void SetShaderParameters(CD3DTexture &sourceTexture, float* texSteps, int texStepsCount, bool useLimitedRange); + virtual void SetShaderParameters(CD3DTexture &sourceTexture, float* texSteps, int texStepsCount); private: @@ -176,8 +173,7 @@ unsigned int sourceWidth, unsigned int sourceHeight, unsigned int destWidth, unsigned int destHeight, CRect sourceRect, - CRect destRect, - bool useLimitedRange); + CRect destRect); virtual ~CConvolutionShaderSeparable(); protected: @@ -188,16 +184,14 @@ unsigned int destWidth, unsigned int destHeight, CRect sourceRect, CRect destRect); - virtual void SetShaderParameters(CD3DTexture &sourceTexture, float* texSteps, int texStepsCount, bool useLimitedRange); - virtual void SetStepParams(UINT stepIndex); + virtual void SetShaderParameters(CD3DTexture &sourceTexture, float* texSteps1, int texStepsCount1, float* texSteps2, int texStepsCount2); private: CD3DTexture m_IntermediateTarget; - DXGI_FORMAT m_IntermediateFormat; + D3DFORMAT m_IntermediateFormat; unsigned int m_sourceWidth, m_sourceHeight; unsigned int m_destWidth, m_destHeight; CRect m_sourceRect, m_destRect; - ID3D11RenderTargetView* m_oldRenderTarget = nullptr; }; class CTestShader : public CWinShader diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -142,6 +142,7 @@ #if defined(HAS_GL) || HAS_GLES == 2 using namespace Shaders; +using namespace std; static void CalculateYUVMatrixGL(GLfloat res[4][4] , unsigned int flags @@ -366,7 +367,7 @@ m_black = 0.0f; m_contrast = 1.0f; - std::string shaderfile; + string shaderfile; if (m_format == RENDER_FMT_YUYV422) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h 2015-10-19 08:39:16.000000000 +0000 @@ -103,7 +103,7 @@ float m_contrast; float m_stretch; - std::string m_defines; + string m_defines; // shader attribute handles GLint m_hYTex; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/WinRenderer.cpp kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/WinRenderer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/WinRenderer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/WinRenderer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,9 +20,9 @@ #ifdef HAS_DX +#include "Util.h" #include "WinRenderer.h" #include "cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h" -#include "cores/FFmpeg.h" #include "dialogs/GUIDialogKaiToast.h" #include "guilib/LocalizeStrings.h" #include "settings/AdvancedSettings.h" @@ -30,12 +30,11 @@ #include "settings/MediaSettings.h" #include "settings/Settings.h" #include "threads/SingleLock.h" -#include "utils/CPUInfo.h" #include "utils/log.h" -#include "utils/win32/gpu_memcpy_sse4.h" +#include "utils/SystemInfo.h" #include "VideoShaders/WinVideoFilter.h" -#include "win32/WIN32Util.h" #include "windowing/WindowingFactory.h" +#include "cores/FFmpeg.h" typedef struct { RenderMethod method; @@ -55,7 +54,7 @@ if (RenderMethodDetails[i].method == m) return &RenderMethodDetails[i]; } - return nullptr; + return NULL; } CWinRenderer::CWinRenderer() @@ -63,8 +62,8 @@ m_iYV12RenderBuffer = 0; m_NumYV12Buffers = 0; - m_colorShader = nullptr; - m_scalerShader = nullptr; + m_colorShader = NULL; + m_scalerShader = NULL; m_extended_format = 0; m_iRequestedMethod = RENDER_METHOD_AUTO; @@ -72,20 +71,21 @@ m_renderMethod = RENDER_PS; m_scalingMethod = VS_SCALINGMETHOD_LINEAR; m_scalingMethodGui = (ESCALINGMETHOD)-1; - m_TextureFilter = SHADER_SAMPLER_POINT; + m_TextureFilter = D3DTEXF_POINT; m_bUseHQScaler = false; m_bFilterInitialized = false; for (int i = 0; iOpen(m_sourceWidth, m_sourceHeight, m_iFlags, m_format, m_extended_format)) { @@ -163,6 +163,8 @@ // Drop through to pixel shader case RENDER_METHOD_AUTO: case RENDER_METHOD_D3D_PS: + // Try the pixel shaders support + if (m_deviceCaps.PixelShaderVersion >= D3DPS_VERSION(2, 0)) { CTestShader shader; if (shader.Create()) @@ -177,8 +179,12 @@ CLog::Log(LOGNOTICE, "D3D: unable to load test shader - D3D installation is most likely incomplete"); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, "DirectX", g_localizeStrings.Get(2101)); } - CLog::Log(LOGNOTICE, "D3D: falling back to SW mode"); } + else + { + CLog::Log(LOGNOTICE, "D3D: graphics adapter does not support Pixel Shaders 2.0"); + } + CLog::Log(LOGNOTICE, "D3D: falling back to SW mode"); // drop through to software case RENDER_METHOD_SOFTWARE: default: @@ -189,7 +195,7 @@ } RenderMethodDetail *rmdet = FindRenderMethod(m_renderMethod); - CLog::Log(LOGDEBUG, __FUNCTION__": Selected render method %d: %s", m_renderMethod, rmdet != nullptr ? rmdet->name : "unknown"); + CLog::Log(LOGDEBUG, __FUNCTION__": Selected render method %d: %s", m_renderMethod, rmdet != NULL ? rmdet->name : "unknown"); m_frameIdx = 0; } @@ -200,7 +206,7 @@ if (m_renderMethod == RENDER_SW) { - if (!m_SWTarget.Create(m_sourceWidth, m_sourceHeight, 1, D3D11_USAGE_DYNAMIC, DXGI_FORMAT_B8G8R8X8_UNORM)) + if(!m_SWTarget.Create(m_sourceWidth, m_sourceHeight, 1, D3DUSAGE_DYNAMIC, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT)) { CLog::Log(LOGNOTICE, __FUNCTION__": Failed to create sw render target."); return false; @@ -224,11 +230,11 @@ } else { - if (m_VideoBuffers[m_iYV12RenderBuffer] != nullptr) + if (m_VideoBuffers[m_iYV12RenderBuffer] != NULL) m_VideoBuffers[m_iYV12RenderBuffer]->StartDecode(); m_iYV12RenderBuffer = 0; - if (m_VideoBuffers[0] != nullptr) + if (m_VideoBuffers[0] != NULL) m_VideoBuffers[0]->StartRender(); } @@ -236,14 +242,13 @@ m_iFlags = flags; m_format = format; m_extended_format = extended_format; - m_renderOrientation = orientation; // calculate the input frame aspect ratio CalculateFrameAspectRatio(d_width, d_height); ChooseBestResolution(fps); m_destWidth = g_graphicsContext.GetResInfo(m_resolution).iWidth; m_destHeight = g_graphicsContext.GetResInfo(m_resolution).iHeight; - SetViewMode(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode); + SetViewMode(CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); ManageDisplay(); m_bConfigured = true; @@ -289,18 +294,6 @@ m_frameIdx += 2; return true; } - else if (picture->format == RENDER_FMT_DXVA) - { - int source = index; - if (source < 0 || NextYV12Texture() < 0) - return false; - - YUVBuffer *buf = (YUVBuffer*)m_VideoBuffers[source]; - if (buf->IsReadyToRender()) - return false; - - return buf->CopyFromDXVA(reinterpret_cast(picture->dxva->view)); - } return false; } @@ -331,8 +324,8 @@ for(int i=0;i<3;i++) { - image->stride[i] = buf->planes[i].rect.RowPitch; - image->plane[i] = (BYTE*)buf->planes[i].rect.pData; + image->stride[i] = buf->planes[i].rect.Pitch; + image->plane[i] = (BYTE*)buf->planes[i].rect.pBits; } return source; @@ -355,9 +348,15 @@ void CWinRenderer::RenderUpdate(bool clear, DWORD flags, DWORD alpha) { + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + if (clear) - g_graphicsContext.Clear(g_Windowing.UseLimitedColor() ? 0x101010 : 0); - g_Windowing.SetAlphaBlendEnable(alpha < 255); + g_graphicsContext.Clear(m_clearColour); + + if(alpha < 255) + pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); + else + pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); if (!m_bConfigured) return; @@ -365,7 +364,9 @@ ManageTextures(); CSingleLock lock(g_graphicsContext); + ManageDisplay(); + Render(flags); } @@ -374,7 +375,7 @@ if(source == AUTOSOURCE) source = NextYV12Texture(); - if (m_VideoBuffers[m_iYV12RenderBuffer] != nullptr) + if (m_VideoBuffers[m_iYV12RenderBuffer] != NULL) m_VideoBuffers[m_iYV12RenderBuffer]->StartDecode(); if( source >= 0 && source < m_NumYV12Buffers ) @@ -382,7 +383,7 @@ else m_iYV12RenderBuffer = 0; - if (m_VideoBuffers[m_iYV12RenderBuffer] != nullptr) + if (m_VideoBuffers[m_iYV12RenderBuffer] != NULL) m_VideoBuffers[m_iYV12RenderBuffer]->StartRender(); #ifdef MP_DIRECTRENDERING @@ -397,33 +398,47 @@ CSingleLock lock(g_graphicsContext); m_bConfigured = false; UnInit(); - m_resolution = CDisplaySettings::GetInstance().GetCurrentResolution(); + m_resolution = CDisplaySettings::Get().GetCurrentResolution(); if ( m_resolution == RES_WINDOW ) m_resolution = RES_DESKTOP; + // setup the background colour + m_clearColour = (g_advancedSettings.m_videoBlackBarColour & 0xff) * 0x010101; + + g_Windowing.Get3DDevice()->GetDeviceCaps(&m_deviceCaps); + m_formats.clear(); m_formats.push_back(RENDER_FMT_YUV420P); - m_iRequestedMethod = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_RENDERMETHOD); + m_iRequestedMethod = CSettings::Get().GetInt("videoplayer.rendermethod"); if (g_advancedSettings.m_DXVAForceProcessorRenderer - || m_iRequestedMethod == RENDER_METHOD_DXVA) + || m_iRequestedMethod == RENDER_METHOD_DXVA + || m_iRequestedMethod == RENDER_METHOD_DXVAHD) { - m_processor = new DXVA::CProcessorHD(); - if (!m_processor->PreInit()) + if (m_iRequestedMethod != RENDER_METHOD_DXVA && CSysInfo::IsWindowsVersionAtLeast(CSysInfo::WindowsVersionWin7)) { - CLog::Log(LOGNOTICE, "CWinRenderer::Preinit - could not init DXVA processor - skipping"); - SAFE_DELETE(m_processor); + m_processor = new DXVA::CProcessorHD(); + if (!m_processor->PreInit()) + { + CLog::Log(LOGNOTICE, "CWinRenderer::Preinit - could not init DXVA-HD processor - skipping"); + SAFE_DELETE(m_processor); + } + } + if (!m_processor) + { + m_processor = new DXVA::CProcessor(); + if (!m_processor->PreInit()) + { + CLog::Log(LOGNOTICE, "CWinRenderer::Preinit - could not init DXVA2 processor - skipping"); + SAFE_DELETE(m_processor); + } } - else - m_processor->ApplySupportedFormats(&m_formats); } - // allow other color spaces besides YV12 in case DXVA rendering is not used or not available - if (!m_processor || (m_iRequestedMethod != RENDER_METHOD_DXVA)) + if (!m_processor || (m_iRequestedMethod != RENDER_METHOD_DXVA && m_iRequestedMethod != RENDER_METHOD_DXVAHD)) { - if ( g_Windowing.IsFormatSupport(DXGI_FORMAT_R16_UNORM, D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) - || g_Windowing.IsFormatSupport(DXGI_FORMAT_R16_UNORM, D3D11_FORMAT_SUPPORT_SHADER_LOAD)) + if (g_Windowing.IsTextureFormatOk(D3DFMT_L16, 0)) { m_formats.push_back(RENDER_FMT_YUV420P10); m_formats.push_back(RENDER_FMT_YUV420P16); @@ -459,7 +474,7 @@ if (m_sw_scale_ctx) { sws_freeContext(m_sw_scale_ctx); - m_sw_scale_ctx = nullptr; + m_sw_scale_ctx = NULL; } if (m_processor) @@ -472,7 +487,7 @@ void CWinRenderer::Flush() { PreInit(); - SetViewMode(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode); + SetViewMode(CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); ManageDisplay(); m_bConfigured = true; @@ -483,12 +498,19 @@ bool CWinRenderer::CreateIntermediateRenderTarget(unsigned int width, unsigned int height) { - unsigned int usage = D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE; - - DXGI_FORMAT format = DXGI_FORMAT_B8G8R8X8_UNORM; - if (m_renderMethod == RENDER_DXVA) format = DXGI_FORMAT_B8G8R8X8_UNORM; - else if (g_Windowing.IsFormatSupport(DXGI_FORMAT_B8G8R8A8_UNORM, usage)) format = DXGI_FORMAT_B8G8R8A8_UNORM; - else if (g_Windowing.IsFormatSupport(DXGI_FORMAT_B8G8R8X8_UNORM, usage)) format = DXGI_FORMAT_B8G8R8X8_UNORM; + // Initialize a render target for intermediate rendering + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + D3DFORMAT format = D3DFMT_X8R8G8B8; + DWORD usage = D3DUSAGE_RENDERTARGET; + + if (m_renderMethod == RENDER_DXVA) format = D3DFMT_X8R8G8B8; + else if (g_Windowing.IsTextureFormatOk(D3DFMT_A2R10G10B10, usage)) format = D3DFMT_A2R10G10B10; + else if (g_Windowing.IsTextureFormatOk(D3DFMT_A2B10G10R10, usage)) format = D3DFMT_A2B10G10R10; + else if (g_Windowing.IsTextureFormatOk(D3DFMT_A8R8G8B8, usage)) format = D3DFMT_A8R8G8B8; + else if (g_Windowing.IsTextureFormatOk(D3DFMT_A8B8G8R8, usage)) format = D3DFMT_A8B8G8R8; + else if (g_Windowing.IsTextureFormatOk(D3DFMT_X8R8G8B8, usage)) format = D3DFMT_X8R8G8B8; + else if (g_Windowing.IsTextureFormatOk(D3DFMT_X8B8G8R8, usage)) format = D3DFMT_X8B8G8R8; + else if (g_Windowing.IsTextureFormatOk(D3DFMT_R8G8B8, usage)) format = D3DFMT_R8G8B8; // don't create new one if it exists with requested size and format if ( m_IntermediateTarget.Get() && m_IntermediateTarget.GetFormat() == format @@ -500,9 +522,9 @@ CLog::Log(LOGDEBUG, __FUNCTION__": format %i", format); - if(!m_IntermediateTarget.Create(width, height, 1, D3D11_USAGE_DEFAULT, format)) + if(!m_IntermediateTarget.Create(width, height, 1, usage, format, D3DPOOL_DEFAULT)) { - CLog::Log(LOGERROR, __FUNCTION__": intermediate render target creation failed."); + CLog::Log(LOGERROR, __FUNCTION__": intermediate render target creation failed.", format); return false; } return true; @@ -516,13 +538,13 @@ case VS_SCALINGMETHOD_LINEAR: if (Supports(VS_SCALINGMETHOD_LINEAR)) { - m_TextureFilter = SHADER_SAMPLER_LINEAR; + m_TextureFilter = D3DTEXF_LINEAR; break; } // fall through for fallback case VS_SCALINGMETHOD_NEAREST: default: - m_TextureFilter = SHADER_SAMPLER_POINT; + m_TextureFilter = D3DTEXF_POINT; break; } } @@ -581,8 +603,6 @@ m_bUseHQScaler = true; } } - if (m_renderOrientation) - m_bUseHQScaler = false; } void CWinRenderer::UpdatePSVideoFilter() @@ -601,7 +621,7 @@ } // Fallback on the one pass version - if (m_scalerShader == nullptr) + if (m_scalerShader == NULL) { m_scalerShader = new CConvolutionShader1Pass(); @@ -656,12 +676,12 @@ void CWinRenderer::UpdateVideoFilter() { - if (m_scalingMethodGui == CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ScalingMethod && m_bFilterInitialized) + if (m_scalingMethodGui == CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod && m_bFilterInitialized) return; m_bFilterInitialized = true; - m_scalingMethodGui = CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ScalingMethod; + m_scalingMethodGui = CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod; m_scalingMethod = m_scalingMethodGui; if (!Supports(m_scalingMethod)) @@ -692,9 +712,9 @@ if (m_renderMethod == RENDER_DXVA) { UpdateVideoFilter(); + if (m_bUseHQScaler) + g_Windowing.FlushGPU(); CWinRenderer::RenderProcessor(flags); - if (m_bUseHQScaler) // restore GUI states after HQ scalers - g_Windowing.ApplyStateBlock(); return; } @@ -711,10 +731,20 @@ */ CSingleLock lock(g_graphicsContext); + // Don't need a stencil/depth buffer and a buffer smaller than the render target causes D3D complaints and nVidia issues + // Save & restore when we're done. + LPDIRECT3DSURFACE9 pZBuffer; + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + pD3DDevice->GetDepthStencilSurface(&pZBuffer); + pD3DDevice->SetDepthStencilSurface(NULL); + if (m_renderMethod == RENDER_SW) RenderSW(); else if (m_renderMethod == RENDER_PS) RenderPS(); + + pD3DDevice->SetDepthStencilSurface(pZBuffer); + pZBuffer->Release(); } void CWinRenderer::RenderSW() @@ -723,33 +753,33 @@ // 1. convert yuv to rgb m_sw_scale_ctx = sws_getCachedContext(m_sw_scale_ctx, - m_sourceWidth, m_sourceHeight, format, - m_sourceWidth, m_sourceHeight, PIX_FMT_BGRA, - SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); + m_sourceWidth, m_sourceHeight, format, + m_sourceWidth, m_sourceHeight, PIX_FMT_BGRA, + SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); YUVBuffer* buf = (YUVBuffer*)m_VideoBuffers[m_iYV12RenderBuffer]; - D3D11_MAPPED_SUBRESOURCE srclr[MAX_PLANES]; - uint8_t* src[MAX_PLANES]; - int srcStride[MAX_PLANES]; + D3DLOCKED_RECT srclr[MAX_PLANES]; + uint8_t *src[MAX_PLANES]; + int srcStride[MAX_PLANES]; for (unsigned int idx = 0; idx < buf->GetActivePlanes(); idx++) { - if(!(buf->planes[idx].texture.LockRect(0, &srclr[idx], D3D11_MAP_READ))) + if(!(buf->planes[idx].texture.LockRect(0, &srclr[idx], NULL, D3DLOCK_READONLY))) CLog::Log(LOGERROR, __FUNCTION__" - failed to lock yuv textures into memory"); else { - src[idx] = (uint8_t*)srclr[idx].pData; - srcStride[idx] = srclr[idx].RowPitch; + src[idx] = (uint8_t*)srclr[idx].pBits; + srcStride[idx] = srclr[idx].Pitch; } } - D3D11_MAPPED_SUBRESOURCE destlr; - if (!m_SWTarget.LockRect(0, &destlr, D3D11_MAP_WRITE_DISCARD)) + D3DLOCKED_RECT destlr = {0,0}; + if (!m_SWTarget.LockRect(0, &destlr, NULL, D3DLOCK_DISCARD)) CLog::Log(LOGERROR, __FUNCTION__" - failed to lock swtarget texture into memory"); - uint8_t *dst[] = { (uint8_t*)destlr.pData, 0, 0, 0 }; - int dstStride[] = { destlr.RowPitch, 0, 0, 0 }; + uint8_t *dst[] = { (uint8_t*) destlr.pBits, 0, 0, 0 }; + int dstStride[] = { destlr.Pitch, 0, 0, 0 }; sws_scale(m_sw_scale_ctx, src, srcStride, 0, m_sourceHeight, dst, dstStride); @@ -766,28 +796,150 @@ if ((m_destRect.x1 < 0 && m_destRect.x2 < 0) || (m_destRect.y1 < 0 && m_destRect.y2 < 0)) return; - ScaleGUIShader(); + ScaleFixedPipeline(); +} + +/* +Code kept for reference, as a basis to re-enable StretchRect and +do the color conversion with it. +See IDirect3D9::CheckDeviceFormat() for support of non-standard fourcc textures +and IDirect3D9::CheckDeviceFormatConversion for color conversion support + +void CWinRenderer::ScaleStretchRect() +{ + // Test HW scaler support. StretchRect is slightly faster than drawing a quad. + // If linear filtering is not supported, drop back to quads, as most HW has linear filtering for quads. + //if(m_deviceCaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES + //&& m_deviceCaps.StretchRectFilterCaps & D3DPTFILTERCAPS_MINFLINEAR + //&& m_deviceCaps.StretchRectFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR) + //{ + // m_StretchRectSupported = true; + //} + + CRect sourceRect = m_sourceRect; + CRect destRect = m_destRect; + + D3DSURFACE_DESC desc; + if (FAILED(target->GetDesc(&desc))) + CLog::Log(LOGERROR, "CWinRenderer::Render - failed to get back buffer description"); + CRect tgtRect(0, 0, desc.Width, desc.Height); + + // Need to manipulate the coordinates since StretchRect doesn't accept off-screen coordinates. + CWIN32Util::CropSource(sourceRect, destRect, tgtRect); + + RECT srcRect = { sourceRect.x1, sourceRect.y1, sourceRect.x2, sourceRect.y2 }; + IDirect3DSurface9* source; + if(!m_SWTarget.GetSurfaceLevel(0, &source)) + CLog::Log(LOGERROR, "CWinRenderer::Render - failed to get source"); + + RECT dstRect = { destRect.x1, destRect.y1, destRect.x2, destRect.y2 }; + IDirect3DSurface9* target; + if(FAILED(g_Windowing.Get3DDevice()->GetRenderTarget(0, &target))) + CLog::Log(LOGERROR, "CWinRenderer::Render - failed to get back buffer"); + + HRESULT hr; + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + + if(FAILED(hr = pD3DDevice->StretchRect(source, &srcRect, target, &dstRect, m_TextureFilter))) + CLog::Log(LOGERROR, __FUNCTION__" - StretchRect failed (0x%08X)", hr); + + target->Release(); + source->Release(); } +*/ -void CWinRenderer::ScaleGUIShader() +void CWinRenderer::ScaleFixedPipeline() { - D3D11_TEXTURE2D_DESC srcDesc; - m_SWTarget.Get()->GetDesc(&srcDesc); + HRESULT hr; + IDirect3DDevice9 *pD3DDev = g_Windowing.Get3DDevice(); + D3DSURFACE_DESC srcDesc; + if (FAILED(hr = m_SWTarget.Get()->GetLevelDesc(0, &srcDesc))) + CLog::Log(LOGERROR, __FUNCTION__": GetLevelDesc failed. %s", CRenderSystemDX::GetErrorDescription(hr).c_str()); float srcWidth = (float)srcDesc.Width; float srcHeight = (float)srcDesc.Height; - bool cbcontrol = (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast != 50.0f || CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness != 50.0f); - unsigned int contrast = (unsigned int)(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast *.01f * 255.0f); // we have to divide by two here/multiply by two later - unsigned int brightness = (unsigned int)(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness * .01f * 255.0f); - - g_Windowing.GetGUIShader()->SetSampler(m_TextureFilter); - CRect tu = { m_sourceRect.x1 / srcWidth, m_sourceRect.y1 / srcHeight, m_sourceRect.x2 / srcWidth, m_sourceRect.y2 / srcHeight }; - CRect destRect = CRect(m_rotatedDestCoords[0], m_rotatedDestCoords[2]); - - // pass contrast and brightness as diffuse color elements (see shader code) - CD3DTexture::DrawQuad(m_rotatedDestCoords, D3DCOLOR_ARGB(255, contrast, brightness, 255), &m_SWTarget, &tu, - !cbcontrol ? SHADER_METHOD_RENDER_VIDEO : SHADER_METHOD_RENDER_VIDEO_CONTROL); + bool cbcontrol = (CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast != 50.0f || CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness != 50.0f); + unsigned int contrast = (unsigned int)(CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast *.01f * 255.0f); // we have to divide by two here/multiply by two later + unsigned int brightness = (unsigned int)(CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness * .01f * 255.0f); + + D3DCOLOR diffuse = D3DCOLOR_ARGB(255, contrast, contrast, contrast); + D3DCOLOR specular = D3DCOLOR_ARGB(255, brightness, brightness, brightness); + + struct VERTEX + { + FLOAT x,y,z,rhw; + D3DCOLOR diffuse; + D3DCOLOR specular; + FLOAT tu, tv; + }; + + // Vertex format ignores viewport offsets, so correct for that here + CRect dest = g_graphicsContext.StereoCorrection(m_destRect); + + VERTEX vertex[] = + { + {dest.x1, dest.y1, 0.0f, 1.0f, diffuse, specular, m_sourceRect.x1 / srcWidth, m_sourceRect.y1 / srcHeight}, + {dest.x2, dest.y1, 0.0f, 1.0f, diffuse, specular, m_sourceRect.x2 / srcWidth, m_sourceRect.y1 / srcHeight}, + {dest.x2, dest.y2, 0.0f, 1.0f, diffuse, specular, m_sourceRect.x2 / srcWidth, m_sourceRect.y2 / srcHeight}, + {dest.x1, dest.y2, 0.0f, 1.0f, diffuse, specular, m_sourceRect.x1 / srcWidth, m_sourceRect.y2 / srcHeight}, + }; + + // Compensate for D3D coordinates system + for(int i = 0; i < ARRAY_SIZE(vertex); i++) + { + vertex[i].x -= 0.5f; + vertex[i].y -= 0.5f; + }; + + pD3DDev->SetTexture(0, m_SWTarget.Get()); + + if (!cbcontrol) + { + pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); + pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + pD3DDev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + } + else + { + pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X ); + pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); + + pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADDSIGNED ); + pD3DDev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT ); + pD3DDev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_SPECULAR ); + pD3DDev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + pD3DDev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_CURRENT ); + + pD3DDev->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE ); + pD3DDev->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + } + + pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE); + pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE); + pD3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE); + pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + pD3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); + + pD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, m_TextureFilter); + pD3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, m_TextureFilter); + pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); + pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); + + pD3DDev->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1); + + if (FAILED(hr = pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertex, sizeof(VERTEX)))) + CLog::Log(LOGERROR, __FUNCTION__": DrawPrimitiveUP failed. %s", CRenderSystemDX::GetErrorDescription(hr).c_str()); + + pD3DDev->SetTexture(0, NULL); } void CWinRenderer::RenderPS() @@ -801,92 +953,113 @@ Stage1(); Stage2(); } - - // restore GUI states after color/HQ shaders - g_Windowing.ApplyStateBlock(); } void CWinRenderer::Stage1() { - CD3D11_VIEWPORT viewPort(0.0f, 0.0f, 0.0f, 0.0f); - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - - ID3D11RenderTargetView *oldRTView = nullptr; ID3D11DepthStencilView* oldDSView = nullptr; - if (m_bUseHQScaler) - { - // store current render target and depth view. - pContext->OMGetRenderTargets(1, &oldRTView, &oldDSView); - // change destination for HQ scallers - ID3D11RenderTargetView* pRTView = m_IntermediateTarget.GetRenderTarget(); - pContext->OMSetRenderTargets(1, &pRTView, nullptr); - // viewport equals intermediate target size - viewPort = CD3D11_VIEWPORT(0.0f, 0.0f, - static_cast(m_IntermediateTarget.GetWidth()), - static_cast(m_IntermediateTarget.GetHeight())); - g_Windowing.ResetScissors(); - } - else - { - // viewport equals full backbuffer size - CRect bbSize = g_Windowing.GetBackBufferRect(); - viewPort = CD3D11_VIEWPORT(0.f, 0.f, bbSize.Width(), bbSize.Height()); - } - // reset view port - pContext->RSSetViewports(1, &viewPort); - // select destination rectangle - CPoint destPoints[4]; - if (m_renderOrientation) + if (!m_bUseHQScaler) { - for (size_t i = 0; i < 4; i++) - destPoints[i] = m_rotatedDestCoords[i]; + m_colorShader->Render(m_sourceRect, g_graphicsContext.StereoCorrection(m_destRect), + CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast, + CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness, + m_iFlags, + (YUVBuffer*)m_VideoBuffers[m_iYV12RenderBuffer]); } else { - CRect destRect = m_bUseHQScaler ? m_sourceRect : g_graphicsContext.StereoCorrection(m_destRect); - destPoints[0] = { destRect.x1, destRect.y1 }; - destPoints[1] = { destRect.x2, destRect.y1 }; - destPoints[2] = { destRect.x2, destRect.y2 }; - destPoints[3] = { destRect.x1, destRect.y2 }; - } + // Switch the render target to the temporary destination + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + LPDIRECT3DSURFACE9 newRT, oldRT; + m_IntermediateTarget.GetSurfaceLevel(0, &newRT); + pD3DDevice->GetRenderTarget(0, &oldRT); + pD3DDevice->SetRenderTarget(0, newRT); + + CRect srcRect(0.0f, 0.0f, m_sourceWidth, m_sourceHeight); + CRect rtRect(0.0f, 0.0f, m_sourceWidth, m_sourceHeight); + + m_colorShader->Render(srcRect, rtRect, + CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast, + CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness, + m_iFlags, + (YUVBuffer*)m_VideoBuffers[m_iYV12RenderBuffer]); + + // Restore the render target + pD3DDevice->SetRenderTarget(0, oldRT); + + // MSDN says: Setting a new render target will cause the viewport + // to be set to the full size of the new render target. + // So we need restore our viewport + g_Windowing.RestoreViewPort(); - // render video frame - m_colorShader->Render(m_sourceRect, destPoints, - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast, - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness, - m_iFlags, (YUVBuffer*)m_VideoBuffers[m_iYV12RenderBuffer]); - // Restore our view port. - g_Windowing.RestoreViewPort(); - // Restore the render target and depth view. - if (m_bUseHQScaler) - { - pContext->OMSetRenderTargets(1, &oldRTView, oldDSView); - SAFE_RELEASE(oldRTView); - SAFE_RELEASE(oldDSView); + oldRT->Release(); + newRT->Release(); } } void CWinRenderer::Stage2() { - m_scalerShader->Render(m_IntermediateTarget, m_sourceWidth, m_sourceHeight, m_destWidth, m_destHeight - , m_sourceRect, g_graphicsContext.StereoCorrection(m_destRect) - , (m_renderMethod == RENDER_DXVA && g_Windowing.UseLimitedColor())); + CRect sourceRect; + + // fixup stereo+dxva+hq scaling issue + if (m_renderMethod == RENDER_DXVA) + { + sourceRect.y1 = 0.0f; + sourceRect.y2 = m_sourceHeight; + sourceRect.x1 = 0.0f; + sourceRect.x2 = m_sourceWidth; + } + else + sourceRect = m_sourceRect; + + m_scalerShader->Render(m_IntermediateTarget, m_sourceWidth, m_sourceHeight, m_destWidth, m_destHeight, sourceRect, g_graphicsContext.StereoCorrection(m_destRect)); } void CWinRenderer::RenderProcessor(DWORD flags) { CSingleLock lock(g_graphicsContext); + HRESULT hr; + CRect destRect; + + if (m_bUseHQScaler) + { + destRect.y1 = 0.0f; + destRect.y2 = m_sourceHeight; + destRect.x1 = 0.0f; + destRect.x2 = m_sourceWidth; + } + else + destRect = g_graphicsContext.StereoCorrection(m_destRect); + DXVABuffer *image = (DXVABuffer*)m_VideoBuffers[m_iYV12RenderBuffer]; + if (!image->pic) return; + IDirect3DSurface9* target; + if ( m_bUseHQScaler + || g_graphicsContext.GetStereoMode() == RENDER_STEREO_MODE_ANAGLYPH_RED_CYAN + || g_graphicsContext.GetStereoMode() == RENDER_STEREO_MODE_ANAGLYPH_GREEN_MAGENTA + || g_graphicsContext.GetStereoMode() == RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE) + { + m_IntermediateTarget.GetSurfaceLevel(0, &target); + } + else + { + if(FAILED(hr = g_Windowing.Get3DDevice()->GetRenderTarget(0, &target))) + { + CLog::Log(LOGERROR, "CWinRenderer::RenderSurface - failed to get render target. %s", CRenderSystemDX::GetErrorDescription(hr).c_str()); + return; + } + } + + IDirect3DSurface9 *source[8]; + memset(source, 0, 8 * sizeof(IDirect3DSurface9*)); + source[2] = image->pic->surface; + int past = 0; int future = 0; DXVABuffer **buffers = (DXVABuffer**)m_VideoBuffers; - ID3D11View* views[8]; - memset(views, 0, 8 * sizeof(ID3D11View*)); - views[2] = image->pic->view; - // set future frames while (future < 2) { @@ -895,7 +1068,7 @@ { if (buffers[i] && buffers[i]->pic && buffers[i]->frameIdx == image->frameIdx + (future*2 + 2)) { - views[1 - future++] = buffers[i]->pic->view; + source[1 - future++] = buffers[i]->pic->surface; found = true; break; } @@ -912,7 +1085,7 @@ { if (buffers[i] && buffers[i]->pic && buffers[i]->frameIdx == image->frameIdx - (past*2 + 2)) { - views[3 + past++] = buffers[i]->pic->view; + source[3 + past++] = buffers[i]->pic->surface; found = true; break; } @@ -921,74 +1094,53 @@ break; } - CRect destRect; - switch (m_renderOrientation) - { - case 90: - destRect = CRect(m_rotatedDestCoords[3], m_rotatedDestCoords[1]); - break; - case 180: - destRect = m_destRect; - break; - case 270: - destRect = CRect(m_rotatedDestCoords[1], m_rotatedDestCoords[3]); - break; - default: - destRect = m_bUseHQScaler ? m_sourceRect : g_graphicsContext.StereoCorrection(m_destRect); - break; - } - CRect src = m_sourceRect, dst = destRect; - CRect target = CRect(0.0f, 0.0f, - static_cast(m_IntermediateTarget.GetWidth()), - static_cast(m_IntermediateTarget.GetHeight())); + m_processor->Render(m_sourceRect, destRect, target, source, flags, image->frameIdx); - ID3D11RenderTargetView* pView = nullptr; - ID3D11Resource* pResource = m_IntermediateTarget.Get(); - if (m_capture) - { - target.x2 = m_capture->GetWidth(); - target.y2 = m_capture->GetHeight(); - g_Windowing.Get3D11Context()->OMGetRenderTargets(1, &pView, nullptr); - if (pView) - pView->GetResource(&pResource); - } - - CWIN32Util::CropSource(src, dst, target, m_renderOrientation); - - m_processor->Render(src, dst, pResource, views, flags, image->frameIdx, m_renderOrientation); - - if (m_capture) - { - SAFE_RELEASE(pResource); - SAFE_RELEASE(pView); - } + target->Release(); if (m_bUseHQScaler) { Stage2(); } - else if (!m_capture) + else if ( g_graphicsContext.GetStereoMode() == RENDER_STEREO_MODE_ANAGLYPH_RED_CYAN + || g_graphicsContext.GetStereoMode() == RENDER_STEREO_MODE_ANAGLYPH_GREEN_MAGENTA + || g_graphicsContext.GetStereoMode() == RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE) { - CRect oldViewPort; - bool stereoHack = g_graphicsContext.GetStereoMode() == RENDER_STEREO_MODE_SPLIT_HORIZONTAL - || g_graphicsContext.GetStereoMode() == RENDER_STEREO_MODE_SPLIT_VERTICAL; + IDirect3DDevice9 *pD3DDev = g_Windowing.Get3DDevice(); - if (stereoHack) + struct VERTEX { - CRect bbSize = g_Windowing.GetBackBufferRect(); + FLOAT x,y,z; + FLOAT tu,tv; + }; - g_Windowing.GetViewPort(oldViewPort); - g_Windowing.SetViewPort(bbSize); - g_Windowing.SetCameraPosition(CPoint(bbSize.Width() / 2.f, bbSize.Height() / 2.f), bbSize.Width(), bbSize.Height(), 0.f); - } + VERTEX vertex[] = + { + {destRect.x1 - 0.5f, destRect.y1 - 0.5f, 0.0f, m_destRect.x1 / m_destWidth, m_destRect.y1 / m_destHeight}, + {destRect.x2 - 0.5f, destRect.y1 - 0.5f, 0.0f, m_destRect.x2 / m_destWidth, m_destRect.y1 / m_destHeight}, + {destRect.x2 - 0.5f, destRect.y2 - 0.5f, 0.0f, m_destRect.x2 / m_destWidth, m_destRect.y2 / m_destHeight}, + {destRect.x1 - 0.5f, destRect.y2 - 0.5f, 0.0f, m_destRect.x1 / m_destWidth, m_destRect.y2 / m_destHeight}, + }; + + pD3DDev->SetTexture(0, m_IntermediateTarget.Get()); - // render frame - CRect tu = { dst.x1 / m_destWidth, dst.y1 / m_destHeight, dst.x2 / m_destWidth, dst.y2 / m_destHeight }; - CD3DTexture::DrawQuad(dst, 0xFFFFFF, &m_IntermediateTarget, &tu, SHADER_METHOD_RENDER_TEXTURE_BLEND); + pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); + pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + pD3DDev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); - if (stereoHack) - g_Windowing.SetViewPort(oldViewPort); + pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); + pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); + + pD3DDev->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1); + + if (FAILED(hr = pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertex, sizeof(VERTEX)))) + CLog::Log(LOGERROR, __FUNCTION__": DrawPrimitiveUP failed. %s", CRenderSystemDX::GetErrorDescription(hr).c_str()); + + pD3DDev->SetTexture(0, NULL); } } @@ -999,7 +1151,7 @@ bool succeeded = false; - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); CRect saveSize = m_destRect; saveRotatedCoords();//backup current m_rotatedDestCoords @@ -1007,23 +1159,21 @@ m_destRect.SetRect(0, 0, (float)capture->GetWidth(), (float)capture->GetHeight()); syncDestRectToRotatedPoints();//syncs the changed destRect to m_rotatedDestCoords - ID3D11DepthStencilView* oldDepthView; - ID3D11RenderTargetView* oldSurface; - pContext->OMGetRenderTargets(1, &oldSurface, &oldDepthView); + LPDIRECT3DSURFACE9 oldSurface; + pD3DDevice->GetRenderTarget(0, &oldSurface); capture->BeginRender(); if (capture->GetState() != CAPTURESTATE_FAILED) { - m_capture = capture; + pD3DDevice->BeginScene(); Render(0); - m_capture = nullptr; + pD3DDevice->EndScene(); capture->EndRender(); succeeded = true; } - pContext->OMSetRenderTargets(1, &oldSurface, oldDepthView); + pD3DDevice->SetRenderTarget(0, oldSurface); oldSurface->Release(); - SAFE_RELEASE(oldDepthView); // it can be nullptr m_destRect = saveSize; restoreRotatedCoords();//restores the previous state of the rotated dest coords @@ -1037,7 +1187,7 @@ void CWinRenderer::DeleteYV12Texture(int index) { CSingleLock lock(g_graphicsContext); - if (m_VideoBuffers[index] != nullptr) + if (m_VideoBuffers[index] != NULL) SAFE_DELETE(m_VideoBuffers[index]); m_NumYV12Buffers = 0; } @@ -1055,7 +1205,7 @@ { YUVBuffer *buf = new YUVBuffer(); - if (!buf->Create(m_format, m_sourceWidth, m_sourceHeight, m_renderMethod == RENDER_PS)) + if (!buf->Create(m_format, m_sourceWidth, m_sourceHeight)) { CLog::Log(LOGERROR, __FUNCTION__" - Unable to create YV12 video texture %i", index); delete buf; @@ -1090,9 +1240,9 @@ if (m_renderMethod == RENDER_DXVA) { - //if(method == VS_INTERLACEMETHOD_DXVA_BOB - //|| method == VS_INTERLACEMETHOD_DXVA_BEST) - return false; // only auto. DXVA processor selects deinterlacing method automatically + if(method == VS_INTERLACEMETHOD_DXVA_BOB + || method == VS_INTERLACEMETHOD_DXVA_BEST) + return true; } if(m_format != RENDER_FMT_DXVA @@ -1117,7 +1267,6 @@ feature == RENDERFEATURE_ZOOM || feature == RENDERFEATURE_VERTICAL_SHIFT || feature == RENDERFEATURE_PIXEL_RATIO || - feature == RENDERFEATURE_ROTATION || feature == RENDERFEATURE_POSTPROCESS) return true; @@ -1134,15 +1283,16 @@ if (method == VS_SCALINGMETHOD_DXVA_HARDWARE || method == VS_SCALINGMETHOD_AUTO) return true; - else if (!g_advancedSettings.m_DXVAAllowHqScaling || m_renderOrientation) + else if (!g_advancedSettings.m_DXVAAllowHqScaling) return false; } - if ( method == VS_SCALINGMETHOD_AUTO - || (method == VS_SCALINGMETHOD_LINEAR && m_renderMethod == RENDER_PS)) + if(m_deviceCaps.PixelShaderVersion >= D3DPS_VERSION(2, 0) + && ( method == VS_SCALINGMETHOD_AUTO + || (method == VS_SCALINGMETHOD_LINEAR && m_renderMethod == RENDER_PS) )) return true; - if (g_Windowing.GetFeatureLevel() >= D3D_FEATURE_LEVEL_9_3 && !m_renderOrientation) + if(m_deviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0)) { if(method == VS_SCALINGMETHOD_CUBIC || method == VS_SCALINGMETHOD_LANCZOS2 @@ -1154,7 +1304,7 @@ // if scaling is below level, avoid hq scaling float scaleX = fabs(((float)m_sourceWidth - m_destRect.Width())/m_sourceWidth)*100; float scaleY = fabs(((float)m_sourceHeight - m_destRect.Height())/m_sourceHeight)*100; - int minScale = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_HQSCALERS); + int minScale = CSettings::Get().GetInt("videoplayer.hqscalers"); if (scaleX < minScale && scaleY < minScale) return false; return true; @@ -1164,8 +1314,11 @@ else if(m_renderMethod == RENDER_SW) { if(method == VS_SCALINGMETHOD_AUTO - || method == VS_SCALINGMETHOD_NEAREST - || method == VS_SCALINGMETHOD_LINEAR) + || method == VS_SCALINGMETHOD_NEAREST) + return true; + if(method == VS_SCALINGMETHOD_LINEAR + && m_deviceCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR + && m_deviceCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR) return true; } return false; @@ -1221,60 +1374,56 @@ Release(); } -bool YUVBuffer::Create(ERenderFormat format, unsigned int width, unsigned int height, bool dynamic) +bool YUVBuffer::Create(ERenderFormat format, unsigned int width, unsigned int height) { m_format = format; m_width = width; m_height = height; - m_mapType = dynamic ? D3D11_MAP_WRITE_DISCARD : D3D11_MAP_WRITE; - // Create the buffers with D3D11_USAGE_DYNAMIC which can be used as shader resource for PS rendering - // or D3D11_USAGE_STAGING which can be read and written for SW rendering - D3D11_USAGE usage = dynamic ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_STAGING; + // Create the buffers in system memory and copy to D3DPOOL_DEFAULT: + // - helps with lost devices. A buffer can be locked for dvdplayer without interfering. + // - Dynamic + D3DPOOL_DEFAULT caused trouble for Intel i3 and some IGP. Bad sync/locking in the driver I suppose + // and Present failed every second time for the second video played. + // - this is what D3D9 does behind the scenes anyway switch(m_format) { case RENDER_FMT_YUV420P10: case RENDER_FMT_YUV420P16: - { // D3DFMT_L16 -> DXGI_FORMAT_R16_UNORM - if ( !planes[PLANE_Y].texture.Create(m_width, m_height, 1, usage, DXGI_FORMAT_R16_UNORM) - || !planes[PLANE_U].texture.Create(m_width >> 1, m_height >> 1, 1, usage, DXGI_FORMAT_R16_UNORM) - || !planes[PLANE_V].texture.Create(m_width >> 1, m_height >> 1, 1, usage, DXGI_FORMAT_R16_UNORM)) + { + if ( !planes[PLANE_Y].texture.Create(m_width , m_height , 1, 0, D3DFMT_L16, D3DPOOL_SYSTEMMEM) + || !planes[PLANE_U].texture.Create(m_width / 2, m_height / 2, 1, 0, D3DFMT_L16, D3DPOOL_SYSTEMMEM) + || !planes[PLANE_V].texture.Create(m_width / 2, m_height / 2, 1, 0, D3DFMT_L16, D3DPOOL_SYSTEMMEM)) return false; m_activeplanes = 3; break; } case RENDER_FMT_YUV420P: - { // D3DFMT_L8 - > DXGI_FORMAT_R8_UNORM - if ( !planes[PLANE_Y].texture.Create(m_width, m_height, 1, usage, DXGI_FORMAT_R8_UNORM) - || !planes[PLANE_U].texture.Create(m_width >> 1, m_height >> 1, 1, usage, DXGI_FORMAT_R8_UNORM) - || !planes[PLANE_V].texture.Create(m_width >> 1, m_height >> 1, 1, usage, DXGI_FORMAT_R8_UNORM)) + { + if ( !planes[PLANE_Y].texture.Create(m_width , m_height , 1, 0, D3DFMT_L8, D3DPOOL_SYSTEMMEM) + || !planes[PLANE_U].texture.Create(m_width / 2, m_height / 2, 1, 0, D3DFMT_L8, D3DPOOL_SYSTEMMEM) + || !planes[PLANE_V].texture.Create(m_width / 2, m_height / 2, 1, 0, D3DFMT_L8, D3DPOOL_SYSTEMMEM)) return false; m_activeplanes = 3; break; } - case RENDER_FMT_DXVA: case RENDER_FMT_NV12: - { // D3DFMT_L8 -> DXGI_FORMAT_R8_UNORM, D3DFMT_A8L8/D3DFMT_V8U8 -> DXGI_FORMAT_R8G8_UNORM / DXGI_FORMAT_R8G8_SNORM - DXGI_FORMAT uvFormat = DXGI_FORMAT_R8G8_UNORM; - // FL 9.x doesn't support DXGI_FORMAT_R8G8_UNORM, so we have to use SNORM and correct values in shader - if (!g_Windowing.IsFormatSupport(uvFormat, D3D11_FORMAT_SUPPORT_TEXTURE2D)) - uvFormat = DXGI_FORMAT_R8G8_SNORM; - if ( !planes[PLANE_Y].texture.Create( m_width, m_height, 1, usage, DXGI_FORMAT_R8_UNORM) - || !planes[PLANE_UV].texture.Create(m_width >> 1, m_height >> 1, 1, usage, uvFormat)) + { + if ( !planes[PLANE_Y].texture.Create(m_width , m_height , 1, 0, D3DFMT_L8, D3DPOOL_SYSTEMMEM) + || !planes[PLANE_UV].texture.Create(m_width / 2, m_height / 2, 1, 0, D3DFMT_A8L8, D3DPOOL_SYSTEMMEM)) return false; m_activeplanes = 2; break; } case RENDER_FMT_YUYV422: - { // D3DFMT_A8R8G8B8 -> DXGI_FORMAT_B8G8R8A8_UNORM - if ( !planes[PLANE_Y].texture.Create(m_width >> 1, m_height, 1, usage, DXGI_FORMAT_B8G8R8A8_UNORM)) + { + if ( !planes[PLANE_Y].texture.Create(m_width >> 1 , m_height , 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM)) return false; m_activeplanes = 1; break; } case RENDER_FMT_UYVY422: - { // D3DFMT_A8R8G8B8 -> DXGI_FORMAT_B8G8R8A8_UNORM - if ( !planes[PLANE_Y].texture.Create(m_width >> 1, m_height, 1, usage, DXGI_FORMAT_B8G8R8A8_UNORM)) + { + if ( !planes[PLANE_Y].texture.Create(m_width >> 1 , m_height , 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM)) return false; m_activeplanes = 1; break; @@ -1289,7 +1438,6 @@ void YUVBuffer::Release() { - SAFE_RELEASE(m_staging); for(unsigned i = 0; i < m_activeplanes; i++) { planes[i].texture.Release(); @@ -1304,9 +1452,9 @@ m_locked = false; - for (unsigned i = 0; i < m_activeplanes; i++) + for(unsigned i = 0; i < m_activeplanes; i++) { - if (planes[i].texture.Get() && planes[i].rect.pData) + if(planes[i].texture.Get() && planes[i].rect.pBits) if (!planes[i].texture.UnlockRect(0)) CLog::Log(LOGERROR, __FUNCTION__" - failed to unlock texture %d", i); memset(&planes[i].rect, 0, sizeof(planes[i].rect)); @@ -1323,11 +1471,10 @@ for(unsigned i = 0; i < m_activeplanes; i++) { if(planes[i].texture.Get() - && planes[i].texture.LockRect(0, &planes[i].rect, m_mapType) == false) + && planes[i].texture.LockRect(0, &planes[i].rect, NULL, D3DLOCK_DISCARD) == false) { memset(&planes[i].rect, 0, sizeof(planes[i].rect)); CLog::Log(LOGERROR, __FUNCTION__" - failed to lock texture %d into memory", i); - m_locked = false; } } } @@ -1340,41 +1487,40 @@ { case RENDER_FMT_YUV420P16: { - wmemset((wchar_t*)planes[PLANE_Y].rect.pData, 0, planes[PLANE_Y].rect.RowPitch * m_height / 2); - wmemset((wchar_t*)planes[PLANE_U].rect.pData, 32768, planes[PLANE_U].rect.RowPitch * (m_height / 2) / 2); - wmemset((wchar_t*)planes[PLANE_V].rect.pData, 32768, planes[PLANE_V].rect.RowPitch * (m_height / 2) / 2); + wmemset((wchar_t*)planes[PLANE_Y].rect.pBits, 0, planes[PLANE_Y].rect.Pitch * m_height / 2); + wmemset((wchar_t*)planes[PLANE_U].rect.pBits, 32768, planes[PLANE_U].rect.Pitch * (m_height/2) / 2); + wmemset((wchar_t*)planes[PLANE_V].rect.pBits, 32768, planes[PLANE_V].rect.Pitch * (m_height/2) / 2); break; } case RENDER_FMT_YUV420P10: { - wmemset((wchar_t*)planes[PLANE_Y].rect.pData, 0, planes[PLANE_Y].rect.RowPitch * m_height / 2); - wmemset((wchar_t*)planes[PLANE_U].rect.pData, 512, planes[PLANE_U].rect.RowPitch * (m_height / 2) / 2); - wmemset((wchar_t*)planes[PLANE_V].rect.pData, 512, planes[PLANE_V].rect.RowPitch * (m_height / 2) / 2); + wmemset((wchar_t*)planes[PLANE_Y].rect.pBits, 0, planes[PLANE_Y].rect.Pitch * m_height / 2); + wmemset((wchar_t*)planes[PLANE_U].rect.pBits, 512, planes[PLANE_U].rect.Pitch * (m_height/2) / 2); + wmemset((wchar_t*)planes[PLANE_V].rect.pBits, 512, planes[PLANE_V].rect.Pitch * (m_height/2) / 2); break; } case RENDER_FMT_YUV420P: { - memset(planes[PLANE_Y].rect.pData, 0, planes[PLANE_Y].rect.RowPitch * m_height); - memset(planes[PLANE_U].rect.pData, 128, planes[PLANE_U].rect.RowPitch * (m_height / 2)); - memset(planes[PLANE_V].rect.pData, 128, planes[PLANE_V].rect.RowPitch * (m_height / 2)); + memset(planes[PLANE_Y].rect.pBits, 0, planes[PLANE_Y].rect.Pitch * m_height); + memset(planes[PLANE_U].rect.pBits, 128, planes[PLANE_U].rect.Pitch * (m_height/2)); + memset(planes[PLANE_V].rect.pBits, 128, planes[PLANE_V].rect.Pitch * (m_height/2)); break; } - case RENDER_FMT_DXVA: case RENDER_FMT_NV12: { - memset(planes[PLANE_Y].rect.pData, 0, planes[PLANE_Y].rect.RowPitch * m_height); - memset(planes[PLANE_UV].rect.pData, 128, planes[PLANE_U].rect.RowPitch * (m_height / 2)); + memset(planes[PLANE_Y].rect.pBits, 0, planes[PLANE_Y].rect.Pitch * m_height); + memset(planes[PLANE_UV].rect.pBits, 128, planes[PLANE_U].rect.Pitch * (m_height/2)); break; } // YUY2, UYVY: wmemset to set a 16bit pattern, byte-swapped because x86 is LE case RENDER_FMT_YUYV422: { - wmemset((wchar_t*)planes[PLANE_Y].rect.pData, 0x8000, planes[PLANE_Y].rect.RowPitch / 2 * m_height); + wmemset((wchar_t*)planes[PLANE_Y].rect.pBits, 0x8000, planes[PLANE_Y].rect.Pitch / 2 * m_height); break; } case RENDER_FMT_UYVY422: { - wmemset((wchar_t*)planes[PLANE_Y].rect.pData, 0x0080, planes[PLANE_Y].rect.RowPitch / 2 * m_height); + wmemset((wchar_t*)planes[PLANE_Y].rect.pBits, 0x0080, planes[PLANE_Y].rect.Pitch / 2 * m_height); break; } @@ -1383,103 +1529,9 @@ bool YUVBuffer::IsReadyToRender() { - return !m_locked; -} - -bool YUVBuffer::CopyFromDXVA(ID3D11VideoDecoderOutputView* pView) -{ - if (!pView) - return false; - - HRESULT hr = S_OK; - D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC vpivd; - pView->GetDesc(&vpivd); - ID3D11Resource* resource = nullptr; - pView->GetResource(&resource); - - if (!m_staging) - { - // create staging texture - ID3D11Texture2D* surface = nullptr; - hr = resource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&surface)); - if (SUCCEEDED(hr)) - { - D3D11_TEXTURE2D_DESC tDesc; - surface->GetDesc(&tDesc); - SAFE_RELEASE(surface); - - CD3D11_TEXTURE2D_DESC sDesc(tDesc); - sDesc.ArraySize = 1; - sDesc.Usage = D3D11_USAGE_STAGING; - sDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - sDesc.BindFlags = 0; - - hr = g_Windowing.Get3D11Device()->CreateTexture2D(&sDesc, nullptr, &m_staging); - if (SUCCEEDED(hr)) - m_sDesc = sDesc; - } - } - - if (m_staging) - { - ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext(); - // copy content from decoder texture to temporary texture. - pContext->CopySubresourceRegion(m_staging, - D3D11CalcSubresource(0, 0, 1), - 0, 0, 0, - resource, - D3D11CalcSubresource(0, vpivd.Texture2D.ArraySlice, 1), - nullptr); - PerformCopy(); - } - SAFE_RELEASE(resource); - - return SUCCEEDED(hr); -} - -void YUVBuffer::PerformCopy() -{ if (!m_locked) - return; - - ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext(); - D3D11_MAPPED_SUBRESOURCE rectangle; - if (SUCCEEDED(pContext->Map(m_staging, 0, D3D11_MAP_READ, 0, &rectangle))) - { - void* (*copy_func)(void* d, const void* s, size_t size) = - ((g_cpuInfo.GetCPUFeatures() & CPU_FEATURE_SSE4) != 0) ? gpu_memcpy : memcpy; - - uint8_t* s_y = static_cast(rectangle.pData); - uint8_t *s_uv = static_cast(rectangle.pData) + m_sDesc.Height * rectangle.RowPitch; - uint8_t* d_y = static_cast(planes[PLANE_Y].rect.pData); - uint8_t *d_uv = static_cast(planes[PLANE_UV].rect.pData); - - if ( planes[PLANE_Y ].rect.RowPitch == rectangle.RowPitch - && planes[PLANE_UV].rect.RowPitch == rectangle.RowPitch) - { - copy_func(d_y, s_y, rectangle.RowPitch * m_height); - copy_func(d_uv, s_uv, rectangle.RowPitch * m_height >> 1); - } - else - { - for (unsigned y = 0; y < m_sDesc.Height >> 1; ++y) - { - // Copy Y - copy_func(d_y, s_y, planes[PLANE_Y].rect.RowPitch); - s_y += rectangle.RowPitch; - d_y += planes[PLANE_Y].rect.RowPitch; - // Copy Y - copy_func(d_y, s_y, planes[PLANE_Y].rect.RowPitch); - s_y += rectangle.RowPitch; - d_y += planes[PLANE_Y].rect.RowPitch; - // Copy UV - copy_func(d_uv, s_uv, planes[PLANE_UV].rect.RowPitch); - s_uv += rectangle.RowPitch; - d_uv += planes[PLANE_UV].rect.RowPitch; - } - } - pContext->Unmap(m_staging, 0); - } + return true; + return false; } #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/WinRenderer.h kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/WinRenderer.h --- kodi-16.1~git20160425.1001-final/xbmc/cores/VideoRenderers/WinRenderer.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/cores/VideoRenderers/WinRenderer.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,12 +22,13 @@ #if !defined(TARGET_POSIX) && !defined(HAS_GL) +#include "RenderFormats.h" #include "BaseRenderer.h" -#include "DXVAHD.h" #include "guilib/D3DResource.h" -#include "RenderFormats.h" #include "RenderCapture.h" #include "settings/VideoSettings.h" +#include "DXVA.h" +#include "DXVAHD.h" #define ALIGN(value, alignment) (((value)+((alignment)-1))&~((alignment)-1)) #define CLAMP(a, min, max) ((a) > (max) ? (max) : ( (a) < (min) ? (min) : a )) @@ -97,43 +98,37 @@ struct SVideoPlane { CD3DTexture texture; - D3D11_MAPPED_SUBRESOURCE rect; // rect.pBits != NULL is used to know if the texture is locked + D3DLOCKED_RECT rect; // rect.pBits != NULL is used to know if the texture is locked }; struct YUVBuffer : SVideoBuffer { - YUVBuffer() : m_width(0), m_height(0), m_format(RENDER_FMT_NONE), m_activeplanes(0), m_locked(false), m_staging(nullptr) - { - memset(&m_sDesc, 0, sizeof(CD3D11_TEXTURE2D_DESC)); - } + YUVBuffer() : m_width(0), m_height(0), m_format(RENDER_FMT_NONE), m_activeplanes(0), m_locked(false) {} ~YUVBuffer(); - bool Create(ERenderFormat format, unsigned int width, unsigned int height, bool dynamic); + bool Create(ERenderFormat format, unsigned int width, unsigned int height); virtual void Release(); virtual void StartDecode(); virtual void StartRender(); virtual void Clear(); unsigned int GetActivePlanes() { return m_activeplanes; } virtual bool IsReadyToRender(); - bool CopyFromDXVA(ID3D11VideoDecoderOutputView* pView); SVideoPlane planes[MAX_PLANES]; private: - void PerformCopy(); - unsigned int m_width; unsigned int m_height; ERenderFormat m_format; unsigned int m_activeplanes; bool m_locked; - D3D11_MAP m_mapType; - ID3D11Texture2D* m_staging; - CD3D11_TEXTURE2D_DESC m_sDesc; }; struct DXVABuffer : SVideoBuffer { - DXVABuffer() { pic = nullptr; } + DXVABuffer() + { + pic = NULL; + } ~DXVABuffer() { SAFE_RELEASE(pic); } DXVA::CRenderPicture *pic; unsigned int frameIdx; @@ -183,10 +178,12 @@ void RenderPS(); void Stage1(); void Stage2(); - void ScaleGUIShader(); + void ScaleFixedPipeline(); + void CopyAlpha(int w, int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dst, unsigned char* dsta, int dststride); virtual void ManageTextures(); void DeleteYV12Texture(int index); bool CreateYV12Texture(int index); + void CopyYV12Texture(int dest); int NextYV12Texture(); void SelectRenderMethod(); @@ -197,7 +194,6 @@ void SelectPSVideoFilter(); void UpdatePSVideoFilter(); bool CreateIntermediateRenderTarget(unsigned int width, unsigned int height); - bool CopyDXVA2YUVBuffer(ID3D11VideoDecoderOutputView* pView, YUVBuffer *pBuf); void RenderProcessor(DWORD flags); int m_iYV12RenderBuffer; @@ -206,34 +202,43 @@ bool m_bConfigured; SVideoBuffer *m_VideoBuffers[NUM_BUFFERS]; RenderMethod m_renderMethod; - DXVA::CProcessorHD *m_processor; + DXVA::CProcessor *m_processor; std::vector m_formats; // software scale libraries (fallback if required pixel shaders version is not available) struct SwsContext *m_sw_scale_ctx; // Software rendering - SHADER_SAMPLER m_TextureFilter; + D3DTEXTUREFILTERTYPE m_TextureFilter; CD3DTexture m_SWTarget; // PS rendering bool m_bUseHQScaler; CD3DTexture m_IntermediateTarget; + CYUV2RGBShader* m_colorShader; CConvolutionShader* m_scalerShader; + ESCALINGMETHOD m_scalingMethod; ESCALINGMETHOD m_scalingMethodGui; + + D3DCAPS9 m_deviceCaps; + bool m_bFilterInitialized; int m_iRequestedMethod; + + // clear colour for "black" bars + DWORD m_clearColour; unsigned int m_extended_format; + // Width and height of the render target // the separable HQ scalers need this info, but could the m_destRect be used instead? unsigned int m_destWidth; unsigned int m_destHeight; + int m_neededBuffers; unsigned int m_frameIdx; - CRenderCapture* m_capture = nullptr; }; #else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/CueDocument.cpp kodi-15.2~git20151019.1039-final/xbmc/CueDocument.cpp --- kodi-16.1~git20160425.1001-final/xbmc/CueDocument.cpp 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/CueDocument.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -66,6 +66,7 @@ #include +using namespace std; using namespace XFILE; // Stuff for read CUE data from different sources. @@ -159,7 +160,6 @@ : m_iYear(0) , m_iTrack(0) , m_iDiscNumber(0) - , m_bOneFilePerTrack(false) { } @@ -209,14 +209,14 @@ } } -void CCueDocument::GetMediaFiles(std::vector& mediaFiles) +void CCueDocument::GetMediaFiles(vector& mediaFiles) { - typedef std::set TSet; + typedef set TSet; TSet uniqueFiles; for (Tracks::const_iterator it = m_tracks.begin(); it != m_tracks.end(); ++it) uniqueFiles.insert(it->strFile); - for (TSet::const_iterator it = uniqueFiles.begin(); it != uniqueFiles.end(); ++it) + for (TSet::const_iterator it = uniqueFiles.begin(); it != uniqueFiles.end(); it++) mediaFiles.push_back(*it); } @@ -230,24 +230,16 @@ return !m_tracks.empty(); } -bool CCueDocument::IsOneFilePerTrack() const -{ - return m_bOneFilePerTrack; -} - bool CCueDocument::GetSong(int aTrackNumber, CSong& aSong) { if (aTrackNumber < 0 || aTrackNumber >= static_cast(m_tracks.size())) return false; const CCueTrack& track = m_tracks[aTrackNumber]; - //Pass artist to MusicInfoTag object by setting artist description string only. - //Artist credits not used during loading from cue sheet. if ((track.strArtist.length() == 0) && (m_strArtist.length() > 0)) - aSong.strArtistDesc = m_strArtist; + aSong.artist = StringUtils::Split(m_strArtist, g_advancedSettings.m_musicItemSeparator); else - aSong.strArtistDesc = track.strArtist; - //Pass album artist to MusicInfoTag object by setting album artist vector. - aSong.SetAlbumArtist(StringUtils::Split(m_strArtist, g_advancedSettings.m_musicItemSeparator)); + aSong.artist = StringUtils::Split(track.strArtist, g_advancedSettings.m_musicItemSeparator); + aSong.albumArtist = StringUtils::Split(m_strArtist, g_advancedSettings.m_musicItemSeparator); aSong.strAlbum = m_strAlbum; aSong.genre = StringUtils::Split(m_strGenre, g_advancedSettings.m_musicItemSeparator); aSong.iYear = m_iYear; @@ -302,7 +294,6 @@ bool bCurrentFileChanged = false; int time; int totalTracks = -1; - int numberFiles = -1; // Run through the .CUE file and extract the tracks... while (true) @@ -368,7 +359,6 @@ } else if (StringUtils::StartsWithNoCase(strLine, "FILE")) { - numberFiles++; // already a file name? then the time computation will be changed if (!strCurrentFile.empty()) bCurrentFileChanged = true; @@ -405,10 +395,6 @@ m_tracks[totalTracks].iEndTime = 0; else CLog::Log(LOGERROR, "No INDEX 01 tags in CUE file!"); - - if ( totalTracks == numberFiles ) - m_bOneFilePerTrack = true; - return (totalTracks >= 0); } @@ -455,7 +441,7 @@ } StringUtils::TrimLeft(numberTime); // split the resulting string - std::vector time = StringUtils::Split(numberTime, ":"); + vector time = StringUtils::Split(numberTime, ":"); if (time.size() != 3) return -1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/CueDocument.h kodi-15.2~git20151019.1039-final/xbmc/CueDocument.h --- kodi-16.1~git20160425.1001-final/xbmc/CueDocument.h 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/CueDocument.h 2015-10-19 08:39:15.000000000 +0000 @@ -57,7 +57,6 @@ std::string GetMediaTitle(); void GetMediaFiles(std::vector& mediaFiles); void UpdateMediaFile(const std::string& oldMediaFile, const std::string& mediaFile); - bool IsOneFilePerTrack() const; bool IsLoaded() const; private: void Clear(); @@ -72,8 +71,6 @@ int m_iDiscNumber; // Disc number ReplayGain::Info m_albumReplayGain; - bool m_bOneFilePerTrack; - // cuetrack array typedef std::vector Tracks; Tracks m_tracks; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/DatabaseManager.cpp kodi-15.2~git20151019.1039-final/xbmc/DatabaseManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/DatabaseManager.cpp 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/DatabaseManager.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -28,13 +28,12 @@ #include "pvr/PVRDatabase.h" #include "epg/EpgDatabase.h" #include "settings/AdvancedSettings.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" +using namespace std; using namespace EPG; using namespace PVR; -using namespace ActiveAE; -CDatabaseManager &CDatabaseManager::GetInstance() +CDatabaseManager &CDatabaseManager::Get() { static CDatabaseManager s_manager; return s_manager; @@ -64,7 +63,6 @@ { CVideoDatabase db; UpdateDatabase(db, &g_advancedSettings.m_databaseVideo); } { CPVRDatabase db; UpdateDatabase(db, &g_advancedSettings.m_databaseTV); } { CEpgDatabase db; UpdateDatabase(db, &g_advancedSettings.m_databaseEpg); } - { CActiveAEDSPDatabase db; UpdateDatabase(db, &g_advancedSettings.m_databaseADSP); } CLog::Log(LOGDEBUG, "%s, updating databases... DONE", __FUNCTION__); } @@ -77,7 +75,7 @@ bool CDatabaseManager::CanOpen(const std::string &name) { CSingleLock lock(m_section); - std::map::const_iterator i = m_dbStatus.find(name); + map::const_iterator i = m_dbStatus.find(name); if (i != m_dbStatus.end()) return i->second == DB_READY; return false; // db isn't even attempted to update yet diff -Nru kodi-16.1~git20160425.1001-final/xbmc/DatabaseManager.h kodi-15.2~git20151019.1039-final/xbmc/DatabaseManager.h --- kodi-16.1~git20160425.1001-final/xbmc/DatabaseManager.h 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/DatabaseManager.h 2015-10-19 08:39:15.000000000 +0000 @@ -42,7 +42,7 @@ \brief The only way through which the global instance of the CDatabaseManager should be accessed. \return the global instance. */ - static CDatabaseManager &GetInstance(); + static CDatabaseManager &Get(); /*! \brief Initalize the database manager Checks that all databases are up to date, otherwise updates them. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/DbUrl.cpp kodi-15.2~git20151019.1039-final/xbmc/DbUrl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/DbUrl.cpp 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/DbUrl.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -22,7 +22,8 @@ #include "DbUrl.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" + +using namespace std; CDbUrl::CDbUrl() { @@ -146,7 +147,7 @@ void CDbUrl::updateOptions() { // Update the options string in the CURL object - std::string options = GetOptionsString(); + string options = GetOptionsString(); if (!options.empty()) options = "?" + options; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/DbUrl.h kodi-15.2~git20151019.1039-final/xbmc/DbUrl.h --- kodi-16.1~git20160425.1001-final/xbmc/DbUrl.h 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/DbUrl.h 2015-10-19 08:39:15.000000000 +0000 @@ -25,8 +25,6 @@ #include "URL.h" #include "utils/UrlOptions.h" -class CVariant; - class CDbUrl : public CUrlOptions { public: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/Database.cpp kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/Database.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/Database.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/Database.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,6 +23,7 @@ #include "filesystem/SpecialProtocol.h" #include "filesystem/File.h" #include "profiles/ProfilesManager.h" +#include "utils/AutoPtrHandle.h" #include "utils/log.h" #include "utils/SortUtils.h" #include "utils/StringUtils.h" @@ -34,6 +35,7 @@ #include "mysqldataset.h" #endif +using namespace AUTOPTR; using namespace dbiplus; #define MAX_COMPRESS_COUNT 20 @@ -148,7 +150,7 @@ if (!m_pDB.get() || !ds.get()) return ret; - if (ds->query(query) && ds->num_rows() > 0) + if (ds->query(query.c_str()) && ds->num_rows() > 0) ret = ds->fv(0).get_asString(); ds->close(); @@ -219,7 +221,7 @@ { if (NULL == m_pDB.get()) return bReturn; if (NULL == m_pDS.get()) return bReturn; - m_pDS->exec(strQuery); + m_pDS->exec(strQuery.c_str()); bReturn = true; } catch (...) @@ -242,7 +244,7 @@ std::string strPreparedQuery = PrepareSQL(strQuery.c_str()); - bReturn = m_pDS->query(strPreparedQuery); + bReturn = m_pDS->query(strPreparedQuery.c_str()); } catch (...) { @@ -310,7 +312,7 @@ } // check our database manager to see if this database can be opened - if (!CDatabaseManager::GetInstance().CanOpen(GetBaseDBName())) + if (!CDatabaseManager::Get().CanOpen(GetBaseDBName())) return false; DatabaseSettings dbSettings = settings; @@ -343,7 +345,7 @@ { dbSettings.type = "sqlite3"; if (dbSettings.host.empty()) - dbSettings.host = CSpecialProtocol::TranslatePath(CProfilesManager::GetInstance().GetDatabaseFolder()); + dbSettings.host = CSpecialProtocol::TranslatePath(CProfilesManager::Get().GetDatabaseFolder()); } // use separate, versioned database @@ -606,7 +608,7 @@ iCount = -1; m_pDS->close(); std::string strSQL=PrepareSQL("update version set iCompressCount=%i\n",++iCount); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); if (iCount != 0) return true; } @@ -683,7 +685,7 @@ CLog::Log(LOGINFO, "creating version table"); m_pDS->exec("CREATE TABLE version (idVersion integer, iCompressCount integer)\n"); std::string strSQL=PrepareSQL("INSERT INTO version (idVersion,iCompressCount) values(%i,0)\n", GetSchemaVersion()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); CreateTables(); CreateAnalytics(); @@ -701,7 +703,7 @@ void CDatabase::UpdateVersionNumber() { std::string strSQL=PrepareSQL("UPDATE version SET idVersion=%i\n", GetSchemaVersion()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } bool CDatabase::BuildSQL(const std::string &strQuery, const Filter &filter, std::string &strSQL) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/DatabaseQuery.cpp kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/DatabaseQuery.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/DatabaseQuery.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/DatabaseQuery.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,8 @@ #include "utils/Variant.h" #include "utils/XBMCTinyXML.h" +using namespace std; + typedef struct { char string[15]; @@ -170,7 +172,7 @@ rule.SetAttribute("field", TranslateField(m_field).c_str()); rule.SetAttribute("operator", TranslateOperator(m_operator).c_str()); - for (std::vector::const_iterator it = m_parameter.begin(); it != m_parameter.end(); ++it) + for (vector::const_iterator it = m_parameter.begin(); it != m_parameter.end(); ++it) { TiXmlElement value("value"); TiXmlText text(*it); @@ -250,8 +252,8 @@ std::string parameter; if (GetFieldType(m_field) == TEXTIN_FIELD) { - std::vector split = StringUtils::Split(param, ','); - for (std::vector::iterator itIn = split.begin(); itIn != split.end(); ++itIn) + vector split = StringUtils::Split(param, ','); + for (vector::iterator itIn = split.begin(); itIn != split.end(); ++itIn) { if (!parameter.empty()) parameter += ","; @@ -364,7 +366,7 @@ // now the query parameter std::string wholeQuery; - for (std::vector::const_iterator it = m_parameter.begin(); it != m_parameter.end(); ++it) + for (vector::const_iterator it = m_parameter.begin(); it != m_parameter.end(); ++it) { std::string query = '(' + FormatWhereClause(negate, operatorString, *it, db, strType) + ')'; @@ -390,7 +392,7 @@ std::string query; if (m_field != 0) { - std::string fmt = "%s"; + string fmt = "%s"; if (GetFieldType(m_field) == NUMERIC_FIELD) fmt = "CAST(%s as DECIMAL(5,1))"; else if (GetFieldType(m_field) == SECONDS_FIELD) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/dataset.cpp kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/dataset.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/dataset.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/dataset.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,12 +29,13 @@ #include "dataset.h" #include "utils/log.h" #include -#include #ifndef __GNUC__ #pragma warning (disable:4800) #endif +using namespace std; + namespace dbiplus { //************* Database implementation *************** @@ -48,7 +49,6 @@ sequence_table("db_sequence") { active = false; // No connection yet - compression = false; } Database::~Database() { @@ -72,11 +72,11 @@ return connect(true); } -std::string Database::prepare(const char *format, ...) +string Database::prepare(const char *format, ...) { va_list args; va_start(args, format); - std::string result = vprepare(format, args); + string result = vprepare(format, args); va_end(args); return result; @@ -93,7 +93,6 @@ frecno = 0; fbof = feof = true; autocommit = true; - fieldIndexMapID = ~0; fields_object = new Fields(); @@ -111,7 +110,6 @@ frecno = 0; fbof = feof = true; autocommit = true; - fieldIndexMapID = ~0; fields_object = new Fields(); @@ -165,13 +163,13 @@ select_sql = sel_sql; } -void Dataset::set_select_sql(const std::string &sel_sql) { +void Dataset::set_select_sql(const string &sel_sql) { select_sql = sel_sql; } -void Dataset::parse_sql(std::string &sql) { - std::string fpattern,by_what; +void Dataset::parse_sql(string &sql) { + string fpattern,by_what; for (unsigned int i=0;i< fields_object->size();i++) { fpattern = ":OLD_"+(*fields_object)[i].props.name; by_what = "'"+(*fields_object)[i].val.get_asString()+"'"; @@ -207,10 +205,6 @@ frecno = 0; fbof = feof = true; active = false; - - fieldIndexMap_Entries.clear(); - fieldIndexMap_Sorter.clear(); - fieldIndexMapID = ~0; } @@ -327,64 +321,25 @@ // return false; } -/********* INDEXMAP SECTION START *********/ -bool Dataset::get_index_map_entry(const char *f_name) { - if (~fieldIndexMapID) - { - unsigned int next(fieldIndexMapID+1 >= fieldIndexMap_Entries.size() ? 0 : fieldIndexMapID + 1); - if (fieldIndexMap_Entries[next].strName == f_name) //Yes, our assumption hits. - { - fieldIndexMapID = next; - return true; - } - } - // indexMap not found on the expected way, either first row strange retrival order - FieldIndexMapEntry tmp(f_name); - std::vector::iterator ins(lower_bound(fieldIndexMap_Sorter.begin(), fieldIndexMap_Sorter.end(), tmp, FieldIndexMapComparator(fieldIndexMap_Entries))); - if (ins == fieldIndexMap_Sorter.end() || (tmp < fieldIndexMap_Entries[*ins])) //new entry - { - //Insert the new item just behind last retrieved item - //In general this should be always end(), but could be different - fieldIndexMap_Sorter.insert(ins, ++fieldIndexMapID); - fieldIndexMap_Entries.insert(fieldIndexMap_Entries.begin() + fieldIndexMapID, tmp); - } - else //entry already existing! - { - fieldIndexMapID = *ins; - return true; - } - return false; //invalid -} -/********* INDEXMAP SECTION END *********/ const field_value Dataset::get_field_value(const char *f_name) { - if (ds_state != dsInactive) - { + const char* name=strstr(f_name, "."); + if (name) name++; + if (ds_state != dsInactive) { if (ds_state == dsEdit || ds_state == dsInsert){ for (unsigned int i=0; i < edit_object->size(); i++) - if (str_compare((*edit_object)[i].props.name.c_str(), f_name)==0) { - return (*edit_object)[i].val; - } + if (str_compare((*edit_object)[i].props.name.c_str(), f_name)==0) { + return (*edit_object)[i].val; + } throw DbErrors("Field not found: %s",f_name); - } + } else - { - //Lets try to reuse a string ->index conversation - if (get_index_map_entry(f_name)) - return get_field_value(static_cast(fieldIndexMap_Entries[fieldIndexMapID].fieldIndex)); - - const char* name=strstr(f_name, "."); - if (name) - name++; - for (unsigned int i=0; i < fields_object->size(); i++) - if (str_compare((*fields_object)[i].props.name.c_str(), f_name) == 0 || (name && str_compare((*fields_object)[i].props.name.c_str(), name) == 0)) { - fieldIndexMap_Entries[fieldIndexMapID].fieldIndex = i; - return (*fields_object)[i].val; - } - } - throw DbErrors("Field not found: %s",f_name); - } + if (str_compare((*fields_object)[i].props.name.c_str(), f_name)==0 || (name && str_compare((*fields_object)[i].props.name.c_str(), name)==0)) { + return (*fields_object)[i].val; + } + throw DbErrors("Field not found: %s",f_name); + } throw DbErrors("Dataset state is Inactive"); //field_value fv; //return fv; @@ -427,10 +382,10 @@ } int Dataset::str_compare(const char * s1, const char * s2) { - std::string ts1 = s1; - std::string ts2 = s2; - std::string::const_iterator p = ts1.begin(); - std::string::const_iterator p2 = ts2.begin(); + string ts1 = s1; + string ts2 = s2; + string::const_iterator p = ts1.begin(); + string::const_iterator p2 = ts2.begin(); while (p!=ts1.end() && p2 != ts2.end()) { if (toupper(*p)!=toupper(*p2)) return (toupper(*p)::const_iterator i; + std::map::const_iterator i; first(); while (!eof()) { result = true; @@ -475,7 +430,7 @@ bool result; if (plist.empty()) return false; - std::map::const_iterator i; + std::map::const_iterator i; while (!eof()) { result = true; for (i=plist.begin();i!=plist.end();++i) @@ -491,32 +446,32 @@ void Dataset::add_update_sql(const char *upd_sql){ - std::string s = upd_sql; + string s = upd_sql; update_sql.push_back(s); } -void Dataset::add_update_sql(const std::string &upd_sql){ +void Dataset::add_update_sql(const string &upd_sql){ update_sql.push_back(upd_sql); } void Dataset::add_insert_sql(const char *ins_sql){ - std::string s = ins_sql; + string s = ins_sql; insert_sql.push_back(s); } -void Dataset::add_insert_sql(const std::string &ins_sql){ +void Dataset::add_insert_sql(const string &ins_sql){ insert_sql.push_back(ins_sql); } void Dataset::add_delete_sql(const char *del_sql){ - std::string s = del_sql; + string s = del_sql; delete_sql.push_back(s); } -void Dataset::add_delete_sql(const std::string &del_sql){ +void Dataset::add_delete_sql(const string &del_sql){ delete_sql.push_back(del_sql); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/dataset.h kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/dataset.h --- kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/dataset.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/dataset.h 2015-10-19 08:39:16.000000000 +0000 @@ -287,7 +287,7 @@ /* status active is OK query */ virtual bool isActive(void) { return active; } - virtual void setSqlParams(const char *sqlFrmt, sqlType t, ...); + virtual void setSqlParams(const char *sqlFrmt, sqlType t, ...); /* error handling */ @@ -406,58 +406,6 @@ const sql_record* const get_sql_record(); private: - - unsigned int fieldIndexMapID; - -/* Struct to store an indexMapped field access entry */ - struct FieldIndexMapEntry - { - FieldIndexMapEntry(const char *name):fieldIndex(~0), strName(name){}; - bool operator < (const FieldIndexMapEntry &other) const {return strName < other.strName;}; - unsigned int fieldIndex; - std::string strName; - }; - -/* Comparator to quickly find an indexMapped field access entry in the unsorted fieldIndexMap_Entries vector */ - struct FieldIndexMapComparator - { - FieldIndexMapComparator(const std::vector &c): c_(c) {}; - bool operator()(const unsigned int &v, const FieldIndexMapEntry &o) const - { - return c_[v] < o; - }; - bool operator()(const unsigned int &v1, const unsigned int &v2) const - { - return c_[v1] < c_[v2]; - }; - bool operator()(const FieldIndexMapEntry &o, const unsigned int &v) const - { - return o < c_[v]; - }; - private: - const std::vector &c_; - }; - -/* Store string to field index translation in the same order - fields are accessed by field_value([string]). - Idea behind it: - - Open a SELECT query with many results - - track field access of the first row - - use this information for the following rows by just looking at the next - element in this vector -*/ - std::vector fieldIndexMap_Entries; - -/* Hold the sorting order regarding FieldIndexMapEntry::strName in the - fieldIndexMap_Entries vector. - If "next element" in fieldIndexMap_Entries does not match, - do a fast binary search inside it using the fieldIndexMap_Sorter. -*/ - std::vector fieldIndexMap_Sorter; - -/* Get the column index from a string field_value request */ - bool get_index_map_entry(const char *f_name); - void set_ds_state(dsStates new_state) {ds_state = new_state;}; public: /* return ds_state value */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/mysqldataset.cpp kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/mysqldataset.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/mysqldataset.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/mysqldataset.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,6 @@ #include "system.h" // for GetLastError() #include "network/WakeOnAccess.h" #include "Util.h" -#include "utils/StringUtils.h" #ifdef HAS_MYSQL #include "mysqldataset.h" @@ -40,6 +39,8 @@ #define MYSQL_OK 0 #define ER_BAD_DB_ERROR 1049 +using namespace std; + namespace dbiplus { //************* MysqlDatabase implementation *************** @@ -98,7 +99,6 @@ snprintf(err, 256, "Undefined MySQL error: Code (%d)", err_code); error = err; } - error = "[" + db + "] " + error; error += "\nQuery: "; error += qry; error += "\n"; @@ -109,47 +109,6 @@ return error.c_str(); } -void MysqlDatabase::configure_connection() { - char sqlcmd[512]; - int ret; - - // MySQL 5.7.5+: See #8393 - strcpy(sqlcmd, "SET SESSION sql_mode = (SELECT REPLACE(@@SESSION.sql_mode,'ONLY_FULL_GROUP_BY',''))"); - if ((ret = mysql_real_query(conn, sqlcmd, strlen(sqlcmd))) != MYSQL_OK) - throw DbErrors("Can't disable sql_mode ONLY_FULL_GROUP_BY: '%s' (%d)", db.c_str(), ret); - - // MySQL 5.7.6+: See #8393. Non-fatal if error, as not supported by MySQL 5.0.x - strcpy(sqlcmd, "SELECT @@SESSION.optimizer_switch"); - if ((ret = mysql_real_query(conn, sqlcmd, strlen(sqlcmd))) == MYSQL_OK) - { - MYSQL_RES* res = mysql_store_result(conn); - MYSQL_ROW row; - - if (res) - { - if ((row = mysql_fetch_row(res)) != NULL) - { - std::string column = row[0]; - std::vector split = StringUtils::Split(column, ','); - - for (std::vector::iterator itIn = split.begin(); itIn != split.end(); ++itIn) - { - if (StringUtils::Trim(*itIn) == "derived_merge=on") - { - strcpy(sqlcmd, "SET SESSION optimizer_switch = 'derived_merge=off'"); - if ((ret = mysql_real_query(conn, sqlcmd, strlen(sqlcmd))) != MYSQL_OK) - throw DbErrors("Can't set optimizer_switch = '%s': '%s' (%d)", StringUtils::Trim(*itIn).c_str(), db.c_str(), ret); - break; - } - } - } - mysql_free_result(res); - } - } - else - CLog::Log(LOGWARNING, "Unable to query optimizer_switch: '%s' (%d)", db.c_str(), ret); -} - int MysqlDatabase::connect(bool create_new) { if (host.empty() || db.empty()) return DB_CONNECTION_NONE; @@ -171,7 +130,7 @@ ciphers.empty() ? NULL : ciphers.c_str()); } - if (!CWakeOnAccess::GetInstance().WakeUpHost(host, "MySQL : " + db)) + if (!CWakeOnAccess::Get().WakeUpHost(host, "MySQL : " + db)) return DB_CONNECTION_NONE; // establish connection with just user credentials @@ -194,8 +153,6 @@ db.c_str(), mysql_errno(conn), mysql_error(conn)); } - configure_connection(); - // check existence if (exists()) { @@ -463,29 +420,26 @@ return DB_UNEXPECTED_RESULT; } res = mysql_store_result(conn); - if (res) + if (mysql_num_rows(res) == 0) { - if (mysql_num_rows(res) == 0) - { - id = 1; - sprintf(sqlcmd, "insert into %s (nextid,seq_name) values (%d,'%s')", seq_table, id, sname); - mysql_free_result(res); - if ((last_err = query_with_reconnect(sqlcmd)) != 0) return DB_UNEXPECTED_RESULT; - return id; - } - else - { - MYSQL_ROW row = mysql_fetch_row(res); - //id = (int)row[0]; - id = -1; - unsigned long *lengths; - lengths = mysql_fetch_lengths(res); - CLog::Log(LOGINFO, "Next id is [%.*s] ", (int)lengths[0], row[0]); - sprintf(sqlcmd, "update %s set nextid=%d where seq_name = '%s'", seq_table, id, sname); - mysql_free_result(res); - if ((last_err = query_with_reconnect(sqlcmd)) != 0) return DB_UNEXPECTED_RESULT; - return id; - } + id = 1; + sprintf(sqlcmd,"insert into %s (nextid,seq_name) values (%d,'%s')",seq_table,id,sname); + mysql_free_result(res); + if ((last_err = query_with_reconnect(sqlcmd)) != 0) return DB_UNEXPECTED_RESULT; + return id; + } + else + { + MYSQL_ROW row = mysql_fetch_row(res); + //id = (int)row[0]; + id = -1; + unsigned long *lengths; + lengths = mysql_fetch_lengths(res); + CLog::Log(LOGINFO,"Next id is [%.*s] ", (int) lengths[0], row[0]); + sprintf(sqlcmd,"update %s set nextid=%d where seq_name = '%s'",seq_table,id,sname); + mysql_free_result(res); + if ((last_err = query_with_reconnect(sqlcmd)) != 0) return DB_UNEXPECTED_RESULT; + return id; } return DB_UNEXPECTED_RESULT; } @@ -555,17 +509,17 @@ // methods for formatting // --------------------------------------------- -std::string MysqlDatabase::vprepare(const char *format, va_list args) +string MysqlDatabase::vprepare(const char *format, va_list args) { - std::string strFormat = format; - std::string strResult = ""; + string strFormat = format; + string strResult = ""; char *p; size_t pos; // %q is the sqlite format string for %s. // Any bad character, like "'", will be replaced with a proper one pos = 0; - while ( (pos = strFormat.find("%s", pos)) != std::string::npos ) + while ( (pos = strFormat.find("%s", pos)) != string::npos ) strFormat.replace(pos++, 2, "%q"); p = mysql_vmprintf(strFormat.c_str(), args); @@ -576,7 +530,7 @@ // RAND() is the mysql form of RANDOM() pos = 0; - while ( (pos = strResult.find("RANDOM()", pos)) != std::string::npos ) + while ( (pos = strResult.find("RANDOM()", pos)) != string::npos ) { strResult.replace(pos++, 8, "RAND()"); pos += 6; @@ -961,8 +915,8 @@ } bufpt = &buf[etBUFSIZE-1]; { - const char *cset; - int base; + register const char *cset; /* Use registers for speed */ + register int base; cset = &aDigits[infop->charset]; base = infop->base; do{ /* Convert to ascii */ @@ -1210,7 +1164,7 @@ ** the output. */ if( !flag_leftjustify ){ - int nspace; + register int nspace; nspace = width-length; if( nspace>0 ){ appendSpace(pAccum, nspace); @@ -1220,7 +1174,7 @@ mysqlStrAccumAppend(pAccum, bufpt, length); } if( flag_leftjustify ){ - int nspace; + register int nspace; nspace = width-length; if( nspace>0 ){ appendSpace(pAccum, nspace); @@ -1369,14 +1323,14 @@ } void MysqlDataset::make_query(StringList &_sql) { - std::string query; + string query; int result = 0; if (db == NULL) throw DbErrors("No Database Connection"); try { if (autocommit) db->start_transaction(); - for (std::list::iterator i =_sql.begin(); i!=_sql.end(); ++i) + for (list::iterator i =_sql.begin(); i!=_sql.end(); ++i) { query = *i; Dataset::parse_sql(query); @@ -1449,8 +1403,8 @@ //------------- public functions implementation -----------------// bool MysqlDataset::dropIndex(const char *table, const char *index) { - std::string sql; - std::string sql_prepared; + string sql; + string sql_prepared; sql = "SELECT * FROM information_schema.statistics WHERE TABLE_SCHEMA=DATABASE() AND table_name='%s' AND index_name='%s'"; sql_prepared = static_cast(db)->prepare(sql.c_str(), table, index); @@ -1475,37 +1429,37 @@ return tolower(l) == tolower(r); } -static size_t ci_find(const std::string& where, const std::string& what) +static size_t ci_find(const string& where, const string& what) { std::string::const_iterator loc = std::search(where.begin(), where.end(), what.begin(), what.end(), ci_test); if (loc == where.end()) - return std::string::npos; + return string::npos; else return loc - where.begin(); } -int MysqlDataset::exec(const std::string &sql) { +int MysqlDataset::exec(const string &sql) { if (!handle()) throw DbErrors("No Database Connection"); - std::string qry = sql; + string qry = sql; int res = 0; exec_res.clear(); // enforce the "auto_increment" keyword to be appended to "integer primary key" size_t loc; - if ( (loc=ci_find(qry, "integer primary key")) != std::string::npos) + if ( (loc=ci_find(qry, "integer primary key")) != string::npos) { qry = qry.insert(loc + 19, " auto_increment "); } // force the charset and collation to UTF-8 - if ( ci_find(qry, "CREATE TABLE") != std::string::npos - || ci_find(qry, "CREATE TEMPORARY TABLE") != std::string::npos ) + if ( ci_find(qry, "CREATE TABLE") != string::npos + || ci_find(qry, "CREATE TEMPORARY TABLE") != string::npos ) { // If CREATE TABLE ... SELECT Syntax is used we need to add the encoding after the table before the select // e.g. CREATE TABLE x CHARACTER SET utf8 COLLATE utf8_general_ci [AS] SELECT * FROM y - if ((loc = qry.find(" AS SELECT ")) != std::string::npos || - (loc = qry.find(" SELECT ")) != std::string::npos) + if ((loc = qry.find(" AS SELECT ")) != string::npos || + (loc = qry.find(" SELECT ")) != string::npos) { qry = qry.insert(loc, " CHARACTER SET utf8 COLLATE utf8_general_ci"); } @@ -1548,7 +1502,7 @@ size_t loc; // mysql doesn't understand CAST(foo as integer) => change to CAST(foo as signed integer) - while ((loc = ci_find(qry, "as integer)")) != std::string::npos) + while ((loc = ci_find(qry, "as integer)")) != string::npos) qry = qry.insert(loc + 3, "signed "); MYSQL_RES *stmt = NULL; @@ -1558,8 +1512,6 @@ MYSQL* conn = handle(); stmt = mysql_store_result(conn); - if (stmt == NULL) - throw DbErrors("Missing result set!"); // column headers const unsigned int numColumns = mysql_num_fields(stmt); @@ -1634,7 +1586,7 @@ return true; } -void MysqlDataset::open(const std::string &sql) { +void MysqlDataset::open(const string &sql) { set_select_sql(sql); open(); } @@ -1642,7 +1594,7 @@ void MysqlDataset::open() { if (select_sql.size()) { - query(select_sql); + query(select_sql.c_str()); } else { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/mysqldataset.h kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/mysqldataset.h --- kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/mysqldataset.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/mysqldataset.h 2015-04-04 00:00:15.000000000 +0000 @@ -85,7 +85,6 @@ bool in_transaction() {return _in_transaction;}; int query_with_reconnect(const char* query); - void configure_connection(); private: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/qry_dat.cpp kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/qry_dat.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/qry_dat.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/qry_dat.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -41,6 +41,8 @@ #pragma warning (disable:4715) #endif +using namespace std; + namespace dbiplus { //Constructors @@ -167,8 +169,8 @@ //Conversations functions -std::string field_value::get_asString() const { - std::string tmp; +string field_value::get_asString() const { + string tmp; switch (field_type) { case ft_String: { tmp = str_value; @@ -653,7 +655,7 @@ str_value = s; field_type = ft_String;} -void field_value::set_asString(const std::string & s) { +void field_value::set_asString(const string & s) { str_value = s; field_type = ft_String;} @@ -700,8 +702,8 @@ return field_type;} -std::string field_value::gft() { - std::string tmp; +string field_value::gft() { + string tmp; switch (field_type) { case ft_String: { tmp.assign("string"); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/sqlitedataset.cpp kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/sqlitedataset.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dbwrappers/sqlitedataset.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dbwrappers/sqlitedataset.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -38,6 +38,8 @@ #pragma comment(lib, "sqlite3.lib") #endif +using namespace std; + namespace dbiplus { //************* Callback function *************************** @@ -118,13 +120,13 @@ if ( (host[1] == ':') && isalpha(host[0])) { size_t pos = 0; - while ( (pos = host.find("/", pos)) != std::string::npos ) + while ( (pos = host.find("/", pos)) != string::npos ) host.replace(pos++, 1, "\\"); } else { size_t pos = 0; - while ( (pos = host.find("\\", pos)) != std::string::npos ) + while ( (pos = host.find("\\", pos)) != string::npos ) host.replace(pos++, 1, "/"); } } @@ -192,7 +194,6 @@ break; default : error = "Undefined SQLite error"; } - error = "[" + db + "] " + error; error += "\nQuery: "; error += qry; error += "\n"; @@ -272,7 +273,7 @@ CLog::Log(LOGDEBUG, "Copying from %s to %s at %s", db.c_str(), backup_name, host.c_str()); int rc; - std::string backup_db = backup_name; + string backup_db = backup_name; sqlite3 *pFile; /* Database connection opened on zFilename */ sqlite3_backup *pBackup; /* Backup object used to copy data */ @@ -285,7 +286,7 @@ if ( backup_db.find(".db") != (backup_db.length()-3) ) backup_db += ".db"; - std::string backup_path = host + backup_db; + string backup_path = host + backup_db; /* Open the database file identified by zFilename. Exit early if this fails ** for any reason. */ @@ -414,23 +415,23 @@ // methods for formatting // --------------------------------------------- -std::string SqliteDatabase::vprepare(const char *format, va_list args) +string SqliteDatabase::vprepare(const char *format, va_list args) { - std::string strFormat = format; - std::string strResult = ""; + string strFormat = format; + string strResult = ""; char *p; size_t pos; // %q is the sqlite format string for %s. // Any bad character, like "'", will be replaced with a proper one pos = 0; - while ( (pos = strFormat.find("%s", pos)) != std::string::npos ) + while ( (pos = strFormat.find("%s", pos)) != string::npos ) strFormat.replace(pos++, 2, "%q"); // the %I64 enhancement is not supported by sqlite3_vmprintf // must be %ll instead pos = 0; - while ( (pos = strFormat.find("%I64", pos)) != std::string::npos ) + while ( (pos = strFormat.find("%I64", pos)) != string::npos ) strFormat.replace(pos++, 4, "%ll"); p = sqlite3_vmprintf(strFormat.c_str(), args); @@ -482,7 +483,7 @@ } void SqliteDataset::make_query(StringList &_sql) { - std::string query; + string query; if (db == NULL) throw DbErrors("No Database Connection"); try { @@ -490,7 +491,7 @@ if (autocommit) db->start_transaction(); - for (std::list::iterator i =_sql.begin(); i!=_sql.end(); ++i) { + for (list::iterator i =_sql.begin(); i!=_sql.end(); ++i) { query = *i; char* err=NULL; Dataset::parse_sql(query); @@ -567,7 +568,7 @@ //------------- public functions implementation -----------------// bool SqliteDataset::dropIndex(const char *table, const char *index) { - std::string sql; + string sql; sql = static_cast(db)->prepare("DROP INDEX IF EXISTS %s", index); @@ -575,9 +576,9 @@ } -int SqliteDataset::exec(const std::string &sql) { +int SqliteDataset::exec(const string &sql) { if (!handle()) throw DbErrors("No Database Connection"); - std::string qry = sql; + string qry = sql; int res; exec_res.clear(); @@ -588,18 +589,18 @@ // after: CREATE UNIQUE INDEX ixPath ON path ( strPath ) // // NOTE: unexpected results occur if brackets are not matched - if ( qry.find("CREATE UNIQUE INDEX") != std::string::npos || - (qry.find("CREATE INDEX") != std::string::npos)) + if ( qry.find("CREATE UNIQUE INDEX") != string::npos || + (qry.find("CREATE INDEX") != string::npos)) { size_t pos = 0; size_t pos2 = 0; - if ( (pos = qry.find("(")) != std::string::npos ) + if ( (pos = qry.find("(")) != string::npos ) { pos++; - while ( (pos = qry.find("(", pos)) != std::string::npos ) + while ( (pos = qry.find("(", pos)) != string::npos ) { - if ( (pos2 = qry.find(")", pos)) != std::string::npos ) + if ( (pos2 = qry.find(")", pos)) != string::npos ) { qry.replace(pos, pos2-pos+1, ""); pos = pos2; @@ -611,11 +612,11 @@ // before: DROP INDEX foo ON table // after: DROP INDEX foo size_t pos = qry.find("DROP INDEX "); - if ( pos != std::string::npos ) + if ( pos != string::npos ) { pos = qry.find(" ON ", pos+1); - if ( pos != std::string::npos ) + if ( pos != string::npos ) qry = qry.substr(0, pos); } @@ -700,14 +701,14 @@ } } -void SqliteDataset::open(const std::string &sql) { +void SqliteDataset::open(const string &sql) { set_select_sql(sql); open(); } void SqliteDataset::open() { if (select_sql.size()) { - query(select_sql); + query(select_sql.c_str()); } else { ds_state = dsInactive; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogBoxBase.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogBoxBase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogBoxBase.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogBoxBase.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,8 @@ #include "guilib/LocalizeStrings.h" #include "threads/SingleLock.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" + +using namespace std; #define CONTROL_HEADING 1 #define CONTROL_LINES_START 2 @@ -62,7 +63,7 @@ return m_bConfirmed; } -void CGUIDialogBoxBase::SetHeading(CVariant heading) +void CGUIDialogBoxBase::SetHeading(const CVariant& heading) { std::string label = GetLocalized(heading); CSingleLock lock(m_section); @@ -73,11 +74,11 @@ } } -void CGUIDialogBoxBase::SetLine(unsigned int iLine, CVariant line) +void CGUIDialogBoxBase::SetLine(unsigned int iLine, const CVariant& line) { std::string label = GetLocalized(line); CSingleLock lock(m_section); - std::vector lines = StringUtils::Split(m_text, '\n'); + vector lines = StringUtils::Split(m_text, '\n'); if (iLine >= lines.size()) lines.resize(iLine+1); lines[iLine] = label; @@ -85,7 +86,7 @@ SetText(text); } -void CGUIDialogBoxBase::SetText(CVariant text) +void CGUIDialogBoxBase::SetText(const CVariant& text) { std::string label = GetLocalized(text); CSingleLock lock(m_section); @@ -115,8 +116,8 @@ { if (m_bInvalidated) { // take a copy of our labels to save holding the lock for too long - std::string heading, text; - std::vector choices; + string heading, text; + vector choices; choices.reserve(DIALOG_MAX_CHOICES); { CSingleLock lock(m_section); @@ -132,7 +133,7 @@ } else { - std::vector lines = StringUtils::Split(text, "\n", DIALOG_MAX_LINES); + vector lines = StringUtils::Split(text, "\n", DIALOG_MAX_LINES); lines.resize(DIALOG_MAX_LINES); for (size_t i = 0 ; i < lines.size(); ++i) SET_CONTROL_LABEL(CONTROL_LINES_START + i, lines[i]); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogBoxBase.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogBoxBase.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogBoxBase.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogBoxBase.h 2015-10-19 08:39:16.000000000 +0000 @@ -23,13 +23,12 @@ #include #include "guilib/GUIDialog.h" +#include "utils/Variant.h" #include "threads/CriticalSection.h" #define DIALOG_MAX_LINES 3 #define DIALOG_MAX_CHOICES 2 -class CVariant; - class CGUIDialogBoxBase : public CGUIDialog { @@ -38,9 +37,9 @@ virtual ~CGUIDialogBoxBase(void); virtual bool OnMessage(CGUIMessage& message); bool IsConfirmed() const; - void SetLine(unsigned int iLine, CVariant line); - void SetText(CVariant text); - void SetHeading(CVariant heading); + void SetLine(unsigned int iLine, const CVariant &line); + void SetText(const CVariant &text); + void SetHeading(const CVariant &heading); void SetChoice(int iButton, const CVariant &choice); protected: std::string GetDefaultLabel(int controlId) const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogBusy.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogBusy.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogBusy.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogBusy.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -67,8 +67,7 @@ CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); if (dialog) { - dialog->Open(); - + dialog->Show(); while(!event.WaitMSec(1)) { g_windowManager.ProcessRenderLoop(false); @@ -78,7 +77,6 @@ break; } } - dialog->Close(); } } @@ -86,10 +84,10 @@ } CGUIDialogBusy::CGUIDialogBusy(void) - : CGUIDialog(WINDOW_DIALOG_BUSY, "DialogBusy.xml", DialogModalityType::PARENTLESS_MODAL), - m_bLastVisible(false) + : CGUIDialog(WINDOW_DIALOG_BUSY, "DialogBusy.xml"), m_bLastVisible(false) { m_loadType = LOAD_ON_GUI_INIT; + m_modalityType = DialogModalityType::SYSTEM_MODAL; m_bCanceled = false; m_progress = 0; } @@ -98,16 +96,21 @@ { } -void CGUIDialogBusy::Open_Internal(const std::string ¶m /* = "" */) +void CGUIDialogBusy::Show_Internal() { m_bCanceled = false; + m_active = true; + m_modalityType = DialogModalityType::SYSTEM_MODAL; m_bLastVisible = true; + m_closing = false; m_progress = 0; + g_windowManager.RegisterDialog(this); - CGUIDialog::Open_Internal(false, param); + // active this window... + CGUIMessage msg(GUI_MSG_WINDOW_INIT, 0, 0); + OnMessage(msg); } - void CGUIDialogBusy::DoProcess(unsigned int currentTime, CDirtyRegionList &dirtyregions) { bool visible = g_windowManager.GetTopMostModalDialogID() == WINDOW_DIALOG_BUSY; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogBusy.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogBusy.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogBusy.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogBusy.h 2015-10-19 08:39:16.000000000 +0000 @@ -57,7 +57,7 @@ */ static bool WaitOnEvent(CEvent &event, unsigned int timeout = 100, bool allowCancel = true); protected: - virtual void Open_Internal(const std::string ¶m = ""); + virtual void Show_Internal(); // modeless'ish bool m_bCanceled; bool m_bLastVisible; float m_progress; ///< current progress diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogCache.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogCache.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogCache.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogCache.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,16 +20,12 @@ #include "threads/SystemClock.h" #include "GUIDialogCache.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "guilib/GUIWindowManager.h" #include "dialogs/GUIDialogProgress.h" #include "guilib/LocalizeStrings.h" #include "utils/log.h" #include "threads/SingleLock.h" -#include "utils/Variant.h" - - -using namespace KODI::MESSAGING; CGUIDialogCache::CGUIDialogCache(DWORD dwDelay, const std::string& strHeader, const std::string& strMsg) : CThread("GUIDialogCache"), m_strHeader(strHeader), @@ -61,7 +57,7 @@ // we cannot wait for the app thread to process the close message // as this might happen during player startup which leads to a deadlock if (m_pDlg && m_pDlg->IsDialogRunning()) - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_WINDOW_CLOSE, -1, bForceClose ? 1 : 0, static_cast(m_pDlg)); + CApplicationMessenger::Get().Close(m_pDlg,bForceClose,false); //Set stop, this will kill this object, when thread stops CThread::m_bStop = true; @@ -78,12 +74,12 @@ if (m_pDlg) { if (m_strHeader.empty()) - m_pDlg->SetHeading(CVariant{438}); + m_pDlg->SetHeading(438); else - m_pDlg->SetHeading(CVariant{m_strHeader}); + m_pDlg->SetHeading(m_strHeader); - m_pDlg->SetLine(2, CVariant{m_strLinePrev}); - m_pDlg->Open(); + m_pDlg->SetLine(2, m_strLinePrev); + m_pDlg->StartModal(); } bSentCancel = false; } @@ -102,9 +98,9 @@ { if (m_pDlg) { - m_pDlg->SetLine(0, CVariant{m_strLinePrev2}); - m_pDlg->SetLine(1, CVariant{m_strLinePrev}); - m_pDlg->SetLine(2, CVariant{strMessage}); + m_pDlg->SetLine(0, m_strLinePrev2); + m_pDlg->SetLine(1, m_strLinePrev); + m_pDlg->SetLine(2, strMessage); } m_strLinePrev2 = m_strLinePrev; m_strLinePrev = strMessage; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogContextMenu.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogContextMenu.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogContextMenu.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogContextMenu.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -45,7 +45,8 @@ #include "video/windows/GUIWindowVideoBase.h" #include "URL.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" + +using namespace std; #define BACKGROUND_IMAGE 999 #define GROUP_LIST 996 @@ -58,7 +59,7 @@ for (const_iterator i = begin(); i != end(); ++i) if (i->first == button) return; // already have this button - push_back(std::pair(button, label)); + push_back(pair(button, label)); } void CContextButtons::Add(unsigned int button, int label) @@ -66,7 +67,7 @@ for (const_iterator i = begin(); i != end(); ++i) if (i->first == button) return; // already have added this button - push_back(std::pair(button, g_localizeStrings.Get(label))); + push_back(pair(button, g_localizeStrings.Get(label))); } CGUIDialogContextMenu::CGUIDialogContextMenu(void) @@ -246,7 +247,7 @@ // Next, Add buttons to the ContextMenu that should ONLY be visible for sources and not autosourced items CMediaSource *share = GetShare(type, item.get()); - if (CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources() || g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetCurrentProfile().canWriteSources() || g_passwordManager.bMasterUser) { if (share) { @@ -261,7 +262,7 @@ else { ADDON::AddonPtr plugin; - if (ADDON::CAddonMgr::GetInstance().GetAddon(url.GetHostName(), plugin)) + if (ADDON::CAddonMgr::Get().GetAddon(url.GetHostName(), plugin)) if (plugin->HasSettings()) buttons.Add(CONTEXT_BUTTON_PLUGIN_SETTINGS, 1045); // Plugin Settings } @@ -275,9 +276,9 @@ if (!GetDefaultShareNameByType(type).empty()) buttons.Add(CONTEXT_BUTTON_CLEAR_DEFAULT, 13403); // Clear Default } - if (share && LOCK_MODE_EVERYONE != CProfilesManager::GetInstance().GetMasterProfile().getLockMode()) + if (share && LOCK_MODE_EVERYONE != CProfilesManager::Get().GetMasterProfile().getLockMode()) { - if (share->m_iHasLock == 0 && (CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources() || g_passwordManager.bMasterUser)) + if (share->m_iHasLock == 0 && (CProfilesManager::Get().GetCurrentProfile().canWriteSources() || g_passwordManager.bMasterUser)) buttons.Add(CONTEXT_BUTTON_ADD_LOCK, 12332); else if (share->m_iHasLock == 1) buttons.Add(CONTEXT_BUTTON_REMOVE_LOCK, 12335); @@ -286,8 +287,8 @@ buttons.Add(CONTEXT_BUTTON_REMOVE_LOCK, 12335); bool maxRetryExceeded = false; - if (CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES) != 0) - maxRetryExceeded = (share->m_iBadPwdCount >= CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES)); + if (CSettings::Get().GetInt("masterlock.maxretries") != 0) + maxRetryExceeded = (share->m_iBadPwdCount >= CSettings::Get().GetInt("masterlock.maxretries")); if (maxRetryExceeded) buttons.Add(CONTEXT_BUTTON_RESET_LOCK, 12334); @@ -304,12 +305,12 @@ // Add Source doesn't require a valid share if (button == CONTEXT_BUTTON_ADD_SOURCE) { - if (CProfilesManager::GetInstance().IsMasterProfile()) + if (CProfilesManager::Get().IsMasterProfile()) { if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; } - else if (!CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) + else if (!CProfilesManager::Get().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) return false; return CGUIDialogMediaSource::ShowAndAddMediaSource(type); @@ -344,7 +345,7 @@ switch (button) { case CONTEXT_BUTTON_EDIT_SOURCE: - if (CProfilesManager::GetInstance().IsMasterProfile()) + if (CProfilesManager::Get().IsMasterProfile()) { if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; @@ -356,20 +357,20 @@ case CONTEXT_BUTTON_REMOVE_SOURCE: { - if (CProfilesManager::GetInstance().IsMasterProfile()) + if (CProfilesManager::Get().IsMasterProfile()) { if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; } else { - if (!CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsMasterLockUnlocked(false)) + if (!CProfilesManager::Get().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsMasterLockUnlocked(false)) return false; - if (CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) + if (CProfilesManager::Get().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) return false; } // prompt user if they want to really delete the source - if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{751}, CVariant{750})) + if (!CGUIDialogYesNo::ShowAndGetInput(751, 750)) return false; // check default before we delete, as deletion will kill the share object @@ -379,11 +380,11 @@ if (share->strName == defaultSource) ClearDefault(type); } - CMediaSourceSettings::GetInstance().DeleteSource(type, share->strName, share->strPath); + CMediaSourceSettings::Get().DeleteSource(type, share->strName, share->strPath); return true; } case CONTEXT_BUTTON_SET_DEFAULT: - if (CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) + if (CProfilesManager::Get().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) return false; else if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; @@ -393,7 +394,7 @@ return true; case CONTEXT_BUTTON_CLEAR_DEFAULT: - if (CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) + if (CProfilesManager::Get().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) return false; else if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; @@ -403,7 +404,7 @@ case CONTEXT_BUTTON_SET_THUMB: { - if (CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) + if (CProfilesManager::Get().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) return false; else if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; @@ -458,8 +459,8 @@ if (!share->m_ignore) { - CMediaSourceSettings::GetInstance().UpdateSource(type,share->strName,"thumbnail",strThumb); - CMediaSourceSettings::GetInstance().Save(); + CMediaSourceSettings::Get().UpdateSource(type,share->strName,"thumbnail",strThumb); + CMediaSourceSettings::Get().Save(); } else if (!strThumb.empty()) { // this is some sort of an auto-share, so store in the texture database @@ -484,11 +485,11 @@ return false; // password entry and re-entry succeeded, write out the lock data share->m_iHasLock = 2; - CMediaSourceSettings::GetInstance().UpdateSource(type, share->strName, "lockcode", strNewPassword); + CMediaSourceSettings::Get().UpdateSource(type, share->strName, "lockcode", strNewPassword); strNewPassword = StringUtils::Format("%i", share->m_iLockMode); - CMediaSourceSettings::GetInstance().UpdateSource(type, share->strName, "lockmode", strNewPassword); - CMediaSourceSettings::GetInstance().UpdateSource(type, share->strName, "badpwdcount", "0"); - CMediaSourceSettings::GetInstance().Save(); + CMediaSourceSettings::Get().UpdateSource(type, share->strName, "lockmode", strNewPassword); + CMediaSourceSettings::Get().UpdateSource(type, share->strName, "badpwdcount", "0"); + CMediaSourceSettings::Get().Save(); CGUIMessage msg(GUI_MSG_NOTIFY_ALL,0,0,GUI_MSG_UPDATE_SOURCES); g_windowManager.SendThreadMessage(msg); @@ -500,8 +501,8 @@ if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; - CMediaSourceSettings::GetInstance().UpdateSource(type, share->strName, "badpwdcount", "0"); - CMediaSourceSettings::GetInstance().Save(); + CMediaSourceSettings::Get().UpdateSource(type, share->strName, "badpwdcount", "0"); + CMediaSourceSettings::Get().Save(); CGUIMessage msg(GUI_MSG_NOTIFY_ALL,0,0,GUI_MSG_UPDATE_SOURCES); g_windowManager.SendThreadMessage(msg); return true; @@ -511,14 +512,14 @@ if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; - if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{12335}, CVariant{750})) + if (!CGUIDialogYesNo::ShowAndGetInput(12335, 750)) return false; share->m_iHasLock = 0; - CMediaSourceSettings::GetInstance().UpdateSource(type, share->strName, "lockmode", "0"); - CMediaSourceSettings::GetInstance().UpdateSource(type, share->strName, "lockcode", "0"); - CMediaSourceSettings::GetInstance().UpdateSource(type, share->strName, "badpwdcount", "0"); - CMediaSourceSettings::GetInstance().Save(); + CMediaSourceSettings::Get().UpdateSource(type, share->strName, "lockmode", "0"); + CMediaSourceSettings::Get().UpdateSource(type, share->strName, "lockcode", "0"); + CMediaSourceSettings::Get().UpdateSource(type, share->strName, "badpwdcount", "0"); + CMediaSourceSettings::Get().Save(); CGUIMessage msg(GUI_MSG_NOTIFY_ALL,0,0,GUI_MSG_UPDATE_SOURCES); g_windowManager.SendThreadMessage(msg); return true; @@ -526,8 +527,8 @@ case CONTEXT_BUTTON_REACTIVATE_LOCK: { bool maxRetryExceeded = false; - if (CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES) != 0) - maxRetryExceeded = (share->m_iBadPwdCount >= CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES)); + if (CSettings::Get().GetInt("masterlock.maxretries") != 0) + maxRetryExceeded = (share->m_iBadPwdCount >= CSettings::Get().GetInt("masterlock.maxretries")); if (!maxRetryExceeded) { // don't prompt user for mastercode when reactivating a lock @@ -548,10 +549,10 @@ else return false; // password ReSet and re-entry succeeded, write out the lock data - CMediaSourceSettings::GetInstance().UpdateSource(type, share->strName, "lockcode", strNewPW); - CMediaSourceSettings::GetInstance().UpdateSource(type, share->strName, "lockmode", strNewLockMode); - CMediaSourceSettings::GetInstance().UpdateSource(type, share->strName, "badpwdcount", "0"); - CMediaSourceSettings::GetInstance().Save(); + CMediaSourceSettings::Get().UpdateSource(type, share->strName, "lockcode", strNewPW); + CMediaSourceSettings::Get().UpdateSource(type, share->strName, "lockmode", strNewLockMode); + CMediaSourceSettings::Get().UpdateSource(type, share->strName, "badpwdcount", "0"); + CMediaSourceSettings::Get().Save(); CGUIMessage msg(GUI_MSG_NOTIFY_ALL,0,0,GUI_MSG_UPDATE_SOURCES); g_windowManager.SendThreadMessage(msg); return true; @@ -564,7 +565,7 @@ CMediaSource *CGUIDialogContextMenu::GetShare(const std::string &type, const CFileItem *item) { - VECSOURCES *shares = CMediaSourceSettings::GetInstance().GetSources(type); + VECSOURCES *shares = CMediaSourceSettings::Get().GetSources(type); if (!shares || !item) return NULL; for (unsigned int i = 0; i < shares->size(); i++) { @@ -624,8 +625,8 @@ std::string CGUIDialogContextMenu::GetDefaultShareNameByType(const std::string &strType) { - VECSOURCES *pShares = CMediaSourceSettings::GetInstance().GetSources(strType); - std::string strDefault = CMediaSourceSettings::GetInstance().GetDefaultSource(strType); + VECSOURCES *pShares = CMediaSourceSettings::Get().GetSources(strType); + std::string strDefault = CMediaSourceSettings::Get().GetDefaultSource(strType); if (!pShares) return ""; @@ -639,8 +640,8 @@ void CGUIDialogContextMenu::SetDefault(const std::string &strType, const std::string &strDefault) { - CMediaSourceSettings::GetInstance().SetDefaultSource(strType, strDefault); - CMediaSourceSettings::GetInstance().Save(); + CMediaSourceSettings::Get().SetDefaultSource(strType, strDefault); + CMediaSourceSettings::Get().Save(); } void CGUIDialogContextMenu::ClearDefault(const std::string &strType) @@ -682,7 +683,7 @@ pMenu->SetInitialVisibility(); pMenu->SetupButtons(); pMenu->PositionAtCurrentFocus(); - pMenu->Open(); + pMenu->DoModal(); return pMenu->m_clickedButton; } return -1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogContextMenu.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogContextMenu.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogContextMenu.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogContextMenu.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,11 +20,8 @@ * */ -#include - #include "guilib/GUIDialog.h" - class CMediaSource; enum CONTEXT_BUTTON { CONTEXT_BUTTON_CANCELLED = 0, @@ -78,6 +75,7 @@ CONTEXT_BUTTON_INFO, CONTEXT_BUTTON_INFO_ALL, CONTEXT_BUTTON_CDDB, + CONTEXT_BUTTON_REFRESH, CONTEXT_BUTTON_SCAN, CONTEXT_BUTTON_STOP_SCANNING, CONTEXT_BUTTON_SET_ARTIST_THUMB, @@ -105,9 +103,7 @@ CONTEXT_BUTTON_ADD, CONTEXT_BUTTON_ACTIVATE, CONTEXT_BUTTON_START_RECORD, - CONTEXT_BUTTON_ADD_TIMER, CONTEXT_BUTTON_STOP_RECORD, - CONTEXT_BUTTON_DELETE_TIMER, CONTEXT_BUTTON_GROUP_MANAGER, CONTEXT_BUTTON_CHANNEL_MANAGER, CONTEXT_BUTTON_FILTER, @@ -126,6 +122,7 @@ CONTEXT_BUTTON_PLAY_AND_QUEUE, CONTEXT_BUTTON_PLAY_ONLY_THIS, CONTEXT_BUTTON_UPDATE_EPG, + CONTEXT_BUTTON_RECORD_ITEM, CONTEXT_BUTTON_TAGS_ADD_ITEMS, CONTEXT_BUTTON_TAGS_REMOVE_ITEMS, CONTEXT_BUTTON_SET_MOVIESET, @@ -134,9 +131,6 @@ CONTEXT_BUTTON_EDIT_SORTTITLE, CONTEXT_BUTTON_UNDELETE, CONTEXT_BUTTON_DELETE_ALL, - CONTEXT_BUTTON_HELP, - CONTEXT_BUTTON_ACTIVE_ADSP_SETTINGS, - CONTEXT_BUTTON_CHECK_FOR_UPDATES, CONTEXT_BUTTON_USER1, CONTEXT_BUTTON_USER2, CONTEXT_BUTTON_USER3, diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogExtendedProgressBar.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogExtendedProgressBar.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogExtendedProgressBar.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogExtendedProgressBar.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -30,20 +30,22 @@ #define ITEM_SWITCH_TIME_MS 2000 -std::string CGUIDialogProgressBarHandle::Text(void) const +using namespace std; + +string CGUIDialogProgressBarHandle::Text(void) const { CSingleLock lock(m_critSection); - std::string retVal(m_strText); + string retVal(m_strText); return retVal; } -void CGUIDialogProgressBarHandle::SetText(const std::string &strText) +void CGUIDialogProgressBarHandle::SetText(const string &strText) { CSingleLock lock(m_critSection); m_strText = strText; } -void CGUIDialogProgressBarHandle::SetTitle(const std::string &strTitle) +void CGUIDialogProgressBarHandle::SetTitle(const string &strTitle) { CSingleLock lock(m_critSection); m_strTitle = strTitle; @@ -57,14 +59,14 @@ } CGUIDialogExtendedProgressBar::CGUIDialogExtendedProgressBar(void) - : CGUIDialog(WINDOW_DIALOG_EXT_PROGRESS, "DialogExtendedProgressBar.xml", DialogModalityType::MODELESS) + : CGUIDialog(WINDOW_DIALOG_EXT_PROGRESS, "DialogExtendedProgressBar.xml") { m_loadType = LOAD_ON_GUI_INIT; m_iLastSwitchTime = 0; m_iCurrentItem = 0; } -CGUIDialogProgressBarHandle *CGUIDialogExtendedProgressBar::GetHandle(const std::string &strTitle) +CGUIDialogProgressBarHandle *CGUIDialogExtendedProgressBar::GetHandle(const string &strTitle) { CGUIDialogProgressBarHandle *handle = new CGUIDialogProgressBarHandle(strTitle); { @@ -72,7 +74,7 @@ m_handles.push_back(handle); } - Open(); + Show(); return handle; } @@ -106,8 +108,8 @@ void CGUIDialogExtendedProgressBar::UpdateState(unsigned int currentTime) { - std::string strHeader; - std::string strTitle; + string strHeader; + string strTitle; float fProgress(-1.0f); { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogFavourites.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogFavourites.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogFavourites.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogFavourites.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -31,7 +31,6 @@ #include "guilib/LocalizeStrings.h" #include "storage/MediaManager.h" #include "ContextMenuManager.h" -#include "utils/Variant.h" using namespace XFILE; @@ -133,7 +132,7 @@ choices.Add(5, 20019); CFileItemPtr itemPtr = m_favourites->Get(item); - CContextMenuManager::GetInstance().AddVisibleItems(itemPtr, choices); + CContextMenuManager::Get().AddVisibleItems(itemPtr, choices); int button = CGUIDialogContextMenu::ShowAndGetChoice(choices); @@ -151,7 +150,7 @@ else if (button == 5) OnSetThumb(item); else if (button >= CONTEXT_BUTTON_FIRST_ADDON) - CContextMenuManager::GetInstance().OnClick(button, itemPtr); + CContextMenuManager::Get().Execute(button, itemPtr); } void CGUIDialogFavourites::OnMoveItem(int item, int amount) @@ -189,7 +188,7 @@ return; std::string label((*m_favourites)[item]->GetLabel()); - if (CGUIKeyboardFactory::ShowAndGetInput(label, CVariant{g_localizeStrings.Get(16008)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(label, g_localizeStrings.Get(16008), false)) (*m_favourites)[item]->SetLabel(label); CFavouritesDirectory::Save(*m_favourites); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogFileBrowser.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogFileBrowser.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogFileBrowser.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogFileBrowser.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -45,7 +45,6 @@ #include "guilib/LocalizeStrings.h" #include "utils/log.h" #include "URL.h" -#include "utils/Variant.h" using namespace XFILE; @@ -223,7 +222,7 @@ Close(); } else - CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{20072}); + CGUIDialogOK::ShowAndGetInput(257, 20072); } else { @@ -249,13 +248,13 @@ else if (message.GetSenderId() == CONTROL_NEWFOLDER) { std::string strInput; - if (CGUIKeyboardFactory::ShowAndGetInput(strInput, CVariant{g_localizeStrings.Get(119)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(strInput,g_localizeStrings.Get(119),false)) { std::string strPath = URIUtils::AddFileToFolder(m_vecItems->GetPath(), strInput); if (CDirectory::Create(strPath)) Update(m_vecItems->GetPath()); else - CGUIDialogOK::ShowAndGetInput(CVariant{20069}, CVariant{20072}); + CGUIDialogOK::ShowAndGetInput(20069, 20072); } } else if (message.GetSenderId() == CONTROL_FLIP) @@ -427,8 +426,8 @@ OnSort(); if (m_Directory->GetPath().empty() && m_addNetworkShareEnabled && - (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || - CProfilesManager::GetInstance().IsMasterProfile() || g_passwordManager.bMasterUser)) + (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || + CProfilesManager::Get().IsMasterProfile() || g_passwordManager.bMasterUser)) { // we are in the virtual directory - add the "Add Network Location" item CFileItemPtr pItem(new CFileItem(g_localizeStrings.Get(1032))); pItem->SetPath("net://"); @@ -568,7 +567,7 @@ { if ( !g_mediaManager.IsDiscInDrive() ) { - CGUIDialogOK::ShowAndGetInput(CVariant{218}, CVariant{219}); + CGUIDialogOK::ShowAndGetInput(218, 219); return false; } } @@ -577,7 +576,7 @@ // TODO: Handle not connected to a remote share if ( !g_application.getNetwork().IsConnected() ) { - CGUIDialogOK::ShowAndGetInput(CVariant{220}, CVariant{221}); + CGUIDialogOK::ShowAndGetInput(220, 221); return false; } } @@ -629,7 +628,7 @@ } browser->SetHeading(heading); browser->m_flipEnabled = flip?true:false; - browser->Open(); + browser->DoModal(); bool confirmed(browser->IsConfirmed()); if (confirmed) { @@ -706,7 +705,7 @@ browser->m_rootDir.SetMask(strMask); browser->m_selectedPath = path; browser->m_addNetworkShareEnabled = false; - browser->Open(); + browser->DoModal(); bool confirmed(browser->IsConfirmed()); if (confirmed) path = browser->m_selectedPath; @@ -762,7 +761,7 @@ browser->m_rootDir.SetMask(strMask); browser->m_selectedPath = directory; browser->m_addNetworkShareEnabled = false; - browser->Open(); + browser->DoModal(); bool confirmed(browser->IsConfirmed()); if (confirmed) path = browser->m_selectedPath; @@ -795,7 +794,7 @@ browser->m_browsingForFolders = 0; browser->m_rootDir.SetMask(mask); browser->m_addNetworkShareEnabled = false; - browser->Open(); + browser->DoModal(); bool confirmed(browser->IsConfirmed()); if (confirmed) { @@ -870,7 +869,7 @@ browser->m_browsingForFolders = 1; browser->m_addNetworkShareEnabled = allowNetworkShares; browser->m_selectedPath = ""; - browser->Open(); + browser->DoModal(); bool confirmed = browser->IsConfirmed(); if (confirmed) path = browser->m_selectedPath; @@ -896,7 +895,7 @@ { // verify the path by doing a GetDirectory. CFileItemList items; - if (CDirectory::GetDirectory(path, items, "", DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_ALLOW_PROMPT) || CGUIDialogYesNo::ShowAndGetInput(CVariant{1001}, CVariant{1002})) + if (CDirectory::GetDirectory(path, items, "", DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_ALLOW_PROMPT) || CGUIDialogYesNo::ShowAndGetInput(1001, 1002)) { // add the network location to the shares list CMediaSource share; share.strPath = path; //setPath(path); @@ -916,7 +915,7 @@ { if (CGUIDialogMediaSource::ShowAndAddMediaSource(m_addSourceType)) { - SetSources(*CMediaSourceSettings::GetInstance().GetSources(m_addSourceType)); + SetSources(*CMediaSourceSettings::Get().GetSources(m_addSourceType)); Update(""); } } @@ -925,7 +924,7 @@ { if (CGUIDialogMediaSource::ShowAndEditMediaSource(m_addSourceType,pItem->GetLabel())) { - SetSources(*CMediaSourceSettings::GetInstance().GetSources(m_addSourceType)); + SetSources(*CMediaSourceSettings::Get().GetSources(m_addSourceType)); Update(""); } } @@ -946,25 +945,23 @@ if (CGUIDialogNetworkSetup::ShowAndGetNetworkAddress(newPath)) { g_mediaManager.SetLocationPath(strOldPath,newPath); - CURL url(newPath); for (unsigned int i=0;iGetPath()); - m_viewControl.SetSelectedItem(iItem); + m_selectedPath = newPath; + DoModal(); } } else @@ -998,8 +995,8 @@ } else { - CMediaSourceSettings::GetInstance().DeleteSource(m_addSourceType,(*m_vecItems)[iItem]->GetLabel(),(*m_vecItems)[iItem]->GetPath()); - SetSources(*CMediaSourceSettings::GetInstance().GetSources(m_addSourceType)); + CMediaSourceSettings::Get().DeleteSource(m_addSourceType,(*m_vecItems)[iItem]->GetLabel(),(*m_vecItems)[iItem]->GetPath()); + SetSources(*CMediaSourceSettings::Get().GetSources(m_addSourceType)); Update(""); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogGamepad.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogGamepad.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogGamepad.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogGamepad.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,12 +26,9 @@ #include "GUIDialogOK.h" #include "input/Key.h" #include "guilib/LocalizeStrings.h" -#include "utils/Variant.h" - -#include CGUIDialogGamepad::CGUIDialogGamepad(void) - : CGUIDialogBoxBase(WINDOW_DIALOG_GAMEPAD, "DialogOK.xml") + : CGUIDialogBoxBase(WINDOW_DIALOG_GAMEPAD, "DialogGamepad.xml") { m_bCanceled = false; m_iRetries = 0; @@ -43,14 +40,6 @@ CGUIDialogGamepad::~CGUIDialogGamepad(void) {} -void CGUIDialogGamepad::OnInitWindow() -{ - // hide ok button from DialogOK - SET_CONTROL_HIDDEN(10); - - CGUIDialogBoxBase::OnInitWindow(); -} - bool CGUIDialogGamepad::OnAction(const CAction &action) { if ((action.GetButtonCode() >= KEY_BUTTON_A && @@ -95,7 +84,7 @@ { strHiddenInput[i] = m_cHideInputChar; } - SetLine(2, CVariant{std::move(strHiddenInput)}); + SetLine(2, strHiddenInput); return true; } else if (action.GetButtonCode() == KEY_BUTTON_BACK || action.GetID() == ACTION_PREVIOUS_MENU || action.GetID() == ACTION_NAV_BACK) @@ -207,7 +196,7 @@ if (ShowAndVerifyInput(strUserInput, "12340", "12330", "12331", "", true, true)) { // TODO: Show error to user saying the password entry was blank - CGUIDialogOK::ShowAndGetInput(CVariant{12357}, CVariant{12358}); // Password is empty/blank + CGUIDialogOK::ShowAndGetInput(12357, 12358); // Password is empty/blank return false; } @@ -219,7 +208,7 @@ if (!ShowAndVerifyInput(strUserInput, "12341", "12330", "12331", "", false, true)) { // TODO: Show error to user saying the password re-entry failed - CGUIDialogOK::ShowAndGetInput(CVariant{12357}, CVariant{12344}); // Password do not match + CGUIDialogOK::ShowAndGetInput(12357, 12344); // Password do not match return false; } @@ -279,27 +268,27 @@ // HACK: This won't work if the label specified is actually a positive numeric value, but that's very unlikely if (!StringUtils::IsNaturalNumber(dlgHeading)) - pDialog->SetHeading(CVariant{dlgHeading}); + pDialog->SetHeading( dlgHeading ); else - pDialog->SetHeading(CVariant{atoi(dlgHeading.c_str())}); + pDialog->SetHeading( atoi(dlgHeading.c_str()) ); if (!StringUtils::IsNaturalNumber(dlgLine0)) - pDialog->SetLine(0, CVariant{dlgLine0}); + pDialog->SetLine( 0, dlgLine0 ); else - pDialog->SetLine(0, CVariant{atoi(dlgLine0.c_str())}); + pDialog->SetLine( 0, atoi(dlgLine0.c_str()) ); if (!StringUtils::IsNaturalNumber(dlgLine1)) - pDialog->SetLine(1, CVariant{dlgLine1}); + pDialog->SetLine( 1, dlgLine1 ); else - pDialog->SetLine(1, CVariant{atoi(dlgLine1.c_str())}); + pDialog->SetLine( 1, atoi(dlgLine1.c_str()) ); if (!StringUtils::IsNaturalNumber(dlgLine2)) - pDialog->SetLine(2, CVariant{dlgLine2}); + pDialog->SetLine( 2, dlgLine2 ); else - pDialog->SetLine(2, CVariant{atoi(dlgLine2.c_str())}); + pDialog->SetLine( 2, atoi(dlgLine2.c_str()) ); g_audioManager.Enable(false); // dont do sounds during pwd input - pDialog->Open(); + pDialog->DoModal(); g_audioManager.Enable(true); if (bGetUserInput && !pDialog->IsCanceled()) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogGamepad.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogGamepad.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogGamepad.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogGamepad.h 2015-10-19 08:39:16.000000000 +0000 @@ -41,7 +41,6 @@ static bool ShowAndVerifyInput(std::string& strPassword, const std::string& dlgHeading, const std::string& dlgLine0, const std::string& dlgLine1, const std::string& dlgLine2, bool bGetUserInput, bool bHideInputChars); protected: virtual bool OnAction(const CAction &action); - virtual void OnInitWindow(); bool m_bCanceled; char m_cHideInputChar; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogKaiToast.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogKaiToast.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogKaiToast.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogKaiToast.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,12 +25,15 @@ #define POPUP_ICON 400 #define POPUP_CAPTION_TEXT 401 #define POPUP_NOTIFICATION_BUTTON 402 +#define POPUP_ICON_INFO 403 +#define POPUP_ICON_WARNING 404 +#define POPUP_ICON_ERROR 405 CGUIDialogKaiToast::TOASTQUEUE CGUIDialogKaiToast::m_notifications; CCriticalSection CGUIDialogKaiToast::m_critical; CGUIDialogKaiToast::CGUIDialogKaiToast(void) - : CGUIDialog(WINDOW_DIALOG_KAI_TOAST, "DialogKaiToast.xml", DialogModalityType::MODELESS) +: CGUIDialog(WINDOW_DIALOG_KAI_TOAST, "DialogKaiToast.xml") { m_loadType = LOAD_ON_GUI_INIT; m_timer = 0; @@ -62,6 +65,14 @@ return CGUIDialog::OnMessage(message); } +void CGUIDialogKaiToast::OnWindowLoaded() +{ + CGUIDialog::OnWindowLoaded(); + CGUIMessage msg(GUI_MSG_GET_FILENAME, GetID(), POPUP_ICON); + if (OnMessage(msg)) + m_defaultIcon = msg.GetLabel(); +} + void CGUIDialogKaiToast::QueueNotification(eMessageType eType, const std::string& aCaption, const std::string& aDescription, unsigned int displayTime /*= TOAST_DISPLAY_TIME*/, bool withSound /*= true*/, unsigned int messageTime /*= TOAST_MESSAGE_TIME*/) { AddToQueue("", eType, aCaption, aDescription, displayTime, withSound, messageTime); @@ -118,17 +129,29 @@ // set the appropriate icon { - std::string icon = toast.imagefile; - if (icon.empty()) + std::string strTypeImage = toast.imagefile; + + if (strTypeImage.empty()) { - if (toast.eType == Warning) - icon = "DefaultIconWarning.png"; - else if (toast.eType == Error) - icon = "DefaultIconError.png"; + if (toast.eType == Default) + strTypeImage = m_defaultIcon; else - icon = "DefaultIconInfo.png"; + { + int imageControl = -1; + if (toast.eType == Info) + imageControl = POPUP_ICON_INFO; + else if (toast.eType == Warning) + imageControl = POPUP_ICON_WARNING; + else if (toast.eType == Error) + imageControl = POPUP_ICON_ERROR; + + CGUIMessage msg(GUI_MSG_GET_FILENAME, GetID(), imageControl); + if (OnMessage(msg)) + strTypeImage = msg.GetLabel(); + } } - SET_CONTROL_FILENAME(POPUP_ICON, icon); + + SET_CONTROL_FILENAME(POPUP_ICON, strTypeImage); } // Play the window specific init sound for each notification queued diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogKaiToast.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogKaiToast.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogKaiToast.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogKaiToast.h 2015-10-19 08:39:16.000000000 +0000 @@ -54,6 +54,7 @@ bool DoWork(); virtual bool OnMessage(CGUIMessage& message); + virtual void OnWindowLoaded(); virtual void FrameMove(); void ResetTimer(); @@ -64,6 +65,8 @@ unsigned int m_toastDisplayTime; unsigned int m_toastMessageTime; + + std::string m_defaultIcon; static TOASTQUEUE m_notifications; static CCriticalSection m_critical; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogKeyboardGeneric.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogKeyboardGeneric.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogKeyboardGeneric.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogKeyboardGeneric.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2012-2013 Team Kodi - * http://kodi.tv + * Copyright (C) 2012-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,9 +20,7 @@ #include "interfaces/AnnouncementManager.h" #include "input/XBMC_vkeys.h" -#include "input/InputCodingTable.h" #include "guilib/GUIEditControl.h" -#include "guilib/GUILabelControl.h" #include "guilib/GUIWindowManager.h" #include "input/KeyboardLayoutManager.h" #include "input/Key.h" @@ -33,14 +31,9 @@ #include "GUIDialogKeyboardGeneric.h" #include "settings/Settings.h" #include "utils/RegExp.h" -#include "utils/Variant.h" -#include "utils/StringUtils.h" -#include "messaging/ApplicationMessenger.h" -#include "utils/CharsetConverter.h" +#include "ApplicationMessenger.h" #include "windowing/WindowingFactory.h" -using namespace KODI::MESSAGING; - #define BUTTON_ID_OFFSET 100 #define BUTTONS_PER_ROW 20 #define BUTTONS_MAX_ROWS 4 @@ -58,8 +51,6 @@ #define CTL_LABEL_HEADING 311 #define CTL_EDIT 312 -#define CTL_LABEL_HZCODE 313 -#define CTL_LABEL_HZLIST 314 #define CTL_BUTTON_BACKSPACE 8 #define CTL_BUTTON_SPACE 32 @@ -79,42 +70,11 @@ m_loadType = KEEP_IN_MEMORY; m_isKeyboardNavigationMode = false; m_previouslyFocusedButton = 0; - m_codingtable = NULL; - m_pos = 0; - m_listwidth = 600; - m_hzcode = ""; } void CGUIDialogKeyboardGeneric::OnWindowLoaded() { g_Windowing.EnableTextInput(false); - CGUIEditControl *edit = (CGUIEditControl *)GetControl(CTL_EDIT); - if (edit) - { - // add control CTL_LABEL_HZCODE and CTL_LABEL_HZLIST if not exist - CGUIControlGroup *ParentControl = (CGUIControlGroup *)edit->GetParentControl(); - CLabelInfo labelInfo = edit->GetLabelInfo(); - float px = edit->GetXPosition(); - float py = edit->GetYPosition(); - float pw = edit->GetWidth(); - float ph = edit->GetHeight(); - - CGUILabelControl* control = ((CGUILabelControl*)GetControl(CTL_LABEL_HZCODE)); - if (!control) - { - control = new CGUILabelControl(GetID(), CTL_LABEL_HZCODE, px, py + ph, 90, 30, labelInfo, false, false); - ParentControl->AddControl(control); - } - - control = ((CGUILabelControl*)GetControl(CTL_LABEL_HZLIST)); - if (!control) - { - labelInfo.align = XBFONT_CENTER_Y; - control = new CGUILabelControl(GetID(), CTL_LABEL_HZLIST, px + 95, py + ph, pw - 95, 30, labelInfo, false, false); - ParentControl->AddControl(control); - } - } - CGUIDialog::OnWindowLoaded(); } @@ -128,8 +88,8 @@ // fill in the keyboard layouts m_currentLayout = 0; m_layouts.clear(); - const KeyboardLayouts& keyboardLayouts = CKeyboardLayoutManager::GetInstance().GetLayouts(); - std::vector layoutNames = CSettings::GetInstance().GetList(CSettings::SETTING_LOCALE_KEYBOARDLAYOUTS); + const KeyboardLayouts& keyboardLayouts = CKeyboardLayoutManager::Get().GetLayouts(); + std::vector layoutNames = CSettings::Get().GetList("locale.keyboardlayouts"); for (std::vector::const_iterator layoutName = layoutNames.begin(); layoutName != layoutNames.end(); ++layoutName) { @@ -158,29 +118,17 @@ } SetEditText(m_text); - // get HZLIST label options - CGUILabelControl* pEdit = ((CGUILabelControl*)GetControl(CTL_LABEL_HZLIST)); - CLabelInfo labelInfo = pEdit->GetLabelInfo(); - m_listfont = labelInfo.font; - m_listwidth = pEdit->GetWidth(); - m_hzcode.clear(); - m_words.clear(); - SET_CONTROL_LABEL(CTL_LABEL_HZCODE, ""); - SET_CONTROL_LABEL(CTL_LABEL_HZLIST, ""); - CVariant data; data["title"] = m_strHeading; data["type"] = !m_hiddenInput ? "keyboard" : "password"; data["value"] = GetText(); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Input, "xbmc", "OnInputRequested", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Input, "xbmc", "OnInputRequested", data); } bool CGUIDialogKeyboardGeneric::OnAction(const CAction &action) { bool handled = true; - if (action.GetID() == (KEY_VKEY | XBMCVK_BACK)) - Backspace(); - else if (action.GetID() == ACTION_ENTER || (m_isKeyboardNavigationMode && action.GetID() == ACTION_SELECT_ITEM)) + if (action.GetID() == ACTION_ENTER || (m_isKeyboardNavigationMode && action.GetID() == ACTION_SELECT_ITEM)) OnOK(); else if (action.GetID() == ACTION_SHIFT) OnShift(); @@ -194,33 +142,26 @@ handled = false; else { - std::wstring wch = L""; - wch.insert(wch.begin(), action.GetUnicode()); - std::string ch; - g_charsetConverter.wToUTF8(wch, ch); - handled = CodingCharacter(ch); - if (!handled) + handled = false; + // send action to edit control + CGUIControl *edit = GetControl(CTL_EDIT); + if (edit) + handled = edit->OnAction(action); + if (!handled && action.GetID() >= KEY_VKEY && action.GetID() < KEY_ASCII) { - // send action to edit control - CGUIControl *edit = GetControl(CTL_EDIT); - if (edit) - handled = edit->OnAction(action); - if (!handled && action.GetID() >= KEY_VKEY && action.GetID() < KEY_ASCII) + BYTE b = action.GetID() & 0xFF; + if (b == XBMCVK_TAB) { - BYTE b = action.GetID() & 0xFF; - if (b == XBMCVK_TAB) + // Toggle left/right key mode + m_isKeyboardNavigationMode = !m_isKeyboardNavigationMode; + if (m_isKeyboardNavigationMode) { - // Toggle left/right key mode - m_isKeyboardNavigationMode = !m_isKeyboardNavigationMode; - if (m_isKeyboardNavigationMode) - { - m_previouslyFocusedButton = GetFocusedControlID(); - SET_CONTROL_FOCUS(edit->GetID(), 0); - } - else - SET_CONTROL_FOCUS(m_previouslyFocusedButton, 0); - handled = true; + m_previouslyFocusedButton = GetFocusedControlID(); + SET_CONTROL_FOCUS(edit->GetID(), 0); } + else + SET_CONTROL_FOCUS(m_previouslyFocusedButton, 0); + handled = true; } } } @@ -315,17 +256,6 @@ OnOK(); return true; } - case GUI_MSG_CODINGTABLE_LOOKUP_COMPLETED: - { - std::string code = message.GetStringParam(); - if (code == m_hzcode) - { - int response = message.GetParam1(); - auto words = m_codingtable->GetResponse(response); - m_words.insert(m_words.end(), words.begin(), words.end()); - ShowWordList(0); - } - } } return CGUIDialog::OnMessage(message); @@ -351,12 +281,7 @@ void CGUIDialogKeyboardGeneric::Character(const std::string &ch) { if (ch.empty()) return; - if (!CodingCharacter(ch)) - NormalCharacter(ch); -} -void CGUIDialogKeyboardGeneric::NormalCharacter(const std::string &ch) -{ // send text to edit control CGUIControl *edit = GetControl(CTL_EDIT); if (edit) @@ -369,35 +294,10 @@ void CGUIDialogKeyboardGeneric::Backspace() { - if (m_codingtable && m_hzcode.length() > 0) - { - std::wstring tmp; - g_charsetConverter.utf8ToW(m_hzcode, tmp); - tmp.erase(tmp.length() - 1, 1); - g_charsetConverter.wToUTF8(tmp, m_hzcode); - - switch (m_codingtable->GetType()) - { - case IInputCodingTable::TYPE_WORD_LIST: - SetControlLabel(CTL_LABEL_HZCODE, m_hzcode); - ChangeWordList(0); - break; - - case IInputCodingTable::TYPE_CONVERT_STRING: - SetEditText(m_codingtable->ConvertString(m_hzcode)); - break; - } - } - else - { - // send action to edit control - CGUIControl *edit = GetControl(CTL_EDIT); - if (edit) - edit->OnAction(CAction(ACTION_BACKSPACE)); - - if (m_codingtable && m_codingtable->GetType() == IInputCodingTable::TYPE_CONVERT_STRING) - m_codingtable->SetTextPrev(GetText()); - } + // send action to edit control + CGUIControl *edit = GetControl(CTL_EDIT); + if (edit) + edit->OnAction(CAction(ACTION_BACKSPACE)); } void CGUIDialogKeyboardGeneric::OnClickButton(int iButtonControl) @@ -413,8 +313,7 @@ else { const CGUIControl* pButton = GetControl(iButtonControl); - // Do not register input for buttons with id >= 500 - if (pButton && iButtonControl < 500) + if (pButton) { Character(pButton->GetDescription()); // reset the shift keys @@ -432,36 +331,6 @@ if (m_currentLayout >= m_layouts.size()) m_currentLayout = 0; CKeyboardLayout layout = m_layouts.empty() ? CKeyboardLayout() : m_layouts[m_currentLayout]; - m_codingtable = layout.GetCodingTable(); - if (m_codingtable && !m_codingtable->IsInitialized()) - m_codingtable->Initialize(); - - bool bShowWordList = false; - if (m_codingtable) - { - switch (m_codingtable->GetType()) - { - case IInputCodingTable::TYPE_WORD_LIST: - bShowWordList = true; - break; - - case IInputCodingTable::TYPE_CONVERT_STRING: - m_codingtable->SetTextPrev(GetText()); - m_hzcode.clear(); - break; - } - } - - if (bShowWordList) - { - SET_CONTROL_VISIBLE(CTL_LABEL_HZCODE); - SET_CONTROL_VISIBLE(CTL_LABEL_HZLIST); - } - else - { - SET_CONTROL_HIDDEN(CTL_LABEL_HZCODE); - SET_CONTROL_HIDDEN(CTL_LABEL_HZLIST); - } SET_CONTROL_LABEL(CTL_BUTTON_LAYOUT, layout.GetName()); unsigned int modifiers = CKeyboardLayout::ModifierKeyNone; @@ -491,30 +360,19 @@ void CGUIDialogKeyboardGeneric::OnDeinitWindow(int nextWindowID) { - for (auto& layout : m_layouts) - { - auto codingTable = layout.GetCodingTable(); - if (codingTable && codingTable->IsInitialized()) - codingTable->Deinitialize(); - } // call base class CGUIDialog::OnDeinitWindow(nextWindowID); // reset the heading (we don't always have this) m_strHeading = ""; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Input, "xbmc", "OnInputFinished"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Input, "xbmc", "OnInputFinished"); } void CGUIDialogKeyboardGeneric::MoveCursor(int iAmount) { - if (m_codingtable && m_words.size()) - ChangeWordList(iAmount); - else - { - CGUIControl *edit = GetControl(CTL_EDIT); - if (edit) - edit->OnAction(CAction(iAmount < 0 ? ACTION_CURSOR_LEFT : ACTION_CURSOR_RIGHT)); - } + CGUIControl *edit = GetControl(CTL_EDIT); + if (edit) + edit->OnAction(CAction(iAmount < 0 ? ACTION_CURSOR_LEFT : ACTION_CURSOR_RIGHT)); } void CGUIDialogKeyboardGeneric::OnLayout() @@ -607,7 +465,9 @@ pKeyboard->SetHeading(heading); pKeyboard->SetHiddenInput(bHiddenInput); pKeyboard->SetText(initialString); - pKeyboard->Open(); + // do this using a thread message to avoid render() conflicts + ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_KEYBOARD, g_windowManager.GetActiveWindow()}; + CApplicationMessenger::Get().SendMessage(tMsg, true); pKeyboard->Close(); // If have text - update this. @@ -618,131 +478,3 @@ } else return false; } - -float CGUIDialogKeyboardGeneric::GetStringWidth(const std::wstring & utf16) -{ - vecText utf32; - - utf32.resize(utf16.size()); - for (unsigned int i = 0; i < utf16.size(); i++) - utf32[i] = utf16[i]; - - return m_listfont->GetTextWidth(utf32); -} - -void CGUIDialogKeyboardGeneric::ChangeWordList(int direct) -{ - if (direct == 0) - { - m_pos = 0; - m_words.clear(); - m_codingtable->GetWordListPage(m_hzcode, true); - } - else - { - ShowWordList(direct); - if (direct > 0 && m_pos + m_num == static_cast(m_words.size())) - m_codingtable->GetWordListPage(m_hzcode, false); - } -} - -void CGUIDialogKeyboardGeneric::ShowWordList(int direct) -{ - CSingleLock lock(m_CS); - std::wstring hzlist = L""; - g_graphicsContext.SetScalingResolution(m_coordsRes, true); - float width = m_listfont->GetCharWidth(L'<') + m_listfont->GetCharWidth(L'>'); - float spacewidth = m_listfont->GetCharWidth(L' '); - float numwidth = m_listfont->GetCharWidth(L'1') + m_listfont->GetCharWidth(L'.'); - int i; - - if (direct >= 0) - { - if (direct > 0) - m_pos += m_num; - if (m_pos > static_cast(m_words.size()) - 1) - m_pos = 0; - for (i = 0; m_pos + i < static_cast(m_words.size()); i++) - { - if ((i > 0 && width + GetStringWidth(m_words[m_pos + i]) + numwidth > m_listwidth) || i > 9) - break; - hzlist.insert(hzlist.length(), 1, (wchar_t)(i + 48)); - hzlist.insert(hzlist.length(), 1, L'.'); - hzlist.append(m_words[m_pos + i]); - hzlist.insert(hzlist.length(), 1, L' '); - width += GetStringWidth(m_words[m_pos + i]) + numwidth + spacewidth; - } - m_num = i; - } - else - { - if (m_pos == 0) - return; - for (i = 1; i <= 10; i++) - { - if (m_pos - i < 0 || (i > 1 && width + GetStringWidth(m_words[m_pos - i]) + numwidth > m_listwidth)) - break; - width += GetStringWidth(m_words[m_pos - i]) + numwidth + spacewidth; - } - m_num = --i; - m_pos -= m_num; - for (i = 0; i < m_num; i++) - { - hzlist.insert(hzlist.length(), 1, (wchar_t)(i + 48)); - hzlist.insert(hzlist.length(), 1, L'.'); - hzlist.append(m_words[m_pos + i]); - hzlist.insert(hzlist.length(), 1, L' '); - } - } - hzlist.erase(hzlist.find_last_not_of(L" ") + 1); - if (m_pos > 0) - hzlist.insert(0, 1, L'<'); - if (m_pos + m_num < static_cast(m_words.size())) - hzlist.insert(hzlist.length(), 1, L'>'); - std::string utf8String; - g_charsetConverter.wToUTF8(hzlist, utf8String); - SET_CONTROL_LABEL(CTL_LABEL_HZLIST, utf8String); -} - -bool CGUIDialogKeyboardGeneric::CodingCharacter(const std::string &ch) -{ - if (!m_codingtable) - return false; - - switch (m_codingtable->GetType()) - { - case IInputCodingTable::TYPE_CONVERT_STRING: - if (!ch.empty() && ch[0] != 0) - { - m_hzcode += ch; - SetEditText(m_codingtable->ConvertString(m_hzcode)); - return true; - } - break; - - case IInputCodingTable::TYPE_WORD_LIST: - if (m_codingtable->GetCodeChars().find(ch) != std::string::npos) - { - m_hzcode += ch; - SetControlLabel(CTL_LABEL_HZCODE, m_hzcode); - ChangeWordList(0); - return true; - } - if (ch[0] >= '0' && ch[0] <= '9') - { - int i = m_pos + (int)ch[0] - 48; - if (i < (m_pos + m_num)) - { - m_hzcode = ""; - SetControlLabel(CTL_LABEL_HZCODE, m_hzcode); - std::string utf8String; - g_charsetConverter.wToUTF8(m_words[i], utf8String); - NormalCharacter(utf8String); - } - return true; - } - break; - } - - return false; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogKeyboardGeneric.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogKeyboardGeneric.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogKeyboardGeneric.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogKeyboardGeneric.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2012-2013 Team Kodi - * http://kodi.tv + * Copyright (C) 2012-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,8 +24,6 @@ #include "guilib/GUIDialog.h" #include "input/KeyboardLayout.h" -class CGUIFont; - enum KEYBOARD {CAPS, LOWER, SYMBOLS}; class CGUIDialogKeyboardGeneric : public CGUIDialog, public CGUIKeyboard @@ -43,7 +41,6 @@ const std::string &GetText() const; bool IsConfirmed() { return m_bIsConfirmed; }; void SetHiddenInput(bool hiddenInput) { m_hiddenInput = hiddenInput; }; - bool IsInputHidden() const { return m_hiddenInput; }; protected: virtual void OnWindowLoaded(); @@ -62,14 +59,11 @@ private: void OnClickButton(int iButtonControl); void UpdateButtons(); + char GetCharacter(int iButton); void Character(const std::string &ch); void Backspace(); void SetEditText(const std::string& text); - float GetStringWidth(const std::wstring& utf16); - void ChangeWordList(int direct); // direct: 0 - first page, 1 - next page, -1 - prev page - void ShowWordList(int which); // which: 0 - current page, 1 - next page, -1 -prev page - bool CodingCharacter(const std::string &ch); - void NormalCharacter(const std::string &ch); + void SendSearchMessage(); bool m_bIsConfirmed; KEYBOARD m_keyType; @@ -84,14 +78,5 @@ std::string m_strHeading; std::string m_text; ///< current text - IInputCodingTable *m_codingtable; - std::vector m_words; - std::string m_hzcode; - int m_pos; - int m_num; - float m_listwidth; - CGUIFont *m_listfont; - CCriticalSection m_CS; - char_callback_t m_pCharCallback; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogMediaFilter.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogMediaFilter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogMediaFilter.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogMediaFilter.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,9 +32,7 @@ #include "settings/lib/Setting.h" #include "settings/windows/GUIControlSettings.h" #include "utils/log.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "video/VideoDatabase.h" #include "video/VideoDbUrl.h" @@ -114,6 +112,8 @@ #define NUM_FILTERS sizeof(filterList) / sizeof(CGUIDialogMediaFilter::Filter) +using namespace std; + CGUIDialogMediaFilter::CGUIDialogMediaFilter() : CGUIDialogSettingsManualBase(WINDOW_DIALOG_MEDIA_FILTER, "DialogMediaFilter.xml"), m_dbUrl(NULL), @@ -136,7 +136,7 @@ m_filter->Reset(); m_filter->SetType(m_mediaType); - for (std::map::iterator filter = m_filters.begin(); filter != m_filters.end(); filter++) + for (map::iterator filter = m_filters.begin(); filter != m_filters.end(); filter++) { filter->second.rule = NULL; filter->second.setting->Reset(); @@ -182,7 +182,7 @@ if (!dialog->SetPath(path)) return; - dialog->Open(); + dialog->DoModal(); } void CGUIDialogMediaFilter::OnWindowLoaded() @@ -204,7 +204,7 @@ { CGUIDialogSettingsManualBase::OnSettingChanged(setting); - std::map::iterator it = m_filters.find(setting->GetId()); + map::iterator it = m_filters.find(setting->GetId()); if (it == m_filters.end()) return; @@ -421,9 +421,9 @@ value = filter.rule->m_operator == CDatabaseQueryRule::OPERATOR_TRUE ? CHECK_YES : CHECK_NO; StaticIntegerSettingOptions entries; - entries.push_back(std::pair(CHECK_LABEL_ALL, CHECK_ALL)); - entries.push_back(std::pair(CHECK_LABEL_NO, CHECK_NO)); - entries.push_back(std::pair(CHECK_LABEL_YES, CHECK_YES)); + entries.push_back(pair(CHECK_LABEL_ALL, CHECK_ALL)); + entries.push_back(pair(CHECK_LABEL_NO, CHECK_NO)); + entries.push_back(pair(CHECK_LABEL_YES, CHECK_YES)); filter.setting = AddSpinner(group, settingId, filter.label, 0, value, entries, true); } @@ -567,7 +567,7 @@ void CGUIDialogMediaFilter::UpdateControls() { - for (std::map::iterator itFilter = m_filters.begin(); itFilter != m_filters.end(); itFilter++) + for (map::iterator itFilter = m_filters.begin(); itFilter != m_filters.end(); itFilter++) { if (itFilter->second.controlType != "list") continue; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogMediaFilter.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogMediaFilter.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogMediaFilter.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogMediaFilter.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,6 @@ #include #include -#include #include "dbwrappers/Database.h" #include "dbwrappers/DatabaseQuery.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogMediaSource.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogMediaSource.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogMediaSource.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogMediaSource.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,3 @@ - /* * Copyright (C) 2005-2013 Team XBMC * http://xbmc.org @@ -23,13 +22,11 @@ #include "guilib/GUIKeyboardFactory.h" #include "GUIDialogFileBrowser.h" #include "video/windows/GUIWindowVideoBase.h" -#include "music/windows/GUIWindowMusicBase.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" #include "Util.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "filesystem/Directory.h" #include "filesystem/PVRDirectory.h" #include "GUIDialogYesNo.h" @@ -45,6 +42,7 @@ #include "filesystem/File.h" #endif +using namespace std; using namespace XFILE; #define CONTROL_HEADING 2 @@ -62,7 +60,7 @@ , m_confirmed(false) , m_bNameChanged(false) { - m_paths = new CFileItemList; + m_paths = new CFileItemList; m_loadType = KEEP_IN_MEMORY; } @@ -79,43 +77,43 @@ bool CGUIDialogMediaSource::OnMessage(CGUIMessage& message) { - switch (message.GetMessage()) + switch ( message.GetMessage() ) { case GUI_MSG_CLICKED: - { - int iControl = message.GetSenderId(); - int iAction = message.GetParam1(); - if (iControl == CONTROL_PATH && (iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK)) - OnPath(GetSelectedItem()); - else if (iControl == CONTROL_PATH_BROWSE) - OnPathBrowse(GetSelectedItem()); - else if (iControl == CONTROL_PATH_ADD) - OnPathAdd(); - else if (iControl == CONTROL_PATH_REMOVE) - OnPathRemove(GetSelectedItem()); - else if (iControl == CONTROL_NAME) { - OnEditChanged(iControl, m_name); - UpdateButtons(); + int iControl = message.GetSenderId(); + int iAction = message.GetParam1(); + if (iControl == CONTROL_PATH && (iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK)) + OnPath(GetSelectedItem()); + else if (iControl == CONTROL_PATH_BROWSE) + OnPathBrowse(GetSelectedItem()); + else if (iControl == CONTROL_PATH_ADD) + OnPathAdd(); + else if (iControl == CONTROL_PATH_REMOVE) + OnPathRemove(GetSelectedItem()); + else if (iControl == CONTROL_NAME) + { + OnEditChanged(iControl, m_name); + UpdateButtons(); + } + else if (iControl == CONTROL_OK) + OnOK(); + else if (iControl == CONTROL_CANCEL) + OnCancel(); + else + break; + return true; } - else if (iControl == CONTROL_OK) - OnOK(); - else if (iControl == CONTROL_CANCEL) - OnCancel(); - else - break; - return true; - } - break; + break; case GUI_MSG_WINDOW_INIT: - { - UpdateButtons(); - } - break; + { + UpdateButtons(); + } + break; case GUI_MSG_SETFOCUS: if (message.GetControlId() == CONTROL_PATH_BROWSE || - message.GetControlId() == CONTROL_PATH_ADD || - message.GetControlId() == CONTROL_PATH_REMOVE) + message.GetControlId() == CONTROL_PATH_ADD || + message.GetControlId() == CONTROL_PATH_REMOVE) { HighlightItem(GetSelectedItem()); } @@ -135,18 +133,18 @@ dialog->Initialize(); dialog->SetShare(CMediaSource()); dialog->SetTypeOfMedia(type); - dialog->Open(); + dialog->DoModal(); bool confirmed(dialog->IsConfirmed()); if (confirmed) { // yay, add this share CMediaSource share; - unsigned int i, j = 2; - bool bConfirmed = false; - VECSOURCES* pShares = CMediaSourceSettings::GetInstance().GetSources(type); + unsigned int i,j=2; + bool bConfirmed=false; + VECSOURCES* pShares = CMediaSourceSettings::Get().GetSources(type); std::string strName = dialog->m_name; while (!bConfirmed) { - for (i = 0;isize();++i) + for (i=0;isize();++i) { if (StringUtils::EqualsNoCase((*pShares)[i].strName, strName)) break; @@ -160,7 +158,7 @@ if (dialog->m_paths->Size() > 0) { share.m_strThumbnailImage = dialog->m_paths->Get(0)->GetArt("thumb"); } - CMediaSourceSettings::GetInstance().AddShare(type, share); + CMediaSourceSettings::Get().AddShare(type, share); } dialog->m_paths->Clear(); return confirmed; @@ -168,13 +166,13 @@ bool CGUIDialogMediaSource::ShowAndEditMediaSource(const std::string &type, const std::string&share) { - VECSOURCES* pShares = CMediaSourceSettings::GetInstance().GetSources(type); + VECSOURCES* pShares = CMediaSourceSettings::Get().GetSources(type); if (pShares) { - for (unsigned int i = 0;isize();++i) + for (unsigned int i=0;isize();++i) { if (StringUtils::EqualsNoCase((*pShares)[i].strName, share)) - return ShowAndEditMediaSource(type, (*pShares)[i]); + return ShowAndEditMediaSource(type,(*pShares)[i]); } } return false; @@ -188,17 +186,17 @@ dialog->Initialize(); dialog->SetShare(share); dialog->SetTypeOfMedia(type, true); - dialog->Open(); + dialog->DoModal(); bool confirmed(dialog->IsConfirmed()); if (confirmed) { // yay, add this share - unsigned int i, j = 2; - bool bConfirmed = false; - VECSOURCES* pShares = CMediaSourceSettings::GetInstance().GetSources(type); + unsigned int i,j=2; + bool bConfirmed=false; + VECSOURCES* pShares = CMediaSourceSettings::Get().GetSources(type); std::string strName = dialog->m_name; while (!bConfirmed) { - for (i = 0;isize();++i) + for (i=0;isize();++i) { if (StringUtils::EqualsNoCase((*pShares)[i].strName, strName)) break; @@ -211,7 +209,7 @@ CMediaSource newShare; newShare.FromNameAndPaths(type, strName, dialog->GetPaths()); - CMediaSourceSettings::GetInstance().UpdateShare(type, strOldName, newShare); + CMediaSourceSettings::Get().UpdateShare(type, strOldName, newShare); } dialog->m_paths->Clear(); return confirmed; @@ -227,7 +225,7 @@ VECSOURCES extraShares; if (m_name != CUtil::GetTitleFromPath(m_paths->Get(item)->GetPath())) - m_bNameChanged = true; + m_bNameChanged=true; std::string strStreams = g_localizeStrings.Get(33039); //"% Streams" std::string strDevices = g_localizeStrings.Get(33040); //"% Devices" @@ -257,13 +255,13 @@ share1.strName = StringUtils::Format(strStreams.c_str(), "SAP"); //"SAP Streams" extraShares.push_back(share1); - if (CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_RECORDINGPATH) != "") + if (CSettings::Get().GetString("audiocds.recordingpath") != "") { share1.strPath = "special://recordings/"; share1.strName = g_localizeStrings.Get(21883); extraShares.push_back(share1); } - } + } else if (m_type == "video") { CMediaSource share1; @@ -285,6 +283,10 @@ share1.strName = g_localizeStrings.Get(20012); extraShares.push_back(share1); + share1.strPath = "hdhomerun://"; + share1.strName = StringUtils::Format(strDevices.c_str(), "HDHomerun"); //"HDHomerun Devices" + extraShares.push_back(share1); + share1.strPath = "sap://"; share1.strName = StringUtils::Format(strStreams.c_str(), "SAP"); //"SAP Streams" extraShares.push_back(share1); @@ -309,7 +311,7 @@ #if defined(TARGET_ANDROID) // add the default android music directory std::string path; - if (CXBMCApp::GetExternalStorage(path, "pictures") && !path.empty() && CFile::Exists(path)) + if (CXBMCApp::GetExternalStorage(path, "pictures") && !path.empty() && CFile::Exists(path)) { share1.strPath = path; share1.strName = g_localizeStrings.Get(20242); @@ -318,7 +320,7 @@ } path.clear(); - if (CXBMCApp::GetExternalStorage(path, "photos") && !path.empty() && CFile::Exists(path)) + if (CXBMCApp::GetExternalStorage(path, "photos") && !path.empty() && CFile::Exists(path)) { share1.strPath = path; share1.strName = g_localizeStrings.Get(20243); @@ -328,7 +330,7 @@ #endif share1.m_ignore = true; - if (CSettings::GetInstance().GetString(CSettings::SETTING_DEBUG_SCREENSHOTPATH) != "") + if (CSettings::Get().GetString("debug.screenshotpath") != "") { share1.strPath = "special://screenshots/"; share1.strName = g_localizeStrings.Get(20008); @@ -339,7 +341,7 @@ { // nothing to add } - if (CGUIDialogFileBrowser::ShowAndGetSource(path, allowNetworkShares, extraShares.size() == 0 ? NULL : &extraShares)) + if (CGUIDialogFileBrowser::ShowAndGetSource(path, allowNetworkShares, extraShares.size()==0?NULL:&extraShares)) { if (item < m_paths->Size()) // if the skin does funky things, m_paths may have been cleared m_paths->Get(item)->SetPath(path); @@ -359,10 +361,10 @@ if (item < 0 || item > m_paths->Size()) return; if (m_name != CUtil::GetTitleFromPath(m_paths->Get(item)->GetPath())) - m_bNameChanged = true; + m_bNameChanged=true; std::string path(m_paths->Get(item)->GetPath()); - CGUIKeyboardFactory::ShowAndGetInput(path, CVariant{ g_localizeStrings.Get(1021) }, false); + CGUIKeyboardFactory::ShowAndGetInput(path, g_localizeStrings.Get(1021), false); m_paths->Get(item)->SetPath(path); if (!m_bNameChanged || m_name.empty()) @@ -383,20 +385,18 @@ CMediaSource share; share.FromNameAndPaths(m_type, m_name, GetPaths()); // hack: Need to temporarily add the share, then get path, then remove share - VECSOURCES *shares = CMediaSourceSettings::GetInstance().GetSources(m_type); + VECSOURCES *shares = CMediaSourceSettings::Get().GetSources(m_type); if (shares) shares->push_back(share); - if (StringUtils::StartsWithNoCase(share.strPath, "plugin://") || CDirectory::GetDirectory(share.strPath, items, "", DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_ALLOW_PROMPT) || CGUIDialogYesNo::ShowAndGetInput(CVariant{ 1001 }, CVariant{ 1025 })) + if (StringUtils::StartsWithNoCase(share.strPath, "plugin://") || CDirectory::GetDirectory(share.strPath, items, "", DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_ALLOW_PROMPT) || CGUIDialogYesNo::ShowAndGetInput(1001, 1025)) { m_confirmed = true; Close(); - if (!StringUtils::StartsWithNoCase(share.strPath, "rss://") && - !StringUtils::StartsWithNoCase(share.strPath, "upnp://")) + if (m_type == "video" && !URIUtils::IsLiveTV(share.strPath) && + !StringUtils::StartsWithNoCase(share.strPath, "rss://") && + !StringUtils::StartsWithNoCase(share.strPath, "upnp://")) { - if (m_type == "video" && !URIUtils::IsLiveTV(share.strPath)) - CGUIWindowVideoBase::OnAssignContent(share.strPath); - else if (m_type == "music") - CGUIWindowMusicBase::OnAssignContent(share.strPath); + CGUIWindowVideoBase::OnAssignContent(share.strPath); } } @@ -431,7 +431,7 @@ std::string path; CURL url(item->GetPath()); path = url.GetWithoutUserDetails(); - if (path.empty()) path = "<" + g_localizeStrings.Get(231) + ">"; // + if (path.empty()) path = "<"+g_localizeStrings.Get(231)+">"; // item->SetLabel(path); } CGUIMessage msg(GUI_MSG_LABEL_BIND, GetID(), CONTROL_PATH, 0, 0, m_paths); @@ -519,9 +519,9 @@ HighlightItem(m_paths->Size() - 1); } -std::vector CGUIDialogMediaSource::GetPaths() const +vector CGUIDialogMediaSource::GetPaths() const { - std::vector paths; + vector paths; for (int i = 0; i < m_paths->Size(); i++) { if (!m_paths->Get(i)->GetPath().empty()) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogMuteBug.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogMuteBug.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogMuteBug.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogMuteBug.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,8 +21,10 @@ #include "GUIDialogMuteBug.h" #include "Application.h" +// the MuteBug is a true modeless dialog + CGUIDialogMuteBug::CGUIDialogMuteBug(void) - : CGUIDialog(WINDOW_DIALOG_MUTE_BUG, "DialogMuteBug.xml", DialogModalityType::MODELESS) + : CGUIDialog(WINDOW_DIALOG_MUTE_BUG, "DialogMuteBug.xml") { m_loadType = LOAD_ON_GUI_INIT; } @@ -33,7 +35,7 @@ void CGUIDialogMuteBug::UpdateVisibility() { if (g_application.IsMuted() || g_application.GetVolume(false) <= VOLUME_MINIMUM) - Open(); + Show(); else Close(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogNumeric.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogNumeric.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogNumeric.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogNumeric.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,16 +19,12 @@ */ #include "GUIDialogNumeric.h" - -#include - #include "guilib/GUILabelControl.h" #include "utils/md5.h" #include "guilib/GUIWindowManager.h" #include "GUIDialogOK.h" #include "input/XBMC_vkeys.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "input/Key.h" #include "guilib/LocalizeStrings.h" #include "interfaces/AnnouncementManager.h" @@ -44,15 +40,16 @@ CGUIDialogNumeric::CGUIDialogNumeric(void) - : CGUIDialog(WINDOW_DIALOG_NUMERIC, "DialogNumeric.xml") - , m_bConfirmed{false} - , m_bCanceled{false} - , m_mode{INPUT_PASSWORD} - , m_block{0} - , m_lastblock{0} - , m_dirty{false} + : CGUIDialog(WINDOW_DIALOG_NUMERIC, "DialogNumeric.xml") { + m_bConfirmed = false; + m_bCanceled = false; + + m_mode = INPUT_PASSWORD; + m_block = 0; + m_lastblock = 0; memset(&m_datetime, 0, sizeof(SYSTEMTIME)); + m_dirty = false; m_loadType = KEEP_IN_MEMORY; } @@ -91,11 +88,11 @@ } const CGUIControl *control = GetControl(CONTROL_HEADING_LABEL); - if (control != nullptr) + if (control != NULL) data["title"] = control->GetDescription(); - data["value"] = GetOutputString(); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Input, "xbmc", "OnInputRequested", data); + data["value"] = GetOutput(); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Input, "xbmc", "OnInputRequested", data); } void CGUIDialogNumeric::OnDeinitWindow(int nextWindowID) @@ -103,7 +100,7 @@ // call base class CGUIDialog::OnDeinitWindow(nextWindowID); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Input, "xbmc", "OnInputFinished"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Input, "xbmc", "OnInputFinished"); } bool CGUIDialogNumeric::OnAction(const CAction &action) @@ -119,36 +116,24 @@ else if (action.GetID() >= REMOTE_0 && action.GetID() <= REMOTE_9) OnNumber(action.GetID() - REMOTE_0); else if (action.GetID() >= KEY_VKEY && action.GetID() < KEY_ASCII) - { - // input from the keyboard (vkey, not ascii) - uint8_t b = action.GetID() & 0xFF; - if (b == XBMCVK_LEFT) - OnPrevious(); - else if (b == XBMCVK_RIGHT) - OnNext(); - else if (b == XBMCVK_RETURN || b == XBMCVK_NUMPADENTER) - OnOK(); - else if (b == XBMCVK_BACK) - OnBackSpace(); - else if (b == XBMCVK_ESCAPE) - OnCancel(); + { // input from the keyboard (vkey, not ascii) + BYTE b = action.GetID() & 0xFF; + if (b == XBMCVK_LEFT) OnPrevious(); + else if (b == XBMCVK_RIGHT) OnNext(); + else if (b == XBMCVK_RETURN || b == XBMCVK_NUMPADENTER) OnOK(); + else if (b == XBMCVK_BACK) OnBackSpace(); + else if (b == XBMCVK_ESCAPE) OnCancel(); } else if (action.GetID() >= KEY_ASCII) // FIXME make it KEY_UNICODE { // input from the keyboard - if (action.GetUnicode() == 10 || action.GetUnicode() == 13) - OnOK(); // enter - else if (action.GetUnicode() == 8) - OnBackSpace(); // backspace - else if (action.GetUnicode() == 27) - OnCancel(); // escape - else if (action.GetUnicode() == 46) - OnNext(); // '.' + if (action.GetUnicode() == 10 || action.GetUnicode() == 13) OnOK(); // enter + else if (action.GetUnicode() == 8) OnBackSpace(); // backspace + else if (action.GetUnicode() == 27) OnCancel(); // escape else if (action.GetUnicode() >= 48 && action.GetUnicode() < 58) // number OnNumber(action.GetUnicode() - 48); } else return CGUIDialog::OnAction(action); - return true; } @@ -219,13 +204,13 @@ { if (!m_dirty && m_block) { - --m_block; + m_block--; return; } if (m_mode == INPUT_NUMBER || m_mode == INPUT_PASSWORD) { // just go back one character if (!m_number.empty()) - m_number.erase(m_number.length() - 1); + m_number.erase(m_number.size() - 1); } else if (m_mode == INPUT_IP_ADDRESS) { @@ -233,7 +218,7 @@ m_ip[m_block] /= 10; else if (m_block) { - --m_block; + m_block--; m_dirty = false; } } @@ -320,9 +305,14 @@ unsigned int start = 0; unsigned int end = 0; if (m_mode == INPUT_PASSWORD) - strLabel.assign(m_number.length(), '*'); + { + for (unsigned int i=0; i < m_number.size(); i++) + strLabel += '*'; + } else if (m_mode == INPUT_NUMBER) + { // simple - just render text directly strLabel = m_number; + } else if (m_mode == INPUT_TIME) { // format up the time strLabel = StringUtils::Format("%2d:%02d", m_datetime.wHour, m_datetime.wMinute); @@ -358,41 +348,234 @@ CGUIDialog::FrameMove(); } -void CGUIDialogNumeric::OnNumber(uint32_t num) +void CGUIDialogNumeric::OnNumber(unsigned int num) { ResetAutoClose(); - switch (m_mode) + if (m_mode == INPUT_NUMBER || m_mode == INPUT_PASSWORD) { - case INPUT_NUMBER: - case INPUT_PASSWORD: m_number += num + '0'; - break; - case INPUT_TIME: - HandleInputTime(num); - break; - case INPUT_TIME_SECONDS: - HandleInputSeconds(num); - break; - case INPUT_DATE: - HandleInputDate(num); - break; - case INPUT_IP_ADDRESS: - HandleInputIP(num); - break; + } + else if (m_mode == INPUT_TIME) + { + if (m_block == 0) // hour + { + if (m_dirty) // have input the first digit + { + if (m_datetime.wHour < 2 || num < 4) + { + m_datetime.wHour *= 10; + m_datetime.wHour += num; + } + else + m_datetime.wHour = num; + m_block = 1; // move to minutes + m_dirty = false; + } + else // this is the first digit + { + m_datetime.wHour = num; + if (num > 2) + { + m_block = 1; // move to minutes + m_dirty = false; + } + else + m_dirty = true; + } + } + else // minute + { + if (m_dirty) // have input the first digit + { + m_datetime.wMinute *= 10; + m_datetime.wMinute += num; + m_block = 0; // move to hours + m_dirty = false; + } + else // this is the first digit + { + m_datetime.wMinute = num; + if (num > 5) + { + m_block = 0; // move to hours + m_dirty = false; + } + else + m_dirty = true; + } + } + } + else if (m_mode == INPUT_TIME_SECONDS) + { + if (m_block == 0) // hour + { + if (m_dirty) // have input the first digit + { + m_datetime.wHour *= 10; + m_datetime.wHour += num; + m_block = 1; // move to minutes - allows up to 99 hours + m_dirty = false; + } + else // this is the first digit + { + m_datetime.wHour = num; + m_dirty = true; + } + } + else if (m_block == 1) // minute + { + if (m_dirty) // have input the first digit + { + m_datetime.wMinute *= 10; + m_datetime.wMinute += num; + m_block = 2; // move to seconds - allows up to 99 minutes + m_dirty = false; + } + else // this is the first digit + { + m_datetime.wMinute = num; + if (num > 5) + { + m_block = 2; // move to seconds + m_dirty = false; + } + else + m_dirty = true; + } + } + else // seconds + { + if (m_dirty) // have input the first digit + { + m_datetime.wSecond *= 10; + m_datetime.wSecond += num; + m_block = 0; // move to hours + m_dirty = false; + } + else // this is the first digit + { + m_datetime.wSecond = num; + if (num > 5) + { + m_block = 0; // move to hours + m_dirty = false; + } + else + m_dirty = true; + } + } + } + else if (m_mode == INPUT_DATE) + { + if (m_block == 0) // day of month + { + if (m_dirty && (m_datetime.wDay < 3 || num < 2)) + { + m_datetime.wDay *= 10; + m_datetime.wDay += num; + } + else + m_datetime.wDay = num; + if (m_datetime.wDay > 3) + { + m_block = 1; // move to months + m_dirty = false; + } + else + m_dirty = true; + } + else if (m_block == 1) // months + { + if (m_dirty && num < 3) + { + m_datetime.wMonth *= 10; + m_datetime.wMonth += num; + } + else + m_datetime.wMonth = num; + if (m_datetime.wMonth > 1) + { + VerifyDate(false); + m_block = 2; // move to year + m_dirty = false; + } + else + m_dirty = true; + } + else // year + { + if (m_dirty && m_datetime.wYear < 1000) // have taken input + { + m_datetime.wYear *= 10; + m_datetime.wYear += num; + } + else + m_datetime.wYear = num; + if (m_datetime.wYear > 1000) + { + VerifyDate(true); + m_block = 0; // move to day of month + m_dirty = false; + } + else + m_dirty = true; + } + } + else if (m_mode == INPUT_IP_ADDRESS) + { + if (m_dirty && ((m_ip[m_block] < 25) || (m_ip[m_block] == 25 && num < 6) || !(m_block==0 && num==0))) + { + m_ip[m_block] *= 10; + m_ip[m_block] += num; + } + else + m_ip[m_block] = num; + if (m_ip[m_block] > 25 || (m_ip[m_block] == 0 && num == 0)) + { + m_block++; + if (m_block > 3) m_block = 0; + m_dirty = false; + } + else + m_dirty = true; } } -void CGUIDialogNumeric::SetMode(INPUT_MODE mode, const SYSTEMTIME &initial) +void CGUIDialogNumeric::SetMode(INPUT_MODE mode, void *initial) { m_mode = mode; m_block = 0; m_lastblock = 0; if (m_mode == INPUT_TIME || m_mode == INPUT_TIME_SECONDS || m_mode == INPUT_DATE) { - m_datetime = initial; + m_datetime = *(SYSTEMTIME *)initial; m_lastblock = (m_mode != INPUT_TIME) ? 2 : 1; } + else if (m_mode == INPUT_IP_ADDRESS) + { + m_lastblock = 3; + m_ip[0] = m_ip[1] = m_ip[2] = m_ip[3] = 0; + // copy ip string into numeric form + std::string ip = *(std::string *)initial; + unsigned int block = 0; + for (unsigned int i=0; i < ip.size(); i++) + { + if (ip[i] == '.') + { + block++; + if (block > m_lastblock) + break; + } + else if (isdigit(ip[i])) + { + m_ip[block] *= 10; + m_ip[block] += ip[i] - '0'; + } + } + } + else if (m_mode == INPUT_NUMBER || m_mode == INPUT_PASSWORD) + m_number = *(std::string *)initial; } void CGUIDialogNumeric::SetMode(INPUT_MODE mode, const std::string &initial) @@ -408,7 +591,7 @@ // check if we have a pure number if (initial.find_first_not_of("0123456789") == std::string::npos) { - long seconds = strtol(initial.c_str(), nullptr, 10); + long seconds = strtol(initial.c_str(), NULL, 10); dateTime = seconds; } else @@ -416,7 +599,7 @@ std::string tmp = initial; // if we are handling seconds and if the string only contains // "mm:ss" we need to add dummy "hh:" to get "hh:mm:ss" - if (m_mode == INPUT_TIME_SECONDS && tmp.length() <= 5) + if (m_mode == INPUT_TIME_SECONDS && tmp.size() <= 5) tmp = "00:" + tmp; dateTime.SetFromDBTime(tmp); } @@ -434,50 +617,33 @@ dateTime.GetAsSystemTime(m_datetime); m_lastblock = (m_mode == INPUT_DATE) ? 2 : 1; } - else if (m_mode == INPUT_IP_ADDRESS) - { - m_lastblock = 3; - auto blocks = StringUtils::Split(initial, '.'); - if (blocks.size() != 4) - return; - - for (size_t i = 0; i < blocks.size(); ++i) - { - if (blocks[i].length() > 3) - return; - - m_ip[i] = static_cast(atoi(blocks[i].c_str())); - } - } - else if (m_mode == INPUT_NUMBER || m_mode == INPUT_PASSWORD) - m_number = initial; + else + SetMode(mode, (void*)&initial); } -SYSTEMTIME CGUIDialogNumeric::GetOutput() const +void CGUIDialogNumeric::GetOutput(void *output) const { - assert(m_mode == INPUT_TIME || m_mode == INPUT_TIME_SECONDS || m_mode == INPUT_DATE); - return m_datetime; + if (!output) return; + if (m_mode == INPUT_TIME || m_mode == INPUT_TIME_SECONDS || m_mode == INPUT_DATE) + memcpy(output, &m_datetime, sizeof(m_datetime)); + else if (m_mode == INPUT_IP_ADDRESS) + *(std::string *)output = StringUtils::Format("%d.%d.%d.%d", m_ip[0], m_ip[1], m_ip[2], m_ip[3]); + else if (m_mode == INPUT_NUMBER || m_mode == INPUT_PASSWORD) + *(std::string *)output = m_number; } -std::string CGUIDialogNumeric::GetOutputString() const +std::string CGUIDialogNumeric::GetOutput() const { - switch (m_mode) - { - case INPUT_DATE: - return StringUtils::Format("%02i/%02i/%04i", m_datetime.wDay, m_datetime.wMonth, m_datetime.wYear); - case INPUT_TIME: - return StringUtils::Format("%i:%02i", m_datetime.wHour, m_datetime.wMinute); - case INPUT_TIME_SECONDS: - return StringUtils::Format("%i:%02i:%02i", m_datetime.wHour, m_datetime.wMinute, m_datetime.wSecond); - case INPUT_IP_ADDRESS: - return StringUtils::Format("%d.%d.%d.%d", m_ip[0], m_ip[1], m_ip[2], m_ip[3]); - case INPUT_NUMBER: - case INPUT_PASSWORD: - return m_number; - } - - //should never get here - return std::string(); + std::string output; + if (m_mode == INPUT_DATE) + output = StringUtils::Format("%02i/%02i/%04i", m_datetime.wDay, m_datetime.wMonth, m_datetime.wYear); + else if (m_mode == INPUT_TIME) + output = StringUtils::Format("%i:%02i", m_datetime.wHour, m_datetime.wMinute); + else if (m_mode == INPUT_TIME_SECONDS) + output = StringUtils::Format("%i:%02i:%02i", m_datetime.wHour, m_datetime.wMinute, m_datetime.wSecond); + else + GetOutput(&output); + return output; } bool CGUIDialogNumeric::ShowAndGetSeconds(std::string &timeString, const std::string &heading) @@ -489,12 +655,12 @@ time.wHour = seconds / 3600; time.wMinute = (seconds - time.wHour * 3600) / 60; time.wSecond = seconds - time.wHour * 3600 - time.wMinute * 60; - pDialog->SetMode(INPUT_TIME_SECONDS, time); + pDialog->SetMode(INPUT_TIME_SECONDS, (void *)&time); pDialog->SetHeading(heading); - pDialog->Open(); + pDialog->DoModal(); if (!pDialog->IsConfirmed() || pDialog->IsCanceled()) return false; - time = pDialog->GetOutput(); + pDialog->GetOutput(&time); seconds = time.wHour * 3600 + time.wMinute * 60 + time.wSecond; timeString = StringUtils::SecondsToTimeString(seconds); return true; @@ -504,12 +670,12 @@ { CGUIDialogNumeric *pDialog = (CGUIDialogNumeric *)g_windowManager.GetWindow(WINDOW_DIALOG_NUMERIC); if (!pDialog) return false; - pDialog->SetMode(INPUT_TIME, time); + pDialog->SetMode(INPUT_TIME, (void *)&time); pDialog->SetHeading(heading); - pDialog->Open(); + pDialog->DoModal(); if (!pDialog->IsConfirmed() || pDialog->IsCanceled()) return false; - time = pDialog->GetOutput(); + pDialog->GetOutput(&time); return true; } @@ -517,12 +683,12 @@ { CGUIDialogNumeric *pDialog = (CGUIDialogNumeric *)g_windowManager.GetWindow(WINDOW_DIALOG_NUMERIC); if (!pDialog) return false; - pDialog->SetMode(INPUT_DATE, date); + pDialog->SetMode(INPUT_DATE, (void *)&date); pDialog->SetHeading(heading); - pDialog->Open(); + pDialog->DoModal(); if (!pDialog->IsConfirmed() || pDialog->IsCanceled()) return false; - date = pDialog->GetOutput(); + pDialog->GetOutput(&date); return true; } @@ -530,12 +696,12 @@ { CGUIDialogNumeric *pDialog = (CGUIDialogNumeric *)g_windowManager.GetWindow(WINDOW_DIALOG_NUMERIC); if (!pDialog) return false; - pDialog->SetMode(INPUT_IP_ADDRESS, IPAddress); + pDialog->SetMode(INPUT_IP_ADDRESS, (void *)&IPAddress); pDialog->SetHeading(heading); - pDialog->Open(); + pDialog->DoModal(); if (!pDialog->IsConfirmed() || pDialog->IsCanceled()) return false; - IPAddress = pDialog->GetOutputString(); + pDialog->GetOutput(&IPAddress); return true; } @@ -545,15 +711,15 @@ CGUIDialogNumeric *pDialog = (CGUIDialogNumeric *)g_windowManager.GetWindow(WINDOW_DIALOG_NUMERIC); pDialog->SetHeading( strHeading ); - pDialog->SetMode(INPUT_NUMBER, strInput); + pDialog->SetMode(INPUT_NUMBER, (void *)&strInput); if (iAutoCloseTimeoutMs) pDialog->SetAutoClose(iAutoCloseTimeoutMs); - pDialog->Open(); + pDialog->DoModal(); if (!pDialog->IsAutoClosed() && (!pDialog->IsConfirmed() || pDialog->IsCanceled())) return false; - strInput = pDialog->GetOutputString(); + pDialog->GetOutput(&strInput); return true; } @@ -567,7 +733,7 @@ if (!ShowAndVerifyInput(strUserInput, g_localizeStrings.Get(12340), false)) { // Show error to user saying the password entry was blank - CGUIDialogOK::ShowAndGetInput(CVariant{12357}, CVariant{12358}); // Password is empty/blank + CGUIDialogOK::ShowAndGetInput(12357, 12358); // Password is empty/blank return false; } @@ -579,7 +745,7 @@ if (!ShowAndVerifyInput(strUserInput, g_localizeStrings.Get(12341), true)) { // Show error to user saying the password re-entry failed - CGUIDialogOK::ShowAndGetInput(CVariant{12357}, CVariant{12344}); // Password do not match + CGUIDialogOK::ShowAndGetInput(12357, 12344); // Password do not match return false; } @@ -623,10 +789,10 @@ std::string strInput; if (!bVerifyInput) strInput = strToVerify; - pDialog->SetMode(INPUT_PASSWORD, strInput); - pDialog->Open(); + pDialog->SetMode(INPUT_PASSWORD, (void *)&strInput); + pDialog->DoModal(); - strInput = pDialog->GetOutputString(); + pDialog->GetOutput(&strInput); if (!pDialog->IsConfirmed() || pDialog->IsCanceled()) { @@ -708,199 +874,3 @@ Close(); } -void CGUIDialogNumeric::HandleInputIP(uint32_t num) -{ - if (m_dirty && ((m_ip[m_block] < 25) || (m_ip[m_block] == 25 && num < 6) || !(m_block == 0 && num == 0))) - { - m_ip[m_block] *= 10; - m_ip[m_block] += num; - } - else - m_ip[m_block] = num; - - if (m_ip[m_block] > 25 || (m_ip[m_block] == 0 && num == 0)) - { - ++m_block; - if (m_block > 3) - m_block = 0; - m_dirty = false; - } - else - m_dirty = true; -} - -void CGUIDialogNumeric::HandleInputDate(uint32_t num) -{ - if (m_block == 0) // day of month - { - if (m_dirty && (m_datetime.wDay < 3 || num < 2)) - { - m_datetime.wDay *= 10; - m_datetime.wDay += num; - } - else - m_datetime.wDay = num; - - if (m_datetime.wDay > 3) - { - m_block = 1; // move to months - m_dirty = false; - } - else - m_dirty = true; - } - else if (m_block == 1) // months - { - if (m_dirty && num < 3) - { - m_datetime.wMonth *= 10; - m_datetime.wMonth += num; - } - else - m_datetime.wMonth = num; - - if (m_datetime.wMonth > 1) - { - VerifyDate(false); - m_block = 2; // move to year - m_dirty = false; - } - else - m_dirty = true; - } - else // year - { - if (m_dirty && m_datetime.wYear < 1000) // have taken input - { - m_datetime.wYear *= 10; - m_datetime.wYear += num; - } - else - m_datetime.wYear = num; - - if (m_datetime.wYear > 1000) - { - VerifyDate(true); - m_block = 0; // move to day of month - m_dirty = false; - } - else - m_dirty = true; - } -} - -void CGUIDialogNumeric::HandleInputSeconds(uint32_t num) -{ - if (m_block == 0) // hour - { - if (m_dirty) // have input the first digit - { - m_datetime.wHour *= 10; - m_datetime.wHour += num; - m_block = 1; // move to minutes - allows up to 99 hours - m_dirty = false; - } - else // this is the first digit - { - m_datetime.wHour = num; - m_dirty = true; - } - } - else if (m_block == 1) // minute - { - if (m_dirty) // have input the first digit - { - m_datetime.wMinute *= 10; - m_datetime.wMinute += num; - m_block = 2; // move to seconds - allows up to 99 minutes - m_dirty = false; - } - else // this is the first digit - { - m_datetime.wMinute = num; - if (num > 5) - { - m_block = 2; // move to seconds - m_dirty = false; - } - else - m_dirty = true; - } - } - else // seconds - { - if (m_dirty) // have input the first digit - { - m_datetime.wSecond *= 10; - m_datetime.wSecond += num; - m_block = 0; // move to hours - m_dirty = false; - } - else // this is the first digit - { - m_datetime.wSecond = num; - if (num > 5) - { - m_block = 0; // move to hours - m_dirty = false; - } - else - m_dirty = true; - } - } -} - -void CGUIDialogNumeric::HandleInputTime(uint32_t num) -{ - if (m_block == 0) // hour - { - if (m_dirty) // have input the first digit - { - if (m_datetime.wHour < 2 || num < 4) - { - m_datetime.wHour *= 10; - m_datetime.wHour += num; - } - else - m_datetime.wHour = num; - - m_block = 1; // move to minutes - m_dirty = false; - } - else // this is the first digit - { - m_datetime.wHour = num; - - if (num > 2) - { - m_block = 1; // move to minutes - m_dirty = false; - } - else - m_dirty = true; - } - } - else // minute - { - if (m_dirty) // have input the first digit - { - m_datetime.wMinute *= 10; - m_datetime.wMinute += num; - m_block = 0; // move to hours - m_dirty = false; - } - else // this is the first digit - { - m_datetime.wMinute = num; - - if (num > 5) - { - m_block = 0; // move to hours - m_dirty = false; - } - else - m_dirty = true; - } - } -} - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogNumeric.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogNumeric.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogNumeric.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogNumeric.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,6 @@ * */ -#include #include "guilib/GUIDialog.h" class CGUIDialogNumeric : @@ -37,17 +36,16 @@ bool IsConfirmed() const; bool IsCanceled() const; - bool IsInputHidden() const { return m_mode == INPUT_PASSWORD; }; static bool ShowAndVerifyNewPassword(std::string& strNewPassword); static int ShowAndVerifyPassword(std::string& strPassword, const std::string& strHeading, int iRetries); static bool ShowAndVerifyInput(std::string& strPassword, const std::string& strHeading, bool bGetUserInput); void SetHeading(const std::string &strHeading); - void SetMode(INPUT_MODE mode, const SYSTEMTIME &initial); + void SetMode(INPUT_MODE mode, void *initial); void SetMode(INPUT_MODE mode, const std::string &initial); - SYSTEMTIME GetOutput() const; - std::string GetOutputString() const; + void GetOutput(void *output) const; + std::string GetOutput() const; static bool ShowAndGetTime(SYSTEMTIME &time, const std::string &heading); static bool ShowAndGetDate(SYSTEMTIME &date, const std::string &heading); @@ -59,7 +57,7 @@ virtual void OnInitWindow(); virtual void OnDeinitWindow(int nextWindowID); - void OnNumber(uint32_t num); + void OnNumber(unsigned int num); void VerifyDate(bool checkYear); void OnNext(); void OnPrevious(); @@ -67,19 +65,14 @@ void OnOK(); void OnCancel(); - void HandleInputIP(uint32_t num); - void HandleInputDate(uint32_t num); - void HandleInputSeconds(uint32_t num); - void HandleInputTime(uint32_t num); - bool m_bConfirmed; bool m_bCanceled; INPUT_MODE m_mode; // the current input mode SYSTEMTIME m_datetime; // for time and date modes - uint8_t m_ip[4]; // for ip address mode - uint32_t m_block; // for time, date, and IP methods. - uint32_t m_lastblock; + WORD m_ip[4]; // for ip address mode + unsigned int m_block; // for time, date, and IP methods. + unsigned int m_lastblock; bool m_dirty; // true if the current block has been changed. std::string m_number; ///< for number or password input }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogOK.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogOK.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogOK.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogOK.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,8 +20,6 @@ #include "GUIDialogOK.h" #include "guilib/GUIWindowManager.h" -#include "guilib/GUIMessage.h" -#include "utils/Variant.h" #define ID_BUTTON_OK 10 @@ -49,18 +47,18 @@ } // \brief Show CGUIDialogOK dialog, then wait for user to dismiss it. -void CGUIDialogOK::ShowAndGetInput(CVariant heading, CVariant text) +void CGUIDialogOK::ShowAndGetInput(const CVariant &heading, const CVariant &text) { CGUIDialogOK *dialog = (CGUIDialogOK *)g_windowManager.GetWindow(WINDOW_DIALOG_OK); if (!dialog) return; dialog->SetHeading(heading); dialog->SetText(text); - dialog->Open(); + dialog->DoModal(); } // \brief Show CGUIDialogOK dialog, then wait for user to dismiss it. -void CGUIDialogOK::ShowAndGetInput(CVariant heading, CVariant line0, CVariant line1, CVariant line2) +void CGUIDialogOK::ShowAndGetInput(const CVariant &heading, const CVariant &line0, const CVariant &line1, const CVariant &line2) { CGUIDialogOK *dialog = (CGUIDialogOK *)g_windowManager.GetWindow(WINDOW_DIALOG_OK); if (!dialog) @@ -69,7 +67,7 @@ dialog->SetLine(0, line0); dialog->SetLine(1, line1); dialog->SetLine(2, line2); - dialog->Open(); + dialog->DoModal(); } int CGUIDialogOK::GetDefaultLabelID(int controlId) const diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogOK.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogOK.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogOK.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogOK.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,9 +22,6 @@ #include "GUIDialogBoxBase.h" -class CGUIMessage; -class CVariant; - class CGUIDialogOK : public CGUIDialogBoxBase { @@ -32,8 +29,8 @@ CGUIDialogOK(void); virtual ~CGUIDialogOK(void); virtual bool OnMessage(CGUIMessage& message); - static void ShowAndGetInput(CVariant heading, CVariant text); - static void ShowAndGetInput(CVariant heading, CVariant line0, CVariant line1, CVariant line2); + static void ShowAndGetInput(const CVariant &heading, const CVariant &text); + static void ShowAndGetInput(const CVariant &heading, const CVariant &line0, const CVariant &line1, const CVariant &line2); protected: virtual int GetDefaultLabelID(int controlId) const; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogPlayEject.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogPlayEject.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogPlayEject.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogPlayEject.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,11 +22,8 @@ #include "guilib/GUIWindowManager.h" #include "storage/MediaManager.h" #include "utils/log.h" -#include "utils/Variant.h" #include "utils/XMLUtils.h" -#include - #define ID_BUTTON_PLAY 11 #define ID_BUTTON_EJECT 10 @@ -119,17 +116,17 @@ strLine1 = item.GetLabel(); // Setup dialog parameters - pDialog->SetHeading(CVariant{219}); - pDialog->SetLine(0, CVariant{429}); - pDialog->SetLine(1, CVariant{std::move(strLine1)}); - pDialog->SetLine(2, CVariant{std::move(strLine2)}); + pDialog->SetHeading(219); + pDialog->SetLine(0, 429); + pDialog->SetLine(1, strLine1); + pDialog->SetLine(2, strLine2); pDialog->SetChoice(ID_BUTTON_PLAY - 10, 208); pDialog->SetChoice(ID_BUTTON_EJECT - 10, 13391); if (uiAutoCloseTime) pDialog->SetAutoClose(uiAutoCloseTime); // Display the dialog - pDialog->Open(); + pDialog->DoModal(); return pDialog->IsConfirmed(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogProgress.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogProgress.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogProgress.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogProgress.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,12 +21,13 @@ #include "GUIDialogProgress.h" #include "guilib/GUIProgressControl.h" #include "Application.h" -#include "guiinfo/GUIInfoLabels.h" +#include "GUIInfoManager.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" #include "threads/SingleLock.h" #include "utils/log.h" -#include "utils/Variant.h" + +using namespace std; #define CONTROL_CANCEL_BUTTON 10 #define CONTROL_PROGRESS_BAR 20 @@ -34,7 +35,12 @@ CGUIDialogProgress::CGUIDialogProgress(void) : CGUIDialogBoxBase(WINDOW_DIALOG_PROGRESS, "DialogProgress.xml") { - Reset(); + m_bCanceled = false; + m_iCurrent=0; + m_iMax=0; + m_percentage = 0; + m_showProgress = false; + m_bCanCancel = true; } CGUIDialogProgress::~CGUIDialogProgress(void) @@ -42,18 +48,6 @@ } -void CGUIDialogProgress::Reset() -{ - CSingleLock lock(m_section); - m_bCanceled = false; - m_iCurrent = 0; - m_iMax = 0; - m_percentage = 0; - m_showProgress = false; - m_bCanCancel = true; - SetInvalid(); -} - void CGUIDialogProgress::SetCanCancel(bool bCanCancel) { CSingleLock lock(m_section); @@ -61,16 +55,28 @@ SetInvalid(); } -void CGUIDialogProgress::Open(const std::string ¶m /* = "" */) +void CGUIDialogProgress::StartModal() { - CLog::Log(LOGDEBUG, "DialogProgress::Open called %s", m_active ? "(already running)!" : ""); + CSingleLock lock(g_graphicsContext); - { - CSingleLock lock(g_graphicsContext); - ShowProgressBar(false); - } - - CGUIDialog::Open_Internal(false, param); + CLog::Log(LOGDEBUG, "DialogProgress::StartModal called %s", m_active ? "(already running)!" : ""); + m_bCanceled = false; + + // set running before it's routed, else the auto-show code + // could show it as well if we are in a different thread from + // the main rendering thread (this should really be handled via + // a thread message though IMO) + m_active = true; + m_modalityType = DialogModalityType::MODAL; + m_closing = false; + g_windowManager.RegisterDialog(this); + + // active this window... + ShowProgressBar(false); + CGUIMessage msg(GUI_MSG_WINDOW_INIT, 0, 0); + OnMessage(msg); + + lock.Leave(); while (m_active && IsAnimating(ANIM_TYPE_WINDOW_OPEN)) { @@ -106,7 +112,7 @@ { case GUI_MSG_WINDOW_DEINIT: - Reset(); + SetCanCancel(true); break; case GUI_MSG_CLICKED: @@ -114,10 +120,10 @@ int iControl = message.GetSenderId(); if (iControl == CONTROL_CANCEL_BUTTON && m_bCanCancel && !m_bCanceled) { - std::string strHeading = m_strHeading; + string strHeading = m_strHeading; strHeading.append(" : "); strHeading.append(g_localizeStrings.Get(16024)); - CGUIDialogBoxBase::SetHeading(CVariant{strHeading}); + CGUIDialogBoxBase::SetHeading(strHeading); m_bCanceled = true; return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogProgress.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogProgress.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogProgress.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogProgress.h 2015-10-19 08:39:16.000000000 +0000 @@ -30,7 +30,7 @@ CGUIDialogProgress(void); virtual ~CGUIDialogProgress(void); - void Open(const std::string ¶m = ""); + void StartModal(); virtual bool OnMessage(CGUIMessage& message); virtual bool OnBack(int actionID); virtual void OnWindowLoaded(); @@ -59,7 +59,4 @@ int m_iMax; int m_percentage; bool m_showProgress; - -private: - void Reset(); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSeekBar.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSeekBar.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSeekBar.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSeekBar.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,7 @@ #define POPUP_SEEK_LABEL 402 CGUIDialogSeekBar::CGUIDialogSeekBar(void) - : CGUIDialog(WINDOW_DIALOG_SEEK_BAR, "DialogSeekBar.xml", DialogModalityType::MODELESS) + : CGUIDialog(WINDOW_DIALOG_SEEK_BAR, "DialogSeekBar.xml") { m_loadType = LOAD_ON_GUI_INIT; // the application class handles our resources } @@ -66,9 +66,9 @@ } // update controls - if (!CSeekHandler::GetInstance().InProgress() && g_infoManager.GetTotalPlayTime()) + if (!CSeekHandler::Get().InProgress() && g_infoManager.GetTotalPlayTime()) { // position the bar at our current time - CONTROL_SELECT_ITEM(POPUP_SEEK_PROGRESS, (unsigned int)(static_cast(g_infoManager.GetPlayTime()) / g_infoManager.GetTotalPlayTime() * 0.1f)); + CONTROL_SELECT_ITEM(POPUP_SEEK_PROGRESS, (unsigned int)(g_infoManager.GetPlayTime()/g_infoManager.GetTotalPlayTime() * 0.1f)); SET_CONTROL_LABEL(POPUP_SEEK_LABEL, g_infoManager.GetCurrentPlayTime()); } else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSelect.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSelect.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSelect.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSelect.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -39,14 +39,16 @@ m_buttonString = -1; m_useDetails = false; m_vecList = new CFileItemList; + m_selectedItems = new CFileItemList; m_multiSelection = false; - m_selectedItem = nullptr; + m_iSelected = -1; m_loadType = KEEP_IN_MEMORY; } CGUIDialogSelect::~CGUIDialogSelect(void) { delete m_vecList; + delete m_selectedItems; } bool CGUIDialogSelect::OnMessage(CGUIMessage& message) @@ -55,23 +57,24 @@ { case GUI_MSG_WINDOW_DEINIT: { - CGUIDialogBoxBase::OnMessage(message); + CGUIDialog::OnMessage(message); + m_viewControl.Clear(); m_bButtonEnabled = false; m_useDetails = false; m_multiSelection = false; // construct selected items list - m_selectedItems.clear(); - m_selectedItem = nullptr; + m_selectedItems->Clear(); + m_iSelected = -1; for (int i = 0 ; i < m_vecList->Size() ; i++) { CFileItemPtr item = m_vecList->Get(i); if (item->IsSelected()) { - m_selectedItems.push_back(i); - if (!m_selectedItem) - m_selectedItem = item; + m_selectedItems->Add(item); + if (m_iSelected == -1) + m_iSelected = i; } } @@ -85,9 +88,7 @@ case GUI_MSG_WINDOW_INIT: { - m_bButtonPressed = false; - m_bConfirmed = false; - CGUIDialogBoxBase::OnMessage(message); + CGUIDialog::OnMessage(message); return true; } break; @@ -120,7 +121,7 @@ } if (CONTROL_BUTTON == iControl) { - m_selectedItem = nullptr; + m_iSelected = -1; m_bButtonPressed = true; if (m_multiSelection) m_bConfirmed = true; @@ -147,15 +148,15 @@ break; } - return CGUIDialogBoxBase::OnMessage(message); + return CGUIDialog::OnMessage(message); } bool CGUIDialogSelect::OnBack(int actionID) { - m_selectedItem = nullptr; - m_selectedItems.clear(); + m_iSelected = -1; + m_selectedItems->Clear(); m_bConfirmed = false; - return CGUIDialogBoxBase::OnBack(actionID); + return CGUIDialog::OnBack(actionID); } void CGUIDialogSelect::Reset() @@ -165,9 +166,9 @@ m_bButtonPressed = false; m_useDetails = false; m_multiSelection = false; - m_selectedItem = nullptr; + m_iSelected = -1; m_vecList->Clear(); - m_selectedItems.clear(); + m_selectedItems->Clear(); } int CGUIDialogSelect::Add(const std::string& strLabel) @@ -177,29 +178,38 @@ return m_vecList->Size() - 1; } -int CGUIDialogSelect::Add(const CFileItem& item) +void CGUIDialogSelect::Add(const CFileItemList& items) { - m_vecList->Add(CFileItemPtr(new CFileItem(item))); + for (int i=0;iAdd(item); return m_vecList->Size() - 1; } -void CGUIDialogSelect::SetItems(const CFileItemList& pList) +void CGUIDialogSelect::SetItems(CFileItemList* pList) { // need to make internal copy of list to be sure dialog is owner of it m_vecList->Clear(); - m_vecList->Copy(pList); + if (pList) + m_vecList->Copy(*pList); } int CGUIDialogSelect::GetSelectedLabel() const { - return m_selectedItems.size() > 0 ? m_selectedItems[0] : -1; + return m_iSelected; } const CFileItemPtr CGUIDialogSelect::GetSelectedItem() const { - if (m_selectedItem) - return m_selectedItem; - return CFileItemPtr(new CFileItem); + return m_selectedItems->Size() > 0 ? m_selectedItems->Get(0) : CFileItemPtr(new CFileItem); } const std::string& CGUIDialogSelect::GetSelectedLabelText() const @@ -207,9 +217,9 @@ return GetSelectedItem()->GetLabel(); } -const std::vector& CGUIDialogSelect::GetSelectedItems() const +const CFileItemList& CGUIDialogSelect::GetSelectedItems() const { - return m_selectedItems; + return *m_selectedItems; } void CGUIDialogSelect::EnableButton(bool enable, int string) @@ -241,11 +251,10 @@ // or if it doesn't have a valid value yet // or if the current value is bigger than the new one // so that we always focus the item nearest to the beginning of the list - if (!m_multiSelection || !m_selectedItem || - (!m_selectedItems.empty() && m_selectedItems.back() > iSelected)) - m_selectedItem = m_vecList->Get(iSelected); + if (!m_multiSelection || m_iSelected < 0 || m_iSelected > iSelected) + m_iSelected = iSelected; m_vecList->Get(iSelected)->Select(true); - m_selectedItems.push_back(iSelected); + m_selectedItems->Add(m_vecList->Get(iSelected)); } void CGUIDialogSelect::SetSelected(const std::string &strSelectedLabel) @@ -310,15 +319,16 @@ void CGUIDialogSelect::OnInitWindow() { m_viewControl.SetItems(*m_vecList); - m_selectedItems.clear(); - for(int i = 0 ; i < m_vecList->Size(); i++) + m_selectedItems->Clear(); + if (m_iSelected == -1) { - auto item = m_vecList->Get(i); - if (item->IsSelected()) + for(int i = 0 ; i < m_vecList->Size(); i++) { - m_selectedItems.push_back(i); - if (m_selectedItem == nullptr) - m_selectedItem = item; + if (m_vecList->Get(i)->IsSelected()) + { + m_iSelected = i; + break; + } } } m_viewControl.SetCurrentView(m_useDetails ? CONTROL_DETAILS : CONTROL_LIST); @@ -332,20 +342,13 @@ SetupButton(); CGUIDialogBoxBase::OnInitWindow(); - // if nothing is selected, focus first item - m_viewControl.SetSelectedItem(std::max(GetSelectedLabel(), 0)); -} - -void CGUIDialogSelect::OnDeinitWindow(int nextWindowID) -{ - m_viewControl.Clear(); - - CGUIDialogBoxBase::OnDeinitWindow(nextWindowID); + // if m_iSelected < 0 focus first item + m_viewControl.SetSelectedItem(std::max(m_iSelected, 0)); } void CGUIDialogSelect::OnWindowUnload() { - CGUIDialogBoxBase::OnWindowUnload(); + CGUIDialog::OnWindowUnload(); m_viewControl.Reset(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSelect.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSelect.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSelect.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSelect.h 2015-10-19 08:39:16.000000000 +0000 @@ -37,12 +37,13 @@ void Reset(); int Add(const std::string& strLabel); - int Add(const CFileItem& item); - void SetItems(const CFileItemList& items); + int Add(const CFileItem* pItem); + void Add(const CFileItemList& items); + void SetItems(CFileItemList* items); int GetSelectedLabel() const; const std::string& GetSelectedLabelText() const; const CFileItemPtr GetSelectedItem() const; - const std::vector& GetSelectedItems() const; + const CFileItemList& GetSelectedItems() const; void EnableButton(bool enable, int string); bool IsButtonPressed(); void Sort(bool bSortOrder = true); @@ -56,18 +57,17 @@ virtual CGUIControl *GetFirstFocusableControl(int id); virtual void OnWindowLoaded(); virtual void OnInitWindow(); - virtual void OnDeinitWindow(int nextWindowID); virtual void OnWindowUnload(); void SetupButton(); bool m_bButtonEnabled; int m_buttonString; bool m_bButtonPressed; - CFileItemPtr m_selectedItem; + int m_iSelected; bool m_useDetails; bool m_multiSelection; - std::vector m_selectedItems; + CFileItemList* m_selectedItems; CFileItemList* m_vecList; CGUIViewControl m_viewControl; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSimpleMenu.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSimpleMenu.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSimpleMenu.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSimpleMenu.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -30,7 +30,6 @@ #include "utils/log.h" #include "video/VideoInfoTag.h" #include "URL.h" -#include "utils/Variant.h" bool CGUIDialogSimpleMenu::ShowPlaySelection(CFileItem& item) { @@ -38,7 +37,7 @@ if (item.m_lStartOffset || (item.HasVideoInfoTag() && item.GetVideoInfoTag()->m_iBookmarkId > 0)) return true; - if (CSettings::GetInstance().GetInt(CSettings::SETTING_DISC_PLAYBACK) != BD_PLAYBACK_SIMPLE_MENU) + if (CSettings::Get().GetInt("disc.playback") != BD_PLAYBACK_SIMPLE_MENU) return true; std::string path; @@ -99,10 +98,10 @@ while (true) { dialog->Reset(); - dialog->SetHeading(CVariant{25006}); // Select playback item - dialog->SetItems(items); + dialog->SetHeading(25006 /* Select playback item */); + dialog->SetItems(&items); dialog->SetUseDetails(true); - dialog->Open(); + dialog->DoModal(); CFileItemPtr item_new = dialog->GetSelectedItem(); if (!item_new || dialog->GetSelectedLabel() < 0) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSlider.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSlider.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSlider.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSlider.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -101,11 +101,6 @@ CGUIDialog::OnWindowLoaded(); } -void CGUIDialogSlider::SetModalityType(DialogModalityType type) -{ - m_modalityType = type; -} - void CGUIDialogSlider::ShowAndGetInput(const std::string &label, float value, float min, float delta, float max, ISliderCallback *callback, void *callbackData) { // grab the slider dialog @@ -116,8 +111,7 @@ // set the label and value slider->Initialize(); slider->SetSlider(label, value, min, delta, max, callback, callbackData); - slider->SetModalityType(DialogModalityType::MODAL); - slider->Open(); + slider->DoModal(); } void CGUIDialogSlider::Display(int label, float value, float min, float delta, float max, ISliderCallback *callback) @@ -131,6 +125,5 @@ slider->Initialize(); slider->SetAutoClose(1000); slider->SetSlider(g_localizeStrings.Get(label), value, min, delta, max, callback, NULL); - slider->SetModalityType(DialogModalityType::MODELESS); - slider->Open(); + slider->Show(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSlider.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSlider.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSlider.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSlider.h 2015-10-19 08:39:16.000000000 +0000 @@ -31,8 +31,6 @@ virtual bool OnMessage(CGUIMessage& message); virtual bool OnAction(const CAction &action); - void SetModalityType(DialogModalityType type); - /*! \brief Show the slider dialog and wait for the user to change the value Shows the slider until the user is happy with the adjusted value. Calls back with each change to the callback function allowing changes to take place immediately. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSmartPlaylistEditor.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSmartPlaylistEditor.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSmartPlaylistEditor.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSmartPlaylistEditor.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,23 +19,20 @@ */ #include "GUIDialogSmartPlaylistEditor.h" - -#include - -#include "FileItem.h" -#include "filesystem/File.h" -#include "GUIDialogSmartPlaylistRule.h" #include "guilib/GUIKeyboardFactory.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "input/Key.h" -#include "profiles/ProfilesManager.h" -#include "settings/Settings.h" #include "Util.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" +#include "GUIDialogSmartPlaylistRule.h" +#include "guilib/GUIWindowManager.h" +#include "filesystem/File.h" +#include "profiles/ProfilesManager.h" +#include "settings/Settings.h" +#include "FileItem.h" +#include "input/Key.h" +#include "guilib/LocalizeStrings.h" + +using namespace std; #define CONTROL_HEADING 2 #define CONTROL_RULE_LIST 10 @@ -145,40 +142,6 @@ HighlightItem(-1); } break; - case GUI_MSG_WINDOW_INIT: - { - const std::string& startupList = message.GetStringParam(0); - if (!startupList.empty()) - { - int party = 0; - if (URIUtils::PathEquals(startupList, CProfilesManager::GetInstance().GetUserDataItem("PartyMode.xsp"))) - party = 1; - else if (URIUtils::PathEquals(startupList, CProfilesManager::GetInstance().GetUserDataItem("PartyMode-Video.xsp"))) - party = 2; - - if ((party && !XFILE::CFile::Exists(startupList)) || - m_playlist.Load(startupList)) - { - m_path = startupList; - - if (party == 1) - m_mode = "partymusic"; - else if (party == 2) - m_mode = "partyvideo"; - else - { - PLAYLIST_TYPE type = ConvertType(m_playlist.GetType()); - if (type == TYPE_SONGS || type == TYPE_ALBUMS || type == TYPE_ARTISTS) - m_mode = "music"; - else - m_mode = "video"; - } - } - else - return false; - } - } - break; } return CGUIDialog::OnMessage(message); } @@ -197,13 +160,13 @@ void CGUIDialogSmartPlaylistEditor::OnOK() { - std::string systemPlaylistsPath = CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH); + std::string systemPlaylistsPath = CSettings::Get().GetString("system.playlistspath"); // save our playlist if (m_path.empty()) { std::string filename(CUtil::MakeLegalFileName(m_playlist.m_playlistName)); std::string path; - if (CGUIKeyboardFactory::ShowAndGetInput(filename, CVariant{g_localizeStrings.Get(16013)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(filename, g_localizeStrings.Get(16013), false)) { path = URIUtils::AddFileToFolder(systemPlaylistsPath, m_playlist.GetSaveLocation()); path = URIUtils::AddFileToFolder(path, CUtil::MakeLegalFileName(filename)); @@ -353,14 +316,14 @@ // sort out the order fields std::vector< std::pair > labels; - std::vector orders = CSmartPlaylistRule::GetOrders(m_playlist.GetType()); + vector orders = CSmartPlaylistRule::GetOrders(m_playlist.GetType()); for (unsigned int i = 0; i < orders.size(); i++) labels.push_back(make_pair(g_localizeStrings.Get(SortUtils::GetSortLabel(orders[i])), orders[i])); SET_CONTROL_LABELS(CONTROL_ORDER_FIELD, m_playlist.m_orderField, &labels); // setup groups labels.clear(); - std::vector groups = CSmartPlaylistRule::GetGroups(m_playlist.GetType()); + vector groups = CSmartPlaylistRule::GetGroups(m_playlist.GetType()); Field currentGroup = CSmartPlaylistRule::TranslateGroup(m_playlist.GetGroup().c_str()); for (unsigned int i = 0; i < groups.size(); i++) labels.push_back(make_pair(CSmartPlaylistRule::GetLocalizedGroup(groups[i]), groups[i])); @@ -423,7 +386,7 @@ SendMessage(GUI_MSG_ITEM_SELECT, CONTROL_LIMIT, m_playlist.m_limit); - std::vector allowedTypes; + vector allowedTypes; if (m_mode == "partymusic") { allowedTypes.push_back(TYPE_SONGS); @@ -561,7 +524,7 @@ editor->m_playlist = CSmartPlaylist(); editor->m_mode = type; editor->Initialize(); - editor->Open(); + editor->DoModal(g_windowManager.GetActiveWindow()); return !editor->m_cancelled; } @@ -571,9 +534,9 @@ if (!editor) return false; editor->m_mode = type; - if (URIUtils::PathEquals(path, CProfilesManager::GetInstance().GetUserDataItem("PartyMode.xsp"))) + if (URIUtils::PathEquals(path, CProfilesManager::Get().GetUserDataItem("PartyMode.xsp"))) editor->m_mode = "partymusic"; - if (URIUtils::PathEquals(path, CProfilesManager::GetInstance().GetUserDataItem("PartyMode-Video.xsp"))) + if (URIUtils::PathEquals(path, CProfilesManager::Get().GetUserDataItem("PartyMode-Video.xsp"))) editor->m_mode = "partyvideo"; CSmartPlaylist playlist; @@ -589,6 +552,6 @@ editor->m_playlist = playlist; editor->m_path = path; editor->Initialize(); - editor->Open(); + editor->DoModal(g_windowManager.GetActiveWindow()); return !editor->m_cancelled; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSmartPlaylistRule.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSmartPlaylistRule.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogSmartPlaylistRule.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogSmartPlaylistRule.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,9 +33,6 @@ #include "utils/LabelFormatter.h" #include "utils/StringUtils.h" #include "settings/Settings.h" -#include "utils/Variant.h" - -#include #define CONTROL_FIELD 15 #define CONTROL_OPERATOR 16 @@ -44,6 +41,8 @@ #define CONTROL_CANCEL 19 #define CONTROL_BROWSE 20 +using namespace std; + CGUIDialogSmartPlaylistRule::CGUIDialogSmartPlaylistRule(void) : CGUIDialog(WINDOW_DIALOG_SMART_PLAYLIST_RULE, "SmartPlaylistRule.xml") { @@ -296,10 +295,10 @@ { VECSOURCES sources; if (m_type == "songs" || m_type == "mixed") - sources = *CMediaSourceSettings::GetInstance().GetSources("music"); + sources = *CMediaSourceSettings::Get().GetSources("music"); if (CSmartPlaylist::IsVideoType(m_type)) { - VECSOURCES sources2 = *CMediaSourceSettings::GetInstance().GetSources("video"); + VECSOURCES sources2 = *CMediaSourceSettings::Get().GetSources("video"); sources.insert(sources.end(),sources2.begin(),sources2.end()); } g_mediaManager.GetLocalDrives(sources); @@ -339,24 +338,25 @@ } // sort the items - items.Sort(SortByLabel, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + items.Sort(SortByLabel, SortOrderAscending, CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); - pDialog->SetItems(items); + pDialog->SetItems(&items); std::string strHeading = StringUtils::Format(g_localizeStrings.Get(13401).c_str(), g_localizeStrings.Get(iLabel).c_str()); - pDialog->SetHeading(CVariant{std::move(strHeading)}); + pDialog->SetHeading(strHeading); pDialog->SetMultiSelection(m_rule.m_field != FieldPlaylist && m_rule.m_field != FieldVirtualFolder); if (!m_rule.m_parameter.empty()) pDialog->SetSelected(m_rule.m_parameter); - pDialog->Open(); + pDialog->DoModal(); if (pDialog->IsConfirmed()) { + const CFileItemList &items = pDialog->GetSelectedItems(); m_rule.m_parameter.clear(); - for (int i : pDialog->GetSelectedItems()) - m_rule.m_parameter.push_back(items.Get(i)->GetLabel()); + for (int index = 0; index < items.Size(); index++) + m_rule.m_parameter.push_back(items[index]->GetLabel()); UpdateButtons(); } @@ -389,7 +389,7 @@ std::pair OperatorLabel(CDatabaseQueryRule::SEARCH_OPERATOR op) { - return std::make_pair(CSmartPlaylistRule::GetLocalizedOperator(op), op); + return make_pair(CSmartPlaylistRule::GetLocalizedOperator(op), op); } void CGUIDialogSmartPlaylistRule::UpdateButtons() @@ -499,9 +499,9 @@ // add the fields to the field spincontrol std::vector< std::pair > labels; - std::vector fields = CSmartPlaylistRule::GetFields(m_type); + vector fields = CSmartPlaylistRule::GetFields(m_type); for (unsigned int i = 0; i < fields.size(); i++) - labels.push_back(std::make_pair(CSmartPlaylistRule::GetLocalizedField(fields[i]), fields[i])); + labels.push_back(make_pair(CSmartPlaylistRule::GetLocalizedField(fields[i]), fields[i])); SET_CONTROL_LABELS(CONTROL_FIELD, 0, &labels); @@ -529,7 +529,7 @@ editor->m_rule = rule; editor->m_type = type; - editor->Open(); + editor->DoModal(g_windowManager.GetActiveWindow()); rule = editor->m_rule; return !editor->m_cancelled; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogVolumeBar.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogVolumeBar.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogVolumeBar.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogVolumeBar.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,7 @@ #define VOLUME_BAR_DISPLAY_TIME 1000L CGUIDialogVolumeBar::CGUIDialogVolumeBar(void) - : CGUIDialog(WINDOW_DIALOG_VOLUME_BAR, "DialogVolumeBar.xml", DialogModalityType::MODELESS) + : CGUIDialog(WINDOW_DIALOG_VOLUME_BAR, "DialogVolumeBar.xml") { m_loadType = LOAD_ON_GUI_INIT; SetAutoClose(VOLUME_BAR_DISPLAY_TIME); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogYesNo.cpp kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogYesNo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogYesNo.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogYesNo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,6 @@ #include "GUIDialogYesNo.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" -#include "messaging/helpers/DialogHelper.h" #define CONTROL_NO_BUTTON 10 #define CONTROL_YES_BUTTON 11 @@ -73,20 +72,20 @@ return CGUIDialogBoxBase::OnBack(actionID); } -bool CGUIDialogYesNo::ShowAndGetInput(CVariant heading, CVariant line0, CVariant line1, CVariant line2, bool &bCanceled) +bool CGUIDialogYesNo::ShowAndGetInput(const CVariant &heading, const CVariant &line0, const CVariant &line1, const CVariant &line2, bool &bCanceled) { - return ShowAndGetInput(heading, line0, line1, line2, bCanceled, "", "", NO_TIMEOUT); + return ShowAndGetInput(heading, line0, line1, line2, bCanceled, "", ""); } -bool CGUIDialogYesNo::ShowAndGetInput(CVariant heading, CVariant line0, CVariant line1, CVariant line2, CVariant noLabel /* = "" */, CVariant yesLabel /* = "" */) +bool CGUIDialogYesNo::ShowAndGetInput(const CVariant &heading, const CVariant &line0, const CVariant &line1, const CVariant &line2, const CVariant &noLabel /* = "" */, const CVariant &yesLabel /* = "" */) { - bool bDummy(false); - return ShowAndGetInput(heading, line0, line1, line2, bDummy, noLabel, yesLabel, NO_TIMEOUT); + bool bDummy; + return ShowAndGetInput(heading, line0, line1, line2, bDummy, noLabel, yesLabel); } -bool CGUIDialogYesNo::ShowAndGetInput(CVariant heading, CVariant line0, CVariant line1, CVariant line2, bool &bCanceled, CVariant noLabel, CVariant yesLabel, unsigned int autoCloseTime) +bool CGUIDialogYesNo::ShowAndGetInput(const CVariant &heading, const CVariant &line0, const CVariant &line1, const CVariant &line2, bool &bCanceled, const CVariant &noLabel, const CVariant &yesLabel, unsigned int autoCloseTime /* = 0 */) { - CGUIDialogYesNo *dialog = static_cast(g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO)); + CGUIDialogYesNo *dialog = (CGUIDialogYesNo *)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!dialog) return false; @@ -99,21 +98,21 @@ dialog->SetChoice(0, !noLabel.empty() ? noLabel : 106); dialog->SetChoice(1, !yesLabel.empty() ? yesLabel : 107); dialog->m_bCanceled = false; - dialog->Open(); + dialog->DoModal(); bCanceled = dialog->m_bCanceled; return (dialog->IsConfirmed()) ? true : false; } -bool CGUIDialogYesNo::ShowAndGetInput(CVariant heading, CVariant text) +bool CGUIDialogYesNo::ShowAndGetInput(const CVariant &heading, const CVariant &text) { - bool bDummy(false); - return ShowAndGetInput(heading, text, "", "", bDummy); + bool bDummy; + return ShowAndGetInput(heading, text, bDummy, "", ""); } -bool CGUIDialogYesNo::ShowAndGetInput(CVariant heading, CVariant text, bool &bCanceled, CVariant noLabel /* = "" */, CVariant yesLabel /* = "" */, unsigned int autoCloseTime) +bool CGUIDialogYesNo::ShowAndGetInput(const CVariant &heading, const CVariant &text, bool &bCanceled, const CVariant &noLabel /* = "" */, const CVariant &yesLabel /* = "" */, unsigned int autoCloseTime /* = 0 */) { - CGUIDialogYesNo *dialog = static_cast(g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO)); + CGUIDialogYesNo *dialog = (CGUIDialogYesNo *)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!dialog) return false; @@ -124,43 +123,12 @@ dialog->m_bCanceled = false; dialog->SetChoice(0, !noLabel.empty() ? noLabel : 106); dialog->SetChoice(1, !yesLabel.empty() ? yesLabel : 107); - dialog->Open(); + dialog->DoModal(); bCanceled = dialog->m_bCanceled; return (dialog->IsConfirmed()) ? true : false; } -int CGUIDialogYesNo::ShowAndGetInput(const KODI::MESSAGING::HELPERS::DialogYesNoMessage& options) -{ - //Set default yes/no labels, these might be overwritten further down if specified - //by the caller - SetChoice(0, 106); - SetChoice(1, 107); - if (!options.heading.isNull()) - SetHeading(options.heading); - if (!options.text.isNull()) - SetText(options.text); - if (!options.noLabel.isNull()) - SetChoice(0, options.noLabel); - if (!options.yesLabel.isNull()) - SetChoice(1, options.yesLabel); - if (options.autoclose > 0) - SetAutoClose(options.autoclose); - m_bCanceled = false; - - for (size_t i = 0; i < 3; ++i) - { - if (!options.lines[i].isNull()) - SetLine(i, options.lines[i]); - } - - Open(); - if (m_bCanceled) - return -1; - - return IsConfirmed() ? 1 : 0; -} - int CGUIDialogYesNo::GetDefaultLabelID(int controlId) const { if (controlId == CONTROL_NO_BUTTON) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogYesNo.h kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogYesNo.h --- kodi-16.1~git20160425.1001-final/xbmc/dialogs/GUIDialogYesNo.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/dialogs/GUIDialogYesNo.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,19 +20,8 @@ * */ +#include #include "GUIDialogBoxBase.h" -#include "utils/Variant.h" - -namespace KODI -{ - namespace MESSAGING - { - namespace HELPERS - { - struct DialogYesNoMessage; - } - } -} class CGUIDialogYesNo : public CGUIDialogBoxBase @@ -43,11 +32,6 @@ virtual bool OnMessage(CGUIMessage& message); virtual bool OnBack(int actionID); - enum TimeOut - { - NO_TIMEOUT = 0 - }; - /*! \brief Show a yes-no dialog, then wait for user to dismiss it. \param heading Localized label id or string for the heading of the dialog \param line0 Localized label id or string for line 1 of the dialog message @@ -56,7 +40,7 @@ \param bCanceled Holds true if the dialog was canceled otherwise false \return true if user selects Yes, otherwise false if user selects No. */ - static bool ShowAndGetInput(CVariant heading, CVariant line0, CVariant line1, CVariant line2, bool &bCanceled); + static bool ShowAndGetInput(const CVariant &heading, const CVariant &line0, const CVariant &line1, const CVariant &line2, bool &bCanceled); /*! \brief Show a yes-no dialog, then wait for user to dismiss it. \param heading Localized label id or string for the heading of the dialog @@ -67,7 +51,7 @@ \param iYesLabel Localized label id or string for the yes button \return true if user selects Yes, otherwise false if user selects No. */ - static bool ShowAndGetInput(CVariant heading, CVariant line0, CVariant line1, CVariant line2, CVariant noLabel = "", CVariant yesLabel = ""); + static bool ShowAndGetInput(const CVariant &heading, const CVariant &line0, const CVariant &line1, const CVariant &line2, const CVariant &noLabel = "", const CVariant &yesLabel = ""); /*! \brief Show a yes-no dialog, then wait for user to dismiss it. \param heading Localized label id or string for the heading of the dialog @@ -80,14 +64,14 @@ \param autoCloseTime Time in ms before the dialog becomes automatically closed \return true if user selects Yes, otherwise false if user selects No. */ - static bool ShowAndGetInput(CVariant heading, CVariant line0, CVariant line1, CVariant line2, bool &bCanceled, CVariant noLabel, CVariant yesLabel, unsigned int autoCloseTime); + static bool ShowAndGetInput(const CVariant &heading, const CVariant &line0, const CVariant &line1, const CVariant &line2, bool &bCanceled, const CVariant &noLabel, const CVariant &yesLabel, unsigned int autoCloseTime = 0); /*! \brief Show a yes-no dialog, then wait for user to dismiss it. \param heading Localized label id or string for the heading of the dialog \param text Localized label id or string for the dialog message \return true if user selects Yes, otherwise false if user selects No. */ - static bool ShowAndGetInput(CVariant heading, CVariant text); + static bool ShowAndGetInput(const CVariant &heading, const CVariant &text); /*! \brief Show a yes-no dialog, then wait for user to dismiss it. \param heading Localized label id or string for the heading of the dialog @@ -98,18 +82,7 @@ \param autoCloseTime Time in ms before the dialog becomes automatically closed \return true if user selects Yes, otherwise false if user selects No. */ - static bool ShowAndGetInput(CVariant heading, CVariant text, bool &bCanceled, CVariant noLabel, CVariant yesLabel, unsigned int autoCloseTime); - - /*! - \brief Open a Yes/No dialog and wait for input - - \param[in] options a struct of type DialogYesNoMessage containing - the options to set for this dialog. - - \returns -1 for cancelled, 0 for No and 1 for Yes - \sa KODI::MESSAGING::HELPERS::DialogYesNoMessage - */ - int ShowAndGetInput(const KODI::MESSAGING::HELPERS::DialogYesNoMessage& options); + static bool ShowAndGetInput(const CVariant &heading, const CVariant &text, bool &bCanceled, const CVariant &noLabel = "", const CVariant &yesLabel = "", unsigned int autoCloseTime = 0); protected: virtual int GetDefaultLabelID(int controlId) const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/DllPaths_generated_android.h.in kodi-15.2~git20151019.1039-final/xbmc/DllPaths_generated_android.h.in --- kodi-16.1~git20160425.1001-final/xbmc/DllPaths_generated_android.h.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/DllPaths_generated_android.h.in 2015-10-19 08:39:15.000000000 +0000 @@ -30,10 +30,11 @@ #define DLL_PATH_CPLUFF "libcpluff-@ARCH@.so" #define DLL_PATH_IMAGELIB "libImageLib-@ARCH@.so" #define DLL_PATH_LIBEXIF "libexif-@ARCH@.so" +#define DLL_PATH_LIBHDHOMERUN "libhdhomerun-@ARCH@.so" +#define DLL_PATH_MEDIAINFO "libmediainfo-@ARCH@.so" #define DLL_PATH_LIBRTMP "@RTMP_SONAME@" #define DLL_PATH_LIBNFS "@NFS_SONAME@" -#define DLL_PATH_LIBGIF "@GIF_SONAME@" #define DLL_PATH_LIBPLIST "@PLIST_SONAME@" #define DLL_PATH_LIBSHAIRPLAY "@SHAIRPLAY_SONAME@" #define DLL_PATH_LIBCEC "@LIBCEC_SONAME@" @@ -48,6 +49,10 @@ #define DLL_PATH_LIBMPEG2 "@MPEG2_SONAME@" #define DLL_PATH_LIBSTAGEFRIGHTICS "libXBMCvcodec_stagefrightICS-@ARCH@.so" +/* cdrip */ +#define DLL_PATH_OGG "@OGG_SONAME@" +#define DLL_PATH_VORBIS "@VORBIS_SONAME@" + /* libbluray */ #define DLL_PATH_LIBBLURAY "@BLURAY_SONAME@" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/DllPaths_generated.h.in kodi-15.2~git20151019.1039-final/xbmc/DllPaths_generated.h.in --- kodi-16.1~git20160425.1001-final/xbmc/DllPaths_generated.h.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/DllPaths_generated.h.in 2015-10-19 08:39:15.000000000 +0000 @@ -28,11 +28,11 @@ #define DLL_PATH_CPLUFF "special://xbmcbin/system/libcpluff-@ARCH@.so" #define DLL_PATH_IMAGELIB "special://xbmcbin/system/ImageLib-@ARCH@.so" #define DLL_PATH_LIBEXIF "special://xbmcbin/system/libexif-@ARCH@.so" +#define DLL_PATH_LIBHDHOMERUN "special://xbmcbin/system/hdhomerun-@ARCH@.so" +#define DLL_PATH_MEDIAINFO "special://xbmcbin/system/mediainfo-@ARCH@.so" #define DLL_PATH_LIBRTMP "@RTMP_SONAME@" #define DLL_PATH_LIBNFS "@NFS_SONAME@" -#define DLL_PATH_LIBGIF "@GIF_SONAME@" - #define DLL_PATH_LIBPLIST "@PLIST_SONAME@" #define DLL_PATH_LIBSHAIRPLAY "@SHAIRPLAY_SONAME@" #define DLL_PATH_LIBCEC "@LIBCEC_SONAME@" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/DllPaths_win32.h kodi-15.2~git20151019.1039-final/xbmc/DllPaths_win32.h --- kodi-16.1~git20160425.1001-final/xbmc/DllPaths_win32.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/DllPaths_win32.h 2015-10-19 08:39:15.000000000 +0000 @@ -25,7 +25,7 @@ #define DLL_PATH_CPLUFF "special://xbmcbin/system/cpluff.dll" #define DLL_PATH_IMAGELIB "special://xbmcbin/system/ImageLib.dll" #define DLL_PATH_LIBEXIF "special://xbmcbin/system/libexif.dll" -#define DLL_PATH_LIBGIF "special://xbmcbin/system/libgif.dll" +#define DLL_PATH_LIBHDHOMERUN "special://xbmcbin/system/hdhomerun.dll" #define DLL_PATH_LIBCURL "special://xbmcbin/system/libcurl.dll" #define DLL_PATH_LIBNFS "special://xbmcbin/system/libnfs.dll" #define DLL_PATH_LIBPLIST "special://xbmcbin/system/airplay/libplist.dll" @@ -38,6 +38,10 @@ #define DLL_PATH_LIBDVDNAV "special://xbmcbin/system/players/dvdplayer/libdvdnav.dll" #define DLL_PATH_LIBRTMP "special://xbmcbin/system/players/dvdplayer/librtmp.dll" +/* cdrip */ +#define DLL_PATH_OGG "special://xbmcbin/system/cdrip/ogg.dll" +#define DLL_PATH_VORBIS "special://xbmcbin/system/cdrip/vorbis.dll" + /* libbluray */ #define DLL_PATH_LIBBLURAY "special://xbmcbin/system/players/dvdplayer/libbluray.dll" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/EpgContainer.cpp kodi-15.2~git20151019.1039-final/xbmc/epg/EpgContainer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/epg/EpgContainer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/EpgContainer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,18 +18,12 @@ * */ -#include "EpgContainer.h" - -#include - #include "Application.h" #include "dialogs/GUIDialogExtendedProgressBar.h" -#include "Epg.h" -#include "EpgSearchFilter.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" -#include "pvr/channels/PVRChannelGroupsContainer.h" #include "pvr/PVRManager.h" +#include "pvr/channels/PVRChannelGroupsContainer.h" #include "pvr/recordings/PVRRecordings.h" #include "settings/AdvancedSettings.h" #include "settings/lib/Setting.h" @@ -37,6 +31,9 @@ #include "threads/SingleLock.h" #include "utils/log.h" +#include "Epg.h" +#include "EpgContainer.h" +#include "EpgSearchFilter.h" using namespace EPG; using namespace PVR; @@ -50,7 +47,6 @@ m_bIsInitialising = true; m_iNextEpgId = 0; m_bPreventUpdates = false; - m_bMarkForPersist = false; m_updateEvent.Reset(); m_bStarted = false; m_bLoaded = false; @@ -68,7 +64,7 @@ Unload(); } -CEpgContainer &CEpgContainer::GetInstance() +CEpgContainer &CEpgContainer::Get(void) { static CEpgContainer epgInstance; return epgInstance; @@ -105,12 +101,11 @@ { CSingleLock lock(m_critSection); /* clear all epg tables and remove pointers to epg tables on channels */ - for (const auto &epgEntry : m_epgs) + for (EPGMAP_CITR it = m_epgs.begin(); it != m_epgs.end(); it++) { - epgEntry.second->UnregisterObserver(this); + it->second->UnregisterObserver(this); + delete it->second; } - m_epgEvents.clear(); - m_epgScans.clear(); m_epgs.clear(); m_iNextEpgUpdate = 0; m_bStarted = false; @@ -132,31 +127,11 @@ NotifyObservers(ObservableMessageEpgContainer); if (bThreadRunning) - Start(true); + Start(); } -class CEPGContainerStartJob : public CJob -{ -public: - CEPGContainerStartJob() {} - ~CEPGContainerStartJob(void) {} - - bool DoWork(void) - { - g_EpgContainer.Start(false); - return true; - } -}; - -void CEpgContainer::Start(bool bAsync) +void CEpgContainer::Start(void) { - if (bAsync) - { - CEPGContainerStartJob *job = new CEPGContainerStartJob(); - CJobManager::GetInstance().AddJob(job, NULL); - return; - } - Stop(); { @@ -174,6 +149,8 @@ } LoadFromDB(); + if (g_PVRManager.IsStarted()) + g_PVRManager.Recordings()->UpdateEpgTags(); CSingleLock lock(m_critSection); if (!m_bStop) @@ -185,8 +162,6 @@ m_bStarted = true; - g_PVRManager.TriggerEpgsCreate(); - CLog::Log(LOGNOTICE, "%s - EPG thread started", __FUNCTION__); } } @@ -206,8 +181,6 @@ void CEpgContainer::Notify(const Observable &obs, const ObservableMessage msg) { - if (msg == ObservableMessageEpg) - UpdateEpgEvents(); SetChanged(); NotifyObservers(msg); } @@ -218,8 +191,8 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_EPG_IGNOREDBFORCLIENT || settingId == CSettings::SETTING_EPG_EPGUPDATE || - settingId == CSettings::SETTING_EPG_DAYSTODISPLAY) + if (settingId == "epg.ignoredbforclient" || settingId == "epg.epgupdate" || + settingId == "epg.daystodisplay") LoadSettings(); } @@ -239,28 +212,18 @@ unsigned int iCounter(0); if (m_database.IsOpen()) { - { - /* unlock m_critSection before calling ShowProgressDialog() - - this is not legal, but works around a deadlock bug (because - ShowProgressDialog() calls functions which lock - g_graphicsContext); note that ShowProgressDialog() is - sometimes called with m_critSection locked and sometimes - without; this is a major bug that must be addressed - eventually */ - CSingleExit exit(m_critSection); - ShowProgressDialog(false); - } + ShowProgressDialog(false); m_database.DeleteOldEpgEntries(); m_database.Get(*this); - for (const auto &epgEntry : m_epgs) + for (EPGMAP_CITR it = m_epgs.begin(); it != m_epgs.end(); it++) { if (m_bStop) break; - UpdateProgressDialog(++iCounter, m_epgs.size(), epgEntry.second->Name()); + UpdateProgressDialog(++iCounter, m_epgs.size(), it->second->Name()); lock.Leave(); - epgEntry.second->Load(); + it->second->Load(); lock.Enter(); } @@ -270,18 +233,10 @@ m_bLoaded = bLoaded; } -bool CEpgContainer::MarkTablesForPersist(void) -{ - /* Set m_bMarkForPersist to persist tables on the next Process() run but only - if epg.ignoredbforclient is set, otherwise persistAll does already persisting. */ - CSingleLock lock(m_critSection); - return m_bMarkForPersist = CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_IGNOREDBFORCLIENT); -} - bool CEpgContainer::PersistTables(void) { m_critSection.lock(); - auto copy = m_epgs; + std::map copy = m_epgs; m_critSection.unlock(); return m_database.Persist(copy); } @@ -290,12 +245,12 @@ { bool bReturn(true); m_critSection.lock(); - auto copy = m_epgs; + std::map copy = m_epgs; m_critSection.unlock(); - for (EPGMAP::const_iterator it = copy.begin(); it != copy.end() && !m_bStop; ++it) + for (EPGMAP_CITR it = copy.begin(); it != copy.end() && !m_bStop; it++) { - CEpgPtr epg = it->second; + CEpg *epg = it->second; if (epg && epg->NeedsSave()) { bReturn &= epg->Persist(); @@ -341,10 +296,10 @@ // get the channel CPVRChannelPtr channel = g_PVRChannelGroups->GetByUniqueID(request.channelID, request.clientID); - CEpgPtr epg; + CEpg* epg(NULL); // get the EPG for the channel - if (!channel || !(epg = channel->GetEPG())) + if (!channel || (epg = channel->GetEPG()) == NULL) { CLog::Log(LOGERROR, "PVR - %s - invalid channel or channel doesn't have an EPG", __FUNCTION__); continue; @@ -368,13 +323,6 @@ if (!m_bStop) CheckPlayingEvents(); - /* Check if PVR requests an update of Epg Channels */ - if (m_bMarkForPersist) - { - PersistTables(); - m_bMarkForPersist = false; - } - /* check for changes that need to be saved every 60 seconds */ if (iNow - iLastSave > 60) { @@ -386,34 +334,31 @@ } } -CEpgPtr CEpgContainer::GetById(int iEpgId) const +CEpg *CEpgContainer::GetById(int iEpgId) const { if (iEpgId < 0) return NULL; CSingleLock lock(m_critSection); - const auto &epgEntry = m_epgs.find((unsigned int) iEpgId); - return epgEntry != m_epgs.end() ? epgEntry->second : NULL; + std::map::const_iterator it = m_epgs.find((unsigned int) iEpgId); + return it != m_epgs.end() ? it->second : NULL; } -CEpgInfoTagPtr CEpgContainer::GetTagById(unsigned int iBroadcastId) const +CEpgInfoTagPtr CEpgContainer::GetTagById(int iBroadcastId) const { CEpgInfoTagPtr retval; CSingleLock lock(m_critSection); - const auto &infoTag = m_epgEvents.find(iBroadcastId); - if (infoTag != m_epgEvents.end()) - retval = infoTag->second; + for (std::map::const_iterator it = m_epgs.begin(); !retval && it != m_epgs.end(); ++it) + retval = it->second->GetTag(iBroadcastId); return retval; } -CEpgPtr CEpgContainer::GetByChannel(const CPVRChannel &channel) const +CEpg *CEpgContainer::GetByChannel(const CPVRChannel &channel) const { CSingleLock lock(m_critSection); - for (const auto &epgEntry : m_epgs) - { - if (channel.ChannelID() == epgEntry.second->ChannelID()) - return epgEntry.second; - } + for (std::map::const_iterator it = m_epgs.begin(); it != m_epgs.end(); ++it) + if (channel.ChannelID() == it->second->ChannelID()) + return it->second; return NULL; } @@ -421,7 +366,7 @@ void CEpgContainer::InsertFromDatabase(int iEpgID, const std::string &strName, const std::string &strScraperName) { // table might already have been created when pvr channels were loaded - CEpgPtr epg = GetById(iEpgID); + CEpg* epg = GetById(iEpgID); if (epg) { if (epg->Name() != strName || epg->ScraperName() != strScraperName) @@ -434,7 +379,7 @@ else { // create a new epg table - epg.reset(new CEpg(iEpgID, strName, strScraperName, true)); + epg = new CEpg(iEpgID, strName, strScraperName, true); if (epg) { m_epgs.insert(std::make_pair(iEpgID, epg)); @@ -444,7 +389,7 @@ } } -CEpgPtr CEpgContainer::CreateChannelEpg(CPVRChannelPtr channel) +CEpg *CEpgContainer::CreateChannelEpg(CPVRChannelPtr channel) { if (!channel) return NULL; @@ -452,14 +397,14 @@ WaitForUpdateFinish(true); LoadFromDB(); - CEpgPtr epg; + CEpg *epg(NULL); if (channel->EpgID() > 0) epg = GetById(channel->EpgID()); if (!epg) { channel->SetEpgID(NextEpgId()); - epg.reset(new CEpg(channel, false)); + epg = new CEpg(channel, false); CSingleLock lock(m_critSection); m_epgs.insert(std::make_pair((unsigned int)epg->EpgID(), epg)); @@ -482,9 +427,9 @@ bool CEpgContainer::LoadSettings(void) { - m_bIgnoreDbForClient = CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_IGNOREDBFORCLIENT); - m_iUpdateTime = CSettings::GetInstance().GetInt (CSettings::SETTING_EPG_EPGUPDATE) * 60; - m_iDisplayTime = CSettings::GetInstance().GetInt (CSettings::SETTING_EPG_DAYSTODISPLAY) * 24 * 60 * 60; + m_bIgnoreDbForClient = CSettings::Get().GetBool("epg.ignoredbforclient"); + m_iUpdateTime = CSettings::Get().GetInt ("epg.epgupdate") * 60; + m_iDisplayTime = CSettings::Get().GetInt ("epg.daystodisplay") * 24 * 60 * 60; return true; } @@ -495,8 +440,8 @@ CDateTimeSpan(0, g_advancedSettings.m_iEpgLingerTime / 60, g_advancedSettings.m_iEpgLingerTime % 60, 0); /* call Cleanup() on all known EPG tables */ - for (const auto &epgEntry : m_epgs) - epgEntry.second->Cleanup(now); + for (EPGMAP_CITR it = m_epgs.begin(); it != m_epgs.end(); it++) + it->second->Cleanup(now); /* remove the old entries from the database */ if (!m_bIgnoreDbForClient && m_database.IsOpen()) @@ -516,17 +461,17 @@ CSingleLock lock(m_critSection); - const auto &epgEntry = m_epgs.find((unsigned int)epg.EpgID()); - if (epgEntry == m_epgs.end()) + EPGMAP_ITR it = m_epgs.find((unsigned int)epg.EpgID()); + if (it == m_epgs.end()) return false; CLog::Log(LOGDEBUG, "deleting EPG table %s (%d)", epg.Name().c_str(), epg.EpgID()); if (bDeleteFromDatabase && !m_bIgnoreDbForClient && m_database.IsOpen()) - m_database.Delete(*epgEntry->second); + m_database.Delete(*it->second); - epgEntry->second->UnregisterObserver(this); - CleanupEpgEvents(epgEntry->second); - m_epgs.erase(epgEntry); + it->second->UnregisterObserver(this); + delete it->second; + m_epgs.erase(it); return true; } @@ -569,7 +514,7 @@ bReturn = g_application.m_bStop || m_bStop || m_bPreventUpdates; return bReturn || - (CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_PREVENTUPDATESWHILEPLAYINGTV) && + (CSettings::Get().GetBool("epg.preventupdateswhileplayingtv") && g_application.m_pPlayer && g_application.m_pPlayer->IsPlaying()); } @@ -625,17 +570,20 @@ m_updateEvent.Set(); } + g_PVRManager.Recordings()->UpdateEpgTags(); + if (bShowProgress && !bOnlyPending) CloseProgressDialog(); return false; } - std::vector invalidTables; + std::vector invalidTables; /* load or update all EPG tables */ + CEpg *epg; unsigned int iCounter(0); - for (const auto &epgEntry : m_epgs) + for (EPGMAP_CITR it = m_epgs.begin(); it != m_epgs.end(); it++) { if (InterruptUpdate()) { @@ -643,7 +591,7 @@ break; } - CEpgPtr epg = epgEntry.second; + epg = it->second; if (!epg) continue; @@ -668,7 +616,7 @@ invalidTables.push_back(epg); } - for (auto it = invalidTables.begin(); it != invalidTables.end(); ++it) + for (std::vector::iterator it = invalidTables.begin(); it != invalidTables.end(); ++it) DeleteEpg(**it, true); if (bInterrupted) @@ -680,9 +628,6 @@ } else { - if (g_PVRManager.IsStarted()) - g_PVRManager.Recordings()->UpdateEpgTags(); - CSingleLock lock(m_critSection); CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgUpdate); m_iNextEpgUpdate += g_advancedSettings.m_iEpgUpdateCheckInterval; @@ -712,8 +657,8 @@ int iInitialSize = results.Size(); CSingleLock lock(m_critSection); - for (const auto &epgEntry : m_epgs) - epgEntry.second->Get(results); + for (EPGMAP_CITR it = m_epgs.begin(); it != m_epgs.end(); it++) + it->second->Get(results); return results.Size() - iInitialSize; } @@ -723,10 +668,10 @@ CDateTime returnValue; CSingleLock lock(m_critSection); - for (const auto &epgEntry : m_epgs) + for (EPGMAP_CITR it = m_epgs.begin(); it != m_epgs.end(); it++) { lock.Leave(); - CDateTime entry = epgEntry.second->GetFirstDate(); + CDateTime entry = it->second->GetFirstDate(); if (entry.IsValid() && (!returnValue.IsValid() || entry < returnValue)) returnValue = entry; lock.Enter(); @@ -740,10 +685,10 @@ CDateTime returnValue; CSingleLock lock(m_critSection); - for (const auto &epgEntry : m_epgs) + for (EPGMAP_CITR it = m_epgs.begin(); it != m_epgs.end(); it++) { lock.Leave(); - CDateTime entry = epgEntry.second->GetLastDate(); + CDateTime entry = it->second->GetLastDate(); if (entry.IsValid() && (!returnValue.IsValid() || entry > returnValue)) returnValue = entry; lock.Enter(); @@ -759,8 +704,8 @@ /* get filtered results from all tables */ { CSingleLock lock(m_critSection); - for (const auto &epgEntry : m_epgs) - epgEntry.second->Get(results, filter); + for (EPGMAP_CITR it = m_epgs.begin(); it != m_epgs.end(); it++) + it->second->Get(results, filter); } /* remove duplicate entries */ @@ -781,8 +726,8 @@ CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(iNow); if (iNow >= m_iNextEpgActiveTagCheck) { - for (const auto &epgEntry : m_epgs) - bFoundChanges = epgEntry.second->CheckPlayingEvent() || bFoundChanges; + for (EPGMAP_ITR it = m_epgs.begin(); it != m_epgs.end(); it++) + bFoundChanges = it->second->CheckPlayingEvent() || bFoundChanges; CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgActiveTagCheck); m_iNextEpgActiveTagCheck += g_advancedSettings.m_iEpgActiveTagCheckInterval; @@ -825,69 +770,3 @@ request.channelID = channelID; m_updateRequests.push_back(request); } - -void CEpgContainer::UpdateEpgEvents() -{ - CLog::Log(LOGDEBUG, "EPGContainer - %s", __FUNCTION__); - CSingleLock lock(m_critSection); - CDateTime now = CDateTime::GetUTCDateTime(); - int count = 0; - - // Purge old events from the map with daily frequency and in according with EPG setting 'LingerTime' - if (!m_lastEpgEventPurge.IsValid() || m_lastEpgEventPurge < (now - CDateTimeSpan(1,0,0,0))) - { - CDateTime purgeTime = now - CDateTimeSpan(0, g_advancedSettings.m_iEpgLingerTime / 60, g_advancedSettings.m_iEpgLingerTime % 60, 0); - for (auto event = m_epgEvents.begin(); event != m_epgEvents.end();) - { - if (event->second->EndAsUTC() < purgeTime) - { - event = m_epgEvents.erase(event); - ++count; - } - else - ++event; - } - m_lastEpgEventPurge = now; - CLog::Log(LOGDEBUG, "EPGContainer - %s - %d item(s) purged", __FUNCTION__, count); - } - - // Fill updated entries - count = 0; - for (const auto &epgEntry : m_epgs) - { - if (!epgEntry.second->IsValid()) - continue; - - int epgId = epgEntry.second->EpgID(); - CDateTime epgScanTime = epgEntry.second->GetLastScanTime(); - - const auto &scan = m_epgScans.find(epgId); - if (scan != m_epgScans.end() && scan->second == epgScanTime) - continue; - - if (scan == m_epgScans.end()) - m_epgScans.insert(std::make_pair(epgId, epgScanTime)); - else - scan->second = epgScanTime; - - auto events = epgEntry.second->GetAllEventsWithBroadcastId(); - for (const auto &infoTag : events) - { - m_epgEvents[infoTag->UniqueBroadcastID()] = infoTag; - ++count; - } - } - CLog::Log(LOGDEBUG, "EPGContainer - %s - %d item(s) updated", __FUNCTION__, count); -} - -void CEpgContainer::CleanupEpgEvents(const CEpgPtr& epg) -{ - CSingleLock lock(m_critSection); - if (epg) - { - m_epgScans.erase(epg->EpgID()); - auto events = epg->GetAllEventsWithBroadcastId(); - for (const auto &infoTag : events) - m_epgEvents.erase(infoTag->UniqueBroadcastID()); - } -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/EpgContainer.h kodi-15.2~git20151019.1039-final/xbmc/epg/EpgContainer.h --- kodi-16.1~git20160425.1001-final/xbmc/epg/EpgContainer.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/EpgContainer.h 2015-10-19 08:39:16.000000000 +0000 @@ -35,7 +35,7 @@ namespace EPG { - #define g_EpgContainer CEpgContainer::GetInstance() + #define g_EpgContainer CEpgContainer::Get() struct SUpdateRequest { @@ -64,7 +64,7 @@ /*! * @return An instance of this singleton. */ - static CEpgContainer &GetInstance(); + static CEpgContainer &Get(void); /*! * @brief Get a pointer to the database instance. @@ -74,9 +74,8 @@ /*! * @brief Start the EPG update thread. - * @param bAsync Should the EPG container starts asynchronously */ - virtual void Start(bool bAsync); + virtual void Start(void); /*! * @brief Stop the EPG update thread. @@ -119,11 +118,11 @@ * @param obs The observable that sent the update. * @param msg The update message. */ - virtual void Notify(const Observable &obs, const ObservableMessage msg) override; + virtual void Notify(const Observable &obs, const ObservableMessage msg); - virtual void OnSettingChanged(const CSetting *setting) override; + virtual void OnSettingChanged(const CSetting *setting); - CEpgPtr CreateChannelEpg(PVR::CPVRChannelPtr channel); + CEpg *CreateChannelEpg(PVR::CPVRChannelPtr channel); /*! * @brief Get all EPG tables and apply a filter. @@ -157,21 +156,21 @@ * @param iEpgId The database ID of the table. * @return The table or NULL if it wasn't found. */ - virtual CEpgPtr GetById(int iEpgId) const; + virtual CEpg *GetById(int iEpgId) const; /*! * @brief Get the EPG event with the given event id * @param iBroadcastId The event id to get * @return The requested event, or an empty tag when not found */ - virtual CEpgInfoTagPtr GetTagById(unsigned int iBroadcastId) const; + virtual CEpgInfoTagPtr GetTagById(int iBroadcastId) const; /*! * @brief Get an EPG table given a PVR channel. * @param channel The channel to get the EPG table for. * @return The table or NULL if it wasn't found. */ - virtual CEpgPtr GetByChannel(const PVR::CPVRChannel &channel) const; + virtual CEpg *GetByChannel(const PVR::CPVRChannel &channel) const; /*! * @brief Notify EPG table observers when the currently active tag changed. @@ -233,21 +232,11 @@ bool IsInitialising(void) const; /*! - * @brief Set m_bMarkForPersist to force PersistTables() on next Process() run - * @return True when m_bMarkForPersist was set. - */ - bool MarkTablesForPersist(void); - - /*! * @brief Call Persist() on each table * @return True when they all were persisted, false otherwise. */ bool PersistAll(void); - /*! - * @brief Call Persist() on each table - * @return True when they all were persisted, false otherwise. - */ bool PersistTables(void); /*! @@ -283,7 +272,7 @@ /*! * @brief EPG update thread */ - virtual void Process(void) override; + virtual void Process(void); /*! * @brief Load all tables from the database @@ -292,12 +281,9 @@ void InsertFromDatabase(int iEpgID, const std::string &strName, const std::string &strScraperName); - /*! - * @brief Update map of epg events - */ - void UpdateEpgEvents(); - - void CleanupEpgEvents(const CEpgPtr& epg); + typedef std::map EPGMAP; + typedef EPGMAP::iterator EPGMAP_ITR; + typedef EPGMAP::const_iterator EPGMAP_CITR; CEpgDatabase m_database; /*!< the EPG database */ @@ -315,7 +301,6 @@ bool m_bStarted; /*!< true if EpgContainer has fully started */ bool m_bLoaded; /*!< true after epg data is initially loaded from the database */ bool m_bPreventUpdates; /*!< true to prevent EPG updates */ - bool m_bMarkForPersist; /*!< true to update channel Epgs called from PVR */ int m_pendingUpdates; /*!< count of pending manual updates */ time_t m_iLastEpgCleanup; /*!< the time the EPG was cleaned up */ time_t m_iNextEpgUpdate; /*!< the time the EPG will be updated */ @@ -330,9 +315,5 @@ std::list m_updateRequests; /*!< list of update requests triggered by addon*/ CCriticalSection m_updateRequestsLock; /*!< protect update requests*/ - - std::map m_epgEvents; /*!< map of EPG events by unique broadcast Id*/ - std::map m_epgScans; /*!< map of last scan time by EPG Id*/ - CDateTime m_lastEpgEventPurge; /*!< when the last purge has been processed*/ }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/Epg.cpp kodi-15.2~git20151019.1039-final/xbmc/epg/Epg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/epg/Epg.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/Epg.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,24 +18,21 @@ * */ -#include "Epg.h" - -#include - #include "addons/include/xbmc_epg_types.h" -#include "EpgContainer.h" -#include "EpgDatabase.h" #include "guilib/LocalizeStrings.h" -#include "pvr/addons/PVRClients.h" #include "pvr/PVRManager.h" +#include "pvr/addons/PVRClients.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "threads/SingleLock.h" #include "utils/log.h" +#include "EpgDatabase.h" +#include "EpgContainer.h" using namespace PVR; using namespace EPG; +using namespace std; CEpg::CEpg(int iEpgID, const std::string &strName /* = "" */, const std::string &strScraperName /* = "" */, bool bLoadedFromDb /* = false */) : m_bChanged(!bLoadedFromDb), @@ -90,7 +87,7 @@ m_lastScanTime = right.m_lastScanTime; m_pvrChannel = right.m_pvrChannel; - for (std::map::const_iterator it = right.m_tags.begin(); it != right.m_tags.end(); ++it) + for (map::const_iterator it = right.m_tags.begin(); it != right.m_tags.end(); ++it) m_tags.insert(make_pair(it->first, it->second)); return *this; @@ -162,7 +159,7 @@ void CEpg::Cleanup(const CDateTime &Time) { CSingleLock lock(m_critSection); - for (std::map::iterator it = m_tags.begin(); it != m_tags.end();) + for (map::iterator it = m_tags.begin(); it != m_tags.end();) { if (it->second->EndAsUTC() < Time) { @@ -184,7 +181,7 @@ CSingleLock lock(m_critSection); if (m_nowActiveStart.IsValid()) { - std::map::const_iterator it = m_tags.find(m_nowActiveStart); + map::const_iterator it = m_tags.find(m_nowActiveStart); if (it != m_tags.end() && it->second->IsActive()) return it->second; } @@ -194,7 +191,7 @@ CEpgInfoTagPtr lastActiveTag; /* one of the first items will always match if the list is sorted */ - for (std::map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) + for (map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) { if (it->second->IsActive()) { @@ -220,14 +217,14 @@ if (nowTag) { CSingleLock lock(m_critSection); - std::map::const_iterator it = m_tags.find(nowTag->StartAsUTC()); + map::const_iterator it = m_tags.find(nowTag->StartAsUTC()); if (it != m_tags.end() && ++it != m_tags.end()) return it->second; } else if (Size() > 0) { /* return the first event that is in the future */ - for (std::map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) + for (map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) { if (it->second->IsUpcoming()) return it->second; @@ -255,7 +252,7 @@ CEpgInfoTagPtr CEpg::GetTag(const CDateTime &StartTime) const { CSingleLock lock(m_critSection); - std::map::const_iterator it = m_tags.find(StartTime); + map::const_iterator it = m_tags.find(StartTime); if (it != m_tags.end()) { return it->second; @@ -264,10 +261,21 @@ return CEpgInfoTagPtr(); } +CEpgInfoTagPtr CEpg::GetTag(int uniqueID) const +{ + CEpgInfoTagPtr retval; + CSingleLock lock(m_critSection); + for (map::const_iterator it = m_tags.begin(); !retval && it != m_tags.end(); ++it) + if (it->second->UniqueBroadcastID() == uniqueID) + retval = it->second; + + return retval; +} + CEpgInfoTagPtr CEpg::GetTagBetween(const CDateTime &beginTime, const CDateTime &endTime) const { CSingleLock lock(m_critSection); - for (std::map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) + for (map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) { if (it->second->StartAsUTC() >= beginTime && it->second->EndAsUTC() <= endTime) return it->second; @@ -279,7 +287,7 @@ CEpgInfoTagPtr CEpg::GetTagAround(const CDateTime &time) const { CSingleLock lock(m_critSection); - for (std::map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) + for (map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) { if ((it->second->StartAsUTC() < time) && (it->second->EndAsUTC() > time)) return it->second; @@ -292,7 +300,7 @@ { CEpgInfoTagPtr newTag; CSingleLock lock(m_critSection); - std::map::iterator itr = m_tags.find(tag.StartAsUTC()); + map::iterator itr = m_tags.find(tag.StartAsUTC()); if (itr != m_tags.end()) newTag = itr->second; else @@ -313,7 +321,7 @@ { CEpgInfoTagPtr infoTag; CSingleLock lock(m_critSection); - std::map::iterator it = m_tags.find(tag.StartAsUTC()); + map::iterator it = m_tags.find(tag.StartAsUTC()); bool bNewTag(false); if (it != m_tags.end()) { @@ -373,27 +381,24 @@ { CSingleLock lock(m_critSection); #if EPG_DEBUGGING - CLog::Log(LOGDEBUG, "EPG - %s - %" PRIuS" entries in memory before merging", __FUNCTION__, m_tags.size()); + CLog::Log(LOGDEBUG, "EPG - %s - %zu entries in memory before merging", __FUNCTION__, m_tags.size()); #endif /* copy over tags */ - for (std::map::const_iterator it = epg.m_tags.begin(); it != epg.m_tags.end(); ++it) + for (map::const_iterator it = epg.m_tags.begin(); it != epg.m_tags.end(); ++it) UpdateEntry(*it->second, bStoreInDb, false); #if EPG_DEBUGGING - CLog::Log(LOGDEBUG, "EPG - %s - %" PRIuS" entries in memory after merging and before fixing", __FUNCTION__, m_tags.size()); + CLog::Log(LOGDEBUG, "EPG - %s - %zu entries in memory after merging and before fixing", __FUNCTION__, m_tags.size()); #endif FixOverlappingEvents(bStoreInDb); #if EPG_DEBUGGING - CLog::Log(LOGDEBUG, "EPG - %s - %" PRIuS" entries in memory after fixing", __FUNCTION__, m_tags.size()); + CLog::Log(LOGDEBUG, "EPG - %s - %zu entries in memory after fixing", __FUNCTION__, m_tags.size()); #endif /* update the last scan time of this table */ m_lastScanTime = CDateTime::GetCurrentDateTime().GetAsUTCDateTime(); m_bUpdateLastScanTime = true; - SetChanged(true); - lock.Leave(); - NotifyObservers(ObservableMessageEpg); return true; @@ -407,7 +412,7 @@ if (!m_lastScanTime.IsValid()) { - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_IGNOREDBFORCLIENT)) + if (!CSettings::Get().GetBool("epg.ignoredbforclient")) { CEpgDatabase *database = g_EpgContainer.GetDatabase(); CDateTime dtReturn; dtReturn.SetValid(false); @@ -418,8 +423,8 @@ if (!m_lastScanTime.IsValid()) { - m_lastScanTime.SetDateTime(1970, 1, 1, 0, 0, 0); - assert(m_lastScanTime.IsValid()); + m_lastScanTime.SetDateTime(0, 0, 0, 0, 0, 0); + m_lastScanTime.SetValid(true); } } lastScanTime = m_lastScanTime; @@ -486,7 +491,7 @@ CSingleLock lock(m_critSection); - for (std::map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) + for (map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) results.Add(CFileItemPtr(new CFileItem(it->second))); return results.Size() - iInitialSize; @@ -501,7 +506,7 @@ CSingleLock lock(m_critSection); - for (std::map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) + for (map::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) { if (filter.FilterEntry(*it->second)) results.Add(CFileItemPtr(new CFileItem(it->second))); @@ -512,7 +517,7 @@ bool CEpg::Persist(void) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_IGNOREDBFORCLIENT) || !NeedsSave()) + if (CSettings::Get().GetBool("epg.ignoredbforclient") || !NeedsSave()) return true; #if EPG_DEBUGGING @@ -586,7 +591,7 @@ bool bReturn(true); CEpgInfoTagPtr previousTag, currentTag; - for (std::map::iterator it = m_tags.begin(); it != m_tags.end(); it != m_tags.end() ? it++ : it) + for (map::iterator it = m_tags.begin(); it != m_tags.end(); it != m_tags.end() ? it++ : it) { if (!previousTag) { @@ -748,13 +753,13 @@ { CEpg tmpEpg(channel); if (tmpEpg.UpdateFromScraper(start, end)) - bReturn = UpdateEntries(tmpEpg, !CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_IGNOREDBFORCLIENT)); + bReturn = UpdateEntries(tmpEpg, !CSettings::Get().GetBool("epg.ignoredbforclient")); } else { CEpg tmpEpg(m_iEpgID, m_strName, m_strScraperName); if (tmpEpg.UpdateFromScraper(start, end)) - bReturn = UpdateEntries(tmpEpg, !CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_IGNOREDBFORCLIENT)); + bReturn = UpdateEntries(tmpEpg, !CSettings::Get().GetBool("epg.ignoredbforclient")); } return bReturn; @@ -763,7 +768,7 @@ CEpgInfoTagPtr CEpg::GetNextEvent(const CEpgInfoTag& tag) const { CSingleLock lock(m_critSection); - std::map::const_iterator it = m_tags.find(tag.StartAsUTC()); + map::const_iterator it = m_tags.find(tag.StartAsUTC()); if (it != m_tags.end() && ++it != m_tags.end()) return it->second; @@ -774,7 +779,7 @@ CEpgInfoTagPtr CEpg::GetPreviousEvent(const CEpgInfoTag& tag) const { CSingleLock lock(m_critSection); - std::map::const_iterator it = m_tags.find(tag.StartAsUTC()); + map::const_iterator it = m_tags.find(tag.StartAsUTC()); if (it != m_tags.end() && it != m_tags.begin()) { --it; @@ -820,7 +825,7 @@ channel->SetEpgID(m_iEpgID); } m_pvrChannel = channel; - for (std::map::iterator it = m_tags.begin(); it != m_tags.end(); ++it) + for (map::iterator it = m_tags.begin(); it != m_tags.end(); ++it) it->second->SetPVRChannel(m_pvrChannel); } } @@ -856,16 +861,3 @@ return m_pvrChannel != NULL; return true; } - -std::vector CEpg::GetAllEventsWithBroadcastId() const -{ - CSingleLock lock(m_critSection); - std::vector events; - events.reserve(m_tags.size()); - for (const auto &infoTag : m_tags) - { - if (infoTag.second->UniqueBroadcastID()) - events.push_back(infoTag.second); - } - return events; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/EpgDatabase.cpp kodi-15.2~git20151019.1039-final/xbmc/epg/EpgDatabase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/epg/EpgDatabase.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/EpgDatabase.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -79,8 +79,7 @@ "iSeriesId integer, " "iEpisodeId integer, " "iEpisodePart integer, " - "sEpisodeName varchar(128), " - "iFlags integer" + "sEpisodeName varchar(128)" ")" ); CLog::Log(LOGDEBUG, "EpgDB - %s - creating table 'lastepgscan'", __FUNCTION__); @@ -115,11 +114,6 @@ m_pDS->exec("ALTER TABLE epgtags ADD iYear integer;"); m_pDS->exec("ALTER TABLE epgtags ADD sIMDBNumber varchar(50);"); } - - if (iVersion < 11) - { - m_pDS->exec("ALTER TABLE epgtags ADD iFlags integer;"); - } } bool CEpgDatabase::DeleteEpg(void) @@ -233,10 +227,7 @@ CDateTime firstAired(iFirstAired); newTag->m_firstAired = firstAired; - int iBroadcastUID = m_pDS->fv("iBroadcastUid").get_asInt(); - // Compat: null value for broadcast uid changed from numerical -1 to 0 with PVR Addon API v4.0.0 - newTag->m_iUniqueBroadcastID = iBroadcastUID == -1 ? PVR_TIMER_NO_EPG_UID : iBroadcastUID; - + newTag->m_iUniqueBroadcastID = m_pDS->fv("iBroadcastUid").get_asInt(); newTag->m_iBroadcastId = m_pDS->fv("idBroadcast").get_asInt(); newTag->m_strTitle = m_pDS->fv("sTitle").get_asString().c_str(); newTag->m_strPlotOutline = m_pDS->fv("sPlotOutline").get_asString().c_str(); @@ -258,7 +249,6 @@ newTag->m_strEpisodeName = m_pDS->fv("sEpisodeName").get_asString().c_str(); newTag->m_iSeriesNumber = m_pDS->fv("iSeriesId").get_asInt(); newTag->m_strIconPath = m_pDS->fv("sIconPath").get_asString().c_str(); - newTag->m_iFlags = m_pDS->fv("iFlags").get_asInt(); epg.AddEntry(*newTag); ++iReturn; @@ -302,12 +292,13 @@ return bQueueWrite ? QueueInsertQuery(strQuery) : ExecuteQuery(strQuery); } -bool CEpgDatabase::Persist(const EPGMAP &epgs) +bool CEpgDatabase::Persist(const std::map &epgs) { - for (const auto &epgEntry : epgs) + for (std::map::const_iterator it = epgs.begin(); it != epgs.end(); ++it) { - if (epgEntry.second) - Persist(*epgEntry.second, true); + CEpg *epg = it->second; + if (epg) + Persist(*epg, true); } return CommitInsertQueries(); @@ -365,14 +356,14 @@ strQuery = PrepareSQL("REPLACE INTO epgtags (idEpg, iStartTime, " "iEndTime, sTitle, sPlotOutline, sPlot, sOriginalTitle, sCast, sDirector, sWriter, iYear, sIMDBNumber, " "sIconPath, iGenreType, iGenreSubType, sGenre, iFirstAired, iParentalRating, iStarRating, bNotify, iSeriesId, " - "iEpisodeId, iEpisodePart, sEpisodeName, iFlags, iBroadcastUid) " - "VALUES (%u, %u, %u, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %i, '%s', '%s', %i, %i, '%s', %u, %i, %i, %i, %i, %i, %i, '%s', %i, %i);", + "iEpisodeId, iEpisodePart, sEpisodeName, iBroadcastUid) " + "VALUES (%u, %u, %u, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %i, '%s', '%s', %i, %i, '%s', %u, %i, %i, %i, %i, %i, %i, '%s', %i);", tag.EpgID(), iStartTime, iEndTime, tag.Title(true).c_str(), tag.PlotOutline(true).c_str(), tag.Plot(true).c_str(), tag.OriginalTitle(true).c_str(), tag.Cast().c_str(), tag.Director().c_str(), tag.Writer().c_str(), tag.Year(), tag.IMDBNumber().c_str(), tag.Icon().c_str(), tag.GenreType(), tag.GenreSubType(), strGenre.c_str(), iFirstAired, tag.ParentalRating(), tag.StarRating(), tag.Notify(), - tag.SeriesNumber(), tag.EpisodeNumber(), tag.EpisodePart(), tag.EpisodeName().c_str(), tag.Flags(), + tag.SeriesNumber(), tag.EpisodeNumber(), tag.EpisodePart(), tag.EpisodeName().c_str(), tag.UniqueBroadcastID()); } else @@ -380,14 +371,14 @@ strQuery = PrepareSQL("REPLACE INTO epgtags (idEpg, iStartTime, " "iEndTime, sTitle, sPlotOutline, sPlot, sOriginalTitle, sCast, sDirector, sWriter, iYear, sIMDBNumber, " "sIconPath, iGenreType, iGenreSubType, sGenre, iFirstAired, iParentalRating, iStarRating, bNotify, iSeriesId, " - "iEpisodeId, iEpisodePart, sEpisodeName, iFlags, iBroadcastUid, idBroadcast) " - "VALUES (%u, %u, %u, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %i, '%s', '%s', %i, %i, '%s', %u, %i, %i, %i, %i, %i, %i, '%s', %i, %i, %i);", + "iEpisodeId, iEpisodePart, sEpisodeName, iBroadcastUid, idBroadcast) " + "VALUES (%u, %u, %u, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %i, '%s', '%s', %i, %i, '%s', %u, %i, %i, %i, %i, %i, %i, '%s', %i, %i);", tag.EpgID(), iStartTime, iEndTime, tag.Title(true).c_str(), tag.PlotOutline(true).c_str(), tag.Plot(true).c_str(), tag.OriginalTitle(true).c_str(), tag.Cast().c_str(), tag.Director().c_str(), tag.Writer().c_str(), tag.Year(), tag.IMDBNumber().c_str(), tag.Icon().c_str(), tag.GenreType(), tag.GenreSubType(), strGenre.c_str(), iFirstAired, tag.ParentalRating(), tag.StarRating(), tag.Notify(), - tag.SeriesNumber(), tag.EpisodeNumber(), tag.EpisodePart(), tag.EpisodeName().c_str(), tag.Flags(), + tag.SeriesNumber(), tag.EpisodeNumber(), tag.EpisodePart(), tag.EpisodeName().c_str(), tag.UniqueBroadcastID(), iBroadcastId); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/EpgDatabase.h kodi-15.2~git20151019.1039-final/xbmc/epg/EpgDatabase.h --- kodi-16.1~git20160425.1001-final/xbmc/epg/EpgDatabase.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/EpgDatabase.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,17 +20,13 @@ */ #include -#include #include "XBDateTime.h" #include "dbwrappers/Database.h" -#include "Epg.h" - namespace EPG { class CEpg; - typedef std::shared_ptr CEpgPtr; class CEpgInfoTag; class CEpgContainer; @@ -59,7 +55,7 @@ * @brief Get the minimal database version that is required to operate correctly. * @return The minimal database version. */ - virtual int GetSchemaVersion(void) const { return 11; }; + virtual int GetSchemaVersion(void) const { return 10; }; /*! * @brief Get the default sqlite database filename. @@ -126,7 +122,7 @@ */ virtual bool PersistLastEpgScanTime(int iEpgId = 0, bool bQueueWrite = false); - bool Persist(const EPGMAP &epgs); + bool Persist(const std::map &epgs); /*! * @brief Persist an EPG table. It's entries are not persisted. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/Epg.h kodi-15.2~git20151019.1039-final/xbmc/epg/Epg.h --- kodi-16.1~git20160425.1001-final/xbmc/epg/Epg.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/Epg.h 2015-10-19 08:39:16.000000000 +0000 @@ -27,8 +27,6 @@ #include "EpgInfoTag.h" #include "EpgSearchFilter.h" -#include - namespace PVR { class CPVRChannel; @@ -37,10 +35,6 @@ /** EPG container for CEpgInfoTag instances */ namespace EPG { - class CEpg; - typedef std::shared_ptr CEpgPtr; - typedef std::map EPGMAP; - class CEpg : public Observable { friend class CEpgDatabase; @@ -204,6 +198,16 @@ * @return The found tag or an empty tag if it wasn't found. */ CEpgInfoTagPtr GetTag(const CDateTime &beginTime) const; + /*! + * @brief Get the infotag with the given ID. + * + * Get the infotag with the given ID. + * If it wasn't found, try finding the event with the given start time + * + * @param uniqueID The unique ID of the event to find. + * @return The found tag or an empty tag if it wasn't found. + */ + CEpgInfoTagPtr GetTag(int uniqueID) const; /*! * @brief Update an entry in this EPG. @@ -299,13 +303,6 @@ * @return True when this EPG is valid and can be updated, false otherwise. */ bool IsValid(void) const; - - /*! - * @brief Get all events with a valid broadcast Id - * @return the table of events - */ - std::vector GetAllEventsWithBroadcastId() const; - protected: CEpg(void); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/EpgInfoTag.cpp kodi-15.2~git20151019.1039-final/xbmc/epg/EpgInfoTag.cpp --- kodi-16.1~git20160425.1001-final/xbmc/epg/EpgInfoTag.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/EpgInfoTag.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -51,10 +51,8 @@ m_iSeriesNumber(0), m_iEpisodeNumber(0), m_iEpisodePart(0), - m_iUniqueBroadcastID(0), - m_iYear(0), - m_epg(NULL), - m_iFlags(EPG_TAG_FLAG_UNDEFINED) + m_iUniqueBroadcastID(-1), + m_epg(NULL) { } @@ -68,11 +66,9 @@ m_iSeriesNumber(0), m_iEpisodeNumber(0), m_iEpisodePart(0), - m_iUniqueBroadcastID(0), - m_iYear(0), + m_iUniqueBroadcastID(-1), m_strIconPath(strIconPath), m_epg(epg), - m_iFlags(EPG_TAG_FLAG_UNDEFINED), m_pvrChannel(pvrChannel) { UpdatePath(); @@ -88,7 +84,7 @@ m_iSeriesNumber(0), m_iEpisodeNumber(0), m_iEpisodePart(0), - m_iUniqueBroadcastID(0), + m_iUniqueBroadcastID(-1), m_epg(NULL) { m_startTime = (data.startTime + g_advancedSettings.m_iPVRTimeCorrection); @@ -102,7 +98,6 @@ m_iEpisodePart = data.iEpisodePartNumber; m_iStarRating = data.iStarRating; m_iYear = data.iYear; - m_iFlags = data.iFlags; SetGenre(data.iGenreType, data.iGenreSubType, data.strGenreDescription); @@ -172,8 +167,7 @@ m_strIconPath == right.m_strIconPath && m_strFileNameAndPath == right.m_strFileNameAndPath && m_startTime == right.m_startTime && - m_endTime == right.m_endTime && - m_iFlags == right.m_iFlags); + m_endTime == right.m_endTime); } bool CEpgInfoTag::operator !=(const CEpgInfoTag& right) const @@ -202,7 +196,7 @@ value["filenameandpath"] = m_strFileNameAndPath; value["starttime"] = m_startTime.IsValid() ? m_startTime.GetAsDBDateTime() : StringUtils::Empty; value["endtime"] = m_endTime.IsValid() ? m_endTime.GetAsDBDateTime() : StringUtils::Empty; - value["runtime"] = GetDuration() / 60; + value["runtime"] = StringUtils::Format("%d", GetDuration() / 60); value["firstaired"] = m_firstAired.IsValid() ? m_firstAired.GetAsDBDate() : StringUtils::Empty; value["progress"] = Progress(); value["progresspercentage"] = ProgressPercentage(); @@ -210,12 +204,10 @@ value["episodenum"] = m_iEpisodeNumber; value["episodepart"] = m_iEpisodePart; value["hastimer"] = HasTimer(); - value["hastimerschedule"] = HasTimerSchedule(); value["hasrecording"] = HasRecording(); value["recording"] = recording ? recording->m_strFileNameAndPath : ""; value["isactive"] = IsActive(); value["wasactive"] = WasActive(); - value["isseries"] = IsSeries(); } CDateTime CEpgInfoTag::GetCurrentPlayingTime() const @@ -294,12 +286,12 @@ return GetTable()->GetPreviousEvent(*this); } -void CEpgInfoTag::SetUniqueBroadcastID(unsigned int iUniqueBroadcastID) +void CEpgInfoTag::SetUniqueBroadcastID(int iUniqueBroadcastID) { m_iUniqueBroadcastID = iUniqueBroadcastID; } -unsigned int CEpgInfoTag::UniqueBroadcastID(void) const +int CEpgInfoTag::UniqueBroadcastID(void) const { return m_iUniqueBroadcastID; } @@ -359,7 +351,7 @@ if (!bOverrideParental && bParentalLocked) strTitle = g_localizeStrings.Get(19266); // parental locked - else if (m_strTitle.empty() && !CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE)) + else if (m_strTitle.empty() && !CSettings::Get().GetBool("epg.hidenoinfoavailable")) strTitle = g_localizeStrings.Get(19055); // no information available else strTitle = m_strTitle; @@ -528,12 +520,6 @@ return m_timer != NULL; } -bool CEpgInfoTag::HasTimerSchedule(void) const -{ - CSingleLock lock(m_critSection); - return m_timer && (m_timer->GetTimerScheduleId() != PVR_TIMER_NO_PARENT); -} - CPVRTimerInfoTagPtr CEpgInfoTag::Timer(void) const { return m_timer; @@ -610,8 +596,7 @@ m_iUniqueBroadcastID != tag.m_iUniqueBroadcastID || EpgID() != tag.EpgID() || m_genre != tag.m_genre || - m_strIconPath != tag.m_strIconPath || - m_iFlags != tag.m_iFlags + m_strIconPath != tag.m_strIconPath ); if (bUpdateBroadcastId) bChanged |= (m_iBroadcastId != tag.m_iBroadcastId); @@ -635,7 +620,6 @@ m_iGenreType = tag.m_iGenreType; m_iGenreSubType = tag.m_iGenreSubType; m_epg = tag.m_epg; - m_iFlags = tag.m_iFlags; { CSingleLock lock(m_critSection); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/EpgInfoTag.h kodi-15.2~git20151019.1039-final/xbmc/epg/EpgInfoTag.h --- kodi-16.1~git20160425.1001-final/xbmc/epg/EpgInfoTag.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/EpgInfoTag.h 2015-10-19 08:39:16.000000000 +0000 @@ -30,7 +30,6 @@ #define EPG_DEBUGGING 0 -class CVariant; /** an EPG info tag */ namespace EPG { @@ -143,13 +142,13 @@ * @brief Change the unique broadcast ID of this event. * @param iUniqueBroadcastId The new unique broadcast ID. */ - void SetUniqueBroadcastID(unsigned int iUniqueBroadcastID); + void SetUniqueBroadcastID(int iUniqueBroadcastID); /*! * @brief Get the unique broadcast ID. * @return The unique broadcast ID. */ - unsigned int UniqueBroadcastID(void) const; + int UniqueBroadcastID(void) const; /*! * @brief Get the event's database ID. @@ -333,12 +332,6 @@ bool HasTimer(void) const; /*! - * @brief Check whether this event has an active timer schedule. - * @return True if it has an active timer schedule, false if not. - */ - bool HasTimerSchedule(void) const; - - /*! * @brief Get a pointer to the timer for event or NULL if there is none. * @return A pointer to the timer for event or NULL if there is none. */ @@ -403,11 +396,6 @@ */ bool Update(const CEpgInfoTag &tag, bool bUpdateBroadcastId = true); - /*! - * @brief status function to extract IsSeries boolean from EPG iFlags bitfield - */ - bool IsSeries() const { return (m_iFlags & EPG_TAG_FLAG_IS_SERIES) > 0; } - private: /*! @@ -427,11 +415,6 @@ */ CDateTime GetCurrentPlayingTime(void) const; - /*! - * @brief Return the m_iFlags as an unsigned int bitfield (for database use). - */ - unsigned int Flags() const { return m_iFlags; } - bool m_bNotify; /*!< notify on start */ int m_iBroadcastId; /*!< database ID */ @@ -442,7 +425,7 @@ int m_iSeriesNumber; /*!< series number */ int m_iEpisodeNumber; /*!< episode number */ int m_iEpisodePart; /*!< episode part number */ - unsigned int m_iUniqueBroadcastID; /*!< unique broadcast ID */ + int m_iUniqueBroadcastID; /*!< unique broadcast ID */ std::string m_strTitle; /*!< title */ std::string m_strPlotOutline; /*!< plot outline */ std::string m_strPlot; /*!< plot */ @@ -464,8 +447,6 @@ CEpg * m_epg; /*!< the schedule that this event belongs to */ - unsigned int m_iFlags; /*!< the flags applicable to this EPG entry */ - CCriticalSection m_critSection; PVR::CPVRChannelPtr m_pvrChannel; PVR::CPVRRecordingPtr m_recording; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/EpgSearchFilter.cpp kodi-15.2~git20151019.1039-final/xbmc/epg/EpgSearchFilter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/epg/EpgSearchFilter.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/EpgSearchFilter.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -53,7 +53,7 @@ m_iChannelGroup = EPG_SEARCH_UNSET; m_bIgnorePresentTimers = true; m_bIgnorePresentRecordings = true; - m_iUniqueBroadcastId = 0; + m_iUniqueBroadcastId = EPG_SEARCH_UNSET; } bool EpgSearchFilter::MatchGenre(const CEpgInfoTag &tag) const @@ -104,7 +104,7 @@ bool EpgSearchFilter::MatchBroadcastId(const CEpgInfoTag &tag) const { - if (m_iUniqueBroadcastId != 0) + if (m_iUniqueBroadcastId != EPG_SEARCH_UNSET) return (tag.UniqueBroadcastID() == m_iUniqueBroadcastId); return true; @@ -171,7 +171,7 @@ { CPVRChannelGroupPtr group = (m_iChannelGroup != EPG_SEARCH_UNSET) ? g_PVRChannelGroups->GetByIdFromAll(m_iChannelGroup) : g_PVRChannelGroups->GetGroupAllTV(); if (!group) - group = CPVRManager::GetInstance().ChannelGroups()->GetGroupAllTV(); + group = CPVRManager::Get().ChannelGroups()->GetGroupAllTV(); bReturn = (m_iChannelNumber == (int) group->GetChannelNumber(tag.ChannelTag())); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/EpgSearchFilter.h kodi-15.2~git20151019.1039-final/xbmc/epg/EpgSearchFilter.h --- kodi-16.1~git20160425.1001-final/xbmc/epg/EpgSearchFilter.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/EpgSearchFilter.h 2015-10-19 08:39:16.000000000 +0000 @@ -78,6 +78,6 @@ int m_iChannelGroup; /*!< The group this channel belongs to */ bool m_bIgnorePresentTimers; /*!< True to ignore currently present timers (future recordings), false if not */ bool m_bIgnorePresentRecordings; /*!< True to ignore currently active recordings, false if not */ - unsigned int m_iUniqueBroadcastId; /*!< The broadcastid to search for */ + int m_iUniqueBroadcastId; /*!< The broadcastid to search for */ }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/GUIEPGGridContainer.cpp kodi-15.2~git20151019.1039-final/xbmc/epg/GUIEPGGridContainer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/epg/GUIEPGGridContainer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/GUIEPGGridContainer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,10 +32,6 @@ #include "utils/StringUtils.h" #include "utils/Variant.h" #include "threads/SystemClock.h" -#include "guiinfo/GUIInfoLabels.h" - -#include "epg/Epg.h" -#include "pvr/channels/PVRChannel.h" #include "Epg.h" #include "GUIEPGGridContainer.h" @@ -198,7 +194,7 @@ if (!m_focusedChannelLayout || !m_channelLayout) return; - int chanOffset = MathUtils::round_int(m_channelScrollOffset / m_programmeLayout->Size(VERTICAL)); + int chanOffset = (int)floorf(m_channelScrollOffset / m_programmeLayout->Size(VERTICAL)); int cacheBeforeChannel, cacheAfterChannel; GetChannelCacheOffsets(cacheBeforeChannel, cacheAfterChannel); @@ -243,7 +239,7 @@ if (!m_focusedChannelLayout || !m_channelLayout) return; - int chanOffset = MathUtils::round_int(m_channelScrollOffset / m_programmeLayout->Size(VERTICAL)); + int chanOffset = (int)floorf(m_channelScrollOffset / m_programmeLayout->Size(VERTICAL)); /// Render channel names int cacheBeforeChannel, cacheAfterChannel; @@ -303,7 +299,7 @@ if (!m_rulerLayout || m_rulerItems.size()<=1 || (m_gridEnd - m_gridStart) == CDateTimeSpan(0, 0, 0, 0)) return; - int rulerOffset = MathUtils::round_int(m_programmeScrollOffset / m_blockSize); + int rulerOffset = (int)floorf(m_programmeScrollOffset / m_blockSize); CGUIListItemPtr item = m_rulerItems[0]; item->SetLabel(m_rulerItems[rulerOffset/m_rulerUnit+1]->GetLabel2()); CGUIListItem* lastitem = NULL; // dummy pointer needed to be passed as reference to ProcessItem() method @@ -350,7 +346,7 @@ if (!m_rulerLayout || m_rulerItems.size()<=1 || (m_gridEnd - m_gridStart) == CDateTimeSpan(0, 0, 0, 0)) return; - int rulerOffset = MathUtils::round_int(m_programmeScrollOffset / m_blockSize); + int rulerOffset = (int)floorf(m_programmeScrollOffset / m_blockSize); /// Render single ruler item with date of selected programme g_graphicsContext.SetClipRegion(m_posX, m_posY, m_width, m_height); @@ -398,8 +394,8 @@ if (!m_focusedProgrammeLayout || !m_programmeLayout || m_rulerItems.size()<=1 || (m_gridEnd - m_gridStart) == CDateTimeSpan(0, 0, 0, 0)) return; - int blockOffset = MathUtils::round_int(m_programmeScrollOffset / m_blockSize); - int chanOffset = MathUtils::round_int(m_channelScrollOffset / m_programmeLayout->Size(VERTICAL)); + int blockOffset = (int)floorf(m_programmeScrollOffset / m_blockSize); + int chanOffset = (int)floorf(m_channelScrollOffset / m_programmeLayout->Size(VERTICAL)); int cacheBeforeProgramme, cacheAfterProgramme; GetProgrammeCacheOffsets(cacheBeforeProgramme, cacheAfterProgramme); @@ -468,7 +464,7 @@ // increment our X position posA2 += m_gridIndex[channel][block].width; // assumes focused & unfocused layouts have equal length - block += MathUtils::round_int(m_gridIndex[channel][block].originWidth / m_blockSize); + block += (int)(m_gridIndex[channel][block].originWidth / m_blockSize); } // increment our Y position @@ -482,8 +478,8 @@ if (!m_focusedProgrammeLayout || !m_programmeLayout || m_rulerItems.size()<=1 || (m_gridEnd - m_gridStart) == CDateTimeSpan(0, 0, 0, 0)) return; - int blockOffset = MathUtils::round_int(m_programmeScrollOffset / m_blockSize); - int chanOffset = MathUtils::round_int(m_channelScrollOffset / m_programmeLayout->Size(VERTICAL)); + int blockOffset = (int)floorf(m_programmeScrollOffset / m_blockSize); + int chanOffset = (int)floorf(m_channelScrollOffset / m_programmeLayout->Size(VERTICAL)); /// Render programmes int cacheBeforeProgramme, cacheAfterProgramme; @@ -554,7 +550,7 @@ // increment our X position posA2 += m_gridIndex[channel][block].width; // assumes focused & unfocused layouts have equal length - block += MathUtils::round_int(m_gridIndex[channel][block].originWidth / m_blockSize); + block += (int)(m_gridIndex[channel][block].originWidth / m_blockSize); } // increment our Y position @@ -573,20 +569,18 @@ { CPoint originRuler = CPoint(m_rulerPosX, m_rulerPosY) + m_renderOffset; float width = ((CDateTime::GetUTCDateTime() - m_gridStart).GetSecondsTotal() * m_blockSize) / (MINSPERBLOCK * 60) - m_programmeScrollOffset; - float height = std::min(m_channels, m_channelsPerPage) * m_channelHeight + m_rulerHeight; if (width > 0) { m_guiProgressIndicatorTexture.SetVisible(true); m_guiProgressIndicatorTexture.SetPosition(originRuler.x, originRuler.y); m_guiProgressIndicatorTexture.SetWidth(width); - m_guiProgressIndicatorTexture.SetHeight(height); } else { m_guiProgressIndicatorTexture.SetVisible(false); } - + m_guiProgressIndicatorTexture.Process(currentTime); } @@ -594,7 +588,6 @@ { if (g_graphicsContext.SetClipRegion(m_rulerPosX, m_rulerPosY, m_gridWidth, m_height)) { - m_guiProgressIndicatorTexture.SetDiffuseColor(m_diffuseColor); m_guiProgressIndicatorTexture.Render(); g_graphicsContext.RestoreClipRegion(); } @@ -683,14 +676,6 @@ g_graphicsContext.RestoreOrigin(); } -void CGUIEPGGridContainer::ResetCoordinates() -{ - m_channelCursor = 0; - m_channelOffset = 0; - m_blockCursor = 0; - m_blockOffset = 0; -} - bool CGUIEPGGridContainer::OnAction(const CAction &action) { switch (action.GetID()) @@ -816,8 +801,132 @@ return true; case GUI_MSG_LABEL_BIND: - UpdateItems(static_cast(message.GetPointer())); - return true; + if (message.GetPointer()) + { + CSingleLock lock(m_critSection); + + /* Safe currently selected epg tag. Selection shall be restored after update. */ + const CEpgInfoTagPtr prevSelectedEpgTag(GetSelectedEpgInfoTag()); + + Reset(); + + CFileItemList *items = (CFileItemList *)message.GetPointer(); + + /* Create programme items */ + m_programmeItems.reserve(items->Size()); + for (int i = 0; i < items->Size(); i++) + { + CFileItemPtr fileItem = items->Get(i); + if (fileItem->HasEPGInfoTag() && fileItem->GetEPGInfoTag()->HasPVRChannel()) + m_programmeItems.push_back(fileItem); + } + + /* Create Channel items */ + int iLastChannelID = -1; + ItemsPtr itemsPointer; + itemsPointer.start = 0; + for (unsigned int i = 0; i < m_programmeItems.size(); ++i) + { + const CEpgInfoTagPtr tag(((CFileItem*)m_programmeItems[i].get())->GetEPGInfoTag()); + if (!tag) + continue; + + CPVRChannelPtr channel = tag->ChannelTag(); + if (!channel) + continue; + int iCurrentChannelID = channel->ChannelID(); + if (iCurrentChannelID != iLastChannelID) + { + if (i > 0) + { + itemsPointer.stop = i-1; + m_epgItemsPtr.push_back(itemsPointer); + itemsPointer.start = i; + } + iLastChannelID = iCurrentChannelID; + CGUIListItemPtr item(new CFileItem(channel)); + m_channelItems.push_back(item); + } + } + if (!m_programmeItems.empty()) + { + itemsPointer.stop = m_programmeItems.size()-1; + m_epgItemsPtr.push_back(itemsPointer); + } + + m_gridIndex.reserve(m_channelItems.size()); + for (unsigned int i = 0; i < m_channelItems.size(); i++) + { + std::vector blocks(MAXBLOCKS); + m_gridIndex.push_back(blocks); + } + + FreeItemsMemory(); + UpdateLayout(); + + /* Create Ruler items */ + CDateTime ruler; ruler.SetFromUTCDateTime(m_gridStart); + CDateTime rulerEnd; rulerEnd.SetFromUTCDateTime(m_gridEnd); + CDateTimeSpan unit(0, 0, m_rulerUnit * MINSPERBLOCK, 0); + CGUIListItemPtr rulerItem(new CFileItem(ruler.GetAsLocalizedDate(true, true))); + rulerItem->SetProperty("DateLabel", true); + m_rulerItems.push_back(rulerItem); + + for (; ruler < rulerEnd; ruler += unit) + { + CGUIListItemPtr rulerItem(new CFileItem(ruler.GetAsLocalizedTime("", false))); + rulerItem->SetLabel2(ruler.GetAsLocalizedDate(true, true)); + m_rulerItems.push_back(rulerItem); + } + + UpdateItems(); + + m_channels = m_epgItemsPtr.size(); + + if (prevSelectedEpgTag) + { + // Grid index got recreated. Do cursors and offsets still point to the same epg tag? + if (prevSelectedEpgTag == GetSelectedEpgInfoTag()) + return true; + + int newChannelCursor = GetChannel(prevSelectedEpgTag); + if (newChannelCursor >= 0) + { + int newBlockCursor = GetBlock(prevSelectedEpgTag, newChannelCursor); + if (newBlockCursor >= 0) + { + if (newChannelCursor == m_channelCursor && newBlockCursor == m_blockCursor) + return true; + + if (newBlockCursor > 0 && newBlockCursor != m_blockCursor) + { + SetInvalid(); + SetSelectedBlock(newBlockCursor); + } + + if (newChannelCursor != m_channelCursor) + { + SetInvalid(); + SetSelectedChannel(newChannelCursor); + } + + if (newBlockCursor > 0) + return true; + } + } + } + + // Fallback. Goto now. + m_item = GetItem(m_channelCursor); + if (m_item) + SetBlock(GetBlock(m_item->item, m_channelCursor)); + + SetInvalid(); + GoToNow(); + + return true; + } + break; case GUI_MSG_REFRESH_LIST: // update our list contents @@ -834,91 +943,15 @@ return CGUIControl::OnMessage(message); } -void CGUIEPGGridContainer::UpdateItems(CFileItemList *items) +void CGUIEPGGridContainer::UpdateItems() { - if (!items) - return; - - CSingleLock lock(m_critSection); - - /* Safe currently selected epg tag. Selection shall be restored after update. */ - const CEpgInfoTagPtr prevSelectedEpgTag(GetSelectedEpgInfoTag()); - - Reset(); - - /* Create programme items */ - m_programmeItems.reserve(items->Size()); - for (int i = 0; i < items->Size(); i++) - { - CFileItemPtr fileItem = items->Get(i); - if (fileItem->HasEPGInfoTag() && fileItem->GetEPGInfoTag()->HasPVRChannel()) - m_programmeItems.push_back(fileItem); - } - - /* Create Channel items */ - int iLastChannelID = -1; - ItemsPtr itemsPointer; - itemsPointer.start = 0; - for (unsigned int i = 0; i < m_programmeItems.size(); ++i) - { - const CEpgInfoTagPtr tag(m_programmeItems[i]->GetEPGInfoTag()); - if (!tag) - continue; - - CPVRChannelPtr channel = tag->ChannelTag(); - if (!channel) - continue; - int iCurrentChannelID = channel->ChannelID(); - if (iCurrentChannelID != iLastChannelID) - { - if (i > 0) - { - itemsPointer.stop = i-1; - m_epgItemsPtr.push_back(itemsPointer); - itemsPointer.start = i; - } - iLastChannelID = iCurrentChannelID; - CFileItemPtr item(new CFileItem(channel)); - m_channelItems.push_back(item); - } - } - if (!m_programmeItems.empty()) - { - itemsPointer.stop = m_programmeItems.size()-1; - m_epgItemsPtr.push_back(itemsPointer); - } - - m_gridIndex.reserve(m_channelItems.size()); - for (unsigned int i = 0; i < m_channelItems.size(); i++) - { - std::vector blocks(MAXBLOCKS); - m_gridIndex.push_back(blocks); - } - - FreeItemsMemory(); - UpdateLayout(); - /* check for invalid start and end time */ if (m_gridStart >= m_gridEnd) { - // default to start "now minus 30 minutes" and end "start plus one page". - m_gridStart = CDateTime::GetCurrentDateTime().GetAsUTCDateTime() - CDateTimeSpan(0, 0, 30, 0); - m_gridEnd = m_gridStart + CDateTimeSpan(0, 0, m_blocksPerPage * MINSPERBLOCK, 0); - } - - /* Create Ruler items */ - CDateTime ruler; ruler.SetFromUTCDateTime(m_gridStart); - CDateTime rulerEnd; rulerEnd.SetFromUTCDateTime(m_gridEnd); - CDateTimeSpan unit(0, 0, m_rulerUnit * MINSPERBLOCK, 0); - CFileItemPtr rulerItem(new CFileItem(ruler.GetAsLocalizedDate(true))); - rulerItem->SetProperty("DateLabel", true); - m_rulerItems.push_back(rulerItem); - - for (; ruler < rulerEnd; ruler += unit) - { - CFileItemPtr rulerItem(new CFileItem(ruler.GetAsLocalizedTime("", false))); - rulerItem->SetLabel2(ruler.GetAsLocalizedDate(true)); - m_rulerItems.push_back(rulerItem); + CLog::Log(LOGERROR, "CGUIEPGGridContainer - %s - invalid start and end time set", __FUNCTION__); + CGUIMessage msg(GUI_MSG_LABEL_RESET, GetID(), GetParentID()); // message the window + SendWindowMessage(msg); + return; } CDateTimeSpan gridDuration = m_gridEnd - m_gridStart; @@ -926,6 +959,15 @@ if (m_blocks >= MAXBLOCKS) m_blocks = MAXBLOCKS; + /* if less than one page, can't display grid */ + if (m_blocks < m_blocksPerPage) + { + CLog::Log(LOGERROR, "CGUIEPGGridContainer - %s - Less than one page of data available.", __FUNCTION__); + CGUIMessage msg(GUI_MSG_LABEL_RESET, GetID(), GetParentID()); // message the window + SendWindowMessage(msg); + return; + } + CDateTimeSpan blockDuration; blockDuration.SetDateTimeSpan(0, 0, MINSPERBLOCK, 0); @@ -936,7 +978,7 @@ CDateTime gridCursor = m_gridStart; //reset cursor for new channel unsigned long progIdx = m_epgItemsPtr[row].start; unsigned long lastIdx = m_epgItemsPtr[row].stop; - const CEpgInfoTagPtr info = m_programmeItems[progIdx]->GetEPGInfoTag(); + const CEpgInfoTagPtr info = ((CFileItem *)m_programmeItems[progIdx].get())->GetEPGInfoTag(); int iEpgId = info ? info->EpgID() : -1; /** FOR EACH BLOCK **********************************************************************/ @@ -945,8 +987,8 @@ { while (progIdx <= lastIdx) { - CFileItemPtr item = m_programmeItems[progIdx]; - const CEpgInfoTagPtr tag(item->GetEPGInfoTag()); + CGUIListItemPtr item = m_programmeItems[progIdx]; + const CEpgInfoTagPtr tag(((CFileItem *)item.get())->GetEPGInfoTag()); if (!tag) { progIdx++; @@ -961,7 +1003,7 @@ m_gridIndex[row][block].item = item; break; } - + progIdx++; } @@ -974,14 +1016,13 @@ for (int block = 0; block < m_blocks; block++) { - CFileItemPtr item = m_gridIndex[row][block].item; + CGUIListItemPtr item = m_gridIndex[row][block].item; - if ((item != m_gridIndex[row][block+1].item) || (!item && block == m_blocks - 1)) + if (item != m_gridIndex[row][block+1].item) { if (!item) { CEpgInfoTagPtr gapTag(CEpgInfoTag::CreateDefaultTag()); - gapTag->SetPVRChannel(m_channelItems[row]->GetPVRChannelInfoTag()); CFileItemPtr gapItem(new CFileItem(gapTag)); for (int i = block ; i > block - itemSize; i--) { @@ -990,7 +1031,7 @@ } else { - const CEpgInfoTagPtr tag(item->GetEPGInfoTag()); + const CEpgInfoTagPtr tag(((CFileItem *)item.get())->GetEPGInfoTag()); if (tag) m_gridIndex[row][savedBlock].item->SetProperty("GenreType", tag->GenreType()); } @@ -1014,67 +1055,6 @@ /******************************************* END ******************************************/ CLog::Log(LOGDEBUG, "CGUIEPGGridContainer - %s completed successfully in %u ms", __FUNCTION__, (unsigned int)(XbmcThreads::SystemClockMillis()-tick)); - - m_channels = m_epgItemsPtr.size(); - - if (prevSelectedEpgTag) - { - // Grid index got recreated. Do cursors and offsets still point to the same epg tag? - if (prevSelectedEpgTag == GetSelectedEpgInfoTag()) - { - m_item = GetItem(m_channelCursor); - return; - } - - int newChannelCursor = GetChannel(prevSelectedEpgTag); - if (newChannelCursor >= 0) - { - int newBlockCursor = GetBlock(prevSelectedEpgTag, newChannelCursor); - if (newBlockCursor >= 0) - { - if (newChannelCursor == m_channelCursor && newBlockCursor == m_blockCursor) - { - m_item = GetItem(m_channelCursor); - return; - } - - if (newBlockCursor > 0 && newBlockCursor != m_blockCursor) - { - SetInvalid(); - SetSelectedBlock(newBlockCursor); - } - - if (newChannelCursor != m_channelCursor) - { - SetInvalid(); - SetSelectedChannel(newChannelCursor); - } - - if (newBlockCursor > 0) - { - // Note: m_item guaranteed to be set here. - return; - } - } - } - } - - // Fallback. Goto now. - - if (m_channelCursor + m_channelOffset < 0 || - m_channelCursor + m_channelOffset >= m_channels) - m_channelCursor = m_channelOffset = 0; - - if (m_blockCursor + m_blockOffset < 0 || - m_blockCursor + m_blockOffset >= m_blocks) - m_blockCursor = m_blockOffset = 0; - - m_item = GetItem(m_channelCursor); - if (m_item) - SetBlock(GetBlock(m_item->item, m_channelCursor)); - - SetInvalid(); - GoToNow(); } void CGUIEPGGridContainer::ChannelScroll(int amount) @@ -1100,7 +1080,7 @@ void CGUIEPGGridContainer::OnUp() { - CGUIAction action = GetAction(ACTION_MOVE_UP); + CGUIAction action = GetNavigateAction(ACTION_MOVE_UP); if (m_channelCursor > 0) { SetChannel(m_channelCursor - 1); @@ -1126,7 +1106,7 @@ void CGUIEPGGridContainer::OnDown() { - CGUIAction action = GetAction(ACTION_MOVE_DOWN); + CGUIAction action = GetNavigateAction(ACTION_MOVE_DOWN); if (m_channelOffset + m_channelCursor + 1 < m_channels) { if (m_channelCursor + 1 < m_channelsPerPage) @@ -1285,8 +1265,8 @@ if (!m_focusedProgrammeLayout || !m_programmeLayout || (justGrid && point.x < 0)) return false; - int channel = MathUtils::round_int(point.y / m_channelHeight); - int block = MathUtils::round_int(point.x / m_blockSize); + int channel = (int)(point.y / m_channelHeight); + int block = (int)(point.x / m_blockSize); if (channel > m_channelsPerPage) channel = m_channelsPerPage - 1; if (channel >= m_channels) channel = m_channels - 1; @@ -1421,11 +1401,11 @@ { if (iIndex >= 0 && (size_t) iIndex < m_channelItems.size()) { - CFileItemPtr fileItem = m_channelItems[iIndex]; + CFileItemPtr fileItem = std::static_pointer_cast(m_channelItems[iIndex]); if (fileItem->HasPVRChannelInfoTag()) return fileItem->GetPVRChannelInfoTag(); } - + return CPVRChannelPtr(); } @@ -1506,19 +1486,6 @@ return m_channelCursor + m_channelOffset; } -CFileItemPtr CGUIEPGGridContainer::GetSelectedChannelItem() const -{ - CFileItemPtr item; - - if (!m_gridIndex.empty() && - !m_epgItemsPtr.empty() && - m_channelCursor + m_channelOffset < m_channels && - m_blockCursor + m_blockOffset < m_blocks) - item = m_gridIndex[m_channelCursor + m_channelOffset][m_blockCursor + m_blockOffset].item; - - return item; -} - CEpgInfoTagPtr CGUIEPGGridContainer::GetSelectedEpgInfoTag() const { CEpgInfoTagPtr tag; @@ -1528,9 +1495,9 @@ m_channelCursor + m_channelOffset < m_channels && m_blockCursor + m_blockOffset < m_blocks) { - CFileItemPtr currentItem(m_gridIndex[m_channelCursor + m_channelOffset][m_blockCursor + m_blockOffset].item); + CGUIListItemPtr currentItem(m_gridIndex[m_channelCursor + m_channelOffset][m_blockCursor + m_blockOffset].item); if (currentItem) - tag = currentItem->GetEPGInfoTag(); + tag = static_cast(currentItem.get())->GetEPGInfoTag(); } return tag; @@ -1540,10 +1507,10 @@ { for (int block = 0; block < m_blocks; ++block) { - CFileItemPtr item = m_gridIndex[channel + m_channelOffset][block].item; + CGUIListItemPtr item = m_gridIndex[channel + m_channelOffset][block].item; if (item) { - CEpgInfoTagPtr currentTag(item->GetEPGInfoTag()); + CEpgInfoTagPtr currentTag(static_cast(item.get())->GetEPGInfoTag()); if (currentTag == tag) return (block - m_blockOffset >= 0) ? block - m_blockOffset : 0; } @@ -1561,10 +1528,10 @@ { for (int block = 0; block < m_blocks; ++block) { - CFileItemPtr item = m_gridIndex[row][block].item; + CGUIListItemPtr item = m_gridIndex[row][block].item; if (item) { - CEpgInfoTagPtr currentTag(item->GetEPGInfoTag()); + CEpgInfoTagPtr currentTag(static_cast(item.get())->GetEPGInfoTag()); if (currentTag->HasPVRChannel()) // Take care. Gap tags have no channel. { if (currentTag->ChannelTag()->ChannelID() == channelId) @@ -1587,7 +1554,7 @@ int item = m_channelCursor + m_channelOffset + offset; if (flag & INFOFLAG_LISTITEM_POSITION) - item = MathUtils::round_int(m_channelScrollOffset / m_channelLayout->Size(VERTICAL)); + item = (int)(m_channelScrollOffset / m_channelLayout->Size(VERTICAL)); if (flag & INFOFLAG_LISTITEM_WRAP) { @@ -1663,9 +1630,9 @@ int CGUIEPGGridContainer::GetItemSize(GridItemsPtr *item) { if (!item) - return MathUtils::round_int(m_blockSize); /// stops it crashing + return (int) m_blockSize; /// stops it crashing - return MathUtils::round_int(item->width / m_blockSize); + return (int) (item->width / m_blockSize); } int CGUIEPGGridContainer::GetBlock(const CGUIListItemPtr &item, const int &channel) @@ -1912,8 +1879,6 @@ m_lastItem = NULL; m_lastChannel = NULL; - - m_channels = 0; } void CGUIEPGGridContainer::GoToBegin() @@ -1931,7 +1896,7 @@ { if (!blocksEnd && m_gridIndex[m_channelCursor + m_channelOffset][blockIndex].item != NULL) blocksEnd = blockIndex; - if (blocksEnd && m_gridIndex[m_channelCursor + m_channelOffset][blocksEnd].item != + if (blocksEnd && m_gridIndex[m_channelCursor + m_channelOffset][blocksEnd].item != m_gridIndex[m_channelCursor + m_channelOffset][blockIndex].item) blocksStart = blockIndex + 1; } @@ -1946,36 +1911,9 @@ void CGUIEPGGridContainer::GoToNow() { - if (!m_gridStart.IsValid()) - return; - CDateTime currentDate = CDateTime::GetCurrentDateTime().GetAsUTCDateTime(); int offset = ((currentDate - m_gridStart).GetSecondsTotal() / 60 - 30) / MINSPERBLOCK; ScrollToBlockOffset(offset); - - if (m_channelCursor + m_channelOffset >= 0 && - m_channelCursor + m_channelOffset < m_channels) - { - // make sure offset is in valid range - offset = std::max(0, std::min(offset, m_blocks - m_blocksPerPage)); - - for (int blockIndex = 0; blockIndex < m_blocksPerPage; blockIndex++) - { - if (offset + blockIndex >= m_blocks) - break; - - const CFileItemPtr item = m_gridIndex[m_channelCursor + m_channelOffset][offset + blockIndex].item; - if (item) - { - const CEpgInfoTagPtr tag = item->GetEPGInfoTag(); - if (tag && tag->StartAsUTC() <= currentDate && tag->EndAsUTC() > currentDate) - { - SetBlock(blockIndex); // Select currently active epg element - break; - } - } - } - } } void CGUIEPGGridContainer::SetStartEnd(CDateTime start, CDateTime end) @@ -2017,8 +1955,8 @@ m_channelPosY = m_posY + m_rulerHeight; m_rulerPosX = m_posX + m_channelWidth; m_rulerPosY = m_posY; - m_channelsPerPage = MathUtils::round_int(m_gridHeight / m_channelHeight); - m_programmesPerPage = MathUtils::round_int(m_gridWidth / m_blockSize) + 1; + m_channelsPerPage = (int)(m_gridHeight / m_channelHeight); + m_programmesPerPage = (int)(m_gridWidth / m_blockSize) + 1; // ensure that the scroll offsets are a multiple of our sizes m_channelScrollOffset = m_channelOffset * m_programmeLayout->Size(VERTICAL); @@ -2119,11 +2057,11 @@ void CGUIEPGGridContainer::FreeItemsMemory() { // free memory of items - for (std::vector::iterator it = m_channelItems.begin(); it != m_channelItems.end(); ++it) + for (std::vector::iterator it = m_channelItems.begin(); it != m_channelItems.end(); ++it) (*it)->FreeMemory(); - for (std::vector::iterator it = m_rulerItems.begin(); it != m_rulerItems.end(); ++it) + for (std::vector::iterator it = m_rulerItems.begin(); it != m_rulerItems.end(); ++it) (*it)->FreeMemory(); - for (std::vector::iterator it = m_programmeItems.begin(); it != m_programmeItems.end(); ++it) + for (std::vector::iterator it = m_programmeItems.begin(); it != m_programmeItems.end(); ++it) (*it)->FreeMemory(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/epg/GUIEPGGridContainer.h kodi-15.2~git20151019.1039-final/xbmc/epg/GUIEPGGridContainer.h --- kodi-16.1~git20160425.1001-final/xbmc/epg/GUIEPGGridContainer.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/epg/GUIEPGGridContainer.h 2015-10-19 08:39:16.000000000 +0000 @@ -32,7 +32,7 @@ struct GridItemsPtr { - CFileItemPtr item; + CGUIListItemPtr item; float originWidth; float originHeight; float width; @@ -67,7 +67,6 @@ virtual int GetSelectedItem() const; const int GetSelectedChannel() const; void SetSelectedChannel(int channelIndex); - CFileItemPtr GetSelectedChannelItem() const; PVR::CPVRChannelPtr GetChannel(int iIndex); void SetSelectedBlock(int blockIndex); virtual EVENT_RESULT OnMouseEvent(const CPoint &point, const CMouseEvent &event); @@ -94,7 +93,6 @@ void SetStartEnd(CDateTime start, CDateTime end); void SetChannel(const PVR::CPVRChannelPtr &channel); void SetChannel(const std::string &channel); - void ResetCoordinates(); protected: bool OnClick(int actionID); @@ -145,9 +143,9 @@ long stop; }; std::vector m_epgItemsPtr; - std::vector m_channelItems; - std::vector m_rulerItems; - std::vector m_programmeItems; + std::vector m_channelItems; + std::vector m_rulerItems; + std::vector m_programmeItems; std::vector m_channelLayouts; std::vector m_focusedChannelLayouts; std::vector m_focusedProgrammeLayouts; @@ -174,7 +172,7 @@ void GetProgrammeCacheOffsets(int &cacheBefore, int &cacheAfter); private: - void UpdateItems(CFileItemList *items); + void UpdateItems(); EPG::CEpgInfoTagPtr GetSelectedEpgInfoTag() const; int GetBlock(const EPG::CEpgInfoTagPtr &tag, int channel) const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/AddonEvent.cpp kodi-15.2~git20151019.1039-final/xbmc/events/AddonEvent.cpp --- kodi-16.1~git20160425.1001-final/xbmc/events/AddonEvent.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/AddonEvent.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "AddonEvent.h" - -CAddonEvent::CAddonEvent(ADDON::AddonPtr addon, const CVariant& description) - : CUniqueEvent(addon->Name(), description, addon->Icon()), - m_addon(addon) -{ } - -CAddonEvent::CAddonEvent(ADDON::AddonPtr addon, const CVariant& description, const CVariant& details) - : CUniqueEvent(addon->Name(), description, addon->Icon(), details), - m_addon(addon) -{ } - -CAddonEvent::CAddonEvent(ADDON::AddonPtr addon, const CVariant& description, const CVariant& details, const CVariant& executionLabel) - : CUniqueEvent(addon->Name(), description, addon->Icon(), details, executionLabel), - m_addon(addon) -{ } - -CAddonEvent::CAddonEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description) - : CUniqueEvent(addon->Name(), description, addon->Icon(), level), - m_addon(addon) -{ } - -CAddonEvent::CAddonEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description, const CVariant& details) - : CUniqueEvent(addon->Name(), description, addon->Icon(), details, level), - m_addon(addon) -{ } - -CAddonEvent::CAddonEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description, const CVariant& details, const CVariant& executionLabel) - : CUniqueEvent(addon->Name(), description, addon->Icon(), details, executionLabel, level), - m_addon(addon) -{ } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/AddonEvent.h kodi-15.2~git20151019.1039-final/xbmc/events/AddonEvent.h --- kodi-16.1~git20160425.1001-final/xbmc/events/AddonEvent.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/AddonEvent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "events/UniqueEvent.h" -#include "addons/IAddon.h" - -class CAddonEvent : public CUniqueEvent -{ -public: - CAddonEvent(ADDON::AddonPtr addon, const CVariant& description); - CAddonEvent(ADDON::AddonPtr addon, const CVariant& description, const CVariant& details); - CAddonEvent(ADDON::AddonPtr addon, const CVariant& description, const CVariant& details, const CVariant& executionLabel); - CAddonEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description); - CAddonEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description, const CVariant& details); - CAddonEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description, const CVariant& details, const CVariant& executionLabel); - virtual ~CAddonEvent() { } - - virtual const char* GetType() const { return "AddonEvent"; } - -protected: - ADDON::AddonPtr m_addon; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/AddonManagementEvent.cpp kodi-15.2~git20151019.1039-final/xbmc/events/AddonManagementEvent.cpp --- kodi-16.1~git20160425.1001-final/xbmc/events/AddonManagementEvent.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/AddonManagementEvent.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "AddonManagementEvent.h" -#include "addons/GUIDialogAddonInfo.h" -#include "filesystem/AddonsDirectory.h" -#include "guilib/LocalizeStrings.h" -#include "utils/URIUtils.h" - -CAddonManagementEvent::CAddonManagementEvent(ADDON::AddonPtr addon, const CVariant& description) - : CAddonEvent(addon, description) -{ } - -CAddonManagementEvent::CAddonManagementEvent(ADDON::AddonPtr addon, const CVariant& description, const CVariant& details) - : CAddonEvent(addon, description, details) -{ } - -CAddonManagementEvent::CAddonManagementEvent(ADDON::AddonPtr addon, const CVariant& description, const CVariant& details, const CVariant& executionLabel) - : CAddonEvent(addon, description, details, executionLabel) -{ } - -CAddonManagementEvent::CAddonManagementEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description) - : CAddonEvent(addon, level, description) -{ } - -CAddonManagementEvent::CAddonManagementEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description, const CVariant& details) - : CAddonEvent(addon, level, description, details) -{ } - -CAddonManagementEvent::CAddonManagementEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description, const CVariant& details, const CVariant& executionLabel) - : CAddonEvent(addon, level, description, details, executionLabel) -{ } - -std::string CAddonManagementEvent::GetExecutionLabel() const -{ - std::string executionLabel = CAddonEvent::GetExecutionLabel(); - if (!executionLabel.empty()) - return executionLabel; - - return g_localizeStrings.Get(24139); -} - -bool CAddonManagementEvent::Execute() const -{ - if (!CanExecute()) - return false; - - CFileItemPtr addonItem = XFILE::CAddonsDirectory::FileItemFromAddon(m_addon, URIUtils::AddFileToFolder("addons://", m_addon->ID())); - if (addonItem == nullptr) - return false; - - return CGUIDialogAddonInfo::ShowForItem(addonItem); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/AddonManagementEvent.h kodi-15.2~git20151019.1039-final/xbmc/events/AddonManagementEvent.h --- kodi-16.1~git20160425.1001-final/xbmc/events/AddonManagementEvent.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/AddonManagementEvent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "events/AddonEvent.h" - -class CAddonManagementEvent : public CAddonEvent -{ -public: - CAddonManagementEvent(ADDON::AddonPtr addon, const CVariant& description); - CAddonManagementEvent(ADDON::AddonPtr addon, const CVariant& description, const CVariant& details); - CAddonManagementEvent(ADDON::AddonPtr addon, const CVariant& description, const CVariant& details, const CVariant& executionLabel); - CAddonManagementEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description); - CAddonManagementEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description, const CVariant& details); - CAddonManagementEvent(ADDON::AddonPtr addon, EventLevel level, const CVariant& description, const CVariant& details, const CVariant& executionLabel); - virtual ~CAddonManagementEvent() { } - - virtual const char* GetType() const { return "AddonManagementEvent"; } - virtual std::string GetExecutionLabel() const; - - virtual bool CanExecute() const { return m_addon != NULL; } - virtual bool Execute() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/BaseEvent.cpp kodi-15.2~git20151019.1039-final/xbmc/events/BaseEvent.cpp --- kodi-16.1~git20160425.1001-final/xbmc/events/BaseEvent.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/BaseEvent.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "BaseEvent.h" -#include "guilib/LocalizeStrings.h" - -CBaseEvent::CBaseEvent(const std::string& identifier, const CVariant& label, const CVariant& description, EventLevel level /* = EventLevelInformation */) - : m_level(level), - m_identifier(identifier), - m_icon(), - m_label(label), - m_description(description), - m_details(), - m_executionLabel(), - m_dateTime(CDateTime::GetCurrentDateTime()) -{ } - -CBaseEvent::CBaseEvent(const std::string& identifier, const CVariant& label, const CVariant& description, const std::string& icon, EventLevel level /* = EventLevelInformation */) - : m_level(level), - m_identifier(identifier), - m_icon(icon), - m_label(label), - m_description(description), - m_details(), - m_executionLabel(), - m_dateTime(CDateTime::GetCurrentDateTime()) -{ } - -CBaseEvent::CBaseEvent(const std::string& identifier, const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, EventLevel level /* = EventLevelInformation */) - : m_level(level), - m_identifier(identifier), - m_icon(icon), - m_label(label), - m_description(description), - m_details(details), - m_executionLabel(), - m_dateTime(CDateTime::GetCurrentDateTime()) -{ } - -CBaseEvent::CBaseEvent(const std::string& identifier, const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, const CVariant& executionLabel, EventLevel level /* = EventLevelInformation */) - : m_level(level), - m_identifier(identifier), - m_icon(icon), - m_label(label), - m_description(description), - m_details(details), - m_executionLabel(executionLabel), - m_dateTime(CDateTime::GetCurrentDateTime()) -{ } - -std::string CBaseEvent::GetLabel() const -{ - return VariantToLocalizedString(m_label); -} - -std::string CBaseEvent::GetDescription() const -{ - return VariantToLocalizedString(m_description); -} - -std::string CBaseEvent::GetDetails() const -{ - return VariantToLocalizedString(m_details); -} - -std::string CBaseEvent::GetExecutionLabel() const -{ - return VariantToLocalizedString(m_executionLabel); -} - -std::string CBaseEvent::VariantToLocalizedString(const CVariant& variant) -{ - if (variant.isString()) - return variant.asString(); - - if (variant.isInteger() && variant.asInteger() > 0) - return g_localizeStrings.Get(static_cast(variant.asInteger())); - if (variant.isUnsignedInteger() && variant.asUnsignedInteger() > 0) - return g_localizeStrings.Get(static_cast(variant.asUnsignedInteger())); - - return ""; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/BaseEvent.h kodi-15.2~git20151019.1039-final/xbmc/events/BaseEvent.h --- kodi-16.1~git20160425.1001-final/xbmc/events/BaseEvent.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/BaseEvent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "XBDateTime.h" -#include "events/IEvent.h" -#include "utils/Variant.h" - -class CBaseEvent : public IEvent -{ -public: - virtual ~CBaseEvent() { } - - virtual std::string GetIdentifier() const { return m_identifier; } - virtual EventLevel GetLevel() const { return m_level; } - virtual std::string GetLabel() const; - virtual std::string GetIcon() const { return m_icon; } - virtual std::string GetDescription() const; - virtual std::string GetDetails() const; - virtual std::string GetExecutionLabel() const; - virtual CDateTime GetDateTime() const { return m_dateTime; } - - virtual bool CanExecute() const { return !GetExecutionLabel().empty(); } - -protected: - CBaseEvent(const std::string& identifier, const CVariant& label, const CVariant& description, EventLevel level = EventLevelInformation); - CBaseEvent(const std::string& identifier, const CVariant& label, const CVariant& description, const std::string& icon, EventLevel level = EventLevelInformation); - CBaseEvent(const std::string& identifier, const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, EventLevel level = EventLevelInformation); - CBaseEvent(const std::string& identifier, const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, const CVariant& executionLabel, EventLevel level = EventLevelInformation); - - EventLevel m_level; - std::string m_identifier; - std::string m_icon; - CVariant m_label; - CVariant m_description; - CVariant m_details; - CVariant m_executionLabel; - -private: - static std::string VariantToLocalizedString(const CVariant& variant); - - CDateTime m_dateTime; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/EventLog.cpp kodi-15.2~git20151019.1039-final/xbmc/events/EventLog.cpp --- kodi-16.1~git20160425.1001-final/xbmc/events/EventLog.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/EventLog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,265 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "EventLog.h" -#include "GUIUserMessages.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "dialogs/GUIDialogSelect.h" -#include "filesystem/EventsDirectory.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/WindowIDs.h" -#include "profiles/ProfilesManager.h" -#include "settings/Settings.h" -#include "threads/SingleLock.h" - -#include - -std::map > CEventLog::s_eventLogs; -CCriticalSection CEventLog::s_critical; - -std::string CEventLog::EventLevelToString(EventLevel level) -{ - switch (level) - { - case EventLevelBasic: - return "basic"; - - case EventLevelWarning: - return "warning"; - - case EventLevelError: - return "error"; - - case EventLevelInformation: - default: - break; - } - - return "information"; -} - -EventLevel CEventLog::EventLevelFromString(const std::string& level) -{ - if (level == "basic") - return EventLevelBasic; - if (level == "warning") - return EventLevelWarning; - if (level == "error") - return EventLevelError; - - return EventLevelInformation; -} - -CEventLog& CEventLog::GetInstance() -{ - int currentProfileId = CProfilesManager::GetInstance().GetCurrentProfileId(); - - CSingleLock lock(s_critical); - auto eventLog = s_eventLogs.find(currentProfileId); - if (eventLog == s_eventLogs.end()) - { - s_eventLogs.insert(std::make_pair(currentProfileId, std::unique_ptr(new CEventLog()))); - eventLog = s_eventLogs.find(currentProfileId); - } - - return *eventLog->second; -} - -Events CEventLog::Get() const -{ - return m_events; -} - -Events CEventLog::Get(EventLevel level, bool includeHigherLevels /* = false */) const -{ - Events events; - - CSingleLock lock(m_critical); - for (const auto& eventPtr : m_events) - { - if (eventPtr->GetLevel() == level || - (includeHigherLevels && eventPtr->GetLevel() > level)) - events.push_back(eventPtr); - } - - return events; -} - -EventPtr CEventLog::Get(const std::string& eventPtrIdentifier) const -{ - if (eventPtrIdentifier.empty()) - return EventPtr(); - - CSingleLock lock(m_critical); - const auto& eventPtr = m_eventsMap.find(eventPtrIdentifier); - if (eventPtr == m_eventsMap.end()) - return EventPtr(); - - return eventPtr->second; -} - -void CEventLog::Add(const EventPtr& eventPtr) -{ - if (eventPtr == nullptr || eventPtr->GetIdentifier().empty() || - !CSettings::GetInstance().GetBool(CSettings::SETTING_EVENTLOG_ENABLED) || - (eventPtr->GetLevel() == EventLevelInformation && !CSettings::GetInstance().GetBool(CSettings::SETTING_EVENTLOG_ENABLED_NOTIFICATIONS))) - return; - - CSingleLock lock(m_critical); - if (m_eventsMap.find(eventPtr->GetIdentifier()) != m_eventsMap.end()) - return; - - // store the event - m_events.push_back(eventPtr); - m_eventsMap.insert(std::make_pair(eventPtr->GetIdentifier(), eventPtr)); - - SendMessage(eventPtr, GUI_MSG_EVENT_ADDED); -} - -void CEventLog::Add(const EventPtr& eventPtr, bool withNotification, bool withSound /* = true */) -{ - if (!withNotification) - Add(eventPtr); - else - AddWithNotification(eventPtr, withSound); -} - -void CEventLog::AddWithNotification(const EventPtr& eventPtr, - unsigned int displayTime /* = NOTIFICATION_DISPLAY_TIME */, - unsigned int messageTime /* = NOTIFICATION_MESSAGE_TIME */, - bool withSound /* = true */) -{ - if (eventPtr == nullptr) - return; - - Add(eventPtr); - - // queue the eventPtr as a kai toast notification - if (!eventPtr->GetIcon().empty()) - CGUIDialogKaiToast::QueueNotification(eventPtr->GetIcon(), eventPtr->GetLabel(), eventPtr->GetDescription(), displayTime, withSound, messageTime); - else - { - CGUIDialogKaiToast::eMessageType type = CGUIDialogKaiToast::Info; - if (eventPtr->GetLevel() == EventLevelWarning) - type = CGUIDialogKaiToast::Warning; - else if (eventPtr->GetLevel() == EventLevelError) - type = CGUIDialogKaiToast::Error; - - CGUIDialogKaiToast::QueueNotification(type, eventPtr->GetLabel(), eventPtr->GetDescription(), displayTime, withSound, messageTime); - } -} - -void CEventLog::AddWithNotification(const EventPtr& eventPtr, bool withSound) -{ - AddWithNotification(eventPtr, NOTIFICATION_DISPLAY_TIME, NOTIFICATION_MESSAGE_TIME, withSound); -} - -void CEventLog::Remove(const EventPtr& eventPtr) -{ - if (eventPtr == nullptr) - return; - - Remove(eventPtr->GetIdentifier()); -} - -void CEventLog::Remove(const std::string& eventPtrIdentifier) -{ - if (eventPtrIdentifier.empty()) - return; - - CSingleLock lock(m_critical); - const auto& itEvent = m_eventsMap.find(eventPtrIdentifier); - if (itEvent == m_eventsMap.end()) - return; - - EventPtr eventPtr = itEvent->second; - m_eventsMap.erase(itEvent); - m_events.erase(std::remove(m_events.begin(), m_events.end(), eventPtr), m_events.end()); - - SendMessage(eventPtr, GUI_MSG_EVENT_REMOVED); -} - -void CEventLog::Clear() -{ - CSingleLock lock(m_critical); - m_events.clear(); - m_eventsMap.clear(); -} - -void CEventLog::Clear(EventLevel level, bool includeHigherLevels /* = false */) -{ - EventsList eventsCopy = m_events; - for (const auto& eventPtr : eventsCopy) - { - - if (eventPtr->GetLevel() == level || - (includeHigherLevels && eventPtr->GetLevel() > level)) - Remove(eventPtr); - } -} - -bool CEventLog::Execute(const std::string& eventPtrIdentifier) -{ - if (eventPtrIdentifier.empty()) - return false; - - CSingleLock lock(m_critical); - const auto& itEvent = m_eventsMap.find(eventPtrIdentifier); - if (itEvent == m_eventsMap.end()) - return false; - - return itEvent->second->Execute(); -} - -void CEventLog::ShowFullEventLog(EventLevel level /* = EventLevelBasic */, bool includeHigherLevels /* = true */) -{ - // put together the path - std::string path = "events://"; - if (level != EventLevelBasic || !includeHigherLevels) - { - // add the level to the path - path += EventLevelToString(level); - // add whether to include higher levels or not to the path - if (includeHigherLevels) - path += "+"; - } - - // activate the full eventPtr log window - std::vector params; - params.push_back(path); - params.push_back("return"); - g_windowManager.ActivateWindow(WINDOW_EVENT_LOG, params); -} - -void CEventLog::OnSettingAction(const CSetting *setting) -{ - if (setting == nullptr) - return; - - const std::string& settingId = setting->GetId(); - if (settingId == CSettings::SETTING_EVENTLOG_SHOW) - ShowFullEventLog(); -} - -void CEventLog::SendMessage(const EventPtr& eventPtr, int message) -{ - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, message, 0, XFILE::CEventsDirectory::EventToFileItem(eventPtr)); - g_windowManager.SendThreadMessage(msg); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/EventLog.h kodi-15.2~git20151019.1039-final/xbmc/events/EventLog.h --- kodi-16.1~git20160425.1001-final/xbmc/events/EventLog.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/EventLog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include - -#include "events/IEvent.h" -#include "settings/lib/ISettingCallback.h" -#include "threads/CriticalSection.h" - -#define NOTIFICATION_DISPLAY_TIME 5000 -#define NOTIFICATION_MESSAGE_TIME 1000 - -typedef std::vector Events; - -class CEventLog : public ISettingCallback -{ -public: - virtual ~CEventLog() { } - - static CEventLog& GetInstance(); - - Events Get() const; - Events Get(EventLevel level, bool includeHigherLevels = false) const; - EventPtr Get(const std::string& eventIdentifier) const; - - void Add(const EventPtr& event); - void Add(const EventPtr& event, bool withNotification, bool withSound = true); - void AddWithNotification(const EventPtr& event, - unsigned int displayTime = NOTIFICATION_DISPLAY_TIME, - unsigned int messageTime = NOTIFICATION_MESSAGE_TIME, - bool withSound = true); - void AddWithNotification(const EventPtr& event, bool withSound); - void Remove(const EventPtr& event); - void Remove(const std::string& eventIdentifier); - void Clear(); - void Clear(EventLevel level, bool includeHigherLevels = false); - - bool Execute(const std::string& eventIdentifier); - - std::string EventLevelToString(EventLevel level); - EventLevel EventLevelFromString(const std::string& level); - - void ShowFullEventLog(EventLevel level = EventLevelBasic, bool includeHigherLevels = true); - -protected: - CEventLog() { } - CEventLog(const CEventLog&); - CEventLog const& operator=(CEventLog const&); - - // implementation of ISettingCallback - virtual void OnSettingAction(const CSetting *setting) override; - -private: - void SendMessage(const EventPtr& event, int message); - - typedef std::vector EventsList; - typedef std::map EventsMap; - EventsList m_events; - EventsMap m_eventsMap; - CCriticalSection m_critical; - - static std::map > s_eventLogs; - static CCriticalSection s_critical; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/IEvent.h kodi-15.2~git20151019.1039-final/xbmc/events/IEvent.h --- kodi-16.1~git20160425.1001-final/xbmc/events/IEvent.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/IEvent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include - -class CDateTime; - -typedef enum EventLevel -{ - EventLevelBasic = 0, - EventLevelInformation, - EventLevelWarning, - EventLevelError -} EventLevel; - -class IEvent -{ -public: - virtual ~IEvent() { } - - virtual const char* GetType() const = 0; - virtual std::string GetIdentifier() const = 0; - virtual EventLevel GetLevel() const = 0; - virtual std::string GetLabel() const = 0; - virtual std::string GetIcon() const = 0; - virtual std::string GetDescription() const = 0; - virtual std::string GetDetails() const = 0; - virtual std::string GetExecutionLabel() const = 0; - virtual CDateTime GetDateTime() const = 0; - - virtual bool CanExecute() const = 0; - virtual bool Execute() const = 0; -}; - -typedef std::shared_ptr EventPtr; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/Makefile kodi-15.2~git20151019.1039-final/xbmc/events/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/events/Makefile 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -SRCS=AddonEvent.cpp \ - AddonManagementEvent.cpp \ - BaseEvent.cpp \ - EventLog.cpp \ - MediaLibraryEvent.cpp \ - windows/GUIViewStateEventLog.cpp \ - windows/GUIWindowEventLog.cpp \ - -LIB=events.a - -include ../../Makefile.include --include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS))) - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/MediaLibraryEvent.cpp kodi-15.2~git20151019.1039-final/xbmc/events/MediaLibraryEvent.cpp --- kodi-16.1~git20160425.1001-final/xbmc/events/MediaLibraryEvent.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/MediaLibraryEvent.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "MediaLibraryEvent.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "guilib/WindowIDs.h" -#include "utils/URIUtils.h" - -CMediaLibraryEvent::CMediaLibraryEvent(const MediaType& mediaType, const std::string& mediaPath, const CVariant& label, const CVariant& description, EventLevel level /* = EventLevelInformation */) - : CUniqueEvent(label, description, level), - m_mediaType(mediaType), - m_mediaPath(mediaPath) -{ } - -CMediaLibraryEvent::CMediaLibraryEvent(const MediaType& mediaType, const std::string& mediaPath, const CVariant& label, const CVariant& description, const std::string& icon, EventLevel level /* = EventLevelInformation */) - : CUniqueEvent(label, description, icon, level), - m_mediaType(mediaType), - m_mediaPath(mediaPath) -{ } - -CMediaLibraryEvent::CMediaLibraryEvent(const MediaType& mediaType, const std::string& mediaPath, const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, EventLevel level /* = EventLevelInformation */) - : CUniqueEvent(label, description, icon, details, level), - m_mediaType(mediaType), - m_mediaPath(mediaPath) -{ } - -CMediaLibraryEvent::CMediaLibraryEvent(const MediaType& mediaType, const std::string& mediaPath, const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, const CVariant& executionLabel, EventLevel level /* = EventLevelInformation */) - : CUniqueEvent(label, description, icon, details, executionLabel, level), - m_mediaType(mediaType), - m_mediaPath(mediaPath) -{ } - -std::string CMediaLibraryEvent::GetExecutionLabel() const -{ - std::string executionLabel = CUniqueEvent::GetExecutionLabel(); - if (!executionLabel.empty()) - return executionLabel; - - return g_localizeStrings.Get(24140); -} - -bool CMediaLibraryEvent::Execute() const -{ - if (!CanExecute()) - return false; - - int windowId = -1; - std::string path = m_mediaPath; - if (m_mediaType == MediaTypeVideo || m_mediaType == MediaTypeMovie || m_mediaType == MediaTypeVideoCollection || - m_mediaType == MediaTypeTvShow || m_mediaType == MediaTypeSeason || m_mediaType == MediaTypeEpisode || - m_mediaType == MediaTypeMusicVideo) - { - if (path.empty()) - { - if (m_mediaType == MediaTypeVideo) - path = "sources://video/"; - else if (m_mediaType == MediaTypeMovie) - path = "videodb://movies/titles/"; - else if (m_mediaType == MediaTypeVideoCollection) - path = "videodb://movies/sets/"; - else if (m_mediaType == MediaTypeMusicVideo) - path = "videodb://musicvideos/titles/"; - else if (m_mediaType == MediaTypeTvShow || m_mediaType == MediaTypeSeason || m_mediaType == MediaTypeEpisode) - path = "videodb://tvshows/titles/"; - } - else - { - // TODO: remove the filename for now as CGUIMediaWindow::GetDirectory() can't handle it - if (m_mediaType == MediaTypeMovie || m_mediaType == MediaTypeMusicVideo || m_mediaType == MediaTypeEpisode) - path = URIUtils::GetDirectory(path); - } - - if (URIUtils::IsVideoDb(path)) - windowId = WINDOW_VIDEO_NAV; - else - windowId = WINDOW_VIDEO_FILES; - } - else if (m_mediaType == MediaTypeMusic || m_mediaType == MediaTypeArtist || - m_mediaType == MediaTypeAlbum || m_mediaType == MediaTypeSong) - { - if (path.empty()) - { - if (m_mediaType == MediaTypeMusic) - path = "sources://music/"; - else if (m_mediaType == MediaTypeArtist) - path = "musicdb://artists/"; - else if (m_mediaType == MediaTypeAlbum) - path = "musicdb://albums/"; - else if (m_mediaType == MediaTypeSong) - path = "musicdb://songs/"; - } - else - { - // TODO: remove the filename for now as CGUIMediaWindow::GetDirectory() can't handle it - if (m_mediaType == MediaTypeSong) - path = URIUtils::GetDirectory(path); - } - - if (URIUtils::IsMusicDb(path)) - windowId = WINDOW_MUSIC_NAV; - else - windowId = WINDOW_MUSIC_FILES; - } - - if (windowId < 0) - return false; - - std::vector params; - params.push_back(path); - params.push_back("return"); - g_windowManager.ActivateWindow(windowId, params); - return true; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/MediaLibraryEvent.h kodi-15.2~git20151019.1039-final/xbmc/events/MediaLibraryEvent.h --- kodi-16.1~git20160425.1001-final/xbmc/events/MediaLibraryEvent.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/MediaLibraryEvent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "events/UniqueEvent.h" -#include "media/MediaType.h" - -class CMediaLibraryEvent : public CUniqueEvent -{ -public: - CMediaLibraryEvent(const MediaType& mediaType, const std::string& mediaPath, const CVariant& label, const CVariant& description, EventLevel level = EventLevelInformation); - CMediaLibraryEvent(const MediaType& mediaType, const std::string& mediaPath, const CVariant& label, const CVariant& description, const std::string& icon, EventLevel level = EventLevelInformation); - CMediaLibraryEvent(const MediaType& mediaType, const std::string& mediaPath, const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, EventLevel level = EventLevelInformation); - CMediaLibraryEvent(const MediaType& mediaType, const std::string& mediaPath, const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, const CVariant& executionLabel, EventLevel level = EventLevelInformation); - virtual ~CMediaLibraryEvent() { } - - virtual const char* GetType() const { return "MediaLibraryEvent"; } - virtual std::string GetExecutionLabel() const; - - virtual bool CanExecute() const { return !m_mediaType.empty(); } - virtual bool Execute() const; - -protected: - MediaType m_mediaType; - std::string m_mediaPath; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/NotificationEvent.h kodi-15.2~git20151019.1039-final/xbmc/events/NotificationEvent.h --- kodi-16.1~git20160425.1001-final/xbmc/events/NotificationEvent.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/NotificationEvent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "events/UniqueEvent.h" - -class CNotificationEvent : public CUniqueEvent -{ -public: - CNotificationEvent(const CVariant& label, const CVariant& description, EventLevel level = EventLevelInformation) - : CUniqueEvent(label, description, level) - { } - CNotificationEvent(const CVariant& label, const CVariant& description, const std::string& icon, EventLevel level = EventLevelInformation) - : CUniqueEvent(label, description, icon, level) - { } - CNotificationEvent(const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, EventLevel level = EventLevelInformation) - : CUniqueEvent(label, description, icon, details, level) - { } - CNotificationEvent(const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, const CVariant& executionLabel, EventLevel level = EventLevelInformation) - : CUniqueEvent(label, description, icon, details, executionLabel, level) - { } - virtual ~CNotificationEvent() { } - - virtual const char* GetType() const { return "NotificationEvent"; } - - virtual bool CanExecute() const { return false; } - virtual bool Execute() const { return true; } -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/UniqueEvent.h kodi-15.2~git20151019.1039-final/xbmc/events/UniqueEvent.h --- kodi-16.1~git20160425.1001-final/xbmc/events/UniqueEvent.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/UniqueEvent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "events/BaseEvent.h" -#include "utils/StringUtils.h" - -class CUniqueEvent : public CBaseEvent -{ -public: - virtual ~CUniqueEvent() { } - -protected: - CUniqueEvent(const CVariant& label, const CVariant& description, EventLevel level = EventLevelInformation) - : CBaseEvent(StringUtils::CreateUUID(), label, description, level) - { } - CUniqueEvent(const CVariant& label, const CVariant& description, const std::string& icon, EventLevel level = EventLevelInformation) - : CBaseEvent(StringUtils::CreateUUID(), label, description, icon, level) - { } - CUniqueEvent(const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, EventLevel level = EventLevelInformation) - : CBaseEvent(StringUtils::CreateUUID(), label, description, icon, details, level) - { } - CUniqueEvent(const CVariant& label, const CVariant& description, const std::string& icon, const CVariant& details, const CVariant& executionLabel, EventLevel level = EventLevelInformation) - : CBaseEvent(StringUtils::CreateUUID(), label, description, icon, details, executionLabel, level) - { } -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/windows/GUIViewStateEventLog.cpp kodi-15.2~git20151019.1039-final/xbmc/events/windows/GUIViewStateEventLog.cpp --- kodi-16.1~git20160425.1001-final/xbmc/events/windows/GUIViewStateEventLog.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/windows/GUIViewStateEventLog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "GUIViewStateEventLog.h" -#include "FileItem.h" -#include "filesystem/File.h" -#include "guilib/GraphicContext.h" -#include "guilib/WindowIDs.h" -#include "utils/StringUtils.h" -#include "view/ViewState.h" - -CGUIViewStateEventLog::CGUIViewStateEventLog(const CFileItemList& items) : CGUIViewState(items) -{ - AddSortMethod(SortByDate, 552, LABEL_MASKS("%L", "%d", "%L", "%d")); // Label, Date | Label, Date - - SetSortMethod(SortByDate); - SetViewAsControl(DEFAULT_VIEW_AUTO); - - SetSortOrder(SortOrderDescending); - LoadViewState(items.GetPath(), WINDOW_EVENT_LOG); -} - -void CGUIViewStateEventLog::SaveViewState() -{ - SaveViewToDb(m_items.GetPath(), WINDOW_EVENT_LOG); -} - -std::string CGUIViewStateEventLog::GetExtensions() -{ - return ""; -} - -VECSOURCES& CGUIViewStateEventLog::GetSources() -{ - m_sources.clear(); - - return CGUIViewState::GetSources(); -} - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/windows/GUIViewStateEventLog.h kodi-15.2~git20151019.1039-final/xbmc/events/windows/GUIViewStateEventLog.h --- kodi-16.1~git20160425.1001-final/xbmc/events/windows/GUIViewStateEventLog.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/windows/GUIViewStateEventLog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "view/GUIViewState.h" - -class CGUIViewStateEventLog : public CGUIViewState -{ -public: - CGUIViewStateEventLog(const CFileItemList& items); - ~CGUIViewStateEventLog() { } - - // specializations of CGUIViewState - virtual bool HideExtensions() { return true; } - virtual bool HideParentDirItems() { return true; } - virtual bool DisableAddSourceButtons() { return true; } - -protected: - // specializations of CGUIViewState - virtual void SaveViewState(); - virtual std::string GetExtensions(); - virtual VECSOURCES& GetSources(); -}; - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/windows/GUIWindowEventLog.cpp kodi-15.2~git20151019.1039-final/xbmc/events/windows/GUIWindowEventLog.cpp --- kodi-16.1~git20160425.1001-final/xbmc/events/windows/GUIWindowEventLog.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/windows/GUIWindowEventLog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,332 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "GUIWindowEventLog.h" -#include "FileItem.h" -#include "GUIUserMessages.h" -#include "URL.h" -#include "events/EventLog.h" -#include "filesystem/EventsDirectory.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "guilib/WindowIDs.h" -#include "input/Key.h" -#include "settings/Settings.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "view/ViewStateSettings.h" - -#define CONTROL_BUTTON_CLEAR 20 -#define CONTROL_BUTTON_LEVEL 21 -#define CONTROL_BUTTON_LEVEL_ONLY 22 - -CGUIWindowEventLog::CGUIWindowEventLog() - : CGUIMediaWindow(WINDOW_EVENT_LOG, "EventLog.xml") -{ } - -CGUIWindowEventLog::~CGUIWindowEventLog() -{ } - -bool CGUIWindowEventLog::OnMessage(CGUIMessage& message) -{ - switch (message.GetMessage()) - { - case GUI_MSG_WINDOW_INIT: - { - m_rootDir.AllowNonLocalSources(false); - - // is this the first time the window is opened? - if (m_vecItems->GetPath() == "?" && message.GetStringParam().empty()) - m_vecItems->SetPath(""); - - break; - } - - case GUI_MSG_CLICKED: - { - int iControl = message.GetSenderId(); - - // check if we should clear all items - if (iControl == CONTROL_BUTTON_CLEAR) - { - CEventLog::GetInstance().Clear(CViewStateSettings::GetInstance().GetEventLevel(), CViewStateSettings::GetInstance().ShowHigherEventLevels()); - - // refresh the list - Refresh(true); - return true; - } - - // check if we should change the level - if (iControl == CONTROL_BUTTON_LEVEL) - { - // update the event level - CViewStateSettings::GetInstance().CycleEventLevel(); - CSettings::GetInstance().Save(); - - // update the listing - Refresh(); - return true; - } - - // check if we should change the level - if (iControl == CONTROL_BUTTON_LEVEL_ONLY) - { - // update whether to show higher event levels - CViewStateSettings::GetInstance().ToggleShowHigherEventLevels(); - CSettings::GetInstance().Save(); - - // update the listing - Refresh(); - return true; - } - - // check if the user interacted with one of the events - if (m_viewControl.HasControl(iControl)) - { - // get selected item - int itemIndex = m_viewControl.GetSelectedItem(); - if (itemIndex < 0 || itemIndex >= m_vecItems->Size()) - break; - - CFileItemPtr item = m_vecItems->Get(itemIndex); - int actionId = message.GetParam1(); - - if (actionId == ACTION_DELETE_ITEM) - return OnDelete(item); - } - - break; - } - - case GUI_MSG_NOTIFY_ALL: - { - CFileItemPtr item = std::dynamic_pointer_cast(message.GetItem()); - if (item == nullptr) - break; - - switch (message.GetParam1()) - { - case GUI_MSG_EVENT_ADDED: - OnEventAdded(item); - return true; - - case GUI_MSG_EVENT_REMOVED: - OnEventRemoved(item); - return true; - - default: - break; - } - } - - default: - break; - } - - return CGUIMediaWindow::OnMessage(message); -} - -bool CGUIWindowEventLog::OnSelect(int item) -{ - if (item < 0 || item >= m_vecItems->Size()) - return false; - - return OnSelect(m_vecItems->Get(item)); -} - -void CGUIWindowEventLog::GetContextButtons(int itemNumber, CContextButtons &buttons) -{ - if (itemNumber < 0 && itemNumber >= m_vecItems->Size()) - return; - - CFileItemPtr item = m_vecItems->Get(itemNumber); - if (item == nullptr) - return; - - std::string eventIdentifier = item->GetProperty(PROPERTY_EVENT_IDENTIFIER).asString(); - if (eventIdentifier.empty()) - return; - - EventPtr eventPtr = CEventLog::GetInstance().Get(eventIdentifier); - if (eventPtr == nullptr) - return; - - buttons.Add(CONTEXT_BUTTON_INFO, g_localizeStrings.Get(19033)); - buttons.Add(CONTEXT_BUTTON_DELETE, g_localizeStrings.Get(1210)); - if (eventPtr->CanExecute()) - buttons.Add(CONTEXT_BUTTON_ACTIVATE, eventPtr->GetExecutionLabel()); -} - -bool CGUIWindowEventLog::OnContextButton(int itemNumber, CONTEXT_BUTTON button) -{ - if (itemNumber < 0 && itemNumber >= m_vecItems->Size()) - return false; - - CFileItemPtr item = m_vecItems->Get(itemNumber); - if (item == nullptr) - return false; - - switch (button) - { - case CONTEXT_BUTTON_INFO: - return OnSelect(item); - - case CONTEXT_BUTTON_DELETE: - return OnDelete(item); - - case CONTEXT_BUTTON_ACTIVATE: - return OnExecute(item); - - default: - break; - } - - return CGUIMediaWindow::OnContextButton(itemNumber, button); -} - -void CGUIWindowEventLog::UpdateButtons() -{ - // only enable the "clear" button if there is something to clear - CONTROL_ENABLE_ON_CONDITION(CONTROL_BUTTON_CLEAR, m_vecItems->GetObjectCount() > 0); - - EventLevel eventLevel = CViewStateSettings::GetInstance().GetEventLevel(); - // set the label of the "level" button - SET_CONTROL_LABEL(CONTROL_BUTTON_LEVEL, StringUtils::Format(g_localizeStrings.Get(14119).c_str(), g_localizeStrings.Get(14115 + (int)eventLevel).c_str())); - - // set the label, value and enabled state of the "level only" button - SET_CONTROL_LABEL(CONTROL_BUTTON_LEVEL_ONLY, 14120); - SET_CONTROL_SELECTED(GetID(), CONTROL_BUTTON_LEVEL_ONLY, CViewStateSettings::GetInstance().ShowHigherEventLevels()); - CONTROL_ENABLE_ON_CONDITION(CONTROL_BUTTON_LEVEL_ONLY, eventLevel < EventLevelError); - - CGUIMediaWindow::UpdateButtons(); -} - -bool CGUIWindowEventLog::GetDirectory(const std::string &strDirectory, CFileItemList &items) -{ - bool result = CGUIMediaWindow::GetDirectory(strDirectory, items); - - EventLevel currentLevel = CViewStateSettings::GetInstance().GetEventLevel(); - bool showHigherLevels = CViewStateSettings::GetInstance().ShowHigherEventLevels(); - - CFileItemList filteredItems(items.GetPath()); - for (int i = 0; i < items.Size(); i++) - { - CFileItemPtr item = items.Get(i); - if (item->IsParentFolder()) - { - filteredItems.Add(item); - continue; - } - - if (!item->HasProperty(PROPERTY_EVENT_LEVEL)) - continue; - - EventLevel level = CEventLog::GetInstance().EventLevelFromString(item->GetProperty(PROPERTY_EVENT_LEVEL).asString()); - if (level == currentLevel || - (level > currentLevel && showHigherLevels)) - filteredItems.Add(item); - } - - items.ClearItems(); - items.Append(filteredItems); - - return result; -} - -std::string CGUIWindowEventLog::GetStartFolder(const std::string &dir) -{ - if (dir.empty()) - return "events://"; - - if (URIUtils::PathStarts(dir, "events://")) - return dir; - - return CGUIMediaWindow::GetStartFolder(dir); -} - -bool CGUIWindowEventLog::OnSelect(CFileItemPtr item) -{ - if (item == nullptr) - return false; - - OnExecute(item); - return true; -} - -bool CGUIWindowEventLog::OnDelete(CFileItemPtr item) -{ - if (item == nullptr) - return false; - - std::string eventIdentifier = item->GetProperty(PROPERTY_EVENT_IDENTIFIER).asString(); - if (eventIdentifier.empty()) - return false; - - CEventLog::GetInstance().Remove(eventIdentifier); - return true; -} - -bool CGUIWindowEventLog::OnExecute(CFileItemPtr item) -{ - if (item == nullptr) - return false; - - std::string eventIdentifier = item->GetProperty(PROPERTY_EVENT_IDENTIFIER).asString(); - if (eventIdentifier.empty()) - return false; - - const EventPtr eventPtr = CEventLog::GetInstance().Get(eventIdentifier); - if (eventPtr == nullptr) - return false; - - if (!eventPtr->CanExecute()) - return true; - - return eventPtr->Execute(); -} - -void CGUIWindowEventLog::OnEventAdded(CFileItemPtr item) -{ - if (!IsActive()) - return; - - Refresh(true); -} - -void CGUIWindowEventLog::OnEventRemoved(CFileItemPtr item) -{ - if (!IsActive()) - return; - - int selectedItemIndex = -1; - if (item != nullptr) - { - selectedItemIndex = m_viewControl.GetSelectedItem(); - // only update the selected item index when the deleted item is focused - if (m_vecItems->Get(selectedItemIndex)->GetProperty(PROPERTY_EVENT_IDENTIFIER).asString() != item->GetProperty(PROPERTY_EVENT_IDENTIFIER).asString()) - selectedItemIndex = -1; - } - - Refresh(true); - - // update the selected item - if (selectedItemIndex >= 0) - m_viewControl.SetSelectedItem(selectedItemIndex); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/events/windows/GUIWindowEventLog.h kodi-15.2~git20151019.1039-final/xbmc/events/windows/GUIWindowEventLog.h --- kodi-16.1~git20160425.1001-final/xbmc/events/windows/GUIWindowEventLog.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/events/windows/GUIWindowEventLog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "windows/GUIMediaWindow.h" - -class CGUIWindowEventLog : public CGUIMediaWindow -{ -public: - CGUIWindowEventLog(); - virtual ~CGUIWindowEventLog(); - - // specialization of CGUIControl - virtual bool OnMessage(CGUIMessage& message); - -protected: - // specialization of CGUIMediaWindow - virtual bool OnSelect(int item); - virtual void GetContextButtons(int itemNumber, CContextButtons &buttons); - virtual bool OnContextButton(int itemNumber, CONTEXT_BUTTON button); - virtual void UpdateButtons(); - virtual bool GetDirectory(const std::string &strDirectory, CFileItemList &items); - virtual std::string GetStartFolder(const std::string &dir); - - bool OnSelect(CFileItemPtr item); - bool OnDelete(CFileItemPtr item); - bool OnExecute(CFileItemPtr item); - - void OnEventAdded(CFileItemPtr item); - void OnEventRemoved(CFileItemPtr item); -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/FileItem.cpp kodi-15.2~git20151019.1039-final/xbmc/FileItem.cpp --- kodi-16.1~git20160425.1001-final/xbmc/FileItem.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/FileItem.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -42,7 +42,6 @@ #include "music/MusicDatabase.h" #include "epg/Epg.h" #include "pvr/channels/PVRChannel.h" -#include "pvr/channels/PVRRadioRDSInfoTag.h" #include "pvr/recordings/PVRRecording.h" #include "pvr/timers/PVRTimerInfoTag.h" #include "video/VideoInfoTag.h" @@ -57,11 +56,13 @@ #include "utils/RegExp.h" #include "utils/log.h" #include "utils/Variant.h" +#include "music/karaoke/karaokelyricsfactory.h" #include "utils/Mime.h" #include #include +using namespace std; using namespace XFILE; using namespace PLAYLIST; using namespace MUSIC_INFO; @@ -74,13 +75,6 @@ SetFromSong(song); } -CFileItem::CFileItem(const CSong& song, const CMusicInfoTag& music) -{ - Initialize(); - SetFromSong(song); - *GetMusicInfoTag() = music; -} - CFileItem::CFileItem(const CURL &url, const CAlbum& album) { Initialize(); @@ -150,7 +144,7 @@ m_pvrChannelInfoTag = channel; SetLabel(channel->ChannelName()); m_strLabel2 = epgNow ? epgNow->Title() : - CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? + CSettings::Get().GetBool("epg.hidenoinfoavailable") ? "" : g_localizeStrings.Get(19055); // no information available if (channel->IsRadio()) @@ -201,7 +195,7 @@ Initialize(); - m_bIsFolder = timer->IsRepeating(); + m_bIsFolder = false; m_pvrTimerInfoTag = timer; m_strPath = timer->Path(); SetLabel(timer->Title()); @@ -221,7 +215,7 @@ m_strPath = artist.strArtist; m_bIsFolder = true; URIUtils::AddSlashAtEnd(m_strPath); - GetMusicInfoTag()->SetArtist(artist); + GetMusicInfoTag()->SetArtist(artist.strArtist); FillInMimeType(false); } @@ -384,7 +378,6 @@ m_pvrChannelInfoTag = item.m_pvrChannelInfoTag; m_pvrRecordingInfoTag = item.m_pvrRecordingInfoTag; m_pvrTimerInfoTag = item.m_pvrTimerInfoTag; - m_pvrRadioRDSInfoTag = item.m_pvrRadioRDSInfoTag; m_lStartOffset = item.m_lStartOffset; m_lStartPartNumber = item.m_lStartPartNumber; @@ -402,7 +395,6 @@ m_extrainfo = item.m_extrainfo; m_specialSort = item.m_specialSort; m_bIsAlbum = item.m_bIsAlbum; - m_doContentLookup = item.m_doContentLookup; return *this; } @@ -427,7 +419,6 @@ m_iHasLock = 0; m_bCanQueue = true; m_specialSort = SortSpecialNone; - m_doContentLookup = true; } void CFileItem::Reset() @@ -454,7 +445,6 @@ m_pvrChannelInfoTag.reset(); m_pvrRecordingInfoTag.reset(); m_pvrTimerInfoTag.reset(); - m_pvrRadioRDSInfoTag.reset(); delete m_pictureInfoTag; m_pictureInfoTag=NULL; m_extrainfo.clear(); @@ -492,7 +482,6 @@ ar << m_mimetype; ar << m_extrainfo; ar << m_specialSort; - ar << m_doContentLookup; if (m_musicInfoTag) { @@ -508,13 +497,6 @@ } else ar << 0; - if (m_pvrRadioRDSInfoTag) - { - ar << 1; - ar << *m_pvrRadioRDSInfoTag; - } - else - ar << 0; if (m_pictureInfoTag) { ar << 1; @@ -550,7 +532,6 @@ ar >> m_extrainfo; ar >> temp; m_specialSort = (SortSpecial)temp; - ar >> m_doContentLookup; int iType; ar >> iType; @@ -561,9 +542,6 @@ ar >> *GetVideoInfoTag(); ar >> iType; if (iType == 1) - ar >> *m_pvrRadioRDSInfoTag; - ar >> iType; - if (iType == 1) ar >> *GetPictureInfoTag(); SetInvalid(); @@ -589,9 +567,6 @@ if (m_videoInfoTag) (*m_videoInfoTag).Serialize(value["videoInfoTag"]); - if (m_pvrRadioRDSInfoTag) - m_pvrRadioRDSInfoTag->Serialize(value["rdsInfoTag"]); - if (m_pictureInfoTag) (*m_pictureInfoTag).Serialize(value["pictureInfoTag"]); } @@ -711,7 +686,7 @@ if (IsPVRRecording()) return true; - if (URIUtils::IsDVD(m_strPath)) + if (IsHDHomeRun() || URIUtils::IsDVD(m_strPath) || IsSlingbox()) return true; std::string extension; @@ -757,11 +732,6 @@ return HasPVRTimerInfoTag(); } -bool CFileItem::IsPVRRadioRDS() const -{ - return HasPVRRadioRDSInfoTag(); -} - bool CFileItem::IsDiscStub() const { if (IsVideoDb() && HasVideoInfoTag()) @@ -803,6 +773,14 @@ return URIUtils::HasExtension(m_strPath, g_advancedSettings.GetMusicExtensions()); } +bool CFileItem::IsKaraoke() const +{ + if (!IsAudio()) + return false; + + return CKaraokeLyricsFactory::HasLyrics( m_strPath ); +} + bool CFileItem::IsPicture() const { if(StringUtils::StartsWithNoCase(m_mimetype, "image/")) @@ -860,7 +838,7 @@ || IsZIP() || IsRAR() || IsRSS() - || IsType(".ogg|.oga|.nsf|.sid|.sap|.xbt|.xsp") + || IsType(".ogg|.oga|.nsf|.sid|.sap|.xsp") #if defined(TARGET_ANDROID) || IsType(".apk") #endif @@ -1066,6 +1044,16 @@ return URIUtils::IsURL(m_strPath); } +bool CFileItem::IsHDHomeRun() const +{ + return URIUtils::IsHDHomeRun(m_strPath); +} + +bool CFileItem::IsSlingbox() const +{ + return URIUtils::IsSlingbox(m_strPath); +} + bool CFileItem::IsPVR() const { return CUtil::IsPVR(m_strPath); @@ -1114,13 +1102,6 @@ void CFileItem::FillInDefaultIcon() { - if (URIUtils::IsPVRGuideItem(m_strPath)) - { - // epg items never have a default icon. no need to execute this expensive method. - // when filling epg grid window, easily tens of thousands of epg items are processed. - return; - } - //CLog::Log(LOGINFO, "FillInDefaultIcon(%s)", pItem->GetLabel().c_str()); // find the default icon for a file or folder item // for files this can be the (depending on the file type) @@ -1401,11 +1382,6 @@ *GetMusicInfoTag() = *item.GetMusicInfoTag(); SetInvalid(); } - if (item.HasPVRRadioRDSInfoTag()) - { - m_pvrRadioRDSInfoTag = item.m_pvrRadioRDSInfoTag; - SetInvalid(); - } if (item.HasPictureInfoTag()) { *GetPictureInfoTag() = *item.GetPictureInfoTag(); @@ -1445,25 +1421,12 @@ FillInMimeType(false); } -void CFileItem::SetFromMusicInfoTag(const MUSIC_INFO::CMusicInfoTag &music) -{ - if (!music.GetTitle().empty()) - SetLabel(music.GetTitle()); - if (!music.GetURL().empty()) - m_strPath = music.GetURL(); - m_bIsFolder = URIUtils::HasSlashAtEnd(m_strPath); - - *GetMusicInfoTag() = music; - FillInDefaultIcon(); - FillInMimeType(false); -} - void CFileItem::SetFromAlbum(const CAlbum &album) { if (!album.strAlbum.empty()) SetLabel(album.strAlbum); m_bIsFolder = true; - m_strLabel2 = album.GetAlbumArtistString(); + m_strLabel2 = StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator); GetMusicInfoTag()->SetAlbum(album); SetArt(album.art); m_bIsAlbum = true; @@ -1475,12 +1438,7 @@ { if (!song.strTitle.empty()) SetLabel(song.strTitle); - if (song.idSong > 0) - { - std::string strExt = URIUtils::GetExtension(song.strFileName); - m_strPath = StringUtils::Format("musicdb://songs/%i%s", song.idSong, strExt.c_str()); - } - else if (!song.strFileName.empty()) + if (!song.strFileName.empty()) m_strPath = song.strFileName; GetMusicInfoTag()->SetSong(song); m_lStartOffset = song.iStartOffset; @@ -1549,9 +1507,9 @@ return IsPath(url.Get()); } -bool CFileItem::IsPath(const std::string& path, bool ignoreURLOptions /* = false */) const +bool CFileItem::IsPath(const std::string& path) const { - return URIUtils::PathEquals(m_strPath, path, false, ignoreURLOptions); + return URIUtils::PathEquals(m_strPath, path); } void CFileItem::SetCueDocument(const CCueDocumentPtr& cuePtr) @@ -1594,8 +1552,6 @@ VECSONGS tracks; m_cueDocument->GetSongs(tracks); - - bool oneFilePerTrack = m_cueDocument->IsOneFilePerTrack(); m_cueDocument.reset(); int tracksFound = 0; @@ -1608,15 +1564,12 @@ { if (song.strAlbum.empty() && !tag.GetAlbum().empty()) song.strAlbum = tag.GetAlbum(); - //Pass album artist to final MusicInfoTag object via setting song album artist vector. - if (song.GetAlbumArtist().empty() && !tag.GetAlbumArtist().empty()) - song.SetAlbumArtist(tag.GetAlbumArtist()); + if (song.albumArtist.empty() && !tag.GetAlbumArtist().empty()) + song.albumArtist = tag.GetAlbumArtist(); if (song.genre.empty() && !tag.GetGenre().empty()) song.genre = tag.GetGenre(); - //Pass artist to final MusicInfoTag object via setting song artist description string only. - //Artist credits not used during loading from cue sheet. - if (song.strArtistDesc.empty() && !tag.GetArtistString().empty()) - song.strArtistDesc = tag.GetArtistString(); + if (song.artist.empty() && !tag.GetArtist().empty()) + song.artist = tag.GetArtist(); if (tag.GetDiscNumber()) song.iTrack |= (tag.GetDiscNumber() << 16); // see CMusicInfoTag::GetDiscNumber() if (!tag.GetCueSheet().empty()) @@ -1634,15 +1587,7 @@ { // must be the last song song.iDuration = (tag.GetDuration() * 75 - song.iStartOffset + 37) / 75; } - if ( tag.Loaded() && oneFilePerTrack && ! ( tag.GetAlbum().empty() || tag.GetArtist().empty() || tag.GetTitle().empty() ) ) - { - // If there are multiple files in a cue file, the tags from the files should be prefered if they exist. - scannedItems.Add(CFileItemPtr(new CFileItem(song, tag))); - } - else - { - scannedItems.Add(CFileItemPtr(new CFileItem(song))); - } + scannedItems.Add(CFileItemPtr(new CFileItem(song))); ++tracksFound; } } @@ -1717,7 +1662,7 @@ m_fastLookup = fastLookup; } -bool CFileItemList::Contains(const std::string& fileName, bool ignoreURLOptions /* = false */) const +bool CFileItemList::Contains(const std::string& fileName) const { CSingleLock lock(m_lock); @@ -1728,7 +1673,7 @@ for (unsigned int i = 0; i < m_items.size(); i++) { const CFileItemPtr pItem = m_items[i]; - if (pItem->IsPath(fileName, ignoreURLOptions)) + if (pItem->IsPath(fileName)) return true; } return false; @@ -1925,7 +1870,7 @@ if (m_fastLookup) { - std::map::const_iterator it=m_map.find(strPath); + map::const_iterator it=m_map.find(strPath); if (it != m_map.end()) return it->second; @@ -2039,7 +1984,7 @@ void CFileItemList::Randomize() { CSingleLock lock(m_lock); - std::random_shuffle(m_items.begin(), m_items.end()); + random_shuffle(m_items.begin(), m_items.end()); } void CFileItemList::Archive(CArchive& ar) @@ -2227,7 +2172,7 @@ { CSingleLock lock(m_lock); // Handle .CUE sheet files... - std::vector itemstodelete; + vector itemstodelete; for (int i = 0; i < (int)m_items.size(); i++) { CFileItemPtr pItem = m_items[i]; @@ -2267,8 +2212,8 @@ } else { // try replacing the extension with one of our allowed ones. - std::vector extensions = StringUtils::Split(g_advancedSettings.GetMusicExtensions(), "|"); - for (std::vector::const_iterator i = extensions.begin(); i != extensions.end(); ++i) + vector extensions = StringUtils::Split(g_advancedSettings.GetMusicExtensions(), "|"); + for (vector::const_iterator i = extensions.begin(); i != extensions.end(); ++i) { strMediaFile = URIUtils::ReplaceExtension(pItem->GetPath(), *i); CFileItem item(strMediaFile, false); @@ -2348,9 +2293,9 @@ // Precompile our REs VECCREGEXP folderRegExps; CRegExp folderRegExp(true, CRegExp::autoUtf8); - const std::vector& strFolderRegExps = g_advancedSettings.m_folderStackRegExps; + const vector& strFolderRegExps = g_advancedSettings.m_folderStackRegExps; - std::vector::const_iterator strExpression = strFolderRegExps.begin(); + vector::const_iterator strExpression = strFolderRegExps.begin(); while (strExpression != strFolderRegExps.end()) { if (!folderRegExp.RegComp(*strExpression)) @@ -2445,8 +2390,8 @@ // Precompile our REs VECCREGEXP stackRegExps; CRegExp tmpRegExp(true, CRegExp::autoUtf8); - const std::vector& strStackRegExps = g_advancedSettings.m_videoStackRegExps; - std::vector::const_iterator strRegExp = strStackRegExps.begin(); + const vector& strStackRegExps = g_advancedSettings.m_videoStackRegExps; + vector::const_iterator strRegExp = strStackRegExps.begin(); while (strRegExp != strStackRegExps.end()) { if (tmpRegExp.RegComp(*strRegExp)) @@ -2482,7 +2427,7 @@ std::string stackName; std::string file1; std::string filePath; - std::vector stack; + vector stack; VECCREGEXP::iterator expr = stackRegExps.begin(); URIUtils::Split(item1->GetPath(), filePath, file1); @@ -2607,7 +2552,7 @@ // item->m_bIsFolder = true; // don't treat stacked files as folders // the label may be in a different char set from the filename (eg over smb // the label is converted from utf8, but the filename is not) - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWEXTENSIONS)) + if (!CSettings::Get().GetBool("filelists.showextensions")) URIUtils::RemoveExtension(stackName); item1->SetLabel(stackName); @@ -2733,10 +2678,10 @@ } // if a folder, check for folder.jpg - if (m_bIsFolder && !IsFileFolder() && (!IsRemote() || alwaysCheckRemote || CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICFILES_FINDREMOTETHUMBS))) + if (m_bIsFolder && !IsFileFolder() && (!IsRemote() || alwaysCheckRemote || CSettings::Get().GetBool("musicfiles.findremotethumbs"))) { - std::vector thumbs = StringUtils::Split(g_advancedSettings.m_musicThumbs, "|"); - for (std::vector::const_iterator i = thumbs.begin(); i != thumbs.end(); ++i) + vector thumbs = StringUtils::Split(g_advancedSettings.m_musicThumbs, "|"); + for (vector::const_iterator i = thumbs.begin(); i != thumbs.end(); ++i) { std::string folderThumb(GetFolderThumb(*i)); if (CFile::Exists(folderThumb)) @@ -2940,9 +2885,7 @@ if (IsOpticalMediaFile()) return GetLocalMetadataPath(); - if (bUseFolderNames && - (!m_bIsFolder || URIUtils::IsInArchive(m_strPath) || - (HasVideoInfoTag() && GetVideoInfoTag()->m_iDbId > 0 && !MediaTypes::IsContainer(GetVideoInfoTag()->m_type)))) + if ((!m_bIsFolder || URIUtils::IsInArchive(m_strPath)) && bUseFolderNames) { std::string name2(strMovieName); URIUtils::GetParentPath(name2,strMovieName); @@ -3015,7 +2958,7 @@ items.Append(moreItems); } - std::vector fanarts = StringUtils::Split(g_advancedSettings.m_fanartImages, "|"); + vector fanarts = StringUtils::Split(g_advancedSettings.m_fanartImages, "|"); strFile = URIUtils::ReplaceExtension(strFile, "-fanart"); fanarts.insert(m_bIsFolder ? fanarts.end() : fanarts.begin(), URIUtils::GetFileName(strFile)); @@ -3023,7 +2966,7 @@ if (!strFile2.empty()) fanarts.insert(m_bIsFolder ? fanarts.end() : fanarts.begin(), URIUtils::GetFileName(strFile2)); - for (std::vector::const_iterator i = fanarts.begin(); i != fanarts.end(); ++i) + for (vector::const_iterator i = fanarts.begin(); i != fanarts.end(); ++i) { for (int j = 0; j < items.Size(); j++) { @@ -3079,7 +3022,7 @@ // load tag from file CLog::Log(LOGDEBUG, "%s: loading tag information for file: %s", __FUNCTION__, m_strPath.c_str()); CMusicInfoTagLoaderFactory factory; - std::unique_ptr pLoader (factory.CreateLoader(*this)); + unique_ptr pLoader (factory.CreateLoader(*this)); if (pLoader.get() != NULL) { if (pLoader->Load(m_strPath, *GetMusicInfoTag())) @@ -3245,9 +3188,9 @@ // Precompile our REs VECCREGEXP matchRegExps; CRegExp tmpRegExp(true, CRegExp::autoUtf8); - const std::vector& strMatchRegExps = g_advancedSettings.m_trailerMatchRegExps; + const vector& strMatchRegExps = g_advancedSettings.m_trailerMatchRegExps; - std::vector::const_iterator strRegExp = strMatchRegExps.begin(); + vector::const_iterator strRegExp = strMatchRegExps.begin(); while (strRegExp != strMatchRegExps.end()) { if (tmpRegExp.RegComp(*strRegExp)) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/FileItem.h kodi-15.2~git20151019.1039-final/xbmc/FileItem.h --- kodi-16.1~git20160425.1001-final/xbmc/FileItem.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/FileItem.h 2015-10-19 08:39:15.000000000 +0000 @@ -24,18 +24,17 @@ * */ -#include -#include -#include - #include "guilib/GUIListItem.h" -#include "GUIPassword.h" -#include "threads/CriticalSection.h" #include "utils/IArchivable.h" #include "utils/ISerializable.h" #include "utils/ISortable.h" -#include "utils/SortUtils.h" #include "XBDateTime.h" +#include "utils/SortUtils.h" +#include "GUIPassword.h" +#include "threads/CriticalSection.h" + +#include +#include namespace MUSIC_INFO { @@ -52,11 +51,9 @@ class CPVRChannel; class CPVRRecording; class CPVRTimerInfoTag; - class CPVRRadioRDSInfoTag; typedef std::shared_ptr CPVRRecordingPtr; typedef std::shared_ptr CPVRChannelPtr; typedef std::shared_ptr CPVRTimerInfoTagPtr; - typedef std::shared_ptr CPVRRadioRDSInfoTagPtr; } class CPictureInfoTag; @@ -66,7 +63,6 @@ class CGenre; class CURL; -class CVariant; class CFileItemList; class CCueDocument; @@ -106,7 +102,6 @@ CFileItem(const CURL& path, bool bIsFolder); CFileItem(const std::string& strPath, bool bIsFolder); CFileItem(const CSong& song); - CFileItem(const CSong& song, const MUSIC_INFO::CMusicInfoTag& music); CFileItem(const CURL &path, const CAlbum& album); CFileItem(const std::string &path, const CAlbum& album); CFileItem(const CArtist& artist); @@ -126,7 +121,7 @@ bool IsURL(const CURL& url) const; const std::string &GetPath() const { return m_strPath; }; void SetPath(const std::string &path) { m_strPath = path; }; - bool IsPath(const std::string& path, bool ignoreURLOptions = false) const; + bool IsPath(const std::string& path) const; /*! \brief reset class to it's default values as per construction. Free's all allocated memory. @@ -175,6 +170,7 @@ */ bool IsAudio() const; + bool IsKaraoke() const; bool IsCUESheet() const; bool IsInternetStream(const bool bStrictCheck = false) const; bool IsPlayList() const; @@ -215,7 +211,6 @@ bool IsUsablePVRRecording() const; bool IsDeletedPVRRecording() const; bool IsPVRTimer() const; - bool IsPVRRadioRDS() const; bool IsType(const char *ext) const; bool IsVirtualDirectoryRoot() const; bool IsReadOnly() const; @@ -224,6 +219,8 @@ bool IsParentFolder() const; bool IsFileFolder(EFileFolderType types = EFILEFOLDER_MASK_ALL) const; bool IsRemovable() const; + bool IsHDHomeRun() const; + bool IsSlingbox() const; bool IsPVR() const; bool IsLiveTV() const; bool IsRSS() const; @@ -310,21 +307,6 @@ return m_pvrTimerInfoTag; } - inline bool HasPVRRadioRDSInfoTag() const - { - return m_pvrRadioRDSInfoTag.get() != NULL; - } - - inline const PVR::CPVRRadioRDSInfoTagPtr GetPVRRadioRDSInfoTag() const - { - return m_pvrRadioRDSInfoTag; - } - - inline void SetPVRRadioRDSInfoTag(const PVR::CPVRRadioRDSInfoTagPtr& tag) - { - m_pvrRadioRDSInfoTag = tag; - } - /*! \brief Test if this item has a valid resume point set. \return True if this item has a resume point and it is set, false otherwise. @@ -431,18 +413,6 @@ */ void FillInMimeType(bool lookup = true); - /*! - \brief Some sources do not support HTTP HEAD request to determine i.e. mime type - \return false if HEAD requests have to be avoided - */ - bool ContentLookup() { return m_doContentLookup; }; - - /*! - *\brief Lookup via HTTP HEAD request might not be needed, use this setter to - * disable ContentLookup. - */ - void SetContentLookup(bool enable) { m_doContentLookup = enable; }; - /* general extra info about the contents of the item, not for display */ void SetExtraInfo(const std::string& info) { m_extrainfo = info; }; const std::string& GetExtraInfo() const { return m_extrainfo; }; @@ -466,13 +436,6 @@ \param video video details to use and set */ void SetFromVideoInfoTag(const CVideoInfoTag &video); - - /*! \brief Sets details using the information from the CMusicInfoTag object - Sets the musicinfotag and uses its information to set the label and path. - \param music music details to use and set - */ - void SetFromMusicInfoTag(const MUSIC_INFO::CMusicInfoTag &music); - /*! \brief Sets details using the information from the CAlbum object Sets the album in the music info tag and uses its information to set the label and album-specific properties. @@ -521,14 +484,12 @@ bool m_bLabelPreformated; std::string m_mimetype; std::string m_extrainfo; - bool m_doContentLookup; MUSIC_INFO::CMusicInfoTag* m_musicInfoTag; CVideoInfoTag* m_videoInfoTag; EPG::CEpgInfoTagPtr m_epgInfoTag; PVR::CPVRChannelPtr m_pvrChannelInfoTag; PVR::CPVRRecordingPtr m_pvrRecordingInfoTag; PVR::CPVRTimerInfoTagPtr m_pvrTimerInfoTag; - PVR::CPVRRadioRDSInfoTagPtr m_pvrRadioRDSInfoTag; CPictureInfoTag* m_pictureInfoTag; bool m_bIsAlbum; @@ -626,7 +587,7 @@ void FilterCueItems(); void RemoveExtensions(); void SetFastLookup(bool fastLookup); - bool Contains(const std::string& fileName, bool ignoreURLOptions = false) const; + bool Contains(const std::string& fileName) const; bool GetFastLookup() const { return m_fastLookup; }; /*! \brief stack a CFileItemList diff -Nru kodi-16.1~git20160425.1001-final/xbmc/FileItemListModification.cpp kodi-15.2~git20151019.1039-final/xbmc/FileItemListModification.cpp --- kodi-16.1~git20160425.1001-final/xbmc/FileItemListModification.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/FileItemListModification.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -22,6 +22,8 @@ #include "playlists/SmartPlaylistFileItemListModifier.h" +using namespace std; + CFileItemListModification::CFileItemListModification() { m_modifiers.insert(new CSmartPlaylistFileItemListModifier()); @@ -29,13 +31,13 @@ CFileItemListModification::~CFileItemListModification() { - for (std::set::const_iterator modifier = m_modifiers.begin(); modifier != m_modifiers.end(); ++modifier) + for (set::const_iterator modifier = m_modifiers.begin(); modifier != m_modifiers.end(); ++modifier) delete *modifier; m_modifiers.clear(); } -CFileItemListModification& CFileItemListModification::GetInstance() +CFileItemListModification& CFileItemListModification::Get() { static CFileItemListModification instance; return instance; @@ -43,7 +45,7 @@ bool CFileItemListModification::CanModify(const CFileItemList &items) const { - for (std::set::const_iterator modifier = m_modifiers.begin(); modifier != m_modifiers.end(); ++modifier) + for (set::const_iterator modifier = m_modifiers.begin(); modifier != m_modifiers.end(); ++modifier) { if ((*modifier)->CanModify(items)) return true; @@ -55,7 +57,7 @@ bool CFileItemListModification::Modify(CFileItemList &items) const { bool result = false; - for (std::set::const_iterator modifier = m_modifiers.begin(); modifier != m_modifiers.end(); ++modifier) + for (set::const_iterator modifier = m_modifiers.begin(); modifier != m_modifiers.end(); ++modifier) result |= (*modifier)->Modify(items); return result; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/FileItemListModification.h kodi-15.2~git20151019.1039-final/xbmc/FileItemListModification.h --- kodi-16.1~git20160425.1001-final/xbmc/FileItemListModification.h 2015-11-02 01:00:13.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/FileItemListModification.h 2015-10-19 08:39:15.000000000 +0000 @@ -28,7 +28,7 @@ public: ~CFileItemListModification(); - static CFileItemListModification& GetInstance(); + static CFileItemListModification& Get(); virtual bool CanModify(const CFileItemList &items) const; virtual bool Modify(CFileItemList &items) const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/AddonsDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/AddonsDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/AddonsDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/AddonsDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,15 +21,12 @@ #include #include #include -#include #include "AddonsDirectory.h" #include "addons/AddonDatabase.h" #include "interfaces/generic/ScriptInvocationManager.h" #include "FileItem.h" #include "addons/AddonInstaller.h" #include "addons/PluginSource.h" -#include "addons/RepositoryUpdater.h" -#include "dialogs/GUIDialogOK.h" #include "guilib/TextureManager.h" #include "File.h" #include "SpecialProtocol.h" @@ -42,21 +39,22 @@ namespace XFILE { -CAddonsDirectory::CAddonsDirectory(void) {} +CAddonsDirectory::CAddonsDirectory(void) +{ +} -CAddonsDirectory::~CAddonsDirectory(void) {} +CAddonsDirectory::~CAddonsDirectory(void) +{} -const auto CATEGORY_INFO_PROVIDERS = "category.infoproviders"; -const auto CATEGORY_LOOK_AND_FEEL = "category.lookandfeel"; -const std::set dependencyTypes = { +const std::array dependencyTypes = { ADDON_VIZ_LIBRARY, ADDON_SCRAPER_LIBRARY, ADDON_SCRIPT_LIBRARY, ADDON_SCRIPT_MODULE, }; -const std::set infoProviderTypes = { +const std::array infoProviderTypes = { ADDON_SCRAPER_ALBUMS, ADDON_SCRAPER_ARTISTS, ADDON_SCRAPER_MOVIES, @@ -64,38 +62,10 @@ ADDON_SCRAPER_TVSHOWS, }; -const std::set lookAndFeelTypes = { - ADDON_SKIN, - ADDON_SCREENSAVER, - ADDON_RESOURCE_IMAGES, - ADDON_RESOURCE_LANGUAGE, - ADDON_RESOURCE_UISOUNDS, - ADDON_VIZ, -}; - -static bool IsInfoProviderType(TYPE type) -{ - return infoProviderTypes.find(type) != infoProviderTypes.end(); -} -static bool IsInfoProviderTypeAddon(const AddonPtr& addon) +static bool IsInfoProviderType(const AddonPtr& addon) { - return IsInfoProviderType(addon->Type()); -} - -static bool IsLookAndFeelType(TYPE type) -{ - return lookAndFeelTypes.find(type) != lookAndFeelTypes.end(); -} - -static bool IsLookAndFeelTypeAddon(const AddonPtr& addon) -{ - return IsLookAndFeelType(addon->Type()); -} - -static bool IsDependecyType(TYPE type) -{ - return dependencyTypes.find(type) != dependencyTypes.end(); + return std::find(infoProviderTypes.begin(), infoProviderTypes.end(), addon->Type()) != infoProviderTypes.end(); } static bool IsSystemAddon(const AddonPtr& addon) @@ -128,96 +98,90 @@ static void SetUpdateAvailProperties(CFileItemList &items) { - std::set outdated; - for (const auto& addon : CAddonMgr::GetInstance().GetOutdated()) - outdated.insert(addon->ID()); - + CAddonDatabase database; + database.Open(); for (int i = 0; i < items.Size(); ++i) { - if (outdated.find(items[i]->GetProperty("Addon.ID").asString()) != outdated.end()) + const std::string addonId = items[i]->GetProperty("Addon.ID").asString(); + if (!CAddonMgr::Get().IsAddonDisabled(addonId)) { - items[i]->SetProperty("Addon.Status", g_localizeStrings.Get(24068)); - items[i]->SetProperty("Addon.UpdateAvail", true); - } - } -} - -// Creates categories from addon types, if we have any addons with that type. -static void GenerateTypeListing(const CURL& path, const std::set& types, - const VECADDONS& addons, CFileItemList& items) -{ - for (const auto& type : types) - { - for (const auto& addon : addons) - { - if (addon->IsType(type)) + const AddonVersion installedVersion = AddonVersion(items[i]->GetProperty("Addon.Version").asString()); + AddonPtr repoAddon; + database.GetAddon(addonId, repoAddon); + if (repoAddon && repoAddon->Version() > installedVersion && + !database.IsAddonBlacklisted(addonId, repoAddon->Version().asString())) { - CFileItemPtr item(new CFileItem(TranslateType(type, true))); - CURL itemPath = path; - itemPath.SetFileName(TranslateType(type, false)); - item->SetPath(itemPath.Get()); - item->m_bIsFolder = true; - std::string thumb = GetIcon(type); - if (!thumb.empty() && g_TextureManager.HasTexture(thumb)) - item->SetArt("thumb", thumb); - items.Add(item); - break; + items[i]->SetProperty("Addon.Status", g_localizeStrings.Get(24068)); + items[i]->SetProperty("Addon.UpdateAvail", true); } } } } -//Creates the top-level category list -static void GenerateMainCategoryListing(const CURL& path, const VECADDONS& addons, - CFileItemList& items) +static void GenerateCategoryListing(const CURL& path, const VECADDONS& addons, CFileItemList& items) { - if (std::any_of(addons.begin(), addons.end(), IsInfoProviderTypeAddon)) + if (std::any_of(addons.begin(), addons.end(), IsInfoProviderType)) { CFileItemPtr item(new CFileItem(g_localizeStrings.Get(24993))); - item->SetPath(URIUtils::AddFileToFolder(path.Get(), CATEGORY_INFO_PROVIDERS)); + item->SetPath(URIUtils::AddFileToFolder(path.Get(), "group.infoproviders")); item->m_bIsFolder = true; const std::string thumb = "DefaultAddonInfoProvider.png"; if (g_TextureManager.HasTexture(thumb)) item->SetArt("thumb", thumb); items.Add(item); } - if (std::any_of(addons.begin(), addons.end(), IsLookAndFeelTypeAddon)) - { - CFileItemPtr item(new CFileItem(g_localizeStrings.Get(24997))); - item->SetPath(URIUtils::AddFileToFolder(path.Get(), CATEGORY_LOOK_AND_FEEL)); - item->m_bIsFolder = true; - const std::string thumb = "DefaultAddonLookAndFeel.png"; - if (g_TextureManager.HasTexture(thumb)) - item->SetArt("thumb", thumb); - items.Add(item); - } - - std::set uncategorized; for (unsigned int i = ADDON_UNKNOWN + 1; i < ADDON_MAX - 1; ++i) { const TYPE type = (TYPE)i; - if (!IsInfoProviderType(type) && !IsLookAndFeelType(type) && !IsDependecyType(type)) - uncategorized.insert(static_cast(i)); + if (std::find(dependencyTypes.begin(), dependencyTypes.end(), type) != dependencyTypes.end()) + continue; + if (std::find(infoProviderTypes.begin(), infoProviderTypes.end(), type) != infoProviderTypes.end()) + continue; + + for (unsigned int j = 0; j < addons.size(); ++j) + { + if (addons[j]->IsType(type)) + { + CFileItemPtr item(new CFileItem(TranslateType(type, true))); + item->SetPath(URIUtils::AddFileToFolder(path.Get(), TranslateType(type, false))); + item->m_bIsFolder = true; + std::string thumb = GetIcon(type); + if (!thumb.empty() && g_TextureManager.HasTexture(thumb)) + item->SetArt("thumb", thumb); + items.Add(item); + break; + } + } } - GenerateTypeListing(path, uncategorized, addons, items); } -//Creates sub-categories or addon list for a category -static void GenerateCategoryListing(const CURL& path, VECADDONS& addons, - CFileItemList& items) +static void GenerateAddonListingForCategory(const CURL& path, VECADDONS& addons, CFileItemList& items) { const std::string category = path.GetFileName(); - if (category == CATEGORY_INFO_PROVIDERS) + if (category == "group.infoproviders") { items.SetProperty("addoncategory", g_localizeStrings.Get(24993)); items.SetLabel(g_localizeStrings.Get(24993)); - GenerateTypeListing(path, infoProviderTypes, addons, items); - } - else if (category == CATEGORY_LOOK_AND_FEEL) - { - items.SetProperty("addoncategory", g_localizeStrings.Get(24997)); - items.SetLabel(g_localizeStrings.Get(24997)); - GenerateTypeListing(path, lookAndFeelTypes, addons, items); + + for (const auto& type : infoProviderTypes) + { + for (const auto& addon : addons) + { + if (addon->IsType(type)) + { + CFileItemPtr item(new CFileItem(TranslateType(type, true))); + CURL itemPath = path; + itemPath.SetFileName(TranslateType(type, false)); + item->SetPath(itemPath.Get()); + item->m_bIsFolder = true; + std::string thumb = GetIcon(type); + if (!thumb.empty() && g_TextureManager.HasTexture(thumb)) + item->SetArt("thumb", thumb); + items.Add(item); + break; + } + } + } } else { // fallback to addon type @@ -253,8 +217,8 @@ items.SetLabel(g_localizeStrings.Get(24998)); VECADDONS addons; - CAddonMgr::GetInstance().GetAllAddons(addons, true); - CAddonMgr::GetInstance().GetAllAddons(addons, false); + CAddonMgr::Get().GetAllAddons(addons, true); + CAddonMgr::Get().GetAllAddons(addons, false); addons.erase(std::remove_if(addons.begin(), addons.end(), std::not1(std::ptr_fun(IsUserInstalled))), addons.end()); if (addons.empty()) @@ -263,7 +227,7 @@ const std::string category = path.GetFileName(); if (category.empty()) { - GenerateMainCategoryListing(path, addons, items); + GenerateCategoryListing(path, addons, items); //"All" node CFileItemPtr item(new CFileItem()); @@ -282,7 +246,7 @@ } else { - GenerateCategoryListing(path, addons, items); + GenerateAddonListingForCategory(path, addons, items); SetUpdateAvailProperties(items); } } @@ -290,8 +254,8 @@ static void DependencyAddons(const CURL& path, CFileItemList &items) { VECADDONS all; - CAddonMgr::GetInstance().GetAllAddons(all, true); - CAddonMgr::GetInstance().GetAllAddons(all, false); + CAddonMgr::Get().GetAllAddons(all, true); + CAddonMgr::Get().GetAllAddons(all, false); VECADDONS deps; std::copy_if(all.begin(), all.end(), std::back_inserter(deps), @@ -304,8 +268,8 @@ static void OrphanedAddons(const CURL& path, CFileItemList &items) { VECADDONS all; - CAddonMgr::GetInstance().GetAllAddons(all, true); - CAddonMgr::GetInstance().GetAllAddons(all, false); + CAddonMgr::Get().GetAllAddons(all, true); + CAddonMgr::Get().GetAllAddons(all, false); VECADDONS orphaned; std::copy_if(all.begin(), all.end(), std::back_inserter(orphaned), @@ -317,20 +281,23 @@ static bool HaveOrphaned() { VECADDONS addons; - CAddonMgr::GetInstance().GetAllAddons(addons, true); - CAddonMgr::GetInstance().GetAllAddons(addons, false); + CAddonMgr::Get().GetAllAddons(addons, true); + CAddonMgr::Get().GetAllAddons(addons, false); return std::any_of(addons.begin(), addons.end(), [&](const AddonPtr& _){ return IsOrphaned(_, addons); }); } static void OutdatedAddons(const CURL& path, CFileItemList &items) { - VECADDONS addons = CAddonMgr::GetInstance().GetOutdated(); + VECADDONS addons; + // Wait for running update to complete + CAddonInstaller::Get().UpdateRepos(false, true); + CAddonMgr::Get().GetAllOutdatedAddons(addons); CAddonsDirectory::GenerateAddonListing(path, addons, items, g_localizeStrings.Get(24043)); if (items.Size() > 1) { - CFileItemPtr item(new CFileItem("addons://update_all/", false)); + CFileItemPtr item(new CFileItem("addons://update_all/", true)); item->SetLabel(g_localizeStrings.Get(24122)); item->SetSpecialSort(SortSpecialOnTop); items.Add(item); @@ -340,10 +307,10 @@ static void RunningAddons(const CURL& path, CFileItemList &items) { VECADDONS addons; - CAddonMgr::GetInstance().GetAddons(ADDON_SERVICE, addons); + CAddonMgr::Get().GetAddons(ADDON_SERVICE, addons); addons.erase(std::remove_if(addons.begin(), addons.end(), - [](const AddonPtr& addon){ return !CScriptInvocationManager::GetInstance().IsRunning(addon->LibPath()); }), addons.end()); + [](const AddonPtr& addon){ return !CScriptInvocationManager::Get().IsRunning(addon->LibPath()); }), addons.end()); CAddonsDirectory::GenerateAddonListing(path, addons, items, g_localizeStrings.Get(24994)); } @@ -363,33 +330,23 @@ else { AddonPtr addon; - if (!CAddonMgr::GetInstance().GetAddon(repo, addon, ADDON_REPOSITORY)) + if (!CAddonMgr::Get().GetAddon(repo, addon, ADDON_REPOSITORY)) return false; - + //Wait for runnig update to complete + CAddonInstaller::Get().UpdateRepos(false, true); CAddonDatabase database; database.Open(); - if (!database.GetRepositoryContent(addon->ID(), addons)) - { - //Repo content is invalid. Ask for update and wait. - CRepositoryUpdater::GetInstance().CheckForUpdates(std::static_pointer_cast(addon)); - CRepositoryUpdater::GetInstance().Await(); - - if (!database.GetRepositoryContent(addon->ID(), addons)) - { - CGUIDialogOK::ShowAndGetInput(CVariant{addon->Name()}, CVariant{24991}); - return false; - } - } - + if (!database.GetRepository(addon->ID(), addons)) + return false; items.SetProperty("reponame", addon->Name()); items.SetLabel(addon->Name()); } const std::string category = path.GetFileName(); if (category.empty()) - GenerateMainCategoryListing(path, addons, items); - else GenerateCategoryListing(path, addons, items); + else + GenerateAddonListingForCategory(path, addons, items); return true; } @@ -399,15 +356,18 @@ items.SetLabel(g_localizeStrings.Get(24033)); VECADDONS addons; - CAddonMgr::GetInstance().GetAddons(ADDON_REPOSITORY, addons, true); + CAddonMgr::Get().GetAddons(ADDON_REPOSITORY, addons, true); if (addons.empty()) return true; else if (addons.size() == 1) return Browse(CURL("addons://" + addons[0]->ID()), items); - CFileItemPtr item(new CFileItem("addons://all/", true)); - item->SetLabel(g_localizeStrings.Get(24087)); - item->SetSpecialSort(SortSpecialOnTop); - items.Add(item); + else + { + CFileItemPtr item(new CFileItem("addons://all/", true)); + item->SetLabel(g_localizeStrings.Get(24087)); + item->SetSpecialSort(SortSpecialOnTop); + items.Add(item); + } for (const auto& repo : addons) { @@ -415,7 +375,6 @@ CAddonDatabase::SetPropertiesFromAddon(repo, item); items.Add(item); } - items.SetContent("addons"); return true; } @@ -451,7 +410,7 @@ CURL path(tmp); const std::string endpoint = path.GetHostName(); items.ClearProperties(); - items.SetCacheToDisc(CFileItemList::CACHE_NEVER); + items.SetContent("addons"); items.SetPath(path.Get()); if (endpoint == "user") @@ -469,22 +428,13 @@ OrphanedAddons(path, items); return true; } - // PVR & adsp hardcodes this view so keep for compatibility - else if (endpoint == "disabled") + //Pvr hardcodes this view so keep for compatibility + else if (endpoint == "disabled" && path.GetFileName() == "xbmc.pvrclient") { VECADDONS addons; - ADDON::TYPE type; - - if (path.GetFileName() == "xbmc.pvrclient") - type = ADDON_PVRDLL; - else if (path.GetFileName() == "kodi.adsp") - type = ADDON_ADSPDLL; - else - type = ADDON_UNKNOWN; - - if (type != ADDON_UNKNOWN && CAddonMgr::GetInstance().GetAddons(type, addons, false)) + if (CAddonMgr::Get().GetAddons(ADDON_PVRDLL, addons, false)) { - CAddonsDirectory::GenerateAddonListing(path, addons, items, TranslateType(type, true)); + CAddonsDirectory::GenerateAddonListing(path, addons, items, TranslateType(ADDON_PVRDLL, true)); return true; } return false; @@ -531,14 +481,15 @@ return url.GetHostName() == "repos" || url.GetHostName() == "all" || url.GetHostName() == "search" - || CAddonMgr::GetInstance().GetAddon(url.GetHostName(), tmp, ADDON_REPOSITORY); + || CAddonMgr::Get().GetAddon(url.GetHostName(), tmp, ADDON_REPOSITORY); } void CAddonsDirectory::GenerateAddonListing(const CURL &path, - const VECADDONS& addons, CFileItemList &items, const std::string label) + const VECADDONS& addons, + CFileItemList &items, + const std::string label) { items.ClearItems(); - items.SetContent("addons"); items.SetLabel(label); for (const auto& addon : addons) { @@ -547,9 +498,9 @@ CFileItemPtr pItem = FileItemFromAddon(addon, itemPath.Get(), false); AddonPtr installedAddon; - if (CAddonMgr::GetInstance().GetAddon(addon->ID(), installedAddon)) + if (CAddonMgr::Get().GetAddon(addon->ID(), installedAddon)) pItem->SetProperty("Addon.Status",g_localizeStrings.Get(305)); - else if (CAddonMgr::GetInstance().IsAddonDisabled(addon->ID())) + else if (CAddonMgr::Get().IsAddonDisabled(addon->ID())) pItem->SetProperty("Addon.Status",g_localizeStrings.Get(24023)); if (addon->Props().broken == "DEPSNOTMET") @@ -566,8 +517,7 @@ } } -CFileItemPtr CAddonsDirectory::FileItemFromAddon(const AddonPtr &addon, - const std::string& path, bool folder) +CFileItemPtr CAddonsDirectory::FileItemFromAddon(const AddonPtr &addon, const std::string& path, bool folder) { if (!addon) return CFileItemPtr(); @@ -594,7 +544,7 @@ return false; VECADDONS tempAddons; - CAddonMgr::GetInstance().GetAddons(ADDON_PLUGIN, tempAddons); + CAddonMgr::Get().GetAddons(ADDON_PLUGIN, tempAddons); for (unsigned i=0; i(tempAddons[i]); @@ -602,7 +552,7 @@ addons.push_back(tempAddons[i]); } tempAddons.clear(); - CAddonMgr::GetInstance().GetAddons(ADDON_SCRIPT, tempAddons); + CAddonMgr::Get().GetAddons(ADDON_SCRIPT, tempAddons); for (unsigned i=0; i(tempAddons[i]); @@ -653,6 +603,6 @@ item->SetSpecialSort(SortSpecialOnBottom); return item; } - + } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/AndroidAppDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/AndroidAppDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/AndroidAppDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/AndroidAppDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,6 +33,7 @@ #include "CompileInfo.h" using namespace XFILE; +using namespace std; CAndroidAppDirectory::CAndroidAppDirectory(void) { @@ -53,7 +54,7 @@ if (dirname == "apps") { - std::vector applications = CXBMCApp::GetApplications(); + vector applications = CXBMCApp::GetApplications(); if (applications.empty()) { CLog::Log(LOGERROR, "CAndroidAppDirectory::GetDirectory Application lookup listing failed"); @@ -69,7 +70,6 @@ pItem->SetPath(path); pItem->SetLabel((*i).packageLabel); pItem->SetArt("thumb", path+".png"); - pItem->m_dwSize = -1; // No size items.Add(pItem); } return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/AndroidAppFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/AndroidAppFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/AndroidAppFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/AndroidAppFile.cpp 2014-12-18 01:01:56.000000000 +0000 @@ -23,21 +23,13 @@ #if defined(TARGET_ANDROID) #include "AndroidAppFile.h" -#include "android/activity/XBMCApp.h" #include #include "Util.h" #include "URL.h" #include "utils/log.h" #include "utils/URIUtils.h" #include -#include -#include "android/jni/Context.h" -#include "android/jni/Build.h" -#include "android/jni/DisplayMetrics.h" -#include "android/jni/Resources.h" -#include "android/jni/Bitmap.h" -#include "android/jni/BitmapDrawable.h" -#include "android/jni/PackageManager.h" +#include "android/activity/XBMCApp.h" using namespace XFILE; CFileAndroidApp::CFileAndroidApp(void) @@ -54,18 +46,14 @@ bool CFileAndroidApp::Open(const CURL& url) { m_url = url; - m_packageName = URIUtils::GetFileName(url.Get()); - m_packageName = m_packageName.substr(0, m_packageName.size() - 4); + m_appname = URIUtils::GetFileName(url.Get()); + m_appname = m_appname.substr(0, m_appname.size() - 4); std::vector applications = CXBMCApp::GetApplications(); for(std::vector::iterator i = applications.begin(); i != applications.end(); ++i) { - if ((*i).packageName == m_packageName) - { - m_packageLabel = i->packageLabel; - m_icon = i->icon; + if ((*i).packageName == m_appname) return true; - } } return false; @@ -86,50 +74,31 @@ return false; } -unsigned int CFileAndroidApp::ReadIcon(unsigned char** lpBuf, unsigned int* width, unsigned int* height) +ssize_t CFileAndroidApp::Read(void* lpBuf, size_t uiBufSize) { - JNIEnv* env = xbmc_jnienv(); - void *bitmapBuf = NULL; - - CJNIBitmapDrawable bmp; - if (CJNIBuild::SDK_INT >= 15 && m_icon) - { - int density = CJNIDisplayMetrics::DENSITY_XHIGH; - if (CJNIBuild::SDK_INT >= 18) - density = CJNIDisplayMetrics::DENSITY_XXXHIGH; - else if (CJNIBuild::SDK_INT >= 16) - density = CJNIDisplayMetrics::DENSITY_XXHIGH; - CJNIResources res = CJNIContext::GetPackageManager().getResourcesForApplication(m_packageName); - if (res) - bmp = res.getDrawableForDensity(m_icon, density); - } - else - bmp = (CJNIBitmapDrawable)CJNIContext::GetPackageManager().getApplicationIcon(m_packageName); - - CJNIBitmap bitmap(bmp.getBitmap()); - AndroidBitmapInfo info; - AndroidBitmap_getInfo(env, bitmap.get_raw(), &info); - if (!info.width || !info.height) - return 0; + if(CXBMCApp::GetIcon(m_appname, lpBuf, uiBufSize)) + return uiBufSize; // FIXME: not full buffer may be used + return -1; +} - *width = info.width; - *height = info.height; +void CFileAndroidApp::Close() +{ +} - int imgsize = *width * *height * 4; - *lpBuf = new unsigned char[imgsize]; +int64_t CFileAndroidApp::GetLength() +{ + CXBMCApp::GetIconSize(m_appname, &m_iconWidth, &m_iconHeight); + return m_iconWidth * m_iconHeight * 4; +} - AndroidBitmap_lockPixels(env, bitmap.get_raw(), &bitmapBuf); - if (bitmapBuf) - { - memcpy(*lpBuf, bitmapBuf, imgsize); - AndroidBitmap_unlockPixels(env, bitmap.get_raw()); - return imgsize; - } - return 0; +unsigned int CFileAndroidApp::GetIconWidth() +{ + return m_iconWidth; } -void CFileAndroidApp::Close() +unsigned int CFileAndroidApp::GetIconHeight() { + return m_iconHeight; } int CFileAndroidApp::GetChunkSize() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/AndroidAppFile.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/AndroidAppFile.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/AndroidAppFile.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/AndroidAppFile.h 2014-12-18 01:01:56.000000000 +0000 @@ -24,8 +24,6 @@ #if defined(TARGET_ANDROID) #include "IFile.h" #include "URL.h" -#include "string.h" - namespace XFILE { class CFileAndroidApp : public IFile @@ -39,24 +37,25 @@ virtual int Stat(const CURL& url, struct __stat64* buffer); /*! \brief Return 32bit rgba raw bitmap. */ - virtual ssize_t Read(void* lpBuf, size_t uiBufSize) {return 0;} + virtual ssize_t Read(void* lpBuf, size_t uiBufSize); virtual void Close(); - virtual int64_t GetLength() {return 0;} - virtual int64_t Seek(int64_t, int) {return -1;} - virtual int64_t GetPosition() {return 0;} + virtual int64_t GetLength(); + virtual int64_t Seek(int64_t, int) {return -1;}; + virtual int64_t GetPosition() {return 0;}; virtual int GetChunkSize(); virtual int IoControl(EIoControl request, void* param); - virtual unsigned int ReadIcon(unsigned char **lpBuf, unsigned int* width, unsigned int* height); + /*! \brief Only valid after GetLength() has been called, usually by Open(). */ + unsigned int GetIconWidth(); + /*! \brief Only valid after GetLength() has been called, usually by Open(). */ + unsigned int GetIconHeight(); protected: bool IsValidFile(const CURL& url); private: CURL m_url; - std::string m_packageName; - std::string m_packageLabel; - int m_icon; + std::string m_appname; int m_iconWidth; int m_iconHeight; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/CurlFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/CurlFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/CurlFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/CurlFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -754,19 +754,19 @@ else if( url2.IsProtocol("http") || url2.IsProtocol("https")) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_NETWORK_USEHTTPPROXY) - && !CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYSERVER).empty() - && CSettings::GetInstance().GetInt(CSettings::SETTING_NETWORK_HTTPPROXYPORT) > 0 + if (CSettings::Get().GetBool("network.usehttpproxy") + && !CSettings::Get().GetString("network.httpproxyserver").empty() + && CSettings::Get().GetInt("network.httpproxyport") > 0 && m_proxy.empty()) { - m_proxy = CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYSERVER); - m_proxy += StringUtils::Format(":%d", CSettings::GetInstance().GetInt(CSettings::SETTING_NETWORK_HTTPPROXYPORT)); - if (CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYUSERNAME).length() > 0 && m_proxyuserpass.empty()) + m_proxy = CSettings::Get().GetString("network.httpproxyserver"); + m_proxy += StringUtils::Format(":%d", CSettings::Get().GetInt("network.httpproxyport")); + if (CSettings::Get().GetString("network.httpproxyusername").length() > 0 && m_proxyuserpass.empty()) { - m_proxyuserpass = CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYUSERNAME); - m_proxyuserpass += ":" + CSettings::GetInstance().GetString(CSettings::SETTING_NETWORK_HTTPPROXYPASSWORD); + m_proxyuserpass = CSettings::Get().GetString("network.httpproxyusername"); + m_proxyuserpass += ":" + CSettings::Get().GetString("network.httpproxypassword"); } - m_proxytype = (ProxyType)CSettings::GetInstance().GetInt(CSettings::SETTING_NETWORK_HTTPPROXYTYPE); + m_proxytype = (ProxyType)CSettings::Get().GetInt("network.httpproxytype"); CLog::Log(LOGDEBUG, "Using proxy %s, type %d", m_proxy.c_str(), proxyType2CUrlProxyType[m_proxytype]); } @@ -940,12 +940,6 @@ bool CCurlFile::Open(const CURL& url) { - if (!g_curlInterface.IsLoaded()) - { - CLog::Log(LOGERROR, "CurlFile::Open: curl interface not loaded"); - return false; - } - m_opened = true; m_seekable = true; @@ -1578,9 +1572,6 @@ CLog::Log(LOGNOTICE, "CCurlFile::FillBuffer - Reconnect, (re)try %i", retry); - // Progressive sleep. TODO: Find a better optimum for this? - Sleep( (retry - 1) * 1000); - // Connect + seek to current position (again) SetResume(); g_curlInterface.multi_add_handle(m_multiHandle, m_easyHandle); @@ -1616,33 +1607,11 @@ do { - /* On success the value of maxfd is guaranteed to be >= -1. We call - * select(maxfd + 1, ...); specially in case of (maxfd == -1) there are - * no fds ready yet so we call select(0, ...) --or Sleep() on Windows-- - * to sleep 100ms, which is the minimum suggested value in the - * curl_multi_fdset() doc. - */ - if (maxfd == -1) - { -#ifdef TARGET_WINDOWS - /* Windows does not support using select() for sleeping without a dummy - * socket. Instead use Windows' Sleep() and sleep for 100ms which is the - * minimum suggested value in the curl_multi_fdset() doc. - */ - Sleep(100); - rc = 0; -#else - /* Portable sleep for platforms other than Windows. */ - struct timeval wait = { 0, 100 * 1000 }; /* 100ms */ - rc = select(0, NULL, NULL, NULL, &wait); -#endif - } - else - { - unsigned int time_left = endTime.MillisLeft(); - struct timeval wait = { (int)time_left / 1000, ((int)time_left % 1000) * 1000 }; - rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &wait); - } + unsigned int time_left = endTime.MillisLeft(); + struct timeval t = { (int)time_left / 1000, ((int)time_left % 1000) * 1000 }; + + // Wait until data is available or a timeout occurs. + rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &t); #ifdef TARGET_WINDOWS } while(rc == SOCKET_ERROR && WSAGetLastError() == WSAEINTR); #else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/DAVFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/DAVFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/DAVFile.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/DAVFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -34,7 +34,7 @@ CDAVFile::CDAVFile(void) : CCurlFile() - , m_lastResponseCode(0) + , lastResponseCode(0) { } @@ -60,15 +60,15 @@ SetCommonOptions(m_state); SetRequestHeaders(m_state); - m_lastResponseCode = m_state->Connect(m_bufferSize); - if (m_lastResponseCode < 0 || m_lastResponseCode >= 400) + lastResponseCode = m_state->Connect(m_bufferSize); + if( lastResponseCode < 0 || lastResponseCode >= 400) return false; char* efurl; if (CURLE_OK == g_curlInterface.easy_getinfo(m_state->m_easyHandle, CURLINFO_EFFECTIVE_URL,&efurl) && efurl) m_url = efurl; - if (m_lastResponseCode == 207) + if (lastResponseCode == 207) { std::string strResponse; ReadData(strResponse); @@ -78,7 +78,7 @@ if (!davResponse.Parse(strResponse)) { - CLog::Log(LOGERROR, "CDAVFile::Execute - Unable to process dav response (%s)", CURL(m_url).GetRedacted().c_str()); + CLog::Log(LOGERROR, "%s - Unable to process dav response (%s)", __FUNCTION__, m_url.c_str()); Close(); return false; } @@ -96,8 +96,8 @@ { if (rxCode.GetSubCount()) { - m_lastResponseCode = atoi(rxCode.GetMatch(1).c_str()); - if (m_lastResponseCode < 0 || m_lastResponseCode >= 400) + lastResponseCode = atoi(rxCode.GetMatch(1).c_str()); + if( lastResponseCode < 0 || lastResponseCode >= 400) return false; } } @@ -119,10 +119,9 @@ dav.SetCustomRequest(strRequest); - CLog::Log(LOGDEBUG, "CDAVFile::Delete - Execute DELETE (%s)", url.GetRedacted().c_str()); if (!dav.Execute(url)) { - CLog::Log(LOGERROR, "CDAVFile::Delete - Unable to delete dav resource (%s)", url.GetRedacted().c_str()); + CLog::Log(LOGERROR, "%s - Unable to delete dav resource (%s)", __FUNCTION__, url.Get().c_str()); return false; } @@ -146,10 +145,9 @@ dav.SetCustomRequest(strRequest); dav.SetRequestHeader("Destination", url2.GetWithoutUserDetails()); - CLog::Log(LOGDEBUG, "CDAVFile::Rename - Execute MOVE (%s -> %s)", url.GetRedacted().c_str(), url2.GetRedacted().c_str()); if (!dav.Execute(url)) { - CLog::Log(LOGERROR, "CDAVFile::Rename - Unable to rename dav resource (%s -> %s)", url.GetRedacted().c_str(), url2.GetRedacted().c_str()); + CLog::Log(LOGERROR, "%s - Unable to rename dav resource (%s)", __FUNCTION__, url.Get().c_str()); return false; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/DAVFile.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/DAVFile.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/DAVFile.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/DAVFile.h 2015-10-19 08:39:16.000000000 +0000 @@ -34,9 +34,9 @@ virtual bool Delete(const CURL& url); virtual bool Rename(const CURL& url, const CURL& urlnew); - virtual int GetLastResponseCode() { return m_lastResponseCode; } + virtual int GetLastResponseCode() { return lastResponseCode; } private: - int m_lastResponseCode; + int lastResponseCode; }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/Directorization.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/Directorization.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/Directorization.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/Directorization.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,145 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include - -#include "FileItem.h" -#include "URL.h" -#include "utils/CharsetConverter.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" - -namespace XFILE -{ - /** - * \brief Method definition to convert an entry to a CFileItemPtr. - * - * \param entry The entry to convert to a CFileItemPtr - * \param label The label of the entry - * \param path The path of the entry - * \param isFolder Whether the entry is a folder or not - * \return The CFileItemPtr object created from the given entry and data. - */ - template - using DirectorizeEntryToFileItemFunction = CFileItemPtr(*)(const TEntry& entry, const std::string& label, const std::string& path, bool isFolder); - - template - using DirectorizeEntry = std::pair; - template - using DirectorizeEntries = std::vector>; - - /** - * \brief Analyzes the given entry list from the given URL and turns them into files and directories on one directory hierarchy. - * - * \param url URL of the directory hierarchy to build - * \param entries Entries to analyze and turn into files and directories - * \param converter Converter function to convert an entry into a CFileItemPtr - * \param items Resulting item list - */ - template - static void Directorize(const CURL& url, const DirectorizeEntries& entries, DirectorizeEntryToFileItemFunction converter, CFileItemList& items) - { - if (url.Get().empty() || entries.empty()) - return; - - std::string options = url.GetOptions(); - std::string filePath = url.GetFileName(); - - CURL baseUrl(url); - baseUrl.SetOptions(""); // delete options to have a clean path to add stuff too - baseUrl.SetFileName(""); // delete filename too as our names later will contain it - - std::string basePath = baseUrl.Get(); - URIUtils::AddSlashAtEnd(basePath); - - std::vector filePathTokens; - if (!filePath.empty()) - StringUtils::Tokenize(filePath, filePathTokens, "/"); - - bool fastLookup = items.GetFastLookup(); - items.SetFastLookup(true); - for (const auto& entry : entries) - { - std::string entryPath = entry.first; - std::string entryFileName = entryPath; - StringUtils::Replace(entryFileName, '\\', '/'); - - // skip the requested entry - if (entryFileName == filePath) - continue; - - std::vector pathTokens; - StringUtils::Tokenize(entryFileName, pathTokens, "/"); - - // ignore any entries in lower directory hierarchies - if (pathTokens.size() < filePathTokens.size() + 1) - continue; - - // ignore any entries in different directory hierarchies - bool ignoreItem = false; - entryFileName.clear(); - for (auto filePathToken = filePathTokens.begin(); filePathToken != filePathTokens.end(); ++filePathToken) - { - if (*filePathToken != pathTokens[std::distance(filePathTokens.begin(), filePathToken)]) - { - ignoreItem = true; - break; - } - entryFileName = URIUtils::AddFileToFolder(entryFileName, *filePathToken); - } - if (ignoreItem) - continue; - - entryFileName = URIUtils::AddFileToFolder(entryFileName, pathTokens[filePathTokens.size()]); - char c = entryPath[entryFileName.size()]; - if (c == '/' || c == '\\') - URIUtils::AddSlashAtEnd(entryFileName); - - std::string itemPath = URIUtils::AddFileToFolder(basePath, entryFileName) + options; - bool isFolder = false; - if (URIUtils::HasSlashAtEnd(entryFileName)) // this is a directory - { - // check if the directory has already been added - if (items.Contains(itemPath)) // already added - continue; - - isFolder = true; - URIUtils::AddSlashAtEnd(itemPath); - } - - // determine the entry's filename - std::string label = pathTokens[filePathTokens.size()]; - g_charsetConverter.unknownToUTF8(label); - - // convert the entry into a CFileItem - CFileItemPtr item = converter(entry.second, label, itemPath, isFolder); - item->SetPath(itemPath); - item->m_bIsFolder = isFolder; - if (isFolder) - item->m_dwSize = 0; - - items.Add(item); - } - items.SetFastLookup(fastLookup); - } -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/DirectoryCache.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/DirectoryCache.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/DirectoryCache.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/DirectoryCache.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,14 +24,11 @@ #include "utils/log.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" -#include "URL.h" #include "climits" #include -// Maximum number of directories to keep in our cache -#define MAX_CACHED_DIRS 50 - +using namespace std; using namespace XFILE; CDirectoryCache::CDir::CDir(DIR_CACHE_TYPE cacheType) @@ -39,7 +36,7 @@ m_cacheType = cacheType; m_lastAccess = 0; m_Items = new CFileItemList; - m_Items->SetFastLookup(false); + m_Items->SetFastLookup(true); } CDirectoryCache::CDir::~CDir() @@ -69,8 +66,7 @@ { CSingleLock lock (m_cs); - // Get rid of any URL options, else the compare may be wrong - std::string storedPath = CURL(strPath).GetWithoutOptions(); + std::string storedPath = strPath; URIUtils::RemoveSlashAtEnd(storedPath); ciCache i = m_cache.find(storedPath); @@ -109,8 +105,7 @@ // this is the best solution for now. CSingleLock lock (m_cs); - // Get rid of any URL options, else the compare may be wrong - std::string storedPath = CURL(strPath).GetWithoutOptions(); + std::string storedPath = strPath; URIUtils::RemoveSlashAtEnd(storedPath); ClearDirectory(storedPath); @@ -120,23 +115,19 @@ CDir* dir = new CDir(cacheType); dir->m_Items->Copy(items); dir->SetLastAccess(m_accessCounter); - m_cache.insert(std::pair(storedPath, dir)); + m_cache.insert(pair(storedPath, dir)); } void CDirectoryCache::ClearFile(const std::string& strFile) { - // Get rid of any URL options, else the compare may be wrong - std::string strFile2 = CURL(strFile).GetWithoutOptions(); - - ClearDirectory(URIUtils::GetDirectory(strFile2)); + ClearDirectory(URIUtils::GetDirectory(strFile)); } void CDirectoryCache::ClearDirectory(const std::string& strPath) { CSingleLock lock (m_cs); - // Get rid of any URL options, else the compare may be wrong - std::string storedPath = CURL(strPath).GetWithoutOptions(); + std::string storedPath = strPath; URIUtils::RemoveSlashAtEnd(storedPath); iCache i = m_cache.find(storedPath); @@ -148,8 +139,7 @@ { CSingleLock lock (m_cs); - // Get rid of any URL options, else the compare may be wrong - std::string storedPath = CURL(strPath).GetWithoutOptions(); + std::string storedPath = strPath; URIUtils::RemoveSlashAtEnd(storedPath); iCache i = m_cache.begin(); @@ -166,8 +156,7 @@ { CSingleLock lock (m_cs); - // Get rid of any URL options, else the compare may be wrong - std::string strPath = URIUtils::GetDirectory(CURL(strFile).GetWithoutOptions()); + std::string strPath = URIUtils::GetDirectory(strFile); URIUtils::RemoveSlashAtEnd(strPath); ciCache i = m_cache.find(strPath); @@ -185,8 +174,7 @@ CSingleLock lock (m_cs); bInCache = false; - // Get rid of any URL options, else the compare may be wrong - std::string strPath = CURL(strFile).GetWithoutOptions(); + std::string strPath(strFile); URIUtils::RemoveSlashAtEnd(strPath); std::string storedPath = URIUtils::GetDirectory(strPath); URIUtils::RemoveSlashAtEnd(storedPath); @@ -200,7 +188,7 @@ #ifdef _DEBUG m_cacheHits++; #endif - return (URIUtils::PathEquals(strPath, storedPath) || dir->m_Items->Contains(strFile, true)); + return (URIUtils::PathEquals(strPath, storedPath) || dir->m_Items->Contains(strFile)); } #ifdef _DEBUG m_cacheMisses++; @@ -218,9 +206,9 @@ Delete(i++); } -void CDirectoryCache::InitCache(std::set& dirs) +void CDirectoryCache::InitCache(set& dirs) { - std::set::iterator it; + set::iterator it; for (it = dirs.begin(); it != dirs.end(); ++it) { const std::string& strDir = *it; @@ -230,7 +218,7 @@ } } -void CDirectoryCache::ClearCache(std::set& dirs) +void CDirectoryCache::ClearCache(set& dirs) { iCache i = m_cache.begin(); while (i != m_cache.end()) @@ -245,6 +233,7 @@ void CDirectoryCache::CheckIfFull() { CSingleLock lock (m_cs); + static const unsigned int max_cached_dirs = 10; // find the last accessed folder, and remove if the number of cached folders is too many iCache lastAccessed = m_cache.end(); @@ -259,7 +248,7 @@ numCached++; } } - if (lastAccessed != m_cache.end() && numCached >= MAX_CACHED_DIRS) + if (lastAccessed != m_cache.end() && numCached >= max_cached_dirs) Delete(lastAccessed); } @@ -282,7 +271,7 @@ for (ciCache i = m_cache.begin(); i != m_cache.end(); i++) { CDir *dir = i->second; - oldest = std::min(oldest, dir->GetLastAccess()); + oldest = min(oldest, dir->GetLastAccess()); numItems += dir->m_Items->Size(); numDirs++; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/Directory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/Directory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/Directory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/Directory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -35,6 +35,7 @@ #include "utils/URIUtils.h" #include "URL.h" +using namespace std; using namespace XFILE; #define TIME_TO_BUSY_DIALOG 500 @@ -171,32 +172,29 @@ if(!get.Wait(TIME_TO_BUSY_DIALOG)) { CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); - if (dialog) - { - dialog->Open(); + dialog->Show(); - while(!get.Wait(10)) - { - CSingleLock lock(g_graphicsContext); + while(!get.Wait(10)) + { + CSingleLock lock(g_graphicsContext); - // update progress - float progress = pDirectory->GetProgress(); - if (progress > 0) - dialog->SetProgress(progress); - - if (dialog->IsCanceled()) - { - cancel = true; - pDirectory->CancelDirectory(); - break; - } + // update progress + float progress = pDirectory->GetProgress(); + if (progress > 0) + dialog->SetProgress(progress); - lock.Leave(); // prevent an occasional deadlock on exit - g_windowManager.ProcessRenderLoop(false); + if(dialog->IsCanceled()) + { + cancel = true; + pDirectory->CancelDirectory(); + break; } - dialog->Close(); + lock.Leave(); // prevent an occasional deadlock on exit + g_windowManager.ProcessRenderLoop(false); } + if(dialog) + dialog->Close(); } result = get.GetDirectory(items); } @@ -236,7 +234,7 @@ } // filter hidden files // TODO: we shouldn't be checking the gui setting here, callers should use getHidden instead - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWHIDDEN) && !(hints.flags & DIR_FLAG_GET_HIDDEN)) + if (!CSettings::Get().GetBool("filelists.showhidden") && !(hints.flags & DIR_FLAG_GET_HIDDEN)) { for (int i = 0; i < items.Size(); ++i) { @@ -287,7 +285,7 @@ try { CURL realURL = URIUtils::SubstitutePath(url); - std::unique_ptr pDirectory(CDirectoryFactory::Create(realURL)); + unique_ptr pDirectory(CDirectoryFactory::Create(realURL)); if (pDirectory.get()) if(pDirectory->Create(realURL)) return true; @@ -322,7 +320,7 @@ if (bPathInCache) return false; } - std::unique_ptr pDirectory(CDirectoryFactory::Create(realURL)); + unique_ptr pDirectory(CDirectoryFactory::Create(realURL)); if (pDirectory.get()) return pDirectory->Exists(realURL); } @@ -346,7 +344,7 @@ try { CURL realURL = URIUtils::SubstitutePath(url); - std::unique_ptr pDirectory(CDirectoryFactory::Create(realURL)); + unique_ptr pDirectory(CDirectoryFactory::Create(realURL)); if (pDirectory.get()) if(pDirectory->Remove(realURL)) { @@ -370,7 +368,7 @@ CFileItemPtr pItem=items[i]; if (!pItem->m_bIsFolder && pItem->IsFileFolder(EFILEFOLDER_TYPE_ALWAYS)) { - std::unique_ptr pDirectory(CFileDirectoryFactory::Create(pItem->GetURL(),pItem.get(),mask)); + unique_ptr pDirectory(CFileDirectoryFactory::Create(pItem->GetURL(),pItem.get(),mask)); if (pDirectory.get()) pItem->m_bIsFolder = true; else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/DirectoryFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/DirectoryFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/DirectoryFactory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/DirectoryFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -35,7 +35,6 @@ #include "VideoDatabaseDirectory.h" #include "FavouritesDirectory.h" #include "LibraryDirectory.h" -#include "EventsDirectory.h" #include "AddonsDirectory.h" #include "SourcesDirectory.h" #include "FTPDirectory.h" @@ -77,11 +76,12 @@ #if defined(TARGET_ANDROID) #include "APKDirectory.h" #endif -#include "XbtDirectory.h" #include "ZipDirectory.h" #ifdef HAS_FILESYSTEM_RAR #include "RarDirectory.h" #endif +#include "HDHomeRunDirectory.h" +#include "SlingboxDirectory.h" #include "FileItem.h" #include "URL.h" #include "RSSDirectory.h" @@ -112,7 +112,7 @@ */ IDirectory* CDirectoryFactory::Create(const CURL& url) { - if (!CWakeOnAccess::GetInstance().WakeUpHost(url)) + if (!CWakeOnAccess::Get().WakeUpHost(url)) return NULL; CFileItem item(url.Get(), false); @@ -150,7 +150,6 @@ CLog::Log(LOGWARNING, "%s - Compiled without non-free, rar support is disabled", __FUNCTION__); #endif } - if (url.IsProtocol("xbt")) return new CXbtDirectory(); if (url.IsProtocol("multipath")) return new CMultiPathDirectory(); if (url.IsProtocol("stack")) return new CStackDirectory(); if (url.IsProtocol("playlistmusic")) return new CPlaylistDirectory(); @@ -172,9 +171,8 @@ if (url.IsProtocol("bluray")) return new CBlurayDirectory(); #endif if (url.IsProtocol("resource")) return new CResourceDirectory(); - if (url.IsProtocol("events")) return new CEventsDirectory(); - bool networkAvailable = g_application.getNetwork().IsAvailable(); + bool networkAvailable = g_application.getNetwork().IsAvailable(true); // true to wait for the network (if possible) if (networkAvailable) { if (url.IsProtocol("ftp") || url.IsProtocol("ftps")) return new CFTPDirectory(); @@ -195,6 +193,8 @@ #ifdef HAS_UPNP if (url.IsProtocol("upnp")) return new CUPnPDirectory(); #endif + if (url.IsProtocol("hdhomerun")) return new CHomeRunDirectory(); + if (url.IsProtocol("sling")) return new CSlingboxDirectory(); if (url.IsProtocol("rss")) return new CRSSDirectory(); #ifdef HAS_FILESYSTEM_SAP if (url.IsProtocol("sap")) return new CSAPDirectory(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/DirectoryHistory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/DirectoryHistory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/DirectoryHistory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/DirectoryHistory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,8 @@ #include +using namespace std; + const std::string& CDirectoryHistory::CPathHistoryItem::GetPath(bool filter /* = false */) const { if (filter && !m_strFilterPath.empty()) @@ -111,7 +113,7 @@ { std::string slashEnded(path); URIUtils::AddSlashAtEnd(slashEnded); - for (std::vector::const_iterator i = m_vecPathHistory.begin(); i != m_vecPathHistory.end(); ++i) + for (vector::const_iterator i = m_vecPathHistory.begin(); i != m_vecPathHistory.end(); ++i) { std::string testPath(i->GetPath()); URIUtils::AddSlashAtEnd(testPath); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/DllHDHomeRun.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/DllHDHomeRun.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/DllHDHomeRun.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/DllHDHomeRun.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,70 @@ +#pragma once +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "DynamicDll.h" +#include "lib/libhdhomerun/hdhomerun.h" + +class DllHdHomeRunInterface +{ +public: + virtual ~DllHdHomeRunInterface() {} + virtual int discover_find_devices_custom(uint32_t target_ip, uint32_t device_type, uint32_t device_id, struct hdhomerun_discover_device_t result_list[], int max_count)=0; + virtual struct hdhomerun_device_t* device_create_from_str(const char *device_str, struct hdhomerun_debug_t *dbg)=0; + virtual void device_destroy(struct hdhomerun_device_t *hd)=0; + virtual int device_stream_start(struct hdhomerun_device_t *hd)=0; + virtual uint8_t* device_stream_recv(struct hdhomerun_device_t *hd, size_t max_size, size_t* pactual_size)=0; + virtual void device_stream_stop(struct hdhomerun_device_t *hd)=0; + virtual int device_set_tuner_channel(struct hdhomerun_device_t *hd, const char *channel)=0; + virtual int device_set_tuner_program(struct hdhomerun_device_t *hd, const char *program)=0; + virtual int device_set_tuner_from_str(struct hdhomerun_device_t *hd, const char *tuner_str)=0; + virtual void device_set_tuner(struct hdhomerun_device_t *hd, unsigned int tuner)=0; + virtual int device_get_tuner_status(struct hdhomerun_device_t *hd, char **pstatus_str, struct hdhomerun_tuner_status_t *status)=0; +}; + +class DllHdHomeRun : public DllDynamic, public DllHdHomeRunInterface +{ + DECLARE_DLL_WRAPPER(DllHdHomeRun, DLL_PATH_LIBHDHOMERUN) + DEFINE_METHOD5(int, discover_find_devices_custom, (uint32_t p1, uint32_t p2, uint32_t p3, struct hdhomerun_discover_device_t p4[], int p5)) + DEFINE_METHOD2(struct hdhomerun_device_t*, device_create_from_str, (const char* p1, struct hdhomerun_debug_t *p2)) + DEFINE_METHOD1(void, device_destroy, (struct hdhomerun_device_t* p1)) + DEFINE_METHOD1(int, device_stream_start, (struct hdhomerun_device_t* p1)) + DEFINE_METHOD3(uint8_t*, device_stream_recv, (struct hdhomerun_device_t* p1, size_t p2, size_t* p3)) + DEFINE_METHOD1(void, device_stream_stop, (struct hdhomerun_device_t* p1)) + DEFINE_METHOD2(int, device_set_tuner_channel, (struct hdhomerun_device_t *p1, const char *p2)) + DEFINE_METHOD2(int, device_set_tuner_program, (struct hdhomerun_device_t *p1, const char *p2)) + DEFINE_METHOD2(int, device_set_tuner_from_str, (struct hdhomerun_device_t *p1, const char *p2)) + DEFINE_METHOD2(void, device_set_tuner, (struct hdhomerun_device_t *p1, unsigned int p2)) + DEFINE_METHOD3(int, device_get_tuner_status, (struct hdhomerun_device_t *p1, char **p2, struct hdhomerun_tuner_status_t *p3)); + BEGIN_METHOD_RESOLVE() + RESOLVE_METHOD_RENAME(hdhomerun_discover_find_devices_custom, discover_find_devices_custom) + RESOLVE_METHOD_RENAME(hdhomerun_device_create_from_str, device_create_from_str) + RESOLVE_METHOD_RENAME(hdhomerun_device_destroy, device_destroy) + RESOLVE_METHOD_RENAME(hdhomerun_device_stream_start, device_stream_start) + RESOLVE_METHOD_RENAME(hdhomerun_device_stream_recv, device_stream_recv) + RESOLVE_METHOD_RENAME(hdhomerun_device_stream_stop, device_stream_stop) + RESOLVE_METHOD_RENAME(hdhomerun_device_set_tuner_channel, device_set_tuner_channel) + RESOLVE_METHOD_RENAME(hdhomerun_device_set_tuner_program, device_set_tuner_program) + RESOLVE_METHOD_RENAME(hdhomerun_device_set_tuner_from_str, device_set_tuner_from_str) + RESOLVE_METHOD_RENAME(hdhomerun_device_set_tuner, device_set_tuner) + RESOLVE_METHOD_RENAME(hdhomerun_device_get_tuner_status, device_get_tuner_status) + END_METHOD_RESOLVE() +}; + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/EventsDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/EventsDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/EventsDirectory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/EventsDirectory.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - - -#include "EventsDirectory.h" -#include "URL.h" -#include "events/EventLog.h" -#include "utils/StringUtils.h" - -using namespace XFILE; - -bool CEventsDirectory::GetDirectory(const CURL& url, CFileItemList &items) -{ - items.ClearProperties(); - items.SetContent("events"); - - CEventLog& log = CEventLog::GetInstance(); - Events events; - - std::string hostname = url.GetHostName(); - if (hostname.empty()) - events = log.Get(); - else - { - bool includeHigherLevels = false; - // check if we should only retrieve events from a specific level or - // also from all higher levels - if (StringUtils::EndsWith(hostname, "+")) - { - includeHigherLevels = true; - - // remove the "+" from the end of the hostname - hostname = hostname.substr(0, hostname.size() - 1); - } - - EventLevel level = CEventLog::GetInstance().EventLevelFromString(hostname); - - // get the events of the specified level(s) - events = log.Get(level, includeHigherLevels); - } - - for (auto eventItem : events) - items.Add(EventToFileItem(eventItem)); - - return true; -} - -CFileItemPtr CEventsDirectory::EventToFileItem(const EventPtr& eventItem) -{ - if (eventItem == NULL) - return CFileItemPtr(); - - CFileItemPtr item(new CFileItem(eventItem->GetLabel())); - item->m_dateTime = eventItem->GetDateTime(); - if (!eventItem->GetIcon().empty()) - item->SetIconImage(eventItem->GetIcon()); - - item->SetProperty(PROPERTY_EVENT_IDENTIFIER, eventItem->GetIdentifier()); - item->SetProperty(PROPERTY_EVENT_LEVEL, CEventLog::GetInstance().EventLevelToString(eventItem->GetLevel())); - item->SetProperty(PROPERTY_EVENT_DESCRIPTION, eventItem->GetDescription()); - - return item; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/EventsDirectory.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/EventsDirectory.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/EventsDirectory.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/EventsDirectory.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "FileItem.h" -#include "events/IEvent.h" -#include "filesystem/IDirectory.h" - -#define PROPERTY_EVENT_IDENTIFIER "Event.ID" -#define PROPERTY_EVENT_LEVEL "Event.Level" -#define PROPERTY_EVENT_DESCRIPTION "Event.Description" - -namespace XFILE -{ - class CEventsDirectory : public IDirectory - { - public: - CEventsDirectory() { } - virtual ~CEventsDirectory() { } - - // implementations of IDirectory - virtual bool GetDirectory(const CURL& url, CFileItemList& items); - virtual bool Create(const CURL& url) { return true; } - virtual bool Exists(const CURL& url) { return true; } - virtual bool AllowAll() const { return true; } - - static CFileItemPtr EventToFileItem(const EventPtr& activity); - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/FavouritesDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/FavouritesDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/FavouritesDirectory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/FavouritesDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -52,7 +52,7 @@ if (url.IsProtocol("favourites")) { return XFILE::CFile::Exists("special://xbmc/system/favourites.xml") - || XFILE::CFile::Exists(URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetProfileUserDataFolder(), "favourites.xml")); + || XFILE::CFile::Exists(URIUtils::AddFileToFolder(CProfilesManager::Get().GetProfileUserDataFolder(), "favourites.xml")); } return XFILE::CDirectory::Exists(url); //directly load the given file } @@ -67,7 +67,7 @@ CFavouritesDirectory::LoadFavourites(favourites, items); else CLog::Log(LOGDEBUG, "CFavourites::Load - no system favourites found, skipping"); - favourites = URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetProfileUserDataFolder(), "favourites.xml"); + favourites = URIUtils::AddFileToFolder(CProfilesManager::Get().GetProfileUserDataFolder(), "favourites.xml"); if(XFILE::CFile::Exists(favourites)) CFavouritesDirectory::LoadFavourites(favourites, items); else @@ -135,7 +135,7 @@ rootNode->InsertEndChild(favNode); } - favourites = URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetProfileUserDataFolder(), "favourites.xml"); + favourites = URIUtils::AddFileToFolder(CProfilesManager::Get().GetProfileUserDataFolder(), "favourites.xml"); return doc.SaveFile(favourites); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/FileCache.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/FileCache.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/FileCache.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/FileCache.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,6 +19,7 @@ */ #include "threads/SystemClock.h" +#include "utils/AutoPtrHandle.h" #include "FileCache.h" #include "threads/Thread.h" #include "File.h" @@ -29,14 +30,10 @@ #include "utils/log.h" #include "settings/AdvancedSettings.h" -#if !defined(TARGET_WINDOWS) -#include "linux/ConvUtils.h" //GetLastError() -#endif - #include #include -#include +using namespace AUTOPTR; using namespace XFILE; #define READ_CACHE_CHUNK_SIZE (64*1024) @@ -100,25 +97,40 @@ }; -CFileCache::CFileCache(const unsigned int flags) +CFileCache::CFileCache(bool useDoubleCache) : CThread("FileCache") - , m_pCache(NULL) - , m_bDeleteCache(true) , m_seekPossible(0) - , m_nSeekResult(0) - , m_seekPos(0) - , m_readPos(0) - , m_writePos(0) , m_chunkSize(0) , m_writeRate(0) , m_writeRateActual(0) , m_cacheFull(false) , m_fileSize(0) - , m_flags(flags) { + m_bDeleteCache = true; + m_nSeekResult = 0; + m_seekPos = 0; + m_readPos = 0; + m_writePos = 0; + if (g_advancedSettings.m_cacheMemBufferSize == 0) + m_pCache = new CSimpleFileCache(); + else + { + size_t front = g_advancedSettings.m_cacheMemBufferSize; + size_t back = std::max( g_advancedSettings.m_cacheMemBufferSize / 4, 1024 * 1024); + if (useDoubleCache) + { + front = front / 2; + back = back / 2; + } + m_pCache = new CCircularCache(front, back); + } + if (useDoubleCache) + { + m_pCache = new CDoubleCache(m_pCache); + } } -CFileCache::CFileCache(CCacheStrategy *pCache, bool bDeleteCache /* = true */) +CFileCache::CFileCache(CCacheStrategy *pCache, bool bDeleteCache) : CThread("FileCacheStrategy") , m_seekPossible(0) , m_chunkSize(0) @@ -144,7 +156,7 @@ m_pCache = NULL; } -void CFileCache::SetCacheStrategy(CCacheStrategy *pCache, bool bDeleteCache /* = true */) +void CFileCache::SetCacheStrategy(CCacheStrategy *pCache, bool bDeleteCache) { if (m_bDeleteCache && m_pCache) delete m_pCache; @@ -166,8 +178,22 @@ CLog::Log(LOGDEBUG,"CFileCache::Open - opening <%s> using cache", url.GetFileName().c_str()); + if (!m_pCache) + { + CLog::Log(LOGERROR,"CFileCache::Open - no cache strategy defined"); + return false; + } + m_sourcePath = url.Get(); + // open cache strategy + if (m_pCache->Open() != CACHE_RC_OK) + { + CLog::Log(LOGERROR,"CFileCache::Open - failed to open cache"); + Close(); + return false; + } + // opening the source file. if (!m_source.Open(m_sourcePath, READ_NO_CACHE | READ_TRUNCATED | READ_CHUNKED)) { @@ -183,53 +209,6 @@ m_chunkSize = CFile::GetChunkSize(m_source.GetChunkSize(), READ_CACHE_CHUNK_SIZE); m_fileSize = m_source.GetLength(); - if (!m_pCache) - { - if (g_advancedSettings.m_cacheMemBufferSize == 0) - { - // Use cache on disk - m_pCache = new CSimpleFileCache(); - } - else - { - size_t cacheSize; - if (m_fileSize > 0 && m_fileSize < g_advancedSettings.m_cacheMemBufferSize && !(m_flags & READ_AUDIO_VIDEO)) - { - // NOTE: We don't need to take into account READ_MULTI_STREAM here as it's only used for audio/video - cacheSize = m_fileSize; - } - else - { - cacheSize = g_advancedSettings.m_cacheMemBufferSize; - } - - size_t back = cacheSize / 4; - size_t front = cacheSize - back; - - if (m_flags & READ_MULTI_STREAM) - { - // READ_MULTI_STREAM requires double buffering, so use half the amount of memory for each buffer - front /= 2; - back /= 2; - } - m_pCache = new CCircularCache(front, back); - } - - if (m_flags & READ_MULTI_STREAM) - { - // If READ_MULTI_STREAM flag is set: Double buffering is required - m_pCache = new CDoubleCache(m_pCache); - } - } - - // open cache strategy - if (!m_pCache || m_pCache->Open() != CACHE_RC_OK) - { - CLog::Log(LOGERROR,"CFileCache::Open - failed to open cache"); - Close(); - return false; - } - m_readPos = 0; m_writePos = 0; m_writeRate = 1024 * 1024; @@ -252,7 +231,7 @@ } // create our read buffer - std::unique_ptr buffer(new char[m_chunkSize]); + auto_aptr buffer(new char[m_chunkSize]); if (buffer.get() == NULL) { CLog::Log(LOGERROR, "%s - failed to allocate read buffer", __FUNCTION__); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/FileCache.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/FileCache.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/FileCache.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/FileCache.h 2015-10-19 08:39:16.000000000 +0000 @@ -32,11 +32,11 @@ class CFileCache : public IFile, public CThread { public: - CFileCache(const unsigned int flags); - CFileCache(CCacheStrategy *pCache, bool bDeleteCache = true); + CFileCache(bool useDoubleCache=false); + CFileCache(CCacheStrategy *pCache, bool bDeleteCache=true); virtual ~CFileCache(); - void SetCacheStrategy(CCacheStrategy *pCache, bool bDeleteCache = true); + void SetCacheStrategy(CCacheStrategy *pCache, bool bDeleteCache=true); // CThread methods virtual void Process(); @@ -79,7 +79,6 @@ unsigned m_writeRateActual; bool m_cacheFull; std::atomic m_fileSize; - unsigned int m_flags; CCriticalSection m_sync; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/File.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/File.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/File.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/File.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -37,6 +37,7 @@ #include "commons/Exception.h" using namespace XFILE; +using namespace std; ////////////////////////////////////////////////////////////////////// // Construction/Destruction @@ -93,7 +94,7 @@ CFile newFile; if (URIUtils::IsHD(pathToUrl)) // create possible missing dirs { - std::vector tokens; + vector tokens; std::string strDirectory = URIUtils::GetDirectory(pathToUrl); URIUtils::RemoveSlashAtEnd(strDirectory); // for the test below if (!(strDirectory.size() == 2 && strDirectory[1] == ':')) @@ -114,7 +115,7 @@ } // If the directory has a / at the beginning, don't forget it else if (strDirectory[0] == pathsep[0]) strCurrPath += pathsep; - for (std::vector::iterator iter=tokens.begin();iter!=tokens.end();++iter) + for (vector::iterator iter=tokens.begin();iter!=tokens.end();++iter) { strCurrPath += *iter+pathsep; CDirectory::Create(strCurrPath); @@ -243,7 +244,7 @@ if (m_flags & READ_CACHED) { // for internet stream, if it contains multiple stream, file cache need handle it specially. - m_pFile = new CFileCache(m_flags); + m_pFile = new CFileCache((m_flags & READ_MULTI_STREAM) == READ_MULTI_STREAM); return m_pFile->Open(url); } } @@ -268,7 +269,7 @@ SAFE_DELETE(m_pFile); if (pRedirectEx && pRedirectEx->m_pNewFileImp) { - std::unique_ptr pNewUrl(pRedirectEx->m_pNewUrl); + unique_ptr pNewUrl(pRedirectEx->m_pNewUrl); m_pFile = pRedirectEx->m_pNewFileImp; delete pRedirectEx; @@ -371,7 +372,7 @@ return false; } - std::unique_ptr pFile(CFileFactory::CreateLoader(url)); + unique_ptr pFile(CFileFactory::CreateLoader(url)); if (!pFile.get()) return false; @@ -385,8 +386,8 @@ CLog::Log(LOGDEBUG,"File::Exists - redirecting implementation for %s", file.GetRedacted().c_str()); if (pRedirectEx && pRedirectEx->m_pNewFileImp) { - std::unique_ptr pImp(pRedirectEx->m_pNewFileImp); - std::unique_ptr pNewUrl(pRedirectEx->m_pNewUrl); + unique_ptr pImp(pRedirectEx->m_pNewFileImp); + unique_ptr pNewUrl(pRedirectEx->m_pNewUrl); delete pRedirectEx; if (pImp.get()) @@ -453,7 +454,7 @@ try { - std::unique_ptr pFile(CFileFactory::CreateLoader(url)); + unique_ptr pFile(CFileFactory::CreateLoader(url)); if (!pFile.get()) return -1; return pFile->Stat(url, buffer); @@ -466,8 +467,8 @@ CLog::Log(LOGDEBUG,"File::Stat - redirecting implementation for %s", file.GetRedacted().c_str()); if (pRedirectEx && pRedirectEx->m_pNewFileImp) { - std::unique_ptr pImp(pRedirectEx->m_pNewFileImp); - std::unique_ptr pNewUrl(pRedirectEx->m_pNewUrl); + unique_ptr pImp(pRedirectEx->m_pNewFileImp); + unique_ptr pNewUrl(pRedirectEx->m_pNewUrl); delete pRedirectEx; if (pNewUrl.get()) @@ -518,7 +519,7 @@ if(m_flags & READ_TRUNCATED) { const ssize_t nBytes = m_pBuffer->sgetn( - (char *)lpBuf, std::min((std::streamsize)uiBufSize, + (char *)lpBuf, min((streamsize)uiBufSize, m_pBuffer->in_avail())); if (m_bitStreamStats && nBytes>0) m_bitStreamStats->AddSampleBytes(nBytes); @@ -614,11 +615,11 @@ if (m_pBuffer) { if(iWhence == SEEK_CUR) - return m_pBuffer->pubseekoff(iFilePosition, std::ios_base::cur); + return m_pBuffer->pubseekoff(iFilePosition,ios_base::cur); else if(iWhence == SEEK_END) - return m_pBuffer->pubseekoff(iFilePosition, std::ios_base::end); + return m_pBuffer->pubseekoff(iFilePosition,ios_base::end); else if(iWhence == SEEK_SET) - return m_pBuffer->pubseekoff(iFilePosition, std::ios_base::beg); + return m_pBuffer->pubseekoff(iFilePosition,ios_base::beg); } try @@ -675,7 +676,7 @@ return -1; if (m_pBuffer) - return m_pBuffer->pubseekoff(0, std::ios_base::cur); + return m_pBuffer->pubseekoff(0, ios_base::cur); try { @@ -791,7 +792,7 @@ { CURL url(URIUtils::SubstitutePath(file)); - std::unique_ptr pFile(CFileFactory::CreateLoader(url)); + unique_ptr pFile(CFileFactory::CreateLoader(url)); if (!pFile.get()) return false; @@ -825,7 +826,7 @@ CURL url(URIUtils::SubstitutePath(file)); CURL urlnew(URIUtils::SubstitutePath(newFile)); - std::unique_ptr pFile(CFileFactory::CreateLoader(url)); + unique_ptr pFile(CFileFactory::CreateLoader(url)); if (!pFile.get()) return false; @@ -857,7 +858,7 @@ { CURL url(URIUtils::SubstitutePath(file)); - std::unique_ptr pFile(CFileFactory::CreateLoader(url)); + unique_ptr pFile(CFileFactory::CreateLoader(url)); if (!pFile.get()) return false; @@ -989,7 +990,7 @@ } CFileStreamBuffer::CFileStreamBuffer(int backsize) - : std::streambuf() + : streambuf() , m_file(NULL) , m_buffer(NULL) , m_backsize(backsize) @@ -1027,7 +1028,7 @@ size_t backsize = 0; if(m_backsize) { - backsize = (size_t)std::min((ptrdiff_t)m_backsize, egptr()-eback()); + backsize = (size_t)min((ptrdiff_t)m_backsize, egptr()-eback()); memmove(m_buffer, egptr()-backsize, backsize); } @@ -1047,21 +1048,20 @@ CFileStreamBuffer::pos_type CFileStreamBuffer::seekoff( off_type offset, - std::ios_base::seekdir way, - std::ios_base::openmode mode) + ios_base::seekdir way, + ios_base::openmode mode) { // calculate relative offset - off_type aheadbytes = (egptr() - gptr()); - off_type pos = m_file->GetPosition() - aheadbytes; + off_type pos = m_file->GetPosition() - (egptr() - gptr()); off_type offset2; - if(way == std::ios_base::cur) + if(way == ios_base::cur) offset2 = offset; - else if(way == std::ios_base::beg) + else if(way == ios_base::beg) offset2 = offset - pos; - else if(way == std::ios_base::end) + else if(way == ios_base::end) offset2 = offset + m_file->GetLength() - pos; else - return std::streampos(-1); + return streampos(-1); // a non seek shouldn't modify our buffer if(offset2 == 0) @@ -1080,34 +1080,34 @@ setp(0,0); int64_t position = -1; - if(way == std::ios_base::cur) - position = m_file->Seek(offset - aheadbytes, SEEK_CUR); - else if(way == std::ios_base::end) + if(way == ios_base::cur) + position = m_file->Seek(offset, SEEK_CUR); + else if(way == ios_base::end) position = m_file->Seek(offset, SEEK_END); else position = m_file->Seek(offset, SEEK_SET); if(position<0) - return std::streampos(-1); + return streampos(-1); return position; } CFileStreamBuffer::pos_type CFileStreamBuffer::seekpos( pos_type pos, - std::ios_base::openmode mode) + ios_base::openmode mode) { - return seekoff(pos, std::ios_base::beg, mode); + return seekoff(pos, ios_base::beg, mode); } -std::streamsize CFileStreamBuffer::showmanyc() +streamsize CFileStreamBuffer::showmanyc() { underflow(); return egptr() - gptr(); } CFileStream::CFileStream(int backsize /*= 0*/) : - std::istream(&m_buffer), + istream(&m_buffer), m_buffer(backsize), m_file(NULL) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/FileDirectoryFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/FileDirectoryFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/FileDirectoryFactory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/FileDirectoryFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,7 +32,6 @@ #if defined(TARGET_ANDROID) #include "APKDirectory.h" #endif -#include "XbtDirectory.h" #include "ZipDirectory.h" #include "SmartPlaylistDirectory.h" #include "playlists/SmartPlayList.h" @@ -49,6 +48,7 @@ using namespace ADDON; using namespace XFILE; using namespace PLAYLIST; +using namespace std; CFileDirectoryFactory::CFileDirectoryFactory(void) {} @@ -65,7 +65,7 @@ std::string strExtension=URIUtils::GetExtension(url); StringUtils::ToLower(strExtension); VECADDONS codecs; - CAddonMgr::GetInstance().GetAddons(ADDON_AUDIODECODER, codecs); + CAddonMgr::Get().GetAddons(ADDON_AUDIODECODER, codecs); for (size_t i=0;i dec(std::static_pointer_cast(codecs[i])); @@ -134,7 +134,7 @@ } if (url.IsFileType("rar") || url.IsFileType("001")) { - std::vector tokens; + vector tokens; const std::string strPath = url.Get(); StringUtils::Tokenize(strPath,tokens,"."); if (tokens.size() > 2) @@ -185,13 +185,6 @@ } return NULL; } - if (url.IsFileType("xbt")) - { - CURL xbtUrl = URIUtils::CreateArchivePath("xbt", url); - pItem->SetURL(xbtUrl); - - return new CXbtDirectory(); - } if (url.IsFileType("xsp")) { // XBMC Smart playlist - just XML renamed to XSP // read the name of the playlist in diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/FileFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/FileFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/FileFactory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/FileFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -56,7 +56,6 @@ #if defined(TARGET_ANDROID) #include "APKFile.h" #endif -#include "XbtFile.h" #include "ZipFile.h" #ifdef HAS_FILESYSTEM_RAR #include "RarFile.h" @@ -81,6 +80,8 @@ #include "SpecialProtocolFile.h" #include "MultiPathFile.h" #include "UDFFile.h" +#include "HDHomeRunFile.h" +#include "SlingboxFile.h" #include "ImageFile.h" #include "ResourceFile.h" #include "Application.h" @@ -106,7 +107,7 @@ IFile* CFileFactory::CreateLoader(const CURL& url) { - if (!CWakeOnAccess::GetInstance().WakeUpHost(url)) + if (!CWakeOnAccess::Get().WakeUpHost(url)) return NULL; #if defined(TARGET_ANDROID) @@ -121,7 +122,6 @@ CLog::Log(LOGWARNING, "%s - Compiled without non-free, rar support is disabled", __FUNCTION__); #endif } - else if (url.IsProtocol("xbt")) return new CXbtFile(); else if (url.IsProtocol("musicdb")) return new CMusicDatabaseFile(); else if (url.IsProtocol("videodb")) return NULL; else if (url.IsProtocol("special")) return new CSpecialProtocolFile(); @@ -161,6 +161,8 @@ else if (url.IsProtocol("sftp") || url.IsProtocol("ssh")) return new CSFTPFile(); #endif else if (url.IsProtocol("shout")) return new CShoutcastFile(); + else if (url.IsProtocol("hdhomerun")) return new CHomeRunFile(); + else if (url.IsProtocol("sling")) return new CSlingboxFile(); #ifdef HAS_FILESYSTEM_SMB #ifdef TARGET_WINDOWS else if (url.IsProtocol("smb")) return new CWin32SMBFile(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/File.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/File.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/File.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/File.h 2015-10-19 08:39:16.000000000 +0000 @@ -53,26 +53,23 @@ }; /* indicate that caller can handle truncated reads, where function returns before entire buffer has been filled */ -#define READ_TRUNCATED 0x01 +#define READ_TRUNCATED 0x01 /* indicate that that caller support read in the minimum defined chunk size, this disables internal cache then */ -#define READ_CHUNKED 0x02 +#define READ_CHUNKED 0x02 /* use cache to access this file */ -#define READ_CACHED 0x04 +#define READ_CACHED 0x04 /* open without caching. regardless to file type. */ -#define READ_NO_CACHE 0x08 +#define READ_NO_CACHE 0x08 /* calcuate bitrate for file while reading */ -#define READ_BITRATE 0x10 +#define READ_BITRATE 0x10 -/* indicate to the caller we will seek between multiple streams in the file frequently */ +/* indicate the caller will seek between multiple streams in the file frequently */ #define READ_MULTI_STREAM 0x20 -/* indicate to the caller file is audio and/or video (and e.g. may grow) */ -#define READ_AUDIO_VIDEO 0x40 - class CFileStreamBuffer; class CFile diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/FTPParse.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/FTPParse.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/FTPParse.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/FTPParse.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -34,6 +34,8 @@ #include #include "FTPParse.h" +using namespace std; + CFTPParse::CFTPParse() { m_flagtrycwd = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/HDHomeRunDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/HDHomeRunDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/HDHomeRunDirectory.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/HDHomeRunDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2011-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "HDHomeRunDirectory.h" +#include "URL.h" +#include "FileItem.h" +#include "utils/URIUtils.h" +#include "utils/StringUtils.h" +#include "DllHDHomeRun.h" + +using namespace XFILE; +using namespace std; + +// ------------------------------------------- +// ---------------- Directory ---------------- +// ------------------------------------------- + +CHomeRunDirectory::CHomeRunDirectory() +{ + m_pdll = new DllHdHomeRun; + m_pdll->Load(); +} + +CHomeRunDirectory::~CHomeRunDirectory() +{ + m_pdll->Unload(); + delete m_pdll; +} + +bool CHomeRunDirectory::GetDirectory(const CURL& url, CFileItemList &items) +{ + if(!m_pdll->IsLoaded()) + return false; + + if(url.GetHostName().empty()) + { + // no hostname, list all available devices + int target_ip = 0; + struct hdhomerun_discover_device_t result_list[64]; + int count = m_pdll->discover_find_devices_custom(target_ip, HDHOMERUN_DEVICE_TYPE_TUNER, HDHOMERUN_DEVICE_ID_WILDCARD, result_list, 64); + if (count < 0) + return false; + + for(int i=0;i> 24) & 0xFF, (unsigned int)(ip_addr >> 16) & 0xFF, + (unsigned int)(ip_addr >> 8) & 0xFF, (unsigned int)(ip_addr >> 0) & 0xFF); + + item.reset(new CFileItem("hdhomerun://" + device + "/tuner0/", true)); + item->SetLabel(device + "-0 On " + ip); + item->SetLabelPreformated(true); + items.Add(item); + + item.reset(new CFileItem("hdhomerun://" + device + "/tuner1/", true)); + item->SetLabel(device + "-1 On " + ip); + item->SetLabelPreformated(true); + items.Add(item); + } + return true; + } + else + { + hdhomerun_device_t* device = m_pdll->device_create_from_str(url.GetHostName().c_str(), NULL); + if(!device) + return false; + + m_pdll->device_set_tuner_from_str(device, url.GetFileName().c_str()); + + hdhomerun_tuner_status_t status; + if(!m_pdll->device_get_tuner_status(device, NULL, &status)) + { + m_pdll->device_destroy(device); + return true; + } + + std::string label; + if(status.signal_present) + label = StringUtils::Format("Current Stream: N/A"); + else + label = StringUtils::Format("Current Stream: Channel %s, SNR %d", status.channel, status.signal_to_noise_quality); + + std::string path = "hdhomerun://" + url.GetHostName() + "/" + url.GetFileName(); + URIUtils::RemoveSlashAtEnd(path); + CFileItemPtr item(new CFileItem(path, false)); + item->SetLabel(label); + item->SetLabelPreformated(true); + items.Add(item); + + m_pdll->device_destroy(device); + return true; + } + + return false; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/HDHomeRunDirectory.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/HDHomeRunDirectory.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/HDHomeRunDirectory.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/HDHomeRunDirectory.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,38 @@ +#pragma once +/* + * Copyright (C) 2011-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + + #include "IDirectory.h" + +class DllHdHomeRun; + +namespace XFILE +{ + class CHomeRunDirectory : public IDirectory + { + public: + CHomeRunDirectory(void); + virtual ~CHomeRunDirectory(void); + virtual bool AllowAll() const { return true; } + virtual bool GetDirectory(const CURL& url, CFileItemList &items); + private: + DllHdHomeRun* m_pdll; + }; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/HDHomeRunFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/HDHomeRunFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/HDHomeRunFile.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/HDHomeRunFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2011-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "threads/SystemClock.h" +#include "system.h" +#include "URL.h" +#include "FileItem.h" +#include "HDHomeRunFile.h" +#include "utils/log.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "DllHDHomeRun.h" + +using namespace XFILE; +using namespace std; + +// ------------------------------------------- +// ------------------ File ------------------- +// ------------------------------------------- +CHomeRunFile::CHomeRunFile() +{ + m_device = NULL; + m_pdll = new DllHdHomeRun; + m_pdll->Load(); +} + +CHomeRunFile::~CHomeRunFile() +{ + Close(); + delete m_pdll; +} + +bool CHomeRunFile::Exists(const CURL& url) +{ + std::string path(url.GetFileName()); + + /* + * HDHomeRun URLs are of the form hdhomerun://1014F6D1/tuner0?channel=qam:108&program=10 + * The filename starts with "tuner" and has no extension. This check will cover off requests + * for *.tbn, *.jpg, *.jpeg, *.edl etc. that do not exist. + */ + return StringUtils::StartsWith(path, "tuner") && + !URIUtils::HasExtension(path); +} + +int64_t CHomeRunFile::Seek(int64_t iFilePosition, int iWhence) +{ + return -1; +} + +int CHomeRunFile::Stat(const CURL& url, struct __stat64* buffer) +{ + memset(buffer, 0, sizeof(struct __stat64)); + return 0; +} + +int64_t CHomeRunFile::GetPosition() +{ + return 0; +} + +int64_t CHomeRunFile::GetLength() +{ + return 0; +} + +bool CHomeRunFile::Open(const CURL &url) +{ + if(!m_pdll->IsLoaded()) + return false; + + m_device = m_pdll->device_create_from_str(url.GetHostName().c_str(), NULL); + if(!m_device) + return false; + + m_pdll->device_set_tuner_from_str(m_device, url.GetFileName().c_str()); + + if(url.HasOption("channel")) + m_pdll->device_set_tuner_channel(m_device, url.GetOption("channel").c_str()); + + if(url.HasOption("program")) + m_pdll->device_set_tuner_program(m_device, url.GetOption("program").c_str()); + + // start streaming from selected device and tuner + if( m_pdll->device_stream_start(m_device) <= 0 ) + return false; + + return true; +} + +ssize_t CHomeRunFile::Read(void* lpBuf, size_t uiBufSize) +{ + if (uiBufSize > SSIZE_MAX) + uiBufSize = SSIZE_MAX; + + size_t datasize; + + if(uiBufSize < VIDEO_DATA_PACKET_SIZE) + CLog::Log(LOGWARNING, "CHomeRunFile::Read - buffer size too small, will most likely fail"); + + // for now, let it it time out after 5 seconds, + // neither of the players can be forced to + // continue even if read return 0 as can happen + // on live streams. + XbmcThreads::EndTime timestamp(5000); + while(1) + { + datasize = (size_t) uiBufSize; + uint8_t* ptr = m_pdll->device_stream_recv(m_device, datasize, &datasize); + if(ptr) + { + memcpy(lpBuf, ptr, datasize); + return datasize; + } + + if(timestamp.IsTimePast()) + return 0; + + Sleep(64); + } + return datasize; +} + +void CHomeRunFile::Close() +{ + if(m_device) + { + m_pdll->device_stream_stop(m_device); + m_pdll->device_destroy(m_device); + m_device = NULL; + } +} + +int CHomeRunFile::GetChunkSize() +{ + return VIDEO_DATA_PACKET_SIZE; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/HDHomeRunFile.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/HDHomeRunFile.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/HDHomeRunFile.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/HDHomeRunFile.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,49 @@ +#pragma once +/* + * Copyright (C) 2011-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "IFile.h" + +struct hdhomerun_device_t; +class DllHdHomeRun; + +namespace XFILE +{ + class CHomeRunFile : public IFile + { + public: + CHomeRunFile(); + ~CHomeRunFile(); + + virtual bool Exists(const CURL& url); + virtual int64_t Seek(int64_t iFilePosition, int iWhence); + virtual int Stat(const CURL& url, struct __stat64* buffer); + virtual int64_t GetPosition(); + virtual int64_t GetLength(); + + virtual bool Open(const CURL& url); + virtual void Close(); + virtual ssize_t Read(void* lpBuf, size_t uiBufSize); + virtual int GetChunkSize(); + private: + struct hdhomerun_device_t* m_device; + DllHdHomeRun* m_pdll; + }; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/HTTPFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/HTTPFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/HTTPFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/HTTPFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -46,7 +46,7 @@ if (!m_openedforwrite) return -1; - std::string myPostData(static_cast(lpBuf)); + std::string myPostData((char*) lpBuf); if (myPostData.length() != uiBufSize) return -1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/ILiveTV.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/ILiveTV.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/ILiveTV.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/ILiveTV.h 2014-12-18 01:01:56.000000000 +0000 @@ -29,7 +29,7 @@ virtual ~ILiveTVInterface() {} virtual bool NextChannel(bool preview = false) = 0; virtual bool PrevChannel(bool preview = false) = 0; - virtual bool SelectChannelById(unsigned int channelid) = 0; + virtual bool SelectChannel(unsigned int channel) = 0; virtual int GetTotalTime() = 0; virtual int GetStartTime() = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/ImageFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/ImageFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/ImageFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/ImageFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,6 +23,7 @@ #include "TextureCache.h" using namespace XFILE; +using namespace std; CImageFile::CImageFile(void) { @@ -37,10 +38,10 @@ { std::string file = url.Get(); bool needsRecaching = false; - std::string cachedFile = CTextureCache::GetInstance().CheckCachedImage(file, false, needsRecaching); + std::string cachedFile = CTextureCache::Get().CheckCachedImage(file, false, needsRecaching); if (cachedFile.empty()) { // not in the cache, so cache it - cachedFile = CTextureCache::GetInstance().CacheImage(file); + cachedFile = CTextureCache::Get().CacheImage(file); } if (!cachedFile.empty()) { // in the cache, return what we have @@ -53,7 +54,7 @@ bool CImageFile::Exists(const CURL& url) { bool needsRecaching = false; - std::string cachedFile = CTextureCache::GetInstance().CheckCachedImage(url.Get(), false, needsRecaching); + std::string cachedFile = CTextureCache::Get().CheckCachedImage(url.Get(), false, needsRecaching); if (!cachedFile.empty()) return CFile::Exists(cachedFile, false); @@ -67,7 +68,7 @@ int CImageFile::Stat(const CURL& url, struct __stat64* buffer) { bool needsRecaching = false; - std::string cachedFile = CTextureCache::GetInstance().CheckCachedImage(url.Get(), false, needsRecaching); + std::string cachedFile = CTextureCache::Get().CheckCachedImage(url.Get(), false, needsRecaching); if (!cachedFile.empty()) return CFile::Stat(cachedFile, buffer); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/iso9660.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/iso9660.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/iso9660.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/iso9660.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -61,6 +61,7 @@ #define BUFFER_SIZE MODE2_DATA_SIZE #define RET_ERR -1 +using namespace std; #ifndef HAS_DVD_DRIVE extern "C" @@ -70,9 +71,9 @@ #endif //****************************************************************************************************************** -const std::string iso9660::ParseName(struct iso9660_Directory& isodir) +const string iso9660::ParseName(struct iso9660_Directory& isodir) { - std::string temp_text = (char*)isodir.FileName; + string temp_text = (char*)isodir.FileName; temp_text.resize(isodir.Len_Fi); int iPos = isodir.Len_Fi; @@ -213,10 +214,7 @@ { m_paths = (struct iso_directories *)malloc(sizeof(struct iso_directories)); if (!m_paths ) - { - free(pCurr_dir_cache); return NULL; - } m_paths->path = NULL; m_paths->dir = NULL; @@ -260,7 +258,7 @@ { break; } - int isize = std::min(sizeof(isodir), sizeof(m_info.isodir)); + int isize = min(sizeof(isodir), sizeof(m_info.isodir)); memcpy( &isodir, pCurr_dir_cache + iso9660searchpointer, isize); if (!isodir.ucRecordLength) continue; @@ -268,7 +266,7 @@ { if ( (!( isodir.byFlags & Flag_Directory )) && ( isodir.Len_Fi > 1) ) { - std::string temp_text ; + string temp_text ; bool bContinue = false; if ( m_info.joliet ) @@ -351,14 +349,14 @@ pCurr_dir_cache = NULL; return pDir; } - memcpy( &isodir, pCurr_dir_cache + iso9660searchpointer, std::min(sizeof(isodir), sizeof(m_info.isodir))); + memcpy( &isodir, pCurr_dir_cache + iso9660searchpointer, min(sizeof(isodir), sizeof(m_info.isodir))); if (!isodir.ucRecordLength) continue; if ( !(isodir.byFlags & Flag_NotExist) ) { if ( (( isodir.byFlags & Flag_Directory )) && ( isodir.Len_Fi > 1) ) { - std::string temp_text ; + string temp_text ; bool bContinue = false; if ( m_info.joliet ) { @@ -381,10 +379,7 @@ pFile_Pointer->next = (struct iso_dirtree *)malloc(sizeof(struct iso_dirtree)); if (!pFile_Pointer->next) - { - free(pCurr_dir_cache); return NULL; - } m_vecDirsAndFiles.push_back(pFile_Pointer->next); pFile_Pointer = pFile_Pointer->next; @@ -422,7 +417,7 @@ IsoDateTimeToFileTime(&isodir.DateTime, &pFile_Pointer->filetime); - std::string strPath = path; + string strPath = path; if ( strlen( path ) > 1 ) strPath += "\\"; strPath += temp_text; @@ -504,7 +499,7 @@ else iso9660searchpointer = (iso9660searchpointer - (iso9660searchpointer % wSectorSize)) + wSectorSize; - memcpy( &isodir, pCurr_dir_cache + iso9660searchpointer, std::min(sizeof(isodir), sizeof(m_info.isodir))); + memcpy( &isodir, pCurr_dir_cache + iso9660searchpointer,min(sizeof(isodir), sizeof(m_info.isodir))); free(pCurr_dir_cache); if (bResult && lpNumberOfBytesRead == wSectorSize) bResult = IsRockRidge(isodir); @@ -593,7 +588,7 @@ work = (char *)malloc(from_723(m_info.iso.logical_block_size)); char *temp; - struct iso_directories *lastpath = NULL; + struct iso_directories *lastpath = NULL;; if ( strpbrk(Folder, ":") ) strcpy(work, strpbrk(Folder, ":") + 1); @@ -695,7 +690,7 @@ //****************************************************************************************************************** -std::string iso9660::GetThinText(BYTE* strTxt, int iLen ) +string iso9660::GetThinText(BYTE* strTxt, int iLen ) { // convert from "fat" text (UTF-16BE) to "thin" text (UTF-8) std::u16string strTxtUnicode((char16_t*)strTxt, iLen / 2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/ISOFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/ISOFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/ISOFile.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/ISOFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,9 +24,9 @@ #include "URL.h" #include "iso9660.h" -#include #include +using namespace std; using namespace XFILE; ////////////////////////////////////////////////////////////////////// @@ -50,7 +50,7 @@ //********************************************************************************************* bool CISOFile::Open(const CURL& url) { - std::string strFName = "\\"; + string strFName = "\\"; strFName += url.GetFileName(); for (int i = 0; i < (int)strFName.size(); ++i ) { @@ -84,7 +84,10 @@ { if (m_cache.getMaxReadSize() ) { - unsigned int lBytes2Read = std::min(m_cache.getMaxReadSize(), static_cast(uiBufSize)); + long lBytes2Read = m_cache.getMaxReadSize(); + if (lBytes2Read > static_cast(uiBufSize)) + lBytes2Read = static_cast(uiBufSize); + m_cache.ReadData(pData, lBytes2Read ); uiBufSize -= lBytes2Read ; pData += lBytes2Read; @@ -104,7 +107,7 @@ return lTotalBytesRead; } - return m_isoReader.ReadFile( m_hFile, (uint8_t*)pData, (long)uiBufSize); + return m_isoReader.ReadFile( m_hFile, (uint8_t*)pData, (long)uiBufSize);; } //********************************************************************************************* @@ -140,7 +143,7 @@ bool CISOFile::Exists(const CURL& url) { - std::string strFName = "\\"; + string strFName = "\\"; strFName += url.GetFileName(); for (int i = 0; i < (int)strFName.size(); ++i ) { @@ -156,7 +159,7 @@ int CISOFile::Stat(const CURL& url, struct __stat64* buffer) { - std::string strFName = "\\"; + string strFName = "\\"; strFName += url.GetFileName(); for (int i = 0; i < (int)strFName.size(); ++i ) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/LibraryDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/LibraryDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/LibraryDirectory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/LibraryDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -34,6 +34,7 @@ #include "GUIInfoManager.h" #include "utils/log.h" +using namespace std; using namespace XFILE; CLibraryDirectory::CLibraryDirectory(void) @@ -169,7 +170,7 @@ std::string CLibraryDirectory::GetNode(const CURL& url) { - std::string libDir = URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetLibraryFolder(), url.GetHostName() + "/"); + std::string libDir = URIUtils::AddFileToFolder(CProfilesManager::Get().GetLibraryFolder(), url.GetHostName() + "/"); if (!CDirectory::Exists(libDir)) libDir = URIUtils::AddFileToFolder("special://xbmc/system/library/", url.GetHostName() + "/"); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/filesystem/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/Makefile.in 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/Makefile.in 2015-10-19 08:39:16.000000000 +0000 @@ -14,7 +14,6 @@ SRCS += DirectoryFactory.cpp SRCS += DirectoryHistory.cpp SRCS += DllLibCurl.cpp -SRCS += EventsDirectory.cpp SRCS += FavouritesDirectory.cpp SRCS += File.cpp SRCS += FileCache.cpp @@ -23,6 +22,8 @@ SRCS += FileReaderFile.cpp SRCS += FTPDirectory.cpp SRCS += FTPParse.cpp +SRCS += HDHomeRunDirectory.cpp +SRCS += HDHomeRunFile.cpp SRCS += HTTPDirectory.cpp SRCS += HTTPFile.cpp SRCS += IDirectory.cpp @@ -58,6 +59,8 @@ SRCS += SFTPDirectory.cpp SRCS += SFTPFile.cpp SRCS += ShoutcastFile.cpp +SRCS += SlingboxDirectory.cpp +SRCS += SlingboxFile.cpp SRCS += SmartPlaylistDirectory.cpp SRCS += SourcesDirectory.cpp SRCS += SpecialProtocol.cpp @@ -69,9 +72,6 @@ SRCS += UDFFile.cpp SRCS += VideoDatabaseDirectory.cpp SRCS += VirtualDirectory.cpp -SRCS += XbtDirectory.cpp -SRCS += XbtFile.cpp -SRCS += XbtManager.cpp SRCS += ZeroconfDirectory.cpp SRCS += ZipDirectory.cpp SRCS += ZipFile.cpp diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/MultiPathDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/MultiPathDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/MultiPathDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/MultiPathDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -28,9 +28,9 @@ #include "FileItem.h" #include "utils/StringUtils.h" #include "utils/log.h" -#include "utils/Variant.h" #include "utils/URIUtils.h" +using namespace std; using namespace XFILE; // @@ -50,7 +50,7 @@ { CLog::Log(LOGDEBUG,"CMultiPathDirectory::GetDirectory(%s)", url.GetRedacted().c_str()); - std::vector vecPaths; + vector vecPaths; if (!GetPaths(url, vecPaths)) return false; @@ -66,11 +66,11 @@ dlgProgress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); if (dlgProgress) { - dlgProgress->SetHeading(CVariant{15310}); - dlgProgress->SetLine(0, CVariant{15311}); - dlgProgress->SetLine(1, CVariant{""}); - dlgProgress->SetLine(2, CVariant{""}); - dlgProgress->Open(); + dlgProgress->SetHeading(15310); + dlgProgress->SetLine(0, 15311); + dlgProgress->SetLine(1, ""); + dlgProgress->SetLine(2, ""); + dlgProgress->StartModal(); dlgProgress->ShowProgressBar(true); dlgProgress->SetProgressMax((int)vecPaths.size()*2); dlgProgress->Progress(); @@ -79,7 +79,7 @@ if (dlgProgress) { CURL url(vecPaths[i]); - dlgProgress->SetLine(1, CVariant{url.GetWithoutUserDetails()}); + dlgProgress->SetLine(1, url.GetWithoutUserDetails()); dlgProgress->SetProgressAdvance(); dlgProgress->Progress(); } @@ -117,7 +117,7 @@ { CLog::Log(LOGDEBUG,"Testing Existence (%s)", url.GetRedacted().c_str()); - std::vector vecPaths; + vector vecPaths; if (!GetPaths(url, vecPaths)) return false; @@ -132,7 +132,7 @@ bool CMultiPathDirectory::Remove(const CURL& url) { - std::vector vecPaths; + vector vecPaths; if (!GetPaths(url, vecPaths)) return false; @@ -153,7 +153,7 @@ return ""; } -bool CMultiPathDirectory::GetPaths(const CURL& url, std::vector& vecPaths) +bool CMultiPathDirectory::GetPaths(const CURL& url, vector& vecPaths) { const std::string pathToUrl(url.Get()); return GetPaths(pathToUrl, vecPaths); @@ -168,7 +168,7 @@ path1.erase(path1.find_last_not_of('/')+1); // split on "/" - std::vector temp = StringUtils::Split(path1, '/'); + vector temp = StringUtils::Split(path1, '/'); if (temp.size() == 0) return false; @@ -185,7 +185,7 @@ URIUtils::RemoveSlashAtEnd(strPath1); // split on "/" - std::vector vecTemp = StringUtils::Split(strPath1, '/'); + vector vecTemp = StringUtils::Split(strPath1, '/'); if (vecTemp.empty()) return false; @@ -198,7 +198,7 @@ return false; } -std::string CMultiPathDirectory::ConstructMultiPath(const CFileItemList& items, const std::vector &stack) +std::string CMultiPathDirectory::ConstructMultiPath(const CFileItemList& items, const vector &stack) { // we replace all instances of comma's with double comma's, then separate // the paths using " , " @@ -220,23 +220,23 @@ strMultiPath += "/"; } -std::string CMultiPathDirectory::ConstructMultiPath(const std::vector &vecPaths) +std::string CMultiPathDirectory::ConstructMultiPath(const vector &vecPaths) { // we replace all instances of comma's with double comma's, then separate // the paths using " , " //CLog::Log(LOGDEBUG, "Building multipath"); std::string newPath = "multipath://"; //CLog::Log(LOGDEBUG, "-- adding path: %s", strPath.c_str()); - for (std::vector::const_iterator path = vecPaths.begin(); path != vecPaths.end(); ++path) + for (vector::const_iterator path = vecPaths.begin(); path != vecPaths.end(); ++path) AddToMultiPath(newPath, *path); //CLog::Log(LOGDEBUG, "Final path: %s", newPath.c_str()); return newPath; } -std::string CMultiPathDirectory::ConstructMultiPath(const std::set &setPaths) +std::string CMultiPathDirectory::ConstructMultiPath(const set &setPaths) { std::string newPath = "multipath://"; - for (std::set::const_iterator path = setPaths.begin(); path != setPaths.end(); ++path) + for (set::const_iterator path = setPaths.begin(); path != setPaths.end(); ++path) AddToMultiPath(newPath, *path); return newPath; @@ -264,7 +264,7 @@ if (!pItem1->m_bIsFolder) break; - std::vector stack; + vector stack; stack.push_back(i); CLog::Log(LOGDEBUG,"Testing path: [%03i] %s", i, pItem1->GetPath().c_str()); @@ -307,7 +307,7 @@ bool CMultiPathDirectory::SupportsWriteFileOperations(const std::string &strPath) { - std::vector paths; + vector paths; GetPaths(strPath, paths); for (unsigned int i = 0; i < paths.size(); ++i) if (CUtil::SupportsWriteFileOperations(paths[i])) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/MultiPathFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/MultiPathFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/MultiPathFile.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/MultiPathFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,6 +23,7 @@ #include "utils/URIUtils.h" #include "URL.h" +using namespace std; using namespace XFILE; CMultiPathFile::CMultiPathFile(void) @@ -37,7 +38,7 @@ // grab the filename off the url std::string path, fileName; URIUtils::Split(url.Get(), path, fileName); - std::vector vecPaths; + vector vecPaths; if (!CMultiPathDirectory::GetPaths(path, vecPaths)) return false; @@ -56,7 +57,7 @@ // grab the filename off the url std::string path, fileName; URIUtils::Split(url.Get(), path, fileName); - std::vector vecPaths; + vector vecPaths; if (!CMultiPathDirectory::GetPaths(path, vecPaths)) return false; @@ -75,7 +76,7 @@ // grab the filename off the url std::string path, fileName; URIUtils::Split(url.Get(), path, fileName); - std::vector vecPaths; + vector vecPaths; if (!CMultiPathDirectory::GetPaths(path, vecPaths)) return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeArtist.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeArtist.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeArtist.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeArtist.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -55,7 +55,7 @@ CQueryParams params; CollectQueryParams(params); - bool bSuccess = musicdatabase.GetArtistsNav(BuildPath(), items, !CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_SHOWCOMPILATIONARTISTS), params.GetGenreId()); + bool bSuccess = musicdatabase.GetArtistsNav(BuildPath(), items, !CSettings::Get().GetBool("musiclibrary.showcompilationartists"), params.GetGenreId()); musicdatabase.Close(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNode.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -48,6 +48,7 @@ #include "music/MusicDbUrl.h" #include "settings/Settings.h" +using namespace std; using namespace XFILE::MUSICDATABASEDIRECTORY; // Constructor is protected use ParseURL() @@ -71,7 +72,7 @@ std::string strDirectory=url.GetFileName(); URIUtils::RemoveSlashAtEnd(strDirectory); - std::vector Path = StringUtils::Split(strDirectory, '/'); + vector Path = StringUtils::Split(strDirectory, '/'); Path.insert(Path.begin(), ""); CDirectoryNode* pNode=NULL; @@ -95,7 +96,7 @@ // returns the database ids of the path, void CDirectoryNode::GetDatabaseInfo(const std::string& strPath, CQueryParams& params) { - std::unique_ptr pNode(CDirectoryNode::ParseURL(strPath)); + unique_ptr pNode(CDirectoryNode::ParseURL(strPath)); if (!pNode.get()) return; @@ -198,7 +199,7 @@ // Creates a musicdb url std::string CDirectoryNode::BuildPath() const { - std::vector array; + vector array; if (!m_strName.empty()) array.insert(array.begin(), m_strName); @@ -217,7 +218,7 @@ for (int i=0; i<(int)array.size(); ++i) strPath+=array[i]+"/"; - std::string options = m_options.GetOptionsString(); + string options = m_options.GetOptionsString(); if (!options.empty()) strPath += "?" + options; @@ -260,7 +261,7 @@ if (CanCache() && items.Load()) return true; - std::unique_ptr pNode(CDirectoryNode::CreateNode(GetChildType(), "", this)); + unique_ptr pNode(CDirectoryNode::CreateNode(GetChildType(), "", this)); bool bSuccess=false; if (pNode.get()) @@ -293,7 +294,7 @@ return; // always show "all" items by default - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_SHOWALLITEMS)) + if (!CSettings::Get().GetBool("musiclibrary.showallitems")) return; // no need for "all" item when only one item diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeOverview.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeOverview.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeOverview.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeOverview.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -43,6 +43,7 @@ }; }; +using namespace std; using namespace XFILE::MUSICDATABASEDIRECTORY; CDirectoryNodeOverview::CDirectoryNodeOverview(const std::string& strName, CDirectoryNode* pParent) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeTop100.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeTop100.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeTop100.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/MusicDatabaseDirectory/DirectoryNodeTop100.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,6 +23,7 @@ #include "guilib/LocalizeStrings.h" #include "utils/StringUtils.h" +using namespace std; using namespace XFILE::MUSICDATABASEDIRECTORY; Node Top100Children[] = { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/MusicDatabaseDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/MusicDatabaseDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/MusicDatabaseDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/MusicDatabaseDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -30,6 +30,7 @@ #include "utils/LegacyPathTranslation.h" #include "utils/StringUtils.h" +using namespace std; using namespace XFILE; using namespace MUSICDATABASEDIRECTORY; @@ -45,9 +46,7 @@ { std::string path = CLegacyPathTranslation::TranslateMusicDbPath(url); items.SetPath(path); - items.m_dwSize = -1; // No size - - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return false; @@ -71,7 +70,7 @@ NODE_TYPE CMusicDatabaseDirectory::GetDirectoryChildType(const std::string& strPath) { std::string path = CLegacyPathTranslation::TranslateMusicDbPath(strPath); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return NODE_TYPE_NONE; @@ -82,7 +81,7 @@ NODE_TYPE CMusicDatabaseDirectory::GetDirectoryType(const std::string& strPath) { std::string path = CLegacyPathTranslation::TranslateMusicDbPath(strPath); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return NODE_TYPE_NONE; @@ -93,7 +92,7 @@ NODE_TYPE CMusicDatabaseDirectory::GetDirectoryParentType(const std::string& strPath) { std::string path = CLegacyPathTranslation::TranslateMusicDbPath(strPath); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return NODE_TYPE_NONE; @@ -143,7 +142,7 @@ strLabel = ""; std::string path = CLegacyPathTranslation::TranslateMusicDbPath(strDirectory); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return false; @@ -249,7 +248,7 @@ bool CMusicDatabaseDirectory::Exists(const CURL& url) { std::string path = CLegacyPathTranslation::TranslateMusicDbPath(url); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return false; @@ -263,7 +262,7 @@ bool CMusicDatabaseDirectory::CanCache(const std::string& strPath) { std::string path = CLegacyPathTranslation::TranslateMusicDbPath(strPath); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return false; return pNode->CanCache(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/NFSDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/NFSDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/NFSDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/NFSDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -34,6 +34,7 @@ #include "utils/StringUtils.h" #include "threads/SingleLock.h" using namespace XFILE; +using namespace std; #include #include @@ -150,7 +151,7 @@ if (ret != 0) { CLog::Log(LOGERROR, "NFS: Failed to stat(%s) on link resolve %s\n", fullpath.c_str(), gNfsConnection.GetImpl()->nfs_get_error(gNfsConnection.GetNfsContext())); - retVal = false; + retVal = false;; } else { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/PlaylistFileDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/PlaylistFileDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/PlaylistFileDirectory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/PlaylistFileDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,6 +24,7 @@ #include "URL.h" #include "playlists/PlayList.h" +using namespace std; using namespace PLAYLIST; namespace XFILE @@ -39,7 +40,7 @@ bool CPlaylistFileDirectory::GetDirectory(const CURL& url, CFileItemList& items) { const std::string pathToUrl = url.Get(); - std::unique_ptr pPlayList (CPlayListFactory::Create(pathToUrl)); + unique_ptr pPlayList (CPlayListFactory::Create(pathToUrl)); if ( NULL != pPlayList.get()) { // load it @@ -61,7 +62,7 @@ bool CPlaylistFileDirectory::ContainsFiles(const CURL& url) { const std::string pathToUrl = url.Get(); - std::unique_ptr pPlayList (CPlayListFactory::Create(pathToUrl)); + unique_ptr pPlayList (CPlayListFactory::Create(pathToUrl)); if ( NULL != pPlayList.get()) { // load it diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/PluginDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/PluginDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/PluginDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/PluginDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -34,15 +34,15 @@ #include "video/VideoInfoTag.h" #include "utils/log.h" #include "utils/StringUtils.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "Application.h" #include "URL.h" using namespace XFILE; +using namespace std; using namespace ADDON; -using namespace KODI::MESSAGING; -std::map CPluginDirectory::globalHandles; +map CPluginDirectory::globalHandles; int CPluginDirectory::handleCounter = 0; CCriticalSection CPluginDirectory::m_handleLock; @@ -79,7 +79,7 @@ CPluginDirectory *CPluginDirectory::dirFromHandle(int handle) { CSingleLock lock(m_handleLock); - std::map::iterator i = globalHandles.find(handle); + map::iterator i = globalHandles.find(handle); if (i != globalHandles.end()) return i->second; CLog::Log(LOGWARNING, "Attempt to use invalid handle %i", handle); @@ -91,9 +91,9 @@ CURL url(strPath); // try the plugin type first, and if not found, try an unknown type - if (!CAddonMgr::GetInstance().GetAddon(url.GetHostName(), m_addon, ADDON_PLUGIN) && - !CAddonMgr::GetInstance().GetAddon(url.GetHostName(), m_addon, ADDON_UNKNOWN) && - !CAddonInstaller::GetInstance().InstallModal(url.GetHostName(), m_addon)) + if (!CAddonMgr::Get().GetAddon(url.GetHostName(), m_addon, ADDON_PLUGIN) && + !CAddonMgr::Get().GetAddon(url.GetHostName(), m_addon, ADDON_UNKNOWN) && + !CAddonInstaller::Get().InstallModal(url.GetHostName(), m_addon)) { CLog::Log(LOGERROR, "Unable to find plugin %s", url.GetHostName().c_str()); return false; @@ -120,7 +120,7 @@ // setup our parameters to send the script std::string strHandle = StringUtils::Format("%i", handle); - std::vector argv; + vector argv; argv.push_back(basePath); argv.push_back(strHandle); argv.push_back(options); @@ -129,7 +129,7 @@ CLog::Log(LOGDEBUG, "%s - calling plugin %s('%s','%s','%s')", __FUNCTION__, m_addon->Name().c_str(), argv[0].c_str(), argv[1].c_str(), argv[2].c_str()); bool success = false; std::string file = m_addon->LibPath(); - int id = CScriptInvocationManager::GetInstance().ExecuteAsync(file, m_addon, argv); + int id = CScriptInvocationManager::Get().ExecuteAsync(file, m_addon, argv); if (id >= 0) { // wait for our script to finish std::string scriptName = m_addon->Name(); @@ -147,20 +147,21 @@ bool CPluginDirectory::GetPluginResult(const std::string& strPath, CFileItem &resultItem) { CURL url(strPath); - CPluginDirectory newDir; + CPluginDirectory* newDir = new CPluginDirectory(); - bool success = newDir.StartScript(strPath, false); + bool success = newDir->StartScript(strPath, false); if (success) { // update the play path and metadata, saving the old one as needed if (!resultItem.HasProperty("original_listitem_url")) resultItem.SetProperty("original_listitem_url", resultItem.GetPath()); - resultItem.SetPath(newDir.m_fileResult->GetPath()); - resultItem.SetMimeType(newDir.m_fileResult->GetMimeType()); - resultItem.UpdateInfo(*newDir.m_fileResult); - if (newDir.m_fileResult->HasVideoInfoTag() && newDir.m_fileResult->GetVideoInfoTag()->m_resumePoint.IsSet()) + resultItem.SetPath(newDir->m_fileResult->GetPath()); + resultItem.SetMimeType(newDir->m_fileResult->GetMimeType()); + resultItem.UpdateInfo(*newDir->m_fileResult); + if (newDir->m_fileResult->HasVideoInfoTag() && newDir->m_fileResult->GetVideoInfoTag()->m_resumePoint.IsSet()) resultItem.m_lStartOffset = STARTOFFSET_RESUME; // resume point set in the resume item, so force resume } + delete newDir; return success; } @@ -227,25 +228,25 @@ case SORT_METHOD_LABEL: case SORT_METHOD_LABEL_IGNORE_THE: { - dir->m_listItems->AddSortMethod(SortByLabel, 551, LABEL_MASKS("%T", label2Mask), CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + dir->m_listItems->AddSortMethod(SortByLabel, 551, LABEL_MASKS("%T", label2Mask), CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); break; } case SORT_METHOD_TITLE: case SORT_METHOD_TITLE_IGNORE_THE: { - dir->m_listItems->AddSortMethod(SortByTitle, 556, LABEL_MASKS("%T", label2Mask), CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + dir->m_listItems->AddSortMethod(SortByTitle, 556, LABEL_MASKS("%T", label2Mask), CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); break; } case SORT_METHOD_ARTIST: case SORT_METHOD_ARTIST_IGNORE_THE: { - dir->m_listItems->AddSortMethod(SortByArtist, 557, LABEL_MASKS("%T", "%A"), CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + dir->m_listItems->AddSortMethod(SortByArtist, 557, LABEL_MASKS("%T", "%A"), CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); break; } case SORT_METHOD_ALBUM: case SORT_METHOD_ALBUM_IGNORE_THE: { - dir->m_listItems->AddSortMethod(SortByAlbum, 558, LABEL_MASKS("%T", "%B"), CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + dir->m_listItems->AddSortMethod(SortByAlbum, 558, LABEL_MASKS("%T", "%B"), CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); break; } case SORT_METHOD_DATE: @@ -308,7 +309,7 @@ case SORT_METHOD_VIDEO_SORT_TITLE: case SORT_METHOD_VIDEO_SORT_TITLE_IGNORE_THE: { - dir->m_listItems->AddSortMethod(SortBySortTitle, 556, LABEL_MASKS("%T", label2Mask), CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + dir->m_listItems->AddSortMethod(SortBySortTitle, 556, LABEL_MASKS("%T", label2Mask), CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); break; } case SORT_METHOD_MPAA_RATING: @@ -319,7 +320,7 @@ case SORT_METHOD_STUDIO: case SORT_METHOD_STUDIO_IGNORE_THE: { - dir->m_listItems->AddSortMethod(SortByStudio, 572, LABEL_MASKS("%T", "%U"), CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + dir->m_listItems->AddSortMethod(SortByStudio, 572, LABEL_MASKS("%T", "%U"), CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); break; } case SORT_METHOD_PROGRAM_COUNT: @@ -344,8 +345,10 @@ } case SORT_METHOD_PLAYLIST_ORDER: { - std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - dir->m_listItems->AddSortMethod(SortByPlaylistOrder, 559, LABEL_MASKS(strTrack, "%D")); + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.trackformatright"); + + dir->m_listItems->AddSortMethod(SortByPlaylistOrder, 559, LABEL_MASKS(strTrackLeft, strTrackRight)); break; } case SORT_METHOD_EPISODE: @@ -418,7 +421,7 @@ return false; AddonPtr addon; - if (!CAddonMgr::GetInstance().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN) && !CAddonInstaller::GetInstance().InstallModal(url.GetHostName(), addon)) + if (!CAddonMgr::Get().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN) && !CAddonInstaller::Get().InstallModal(url.GetHostName(), addon)) { CLog::Log(LOGERROR, "Unable to find plugin %s", url.GetHostName().c_str()); return false; @@ -433,14 +436,14 @@ // setup our parameters to send the script std::string strHandle = StringUtils::Format("%i", -1); - std::vector argv; + vector argv; argv.push_back(basePath); argv.push_back(strHandle); argv.push_back(options); // run the script CLog::Log(LOGDEBUG, "%s - calling plugin %s('%s','%s','%s')", __FUNCTION__, addon->Name().c_str(), argv[0].c_str(), argv[1].c_str(), argv[2].c_str()); - if (CScriptInvocationManager::GetInstance().ExecuteAsync(addon->LibPath(), addon, argv) >= 0) + if (CScriptInvocationManager::Get().ExecuteAsync(addon->LibPath(), addon, argv) >= 0) return true; else CLog::Log(LOGERROR, "Unable to run plugin %s", addon->Name().c_str()); @@ -471,7 +474,7 @@ } } // check our script is still running - if (!CScriptInvocationManager::GetInstance().IsRunning(scriptId)) + if (!CScriptInvocationManager::Get().IsRunning(scriptId)) { // check whether we exited normally if (!m_fetchComplete.WaitMSec(0)) { // python didn't return correctly @@ -495,12 +498,12 @@ if (progressBar) { - progressBar->SetHeading(CVariant{scriptName}); - progressBar->SetLine(0, CVariant{10214}); - progressBar->SetLine(1, CVariant{""}); - progressBar->SetLine(2, CVariant{""}); + progressBar->SetHeading(scriptName); + progressBar->SetLine(0, 10214); + progressBar->SetLine(1, ""); + progressBar->SetLine(2, ""); progressBar->ShowProgressBar(false); - progressBar->Open(); + progressBar->StartModal(); } } @@ -524,17 +527,17 @@ } if ((cancelled && XbmcThreads::SystemClockMillis() - startTime > timeToKillScript) || g_application.m_bStop) { // cancel our script - if (scriptId != -1 && CScriptInvocationManager::GetInstance().IsRunning(scriptId)) + if (scriptId != -1 && CScriptInvocationManager::Get().IsRunning(scriptId)) { CLog::Log(LOGDEBUG, "%s- cancelling plugin %s (id=%d)", __FUNCTION__, scriptName.c_str(), scriptId); - CScriptInvocationManager::GetInstance().Stop(scriptId); + CScriptInvocationManager::Get().Stop(scriptId); break; } } } if (progressBar) - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_WINDOW_CLOSE, -1, 0, static_cast(progressBar)); + CApplicationMessenger::Get().Close(progressBar, false, false); return !cancelled && m_success; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/posix/PosixDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/posix/PosixDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/posix/PosixDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/posix/PosixDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,6 +32,7 @@ #include #include +using namespace std; using namespace XFILE; CPosixDirectory::CPosixDirectory(void) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/PVRDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/PVRDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/PVRDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/PVRDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -31,6 +31,7 @@ #include "pvr/recordings/PVRRecordings.h" #include "pvr/timers/PVRTimers.h" +using namespace std; using namespace XFILE; using namespace PVR; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/PVRFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/PVRFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/PVRFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/PVRFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -28,12 +28,14 @@ #include "utils/StringUtils.h" #include "URL.h" +using namespace std; using namespace XFILE; using namespace PVR; CPVRFile::CPVRFile() { m_isPlayRecording = false; + m_playingItem = -1; } CPVRFile::~CPVRFile() @@ -161,6 +163,7 @@ */ if (g_PVRManager.ChannelUp(&newchannel, preview)) { + m_playingItem = newchannel; return true; } else @@ -185,6 +188,7 @@ */ if (g_PVRManager.ChannelDown(&newchannel, preview)) { + m_playingItem = newchannel; return true; } else @@ -193,7 +197,7 @@ } } -bool CPVRFile::SelectChannelById(unsigned int channelid) +bool CPVRFile::SelectChannel(unsigned int channel) { if (m_isPlayRecording) { @@ -204,8 +208,9 @@ return true; } - if (g_PVRManager.ChannelSwitchById(channelid)) + if (g_PVRManager.ChannelSwitch(channel)) { + m_playingItem = channel; return true; } else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/PVRFile.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/PVRFile.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/PVRFile.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/PVRFile.h 2015-06-14 19:32:50.000000000 +0000 @@ -53,7 +53,7 @@ virtual bool NextChannel(bool preview = false); virtual bool PrevChannel(bool preview = false); - virtual bool SelectChannelById(unsigned int channelid); + virtual bool SelectChannel(unsigned int channel); virtual int GetTotalTime(); virtual int GetStartTime(); @@ -71,6 +71,7 @@ protected: bool m_isPlayRecording; + int m_playingItem; }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/RarFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/RarFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/RarFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/RarFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,6 @@ #include "system.h" #include "RarFile.h" -#include #include #include "Util.h" #include "utils/CharsetConverter.h" @@ -39,6 +38,7 @@ #endif using namespace XFILE; +using namespace std; #define SEEKTIMOUT 30000 @@ -302,7 +302,7 @@ int64_t uicBufSize = uiBufSize; if (m_iDataInBuffer > 0) { - int64_t iCopy = std::min(static_cast(uiBufSize), m_iDataInBuffer); + int64_t iCopy = (uiBufSize < static_cast(m_iDataInBuffer)) ? uiBufSize : m_iDataInBuffer; memcpy(lpBuf,m_szStartOfBuffer,size_t(iCopy)); m_szStartOfBuffer += iCopy; m_iDataInBuffer -= int(iCopy); @@ -551,13 +551,13 @@ m_strPassword = url.GetUserName(); m_strPathInRar = url.GetFileName(); - std::vector options; + vector options; if (!url.GetOptions().empty()) StringUtils::Tokenize(url.GetOptions().substr(1), options, "&"); m_bFileOptions = 0; - for(std::vector::iterator it = options.begin();it != options.end(); ++it) + for( vector::iterator it = options.begin();it != options.end(); ++it) { size_t iEqual = (*it).find('='); if(iEqual != std::string::npos) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/RarManager.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/RarManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/RarManager.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/RarManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -36,12 +36,12 @@ #include "dialogs/GUIDialogProgress.h" #include "guilib/GUIWindowManager.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include #define EXTRACTION_WARN_SIZE 50*1024*1024 +using namespace std; using namespace XFILE; CFileInfo::CFileInfo() @@ -97,8 +97,8 @@ { if (!shown) { - dlg->SetHeading(CVariant{heading}); - dlg->Open(); + dlg->SetHeading(heading); + dlg->StartModal(); } if (progress >= 0) { @@ -106,7 +106,7 @@ dlg->SetPercentage(progress); } if (text) - dlg->SetLine(1, CVariant{text}); + dlg->SetLine(1, text); cont = !dlg->IsCanceled(); shown = true; // tell render loop to spin @@ -139,7 +139,7 @@ //If file is listed in the cache, then use listed copy or cleanup before overwriting. bool bOverwrite = (bOptions & EXFILE_OVERWRITE) != 0; - std::map > >::iterator j = m_ExFiles.find( strRarPath ); + map > >::iterator j = m_ExFiles.find( strRarPath ); CFileInfo* pFile=NULL; if( j != m_ExFiles.end() ) { @@ -170,12 +170,11 @@ CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (pDialog) { - pDialog->SetHeading(CVariant{120}); - pDialog->SetLine(0, CVariant{645}); - pDialog->SetLine(1, CVariant{URIUtils::GetFileName(strPathInRar)}); - pDialog->SetLine(2, CVariant{""}); - pDialog->Open(); - + pDialog->SetHeading(120); + pDialog->SetLine(0, 645); + pDialog->SetLine(1, URIUtils::GetFileName(strPathInRar)); + pDialog->SetLine(2, ""); + pDialog->DoModal(); if (!pDialog->IsConfirmed()) iRes = 2; // pretend to be canceled } @@ -270,7 +269,7 @@ ArchiveList_struct* pArchiveList; if(ListArchive(strRarPath,pArchiveList)) { - m_ExFiles.insert(std::make_pair(strRarPath, std::make_pair(pArchiveList, std::vector()))); + m_ExFiles.insert(make_pair(strRarPath,make_pair(pArchiveList,vector()))); j = m_ExFiles.find(strRarPath); } else @@ -303,11 +302,11 @@ CSingleLock lock(m_CritSection); ArchiveList_struct* pFileList = NULL; - std::map > >::iterator it = m_ExFiles.find(strRarPath); + map > >::iterator it = m_ExFiles.find(strRarPath); if (it == m_ExFiles.end()) { if( urarlib_list((char*) strRarPath.c_str(), &pFileList, NULL) ) - m_ExFiles.insert(std::make_pair(strRarPath, std::make_pair(pFileList, std::vector()))); + m_ExFiles.insert(make_pair(strRarPath,make_pair(pFileList,vector()))); else { if( pFileList ) urarlib_freelist(pFileList); @@ -318,8 +317,8 @@ pFileList = it->second.first; CFileItemPtr pFileItem; - std::vector vec; - std::set dirSet; + vector vec; + set dirSet; StringUtils::Tokenize(strPathInRar,vec,"/"); unsigned int iDepth = vec.size(); @@ -408,11 +407,11 @@ CFileInfo* CRarManager::GetFileInRar(const std::string& strRarPath, const std::string& strPathInRar) { #ifdef HAS_FILESYSTEM_RAR - std::map > >::iterator j = m_ExFiles.find(strRarPath); + map > >::iterator j = m_ExFiles.find(strRarPath); if (j == m_ExFiles.end()) return NULL; - for (std::vector::iterator it2=j->second.second.begin(); it2 != j->second.second.end(); ++it2) + for (vector::iterator it2=j->second.second.begin(); it2 != j->second.second.end(); ++it2) if (it2->m_strPathInRar == strPathInRar) return &(*it2); #endif @@ -422,11 +421,11 @@ bool CRarManager::GetPathInCache(std::string& strPathInCache, const std::string& strRarPath, const std::string& strPathInRar) { #ifdef HAS_FILESYSTEM_RAR - std::map > >::iterator j = m_ExFiles.find(strRarPath); + map > >::iterator j = m_ExFiles.find(strRarPath); if (j == m_ExFiles.end()) return false; - for (std::vector::iterator it2=j->second.second.begin(); it2 != j->second.second.end(); ++it2) + for (vector::iterator it2=j->second.second.begin(); it2 != j->second.second.end(); ++it2) if (it2->m_strPathInRar == strPathInRar) return CFile::Exists(it2->m_strCachedPath); #endif @@ -461,11 +460,11 @@ { #ifdef HAS_FILESYSTEM_RAR CSingleLock lock(m_CritSection); - std::map > >::iterator j; + map > >::iterator j; for (j = m_ExFiles.begin() ; j != m_ExFiles.end() ; ++j) { - for (std::vector::iterator it2 = j->second.second.begin(); it2 != j->second.second.end(); ++it2) + for (vector::iterator it2 = j->second.second.begin(); it2 != j->second.second.end(); ++it2) { CFileInfo* pFile = &(*it2); if (pFile->m_bAutoDel && (pFile->m_iUsed < 1 || force)) @@ -483,13 +482,13 @@ #ifdef HAS_FILESYSTEM_RAR CSingleLock lock(m_CritSection); - std::map > >::iterator j = m_ExFiles.find(strRarPath); + map > >::iterator j = m_ExFiles.find(strRarPath); if (j == m_ExFiles.end()) { return; // no such subpath } - for (std::vector::iterator it = j->second.second.begin(); it != j->second.second.end(); ++it) + for (vector::iterator it = j->second.second.begin(); it != j->second.second.end(); ++it) { if (it->m_strPathInRar == strPathInRar) if (it->m_iUsed > 0) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/RarManager.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/RarManager.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/RarManager.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/RarManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,3 +1,6 @@ +#if !defined(AFX_RARMANAGER_H__06BA7C2E_3FCA_11D9_8186_0050FC718317__INCLUDED_) +#define AFX_RARMANAGER_H__06BA7C2E_3FCA_11D9_8186_0050FC718317__INCLUDED_ + #pragma once /* * Copyright (C) 2005-2013 Team XBMC @@ -19,12 +22,10 @@ * */ -#include #include -#include -#include - #include "threads/CriticalSection.h" +#include +#include #include "UnrarXLib/UnrarX.hpp" #include "utils/Stopwatch.h" @@ -87,4 +88,5 @@ }; extern CRarManager g_RarManager; +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/ResourceFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/ResourceFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/ResourceFile.cpp 2016-01-21 07:38:29.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/ResourceFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -49,26 +49,23 @@ return false; // the share name represents an identifier that can be mapped to an addon ID - std::string addonId = url.GetShareName(); - std::string filePath; - if (url.GetFileName().length() > addonId.length()) - filePath = url.GetFileName().substr(addonId.size() + 1); - + std::string addonId = url.GetHostName(); if (addonId.empty()) return false; AddonPtr addon; - if (!CAddonMgr::GetInstance().GetAddon(addonId, addon, ADDON_UNKNOWN, true) || addon == NULL) + if (!CAddonMgr::Get().GetAddon(addonId, addon, ADDON_UNKNOWN, true) || addon == NULL) return false; std::shared_ptr resource = std::dynamic_pointer_cast(addon); if (resource == NULL) return false; + std::string filePath = url.GetFileName(); if (!resource->IsAllowed(filePath)) return false; - translatedPath = CUtil::ValidatePath(resource->GetFullPath(filePath)); + translatedPath = CUtil::ValidatePath(URIUtils::AddFileToFolder(addon->Path(), "resources/" + filePath)); return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/RSSDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/RSSDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/RSSDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/RSSDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,25 +19,23 @@ */ #include "RSSDirectory.h" - -#include -#include - -#include "CurlFile.h" #include "FileItem.h" +#include "CurlFile.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" -#include "threads/SingleLock.h" -#include "URL.h" -#include "utils/HTMLUtil.h" -#include "utils/log.h" -#include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "utils/XBMCTinyXML.h" #include "utils/XMLUtils.h" +#include "utils/HTMLUtil.h" +#include "utils/StringUtils.h" #include "video/VideoInfoTag.h" +#include "utils/log.h" +#include "URL.h" +#include "climits" +#include "threads/SingleLock.h" using namespace XFILE; +using namespace std; using namespace MUSIC_INFO; namespace { @@ -468,7 +466,7 @@ else if(FindMime(resources, "image/")) mime = "image/"; - int maxrate = CSettings::GetInstance().GetInt(CSettings::SETTING_NETWORK_BANDWIDTH); + int maxrate = CSettings::Get().GetInt("network.bandwidth"); if(maxrate == 0) maxrate = INT_MAX; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SAPDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/SAPDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SAPDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SAPDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -43,6 +43,8 @@ #include #include +//using namespace std; On VS2010, bind conflicts with std::bind + CSAPSessions g_sapsessions; namespace SDP diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SAPFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/SAPFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SAPFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SAPFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,6 +29,7 @@ #include #include +using namespace std; using namespace XFILE; ////////////////////////////////////////////////////////////////////// @@ -48,7 +49,7 @@ std::string path = url.Get(); CSingleLock lock(g_sapsessions.m_section); - for(std::vector::iterator it = g_sapsessions.m_sessions.begin(); it != g_sapsessions.m_sessions.end(); ++it) + for(vector::iterator it = g_sapsessions.m_sessions.begin(); it != g_sapsessions.m_sessions.end(); ++it) { if(it->path == path) { @@ -69,7 +70,7 @@ std::string path = url.Get(); CSingleLock lock(g_sapsessions.m_section); - for(std::vector::iterator it = g_sapsessions.m_sessions.begin(); it != g_sapsessions.m_sessions.end(); ++it) + for(vector::iterator it = g_sapsessions.m_sessions.begin(); it != g_sapsessions.m_sessions.end(); ++it) { if(it->path == path) return true; @@ -93,7 +94,7 @@ CSingleLock lock(g_sapsessions.m_section); - for(std::vector::iterator it = g_sapsessions.m_sessions.begin(); it != g_sapsessions.m_sessions.end(); ++it) + for(vector::iterator it = g_sapsessions.m_sessions.begin(); it != g_sapsessions.m_sessions.end(); ++it) { if(it->path == path) { @@ -130,13 +131,13 @@ switch (iWhence) { case SEEK_SET: - m_stream.seekg((int)iFilePosition, std::ios_base::beg); + m_stream.seekg((int)iFilePosition, ios_base::beg); break; case SEEK_CUR: - m_stream.seekg((int)iFilePosition, std::ios_base::cur); + m_stream.seekg((int)iFilePosition, ios_base::cur); break; case SEEK_END: - m_stream.seekg((int)iFilePosition, std::ios_base::end); + m_stream.seekg((int)iFilePosition, ios_base::end); break; default: return -1; @@ -161,7 +162,7 @@ std::string path = url.Get(); CSingleLock lock(g_sapsessions.m_section); - for(std::vector::iterator it = g_sapsessions.m_sessions.begin(); it != g_sapsessions.m_sessions.end(); ++it) + for(vector::iterator it = g_sapsessions.m_sessions.begin(); it != g_sapsessions.m_sessions.end(); ++it) { if(it->path == path) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SFTPFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/SFTPFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SFTPFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SFTPFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -42,6 +42,7 @@ #endif using namespace XFILE; +using namespace std; static std::string CorrectPath(const std::string& path) @@ -529,13 +530,13 @@ } CCriticalSection CSFTPSessionManager::m_critSect; -std::map CSFTPSessionManager::sessions; +map CSFTPSessionManager::sessions; CSFTPSessionPtr CSFTPSessionManager::CreateSession(const CURL &url) { - std::string username = url.GetUserName().c_str(); - std::string password = url.GetPassWord().c_str(); - std::string hostname = url.GetHostName().c_str(); + string username = url.GetUserName().c_str(); + string password = url.GetPassWord().c_str(); + string hostname = url.GetHostName().c_str(); unsigned int port = url.HasPort() ? url.GetPort() : 22; return CSFTPSessionManager::CreateSession(hostname, port, username, password); @@ -544,7 +545,7 @@ CSFTPSessionPtr CSFTPSessionManager::CreateSession(const std::string &host, unsigned int port, const std::string &username, const std::string &password) { // Convert port number to string - std::stringstream itoa; + stringstream itoa; itoa << port; std::string portstr = itoa.str(); @@ -563,7 +564,7 @@ void CSFTPSessionManager::ClearOutIdleSessions() { CSingleLock lock(m_critSect); - for(std::map::iterator iter = sessions.begin(); iter != sessions.end();) + for(map::iterator iter = sessions.begin(); iter != sessions.end();) { if (iter->second->IsIdle()) sessions.erase(iter++); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/ShoutcastFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/ShoutcastFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/ShoutcastFile.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/ShoutcastFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -30,14 +30,12 @@ #include "utils/RegExp.h" #include "utils/HTMLUtil.h" #include "utils/CharsetConverter.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "FileCache.h" -#include "FileItem.h" #include using namespace XFILE; using namespace MUSIC_INFO; -using namespace KODI::MESSAGING; CShoutcastFile::CShoutcastFile() : IFile(), CThread("ShoutcastFile") @@ -204,7 +202,7 @@ { while (!m_bStop && m_cacheReader->GetPosition() < m_tagPos) Sleep(20); - CApplicationMessenger::GetInstance().PostMsg(TMSG_UPDATE_CURRENT_ITEM, 1,-1, static_cast(new CFileItem(m_tag))); + CApplicationMessenger::Get().SetCurrentSongTag(m_tag); m_tagPos = 0; } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SlingboxDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/SlingboxDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SlingboxDirectory.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SlingboxDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2011-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "SlingboxDirectory.h" +#include "FileItem.h" +#include "URL.h" + +using namespace XFILE; +using namespace std; + +CSlingboxDirectory::CSlingboxDirectory() +{ +} + +CSlingboxDirectory::~CSlingboxDirectory() +{ +} + +bool CSlingboxDirectory::GetDirectory(const CURL& url, CFileItemList &items) +{ + // Create generic Watch Slingbox item + const std::string pathToUrl(url.Get()); + CFileItemPtr item(new CFileItem(pathToUrl, false)); + item->SetLabel("Watch Slingbox"); + item->SetLabelPreformated(true); + items.Add(item); + + return true; +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SlingboxDirectory.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/SlingboxDirectory.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SlingboxDirectory.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SlingboxDirectory.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,37 @@ +#pragma once +/* + * Copyright (C) 2011-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + + #include "IDirectory.h" + +namespace XFILE +{ + + class CSlingboxDirectory + : public IDirectory + { + public: + CSlingboxDirectory(); + virtual ~CSlingboxDirectory(); + + virtual bool AllowAll() const { return true; } + virtual bool GetDirectory(const CURL& url, CFileItemList &items); + }; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SlingboxFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/SlingboxFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SlingboxFile.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SlingboxFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,604 @@ +/* + * Copyright (C) 2011-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "FileItem.h" +#include "SlingboxFile.h" +#include "filesystem/File.h" +#include "lib/SlingboxLib/SlingboxLib.h" +#include "profiles/ProfilesManager.h" +#include "utils/log.h" +#include "utils/XMLUtils.h" +#include "utils/StringUtils.h" +#include "URL.h" + +using namespace XFILE; +using namespace std; + +CSlingboxFile::CSlingboxFile() +{ + // Create the Slingbox object + m_pSlingbox = new CSlingbox(); +} + +CSlingboxFile::~CSlingboxFile() +{ + // Destroy the Slingbox object + delete m_pSlingbox; +} + +bool CSlingboxFile::Open(const CURL& url) +{ + // Setup the IP/hostname and port (setup default port if none specified) + unsigned int uiPort; + if (url.HasPort()) + uiPort = (unsigned int)url.GetPort(); + else + uiPort = 5001; + m_pSlingbox->SetAddress(url.GetHostName().c_str(), uiPort); + + // Prepare to connect to the Slingbox + bool bAdmin; + if (StringUtils::EqualsNoCase(url.GetUserName(), "administrator")) + bAdmin = true; + else if (StringUtils::EqualsNoCase(url.GetUserName(), "viewer")) + bAdmin = false; + else + { + CLog::Log(LOGERROR, "%s - Invalid or no username specified for Slingbox: %s", + __FUNCTION__, url.GetHostName().c_str()); + return false; + } + + // Connect to the Slingbox + if (m_pSlingbox->Connect(bAdmin, url.GetPassWord().c_str())) + { + CLog::Log(LOGDEBUG, "%s - Successfully connected to Slingbox: %s", + __FUNCTION__, url.GetHostName().c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error connecting to Slingbox: %s", + __FUNCTION__, url.GetHostName().c_str()); + return false; + } + + // Initialize the stream + if (m_pSlingbox->InitializeStream()) + { + CLog::Log(LOGDEBUG, "%s - Successfully initialized stream on Slingbox: %s", + __FUNCTION__, url.GetHostName().c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error initializing stream on Slingbox: %s", + __FUNCTION__, url.GetHostName().c_str()); + return false; + } + + // Set correct input + if (url.GetFileNameWithoutPath() != "") + { + if (m_pSlingbox->SetInput(atoi(url.GetFileNameWithoutPath().c_str()))) + CLog::Log(LOGDEBUG, "%s - Successfully requested change to input %i on Slingbox: %s", + __FUNCTION__, atoi(url.GetFileNameWithoutPath().c_str()), url.GetHostName().c_str()); + else + CLog::Log(LOGERROR, "%s - Error requesting change to input %i on Slingbox: %s", + __FUNCTION__, atoi(url.GetFileNameWithoutPath().c_str()), url.GetHostName().c_str()); + } + + // Load the video settings + LoadSettings(url.GetHostName()); + + // Setup video options + if (m_pSlingbox->StreamSettings((CSlingbox::Resolution)m_sSlingboxSettings.iVideoResolution, + m_sSlingboxSettings.iVideoBitrate, m_sSlingboxSettings.iVideoFramerate, + m_sSlingboxSettings.iVideoSmoothing, m_sSlingboxSettings.iAudioBitrate, + m_sSlingboxSettings.iIFrameInterval)) + { + CLog::Log(LOGDEBUG, "%s - Successfully set stream options (resolution: %ix%i; " + "video bitrate: %i kbit/s; fps: %i; smoothing: %i%%; audio bitrate %i kbit/s; " + "I frame interval: %i) on Slingbox: %s", __FUNCTION__, + m_sSlingboxSettings.iVideoWidth, m_sSlingboxSettings.iVideoHeight, + m_sSlingboxSettings.iVideoBitrate, m_sSlingboxSettings.iVideoFramerate, + m_sSlingboxSettings.iVideoSmoothing, m_sSlingboxSettings.iAudioBitrate, + m_sSlingboxSettings.iIFrameInterval, url.GetHostName().c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error setting stream options on Slingbox: %s", + __FUNCTION__, url.GetHostName().c_str()); + } + + // Start the stream + if (m_pSlingbox->StartStream()) + { + CLog::Log(LOGDEBUG, "%s - Successfully started stream on Slingbox: %s", + __FUNCTION__, url.GetHostName().c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error starting stream on Slingbox: %s", + __FUNCTION__, url.GetHostName().c_str()); + return false; + } + + // Check for correct input + if (url.GetFileNameWithoutPath() != "") + { + int input = atoi(url.GetFileNameWithoutPath().c_str()); + if (m_pSlingbox->GetInput() == -1) + CLog::Log(LOGDEBUG, "%s - Unable to confirm change to input %i on Slingbox: %s", + __FUNCTION__, input, url.GetHostName().c_str()); + else if (m_pSlingbox->GetInput() == input) + CLog::Log(LOGDEBUG, "%s - Comfirmed change to input %i on Slingbox: %s", + __FUNCTION__, input, url.GetHostName().c_str()); + else + CLog::Log(LOGERROR, "%s - Error changing to input %i on Slingbox: %s", + __FUNCTION__, input, url.GetHostName().c_str()); + } + + return true; +} + +ssize_t CSlingboxFile::Read(void * pBuffer, size_t iSize) +{ + if (iSize > SSIZE_MAX) + iSize = SSIZE_MAX; + + // Read the data and check for any errors + ssize_t iRead = m_pSlingbox->ReadStream(pBuffer, (unsigned int)iSize); + if (iRead < 0) + CLog::Log(LOGERROR, "%s - Error reading stream from Slingbox: %s", __FUNCTION__, + m_sSlingboxSettings.strHostname.c_str()); + + return iRead; +} + +void CSlingboxFile::Close() +{ + // Stop the stream + if (m_pSlingbox->StopStream()) + CLog::Log(LOGDEBUG, "%s - Successfully stopped stream on Slingbox: %s", __FUNCTION__, + m_sSlingboxSettings.strHostname.c_str()); + else + CLog::Log(LOGERROR, "%s - Error stopping stream on Slingbox: %s", __FUNCTION__, + m_sSlingboxSettings.strHostname.c_str()); + + // Disconnect from the Slingbox + if (m_pSlingbox->Disconnect()) + CLog::Log(LOGDEBUG, "%s - Successfully disconnected from Slingbox: %s", __FUNCTION__, + m_sSlingboxSettings.strHostname.c_str()); + else + CLog::Log(LOGERROR, "%s - Error disconnecting from Slingbox: %s", __FUNCTION__, + m_sSlingboxSettings.strHostname.c_str()); +} + +bool CSlingboxFile::SkipNext() +{ + return m_pSlingbox->IsConnected(); +} + +bool CSlingboxFile::NextChannel(bool bPreview /* = false */) +{ + // Prepare variables + bool bSuccess = true; + int iPrevChannel = m_pSlingbox->GetChannel(); + + // Stop the stream + if (m_pSlingbox->StopStream()) + { + CLog::Log(LOGDEBUG, "%s - Successfully stopped stream before channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error stopping stream before channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + + // Figure out which method to use + if (m_sSlingboxSettings.uiCodeChannelUp == 0) + { + // Change the channel + if (m_pSlingbox->ChannelUp()) + { + CLog::Log(LOGDEBUG, "%s - Successfully requested channel change on Slingbox: %s", + __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + + if (m_pSlingbox->GetChannel() == -1) + { + CLog::Log(LOGDEBUG, "%s - Unable to confirm channel change on Slingbox: %s", + __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + } + else if (m_pSlingbox->GetChannel() != iPrevChannel) + { + CLog::Log(LOGDEBUG, "%s - Confirmed change to channel %i on Slingbox: %s", + __FUNCTION__, m_pSlingbox->GetChannel(), m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error changing channel on Slingbox: %s", + __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + } + else + { + CLog::Log(LOGERROR, "%s - Error requesting channel change on Slingbox: %s", + __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + } + else + { + // Change the channel using IR command + if (m_pSlingbox->SendIRCommand(m_sSlingboxSettings.uiCodeChannelUp)) + { + CLog::Log(LOGDEBUG, "%s - Successfully sent IR command (code: 0x%.2X) from " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.uiCodeChannelUp, + m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error sending IR command (code: 0x%.2X) from " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.uiCodeChannelUp, + m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + } + + // Start the stream again + if (m_pSlingbox->StartStream()) + { + CLog::Log(LOGDEBUG, "%s - Successfully started stream after channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error starting stream after channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + + return bSuccess; +} + +bool CSlingboxFile::PrevChannel(bool bPreview /* = false */) +{ + // Prepare variables + bool bSuccess = true; + int iPrevChannel = m_pSlingbox->GetChannel(); + + // Stop the stream + if (m_pSlingbox->StopStream()) + { + CLog::Log(LOGDEBUG, "%s - Successfully stopped stream before channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error stopping stream before channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + + // Figure out which method to use + if (m_sSlingboxSettings.uiCodeChannelDown == 0) + { + // Change the channel + if (m_pSlingbox->ChannelDown()) + { + CLog::Log(LOGDEBUG, "%s - Successfully requested channel change on Slingbox: %s", + __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + + if (m_pSlingbox->GetChannel() == -1) + { + CLog::Log(LOGDEBUG, "%s - Unable to confirm channel change on Slingbox: %s", + __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + } + else if (m_pSlingbox->GetChannel() != iPrevChannel) + { + CLog::Log(LOGDEBUG, "%s - Confirmed change to channel %i on Slingbox: %s", + __FUNCTION__, m_pSlingbox->GetChannel(), m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error changing channel on Slingbox: %s", + __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + } + else + { + CLog::Log(LOGERROR, "%s - Error requesting channel change on Slingbox: %s", + __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + } + else + { + // Change the channel using IR command + if (m_pSlingbox->SendIRCommand(m_sSlingboxSettings.uiCodeChannelDown)) + { + CLog::Log(LOGDEBUG, "%s - Successfully sent IR command (code: 0x%.2X) from " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.uiCodeChannelDown, + m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error sending IR command (code: 0x%.2X) from " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.uiCodeChannelDown, + m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + } + + // Start the stream again + if (m_pSlingbox->StartStream()) + { + CLog::Log(LOGDEBUG, "%s - Successfully started stream after channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error starting Slingbox stream after channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + + return bSuccess; +} + +bool CSlingboxFile::SelectChannel(unsigned int uiChannel) +{ + // Check if a channel change is required + if (m_pSlingbox->GetChannel() == (int)uiChannel) + return false; + + // Prepare variables + bool bSuccess = true; + + // Stop the stream + if (m_pSlingbox->StopStream()) + { + CLog::Log(LOGDEBUG, "%s - Successfully stopped stream before channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error stopping stream before channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + + // Figure out which method to use + unsigned int uiButtonsWithCode = 0; + for (unsigned int i = 0; i < 10; i++) + { + if (m_sSlingboxSettings.uiCodeNumber[i] != 0) + uiButtonsWithCode++; + } + if (uiButtonsWithCode == 0) + { + // Change the channel + if (m_pSlingbox->SetChannel(uiChannel)) + { + CLog::Log(LOGDEBUG, "%s - Successfully requested change to channel %i on Slingbox: %s", + __FUNCTION__, uiChannel, m_sSlingboxSettings.strHostname.c_str()); + + if (m_pSlingbox->GetChannel() == -1) + { + CLog::Log(LOGDEBUG, "%s - Unable to confirm change to channel %i on Slingbox: %s", + __FUNCTION__, uiChannel, m_sSlingboxSettings.strHostname.c_str()); + } + else if (m_pSlingbox->GetChannel() == (int)uiChannel) + { + CLog::Log(LOGDEBUG, "%s - Confirmed change to channel %i on Slingbox: %s", + __FUNCTION__, uiChannel, m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error changing to channel %i on Slingbox: %s", + __FUNCTION__, uiChannel, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + } + else + { + CLog::Log(LOGERROR, "%s - Error requesting change to channel %i on Slingbox: %s", + __FUNCTION__, uiChannel, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + } + else if (uiButtonsWithCode == 10) + { + // Prepare variables + std::string strDigits = StringUtils::Format("%u", uiChannel); + size_t uiNumberOfDigits = strDigits.size(); + + // Change the channel using IR commands + for (size_t i = 0; i < uiNumberOfDigits; i++) + { + if (m_pSlingbox->SendIRCommand(m_sSlingboxSettings.uiCodeNumber[strDigits[i] - '0'])) + { + CLog::Log(LOGDEBUG, "%s - Successfully sent IR command (code: 0x%.2X) from " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.uiCodeNumber[strDigits[i] - '0'], + m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGDEBUG, "%s - Error sending IR command (code: 0x%.2X) from " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.uiCodeNumber[strDigits[i] - '0'], + m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + } + } + else + { + CLog::Log(LOGERROR, "%s - Error requesting change to channel %i on Slingbox due to one or more " + "missing button codes from advancedsettings.xml for Slingbox: %s", __FUNCTION__, uiChannel, + m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + + // Start the stream again + if (m_pSlingbox->StartStream()) + { + CLog::Log(LOGDEBUG, "%s - Successfully started stream after channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + } + else + { + CLog::Log(LOGERROR, "%s - Error starting stream after channel change request on " + "Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + bSuccess = false; + } + + return bSuccess; +} + +void CSlingboxFile::LoadSettings(const std::string& strHostname) +{ + // Load default settings + m_sSlingboxSettings.strHostname = strHostname; + m_sSlingboxSettings.iVideoWidth = 320; + m_sSlingboxSettings.iVideoHeight = 240; + m_sSlingboxSettings.iVideoResolution = (int)CSlingbox::RESOLUTION320X240; + m_sSlingboxSettings.iVideoBitrate = 704; + m_sSlingboxSettings.iVideoFramerate = 30; + m_sSlingboxSettings.iVideoSmoothing = 50; + m_sSlingboxSettings.iAudioBitrate = 64; + m_sSlingboxSettings.iIFrameInterval = 10; + m_sSlingboxSettings.uiCodeChannelUp = 0; + m_sSlingboxSettings.uiCodeChannelDown = 0; + for (unsigned int i = 0; i < 10; i++) + m_sSlingboxSettings.uiCodeNumber[i] = 0; + + // Check if a SlingboxSettings.xml file exists + std::string slingboxXMLFile = CProfilesManager::Get().GetUserDataItem("SlingboxSettings.xml"); + if (!CFile::Exists(slingboxXMLFile)) + { + CLog::Log(LOGNOTICE, "No SlingboxSettings.xml file (%s) found - using default settings", + slingboxXMLFile.c_str()); + return; + } + + // Load the XML file + CXBMCTinyXML slingboxXML; + if (!slingboxXML.LoadFile(slingboxXMLFile)) + { + CLog::Log(LOGERROR, "%s - Error loading %s - line %d\n%s", __FUNCTION__, + slingboxXMLFile.c_str(), slingboxXML.ErrorRow(), slingboxXML.ErrorDesc()); + return; + } + + // Check to make sure layout is correct + TiXmlElement * pRootElement = slingboxXML.RootElement(); + if (!pRootElement || strcmpi(pRootElement->Value(), "slingboxsettings") != 0) + { + CLog::Log(LOGERROR, "%s - Error loading %s - no node found", + __FUNCTION__, slingboxXMLFile.c_str()); + return; + } + + // Success so far + CLog::Log(LOGNOTICE, "Loaded SlingboxSettings.xml from %s", slingboxXMLFile.c_str()); + + // Search for the first settings that specify no hostname or match our hostname + TiXmlElement *pElement; + for (pElement = pRootElement->FirstChildElement("slingbox"); pElement; + pElement = pElement->NextSiblingElement("slingbox")) + { + const char *hostname = pElement->Attribute("hostname"); + if (!hostname || StringUtils::EqualsNoCase(m_sSlingboxSettings.strHostname, hostname)) + { + // Load setting values + XMLUtils::GetInt(pElement, "width", m_sSlingboxSettings.iVideoWidth, 0, 640); + XMLUtils::GetInt(pElement, "height", m_sSlingboxSettings.iVideoHeight, 0, 480); + XMLUtils::GetInt(pElement, "videobitrate", m_sSlingboxSettings.iVideoBitrate, 50, 8000); + XMLUtils::GetInt(pElement, "framerate", m_sSlingboxSettings.iVideoFramerate, 1, 30); + XMLUtils::GetInt(pElement, "smoothing", m_sSlingboxSettings.iVideoSmoothing, 0, 100); + XMLUtils::GetInt(pElement, "audiobitrate", m_sSlingboxSettings.iAudioBitrate, 16, 96); + XMLUtils::GetInt(pElement, "iframeinterval", m_sSlingboxSettings.iIFrameInterval, 1, 30); + + // Load any button code values + TiXmlElement * pCodes = pElement->FirstChildElement("buttons"); + if (pCodes) + { + XMLUtils::GetHex(pCodes, "channelup", m_sSlingboxSettings.uiCodeChannelUp); + XMLUtils::GetHex(pCodes, "channeldown", m_sSlingboxSettings.uiCodeChannelDown); + XMLUtils::GetHex(pCodes, "zero", m_sSlingboxSettings.uiCodeNumber[0]); + XMLUtils::GetHex(pCodes, "one", m_sSlingboxSettings.uiCodeNumber[1]); + XMLUtils::GetHex(pCodes, "two", m_sSlingboxSettings.uiCodeNumber[2]); + XMLUtils::GetHex(pCodes, "three", m_sSlingboxSettings.uiCodeNumber[3]); + XMLUtils::GetHex(pCodes, "four", m_sSlingboxSettings.uiCodeNumber[4]); + XMLUtils::GetHex(pCodes, "five", m_sSlingboxSettings.uiCodeNumber[5]); + XMLUtils::GetHex(pCodes, "six", m_sSlingboxSettings.uiCodeNumber[6]); + XMLUtils::GetHex(pCodes, "seven", m_sSlingboxSettings.uiCodeNumber[7]); + XMLUtils::GetHex(pCodes, "eight", m_sSlingboxSettings.uiCodeNumber[8]); + XMLUtils::GetHex(pCodes, "nine", m_sSlingboxSettings.uiCodeNumber[9]); + } + + break; + } + } + + // Prepare our resolution enum mapping array + const struct + { + unsigned int uiWidth; + unsigned int uiHeight; + CSlingbox::Resolution eEnum; + } m_resolutionMap[11] = { + {0, 0, CSlingbox::NOVIDEO}, + {128, 96, CSlingbox::RESOLUTION128X96}, + {160, 120, CSlingbox::RESOLUTION160X120}, + {176, 120, CSlingbox::RESOLUTION176X120}, + {224, 176, CSlingbox::RESOLUTION224X176}, + {256, 192, CSlingbox::RESOLUTION256X192}, + {320, 240, CSlingbox::RESOLUTION320X240}, + {352, 240, CSlingbox::RESOLUTION352X240}, + {320, 480, CSlingbox::RESOLUTION320X480}, + {640, 240, CSlingbox::RESOLUTION640X240}, + {640, 480, CSlingbox::RESOLUTION640X480} + }; + + // See if the specified resolution matches something in our mapping array and + // setup things accordingly + for (unsigned int i = 0; i < 11; i++) + { + if (m_sSlingboxSettings.iVideoWidth == (int)m_resolutionMap[i].uiWidth && + m_sSlingboxSettings.iVideoHeight == (int)m_resolutionMap[i].uiHeight) + { + m_sSlingboxSettings.iVideoResolution = (int)m_resolutionMap[i].eEnum; + return; + } + } + + // If it didn't match anything setup safe defaults + CLog::Log(LOGERROR, "%s - Defaulting to 320x240 resolution due to invalid " + "resolution specified in SlingboxSettings.xml for Slingbox: %s", + __FUNCTION__, m_sSlingboxSettings.strHostname.c_str()); + m_sSlingboxSettings.iVideoWidth = 320; + m_sSlingboxSettings.iVideoHeight = 240; + m_sSlingboxSettings.iVideoResolution = (int)CSlingbox::RESOLUTION320X240; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SlingboxFile.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/SlingboxFile.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SlingboxFile.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SlingboxFile.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,77 @@ +#pragma once +/* + * Copyright (C) 2011-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "IFile.h" +#include "ILiveTV.h" + +class CSlingbox; + +namespace XFILE +{ + class CSlingboxFile + : public IFile, ILiveTVInterface + { + public: + CSlingboxFile(); + virtual ~CSlingboxFile(); + virtual bool Open(const CURL& url); + virtual ssize_t Read(void * buffer, size_t size); + virtual void Close(); + virtual bool SkipNext(); + + virtual int GetStartTime() { return 0; } + virtual int GetTotalTime() { return 0; } + virtual int64_t GetLength() { return -1; } + virtual int64_t GetPosition() { return -1; } + virtual int64_t Seek(int64_t pos, int whence) { return -1; } + virtual bool UpdateItem(CFileItem& item) { return false; } + + virtual bool Exists(const CURL& url) { return false; } + virtual int Stat(const CURL& url, struct __stat64* buffer) { return -1; } + + virtual ILiveTVInterface * GetLiveTV() { return (ILiveTVInterface *)this; } + + virtual bool NextChannel(bool bPreview = false); // TODO bPreview is not implemented + virtual bool PrevChannel(bool bPreview = false); // TODO bPreview is not implemented + virtual bool SelectChannel(unsigned int uiChannel); + + protected: + struct + { + std::string strHostname; + int iVideoWidth; + int iVideoHeight; + int iVideoResolution; + int iVideoBitrate; + int iVideoFramerate; + int iVideoSmoothing; + int iAudioBitrate; + int iIFrameInterval; + unsigned int uiCodeChannelUp; + unsigned int uiCodeChannelDown; + unsigned int uiCodeNumber[10]; + } m_sSlingboxSettings; + + void LoadSettings(const std::string& strSlingbox); + CSlingbox * m_pSlingbox; + }; + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SmartPlaylistDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/SmartPlaylistDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SmartPlaylistDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SmartPlaylistDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -28,7 +28,6 @@ #include "music/MusicDatabase.h" #include "playlists/SmartPlayList.h" #include "settings/Settings.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "video/VideoDatabase.h" @@ -72,7 +71,7 @@ sorting.sortBy = playlist.GetOrder(); sorting.sortOrder = playlist.GetOrderAscending() ? SortOrderAscending : SortOrderDescending; sorting.sortAttributes = playlist.GetOrderAttributes(); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) + if (CSettings::Get().GetBool("filelists.ignorethewhensorting")) sorting.sortAttributes = (SortAttribute)(sorting.sortAttributes | SortAttributeIgnoreArticle); items.SetSortIgnoreFolders((sorting.sortAttributes & SortAttributeIgnoreFolders) == SortAttributeIgnoreFolders); @@ -292,7 +291,7 @@ // sort grouped list by label if (items.Size() > 1 && !group.empty()) - items.Sort(SortByLabel, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + items.Sort(SortByLabel, SortOrderAscending, CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); // go through and set the playlist order for (int i = 0; i < items.Size(); i++) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SMBDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/SMBDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SMBDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SMBDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -51,6 +51,7 @@ }; using namespace XFILE; +using namespace std; CSMBDirectory::CSMBDirectory(void) { @@ -88,7 +89,7 @@ // need to keep the samba lock for as short as possible. // so we first cache all directory entries and then go over them again asking for stat // "stat" is locked each time. that way the lock is freed between stat requests - std::vector vecEntries; + vector vecEntries; struct smbc_dirent* dirEnt; lock.Enter(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SMBFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/SMBFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SMBFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SMBFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -49,17 +49,13 @@ return ; } -// WTF is this ?, we get the original server cache only -// to set the server cache to this function which call the -// original one anyway. Seems quite silly. smbc_get_cached_srv_fn orig_cache; + SMBCSRV* xb_smbc_cache(SMBCCTX* c, const char* server, const char* share, const char* workgroup, const char* username) { return orig_cache(c, server, share, workgroup, username); } -bool CSMB::IsFirstInit = true; - CSMB::CSMB() { m_IdleTimeout = 0; @@ -120,9 +116,9 @@ // set wins server if there's one. name resolve order defaults to 'lmhosts host wins bcast'. // if no WINS server has been specified the wins method will be ignored. - if (CSettings::GetInstance().GetString(CSettings::SETTING_SMB_WINSSERVER).length() > 0 && !StringUtils::EqualsNoCase(CSettings::GetInstance().GetString(CSettings::SETTING_SMB_WINSSERVER), "0.0.0.0") ) + if (CSettings::Get().GetString("smb.winsserver").length() > 0 && !StringUtils::EqualsNoCase(CSettings::Get().GetString("smb.winsserver"), "0.0.0.0") ) { - fprintf(f, "\twins server = %s\n", CSettings::GetInstance().GetString(CSettings::SETTING_SMB_WINSSERVER).c_str()); + fprintf(f, "\twins server = %s\n", CSettings::Get().GetString("smb.winsserver").c_str()); fprintf(f, "\tname resolve order = bcast wins host\n"); } else @@ -139,12 +135,6 @@ // reads smb.conf so this MUST be after we create smb.conf // multiple smbc_init calls are ignored by libsmbclient. - // note: this is important as it initilizes the smb old - // interface compatibility. Samba 3.4.0 or higher has the new interface. - // note: we leak the following here once, not sure why yet. - // 48 bytes -> smb_xmalloc_array - // 32 bytes -> set_param_opt - // 16 bytes -> set_param_opt smbc_init(xb_smbc_auth, 0); // setup our context @@ -157,11 +147,9 @@ smbc_setOptionOneSharePerServer(m_context, false); smbc_setOptionBrowseMaxLmbCount(m_context, 0); smbc_setTimeout(m_context, g_advancedSettings.m_sambaclienttimeout * 1000); - // we do not need to strdup these, smbc_setXXX below will make their own copies - if (CSettings::GetInstance().GetString(CSettings::SETTING_SMB_WORKGROUP).length() > 0) - smbc_setWorkgroup(m_context, (char*)CSettings::GetInstance().GetString(CSettings::SETTING_SMB_WORKGROUP).c_str()); - std::string guest = "guest"; - smbc_setUser(m_context, (char*)guest.c_str()); + if (CSettings::Get().GetString("smb.workgroup").length() > 0) + smbc_setWorkgroup(m_context, strdup(CSettings::Get().GetString("smb.workgroup").c_str())); + smbc_setUser(m_context, strdup("guest")); #else m_context->debug = (g_advancedSettings.CanLogComponent(LOGSAMBA) ? 10 : 0); m_context->callbacks.auth_fn = xb_smbc_auth; @@ -170,28 +158,16 @@ m_context->options.one_share_per_server = false; m_context->options.browse_max_lmb_count = 0; m_context->timeout = g_advancedSettings.m_sambaclienttimeout * 1000; - // we need to strdup these, they will get free'ed on smbc_free_context - if (CSettings::GetInstance().GetString(CSettings::SETTING_SMB_WORKGROUP).length() > 0) - m_context->workgroup = strdup(CSettings::GetInstance().GetString(CSettings::SETTING_SMB_WORKGROUP).c_str()); + if (CSettings::Get().GetString("smb.workgroup").length() > 0) + m_context->workgroup = strdup(CSettings::Get().GetString("smb.workgroup").c_str()); m_context->user = strdup("guest"); #endif // initialize samba and do some hacking into the settings if (smbc_init_context(m_context)) { - // setup context using the smb old interface compatibility - SMBCCTX *old_context = smbc_set_context(m_context); - // free previous context or we leak it, this comes from smbc_init above. - // there is a bug in smbclient (old interface), if we init/set a context - // then set(null)/free it in DeInit above, the next smbc_set_context - // return the already freed previous context, free again and bang, crash. - // so we setup a stic bool to track the first init so we can free the - // context associated with the initial smbc_init. - if (old_context && IsFirstInit) - { - smbc_free_context(old_context, 1); - IsFirstInit = false; - } + /* setup old interface to use this context */ + smbc_set_context(m_context); } else { @@ -332,7 +308,7 @@ // if a file matches the if below return false, it can't exist on a samba share. if (!IsValidFile(url.GetFileName())) { - CLog::Log(LOGNOTICE,"SMBFile->Open: Bad URL : '%s'",url.GetRedacted().c_str()); + CLog::Log(LOGNOTICE,"SMBFile->Open: Bad URL : '%s'",url.GetFileName().c_str()); return false; } m_url = url; @@ -344,7 +320,7 @@ std::string strFileName; m_fd = OpenFile(url, strFileName); - CLog::Log(LOGDEBUG,"CSMBFile::Open - opened %s, fd=%d",url.GetRedacted().c_str(), m_fd); + CLog::Log(LOGDEBUG,"CSMBFile::Open - opened %s, fd=%d",url.GetFileName().c_str(), m_fd); if (m_fd == -1) { // write error to logfile @@ -605,7 +581,7 @@ if (bOverWrite) { - CLog::Log(LOGWARNING, "SMBFile::OpenForWrite() called with overwriting enabled! - %s", CURL::GetRedacted(strFileName).c_str()); + CLog::Log(LOGWARNING, "SMBFile::OpenForWrite() called with overwriting enabled! - %s", strFileName.c_str()); m_fd = smbc_creat(strFileName.c_str(), 0); } else @@ -616,7 +592,7 @@ if (m_fd == -1) { // write error to logfile - CLog::Log(LOGERROR, "SMBFile->Open: Unable to open file : '%s'\nunix_err:'%x' error : '%s'", CURL::GetRedacted(strFileName).c_str(), errno, strerror(errno)); + CLog::Log(LOGERROR, "SMBFile->Open: Unable to open file : '%s'\nunix_err:'%x' error : '%s'", strFileName.c_str(), errno, strerror(errno)); return false; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SMBFile.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/SMBFile.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SMBFile.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SMBFile.h 2015-10-19 08:39:16.000000000 +0000 @@ -60,7 +60,6 @@ #ifdef TARGET_POSIX int m_OpenConnections; unsigned int m_IdleTimeout; - static bool IsFirstInit; #endif }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SourcesDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/SourcesDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SourcesDirectory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SourcesDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -47,7 +47,7 @@ URIUtils::RemoveSlashAtEnd(type); VECSOURCES sources; - VECSOURCES *sourcesFromType = CMediaSourceSettings::GetInstance().GetSources(type); + VECSOURCES *sourcesFromType = CMediaSourceSettings::Get().GetSources(type); if (!sourcesFromType) return false; @@ -90,7 +90,7 @@ else if (pItem->IsISO9660()) strIcon = "DefaultDVDRom.png"; else if (pItem->IsDVD()) - strIcon = "DefaultDVDFull.png"; + strIcon = "DefaultDVDRom.png"; else if (pItem->IsCDDA()) strIcon = "DefaultCDDA.png"; else if (pItem->IsRemovable() && g_TextureManager.HasTexture("DefaultRemovableDisk.png")) @@ -99,7 +99,7 @@ strIcon = "DefaultHardDisk.png"; pItem->SetIconImage(strIcon); - if (share.m_iHasLock == 2 && CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) + if (share.m_iHasLock == 2 && CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) pItem->SetOverlayImage(CGUIListItem::ICON_OVERLAY_LOCKED); else pItem->SetOverlayImage(CGUIListItem::ICON_OVERLAY_NONE); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/SpecialProtocol.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/SpecialProtocol.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/SpecialProtocol.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/SpecialProtocol.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -34,7 +34,9 @@ #include "utils/StringUtils.h" #endif -std::map CSpecialProtocol::m_pathMap; +using namespace std; + +map CSpecialProtocol::m_pathMap; void CSpecialProtocol::SetProfilePath(const std::string &dir) { @@ -129,17 +131,17 @@ RootDir = FullFileName; if (RootDir == "subtitles") - translatedPath = URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_CUSTOMPATH), FileName); + translatedPath = URIUtils::AddFileToFolder(CSettings::Get().GetString("subtitles.custompath"), FileName); else if (RootDir == "userdata") - translatedPath = URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetUserDataFolder(), FileName); + translatedPath = URIUtils::AddFileToFolder(CProfilesManager::Get().GetUserDataFolder(), FileName); else if (RootDir == "database") - translatedPath = URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetDatabaseFolder(), FileName); + translatedPath = URIUtils::AddFileToFolder(CProfilesManager::Get().GetDatabaseFolder(), FileName); else if (RootDir == "thumbnails") - translatedPath = URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetThumbnailsFolder(), FileName); + translatedPath = URIUtils::AddFileToFolder(CProfilesManager::Get().GetThumbnailsFolder(), FileName); else if (RootDir == "recordings" || RootDir == "cdrips") - translatedPath = URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_AUDIOCDS_RECORDINGPATH), FileName); + translatedPath = URIUtils::AddFileToFolder(CSettings::Get().GetString("audiocds.recordingpath"), FileName); else if (RootDir == "screenshots") - translatedPath = URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_DEBUG_SCREENSHOTPATH), FileName); + translatedPath = URIUtils::AddFileToFolder(CSettings::Get().GetString("debug.screenshotpath"), FileName); else if (RootDir == "musicplaylists") translatedPath = URIUtils::AddFileToFolder(CUtil::MusicPlaylistsLocation(), FileName); else if (RootDir == "videoplaylists") @@ -261,7 +263,7 @@ std::string CSpecialProtocol::GetPath(const std::string &key) { - std::map::iterator it = m_pathMap.find(key); + map::iterator it = m_pathMap.find(key); if (it != m_pathMap.end()) return it->second; assert(false); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/StackDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/StackDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/StackDirectory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/StackDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,7 @@ #include "settings/AdvancedSettings.h" #include "URL.h" +using namespace std; namespace XFILE { CStackDirectory::CStackDirectory() @@ -40,12 +41,12 @@ bool CStackDirectory::GetDirectory(const CURL& url, CFileItemList& items) { items.Clear(); - std::vector files; + vector files; const std::string pathToUrl(url.Get()); if (!GetPaths(pathToUrl, files)) return false; // error in path - for (std::vector::const_iterator i = files.begin(); i != files.end(); ++i) + for (vector::const_iterator i = files.begin(); i != files.end(); ++i) { CFileItemPtr item(new CFileItem(*i)); item->SetPath(*i); @@ -60,8 +61,8 @@ // Load up our REs VECCREGEXP RegExps; CRegExp tempRE(true, CRegExp::autoUtf8); - const std::vector& strRegExps = g_advancedSettings.m_videoStackRegExps; - std::vector::const_iterator itRegExp = strRegExps.begin(); + const vector& strRegExps = g_advancedSettings.m_videoStackRegExps; + vector::const_iterator itRegExp = strRegExps.begin(); while (itRegExp != strRegExps.end()) { (void)tempRE.RegComp(*itRegExp); @@ -173,7 +174,7 @@ return URIUtils::AddFileToFolder(folder, file); } - bool CStackDirectory::GetPaths(const std::string& strPath, std::vector& vecPaths) + bool CStackDirectory::GetPaths(const std::string& strPath, vector& vecPaths) { // format is: // stack://file1 , file2 , file3 , file4 @@ -187,13 +188,13 @@ return false; // because " , " is used as a seperator any "," in the real paths are double escaped - for (std::vector::iterator itPath = vecPaths.begin(); itPath != vecPaths.end(); ++itPath) + for (vector::iterator itPath = vecPaths.begin(); itPath != vecPaths.end(); ++itPath) StringUtils::Replace(*itPath, ",,", ","); return true; } - std::string CStackDirectory::ConstructStackPath(const CFileItemList &items, const std::vector &stack) + std::string CStackDirectory::ConstructStackPath(const CFileItemList &items, const vector &stack) { // no checks on the range of stack here. // we replace all instances of comma's with double comma's, then separate @@ -217,7 +218,7 @@ return stackedPath; } - bool CStackDirectory::ConstructStackPath(const std::vector &paths, std::string& stackedPath) + bool CStackDirectory::ConstructStackPath(const vector &paths, std::string& stackedPath) { if (paths.size() < 2) return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/test/TestFileFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/test/TestFileFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/test/TestFileFactory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/test/TestFileFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,7 +32,7 @@ protected: TestFileFactory() { - if (CSettings::GetInstance().Initialize()) + if (CSettings::Get().Initialize()) { std::vector advancedsettings = CXBMCTestUtils::Instance().getAdvancedSettingsFiles(); @@ -41,20 +41,20 @@ std::vector::iterator it; for (it = guisettings.begin(); it < guisettings.end(); ++it) - CSettings::GetInstance().Load(*it); + CSettings::Get().Load(*it); for (it = advancedsettings.begin(); it < advancedsettings.end(); ++it) g_advancedSettings.ParseSettingsFile(*it); - CSettings::GetInstance().SetLoaded(); + CSettings::Get().SetLoaded(); } } ~TestFileFactory() { g_advancedSettings.Clear(); - CSettings::GetInstance().Unload(); - CSettings::GetInstance().Uninitialize(); + CSettings::Get().Unload(); + CSettings::Get().Uninitialize(); } }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/test/TestZipFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/test/TestZipFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/test/TestZipFile.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/test/TestZipFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -40,12 +40,12 @@ * Settings here are taken from CGUISettings::Initialize() */ /* TODO - CSettingsCategory *loc = CSettings::GetInstance().AddCategory(7, "locale", 14090); - CSettings::GetInstance().AddString(loc, CSettings::SETTING_LOCALE_LANGUAGE,248,"english", + CSettingsCategory *loc = CSettings::Get().AddCategory(7, "locale", 14090); + CSettings::Get().AddString(loc, "locale.language",248,"english", SPIN_CONTROL_TEXT); - CSettings::GetInstance().AddString(loc, CSettings::SETTING_LOCALE_COUNTRY, 20026, "USA", + CSettings::Get().AddString(loc, "locale.country", 20026, "USA", SPIN_CONTROL_TEXT); - CSettings::GetInstance().AddString(loc, CSettings::SETTING_LOCALE_CHARSET, 14091, "DEFAULT", + CSettings::Get().AddString(loc, "locale.charset", 14091, "DEFAULT", SPIN_CONTROL_TEXT); // charset is set by the // language file */ @@ -53,7 +53,7 @@ ~TestZipFile() { - CSettings::GetInstance().Unload(); + CSettings::Get().Unload(); } }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/udf25.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/udf25.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/udf25.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/udf25.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -592,7 +592,7 @@ return -1; ssize_t ret = m_fp->Read(data, len); - if ( ret > 0 && static_cast(ret) < len) + if (static_cast(ret) < len) { CLog::Log(LOGERROR, "udf25::ReadFile - less data than requested available!" ); return (int)ret; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/UDFFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/UDFFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/UDFFile.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/UDFFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,7 @@ #include #include +using namespace std; using namespace XFILE; ////////////////////////////////////////////////////////////////////// diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNode.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNode.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNode.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNode.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -45,19 +45,20 @@ #include "video/VideoDatabase.h" #include "settings/Settings.h" +using namespace std; using namespace XFILE::VIDEODATABASEDIRECTORY; // Constructor is protected use ParseURL() CDirectoryNode::CDirectoryNode(NODE_TYPE Type, const std::string& strName, CDirectoryNode* pParent) { - m_Type = Type; - m_strName = strName; - m_pParent = pParent; + m_Type=Type; + m_strName=strName; + m_pParent=pParent; } CDirectoryNode::~CDirectoryNode() { - delete m_pParent, m_pParent = nullptr; + delete m_pParent; } // Parses a given path and returns the current node of the path @@ -65,23 +66,21 @@ { CURL url(strPath); - std::string strDirectory = url.GetFileName(); + std::string strDirectory=url.GetFileName(); URIUtils::RemoveSlashAtEnd(strDirectory); - std::vector Path = StringUtils::Tokenize(strDirectory, '/'); - // we always have a root node, it is special and has a path of "" + vector Path = StringUtils::Split(strDirectory, '/'); Path.insert(Path.begin(), ""); - CDirectoryNode *pNode = nullptr; - CDirectoryNode *pParent = nullptr; - NODE_TYPE NodeType = NODE_TYPE_ROOT; - // loop down the dir path, creating a node with a parent. - // if we hit a child type of NODE_TYPE_NONE, then we are done. - for (size_t i = 0; i < Path.size() && NodeType != NODE_TYPE_NONE; ++i) + CDirectoryNode* pNode=NULL; + CDirectoryNode* pParent=NULL; + NODE_TYPE NodeType=NODE_TYPE_ROOT; + + for (int i=0; i<(int)Path.size(); ++i) { - pNode = CDirectoryNode::CreateNode(NodeType, Path[i], pParent); - NodeType = pNode ? pNode->GetChildType() : NODE_TYPE_NONE; - pParent = pNode; + pNode=CDirectoryNode::CreateNode(NodeType, Path[i], pParent); + NodeType= pNode ? pNode->GetChildType() : NODE_TYPE_NONE; + pParent=pNode; } // Add all the additional URL options to the last node @@ -94,7 +93,7 @@ // returns the database ids of the path, void CDirectoryNode::GetDatabaseInfo(const std::string& strPath, CQueryParams& params) { - std::unique_ptr pNode(CDirectoryNode::ParseURL(strPath)); + unique_ptr pNode(CDirectoryNode::ParseURL(strPath)); if (!pNode.get()) return; @@ -180,7 +179,7 @@ void CDirectoryNode::RemoveParent() { - m_pParent = nullptr; + m_pParent=NULL; } // should be overloaded by a derived class @@ -194,26 +193,26 @@ // Creates a videodb url std::string CDirectoryNode::BuildPath() const { - std::vector array; + vector array; if (!m_strName.empty()) array.insert(array.begin(), m_strName); CDirectoryNode* pParent=m_pParent; - while (pParent != NULL) + while (pParent!=NULL) { const std::string& strNodeName=pParent->GetName(); if (!strNodeName.empty()) array.insert(array.begin(), strNodeName); - pParent = pParent->GetParent(); + pParent=pParent->GetParent(); } std::string strPath="videodb://"; - for (int i = 0; i < (int)array.size(); ++i) - strPath += array[i]+"/"; + for (int i=0; i<(int)array.size(); ++i) + strPath+=array[i]+"/"; - std::string options = m_options.GetOptionsString(); + string options = m_options.GetOptionsString(); if (!options.empty()) strPath += "?" + options; @@ -236,10 +235,10 @@ params.SetQueryParam(m_Type, m_strName); CDirectoryNode* pParent=m_pParent; - while (pParent != NULL) + while (pParent!=NULL) { params.SetQueryParam(pParent->GetType(), pParent->GetName()); - pParent = pParent->GetParent(); + pParent=pParent->GetParent(); } } @@ -256,13 +255,13 @@ if (CanCache() && items.Load()) return true; - std::unique_ptr pNode(CDirectoryNode::CreateNode(GetChildType(), "", this)); + unique_ptr pNode(CDirectoryNode::CreateNode(GetChildType(), "", this)); bool bSuccess=false; if (pNode.get()) { pNode->m_options = m_options; - bSuccess = pNode->GetContent(items); + bSuccess=pNode->GetContent(items); if (bSuccess) { AddQueuingFolder(items); @@ -285,7 +284,7 @@ CFileItemPtr pItem; // always show "all" items by default - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_SHOWALLITEMS)) + if (!CSettings::Get().GetBool("videolibrary.showallitems")) return; // no need for "all" item when only one item @@ -297,7 +296,7 @@ return; // hack - as the season node might return episodes - std::unique_ptr pNode(ParseURL(items.GetPath())); + unique_ptr pNode(ParseURL(items.GetPath())); switch (pNode->GetChildType()) { @@ -337,11 +336,6 @@ pItem->GetVideoInfoTag()->m_type = MediaTypeSeason; } break; - case NODE_TYPE_MUSICVIDEOS_ALBUM: - pItem.reset(new CFileItem(g_localizeStrings.Get(15102))); // "All Albums" - videoUrl.AppendPath("-1/"); - pItem->SetPath(videoUrl.ToString()); - break; default: break; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNodeMoviesOverview.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNodeMoviesOverview.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNodeMoviesOverview.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNodeMoviesOverview.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,6 +26,7 @@ #include "utils/StringUtils.h" using namespace XFILE::VIDEODATABASEDIRECTORY; +using namespace std; Node MovieChildren[] = { { NODE_TYPE_GENRE, "genres", 135 }, diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNodeOverview.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNodeOverview.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNodeOverview.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/VideoDatabaseDirectory/DirectoryNodeOverview.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,16 +18,15 @@ * */ +#include "video/VideoDatabase.h" #include "DirectoryNodeOverview.h" - -#include - +#include "settings/Settings.h" #include "FileItem.h" #include "guilib/LocalizeStrings.h" -#include "settings/Settings.h" -#include "video/VideoDatabase.h" using namespace XFILE::VIDEODATABASEDIRECTORY; +using namespace std; + Node OverviewChildren[] = { { NODE_TYPE_MOVIES_OVERVIEW, "movies", 342 }, @@ -68,35 +67,35 @@ bool hasMovies = database.HasContent(VIDEODB_CONTENT_MOVIES); bool hasTvShows = database.HasContent(VIDEODB_CONTENT_TVSHOWS); bool hasMusicVideos = database.HasContent(VIDEODB_CONTENT_MUSICVIDEOS); - std::vector > vec; + vector > vec; if (hasMovies) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) - vec.push_back(std::make_pair("movies/titles", 342)); + if (CSettings::Get().GetBool("myvideos.flatten")) + vec.push_back(make_pair("movies/titles", 342)); else - vec.push_back(std::make_pair("movies", 342)); // Movies + vec.push_back(make_pair("movies", 342)); // Movies } if (hasTvShows) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) - vec.push_back(std::make_pair("tvshows/titles", 20343)); + if (CSettings::Get().GetBool("myvideos.flatten")) + vec.push_back(make_pair("tvshows/titles", 20343)); else - vec.push_back(std::make_pair("tvshows", 20343)); // TV Shows + vec.push_back(make_pair("tvshows", 20343)); // TV Shows } if (hasMusicVideos) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) - vec.push_back(std::make_pair("musicvideos/titles", 20389)); + if (CSettings::Get().GetBool("myvideos.flatten")) + vec.push_back(make_pair("musicvideos/titles", 20389)); else - vec.push_back(std::make_pair("musicvideos", 20389)); // Music Videos + vec.push_back(make_pair("musicvideos", 20389)); // Music Videos } { if (hasMovies) - vec.push_back(std::make_pair("recentlyaddedmovies", 20386)); // Recently Added Movies + vec.push_back(make_pair("recentlyaddedmovies", 20386)); // Recently Added Movies if (hasTvShows) - vec.push_back(std::make_pair("recentlyaddedepisodes", 20387)); // Recently Added Episodes + vec.push_back(make_pair("recentlyaddedepisodes", 20387)); // Recently Added Episodes if (hasMusicVideos) - vec.push_back(std::make_pair("recentlyaddedmusicvideos", 20390)); // Recently Added Music Videos + vec.push_back(make_pair("recentlyaddedmusicvideos", 20390)); // Recently Added Music Videos } std::string path = BuildPath(); for (unsigned int i = 0; i < vec.size(); ++i) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/VideoDatabaseDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/VideoDatabaseDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/VideoDatabaseDirectory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/VideoDatabaseDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -31,6 +31,7 @@ #include "utils/LegacyPathTranslation.h" #include "utils/StringUtils.h" +using namespace std; using namespace XFILE; using namespace VIDEODATABASEDIRECTORY; @@ -46,8 +47,7 @@ { std::string path = CLegacyPathTranslation::TranslateVideoDbPath(url); items.SetPath(path); - items.m_dwSize = -1; // No size - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return false; @@ -71,7 +71,7 @@ NODE_TYPE CVideoDatabaseDirectory::GetDirectoryChildType(const std::string& strPath) { std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strPath); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return NODE_TYPE_NONE; @@ -82,7 +82,7 @@ NODE_TYPE CVideoDatabaseDirectory::GetDirectoryType(const std::string& strPath) { std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strPath); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return NODE_TYPE_NONE; @@ -93,7 +93,7 @@ NODE_TYPE CVideoDatabaseDirectory::GetDirectoryParentType(const std::string& strPath) { std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strPath); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return NODE_TYPE_NONE; @@ -109,7 +109,7 @@ bool CVideoDatabaseDirectory::GetQueryParams(const std::string& strPath, CQueryParams& params) { std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strPath); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return false; @@ -142,7 +142,7 @@ strLabel = ""; std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strDirectory); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get() || path.empty()) return false; @@ -235,7 +235,7 @@ case NODE_TYPE_TITLE_MOVIES: if (URIUtils::PathEquals(path, "videodb://movies/titles/")) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) + if (CSettings::Get().GetBool("myvideos.flatten")) return "DefaultMovies.png"; return "DefaultMovieTitle.png"; } @@ -243,7 +243,7 @@ case NODE_TYPE_TITLE_TVSHOWS: if (URIUtils::PathEquals(path, "videodb://tvshows/titles/")) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) + if (CSettings::Get().GetBool("myvideos.flatten")) return "DefaultTVShows.png"; return "DefaultTVShowTitle.png"; } @@ -251,7 +251,7 @@ case NODE_TYPE_TITLE_MUSICVIDEOS: if (URIUtils::PathEquals(path, "videodb://musicvideos/titles/")) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) + if (CSettings::Get().GetBool("myvideos.flatten")) return "DefaultMusicVideos.png"; return "DefaultMusicVideoTitle.png"; } @@ -303,7 +303,7 @@ bool CVideoDatabaseDirectory::Exists(const CURL& url) { std::string path = CLegacyPathTranslation::TranslateVideoDbPath(url); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return false; @@ -317,7 +317,7 @@ bool CVideoDatabaseDirectory::CanCache(const std::string& strPath) { std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strPath); - std::unique_ptr pNode(CDirectoryNode::ParseURL(path)); + unique_ptr pNode(CDirectoryNode::ParseURL(path)); if (!pNode.get()) return false; return pNode->CanCache(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/win32/Win32File.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/win32/Win32File.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/win32/Win32File.cpp 2016-01-11 16:50:51.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/win32/Win32File.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -247,7 +247,7 @@ if (!WriteFile(m_hFile, dummyBuf.get(), 0, &bytesWritten, NULL)) return -1; - assert(bytesWritten == 0); + assert(bytesWritten != 0); return 0; } @@ -465,12 +465,6 @@ return -1; std::wstring pathnameW(CWIN32Util::ConvertPathToWin32Form(url)); - if (pathnameW.empty()) - { - errno = ENOENT; - return -1; - } - if (pathnameW.length() <= 6) // 6 is length of "\\?\x:" return -1; // pathnameW is empty or points to device ("\\?\x:"), on win32 stat() for devices is not supported diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtDirectory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtDirectory.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include - -#include "XbtDirectory.h" -#include "FileItem.h" -#include "URL.h" -#include "filesystem/Directorization.h" -#include "filesystem/XbtManager.h" -#include "guilib/XBTF.h" - -namespace XFILE -{ - -static CFileItemPtr XBTFFileToFileItem(const CXBTFFile& entry, const std::string& label, const std::string& path, bool isFolder) -{ - CFileItemPtr item(new CFileItem(label)); - if (!isFolder) - item->m_dwSize = static_cast(entry.GetUnpackedSize()); - - return item; -} - -CXbtDirectory::CXbtDirectory() -{ } - -CXbtDirectory::~CXbtDirectory() -{ } - -bool CXbtDirectory::GetDirectory(const CURL& urlOrig, CFileItemList& items) -{ - CURL urlXbt(urlOrig); - - // if this isn't a proper xbt:// path, assume it's the path to a xbt file - if (!urlOrig.IsProtocol("xbt")) - urlXbt = URIUtils::CreateArchivePath("xbt", urlOrig); - - CURL url(urlXbt); - url.SetOptions(""); // delete options to have a clean path to add stuff too - url.SetFileName(""); // delete filename too as our names later will contain it - - std::vector files; - if (!CXbtManager::GetInstance().GetFiles(url, files)) - return false; - - // prepare the files for directorization - DirectorizeEntries entries; - entries.reserve(files.size()); - for (const auto& file : files) - entries.push_back(DirectorizeEntry(file.GetPath(), file)); - - Directorize(urlXbt, entries, XBTFFileToFileItem, items); - - return true; -} - -bool CXbtDirectory::ContainsFiles(const CURL& url) -{ - return CXbtManager::GetInstance().HasFiles(url); -} - -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtDirectory.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtDirectory.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtDirectory.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtDirectory.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include - -#include "IFileDirectory.h" - -class CXBTFFile; - -namespace XFILE -{ -class CXbtDirectory : public IFileDirectory -{ -public: - CXbtDirectory(); - ~CXbtDirectory(); - - // specialization of IDirectory - virtual DIR_CACHE_TYPE GetCacheType(const CURL& url) const override { return DIR_CACHE_ALWAYS; }; - virtual bool GetDirectory(const CURL& url, CFileItemList& items) override; - - // specialization of IFileDirectory - virtual bool ContainsFiles(const CURL& url) override; -}; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtFile.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtFile.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,386 +0,0 @@ -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include - -#ifdef TARGET_WINDOWS -#pragma comment(lib,"liblzo2.lib") -#endif - -#include - -#include "XbtFile.h" -#include "URL.h" -#include "filesystem/File.h" -#include "filesystem/XbtManager.h" -#include "guilib/TextureBundleXBT.h" -#include "guilib/XBTFReader.h" -#include "utils/log.h" -#include "utils/StringUtils.h" - -namespace XFILE -{ - -CXbtFile::CXbtFile() - : m_url(), - m_open(false), - m_xbtfReader(nullptr), - m_xbtfFile(), - m_frameStartPositions(), - m_frameIndex(0), - m_positionWithinFrame(0), - m_positionTotal(0), - m_unpackedFrames() -{ } - -CXbtFile::~CXbtFile() -{ - Close(); -} - -bool CXbtFile::Open(const CURL& url) -{ - if (m_open) - return false; - - std::string options = url.GetOptions(); - - CURL xbtUrl(url); - xbtUrl.SetOptions(""); - - if (!GetReaderAndFile(url, m_xbtfReader, m_xbtfFile)) - return false; - - m_url = url; - m_open = true; - - uint64_t frameStartPosition = 0; - const auto& frames = m_xbtfFile.GetFrames(); - for (const auto& frame : frames) - { - m_frameStartPositions.push_back(frameStartPosition); - - frameStartPosition += frame.GetUnpackedSize(); - } - - m_frameIndex = 0; - m_positionWithinFrame = 0; - m_positionTotal = 0; - - m_unpackedFrames.assign(frames.size(), nullptr); - - return true; -} - -void CXbtFile::Close() -{ - for (const auto& unpackedFrame : m_unpackedFrames) - delete unpackedFrame; - m_unpackedFrames.clear(); - - m_frameIndex = 0; - m_positionWithinFrame = 0; - m_positionTotal = 0; - m_frameStartPositions.clear(); - m_open = false; -} - -bool CXbtFile::Exists(const CURL& url) -{ - CXBTFFile dummy; - return GetFile(url, dummy); -} - -int64_t CXbtFile::GetPosition() -{ - if (!m_open) - return -1; - - return m_positionTotal; -} - -int64_t CXbtFile::GetLength() -{ - if (!m_open) - return -1; - - return static_cast(m_xbtfFile.GetUnpackedSize()); -} - -int CXbtFile::Stat(struct __stat64 *buffer) -{ - if (!m_open) - return -1; - - return Stat(m_url, buffer); -} - -int CXbtFile::Stat(const CURL& url, struct __stat64* buffer) -{ - memset(buffer, 0, sizeof(struct __stat64)); - - // check if the file exists - CXBTFReaderPtr reader; - CXBTFFile file; - if (!GetReaderAndFile(url, reader, file)) - { - // check if the URL points to the XBT file itself - if (!url.GetFileName().empty() || !CFile::Exists(url.GetHostName())) - return -1; - - // stat the XBT file itself - if (XFILE::CFile::Stat(url.GetHostName(), buffer) != 0) - return -1; - - buffer->st_mode = _S_IFDIR; - return 0; - } - - // stat the XBT file itself - if (XFILE::CFile::Stat(url.GetHostName(), buffer) != 0) - return -1; - - buffer->st_size = file.GetUnpackedSize(); - - return 0; -} - -ssize_t CXbtFile::Read(void* lpBuf, size_t uiBufSize) -{ - if (lpBuf == nullptr || !m_open) - return -1; - - // nothing to read - if (m_xbtfFile.GetFrames().empty() || m_positionTotal >= GetLength()) - return 0; - - // we can't read more than is left - if (static_cast(uiBufSize) > GetLength() - m_positionTotal) - uiBufSize = static_cast(GetLength() - m_positionTotal); - - // we can't read more than we can signal with the return value - if (uiBufSize > SSIZE_MAX) - uiBufSize = SSIZE_MAX; - - const auto& frames = m_xbtfFile.GetFrames(); - - size_t remaining = uiBufSize; - while (remaining > 0) - { - const CXBTFFrame& frame = frames[m_frameIndex]; - - // check if we have already unpacked the current frame - if (m_unpackedFrames[m_frameIndex] == nullptr) - { - // unpack the data from the current frame - uint8_t* unpackedFrame = CTextureBundleXBT::UnpackFrame(*m_xbtfReader.get(), frame); - if (unpackedFrame == nullptr) - { - Close(); - return -1; - } - - m_unpackedFrames[m_frameIndex] = unpackedFrame; - } - - // determine how many bytes we need to copy from the current frame - uint64_t remainingBytesInFrame = frame.GetUnpackedSize() - m_positionWithinFrame; - size_t bytesToCopy = remaining; - if (remainingBytesInFrame <= SIZE_MAX) - bytesToCopy = std::min(remaining, static_cast(remainingBytesInFrame)); - - // copy the data - memcpy(lpBuf, m_unpackedFrames[m_frameIndex] + m_positionWithinFrame, bytesToCopy); - m_positionWithinFrame += bytesToCopy; - m_positionTotal += bytesToCopy; - remaining -= bytesToCopy; - - // check if we need to go to the next frame and there is a next frame - if (m_positionWithinFrame >= frame.GetUnpackedSize() && m_frameIndex < frames.size() - 1) - { - m_positionWithinFrame = 0; - m_frameIndex += 1; - } - } - - return uiBufSize; -} - -int64_t CXbtFile::Seek(int64_t iFilePosition, int iWhence) -{ - if (!m_open) - return -1; - - int64_t newPosition = m_positionTotal; - switch (iWhence) - { - case SEEK_SET: - newPosition = iFilePosition; - break; - - case SEEK_CUR: - newPosition += iFilePosition; - break; - - case SEEK_END: - newPosition = GetLength() + iFilePosition; - break; - - // unsupported seek mode - default: - return -1; - } - - // can't seek before the beginning or after the end of the file - if (newPosition < 0 || newPosition >= GetLength()) - return -1; - - // seeking backwards doesn't require additional work - if (newPosition <= m_positionTotal) - { - m_positionTotal = newPosition; - return m_positionTotal; - } - - // when seeking forward we need to unpack all frames we seek past - const auto& frames = m_xbtfFile.GetFrames(); - while (m_positionTotal < newPosition) - { - const CXBTFFrame& frame = frames[m_frameIndex]; - - // check if we have already unpacked the current frame - if (m_unpackedFrames[m_frameIndex] == nullptr) - { - // unpack the data from the current frame - uint8_t* unpackedFrame = CTextureBundleXBT::UnpackFrame(*m_xbtfReader.get(), frame); - if (unpackedFrame == nullptr) - { - Close(); - return -1; - } - - m_unpackedFrames[m_frameIndex] = unpackedFrame; - } - - int64_t remainingBytesToSeek = newPosition - m_positionTotal; - // check if the new position is within the current frame - uint64_t remainingBytesInFrame = frame.GetUnpackedSize() - m_positionWithinFrame; - if (static_cast(remainingBytesToSeek) < remainingBytesInFrame) - { - m_positionWithinFrame += remainingBytesToSeek; - break; - } - - // otherwise move to the end of the frame - m_positionTotal += remainingBytesInFrame; - m_positionWithinFrame += remainingBytesInFrame; - - // and go to the next frame if there is a next frame - if (m_frameIndex < frames.size() - 1) - { - m_positionWithinFrame = 0; - m_frameIndex += 1; - } - } - - m_positionTotal = newPosition; - return m_positionTotal; -} - -uint32_t CXbtFile::GetImageWidth() const -{ - CXBTFFrame frame; - if (!GetFirstFrame(frame)) - return false; - - return frame.GetWidth(); -} - -uint32_t CXbtFile::GetImageHeight() const -{ - CXBTFFrame frame; - if (!GetFirstFrame(frame)) - return false; - - return frame.GetHeight(); -} - -uint32_t CXbtFile::GetImageFormat() const -{ - CXBTFFrame frame; - if (!GetFirstFrame(frame)) - return false; - - return frame.GetFormat(); -} - -bool CXbtFile::HasImageAlpha() const -{ - CXBTFFrame frame; - if (!GetFirstFrame(frame)) - return false; - - return frame.HasAlpha(); -} - -bool CXbtFile::GetFirstFrame(CXBTFFrame& frame) const -{ - if (!m_open) - return false; - - const auto& frames = m_xbtfFile.GetFrames(); - if (frames.empty()) - return false; - - frame = frames.at(0); - return true; -} - -bool CXbtFile::GetReader(const CURL& url, CXBTFReaderPtr& reader) -{ - CURL xbtUrl(url); - xbtUrl.SetOptions(""); - - return CXbtManager::GetInstance().GetReader(xbtUrl, reader); -} - -bool CXbtFile::GetReaderAndFile(const CURL& url, CXBTFReaderPtr& reader, CXBTFFile& file) -{ - if (!GetReader(url, reader)) - return false; - - CURL xbtUrl(url); - xbtUrl.SetOptions(""); - - // CXBTFReader stores all filenames in lower case - std::string fileName = xbtUrl.GetFileName(); - StringUtils::ToLower(fileName); - - return reader->Get(fileName, file); -} - -bool CXbtFile::GetFile(const CURL& url, CXBTFFile& file) -{ - CXBTFReaderPtr reader; - return GetReaderAndFile(url, reader, file); -} - -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtFile.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtFile.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtFile.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtFile.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "IFile.h" -#include "URL.h" -#include "guilib/XBTF.h" -#include "guilib/XBTFReader.h" - -namespace XFILE -{ -class CXbtFile : public IFile -{ -public: - CXbtFile(); - ~CXbtFile(); - - virtual bool Open(const CURL& url); - virtual void Close(); - virtual bool Exists(const CURL& url); - - virtual int64_t GetPosition(); - virtual int64_t GetLength(); - - virtual int Stat(struct __stat64* buffer); - virtual int Stat(const CURL& url, struct __stat64* buffer); - - virtual ssize_t Read(void* lpBuf, size_t uiBufSize); - virtual int64_t Seek(int64_t iFilePosition, int iWhence = SEEK_SET); - - uint32_t GetImageWidth() const; - uint32_t GetImageHeight() const; - uint32_t GetImageFormat() const; - bool HasImageAlpha() const; - -private: - bool GetFirstFrame(CXBTFFrame& frame) const; - - static bool GetReader(const CURL& url, CXBTFReaderPtr& reader); - static bool GetReaderAndFile(const CURL& url, CXBTFReaderPtr& reader, CXBTFFile& file); - static bool GetFile(const CURL& url, CXBTFFile& file); - - CURL m_url; - bool m_open; - CXBTFReaderPtr m_xbtfReader; - CXBTFFile m_xbtfFile; - - std::vector m_frameStartPositions; - size_t m_frameIndex; - uint64_t m_positionWithinFrame; - int64_t m_positionTotal; - - std::vector m_unpackedFrames; -}; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtManager.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtManager.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtManager.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "XbtManager.h" - -#include - -#include "guilib/XBTF.h" -#include "guilib/XBTFReader.h" -#include "URL.h" - -namespace XFILE -{ - -CXbtManager::CXbtManager() -{ } - -CXbtManager::~CXbtManager() -{ } - -CXbtManager& CXbtManager::GetInstance() -{ - static CXbtManager xbtManager; - return xbtManager; -} - -bool CXbtManager::HasFiles(const CURL& path) const -{ - return ProcessFile(path) != m_readers.end(); -} - -bool CXbtManager::GetFiles(const CURL& path, std::vector& files) const -{ - const auto& reader = ProcessFile(path); - if (reader == m_readers.end()) - return false; - - files = reader->second.reader->GetFiles(); - return true; -} - -bool CXbtManager::GetReader(const CURL& path, CXBTFReaderPtr& reader) const -{ - const auto& it = ProcessFile(path); - if (it == m_readers.end()) - return false; - - reader = it->second.reader; - return true; -} - -void CXbtManager::Release(const CURL& path) -{ - const auto& it = GetReader(path); - if (it == m_readers.end()) - return; - - RemoveReader(it); -} - -CXbtManager::XBTFReaders::iterator CXbtManager::GetReader(const CURL& path) const -{ - return GetReader(NormalizePath(path)); -} - -CXbtManager::XBTFReaders::iterator CXbtManager::GetReader(const std::string& path) const -{ - if (path.empty()) - return m_readers.end(); - - return m_readers.find(path); -} - -void CXbtManager::RemoveReader(XBTFReaders::iterator readerIterator) const -{ - if (readerIterator == m_readers.end()) - return; - - // close the reader - readerIterator->second.reader->Close(); - - // and remove it from the map - m_readers.erase(readerIterator); -} - -CXbtManager::XBTFReaders::const_iterator CXbtManager::ProcessFile(const CURL& path) const -{ - std::string filePath = NormalizePath(path); - - // check if the file is known - auto it = GetReader(filePath); - if (it != m_readers.end()) - { - // check if the XBT file has been modified - if (it->second.reader->GetLastModificationTimestamp() <= it->second.lastModification) - return it; - - // the XBT file has been modified so close and remove it from the cache - // it will be re-opened by the following logic - RemoveReader(it); - } - - // try to read the file - CXBTFReaderPtr reader(new CXBTFReader()); - if (!reader->Open(filePath)) - return m_readers.end(); - - XBTFReader xbtfReader = { - reader, - reader->GetLastModificationTimestamp() - }; - std::pair result = m_readers.insert(std::make_pair(filePath, xbtfReader)); - return result.first; -} - -std::string CXbtManager::NormalizePath(const CURL& path) -{ - if (path.IsProtocol("xbt")) - return path.GetHostName(); - - return path.Get(); -} - -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtManager.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtManager.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/XbtManager.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/XbtManager.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include - -#include "guilib/XBTFReader.h" - -class CURL; -class CXBTFFile; - -namespace XFILE -{ -class CXbtManager -{ -public: - ~CXbtManager(); - - static CXbtManager& GetInstance(); - - bool HasFiles(const CURL& path) const; - bool GetFiles(const CURL& path, std::vector& files) const; - - bool GetReader(const CURL& path, CXBTFReaderPtr& reader) const; - - void Release(const CURL& path); - -private: - CXbtManager(); - CXbtManager(const CXbtManager&); - CXbtManager& operator=(const CXbtManager&); - - struct XBTFReader - { - CXBTFReaderPtr reader; - time_t lastModification; - }; - using XBTFReaders = std::map; - - XBTFReaders::iterator GetReader(const CURL& path) const; - XBTFReaders::iterator GetReader(const std::string& path) const; - void RemoveReader(XBTFReaders::iterator readerIterator) const; - XBTFReaders::const_iterator ProcessFile(const CURL& path) const; - - static std::string NormalizePath(const CURL& path); - - mutable XBTFReaders m_readers; -}; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/ZipDirectory.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/ZipDirectory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/ZipDirectory.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/ZipDirectory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,26 +25,13 @@ #include "URL.h" #include "ZipManager.h" #include "FileItem.h" -#include "filesystem/Directorization.h" #include "utils/StringUtils.h" #include +using namespace std; namespace XFILE { - - static CFileItemPtr ZipEntryToFileItem(const SZipEntry& entry, const std::string& label, const std::string& path, bool isFolder) - { - CFileItemPtr item(new CFileItem(label)); - if (!isFolder) - { - item->m_dwSize = entry.usize; - item->m_idepth = entry.method; - } - - return item; - } - CZipDirectory::CZipDirectory() { } @@ -61,25 +48,98 @@ if (!urlOrig.IsProtocol("zip")) urlZip = URIUtils::CreateArchivePath("zip", urlOrig); - std::vector zipEntries; - if (!g_ZipManager.GetZipList(urlZip, zipEntries)) - return false; + CURL url(urlZip); + std::string strOptions = url.GetOptions(); + std::string strPathInZip = url.GetFileName(); - // prepare the ZIP entries for directorization - DirectorizeEntries entries; - entries.reserve(zipEntries.size()); - for (const auto& zipEntry : zipEntries) - entries.push_back(DirectorizeEntry(zipEntry.name, zipEntry)); + url.SetOptions(""); // delete options to have a clean path to add stuff too + url.SetFileName(""); // delete filename too as our names later will contain it - // directorize the ZIP entries into files and directories - Directorize(urlZip, entries, ZipEntryToFileItem, items); + std::string strSlashPath = url.Get(); + std::string strBuffer; + + // the RAR code depends on things having a "/" at the end of the path + URIUtils::AddSlashAtEnd(strSlashPath); + + vector entries; + // turn on fast lookups + bool bWasFast(items.GetFastLookup()); + items.SetFastLookup(true); + if (!g_ZipManager.GetZipList(urlZip,entries)) + return false; + + vector baseTokens; + if (!strPathInZip.empty()) + StringUtils::Tokenize(strPathInZip,baseTokens,"/"); + + for (vector::iterator ze=entries.begin();ze!=entries.end();++ze) + { + std::string strEntryName(ze->name); + StringUtils::Replace(strEntryName, '\\','/'); + if (strEntryName == strPathInZip) // skip the listed dir + continue; + + vector pathTokens; + StringUtils::Tokenize(strEntryName,pathTokens,"/"); + if (pathTokens.size() < baseTokens.size()+1) + continue; + + bool bAdd=true; + strEntryName = ""; + for ( unsigned int i=0;iname[strEntryName.size()]; + if (c == '/' || c == '\\') + strEntryName += '/'; + bool bIsFolder = false; + if (strEntryName[strEntryName.size()-1] != '/') // this is a file + { + strBuffer = strSlashPath + strEntryName + strOptions; + } + else + { // this is new folder. add if not already added + bIsFolder = true; + strBuffer = strSlashPath + strEntryName + strOptions; + if (items.Contains(strBuffer)) // already added + continue; + } + + CFileItemPtr pFileItem(new CFileItem); + + g_charsetConverter.unknownToUTF8(pathTokens[baseTokens.size()]); + + pFileItem->SetLabel(pathTokens[baseTokens.size()]); + if (bIsFolder) + { + pFileItem->m_dwSize = 0; + URIUtils::AddSlashAtEnd(strBuffer); + } + else + pFileItem->m_dwSize = ze->usize; + pFileItem->SetPath(strBuffer); + pFileItem->m_bIsFolder = bIsFolder; + pFileItem->m_idepth = ze->method; + items.Add(pFileItem); + } + items.SetFastLookup(bWasFast); return true; } bool CZipDirectory::ContainsFiles(const CURL& url) { - std::vector items; + vector items; g_ZipManager.GetZipList(url, items); if (items.size()) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/ZipFile.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/ZipFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/ZipFile.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/ZipFile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,6 +29,7 @@ #define ZIP_CACHE_LIMIT 4*1024*1024 using namespace XFILE; +using namespace std; CZipFile::CZipFile() { @@ -305,7 +306,7 @@ { uLong iDecompressed = 0; uLong prevOut = m_ZStream.total_out; - while ((iDecompressed < uiBufSize) && ((m_iZipFilePos < mZipItem.csize) || (m_bFlush))) + while ((static_cast(iDecompressed) < uiBufSize) && ((m_iZipFilePos < mZipItem.csize) || (m_bFlush))) { m_ZStream.next_out = (Bytef*)(lpBuf)+iDecompressed; m_ZStream.avail_out = static_cast(uiBufSize-iDecompressed); @@ -471,7 +472,7 @@ m_bFlush = false; } -int CZipFile::UnpackFromMemory(std::string& strDest, const std::string& strInput, bool isGZ) +int CZipFile::UnpackFromMemory(string& strDest, const string& strInput, bool isGZ) { unsigned int iPos=0; int iResult=0; @@ -525,49 +526,4 @@ return iResult; } -bool CZipFile::DecompressGzip(const std::string& in, std::string& out) -{ - const int windowBits = MAX_WBITS + 16; - - z_stream strm; - strm.zalloc = Z_NULL; - strm.zfree = Z_NULL; - strm.opaque = Z_NULL; - - int err = inflateInit2(&strm, windowBits); - if (err != Z_OK) - { - CLog::Log(LOGERROR, "FileZip: zlib error %d", err); - return false; - } - - const int bufferSize = 16384; - unsigned char buffer[bufferSize]; - - strm.avail_in = in.size(); - strm.next_in = (unsigned char*)in.c_str(); - do - { - strm.avail_out = bufferSize; - strm.next_out = buffer; - int err = inflate(&strm, Z_NO_FLUSH); - switch (err) - { - case Z_NEED_DICT: - err = Z_DATA_ERROR; - case Z_DATA_ERROR: - case Z_MEM_ERROR: - case Z_STREAM_ERROR: - CLog::Log(LOGERROR, "FileZip: failed to decompress. zlib error %d", err); - inflateEnd(&strm); - return false; - } - int read = bufferSize - strm.avail_out; - out.append((char*)buffer, read); - } - while (strm.avail_out == 0); - - inflateEnd(&strm); - return true; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/ZipFile.h kodi-15.2~git20151019.1039-final/xbmc/filesystem/ZipFile.h --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/ZipFile.h 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/ZipFile.h 2015-06-14 19:32:50.000000000 +0000 @@ -44,12 +44,7 @@ virtual int64_t Seek(int64_t iFilePosition, int iWhence = SEEK_SET); virtual void Close(); - //NOTE: gzip doesn't work. use DecompressGzip() instead int UnpackFromMemory(std::string& strDest, const std::string& strInput, bool isGZ=false); - - /*! Decompress gzip encoded buffer in-memory */ - static bool DecompressGzip(const std::string& in, std::string& out); - private: bool InitDecompress(); bool FillBuffer(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/filesystem/ZipManager.cpp kodi-15.2~git20151019.1039-final/xbmc/filesystem/ZipManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/filesystem/ZipManager.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/filesystem/ZipManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,20 +18,22 @@ * */ -#include "ZipManager.h" - -#include -#include - -#include "File.h" #include "system.h" +#include "ZipManager.h" #include "URL.h" +#include "File.h" #include "utils/CharsetConverter.h" -#include "utils/EndianSwap.h" #include "utils/log.h" +#include "utils/EndianSwap.h" #include "utils/URIUtils.h" + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + using namespace XFILE; +using namespace std; CZipManager::CZipManager() { @@ -42,8 +44,10 @@ } -bool CZipManager::GetZipList(const CURL& url, std::vector& items) +bool CZipManager::GetZipList(const CURL& url, vector& items) { + CLog::Log(LOGDEBUG, "%s - Processing %s", __FUNCTION__, url.GetRedacted().c_str()); + struct __stat64 m_StatData = {}; std::string strFile = url.GetHostName(); @@ -54,18 +58,19 @@ return false; } - std::map >::iterator it = mZipMap.find(strFile); + map >::iterator it = mZipMap.find(strFile); if (it != mZipMap.end()) // already listed, just return it if not changed, else release and reread { - std::map::iterator it2=mZipDate.find(strFile); + map::iterator it2=mZipDate.find(strFile); + CLog::Log(LOGDEBUG,"statdata: %" PRId64" new: %" PRIu64, it2->second, (uint64_t)m_StatData.st_mtime); - if (m_StatData.st_mtime == it2->second) - { - items = it->second; - return true; - } - mZipMap.erase(it); - mZipDate.erase(it2); + if (m_StatData.st_mtime == it2->second) + { + items = it->second; + return true; + } + mZipMap.erase(it); + mZipDate.erase(it2); } CFile mFile; @@ -100,13 +105,8 @@ // Don't need to look in the last 18 bytes (ECDREC_SIZE-4) // But as we need to do overlapping between blocks (3 bytes), // we start the search at ECDREC_SIZE-1 from the end of file - if (fileSize < ECDREC_SIZE - 1) - { - CLog::Log(LOGERROR, "ZipManager: Invalid zip file length: %lld", fileSize); - return false; - } - int searchSize = (int) std::min(static_cast(65557), fileSize-ECDREC_SIZE+1); - int blockSize = (int) std::min(1024, searchSize); + int searchSize = (int) min(65557, fileSize-ECDREC_SIZE+1); + int blockSize = (int) min(1024, searchSize); int nbBlock = searchSize / blockSize; int extraBlockSize = searchSize % blockSize; // Signature is on 4 bytes @@ -202,7 +202,7 @@ } /* go through list and figure out file header lengths */ - for(std::vector::iterator it = items.begin(); it != items.end(); ++it) + for(vector::iterator it = items.begin(); it != items.end(); ++it) { SZipEntry& ze = *it; // Go to the local file header to get the extra field length @@ -226,8 +226,8 @@ { std::string strFile = url.GetHostName(); - std::map >::iterator it = mZipMap.find(strFile); - std::vector items; + map >::iterator it = mZipMap.find(strFile); + vector items; if (it == mZipMap.end()) // we need to list the zip { GetZipList(url,items); @@ -238,7 +238,7 @@ } std::string strFileName = url.GetFileName(); - for (std::vector::iterator it2=items.begin();it2 != items.end();++it2) + for (vector::iterator it2=items.begin();it2 != items.end();++it2) { if (std::string(it2->name) == strFileName) { @@ -257,10 +257,10 @@ bool CZipManager::ExtractArchive(const CURL& archive, const std::string& strPath) { - std::vector entry; + vector entry; CURL url = URIUtils::CreateArchivePath("zip", archive); GetZipList(url, entry); - for (std::vector::iterator it=entry.begin();it != entry.end();++it) + for (vector::iterator it=entry.begin();it != entry.end();++it) { if (it->name[strlen(it->name)-1] == '/') // skip dirs continue; @@ -314,10 +314,10 @@ void CZipManager::release(const std::string& strPath) { CURL url(strPath); - std::map >::iterator it= mZipMap.find(url.GetHostName()); + map >::iterator it= mZipMap.find(url.GetHostName()); if (it != mZipMap.end()) { - std::map::iterator it2=mZipDate.find(url.GetHostName()); + map::iterator it2=mZipDate.find(url.GetHostName()); mZipMap.erase(it); mZipDate.erase(it2); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guiinfo/GUIInfoLabels.h kodi-15.2~git20151019.1039-final/xbmc/guiinfo/GUIInfoLabels.h --- kodi-16.1~git20160425.1001-final/xbmc/guiinfo/GUIInfoLabels.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guiinfo/GUIInfoLabels.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,740 +0,0 @@ -#pragma once -/* -* Copyright (C) 2005-2015 Team XBMC -* http://xbmc.org -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -// conditions for window retrieval -#define WINDOW_CONDITION_HAS_LIST_ITEMS 1 -#define WINDOW_CONDITION_IS_MEDIA_WINDOW 2 - -#define PLAYER_HAS_MEDIA 1 -#define PLAYER_HAS_AUDIO 2 -#define PLAYER_HAS_VIDEO 3 -#define PLAYER_PLAYING 4 -#define PLAYER_PAUSED 5 -#define PLAYER_REWINDING 6 -#define PLAYER_REWINDING_2x 7 -#define PLAYER_REWINDING_4x 8 -#define PLAYER_REWINDING_8x 9 -#define PLAYER_REWINDING_16x 10 -#define PLAYER_REWINDING_32x 11 -#define PLAYER_FORWARDING 12 -#define PLAYER_FORWARDING_2x 13 -#define PLAYER_FORWARDING_4x 14 -#define PLAYER_FORWARDING_8x 15 -#define PLAYER_FORWARDING_16x 16 -#define PLAYER_FORWARDING_32x 17 -#define PLAYER_CAN_RECORD 18 -#define PLAYER_RECORDING 19 -#define PLAYER_CACHING 20 -#define PLAYER_DISPLAY_AFTER_SEEK 21 -#define PLAYER_PROGRESS 22 -#define PLAYER_SEEKBAR 23 -#define PLAYER_SEEKTIME 24 -#define PLAYER_SEEKING 25 -#define PLAYER_SHOWTIME 26 -#define PLAYER_TIME 27 -#define PLAYER_TIME_REMAINING 28 -#define PLAYER_DURATION 29 -#define PLAYER_SHOWCODEC 30 -#define PLAYER_SHOWINFO 31 -#define PLAYER_VOLUME 32 -#define PLAYER_MUTED 33 -#define PLAYER_HASDURATION 34 -#define PLAYER_CHAPTER 35 -#define PLAYER_CHAPTERCOUNT 36 -#define PLAYER_TIME_SPEED 37 -#define PLAYER_FINISH_TIME 38 -#define PLAYER_CACHELEVEL 39 -#define PLAYER_STAR_RATING 40 -#define PLAYER_CHAPTERNAME 41 -#define PLAYER_SUBTITLE_DELAY 42 -#define PLAYER_AUDIO_DELAY 43 -#define PLAYER_PASSTHROUGH 44 -#define PLAYER_PATH 45 -#define PLAYER_FILEPATH 46 -#define PLAYER_SEEKOFFSET 47 -#define PLAYER_PROGRESS_CACHE 48 -#define PLAYER_ITEM_ART 49 -#define PLAYER_CAN_PAUSE 50 -#define PLAYER_CAN_SEEK 51 -#define PLAYER_START_TIME 52 -#define PLAYER_TITLE 53 -#define PLAYER_ISINTERNETSTREAM 54 -#define PLAYER_FILENAME 55 -#define PLAYER_SEEKSTEPSIZE 56 -#define PLAYER_IS_CHANNEL_PREVIEW_ACTIVE 57 - -#define WEATHER_CONDITIONS 100 -#define WEATHER_TEMPERATURE 101 -#define WEATHER_LOCATION 102 -#define WEATHER_IS_FETCHED 103 -#define WEATHER_FANART_CODE 104 -#define WEATHER_PLUGIN 105 - -#define SYSTEM_TEMPERATURE_UNITS 106 -#define SYSTEM_PROGRESS_BAR 107 -#define SYSTEM_LANGUAGE 108 -#define SYSTEM_TIME 110 -#define SYSTEM_DATE 111 -#define SYSTEM_CPU_TEMPERATURE 112 -#define SYSTEM_GPU_TEMPERATURE 113 -#define SYSTEM_FAN_SPEED 114 -#define SYSTEM_FREE_SPACE_C 115 -// #define SYSTEM_FREE_SPACE_D 116 //116 is reserved for space on D -#define SYSTEM_FREE_SPACE_E 117 -#define SYSTEM_FREE_SPACE_F 118 -#define SYSTEM_FREE_SPACE_G 119 -#define SYSTEM_BUILD_VERSION 120 -#define SYSTEM_BUILD_DATE 121 -#define SYSTEM_ETHERNET_LINK_ACTIVE 122 -#define SYSTEM_FPS 123 -#define SYSTEM_ALWAYS_TRUE 125 // useful for true, to fade in a control -#define SYSTEM_ALWAYS_FALSE 126 // used for false, to fade out a control (ie not particularly useful!) -#define SYSTEM_MEDIA_DVD 127 -#define SYSTEM_DVDREADY 128 -#define SYSTEM_HAS_ALARM 129 -#define SYSTEM_SCREEN_MODE 132 -#define SYSTEM_SCREEN_WIDTH 133 -#define SYSTEM_SCREEN_HEIGHT 134 -#define SYSTEM_CURRENT_WINDOW 135 -#define SYSTEM_CURRENT_CONTROL 136 -#define SYSTEM_DVD_LABEL 138 -#define SYSTEM_HASLOCKS 140 -#define SYSTEM_ISMASTER 141 -#define SYSTEM_TRAYOPEN 142 -#define SYSTEM_SHOW_EXIT_BUTTON 143 -#define SYSTEM_ALARM_POS 144 -#define SYSTEM_LOGGEDON 145 -#define SYSTEM_PROFILENAME 146 -#define SYSTEM_PROFILETHUMB 147 -#define SYSTEM_HAS_LOGINSCREEN 148 -#define SYSTEM_HAS_MODAL_DIALOG 149 -#define SYSTEM_HDD_SMART 150 -#define SYSTEM_HDD_TEMPERATURE 151 -#define SYSTEM_HDD_MODEL 152 -#define SYSTEM_HDD_SERIAL 153 -#define SYSTEM_HDD_FIRMWARE 154 -#define SYSTEM_HDD_PASSWORD 156 -#define SYSTEM_HDD_LOCKSTATE 157 -#define SYSTEM_HDD_LOCKKEY 158 -#define SYSTEM_INTERNET_STATE 159 -#define SYSTEM_HAS_INPUT_HIDDEN 160 -#define SYSTEM_ALARM_LESS_OR_EQUAL 180 -#define SYSTEM_PROFILECOUNT 181 -#define SYSTEM_ISFULLSCREEN 182 -#define SYSTEM_ISSTANDALONE 183 -#define SYSTEM_ISINHIBIT 184 -#define SYSTEM_HAS_SHUTDOWN 185 -#define SYSTEM_HAS_PVR 186 -#define SYSTEM_STARTUP_WINDOW 187 -#define SYSTEM_STEREOSCOPIC_MODE 188 -#define SYSTEM_BUILD_VERSION_SHORT 189 - -#define NETWORK_IP_ADDRESS 190 -#define NETWORK_MAC_ADDRESS 191 -#define NETWORK_IS_DHCP 192 -#define NETWORK_LINK_STATE 193 -#define NETWORK_SUBNET_MASK 194 -#define NETWORK_GATEWAY_ADDRESS 195 -#define NETWORK_DNS1_ADDRESS 196 -#define NETWORK_DNS2_ADDRESS 197 -#define NETWORK_DHCP_ADDRESS 198 - -#define MUSICPLAYER_TITLE 200 -#define MUSICPLAYER_ALBUM 201 -#define MUSICPLAYER_ARTIST 202 -#define MUSICPLAYER_GENRE 203 -#define MUSICPLAYER_YEAR 204 -#define MUSICPLAYER_DURATION 205 -#define MUSICPLAYER_TRACK_NUMBER 208 -#define MUSICPLAYER_COVER 210 -#define MUSICPLAYER_BITRATE 211 -#define MUSICPLAYER_PLAYLISTLEN 212 -#define MUSICPLAYER_PLAYLISTPOS 213 -#define MUSICPLAYER_CHANNELS 214 -#define MUSICPLAYER_BITSPERSAMPLE 215 -#define MUSICPLAYER_SAMPLERATE 216 -#define MUSICPLAYER_CODEC 217 -#define MUSICPLAYER_DISC_NUMBER 218 -#define MUSICPLAYER_RATING 219 -#define MUSICPLAYER_COMMENT 220 -#define MUSICPLAYER_LYRICS 221 -#define MUSICPLAYER_HASPREVIOUS 222 -#define MUSICPLAYER_HASNEXT 223 -#define MUSICPLAYER_EXISTS 224 -#define MUSICPLAYER_PLAYLISTPLAYING 225 -#define MUSICPLAYER_ALBUM_ARTIST 226 -#define MUSICPLAYER_PLAYCOUNT 227 -#define MUSICPLAYER_LASTPLAYED 228 -#define MUSICPLAYER_CHANNEL_NAME 229 -#define MUSICPLAYER_CHANNEL_NUMBER 230 -#define MUSICPLAYER_CHANNEL_GROUP 231 -#define MUSICPLAYER_SUB_CHANNEL_NUMBER 232 -#define MUSICPLAYER_CHANNEL_NUMBER_LBL 233 -#define MUSICPLAYER_CONTENT 234 - -#define VIDEOPLAYER_TITLE 250 -#define VIDEOPLAYER_GENRE 251 -#define VIDEOPLAYER_DIRECTOR 252 -#define VIDEOPLAYER_YEAR 253 -#define VIDEOPLAYER_HASSUBTITLES 254 -#define VIDEOPLAYER_SUBTITLESENABLED 255 -#define VIDEOPLAYER_COVER 258 -#define VIDEOPLAYER_USING_OVERLAYS 259 -#define VIDEOPLAYER_ISFULLSCREEN 260 -#define VIDEOPLAYER_HASMENU 261 -#define VIDEOPLAYER_PLAYLISTLEN 262 -#define VIDEOPLAYER_PLAYLISTPOS 263 -#define VIDEOPLAYER_EVENT 264 -#define VIDEOPLAYER_ORIGINALTITLE 265 -#define VIDEOPLAYER_PLOT 266 -#define VIDEOPLAYER_PLOT_OUTLINE 267 -#define VIDEOPLAYER_EPISODE 268 -#define VIDEOPLAYER_SEASON 269 -#define VIDEOPLAYER_RATING 270 -#define VIDEOPLAYER_TVSHOW 271 -#define VIDEOPLAYER_PREMIERED 272 -#define VIDEOPLAYER_CONTENT 273 -#define VIDEOPLAYER_STUDIO 274 -#define VIDEOPLAYER_MPAA 275 -#define VIDEOPLAYER_CAST 276 -#define VIDEOPLAYER_CAST_AND_ROLE 277 -#define VIDEOPLAYER_ARTIST 278 -#define VIDEOPLAYER_ALBUM 279 -#define VIDEOPLAYER_WRITER 280 -#define VIDEOPLAYER_TAGLINE 281 -#define VIDEOPLAYER_HAS_INFO 282 -#define VIDEOPLAYER_TOP250 283 -#define VIDEOPLAYER_RATING_AND_VOTES 284 -#define VIDEOPLAYER_TRAILER 285 -#define VIDEOPLAYER_VIDEO_CODEC 286 -#define VIDEOPLAYER_VIDEO_RESOLUTION 287 -#define VIDEOPLAYER_AUDIO_CODEC 288 -#define VIDEOPLAYER_AUDIO_CHANNELS 289 -#define VIDEOPLAYER_VIDEO_ASPECT 290 -#define VIDEOPLAYER_HASTELETEXT 291 -#define VIDEOPLAYER_COUNTRY 292 -#define VIDEOPLAYER_PLAYCOUNT 293 -#define VIDEOPLAYER_LASTPLAYED 294 - -#define VIDEOPLAYER_STARTTIME 295 -#define VIDEOPLAYER_ENDTIME 296 -#define VIDEOPLAYER_NEXT_TITLE 297 -#define VIDEOPLAYER_NEXT_GENRE 298 -#define VIDEOPLAYER_NEXT_PLOT 299 -#define VIDEOPLAYER_NEXT_PLOT_OUTLINE 300 -#define VIDEOPLAYER_NEXT_STARTTIME 301 -#define VIDEOPLAYER_NEXT_ENDTIME 302 -#define VIDEOPLAYER_NEXT_DURATION 303 -#define VIDEOPLAYER_CHANNEL_NAME 304 -#define VIDEOPLAYER_CHANNEL_NUMBER 305 -#define VIDEOPLAYER_CHANNEL_GROUP 306 -#define VIDEOPLAYER_PARENTAL_RATING 307 -#define VIDEOPLAYER_HAS_EPG 308 -#define VIDEOPLAYER_VOTES 309 -#define VIDEOPLAYER_IS_STEREOSCOPIC 310 -#define VIDEOPLAYER_STEREOSCOPIC_MODE 311 -#define VIDEOPLAYER_SUBTITLES_LANG 312 -#define VIDEOPLAYER_AUDIO_LANG 313 -#define VIDEOPLAYER_SUB_CHANNEL_NUMBER 314 -#define VIDEOPLAYER_CHANNEL_NUMBER_LBL 315 -#define VIDEOPLAYER_CAN_RESUME_LIVE_TV 316 -#define VIDEOPLAYER_IMDBNUMBER 317 -#define VIDEOPLAYER_EPISODENAME 318 -#define VIDEOPLAYER_USER_RATING 319 - -#define CONTAINER_HAS_PARENT_ITEM 341 -#define CONTAINER_CAN_FILTER 342 -#define CONTAINER_CAN_FILTERADVANCED 343 -#define CONTAINER_FILTERED 344 - -#define CONTAINER_SCROLL_PREVIOUS 345 // NOTE: These 5 must be kept in this consecutive order -#define CONTAINER_MOVE_PREVIOUS 346 -#define CONTAINER_STATIC 347 -#define CONTAINER_MOVE_NEXT 348 -#define CONTAINER_SCROLL_NEXT 349 -#define CONTAINER_ISUPDATING 350 -#define CONTAINER_HASFILES 351 -#define CONTAINER_HASFOLDERS 352 -#define CONTAINER_STACKED 353 -#define CONTAINER_FOLDERNAME 354 -#define CONTAINER_SCROLLING 355 -#define CONTAINER_PLUGINNAME 356 -#define CONTAINER_PROPERTY 357 -#define CONTAINER_SORT_DIRECTION 358 -#define CONTAINER_NUM_ITEMS 359 -#define CONTAINER_FOLDERPATH 360 -#define CONTAINER_CONTENT 361 -#define CONTAINER_HAS_THUMB 362 -#define CONTAINER_SORT_METHOD 363 -#define CONTAINER_CURRENT_ITEM 364 -#define CONTAINER_ART 365 -#define CONTAINER_HAS_FOCUS 366 -#define CONTAINER_ROW 367 -#define CONTAINER_COLUMN 368 -#define CONTAINER_POSITION 369 -#define CONTAINER_VIEWMODE 370 -#define CONTAINER_HAS_NEXT 371 -#define CONTAINER_HAS_PREVIOUS 372 -#define CONTAINER_SUBITEM 373 -#define CONTAINER_NUM_PAGES 374 -#define CONTAINER_CURRENT_PAGE 375 -#define CONTAINER_SHOWPLOT 376 -#define CONTAINER_TOTALTIME 377 -#define CONTAINER_SORT_ORDER 378 -#define CONTAINER_TOTALWATCHED 379 -#define CONTAINER_TOTALUNWATCHED 380 -#define MUSICPM_ENABLED 381 -#define MUSICPM_SONGSPLAYED 382 -#define MUSICPM_MATCHINGSONGS 383 -#define MUSICPM_MATCHINGSONGSPICKED 384 -#define MUSICPM_MATCHINGSONGSLEFT 385 -#define MUSICPM_RELAXEDSONGSPICKED 386 -#define MUSICPM_RANDOMSONGSPICKED 387 - -#define PLAYLIST_LENGTH 390 -#define PLAYLIST_POSITION 391 -#define PLAYLIST_RANDOM 392 -#define PLAYLIST_REPEAT 393 -#define PLAYLIST_ISRANDOM 394 -#define PLAYLIST_ISREPEAT 395 -#define PLAYLIST_ISREPEATONE 396 - -#define VISUALISATION_LOCKED 400 -#define VISUALISATION_PRESET 401 -#define VISUALISATION_NAME 402 -#define VISUALISATION_ENABLED 403 -#define VISUALISATION_HAS_PRESETS 404 - -#define STRING_IS_EMPTY 410 -#define STRING_COMPARE 411 -#define STRING_STR 412 -#define INTEGER_GREATER_THAN 413 -#define STRING_STR_LEFT 414 -#define STRING_STR_RIGHT 415 - -#define SKIN_BOOL 600 -#define SKIN_STRING 601 -#define SKIN_THEME 604 -#define SKIN_COLOUR_THEME 605 -#define SKIN_HAS_THEME 606 -#define SKIN_ASPECT_RATIO 607 - -#define SYSTEM_TOTAL_MEMORY 644 -#define SYSTEM_CPU_USAGE 645 -#define SYSTEM_USED_MEMORY_PERCENT 646 -#define SYSTEM_USED_MEMORY 647 -#define SYSTEM_FREE_MEMORY 648 -#define SYSTEM_FREE_MEMORY_PERCENT 649 -#define SYSTEM_UPTIME 654 -#define SYSTEM_TOTALUPTIME 655 -#define SYSTEM_CPUFREQUENCY 656 -#define SYSTEM_SCREEN_RESOLUTION 659 -#define SYSTEM_VIDEO_ENCODER_INFO 660 -#define SYSTEM_OS_VERSION_INFO 667 -#define SYSTEM_FREE_SPACE 679 -#define SYSTEM_USED_SPACE 680 -#define SYSTEM_TOTAL_SPACE 681 -#define SYSTEM_USED_SPACE_PERCENT 682 -#define SYSTEM_FREE_SPACE_PERCENT 683 -#define SYSTEM_DVD_TRAY_STATE 700 -#define SYSTEM_GET_BOOL 704 -#define SYSTEM_GET_CORE_USAGE 705 -#define SYSTEM_HAS_CORE_ID 706 -#define SYSTEM_RENDER_VENDOR 707 -#define SYSTEM_RENDER_RENDERER 708 -#define SYSTEM_RENDER_VERSION 709 -#define SYSTEM_SETTING 710 -#define SYSTEM_HAS_ADDON 711 -#define SYSTEM_ADDON_TITLE 712 -#define SYSTEM_ADDON_ICON 713 -#define SYSTEM_BATTERY_LEVEL 714 -#define SYSTEM_IDLE_TIME 715 -#define SYSTEM_FRIENDLY_NAME 716 -#define SYSTEM_SCREENSAVER_ACTIVE 717 -#define SYSTEM_ADDON_VERSION 718 -#define SYSTEM_DPMS_ACTIVE 719 - -#define LIBRARY_HAS_MUSIC 720 -#define LIBRARY_HAS_VIDEO 721 -#define LIBRARY_HAS_MOVIES 722 -#define LIBRARY_HAS_MOVIE_SETS 723 -#define LIBRARY_HAS_TVSHOWS 724 -#define LIBRARY_HAS_MUSICVIDEOS 725 -#define LIBRARY_HAS_SINGLES 726 -#define LIBRARY_HAS_COMPILATIONS 727 -#define LIBRARY_IS_SCANNING 728 -#define LIBRARY_IS_SCANNING_VIDEO 729 -#define LIBRARY_IS_SCANNING_MUSIC 730 - -#define SYSTEM_PLATFORM_LINUX 741 -#define SYSTEM_PLATFORM_WINDOWS 742 -#define SYSTEM_PLATFORM_DARWIN 743 -#define SYSTEM_PLATFORM_DARWIN_OSX 744 -#define SYSTEM_PLATFORM_DARWIN_IOS 745 -//#define SYSTEM_PLATFORM_DARWIN_ATV2 746 -#define SYSTEM_PLATFORM_ANDROID 747 -#define SYSTEM_PLATFORM_LINUX_RASPBERRY_PI 748 - -#define SYSTEM_CAN_POWERDOWN 750 -#define SYSTEM_CAN_SUSPEND 751 -#define SYSTEM_CAN_HIBERNATE 752 -#define SYSTEM_CAN_REBOOT 753 - -#define SLIDESHOW_ISPAUSED 800 -#define SLIDESHOW_ISRANDOM 801 -#define SLIDESHOW_ISACTIVE 802 -#define SLIDESHOW_ISVIDEO 803 - -#define SLIDE_INFO_START 900 -#define SLIDE_INFO_END 980 - -#define FANART_COLOR1 1000 -#define FANART_COLOR2 1001 -#define FANART_COLOR3 1002 -#define FANART_IMAGE 1003 - -#define SYSTEM_PROFILEAUTOLOGIN 1004 -#define SYSTEM_HAS_ADSP 1005 - -#define PVR_CONDITIONS_START 1100 -#define PVR_IS_RECORDING (PVR_CONDITIONS_START) -#define PVR_HAS_TIMER (PVR_CONDITIONS_START + 1) -#define PVR_HAS_NONRECORDING_TIMER (PVR_CONDITIONS_START + 2) -#define PVR_HAS_EPG (PVR_CONDITIONS_START + 3) -#define PVR_HAS_TXT (PVR_CONDITIONS_START + 4) -#define PVR_HAS_DIRECTOR (PVR_CONDITIONS_START + 5) -#define PVR_IS_PLAYING_TV (PVR_CONDITIONS_START + 6) -#define PVR_IS_PLAYING_RADIO (PVR_CONDITIONS_START + 7) -#define PVR_IS_PLAYING_RECORDING (PVR_CONDITIONS_START + 8) -#define PVR_ACTUAL_STREAM_ENCRYPTED (PVR_CONDITIONS_START + 9) -#define PVR_HAS_TV_CHANNELS (PVR_CONDITIONS_START + 10) -#define PVR_HAS_RADIO_CHANNELS (PVR_CONDITIONS_START + 11) -#define PVR_IS_TIMESHIFTING (PVR_CONDITIONS_START + 12) -#define PVR_CONDITIONS_END PVR_IS_TIMESHIFTING - -#define PVR_STRINGS_START 1200 -#define PVR_NEXT_RECORDING_CHANNEL (PVR_STRINGS_START) -#define PVR_NEXT_RECORDING_CHAN_ICO (PVR_STRINGS_START + 1) -#define PVR_NEXT_RECORDING_DATETIME (PVR_STRINGS_START + 2) -#define PVR_NEXT_RECORDING_TITLE (PVR_STRINGS_START + 3) -#define PVR_NOW_RECORDING_CHANNEL (PVR_STRINGS_START + 4) -#define PVR_NOW_RECORDING_CHAN_ICO (PVR_STRINGS_START + 5) -#define PVR_NOW_RECORDING_DATETIME (PVR_STRINGS_START + 6) -#define PVR_NOW_RECORDING_TITLE (PVR_STRINGS_START + 7) -#define PVR_BACKEND_NAME (PVR_STRINGS_START + 8) -#define PVR_BACKEND_VERSION (PVR_STRINGS_START + 9) -#define PVR_BACKEND_HOST (PVR_STRINGS_START + 10) -#define PVR_BACKEND_DISKSPACE (PVR_STRINGS_START + 11) -#define PVR_BACKEND_CHANNELS (PVR_STRINGS_START + 12) -#define PVR_BACKEND_TIMERS (PVR_STRINGS_START + 13) -#define PVR_BACKEND_RECORDINGS (PVR_STRINGS_START + 14) -#define PVR_BACKEND_DELETED_RECORDINGS (PVR_STRINGS_START + 15) -#define PVR_BACKEND_NUMBER (PVR_STRINGS_START + 16) -#define PVR_TOTAL_DISKSPACE (PVR_STRINGS_START + 17) -#define PVR_NEXT_TIMER (PVR_STRINGS_START + 18) -#define PVR_PLAYING_DURATION (PVR_STRINGS_START + 19) -#define PVR_PLAYING_TIME (PVR_STRINGS_START + 20) -#define PVR_PLAYING_PROGRESS (PVR_STRINGS_START + 21) -#define PVR_ACTUAL_STREAM_CLIENT (PVR_STRINGS_START + 22) -#define PVR_ACTUAL_STREAM_DEVICE (PVR_STRINGS_START + 23) -#define PVR_ACTUAL_STREAM_STATUS (PVR_STRINGS_START + 24) -#define PVR_ACTUAL_STREAM_SIG (PVR_STRINGS_START + 25) -#define PVR_ACTUAL_STREAM_SNR (PVR_STRINGS_START + 26) -#define PVR_ACTUAL_STREAM_SIG_PROGR (PVR_STRINGS_START + 27) -#define PVR_ACTUAL_STREAM_SNR_PROGR (PVR_STRINGS_START + 28) -#define PVR_ACTUAL_STREAM_BER (PVR_STRINGS_START + 29) -#define PVR_ACTUAL_STREAM_UNC (PVR_STRINGS_START + 30) -#define PVR_ACTUAL_STREAM_VIDEO_BR (PVR_STRINGS_START + 31) -#define PVR_ACTUAL_STREAM_AUDIO_BR (PVR_STRINGS_START + 32) -#define PVR_ACTUAL_STREAM_DOLBY_BR (PVR_STRINGS_START + 33) -#define PVR_ACTUAL_STREAM_CRYPTION (PVR_STRINGS_START + 34) -#define PVR_ACTUAL_STREAM_SERVICE (PVR_STRINGS_START + 35) -#define PVR_ACTUAL_STREAM_MUX (PVR_STRINGS_START + 36) -#define PVR_ACTUAL_STREAM_PROVIDER (PVR_STRINGS_START + 37) -#define PVR_BACKEND_DISKSPACE_PROGR (PVR_STRINGS_START + 38) -#define PVR_TIMESHIFT_START_TIME (PVR_STRINGS_START + 39) -#define PVR_TIMESHIFT_END_TIME (PVR_STRINGS_START + 40) -#define PVR_TIMESHIFT_PLAY_TIME (PVR_STRINGS_START + 41) -#define PVR_TIMESHIFT_PROGRESS (PVR_STRINGS_START + 42) -#define PVR_STRINGS_END PVR_TIMESHIFT_PROGRESS - -#define ADSP_CONDITIONS_START 1300 -#define ADSP_IS_ACTIVE (ADSP_CONDITIONS_START) -#define ADSP_HAS_INPUT_RESAMPLE (ADSP_CONDITIONS_START + 1) -#define ADSP_HAS_PRE_PROCESS (ADSP_CONDITIONS_START + 2) -#define ADSP_HAS_MASTER_PROCESS (ADSP_CONDITIONS_START + 3) -#define ADSP_HAS_POST_PROCESS (ADSP_CONDITIONS_START + 4) -#define ADSP_HAS_OUTPUT_RESAMPLE (ADSP_CONDITIONS_START + 5) -#define ADSP_MASTER_ACTIVE (ADSP_CONDITIONS_START + 6) -#define ADSP_CONDITIONS_END ADSP_MASTER_ACTIVE - -#define ADSP_STRINGS_START 1350 -#define ADSP_ACTIVE_STREAM_TYPE (ADSP_STRINGS_START) -#define ADSP_DETECTED_STREAM_TYPE (ADSP_STRINGS_START + 1) -#define ADSP_MASTER_NAME (ADSP_STRINGS_START + 7) -#define ADSP_MASTER_INFO (ADSP_STRINGS_START + 8) -#define ADSP_MASTER_OWN_ICON (ADSP_STRINGS_START + 9) -#define ADSP_MASTER_OVERRIDE_ICON (ADSP_STRINGS_START + 10) -#define ADSP_STRINGS_END ADSP_MASTER_OVERRIDE_ICON - -#define RDS_DATA_START 1400 -#define RDS_HAS_RDS (RDS_DATA_START) -#define RDS_HAS_RADIOTEXT (RDS_DATA_START + 1) -#define RDS_HAS_RADIOTEXT_PLUS (RDS_DATA_START + 2) -#define RDS_GET_RADIOTEXT_LINE (RDS_DATA_START + 3) -#define RDS_TITLE (RDS_DATA_START + 4) -#define RDS_BAND (RDS_DATA_START + 5) -#define RDS_ARTIST (RDS_DATA_START + 6) -#define RDS_COMPOSER (RDS_DATA_START + 7) -#define RDS_CONDUCTOR (RDS_DATA_START + 8) -#define RDS_ALBUM (RDS_DATA_START + 9) -#define RDS_ALBUM_TRACKNUMBER (RDS_DATA_START + 10) -#define RDS_GET_RADIO_STYLE (RDS_DATA_START + 11) -#define RDS_COMMENT (RDS_DATA_START + 12) -#define RDS_INFO_NEWS (RDS_DATA_START + 13) -#define RDS_INFO_NEWS_LOCAL (RDS_DATA_START + 14) -#define RDS_INFO_STOCK (RDS_DATA_START + 15) -#define RDS_INFO_STOCK_SIZE (RDS_DATA_START + 16) -#define RDS_INFO_SPORT (RDS_DATA_START + 17) -#define RDS_INFO_SPORT_SIZE (RDS_DATA_START + 18) -#define RDS_INFO_LOTTERY (RDS_DATA_START + 19) -#define RDS_INFO_LOTTERY_SIZE (RDS_DATA_START + 20) -#define RDS_INFO_WEATHER (RDS_DATA_START + 21) -#define RDS_INFO_WEATHER_SIZE (RDS_DATA_START + 22) -#define RDS_INFO_CINEMA (RDS_DATA_START + 23) -#define RDS_INFO_CINEMA_SIZE (RDS_DATA_START + 24) -#define RDS_INFO_HOROSCOPE (RDS_DATA_START + 25) -#define RDS_INFO_HOROSCOPE_SIZE (RDS_DATA_START + 26) -#define RDS_INFO_OTHER (RDS_DATA_START + 27) -#define RDS_INFO_OTHER_SIZE (RDS_DATA_START + 28) -#define RDS_PROG_STATION (RDS_DATA_START + 29) -#define RDS_PROG_NOW (RDS_DATA_START + 30) -#define RDS_PROG_NEXT (RDS_DATA_START + 31) -#define RDS_PROG_HOST (RDS_DATA_START + 32) -#define RDS_PROG_EDIT_STAFF (RDS_DATA_START + 33) -#define RDS_PROG_HOMEPAGE (RDS_DATA_START + 34) -#define RDS_PROG_STYLE (RDS_DATA_START + 35) -#define RDS_PHONE_HOTLINE (RDS_DATA_START + 36) -#define RDS_PHONE_STUDIO (RDS_DATA_START + 37) -#define RDS_SMS_STUDIO (RDS_DATA_START + 38) -#define RDS_EMAIL_HOTLINE (RDS_DATA_START + 39) -#define RDS_EMAIL_STUDIO (RDS_DATA_START + 40) -#define RDS_HAS_HOTLINE_DATA (RDS_DATA_START + 41) -#define RDS_HAS_STUDIO_DATA (RDS_DATA_START + 42) -#define RDS_AUDIO_LANG (RDS_DATA_START + 43) -#define RDS_CHANNEL_COUNTRY (RDS_DATA_START + 44) -#define RDS_DATA_END RDS_CHANNEL_COUNTRY - -#define WINDOW_PROPERTY 9993 -#define WINDOW_IS_TOPMOST 9994 -#define WINDOW_IS_VISIBLE 9995 -#define WINDOW_NEXT 9996 -#define WINDOW_PREVIOUS 9997 -#define WINDOW_IS_MEDIA 9998 -#define WINDOW_IS_ACTIVE 9999 - -#define CONTROL_GET_LABEL 29996 -#define CONTROL_IS_ENABLED 29997 -#define CONTROL_IS_VISIBLE 29998 -#define CONTROL_GROUP_HAS_FOCUS 29999 -#define CONTROL_HAS_FOCUS 30000 - -#define LISTITEM_START 35000 -#define LISTITEM_THUMB (LISTITEM_START) -#define LISTITEM_LABEL (LISTITEM_START + 1) -#define LISTITEM_TITLE (LISTITEM_START + 2) -#define LISTITEM_TRACKNUMBER (LISTITEM_START + 3) -#define LISTITEM_ARTIST (LISTITEM_START + 4) -#define LISTITEM_ALBUM (LISTITEM_START + 5) -#define LISTITEM_YEAR (LISTITEM_START + 6) -#define LISTITEM_GENRE (LISTITEM_START + 7) -#define LISTITEM_ICON (LISTITEM_START + 8) -#define LISTITEM_DIRECTOR (LISTITEM_START + 9) -#define LISTITEM_OVERLAY (LISTITEM_START + 10) -#define LISTITEM_LABEL2 (LISTITEM_START + 11) -#define LISTITEM_FILENAME (LISTITEM_START + 12) -#define LISTITEM_DATE (LISTITEM_START + 13) -#define LISTITEM_SIZE (LISTITEM_START + 14) -#define LISTITEM_RATING (LISTITEM_START + 15) -#define LISTITEM_PROGRAM_COUNT (LISTITEM_START + 16) -#define LISTITEM_DURATION (LISTITEM_START + 17) -#define LISTITEM_ISPLAYING (LISTITEM_START + 18) -#define LISTITEM_ISSELECTED (LISTITEM_START + 19) -#define LISTITEM_PLOT (LISTITEM_START + 20) -#define LISTITEM_PLOT_OUTLINE (LISTITEM_START + 21) -#define LISTITEM_EPISODE (LISTITEM_START + 22) -#define LISTITEM_SEASON (LISTITEM_START + 23) -#define LISTITEM_TVSHOW (LISTITEM_START + 24) -#define LISTITEM_PREMIERED (LISTITEM_START + 25) -#define LISTITEM_COMMENT (LISTITEM_START + 26) -#define LISTITEM_ACTUAL_ICON (LISTITEM_START + 27) -#define LISTITEM_PATH (LISTITEM_START + 28) -#define LISTITEM_PICTURE_PATH (LISTITEM_START + 29) -// the ordering of LISTITEM_PICTURE_* is important as they're mapped to SLIDE_* items in GUIInfoManager.cpp -#define LISTITEM_PICTURE_START (LISTITEM_START + 30) -#define LISTITEM_PICTURE_RESOLUTION (LISTITEM_PICTURE_START) // => SLIDE_RESOLUTION -#define LISTITEM_PICTURE_LONGDATE (LISTITEM_START + 31) // => SLIDE_EXIF_LONG_DATE -#define LISTITEM_PICTURE_LONGDATETIME (LISTITEM_START + 32) // => SLIDE_EXIF_LONG_DATE_TIME -#define LISTITEM_PICTURE_DATE (LISTITEM_START + 33) // => SLIDE_EXIF_DATE -#define LISTITEM_PICTURE_DATETIME (LISTITEM_START + 34) // => SLIDE_EXIF_DATE_TIME -#define LISTITEM_PICTURE_COMMENT (LISTITEM_START + 35) // => SLIDE_COMMENT -#define LISTITEM_PICTURE_CAPTION (LISTITEM_START + 36) // => SLIDE_IPTC_CAPTION -#define LISTITEM_PICTURE_DESC (LISTITEM_START + 37) // => SLIDE_EXIF_DESCRIPTION -#define LISTITEM_PICTURE_KEYWORDS (LISTITEM_START + 38) // => SLIDE_IPTC_KEYWORDS -#define LISTITEM_PICTURE_CAM_MAKE (LISTITEM_START + 39) // => SLIDE_EXIF_CAMERA_MAKE -#define LISTITEM_PICTURE_CAM_MODEL (LISTITEM_START + 40) // => SLIDE_EXIF_CAMERA_MODEL -#define LISTITEM_PICTURE_APERTURE (LISTITEM_START + 41) // => SLIDE_EXIF_APERTURE -#define LISTITEM_PICTURE_FOCAL_LEN (LISTITEM_START + 42) // => SLIDE_EXIF_FOCAL_LENGTH -#define LISTITEM_PICTURE_FOCUS_DIST (LISTITEM_START + 43) // => SLIDE_EXIF_FOCUS_DIST -#define LISTITEM_PICTURE_EXP_MODE (LISTITEM_START + 44) // => SLIDE_EXIF_EXPOSURE_MODE -#define LISTITEM_PICTURE_EXP_TIME (LISTITEM_START + 45) // => SLIDE_EXIF_EXPOSURE_TIME -#define LISTITEM_PICTURE_ISO (LISTITEM_START + 46) // => SLIDE_EXIF_ISO_EQUIV -#define LISTITEM_PICTURE_AUTHOR (LISTITEM_START + 47) // => SLIDE_IPTC_AUTHOR -#define LISTITEM_PICTURE_BYLINE (LISTITEM_START + 48) // => SLIDE_IPTC_BYLINE -#define LISTITEM_PICTURE_BYLINE_TITLE (LISTITEM_START + 49) // => SLIDE_IPTC_BYLINE_TITLE -#define LISTITEM_PICTURE_CATEGORY (LISTITEM_START + 50) // => SLIDE_IPTC_CATEGORY -#define LISTITEM_PICTURE_CCD_WIDTH (LISTITEM_START + 51) // => SLIDE_EXIF_CCD_WIDTH -#define LISTITEM_PICTURE_CITY (LISTITEM_START + 52) // => SLIDE_IPTC_CITY -#define LISTITEM_PICTURE_URGENCY (LISTITEM_START + 53) // => SLIDE_IPTC_URGENCY -#define LISTITEM_PICTURE_COPYRIGHT_NOTICE (LISTITEM_START + 54) // => SLIDE_IPTC_COPYRIGHT_NOTICE -#define LISTITEM_PICTURE_COUNTRY (LISTITEM_START + 55) // => SLIDE_IPTC_COUNTRY -#define LISTITEM_PICTURE_COUNTRY_CODE (LISTITEM_START + 56) // => SLIDE_IPTC_COUNTRY_CODE -#define LISTITEM_PICTURE_CREDIT (LISTITEM_START + 57) // => SLIDE_IPTC_CREDIT -#define LISTITEM_PICTURE_IPTCDATE (LISTITEM_START + 58) // => SLIDE_IPTC_DATE -#define LISTITEM_PICTURE_DIGITAL_ZOOM (LISTITEM_START + 59) // => SLIDE_EXIF_DIGITAL_ZOOM -#define LISTITEM_PICTURE_EXPOSURE (LISTITEM_START + 60) // => SLIDE_EXIF_EXPOSURE -#define LISTITEM_PICTURE_EXPOSURE_BIAS (LISTITEM_START + 61) // => SLIDE_EXIF_EXPOSURE_BIAS -#define LISTITEM_PICTURE_FLASH_USED (LISTITEM_START + 62) // => SLIDE_EXIF_FLASH_USED -#define LISTITEM_PICTURE_HEADLINE (LISTITEM_START + 63) // => SLIDE_IPTC_HEADLINE -#define LISTITEM_PICTURE_COLOUR (LISTITEM_START + 64) // => SLIDE_COLOUR -#define LISTITEM_PICTURE_LIGHT_SOURCE (LISTITEM_START + 65) // => SLIDE_EXIF_LIGHT_SOURCE -#define LISTITEM_PICTURE_METERING_MODE (LISTITEM_START + 66) // => SLIDE_EXIF_METERING_MODE -#define LISTITEM_PICTURE_OBJECT_NAME (LISTITEM_START + 67) // => SLIDE_IPTC_OBJECT_NAME -#define LISTITEM_PICTURE_ORIENTATION (LISTITEM_START + 68) // => SLIDE_EXIF_ORIENTATION -#define LISTITEM_PICTURE_PROCESS (LISTITEM_START + 69) // => SLIDE_PROCESS -#define LISTITEM_PICTURE_REF_SERVICE (LISTITEM_START + 70) // => SLIDE_IPTC_REF_SERVICE -#define LISTITEM_PICTURE_SOURCE (LISTITEM_START + 71) // => SLIDE_IPTC_SOURCE -#define LISTITEM_PICTURE_SPEC_INSTR (LISTITEM_START + 72) // => SLIDE_IPTC_SPEC_INSTR -#define LISTITEM_PICTURE_STATE (LISTITEM_START + 73) // => SLIDE_IPTC_STATE -#define LISTITEM_PICTURE_SUP_CATEGORIES (LISTITEM_START + 74) // => SLIDE_IPTC_SUP_CATEGORIES -#define LISTITEM_PICTURE_TX_REFERENCE (LISTITEM_START + 75) // => SLIDE_IPTC_TX_REFERENCE -#define LISTITEM_PICTURE_WHITE_BALANCE (LISTITEM_START + 76) // => SLIDE_EXIF_WHITE_BALANCE -#define LISTITEM_PICTURE_IMAGETYPE (LISTITEM_START + 77) // => SLIDE_IPTC_IMAGETYPE -#define LISTITEM_PICTURE_SUBLOCATION (LISTITEM_START + 78) // => SLIDE_IPTC_SUBLOCATION -#define LISTITEM_PICTURE_TIMECREATED (LISTITEM_START + 79) // => SLIDE_IPTC_TIMECREATED -#define LISTITEM_PICTURE_GPS_LAT (LISTITEM_START + 80) // => SLIDE_EXIF_GPS_LATITUDE -#define LISTITEM_PICTURE_GPS_LON (LISTITEM_START + 81) // => SLIDE_EXIF_GPS_LONGITUDE -#define LISTITEM_PICTURE_GPS_ALT (LISTITEM_START + 82) // => SLIDE_EXIF_GPS_ALTITUDE -#define LISTITEM_PICTURE_END (LISTITEM_PICTURE_GPS_ALT) -#define LISTITEM_STUDIO (LISTITEM_START + 83) -#define LISTITEM_MPAA (LISTITEM_START + 84) -#define LISTITEM_CAST (LISTITEM_START + 85) -#define LISTITEM_CAST_AND_ROLE (LISTITEM_START + 86) -#define LISTITEM_WRITER (LISTITEM_START + 87) -#define LISTITEM_TAGLINE (LISTITEM_START + 88) -#define LISTITEM_TOP250 (LISTITEM_START + 89) -#define LISTITEM_RATING_AND_VOTES (LISTITEM_START + 90) -#define LISTITEM_TRAILER (LISTITEM_START + 91) -#define LISTITEM_STAR_RATING (LISTITEM_START + 92) -#define LISTITEM_FILENAME_AND_PATH (LISTITEM_START + 93) -#define LISTITEM_SORT_LETTER (LISTITEM_START + 94) -#define LISTITEM_ALBUM_ARTIST (LISTITEM_START + 95) -#define LISTITEM_FOLDERNAME (LISTITEM_START + 96) -#define LISTITEM_VIDEO_CODEC (LISTITEM_START + 97) -#define LISTITEM_VIDEO_RESOLUTION (LISTITEM_START + 98) -#define LISTITEM_VIDEO_ASPECT (LISTITEM_START + 99) -#define LISTITEM_AUDIO_CODEC (LISTITEM_START + 100) -#define LISTITEM_AUDIO_CHANNELS (LISTITEM_START + 101) -#define LISTITEM_AUDIO_LANGUAGE (LISTITEM_START + 102) -#define LISTITEM_SUBTITLE_LANGUAGE (LISTITEM_START + 103) -#define LISTITEM_IS_FOLDER (LISTITEM_START + 104) -#define LISTITEM_ORIGINALTITLE (LISTITEM_START + 105) -#define LISTITEM_COUNTRY (LISTITEM_START + 106) -#define LISTITEM_PLAYCOUNT (LISTITEM_START + 107) -#define LISTITEM_LASTPLAYED (LISTITEM_START + 108) -#define LISTITEM_FOLDERPATH (LISTITEM_START + 109) -#define LISTITEM_DISC_NUMBER (LISTITEM_START + 110) -#define LISTITEM_FILE_EXTENSION (LISTITEM_START + 111) -#define LISTITEM_IS_RESUMABLE (LISTITEM_START + 112) -#define LISTITEM_PERCENT_PLAYED (LISTITEM_START + 113) -#define LISTITEM_DATE_ADDED (LISTITEM_START + 114) -#define LISTITEM_DBTYPE (LISTITEM_START + 115) -#define LISTITEM_DBID (LISTITEM_START + 116) - -#define LISTITEM_STARTTIME (LISTITEM_START + 117) -#define LISTITEM_ENDTIME (LISTITEM_START + 118) -#define LISTITEM_STARTDATE (LISTITEM_START + 119) -#define LISTITEM_ENDDATE (LISTITEM_START + 120) -#define LISTITEM_NEXT_TITLE (LISTITEM_START + 121) -#define LISTITEM_NEXT_GENRE (LISTITEM_START + 122) -#define LISTITEM_NEXT_PLOT (LISTITEM_START + 123) -#define LISTITEM_NEXT_PLOT_OUTLINE (LISTITEM_START + 124) -#define LISTITEM_NEXT_STARTTIME (LISTITEM_START + 125) -#define LISTITEM_NEXT_ENDTIME (LISTITEM_START + 126) -#define LISTITEM_NEXT_STARTDATE (LISTITEM_START + 127) -#define LISTITEM_NEXT_ENDDATE (LISTITEM_START + 128) -#define LISTITEM_NEXT_DURATION (LISTITEM_START + 129) -#define LISTITEM_CHANNEL_NAME (LISTITEM_START + 130) -#define LISTITEM_CHANNEL_NUMBER (LISTITEM_START + 131) -#define LISTITEM_CHANNEL_GROUP (LISTITEM_START + 132) -#define LISTITEM_HASTIMER (LISTITEM_START + 133) -#define LISTITEM_ISRECORDING (LISTITEM_START + 134) -#define LISTITEM_ISENCRYPTED (LISTITEM_START + 135) -#define LISTITEM_PARENTALRATING (LISTITEM_START + 136) -#define LISTITEM_PROGRESS (LISTITEM_START + 137) -#define LISTITEM_HAS_EPG (LISTITEM_START + 138) -#define LISTITEM_VOTES (LISTITEM_START + 139) -#define LISTITEM_STEREOSCOPIC_MODE (LISTITEM_START + 140) -#define LISTITEM_IS_STEREOSCOPIC (LISTITEM_START + 141) -#define LISTITEM_INPROGRESS (LISTITEM_START + 142) -#define LISTITEM_HASRECORDING (LISTITEM_START + 143) -#define LISTITEM_SUB_CHANNEL_NUMBER (LISTITEM_START + 144) -#define LISTITEM_CHANNEL_NUMBER_LBL (LISTITEM_START + 145) -#define LISTITEM_IMDBNUMBER (LISTITEM_START + 146) -#define LISTITEM_EPISODENAME (LISTITEM_START + 147) -#define LISTITEM_IS_COLLECTION (LISTITEM_START + 148) -#define LISTITEM_HASTIMERSCHEDULE (LISTITEM_START + 149) -#define LISTITEM_TIMERTYPE (LISTITEM_START + 150) -#define LISTITEM_EPG_EVENT_TITLE (LISTITEM_START + 151) -#define LISTITEM_DATETIME (LISTITEM_START + 152) -#define LISTITEM_USER_RATING (LISTITEM_START + 153) - -#define LISTITEM_PROPERTY_START (LISTITEM_START + 200) -#define LISTITEM_PROPERTY_END (LISTITEM_PROPERTY_START + 1000) -#define LISTITEM_END (LISTITEM_PROPERTY_END) - -#define MUSICPLAYER_PROPERTY_OFFSET 800 // 100 id's reserved for musicplayer props. -#define LISTITEM_ART_OFFSET 900 // 100 id's reserved for listitem art. - -#define CONDITIONAL_LABEL_START LISTITEM_END + 1 // 36201 -#define CONDITIONAL_LABEL_END 37000 - -// the multiple information vector -#define MULTI_INFO_START 40000 -#define MULTI_INFO_END 99999 -#define COMBINED_VALUES_START 100000 - -// Info Flags -// Stored in the top 8 bits of GUIInfo::m_data1 -// therefore we only have room for 8 flags -#define INFOFLAG_LISTITEM_WRAP ((uint32_t) (1 << 25)) // Wrap ListItem lookups -#define INFOFLAG_LISTITEM_POSITION ((uint32_t) (1 << 26)) // ListItem lookups based on cursor position -#define INFOFLAG_LISTITEM_ABSOLUTE ((uint32_t) (1 << 27)) // Absolute ListItem lookups diff -Nru kodi-16.1~git20160425.1001-final/xbmc/GUIInfoManager.cpp kodi-15.2~git20151019.1039-final/xbmc/GUIInfoManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/GUIInfoManager.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/GUIInfoManager.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -23,8 +23,6 @@ #include "CompileInfo.h" #include "GUIInfoManager.h" #include "windows/GUIMediaWindow.h" -#include "dialogs/GUIDialogKeyboardGeneric.h" -#include "dialogs/GUIDialogNumeric.h" #include "dialogs/GUIDialogProgress.h" #include "Application.h" #include "Util.h" @@ -37,7 +35,6 @@ #include "LangInfo.h" #include "utils/SystemInfo.h" #include "guilib/GUITextBox.h" -#include "guilib/GUIControlGroupList.h" #include "pictures/GUIWindowSlideShow.h" #include "pictures/PictureInfoTag.h" #include "music/tags/MusicInfoTag.h" @@ -56,19 +53,14 @@ #include "guilib/StereoscopicsManager.h" #include "utils/CharsetConverter.h" #include "utils/CPUInfo.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" #include "utils/MathUtils.h" #include "utils/SeekHandler.h" #include "URL.h" #include "addons/Skin.h" -#include -#include -#include #include +#include #include "cores/DataCacheCore.h" -#include "guiinfo/GUIInfoLabels.h" -#include "messaging/ApplicationMessenger.h" // stuff for current song #include "music/MusicInfoLoader.h" @@ -83,7 +75,6 @@ #include "pvr/PVRManager.h" #include "pvr/channels/PVRChannelGroupsContainer.h" -#include "pvr/channels/PVRRadioRDSInfoTag.h" #include "epg/EpgContainer.h" #include "pvr/timers/PVRTimers.h" #include "pvr/recordings/PVRRecording.h" @@ -94,7 +85,6 @@ #include "music/MusicThumbLoader.h" #include "video/VideoDatabase.h" #include "cores/IPlayer.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.h" #include "cores/AudioEngine/Utils/AEUtil.h" #include "cores/VideoRenderers/BaseRenderer.h" #include "interfaces/info/InfoExpression.h" @@ -107,6 +97,7 @@ #define SYSHEATUPDATEINTERVAL 60000 +using namespace std; using namespace XFILE; using namespace MUSIC_INFO; using namespace ADDON; @@ -220,8 +211,7 @@ { "filename", PLAYER_FILENAME }, { "isinternetstream", PLAYER_ISINTERNETSTREAM }, { "pauseenabled", PLAYER_CAN_PAUSE }, - { "seekenabled", PLAYER_CAN_SEEK }, - { "channelpreviewactive", PLAYER_IS_CHANNEL_PREVIEW_ACTIVE}}; + { "seekenabled", PLAYER_CAN_SEEK }}; const infomap player_param[] = {{ "art", PLAYER_ITEM_ART }}; @@ -247,9 +237,7 @@ { "dvdready", SYSTEM_DVDREADY }, { "trayopen", SYSTEM_TRAYOPEN }, { "haslocks", SYSTEM_HASLOCKS }, - { "hashiddeninput", SYSTEM_HAS_INPUT_HIDDEN }, { "hasloginscreen", SYSTEM_HAS_LOGINSCREEN }, - { "hasmodaldialog", SYSTEM_HAS_MODAL_DIALOG }, { "ismaster", SYSTEM_ISMASTER }, { "isfullscreen", SYSTEM_ISFULLSCREEN }, { "isstandalone", SYSTEM_ISSTANDALONE }, @@ -304,8 +292,7 @@ { "hasshutdown", SYSTEM_HAS_SHUTDOWN }, { "haspvr", SYSTEM_HAS_PVR }, { "startupwindow", SYSTEM_STARTUP_WINDOW }, - { "stereoscopicmode", SYSTEM_STEREOSCOPIC_MODE }, - { "hasadsp", SYSTEM_HAS_ADSP }}; + { "stereoscopicmode", SYSTEM_STEREOSCOPIC_MODE } }; const infomap system_param[] = {{ "hasalarm", SYSTEM_HAS_ALARM }, { "hascoreid", SYSTEM_HAS_CORE_ID }, @@ -382,7 +369,6 @@ { "season", VIDEOPLAYER_SEASON }, { "rating", VIDEOPLAYER_RATING }, { "ratingandvotes", VIDEOPLAYER_RATING_AND_VOTES }, - { "userrating", VIDEOPLAYER_USER_RATING }, { "votes", VIDEOPLAYER_VOTES }, { "tvshowtitle", VIDEOPLAYER_TVSHOW }, { "premiered", VIDEOPLAYER_PREMIERED }, @@ -439,11 +425,8 @@ { "pluginname", CONTAINER_PLUGINNAME }, { "viewmode", CONTAINER_VIEWMODE }, { "totaltime", CONTAINER_TOTALTIME }, - { "totalwatched", CONTAINER_TOTALWATCHED }, - { "totalunwatched", CONTAINER_TOTALUNWATCHED }, { "hasthumb", CONTAINER_HAS_THUMB }, { "sortmethod", CONTAINER_SORT_METHOD }, - { "sortorder", CONTAINER_SORT_ORDER }, { "showplot", CONTAINER_SHOWPLOT }}; const infomap container_bools[] ={{ "onnext", CONTAINER_MOVE_NEXT }, @@ -455,7 +438,6 @@ { "currentpage", CONTAINER_CURRENT_PAGE }, { "scrolling", CONTAINER_SCROLLING }, { "hasnext", CONTAINER_HAS_NEXT }, - { "hasparent", CONTAINER_HAS_PARENT_ITEM }, { "hasprevious", CONTAINER_HAS_PREVIOUS }, { "canfilter", CONTAINER_CAN_FILTER }, { "canfilteradvanced",CONTAINER_CAN_FILTERADVANCED }, @@ -491,11 +473,9 @@ { "filenameandpath", LISTITEM_FILENAME_AND_PATH }, { "fileextension", LISTITEM_FILE_EXTENSION }, { "date", LISTITEM_DATE }, - { "datetime", LISTITEM_DATETIME }, { "size", LISTITEM_SIZE }, { "rating", LISTITEM_RATING }, { "ratingandvotes", LISTITEM_RATING_AND_VOTES }, - { "userrating", LISTITEM_USER_RATING }, { "votes", LISTITEM_VOTES }, { "programcount", LISTITEM_PROGRAM_COUNT }, { "duration", LISTITEM_DURATION }, @@ -610,7 +590,6 @@ { "channelgroup", LISTITEM_CHANNEL_GROUP }, { "hasepg", LISTITEM_HAS_EPG }, { "hastimer", LISTITEM_HASTIMER }, - { "hastimerschedule", LISTITEM_HASTIMERSCHEDULE }, { "hasrecording", LISTITEM_HASRECORDING }, { "isrecording", LISTITEM_ISRECORDING }, { "inprogress", LISTITEM_INPROGRESS }, @@ -622,13 +601,10 @@ { "stereoscopicmode", LISTITEM_STEREOSCOPIC_MODE }, { "isstereoscopic", LISTITEM_IS_STEREOSCOPIC }, { "imdbnumber", LISTITEM_IMDBNUMBER }, - { "episodename", LISTITEM_EPISODENAME }, - { "timertype", LISTITEM_TIMERTYPE }, - { "epgeventtitle", LISTITEM_EPG_EVENT_TITLE }}; + { "episodename", LISTITEM_EPISODENAME }}; const infomap visualisation[] = {{ "locked", VISUALISATION_LOCKED }, { "preset", VISUALISATION_PRESET }, - { "haspresets", VISUALISATION_HAS_PRESETS }, { "name", VISUALISATION_NAME }, { "enabled", VISUALISATION_ENABLED }}; @@ -639,6 +615,8 @@ const infomap skin_labels[] = {{ "currenttheme", SKIN_THEME }, { "currentcolourtheme",SKIN_COLOUR_THEME }, + {"hasvideooverlay", SKIN_HAS_VIDEO_OVERLAY}, + {"hasmusicoverlay", SKIN_HAS_MUSIC_OVERLAY}, {"aspectratio", SKIN_ASPECT_RATIO}}; const infomap window_bools[] = {{ "ismedia", WINDOW_IS_MEDIA }, @@ -711,72 +689,7 @@ { "actstreamencryptionname", PVR_ACTUAL_STREAM_CRYPTION }, { "actstreamservicename", PVR_ACTUAL_STREAM_SERVICE }, { "actstreammux", PVR_ACTUAL_STREAM_MUX }, - { "actstreamprovidername", PVR_ACTUAL_STREAM_PROVIDER }, - { "istimeshift", PVR_IS_TIMESHIFTING }, - { "timeshiftstart", PVR_TIMESHIFT_START_TIME }, - { "timeshiftend", PVR_TIMESHIFT_END_TIME }, - { "timeshiftcur", PVR_TIMESHIFT_PLAY_TIME }, - { "timeshiftprogress", PVR_TIMESHIFT_PROGRESS }}; - -const infomap adsp[] = {{ "isactive", ADSP_IS_ACTIVE }, - { "hasinputresample", ADSP_HAS_INPUT_RESAMPLE }, - { "haspreprocess", ADSP_HAS_PRE_PROCESS }, - { "hasmasterprocess", ADSP_HAS_MASTER_PROCESS }, - { "haspostprocess", ADSP_HAS_POST_PROCESS }, - { "hasoutputresample", ADSP_HAS_OUTPUT_RESAMPLE }, - { "masteractive", ADSP_MASTER_ACTIVE }, - { "activestreamtype", ADSP_ACTIVE_STREAM_TYPE }, - { "detectedstreamtype", ADSP_DETECTED_STREAM_TYPE }, - { "mastername", ADSP_MASTER_NAME }, - { "masterinfo", ADSP_MASTER_INFO }, - { "masterownicon", ADSP_MASTER_OWN_ICON }, - { "masteroverrideicon", ADSP_MASTER_OVERRIDE_ICON }}; - -const infomap rds[] = {{ "hasrds", RDS_HAS_RDS }, - { "hasradiotext", RDS_HAS_RADIOTEXT }, - { "hasradiotextplus", RDS_HAS_RADIOTEXT_PLUS }, - { "audiolanguage", RDS_AUDIO_LANG }, - { "channelcountry", RDS_CHANNEL_COUNTRY }, - { "title", RDS_TITLE }, - { "getline", RDS_GET_RADIOTEXT_LINE }, - { "artist", RDS_ARTIST }, - { "band", RDS_BAND }, - { "composer", RDS_COMPOSER }, - { "conductor", RDS_CONDUCTOR }, - { "album", RDS_ALBUM }, - { "tracknumber", RDS_ALBUM_TRACKNUMBER }, - { "radiostyle", RDS_GET_RADIO_STYLE }, - { "comment", RDS_COMMENT }, - { "infonews", RDS_INFO_NEWS }, - { "infonewslocal", RDS_INFO_NEWS_LOCAL }, - { "infostock", RDS_INFO_STOCK }, - { "infostocksize", RDS_INFO_STOCK_SIZE }, - { "infosport", RDS_INFO_SPORT }, - { "infosportsize", RDS_INFO_SPORT_SIZE }, - { "infolottery", RDS_INFO_LOTTERY }, - { "infolotterysize", RDS_INFO_LOTTERY_SIZE }, - { "infoweather", RDS_INFO_WEATHER }, - { "infoweathersize", RDS_INFO_WEATHER_SIZE }, - { "infocinema", RDS_INFO_CINEMA }, - { "infocinemasize", RDS_INFO_CINEMA_SIZE }, - { "infohoroscope", RDS_INFO_HOROSCOPE }, - { "infohoroscopesize", RDS_INFO_HOROSCOPE_SIZE }, - { "infoother", RDS_INFO_OTHER }, - { "infoothersize", RDS_INFO_OTHER_SIZE }, - { "progstation", RDS_PROG_STATION }, - { "prognow", RDS_PROG_NOW }, - { "prognext", RDS_PROG_NEXT }, - { "proghost", RDS_PROG_HOST }, - { "progeditstaff", RDS_PROG_EDIT_STAFF }, - { "proghomepage", RDS_PROG_HOMEPAGE }, - { "progstyle", RDS_PROG_STYLE }, - { "phonehotline", RDS_PHONE_HOTLINE }, - { "phonestudio", RDS_PHONE_STUDIO }, - { "smsstudio", RDS_SMS_STUDIO }, - { "emailhotline", RDS_EMAIL_HOTLINE }, - { "emailstudio", RDS_EMAIL_STUDIO }, - { "hashotline", RDS_HAS_HOTLINE_DATA }, - { "hasstudio", RDS_HAS_STUDIO_DATA }}; + { "actstreamprovidername", PVR_ACTUAL_STREAM_PROVIDER }}; const infomap slideshow[] = {{ "ispaused", SLIDESHOW_ISPAUSED }, { "isactive", SLIDESHOW_ISACTIVE }, @@ -855,7 +768,7 @@ return params.size(); } -void CGUIInfoManager::SplitInfoString(const std::string &infoString, std::vector &info) +void CGUIInfoManager::SplitInfoString(const std::string &infoString, vector &info) { // our string is of the form: // category[(params)][.info(params).info2(params)] ... @@ -922,7 +835,7 @@ std::string strTest = strCondition; StringUtils::Trim(strTest); - std::vector< Property> info; + vector< Property> info; SplitInfoString(strTest, info); if (info.empty()) @@ -1202,25 +1115,40 @@ order = SortOrderDescending; return AddMultiInfo(GUIInfo(CONTAINER_SORT_DIRECTION, order)); } + else if (prop.name == "sort") + { + if (StringUtils::EqualsNoCase(prop.param(), "songrating")) + return AddMultiInfo(GUIInfo(CONTAINER_SORT_METHOD, SortByRating)); + } } - else if (cat.name == "listitem" || cat.name == "listitemposition" - || cat.name == "listitemnowrap" || cat.name == "listitemabsolute") + else if (cat.name == "listitem") { int offset = atoi(cat.param().c_str()); int ret = TranslateListItem(prop); if (ret) listItemDependent = true; if (offset) - { - if (cat.name == "listitem") - return AddMultiInfo(GUIInfo(ret, 0, offset, INFOFLAG_LISTITEM_WRAP)); - else if (cat.name == "listitemposition") - return AddMultiInfo(GUIInfo(ret, 0, offset, INFOFLAG_LISTITEM_POSITION)); - else if (cat.name == "listitemabsolute") - return AddMultiInfo(GUIInfo(ret, 0, offset, INFOFLAG_LISTITEM_ABSOLUTE)); - else if (cat.name == "listitemnowrap") - return AddMultiInfo(GUIInfo(ret, 0, offset)); - } + return AddMultiInfo(GUIInfo(ret, 0, offset, INFOFLAG_LISTITEM_WRAP)); + return ret; + } + else if (cat.name == "listitemposition") + { + int offset = atoi(cat.param().c_str()); + int ret = TranslateListItem(prop); + if (ret) + listItemDependent = true; + if (offset) + return AddMultiInfo(GUIInfo(ret, 0, offset, INFOFLAG_LISTITEM_POSITION)); + return ret; + } + else if (cat.name == "listitemnowrap") + { + int offset = atoi(cat.param().c_str()); + int ret = TranslateListItem(prop); + if (ret) + listItemDependent = true; + if (offset) + return AddMultiInfo(GUIInfo(ret, 0, offset)); return ret; } else if (cat.name == "visualisation") @@ -1251,12 +1179,12 @@ if (prop.name == "string") { if (prop.num_params() == 2) - return AddMultiInfo(GUIInfo(SKIN_STRING, CSkinSettings::GetInstance().TranslateString(prop.param(0)), ConditionalStringParameter(prop.param(1)))); + return AddMultiInfo(GUIInfo(SKIN_STRING, CSkinSettings::Get().TranslateString(prop.param(0)), ConditionalStringParameter(prop.param(1)))); else - return AddMultiInfo(GUIInfo(SKIN_STRING, CSkinSettings::GetInstance().TranslateString(prop.param(0)))); + return AddMultiInfo(GUIInfo(SKIN_STRING, CSkinSettings::Get().TranslateString(prop.param(0)))); } if (prop.name == "hassetting") - return AddMultiInfo(GUIInfo(SKIN_BOOL, CSkinSettings::GetInstance().TranslateBool(prop.param(0)))); + return AddMultiInfo(GUIInfo(SKIN_BOOL, CSkinSettings::Get().TranslateBool(prop.param(0)))); else if (prop.name == "hastheme") return AddMultiInfo(GUIInfo(SKIN_HAS_THEME, ConditionalStringParameter(prop.param(0)))); } @@ -1335,25 +1263,6 @@ return pvr[i].val; } } - else if (cat.name == "adsp") - { - for (size_t i = 0; i < sizeof(adsp) / sizeof(infomap); i++) - { - if (prop.name == adsp[i].str) - return adsp[i].val; - } - } - else if (cat.name == "rds") - { - if (prop.name == "getline") - return AddMultiInfo(GUIInfo(RDS_GET_RADIOTEXT_LINE, atoi(prop.param(0).c_str()))); - - for (size_t i = 0; i < sizeof(rds) / sizeof(infomap); i++) - { - if (prop.name == rds[i].str) - return rds[i].val; - } - } } else if (info.size() == 3 || info.size() == 4) { @@ -1373,6 +1282,7 @@ else if (platform == "darwin") return SYSTEM_PLATFORM_DARWIN; else if (platform == "osx") return SYSTEM_PLATFORM_DARWIN_OSX; else if (platform == "ios") return SYSTEM_PLATFORM_DARWIN_IOS; + else if (platform == "atv2") return SYSTEM_PLATFORM_DARWIN_ATV2; else if (platform == "android") return SYSTEM_PLATFORM_ANDROID; } if (info[0].name == "musicplayer") @@ -1409,11 +1319,6 @@ listItemDependent = true; return AddMultiInfo(GUIInfo(TranslateListItem(info[2]), id, offset, INFOFLAG_LISTITEM_WRAP)); } - else if (info[1].name == "listitemabsolute") - { - listItemDependent = true; - return AddMultiInfo(GUIInfo(TranslateListItem(info[2]), id, offset, INFOFLAG_LISTITEM_ABSOLUTE)); - } } else if (info[0].name == "control") { @@ -1554,19 +1459,8 @@ case PVR_ACTUAL_STREAM_SERVICE: case PVR_ACTUAL_STREAM_MUX: case PVR_ACTUAL_STREAM_PROVIDER: - case PVR_TIMESHIFT_START_TIME: - case PVR_TIMESHIFT_END_TIME: - case PVR_TIMESHIFT_PLAY_TIME: g_PVRManager.TranslateCharInfo(info, strLabel); break; - case ADSP_ACTIVE_STREAM_TYPE: - case ADSP_DETECTED_STREAM_TYPE: - case ADSP_MASTER_NAME: - case ADSP_MASTER_INFO: - case ADSP_MASTER_OWN_ICON: - case ADSP_MASTER_OVERRIDE_ICON: - ActiveAE::CActiveAEDSP::GetInstance().TranslateCharInfo(info, strLabel); - break; case WEATHER_CONDITIONS: strLabel = g_weatherManager.GetInfo(WEATHER_LABEL_CURRENT_COND); StringUtils::Trim(strLabel); @@ -1584,7 +1478,7 @@ URIUtils::RemoveExtension(strLabel); break; case WEATHER_PLUGIN: - strLabel = CSettings::GetInstance().GetString(CSettings::SETTING_WEATHER_ADDON); + strLabel = CSettings::Get().GetString("weather.addon"); break; case SYSTEM_DATE: strLabel = GetDate(); @@ -1596,10 +1490,10 @@ strLabel = StringUtils::Format("%2.1f dB", CAEUtil::PercentToGain(g_application.GetVolume(false))); break; case PLAYER_SUBTITLE_DELAY: - strLabel = StringUtils::Format("%2.3f s", CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay); + strLabel = StringUtils::Format("%2.3f s", CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay); break; case PLAYER_AUDIO_DELAY: - strLabel = StringUtils::Format("%2.3f s", CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay); + strLabel = StringUtils::Format("%2.3f s", CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay); break; case PLAYER_CHAPTER: if(g_application.m_pPlayer->IsPlaying()) @@ -1655,21 +1549,12 @@ { if(m_currentFile) { - if (m_currentFile->HasPVRRadioRDSInfoTag()) - { - /*! Load the RDS Radiotext+ if present */ - if (!m_currentFile->GetPVRRadioRDSInfoTag()->GetTitle().empty()) - return m_currentFile->GetPVRRadioRDSInfoTag()->GetTitle(); - /*! If no plus present load the RDS Radiotext info line 0 if present */ - if (!g_application.m_pPlayer->GetRadioText(0).empty()) - return g_application.m_pPlayer->GetRadioText(0); - } if (m_currentFile->HasPVRChannelInfoTag()) { CEpgInfoTagPtr tag(m_currentFile->GetPVRChannelInfoTag()->GetEPGNow()); return tag ? tag->Title() : - CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? + CSettings::Get().GetBool("epg.hidenoinfoavailable") ? "" : g_localizeStrings.Get(19055); // no information available } if (m_currentFile->HasPVRRecordingInfoTag() && !m_currentFile->GetPVRRecordingInfoTag()->m_strTitle.empty()) @@ -1732,7 +1617,6 @@ case VIDEOPLAYER_SEASON: case VIDEOPLAYER_RATING: case VIDEOPLAYER_RATING_AND_VOTES: - case VIDEOPLAYER_USER_RATING: case VIDEOPLAYER_TVSHOW: case VIDEOPLAYER_PREMIERED: case VIDEOPLAYER_STUDIO: @@ -1794,8 +1678,7 @@ case VIDEOPLAYER_AUDIO_CHANNELS: if(g_application.m_pPlayer->IsPlaying()) { - if (m_audioInfo.channels > 0) - strLabel = StringUtils::Format("%i", m_audioInfo.channels); + strLabel = StringUtils::Format("%i", m_audioInfo.channels); } break; case VIDEOPLAYER_AUDIO_LANG: @@ -1820,47 +1703,6 @@ strLabel = info.language; } break; - case RDS_AUDIO_LANG: - case RDS_CHANNEL_COUNTRY: - case RDS_TITLE: - case RDS_BAND: - case RDS_COMPOSER: - case RDS_CONDUCTOR: - case RDS_ALBUM: - case RDS_ALBUM_TRACKNUMBER: - case RDS_GET_RADIO_STYLE: - case RDS_COMMENT: - case RDS_ARTIST: - case RDS_INFO_NEWS: - case RDS_INFO_NEWS_LOCAL: - case RDS_INFO_STOCK: - case RDS_INFO_STOCK_SIZE: - case RDS_INFO_SPORT: - case RDS_INFO_SPORT_SIZE: - case RDS_INFO_LOTTERY: - case RDS_INFO_LOTTERY_SIZE: - case RDS_INFO_WEATHER: - case RDS_INFO_WEATHER_SIZE: - case RDS_INFO_CINEMA: - case RDS_INFO_CINEMA_SIZE: - case RDS_INFO_HOROSCOPE: - case RDS_INFO_HOROSCOPE_SIZE: - case RDS_INFO_OTHER: - case RDS_INFO_OTHER_SIZE: - case RDS_PROG_STATION: - case RDS_PROG_NOW: - case RDS_PROG_NEXT: - case RDS_PROG_HOST: - case RDS_PROG_EDIT_STAFF: - case RDS_PROG_HOMEPAGE: - case RDS_PROG_STYLE: - case RDS_PHONE_HOTLINE: - case RDS_PHONE_STUDIO: - case RDS_SMS_STUDIO: - case RDS_EMAIL_HOTLINE: - case RDS_EMAIL_STUDIO: - strLabel = GetRadioRDSLabel(info); - break; case PLAYLIST_LENGTH: case PLAYLIST_POSITION: case PLAYLIST_RANDOM: @@ -1905,14 +1747,14 @@ case SYSTEM_SCREEN_RESOLUTION: if(g_Windowing.IsFullScreen()) strLabel = StringUtils::Format("%ix%i@%.2fHz - %s", - CDisplaySettings::GetInstance().GetCurrentResolutionInfo().iScreenWidth, - CDisplaySettings::GetInstance().GetCurrentResolutionInfo().iScreenHeight, - CDisplaySettings::GetInstance().GetCurrentResolutionInfo().fRefreshRate, + CDisplaySettings::Get().GetCurrentResolutionInfo().iScreenWidth, + CDisplaySettings::Get().GetCurrentResolutionInfo().iScreenHeight, + CDisplaySettings::Get().GetCurrentResolutionInfo().fRefreshRate, g_localizeStrings.Get(244).c_str()); else strLabel = StringUtils::Format("%ix%i - %s", - CDisplaySettings::GetInstance().GetCurrentResolutionInfo().iScreenWidth, - CDisplaySettings::GetInstance().GetCurrentResolutionInfo().iScreenHeight, + CDisplaySettings::Get().GetCurrentResolutionInfo().iScreenWidth, + CDisplaySettings::Get().GetCurrentResolutionInfo().iScreenHeight, g_localizeStrings.Get(242).c_str()); return strLabel; break; @@ -1953,20 +1795,14 @@ break; } case CONTAINER_SORT_METHOD: - case CONTAINER_SORT_ORDER: - { + { CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW); if (window) { const CGUIViewState *viewState = ((CGUIMediaWindow*)window)->GetViewState(); if (viewState) - { - if (info == CONTAINER_SORT_METHOD) - strLabel = g_localizeStrings.Get(viewState->GetSortMethodLabel()); - else if (info == CONTAINER_SORT_ORDER) - strLabel = g_localizeStrings.Get(viewState->GetSortOrderLabel()); - } - } + strLabel = g_localizeStrings.Get(viewState->GetSortMethodLabel()); + } } break; case CONTAINER_NUM_PAGES: @@ -1983,42 +1819,33 @@ } break; case CONTAINER_TOTALTIME: - case CONTAINER_TOTALWATCHED: - case CONTAINER_TOTALUNWATCHED: { CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW); if (window) { const CFileItemList& items=((CGUIMediaWindow *)window)->CurrentDirectory(); - int count=0; + int duration=0; for (int i=0;iHasVideoInfoTag() && item->GetVideoInfoTag()->m_playCount > 0) - count += 1; - else if (info == CONTAINER_TOTALUNWATCHED && item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_playCount == 0) - count += 1; - else if (info == CONTAINER_TOTALTIME && item->HasMusicInfoTag()) - count += item->GetMusicInfoTag()->GetDuration(); - else if (info == CONTAINER_TOTALTIME && item->HasVideoInfoTag()) - count += item->GetVideoInfoTag()->m_streamDetails.GetVideoDuration(); - } - if (info == CONTAINER_TOTALTIME && count > 0) - return StringUtils::SecondsToTimeString(count); - else if (info == CONTAINER_TOTALWATCHED || info == CONTAINER_TOTALUNWATCHED) - return StringUtils::Format("%i", count); + if (item->HasMusicInfoTag()) + duration += item->GetMusicInfoTag()->GetDuration(); + else if (item->HasVideoInfoTag()) + duration += item->GetVideoInfoTag()->m_streamDetails.GetVideoDuration(); + } + if (duration > 0) + return StringUtils::SecondsToTimeString(duration); } } break; case SYSTEM_BUILD_VERSION_SHORT: - strLabel = CSysInfo::GetVersionShort(); + strLabel = GetVersionShort(); break; case SYSTEM_BUILD_VERSION: - strLabel = CSysInfo::GetVersion(); + strLabel = GetVersion(); break; case SYSTEM_BUILD_DATE: - strLabel = CSysInfo::GetBuildDate(); + strLabel = GetBuild(); break; case SYSTEM_FREE_MEMORY: case SYSTEM_FREE_MEMORY_PERCENT: @@ -2033,15 +1860,15 @@ int iMemPercentUsed = 100 - iMemPercentFree; if (info == SYSTEM_FREE_MEMORY) - strLabel = StringUtils::Format("%uMB", (unsigned int)(stat.ullAvailPhys/MB)); + strLabel = StringUtils::Format("%luMB", (ULONG)(stat.ullAvailPhys/MB)); else if (info == SYSTEM_FREE_MEMORY_PERCENT) strLabel = StringUtils::Format("%i%%", iMemPercentFree); else if (info == SYSTEM_USED_MEMORY) - strLabel = StringUtils::Format("%uMB", (unsigned int)((stat.ullTotalPhys - stat.ullAvailPhys)/MB)); + strLabel = StringUtils::Format("%luMB", (ULONG)((stat.ullTotalPhys - stat.ullAvailPhys)/MB)); else if (info == SYSTEM_USED_MEMORY_PERCENT) strLabel = StringUtils::Format("%i%%", iMemPercentUsed); else if (info == SYSTEM_TOTAL_MEMORY) - strLabel = StringUtils::Format("%uMB", (unsigned int)(stat.ullTotalPhys/MB)); + strLabel = StringUtils::Format("%luMB", (ULONG)(stat.ullTotalPhys/MB)); } break; case SYSTEM_SCREEN_MODE: @@ -2057,7 +1884,7 @@ return g_localizeStrings.Get(g_windowManager.GetFocusedWindow()); break; case SYSTEM_STARTUP_WINDOW: - strLabel = StringUtils::Format("%i", CSettings::GetInstance().GetInt(CSettings::SETTING_LOOKANDFEEL_STARTUPWINDOW)); + strLabel = StringUtils::Format("%i", CSettings::Get().GetInt("lookandfeel.startupwindow")); break; case SYSTEM_CURRENT_CONTROL: { @@ -2088,15 +1915,15 @@ } break; case SYSTEM_PROFILENAME: - strLabel = CProfilesManager::GetInstance().GetCurrentProfile().getName(); + strLabel = CProfilesManager::Get().GetCurrentProfile().getName(); break; case SYSTEM_PROFILECOUNT: - strLabel = StringUtils::Format("%" PRIuS, CProfilesManager::GetInstance().GetNumberOfProfiles()); + strLabel = StringUtils::Format("%" PRIuS, CProfilesManager::Get().GetNumberOfProfiles()); break; case SYSTEM_PROFILEAUTOLOGIN: { - int profileId = CProfilesManager::GetInstance().GetAutoLoginProfileId(); - if ((profileId < 0) || (!CProfilesManager::GetInstance().GetProfileName(profileId, strLabel))) + int profileId = CProfilesManager::Get().GetAutoLoginProfileId(); + if ((profileId < 0) || (!CProfilesManager::Get().GetProfileName(profileId, strLabel))) strLabel = g_localizeStrings.Get(37014); // Last used profile } break; @@ -2114,20 +1941,30 @@ } break; case SYSTEM_FRIENDLY_NAME: - strLabel = CSysInfo::GetDeviceName(); + { + std::string friendlyName = CSettings::Get().GetString("services.devicename"); + if (StringUtils::EqualsNoCase(friendlyName, CCompileInfo::GetAppName())) + { + std::string hostname("[unknown]"); + g_application.getNetwork().GetHostName(hostname); + strLabel = StringUtils::Format("%s (%s)", friendlyName.c_str(), hostname.c_str()); + } + else + strLabel = friendlyName; + } break; case SYSTEM_STEREOSCOPIC_MODE: { - int stereoMode = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOSCREEN_STEREOSCOPICMODE); + int stereoMode = CSettings::Get().GetInt("videoscreen.stereoscopicmode"); strLabel = StringUtils::Format("%i", stereoMode); } break; case SKIN_THEME: - strLabel = CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME); + strLabel = CSettings::Get().GetString("lookandfeel.skintheme"); break; case SKIN_COLOUR_THEME: - strLabel = CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS); + strLabel = CSettings::Get().GetString("lookandfeel.skincolors"); break; case SKIN_ASPECT_RATIO: if (g_SkinInfo) @@ -2156,14 +1993,14 @@ break; case NETWORK_DNS1_ADDRESS: { - std::vector nss = g_application.getNetwork().GetNameServers(); + vector nss = g_application.getNetwork().GetNameServers(); if (nss.size() >= 1) return nss[0]; } break; case NETWORK_DNS2_ADDRESS: { - std::vector nss = g_application.getNetwork().GetNameServers(); + vector nss = g_application.getNetwork().GetNameServers(); if (nss.size() >= 2) return nss[1]; } @@ -2206,8 +2043,8 @@ case VISUALISATION_NAME: { AddonPtr addon; - strLabel = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICPLAYER_VISUALISATION); - if (CAddonMgr::GetInstance().GetAddon(strLabel,addon) && addon) + strLabel = CSettings::Get().GetString("musicplayer.visualisation"); + if (CAddonMgr::Get().GetAddon(strLabel,addon) && addon) strLabel = addon->Name(); } break; @@ -2295,14 +2132,8 @@ switch( info ) { case PLAYER_PROGRESS: - { - const CEpgInfoTagPtr tag(GetEpgInfoTag()); - if (tag) - value = static_cast(tag->ProgressPercentage()); - else - value = static_cast(g_application.GetPercentage()); - break; - } + value = (int)(g_application.GetPercentage()); + break; case PLAYER_PROGRESS_CACHE: value = (int)(g_application.GetCachePercentage()); break; @@ -2355,7 +2186,6 @@ case PVR_ACTUAL_STREAM_SIG_PROGR: case PVR_ACTUAL_STREAM_SNR_PROGR: case PVR_BACKEND_DISKSPACE_PROGR: - case PVR_TIMESHIFT_PROGRESS: value = g_PVRManager.TranslateIntInfo(info); return true; case SYSTEM_BATTERY_LEVEL: @@ -2383,7 +2213,7 @@ CSingleLock lock(m_critInfo); // do we have the boolean expression already registered? - std::vector::const_iterator i = std::find_if(m_bools.begin(), m_bools.end(), InfoBoolFinder(condition, context)); + vector::const_iterator i = find_if(m_bools.begin(), m_bools.end(), InfoBoolFinder(condition, context)); if (i != m_bools.end()) return *i; @@ -2395,12 +2225,12 @@ return m_bools.back(); } -bool CGUIInfoManager::EvaluateBool(const std::string &expression, int contextWindow /* = 0 */, const CGUIListItemPtr &item /* = NULL */) +bool CGUIInfoManager::EvaluateBool(const std::string &expression, int contextWindow) { bool result = false; INFO::InfoPtr info = Register(expression, contextWindow); if (info) - result = info->Get(item.get()); + result = info->Get(); return result; } @@ -2488,6 +2318,12 @@ #else bReturn = false; #endif + else if (condition == SYSTEM_PLATFORM_DARWIN_ATV2) +#ifdef TARGET_DARWIN_IOS_ATV2 + bReturn = true; +#else + bReturn = false; +#endif else if (condition == SYSTEM_PLATFORM_ANDROID) #if defined(TARGET_ANDROID) bReturn = true; @@ -2525,20 +2361,16 @@ bReturn = m_playerShowInfo; else if (condition == PLAYER_SHOWCODEC) bReturn = m_playerShowCodec; - else if (condition == PLAYER_IS_CHANNEL_PREVIEW_ACTIVE) - bReturn = IsPlayerChannelPreviewActive(); else if (condition >= MULTI_INFO_START && condition <= MULTI_INFO_END) { return GetMultiInfoBool(m_multiInfo[condition - MULTI_INFO_START], contextWindow, item); } else if (condition == SYSTEM_HASLOCKS) - bReturn = CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE; + bReturn = CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE; else if (condition == SYSTEM_HAS_PVR) bReturn = true; - else if (condition == SYSTEM_HAS_ADSP) - bReturn = true; else if (condition == SYSTEM_ISMASTER) - bReturn = CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && g_passwordManager.bMasterUser; + bReturn = CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && g_passwordManager.bMasterUser; else if (condition == SYSTEM_ISFULLSCREEN) bReturn = g_Windowing.IsFullScreen(); else if (condition == SYSTEM_ISSTANDALONE) @@ -2546,35 +2378,30 @@ else if (condition == SYSTEM_ISINHIBIT) bReturn = g_application.IsIdleShutdownInhibited(); else if (condition == SYSTEM_HAS_SHUTDOWN) - bReturn = (CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNTIME) > 0); + bReturn = (CSettings::Get().GetInt("powermanagement.shutdowntime") > 0); else if (condition == SYSTEM_LOGGEDON) bReturn = !(g_windowManager.GetActiveWindow() == WINDOW_LOGIN_SCREEN); else if (condition == SYSTEM_SHOW_EXIT_BUTTON) bReturn = g_advancedSettings.m_showExitButton; else if (condition == SYSTEM_HAS_LOGINSCREEN) - bReturn = CProfilesManager::GetInstance().UsingLoginScreen(); - else if (condition == SYSTEM_HAS_MODAL_DIALOG) - bReturn = g_windowManager.HasModalDialog(); + bReturn = CProfilesManager::Get().UsingLoginScreen(); else if (condition == WEATHER_IS_FETCHED) bReturn = g_weatherManager.IsFetched(); else if (condition >= PVR_CONDITIONS_START && condition <= PVR_CONDITIONS_END) bReturn = g_PVRManager.TranslateBoolInfo(condition); - else if (condition >= ADSP_CONDITIONS_START && condition <= ADSP_CONDITIONS_END) - bReturn = ActiveAE::CActiveAEDSP::GetInstance().TranslateBoolInfo(condition); + else if (condition == SYSTEM_INTERNET_STATE) { g_sysinfo.GetInfo(condition); bReturn = g_sysinfo.HasInternet(); } - else if (condition == SYSTEM_HAS_INPUT_HIDDEN) + else if (condition == SKIN_HAS_VIDEO_OVERLAY) { - CGUIDialogNumeric *pNumeric = (CGUIDialogNumeric *)g_windowManager.GetWindow(WINDOW_DIALOG_NUMERIC); - CGUIDialogKeyboardGeneric *pKeyboard = (CGUIDialogKeyboardGeneric*)g_windowManager.GetWindow(WINDOW_DIALOG_KEYBOARD); - - if (pNumeric && pNumeric->IsActive()) - bReturn = pNumeric->IsInputHidden(); - else if (pKeyboard && pKeyboard->IsActive()) - bReturn = pKeyboard->IsInputHidden(); + bReturn = g_windowManager.IsOverlayAllowed() && g_application.m_pPlayer->IsPlayingVideo(); + } + else if (condition == SKIN_HAS_MUSIC_OVERLAY) + { + bReturn = g_windowManager.IsOverlayAllowed() && g_application.m_pPlayer->IsPlayingAudio(); } else if (condition == CONTAINER_HASFILES || condition == CONTAINER_HASFOLDERS) { @@ -2610,21 +2437,15 @@ if (pWindow) bReturn = ((CGUIMediaWindow*)pWindow)->CurrentDirectory().HasArt("thumb"); } - else if (condition == CONTAINER_HAS_NEXT || condition == CONTAINER_HAS_PREVIOUS || - condition == CONTAINER_SCROLLING || condition == CONTAINER_ISUPDATING || - condition == CONTAINER_HAS_PARENT_ITEM) + else if (condition == CONTAINER_HAS_NEXT || condition == CONTAINER_HAS_PREVIOUS + || condition == CONTAINER_SCROLLING || condition == CONTAINER_ISUPDATING) { - const CGUIControl *control = NULL; CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW); if (window) - control = window->GetControl(window->GetViewContainerID()); - - if (control) { - if (control->IsContainer()) + const CGUIControl* control = window->GetControl(window->GetViewContainerID()); + if (control) bReturn = control->GetCondition(condition, 0); - else if (control->GetControlType() == CGUIControl::GUICONTROL_TEXTBOX) - bReturn = ((CGUITextBox *)control)->GetCondition(condition, 0); } } else if (condition == CONTAINER_CAN_FILTER) @@ -2655,7 +2476,7 @@ CGUIWindow *pWindow = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW); if (pWindow) { - std::map::const_iterator it = m_containerMoves.find(pWindow->GetViewContainerID()); + map::const_iterator it = m_containerMoves.find(pWindow->GetViewContainerID()); if (it != m_containerMoves.end()) { if (condition > CONTAINER_STATIC) // moving up @@ -2765,7 +2586,7 @@ } break; case PLAYER_SEEKING: - bReturn = CSeekHandler::GetInstance().InProgress(); + bReturn = CSeekHandler::Get().InProgress(); break; case PLAYER_SHOWTIME: bReturn = m_playerShowTime; @@ -2803,7 +2624,7 @@ } break; case VIDEOPLAYER_USING_OVERLAYS: - bReturn = (CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_RENDERMETHOD) == RENDER_OVERLAYS); + bReturn = (CSettings::Get().GetInt("videoplayer.rendermethod") == RENDER_OVERLAYS); break; case VIDEOPLAYER_ISFULLSCREEN: bReturn = g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO; @@ -2845,7 +2666,7 @@ } break; case VISUALISATION_ENABLED: - bReturn = !CSettings::GetInstance().GetString(CSettings::SETTING_MUSICPLAYER_VISUALISATION).empty(); + bReturn = !CSettings::Get().GetString("musicplayer.visualisation").empty(); break; case VIDEOPLAYER_HAS_EPG: if (m_currentFile->HasPVRChannelInfoTag()) @@ -2860,44 +2681,10 @@ case VIDEOPLAYER_CAN_RESUME_LIVE_TV: if (m_currentFile->HasPVRRecordingInfoTag()) { - EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::GetInstance().GetTagById(m_currentFile->GetPVRRecordingInfoTag()->EpgEvent()); + EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::Get().GetTagById(m_currentFile->GetPVRRecordingInfoTag()->EpgEvent()); bReturn = (epgTag && epgTag->IsActive() && epgTag->ChannelTag()); } break; - case VISUALISATION_HAS_PRESETS: - { - CGUIMessage msg(GUI_MSG_GET_VISUALISATION, 0, 0); - g_windowManager.SendMessage(msg); - if (msg.GetPointer()) - { - CVisualisation* viz = NULL; - viz = (CVisualisation*)msg.GetPointer(); - bReturn = (viz && viz->HasPresets()); - } - } - break; - case RDS_HAS_RDS: - bReturn = g_application.m_pPlayer->IsPlayingRDS(); - break; - case RDS_HAS_RADIOTEXT: - if (m_currentFile->HasPVRRadioRDSInfoTag()) - bReturn = m_currentFile->GetPVRRadioRDSInfoTag()->IsPlayingRadiotext(); - break; - case RDS_HAS_RADIOTEXT_PLUS: - if (m_currentFile->HasPVRRadioRDSInfoTag()) - bReturn = m_currentFile->GetPVRRadioRDSInfoTag()->IsPlayingRadiotextPlus(); - break; - case RDS_HAS_HOTLINE_DATA: - if (m_currentFile->HasPVRRadioRDSInfoTag()) - bReturn = (!m_currentFile->GetPVRRadioRDSInfoTag()->GetEMailHotline().empty() || - !m_currentFile->GetPVRRadioRDSInfoTag()->GetPhoneHotline().empty()); - break; - case RDS_HAS_STUDIO_DATA: - if (m_currentFile->HasPVRRadioRDSInfoTag()) - bReturn = (!m_currentFile->GetPVRRadioRDSInfoTag()->GetEMailStudio().empty() || - !m_currentFile->GetPVRRadioRDSInfoTag()->GetSMSStudio().empty() || - !m_currentFile->GetPVRRadioRDSInfoTag()->GetPhoneStudio().empty()); - break; default: // default, use integer value different from 0 as true { int val; @@ -2948,20 +2735,20 @@ { case SKIN_BOOL: { - bReturn = CSkinSettings::GetInstance().GetBool(info.GetData1()); + bReturn = CSkinSettings::Get().GetBool(info.GetData1()); } break; case SKIN_STRING: { if (info.GetData2()) - bReturn = StringUtils::EqualsNoCase(CSkinSettings::GetInstance().GetString(info.GetData1()), m_stringParameters[info.GetData2()]); + bReturn = StringUtils::EqualsNoCase(CSkinSettings::Get().GetString(info.GetData1()), m_stringParameters[info.GetData2()]); else - bReturn = !CSkinSettings::GetInstance().GetString(info.GetData1()).empty(); + bReturn = !CSkinSettings::Get().GetString(info.GetData1()).empty(); } break; case SKIN_HAS_THEME: { - std::string theme = CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME); + std::string theme = CSettings::Get().GetString("lookandfeel.skintheme"); URIUtils::RemoveExtension(theme); bReturn = StringUtils::EqualsNoCase(theme, m_stringParameters[info.GetData1()]); } @@ -3136,7 +2923,7 @@ bReturn = g_alarmClock.HasAlarm(m_stringParameters[info.GetData1()]); break; case SYSTEM_GET_BOOL: - bReturn = CSettings::GetInstance().GetBool(m_stringParameters[info.GetData1()]); + bReturn = CSettings::Get().GetBool(m_stringParameters[info.GetData1()]); break; case SYSTEM_HAS_CORE_ID: bReturn = g_cpuInfo.HasCoreId(info.GetData1()); @@ -3147,14 +2934,14 @@ { CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW); if (window) - bReturn = CMediaSettings::GetInstance().GetWatchedMode(((CGUIMediaWindow *)window)->CurrentDirectory().GetContent()) == WatchedModeUnwatched; + bReturn = CMediaSettings::Get().GetWatchedMode(((CGUIMediaWindow *)window)->CurrentDirectory().GetContent()) == WatchedModeUnwatched; } } break; case SYSTEM_HAS_ADDON: { AddonPtr addon; - bReturn = CAddonMgr::GetInstance().GetAddon(m_stringParameters[info.GetData1()],addon) && addon; + bReturn = CAddonMgr::Get().GetAddon(m_stringParameters[info.GetData1()],addon) && addon; break; } case CONTAINER_SCROLL_PREVIOUS: @@ -3162,7 +2949,7 @@ case CONTAINER_MOVE_NEXT: case CONTAINER_SCROLL_NEXT: { - std::map::const_iterator it = m_containerMoves.find(info.GetData1()); + map::const_iterator it = m_containerMoves.find(info.GetData1()); if (it != m_containerMoves.end()) { if (condition > CONTAINER_STATIC) // moving up @@ -3200,7 +2987,6 @@ case CONTAINER_SCROLLING: case CONTAINER_SUBITEM: case CONTAINER_ISUPDATING: - case CONTAINER_HAS_PARENT_ITEM: { const CGUIControl *control = NULL; if (info.GetData1()) @@ -3389,11 +3175,11 @@ { if (info.m_info == SKIN_STRING) { - return CSkinSettings::GetInstance().GetString(info.GetData1()); + return CSkinSettings::Get().GetString(info.GetData1()); } else if (info.m_info == SKIN_BOOL) { - bool bInfo = CSkinSettings::GetInstance().GetBool(info.GetData1()); + bool bInfo = CSkinSettings::Get().GetBool(info.GetData1()); if (bInfo) return g_localizeStrings.Get(20122); } @@ -3484,7 +3270,7 @@ } else if (info.m_info == PLAYER_SEEKSTEPSIZE) { - int seekSize = CSeekHandler::GetInstance().GetSeekSize(); + int seekSize = CSeekHandler::Get().GetSeekSize(); std::string strSeekSize = StringUtils::SecondsToTimeString(abs(seekSize), (TIME_FORMAT)info.GetData1()); if (seekSize < 0) return "-" + strSeekSize; @@ -3502,11 +3288,10 @@ else if (info.m_info == SYSTEM_DATE) { CDateTime time=CDateTime::GetCurrentDateTime(); - return time.GetAsLocalizedDate(m_stringParameters[info.GetData1()]); + return time.GetAsLocalizedDate(m_stringParameters[info.GetData1()],false); } else if (info.m_info == CONTAINER_NUM_PAGES || info.m_info == CONTAINER_CURRENT_PAGE || info.m_info == CONTAINER_NUM_ITEMS || info.m_info == CONTAINER_POSITION || - info.m_info == CONTAINER_ROW || info.m_info == CONTAINER_COLUMN || info.m_info == CONTAINER_CURRENT_ITEM) { const CGUIControl *control = NULL; @@ -3526,8 +3311,6 @@ { if (control->IsContainer()) return ((IGUIContainer *)control)->GetLabel(info.m_info); - else if (control->GetControlType() == CGUIControl::GUICONTROL_GROUPLIST) - return ((CGUIControlGroupList *)control)->GetLabel(info.m_info); else if (control->GetControlType() == CGUIControl::GUICONTROL_TEXTBOX) return ((CGUITextBox *)control)->GetLabel(info.m_info); } @@ -3559,20 +3342,6 @@ if (window) return ((CGUIMediaWindow *)window)->CurrentDirectory().GetArt(m_stringParameters[info.GetData2()]); } - else if (info.m_info == CONTAINER_CONTENT) - { - CGUIWindow *window = NULL; - if (info.GetData1()) - { // container specified - window = GetWindowWithCondition(contextWindow, 0); - } - else - { // no container specified - assume a mediawindow - window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW); - } - if (window) - return ((CGUIMediaWindow *)window)->CurrentDirectory().GetContent(); - } else if (info.m_info == CONTROL_GET_LABEL) { CGUIWindow *window = GetWindowWithCondition(contextWindow, 0); @@ -3614,9 +3383,9 @@ // in the future. AddonPtr addon; if (info.GetData2() == 0) - CAddonMgr::GetInstance().GetAddon(const_cast(this)->GetLabel(info.GetData1(), contextWindow),addon,ADDON_UNKNOWN,false); + CAddonMgr::Get().GetAddon(const_cast(this)->GetLabel(info.GetData1(), contextWindow),addon,ADDON_UNKNOWN,false); else - CAddonMgr::GetInstance().GetAddon(m_stringParameters[info.GetData1()],addon,ADDON_UNKNOWN,false); + CAddonMgr::Get().GetAddon(m_stringParameters[info.GetData1()],addon,ADDON_UNKNOWN,false); if (addon && info.m_info == SYSTEM_ADDON_TITLE) return addon->Name(); if (addon && info.m_info == SYSTEM_ADDON_ICON) @@ -3633,10 +3402,6 @@ if (playlistid > PLAYLIST_NONE) return GetPlaylistLabel(info.m_info, playlistid); } - else if (info.m_info == RDS_GET_RADIOTEXT_LINE) - { - return g_application.m_pPlayer->GetRadioText(info.GetData1()); - } return ""; } @@ -3655,7 +3420,7 @@ return g_weatherManager.GetInfo(WEATHER_IMAGE_CURRENT_ICON); else if (info == SYSTEM_PROFILETHUMB) { - std::string thumb = CProfilesManager::GetInstance().GetCurrentProfile().getThumb(); + std::string thumb = CProfilesManager::Get().GetCurrentProfile().getThumb(); if (thumb.empty()) thumb = "unknown-user.png"; return thumb; @@ -3862,7 +3627,7 @@ { case PLAYLIST_LENGTH: { - return StringUtils::Format("%i", g_playlistPlayer.GetPlaylist(iPlaylist).size()); + return StringUtils::Format("%i", g_playlistPlayer.GetPlaylist(iPlaylist).size());; } case PLAYLIST_POSITION: { @@ -3889,174 +3654,6 @@ return ""; } -std::string CGUIInfoManager::GetRadioRDSLabel(int item) -{ - if (!g_application.m_pPlayer->IsPlaying() || - !m_currentFile->HasPVRChannelInfoTag() || - !m_currentFile->HasPVRRadioRDSInfoTag()) - return ""; - - const PVR::CPVRRadioRDSInfoTag &tag = *m_currentFile->GetPVRRadioRDSInfoTag(); - switch (item) - { - case RDS_CHANNEL_COUNTRY: - return tag.GetCountry(); - - case RDS_AUDIO_LANG: - { - if (!tag.GetLanguage().empty()) - return tag.GetLanguage(); - - SPlayerAudioStreamInfo info; - g_application.m_pPlayer->GetAudioStreamInfo(g_application.m_pPlayer->GetAudioStream(), info); - return info.language; - } - - case RDS_TITLE: - return tag.GetTitle(); - - case RDS_ARTIST: - return tag.GetArtist(); - - case RDS_BAND: - return tag.GetBand(); - - case RDS_COMPOSER: - return tag.GetComposer(); - - case RDS_CONDUCTOR: - return tag.GetConductor(); - - case RDS_ALBUM: - return tag.GetAlbum(); - - case RDS_ALBUM_TRACKNUMBER: - { - if (tag.GetAlbumTrackNumber() > 0) - return StringUtils::Format("%i", tag.GetAlbumTrackNumber()); - break; - } - case RDS_GET_RADIO_STYLE: - return tag.GetRadioStyle(); - - case RDS_COMMENT: - return tag.GetComment(); - - case RDS_INFO_NEWS: - return tag.GetInfoNews(); - - case RDS_INFO_NEWS_LOCAL: - return tag.GetInfoNewsLocal(); - - case RDS_INFO_STOCK: - return tag.GetInfoStock(); - - case RDS_INFO_STOCK_SIZE: - return StringUtils::Format("%i", (int)tag.GetInfoStock().size()); - - case RDS_INFO_SPORT: - return tag.GetInfoSport(); - - case RDS_INFO_SPORT_SIZE: - return StringUtils::Format("%i", (int)tag.GetInfoSport().size()); - - case RDS_INFO_LOTTERY: - return tag.GetInfoLottery(); - - case RDS_INFO_LOTTERY_SIZE: - return StringUtils::Format("%i", (int)tag.GetInfoLottery().size()); - - case RDS_INFO_WEATHER: - return tag.GetInfoWeather(); - - case RDS_INFO_WEATHER_SIZE: - return StringUtils::Format("%i", (int)tag.GetInfoWeather().size()); - - case RDS_INFO_HOROSCOPE: - return tag.GetInfoHoroscope(); - - case RDS_INFO_HOROSCOPE_SIZE: - return StringUtils::Format("%i", (int)tag.GetInfoHoroscope().size()); - - case RDS_INFO_CINEMA: - return tag.GetInfoCinema(); - - case RDS_INFO_CINEMA_SIZE: - return StringUtils::Format("%i", (int)tag.GetInfoCinema().size()); - - case RDS_INFO_OTHER: - return tag.GetInfoOther(); - - case RDS_INFO_OTHER_SIZE: - return StringUtils::Format("%i", (int)tag.GetInfoOther().size()); - - case RDS_PROG_STATION: - { - if (!tag.GetProgStation().empty()) - return tag.GetProgStation(); - const CPVRChannelPtr channeltag = m_currentFile->GetPVRChannelInfoTag(); - if (channeltag) - return channeltag->ChannelName(); - break; - } - - case RDS_PROG_NOW: - { - if (!tag.GetProgNow().empty()) - return tag.GetProgNow(); - - CEpgInfoTagPtr epgNow(m_currentFile->GetPVRChannelInfoTag()->GetEPGNow()); - return epgNow ? - epgNow->Title() : - CSettings::GetInstance().GetBool("epg.hidenoinfoavailable") ? "" : g_localizeStrings.Get(19055); // no information available - break; - } - - case RDS_PROG_NEXT: - { - if (!tag.GetProgNext().empty()) - return tag.GetProgNext(); - - CEpgInfoTagPtr epgNext(m_currentFile->GetPVRChannelInfoTag()->GetEPGNext()); - return epgNext ? - epgNext->Title() : - CSettings::GetInstance().GetBool("epg.hidenoinfoavailable") ? "" : g_localizeStrings.Get(19055); // no information available - break; - } - - case RDS_PROG_HOST: - return tag.GetProgHost(); - - case RDS_PROG_EDIT_STAFF: - return tag.GetEditorialStaff(); - - case RDS_PROG_HOMEPAGE: - return tag.GetProgWebsite(); - - case RDS_PROG_STYLE: - return tag.GetProgStyle(); - - case RDS_PHONE_HOTLINE: - return tag.GetPhoneHotline(); - - case RDS_PHONE_STUDIO: - return tag.GetPhoneStudio(); - - case RDS_SMS_STUDIO: - return tag.GetSMSStudio(); - - case RDS_EMAIL_HOTLINE: - return tag.GetEMailHotline(); - - case RDS_EMAIL_STUDIO: - return tag.GetEMailStudio(); - - default: - break; - } - return ""; -} - std::string CGUIInfoManager::GetMusicLabel(int item) { if (!g_application.m_pPlayer->IsPlaying() || !m_currentFile->HasMusicInfoTag()) return ""; @@ -4131,10 +3728,10 @@ if (tag.GetAlbum().size()) { return tag.GetAlbum(); } break; case MUSICPLAYER_ARTIST: - if (tag.GetArtistString().size()) { return tag.GetArtistString(); } + if (tag.GetArtist().size()) { return StringUtils::Join(tag.GetArtist(), g_advancedSettings.m_musicItemSeparator); } break; case MUSICPLAYER_ALBUM_ARTIST: - if (tag.GetAlbumArtistString().size()) { return tag.GetAlbumArtistString(); } + if (tag.GetAlbumArtist().size()) { return StringUtils::Join(tag.GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator); } break; case MUSICPLAYER_YEAR: if (tag.GetYear()) { return tag.GetYearString(); } @@ -4165,15 +3762,7 @@ case MUSICPLAYER_CHANNEL_NAME: { if (m_currentFile->HasPVRChannelInfoTag()) - { - if (m_currentFile->HasPVRRadioRDSInfoTag()) - { - const CPVRRadioRDSInfoTagPtr rdstag(m_currentFile->GetPVRRadioRDSInfoTag()); - if (rdstag && !rdstag->GetProgStation().empty()) - return rdstag->GetProgStation(); - } return m_currentFile->GetPVRChannelInfoTag()->ChannelName(); - } } break; case MUSICPLAYER_CHANNEL_NUMBER: @@ -4213,7 +3802,22 @@ if (!g_application.m_pPlayer->IsPlaying()) return ""; - if (m_currentFile->HasPVRChannelInfoTag()) + if (item == VIDEOPLAYER_TITLE) + { + if(g_application.m_pPlayer->IsPlayingVideo()) + return GetLabel(PLAYER_TITLE); + } + else if (item == VIDEOPLAYER_PLAYLISTLEN) + { + if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_VIDEO) + return GetPlaylistLabel(PLAYLIST_LENGTH); + } + else if (item == VIDEOPLAYER_PLAYLISTPOS) + { + if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_VIDEO) + return GetPlaylistLabel(PLAYLIST_POSITION); + } + else if (m_currentFile->HasPVRChannelInfoTag()) { CPVRChannelPtr tag(m_currentFile->GetPVRChannelInfoTag()); CEpgInfoTagPtr epgTag; @@ -4225,7 +3829,7 @@ epgTag = tag->GetEPGNow(); return epgTag ? epgTag->Title() : - CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? + CSettings::Get().GetBool("epg.hidenoinfoavailable") ? "" : g_localizeStrings.Get(19055); // no information available case VIDEOPLAYER_GENRE: epgTag = tag->GetEPGNow(); @@ -4286,7 +3890,7 @@ epgTag = tag->GetEPGNext(); return epgTag ? epgTag->Title() : - CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? + CSettings::Get().GetBool("epg.hidenoinfoavailable") ? "" : g_localizeStrings.Get(19055); // no information available case VIDEOPLAYER_NEXT_GENRE: epgTag = tag->GetEPGNext(); @@ -4342,14 +3946,6 @@ } } } - else if (m_currentFile->HasPVRRecordingInfoTag()) - { - switch (item) - { - case VIDEOPLAYER_PLOT: - return m_currentFile->GetPVRRecordingInfoTag()->m_strPlot; - } - } else if (m_currentFile->HasVideoInfoTag()) { switch (item) @@ -4390,13 +3986,6 @@ return strRatingAndVotes; } break; - case VIDEOPLAYER_USER_RATING: - { - std::string strUserRating; - if (m_currentFile->GetVideoInfoTag()->m_iUserRating > 0) - strUserRating = StringUtils::Format("%i", m_currentFile->GetVideoInfoTag()->m_iUserRating); - return strUserRating; - } case VIDEOPLAYER_VOTES: return m_currentFile->GetVideoInfoTag()->m_strVotes; case VIDEOPLAYER_YEAR: @@ -4487,22 +4076,6 @@ } } } - else if (g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_VIDEO) - { - switch (item) - { - case VIDEOPLAYER_PLAYLISTLEN: - return GetPlaylistLabel(PLAYLIST_LENGTH); - case VIDEOPLAYER_PLAYLISTPOS: - return GetPlaylistLabel(PLAYLIST_POSITION); - default: - break; - } - } - - if (item == VIDEOPLAYER_TITLE) - return GetLabel(PLAYER_TITLE); - return ""; } @@ -4530,7 +4103,7 @@ { if (format == TIME_FORMAT_GUESS && GetTotalPlayTime() >= 3600) format = TIME_FORMAT_HH_MM_SS; - return StringUtils::SecondsToTimeString(g_application.GetTime() + CSeekHandler::GetInstance().GetSeekSize(), format); + return StringUtils::SecondsToTimeString(g_application.GetTime() + CSeekHandler::Get().GetSeekSize(), format); } int CGUIInfoManager::GetTotalPlayTime() const @@ -4547,12 +4120,12 @@ float CGUIInfoManager::GetSeekPercent() const { - if (GetTotalPlayTime() == 0) + if (g_infoManager.GetTotalPlayTime() == 0) return 0.0f; float percentPlayTime = static_cast(GetPlayTime()) / GetTotalPlayTime() * 0.1f; float percentPerSecond = 100.0f / static_cast(GetTotalPlayTime()); - float percent = percentPlayTime + percentPerSecond * CSeekHandler::GetInstance().GetSeekSize(); + float percent = percentPlayTime + percentPerSecond * CSeekHandler::Get().GetSeekSize(); if (percent > 100.0f) percent = 100.0f; @@ -4588,8 +4161,6 @@ else SetCurrentMovie(item); - if (item.HasPVRRadioRDSInfoTag()) - m_currentFile->SetPVRRadioRDSInfoTag(item.GetPVRRadioRDSInfoTag()); if (item.HasEPGInfoTag()) m_currentFile->SetEPGInfoTag(item.GetEPGInfoTag()); else if (item.HasPVRChannelInfoTag()) @@ -4704,7 +4275,7 @@ m_currentMovieThumb = item.GetArt("thumb"); } -std::string CGUIInfoManager::GetSystemHeatInfo(int info) +string CGUIInfoManager::GetSystemHeatInfo(int info) { if (CTimeUtils::GetFrameTime() - m_lastSysHeatInfoTime >= SYSHEATUPDATEINTERVAL) { // update our variables @@ -4770,6 +4341,30 @@ return CTemperature(); } +// Version string MUST NOT contain spaces. It is used +// in the HTTP request user agent. +std::string CGUIInfoManager::GetVersionShort(void) +{ + if (strlen(CCompileInfo::GetSuffix()) == 0) + return StringUtils::Format("%d.%d", CCompileInfo::GetMajor(), CCompileInfo::GetMinor()); + else + return StringUtils::Format("%d.%d-%s", CCompileInfo::GetMajor(), CCompileInfo::GetMinor(), CCompileInfo::GetSuffix()); +} + +std::string CGUIInfoManager::GetVersion() +{ + return GetVersionShort() + " Git:" + CCompileInfo::GetSCMID(); +} + +std::string CGUIInfoManager::GetBuild() +{ + return StringUtils::Format("%s", __DATE__); +} + +std::string CGUIInfoManager::GetAppName() +{ + return CCompileInfo::GetAppName(); +} void CGUIInfoManager::SetDisplayAfterSeek(unsigned int timeOut, int seekOffset) { @@ -4801,14 +4396,14 @@ will remove those bools that are no longer dependencies of other bools in the vector. */ - std::vector::iterator i = std::remove_if(m_bools.begin(), m_bools.end(), std::mem_fun_ref(&InfoPtr::unique)); + vector::iterator i = remove_if(m_bools.begin(), m_bools.end(), std::mem_fun_ref(&InfoPtr::unique)); while (i != m_bools.end()) { m_bools.erase(i, m_bools.end()); - i = std::remove_if(m_bools.begin(), m_bools.end(), std::mem_fun_ref(&InfoPtr::unique)); + i = remove_if(m_bools.begin(), m_bools.end(), std::mem_fun_ref(&InfoPtr::unique)); } // log which ones are used - they should all be gone by now - for (std::vector::const_iterator i = m_bools.begin(); i != m_bools.end(); ++i) + for (vector::const_iterator i = m_bools.begin(); i != m_bools.end(); ++i) CLog::Log(LOGDEBUG, "Infobool '%s' still used by %u instances", (*i)->GetExpression().c_str(), (unsigned int) i->use_count()); } @@ -4880,9 +4475,9 @@ // check to see if we have this parameter already if (caseSensitive) { - std::vector::const_iterator i = std::find(m_stringParameters.begin(), m_stringParameters.end(), parameter); + vector::const_iterator i = find(m_stringParameters.begin(), m_stringParameters.end(), parameter); if (i != m_stringParameters.end()) - return (int)std::distance::const_iterator>(m_stringParameters.begin(), i); + return (int)distance::const_iterator>(m_stringParameters.begin(), i); } else { @@ -4983,7 +4578,7 @@ CEpgInfoTagPtr epgTag(item->GetPVRChannelInfoTag()->GetEPGNow()); return epgTag ? epgTag->Title() : - CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? + CSettings::Get().GetBool("epg.hidenoinfoavailable") ? "" : g_localizeStrings.Get(19055); // no information available } if (item->HasPVRRecordingInfoTag()) @@ -4997,18 +4592,6 @@ if (item->HasMusicInfoTag()) return item->GetMusicInfoTag()->GetTitle(); break; - case LISTITEM_EPG_EVENT_TITLE: - if (item->HasEPGInfoTag()) - return item->GetEPGInfoTag()->Title(); - if (item->HasPVRTimerInfoTag() && item->GetPVRTimerInfoTag()->HasEpgInfoTag()) - return item->GetPVRTimerInfoTag()->GetEpgInfoTag()->Title(); - if (item->HasPVRChannelInfoTag()) - { - CEpgInfoTagPtr epgTag(item->GetPVRChannelInfoTag()->GetEPGNow()); - if (epgTag) - return epgTag->Title(); - } - break; case LISTITEM_ORIGINALTITLE: if (item->HasPVRChannelInfoTag()) { @@ -5064,11 +4647,11 @@ if (item->HasVideoInfoTag()) return StringUtils::Join(item->GetVideoInfoTag()->m_artist, g_advancedSettings.m_videoItemSeparator); if (item->HasMusicInfoTag()) - return item->GetMusicInfoTag()->GetArtistString(); + return StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator); break; case LISTITEM_ALBUM_ARTIST: if (item->HasMusicInfoTag()) - return item->GetMusicInfoTag()->GetAlbumArtistString(); + return StringUtils::Join(item->GetMusicInfoTag()->GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator); break; case LISTITEM_DIRECTOR: if (item->HasPVRChannelInfoTag()) @@ -5105,8 +4688,6 @@ if (tag->Year() > 0) year = StringUtils::Format("%i", tag->Year()); } - if (item->HasPVRRecordingInfoTag() && item->GetPVRRecordingInfoTag()->m_iYear > 0) - year = StringUtils::Format("%i", item->GetPVRRecordingInfoTag()->m_iYear); return year; } case LISTITEM_PREMIERED: @@ -5184,10 +4765,6 @@ if (item->m_dateTime.IsValid()) return item->m_dateTime.GetAsLocalizedDate(); break; - case LISTITEM_DATETIME: - if (item->m_dateTime.IsValid()) - return item->m_dateTime.GetAsLocalizedDateTime(); - break; case LISTITEM_SIZE: if (!item->m_bIsFolder || item->m_dwSize) return StringUtils::SizeToString(item->m_dwSize); @@ -5197,9 +4774,9 @@ std::string rating; if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_fRating > 0.f) // movie rating rating = StringUtils::Format("%.1f", item->GetVideoInfoTag()->m_fRating); - else if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetUserrating() > '0') + else if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetRating() > '0') { // song rating. Images will probably be better than numbers for this in the long run - rating.assign(1, item->GetMusicInfoTag()->GetUserrating()); + rating.assign(1, item->GetMusicInfoTag()->GetRating()); } return rating; } @@ -5220,23 +4797,13 @@ } } break; - case LISTITEM_USER_RATING: - { - std::string strUserRating; - if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_iUserRating > 0) - strUserRating = StringUtils::Format("%i", item->GetVideoInfoTag()->m_iUserRating); - else if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetUserrating() > '0') - strUserRating.assign(1, item->GetMusicInfoTag()->GetUserrating()); - return strUserRating; - } - break; case LISTITEM_VOTES: if (item->HasVideoInfoTag()) return item->GetVideoInfoTag()->m_strVotes; break; case LISTITEM_PROGRAM_COUNT: { - return StringUtils::Format("%i", item->m_iprogramCount); + return StringUtils::Format("%i", item->m_iprogramCount);; } case LISTITEM_DURATION: { @@ -5288,8 +4855,8 @@ return item->GetPVRTimerInfoTag()->GetEpgInfoTag()->Plot(); if (item->HasVideoInfoTag()) { - if (item->GetVideoInfoTag()->m_type != MediaTypeTvShow && item->GetVideoInfoTag()->m_type != MediaTypeVideoCollection) - if (item->GetVideoInfoTag()->m_playCount == 0 && !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_SHOWUNWATCHEDPLOTS)) + if (item->GetVideoInfoTag()->m_type != MediaTypeTvShow) + if (item->GetVideoInfoTag()->m_playCount == 0 && !CSettings::Get().GetBool("videolibrary.showunwatchedplots")) return g_localizeStrings.Get(20370); return item->GetVideoInfoTag()->m_strPlot; @@ -5339,11 +4906,6 @@ if (tag->EpisodeNumber() > 0) iEpisode = tag->EpisodeNumber(); } - else if (item->HasPVRRecordingInfoTag() && item->GetPVRRecordingInfoTag()->m_iEpisode > 0) - { - iSeason = item->GetPVRRecordingInfoTag()->m_iSeason; - iEpisode = item->GetPVRRecordingInfoTag()->m_iEpisode; - } else if (item->HasVideoInfoTag()) { iSeason = item->GetVideoInfoTag()->m_iSeason; @@ -5375,9 +4937,6 @@ item->GetPVRTimerInfoTag()->HasEpgInfoTag() && item->GetPVRTimerInfoTag()->GetEpgInfoTag()->SeriesNumber() > 0) iSeason = item->GetPVRTimerInfoTag()->GetEpgInfoTag()->SeriesNumber(); - else if (item->HasPVRRecordingInfoTag() && - item->GetPVRRecordingInfoTag()->m_iSeason > 0) - iSeason = item->GetPVRRecordingInfoTag()->m_iSeason; else if (item->HasVideoInfoTag()) iSeason = item->GetVideoInfoTag()->m_iSeason; @@ -5528,7 +5087,7 @@ { std::string strResult; int iChannels = item->GetVideoInfoTag()->m_streamDetails.GetAudioChannels(); - if (iChannels > 0) + if (iChannels > -1) strResult = StringUtils::Format("%i", iChannels); return strResult; } @@ -5734,7 +5293,7 @@ int val; if (GetItemInt(val, item, info)) { - return StringUtils::Format("%d", val); + return StringUtils::Format("%d", val);; } break; } @@ -5749,18 +5308,18 @@ case LISTITEM_DBID: if (item->HasVideoInfoTag()) { - return StringUtils::Format("%i", item->GetVideoInfoTag()->m_iDbId); + return StringUtils::Format("%i", item->GetVideoInfoTag()->m_iDbId);; } if (item->HasMusicInfoTag()) { - return StringUtils::Format("%i", item->GetMusicInfoTag()->GetDatabaseId()); + return StringUtils::Format("%i", item->GetMusicInfoTag()->GetDatabaseId());; } break; case LISTITEM_STEREOSCOPIC_MODE: { std::string stereoMode = item->GetProperty("stereomode").asString(); if (stereoMode.empty() && item->HasVideoInfoTag()) - stereoMode = CStereoscopicsManager::GetInstance().NormalizeStereoMode(item->GetVideoInfoTag()->m_streamDetails.GetStereoMode()); + stereoMode = CStereoscopicsManager::Get().NormalizeStereoMode(item->GetVideoInfoTag()->m_streamDetails.GetStereoMode()); return stereoMode; } case LISTITEM_IMDBNUMBER: @@ -5787,18 +5346,8 @@ } if (item->HasEPGInfoTag()) return item->GetEPGInfoTag()->EpisodeName(); - if (item->HasPVRTimerInfoTag() && item->GetPVRTimerInfoTag()->HasEpgInfoTag()) - return item->GetPVRTimerInfoTag()->GetEpgInfoTag()->EpisodeName(); - if (item->HasPVRRecordingInfoTag()) - return item->GetPVRRecordingInfoTag()->EpisodeName(); break; } - case LISTITEM_TIMERTYPE: - { - if (item->HasPVRTimerInfoTag()) - return item->GetPVRTimerInfoTag()->GetTypeAsString(); - } - break; } return ""; } @@ -5814,7 +5363,7 @@ { if (item->HasMusicInfoTag()) { - return StringUtils::Format("songrating%c.png", item->GetMusicInfoTag()->GetUserrating()); + return StringUtils::Format("songrating%c.png", item->GetMusicInfoTag()->GetRating()); } } break; @@ -5827,7 +5376,7 @@ } else if (item->HasMusicInfoTag()) { // song rating. - rating = StringUtils::Format("rating%c.png", item->GetMusicInfoTag()->GetUserrating()); + rating = StringUtils::Format("rating%c.png", item->GetMusicInfoTag()->GetRating()); } return rating; } @@ -5895,9 +5444,9 @@ { CEpgInfoTagPtr epgTag = pItem->GetEPGInfoTag(); - // Check if the tag has a currently recording timer associated - if (epgTag->HasTimer()) - return epgTag->Timer()->IsRecording(); + // Check if the tag has a currently active recording associated + if (epgTag->HasRecording() && epgTag->IsActive()) + return true; // Search all timers for something that matches the tag CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(pItem); @@ -5922,15 +5471,6 @@ return timer->GetPVRTimerInfoTag()->IsActive(); } } - else if (condition == LISTITEM_HASTIMERSCHEDULE) - { - if (pItem->HasEPGInfoTag()) - { - CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(pItem); - if (timer && timer->HasPVRTimerInfoTag() && timer->GetPVRTimerInfoTag()->GetTimerScheduleId() != PVR_TIMER_NO_PARENT) - return timer->GetPVRTimerInfoTag()->IsActive(); - } - } else if (condition == LISTITEM_HASRECORDING) { return pItem->HasEPGInfoTag() && pItem->GetEPGInfoTag()->HasRecording(); @@ -5941,10 +5481,6 @@ { return (pItem->GetPVRChannelInfoTag()->GetEPGNow().get() != NULL); } - if (pItem->HasPVRTimerInfoTag() && pItem->GetPVRTimerInfoTag()->HasEpgInfoTag()) - { - return true; - } else { return pItem->HasEPGInfoTag(); @@ -5965,7 +5501,7 @@ { std::string stereoMode = pItem->GetProperty("stereomode").asString(); if (stereoMode.empty() && pItem->HasVideoInfoTag()) - stereoMode = CStereoscopicsManager::GetInstance().NormalizeStereoMode(pItem->GetVideoInfoTag()->m_streamDetails.GetStereoMode()); + stereoMode = CStereoscopicsManager::Get().NormalizeStereoMode(pItem->GetVideoInfoTag()->m_streamDetails.GetStereoMode()); if (!stereoMode.empty() && stereoMode != "mono") return true; } @@ -5985,7 +5521,7 @@ m_containerMoves.clear(); // mark our infobools as dirty CSingleLock lock(m_critInfo); - for (std::vector::iterator i = m_bools.begin(); i != m_bools.end(); ++i) + for (vector::iterator i = m_bools.begin(); i != m_bools.end(); ++i) (*i)->SetDirty(); } @@ -6086,15 +5622,6 @@ return NULL; } -const PVR::CPVRRadioRDSInfoTagPtr CGUIInfoManager::GetCurrentRadioRDSInfoTag() const -{ - if (m_currentFile->HasPVRRadioRDSInfoTag()) - return m_currentFile->GetPVRRadioRDSInfoTag(); - - PVR::CPVRRadioRDSInfoTagPtr empty; - return empty; -} - const CVideoInfoTag* CGUIInfoManager::GetCurrentMovieTag() const { if (m_currentFile->HasVideoInfoTag()) @@ -6284,7 +5811,7 @@ int CGUIInfoManager::TranslateSkinVariableString(const std::string& name, int context) { - for (std::vector::const_iterator it = m_skinVariableStrings.begin(); + for (vector::const_iterator it = m_skinVariableStrings.begin(); it != m_skinVariableStrings.end(); ++it) { if (StringUtils::EqualsNoCase(it->GetName(), name) && it->GetContext() == context) @@ -6314,14 +5841,6 @@ return false; } -bool CGUIInfoManager::IsPlayerChannelPreviewActive() const -{ - return m_playerShowInfo && - g_application.m_pPlayer->IsPlaying() && - m_currentFile->HasPVRChannelInfoTag() && - !g_PVRManager.IsPlayingChannel(m_currentFile->GetPVRChannelInfoTag()); -} - CEpgInfoTagPtr CGUIInfoManager::GetEpgInfoTag() const { CEpgInfoTagPtr currentTag; @@ -6333,54 +5852,3 @@ } return currentTag; } - -int CGUIInfoManager::GetMessageMask() -{ - return TMSG_MASK_GUIINFOMANAGER; -} - -void CGUIInfoManager::OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg) -{ - switch (pMsg->dwMessage) - { - case TMSG_GUI_INFOLABEL: - { - if (pMsg->lpVoid) - { - auto infoLabels = static_cast*>(pMsg->lpVoid); - for (auto& param : pMsg->params) - infoLabels->push_back(GetLabel(TranslateString(param))); - } - } - break; - - case TMSG_GUI_INFOBOOL: - { - if (pMsg->lpVoid) - { - auto infoLabels = static_cast*>(pMsg->lpVoid); - for (auto& param : pMsg->params) - infoLabels->push_back(EvaluateBool(param)); - } - } - break; - - case TMSG_UPDATE_CURRENT_ITEM: - { - auto item = static_cast(pMsg->lpVoid); - if (!item) - return; - if (pMsg->param1 == 1 && item->HasMusicInfoTag()) // only grab music tag - SetCurrentSongTag(*item->GetMusicInfoTag()); - else if (pMsg->param1 == 2 && item->HasVideoInfoTag()) // only grab video tag - SetCurrentVideoTag(*item->GetVideoInfoTag()); - else - SetCurrentItem(*item); - delete item; - } - break; - - default: - break; - } -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/GUIInfoManager.h kodi-15.2~git20151019.1039-final/xbmc/GUIInfoManager.h --- kodi-16.1~git20160425.1001-final/xbmc/GUIInfoManager.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/GUIInfoManager.h 2015-10-19 08:39:15.000000000 +0000 @@ -28,7 +28,6 @@ #include "threads/CriticalSection.h" #include "guilib/IMsgTargetCallback.h" -#include "messaging/IMessageTarget.h" #include "inttypes.h" #include "XBDateTime.h" #include "utils/Observer.h" @@ -44,11 +43,6 @@ { class CMusicInfoTag; } -namespace PVR -{ - class CPVRRadioRDSInfoTag; - typedef std::shared_ptr CPVRRadioRDSInfoTagPtr; -} class CVideoInfoTag; class CFileItem; class CGUIListItem; @@ -58,6 +52,635 @@ class InfoSingle; } +// conditions for window retrieval +#define WINDOW_CONDITION_HAS_LIST_ITEMS 1 +#define WINDOW_CONDITION_IS_MEDIA_WINDOW 2 + +#define PLAYER_HAS_MEDIA 1 +#define PLAYER_HAS_AUDIO 2 +#define PLAYER_HAS_VIDEO 3 +#define PLAYER_PLAYING 4 +#define PLAYER_PAUSED 5 +#define PLAYER_REWINDING 6 +#define PLAYER_REWINDING_2x 7 +#define PLAYER_REWINDING_4x 8 +#define PLAYER_REWINDING_8x 9 +#define PLAYER_REWINDING_16x 10 +#define PLAYER_REWINDING_32x 11 +#define PLAYER_FORWARDING 12 +#define PLAYER_FORWARDING_2x 13 +#define PLAYER_FORWARDING_4x 14 +#define PLAYER_FORWARDING_8x 15 +#define PLAYER_FORWARDING_16x 16 +#define PLAYER_FORWARDING_32x 17 +#define PLAYER_CAN_RECORD 18 +#define PLAYER_RECORDING 19 +#define PLAYER_CACHING 20 +#define PLAYER_DISPLAY_AFTER_SEEK 21 +#define PLAYER_PROGRESS 22 +#define PLAYER_SEEKBAR 23 +#define PLAYER_SEEKTIME 24 +#define PLAYER_SEEKING 25 +#define PLAYER_SHOWTIME 26 +#define PLAYER_TIME 27 +#define PLAYER_TIME_REMAINING 28 +#define PLAYER_DURATION 29 +#define PLAYER_SHOWCODEC 30 +#define PLAYER_SHOWINFO 31 +#define PLAYER_VOLUME 32 +#define PLAYER_MUTED 33 +#define PLAYER_HASDURATION 34 +#define PLAYER_CHAPTER 35 +#define PLAYER_CHAPTERCOUNT 36 +#define PLAYER_TIME_SPEED 37 +#define PLAYER_FINISH_TIME 38 +#define PLAYER_CACHELEVEL 39 +#define PLAYER_STAR_RATING 40 +#define PLAYER_CHAPTERNAME 41 +#define PLAYER_SUBTITLE_DELAY 42 +#define PLAYER_AUDIO_DELAY 43 +#define PLAYER_PASSTHROUGH 44 +#define PLAYER_PATH 45 +#define PLAYER_FILEPATH 46 +#define PLAYER_SEEKOFFSET 47 +#define PLAYER_PROGRESS_CACHE 48 +#define PLAYER_ITEM_ART 49 +#define PLAYER_CAN_PAUSE 50 +#define PLAYER_CAN_SEEK 51 +#define PLAYER_START_TIME 52 +#define PLAYER_TITLE 53 +#define PLAYER_ISINTERNETSTREAM 54 +#define PLAYER_FILENAME 55 +#define PLAYER_SEEKSTEPSIZE 56 + +#define WEATHER_CONDITIONS 100 +#define WEATHER_TEMPERATURE 101 +#define WEATHER_LOCATION 102 +#define WEATHER_IS_FETCHED 103 +#define WEATHER_FANART_CODE 104 +#define WEATHER_PLUGIN 105 + +#define SYSTEM_TEMPERATURE_UNITS 106 +#define SYSTEM_PROGRESS_BAR 107 +#define SYSTEM_LANGUAGE 108 +#define SYSTEM_TIME 110 +#define SYSTEM_DATE 111 +#define SYSTEM_CPU_TEMPERATURE 112 +#define SYSTEM_GPU_TEMPERATURE 113 +#define SYSTEM_FAN_SPEED 114 +#define SYSTEM_FREE_SPACE_C 115 +// #define SYSTEM_FREE_SPACE_D 116 //116 is reserved for space on D +#define SYSTEM_FREE_SPACE_E 117 +#define SYSTEM_FREE_SPACE_F 118 +#define SYSTEM_FREE_SPACE_G 119 +#define SYSTEM_BUILD_VERSION 120 +#define SYSTEM_BUILD_DATE 121 +#define SYSTEM_ETHERNET_LINK_ACTIVE 122 +#define SYSTEM_FPS 123 +#define SYSTEM_ALWAYS_TRUE 125 // useful for true, to fade in a control +#define SYSTEM_ALWAYS_FALSE 126 // used for false, to fade out a control (ie not particularly useful!) +#define SYSTEM_MEDIA_DVD 127 +#define SYSTEM_DVDREADY 128 +#define SYSTEM_HAS_ALARM 129 +#define SYSTEM_SCREEN_MODE 132 +#define SYSTEM_SCREEN_WIDTH 133 +#define SYSTEM_SCREEN_HEIGHT 134 +#define SYSTEM_CURRENT_WINDOW 135 +#define SYSTEM_CURRENT_CONTROL 136 +#define SYSTEM_DVD_LABEL 138 +#define SYSTEM_HASLOCKS 140 +#define SYSTEM_ISMASTER 141 +#define SYSTEM_TRAYOPEN 142 +#define SYSTEM_SHOW_EXIT_BUTTON 143 +#define SYSTEM_ALARM_POS 144 +#define SYSTEM_LOGGEDON 145 +#define SYSTEM_PROFILENAME 146 +#define SYSTEM_PROFILETHUMB 147 +#define SYSTEM_HAS_LOGINSCREEN 148 +#define SYSTEM_HDD_SMART 150 +#define SYSTEM_HDD_TEMPERATURE 151 +#define SYSTEM_HDD_MODEL 152 +#define SYSTEM_HDD_SERIAL 153 +#define SYSTEM_HDD_FIRMWARE 154 +#define SYSTEM_HDD_PASSWORD 156 +#define SYSTEM_HDD_LOCKSTATE 157 +#define SYSTEM_HDD_LOCKKEY 158 +#define SYSTEM_INTERNET_STATE 159 +#define SYSTEM_ALARM_LESS_OR_EQUAL 180 +#define SYSTEM_PROFILECOUNT 181 +#define SYSTEM_ISFULLSCREEN 182 +#define SYSTEM_ISSTANDALONE 183 +#define SYSTEM_ISINHIBIT 184 +#define SYSTEM_HAS_SHUTDOWN 185 +#define SYSTEM_HAS_PVR 186 +#define SYSTEM_STARTUP_WINDOW 187 +#define SYSTEM_STEREOSCOPIC_MODE 188 +#define SYSTEM_BUILD_VERSION_SHORT 189 + +#define NETWORK_IP_ADDRESS 190 +#define NETWORK_MAC_ADDRESS 191 +#define NETWORK_IS_DHCP 192 +#define NETWORK_LINK_STATE 193 +#define NETWORK_SUBNET_MASK 194 +#define NETWORK_GATEWAY_ADDRESS 195 +#define NETWORK_DNS1_ADDRESS 196 +#define NETWORK_DNS2_ADDRESS 197 +#define NETWORK_DHCP_ADDRESS 198 + +#define MUSICPLAYER_TITLE 200 +#define MUSICPLAYER_ALBUM 201 +#define MUSICPLAYER_ARTIST 202 +#define MUSICPLAYER_GENRE 203 +#define MUSICPLAYER_YEAR 204 +#define MUSICPLAYER_DURATION 205 +#define MUSICPLAYER_TRACK_NUMBER 208 +#define MUSICPLAYER_COVER 210 +#define MUSICPLAYER_BITRATE 211 +#define MUSICPLAYER_PLAYLISTLEN 212 +#define MUSICPLAYER_PLAYLISTPOS 213 +#define MUSICPLAYER_CHANNELS 214 +#define MUSICPLAYER_BITSPERSAMPLE 215 +#define MUSICPLAYER_SAMPLERATE 216 +#define MUSICPLAYER_CODEC 217 +#define MUSICPLAYER_DISC_NUMBER 218 +#define MUSICPLAYER_RATING 219 +#define MUSICPLAYER_COMMENT 220 +#define MUSICPLAYER_LYRICS 221 +#define MUSICPLAYER_HASPREVIOUS 222 +#define MUSICPLAYER_HASNEXT 223 +#define MUSICPLAYER_EXISTS 224 +#define MUSICPLAYER_PLAYLISTPLAYING 225 +#define MUSICPLAYER_ALBUM_ARTIST 226 +#define MUSICPLAYER_PLAYCOUNT 227 +#define MUSICPLAYER_LASTPLAYED 228 +#define MUSICPLAYER_CHANNEL_NAME 229 +#define MUSICPLAYER_CHANNEL_NUMBER 230 +#define MUSICPLAYER_CHANNEL_GROUP 231 +#define MUSICPLAYER_SUB_CHANNEL_NUMBER 232 +#define MUSICPLAYER_CHANNEL_NUMBER_LBL 233 +#define MUSICPLAYER_CONTENT 234 + +#define VIDEOPLAYER_TITLE 250 +#define VIDEOPLAYER_GENRE 251 +#define VIDEOPLAYER_DIRECTOR 252 +#define VIDEOPLAYER_YEAR 253 +#define VIDEOPLAYER_HASSUBTITLES 254 +#define VIDEOPLAYER_SUBTITLESENABLED 255 +#define VIDEOPLAYER_COVER 258 +#define VIDEOPLAYER_USING_OVERLAYS 259 +#define VIDEOPLAYER_ISFULLSCREEN 260 +#define VIDEOPLAYER_HASMENU 261 +#define VIDEOPLAYER_PLAYLISTLEN 262 +#define VIDEOPLAYER_PLAYLISTPOS 263 +#define VIDEOPLAYER_EVENT 264 +#define VIDEOPLAYER_ORIGINALTITLE 265 +#define VIDEOPLAYER_PLOT 266 +#define VIDEOPLAYER_PLOT_OUTLINE 267 +#define VIDEOPLAYER_EPISODE 268 +#define VIDEOPLAYER_SEASON 269 +#define VIDEOPLAYER_RATING 270 +#define VIDEOPLAYER_TVSHOW 271 +#define VIDEOPLAYER_PREMIERED 272 +#define VIDEOPLAYER_CONTENT 273 +#define VIDEOPLAYER_STUDIO 274 +#define VIDEOPLAYER_MPAA 275 +#define VIDEOPLAYER_CAST 276 +#define VIDEOPLAYER_CAST_AND_ROLE 277 +#define VIDEOPLAYER_ARTIST 278 +#define VIDEOPLAYER_ALBUM 279 +#define VIDEOPLAYER_WRITER 280 +#define VIDEOPLAYER_TAGLINE 281 +#define VIDEOPLAYER_HAS_INFO 282 +#define VIDEOPLAYER_TOP250 283 +#define VIDEOPLAYER_RATING_AND_VOTES 284 +#define VIDEOPLAYER_TRAILER 285 +#define VIDEOPLAYER_VIDEO_CODEC 286 +#define VIDEOPLAYER_VIDEO_RESOLUTION 287 +#define VIDEOPLAYER_AUDIO_CODEC 288 +#define VIDEOPLAYER_AUDIO_CHANNELS 289 +#define VIDEOPLAYER_VIDEO_ASPECT 290 +#define VIDEOPLAYER_HASTELETEXT 291 +#define VIDEOPLAYER_COUNTRY 292 +#define VIDEOPLAYER_PLAYCOUNT 293 +#define VIDEOPLAYER_LASTPLAYED 294 + +#define VIDEOPLAYER_STARTTIME 295 +#define VIDEOPLAYER_ENDTIME 296 +#define VIDEOPLAYER_NEXT_TITLE 297 +#define VIDEOPLAYER_NEXT_GENRE 298 +#define VIDEOPLAYER_NEXT_PLOT 299 +#define VIDEOPLAYER_NEXT_PLOT_OUTLINE 300 +#define VIDEOPLAYER_NEXT_STARTTIME 301 +#define VIDEOPLAYER_NEXT_ENDTIME 302 +#define VIDEOPLAYER_NEXT_DURATION 303 +#define VIDEOPLAYER_CHANNEL_NAME 304 +#define VIDEOPLAYER_CHANNEL_NUMBER 305 +#define VIDEOPLAYER_CHANNEL_GROUP 306 +#define VIDEOPLAYER_PARENTAL_RATING 307 +#define VIDEOPLAYER_HAS_EPG 308 +#define VIDEOPLAYER_VOTES 309 +#define VIDEOPLAYER_IS_STEREOSCOPIC 310 +#define VIDEOPLAYER_STEREOSCOPIC_MODE 311 +#define VIDEOPLAYER_SUBTITLES_LANG 312 +#define VIDEOPLAYER_AUDIO_LANG 313 +#define VIDEOPLAYER_SUB_CHANNEL_NUMBER 314 +#define VIDEOPLAYER_CHANNEL_NUMBER_LBL 315 +#define VIDEOPLAYER_CAN_RESUME_LIVE_TV 316 +#define VIDEOPLAYER_IMDBNUMBER 317 +#define VIDEOPLAYER_EPISODENAME 318 + +#define CONTAINER_CAN_FILTER 342 +#define CONTAINER_CAN_FILTERADVANCED 343 +#define CONTAINER_FILTERED 344 + +#define CONTAINER_SCROLL_PREVIOUS 345 // NOTE: These 5 must be kept in this consecutive order +#define CONTAINER_MOVE_PREVIOUS 346 +#define CONTAINER_STATIC 347 +#define CONTAINER_MOVE_NEXT 348 +#define CONTAINER_SCROLL_NEXT 349 +#define CONTAINER_ISUPDATING 350 +#define CONTAINER_HASFILES 351 +#define CONTAINER_HASFOLDERS 352 +#define CONTAINER_STACKED 353 +#define CONTAINER_FOLDERNAME 354 +#define CONTAINER_SCROLLING 355 +#define CONTAINER_PLUGINNAME 356 +#define CONTAINER_PROPERTY 357 +#define CONTAINER_SORT_DIRECTION 358 +#define CONTAINER_NUM_ITEMS 359 +#define CONTAINER_FOLDERPATH 360 +#define CONTAINER_CONTENT 361 +#define CONTAINER_HAS_THUMB 362 +#define CONTAINER_SORT_METHOD 363 +#define CONTAINER_CURRENT_ITEM 364 +#define CONTAINER_ART 365 +#define CONTAINER_HAS_FOCUS 366 +#define CONTAINER_ROW 367 +#define CONTAINER_COLUMN 368 +#define CONTAINER_POSITION 369 +#define CONTAINER_VIEWMODE 370 +#define CONTAINER_HAS_NEXT 371 +#define CONTAINER_HAS_PREVIOUS 372 +#define CONTAINER_SUBITEM 373 +#define CONTAINER_NUM_PAGES 374 +#define CONTAINER_CURRENT_PAGE 375 +#define CONTAINER_SHOWPLOT 376 +#define CONTAINER_TOTALTIME 377 + +#define MUSICPM_ENABLED 381 +#define MUSICPM_SONGSPLAYED 382 +#define MUSICPM_MATCHINGSONGS 383 +#define MUSICPM_MATCHINGSONGSPICKED 384 +#define MUSICPM_MATCHINGSONGSLEFT 385 +#define MUSICPM_RELAXEDSONGSPICKED 386 +#define MUSICPM_RANDOMSONGSPICKED 387 + +#define PLAYLIST_LENGTH 390 +#define PLAYLIST_POSITION 391 +#define PLAYLIST_RANDOM 392 +#define PLAYLIST_REPEAT 393 +#define PLAYLIST_ISRANDOM 394 +#define PLAYLIST_ISREPEAT 395 +#define PLAYLIST_ISREPEATONE 396 + +#define VISUALISATION_LOCKED 400 +#define VISUALISATION_PRESET 401 +#define VISUALISATION_NAME 402 +#define VISUALISATION_ENABLED 403 + +#define STRING_IS_EMPTY 410 +#define STRING_COMPARE 411 +#define STRING_STR 412 +#define INTEGER_GREATER_THAN 413 +#define STRING_STR_LEFT 414 +#define STRING_STR_RIGHT 415 + +#define SKIN_BOOL 600 +#define SKIN_STRING 601 +#define SKIN_HAS_MUSIC_OVERLAY 602 +#define SKIN_HAS_VIDEO_OVERLAY 603 +#define SKIN_THEME 604 +#define SKIN_COLOUR_THEME 605 +#define SKIN_HAS_THEME 606 +#define SKIN_ASPECT_RATIO 607 + +#define SYSTEM_TOTAL_MEMORY 644 +#define SYSTEM_CPU_USAGE 645 +#define SYSTEM_USED_MEMORY_PERCENT 646 +#define SYSTEM_USED_MEMORY 647 +#define SYSTEM_FREE_MEMORY 648 +#define SYSTEM_FREE_MEMORY_PERCENT 649 +#define SYSTEM_UPTIME 654 +#define SYSTEM_TOTALUPTIME 655 +#define SYSTEM_CPUFREQUENCY 656 +#define SYSTEM_SCREEN_RESOLUTION 659 +#define SYSTEM_VIDEO_ENCODER_INFO 660 +#define SYSTEM_OS_VERSION_INFO 667 +#define SYSTEM_FREE_SPACE 679 +#define SYSTEM_USED_SPACE 680 +#define SYSTEM_TOTAL_SPACE 681 +#define SYSTEM_USED_SPACE_PERCENT 682 +#define SYSTEM_FREE_SPACE_PERCENT 683 +#define SYSTEM_DVD_TRAY_STATE 700 +#define SYSTEM_GET_BOOL 704 +#define SYSTEM_GET_CORE_USAGE 705 +#define SYSTEM_HAS_CORE_ID 706 +#define SYSTEM_RENDER_VENDOR 707 +#define SYSTEM_RENDER_RENDERER 708 +#define SYSTEM_RENDER_VERSION 709 +#define SYSTEM_SETTING 710 +#define SYSTEM_HAS_ADDON 711 +#define SYSTEM_ADDON_TITLE 712 +#define SYSTEM_ADDON_ICON 713 +#define SYSTEM_BATTERY_LEVEL 714 +#define SYSTEM_IDLE_TIME 715 +#define SYSTEM_FRIENDLY_NAME 716 +#define SYSTEM_SCREENSAVER_ACTIVE 717 +#define SYSTEM_ADDON_VERSION 718 +#define SYSTEM_DPMS_ACTIVE 719 + +#define LIBRARY_HAS_MUSIC 720 +#define LIBRARY_HAS_VIDEO 721 +#define LIBRARY_HAS_MOVIES 722 +#define LIBRARY_HAS_MOVIE_SETS 723 +#define LIBRARY_HAS_TVSHOWS 724 +#define LIBRARY_HAS_MUSICVIDEOS 725 +#define LIBRARY_HAS_SINGLES 726 +#define LIBRARY_HAS_COMPILATIONS 727 +#define LIBRARY_IS_SCANNING 728 +#define LIBRARY_IS_SCANNING_VIDEO 729 +#define LIBRARY_IS_SCANNING_MUSIC 730 + +#define SYSTEM_PLATFORM_LINUX 741 +#define SYSTEM_PLATFORM_WINDOWS 742 +#define SYSTEM_PLATFORM_DARWIN 743 +#define SYSTEM_PLATFORM_DARWIN_OSX 744 +#define SYSTEM_PLATFORM_DARWIN_IOS 745 +#define SYSTEM_PLATFORM_DARWIN_ATV2 746 +#define SYSTEM_PLATFORM_ANDROID 747 +#define SYSTEM_PLATFORM_LINUX_RASPBERRY_PI 748 + +#define SYSTEM_CAN_POWERDOWN 750 +#define SYSTEM_CAN_SUSPEND 751 +#define SYSTEM_CAN_HIBERNATE 752 +#define SYSTEM_CAN_REBOOT 753 + +#define SLIDESHOW_ISPAUSED 800 +#define SLIDESHOW_ISRANDOM 801 +#define SLIDESHOW_ISACTIVE 802 +#define SLIDESHOW_ISVIDEO 803 + +#define SLIDE_INFO_START 900 +#define SLIDE_INFO_END 980 + +#define FANART_COLOR1 1000 +#define FANART_COLOR2 1001 +#define FANART_COLOR3 1002 +#define FANART_IMAGE 1003 + +#define SYSTEM_PROFILEAUTOLOGIN 1004 + +#define PVR_CONDITIONS_START 1100 +#define PVR_IS_RECORDING (PVR_CONDITIONS_START) +#define PVR_HAS_TIMER (PVR_CONDITIONS_START + 1) +#define PVR_HAS_NONRECORDING_TIMER (PVR_CONDITIONS_START + 2) +#define PVR_HAS_EPG (PVR_CONDITIONS_START + 3) +#define PVR_HAS_TXT (PVR_CONDITIONS_START + 4) +#define PVR_HAS_DIRECTOR (PVR_CONDITIONS_START + 5) +#define PVR_IS_PLAYING_TV (PVR_CONDITIONS_START + 6) +#define PVR_IS_PLAYING_RADIO (PVR_CONDITIONS_START + 7) +#define PVR_IS_PLAYING_RECORDING (PVR_CONDITIONS_START + 8) +#define PVR_ACTUAL_STREAM_ENCRYPTED (PVR_CONDITIONS_START + 9) +#define PVR_HAS_TV_CHANNELS (PVR_CONDITIONS_START + 10) +#define PVR_HAS_RADIO_CHANNELS (PVR_CONDITIONS_START + 11) +#define PVR_CONDITIONS_END PVR_HAS_RADIO_CHANNELS + +#define PVR_STRINGS_START 1200 +#define PVR_NEXT_RECORDING_CHANNEL (PVR_STRINGS_START) +#define PVR_NEXT_RECORDING_CHAN_ICO (PVR_STRINGS_START + 1) +#define PVR_NEXT_RECORDING_DATETIME (PVR_STRINGS_START + 2) +#define PVR_NEXT_RECORDING_TITLE (PVR_STRINGS_START + 3) +#define PVR_NOW_RECORDING_CHANNEL (PVR_STRINGS_START + 4) +#define PVR_NOW_RECORDING_CHAN_ICO (PVR_STRINGS_START + 5) +#define PVR_NOW_RECORDING_DATETIME (PVR_STRINGS_START + 6) +#define PVR_NOW_RECORDING_TITLE (PVR_STRINGS_START + 7) +#define PVR_BACKEND_NAME (PVR_STRINGS_START + 8) +#define PVR_BACKEND_VERSION (PVR_STRINGS_START + 9) +#define PVR_BACKEND_HOST (PVR_STRINGS_START + 10) +#define PVR_BACKEND_DISKSPACE (PVR_STRINGS_START + 11) +#define PVR_BACKEND_CHANNELS (PVR_STRINGS_START + 12) +#define PVR_BACKEND_TIMERS (PVR_STRINGS_START + 13) +#define PVR_BACKEND_RECORDINGS (PVR_STRINGS_START + 14) +#define PVR_BACKEND_DELETED_RECORDINGS (PVR_STRINGS_START + 15) +#define PVR_BACKEND_NUMBER (PVR_STRINGS_START + 16) +#define PVR_TOTAL_DISKSPACE (PVR_STRINGS_START + 17) +#define PVR_NEXT_TIMER (PVR_STRINGS_START + 18) +#define PVR_PLAYING_DURATION (PVR_STRINGS_START + 19) +#define PVR_PLAYING_TIME (PVR_STRINGS_START + 20) +#define PVR_PLAYING_PROGRESS (PVR_STRINGS_START + 21) +#define PVR_ACTUAL_STREAM_CLIENT (PVR_STRINGS_START + 22) +#define PVR_ACTUAL_STREAM_DEVICE (PVR_STRINGS_START + 23) +#define PVR_ACTUAL_STREAM_STATUS (PVR_STRINGS_START + 24) +#define PVR_ACTUAL_STREAM_SIG (PVR_STRINGS_START + 25) +#define PVR_ACTUAL_STREAM_SNR (PVR_STRINGS_START + 26) +#define PVR_ACTUAL_STREAM_SIG_PROGR (PVR_STRINGS_START + 27) +#define PVR_ACTUAL_STREAM_SNR_PROGR (PVR_STRINGS_START + 28) +#define PVR_ACTUAL_STREAM_BER (PVR_STRINGS_START + 29) +#define PVR_ACTUAL_STREAM_UNC (PVR_STRINGS_START + 30) +#define PVR_ACTUAL_STREAM_VIDEO_BR (PVR_STRINGS_START + 31) +#define PVR_ACTUAL_STREAM_AUDIO_BR (PVR_STRINGS_START + 32) +#define PVR_ACTUAL_STREAM_DOLBY_BR (PVR_STRINGS_START + 33) +#define PVR_ACTUAL_STREAM_CRYPTION (PVR_STRINGS_START + 34) +#define PVR_ACTUAL_STREAM_SERVICE (PVR_STRINGS_START + 35) +#define PVR_ACTUAL_STREAM_MUX (PVR_STRINGS_START + 36) +#define PVR_ACTUAL_STREAM_PROVIDER (PVR_STRINGS_START + 37) +#define PVR_BACKEND_DISKSPACE_PROGR (PVR_STRINGS_START + 38) +#define PVR_STRINGS_END PVR_ACTUAL_STREAM_PROVIDER + +#define WINDOW_PROPERTY 9993 +#define WINDOW_IS_TOPMOST 9994 +#define WINDOW_IS_VISIBLE 9995 +#define WINDOW_NEXT 9996 +#define WINDOW_PREVIOUS 9997 +#define WINDOW_IS_MEDIA 9998 +#define WINDOW_IS_ACTIVE 9999 + +#define CONTROL_GET_LABEL 29996 +#define CONTROL_IS_ENABLED 29997 +#define CONTROL_IS_VISIBLE 29998 +#define CONTROL_GROUP_HAS_FOCUS 29999 +#define CONTROL_HAS_FOCUS 30000 + +#define LISTITEM_START 35000 +#define LISTITEM_THUMB (LISTITEM_START) +#define LISTITEM_LABEL (LISTITEM_START + 1) +#define LISTITEM_TITLE (LISTITEM_START + 2) +#define LISTITEM_TRACKNUMBER (LISTITEM_START + 3) +#define LISTITEM_ARTIST (LISTITEM_START + 4) +#define LISTITEM_ALBUM (LISTITEM_START + 5) +#define LISTITEM_YEAR (LISTITEM_START + 6) +#define LISTITEM_GENRE (LISTITEM_START + 7) +#define LISTITEM_ICON (LISTITEM_START + 8) +#define LISTITEM_DIRECTOR (LISTITEM_START + 9) +#define LISTITEM_OVERLAY (LISTITEM_START + 10) +#define LISTITEM_LABEL2 (LISTITEM_START + 11) +#define LISTITEM_FILENAME (LISTITEM_START + 12) +#define LISTITEM_DATE (LISTITEM_START + 13) +#define LISTITEM_SIZE (LISTITEM_START + 14) +#define LISTITEM_RATING (LISTITEM_START + 15) +#define LISTITEM_PROGRAM_COUNT (LISTITEM_START + 16) +#define LISTITEM_DURATION (LISTITEM_START + 17) +#define LISTITEM_ISPLAYING (LISTITEM_START + 18) +#define LISTITEM_ISSELECTED (LISTITEM_START + 19) +#define LISTITEM_PLOT (LISTITEM_START + 20) +#define LISTITEM_PLOT_OUTLINE (LISTITEM_START + 21) +#define LISTITEM_EPISODE (LISTITEM_START + 22) +#define LISTITEM_SEASON (LISTITEM_START + 23) +#define LISTITEM_TVSHOW (LISTITEM_START + 24) +#define LISTITEM_PREMIERED (LISTITEM_START + 25) +#define LISTITEM_COMMENT (LISTITEM_START + 26) +#define LISTITEM_ACTUAL_ICON (LISTITEM_START + 27) +#define LISTITEM_PATH (LISTITEM_START + 28) +#define LISTITEM_PICTURE_PATH (LISTITEM_START + 29) +// the ordering of LISTITEM_PICTURE_* is important as they're mapped to SLIDE_* items in GUIInfoManager.cpp +#define LISTITEM_PICTURE_START (LISTITEM_START + 30) +#define LISTITEM_PICTURE_RESOLUTION (LISTITEM_PICTURE_START) // => SLIDE_RESOLUTION +#define LISTITEM_PICTURE_LONGDATE (LISTITEM_START + 31) // => SLIDE_EXIF_LONG_DATE +#define LISTITEM_PICTURE_LONGDATETIME (LISTITEM_START + 32) // => SLIDE_EXIF_LONG_DATE_TIME +#define LISTITEM_PICTURE_DATE (LISTITEM_START + 33) // => SLIDE_EXIF_DATE +#define LISTITEM_PICTURE_DATETIME (LISTITEM_START + 34) // => SLIDE_EXIF_DATE_TIME +#define LISTITEM_PICTURE_COMMENT (LISTITEM_START + 35) // => SLIDE_COMMENT +#define LISTITEM_PICTURE_CAPTION (LISTITEM_START + 36) // => SLIDE_IPTC_CAPTION +#define LISTITEM_PICTURE_DESC (LISTITEM_START + 37) // => SLIDE_EXIF_DESCRIPTION +#define LISTITEM_PICTURE_KEYWORDS (LISTITEM_START + 38) // => SLIDE_IPTC_KEYWORDS +#define LISTITEM_PICTURE_CAM_MAKE (LISTITEM_START + 39) // => SLIDE_EXIF_CAMERA_MAKE +#define LISTITEM_PICTURE_CAM_MODEL (LISTITEM_START + 40) // => SLIDE_EXIF_CAMERA_MODEL +#define LISTITEM_PICTURE_APERTURE (LISTITEM_START + 41) // => SLIDE_EXIF_APERTURE +#define LISTITEM_PICTURE_FOCAL_LEN (LISTITEM_START + 42) // => SLIDE_EXIF_FOCAL_LENGTH +#define LISTITEM_PICTURE_FOCUS_DIST (LISTITEM_START + 43) // => SLIDE_EXIF_FOCUS_DIST +#define LISTITEM_PICTURE_EXP_MODE (LISTITEM_START + 44) // => SLIDE_EXIF_EXPOSURE_MODE +#define LISTITEM_PICTURE_EXP_TIME (LISTITEM_START + 45) // => SLIDE_EXIF_EXPOSURE_TIME +#define LISTITEM_PICTURE_ISO (LISTITEM_START + 46) // => SLIDE_EXIF_ISO_EQUIV +#define LISTITEM_PICTURE_AUTHOR (LISTITEM_START + 47) // => SLIDE_IPTC_AUTHOR +#define LISTITEM_PICTURE_BYLINE (LISTITEM_START + 48) // => SLIDE_IPTC_BYLINE +#define LISTITEM_PICTURE_BYLINE_TITLE (LISTITEM_START + 49) // => SLIDE_IPTC_BYLINE_TITLE +#define LISTITEM_PICTURE_CATEGORY (LISTITEM_START + 50) // => SLIDE_IPTC_CATEGORY +#define LISTITEM_PICTURE_CCD_WIDTH (LISTITEM_START + 51) // => SLIDE_EXIF_CCD_WIDTH +#define LISTITEM_PICTURE_CITY (LISTITEM_START + 52) // => SLIDE_IPTC_CITY +#define LISTITEM_PICTURE_URGENCY (LISTITEM_START + 53) // => SLIDE_IPTC_URGENCY +#define LISTITEM_PICTURE_COPYRIGHT_NOTICE (LISTITEM_START + 54) // => SLIDE_IPTC_COPYRIGHT_NOTICE +#define LISTITEM_PICTURE_COUNTRY (LISTITEM_START + 55) // => SLIDE_IPTC_COUNTRY +#define LISTITEM_PICTURE_COUNTRY_CODE (LISTITEM_START + 56) // => SLIDE_IPTC_COUNTRY_CODE +#define LISTITEM_PICTURE_CREDIT (LISTITEM_START + 57) // => SLIDE_IPTC_CREDIT +#define LISTITEM_PICTURE_IPTCDATE (LISTITEM_START + 58) // => SLIDE_IPTC_DATE +#define LISTITEM_PICTURE_DIGITAL_ZOOM (LISTITEM_START + 59) // => SLIDE_EXIF_DIGITAL_ZOOM +#define LISTITEM_PICTURE_EXPOSURE (LISTITEM_START + 60) // => SLIDE_EXIF_EXPOSURE +#define LISTITEM_PICTURE_EXPOSURE_BIAS (LISTITEM_START + 61) // => SLIDE_EXIF_EXPOSURE_BIAS +#define LISTITEM_PICTURE_FLASH_USED (LISTITEM_START + 62) // => SLIDE_EXIF_FLASH_USED +#define LISTITEM_PICTURE_HEADLINE (LISTITEM_START + 63) // => SLIDE_IPTC_HEADLINE +#define LISTITEM_PICTURE_COLOUR (LISTITEM_START + 64) // => SLIDE_COLOUR +#define LISTITEM_PICTURE_LIGHT_SOURCE (LISTITEM_START + 65) // => SLIDE_EXIF_LIGHT_SOURCE +#define LISTITEM_PICTURE_METERING_MODE (LISTITEM_START + 66) // => SLIDE_EXIF_METERING_MODE +#define LISTITEM_PICTURE_OBJECT_NAME (LISTITEM_START + 67) // => SLIDE_IPTC_OBJECT_NAME +#define LISTITEM_PICTURE_ORIENTATION (LISTITEM_START + 68) // => SLIDE_EXIF_ORIENTATION +#define LISTITEM_PICTURE_PROCESS (LISTITEM_START + 69) // => SLIDE_PROCESS +#define LISTITEM_PICTURE_REF_SERVICE (LISTITEM_START + 70) // => SLIDE_IPTC_REF_SERVICE +#define LISTITEM_PICTURE_SOURCE (LISTITEM_START + 71) // => SLIDE_IPTC_SOURCE +#define LISTITEM_PICTURE_SPEC_INSTR (LISTITEM_START + 72) // => SLIDE_IPTC_SPEC_INSTR +#define LISTITEM_PICTURE_STATE (LISTITEM_START + 73) // => SLIDE_IPTC_STATE +#define LISTITEM_PICTURE_SUP_CATEGORIES (LISTITEM_START + 74) // => SLIDE_IPTC_SUP_CATEGORIES +#define LISTITEM_PICTURE_TX_REFERENCE (LISTITEM_START + 75) // => SLIDE_IPTC_TX_REFERENCE +#define LISTITEM_PICTURE_WHITE_BALANCE (LISTITEM_START + 76) // => SLIDE_EXIF_WHITE_BALANCE +#define LISTITEM_PICTURE_IMAGETYPE (LISTITEM_START + 77) // => SLIDE_IPTC_IMAGETYPE +#define LISTITEM_PICTURE_SUBLOCATION (LISTITEM_START + 78) // => SLIDE_IPTC_SUBLOCATION +#define LISTITEM_PICTURE_TIMECREATED (LISTITEM_START + 79) // => SLIDE_IPTC_TIMECREATED +#define LISTITEM_PICTURE_GPS_LAT (LISTITEM_START + 80) // => SLIDE_EXIF_GPS_LATITUDE +#define LISTITEM_PICTURE_GPS_LON (LISTITEM_START + 81) // => SLIDE_EXIF_GPS_LONGITUDE +#define LISTITEM_PICTURE_GPS_ALT (LISTITEM_START + 82) // => SLIDE_EXIF_GPS_ALTITUDE +#define LISTITEM_PICTURE_END (LISTITEM_PICTURE_GPS_ALT) +#define LISTITEM_STUDIO (LISTITEM_START + 83) +#define LISTITEM_MPAA (LISTITEM_START + 84) +#define LISTITEM_CAST (LISTITEM_START + 85) +#define LISTITEM_CAST_AND_ROLE (LISTITEM_START + 86) +#define LISTITEM_WRITER (LISTITEM_START + 87) +#define LISTITEM_TAGLINE (LISTITEM_START + 88) +#define LISTITEM_TOP250 (LISTITEM_START + 89) +#define LISTITEM_RATING_AND_VOTES (LISTITEM_START + 90) +#define LISTITEM_TRAILER (LISTITEM_START + 91) +#define LISTITEM_STAR_RATING (LISTITEM_START + 92) +#define LISTITEM_FILENAME_AND_PATH (LISTITEM_START + 93) +#define LISTITEM_SORT_LETTER (LISTITEM_START + 94) +#define LISTITEM_ALBUM_ARTIST (LISTITEM_START + 95) +#define LISTITEM_FOLDERNAME (LISTITEM_START + 96) +#define LISTITEM_VIDEO_CODEC (LISTITEM_START + 97) +#define LISTITEM_VIDEO_RESOLUTION (LISTITEM_START + 98) +#define LISTITEM_VIDEO_ASPECT (LISTITEM_START + 99) +#define LISTITEM_AUDIO_CODEC (LISTITEM_START + 100) +#define LISTITEM_AUDIO_CHANNELS (LISTITEM_START + 101) +#define LISTITEM_AUDIO_LANGUAGE (LISTITEM_START + 102) +#define LISTITEM_SUBTITLE_LANGUAGE (LISTITEM_START + 103) +#define LISTITEM_IS_FOLDER (LISTITEM_START + 104) +#define LISTITEM_ORIGINALTITLE (LISTITEM_START + 105) +#define LISTITEM_COUNTRY (LISTITEM_START + 106) +#define LISTITEM_PLAYCOUNT (LISTITEM_START + 107) +#define LISTITEM_LASTPLAYED (LISTITEM_START + 108) +#define LISTITEM_FOLDERPATH (LISTITEM_START + 109) +#define LISTITEM_DISC_NUMBER (LISTITEM_START + 110) +#define LISTITEM_FILE_EXTENSION (LISTITEM_START + 111) +#define LISTITEM_IS_RESUMABLE (LISTITEM_START + 112) +#define LISTITEM_PERCENT_PLAYED (LISTITEM_START + 113) +#define LISTITEM_DATE_ADDED (LISTITEM_START + 114) +#define LISTITEM_DBTYPE (LISTITEM_START + 115) +#define LISTITEM_DBID (LISTITEM_START + 116) + +#define LISTITEM_STARTTIME (LISTITEM_START + 117) +#define LISTITEM_ENDTIME (LISTITEM_START + 118) +#define LISTITEM_STARTDATE (LISTITEM_START + 119) +#define LISTITEM_ENDDATE (LISTITEM_START + 120) +#define LISTITEM_NEXT_TITLE (LISTITEM_START + 121) +#define LISTITEM_NEXT_GENRE (LISTITEM_START + 122) +#define LISTITEM_NEXT_PLOT (LISTITEM_START + 123) +#define LISTITEM_NEXT_PLOT_OUTLINE (LISTITEM_START + 124) +#define LISTITEM_NEXT_STARTTIME (LISTITEM_START + 125) +#define LISTITEM_NEXT_ENDTIME (LISTITEM_START + 126) +#define LISTITEM_NEXT_STARTDATE (LISTITEM_START + 127) +#define LISTITEM_NEXT_ENDDATE (LISTITEM_START + 128) +#define LISTITEM_NEXT_DURATION (LISTITEM_START + 129) +#define LISTITEM_CHANNEL_NAME (LISTITEM_START + 130) +#define LISTITEM_CHANNEL_NUMBER (LISTITEM_START + 131) +#define LISTITEM_CHANNEL_GROUP (LISTITEM_START + 132) +#define LISTITEM_HASTIMER (LISTITEM_START + 133) +#define LISTITEM_ISRECORDING (LISTITEM_START + 134) +#define LISTITEM_ISENCRYPTED (LISTITEM_START + 135) +#define LISTITEM_PARENTALRATING (LISTITEM_START + 136) +#define LISTITEM_PROGRESS (LISTITEM_START + 137) +#define LISTITEM_HAS_EPG (LISTITEM_START + 138) +#define LISTITEM_VOTES (LISTITEM_START + 139) +#define LISTITEM_STEREOSCOPIC_MODE (LISTITEM_START + 140) +#define LISTITEM_IS_STEREOSCOPIC (LISTITEM_START + 141) +#define LISTITEM_INPROGRESS (LISTITEM_START + 142) +#define LISTITEM_HASRECORDING (LISTITEM_START + 143) +#define LISTITEM_SUB_CHANNEL_NUMBER (LISTITEM_START + 144) +#define LISTITEM_CHANNEL_NUMBER_LBL (LISTITEM_START + 145) +#define LISTITEM_IMDBNUMBER (LISTITEM_START + 146) +#define LISTITEM_EPISODENAME (LISTITEM_START + 147) +#define LISTITEM_IS_COLLECTION (LISTITEM_START + 148) + +#define LISTITEM_PROPERTY_START (LISTITEM_START + 200) +#define LISTITEM_PROPERTY_END (LISTITEM_PROPERTY_START + 1000) +#define LISTITEM_END (LISTITEM_PROPERTY_END) + +#define MUSICPLAYER_PROPERTY_OFFSET 800 // 100 id's reserved for musicplayer props. +#define LISTITEM_ART_OFFSET 900 // 100 id's reserved for listitem art. + +#define CONDITIONAL_LABEL_START LISTITEM_END + 1 // 36001 +#define CONDITIONAL_LABEL_END 37000 + +// the multiple information vector +#define MULTI_INFO_START 40000 +#define MULTI_INFO_END 99999 +#define COMBINED_VALUES_START 100000 + // forward class CGUIWindow; namespace EPG @@ -66,7 +689,11 @@ typedef std::shared_ptr CEpgInfoTagPtr; } - +// Info Flags +// Stored in the top 8 bits of GUIInfo::m_data1 +// therefore we only have room for 8 flags +#define INFOFLAG_LISTITEM_WRAP ((uint32_t) (1 << 25)) // Wrap ListItem lookups +#define INFOFLAG_LISTITEM_POSITION ((uint32_t) (1 << 26)) // Absolute ListItem lookups // structure to hold multiple integer data // for storage referenced from a single integer @@ -99,18 +726,14 @@ \ingroup strings \brief */ -class CGUIInfoManager : public IMsgTargetCallback, public Observable, - public KODI::MESSAGING::IMessageTarget +class CGUIInfoManager : public IMsgTargetCallback, public Observable { public: CGUIInfoManager(void); virtual ~CGUIInfoManager(void); void Clear(); - virtual bool OnMessage(CGUIMessage &message) override; - - virtual int GetMessageMask() override; - virtual void OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg) override; + virtual bool OnMessage(CGUIMessage &message); /*! \brief Register a boolean condition/expression This routine allows controls or other clients of the info manager to register @@ -130,7 +753,7 @@ \return the value of the evaluated expression. \sa Register */ - bool EvaluateBool(const std::string &expression, int context = 0, const CGUIListItemPtr &item = nullptr); + bool EvaluateBool(const std::string &expression, int context = 0); int TranslateString(const std::string &strCondition); @@ -165,10 +788,8 @@ void SetCurrentVideoTag(const CVideoInfoTag &tag); const MUSIC_INFO::CMusicInfoTag *GetCurrentSongTag() const; - const PVR::CPVRRadioRDSInfoTagPtr GetCurrentRadioRDSInfoTag() const; const CVideoInfoTag* GetCurrentMovieTag() const; - std::string GetRadioRDSLabel(int item); std::string GetMusicLabel(int item); std::string GetMusicTagLabel(int info, const CFileItem *item); std::string GetVideoLabel(int item); @@ -184,16 +805,18 @@ int GetTotalPlayTime() const; float GetSeekPercent() const; std::string GetCurrentPlayTimeRemaining(TIME_FORMAT format) const; + std::string GetVersionShort(void); + std::string GetAppName(); + std::string GetVersion(); + std::string GetBuild(); bool GetDisplayAfterSeek(); void SetDisplayAfterSeek(unsigned int timeOut = 2500, int seekOffset = 0); void SetShowTime(bool showtime) { m_playerShowTime = showtime; }; void SetShowCodec(bool showcodec) { m_playerShowCodec = showcodec; }; void SetShowInfo(bool showinfo) { m_playerShowInfo = showinfo; }; - bool GetShowInfo() const { return m_playerShowInfo; } void ToggleShowCodec() { m_playerShowCodec = !m_playerShowCodec; }; bool ToggleShowInfo() { m_playerShowInfo = !m_playerShowInfo; return m_playerShowInfo; }; - bool IsPlayerChannelPreviewActive() const; std::string GetSystemHeatInfo(int info); CTemperature GetGPUTemperature(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/GUILargeTextureManager.cpp kodi-15.2~git20151019.1039-final/xbmc/GUILargeTextureManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/GUILargeTextureManager.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/GUILargeTextureManager.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -31,6 +31,9 @@ #include +using namespace std; + + CImageLoader::CImageLoader(const std::string &path, const bool useCache): m_path(path) { @@ -50,7 +53,7 @@ std::string texturePath = g_TextureManager.GetTexturePath(m_path); if (m_use_cache) - loadPath = CTextureCache::GetInstance().CheckCachedImage(texturePath, true, needsChecking); + loadPath = CTextureCache::Get().CheckCachedImage(texturePath, true, needsChecking); else loadPath = texturePath; @@ -58,7 +61,7 @@ { // direct route - load the image unsigned int start = XbmcThreads::SystemClockMillis(); - m_texture = CBaseTexture::LoadFromFile(loadPath, g_graphicsContext.GetWidth(), g_graphicsContext.GetHeight()); + m_texture = CBaseTexture::LoadFromFile(loadPath, g_graphicsContext.GetWidth(), g_graphicsContext.GetHeight(), CSettings::Get().GetBool("pictures.useexifrotation")); if (XbmcThreads::SystemClockMillis() - start > 100) CLog::Log(LOGDEBUG, "%s - took %u ms to load %s", __FUNCTION__, XbmcThreads::SystemClockMillis() - start, loadPath.c_str()); @@ -66,7 +69,7 @@ if (m_texture) { if (needsChecking) - CTextureCache::GetInstance().BackgroundCacheImage(texturePath); + CTextureCache::Get().BackgroundCacheImage(texturePath); return true; } @@ -79,7 +82,7 @@ return false; // We're done // not in our texture cache or it failed to load from it, so try and load directly and then cache the result - CTextureCache::GetInstance().CacheImage(texturePath, &m_texture); + CTextureCache::Get().CacheImage(texturePath, &m_texture); return (m_texture != NULL); } @@ -223,7 +226,7 @@ // queue the item CLargeTexture *image = new CLargeTexture(path); unsigned int jobID = CJobManager::GetInstance().AddJob(new CImageLoader(path, useCache), this, CJob::PRIORITY_NORMAL); - m_queued.push_back(std::make_pair(jobID, image)); + m_queued.push_back(make_pair(jobID, image)); } void CGUILargeTextureManager::OnJobComplete(unsigned int jobID, bool success, CJob *job) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/GUILargeTextureManager.h kodi-15.2~git20151019.1039-final/xbmc/GUILargeTextureManager.h --- kodi-16.1~git20160425.1001-final/xbmc/GUILargeTextureManager.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/GUILargeTextureManager.h 2015-10-19 08:39:15.000000000 +0000 @@ -20,11 +20,9 @@ * */ -#include - -#include "guilib/TextureManager.h" #include "threads/CriticalSection.h" #include "utils/Job.h" +#include "guilib/TextureManager.h" /*! \ingroup textures,jobs diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/AnimatedGif.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/AnimatedGif.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/AnimatedGif.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/AnimatedGif.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,663 @@ + +// **************************************************************************** +// +// WINIMAGE.CPP : Generic classes for raster images (MSWindows specialization) +// +// Content: Member definitions for: +// - class CAnimatedGif : Storage class for single images +// - class CAnimatedGifSet : Storage class for sets of images +// +// (Includes routines to Load and Save BMP files and to load GIF files into +// these classes). +// +// -------------------------------------------------------------------------- +// +// Copyright (c) 2000, Juan Soulie +// +// Permission to use, copy, modify, distribute and sell this software or any +// part thereof and/or its documentation for any purpose is granted without fee +// provided that the above copyright notice and this permission notice appear +// in all copies. +// +// This software is provided "as is" without express or implied warranty of +// any kind. The author shall have no liability with respect to the +// infringement of copyrights or patents that any modification to the content +// of this file or this file itself may incur. +// +// **************************************************************************** + +#include "AnimatedGif.h" +#include "filesystem/SpecialProtocol.h" +#include "utils/EndianSwap.h" +#include "utils/log.h" + +#ifdef TARGET_WINDOWS +extern "C" FILE *fopen_utf8(const char *_Filename, const char *_Mode); +#else +#define fopen_utf8 fopen +#endif + +#pragma pack(1) +// Error processing macro (NO-OP by default): +#define ERRORMSG(PARAM) {} + +#ifndef BI_RGB + #define BI_RGB 0L + #define BI_RLE8 1L + #define BI_RLE4 2L + #define BI_BITFIELDS 3L +#endif + +#undef ALIGN +#define ALIGN sizeof(int) ///< Windows GDI expects all int-aligned + +// Macros to swap data endianness +#define SWAP16(X) X=Endian_SwapLE16(X) +#define SWAP32(X) X=Endian_SwapLE32(X) + +// pre-declaration: +int LZWDecoder (char*, char*, short, int, int, int, const int); + +// **************************************************************************** +// * CAnimatedGif Member definitions * +// **************************************************************************** + +CAnimatedGif::CAnimatedGif() +{ + Height = Width = 0; + Raster = NULL; + Palette = NULL; + pbmi = NULL; + BPP = Transparent = BytesPerRow = 0; + xPos = yPos = Delay = Transparency = 0; + nLoops = 1; //default=play animation 1 time +} + +CAnimatedGif::~CAnimatedGif() +{ + delete [] pbmi; + delete [] Raster; + delete [] Palette; +} + +// Init: Allocates space for raster and palette in GDI-compatible structures. +void CAnimatedGif::Init(int iWidth, int iHeight, int iBPP, int iLoops) +{ + delete[] Raster; + Raster = NULL; + + delete[] pbmi; + pbmi = NULL; + + delete[] Palette; + Palette = NULL; + + // Standard members setup + Transparent = -1; + BytesPerRow = Width = iWidth; + Height = iHeight; + BPP = iBPP; + // Animation Extra members setup: + xPos = yPos = Delay = Transparency = 0; + nLoops = iLoops; + + if (BPP == 24) + { + BytesPerRow *= 3; + pbmi = (GUIBITMAPINFO*)new char [sizeof(GUIBITMAPINFO)]; + } + else + { + pbmi = (GUIBITMAPINFO*)new char[sizeof(GUIBITMAPINFOHEADER)]; + Palette = new COLOR[256]; + } + + BytesPerRow += (ALIGN - Width % ALIGN) % ALIGN; // Align BytesPerRow + int size = BytesPerRow * Height; + + Raster = new char [size]; + + pbmi->bmiHeader.biSize = sizeof (GUIBITMAPINFOHEADER); + pbmi->bmiHeader.biWidth = Width; + pbmi->bmiHeader.biHeight = -Height; // negative means up-to-bottom + pbmi->bmiHeader.biPlanes = 1; + pbmi->bmiHeader.biBitCount = (BPP < 8 ? 8 : BPP); // Our raster is byte-aligned + pbmi->bmiHeader.biCompression = BI_RGB; + pbmi->bmiHeader.biSizeImage = 0; + pbmi->bmiHeader.biXPelsPerMeter = 11811; + pbmi->bmiHeader.biYPelsPerMeter = 11811; + pbmi->bmiHeader.biClrUsed = 0; + pbmi->bmiHeader.biClrImportant = 0; +} + +// operator=: copies an object's content to another +CAnimatedGif& CAnimatedGif::operator = (CAnimatedGif& rhs) +{ + Init(rhs.Width, rhs.Height, rhs.BPP); // respects virtualization + memcpy(Raster, rhs.Raster, BytesPerRow*Height); + memcpy(Palette, rhs.Palette, 256*sizeof(COLOR)); + return *this; +} + + + +CAnimatedGifSet::CAnimatedGifSet() +{ + FrameHeight = FrameWidth = 0; + nLoops = 1; //default=play animation 1 time +} + +CAnimatedGifSet::~CAnimatedGifSet() +{ + Release(); +} + +void CAnimatedGifSet::Release() +{ + FrameWidth = 0; + FrameHeight = 0; + for (int i = 0; i < (int)m_vecimg.size(); ++i) + { + CAnimatedGif* pImage = m_vecimg[i]; + delete pImage; + } + m_vecimg.erase(m_vecimg.begin(), m_vecimg.end()); + +} + +// **************************************************************************** +// * CAnimatedGifSet Member definitions * +// **************************************************************************** + +// AddImage: Adds an image object to the back of the img vector. +void CAnimatedGifSet::AddImage (CAnimatedGif* newimage) +{ + m_vecimg.push_back(newimage); +} + +int CAnimatedGifSet::GetImageCount() const +{ + return m_vecimg.size(); +} + +unsigned char CAnimatedGifSet::getbyte(FILE *fd) +{ + unsigned char uchar; + if (fread(&uchar, 1, 1, fd) == 1) + return uchar; + else + return 0; +} + +// **************************************************************************** +// * LoadGIF * +// * Load a GIF File into the CAnimatedGifSet object * +// * (c) Nov 2000, Juan Soulie * +// **************************************************************************** +int CAnimatedGifSet::LoadGIF (const char * szFileName) +{ + int n; + // Global GIF variables: + int GlobalBPP; // Bits per Pixel. + COLOR * GlobalColorMap; // Global colormap (allocate) + + struct GIFGCEtag + { // GRAPHIC CONTROL EXTENSION + unsigned char BlockSize; // Block Size: 4 bytes + unsigned char PackedFields; // 3.. Packed Fields. Bits detail: + // 0: Transparent Color Flag + // 1: User Input Flag + // 2-4: Disposal Method + unsigned short Delay; // 4..5 Delay Time (1/100 seconds) + unsigned char Transparent; // 6.. Transparent Color Index + } + gifgce; + + struct GIFNetscapeTag + { + unsigned char comment[11]; //4...14 NETSCAPE2.0 + unsigned char SubBlockLength; //15 0x3 + unsigned char reserved; //16 0x1 + unsigned short iIterations ; //17..18 number of iterations (lo-hi) + } + gifnetscape; + + int GraphicExtensionFound = 0; + + // OPEN FILE + FILE *fd = fopen_utf8(CSpecialProtocol::TranslatePath(szFileName).c_str(), "rb"); + if (!fd) + { + return 0; + } + + // *1* READ HEADERBLOCK (6bytes) (SIGNATURE + VERSION) + char szSignature[6]; // First 6 bytes (GIF87a or GIF89a) + int iRead = fread(szSignature, 1, 6, fd); + if (iRead != 6) + { + fclose(fd); + return 0; + } + if ( memcmp(szSignature, "GIF", 2) != 0) + { + fclose(fd); + return 0; + } + // *2* READ LOGICAL SCREEN DESCRIPTOR + struct GIFLSDtag + { + unsigned short ScreenWidth; // Logical Screen Width + unsigned short ScreenHeight; // Logical Screen Height + unsigned char PackedFields; // Packed Fields. Bits detail: + // 0-2: Size of Global Color Table + // 3: Sort Flag + // 4-6: Color Resolution + // 7: Global Color Table Flag + unsigned char Background; // Background Color Index + unsigned char PixelAspectRatio; // Pixel Aspect Ratio + } + giflsd; + + iRead = fread(&giflsd, 1, sizeof(giflsd), fd); + if (iRead != sizeof(giflsd)) + { + fclose(fd); + return 0; + } + // endian swap + SWAP16(giflsd.ScreenWidth); + SWAP16(giflsd.ScreenHeight); + + GlobalBPP = (giflsd.PackedFields & 0x07) + 1; + + // fill some animation data: + FrameWidth = giflsd.ScreenWidth; + FrameHeight = giflsd.ScreenHeight; + nLoops = 1; //default=play animation 1 time + + // *3* READ/GENERATE GLOBAL COLOR MAP + GlobalColorMap = new COLOR [1 << GlobalBPP]; + if (giflsd.PackedFields & 0x80) // File has global color map? + for (n = 0;n < 1 << GlobalBPP;n++) + { + GlobalColorMap[n].r = getbyte(fd); + GlobalColorMap[n].g = getbyte(fd); + GlobalColorMap[n].b = getbyte(fd); + GlobalColorMap[n].x = 0; + } + + else // GIF standard says to provide an internal default Palette: + for (n = 0;n < 256;n++) + { + GlobalColorMap[n].r = GlobalColorMap[n].g = GlobalColorMap[n].b = n; + GlobalColorMap[n].x = 0; + } + + // *4* NOW WE HAVE 3 POSSIBILITIES: + // 4a) Get and Extension Block (Blocks with additional information) + // 4b) Get an Image Separator (Introductor to an image) + // 4c) Get the trailer Char (End of GIF File) + do + { + int charGot = getbyte(fd); + + if (charGot == 0x21) // *A* EXTENSION BLOCK + { + unsigned char extensionType = getbyte(fd); + switch (extensionType) + { + case 0xF9: // Graphic Control Extension + { + if (fread((char*)&gifgce, 1, sizeof(gifgce), fd) == sizeof(gifgce)) + SWAP16(gifgce.Delay); + GraphicExtensionFound++; + getbyte(fd); // Block Terminator (always 0) + } + break; + + case 0xFE: // Comment Extension: Ignored + { + while (int nBlockLength = getbyte(fd)) + for (n = 0;n < nBlockLength;n++) getbyte(fd); + } + break; + + case 0x01: // PlainText Extension: Ignored + { + while (int nBlockLength = getbyte(fd)) + for (n = 0;n < nBlockLength;n++) getbyte(fd); + } + break; + + case 0xFF: // Application Extension: Ignored + { + int nBlockLength = getbyte(fd); + if (nBlockLength == 0x0b) + { + struct GIFNetscapeTag tag; + if (fread((char*)&tag, 1, sizeof(gifnetscape), fd) == sizeof(gifnetscape)) + { + SWAP16(tag.iIterations); + nLoops = tag.iIterations; + } + else + nLoops = 0; + + if (nLoops) nLoops++; + getbyte(fd); + } + else + { + do + { + for (n = 0;n < nBlockLength;n++) getbyte(fd); + } + while ((nBlockLength = getbyte(fd)) != 0); + } + } + break; + + default: // Unknown Extension: Ignored + { + // read (and ignore) data sub-blocks + while (int nBlockLength = getbyte(fd)) + for (n = 0;n < nBlockLength;n++) getbyte(fd); + } + break; + } + } + else if (charGot == 0x2c) + { // *B* IMAGE (0x2c Image Separator) + // Create a new Image Object: + CAnimatedGif* NextImage = new CAnimatedGif(); + + // Read Image Descriptor + struct GIFIDtag + { + unsigned short xPos; // Image Left Position + unsigned short yPos; // Image Top Position + unsigned short Width; // Image Width + unsigned short Height; // Image Height + unsigned char PackedFields; // Packed Fields. Bits detail: + // 0-2: Size of Local Color Table + // 3-4: (Reserved) + // 5: Sort Flag + // 6: Interlace Flag + // 7: Local Color Table Flag + } + gifid; + + memset(&gifid, 0, sizeof(gifid)); + + int LocalColorMap = 0; + if (fread((char*)&gifid, 1, sizeof(gifid), fd) == sizeof(gifid)) + { + SWAP16(gifid.xPos); + SWAP16(gifid.yPos); + SWAP16(gifid.Width); + SWAP16(gifid.Height); + + LocalColorMap = (gifid.PackedFields & 0x08) ? 1 : 0; + } + + NextImage->Init(gifid.Width, gifid.Height, LocalColorMap ? (gifid.PackedFields&7) + 1 : GlobalBPP); + + /* verify that all the image is inside the screen dimensions */ + if (gifid.xPos + gifid.Width > giflsd.ScreenWidth || gifid.yPos + gifid.Height > giflsd.ScreenHeight) + return 0; + + // Fill NextImage Data + NextImage->xPos = gifid.xPos; + NextImage->yPos = gifid.yPos; + if (GraphicExtensionFound) + { + NextImage->Transparent = (gifgce.PackedFields & 0x01) ? gifgce.Transparent : -1; + NextImage->Transparency = (gifgce.PackedFields & 0x1c) > 1 ? 1 : 0; + NextImage->Delay = gifgce.Delay * 10; + } + + if (NextImage->Transparent != -1) + memset(NextImage->Raster, NextImage->Transparent, NextImage->BytesPerRow * NextImage->Height); + else + memset(NextImage->Raster, giflsd.Background, NextImage->BytesPerRow * NextImage->Height); + + // Read Color Map (if descriptor says so) + size_t palSize = sizeof(COLOR)*(1 << NextImage->BPP); + bool isPalRead = false; + if (LocalColorMap && fread((char*)NextImage->Palette, 1, palSize, fd) == palSize) + isPalRead = true; + + // Copy global, if no palette + if (!isPalRead) + memcpy(NextImage->Palette, GlobalColorMap, palSize); + + short firstbyte = getbyte(fd); // 1st byte of img block (CodeSize) + + // Calculate compressed image block size + // to fix: this allocates an extra byte per block + long ImgStart, ImgEnd; + ImgEnd = ImgStart = ftell(fd); + while ((n = getbyte(fd)) != 0) fseek (fd, ImgEnd += n + 1, SEEK_SET ); + fseek (fd, ImgStart, SEEK_SET); + + // Allocate Space for Compressed Image + char * pCompressedImage = new char [ImgEnd - ImgStart + 4]; + + // Read and store Compressed Image + char * pTemp = pCompressedImage; + while (int nBlockLength = getbyte(fd)) + { + if (fread(pTemp, 1, nBlockLength, fd) != (size_t)nBlockLength) + { + // Error? + } + pTemp += nBlockLength; + } + + // Call LZW/GIF decompressor + n = LZWDecoder( + (char*) pCompressedImage, + (char*) NextImage->Raster, + firstbyte, NextImage->BytesPerRow, //NextImage->AlignedWidth, + gifid.Width, gifid.Height, + ((gifid.PackedFields & 0x40) ? 1 : 0) //Interlaced? + ); + + if (n) + AddImage(NextImage); + else + { + delete NextImage; + CLog::Log(LOGERROR, "CAnimatedGifSet::LoadGIF: gif file corrupt: %s", szFileName); + ERRORMSG("GIF File Corrupt"); + } + + // Some cleanup + delete[] pCompressedImage; + GraphicExtensionFound = 0; + } + else if (charGot == 0x3b) + { + // *C* TRAILER: End of GIF Info + break; // Ok. Standard End. + } + + } + while ( !feof(fd) ); + + delete[] GlobalColorMap; + fclose(fd); + if ( GetImageCount() == 0) ERRORMSG("Premature End Of File"); + return GetImageCount(); +} + +// **************************************************************************** +// * LZWDecoder (C/C++) * +// * Codec to perform LZW (GIF Variant) decompression. * +// * (c) Nov2000, Juan Soulie * +// **************************************************************************** +// +// Parameter description: +// - bufIn: Input buffer containing a "de-blocked" GIF/LZW compressed image. +// - bufOut: Output buffer where result will be stored. +// - InitCodeSize: Initial CodeSize to be Used +// (GIF files include this as the first byte in a picture block) +// - AlignedWidth : Width of a row in memory (including alignment if needed) +// - Width, Height: Physical dimensions of image. +// - Interlace: 1 for Interlaced GIFs. +// +int LZWDecoder (char * bufIn, char * bufOut, + short InitCodeSize, int AlignedWidth, + int Width, int Height, const int Interlace) +{ + if (InitCodeSize < 1 || InitCodeSize >= LZW_MAXBITS) + return 0; + int n; + int row = 0, col = 0; // used to point output if Interlaced + int nPixels, maxPixels; // Output pixel counter + + short CodeSize; // Current CodeSize (size in bits of codes) + short ClearCode; // Clear code : resets decompressor + short EndCode; // End code : marks end of information + + long whichBit; // Index of next bit in bufIn + long LongCode; // Temp. var. from which Code is retrieved + short Code; // Code extracted + short PrevCode; // Previous Code + short OutCode; // Code to output + + // Translation Table: + short Prefix[LZW_SIZETABLE] = {}; // Prefix: index of another Code + unsigned char Suffix[LZW_SIZETABLE] = {}; // Suffix: terminating character + short FirstEntry; // Index of first free entry in table + short NextEntry; // Index of next free entry in table + + unsigned char OutStack[LZW_SIZETABLE + 1]; // Output buffer + int OutIndex; // Characters in OutStack + + int RowOffset; // Offset in output buffer for current row + + // Set up values that depend on InitCodeSize Parameter. + CodeSize = InitCodeSize + 1; + ClearCode = (1 << InitCodeSize); + EndCode = ClearCode + 1; + NextEntry = FirstEntry = ClearCode + 2; + + whichBit = 0; + nPixels = 0; + maxPixels = Width * Height; + RowOffset = 0; + PrevCode = 0; + + while (nPixels < maxPixels) + { + OutIndex = 0; // Reset Output Stack + + // GET NEXT CODE FROM bufIn: + // LZW compression uses code items longer than a single byte. + // For GIF Files, code sizes are variable between 9 and 12 bits + // That's why we must read data (Code) this way: + LongCode = *((long*)(bufIn + whichBit / 8)); // Get some bytes from bufIn + SWAP32(LongCode); + LongCode >>= (whichBit&7); // Discard too low bits + Code = (short)((LongCode & ((1 << CodeSize) - 1) )); // Discard too high bits + whichBit += CodeSize; // Increase Bit Offset + + // SWITCH, DIFFERENT POSIBILITIES FOR CODE: + if (Code == EndCode) // END CODE + break; // Exit LZW Decompression loop + + if (Code == ClearCode) + { + // CLEAR CODE: + CodeSize = InitCodeSize + 1; // Reset CodeSize + NextEntry = FirstEntry; // Reset Translation Table + PrevCode = Code; // Prevent next to be added to table. + continue; // restart, to get another code + } + if (Code < NextEntry) // CODE IS IN TABLE + OutCode = Code; // Set code to output. + + else + { // CODE IS NOT IN TABLE: + OutIndex++; // Keep "first" character of previous output. + OutCode = PrevCode; // Set PrevCode to be output + } + + // EXPAND OutCode IN OutStack + // - Elements up to FirstEntry are Raw-Codes and are not expanded + // - Table Prefices contain indexes to other codes + // - Table Suffices contain the raw codes to be output + while (OutCode >= FirstEntry) + { + if (OutIndex > LZW_SIZETABLE || OutCode >= LZW_SIZETABLE) + return 0; + OutStack[OutIndex++] = Suffix[OutCode]; // Add suffix to Output Stack + OutCode = Prefix[OutCode]; // Loop with preffix + } + + // NOW OutCode IS A RAW CODE, ADD IT TO OUTPUT STACK. + if (OutIndex > LZW_SIZETABLE) + return 0; + OutStack[OutIndex++] = (unsigned char) OutCode; + + // ADD NEW ENTRY TO TABLE (PrevCode + OutCode) + // (EXCEPT IF PREVIOUS CODE WAS A CLEARCODE) + if (PrevCode != ClearCode) + { + // Prevent Translation table overflow: + if (NextEntry >= LZW_SIZETABLE) + return 0; + + Prefix[NextEntry] = PrevCode; + Suffix[NextEntry] = (unsigned char) OutCode; + NextEntry++; + + // INCREASE CodeSize IF NextEntry IS INVALID WITH CURRENT CodeSize + if (NextEntry >= (1 << CodeSize)) + { + if (CodeSize < LZW_MAXBITS) CodeSize++; + else + { + ; + } // Do nothing. Maybe next is Clear Code. + } + } + + PrevCode = Code; + + // Avoid the possibility of overflow on 'bufOut'. + if (nPixels + OutIndex > maxPixels) OutIndex = maxPixels - nPixels; + + // OUTPUT OutStack (LAST-IN FIRST-OUT ORDER) + for (n = OutIndex - 1; n >= 0; n--) + { + if (col == Width) // Check if new row. + { + if (Interlace) + { + // If interlaced:: + if ((row&7) == 0) {row += 8; if (row >= Height) row = 4;} + else if ((row&3) == 0) {row += 8; if (row >= Height) row = 2;} + else if ((row&1) == 0) {row += 4; if (row >= Height) row = 1;} + else row += 2; + } + else // If not interlaced: + row++; + + RowOffset = row * AlignedWidth; // Set new row offset + col = 0; + } + bufOut[RowOffset + col] = OutStack[n]; // Write output + col++; nPixels++; // Increase counters. + } + + } // while (main decompressor loop) + + return whichBit; +} + +// Refer to WINIMAGE.TXT for copyright and patent notices on GIF and LZW. + +#pragma pack() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/AnimatedGif.h kodi-15.2~git20151019.1039-final/xbmc/guilib/AnimatedGif.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/AnimatedGif.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/AnimatedGif.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,162 @@ +/*! +\file AnimatedGif.h +\brief +*/ + + +// **************************************************************************** +// +// WINIMAGE.H : Generic classes for raster images (MSWindows specialization) +// +// Content: Class declarations of: +// - class CAnimatedGif : Storage class for single images +// - class CAnimatedGifSet : Storage class for sets of images +// - class C_AnimationWindow : Window Class to display animations +// +// (Includes declarations of routines to Load and Save BMP files and to load +// GIF files into these classes). +// +// -------------------------------------------------------------------------- +// +// Copyright (c) 2000, Juan Soulie +// +// Permission to use, copy, modify, distribute and sell this software or any +// part thereof and/or its documentation for any purpose is granted without fee +// provided that the above copyright notice and this permission notice appear +// in all copies. +// +// This software is provided "as is" without express or implied warranty of +// any kind. The author shall have no liability with respect to the +// infringement of copyrights or patents that any modification to the content +// of this file or this file itself may incur. +// +// **************************************************************************** + + +#include "Texture.h" // for COLOR + +#pragma pack(1) + +#define LZW_MAXBITS 12 +#define LZW_SIZETABLE (1< m_vecimg; ///< Images' Vector. + + void AddImage (CAnimatedGif*); ///< Append new image to vector (push_back) + + int GetImageCount() const; + // File Formats: + int LoadGIF (const char* szFile); + + void Release(); +protected: + static unsigned char getbyte(FILE *fd); +}; + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/cximage.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/cximage.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/cximage.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/cximage.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,6 @@ */ #include "cximage.h" #include "utils/log.h" -#include CXImage::CXImage(const std::string& strMimeType): m_strMimeType(strMimeType), m_thumbnailbuffer(NULL) { @@ -66,25 +65,22 @@ return true; } -bool CXImage::Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format) +bool CXImage::Decode(const unsigned char *pixels, unsigned int pitch, unsigned int format) { if (m_image.width == 0 || m_image.height == 0 || !m_dll.IsLoaded()) return false; - unsigned int copyWidth = std::min(m_width, width); - unsigned int copyHeight = std::min(m_height, height); - unsigned int dstPitch = pitch; unsigned int srcPitch = ((m_image.width + 1)* 3 / 4) * 4; // bitmap row length is aligned to 4 bytes unsigned char *dst = (unsigned char*)pixels; unsigned char *src = m_image.texture + (m_height - 1) * srcPitch; - for (unsigned int y = 0; y < copyHeight; y++) + for (unsigned int y = 0; y < m_height; y++) { unsigned char *dst2 = dst; unsigned char *src2 = src; - for (unsigned int x = 0; x < copyWidth; x++, dst2 += 4, src2 += 3) + for (unsigned int x = 0; x < m_width; x++, dst2 += 4, src2 += 3) { dst2[0] = src2[0]; dst2[1] = src2[1]; @@ -100,12 +96,12 @@ dst = (unsigned char*)pixels + 3; src = m_image.alpha + (m_height - 1) * m_width; - for (unsigned int y = 0; y < copyHeight; y++) + for (unsigned int y = 0; y < m_height; y++) { unsigned char *dst2 = dst; unsigned char *src2 = src; - for (unsigned int x = 0; x < copyWidth; x++, dst2+=4, src2++) + for (unsigned int x = 0; x < m_width; x++, dst2+=4, src2++) *dst2 = *src2; src -= m_width; dst += dstPitch; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/cximage.h kodi-15.2~git20151019.1039-final/xbmc/guilib/cximage.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/cximage.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/cximage.h 2015-10-19 08:39:16.000000000 +0000 @@ -29,7 +29,7 @@ ~CXImage(); virtual bool LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height); - virtual bool Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format); + virtual bool Decode(const unsigned char *pixels, unsigned int pitch, unsigned int format); virtual bool CreateThumbnailFromSurface(unsigned char* bufferin, unsigned int width, unsigned int height, unsigned int format, unsigned int pitch, const std::string& destFile, unsigned char* &bufferout, unsigned int &bufferoutSize); virtual void ReleaseThumbnailBuffer(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/D3DResource.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/D3DResource.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/D3DResource.cpp 2016-04-24 12:10:27.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/D3DResource.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,153 +18,25 @@ * */ -#ifdef HAS_DX - -#include "D3DResource.h" #include "system.h" -#include "utils/log.h" +#include "D3DResource.h" #include "windowing/WindowingFactory.h" +#include "utils/log.h" -#pragma comment(lib, "d3dcompiler.lib") +#ifdef HAS_DX -size_t CD3DHelper::BitsPerPixel(DXGI_FORMAT fmt) -{ - switch (fmt) - { - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - return 128; - - case DXGI_FORMAT_R32G32B32_TYPELESS: - case DXGI_FORMAT_R32G32B32_FLOAT: - case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - return 96; - - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - case DXGI_FORMAT_R16G16B16A16_UNORM: - case DXGI_FORMAT_R16G16B16A16_UINT: - case DXGI_FORMAT_R16G16B16A16_SNORM: - case DXGI_FORMAT_R16G16B16A16_SINT: - case DXGI_FORMAT_R32G32_TYPELESS: - case DXGI_FORMAT_R32G32_FLOAT: - case DXGI_FORMAT_R32G32_UINT: - case DXGI_FORMAT_R32G32_SINT: - case DXGI_FORMAT_R32G8X24_TYPELESS: - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - return 64; - - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_R10G10B10A2_UINT: - case DXGI_FORMAT_R11G11B10_FLOAT: - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - case DXGI_FORMAT_R8G8B8A8_UINT: - case DXGI_FORMAT_R8G8B8A8_SNORM: - case DXGI_FORMAT_R8G8B8A8_SINT: - case DXGI_FORMAT_R16G16_TYPELESS: - case DXGI_FORMAT_R16G16_FLOAT: - case DXGI_FORMAT_R16G16_UNORM: - case DXGI_FORMAT_R16G16_UINT: - case DXGI_FORMAT_R16G16_SNORM: - case DXGI_FORMAT_R16G16_SINT: - case DXGI_FORMAT_R32_TYPELESS: - case DXGI_FORMAT_D32_FLOAT: - case DXGI_FORMAT_R32_FLOAT: - case DXGI_FORMAT_R32_UINT: - case DXGI_FORMAT_R32_SINT: - case DXGI_FORMAT_R24G8_TYPELESS: - case DXGI_FORMAT_D24_UNORM_S8_UINT: - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - case DXGI_FORMAT_R8G8_B8G8_UNORM: - case DXGI_FORMAT_G8R8_G8B8_UNORM: - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8X8_UNORM: - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - return 32; - - case DXGI_FORMAT_R8G8_TYPELESS: - case DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT_R8G8_UINT: - case DXGI_FORMAT_R8G8_SNORM: - case DXGI_FORMAT_R8G8_SINT: - case DXGI_FORMAT_R16_TYPELESS: - case DXGI_FORMAT_R16_FLOAT: - case DXGI_FORMAT_D16_UNORM: - case DXGI_FORMAT_R16_UNORM: - case DXGI_FORMAT_R16_UINT: - case DXGI_FORMAT_R16_SNORM: - case DXGI_FORMAT_R16_SINT: - case DXGI_FORMAT_B5G6R5_UNORM: - case DXGI_FORMAT_B5G5R5A1_UNORM: - case DXGI_FORMAT_B4G4R4A4_UNORM: - return 16; - - case DXGI_FORMAT_R8_TYPELESS: - case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_R8_UINT: - case DXGI_FORMAT_R8_SNORM: - case DXGI_FORMAT_R8_SINT: - case DXGI_FORMAT_A8_UNORM: - return 8; - - case DXGI_FORMAT_R1_UNORM: - return 1; - - case DXGI_FORMAT_BC1_TYPELESS: - case DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT_BC1_UNORM_SRGB: - case DXGI_FORMAT_BC4_TYPELESS: - case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - return 4; - - case DXGI_FORMAT_BC2_TYPELESS: - case DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT_BC2_UNORM_SRGB: - case DXGI_FORMAT_BC3_TYPELESS: - case DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT_BC3_UNORM_SRGB: - case DXGI_FORMAT_BC5_TYPELESS: - case DXGI_FORMAT_BC5_UNORM: - case DXGI_FORMAT_BC5_SNORM: - case DXGI_FORMAT_BC6H_TYPELESS: - case DXGI_FORMAT_BC6H_UF16: - case DXGI_FORMAT_BC6H_SF16: - case DXGI_FORMAT_BC7_TYPELESS: - case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - return 8; - - default: - return 0; - } -} +using namespace std; CD3DTexture::CD3DTexture() { m_width = 0; m_height = 0; m_mipLevels = 0; - m_usage = D3D11_USAGE_DEFAULT; - m_format = DXGI_FORMAT_B8G8R8A8_UNORM; - m_texture = nullptr; - m_textureView = nullptr; - m_renderTarget = nullptr; - m_data = nullptr; + m_usage = 0; + m_format = D3DFMT_A8R8G8B8; + m_pool = D3DPOOL_DEFAULT; + m_texture = NULL; + m_data = NULL; m_pitch = 0; } @@ -174,145 +46,73 @@ delete[] m_data; } -bool CD3DTexture::Create(UINT width, UINT height, UINT mipLevels, D3D11_USAGE usage, DXGI_FORMAT format, const void* pixels /* nullptr */, unsigned int srcPitch /* 0 */) +bool CD3DTexture::Create(UINT width, UINT height, UINT mipLevels, DWORD usage, D3DFORMAT format, D3DPOOL pool) { m_width = width; m_height = height; m_mipLevels = mipLevels; + m_usage = usage; + m_format = format; + m_pool = pool; // create the texture Release(); - - if (format == DXGI_FORMAT_UNKNOWN) - format = DXGI_FORMAT_B8G8R8A8_UNORM; // DXGI_FORMAT_UNKNOWN - - if (!g_Windowing.IsFormatSupport(format, D3D11_FORMAT_SUPPORT_TEXTURE2D)) - { - CLog::Log(LOGERROR, __FUNCTION__" - unsupported texture format %d", format); - return false; - } - - m_cpuFlags = 0; - if (usage == D3D11_USAGE_DYNAMIC || usage == D3D11_USAGE_STAGING) - { - m_cpuFlags |= D3D11_CPU_ACCESS_WRITE; - if (usage == D3D11_USAGE_STAGING) - m_cpuFlags |= D3D11_CPU_ACCESS_READ; - } - - m_format = format; - m_usage = usage; - - m_bindFlags = 0; // D3D11_BIND_SHADER_RESOURCE; - if (D3D11_USAGE_DEFAULT == usage && g_Windowing.IsFormatSupport(format, D3D11_FORMAT_SUPPORT_RENDER_TARGET)) - m_bindFlags |= D3D11_BIND_RENDER_TARGET; - if ( D3D11_USAGE_STAGING != m_usage - && ( g_Windowing.IsFormatSupport(format, D3D11_FORMAT_SUPPORT_SHADER_LOAD) - || g_Windowing.IsFormatSupport(format, D3D11_FORMAT_SUPPORT_SHADER_SAMPLE))) + HRESULT hr = D3DXCreateTexture(g_Windowing.Get3DDevice(), m_width, m_height, m_mipLevels, m_usage, m_format, m_pool, &m_texture); + if (FAILED(hr)) { - m_bindFlags |= D3D11_BIND_SHADER_RESOURCE; + CLog::Log(LOGERROR, __FUNCTION__" - failed 0x%08X", hr); } - - if (!CreateInternal(pixels, srcPitch)) - { - CLog::Log(LOGERROR, "%s - failed to create texture.", __FUNCTION__); - return false; - } - - g_Windowing.Register(this); - return true; -} - -bool CD3DTexture::CreateInternal(const void* pixels /* nullptr */, unsigned int srcPitch /* 0 */) -{ - ID3D11Device* pD3DDevice = g_Windowing.Get3D11Device(); - - CD3D11_TEXTURE2D_DESC textureDesc(m_format, m_width, m_height, 1, m_mipLevels, m_bindFlags, m_usage, m_cpuFlags, 1, 0, - (m_mipLevels > 1) ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0); - - D3D11_SUBRESOURCE_DATA initData = { 0 }; - initData.pSysMem = pixels; - initData.SysMemPitch = srcPitch ? srcPitch : CD3DHelper::BitsPerPixel(m_format) * m_width / 8; - initData.SysMemSlicePitch = 0; - - return SUCCEEDED(pD3DDevice->CreateTexture2D(&textureDesc, (pixels ? &initData : NULL), &m_texture)); -} - -ID3D11ShaderResourceView* CD3DTexture::GetShaderResource() -{ - if (!m_texture) - return nullptr; - - if (!m_textureView) + else { - CD3D11_SHADER_RESOURCE_VIEW_DESC cSRVDesc(D3D11_SRV_DIMENSION_TEXTURE2D); - HRESULT hr = g_Windowing.Get3D11Device()->CreateShaderResourceView(m_texture, &cSRVDesc, &m_textureView); - - if (FAILED(hr)) + D3DSURFACE_DESC desc; + if( D3D_OK == m_texture->GetLevelDesc(0, &desc)) { - CLog::Log(LOGWARNING, __FUNCTION__ " - cannot create texture view."); - SAFE_RELEASE(m_textureView); + if(desc.Format != m_format) + CLog::Log(LOGWARNING, "CD3DTexture::Create - format changed from %d to %d", m_format, desc.Format); + if(desc.Height != m_height || desc.Width != m_width) + CLog::Log(LOGWARNING, "CD3DTexture::Create - size changed from %ux%u to %ux%u", m_width, m_height, desc.Width, desc.Height); } - } - return m_textureView; -} - -ID3D11RenderTargetView* CD3DTexture::GetRenderTarget() -{ - if (!m_texture) - return nullptr; - - if (!m_renderTarget) - { - CD3D11_RENDER_TARGET_VIEW_DESC cRTVDesc(D3D11_RTV_DIMENSION_TEXTURE2D); - if (FAILED(g_Windowing.Get3D11Device()->CreateRenderTargetView(m_texture, &cRTVDesc, &m_renderTarget))) - { - CLog::Log(LOGWARNING, __FUNCTION__ " - cannot create texture view."); - } + g_Windowing.Register(this); + return true; } - - return m_renderTarget; + return false; } void CD3DTexture::Release() { g_Windowing.Unregister(this); SAFE_RELEASE(m_texture); - SAFE_RELEASE(m_textureView); - SAFE_RELEASE(m_renderTarget); } -bool CD3DTexture::GetDesc(D3D11_TEXTURE2D_DESC *desc) +bool CD3DTexture::LockRect(UINT level, D3DLOCKED_RECT *lr, const RECT *rect, DWORD flags) { if (m_texture) { - m_texture->GetDesc(desc); - return true; + if ((flags & D3DLOCK_DISCARD) && !(m_usage & D3DUSAGE_DYNAMIC)) + flags &= ~D3DLOCK_DISCARD; + return (D3D_OK == m_texture->LockRect(level, lr, rect, flags)); } return false; } -bool CD3DTexture::LockRect(UINT subresource, D3D11_MAPPED_SUBRESOURCE *res, D3D11_MAP mapType) +bool CD3DTexture::UnlockRect(UINT level) { if (m_texture) - { - if (m_usage == D3D11_USAGE_DEFAULT) - return false; - if ((mapType == D3D11_MAP_READ || mapType == D3D11_MAP_READ_WRITE) && m_usage == D3D11_USAGE_DYNAMIC) - return false; + return (D3D_OK == m_texture->UnlockRect(level)); + return false; +} - return (S_OK == g_Windowing.GetImmediateContext()->Map(m_texture, subresource, mapType, 0, res)); - } +bool CD3DTexture::GetLevelDesc(UINT level, D3DSURFACE_DESC *desc) +{ + if (m_texture) + return (D3D_OK == m_texture->GetLevelDesc(level, desc)); return false; } -bool CD3DTexture::UnlockRect(UINT subresource) +bool CD3DTexture::GetSurfaceLevel(UINT level, LPDIRECT3DSURFACE9 *surface) { if (m_texture) - { - g_Windowing.GetImmediateContext()->Unmap(m_texture, subresource); - return true; - } + return (D3D_OK == m_texture->GetSurfaceLevel(level, surface)); return false; } @@ -321,69 +121,68 @@ if (m_texture) { delete[] m_data; - m_data = nullptr; - - ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext(); - - D3D11_TEXTURE2D_DESC textureDesc; - m_texture->GetDesc(&textureDesc); - - ID3D11Texture2D* texture = nullptr; - if (textureDesc.Usage != D3D11_USAGE_STAGING || 0 == (textureDesc.CPUAccessFlags & D3D11_CPU_ACCESS_READ)) - { - // create texture which can be readed by CPU - D3D11_USAGE_STAGING - CD3D11_TEXTURE2D_DESC stagingDesc(textureDesc); - stagingDesc.Usage = D3D11_USAGE_STAGING; - stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - stagingDesc.BindFlags = 0; - - if (FAILED(g_Windowing.Get3D11Device()->CreateTexture2D(&stagingDesc, NULL, &texture))) - return; - - // copy contents to new texture - pContext->CopyResource(texture, m_texture); - } - else - texture = m_texture; - - // read data from texture - D3D11_MAPPED_SUBRESOURCE res; - if (SUCCEEDED(pContext->Map(texture, 0, D3D11_MAP_READ, 0, &res))) + m_data = NULL; + if(!(m_usage & D3DUSAGE_RENDERTARGET) + && !(m_usage & D3DUSAGE_DEPTHSTENCIL) + && !(m_pool == D3DPOOL_DEFAULT && (m_usage & D3DUSAGE_DYNAMIC) == 0)) { - m_pitch = res.RowPitch; - unsigned int memUsage = GetMemoryUsage(res.RowPitch); - m_data = new unsigned char[memUsage]; - memcpy(m_data, res.pData, memUsage); - pContext->Unmap(texture, 0); + D3DLOCKED_RECT lr; + if (LockRect( 0, &lr, NULL, D3DLOCK_READONLY )) + { + m_pitch = lr.Pitch; + unsigned int memUsage = GetMemoryUsage(lr.Pitch); + m_data = new unsigned char[memUsage]; + memcpy(m_data, lr.pBits, memUsage); + UnlockRect(0); + } } - else - CLog::Log(LOGERROR, "%s - Failed to store resource.", __FUNCTION__); - - if (texture != m_texture) - SAFE_RELEASE(texture); } + SAFE_RELEASE(m_texture); } void CD3DTexture::OnDestroyDevice() { SaveTexture(); - SAFE_RELEASE(m_texture); - SAFE_RELEASE(m_textureView); - SAFE_RELEASE(m_renderTarget); } void CD3DTexture::OnLostDevice() { + if (m_pool == D3DPOOL_DEFAULT) + SaveTexture(); } void CD3DTexture::RestoreTexture() { // yay, we're back - make a new copy of the texture - if (!m_texture && m_data) + if (!m_texture) { - if (!CreateInternal(m_data, m_pitch)) + HRESULT hr = D3DXCreateTexture(g_Windowing.Get3DDevice(), m_width, m_height, m_mipLevels, m_usage, m_format, m_pool, &m_texture); + if (FAILED(hr)) { - CLog::Log(LOGERROR, "%s: failed restore texture", __FUNCTION__); + CLog::Log(LOGERROR, __FUNCTION__": D3DXCreateTexture failed 0x%08X", hr); + } + else + { + // copy the data to the texture + D3DLOCKED_RECT lr; + if (m_texture && m_data && LockRect(0, &lr, NULL, D3DLOCK_DISCARD )) + { + if (lr.Pitch == m_pitch) + memcpy(lr.pBits, m_data, GetMemoryUsage(lr.Pitch)); + else + { + UINT minpitch = ((UINT)lr.Pitch < m_pitch) ? lr.Pitch : m_pitch; + + for(UINT i = 0; i < m_height; ++i) + { + // Get pointers to the "rows" of pixels in texture + BYTE* pBits = (BYTE*)lr.pBits + i*lr.Pitch; + BYTE* pData = m_data + i*m_pitch; + memcpy(pBits, pData, minpitch); + } + } + UnlockRect(0); + } } delete[] m_data; @@ -399,86 +198,27 @@ void CD3DTexture::OnResetDevice() { + if (m_pool == D3DPOOL_DEFAULT) + RestoreTexture(); } + unsigned int CD3DTexture::GetMemoryUsage(unsigned int pitch) const { switch (m_format) { - case DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT_BC3_UNORM: + case D3DFMT_DXT1: + case D3DFMT_DXT3: + case D3DFMT_DXT5: return pitch * m_height / 4; default: return pitch * m_height; } } -// static methods -void CD3DTexture::DrawQuad(const CPoint points[4], color_t color, CD3DTexture *texture, const CRect *texCoords, SHADER_METHOD options) -{ - unsigned numViews = 0; - ID3D11ShaderResourceView* views = nullptr; - - if (texture) - { - numViews = 1; - views = texture->GetShaderResource(); - } - - DrawQuad(points, color, numViews, &views, texCoords, options); -} - -void CD3DTexture::DrawQuad(const CRect &rect, color_t color, CD3DTexture *texture, const CRect *texCoords, SHADER_METHOD options) -{ - CPoint points[] = - { - { rect.x1, rect.y1 }, - { rect.x2, rect.y1 }, - { rect.x2, rect.y2 }, - { rect.x1, rect.y2 }, - }; - DrawQuad(points, color, texture, texCoords, options); -} - -void CD3DTexture::DrawQuad(const CPoint points[4], color_t color, unsigned numViews, ID3D11ShaderResourceView **view, const CRect *texCoords, SHADER_METHOD options) -{ - XMFLOAT4 xcolor; - CD3DHelper::XMStoreColor(&xcolor, color); - CRect coords = texCoords ? *texCoords : CRect(0.0f, 0.0f, 1.0f, 1.0f); - - Vertex verts[4] = { - { XMFLOAT3(points[0].x, points[0].y, 0), xcolor, XMFLOAT2(coords.x1, coords.y1), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(points[1].x, points[1].y, 0), xcolor, XMFLOAT2(coords.x2, coords.y1), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(points[2].x, points[2].y, 0), xcolor, XMFLOAT2(coords.x2, coords.y2), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(points[3].x, points[3].y, 0), xcolor, XMFLOAT2(coords.x1, coords.y2), XMFLOAT2(0.0f, 0.0f) }, - }; - - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - - pGUIShader->Begin(view && numViews > 0 ? options : SHADER_METHOD_RENDER_DEFAULT); - if (view && numViews > 0) - pGUIShader->SetShaderViews(numViews, view); - pGUIShader->DrawQuad(verts[0], verts[1], verts[2], verts[3]); -} - -void CD3DTexture::DrawQuad(const CRect &rect, color_t color, unsigned numViews, ID3D11ShaderResourceView **view, const CRect *texCoords, SHADER_METHOD options) -{ - CPoint points[] = - { - { rect.x1, rect.y1 }, - { rect.x2, rect.y1 }, - { rect.x2, rect.y2 }, - { rect.x1, rect.y2 }, - }; - DrawQuad(points, color, numViews, view, texCoords, options); -} - CD3DEffect::CD3DEffect() { - m_effect = nullptr; - m_techniquie = nullptr; - m_currentPass = nullptr; + m_effect = NULL; } CD3DEffect::~CD3DEffect() @@ -491,7 +231,7 @@ Release(); m_effectString = effectString; m_defines.clear(); - if (defines != nullptr) + if (defines != NULL) m_defines = *defines; //FIXME: is this a copy of all members? if (CreateEffect()) { @@ -504,14 +244,12 @@ void CD3DEffect::Release() { g_Windowing.Unregister(this); - OnDestroyDevice(); + SAFE_RELEASE(m_effect); } void CD3DEffect::OnDestroyDevice() { SAFE_RELEASE(m_effect); - m_techniquie = nullptr; - m_currentPass = nullptr; } void CD3DEffect::OnCreateDevice() @@ -519,162 +257,85 @@ CreateEffect(); } -bool CD3DEffect::SetFloatArray(LPCSTR handle, const float* val, unsigned int count) +bool CD3DEffect::SetFloatArray(D3DXHANDLE handle, const float* val, unsigned int count) { - if (m_effect) - { - return S_OK == m_effect->GetVariableByName(handle)->SetRawValue(val, 0, sizeof(float) * count); - } + if(m_effect) + return (D3D_OK == m_effect->SetFloatArray(handle, val, count)); return false; } -bool CD3DEffect::SetMatrix(LPCSTR handle, const XMFLOAT4X4* mat) +bool CD3DEffect::SetMatrix(D3DXHANDLE handle, const D3DXMATRIX* mat) { if (m_effect) - { - return S_OK == m_effect->GetVariableByName(handle)->AsMatrix()->SetMatrix((float *)mat); - } + return (D3D_OK == m_effect->SetMatrix(handle, mat)); return false; } -bool CD3DEffect::SetTechnique(LPCSTR handle) +bool CD3DEffect::SetTechnique(D3DXHANDLE handle) { if (m_effect) - { - m_techniquie = m_effect->GetTechniqueByName(handle); - if (!m_techniquie->IsValid()) - m_techniquie = nullptr; - - return nullptr != m_techniquie; - } + return (D3D_OK == m_effect->SetTechnique(handle)); return false; } -bool CD3DEffect::SetTexture(LPCSTR handle, CD3DTexture &texture) +bool CD3DEffect::SetTexture(D3DXHANDLE handle, CD3DTexture &texture) { if (m_effect) - { - ID3DX11EffectShaderResourceVariable* var = m_effect->GetVariableByName(handle)->AsShaderResource(); - if (var->IsValid()) - return SUCCEEDED(var->SetResource(texture.GetShaderResource())); - } - return false; -} - -bool CD3DEffect::SetResources(LPCSTR handle, ID3D11ShaderResourceView** ppSRViews, size_t count) -{ - if (m_effect) - { - ID3DX11EffectShaderResourceVariable* var = m_effect->GetVariableByName(handle)->AsShaderResource(); - if (var->IsValid()) - return SUCCEEDED(var->SetResourceArray(ppSRViews, 0, count)); - } - return false; -} - -bool CD3DEffect::SetConstantBuffer(LPCSTR handle, ID3D11Buffer *buffer) -{ - if (m_effect) - { - ID3DX11EffectConstantBuffer* effectbuffer = m_effect->GetConstantBufferByName(handle); - if (effectbuffer->IsValid()) - return (S_OK == effectbuffer->SetConstantBuffer(buffer)); - } - return false; -} - -bool CD3DEffect::SetScalar(LPCSTR handle, float value) -{ - if (m_effect) - { - ID3DX11EffectScalarVariable* scalar = m_effect->GetVariableByName(handle)->AsScalar(); - if (scalar->IsValid()) - return (S_OK == scalar->SetFloat(value)); - } - + return (D3D_OK == m_effect->SetTexture(handle, texture.Get())); return false; } bool CD3DEffect::Begin(UINT *passes, DWORD flags) { - if (m_effect && m_techniquie) - { - D3DX11_TECHNIQUE_DESC desc = {}; - HRESULT hr = m_techniquie->GetDesc(&desc); - *passes = desc.Passes; - return S_OK == hr; - } + if (m_effect) + return (D3D_OK == m_effect->Begin(passes, flags)); return false; } bool CD3DEffect::BeginPass(UINT pass) { - if (m_effect && m_techniquie) - { - m_currentPass = m_techniquie->GetPassByIndex(pass); - if (!m_currentPass || !m_currentPass->IsValid()) - { - m_currentPass = nullptr; - return false; - } - return (S_OK == m_currentPass->Apply(0, g_Windowing.Get3D11Context())); - } + if (m_effect) + return (D3D_OK == m_effect->BeginPass(pass)); return false; } bool CD3DEffect::EndPass() { - if (m_effect && m_currentPass) - { - m_currentPass = nullptr; - return true; - } + if (m_effect) + return (D3D_OK == m_effect->EndPass()); return false; } bool CD3DEffect::End() { - if (m_effect && m_techniquie) - { - m_techniquie = nullptr; - return true; - } + if (m_effect) + return (D3D_OK == m_effect->End()); return false; } bool CD3DEffect::CreateEffect() { HRESULT hr; - ID3DBlob* pError = nullptr; + LPD3DXBUFFER pError = NULL; - std::vector definemacros; + std::vector definemacros; for( DefinesMap::const_iterator it = m_defines.begin(); it != m_defines.end(); ++it ) { - D3D_SHADER_MACRO m; + D3DXMACRO m; m.Name = it->first.c_str(); if (it->second.empty()) - m.Definition = nullptr; + m.Definition = NULL; else m.Definition = it->second.c_str(); definemacros.push_back( m ); } - definemacros.push_back(D3D_SHADER_MACRO()); - definemacros.back().Name = nullptr; - definemacros.back().Definition = nullptr; - - UINT dwShaderFlags = 0; - -#ifdef _DEBUG - //dwShaderFlags |= D3DCOMPILE_DEBUG; - // Disable optimizations to further improve shader debugging - //dwShaderFlags |= D3DCOMPILE_SKIP_OPTIMIZATION; -#endif - - hr = D3DX11CompileEffectFromMemory(m_effectString.c_str(), m_effectString.length(), "", &definemacros[0], nullptr, - dwShaderFlags, 0, g_Windowing.Get3D11Device(), &m_effect, &pError); + definemacros.push_back(D3DXMACRO()); + definemacros.back().Name = 0; + definemacros.back().Definition = 0; + hr = D3DXCreateEffect(g_Windowing.Get3DDevice(), m_effectString.c_str(), m_effectString.length(), &definemacros[0], NULL, 0, NULL, &m_effect, &pError ); if(hr == S_OK) return true; else if(pError) @@ -688,42 +349,44 @@ return false; } -CD3DBuffer::CD3DBuffer() +void CD3DEffect::OnLostDevice() +{ + if (m_effect) + m_effect->OnLostDevice(); +} + +void CD3DEffect::OnResetDevice() +{ + if (m_effect) + m_effect->OnResetDevice(); +} + +CD3DVertexBuffer::CD3DVertexBuffer() { m_length = 0; - m_stride = 0; - m_usage = D3D11_USAGE_DEFAULT; - m_format = DXGI_FORMAT_UNKNOWN; - m_buffer = nullptr; - m_data = nullptr; + m_usage = 0; + m_fvf = 0; + m_pool = D3DPOOL_DEFAULT; + m_vertex = NULL; + m_data = NULL; } -CD3DBuffer::~CD3DBuffer() +CD3DVertexBuffer::~CD3DVertexBuffer() { Release(); delete[] m_data; } -bool CD3DBuffer::Create(D3D11_BIND_FLAG type, UINT count, UINT stride, DXGI_FORMAT format, D3D11_USAGE usage, const void* data) +bool CD3DVertexBuffer::Create(UINT length, DWORD usage, DWORD fvf, D3DPOOL pool) { - m_type = type; - m_stride = stride ? stride : CD3DHelper::BitsPerPixel(format); - m_format = format; - m_length = count * m_stride; + m_length = length; m_usage = usage; - m_cpuFlags = 0; - - if (m_usage == D3D11_USAGE_DYNAMIC || m_usage == D3D11_USAGE_STAGING) - { - m_cpuFlags |= D3D11_CPU_ACCESS_WRITE; - if (m_usage == D3D11_USAGE_STAGING) - m_cpuFlags |= D3D11_CPU_ACCESS_READ; - } - - Release(); + m_fvf = fvf; + m_pool = pool; // create the vertex buffer - if (CreateBuffer(data)) + Release(); + if (CreateVertexBuffer()) { g_Windowing.Register(this); return true; @@ -731,379 +394,64 @@ return false; } -void CD3DBuffer::Release() +void CD3DVertexBuffer::Release() { g_Windowing.Unregister(this); - SAFE_RELEASE(m_buffer); + SAFE_RELEASE(m_vertex); } -bool CD3DBuffer::Map(void **data) +bool CD3DVertexBuffer::Lock(UINT level, UINT size, void **data, DWORD flags) { - if (m_buffer) - { - D3D11_MAPPED_SUBRESOURCE resource; - if (SUCCEEDED(g_Windowing.Get3D11Context()->Map(m_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource))) - { - *data = resource.pData; - return true; - } - } + if (m_vertex) + return (D3D_OK == m_vertex->Lock(level, size, data, flags)); return false; } -bool CD3DBuffer::Unmap() +bool CD3DVertexBuffer::Unlock() { - if (m_buffer) - { - g_Windowing.Get3D11Context()->Unmap(m_buffer, 0); - return true; - } + if (m_vertex) + return (D3D_OK == m_vertex->Unlock()); return false; } -void CD3DBuffer::OnDestroyDevice() +void CD3DVertexBuffer::OnDestroyDevice() { - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext(); - - if (!pDevice || !pContext || !m_buffer) - return; - - D3D11_BUFFER_DESC srcDesc; - m_buffer->GetDesc(&srcDesc); - - ID3D11Buffer *buffer = nullptr; - if (srcDesc.Usage != D3D11_USAGE_STAGING || 0 == (srcDesc.CPUAccessFlags & D3D11_CPU_ACCESS_READ)) - { - CD3D11_BUFFER_DESC trgDesc(srcDesc); - trgDesc.Usage = D3D11_USAGE_STAGING; - trgDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - trgDesc.BindFlags = 0; - - if (FAILED(pDevice->CreateBuffer(&trgDesc, NULL, &buffer))) - return; - - pContext->CopyResource(buffer, m_buffer); - } - else - buffer = m_buffer; - - D3D11_MAPPED_SUBRESOURCE res; - if (SUCCEEDED(pContext->Map(buffer, 0, D3D11_MAP_READ, 0, &res))) + if (m_vertex) { - m_data = new unsigned char[srcDesc.ByteWidth]; - memcpy(m_data, res.pData, srcDesc.ByteWidth); - pContext->Unmap(buffer, 0); + delete[] m_data; + m_data = NULL; + void* data; + if (Lock(0, 0, &data, 0)) + { + m_data = new BYTE[m_length]; + memcpy(m_data, data, m_length); + Unlock(); + } } - - if (buffer != m_buffer) - SAFE_RELEASE(buffer); - SAFE_RELEASE(m_buffer); + SAFE_RELEASE(m_vertex); } -void CD3DBuffer::OnCreateDevice() +void CD3DVertexBuffer::OnCreateDevice() { // yay, we're back - make a new copy of the vertices - if (!m_buffer && m_data) + if (!m_vertex && m_data && CreateVertexBuffer()) { - CreateBuffer(m_data); + void *data = NULL; + if (Lock(0, 0, &data, 0)) + { + memcpy(data, m_data, m_length); + Unlock(); + } delete[] m_data; - m_data = nullptr; - } -} - -bool CD3DBuffer::CreateBuffer(const void* pData) -{ - CD3D11_BUFFER_DESC bDesc(m_length, m_type, m_usage, m_cpuFlags); - D3D11_SUBRESOURCE_DATA initData; - initData.pSysMem = pData; - return (S_OK == g_Windowing.Get3D11Device()->CreateBuffer(&bDesc, (pData ? &initData : nullptr), &m_buffer)); -} - -/****************************************************/ -/* D3D Vertex Shader Class */ -/****************************************************/ -CD3DVertexShader::CD3DVertexShader() -{ - m_VS = nullptr; - m_vertexLayout = nullptr; - m_VSBuffer = nullptr; - m_inputLayout = nullptr; - m_vertexLayoutSize = 0; - m_inited = false; -} - -CD3DVertexShader::~CD3DVertexShader() -{ - Release(); -} - -void CD3DVertexShader::Release() -{ - g_Windowing.Unregister(this); - ReleaseShader(); - SAFE_RELEASE(m_VSBuffer); - SAFE_DELETE(m_vertexLayout); -} - -void CD3DVertexShader::ReleaseShader() -{ - UnbindShader(); - - SAFE_RELEASE(m_VS); - SAFE_RELEASE(m_inputLayout); - m_inited = false; -} - -bool CD3DVertexShader::Create(const std::wstring& vertexFile, D3D11_INPUT_ELEMENT_DESC* vertexLayout, unsigned int vertexLayoutSize) -{ - ReleaseShader(); - - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - - if (!pDevice) - return false; - - if (FAILED(D3DReadFileToBlob(vertexFile.c_str(), &m_VSBuffer))) - { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to load the vertex shader."); - return false; - } - - if (vertexLayout && vertexLayoutSize) - { - m_vertexLayoutSize = vertexLayoutSize; - m_vertexLayout = new D3D11_INPUT_ELEMENT_DESC[vertexLayoutSize]; - for (unsigned int i = 0; i < vertexLayoutSize; ++i) - m_vertexLayout[i] = vertexLayout[i]; - } - else - return false; - - m_inited = CreateInternal(); - - if (m_inited) - g_Windowing.Register(this); - - return m_inited; -} - -bool CD3DVertexShader::Create(const void* code, size_t codeLength, D3D11_INPUT_ELEMENT_DESC* vertexLayout, unsigned int vertexLayoutSize) -{ - ReleaseShader(); - - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - - if (!pDevice) - return false; - - // trick to load bytecode into ID3DBlob - if (FAILED(D3DStripShader(code, codeLength, D3DCOMPILER_STRIP_REFLECTION_DATA, &m_VSBuffer))) - { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to load the vertex shader."); - return false; - } - - if (vertexLayout && vertexLayoutSize) - { - m_vertexLayoutSize = vertexLayoutSize; - m_vertexLayout = new D3D11_INPUT_ELEMENT_DESC[vertexLayoutSize]; - for (unsigned int i = 0; i < vertexLayoutSize; ++i) - m_vertexLayout[i] = vertexLayout[i]; - } - else - return false; - - m_inited = CreateInternal(); - - if (m_inited) - g_Windowing.Register(this); - - return m_inited; -} - -bool CD3DVertexShader::CreateInternal() -{ - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - - CLog::Log(LOGDEBUG, __FUNCTION__ " - Create the vertex shader."); - - // Create the vertex shader - if (FAILED(pDevice->CreateVertexShader(m_VSBuffer->GetBufferPointer(), m_VSBuffer->GetBufferSize(), nullptr, &m_VS))) - { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to Create the vertex shader."); - SAFE_RELEASE(m_VSBuffer); - return false; - } - - CLog::Log(LOGDEBUG, __FUNCTION__ " - create the input layout."); - - if (FAILED(pDevice->CreateInputLayout(m_vertexLayout, m_vertexLayoutSize, m_VSBuffer->GetBufferPointer(), m_VSBuffer->GetBufferSize(), &m_inputLayout))) - { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to create the input layout."); - return false; - } - - return true; -} - -void CD3DVertexShader::BindShader() -{ - if (!m_inited) - return; - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - if (!pContext) - return; - - pContext->IASetInputLayout(m_inputLayout); - pContext->VSSetShader(m_VS, nullptr, 0); -} - -void CD3DVertexShader::UnbindShader() -{ - if (!m_inited) - return; - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - pContext->IASetInputLayout(nullptr); - pContext->VSSetShader(nullptr, nullptr, 0); -} - -void CD3DVertexShader::OnCreateDevice() -{ - if (m_VSBuffer && !m_VS) - m_inited = CreateInternal(); -} - -void CD3DVertexShader::OnDestroyDevice() -{ - ReleaseShader(); -} - -/****************************************************/ -/* D3D Pixel Shader Class */ -/****************************************************/ -CD3DPixelShader::CD3DPixelShader() -{ - m_PS = nullptr; - m_PSBuffer = nullptr; - m_inited = false; -} - -CD3DPixelShader::~CD3DPixelShader() -{ - Release(); -} - -void CD3DPixelShader::Release() -{ - g_Windowing.Unregister(this); - ReleaseShader(); - SAFE_RELEASE(m_PSBuffer); -} - -void CD3DPixelShader::ReleaseShader() -{ - SAFE_RELEASE(m_PS); - m_inited = false; -} - -bool CD3DPixelShader::Create(const std::wstring& wstrFile) -{ - ReleaseShader(); - - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - - if (!pDevice) - return false; - - if (FAILED(D3DReadFileToBlob(wstrFile.c_str(), &m_PSBuffer))) - { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to load the vertex shader."); - return false; - } - - m_inited = CreateInternal(); - - if (m_inited) - g_Windowing.Register(this); - - return m_inited; -} - -bool CD3DPixelShader::Create(const void* code, size_t codeLength) -{ - ReleaseShader(); - - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - - if (!pDevice) - return false; - - // trick to load bytecode into ID3DBlob - if (FAILED(D3DStripShader(code, codeLength, D3DCOMPILER_STRIP_REFLECTION_DATA, &m_PSBuffer))) - { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to load the vertex shader."); - return false; - } - - m_inited = CreateInternal(); - - if (m_inited) - g_Windowing.Register(this); - - return m_inited; -} - -bool CD3DPixelShader::CreateInternal() -{ - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - - CLog::Log(LOGDEBUG, __FUNCTION__ " - Create the pixel shader."); - - // Create the vertex shader - if (FAILED(pDevice->CreatePixelShader(m_PSBuffer->GetBufferPointer(), m_PSBuffer->GetBufferSize(), nullptr, &m_PS))) - { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to Create the pixel shader."); - SAFE_RELEASE(m_PSBuffer); - return false; + m_data = NULL; } - - return true; -} - -void CD3DPixelShader::BindShader() -{ - if (!m_inited) - return; - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - if (!pContext) - return; - - pContext->PSSetShader(m_PS, nullptr, 0); -} - -void CD3DPixelShader::UnbindShader() -{ - if (!m_inited) - return; - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - pContext->IASetInputLayout(nullptr); - pContext->VSSetShader(nullptr, nullptr, 0); } -void CD3DPixelShader::OnCreateDevice() +bool CD3DVertexBuffer::CreateVertexBuffer() { - if (m_PSBuffer && !m_PS) - m_inited = CreateInternal(); -} - -void CD3DPixelShader::OnDestroyDevice() -{ - ReleaseShader(); + if (D3D_OK == g_Windowing.Get3DDevice()->CreateVertexBuffer(m_length, m_usage, m_fvf, m_pool, &m_vertex, NULL)) + return true; + return false; } #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/D3DResource.h kodi-15.2~git20151019.1039-final/xbmc/guilib/D3DResource.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/D3DResource.h 2016-04-24 12:10:27.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/D3DResource.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,37 +21,8 @@ #pragma once #ifdef HAS_DX - +#include #include -#include -#include -#include "Geometry.h" -#include "GUIColorManager.h" - -using namespace DirectX; - -#define KODI_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT 4 - -typedef enum SHADER_METHOD { - SHADER_METHOD_RENDER_DEFAULT, - SHADER_METHOD_RENDER_TEXTURE_NOBLEND, - SHADER_METHOD_RENDER_FONT, - SHADER_METHOD_RENDER_TEXTURE_BLEND, - SHADER_METHOD_RENDER_MULTI_TEXTURE_BLEND, - SHADER_METHOD_RENDER_VIDEO, - SHADER_METHOD_RENDER_VIDEO_CONTROL, - SHADER_METHOD_RENDER_STEREO_INTERLACED_LEFT, - SHADER_METHOD_RENDER_STEREO_INTERLACED_RIGHT, - SHADER_METHOD_RENDER_STEREO_CHECKERBOARD_LEFT, - SHADER_METHOD_RENDER_STEREO_CHECKERBOARD_RIGHT, - SHADER_METHOD_RENDER_COUNT -} _SHADER_METHOD; - -typedef enum SHADER_SAMPLER { - SHADER_SAMPLER_LINEAR = 1, - SHADER_SAMPLER_POINT = 2 -} _SHADER_SAMPLER; - class ID3DResource { @@ -64,104 +35,48 @@ virtual void OnResetDevice() {}; }; -class CD3DHelper -{ -public: - static inline void XMStoreColor(float* floats, DWORD dword) - { - floats[0] = float((dword >> 16) & 0xFF) * (1.0f / 255.0f); // r - floats[1] = float((dword >> 8) & 0xFF) * (1.0f / 255.0f); // g - floats[2] = float((dword >> 0) & 0xFF) * (1.0f / 255.0f); // b - floats[3] = float((dword >> 24) & 0xFF) * (1.0f / 255.0f); // a - } - - static inline void XMStoreColor(XMFLOAT4* floats, DWORD dword) - { - XMStoreColor(reinterpret_cast(floats), dword); - } - - static inline void XMStoreColor(float* floats, unsigned char a, unsigned char r, unsigned char g, unsigned char b) - { - floats[0] = r * (1.0f / 255.0f); - floats[1] = g * (1.0f / 255.0f); - floats[2] = b * (1.0f / 255.0f); - floats[3] = a * (1.0f / 255.0f); - } - - static inline void XMStoreColor(XMFLOAT4* floats, unsigned char a, unsigned char r, unsigned char g, unsigned char b) - { - XMStoreColor(reinterpret_cast(floats), a, r, g, b); - } - - // helper function to properly "clear" shader resources - static inline void PSClearShaderResources(ID3D11DeviceContext* pContext) - { - ID3D11ShaderResourceView* shader_resource_views[KODI_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] = {}; - pContext->PSSetShaderResources(0, ARRAYSIZE(shader_resource_views), shader_resource_views); - } - - static size_t BitsPerPixel(DXGI_FORMAT fmt); -}; - class CD3DTexture : public ID3DResource { public: CD3DTexture(); ~CD3DTexture(); - bool Create(UINT width, UINT height, UINT mipLevels, D3D11_USAGE usage, DXGI_FORMAT format, const void* pInitData = nullptr, unsigned int srcPitch = 0); + bool Create(UINT width, UINT height, UINT mipLevels, DWORD usage, D3DFORMAT format, D3DPOOL pool); void Release(); - bool GetDesc(D3D11_TEXTURE2D_DESC *desc); - bool LockRect(UINT subresource, D3D11_MAPPED_SUBRESOURCE *res, D3D11_MAP mapType); - bool UnlockRect(UINT subresource); + bool LockRect(UINT level, D3DLOCKED_RECT *lr, const RECT *rect, DWORD flags); + bool UnlockRect(UINT level); + bool GetLevelDesc(UINT level, D3DSURFACE_DESC *desc); + bool GetSurfaceLevel(UINT level, LPDIRECT3DSURFACE9 *surface); // Accessors - ID3D11Texture2D* Get() const { return m_texture; }; - ID3D11ShaderResourceView* GetShaderResource(); - ID3D11RenderTargetView* GetRenderTarget(); + LPDIRECT3DTEXTURE9 Get() const { return m_texture; }; UINT GetWidth() const { return m_width; } UINT GetHeight() const { return m_height; } - DXGI_FORMAT GetFormat() const { return m_format; } - - // static methods - static void DrawQuad(const CPoint points[4], color_t color, CD3DTexture *texture, const CRect *texCoords, - SHADER_METHOD options = SHADER_METHOD_RENDER_TEXTURE_BLEND); - - static void DrawQuad(const CPoint points[4], color_t color, unsigned numViews, ID3D11ShaderResourceView **view, const CRect *texCoords, - SHADER_METHOD options = SHADER_METHOD_RENDER_TEXTURE_BLEND); - - static void DrawQuad(const CRect &coords, color_t color, CD3DTexture *texture, const CRect *texCoords, - SHADER_METHOD options = SHADER_METHOD_RENDER_TEXTURE_BLEND); - - static void DrawQuad(const CRect &coords, color_t color, unsigned numViews, ID3D11ShaderResourceView **view, const CRect *texCoords, - SHADER_METHOD options = SHADER_METHOD_RENDER_TEXTURE_BLEND); + D3DFORMAT GetFormat() const { return m_format; } virtual void OnDestroyDevice(); virtual void OnCreateDevice(); virtual void OnLostDevice(); virtual void OnResetDevice(); + private: unsigned int GetMemoryUsage(unsigned int pitch) const; - bool CreateInternal(const void* pInitData = nullptr, unsigned int srcPitch = 0); void SaveTexture(); void RestoreTexture(); // creation parameters - UINT m_width; - UINT m_height; - UINT m_mipLevels; - D3D11_USAGE m_usage; - DXGI_FORMAT m_format; - UINT m_pitch; - UINT m_bindFlags; - UINT m_cpuFlags; + UINT m_width; + UINT m_height; + UINT m_mipLevels; + DWORD m_usage; + D3DFORMAT m_format; + D3DPOOL m_pool; + UINT m_pitch; // created texture - ID3D11Texture2D* m_texture; - ID3D11ShaderResourceView* m_textureView; - ID3D11RenderTargetView* m_renderTarget; + LPDIRECT3DTEXTURE9 m_texture; // saved data BYTE* m_data; @@ -176,113 +91,52 @@ virtual ~CD3DEffect(); bool Create(const std::string &effectString, DefinesMap* defines); void Release(); - bool SetFloatArray(LPCSTR handle, const float* val, unsigned int count); - bool SetMatrix(LPCSTR handle, const XMFLOAT4X4* mat); - bool SetTechnique(LPCSTR handle); - bool SetTexture(LPCSTR handle, CD3DTexture &texture); - bool SetResources(LPCSTR handle, ID3D11ShaderResourceView** ppSRViews, size_t count); - bool SetConstantBuffer(LPCSTR handle, ID3D11Buffer *buffer); - bool SetScalar(LPCSTR handle, float value); + bool SetFloatArray(D3DXHANDLE handle, const float* val, unsigned int count); + bool SetMatrix(D3DXHANDLE handle, const D3DXMATRIX* mat); + bool SetTechnique(D3DXHANDLE handle); + bool SetTexture(D3DXHANDLE handle, CD3DTexture &texture); bool Begin(UINT *passes, DWORD flags); bool BeginPass(UINT pass); bool EndPass(); bool End(); - ID3DX11Effect *Get() const { return m_effect; }; + ID3DXEffect *Get() const { return m_effect; }; virtual void OnDestroyDevice(); virtual void OnCreateDevice(); - + virtual void OnLostDevice(); + virtual void OnResetDevice(); private: bool CreateEffect(); - - std::string m_effectString; - ID3DX11Effect* m_effect; - ID3DX11EffectTechnique* m_techniquie; - ID3DX11EffectPass* m_currentPass; - DefinesMap m_defines; -}; - -class CD3DBuffer : public ID3DResource -{ -public: - CD3DBuffer(); - virtual ~CD3DBuffer(); - bool Create(D3D11_BIND_FLAG type, UINT count, UINT stride, DXGI_FORMAT format, D3D11_USAGE usage, const void* initData = nullptr); - bool Map(void** resource); - bool Unmap(); - void Release(); - bool Update(UINT offset, UINT size, void *data); - unsigned int GetStride() { return m_stride; } - DXGI_FORMAT GetFormat() { return m_format; } - ID3D11Buffer* Get() const { return m_buffer; }; - - virtual void OnDestroyDevice(); - virtual void OnCreateDevice(); -private: - bool CreateBuffer(const void *pData); - D3D11_BIND_FLAG m_type; - UINT m_length; - UINT m_stride; - DXGI_FORMAT m_format; - D3D11_USAGE m_usage; - ID3D11Buffer* m_buffer; - UINT m_cpuFlags; - // saved data - BYTE* m_data; + std::string m_effectString; + ID3DXEffect *m_effect; + DefinesMap m_defines; }; -class CD3DVertexShader : public ID3DResource +class CD3DVertexBuffer : public ID3DResource { public: - CD3DVertexShader(); - ~CD3DVertexShader(); - - bool Create(const std::wstring& vertexFile, D3D11_INPUT_ELEMENT_DESC* vertexLayout, unsigned int vertexLayoutSize); - bool Create(const void* code, size_t codeLength, D3D11_INPUT_ELEMENT_DESC* vertexLayout, unsigned int vertexLayoutSize); - void ReleaseShader(); - void BindShader(); - void UnbindShader(); + CD3DVertexBuffer(); + virtual ~CD3DVertexBuffer(); + bool Create(UINT length, DWORD usage, DWORD fvf, D3DPOOL pool); void Release(); - bool IsInited() { return m_inited; } - - virtual void OnDestroyDevice(); - virtual void OnCreateDevice(); + bool Lock(UINT offset, UINT size, void **data, DWORD flags); + bool Unlock(); -private: - bool CreateInternal(); - - ID3DBlob* m_VSBuffer; - D3D11_INPUT_ELEMENT_DESC* m_vertexLayout; - ID3D11VertexShader* m_VS; - ID3D11InputLayout* m_inputLayout; - unsigned int m_vertexLayoutSize; - bool m_inited; -}; - -class CD3DPixelShader : public ID3DResource -{ -public: - CD3DPixelShader(); - ~CD3DPixelShader(); - - bool Create(const std::wstring& wstrFile); - bool Create(const void* code, size_t codeLength); - void ReleaseShader(); - void BindShader(); - void UnbindShader(); - void Release(); - bool IsInited() { return m_inited; } + LPDIRECT3DVERTEXBUFFER9 Get() const { return m_vertex; }; virtual void OnDestroyDevice(); virtual void OnCreateDevice(); - private: - bool CreateInternal(); + bool CreateVertexBuffer(); + UINT m_length; + DWORD m_usage; + DWORD m_fvf; + D3DPOOL m_pool; + LPDIRECT3DVERTEXBUFFER9 m_vertex; - ID3DBlob* m_PSBuffer; - ID3D11PixelShader* m_PS; - bool m_inited; + // saved data + BYTE* m_data; }; #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/DDSImage.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/DDSImage.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/DDSImage.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/DDSImage.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,6 +32,8 @@ #include "SimpleFS.h" #endif +using namespace std; + CDDSImage::CDDSImage() { m_data = NULL; @@ -124,7 +126,7 @@ { // use ARGB Allocate(width, height, XB_FMT_A8R8G8B8); for (unsigned int i = 0; i < height; i++) - memcpy(m_data + i * width * 4, brga + i * pitch, std::min(width * 4, pitch)); + memcpy(m_data + i * width * 4, brga + i * pitch, min(width * 4, pitch)); } return WriteFile(outputFile); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/DllLibGif.h kodi-15.2~git20151019.1039-final/xbmc/guilib/DllLibGif.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/DllLibGif.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/DllLibGif.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,195 +0,0 @@ -#pragma once - -/* - * Copyright (C) 2005-2014 Team XBMC - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include -#include "DynamicDll.h" -#ifndef CONTINUE_EXT_FUNC_CODE -#define CONTINUE_EXT_FUNC_CODE 0 -#endif - -#ifndef DISPOSAL_UNSPECIFIED -#define DISPOSAL_UNSPECIFIED 0 -#endif - -#ifndef DISPOSE_DO_NOT -#define DISPOSE_DO_NOT 1 -#endif - -#ifndef DISPOSE_BACKGROUND -#define DISPOSE_BACKGROUND 2 -#endif - -#ifndef DISPOSE_PREVIOUS -#define DISPOSE_PREVIOUS 3 -#endif - -class DllLibGifInterface -{ -public: - virtual ~DllLibGifInterface() {} -#if GIFLIB_MAJOR == 5 - virtual const char* GifErrorString(int ErrorCode) = 0; - virtual GifFileType* DGifOpenFileName(const char *GifFileName, int *Error) = 0; - virtual GifFileType *DGifOpen(void *userPtr, InputFunc readFunc, int *Error) = 0; - virtual int DGifSavedExtensionToGCB(GifFileType *GifFile, int ImageIndex, GraphicsControlBlock *GCB) = 0; -#if GIFLIB_MINOR >= 1 - virtual int DGifCloseFile(GifFileType* GifFile, int *Error)=0; -#else - virtual int DGifCloseFile(GifFileType* GifFile) = 0; -#endif -#else - virtual GifFileType* DGifOpenFileName(const char *GifFileName) = 0; - virtual GifFileType *DGifOpen(void *userPtr, InputFunc readFunc)=0; - virtual int DGifGetExtension(GifFileType * GifFile, int *GifExtCode, GifByteType ** GifExtension) = 0; - virtual int DGifGetExtensionNext(GifFileType * GifFile, GifByteType ** GifExtension) = 0; - virtual int DGifCloseFile(GifFileType* GifFile)=0; -#endif - virtual int DGifSlurp(GifFileType* GifFile)=0; -}; - -class DllLibGif : public DllDynamic, DllLibGifInterface -{ - DECLARE_DLL_WRAPPER(DllLibGif, DLL_PATH_LIBGIF) - -#if GIFLIB_MAJOR == 5 - DEFINE_METHOD1(const char*, GifErrorString, (int p1)) - DEFINE_METHOD2(GifFileType*, DGifOpenFileName, (const char *p1, int *p2)) - DEFINE_METHOD3(GifFileType*, DGifOpen, (void *p1, InputFunc p2, int *p3)) - DEFINE_METHOD3(int, DGifSavedExtensionToGCB, (GifFileType *p1, int p2, GraphicsControlBlock *p3)) -#if GIFLIB_MINOR >= 1 - DEFINE_METHOD2(int, DGifCloseFile, (GifFileType* p1, int *p2)) -#else - DEFINE_METHOD1(int, DGifCloseFile, (GifFileType* p1)) -#endif -#else - DEFINE_METHOD0(int, GifLastError) - DEFINE_METHOD1(GifFileType*, DGifOpenFileName, (const char *p1)) - DEFINE_METHOD2(GifFileType*, DGifOpen, (void *p1, InputFunc p2)) - DEFINE_METHOD3(int, DGifGetExtension, (GifFileType *p1, int *p2, GifByteType **p3)) - DEFINE_METHOD2(int, DGifGetExtensionNext, (GifFileType *p1, GifByteType **p2)) - DEFINE_METHOD1(int, DGifCloseFile, (GifFileType* p1)) -#endif - DEFINE_METHOD1(int, DGifSlurp, (GifFileType* p1)) - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD(DGifOpenFileName) - RESOLVE_METHOD(DGifOpen) - RESOLVE_METHOD(DGifCloseFile) - RESOLVE_METHOD(DGifSlurp) -#if GIFLIB_MAJOR == 5 - RESOLVE_METHOD(DGifSavedExtensionToGCB) - RESOLVE_METHOD(GifErrorString) -#else - RESOLVE_METHOD(GifLastError) - RESOLVE_METHOD(DGifGetExtension) - RESOLVE_METHOD(DGifGetExtensionNext) -#endif - END_METHOD_RESOLVE() - -#if GIFLIB_MAJOR != 5 -public: - /* - taken from giflib 5.1.0 - */ - const char* GifErrorString(int ErrorCode) - { - const char *Err; - - switch (ErrorCode) { - case E_GIF_ERR_OPEN_FAILED: - Err = "Failed to open given file"; - break; - case E_GIF_ERR_WRITE_FAILED: - Err = "Failed to write to given file"; - break; - case E_GIF_ERR_HAS_SCRN_DSCR: - Err = "Screen descriptor has already been set"; - break; - case E_GIF_ERR_HAS_IMAG_DSCR: - Err = "Image descriptor is still active"; - break; - case E_GIF_ERR_NO_COLOR_MAP: - Err = "Neither global nor local color map"; - break; - case E_GIF_ERR_DATA_TOO_BIG: - Err = "Number of pixels bigger than width * height"; - break; - case E_GIF_ERR_NOT_ENOUGH_MEM: - Err = "Failed to allocate required memory"; - break; - case E_GIF_ERR_DISK_IS_FULL: - Err = "Write failed (disk full?)"; - break; - case E_GIF_ERR_CLOSE_FAILED: - Err = "Failed to close given file"; - break; - case E_GIF_ERR_NOT_WRITEABLE: - Err = "Given file was not opened for write"; - break; - case D_GIF_ERR_OPEN_FAILED: - Err = "Failed to open given file"; - break; - case D_GIF_ERR_READ_FAILED: - Err = "Failed to read from given file"; - break; - case D_GIF_ERR_NOT_GIF_FILE: - Err = "Data is not in GIF format"; - break; - case D_GIF_ERR_NO_SCRN_DSCR: - Err = "No screen descriptor detected"; - break; - case D_GIF_ERR_NO_IMAG_DSCR: - Err = "No Image Descriptor detected"; - break; - case D_GIF_ERR_NO_COLOR_MAP: - Err = "Neither global nor local color map"; - break; - case D_GIF_ERR_WRONG_RECORD: - Err = "Wrong record type detected"; - break; - case D_GIF_ERR_DATA_TOO_BIG: - Err = "Number of pixels bigger than width * height"; - break; - case D_GIF_ERR_NOT_ENOUGH_MEM: - Err = "Failed to allocate required memory"; - break; - case D_GIF_ERR_CLOSE_FAILED: - Err = "Failed to close given file"; - break; - case D_GIF_ERR_NOT_READABLE: - Err = "Given file was not opened for read"; - break; - case D_GIF_ERR_IMAGE_DEFECT: - Err = "Image is defective, decoding aborted"; - break; - case D_GIF_ERR_EOF_TOO_SOON: - Err = "Image EOF detected before image complete"; - break; - default: - Err = NULL; - break; - } - return Err; - } -#endif -}; - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/Geometry.h kodi-15.2~git20151019.1039-final/xbmc/guilib/Geometry.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/Geometry.h 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/Geometry.h 2014-12-18 01:01:56.000000000 +0000 @@ -82,13 +82,6 @@ return *this; }; - bool operator !=(const this_type &point) const - { - if (x != point.x) return true; - if (y != point.y) return true; - return false; - }; - T x, y; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/Gif.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/Gif.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/Gif.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/Gif.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,679 +0,0 @@ -/* -* Copyright (C) 2005-2014 Team XBMC -* http://www.xbmc.org -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ -#include "system.h" -#if defined(HAS_GIFLIB) -#include "Gif.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "guilib/Texture.h" -#include "filesystem/File.h" -#include - -#define UNSIGNED_LITTLE_ENDIAN(lo, hi) ((lo) | ((hi) << 8)) -#define GIF_MAX_MEMORY 82944000U // about 79 MB, which is equivalent to 10 full hd frames. - -class Gifreader -{ -public: - unsigned char* buffer; - unsigned int buffSize; - unsigned int readPosition; - - Gifreader() : buffer(nullptr), buffSize(0), readPosition(0) {} -}; - -int ReadFromMemory(GifFileType* gif, GifByteType* gifbyte, int len) -{ - unsigned int alreadyRead = static_cast(gif->UserData)->readPosition; - int buffSizeLeft = static_cast(gif->UserData)->buffSize - alreadyRead; - int readBytes = len; - - if (len <= 0) - readBytes = 0; - - if (len > buffSizeLeft) - readBytes = buffSizeLeft; - - if (readBytes > 0) - { - unsigned char* src = static_cast(gif->UserData)->buffer + alreadyRead; - memcpy(gifbyte, src, readBytes); - static_cast(gif->UserData)->readPosition += readBytes; - } - return readBytes; -} - -int ReadFromVfs(GifFileType* gif, GifByteType* gifbyte, int len) -{ - XFILE::CFile *gifFile = static_cast(gif->UserData); - return gifFile->Read(gifbyte, len); -} - - -Gif::Gif() : - m_imageSize(0), - m_pitch(0), - m_loops(0), - m_numFrames(0), - m_filename(""), - m_gif(nullptr), - m_pTemplate(nullptr), - m_isAnimated(-1) -{ - if (!m_dll.Load()) - CLog::Log(LOGERROR, "Gif::Gif(): Could not load giflib"); - m_gifFile = new XFILE::CFile(); -} - -Gif::~Gif() -{ - if (m_dll.IsLoaded()) - { - Close(m_gif); - - m_dll.Unload(); - Release(); - } - delete m_gifFile; -} - -void Gif::Close(GifFileType* gif) -{ - int err = 0; - int reason = 0; -#if GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1 - err = m_dll.DGifCloseFile(gif, &reason); -#else - err = m_dll.DGifCloseFile(gif); -#if GIFLIB_MAJOR < 5 - reason = m_dll.GifLastError(); -#endif - if (err == GIF_ERROR) - free(gif); -#endif - if (err == GIF_ERROR) - PrettyPrintError(StringUtils::Format("Gif::~Gif(): closing file %s failed", memOrFile().c_str()), reason); -} - -void Gif::Release() -{ - delete[] m_pTemplate; - m_pTemplate = nullptr; - m_globalPalette.clear(); - m_frames.clear(); -} - -void Gif::ConvertColorTable(std::vector &dest, ColorMapObject* src, unsigned int size) -{ - for (unsigned int i = 0; i < size; ++i) - { - GifColor c; - - c.r = src->Colors[i].Red; - c.g = src->Colors[i].Green; - c.b = src->Colors[i].Blue; - c.a = 0xff; - dest.push_back(c); - } -} - -bool Gif::LoadGifMetaData(GifFileType* gif) -{ - if (!m_dll.IsLoaded() || !Slurp(gif)) - return false; - - m_height = gif->SHeight; - m_width = gif->SWidth; - if (!m_height || !m_width) - { - CLog::Log(LOGERROR, "Gif::LoadGif(): Zero sized image. File %s", memOrFile().c_str()); - return false; - } - - m_numFrames = gif->ImageCount; - if (m_numFrames > 0) - { - ExtensionBlock* extb = gif->SavedImages[0].ExtensionBlocks; - if (extb && extb->Function == APPLICATION_EXT_FUNC_CODE) - { - // Read number of loops - if (++extb && extb->Function == CONTINUE_EXT_FUNC_CODE) - { - uint8_t low = static_cast(extb->Bytes[1]); - uint8_t high = static_cast(extb->Bytes[2]); - m_loops = UNSIGNED_LITTLE_ENDIAN(low, high); - } - } - } - else - { - CLog::Log(LOGERROR, "Gif::LoadGif(): No images found in file %s", memOrFile().c_str()); - return false; - } - - m_pitch = m_width * sizeof(GifColor); - m_imageSize = m_pitch * m_height; - unsigned long memoryUsage = m_numFrames * m_imageSize; - if (memoryUsage > GIF_MAX_MEMORY) - { - // at least 1 image - m_numFrames = std::max(1U, GIF_MAX_MEMORY / m_imageSize); - CLog::Log(LOGERROR, "Gif::LoadGif(): Memory consumption too high: %lu bytes. Restricting animation to %u. File %s", memoryUsage, m_numFrames, memOrFile().c_str()); - } - - return true; -} - -bool Gif::LoadGifMetaData(const char* file) -{ - if (!m_dll.IsLoaded()) - return false; - - m_gifFile->Close(); - if (!m_gifFile->Open(file) || !Open(m_gif, m_gifFile, ReadFromVfs)) - return false; - - return LoadGifMetaData(m_gif); -} - -bool Gif::Slurp(GifFileType* gif) -{ - if (m_dll.DGifSlurp(gif) == GIF_ERROR) - { - int reason = 0; -#if GIFLIB_MAJOR == 5 - reason = gif->Error; -#else - reason = m_dll.GifLastError(); -#endif - PrettyPrintError(StringUtils::Format("Gif::LoadGif(): Could not read file %s", memOrFile().c_str()), reason); - return false; - } - - return true; -} - -bool Gif::LoadGif(const char* file) -{ - m_filename = file; - if (!LoadGifMetaData(m_filename.c_str())) - return false; - - try - { - InitTemplateAndColormap(); - - int extractedFrames = ExtractFrames(m_numFrames); - if (extractedFrames < 0) - { - CLog::Log(LOGDEBUG, "Gif::LoadGif(): Could not extract any frame. File %s", memOrFile().c_str()); - return false; - } - else if (extractedFrames < (int)m_numFrames) - { - CLog::Log(LOGDEBUG, "Gif::LoadGif(): Could only extract %d/%d frames. File %s", extractedFrames, m_numFrames, memOrFile().c_str()); - m_numFrames = extractedFrames; - } - - return true; - } - catch (std::bad_alloc& ba) - { - CLog::Log(LOGERROR, "Gif::Load(): Out of memory while reading file %s - %s", memOrFile().c_str(), ba.what()); - Release(); - return false; - } -} - -bool Gif::IsAnimated(const char* file) -{ - if (!m_dll.IsLoaded()) - return false; - - if (m_isAnimated < 0) - { - m_filename = file; - m_isAnimated = 0; - - GifFileType* gif = nullptr; - XFILE::CFile gifFile; - - if (!gifFile.Open(file) || !Open(gif, &gifFile, ReadFromVfs)) - return false; - - if (gif) - { - if (Slurp(gif) && gif->ImageCount > 1) - m_isAnimated = 1; - - Close(gif); - gifFile.Close(); - } - } - return m_isAnimated > 0; -} - -bool Gif::Open(GifFileType*& gif, void *dataPtr, InputFunc readFunc) -{ - int err = 0; -#if GIFLIB_MAJOR == 5 - gif = m_dll.DGifOpen(dataPtr, readFunc, &err); -#else - gif = m_dll.DGifOpen(dataPtr, readFunc); - if (!gif) - err = m_dll.GifLastError(); -#endif - - if (!gif) - { - PrettyPrintError(StringUtils::Format("Gif::Open(): Could not open file %s", memOrFile().c_str()), err); - return false; - } - - return true; -} - -void Gif::InitTemplateAndColormap() -{ - m_pTemplate = new unsigned char[m_imageSize]; - memset(m_pTemplate, 0, m_imageSize); - - if (m_gif->SColorMap) - { - m_globalPalette.clear(); - ConvertColorTable(m_globalPalette, m_gif->SColorMap, m_gif->SColorMap->ColorCount); - } - else - m_globalPalette.clear(); -} - -bool Gif::GcbToFrame(GifFrame &frame, unsigned int imgIdx) -{ - int transparent = -1; - frame.m_delay = 0; - frame.m_disposal = 0; - - if (m_gif->ImageCount > 0) - { -#if GIFLIB_MAJOR == 5 - GraphicsControlBlock gcb; - if (!m_dll.DGifSavedExtensionToGCB(m_gif, imgIdx, &gcb)) - { - PrettyPrintError(StringUtils::Format("Gif::GcbToFrame(): Could not read GraphicsControlBlock of frame %d in file %s", - imgIdx, memOrFile().c_str()), m_gif->Error); - return false; - } - // delay in ms - frame.m_delay = gcb.DelayTime * 10; - frame.m_disposal = gcb.DisposalMode; - transparent = gcb.TransparentColor; -#else - ExtensionBlock* extb = m_gif->SavedImages[imgIdx].ExtensionBlocks; - while (extb && extb->Function != GRAPHICS_EXT_FUNC_CODE) - extb++; - - if (!extb || extb->ByteCount != 4) - { - CLog::Log(LOGERROR, "Gif::GcbToFrame() : Could not read GraphicsControlBlock of frame %d in file %s", - imgIdx, memOrFile().c_str()); - return false; - } - else - { - uint8_t low = static_cast(extb->Bytes[1]); - uint8_t high = static_cast(extb->Bytes[2]); - frame.m_delay = UNSIGNED_LITTLE_ENDIAN(low, high) * 10; - frame.m_disposal = (extb->Bytes[0] >> 2) & 0x07; - if (extb->Bytes[0] & 0x01) - { - transparent = static_cast(extb->Bytes[3]); - } - else - transparent = -1; - } - -#endif - } - - if (transparent >= 0 && (unsigned)transparent < frame.m_palette.size()) - frame.m_palette[transparent].a = 0; - return true; -} - -int Gif::ExtractFrames(unsigned int count) -{ - if (!m_gif) - return -1; - - if (!m_pTemplate) - { - CLog::Log(LOGDEBUG, "Gif::ExtractFrames(): No frame template available"); - return -1; - } - - int extracted = 0; - for (unsigned int i = 0; i < count; i++) - { - FramePtr frame(new GifFrame); - SavedImage savedImage = m_gif->SavedImages[i]; - GifImageDesc imageDesc = m_gif->SavedImages[i].ImageDesc; - frame->m_height = imageDesc.Height; - frame->m_width = imageDesc.Width; - frame->m_top = imageDesc.Top; - frame->m_left = imageDesc.Left; - - if (frame->m_top + frame->m_height > m_height || frame->m_left + frame->m_width > m_width - || !frame->m_width || !frame->m_height - || frame->m_width > m_width || frame->m_height > m_height) - { - CLog::Log(LOGDEBUG, "Gif::ExtractFrames(): Illegal frame dimensions: width: %d, height: %d, left: %d, top: %d instead of (%d,%d), skip it", - frame->m_width, frame->m_height, frame->m_left, frame->m_top, m_width, m_height); - continue; - } - - if (imageDesc.ColorMap) - { - frame->m_palette.clear(); - ConvertColorTable(frame->m_palette, imageDesc.ColorMap, imageDesc.ColorMap->ColorCount); - // TODO save a backup of the palette for frames without a table in case there's no global table. - } - else if (m_gif->SColorMap) - { - frame->m_palette = m_globalPalette; - } - else - { - CLog::Log(LOGDEBUG, "Gif::ExtractFrames(): No color map found for frame %d, skip it", i); - continue; - } - - // fill delay, disposal and transparent color into frame - if (!GcbToFrame(*frame, i)) - { - CLog::Log(LOGDEBUG, "Gif::ExtractFrames(): Corrupted Graphics Control Block for frame %d, skip it", i); - continue; - } - - frame->m_pImage = new unsigned char[m_imageSize]; - frame->m_imageSize = m_imageSize; - memcpy(frame->m_pImage, m_pTemplate, m_imageSize); - - ConstructFrame(*frame, savedImage.RasterBits); - - if (!PrepareTemplate(*frame)) - { - CLog::Log(LOGDEBUG, "Gif::ExtractFrames(): Could not prepare template after frame %d, skip it", i); - continue; - } - - extracted++; - m_frames.push_back(frame); - } - return extracted; -} - -void Gif::ConstructFrame(GifFrame &frame, const unsigned char* src) const -{ - size_t paletteSize = frame.m_palette.size(); - - for (unsigned int dest_y = frame.m_top, src_y = 0; src_y < frame.m_height; ++dest_y, ++src_y) - { - unsigned char *to = frame.m_pImage + (dest_y * m_pitch) + (frame.m_left * sizeof(GifColor)); - - const unsigned char *from = src + (src_y * frame.m_width); - for (unsigned int src_x = 0; src_x < frame.m_width; ++src_x) - { - unsigned char index = *from++; - - if (index >= paletteSize) - { - CLog::Log(LOGDEBUG, "Gif::ConstructFrame(): Pixel (%d,%d) has no valid palette entry, skip it", src_x, src_y); - continue; - } - - GifColor col = frame.m_palette[index]; - if (col.a != 0) - memcpy(to, &col, sizeof(GifColor)); - - to += 4; - } - } -} - -bool Gif::PrepareTemplate(GifFrame &frame) -{ - switch (frame.m_disposal) - { - /* No disposal specified. */ - case DISPOSAL_UNSPECIFIED: - /* Leave image in place */ - case DISPOSE_DO_NOT: - memcpy(m_pTemplate, frame.m_pImage, m_imageSize); - break; - - /* - Clear the frame's area to transparency. - The disposal names is misleading. Do not restore to the background color because - this part of the specification is ignored by all browsers/image viewers. - */ - case DISPOSE_BACKGROUND: - { - ClearFrameAreaToTransparency(m_pTemplate, frame); - break; - } - /* Restore to previous content */ - case DISPOSE_PREVIOUS: - { - - /* - * This disposal method makes no sense for the first frame - * Since browsers etc. handle that too, we'll fall back to DISPOSE_DO_NOT - */ - if (m_frames.empty()) - { - frame.m_disposal = DISPOSE_DO_NOT; - return PrepareTemplate(frame); - } - - bool valid = false; - - for (int i = m_frames.size() - 1; i >= 0; --i) - { - if (m_frames[i]->m_disposal != DISPOSE_PREVIOUS) - { - memcpy(m_pTemplate, m_frames[i]->m_pImage, m_imageSize); - valid = true; - break; - } - } - if (!valid) - { - CLog::Log(LOGDEBUG, "Gif::PrepareTemplate(): Disposal method DISPOSE_PREVIOUS encountered, but could not find a suitable frame."); - return false; - } - break; - } - default: - { - CLog::Log(LOGDEBUG, "Gif::PrepareTemplate(): Unknown disposal method: %d. Using DISPOSAL_UNSPECIFIED, the animation might be wrong now.", frame.m_disposal); - frame.m_disposal = DISPOSAL_UNSPECIFIED; - return PrepareTemplate(frame); - } - } - return true; -} - -void Gif::ClearFrameAreaToTransparency(unsigned char* dest, const GifFrame &frame) -{ - for (unsigned int dest_y = frame.m_top, src_y = 0; src_y < frame.m_height; ++dest_y, ++src_y) - { - unsigned char *to = dest + (dest_y * m_pitch) + (frame.m_left * sizeof(GifColor)); - for (unsigned int src_x = 0; src_x < frame.m_width; ++src_x) - { - to += 3; - *to++ = 0; - } - } -} - -bool Gif::LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height) -{ - if (!m_dll.IsLoaded()) - return false; - - if (!buffer || !bufSize || !width || !height) - return false; - - Gifreader reader; - reader.buffer = buffer; - reader.buffSize = bufSize; - - if (!Open(m_gif, static_cast(&reader), ReadFromMemory)) - return false; - - if (!LoadGifMetaData(m_gif)) - return false; - - m_originalWidth = m_width; - m_originalHeight = m_height; - - try - { - InitTemplateAndColormap(); - - int extractedFrames = ExtractFrames(m_numFrames); - if (extractedFrames < 0) - { - CLog::Log(LOGDEBUG, "Gif::LoadGif(): Could not extract any frame. File %s", memOrFile().c_str()); - return false; - } - else if (extractedFrames < (int)m_numFrames) - { - CLog::Log(LOGDEBUG, "Gif::LoadGif(): Could only extract %d/%d frames. File %s", extractedFrames, m_numFrames, memOrFile().c_str()); - m_numFrames = extractedFrames; - } - - return true; - } - catch (std::bad_alloc& ba) - { - CLog::Log(LOGERROR, "Gif::LoadImageFromMemory(): Out of memory while extracting gif frames - %s", ba.what()); - Release(); - return false; - } - - return true; -} - -bool Gif::Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format) -{ - if (m_width == 0 || m_height == 0 - || !m_dll.IsLoaded() || !m_gif - || format != XB_FMT_A8R8G8B8 || !m_numFrames) - return false; - - if (m_frames.empty() || !m_frames[0]->m_pImage) - return false; - - const unsigned char *src = m_frames[0]->m_pImage; - unsigned char* dst = pixels; - - unsigned int copyHeight = std::min(m_height, height); - unsigned int copyPitch = std::min(m_pitch, pitch); - - if (pitch == m_pitch && copyHeight == m_height) - { - memcpy(dst, src, m_imageSize); - } - else - { - for (unsigned int y = 0; y < copyHeight; y++) - { - memcpy(dst, src, copyPitch); - src += m_pitch; - dst += pitch; - } - } - - return true; -} - -bool Gif::CreateThumbnailFromSurface(unsigned char* bufferin, unsigned int width, unsigned int height, unsigned int format, unsigned int pitch, const std::string& destFile, - unsigned char* &bufferout, unsigned int &bufferoutSize) -{ - CLog::Log(LOGERROR, "Gif::CreateThumbnailFromSurface(): Not implemented. Something went wrong, we don't store thumbnails as gifs!"); - return false; -} - -void Gif::PrettyPrintError(std::string messageTemplate, int reason) -{ - const char* error = m_dll.GifErrorString(reason); - std::string message; - if (error) - { - message = StringUtils::Format(messageTemplate.append(" - %s").c_str(), error); - } - else - { - message = messageTemplate.append(" (reason unknown)"); - } - CLog::Log(LOGERROR, "%s", message.c_str()); -} - -GifFrame::GifFrame() : - m_pImage(nullptr), - m_delay(0), - m_imageSize(0), - m_height(0), - m_width(0), - m_top(0), - m_left(0), - m_disposal(0) -{} - - -GifFrame::GifFrame(const GifFrame& src) : - m_pImage(nullptr), - m_delay(src.m_delay), - m_imageSize(src.m_imageSize), - m_height(src.m_height), - m_width(src.m_width), - m_top(src.m_top), - m_left(src.m_left), - m_disposal(src.m_disposal) -{ - if (src.m_pImage) - { - m_pImage = new unsigned char[m_imageSize]; - memcpy(m_pImage, src.m_pImage, m_imageSize); - } - - if (src.m_palette.size()) - { - m_palette = src.m_palette; - } -} - -GifFrame::~GifFrame() -{ - delete[] m_pImage; - m_pImage = nullptr; -} -#endif//HAS_GIFLIB diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/Gif.h kodi-15.2~git20151019.1039-final/xbmc/guilib/Gif.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/Gif.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/Gif.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -#pragma once - -/* - * Copyright (C) 2005-2014 Team XBMC - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "guilib/iimage.h" -#include "DllLibGif.h" -#include -#include -#include "URL.h" - -namespace XFILE -{ - class CFile; -}; - -#pragma pack(1) -struct GifColor -{ - uint8_t b, g, r, a; -}; -#pragma pack() - - -class GifFrame -{ - friend class Gif; - -public: - - GifFrame(); - virtual ~GifFrame(); - - unsigned char* m_pImage; - unsigned int m_delay; - -private: - GifFrame(const GifFrame& src); - - unsigned int m_imageSize; - unsigned int m_height; - unsigned int m_width; - unsigned int m_top; - unsigned int m_left; - std::vector m_palette; - unsigned int m_disposal; -}; - -class Gif : public IImage -{ -public: - typedef std::shared_ptr FramePtr; - - Gif(); - virtual ~Gif(); - - bool LoadGifMetaData(const char* file); - bool LoadGif(const char* file); - - virtual bool LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height); - virtual bool Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format); - virtual bool CreateThumbnailFromSurface(unsigned char* bufferin, unsigned int width, unsigned int height, unsigned int format, unsigned int pitch, const std::string& destFile, - unsigned char* &bufferout, unsigned int &bufferoutSize); - bool IsAnimated(const char* file); - const std::vector& GetFrames() const { return m_frames; } - unsigned int GetPitch() const { return m_pitch; } - unsigned int GetNumLoops() const { return m_loops; } - -private: - std::vector m_frames; - unsigned int m_imageSize; - unsigned int m_pitch; - unsigned int m_loops; - unsigned int m_numFrames; - - DllLibGif m_dll; - std::string m_filename; - GifFileType* m_gif; - std::vector m_globalPalette; - unsigned char* m_pTemplate; - int m_isAnimated; - XFILE::CFile* m_gifFile; - - void InitTemplateAndColormap(); - bool LoadGifMetaData(GifFileType* gif); - bool Open(GifFileType*& gif, void *dataPtr, InputFunc readFunc); - void Close(GifFileType* gif); - bool Slurp(GifFileType* gif); - static void ConvertColorTable(std::vector &dest, ColorMapObject* src, unsigned int size); - bool GcbToFrame(GifFrame &frame, unsigned int imgIdx); - int ExtractFrames(unsigned int count); - void ClearFrameAreaToTransparency(unsigned char* dest, const GifFrame &frame); - void ConstructFrame(GifFrame &frame, const unsigned char* src) const; - bool PrepareTemplate(GifFrame &frame); - void Release(); - void PrettyPrintError(std::string messageTemplate, int reason); - - inline std::string memOrFile() - { - return m_filename.empty() ? std::string("memory file") : CURL::GetRedacted(m_filename); - } - -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GraphicContext.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GraphicContext.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GraphicContext.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GraphicContext.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,7 @@ #include "system.h" #include "GraphicContext.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "settings/AdvancedSettings.h" #include "settings/DisplaySettings.h" #include "settings/lib/Setting.h" @@ -33,7 +33,7 @@ #include "GUIWindowManager.h" #include "video/VideoReferenceClock.h" -using namespace KODI::MESSAGING; +using namespace std; extern bool g_fullScreen; @@ -73,7 +73,7 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN) + if (settingId == "videoscreen.fakefullscreen") { if (IsFullScreenRoot()) SetVideoResolution(GetVideoResolution(), true); @@ -244,7 +244,7 @@ g_Windowing.SetViewPort(newviewport); - UpdateCameraPosition(m_cameras.top(), m_stereoFactors.top()); + UpdateCameraPosition(m_cameras.top()); return true; } @@ -256,7 +256,7 @@ CRect viewport = StereoCorrection(m_viewStack.top()); g_Windowing.SetViewPort(viewport); - UpdateCameraPosition(m_cameras.top(), m_stereoFactors.top()); + UpdateCameraPosition(m_cameras.top()); } CPoint CGraphicContext::StereoCorrection(const CPoint &point) const @@ -331,11 +331,11 @@ #if defined(HAS_VIDEO_PLAYBACK) if(m_bFullScreenRoot) { - bool allowDesktopRes = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE) == ADJUST_REFRESHRATE_ALWAYS; + bool allowDesktopRes = CSettings::Get().GetInt("videoplayer.adjustrefreshrate") == ADJUST_REFRESHRATE_ALWAYS; if(m_bFullScreenVideo || (!allowDesktopRes && g_application.m_pPlayer->IsPlayingVideo())) SetVideoResolution(g_renderManager.GetResolution()); - else if(CDisplaySettings::GetInstance().GetCurrentResolution() > RES_DESKTOP) - SetVideoResolution(CDisplaySettings::GetInstance().GetCurrentResolution()); + else if(CDisplaySettings::Get().GetCurrentResolution() > RES_DESKTOP) + SetVideoResolution(CDisplaySettings::Get().GetCurrentResolution()); else SetVideoResolution(RES_DESKTOP); } @@ -363,7 +363,7 @@ bool CGraphicContext::IsValidResolution(RESOLUTION res) { - if (res >= RES_WINDOW && (size_t) res <= CDisplaySettings::GetInstance().ResolutionInfoSize()) + if (res >= RES_WINDOW && (size_t) res <= CDisplaySettings::Get().ResolutionInfoSize()) { return true; } @@ -380,7 +380,10 @@ } else { - CApplicationMessenger::GetInstance().SendMsg(TMSG_SETVIDEORESOLUTION, res, forceUpdate ? 1 : 0); + ThreadMessage msg = {TMSG_SETVIDEORESOLUTION}; + msg.param1 = res; + msg.param2 = forceUpdate ? 1 : 0; + CApplicationMessenger::Get().SendMessage(msg, true); } } @@ -405,11 +408,11 @@ if ((res != RES_DESKTOP && res != RES_WINDOW) || (lastRes != RES_DESKTOP && lastRes != RES_WINDOW)) { //pause the player during the refreshrate change - int delay = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_PAUSEAFTERREFRESHCHANGE); - if (delay > 0 && CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE) != ADJUST_REFRESHRATE_OFF && g_application.m_pPlayer->IsPlayingVideo() && !g_application.m_pPlayer->IsPausedPlayback()) + int delay = CSettings::Get().GetInt("videoplayer.pauseafterrefreshchange"); + if (delay > 0 && CSettings::Get().GetInt("videoplayer.adjustrefreshrate") != ADJUST_REFRESHRATE_OFF && g_application.m_pPlayer->IsPlayingVideo() && !g_application.m_pPlayer->IsPausedPlayback()) { g_application.m_pPlayer->Pause(); - KODI::MESSAGING::ThreadMessage msg{TMSG_MEDIA_UNPAUSE}; + ThreadMessage msg = {TMSG_MEDIA_UNPAUSE}; CDelayedMessage* pauseMessage = new CDelayedMessage(msg, delay * 100); pauseMessage->Create(true); } @@ -428,8 +431,8 @@ Lock(); - RESOLUTION_INFO info_org = CDisplaySettings::GetInstance().GetResolutionInfo(res); - RESOLUTION_INFO info_last = CDisplaySettings::GetInstance().GetResolutionInfo(lastRes); + RESOLUTION_INFO info_org = CDisplaySettings::Get().GetResolutionInfo(res); + RESOLUTION_INFO info_last = CDisplaySettings::Get().GetResolutionInfo(lastRes); RENDER_STEREO_MODE stereo_mode = m_stereoMode; @@ -451,7 +454,7 @@ m_stereoView = RENDER_STEREO_VIEW_OFF; m_stereoMode = stereo_mode; m_nextStereoMode = stereo_mode; - CSettings::GetInstance().SetInt(CSettings::SETTING_VIDEOSCREEN_STEREOSCOPICMODE, (int)m_stereoMode); + CSettings::Get().SetInt("videoscreen.stereoscopicmode", (int)m_stereoMode); } RESOLUTION_INFO info_mod = GetResInfo(res); @@ -466,7 +469,7 @@ if (g_advancedSettings.m_fullScreen) { #if defined (TARGET_DARWIN) || defined (TARGET_WINDOWS) - bool blankOtherDisplays = CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_BLANKDISPLAYS); + bool blankOtherDisplays = CSettings::Get().GetBool("videoscreen.blankdisplays"); g_Windowing.SetFullScreen(true, info_org, blankOtherDisplays); #else g_Windowing.SetFullScreen(true, info_org, false); @@ -485,7 +488,7 @@ // update anyone that relies on sizing information g_renderManager.Recover(); - CInputManager::GetInstance().SetMouseResolution(info_org.iWidth, info_org.iHeight, 1, 1); + CInputManager::Get().SetMouseResolution(info_org.iWidth, info_org.iHeight, 1, 1); g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_WINDOW_RESIZE); Unlock(); @@ -559,7 +562,7 @@ void CGraphicContext::ResetScreenParameters(RESOLUTION res) { // For now these are all on the first screen. - RESOLUTION_INFO& info = CDisplaySettings::GetInstance().GetResolutionInfo(res); + RESOLUTION_INFO& info = CDisplaySettings::Get().GetResolutionInfo(res); info.iScreen = 0; @@ -707,7 +710,7 @@ const RESOLUTION_INFO CGraphicContext::GetResInfo(RESOLUTION res) const { - RESOLUTION_INFO info = CDisplaySettings::GetInstance().GetResolutionInfo(res); + RESOLUTION_INFO info = CDisplaySettings::Get().GetResolutionInfo(res); if(m_stereoMode == RENDER_STEREO_MODE_SPLIT_HORIZONTAL) { @@ -746,7 +749,7 @@ void CGraphicContext::SetResInfo(RESOLUTION res, const RESOLUTION_INFO& info) { - RESOLUTION_INFO& curr = CDisplaySettings::GetInstance().GetResolutionInfo(res); + RESOLUTION_INFO& curr = CDisplaySettings::Get().GetResolutionInfo(res); curr.Overscan = info.Overscan; curr.iSubtitles = info.iSubtitles; curr.fPixelRatio = info.fPixelRatio; @@ -781,7 +784,7 @@ float fToHeight = (float)info.Overscan.bottom - fToPosY; if(!g_guiSkinzoom) // lookup gui setting if we didn't have it already - g_guiSkinzoom = (CSettingInt*)CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKINZOOM); + g_guiSkinzoom = (CSettingInt*)CSettings::Get().GetSetting("lookandfeel.skinzoom"); float fZoom = 1.0f; if(g_guiSkinzoom) @@ -832,9 +835,6 @@ while (!m_cameras.empty()) m_cameras.pop(); m_cameras.push(CPoint(0.5f*m_iScreenWidth, 0.5f*m_iScreenHeight)); - while (!m_stereoFactors.empty()) - m_stereoFactors.pop(); - m_stereoFactors.push(0.0f); // and reset the final transform m_finalTransform = m_guiTransform; @@ -845,7 +845,7 @@ { Lock(); SetScalingResolution(res, needsScaling); - UpdateCameraPosition(m_cameras.top(), m_stereoFactors.top()); + UpdateCameraPosition(m_cameras.top()); Unlock(); } @@ -890,27 +890,14 @@ cam.y *= (float)m_iScreenHeight / m_windowResolution.iHeight; m_cameras.push(cam); - UpdateCameraPosition(m_cameras.top(), m_stereoFactors.top()); + UpdateCameraPosition(m_cameras.top()); } void CGraphicContext::RestoreCameraPosition() { // remove the top camera from the stack assert(m_cameras.size()); m_cameras.pop(); - UpdateCameraPosition(m_cameras.top(), m_stereoFactors.top()); -} - -void CGraphicContext::SetStereoFactor(float factor) -{ - m_stereoFactors.push(factor); - UpdateCameraPosition(m_cameras.top(), m_stereoFactors.top()); -} - -void CGraphicContext::RestoreStereoFactor() -{ // remove the top factor from the stack - assert(m_stereoFactors.size()); - m_stereoFactors.pop(); - UpdateCameraPosition(m_cameras.top(), m_stereoFactors.top()); + UpdateCameraPosition(m_cameras.top()); } CRect CGraphicContext::generateAABB(const CRect &rect) const @@ -940,10 +927,10 @@ ScaleFinalCoords(x4, y4, z); g_Windowing.Project(x4, y4, z); - return CRect( std::min(std::min(std::min(x1, x2), x3), x4), - std::min(std::min(std::min(y1, y2), y3), y4), - std::max(std::max(std::max(x1, x2), x3), x4), - std::max(std::max(std::max(y1, y2), y3), y4)); + return CRect( min(min(min(x1, x2), x3), x4), + min(min(min(y1, y2), y3), y4), + max(max(max(x1, x2), x3), x4), + max(max(max(y1, y2), y3), y4)); } // NOTE: This routine is currently called (twice) every time there is a @@ -953,20 +940,9 @@ // the camera has changed, and if so, changes it. Similarly, it could set // the world transform at that point as well (or even combine world + view // to cut down on one setting) -void CGraphicContext::UpdateCameraPosition(const CPoint &camera, const float &factor) +void CGraphicContext::UpdateCameraPosition(const CPoint &camera) { - float stereoFactor = 0.f; - if ( m_stereoMode != RENDER_STEREO_MODE_OFF - && m_stereoMode != RENDER_STEREO_MODE_MONO - && m_stereoView != RENDER_STEREO_VIEW_OFF) - { - RESOLUTION_INFO res = GetResInfo(); - RESOLUTION_INFO desktop = GetResInfo(RES_DESKTOP); - float scaleRes = (static_cast(res.iWidth) / static_cast(desktop.iWidth)); - float scaleX = static_cast(CSettings::GetInstance().GetInt(CSettings::SETTING_LOOKANDFEEL_STEREOSTRENGTH)) * scaleRes; - stereoFactor = factor * (m_stereoView == RENDER_STEREO_VIEW_LEFT ? scaleX : -scaleX); - } - g_Windowing.SetCameraPosition(camera, m_iScreenWidth, m_iScreenHeight, stereoFactor); + g_Windowing.SetCameraPosition(camera, m_iScreenWidth, m_iScreenHeight); } bool CGraphicContext::RectIsAngled(float x1, float y1, float x2, float y2) const @@ -1019,8 +995,8 @@ } else { - if (CDisplaySettings::GetInstance().GetCurrentResolution() > RES_DESKTOP) - uiRes = CDisplaySettings::GetInstance().GetCurrentResolution(); + if (CDisplaySettings::Get().GetCurrentResolution() > RES_DESKTOP) + uiRes = CDisplaySettings::Get().GetCurrentResolution(); else uiRes = (RESOLUTION) g_Windowing.DesktopResolution(g_Windowing.GetCurrentScreen()); @@ -1043,7 +1019,7 @@ #endif } - CDisplaySettings::GetInstance().SetCurrentResolution(uiRes, true); + CDisplaySettings::Get().SetCurrentResolution(uiRes, true); if (setVideoRes) { @@ -1081,13 +1057,13 @@ g_Windowing.RestoreHardwareTransform(); } -void CGraphicContext::GetAllowedResolutions(std::vector &res) +void CGraphicContext::GetAllowedResolutions(vector &res) { res.clear(); res.push_back(RES_WINDOW); res.push_back(RES_DESKTOP); - for (size_t r = (size_t) RES_CUSTOM; r < CDisplaySettings::GetInstance().ResolutionInfoSize(); r++) + for (size_t r = (size_t) RES_CUSTOM; r < CDisplaySettings::Get().ResolutionInfoSize(); r++) { res.push_back((RESOLUTION) r); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GraphicContext.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GraphicContext.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GraphicContext.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GraphicContext.h 2015-10-19 08:39:16.000000000 +0000 @@ -78,7 +78,7 @@ CGraphicContext(void); virtual ~CGraphicContext(void); - virtual void OnSettingChanged(const CSetting *setting) override; + virtual void OnSettingChanged(const CSetting *setting); // the following two functions should wrap any // GL calls to maintain thread safety @@ -164,8 +164,6 @@ void SetStereoMode(RENDER_STEREO_MODE mode) { m_nextStereoMode = mode; } RENDER_STEREO_MODE GetStereoMode() { return m_stereoMode; } void RestoreCameraPosition(); - void SetStereoFactor(float factor); - void RestoreStereoFactor(); /*! \brief Set a region in which to clip all rendering Anything that is rendered after setting a clip region will be clipped so that no part renders outside of the clip region. Successive calls to SetClipRegion intersect the clip region, which @@ -271,7 +269,7 @@ float scaleX; float scaleY; }; - void UpdateCameraPosition(const CPoint &camera, const float &factor); + void UpdateCameraPosition(const CPoint &camera); // this method is indirectly called by the public SetVideoResolution // it only works when called from mainthread (thats what SetVideoResolution ensures) void SetVideoResolutionInternal(RESOLUTION res, bool forceUpdate); @@ -279,7 +277,6 @@ std::stack m_cameras; std::stack m_origins; std::stack m_clipRegions; - std::stack m_stereoFactors; UITransform m_guiTransform; UITransform m_finalTransform; @@ -296,6 +293,6 @@ \brief */ -XBMC_GLOBAL_REF(CGraphicContext,g_graphicsContext); -#define g_graphicsContext XBMC_GLOBAL_USE(CGraphicContext) +XBMC_GLOBAL(CGraphicContext,g_graphicsContext); + #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIAction.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIAction.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIAction.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIAction.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,6 +24,8 @@ #include "GUIControl.h" #include "GUIInfoManager.h" +using namespace std; + CGUIAction::CGUIAction() { m_sendThreadMessages = false; @@ -35,14 +37,14 @@ SetNavigation(controlID); } -bool CGUIAction::ExecuteActions(int controlID, int parentID, const CGUIListItemPtr &item /* = NULL */) const +bool CGUIAction::ExecuteActions(int controlID, int parentID) const { if (m_actions.size() == 0) return false; // take a copy of actions that satisfy our conditions - std::vector actions; + vector actions; for (ciActions it = m_actions.begin() ; it != m_actions.end() ; ++it) { - if (it->condition.empty() || g_infoManager.EvaluateBool(it->condition, 0, item)) + if (it->condition.empty() || g_infoManager.EvaluateBool(it->condition)) { if (!StringUtils::IsInteger(it->action)) actions.push_back(it->action); @@ -50,15 +52,15 @@ } // execute them bool retval = false; - for (std::vector::iterator i = actions.begin(); i != actions.end(); ++i) + for (vector::iterator i = actions.begin(); i != actions.end(); ++i) { - CGUIMessage msg(GUI_MSG_EXECUTE, controlID, parentID, 0, 0, item); + CGUIMessage msg(GUI_MSG_EXECUTE, controlID, parentID); msg.SetStringParam(*i); if (m_sendThreadMessages) g_windowManager.SendThreadMessage(msg); else g_windowManager.SendMessage(msg); - retval = true; + retval |= true; } return retval; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIAction.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIAction.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIAction.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIAction.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,10 +21,8 @@ #include #include -#include class CGUIControl; -class CGUIListItem; typedef std::shared_ptr CGUIListItemPtr; /** * Class containing vector of condition->(action/navigation route) pairs and handling its execution. @@ -38,7 +36,7 @@ /** * Execute actions (no navigation paths), if action is paired with condition - evaluate condition first */ - bool ExecuteActions(int controlID, int parentID, const CGUIListItemPtr &item = NULL) const; + bool ExecuteActions(int controlID, int parentID) const; /** * Check if there is any action that meet its condition */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIAudioManager.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIAudioManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIAudioManager.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIAudioManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,6 +32,8 @@ #include "cores/AudioEngine/AEFactory.h" #include "utils/log.h" +using namespace std; + CGUIAudioManager g_audioManager; CGUIAudioManager::CGUIAudioManager() @@ -49,7 +51,7 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_LOOKANDFEEL_SOUNDSKIN) + if (settingId == "lookandfeel.soundskin") { Enable(true); Load(); @@ -61,13 +63,12 @@ if (setting == NULL) return false; - if (setting->GetId() == CSettings::SETTING_LOOKANDFEEL_SOUNDSKIN) + if (setting->GetId() == "lookandfeel.soundskin") { - //Migrate the old settings - if (((CSettingString*)setting)->GetValue() == "SKINDEFAULT") - ((CSettingString*)setting)->Reset(); - else if (((CSettingString*)setting)->GetValue() == "OFF") - ((CSettingString*)setting)->SetValue(""); + //We change to new resource.uisounds.confluence default only if current + //skin is confluence. Otherwise keep it as SKINDEFAULT. + return !(((CSettingString*)setting)->GetValue() == "SKINDEFAULT" + && CSettings::Get().GetString("lookandfeel.skin") == "skin.confluence"); } return true; } @@ -178,7 +179,7 @@ if (!sound) return; - m_pythonSounds.insert(std::pair(strFileName, sound)); + m_pythonSounds.insert(pair(strFileName, sound)); sound->Play(); } @@ -221,22 +222,30 @@ std::string GetSoundSkinPath() { - auto setting = static_cast(CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SOUNDSKIN)); - auto value = setting->GetValue(); - if (value.empty()) + const std::string id = CSettings::Get().GetString("lookandfeel.soundskin"); + if (id == "OFF") return ""; + if (id == "SKINDEFAULT") + return URIUtils::AddFileToFolder(g_SkinInfo->Path(), "sounds"); + ADDON::AddonPtr addon; - if (!ADDON::CAddonMgr::GetInstance().GetAddon(value, addon, ADDON::ADDON_RESOURCE_UISOUNDS)) - { - CLog::Log(LOGNOTICE, "Unknown sounds addon '%s'. Setting default sounds.", value.c_str()); - setting->Reset(); - } - return URIUtils::AddFileToFolder("resource://", setting->GetValue()); + if (ADDON::CAddonMgr::Get().GetAddon(id, addon, ADDON::ADDON_RESOURCE_UISOUNDS)) + return URIUtils::AddFileToFolder("resource://", id); + + //Check special directories + std::string path = URIUtils::AddFileToFolder("special://home/sounds", id); + if (XFILE::CDirectory::Exists(path)) + return path; + + return URIUtils::AddFileToFolder("special://xbmc/sounds", id); } // \brief Load the config file (sounds.xml) for nav sounds +// Can be located in a folder "sounds" in the skin or from a +// subfolder of the folder "sounds" in the root directory of +// xbmc bool CGUIAudioManager::Load() { CSingleLock lock(m_cs); @@ -294,7 +303,7 @@ std::string filename = URIUtils::AddFileToFolder(m_strMediaDir, strFile); IAESound *sound = LoadSound(filename); if (sound) - m_actionSoundMap.insert(std::pair(id, sound)); + m_actionSoundMap.insert(pair(id, sound)); } pAction = pAction->NextSibling(); @@ -323,7 +332,7 @@ sounds.deInitSound = LoadWindowSound(pWindow, "deactivate"); if (id > 0) - m_windowSoundMap.insert(std::pair(id, sounds)); + m_windowSoundMap.insert(pair(id, sounds)); pWindow = pWindow->NextSibling(); } @@ -397,7 +406,7 @@ void CGUIAudioManager::Enable(bool bEnable) { // always deinit audio when we don't want gui sounds - if (CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SOUNDSKIN).empty()) + if (CSettings::Get().GetString("lookandfeel.soundskin")=="OFF") bEnable = false; CSingleLock lock(m_cs); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIAudioManager.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIAudioManager.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIAudioManager.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIAudioManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -54,8 +54,8 @@ CGUIAudioManager(); ~CGUIAudioManager(); - virtual void OnSettingChanged(const CSetting *setting) override; - virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode) override; + virtual void OnSettingChanged(const CSetting *setting); + virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode); void Initialize(); void DeInitialize(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIBaseContainer.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIBaseContainer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIBaseContainer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIBaseContainer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -31,7 +31,8 @@ #include "utils/XBMCTinyXML.h" #include "listproviders/IListProvider.h" #include "settings/Settings.h" -#include "guiinfo/GUIInfoLabels.h" + +using namespace std; #define HOLD_TIME_START 100 #define HOLD_TIME_END 3000 @@ -350,15 +351,6 @@ } break; - case ACTION_SHOW_INFO: - { - if (OnInfo()) - return true; - else if (action.GetID()) - return OnClick(action.GetID()); - } - break; - case ACTION_FIRST_PAGE: SelectItem(0); return true; @@ -432,14 +424,6 @@ SelectItem(message.GetParam1()); return true; } - else if (message.GetMessage() == GUI_MSG_SETFOCUS) - { - if (message.GetParam1()) // subfocus item is specified, so set the offset appropriately - { - int item = std::min(GetOffset() + (int)message.GetParam1() - 1, (int)m_items.size() - 1); - SelectItem(item); - } - } else if (message.GetMessage() == GUI_MSG_ITEM_SELECTED) { message.SetParam1(GetSelectedItem()); @@ -481,7 +465,7 @@ void CGUIBaseContainer::OnUp() { - CGUIAction action = GetAction(ACTION_MOVE_UP); + CGUIAction action = GetNavigateAction(ACTION_MOVE_UP); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == VERTICAL && MoveUp(wrapAround)) return; @@ -491,7 +475,7 @@ void CGUIBaseContainer::OnDown() { - CGUIAction action = GetAction(ACTION_MOVE_DOWN); + CGUIAction action = GetNavigateAction(ACTION_MOVE_DOWN); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == VERTICAL && MoveDown(wrapAround)) return; @@ -501,7 +485,7 @@ void CGUIBaseContainer::OnLeft() { - CGUIAction action = GetAction(ACTION_MOVE_LEFT); + CGUIAction action = GetNavigateAction(ACTION_MOVE_LEFT); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == HORIZONTAL && MoveUp(wrapAround)) return; @@ -516,7 +500,7 @@ void CGUIBaseContainer::OnRight() { - CGUIAction action = GetAction(ACTION_MOVE_RIGHT); + CGUIAction action = GetNavigateAction(ACTION_MOVE_RIGHT); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == HORIZONTAL && MoveDown(wrapAround)) return; @@ -577,7 +561,7 @@ { CGUIListItemPtr item = m_items[i]; std::string label = item->GetLabel(); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) + if (CSettings::Get().GetBool("filelists.ignorethewhensorting")) label = SortUtils::RemoveArticles(label); if (0 == strnicmp(label.c_str(), m_match.c_str(), m_match.size())) { @@ -655,14 +639,11 @@ CGUIListItemPtr CGUIBaseContainer::GetListItem(int offset, unsigned int flag) const { - if (!m_items.size() || !m_layout) + if (!m_items.size()) return CGUIListItemPtr(); int item = GetSelectedItem() + offset; if (flag & INFOFLAG_LISTITEM_POSITION) // use offset from the first item displayed, taking into account scrolling item = CorrectOffset((int)(m_scroller.GetValue() / m_layout->Size(m_orientation)), offset); - - if (flag & INFOFLAG_LISTITEM_ABSOLUTE) // use offset from the first item - item = CorrectOffset(0, offset); if (flag & INFOFLAG_LISTITEM_WRAP) { @@ -761,12 +742,7 @@ { // "select" action int selected = GetSelectedItem(); if (selected >= 0 && selected < (int)m_items.size()) - { - if (m_clickActions.HasAnyActions()) - m_clickActions.ExecuteActions(0, GetParentID(), m_items[selected]); - else - m_listProvider->OnClick(m_items[selected]); - } + m_listProvider->OnClick(m_items[selected]); return true; } // grab the currently focused subitem (if applicable) @@ -804,7 +780,7 @@ CGUIControl::SetFocus(bOnOff); } -void CGUIBaseContainer::SaveStates(std::vector &states) +void CGUIBaseContainer::SaveStates(vector &states) { if (!m_listProvider || !m_listProvider->AlwaysFocusDefaultItem()) states.push_back(CControlState(GetID(), GetSelectedItem())); @@ -1182,8 +1158,6 @@ return (HasNextPage()); case CONTAINER_HAS_PREVIOUS: return (HasPreviousPage()); - case CONTAINER_HAS_PARENT_ITEM: - return (m_items.size() && m_items[0]->IsFileItem() && (std::static_pointer_cast(m_items[0]))->IsParentFolder()); case CONTAINER_SUBITEM: { CGUIListItemLayout *layout = GetFocusedLayout(); @@ -1328,16 +1302,5 @@ if (m_listProvider && m_listProvider->AlwaysFocusDefaultItem()) SelectItem(m_listProvider->GetDefaultItem()); - if (m_focusActions.HasAnyActions()) - m_focusActions.ExecuteActions(GetID(), GetParentID()); - CGUIControl::OnFocus(); } - -void CGUIBaseContainer::OnUnFocus() -{ - if (m_unfocusActions.HasAnyActions()) - m_unfocusActions.ExecuteActions(GetID(), GetParentID()); - - CGUIControl::OnUnFocus(); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIBaseContainer.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIBaseContainer.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIBaseContainer.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIBaseContainer.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,10 +25,8 @@ * */ -#include - -#include "GUIListItemLayout.h" #include "IGUIContainer.h" +#include "GUIListItemLayout.h" #include "utils/Stopwatch.h" /*! @@ -91,10 +89,6 @@ */ void SetRenderOffset(const CPoint &offset); - void SetClickActions(const CGUIAction& clickActions) { m_clickActions = clickActions; }; - void SetFocusActions(const CGUIAction& focusActions) { m_focusActions = focusActions; }; - void SetUnFocusActions(const CGUIAction& unfocusActions) { m_unfocusActions = unfocusActions; }; - void SetAutoScrolling(const TiXmlNode *node); void ResetAutoScrolling(); void UpdateAutoScrolling(unsigned int currentTime); @@ -128,7 +122,6 @@ virtual int GetCurrentPage() const; bool InsideLayout(const CGUIListItemLayout *layout, const CPoint &point) const; virtual void OnFocus(); - virtual void OnUnFocus(); void UpdateListProvider(bool forceRefresh = false); int ScrollCorrectionRange() const; @@ -221,10 +214,6 @@ CStopWatch m_lastScrollStartTimer; CStopWatch m_pageChangeTimer; - CGUIAction m_clickActions; - CGUIAction m_focusActions; - CGUIAction m_unfocusActions; - // letter match searching CStopWatch m_matchTimer; std::string m_match; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIButtonControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIButtonControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIButtonControl.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIButtonControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,18 +22,18 @@ #include "GUIFontManager.h" #include "input/Key.h" -CGUIButtonControl::CGUIButtonControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureFocus, const CTextureInfo& textureNoFocus, const CLabelInfo& labelInfo, bool wrapMultiline) +using namespace std; + +CGUIButtonControl::CGUIButtonControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureFocus, const CTextureInfo& textureNoFocus, const CLabelInfo& labelInfo) : CGUIControl(parentID, controlID, posX, posY, width, height) , m_imgFocus(posX, posY, width, height, textureFocus) , m_imgNoFocus(posX, posY, width, height, textureNoFocus) - , m_label(posX, posY, width, height, labelInfo, wrapMultiline ? CGUILabel::OVER_FLOW_WRAP : CGUILabel::OVER_FLOW_TRUNCATE) + , m_label(posX, posY, width, height, labelInfo) , m_label2(posX, posY, width, height, labelInfo) { m_bSelected = false; m_alpha = 255; m_focusCounter = 0; - m_minWidth = 0; - m_maxWidth = width; ControlType = GUICONTROL_BUTTON; } @@ -43,13 +43,12 @@ void CGUIButtonControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { - ProcessText(currentTime); if (m_bInvalidated) { - m_imgFocus.SetWidth(GetWidth()); + m_imgFocus.SetWidth(m_width); m_imgFocus.SetHeight(m_height); - m_imgNoFocus.SetWidth(GetWidth()); + m_imgNoFocus.SetWidth(m_width); m_imgNoFocus.SetHeight(m_height); } @@ -83,6 +82,7 @@ m_imgFocus.Process(currentTime); m_imgNoFocus.Process(currentTime); + ProcessText(currentTime); CGUIControl::Process(currentTime, dirtyregions); } @@ -110,56 +110,20 @@ return CGUILabel::COLOR_TEXT; } -#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) -float CGUIButtonControl::GetWidth() const -{ - if (m_minWidth && m_minWidth != m_width) - { - float txtWidth = m_label.GetTextWidth() + 2 * m_label.GetLabelInfo().offsetX; - if (m_label2.GetTextWidth()) - { - static const float min_space = 10; - txtWidth += m_label2.GetTextWidth() + 2 * m_label2.GetLabelInfo().offsetX + min_space; - } - float maxWidth = m_maxWidth ? m_maxWidth : txtWidth; - return CLAMP(txtWidth, m_minWidth, maxWidth); - } - return m_width; -} - -void CGUIButtonControl::SetMinWidth(float minWidth) -{ - if (m_minWidth != minWidth) - MarkDirtyRegion(); - - m_minWidth = minWidth; -} - void CGUIButtonControl::ProcessText(unsigned int currentTime) { CRect labelRenderRect = m_label.GetRenderRect(); CRect label2RenderRect = m_label2.GetRenderRect(); - float renderWidth = GetWidth(); - bool changed = m_label.SetMaxRect(m_posX, m_posY, renderWidth, m_height); + bool changed = m_label.SetMaxRect(m_posX, m_posY, m_width, m_height); changed |= m_label.SetText(m_info.GetLabel(m_parentID)); changed |= m_label.SetScrolling(HasFocus()); - changed |= m_label2.SetMaxRect(m_posX, m_posY, renderWidth, m_height); - changed |= m_label2.SetText(m_info2.GetLabel(m_parentID)); - - // text changed - images need resizing - if (m_minWidth && (m_label.GetRenderRect() != labelRenderRect)) - SetInvalid(); - - // auto-width - adjust hitrect - if (m_minWidth && m_width != renderWidth) - { - CRect rect(m_posX, m_posY, renderWidth, m_height); - SetHitRect(rect, m_hitColor); - } // render the second label if it exists - if (!m_info2.GetLabel(m_parentID).empty()) + std::string label2(m_info2.GetLabel(m_parentID)); + changed |= m_label2.SetMaxRect(m_posX, m_posY, m_width, m_height); + changed |= m_label2.SetText(label2); + if (!label2.empty()) { changed |= m_label2.SetAlign(XBFONT_RIGHT | (m_label.GetLabelInfo().align & XBFONT_CENTER_Y) | XBFONT_TRUNCATED); changed |= m_label2.SetScrolling(HasFocus()); @@ -262,22 +226,16 @@ m_imgNoFocus.SetInvalid(); } -void CGUIButtonControl::SetLabel(const std::string &label) +void CGUIButtonControl::SetLabel(const string &label) { // NOTE: No fallback for buttons at this point - if (m_info.GetLabel(GetParentID(), false) != label) - { - m_info.SetLabel(label, "", GetParentID()); - SetInvalid(); - } + m_info.SetLabel(label, "", GetParentID()); + SetInvalid(); } -void CGUIButtonControl::SetLabel2(const std::string &label2) +void CGUIButtonControl::SetLabel2(const string &label2) { // NOTE: No fallback for buttons at this point - if (m_info2.GetLabel(GetParentID(), false) != label2) - { - m_info2.SetLabel(label2, "", GetParentID()); - SetInvalid(); - } + m_info2.SetLabel(label2, "", GetParentID()); + SetInvalid(); } void CGUIButtonControl::SetPosition(float posX, float posY) @@ -335,7 +293,7 @@ return strLabel; } -void CGUIButtonControl::PythonSetLabel(const std::string &strFont, const std::string &strText, color_t textColor, color_t shadowColor, color_t focusedColor) +void CGUIButtonControl::PythonSetLabel(const std::string &strFont, const string &strText, color_t textColor, color_t shadowColor, color_t focusedColor) { m_label.GetLabelInfo().font = g_fontManager.GetFont(strFont); m_label.GetLabelInfo().textColor = textColor; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIButtonControl.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIButtonControl.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIButtonControl.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIButtonControl.h 2015-10-19 08:39:16.000000000 +0000 @@ -42,7 +42,7 @@ CGUIButtonControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureFocus, const CTextureInfo& textureNoFocus, - const CLabelInfo &label, bool wrapMultiline = false); + const CLabelInfo &label); virtual ~CGUIButtonControl(void); virtual CGUIButtonControl *Clone() const { return new CGUIButtonControl(*this); }; @@ -67,8 +67,6 @@ virtual std::string GetLabel2() const; void SetSelected(bool bSelected); virtual std::string GetDescription() const; - virtual float GetWidth() const; - virtual void SetMinWidth(float minWidth); void SetAlpha(unsigned char alpha); void PythonSetLabel(const std::string &strFont, const std::string &strText, color_t textColor, color_t shadowColor, color_t focusedColor); @@ -95,9 +93,6 @@ unsigned int m_focusCounter; unsigned char m_alpha; - float m_minWidth; - float m_maxWidth; - CGUIInfoLabel m_info; CGUIInfoLabel m_info2; CGUILabel m_label; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUICheckMarkControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUICheckMarkControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUICheckMarkControl.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUICheckMarkControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,6 +22,8 @@ #include "GUIFontManager.h" #include "input/Key.h" +using namespace std; + CGUICheckMarkControl::CGUICheckMarkControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureCheckMark, const CTextureInfo& textureCheckMarkNF, float checkWidth, float checkHeight, const CLabelInfo &labelInfo) : CGUIControl(parentID, controlID, posX, posY, width, height) , m_imgCheckMark(posX, posY, checkWidth, checkHeight, textureCheckMark) @@ -168,7 +170,7 @@ return EVENT_RESULT_UNHANDLED; } -void CGUICheckMarkControl::SetLabel(const std::string &label) +void CGUICheckMarkControl::SetLabel(const string &label) { if (m_strLabel != label) { @@ -177,7 +179,7 @@ } } -void CGUICheckMarkControl::PythonSetLabel(const std::string &strFont, const std::string &strText, color_t textColor) +void CGUICheckMarkControl::PythonSetLabel(const std::string &strFont, const string &strText, color_t textColor) { m_label.GetLabelInfo().font = g_fontManager.GetFont(strFont); m_label.GetLabelInfo().textColor = textColor; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIColorManager.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIColorManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIColorManager.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIColorManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,15 +19,12 @@ */ #include "GUIColorManager.h" - -#include - -#include "addons/Skin.h" #include "filesystem/SpecialProtocol.h" +#include "addons/Skin.h" #include "utils/log.h" -#include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "utils/XBMCTinyXML.h" +#include "utils/StringUtils.h" CGUIColorManager g_colorManager; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIColorManager.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIColorManager.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIColorManager.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIColorManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -33,9 +33,9 @@ \brief */ -#include #include #include +#include class CXBMCTinyXML; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControl.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,13 +24,13 @@ #include "utils/log.h" #include "GUIWindowManager.h" #include "GUIControlProfiler.h" -#include "GUITexture.h" #include "input/MouseStat.h" #include "input/InputManager.h" #include "input/Key.h" +using namespace std; + CGUIControl::CGUIControl() : - m_hitColor(0xffffffff), m_diffuseColor(0xffffffff) { m_hasProcessed = false; @@ -53,12 +53,10 @@ m_pushedUpdates = false; m_pulseOnSelect = false; m_controlIsDirty = true; - m_stereo = 0.0f; } CGUIControl::CGUIControl(int parentID, int controlID, float posX, float posY, float width, float height) : m_hitRect(posX, posY, posX + width, posY + height), - m_hitColor(0xffffffff), m_diffuseColor(0xffffffff) { m_posX = posX; @@ -81,7 +79,6 @@ m_pushedUpdates = false; m_pulseOnSelect = false; m_controlIsDirty = false; - m_stereo = 0.0f; } @@ -177,30 +174,14 @@ { if (IsVisible()) { - bool hasStereo = m_stereo != 0.0 - && g_graphicsContext.GetStereoMode() != RENDER_STEREO_MODE_MONO - && g_graphicsContext.GetStereoMode() != RENDER_STEREO_MODE_OFF; - g_graphicsContext.SetTransform(m_cachedTransform); if (m_hasCamera) g_graphicsContext.SetCameraPosition(m_camera); - if (hasStereo) - g_graphicsContext.SetStereoFactor(m_stereo); GUIPROFILER_RENDER_BEGIN(this); - - if (m_hitColor != 0xffffffff) - { - color_t color = g_graphicsContext.MergeAlpha(m_hitColor); - CGUITexture::DrawQuad(g_graphicsContext.generateAABB(m_hitRect), color); - } - Render(); - GUIPROFILER_RENDER_END(this); - if (hasStereo) - g_graphicsContext.RestoreStereoFactor(); if (m_hasCamera) g_graphicsContext.RestoreCameraPosition(); g_graphicsContext.RemoveTransform(); @@ -229,9 +210,6 @@ OnRight(); return true; - case ACTION_SHOW_INFO: - return OnInfo(); - case ACTION_NAV_BACK: return OnBack(); @@ -283,14 +261,6 @@ return Navigate(ACTION_NAV_BACK); } -bool CGUIControl::OnInfo() -{ - CGUIAction action = GetAction(ACTION_SHOW_INFO); - if (action.HasAnyActions()) - return action.ExecuteActions(GetID(), GetParentID()); - return false; -} - void CGUIControl::OnNextControl() { Navigate(ACTION_NEXT_CONTROL); @@ -487,12 +457,12 @@ return CRect(tl.x, tl.y, br.x, br.y); } -void CGUIControl::SetActions(const ActionMap &actions) +void CGUIControl::SetNavigationActions(const ActionMap &actions) { m_actions = actions; } -void CGUIControl::SetAction(int actionID, const CGUIAction &action, bool replace /*= true*/) +void CGUIControl::SetNavigationAction(int actionID, const CGUIAction &action, bool replace /*= true*/) { ActionMap::iterator i = m_actions.find(actionID); if (i == m_actions.end() || !i->second.HasAnyActions() || replace) @@ -577,8 +547,8 @@ // override this function to implement custom mouse behaviour bool CGUIControl::OnMouseOver(const CPoint &point) { - if (CInputManager::GetInstance().GetMouseState() != MOUSE_STATE_DRAG) - CInputManager::GetInstance().SetMouseState(MOUSE_STATE_FOCUS); + if (CInputManager::Get().GetMouseState() != MOUSE_STATE_DRAG) + CInputManager::Get().SetMouseState(MOUSE_STATE_FOCUS); if (!CanFocus()) return false; if (!HasFocus()) { @@ -672,7 +642,7 @@ m_allowHiddenFocus.Parse(allowHiddenFocus, GetParentID()); } -void CGUIControl::SetAnimations(const std::vector &animations) +void CGUIControl::SetAnimations(const vector &animations) { m_animations = animations; MarkDirtyRegion(); @@ -891,7 +861,7 @@ return false; } -CGUIAction CGUIControl::GetAction(int actionID) const +CGUIAction CGUIControl::GetNavigateAction(int actionID) const { ActionMap::const_iterator i = m_actions.find(actionID); if (i != m_actions.end()) @@ -911,16 +881,7 @@ CPoint controlPoint(point); m_transform.InverseTransformPosition(controlPoint.x, controlPoint.y); if (!HitTest(controlPoint)) - { SetFocus(false); - - // and tell our parent so it can unfocus - if (m_parentControl) - { - CGUIMessage msgLostFocus(GUI_MSG_LOSTFOCUS, GetID(), GetID()); - m_parentControl->OnMessage(msgLostFocus); - } - } } } @@ -934,15 +895,14 @@ return GetID() == id && IsVisible(); } -void CGUIControl::SaveStates(std::vector &states) +void CGUIControl::SaveStates(vector &states) { // empty for now - do nothing with the majority of controls } -void CGUIControl::SetHitRect(const CRect &rect, const color_t &color) +void CGUIControl::SetHitRect(const CRect &rect) { m_hitRect = rect; - m_hitColor = color; } void CGUIControl::SetCamera(const CPoint &camera) @@ -960,8 +920,3 @@ point += m_parentControl->GetRenderPosition(); return point; } - -void CGUIControl::SetStereoFactor(const float &factor) -{ - m_stereo = factor; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControlFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControlFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControlFactory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControlFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -66,6 +66,7 @@ #include "GUIAction.h" #include "Util.h" +using namespace std; using namespace EPG; typedef struct @@ -100,6 +101,7 @@ {"resize", CGUIControl::GUICONTROL_RESIZE}, {"edit", CGUIControl::GUICONTROL_EDIT}, {"visualisation", CGUIControl::GUICONTROL_VISUALISATION}, + {"karvisualisation", CGUIControl::GUICONTROL_VISUALISATION}, {"renderaddon", CGUIControl::GUICONTROL_RENDERADDON}, {"multiimage", CGUIControl::GUICONTROL_MULTI_IMAGE}, {"grouplist", CGUIControl::GUICONTROL_GROUPLIST}, @@ -269,26 +271,26 @@ { if (hasRight) { - width = std::max(0.0f, right - left); // if left=0, this fills to size of parent + width = max(0.0f, right - left); // if left=0, this fills to size of parent hasLeft = true; } else if (hasCenter) { if (hasLeft) { - width = std::max(0.0f, (center - left) * 2); + width = max(0.0f, (center - left) * 2); hasWidth = true; } else if (center > 0 && center < parentSize) { // centre given, so fill to edge of parent - width = std::max(0.0f, std::min(parentSize - center, center) * 2); + width = max(0.0f, min(parentSize - center, center) * 2); left = center - width/2; hasLeft = hasWidth = true; } } else if (hasLeft) // neither right nor center specified { - width = std::max(0.0f, parentSize - left); // if left=0, this fills to parent + width = max(0.0f, parentSize - left); // if left=0, this fills to parent } } return hasLeft && hasWidth; @@ -420,7 +422,7 @@ { const TiXmlElement* node = control->FirstChildElement("visible"); if (!node) return false; - std::vector conditions; + vector conditions; while (node) { const char *hidden = node->Attribute("allowhiddenfocus"); @@ -451,7 +453,7 @@ return GetConditionalVisibility(control, condition, allowHiddenFocus); } -bool CGUIControlFactory::GetAnimations(TiXmlNode *control, const CRect &rect, int context, std::vector &animations) +bool CGUIControlFactory::GetAnimations(TiXmlNode *control, const CRect &rect, int context, vector &animations) { TiXmlElement* node = control->FirstChildElement("animation"); bool ret = false; @@ -564,7 +566,7 @@ void CGUIControlFactory::GetInfoLabel(const TiXmlNode *pControlNode, const std::string &labelTag, CGUIInfoLabel &infoLabel, int parentID) { - std::vector labels; + vector labels; GetInfoLabels(pControlNode, labelTag, labels, parentID); if (labels.size()) infoLabel = labels[0]; @@ -590,7 +592,7 @@ return true; } -void CGUIControlFactory::GetInfoLabels(const TiXmlNode *pControlNode, const std::string &labelTag, std::vector &infoLabels, int parentID) +void CGUIControlFactory::GetInfoLabels(const TiXmlNode *pControlNode, const std::string &labelTag, vector &infoLabels, int parentID) { // we can have the following infolabels: // 1. 1234 -> direct number @@ -703,7 +705,6 @@ CTextureInfo textureLeftFocus, textureRightFocus; CTextureInfo textureUp, textureDown; CTextureInfo textureUpFocus, textureDownFocus; - CTextureInfo textureUpDisabled, textureDownDisabled; CTextureInfo texture, borderTexture; CGUIInfoLabel textureFile; CTextureInfo textureCheckMark, textureCheckMarkNF; @@ -711,7 +712,6 @@ CTextureInfo textureAltFocus, textureAltNoFocus; CTextureInfo textureRadioOnFocus, textureRadioOnNoFocus; CTextureInfo textureRadioOffFocus, textureRadioOffNoFocus; - CTextureInfo textureRadioOnDisabled, textureRadioOffDisabled; CTextureInfo imageNoFocus, imageFocus; CTextureInfo textureProgressIndicator; CGUIInfoLabel texturePath; @@ -741,7 +741,7 @@ std::string allowHiddenFocus; std::string enableCondition; - std::vector animations; + vector animations; CGUIControl::GUISCROLLVALUE scrollValue = CGUIControl::FOCUS; bool bPulse = true; @@ -759,7 +759,6 @@ CLabelInfo labelInfo; CLabelInfo spinInfo; - CGUIInfoColor hitColor(0xFFFFFFFF); CGUIInfoColor textColor3; CGUIInfoColor headlineColor; @@ -781,7 +780,6 @@ CRect hitRect; CPoint camera; - float stereo = 0.f; bool hasCamera = false; bool resetOnLabelChange = true; bool bPassword = false; @@ -807,13 +805,13 @@ posX -= width; } if (!width) // no width specified, so compute from parent - width = std::max(rect.Width() - posX, 0.0f); + width = max(rect.Width() - posX, 0.0f); } if (!GetDimensions(pControlNode, "top", "bottom", "centertop", "centerbottom", "height", rect.Height(), posY, height, minHeight)) { GetPosition(pControlNode, "posy", rect.Height(), posY); if (!height) - height = std::max(rect.Height() - posY, 0.0f); + height = max(rect.Height() - posY, 0.0f); } XMLUtils::GetFloat(pControlNode, "offsetx", offset.x); @@ -822,8 +820,6 @@ hitRect.SetRect(posX, posY, posX + width, posY + height); GetHitRect(pControlNode, hitRect); - GetInfoColor(pControlNode, "hitrectcolor", hitColor, parentID); - GetActions(pControlNode, "onup", actions[ACTION_MOVE_UP]); GetActions(pControlNode, "ondown", actions[ACTION_MOVE_DOWN]); GetActions(pControlNode, "onleft", actions[ACTION_MOVE_LEFT]); @@ -831,7 +827,6 @@ GetActions(pControlNode, "onnext", actions[ACTION_NEXT_CONTROL]); GetActions(pControlNode, "onprev", actions[ACTION_PREV_CONTROL]); GetActions(pControlNode, "onback", actions[ACTION_NAV_BACK]); - GetActions(pControlNode, "oninfo", actions[ACTION_SHOW_INFO]); if (XMLUtils::GetInt(pControlNode, "defaultcontrol", defaultControl)) { @@ -893,8 +888,6 @@ GetTexture(pControlNode, "texturedown", textureDown); GetTexture(pControlNode, "textureupfocus", textureUpFocus); GetTexture(pControlNode, "texturedownfocus", textureDownFocus); - GetTexture(pControlNode, "textureupdisabled", textureUpDisabled); - GetTexture(pControlNode, "texturedowndisabled", textureDownDisabled); GetTexture(pControlNode, "textureleft", textureLeft); GetTexture(pControlNode, "textureright", textureRight); @@ -929,8 +922,7 @@ GetTexture(pControlNode, "textureradiooff", textureRadioOffFocus); textureRadioOffNoFocus = textureRadioOffFocus; } - GetTexture(pControlNode, "textureradioondisabled", textureRadioOnDisabled); - GetTexture(pControlNode, "textureradiooffdisabled", textureRadioOffDisabled); + GetTexture(pControlNode, "texturesliderbackground", textureBackground); GetTexture(pControlNode, "texturesliderbar", textureBar); GetTexture(pControlNode, "texturesliderbarfocus", textureBarFocus); @@ -984,7 +976,7 @@ GetTexture(pControlNode, "imagefolderfocus", imageFocus); // fade label can have a whole bunch, but most just have one - std::vector infoLabels; + vector infoLabels; GetInfoLabels(pControlNode, "label", infoLabels, parentID); GetString(pControlNode, "label", strLabel); @@ -1096,9 +1088,6 @@ cam->QueryFloatAttribute("y", &camera.y); } - if (XMLUtils::GetFloat(pControlNode, "depth", stereo)) - stereo = std::max(-1.f, std::min(1.f, stereo)); - XMLUtils::GetInt(pControlNode, "scrollspeed", labelInfo.scrollSpeed); spinInfo.scrollSpeed = labelInfo.scrollSpeed; @@ -1153,7 +1142,7 @@ parentID, id, posX, posY, width, height, labelInfo, wrapMultiLine, bHasPath); ((CGUILabelControl *)control)->SetInfo(content); - ((CGUILabelControl *)control)->SetWidthControl(minWidth, (scrollValue == CGUIControl::ALWAYS)); + ((CGUILabelControl *)control)->SetWidthControl(minWidth, (scrollValue == CGUIControl::ALWAYS) ? true : false); } } break; @@ -1182,13 +1171,9 @@ { control = new CGUIFadeLabelControl( parentID, id, posX, posY, width, height, - labelInfo, scrollOut, timeToPauseAtEnd, resetOnLabelChange, randomized); + labelInfo, scrollOut, timeToPauseAtEnd, resetOnLabelChange); ((CGUIFadeLabelControl *)control)->SetInfo(infoLabels); - - // check whether or not a scroll tag was specified. - if (scrollValue != CGUIControl::FOCUS) - ((CGUIFadeLabelControl *)control)->SetScrolling(scrollValue == CGUIControl::ALWAYS); } break; case CGUIControl::GUICONTROL_RSS: @@ -1196,8 +1181,8 @@ control = new CGUIRSSControl( parentID, id, posX, posY, width, height, labelInfo, textColor3, headlineColor, strRSSTags); - RssUrls::const_iterator iter = CRssManager::GetInstance().GetUrls().find(iUrlSet); - if (iter != CRssManager::GetInstance().GetUrls().end()) + RssUrls::const_iterator iter = CRssManager::Get().GetUrls().find(iUrlSet); + if (iter != CRssManager::Get().GetUrls().end()) ((CGUIRSSControl *)control)->SetUrlSet(iUrlSet); } break; @@ -1206,11 +1191,10 @@ control = new CGUIButtonControl( parentID, id, posX, posY, width, height, textureFocus, textureNoFocus, - labelInfo, wrapMultiLine); + labelInfo); ((CGUIButtonControl *)control)->SetLabel(strLabel); ((CGUIButtonControl *)control)->SetLabel2(strLabel2); - ((CGUIButtonControl *)control)->SetMinWidth(minWidth); ((CGUIButtonControl *)control)->SetClickActions(clickActions); ((CGUIButtonControl *)control)->SetFocusActions(focusActions); ((CGUIButtonControl *)control)->SetUnFocusActions(unfocusActions); @@ -1221,12 +1205,10 @@ control = new CGUIToggleButtonControl( parentID, id, posX, posY, width, height, textureFocus, textureNoFocus, - textureAltFocus, textureAltNoFocus, - labelInfo, wrapMultiLine); + textureAltFocus, textureAltNoFocus, labelInfo); ((CGUIToggleButtonControl *)control)->SetLabel(strLabel); ((CGUIToggleButtonControl *)control)->SetAltLabel(altLabel); - ((CGUIToggleButtonControl *)control)->SetMinWidth(minWidth); ((CGUIToggleButtonControl *)control)->SetClickActions(clickActions); ((CGUIToggleButtonControl *)control)->SetAltClickActions(altclickActions); ((CGUIToggleButtonControl *)control)->SetFocusActions(focusActions); @@ -1250,10 +1232,9 @@ parentID, id, posX, posY, width, height, textureFocus, textureNoFocus, labelInfo, - textureRadioOnFocus, textureRadioOnNoFocus, textureRadioOffFocus, textureRadioOffNoFocus, textureRadioOnDisabled, textureRadioOffDisabled); + textureRadioOnFocus, textureRadioOnNoFocus, textureRadioOffFocus, textureRadioOffNoFocus); ((CGUIRadioButtonControl *)control)->SetLabel(strLabel); - ((CGUIRadioButtonControl *)control)->SetLabel2(strLabel2); ((CGUIRadioButtonControl *)control)->SetRadioDimensions(radioPosX, radioPosY, radioWidth, radioHeight); ((CGUIRadioButtonControl *)control)->SetToggleSelect(toggleSelect); ((CGUIRadioButtonControl *)control)->SetClickActions(clickActions); @@ -1276,7 +1257,6 @@ control = new CGUISpinControl( parentID, id, posX, posY, width, height, textureUp, textureDown, textureUpFocus, textureDownFocus, - textureUpDisabled, textureDownDisabled, labelInfo, iType); ((CGUISpinControl *)control)->SetReverse(bReverse); @@ -1373,9 +1353,6 @@ ((CGUIListContainer *)control)->SetPageControl(pageControl); ((CGUIListContainer *)control)->SetRenderOffset(offset); ((CGUIListContainer *)control)->SetAutoScrolling(pControlNode); - ((CGUIListContainer *)control)->SetClickActions(clickActions); - ((CGUIListContainer *)control)->SetFocusActions(focusActions); - ((CGUIListContainer *)control)->SetUnFocusActions(unfocusActions); } break; case CGUIControl::GUICONTAINER_WRAPLIST: @@ -1390,9 +1367,6 @@ ((CGUIWrappingListContainer *)control)->SetPageControl(pageControl); ((CGUIWrappingListContainer *)control)->SetRenderOffset(offset); ((CGUIWrappingListContainer *)control)->SetAutoScrolling(pControlNode); - ((CGUIWrappingListContainer *)control)->SetClickActions(clickActions); - ((CGUIWrappingListContainer *)control)->SetFocusActions(focusActions); - ((CGUIWrappingListContainer *)control)->SetUnFocusActions(unfocusActions); } break; case CGUIControl::GUICONTAINER_EPGGRID: @@ -1415,9 +1389,6 @@ ((CGUIFixedListContainer *)control)->SetPageControl(pageControl); ((CGUIFixedListContainer *)control)->SetRenderOffset(offset); ((CGUIFixedListContainer *)control)->SetAutoScrolling(pControlNode); - ((CGUIFixedListContainer *)control)->SetClickActions(clickActions); - ((CGUIFixedListContainer *)control)->SetFocusActions(focusActions); - ((CGUIFixedListContainer *)control)->SetUnFocusActions(unfocusActions); } break; case CGUIControl::GUICONTAINER_PANEL: @@ -1432,9 +1403,6 @@ ((CGUIPanelContainer *)control)->SetPageControl(pageControl); ((CGUIPanelContainer *)control)->SetRenderOffset(offset); ((CGUIPanelContainer *)control)->SetAutoScrolling(pControlNode); - ((CGUIPanelContainer *)control)->SetClickActions(clickActions); - ((CGUIPanelContainer *)control)->SetFocusActions(focusActions); - ((CGUIPanelContainer *)control)->SetUnFocusActions(unfocusActions); } break; case CGUIControl::GUICONTROL_TEXTBOX: @@ -1480,7 +1448,7 @@ control = new CGUISpinControlEx( parentID, id, posX, posY, width, height, spinWidth, spinHeight, labelInfo, textureFocus, textureNoFocus, textureUp, textureDown, textureUpFocus, textureDownFocus, - textureUpDisabled, textureDownDisabled, labelInfo, iType); + labelInfo, iType); ((CGUISpinControlEx *)control)->SetSpinPosition(spinPosX); ((CGUISpinControlEx *)control)->SetText(strLabel); @@ -1500,16 +1468,15 @@ // things that apply to all controls if (control) { - control->SetHitRect(hitRect, hitColor); + control->SetHitRect(hitRect); control->SetVisibleCondition(visibleCondition, allowHiddenFocus); control->SetEnableCondition(enableCondition); control->SetAnimations(animations); control->SetColorDiffuse(colorDiffuse); - control->SetActions(actions); + control->SetNavigationActions(actions); control->SetPulseOnSelect(bPulse); if (hasCamera) control->SetCamera(camera); - control->SetStereoFactor(stereo); } return control; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControlGroup.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControlGroup.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControlGroup.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControlGroup.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,9 +21,8 @@ #include "GUIControlGroup.h" #include -#include -#include "guiinfo/GUIInfoLabels.h" +using namespace std; CGUIControlGroup::CGUIControlGroup() { @@ -495,7 +494,7 @@ if (m_focusedControl) { // we may have multiple controls with same id - we pick first that has focus - std::pair range = m_lookup.equal_range(m_focusedControl); + pair range = m_lookup.equal_range(m_focusedControl); for (LookupMap::const_iterator i = range.first; i != range.second; ++i) { if (i->second->HasFocus()) @@ -560,10 +559,10 @@ { // first add all the subitems of this group (if they exist) const LookupMap map = ((CGUIControlGroup *)control)->GetLookup(); for (LookupMap::const_iterator i = map.begin(); i != map.end(); ++i) - m_lookup.insert(m_lookup.upper_bound(i->first), std::make_pair(i->first, i->second)); + m_lookup.insert(m_lookup.upper_bound(i->first), make_pair(i->first, i->second)); } if (control->GetID()) - m_lookup.insert(m_lookup.upper_bound(control->GetID()), std::make_pair(control->GetID(), control)); + m_lookup.insert(m_lookup.upper_bound(control->GetID()), make_pair(control->GetID(), control)); // ensure that our size is what it should be if (m_parentControl) ((CGUIControlGroup *)m_parentControl)->AddLookup(control); @@ -632,7 +631,7 @@ return false; } -void CGUIControlGroup::SaveStates(std::vector &states) +void CGUIControlGroup::SaveStates(vector &states) { // save our state, and that of our children states.push_back(CControlState(GetID(), m_focusedControl)); @@ -679,7 +678,7 @@ SetInvalid(); } -void CGUIControlGroup::GetContainers(std::vector &containers) const +void CGUIControlGroup::GetContainers(vector &containers) const { for (ciControls it = m_children.begin();it != m_children.end(); ++it) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControlGroupList.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControlGroupList.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControlGroupList.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControlGroupList.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,9 +20,8 @@ #include "GUIControlGroupList.h" #include "input/Key.h" -#include "guiinfo/GUIInfoLabels.h" +#include "GUIInfoManager.h" #include "GUIControlProfiler.h" -#include "utils/StringUtils.h" #include "GUIFont.h" // for XBFONT_* definitions CGUIControlGroupList::CGUIControlGroupList(int parentID, int controlID, float posX, float posY, float width, float height, float itemGap, int pageControl, ORIENTATION orientation, bool useControlPositions, uint32_t alignment, const CScroller& scroller) @@ -31,7 +30,6 @@ { m_itemGap = itemGap; m_pageControl = pageControl; - m_focusedPosition = 0; m_totalSize = 0; m_orientation = orientation; m_alignment = alignment; @@ -68,7 +66,6 @@ SendWindowMessage(message2); } // we run through the controls, rendering as we go - int index = 0; float pos = GetAlignOffset(); for (iControls it = m_children.begin(); it != m_children.end(); ++it) { @@ -82,16 +79,7 @@ control->DoProcess(currentTime, dirtyregions); if (control->IsVisible()) - { - if (IsControlOnScreen(pos, control)) - { - if (control->HasFocus()) - m_focusedPosition = index; - index++; - } - pos += Size(control) + m_itemGap; - } g_graphicsContext.RestoreOrigin(); } CGUIControl::Process(currentTime, dirtyregions); @@ -183,7 +171,7 @@ continue; if (control->HasID(m_focusedControl)) { - if (IsControlOnScreen(offset, control)) + if (offset >= m_scroller.GetValue() && offset + Size(control) <= m_scroller.GetValue() + Size()) return CGUIControlGroup::OnMessage(message); break; } @@ -196,7 +184,7 @@ CGUIControl *control = *it; if (!control->IsVisible()) continue; - if (control->CanFocus() && IsControlOnScreen(offset, control)) + if (control->CanFocus() && offset >= m_scroller.GetValue() && offset + Size(control) <= m_scroller.GetValue() + Size()) { m_focusedControl = control->GetID(); break; @@ -220,9 +208,6 @@ void CGUIControlGroupList::ValidateOffset() { - // calculate item gap. this needs to be done - // before fetching the total size - CalculateItemGap(); // calculate how many items we have on this page m_totalSize = GetTotalSize(); // check our m_offset range @@ -240,8 +225,8 @@ if (control) { // set the navigation of items so that they form a list - CGUIAction beforeAction = GetAction((m_orientation == VERTICAL) ? ACTION_MOVE_UP : ACTION_MOVE_LEFT); - CGUIAction afterAction = GetAction((m_orientation == VERTICAL) ? ACTION_MOVE_DOWN : ACTION_MOVE_RIGHT); + CGUIAction beforeAction = GetNavigateAction((m_orientation == VERTICAL) ? ACTION_MOVE_UP : ACTION_MOVE_LEFT); + CGUIAction afterAction = GetNavigateAction((m_orientation == VERTICAL) ? ACTION_MOVE_DOWN : ACTION_MOVE_RIGHT); if (m_children.size()) { // we're inserting at the given position, so grab the items above and below and alter @@ -276,16 +261,16 @@ if (m_orientation == VERTICAL) { if (before) // update the DOWN action to point to us - before->SetAction(ACTION_MOVE_DOWN, CGUIAction(control->GetID())); + before->SetNavigationAction(ACTION_MOVE_DOWN, CGUIAction(control->GetID())); if (after) // update the UP action to point to us - after->SetAction(ACTION_MOVE_UP, CGUIAction(control->GetID())); + after->SetNavigationAction(ACTION_MOVE_UP, CGUIAction(control->GetID())); } else { if (before) // update the RIGHT action to point to us - before->SetAction(ACTION_MOVE_RIGHT, CGUIAction(control->GetID())); + before->SetNavigationAction(ACTION_MOVE_RIGHT, CGUIAction(control->GetID())); if (after) // update the LEFT action to point to us - after->SetAction(ACTION_MOVE_LEFT, CGUIAction(control->GetID())); + after->SetNavigationAction(ACTION_MOVE_LEFT, CGUIAction(control->GetID())); } } // now the control's nav @@ -294,19 +279,19 @@ // don't override them if child have already defined actions if (m_orientation == VERTICAL) { - control->SetAction(ACTION_MOVE_UP, beforeAction); - control->SetAction(ACTION_MOVE_DOWN, afterAction); - control->SetAction(ACTION_MOVE_LEFT, GetAction(ACTION_MOVE_LEFT), false); - control->SetAction(ACTION_MOVE_RIGHT, GetAction(ACTION_MOVE_RIGHT), false); + control->SetNavigationAction(ACTION_MOVE_UP, beforeAction); + control->SetNavigationAction(ACTION_MOVE_DOWN, afterAction); + control->SetNavigationAction(ACTION_MOVE_LEFT, GetNavigateAction(ACTION_MOVE_LEFT), false); + control->SetNavigationAction(ACTION_MOVE_RIGHT, GetNavigateAction(ACTION_MOVE_RIGHT), false); } else { - control->SetAction(ACTION_MOVE_LEFT, beforeAction); - control->SetAction(ACTION_MOVE_RIGHT, afterAction); - control->SetAction(ACTION_MOVE_UP, GetAction(ACTION_MOVE_UP), false); - control->SetAction(ACTION_MOVE_DOWN, GetAction(ACTION_MOVE_DOWN), false); + control->SetNavigationAction(ACTION_MOVE_LEFT, beforeAction); + control->SetNavigationAction(ACTION_MOVE_RIGHT, afterAction); + control->SetNavigationAction(ACTION_MOVE_UP, GetNavigateAction(ACTION_MOVE_UP), false); + control->SetNavigationAction(ACTION_MOVE_DOWN, GetNavigateAction(ACTION_MOVE_DOWN), false); } - control->SetAction(ACTION_NAV_BACK, GetAction(ACTION_NAV_BACK), false); + control->SetNavigationAction(ACTION_NAV_BACK, GetNavigateAction(ACTION_NAV_BACK), false); if (!m_useControlPositions) control->SetPosition(0,0); @@ -377,7 +362,7 @@ CGUIControl *child = *i; if (child->IsVisible()) { - if (IsControlOnScreen(pos, child)) + if (pos + Size(child) > m_scroller.GetValue() && pos < m_scroller.GetValue() + Size()) { // we're on screen float offsetX = m_orientation == VERTICAL ? m_posX : m_posX + alignOffset + pos - m_scroller.GetValue(); float offsetY = m_orientation == VERTICAL ? m_posY + alignOffset + pos - m_scroller.GetValue() : m_posY; @@ -410,7 +395,7 @@ CGUIControl *child = *it; if (child->IsVisible()) { - if (IsControlOnScreen(pos, child)) + if (pos + Size(child) > m_scroller.GetValue() && pos < m_scroller.GetValue() + Size()) { // we're on screen CPoint offset = (m_orientation == VERTICAL) ? CPoint(m_posX, m_posY + alignOffset + pos - m_scroller.GetValue()) : CPoint(m_posX + alignOffset + pos - m_scroller.GetValue(), m_posY); child->UnfocusFromPoint(controlCoords - offset); @@ -429,56 +414,11 @@ return (m_totalSize >= Size() && m_scroller.GetValue() < m_totalSize - Size()); case CONTAINER_HAS_PREVIOUS: return (m_scroller.GetValue() > 0); - case CONTAINER_POSITION: - return (m_focusedPosition == data); default: return false; } } -std::string CGUIControlGroupList::GetLabel(int info) const -{ - switch (info) - { - case CONTAINER_CURRENT_ITEM: - return StringUtils::Format("%i", GetSelectedItem()); - case CONTAINER_NUM_ITEMS: - return StringUtils::Format("%i", GetNumItems()); - case CONTAINER_POSITION: - return StringUtils::Format("%i", m_focusedPosition); - default: - break; - } - return ""; -} - -int CGUIControlGroupList::GetNumItems() const -{ - return std::count_if(m_children.begin(), m_children.end(), [&](const CGUIControl *child) { - return (child->IsVisible() && child->CanFocus()); - }); -} - -int CGUIControlGroupList::GetSelectedItem() const -{ - int index = 1; - for (const auto& child : m_children) - { - if (child->IsVisible() && child->CanFocus()) - { - if (child->HasFocus()) - return index; - index++; - } - } - return -1; -} - -bool CGUIControlGroupList::IsControlOnScreen(float pos, const CGUIControl *control) const -{ - return (pos >= m_scroller.GetValue() && pos + Size(control) <= m_scroller.GetValue() + Size()); -} - bool CGUIControlGroupList::IsFirstFocusableControl(const CGUIControl *control) const { for (ciControls it = m_children.begin(); it != m_children.end(); ++it) @@ -505,33 +445,13 @@ return false; } -void CGUIControlGroupList::CalculateItemGap() -{ - if (m_alignment & XBFONT_JUSTIFIED) - { - int itemsCount = 0; - float itemsSize = 0; - for (const auto& child : m_children) - { - if (child->IsVisible()) - { - itemsSize += Size(child); - itemsCount++; - } - } - - if (itemsCount > 0) - m_itemGap = (Size() - itemsSize) / itemsCount; - } -} - float CGUIControlGroupList::GetAlignOffset() const { if (m_totalSize < Size()) { if (m_alignment & XBFONT_RIGHT) return Size() - m_totalSize; - if (m_alignment & (XBFONT_CENTER_X | XBFONT_JUSTIFIED)) + if (m_alignment & XBFONT_CENTER_X) return (Size() - m_totalSize)*0.5f; } return 0.0f; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControlGroupList.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControlGroupList.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControlGroupList.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControlGroupList.h 2015-10-19 08:39:16.000000000 +0000 @@ -52,7 +52,6 @@ virtual void AddControl(CGUIControl *control, int position = -1); virtual void ClearAll(); - virtual std::string GetLabel(int info) const; virtual bool GetCondition(int condition, int data) const; /** * Calculate total size of child controls area (including gaps between controls) @@ -64,21 +63,15 @@ void SetMinSize(float minWidth, float minHeight); protected: virtual EVENT_RESULT OnMouseEvent(const CPoint &point, const CMouseEvent &event); - bool IsControlOnScreen(float pos, const CGUIControl* control) const; bool IsFirstFocusableControl(const CGUIControl *control) const; bool IsLastFocusableControl(const CGUIControl *control) const; void ValidateOffset(); - void CalculateItemGap(); inline float Size(const CGUIControl *control) const; void ScrollTo(float offset); float GetAlignOffset() const; - int GetNumItems() const; - int GetSelectedItem() const; - float m_itemGap; int m_pageControl; - int m_focusedPosition; float m_totalSize; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControl.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControl.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIControl.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIControl.h 2015-10-19 08:39:16.000000000 +0000 @@ -105,7 +105,6 @@ virtual void OnLeft(); virtual void OnRight(); virtual bool OnBack(); - virtual bool OnInfo(); virtual void OnNextControl(); virtual void OnPrevControl(); virtual void OnFocus() {}; @@ -164,9 +163,8 @@ bool IsVisibleFromSkin() const { return m_visibleFromSkinCondition; }; virtual bool IsDisabled() const; virtual void SetPosition(float posX, float posY); - virtual void SetHitRect(const CRect &rect, const color_t &color); + virtual void SetHitRect(const CRect &rect); virtual void SetCamera(const CPoint &camera); - virtual void SetStereoFactor(const float &factor); bool SetColorDiffuse(const CGUIInfoColor &color); CPoint GetRenderPosition() const; virtual float GetXPosition() const; @@ -189,7 +187,7 @@ \sa SetNavigationAction */ typedef std::map ActionMap; - void SetActions(const ActionMap &actions); + void SetNavigationActions(const ActionMap &actions); /*! \brief Set actions to perform on navigation Navigations are set if replace is true or if there is no previously set action @@ -198,12 +196,12 @@ \param replace Actions are set only if replace is true or there is no previously set action. Defaults to true \sa SetNavigationActions */ - void SetAction(int actionID, const CGUIAction &action, bool replace = true); + void SetNavigationAction(int actionID, const CGUIAction &action, bool replace = true); /*! \brief Get an action the control can be perform. \param action the actionID to retrieve. */ - CGUIAction GetAction(int actionID) const; + CGUIAction GetNavigateAction(int actionID) const; /*! \brief Start navigating in given direction. */ @@ -327,7 +325,6 @@ float m_height; float m_width; CRect m_hitRect; - color_t m_hitColor; CGUIInfoColor m_diffuseColor; int m_controlID; int m_parentID; @@ -356,7 +353,6 @@ std::vector m_animations; CPoint m_camera; bool m_hasCamera; - float m_stereo; TransformMatrix m_transform; TransformMatrix m_cachedTransform; // Contains the absolute transform the control diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIDialog.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIDialog.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIDialog.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIDialog.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,17 +24,15 @@ #include "threads/SingleLock.h" #include "utils/TimeUtils.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "input/Key.h" -using namespace KODI::MESSAGING; - -CGUIDialog::CGUIDialog(int id, const std::string &xmlFile, DialogModalityType modalityType /* = DialogModalityType::MODAL */) +CGUIDialog::CGUIDialog(int id, const std::string &xmlFile) : CGUIWindow(id, xmlFile) { - m_modalityType = modalityType; + m_modalityType = DialogModalityType::MODAL; m_wasRunning = false; - m_renderOrder = RENDER_ORDER_DIALOG; + m_renderOrder = 1; m_autoClosing = false; m_showStartTime = 0; m_showDuration = 0; @@ -91,6 +89,10 @@ { case GUI_MSG_WINDOW_DEINIT: { + CGUIWindow *pWindow = g_windowManager.GetWindow(g_windowManager.GetActiveWindow()); + if (pWindow) + g_windowManager.ShowOverlay(pWindow->GetOverlayState()); + CGUIWindow::OnMessage(message); return true; } @@ -134,7 +136,7 @@ if (m_visibleCondition) { if (m_visibleCondition->Get()) - Open(); + Show(); else Close(); } @@ -157,58 +159,88 @@ } } -void CGUIDialog::Open_Internal(const std::string ¶m /* = "" */) +void CGUIDialog::DoModal_Internal(int iWindowID /*= WINDOW_INVALID */, const std::string ¶m /* = "" */) { - CGUIDialog::Open_Internal(m_modalityType != DialogModalityType::MODELESS, param); + //Lock graphic context here as it is sometimes called from non rendering threads + //maybe we should have a critical section per window instead?? + CSingleLock lock(g_graphicsContext); + + if (!g_windowManager.Initialized()) + return; // don't do anything + + m_closing = false; + m_modalityType = DialogModalityType::MODAL; + // set running before it's added to the window manager, else the auto-show code + // could show it as well if we are in a different thread from + // the main rendering thread (this should really be handled via + // a thread message though IMO) + m_active = true; + g_windowManager.RegisterDialog(this); + + // active this window... + CGUIMessage msg(GUI_MSG_WINDOW_INIT, 0, 0, WINDOW_INVALID, iWindowID); + msg.SetStringParam(param); + OnMessage(msg); + + if (!m_windowLoaded) + Close(true); + + lock.Leave(); + + while (m_active && !g_application.m_bStop) + { + g_windowManager.ProcessRenderLoop(); + } } -void CGUIDialog::Open_Internal(bool bProcessRenderLoop, const std::string ¶m /* = "" */) +void CGUIDialog::Show_Internal() { - // Lock graphic context here as it is sometimes called from non rendering threads - // maybe we should have a critical section per window instead?? + //Lock graphic context here as it is sometimes called from non rendering threads + //maybe we should have a critical section per window instead?? CSingleLock lock(g_graphicsContext); - if (!g_windowManager.Initialized() || - (m_active && !m_closing && !IsAnimating(ANIM_TYPE_WINDOW_CLOSE))) - return; + if (m_active && !m_closing && !IsAnimating(ANIM_TYPE_WINDOW_CLOSE)) return; + + if (!g_windowManager.Initialized()) + return; // don't do anything + + m_modalityType = DialogModalityType::MODELESS; // set running before it's added to the window manager, else the auto-show code - // could show it as well if we are in a different thread from the main rendering - // thread (this should really be handled via a thread message though IMO) + // could show it as well if we are in a different thread from + // the main rendering thread (this should really be handled via + // a thread message though IMO) m_active = true; m_closing = false; g_windowManager.RegisterDialog(this); - // active this window + // active this window... CGUIMessage msg(GUI_MSG_WINDOW_INIT, 0, 0); - msg.SetStringParam(param); OnMessage(msg); +} - // process render loop - if (bProcessRenderLoop) +void CGUIDialog::DoModal(int iWindowID /*= WINDOW_INVALID */, const std::string ¶m) +{ + if (!g_application.IsCurrentThread()) { - if (!m_windowLoaded) - Close(true); - - lock.Leave(); - - while (m_active && !g_application.m_bStop) - { - g_windowManager.ProcessRenderLoop(); - } + // make sure graphics lock is not held + CSingleExit leaveIt(g_graphicsContext); + CApplicationMessenger::Get().DoModal(this, iWindowID, param); } + else + DoModal_Internal(iWindowID, param); } -void CGUIDialog::Open(const std::string ¶m /* = "" */) +void CGUIDialog::Show() { if (!g_application.IsCurrentThread()) { // make sure graphics lock is not held CSingleExit leaveIt(g_graphicsContext); - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_DIALOG_OPEN, -1, -1, static_cast(this), param); + CApplicationMessenger::Get().Show(this); } else - Open_Internal(param); + Show_Internal(); } void CGUIDialog::Render() @@ -222,7 +254,7 @@ void CGUIDialog::SetDefaults() { CGUIWindow::SetDefaults(); - m_renderOrder = RENDER_ORDER_DIALOG; + m_renderOrder = 1; } void CGUIDialog::SetAutoClose(unsigned int timeoutMs) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIDialog.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIDialog.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIDialog.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIDialog.h 2015-10-19 08:39:16.000000000 +0000 @@ -32,7 +32,7 @@ { MODELESS, MODAL, - PARENTLESS_MODAL + SYSTEM_MODAL }; /*! @@ -43,7 +43,7 @@ public CGUIWindow { public: - CGUIDialog(int id, const std::string &xmlFile, DialogModalityType modalityType = DialogModalityType::MODAL); + CGUIDialog(int id, const std::string &xmlFile); virtual ~CGUIDialog(void); virtual bool OnAction(const CAction &action); @@ -51,13 +51,14 @@ virtual void DoProcess(unsigned int currentTime, CDirtyRegionList &dirtyregions); virtual void Render(); - void Open(const std::string ¶m = ""); + void DoModal(int iWindowID = WINDOW_INVALID, const std::string ¶m = ""); // modal + void Show(); // modeless virtual bool OnBack(int actionID); virtual bool IsDialogRunning() const { return m_active; }; virtual bool IsDialog() const { return true;}; - virtual bool IsModalDialog() const { return m_modalityType == DialogModalityType::MODAL || m_modalityType == DialogModalityType::PARENTLESS_MODAL; }; + virtual bool IsModalDialog() const { return m_modalityType == DialogModalityType::MODAL || m_modalityType == DialogModalityType::SYSTEM_MODAL; }; virtual DialogModalityType GetModalityType() const { return m_modalityType; }; void SetAutoClose(unsigned int timeoutMs); @@ -71,8 +72,8 @@ virtual void OnWindowLoaded(); virtual void UpdateVisibility(); - virtual void Open_Internal(const std::string ¶m = ""); - virtual void Open_Internal(bool bProcessRenderLoop, const std::string ¶m = ""); + virtual void DoModal_Internal(int iWindowID = WINDOW_INVALID, const std::string ¶m = ""); // modal + virtual void Show_Internal(); // modeless virtual void OnDeinitWindow(int nextWindowID); bool m_wasRunning; ///< \brief true if we were running during the last DoProcess() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIEditControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIEditControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIEditControl.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIEditControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,6 @@ #include "GUIEditControl.h" #include "GUIWindowManager.h" #include "utils/CharsetConverter.h" -#include "utils/Variant.h" #include "GUIKeyboardFactory.h" #include "dialogs/GUIDialogNumeric.h" #include "input/XBMC_vkeys.h" @@ -39,6 +38,8 @@ const char* CGUIEditControl::smsLetters[10] = { " !@#$%^&*()[]{}<>/\\|0", ".,;:\'\"-+_=?`~1", "abc2ABC", "def3DEF", "ghi4GHI", "jkl5JKL", "mno6MNO", "pqrs7PQRS", "tuv8TUV", "wxyz9WXYZ" }; const unsigned int CGUIEditControl::smsDelay = 1000; +using namespace std; + #ifdef TARGET_WINDOWS extern HWND g_hWnd; #endif @@ -362,7 +363,7 @@ // fallthrough case INPUT_TYPE_TEXT: default: - textChanged = CGUIKeyboardFactory::ShowAndGetInput(utf8, CVariant{heading}, true, m_inputType == INPUT_TYPE_PASSWORD || m_inputType == INPUT_TYPE_PASSWORD_MD5); + textChanged = CGUIKeyboardFactory::ShowAndGetInput(utf8, heading, true, m_inputType == INPUT_TYPE_PASSWORD || m_inputType == INPUT_TYPE_PASSWORD_MD5); break; } if (textChanged) @@ -546,7 +547,7 @@ text.append(m_text2.size() - m_cursorPos, L'*'); } else - text.append(m_text2.size(), L'*'); + text.append(m_text2.size(), L'*');; } else if (!m_edit.empty()) text.insert(m_editOffset, m_edit); @@ -652,6 +653,7 @@ void CGUIEditControl::OnSMSCharacter(unsigned int key) { assert(key < 10); + bool sendUpdate = false; if (m_smsTimer.IsRunning()) { // we're already entering an SMS character @@ -659,6 +661,7 @@ { // a different key was clicked than last time, or we have timed out m_smsLastKey = key; m_smsKeyIndex = 0; + sendUpdate = true; } else { // same key as last time within the appropriate time period @@ -676,7 +679,7 @@ m_smsKeyIndex = m_smsKeyIndex % strlen(smsLetters[key]); m_text2.insert(m_text2.begin() + m_cursorPos++, smsLetters[key][m_smsKeyIndex]); - UpdateText(); + UpdateText(sendUpdate); m_smsTimer.StartZero(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFadeLabelControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFadeLabelControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFadeLabelControl.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFadeLabelControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,9 @@ #include "GUIFadeLabelControl.h" -CGUIFadeLabelControl::CGUIFadeLabelControl(int parentID, int controlID, float posX, float posY, float width, float height, const CLabelInfo& labelInfo, bool scrollOut, unsigned int timeToDelayAtEnd, bool resetOnLabelChange, bool randomized) +using namespace std; + +CGUIFadeLabelControl::CGUIFadeLabelControl(int parentID, int controlID, float posX, float posY, float width, float height, const CLabelInfo& labelInfo, bool scrollOut, unsigned int timeToDelayAtEnd, bool resetOnLabelChange) : CGUIControl(parentID, controlID, posX, posY, width, height), m_label(labelInfo), m_scrollInfo(50, labelInfo.offsetX, labelInfo.scrollSpeed) , m_textLayout(labelInfo.font, false) , m_fadeAnim(CAnimation::CreateFader(100, 0, timeToDelayAtEnd, 200)) @@ -33,8 +35,6 @@ m_scrollSpeed = labelInfo.scrollSpeed; // save it for later m_resetOnLabelChange = resetOnLabelChange; m_shortText = true; - m_scroll = true; - m_randomized = randomized; } CGUIFadeLabelControl::CGUIFadeLabelControl(const CGUIFadeLabelControl &from) @@ -50,23 +50,19 @@ m_lastLabel = -1; ControlType = GUICONTROL_FADELABEL; m_shortText = from.m_shortText; - m_scroll = from.m_scroll; - m_randomized = from.m_randomized; } CGUIFadeLabelControl::~CGUIFadeLabelControl(void) { } -void CGUIFadeLabelControl::SetInfo(const std::vector &infoLabels) +void CGUIFadeLabelControl::SetInfo(const vector &infoLabels) { m_lastLabel = -1; m_infoLabels = infoLabels; - if (m_randomized) - std::random_shuffle(m_infoLabels.begin(), m_infoLabels.end()); } -void CGUIFadeLabelControl::AddLabel(const std::string &label) +void CGUIFadeLabelControl::AddLabel(const string &label) { m_infoLabels.push_back(CGUIInfoLabel(label, "", GetParentID())); } @@ -84,6 +80,7 @@ if (m_textLayout.Update(GetLabel())) { // changed label - update our suffix based on length of available text + MarkDirtyRegion(); float width, height; m_textLayout.GetTextExtent(width, height); float spaceWidth = m_label.font->GetCharWidth(L' '); @@ -107,6 +104,8 @@ if (m_infoLabels.size() > 1 || !m_shortText) { // have scrolling text + MarkDirtyRegion(); + bool moveToNextLabel = false; if (!m_scrollOut) { @@ -119,16 +118,13 @@ } else if (m_scrollInfo.pixelPos > m_scrollInfo.m_textWidth) moveToNextLabel = true; - - if(m_scrollInfo.pixelSpeed || m_fadeAnim.GetState() == ANIM_STATE_IN_PROCESS) - MarkDirtyRegion(); - + // apply the fading animation TransformMatrix matrix; m_fadeAnim.Animate(currentTime, true); m_fadeAnim.RenderAnimation(matrix); m_fadeMatrix = g_graphicsContext.AddTransform(matrix); - + if (m_fadeAnim.GetState() == ANIM_STATE_APPLIED) m_fadeAnim.ResetAnimation(); @@ -145,10 +141,7 @@ } } - if (m_scroll) - { - m_textLayout.UpdateScrollinfo(m_scrollInfo); - } + m_textLayout.UpdateScrollinfo(m_scrollInfo); g_graphicsContext.RemoveTransform(); } @@ -189,7 +182,7 @@ // render the scrolling text g_graphicsContext.SetTransform(m_fadeMatrix); - if (!m_scroll || (!m_scrollOut && m_shortText)) + if (!m_scrollOut && m_shortText) { float posX = m_posX + m_label.offsetX; if (m_label.align & XBFONT_CENTER_X) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFadeLabelControl.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFadeLabelControl.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFadeLabelControl.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFadeLabelControl.h 2015-10-19 08:39:16.000000000 +0000 @@ -38,7 +38,7 @@ class CGUIFadeLabelControl : public CGUIControl { public: - CGUIFadeLabelControl(int parentID, int controlID, float posX, float posY, float width, float height, const CLabelInfo& labelInfo, bool scrollOut, unsigned int timeToDelayAtEnd, bool resetOnLabelChange, bool randomized); + CGUIFadeLabelControl(int parentID, int controlID, float posX, float posY, float width, float height, const CLabelInfo& labelInfo, bool scrollOut, unsigned int timeToDelayAtEnd, bool resetOnLabelChange); CGUIFadeLabelControl(const CGUIFadeLabelControl &from); virtual ~CGUIFadeLabelControl(void); virtual CGUIFadeLabelControl *Clone() const { return new CGUIFadeLabelControl(*this); }; @@ -49,7 +49,6 @@ virtual bool OnMessage(CGUIMessage& message); void SetInfo(const std::vector &vecInfo); - void SetScrolling(bool scroll) { m_scroll = scroll; } protected: virtual bool UpdateColors(); @@ -72,7 +71,6 @@ CLabelInfo m_label; - bool m_scroll; // true if we scroll the text bool m_scrollOut; // true if we scroll the text all the way to the left before fading in the next label bool m_shortText; // true if the text we have is shorter than the width of the control @@ -82,6 +80,5 @@ TransformMatrix m_fadeMatrix; unsigned int m_scrollSpeed; bool m_resetOnLabelChange; - bool m_randomized; }; #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFont.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFont.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFont.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFont.h 2015-10-19 08:39:16.000000000 +0000 @@ -53,11 +53,10 @@ #define FONT_STYLE_NORMAL 0 #define FONT_STYLE_BOLD 1 #define FONT_STYLE_ITALICS 2 -#define FONT_STYLE_LIGHT 4 -#define FONT_STYLE_UPPERCASE 8 -#define FONT_STYLE_LOWERCASE 16 -#define FONT_STYLE_CAPITALIZE 32 -#define FONT_STYLE_MASK 0xFF +#define FONT_STYLE_UPPERCASE 4 +#define FONT_STYLE_LOWERCASE 8 +#define FONT_STYLE_CAPITALIZE 16 +#define FONT_STYLE_MASK 0xFF class CScrollInfo { @@ -78,8 +77,6 @@ // privates: m_averageFrameTime = 1000.f / fabs((float)defaultSpeed); m_lastFrameTime = 0; - m_textWidth = 0; - m_totalWidth = 0; m_widthValid = false; } float GetPixelsPerFrame(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontManager.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontManager.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -39,6 +39,8 @@ #include "filesystem/SpecialProtocol.h" #endif +using namespace std; + GUIFontManager::GUIFontManager(void) { m_canReload = true; @@ -240,7 +242,7 @@ void GUIFontManager::Unload(const std::string& strFontName) { - for (std::vector::iterator iFont = m_vecFonts.begin(); iFont != m_vecFonts.end(); ++iFont) + for (vector::iterator iFont = m_vecFonts.begin(); iFont != m_vecFonts.end(); ++iFont) { if (StringUtils::EqualsNoCase((*iFont)->GetFontName(), strFontName)) { @@ -253,7 +255,7 @@ void GUIFontManager::FreeFontFile(CGUIFontTTFBase *pFont) { - for (std::vector::iterator it = m_vecFontFiles.begin(); it != m_vecFontFiles.end(); ++it) + for (vector::iterator it = m_vecFontFiles.begin(); it != m_vecFontFiles.end(); ++it) { if (pFont == *it) { @@ -426,8 +428,8 @@ iStyle = FONT_STYLE_NORMAL; if (XMLUtils::GetString(fontNode, "style", style)) { - std::vector styles = StringUtils::Tokenize(style, " "); - for (std::vector::const_iterator i = styles.begin(); i != styles.end(); ++i) + vector styles = StringUtils::Tokenize(style, " "); + for (vector::const_iterator i = styles.begin(); i != styles.end(); ++i) { if (*i == "bold") iStyle |= FONT_STYLE_BOLD; @@ -441,8 +443,6 @@ iStyle |= FONT_STYLE_LOWERCASE; else if (*i == "capitalize") iStyle |= FONT_STYLE_CAPITALIZE; - else if (*i == "lighten") - iStyle |= FONT_STYLE_LIGHT; } } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontManager.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontManager.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontManager.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -28,8 +28,6 @@ * */ -#include - #include "GraphicContext.h" #include "IMsgTargetCallback.h" #include "utils/GlobalsHandling.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontTTF.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontTTF.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontTTF.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontTTF.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -48,6 +48,9 @@ #pragma comment(lib, "freetype246MT.lib") #endif +using namespace std; + + #define CHARS_PER_TEXTURE_LINE 20 // number of characters to cache per texture line #define CHAR_CHUNK 64 // 64 chars allocated at a time (1024 bytes) @@ -354,7 +357,7 @@ Begin(); uint32_t rawAlignment = alignment; - bool dirtyCache(false); + bool dirtyCache; bool hardwareClipping = g_Windowing.ScissorsCanEffectClipping(); CGUIFontCacheStaticPosition staticPos(x, y); CGUIFontCacheDynamicPosition dynamicPos; @@ -458,7 +461,7 @@ characters.push(*ch); if (maxPixelWidth > 0 && - cursorX + ((alignment & XBFONT_TRUNCATED) ? ch->advance + 3 * m_ellipsesWidth : 0) > maxPixelWidth) + cursorX + (alignment & XBFONT_TRUNCATED ? ch->advance + 3 * m_ellipsesWidth : 0) > maxPixelWidth) break; cursorX += ch->advance; } @@ -564,7 +567,7 @@ // and not advance distance - this makes sure that italic text isn't // choped on the end (as render width is larger than advance then). if (start == end) - width += std::max(c->right - c->left + c->offsetX, c->advance); + width += max(c->right - c->left + c->offsetX, c->advance); else width += c->advance; } @@ -601,7 +604,7 @@ CGUIFontTTFBase::Character* CGUIFontTTFBase::GetCharacter(character_t chr) { wchar_t letter = (wchar_t)(chr & 0xffff); - character_t style = (chr & 0x7000000) >> 24; + character_t style = (chr & 0x3000000) >> 24; // ignore linebreaks if (letter == L'\r') @@ -701,9 +704,6 @@ // and italics if applicable if (style & FONT_STYLE_ITALICS) ObliqueGlyph(m_face->glyph); - // and light if applicable - if (style & FONT_STYLE_LIGHT) - LightenGlyph(m_face->glyph); // grab the glyph if (FT_Get_Glyph(m_face->glyph, &glyph)) { @@ -728,7 +728,7 @@ m_posX += -bitGlyph->left; // check we have enough room for the character - if ((m_posX + bitGlyph->left + bitmap.width) > static_cast(m_textureWidth)) + if (m_posX + bitGlyph->left + bitmap.width > m_textureWidth) { // no space - gotta drop to the next line (which means creating a new texture and copying it across) m_posX = 0; m_posY += GetTextureLineHeight(); @@ -780,13 +780,13 @@ if (!isEmptyGlyph) { // ensure our rect will stay inside the texture (it *should* but we need to be certain) - unsigned int x1 = std::max(m_posX + ch->offsetX, 0); - unsigned int y1 = std::max(m_posY + ch->offsetY, 0); - unsigned int x2 = std::min(x1 + bitmap.width, m_textureWidth); - unsigned int y2 = std::min(y1 + bitmap.rows, m_textureHeight); + unsigned int x1 = max(m_posX + ch->offsetX, 0); + unsigned int y1 = max(m_posY + ch->offsetY, 0); + unsigned int x2 = min(x1 + bitmap.width, m_textureWidth); + unsigned int y2 = min(y1 + bitmap.rows, m_textureHeight); CopyCharToTexture(bitGlyph, x1, y1, x2, y2); - m_posX += spacing_between_characters_in_texture + (unsigned short)std::max(ch->right - ch->left + ch->offsetX, ch->advance); + m_posX += spacing_between_characters_in_texture + (unsigned short)max(ch->right - ch->left + ch->offsetX, ch->advance); } m_numChars++; @@ -839,14 +839,10 @@ float rx3 = (float)MathUtils::round_int(x[3]); x[1] = (float)MathUtils::truncate_int(x[1]); x[2] = (float)MathUtils::truncate_int(x[2]); - if (x[0] > 0.0f && rx0 > x[0]) + if (rx0 > x[0]) x[1] += 1; - else if (x[0] < 0.0f && rx0 < x[0]) - x[1] -= 1; - if (x[3] > 0.0f && rx3 > x[3]) + if (rx3 > x[3]) x[2] += 1; - else if (x[3] < 0.0f && rx3 < x[3]) - x[2] -= 1; x[0] = rx0; x[3] = rx3; } @@ -871,7 +867,6 @@ SVertex* v = &vertices[vertices.size() - 4]; m_color = color; -#ifndef HAS_DX unsigned char r = GET_R(color) , g = GET_G(color) , b = GET_B(color) @@ -883,18 +878,13 @@ g = (235 - 16) * g / 255; b = (235 - 16) * b / 255; } -#endif for(int i = 0; i < 4; i++) { -#ifdef HAS_DX - CD3DHelper::XMStoreColor(&v[i].col, color); -#else v[i].r = r; v[i].g = g; v[i].b = b; v[i].a = a; -#endif } #if defined(HAS_GL) || defined(HAS_DX) @@ -999,39 +989,5 @@ slot->metrics.vertBearingY += dy; slot->metrics.vertAdvance += dy; } - -// Lighten code - original taken from freetype2 (ftsynth.c) -void CGUIFontTTFBase::LightenGlyph(FT_GlyphSlot slot) -{ - if (slot->format != FT_GLYPH_FORMAT_OUTLINE) - return; - - /* some reasonable strength */ - FT_Pos strength = FT_MulFix(m_face->units_per_EM, - m_face->size->metrics.y_scale) / -48; - - FT_BBox bbox_before, bbox_after; - FT_Outline_Get_CBox(&slot->outline, &bbox_before); - FT_Outline_Embolden(&slot->outline, strength); // ignore error - FT_Outline_Get_CBox(&slot->outline, &bbox_after); - - FT_Pos dx = bbox_after.xMax - bbox_before.xMax; - FT_Pos dy = bbox_after.yMax - bbox_before.yMax; - - if (slot->advance.x) - slot->advance.x += dx; - - if (slot->advance.y) - slot->advance.y += dy; - - slot->metrics.width += dx; - slot->metrics.height += dy; - slot->metrics.horiBearingY += dy; - slot->metrics.horiAdvance += dx; - slot->metrics.vertBearingX -= dx / 2; - slot->metrics.vertBearingY += dy; - slot->metrics.vertAdvance += dy; -} - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontTTFDX.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontTTFDX.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontTTFDX.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontTTFDX.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,6 +23,7 @@ #include "GUIFontTTFDX.h" #include "GUIFontManager.h" #include "Texture.h" +#include "gui3d.h" #include "windowing/WindowingFactory.h" #include "utils/log.h" @@ -32,189 +33,127 @@ #include FT_FREETYPE_H #include FT_GLYPH_H +using namespace std; + CGUIFontTTFDX::CGUIFontTTFDX(const std::string& strFileName) : CGUIFontTTFBase(strFileName) { - m_speedupTexture = nullptr; - m_vertexBuffer = nullptr; - m_vertexWidth = 0; - m_buffers.clear(); - g_Windowing.Register(this); + m_speedupTexture = NULL; + m_index = NULL; + m_index_size = 0; } CGUIFontTTFDX::~CGUIFontTTFDX(void) { - g_Windowing.Unregister(this); - SAFE_DELETE(m_speedupTexture); - SAFE_RELEASE(m_vertexBuffer); - SAFE_RELEASE(m_staticIndexBuffer); - if (!m_buffers.empty()) - { - for (std::list::iterator it = m_buffers.begin(); it != m_buffers.end(); ++it) - SAFE_DELETE((*it)); - } - m_buffers.clear(); - m_staticIndexBufferCreated = false; - m_vertexWidth = 0; + free(m_index); } bool CGUIFontTTFDX::FirstBegin() { - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - if (!pContext) + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); + + if (pD3DDevice == NULL) + { + CLog::Log(LOGERROR, __FUNCTION__" - failed to get Direct3D device"); return false; + } - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - pGUIShader->Begin(SHADER_METHOD_RENDER_FONT); + int unit = 0; + // just have to blit from our texture. + m_texture->BindToUnit(unit); + pD3DDevice->SetTextureStageState( unit, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); // only use diffuse + pD3DDevice->SetTextureStageState( unit, D3DTSS_COLORARG1, D3DTA_DIFFUSE); + pD3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + pD3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + pD3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); + unit++; + + if(g_Windowing.UseLimitedColor()) + { + pD3DDevice->SetTextureStageState( unit, D3DTSS_COLOROP , D3DTOP_ADD ); + pD3DDevice->SetTextureStageState( unit, D3DTSS_COLORARG1, D3DTA_CURRENT) ; + pD3DDevice->SetRenderState( D3DRS_TEXTUREFACTOR, D3DCOLOR_RGBA(16,16,16,0) ); + pD3DDevice->SetTextureStageState( unit, D3DTSS_COLORARG2, D3DTA_TFACTOR ); + unit++; + } + + // no other texture stages needed + pD3DDevice->SetTextureStageState( unit, D3DTSS_COLOROP, D3DTOP_DISABLE); + pD3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + + pD3DDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + pD3DDevice->SetRenderState( D3DRS_FOGENABLE, FALSE ); + pD3DDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); + pD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE); + pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1); return true; } void CGUIFontTTFDX::LastEnd() { - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - if (!pContext) - return; + LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); - typedef CGUIFontTTFBase::CTranslatedVertices trans; - bool transIsEmpty = std::all_of(m_vertexTrans.begin(), m_vertexTrans.end(), - [](trans& _) { return _.vertexBuffer->size <= 0; }); - // no chars to render - if (m_vertex.empty() && transIsEmpty) + if (m_vertex.size() == 0) return; - CreateStaticIndexBuffer(); - - unsigned int offset = 0; - unsigned int stride = sizeof(SVertex); - - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - // Set font texture as shader resource - ID3D11ShaderResourceView* resources[] = { m_speedupTexture->GetShaderResource() }; - pGUIShader->SetShaderViews(1, resources); - // Enable alpha blend - g_Windowing.SetAlphaBlendEnable(true); - // Set our static index buffer - pContext->IASetIndexBuffer(m_staticIndexBuffer, DXGI_FORMAT_R16_UINT, 0); - // Set the type of primitive that should be rendered from this vertex buffer, in this case triangles. - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - if (!m_vertex.empty()) + /* If the number of elements in m_vertex reduces, we can simply re-use the + * first elements in m_index without any need to reallocate or reinitialise + * it. To ensure we don't reallocate m_index any more frequently than + * m_vertex, keep their respective high watermarks (m_index_size and + * m_vertex.capacity()) in line. + */ + unsigned index_size = m_vertex.capacity() * 6 / 4; + if(m_index_size < index_size) { - // Deal with vertices that had to use software clipping - if (!UpdateDynamicVertexBuffer(&m_vertex[0], m_vertex.size())) + uint16_t* id = (uint16_t*)calloc(index_size, sizeof(uint16_t)); + if(id == NULL) return; - // Set the dynamic vertex buffer to active in the input assembler - pContext->IASetVertexBuffers(0, 1, &m_vertexBuffer, &stride, &offset); - - // Do the actual drawing operation, split into groups of characters no - // larger than the pre-determined size of the element array - size_t size = m_vertex.size() / 4; - for (size_t character = 0; size > character; character += ELEMENT_ARRAY_MAX_CHAR_INDEX) - { - size_t count = size - character; - count = std::min(count, ELEMENT_ARRAY_MAX_CHAR_INDEX); - - // 6 indices and 4 vertices per character - pGUIShader->DrawIndexed(count * 6, 0, character * 4); - } - } - - if (!transIsEmpty) - { - // Deal with the vertices that can be hardware clipped and therefore translated - - // Store current GPU transform - XMMATRIX view = pGUIShader->GetView(); - // Store currect scissor - CRect scissor = g_graphicsContext.StereoCorrection(g_graphicsContext.GetScissors()); - - for (size_t i = 0; i < m_vertexTrans.size(); i++) + for(int i = 0, b = 0; i < m_vertex.capacity(); i += 4, b += 6) { - // ignore empty buffers - if (m_vertexTrans[i].vertexBuffer->size == 0) - continue; - - // Apply the clip rectangle - CRect clip = g_Windowing.ClipRectToScissorRect(m_vertexTrans[i].clip); - // Intersect with current scissors - clip.Intersect(scissor); - - // skip empty clip, a little improvement to not render invisible text - if (clip.IsEmpty()) - continue; - - g_Windowing.SetScissors(clip); - - // Apply the translation to the model view matrix - XMMATRIX translation = XMMatrixTranslation(m_vertexTrans[i].translateX, m_vertexTrans[i].translateY, m_vertexTrans[i].translateZ); - pGUIShader->SetView(XMMatrixMultiply(translation, view)); - - CD3DBuffer* vbuffer = reinterpret_cast(m_vertexTrans[i].vertexBuffer->bufferHandle); - // Set the static vertex buffer to active in the input assembler - ID3D11Buffer* buffers[1] = { vbuffer->Get() }; - pContext->IASetVertexBuffers(0, 1, buffers, &stride, &offset); - - // Do the actual drawing operation, split into groups of characters no - // larger than the pre-determined size of the element array - for (size_t character = 0; m_vertexTrans[i].vertexBuffer->size > character; character += ELEMENT_ARRAY_MAX_CHAR_INDEX) - { - size_t count = m_vertexTrans[i].vertexBuffer->size - character; - count = std::min(count, ELEMENT_ARRAY_MAX_CHAR_INDEX); - - // 6 indices and 4 vertices per character - pGUIShader->DrawIndexed(count * 6, 0, character * 4); - } + id[b+0] = i + 0; + id[b+1] = i + 1; + id[b+2] = i + 2; + id[b+3] = i + 2; + id[b+4] = i + 3; + id[b+5] = i + 0; } + free(m_index); + m_index = id; + m_index_size = index_size; + } + + D3DXMATRIX orig; + pD3DDevice->GetTransform(D3DTS_WORLD, &orig); + + D3DXMATRIX world = orig; + D3DXMATRIX trans; + + D3DXMatrixTranslation(&trans, - 0.5f + , - 0.5f + , 0.0f); + D3DXMatrixMultiply(&world, &world, &trans); + + pD3DDevice->SetTransform(D3DTS_WORLD, &world); + + pD3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST + , 0 + , m_vertex.size() + , m_vertex.size() / 2 + , m_index + , D3DFMT_INDEX16 + , &m_vertex[0] + , sizeof(SVertex)); + pD3DDevice->SetTransform(D3DTS_WORLD, &orig); - // restore scissor - g_Windowing.SetScissors(scissor); - - // Restore the original transform - pGUIShader->SetView(view); - } - - pGUIShader->RestoreBuffers(); -} - -CVertexBuffer CGUIFontTTFDX::CreateVertexBuffer(const std::vector &vertices) const -{ - CD3DBuffer* buffer = nullptr; - if (!vertices.empty()) // do not create empty buffers, leave buffer as nullptr, it will be ignored on drawing stage - { - buffer = new CD3DBuffer(); - if (!buffer->Create(D3D11_BIND_VERTEX_BUFFER, vertices.size(), sizeof(SVertex), DXGI_FORMAT_UNKNOWN, D3D11_USAGE_IMMUTABLE, &vertices[0])) - CLog::Log(LOGERROR, "%s - Failed to create vertex buffer.", __FUNCTION__); - else - AddReference((CGUIFontTTFDX*)this, buffer); - } - - return CVertexBuffer(reinterpret_cast(buffer), vertices.size() / 4, this); -} - -void CGUIFontTTFDX::AddReference(CGUIFontTTFDX* font, CD3DBuffer* pBuffer) -{ - font->m_buffers.push_back(pBuffer); -} - -void CGUIFontTTFDX::DestroyVertexBuffer(CVertexBuffer &buffer) const -{ - if (nullptr != buffer.bufferHandle) - { - CD3DBuffer* vbuffer = reinterpret_cast(buffer.bufferHandle); - ClearReference((CGUIFontTTFDX*)this, vbuffer); - SAFE_DELETE(vbuffer); - buffer.bufferHandle = 0; - } -} - -void CGUIFontTTFDX::ClearReference(CGUIFontTTFDX* font, CD3DBuffer* pBuffer) -{ - std::list::iterator it = std::find(font->m_buffers.begin(), font->m_buffers.end(), pBuffer); - if (it != font->m_buffers.end()) - font->m_buffers.erase(it); + pD3DDevice->SetTexture(0, NULL); + pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); } CBaseTexture* CGUIFontTTFDX::ReallocTexture(unsigned int& newHeight) @@ -232,21 +171,104 @@ m_dynamicCache.Flush(); CDXTexture* pNewTexture = new CDXTexture(m_textureWidth, newHeight, XB_FMT_A8); - CD3DTexture* newSpeedupTexture = new CD3DTexture(); - if (!newSpeedupTexture->Create(m_textureWidth, newHeight, 1, D3D11_USAGE_DEFAULT, DXGI_FORMAT_R8_UNORM)) + pNewTexture->CreateTextureObject(); + LPDIRECT3DTEXTURE9 newTexture = pNewTexture->GetTextureObject(); + + if (newTexture == NULL) { - SAFE_DELETE(newSpeedupTexture); + CLog::Log(LOGERROR, __FUNCTION__" - failed to create the new texture h=%d w=%d", m_textureWidth, newHeight); SAFE_DELETE(pNewTexture); return NULL; } - ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext(); + // Use a speedup texture in system memory when main texture in default pool+dynamic + // Otherwise the texture would have to be copied from vid mem to sys mem, which is too slow for subs while playing video. + CD3DTexture* newSpeedupTexture = NULL; + if (g_Windowing.DefaultD3DPool() == D3DPOOL_DEFAULT && g_Windowing.DefaultD3DUsage() == D3DUSAGE_DYNAMIC) + { + newSpeedupTexture = new CD3DTexture(); + if (!newSpeedupTexture->Create(m_textureWidth, newHeight, 1, 0, D3DFMT_A8, D3DPOOL_SYSTEMMEM)) + { + SAFE_DELETE(newSpeedupTexture); + SAFE_DELETE(pNewTexture); + return NULL; + } + } + + LPDIRECT3DSURFACE9 pSource, pTarget; // There might be data to copy from the previous texture + if ((newSpeedupTexture && m_speedupTexture) || (newTexture && m_texture)) + { + if (m_speedupTexture && newSpeedupTexture) + { + m_speedupTexture->GetSurfaceLevel(0, &pSource); + newSpeedupTexture->GetSurfaceLevel(0, &pTarget); + } + else + { + ((CDXTexture *)m_texture)->GetTextureObject()->GetSurfaceLevel(0, &pSource); + newTexture->GetSurfaceLevel(0, &pTarget); + } + + D3DLOCKED_RECT srclr, dstlr; + if(FAILED(pSource->LockRect( &srclr, NULL, 0 )) + || FAILED(pTarget->LockRect( &dstlr, NULL, 0 ))) + { + CLog::Log(LOGERROR, __FUNCTION__" - failed to lock surfaces"); + SAFE_DELETE(newSpeedupTexture); + SAFE_DELETE(pNewTexture); + pSource->Release(); + pTarget->Release(); + return NULL; + } + + unsigned char *dst = (unsigned char *)dstlr.pBits; + unsigned char *src = (unsigned char *)srclr.pBits; + unsigned int dstPitch = dstlr.Pitch; + unsigned int srcPitch = srclr.Pitch; + unsigned int minPitch = std::min(srcPitch, dstPitch); + + if (srcPitch == dstPitch) + { + memcpy(dst, src, srcPitch * m_textureHeight); + } + else + { + for (unsigned int y = 0; y < m_textureHeight; y++) + { + memcpy(dst, src, minPitch); + src += srcPitch; + dst += dstPitch; + } + } + pSource->UnlockRect(); + pTarget->UnlockRect(); + + pSource->Release(); + pTarget->Release(); + } + + // Upload from speedup texture to main texture if (newSpeedupTexture && m_speedupTexture) { - CD3D11_BOX rect(0, 0, 0, m_textureWidth, m_textureHeight, 1); - pContext->CopySubresourceRegion(newSpeedupTexture->Get(), 0, 0, 0, 0, m_speedupTexture->Get(), 0, &rect); + LPDIRECT3DSURFACE9 pSource, pTarget; + newSpeedupTexture->GetSurfaceLevel(0, &pSource); + newTexture->GetSurfaceLevel(0, &pTarget); + const RECT rect = { 0, 0, m_textureWidth, m_textureHeight }; + const POINT point = { 0, 0 }; + + HRESULT hr = g_Windowing.Get3DDevice()->UpdateSurface(pSource, &rect, pTarget, &point); + SAFE_RELEASE(pSource); + SAFE_RELEASE(pTarget); + + if (FAILED(hr)) + { + CLog::Log(LOGERROR, __FUNCTION__": Failed to upload from sysmem to vidmem (0x%08X)", hr); + SAFE_DELETE(newSpeedupTexture); + SAFE_DELETE(pNewTexture); + return NULL; + } } SAFE_DELETE(m_texture); @@ -262,103 +284,46 @@ { FT_Bitmap bitmap = bitGlyph->bitmap; - ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext(); - if (m_speedupTexture && pContext) - { - CD3D11_BOX dstBox(x1, y1, 0, x2, y2, 1); - pContext->UpdateSubresource(m_speedupTexture->Get(), 0, &dstBox, bitmap.buffer, bitmap.pitch, 0); - } + LPDIRECT3DTEXTURE9 texture = ((CDXTexture *)m_texture)->GetTextureObject(); + LPDIRECT3DSURFACE9 target; + if (m_speedupTexture) + m_speedupTexture->GetSurfaceLevel(0, &target); else - return false; + texture->GetSurfaceLevel(0, &target); - return TRUE; -} + RECT sourcerect = { 0, 0, bitmap.width, bitmap.rows }; + RECT targetrect = { x1, y1, x2, y2 }; -void CGUIFontTTFDX::DeleteHardwareTexture() -{ -} + HRESULT hr = D3DXLoadSurfaceFromMemory( target, NULL, &targetrect, + bitmap.buffer, D3DFMT_LIN_A8, bitmap.pitch, NULL, &sourcerect, + D3DX_FILTER_NONE, 0x00000000); -bool CGUIFontTTFDX::UpdateDynamicVertexBuffer(const SVertex* pSysMem, unsigned int vertex_count) -{ - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); + SAFE_RELEASE(target); - if (!pDevice || !pContext) - return false; - - unsigned width = sizeof(SVertex) * vertex_count; - if (width > m_vertexWidth) // create or re-create + if (FAILED(hr)) { - SAFE_RELEASE(m_vertexBuffer); - - CD3D11_BUFFER_DESC bufferDesc(width, D3D11_BIND_VERTEX_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); - D3D11_SUBRESOURCE_DATA initData; - ZeroMemory(&initData, sizeof(D3D11_SUBRESOURCE_DATA)); - initData.pSysMem = pSysMem; - - if (FAILED(pDevice->CreateBuffer(&bufferDesc, &initData, &m_vertexBuffer))) - { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to create the vertex buffer."); - return false; - } - - m_vertexWidth = width; + CLog::Log(LOGERROR, __FUNCTION__": Failed to copy the new character (0x%08X)", hr); + return false; } - else + + if (m_speedupTexture) { - D3D11_MAPPED_SUBRESOURCE resource; - if (FAILED(pContext->Map(m_vertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource))) + // Upload to GPU - the automatic dirty region tracking takes care of the rect. + HRESULT hr = g_Windowing.Get3DDevice()->UpdateTexture(m_speedupTexture->Get(), texture); + if (FAILED(hr)) { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to update the vertex buffer."); + CLog::Log(LOGERROR, __FUNCTION__": Failed to upload from sysmem to vidmem (0x%08X)", hr); return false; } - memcpy(resource.pData, pSysMem, width); - pContext->Unmap(m_vertexBuffer, 0); } - return true; -} - -void CGUIFontTTFDX::CreateStaticIndexBuffer(void) -{ - if (m_staticIndexBufferCreated) - return; - - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - if (!pDevice) - return; - - uint16_t index[ELEMENT_ARRAY_MAX_CHAR_INDEX][6]; - for (size_t i = 0; i < ELEMENT_ARRAY_MAX_CHAR_INDEX; i++) - { - index[i][0] = 4 * i; - index[i][1] = 4 * i + 1; - index[i][2] = 4 * i + 2; - index[i][3] = 4 * i + 2; - index[i][4] = 4 * i + 3; - index[i][5] = 4 * i + 0; - } - - CD3D11_BUFFER_DESC desc(sizeof(index), D3D11_BIND_INDEX_BUFFER, D3D11_USAGE_IMMUTABLE); - D3D11_SUBRESOURCE_DATA initData = { 0 }; - initData.pSysMem = index; - - if (SUCCEEDED(pDevice->CreateBuffer(&desc, &initData, &m_staticIndexBuffer))) - m_staticIndexBufferCreated = true; + return TRUE; } -bool CGUIFontTTFDX::m_staticIndexBufferCreated = false; -ID3D11Buffer* CGUIFontTTFDX::m_staticIndexBuffer = nullptr; -void CGUIFontTTFDX::OnDestroyDevice(void) +void CGUIFontTTFDX::DeleteHardwareTexture() { - SAFE_RELEASE(m_staticIndexBuffer); - m_staticIndexBufferCreated = false; - SAFE_RELEASE(m_vertexBuffer); - m_vertexWidth = 0; + } -void CGUIFontTTFDX::OnCreateDevice(void) -{ -} #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontTTFDX.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontTTFDX.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontTTFDX.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontTTFDX.h 2015-10-19 08:39:16.000000000 +0000 @@ -27,17 +27,15 @@ #define CGUILIB_GUIFONTTTF_DX_H #pragma once + #include "D3DResource.h" #include "GUIFontTTF.h" -#include - -#define ELEMENT_ARRAY_MAX_CHAR_INDEX (2000) /*! \ingroup textures \brief */ -class CGUIFontTTFDX : public CGUIFontTTFBase, public ID3DResource +class CGUIFontTTFDX : public CGUIFontTTFBase { public: CGUIFontTTFDX(const std::string& strFileName); @@ -45,33 +43,15 @@ virtual bool FirstBegin(); virtual void LastEnd(); - virtual CVertexBuffer CreateVertexBuffer(const std::vector &vertices) const; - virtual void DestroyVertexBuffer(CVertexBuffer &bufferHandle) const; - - virtual void OnDestroyDevice(); - virtual void OnCreateDevice(); - - static void CreateStaticIndexBuffer(void); - static void DestroyStaticIndexBuffer(void); protected: virtual CBaseTexture* ReallocTexture(unsigned int& newHeight); virtual bool CopyCharToTexture(FT_BitmapGlyph bitGlyph, unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2); virtual void DeleteHardwareTexture(); - -private: - bool UpdateDynamicVertexBuffer(const SVertex* pSysMem, unsigned int count); - static void AddReference(CGUIFontTTFDX* font, CD3DBuffer* pBuffer); - static void ClearReference(CGUIFontTTFDX* font, CD3DBuffer* pBuffer); - - CD3DTexture* m_speedupTexture; // extra texture to speed up reallocations when the main texture is in d3dpool_default. - // that's the typical situation of Windows Vista and above. - ID3D11Buffer* m_vertexBuffer; - unsigned m_vertexWidth; - std::list m_buffers; - - static bool m_staticIndexBufferCreated; - static ID3D11Buffer* m_staticIndexBuffer; + CD3DTexture *m_speedupTexture; // extra texture to speed up reallocations when the main texture is in d3dpool_default. + // that's the typical situation of Windows Vista and above. + uint16_t* m_index; + unsigned m_index_size; }; #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontTTFGL.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontTTFGL.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontTTFGL.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontTTFGL.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -37,8 +37,11 @@ #include FT_GLYPH_H #include FT_OUTLINE_H +using namespace std; + #if defined(HAS_GL) || defined(HAS_GLES) + CGUIFontTTFGL::CGUIFontTTFGL(const std::string& strFileName) : CGUIFontTTFBase(strFileName) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontTTF.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontTTF.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIFontTTF.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIFontTTF.h 2015-10-19 08:39:16.000000000 +0000 @@ -34,14 +34,6 @@ #include "utils/auto_buffer.h" #include "Geometry.h" -#ifdef HAS_DX -#include "DirectXMath.h" -#include "DirectXPackedVector.h" - -using namespace DirectX; -using namespace DirectX::PackedVector; -#endif - // forward definition class CBaseTexture; @@ -71,7 +63,7 @@ { float x, y, z; #ifdef HAS_DX - XMFLOAT4 col; + unsigned char b, g, r, a; #else unsigned char r, g, b, a; #endif @@ -139,7 +131,6 @@ // modifying glyphs void EmboldenGlyph(FT_GlyphSlot slot); - void LightenGlyph(FT_GlyphSlot slot); static void ObliqueGlyph(FT_GlyphSlot slot); CBaseTexture* m_texture; // texture that holds our rendered characters (8bit alpha only) @@ -158,7 +149,7 @@ color_t m_color; Character *m_char; // our characters - Character *m_charquick[256*7]; // ascii chars (7 styles) here + Character *m_charquick[256*4]; // ascii chars (4 styles) here int m_maxChars; // size of character array (can be incremented) int m_numChars; // the current number of cached characters diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIImage.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIImage.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIImage.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIImage.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,6 +23,8 @@ #include +using namespace std; + CGUIImage::CGUIImage(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& texture) : CGUIControl(parentID, controlID, posX, posY, width, height) , m_texture(posX, posY, width, height, texture) @@ -122,7 +124,7 @@ if (m_fadingTextures.size()) // have some fading images { // anything other than the last old texture needs to be faded out as per usual - for (std::vector::iterator i = m_fadingTextures.begin(); i != m_fadingTextures.end() - 1;) + for (vector::iterator i = m_fadingTextures.begin(); i != m_fadingTextures.end() - 1;) { if (!ProcessFading(*i, frameTime, currentTime)) i = m_fadingTextures.erase(i); @@ -174,7 +176,7 @@ { if (!IsVisible()) return; - for (std::vector::iterator itr = m_fadingTextures.begin(); itr != m_fadingTextures.end(); ++itr) + for (vector::iterator itr = m_fadingTextures.begin(); itr != m_fadingTextures.end(); ++itr) (*itr)->m_texture->Render(); m_texture.Render(); @@ -297,7 +299,7 @@ { CRect region = m_texture.GetRenderRect(); - for (std::vector::const_iterator itr = m_fadingTextures.begin(); itr != m_fadingTextures.end(); ++itr) + for (vector::const_iterator itr = m_fadingTextures.begin(); itr != m_fadingTextures.end(); ++itr) region.Union( (*itr)->m_texture->GetRenderRect() ); return CGUIControl::CalcRenderRegion().Intersect(region); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIIncludes.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIIncludes.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIIncludes.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIIncludes.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -28,6 +28,8 @@ #include "utils/StringUtils.h" #include "interfaces/info/SkinVariable.h" +using namespace std; + CGUIIncludes::CGUIIncludes() { m_constantAttributes.insert("x"); @@ -82,7 +84,6 @@ m_constantNodes.insert("timeperimage"); m_constantNodes.insert("fadetime"); m_constantNodes.insert("pauseatend"); - m_constantNodes.insert("depth"); } CGUIIncludes::~CGUIIncludes() @@ -145,21 +146,8 @@ m_includes.insert({ tagName, { *includeBody, std::move(defaultParams) } }); } else if (node->Attribute("file")) - { - const char *condition = node->Attribute("condition"); - if (condition) - { // check this condition - INFO::InfoPtr conditionID = g_infoManager.Register(condition); - bool value = conditionID->Get(); - - if (value) - { - // load this file in as well - LoadIncludes(g_SkinInfo->GetSkinPath(node->Attribute("file"))); - } - } - else - LoadIncludes(g_SkinInfo->GetSkinPath(node->Attribute("file"))); + { // load this file in as well + LoadIncludes(g_SkinInfo->GetSkinPath(node->Attribute("file"))); } node = node->NextSiblingElement("include"); } @@ -170,7 +158,7 @@ if (node->Attribute("type") && node->FirstChild()) { std::string tagName = node->Attribute("type"); - m_defaults.insert(std::pair(tagName, *node)); + m_defaults.insert(pair(tagName, *node)); } node = node->NextSiblingElement("default"); } @@ -232,7 +220,7 @@ if (node->ValueStr() == "control") { type = XMLUtils::GetAttribute(node, "type"); - std::map::const_iterator it = m_defaults.find(type); + map::const_iterator it = m_defaults.find(type); if (it != m_defaults.end()) { // we don't insert et. al. if or is specified @@ -480,10 +468,10 @@ std::string CGUIIncludes::ResolveConstant(const std::string &constant) const { - std::vector values = StringUtils::Split(constant, ","); - for (std::vector::iterator i = values.begin(); i != values.end(); ++i) + vector values = StringUtils::Split(constant, ","); + for (vector::iterator i = values.begin(); i != values.end(); ++i) { - std::map::const_iterator it = m_constants.find(*i); + map::const_iterator it = m_constants.find(*i); if (it != m_constants.end()) *i = it->second; } @@ -492,7 +480,7 @@ const INFO::CSkinVariableString* CGUIIncludes::CreateSkinVariable(const std::string& name, int context) { - std::map::const_iterator it = m_skinvariables.find(name); + map::const_iterator it = m_skinvariables.find(name); if (it != m_skinvariables.end()) return INFO::CSkinVariable::CreateFromXML(it->second, context); return NULL; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIIncludes.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIIncludes.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIIncludes.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIIncludes.h 2015-10-19 08:39:16.000000000 +0000 @@ -23,9 +23,7 @@ #include #include #include -#include #include - #include "interfaces/info/InfoBool.h" // forward definitions diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIInfoTypes.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIInfoTypes.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIInfoTypes.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIInfoTypes.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -28,6 +28,7 @@ #include "utils/StringUtils.h" #include "addons/Skin.h" +using namespace std; using ADDON::CAddonMgr; CGUIInfoBool::CGUIInfoBool(bool value) @@ -149,7 +150,7 @@ bool needsUpdate = m_dirty; if (!m_info.empty()) { - for (std::vector::const_iterator portion = m_info.begin(); portion != m_info.end(); ++portion) + for (vector::const_iterator portion = m_info.begin(); portion != m_info.end(); ++portion) { if (portion->m_info) { @@ -173,7 +174,7 @@ bool needsUpdate = m_dirty; if (item->IsFileItem() && !m_info.empty()) { - for (std::vector::const_iterator portion = m_info.begin(); portion != m_info.end(); ++portion) + for (vector::const_iterator portion = m_info.begin(); portion != m_info.end(); ++portion) { if (portion->m_info) { @@ -197,7 +198,7 @@ if (rebuild) { m_label.clear(); - for (std::vector::const_iterator portion = m_info.begin(); portion != m_info.end(); ++portion) + for (vector::const_iterator portion = m_info.begin(); portion != m_info.end(); ++portion) m_label += portion->Get(); m_dirty = false; } @@ -278,7 +279,7 @@ size_t length = str.find(" "); std::string id = str.substr(0, length); int stringid = atoi(str.substr(length + 1).c_str()); - return CAddonMgr::GetInstance().GetString(id, stringid); + return CAddonMgr::Get().GetString(id, stringid); } std::string NumberReplacer(const std::string &str) @@ -301,7 +302,7 @@ return work; } -enum EINFOFORMAT { NONE = 0, FORMATINFO, FORMATESCINFO, FORMATVAR, FORMATESCVAR }; +enum EINFOFORMAT { NONE = 0, FORMATINFO, FORMATESCINFO, FORMATVAR }; typedef struct { @@ -309,10 +310,9 @@ EINFOFORMAT val; } infoformat; -const static infoformat infoformatmap[] = {{ "$INFO[", FORMATINFO}, +const static infoformat infoformatmap[] = {{ "$INFO[", FORMATINFO }, { "$ESCINFO[", FORMATESCINFO}, - { "$VAR[", FORMATVAR}, - { "$ESCVAR[", FORMATESCVAR}}; + { "$VAR[", FORMATVAR}}; void CGUIInfoLabel::Parse(const std::string &label, int context) { @@ -333,7 +333,7 @@ for (size_t i = 0; i < sizeof(infoformatmap) / sizeof(infoformat); i++) { pos2 = work.find(infoformatmap[i].str); - if (pos2 != std::string::npos && pos2 < pos1) + if (pos2 != string::npos && pos2 < pos1) { pos1 = pos2; len = strlen(infoformatmap[i].str); @@ -351,11 +351,11 @@ { // decipher the block std::string block = work.substr(pos1 + len, pos2 - pos1 - len); - std::vector params = StringUtils::Split(block, ","); + vector params = StringUtils::Split(block, ","); if (!params.empty()) { int info; - if (format == FORMATVAR || format == FORMATESCVAR) + if (format == FORMATVAR) { info = g_infoManager.TranslateSkinVariableString(params[0], context); if (info == 0) @@ -370,7 +370,7 @@ prefix = params[1]; if (params.size() > 2) postfix = params[2]; - m_info.push_back(CInfoPortion(info, prefix, postfix, format == FORMATESCINFO || format == FORMATESCVAR)); + m_info.push_back(CInfoPortion(info, prefix, postfix, format == FORMATESCINFO)); } // and delete it from our work string work = work.substr(pos2 + 1); @@ -432,9 +432,3 @@ CGUIInfoLabel info(label, "", contextWindow); return info.GetLabel(contextWindow, preferImage); } - -std::string CGUIInfoLabel::GetItemLabel(const std::string &label, const CGUIListItem *item, bool preferImage /*= false */) -{ // translate the label - CGUIInfoLabel info(label); - return info.GetItemLabel(item, preferImage); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIInfoTypes.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIInfoTypes.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIInfoTypes.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIInfoTypes.h 2015-10-19 08:39:16.000000000 +0000 @@ -111,7 +111,6 @@ const std::string &GetFallback() const { return m_fallback; }; static std::string GetLabel(const std::string &label, int contextWindow = 0, bool preferImage = false); - static std::string GetItemLabel(const std::string &label, const CGUIListItem *item, bool preferImage = false); /*! \brief Replaces instances of $LOCALIZE[number] with the appropriate localized string diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIKeyboardFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIKeyboardFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIKeyboardFactory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIKeyboardFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,7 +19,7 @@ */ #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "LocalizeStrings.h" #include "GUIKeyboardFactory.h" #include "dialogs/GUIDialogOK.h" @@ -28,7 +28,6 @@ #include "settings/Settings.h" #include "utils/md5.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "dialogs/GUIDialogKeyboardGeneric.h" #if defined(TARGET_DARWIN_IOS) @@ -36,8 +35,6 @@ #include "windowing/WindowingFactory.h" #endif -using namespace KODI::MESSAGING; - CGUIKeyboard *CGUIKeyboardFactory::g_activedKeyboard = NULL; FILTERING CGUIKeyboardFactory::m_filtering = FILTERING_NONE; @@ -59,12 +56,12 @@ case FILTERING_SEARCH: message.SetParam1(GUI_MSG_SEARCH_UPDATE); message.SetStringParam(typedString); - CApplicationMessenger::GetInstance().SendGUIMessage(message, g_windowManager.GetActiveWindow()); + CApplicationMessenger::Get().SendGUIMessage(message, g_windowManager.GetActiveWindow()); break; case FILTERING_CURRENT: message.SetParam1(GUI_MSG_FILTER_ITEMS); message.SetStringParam(typedString); - CApplicationMessenger::GetInstance().SendGUIMessage(message); + CApplicationMessenger::Get().SendGUIMessage(message); break; case FILTERING_NONE: break; @@ -84,7 +81,7 @@ // Show keyboard with initial value (aTextString) and replace with result string. // Returns: true - successful display and input (empty result may return true or false depending on parameter) // false - unsuccessful display of the keyboard or cancelled editing -bool CGUIKeyboardFactory::ShowAndGetInput(std::string& aTextString, CVariant heading, bool allowEmptyResult, bool hiddenInput /* = false */, unsigned int autoCloseMs /* = 0 */) +bool CGUIKeyboardFactory::ShowAndGetInput(std::string& aTextString, const CVariant &heading, bool allowEmptyResult, bool hiddenInput /* = false */, unsigned int autoCloseMs /* = 0 */) { bool confirmed = false; CGUIKeyboard *kb = NULL; @@ -96,7 +93,7 @@ else if (heading.isInteger() && heading.asInteger()) headingStr = g_localizeStrings.Get((uint32_t)heading.asInteger()); -#if defined(TARGET_DARWIN_IOS) +#if defined(TARGET_DARWIN_IOS) && !defined(TARGET_DARWIN_IOS_ATV2) if (g_Windowing.GetCurrentScreen() == 0) kb = new CIOSKeyboard(); #endif @@ -128,12 +125,12 @@ bool CGUIKeyboardFactory::ShowAndGetInput(std::string& aTextString, bool allowEmptyResult, unsigned int autoCloseMs /* = 0 */) { - return ShowAndGetInput(aTextString, CVariant{""}, allowEmptyResult, false, autoCloseMs); + return ShowAndGetInput(aTextString, "", allowEmptyResult, false, autoCloseMs); } // Shows keyboard and prompts for a password. // Differs from ShowAndVerifyNewPassword() in that no second verification is necessary. -bool CGUIKeyboardFactory::ShowAndGetNewPassword(std::string& newPassword, CVariant heading, bool allowEmpty, unsigned int autoCloseMs /* = 0 */) +bool CGUIKeyboardFactory::ShowAndGetNewPassword(std::string& newPassword, const CVariant &heading, bool allowEmpty, unsigned int autoCloseMs /* = 0 */) { return ShowAndGetInput(newPassword, heading, allowEmpty, true, autoCloseMs); } @@ -159,7 +156,7 @@ // \param heading Heading to display // \param allowEmpty Whether a blank password is valid or not. // \return true if successful display and user input entry/re-entry. false if unsuccessful display, no user input, or canceled editing. -bool CGUIKeyboardFactory::ShowAndVerifyNewPassword(std::string& newPassword, CVariant heading, bool allowEmpty, unsigned int autoCloseMs /* = 0 */) +bool CGUIKeyboardFactory::ShowAndVerifyNewPassword(std::string& newPassword, const CVariant &heading, bool allowEmpty, unsigned int autoCloseMs /* = 0 */) { // Prompt user for password input std::string userInput; @@ -180,7 +177,7 @@ StringUtils::ToLower(newPassword); return true; } - CGUIDialogOK::ShowAndGetInput(CVariant{12341}, CVariant{12344}); + CGUIDialogOK::ShowAndGetInput(12341, 12344); return false; } @@ -206,7 +203,7 @@ else strHeadingTemp = StringUtils::Format("%s - %i %s", g_localizeStrings.Get(12326).c_str(), - CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES) - iRetries, + CSettings::Get().GetInt("masterlock.maxretries") - iRetries, g_localizeStrings.Get(12343).c_str()); std::string strUserInput; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIKeyboardFactory.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIKeyboardFactory.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIKeyboardFactory.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIKeyboardFactory.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,11 +20,10 @@ * */ +#include "utils/Variant.h" #include "GUIKeyboard.h" #include -class CVariant; - class CGUIKeyboardFactory { @@ -33,11 +32,11 @@ virtual ~CGUIKeyboardFactory(void); static bool ShowAndGetInput(std::string& aTextString, bool allowEmptyResult, unsigned int autoCloseMs = 0); - static bool ShowAndGetInput(std::string& aTextString, CVariant heading, bool allowEmptyResult, bool hiddenInput = false, unsigned int autoCloseMs = 0); + static bool ShowAndGetInput(std::string& aTextString, const CVariant &heading, bool allowEmptyResult, bool hiddenInput = false, unsigned int autoCloseMs = 0); static bool ShowAndGetNewPassword(std::string& strNewPassword, unsigned int autoCloseMs = 0); - static bool ShowAndGetNewPassword(std::string& newPassword, CVariant heading, bool allowEmpty, unsigned int autoCloseMs = 0); + static bool ShowAndGetNewPassword(std::string& newPassword, const CVariant &heading, bool allowEmpty, unsigned int autoCloseMs = 0); static bool ShowAndVerifyNewPassword(std::string& strNewPassword, unsigned int autoCloseMs = 0); - static bool ShowAndVerifyNewPassword(std::string& newPassword, CVariant heading, bool allowEmpty, unsigned int autoCloseMs = 0); + static bool ShowAndVerifyNewPassword(std::string& newPassword, const CVariant &heading, bool allowEmpty, unsigned int autoCloseMs = 0); static int ShowAndVerifyPassword(std::string& strPassword, const std::string& strHeading, int iRetries, unsigned int autoCloseMs = 0); static bool ShowAndGetFilter(std::string& aTextString, bool searching, unsigned int autoCloseMs = 0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUILabelControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUILabelControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUILabelControl.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUILabelControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,6 +22,8 @@ #include "utils/CharsetConverter.h" #include "utils/StringUtils.h" +using namespace std; + CGUILabelControl::CGUILabelControl(int parentID, int controlID, float posX, float posY, float width, float height, const CLabelInfo& labelInfo, bool wrapMultiLine, bool bHasPath) : CGUIControl(parentID, controlID, posX, posY, width, height) , m_label(posX, posY, width, height, labelInfo, wrapMultiLine ? CGUILabel::OVER_FLOW_WRAP : CGUILabel::OVER_FLOW_TRUNCATE) @@ -152,7 +154,7 @@ return false; } -void CGUILabelControl::SetLabel(const std::string &strLabel) +void CGUILabelControl::SetLabel(const string &strLabel) { // NOTE: this optimization handles fixed labels only (i.e. not info labels). // One way it might be extended to all labels would be for GUIInfoLabel ( or here ) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIListContainer.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIListContainer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIListContainer.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIListContainer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -116,8 +116,14 @@ if (message.GetMessage() == GUI_MSG_LABEL_RESET) { SetCursor(0); - SetOffset(0); - m_scroller.SetValue(0); + } + else if (message.GetMessage() == GUI_MSG_SETFOCUS) + { + if (message.GetParam1()) // subfocus item is specified, so set the offset appropriately + { + int item = std::min(GetOffset() + (int)message.GetParam1() - 1, (int)m_items.size() - 1); + SelectItem(item); + } } } return CGUIBaseContainer::OnMessage(message); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIListItem.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIListItem.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIListItem.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIListItem.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,15 +19,14 @@ */ #include "GUIListItem.h" - -#include - #include "GUIListItemLayout.h" #include "utils/Archive.h" #include "utils/CharsetConverter.h" #include "utils/StringUtils.h" #include "utils/Variant.h" +using namespace std; + bool CGUIListItem::icompare::operator()(const std::string &s1, const std::string &s2) const { return StringUtils::CompareNoCase(s1, s2) < 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIListItemLayout.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIListItemLayout.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIListItemLayout.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIListItemLayout.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,8 @@ #include "GUIImage.h" #include "utils/XBMCTinyXML.h" +using namespace std; + CGUIListItemLayout::CGUIListItemLayout() : m_group(0, 0, 0, 0, 0, 0) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIMessage.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIMessage.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIMessage.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIMessage.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,6 +21,8 @@ #include "GUIMessage.h" #include "LocalizeStrings.h" +using namespace std; + std::string CGUIMessage::empty_string; CGUIMessage::CGUIMessage(int msg, int senderID, int controlID, int param1, int param2) @@ -131,12 +133,12 @@ m_pointer = lpVoid; } -void CGUIMessage::SetLabel(const std::string& strLabel) +void CGUIMessage::SetLabel(const string& strLabel) { m_strLabel = strLabel; } -const std::string& CGUIMessage::GetLabel() const +const string& CGUIMessage::GetLabel() const { return m_strLabel; } @@ -146,14 +148,14 @@ m_strLabel = g_localizeStrings.Get(iString); } -void CGUIMessage::SetStringParam(const std::string& strParam) +void CGUIMessage::SetStringParam(const string& strParam) { m_params.clear(); if (strParam.size()) m_params.push_back(strParam); } -void CGUIMessage::SetStringParams(const std::vector ¶ms) +void CGUIMessage::SetStringParams(const vector ¶ms) { m_params = params; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIMessage.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIMessage.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIMessage.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIMessage.h 2015-10-19 08:39:16.000000000 +0000 @@ -9,8 +9,8 @@ #pragma once /* - * Copyright (C) 2005-2013 Team Kodi - * http://kodi.tv + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -164,11 +164,6 @@ #define GUI_MSG_USER 1000 /*! -\brief Complete to get codingtable page -*/ -#define GUI_MSG_CODINGTABLE_LOOKUP_COMPLETED 65000 - -/*! \ingroup winmsg \brief */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIMultiImage.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIMultiImage.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIMultiImage.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIMultiImage.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -30,6 +30,7 @@ #include "WindowIDs.h" #include "utils/StringUtils.h" +using namespace std; using namespace XFILE; CGUIMultiImage::CGUIMultiImage(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& texture, unsigned int timePerImage, unsigned int fadeTime, bool randomized, bool loop, unsigned int timeToPauseAtEnd) @@ -228,7 +229,7 @@ 3. Bundled folder */ CFileItem item(m_currentPath, false); - if (item.IsPicture() || CTextureCache::GetInstance().HasCachedImage(m_currentPath)) + if (item.IsPicture() || CTextureCache::Get().HasCachedImage(m_currentPath)) m_files.push_back(m_currentPath); else // bundled folder? g_TextureManager.GetBundledTexturesFromPath(m_currentPath, m_files); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIMultiSelectText.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIMultiSelectText.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIMultiSelectText.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIMultiSelectText.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,6 +24,8 @@ #include "utils/log.h" #include "utils/StringUtils.h" +using namespace std; + CGUIMultiSelectTextControl::CSelectableString::CSelectableString(CGUIFont *font, const std::string &text, bool selectable, const std::string &clickAction) : m_text(font, false) , m_clickAction(clickAction) @@ -212,7 +214,7 @@ // movement functions (callable from lists) bool CGUIMultiSelectTextControl::MoveLeft() { - CGUIAction action = GetAction(ACTION_MOVE_LEFT); + CGUIAction action = GetNavigateAction(ACTION_MOVE_LEFT); if (m_selectedItem > 0) ScrollToItem(m_selectedItem - 1); else if (GetNumSelectable() && action.GetNavigation() && action.GetNavigation() == m_controlID) @@ -224,7 +226,7 @@ bool CGUIMultiSelectTextControl::MoveRight() { - CGUIAction action = GetAction(ACTION_MOVE_RIGHT); + CGUIAction action = GetNavigateAction(ACTION_MOVE_RIGHT); if (GetNumSelectable() && m_selectedItem < GetNumSelectable() - 1) ScrollToItem(m_selectedItem + 1); else if (action.GetNavigation() && action.GetNavigation() == m_controlID) @@ -411,11 +413,11 @@ } // overrides to allow anims to translate down to the focus image -void CGUIMultiSelectTextControl::SetAnimations(const std::vector &animations) +void CGUIMultiSelectTextControl::SetAnimations(const vector &animations) { // send any focus animations down to the focus image only m_animations.clear(); - std::vector focusAnims; + vector focusAnims; for (unsigned int i = 0; i < animations.size(); i++) { const CAnimation &anim = animations[i]; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIPanelContainer.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIPanelContainer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIPanelContainer.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIPanelContainer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,12 +19,13 @@ */ #include "GUIPanelContainer.h" -#include "guiinfo/GUIInfoLabels.h" +#include "GUIInfoManager.h" #include "input/Key.h" -#include "utils/StringUtils.h" #include +using namespace std; + CGUIPanelContainer::CGUIPanelContainer(int parentID, int controlID, float posX, float posY, float width, float height, ORIENTATION orientation, const CScroller& scroller, int preloadItems) : CGUIBaseContainer(parentID, controlID, posX, posY, width, height, orientation, scroller, preloadItems) { @@ -257,7 +258,7 @@ void CGUIPanelContainer::OnLeft() { - CGUIAction action = GetAction(ACTION_MOVE_LEFT); + CGUIAction action = GetNavigateAction(ACTION_MOVE_LEFT); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == VERTICAL && MoveLeft(wrapAround)) return; @@ -268,7 +269,7 @@ void CGUIPanelContainer::OnRight() { - CGUIAction action = GetAction(ACTION_MOVE_RIGHT); + CGUIAction action = GetNavigateAction(ACTION_MOVE_RIGHT); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == VERTICAL && MoveRight(wrapAround)) return; @@ -279,7 +280,7 @@ void CGUIPanelContainer::OnUp() { - CGUIAction action = GetAction(ACTION_MOVE_UP); + CGUIAction action = GetNavigateAction(ACTION_MOVE_UP); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == VERTICAL && MoveUp(wrapAround)) return; @@ -290,7 +291,7 @@ void CGUIPanelContainer::OnDown() { - CGUIAction action = GetAction(ACTION_MOVE_DOWN); + CGUIAction action = GetNavigateAction(ACTION_MOVE_DOWN); bool wrapAround = action.GetNavigation() == GetID() || !action.HasActionsMeetingCondition(); if (m_orientation == VERTICAL && MoveDown(wrapAround)) return; @@ -334,7 +335,7 @@ else if (wrapAround) { // move last item in list in this column SetCursor((GetCursor() % m_itemsPerRow) + (m_itemsPerPage - 1) * m_itemsPerRow); - int offset = std::max((int)GetRows() - m_itemsPerPage, 0); + int offset = max((int)GetRows() - m_itemsPerPage, 0); // should check here whether cursor is actually allowed here, and reduce accordingly if (offset * m_itemsPerRow + GetCursor() >= (int)m_items.size()) SetCursor((int)m_items.size() - offset * m_itemsPerRow - 1); @@ -488,24 +489,12 @@ return true; } -int CGUIPanelContainer::GetCurrentRow() const -{ - return m_itemsPerRow > 0 ? GetCursor() / m_itemsPerRow : 0; -} - -int CGUIPanelContainer::GetCurrentColumn() const -{ - return GetCursor() % m_itemsPerRow; -} - bool CGUIPanelContainer::GetCondition(int condition, int data) const -{ - int row = GetCurrentRow(); - int col = GetCurrentColumn(); - +{ // probably only works vertically atm... + int row = GetCursor() / m_itemsPerRow; + int col = GetCursor() % m_itemsPerRow; if (m_orientation == HORIZONTAL) - std::swap(row, col); - + swap(row, col); switch (condition) { case CONTAINER_ROW: @@ -517,26 +506,6 @@ } } -std::string CGUIPanelContainer::GetLabel(int info) const -{ - int row = GetCurrentRow(); - int col = GetCurrentColumn(); - - if (m_orientation == HORIZONTAL) - std::swap(row, col); - - switch (info) - { - case CONTAINER_ROW: - return StringUtils::Format("%i", row); - case CONTAINER_COLUMN: - return StringUtils::Format("%i", col); - default: - return CGUIBaseContainer::GetLabel(info); - } - return StringUtils::Empty; -} - void CGUIPanelContainer::SelectItem(int item) { // Check that our offset is valid diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIPanelContainer.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIPanelContainer.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIPanelContainer.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIPanelContainer.h 2015-10-19 08:39:16.000000000 +0000 @@ -47,7 +47,6 @@ virtual void OnUp(); virtual void OnDown(); virtual bool GetCondition(int condition, int data) const; - virtual std::string GetLabel(int info) const; protected: virtual bool MoveUp(bool wrapAround); virtual bool MoveDown(bool wrapAround); @@ -66,9 +65,6 @@ virtual bool HasPreviousPage() const; virtual bool HasNextPage() const; - int GetCurrentRow() const; - int GetCurrentColumn() const; - int m_itemsPerRow; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIRadioButtonControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIRadioButtonControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIRadioButtonControl.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIRadioButtonControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,22 +20,18 @@ #include "GUIRadioButtonControl.h" #include "GUIInfoManager.h" -#include "LocalizeStrings.h" #include "input/Key.h" CGUIRadioButtonControl::CGUIRadioButtonControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureFocus, const CTextureInfo& textureNoFocus, const CLabelInfo& labelInfo, const CTextureInfo& radioOnFocus, const CTextureInfo& radioOnNoFocus, - const CTextureInfo& radioOffFocus, const CTextureInfo& radioOffNoFocus, - const CTextureInfo& radioOnDisabled, const CTextureInfo& radioOffDisabled) + const CTextureInfo& radioOffFocus, const CTextureInfo& radioOffNoFocus) : CGUIButtonControl(parentID, controlID, posX, posY, width, height, textureFocus, textureNoFocus, labelInfo) , m_imgRadioOnFocus(posX, posY, 16, 16, radioOnFocus) , m_imgRadioOnNoFocus(posX, posY, 16, 16, radioOnNoFocus) , m_imgRadioOffFocus(posX, posY, 16, 16, radioOffFocus) , m_imgRadioOffNoFocus(posX, posY, 16, 16, radioOffNoFocus) - , m_imgRadioOnDisabled(posX, posY, 16, 16, radioOnDisabled) - , m_imgRadioOffDisabled(posX, posY, 16, 16, radioOffDisabled) { m_radioPosX = 0; m_radioPosY = 0; @@ -43,10 +39,7 @@ m_imgRadioOnNoFocus.SetAspectRatio(CAspectRatio::AR_KEEP); m_imgRadioOffFocus.SetAspectRatio(CAspectRatio::AR_KEEP); m_imgRadioOffNoFocus.SetAspectRatio(CAspectRatio::AR_KEEP); - m_imgRadioOnDisabled.SetAspectRatio(CAspectRatio::AR_KEEP); - m_imgRadioOffDisabled.SetAspectRatio(CAspectRatio::AR_KEEP); ControlType = GUICONTROL_RADIO; - m_useLabel2 = false; } CGUIRadioButtonControl::~CGUIRadioButtonControl(void) @@ -63,17 +56,13 @@ else m_imgRadioOnNoFocus.Render(); } - else if ( !IsSelected() && !IsDisabled() ) + else { if (HasFocus()) m_imgRadioOffFocus.Render(); else m_imgRadioOffNoFocus.Render(); } - else if ( IsSelected() && IsDisabled() ) - m_imgRadioOnDisabled.Render(); - else - m_imgRadioOffDisabled.Render(); } void CGUIRadioButtonControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) @@ -89,16 +78,11 @@ m_bSelected = selected; } } - + m_imgRadioOnFocus.Process(currentTime); m_imgRadioOnNoFocus.Process(currentTime); m_imgRadioOffFocus.Process(currentTime); m_imgRadioOffNoFocus.Process(currentTime); - m_imgRadioOnDisabled.Process(currentTime); - m_imgRadioOffDisabled.Process(currentTime); - - if (m_useLabel2) - SetLabel2(g_localizeStrings.Get(m_bSelected ? 16041 : 351)); CGUIButtonControl::Process(currentTime, dirtyregions); } @@ -125,8 +109,6 @@ m_imgRadioOnNoFocus.AllocResources(); m_imgRadioOffFocus.AllocResources(); m_imgRadioOffNoFocus.AllocResources(); - m_imgRadioOnDisabled.AllocResources(); - m_imgRadioOffDisabled.AllocResources(); SetPosition(m_posX, m_posY); } @@ -137,8 +119,6 @@ m_imgRadioOnNoFocus.FreeResources(immediately); m_imgRadioOffFocus.FreeResources(immediately); m_imgRadioOffNoFocus.FreeResources(immediately); - m_imgRadioOnDisabled.FreeResources(immediately); - m_imgRadioOffDisabled.FreeResources(immediately); } void CGUIRadioButtonControl::DynamicResourceAlloc(bool bOnOff) @@ -148,8 +128,6 @@ m_imgRadioOnNoFocus.DynamicResourceAlloc(bOnOff); m_imgRadioOffFocus.DynamicResourceAlloc(bOnOff); m_imgRadioOffNoFocus.DynamicResourceAlloc(bOnOff); - m_imgRadioOnDisabled.DynamicResourceAlloc(bOnOff); - m_imgRadioOffDisabled.DynamicResourceAlloc(bOnOff); } void CGUIRadioButtonControl::SetInvalid() @@ -159,8 +137,6 @@ m_imgRadioOnNoFocus.SetInvalid(); m_imgRadioOffFocus.SetInvalid(); m_imgRadioOffNoFocus.SetInvalid(); - m_imgRadioOnDisabled.SetInvalid(); - m_imgRadioOffDisabled.SetInvalid(); } void CGUIRadioButtonControl::SetPosition(float posX, float posY) @@ -172,8 +148,6 @@ m_imgRadioOnNoFocus.SetPosition(radioPosX, radioPosY); m_imgRadioOffFocus.SetPosition(radioPosX, radioPosY); m_imgRadioOffNoFocus.SetPosition(radioPosX, radioPosY); - m_imgRadioOnDisabled.SetPosition(radioPosX, radioPosY); - m_imgRadioOffDisabled.SetPosition(radioPosX, radioPosY); } void CGUIRadioButtonControl::SetRadioDimensions(float posX, float posY, float width, float height) @@ -186,8 +160,6 @@ m_imgRadioOnNoFocus.SetWidth(width); m_imgRadioOffFocus.SetWidth(width); m_imgRadioOffNoFocus.SetWidth(width); - m_imgRadioOnDisabled.SetWidth(width); - m_imgRadioOffDisabled.SetWidth(width); } if (height) { @@ -195,15 +167,7 @@ m_imgRadioOnNoFocus.SetHeight(height); m_imgRadioOffFocus.SetHeight(height); m_imgRadioOffNoFocus.SetHeight(height); - m_imgRadioOnDisabled.SetHeight(height); - m_imgRadioOffDisabled.SetHeight(height); } - - // use label2 to display the button value in case no - // dimensions were specified and there's no label2 yet. - if (GetLabel2().empty() && !width && !height) - m_useLabel2 = true; - SetPosition(GetXPosition(), GetYPosition()); } @@ -236,8 +200,6 @@ changed |= m_imgRadioOnNoFocus.SetDiffuseColor(m_diffuseColor); changed |= m_imgRadioOffFocus.SetDiffuseColor(m_diffuseColor); changed |= m_imgRadioOffNoFocus.SetDiffuseColor(m_diffuseColor); - changed |= m_imgRadioOnDisabled.SetDiffuseColor(m_diffuseColor); - changed |= m_imgRadioOffDisabled.SetDiffuseColor(m_diffuseColor); return changed; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIRadioButtonControl.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIRadioButtonControl.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIRadioButtonControl.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIRadioButtonControl.h 2015-10-19 08:39:16.000000000 +0000 @@ -40,8 +40,7 @@ const CTextureInfo& textureFocus, const CTextureInfo& textureNoFocus, const CLabelInfo& labelInfo, const CTextureInfo& radioOnFocus, const CTextureInfo& radioOnNoFocus, - const CTextureInfo& radioOffFocus, const CTextureInfo& radioOffNoFocus, - const CTextureInfo& radioOnDisabled, const CTextureInfo& radioOffDisabled); + const CTextureInfo& radioOffFocus, const CTextureInfo& radioOffNoFocus); virtual ~CGUIRadioButtonControl(void); virtual CGUIRadioButtonControl *Clone() const { return new CGUIRadioButtonControl(*this); }; @@ -67,10 +66,7 @@ CGUITexture m_imgRadioOnNoFocus; CGUITexture m_imgRadioOffFocus; CGUITexture m_imgRadioOffNoFocus; - CGUITexture m_imgRadioOnDisabled; - CGUITexture m_imgRadioOffDisabled; float m_radioPosX; float m_radioPosY; INFO::InfoPtr m_toggleSelect; - bool m_useLabel2; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIRenderingControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIRenderingControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIRenderingControl.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIRenderingControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,6 +23,8 @@ #include "guilib/IRenderingCallback.h" #include "windowing/WindowingFactory.h" +using namespace std; + #define LABEL_ROW1 10 #define LABEL_ROW2 11 #define LABEL_ROW3 12 @@ -59,7 +61,7 @@ void *device = NULL; #if HAS_DX - device = g_Windowing.Get3D11Device(); + device = g_Windowing.Get3DDevice(); #endif if (callback->Create((int)(x+0.5f), (int)(y+0.5f), (int)(w+0.5f), (int)(h+0.5f), device)) m_callback = callback; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIRSSControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIRSSControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIRSSControl.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIRSSControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,8 @@ #include "utils/RssReader.h" #include "utils/StringUtils.h" +using namespace std; + CGUIRSSControl::CGUIRSSControl(int parentID, int controlID, float posX, float posY, float width, float height, const CLabelInfo& labelInfo, const CGUIInfoColor &channelColor, const CGUIInfoColor &headlineColor, std::string& strRSSTags) : CGUIControl(parentID, controlID, posX, posY, width, height), m_strRSSTags(strRSSTags), @@ -95,15 +97,15 @@ void CGUIRSSControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { bool dirty = false; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_LOOKANDFEEL_ENABLERSSFEEDS) && CRssManager::GetInstance().IsActive()) + if (CSettings::Get().GetBool("lookandfeel.enablerssfeeds") && CRssManager::Get().IsActive()) { CSingleLock lock(m_criticalSection); // Create RSS background/worker thread if needed if (m_pReader == NULL) { - RssUrls::const_iterator iter = CRssManager::GetInstance().GetUrls().find(m_urlset); - if (iter != CRssManager::GetInstance().GetUrls().end()) + RssUrls::const_iterator iter = CRssManager::Get().GetUrls().find(m_urlset); + if (iter != CRssManager::Get().GetUrls().end()) { m_rtl = iter->second.rtl; m_vecUrls = iter->second.url; @@ -113,7 +115,7 @@ dirty = true; - if (CRssManager::GetInstance().GetReader(GetID(), GetParentID(), this, m_pReader)) + if (CRssManager::Get().GetReader(GetID(), GetParentID(), this, m_pReader)) { m_scrollInfo.pixelPos = m_pReader->m_savedScrollPixelPos; } @@ -121,8 +123,8 @@ { if (m_strRSSTags != "") { - std::vector tags = StringUtils::Split(m_strRSSTags, ","); - for (std::vector::const_iterator i = tags.begin(); i != tags.end(); ++i) + vector tags = StringUtils::Split(m_strRSSTags, ","); + for (vector::const_iterator i = tags.begin(); i != tags.end(); ++i) m_pReader->AddTag(*i); } // use half the width of the control as spacing between feeds, and double this between feed sets @@ -156,7 +158,7 @@ void CGUIRSSControl::Render() { // only render the control if they are enabled - if (CSettings::GetInstance().GetBool(CSettings::SETTING_LOOKANDFEEL_ENABLERSSFEEDS) && CRssManager::GetInstance().IsActive()) + if (CSettings::Get().GetBool("lookandfeel.enablerssfeeds") && CRssManager::Get().IsActive()) { if (m_label.font) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIScrollBarControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIScrollBarControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIScrollBarControl.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIScrollBarControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -275,6 +275,13 @@ return changed; } +bool CGUIScrollBar::HitTest(const CPoint &point) const +{ + if (m_guiBackground.HitTest(point)) return true; + if (m_guiBarNoFocus.HitTest(point)) return true; + return false; +} + void CGUIScrollBar::SetFromPosition(const CPoint &point) { float fPercent; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIScrollBarControl.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIScrollBarControl.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIScrollBarControl.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIScrollBarControl.h 2015-10-19 08:39:16.000000000 +0000 @@ -62,6 +62,7 @@ virtual std::string GetDescription() const; virtual bool IsVisible() const; protected: + virtual bool HitTest(const CPoint &point) const; virtual EVENT_RESULT OnMouseEvent(const CPoint &point, const CMouseEvent &event); virtual bool UpdateColors(); bool UpdateBarSize(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIShader.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIShader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIShader.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIShader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -51,7 +51,6 @@ m_proj = NULL; m_model = NULL; - m_clipPossible = false; } void CGUIShader::OnCompiledAndLinked() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIShaderDX.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIShaderDX.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIShaderDX.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIShaderDX.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,444 +0,0 @@ -/* -* Copyright (C) 2005-2015 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ -#ifdef HAS_DX - -#include -#include "GUIShaderDX.h" -#include "guilib/GraphicContext.h" -#include "settings/lib/Setting.h" -#include "settings/Settings.h" -#include "utils/log.h" -#include "windowing/WindowingFactory.h" - -// shaders bytecode includes -#include "guishader_vert.h" -#include "guishader_checkerboard_right.h" -#include "guishader_checkerboard_left.h" -#include "guishader_default.h" -#include "guishader_fonts.h" -#include "guishader_interlaced_right.h" -#include "guishader_interlaced_left.h" -#include "guishader_multi_texture_blend.h" -#include "guishader_texture.h" -#include "guishader_texture_noblend.h" -#include "guishader_video.h" -#include "guishader_video_control.h" - -// shaders bytecode holder -static const D3D_SHADER_DATA cbPSShaderCode[SHADER_METHOD_RENDER_COUNT] = -{ - { guishader_default, sizeof(guishader_default) }, // SHADER_METHOD_RENDER_DEFAULT - { guishader_texture_noblend, sizeof(guishader_texture_noblend) }, // SHADER_METHOD_RENDER_TEXTURE_NOBLEND - { guishader_fonts, sizeof(guishader_fonts) }, // SHADER_METHOD_RENDER_FONT - { guishader_texture, sizeof(guishader_texture) }, // SHADER_METHOD_RENDER_TEXTURE_BLEND - { guishader_multi_texture_blend, sizeof(guishader_multi_texture_blend) }, // SHADER_METHOD_RENDER_MULTI_TEXTURE_BLEND - { guishader_video, sizeof(guishader_video) }, // SHADER_METHOD_RENDER_VIDEO - { guishader_video_control, sizeof(guishader_video_control) }, // SHADER_METHOD_RENDER_VIDEO_CONTROL - { guishader_interlaced_left, sizeof(guishader_interlaced_left) }, // SHADER_METHOD_RENDER_STEREO_INTERLACED_LEFT - { guishader_interlaced_right, sizeof(guishader_interlaced_right) }, // SHADER_METHOD_RENDER_STEREO_INTERLACED_RIGHT - { guishader_checkerboard_left, sizeof(guishader_checkerboard_left) }, // SHADER_METHOD_RENDER_STEREO_CHECKERBOARD_LEFT - { guishader_checkerboard_right, sizeof(guishader_checkerboard_right) }, // SHADER_METHOD_RENDER_STEREO_CHECKERBOARD_RIGHT -}; - -CGUIShaderDX::CGUIShaderDX() : - m_pSampLinear(NULL), - m_pSampPoint(NULL), - m_pVPBuffer(NULL), - m_pWVPBuffer(NULL), - m_pVertexBuffer(NULL), - m_clipXFactor(0.0f), - m_clipXOffset(0.0f), - m_clipYFactor(0.0f), - m_clipYOffset(0.0f), - m_bIsWVPDirty(false), - m_bIsVPDirty(false), - m_bCreated(false), - m_currentShader(0), - m_clipPossible(false) -{ - ZeroMemory(&m_cbViewPort, sizeof(m_cbViewPort)); - ZeroMemory(&m_cbWorldViewProj, sizeof(m_cbWorldViewProj)); -} - -CGUIShaderDX::~CGUIShaderDX() -{ - Release(); -} - -bool CGUIShaderDX::Initialize() -{ - // Create input layout - D3D11_INPUT_ELEMENT_DESC layout[] = - { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT, 0, 36, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - }; - - if (!m_vertexShader.Create(guishader_vert, sizeof(guishader_vert), layout, ARRAYSIZE(layout))) - return false; - - size_t i; - bool bSuccess = true; - for (i = 0; i < SHADER_METHOD_RENDER_COUNT; i++) - { - if (!m_pixelShader[i].Create(cbPSShaderCode[i].pBytecode, cbPSShaderCode[i].BytecodeLength)) - { - bSuccess = false; - break; - } - } - - if (!bSuccess) - { - m_vertexShader.Release(); - for (size_t j = 0; j < i; j++) - m_pixelShader[j].Release(); - } - - if (!bSuccess || !CreateBuffers() || !CreateSamplers()) - return false; - - m_bCreated = true; - return true; -} - -bool CGUIShaderDX::CreateBuffers() -{ - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - - // create vertex buffer - CD3D11_BUFFER_DESC bufferDesc(sizeof(Vertex) * 4, D3D11_BIND_VERTEX_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); - if (FAILED(pDevice->CreateBuffer(&bufferDesc, NULL, &m_pVertexBuffer))) - { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to create GUI vertex buffer."); - return false; - } - - // Create the constant buffer for WVP - size_t buffSize = (sizeof(cbWorld) + 15) & ~15; - CD3D11_BUFFER_DESC cbbd(buffSize, D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); // it can change very frequently - if (FAILED(pDevice->CreateBuffer(&cbbd, NULL, &m_pWVPBuffer))) - { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to create the constant buffer."); - return false; - } - m_bIsWVPDirty = true; - - CRect viewPort; - g_Windowing.GetViewPort(viewPort); - - // initial data for viewport buffer - m_cbViewPort.TopLeftX = viewPort.x1; - m_cbViewPort.TopLeftY = viewPort.y1; - m_cbViewPort.Width = viewPort.Width(); - m_cbViewPort.Height = viewPort.Height(); - - cbbd.ByteWidth = sizeof(cbViewPort); - D3D11_SUBRESOURCE_DATA initData = { &m_cbViewPort, 0, 0 }; - // create viewport buffer - if (FAILED(pDevice->CreateBuffer(&cbbd, &initData, &m_pVPBuffer))) - return false; - - return true; -} - -bool CGUIShaderDX::CreateSamplers() -{ - // Describe the Sampler State - D3D11_SAMPLER_DESC sampDesc; - ZeroMemory(&sampDesc, sizeof(D3D11_SAMPLER_DESC)); - sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; - sampDesc.MinLOD = 0; - sampDesc.MaxLOD = D3D11_FLOAT32_MAX; - - if (FAILED(g_Windowing.Get3D11Device()->CreateSamplerState(&sampDesc, &m_pSampLinear))) - return false; - - sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; - if (FAILED(g_Windowing.Get3D11Device()->CreateSamplerState(&sampDesc, &m_pSampPoint))) - return false; - - ID3D11SamplerState* samplers[] = { m_pSampLinear, m_pSampPoint }; - g_Windowing.Get3D11Context()->PSSetSamplers(0, ARRAYSIZE(samplers), samplers); - - return true; -} - -void CGUIShaderDX::ApplyStateBlock(void) -{ - if (!m_bCreated) - return; - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - - m_vertexShader.BindShader(); - pContext->VSSetConstantBuffers(0, 1, &m_pWVPBuffer); - - m_pixelShader[m_currentShader].BindShader(); - pContext->PSSetConstantBuffers(0, 1, &m_pWVPBuffer); - pContext->PSSetConstantBuffers(1, 1, &m_pVPBuffer); - - ID3D11SamplerState* samplers[] = { m_pSampLinear, m_pSampPoint }; - pContext->PSSetSamplers(0, ARRAYSIZE(samplers), samplers); - - RestoreBuffers(); -} - -void CGUIShaderDX::Begin(unsigned int flags) -{ - if (!m_bCreated) - return; - - if (m_currentShader != flags) - { - m_currentShader = flags; - m_pixelShader[m_currentShader].BindShader(); - } - ClipToScissorParams(); -} - -void CGUIShaderDX::End() -{ - if (!m_bCreated) - return; -} - -void CGUIShaderDX::DrawQuad(Vertex& v1, Vertex& v2, Vertex& v3, Vertex& v4) -{ - if (!m_bCreated) - return; - - ApplyChanges(); - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - - // update vertex buffer - D3D11_MAPPED_SUBRESOURCE resource; - if (SUCCEEDED(pContext->Map(m_pVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource))) - { - // we are using strip topology - Vertex verticies[4] = { v2, v3, v1, v4 }; - memcpy(resource.pData, &verticies, sizeof(Vertex) * 4); - pContext->Unmap(m_pVertexBuffer, 0); - // Draw primitives - pContext->Draw(4, 0); - } -} - -void CGUIShaderDX::DrawIndexed(unsigned int indexCount, unsigned int startIndex, unsigned int startVertex) -{ - if (!m_bCreated) - return; - - ApplyChanges(); - g_Windowing.Get3D11Context()->DrawIndexed(indexCount, startIndex, startVertex); -} - -void CGUIShaderDX::Draw(unsigned int vertexCount, unsigned int startVertex) -{ - if (!m_bCreated) - return; - - ApplyChanges(); - g_Windowing.Get3D11Context()->Draw(vertexCount, startVertex); -} - -void CGUIShaderDX::SetShaderViews(unsigned int numViews, ID3D11ShaderResourceView** views) -{ - if (!m_bCreated) - return; - - g_Windowing.Get3D11Context()->PSSetShaderResources(0, numViews, views); -} - -void CGUIShaderDX::SetSampler(SHADER_SAMPLER sampler) -{ - if (!m_bCreated) - return; - - g_Windowing.Get3D11Context()->PSSetSamplers(1, 1, sampler == SHADER_SAMPLER_POINT ? &m_pSampPoint : &m_pSampLinear); -} - -void CGUIShaderDX::Release() -{ - SAFE_RELEASE(m_pVertexBuffer); - SAFE_RELEASE(m_pWVPBuffer); - SAFE_RELEASE(m_pVPBuffer); - SAFE_RELEASE(m_pSampLinear); - SAFE_RELEASE(m_pSampPoint); - m_bCreated = false; -} - -void CGUIShaderDX::SetViewPort(D3D11_VIEWPORT viewPort) -{ - if (!m_pVPBuffer) - return; - - if ( viewPort.TopLeftX != m_cbViewPort.TopLeftX - || viewPort.TopLeftY != m_cbViewPort.TopLeftY - || viewPort.Width != m_cbViewPort.Width - || viewPort.Height != m_cbViewPort.Height) - { - m_cbViewPort.TopLeftX = viewPort.TopLeftX; - m_cbViewPort.TopLeftY = viewPort.TopLeftY; - m_cbViewPort.Width = viewPort.Width; - m_cbViewPort.Height = viewPort.Height; - m_bIsVPDirty = true; - } -} - -void CGUIShaderDX::Project(float &x, float &y, float &z) -{ - XMVECTOR vLocation = { x, y, z }; - XMVECTOR vScreenCoord = XMVector3Project(vLocation, m_cbViewPort.TopLeftX, m_cbViewPort.TopLeftY, - m_cbViewPort.Width, m_cbViewPort.Height, 0, 1, - m_cbWorldViewProj.projection, m_cbWorldViewProj.view, m_cbWorldViewProj.world); - x = XMVectorGetX(vScreenCoord); - y = XMVectorGetY(vScreenCoord); - z = 0; -} - -void CGUIShaderDX::SetWorld(const XMMATRIX &value) -{ - m_bIsWVPDirty = true; - m_cbWorldViewProj.world = value; -} - -void CGUIShaderDX::SetView(const XMMATRIX &value) -{ - m_bIsWVPDirty = true; - m_cbWorldViewProj.view = value; -} - -void CGUIShaderDX::SetProjection(const XMMATRIX &value) -{ - m_bIsWVPDirty = true; - m_cbWorldViewProj.projection = value; -} - -void CGUIShaderDX::ApplyChanges(void) -{ - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - D3D11_MAPPED_SUBRESOURCE res; - - if (m_bIsWVPDirty) - { - if (SUCCEEDED(pContext->Map(m_pWVPBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res))) - { - XMMATRIX worldView = XMMatrixMultiply(m_cbWorldViewProj.world, m_cbWorldViewProj.view); - XMMATRIX worldViewProj = XMMatrixMultiplyTranspose(worldView, m_cbWorldViewProj.projection); - - cbWorld* buffer = (cbWorld*)res.pData; - buffer->wvp = worldViewProj; - buffer->blackLevel = (g_Windowing.UseLimitedColor() ? 16.f / 255.f : 0.f); - buffer->colorRange = (g_Windowing.UseLimitedColor() ? (235.f - 16.f) / 255.f : 1.0f); - - pContext->Unmap(m_pWVPBuffer, 0); - m_bIsWVPDirty = false; - } - } - - // update view port buffer - if (m_bIsVPDirty) - { - if (SUCCEEDED(pContext->Map(m_pVPBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res))) - { - *(cbViewPort*)res.pData = m_cbViewPort; - pContext->Unmap(m_pVPBuffer, 0); - m_bIsVPDirty = false; - } - } -} - -void CGUIShaderDX::RestoreBuffers(void) -{ - const unsigned stride = sizeof(Vertex); - const unsigned offset = 0; - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - // Set the vertex buffer to active in the input assembler so it can be rendered. - pContext->IASetVertexBuffers(0, 1, &m_pVertexBuffer, &stride, &offset); - // Set the type of primitive that should be rendered from this vertex buffer, in this case triangles. - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); -} - -void CGUIShaderDX::ClipToScissorParams(void) -{ - CRect viewPort; // absolute positions of corners - g_Windowing.GetViewPort(viewPort); - - // get current GUI transform - const TransformMatrix &guiMatrix = g_graphicsContext.GetGUIMatrix(); - // get current GPU transforms - XMFLOAT4X4 world, view, projection; - XMStoreFloat4x4(&world, m_cbWorldViewProj.world); - XMStoreFloat4x4(&view, m_cbWorldViewProj.view); - XMStoreFloat4x4(&projection, m_cbWorldViewProj.projection); - - m_clipPossible = guiMatrix.m[0][1] == 0 && - guiMatrix.m[1][0] == 0 && - guiMatrix.m[2][0] == 0 && - guiMatrix.m[2][1] == 0 && - view.m[0][1] == 0 && - view.m[0][2] == 0 && - view.m[1][0] == 0 && - view.m[1][2] == 0 && - view.m[2][0] == 0 && - view.m[2][1] == 0 && - projection.m[0][1] == 0 && - projection.m[0][2] == 0 && - projection.m[0][3] == 0 && - projection.m[1][0] == 0 && - projection.m[1][2] == 0 && - projection.m[1][3] == 0 && - projection.m[3][0] == 0 && - projection.m[3][1] == 0 && - projection.m[3][3] == 0; - - m_clipXFactor = 0.0f; - m_clipXOffset = 0.0f; - m_clipYFactor = 0.0f; - m_clipYOffset = 0.0f; - - if (m_clipPossible) - { - m_clipXFactor = guiMatrix.m[0][0] * view.m[0][0] * projection.m[0][0]; - m_clipXOffset = (guiMatrix.m[0][3] * view.m[0][0] + view.m[3][0]) * projection.m[0][0]; - m_clipYFactor = guiMatrix.m[1][1] * view.m[1][1] * projection.m[1][1]; - m_clipYOffset = (guiMatrix.m[1][3] * view.m[1][1] + view.m[3][1]) * projection.m[1][1]; - - float clipW = (guiMatrix.m[2][3] * view.m[2][2] + view.m[3][2]) * projection.m[2][3]; - float xMult = (viewPort.x2 - viewPort.x1) / (2 * clipW); - float yMult = (viewPort.y1 - viewPort.y2) / (2 * clipW); // correct for inverted window coordinate scheme - - m_clipXFactor = m_clipXFactor * xMult; - m_clipXOffset = m_clipXOffset * xMult + (viewPort.x2 + viewPort.x1) / 2; - m_clipYFactor = m_clipYFactor * yMult; - m_clipYOffset = m_clipYOffset * yMult + (viewPort.y2 + viewPort.y1) / 2; - } -} - -#endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIShaderDX.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIShaderDX.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIShaderDX.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIShaderDX.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,149 +0,0 @@ -/* -* Copyright (C) 2005-2015 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ -#ifdef HAS_DX - -#pragma once - -#include "Geometry.h" -#include "Texture.h" -#include "D3DResource.h" -#include - -using namespace DirectX; - -struct Vertex { - Vertex() {} - - Vertex(XMFLOAT3 p, XMFLOAT4 c) - : pos(p), color(c) {} - - Vertex(XMFLOAT3 p, XMFLOAT4 c, XMFLOAT2 t1, XMFLOAT2 t2) - : pos(p), color(c), texCoord(t1), texCoord2(t2) {} - - XMFLOAT3 pos; - XMFLOAT4 color; - XMFLOAT2 texCoord; - XMFLOAT2 texCoord2; -}; - -class ID3DResource; - -class CGUIShaderDX -{ -public: - CGUIShaderDX(); - ~CGUIShaderDX(); - - bool Initialize(); - void Begin(unsigned int flags); - void End(void); - void ApplyStateBlock(void); - void RestoreBuffers(void); - - void SetShaderViews(unsigned int numViews, ID3D11ShaderResourceView** views); - void SetViewPort(D3D11_VIEWPORT viewPort); - void SetSampler(SHADER_SAMPLER sampler); - - XMMATRIX XM_CALLCONV GetWorld() const { return m_cbWorldViewProj.world; } - XMMATRIX XM_CALLCONV GetView() const { return m_cbWorldViewProj.view; } - XMMATRIX XM_CALLCONV GetProjection() const { return m_cbWorldViewProj.projection; } - void XM_CALLCONV SetWorld(const XMMATRIX &value); - void XM_CALLCONV SetView(const XMMATRIX &value); - void XM_CALLCONV SetProjection(const XMMATRIX &value); - void Project(float &x, float &y, float &z); - - void DrawQuad(Vertex& v1, Vertex& v2, Vertex& v3, Vertex& v4); - void DrawIndexed(unsigned int indexCount, unsigned int startIndex, unsigned int startVertex); - void Draw(unsigned int vertexCount, unsigned int startVertex); - - bool HardwareClipIsPossible(void) { return m_clipPossible; } - float GetClipXFactor(void) { return m_clipXFactor; } - float GetClipXOffset(void) { return m_clipXOffset; } - float GetClipYFactor(void) { return m_clipYFactor; } - float GetClipYOffset(void) { return m_clipYOffset; } - - // need to use aligned allocation bacause we use XMMATRIX in structures. - static void* operator new (size_t size) - { - void* ptr = _aligned_malloc(size, __alignof(CGUIShaderDX)); - if (!ptr) - throw std::bad_alloc(); - return ptr; - } - // free aligned memory. - static void operator delete (void* ptr) - { - _aligned_free(ptr); - } - -private: - struct cbWorldViewProj - { - XMMATRIX world; - XMMATRIX view; - XMMATRIX projection; - }; - struct cbViewPort - { - float TopLeftX; - float TopLeftY; - float Width; - float Height; - }; - struct cbWorld - { - XMMATRIX wvp; - float blackLevel; - float colorRange; - }; - - void Release(void); - bool CreateBuffers(void); - bool CreateSamplers(void); - void ApplyChanges(void); - void ClipToScissorParams(void); - - // GUI constants - cbViewPort m_cbViewPort; - cbWorldViewProj m_cbWorldViewProj; - - bool m_bCreated; - ID3D11SamplerState* m_pSampLinear; - ID3D11SamplerState* m_pSampPoint; - CD3DVertexShader m_vertexShader; - CD3DPixelShader m_pixelShader[SHADER_METHOD_RENDER_COUNT]; - size_t m_currentShader; - - // GUI buffers - ID3D11Buffer* m_pWVPBuffer; - ID3D11Buffer* m_pVPBuffer; - ID3D11Buffer* m_pVertexBuffer; - bool m_bIsWVPDirty; - bool m_bIsVPDirty; - - // clip to scissors params - bool m_clipPossible; - float m_clipXFactor; - float m_clipXOffset; - float m_clipYFactor; - float m_clipYOffset; -}; - -#endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUISliderControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUISliderControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUISliderControl.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUISliderControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,6 @@ #include "input/Key.h" #include "utils/MathUtils.h" #include "utils/StringUtils.h" -#include "guiinfo/GUIInfoLabels.h" #include "GUIWindowManager.h" static const SliderAction actions[] = { @@ -165,10 +164,12 @@ switch ( action.GetID() ) { case ACTION_MOVE_LEFT: + //case ACTION_OSD_SHOW_VALUE_MIN: Move(-1); return true; case ACTION_MOVE_RIGHT: + //case ACTION_OSD_SHOW_VALUE_PLUS: Move(1); return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUISpinControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUISpinControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUISpinControl.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUISpinControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,17 +23,17 @@ #include "utils/StringUtils.h" #include +using namespace std; + #define SPIN_BUTTON_DOWN 1 #define SPIN_BUTTON_UP 2 -CGUISpinControl::CGUISpinControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureUp, const CTextureInfo& textureDown, const CTextureInfo& textureUpFocus, const CTextureInfo& textureDownFocus, const CTextureInfo& textureUpDisabled, const CTextureInfo& textureDownDisabled, const CLabelInfo &labelInfo, int iType) +CGUISpinControl::CGUISpinControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureUp, const CTextureInfo& textureDown, const CTextureInfo& textureUpFocus, const CTextureInfo& textureDownFocus, const CLabelInfo &labelInfo, int iType) : CGUIControl(parentID, controlID, posX, posY, width, height) , m_imgspinUp(posX, posY, width, height, textureUp) , m_imgspinDown(posX, posY, width, height, textureDown) , m_imgspinUpFocus(posX, posY, width, height, textureUpFocus) , m_imgspinDownFocus(posX, posY, width, height, textureDownFocus) - , m_imgspinUpDisabled(posX, posY, width, height, textureUpDisabled) - , m_imgspinDownDisabled(posX, posY, width, height, textureDownDisabled) , m_label(posX, posY, width, height, labelInfo) { m_bReverse = false; @@ -258,9 +258,9 @@ case GUI_MSG_SET_LABELS: if (message.GetPointer()) { - const std::vector< std::pair > *labels = (const std::vector< std::pair > *)message.GetPointer(); + const vector< pair > *labels = (const vector< pair > *)message.GetPointer(); Clear(); - for (std::vector< std::pair >::const_iterator i = labels->begin(); i != labels->end(); ++i) + for (vector< pair >::const_iterator i = labels->begin(); i != labels->end(); ++i) AddLabel(i->first, i->second); SetValue( message.GetParam1()); } @@ -324,15 +324,11 @@ m_imgspinUpFocus.AllocResources(); m_imgspinDown.AllocResources(); m_imgspinDownFocus.AllocResources(); - m_imgspinUpDisabled.AllocResources(); - m_imgspinDownDisabled.AllocResources(); m_imgspinDownFocus.SetPosition(m_posX, m_posY); m_imgspinDown.SetPosition(m_posX, m_posY); - m_imgspinDownDisabled.SetPosition(m_posX, m_posY); m_imgspinUp.SetPosition(m_posX + m_imgspinDown.GetWidth(), m_posY); m_imgspinUpFocus.SetPosition(m_posX + m_imgspinDownFocus.GetWidth(), m_posY); - m_imgspinUpDisabled.SetPosition(m_posX + m_imgspinDownDisabled.GetWidth(), m_posY); } void CGUISpinControl::FreeResources(bool immediately) @@ -342,8 +338,6 @@ m_imgspinUpFocus.FreeResources(immediately); m_imgspinDown.FreeResources(immediately); m_imgspinDownFocus.FreeResources(immediately); - m_imgspinUpDisabled.FreeResources(immediately); - m_imgspinDownDisabled.FreeResources(immediately); m_iTypedPos = 0; strcpy(m_szTyped, ""); } @@ -355,8 +349,6 @@ m_imgspinUpFocus.DynamicResourceAlloc(bOnOff); m_imgspinDown.DynamicResourceAlloc(bOnOff); m_imgspinDownFocus.DynamicResourceAlloc(bOnOff); - m_imgspinUpDisabled.DynamicResourceAlloc(bOnOff); - m_imgspinDownDisabled.DynamicResourceAlloc(bOnOff); } void CGUISpinControl::SetInvalid() @@ -367,8 +359,6 @@ m_imgspinUpFocus.SetInvalid(); m_imgspinDown.SetInvalid(); m_imgspinDownFocus.SetInvalid(); - m_imgspinUpDisabled.SetInvalid(); - m_imgspinDownDisabled.SetInvalid(); } void CGUISpinControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) @@ -441,18 +431,14 @@ const float space = 5; changed |= m_imgspinDownFocus.SetPosition(m_posX + textWidth + space, m_posY); changed |= m_imgspinDown.SetPosition(m_posX + textWidth + space, m_posY); - changed |= m_imgspinDownDisabled.SetPosition(m_posX + textWidth + space, m_posY); changed |= m_imgspinUpFocus.SetPosition(m_posX + textWidth + space + m_imgspinDown.GetWidth(), m_posY); changed |= m_imgspinUp.SetPosition(m_posX + textWidth + space + m_imgspinDown.GetWidth(), m_posY); - changed |= m_imgspinUpDisabled.SetPosition(m_posX + textWidth + space + m_imgspinDownDisabled.GetWidth(), m_posY); } changed |= m_imgspinDownFocus.Process(currentTime); changed |= m_imgspinDown.Process(currentTime); changed |= m_imgspinUp.Process(currentTime); changed |= m_imgspinUpFocus.Process(currentTime); - changed |= m_imgspinUpDisabled.Process(currentTime); - changed |= m_imgspinDownDisabled.Process(currentTime); changed |= m_label.Process(currentTime); if (changed) @@ -475,16 +461,11 @@ else m_imgspinDown.Render(); } - else if ( !HasFocus() && !IsDisabled() ) + else { m_imgspinUp.Render(); m_imgspinDown.Render(); } - else - { - m_imgspinUpDisabled.Render(); - m_imgspinDownDisabled.Render(); - } if (m_label.GetLabelInfo().font) { @@ -605,19 +586,19 @@ return ""; } -void CGUISpinControl::AddLabel(const std::string& strLabel, int iValue) +void CGUISpinControl::AddLabel(const string& strLabel, int iValue) { m_vecLabels.push_back(strLabel); m_vecValues.push_back(iValue); } -void CGUISpinControl::AddLabel(const std::string& strLabel, const std::string& strValue) +void CGUISpinControl::AddLabel(const string& strLabel, const string& strValue) { m_vecLabels.push_back(strLabel); m_vecStrValues.push_back(strValue); } -const std::string CGUISpinControl::GetLabel() const +const string CGUISpinControl::GetLabel() const { if (m_iValue >= 0 && m_iValue < (int)m_vecLabels.size()) { @@ -632,11 +613,9 @@ m_imgspinDownFocus.SetPosition(posX, posY); m_imgspinDown.SetPosition(posX, posY); - m_imgspinDownDisabled.SetPosition(posX, posY); m_imgspinUp.SetPosition(m_posX + m_imgspinDown.GetWidth(), m_posY); m_imgspinUpFocus.SetPosition(m_posX + m_imgspinDownFocus.GetWidth(), m_posY); - m_imgspinUpDisabled.SetPosition(m_posX + m_imgspinDownDisabled.GetWidth(), m_posY); } @@ -1015,8 +994,6 @@ changed |= m_imgspinDown.SetDiffuseColor(m_diffuseColor); changed |= m_imgspinUp.SetDiffuseColor(m_diffuseColor); changed |= m_imgspinUpFocus.SetDiffuseColor(m_diffuseColor); - changed |= m_imgspinUpDisabled.SetDiffuseColor(m_diffuseColor); - changed |= m_imgspinDownDisabled.SetDiffuseColor(m_diffuseColor); return changed; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUISpinControlEx.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUISpinControlEx.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUISpinControlEx.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUISpinControlEx.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,8 +21,8 @@ #include "GUISpinControlEx.h" #include "utils/StringUtils.h" -CGUISpinControlEx::CGUISpinControlEx(int parentID, int controlID, float posX, float posY, float width, float height, float spinWidth, float spinHeight, const CLabelInfo& spinInfo, const CTextureInfo &textureFocus, const CTextureInfo &textureNoFocus, const CTextureInfo& textureUp, const CTextureInfo& textureDown, const CTextureInfo& textureUpFocus, const CTextureInfo& textureDownFocus, const CTextureInfo& textureUpDisabled, const CTextureInfo& textureDownDisabled, const CLabelInfo& labelInfo, int iType) - : CGUISpinControl(parentID, controlID, posX, posY, spinWidth, spinHeight, textureUp, textureDown, textureUpFocus, textureDownFocus, textureUpDisabled, textureDownDisabled, spinInfo, iType) +CGUISpinControlEx::CGUISpinControlEx(int parentID, int controlID, float posX, float posY, float width, float height, float spinWidth, float spinHeight, const CLabelInfo& spinInfo, const CTextureInfo &textureFocus, const CTextureInfo &textureNoFocus, const CTextureInfo& textureUp, const CTextureInfo& textureDown, const CTextureInfo& textureUpFocus, const CTextureInfo& textureDownFocus, const CLabelInfo& labelInfo, int iType) + : CGUISpinControl(parentID, controlID, posX, posY, spinWidth, spinHeight, textureUp, textureDown, textureUpFocus, textureDownFocus, spinInfo, iType) , m_buttonControl(parentID, controlID, posX, posY, width, height, textureFocus, textureNoFocus, labelInfo) { ControlType = GUICONTROL_SPINEX; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUISpinControlEx.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUISpinControlEx.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUISpinControlEx.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUISpinControlEx.h 2015-10-19 08:39:16.000000000 +0000 @@ -38,7 +38,7 @@ class CGUISpinControlEx : public CGUISpinControl { public: - CGUISpinControlEx(int parentID, int controlID, float posX, float posY, float width, float height, float spinWidth, float spinHeight, const CLabelInfo& spinInfo, const CTextureInfo &textureFocus, const CTextureInfo &textureNoFocus, const CTextureInfo& textureUp, const CTextureInfo& textureDown, const CTextureInfo& textureUpFocus, const CTextureInfo& textureDownFocus, const CTextureInfo& textureUpDisabled, const CTextureInfo& textureDownDisabled, const CLabelInfo& labelInfo, int iType); + CGUISpinControlEx(int parentID, int controlID, float posX, float posY, float width, float height, float spinWidth, float spinHeight, const CLabelInfo& spinInfo, const CTextureInfo &textureFocus, const CTextureInfo &textureNoFocus, const CTextureInfo& textureUp, const CTextureInfo& textureDown, const CTextureInfo& textureUpFocus, const CTextureInfo& textureDownFocus, const CLabelInfo& labelInfo, int iType); virtual ~CGUISpinControlEx(void); virtual CGUISpinControlEx *Clone() const { return new CGUISpinControlEx(*this); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUISpinControl.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUISpinControl.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUISpinControl.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUISpinControl.h 2015-10-19 08:39:16.000000000 +0000 @@ -44,7 +44,7 @@ class CGUISpinControl : public CGUIControl { public: - CGUISpinControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureUp, const CTextureInfo& textureDown, const CTextureInfo& textureUpFocus, const CTextureInfo& textureDownFocus, const CTextureInfo& textureUpDisabled, const CTextureInfo& textureDownDisabled, const CLabelInfo& labelInfo, int iType); + CGUISpinControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureUp, const CTextureInfo& textureDown, const CTextureInfo& textureUpFocus, const CTextureInfo& textureDownFocus, const CLabelInfo& labelInfo, int iType); virtual ~CGUISpinControl(void); virtual CGUISpinControl *Clone() const { return new CGUISpinControl(*this); }; @@ -125,8 +125,6 @@ CGUITexture m_imgspinDown; CGUITexture m_imgspinUpFocus; CGUITexture m_imgspinDownFocus; - CGUITexture m_imgspinUpDisabled; - CGUITexture m_imgspinDownDisabled; CGUILabel m_label; bool m_bShowRange; char m_szTyped[10]; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIStaticItem.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIStaticItem.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIStaticItem.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIStaticItem.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,8 @@ #include "utils/Variant.h" #include "utils/StringUtils.h" +using namespace std; + CGUIStaticItem::CGUIStaticItem(const TiXmlElement *item, int parentID) : CFileItem() { m_visState = false; @@ -49,10 +51,10 @@ SetLabel2(label2.GetLabel(parentID)); SetArt("thumb", thumb.GetLabel(parentID, true)); SetIconImage(icon.GetLabel(parentID, true)); - if (!label.IsConstant()) m_info.push_back(std::make_pair(label, "label")); - if (!label2.IsConstant()) m_info.push_back(std::make_pair(label2, "label2")); - if (!thumb.IsConstant()) m_info.push_back(std::make_pair(thumb, "thumb")); - if (!icon.IsConstant()) m_info.push_back(std::make_pair(icon, "icon")); + if (!label.IsConstant()) m_info.push_back(make_pair(label, "label")); + if (!label2.IsConstant()) m_info.push_back(make_pair(label2, "label2")); + if (!thumb.IsConstant()) m_info.push_back(make_pair(thumb, "thumb")); + if (!icon.IsConstant()) m_info.push_back(make_pair(icon, "icon")); m_iprogramCount = id ? atoi(id) : 0; // add any properties const TiXmlElement *property = item->FirstChildElement("property"); @@ -64,7 +66,7 @@ { SetProperty(name, prop.GetLabel(parentID, true).c_str()); if (!prop.IsConstant()) - m_info.push_back(std::make_pair(prop, name)); + m_info.push_back(make_pair(prop, name)); } property = property->NextSiblingElement("property"); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIStaticItem.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIStaticItem.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIStaticItem.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIStaticItem.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,11 +25,9 @@ \brief */ -#include - -#include "GUIAction.h" #include "GUIInfoTypes.h" #include "xbmc/FileItem.h" +#include "GUIAction.h" class TiXmlElement; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITextBox.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITextBox.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITextBox.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITextBox.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,10 +23,11 @@ #include "utils/XBMCTinyXML.h" #include "utils/MathUtils.h" #include "utils/StringUtils.h" -#include "guiinfo/GUIInfoLabels.h" #include +using namespace std; + CGUITextBox::CGUITextBox(int parentID, int controlID, float posX, float posY, float width, float height, const CLabelInfo& labelInfo, int scrollTime) : CGUIControl(parentID, controlID, posX, posY, width, height) @@ -281,8 +282,11 @@ m_scrollOffset = 0; ResetAutoScrolling(); CGUITextLayout::Reset(); - UpdatePageControl(); - SetInvalid(); + if (m_pageControl) + { + CGUIMessage msg(GUI_MSG_LABEL_RESET, GetID(), m_pageControl, m_itemsPerPage, m_lines.size()); + SendWindowMessage(msg); + } } if (message.GetMessage() == GUI_MSG_PAGE_CHANGE) @@ -390,15 +394,10 @@ return m_lines.size(); } -int CGUITextBox::GetNumPages() const -{ - return (GetRows() + m_itemsPerPage - 1) / m_itemsPerPage; -} - int CGUITextBox::GetCurrentPage() const { if (m_offset + m_itemsPerPage >= GetRows()) // last page - return GetNumPages(); + return (GetRows() + m_itemsPerPage - 1) / m_itemsPerPage; return m_offset / m_itemsPerPage + 1; } @@ -408,7 +407,7 @@ switch (info) { case CONTAINER_NUM_PAGES: - label = StringUtils::Format("%u", GetNumPages()); + label = StringUtils::Format("%u", (GetRows() + m_itemsPerPage - 1) / m_itemsPerPage); break; case CONTAINER_CURRENT_PAGE: label = StringUtils::Format("%u", GetCurrentPage()); @@ -419,19 +418,6 @@ return label; } -bool CGUITextBox::GetCondition(int condition, int data) const -{ - switch (condition) - { - case CONTAINER_HAS_NEXT: - return (GetCurrentPage() < GetNumPages()); - case CONTAINER_HAS_PREVIOUS: - return (GetCurrentPage() > 1); - default: - return false; - } -} - std::string CGUITextBox::GetDescription() const { return GetText(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITextBox.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITextBox.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITextBox.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITextBox.h 2015-10-19 08:39:16.000000000 +0000 @@ -62,9 +62,7 @@ void SetAutoScrolling(const TiXmlNode *node); void SetAutoScrolling(int delay, int time, int repeatTime, const std::string &condition = ""); void ResetAutoScrolling(); - - virtual bool GetCondition(int condition, int data) const; - virtual std::string GetLabel(int info) const; + std::string GetLabel(int info) const; std::string GetDescription() const; void Scroll(unsigned int offset); @@ -77,7 +75,6 @@ void ScrollToOffset(int offset, bool autoScroll = false); unsigned int GetRows() const; int GetCurrentPage() const; - int GetNumPages() const; // auto-height float m_minHeight; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITextLayout.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITextLayout.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITextLayout.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITextLayout.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,8 @@ #include "utils/CharsetConverter.h" #include "utils/StringUtils.h" +using namespace std; + CGUIString::CGUIString(iString start, iString end, bool carriageReturn) { m_text.assign(start, end); @@ -74,11 +76,11 @@ // center our text vertically if (alignment & XBFONT_CENTER_Y) { - y -= m_font->GetTextHeight(m_lines.size()) * 0.5f; + y -= m_font->GetTextHeight(m_lines.size()) * 0.5f;; alignment &= ~XBFONT_CENTER_Y; } m_font->Begin(); - for (std::vector::iterator i = m_lines.begin(); i != m_lines.end(); ++i) + for (vector::iterator i = m_lines.begin(); i != m_lines.end(); ++i) { const CGUIString &string = *i; uint32_t align = alignment; @@ -124,7 +126,7 @@ // center our text vertically if (alignment & XBFONT_CENTER_Y) { - y -= m_font->GetTextHeight(m_lines.size()) * 0.5f; + y -= m_font->GetTextHeight(m_lines.size()) * 0.5f;; alignment &= ~XBFONT_CENTER_Y; } m_font->Begin(); @@ -134,7 +136,7 @@ // any difference to the smoothness of scrolling though which will be // jumpy with this sort of thing. It's not exactly a well used situation // though, so this hack is probably OK. - for (std::vector::iterator i = m_lines.begin(); i != m_lines.end(); ++i) + for (vector::iterator i = m_lines.begin(); i != m_lines.end(); ++i) { const CGUIString &string = *i; m_font->DrawScrollingText(x, y, m_colors, shadowColor, string.m_text, alignment, maxWidth, scrollInfo); @@ -158,7 +160,7 @@ // center our text vertically if (alignment & XBFONT_CENTER_Y) { - y -= m_font->GetTextHeight(m_lines.size()) * 0.5f; + y -= m_font->GetTextHeight(m_lines.size()) * 0.5f;; alignment &= ~XBFONT_CENTER_Y; } if (m_borderFont) @@ -166,7 +168,7 @@ // adjust so the baselines of the fonts align float by = y + m_font->GetTextBaseLine() - m_borderFont->GetTextBaseLine(); m_borderFont->Begin(); - for (std::vector::iterator i = m_lines.begin(); i != m_lines.end(); ++i) + for (vector::iterator i = m_lines.begin(); i != m_lines.end(); ++i) { const CGUIString &string = *i; uint32_t align = alignment; @@ -198,7 +200,7 @@ m_colors[0] = color; m_font->Begin(); - for (std::vector::iterator i = m_lines.begin(); i != m_lines.end(); ++i) + for (vector::iterator i = m_lines.begin(); i != m_lines.end(); ++i) { const CGUIString &string = *i; uint32_t align = alignment; @@ -270,7 +272,7 @@ } // BidiTransform is used to handle RTL text flipping in the string -void CGUITextLayout::BidiTransform(std::vector &lines, bool forceLTRReadingOrder) +void CGUITextLayout::BidiTransform(vector &lines, bool forceLTRReadingOrder) { for (unsigned int i=0; i colorStack; + stack colorStack; colorStack.push(0); // these aren't independent, but that's probably not too much of an issue @@ -408,13 +410,6 @@ (!on && (currentStyle & FONT_STYLE_CAPITALIZE))) // or matching start point newStyle = FONT_STYLE_CAPITALIZE; } - else if (text.compare(pos, 6, L"LIGHT]") == 0) - { - pos += 6; - if ((on && text.find(L"[/LIGHT]", pos) != std::string::npos) || - (!on && (currentStyle & FONT_STYLE_LIGHT))) - newStyle = FONT_STYLE_LIGHT; - } else if (text.compare(pos, 3, L"CR]") == 0 && on) { newLine = true; @@ -503,7 +498,7 @@ m_lines.clear(); - std::vector lines; + vector lines; LineBreakText(text, lines); for (unsigned int i = 0; i < lines.size(); i++) @@ -571,7 +566,7 @@ } } -void CGUITextLayout::LineBreakText(const vecText &text, std::vector &lines) +void CGUITextLayout::LineBreakText(const vecText &text, vector &lines) { int nMaxLines = (m_maxHeight > 0 && m_font && m_font->GetLineHeight() > 0)?(int)ceilf(m_maxHeight / m_font->GetLineHeight()):-1; vecText::const_iterator lineStart = text.begin(); @@ -610,7 +605,7 @@ m_textHeight = 0; if (!m_font) return; - for (std::vector::iterator i = m_lines.begin(); i != m_lines.end(); ++i) + for (vector::iterator i = m_lines.begin(); i != m_lines.end(); ++i) { const CGUIString &string = *i; float w = m_font->GetTextWidth(string.m_text); @@ -623,7 +618,7 @@ unsigned int CGUITextLayout::GetTextLength() const { unsigned int length = 0; - for (std::vector::const_iterator i = m_lines.begin(); i != m_lines.end(); ++i) + for (vector::const_iterator i = m_lines.begin(); i != m_lines.end(); ++i) length += i->m_text.size(); return length; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITexture.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITexture.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITexture.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITexture.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,8 @@ #include "TextureManager.h" #include "GUILargeTextureManager.h" #include "utils/MathUtils.h" -#include "utils/StringUtils.h" + +using namespace std; CTextureInfo::CTextureInfo() { @@ -74,7 +75,9 @@ m_diffuseScaleV = 1.0f; // anim gifs - ResetAnimState(); + m_currentFrame = 0; + m_frameCounter = (unsigned int) -1; + m_currentLoop = 0; m_allocateDynamically = false; m_isAllocated = NO; @@ -111,7 +114,9 @@ m_diffuseScaleU = 1.0f; m_diffuseScaleV = 1.0f; - ResetAnimState(); + m_currentFrame = 0; + m_frameCounter = (unsigned int) -1; + m_currentLoop = 0; m_isAllocated = NO; m_invalid = true; @@ -133,7 +138,9 @@ if (m_allocateDynamically && IsAllocated()) FreeResources(); // reset animated textures (animgifs) - ResetAnimState(); + m_currentLoop = 0; + m_currentFrame = 0; + m_frameCounter = 0; } return false; @@ -146,7 +153,7 @@ changed |= AllocateOnDemand(); if (m_texture.size() > 1) - changed |= UpdateAnimFrame(currentTime); + changed |= UpdateAnimFrame(); if (m_invalid) changed |= CalculateSize(); @@ -289,7 +296,9 @@ return false; // already have our texture // reset our animstate - ResetAnimState(); + m_frameCounter = 0; + m_currentFrame = 0; + m_currentLoop = 0; bool changed = false; bool useLarge = m_info.useLarge || !g_TextureManager.CanLoad(m_info.filename); @@ -461,8 +470,8 @@ m_texture.Reset(); - ResetAnimState(); - + m_currentFrame = 0; + m_currentLoop = 0; m_texCoordsScaleU = 1.0f; m_texCoordsScaleV = 1.0f; @@ -482,46 +491,39 @@ m_invalid = true; } -bool CGUITextureBase::UpdateAnimFrame(unsigned int currentTime) +bool CGUITextureBase::UpdateAnimFrame() { bool changed = false; - unsigned int delay = m_texture.m_delays[m_currentFrame]; - if (m_lasttime == 0) - { - m_lasttime = currentTime; - } - else + m_frameCounter++; + unsigned int delay = m_texture.m_delays[m_currentFrame]; + if (!delay) delay = 100; + if (m_frameCounter * 40 >= delay) { - if ((currentTime - m_lasttime) >= delay) + m_frameCounter = 0; + if (m_currentFrame + 1 >= m_texture.size()) { - if (m_currentFrame + 1 >= m_texture.size()) + if (m_texture.m_loops > 0) { - if (m_texture.m_loops > 0) + if (m_currentLoop + 1 < m_texture.m_loops) { - if (m_currentLoop + 1 < m_texture.m_loops) - { - m_currentLoop++; - m_currentFrame = 0; - m_lasttime = currentTime; - changed = true; - } - } - else - { - // 0 == loop forever + m_currentLoop++; m_currentFrame = 0; - m_lasttime = currentTime; changed = true; } } else { - m_currentFrame++; - m_lasttime = currentTime; + // 0 == loop forever + m_currentFrame = 0; changed = true; } } + else + { + m_currentFrame++; + changed = true; + } } return changed; @@ -591,13 +593,6 @@ } } -void CGUITextureBase::ResetAnimState() -{ - m_lasttime = 0; - m_currentFrame = 0; - m_currentLoop = 0; -} - bool CGUITextureBase::SetWidth(float width) { if (width < m_info.border.x1 + m_info.border.x2) @@ -658,14 +653,6 @@ // filenames mid-animation FreeResources(); m_info.filename = filename; - - // disable large loader and cache for gifs - if (StringUtils::EndsWithNoCase(m_info.filename, ".gif")) - { - m_info.useLarge = false; - SetUseCache(false); - } - // Don't allocate resources here as this is done at render time return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITextureD3D.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITextureD3D.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITextureD3D.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITextureD3D.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,134 +18,220 @@ * */ -#ifdef HAS_DX - -#include "D3DResource.h" -#include "GUIShaderDX.h" -#include "GUITextureD3D.h" #include "Texture.h" +#include "GUITextureD3D.h" #include "windowing/WindowingFactory.h" +#ifdef HAS_DX + CGUITextureD3D::CGUITextureD3D(float posX, float posY, float width, float height, const CTextureInfo &texture) : CGUITextureBase(posX, posY, width, height, texture) { } -CGUITextureD3D::~CGUITextureD3D() -{ -} - void CGUITextureD3D::Begin(color_t color) { + int unit = 0; CBaseTexture* texture = m_texture.m_textures[m_currentFrame]; + LPDIRECT3DDEVICE9 p3DDevice = g_Windowing.Get3DDevice(); + texture->LoadToGPU(); + if (m_diffuse.size()) + m_diffuse.m_textures[0]->LoadToGPU(); + // Set state to render the image + texture->BindToUnit(unit); + p3DDevice->SetTextureStageState( unit, D3DTSS_COLOROP , D3DTOP_MODULATE ); + p3DDevice->SetTextureStageState( unit, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + p3DDevice->SetTextureStageState( unit, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + p3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAOP , D3DTOP_MODULATE ); + p3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + p3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + unit++; + + if (m_diffuse.size()) + { + m_diffuse.m_textures[0]->BindToUnit(1); + p3DDevice->SetTextureStageState( unit, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + p3DDevice->SetTextureStageState( unit, D3DTSS_COLORARG2, D3DTA_CURRENT ); + p3DDevice->SetTextureStageState( unit, D3DTSS_COLOROP , D3DTOP_MODULATE ); + p3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + p3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAARG2, D3DTA_CURRENT ); + p3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAOP , D3DTOP_MODULATE ); + unit++; + } + + if(g_Windowing.UseLimitedColor()) + { + m_col = D3DCOLOR_RGBA(GET_R(color) * (235 - 16) / 255 + , GET_G(color) * (235 - 16) / 255 + , GET_B(color) * (235 - 16) / 255 + , GET_A(color)); + p3DDevice->SetTextureStageState( unit, D3DTSS_COLOROP , D3DTOP_ADD ); + p3DDevice->SetTextureStageState( unit, D3DTSS_COLORARG1, D3DTA_CURRENT) ; + p3DDevice->SetRenderState( D3DRS_TEXTUREFACTOR, D3DCOLOR_RGBA(16,16,16, 0) ); + p3DDevice->SetTextureStageState( unit, D3DTSS_COLORARG2, D3DTA_TFACTOR ); + unit++; + } + else + m_col = color; - if (m_diffuse.size()) - m_diffuse.m_textures[0]->LoadToGPU(); + p3DDevice->SetTextureStageState( unit, D3DTSS_COLOROP, D3DTOP_DISABLE); + p3DDevice->SetTextureStageState( unit, D3DTSS_ALPHAOP, D3DTOP_DISABLE); - m_col = color; + p3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE ); + p3DDevice->SetRenderState( D3DRS_ALPHAREF, 0 ); + p3DDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); + p3DDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + p3DDevice->SetRenderState( D3DRS_FOGENABLE, FALSE ); + p3DDevice->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE ); + p3DDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + p3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + p3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); + p3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + p3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + p3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE); - g_Windowing.SetAlphaBlendEnable(true); + p3DDevice->SetFVF( D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX2 ); } void CGUITextureD3D::End() { + // unset the texture and palette or the texture caching crashes because the runtime still has a reference + g_Windowing.Get3DDevice()->SetTexture( 0, NULL ); + if (m_diffuse.size()) + g_Windowing.Get3DDevice()->SetTexture( 1, NULL ); } void CGUITextureD3D::Draw(float *x, float *y, float *z, const CRect &texture, const CRect &diffuse, int orientation) { - XMFLOAT4 xcolor; - CD3DHelper::XMStoreColor(&xcolor, m_col); + struct CUSTOMVERTEX { + FLOAT x, y, z; + DWORD color; + FLOAT tu, tv; // Texture coordinates + FLOAT tu2, tv2; + }; + + // D3D aligns to half pixel boundaries + for (int i = 0; i < 4; i++) + { + x[i] -= 0.5f; + y[i] -= 0.5f; + }; + + CUSTOMVERTEX verts[4]; + verts[0].x = x[0]; verts[0].y = y[0]; verts[0].z = z[0]; + verts[0].tu = texture.x1; verts[0].tv = texture.y1; + verts[0].tu2 = diffuse.x1; verts[0].tv2 = diffuse.y1; + verts[0].color = m_col; - Vertex verts[4]; - verts[0].pos.x = x[0]; verts[0].pos.y = y[0]; verts[0].pos.z = z[0]; - verts[0].texCoord.x = texture.x1; verts[0].texCoord.y = texture.y1; - verts[0].texCoord2.x = diffuse.x1; verts[0].texCoord2.y = diffuse.y1; - verts[0].color = xcolor; - - verts[1].pos.x = x[1]; verts[1].pos.y = y[1]; verts[1].pos.z = z[1]; + verts[1].x = x[1]; verts[1].y = y[1]; verts[1].z = z[1]; if (orientation & 4) { - verts[1].texCoord.x = texture.x1; - verts[1].texCoord.y = texture.y2; + verts[1].tu = texture.x1; + verts[1].tv = texture.y2; } else { - verts[1].texCoord.x = texture.x2; - verts[1].texCoord.y = texture.y1; + verts[1].tu = texture.x2; + verts[1].tv = texture.y1; } if (m_info.orientation & 4) { - verts[1].texCoord2.x = diffuse.x1; - verts[1].texCoord2.y = diffuse.y2; + verts[1].tu2 = diffuse.x1; + verts[1].tv2 = diffuse.y2; } else { - verts[1].texCoord2.x = diffuse.x2; - verts[1].texCoord2.y = diffuse.y1; + verts[1].tu2 = diffuse.x2; + verts[1].tv2 = diffuse.y1; } - verts[1].color = xcolor; + verts[1].color = m_col; - verts[2].pos.x = x[2]; verts[2].pos.y = y[2]; verts[2].pos.z = z[2]; - verts[2].texCoord.x = texture.x2; verts[2].texCoord.y = texture.y2; - verts[2].texCoord2.x = diffuse.x2; verts[2].texCoord2.y = diffuse.y2; - verts[2].color = xcolor; + verts[2].x = x[2]; verts[2].y = y[2]; verts[2].z = z[2]; + verts[2].tu = texture.x2; verts[2].tv = texture.y2; + verts[2].tu2 = diffuse.x2; verts[2].tv2 = diffuse.y2; + verts[2].color = m_col; - verts[3].pos.x = x[3]; verts[3].pos.y = y[3]; verts[3].pos.z = z[3]; + verts[3].x = x[3]; verts[3].y = y[3]; verts[3].z = z[3]; if (orientation & 4) { - verts[3].texCoord.x = texture.x2; - verts[3].texCoord.y = texture.y1; + verts[3].tu = texture.x2; + verts[3].tv = texture.y1; } else { - verts[3].texCoord.x = texture.x1; - verts[3].texCoord.y = texture.y2; + verts[3].tu = texture.x1; + verts[3].tv = texture.y2; } if (m_info.orientation & 4) { - verts[3].texCoord2.x = diffuse.x2; - verts[3].texCoord2.y = diffuse.y1; + verts[3].tu2 = diffuse.x2; + verts[3].tv2 = diffuse.y1; } else { - verts[3].texCoord2.x = diffuse.x1; - verts[3].texCoord2.y = diffuse.y2; + verts[3].tu2 = diffuse.x1; + verts[3].tv2 = diffuse.y2; } - verts[3].color = xcolor; - - CDXTexture* tex = (CDXTexture *)m_texture.m_textures[m_currentFrame]; - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); + verts[3].color = m_col; - pGUIShader->Begin(m_diffuse.size() ? SHADER_METHOD_RENDER_MULTI_TEXTURE_BLEND : SHADER_METHOD_RENDER_TEXTURE_BLEND); - - if (m_diffuse.size()) - { - CDXTexture* diff = (CDXTexture *)m_diffuse.m_textures[0]; - ID3D11ShaderResourceView* resource[] = { tex->GetShaderResource(), diff->GetShaderResource() }; - pGUIShader->SetShaderViews(ARRAYSIZE(resource), resource); - } - else - { - ID3D11ShaderResourceView* resource = tex->GetShaderResource(); - pGUIShader->SetShaderViews(1, &resource); - } - pGUIShader->DrawQuad(verts[0], verts[1], verts[2], verts[3]); + g_Windowing.Get3DDevice()->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, verts, sizeof(CUSTOMVERTEX)); } void CGUITextureD3D::DrawQuad(const CRect &rect, color_t color, CBaseTexture *texture, const CRect *texCoords) { - unsigned numViews = 0; - ID3D11ShaderResourceView* views = nullptr; + struct CUSTOMVERTEX { + FLOAT x, y, z; + DWORD color; + FLOAT tu, tv; // Texture coordinates + FLOAT tu2, tv2; + }; + + LPDIRECT3DDEVICE9 p3DDevice = g_Windowing.Get3DDevice(); if (texture) { texture->LoadToGPU(); - numViews = 1; - views = ((CDXTexture *)texture)->GetShaderResource(); + texture->BindToUnit(0); + // Set state to render the image + p3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + p3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + p3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + p3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + p3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + p3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + p3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE); + p3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); } + else + p3DDevice->SetTexture( 0, NULL ); + + p3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE ); + p3DDevice->SetRenderState( D3DRS_ALPHAREF, 0 ); + p3DDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ); + p3DDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + p3DDevice->SetRenderState( D3DRS_FOGENABLE, FALSE ); + p3DDevice->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE ); + p3DDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + p3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + p3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); + p3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + p3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + p3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE); + + p3DDevice->SetFVF( D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX2 ); + + CRect coords = texCoords ? *texCoords : CRect(0.0f, 0.0f, 1.0f, 1.0f); + CUSTOMVERTEX verts[4] = { + { rect.x1 - 0.5f, rect.y1 - 0.5f, 0, color, coords.x1, coords.y1, 0, 0 }, + { rect.x2 - 0.5f, rect.y1 - 0.5f, 0, color, coords.x2, coords.y1, 0, 0 }, + { rect.x2 - 0.5f, rect.y2 - 0.5f, 0, color, coords.x2, coords.y2, 0, 0 }, + { rect.x1 - 0.5f, rect.y2 - 0.5f, 0, color, coords.x1, coords.y2, 0, 0 }, + }; + p3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, verts, sizeof(CUSTOMVERTEX)); - CD3DTexture::DrawQuad(rect, color, numViews, &views, texCoords, texture ? SHADER_METHOD_RENDER_TEXTURE_BLEND : SHADER_METHOD_RENDER_DEFAULT); + if (texture) + p3DDevice->SetTexture( 0, NULL ); } #endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITextureD3D.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITextureD3D.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITextureD3D.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITextureD3D.h 2015-10-19 08:39:16.000000000 +0000 @@ -29,7 +29,6 @@ */ #include "GUITexture.h" -#include "D3DResource.h" #ifdef HAS_DX @@ -37,16 +36,13 @@ { public: CGUITextureD3D(float posX, float posY, float width, float height, const CTextureInfo& texture); - ~CGUITextureD3D(); static void DrawQuad(const CRect &coords, color_t color, CBaseTexture *texture = NULL, const CRect *texCoords = NULL); - protected: void Begin(color_t color); void Draw(float *x, float *y, float *z, const CRect &texture, const CRect &diffuse, int orientation); void End(); - private: - color_t m_col; + color_t m_col; }; #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITexture.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITexture.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUITexture.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUITexture.h 2015-10-19 08:39:16.000000000 +0000 @@ -126,10 +126,9 @@ bool CalculateSize(); void LoadDiffuseImage(); bool AllocateOnDemand(); - bool UpdateAnimFrame(unsigned int currentTime); + bool UpdateAnimFrame(); void Render(float left, float top, float bottom, float right, float u1, float v1, float u2, float v2, float u3, float v3); static void OrientateTexture(CRect &rect, float width, float height, int orientation); - void ResetAnimState(); // functions that our implementation classes handle virtual void Allocate() {}; ///< called after our textures have been allocated @@ -157,7 +156,7 @@ // animations int m_currentLoop; unsigned int m_currentFrame; - uint32_t m_lasttime; + uint32_t m_frameCounter; float m_diffuseU, m_diffuseV; // size of the diffuse frame (in tex coords) float m_diffuseScaleU, m_diffuseScaleV; // scale factor of the diffuse frame (from texture coords to diffuse tex coords) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIToggleButtonControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIToggleButtonControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIToggleButtonControl.cpp 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIToggleButtonControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,9 +24,11 @@ #include "GUIInfoManager.h" #include "input/Key.h" -CGUIToggleButtonControl::CGUIToggleButtonControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureFocus, const CTextureInfo& textureNoFocus, const CTextureInfo& altTextureFocus, const CTextureInfo& altTextureNoFocus, const CLabelInfo &labelInfo, bool wrapMultiLine) - : CGUIButtonControl(parentID, controlID, posX, posY, width, height, textureFocus, textureNoFocus, labelInfo, wrapMultiLine) - , m_selectButton(parentID, controlID, posX, posY, width, height, altTextureFocus, altTextureNoFocus, labelInfo, wrapMultiLine) +using namespace std; + +CGUIToggleButtonControl::CGUIToggleButtonControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureFocus, const CTextureInfo& textureNoFocus, const CTextureInfo& altTextureFocus, const CTextureInfo& altTextureNoFocus, const CLabelInfo &labelInfo) + : CGUIButtonControl(parentID, controlID, posX, posY, width, height, textureFocus, textureNoFocus, labelInfo) + , m_selectButton(parentID, controlID, posX, posY, width, height, altTextureFocus, altTextureNoFocus, labelInfo) { ControlType = GUICONTROL_TOGGLEBUTTON; } @@ -38,8 +40,14 @@ void CGUIToggleButtonControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { // ask our infoManager whether we are selected or not... + bool selected = m_bSelected; if (m_toggleSelect) - m_bSelected = m_toggleSelect->Get(); + selected = m_toggleSelect->Get(); + if (selected != m_bSelected) + { + MarkDirtyRegion(); + m_bSelected = selected; + } if (m_bSelected) { @@ -48,25 +56,9 @@ m_selectButton.SetVisible(IsVisible()); m_selectButton.SetEnabled(!IsDisabled()); m_selectButton.SetPulseOnSelect(m_pulseOnSelect); - ProcessToggle(currentTime); m_selectButton.DoProcess(currentTime, dirtyregions); } - else - CGUIButtonControl::Process(currentTime, dirtyregions); -} - -void CGUIToggleButtonControl::ProcessToggle(unsigned int currentTime) -{ - bool changed = false; - - changed |= m_label.SetMaxRect(m_posX, m_posY, GetWidth(), m_height); - changed |= m_label.SetText(GetDescription()); - changed |= m_label.SetColor(GetTextColor()); - changed |= m_label.SetScrolling(HasFocus()); - changed |= m_label.Process(currentTime); - - if (changed) - MarkDirtyRegion(); + CGUIButtonControl::Process(currentTime, dirtyregions); } void CGUIToggleButtonControl::Render() @@ -134,12 +126,6 @@ m_selectButton.SetHeight(height); } -void CGUIToggleButtonControl::SetMinWidth(float minWidth) -{ - CGUIButtonControl::SetMinWidth(minWidth); - m_selectButton.SetMinWidth(minWidth); -} - bool CGUIToggleButtonControl::UpdateColors() { bool changed = CGUIButtonControl::UpdateColors(); @@ -149,13 +135,13 @@ return changed; } -void CGUIToggleButtonControl::SetLabel(const std::string &label) +void CGUIToggleButtonControl::SetLabel(const string &strLabel) { - CGUIButtonControl::SetLabel(label); - m_selectButton.SetLabel(label); + CGUIButtonControl::SetLabel(strLabel); + m_selectButton.SetLabel(strLabel); } -void CGUIToggleButtonControl::SetAltLabel(const std::string &label) +void CGUIToggleButtonControl::SetAltLabel(const string &label) { if (label.size()) m_selectButton.SetLabel(label); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIToggleButtonControl.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIToggleButtonControl.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIToggleButtonControl.h 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIToggleButtonControl.h 2015-10-19 08:39:16.000000000 +0000 @@ -37,7 +37,7 @@ class CGUIToggleButtonControl : public CGUIButtonControl { public: - CGUIToggleButtonControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureFocus, const CTextureInfo& textureNoFocus, const CTextureInfo& altTextureFocus, const CTextureInfo& altTextureNoFocus, const CLabelInfo &labelInfo, bool wrapMultiline = false); + CGUIToggleButtonControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureFocus, const CTextureInfo& textureNoFocus, const CTextureInfo& altTextureFocus, const CTextureInfo& altTextureNoFocus, const CLabelInfo &labelInfo); virtual ~CGUIToggleButtonControl(void); virtual CGUIToggleButtonControl *Clone() const { return new CGUIToggleButtonControl(*this); }; @@ -51,8 +51,7 @@ virtual void SetPosition(float posX, float posY); virtual void SetWidth(float width); virtual void SetHeight(float height); - virtual void SetMinWidth(float minWidth); - virtual void SetLabel(const std::string& label); + void SetLabel(const std::string& strLabel); void SetAltLabel(const std::string& label); virtual std::string GetDescription() const; void SetToggleSelect(const std::string &toggleSelect); @@ -63,9 +62,5 @@ virtual void OnClick(); CGUIButtonControl m_selectButton; INFO::InfoPtr m_toggleSelect; - -private: - void ProcessToggle(unsigned int currentTime); - std::string m_altLabel; }; #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIVisualisationControl.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIVisualisationControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIVisualisationControl.cpp 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIVisualisationControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,7 @@ #include "utils/log.h" #include "input/Key.h" +using namespace std; using namespace ADDON; #define LABEL_ROW1 10 @@ -100,7 +101,7 @@ if (!m_addon && !m_bAttemptedLoad) { AddonPtr addon; - if (ADDON::CAddonMgr::GetInstance().GetDefault(ADDON_VIZ, addon)) + if (ADDON::CAddonMgr::Get().GetDefault(ADDON_VIZ, addon)) { m_addon = std::dynamic_pointer_cast(addon); if (m_addon) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIWindow.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIWindow.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIWindow.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIWindow.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -35,7 +35,7 @@ #include "utils/XMLUtils.h" #include "GUIAudioManager.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "utils/Variant.h" #include "utils/StringUtils.h" @@ -43,7 +43,7 @@ #include "utils/PerformanceSample.h" #endif -using namespace KODI::MESSAGING; +using namespace std; bool CGUIWindow::icompare::operator()(const std::string &s1, const std::string &s2) const { @@ -55,13 +55,14 @@ SetID(id); SetProperty("xmlfile", xmlFile); m_lastControlID = 0; + m_overlayState = OVERLAY_STATE_PARENT_WINDOW; // Use parent or previous window's state m_isDialog = false; m_needsScaling = true; m_windowLoaded = false; m_loadType = LOAD_EVERY_TIME; m_closing = false; m_active = false; - m_renderOrder = RENDER_ORDER_WINDOW; + m_renderOrder = 0; m_dynamicResourceAlloc = true; m_previousWindow = WINDOW_INVALID; m_animationsEnabled = true; @@ -69,8 +70,6 @@ m_exclusiveMouseControl = 0; m_clearBackground = 0xff000000; // opaque black -> always clear m_windowXMLRootElement = NULL; - m_menuControlID = 0; - m_menuLastFocusedControlID = 0; } CGUIWindow::~CGUIWindow(void) @@ -205,10 +204,6 @@ m_defaultAlways = true; m_defaultControl = atoi(pChild->FirstChild()->Value()); } - else if(strValue == "menucontrol" && pChild->FirstChild()) - { - m_menuControlID = atoi(pChild->FirstChild()->Value()); - } else if (strValue == "visible" && pChild->FirstChild()) { std::string condition; @@ -251,11 +246,6 @@ pChild->QueryFloatAttribute("y", &m_camera.y); m_hasCamera = true; } - else if (strValue == "depth" && pChild->FirstChild()) - { - float stereo = (float)atof(pChild->FirstChild()->Value());; - m_stereo = std::max(-1.f, std::min(1.f, stereo)); - } else if (strValue == "controls") { TiXmlElement *pControl = pChild->FirstChildElement(); @@ -268,6 +258,12 @@ pControl = pControl->NextSiblingElement(); } } + else if (strValue == "allowoverlay") + { + bool overlay = false; + if (XMLUtils::GetBoolean(pRootElement, "allowoverlay", overlay)) + m_overlayState = overlay ? OVERLAY_STATE_SHOWN : OVERLAY_STATE_HIDDEN; + } pChild = pChild->NextSiblingElement(); } @@ -405,11 +401,7 @@ { // make sure graphics lock is not held CSingleExit leaveIt(g_graphicsContext); - int param2 = (forceClose ? 0x01 : 0) | (enableSound ? 0x02 : 0); - if (bWait) - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_WINDOW_CLOSE, nextWindowID, param2, static_cast(this)); - else - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_WINDOW_CLOSE, nextWindowID, param2, static_cast(this)); + CApplicationMessenger::Get().Close(this, forceClose, bWait, nextWindowID, enableSound); } else Close_Internal(forceClose, nextWindowID, enableSound); @@ -435,41 +427,8 @@ } // default implementations - switch(action.GetID()) - { - case ACTION_NAV_BACK: - case ACTION_PREVIOUS_MENU: - return OnBack(action.GetID()); - case ACTION_SHOW_INFO: - return OnInfo(action.GetID()); - case ACTION_MENU: - if (m_menuControlID > 0) - { - CGUIControl *menu = GetControl(m_menuControlID); - if (menu) - { - int focusControlId; - if (!menu->HasFocus()) - { - // focus the menu control - focusControlId = m_menuControlID; - // To support a toggle behaviour we store the last focused control id - // to restore (focus) this control if the menu control has the focus - // while you press the menu button again. - m_menuLastFocusedControlID = GetFocusedControlID(); - } - else - { - // restore the last focused control or if not exists use the default control - focusControlId = m_menuLastFocusedControlID > 0 ? m_menuLastFocusedControlID : m_defaultControl; - } - - CGUIMessage msg = CGUIMessage(GUI_MSG_SETFOCUS, GetID(), focusControlId); - return OnMessage(msg); - } - } - break; - } + if (action.GetID() == ACTION_NAV_BACK || action.GetID() == ACTION_PREVIOUS_MENU) + return OnBack(action.GetID()); return false; } @@ -550,6 +509,7 @@ RestoreControlStates(); SetInitialVisibility(); QueueAnimation(ANIM_TYPE_WINDOW_OPEN); + g_windowManager.ShowOverlay(m_overlayState); if (!m_manualRunActions) { @@ -840,7 +800,7 @@ // if not app thread, send gui msg via app messenger // and wait for results, so windowLoaded flag would be updated CGUIMessage msg(GUI_MSG_WINDOW_LOAD, 0, 0); - CApplicationMessenger::GetInstance().SendGUIMessage(msg, GetID(), true); + CApplicationMessenger::Get().SendGUIMessage(msg, GetID(), true); } return m_windowLoaded; } @@ -932,7 +892,7 @@ void CGUIWindow::RestoreControlStates() { - for (std::vector::iterator it = m_controlStates.begin(); it != m_controlStates.end(); ++it) + for (vector::iterator it = m_controlStates.begin(); it != m_controlStates.end(); ++it) { CGUIMessage message(GUI_MSG_ITEM_SELECT, GetID(), (*it).m_id, (*it).m_data); OnMessage(message); @@ -964,12 +924,12 @@ fromControl, GetID()); return false; } - std::vector moveHistory; + vector moveHistory; int nextControl = fromControl; while (control) { // grab the next control direction moveHistory.push_back(nextControl); - CGUIAction action = control->GetAction(moveAction); + CGUIAction action = control->GetNavigateAction(moveAction); action.ExecuteActions(nextControl, GetParentID()); nextControl = action.GetNavigation(); if (!nextControl) // 0 isn't valid control id @@ -994,20 +954,18 @@ void CGUIWindow::SetDefaults() { - m_renderOrder = RENDER_ORDER_WINDOW; + m_renderOrder = 0; m_defaultAlways = false; m_defaultControl = 0; m_posX = m_posY = m_width = m_height = 0; + m_overlayState = OVERLAY_STATE_PARENT_WINDOW; // Use parent or previous window's state m_previousWindow = WINDOW_INVALID; m_animations.clear(); m_origins.clear(); m_hasCamera = false; - m_stereo = 0.f; m_animationsEnabled = true; m_clearBackground = 0xff000000; // opaque black -> clear m_hitRect.SetRect(0, 0, (float)m_coordsRes.iWidth, (float)m_coordsRes.iHeight); - m_menuControlID = 0; - m_menuLastFocusedControlID = 0; } CRect CGUIWindow::GetScaledBounds() const diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIWindow.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIWindow.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIWindow.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIWindow.h 2015-10-19 08:39:16.000000000 +0000 @@ -36,7 +36,6 @@ #include "GUICallback.h" // for GUIEvent -#include #include #include @@ -52,15 +51,6 @@ m_mapSelectedEvents[i] = selectedHandler; \ } \ -enum RenderOrder { - RENDER_ORDER_WINDOW = 0, - RENDER_ORDER_DIALOG = 1, - RENDER_ORDER_WINDOW_SCREENSAVER = INT_MAX, - RENDER_ORDER_WINDOW_POINTER = INT_MAX - 1, - RENDER_ORDER_WINDOW_DEBUG = INT_MAX - 2, - RENDER_ORDER_DIALOG_TELETEXT = INT_MAX - 3 -}; - // forward class TiXmlNode; class TiXmlElement; @@ -127,7 +117,6 @@ virtual bool OnAction(const CAction &action); virtual bool OnBack(int actionID); - virtual bool OnInfo(int actionID) { return false; }; /*! \brief Clear the background (if necessary) prior to rendering the window */ @@ -154,7 +143,6 @@ virtual bool IsSoundEnabled() const { return true; }; virtual CFileItemPtr GetCurrentListItem(int offset = 0) { return CFileItemPtr(); }; virtual int GetViewContainerID() const { return 0; }; - virtual bool CanBeActivated() const { return true; }; virtual bool IsActive() const; void SetCoordsRes(const RESOLUTION_INFO &res) { m_coordsRes = res; }; const RESOLUTION_INFO &GetCoordsRes() const { return m_coordsRes; }; @@ -166,6 +154,10 @@ // versions of UpdateVisibility, and are deemed visible if they're in // the window manager's active list. + enum OVERLAY_STATE { OVERLAY_STATE_PARENT_WINDOW=0, OVERLAY_STATE_SHOWN, OVERLAY_STATE_HIDDEN }; + + OVERLAY_STATE GetOverlayState() const { return m_overlayState; }; + virtual bool IsAnimating(ANIMATION_TYPE animType); void DisableAnimations(); @@ -239,6 +231,7 @@ void LoadControl(TiXmlElement* pControl, CGUIControlGroup *pGroup, const CRect &rect); std::vector m_idRange; + OVERLAY_STATE m_overlayState; RESOLUTION_INFO m_coordsRes; // resolution that the window coordinates are in. bool m_needsScaling; bool m_windowLoaded; // true if the window's xml file has been loaded @@ -279,9 +272,6 @@ int m_exclusiveMouseControl; ///< \brief id of child control that wishes to receive all mouse events \sa GUI_MSG_EXCLUSIVE_MOUSE - int m_menuControlID; - int m_menuLastFocusedControlID; - private: std::map m_mapProperties; std::map m_xmlIncludeConditions; ///< \brief used to store conditions used to resolve includes for this window diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIWindowManager.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIWindowManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIWindowManager.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIWindowManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see + * along with XBMC; see the file COPYING. If not, see * . * */ @@ -22,8 +22,7 @@ #include "GUIAudioManager.h" #include "GUIDialog.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" +#include "ApplicationMessenger.h" #include "GUIPassword.h" #include "GUIInfoManager.h" #include "threads/SingleLock.h" @@ -37,11 +36,11 @@ #include "utils/StringUtils.h" #include "windows/GUIWindowHome.h" -#include "events/windows/GUIWindowEventLog.h" #include "settings/windows/GUIWindowSettings.h" #include "windows/GUIWindowFileManager.h" #include "settings/windows/GUIWindowSettingsCategory.h" #include "music/windows/GUIWindowMusicPlaylist.h" +#include "music/windows/GUIWindowMusicSongs.h" #include "music/windows/GUIWindowMusicNav.h" #include "music/windows/GUIWindowMusicPlaylistEditor.h" #include "video/windows/GUIWindowVideoPlaylist.h" @@ -72,6 +71,8 @@ #include "windows/GUIWindowStartup.h" #include "video/windows/GUIWindowFullScreen.h" #include "video/dialogs/GUIDialogVideoOSD.h" +#include "music/dialogs/GUIDialogMusicOverlay.h" +#include "video/dialogs/GUIDialogVideoOverlay.h" // Dialog includes @@ -97,6 +98,7 @@ #include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogVolumeBar.h" #include "dialogs/GUIDialogMuteBug.h" +#include "video/dialogs/GUIDialogFileStacking.h" #include "dialogs/GUIDialogNumeric.h" #include "dialogs/GUIDialogGamepad.h" #include "dialogs/GUIDialogSubMenu.h" @@ -127,7 +129,6 @@ #include "pvr/dialogs/GUIDialogPVRGuideInfo.h" #include "pvr/dialogs/GUIDialogPVRGuideOSD.h" #include "pvr/dialogs/GUIDialogPVRGuideSearch.h" -#include "pvr/dialogs/GUIDialogPVRRadioRDSInfo.h" #include "pvr/dialogs/GUIDialogPVRRecordingInfo.h" #include "pvr/dialogs/GUIDialogPVRTimerSettings.h" @@ -136,19 +137,23 @@ #include "dialogs/GUIDialogPlayEject.h" #include "dialogs/GUIDialogMediaFilter.h" #include "video/dialogs/GUIDialogSubtitles.h" -#include "settings/dialogs/GUIDialogAudioDSPManager.h" -#include "settings/dialogs/GUIDialogAudioDSPSettings.h" +#ifdef HAS_KARAOKE +#include "music/karaoke/GUIDialogKaraokeSongSelector.h" +#include "music/karaoke/GUIWindowKaraokeLyrics.h" +#endif + +#include "peripherals/dialogs/GUIDialogPeripheralManager.h" #include "peripherals/dialogs/GUIDialogPeripheralSettings.h" -#include "addons/AddonCallbacksGUI.h" +using namespace std; using namespace PVR; using namespace PERIPHERALS; -using namespace KODI::MESSAGING; CGUIWindowManager::CGUIWindowManager(void) { m_pCallback = NULL; + m_bShowOverlay = true; m_iNested = 0; m_initialized = false; } @@ -164,8 +169,6 @@ m_initialized = true; LoadNotOnDemandWindows(); - - CApplicationMessenger::GetInstance().RegisterReceiver(this); } void CGUIWindowManager::CreateWindows() @@ -207,6 +210,10 @@ Add(new CGUIDialogButtonMenu); Add(new CGUIDialogMuteBug); Add(new CGUIDialogPlayerControls); +#ifdef HAS_KARAOKE + Add(new CGUIDialogKaraokeSongSelectorSmall); + Add(new CGUIDialogKaraokeSongSelectorLarge); +#endif Add(new CGUIDialogSlider); Add(new CGUIDialogMusicOSD); Add(new CGUIDialogVisualisationPresetList); @@ -235,12 +242,14 @@ Add(new CGUIDialogPlayEject); + Add(new CGUIDialogPeripheralManager); Add(new CGUIDialogPeripheralSettings); Add(new CGUIDialogMediaFilter); Add(new CGUIDialogSubtitles); Add(new CGUIWindowMusicPlayList); + Add(new CGUIWindowMusicSongs); Add(new CGUIWindowMusicNav); Add(new CGUIWindowMusicPlaylistEditor); @@ -255,7 +264,6 @@ Add(new CGUIWindowPVRRecordings(true)); Add(new CGUIWindowPVRGuide(true)); Add(new CGUIWindowPVRTimers(true)); - Add(new CGUIDialogPVRRadioRDSInfo); Add(new CGUIWindowPVRSearch(true)); Add(new CGUIDialogPVRGuideInfo); Add(new CGUIDialogPVRRecordingInfo); @@ -266,9 +274,6 @@ Add(new CGUIDialogPVRChannelsOSD); Add(new CGUIDialogPVRGuideOSD); - Add(new ActiveAE::CGUIDialogAudioDSPManager); - Add(new ActiveAE::CGUIDialogAudioDSPSettings); - Add(new CGUIDialogSelect); Add(new CGUIDialogMusicInfo); Add(new CGUIDialogOK); @@ -277,14 +282,18 @@ Add(new CGUIWindowFullScreen); Add(new CGUIWindowVisualisation); Add(new CGUIWindowSlideShow); + Add(new CGUIDialogFileStacking); +#ifdef HAS_KARAOKE + Add(new CGUIWindowKaraokeLyrics); +#endif Add(new CGUIDialogVideoOSD); + Add(new CGUIDialogMusicOverlay); + Add(new CGUIDialogVideoOverlay); Add(new CGUIWindowScreensaver); Add(new CGUIWindowWeather); Add(new CGUIWindowStartup); Add(new CGUIWindowSplash); - - Add(new CGUIWindowEventLog); } bool CGUIWindowManager::DestroyWindows() @@ -310,10 +319,13 @@ Delete(WINDOW_DIALOG_BUTTON_MENU); Delete(WINDOW_DIALOG_CONTEXT_MENU); Delete(WINDOW_DIALOG_PLAYER_CONTROLS); + Delete(WINDOW_DIALOG_KARAOKE_SONGSELECT); + Delete(WINDOW_DIALOG_KARAOKE_SELECTOR); Delete(WINDOW_DIALOG_MUSIC_OSD); Delete(WINDOW_DIALOG_VIS_PRESET_LIST); Delete(WINDOW_DIALOG_SELECT); Delete(WINDOW_DIALOG_OK); + Delete(WINDOW_DIALOG_FILESTACKING); Delete(WINDOW_DIALOG_KEYBOARD); Delete(WINDOW_FULLSCREEN_VIDEO); Delete(WINDOW_DIALOG_PROFILE_SETTINGS); @@ -355,20 +367,17 @@ Delete(WINDOW_DIALOG_PVR_CHANNEL_MANAGER); Delete(WINDOW_DIALOG_PVR_GUIDE_SEARCH); Delete(WINDOW_DIALOG_PVR_CHANNEL_SCAN); - Delete(WINDOW_DIALOG_PVR_RADIO_RDS_INFO); Delete(WINDOW_DIALOG_PVR_UPDATE_PROGRESS); Delete(WINDOW_DIALOG_PVR_OSD_CHANNELS); Delete(WINDOW_DIALOG_PVR_OSD_GUIDE); Delete(WINDOW_DIALOG_OSD_TELETEXT); - Delete(WINDOW_DIALOG_AUDIO_DSP_MANAGER); - Delete(WINDOW_DIALOG_AUDIO_DSP_OSD_SETTINGS); - Delete(WINDOW_DIALOG_TEXT_VIEWER); Delete(WINDOW_DIALOG_PLAY_EJECT); Delete(WINDOW_STARTUP_ANIM); Delete(WINDOW_LOGIN_SCREEN); Delete(WINDOW_VISUALISATION); + Delete(WINDOW_KARAOKELYRICS); Delete(WINDOW_SETTINGS_MENU); Delete(WINDOW_SETTINGS_PROFILES); Delete(WINDOW_SETTINGS_MYPICTURES); // all the settings categories @@ -377,6 +386,8 @@ Delete(WINDOW_SYSTEM_INFORMATION); Delete(WINDOW_SCREENSAVER); Delete(WINDOW_DIALOG_VIDEO_OSD); + Delete(WINDOW_DIALOG_MUSIC_OVERLAY); + Delete(WINDOW_DIALOG_VIDEO_OVERLAY); Delete(WINDOW_SLIDESHOW); Delete(WINDOW_ADDON_BROWSER); Delete(WINDOW_SKIN_SETTINGS); @@ -399,8 +410,6 @@ Remove(WINDOW_DIALOG_SEEK_BAR); Remove(WINDOW_DIALOG_VOLUME_BAR); - - Delete(WINDOW_EVENT_LOG); } catch (...) { @@ -541,8 +550,8 @@ // push back all the windows if there are more than one covered by this class CSingleLock lock(g_graphicsContext); m_idCache.Invalidate(); - const std::vector& idRange = pWindow->GetIDRange(); - for (std::vector::const_iterator idIt = idRange.begin(); idIt != idRange.end() ; ++idIt) + const vector& idRange = pWindow->GetIDRange(); + for (vector::const_iterator idIt = idRange.begin(); idIt != idRange.end() ; ++idIt) { WindowMap::iterator it = m_mapWindows.find(*idIt); if (it != m_mapWindows.end()) @@ -551,7 +560,7 @@ "to the window manager", *idIt); return; } - m_mapWindows.insert(std::pair(*idIt, pWindow)); + m_mapWindows.insert(pair(*idIt, pWindow)); } } @@ -581,7 +590,7 @@ WindowMap::iterator it = m_mapWindows.find(id); if (it != m_mapWindows.end()) { - for(std::vector::iterator it2 = m_activeDialogs.begin(); it2 != m_activeDialogs.end();) + for(vector::iterator it2 = m_activeDialogs.begin(); it2 != m_activeDialogs.end();) { if(*it2 == it->second) it2 = m_activeDialogs.erase(it2); @@ -661,6 +670,9 @@ // tell our info manager which window we are going to g_infoManager.SetNextWindow(previousWindow); + // set our overlay state (enables out animations on window change) + HideOverlay(pNewWindow->GetOverlayState()); + // deinitialize our window CloseWindowSync(pCurrentWindow); @@ -681,7 +693,7 @@ void CGUIWindowManager::ChangeActiveWindow(int newWindow, const std::string& strPath) { - std::vector params; + vector params; if (!strPath.empty()) params.push_back(strPath); ActivateWindow(newWindow, params, true); @@ -689,7 +701,7 @@ void CGUIWindowManager::ActivateWindow(int iWindowID, const std::string& strPath) { - std::vector params; + vector params; if (!strPath.empty()) params.push_back(strPath); ActivateWindow(iWindowID, params, false); @@ -697,19 +709,19 @@ void CGUIWindowManager::ForceActivateWindow(int iWindowID, const std::string& strPath) { - std::vector params; + vector params; if (!strPath.empty()) params.push_back(strPath); ActivateWindow(iWindowID, params, false, true); } -void CGUIWindowManager::ActivateWindow(int iWindowID, const std::vector& params, bool swappingWindows /* = false */, bool force /* = false */) +void CGUIWindowManager::ActivateWindow(int iWindowID, const vector& params, bool swappingWindows /* = false */, bool force /* = false */) { if (!g_application.IsCurrentThread()) { // make sure graphics lock is not held CSingleExit leaveIt(g_graphicsContext); - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTIVATE_WINDOW, iWindowID, swappingWindows ? 1 : 0, nullptr, "", params); + CApplicationMessenger::Get().ActivateWindow(iWindowID, params, swappingWindows, force); } else { @@ -718,13 +730,16 @@ } } -void CGUIWindowManager::ActivateWindow_Internal(int iWindowID, const std::vector& params, bool swappingWindows, bool force /* = false */) +void CGUIWindowManager::ActivateWindow_Internal(int iWindowID, const vector& params, bool swappingWindows, bool force /* = false */) { // translate virtual windows // virtual music window which returns the last open music window (aka the music start window) - if (iWindowID == WINDOW_MUSIC || iWindowID == WINDOW_MUSIC_FILES) - { // backward compatibility for pre-something - iWindowID = WINDOW_MUSIC_NAV; + if (iWindowID == WINDOW_MUSIC) + { + iWindowID = CSettings::Get().GetInt("mymusic.startwindow"); + // ensure the music virtual window only returns music files and music library windows + if (iWindowID != WINDOW_MUSIC_NAV) + iWindowID = WINDOW_MUSIC_FILES; } // virtual video window which returns the last open video window (aka the video start window) if (iWindowID == WINDOW_VIDEOS || iWindowID == WINDOW_VIDEO_FILES) @@ -758,16 +773,12 @@ CLog::Log(LOGERROR, "Unable to locate window with id %d. Check skin files", iWindowID - WINDOW_HOME); return ; } - else if (!pNewWindow->CanBeActivated()) - { - return; - } else if (pNewWindow->IsDialog()) { // if we have a dialog, we do a DoModal() rather than activate the window if (!pNewWindow->IsDialogRunning()) { CSingleExit exitit(g_graphicsContext); - ((CGUIDialog *)pNewWindow)->Open(params.size() > 0 ? params[0] : ""); + ((CGUIDialog *)pNewWindow)->DoModal(iWindowID, params.size() ? params[0] : ""); } return; } @@ -782,6 +793,9 @@ g_infoManager.SetNextWindow(iWindowID); + // set our overlay state + HideOverlay(pNewWindow->GetOverlayState()); + // deactivate any window int currentWindow = GetActiveWindow(); CGUIWindow *pWindow = GetWindow(currentWindow); @@ -824,113 +838,6 @@ } } -void CGUIWindowManager::OnApplicationMessage(ThreadMessage* pMsg) -{ - switch (pMsg->dwMessage) - { - case TMSG_GUI_DIALOG_OPEN: - { - if (pMsg->lpVoid) - static_cast(pMsg->lpVoid)->Open(pMsg->strParam); - else - { - CGUIDialog* pDialog = static_cast(GetWindow(pMsg->param1)); - if (pDialog) - pDialog->Open(pMsg->strParam); - } - } - break; - - case TMSG_GUI_WINDOW_CLOSE: - { - CGUIWindow *window = static_cast(pMsg->lpVoid); - if (window) - window->Close((pMsg->param1 & 0x1) ? true : false, pMsg->param1, (pMsg->param1 & 0x2) ? true : false); - } - break; - - case TMSG_GUI_ACTIVATE_WINDOW: - { - ActivateWindow(pMsg->param1, pMsg->params, pMsg->param2 > 0); - } - break; - - case TMSG_GUI_ADDON_DIALOG: - { - if (pMsg->lpVoid) - { // TODO: This is ugly - really these python dialogs should just be normal XBMC dialogs - static_cast(pMsg->lpVoid)->Show_Internal(pMsg->param2 > 0); - } - } - break; - -#ifdef HAS_PYTHON - case TMSG_GUI_PYTHON_DIALOG: - { - // This hack is not much better but at least I don't need to make ApplicationMessenger - // know about Addon (Python) specific classes. - CAction caction(pMsg->param1); - static_cast(pMsg->lpVoid)->OnAction(caction); - } - break; -#endif - - case TMSG_GUI_ACTION: - { - if (pMsg->lpVoid) - { - CAction *action = static_cast(pMsg->lpVoid); - if (pMsg->param1 == WINDOW_INVALID) - g_application.OnAction(*action); - else - { - CGUIWindow *pWindow = GetWindow(pMsg->param1); - if (pWindow) - pWindow->OnAction(*action); - else - CLog::Log(LOGWARNING, "Failed to get window with ID %i to send an action to", pMsg->param1); - } - delete action; - } - } - break; - - case TMSG_GUI_MESSAGE: - if (pMsg->lpVoid) - { - CGUIMessage *message = static_cast(pMsg->lpVoid); - SendMessage(*message, pMsg->param1); - delete message; - } - break; - - case TMSG_GUI_DIALOG_YESNO: - if (!pMsg->lpVoid && pMsg->param1 < 0 && pMsg->param2 < 0) - return; - - auto dialog = static_cast(GetWindow(WINDOW_DIALOG_YES_NO)); - if (!dialog) - return; - - if (pMsg->lpVoid) - pMsg->SetResult(dialog->ShowAndGetInput(*static_cast(pMsg->lpVoid))); - else - { - HELPERS::DialogYesNoMessage options; - options.heading = pMsg->param1; - options.text = pMsg->param2; - pMsg->SetResult(dialog->ShowAndGetInput(options)); - } - - break; - } -} - -int CGUIWindowManager::GetMessageMask() -{ - return TMSG_MASK_WINDOWMANAGER; -} - bool CGUIWindowManager::OnAction(const CAction &action) const { CSingleLock lock(g_graphicsContext); @@ -954,6 +861,14 @@ } return true; // do nothing with the action until the anim is finished } + // music or video overlay are handled as a special case, as they're modeless, but we allow + // clicking on them with the mouse. + if (action.IsMouse() && (dialog->GetID() == WINDOW_DIALOG_VIDEO_OVERLAY || + dialog->GetID() == WINDOW_DIALOG_MUSIC_OVERLAY)) + { + if (dialog->OnAction(action)) + return true; + } lock.Enter(); if (topMost > m_activeDialogs.size()) topMost = m_activeDialogs.size(); @@ -1013,7 +928,7 @@ } // we render the dialogs based on their render order. - std::vector renderList = m_activeDialogs; + vector renderList = m_activeDialogs; stable_sort(renderList.begin(), renderList.end(), RenderOrderSortFunction); for (iDialog it = renderList.begin(); it != renderList.end(); ++it) @@ -1099,7 +1014,7 @@ pWindow->AfterRender(); // make copy of vector as we may remove items from it as we go - std::vector activeDialogs = m_activeDialogs; + vector activeDialogs = m_activeDialogs; for (iDialog it = activeDialogs.begin(); it != activeDialogs.end(); ++it) { if ((*it)->IsDialogRunning()) @@ -1129,7 +1044,7 @@ pWindow->FrameMove(); // update any dialogs - we take a copy of the vector as some dialogs may close themselves // during this call - std::vector dialogs = m_activeDialogs; + vector dialogs = m_activeDialogs; for (iDialog it = dialogs.begin(); it != dialogs.end(); ++it) (*it)->FrameMove(); @@ -1141,13 +1056,11 @@ CGUIWindow *window; if (id == 0 || id == WINDOW_INVALID) return NULL; - - CSingleLock lock(g_graphicsContext); - window = m_idCache.Get(id); if (window) return window; + CSingleLock lock(g_graphicsContext); WindowMap::const_iterator it = m_mapWindows.find(id); if (it != m_mapWindows.end()) window = (*it).second; @@ -1274,7 +1187,7 @@ CSingleLock lock(m_critSection); CGUIMessage* msg = new CGUIMessage(message); - m_vecThreadMessages.push_back( std::pair(msg,window) ); + m_vecThreadMessages.push_back( pair(msg,window) ); } void CGUIWindowManager::DispatchThreadMessages() @@ -1467,12 +1380,32 @@ } } +bool CGUIWindowManager::IsOverlayAllowed() const +{ + if (GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO || + GetActiveWindow() == WINDOW_SCREENSAVER) + return false; + return m_bShowOverlay; +} + +void CGUIWindowManager::ShowOverlay(CGUIWindow::OVERLAY_STATE state) +{ + if (state != CGUIWindow::OVERLAY_STATE_PARENT_WINDOW) + m_bShowOverlay = state == CGUIWindow::OVERLAY_STATE_SHOWN; +} + +void CGUIWindowManager::HideOverlay(CGUIWindow::OVERLAY_STATE state) +{ + if (state == CGUIWindow::OVERLAY_STATE_HIDDEN) + m_bShowOverlay = false; +} + void CGUIWindowManager::AddToWindowHistory(int newWindowID) { // Check the window stack to see if this window is in our history, // and if so, pop all the other windows off the stack so that we // always have a predictable "Back" behaviour for each window - std::stack historySave = m_windowHistory; + stack historySave = m_windowHistory; while (!historySave.empty()) { if (historySave.top() == newWindowID) @@ -1489,7 +1422,7 @@ } } -void CGUIWindowManager::GetActiveModelessWindows(std::vector &ids) +void CGUIWindowManager::GetActiveModelessWindows(vector &ids) { // run through our modeless windows, and construct a vector of them // useful for saving and restoring the modeless windows on skin change etc. @@ -1505,7 +1438,7 @@ { CSingleLock lock(g_graphicsContext); // find the window with the lowest render order - std::vector renderList = m_activeDialogs; + vector renderList = m_activeDialogs; stable_sort(renderList.begin(), renderList.end(), RenderOrderSortFunction); if (!renderList.size()) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIWindowManager.h kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIWindowManager.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/GUIWindowManager.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/GUIWindowManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -28,35 +28,24 @@ * */ -#include -#include - -#include "DirtyRegionTracker.h" -#include "guilib/WindowIDs.h" #include "GUIWindow.h" -#include "IMsgTargetCallback.h" #include "IWindowManagerCallback.h" -#include "messaging/IMessageTarget.h" +#include "IMsgTargetCallback.h" +#include "DirtyRegionTracker.h" #include "utils/GlobalsHandling.h" +#include "guilib/WindowIDs.h" +#include class CGUIDialog; enum class DialogModalityType; -namespace KODI -{ - namespace MESSAGING - { - class CApplicationMessenger; - } -} - #define WINDOW_ID_MASK 0xffff /*! \ingroup winman \brief */ -class CGUIWindowManager : public KODI::MESSAGING::IMessageTarget +class CGUIWindowManager { public: CGUIWindowManager(void); @@ -79,9 +68,6 @@ void CloseDialogs(bool forceClose = false) const; void CloseInternalModalDialogs(bool forceClose = false) const; - virtual void OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg) override; - virtual int GetMessageMask() override; - // OnAction() runs through our active dialogs and windows and sends the message // off to the callbacks (application, python, playlist player) and to the // currently focused window(s). Returns true only if the message is handled. @@ -169,6 +155,7 @@ bool IsWindowActive(const std::string &xmlFile, bool ignoreClosing = true) const; bool IsWindowVisible(const std::string &xmlFile) const; bool IsWindowTopMost(const std::string &xmlFile) const; + bool IsOverlayAllowed() const; /*! \brief Checks if the given window is an addon window. * * \return true if the given window is an addon window, otherwise false. @@ -179,6 +166,7 @@ * \return true if the given window is a python window, otherwise false. */ bool IsPythonWindow(int id) const { return (id >= WINDOW_PYTHON_START && id <= WINDOW_PYTHON_END); }; + void ShowOverlay(CGUIWindow::OVERLAY_STATE state); void GetActiveModelessWindows(std::vector &ids); #ifdef _DEBUG void DumpTextureUse(); @@ -188,13 +176,14 @@ void LoadNotOnDemandWindows(); void UnloadNotOnDemandWindows(); + void HideOverlay(CGUIWindow::OVERLAY_STATE state); void AddToWindowHistory(int newWindowID); void ClearWindowHistory(); void CloseWindowSync(CGUIWindow *window, int nextWindowID = 0); CGUIWindow *GetTopMostDialog() const; - friend class KODI::MESSAGING::CApplicationMessenger; - + friend class CApplicationMessenger; + /*! \brief Activate the given window. * * \param windowID The window ID to activate. @@ -221,6 +210,7 @@ CCriticalSection m_critSection; std::vector m_vecMsgTargets; + bool m_bShowOverlay; int m_iNested; bool m_initialized; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/iimage.h kodi-15.2~git20151019.1039-final/xbmc/guilib/iimage.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/iimage.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/iimage.h 2015-10-19 08:39:16.000000000 +0000 @@ -43,7 +43,7 @@ \param format The format of the output buffer (JpegIO only) \return true if the image data could be decoded to the output buffer */ - virtual bool Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format)=0; + virtual bool Decode(const unsigned char *pixels, unsigned int pitch, unsigned int format)=0; /*! \brief Encodes an thumbnail from raw bits of given memory location \remarks Caller need to call ReleaseThumbnailBuffer() afterwards to free the output buffer diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/imagefactory.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/imagefactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/imagefactory.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/imagefactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,9 +22,6 @@ #include "guilib/JpegIO.h" #include "guilib/cximage.h" #include "utils/Mime.h" -#if defined(HAS_GIFLIB) -#include "guilib/Gif.h" -#endif//HAS_GIFLIB IImage* ImageFactory::CreateLoader(const std::string& strFileName) { @@ -44,11 +41,6 @@ { if(strMimeType == "image/jpeg" || strMimeType == "image/tbn" || strMimeType == "image/jpg") return new CJpegIO(); -#if defined(HAS_GIFLIB) - else if (strMimeType == "image/gif") - return new Gif(); -#endif//HAS_GIFLIB - return new CXImage(strMimeType); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/JpegIO.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/JpegIO.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/JpegIO.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/JpegIO.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -340,11 +340,9 @@ } } -bool CJpegIO::Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format) +bool CJpegIO::Decode(const unsigned char *pixels, unsigned int pitch, unsigned int format) { unsigned char *dst = (unsigned char*)pixels; - unsigned int copyWidth = std::min(m_width, width); - unsigned int copyHeight = std::min(m_height, height); struct my_error_mgr jerr; m_cinfo.err = jpeg_std_error(&jerr.pub); @@ -361,7 +359,7 @@ if (format == XB_FMT_RGB8) { - while (m_cinfo.output_scanline < copyHeight) + while (m_cinfo.output_scanline < m_height) { jpeg_read_scanlines(&m_cinfo, &dst, 1); dst += pitch; @@ -370,12 +368,12 @@ else if (format == XB_FMT_A8R8G8B8) { unsigned char* row = new unsigned char[m_width * 3]; - while (m_cinfo.output_scanline < copyHeight) + while (m_cinfo.output_scanline < m_height) { jpeg_read_scanlines(&m_cinfo, &row, 1); unsigned char *src2 = row; unsigned char *dst2 = dst; - for (unsigned int x = 0; x < copyWidth; x++, src2 += 3) + for (unsigned int x = 0; x < m_width; x++, src2 += 3) { *dst2++ = src2[2]; *dst2++ = src2[1]; @@ -418,7 +416,7 @@ pitch = Width() * 3; sourceBuf = new unsigned char [Height() * pitch]; - if (!Decode(sourceBuf, Width(), Height(),pitch,XB_FMT_RGB8)) + if (!Decode(sourceBuf,pitch,XB_FMT_RGB8)) { delete [] sourceBuf; return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/JpegIO.h kodi-15.2~git20151019.1039-final/xbmc/guilib/JpegIO.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/JpegIO.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/JpegIO.h 2015-10-19 08:39:16.000000000 +0000 @@ -42,7 +42,7 @@ static bool CreateThumbnailFromSurface(unsigned char* buffer, unsigned int width, unsigned int height, unsigned int format, unsigned int pitch, const std::string& destFile); void Close(); // methods for the imagefactory - virtual bool Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format); + virtual bool Decode(const unsigned char *pixels, unsigned int pitch, unsigned int format); virtual bool LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height); virtual bool CreateThumbnailFromSurface(unsigned char* bufferin, unsigned int width, unsigned int height, unsigned int format, unsigned int pitch, const std::string& destFile, unsigned char* &bufferout, unsigned int &bufferoutSize); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/guilib/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/guilib/Makefile.in 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/Makefile.in 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ -SRCS = DDSImage.cpp +SRCS = AnimatedGif.cpp +SRCS += DDSImage.cpp SRCS += DirectXGraphics.cpp SRCS += DirtyRegionSolvers.cpp SRCS += DirtyRegionTracker.cpp @@ -77,10 +78,6 @@ SRCS += XBTF.cpp SRCS += XBTFReader.cpp -ifeq (@USE_LIBGIF@,1) -SRCS += Gif.cpp -endif - ifeq (@USE_OPENGL@,1) SRCS += TextureGL.cpp SRCS += GUIFontTTFGL.cpp diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/Shader.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/Shader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/Shader.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/Shader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -35,11 +35,12 @@ using namespace Shaders; using namespace XFILE; +using namespace std; ////////////////////////////////////////////////////////////////////// // CShader ////////////////////////////////////////////////////////////////////// -bool CShader::LoadSource(const std::string& filename, const std::string& prefix) +bool CShader::LoadSource(const string& filename, const string& prefix) { if(filename.empty()) return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/Shader.h kodi-15.2~git20151019.1039-final/xbmc/guilib/Shader.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/Shader.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/Shader.h 2015-10-19 08:39:16.000000000 +0000 @@ -31,6 +31,8 @@ namespace Shaders { + using namespace std; + ////////////////////////////////////////////////////////////////////// // CShader - base class ////////////////////////////////////////////////////////////////////// @@ -42,14 +44,14 @@ virtual bool Compile() = 0; virtual void Free() = 0; virtual GLuint Handle() = 0; - virtual void SetSource(const std::string& src) { m_source = src; } - virtual bool LoadSource(const std::string& filename, const std::string& prefix = ""); + virtual void SetSource(const string& src) { m_source = src; } + virtual bool LoadSource(const string& filename, const string& prefix = ""); bool OK() const { return m_compiled; } protected: - std::string m_source; - std::string m_lastLog; - std::vector m_attr; + string m_source; + string m_lastLog; + vector m_attr; bool m_compiled; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/StereoscopicsManager.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/StereoscopicsManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/StereoscopicsManager.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/StereoscopicsManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,7 @@ #include "StereoscopicsManager.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogSelect.h" #include "GUIInfoManager.h" @@ -42,11 +42,8 @@ #include "utils/log.h" #include "utils/RegExp.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "windowing/WindowingFactory.h" -#include "guiinfo/GUIInfoLabels.h" -using namespace KODI::MESSAGING; struct StereoModeMap { @@ -61,8 +58,8 @@ { "right_left", RENDER_STEREO_MODE_SPLIT_VERTICAL }, { "top_bottom", RENDER_STEREO_MODE_SPLIT_HORIZONTAL }, { "bottom_top", RENDER_STEREO_MODE_SPLIT_HORIZONTAL }, - { "checkerboard_rl", RENDER_STEREO_MODE_CHECKERBOARD }, - { "checkerboard_lr", RENDER_STEREO_MODE_CHECKERBOARD }, + { "checkerboard_rl", RENDER_STEREO_MODE_OFF }, // unsupported + { "checkerboard_lr", RENDER_STEREO_MODE_OFF }, // unsupported { "row_interleaved_rl", RENDER_STEREO_MODE_INTERLACED }, { "row_interleaved_lr", RENDER_STEREO_MODE_INTERLACED }, { "col_interleaved_rl", RENDER_STEREO_MODE_OFF }, // unsupported @@ -86,7 +83,6 @@ { "tab", RENDER_STEREO_MODE_SPLIT_HORIZONTAL }, // alias { "row_interleaved", RENDER_STEREO_MODE_INTERLACED }, { "interlaced", RENDER_STEREO_MODE_INTERLACED }, // alias - { "checkerboard", RENDER_STEREO_MODE_CHECKERBOARD }, { "anaglyph_cyan_red", RENDER_STEREO_MODE_ANAGLYPH_RED_CYAN }, { "anaglyph_green_magenta", RENDER_STEREO_MODE_ANAGLYPH_GREEN_MAGENTA }, { "anaglyph_yellow_blue", RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE }, @@ -106,7 +102,7 @@ { } -CStereoscopicsManager& CStereoscopicsManager::GetInstance() +CStereoscopicsManager& CStereoscopicsManager::Get(void) { static CStereoscopicsManager sStereoscopicsManager; return sStereoscopicsManager; @@ -120,7 +116,7 @@ RENDER_STEREO_MODE CStereoscopicsManager::GetStereoMode(void) { - return (RENDER_STEREO_MODE) CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOSCREEN_STEREOSCOPICMODE); + return (RENDER_STEREO_MODE) CSettings::Get().GetInt("videoscreen.stereoscopicmode"); } void CStereoscopicsManager::SetStereoModeByUser(const RENDER_STEREO_MODE &mode) @@ -151,7 +147,7 @@ { if (!g_Windowing.SupportsStereo(applyMode)) return; - CSettings::GetInstance().SetInt(CSettings::SETTING_VIDEOSCREEN_STEREOSCOPICMODE, applyMode); + CSettings::Get().SetInt("videoscreen.stereoscopicmode", applyMode); } } @@ -215,9 +211,9 @@ CGUIDialogSelect* pDlgSelect = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDlgSelect->Reset(); if (heading.empty()) - pDlgSelect->SetHeading(CVariant{g_localizeStrings.Get(36528)}); + pDlgSelect->SetHeading(g_localizeStrings.Get(36528).c_str()); else - pDlgSelect->SetHeading(CVariant{heading}); + pDlgSelect->SetHeading(heading.c_str()); // prepare selectable stereo modes std::vector selectableModes; @@ -240,7 +236,7 @@ } } - pDlgSelect->Open(); + pDlgSelect->DoModal(); int iItem = pDlgSelect->GetSelectedLabel(); if (iItem > -1 && pDlgSelect->IsConfirmed()) @@ -280,9 +276,6 @@ case RENDER_STEREO_MODE_INTERLACED: msgId = 36507; break; - case RENDER_STEREO_MODE_CHECKERBOARD: - msgId = 36511; - break; case RENDER_STEREO_MODE_HARDWAREBASED: msgId = 36508; break; @@ -298,7 +291,7 @@ RENDER_STEREO_MODE CStereoscopicsManager::GetPreferredPlaybackMode(void) { - return (RENDER_STEREO_MODE) CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOSCREEN_PREFEREDSTEREOSCOPICMODE); + return (RENDER_STEREO_MODE) CSettings::Get().GetInt("videoscreen.preferedstereoscopicmode"); } int CStereoscopicsManager::ConvertVideoToGuiStereoMode(const std::string &mode) @@ -388,7 +381,7 @@ const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_VIDEOSCREEN_STEREOSCOPICMODE) + if (settingId == "videoscreen.stereoscopicmode") { RENDER_STEREO_MODE mode = GetStereoMode(); CLog::Log(LOGDEBUG, "StereoscopicsManager: stereo mode setting changed to %s", ConvertGuiStereoModeToString(mode)); @@ -506,7 +499,7 @@ void CStereoscopicsManager::OnPlaybackStarted(void) { - STEREOSCOPIC_PLAYBACK_MODE playbackMode = (STEREOSCOPIC_PLAYBACK_MODE) CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_STEREOSCOPICPLAYBACKMODE); + STEREOSCOPIC_PLAYBACK_MODE playbackMode = (STEREOSCOPIC_PLAYBACK_MODE) CSettings::Get().GetInt("videoplayer.stereoscopicplaybackmode"); RENDER_STEREO_MODE mode = GetStereoMode(); // early return if playback mode should be ignored and we're in no stereoscopic mode right now @@ -517,7 +510,7 @@ { // exit stereo mode if started item is not stereoscopic // and if user prefers to stop 3D playback when movie is finished - if (mode != RENDER_STEREO_MODE_OFF && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_QUITSTEREOMODEONSTOP)) + if (mode != RENDER_STEREO_MODE_OFF && CSettings::Get().GetBool("videoplayer.quitstereomodeonstop")) SetStereoMode(RENDER_STEREO_MODE_OFF); return; } @@ -538,7 +531,7 @@ // users selecting this option usually have to manually switch their TV into 3D mode // and would be annoyed by having to switch TV modes when next movies comes up // @todo probably add a new setting for just this behavior - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_QUITSTEREOMODEONSTOP) == false) + if (CSettings::Get().GetBool("videoplayer.quitstereomodeonstop") == false) return; // only change to new stereo mode if not yet in preferred stereo mode @@ -550,11 +543,11 @@ { case STEREOSCOPIC_PLAYBACK_MODE_ASK: // Ask { - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE); + CApplicationMessenger::Get().MediaPause(); CGUIDialogSelect* pDlgSelect = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDlgSelect->Reset(); - pDlgSelect->SetHeading(CVariant{g_localizeStrings.Get(36527)}); + pDlgSelect->SetHeading(g_localizeStrings.Get(36527).c_str()); int idx_playing = -1; @@ -574,7 +567,7 @@ int idx_select = pDlgSelect->Add( g_localizeStrings.Get(36531) ); // other / select - pDlgSelect->Open(); + pDlgSelect->DoModal(); if(pDlgSelect->IsConfirmed()) { @@ -587,7 +580,7 @@ SetStereoModeByUser( mode ); } - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_UNPAUSE); + CApplicationMessenger::Get().MediaUnPause(); } break; case STEREOSCOPIC_PLAYBACK_MODE_PREFERRED: // Stereoscopic @@ -604,7 +597,7 @@ void CStereoscopicsManager::OnPlaybackStopped(void) { RENDER_STEREO_MODE mode = GetStereoMode(); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_QUITSTEREOMODEONSTOP) && mode != RENDER_STEREO_MODE_OFF) + if (CSettings::Get().GetBool("videoplayer.quitstereomodeonstop") && mode != RENDER_STEREO_MODE_OFF) SetStereoMode(RENDER_STEREO_MODE_OFF); // reset user modes on playback end to start over new on next playback and not end up in a probably unwanted mode if (m_stereoModeSetByUser != RENDER_STEREO_MODE_OFF) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/StereoscopicsManager.h kodi-15.2~git20151019.1039-final/xbmc/guilib/StereoscopicsManager.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/StereoscopicsManager.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/StereoscopicsManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -51,7 +51,7 @@ /*! * @return static instance of CStereoscopicsManager */ - static CStereoscopicsManager& GetInstance(); + static CStereoscopicsManager& Get(void); void Initialize(void); RENDER_STEREO_MODE GetStereoMode(void); @@ -79,8 +79,8 @@ */ CAction ConvertActionCommandToAction(const std::string &command, const std::string ¶meter); std::string NormalizeStereoMode(const std::string &mode); - virtual void OnSettingChanged(const CSetting *setting) override; - virtual bool OnMessage(CGUIMessage &message) override; + virtual void OnSettingChanged(const CSetting *setting); + virtual bool OnMessage(CGUIMessage &message); /*! * @brief Handle 3D specific cActions * @param action The action to process diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureBundleXBT.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureBundleXBT.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureBundleXBT.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureBundleXBT.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,6 @@ #include "addons/Skin.h" #include "settings/Settings.h" #include "filesystem/SpecialProtocol.h" -#include "filesystem/XbtManager.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" #include "XBTF.h" @@ -53,16 +52,18 @@ Cleanup(); // Find the correct texture file (skin or theme) + std::string strPath; + if (m_themeBundle) { // if we are the theme bundle, we only load if the user has chosen // a valid theme (or the skin has a default one) - std::string theme = CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME); + std::string theme = CSettings::Get().GetString("lookandfeel.skintheme"); if (!theme.empty() && !StringUtils::EqualsNoCase(theme, "SKINDEFAULT")) { std::string themeXBT(URIUtils::ReplaceExtension(theme, ".xbt")); - m_path = URIUtils::AddFileToFolder(g_graphicsContext.GetMediaDir(), "media"); - m_path = URIUtils::AddFileToFolder(m_path, themeXBT); + strPath = URIUtils::AddFileToFolder(g_graphicsContext.GetMediaDir(), "media"); + strPath = URIUtils::AddFileToFolder(strPath, themeXBT); } else { @@ -71,20 +72,20 @@ } else { - m_path = URIUtils::AddFileToFolder(g_graphicsContext.GetMediaDir(), "media/Textures.xbt"); + strPath = URIUtils::AddFileToFolder(g_graphicsContext.GetMediaDir(), "media/Textures.xbt"); } - m_path = CSpecialProtocol::TranslatePathConvertCase(m_path); + strPath = CSpecialProtocol::TranslatePathConvertCase(strPath); // Load the texture file - if (!XFILE::CXbtManager::GetInstance().GetReader(CURL(m_path), m_XBTFReader)) + if (!m_XBTFReader.Open(strPath)) { return false; } - CLog::Log(LOGDEBUG, "%s - Opened bundle %s", __FUNCTION__, m_path.c_str()); + CLog::Log(LOGDEBUG, "%s - Opened bundle %s", __FUNCTION__, strPath.c_str()); - m_TimeStamp = m_XBTFReader->GetLastModificationTimestamp(); + m_TimeStamp = m_XBTFReader.GetLastModificationTimestamp(); if (lzo_init() != LZO_E_OK) { @@ -96,10 +97,10 @@ bool CTextureBundleXBT::HasFile(const std::string& Filename) { - if ((m_XBTFReader == nullptr || !m_XBTFReader->IsOpen()) && !OpenBundle()) + if (!m_XBTFReader.IsOpen() && !OpenBundle()) return false; - if (m_XBTFReader->GetLastModificationTimestamp() > m_TimeStamp) + if (m_XBTFReader.GetLastModificationTimestamp() > m_TimeStamp) { CLog::Log(LOGINFO, "Texture bundle has changed, reloading"); if (!OpenBundle()) @@ -107,7 +108,7 @@ } std::string name = Normalize(Filename); - return m_XBTFReader->Exists(name); + return m_XBTFReader.Exists(name); } void CTextureBundleXBT::GetTexturesFromPath(const std::string &path, std::vector &textures) @@ -115,13 +116,13 @@ if (path.size() > 1 && path[1] == ':') return; - if ((m_XBTFReader == nullptr || !m_XBTFReader->IsOpen()) && !OpenBundle()) + if (!m_XBTFReader.IsOpen() && !OpenBundle()) return; std::string testPath = Normalize(path); URIUtils::AddSlashAtEnd(testPath); - std::vector files = m_XBTFReader->GetFiles(); + std::vector& files = m_XBTFReader.GetFiles(); for (size_t i = 0; i < files.size(); i++) { std::string path = files[i].GetPath(); @@ -135,14 +136,14 @@ { std::string name = Normalize(Filename); - CXBTFFile file; - if (!m_XBTFReader->Get(name, file)) + CXBTFFile* file = m_XBTFReader.Find(name); + if (!file) return false; - if (file.GetFrames().size() == 0) + if (file->GetFrames().size() == 0) return false; - CXBTFFrame& frame = file.GetFrames().at(0); + CXBTFFrame& frame = file->GetFrames().at(0); if (!ConvertFrameToTexture(Filename, frame, ppTexture)) { return false; @@ -159,20 +160,20 @@ { std::string name = Normalize(Filename); - CXBTFFile file; - if (!m_XBTFReader->Get(name, file)) + CXBTFFile* file = m_XBTFReader.Find(name); + if (!file) return false; - if (file.GetFrames().size() == 0) + if (file->GetFrames().size() == 0) return false; - size_t nTextures = file.GetFrames().size(); + size_t nTextures = file->GetFrames().size(); *ppTextures = new CBaseTexture*[nTextures]; *ppDelays = new int[nTextures]; for (size_t i = 0; i < nTextures; i++) { - CXBTFFrame& frame = file.GetFrames().at(i); + CXBTFFrame& frame = file->GetFrames().at(i); if (!ConvertFrameToTexture(Filename, frame, &((*ppTextures)[i]))) { @@ -182,9 +183,9 @@ (*ppDelays)[i] = frame.GetDuration(); } - width = file.GetFrames().at(0).GetWidth(); - height = file.GetFrames().at(0).GetHeight(); - nLoops = file.GetLoop(); + width = file->GetFrames().at(0).GetWidth(); + height = file->GetFrames().at(0).GetHeight(); + nLoops = file->GetLoop(); return nTextures; } @@ -200,7 +201,7 @@ } // load the compressed texture - if (!m_XBTFReader->Load(frame, buffer)) + if (!m_XBTFReader.Load(frame, buffer)) { CLog::Log(LOGERROR, "Error loading texture: %s", name.c_str()); delete[] buffer; @@ -241,9 +242,9 @@ void CTextureBundleXBT::Cleanup() { - if (m_XBTFReader != nullptr && m_XBTFReader->IsOpen()) + if (m_XBTFReader.IsOpen()) { - XFILE::CXbtManager::GetInstance().Release(CURL(m_path)); + m_XBTFReader.Close(); CLog::Log(LOGDEBUG, "%s - Closed %sbundle", __FUNCTION__, m_themeBundle ? "theme " : ""); } } @@ -265,55 +266,3 @@ return newName; } - -uint8_t* CTextureBundleXBT::UnpackFrame(const CXBTFReader& reader, const CXBTFFrame& frame) -{ - uint8_t* packedBuffer = new uint8_t[static_cast(frame.GetPackedSize())]; - if (packedBuffer == nullptr) - { - CLog::Log(LOGERROR, "CTextureBundleXBT: out of memory loading frame with %" PRIu64" packed bytes", frame.GetPackedSize()); - return nullptr; - } - - // load the compressed texture - if (!reader.Load(frame, packedBuffer)) - { - CLog::Log(LOGERROR, "CTextureBundleXBT: error loading frame"); - delete[] packedBuffer; - return nullptr; - } - - // if the frame isn't packed there's nothing else to be done - if (!frame.IsPacked()) - return packedBuffer; - - uint8_t* unpackedBuffer = new uint8_t[static_cast(frame.GetUnpackedSize())]; - if (unpackedBuffer == nullptr) - { - CLog::Log(LOGERROR, "CTextureBundleXBT: out of memory loading frame with %" PRIu64" unpacked bytes", frame.GetPackedSize()); - delete[] packedBuffer; - return nullptr; - } - - // make sure lzo is initialized - if (lzo_init() != LZO_E_OK) - { - CLog::Log(LOGERROR, "CTextureBundleXBT: failed to initialize lzo"); - delete[] packedBuffer; - delete[] unpackedBuffer; - return nullptr; - } - - lzo_uint size = static_cast(frame.GetUnpackedSize()); - if (lzo1x_decompress_safe(packedBuffer, static_cast(frame.GetPackedSize()), unpackedBuffer, &size, nullptr) != LZO_E_OK || size != frame.GetUnpackedSize()) - { - CLog::Log(LOGERROR, "CTextureBundleXBT: failed to decompress frame with %" PRIu64" unpacked bytes to %" PRIu64" bytes", frame.GetPackedSize(), frame.GetUnpackedSize()); - delete[] packedBuffer; - delete[] unpackedBuffer; - return nullptr; - } - - delete[] packedBuffer; - - return unpackedBuffer; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureBundleXBT.h kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureBundleXBT.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureBundleXBT.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureBundleXBT.h 2015-10-19 08:39:16.000000000 +0000 @@ -44,8 +44,6 @@ int LoadAnim(const std::string& Filename, CBaseTexture*** ppTextures, int &width, int &height, int& nLoops, int** ppDelays); - static uint8_t* UnpackFrame(const CXBTFReader& reader, const CXBTFFrame& frame); - private: bool OpenBundle(); bool ConvertFrameToTexture(const std::string& name, CXBTFFrame& frame, CBaseTexture** ppTexture); @@ -53,8 +51,7 @@ time_t m_TimeStamp; bool m_themeBundle; - std::string m_path; - CXBTFReaderPtr m_XBTFReader; + CXBTFReader m_XBTFReader; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureBundleXPR.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureBundleXPR.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureBundleXPR.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureBundleXPR.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -130,7 +130,7 @@ { // if we are the theme bundle, we only load if the user has chosen // a valid theme (or the skin has a default one) - std::string theme = CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME); + std::string theme = CSettings::Get().GetString("lookandfeel.skintheme"); if (!theme.empty() && !StringUtils::EqualsNoCase(theme, "SKINDEFAULT")) { std::string themeXPR(URIUtils::ReplaceExtension(theme, ".xpr")); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/Texture.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/Texture.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/Texture.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/Texture.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,8 +24,6 @@ #include "utils/URIUtils.h" #include "DDSImage.h" #include "filesystem/File.h" -#include "filesystem/ResourceFile.h" -#include "filesystem/XbtFile.h" #if defined(TARGET_DARWIN_IOS) #include #include "filesystem/File.h" @@ -175,7 +173,7 @@ } } -CBaseTexture *CBaseTexture::LoadFromFile(const std::string& texturePath, unsigned int idealWidth, unsigned int idealHeight, bool requirePixels, const std::string& strMimeType) +CBaseTexture *CBaseTexture::LoadFromFile(const std::string& texturePath, unsigned int idealWidth, unsigned int idealHeight, bool autoRotate, bool requirePixels, const std::string& strMimeType) { #if defined(TARGET_ANDROID) CURL url(texturePath); @@ -184,15 +182,18 @@ XFILE::CFileAndroidApp file; if (file.Open(url)) { - unsigned char* inputBuff; - unsigned int width; - unsigned int height; - unsigned int inputBuffSize = file.ReadIcon(&inputBuff, &width, &height); + unsigned int imgsize = (unsigned int)file.GetLength(); + unsigned char* inputBuff = new unsigned char[imgsize]; + unsigned int inputBuffSize = file.Read(inputBuff, imgsize); file.Close(); - if (!inputBuffSize) + if (inputBuffSize != imgsize) + { + delete [] inputBuff; return NULL; - + } CTexture *texture = new CTexture(); + unsigned int width = file.GetIconWidth(); + unsigned int height = file.GetIconHeight(); texture->LoadFromMemory(width, height, width*4, XB_FMT_RGBA8, true, inputBuff); delete [] inputBuff; return texture; @@ -200,7 +201,7 @@ } #endif CTexture *texture = new CTexture(); - if (texture->LoadFromFileInternal(texturePath, idealWidth, idealHeight, requirePixels, strMimeType)) + if (texture->LoadFromFileInternal(texturePath, idealWidth, idealHeight, autoRotate, requirePixels, strMimeType)) return texture; delete texture; return NULL; @@ -215,7 +216,7 @@ return NULL; } -bool CBaseTexture::LoadFromFileInternal(const std::string& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool requirePixels, const std::string& strMimeType) +bool CBaseTexture::LoadFromFileInternal(const std::string& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool autoRotate, bool requirePixels, const std::string& strMimeType) { if (URIUtils::HasExtension(texturePath, ".dds")) { // special case for DDS images @@ -238,26 +239,6 @@ if (file.LoadFile(texturePath, buf) <= 0) return false; - CURL url(texturePath); - // make sure resource:// paths are properly resolved - if (url.IsProtocol("resource")) - { - std::string translatedPath; - if (XFILE::CResourceFile::TranslatePath(url, translatedPath)) - url.Parse(translatedPath); - } - - // handle xbt:// paths differently because it allows loading the texture directly from memory - if (url.IsProtocol("xbt")) - { - XFILE::CXbtFile xbtFile; - if (!xbtFile.Open(url)) - return false; - - return LoadFromMemory(xbtFile.GetImageWidth(), xbtFile.GetImageHeight(), 0, xbtFile.GetImageFormat(), - xbtFile.HasImageAlpha(), reinterpret_cast(buf.get())); - } - IImage* pImage; if(strMimeType.empty()) @@ -265,13 +246,13 @@ else pImage = ImageFactory::CreateLoaderFromMimeType(strMimeType); - if (!LoadIImage(pImage, (unsigned char *)buf.get(), buf.size(), width, height)) + if (!LoadIImage(pImage, (unsigned char *)buf.get(), buf.size(), width, height, autoRotate)) { delete pImage; pImage = ImageFactory::CreateFallbackLoader(texturePath); if (!LoadIImage(pImage, (unsigned char *)buf.get(), buf.size(), width, height)) { - CLog::Log(LOGDEBUG, "%s - Load of %s failed.", __FUNCTION__, CURL::GetRedacted(texturePath).c_str()); + CLog::Log(LOGDEBUG, "%s - Load of %s failed.", __FUNCTION__, texturePath.c_str()); delete pImage; return false; } @@ -304,16 +285,16 @@ return true; } -bool CBaseTexture::LoadIImage(IImage *pImage, unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height) +bool CBaseTexture::LoadIImage(IImage *pImage, unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height, bool autoRotate) { if(pImage != NULL && pImage->LoadImageFromMemory(buffer, bufSize, width, height)) { if (pImage->Width() > 0 && pImage->Height() > 0) { Allocate(pImage->Width(), pImage->Height(), XB_FMT_A8R8G8B8); - if (pImage->Decode(m_pixels, GetTextureWidth(), GetRows(), GetPitch(), XB_FMT_A8R8G8B8)) + if (pImage->Decode(m_pixels, GetPitch(), XB_FMT_A8R8G8B8)) { - if (pImage->Orientation()) + if (autoRotate && pImage->Orientation()) m_orientation = pImage->Orientation() - 1; m_hasAlpha = pImage->hasAlpha(); m_originalWidth = pImage->originalWidth(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureDX.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureDX.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureDX.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureDX.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -39,35 +39,32 @@ void CDXTexture::CreateTextureObject() { - m_texture.Create(m_textureWidth, m_textureHeight, 1, g_Windowing.DefaultD3DUsage(), GetFormat()); -} - -DXGI_FORMAT CDXTexture::GetFormat() -{ - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; // DXGI_FORMAT_UNKNOWN + D3DFORMAT format = D3DFMT_UNKNOWN; switch (m_format) { case XB_FMT_DXT1: - format = DXGI_FORMAT_BC1_UNORM; // D3DFMT_DXT1 -> DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB + format = D3DFMT_DXT1; break; case XB_FMT_DXT3: - format = DXGI_FORMAT_BC2_UNORM; // D3DFMT_DXT3 -> DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB + format = D3DFMT_DXT3; break; case XB_FMT_DXT5: case XB_FMT_DXT5_YCoCg: - format = DXGI_FORMAT_BC3_UNORM; // XB_FMT_DXT5 -> DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB + format = D3DFMT_DXT5; break; case XB_FMT_RGB8: case XB_FMT_A8R8G8B8: - format = DXGI_FORMAT_B8G8R8A8_UNORM; // D3DFMT_A8R8G8B8 -> DXGI_FORMAT_B8G8R8A8_UNORM | DXGI_FORMAT_B8G8R8A8_UNORM_SRGB + format = D3DFMT_A8R8G8B8; break; case XB_FMT_A8: - format = DXGI_FORMAT_R8_UNORM; // XB_FMT_A8 -> DXGI_FORMAT_A8_UNORM + format = D3DFMT_A8; break; + default: + return; } - return format; + m_texture.Create(m_textureWidth, m_textureHeight, 1, g_Windowing.DefaultD3DUsage(), format, g_Windowing.DefaultD3DPool()); } void CDXTexture::DestroyTextureObject() @@ -83,112 +80,77 @@ return; } - bool needUpdate = true; - D3D11_USAGE usage = g_Windowing.DefaultD3DUsage(); - if (m_format == XB_FMT_RGB8 && usage == D3D11_USAGE_DEFAULT) - usage = D3D11_USAGE_DYNAMIC; // fallback to dynamic to allow CPU write to texture - - if (m_texture.Get() == nullptr) + if (m_texture.Get() == NULL) { - // creates texture with initial data - if (m_format != XB_FMT_RGB8) - { - // this is faster way to create texture with initial data instead of create empty and then copy to it - m_texture.Create(m_textureWidth, m_textureHeight, 1, usage, GetFormat(), m_pixels, GetPitch()); - if (m_texture.Get() != nullptr) - needUpdate = false; - } - else - m_texture.Create(m_textureWidth, m_textureHeight, 1, usage, GetFormat()); - - if (m_texture.Get() == nullptr) + CreateTextureObject(); + if (m_texture.Get() == NULL) { - CLog::Log(LOGDEBUG, "CDXTexture::CDXTexture: Error creating new texture for size %d x %d.", m_textureWidth, m_textureHeight); + CLog::Log(LOGDEBUG, "CDXTexture::CDXTexture: Error creating new texture for size %d x %d", m_textureWidth, m_textureHeight); return; } } - else - { - // need to update texture, check usage first - D3D11_TEXTURE2D_DESC texDesc; - m_texture.GetDesc(&texDesc); - usage = texDesc.Usage; - // if usage is not dynamic re-create texture with dynamic usage for future updates - if (usage != D3D11_USAGE_DYNAMIC && usage != D3D11_USAGE_STAGING) - { - m_texture.Release(); - usage = D3D11_USAGE_DYNAMIC; - - m_texture.Create(m_textureWidth, m_textureHeight, 1, usage, GetFormat(), m_pixels, GetPitch()); - if (m_texture.Get() == nullptr) - { - CLog::Log(LOGDEBUG, "CDXTexture::CDXTexture: Error creating new texture for size %d x %d.", m_textureWidth, m_textureHeight); - return; - } - - needUpdate = false; - } - } - - if (needUpdate) + D3DLOCKED_RECT lr; + if (m_texture.LockRect( 0, &lr, NULL, D3DLOCK_DISCARD )) { - D3D11_MAP mapType = (usage == D3D11_USAGE_STAGING) ? D3D11_MAP_WRITE : D3D11_MAP_WRITE_DISCARD; - D3D11_MAPPED_SUBRESOURCE lr; - if (m_texture.LockRect(0, &lr, mapType)) - { - unsigned char *dst = (unsigned char *)lr.pData; - unsigned char *src = m_pixels; - unsigned int dstPitch = lr.RowPitch; - unsigned int srcPitch = GetPitch(); - unsigned int minPitch = std::min(srcPitch, dstPitch); + unsigned char *dst = (unsigned char *)lr.pBits; + unsigned char *src = m_pixels; + unsigned int dstPitch = lr.Pitch; + unsigned int srcPitch = GetPitch(); + unsigned int minPitch = std::min(srcPitch, dstPitch); - unsigned int rows = GetRows(); - if (m_format == XB_FMT_RGB8) - { - for (unsigned int y = 0; y < rows; y++) - { - unsigned char *dst2 = dst; - unsigned char *src2 = src; - for (unsigned int x = 0; x < srcPitch / 3; x++, dst2 += 4, src2 += 3) - { - dst2[0] = src2[2]; - dst2[1] = src2[1]; - dst2[2] = src2[0]; - dst2[3] = 0xff; - } - src += srcPitch; - dst += dstPitch; - } - } - else if (srcPitch == dstPitch) - { - memcpy(dst, src, srcPitch * rows); - } - else + unsigned int rows = GetRows(); + if (m_format == XB_FMT_RGB8) + { + for (unsigned int y = 0; y < rows; y++) { - for (unsigned int y = 0; y < rows; y++) + unsigned char *dst2 = dst; + unsigned char *src2 = src; + for (unsigned int x = 0; x < srcPitch / 3; x++, dst2 += 4, src2 += 3) { - memcpy(dst, src, minPitch); - src += srcPitch; - dst += dstPitch; + dst2[0] = src2[2]; + dst2[1] = src2[1]; + dst2[2] = src2[0]; + dst2[3] = 0xff; } + src += srcPitch; + dst += dstPitch; } } + else if (srcPitch == dstPitch) + { + memcpy(dst, src, srcPitch * rows); + } else { - CLog::Log(LOGERROR, __FUNCTION__" - failed to lock texture."); + for (unsigned int y = 0; y < rows; y++) + { + memcpy(dst, src, minPitch); + src += srcPitch; + dst += dstPitch; + } } - m_texture.UnlockRect(0); } + else + { + CLog::Log(LOGERROR, __FUNCTION__" - failed to lock texture"); + } + m_texture.UnlockRect(0); + delete [] m_pixels; - m_pixels = nullptr; + m_pixels = NULL; m_loadedToGPU = true; } void CDXTexture::BindToUnit(unsigned int unit) { + LPDIRECT3DDEVICE9 p3DDevice = g_Windowing.Get3DDevice(); + p3DDevice->SetTexture( unit, m_texture.Get() ); + p3DDevice->SetSamplerState( unit, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); + p3DDevice->SetSamplerState( unit, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); + p3DDevice->SetSamplerState( unit, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); + p3DDevice->SetSamplerState( unit, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); } #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureDX.h kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureDX.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureDX.h 2015-11-02 01:00:15.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureDX.h 2015-10-19 08:39:16.000000000 +0000 @@ -38,19 +38,12 @@ virtual void LoadToGPU(); void BindToUnit(unsigned int unit); - ID3D11Texture2D* GetTextureObject() + LPDIRECT3DTEXTURE9 GetTextureObject() { return m_texture.Get(); }; - - ID3D11ShaderResourceView* GetShaderResource() - { - return m_texture.GetShaderResource(); - }; - private: CD3DTexture m_texture; - DXGI_FORMAT GetFormat(); }; #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureGL.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureGL.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureGL.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureGL.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,8 @@ #if defined(HAS_GL) || defined(HAS_GLES) +using namespace std; + /************************************************************************/ /* CGLTexture */ /************************************************************************/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/Texture.h kodi-15.2~git20151019.1039-final/xbmc/guilib/Texture.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/Texture.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/Texture.h 2015-10-19 08:39:16.000000000 +0000 @@ -51,11 +51,12 @@ \param texturePath the path of the texture to load. \param idealWidth the ideal width of the texture (defaults to 0, no ideal width). \param idealHeight the ideal height of the texture (defaults to 0, no ideal height). + \param autoRotate whether the textures should be autorotated based on EXIF information (defaults to false). \param strMimeType mimetype of the given texture if available (defaults to empty) \return a CBaseTexture pointer to the created texture - NULL if the texture failed to load. */ static CBaseTexture *LoadFromFile(const std::string& texturePath, unsigned int idealWidth = 0, unsigned int idealHeight = 0, - bool requirePixels = false, const std::string& strMimeType = ""); + bool autoRotate = false, bool requirePixels = false, const std::string& strMimeType = ""); /*! \brief Load a texture from a file in memory Loads a texture from a file in memory, restricting in size if needed based on maxHeight and maxWidth. @@ -109,8 +110,8 @@ protected: bool LoadFromFileInMem(unsigned char* buffer, size_t size, const std::string& mimeType, unsigned int maxWidth, unsigned int maxHeight); - bool LoadFromFileInternal(const std::string& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool requirePixels, const std::string& strMimeType = ""); - bool LoadIImage(IImage* pImage, unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height); + bool LoadFromFileInternal(const std::string& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool autoRotate, bool requirePixels, const std::string& strMimeType = ""); + bool LoadIImage(IImage* pImage, unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height, bool autoRotate=false); // helpers for computation of texture parameters for compressed textures unsigned int GetPitch(unsigned int width) const; unsigned int GetRows(unsigned int height) const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureManager.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureManager.cpp 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,32 +19,30 @@ */ #include "TextureManager.h" - -#include - -#include "addons/Skin.h" -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "GraphicContext.h" -#include "system.h" #include "Texture.h" +#include "AnimatedGif.h" +#include "GraphicContext.h" #include "threads/SingleLock.h" -#include "threads/SystemClock.h" -#include "URL.h" #include "utils/log.h" -#include "utils/StringUtils.h" #include "utils/URIUtils.h" - +#include "utils/StringUtils.h" +#include "addons/Skin.h" #ifdef _DEBUG_TEXTURES #include "utils/TimeUtils.h" #endif -#if defined(HAS_GIFLIB) -#include "guilib/Gif.h" -#endif//HAS_GIFLIB -#if defined(TARGET_DARWIN_IOS) +#include "threads/SystemClock.h" +#include "filesystem/File.h" +#include "filesystem/Directory.h" +#include "URL.h" +#include + +#if defined(TARGET_DARWIN_IOS) && !defined(TARGET_DARWIN_IOS_ATV2) #include "windowing/WindowingFactory.h" // for g_Windowing in CGUITextureManager::FreeUnusedTextures #endif +using namespace std; + + /************************************************************************/ /* */ /************************************************************************/ @@ -94,7 +92,7 @@ return; m_textures.push_back(texture); - m_delays.push_back(delay); + m_delays.push_back(delay ? delay * 2 : 100); m_texWidth = texture->GetTextureWidth(); m_texHeight = texture->GetTextureHeight(); @@ -107,7 +105,7 @@ m_width = width; m_height = height; m_orientation = texture ? texture->GetOrientation() : 0; - Add(texture, 2); + Add(texture, 100); } void CTextureArray::Free() @@ -199,16 +197,6 @@ m_texture.Free(); } -void CTextureMap::SetHeight(int height) -{ - m_texture.m_height = (int) height; -} - -void CTextureMap::SetWidth(int height) -{ - m_texture.m_width = height; -} - bool CTextureMap::IsEmpty() const { return m_texture.m_textures.size() == 0; @@ -337,13 +325,13 @@ if (StringUtils::EndsWithNoCase(strPath, ".gif")) { - CTextureMap* pMap = nullptr; + CTextureMap* pMap; if (bundle >= 0) { - CBaseTexture **pTextures = nullptr; + CBaseTexture **pTextures; int nLoops = 0, width = 0, height = 0; - int* Delay = nullptr; + int* Delay; int nImages = m_TexBundle[bundle].LoadAnim(strTextureName, &pTextures, width, height, nLoops, &Delay); if (!nImages) { @@ -353,60 +341,53 @@ return emptyTexture; } - unsigned int maxWidth = 0; - unsigned int maxHeight = 0; pMap = new CTextureMap(strTextureName, width, height, nLoops); for (int iImage = 0; iImage < nImages; ++iImage) { pMap->Add(pTextures[iImage], Delay[iImage]); - maxWidth = std::max(maxWidth, pTextures[iImage]->GetWidth()); - maxHeight = std::max(maxHeight, pTextures[iImage]->GetHeight()); } - pMap->SetWidth((int)maxWidth); - pMap->SetHeight((int)maxHeight); - delete [] pTextures; delete [] Delay; } else { -#if defined(HAS_GIFLIB) - Gif gif; - if(!gif.LoadGif(strPath.c_str())) + CAnimatedGifSet AnimatedGifSet; + int iImages = AnimatedGifSet.LoadGIF(strPath.c_str()); + if (iImages == 0) { if (StringUtils::StartsWith(strPath, g_SkinInfo->Path())) CLog::Log(LOGERROR, "Texture manager unable to load file: %s", strPath.c_str()); return emptyTexture; } + int iWidth = AnimatedGifSet.FrameWidth; + int iHeight = AnimatedGifSet.FrameHeight; - unsigned int maxWidth = 0; - unsigned int maxHeight = 0; - pMap = new CTextureMap(strTextureName, gif.Width(), gif.Height(), gif.GetNumLoops()); + // fixup our palette + COLOR *palette = AnimatedGifSet.m_vecimg[0]->Palette; + // set the alpha values to fully opaque + for (int i = 0; i < 256; i++) + palette[i].x = 0xff; + // and set the transparent colour + if (AnimatedGifSet.m_vecimg[0]->Transparency && AnimatedGifSet.m_vecimg[0]->Transparent >= 0) + palette[AnimatedGifSet.m_vecimg[0]->Transparent].x = 0; - for (auto frame : gif.GetFrames()) + pMap = new CTextureMap(strTextureName, iWidth, iHeight, AnimatedGifSet.nLoops); + + for (int iImage = 0; iImage < iImages; iImage++) { CTexture *glTexture = new CTexture(); if (glTexture) { - glTexture->LoadFromMemory(gif.Width(), gif.Height(), gif.GetPitch(), XB_FMT_A8R8G8B8, false, frame->m_pImage); - pMap->Add(glTexture, frame->m_delay); - maxWidth = std::max(maxWidth, glTexture->GetWidth()); - maxHeight = std::max(maxHeight, glTexture->GetHeight()); + CAnimatedGif* pImage = AnimatedGifSet.m_vecimg[iImage]; + glTexture->LoadPaletted(pImage->Width, pImage->Height, pImage->BytesPerRow, XB_FMT_A8R8G8B8, (unsigned char *)pImage->Raster, palette); + pMap->Add(glTexture, pImage->Delay); } - } - - pMap->SetWidth((int)maxWidth); - pMap->SetHeight((int)maxHeight); - -#endif//HAS_GIFLIB + } // of for (int iImage=0; iImage < iImages; iImage++) } - if (pMap) - { - m_vecTextures.push_back(pMap); - return pMap->GetTexture(); - } + m_vecTextures.push_back(pMap); + return pMap->GetTexture(); } // of if (strPath.Right(4).ToLower()==".gif") CBaseTexture *pTexture = NULL; @@ -462,7 +443,7 @@ { //CLog::Log(LOGINFO, " cleanup:%s", strTextureName.c_str()); // add to our textures to free - m_unusedTextures.push_back(std::make_pair(pMap, immediately ? 0 : XbmcThreads::SystemClockMillis())); + m_unusedTextures.push_back(make_pair(pMap, immediately ? 0 : XbmcThreads::SystemClockMillis())); i = m_vecTextures.erase(i); } return; @@ -493,7 +474,7 @@ // on ios the hw textures might be deleted from the os // when XBMC is backgrounded (e.x. for backgrounded music playback) // sanity check before delete in that case. -#if defined(TARGET_DARWIN_IOS) +#if defined(TARGET_DARWIN_IOS) && !defined(TARGET_DARWIN_IOS_ATV2) if (!g_Windowing.IsBackgrounded() || glIsTexture(m_unusedHwTextures[i])) #endif glDeleteTextures(1, (GLuint*) &m_unusedHwTextures[i]); @@ -587,7 +568,7 @@ void CGUITextureManager::RemoveTexturePath(const std::string &texturePath) { CSingleLock lock(m_section); - for (std::vector::iterator it = m_texturePaths.begin(); it != m_texturePaths.end(); ++it) + for (vector::iterator it = m_texturePaths.begin(); it != m_texturePaths.end(); ++it) { if (*it == texturePath) { @@ -604,7 +585,7 @@ else { // texture doesn't include the full path, so check all fallbacks CSingleLock lock(m_section); - for (std::vector::iterator it = m_texturePaths.begin(); it != m_texturePaths.end(); ++it) + for (vector::iterator it = m_texturePaths.begin(); it != m_texturePaths.end(); ++it) { std::string path = URIUtils::AddFileToFolder(it->c_str(), "media"); path = URIUtils::AddFileToFolder(path, textureName); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureManager.h kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureManager.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/TextureManager.h 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/TextureManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,15 +22,17 @@ \file TextureManager.h \brief */ -#pragma once -#include -#include -#include +#ifndef GUILIB_TEXTUREMANAGER_H +#define GUILIB_TEXTUREMANAGER_H +#include +#include #include "TextureBundle.h" #include "threads/CriticalSection.h" +#pragma once + /************************************************************************/ /* */ /************************************************************************/ @@ -83,8 +85,6 @@ uint32_t GetMemoryUsage() const; void Flush(); bool IsEmpty() const; - void SetHeight(int height); - void SetWidth(int height); protected: void FreeTexture(); @@ -141,4 +141,5 @@ \ingroup textures \brief */ -extern CGUITextureManager g_TextureManager; \ No newline at end of file +extern CGUITextureManager g_TextureManager; +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/TexturePi.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/TexturePi.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/TexturePi.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/TexturePi.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,6 +29,8 @@ #if defined(HAS_OMXPLAYER) #include "cores/omxplayer/OMXImage.h" +using namespace std; + /************************************************************************/ /* CPiTexture */ /************************************************************************/ @@ -110,7 +112,7 @@ CGLTexture::Update(width, height, pitch, format, pixels, loadToGPU); } -bool CPiTexture::LoadFromFileInternal(const std::string& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool requirePixels, const std::string& strMimeType) +bool CPiTexture::LoadFromFileInternal(const std::string& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool autoRotate, bool requirePixels, const std::string& strMimeType) { if (URIUtils::HasExtension(texturePath, ".jpg|.tbn")) { @@ -140,12 +142,13 @@ if (okay) { m_hasAlpha = false; - m_orientation = orientation; + if (autoRotate) + m_orientation = orientation; return true; } } } - return CGLTexture::LoadFromFileInternal(texturePath, maxWidth, maxHeight, requirePixels); + return CGLTexture::LoadFromFileInternal(texturePath, maxWidth, maxHeight, autoRotate, requirePixels); } #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/TexturePi.h kodi-15.2~git20151019.1039-final/xbmc/guilib/TexturePi.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/TexturePi.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/TexturePi.h 2015-10-19 08:39:16.000000000 +0000 @@ -38,7 +38,7 @@ void LoadToGPU(); void Update(unsigned int width, unsigned int height, unsigned int pitch, unsigned int format, const unsigned char *pixels, bool loadToGPU); void Allocate(unsigned int width, unsigned int height, unsigned int format); - bool LoadFromFileInternal(const std::string& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool requirePixels, const std::string& strMimeType = ""); + bool LoadFromFileInternal(const std::string& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool autoRotate, bool requirePixels, const std::string& strMimeType = ""); protected: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/VisibleEffect.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/VisibleEffect.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/VisibleEffect.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/VisibleEffect.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,8 @@ #include "utils/XBMCTinyXML.h" #include "utils/XMLUtils.h" +using namespace std; + CAnimEffect::CAnimEffect(const TiXmlElement *node, EFFECT_TYPE effect) { m_effect = effect; @@ -185,7 +187,7 @@ const char *startPos = node->Attribute("start"); if (startPos) { - std::vector commaSeparated = StringUtils::Split(startPos, ","); + vector commaSeparated = StringUtils::Split(startPos, ","); if (commaSeparated.size() > 1) m_startY = (float)atof(commaSeparated[1].c_str()); if (!commaSeparated.empty()) @@ -194,7 +196,7 @@ const char *endPos = node->Attribute("end"); if (endPos) { - std::vector commaSeparated = StringUtils::Split(endPos, ","); + vector commaSeparated = StringUtils::Split(endPos, ","); if (commaSeparated.size() > 1) m_endY = (float)atof(commaSeparated[1].c_str()); if (!commaSeparated.empty()) @@ -225,7 +227,7 @@ m_autoCenter = true; else { - std::vector commaSeparated = StringUtils::Split(centerPos, ","); + vector commaSeparated = StringUtils::Split(centerPos, ","); if (commaSeparated.size() > 1) m_center.y = (float)atof(commaSeparated[1].c_str()); if (!commaSeparated.empty()) @@ -259,13 +261,13 @@ float endPosX = rect.x1; float endPosY = rect.y1; - float width = std::max(rect.Width(), 0.001f); - float height = std::max(rect.Height(),0.001f); + float width = max(rect.Width(), 0.001f); + float height = max(rect.Height(),0.001f); const char *start = node->Attribute("start"); if (start) { - std::vector params = StringUtils::Split(start, ","); + vector params = StringUtils::Split(start, ","); if (params.size() == 1) { m_startX = (float)atof(params[0].c_str()); @@ -290,7 +292,7 @@ const char *end = node->Attribute("end"); if (end) { - std::vector params = StringUtils::Split(end, ","); + vector params = StringUtils::Split(end, ","); if (params.size() == 1) { m_endX = (float)atof(params[0].c_str()); @@ -319,7 +321,7 @@ m_autoCenter = true; else { - std::vector commaSeparated = StringUtils::Split(centerPos, ","); + vector commaSeparated = StringUtils::Split(centerPos, ","); if (commaSeparated.size() > 1) m_center.y = (float)atof(commaSeparated[1].c_str()); if (!commaSeparated.empty()) @@ -671,10 +673,10 @@ // compute the minimum delay and maximum length m_delay = 0xffffffff; unsigned int total = 0; - for (std::vector::const_iterator i = m_effects.begin(); i != m_effects.end(); ++i) + for (vector::const_iterator i = m_effects.begin(); i != m_effects.end(); ++i) { - m_delay = std::min(m_delay, (*i)->GetDelay()); - total = std::max(total, (*i)->GetLength()); + m_delay = min(m_delay, (*i)->GetDelay()); + total = max(total, (*i)->GetLength()); } m_length = total - m_delay; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/WindowIDs.h kodi-15.2~git20151019.1039-final/xbmc/guilib/WindowIDs.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/WindowIDs.h 2016-04-25 08:01:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/WindowIDs.h 2015-10-19 08:39:16.000000000 +0000 @@ -56,8 +56,6 @@ #define WINDOW_ADDON_BROWSER 10040 -#define WINDOW_EVENT_LOG 10050 - #define WINDOW_SCREENSAVER_DIM 97 #define WINDOW_DEBUG_INFO 98 #define WINDOW_DIALOG_POINTER 10099 @@ -95,16 +93,17 @@ #define WINDOW_DIALOG_ADDON_SETTINGS 10140 #define WINDOW_DIALOG_ACCESS_POINTS 10141 #define WINDOW_DIALOG_FULLSCREEN_INFO 10142 +#define WINDOW_DIALOG_KARAOKE_SONGSELECT 10143 +#define WINDOW_DIALOG_KARAOKE_SELECTOR 10144 #define WINDOW_DIALOG_SLIDER 10145 #define WINDOW_DIALOG_ADDON_INFO 10146 #define WINDOW_DIALOG_TEXT_VIEWER 10147 #define WINDOW_DIALOG_PLAY_EJECT 10148 +#define WINDOW_DIALOG_PERIPHERAL_MANAGER 10149 #define WINDOW_DIALOG_PERIPHERAL_SETTINGS 10150 #define WINDOW_DIALOG_EXT_PROGRESS 10151 #define WINDOW_DIALOG_MEDIA_FILTER 10152 #define WINDOW_DIALOG_SUBTITLES 10153 -#define WINDOW_DIALOG_AUDIO_DSP_MANAGER 10154 -#define WINDOW_DIALOG_AUDIO_DSP_OSD_SETTINGS 10155 #define WINDOW_MUSIC_PLAYLIST 10500 #define WINDOW_MUSIC_FILES 10501 @@ -136,7 +135,6 @@ #define WINDOW_RADIO_TIMERS 10623 #define WINDOW_RADIO_SEARCH 10624 #define WINDOW_FULLSCREEN_RADIO 10625 // virtual window for PVR radio specific keymaps with fallback to WINDOW_VISUALISATION -#define WINDOW_DIALOG_PVR_RADIO_RDS_INFO 10626 //#define WINDOW_VIRTUAL_KEYBOARD 11000 // WINDOW_ID's from 11100 to 11199 reserved for Skins @@ -148,11 +146,15 @@ #define WINDOW_FULLSCREEN_VIDEO 12005 #define WINDOW_VISUALISATION 12006 #define WINDOW_SLIDESHOW 12007 +#define WINDOW_DIALOG_FILESTACKING 12008 +#define WINDOW_KARAOKELYRICS 12009 #define WINDOW_WEATHER 12600 #define WINDOW_SCREENSAVER 12900 #define WINDOW_DIALOG_VIDEO_OSD 12901 #define WINDOW_VIDEO_MENU 12902 +#define WINDOW_DIALOG_MUSIC_OVERLAY 12903 +#define WINDOW_DIALOG_VIDEO_OVERLAY 12904 #define WINDOW_VIDEO_TIME_SEEK 12905 // virtual window for time seeking during fullscreen video #define WINDOW_SPLASH 12997 // splash window diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/XBTF.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/XBTF.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/XBTF.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/XBTF.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -17,11 +17,8 @@ * . * */ - -#include "XBTF.h" - #include -#include +#include "XBTF.h" CXBTFFrame::CXBTFFrame() { @@ -129,25 +126,27 @@ } CXBTFFile::CXBTFFile() - : m_path(), - m_loop(0), - m_frames() -{ } +{ + memset(m_path, 0, sizeof(m_path)); + m_loop = 0; +} CXBTFFile::CXBTFFile(const CXBTFFile& ref) - : m_path(ref.m_path), - m_loop(ref.m_loop), - m_frames(ref.m_frames) -{ } +{ + strcpy(m_path, ref.m_path); + m_loop = ref.m_loop; + m_frames = ref.m_frames; +} -const std::string& CXBTFFile::GetPath() const +char* CXBTFFile::GetPath() { return m_path; } void CXBTFFile::SetPath(const std::string& path) { - m_path = path; + memset(m_path, 0, sizeof(m_path)); + strncpy(m_path, path.c_str(), sizeof(m_path) - 1); } uint32_t CXBTFFile::GetLoop() const @@ -160,95 +159,46 @@ m_loop = loop; } -const std::vector& CXBTFFile::GetFrames() const -{ - return m_frames; -} - std::vector& CXBTFFile::GetFrames() { return m_frames; } -uint64_t CXBTFFile::GetPackedSize() const -{ - uint64_t size = 0; - for (const auto& frame : m_frames) - size += frame.GetPackedSize(); - - return size; -} - -uint64_t CXBTFFile::GetUnpackedSize() const -{ - uint64_t size = 0; - for (const auto& frame : m_frames) - size += frame.GetUnpackedSize(); - - return size; -} - uint64_t CXBTFFile::GetHeaderSize() const { uint64_t result = - MaximumPathLength + + sizeof(m_path) + sizeof(m_loop) + sizeof(uint32_t); /* Number of frames */ - for (const auto& frame : m_frames) - result += frame.GetHeaderSize(); + for (size_t i = 0; i < m_frames.size(); i++) + { + result += m_frames[i].GetHeaderSize(); + } return result; } -uint64_t CXBTFBase::GetHeaderSize() const -{ - uint64_t result = XBTF_MAGIC.size() + XBTF_VERSION.size() + - sizeof(uint32_t) /* number of files */; - - for (const auto& file : m_files) - result += file.second.GetHeaderSize(); - - return result; -} - -bool CXBTFBase::Exists(const std::string& name) const -{ - CXBTFFile dummy; - return Get(name, dummy); -} - -bool CXBTFBase::Get(const std::string& name, CXBTFFile& file) const +CXBTF::CXBTF() { - const auto& iter = m_files.find(name); - if (iter == m_files.end()) - return false; - - file = iter->second; - return true; } -std::vector CXBTFBase::GetFiles() const +uint64_t CXBTF::GetHeaderSize() const { - std::vector files; - files.reserve(m_files.size()); - - for (const auto& file : m_files) - files.push_back(file.second); - - return files; -} + uint64_t result = + 4 /* Magic */ + + 1 /* Vesion */ + + sizeof(uint32_t) /* Number of Files */; + + for (size_t i = 0; i < m_files.size(); i++) + { + result += m_files[i].GetHeaderSize(); + } -void CXBTFBase::AddFile(const CXBTFFile& file) -{ - m_files.insert(std::make_pair(file.GetPath(), file)); + return result; } -void CXBTFBase::UpdateFile(const CXBTFFile& file) +std::vector& CXBTF::GetFiles() { - auto&& it = m_files.find(file.GetPath()); - if (it == m_files.end()) - return; - - it->second = file; + return m_files; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/XBTF.h kodi-15.2~git20151019.1039-final/xbmc/guilib/XBTF.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/XBTF.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/XBTF.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,3 @@ -#pragma once /* * Copyright (C) 2005-2013 Team XBMC * http://xbmc.org @@ -18,15 +17,15 @@ * . * */ +#ifndef XBTF_H_ +#define XBTF_H_ -#include #include #include - #include -static const std::string XBTF_MAGIC = "XBTF"; -static const std::string XBTF_VERSION = "2"; +#define XBTF_MAGIC "XBTF" +#define XBTF_VERSION "2" #define XB_FMT_MASK 0xffff ///< mask for format info - other flags are outside this #define XB_FMT_DXT_MASK 15 @@ -45,30 +44,21 @@ { public: CXBTFFrame(); - uint32_t GetWidth() const; void SetWidth(uint32_t width); - uint32_t GetFormat(bool raw = false) const; void SetFormat(uint32_t format); - uint32_t GetHeight() const; void SetHeight(uint32_t height); - uint64_t GetUnpackedSize() const; void SetUnpackedSize(uint64_t size); - uint64_t GetPackedSize() const; void SetPackedSize(uint64_t size); - uint64_t GetOffset() const; void SetOffset(uint64_t offset); - uint64_t GetHeaderSize() const; - uint32_t GetDuration() const; void SetDuration(uint32_t duration); - bool IsPacked() const; bool HasAlpha() const; @@ -87,43 +77,28 @@ public: CXBTFFile(); CXBTFFile(const CXBTFFile& ref); - - const std::string& GetPath() const; + char* GetPath(); void SetPath(const std::string& path); - uint32_t GetLoop() const; void SetLoop(uint32_t loop); - - const std::vector& GetFrames() const; std::vector& GetFrames(); - - uint64_t GetPackedSize() const; - uint64_t GetUnpackedSize() const; uint64_t GetHeaderSize() const; - static const size_t MaximumPathLength = 256; - private: - std::string m_path; - uint32_t m_loop; + char m_path[256]; + uint32_t m_loop; std::vector m_frames; }; -class CXBTFBase +class CXBTF { public: - virtual ~CXBTFBase() { } - + CXBTF(); uint64_t GetHeaderSize() const; + std::vector& GetFiles(); - bool Exists(const std::string& name) const; - bool Get(const std::string& name, CXBTFFile& file) const; - std::vector GetFiles() const; - void AddFile(const CXBTFFile& file); - void UpdateFile(const CXBTFFile& file); - -protected: - CXBTFBase() { } - - std::map m_files; +private: + std::vector m_files; }; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/XBTFReader.cpp kodi-15.2~git20151019.1039-final/xbmc/guilib/XBTFReader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/guilib/XBTFReader.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/XBTFReader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,210 +18,195 @@ * */ -#include -#include -#include #include - #include "XBTFReader.h" -#include "guilib/XBTF.h" #include "utils/EndianSwap.h" - -#ifdef TARGET_WINDOWS -#include "filesystem/SpecialProtocol.h" #include "utils/CharsetConverter.h" -#include "win32/PlatformDefs.h" +#include +#ifdef TARGET_WINDOWS +#include "FileSystem/SpecialProtocol.h" #endif -static bool ReadString(FILE* file, char* str, size_t max_length) -{ - if (file == nullptr || str == nullptr || max_length <= 0) - return false; - - return (fread(str, max_length, 1, file) == 1); -} +#include +#include "PlatformDefs.h" -static bool ReadUInt32(FILE* file, uint32_t& value) -{ - if (file == nullptr) +#define READ_STR(str, size, file) \ + if (1 != fread(str, size, 1, file)) \ return false; - if (fread(&value, sizeof(uint32_t), 1, file) != 1) - return false; +#define READ_U32(i, file) \ + if (1 != fread(&i, 4, 1, file)) \ + return false; \ + i = Endian_SwapLE32(i); - value = Endian_SwapLE32(value); - return true; -} +#define READ_U64(i, file) \ + if (1 != fread(&i, 8, 1, file)) \ + return false; \ + i = Endian_SwapLE64(i); -static bool ReadUInt64(FILE* file, uint64_t& value) +CXBTFReader::CXBTFReader() { - if (file == nullptr) - return false; - - if (fread(&value, sizeof(uint64_t), 1, file) != 1) - return false; - - value = Endian_SwapLE64(value); - return true; + m_file = NULL; } -CXBTFReader::CXBTFReader() - : CXBTFBase(), - m_path(), - m_file(nullptr) -{ } - -CXBTFReader::~CXBTFReader() +bool CXBTFReader::IsOpen() const { - Close(); + return m_file != NULL; } -bool CXBTFReader::Open(const std::string& path) +bool CXBTFReader::Open(const std::string& fileName) { - if (path.empty()) - return false; - - m_path = path; + m_fileName = fileName; #ifdef TARGET_WINDOWS std::wstring strPathW; - g_charsetConverter.utf8ToW(CSpecialProtocol::TranslatePath(m_path), strPathW, false); + g_charsetConverter.utf8ToW(CSpecialProtocol::TranslatePath(m_fileName), strPathW, false); m_file = _wfopen(strPathW.c_str(), L"rb"); #else - m_file = fopen(m_path.c_str(), "rb"); + m_file = fopen(m_fileName.c_str(), "rb"); #endif - if (m_file == nullptr) + if (m_file == NULL) + { return false; + } - // read the magic word char magic[4]; - if (!ReadString(m_file, magic, sizeof(magic))) - return false; + READ_STR(magic, 4, m_file); - if (strncmp(XBTF_MAGIC.c_str(), magic, sizeof(magic)) != 0) + if (strncmp(magic, XBTF_MAGIC, sizeof(magic)) != 0) + { return false; + } - // read the version char version[1]; - if (!ReadString(m_file, version, sizeof(version))) - return false; + READ_STR(version, 1, m_file); - if (strncmp(XBTF_VERSION.c_str(), version, sizeof(version)) != 0) + if (strncmp(version, XBTF_VERSION, sizeof(version)) != 0) + { return false; + } unsigned int nofFiles; - if (!ReadUInt32(m_file, nofFiles)) - return false; - - for (uint32_t i = 0; i < nofFiles; i++) + READ_U32(nofFiles, m_file); + for (unsigned int i = 0; i < nofFiles; i++) { - CXBTFFile xbtfFile; - uint32_t u32; + CXBTFFile file; + unsigned int u32; uint64_t u64; - char path[CXBTFFile::MaximumPathLength]; - memset(path, 0, sizeof(path)); - if (!ReadString(m_file, path, sizeof(path))) - return false; - xbtfFile.SetPath(path); - - if (!ReadUInt32(m_file, u32)) - return false; - xbtfFile.SetLoop(u32); + READ_STR(file.GetPath(), 256, m_file); + READ_U32(u32, m_file); + file.SetLoop(u32); unsigned int nofFrames; - if (!ReadUInt32(m_file, nofFrames)) - return false; + READ_U32(nofFrames, m_file); - for (uint32_t j = 0; j < nofFrames; j++) + for (unsigned int j = 0; j < nofFrames; j++) { CXBTFFrame frame; - if (!ReadUInt32(m_file, u32)) - return false; + READ_U32(u32, m_file); frame.SetWidth(u32); - - if (!ReadUInt32(m_file, u32)) - return false; + READ_U32(u32, m_file); frame.SetHeight(u32); - - if (!ReadUInt32(m_file, u32)) - return false; + READ_U32(u32, m_file); frame.SetFormat(u32); - - if (!ReadUInt64(m_file, u64)) - return false; + READ_U64(u64, m_file); frame.SetPackedSize(u64); - - if (!ReadUInt64(m_file, u64)) - return false; + READ_U64(u64, m_file); frame.SetUnpackedSize(u64); - - if (!ReadUInt32(m_file, u32)) - return false; + READ_U32(u32, m_file); frame.SetDuration(u32); - - if (!ReadUInt64(m_file, u64)) - return false; + READ_U64(u64, m_file); frame.SetOffset(u64); - xbtfFile.GetFrames().push_back(frame); + file.GetFrames().push_back(frame); } - AddFile(xbtfFile); + m_xbtf.GetFiles().push_back(file); + + m_filesMap[file.GetPath()] = file; } // Sanity check - uint64_t pos = static_cast(ftell(m_file)); - if (pos != GetHeaderSize()) + int64_t pos = ftell(m_file); + if (pos != (int64_t)m_xbtf.GetHeaderSize()) + { + printf("Expected header size (%" PRId64") != actual size (%" PRId64")\n", m_xbtf.GetHeaderSize(), pos); return false; + } return true; } -bool CXBTFReader::IsOpen() const -{ - return m_file != nullptr; -} - void CXBTFReader::Close() { - if (m_file != nullptr) + if (m_file) { fclose(m_file); - m_file = nullptr; + m_file = NULL; } - m_path.clear(); - m_files.clear(); + m_xbtf.GetFiles().clear(); + m_filesMap.clear(); } -time_t CXBTFReader::GetLastModificationTimestamp() const +time_t CXBTFReader::GetLastModificationTimestamp() { - if (m_file == nullptr) + if (!m_file) + { return 0; + } struct stat fileStat; if (fstat(fileno(m_file), &fileStat) == -1) + { return 0; + } return fileStat.st_mtime; } -bool CXBTFReader::Load(const CXBTFFrame& frame, unsigned char* buffer) const +bool CXBTFReader::Exists(const std::string& name) { - if (m_file == nullptr) - return false; + return Find(name) != NULL; +} + +CXBTFFile* CXBTFReader::Find(const std::string& name) +{ + std::map::iterator iter = m_filesMap.find(name); + if (iter == m_filesMap.end()) + { + return NULL; + } + return &(iter->second); +} + +bool CXBTFReader::Load(const CXBTFFrame& frame, unsigned char* buffer) +{ + if (!m_file) + { + return false; + } #if defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) || defined(TARGET_ANDROID) - if (fseeko(m_file, static_cast(frame.GetOffset()), SEEK_SET) == -1) + if (fseeko(m_file, (off_t)frame.GetOffset(), SEEK_SET) == -1) #else - if (fseeko64(m_file, static_cast(frame.GetOffset()), SEEK_SET) == -1) + if (fseeko64(m_file, (off_t)frame.GetOffset(), SEEK_SET) == -1) #endif + { return false; + } - if (fread(buffer, 1, static_cast(frame.GetPackedSize()), m_file) != frame.GetPackedSize()) + if (fread(buffer, 1, (size_t)frame.GetPackedSize(), m_file) != frame.GetPackedSize()) + { return false; + } return true; } + +std::vector& CXBTFReader::GetFiles() +{ + return m_xbtf.GetFiles(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/guilib/XBTFReader.h kodi-15.2~git20151019.1039-final/xbmc/guilib/XBTFReader.h --- kodi-16.1~git20160425.1001-final/xbmc/guilib/XBTFReader.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/guilib/XBTFReader.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,3 @@ -#pragma once /* * Copyright (C) 2005-2013 Team XBMC * http://xbmc.org @@ -19,31 +18,32 @@ * */ -#include -#include -#include - -#include +#ifndef XBTFREADER_H_ +#define XBTFREADER_H_ +#include +#include +#include #include "XBTF.h" -class CXBTFReader : public CXBTFBase +class CXBTFReader { public: CXBTFReader(); - ~CXBTFReader(); - - bool Open(const std::string& path); bool IsOpen() const; + bool Open(const std::string& fileName); void Close(); - - time_t GetLastModificationTimestamp() const; - - bool Load(const CXBTFFrame& frame, unsigned char* buffer) const; + time_t GetLastModificationTimestamp(); + bool Exists(const std::string& name); + CXBTFFile* Find(const std::string& name); + bool Load(const CXBTFFrame& frame, unsigned char* buffer); + std::vector& GetFiles(); private: - std::string m_path; - FILE* m_file; + CXBTF m_xbtf; + std::string m_fileName; + FILE* m_file; + std::map m_filesMap; }; -typedef std::shared_ptr CXBTFReaderPtr; +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/GUIPassword.cpp kodi-15.2~git20151019.1039-final/xbmc/GUIPassword.cpp --- kodi-16.1~git20160425.1001-final/xbmc/GUIPassword.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/GUIPassword.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -20,7 +20,7 @@ #include "GUIPassword.h" #include "GUIUserMessages.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "dialogs/GUIDialogGamepad.h" #include "guilib/GUIKeyboardFactory.h" #include "dialogs/GUIDialogNumeric.h" @@ -36,11 +36,6 @@ #include "guilib/LocalizeStrings.h" #include "utils/StringUtils.h" #include "view/ViewStateSettings.h" -#include "utils/Variant.h" - -#include - -using namespace KODI::MESSAGING; CGUIPassword::CGUIPassword(void) { @@ -56,7 +51,7 @@ // \param pItem The share folder item to access // \param strType The type of share being accessed, e.g. "music", "video", etc. See CSettings::UpdateSources() // \return If access is granted, returns \e true - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE) return true; while (pItem->m_iHasLock > 1) @@ -71,9 +66,9 @@ } else { - if (0 != CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES) && pItem->m_iBadPwdCount >= CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES)) + if (0 != CSettings::Get().GetInt("masterlock.maxretries") && pItem->m_iBadPwdCount >= CSettings::Get().GetInt("masterlock.maxretries")) { // user previously exhausted all retries, show access denied error - CGUIDialogOK::ShowAndGetInput(CVariant{12345}, CVariant{12346}); + CGUIDialogOK::ShowAndGetInput(12345, 12346); return false; } // show the appropriate lock dialog @@ -99,18 +94,18 @@ pItem->m_iHasLock = 1; g_passwordManager.LockSource(strType,strLabel,false); sprintf(buffer,"%i",pItem->m_iBadPwdCount); - CMediaSourceSettings::GetInstance().UpdateSource(strType, strLabel, "badpwdcount", buffer); - CMediaSourceSettings::GetInstance().Save(); + CMediaSourceSettings::Get().UpdateSource(strType, strLabel, "badpwdcount", buffer); + CMediaSourceSettings::Get().Save(); break; } case 1: { // password entry failed - if (0 != CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES)) + if (0 != CSettings::Get().GetInt("masterlock.maxretries")) pItem->m_iBadPwdCount++; sprintf(buffer,"%i",pItem->m_iBadPwdCount); - CMediaSourceSettings::GetInstance().UpdateSource(strType, strLabel, "badpwdcount", buffer); - CMediaSourceSettings::GetInstance().Save(); + CMediaSourceSettings::Get().UpdateSource(strType, strLabel, "badpwdcount", buffer); + CMediaSourceSettings::Get().Save(); break; } default: @@ -130,16 +125,16 @@ int iVerifyPasswordResult = -1; std::string strHeader = g_localizeStrings.Get(20075); if (iMasterLockRetriesLeft == -1) - iMasterLockRetriesLeft = CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES); + iMasterLockRetriesLeft = CSettings::Get().GetInt("masterlock.maxretries"); if (g_passwordManager.iMasterLockRetriesLeft == 0) g_passwordManager.iMasterLockRetriesLeft = 1; - std::string strPassword = CProfilesManager::GetInstance().GetMasterProfile().getLockCode(); - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == 0) + std::string strPassword = CProfilesManager::Get().GetMasterProfile().getLockCode(); + if (CProfilesManager::Get().GetMasterProfile().getLockMode() == 0) iVerifyPasswordResult = 0; else { for (int i=1; i <= g_passwordManager.iMasterLockRetriesLeft; i++) { - iVerifyPasswordResult = VerifyPassword(CProfilesManager::GetInstance().GetMasterProfile().getLockMode(), strPassword, strHeader); + iVerifyPasswordResult = VerifyPassword(CProfilesManager::Get().GetMasterProfile().getLockMode(), strPassword, strHeader); if (iVerifyPasswordResult != 0 ) { std::string strLabel1; @@ -148,7 +143,7 @@ std::string strLabel = StringUtils::Format("%i %s", iLeft, strLabel1.c_str()); // PopUp OK and Display: MasterLock mode has changed but no new Mastercode has been set! - CGUIDialogOK::ShowAndGetInput(CVariant{12360}, CVariant{12367}, CVariant{strLabel}, CVariant{""}); + CGUIDialogOK::ShowAndGetInput(12360, 12367, strLabel, ""); } else i=g_passwordManager.iMasterLockRetriesLeft; @@ -157,19 +152,19 @@ if (iVerifyPasswordResult == 0) { - g_passwordManager.iMasterLockRetriesLeft = CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES); + g_passwordManager.iMasterLockRetriesLeft = CSettings::Get().GetInt("masterlock.maxretries"); return true; // OK The MasterCode Accepted! XBMC Can Run! } else { - CApplicationMessenger::GetInstance().PostMsg(TMSG_SHUTDOWN); // Turn off the box + CApplicationMessenger::Get().Shutdown(); // Turn off the box return false; } } bool CGUIPassword::SetMasterLockMode(bool bDetails) { - CProfile* profile = CProfilesManager::GetInstance().GetProfile(0); + CProfile* profile = CProfilesManager::Get().GetProfile(0); if (profile) { CProfile::CLock locks = profile->GetLocks(); @@ -194,12 +189,12 @@ return true; int iProfileToCheck=iProfile; if (iProfile == -1) - iProfileToCheck = CProfilesManager::GetInstance().GetCurrentProfileIndex(); + iProfileToCheck = CProfilesManager::Get().GetCurrentProfileIndex(); if (iProfileToCheck == 0) return IsMasterLockUnlocked(prompt,bCanceled); else { - CProfile *profile = CProfilesManager::GetInstance().GetProfile(iProfileToCheck); + CProfile *profile = CProfilesManager::Get().GetProfile(iProfileToCheck); if (!profile) return false; @@ -207,7 +202,7 @@ return (profile->getLockMode() == LOCK_MODE_EVERYONE); if (profile->getDate().empty() && - (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || + (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || profile->getLockMode() == LOCK_MODE_EVERYONE)) { // user hasn't set a password and this is the first time they've used this account @@ -216,7 +211,7 @@ return true; } else - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) return CheckLock(profile->getLockMode(),profile->getLockCode(),20095,bCanceled); } @@ -233,12 +228,12 @@ { bCanceled = false; if (iMasterLockRetriesLeft == -1) - iMasterLockRetriesLeft = CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES); - if ((LOCK_MODE_EVERYONE < CProfilesManager::GetInstance().GetMasterProfile().getLockMode() && !bMasterUser) && !bPromptUser) + iMasterLockRetriesLeft = CSettings::Get().GetInt("masterlock.maxretries"); + if ((LOCK_MODE_EVERYONE < CProfilesManager::Get().GetMasterProfile().getLockMode() && !bMasterUser) && !bPromptUser) // not unlocked, but calling code doesn't want to prompt user return false; - if (g_passwordManager.bMasterUser || CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE) + if (g_passwordManager.bMasterUser || CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE) return true; if (iMasterLockRetriesLeft == 0) @@ -248,9 +243,10 @@ } // no, unlock since we are allowed to prompt + int iVerifyPasswordResult = -1; std::string strHeading = g_localizeStrings.Get(20075); - std::string strPassword = CProfilesManager::GetInstance().GetMasterProfile().getLockCode(); - int iVerifyPasswordResult = VerifyPassword(CProfilesManager::GetInstance().GetMasterProfile().getLockMode(), strPassword, strHeading); + std::string strPassword = CProfilesManager::Get().GetMasterProfile().getLockCode(); + iVerifyPasswordResult = VerifyPassword(CProfilesManager::Get().GetMasterProfile().getLockMode(), strPassword, strHeading); if (1 == iVerifyPasswordResult) UpdateMasterLockRetryCount(false); @@ -272,7 +268,7 @@ if (!bResetCount) { // Bad mastercode entered - if (0 < CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES)) + if (0 < CSettings::Get().GetInt("masterlock.maxretries")) { // We're keeping track of how many bad passwords are entered if (1 < g_passwordManager.iMasterLockRetriesLeft) @@ -285,7 +281,7 @@ // user has run out of retry attempts g_passwordManager.iMasterLockRetriesLeft = 0; // Tell the user they ran out of retry attempts - CGUIDialogOK::ShowAndGetInput(CVariant{12345}, CVariant{12346}); + CGUIDialogOK::ShowAndGetInput(12345, 12346); return ; } } @@ -294,10 +290,10 @@ dlgLine1 = StringUtils::Format("%d %s", g_passwordManager.iMasterLockRetriesLeft, g_localizeStrings.Get(12343).c_str()); - CGUIDialogOK::ShowAndGetInput(CVariant{20075}, CVariant{12345}, CVariant{std::move(dlgLine1)}, CVariant{0}); + CGUIDialogOK::ShowAndGetInput(20075, 12345, dlgLine1, 0); } else - g_passwordManager.iMasterLockRetriesLeft = CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES); // user entered correct mastercode, reset retries to max allowed + g_passwordManager.iMasterLockRetriesLeft = CSettings::Get().GetInt("masterlock.maxretries"); // user entered correct mastercode, reset retries to max allowed } bool CGUIPassword::CheckLock(LockType btnType, const std::string& strPassword, int iHeading) @@ -310,11 +306,12 @@ { bCanceled = false; if (btnType == LOCK_MODE_EVERYONE || strPassword == "-" || - CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || g_passwordManager.bMasterUser) + CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || g_passwordManager.bMasterUser) return true; + int iVerifyPasswordResult = -1; std::string strHeading = g_localizeStrings.Get(iHeading); - int iVerifyPasswordResult = VerifyPassword(btnType, strPassword, strHeading); + iVerifyPasswordResult = VerifyPassword(btnType, strPassword, strHeading); if (iVerifyPasswordResult == -1) bCanceled = true; @@ -324,14 +321,14 @@ bool CGUIPassword::CheckSettingLevelLock(const SettingLevel& level, bool enforce /*=false*/) { - LOCK_LEVEL::SETTINGS_LOCK lockLevel = CProfilesManager::GetInstance().GetCurrentProfile().settingsLockLevel(); + LOCK_LEVEL::SETTINGS_LOCK lockLevel = CProfilesManager::Get().GetCurrentProfile().settingsLockLevel(); if (lockLevel == LOCK_LEVEL::NONE) return true; //check if we are already in settings and in an level that needs unlocking int windowID = g_windowManager.GetActiveWindow(); - if ((int)lockLevel-1 <= (short)CViewStateSettings::GetInstance().GetSettingLevel() && + if ((int)lockLevel-1 <= (short)CViewStateSettings::Get().GetSettingLevel() && (windowID == WINDOW_SETTINGS_MENU || (windowID >= WINDOW_SCREEN_CALIBRATION && windowID <= WINDOW_SETTINGS_MYPVR))) @@ -347,7 +344,7 @@ { //Current Setting level is higher than our permission... so lower the viewing level SettingLevel newLevel = (SettingLevel)(short)(lockLevel-2); - CViewStateSettings::GetInstance().SetSettingLevel(newLevel); + CViewStateSettings::Get().SetSettingLevel(newLevel); } } return true; @@ -392,25 +389,25 @@ switch (iSwitch) { case WINDOW_SETTINGS_MENU: // Settings - return CheckSettingLevelLock(CViewStateSettings::GetInstance().GetSettingLevel()); + return CheckSettingLevelLock(CViewStateSettings::Get().GetSettingLevel()); break; case WINDOW_ADDON_BROWSER: // Addons - bCheckPW = CProfilesManager::GetInstance().GetCurrentProfile().addonmanagerLocked(); + bCheckPW = CProfilesManager::Get().GetCurrentProfile().addonmanagerLocked(); break; case WINDOW_FILES: // Files - bCheckPW = CProfilesManager::GetInstance().GetCurrentProfile().filesLocked(); + bCheckPW = CProfilesManager::Get().GetCurrentProfile().filesLocked(); break; case WINDOW_PROGRAMS: // Programs - bCheckPW = CProfilesManager::GetInstance().GetCurrentProfile().programsLocked(); + bCheckPW = CProfilesManager::Get().GetCurrentProfile().programsLocked(); break; case WINDOW_MUSIC_FILES: // Music - bCheckPW = CProfilesManager::GetInstance().GetCurrentProfile().musicLocked(); + bCheckPW = CProfilesManager::Get().GetCurrentProfile().musicLocked(); break; case WINDOW_VIDEO_FILES: // Video - bCheckPW = CProfilesManager::GetInstance().GetCurrentProfile().videoLocked(); + bCheckPW = CProfilesManager::Get().GetCurrentProfile().videoLocked(); break; case WINDOW_PICTURES: // Pictures - bCheckPW = CProfilesManager::GetInstance().GetCurrentProfile().picturesLocked(); + bCheckPW = CProfilesManager::Get().GetCurrentProfile().picturesLocked(); break; case WINDOW_SETTINGS_PROFILES: bCheckPW = true; @@ -427,7 +424,7 @@ bool CGUIPassword::LockSource(const std::string& strType, const std::string& strName, bool bState) { - VECSOURCES* pShares = CMediaSourceSettings::GetInstance().GetSources(strType); + VECSOURCES* pShares = CMediaSourceSettings::Get().GetSources(strType); bool bResult = false; for (IVECSOURCES it=pShares->begin();it != pShares->end();++it) { @@ -453,7 +450,7 @@ const char* strType[5] = {"programs","music","video","pictures","files"}; for (int i=0;i<5;++i) { - VECSOURCES *shares = CMediaSourceSettings::GetInstance().GetSources(strType[i]); + VECSOURCES *shares = CMediaSourceSettings::Get().GetSources(strType[i]); for (IVECSOURCES it=shares->begin();it != shares->end();++it) if (it->m_iLockMode != LOCK_MODE_EVERYONE) it->m_iHasLock = lock ? 2 : 1; @@ -468,23 +465,23 @@ const char* strType[5] = {"programs","music","video","pictures","files"}; for (int i=0;i<5;++i) { - VECSOURCES *shares = CMediaSourceSettings::GetInstance().GetSources(strType[i]); + VECSOURCES *shares = CMediaSourceSettings::Get().GetSources(strType[i]); for (IVECSOURCES it=shares->begin();it != shares->end();++it) if (it->m_iLockMode != LOCK_MODE_EVERYONE) // remove old info { it->m_iHasLock = 0; it->m_iLockMode = LOCK_MODE_EVERYONE; - CMediaSourceSettings::GetInstance().UpdateSource(strType[i], it->strName, "lockmode", "0"); // removes locks from xml + CMediaSourceSettings::Get().UpdateSource(strType[i], it->strName, "lockmode", "0"); // removes locks from xml } } - CMediaSourceSettings::GetInstance().Save(); + CMediaSourceSettings::Get().Save(); CGUIMessage msg(GUI_MSG_NOTIFY_ALL,0,0, GUI_MSG_UPDATE_SOURCES); g_windowManager.SendThreadMessage(msg); } bool CGUIPassword::IsDatabasePathUnlocked(const std::string& strPath, VECSOURCES& vecSources) { - if (g_passwordManager.bMasterUser || CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE) + if (g_passwordManager.bMasterUser || CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE) return true; // try to find the best matching source @@ -504,7 +501,7 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_MASTERLOCK_LOCKCODE) + if (settingId == "masterlock.lockcode") SetMasterLockMode(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/GUIPassword.h kodi-15.2~git20151019.1039-final/xbmc/GUIPassword.h --- kodi-16.1~git20160425.1001-final/xbmc/GUIPassword.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/GUIPassword.h 2015-10-19 08:39:15.000000000 +0000 @@ -87,7 +87,7 @@ void RemoveSourceLocks(); bool IsDatabasePathUnlocked(const std::string& strPath, VECSOURCES& vecSources); - virtual void OnSettingAction(const CSetting *setting) override; + virtual void OnSettingAction(const CSetting *setting); bool bMasterUser; int iMasterLockRetriesLeft; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/GUIUserMessages.h kodi-15.2~git20151019.1039-final/xbmc/GUIUserMessages.h --- kodi-16.1~git20160425.1001-final/xbmc/GUIUserMessages.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/GUIUserMessages.h 2015-10-19 08:39:15.000000000 +0000 @@ -135,10 +135,3 @@ // Sent to text field to support 'input method' #define GUI_MSG_INPUT_TEXT_EDIT GUI_MSG_USER + 38 - -// Sent to CGUIWindowEventLog -#define GUI_MSG_EVENT_ADDED GUI_MSG_USER + 39 -#define GUI_MSG_EVENT_REMOVED GUI_MSG_USER + 40 - -// Send to RDS Radiotext handlers to inform about changed data -#define GUI_MSG_UPDATE_RADIOTEXT GUI_MSG_USER + 41 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/ButtonTranslator.cpp kodi-15.2~git20151019.1039-final/xbmc/input/ButtonTranslator.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/ButtonTranslator.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/ButtonTranslator.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,33 +13,31 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see + * along with XBMC; see the file COPYING. If not, see * . * */ +#include "system.h" +#include "interfaces/Builtins.h" #include "ButtonTranslator.h" - -#include -#include - -#include "FileItem.h" -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "guilib/WindowIDs.h" +#include "profiles/ProfilesManager.h" +#include "utils/URIUtils.h" #include "input/Key.h" +#include "guilib/WindowIDs.h" #include "input/MouseStat.h" #include "input/XBMC_keytable.h" -#include "interfaces/builtins/Builtins.h" -#include "profiles/ProfilesManager.h" -#include "system.h" -#include "Util.h" -#include "utils/log.h" -#include "utils/RegExp.h" +#include "filesystem/File.h" +#include "filesystem/Directory.h" +#include "FileItem.h" #include "utils/StringUtils.h" -#include "utils/URIUtils.h" +#include "utils/log.h" #include "utils/XBMCTinyXML.h" +#include "utils/RegExp.h" #include "XBIRRemote.h" +#include "Util.h" + +#include #if defined(TARGET_WINDOWS) #include "input/windows/WINJoystick.h" @@ -49,6 +47,7 @@ #define JOYSTICK_DEFAULT_MAP "_xbmc_" +using namespace std; using namespace XFILE; typedef struct @@ -65,402 +64,411 @@ static const ActionMapping actions[] = { - { "left" , ACTION_MOVE_LEFT }, - { "right" , ACTION_MOVE_RIGHT }, - { "up" , ACTION_MOVE_UP }, - { "down" , ACTION_MOVE_DOWN }, - { "pageup" , ACTION_PAGE_UP }, - { "pagedown" , ACTION_PAGE_DOWN }, - { "select" , ACTION_SELECT_ITEM }, - { "highlight" , ACTION_HIGHLIGHT_ITEM }, - { "parentdir" , ACTION_NAV_BACK }, // backward compatibility - { "parentfolder" , ACTION_PARENT_DIR }, - { "back" , ACTION_NAV_BACK }, - { "menu" , ACTION_MENU}, - { "previousmenu" , ACTION_PREVIOUS_MENU }, - { "info" , ACTION_SHOW_INFO }, - { "pause" , ACTION_PAUSE }, - { "stop" , ACTION_STOP }, - { "skipnext" , ACTION_NEXT_ITEM }, - { "skipprevious" , ACTION_PREV_ITEM }, - { "fullscreen" , ACTION_SHOW_GUI }, - { "aspectratio" , ACTION_ASPECT_RATIO }, - { "stepforward" , ACTION_STEP_FORWARD }, - { "stepback" , ACTION_STEP_BACK }, - { "bigstepforward" , ACTION_BIG_STEP_FORWARD }, - { "bigstepback" , ACTION_BIG_STEP_BACK }, - { "chapterorbigstepforward" , ACTION_CHAPTER_OR_BIG_STEP_FORWARD }, - { "chapterorbigstepback" , ACTION_CHAPTER_OR_BIG_STEP_BACK }, - { "osd" , ACTION_SHOW_OSD }, - { "showsubtitles" , ACTION_SHOW_SUBTITLES }, - { "nextsubtitle" , ACTION_NEXT_SUBTITLE }, - { "cyclesubtitle" , ACTION_CYCLE_SUBTITLE }, - { "codecinfo" , ACTION_SHOW_CODEC }, - { "nextpicture" , ACTION_NEXT_PICTURE }, - { "previouspicture" , ACTION_PREV_PICTURE }, - { "zoomout" , ACTION_ZOOM_OUT }, - { "zoomin" , ACTION_ZOOM_IN }, - { "playlist" , ACTION_SHOW_PLAYLIST }, - { "queue" , ACTION_QUEUE_ITEM }, - { "zoomnormal" , ACTION_ZOOM_LEVEL_NORMAL }, - { "zoomlevel1" , ACTION_ZOOM_LEVEL_1 }, - { "zoomlevel2" , ACTION_ZOOM_LEVEL_2 }, - { "zoomlevel3" , ACTION_ZOOM_LEVEL_3 }, - { "zoomlevel4" , ACTION_ZOOM_LEVEL_4 }, - { "zoomlevel5" , ACTION_ZOOM_LEVEL_5 }, - { "zoomlevel6" , ACTION_ZOOM_LEVEL_6 }, - { "zoomlevel7" , ACTION_ZOOM_LEVEL_7 }, - { "zoomlevel8" , ACTION_ZOOM_LEVEL_8 }, - { "zoomlevel9" , ACTION_ZOOM_LEVEL_9 }, - { "nextcalibration" , ACTION_CALIBRATE_SWAP_ARROWS }, - { "resetcalibration" , ACTION_CALIBRATE_RESET }, - { "analogmove" , ACTION_ANALOG_MOVE }, - { "analogmovex" , ACTION_ANALOG_MOVE_X }, - { "analogmovey" , ACTION_ANALOG_MOVE_Y }, - { "rotate" , ACTION_ROTATE_PICTURE_CW }, - { "rotateccw" , ACTION_ROTATE_PICTURE_CCW }, - { "close" , ACTION_NAV_BACK }, // backwards compatibility - { "subtitledelayminus" , ACTION_SUBTITLE_DELAY_MIN }, - { "subtitledelay" , ACTION_SUBTITLE_DELAY }, - { "subtitledelayplus" , ACTION_SUBTITLE_DELAY_PLUS }, - { "audiodelayminus" , ACTION_AUDIO_DELAY_MIN }, - { "audiodelay" , ACTION_AUDIO_DELAY }, - { "audiodelayplus" , ACTION_AUDIO_DELAY_PLUS }, - { "subtitleshiftup" , ACTION_SUBTITLE_VSHIFT_UP }, - { "subtitleshiftdown" , ACTION_SUBTITLE_VSHIFT_DOWN }, - { "subtitlealign" , ACTION_SUBTITLE_ALIGN }, - { "audionextlanguage" , ACTION_AUDIO_NEXT_LANGUAGE }, - { "verticalshiftup" , ACTION_VSHIFT_UP }, - { "verticalshiftdown" , ACTION_VSHIFT_DOWN }, - { "nextresolution" , ACTION_CHANGE_RESOLUTION }, - { "audiotoggledigital" , ACTION_TOGGLE_DIGITAL_ANALOG }, - { "number0" , REMOTE_0 }, - { "number1" , REMOTE_1 }, - { "number2" , REMOTE_2 }, - { "number3" , REMOTE_3 }, - { "number4" , REMOTE_4 }, - { "number5" , REMOTE_5 }, - { "number6" , REMOTE_6 }, - { "number7" , REMOTE_7 }, - { "number8" , REMOTE_8 }, - { "number9" , REMOTE_9 }, - { "smallstepback" , ACTION_SMALL_STEP_BACK }, - { "fastforward" , ACTION_PLAYER_FORWARD }, - { "rewind" , ACTION_PLAYER_REWIND }, - { "play" , ACTION_PLAYER_PLAY }, - { "playpause" , ACTION_PLAYER_PLAYPAUSE }, - { "switchplayer" , ACTION_SWITCH_PLAYER }, - { "delete" , ACTION_DELETE_ITEM }, - { "copy" , ACTION_COPY_ITEM }, - { "move" , ACTION_MOVE_ITEM }, - { "screenshot" , ACTION_TAKE_SCREENSHOT }, - { "rename" , ACTION_RENAME_ITEM }, - { "togglewatched" , ACTION_TOGGLE_WATCHED }, - { "scanitem" , ACTION_SCAN_ITEM }, - { "reloadkeymaps" , ACTION_RELOAD_KEYMAPS }, - { "volumeup" , ACTION_VOLUME_UP }, - { "volumedown" , ACTION_VOLUME_DOWN }, - { "mute" , ACTION_MUTE }, - { "backspace" , ACTION_BACKSPACE }, - { "scrollup" , ACTION_SCROLL_UP }, - { "scrolldown" , ACTION_SCROLL_DOWN }, - { "analogfastforward" , ACTION_ANALOG_FORWARD }, - { "analogrewind" , ACTION_ANALOG_REWIND }, - { "moveitemup" , ACTION_MOVE_ITEM_UP }, - { "moveitemdown" , ACTION_MOVE_ITEM_DOWN }, - { "contextmenu" , ACTION_CONTEXT_MENU }, - { "shift" , ACTION_SHIFT }, - { "symbols" , ACTION_SYMBOLS }, - { "cursorleft" , ACTION_CURSOR_LEFT }, - { "cursorright" , ACTION_CURSOR_RIGHT }, - { "showtime" , ACTION_SHOW_OSD_TIME }, - { "analogseekforward" , ACTION_ANALOG_SEEK_FORWARD }, - { "analogseekback" , ACTION_ANALOG_SEEK_BACK }, - { "showpreset" , ACTION_VIS_PRESET_SHOW }, - { "nextpreset" , ACTION_VIS_PRESET_NEXT }, - { "previouspreset" , ACTION_VIS_PRESET_PREV }, - { "lockpreset" , ACTION_VIS_PRESET_LOCK }, - { "randompreset" , ACTION_VIS_PRESET_RANDOM }, - { "increasevisrating" , ACTION_VIS_RATE_PRESET_PLUS }, - { "decreasevisrating" , ACTION_VIS_RATE_PRESET_MINUS }, - { "showvideomenu" , ACTION_SHOW_VIDEOMENU }, - { "enter" , ACTION_ENTER }, - { "increaserating" , ACTION_INCREASE_RATING }, - { "decreaserating" , ACTION_DECREASE_RATING }, - { "togglefullscreen" , ACTION_TOGGLE_FULLSCREEN }, - { "nextscene" , ACTION_NEXT_SCENE }, - { "previousscene" , ACTION_PREV_SCENE }, - { "nextletter" , ACTION_NEXT_LETTER }, - { "prevletter" , ACTION_PREV_LETTER }, - { "jumpsms2" , ACTION_JUMP_SMS2 }, - { "jumpsms3" , ACTION_JUMP_SMS3 }, - { "jumpsms4" , ACTION_JUMP_SMS4 }, - { "jumpsms5" , ACTION_JUMP_SMS5 }, - { "jumpsms6" , ACTION_JUMP_SMS6 }, - { "jumpsms7" , ACTION_JUMP_SMS7 }, - { "jumpsms8" , ACTION_JUMP_SMS8 }, - { "jumpsms9" , ACTION_JUMP_SMS9 }, - { "filter" , ACTION_FILTER }, - { "filterclear" , ACTION_FILTER_CLEAR }, - { "filtersms2" , ACTION_FILTER_SMS2 }, - { "filtersms3" , ACTION_FILTER_SMS3 }, - { "filtersms4" , ACTION_FILTER_SMS4 }, - { "filtersms5" , ACTION_FILTER_SMS5 }, - { "filtersms6" , ACTION_FILTER_SMS6 }, - { "filtersms7" , ACTION_FILTER_SMS7 }, - { "filtersms8" , ACTION_FILTER_SMS8 }, - { "filtersms9" , ACTION_FILTER_SMS9 }, - { "firstpage" , ACTION_FIRST_PAGE }, - { "lastpage" , ACTION_LAST_PAGE }, - { "guiprofile" , ACTION_GUIPROFILE_BEGIN }, - { "red" , ACTION_TELETEXT_RED }, - { "green" , ACTION_TELETEXT_GREEN }, - { "yellow" , ACTION_TELETEXT_YELLOW }, - { "blue" , ACTION_TELETEXT_BLUE }, - { "increasepar" , ACTION_INCREASE_PAR }, - { "decreasepar" , ACTION_DECREASE_PAR }, - { "volampup" , ACTION_VOLAMP_UP }, - { "volampdown" , ACTION_VOLAMP_DOWN }, - { "volumeamplification" , ACTION_VOLAMP }, - { "createbookmark" , ACTION_CREATE_BOOKMARK }, - { "createepisodebookmark" , ACTION_CREATE_EPISODE_BOOKMARK }, - { "settingsreset" , ACTION_SETTINGS_RESET }, - { "settingslevelchange" , ACTION_SETTINGS_LEVEL_CHANGE }, - - // 3D movie playback/GUI - { "stereomode" , ACTION_STEREOMODE_SELECT }, // cycle 3D modes, for now an alias for next - { "nextstereomode" , ACTION_STEREOMODE_NEXT }, - { "previousstereomode" , ACTION_STEREOMODE_PREVIOUS }, - { "togglestereomode" , ACTION_STEREOMODE_TOGGLE }, - { "stereomodetomono" , ACTION_STEREOMODE_TOMONO }, - - // PVR actions - { "channelup" , ACTION_CHANNEL_UP }, - { "channeldown" , ACTION_CHANNEL_DOWN }, - { "previouschannelgroup" , ACTION_PREVIOUS_CHANNELGROUP }, - { "nextchannelgroup" , ACTION_NEXT_CHANNELGROUP }, - { "playpvr" , ACTION_PVR_PLAY }, - { "playpvrtv" , ACTION_PVR_PLAY_TV }, - { "playpvrradio" , ACTION_PVR_PLAY_RADIO }, - { "record" , ACTION_RECORD }, - - // Mouse actions - { "leftclick" , ACTION_MOUSE_LEFT_CLICK }, - { "rightclick" , ACTION_MOUSE_RIGHT_CLICK }, - { "middleclick" , ACTION_MOUSE_MIDDLE_CLICK }, - { "doubleclick" , ACTION_MOUSE_DOUBLE_CLICK }, - { "longclick" , ACTION_MOUSE_LONG_CLICK }, - { "wheelup" , ACTION_MOUSE_WHEEL_UP }, - { "wheeldown" , ACTION_MOUSE_WHEEL_DOWN }, - { "mousedrag" , ACTION_MOUSE_DRAG }, - { "mousemove" , ACTION_MOUSE_MOVE }, - - // Touch - { "tap" , ACTION_TOUCH_TAP }, - { "longpress" , ACTION_TOUCH_LONGPRESS }, - { "pangesture" , ACTION_GESTURE_PAN }, - { "zoomgesture" , ACTION_GESTURE_ZOOM }, - { "rotategesture" , ACTION_GESTURE_ROTATE }, - { "swipeleft" , ACTION_GESTURE_SWIPE_LEFT }, - { "swiperight" , ACTION_GESTURE_SWIPE_RIGHT }, - { "swipeup" , ACTION_GESTURE_SWIPE_UP }, - { "swipedown" , ACTION_GESTURE_SWIPE_DOWN }, - - // Do nothing / error action - { "error" , ACTION_ERROR }, - { "noop" , ACTION_NOOP } + {"left" , ACTION_MOVE_LEFT }, + {"right" , ACTION_MOVE_RIGHT}, + {"up" , ACTION_MOVE_UP }, + {"down" , ACTION_MOVE_DOWN }, + {"pageup" , ACTION_PAGE_UP }, + {"pagedown" , ACTION_PAGE_DOWN}, + {"select" , ACTION_SELECT_ITEM}, + {"highlight" , ACTION_HIGHLIGHT_ITEM}, + {"parentdir" , ACTION_NAV_BACK}, // backward compatibility + {"parentfolder" , ACTION_PARENT_DIR}, + {"back" , ACTION_NAV_BACK}, + {"previousmenu" , ACTION_PREVIOUS_MENU}, + {"info" , ACTION_SHOW_INFO}, + {"pause" , ACTION_PAUSE}, + {"stop" , ACTION_STOP}, + {"skipnext" , ACTION_NEXT_ITEM}, + {"skipprevious" , ACTION_PREV_ITEM}, + {"fullscreen" , ACTION_SHOW_GUI}, + {"aspectratio" , ACTION_ASPECT_RATIO}, + {"stepforward" , ACTION_STEP_FORWARD}, + {"stepback" , ACTION_STEP_BACK}, + {"bigstepforward" , ACTION_BIG_STEP_FORWARD}, + {"bigstepback" , ACTION_BIG_STEP_BACK}, + {"chapterorbigstepforward", ACTION_CHAPTER_OR_BIG_STEP_FORWARD}, + {"chapterorbigstepback" , ACTION_CHAPTER_OR_BIG_STEP_BACK}, + {"osd" , ACTION_SHOW_OSD}, + {"showsubtitles" , ACTION_SHOW_SUBTITLES}, + {"nextsubtitle" , ACTION_NEXT_SUBTITLE}, + {"cyclesubtitle" , ACTION_CYCLE_SUBTITLE}, + {"codecinfo" , ACTION_SHOW_CODEC}, + {"nextpicture" , ACTION_NEXT_PICTURE}, + {"previouspicture" , ACTION_PREV_PICTURE}, + {"zoomout" , ACTION_ZOOM_OUT}, + {"zoomin" , ACTION_ZOOM_IN}, + {"playlist" , ACTION_SHOW_PLAYLIST}, + {"queue" , ACTION_QUEUE_ITEM}, + {"zoomnormal" , ACTION_ZOOM_LEVEL_NORMAL}, + {"zoomlevel1" , ACTION_ZOOM_LEVEL_1}, + {"zoomlevel2" , ACTION_ZOOM_LEVEL_2}, + {"zoomlevel3" , ACTION_ZOOM_LEVEL_3}, + {"zoomlevel4" , ACTION_ZOOM_LEVEL_4}, + {"zoomlevel5" , ACTION_ZOOM_LEVEL_5}, + {"zoomlevel6" , ACTION_ZOOM_LEVEL_6}, + {"zoomlevel7" , ACTION_ZOOM_LEVEL_7}, + {"zoomlevel8" , ACTION_ZOOM_LEVEL_8}, + {"zoomlevel9" , ACTION_ZOOM_LEVEL_9}, + {"nextcalibration" , ACTION_CALIBRATE_SWAP_ARROWS}, + {"resetcalibration" , ACTION_CALIBRATE_RESET}, + {"analogmove" , ACTION_ANALOG_MOVE}, + {"analogmovex" , ACTION_ANALOG_MOVE_X}, + {"analogmovey" , ACTION_ANALOG_MOVE_Y}, + {"rotate" , ACTION_ROTATE_PICTURE_CW}, + {"rotateccw" , ACTION_ROTATE_PICTURE_CCW}, + {"close" , ACTION_NAV_BACK}, // backwards compatibility + {"subtitledelayminus", ACTION_SUBTITLE_DELAY_MIN}, + {"subtitledelay" , ACTION_SUBTITLE_DELAY}, + {"subtitledelayplus" , ACTION_SUBTITLE_DELAY_PLUS}, + {"audiodelayminus" , ACTION_AUDIO_DELAY_MIN}, + {"audiodelay" , ACTION_AUDIO_DELAY}, + {"audiodelayplus" , ACTION_AUDIO_DELAY_PLUS}, + {"subtitleshiftup" , ACTION_SUBTITLE_VSHIFT_UP}, + {"subtitleshiftdown" , ACTION_SUBTITLE_VSHIFT_DOWN}, + {"subtitlealign" , ACTION_SUBTITLE_ALIGN}, + {"audionextlanguage" , ACTION_AUDIO_NEXT_LANGUAGE}, + {"verticalshiftup" , ACTION_VSHIFT_UP}, + {"verticalshiftdown" , ACTION_VSHIFT_DOWN}, + {"nextresolution" , ACTION_CHANGE_RESOLUTION}, + {"audiotoggledigital", ACTION_TOGGLE_DIGITAL_ANALOG}, + {"number0" , REMOTE_0}, + {"number1" , REMOTE_1}, + {"number2" , REMOTE_2}, + {"number3" , REMOTE_3}, + {"number4" , REMOTE_4}, + {"number5" , REMOTE_5}, + {"number6" , REMOTE_6}, + {"number7" , REMOTE_7}, + {"number8" , REMOTE_8}, + {"number9" , REMOTE_9}, + {"osdleft" , ACTION_OSD_SHOW_LEFT}, + {"osdright" , ACTION_OSD_SHOW_RIGHT}, + {"osdup" , ACTION_OSD_SHOW_UP}, + {"osddown" , ACTION_OSD_SHOW_DOWN}, + {"osdselect" , ACTION_OSD_SHOW_SELECT}, + {"osdvalueplus" , ACTION_OSD_SHOW_VALUE_PLUS}, + {"osdvalueminus" , ACTION_OSD_SHOW_VALUE_MIN}, + {"smallstepback" , ACTION_SMALL_STEP_BACK}, + {"fastforward" , ACTION_PLAYER_FORWARD}, + {"rewind" , ACTION_PLAYER_REWIND}, + {"play" , ACTION_PLAYER_PLAY}, + {"playpause" , ACTION_PLAYER_PLAYPAUSE}, + {"switchplayer" , ACTION_SWITCH_PLAYER}, + {"delete" , ACTION_DELETE_ITEM}, + {"copy" , ACTION_COPY_ITEM}, + {"move" , ACTION_MOVE_ITEM}, + {"mplayerosd" , ACTION_SHOW_MPLAYER_OSD}, + {"hidesubmenu" , ACTION_OSD_HIDESUBMENU}, + {"screenshot" , ACTION_TAKE_SCREENSHOT}, + {"rename" , ACTION_RENAME_ITEM}, + {"togglewatched" , ACTION_TOGGLE_WATCHED}, + {"scanitem" , ACTION_SCAN_ITEM}, + {"reloadkeymaps" , ACTION_RELOAD_KEYMAPS}, + {"volumeup" , ACTION_VOLUME_UP}, + {"volumedown" , ACTION_VOLUME_DOWN}, + {"mute" , ACTION_MUTE}, + {"backspace" , ACTION_BACKSPACE}, + {"scrollup" , ACTION_SCROLL_UP}, + {"scrolldown" , ACTION_SCROLL_DOWN}, + {"analogfastforward" , ACTION_ANALOG_FORWARD}, + {"analogrewind" , ACTION_ANALOG_REWIND}, + {"moveitemup" , ACTION_MOVE_ITEM_UP}, + {"moveitemdown" , ACTION_MOVE_ITEM_DOWN}, + {"contextmenu" , ACTION_CONTEXT_MENU}, + {"shift" , ACTION_SHIFT}, + {"symbols" , ACTION_SYMBOLS}, + {"cursorleft" , ACTION_CURSOR_LEFT}, + {"cursorright" , ACTION_CURSOR_RIGHT}, + {"showtime" , ACTION_SHOW_OSD_TIME}, + {"analogseekforward" , ACTION_ANALOG_SEEK_FORWARD}, + {"analogseekback" , ACTION_ANALOG_SEEK_BACK}, + {"showpreset" , ACTION_VIS_PRESET_SHOW}, + {"nextpreset" , ACTION_VIS_PRESET_NEXT}, + {"previouspreset" , ACTION_VIS_PRESET_PREV}, + {"lockpreset" , ACTION_VIS_PRESET_LOCK}, + {"randompreset" , ACTION_VIS_PRESET_RANDOM}, + {"increasevisrating" , ACTION_VIS_RATE_PRESET_PLUS}, + {"decreasevisrating" , ACTION_VIS_RATE_PRESET_MINUS}, + {"showvideomenu" , ACTION_SHOW_VIDEOMENU}, + {"enter" , ACTION_ENTER}, + {"increaserating" , ACTION_INCREASE_RATING}, + {"decreaserating" , ACTION_DECREASE_RATING}, + {"togglefullscreen" , ACTION_TOGGLE_FULLSCREEN}, + {"nextscene" , ACTION_NEXT_SCENE}, + {"previousscene" , ACTION_PREV_SCENE}, + {"nextletter" , ACTION_NEXT_LETTER}, + {"prevletter" , ACTION_PREV_LETTER}, + {"jumpsms2" , ACTION_JUMP_SMS2}, + {"jumpsms3" , ACTION_JUMP_SMS3}, + {"jumpsms4" , ACTION_JUMP_SMS4}, + {"jumpsms5" , ACTION_JUMP_SMS5}, + {"jumpsms6" , ACTION_JUMP_SMS6}, + {"jumpsms7" , ACTION_JUMP_SMS7}, + {"jumpsms8" , ACTION_JUMP_SMS8}, + {"jumpsms9" , ACTION_JUMP_SMS9}, + {"filter" , ACTION_FILTER}, + {"filterclear" , ACTION_FILTER_CLEAR}, + {"filtersms2" , ACTION_FILTER_SMS2}, + {"filtersms3" , ACTION_FILTER_SMS3}, + {"filtersms4" , ACTION_FILTER_SMS4}, + {"filtersms5" , ACTION_FILTER_SMS5}, + {"filtersms6" , ACTION_FILTER_SMS6}, + {"filtersms7" , ACTION_FILTER_SMS7}, + {"filtersms8" , ACTION_FILTER_SMS8}, + {"filtersms9" , ACTION_FILTER_SMS9}, + {"firstpage" , ACTION_FIRST_PAGE}, + {"lastpage" , ACTION_LAST_PAGE}, + {"guiprofile" , ACTION_GUIPROFILE_BEGIN}, + {"red" , ACTION_TELETEXT_RED}, + {"green" , ACTION_TELETEXT_GREEN}, + {"yellow" , ACTION_TELETEXT_YELLOW}, + {"blue" , ACTION_TELETEXT_BLUE}, + {"increasepar" , ACTION_INCREASE_PAR}, + {"decreasepar" , ACTION_DECREASE_PAR}, + {"volampup" , ACTION_VOLAMP_UP}, + {"volampdown" , ACTION_VOLAMP_DOWN}, + {"volumeamplification", ACTION_VOLAMP}, + {"createbookmark" , ACTION_CREATE_BOOKMARK}, + {"createepisodebookmark" , ACTION_CREATE_EPISODE_BOOKMARK}, + {"settingsreset" , ACTION_SETTINGS_RESET}, + {"settingslevelchange", ACTION_SETTINGS_LEVEL_CHANGE}, + + // 3D movie playback/GUI + {"stereomode" , ACTION_STEREOMODE_SELECT}, // cycle 3D modes, for now an alias for next + {"nextstereomode" , ACTION_STEREOMODE_NEXT}, + {"previousstereomode" , ACTION_STEREOMODE_PREVIOUS}, + {"togglestereomode" , ACTION_STEREOMODE_TOGGLE}, + {"stereomodetomono" , ACTION_STEREOMODE_TOMONO}, + + // PVR actions + {"channelup" , ACTION_CHANNEL_UP}, + {"channeldown" , ACTION_CHANNEL_DOWN}, + {"previouschannelgroup" , ACTION_PREVIOUS_CHANNELGROUP}, + {"nextchannelgroup" , ACTION_NEXT_CHANNELGROUP}, + {"playpvr" , ACTION_PVR_PLAY}, + {"playpvrtv" , ACTION_PVR_PLAY_TV}, + {"playpvrradio" , ACTION_PVR_PLAY_RADIO}, + {"record" , ACTION_RECORD}, + + // Mouse actions + {"leftclick" , ACTION_MOUSE_LEFT_CLICK}, + {"rightclick" , ACTION_MOUSE_RIGHT_CLICK}, + {"middleclick" , ACTION_MOUSE_MIDDLE_CLICK}, + {"doubleclick" , ACTION_MOUSE_DOUBLE_CLICK}, + {"longclick" , ACTION_MOUSE_LONG_CLICK}, + {"wheelup" , ACTION_MOUSE_WHEEL_UP}, + {"wheeldown" , ACTION_MOUSE_WHEEL_DOWN}, + {"mousedrag" , ACTION_MOUSE_DRAG}, + {"mousemove" , ACTION_MOUSE_MOVE}, + + // Touch + {"tap" , ACTION_TOUCH_TAP}, + {"longpress" , ACTION_TOUCH_LONGPRESS}, + {"pangesture" , ACTION_GESTURE_PAN}, + {"zoomgesture" , ACTION_GESTURE_ZOOM}, + {"rotategesture" , ACTION_GESTURE_ROTATE}, + {"swipeleft" , ACTION_GESTURE_SWIPE_LEFT}, + {"swiperight" , ACTION_GESTURE_SWIPE_RIGHT}, + {"swipeup" , ACTION_GESTURE_SWIPE_UP}, + {"swipedown" , ACTION_GESTURE_SWIPE_DOWN}, + + // Do nothing / error action + { "error" , ACTION_ERROR}, + { "noop" , ACTION_NOOP} }; static const ActionMapping windows[] = -{ - { "home" , WINDOW_HOME }, - { "programs" , WINDOW_PROGRAMS }, - { "pictures" , WINDOW_PICTURES }, - { "filemanager" , WINDOW_FILES }, - { "files" , WINDOW_FILES }, // backward compat - { "settings" , WINDOW_SETTINGS_MENU }, - { "music" , WINDOW_MUSIC }, - { "video" , WINDOW_VIDEOS }, - { "videos" , WINDOW_VIDEO_NAV }, - { "pvr" , WINDOW_TV_CHANNELS }, // backward compat - { "tvchannels" , WINDOW_TV_CHANNELS }, - { "tvrecordings" , WINDOW_TV_RECORDINGS }, - { "tvguide" , WINDOW_TV_GUIDE }, - { "tvtimers" , WINDOW_TV_TIMERS }, - { "tvsearch" , WINDOW_TV_SEARCH }, - { "radiochannels" , WINDOW_RADIO_CHANNELS }, - { "radiorecordings" , WINDOW_RADIO_RECORDINGS }, - { "radioguide" , WINDOW_RADIO_GUIDE }, - { "radiotimers" , WINDOW_RADIO_TIMERS }, - { "radiosearch" , WINDOW_RADIO_SEARCH }, - { "pvrguideinfo" , WINDOW_DIALOG_PVR_GUIDE_INFO }, - { "pvrrecordinginfo" , WINDOW_DIALOG_PVR_RECORDING_INFO }, - { "pvrradiordsinfo" , WINDOW_DIALOG_PVR_RADIO_RDS_INFO }, - { "pvrtimersetting" , WINDOW_DIALOG_PVR_TIMER_SETTING }, - { "pvrgroupmanager" , WINDOW_DIALOG_PVR_GROUP_MANAGER }, - { "pvrchannelmanager" , WINDOW_DIALOG_PVR_CHANNEL_MANAGER }, - { "pvrguidesearch" , WINDOW_DIALOG_PVR_GUIDE_SEARCH }, - { "pvrchannelscan" , WINDOW_DIALOG_PVR_CHANNEL_SCAN }, - { "pvrupdateprogress" , WINDOW_DIALOG_PVR_UPDATE_PROGRESS }, - { "pvrosdchannels" , WINDOW_DIALOG_PVR_OSD_CHANNELS }, - { "pvrosdguide" , WINDOW_DIALOG_PVR_OSD_GUIDE }, - { "pvrosdteletext" , WINDOW_DIALOG_OSD_TELETEXT }, - { "systeminfo" , WINDOW_SYSTEM_INFORMATION }, - { "testpattern" , WINDOW_TEST_PATTERN }, - { "screencalibration" , WINDOW_SCREEN_CALIBRATION }, - { "guicalibration" , WINDOW_SCREEN_CALIBRATION }, // backward compat - { "picturessettings" , WINDOW_SETTINGS_MYPICTURES }, - { "programssettings" , WINDOW_SETTINGS_MYPROGRAMS }, - { "weathersettings" , WINDOW_SETTINGS_MYWEATHER }, - { "musicsettings" , WINDOW_SETTINGS_MYMUSIC }, - { "systemsettings" , WINDOW_SETTINGS_SYSTEM }, - { "videossettings" , WINDOW_SETTINGS_MYVIDEOS }, - { "networksettings" , WINDOW_SETTINGS_SERVICE }, // backward compat - { "servicesettings" , WINDOW_SETTINGS_SERVICE }, - { "appearancesettings" , WINDOW_SETTINGS_APPEARANCE }, - { "pvrsettings" , WINDOW_SETTINGS_MYPVR }, - { "tvsettings" , WINDOW_SETTINGS_MYPVR }, // backward compat - { "scripts" , WINDOW_PROGRAMS }, // backward compat - { "videofiles" , WINDOW_VIDEO_FILES }, - { "videolibrary" , WINDOW_VIDEO_NAV }, - { "videoplaylist" , WINDOW_VIDEO_PLAYLIST }, - { "loginscreen" , WINDOW_LOGIN_SCREEN }, - { "profiles" , WINDOW_SETTINGS_PROFILES }, - { "skinsettings" , WINDOW_SKIN_SETTINGS }, - { "addonbrowser" , WINDOW_ADDON_BROWSER }, - { "yesnodialog" , WINDOW_DIALOG_YES_NO }, - { "progressdialog" , WINDOW_DIALOG_PROGRESS }, - { "virtualkeyboard" , WINDOW_DIALOG_KEYBOARD }, - { "volumebar" , WINDOW_DIALOG_VOLUME_BAR }, - { "submenu" , WINDOW_DIALOG_SUB_MENU }, - { "favourites" , WINDOW_DIALOG_FAVOURITES }, - { "contextmenu" , WINDOW_DIALOG_CONTEXT_MENU }, - { "infodialog" , WINDOW_DIALOG_KAI_TOAST }, - { "numericinput" , WINDOW_DIALOG_NUMERIC }, - { "gamepadinput" , WINDOW_DIALOG_GAMEPAD }, - { "shutdownmenu" , WINDOW_DIALOG_BUTTON_MENU }, - { "mutebug" , WINDOW_DIALOG_MUTE_BUG }, - { "playercontrols" , WINDOW_DIALOG_PLAYER_CONTROLS }, - { "seekbar" , WINDOW_DIALOG_SEEK_BAR }, - { "musicosd" , WINDOW_DIALOG_MUSIC_OSD }, - { "addonsettings" , WINDOW_DIALOG_ADDON_SETTINGS }, - { "visualisationsettings" , WINDOW_DIALOG_ADDON_SETTINGS }, // backward compat - { "visualisationpresetlist" , WINDOW_DIALOG_VIS_PRESET_LIST }, - { "osdvideosettings" , WINDOW_DIALOG_VIDEO_OSD_SETTINGS }, - { "osdaudiosettings" , WINDOW_DIALOG_AUDIO_OSD_SETTINGS }, - { "audiodspmanager" , WINDOW_DIALOG_AUDIO_DSP_MANAGER }, - { "osdaudiodspsettings" , WINDOW_DIALOG_AUDIO_DSP_OSD_SETTINGS }, - { "videobookmarks" , WINDOW_DIALOG_VIDEO_BOOKMARKS }, - { "filebrowser" , WINDOW_DIALOG_FILE_BROWSER }, - { "networksetup" , WINDOW_DIALOG_NETWORK_SETUP }, - { "mediasource" , WINDOW_DIALOG_MEDIA_SOURCE }, - { "profilesettings" , WINDOW_DIALOG_PROFILE_SETTINGS }, - { "locksettings" , WINDOW_DIALOG_LOCK_SETTINGS }, - { "contentsettings" , WINDOW_DIALOG_CONTENT_SETTINGS }, - { "songinformation" , WINDOW_DIALOG_SONG_INFO }, - { "smartplaylisteditor" , WINDOW_DIALOG_SMART_PLAYLIST_EDITOR }, - { "smartplaylistrule" , WINDOW_DIALOG_SMART_PLAYLIST_RULE }, - { "busydialog" , WINDOW_DIALOG_BUSY }, - { "pictureinfo" , WINDOW_DIALOG_PICTURE_INFO }, - { "accesspoints" , WINDOW_DIALOG_ACCESS_POINTS }, - { "fullscreeninfo" , WINDOW_DIALOG_FULLSCREEN_INFO }, - { "sliderdialog" , WINDOW_DIALOG_SLIDER }, - { "addoninformation" , WINDOW_DIALOG_ADDON_INFO }, - { "subtitlesearch" , WINDOW_DIALOG_SUBTITLES }, - { "musicplaylist" , WINDOW_MUSIC_PLAYLIST }, - { "musicfiles" , WINDOW_MUSIC_FILES }, - { "musiclibrary" , WINDOW_MUSIC_NAV }, - { "musicplaylisteditor" , WINDOW_MUSIC_PLAYLIST_EDITOR }, - { "teletext" , WINDOW_DIALOG_OSD_TELETEXT }, - { "selectdialog" , WINDOW_DIALOG_SELECT }, - { "musicinformation" , WINDOW_DIALOG_MUSIC_INFO }, - { "okdialog" , WINDOW_DIALOG_OK }, - { "movieinformation" , WINDOW_DIALOG_VIDEO_INFO }, - { "textviewer" , WINDOW_DIALOG_TEXT_VIEWER }, - { "fullscreenvideo" , WINDOW_FULLSCREEN_VIDEO }, - { "fullscreenlivetv" , WINDOW_FULLSCREEN_LIVETV }, // virtual window/keymap section for PVR specific bindings in fullscreen playback (which internally uses WINDOW_FULLSCREEN_VIDEO) - { "fullscreenradio" , WINDOW_FULLSCREEN_RADIO }, // virtual window for fullscreen radio, uses WINDOW_VISUALISATION as fallback - { "visualisation" , WINDOW_VISUALISATION }, - { "slideshow" , WINDOW_SLIDESHOW }, - { "weather" , WINDOW_WEATHER }, - { "screensaver" , WINDOW_SCREENSAVER }, - { "videoosd" , WINDOW_DIALOG_VIDEO_OSD }, - { "videomenu" , WINDOW_VIDEO_MENU }, - { "videotimeseek" , WINDOW_VIDEO_TIME_SEEK }, - { "startwindow" , WINDOW_START }, - { "startup" , WINDOW_STARTUP_ANIM }, - { "peripheralsettings" , WINDOW_DIALOG_PERIPHERAL_SETTINGS }, - { "extendedprogressdialog" , WINDOW_DIALOG_EXT_PROGRESS }, - { "mediafilter" , WINDOW_DIALOG_MEDIA_FILTER }, - { "addon" , WINDOW_ADDON_START }, - { "eventlog" , WINDOW_EVENT_LOG} -}; + {{"home" , WINDOW_HOME}, + {"programs" , WINDOW_PROGRAMS}, + {"pictures" , WINDOW_PICTURES}, + {"filemanager" , WINDOW_FILES}, + {"files" , WINDOW_FILES}, // backward compat + {"settings" , WINDOW_SETTINGS_MENU}, + {"music" , WINDOW_MUSIC}, + {"video" , WINDOW_VIDEOS}, + {"videos" , WINDOW_VIDEO_NAV}, + {"pvr" , WINDOW_TV_CHANNELS}, // backward compat + {"tvchannels" , WINDOW_TV_CHANNELS}, + {"tvrecordings" , WINDOW_TV_RECORDINGS}, + {"tvguide" , WINDOW_TV_GUIDE}, + {"tvtimers" , WINDOW_TV_TIMERS}, + {"tvsearch" , WINDOW_TV_SEARCH}, + {"radiochannels" , WINDOW_RADIO_CHANNELS}, + {"radiorecordings" , WINDOW_RADIO_RECORDINGS}, + {"radioguide" , WINDOW_RADIO_GUIDE}, + {"radiotimers" , WINDOW_RADIO_TIMERS}, + {"radiosearch" , WINDOW_RADIO_SEARCH}, + {"pvrguideinfo" , WINDOW_DIALOG_PVR_GUIDE_INFO}, + {"pvrrecordinginfo" , WINDOW_DIALOG_PVR_RECORDING_INFO}, + {"pvrtimersetting" , WINDOW_DIALOG_PVR_TIMER_SETTING}, + {"pvrgroupmanager" , WINDOW_DIALOG_PVR_GROUP_MANAGER}, + {"pvrchannelmanager" , WINDOW_DIALOG_PVR_CHANNEL_MANAGER}, + {"pvrguidesearch" , WINDOW_DIALOG_PVR_GUIDE_SEARCH}, + {"pvrchannelscan" , WINDOW_DIALOG_PVR_CHANNEL_SCAN}, + {"pvrupdateprogress" , WINDOW_DIALOG_PVR_UPDATE_PROGRESS}, + {"pvrosdchannels" , WINDOW_DIALOG_PVR_OSD_CHANNELS}, + {"pvrosdguide" , WINDOW_DIALOG_PVR_OSD_GUIDE}, + {"pvrosdteletext" , WINDOW_DIALOG_OSD_TELETEXT}, + {"systeminfo" , WINDOW_SYSTEM_INFORMATION}, + {"testpattern" , WINDOW_TEST_PATTERN}, + {"screencalibration" , WINDOW_SCREEN_CALIBRATION}, + {"guicalibration" , WINDOW_SCREEN_CALIBRATION}, // backward compat + {"picturessettings" , WINDOW_SETTINGS_MYPICTURES}, + {"programssettings" , WINDOW_SETTINGS_MYPROGRAMS}, + {"weathersettings" , WINDOW_SETTINGS_MYWEATHER}, + {"musicsettings" , WINDOW_SETTINGS_MYMUSIC}, + {"systemsettings" , WINDOW_SETTINGS_SYSTEM}, + {"videossettings" , WINDOW_SETTINGS_MYVIDEOS}, + {"networksettings" , WINDOW_SETTINGS_SERVICE}, // backward compat + {"servicesettings" , WINDOW_SETTINGS_SERVICE}, + {"appearancesettings" , WINDOW_SETTINGS_APPEARANCE}, + {"pvrsettings" , WINDOW_SETTINGS_MYPVR}, + {"tvsettings" , WINDOW_SETTINGS_MYPVR}, // backward compat + {"scripts" , WINDOW_PROGRAMS}, // backward compat + {"videofiles" , WINDOW_VIDEO_FILES}, + {"videolibrary" , WINDOW_VIDEO_NAV}, + {"videoplaylist" , WINDOW_VIDEO_PLAYLIST}, + {"loginscreen" , WINDOW_LOGIN_SCREEN}, + {"profiles" , WINDOW_SETTINGS_PROFILES}, + {"skinsettings" , WINDOW_SKIN_SETTINGS}, + {"addonbrowser" , WINDOW_ADDON_BROWSER}, + {"yesnodialog" , WINDOW_DIALOG_YES_NO}, + {"progressdialog" , WINDOW_DIALOG_PROGRESS}, + {"virtualkeyboard" , WINDOW_DIALOG_KEYBOARD}, + {"volumebar" , WINDOW_DIALOG_VOLUME_BAR}, + {"submenu" , WINDOW_DIALOG_SUB_MENU}, + {"favourites" , WINDOW_DIALOG_FAVOURITES}, + {"contextmenu" , WINDOW_DIALOG_CONTEXT_MENU}, + {"infodialog" , WINDOW_DIALOG_KAI_TOAST}, + {"numericinput" , WINDOW_DIALOG_NUMERIC}, + {"gamepadinput" , WINDOW_DIALOG_GAMEPAD}, + {"shutdownmenu" , WINDOW_DIALOG_BUTTON_MENU}, + {"mutebug" , WINDOW_DIALOG_MUTE_BUG}, + {"playercontrols" , WINDOW_DIALOG_PLAYER_CONTROLS}, + {"seekbar" , WINDOW_DIALOG_SEEK_BAR}, + {"musicosd" , WINDOW_DIALOG_MUSIC_OSD}, + {"addonsettings" , WINDOW_DIALOG_ADDON_SETTINGS}, + {"visualisationsettings" , WINDOW_DIALOG_ADDON_SETTINGS}, // backward compat + {"visualisationpresetlist" , WINDOW_DIALOG_VIS_PRESET_LIST}, + {"osdvideosettings" , WINDOW_DIALOG_VIDEO_OSD_SETTINGS}, + {"osdaudiosettings" , WINDOW_DIALOG_AUDIO_OSD_SETTINGS}, + {"videobookmarks" , WINDOW_DIALOG_VIDEO_BOOKMARKS}, + {"filebrowser" , WINDOW_DIALOG_FILE_BROWSER}, + {"networksetup" , WINDOW_DIALOG_NETWORK_SETUP}, + {"mediasource" , WINDOW_DIALOG_MEDIA_SOURCE}, + {"profilesettings" , WINDOW_DIALOG_PROFILE_SETTINGS}, + {"locksettings" , WINDOW_DIALOG_LOCK_SETTINGS}, + {"contentsettings" , WINDOW_DIALOG_CONTENT_SETTINGS}, + {"songinformation" , WINDOW_DIALOG_SONG_INFO}, + {"smartplaylisteditor" , WINDOW_DIALOG_SMART_PLAYLIST_EDITOR}, + {"smartplaylistrule" , WINDOW_DIALOG_SMART_PLAYLIST_RULE}, + {"busydialog" , WINDOW_DIALOG_BUSY}, + {"pictureinfo" , WINDOW_DIALOG_PICTURE_INFO}, + {"accesspoints" , WINDOW_DIALOG_ACCESS_POINTS}, + {"fullscreeninfo" , WINDOW_DIALOG_FULLSCREEN_INFO}, + {"karaokeselector" , WINDOW_DIALOG_KARAOKE_SONGSELECT}, + {"karaokelargeselector" , WINDOW_DIALOG_KARAOKE_SELECTOR}, + {"sliderdialog" , WINDOW_DIALOG_SLIDER}, + {"addoninformation" , WINDOW_DIALOG_ADDON_INFO}, + {"subtitlesearch" , WINDOW_DIALOG_SUBTITLES}, + {"musicplaylist" , WINDOW_MUSIC_PLAYLIST}, + {"musicfiles" , WINDOW_MUSIC_FILES}, + {"musiclibrary" , WINDOW_MUSIC_NAV}, + {"musicplaylisteditor" , WINDOW_MUSIC_PLAYLIST_EDITOR}, + {"teletext" , WINDOW_DIALOG_OSD_TELETEXT}, + {"selectdialog" , WINDOW_DIALOG_SELECT}, + {"musicinformation" , WINDOW_DIALOG_MUSIC_INFO}, + {"okdialog" , WINDOW_DIALOG_OK}, + {"movieinformation" , WINDOW_DIALOG_VIDEO_INFO}, + {"textviewer" , WINDOW_DIALOG_TEXT_VIEWER}, + {"fullscreenvideo" , WINDOW_FULLSCREEN_VIDEO}, + {"fullscreenlivetv" , WINDOW_FULLSCREEN_LIVETV}, // virtual window/keymap section for PVR specific bindings in fullscreen playback (which internally uses WINDOW_FULLSCREEN_VIDEO) + {"fullscreenradio" , WINDOW_FULLSCREEN_RADIO}, // virtual window for fullscreen radio, uses WINDOW_VISUALISATION as fallback + {"visualisation" , WINDOW_VISUALISATION}, + {"slideshow" , WINDOW_SLIDESHOW}, + {"filestackingdialog" , WINDOW_DIALOG_FILESTACKING}, + {"karaoke" , WINDOW_KARAOKELYRICS}, + {"weather" , WINDOW_WEATHER}, + {"screensaver" , WINDOW_SCREENSAVER}, + {"videoosd" , WINDOW_DIALOG_VIDEO_OSD}, + {"videomenu" , WINDOW_VIDEO_MENU}, + {"videotimeseek" , WINDOW_VIDEO_TIME_SEEK}, + {"musicoverlay" , WINDOW_DIALOG_MUSIC_OVERLAY}, + {"videooverlay" , WINDOW_DIALOG_VIDEO_OVERLAY}, + {"startwindow" , WINDOW_START}, + {"startup" , WINDOW_STARTUP_ANIM}, + {"peripherals" , WINDOW_DIALOG_PERIPHERAL_MANAGER}, + {"peripheralsettings" , WINDOW_DIALOG_PERIPHERAL_SETTINGS}, + {"extendedprogressdialog" , WINDOW_DIALOG_EXT_PROGRESS}, + {"mediafilter" , WINDOW_DIALOG_MEDIA_FILTER}, + {"addon" , WINDOW_ADDON_START}}; static const ActionMapping mousekeys[] = { - { "click" , KEY_MOUSE_CLICK }, - { "leftclick" , KEY_MOUSE_CLICK }, - { "rightclick" , KEY_MOUSE_RIGHTCLICK }, - { "middleclick" , KEY_MOUSE_MIDDLECLICK }, - { "doubleclick" , KEY_MOUSE_DOUBLE_CLICK }, - { "longclick" , KEY_MOUSE_LONG_CLICK }, - { "wheelup" , KEY_MOUSE_WHEEL_UP }, - { "wheeldown" , KEY_MOUSE_WHEEL_DOWN }, - { "mousemove" , KEY_MOUSE_MOVE }, - { "mousedrag" , KEY_MOUSE_DRAG }, - { "mousedragstart" , KEY_MOUSE_DRAG_START }, - { "mousedragend" , KEY_MOUSE_DRAG_END }, - { "mouserdrag" , KEY_MOUSE_RDRAG }, - { "mouserdragstart" , KEY_MOUSE_RDRAG_START }, - { "mouserdragend" , KEY_MOUSE_RDRAG_END } + { "click", KEY_MOUSE_CLICK }, + { "leftclick", KEY_MOUSE_CLICK }, + { "rightclick", KEY_MOUSE_RIGHTCLICK }, + { "middleclick", KEY_MOUSE_MIDDLECLICK }, + { "doubleclick", KEY_MOUSE_DOUBLE_CLICK }, + { "longclick", KEY_MOUSE_LONG_CLICK }, + { "wheelup", KEY_MOUSE_WHEEL_UP }, + { "wheeldown", KEY_MOUSE_WHEEL_DOWN }, + { "mousemove", KEY_MOUSE_MOVE }, + { "mousedrag", KEY_MOUSE_DRAG }, + { "mousedragstart", KEY_MOUSE_DRAG_START }, + { "mousedragend", KEY_MOUSE_DRAG_END }, + { "mouserdrag", KEY_MOUSE_RDRAG }, + { "mouserdragstart", KEY_MOUSE_RDRAG_START }, + { "mouserdragend", KEY_MOUSE_RDRAG_END } }; static const ActionMapping touchcommands[] = { - { "tap" , ACTION_TOUCH_TAP }, - { "longpress" , ACTION_TOUCH_LONGPRESS }, - { "pan" , ACTION_GESTURE_PAN }, - { "zoom" , ACTION_GESTURE_ZOOM }, - { "rotate" , ACTION_GESTURE_ROTATE }, - { "swipeleft" , ACTION_GESTURE_SWIPE_LEFT }, - { "swiperight" , ACTION_GESTURE_SWIPE_RIGHT }, - { "swipeup" , ACTION_GESTURE_SWIPE_UP }, - { "swipedown" , ACTION_GESTURE_SWIPE_DOWN } + { "tap", ACTION_TOUCH_TAP }, + { "longpress", ACTION_TOUCH_LONGPRESS }, + { "pan", ACTION_GESTURE_PAN }, + { "zoom", ACTION_GESTURE_ZOOM }, + { "rotate", ACTION_GESTURE_ROTATE }, + { "swipeleft", ACTION_GESTURE_SWIPE_LEFT }, + { "swiperight", ACTION_GESTURE_SWIPE_RIGHT }, + { "swipeup", ACTION_GESTURE_SWIPE_UP }, + { "swipedown", ACTION_GESTURE_SWIPE_DOWN } }; static const WindowMapping fallbackWindows[] = { - { WINDOW_FULLSCREEN_LIVETV , WINDOW_FULLSCREEN_VIDEO }, - { WINDOW_FULLSCREEN_RADIO , WINDOW_VISUALISATION } + { WINDOW_FULLSCREEN_LIVETV, WINDOW_FULLSCREEN_VIDEO }, + { WINDOW_FULLSCREEN_RADIO, WINDOW_VISUALISATION } }; #ifdef TARGET_WINDOWS static const ActionMapping appcommands[] = { - { "browser_back" , APPCOMMAND_BROWSER_BACKWARD }, - { "browser_forward" , APPCOMMAND_BROWSER_FORWARD }, - { "browser_refresh" , APPCOMMAND_BROWSER_REFRESH }, - { "browser_stop" , APPCOMMAND_BROWSER_STOP }, - { "browser_search" , APPCOMMAND_BROWSER_SEARCH }, - { "browser_favorites" , APPCOMMAND_BROWSER_FAVORITES }, - { "browser_home" , APPCOMMAND_BROWSER_HOME }, - { "volume_mute" , APPCOMMAND_VOLUME_MUTE }, - { "volume_down" , APPCOMMAND_VOLUME_DOWN }, - { "volume_up" , APPCOMMAND_VOLUME_UP }, - { "next_track" , APPCOMMAND_MEDIA_NEXTTRACK }, - { "prev_track" , APPCOMMAND_MEDIA_PREVIOUSTRACK }, - { "stop" , APPCOMMAND_MEDIA_STOP }, - { "play_pause" , APPCOMMAND_MEDIA_PLAY_PAUSE }, - { "launch_mail" , APPCOMMAND_LAUNCH_MAIL }, - { "launch_media_select" , APPCOMMAND_LAUNCH_MEDIA_SELECT }, - { "launch_app1" , APPCOMMAND_LAUNCH_APP1 }, - { "launch_app2" , APPCOMMAND_LAUNCH_APP2 }, - { "play" , APPCOMMAND_MEDIA_PLAY }, - { "pause" , APPCOMMAND_MEDIA_PAUSE }, - { "fastforward" , APPCOMMAND_MEDIA_FAST_FORWARD }, - { "rewind" , APPCOMMAND_MEDIA_REWIND }, - { "channelup" , APPCOMMAND_MEDIA_CHANNEL_UP }, - { "channeldown" , APPCOMMAND_MEDIA_CHANNEL_DOWN } + { "browser_back", APPCOMMAND_BROWSER_BACKWARD }, + { "browser_forward", APPCOMMAND_BROWSER_FORWARD }, + { "browser_refresh", APPCOMMAND_BROWSER_REFRESH }, + { "browser_stop", APPCOMMAND_BROWSER_STOP }, + { "browser_search", APPCOMMAND_BROWSER_SEARCH }, + { "browser_favorites", APPCOMMAND_BROWSER_FAVORITES }, + { "browser_home", APPCOMMAND_BROWSER_HOME }, + { "volume_mute", APPCOMMAND_VOLUME_MUTE }, + { "volume_down", APPCOMMAND_VOLUME_DOWN }, + { "volume_up", APPCOMMAND_VOLUME_UP }, + { "next_track", APPCOMMAND_MEDIA_NEXTTRACK }, + { "prev_track", APPCOMMAND_MEDIA_PREVIOUSTRACK }, + { "stop", APPCOMMAND_MEDIA_STOP }, + { "play_pause", APPCOMMAND_MEDIA_PLAY_PAUSE }, + { "launch_mail", APPCOMMAND_LAUNCH_MAIL }, + { "launch_media_select", APPCOMMAND_LAUNCH_MEDIA_SELECT }, + { "launch_app1", APPCOMMAND_LAUNCH_APP1 }, + { "launch_app2", APPCOMMAND_LAUNCH_APP2 }, + { "play", APPCOMMAND_MEDIA_PLAY }, + { "pause", APPCOMMAND_MEDIA_PAUSE }, + { "fastforward", APPCOMMAND_MEDIA_FAST_FORWARD }, + { "rewind", APPCOMMAND_MEDIA_REWIND }, + { "channelup", APPCOMMAND_MEDIA_CHANNEL_UP }, + { "channeldown", APPCOMMAND_MEDIA_CHANNEL_DOWN } }; #endif @@ -479,13 +487,13 @@ #if defined(HAS_LIRC) || defined(HAS_IRSERVERSUITE) void CButtonTranslator::ClearLircButtonMapEntries() { - std::vector maps; - for (std::map::iterator it = lircRemotesMap.begin(); + vector maps; + for (map::iterator it = lircRemotesMap.begin(); it != lircRemotesMap.end();++it) maps.push_back(it->second); sort(maps.begin(),maps.end()); - std::vector::iterator itend = unique(maps.begin(),maps.end()); - for (std::vector::iterator it = maps.begin(); it != itend;++it) + vector::iterator itend = unique(maps.begin(),maps.end()); + for (vector::iterator it = maps.begin(); it != itend;++it) delete *it; } #endif @@ -600,7 +608,7 @@ else CLog::Log(LOGDEBUG, "CButtonTranslator::Load - no system %s found, skipping", REMOTEMAP); - lircmapPath = CProfilesManager::GetInstance().GetUserDataItem(REMOTEMAP); + lircmapPath = CProfilesManager::Get().GetUserDataItem(REMOTEMAP); if(CFile::Exists(lircmapPath)) success |= LoadLircMap(lircmapPath); else @@ -712,8 +720,8 @@ void CButtonTranslator::MapRemote(TiXmlNode *pRemote, const char* szDevice) { CLog::Log(LOGINFO, "* Adding remote mapping for device '%s'", szDevice); - std::vector RemoteNames; - std::map::iterator it = lircRemotesMap.find(szDevice); + vector RemoteNames; + map::iterator it = lircRemotesMap.find(szDevice); if (it == lircRemotesMap.end()) lircRemotesMap[szDevice] = new lircButtonMap; lircButtonMap& buttons = *lircRemotesMap[szDevice]; @@ -730,7 +738,7 @@ } pButton = pButton->NextSiblingElement(); } - for (std::vector::iterator it = RemoteNames.begin(); + for (vector::iterator it = RemoteNames.begin(); it != RemoteNames.end();++it) { CLog::Log(LOGINFO, "* Linking remote mapping for '%s' to '%s'", szDevice, it->c_str()); @@ -741,7 +749,7 @@ int CButtonTranslator::TranslateLircRemoteString(const char* szDevice, const char *szButton) { // Find the device - std::map::iterator it = lircRemotesMap.find(szDevice); + map::iterator it = lircRemotesMap.find(szDevice); if (it == lircRemotesMap.end()) return 0; @@ -792,8 +800,8 @@ void CButtonTranslator::MapJoystickActions(int windowID, TiXmlNode *pJoystick) { std::string joyFamilyName; - std::map buttonMap; - std::map axisMap; + map buttonMap; + map axisMap; AxesConfig axesConfig; ActionMap hatMap; @@ -802,7 +810,7 @@ joyFamilyName = pJoy->Attribute("family"); else if (pJoy) { // transform loose name to new family, including altnames - std::string joyName = JOYSTICK_DEFAULT_MAP; // default global map name + string joyName = JOYSTICK_DEFAULT_MAP; // default global map name if (pJoy->Attribute("name")) joyName = pJoy->Attribute("name"); joyFamilyName = joyName; @@ -895,7 +903,7 @@ } else if (type == "hat") { - std::string position; + string position; if (pButton->QueryValueAttribute("position", &position) == TIXML_SUCCESS) { uint32_t hatID = id|0xFFF00000; @@ -1072,7 +1080,7 @@ int CButtonTranslator::GetActionCode(int window, int action) { - std::map::const_iterator it = m_translatorMap.find(window); + map::const_iterator it = m_translatorMap.find(window); if (it == m_translatorMap.end()) return 0; @@ -1094,8 +1102,8 @@ WindowMap::const_iterator it = wmap.find(window); if (it != wmap.end()) { - const std::map &windowbmap = it->second; - std::map::const_iterator it2 = windowbmap.find(id); + const map &windowbmap = it->second; + map::const_iterator it2 = windowbmap.find(id); if (it2 != windowbmap.end()) { strAction = (it2->second).c_str(); @@ -1150,8 +1158,9 @@ if (fallbackWindows[index].origin == windowID) return fallbackWindows[index].target; } - // for addon windows use WINDOW_ADDON_START because id is dynamic - if (windowID > WINDOW_ADDON_START && windowID <= WINDOW_ADDON_END) + // for addon windows use WINDOW_ADDON_START + // because id is dynamic + if (windowID >= WINDOW_ADDON_START && windowID <= WINDOW_ADDON_END) return WINDOW_ADDON_START; return -1; @@ -1177,64 +1186,15 @@ return action; } -CAction CButtonTranslator::GetGlobalAction(const CKey &key) -{ - return GetAction(-1, key, true); -} - -bool CButtonTranslator::HasLonpressMapping(int window, const CKey &key) -{ - std::map::const_iterator it = m_translatorMap.find(window); - if (it != m_translatorMap.end()) - { - uint32_t code = key.GetButtonCode(); - code |= CKey::MODIFIER_LONG; - buttonMap::const_iterator it2 = (*it).second.find(code); - - if (it2 != (*it).second.end()) - return true; - -#ifdef TARGET_POSIX - // Some buttoncodes changed in Hardy - if ((code & KEY_VKEY) == KEY_VKEY && (code & 0x0F00)) - { - code &= ~0x0F00; - it2 = (*it).second.find(code); - if (it2 != (*it).second.end()) - return true; - } -#endif - } - - // no key mapping found for the current window do the fallback handling - if (window > -1) - { - // first check if we have a fallback for the window - int fallbackWindow = GetFallbackWindow(window); - if (fallbackWindow > -1 && HasLonpressMapping(fallbackWindow, key)) - return true; - - // fallback to default section - return HasLonpressMapping(-1, key); - } - - return false; -} - int CButtonTranslator::GetActionCode(int window, const CKey &key, std::string &strAction) const { uint32_t code = key.GetButtonCode(); - std::map::const_iterator it = m_translatorMap.find(window); + map::const_iterator it = m_translatorMap.find(window); if (it == m_translatorMap.end()) return 0; buttonMap::const_iterator it2 = (*it).second.find(code); int action = 0; - if (it2 == (*it).second.end() && code & CKey::MODIFIER_LONG) // If long action not found, try short one - { - code &= ~CKey::MODIFIER_LONG; - it2 = (*it).second.find(code); - } if (it2 != (*it).second.end()) { action = (*it2).second.id; @@ -1275,7 +1235,7 @@ CButtonAction button; button.id = action; button.strID = szAction; - map.insert(std::pair(buttonCode, button)); + map.insert(pair(buttonCode, button)); } } @@ -1325,26 +1285,14 @@ else if (type == "appcommand") buttonCode = TranslateAppCommand(pButton->Value()); - if (buttonCode) - { - if (pButton->FirstChild() && pButton->FirstChild()->Value()[0]) - MapAction(buttonCode, pButton->FirstChild()->Value(), map); - else - { - buttonMap::iterator it = map.find(buttonCode); - while (it != map.end()) - { - map.erase(it); - it = map.find(buttonCode); - } - } - } + if (buttonCode && pButton->FirstChild()) + MapAction(buttonCode, pButton->FirstChild()->Value(), map); pButton = pButton->NextSiblingElement(); } // add our map to our table if (!map.empty()) - m_translatorMap.insert(std::pair( windowID, map)); + m_translatorMap.insert(pair( windowID, map)); } } @@ -1376,7 +1324,7 @@ action = ACTION_NONE; std::string strAction = szAction; StringUtils::ToLower(strAction); - if (CBuiltins::GetInstance().HasCommand(strAction)) + if (CBuiltins::HasCommand(strAction)) action = ACTION_BUILT_IN_FUNCTION; for (unsigned int index=0;index < ARRAY_SIZE(actions);++index) @@ -1466,7 +1414,7 @@ else if (strButton == "leftthumbstickright") buttonCode = KEY_BUTTON_LEFT_THUMB_STICK_RIGHT; else if (strButton == "rightthumbstick") buttonCode = KEY_BUTTON_RIGHT_THUMB_STICK; else if (strButton == "rightthumbstickup") buttonCode = KEY_BUTTON_RIGHT_THUMB_STICK_UP; - else if (strButton == "rightthumbstickdown") buttonCode = KEY_BUTTON_RIGHT_THUMB_STICK_DOWN; + else if (strButton =="rightthumbstickdown") buttonCode = KEY_BUTTON_RIGHT_THUMB_STICK_DOWN; else if (strButton == "rightthumbstickleft") buttonCode = KEY_BUTTON_RIGHT_THUMB_STICK_LEFT; else if (strButton == "rightthumbstickright") buttonCode = KEY_BUTTON_RIGHT_THUMB_STICK_RIGHT; else if (strButton == "lefttrigger") buttonCode = KEY_BUTTON_LEFT_TRIGGER; @@ -1489,8 +1437,8 @@ std::string strButton = szButton; StringUtils::ToLower(strButton); if (strButton == "left") buttonCode = XINPUT_IR_REMOTE_LEFT; - else if (strButton == "right") buttonCode = XINPUT_IR_REMOTE_RIGHT; - else if (strButton == "up") buttonCode = XINPUT_IR_REMOTE_UP; + else if (strButton =="right") buttonCode = XINPUT_IR_REMOTE_RIGHT; + else if (strButton =="up") buttonCode = XINPUT_IR_REMOTE_UP; else if (strButton == "down") buttonCode = XINPUT_IR_REMOTE_DOWN; else if (strButton == "select") buttonCode = XINPUT_IR_REMOTE_SELECT; else if (strButton == "back") buttonCode = XINPUT_IR_REMOTE_BACK; @@ -1625,10 +1573,10 @@ { StringUtils::ToLower(strMod); - std::vector modArray = StringUtils::Split(strMod, ","); - for (std::vector::const_iterator i = modArray.begin(); i != modArray.end(); ++i) + vector modArray = StringUtils::Split(strMod, ","); + for (vector::const_iterator i = modArray.begin(); i != modArray.end(); ++i) { - std::string substr = *i; + string substr = *i; StringUtils::Trim(substr); if (substr == "ctrl" || substr == "control") @@ -1641,8 +1589,6 @@ button_id |= CKey::MODIFIER_SUPER; else if (substr == "meta" || substr == "cmd") button_id |= CKey::MODIFIER_META; - else if (substr == "longpress") - button_id |= CKey::MODIFIER_LONG; else CLog::Log(LOGERROR, "Keyboard Translator: Unknown key modifier %s in %s", substr.c_str(), strMod.c_str()); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/ButtonTranslator.h kodi-15.2~git20151019.1039-final/xbmc/input/ButtonTranslator.h --- kodi-16.1~git20160425.1001-final/xbmc/input/ButtonTranslator.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/ButtonTranslator.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see + * along with XBMC; see the file COPYING. If not, see * . * */ @@ -56,7 +56,7 @@ #endif private: - //private construction, and no assignments; use the provided singleton methods + //private construction, and no assignements; use the provided singleton methods CButtonTranslator(); CButtonTranslator(const CButtonTranslator&); CButtonTranslator const& operator=(CButtonTranslator const&); @@ -78,27 +78,8 @@ static void GetActions(std::vector &actionList); static void GetWindows(std::vector &windowList); - /*! \brief Finds out if a longpress mapping exists for this key - \param window id of the current window - \param key to search a mapping for - \return true if a longpress mapping exists - */ - bool HasLonpressMapping(int window, const CKey &key); - - /*! \brief Obtain the action configured for a given window and key - \param window the window id - \param key the key to query the action for - \param fallback if no action is directly configured for the given window, obtain the action from fallback window, if exists or from global config as last resort - \return the action matching the key - */ CAction GetAction(int window, const CKey &key, bool fallback = true); - /*! \brief Obtain the global action configured for a given key - \param key the key to query the action for - \return the global action - */ - CAction GetGlobalAction(const CKey &key); - /*! \brief Translate between a window name and it's id \param window name of the window \return id of the window, or WINDOW_INVALID if not found @@ -176,9 +157,9 @@ JoystickMap::const_iterator FindWindowMap(const std::string& joyName, const JoystickMap &maps) const; JoystickFamilyMap::const_iterator FindJoystickFamily(const std::string& joyName) const; JoystickFamilyMap m_joystickFamilies; - JoystickMap m_joystickButtonMap; // - JoystickMap m_joystickAxisMap; // - JoystickMap m_joystickHatMap; // + JoystickMap m_joystickButtonMap; // + JoystickMap m_joystickAxisMap; // + JoystickMap m_joystickHatMap; // std::map m_joystickAxesConfigs; // #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InertialScrollingHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/input/InertialScrollingHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/InertialScrollingHandler.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InertialScrollingHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -93,16 +93,8 @@ //ask if the control wants inertial scrolling if(g_windowManager.SendMessage(message)) { - int result = 0; - if (message.GetPointer()) - { - int *p = static_cast(message.GetPointer()); - message.SetPointer(nullptr); - result = *p; - delete p; - } - if( result == EVENT_RESULT_PAN_HORIZONTAL || - result == EVENT_RESULT_PAN_VERTICAL) + if( message.GetParam1() == EVENT_RESULT_PAN_HORIZONTAL || + message.GetParam1() == EVENT_RESULT_PAN_VERTICAL) { inertialRequested = true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableBaiduPY.cpp kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableBaiduPY.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableBaiduPY.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableBaiduPY.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,165 +0,0 @@ -/* -* Copyright (C) 2005-2013 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include "InputCodingTableBaiduPY.h" - -#include -#include - -#include "filesystem/CurlFile.h" -#include "utils/StringUtils.h" -#include "utils/RegExp.h" -#include "guilib/GUIMessage.h" -#include "guilib/GUIWindowManager.h" - -CInputCodingTableBaiduPY::CInputCodingTableBaiduPY(const std::string& strUrl) : - CThread("BaiduPYApi"), - m_messageCounter{ 0 }, - m_api_begin{ 0 }, - m_api_end{ 20 }, - m_api_nomore{ false }, - m_initialized{ false } -{ - m_url = strUrl; - m_codechars = "abcdefghijklmnopqrstuvwxyz"; - m_code = ""; -} - -void CInputCodingTableBaiduPY::Process() -{ - m_initialized = true; - while (!m_bStop) //Make sure we don't exit the thread - { - AbortableWait(m_Event, -1); //Wait for work to appear - while (!m_bStop) //Process all queued work before going back to wait on the event - { - CSingleLock lock(m_CS); - if (m_work.empty()) - break; - - auto work = m_work.front(); - m_work.pop_front(); - lock.Leave(); - - std::string data; - XFILE::CCurlFile http; - std::string strUrl; - strUrl = StringUtils::Format(m_url.c_str(), work.c_str(), m_api_begin, m_api_end); - - if (http.Get(strUrl, data)) - HandleResponse(work, data); - } - } -} - -void CInputCodingTableBaiduPY::HandleResponse(const std::string& strCode, const std::string& response) -{ - if (strCode != m_code) // don't handle obsolete response - return; - - std::vector words; - CRegExp reg; - reg.RegComp("\\[\"(.+?)\",[^\\]]+\\]"); - int pos = 0; - int num = 0; - while ((pos = reg.RegFind(response.c_str(), pos)) >= 0) - { - num++; - std::string full = reg.GetMatch(0); - std::string word = reg.GetMatch(1); - pos += full.length(); - words.push_back(UnicodeToWString(word)); - } - if (words.size() < 20) - m_api_nomore = true; - else - { - m_api_begin += 20; - m_api_end += 20; - } - CSingleLock lock(m_CS); - m_responses.insert(std::make_pair(++m_messageCounter, words)); - CGUIMessage msg(GUI_MSG_CODINGTABLE_LOOKUP_COMPLETED, 0, 0, m_messageCounter); - msg.SetStringParam(strCode); - lock.Leave(); - g_windowManager.SendThreadMessage(msg, g_windowManager.GetActiveWindowID()); -} - -std::wstring CInputCodingTableBaiduPY::UnicodeToWString(const std::string& unicode) -{ - std::wstring result = L""; - for (unsigned int i = 0; i < unicode.length(); i += 6) - { - int c; - sscanf(unicode.c_str() + i, "\\u%x", &c); - result += (wchar_t)c; - } - return result; -} - -std::vector CInputCodingTableBaiduPY::GetResponse(int response) -{ - CSingleLock lock(m_CS); - auto words = m_responses.at(response); - m_responses.erase(response); - return words; -} - -void CInputCodingTableBaiduPY::Initialize() -{ - CSingleLock lock(m_CS); - if (!IsRunning()) - Create(); -} - -void CInputCodingTableBaiduPY::Deinitialize() -{ - m_Event.Set(); - StopThread(true); - m_initialized = false; -} - -bool CInputCodingTableBaiduPY::IsInitialized() const -{ - return m_initialized; -} - -bool CInputCodingTableBaiduPY::GetWordListPage(const std::string& strCode, bool isFirstPage) -{ - if (strCode.empty()) - return false; - if (isFirstPage || m_code != strCode) - { - m_api_begin = 0; - m_api_end = 20; - m_code = strCode; - m_api_nomore = false; - } - else - { - if (m_api_nomore) - return false; - } - - CSingleLock lock(m_CS); - m_work.push_back(strCode); - m_Event.Set(); - return true; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableBaiduPY.h kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableBaiduPY.h --- kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableBaiduPY.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableBaiduPY.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -#pragma once - -/* -* Copyright (C) 2005-2013 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include -#include -#include "InputCodingTable.h" -#include "threads/Thread.h" - -class CInputCodingTableBaiduPY : public IInputCodingTable, public CThread -{ -public: - CInputCodingTableBaiduPY(const std::string& strUrl); - virtual ~CInputCodingTableBaiduPY() {} - - virtual void Initialize() override; - virtual void Deinitialize() override; - virtual bool IsInitialized() const override; - virtual bool GetWordListPage(const std::string& strCode, bool isFirstPage) override; - virtual void Process() override; - - virtual std::vector GetResponse(int response) override; -private: - std::wstring UnicodeToWString(const std::string& unicode); - void HandleResponse(const std::string& strCode, const std::string& response); - - std::string m_url; - std::string m_code; - int m_messageCounter; - int m_api_begin; // baidu api begin num - int m_api_end; // baidu api end num - bool m_api_nomore; - bool m_initialized; - - std::deque m_work; - std::map> m_responses; - CEvent m_Event; - CCriticalSection m_CS; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableBasePY.cpp kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableBasePY.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableBasePY.cpp 2016-01-11 16:50:51.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableBasePY.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,467 +0,0 @@ -/* -* Copyright (C) 2005-2013 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include -#include "InputCodingTableBasePY.h" -#include "utils/CharsetConverter.h" -#include "guilib/GUIMessage.h" -#include "guilib/GUIWindowManager.h" - -static std::map codemap = -{ - { "a", L"啊阿吖嗄腌锕" }, - { "ai", L"爱矮挨哎碍癌艾唉哀蔼隘埃皑嗌嫒瑷暧捱砹嗳锿霭" }, - { "an", L"按安暗岸俺案鞍氨胺庵揞犴铵桉谙鹌埯黯" }, - { "ang", L"昂肮盎" }, - { "ao", L"袄凹傲奥熬懊敖翱澳拗媪廒骜嗷坳遨聱螯獒鏊鳌鏖岙" }, - { "ba", L"把八吧爸拔罢跋巴芭扒坝霸叭靶笆疤耙捌粑茇岜鲅钯魃菝灞" }, - { "bai", L"百白摆败柏拜佰伯稗捭掰" }, - { "ban", L"半办班般拌搬版斑板伴扳扮瓣颁绊癍坂钣舨阪瘢" }, - { "bang", L"帮棒绑磅镑邦榜蚌傍梆膀谤浜蒡" }, - { "bao", L"包抱报饱保暴薄宝爆剥豹刨雹褒堡苞胞鲍炮龅孢煲褓鸨趵葆勹" }, - { "bei", L"被北倍杯背悲备碑卑贝辈钡焙狈惫臂褙悖蓓鹎鐾呗邶鞴孛陂碚埤萆" }, - { "ben", L"本奔苯笨锛贲畚坌" }, - { "beng", L"蹦绷甭崩迸蚌泵甏嘣堋" }, - { "bi", L"比笔闭鼻碧必避逼毕臂彼鄙壁蓖币弊辟蔽毙庇敝陛毖痹秘泌秕薜荸芘萆匕裨畀俾嬖狴筚箅篦舭荜襞庳铋跸吡愎贲滗濞璧哔髀弼妣婢埤" }, - { "bian", L"边变便遍编辩扁贬鞭卞辨辫忭砭匾汴碥蝙褊鳊笾苄窆弁缏煸" }, - { "biao", L"表标彪膘杓婊飑飙鳔瘭飚镳裱骠镖灬髟" }, - { "bie", L"别憋鳖瘪蹩" }, - { "bin", L"宾濒摈彬斌滨豳膑殡缤髌傧槟鬓镔玢" }, - { "bing", L"并病兵冰丙饼屏秉柄炳摒槟禀邴冫" }, - { "bo", L"拨波播泊博伯驳玻剥薄勃菠钵搏脖帛柏舶渤铂箔膊卜礴跛檗亳鹁踣啵蕃簸钹饽擘孛百趵" }, - { "bu", L"不步补布部捕卜簿哺堡埠怖埔瓿逋晡钸钚醭卟" }, - { "ca", L"擦礤嚓" }, - { "cai", L"才菜采材财裁猜踩睬蔡彩" }, - { "can", L"蚕残掺参惨惭餐灿骖璨孱黪粲" }, - { "cang", L"藏仓沧舱苍伧" }, - { "cao", L"草操曹槽糙嘈艚螬漕艹" }, - { "ce", L"册侧策测厕恻" }, - { "cen", L"参岑涔" }, - { "ceng", L"曾层蹭噌" }, - { "cha", L"查插叉茶差岔搽察茬碴刹诧楂槎镲衩汊馇檫姹杈锸嚓猹" }, - { "chai", L"柴拆差豺钗瘥虿侪龇" }, - { "chan", L"产缠掺搀阐颤铲谗蝉单馋觇婵蒇谄冁廛孱蟾羼镡忏潺禅躔澶" }, - { "chang", L"长唱常场厂尝肠畅昌敞倡偿猖鲳氅菖惝嫦徜鬯阊怅伥昶苌娼" }, - { "chao", L"朝抄超吵潮巢炒嘲剿绰钞怊耖晁" }, - { "che", L"车撤扯掣彻澈坼砗屮" }, - { "chen", L"趁称辰臣尘晨沉陈衬忱郴榇抻谌碜谶宸龀嗔琛" }, - { "cheng", L"成乘盛撑称城程呈诚秤惩逞骋澄橙承塍柽埕铖噌铛酲裎枨蛏丞瞠徵" }, - { "chi", L"吃尺迟池翅痴赤齿耻持斥侈弛驰炽匙踟坻茌墀饬媸豉褫敕哧瘛蚩啻鸱眵螭篪魑叱彳笞嗤傺" }, - { "chong", L"冲重虫充宠崇种艟忡舂铳憧茺" }, - { "chou", L"抽愁臭仇丑稠绸酬筹踌畴瞅惆俦帱瘳雠" }, - { "chu", L"出处初锄除触橱楚础储畜滁矗搐躇厨雏楮杵刍怵绌亍憷蹰黜蜍樗褚" }, - { "chuai", L"揣膪嘬搋踹" }, - { "chuan", L"穿船传串川喘椽氚遄钏舡舛巛" }, - { "chuang", L"窗床闯创疮幢怆" }, - { "chui", L"吹垂炊锤捶槌棰陲" }, - { "chun", L"春唇纯蠢醇淳椿蝽莼鹑" }, - { "chuo", L"戳绰踔啜龊辍辶" }, - { "ci", L"次此词瓷慈雌磁辞刺茨伺疵赐差兹呲鹚祠糍粢茈" }, - { "cong", L"从丛葱匆聪囱琮枞淙璁骢苁" }, - { "cou", L"凑楱辏腠" }, - { "cu", L"粗醋簇促徂猝蔟蹙酢殂蹴" }, - { "cuan", L"窜蹿篡攒汆爨镩撺" }, - { "cui", L"催脆摧翠崔淬瘁粹璀啐悴萃毳榱隹" }, - { "cun", L"村寸存忖皴" }, - { "cuo", L"错撮搓挫措磋嵯厝鹾脞痤蹉瘥锉矬躜" }, - { "da", L"大答达打搭瘩笪耷哒褡疸怛靼妲沓嗒鞑" }, - { "dai", L"带代呆戴待袋逮歹贷怠傣大殆呔玳迨岱甙黛骀绐埭" }, - { "dan", L"但单蛋担弹掸胆淡丹耽旦氮诞郸惮石疸澹瘅萏殚眈聃箪赕儋啖赡" }, - { "dang", L"当党挡档荡谠铛宕菪凼裆砀" }, - { "dao", L"到道倒刀岛盗稻捣悼导蹈祷帱纛忉焘氘叨刂" }, - { "de", L"的地得德锝" }, - { "dei", L"得" }, - { "deng", L"等灯邓登澄瞪凳蹬磴镫噔嶝戥簦" }, - { "di", L"地第底低敌抵滴帝递嫡弟缔堤的涤提笛迪狄翟蒂觌邸谛诋嘀柢骶羝氐棣睇娣荻碲镝坻籴砥" }, - { "dia", L"嗲" }, - { "dian", L"点电店殿淀掂颠垫碘惦奠典佃靛滇甸踮钿坫阽癫簟玷巅癜" }, - { "diao", L"掉钓叼吊雕调刁碉凋铞铫鲷貂" }, - { "die", L"爹跌叠碟蝶迭谍牒堞瓞揲蹀耋鲽垤喋" }, - { "ding", L"顶定盯订叮丁钉鼎锭町玎铤腚碇疔仃耵酊啶" }, - { "diu", L"丢铥" }, - { "dong", L"动东懂洞冻冬董栋侗恫峒鸫胨胴硐氡岽咚" }, - { "dou", L"都斗豆逗陡抖痘兜蚪窦篼蔸" }, - { "du", L"读度毒渡堵独肚镀赌睹杜督都犊妒蠹笃嘟渎椟牍黩髑芏" }, - { "duan", L"段短断端锻缎椴煅簖" }, - { "dui", L"对队堆兑碓怼憝" }, - { "dun", L"吨顿蹲墩敦钝盾囤遁趸沌盹镦礅炖砘" }, - { "duo", L"多朵夺舵剁垛跺惰堕掇哆驮度躲踱沲咄铎裰哚缍" }, - { "e", L"饿哦额鹅蛾扼俄讹阿遏峨娥恶厄鄂锇谔垩锷萼苊轭婀莪鳄颚腭愕呃噩鹗屙" }, - { "ei", L"诶" }, - { "en", L"恩摁蒽" }, - { "er", L"而二耳儿饵尔贰洱珥鲕鸸迩铒" }, - { "fa", L"发法罚伐乏筏阀珐垡砝" }, - { "fan", L"反饭翻番犯凡帆返泛繁烦贩范樊藩矾钒燔蘩畈蕃蹯梵幡" }, - { "fang", L"放房防纺芳方访仿坊妨肪钫邡枋舫鲂匚" }, - { "fei", L"非飞肥费肺废匪吠沸菲诽啡篚蜚腓扉妃斐狒芾悱镄霏翡榧淝鲱绯痱砩" }, - { "fen", L"分份芬粉坟奋愤纷忿粪酚焚吩氛汾棼瀵鲼玢偾鼢贲" }, - { "feng", L"风封逢缝蜂丰枫疯冯奉讽凤峰锋烽砜俸酆葑沣唪" }, - { "fo", L"佛" }, - { "fou", L"否缶" }, - { "fu", L"副幅扶浮富福负伏付复服附俯斧赴缚拂夫父符孵敷赋辅府腐腹妇抚覆辐肤氟佛俘傅讣弗涪袱甫釜脯腑阜咐黼砩苻趺跗蚨芾鲋幞茯滏蜉拊菔蝠鳆蝮绂绋赙罘稃匐麸凫桴莩孚馥驸怫祓呋郛芙艴黻哺阝" }, - { "ga", L"噶夹嘎咖钆伽旮尬尕尜" }, - { "gai", L"该改盖概钙芥溉戤垓丐陔赅胲" }, - { "gan", L"赶干感敢竿甘肝柑杆赣秆旰酐矸疳泔苷擀绀橄澉淦尴坩" }, - { "gang", L"刚钢纲港缸岗杠冈肛扛筻罡戆" }, - { "gao", L"高搞告稿膏篙羔糕镐皋郜诰杲缟睾槔锆槁藁" }, - { "ge", L"个各歌割哥搁格阁隔革咯胳葛蛤戈鸽疙盖合铬骼袼塥虼圪镉仡舸鬲嗝膈搿纥哿铪" }, - { "gei", L"给" }, - { "gen", L"跟根哏茛亘艮" }, - { "geng", L"更耕颈梗耿庚羹埂赓鲠哽绠" }, - { "gong", L"工公功共弓攻宫供恭拱贡躬巩汞龚肱觥珙蚣廾" }, - { "gou", L"够沟狗钩勾购构苟垢岣彀枸鞲觏缑笱诟遘媾篝佝" }, - { "gu", L"古股鼓谷故孤箍姑顾固雇估咕骨辜沽蛊贾菇梏鸪汩轱崮菰鹄鹘钴臌酤鲴诂牯瞽毂锢牿痼觚蛄罟嘏" }, - { "gua", L"挂刮瓜寡剐褂卦呱胍鸹栝诖" }, - { "guai", L"怪拐乖掴" }, - { "guan", L"关管官观馆惯罐灌冠贯棺纶盥莞掼涫鳏鹳倌" }, - { "guang", L"光广逛桄犷咣胱" }, - { "gui", L"归贵鬼跪轨规硅桂柜龟诡闺瑰圭刽癸炔庋宄桧刿鳜鲑皈匦妫晷簋炅" }, - { "gun", L"滚棍辊鲧衮磙绲" }, - { "guo", L"过国果裹锅郭涡埚椁聒馘猓崞掴帼呙虢蜾蝈锞" }, - { "ha", L"哈蛤铪" }, - { "hai", L"还海害咳氦孩骇咳骸亥嗨醢胲" }, - { "han", L"喊含汗寒汉旱酣韩焊涵函憨翰罕撼捍憾悍邯邗菡撖瀚顸蚶焓颔晗鼾" }, - { "hang", L"行巷航夯杭吭颃沆绗" }, - { "hao", L"好号浩嚎壕郝毫豪耗貉镐昊颢灏嚆蚝嗥皓蒿濠薅" }, - { "he", L"和喝合河禾核何呵荷贺赫褐盒鹤菏貉阂涸吓嗬劾盍翮阖颌壑诃纥曷蚵" }, - { "hei", L"黑嘿" }, - { "hen", L"很狠恨痕" }, - { "heng", L"横恒哼衡亨桁珩蘅" }, - { "hong", L"红轰哄虹洪宏烘鸿弘讧訇蕻闳薨黉荭泓" }, - { "hou", L"后厚吼喉侯候猴鲎篌堠後逅糇骺瘊" }, - { "hu", L"湖户呼虎壶互胡护糊弧忽狐蝴葫沪乎核瑚唬鹕冱怙鹱笏戽扈鹘浒祜醐琥囫烀轷瓠煳斛鹄猢惚岵滹觳唿槲虍" }, - { "hua", L"话花化画华划滑哗猾铧桦骅砉" }, - { "huai", L"坏怀淮槐徊踝" }, - { "huan", L"换还唤环患缓欢幻宦涣焕豢桓痪漶獾擐逭鲩郇鬟寰奂锾圜洹萑缳浣垸" }, - { "huang", L"黄慌晃荒簧凰皇谎惶蝗磺恍煌幌隍肓潢篁徨鳇遑癀湟蟥璜" }, - { "hui", L"回会灰绘挥汇辉毁悔惠晦徽恢秽慧贿蛔讳卉烩诲彗浍蕙喙恚哕晖隳麾诙蟪茴洄咴虺荟缋桧" }, - { "hun", L"混昏荤浑婚魂阍珲馄溷诨" }, - { "huo", L"或活火伙货和获祸豁霍惑嚯镬耠劐藿攉锪蠖钬夥" }, - { "ji", L"几及急既即机鸡积记级极计挤己季寄纪系基激吉脊际汲肌嫉姬绩缉饥迹棘蓟技冀辑伎祭剂悸济籍寂奇忌妓继集给击圾箕讥畸稽疾墼洎鲚屐齑戟鲫嵇矶稷戢虮笈暨笄剞叽蒺跻嵴掎跽霁唧畿荠瘠玑羁丌偈芨佶赍楫髻咭蕺觊麂骥殛岌亟犄乩芰哜彐萁藉" }, - { "jia", L"家加假价架甲佳夹嘉驾嫁枷荚颊钾稼茄贾铗葭迦戛浃镓痂恝岬跏嘏伽胛笳珈瘕郏袈蛱袷铪" }, - { "jian", L"见件减尖间键贱肩兼建检箭煎简剪歼监坚奸健艰荐剑渐溅涧鉴践捡柬笺俭碱硷拣舰槛缄茧饯翦鞯戋谏牮枧腱趼缣搛戬毽菅鲣笕谫楗囝蹇裥踺睑謇鹣蒹僭锏湔犍谮" }, - { "jiang", L"将讲江奖降浆僵姜酱蒋疆匠强桨虹豇礓缰犟耩绛茳糨洚" }, - { "jiao", L"叫脚交角教较缴觉焦胶娇绞校搅骄狡浇矫郊嚼蕉轿窖椒礁饺铰酵侥剿徼艽僬蛟敫峤跤姣皎茭鹪噍醮佼鲛挢" }, - { "jie", L"接节街借皆截解界结届姐揭戒介阶劫芥竭洁疥藉秸桔杰捷诫睫偈桀喈拮骱羯蚧嗟颉鲒婕碣讦孑疖诘卩锴" }, - { "jin", L"进近今仅紧金斤尽劲禁浸锦晋筋津谨巾襟烬靳廑瑾馑槿衿堇荩矜噤缙卺妗赆觐钅" }, - { "jing", L"竟静井惊经镜京净敬精景警竞境径荆晶鲸粳颈兢茎睛劲痉靖肼獍阱腈弪刭憬婧胫菁儆旌迳靓泾陉" }, - { "jiong", L"窘炯扃迥冂" }, - { "jiu", L"就九酒旧久揪救纠舅究韭厩臼玖灸咎疚赳鹫僦柩桕鬏鸠阄啾" }, - { "ju", L"句举巨局具距锯剧居聚拘菊矩沮拒惧鞠狙驹据柜俱车咀疽踞炬倨醵裾屦犋苴窭飓锔椐苣琚掬榘龃趄莒雎遽橘踽榉鞫钜讵枸瞿蘧" }, - { "juan", L"卷圈倦鹃捐娟眷绢鄄锩蠲镌狷桊涓隽" }, - { "jue", L"决绝觉角爵掘诀撅倔抉攫嚼脚桷橛觖劂爝矍镢獗珏崛蕨噘谲蹶孓厥阙" }, - { "jun", L"军君均菌俊峻龟竣骏钧浚郡筠麇皲捃" }, - { "ka", L"卡喀咯咖胩咔佧" }, - { "kai", L"开揩凯慨楷垲剀锎铠锴忾恺蒈" }, - { "kan", L"看砍堪刊坎槛勘龛戡侃瞰莰阚凵" }, - { "kang", L"抗炕扛糠康慷亢钪闶伉" }, - { "kao", L"靠考烤拷栲犒尻铐" }, - { "ke", L"可克棵科颗刻课客壳渴苛柯磕咳坷呵恪岢蝌缂蚵轲窠钶氪颏瞌锞稞珂髁疴嗑溘骒铪" }, - { "ken", L"肯啃恳垦裉" }, - { "keng", L"坑吭铿胫铒" }, - { "kong", L"空孔控恐倥崆箜" }, - { "kou", L"口扣抠寇蔻芤眍筘叩" }, - { "ku", L"哭库苦枯裤窟酷刳骷喾堀绔" }, - { "kua", L"跨垮挎夸胯侉锞" }, - { "kuai", L"快块筷会侩哙蒯郐狯脍" }, - { "kuan", L"宽款髋" }, - { "kuang", L"矿筐狂框况旷匡眶诳邝纩夼诓圹贶哐" }, - { "kui", L"亏愧奎窥溃葵魁馈盔傀岿匮愦揆睽跬聩篑喹逵暌蒉悝喟馗蝰隗夔" }, - { "kun", L"捆困昆坤鲲锟髡琨醌阃悃顽" }, - { "kuo", L"阔扩括廓蛞" }, - { "la", L"拉啦辣蜡腊喇垃落瘌邋砬剌旯" }, - { "lai", L"来赖莱濑赉崃涞铼籁徕癞睐" }, - { "lan", L"蓝兰烂拦篮懒栏揽缆滥阑谰婪澜览榄岚褴镧斓罱漤" }, - { "lang", L"浪狼廊郎朗榔琅稂螂莨啷锒阆蒗" }, - { "lao", L"老捞牢劳烙涝落姥酪络佬耢铹醪铑唠栳崂痨" }, - { "le", L"了乐勒鳓仂叻泐" }, - { "lei", L"类累泪雷垒勒擂蕾肋镭儡磊缧诔耒酹羸嫘檑嘞" }, - { "leng", L"冷棱楞愣塄" }, - { "li", L"里离力立李例哩理利梨厘礼历丽吏砾漓莉傈荔俐痢狸粒沥隶栗璃鲤厉励犁黎篱郦鹂笠坜苈鳢缡跞蜊锂澧粝蓠枥蠡鬲呖砺嫠篥疠疬猁藜溧鲡戾栎唳醴轹詈骊罹逦俪喱雳黧莅俚蛎娌砬" }, - { "lia", L"俩" }, - { "lian", L"连联练莲恋脸炼链敛怜廉帘镰涟蠊琏殓蔹鲢奁潋臁裢濂裣楝" }, - { "liang", L"两亮辆凉粮梁量良晾谅俩粱墚踉椋魉莨" }, - { "liao", L"了料撩聊撂疗廖燎辽僚寥镣潦钌蓼尥寮缭獠鹩嘹" }, - { "lie", L"列裂猎劣烈咧埒捩鬣趔躐冽洌" }, - { "lin", L"林临淋邻磷鳞赁吝拎琳霖凛遴嶙蔺粼麟躏辚廪懔瞵檩膦啉" }, - { "ling", L"另令领零铃玲灵岭龄凌陵菱伶羚棱翎蛉苓绫瓴酃呤泠棂柃鲮聆囹" }, - { "liu", L"六流留刘柳溜硫瘤榴琉馏碌陆绺锍鎏镏浏骝旒鹨熘遛" }, - { "lo", L"咯" }, - { "long", L"龙拢笼聋隆垄弄咙窿陇垅胧珑茏泷栊癃砻" }, - { "lou", L"楼搂漏陋露娄篓偻蝼镂蒌耧髅喽瘘嵝" }, - { "lu", L"路露录鹿陆炉卢鲁卤芦颅庐碌掳绿虏赂戮潞禄麓六鲈栌渌逯泸轳氇簏橹辂垆胪噜镥辘漉撸璐鸬鹭舻" }, - { "luan", L"乱卵滦峦孪挛栾銮脔娈鸾" }, - { "lue", L"略掠锊" }, - { "lun", L"论轮抡伦沦仑纶囵" }, - { "luo", L"落罗锣裸骡烙箩螺萝洛骆逻络咯荦漯蠃雒倮硌椤捋脶瘰摞泺珞镙猡铬" }, - { "lv", L"绿率铝驴旅屡滤吕律氯缕侣虑履偻膂榈闾捋褛稆" }, - { "lve", L"略掠锊" }, - { "m", L"呒" }, - { "ma", L"吗妈马嘛麻骂抹码玛蚂摩唛蟆犸嬷杩" }, - { "mai", L"买卖迈埋麦脉劢霾荬" }, - { "man", L"满慢瞒漫蛮蔓曼馒埋谩幔鳗墁螨镘颟鞔缦熳" }, - { "mang", L"忙芒盲莽茫氓硭邙蟒漭" }, - { "mao", L"毛冒帽猫矛卯貌茂贸铆锚茅耄茆瑁蝥髦懋昴牦瞀峁袤蟊旄泖" }, - { "me", L"么" }, - { "mei", L"没每煤镁美酶妹枚霉玫眉梅寐昧媒媚嵋猸袂湄浼鹛莓魅镅楣" }, - { "men", L"门们闷懑扪钔焖" }, - { "meng", L"猛梦蒙锰孟盟檬萌礞蜢勐懵甍蠓虻朦艋艨瞢" }, - { "mi", L"米密迷眯蜜谜觅秘弥幂靡糜泌醚蘼縻咪汨麋祢猕弭谧芈脒宓敉嘧糸冖" }, - { "mian", L"面棉免绵眠缅勉冕娩腼湎眄沔渑宀" }, - { "miao", L"秒苗庙妙描瞄藐渺眇缪缈淼喵杪鹋邈" }, - { "mie", L"灭蔑咩篾蠛乜" }, - { "min", L"民抿敏闽皿悯珉愍缗闵玟苠泯黾鳘岷" }, - { "ming", L"名明命鸣铭螟冥瞑暝茗溟酩" }, - { "miu", L"谬缪" }, - { "mo", L"摸磨抹末膜墨没莫默魔模摩摹漠陌蘑脉沫万寞秣瘼殁镆嫫谟蓦貊貘麽茉馍耱" }, - { "mou", L"某谋牟眸蛑鍪侔缪哞" }, - { "mu", L"木母亩幕目墓牧牟模穆暮牡拇募慕睦姆钼毪坶沐仫苜" }, - { "na", L"那拿哪纳钠娜呐衲捺镎肭" }, - { "nai", L"乃耐奶奈氖萘艿柰鼐佴" }, - { "nan", L"难南男赧囡蝻楠喃腩" }, - { "nang", L"囊馕曩囔攮" }, - { "nao", L"闹脑恼挠淖孬铙瑙垴呶蛲猱硇" }, - { "ne", L"呢哪讷" }, - { "nei", L"内馁" }, - { "nen", L"嫩恁" }, - { "neng", L"能" }, - { "ng", L"嗯" }, - { "ni", L"你泥拟腻逆呢溺倪尼匿妮霓铌昵坭祢猊伲怩鲵睨旎慝" }, - { "nian", L"年念捻撵拈碾蔫廿黏辇鲇鲶埝" }, - { "niang", L"娘酿" }, - { "niao", L"鸟尿袅茑脲嬲" }, - { "nie", L"捏镍聂孽涅镊啮陧蘖嗫臬蹑颞乜" }, - { "nin", L"您" }, - { "ning", L"拧凝宁柠狞泞佞甯咛聍" }, - { "niu", L"牛扭纽钮拗妞狃忸" }, - { "nong", L"弄浓农脓哝侬" }, - { "nou", L"耨" }, - { "nu", L"怒努奴孥胬驽弩" }, - { "nuan", L"暖" }, - { "nue", L"虐疟" }, - { "nuo", L"挪诺懦糯娜喏傩锘搦" }, - { "nv", L"女衄钕恧" }, - { "nve", L"虐疟" }, - { "o", L"哦喔噢" }, - { "ou", L"偶呕欧藕鸥区沤殴怄瓯讴耦" }, - { "pa", L"怕爬趴啪耙扒帕琶筢杷葩" }, - { "pai", L"派排拍牌迫徘湃哌俳蒎" }, - { "pan", L"盘盼判攀畔潘叛磐番胖襻蟠袢泮拚爿蹒" }, - { "pang", L"旁胖耪庞乓膀磅滂彷逄螃镑" }, - { "pao", L"跑抛炮泡刨袍咆狍匏庖疱脬" }, - { "pei", L"陪配赔呸胚佩培沛裴旆锫帔醅霈辔" }, - { "pen", L"喷盆湓" }, - { "peng", L"碰捧棚砰蓬朋彭鹏烹硼膨抨澎篷怦堋蟛嘭" }, - { "pi", L"批皮披匹劈辟坯屁脾僻疲痞霹琵毗啤譬砒否貔丕圮媲癖仳擗郫甓枇睥蜱鼙邳陂铍庀罴埤纰陴淠噼蚍裨疋芘" }, - { "pian", L"片篇骗偏便扁翩缏犏骈胼蹁谝" }, - { "piao", L"忄票飘漂瓢朴螵嫖瞟殍缥嘌骠剽" }, - { "pie", L"瞥撇氕苤丿" }, - { "pin", L"品贫聘拼频嫔榀姘牝颦" }, - { "ping", L"平凭瓶评屏乒萍苹坪冯娉鲆枰俜" }, - { "po", L"破坡颇婆泼迫泊魄朴繁粕笸皤钋陂鄱攴叵珀钷" }, - { "pou", L"剖掊裒" }, - { "pu", L"扑铺谱脯仆蒲葡朴菩曝莆瀑埔圃浦堡普暴镨噗匍溥濮氆蹼璞镤" }, - { "qi", L"起其七气期齐器妻骑汽棋奇欺漆启戚柒岂砌弃泣祁凄企乞契歧祈栖畦脐崎稽迄缉沏讫旗祺颀骐屺岐蹊蕲桤憩芪荠萋芑汔亟鳍俟槭嘁蛴綦亓欹琪麒琦蜞圻杞葺碛淇耆绮綮" }, - { "qia", L"恰卡掐洽髂袷葜" }, - { "qian", L"前钱千牵浅签欠铅嵌钎迁钳乾谴谦潜歉纤扦遣黔堑仟岍钤褰箝掮搴倩慊悭愆虔芡荨缱佥芊阡肷茜椠犍骞羟赶" }, - { "qiang", L"强枪墙抢腔呛羌蔷蜣跄戗襁戕炝镪锵羟樯嫱" }, - { "qiao", L"桥瞧敲巧翘锹壳鞘撬悄俏窍雀乔侨峭橇樵荞跷硗憔谯鞒愀缲诮劁峤搞铫" }, - { "qie", L"切且怯窃茄郄趄惬锲妾箧慊伽挈" }, - { "qin", L"亲琴侵勤擒寝秦芹沁禽钦吣覃矜衾芩廑嗪螓噙揿檎锓" }, - { "qing", L"请轻清青情晴氢倾庆擎顷亲卿氰圊謦檠箐苘蜻黥罄鲭磬綮" }, - { "qiong", L"穷琼跫穹邛蛩茕銎筇" }, - { "qiu", L"求球秋丘泅仇邱囚酋龟楸蚯裘糗蝤巯逑俅虬赇鳅犰湫遒" }, - { "qu", L"去取区娶渠曲趋趣屈驱蛆躯龋戌蠼蘧祛蕖磲劬诎鸲阒麴癯衢黢璩氍觑蛐朐瞿岖苣" }, - { "quan", L"全权劝圈拳犬泉券颧痊醛铨筌绻诠辁畎鬈悛蜷荃犭" }, - { "que", L"却缺确雀瘸鹊炔榷阙阕悫" }, - { "qun", L"群裙麇逡" }, - { "ran", L"染燃然冉髯苒蚺" }, - { "rang", L"让嚷瓤攘壤穰禳" }, - { "rao", L"饶绕扰荛桡娆" }, - { "re", L"热惹喏" }, - { "ren", L"人任忍认刃仁韧妊纫壬饪轫仞荏葚衽稔亻" }, - { "reng", L"仍扔" }, - { "ri", L"日" }, - { "rong", L"容绒融溶熔荣戎蓉冗茸榕狨嵘肜蝾" }, - { "rou", L"肉揉柔糅蹂鞣" }, - { "ru", L"如入汝儒茹乳褥辱蠕孺蓐襦铷嚅缛濡薷颥溽洳" }, - { "ruan", L"软阮朊" }, - { "rui", L"瑞蕊锐睿芮蚋枘蕤" }, - { "run", L"润闰" }, - { "ruo", L"若弱箬偌" }, - { "sa", L"撒洒萨仨卅飒脎" }, - { "sai", L"塞腮鳃赛噻" }, - { "san", L"三散伞叁馓糁毵" }, - { "sang", L"桑丧嗓颡磉搡" }, - { "sao", L"扫嫂搔骚埽鳋臊缫瘙" }, - { "se", L"色涩瑟塞啬铯穑" }, - { "sen", L"森" }, - { "seng", L"僧" }, - { "sha", L"杀沙啥纱傻砂刹莎厦煞杉唼鲨霎铩痧裟歃" }, - { "shai", L"晒筛色" }, - { "shan", L"山闪衫善扇杉删煽单珊掺赡栅苫膳陕汕擅缮嬗蟮芟禅跚鄯潸鳝姗剡骟疝膻讪钐舢埏彡髟" }, - { "shang", L"上伤尚商赏晌墒裳熵觞绱殇垧" }, - { "shao", L"少烧捎哨勺梢稍邵韶绍芍鞘苕劭潲艄蛸筲" }, - { "she", L"社射蛇设舌摄舍折涉赊赦慑奢歙厍畲猞麝滠佘揲" }, - { "shei", L"谁" }, - { "shen", L"身伸深婶神甚渗肾审申沈绅呻参砷什娠慎葚莘诜谂矧椹渖蜃哂胂" }, - { "sheng", L"声省剩生升绳胜盛圣甥牲乘晟渑眚笙嵊" }, - { "shi", L"是使十时事室市石师试史式识虱矢拾屎驶始似示士世柿匙拭誓逝势什殖峙嗜噬失适仕侍释饰氏狮食恃蚀视实施湿诗尸豕莳埘铈舐鲥鲺贳轼蓍筮炻谥弑酾螫礻铊饣" }, - { "shou", L"手受收首守瘦授兽售寿艏狩绶扌" }, - { "shu", L"书树数熟输梳叔属束术述蜀黍鼠淑赎孰蔬疏戍竖墅庶薯漱恕枢暑殊抒曙署舒姝摅秫纾沭毹腧塾菽殳澍倏疋镯" }, - { "shua", L"刷耍唰" }, - { "shuai", L"摔甩率帅衰蟀" }, - { "shuan", L"栓拴闩涮" }, - { "shuang", L"双霜爽泷孀" }, - { "shui", L"水睡税说氵" }, - { "shun", L"顺吮瞬舜" }, - { "shuo", L"说数硕烁朔搠妁槊蒴铄" }, - { "si", L"四死丝撕似私嘶思寺司斯伺肆饲嗣巳耜驷兕蛳厮汜锶泗笥咝鸶姒厶缌祀澌俟徙" }, - { "song", L"送松耸宋颂诵怂讼竦菘淞悚嵩凇崧忪" }, - { "sou", L"艘搜擞嗽嗾嗖飕叟薮锼馊瞍溲螋" }, - { "su", L"素速诉塑宿俗苏肃粟酥缩溯僳愫簌觫稣夙嗉谡蔌涑" }, - { "suan", L"酸算蒜狻" }, - { "sui", L"岁随碎虽穗遂尿隋髓绥隧祟眭谇濉邃燧荽睢" }, - { "sun", L"孙损笋榫荪飧狲隼" }, - { "suo", L"所缩锁琐索梭蓑莎唆挲睃嗍唢桫嗦娑羧" }, - { "ta", L"他她它踏塔塌拓獭挞蹋溻趿鳎沓榻漯遢铊闼" }, - { "tai", L"太抬台态胎苔泰酞汰炱肽跆鲐钛薹邰骀" }, - { "tan", L"谈叹探滩弹碳摊潭贪坛痰毯坦炭瘫谭坍檀袒钽郯镡锬覃澹昙忐赕" }, - { "tang", L"躺趟堂糖汤塘烫倘淌唐搪棠膛螳樘羰醣瑭镗傥饧溏耥帑铴螗铛" }, - { "tao", L"套掏逃桃讨淘涛滔陶绦萄鼗洮焘啕饕韬叨" }, - { "te", L"特铽忑忒" }, - { "teng", L"疼腾藤誊滕" }, - { "ti", L"提替体题踢蹄剃剔梯锑啼涕嚏惕屉醍鹈绨缇倜裼逖荑悌" }, - { "tian", L"天田添填甜舔恬腆掭钿阗忝殄畋锘" }, - { "tiao", L"条跳挑调迢眺龆笤祧蜩髫佻窕鲦苕粜铫" }, - { "tie", L"铁贴帖萜餮锇" }, - { "ting", L"听停挺厅亭艇庭廷烃汀莛铤葶婷蜓梃霆" }, - { "tong", L"同通痛铜桶筒捅统童彤桐瞳酮潼茼仝砼峒恸佟嗵垌僮" }, - { "tou", L"头偷透投钭骰亠" }, - { "tu", L"土图兔涂吐秃突徒凸途屠酴荼钍菟堍" }, - { "tuan", L"团湍疃抟彖" }, - { "tui", L"腿推退褪颓蜕煺" }, - { "tun", L"吞屯褪臀囤氽饨豚暾" }, - { "tuo", L"拖脱托妥驮拓驼椭唾鸵陀橐柝跎乇坨佗庹酡柁鼍沱箨砣说铊" }, - { "wa", L"挖瓦蛙哇娃洼袜佤娲腽" }, - { "wai", L"外歪崴" }, - { "wan", L"完万晚碗玩弯挽湾丸腕宛婉烷顽豌惋皖蔓莞脘蜿绾芄琬纨剜畹菀" }, - { "wang", L"望忘王往网亡枉旺汪妄辋魍惘罔尢" }, - { "wei", L"为位未围喂胃微味尾伪威伟卫危违委魏唯维畏惟韦巍蔚谓尉潍纬慰桅萎苇渭葳帏艉鲔娓逶闱隈沩玮涠帷崴隗诿洧偎猥猬嵬軎韪炜煨圩薇痿囗" }, - { "wen", L"问文闻稳温吻蚊纹瘟紊汶阌刎雯璺" }, - { "weng", L"翁嗡瓮蕹蓊" }, - { "wo", L"我握窝卧挝沃蜗涡斡倭幄龌肟莴喔渥硪" }, - { "wu", L"无五屋物舞雾误捂污悟勿钨武戊务呜伍吴午吾侮乌毋恶诬芜巫晤梧坞妩蜈牾寤兀怃阢邬唔忤骛於鋈仵杌鹜婺迕痦芴焐庑鹉鼯浯圬" }, - { "xi", L"西洗细吸戏系喜席稀溪熄锡膝息袭惜习嘻夕悉矽熙希檄牺晰昔媳硒铣烯析隙汐犀蜥奚浠葸饩屣玺嬉禊兮翕穸禧僖淅蓰舾蹊醯郗欷皙蟋羲茜徙隰唏曦螅歙樨阋粞熹觋菥鼷裼舄" }, - { "xia", L"下吓夏峡虾瞎霞狭匣侠辖厦暇狎柙呷黠硖罅遐瑕" }, - { "xian", L"先线县现显掀闲献嫌陷险鲜弦衔馅限咸锨仙腺贤纤宪舷涎羡铣苋藓岘痫莶籼娴蚬猃祆冼燹跣跹酰暹氙鹇筅霰洗" }, - { "xiang", L"想向象项响香乡相像箱巷享镶厢降翔祥橡详湘襄飨鲞骧蟓庠芗饷缃葙" }, - { "xiao", L"小笑消削销萧效宵晓肖孝硝淆啸霄哮嚣校魈蛸骁枵哓筱潇逍枭绡箫" }, - { "xie", L"写些鞋歇斜血谢卸挟屑蟹泻懈泄楔邪协械谐蝎携胁解叶绁颉缬獬榭廨撷偕瀣渫亵榍邂薤躞燮勰骱鲑" }, - { "xin", L"新心欣信芯薪锌辛衅忻歆囟莘镡馨鑫昕忄" }, - { "xing", L"性行型形星醒姓腥刑杏兴幸邢猩惺省硎悻荥陉擤荇研饧" }, - { "xiong", L"胸雄凶兄熊汹匈芎" }, - { "xiu", L"修锈绣休羞宿嗅袖秀朽臭溴貅馐髹鸺咻庥岫" }, - { "xu", L"许须需虚嘘蓄续序叙畜絮婿戌徐旭绪吁酗恤墟糈勖栩浒蓿顼圩洫胥醑诩溆煦盱" }, - { "xuan", L"选悬旋玄宣喧轩绚眩癣券暄楦儇渲漩泫铉璇煊碹镟炫揎萱谖" }, - { "xue", L"学雪血靴穴削薛踅噱鳕泶谑" }, - { "xun", L"寻讯熏训循殉旬巡迅驯汛逊勋询浚巽鲟浔埙恂獯醺洵郇峋蕈薰荀窨曛徇荨" }, - { "ya", L"呀压牙押芽鸭轧崖哑亚涯丫雅衙鸦讶蚜垭疋砑琊桠睚娅痖岈氩伢迓揠" }, - { "yan", L"眼烟沿盐言演严咽淹炎掩厌宴岩研延堰验艳殷阉砚雁唁彦焰蜒衍谚燕颜阎铅焉奄芫厣阏菸魇琰滟焱赝筵腌兖剡餍恹罨檐湮偃谳胭晏闫俨郾酽鄢妍鼹崦阽嫣涎讠" }, - { "yang", L"样养羊洋仰扬秧氧痒杨漾阳殃央鸯佯疡炀恙徉鞅泱蛘烊怏" }, - { "yao", L"要摇药咬腰窑舀邀妖谣遥姚瑶耀尧钥侥疟珧夭鳐鹞轺爻吆铫幺崾肴曜徭杳窈啮繇" }, - { "ye", L"也夜业野叶爷页液掖腋冶噎耶咽曳椰邪谒邺晔烨揶铘靥" }, - { "yi", L"一以已亿衣移依易医乙仪亦椅益倚姨翼译伊遗艾胰疑沂宜异彝壹蚁谊揖铱矣翌艺抑绎邑屹尾役臆逸肄疫颐裔意毅忆义夷溢诣议怿痍镒癔怡驿旖熠酏翊欹峄圯殪咦懿噫劓诒饴漪佚咿瘗猗眙羿弈苡荑佾贻钇缢迤刈悒黟翳弋奕蜴埸挹嶷薏呓轶镱舣奇硪衤铊" }, - { "yin", L"因引印银音饮阴隐荫吟尹寅茵淫殷姻堙鄞喑夤胤龈吲狺垠霪蚓氤铟窨瘾洇茚廴" }, - { "ying", L"应硬影营迎映蝇赢鹰英颖莹盈婴樱缨荧萤萦楹蓥瘿茔鹦媵莺璎郢嘤撄瑛滢潆嬴罂瀛膺荥颍" }, - { "yo", L"哟育唷" }, - { "yong", L"用涌永拥蛹勇雍咏泳佣踊痈庸臃恿壅慵俑墉鳙邕喁甬饔镛" }, - { "you", L"有又由右油游幼优友铀忧尤犹诱悠邮酉佑釉幽疣攸蚰莠鱿卣黝莸猷蚴宥牖囿柚蝣莜鼬铕蝤繇呦侑尢" }, - { "yu", L"与于欲鱼雨余遇语愈狱玉渔予誉育愚羽虞娱淤舆屿禹宇迂俞逾域芋郁吁盂喻峪御愉渝尉榆隅浴寓裕预豫驭蔚妪嵛雩馀阈窬鹆妤揄窳觎臾舁龉蓣煜钰谀纡於竽瑜禺聿欤俣伛圄鹬庾昱萸瘐谕鬻圉瘀熨饫毓燠腴狳菀蜮蝓吾" }, - { "yuan", L"远员元院圆原愿园援猿怨冤源缘袁渊苑垣鸳辕圜鼋橼媛爰眢鸢掾芫沅瑗螈箢塬" }, - { "yue", L"月越约跃阅乐岳悦曰说粤钥瀹钺刖龠栎樾哕" }, - { "yun", L"云运晕允匀韵陨孕耘蕴酝郧员氲恽愠郓芸筠韫昀狁殒纭熨" }, - { "za", L"杂砸咋匝扎咂拶" }, - { "zai", L"在再灾载栽宰哉甾崽" }, - { "zan", L"咱暂攒赞簪趱糌瓒拶昝錾" }, - { "zang", L"脏葬赃藏臧驵" }, - { "zao", L"早造遭糟灶燥枣凿躁藻皂噪澡蚤唣" }, - { "ze", L"则责择泽咋箦舴帻迮啧仄昃笮赜" }, - { "zei", L"贼" }, - { "zen", L"怎谮" }, - { "zeng", L"增赠憎曾缯罾甑锃" }, - { "zha", L"扎炸渣闸眨榨乍轧诈铡札查栅咋喳砟痄吒哳楂蚱揸喋柞咤齄龃" }, - { "zhai", L"摘窄债斋寨择翟宅砦瘵" }, - { "zhan", L"站占战盏沾粘毡展栈詹颤蘸湛绽斩辗崭瞻谵搌旃骣" }, - { "zhang", L"张章长帐仗丈掌涨账樟杖彰漳胀瘴障仉嫜幛鄣璋嶂獐蟑" }, - { "zhao", L"找着照招罩爪兆朝昭沼肇召赵棹啁钊笊诏" }, - { "zhe", L"着这者折遮蛰哲蔗锗辙浙柘辄赭摺鹧磔褶蜇谪" }, - { "zhen", L"真阵镇针震枕振斟珍疹诊甄砧臻贞侦缜蓁祯箴轸榛稹赈朕鸩胗浈桢畛圳椹溱" }, - { "zheng", L"正整睁争挣征怔证症郑拯蒸狰政峥钲铮筝诤徵鲭" }, - { "zhi", L"只之直知制指纸支芝枝稚吱蜘质肢脂汁炙织职痔植抵殖执值侄址滞止趾治旨窒志挚掷至致置帜识峙智秩帙摭黹桎枳轵忮祉蛭膣觯郅栀彘芷祗咫鸷絷踬胝骘轾痣陟踯雉埴贽卮酯豸跖栉夂徵" }, - { "zhong", L"中重种钟肿众终盅忠仲衷踵舯螽锺冢忪" }, - { "zhou", L"周洲皱粥州轴舟昼骤宙诌肘帚咒繇胄纣荮啁碡绉籀妯酎" }, - { "zhu", L"住主猪竹株煮筑著贮铸嘱拄注祝驻属术珠瞩蛛朱柱诸诛逐助烛蛀潴洙伫瘃翥茱苎橥舳杼箸炷侏铢疰渚褚躅麈邾槠竺丶" }, - { "zhua", L"抓爪挝" }, - { "zhuai", L"拽转" }, - { "zhuan", L"转专砖赚传撰篆颛馔啭沌" }, - { "zhuang", L"装撞庄壮桩状幢妆奘戆" }, - { "zhui", L"追坠缀锥赘椎骓惴缒隹" }, - { "zhun", L"准谆肫窀饨" }, - { "zhuo", L"捉桌着啄拙灼浊卓琢茁酌擢焯濯诼浞涿倬镯禚斫淖" }, - { "zi", L"字自子紫籽资姿吱滓仔兹咨孜渍滋淄笫粢龇秭恣谘趑缁梓鲻锱孳耔觜髭赀茈訾嵫眦姊辎" }, - { "zong", L"总纵宗棕综踪鬃偬粽枞腙" }, - { "zou", L"走揍奏邹鲰鄹陬驺诹" }, - { "zu", L"组族足阻租祖诅菹镞卒俎" }, - { "zuan", L"钻纂缵躜攥" }, - { "zui", L"最嘴醉罪觜蕞" }, - { "zun", L"尊遵鳟撙樽" }, - { "zuo", L"做作坐左座昨琢撮佐嘬酢唑祚胙怍阼柞砟" }, -}; - -CInputCodingTableBasePY::CInputCodingTableBasePY() -{ - m_codechars = "abcdefghijklmnopqrstuvwxyz"; -} - -std::vector CInputCodingTableBasePY::GetResponse(int) -{ - return m_words; -} - -bool CInputCodingTableBasePY::GetWordListPage(const std::string& strCode, bool isFirstPage) -{ - if (!isFirstPage) - return false; - - m_words.clear(); - auto finder = codemap.find(strCode); - if (finder != codemap.end()) - { - for (unsigned int i = 0; i < finder->second.size(); i++) - { - m_words.push_back(finder->second.substr(i, 1)); - } - } - CGUIMessage msg(GUI_MSG_CODINGTABLE_LOOKUP_COMPLETED, 0, 0, 0); - msg.SetStringParam(strCode); - g_windowManager.SendThreadMessage(msg, g_windowManager.GetActiveWindowID()); - return true; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableBasePY.h kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableBasePY.h --- kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableBasePY.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableBasePY.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -#pragma once - -/* -* Copyright (C) 2005-2013 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include "InputCodingTable.h" -#include -#include - -class CInputCodingTableBasePY : public IInputCodingTable -{ -public: - CInputCodingTableBasePY(); - virtual ~CInputCodingTableBasePY() {} - - virtual bool GetWordListPage(const std::string& strCode, bool isFirstPage); - virtual std::vector GetResponse(int); -private: - std::vector m_words; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableFactory.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableFactory.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* -* Copyright (C) 2005-2013 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include "InputCodingTableFactory.h" -#include "InputCodingTableBaiduPY.h" -#include "InputCodingTableBasePY.h" -#include "InputCodingTableKorean.h" -#include "utils/XBMCTinyXML.h" -#include "utils/log.h" - -IInputCodingTable* CInputCodingTableFactory::CreateCodingTable(const std::string& strTableName, const TiXmlElement* element) -{ - if (strTableName == "BaiduPY") - { - const char* apiurl = element->Attribute("apiurl"); - if (apiurl == nullptr) - { - CLog::Log(LOGWARNING, "CInputCodingTableFactory: invalid \"apiurl\" attribute"); - return nullptr; - } - return new CInputCodingTableBaiduPY(apiurl); - } - if (strTableName == "BasePY") - return new CInputCodingTableBasePY(); - if (strTableName == "Korean") - return new CInputCodingTableKorean(); - return nullptr; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableFactory.h kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableFactory.h --- kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableFactory.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableFactory.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -#pragma once - -/* -* Copyright (C) 2005-2013 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include - -class TiXmlElement; -class IInputCodingTable; - -class CInputCodingTableFactory -{ -public: - static IInputCodingTable* CreateCodingTable(const std::string& strTableName, const TiXmlElement* element); -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTable.h kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTable.h --- kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTable.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTable.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -#pragma once - -/* -* Copyright (C) 2005-2013 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include -#include - -class IInputCodingTable -{ -public: - enum { TYPE_WORD_LIST, TYPE_CONVERT_STRING }; - virtual int GetType() { return TYPE_WORD_LIST; } - - virtual ~IInputCodingTable() {} - /*! \brief Called for the active keyboard layout when it's loaded, stick any initialization here - - This won't be needed for most implementations so we don't set it =0 but provide a default - implementation. - */ - virtual void Initialize() {} - - /*! \brief Called for the active keyboard layout when it's unloaded, stick any cleanup here - - This won't be needed for most implementations so we don't set it =0 but provide a default - implementation. - */ - virtual void Deinitialize() {} - - /*! \brief Can be overridden if initialization is expensive to avoid calling initialize more than needed - \return true if initialization has beeen done and was successful, false otherwise. - */ - virtual bool IsInitialized() const { return true; } - virtual bool GetWordListPage(const std::string& strCode, bool isFirstPage) = 0; - virtual std::vector GetResponse(int response) = 0; - const std::string& GetCodeChars() const { return m_codechars; } - - virtual void SetTextPrev(const std::string& strTextPrev) {} - virtual std::string ConvertString(const std::string& strCode) { return std::string(""); } - -protected: - std::string m_codechars; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableKorean.cpp kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableKorean.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableKorean.cpp 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableKorean.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,376 +0,0 @@ -/* -* Copyright (C) 2005-2015 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include -#include "InputCodingTableKorean.h" -#include "utils/CharsetConverter.h" - -CInputCodingTableKorean::CInputCodingTableKorean() -{ -} - -std::vector CInputCodingTableKorean::GetResponse(int) -{ - return m_words; -} - -bool CInputCodingTableKorean::GetWordListPage(const std::string& strCode, bool isFirstPage) -{ - return false; -} - -void CInputCodingTableKorean::SetTextPrev(const std::string& strTextPrev) -{ - m_strTextPrev = strTextPrev; -} - -int CInputCodingTableKorean::MergeCode(int choseong, int jungseong, int jongseong) -{ - return (unsigned short) 0xAC00 + choseong * 21 * 28 + jungseong * 28 + jongseong + 1; -} - -// Reference -// https://en.wikipedia.org/wiki/Hangul -// http://www.theyt.net/wiki/%ED%95%9C%EC%98%81%ED%83%80%EB%B3%80%ED%99%98%EA%B8%B0 - -std::wstring CInputCodingTableKorean::InputToKorean(const std::wstring& input) -{ - std::wstring dicEnglish = //L"rRseEfaqQtTdwWczxvgkoiOjpuPhynbml"; - { 0x72, 0x52, 0x73, 0x65, 0x45, 0x66, 0x61, 0x71, 0x51, 0x74, 0x54, 0x64, 0x77, 0x57, 0x63, 0x7A, 0x78, 0x76, 0x67, 0x6B, 0x6F, 0x69, 0x4F, 0x6A, 0x70, 0x75, 0x50, 0x68, 0x79, 0x6E, 0x62, 0x6D, 0x6C }; - std::wstring dicKorean = //L"ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅛㅜㅠㅡㅣ"; - { 0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x315b, 0x315c, 0x3160, 0x3161, 0x3163 }; - std::wstring dicChoseong = //L"ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ"; - { 0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e }; - std::wstring dicJungseong = //L"ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ"; - { 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163 }; - std::wstring dicJongseong = //L"ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ"; - { 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e }; - - std::wstring korean; - - if (input.empty()) - return korean; - - int choseong = -1, jungseong = -1, jongseong = -1; - - for (unsigned int i = 0; i < input.size(); i++) - { - wchar_t ch = input.at(i); - int key = dicKorean.find(ch); - - // H/W Keyboard input with English will be changed to Korean - // because H/W input in Korean is not supported. - if (key == -1) - key = dicEnglish.find(ch); - - if (key == -1) // If not Korean and English - { - // If there is remained Korean, merge code into character - if (choseong != -1) // There is choseong - { - if (jungseong != -1) // choseong+jungseong+(jongseong) - korean += MergeCode(choseong, jungseong, jongseong); - else // Only choseong - korean += dicChoseong.at(choseong); - } - else - { - if (jungseong != -1) // Jungseong - korean += dicJungseong.at(jungseong); - - if (jongseong != -1) // Jongseong - korean += dicJongseong.at(jongseong); - } - choseong = -1; - jungseong = -1; - jongseong = -1; - korean += ch; - } - else if (key < 19) // If key is consonant, key could be choseong or jungseong - { - if (jungseong != -1) - { - if (choseong == -1) // Jungseong without choseong cannot have jongseong. - // So inputted key is jungseong character, new character is begun. - { - korean += dicJungseong.at(jungseong); - jungseong = -1; - choseong = key; - } - else // Jungseong with choseong can have jongseong. - { - if (jongseong == -1) // Chongseong can have two consonant. So this is first consonant of chongseong. - { - jongseong = dicJongseong.find(dicKorean.at(key)); - if (jongseong == -1) // This consonant cannot be jongseong. ex) "ㄸ", "ㅃ", "ㅉ" - { - korean += MergeCode(choseong, jungseong, jongseong); - choseong = dicChoseong.find(dicKorean.at(key)); - jungseong = -1; - } - } - else if (jongseong == 0 && key == 9) // "ㄳ" - jongseong = 2; - else if (jongseong == 3 && key == 12) // "ㄵ" - jongseong = 4; - else if (jongseong == 3 && key == 18) // "ㄶ" - jongseong = 5; - else if (jongseong == 7 && key == 0) // "ㄺ" - jongseong = 8; - else if (jongseong == 7 && key == 6) // "ㄻ" - jongseong = 9; - else if (jongseong == 7 && key == 7) // "ㄼ" - jongseong = 10; - else if (jongseong == 7 && key == 9) // "ㄽ" - jongseong = 11; - else if (jongseong == 7 && key == 16) // "ㄾ" - jongseong = 12; - else if (jongseong == 7 && key == 17) // "ㄿ" - jongseong = 13; - else if (jongseong == 7 && key == 18) // "ㅀ" - jongseong = 14; - else if (jongseong == 16 && key == 9) // "ㅄ" - jongseong = 17; - else // Jongseong is completed. So new consonant is choseong. - { - korean += MergeCode(choseong, jungseong, jongseong); - choseong = dicChoseong.find(dicKorean.at(key)); - jungseong = -1; - jongseong = -1; - } - } - } - else // If there is no jungseong, new consonant can be choseong or second part of double consonant. - { - if (choseong == -1) // New consonant is choseong. Also it could be first part of double consonant. - { - if (jongseong != -1) // If choseong is already completed, new consonant is another choseong. - // So previous character has only jongseong. - { - korean += dicJongseong.at(jongseong); - jongseong = -1; - } - choseong = dicChoseong.find(dicKorean.at(key)); - } - // Find double consonant of chongseong - else if (choseong == 0 && key == 9) // "ㄳ" - { - choseong = -1; - jongseong = 2; - } - else if (choseong == 2 && key == 12) // "ㄵ" - { - choseong = -1; - jongseong = 4; - } - else if (choseong == 2 && key == 18) // "ㄶ" - { - choseong = -1; - jongseong = 5; - } - else if (choseong == 5 && key == 0) // "ㄺ" - { - choseong = -1; - jongseong = 8; - } - else if (choseong == 5 && key == 6) // "ㄻ" - { - choseong = -1; - jongseong = 9; - } - else if (choseong == 5 && key == 7) // "ㄼ" - { - choseong = -1; - jongseong = 10; - } - else if (choseong == 5 && key == 9) // "ㄽ" - { - choseong = -1; - jongseong = 11; - } - else if (choseong == 5 && key == 16) // "ㄾ" - { - choseong = -1; - jongseong = 12; - } - else if (choseong == 5 && key == 17) // "ㄿ" - { - choseong = -1; - jongseong = 13; - } - else if (choseong == 5 && key == 18) // "ㅀ" - { - choseong = -1; - jongseong = 14; - } - else if (choseong == 7 && key == 9) // "ㅄ" - { - choseong = -1; - jongseong = 17; - } - else // In this case, previous character has only choseong. And new consonant is choseong. - { - korean += dicChoseong.at(choseong); - choseong = dicChoseong.find(dicKorean.at(key)); - } - } - } - else // If key is vowel, key is jungseong. - { - if (jongseong != -1) // If previous character has jongseong and this key is jungseong, - // actually latest vowel is not jongseong. It's choseong of new character. - { - // If jongseong of previous character is double consonant, we will seperate it to two vowel again. - // First part of double consonant is jongseong of previous character. - // Second part of double consonant is choseong of current character. - int newCho; - if (jongseong == 2) // "ㄱ, ㅅ" - { - jongseong = 0; - newCho = 9; - } - else if (jongseong == 4) // "ㄴ, ㅈ" - { - jongseong = 3; - newCho = 12; - } - else if (jongseong == 5) // "ㄴ, ㅎ" - { - jongseong = 3; - newCho = 18; - } - else if (jongseong == 8) // "ㄹ, ㄱ" - { - jongseong = 7; - newCho = 0; - } - else if (jongseong == 9) // "ㄹ, ㅁ" - { - jongseong = 7; - newCho = 6; - } - else if (jongseong == 10) // "ㄹ, ㅂ" - { - jongseong = 7; - newCho = 7; - } - else if (jongseong == 11) // "ㄹ, ㅅ" - { - jongseong = 7; - newCho = 9; - } - else if (jongseong == 12) // "ㄹ, ㅌ" - { - jongseong = 7; - newCho = 16; - } - else if (jongseong == 13) // "ㄹ, ㅍ" - { - jongseong = 7; - newCho = 17; - } - else if (jongseong == 14) // "ㄹ, ㅎ" - { - jongseong = 7; - newCho = 18; - } - else if (jongseong == 17) // "ㅂ, ㅅ" - { - jongseong = 16; - newCho = 9; - } - else // If jongseong is single consonant, previous character has no chongseong. - // It's choseong of current character. - { - newCho = dicChoseong.find(dicJongseong.at(jongseong)); - jongseong = -1; - } - if (choseong != -1) // If previous character has choseong and jungseong. - korean += MergeCode(choseong, jungseong, jongseong); - else // If previous character has Jongseong only. - korean += dicJongseong.at(jongseong); - - choseong = newCho; - jungseong = -1; - jongseong = -1; - } - if (jungseong == -1) // If this key is first vowel, it's first part of jungseong. - { - jungseong = dicJungseong.find(dicKorean.at(key)); - } - // If there is jungseong already, jungseong is double vowel. - else if (jungseong == 8 && key == 19) // "ㅘ" - jungseong = 9; - else if (jungseong == 8 && key == 20) // "ㅙ" - jungseong = 10; - else if (jungseong == 8 && key == 32) // "ㅚ" - jungseong = 11; - else if (jungseong == 13 && key == 23) // "ㅝ" - jungseong = 14; - else if (jungseong == 13 && key == 24) // "ㅞ" - jungseong = 15; - else if (jungseong == 13 && key == 32) // "ㅟ" - jungseong = 16; - else if (jungseong == 18 && key == 32) // "ㅢ" - jungseong = 19; - else // If two vowel cannot be double vowel. - { - if (choseong != -1) // Previous character is completed. - // Current character is begin with jungseong. - { - korean += MergeCode(choseong, jungseong, jongseong); - choseong = -1; - } - else // Previous character has jungseon only. - korean += dicJungseong.at(jungseong); - jungseong = -1; - korean += dicKorean.at(key); - } - } - } - - // Process last character - if (choseong != -1) - { - if (jungseong != -1) // Current character has choseong and jungseong. - korean += MergeCode(choseong, jungseong, jongseong); - else // Current character has choseong only. - korean += dicChoseong.at(choseong); - } - else - { - if (jungseong != -1) // Current character has jungseong only - korean += dicJungseong.at(jungseong); - else if (jongseong != -1) // Current character has jongseong only - korean += dicJongseong.at(jongseong); - } - - return korean; -} - -std::string CInputCodingTableKorean::ConvertString(const std::string& strCode) -{ - std::wstring input; - std::string result; - g_charsetConverter.utf8ToW(strCode, input); - InputToKorean(input); - g_charsetConverter.wToUTF8(InputToKorean(input), result); - return m_strTextPrev + result; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableKorean.h kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableKorean.h --- kodi-16.1~git20160425.1001-final/xbmc/input/InputCodingTableKorean.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputCodingTableKorean.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -#pragma once - -/* -* Copyright (C) 2005-2015 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include "InputCodingTable.h" -#include -#include - -class CInputCodingTableKorean : public IInputCodingTable -{ -public: - CInputCodingTableKorean(); - virtual ~CInputCodingTableKorean() {} - - virtual bool GetWordListPage(const std::string& strCode, bool isFirstPage); - virtual std::vector GetResponse(int); - - virtual void SetTextPrev(const std::string& strTextPrev); - virtual std::string ConvertString(const std::string& strCode); - virtual int GetType() { return TYPE_CONVERT_STRING; } - -protected: - int MergeCode(int choseong, int jungseong, int jongseong); - std::wstring InputToKorean(const std::wstring& input); - -private: - std::vector m_words; - std::string m_strTextPrev; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputManager.cpp kodi-15.2~git20151019.1039-final/xbmc/input/InputManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/InputManager.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,7 @@ #include "Application.h" #include "InputManager.h" #include "input/Key.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "guilib/Geometry.h" #include "guilib/GUIAudioManager.h" #include "guilib/GUIControl.h" @@ -43,9 +43,9 @@ #include "input/windows/IRServerSuite.h" #endif -#if HAVE_SDL_VERSION == 1 +#if SDL_VERSION == 1 #include -#elif HAVE_SDL_VERSION == 2 +#elif SDL_VERSION == 2 #include #endif @@ -73,10 +73,9 @@ using EVENTSERVER::CEventServer; #endif -using namespace KODI::MESSAGING; using PERIPHERALS::CPeripherals; -CInputManager& CInputManager::GetInstance() +CInputManager& CInputManager::Get() { static CInputManager inputManager; return inputManager; @@ -96,7 +95,7 @@ m_Keyboard.Initialize(); m_Mouse.Initialize(); - m_Mouse.SetEnabled(CSettings::GetInstance().GetBool(CSettings::SETTING_INPUT_ENABLEMOUSE)); + m_Mouse.SetEnabled(CSettings::Get().GetBool("input.enablemouse")); } void CInputManager::ReInitializeJoystick() @@ -458,40 +457,11 @@ switch (newEvent.type) { case XBMC_KEYDOWN: - { m_Keyboard.ProcessKeyDown(newEvent.key.keysym); - CKey key = m_Keyboard.TranslateKey(newEvent.key.keysym); - if (key.GetButtonCode() == m_LastKey.GetButtonCode() && m_LastKey.GetButtonCode() & CKey::MODIFIER_LONG) - { - // Do not repeat long presses - break; - } - if (!CButtonTranslator::GetInstance().HasLonpressMapping(g_windowManager.GetActiveWindowID(), key)) - { - m_LastKey.Reset(); - OnKey(key); - } - else - { - if (key.GetButtonCode() != m_LastKey.GetButtonCode() && key.GetButtonCode() & CKey::MODIFIER_LONG) - { - m_LastKey = key; // OnKey is reentrant; need to do this before entering - OnKey(key); - } - m_LastKey = key; - } + OnKey(m_Keyboard.TranslateKey(newEvent.key.keysym)); break; - } case XBMC_KEYUP: m_Keyboard.ProcessKeyUp(); - if (m_LastKey.GetButtonCode() != KEY_INVALID && !(m_LastKey.GetButtonCode() & CKey::MODIFIER_LONG)) - { - CKey key = m_LastKey; - m_LastKey.Reset(); // OnKey is reentrant; need to do this before entering - OnKey(key); - } - else - m_LastKey.Reset(); break; case XBMC_MOUSEBUTTONDOWN: case XBMC_MOUSEBUTTONUP: @@ -520,23 +490,20 @@ if ((actionId >= ACTION_TOUCH_TAP && actionId <= ACTION_GESTURE_END) || (actionId >= ACTION_MOUSE_START && actionId <= ACTION_MOUSE_END)) - { - auto action = new CAction(actionId, 0, newEvent.touch.x, newEvent.touch.y, newEvent.touch.x2, newEvent.touch.y2); - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(action)); - } + CApplicationMessenger::Get().SendAction(CAction(actionId, 0, newEvent.touch.x, newEvent.touch.y, newEvent.touch.x2, newEvent.touch.y2), WINDOW_INVALID, false); else { if (actionId == ACTION_BUILT_IN_FUNCTION && !actionString.empty()) - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(actionId, actionString))); + CApplicationMessenger::Get().SendAction(CAction(actionId, actionString), WINDOW_INVALID, false); else - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(actionId))); + CApplicationMessenger::Get().SendAction(CAction(actionId), WINDOW_INVALID, false); } // Post an unfocus message for touch device after the action. if (newEvent.touch.action == ACTION_GESTURE_END || newEvent.touch.action == ACTION_TOUCH_TAP) { CGUIMessage msg(GUI_MSG_UNFOCUS_ALL, 0, 0, 0, 0); - CApplicationMessenger::GetInstance().SendGUIMessage(msg); + CApplicationMessenger::Get().SendGUIMessage(msg); } break; } //case @@ -574,14 +541,12 @@ if (StringUtils::StartsWithNoCase(action.GetName(), "CECToggleState")) { CLog::LogF(LOGDEBUG, "action %s [%d], toggling state of playing device", action.GetName().c_str(), action.GetID()); - bool result; - CApplicationMessenger::GetInstance().SendMsg(TMSG_CECTOGGLESTATE, 0, 0, static_cast(&result)); - if (!result) + if (!CApplicationMessenger::Get().CECToggleState()) return true; } else { - CApplicationMessenger::GetInstance().PostMsg(TMSG_CECSTANDBY); + CApplicationMessenger::Get().CECStandby(); return true; } } @@ -865,11 +830,11 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_INPUT_ENABLEMOUSE) + if (settingId == "input.enablemouse") m_Mouse.SetEnabled(dynamic_cast(setting)->GetValue()); #if defined(HAS_SDL_JOYSTICK) - if (settingId == CSettings::SETTING_INPUT_ENABLEJOYSTICK) + if (settingId == "input.enablejoystick") m_Joystick.SetEnabled(dynamic_cast(setting)->GetValue() && PERIPHERALS::CPeripheralImon::GetCountOfImonsConflictWithDInput() == 0); #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/InputManager.h kodi-15.2~git20151019.1039-final/xbmc/input/InputManager.h --- kodi-16.1~git20160425.1001-final/xbmc/input/InputManager.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/InputManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -53,7 +53,7 @@ public: /*! \brief static method to get the current instance of the class. Creates a new instance the first time it's called. */ - static CInputManager& GetInstance(); + static CInputManager& Get(); /*! \brief decode an input event from remote controls. @@ -223,7 +223,7 @@ */ int ExecuteBuiltin(const std::string& execute, const std::vector& params); - virtual void OnSettingChanged(const CSetting *setting) override; + virtual void OnSettingChanged(const CSetting *setting); private: @@ -255,7 +255,6 @@ CKeyboardStat m_Keyboard; CMouseStat m_Mouse; - CKey m_LastKey; #if defined(HAS_LIRC) || defined(HAS_IRSERVERSUITE) CRemoteControl m_RemoteControl; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/KeyboardLayout.cpp kodi-15.2~git20151019.1039-final/xbmc/input/KeyboardLayout.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/KeyboardLayout.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/KeyboardLayout.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2013 Team Kodi - * http://kodi.tv + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,12 +27,9 @@ #include "utils/log.h" #include "utils/StringUtils.h" #include "utils/XBMCTinyXML.h" -#include "InputCodingTableFactory.h" CKeyboardLayout::CKeyboardLayout() -{ - m_codingtable = NULL; -} +{ } CKeyboardLayout::~CKeyboardLayout() { } @@ -68,10 +65,6 @@ } const TiXmlElement *keyboard = element->FirstChildElement("keyboard"); - if (element->Attribute("codingtable")) - m_codingtable = CInputCodingTableFactory::CreateCodingTable(element->Attribute("codingtable"), element); - else - m_codingtable = NULL; while (keyboard != NULL) { // parse modifiers keys diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/KeyboardLayout.h kodi-15.2~git20151019.1039-final/xbmc/input/KeyboardLayout.h --- kodi-16.1~git20160425.1001-final/xbmc/input/KeyboardLayout.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/KeyboardLayout.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2013 Team Kodi - * http://kodi.tv + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,14 +24,12 @@ #include class TiXmlElement; -class IInputCodingTable; class CKeyboardLayout { public: CKeyboardLayout(); virtual ~CKeyboardLayout(); - IInputCodingTable* GetCodingTable() { return m_codingtable; } bool Load(const TiXmlElement* element); @@ -58,5 +56,4 @@ std::string m_language; std::string m_layout; Keyboards m_keyboards; - IInputCodingTable* m_codingtable; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/KeyboardLayoutManager.cpp kodi-15.2~git20151019.1039-final/xbmc/input/KeyboardLayoutManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/KeyboardLayoutManager.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/KeyboardLayoutManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,13 +18,12 @@ * */ -#include "KeyboardLayoutManager.h" - #include +#include "KeyboardLayoutManager.h" #include "FileItem.h" -#include "filesystem/Directory.h" #include "URL.h" +#include "filesystem/Directory.h" #include "utils/log.h" #include "utils/XBMCTinyXML.h" @@ -35,7 +34,7 @@ Unload(); } -CKeyboardLayoutManager& CKeyboardLayoutManager::GetInstance() +CKeyboardLayoutManager& CKeyboardLayoutManager::Get() { static CKeyboardLayoutManager s_instance; return s_instance; @@ -129,7 +128,7 @@ void CKeyboardLayoutManager::SettingOptionsKeyboardLayoutsFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void* data) { - for (KeyboardLayouts::const_iterator it = CKeyboardLayoutManager::GetInstance().m_layouts.begin(); it != CKeyboardLayoutManager::GetInstance().m_layouts.end(); ++it) + for (KeyboardLayouts::const_iterator it = CKeyboardLayoutManager::Get().m_layouts.begin(); it != CKeyboardLayoutManager::Get().m_layouts.end(); ++it) { std::string name = it->second.GetName(); list.push_back(make_pair(name, name)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/KeyboardLayoutManager.h kodi-15.2~git20151019.1039-final/xbmc/input/KeyboardLayoutManager.h --- kodi-16.1~git20160425.1001-final/xbmc/input/KeyboardLayoutManager.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/KeyboardLayoutManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,6 @@ #include #include -#include #include "input/KeyboardLayout.h" @@ -34,7 +33,7 @@ public: virtual ~CKeyboardLayoutManager(); - static CKeyboardLayoutManager& GetInstance(); + static CKeyboardLayoutManager& Get(); bool Load(const std::string& path = ""); void Unload(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/KeyboardStat.cpp kodi-15.2~git20151019.1039-final/xbmc/input/KeyboardStat.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/KeyboardStat.cpp 2016-02-08 04:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/KeyboardStat.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,8 +32,7 @@ #include "threads/SystemClock.h" #include "utils/log.h" -#define HOLD_THRESHOLD 250 - +using namespace std; using namespace PERIPHERALS; bool operator==(const XBMC_keysym& lhs, const XBMC_keysym& rhs) @@ -60,7 +59,7 @@ bool CKeyboardStat::LookupSymAndUnicodePeripherals(XBMC_keysym &keysym, uint8_t *key, char *unicode) { - std::vector hidDevices; + vector hidDevices; if (g_peripherals.GetPeripheralsWithFeature(hidDevices, FEATURE_HID)) { for (unsigned int iDevicePtr = 0; iDevicePtr < hidDevices.size(); iDevicePtr++) @@ -160,8 +159,6 @@ if (keysym == m_lastKeysym) { held = XbmcThreads::SystemClockMillis() - m_lastKeyTime; - if (held > HOLD_THRESHOLD) - modifiers |= CKey::MODIFIER_LONG; } // For all shift-X keys except shift-A to shift-Z and shift-F1 to shift-F24 the @@ -219,8 +216,6 @@ keyname.append("win-"); if (KeyID & CKey::MODIFIER_META) keyname.append("meta-"); - if (KeyID & CKey::MODIFIER_LONG) - keyname.append("long-"); // Now get the key name diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/Key.h kodi-15.2~git20151019.1039-final/xbmc/input/Key.h --- kodi-16.1~git20160425.1001-final/xbmc/input/Key.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/Key.h 2015-10-19 08:39:16.000000000 +0000 @@ -180,6 +180,13 @@ #define REMOTE_9 67 #define ACTION_PLAY 68 // Unused at the moment +#define ACTION_OSD_SHOW_LEFT 69 // Move left in OSD. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_OSD_SHOW_RIGHT 70 // Move right in OSD. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_OSD_SHOW_UP 71 // Move up in OSD. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_OSD_SHOW_DOWN 72 // Move down in OSD. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_OSD_SHOW_SELECT 73 // toggle/select option in OSD. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_OSD_SHOW_VALUE_PLUS 74 // increase value of current option in OSD. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_OSD_SHOW_VALUE_MIN 75 // decrease value of current option in OSD. Can b used in videoFullScreen.xml window id=2005 #define ACTION_SMALL_STEP_BACK 76 // jumps a few seconds back during playback of movie. Can b used in videoFullScreen.xml window id=2005 #define ACTION_PLAYER_FORWARD 77 // FF in current file played. global action, can be used anywhere @@ -189,6 +196,8 @@ #define ACTION_DELETE_ITEM 80 // delete current selected item. Can be used in myfiles.xml window id=3 and in myvideoTitle.xml window id=25 #define ACTION_COPY_ITEM 81 // copy current selected item. Can be used in myfiles.xml window id=3 #define ACTION_MOVE_ITEM 82 // move current selected item. Can be used in myfiles.xml window id=3 +#define ACTION_SHOW_MPLAYER_OSD 83 // toggles mplayers OSD. Can be used in videofullscreen.xml window id=2005 +#define ACTION_OSD_HIDESUBMENU 84 // removes an OSD sub menu. Can be used in videoOSD.xml window id=2901 #define ACTION_TAKE_SCREENSHOT 85 // take a screenshot #define ACTION_RENAME_ITEM 87 // rename item @@ -287,7 +296,6 @@ #define ACTION_AUDIO_DELAY 161 #define ACTION_SUBTITLE_DELAY 162 -#define ACTION_MENU 163 #define ACTION_RECORD 170 @@ -505,7 +513,6 @@ CKey(uint32_t buttonCode, unsigned int held); CKey(uint8_t vkey, wchar_t unicode, char ascii, uint32_t modifiers, unsigned int held); CKey(const CKey& key); - void Reset(); virtual ~CKey(void); CKey& operator=(const CKey& key); @@ -535,11 +542,12 @@ MODIFIER_ALT = 0x00040000, MODIFIER_RALT = 0x00080000, MODIFIER_SUPER = 0x00100000, - MODIFIER_META = 0X00200000, - MODIFIER_LONG = 0X01000000 + MODIFIER_META = 0X00200000 }; private: + void Reset(); + uint32_t m_buttonCode; uint8_t m_vkey; wchar_t m_unicode; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/linux/LinuxInputDevices.cpp kodi-15.2~git20151019.1039-final/xbmc/input/linux/LinuxInputDevices.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/linux/LinuxInputDevices.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/linux/LinuxInputDevices.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -96,8 +96,6 @@ #include "LinuxInputDevices.h" #include "input/MouseStat.h" #include "utils/log.h" -#include "input/touch/generic/GenericTouchActionHandler.h" -#include "input/touch/generic/GenericTouchInputHandler.h" #ifndef BITS_PER_LONG #define BITS_PER_LONG (sizeof(long) * 8) @@ -235,7 +233,6 @@ { KEY_COMPOSE , XBMCK_LSUPER }, { KEY_STOP , XBMCK_MEDIA_STOP }, { KEY_HELP , XBMCK_HELP }, - { KEY_MENU , XBMCK_MENU }, { KEY_CLOSECD , XBMCK_EJECT }, { KEY_EJECTCD , XBMCK_EJECT }, { KEY_EJECTCLOSECD , XBMCK_EJECT }, @@ -255,24 +252,13 @@ { KEY_PRINT , XBMCK_PRINT }, { KEY_QUESTION , XBMCK_HELP }, { KEY_BACK , XBMCK_BACKSPACE }, - { KEY_ZOOM , XBMCK_ZOOM }, - { KEY_TEXT , XBMCK_TEXT }, - { KEY_FAVORITES , XBMCK_FAVORITES }, - { KEY_RED , XBMCK_RED }, - { KEY_GREEN , XBMCK_GREEN }, - { KEY_YELLOW , XBMCK_YELLOW }, - { KEY_BLUE , XBMCK_BLUE }, - { KEY_HOMEPAGE , XBMCK_HOMEPAGE }, - { KEY_MAIL , XBMCK_LAUNCH_MAIL }, - { KEY_SEARCH , XBMCK_BROWSER_SEARCH}, - { KEY_FILE , XBMCK_LAUNCH_FILE_BROWSER}, - { KEY_SELECT , XBMCK_RETURN }, - { KEY_CONFIG , XBMCK_CONFIG }, // The Little Black Box Remote Additions { 384 , XBMCK_LEFT }, // Red { 378 , XBMCK_RIGHT }, // Green { 381 , XBMCK_UP }, // Yellow { 366 , XBMCK_DOWN }, // Blue + // Rii i7 Home button / wetek openelec remote (code 172) + { KEY_HOMEPAGE , XBMCK_HOME }, }; typedef enum @@ -281,8 +267,7 @@ LI_DEVICE_MOUSE = 1, LI_DEVICE_JOYSTICK = 2, LI_DEVICE_KEYBOARD = 4, - LI_DEVICE_REMOTE = 8, - LI_DEVICE_MULTITOUCH = 16 + LI_DEVICE_REMOTE = 8 } LinuxInputDeviceType; typedef enum @@ -316,10 +301,6 @@ m_deviceMaxKeyCode = 0; m_deviceMaxAxis = 0; m_bUnplugged = false; - m_mt_currentSlot = 0; - memset(&m_mt_x, 0, sizeof(m_mt_x)); - memset(&m_mt_y, 0, sizeof(m_mt_y)); - memset(&m_mt_event, 0, sizeof(m_mt_event)); Open(); } @@ -577,27 +558,22 @@ */ bool CLinuxInputDevice::RelEvent(const struct input_event& levt, XBMC_Event& devt) { - bool motion = false; - bool wheel = false; - switch (levt.code) { case REL_X: m_mouseX += levt.value; devt.motion.xrel = levt.value; devt.motion.yrel = 0; - motion = true; break; + case REL_Y: m_mouseY += levt.value; devt.motion.xrel = 0; devt.motion.yrel = levt.value; - motion = true; - break; - case REL_WHEEL: - wheel = (levt.value != 0); // process wheel event only when there was some delta break; + case REL_Z: + case REL_WHEEL: default: CLog::Log(LOGWARNING, "CLinuxInputDevice::RelEvent: Unknown rel event code: %d\n", levt.code); return false; @@ -612,35 +588,13 @@ m_mouseY = std::max(0, m_mouseY); - if (motion) - { - devt.type = XBMC_MOUSEMOTION; - devt.motion.type = XBMC_MOUSEMOTION; - devt.motion.x = m_mouseX; - devt.motion.y = m_mouseY; - devt.motion.state = 0; - devt.motion.which = m_deviceIndex; - } - else if (wheel) - { - devt.type = XBMC_MOUSEBUTTONUP; - devt.button.state = XBMC_RELEASED; - devt.button.type = devt.type; - devt.button.x = m_mouseX; - devt.button.y = m_mouseY; - devt.button.button = (levt.value<0) ? XBMC_BUTTON_WHEELDOWN:XBMC_BUTTON_WHEELUP; - - /* but WHEEL up enent to the queue */ - m_equeue.push_back(devt); - - /* prepare and return WHEEL down event */ - devt.button.state = XBMC_PRESSED; - devt.type = XBMC_MOUSEBUTTONDOWN; - } - else - { - return false; - } + devt.type = XBMC_MOUSEMOTION; + devt.motion.type = XBMC_MOUSEMOTION; + devt.motion.x = m_mouseX; + devt.motion.y = m_mouseY; + devt.motion.state = 0; + devt.motion.which = m_deviceIndex; + return true; } @@ -682,102 +636,11 @@ } /* - * Process multi-touch absolute events - * Only store the information, do not fire event until we receive an EV_SYN - */ -bool CLinuxInputDevice::mtAbsEvent(const struct input_event& levt) -{ - switch (levt.code) - { - case ABS_MT_SLOT: - m_mt_currentSlot = levt.value; - break; - - case ABS_MT_TRACKING_ID: - if (m_mt_currentSlot < TOUCH_MAX_POINTERS) - { - if (levt.value == -1) - m_mt_event[m_mt_currentSlot] = TouchInputUp; - else - m_mt_event[m_mt_currentSlot] = TouchInputDown; - } - break; - - case ABS_MT_POSITION_X: - if (m_mt_currentSlot < TOUCH_MAX_POINTERS) - { - m_mt_x[m_mt_currentSlot] = levt.value; - if (m_mt_event[m_mt_currentSlot] == TouchInputUnchanged) - m_mt_event[m_mt_currentSlot] = TouchInputMove; - } - break; - - case ABS_MT_POSITION_Y: - if (m_mt_currentSlot < TOUCH_MAX_POINTERS) - { - m_mt_y[m_mt_currentSlot] = levt.value; - if (m_mt_event[m_mt_currentSlot] == TouchInputUnchanged) - m_mt_event[m_mt_currentSlot] = TouchInputMove; - } - break; - - default: - return false; - } - - return true; -} - -/* - * Process stored multi-touch events - */ -bool CLinuxInputDevice::mtSynEvent(const struct input_event& levt) -{ - float size = 10.0f; - int64_t nanotime = levt.time.tv_sec * 1000000000LL + levt.time.tv_usec * 1000LL; - - for (int ptr=0; ptr < TOUCH_MAX_POINTERS; ptr++) - { - /* While the comments of ITouchInputHandler::UpdateTouchPointer() say - "If there's an event for every touch action this method does not need to be called at all" - gesture detection currently doesn't work properly without this call. */ - CGenericTouchInputHandler::GetInstance().UpdateTouchPointer(ptr, m_mt_x[ptr], m_mt_y[ptr], nanotime, size); - } - - for (int ptr=0; ptr < TOUCH_MAX_POINTERS; ptr++) - { - if (m_mt_event[ptr] != TouchInputUnchanged) - { - CGenericTouchInputHandler::GetInstance().HandleTouchInput(m_mt_event[ptr], m_mt_x[ptr], m_mt_y[ptr], nanotime, ptr, size); - m_mt_event[ptr] = TouchInputUnchanged; - } - } - - return true; -} - -/* * Translates a Linux input event into a DirectFB input event. */ bool CLinuxInputDevice::TranslateEvent(const struct input_event& levt, XBMC_Event& devt) { - if (m_devicePreferredId == LI_DEVICE_MULTITOUCH) - { - switch (levt.type) - { - case EV_ABS: - return mtAbsEvent(levt); - - case EV_SYN: - return mtSynEvent(levt); - - default: - // Ignore legacy (key) events - return false; - } - } - switch (levt.type) { case EV_KEY: @@ -830,65 +693,57 @@ XBMC_Event devt; - if (m_equeue.empty()) + while (1) { - while (1) - { - bzero(&levt, sizeof(levt)); + bzero(&levt, sizeof(levt)); - bzero(&devt, sizeof(devt)); - devt.type = XBMC_NOEVENT; + bzero(&devt, sizeof(devt)); + devt.type = XBMC_NOEVENT; - if(m_devicePreferredId == LI_DEVICE_NONE) - return devt; + if(m_devicePreferredId == LI_DEVICE_NONE) + return devt; - readlen = read(m_fd, &levt, sizeof(levt)); + readlen = read(m_fd, &levt, sizeof(levt)); - if (readlen <= 0) + if (readlen <= 0) + { + if (errno == ENODEV) { - if (errno == ENODEV) - { - CLog::Log(LOGINFO,"input device was unplugged %s",m_deviceName); - m_bUnplugged = true; - } - - break; + CLog::Log(LOGINFO,"input device was unplugged %s",m_deviceName); + m_bUnplugged = true; } - //printf("read event readlen = %d device name %s m_fileName %s\n", readlen, m_deviceName, m_fileName.c_str()); + break; + } - // sanity check if we realy read the event - if(readlen != sizeof(levt)) - { - CLog::Log(LOGERROR,"CLinuxInputDevice: read error : %s\n", strerror(errno)); - break; - } + //printf("read event readlen = %d device name %s m_fileName %s\n", readlen, m_deviceName, m_fileName.c_str()); - if (!TranslateEvent(levt, devt)) - continue; + // sanity check if we realy read the event + if(readlen != sizeof(levt)) + { + printf("CLinuxInputDevice: read error : %s\n", strerror(errno)); + break; + } - /* Flush previous event with DIEF_FOLLOW? */ - if (devt.type != XBMC_NOEVENT) - { - //printf("new event! type = %d\n", devt.type); - //printf("key: %d %d %d %c\n", devt.key.keysym.scancode, devt.key.keysym.sym, devt.key.keysym.mod, devt.key.keysym.unicode); + if (!TranslateEvent(levt, devt)) + continue; - if (m_hasLeds && (m_keyMods != m_lastKeyMods)) - { - SetLed(LED_NUML, m_keyMods & XBMCKMOD_NUM); - SetLed(LED_CAPSL, m_keyMods & XBMCKMOD_CAPS); - m_lastKeyMods = m_keyMods; - } + /* Flush previous event with DIEF_FOLLOW? */ + if (devt.type != XBMC_NOEVENT) + { + //printf("new event! type = %d\n", devt.type); + //printf("key: %d %d %d %c\n", devt.key.keysym.scancode, devt.key.keysym.sym, devt.key.keysym.mod, devt.key.keysym.unicode); - break; + if (m_hasLeds && (m_keyMods != m_lastKeyMods)) + { + SetLed(LED_NUML, m_keyMods & XBMCKMOD_NUM); + SetLed(LED_CAPSL, m_keyMods & XBMCKMOD_CAPS); + m_lastKeyMods = m_keyMods; } + + break; } } - else - { - devt = m_equeue.front(); - m_equeue.pop_front(); - } return devt; } @@ -897,6 +752,26 @@ { bool enable = true; +#if defined(HAS_LIBAMCODEC) + if (aml_get_device_type() == AML_DEVICE_TYPE_M1 || aml_get_device_type() == AML_DEVICE_TYPE_M3) + { + // ignore the native aml driver named 'key_input', + // it is the dedicated power key handler (am_key_input) + if (strncmp(m_deviceName, "key_input", strlen("key_input")) == 0) + return; + // ignore the native aml driver named 'aml_keypad', + // it is the dedicated IR remote handler (amremote) + else if (strncmp(m_deviceName, "aml_keypad", strlen("aml_keypad")) == 0) + return; + + // turn off any keyboard autorepeat, there is a kernel bug + // where if the cpu is max'ed then key up is missed and + // we get a flood of EV_REP that never stop until next + // key down/up. Very nasty when seeking during video playback. + enable = false; + } +#endif + if (enable) { int kbdrep[2] = { 400, 80 }; @@ -1002,10 +877,6 @@ for (i = 0; i < ABS_PRESSURE; i++) if (test_bit( i, absbit )) num_abs++; - - /* test if it is a multi-touch type B device */ - if (test_bit(ABS_MT_SLOT, absbit)) - m_deviceType |= LI_DEVICE_MULTITOUCH; } /* Mouse, Touchscreen or Smartpad ? */ @@ -1051,11 +922,6 @@ /* Decide which primary input device to be. */ if (m_deviceType & LI_DEVICE_KEYBOARD) m_devicePreferredId = LI_DEVICE_KEYBOARD; - else if (m_deviceType & LI_DEVICE_MULTITOUCH) - { - m_devicePreferredId = LI_DEVICE_MULTITOUCH; - CGenericTouchInputHandler::GetInstance().RegisterHandler(&CGenericTouchActionHandler::GetInstance()); - } else if (m_deviceType & LI_DEVICE_REMOTE) m_devicePreferredId = LI_DEVICE_REMOTE; else if (m_deviceType & LI_DEVICE_JOYSTICK) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/linux/LinuxInputDevices.h kodi-15.2~git20151019.1039-final/xbmc/input/linux/LinuxInputDevices.h --- kodi-16.1~git20160425.1001-final/xbmc/input/linux/LinuxInputDevices.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/linux/LinuxInputDevices.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,12 +22,9 @@ #include #include -#include #include "windowing/XBMC_events.h" #include "input/XBMC_keyboard.h" #include "threads/SingleLock.h" -#include "input/touch/ITouchInputHandler.h" -#include "input/touch/generic/IGenericTouchGestureDetector.h" struct KeymapEntry { @@ -62,8 +59,6 @@ XBMCMod UpdateModifiers(XBMC_Event& devt); bool GetKeymapEntry(KeymapEntry& entry); int KeyboardGetSymbol(unsigned short value); - bool mtAbsEvent(const struct input_event& levt); - bool mtSynEvent(const struct input_event& levt); int m_fd; int m_vt_fd; @@ -84,11 +79,6 @@ int m_deviceMaxAxis; bool m_bSkipNonKeyEvents; bool m_bUnplugged; - std::deque m_equeue; - int m_mt_currentSlot; - int m_mt_x[TOUCH_MAX_POINTERS]; - int m_mt_y[TOUCH_MAX_POINTERS]; - TouchInput m_mt_event[TOUCH_MAX_POINTERS]; }; class CLinuxInputDevices diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/Makefile kodi-15.2~git20151019.1039-final/xbmc/input/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/input/Makefile 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -1,9 +1,5 @@ SRCS=ButtonTranslator.cpp \ InertialScrollingHandler.cpp \ - InputCodingTableBaiduPY.cpp \ - InputCodingTableBasePY.cpp \ - InputCodingTableFactory.cpp \ - InputCodingTableKorean.cpp \ KeyboardLayout.cpp \ KeyboardLayoutManager.cpp \ KeyboardStat.cpp \ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/SDLJoystick.cpp kodi-15.2~git20151019.1039-final/xbmc/input/SDLJoystick.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/SDLJoystick.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/SDLJoystick.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,6 +32,8 @@ #ifdef HAS_SDL_JOYSTICK #include +using namespace std; + CJoystick::CJoystick() { m_joystickEnabled = false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchActionHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchActionHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchActionHandler.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchActionHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,14 +19,12 @@ */ #include "GenericTouchActionHandler.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" #include "windowing/WinEvents.h" -using namespace KODI::MESSAGING; - -CGenericTouchActionHandler &CGenericTouchActionHandler::GetInstance() +CGenericTouchActionHandler &CGenericTouchActionHandler::Get() { static CGenericTouchActionHandler sTouchAction; return sTouchAction; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchActionHandler.h kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchActionHandler.h --- kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchActionHandler.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchActionHandler.h 2015-10-19 08:39:16.000000000 +0000 @@ -34,7 +34,7 @@ /*! \brief Get an instance of the touch input manager */ - static CGenericTouchActionHandler &GetInstance(); + static CGenericTouchActionHandler &Get(); // implementation of ITouchActionHandler virtual void OnTouchAbort(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchInputHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchInputHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchInputHandler.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchInputHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -44,7 +44,7 @@ m_detectors.clear(); } -CGenericTouchInputHandler &CGenericTouchInputHandler::GetInstance() +CGenericTouchInputHandler &CGenericTouchInputHandler::Get() { static CGenericTouchInputHandler sTouchInput; return sTouchInput; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchInputHandler.h kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchInputHandler.h --- kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchInputHandler.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchInputHandler.h 2015-10-19 08:39:16.000000000 +0000 @@ -48,7 +48,7 @@ /*! \brief Get an instance of the touch input manager */ - static CGenericTouchInputHandler &GetInstance(); + static CGenericTouchInputHandler &Get(); // implementation of ITouchInputHandler virtual bool HandleTouchInput(TouchInput event, float x, float y, int64_t time, int32_t pointer = 0, float size = 0.0f); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchPinchDetector.cpp kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchPinchDetector.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchPinchDetector.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchPinchDetector.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,7 +22,7 @@ bool CGenericTouchPinchDetector::OnTouchDown(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; if (m_done) @@ -34,7 +34,7 @@ bool CGenericTouchPinchDetector::OnTouchUp(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; if (m_done) @@ -58,7 +58,7 @@ bool CGenericTouchPinchDetector::OnTouchMove(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; if (m_done) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchRotateDetector.cpp kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchRotateDetector.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchRotateDetector.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchRotateDetector.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,7 @@ bool CGenericTouchRotateDetector::OnTouchDown(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; if (m_done) @@ -46,7 +46,7 @@ bool CGenericTouchRotateDetector::OnTouchUp(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; if (m_done) @@ -70,7 +70,7 @@ bool CGenericTouchRotateDetector::OnTouchMove(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; if (m_done) @@ -117,7 +117,7 @@ bool CGenericTouchRotateDetector::OnTouchUpdate(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; if (m_done) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchSwipeDetector.cpp kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchSwipeDetector.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/touch/generic/GenericTouchSwipeDetector.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/touch/generic/GenericTouchSwipeDetector.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -45,7 +45,7 @@ bool CGenericTouchSwipeDetector::OnTouchDown(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; m_size += 1; @@ -62,7 +62,7 @@ bool CGenericTouchSwipeDetector::OnTouchUp(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; m_size -= 1; @@ -91,7 +91,7 @@ bool CGenericTouchSwipeDetector::OnTouchMove(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; // only handle swipes of moved pointers @@ -173,7 +173,7 @@ bool CGenericTouchSwipeDetector::OnTouchUpdate(unsigned int index, const Pointer &pointer) { - if (index >= TOUCH_MAX_POINTERS) + if (index < 0 || index >= TOUCH_MAX_POINTERS) return false; if (m_done) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/touch/ITouchInputHandler.h kodi-15.2~git20151019.1039-final/xbmc/input/touch/ITouchInputHandler.h --- kodi-16.1~git20160425.1001-final/xbmc/input/touch/ITouchInputHandler.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/touch/ITouchInputHandler.h 2015-10-19 08:39:16.000000000 +0000 @@ -28,7 +28,6 @@ * \brief Touch input event */ typedef enum { - TouchInputUnchanged = 0, TouchInputAbort, TouchInputDown, TouchInputUp, diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/windows/WINJoystick.cpp kodi-15.2~git20151019.1039-final/xbmc/input/windows/WINJoystick.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/windows/WINJoystick.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/windows/WINJoystick.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,6 +26,8 @@ #include #include +using namespace std; + extern HWND g_hWnd; #define MAX_AXISAMOUNT 32768 @@ -116,7 +118,7 @@ CLog::Log(LOGNOTICE, __FUNCTION__" : Total Axis: %d Total Hats: %d Total Buttons: %d", diDevCaps.dwAxes, diDevCaps.dwPOVs, diDevCaps.dwButtons); p_this->m_pJoysticks.push_back(pJoystick); std::string joyName(pdidInstance->tszProductName); - p_this->m_JoystickNames.push_back(joyName); + p_this->m_JoystickNames.push_back(joyName);; p_this->m_Axes.resize(p_this->m_Axes.size() + 6); // dinput hardcodes to 6 axes p_this->m_devCaps.push_back(diDevCaps); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/windows/WINJoystick.h kodi-15.2~git20151019.1039-final/xbmc/input/windows/WINJoystick.h --- kodi-16.1~git20160425.1001-final/xbmc/input/windows/WINJoystick.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/windows/WINJoystick.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,14 +19,12 @@ * */ -#include +#include +#include #include +#include #include -#include #include -#include -#include - #include "threads/CriticalSection.h" #define JACTIVE_BUTTON 0x00000001 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/XBMC_keysym.h kodi-15.2~git20151019.1039-final/xbmc/input/XBMC_keysym.h --- kodi-16.1~git20160425.1001-final/xbmc/input/XBMC_keysym.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/XBMC_keysym.h 2015-04-04 00:00:16.000000000 +0000 @@ -224,11 +224,6 @@ XBMCK_GREEN = 0x148, XBMCK_YELLOW = 0x149, XBMCK_BLUE = 0x14a, - XBMCK_ZOOM = 0x14b, - XBMCK_TEXT = 0x14c, - XBMCK_FAVORITES = 0x14d, - XBMCK_HOMEPAGE = 0x14e, - XBMCK_CONFIG = 0x14f, // Add any other keys here diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/XBMC_keytable.cpp kodi-15.2~git20151019.1039-final/xbmc/input/XBMC_keytable.cpp --- kodi-16.1~git20160425.1001-final/xbmc/input/XBMC_keytable.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/XBMC_keytable.cpp 2015-04-04 00:00:16.000000000 +0000 @@ -238,11 +238,6 @@ , { XBMCK_GREEN, 0, 0, XBMCVK_GREEN, "green" } , { XBMCK_YELLOW, 0, 0, XBMCVK_YELLOW, "yellow" } , { XBMCK_BLUE, 0, 0, XBMCVK_BLUE, "blue" } -, { XBMCK_ZOOM, 0, 0, XBMCVK_ZOOM, "zoom" } -, { XBMCK_TEXT, 0, 0, XBMCVK_TEXT, "text" } -, { XBMCK_FAVORITES, 0, 0, XBMCVK_FAVORITES, "favorites" } -, { XBMCK_HOMEPAGE , 0, 0, XBMCVK_HOMEPAGE, "homepage" } -, { XBMCK_CONFIG, 0, 0, XBMCVK_CONFIG, "config" } }; static int XBMCKeyTableSize = sizeof(XBMCKeyTable)/sizeof(XBMCKEYTABLE); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/input/XBMC_vkeys.h kodi-15.2~git20151019.1039-final/xbmc/input/XBMC_vkeys.h --- kodi-16.1~git20160425.1001-final/xbmc/input/XBMC_vkeys.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/input/XBMC_vkeys.h 2015-04-04 00:00:16.000000000 +0000 @@ -216,11 +216,6 @@ XBMCVK_GREEN = 0xE4, XBMCVK_YELLOW = 0xE5, XBMCVK_BLUE = 0xE6, - XBMCVK_ZOOM = 0xE7, - XBMCVK_TEXT = 0xE8, - XBMCVK_FAVORITES = 0xE9, - XBMCVK_HOMEPAGE = 0xEA, - XBMCVK_CONFIG = 0xEB, XBMCVK_LAST = 0xFF } XBMCVKey; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/AnnouncementManager.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/AnnouncementManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/AnnouncementManager.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/AnnouncementManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,6 +33,7 @@ #define LOOKUP_PROPERTY "database-lookup" +using namespace std; using namespace ANNOUNCEMENT; CAnnouncementManager::CAnnouncementManager() @@ -43,7 +44,7 @@ Deinitialize(); } -CAnnouncementManager& CAnnouncementManager::GetInstance() +CAnnouncementManager& CAnnouncementManager::Get() { static CAnnouncementManager s_instance; return s_instance; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/AnnouncementManager.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/AnnouncementManager.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/AnnouncementManager.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/AnnouncementManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,8 +25,6 @@ #include "threads/CriticalSection.h" #include "utils/GlobalsHandling.h" -class CVariant; - namespace ANNOUNCEMENT { class CAnnouncementManager @@ -34,7 +32,7 @@ public: virtual ~CAnnouncementManager(); - static CAnnouncementManager& GetInstance(); + static CAnnouncementManager& Get(); void Deinitialize(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/AddonBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/AddonBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/AddonBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/AddonBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,311 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "AddonBuiltins.h" - -#include - -#include "addons/AddonManager.h" -#include "addons/GUIDialogAddonSettings.h" -#include "addons/GUIWindowAddonBrowser.h" -#include "addons/PluginSource.h" -#include "addons/RepositoryUpdater.h" -#include "FileItem.h" -#include "filesystem/PluginDirectory.h" -#include "guilib/GUIWindowManager.h" -#include "GUIUserMessages.h" -#include "interfaces/generic/ScriptInvocationManager.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" - -#if defined(TARGET_DARWIN) -#include "filesystem/SpecialProtocol.h" -#include "osx/CocoaInterface.h" -#endif - -using namespace ADDON; - -/*! \brief Run a plugin. - * \param params The parameters. - * \details params[0] = plugin:// URL to script. - */ -static int RunPlugin(const std::vector& params) -{ - if (params.size()) - { - CFileItem item(params[0]); - if (!item.m_bIsFolder) - { - item.SetPath(params[0]); - XFILE::CPluginDirectory::RunScriptWithParams(item.GetPath()); - } - } - else - CLog::Log(LOGERROR, "RunPlugin called with no arguments."); - - return 0; -} - -/*! \brief Run a script or plugin add-on. - * \param params The parameters. - * \details params[0] = add-on id. - * params[1] is blank for no add-on parameters - * or - * params[1] = add-on parameters in url format - * or - * params[1,...] = additional parameters in format param=value. - */ -static int RunAddon(const std::vector& params) -{ - if (params.size()) - { - const std::string& addonid = params[0]; - - AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(addonid, addon, ADDON_PLUGIN)) - { - PluginPtr plugin = std::dynamic_pointer_cast(addon); - std::string urlParameters; - std::vector parameters; - if (params.size() == 2 && - (StringUtils::StartsWith(params[1], "/") || StringUtils::StartsWith(params[1], "?"))) - urlParameters = params[1]; - else if (params.size() > 1) - { - parameters.insert(parameters.begin(), params.begin() + 1, params.end()); - urlParameters = "?" + StringUtils::Join(parameters, "&"); - } - else - { - // Add '/' if addon is run without params (will be removed later so it's safe) - // Otherwise there are 2 entries for the same plugin in ViewModesX.db - urlParameters = "/"; - } - - std::string cmd; - if (plugin->Provides(CPluginSource::VIDEO)) - cmd = StringUtils::Format("ActivateWindow(Videos,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); - else if (plugin->Provides(CPluginSource::AUDIO)) - cmd = StringUtils::Format("ActivateWindow(Music,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); - else if (plugin->Provides(CPluginSource::EXECUTABLE)) - cmd = StringUtils::Format("ActivateWindow(Programs,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); - else if (plugin->Provides(CPluginSource::IMAGE)) - cmd = StringUtils::Format("ActivateWindow(Pictures,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); - else - // Pass the script name (addonid) and all the parameters - // (params[1] ... params[x]) separated by a comma to RunPlugin - cmd = StringUtils::Format("RunPlugin(%s)", StringUtils::Join(params, ",").c_str()); - CBuiltins::GetInstance().Execute(cmd); - } - else if (CAddonMgr::GetInstance().GetAddon(addonid, addon, ADDON_SCRIPT) || - CAddonMgr::GetInstance().GetAddon(addonid, addon, ADDON_SCRIPT_WEATHER) || - CAddonMgr::GetInstance().GetAddon(addonid, addon, ADDON_SCRIPT_LYRICS) || - CAddonMgr::GetInstance().GetAddon(addonid, addon, ADDON_SCRIPT_LIBRARY)) - { - // Pass the script name (addonid) and all the parameters - // (params[1] ... params[x]) separated by a comma to RunScript - CBuiltins::GetInstance().Execute(StringUtils::Format("RunScript(%s)", StringUtils::Join(params, ",").c_str())); - } - else - CLog::Log(LOGERROR, "RunAddon: unknown add-on id '%s', or unexpected add-on type (not a script or plugin).", addonid.c_str()); - } - else - { - CLog::Log(LOGERROR, "RunAddon called with no arguments."); - } - - return 0; -} - -/*! \brief Run a script add-on or an apple script. - * \param params The parameters. - * \details params[0] is the URL to the apple script - * or - * params[0] is the addon-ID to the script add-on - * or - * params[0] is the URL to the python script. - * - * Set the OnlyApple template parameter to true to only attempt - * execution of applescripts. - */ -template -static int RunScript(const std::vector& params) -{ -#if defined(TARGET_DARWIN_OSX) - std::string execute; - std::string parameter = params.size() ? params[0] : ""; - if (URIUtils::HasExtension(parameter, ".applescript|.scpt")) - { - std::string osxPath = CSpecialProtocol::TranslatePath(parameter); - Cocoa_DoAppleScriptFile(osxPath.c_str()); - } - else if (OnlyApple) - return 1; - else -#endif - { - AddonPtr addon; - std::string scriptpath; - // Test to see if the param is an addon ID - if (CAddonMgr::GetInstance().GetAddon(params[0], addon)) - { - //Get the correct extension point to run - if (CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT) || - CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_WEATHER) || - CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LYRICS) || - CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LIBRARY)) - { - scriptpath = addon->LibPath(); - } - else - { - //Run a random extension point (old behaviour). - CAddonMgr::GetInstance().GetAddon(params[0], addon); - scriptpath = addon->LibPath(); - CLog::Log(LOGWARNING, "RunScript called for a non-script addon '%s'. This behaviour is deprecated.", params[0].c_str()); - } - } - else - scriptpath = params[0]; - - // split the path up to find the filename - std::vector argv = params; - std::string filename = URIUtils::GetFileName(scriptpath); - if (!filename.empty()) - argv[0] = filename; - - CScriptInvocationManager::GetInstance().ExecuteAsync(scriptpath, addon, argv); - } - - return 0; -} - -/*! \brief Open the settings for the default add-on of a given type. - * \param params The parameters. - * \details params[0] = The add-on type. - */ -static int OpenDefaultSettings(const std::vector& params) -{ - AddonPtr addon; - ADDON::TYPE type = TranslateType(params[0]); - if (CAddonMgr::GetInstance().GetDefault(type, addon)) - { - bool changed = CGUIDialogAddonSettings::ShowAndGetInput(addon); - if (type == ADDON_VIZ && changed) - g_windowManager.SendMessage(GUI_MSG_VISUALISATION_RELOAD, 0, 0); - } - - return 0; -} - -/*! \brief Set the default add-on for a given type. - * \param params The parameters. - * \details params[0] = The add-on type - */ -static int SetDefaultAddon(const std::vector& params) -{ - std::string addonID; - TYPE type = TranslateType(params[0]); - bool allowNone = false; - if (type == ADDON_VIZ) - allowNone = true; - - if (type != ADDON_UNKNOWN && - CGUIWindowAddonBrowser::SelectAddonID(type,addonID,allowNone)) - { - CAddonMgr::GetInstance().SetDefault(type,addonID); - if (type == ADDON_VIZ) - g_windowManager.SendMessage(GUI_MSG_VISUALISATION_RELOAD, 0, 0); - } - - return 0; -} - -/*! \brief Open the settings for a given add-on. - * \param params The parameters. - * \details params[0] = The add-on ID. - */ -static int AddonSettings(const std::vector& params) -{ - AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(params[0], addon)) - CGUIDialogAddonSettings::ShowAndGetInput(addon); - - return 0; -} - -/*! \brief Stop a running script. - * \param params The parameters. - * \details params[0] = The add-on ID of the script to stop - * or - * params[0] = The URL of the script to stop. - */ -static int StopScript(const std::vector& params) -{ - // FIXME: This does not work for addons with multiple extension points! - // Are there any use for this? TODO: Fix hack in CScreenSaver::Destroy() and deprecate. - std::string scriptpath(params[0]); - // Test to see if the param is an addon ID - AddonPtr script; - if (CAddonMgr::GetInstance().GetAddon(params[0], script)) - scriptpath = script->LibPath(); - CScriptInvocationManager::GetInstance().Stop(scriptpath); - - return 0; -} - -/*! \brief Check add-on repositories for updates. - * \param params (ignored) - */ -static int UpdateRepos(const std::vector& params) -{ - CRepositoryUpdater::GetInstance().CheckForUpdates(); - - return 0; -} - -/*! \brief Check local add-on directories for updates. - * \param params (ignored) - */ -static int UpdateLocals(const std::vector& params) -{ - CAddonMgr::GetInstance().FindAddons(); - - return 0; -} - -CBuiltins::CommandMap CAddonBuiltins::GetOperations() const -{ - return { - {"addon.default.opensettings", {"Open a settings dialog for the default addon of the given type", 1, OpenDefaultSettings}}, - {"addon.default.set", {"Open a select dialog to allow choosing the default addon of the given type", 1, SetDefaultAddon}}, - {"addon.opensettings", {"Open a settings dialog for the addon of the given id", 1, AddonSettings}}, - {"runaddon", {"Run the specified plugin/script", 1, RunAddon}}, -#ifdef TARGET_DARWIN - {"runapplescript", {"Run the specified AppleScript command", 1, RunScript}}, -#endif - {"runplugin", {"Run the specified plugin", 1, RunPlugin}}, - {"runscript", {"Run the specified script", 1, RunScript}}, - {"stopscript", {"Stop the script by ID or path, if running", 1, StopScript}}, - {"updateaddonrepos", {"Check add-on repositories for updates", 0, UpdateRepos}}, - {"updatelocaladdons", {"Check for local add-on changes", 0, UpdateLocals}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/AddonBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/AddonBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/AddonBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/AddonBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing add-on related built-in commands. -class CAddonBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/AndroidBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/AndroidBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/AndroidBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/AndroidBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "AndroidBuiltins.h" - -#include "messaging/ApplicationMessenger.h" - -/*! \brief Launch an android system activity. - * \param params The parameters. - * \details params[0] = package - * params[1] = intent (optional) - * params[2] = datatype (optional) - * params[2] = dataURI (optional) - */ -static int LaunchAndroidActivity(const std::vector& params) -{ - KODI::MESSAGING::CApplicationMessenger::GetInstance().PostMsg( - TMSG_START_ANDROID_ACTIVITY, -1, -1, nullptr, "", params); - - return 0; -} - -CBuiltins::CommandMap CAndroidBuiltins::GetOperations() const -{ - return { - {"startandroidactivity", {"Launch an Android native app with the given package name. Optional parms (in order): intent, dataType, dataURI.", 1, LaunchAndroidActivity}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/AndroidBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/AndroidBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/AndroidBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/AndroidBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing CEC related built-in commands. -class CAndroidBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/ApplicationBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/ApplicationBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/ApplicationBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/ApplicationBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "ApplicationBuiltins.h" - -#include "Application.h" -#include "filesystem/RarManager.h" -#include "filesystem/ZipManager.h" -#include "messaging/ApplicationMessenger.h" -#include "interfaces/AnnouncementManager.h" -#include "network/Network.h" -#include "settings/AdvancedSettings.h" -#include "settings/Settings.h" -#include "utils/FileOperationJob.h" -#include "utils/JSONVariantParser.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "utils/Variant.h" -#include - -using namespace KODI::MESSAGING; - -/*! \brief Extract an archive. - * \param params The parameters - * \details params[0] = The archive URL. - * params[1] = Destination path (optional). - * If not given, extracts to folder with archive. - */ -static int Extract(const std::vector& params) -{ - // Detects if file is zip or rar then extracts - std::string strDestDirect; - if (params.size() < 2) - strDestDirect = URIUtils::GetDirectory(params[0]); - else - strDestDirect = params[1]; - - URIUtils::AddSlashAtEnd(strDestDirect); - - if (URIUtils::IsZIP(params[0])) - g_ZipManager.ExtractArchive(params[0],strDestDirect); -#ifdef HAS_FILESYSTEM_RAR - else if (URIUtils::IsRAR(params[0])) - g_RarManager.ExtractArchive(params[0],strDestDirect); -#endif - else - CLog::Log(LOGERROR, "Extract, No archive given"); - - return 0; -} - -/*! \brief Mute volume. - * \param params (ignored) - */ -static int Mute(const std::vector& params) -{ - g_application.ToggleMute(); - - return 0; -} - -/*! \brief Notify all listeners on announcement bus. - * \param params The parameters. - * \details params[0] = sender. - * params[1] = data. - * params[2] = JSON with extra parameters (optional). - */ -static int NotifyAll(const std::vector& params) -{ - CVariant data; - if (params.size() > 2) - data = CJSONVariantParser::Parse((const unsigned char *)params[2].c_str(), params[2].size()); - - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Other, params[0].c_str(), params[1].c_str(), data); - - return 0; -} - -/*! \brief Set volume. - * \param params the parameters. - * \details params[0] = Volume level. - * params[1] = "showVolumeBar" to show volume bar (optional). - */ -static int SetVolume(const std::vector& params) -{ - float oldVolume = g_application.GetVolume(); - float volume = (float)strtod(params[0].c_str(), nullptr); - - g_application.SetVolume(volume); - if(oldVolume != volume) - { - if(params.size() > 1 && StringUtils::EqualsNoCase(params[1], "showVolumeBar")) - { - CApplicationMessenger::GetInstance().PostMsg(TMSG_VOLUME_SHOW, oldVolume < volume ? ACTION_VOLUME_UP : ACTION_VOLUME_DOWN); - } - } - - return 0; -} - -/*! \brief Toggle debug info. - * \param params (ignored) - */ -static int ToggleDebug(const std::vector& params) -{ - bool debug = CSettings::GetInstance().GetBool(CSettings::SETTING_DEBUG_SHOWLOGINFO); - CSettings::GetInstance().SetBool(CSettings::SETTING_DEBUG_SHOWLOGINFO, !debug); - g_advancedSettings.SetDebugMode(!debug); - - return 0; -} - -/*! \brief Toggle DPMS state. - * \param params (ignored) - */ -static int ToggleDPMS(const std::vector& params) -{ - g_application.ToggleDPMS(true); - - return 0; -} - -/*! \brief Send a WOL packet to a given host. - * \param params The parameters. - * \details params[0] = The MAC of the host to wake. - */ -static int WakeOnLAN(const std::vector& params) -{ - g_application.getNetwork().WakeOnLan(params[0].c_str()); - - return 0; -} - -CBuiltins::CommandMap CApplicationBuiltins::GetOperations() const -{ - return { - {"extract", {"Extracts the specified archive", 1, Extract}}, - {"mute", {"Mute the player", 0, Mute}}, - {"notifyall", {"Notify all connected clients", 2, NotifyAll}}, - {"setvolume", {"Set the current volume", 1, SetVolume}}, - {"toggledebug", {"Enables/disables debug mode", 0, ToggleDebug}}, - {"toggledpms", {"Toggle DPMS mode manually", 0, ToggleDPMS}}, - {"wakeonlan", {"Sends the wake-up packet to the broadcast address for the specified MAC address", 1, WakeOnLAN}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/ApplicationBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/ApplicationBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/ApplicationBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/ApplicationBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing application related built-in commands. -class CApplicationBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/Builtins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/Builtins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/Builtins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/Builtins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,169 +0,0 @@ -/* - * Copyright (C) 2005-2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ -#include "Builtins.h" - -#include "AddonBuiltins.h" -#include "ApplicationBuiltins.h" -#include "CECBuiltins.h" -#include "GUIBuiltins.h" -#include "GUIControlBuiltins.h" -#include "GUIContainerBuiltins.h" -#include "LibraryBuiltins.h" -#include "OpticalBuiltins.h" -#include "PictureBuiltins.h" -#include "PlayerBuiltins.h" -#include "ProfileBuiltins.h" -#include "PVRBuiltins.h" -#include "SkinBuiltins.h" -#include "SystemBuiltins.h" -#include "WeatherBuiltins.h" - -#include "input/InputManager.h" -#include "powermanagement/PowerManager.h" -#include "settings/Settings.h" -#include "Util.h" -#include "utils/log.h" -#include "utils/StringUtils.h" - -#if defined(TARGET_ANDROID) -#include "AndroidBuiltins.h" -#endif - -#if defined(TARGET_POSIX) -#include "linux/PlatformDefs.h" -#endif - -CBuiltins::CBuiltins() -{ - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - RegisterCommands(); - -#if defined(TARGET_ANDROID) - RegisterCommands(); -#endif -} - -CBuiltins::~CBuiltins() -{ -} - -CBuiltins& CBuiltins::GetInstance() -{ - static CBuiltins sBuiltins; - return sBuiltins; -} - -bool CBuiltins::HasCommand(const std::string& execString) -{ - std::string function; - std::vector parameters; - CUtil::SplitExecFunction(execString, function, parameters); - StringUtils::ToLower(function); - const auto& it = m_command.find(function); - if (it != m_command.end()) - { - if (it->second.parameters == 0 || it->second.parameters <= parameters.size()) - return true; - } - - return false; -} - -bool CBuiltins::IsSystemPowerdownCommand(const std::string& execString) -{ - std::string execute; - std::vector params; - CUtil::SplitExecFunction(execString, execute, params); - StringUtils::ToLower(execute); - - // Check if action is resulting in system powerdown. - if (execute == "reboot" || - execute == "restart" || - execute == "reset" || - execute == "powerdown" || - execute == "hibernate" || - execute == "suspend" ) - { - return true; - } - else if (execute == "shutdown") - { - switch (CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE)) - { - case POWERSTATE_SHUTDOWN: - case POWERSTATE_SUSPEND: - case POWERSTATE_HIBERNATE: - return true; - - default: - return false; - } - } - return false; -} - -void CBuiltins::GetHelp(std::string &help) -{ - help.clear(); - - for (const auto& it : m_command) - { - help += it.first; - help += "\t"; - help += it.second.description; - help += "\n"; - } -} - -int CBuiltins::Execute(const std::string& execString) -{ - // Deprecated. Get the text after the "XBMC." - std::string execute; - std::vector params; - CUtil::SplitExecFunction(execString, execute, params); - StringUtils::ToLower(execute); - - const auto& it = m_command.find(execute); - if (it != m_command.end()) - { - if (it->second.parameters == 0 || params.size() >= it->second.parameters) - return it->second.Execute(params); - else - { - CLog::Log(LOGERROR, "%s called with invalid number of parameters (should be: %" PRIdS ", is %" PRIdS")", - execute.c_str(), it->second.parameters, params.size()); - return -1; - } - } - else - return CInputManager::GetInstance().ExecuteBuiltin(execute, params); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/Builtins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/Builtins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/Builtins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/Builtins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -#pragma once - -/* - * Copyright (C) 2005-2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include - -class CBuiltins -{ -public: - //! \brief Struct representing a command from handler classes. - struct BUILT_IN - { - std::string description; //!< Description of command (help string) - size_t parameters; //!< Number of required parameters (can be 0) - int (*Execute)(const std::vector& params); //!< Function to handle command - }; - - //! \brief A map of commands - typedef std::map CommandMap; - - static CBuiltins& GetInstance(); - - bool HasCommand(const std::string& execString); - bool IsSystemPowerdownCommand(const std::string& execString); - void GetHelp(std::string &help); - int Execute(const std::string& execString); - -protected: - CBuiltins(); - CBuiltins(const CBuiltins&); - const CBuiltins& operator=(const CBuiltins&); - virtual ~CBuiltins(); - -private: - CommandMap m_command; //!< Map of registered commands - - - //! \brief Convenience template used to register commands from providers - template - void RegisterCommands() - { - T t; - CommandMap map = t.GetOperations(); - m_command.insert(map.begin(), map.end()); - } -}; - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/CECBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/CECBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/CECBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/CECBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "CECBuiltins.h" - -#include "messaging/ApplicationMessenger.h" - -using namespace KODI::MESSAGING; - -/*! \brief Wake up device through CEC. - * \param params (ignored) - */ -static int ActivateSource(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_CECACTIVATESOURCE); - - return 0; -} - -/*! \brief Put device in standby through CEC. - * \param params (ignored) - */ -static int Standby(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_CECSTANDBY); - - return 0; -} - -/*! \brief Toggle device state through CEC. - * \param params (ignored) - */ -static int ToggleState(const std::vector& params) -{ - bool result; - CApplicationMessenger::GetInstance().SendMsg(TMSG_CECTOGGLESTATE, 0, 0, static_cast(&result)); - - return 0; -} - -CBuiltins::CommandMap CCECBuiltins::GetOperations() const -{ - return { - {"cectogglestate", {"Toggle state of playing device via a CEC peripheral", 0, ToggleState}}, - {"cecactivatesource", {"Wake up playing device via a CEC peripheral", 0, ActivateSource}}, - {"cecstandby", {"Put playing device on standby via a CEC peripheral", 0, Standby}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/CECBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/CECBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/CECBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/CECBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing CEC related built-in commands. -class CCECBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,435 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "GUIBuiltins.h" - -#include "Application.h" -#include "messaging/ApplicationMessenger.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "dialogs/GUIDialogNumeric.h" -#include "filesystem/Directory.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "guilib/StereoscopicsManager.h" -#include "input/ButtonTranslator.h" -#include "settings/AdvancedSettings.h" -#include "settings/DisplaySettings.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "Util.h" -#include "utils/URIUtils.h" -#include "utils/Screenshot.h" -#include "utils/RssManager.h" -#include "utils/AlarmClock.h" -#include "windows/GUIMediaWindow.h" - -using namespace KODI::MESSAGING; - -/*! \brief Execute a GUI action. - * \param params The parameters. - * \details params[0] = Action to execute. - * params[1] = Window to send action to (optional). - */ -static int Action(const std::vector& params) -{ - // try translating the action from our ButtonTranslator - int actionID; - if (CButtonTranslator::TranslateActionString(params[0].c_str(), actionID)) - { - int windowID = params.size() == 2 ? CButtonTranslator::TranslateWindow(params[1]) : WINDOW_INVALID; - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, windowID, -1, static_cast(new CAction(actionID))); - } - - return 0; -} - -/*! \brief Activate a window. - * \param params The parameters. - * \details params[0] = The window name. - * params[1] = Window starting folder (optional). - * - * Set the Replace template parameter to true to replace current - * window in history. - */ - template -static int ActivateWindow(const std::vector& params2) -{ - std::vector params(params2); - // get the parameters - std::string strWindow; - if (params.size()) - { - strWindow = params[0]; - params.erase(params.begin()); - } - - // confirm the window destination is valid prior to switching - int iWindow = CButtonTranslator::TranslateWindow(strWindow); - if (iWindow != WINDOW_INVALID) - { - // compate the given directory param with the current active directory - bool bIsSameStartFolder = true; - if (!params.empty()) - { - CGUIWindow *activeWindow = g_windowManager.GetWindow(g_windowManager.GetActiveWindow()); - if (activeWindow && activeWindow->IsMediaWindow()) - bIsSameStartFolder = ((CGUIMediaWindow*) activeWindow)->IsSameStartFolder(params[0]); - } - - // activate window only if window and path differ from the current active window - if (iWindow != g_windowManager.GetActiveWindow() || !bIsSameStartFolder) - { - g_application.WakeUpScreenSaverAndDPMS(); - g_windowManager.ActivateWindow(iWindow, params, Replace); - return 0; - } - } - else - { - CLog::Log(LOGERROR, "Activate/ReplaceWindow called with invalid destination window: %s", strWindow.c_str()); - return false; - } - - return 1; -} - -/*! \brief Activate a window and give given controls focus. - * \param params The parameters. - * \details params[0] = The window name. - * params[1,...] = Pair of (container ID, focus item). - * - * Set the Replace template parameter to true to replace current - * window in history. - */ - template -static int ActivateAndFocus(const std::vector& params) -{ - std::string strWindow = params[0]; - - // confirm the window destination is valid prior to switching - int iWindow = CButtonTranslator::TranslateWindow(strWindow); - if (iWindow != WINDOW_INVALID) - { - if (iWindow != g_windowManager.GetActiveWindow()) - { - // disable the screensaver - g_application.WakeUpScreenSaverAndDPMS(); - g_windowManager.ActivateWindow(iWindow, {}, Replace); - - unsigned int iPtr = 1; - while (params.size() > iPtr + 1) - { - CGUIMessage msg(GUI_MSG_SETFOCUS, g_windowManager.GetFocusedWindow(), - atol(params[iPtr].c_str()), - (params.size() >= iPtr + 2) ? atol(params[iPtr + 1].c_str())+1 : 0); - g_windowManager.SendMessage(msg); - iPtr += 2; - } - return 0; - } - - } - else - CLog::Log(LOGERROR, "Replace/ActivateWindowAndFocus called with invalid destination window: %s", strWindow.c_str()); - - return 1; -} - -/*! \brief Start an alarm clock - * \param params The parameters. - * \details param[0] = name - * param[1] = command - * param[2] = Length in seconds (optional). - * param[3] = "silent" to suppress notifications. - * param[3] = "loop" to loop the alarm. - */ -static int AlarmClock(const std::vector& params) -{ - // format is alarmclock(name,command[,seconds,true]); - float seconds = 0; - if (params.size() > 2) - { - if (params[2].find(':') == std::string::npos) - seconds = static_cast(atoi(params[2].c_str())*60); - else - seconds = (float)StringUtils::TimeStringToSeconds(params[2]); - } - else - { // check if shutdown is specified in particular, and get the time for it - std::string strHeading; - if (StringUtils::EqualsNoCase(params[0], "shutdowntimer")) - strHeading = g_localizeStrings.Get(20145); - else - strHeading = g_localizeStrings.Get(13209); - std::string strTime; - if( CGUIDialogNumeric::ShowAndGetNumber(strTime, strHeading) ) - seconds = static_cast(atoi(strTime.c_str())*60); - else - return false; - } - bool silent = false; - bool loop = false; - for (unsigned int i = 3; i < params.size() ; i++) - { - // check "true" for backward comp - if (StringUtils::EqualsNoCase(params[i], "true") || StringUtils::EqualsNoCase(params[i], "silent")) - silent = true; - else if (StringUtils::EqualsNoCase(params[i], "loop")) - loop = true; - } - - if( g_alarmClock.IsRunning() ) - g_alarmClock.Stop(params[0],silent); - // no negative times not allowed, loop must have a positive time - if (seconds < 0 || (seconds == 0 && loop)) - return false; - g_alarmClock.Start(params[0], seconds, params[1], silent, loop); - - return 0; -} - -/*! \brief Cancel an alarm clock. - * \param params The parameters. - * \details params[0] = "true" to silently cancel alarm (optional). - */ -static int CancelAlarm(const std::vector& params) -{ - bool silent = (params.size() > 1 && - (StringUtils::EqualsNoCase(params[1], "true") || - StringUtils::EqualsNoCase(params[1], "silent"))); - g_alarmClock.Stop(params[0],silent); - - return 0; -} - -/*! \brief Clear a property in a window. - * \param params The parameters. - * \details params[0] = The property to clear. - * params[1] = The window to clear property in (optional). - */ -static int ClearProperty(const std::vector& params) -{ - CGUIWindow *window = g_windowManager.GetWindow(params.size() > 1 ? CButtonTranslator::TranslateWindow(params[1]) : g_windowManager.GetFocusedWindow()); - if (window) - window->SetProperty(params[0],""); - - return 0; -} - -/*! \brief Close a dialog. - * \param params The parameters. - * \details params[0] = "all" to close all dialogs, or dialog name. - * params[1] = "true" to force close (skip animations) (optional). - */ -static int CloseDialog(const std::vector& params) -{ - bool bForce = false; - if (params.size() > 1 && StringUtils::EqualsNoCase(params[1], "true")) - bForce = true; - if (StringUtils::EqualsNoCase(params[0], "all")) - { - g_windowManager.CloseDialogs(bForce); - } - else - { - int id = CButtonTranslator::TranslateWindow(params[0]); - CGUIWindow *window = (CGUIWindow *)g_windowManager.GetWindow(id); - if (window && window->IsDialog()) - ((CGUIDialog *)window)->Close(bForce); - } - - return 0; -} - -/*! \brief Send a notification. - * \param params The parameters. - * \details params[0] = Notification title. - * params[1] = Notification text. - * params[2] = Display time in milliseconds (optional). - * params[3] = Notification icon (optional). - */ -static int Notification(const std::vector& params) -{ - if (params.size() < 2) - return -1; - if (params.size() == 4) - CGUIDialogKaiToast::QueueNotification(params[3],params[0],params[1],atoi(params[2].c_str())); - else if (params.size() == 3) - CGUIDialogKaiToast::QueueNotification("",params[0],params[1],atoi(params[2].c_str())); - else - CGUIDialogKaiToast::QueueNotification(params[0],params[1]); - - return 0; -} - -/*! \brief Refresh RSS feed. - * \param params (ignored) - */ -static int RefreshRSS(const std::vector& params) -{ - CRssManager::GetInstance().Reload(); - - return 0; -} - -/*! \brief Take a screenshot. - * \param params The parameters. - * \details params[0] = URL to save file to. Blank to use default. - * params[1] = "sync" to run synchronously (optional). - */ -static int Screenshot(const std::vector& params) -{ - if (!params.empty()) - { - // get the parameters - std::string strSaveToPath = params[0]; - bool sync = false; - if (params.size() >= 2) - sync = StringUtils::EqualsNoCase(params[1], "sync"); - - if (!strSaveToPath.empty()) - { - if (XFILE::CDirectory::Exists(strSaveToPath)) - { - std::string file = CUtil::GetNextFilename(URIUtils::AddFileToFolder(strSaveToPath, "screenshot%03d.png"), 999); - - if (!file.empty()) - { - CScreenShot::TakeScreenshot(file, sync); - } - else - { - CLog::Log(LOGWARNING, "Too many screen shots or invalid folder %s", strSaveToPath.c_str()); - } - } - else - CScreenShot::TakeScreenshot(strSaveToPath, sync); - } - } - else - CScreenShot::TakeScreenshot(); - - return 0; -} - -/*! \brief Set GUI language. - * \param params The parameters. - * \details params[0] = The language to use. - */ -static int SetLanguage(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_SETLANGUAGE, -1, -1, nullptr, params[0]); - - return 0; -} - -/*! \brief Set GUI resolution. - * \param params The parameters. - * \details params[0] = A resolution identifier. - */ -static int SetResolution(const std::vector& params) -{ - RESOLUTION res = RES_PAL_4x3; - std::string paramlow(params[0]); - StringUtils::ToLower(paramlow); - if (paramlow == "pal") res = RES_PAL_4x3; - else if (paramlow == "pal16x9") res = RES_PAL_16x9; - else if (paramlow == "ntsc") res = RES_NTSC_4x3; - else if (paramlow == "ntsc16x9") res = RES_NTSC_16x9; - else if (paramlow == "720p") res = RES_HDTV_720p; - else if (paramlow == "720psbs") res = RES_HDTV_720pSBS; - else if (paramlow == "720ptb") res = RES_HDTV_720pTB; - else if (paramlow == "1080psbs") res = RES_HDTV_1080pSBS; - else if (paramlow == "1080ptb") res = RES_HDTV_1080pTB; - else if (paramlow == "1080i") res = RES_HDTV_1080i; - if (g_graphicsContext.IsValidResolution(res)) - { - CDisplaySettings::GetInstance().SetCurrentResolution(res, true); - g_application.ReloadSkin(); - } - - return 0; -} - -/*! \brief Set a property in a window. - * \param params The parameters. - * \details params[0] = The property to set. - * params[1] = The property value. - * params[2] = The window to set property in (optional). - */ -static int SetProperty(const std::vector& params) -{ - CGUIWindow *window = g_windowManager.GetWindow(params.size() > 2 ? CButtonTranslator::TranslateWindow(params[2]) : g_windowManager.GetFocusedWindow()); - if (window) - window->SetProperty(params[0],params[1]); - - return 0; -} - -/*! \brief Set GUI stereo mode. - * \param params The parameters. - * \details param[0] = Stereo mode identifier. - */ -static int SetStereoMode(const std::vector& params) -{ - CAction action = CStereoscopicsManager::GetInstance().ConvertActionCommandToAction("SetStereoMode", params[0]); - if (action.GetID() != ACTION_NONE) - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(action))); - else - { - CLog::Log(LOGERROR,"Builtin 'SetStereoMode' called with unknown parameter: %s", params[0].c_str()); - return -2; - } - - return 0; -} - -/*! \brief Toggle visualization of dirty regions. - * \param params Ignored. - */ -static int ToggleDirty(const std::vector&) -{ - g_advancedSettings.ToggleDirtyRegionVisualization(); - - return 0; -} - -CBuiltins::CommandMap CGUIBuiltins::GetOperations() const -{ - return { - {"action", {"Executes an action for the active window (same as in keymap)", 1, Action}}, - {"cancelalarm", {"Cancels an alarm", 1, CancelAlarm}}, - {"alarmclock", {"Prompt for a length of time and start an alarm clock", 2, AlarmClock}}, - {"activatewindow", {"Activate the specified window", 1, ActivateWindow}}, - {"activatewindowandfocus", {"Activate the specified window and sets focus to the specified id", 1, ActivateAndFocus}}, - {"clearproperty", {"Clears a window property for the current focused window/dialog (key,value)", 1, ClearProperty}}, - {"dialog.close", {"Close a dialog", 1, CloseDialog}}, - {"notification", {"Shows a notification on screen, specify header, then message, and optionally time in milliseconds and a icon.", 2, Notification}}, - {"refreshrss", {"Reload RSS feeds from RSSFeeds.xml", 0, RefreshRSS}}, - {"replacewindow", {"Replaces the current window with the new one and sets focus to the specified id", 1, ActivateWindow}}, - {"replacewindowandfocus", {"Replaces the current window with the new one and sets focus to the specified id", 1, ActivateAndFocus}}, - {"resolution", {"Change Kodi's Resolution", 1, SetResolution}}, - {"setguilanguage", {"Set GUI Language", 1, SetLanguage}}, - {"setproperty", {"Sets a window property for the current focused window/dialog (key,value)", 2, SetProperty}}, - {"setstereomode", {"Changes the stereo mode of the GUI. Params can be: toggle, next, previous, select, tomono or any of the supported stereomodes (off, split_vertical, split_horizontal, row_interleaved, hardware_based, anaglyph_cyan_red, anaglyph_green_magenta, anaglyph_yellow_blue, monoscopic)", 1, SetStereoMode}}, - {"takescreenshot", {"Takes a Screenshot", 0, Screenshot}}, - {"toggledirtyregionvisualization", {"Enables/disables dirty-region visualization", 0, ToggleDirty}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing GUI related built-in commands. -class CGUIBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "GUIContainerBuiltins.h" - -#include "guilib/GUIWindowManager.h" -#include "GUIUserMessages.h" -#include "utils/StringUtils.h" - -/*! \brief Change sort method. - * \param params (ignored) - * - * Set the Dir template parameter to 1 to switch to next sort method - * or -1 to switch to previous sort method. - */ - template -static int ChangeSortMethod(const std::vector& params) -{ - CGUIMessage message(GUI_MSG_CHANGE_SORT_METHOD, g_windowManager.GetActiveWindow(), 0, 0, Dir); - g_windowManager.SendMessage(message); - - return 0; -} - -/*! \brief Change view mode. - * \param params (ignored) - * - * Set the Dir template parameter to 1 to switch to next view mode - * or -1 to switch to previous view mode. - */ - template -static int ChangeViewMode(const std::vector& params) -{ - CGUIMessage message(GUI_MSG_CHANGE_VIEW_MODE, g_windowManager.GetActiveWindow(), 0, 0, Dir); - g_windowManager.SendMessage(message); - - return 0; -} - -/*! \brief Refresh a media window. - * \param params The parameters. - * \details params[0] = The URL to refresh window at. - */ -static int Refresh(const std::vector& params) -{ // NOTE: These messages require a media window, thus they're sent to the current activewindow. - // This shouldn't stop a dialog intercepting it though. - CGUIMessage message(GUI_MSG_NOTIFY_ALL, g_windowManager.GetActiveWindow(), 0, GUI_MSG_UPDATE, 1); // 1 to reset the history - message.SetStringParam(!params.empty() ? params[0] : ""); - g_windowManager.SendMessage(message); - - return 0; -} - -/*! \brief Set sort method. - * \param params The parameters. - * \details params[0] = ID of sort method. - */ -static int SetSortMethod(const std::vector& params) -{ - CGUIMessage message(GUI_MSG_CHANGE_SORT_METHOD, g_windowManager.GetActiveWindow(), 0, atoi(params[0].c_str())); - g_windowManager.SendMessage(message); - - return 0; -} - -/*! \brief Set view mode. - * \param params The parameters. - * \details params[0] = ID of view mode. - */ -static int SetViewMode(const std::vector& params) -{ - CGUIMessage message(GUI_MSG_CHANGE_VIEW_MODE, g_windowManager.GetActiveWindow(), 0, atoi(params[0].c_str())); - g_windowManager.SendMessage(message); - - return 0; -} - -/*! \brief Toggle sort direction. - * \param params (ignored) - */ -static int ToggleSortDirection(const std::vector& params) -{ - CGUIMessage message(GUI_MSG_CHANGE_SORT_DIRECTION, g_windowManager.GetActiveWindow(), 0, 0); - g_windowManager.SendMessage(message); - - return 0; -} - -/*! \brief Update a listing in a media window. - * \param params The parameters. - * \details params[0] = The URL to update listing at. - * params[1] = "replace" to reset history (optional). - */ -static int Update(const std::vector& params) -{ - CGUIMessage message(GUI_MSG_NOTIFY_ALL, g_windowManager.GetActiveWindow(), 0, GUI_MSG_UPDATE, 0); - message.SetStringParam(params[0]); - if (params.size() > 1 && StringUtils::EqualsNoCase(params[1], "replace")) - message.SetParam2(1); // reset the history - g_windowManager.SendMessage(message); - - return 0; -} - -CBuiltins::CommandMap CGUIContainerBuiltins::GetOperations() const -{ - return { - {"container.nextsortmethod", {"Change to the next sort method", 0, ChangeSortMethod<1>}}, - {"container.nextviewmode", {"Move to the next view type (and refresh the listing)", 0, ChangeViewMode<1>}}, - {"container.previoussortmethod", {"Change to the previous sort method", 0, ChangeSortMethod<-1>}}, - {"container.previousviewmode", {"Move to the previous view type (and refresh the listing)", 0, ChangeViewMode<-1>}}, - {"container.refresh", {"Refresh current listing", 0, Refresh}}, - {"container.setsortdirection", {"Toggle the sort direction", 0, ToggleSortDirection}}, - {"container.setsortmethod", {"Change to the specified sort method", 1, SetSortMethod}}, - {"container.setviewmode", {"Move to the view with the given id", 1, SetViewMode}}, - {"container.update", {"Update current listing. Send Container.Update(path,replace) to reset the path history", 1, Update}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIContainerBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIContainerBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIContainerBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIContainerBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing GUI container related built-in commands. -class CGUIContainerBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIControlBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIControlBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIControlBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIControlBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "GUIControlBuiltins.h" - -#include "guilib/GUIWindowManager.h" -#include "input/ButtonTranslator.h" - -/*! \brief Send a move event to a GUI control. - * \param params The parameters. - * \details params[0] = ID of control. - * params[1] = Offset of move. - */ -static int ControlMove(const std::vector& params) -{ - CGUIMessage message(GUI_MSG_MOVE_OFFSET, g_windowManager.GetFocusedWindow(), - atoi(params[0].c_str()), atoi(params[1].c_str())); - g_windowManager.SendMessage(message); - - return 0; -} - -/*! \brief Send a click event to a GUI control. - * \param params The parameters. - * \details params[0] = ID of control. - * params[1] = ID for window with control (optional). - */ -static int SendClick(const std::vector& params) -{ - if (params.size() == 2) - { - // have a window - convert it - int windowID = CButtonTranslator::TranslateWindow(params[0]); - CGUIMessage message(GUI_MSG_CLICKED, atoi(params[1].c_str()), windowID); - g_windowManager.SendMessage(message); - } - else - { // single param - assume you meant the active window - CGUIMessage message(GUI_MSG_CLICKED, atoi(params[0].c_str()), g_windowManager.GetActiveWindow()); - g_windowManager.SendMessage(message); - } - - return 0; -} - -/*! \brief Send a message to a control. - * \param params The parameters. - * \details params[0] = ID of control. - * params[1] = Action name. - * \params[2] = ID of window with control (optional). - */ -static int SendMessage(const std::vector& params) -{ - int controlID = atoi(params[0].c_str()); - int windowID = (params.size() == 3) ? CButtonTranslator::TranslateWindow(params[2]) : g_windowManager.GetActiveWindow(); - if (params[1] == "moveup") - g_windowManager.SendMessage(GUI_MSG_MOVE_OFFSET, windowID, controlID, 1); - else if (params[1] == "movedown") - g_windowManager.SendMessage(GUI_MSG_MOVE_OFFSET, windowID, controlID, -1); - else if (params[1] == "pageup") - g_windowManager.SendMessage(GUI_MSG_PAGE_UP, windowID, controlID); - else if (params[1] == "pagedown") - g_windowManager.SendMessage(GUI_MSG_PAGE_DOWN, windowID, controlID); - else if (params[1] == "click") - g_windowManager.SendMessage(GUI_MSG_CLICKED, controlID, windowID); - - return 0; -} - -/*! \brief Give a control focus. - * \param params The parameters. - * \details params[0] = ID of control. - * params[1] = ID of subitem of control (optional). - */ -static int SetFocus(const std::vector& params) -{ - int controlID = atol(params[0].c_str()); - int subItem = (params.size() > 1) ? atol(params[1].c_str())+1 : 0; - CGUIMessage msg(GUI_MSG_SETFOCUS, g_windowManager.GetFocusedWindow(), controlID, subItem); - g_windowManager.SendMessage(msg); - - return 0; -} - -/*! \brief Shift page in a control. - * \param params The parameters. - * \details params[0] = ID of control - * - * Set Message template parameter to GUI_MSG_PAGE_DOWN/GUI_MSG_PAGE_UP. - */ - template -static int ShiftPage(const std::vector& params) -{ - int id = atoi(params[0].c_str()); - CGUIMessage message(Message, g_windowManager.GetFocusedWindow(), id); - g_windowManager.SendMessage(message); - - return 0; -} - -CBuiltins::CommandMap CGUIControlBuiltins::GetOperations() const -{ - return { - {"control.message", {"Send a given message to a control within a given window", 2, SendMessage}}, - {"control.move", {"Tells the specified control to 'move' to another entry specified by offset", 2, ControlMove}}, - {"control.setfocus", {"Change current focus to a different control id", 1, SetFocus}}, - {"pagedown", {"Send a page down event to the pagecontrol with given id", 1, ShiftPage}}, - {"pageup", {"Send a page up event to the pagecontrol with given id", 1, ShiftPage}}, - {"sendclick", {"Send a click message from the given control to the given window", 1, SendClick}}, - {"setfocus", {"Change current focus to a different control id", 1, SetFocus}}, - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIControlBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIControlBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/GUIControlBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/GUIControlBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing GUI control related built-in commands. -class CGUIControlBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/LibraryBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/LibraryBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/LibraryBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/LibraryBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,222 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "LibraryBuiltins.h" - -#include "Application.h" -#include "dialogs/GUIDialogFileBrowser.h" -#include "dialogs/GUIDialogYesNo.h" -#include "guilib/LocalizeStrings.h" -#include "guilib/GUIWindowManager.h" -#include "GUIUserMessages.h" -#include "MediaSource.h" -#include "messaging/helpers/DialogHelper.h" -#include "music/MusicDatabase.h" -#include "storage/MediaManager.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "video/VideoDatabase.h" - -using namespace KODI::MESSAGING; - -/*! \brief Clean a library. - * \param params The parameters. - * \details params[0] = "video" or "music". - */ -static int CleanLibrary(const std::vector& params) -{ - bool userInitiated = true; - if (params.size() > 1) - userInitiated = StringUtils::EqualsNoCase(params[1], "true"); - if (!params.size() || StringUtils::EqualsNoCase(params[0], "video")) - { - if (!g_application.IsVideoScanning()) - g_application.StartVideoCleanup(userInitiated); - else - CLog::Log(LOGERROR, "CleanLibrary is not possible while scanning or cleaning"); - } - else if (StringUtils::EqualsNoCase(params[0], "music")) - { - if (!g_application.IsMusicScanning()) - g_application.StartMusicCleanup(userInitiated); - else - CLog::Log(LOGERROR, "CleanLibrary is not possible while scanning for media info"); - } - - return 0; -} - -/*! \brief Export a library. - * \param params The parameters. - * \details params[0] = "video" or "music". - * params[1] = "true" to export to a single file (optional). - * params[2] = "true" to export thumbs (optional). - * params[3] = "true" to overwrite existing files (optional). - * params[4] = "true" to export actor thumbs (optional). - */ -static int ExportLibrary(const std::vector& params) -{ - int iHeading = 647; - if (StringUtils::EqualsNoCase(params[0], "music")) - iHeading = 20196; - std::string path; - VECSOURCES shares; - g_mediaManager.GetLocalDrives(shares); - g_mediaManager.GetNetworkLocations(shares); - g_mediaManager.GetRemovableDrives(shares); - bool singleFile; - bool thumbs=false; - bool actorThumbs=false; - bool overwrite=false; - bool cancelled=false; - - if (params.size() > 1) - singleFile = StringUtils::EqualsNoCase(params[1], "false"); - else - { - HELPERS::DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20426}, CVariant{20428}, CVariant{20429}); - cancelled = result == HELPERS::DialogResponse::CANCELLED; - singleFile = result != HELPERS::DialogResponse::YES; - } - - if (cancelled) - return -1; - - if (!singleFile) - { - if (params.size() > 2) - thumbs = StringUtils::EqualsNoCase(params[2], "true"); - else - { - HELPERS::DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20430}); - cancelled = result == HELPERS::DialogResponse::CANCELLED; - thumbs = result == HELPERS::DialogResponse::YES; - } - } - - if (cancelled) - return -1; - - if (thumbs && StringUtils::EqualsNoCase(params[0], "video")) - { - if (params.size() > 4) - actorThumbs = StringUtils::EqualsNoCase(params[4], "true"); - else - { - HELPERS::DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20436}); - cancelled = result == HELPERS::DialogResponse::CANCELLED; - actorThumbs = result == HELPERS::DialogResponse::YES; - } - } - - if (cancelled) - return -1; - - if (!singleFile) - { - if (params.size() > 3) - overwrite = StringUtils::EqualsNoCase(params[3], "true"); - else - { - HELPERS::DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20431}); - cancelled = result == HELPERS::DialogResponse::CANCELLED; - overwrite = result == HELPERS::DialogResponse::YES; - } - } - - if (cancelled) - return -1; - - if (params.size() > 2) - path=params[2]; - if (!singleFile || !path.empty() || - CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(661), - path, true)) - { - if (StringUtils::EqualsNoCase(params[0], "video")) - { - CVideoDatabase videodatabase; - videodatabase.Open(); - videodatabase.ExportToXML(path, singleFile, thumbs, actorThumbs, overwrite); - videodatabase.Close(); - } - else - { - if (URIUtils::HasSlashAtEnd(path)) - path = URIUtils::AddFileToFolder(path, "musicdb.xml"); - CMusicDatabase musicdatabase; - musicdatabase.Open(); - musicdatabase.ExportToXML(path, singleFile, thumbs, overwrite); - musicdatabase.Close(); - } - } - - return 0; -} - -/*! \brief Update a library. - * \param params The parameters. - * \details params[0] = "video" or "music". - * params[1] = "true" to suppress dialogs (optional). - */ -static int UpdateLibrary(const std::vector& params) -{ - bool userInitiated = true; - if (params.size() > 2) - userInitiated = StringUtils::EqualsNoCase(params[2], "true"); - if (StringUtils::EqualsNoCase(params[0], "music")) - { - if (g_application.IsMusicScanning()) - g_application.StopMusicScan(); - else - g_application.StartMusicScan(params.size() > 1 ? params[1] : "", userInitiated); - } - else if (StringUtils::EqualsNoCase(params[0], "video")) - { - if (g_application.IsVideoScanning()) - g_application.StopVideoScan(); - else - g_application.StartVideoScan(params.size() > 1 ? params[1] : "", userInitiated); - } - - return 0; -} - -/*! \brief Open a video library search. - * \param params (ignored) - */ -static int SearchVideoLibrary(const std::vector& params) -{ - CGUIMessage msg(GUI_MSG_SEARCH, 0, 0, 0); - g_windowManager.SendMessage(msg, WINDOW_VIDEO_NAV); - - return 0; -} - -CBuiltins::CommandMap CLibraryBuiltins::GetOperations() const -{ - return { - {"cleanlibrary", {"Clean the video/music library", 1, CleanLibrary}}, - {"exportlibrary", {"Export the video/music library", 1, ExportLibrary}}, - {"updatelibrary", {"Update the selected library (music or video)", 1, UpdateLibrary}}, - {"videolibrary.search", {"Brings up a search dialog which will search the library", 0, SearchVideoLibrary}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/LibraryBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/LibraryBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/LibraryBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/LibraryBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing library related built-in commands. -class CLibraryBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/Makefile.in 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -SRCS = AddonBuiltins.cpp -SRCS += ApplicationBuiltins.cpp -SRCS += Builtins.cpp -SRCS += CECBuiltins.cpp -SRCS += GUIBuiltins.cpp -SRCS += GUIContainerBuiltins.cpp -SRCS += GUIControlBuiltins.cpp -SRCS += LibraryBuiltins.cpp -SRCS += OpticalBuiltins.cpp -SRCS += PictureBuiltins.cpp -SRCS += PlayerBuiltins.cpp -SRCS += ProfileBuiltins.cpp -SRCS += PVRBuiltins.cpp -SRCS += SkinBuiltins.cpp -SRCS += SystemBuiltins.cpp -SRCS += WeatherBuiltins.cpp - -ifeq (@USE_ANDROID@,1) -SRCS += AndroidBuiltins.cpp -endif - -LIB=builtins.a - -include ../../../Makefile.include --include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS))) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/OpticalBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/OpticalBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/OpticalBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/OpticalBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "OpticalBuiltins.h" - -#include "system.h" - -#ifdef HAS_DVD_DRIVE -#include "storage/MediaManager.h" -#endif - -#ifdef HAS_CDDA_RIPPER -#include "cdrip/CDDARipper.h" -#endif - -/*! \brief Eject the tray of an optical drive. - * \param params (ignored) - */ -static int Eject(const std::vector& params) -{ -#ifdef HAS_DVD_DRIVE - g_mediaManager.ToggleTray(); -#endif - - return 0; -} - -/*! \brief Rip currently inserted CD. - * \param params (ignored) - */ -static int RipCD(const std::vector& params) -{ -#ifdef HAS_CDDA_RIPPER - CCDDARipper::GetInstance().RipCD(); -#endif - - return 0; -} - -CBuiltins::CommandMap COpticalBuiltins::GetOperations() const -{ - return { - {"ejecttray", {"Close or open the DVD tray", 0, Eject}}, - {"ripcd", {"Rip the currently inserted audio CD", 0, RipCD}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/OpticalBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/OpticalBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/OpticalBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/OpticalBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing optical media related built-in commands. -class COpticalBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PictureBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PictureBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PictureBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PictureBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "PictureBuiltins.h" - -#include "guilib/GUIWindowManager.h" -#include "GUIUserMessages.h" -#include "utils/StringUtils.h" - -/*! \brief Show a picture. - * \param params The parameters. - * \details params[0] = URL of picture. - */ -static int Show(const std::vector& params) -{ - CGUIMessage msg(GUI_MSG_SHOW_PICTURE, 0, 0); - msg.SetStringParam(params[0]); - CGUIWindow *pWindow = g_windowManager.GetWindow(WINDOW_SLIDESHOW); - if (pWindow) - pWindow->OnMessage(msg); - - return 0; -} - -/*! \brief Start a slideshow. - * \param params The parameters. - * \details params[0] = Path to run slideshow for. - * params[1,..] = "recursive" to run a recursive slideshow. - * params[1,...] = "random" to randomize slideshow. - * params[1,...] = "notrandom" to not randomize slideshow. - * params[1,...] = "pause" to start slideshow paused. - * params[1,...] = "beginslide=" to start at a given slide. - * - * Set the template parameter Recursive to true to run a recursive slideshow. - */ - template -static int Slideshow(const std::vector& params) -{ - std::string beginSlidePath; - // leave RecursiveSlideShow command as-is - unsigned int flags = 0; - if (Recursive) - flags |= 1; - - // SlideShow(dir[,recursive][,[not]random][,pause][,beginslide="/path/to/start/slide.jpg"]) - // the beginslide value need be escaped (for '"' or '\' in it, by backslash) - // and then quoted, or not. See CUtil::SplitParams() - else - { - for (unsigned int i = 1 ; i < params.size() ; i++) - { - if (StringUtils::EqualsNoCase(params[i], "recursive")) - flags |= 1; - else if (StringUtils::EqualsNoCase(params[i], "random")) // set fullscreen or windowed - flags |= 2; - else if (StringUtils::EqualsNoCase(params[i], "notrandom")) - flags |= 4; - else if (StringUtils::EqualsNoCase(params[i], "pause")) - flags |= 8; - else if (StringUtils::StartsWithNoCase(params[i], "beginslide=")) - beginSlidePath = params[i].substr(11); - } - } - - CGUIMessage msg(GUI_MSG_START_SLIDESHOW, 0, 0, flags); - std::vector strParams; - strParams.push_back(params[0]); - strParams.push_back(beginSlidePath); - msg.SetStringParams(strParams); - CGUIWindow *pWindow = g_windowManager.GetWindow(WINDOW_SLIDESHOW); - if (pWindow) - pWindow->OnMessage(msg); - - return 0; -} - -CBuiltins::CommandMap CPictureBuiltins::GetOperations() const -{ - return { - {"recursiveslideshow", {"Run a slideshow from the specified directory, including all subdirs", 1, Slideshow}}, - {"showpicture", {"Display a picture by file path", 1, Show}}, - {"slideshow", {"Run a slideshow from the specified directory", 1, Slideshow}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PictureBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PictureBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PictureBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PictureBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing picture related built-in commands. -class CPictureBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PlayerBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PlayerBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PlayerBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PlayerBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,499 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "PlayerBuiltins.h" - -#include "Application.h" -#include "FileItem.h" -#include "filesystem/Directory.h" -#include "guilib/GUIWindowManager.h" -#include "GUIUserMessages.h" -#include "PartyModeManager.h" -#include "PlayListPlayer.h" -#include "settings/AdvancedSettings.h" -#include "settings/MediaSettings.h" -#include "settings/Settings.h" -#include "storage/MediaManager.h" -#include "system.h" -#include "utils/log.h" -#include "utils/SeekHandler.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "video/windows/GUIWindowVideoBase.h" -#include "pvr/channels/PVRChannel.h" -#include "pvr/recordings/PVRRecording.h" - -#ifdef HAS_DVD_DRIVE -#include "Autorun.h" -#endif - -/*! \brief Clear current playlist - * \param params (ignored) - */ -static int ClearPlaylist(const std::vector& params) -{ - g_playlistPlayer.Clear(); - - return 0; -} - -/*! \brief Start a playlist from a given offset. - * \param params The parameters. - * \details params[0] = Position in playlist or playlist type. - * params[1] = Position in playlist if params[0] is playlist type (optional). - */ -static int PlayOffset(const std::vector& params) -{ - // playlist.playoffset(offset) - // playlist.playoffset(music|video,offset) - std::string strPos = params[0]; - std::string paramlow(params[0]); - StringUtils::ToLower(paramlow); - if (params.size() > 1) - { - // ignore any other parameters if present - std::string strPlaylist = params[0]; - strPos = params[1]; - - int iPlaylist = PLAYLIST_NONE; - if (paramlow == "music") - iPlaylist = PLAYLIST_MUSIC; - else if (paramlow == "video") - iPlaylist = PLAYLIST_VIDEO; - - // unknown playlist - if (iPlaylist == PLAYLIST_NONE) - { - CLog::Log(LOGERROR,"Playlist.PlayOffset called with unknown playlist: %s", strPlaylist.c_str()); - return false; - } - - // user wants to play the 'other' playlist - if (iPlaylist != g_playlistPlayer.GetCurrentPlaylist()) - { - g_application.StopPlaying(); - g_playlistPlayer.Reset(); - g_playlistPlayer.SetCurrentPlaylist(iPlaylist); - } - } - // play the desired offset - int pos = atol(strPos.c_str()); - // playlist is already playing - if (g_application.m_pPlayer->IsPlaying()) - g_playlistPlayer.PlayNext(pos); - // we start playing the 'other' playlist so we need to use play to initialize the player state - else - g_playlistPlayer.Play(pos); - - return 0; -} - -/*! \brief Control player. - * \param params The parameters - * \details params[0] = Control to execute. - * params[1] = "notify" to notify user (optional, certain controls). - */ -static int PlayerControl(const std::vector& params) -{ - g_application.ResetScreenSaver(); - g_application.WakeUpScreenSaverAndDPMS(); - - std::string paramlow(params[0]); - StringUtils::ToLower(paramlow); - - if (paramlow == "play") - { // play/pause - // either resume playing, or pause - if (g_application.m_pPlayer->IsPlaying()) - { - if (g_application.m_pPlayer->GetPlaySpeed() != 1) - g_application.m_pPlayer->SetPlaySpeed(1, g_application.IsMutedInternal()); - else - g_application.m_pPlayer->Pause(); - } - } - else if (paramlow == "stop") - { - g_application.StopPlaying(); - } - else if (paramlow =="rewind" || paramlow == "forward") - { - if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) - { - int iPlaySpeed = g_application.m_pPlayer->GetPlaySpeed(); - if (paramlow == "rewind" && iPlaySpeed == 1) // Enables Rewinding - iPlaySpeed *= -2; - else if (paramlow == "rewind" && iPlaySpeed > 1) //goes down a notch if you're FFing - iPlaySpeed /= 2; - else if (paramlow == "forward" && iPlaySpeed < 1) //goes up a notch if you're RWing - { - iPlaySpeed /= 2; - if (iPlaySpeed == -1) iPlaySpeed = 1; - } - else - iPlaySpeed *= 2; - - if (iPlaySpeed > 32 || iPlaySpeed < -32) - iPlaySpeed = 1; - - g_application.m_pPlayer->SetPlaySpeed(iPlaySpeed, g_application.IsMutedInternal()); - } - } - else if (paramlow == "next") - { - g_application.OnAction(CAction(ACTION_NEXT_ITEM)); - } - else if (paramlow == "previous") - { - g_application.OnAction(CAction(ACTION_PREV_ITEM)); - } - else if (paramlow == "bigskipbackward") - { - if (g_application.m_pPlayer->IsPlaying()) - g_application.m_pPlayer->Seek(false, true); - } - else if (paramlow == "bigskipforward") - { - if (g_application.m_pPlayer->IsPlaying()) - g_application.m_pPlayer->Seek(true, true); - } - else if (paramlow == "smallskipbackward") - { - if (g_application.m_pPlayer->IsPlaying()) - g_application.m_pPlayer->Seek(false, false); - } - else if (paramlow == "smallskipforward") - { - if (g_application.m_pPlayer->IsPlaying()) - g_application.m_pPlayer->Seek(true, false); - } - else if (StringUtils::StartsWithNoCase(params[0], "seekpercentage")) - { - std::string offset; - if (params[0].size() == 14) - CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with no argument"); - else if (params[0].size() < 17) // arg must be at least "(N)" - CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with invalid argument: \"%s\"", params[0].substr(14).c_str()); - else - { - // Don't bother checking the argument: an invalid arg will do seek(0) - offset = params[0].substr(15); - StringUtils::TrimRight(offset, ")"); - float offsetpercent = (float) atof(offset.c_str()); - if (offsetpercent < 0 || offsetpercent > 100) - CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) argument, %f, must be 0-100", offsetpercent); - else if (g_application.m_pPlayer->IsPlaying()) - g_application.SeekPercentage(offsetpercent); - } - } - else if (paramlow == "showvideomenu") - { - if( g_application.m_pPlayer->IsPlaying() ) - g_application.m_pPlayer->OnAction(CAction(ACTION_SHOW_VIDEOMENU)); - } - else if (paramlow == "record") - { - if( g_application.m_pPlayer->IsPlaying() && g_application.m_pPlayer->CanRecord()) - g_application.m_pPlayer->Record(!g_application.m_pPlayer->IsRecording()); - } - else if (StringUtils::StartsWithNoCase(params[0], "partymode")) - { - std::string strXspPath; - //empty param=music, "music"=music, "video"=video, else xsp path - PartyModeContext context = PARTYMODECONTEXT_MUSIC; - if (params[0].size() > 9) - { - if (params[0].size() == 16 && StringUtils::EndsWithNoCase(params[0], "video)")) - context = PARTYMODECONTEXT_VIDEO; - else if (params[0].size() != 16 || !StringUtils::EndsWithNoCase(params[0], "music)")) - { - strXspPath = params[0].substr(10); - StringUtils::TrimRight(strXspPath, ")"); - context = PARTYMODECONTEXT_UNKNOWN; - } - } - if (g_partyModeManager.IsEnabled()) - g_partyModeManager.Disable(); - else - g_partyModeManager.Enable(context, strXspPath); - } - else if (paramlow == "random" || paramlow == "randomoff" || paramlow == "randomon") - { - // get current playlist - int iPlaylist = g_playlistPlayer.GetCurrentPlaylist(); - - // reverse the current setting - bool shuffled = g_playlistPlayer.IsShuffled(iPlaylist); - if ((shuffled && paramlow == "randomon") || (!shuffled && paramlow == "randomoff")) - return 0; - - // check to see if we should notify the user - bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify")); - g_playlistPlayer.SetShuffle(iPlaylist, !shuffled, notify); - - // save settings for now playing windows - switch (iPlaylist) - { - case PLAYLIST_MUSIC: - CMediaSettings::GetInstance().SetMusicPlaylistShuffled(g_playlistPlayer.IsShuffled(iPlaylist)); - CSettings::GetInstance().Save(); - break; - case PLAYLIST_VIDEO: - CMediaSettings::GetInstance().SetVideoPlaylistShuffled(g_playlistPlayer.IsShuffled(iPlaylist)); - CSettings::GetInstance().Save(); - default: - break; - } - - // send message - CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_RANDOM, 0, 0, iPlaylist, g_playlistPlayer.IsShuffled(iPlaylist)); - g_windowManager.SendThreadMessage(msg); - } - else if (StringUtils::StartsWithNoCase(params[0], "repeat")) - { - // get current playlist - int iPlaylist = g_playlistPlayer.GetCurrentPlaylist(); - PLAYLIST::REPEAT_STATE previous_state = g_playlistPlayer.GetRepeat(iPlaylist); - - std::string paramlow(params[0]); - StringUtils::ToLower(paramlow); - - PLAYLIST::REPEAT_STATE state; - if (paramlow == "repeatall") - state = PLAYLIST::REPEAT_ALL; - else if (paramlow == "repeatone") - state = PLAYLIST::REPEAT_ONE; - else if (paramlow == "repeatoff") - state = PLAYLIST::REPEAT_NONE; - else if (previous_state == PLAYLIST::REPEAT_NONE) - state = PLAYLIST::REPEAT_ALL; - else if (previous_state == PLAYLIST::REPEAT_ALL) - state = PLAYLIST::REPEAT_ONE; - else - state = PLAYLIST::REPEAT_NONE; - - if (state == previous_state) - return 0; - - // check to see if we should notify the user - bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify")); - g_playlistPlayer.SetRepeat(iPlaylist, state, notify); - - // save settings for now playing windows - switch (iPlaylist) - { - case PLAYLIST_MUSIC: - CMediaSettings::GetInstance().SetMusicPlaylistRepeat(state == PLAYLIST::REPEAT_ALL); - CSettings::GetInstance().Save(); - break; - case PLAYLIST_VIDEO: - CMediaSettings::GetInstance().SetVideoPlaylistRepeat(state == PLAYLIST::REPEAT_ALL); - CSettings::GetInstance().Save(); - } - - // send messages so now playing window can get updated - CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_REPEAT, 0, 0, iPlaylist, (int)state); - g_windowManager.SendThreadMessage(msg); - } - else if (StringUtils::StartsWithNoCase(params[0], "resumelivetv")) - { - CFileItem& fileItem(g_application.CurrentFileItem()); - PVR::CPVRChannelPtr channel = fileItem.HasPVRRecordingInfoTag() ? fileItem.GetPVRRecordingInfoTag()->Channel() : PVR::CPVRChannelPtr(); - - if (channel) - { - CFileItem playItem(channel); - if (!g_application.PlayMedia(playItem, channel->IsRadio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO)) - { - CLog::Log(LOGERROR, "ResumeLiveTv could not play channel: %s", channel->ChannelName().c_str()); - return false; - } - } - } - - return 0; -} - -/*! \brief Play currently inserted DVD. - * \param params The parameters. - * \details params[0] = "restart" to restart from resume point (optional). - */ -static int PlayDVD(const std::vector& params) -{ -#ifdef HAS_DVD_DRIVE - bool restart = false; - if (!params.empty() && StringUtils::EqualsNoCase(params[0], "restart")) - restart = true; - MEDIA_DETECT::CAutorun::PlayDisc(g_mediaManager.GetDiscPath(), true, restart); -#endif - - return 0; -} - -/*! \brief Start playback of media. - * \param params The parameters. - * \details params[0] = URL to media to play (optional). - * params[1,...] = "isdir" if media is a directory (optional). - * params[1,...] = "1" to start playback in fullscreen (optional). - * params[1,...] = "resume" to force resuming (optional). - * params[1,...] = "noresume" to force not resuming (optional). - * params[1,...] = "playoffset=" to start playback from a given position in a playlist (optional). - */ -static int PlayMedia(const std::vector& params) -{ - CFileItem item(params[0], false); - if (URIUtils::HasSlashAtEnd(params[0])) - item.m_bIsFolder = true; - - // restore to previous window if needed - if( g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW || - g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO || - g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION ) - g_windowManager.PreviousWindow(); - - // reset screensaver - g_application.ResetScreenSaver(); - g_application.WakeUpScreenSaverAndDPMS(); - - // ask if we need to check guisettings to resume - bool askToResume = true; - int playOffset = 0; - for (unsigned int i = 1 ; i < params.size() ; i++) - { - if (StringUtils::EqualsNoCase(params[i], "isdir")) - item.m_bIsFolder = true; - else if (params[i] == "1") // set fullscreen or windowed - CMediaSettings::GetInstance().SetVideoStartWindowed(true); - else if (StringUtils::EqualsNoCase(params[i], "resume")) - { - // force the item to resume (if applicable) (see CApplication::PlayMedia) - item.m_lStartOffset = STARTOFFSET_RESUME; - askToResume = false; - } - else if (StringUtils::EqualsNoCase(params[i], "noresume")) - { - // force the item to start at the beginning (m_lStartOffset is initialized to 0) - askToResume = false; - } - else if (StringUtils::StartsWithNoCase(params[i], "playoffset=")) { - playOffset = atoi(params[i].substr(11).c_str()) - 1; - item.SetProperty("playlist_starting_track", playOffset); - } - } - - if (!item.m_bIsFolder && item.IsPlugin()) - item.SetProperty("IsPlayable", true); - - if ( askToResume == true ) - { - if ( CGUIWindowVideoBase::ShowResumeMenu(item) == false ) - return false; - } - if (item.m_bIsFolder) - { - CFileItemList items; - std::string extensions = g_advancedSettings.m_videoExtensions + "|" + g_advancedSettings.GetMusicExtensions(); - XFILE::CDirectory::GetDirectory(item.GetPath(),items,extensions); - - bool containsMusic = false, containsVideo = false; - for (int i = 0; i < items.Size(); i++) - { - bool isVideo = items[i]->IsVideo(); - containsMusic |= !isVideo; - containsVideo |= isVideo; - - if (containsMusic && containsVideo) - break; - } - - std::unique_ptr state(CGUIViewState::GetViewState(containsVideo ? WINDOW_VIDEO_NAV : WINDOW_MUSIC, items)); - if (state.get()) - items.Sort(state->GetSortMethod()); - else - items.Sort(SortByLabel, SortOrderAscending); - - int playlist = containsVideo? PLAYLIST_VIDEO : PLAYLIST_MUSIC;; - if (containsMusic && containsVideo) //mixed content found in the folder - { - for (int i = items.Size() - 1; i >= 0; i--) //remove music entries - { - if (!items[i]->IsVideo()) - items.Remove(i); - } - } - - g_playlistPlayer.ClearPlaylist(playlist); - g_playlistPlayer.Add(playlist, items); - g_playlistPlayer.SetCurrentPlaylist(playlist); - g_playlistPlayer.Play(playOffset); - } - else - { - int playlist = item.IsAudio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO; - g_playlistPlayer.ClearPlaylist(playlist); - g_playlistPlayer.SetCurrentPlaylist(playlist); - - // play media - if (!g_application.PlayMedia(item, playlist)) - { - CLog::Log(LOGERROR, "PlayMedia could not play media: %s", params[0].c_str()); - return false; - } - } - - return 0; -} - -/*! \brief Start playback with a given playback core. - * \param params The parameters. - * \details params[0] = Name of playback core. - */ -static int PlayWith(const std::vector& params) -{ - g_application.m_eForcedNextPlayer = CPlayerCoreFactory::GetInstance().GetPlayerCore(params[0]); - g_application.OnAction(CAction(ACTION_PLAYER_PLAY)); - - return 0; -} - -/*! \brief Seek in currently playing media. - * \param params The parameters. - * \details params[0] = Number of seconds to seek. - */ -static int Seek(const std::vector& params) -{ - if (g_application.m_pPlayer->IsPlaying()) - CSeekHandler::GetInstance().SeekSeconds(atoi(params[0].c_str())); - - return 0; -} - -CBuiltins::CommandMap CPlayerBuiltins::GetOperations() const -{ - return { - {"playdvd", {"Plays the inserted CD or DVD media from the DVD-ROM Drive!", 0, PlayDVD}}, - {"playlist.clear", {"Clear the current playlist", 0, ClearPlaylist}}, - {"playlist.playoffset", {"Start playing from a particular offset in the playlist", 1, PlayOffset}}, - {"playercontrol", {"Control the music or video player", 1, PlayerControl}}, - {"playmedia", {"Play the specified media file (or playlist)", 1, PlayMedia}}, - {"playwith", {"Play the selected item with the specified core", 1, PlayWith}}, - {"seek", {"Performs a seek in seconds on the current playing media file", 1, Seek}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PlayerBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PlayerBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PlayerBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PlayerBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing player related built-in commands. -class CPlayerBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/ProfileBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/ProfileBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/ProfileBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/ProfileBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "ProfileBuiltins.h" - -#include "addons/AddonManager.h" -#include "Application.h" -#include "messaging/ApplicationMessenger.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "guilib/LocalizeStrings.h" -#include "guilib/GUIWindowManager.h" -#include "GUIPassword.h" -#include "GUIUserMessages.h" -#include "network/Network.h" -#include "network/NetworkServices.h" -#include "profiles/ProfilesManager.h" -#include "Util.h" -#include "utils/StringUtils.h" -#include "video/VideoLibraryQueue.h" - -using namespace KODI::MESSAGING; - -/*! \brief Load a profile. - * \param params The parameters. - * \details params[0] = The profile name. - * params[1] = "prompt" to allow unlocking dialogs (optional) - */ -static int LoadProfile(const std::vector& params) -{ - int index = CProfilesManager::GetInstance().GetProfileIndex(params[0]); - bool prompt = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "prompt")); - bool bCanceled; - if (index >= 0 - && (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE - || g_passwordManager.IsProfileLockUnlocked(index,bCanceled,prompt))) - { - CApplicationMessenger::GetInstance().PostMsg(TMSG_LOADPROFILE, index); - } - - return 0; -} - -/*! \brief Log off currently signed in profile. - * \param params (ignored) - */ -static int LogOff(const std::vector& params) -{ - // there was a commit from cptspiff here which was reverted - // for keeping the behaviour from Eden in Frodo - see - // git rev 9ee5f0047b - if (g_windowManager.GetActiveWindow() == WINDOW_LOGIN_SCREEN) - return -1; - - g_application.StopPlaying(); - if (g_application.IsMusicScanning()) - g_application.StopMusicScan(); - - if (CVideoLibraryQueue::GetInstance().IsRunning()) - CVideoLibraryQueue::GetInstance().CancelAllJobs(); - - ADDON::CAddonMgr::GetInstance().StopServices(true); - - g_application.getNetwork().NetworkMessage(CNetwork::SERVICES_DOWN,1); - CProfilesManager::GetInstance().LoadMasterProfileForLogin(); - g_passwordManager.bMasterUser = false; - - g_application.WakeUpScreenSaverAndDPMS(); - g_windowManager.ActivateWindow(WINDOW_LOGIN_SCREEN, {}, false); - - if (!CNetworkServices::GetInstance().StartEventServer()) // event server could be needed in some situations - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(33102), g_localizeStrings.Get(33100)); - - return 0; -} - -/*! \brief Toggle master mode. - * \param params (ignored) - */ -static int MasterMode(const std::vector& params) -{ - if (g_passwordManager.bMasterUser) - { - g_passwordManager.bMasterUser = false; - g_passwordManager.LockSources(true); - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(20052),g_localizeStrings.Get(20053)); - } - else if (g_passwordManager.IsMasterLockUnlocked(true)) - { - g_passwordManager.LockSources(false); - g_passwordManager.bMasterUser = true; - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(20052),g_localizeStrings.Get(20054)); - } - - CUtil::DeleteVideoDatabaseDirectoryCache(); - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE); - g_windowManager.SendMessage(msg); - - return 0; -} - -CBuiltins::CommandMap CProfileBuiltins::GetOperations() const -{ - return { - {"loadprofile", {"Load the specified profile (note; if locks are active it won't work)", 1, LoadProfile}}, - {"mastermode", {"Control master mode", 0, MasterMode}}, - {"system.logoff", {"Log off current user", 0, LogOff}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/ProfileBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/ProfileBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/ProfileBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/ProfileBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing profile related built-in commands. -class CProfileBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PVRBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PVRBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PVRBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PVRBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "PVRBuiltins.h" - -#include "Application.h" -#include "pvr/PVRManager.h" - -/*! \brief Start the PVR manager. - * \param params (ignored) - */ -static int Start(const std::vector& params) -{ - g_application.StartPVRManager(); - - return 0; -} - -/*! \brief Stop the PVR manager. - * \param params (ignored) - */ -static int Stop(const std::vector& params) -{ - g_application.StopPVRManager(); - - return 0; -} - -/*! \brief Search for missing channel icons - * \param params (ignored) - */ -static int SearchMissingIcons(const std::vector& params) -{ - PVR::CPVRManager::GetInstance().TriggerSearchMissingChannelIcons(); - - return 0; -} - -CBuiltins::CommandMap CPVRBuiltins::GetOperations() const -{ - return { - {"startpvrmanager", {"(Re)Starts the PVR manager", 0, Start}}, // deprecated alias - {"pvr.startmanager", {"(Re)Starts the PVR manager", 0, Start}}, - {"stoppvrmanager", {"Stops the PVR manager", 0, Stop}}, - {"pvr.stopmanager", {"Stops the PVR manager", 0, Stop}}, - {"pvr.searchmissingchannelicons", {"Search for missing channel icons", 0, SearchMissingIcons}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PVRBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PVRBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/PVRBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/PVRBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing PVR related built-in commands. -class CPVRBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/SkinBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/SkinBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/SkinBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/SkinBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,416 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "SkinBuiltins.h" - -#include "addons/Addon.h" -#include "addons/GUIWindowAddonBrowser.h" -#include "Application.h" -#include "dialogs/GUIDialogFileBrowser.h" -#include "dialogs/GUIDialogNumeric.h" -#include "guilib/GUIKeyboardFactory.h" -#include "guilib/LocalizeStrings.h" -#include "MediaSource.h" -#include "settings/MediaSourceSettings.h" -#include "settings/Settings.h" -#include "settings/SkinSettings.h" -#include "storage/MediaManager.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "Util.h" -#include "URL.h" - -using namespace ADDON; - -/*! \brief Reload current skin. - * \param params The parameters. - * \details params[0] = "confirm" to show a confirmation dialog (optional). - */ -static int ReloadSkin(const std::vector& params) -{ - // Reload the skin - g_application.ReloadSkin(!params.empty() && - StringUtils::EqualsNoCase(params[0], "confirm")); - - return 0; -} - -/*! \brief Unload current skin. - * \param params (ignored) - */ -static int UnloadSkin(const std::vector& params) -{ - g_application.UnloadSkin(true); // we're reloading the skin after this - - return 0; -} - -/*! \brief Toggle a skin bool setting. - * \param params The parameters. - * \details params[0] = Skin setting to toggle. - */ -static int ToggleSetting(const std::vector& params) -{ - int setting = CSkinSettings::GetInstance().TranslateBool(params[0]); - CSkinSettings::GetInstance().SetBool(setting, !CSkinSettings::GetInstance().GetBool(setting)); - CSettings::GetInstance().Save(); - - return 0; -} - -/*! \brief Set an add-on type skin setting. - * \param params The parameters. - * \details params[0] = Skin setting to store result in. - * params[1,...] = Add-on types to allow selecting. - */ -static int SetAddon(const std::vector& params) -{ - int string = CSkinSettings::GetInstance().TranslateString(params[0]); - std::vector types; - for (unsigned int i = 1 ; i < params.size() ; i++) - { - ADDON::TYPE type = TranslateType(params[i]); - if (type != ADDON_UNKNOWN) - types.push_back(type); - } - std::string result; - if (types.size() > 0 && CGUIWindowAddonBrowser::SelectAddonID(types, result, true) == 1) - { - CSkinSettings::GetInstance().SetString(string, result); - CSettings::GetInstance().Save(); - } - - return 0; -} - -/*! \brief Set a skin bool setting. - * \param params The parameters. - * \details params[0] = Name of skin setting. - * params[1] = Value to set ("false", or "true") (optional). - */ -static int SetBool(const std::vector& params) -{ - if (params.size() > 1) - { - int string = CSkinSettings::GetInstance().TranslateBool(params[0]); - CSkinSettings::GetInstance().SetBool(string, StringUtils::EqualsNoCase(params[1], "true")); - CSettings::GetInstance().Save(); - return 0; - } - // default is to set it to true - int setting = CSkinSettings::GetInstance().TranslateBool(params[0]); - CSkinSettings::GetInstance().SetBool(setting, true); - CSettings::GetInstance().Save(); - - return 0; -} - -/*! \brief Set a numeric skin setting. - * \param params The parameters. - * \details params[0] = Name of skin setting. - */ -static int SetNumeric(const std::vector& params) -{ - int string = CSkinSettings::GetInstance().TranslateString(params[0]); - std::string value = CSkinSettings::GetInstance().GetString(string); - if (CGUIDialogNumeric::ShowAndGetNumber(value, g_localizeStrings.Get(611))) - CSkinSettings::GetInstance().SetString(string, value); - - return 0; -} - -/*! \brief Set a path skin setting. - * \param params The parameters. - * \details params[0] = Name of skin setting. - * params[1] = Extra URL to allow selection from (optional). - */ -static int SetPath(const std::vector& params) -{ - int string = CSkinSettings::GetInstance().TranslateString(params[0]); - std::string value = CSkinSettings::GetInstance().GetString(string); - VECSOURCES localShares; - g_mediaManager.GetLocalDrives(localShares); - g_mediaManager.GetNetworkLocations(localShares); - if (params.size() > 1) - { - value = params[1]; - URIUtils::AddSlashAtEnd(value); - bool bIsSource; - if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one - { - CMediaSource share; - share.strName = g_localizeStrings.Get(13278); - share.strPath = value; - localShares.push_back(share); - } - } - - if (CGUIDialogFileBrowser::ShowAndGetDirectory(localShares, g_localizeStrings.Get(1031), value)) - CSkinSettings::GetInstance().SetString(string, value); - - CSettings::GetInstance().Save(); - - return 0; -} - -/*! \brief Set a skin file setting. - * \param params The parameters. - * \details params[0] = Name of skin setting. - * params[1] = File mask or add-on type (optional). - * params[2] = Extra URL to allow selection from or - * content type if mask is an addon-on type (optional). - */ -static int SetFile(const std::vector& params) -{ - int string = CSkinSettings::GetInstance().TranslateString(params[0]); - std::string value = CSkinSettings::GetInstance().GetString(string); - VECSOURCES localShares; - g_mediaManager.GetLocalDrives(localShares); - - // Note. can only browse one addon type from here - // if browsing for addons, required param[1] is addontype string, with optional param[2] - // as contenttype string see IAddon.h & ADDON::TranslateXX - std::string strMask = (params.size() > 1) ? params[1] : ""; - StringUtils::ToLower(strMask); - ADDON::TYPE type; - if ((type = TranslateType(strMask)) != ADDON_UNKNOWN) - { - CURL url; - url.SetProtocol("addons"); - url.SetHostName("enabled"); - url.SetFileName(strMask+"/"); - localShares.clear(); - std::string content = (params.size() > 2) ? params[2] : ""; - StringUtils::ToLower(content); - url.SetPassword(content); - std::string strMask; - if (type == ADDON_SCRIPT) - strMask = ".py"; - std::string replace; - if (CGUIDialogFileBrowser::ShowAndGetFile(url.Get(), strMask, TranslateType(type, true), replace, true, true, true)) - { - if (StringUtils::StartsWithNoCase(replace, "addons://")) - CSkinSettings::GetInstance().SetString(string, URIUtils::GetFileName(replace)); - else - CSkinSettings::GetInstance().SetString(string, replace); - } - } - else - { - if (params.size() > 2) - { - value = params[2]; - URIUtils::AddSlashAtEnd(value); - bool bIsSource; - if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one - { - CMediaSource share; - share.strName = g_localizeStrings.Get(13278); - share.strPath = value; - localShares.push_back(share); - } - } - if (CGUIDialogFileBrowser::ShowAndGetFile(localShares, strMask, g_localizeStrings.Get(1033), value)) - CSkinSettings::GetInstance().SetString(string, value); - } - - return 0; -} - -/*! \brief Set a skin image setting. - * \param params The parameters. - * \details params[0] = Name of skin setting. - * params[1] = Extra URL to allow selection from (optional). - */ -static int SetImage(const std::vector& params) -{ - int string = CSkinSettings::GetInstance().TranslateString(params[0]); - std::string value = CSkinSettings::GetInstance().GetString(string); - VECSOURCES localShares; - g_mediaManager.GetLocalDrives(localShares); - if (params.size() > 1) - { - value = params[1]; - URIUtils::AddSlashAtEnd(value); - bool bIsSource; - if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one - { - CMediaSource share; - share.strName = g_localizeStrings.Get(13278); - share.strPath = value; - localShares.push_back(share); - } - } - if (CGUIDialogFileBrowser::ShowAndGetImage(localShares, g_localizeStrings.Get(1030), value)) - CSkinSettings::GetInstance().SetString(string, value); - - return 0; -} - -/*! \brief Set a skin large image setting. - * \param params The parameters. - * \details params[0] = Name of skin setting. - */ -static int SetLargeImage(const std::vector& params) -{ - int string = CSkinSettings::GetInstance().TranslateString(params[0]); - std::string value = CSkinSettings::GetInstance().GetString(string); - VECSOURCES localShares; - g_mediaManager.GetLocalDrives(localShares); - VECSOURCES *shares = CMediaSourceSettings::GetInstance().GetSources("pictures"); - if (!shares) - shares = &localShares; - if (CGUIDialogFileBrowser::ShowAndGetImage(*shares, g_localizeStrings.Get(1030), value)) - CSkinSettings::GetInstance().SetString(string, value); - - return 0; -} - -/*! \brief Set a string skin setting. - * \param params The parameters. - * \details params[0] = Name of skin setting. - * params[1] = Value of skin setting (optional). - */ -static int SetString(const std::vector& params) -{ - // break the parameter up if necessary - int string = 0; - if (params.size() > 1) - { - string = CSkinSettings::GetInstance().TranslateString(params[0]); - CSkinSettings::GetInstance().SetString(string, params[1]); - CSettings::GetInstance().Save(); - return 0; - } - else - string = CSkinSettings::GetInstance().TranslateString(params[0]); - - std::string value = CSkinSettings::GetInstance().GetString(string); - if (CGUIKeyboardFactory::ShowAndGetInput(value, CVariant{g_localizeStrings.Get(1029)}, true)) - CSkinSettings::GetInstance().SetString(string, value); - - return 0; -} - -/*! \brief Select skin theme. - * \param params The parameters. - * \details params[0] = 0 or 1 to increase theme, -1 to decrease. - */ -static int SetTheme(const std::vector& params) -{ - // enumerate themes - std::vector vecTheme; - CUtil::GetSkinThemes(vecTheme); - - int iTheme = -1; - - // find current theme - if (!StringUtils::EqualsNoCase(CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME), "SKINDEFAULT")) - { - for (size_t i=0;i (int)vecTheme.size()-1) - iTheme = -1; - if (iTheme < -1) - iTheme = vecTheme.size()-1; - - std::string strSkinTheme = "SKINDEFAULT"; - if (iTheme != -1 && iTheme < (int)vecTheme.size()) - strSkinTheme = vecTheme[iTheme]; - - CSettings::GetInstance().SetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME, strSkinTheme); - // also set the default color theme - std::string colorTheme(URIUtils::ReplaceExtension(strSkinTheme, ".xml")); - if (StringUtils::EqualsNoCase(colorTheme, "Textures.xml")) - colorTheme = "defaults.xml"; - CSettings::GetInstance().SetString(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS, colorTheme); - g_application.ReloadSkin(); - - return 0; -} - -/*! \brief Reset a skin setting. - * \param params The parameters. - * \details params[0] = Name of setting to reset. - */ -static int SkinReset(const std::vector& params) -{ - CSkinSettings::GetInstance().Reset(params[0]); - CSettings::GetInstance().Save(); - - return 0; -} - -/*! \brief Reset all skin settings. - * \param params (ignored) - */ -static int SkinResetAll(const std::vector& params) -{ - CSkinSettings::GetInstance().Reset(); - CSettings::GetInstance().Save(); - - return 0; -} - -/*! \brief Toggle skin debug. - * \param params (ignored) - */ -static int SkinDebug(const std::vector& params) -{ - g_SkinInfo->ToggleDebug(); - - return 0; -} - -CBuiltins::CommandMap CSkinBuiltins::GetOperations() const -{ - return { - {"reloadskin", {"Reload Kodi's skin", 0, ReloadSkin}}, - {"unloadskin", {"Unload Kodi's skin", 0, UnloadSkin}}, - {"skin.reset", {"Resets a skin setting to default", 1, SkinReset}}, - {"skin.resetsettings", {"Resets all skin settings", 0, SkinResetAll}}, - {"skin.setaddon", {"Prompts and set an addon", 2, SetAddon}}, - {"skin.setbool", {"Sets a skin setting on", 1, SetBool}}, - {"skin.setfile", {"Prompts and sets a file", 1, SetFile}}, - {"skin.setimage", {"Prompts and sets a skin image", 1, SetImage}}, - {"skin.setlargeimage", {"Prompts and sets a large skin images", 1, SetLargeImage}}, - {"skin.setnumeric", {"Prompts and sets numeric input", 1, SetNumeric}}, - {"skin.setpath", {"Prompts and sets a skin path", 1, SetPath}}, - {"skin.setstring", {"Prompts and sets skin string", 1, SetString}}, - {"skin.theme", {"Control skin theme", 1, SetTheme}}, - {"skin.toggledebug", {"Toggle skin debug", 0, SkinDebug}}, - {"skin.togglesetting", {"Toggles a skin setting on or off", 1, ToggleSetting}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/SkinBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/SkinBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/SkinBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/SkinBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing skin related built-in commands. -class CSkinBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/SystemBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/SystemBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/SystemBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/SystemBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "SystemBuiltins.h" - -#include "messaging/ApplicationMessenger.h" -#include "utils/StringUtils.h" - -using namespace KODI::MESSAGING; - -/*! \brief Execute a system executable. - * \param params The parameters. - * \details params[0] = The path to the executable. - * - * Set the template parameter Wait to true to wait for execution exit. - */ - template -static int Exec(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_MINIMIZE); - CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_OS, Wait, -1, nullptr, params[0]); - - return 0; -} - -/*! \brief Hibernate system. - * \param params (ignored) - */ -static int Hibernate(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_HIBERNATE); - - return 0; -} - -/*! \brief Inhibit idle shutdown timer. - * \param params The parameters. - * \details params[0] = "true" to inhibit shutdown timer (optional). - */ -static int InhibitIdle(const std::vector& params) -{ - bool inhibit = (params.size() == 1 && StringUtils::EqualsNoCase(params[0], "true")); - CApplicationMessenger::GetInstance().PostMsg(TMSG_INHIBITIDLESHUTDOWN, inhibit); - - return 0; -} - -/*! \brief Minimize application. - * \param params (ignored) - */ -static int Minimize(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_MINIMIZE); - - return 0; -} - -/*! \brief Powerdown system. - * \param params (ignored) - */ -static int Powerdown(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_POWERDOWN); - - return 0; -} - -/*! \brief Quit application. - * \param params (ignored) - */ -static int Quit(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT); - - return 0; -} - -/*! \brief Reboot system. - * \param params (ignored) - */ -static int Reboot(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTART); - - return 0; -} - -/*! \brief Restart application. - * \param params (ignored) - */ -static int RestartApp(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTARTAPP); - - return 0; -} - -/*! \brief Activate screensaver. - * \param params (ignored) - */ -static int Screensaver(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_ACTIVATESCREENSAVER); - - return 0; -} - -/*! \brief Shutdown system. - * \param params (ignored) - */ -static int Shutdown(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_SHUTDOWN); - - return 0; -} - -/*! \brief Suspend system. - * \param params (ignored) - */ -static int Suspend(const std::vector& params) -{ - CApplicationMessenger::GetInstance().PostMsg(TMSG_SUSPEND); - - return 0; -} - -CBuiltins::CommandMap CSystemBuiltins::GetOperations() const -{ - return { - {"activatescreensaver", {"Activate Screensaver", 0, Screensaver}}, - {"hibernate", {"Hibernates the system", 0, Hibernate}}, - {"inhibitidleshutdown", {"Inhibit idle shutdown", 0, InhibitIdle}}, - {"minimize", {"Minimize Kodi", 0, Minimize}}, - {"powerdown", {"Powerdown system", 0, Powerdown}}, - {"quit", {"Quit Kodi", 0, Quit}}, - {"reboot", {"Reboot the system", 0, Reboot}}, - {"reset", {"Reset the system (same as reboot)", 0, Reboot}}, - {"restart", {"Restart the system (same as reboot)", 0, Reboot}}, - {"restartapp", {"Restart Kodi", 0, RestartApp}}, - {"shutdown", {"Shutdown the system", 0, Shutdown}}, - {"suspend", {"Suspends the system", 0, Suspend}}, - {"system.exec", {"Execute shell commands", 1, Exec<0>}}, - {"system.execwait", {"Execute shell commands and freezes Kodi until shell is closed", 1, Exec<1>}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/SystemBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/SystemBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/SystemBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/SystemBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing system related built-in commands. -class CSystemBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/WeatherBuiltins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/WeatherBuiltins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/WeatherBuiltins.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/WeatherBuiltins.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "WeatherBuiltins.h" - -#include "guilib/GUIWindowManager.h" - -/*! \brief Switch to a given weather location. - * \param params The parameters. - * \details params[0] = 1, 2 or 3. - */ -static int SetLocation(const std::vector& params) -{ - int loc = atoi(params[0].c_str()); - CGUIMessage msg(GUI_MSG_ITEM_SELECT, 0, 0, loc); - g_windowManager.SendMessage(msg, WINDOW_WEATHER); - - return 0; -} - -/*! \brief Switch weather location or refresh current. - * \param params (ignored) - * - * The Direction template parameter can be -1 for previous location, - * 1 for next location or 0 to refresh current location. - */ - template -static int SwitchLocation(const std::vector& params) -{ - CGUIMessage msg(GUI_MSG_MOVE_OFFSET, 0, 0, Direction); - g_windowManager.SendMessage(msg, WINDOW_WEATHER); - - return 0; -} - -CBuiltins::CommandMap CWeatherBuiltins::GetOperations() const -{ - return { - {"weather.refresh", {"Force weather data refresh", 0, SwitchLocation<0>}}, - {"weather.locationnext", {"Switch to next weather location", 0, SwitchLocation<1>}}, - {"weather.locationprevious", {"Switch to previous weather location", 0, SwitchLocation<-1>}}, - {"weather.locationset", {"Switch to given weather location (parameter can be 1-3)", 1, SetLocation}} - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/WeatherBuiltins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/WeatherBuiltins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/builtins/WeatherBuiltins.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/builtins/WeatherBuiltins.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "Builtins.h" - -//! \brief Class providing weather related built-in commands. -class CWeatherBuiltins -{ -public: - //! \brief Returns the map of operations. - CBuiltins::CommandMap GetOperations() const; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/Builtins.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/Builtins.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/Builtins.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/Builtins.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,1872 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "network/Network.h" +#include "system.h" +#include "utils/AlarmClock.h" +#include "utils/Screenshot.h" +#include "utils/SeekHandler.h" +#include "Application.h" +#include "ApplicationMessenger.h" +#include "Autorun.h" +#include "Builtins.h" +#include "input/ButtonTranslator.h" +#include "input/InputManager.h" +#include "FileItem.h" +#include "addons/GUIDialogAddonSettings.h" +#include "dialogs/GUIDialogFileBrowser.h" +#include "guilib/GUIKeyboardFactory.h" +#include "input/Key.h" +#include "guilib/StereoscopicsManager.h" +#include "guilib/GUIAudioManager.h" +#include "dialogs/GUIDialogKaiToast.h" +#include "dialogs/GUIDialogNumeric.h" +#include "dialogs/GUIDialogProgress.h" +#include "dialogs/GUIDialogYesNo.h" +#include "GUIUserMessages.h" +#include "windows/GUIWindowLoginScreen.h" +#include "video/windows/GUIWindowVideoBase.h" +#include "addons/GUIWindowAddonBrowser.h" +#include "addons/Addon.h" // for TranslateType, TranslateContent +#include "addons/AddonInstaller.h" +#include "addons/AddonManager.h" +#include "addons/PluginSource.h" +#include "interfaces/generic/ScriptInvocationManager.h" +#include "interfaces/AnnouncementManager.h" +#include "network/NetworkServices.h" +#include "utils/log.h" +#include "storage/MediaManager.h" +#include "utils/RssManager.h" +#include "utils/JSONVariantParser.h" +#include "PartyModeManager.h" +#include "profiles/ProfilesManager.h" +#include "settings/DisplaySettings.h" +#include "settings/Settings.h" +#include "settings/MediaSettings.h" +#include "settings/MediaSourceSettings.h" +#include "settings/SkinSettings.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "video/VideoLibraryQueue.h" +#include "Util.h" +#include "URL.h" +#include "music/MusicDatabase.h" +#include "cores/IPlayer.h" +#include "pvr/channels/PVRChannel.h" +#include "pvr/recordings/PVRRecording.h" + +#include "filesystem/PluginDirectory.h" +#ifdef HAS_FILESYSTEM_RAR +#include "filesystem/RarManager.h" +#endif +#include "filesystem/ZipManager.h" + +#include "guilib/GUIWindowManager.h" +#include "guilib/LocalizeStrings.h" + +#ifdef HAS_LIRC +#include "input/linux/LIRC.h" +#endif +#ifdef HAS_IRSERVERSUITE + + #include "input/windows/IRServerSuite.h" + +#endif + +#if defined(TARGET_DARWIN) +#include "filesystem/SpecialProtocol.h" +#include "osx/CocoaInterface.h" +#endif + +#ifdef HAS_CDDA_RIPPER +#include "cdrip/CDDARipper.h" +#endif + +#include +#include "settings/AdvancedSettings.h" +#include "settings/DisplaySettings.h" +#include "powermanagement/PowerManager.h" +#include "filesystem/Directory.h" + +using namespace std; +using namespace XFILE; +using namespace ADDON; + +#ifdef HAS_DVD_DRIVE +using namespace MEDIA_DETECT; +#endif + +typedef struct +{ + const char* command; + bool needsParameters; + const char* description; +} BUILT_IN; + +const BUILT_IN commands[] = { + { "Help", false, "This help message" }, + { "Reboot", false, "Reboot the system" }, + { "Restart", false, "Restart the system (same as reboot)" }, + { "ShutDown", false, "Shutdown the system" }, + { "Powerdown", false, "Powerdown system" }, + { "Quit", false, "Quit Kodi" }, + { "Hibernate", false, "Hibernates the system" }, + { "Suspend", false, "Suspends the system" }, + { "InhibitIdleShutdown", false, "Inhibit idle shutdown" }, + { "AllowIdleShutdown", false, "Allow idle shutdown" }, + { "ActivateScreensaver", false, "Activate Screensaver" }, + { "RestartApp", false, "Restart Kodi" }, + { "Minimize", false, "Minimize Kodi" }, + { "Reset", false, "Reset the system (same as reboot)" }, + { "Mastermode", false, "Control master mode" }, + { "SetGUILanguage", true, "Set GUI Language" }, + { "ActivateWindow", true, "Activate the specified window" }, + { "ActivateWindowAndFocus", true, "Activate the specified window and sets focus to the specified id" }, + { "ReplaceWindowAndFocus", true, "Replaces the current window with the new one and sets focus to the specified id" }, + { "ReplaceWindow", true, "Replaces the current window with the new one" }, + { "TakeScreenshot", false, "Takes a Screenshot" }, + { "RunScript", true, "Run the specified script" }, + { "StopScript", true, "Stop the script by ID or path, if running" }, +#if defined(TARGET_DARWIN) + { "RunAppleScript", true, "Run the specified AppleScript command" }, +#endif + { "RunPlugin", true, "Run the specified plugin" }, + { "RunAddon", true, "Run the specified plugin/script" }, + { "NotifyAll", true, "Notify all connected clients" }, + { "Extract", true, "Extracts the specified archive" }, + { "PlayMedia", true, "Play the specified media file (or playlist)" }, + { "Seek", true, "Performs a seek in seconds on the current playing media file" }, + { "ShowPicture", true, "Display a picture by file path" }, + { "SlideShow", true, "Run a slideshow from the specified directory" }, + { "RecursiveSlideShow", true, "Run a slideshow from the specified directory, including all subdirs" }, + { "ReloadSkin", false, "Reload Kodi's skin" }, + { "UnloadSkin", false, "Unload Kodi's skin" }, + { "RefreshRSS", false, "Reload RSS feeds from RSSFeeds.xml"}, + { "PlayerControl", true, "Control the music or video player" }, + { "Playlist.PlayOffset", true, "Start playing from a particular offset in the playlist" }, + { "Playlist.Clear", false, "Clear the current playlist" }, + { "EjectTray", false, "Close or open the DVD tray" }, + { "AlarmClock", true, "Prompt for a length of time and start an alarm clock" }, + { "CancelAlarm", true, "Cancels an alarm" }, + { "Action", true, "Executes an action for the active window (same as in keymap)" }, + { "Notification", true, "Shows a notification on screen, specify header, then message, and optionally time in milliseconds and a icon." }, + { "PlayDVD", false, "Plays the inserted CD or DVD media from the DVD-ROM Drive!" }, + { "RipCD", false, "Rip the currently inserted audio CD"}, + { "Skin.ToggleSetting", true, "Toggles a skin setting on or off" }, + { "Skin.SetString", true, "Prompts and sets skin string" }, + { "Skin.SetNumeric", true, "Prompts and sets numeric input" }, + { "Skin.SetPath", true, "Prompts and sets a skin path" }, + { "Skin.Theme", true, "Control skin theme" }, + { "Skin.SetImage", true, "Prompts and sets a skin image" }, + { "Skin.SetLargeImage", true, "Prompts and sets a large skin images" }, + { "Skin.SetFile", true, "Prompts and sets a file" }, + { "Skin.SetAddon", true, "Prompts and set an addon" }, + { "Skin.SetBool", true, "Sets a skin setting on" }, + { "Skin.Reset", true, "Resets a skin setting to default" }, + { "Skin.ResetSettings", false, "Resets all skin settings" }, + { "Mute", false, "Mute the player" }, + { "SetVolume", true, "Set the current volume" }, + { "Dialog.Close", true, "Close a dialog" }, + { "System.LogOff", false, "Log off current user" }, + { "System.Exec", true, "Execute shell commands" }, + { "System.ExecWait", true, "Execute shell commands and freezes Kodi until shell is closed" }, + { "Resolution", true, "Change Kodi's Resolution" }, + { "SetFocus", true, "Change current focus to a different control id" }, + { "UpdateLibrary", true, "Update the selected library (music or video)" }, + { "CleanLibrary", true, "Clean the video/music library" }, + { "ExportLibrary", true, "Export the video/music library" }, + { "PageDown", true, "Send a page down event to the pagecontrol with given id" }, + { "PageUp", true, "Send a page up event to the pagecontrol with given id" }, + { "Container.Refresh", false, "Refresh current listing" }, + { "Container.Update", false, "Update current listing. Send Container.Update(path,replace) to reset the path history" }, + { "Container.NextViewMode", false, "Move to the next view type (and refresh the listing)" }, + { "Container.PreviousViewMode", false, "Move to the previous view type (and refresh the listing)" }, + { "Container.SetViewMode", true, "Move to the view with the given id" }, + { "Container.NextSortMethod", false, "Change to the next sort method" }, + { "Container.PreviousSortMethod",false, "Change to the previous sort method" }, + { "Container.SetSortMethod", true, "Change to the specified sort method" }, + { "Container.SortDirection", false, "Toggle the sort direction" }, + { "Control.Move", true, "Tells the specified control to 'move' to another entry specified by offset" }, + { "Control.SetFocus", true, "Change current focus to a different control id" }, + { "Control.Message", true, "Send a given message to a control within a given window" }, + { "SendClick", true, "Send a click message from the given control to the given window" }, + { "LoadProfile", true, "Load the specified profile (note; if locks are active it won't work)" }, + { "SetProperty", true, "Sets a window property for the current focused window/dialog (key,value)" }, + { "ClearProperty", true, "Clears a window property for the current focused window/dialog (key,value)" }, + { "PlayWith", true, "Play the selected item with the specified core" }, + { "WakeOnLan", true, "Sends the wake-up packet to the broadcast address for the specified MAC address" }, + { "Addon.Default.OpenSettings", true, "Open a settings dialog for the default addon of the given type" }, + { "Addon.Default.Set", true, "Open a select dialog to allow choosing the default addon of the given type" }, + { "Addon.OpenSettings", true, "Open a settings dialog for the addon of the given id" }, + { "UpdateAddonRepos", false, "Check add-on repositories for updates" }, + { "UpdateLocalAddons", false, "Check for local add-on changes" }, + { "ToggleDPMS", false, "Toggle DPMS mode manually"}, + { "CECToggleState", false, "Toggle state of playing device via a CEC peripheral"}, + { "CECActivateSource", false, "Wake up playing device via a CEC peripheral"}, + { "CECStandby", false, "Put playing device on standby via a CEC peripheral"}, + { "Weather.Refresh", false, "Force weather data refresh"}, + { "Weather.LocationNext", false, "Switch to next weather location"}, + { "Weather.LocationPrevious", false, "Switch to previous weather location"}, + { "Weather.LocationSet", true, "Switch to given weather location (parameter can be 1-3)"}, +#if defined(HAS_LIRC) || defined(HAS_IRSERVERSUITE) + { "LIRC.Stop", false, "Removes Kodi as LIRC client" }, + { "LIRC.Start", false, "Adds Kodi as LIRC client" }, + { "LIRC.Send", true, "Sends a command to LIRC" }, +#endif + { "VideoLibrary.Search", false, "Brings up a search dialog which will search the library" }, + { "ToggleDebug", false, "Enables/disables debug mode" }, + { "StartPVRManager", false, "(Re)Starts the PVR manager" }, + { "StopPVRManager", false, "Stops the PVR manager" }, +#if defined(TARGET_ANDROID) + { "StartAndroidActivity", true, "Launch an Android native app with the given package name. Optional parms (in order): intent, dataType, dataURI." }, +#endif + { "SetStereoMode", true, "Changes the stereo mode of the GUI. Params can be: toggle, next, previous, select, tomono or any of the supported stereomodes (off, split_vertical, split_horizontal, row_interleaved, hardware_based, anaglyph_cyan_red, anaglyph_green_magenta, anaglyph_yellow_blue, monoscopic)" } +}; + +bool CBuiltins::HasCommand(const std::string& execString) +{ + std::string function; + vector parameters; + CUtil::SplitExecFunction(execString, function, parameters); + for (unsigned int i = 0; i < sizeof(commands)/sizeof(BUILT_IN); i++) + { + if (StringUtils::EqualsNoCase(function, commands[i].command) && (!commands[i].needsParameters || parameters.size())) + return true; + } + return false; +} + +bool CBuiltins::IsSystemPowerdownCommand(const std::string& execString) +{ + std::string execute; + vector params; + CUtil::SplitExecFunction(execString, execute, params); + StringUtils::ToLower(execute); + + // Check if action is resulting in system powerdown. + if (execute == "reboot" || + execute == "restart" || + execute == "reset" || + execute == "powerdown" || + execute == "hibernate" || + execute == "suspend" ) + { + return true; + } + else if (execute == "shutdown") + { + switch (CSettings::Get().GetInt("powermanagement.shutdownstate")) + { + case POWERSTATE_SHUTDOWN: + case POWERSTATE_SUSPEND: + case POWERSTATE_HIBERNATE: + return true; + + default: + return false; + } + } + return false; +} + +void CBuiltins::GetHelp(std::string &help) +{ + help.clear(); + for (unsigned int i = 0; i < sizeof(commands)/sizeof(BUILT_IN); i++) + { + help += commands[i].command; + help += "\t"; + help += commands[i].description; + help += "\n"; + } +} + +bool CBuiltins::ActivateWindow(int iWindowID, const std::vector& params /* = {} */, bool swappingWindows /* = false */) +{ + // disable the screensaver + g_application.WakeUpScreenSaverAndDPMS(); + g_windowManager.ActivateWindow(iWindowID, params, swappingWindows); + return true; +} + +int CBuiltins::Execute(const std::string& execString) +{ + // Deprecated. Get the text after the "XBMC." + std::string execute; + vector params; + CUtil::SplitExecFunction(execString, execute, params); + StringUtils::ToLower(execute); + std::string parameter = params.size() ? params[0] : ""; + std::string paramlow(parameter); + StringUtils::ToLower(paramlow); + + if (execute == "reboot" || execute == "restart" || execute == "reset") //Will reboot the system + { + CApplicationMessenger::Get().Restart(); + } + else if (execute == "shutdown") + { + CApplicationMessenger::Get().Shutdown(); + } + else if (execute == "powerdown") + { + CApplicationMessenger::Get().Powerdown(); + } + else if (execute == "restartapp") + { + CApplicationMessenger::Get().RestartApp(); + } + else if (execute == "hibernate") + { + CApplicationMessenger::Get().Hibernate(); + } + else if (execute == "suspend") + { + CApplicationMessenger::Get().Suspend(); + } + else if (execute == "quit") + { + CApplicationMessenger::Get().Quit(); + } + else if (execute == "inhibitidleshutdown") + { + bool inhibit = (params.size() == 1 && StringUtils::EqualsNoCase(params[0], "true")); + CApplicationMessenger::Get().InhibitIdleShutdown(inhibit); + } + else if (execute == "activatescreensaver") + { + CApplicationMessenger::Get().ActivateScreensaver(); + } + else if (execute == "minimize") + { + CApplicationMessenger::Get().Minimize(); + } + else if (execute == "loadprofile") + { + int index = CProfilesManager::Get().GetProfileIndex(parameter); + bool prompt = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "prompt")); + bool bCanceled; + if (index >= 0 + && (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE + || g_passwordManager.IsProfileLockUnlocked(index,bCanceled,prompt))) + { + CApplicationMessenger::Get().LoadProfile(index); + } + } + else if (execute == "mastermode") + { + if (g_passwordManager.bMasterUser) + { + g_passwordManager.bMasterUser = false; + g_passwordManager.LockSources(true); + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(20052),g_localizeStrings.Get(20053)); + } + else if (g_passwordManager.IsMasterLockUnlocked(true)) + { + g_passwordManager.LockSources(false); + g_passwordManager.bMasterUser = true; + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(20052),g_localizeStrings.Get(20054)); + } + + CUtil::DeleteVideoDatabaseDirectoryCache(); + CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE); + g_windowManager.SendMessage(msg); + } + else if (execute == "setguilanguage") + { + if (params.size()) + { + CApplicationMessenger::Get().SetGUILanguage(params[0]); + } + } + else if (execute == "takescreenshot") + { + if (params.size()) + { + // get the parameters + std::string strSaveToPath = params[0]; + bool sync = false; + if (params.size() >= 2) + sync = StringUtils::EqualsNoCase(params[1], "sync"); + + if (!strSaveToPath.empty()) + { + if (CDirectory::Exists(strSaveToPath)) + { + std::string file = CUtil::GetNextFilename(URIUtils::AddFileToFolder(strSaveToPath, "screenshot%03d.png"), 999); + + if (!file.empty()) + { + CScreenShot::TakeScreenshot(file, sync); + } + else + { + CLog::Log(LOGWARNING, "Too many screen shots or invalid folder %s", strSaveToPath.c_str()); + } + } + else + CScreenShot::TakeScreenshot(strSaveToPath, sync); + } + } + else + CScreenShot::TakeScreenshot(); + } + else if (execute == "activatewindow" || execute == "replacewindow") + { + // get the parameters + std::string strWindow; + if (params.size()) + { + strWindow = params[0]; + params.erase(params.begin()); + } + + // confirm the window destination is valid prior to switching + int iWindow = CButtonTranslator::TranslateWindow(strWindow); + if (iWindow != WINDOW_INVALID) + { + // compate the given directory param with the current active directory + bool bIsSameStartFolder = true; + if (!params.empty()) + { + CGUIWindow *activeWindow = g_windowManager.GetWindow(g_windowManager.GetActiveWindow()); + if (activeWindow && activeWindow->IsMediaWindow()) + bIsSameStartFolder = ((CGUIMediaWindow*) activeWindow)->IsSameStartFolder(params[0]); + } + + // activate window only if window and path differ from the current active window + if (iWindow != g_windowManager.GetActiveWindow() || !bIsSameStartFolder) + { + return ActivateWindow(iWindow, params, execute != "activatewindow"); + } + } + else + { + CLog::Log(LOGERROR, "Activate/ReplaceWindow called with invalid destination window: %s", strWindow.c_str()); + return false; + } + } + else if ((execute == "setfocus" || execute == "control.setfocus") && params.size()) + { + int controlID = atol(params[0].c_str()); + int subItem = (params.size() > 1) ? atol(params[1].c_str())+1 : 0; + CGUIMessage msg(GUI_MSG_SETFOCUS, g_windowManager.GetFocusedWindow(), controlID, subItem); + g_windowManager.SendMessage(msg); + } + else if ((execute == "activatewindowandfocus" || execute == "replacewindowandfocus") && params.size()) + { + std::string strWindow = params[0]; + + // confirm the window destination is valid prior to switching + int iWindow = CButtonTranslator::TranslateWindow(strWindow); + if (iWindow != WINDOW_INVALID) + { + if (iWindow != g_windowManager.GetActiveWindow()) + { + if (!ActivateWindow(iWindow, {}, execute != "activatewindowandfocus")) + return false; + + unsigned int iPtr = 1; + while (params.size() > iPtr + 1) + { + CGUIMessage msg(GUI_MSG_SETFOCUS, g_windowManager.GetFocusedWindow(), + atol(params[iPtr].c_str()), + (params.size() >= iPtr + 2) ? atol(params[iPtr + 1].c_str())+1 : 0); + g_windowManager.SendMessage(msg); + iPtr += 2; + } + } + } + else + { + CLog::Log(LOGERROR, "Replace/ActivateWindowAndFocus called with invalid destination window: %s", strWindow.c_str()); + return false; + } + } + else if (execute == "runscript" && params.size()) + { +#if defined(TARGET_DARWIN_OSX) + if (URIUtils::HasExtension(parameter, ".applescript|.scpt")) + { + std::string osxPath = CSpecialProtocol::TranslatePath(parameter); + Cocoa_DoAppleScriptFile(osxPath.c_str()); + } + else +#endif + { + AddonPtr addon; + std::string scriptpath; + // Test to see if the param is an addon ID + if (CAddonMgr::Get().GetAddon(params[0], addon)) + { + //Get the correct extension point to run + if (CAddonMgr::Get().GetAddon(params[0], addon, ADDON_SCRIPT) || + CAddonMgr::Get().GetAddon(params[0], addon, ADDON_SCRIPT_WEATHER) || + CAddonMgr::Get().GetAddon(params[0], addon, ADDON_SCRIPT_LYRICS) || + CAddonMgr::Get().GetAddon(params[0], addon, ADDON_SCRIPT_LIBRARY)) + { + scriptpath = addon->LibPath(); + } + else + { + //Run a random extension point (old behaviour). + CAddonMgr::Get().GetAddon(params[0], addon); + scriptpath = addon->LibPath(); + CLog::Log(LOGWARNING, "RunScript called for a non-script addon '%s'. This behaviour is deprecated.", params[0].c_str()); + } + } + else + scriptpath = params[0]; + + // split the path up to find the filename + vector argv = params; + std::string filename = URIUtils::GetFileName(scriptpath); + if (!filename.empty()) + argv[0] = filename; + + CScriptInvocationManager::Get().ExecuteAsync(scriptpath, addon, argv); + } + } +#if defined(TARGET_DARWIN_OSX) + else if (execute == "runapplescript") + { + Cocoa_DoAppleScript(parameter.c_str()); + } +#endif + else if (execute == "stopscript") + { + // FIXME: This does not work for addons with multiple extension points! + // Are there any use for this? TODO: Fix hack in CScreenSaver::Destroy() and deprecate. + if (!params.empty()) + { + std::string scriptpath(params[0]); + // Test to see if the param is an addon ID + AddonPtr script; + if (CAddonMgr::Get().GetAddon(params[0], script)) + scriptpath = script->LibPath(); + CScriptInvocationManager::Get().Stop(scriptpath); + } + } + else if (execute == "system.exec") + { + CApplicationMessenger::Get().Minimize(); + CApplicationMessenger::Get().ExecOS(parameter, false); + } + else if (execute == "system.execwait") + { + CApplicationMessenger::Get().Minimize(); + CApplicationMessenger::Get().ExecOS(parameter, true); + } + else if (execute == "resolution") + { + RESOLUTION res = RES_PAL_4x3; + if (paramlow == "pal") res = RES_PAL_4x3; + else if (paramlow == "pal16x9") res = RES_PAL_16x9; + else if (paramlow == "ntsc") res = RES_NTSC_4x3; + else if (paramlow == "ntsc16x9") res = RES_NTSC_16x9; + else if (paramlow == "720p") res = RES_HDTV_720p; + else if (paramlow == "720psbs") res = RES_HDTV_720pSBS; + else if (paramlow == "720ptb") res = RES_HDTV_720pTB; + else if (paramlow == "1080psbs") res = RES_HDTV_1080pSBS; + else if (paramlow == "1080ptb") res = RES_HDTV_1080pTB; + else if (paramlow == "1080i") res = RES_HDTV_1080i; + if (g_graphicsContext.IsValidResolution(res)) + { + CDisplaySettings::Get().SetCurrentResolution(res, true); + g_application.ReloadSkin(); + } + } + else if (execute == "extract" && params.size()) + { + // Detects if file is zip or rar then extracts + std::string strDestDirect; + if (params.size() < 2) + strDestDirect = URIUtils::GetDirectory(params[0]); + else + strDestDirect = params[1]; + + URIUtils::AddSlashAtEnd(strDestDirect); + + if (URIUtils::IsZIP(params[0])) + g_ZipManager.ExtractArchive(params[0],strDestDirect); +#ifdef HAS_FILESYSTEM_RAR + else if (URIUtils::IsRAR(params[0])) + g_RarManager.ExtractArchive(params[0],strDestDirect); +#endif + else + CLog::Log(LOGERROR, "Extract, No archive given"); + } + else if (execute == "runplugin") + { + if (params.size()) + { + CFileItem item(params[0]); + if (!item.m_bIsFolder) + { + item.SetPath(params[0]); + CPluginDirectory::RunScriptWithParams(item.GetPath()); + } + } + else + { + CLog::Log(LOGERROR, "RunPlugin called with no arguments."); + } + } + else if (execute == "runaddon") + { + if (params.size()) + { + AddonPtr addon; + if (CAddonMgr::Get().GetAddon(params[0], addon, ADDON_PLUGIN)) + { + PluginPtr plugin = std::dynamic_pointer_cast(addon); + std::string addonid = params[0]; + std::string urlParameters; + vector parameters; + if (params.size() == 2 && + (StringUtils::StartsWith(params[1], "/") || StringUtils::StartsWith(params[1], "?"))) + urlParameters = params[1]; + else if (params.size() > 1) + { + parameters.insert(parameters.begin(), params.begin() + 1, params.end()); + urlParameters = "?" + StringUtils::Join(parameters, "&"); + } + else + { + // Add '/' if addon is run without params (will be removed later so it's safe) + // Otherwise there are 2 entries for the same plugin in ViewModesX.db + urlParameters = "/"; + } + + std::string cmd; + if (plugin->Provides(CPluginSource::VIDEO)) + cmd = StringUtils::Format("ActivateWindow(Videos,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); + else if (plugin->Provides(CPluginSource::AUDIO)) + cmd = StringUtils::Format("ActivateWindow(Music,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); + else if (plugin->Provides(CPluginSource::EXECUTABLE)) + cmd = StringUtils::Format("ActivateWindow(Programs,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); + else if (plugin->Provides(CPluginSource::IMAGE)) + cmd = StringUtils::Format("ActivateWindow(Pictures,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); + else + // Pass the script name (params[0]) and all the parameters + // (params[1] ... params[x]) separated by a comma to RunPlugin + cmd = StringUtils::Format("RunPlugin(%s)", StringUtils::Join(params, ",").c_str()); + Execute(cmd); + } + else if (CAddonMgr::Get().GetAddon(params[0], addon, ADDON_SCRIPT) || + CAddonMgr::Get().GetAddon(params[0], addon, ADDON_SCRIPT_WEATHER) || + CAddonMgr::Get().GetAddon(params[0], addon, ADDON_SCRIPT_LYRICS) || + CAddonMgr::Get().GetAddon(params[0], addon, ADDON_SCRIPT_LIBRARY)) + { + // Pass the script name (params[0]) and all the parameters + // (params[1] ... params[x]) separated by a comma to RunScript + Execute(StringUtils::Format("RunScript(%s)", StringUtils::Join(params, ",").c_str())); + } + else + CLog::Log(LOGERROR, "RunAddon: unknown add-on id '%s', or unexpected add-on type (not a script or plugin).", params[0].c_str()); + } + else + { + CLog::Log(LOGERROR, "RunAddon called with no arguments."); + } + } + else if (execute == "notifyall") + { + if (params.size() > 1) + { + CVariant data; + if (params.size() > 2) + data = CJSONVariantParser::Parse((const unsigned char *)params[2].c_str(), params[2].size()); + + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Other, params[0].c_str(), params[1].c_str(), data); + } + else + CLog::Log(LOGERROR, "NotifyAll needs two parameters"); + } + else if (execute == "playmedia") + { + if (!params.size()) + { + CLog::Log(LOGERROR, "PlayMedia called with empty parameter"); + return -3; + } + + CFileItem item(params[0], false); + if (URIUtils::HasSlashAtEnd(params[0])) + item.m_bIsFolder = true; + + // restore to previous window if needed + if( g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW || + g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO || + g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION ) + g_windowManager.PreviousWindow(); + + // reset screensaver + g_application.ResetScreenSaver(); + g_application.WakeUpScreenSaverAndDPMS(); + + // ask if we need to check guisettings to resume + bool askToResume = true; + int playOffset = 0; + for (unsigned int i = 1 ; i < params.size() ; i++) + { + if (StringUtils::EqualsNoCase(params[i], "isdir")) + item.m_bIsFolder = true; + else if (params[i] == "1") // set fullscreen or windowed + CMediaSettings::Get().SetVideoStartWindowed(true); + else if (StringUtils::EqualsNoCase(params[i], "resume")) + { + // force the item to resume (if applicable) (see CApplication::PlayMedia) + item.m_lStartOffset = STARTOFFSET_RESUME; + askToResume = false; + } + else if (StringUtils::EqualsNoCase(params[i], "noresume")) + { + // force the item to start at the beginning (m_lStartOffset is initialized to 0) + askToResume = false; + } + else if (StringUtils::StartsWithNoCase(params[i], "playoffset=")) { + playOffset = atoi(params[i].substr(11).c_str()) - 1; + item.SetProperty("playlist_starting_track", playOffset); + } + } + + if (!item.m_bIsFolder && item.IsPlugin()) + item.SetProperty("IsPlayable", true); + + if ( askToResume == true ) + { + if ( CGUIWindowVideoBase::ShowResumeMenu(item) == false ) + return false; + } + if (item.m_bIsFolder) + { + CFileItemList items; + std::string extensions = g_advancedSettings.m_videoExtensions + "|" + g_advancedSettings.GetMusicExtensions(); + CDirectory::GetDirectory(item.GetPath(),items,extensions); + + bool containsMusic = false, containsVideo = false; + for (int i = 0; i < items.Size(); i++) + { + bool isVideo = items[i]->IsVideo(); + containsMusic |= !isVideo; + containsVideo |= isVideo; + + if (containsMusic && containsVideo) + break; + } + + unique_ptr state(CGUIViewState::GetViewState(containsVideo ? WINDOW_VIDEO_NAV : WINDOW_MUSIC, items)); + if (state.get()) + items.Sort(state->GetSortMethod()); + else + items.Sort(SortByLabel, SortOrderAscending); + + int playlist = containsVideo? PLAYLIST_VIDEO : PLAYLIST_MUSIC;; + if (containsMusic && containsVideo) //mixed content found in the folder + { + for (int i = items.Size() - 1; i >= 0; i--) //remove music entries + { + if (!items[i]->IsVideo()) + items.Remove(i); + } + } + + g_playlistPlayer.ClearPlaylist(playlist); + g_playlistPlayer.Add(playlist, items); + g_playlistPlayer.SetCurrentPlaylist(playlist); + g_playlistPlayer.Play(playOffset); + } + else + { + int playlist = item.IsAudio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO; + g_playlistPlayer.ClearPlaylist(playlist); + g_playlistPlayer.SetCurrentPlaylist(playlist); + + // play media + if (!g_application.PlayMedia(item, playlist)) + { + CLog::Log(LOGERROR, "PlayMedia could not play media: %s", params[0].c_str()); + return false; + } + } + } + else if (execute == "seek") + { + if (!params.size()) + { + CLog::Log(LOGERROR, "Seek called with empty parameter"); + return -3; + } + if (g_application.m_pPlayer->IsPlaying()) + CSeekHandler::Get().SeekSeconds(atoi(params[0].c_str())); + } + else if (execute == "showpicture") + { + if (!params.size()) + { + CLog::Log(LOGERROR, "ShowPicture called with empty parameter"); + return -2; + } + CGUIMessage msg(GUI_MSG_SHOW_PICTURE, 0, 0); + msg.SetStringParam(params[0]); + CGUIWindow *pWindow = g_windowManager.GetWindow(WINDOW_SLIDESHOW); + if (pWindow) pWindow->OnMessage(msg); + } + else if (execute == "slideshow" || execute == "recursiveslideshow") + { + if (!params.size()) + { + CLog::Log(LOGERROR, "SlideShow called with empty parameter"); + return -2; + } + std::string beginSlidePath; + // leave RecursiveSlideShow command as-is + unsigned int flags = 0; + if (execute == "recursiveslideshow") + flags |= 1; + + // SlideShow(dir[,recursive][,[not]random][,pause][,beginslide="/path/to/start/slide.jpg"]) + // the beginslide value need be escaped (for '"' or '\' in it, by backslash) + // and then quoted, or not. See CUtil::SplitParams() + else + { + for (unsigned int i = 1 ; i < params.size() ; i++) + { + if (StringUtils::EqualsNoCase(params[i], "recursive")) + flags |= 1; + else if (StringUtils::EqualsNoCase(params[i], "random")) // set fullscreen or windowed + flags |= 2; + else if (StringUtils::EqualsNoCase(params[i], "notrandom")) + flags |= 4; + else if (StringUtils::EqualsNoCase(params[i], "pause")) + flags |= 8; + else if (StringUtils::StartsWithNoCase(params[i], "beginslide=")) + beginSlidePath = params[i].substr(11); + } + } + + CGUIMessage msg(GUI_MSG_START_SLIDESHOW, 0, 0, flags); + vector strParams; + strParams.push_back(params[0]); + strParams.push_back(beginSlidePath); + msg.SetStringParams(strParams); + CGUIWindow *pWindow = g_windowManager.GetWindow(WINDOW_SLIDESHOW); + if (pWindow) pWindow->OnMessage(msg); + } + else if (execute == "reloadskin") + { + // Reload the skin + g_application.ReloadSkin(!params.empty() && StringUtils::EqualsNoCase(params[0], "confirm")); + } + else if (execute == "unloadskin") + { + g_application.UnloadSkin(true); // we're reloading the skin after this + } + else if (execute == "refreshrss") + { + CRssManager::Get().Reload(); + } + else if (execute == "playercontrol") + { + g_application.ResetScreenSaver(); + g_application.WakeUpScreenSaverAndDPMS(); + if (!params.size()) + { + CLog::Log(LOGERROR, "PlayerControl called with empty parameter"); + return -3; + } + if (paramlow == "play") + { // play/pause + // either resume playing, or pause + if (g_application.m_pPlayer->IsPlaying()) + { + if (g_application.m_pPlayer->GetPlaySpeed() != 1) + g_application.m_pPlayer->SetPlaySpeed(1, g_application.IsMutedInternal()); + else + g_application.m_pPlayer->Pause(); + } + } + else if (paramlow == "stop") + { + g_application.StopPlaying(); + } + else if (paramlow =="rewind" || paramlow == "forward") + { + if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) + { + int iPlaySpeed = g_application.m_pPlayer->GetPlaySpeed(); + if (paramlow == "rewind" && iPlaySpeed == 1) // Enables Rewinding + iPlaySpeed *= -2; + else if (paramlow == "rewind" && iPlaySpeed > 1) //goes down a notch if you're FFing + iPlaySpeed /= 2; + else if (paramlow == "forward" && iPlaySpeed < 1) //goes up a notch if you're RWing + { + iPlaySpeed /= 2; + if (iPlaySpeed == -1) iPlaySpeed = 1; + } + else + iPlaySpeed *= 2; + + if (iPlaySpeed > 32 || iPlaySpeed < -32) + iPlaySpeed = 1; + + g_application.m_pPlayer->SetPlaySpeed(iPlaySpeed, g_application.IsMutedInternal()); + } + } + else if (paramlow == "next") + { + g_application.OnAction(CAction(ACTION_NEXT_ITEM)); + } + else if (paramlow == "previous") + { + g_application.OnAction(CAction(ACTION_PREV_ITEM)); + } + else if (paramlow == "bigskipbackward") + { + if (g_application.m_pPlayer->IsPlaying()) + g_application.m_pPlayer->Seek(false, true); + } + else if (paramlow == "bigskipforward") + { + if (g_application.m_pPlayer->IsPlaying()) + g_application.m_pPlayer->Seek(true, true); + } + else if (paramlow == "smallskipbackward") + { + if (g_application.m_pPlayer->IsPlaying()) + g_application.m_pPlayer->Seek(false, false); + } + else if (paramlow == "smallskipforward") + { + if (g_application.m_pPlayer->IsPlaying()) + g_application.m_pPlayer->Seek(true, false); + } + else if (StringUtils::StartsWithNoCase(parameter, "seekpercentage")) + { + std::string offset; + if (parameter.size() == 14) + CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with no argument"); + else if (parameter.size() < 17) // arg must be at least "(N)" + CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with invalid argument: \"%s\"", parameter.substr(14).c_str()); + else + { + // Don't bother checking the argument: an invalid arg will do seek(0) + offset = parameter.substr(15); + StringUtils::TrimRight(offset, ")"); + float offsetpercent = (float) atof(offset.c_str()); + if (offsetpercent < 0 || offsetpercent > 100) + CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) argument, %f, must be 0-100", offsetpercent); + else if (g_application.m_pPlayer->IsPlaying()) + g_application.SeekPercentage(offsetpercent); + } + } + else if (paramlow == "showvideomenu") + { + if( g_application.m_pPlayer->IsPlaying() ) + g_application.m_pPlayer->OnAction(CAction(ACTION_SHOW_VIDEOMENU)); + } + else if (paramlow == "record") + { + if( g_application.m_pPlayer->IsPlaying() && g_application.m_pPlayer->CanRecord()) + g_application.m_pPlayer->Record(!g_application.m_pPlayer->IsRecording()); + } + else if (StringUtils::StartsWithNoCase(parameter, "partymode")) + { + std::string strXspPath; + //empty param=music, "music"=music, "video"=video, else xsp path + PartyModeContext context = PARTYMODECONTEXT_MUSIC; + if (parameter.size() > 9) + { + if (parameter.size() == 16 && StringUtils::EndsWithNoCase(parameter, "video)")) + context = PARTYMODECONTEXT_VIDEO; + else if (parameter.size() != 16 || !StringUtils::EndsWithNoCase(parameter, "music)")) + { + strXspPath = parameter.substr(10); + StringUtils::TrimRight(strXspPath, ")"); + context = PARTYMODECONTEXT_UNKNOWN; + } + } + if (g_partyModeManager.IsEnabled()) + g_partyModeManager.Disable(); + else + g_partyModeManager.Enable(context, strXspPath); + } + else if (paramlow == "random" || paramlow == "randomoff" || paramlow == "randomon") + { + // get current playlist + int iPlaylist = g_playlistPlayer.GetCurrentPlaylist(); + + // reverse the current setting + bool shuffled = g_playlistPlayer.IsShuffled(iPlaylist); + if ((shuffled && paramlow == "randomon") || (!shuffled && paramlow == "randomoff")) + return 0; + + // check to see if we should notify the user + bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify")); + g_playlistPlayer.SetShuffle(iPlaylist, !shuffled, notify); + + // save settings for now playing windows + switch (iPlaylist) + { + case PLAYLIST_MUSIC: + CMediaSettings::Get().SetMusicPlaylistShuffled(g_playlistPlayer.IsShuffled(iPlaylist)); + CSettings::Get().Save(); + break; + case PLAYLIST_VIDEO: + CMediaSettings::Get().SetVideoPlaylistShuffled(g_playlistPlayer.IsShuffled(iPlaylist)); + CSettings::Get().Save(); + } + + // send message + CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_RANDOM, 0, 0, iPlaylist, g_playlistPlayer.IsShuffled(iPlaylist)); + g_windowManager.SendThreadMessage(msg); + + } + else if (StringUtils::StartsWithNoCase(parameter, "repeat")) + { + // get current playlist + int iPlaylist = g_playlistPlayer.GetCurrentPlaylist(); + PLAYLIST::REPEAT_STATE previous_state = g_playlistPlayer.GetRepeat(iPlaylist); + + PLAYLIST::REPEAT_STATE state; + if (paramlow == "repeatall") + state = PLAYLIST::REPEAT_ALL; + else if (paramlow == "repeatone") + state = PLAYLIST::REPEAT_ONE; + else if (paramlow == "repeatoff") + state = PLAYLIST::REPEAT_NONE; + else if (previous_state == PLAYLIST::REPEAT_NONE) + state = PLAYLIST::REPEAT_ALL; + else if (previous_state == PLAYLIST::REPEAT_ALL) + state = PLAYLIST::REPEAT_ONE; + else + state = PLAYLIST::REPEAT_NONE; + + if (state == previous_state) + return 0; + + // check to see if we should notify the user + bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify")); + g_playlistPlayer.SetRepeat(iPlaylist, state, notify); + + // save settings for now playing windows + switch (iPlaylist) + { + case PLAYLIST_MUSIC: + CMediaSettings::Get().SetMusicPlaylistRepeat(state == PLAYLIST::REPEAT_ALL); + CSettings::Get().Save(); + break; + case PLAYLIST_VIDEO: + CMediaSettings::Get().SetVideoPlaylistRepeat(state == PLAYLIST::REPEAT_ALL); + CSettings::Get().Save(); + } + + // send messages so now playing window can get updated + CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_REPEAT, 0, 0, iPlaylist, (int)state); + g_windowManager.SendThreadMessage(msg); + } + else if (StringUtils::StartsWithNoCase(parameter, "resumelivetv")) + { + CFileItem& fileItem(g_application.CurrentFileItem()); + PVR::CPVRChannelPtr channel = fileItem.HasPVRRecordingInfoTag() ? fileItem.GetPVRRecordingInfoTag()->Channel() : PVR::CPVRChannelPtr(); + + if (channel) + { + CFileItem playItem(channel); + if (!g_application.PlayMedia(playItem, channel->IsRadio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO)) + { + CLog::Log(LOGERROR, "ResumeLiveTv could not play channel: %s", channel->ChannelName().c_str()); + return false; + } + } + } + } + else if (execute == "playwith") + { + g_application.m_eForcedNextPlayer = CPlayerCoreFactory::Get().GetPlayerCore(parameter); + g_application.OnAction(CAction(ACTION_PLAYER_PLAY)); + } + else if (execute == "mute") + { + g_application.ToggleMute(); + } + else if (execute == "setvolume") + { + float oldVolume = g_application.GetVolume(); + float volume = (float)strtod(parameter.c_str(), NULL); + + g_application.SetVolume(volume); + if(oldVolume != volume) + { + if(params.size() > 1 && StringUtils::EqualsNoCase(params[1], "showVolumeBar")) + { + CApplicationMessenger::Get().ShowVolumeBar(oldVolume < volume); + } + } + } + else if (execute == "playlist.playoffset") + { + // playlist.playoffset(offset) + // playlist.playoffset(music|video,offset) + std::string strPos = parameter; + if (params.size() > 1) + { + // ignore any other parameters if present + std::string strPlaylist = params[0]; + strPos = params[1]; + + int iPlaylist = PLAYLIST_NONE; + if (paramlow == "music") + iPlaylist = PLAYLIST_MUSIC; + else if (paramlow == "video") + iPlaylist = PLAYLIST_VIDEO; + + // unknown playlist + if (iPlaylist == PLAYLIST_NONE) + { + CLog::Log(LOGERROR,"Playlist.PlayOffset called with unknown playlist: %s", strPlaylist.c_str()); + return false; + } + + // user wants to play the 'other' playlist + if (iPlaylist != g_playlistPlayer.GetCurrentPlaylist()) + { + g_application.StopPlaying(); + g_playlistPlayer.Reset(); + g_playlistPlayer.SetCurrentPlaylist(iPlaylist); + } + } + // play the desired offset + int pos = atol(strPos.c_str()); + // playlist is already playing + if (g_application.m_pPlayer->IsPlaying()) + g_playlistPlayer.PlayNext(pos); + // we start playing the 'other' playlist so we need to use play to initialize the player state + else + g_playlistPlayer.Play(pos); + } + else if (execute == "playlist.clear") + { + g_playlistPlayer.Clear(); + } +#ifdef HAS_DVD_DRIVE + else if (execute == "ejecttray") + { + g_mediaManager.ToggleTray(); + } +#endif + else if (execute == "alarmclock" && params.size() > 1) + { + // format is alarmclock(name,command[,seconds,true]); + float seconds = 0; + if (params.size() > 2) + { + if (params[2].find(':') == std::string::npos) + seconds = static_cast(atoi(params[2].c_str())*60); + else + seconds = (float)StringUtils::TimeStringToSeconds(params[2]); + } + else + { // check if shutdown is specified in particular, and get the time for it + std::string strHeading; + if (StringUtils::EqualsNoCase(parameter, "shutdowntimer")) + strHeading = g_localizeStrings.Get(20145); + else + strHeading = g_localizeStrings.Get(13209); + std::string strTime; + if( CGUIDialogNumeric::ShowAndGetNumber(strTime, strHeading) ) + seconds = static_cast(atoi(strTime.c_str())*60); + else + return false; + } + bool silent = false; + bool loop = false; + for (unsigned int i = 3; i < params.size() ; i++) + { + // check "true" for backward comp + if (StringUtils::EqualsNoCase(params[i], "true") || StringUtils::EqualsNoCase(params[i], "silent")) + silent = true; + else if (StringUtils::EqualsNoCase(params[i], "loop")) + loop = true; + } + + if( g_alarmClock.IsRunning() ) + g_alarmClock.Stop(params[0],silent); + // no negative times not allowed, loop must have a positive time + if (seconds < 0 || (seconds == 0 && loop)) + return false; + g_alarmClock.Start(params[0], seconds, params[1], silent, loop); + } + else if (execute == "notification") + { + if (params.size() < 2) + return -1; + if (params.size() == 4) + CGUIDialogKaiToast::QueueNotification(params[3],params[0],params[1],atoi(params[2].c_str())); + else if (params.size() == 3) + CGUIDialogKaiToast::QueueNotification("",params[0],params[1],atoi(params[2].c_str())); + else + CGUIDialogKaiToast::QueueNotification(params[0],params[1]); + } + else if (execute == "cancelalarm") + { + bool silent = false; + if (params.size() > 1 && StringUtils::EqualsNoCase(params[1], "true")) + silent = true; + g_alarmClock.Stop(params[0],silent); + } + else if (execute == "playdvd") + { +#ifdef HAS_DVD_DRIVE + bool restart = false; + if (params.size() > 0 && StringUtils::EqualsNoCase(params[0], "restart")) + restart = true; + CAutorun::PlayDisc(g_mediaManager.GetDiscPath(), true, restart); +#endif + } + else if (execute == "ripcd") + { +#ifdef HAS_CDDA_RIPPER + CCDDARipper::GetInstance().RipCD(); +#endif + } + else if (execute == "skin.togglesetting") + { + int setting = CSkinSettings::Get().TranslateBool(parameter); + CSkinSettings::Get().SetBool(setting, !CSkinSettings::Get().GetBool(setting)); + CSettings::Get().Save(); + } + else if (execute == "skin.setbool" && params.size()) + { + if (params.size() > 1) + { + int string = CSkinSettings::Get().TranslateBool(params[0]); + CSkinSettings::Get().SetBool(string, StringUtils::EqualsNoCase(params[1], "true")); + CSettings::Get().Save(); + return 0; + } + // default is to set it to true + int setting = CSkinSettings::Get().TranslateBool(params[0]); + CSkinSettings::Get().SetBool(setting, true); + CSettings::Get().Save(); + } + else if (execute == "skin.reset") + { + CSkinSettings::Get().Reset(parameter); + CSettings::Get().Save(); + } + else if (execute == "skin.resetsettings") + { + CSkinSettings::Get().Reset(); + CSettings::Get().Save(); + } + else if (execute == "skin.theme") + { + // enumerate themes + vector vecTheme; + CUtil::GetSkinThemes(vecTheme); + + int iTheme = -1; + + // find current theme + if (!StringUtils::EqualsNoCase(CSettings::Get().GetString("lookandfeel.skintheme"), "SKINDEFAULT")) + { + for (unsigned int i=0;i (int)vecTheme.size()-1) + iTheme = -1; + if (iTheme < -1) + iTheme = vecTheme.size()-1; + + std::string strSkinTheme = "SKINDEFAULT"; + if (iTheme != -1 && iTheme < (int)vecTheme.size()) + strSkinTheme = vecTheme[iTheme]; + + CSettings::Get().SetString("lookandfeel.skintheme", strSkinTheme); + // also set the default color theme + std::string colorTheme(URIUtils::ReplaceExtension(strSkinTheme, ".xml")); + if (StringUtils::EqualsNoCase(colorTheme, "Textures.xml")) + colorTheme = "defaults.xml"; + CSettings::Get().SetString("lookandfeel.skincolors", colorTheme); + g_application.ReloadSkin(); + } + else if (execute == "skin.setstring" || execute == "skin.setimage" || + execute == "skin.setfile" || execute == "skin.setpath" || + execute == "skin.setnumeric" || execute == "skin.setlargeimage") + { + // break the parameter up if necessary + int string = 0; + if (params.size() > 1) + { + string = CSkinSettings::Get().TranslateString(params[0]); + if (execute == "skin.setstring") + { + CSkinSettings::Get().SetString(string, params[1]); + CSettings::Get().Save(); + return 0; + } + } + else + string = CSkinSettings::Get().TranslateString(params[0]); + std::string value = CSkinSettings::Get().GetString(string); + VECSOURCES localShares; + g_mediaManager.GetLocalDrives(localShares); + if (execute == "skin.setstring") + { + if (CGUIKeyboardFactory::ShowAndGetInput(value, g_localizeStrings.Get(1029), true)) + CSkinSettings::Get().SetString(string, value); + } + else if (execute == "skin.setnumeric") + { + if (CGUIDialogNumeric::ShowAndGetNumber(value, g_localizeStrings.Get(611))) + CSkinSettings::Get().SetString(string, value); + } + else if (execute == "skin.setimage") + { + if (params.size() > 2) + { + value = params[2]; + URIUtils::AddSlashAtEnd(value); + bool bIsSource; + if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one + { + CMediaSource share; + share.strName = g_localizeStrings.Get(13278); + share.strPath = value; + localShares.push_back(share); + } + } + if (CGUIDialogFileBrowser::ShowAndGetImage(localShares, g_localizeStrings.Get(1030), value)) + CSkinSettings::Get().SetString(string, value); + } + else if (execute == "skin.setlargeimage") + { + VECSOURCES *shares = CMediaSourceSettings::Get().GetSources("pictures"); + if (!shares) shares = &localShares; + if (CGUIDialogFileBrowser::ShowAndGetImage(*shares, g_localizeStrings.Get(1030), value)) + CSkinSettings::Get().SetString(string, value); + } + else if (execute == "skin.setfile") + { + // Note. can only browse one addon type from here + // if browsing for addons, required param[1] is addontype string, with optional param[2] + // as contenttype string see IAddon.h & ADDON::TranslateXX + std::string strMask = (params.size() > 1) ? params[1] : ""; + StringUtils::ToLower(strMask); + ADDON::TYPE type; + if ((type = TranslateType(strMask)) != ADDON_UNKNOWN) + { + CURL url; + url.SetProtocol("addons"); + url.SetHostName("enabled"); + url.SetFileName(strMask+"/"); + localShares.clear(); + std::string content = (params.size() > 2) ? params[2] : ""; + StringUtils::ToLower(content); + url.SetPassword(content); + std::string strMask; + if (type == ADDON_SCRIPT) + strMask = ".py"; + std::string replace; + if (CGUIDialogFileBrowser::ShowAndGetFile(url.Get(), strMask, TranslateType(type, true), replace, true, true, true)) + { + if (StringUtils::StartsWithNoCase(replace, "addons://")) + CSkinSettings::Get().SetString(string, URIUtils::GetFileName(replace)); + else + CSkinSettings::Get().SetString(string, replace); + } + } + else + { + if (params.size() > 2) + { + value = params[2]; + URIUtils::AddSlashAtEnd(value); + bool bIsSource; + if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one + { + CMediaSource share; + share.strName = g_localizeStrings.Get(13278); + share.strPath = value; + localShares.push_back(share); + } + } + if (CGUIDialogFileBrowser::ShowAndGetFile(localShares, strMask, g_localizeStrings.Get(1033), value)) + CSkinSettings::Get().SetString(string, value); + } + } + else // execute == "skin.setpath")) + { + g_mediaManager.GetNetworkLocations(localShares); + if (params.size() > 1) + { + value = params[1]; + URIUtils::AddSlashAtEnd(value); + bool bIsSource; + if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one + { + CMediaSource share; + share.strName = g_localizeStrings.Get(13278); + share.strPath = value; + localShares.push_back(share); + } + } + if (CGUIDialogFileBrowser::ShowAndGetDirectory(localShares, g_localizeStrings.Get(1031), value)) + CSkinSettings::Get().SetString(string, value); + } + CSettings::Get().Save(); + } + else if (execute == "skin.setaddon" && params.size() > 1) + { + int string = CSkinSettings::Get().TranslateString(params[0]); + vector types; + for (unsigned int i = 1 ; i < params.size() ; i++) + { + ADDON::TYPE type = TranslateType(params[i]); + if (type != ADDON_UNKNOWN) + types.push_back(type); + } + std::string result; + if (types.size() > 0 && CGUIWindowAddonBrowser::SelectAddonID(types, result, true) == 1) + { + CSkinSettings::Get().SetString(string, result); + CSettings::Get().Save(); + } + } + else if (execute == "dialog.close" && params.size()) + { + bool bForce = false; + if (params.size() > 1 && StringUtils::EqualsNoCase(params[1], "true")) + bForce = true; + if (StringUtils::EqualsNoCase(params[0], "all")) + { + g_windowManager.CloseDialogs(bForce); + } + else + { + int id = CButtonTranslator::TranslateWindow(params[0]); + CGUIWindow *window = (CGUIWindow *)g_windowManager.GetWindow(id); + if (window && window->IsDialog()) + ((CGUIDialog *)window)->Close(bForce); + } + } + else if (execute == "system.logoff") + { + // there was a commit from cptspiff here which was reverted + // for keeping the behaviour from Eden in Frodo - see + // git rev 9ee5f0047b + if (g_windowManager.GetActiveWindow() == WINDOW_LOGIN_SCREEN) + return -1; + + g_application.StopPlaying(); + if (g_application.IsMusicScanning()) + g_application.StopMusicScan(); + + if (CVideoLibraryQueue::Get().IsRunning()) + CVideoLibraryQueue::Get().CancelAllJobs(); + + ADDON::CAddonMgr::Get().StopServices(true); + + g_application.getNetwork().NetworkMessage(CNetwork::SERVICES_DOWN,1); + CProfilesManager::Get().LoadMasterProfileForLogin(); + g_passwordManager.bMasterUser = false; + + if (!ActivateWindow(WINDOW_LOGIN_SCREEN)) + return false; + + if (!CNetworkServices::Get().StartEventServer()) // event server could be needed in some situations + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(33102), g_localizeStrings.Get(33100)); + } + else if (execute == "pagedown") + { + int id = atoi(parameter.c_str()); + CGUIMessage message(GUI_MSG_PAGE_DOWN, g_windowManager.GetFocusedWindow(), id); + g_windowManager.SendMessage(message); + } + else if (execute == "pageup") + { + int id = atoi(parameter.c_str()); + CGUIMessage message(GUI_MSG_PAGE_UP, g_windowManager.GetFocusedWindow(), id); + g_windowManager.SendMessage(message); + } + else if (execute == "updatelibrary" && !params.empty()) + { + bool userInitiated = true; + if (params.size() > 2) + userInitiated = StringUtils::EqualsNoCase(params[2], "true"); + if (StringUtils::EqualsNoCase(params[0], "music")) + { + if (g_application.IsMusicScanning()) + g_application.StopMusicScan(); + else + g_application.StartMusicScan(params.size() > 1 ? params[1] : "", userInitiated); + } + if (StringUtils::EqualsNoCase(params[0], "video")) + { + if (g_application.IsVideoScanning()) + g_application.StopVideoScan(); + else + g_application.StartVideoScan(params.size() > 1 ? params[1] : "", userInitiated); + } + } + else if (execute == "cleanlibrary") + { + bool userInitiated = true; + if (params.size() > 1) + userInitiated = StringUtils::EqualsNoCase(params[1], "true"); + if (!params.size() || StringUtils::EqualsNoCase(params[0], "video")) + { + if (!g_application.IsVideoScanning()) + g_application.StartVideoCleanup(userInitiated); + else + CLog::Log(LOGERROR, "CleanLibrary is not possible while scanning or cleaning"); + } + else if (StringUtils::EqualsNoCase(params[0], "music")) + { + if (!g_application.IsMusicScanning()) + g_application.StartMusicCleanup(userInitiated); + else + CLog::Log(LOGERROR, "CleanLibrary is not possible while scanning for media info"); + } + } + else if (execute == "exportlibrary" && !params.empty()) + { + int iHeading = 647; + if (StringUtils::EqualsNoCase(params[0], "music")) + iHeading = 20196; + std::string path; + VECSOURCES shares; + g_mediaManager.GetLocalDrives(shares); + g_mediaManager.GetNetworkLocations(shares); + g_mediaManager.GetRemovableDrives(shares); + bool singleFile; + bool thumbs=false; + bool actorThumbs=false; + bool overwrite=false; + bool cancelled=false; + + if (params.size() > 1) + singleFile = StringUtils::EqualsNoCase(params[1], "true"); + else + singleFile = CGUIDialogYesNo::ShowAndGetInput(iHeading, 20426, cancelled, 20428, 20429); + + if (cancelled) + return -1; + + if (singleFile) + { + if (params.size() > 2) + thumbs = StringUtils::EqualsNoCase(params[2], "true"); + else + thumbs = CGUIDialogYesNo::ShowAndGetInput(iHeading, 20430, cancelled); + } + + if (cancelled) + return -1; + + if (thumbs && StringUtils::EqualsNoCase(params[0], "video")) + { + if (params.size() > 4) + actorThumbs = StringUtils::EqualsNoCase(params[4], "true"); + else + actorThumbs = CGUIDialogYesNo::ShowAndGetInput(iHeading, 20436, cancelled); + } + + if (cancelled) + return -1; + + if (singleFile) + { + if (params.size() > 3) + overwrite = StringUtils::EqualsNoCase(params[3], "true"); + else + overwrite = CGUIDialogYesNo::ShowAndGetInput(iHeading, 20431, cancelled); + } + + if (cancelled) + return -1; + + if (params.size() > 2) + path=params[2]; + if (singleFile || !path.empty() || + CGUIDialogFileBrowser::ShowAndGetDirectory(shares, + g_localizeStrings.Get(661), path, true)) + { + if (StringUtils::EqualsNoCase(params[0], "video")) + { + CVideoDatabase videodatabase; + videodatabase.Open(); + videodatabase.ExportToXML(path, singleFile, thumbs, actorThumbs, overwrite); + videodatabase.Close(); + } + else + { + if (URIUtils::HasSlashAtEnd(path)) + path = URIUtils::AddFileToFolder(path, "musicdb.xml"); + CMusicDatabase musicdatabase; + musicdatabase.Open(); + musicdatabase.ExportToXML(path, singleFile, thumbs, overwrite); + musicdatabase.Close(); + } + } + } + else if (execute == "control.move" && params.size() > 1) + { + CGUIMessage message(GUI_MSG_MOVE_OFFSET, g_windowManager.GetFocusedWindow(), atoi(params[0].c_str()), atoi(params[1].c_str())); + g_windowManager.SendMessage(message); + } + else if (execute == "container.refresh") + { // NOTE: These messages require a media window, thus they're sent to the current activewindow. + // This shouldn't stop a dialog intercepting it though. + CGUIMessage message(GUI_MSG_NOTIFY_ALL, g_windowManager.GetActiveWindow(), 0, GUI_MSG_UPDATE, 1); // 1 to reset the history + message.SetStringParam(parameter); + g_windowManager.SendMessage(message); + } + else if (execute == "container.update" && !params.empty()) + { + CGUIMessage message(GUI_MSG_NOTIFY_ALL, g_windowManager.GetActiveWindow(), 0, GUI_MSG_UPDATE, 0); + message.SetStringParam(params[0]); + if (params.size() > 1 && StringUtils::EqualsNoCase(params[1], "replace")) + message.SetParam2(1); // reset the history + g_windowManager.SendMessage(message); + } + else if (execute == "container.nextviewmode") + { + CGUIMessage message(GUI_MSG_CHANGE_VIEW_MODE, g_windowManager.GetActiveWindow(), 0, 0, 1); + g_windowManager.SendMessage(message); + } + else if (execute == "container.previousviewmode") + { + CGUIMessage message(GUI_MSG_CHANGE_VIEW_MODE, g_windowManager.GetActiveWindow(), 0, 0, -1); + g_windowManager.SendMessage(message); + } + else if (execute == "container.setviewmode") + { + CGUIMessage message(GUI_MSG_CHANGE_VIEW_MODE, g_windowManager.GetActiveWindow(), 0, atoi(parameter.c_str())); + g_windowManager.SendMessage(message); + } + else if (execute == "container.nextsortmethod") + { + CGUIMessage message(GUI_MSG_CHANGE_SORT_METHOD, g_windowManager.GetActiveWindow(), 0, 0, 1); + g_windowManager.SendMessage(message); + } + else if (execute == "container.previoussortmethod") + { + CGUIMessage message(GUI_MSG_CHANGE_SORT_METHOD, g_windowManager.GetActiveWindow(), 0, 0, -1); + g_windowManager.SendMessage(message); + } + else if (execute == "container.setsortmethod") + { + CGUIMessage message(GUI_MSG_CHANGE_SORT_METHOD, g_windowManager.GetActiveWindow(), 0, atoi(parameter.c_str())); + g_windowManager.SendMessage(message); + } + else if (execute == "container.sortdirection") + { + CGUIMessage message(GUI_MSG_CHANGE_SORT_DIRECTION, g_windowManager.GetActiveWindow(), 0, 0); + g_windowManager.SendMessage(message); + } + else if (execute == "control.message" && params.size() >= 2) + { + int controlID = atoi(params[0].c_str()); + int windowID = (params.size() == 3) ? CButtonTranslator::TranslateWindow(params[2]) : g_windowManager.GetActiveWindow(); + if (params[1] == "moveup") + g_windowManager.SendMessage(GUI_MSG_MOVE_OFFSET, windowID, controlID, 1); + else if (params[1] == "movedown") + g_windowManager.SendMessage(GUI_MSG_MOVE_OFFSET, windowID, controlID, -1); + else if (params[1] == "pageup") + g_windowManager.SendMessage(GUI_MSG_PAGE_UP, windowID, controlID); + else if (params[1] == "pagedown") + g_windowManager.SendMessage(GUI_MSG_PAGE_DOWN, windowID, controlID); + else if (params[1] == "click") + g_windowManager.SendMessage(GUI_MSG_CLICKED, controlID, windowID); + } + else if (execute == "sendclick" && !params.empty()) + { + if (params.size() == 2) + { + // have a window - convert it + int windowID = CButtonTranslator::TranslateWindow(params[0]); + CGUIMessage message(GUI_MSG_CLICKED, atoi(params[1].c_str()), windowID); + g_windowManager.SendMessage(message); + } + else + { // single param - assume you meant the active window + CGUIMessage message(GUI_MSG_CLICKED, atoi(params[0].c_str()), g_windowManager.GetActiveWindow()); + g_windowManager.SendMessage(message); + } + } + else if (execute == "action" && !params.empty()) + { + // try translating the action from our ButtonTranslator + int actionID; + if (CButtonTranslator::TranslateActionString(params[0].c_str(), actionID)) + { + int windowID = params.size() == 2 ? CButtonTranslator::TranslateWindow(params[1]) : WINDOW_INVALID; + CApplicationMessenger::Get().SendAction(CAction(actionID), windowID); + } + } + else if (execute == "setproperty" && params.size() >= 2) + { + CGUIWindow *window = g_windowManager.GetWindow(params.size() > 2 ? CButtonTranslator::TranslateWindow(params[2]) : g_windowManager.GetFocusedWindow()); + if (window) + window->SetProperty(params[0],params[1]); + } + else if (execute == "clearproperty" && !params.empty()) + { + CGUIWindow *window = g_windowManager.GetWindow(params.size() > 1 ? CButtonTranslator::TranslateWindow(params[1]) : g_windowManager.GetFocusedWindow()); + if (window) + window->SetProperty(params[0],""); + } + else if (execute == "wakeonlan") + { + g_application.getNetwork().WakeOnLan((char*)params[0].c_str()); + } + else if (execute == "addon.default.opensettings" && params.size() == 1) + { + AddonPtr addon; + ADDON::TYPE type = TranslateType(params[0]); + if (CAddonMgr::Get().GetDefault(type, addon)) + { + bool changed = CGUIDialogAddonSettings::ShowAndGetInput(addon); + if (type == ADDON_VIZ && changed) + g_windowManager.SendMessage(GUI_MSG_VISUALISATION_RELOAD, 0, 0); + } + } + else if (execute == "addon.default.set" && params.size() == 1) + { + std::string addonID; + TYPE type = TranslateType(params[0]); + bool allowNone = false; + if (type == ADDON_VIZ) + allowNone = true; + + if (type != ADDON_UNKNOWN && + CGUIWindowAddonBrowser::SelectAddonID(type,addonID,allowNone)) + { + CAddonMgr::Get().SetDefault(type,addonID); + if (type == ADDON_VIZ) + g_windowManager.SendMessage(GUI_MSG_VISUALISATION_RELOAD, 0, 0); + } + } + else if (execute == "addon.opensettings" && params.size() == 1) + { + AddonPtr addon; + if (CAddonMgr::Get().GetAddon(params[0], addon)) + CGUIDialogAddonSettings::ShowAndGetInput(addon); + } + else if (execute == "updateaddonrepos") + { + CAddonInstaller::Get().UpdateRepos(true); + } + else if (execute == "updatelocaladdons") + { + CAddonMgr::Get().FindAddons(); + } + else if (execute == "toggledpms") + { + g_application.ToggleDPMS(true); + } + else if (execute == "cectogglestate") + { + CApplicationMessenger::Get().CECToggleState(); + } + else if (execute == "cecactivatesource") + { + CApplicationMessenger::Get().CECActivateSource(); + } + else if (execute == "cecstandby") + { + CApplicationMessenger::Get().CECStandby(); + } + else if (execute == "weather.locationset" && !params.empty()) + { + int loc = atoi(params[0].c_str()); + CGUIMessage msg(GUI_MSG_ITEM_SELECT, 0, 0, loc); + g_windowManager.SendMessage(msg, WINDOW_WEATHER); + } + else if (execute == "weather.locationnext") + { + CGUIMessage msg(GUI_MSG_MOVE_OFFSET, 0, 0, 1); + g_windowManager.SendMessage(msg, WINDOW_WEATHER); + } + else if (execute == "weather.locationprevious") + { + CGUIMessage msg(GUI_MSG_MOVE_OFFSET, 0, 0, -1); + g_windowManager.SendMessage(msg, WINDOW_WEATHER); + } + else if (execute == "weather.refresh") + { + CGUIMessage msg(GUI_MSG_MOVE_OFFSET, 0, 0, 0); + g_windowManager.SendMessage(msg, WINDOW_WEATHER); + } + else if (execute == "videolibrary.search") + { + CGUIMessage msg(GUI_MSG_SEARCH, 0, 0, 0); + g_windowManager.SendMessage(msg, WINDOW_VIDEO_NAV); + } + else if (execute == "toggledebug") + { + bool debug = CSettings::Get().GetBool("debug.showloginfo"); + CSettings::Get().SetBool("debug.showloginfo", !debug); + g_advancedSettings.SetDebugMode(!debug); + } + else if (execute == "startpvrmanager") + { + g_application.StartPVRManager(); + } + else if (execute == "stoppvrmanager") + { + g_application.StopPVRManager(); + } + else if (execute == "startandroidactivity" && !params.empty()) + { + CApplicationMessenger::Get().StartAndroidActivity(params); + } + else if (execute == "setstereomode" && !parameter.empty()) + { + CAction action = CStereoscopicsManager::Get().ConvertActionCommandToAction(execute, parameter); + if (action.GetID() != ACTION_NONE) + CApplicationMessenger::Get().SendAction(action); + else + { + CLog::Log(LOGERROR,"Builtin 'SetStereoMode' called with unknown parameter: %s", parameter.c_str()); + return -2; + } + } + else + return CInputManager::Get().ExecuteBuiltin(execute, params); + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/Builtins.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/Builtins.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/Builtins.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/Builtins.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,37 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include +#include + +class CBuiltins +{ +public: + static bool HasCommand(const std::string& execString); + static bool IsSystemPowerdownCommand(const std::string& execString); + static void GetHelp(std::string &help); + static int Execute(const std::string& execString); + +private: + static bool ActivateWindow(int iWindowID, const std::vector& params = std::vector(), bool swappingWindows = false); +}; + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/generic/ScriptInvocationManager.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/generic/ScriptInvocationManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/generic/ScriptInvocationManager.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/generic/ScriptInvocationManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,12 +18,10 @@ * */ -#include "ScriptInvocationManager.h" - -#include -#include +#include #include +#include "ScriptInvocationManager.h" #include "filesystem/File.h" #include "interfaces/generic/ILanguageInvocationHandler.h" #include "interfaces/generic/ILanguageInvoker.h" @@ -33,6 +31,7 @@ #include "utils/URIUtils.h" #include "utils/log.h" +using namespace std; using namespace XFILE; CScriptInvocationManager::CScriptInvocationManager() @@ -44,7 +43,7 @@ Uninitialize(); } -CScriptInvocationManager& CScriptInvocationManager::GetInstance() +CScriptInvocationManager& CScriptInvocationManager::Get() { static CScriptInvocationManager s_instance; return s_instance; @@ -54,7 +53,7 @@ { CSingleLock lock(m_critSection); // go through all active threads and find and remove all which are done - std::vector tempList; + vector tempList; for (LanguageInvokerThreadMap::iterator it = m_scripts.begin(); it != m_scripts.end(); ) { if (it->second.done) @@ -67,7 +66,7 @@ } // remove the finished scripts from the script path map as well - for (std::vector::const_iterator it = tempList.begin(); it != tempList.end(); ++it) + for (vector::const_iterator it = tempList.begin(); it != tempList.end(); ++it) m_scriptPaths.erase(it->script); // we can leave the lock now @@ -90,7 +89,7 @@ Process(); // make sure all scripts are done - std::vector tempList; + vector tempList; for (LanguageInvokerThreadMap::iterator script = m_scripts.begin(); script != m_scripts.end(); ++script) tempList.push_back(script->second); @@ -103,7 +102,7 @@ // finally stop and remove the finished threads but we do it outside of any // locks in case of any callbacks from the stop or destruction logic of // CLanguageInvokerThread or the ILanguageInvoker implementation - for (std::vector::iterator it = tempList.begin(); it != tempList.end(); ++it) + for (vector::iterator it = tempList.begin(); it != tempList.end(); ++it) { if (!it->done) it->thread->Stop(true); @@ -123,7 +122,7 @@ if (invocationHandler == NULL || extension.empty()) return; - std::string ext = extension; + string ext = extension; StringUtils::ToLower(ext); if (!StringUtils::StartsWithNoCase(ext, ".")) ext = "." + ext; @@ -132,7 +131,7 @@ if (m_invocationHandlers.find(ext) != m_invocationHandlers.end()) return; - m_invocationHandlers.insert(std::make_pair(extension, invocationHandler)); + m_invocationHandlers.insert(make_pair(extension, invocationHandler)); bool known = false; for (std::map::const_iterator it = m_invocationHandlers.begin(); it != m_invocationHandlers.end(); ++it) @@ -154,7 +153,7 @@ if (invocationHandler == NULL || extensions.empty()) return; - for (std::set::const_iterator extension = extensions.begin(); extension != extensions.end(); ++extension) + for (set::const_iterator extension = extensions.begin(); extension != extensions.end(); ++extension) RegisterLanguageInvocationHandler(invocationHandler, *extension); } @@ -165,7 +164,7 @@ CSingleLock lock(m_critSection); // get all extensions of the given language invoker - for (std::map::iterator it = m_invocationHandlers.begin(); it != m_invocationHandlers.end(); ) + for (map::iterator it = m_invocationHandlers.begin(); it != m_invocationHandlers.end(); ) { if (it->second == invocationHandler) m_invocationHandlers.erase(it++); @@ -183,7 +182,7 @@ StringUtils::ToLower(extension); CSingleLock lock(m_critSection); - std::map::const_iterator it = m_invocationHandlers.find(extension); + map::const_iterator it = m_invocationHandlers.find(extension); return it != m_invocationHandlers.end() && it->second != NULL; } @@ -193,7 +192,7 @@ StringUtils::ToLower(extension); CSingleLock lock(m_critSection); - std::map::const_iterator it = m_invocationHandlers.find(extension); + map::const_iterator it = m_invocationHandlers.find(extension); if (it != m_invocationHandlers.end() && it->second != NULL) return LanguageInvokerPtr(it->second->CreateInvoker()); @@ -238,8 +237,8 @@ lock.Leave(); LanguageInvokerThread thread = { invokerThread, script, false }; - m_scripts.insert(std::make_pair(invokerThread->GetId(), thread)); - m_scriptPaths.insert(std::make_pair(script, invokerThread->GetId())); + m_scripts.insert(make_pair(invokerThread->GetId(), thread)); + m_scriptPaths.insert(make_pair(script, invokerThread->GetId())); invokerThread->Execute(script, arguments); return invokerThread->GetId(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/generic/ScriptInvocationManager.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/generic/ScriptInvocationManager.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/generic/ScriptInvocationManager.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/generic/ScriptInvocationManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,7 @@ class CScriptInvocationManager { public: - static CScriptInvocationManager& GetInstance(); + static CScriptInvocationManager& Get(); void Process(); void Uninitialize(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/info/InfoExpression.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/info/InfoExpression.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/info/InfoExpression.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/info/InfoExpression.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,7 @@ #include #include +using namespace std; using namespace INFO; InfoSingle::InfoSingle(const std::string &expression, int context) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/info/SkinVariable.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/info/SkinVariable.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/info/SkinVariable.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/info/SkinVariable.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,6 +22,7 @@ #include "GUIInfoManager.h" #include "utils/XBMCTinyXML.h" +using namespace std; using namespace INFO; const CSkinVariableString* CSkinVariable::CreateFromXML(const TiXmlElement& node, int context) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/AddonsOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/AddonsOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/AddonsOperations.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/AddonsOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,20 +23,19 @@ #include "addons/AddonManager.h" #include "addons/AddonDatabase.h" #include "addons/PluginSource.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "TextureCache.h" #include "filesystem/File.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" +using namespace std; using namespace JSONRPC; using namespace ADDON; using namespace XFILE; -using namespace KODI::MESSAGING; JSONRPC_STATUS CAddonsOperations::GetAddons(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - std::vector addonTypes; + vector addonTypes; TYPE addonType = TranslateType(parameterObject["type"].asString()); CPluginSource::Content content = CPluginSource::Translate(parameterObject["content"].asString()); CVariant enabled = parameterObject["enabled"]; @@ -73,30 +72,30 @@ addonTypes.push_back(addonType); VECADDONS addons; - for (std::vector::const_iterator typeIt = addonTypes.begin(); typeIt != addonTypes.end(); ++typeIt) + for (vector::const_iterator typeIt = addonTypes.begin(); typeIt != addonTypes.end(); ++typeIt) { VECADDONS typeAddons; if (*typeIt == ADDON_UNKNOWN) { if (!enabled.isBoolean()) { - CAddonMgr::GetInstance().GetAllAddons(typeAddons, false); - CAddonMgr::GetInstance().GetAllAddons(typeAddons, true); + CAddonMgr::Get().GetAllAddons(typeAddons, false); + CAddonMgr::Get().GetAllAddons(typeAddons, true); } else - CAddonMgr::GetInstance().GetAllAddons(typeAddons, enabled.asBoolean()); + CAddonMgr::Get().GetAllAddons(typeAddons, enabled.asBoolean()); } else { if (!enabled.isBoolean()) { - CAddonMgr::GetInstance().GetAddons(*typeIt, typeAddons, false); + CAddonMgr::Get().GetAddons(*typeIt, typeAddons, false); VECADDONS enabledAddons; - CAddonMgr::GetInstance().GetAddons(*typeIt, enabledAddons, true); + CAddonMgr::Get().GetAddons(*typeIt, enabledAddons, true); typeAddons.insert(typeAddons.end(), enabledAddons.begin(), enabledAddons.end()); } else - CAddonMgr::GetInstance().GetAddons(*typeIt, typeAddons, enabled.asBoolean()); + CAddonMgr::Get().GetAddons(*typeIt, typeAddons, enabled.asBoolean()); } addons.insert(addons.end(), typeAddons.begin(), typeAddons.end()); @@ -129,9 +128,9 @@ JSONRPC_STATUS CAddonsOperations::GetAddonDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - std::string id = parameterObject["addonid"].asString(); + string id = parameterObject["addonid"].asString(); AddonPtr addon; - if (!CAddonMgr::GetInstance().GetAddon(id, addon, ADDON::ADDON_UNKNOWN, false) || addon.get() == NULL || + if (!CAddonMgr::Get().GetAddon(id, addon, ADDON::ADDON_UNKNOWN, false) || addon.get() == NULL || addon->Type() <= ADDON_UNKNOWN || addon->Type() >= ADDON_MAX) return InvalidParams; @@ -143,34 +142,29 @@ JSONRPC_STATUS CAddonsOperations::SetAddonEnabled(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - std::string id = parameterObject["addonid"].asString(); - AddonPtr addon; - if (!CAddonMgr::GetInstance().GetAddon(id, addon, ADDON::ADDON_UNKNOWN, false) || addon == nullptr || - addon->Type() <= ADDON_UNKNOWN || addon->Type() >= ADDON_MAX) - return InvalidParams; - + string id = parameterObject["addonid"].asString(); bool disabled = false; if (parameterObject["enabled"].isBoolean()) disabled = !parameterObject["enabled"].asBoolean(); // we need to toggle the current disabled state of the addon else if (parameterObject["enabled"].isString()) - disabled = !CAddonMgr::GetInstance().IsAddonDisabled(id); + disabled = !CAddonMgr::Get().IsAddonDisabled(id); else return InvalidParams; - bool success = disabled ? CAddonMgr::GetInstance().DisableAddon(id) : CAddonMgr::GetInstance().EnableAddon(id); + bool success = disabled ? CAddonMgr::Get().DisableAddon(id) : CAddonMgr::Get().EnableAddon(id); return success ? ACK : InvalidParams; } JSONRPC_STATUS CAddonsOperations::ExecuteAddon(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - std::string id = parameterObject["addonid"].asString(); + string id = parameterObject["addonid"].asString(); AddonPtr addon; - if (!CAddonMgr::GetInstance().GetAddon(id, addon) || addon.get() == NULL || + if (!CAddonMgr::Get().GetAddon(id, addon) || addon.get() == NULL || addon->Type() < ADDON_VIZ || addon->Type() >= ADDON_MAX) return InvalidParams; - std::string argv; + string argv; CVariant params = parameterObject["params"]; if (params.isObject()) { @@ -201,11 +195,7 @@ cmd = StringUtils::Format("RunAddon(%s)", id.c_str()); else cmd = StringUtils::Format("RunAddon(%s, %s)", id.c_str(), argv.c_str()); - - if (params["wait"].asBoolean()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, cmd); - else - CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, cmd); + CApplicationMessenger::Get().ExecBuiltIn(cmd, parameterObject["wait"].asBoolean()); return ACK; } @@ -224,13 +214,13 @@ for (unsigned int index = 0; index < fields.size(); index++) { - std::string field = fields[index].asString(); + string field = fields[index].asString(); // we need to manually retrieve the enabled state of every addon // from the addon database because it can't be read from addon.xml if (field == "enabled") { - object[field] = !CAddonMgr::GetInstance().IsAddonDisabled(addon->ID()); + object[field] = !CAddonMgr::Get().IsAddonDisabled(addon->ID()); } else if (field == "fanart" || field == "thumbnail") { @@ -238,7 +228,7 @@ // We need to check the existence of fanart and thumbnails as the addon simply // holds where the art will be, not whether it exists. bool needsRecaching; - std::string image = CTextureCache::GetInstance().CheckCachedImage(url, false, needsRecaching); + std::string image = CTextureCache::Get().CheckCachedImage(url, false, needsRecaching); if (!image.empty() || CFile::Exists(url)) object[field] = CTextureUtils::GetWrappedImageURL(url); else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/AddonsOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/AddonsOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/AddonsOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/AddonsOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,6 @@ #include "addons/IAddon.h" class CAddonDatabase; -class CVariant; namespace JSONRPC { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/ApplicationOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/ApplicationOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/ApplicationOperations.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/ApplicationOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,19 +21,13 @@ #include "ApplicationOperations.h" #include "InputOperations.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" -#include "FileItem.h" -#include "Util.h" -#include "utils/log.h" -#include "GUIInfoManager.h" +#include "ApplicationMessenger.h" #include "system.h" #include "CompileInfo.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include using namespace JSONRPC; -using namespace KODI::MESSAGING; JSONRPC_STATUS CApplicationOperations::GetProperties(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { @@ -89,7 +83,7 @@ else return InvalidParams; - CApplicationMessenger::GetInstance().PostMsg(TMSG_VOLUME_SHOW, up ? ACTION_VOLUME_UP : ACTION_VOLUME_DOWN); + CApplicationMessenger::Get().ShowVolumeBar(up); return GetPropertyValue("volume", result); } @@ -98,7 +92,7 @@ { if ((parameterObject["mute"].isString() && parameterObject["mute"].asString().compare("toggle") == 0) || (parameterObject["mute"].isBoolean() && parameterObject["mute"].asBoolean() != g_application.IsMuted())) - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_MUTE))); + CApplicationMessenger::Get().SendAction(CAction(ACTION_MUTE)); else if (!parameterObject["mute"].isBoolean() && !parameterObject["mute"].isString()) return InvalidParams; @@ -107,7 +101,7 @@ JSONRPC_STATUS CApplicationOperations::Quit(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT); + CApplicationMessenger::Get().Quit(); return ACK; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/ApplicationOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/ApplicationOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/ApplicationOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/ApplicationOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,8 +22,6 @@ #include "JSONRPC.h" #include "FileItemHandler.h" -class CVariant; - namespace JSONRPC { class CApplicationOperations : CFileItemHandler diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/AudioLibrary.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/AudioLibrary.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/AudioLibrary.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/AudioLibrary.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,24 +22,19 @@ #include "music/MusicDatabase.h" #include "FileItem.h" #include "Util.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "music/tags/MusicInfoTag.h" #include "music/Artist.h" #include "music/Album.h" #include "music/Song.h" -#include "music/Artist.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "filesystem/Directory.h" #include "settings/Settings.h" -#include "settings/AdvancedSettings.h" using namespace MUSIC_INFO; using namespace JSONRPC; using namespace XFILE; -using namespace KODI::MESSAGING; JSONRPC_STATUS CAudioLibrary::GetArtists(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { @@ -48,9 +43,7 @@ return InternalError; CMusicDbUrl musicUrl; - if (!musicUrl.FromString("musicdb://artists/")) - return InternalError; - + musicUrl.FromString("musicdb://artists/"); int genreID = -1, albumID = -1, songID = -1; const CVariant &filter = parameterObject["filter"]; if (filter.isMember("genreid")) @@ -72,7 +65,7 @@ musicUrl.AddOption("xsp", xsp); } - bool albumArtistsOnly = !CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_SHOWCOMPILATIONARTISTS); + bool albumArtistsOnly = !CSettings::Get().GetBool("musiclibrary.showcompilationartists"); if (parameterObject["albumartistsonly"].isBoolean()) albumArtistsOnly = parameterObject["albumartistsonly"].asBoolean(); @@ -134,19 +127,19 @@ return InternalError; CMusicDbUrl musicUrl; - if (!musicUrl.FromString("musicdb://albums/")) - return InternalError; + musicUrl.FromString("musicdb://albums/"); if (parameterObject["includesingles"].asBoolean()) musicUrl.AddOption("show_singles", true); + int artistID = -1, genreID = -1; const CVariant &filter = parameterObject["filter"]; if (filter.isMember("artistid")) - musicUrl.AddOption("artistid", (int)filter["artistid"].asInteger()); + artistID = (int)filter["artistid"].asInteger(); else if (filter.isMember("artist")) musicUrl.AddOption("artist", filter["artist"].asString()); else if (filter.isMember("genreid")) - musicUrl.AddOption("genreid", (int)filter["genreid"].asInteger()); + genreID = (int)filter["genreid"].asInteger(); else if (filter.isMember("genre")) musicUrl.AddOption("genre", filter["genre"].asString()); else if (filter.isObject()) @@ -163,32 +156,17 @@ if (!ParseSorting(parameterObject, sorting.sortBy, sorting.sortOrder, sorting.sortAttributes)) return InvalidParams; - int total; - VECALBUMS albums; - if (!musicdatabase.GetAlbumsByWhere(musicUrl.ToString(), CDatabase::Filter(), albums, total, sorting)) - return InternalError; - CFileItemList items; - items.Reserve(albums.size()); - for (unsigned int index = 0; index < albums.size(); index++) - { - CMusicDbUrl itemUrl = musicUrl; - std::string path = StringUtils::Format("%i/", albums[index].idAlbum); - itemUrl.AppendPath(path); - - CFileItemPtr pItem; - FillAlbumItem(albums[index], itemUrl.ToString(), pItem); - items.Add(pItem); - } + if (!musicdatabase.GetAlbumsNav(musicUrl.ToString(), items, genreID, artistID, CDatabase::Filter(), sorting)) + return InternalError; - //Get Genre IDs JSONRPC_STATUS ret = GetAdditionalAlbumDetails(parameterObject, items, musicdatabase); if (ret != OK) return ret; int size = items.Size(); - if (total > size) - size = total; + if (items.HasProperty("total") && items.GetProperty("total").asInteger() > size) + size = (int)items.GetProperty("total").asInteger(); HandleFileItemList("albumid", false, "albums", items, parameterObject, result, size, false); return OK; @@ -231,23 +209,23 @@ return InternalError; CMusicDbUrl musicUrl; - if (!musicUrl.FromString("musicdb://songs/")) - return InternalError; + musicUrl.FromString("musicdb://songs/"); if (!parameterObject["includesingles"].asBoolean()) musicUrl.AddOption("singles", false); + int genreID = -1, albumID = -1, artistID = -1; const CVariant &filter = parameterObject["filter"]; if (filter.isMember("artistid")) - musicUrl.AddOption("artistid", (int)filter["artistid"].asInteger()); + artistID = (int)filter["artistid"].asInteger(); else if (filter.isMember("artist")) musicUrl.AddOption("artist", filter["artist"].asString()); else if (filter.isMember("genreid")) - musicUrl.AddOption("genreid", (int)filter["genreid"].asInteger()); + genreID = (int)filter["genreid"].asInteger(); else if (filter.isMember("genre")) musicUrl.AddOption("genre", filter["genre"].asString()); else if (filter.isMember("albumid")) - musicUrl.AddOption("albumid", (int)filter["albumid"].asInteger()); + albumID = (int)filter["albumid"].asInteger(); else if (filter.isMember("album")) musicUrl.AddOption("album", filter["album"].asString()); else if (filter.isObject()) @@ -265,8 +243,8 @@ return InvalidParams; CFileItemList items; - if (!musicdatabase.GetSongsFullByWhere(musicUrl.ToString(), CDatabase::Filter(), items, sorting, true)) - return InternalError; + if (!musicdatabase.GetSongsNav(musicUrl.ToString(), items, genreID, artistID, albumID, sorting)) + return InternalError; JSONRPC_STATUS ret = GetAdditionalSongDetails(parameterObject, items, musicdatabase); if (ret != OK) @@ -293,10 +271,7 @@ return InvalidParams; CFileItemList items; - CFileItemPtr item = CFileItemPtr(new CFileItem(song)); - FillItemArtistIDs(song.GetArtistIDArray(), item); - items.Add(item); - + items.Add(CFileItemPtr(new CFileItem(song))); JSONRPC_STATUS ret = GetAdditionalSongDetails(parameterObject, items, musicdatabase); if (ret != OK) return ret; @@ -475,14 +450,8 @@ if (ParameterNotNull(parameterObject, "title")) album.strAlbum = parameterObject["title"].asString(); - // Artist names, along with MusicbrainzAlbumArtistID needs to update artist credits - // As temp fix just set the album artist description string if (ParameterNotNull(parameterObject, "artist")) - { - std::vector artist; - CopyStringArray(parameterObject["artist"], artist); - album.strArtistDesc = StringUtils::Join(artist, g_advancedSettings.m_musicItemSeparator); - } + CopyStringArray(parameterObject["artist"], album.artist); if (ParameterNotNull(parameterObject, "description")) album.strReview = parameterObject["description"].asString(); if (ParameterNotNull(parameterObject, "genre")) @@ -523,25 +492,16 @@ if (ParameterNotNull(parameterObject, "title")) song.strTitle = parameterObject["title"].asString(); - // Artist names, along with MusicbrainzArtistID needs to update artist credits - // As temp fix just set the artist description string if (ParameterNotNull(parameterObject, "artist")) - { - std::vector artist; - CopyStringArray(parameterObject["artist"], artist); - song.strArtistDesc = StringUtils::Join(artist, g_advancedSettings.m_musicItemSeparator); - } - //Albumartist not part of song, belongs to album so not changed as a song detail?? - //if (ParameterNotNull(parameterObject, "albumartist")) - // CopyStringArray(parameterObject["albumartist"], song.albumArtist); - // song_genre table needs updating too when genre string changes. This needs fixing too. + CopyStringArray(parameterObject["artist"], song.artist); + if (ParameterNotNull(parameterObject, "albumartist")) + CopyStringArray(parameterObject["albumartist"], song.albumArtist); if (ParameterNotNull(parameterObject, "genre")) CopyStringArray(parameterObject["genre"], song.genre); if (ParameterNotNull(parameterObject, "year")) song.iYear = (int)parameterObject["year"].asInteger(); if (ParameterNotNull(parameterObject, "rating")) song.rating = '0' + (char)parameterObject["rating"].asInteger(); - //Album title is not part of song, it belongs to album so not changed as a song detail?? if (ParameterNotNull(parameterObject, "album")) song.strAlbum = parameterObject["album"].asString(); if (ParameterNotNull(parameterObject, "track")) @@ -555,13 +515,10 @@ if (ParameterNotNull(parameterObject, "musicbrainztrackid")) song.strMusicBrainzTrackID = parameterObject["musicbrainztrackid"].asString(); if (ParameterNotNull(parameterObject, "playcount")) - song.iTimesPlayed = static_cast(parameterObject["playcount"].asInteger()); + song.iTimesPlayed = parameterObject["playcount"].asInteger(); if (ParameterNotNull(parameterObject, "lastplayed")) song.lastPlayed.SetFromDBDateTime(parameterObject["lastplayed"].asString()); - // This overlay of UpdateSong needs to be deprecated. - // Also need to update artist credits and propagate changes - // to song_artist and song_genre tables. if (musicdatabase.UpdateSong(id, song) <= 0) return InternalError; @@ -574,7 +531,7 @@ std::string directory = parameterObject["directory"].asString(); std::string cmd = StringUtils::Format("updatelibrary(music, %s, %s)", StringUtils::Paramify(directory).c_str(), parameterObject["showdialogs"].asBoolean() ? "true" : "false"); - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, cmd); + CApplicationMessenger::Get().ExecBuiltIn(cmd); return ACK; } @@ -588,14 +545,14 @@ parameterObject["options"]["images"].asBoolean() ? "true" : "false", parameterObject["options"]["overwrite"].asBoolean() ? "true" : "false"); - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, cmd); + CApplicationMessenger::Get().ExecBuiltIn(cmd); return ACK; } JSONRPC_STATUS CAudioLibrary::Clean(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { std::string cmd = StringUtils::Format("cleanlibrary(music, %s)", parameterObject["showdialogs"].asBoolean() ? "true" : "false"); - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, cmd); + CApplicationMessenger::Get().ExecBuiltIn(cmd); return ACK; } @@ -615,11 +572,9 @@ if (musicdatabase.GetAlbum(albumid, album, false)) { item->SetFromAlbum(album); - FillItemArtistIDs(album.GetArtistIDArray(), item); CFileItemList items; items.Add(item); - if (GetAdditionalAlbumDetails(parameterObject, items, musicdatabase) == OK) filled = true; } @@ -630,7 +585,6 @@ if (musicdatabase.GetSongByFileName(strFilename, song)) { item->SetFromSong(song); - FillItemArtistIDs(song.GetArtistIDArray(), item); CFileItemList items; items.Add(item); @@ -688,11 +642,11 @@ // If we retrieved the list of songs by "artistid" // we sort by album (and implicitly by track number) if (artistID != -1) - list.Sort(SortByAlbum, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + list.Sort(SortByAlbum, SortOrderAscending, CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); // If we retrieve the list of songs by "genreid" // we sort by artist (and implicitly by album and track number) else if (genreID != -1) - list.Sort(SortByArtist, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + list.Sort(SortByArtist, SortOrderAscending, CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); // otherwise we sort by track number else list.Sort(SortByTrackNumber, SortOrderAscending); @@ -702,22 +656,9 @@ return success; } -void CAudioLibrary::FillItemArtistIDs(const std::vector artistids, CFileItemPtr &item) -{ - // Add artistIds as separate property as not part of CMusicInfoTag - CVariant artistidObj(CVariant::VariantTypeArray); - for (std::vector::const_iterator artistid = artistids.begin(); artistid != artistids.end(); ++artistid) - artistidObj.push_back(*artistid); - - item->SetProperty("artistid", artistidObj); -} - void CAudioLibrary::FillAlbumItem(const CAlbum &album, const std::string &path, CFileItemPtr &item) { item = CFileItemPtr(new CFileItem(path, album)); - // Add album artistIds as separate property as not part of CMusicInfoTag - std::vector artistids = album.GetArtistIDArray(); - FillItemArtistIDs(artistids, item); } JSONRPC_STATUS CAudioLibrary::GetAdditionalDetails(const CVariant ¶meterObject, CFileItemList &items) @@ -741,6 +682,7 @@ std::set checkProperties; checkProperties.insert("genreid"); + checkProperties.insert("artistid"); std::set additionalProperties; if (!CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties)) return OK; @@ -760,7 +702,18 @@ item->SetProperty("genreid", genreidObj); } } - + if (additionalProperties.find("artistid") != additionalProperties.end()) + { + std::vector artistids; + if (musicdatabase.GetArtistsByAlbum(item->GetMusicInfoTag()->GetDatabaseId(), true, artistids)) + { + CVariant artistidObj(CVariant::VariantTypeArray); + for (std::vector::const_iterator artistid = artistids.begin(); artistid != artistids.end(); ++artistid) + artistidObj.push_back(*artistid); + + item->SetProperty("artistid", artistidObj); + } + } } return OK; @@ -773,12 +726,8 @@ std::set checkProperties; checkProperties.insert("genreid"); - // Query (songview join songartistview) returns song.strAlbumArtists = CMusicInfoTag.m_strAlbumArtistDesc only - // Actual album artist data, if required, comes from album_artist and artist tables. - // It may differ from just splitting album artist description string - checkProperties.insert("albumartist"); + checkProperties.insert("artistid"); checkProperties.insert("albumartistid"); - checkProperties.insert("musicbrainzalbumartistid"); std::set additionalProperties; if (!CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties)) return OK; @@ -798,13 +747,28 @@ item->SetProperty("genreid", genreidObj); } } - if (item->GetMusicInfoTag()->GetAlbumId() > 0) + if (additionalProperties.find("artistid") != additionalProperties.end()) + { + std::vector artistids; + if (musicdatabase.GetArtistsBySong(item->GetMusicInfoTag()->GetDatabaseId(), true, artistids)) + { + CVariant artistidObj(CVariant::VariantTypeArray); + for (std::vector::const_iterator artistid = artistids.begin(); artistid != artistids.end(); ++artistid) + artistidObj.push_back(*artistid); + + item->SetProperty("artistid", artistidObj); + } + } + if (additionalProperties.find("albumartistid") != additionalProperties.end() && item->GetMusicInfoTag()->GetAlbumId() > 0) { - if (additionalProperties.find("albumartist") != additionalProperties.end() || - additionalProperties.find("albumartistid") != additionalProperties.end() || - additionalProperties.find("musicbrainzalbumartistid") != additionalProperties.end()) + std::vector albumartistids; + if (musicdatabase.GetArtistsByAlbum(item->GetMusicInfoTag()->GetAlbumId(), true, albumartistids)) { - musicdatabase.GetArtistsByAlbum(item->GetMusicInfoTag()->GetAlbumId(), item.get()); + CVariant albumartistidObj(CVariant::VariantTypeArray); + for (std::vector::const_iterator albumartistid = albumartistids.begin(); albumartistid != albumartistids.end(); ++albumartistid) + albumartistidObj.push_back(*albumartistid); + + item->SetProperty("albumartistid", albumartistidObj); } } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/AudioLibrary.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/AudioLibrary.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/AudioLibrary.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/AudioLibrary.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,7 +25,6 @@ #include "FileItemHandler.h" class CMusicDatabase; -class CVariant; namespace JSONRPC { @@ -62,7 +61,6 @@ private: static void FillAlbumItem(const CAlbum &album, const std::string &path, CFileItemPtr &item); - static void FillItemArtistIDs(const std::vector artistids, CFileItemPtr &item); static bool CheckForAdditionalProperties(const CVariant &properties, const std::set &checkProperties, std::set &foundProperties); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FavouritesOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FavouritesOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FavouritesOperations.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FavouritesOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,10 +24,10 @@ #include "utils/StringUtils.h" #include "Util.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "guilib/WindowIDs.h" #include +using namespace std; using namespace JSONRPC; using namespace XFILE; @@ -36,9 +36,9 @@ CFileItemList favourites; CFavouritesDirectory::Load(favourites); - std::string type = !parameterObject["type"].isNull() ? parameterObject["type"].asString() : ""; + string type = !parameterObject["type"].isNull() ? parameterObject["type"].asString() : ""; - std::set fields; + set fields; if (parameterObject.isMember("properties") && parameterObject["properties"].isArray()) { for (CVariant::const_iterator_array field = parameterObject["properties"].begin_array(); field != parameterObject["properties"].end_array(); field++) @@ -51,7 +51,7 @@ CFileItemPtr item = favourites.Get(i); std::string function; - std::vector parameters; + vector parameters; CUtil::SplitExecFunction(item->GetPath(), function, parameters); if (parameters.size() == 0) continue; @@ -105,7 +105,7 @@ JSONRPC_STATUS CFavouritesOperations::AddFavourite(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - std::string type = parameterObject["type"].asString(); + string type = parameterObject["type"].asString(); if (type.compare("unknown") == 0) return InvalidParams; @@ -128,8 +128,8 @@ return InvalidParams; } - std::string title = parameterObject["title"].asString(); - std::string path = parameterObject["path"].asString(); + string title = parameterObject["title"].asString(); + string path = parameterObject["path"].asString(); CFileItem item; int contextWindow = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FavouritesOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FavouritesOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FavouritesOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FavouritesOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,8 +21,6 @@ #include "JSONRPC.h" -class CVariant; - namespace JSONRPC { class CFavouritesOperations : public CJSONUtils diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FileItemHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FileItemHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FileItemHandler.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FileItemHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,7 +25,6 @@ #include "AudioLibrary.h" #include "VideoLibrary.h" #include "FileOperations.h" -#include "utils/SortUtils.h" #include "utils/URIUtils.h" #include "utils/ISerializable.h" #include "utils/Variant.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FileItemHandler.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FileItemHandler.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FileItemHandler.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FileItemHandler.h 2015-10-19 08:39:16.000000000 +0000 @@ -26,7 +26,6 @@ #include "FileItem.h" class CThumbLoader; -class CVariant; namespace JSONRPC { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FileOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FileOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FileOperations.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FileOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -31,7 +31,6 @@ #include "URL.h" #include "utils/URIUtils.h" #include "utils/FileUtils.h" -#include "utils/Variant.h" using namespace XFILE; using namespace JSONRPC; @@ -41,7 +40,7 @@ std::string media = parameterObject["media"].asString(); StringUtils::ToLower(media); - VECSOURCES *sources = CMediaSourceSettings::GetInstance().GetSources(media); + VECSOURCES *sources = CMediaSourceSettings::Get().GetSources(media); if (sources) { CFileItemList items; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FileOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FileOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/FileOperations.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/FileOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,8 +22,6 @@ #include "JSONRPC.h" #include "FileItemHandler.h" -class CVariant; - namespace JSONRPC { class CFileOperations : public CFileItemHandler diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/GUIOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/GUIOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/GUIOperations.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/GUIOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,11 +20,11 @@ #include "GUIOperations.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "GUIInfoManager.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" -#include "interfaces/builtins/Builtins.h" +#include "interfaces/Builtins.h" #include "dialogs/GUIDialogKaiToast.h" #include "addons/AddonManager.h" #include "settings/Settings.h" @@ -32,9 +32,9 @@ #include "guilib/StereoscopicsManager.h" #include "windowing/WindowingFactory.h" +using namespace std; using namespace JSONRPC; using namespace ADDON; -using namespace KODI::MESSAGING; JSONRPC_STATUS CGUIOperations::GetProperties(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { @@ -65,16 +65,16 @@ cmd += "," + param->asString(); } cmd += ")"; - CBuiltins::GetInstance().Execute(cmd); + CBuiltins::Execute(cmd); return ACK; } JSONRPC_STATUS CGUIOperations::ShowNotification(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - std::string image = parameterObject["image"].asString(); - std::string title = parameterObject["title"].asString(); - std::string message = parameterObject["message"].asString(); + string image = parameterObject["image"].asString(); + string title = parameterObject["title"].asString(); + string message = parameterObject["message"].asString(); unsigned int displaytime = (unsigned int)parameterObject["displaytime"].asUnsignedInteger(); if (image.compare("info") == 0) @@ -95,9 +95,7 @@ parameterObject["fullscreen"].asString().compare("toggle") == 0) || (parameterObject["fullscreen"].isBoolean() && parameterObject["fullscreen"].asBoolean() != g_application.IsFullScreen())) - { - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_SHOW_GUI))); - } + CApplicationMessenger::Get().SendAction(CAction(ACTION_SHOW_GUI)); else if (!parameterObject["fullscreen"].isBoolean() && !parameterObject["fullscreen"].isString()) return InvalidParams; @@ -106,10 +104,10 @@ JSONRPC_STATUS CGUIOperations::SetStereoscopicMode(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - CAction action = CStereoscopicsManager::GetInstance().ConvertActionCommandToAction("SetStereoMode", parameterObject["mode"].asString()); + CAction action = CStereoscopicsManager::Get().ConvertActionCommandToAction("SetStereoMode", parameterObject["mode"].asString()); if (action.GetID() != ACTION_NONE) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(action))); + CApplicationMessenger::Get().SendAction(action); return ACK; } @@ -139,10 +137,9 @@ result["label"] = g_infoManager.GetLabel(g_infoManager.TranslateString("System.CurrentControl")); else if (property == "skin") { - std::string skinId = CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKIN); + std::string skinId = CSettings::Get().GetString("lookandfeel.skin"); AddonPtr addon; - if (!CAddonMgr::GetInstance().GetAddon(skinId, addon, ADDON_SKIN)) - return InternalError; + CAddonMgr::Get().GetAddon(skinId, addon, ADDON_SKIN); result["id"] = skinId; if (addon.get()) @@ -151,7 +148,7 @@ else if (property == "fullscreen") result = g_application.IsFullScreen(); else if (property == "stereoscopicmode") - result = GetStereoModeObjectFromGuiMode( CStereoscopicsManager::GetInstance().GetStereoMode() ); + result = GetStereoModeObjectFromGuiMode( CStereoscopicsManager::Get().GetStereoMode() ); else return InvalidParams; @@ -161,7 +158,7 @@ CVariant CGUIOperations::GetStereoModeObjectFromGuiMode(const RENDER_STEREO_MODE &mode) { CVariant modeObj(CVariant::VariantTypeObject); - modeObj["mode"] = CStereoscopicsManager::GetInstance().ConvertGuiStereoModeToString(mode); - modeObj["label"] = CStereoscopicsManager::GetInstance().GetLabelForStereoMode(mode); + modeObj["mode"] = CStereoscopicsManager::Get().ConvertGuiStereoModeToString(mode); + modeObj["label"] = CStereoscopicsManager::Get().GetLabelForStereoMode(mode); return modeObj; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/GUIOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/GUIOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/GUIOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/GUIOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,8 +21,6 @@ #include "JSONRPC.h" -class CVariant; - namespace JSONRPC { class CGUIOperations diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/IJSONRPCAnnouncer.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/IJSONRPCAnnouncer.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/IJSONRPCAnnouncer.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/IJSONRPCAnnouncer.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,6 @@ #include "interfaces/IAnnouncer.h" #include "utils/JSONVariantWriter.h" -#include "utils/Variant.h" namespace JSONRPC { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/InputOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/InputOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/InputOperations.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/InputOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,19 +20,12 @@ #include "InputOperations.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "guilib/GUIAudioManager.h" #include "guilib/GUIWindow.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/GUIKeyboardFactory.h" #include "input/ButtonTranslator.h" -#include "utils/Variant.h" -#include "input/XBMC_keyboard.h" -#include "input/XBMC_vkeys.h" -#include "threads/SingleLock.h" using namespace JSONRPC; -using namespace KODI::MESSAGING; //TODO the breakage of the screensaver should be refactored //to one central super duper place for getting rid of @@ -52,10 +45,7 @@ { g_application.ResetSystemIdleTimer(); g_audioManager.PlayActionSound(actionID); - if (waitResult) - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(actionID))); - else - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(actionID))); + CApplicationMessenger::Get().SendAction(CAction(actionID), WINDOW_INVALID, waitResult); } return ACK; } @@ -63,25 +53,14 @@ JSONRPC_STATUS CInputOperations::activateWindow(int windowID) { if(!handleScreenSaver()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTIVATE_WINDOW, windowID, 0); + CApplicationMessenger::Get().ActivateWindow(windowID, std::vector(), false); return ACK; } JSONRPC_STATUS CInputOperations::SendText(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - if (CGUIKeyboardFactory::SendTextToActiveKeyboard(parameterObject["text"].asString(), parameterObject["done"].asBoolean())) - return ACK; - - CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow()); - if (!window) - return ACK; - - CGUIMessage msg(GUI_MSG_SET_TEXT, 0, window->GetFocusedControlID()); - msg.SetLabel(parameterObject["text"].asString()); - msg.SetParam1(parameterObject["done"].asBoolean() ? 1 : 0); - CApplicationMessenger::GetInstance().SendGUIMessage(msg, window->GetID()); - + CApplicationMessenger::Get().SendText(parameterObject["text"].asString(), parameterObject["done"].asBoolean()); return ACK; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/InputOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/InputOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/InputOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/InputOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,8 +21,6 @@ #include "JSONRPC.h" -class CVariant; - namespace JSONRPC { class CInputOperations diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONRPC.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONRPC.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONRPC.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONRPC.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -36,6 +36,7 @@ using namespace ANNOUNCEMENT; using namespace JSONRPC; +using namespace std; bool CJSONRPC::m_initialized = false; @@ -45,7 +46,7 @@ return; // Add some types/enums at runtime - std::vector enumList; + vector enumList; for (int addonType = ADDON::ADDON_UNKNOWN; addonType < ADDON::ADDON_MAX; addonType++) enumList.push_back(ADDON::TranslateType(static_cast(addonType), false)); CJSONServiceDescription::AddEnum("Addon.Types", enumList); @@ -59,7 +60,7 @@ CJSONServiceDescription::AddEnum("GUI.Window", enumList); // filter-related enums - std::vector smartplaylistList; + vector smartplaylistList; CDatabaseQueryRule::GetAvailableOperators(smartplaylistList); CJSONServiceDescription::AddEnum("List.Filter.Operators", smartplaylistList); @@ -136,7 +137,7 @@ const char* version = CJSONServiceDescription::GetVersion(); if (version != NULL) { - std::vector parts = StringUtils::Split(version, "."); + vector parts = StringUtils::Split(version, "."); if (parts.size() > 0) result["version"]["major"] = (int)strtol(parts[0].c_str(), NULL, 10); if (parts.size() > 1) @@ -221,12 +222,12 @@ JSONRPC_STATUS CJSONRPC::NotifyAll(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant& parameterObject, CVariant &result) { if (parameterObject["data"].isNull()) - CAnnouncementManager::GetInstance().Announce(Other, parameterObject["sender"].asString().c_str(), + CAnnouncementManager::Get().Announce(Other, parameterObject["sender"].asString().c_str(), parameterObject["message"].asString().c_str()); else { CVariant data = parameterObject["data"]; - CAnnouncementManager::GetInstance().Announce(Other, parameterObject["sender"].asString().c_str(), + CAnnouncementManager::Get().Announce(Other, parameterObject["sender"].asString().c_str(), parameterObject["message"].asString().c_str(), data); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONRPC.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONRPC.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONRPC.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONRPC.h 2015-10-19 08:39:16.000000000 +0000 @@ -27,8 +27,6 @@ #include "JSONRPCUtils.h" #include "JSONServiceDescription.h" -class CVariant; - namespace JSONRPC { /*! diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONRPCUtils.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONRPCUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONRPCUtils.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONRPCUtils.h 2015-10-19 08:39:16.000000000 +0000 @@ -24,8 +24,7 @@ #include "FileItem.h" #include "GUIUserMessages.h" #include "guilib/GUIWindowManager.h" - -class CVariant; +#include "utils/Variant.h" namespace JSONRPC { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONServiceDescription.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONServiceDescription.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONServiceDescription.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONServiceDescription.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -41,11 +41,12 @@ #include "TextureOperations.h" #include "SettingsOperations.h" +using namespace std; using namespace JSONRPC; -std::map CJSONServiceDescription::m_notifications = std::map(); +map CJSONServiceDescription::m_notifications = map(); CJSONServiceDescription::CJsonRpcMethodMap CJSONServiceDescription::m_actionMap; -std::map CJSONServiceDescription::m_types = std::map(); +map CJSONServiceDescription::m_types = map(); CJSONServiceDescription::IncompleteSchemaDefinitionMap CJSONServiceDescription::m_incompleteDefinitions = CJSONServiceDescription::IncompleteSchemaDefinitionMap(); JsonRpcMethodMap CJSONServiceDescription::m_methodMaps[] = { @@ -140,10 +141,6 @@ { "VideoLibrary.SetSeasonDetails", CVideoLibrary::SetSeasonDetails }, { "VideoLibrary.SetEpisodeDetails", CVideoLibrary::SetEpisodeDetails }, { "VideoLibrary.SetMusicVideoDetails", CVideoLibrary::SetMusicVideoDetails }, - { "VideoLibrary.RefreshMovie", CVideoLibrary::RefreshMovie }, - { "VideoLibrary.RefreshTVShow", CVideoLibrary::RefreshTVShow }, - { "VideoLibrary.RefreshEpisode", CVideoLibrary::RefreshEpisode }, - { "VideoLibrary.RefreshMusicVideo", CVideoLibrary::RefreshMusicVideo }, { "VideoLibrary.RemoveMovie", CVideoLibrary::RemoveMovie }, { "VideoLibrary.RemoveTVShow", CVideoLibrary::RemoveTVShow }, { "VideoLibrary.RemoveEpisode", CVideoLibrary::RemoveEpisode }, @@ -237,33 +234,12 @@ }; JSONSchemaTypeDefinition::JSONSchemaTypeDefinition() - : missingReference(), - name(), - ID(), - referencedType(nullptr), - referencedTypeSet(false), - extends(), - description(), - type(AnyValue), - unionTypes(), - optional(true), - defaultValue(), - minimum(-std::numeric_limits::max()), - maximum(std::numeric_limits::max()), - exclusiveMinimum(false), - exclusiveMaximum(false), - divisibleBy(0), - minLength(-1), - maxLength(-1), - enums(), - items(), - minItems(0), - maxItems(0), - uniqueItems(false), - additionalItems(), - properties(), - hasAdditionalProperties(false), - additionalProperties(nullptr) + : missingReference(""), referencedTypeSet(false), + type(AnyValue), minimum(-std::numeric_limits::max()), maximum(std::numeric_limits::max()), + exclusiveMinimum(false), exclusiveMaximum(false), divisibleBy(0), + minLength(-1), maxLength(-1), + minItems(0), maxItems(0), uniqueItems(false), + hasAdditionalProperties(false) { } bool JSONSchemaTypeDefinition::Parse(const CVariant &value, bool isParameter /* = false */) @@ -547,13 +523,13 @@ { if ((type & NumberValue) == NumberValue) { - minimum = value["minimum"].asDouble(-std::numeric_limits::max()); - maximum = value["maximum"].asDouble(std::numeric_limits::max()); + minimum = value["minimum"].asDouble(-numeric_limits::max()); + maximum = value["maximum"].asDouble(numeric_limits::max()); } else if ((type & IntegerValue) == IntegerValue) { - minimum = (double)value["minimum"].asInteger(std::numeric_limits::min()); - maximum = (double)value["maximum"].asInteger(std::numeric_limits::max()); + minimum = (double)value["minimum"].asInteger(numeric_limits::min()); + maximum = (double)value["maximum"].asInteger(numeric_limits::max()); } exclusiveMinimum = value["exclusiveMinimum"].asBoolean(false); @@ -768,7 +744,7 @@ // are either no more schemas in the "items" // array or no more elements in the value's array unsigned int arrayIndex; - for (arrayIndex = 0; arrayIndex < std::min(items.size(), (size_t)value.size()); arrayIndex++) + for (arrayIndex = 0; arrayIndex < min(items.size(), (size_t)value.size()); arrayIndex++) { JSONRPC_STATUS status = items.at(arrayIndex)->Check(value[arrayIndex], outputValue[arrayIndex], errorData["property"]); if (status != OK) @@ -1052,16 +1028,16 @@ { if (CJSONUtils::HasType(type, NumberValue)) { - if (minimum > -std::numeric_limits::max()) + if (minimum > -numeric_limits::max()) output["minimum"] = minimum; - if (maximum < std::numeric_limits::max()) + if (maximum < numeric_limits::max()) output["maximum"] = maximum; } else { - if (minimum > std::numeric_limits::min()) + if (minimum > numeric_limits::min()) output["minimum"] = (int)minimum; - if (maximum < std::numeric_limits::max()) + if (maximum < numeric_limits::max()) output["maximum"] = (int)maximum; } @@ -1150,8 +1126,8 @@ if (typeDefinition.get() == NULL) return; - std::string origName = name; - std::string origDescription = description; + string origName = name; + string origDescription = description; bool origOptional = optional; CVariant origDefaultValue = defaultValue; JSONSchemaTypeDefinitionPtr referencedTypeDef = referencedType; @@ -1211,13 +1187,7 @@ } JsonRpcMethod::JsonRpcMethod() - : missingReference(), - name(), - method(NULL), - transportneed(Response), - permission(ReadData), - description(), - parameters(), + : missingReference(""), method(NULL), returns(new JSONSchemaTypeDefinition()) { } @@ -1985,7 +1955,7 @@ if (typeID.empty()) return; - std::map::iterator type = m_types.find(typeID); + map::iterator type = m_types.find(typeID); if (type != m_types.end()) m_types.erase(type); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONServiceDescription.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONServiceDescription.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONServiceDescription.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONServiceDescription.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,7 +25,6 @@ #include #include "JSONUtils.h" -#include "utils/Variant.h" namespace JSONRPC { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONUtils.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/JSONUtils.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/JSONUtils.h 2015-10-19 08:39:16.000000000 +0000 @@ -29,7 +29,6 @@ #include "utils/JSONVariantWriter.h" #include "utils/JSONVariantParser.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" namespace JSONRPC { @@ -95,20 +94,95 @@ StringUtils::ToLower(method); StringUtils::ToLower(order); - // parse the sort attributes sortAttributes = SortAttributeNone; if (parameterObject["sort"]["ignorearticle"].asBoolean()) sortAttributes = SortAttributeIgnoreArticle; else sortAttributes = SortAttributeNone; - // parse the sort order - sortOrder = SortUtils::SortOrderFromString(order); - if (sortOrder == SortOrderNone) + if (order == "ascending") + sortOrder = SortOrderAscending; + else if (order == "descending") + sortOrder = SortOrderDescending; + else return false; - // parse the sort method - sortBy = SortUtils::SortMethodFromString(method); + if (method == "none") + sortBy = SortByNone; + else if (method == "label") + sortBy = SortByLabel; + else if (method == "date") + sortBy = SortByDate; + else if (method == "size") + sortBy = SortBySize; + else if (method == "file") + sortBy = SortByFile; + else if (method == "path") + sortBy = SortByPath; + else if (method == "drivetype") + sortBy = SortByDriveType; + else if (method == "title") + sortBy = SortByTitle; + else if (method == "track") + sortBy = SortByTrackNumber; + else if (method == "time") + sortBy = SortByTime; + else if (method == "artist") + sortBy = SortByArtist; + else if (method == "album") + sortBy = SortByAlbum; + else if (method == "albumtype") + sortBy = SortByAlbumType; + else if (method == "genre") + sortBy = SortByGenre; + else if (method == "country") + sortBy = SortByCountry; + else if (method == "year") + sortBy = SortByYear; + else if (method == "rating") + sortBy = SortByRating; + else if (method == "votes") + sortBy = SortByVotes; + else if (method == "top250") + sortBy = SortByTop250; + else if (method == "programcount") + sortBy = SortByProgramCount; + else if (method == "playlist") + sortBy = SortByPlaylistOrder; + else if (method == "episode") + sortBy = SortByEpisodeNumber; + else if (method == "season") + sortBy = SortBySeason; + else if (method == "totalepisodes") + sortBy = SortByNumberOfEpisodes; + else if (method == "watchedepisodes") + sortBy = SortByNumberOfWatchedEpisodes; + else if (method == "tvshowstatus") + sortBy = SortByTvShowStatus; + else if (method == "tvshowtitle") + sortBy = SortByTvShowTitle; + else if (method == "sorttitle") + sortBy = SortBySortTitle; + else if (method == "productioncode") + sortBy = SortByProductionCode; + else if (method == "mpaa") + sortBy = SortByMPAA; + else if (method == "studio") + sortBy = SortByStudio; + else if (method == "dateadded") + sortBy = SortByDateAdded; + else if (method == "lastplayed") + sortBy = SortByLastPlayed; + else if (method == "playcount") + sortBy = SortByPlaycount; + else if (method == "listeners") + sortBy = SortByListeners; + else if (method == "bitrate") + sortBy = SortByBitrate; + else if (method == "random") + sortBy = SortByRandom; + else + return false; return true; } @@ -441,7 +515,7 @@ return; stringArray.clear(); - for (CVariant::const_iterator_array it = jsonStringArray.begin_array(); it != jsonStringArray.end_array(); ++it) + for (CVariant::const_iterator_array it = jsonStringArray.begin_array(); it != jsonStringArray.end_array(); it++) stringArray.push_back(it->asString()); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PlayerOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PlayerOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PlayerOperations.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PlayerOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,9 +25,9 @@ #include "input/Key.h" #include "GUIUserMessages.h" #include "pictures/GUIWindowSlideShow.h" -#include "interfaces/builtins/Builtins.h" +#include "interfaces/Builtins.h" #include "PartyModeManager.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "FileItem.h" #include "VideoLibrary.h" #include "video/VideoDatabase.h" @@ -43,12 +43,10 @@ #include "cores/playercorefactory/PlayerCoreConfig.h" #include "cores/playercorefactory/PlayerCoreFactory.h" #include "utils/SeekHandler.h" -#include "utils/Variant.h" using namespace JSONRPC; using namespace PLAYLIST; using namespace PVR; -using namespace KODI::MESSAGING; JSONRPC_STATUS CPlayerOperations::GetActivePlayers(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { @@ -87,20 +85,20 @@ VECPLAYERCORES players; if (media == "all") - CPlayerCoreFactory::GetInstance().GetPlayers(players); + CPlayerCoreFactory::Get().GetPlayers(players); else { bool video = false; if (media == "video") video = true; - CPlayerCoreFactory::GetInstance().GetPlayers(players, true, video); + CPlayerCoreFactory::Get().GetPlayers(players, true, video); } for (VECPLAYERCORES::const_iterator itPlayer = players.begin(); itPlayer != players.end(); ++itPlayer) { PLAYERCOREID playerId = *itPlayer; - const CPlayerCoreConfig* playerConfig = CPlayerCoreFactory::GetInstance().GetPlayerConfig(playerId); + const CPlayerCoreConfig* playerConfig = CPlayerCoreFactory::Get().GetPlayerConfig(playerId); if (playerConfig == NULL) continue; @@ -193,7 +191,7 @@ if (currentMusicTag != NULL) { std::string originalLabel = fileItem->GetLabel(); - fileItem->SetFromMusicInfoTag(*currentMusicTag); + fileItem = CFileItemPtr(new CFileItem(*currentMusicTag)); if (fileItem->GetLabel().empty()) fileItem->SetLabel(originalLabel); } @@ -290,18 +288,18 @@ return FailedToExecute; if (parameterObject["play"].isString()) - CBuiltins::GetInstance().Execute("playercontrol(play)"); + CBuiltins::Execute("playercontrol(play)"); else { if (parameterObject["play"].asBoolean()) { if (g_application.m_pPlayer->IsPausedPlayback()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE); + CApplicationMessenger::Get().MediaPause(); else if (g_application.m_pPlayer->GetPlaySpeed() != 1) g_application.m_pPlayer->SetPlaySpeed(1, g_application.IsMutedInternal()); } else if (!g_application.m_pPlayer->IsPausedPlayback()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE); + CApplicationMessenger::Get().MediaPause(); } result["speed"] = g_application.m_pPlayer->IsPausedPlayback() ? 0 : g_application.m_pPlayer->GetPlaySpeed(); return OK; @@ -331,7 +329,7 @@ { case Video: case Audio: - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP, static_cast(parameterObject["playerid"].asInteger())); + CApplicationMessenger::Get().MediaStop(true, (int)parameterObject["playerid"].asInteger()); return ACK; case Picture: @@ -366,9 +364,9 @@ else if (parameterObject["speed"].isString()) { if (parameterObject["speed"].asString().compare("increment") == 0) - CBuiltins::GetInstance().Execute("playercontrol(forward)"); + CBuiltins::Execute("playercontrol(forward)"); else - CBuiltins::GetInstance().Execute("playercontrol(rewind)"); + CBuiltins::Execute("playercontrol(rewind)"); } else return InvalidParams; @@ -403,18 +401,18 @@ { std::string step = value.isString() ? value.asString() : value["step"].asString(); if (step == "smallforward") - CBuiltins::GetInstance().Execute("playercontrol(smallskipforward)"); + CBuiltins::Execute("playercontrol(smallskipforward)"); else if (step == "smallbackward") - CBuiltins::GetInstance().Execute("playercontrol(smallskipbackward)"); + CBuiltins::Execute("playercontrol(smallskipbackward)"); else if (step == "bigforward") - CBuiltins::GetInstance().Execute("playercontrol(bigskipforward)"); + CBuiltins::Execute("playercontrol(bigskipforward)"); else if (step == "bigbackward") - CBuiltins::GetInstance().Execute("playercontrol(bigskipbackward)"); + CBuiltins::Execute("playercontrol(bigskipbackward)"); else return InvalidParams; } else if (value.isObject() && value.isMember("seconds") && value.size() == 1) - CSeekHandler::GetInstance().SeekSeconds(static_cast(value["seconds"].asInteger())); + CSeekHandler::Get().SeekSeconds(static_cast(value["seconds"].asInteger())); else if (value.isObject()) g_application.SeekTime(ParseTimeInSeconds(value.isMember("time") ? value["time"] : value)); else @@ -455,9 +453,9 @@ case Video: case Audio: if (direction == "left" || direction == "up") - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_PREV_ITEM))); + CApplicationMessenger::Get().SendAction(CAction(ACTION_PREV_ITEM)); else if (direction == "right" || direction == "down") - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_NEXT_ITEM))); + CApplicationMessenger::Get().SendAction(CAction(ACTION_NEXT_ITEM)); else return InvalidParams; @@ -547,7 +545,7 @@ { case PLAYLIST_MUSIC: case PLAYLIST_VIDEO: - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PLAY, playlistid, playlistStartPosition); + CApplicationMessenger::Get().MediaPlay(playlistid, playlistStartPosition); OnPlaylistChanged(); break; @@ -583,7 +581,7 @@ { if (g_partyModeManager.IsEnabled()) g_partyModeManager.Disable(); - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "playercontrol(partymode(" + parameterObject["item"]["partymode"].asString() + "))"); + CApplicationMessenger::Get().ExecBuiltIn("playercontrol(partymode(" + parameterObject["item"]["partymode"].asString() + "))"); return ACK; } else if (parameterObject["item"].isObject() && parameterObject["item"].isMember("channelid")) @@ -603,11 +601,7 @@ (g_PVRManager.IsPlayingTV() && !channel->IsRadio())) g_application.m_pPlayer->SwitchChannel(channel); else - { - CFileItemList *l = new CFileItemList; //don't delete, - l->Add(std::make_shared(channel)); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l)); - } + CApplicationMessenger::Get().MediaPlay(CFileItem(channel)); return ACK; } @@ -624,10 +618,7 @@ if (fileItem == NULL) return InvalidParams; - CFileItemList *l = new CFileItemList; //don't delete, - l->Add(std::make_shared(*fileItem)); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l)); - + CApplicationMessenger::Get().MediaPlay(*fileItem); return ACK; } else @@ -668,12 +659,12 @@ { playerId = (PLAYERCOREID)optionPlayer.asInteger(); // check if the there's actually a player with the given player ID - if (CPlayerCoreFactory::GetInstance().GetPlayerConfig(playerId) == NULL) + if (CPlayerCoreFactory::Get().GetPlayerConfig(playerId) == NULL) return InvalidParams; // check if the player can handle at least the first item in the list VECPLAYERCORES possiblePlayers; - CPlayerCoreFactory::GetInstance().GetPlayers(*list.Get(0).get(), possiblePlayers); + CPlayerCoreFactory::Get().GetPlayers(*list.Get(0).get(), possiblePlayers); VECPLAYERCORES::const_iterator matchingPlayer = std::find(possiblePlayers.begin(), possiblePlayers.end(), playerId); if (matchingPlayer == possiblePlayers.end()) return InvalidParams; @@ -702,9 +693,7 @@ list[0]->m_lStartOffset = (int)(ParseTimeInSeconds(optionResume) * 75.0); } - auto l = new CFileItemList(); //don't delete - l->Copy(list); - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l)); + CApplicationMessenger::Get().MediaPlay(list); } return ACK; @@ -734,15 +723,14 @@ else return InvalidParams; - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(actionID))); + CApplicationMessenger::Get().SendAction(CAction(actionID)); } else if (to.isInteger()) { if (IsPVRChannel()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast( - new CAction(ACTION_CHANNEL_SWITCH, static_cast(to.asInteger())))); + CApplicationMessenger::Get().SendAction(CAction(ACTION_CHANNEL_SWITCH, (float)to.asInteger())); else - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_PLAY, static_cast(to.asInteger())); + CApplicationMessenger::Get().PlayListPlayerPlay((int)to.asInteger()); } else return InvalidParams; @@ -793,7 +781,7 @@ if ((shuffle.isBoolean() && !shuffle.asBoolean()) || (shuffle.isString() && shuffle.asString() == "toggle")) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_SHUFFLE, playlistid, 0); + CApplicationMessenger::Get().PlayListPlayerShuffle(playlistid, false); OnPlaylistChanged(); } } @@ -802,7 +790,7 @@ if ((shuffle.isBoolean() && shuffle.asBoolean()) || (shuffle.isString() && shuffle.asString() == "toggle")) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_SHUFFLE, playlistid, 1); + CApplicationMessenger::Get().PlayListPlayerShuffle(playlistid, true); OnPlaylistChanged(); } } @@ -858,7 +846,7 @@ else repeat = (REPEAT_STATE)ParseRepeatState(parameterObject["repeat"]); - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_REPEAT, playlistid, repeat); + CApplicationMessenger::Get().PlayListPlayerRepeat(playlistid, repeat); OnPlaylistChanged(); break; } @@ -912,7 +900,7 @@ } if (change) - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "playercontrol(partymode(" + strContext + "))"); + CApplicationMessenger::Get().ExecBuiltIn("playercontrol(partymode(" + strContext + "))"); break; } @@ -1115,14 +1103,14 @@ CGUIMessage msg(GUI_MSG_START_SLIDESHOW, 0, 0, flags); msg.SetStringParams(params); - CApplicationMessenger::GetInstance().SendGUIMessage(msg, WINDOW_SLIDESHOW, true); + CApplicationMessenger::Get().SendGUIMessage(msg, WINDOW_SLIDESHOW, true); return ACK; } void CPlayerOperations::SendSlideshowAction(int actionID) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(actionID))); + CApplicationMessenger::Get().SendAction(CAction(actionID), WINDOW_SLIDESHOW); } void CPlayerOperations::OnPlaylistChanged() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PlayerOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PlayerOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PlayerOperations.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PlayerOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,8 +22,6 @@ #include "JSONRPC.h" #include "FileItemHandler.h" -class CVariant; - namespace EPG { class CEpgInfoTag; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PlaylistOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PlaylistOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PlaylistOperations.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PlaylistOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,14 +23,13 @@ #include "guilib/GUIWindowManager.h" #include "input/Key.h" #include "GUIUserMessages.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "pictures/GUIWindowSlideShow.h" #include "pictures/PictureInfoTag.h" -#include "utils/Variant.h" using namespace JSONRPC; using namespace PLAYLIST; -using namespace KODI::MESSAGING; +using namespace std; JSONRPC_STATUS CPlaylistOperations::GetPlaylists(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { @@ -79,7 +78,7 @@ { case PLAYLIST_VIDEO: case PLAYLIST_MUSIC: - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_GET_ITEMS, playlist, -1, static_cast(&list)); + CApplicationMessenger::Get().PlayListPlayerGetItems(playlist, list); break; case PLAYLIST_PICTURE: @@ -128,12 +127,9 @@ { case PLAYLIST_VIDEO: case PLAYLIST_MUSIC: - { - auto tmpList = new CFileItemList(); - tmpList->Copy(list); - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_ADD, playlist, -1, static_cast(tmpList)); + CApplicationMessenger::Get().PlayListPlayerAdd(playlist, list); break; - } + case PLAYLIST_PICTURE: for (int index = 0; index < list.Size(); index++) { @@ -164,10 +160,7 @@ if (!HandleItemsParameter(playlist, parameterObject["item"], list)) return InvalidParams; - auto tmpList = new CFileItemList(); - tmpList->Copy(list); - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_INSERT, GetPlaylist(parameterObject["playlistid"]), - static_cast(parameterObject["position"].asInteger()), static_cast(tmpList)); + CApplicationMessenger::Get().PlayListPlayerInsert(GetPlaylist(parameterObject["playlistid"]), list, (int)parameterObject["position"].asInteger()); NotifyAll(); return ACK; @@ -183,7 +176,7 @@ if (g_playlistPlayer.GetCurrentPlaylist() == playlist && g_playlistPlayer.GetCurrentSong() == position) return InvalidParams; - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_REMOVE, playlist, position); + CApplicationMessenger::Get().PlayListPlayerRemove(playlist, position); NotifyAll(); return ACK; @@ -197,16 +190,16 @@ { case PLAYLIST_MUSIC: case PLAYLIST_VIDEO: - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_CLEAR, playlist); + CApplicationMessenger::Get().PlayListPlayerClear(playlist); break; case PLAYLIST_PICTURE: - slideshow = (CGUIWindowSlideShow*)g_windowManager.GetWindow(WINDOW_SLIDESHOW); - if (!slideshow) - return FailedToExecute; - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(ACTION_STOP))); - slideshow->Reset(); - break; + slideshow = (CGUIWindowSlideShow*)g_windowManager.GetWindow(WINDOW_SLIDESHOW); + if (!slideshow) + return FailedToExecute; + CApplicationMessenger::Get().SendAction(CAction(ACTION_STOP), WINDOW_SLIDESHOW); + slideshow->Reset(); + break; } NotifyAll(); @@ -219,10 +212,7 @@ if (playlist == PLAYLIST_PICTURE) return FailedToExecute; - auto tmpVec = new std::vector(); - tmpVec->push_back(static_cast(parameterObject["position1"].asInteger())); - tmpVec->push_back(static_cast(parameterObject["position2"].asInteger())); - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_SWAP, playlist, -1, static_cast(tmpVec)); + CApplicationMessenger::Get().PlayListPlayerSwap(playlist, (int)parameterObject["position1"].asInteger(), (int)parameterObject["position2"].asInteger()); NotifyAll(); return ACK; @@ -274,7 +264,7 @@ { case PLAYLIST_MUSIC: case PLAYLIST_VIDEO: - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_GET_ITEMS, playlist, -1, static_cast(&list)); + CApplicationMessenger::Get().PlayListPlayerGetItems(playlist, list); result = list.Size(); break; @@ -299,14 +289,14 @@ bool CPlaylistOperations::HandleItemsParameter(int playlistid, const CVariant &itemParam, CFileItemList &items) { - std::vector vecItems; + vector vecItems; if (itemParam.isArray()) vecItems.assign(itemParam.begin_array(), itemParam.end_array()); else vecItems.push_back(itemParam); bool success = false; - for (std::vector::iterator itemIt = vecItems.begin(); itemIt != vecItems.end(); ++itemIt) + for (vector::iterator itemIt = vecItems.begin(); itemIt != vecItems.end(); ++itemIt) { if (!CheckMediaParameter(playlistid, *itemIt)) continue; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PlaylistOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PlaylistOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PlaylistOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PlaylistOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,8 +22,6 @@ #include "FileItemHandler.h" #include "FileItem.h" -class CVariant; - namespace JSONRPC { class CPlaylistOperations : public CFileItemHandler diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/ProfilesOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/ProfilesOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/ProfilesOperations.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/ProfilesOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,22 +19,19 @@ */ #include "ProfilesOperations.h" -#include "messaging/ApplicationMessenger.h" -#include "guilib/LocalizeStrings.h" +#include "ApplicationMessenger.h" #include "profiles/ProfilesManager.h" #include "utils/md5.h" -#include "utils/Variant.h" using namespace JSONRPC; -using namespace KODI::MESSAGING; JSONRPC_STATUS CProfilesOperations::GetProfiles(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { CFileItemList listItems; - for (unsigned int i = 0; i < CProfilesManager::GetInstance().GetNumberOfProfiles(); ++i) + for (unsigned int i = 0; i < CProfilesManager::Get().GetNumberOfProfiles(); ++i) { - const CProfile *profile = CProfilesManager::GetInstance().GetProfile(i); + const CProfile *profile = CProfilesManager::Get().GetProfile(i); CFileItemPtr item(new CFileItem(profile->getName())); item->SetArt("thumb", profile->getThumb()); listItems.Add(item); @@ -50,11 +47,11 @@ for (CVariant::iterator_array profileiter = result["profiles"].begin_array(); profileiter != result["profiles"].end_array(); ++profileiter) { std::string profilename = (*profileiter)["label"].asString(); - int index = CProfilesManager::GetInstance().GetProfileIndex(profilename); - const CProfile *profile = CProfilesManager::GetInstance().GetProfile(index); + int index = CProfilesManager::Get().GetProfileIndex(profilename); + const CProfile *profile = CProfilesManager::Get().GetProfile(index); LockType locktype = LOCK_MODE_UNKNOWN; if (index == 0) - locktype = CProfilesManager::GetInstance().GetMasterProfile().getLockMode(); + locktype = CProfilesManager::Get().GetMasterProfile().getLockMode(); else locktype = profile->getLockMode(); (*profileiter)["lockmode"] = locktype; @@ -67,7 +64,7 @@ JSONRPC_STATUS CProfilesOperations::GetCurrentProfile(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - const CProfile& currentProfile = CProfilesManager::GetInstance().GetCurrentProfile(); + const CProfile& currentProfile = CProfilesManager::Get().GetCurrentProfile(); CVariant profileVariant = CVariant(CVariant::VariantTypeObject); profileVariant["label"] = currentProfile.getName(); for (CVariant::const_iterator_array propertyiter = parameterObject["properties"].begin_array(); propertyiter != parameterObject["properties"].end_array(); ++propertyiter) @@ -89,13 +86,13 @@ JSONRPC_STATUS CProfilesOperations::LoadProfile(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { std::string profilename = parameterObject["profile"].asString(); - int index = CProfilesManager::GetInstance().GetProfileIndex(profilename); + int index = CProfilesManager::Get().GetProfileIndex(profilename); if (index < 0) return InvalidParams; // get the profile - const CProfile *profile = CProfilesManager::GetInstance().GetProfile(index); + const CProfile *profile = CProfilesManager::Get().GetProfile(index); if (profile == NULL) return InvalidParams; @@ -130,7 +127,7 @@ if (bLoadProfile) { - CApplicationMessenger::GetInstance().PostMsg(TMSG_LOADPROFILE, index); + CApplicationMessenger::Get().LoadProfile(index); return ACK; } return InvalidParams; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/ProfilesOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/ProfilesOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/ProfilesOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/ProfilesOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,8 +22,6 @@ #include "JSONRPC.h" #include "FileItemHandler.h" -class CVariant; - namespace JSONRPC { class CProfilesOperations : CFileItemHandler diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PVROperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PVROperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PVROperations.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PVROperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,7 +19,6 @@ */ #include "PVROperations.h" -#include "messaging/ApplicationMessenger.h" #include "pvr/PVRManager.h" #include "pvr/channels/PVRChannelGroupsContainer.h" @@ -28,12 +27,11 @@ #include "pvr/recordings/PVRRecordings.h" #include "epg/Epg.h" #include "epg/EpgContainer.h" -#include "utils/Variant.h" +using namespace std; using namespace JSONRPC; using namespace PVR; using namespace EPG; -using namespace KODI::MESSAGING; JSONRPC_STATUS CPVROperations::GetProperties(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { @@ -72,7 +70,7 @@ int start, end; - std::vector groupList = channelGroups->GetMembers(true); + vector groupList = channelGroups->GetMembers(); HandleLimits(parameterObject, result, groupList.size(), start, end); for (int index = start; index < end; index++) FillChannelGroupDetails(groupList.at(index), parameterObject, result["channelgroups"], true); @@ -163,8 +161,8 @@ if (channel == NULL) return InvalidParams; - CEpgPtr channelEpg = channel->GetEPG(); - if (!channelEpg) + CEpg *channelEpg = channel->GetEPG(); + if (channelEpg == NULL) return InternalError; CFileItemList programFull; @@ -182,7 +180,7 @@ EpgSearchFilter filter; filter.Reset(); - filter.m_iUniqueBroadcastId = parameterObject["broadcastid"].asUnsignedInteger(); + filter.m_iUniqueBroadcastId = (int)parameterObject["broadcastid"].asInteger(); CFileItemList broadcasts; int resultSize = g_EpgContainer.GetEPGSearch(broadcasts, filter); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PVROperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PVROperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/PVROperations.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/PVROperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,8 +22,6 @@ #include "FileItemHandler.h" #include "pvr/channels/PVRChannelGroup.h" -class CVariant; - namespace JSONRPC { class CPVROperations : public CFileItemHandler diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/schema/methods.json kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/schema/methods.json --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/schema/methods.json 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/schema/methods.json 2015-10-19 08:39:16.000000000 +0000 @@ -1351,8 +1351,7 @@ { "name": "fanart", "$ref": "Optional.String" }, { "name": "tag", "type": [ "null", { "$ref": "Array.String", "required": true } ], "default": null }, { "name": "art", "type": [ "null", { "$ref": "Media.Artwork.Set", "required": true } ], "default": null }, - { "name": "resume", "type": [ "null", { "$ref": "Video.Resume", "required": true } ], "default": null }, - { "name": "userrating", "$ref": "Optional.Integer" } + { "name": "resume", "type": [ "null", { "$ref": "Video.Resume", "required": true } ], "default": null } ], "returns": "string" }, @@ -1392,8 +1391,7 @@ { "name": "thumbnail", "$ref": "Optional.String" }, { "name": "fanart", "$ref": "Optional.String" }, { "name": "tag", "type": [ "null", { "$ref": "Array.String", "required": true } ], "default": null }, - { "name": "art", "type": [ "null", { "$ref": "Media.Artwork.Set", "required": true } ], "default": null }, - { "name": "userrating", "$ref": "Optional.Integer" } + { "name": "art", "type": [ "null", { "$ref": "Media.Artwork.Set", "required": true } ], "default": null } ], "returns": "string" }, @@ -1432,8 +1430,7 @@ { "name": "thumbnail", "$ref": "Optional.String" }, { "name": "fanart", "$ref": "Optional.String" }, { "name": "art", "type": [ "null", { "$ref": "Media.Artwork.Set", "required": true } ], "default": null }, - { "name": "resume", "type": [ "null", { "$ref": "Video.Resume", "required": true } ], "default": null }, - { "name": "userrating", "$ref": "Optional.Integer" } + { "name": "resume", "type": [ "null", { "$ref": "Video.Resume", "required": true } ], "default": null } ], "returns": "string" }, @@ -1460,57 +1457,7 @@ { "name": "fanart", "$ref": "Optional.String" }, { "name": "tag", "type": [ "null", { "$ref": "Array.String", "required": true } ], "default": null }, { "name": "art", "type": [ "null", { "$ref": "Media.Artwork.Set", "required": true } ], "default": null }, - { "name": "resume", "type": [ "null", { "$ref": "Video.Resume", "required": true } ], "default": null }, - { "name": "userrating", "$ref": "Optional.Integer" } - ], - "returns": "string" - }, - "VideoLibrary.RefreshMovie": { - "type": "method", - "description": "Refresh the given movie in the library", - "transport": "Response", - "permission": "UpdateData", - "params": [ - { "name": "movieid", "$ref": "Library.Id", "required": true }, - { "name": "ignorenfo", "type": "boolean", "required": false, "default": false, "description": "Whether or not to ignore a local NFO if present." }, - { "name": "title", "type": "string", "required": "false", "default": "", "description": "Title to use for searching (instead of determining it from the item's filename/path)." } - ], - "returns": "string" - }, - "VideoLibrary.RefreshTVShow": { - "type": "method", - "description": "Refresh the given tv show in the library", - "transport": "Response", - "permission": "UpdateData", - "params": [ - { "name": "tvshowid", "$ref": "Library.Id", "required": true }, - { "name": "ignorenfo", "type": "boolean", "required": false, "default": false, "description": "Whether or not to ignore a local NFO if present." }, - { "name": "refreshepisodes", "type": "boolean", "required": false, "default": false, "description": "Whether or not to refresh all episodes belonging to the TV show." }, - { "name": "title", "type": "string", "required": "false", "default": "", "description": "Title to use for searching (instead of determining it from the item's filename/path)." } - ], - "returns": "string" - }, - "VideoLibrary.RefreshEpisode": { - "type": "method", - "description": "Refresh the given episode in the library", - "transport": "Response", - "permission": "UpdateData", - "params": [ - { "name": "episodeid", "$ref": "Library.Id", "required": true }, - { "name": "ignorenfo", "type": "boolean", "required": false, "default": false, "description": "Whether or not to ignore a local NFO if present." }, - { "name": "title", "type": "string", "required": "false", "default": "", "description": "Title to use for searching (instead of determining it from the item's filename/path)." } - ], - "returns": "string" - }, - "VideoLibrary.RefreshMusicVideo": { - "type": "method", - "description": "Refresh the given music video in the library", - "transport": "Response", - "permission": "UpdateData", - "params": [ - { "name": "musicvideoid", "$ref": "Library.Id", "required": true }, - { "name": "ignorenfo", "type": "boolean", "required": false, "default": false, "description": "Whether or not to ignore a local NFO if present." }, - { "name": "title", "type": "string", "required": "false", "default": "", "description": "Title to use for searching (instead of determining it from the item's filename/path)." } + { "name": "resume", "type": [ "null", { "$ref": "Video.Resume", "required": true } ], "default": null } ], "returns": "string" }, diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/schema/notifications.json kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/schema/notifications.json --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/schema/notifications.json 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/schema/notifications.json 2015-10-19 08:39:16.000000000 +0000 @@ -176,20 +176,6 @@ ], "returns": null }, - "AudioLibrary.OnExport": { - "type": "notification", - "description": "An audio library export has finished.", - "params": [ - { "name": "sender", "type": "string", "required": true }, - { "name": "data", "type": "object", "required": false, - "properties": { - "file": { "type": "string", "required": false, "default": "" }, - "failcount": { "type": "integer", "minimum": 0, "required": false, "default": 0 } - } - } - ], - "returns": null - }, "VideoLibrary.OnUpdate": { "type": "notification", "description": "A video item has been updated.", @@ -204,21 +190,6 @@ } } ], - "returns": null - }, - "VideoLibrary.OnExport": { - "type": "notification", - "description": "A video library export has finished.", - "params": [ - { "name": "sender", "type": "string", "required": true }, - { "name": "data", "type": "object", "required": false, - "properties": { - "file": { "type": "string", "required": false, "default": "" }, - "root": { "type": "string", "required": false, "default": "" }, - "failcount": { "type": "integer", "minimum": 0, "required": false, "default": 0 } - } - } - ], "returns": null }, "VideoLibrary.OnRemove": { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/schema/types.json kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/schema/types.json --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/schema/types.json 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/schema/types.json 2015-10-19 08:39:16.000000000 +0000 @@ -396,7 +396,7 @@ "enum": [ "instrument", "style", "mood", "born", "formed", "description", "genre", "died", "disbanded", "yearsactive", "musicbrainzartistid", "fanart", - "thumbnail", "compilationartist", "dateadded" ] + "thumbnail", "compilationartist" ] } }, "Audio.Fields.Album": { @@ -408,7 +408,7 @@ "rating", "year", "musicbrainzalbumid", "musicbrainzalbumartistid", "fanart", "thumbnail", "playcount", "genreid", "artistid", "displayartist", - "compilation", "releasetype", "dateadded" ] + "compilation", "releasetype" ] } }, "Audio.Fields.Song": { @@ -421,7 +421,7 @@ "musicbrainzalbumid", "musicbrainzalbumartistid", "playcount", "fanart", "thumbnail", "file", "albumid", "lastplayed", "disc", "genreid", "artistid", "displayartist", - "albumartistid", "albumreleasetype", "dateadded" ] + "albumartistid", "albumreleasetype" ] } }, "Audio.Album.ReleaseType": { @@ -432,8 +432,7 @@ "Audio.Details.Base": { "extends": "Media.Details.Base", "properties": { - "genre": { "$ref": "Array.String" }, - "dateadded": { "type": "string" } + "genre": { "$ref": "Array.String" } } }, "Audio.Details.Media": { @@ -513,13 +512,13 @@ "playcount", "writer", "studio", "mpaa", "cast", "country", "imdbnumber", "runtime", "set", "showlink", "streamdetails", "top250", "votes", "fanart", "thumbnail", "file", "sorttitle", - "resume", "setid", "dateadded", "tag", "art", "userrating" ] + "resume", "setid", "dateadded", "tag", "art" ] } }, "Video.Fields.MovieSet": { "extends": "Item.Fields.Base", "items": { "type": "string", - "enum": [ "title", "playcount", "fanart", "thumbnail", "art", "plot" ] + "enum": [ "title", "playcount", "fanart", "thumbnail", "art" ] } }, "Video.Fields.TVShow": { @@ -531,7 +530,7 @@ "imdbnumber", "premiered", "votes", "lastplayed", "fanart", "thumbnail", "file", "originaltitle", "sorttitle", "episodeguide", "season", "watchedepisodes", - "dateadded", "tag", "art", "userrating" ] + "dateadded", "tag", "art" ] } }, "Video.Fields.Season": { @@ -550,8 +549,7 @@ "productioncode", "season", "episode", "originaltitle", "showtitle", "cast", "streamdetails", "lastplayed", "fanart", "thumbnail", "file", "resume", "tvshowid", "dateadded", - "uniqueid", "art", "specialsortseason", "specialsortepisode", "userrating", - "seasonid" ] + "uniqueid", "art", "specialsortseason", "specialsortepisode" ] } }, "Video.Fields.MusicVideo": { @@ -561,7 +559,7 @@ "studio", "year", "plot", "album", "artist", "genre", "track", "streamdetails", "lastplayed", "fanart", "thumbnail", "file", "resume", "dateadded", - "tag", "art", "userrating" ] + "tag", "art" ] } }, "Video.Cast": { @@ -674,15 +672,13 @@ "top250": { "type": "integer" }, "votes": { "type": "string" }, "setid": { "$ref": "Library.Id" }, - "tag": { "$ref": "Array.String" }, - "userrating": { "type": "integer" } + "tag": { "$ref": "Array.String" } } }, "Video.Details.MovieSet": { "extends": "Video.Details.Media", "properties": { - "setid": { "$ref": "Library.Id", "required": true }, - "plot": { "type": "string" } + "setid": { "$ref": "Library.Id", "required": true } } }, "Video.Details.MovieSet.Extended": { @@ -713,8 +709,7 @@ "votes": { "type": "string" }, "episodeguide": { "type": "string" }, "season": { "type": "integer" }, - "tag": { "$ref": "Array.String" }, - "userrating": { "type": "integer" } + "tag": { "$ref": "Array.String" } } }, "Video.Details.Season": { @@ -745,9 +740,7 @@ "cast": { "$ref": "Video.Cast" }, "tvshowid": { "$ref": "Library.Id" }, "specialsortseason": { "type": "integer" }, - "specialsortepisode": { "type": "integer" }, - "userrating": { "type": "integer" }, - "seasonid": { "$ref": "Library.Id" } + "specialsortepisode": { "type": "integer" } } }, "Video.Details.MusicVideo": { @@ -760,8 +753,7 @@ "artist": { "$ref": "Array.String" }, "genre": { "$ref": "Array.String" }, "track": { "type": "integer" }, - "tag": { "$ref": "Array.String" }, - "userrating": { "type": "integer" } + "tag": { "$ref": "Array.String" } } }, "PVR.Property.Name": { @@ -782,41 +774,6 @@ { "type": "string", "enum": [ "alltv", "allradio" ], "required": true } ] }, - "PVR.Fields.Broadcast": { - "extends": "Item.Fields.Base", - "items": { "type": "string", - "enum": [ "title", "plot", "plotoutline", "starttime", - "endtime", "runtime", "progress", "progresspercentage", - "genre", "episodename", "episodenum", "episodepart", - "firstaired", "hastimer", "isactive", "parentalrating", - "wasactive", "thumbnail", "rating" ] - } - }, - "PVR.Details.Broadcast": { - "extends": "Item.Details.Base", - "properties": { - "broadcastid": { "$ref": "Library.Id", "required": true }, - "title": { "type": "string" }, - "plot": { "type": "string" }, - "plotoutline": { "type": "string" }, - "starttime": { "type": "string" }, - "endtime": { "type": "string" }, - "runtime": { "type": "integer" }, - "progress": { "type": "integer" }, - "progresspercentage": { "type": "number" }, - "genre": { "type": "string" }, - "episodename": { "type": "string" }, - "episodenum": { "type": "integer" }, - "episodepart": { "type": "integer" }, - "firstaired": { "type": "string" }, - "hastimer": { "type": "boolean" }, - "isactive": { "type": "boolean" }, - "parentalrating": { "type": "integer" }, - "wasactive": { "type": "boolean" }, - "thumbnail": { "type": "string" }, - "rating": { "type": "integer" } - } - }, "PVR.Fields.Channel": { "extends": "Item.Fields.Base", "items": { "type": "string", @@ -853,6 +810,41 @@ } } }, + "PVR.Fields.Broadcast": { + "extends": "Item.Fields.Base", + "items": { "type": "string", + "enum": [ "title", "plot", "plotoutline", "starttime", + "endtime", "runtime", "progress", "progresspercentage", + "genre", "episodename", "episodenum", "episodepart", + "firstaired", "hastimer", "isactive", "parentalrating", + "wasactive", "thumbnail", "rating" ] + } + }, + "PVR.Details.Broadcast": { + "extends": "Item.Details.Base", + "properties": { + "broadcastid": { "$ref": "Library.Id", "required": true }, + "title": { "type": "string" }, + "plot": { "type": "string" }, + "plotoutline": { "type": "string" }, + "starttime": { "type": "string" }, + "endtime": { "type": "string" }, + "runtime": { "type": "integer" }, + "progress": { "type": "integer" }, + "progresspercentage": { "type": "number" }, + "genre": { "type": "string" }, + "episodename": { "type": "string" }, + "episodenum": { "type": "integer" }, + "episodepart": { "type": "integer" }, + "firstaired": { "type": "string" }, + "hastimer": { "type": "boolean" }, + "isactive": { "type": "boolean" }, + "parentalrating": { "type": "integer" }, + "wasactive": { "type": "boolean" }, + "thumbnail": { "type": "string" }, + "rating": { "type": "integer" } + } + }, "PVR.TimerState": { "type": "string", "enum": [ "unknown", "new", "scheduled", "recording", "completed", @@ -1369,13 +1361,6 @@ "enabled": { "type": "boolean" } } }, - "GUI.Stereoscopy.Mode": { - "type": "object", - "properties": { - "mode": { "type": "string", "required": true, "enum": [ "off", "split_vertical", "split_horizontal", "row_interleaved", "hardware_based", "anaglyph_cyan_red", "anaglyph_green_magenta", "anaglyph_yellow_blue", "monoscopic" ] }, - "label": { "type": "string", "required": true } - } - }, "GUI.Property.Name": { "type": "string", "enum": [ "currentwindow", "currentcontrol", "skin", "fullscreen", "stereoscopicmode" ] @@ -1404,6 +1389,13 @@ "stereoscopicmode": { "$ref": "GUI.Stereoscopy.Mode" } } }, + "GUI.Stereoscopy.Mode": { + "type": "object", + "properties": { + "mode": { "type": "string", "required": true, "enum": [ "off", "split_vertical", "split_horizontal", "row_interleaved", "hardware_based", "anaglyph_cyan_red", "anaglyph_green_magenta", "anaglyph_yellow_blue", "monoscopic" ] }, + "label": { "type": "string", "required": true } + } + }, "System.Property.Name": { "type": "string", "enum": [ "canshutdown", "cansuspend", "canhibernate", "canreboot" ] diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/schema/version.txt kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/schema/version.txt --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/schema/version.txt 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/schema/version.txt 2015-10-19 08:39:16.000000000 +0000 @@ -1 +1 @@ -6.32.5 +6.25.2 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/SettingsOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/SettingsOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/SettingsOperations.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/SettingsOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,8 +29,8 @@ #include "settings/lib/SettingSection.h" #include "guilib/LocalizeStrings.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" +using namespace std; using namespace JSONRPC; JSONRPC_STATUS CSettingsOperations::GetSections(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) @@ -41,8 +41,8 @@ result["sections"] = CVariant(CVariant::VariantTypeArray); // apply the level filter - std::vector allSections = CSettings::GetInstance().GetSections(); - for (std::vector::const_iterator itSection = allSections.begin(); itSection != allSections.end(); ++itSection) + vector allSections = CSettings::Get().GetSections(); + for (vector::const_iterator itSection = allSections.begin(); itSection != allSections.end(); ++itSection) { SettingCategoryList categories = (*itSection)->GetCategories(level); if (categories.empty()) @@ -77,21 +77,21 @@ std::string strSection = parameterObject["section"].asString(); bool listSettings = !parameterObject["properties"].empty() && parameterObject["properties"][0].asString() == "settings"; - std::vector sections; + vector sections; if (!strSection.empty()) { - CSettingSection *section = CSettings::GetInstance().GetSection(strSection); + CSettingSection *section = CSettings::Get().GetSection(strSection); if (section == NULL) return InvalidParams; sections.push_back(section); } else - sections = CSettings::GetInstance().GetSections(); + sections = CSettings::Get().GetSections(); result["categories"] = CVariant(CVariant::VariantTypeArray); - for (std::vector::const_iterator itSection = sections.begin(); itSection != sections.end(); ++itSection) + for (vector::const_iterator itSection = sections.begin(); itSection != sections.end(); ++itSection) { SettingCategoryList categories = (*itSection)->GetCategories(level); for (SettingCategoryList::const_iterator itCategory = categories.begin(); itCategory != categories.end(); ++itCategory) @@ -141,29 +141,29 @@ SettingLevel level = (SettingLevel)ParseSettingLevel(parameterObject["level"].asString()); const CVariant &filter = parameterObject["filter"]; bool doFilter = filter.isObject() && filter.isMember("section") && filter.isMember("category"); - std::string strSection, strCategory; + string strSection, strCategory; if (doFilter) { strSection = filter["section"].asString(); strCategory = filter["category"].asString(); } - std::vector sections; + vector sections; if (doFilter) { - CSettingSection *section = CSettings::GetInstance().GetSection(strSection); + CSettingSection *section = CSettings::Get().GetSection(strSection); if (section == NULL) return InvalidParams; sections.push_back(section); } else - sections = CSettings::GetInstance().GetSections(); + sections = CSettings::Get().GetSections(); result["settings"] = CVariant(CVariant::VariantTypeArray); - for (std::vector::const_iterator itSection = sections.begin(); itSection != sections.end(); ++itSection) + for (vector::const_iterator itSection = sections.begin(); itSection != sections.end(); ++itSection) { SettingCategoryList categories = (*itSection)->GetCategories(level); bool found = !doFilter; @@ -203,9 +203,9 @@ JSONRPC_STATUS CSettingsOperations::GetSettingValue(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - std::string settingId = parameterObject["setting"].asString(); + string settingId = parameterObject["setting"].asString(); - CSetting* setting = CSettings::GetInstance().GetSetting(settingId); + CSetting* setting = CSettings::Get().GetSetting(settingId); if (setting == NULL || !setting->IsVisible()) return InvalidParams; @@ -231,7 +231,7 @@ case SettingTypeList: { - SerializeSettingListValues(CSettings::GetInstance().GetList(settingId), value); + SerializeSettingListValues(CSettings::Get().GetList(settingId), value); break; } @@ -248,10 +248,10 @@ JSONRPC_STATUS CSettingsOperations::SetSettingValue(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - std::string settingId = parameterObject["setting"].asString(); + string settingId = parameterObject["setting"].asString(); CVariant value = parameterObject["value"]; - CSetting* setting = CSettings::GetInstance().GetSetting(settingId); + CSetting* setting = CSettings::Get().GetSetting(settingId); if (setting == NULL || !setting->IsVisible()) return InvalidParams; @@ -295,7 +295,7 @@ for (CVariant::const_iterator_array itValue = value.begin_array(); itValue != value.end_array(); ++itValue) values.push_back(*itValue); - result = CSettings::GetInstance().SetList(settingId, values); + result = CSettings::Get().SetList(settingId, values); break; } @@ -310,9 +310,9 @@ JSONRPC_STATUS CSettingsOperations::ResetSettingValue(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - std::string settingId = parameterObject["setting"].asString(); + string settingId = parameterObject["setting"].asString(); - CSetting* setting = CSettings::GetInstance().GetSetting(settingId); + CSetting* setting = CSettings::Get().GetSetting(settingId); if (setting == NULL || !setting->IsVisible()) return InvalidParams; @@ -644,6 +644,9 @@ if (type == "spinner") { const CSettingControlSpinner* spinner = static_cast(control); + if (spinner == NULL) + return false; + if (spinner->GetFormatLabel() >= 0) obj["formatlabel"] = g_localizeStrings.Get(spinner->GetFormatLabel()); else if (!spinner->GetFormatString().empty() && spinner->GetFormatString() != "%i") @@ -654,6 +657,9 @@ else if (type == "edit") { const CSettingControlEdit* edit = static_cast(control); + if (edit == NULL) + return false; + obj["hidden"] = edit->IsHidden(); obj["verifynewvalue"] = edit->VerifyNewValue(); if (edit->GetHeading() >= 0) @@ -662,12 +668,18 @@ else if (type == "button") { const CSettingControlButton* button = static_cast(control); + if (button == NULL) + return false; + if (button->GetHeading() >= 0) obj["heading"] = g_localizeStrings.Get(button->GetHeading()); } else if (type == "list") { const CSettingControlList* list = static_cast(control); + if (list == NULL) + return false; + if (list->GetHeading() >= 0) obj["heading"] = g_localizeStrings.Get(list->GetHeading()); obj["multiselect"] = list->CanMultiSelect(); @@ -675,6 +687,9 @@ else if (type == "slider") { const CSettingControlSlider* slider = static_cast(control); + if (slider == NULL) + return false; + if (slider->GetHeading() >= 0) obj["heading"] = g_localizeStrings.Get(slider->GetHeading()); obj["popup"] = slider->UsePopup(); @@ -686,6 +701,9 @@ else if (type == "range") { const CSettingControlRange* range = static_cast(control); + if (range == NULL) + return false; + if (range->GetFormatLabel() >= 0) obj["formatlabel"] = g_localizeStrings.Get(range->GetFormatLabel()); else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/SettingsOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/SettingsOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/SettingsOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/SettingsOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,6 @@ #include "JSONRPC.h" -class CVariant; class ISetting; class CSettingSection; class CSettingCategory; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/SystemOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/SystemOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/SystemOperations.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/SystemOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,13 +19,12 @@ */ #include "SystemOperations.h" -#include "messaging/ApplicationMessenger.h" -#include "interfaces/builtins/Builtins.h" +#include "ApplicationMessenger.h" +#include "interfaces/Builtins.h" #include "utils/Variant.h" #include "powermanagement/PowerManager.h" using namespace JSONRPC; -using namespace KODI::MESSAGING; JSONRPC_STATUS CSystemOperations::GetProperties(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { @@ -48,14 +47,14 @@ JSONRPC_STATUS CSystemOperations::EjectOpticalDrive(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { - return CBuiltins::GetInstance().Execute("EjectTray") == 0 ? ACK : FailedToExecute; + return CBuiltins::Execute("EjectTray") == 0 ? ACK : FailedToExecute; } JSONRPC_STATUS CSystemOperations::Shutdown(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { if (g_powerManager.CanPowerdown()) { - CApplicationMessenger::GetInstance().PostMsg(TMSG_POWERDOWN); + CApplicationMessenger::Get().Powerdown(); return ACK; } else @@ -66,7 +65,7 @@ { if (g_powerManager.CanSuspend()) { - CApplicationMessenger::GetInstance().PostMsg(TMSG_SUSPEND); + CApplicationMessenger::Get().Suspend(); return ACK; } else @@ -77,7 +76,7 @@ { if (g_powerManager.CanHibernate()) { - CApplicationMessenger::GetInstance().PostMsg(TMSG_HIBERNATE); + CApplicationMessenger::Get().Hibernate(); return ACK; } else @@ -88,7 +87,7 @@ { if (g_powerManager.CanReboot()) { - CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTART); + CApplicationMessenger::Get().Restart(); return ACK; } else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/SystemOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/SystemOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/SystemOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/SystemOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,8 +21,6 @@ #include "JSONRPC.h" -class CVariant; - namespace JSONRPC { class CSystemOperations diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/TextureOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/TextureOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/TextureOperations.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/TextureOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,6 @@ #include "TextureOperations.h" #include "TextureDatabase.h" #include "TextureCache.h" -#include "utils/Variant.h" using namespace JSONRPC; @@ -97,7 +96,7 @@ { int id = (int)parameterObject["textureid"].asInteger(); - if (!CTextureCache::GetInstance().ClearCachedImage(id)) + if (!CTextureCache::Get().ClearCachedImage(id)) return InvalidParams; return ACK; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/TextureOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/TextureOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/TextureOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/TextureOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,8 +21,6 @@ #include "JSONRPC.h" -class CVariant; - namespace JSONRPC { class CTextureOperations diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/VideoLibrary.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/VideoLibrary.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/VideoLibrary.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/VideoLibrary.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,18 +19,14 @@ */ #include "VideoLibrary.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "TextureDatabase.h" #include "Util.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "video/VideoDatabase.h" -#include "video/VideoLibraryQueue.h" using namespace JSONRPC; -using namespace KODI::MESSAGING; JSONRPC_STATUS CVideoLibrary::GetMovies(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { @@ -44,9 +40,7 @@ return InvalidParams; CVideoDbUrl videoUrl; - if (!videoUrl.FromString("videodb://movies/titles/")) - return InternalError; - + videoUrl.FromString("videodb://movies/titles/"); int genreID = -1, year = -1, setID = 0; const CVariant &filter = parameterObject["filter"]; if (filter.isMember("genreid")) @@ -154,9 +148,7 @@ return InvalidParams; CVideoDbUrl videoUrl; - if (!videoUrl.FromString("videodb://tvshows/titles/")) - return InternalError; - + videoUrl.FromString("videodb://tvshows/titles/"); int genreID = -1, year = -1; const CVariant &filter = parameterObject["filter"]; if (filter.isMember("genreid")) @@ -276,9 +268,7 @@ std::string strPath = StringUtils::Format("videodb://tvshows/titles/%i/%i/", tvshowID, season); CVideoDbUrl videoUrl; - if (!videoUrl.FromString(strPath)) - return InternalError; - + videoUrl.FromString(strPath); const CVariant &filter = parameterObject["filter"]; if (filter.isMember("genreid")) videoUrl.AddOption("genreid", (int)filter["genreid"].asInteger()); @@ -353,9 +343,7 @@ return InvalidParams; CVideoDbUrl videoUrl; - if (!videoUrl.FromString("videodb://musicvideos/titles/")) - return InternalError; - + videoUrl.FromString("videodb://musicvideos/titles/"); int genreID = -1, year = -1; const CVariant &filter = parameterObject["filter"]; if (filter.isMember("artist")) @@ -737,92 +725,6 @@ return ACK; } -JSONRPC_STATUS CVideoLibrary::RefreshMovie(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) -{ - int id = static_cast(parameterObject["movieid"].asInteger()); - - CVideoDatabase videodatabase; - if (!videodatabase.Open()) - return InternalError; - - CVideoInfoTag infos; - if (!videodatabase.GetMovieInfo("", infos, id) || infos.m_iDbId <= 0) - return InvalidParams; - - bool ignoreNfo = parameterObject["ignorenfo"].asBoolean(); - std::string searchTitle = parameterObject["title"].asString(); - CVideoLibraryQueue::GetInstance().RefreshItem(CFileItemPtr(new CFileItem(infos)), ignoreNfo, true, false, searchTitle); - - return ACK; -} - -JSONRPC_STATUS CVideoLibrary::RefreshTVShow(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) -{ - int id = static_cast(parameterObject["tvshowid"].asInteger()); - - CVideoDatabase videodatabase; - if (!videodatabase.Open()) - return InternalError; - - CFileItemPtr item(new CFileItem()); - CVideoInfoTag infos; - if (!videodatabase.GetTvShowInfo("", infos, id, item.get()) || infos.m_iDbId <= 0) - return InvalidParams; - - item->SetFromVideoInfoTag(infos); - - bool ignoreNfo = parameterObject["ignorenfo"].asBoolean(); - bool refreshEpisodes = parameterObject["refreshepisodes"].asBoolean(); - std::string searchTitle = parameterObject["title"].asString(); - CVideoLibraryQueue::GetInstance().RefreshItem(item, ignoreNfo, true, refreshEpisodes, searchTitle); - - return ACK; -} - -JSONRPC_STATUS CVideoLibrary::RefreshEpisode(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) -{ - int id = (int)parameterObject["episodeid"].asInteger(); - - CVideoDatabase videodatabase; - if (!videodatabase.Open()) - return InternalError; - - CVideoInfoTag infos; - if (!videodatabase.GetEpisodeInfo("", infos, id) || infos.m_iDbId <= 0) - return InvalidParams; - - CFileItemPtr item = CFileItemPtr(new CFileItem(infos)); - // We need to set the correct base path to get the valid fanart - int tvshowid = infos.m_iIdShow; - if (tvshowid <= 0) - tvshowid = videodatabase.GetTvShowForEpisode(id); - - bool ignoreNfo = parameterObject["ignorenfo"].asBoolean(); - std::string searchTitle = parameterObject["title"].asString(); - CVideoLibraryQueue::GetInstance().RefreshItem(item, ignoreNfo, true, false, searchTitle); - - return ACK; -} - -JSONRPC_STATUS CVideoLibrary::RefreshMusicVideo(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) -{ - int id = static_cast(parameterObject["musicvideoid"].asInteger()); - - CVideoDatabase videodatabase; - if (!videodatabase.Open()) - return InternalError; - - CVideoInfoTag infos; - if (!videodatabase.GetMusicVideoInfo("", infos, id) || infos.m_iDbId <= 0) - return InvalidParams; - - bool ignoreNfo = parameterObject["ignorenfo"].asBoolean(); - std::string searchTitle = parameterObject["title"].asString(); - CVideoLibraryQueue::GetInstance().RefreshItem(CFileItemPtr(new CFileItem(infos)), ignoreNfo, true, false, searchTitle); - - return ACK; -} - JSONRPC_STATUS CVideoLibrary::RemoveMovie(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { return RemoveVideo(parameterObject); @@ -848,7 +750,7 @@ std::string directory = parameterObject["directory"].asString(); std::string cmd = StringUtils::Format("updatelibrary(video, %s, %s)", StringUtils::Paramify(directory).c_str(), parameterObject["showdialogs"].asBoolean() ? "true" : "false"); - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, cmd); + CApplicationMessenger::Get().ExecBuiltIn(cmd); return ACK; } @@ -863,14 +765,14 @@ parameterObject["options"]["overwrite"].asBoolean() ? "true" : "false", parameterObject["options"]["actorthumbs"].asBoolean() ? "true" : "false"); - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, cmd); + CApplicationMessenger::Get().ExecBuiltIn(cmd); return ACK; } JSONRPC_STATUS CVideoLibrary::Clean(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { std::string cmd = StringUtils::Format("cleanlibrary(video, %s)", parameterObject["showdialogs"].asBoolean() ? "true" : "false"); - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, cmd); + CApplicationMessenger::Get().ExecBuiltIn(cmd); return ACK; } @@ -1125,8 +1027,6 @@ details.m_iTrack = (int)parameterObject["track"].asInteger(); if (ParameterNotNull(parameterObject, "rating")) details.m_fRating = parameterObject["rating"].asFloat(); - if (ParameterNotNull(parameterObject, "userrating")) - details.m_iUserRating = parameterObject["userrating"].asInteger(); if (ParameterNotNull(parameterObject, "mpaa")) details.SetMPAARating(parameterObject["mpaa"].asString()); if (ParameterNotNull(parameterObject, "imdbnumber")) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/VideoLibrary.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/VideoLibrary.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/VideoLibrary.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/VideoLibrary.h 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,6 @@ #include "FileItemHandler.h" class CVideoDatabase; -class CVariant; namespace JSONRPC { @@ -59,16 +58,11 @@ static JSONRPC_STATUS SetEpisodeDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); static JSONRPC_STATUS SetMusicVideoDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); - static JSONRPC_STATUS RefreshMovie(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); - static JSONRPC_STATUS RefreshTVShow(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); - static JSONRPC_STATUS RefreshEpisode(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); - static JSONRPC_STATUS RefreshMusicVideo(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); - static JSONRPC_STATUS RemoveMovie(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); static JSONRPC_STATUS RemoveTVShow(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); static JSONRPC_STATUS RemoveEpisode(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); static JSONRPC_STATUS RemoveMusicVideo(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); - + static JSONRPC_STATUS Scan(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); static JSONRPC_STATUS Export(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); static JSONRPC_STATUS Clean(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/XBMCOperations.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/XBMCOperations.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/XBMCOperations.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/XBMCOperations.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,12 +19,11 @@ */ #include "XBMCOperations.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "utils/Variant.h" #include "powermanagement/PowerManager.h" using namespace JSONRPC; -using namespace KODI::MESSAGING; JSONRPC_STATUS CXBMCOperations::GetInfoLabels(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { @@ -40,9 +39,7 @@ if (info.size() > 0) { - std::vector infoLabels; - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_INFOLABEL, -1, -1, static_cast(&infoLabels), "", info); - + std::vector infoLabels = CApplicationMessenger::Get().GetInfoLabels(info); for (unsigned int i = 0; i < info.size(); i++) { if (i >= infoLabels.size()) @@ -83,8 +80,7 @@ if (info.size() > 0) { - std::vector infoLabels; - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_INFOBOOL, -1, -1, static_cast(&infoLabels), "", info); + std::vector infoLabels = CApplicationMessenger::Get().GetInfoBooleans(info); for (unsigned int i = 0; i < info.size(); i++) { if (i >= infoLabels.size()) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/XBMCOperations.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/XBMCOperations.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/json-rpc/XBMCOperations.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/json-rpc/XBMCOperations.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,8 +21,6 @@ #include "JSONRPC.h" -class CVariant; - namespace JSONRPC { class CXBMCOperations diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Addon.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Addon.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Addon.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Addon.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -50,15 +50,15 @@ if (id.empty()) throw AddonException("No valid addon id could be obtained. None was passed and the script wasn't executed in a normal xbmc manner."); - if (!ADDON::CAddonMgr::GetInstance().GetAddon(id.c_str(), pAddon)) + if (!ADDON::CAddonMgr::Get().GetAddon(id.c_str(), pAddon)) throw AddonException("Unknown addon id '%s'.", id.c_str()); - CAddonMgr::GetInstance().AddToUpdateableAddons(pAddon); + CAddonMgr::Get().AddToUpdateableAddons(pAddon); } Addon::~Addon() { - CAddonMgr::GetInstance().RemoveFromUpdateableAddons(pAddon); + CAddonMgr::Get().RemoveFromUpdateableAddons(pAddon); } String Addon::getLocalizedString(int id) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Alternative.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Alternative.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Alternative.h 2016-01-11 16:50:51.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Alternative.h 2015-04-04 00:00:16.000000000 +0000 @@ -31,46 +31,58 @@ public: private: WhichAlternative pos; - T1 d1; - T2 d2; + unsigned char m_data[sizeof(T1) > sizeof(T2) ? sizeof(T1) : sizeof(T2)]; public: Alternative() : pos(none) {} + Alternative(const Alternative& o) + { + unsigned char* data = m_data; + pos = o.pos; + if (pos == first) + new(data) T1(o.former()); + else if (pos == second) + new(data) T2(o.later()); + } inline WhichAlternative which() const { return pos; } inline T1& former() { + unsigned char* data = m_data; if (pos == second)// first and none is ok throw WrongTypeException("Access of XBMCAddon::Alternative as incorrect type"); if (pos == none) - d1 = T1(); + new(data) T1(); pos = first; - return d1; + return *((T1*)data); } inline const T1& former() const { + const unsigned char* data = m_data; if (pos != first) throw WrongTypeException("Access of XBMCAddon::Alternative as incorrect type"); - return d1; + return *((T1*)data); } inline T2& later() { + unsigned char* data = m_data; if (pos == first) throw WrongTypeException("Access of XBMCAddon::Alternative as incorrect type"); if (pos == none) - d2 = T2(); + new(data) T2(); pos = second; - return d2; + return *((T2*)data); } inline const T2& later() const { + const unsigned char* data = m_data; if (pos != second) throw WrongTypeException("Access of XBMCAddon::Alternative as incorrect type"); - return d2; + return *((T2*)data); } inline operator T1& () { return former(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/aojsonrpc.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/aojsonrpc.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/aojsonrpc.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/aojsonrpc.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,8 +22,6 @@ #include "interfaces/json-rpc/ITransportLayer.h" #include "interfaces/json-rpc/JSONRPC.h" -class CVariant; - #ifdef HAS_JSONRPC class CAddOnTransport : public JSONRPC::ITransportLayer { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Control.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Control.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Control.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Control.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -103,8 +103,7 @@ label, true, 0, - true, - false); + true); CGUIMessage msg(GUI_MSG_LABEL_RESET, iParentId, iControlId); pGUIControl->OnMessage(msg); @@ -112,11 +111,6 @@ return pGUIControl; } - void ControlFadeLabel::setScrolling(bool scroll) - { - static_cast(pGUIControl)->SetScrolling(scroll); - } - // ============================================================ // ============================================================ @@ -604,9 +598,8 @@ long _textOffsetX, long _textOffsetY, long alignment, const char* font, const char* _textColor, const char* _disabledColor, long angle, - const char* _shadowColor, const char* _focusedColor, - const char* disabledOnTexture, const char* disabledOffTexture) : - strFont("font13"), textColor(0xffffffff), disabledColor(0x60ffffff), + const char* _shadowColor, const char* _focusedColor) : + strFont("font13"), textColor(0xffffffff), disabledColor(0x60ffffff), textOffsetX(_textOffsetX), textOffsetY(_textOffsetY), align(alignment), iAngle(angle), shadowColor(0), focusedColor(0xffffffff) { @@ -734,9 +727,7 @@ CTextureInfo(strTextureRadioOnFocus), CTextureInfo(strTextureRadioOnNoFocus), CTextureInfo(strTextureRadioOffFocus), - CTextureInfo(strTextureRadioOffNoFocus), - CTextureInfo(strTextureRadioOnDisabled), - CTextureInfo(strTextureRadioOffDisabled)); + CTextureInfo(strTextureRadioOffNoFocus)); CGUIRadioButtonControl* pGuiButtonControl = (CGUIRadioButtonControl*)pGUIControl; @@ -879,10 +870,10 @@ LOCKGUI; if (pGUIControl) { - pGUIControl->SetAction(ACTION_MOVE_UP, up->iControlId); - pGUIControl->SetAction(ACTION_MOVE_DOWN, down->iControlId); - pGUIControl->SetAction(ACTION_MOVE_LEFT, left->iControlId); - pGUIControl->SetAction(ACTION_MOVE_RIGHT, right->iControlId); + pGUIControl->SetNavigationAction(ACTION_MOVE_UP, up->iControlId); + pGUIControl->SetNavigationAction(ACTION_MOVE_DOWN, down->iControlId); + pGUIControl->SetNavigationAction(ACTION_MOVE_LEFT, left->iControlId); + pGUIControl->SetNavigationAction(ACTION_MOVE_RIGHT, right->iControlId); } } } @@ -895,7 +886,7 @@ { LOCKGUI; if (pGUIControl) - pGUIControl->SetAction(ACTION_MOVE_UP, control->iControlId); + pGUIControl->SetNavigationAction(ACTION_MOVE_UP, control->iControlId); } } @@ -907,7 +898,7 @@ { LOCKGUI; if (pGUIControl) - pGUIControl->SetAction(ACTION_MOVE_DOWN, control->iControlId); + pGUIControl->SetNavigationAction(ACTION_MOVE_DOWN, control->iControlId); } } @@ -919,7 +910,7 @@ { LOCKGUI; if (pGUIControl) - pGUIControl->SetAction(ACTION_MOVE_LEFT, control->iControlId); + pGUIControl->SetNavigationAction(ACTION_MOVE_LEFT, control->iControlId); } } @@ -931,7 +922,7 @@ { LOCKGUI; if (pGUIControl) - pGUIControl->SetAction(ACTION_MOVE_RIGHT, control->iControlId); + pGUIControl->SetNavigationAction(ACTION_MOVE_RIGHT, control->iControlId); } } @@ -952,22 +943,16 @@ strTextureDown = XBMCAddonUtils::getDefaultImage((char*)"listcontrol", (char*)"texturedown", (char*)"scroll-down.png"); strTextureUpFocus = XBMCAddonUtils::getDefaultImage((char*)"listcontrol", (char*)"textureupfocus", (char*)"scroll-up-focus.png"); strTextureDownFocus = XBMCAddonUtils::getDefaultImage((char*)"listcontrol", (char*)"texturedownfocus", (char*)"scroll-down-focus.png"); - strTextureUpDisabled = XBMCAddonUtils::getDefaultImage((char*)"listcontrol", (char*)"textureupdisabled", (char*)"scroll-up.png"); - strTextureDownDisabled = XBMCAddonUtils::getDefaultImage((char*)"listcontrol", (char*)"texturedowndisabled", (char*)"scroll-down.png"); } - void ControlSpin::setTextures(const char* up, const char* down, - const char* upFocus, - const char* downFocus, - const char* upDisabled, - const char* downDisabled) + void ControlSpin::setTextures(const char* up, const char* down, + const char* upFocus, + const char* downFocus) { strTextureUp = up; strTextureDown = down; strTextureUpFocus = upFocus; strTextureDownFocus = downFocus; - strTextureUpDisabled = upDisabled; - strTextureDownDisabled = downDisabled; /* PyXBMCGUILock(); if (self->pGUIControl) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Control.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Control.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Control.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Control.h 2015-10-19 08:39:16.000000000 +0000 @@ -328,16 +328,13 @@ */ virtual void setTextures(const char* up, const char* down, const char* upFocus, - const char* downFocus, - const char* upDisabled, const char* downDisabled); + const char* downFocus); #ifndef SWIG color_t color; std::string strTextureUp; std::string strTextureDown; std::string strTextureUpFocus; std::string strTextureDownFocus; - std::string strTextureUpDisabled; - std::string strTextureDownDisabled; #endif private: @@ -440,7 +437,7 @@ * alignment : [opt] integer - alignment of label - *Note, see xbfont.h\n * focusTexture : [opt] string - filename for focus texture.\n * noFocusTexture : [opt] string - filename for no focus texture.\n - * isPassword : [opt] bool - True=mask text value with ****. + * isPassword : [opt] bool - if true, mask text value. * * *Note, You can use the above as keywords for arguments and skip certain optional arguments.\n * Once you use a keyword, all following arguments require the keyword.\n @@ -836,16 +833,6 @@ virtual void addLabel(const String& label); /** - * setScrolling(scroll) -- Set scrolling. - * - * scroll : boolean - True = enabled / False = disabled - * - * example: - * - self.fadelabel.setScrolling(False) - */ - virtual void setScrolling(bool scroll); - - /** * reset() -- Clear this fade label. * * example: @@ -983,14 +970,13 @@ const char* colorDiffuse = NULL); /** - * setImage(filename[, useCache]) -- Changes the image. + * setImage(filename, useCache) -- Changes the image. * - * filename : string - image filename.\n - * useCache : [opt] bool - True=use cache (default) / False=don't use cache. + * filename : string - image filename. + * useCache : [opt] bool - true/use cache, false/don't use cache * * example: * - self.image.setImage('special://home/scripts/test.png') - * - self.image.setImage('special://home/scripts/test.png', False) */ virtual void setImage(const char* imageFilename, const bool useCache = true); @@ -1364,14 +1350,13 @@ ControlRadioButton(long x, long y, long width, long height, const String& label, const char* focusOnTexture = NULL, const char* noFocusOnTexture = NULL, const char* focusOffTexture = NULL, const char* noFocusOffTexture = NULL, - const char* focusTexture = NULL, const char* noFocusTexture = NULL, + const char* focusTexture = NULL, const char* noFocusTexture = NULL, long textOffsetX = CONTROL_TEXT_OFFSET_X, long textOffsetY = CONTROL_TEXT_OFFSET_Y, long _alignment = (XBFONT_LEFT | XBFONT_CENTER_Y), const char* font = NULL, const char* textColor = NULL, const char* disabledColor = NULL, long angle = 0, - const char* shadowColor = NULL, const char* focusedColor = NULL, - const char* disabledOnTexture = NULL, const char* disabledOffTexture = NULL); + const char* shadowColor = NULL, const char* focusedColor = NULL); // setSelected() Method /** @@ -1449,8 +1434,6 @@ std::string strTextureRadioOnNoFocus; std::string strTextureRadioOffFocus; std::string strTextureRadioOffNoFocus; - std::string strTextureRadioOnDisabled; - std::string strTextureRadioOffDisabled; color_t textColor; color_t disabledColor; int textOffsetX; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Dialog.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Dialog.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Dialog.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Dialog.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,7 +22,6 @@ #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogYesNo.h" #include "dialogs/GUIDialogSelect.h" -#include "dialogs/GUIDialogTextViewer.h" #include "guilib/GUIWindowManager.h" #include "dialogs/GUIDialogFileBrowser.h" #include "dialogs/GUIDialogNumeric.h" @@ -31,19 +30,22 @@ #include "ModuleXbmcgui.h" #include "guilib/GUIKeyboardFactory.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "WindowException.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "Dialog.h" -using namespace KODI::MESSAGING; - #define ACTIVE_WINDOW g_windowManager.GetActiveWindow() namespace XBMCAddon { namespace xbmcgui { + static void XBMCWaitForThreadMessage(int message, int param1, int param2) + { + ThreadMessage tMsg = {(DWORD)message, param1, param2}; + CApplicationMessenger::Get().SendMessage(tMsg, true); + } + Dialog::~Dialog() {} bool Dialog::yesno(const String& heading, const String& line1, @@ -54,29 +56,31 @@ int autoclose) { DelayedCallGuard dcguard(languageHook); - CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); + const int window = WINDOW_DIALOG_YES_NO; + CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(window); if (pDialog == NULL) throw WindowException("Error: Window is NULL, this is not possible :-)"); // get lines, last 4 lines are optional. if (!heading.empty()) - pDialog->SetHeading(CVariant{heading}); + pDialog->SetHeading(heading); if (!line1.empty()) - pDialog->SetLine(0, CVariant{line1}); + pDialog->SetLine(0, line1); if (!line2.empty()) - pDialog->SetLine(1, CVariant{line2}); + pDialog->SetLine(1, line2); if (!line3.empty()) - pDialog->SetLine(2, CVariant{line3}); + pDialog->SetLine(2, line3); if (!nolabel.empty()) - pDialog->SetChoice(0, CVariant{nolabel}); + pDialog->SetChoice(0,nolabel); if (!yeslabel.empty()) - pDialog->SetChoice(1, CVariant{yeslabel}); + pDialog->SetChoice(1,yeslabel); if (autoclose > 0) pDialog->SetAutoClose(autoclose); - pDialog->Open(); + //send message and wait for user input + XBMCWaitForThreadMessage(TMSG_DIALOG_DOMODAL, window, ACTIVE_WINDOW); return pDialog->IsConfirmed(); } @@ -84,13 +88,14 @@ int Dialog::select(const String& heading, const std::vector& list, int autoclose) { DelayedCallGuard dcguard(languageHook); - CGUIDialogSelect* pDialog= (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); + const int window = WINDOW_DIALOG_SELECT; + CGUIDialogSelect* pDialog= (CGUIDialogSelect*)g_windowManager.GetWindow(window); if (pDialog == NULL) throw WindowException("Error: Window is NULL, this is not possible :-)"); pDialog->Reset(); if (!heading.empty()) - pDialog->SetHeading(CVariant{heading}); + pDialog->SetHeading(heading); String listLine; for(unsigned int i = 0; i < list.size(); i++) @@ -101,77 +106,38 @@ if (autoclose > 0) pDialog->SetAutoClose(autoclose); - pDialog->Open(); + //send message and wait for user input + XBMCWaitForThreadMessage(TMSG_DIALOG_DOMODAL, window, ACTIVE_WINDOW); return pDialog->GetSelectedLabel(); } - - std::unique_ptr> Dialog::multiselect(const String& heading, - const std::vector& options, int autoclose) - { - DelayedCallGuard dcguard(languageHook); - CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); - if (pDialog == nullptr) - throw WindowException("Error: Window is NULL"); - - pDialog->Reset(); - pDialog->SetMultiSelection(true); - pDialog->SetHeading(CVariant{heading}); - - for (const auto& option : options) - pDialog->Add(option); - - if (autoclose > 0) - pDialog->SetAutoClose(autoclose); - - pDialog->Open(); - - if (pDialog->IsConfirmed()) - return std::unique_ptr>(new std::vector(pDialog->GetSelectedItems())); - else - return std::unique_ptr>(); - } - bool Dialog::ok(const String& heading, const String& line1, const String& line2, const String& line3) { DelayedCallGuard dcguard(languageHook); - CGUIDialogOK* pDialog = (CGUIDialogOK*)g_windowManager.GetWindow(WINDOW_DIALOG_OK); + const int window = WINDOW_DIALOG_OK; + + CGUIDialogOK* pDialog = (CGUIDialogOK*)g_windowManager.GetWindow(window); if (pDialog == NULL) throw WindowException("Error: Window is NULL, this is not possible :-)"); if (!heading.empty()) - pDialog->SetHeading(CVariant{heading}); + pDialog->SetHeading(heading); if (!line1.empty()) - pDialog->SetLine(0, CVariant{line1}); + pDialog->SetLine(0, line1); if (!line2.empty()) - pDialog->SetLine(1, CVariant{line2}); + pDialog->SetLine(1, line2); if (!line3.empty()) - pDialog->SetLine(2, CVariant{line3}); + pDialog->SetLine(2, line3); - pDialog->Open(); + //send message and wait for user input + XBMCWaitForThreadMessage(TMSG_DIALOG_DOMODAL, window, ACTIVE_WINDOW); return pDialog->IsConfirmed(); } - void Dialog::textviewer(const String& heading, const String& text) - { - DelayedCallGuard dcguard(languageHook); - const int window = WINDOW_DIALOG_TEXT_VIEWER; - - CGUIDialogTextViewer* pDialog = (CGUIDialogTextViewer*)g_windowManager.GetWindow(window); - if (pDialog == NULL) - throw WindowException("Error: Window is NULL, this is not possible :-)"); - if (!heading.empty()) - pDialog->SetHeading(heading); - if (!text.empty()) - pDialog->SetText(text); - pDialog->Open(); - } - - Alternative > Dialog::browse(int type, const String& heading, const String& s_shares, const String& maskparam, bool useThumbs, bool useFileDirectories, const String& defaultt, @@ -193,7 +159,7 @@ DelayedCallGuard dcguard(languageHook); std::string value; std::string mask = maskparam; - VECSOURCES *shares = CMediaSourceSettings::GetInstance().GetSources(s_shares); + VECSOURCES *shares = CMediaSourceSettings::Get().GetSources(s_shares); if (!shares) throw WindowException("Error: GetSources given %s is NULL.",s_shares.c_str()); @@ -215,7 +181,7 @@ bool useFileDirectories, const String& defaultt ) { DelayedCallGuard dcguard(languageHook); - VECSOURCES *shares = CMediaSourceSettings::GetInstance().GetSources(s_shares); + VECSOURCES *shares = CMediaSourceSettings::Get().GetSources(s_shares); std::vector valuelist; String lmask = mask; if (!shares) @@ -320,7 +286,7 @@ case INPUT_ALPHANUM: { bool bHiddenInput = (option & ALPHANUM_HIDE_INPUT) == ALPHANUM_HIDE_INPUT; - if (!CGUIKeyboardFactory::ShowAndGetInput(value, CVariant{heading}, true, bHiddenInput, autoclose)) + if (!CGUIKeyboardFactory::ShowAndGetInput(value, heading, true, bHiddenInput, autoclose)) value = emptyString; } break; @@ -412,16 +378,16 @@ dlg = pDialog; open = true; - pDialog->SetHeading(CVariant{heading}); + pDialog->SetHeading(heading); if (!line1.empty()) - pDialog->SetLine(0, CVariant{line1}); + pDialog->SetLine(0, line1); if (!line2.empty()) - pDialog->SetLine(1, CVariant{line2}); + pDialog->SetLine(1, line2); if (!line3.empty()) - pDialog->SetLine(2, CVariant{line3}); + pDialog->SetLine(2, line3); - pDialog->Open(); + pDialog->StartModal(); } void DialogProgress::update(int percent, const String& line1, @@ -445,11 +411,11 @@ } if (!line1.empty()) - pDialog->SetLine(0, CVariant{line1}); + pDialog->SetLine(0, line1); if (!line2.empty()) - pDialog->SetLine(1, CVariant{line2}); + pDialog->SetLine(1, line2); if (!line3.empty()) - pDialog->SetLine(2, CVariant{line3}); + pDialog->SetLine(2, line3); } void DialogProgress::close() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Dialog.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Dialog.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Dialog.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Dialog.h 2015-10-19 08:39:16.000000000 +0000 @@ -93,21 +93,6 @@ int select(const String& heading, const std::vector& list, int autoclose=0); /** - * multiselect(heading, list [,autoclose]) -- Show a multi-select dialog. - * - * heading : string or unicode - dialog heading. - * options : list of string - options to choose from. - * autoclose : [opt] integer - milliseconds to autoclose dialog. (default=do not autoclose) - * - * *Note, Returns the selected items as a list of indices, or None if cancelled. - * - * example: - * - dialog = xbmcgui.Dialog() - * - ret = dialog.multiselect("Choose something", ["Foo", "Bar", "Baz"]) - */ - std::unique_ptr > multiselect(const String& heading, const std::vector& options, int autoclose=0); - - /** * ok(heading, line1[, line2, line3]) -- Show a dialog 'OK'.\n * \n * heading : string or unicode - dialog heading.\n @@ -127,19 +112,6 @@ const String& line3 = emptyString); /** - * textviewer(heading, text) -- Show a dialog 'TextViewer'.\n - * \n - * heading : string or unicode - dialog heading.\n - * text : string or unicode - text.\n - * \n - * example:\n - * - dialog = xbmcgui.Dialog()\n - * - dialog.textviewer('Plot', 'Some movie plot.')n\n - */ - void textviewer(const String& heading, const String& text); - - - /** * browse(type, heading, shares[, mask, useThumbs, treatAsFolder, default, enableMultiple]) -- Show a 'Browse' dialog.\n * \n * type : integer - the type of browse dialog.\n diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/InfoTagMusic.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/InfoTagMusic.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/InfoTagMusic.cpp 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/InfoTagMusic.cpp 2014-12-18 01:01:57.000000000 +0000 @@ -54,12 +54,12 @@ String InfoTagMusic::getArtist() { - return infoTag->GetArtistString(); + return StringUtils::Join(infoTag->GetArtist(), g_advancedSettings.m_musicItemSeparator); } String InfoTagMusic::getAlbumArtist() { - return infoTag->GetAlbumArtistString(); + return StringUtils::Join(infoTag->GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator); } String InfoTagMusic::getAlbum() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/InfoTagRadioRDS.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/InfoTagRadioRDS.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/InfoTagRadioRDS.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/InfoTagRadioRDS.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,248 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "InfoTagRadioRDS.h" -#include "utils/StringUtils.h" - -namespace XBMCAddon -{ - namespace xbmc - { - InfoTagRadioRDS::InfoTagRadioRDS() - { - PVR::CPVRRadioRDSInfoTagPtr empty; - infoTag = empty; - } - - InfoTagRadioRDS::InfoTagRadioRDS(const PVR::CPVRRadioRDSInfoTagPtr tag) - { - infoTag = tag; - } - - InfoTagRadioRDS::~InfoTagRadioRDS() - { - } - - String InfoTagRadioRDS::getTitle() - { - if (infoTag) - return infoTag->GetTitle(); - return ""; - } - - String InfoTagRadioRDS::getBand() - { - if (infoTag) - return infoTag->GetBand(); - return ""; - } - - String InfoTagRadioRDS::getArtist() - { - if (infoTag) - return infoTag->GetArtist(); - return ""; - } - - String InfoTagRadioRDS::getComposer() - { - if (infoTag) - return infoTag->GetComposer(); - return ""; - } - - String InfoTagRadioRDS::getConductor() - { - if (infoTag) - return infoTag->GetConductor(); - return ""; - } - - String InfoTagRadioRDS::getAlbum() - { - if (infoTag) - return infoTag->GetAlbum(); - return ""; - } - - String InfoTagRadioRDS::getComment() - { - if (infoTag) - return infoTag->GetComment(); - return ""; - } - - int InfoTagRadioRDS::getAlbumTrackNumber() - { - if (infoTag) - return infoTag->GetAlbumTrackNumber(); - return 0; - } - - String InfoTagRadioRDS::getInfoNews() - { - if (infoTag) - return infoTag->GetInfoNews(); - return ""; - } - - String InfoTagRadioRDS::getInfoNewsLocal() - { - if (infoTag) - return infoTag->GetInfoNewsLocal(); - return ""; - } - - String InfoTagRadioRDS::getInfoSport() - { - if (infoTag) - return infoTag->GetInfoSport(); - return ""; - } - - String InfoTagRadioRDS::getInfoStock() - { - if (infoTag) - return infoTag->GetInfoStock(); - return ""; - } - - String InfoTagRadioRDS::getInfoWeather() - { - if (infoTag) - return infoTag->GetInfoWeather(); - return ""; - } - - String InfoTagRadioRDS::getInfoHoroscope() - { - if (infoTag) - return infoTag->GetInfoHoroscope(); - return ""; - } - - String InfoTagRadioRDS::getInfoCinema() - { - if (infoTag) - return infoTag->GetInfoCinema(); - return ""; - } - - String InfoTagRadioRDS::getInfoLottery() - { - if (infoTag) - return infoTag->GetInfoLottery(); - return ""; - } - - String InfoTagRadioRDS::getInfoOther() - { - if (infoTag) - return infoTag->GetInfoOther(); - return ""; - } - - String InfoTagRadioRDS::getEditorialStaff() - { - if (infoTag) - return infoTag->GetEditorialStaff(); - return ""; - } - - String InfoTagRadioRDS::getProgStation() - { - if (infoTag) - return infoTag->GetProgStation(); - return ""; - } - - String InfoTagRadioRDS::getProgStyle() - { - if (infoTag) - return infoTag->GetProgStyle(); - return ""; - } - - String InfoTagRadioRDS::getProgHost() - { - if (infoTag) - return infoTag->GetProgHost(); - return ""; - } - - String InfoTagRadioRDS::getProgWebsite() - { - if (infoTag) - return infoTag->GetProgWebsite(); - return ""; - } - - String InfoTagRadioRDS::getProgNow() - { - if (infoTag) - return infoTag->GetProgNow(); - return ""; - } - - String InfoTagRadioRDS::getProgNext() - { - if (infoTag) - return infoTag->GetProgNext(); - return ""; - } - - String InfoTagRadioRDS::getPhoneHotline() - { - if (infoTag) - return infoTag->GetPhoneHotline(); - return ""; - } - - String InfoTagRadioRDS::getEMailHotline() - { - if (infoTag) - return infoTag->GetEMailHotline(); - return ""; - } - - String InfoTagRadioRDS::getPhoneStudio() - { - if (infoTag) - return infoTag->GetPhoneStudio(); - return ""; - } - - String InfoTagRadioRDS::getEMailStudio() - { - if (infoTag) - return infoTag->GetEMailStudio(); - return ""; - } - - String InfoTagRadioRDS::getSMSStudio() - { - if (infoTag) - return infoTag->GetSMSStudio(); - return ""; - } - - } -} - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/InfoTagRadioRDS.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/InfoTagRadioRDS.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/InfoTagRadioRDS.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/InfoTagRadioRDS.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "pvr/channels/PVRRadioRDSInfoTag.h" -#include "AddonClass.h" - -#pragma once - -namespace XBMCAddon -{ - namespace xbmc - { - /** - * InfoTagRadioRDS class.\n - */ - class InfoTagRadioRDS : public AddonClass - { - private: - PVR::CPVRRadioRDSInfoTagPtr infoTag; - - public: -#ifndef SWIG - InfoTagRadioRDS(const PVR::CPVRRadioRDSInfoTagPtr tag); -#endif - InfoTagRadioRDS(); - virtual ~InfoTagRadioRDS(); - - /** - * getTitle() -- returns a string.\n - */ - String getTitle(); - /** - * getBand() -- returns a string.\n - */ - String getBand(); - /** - * getArtist() -- returns a string.\n - */ - String getArtist(); - /** - * getComposer() -- returns a string.\n - */ - String getComposer(); - /** - * getConductor() -- returns a string.\n - */ - String getConductor(); - /** - * getAlbum() -- returns a string.\n - */ - String getAlbum(); - /** - * getComment() -- returns a string.\n - */ - String getComment(); - /** - * getAlbumTrackNumber() -- returns a integer.\n - */ - int getAlbumTrackNumber(); - /** - * getInfoNews() -- returns an string.\n - */ - String getInfoNews(); - /** - * getInfoNewsLocal() -- returns a string.\n - */ - String getInfoNewsLocal(); - /** - * getInfoSport() -- returns a string.\n - */ - String getInfoSport(); - /** - * getInfoStock() -- returns a string.\n - */ - String getInfoStock(); - /** - * getInfoWeather() -- returns a string.\n - */ - String getInfoWeather(); - /** - * getInfoHoroscope() -- returns a string.\n - */ - String getInfoHoroscope(); - /** - * getInfoCinema() -- returns a string.\n - */ - String getInfoCinema(); - /** - * getInfoLottery() -- returns a string.\n - */ - String getInfoLottery(); - /** - * getInfoOther() -- returns a string.\n - */ - String getInfoOther(); - /** - * getEditorialStaff() -- returns a string.\n - */ - String getEditorialStaff(); - /** - * getProgStation() -- returns a string.\n - */ - String getProgStation(); - /** - * getProgStyle() -- returns a string.\n - */ - String getProgStyle(); - /** - * getProgHost() -- returns a string.\n - */ - String getProgHost(); - /** - * getProgWebsite() -- returns a string.\n - */ - String getProgWebsite(); - /** - * getProgNow() -- returns a string.\n - */ - String getProgNow(); - /** - * getProgNext() -- returns a string.\n - */ - String getProgNext(); - /** - * getPhoneHotline() -- returns a string.\n - */ - String getPhoneHotline(); - /** - * getEMailHotline() -- returns a string.\n - */ - String getEMailHotline(); - /** - * getPhoneStudio() -- returns a string.\n - */ - String getPhoneStudio(); - /** - * getEMailStudio() -- returns a string.\n - */ - String getEMailStudio(); - /** - * getSMSStudio() -- returns a string.\n - */ - String getSMSStudio(); - - }; - } -} - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Keyboard.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Keyboard.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Keyboard.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Keyboard.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,10 +22,6 @@ #include "LanguageHook.h" #include "guilib/GUIKeyboardFactory.h" -#include "utils/Variant.h" -#include "messaging/ApplicationMessenger.h" - -using namespace KODI::MESSAGING; namespace XBMCAddon { @@ -45,7 +41,7 @@ // using keyboardfactory method to get native keyboard if there is. strText = strDefault; std::string text(strDefault); - bConfirmed = CGUIKeyboardFactory::ShowAndGetInput(text, CVariant{strHeading}, true, bHidden, autoclose * 1000); + bConfirmed = CGUIKeyboardFactory::ShowAndGetInput(text, strHeading, true, bHidden, autoclose * 1000); strText = text; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ListItem.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ListItem.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ListItem.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ListItem.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -139,10 +139,8 @@ { std::string artName = it->first; StringUtils::ToLower(artName); - if (artName == "icon") - item->SetIconImage(it->second); - else - item->SetArt(artName, it->second); + const std::string artFilename(it->second.c_str()); + item->SetArt(artName, artFilename); } } } @@ -236,12 +234,6 @@ item->SetMimeType(mimetype); } - void ListItem::setContentLookup(bool enable) - { - LOCKGUI; - item->SetContentLookup(enable); - } - String ListItem::getdescription() { return item->GetLabel(); @@ -298,8 +290,6 @@ item->m_iprogramCount = strtol(value.c_str(), NULL, 10); else if (key == "rating") item->GetVideoInfoTag()->m_fRating = (float)strtod(value.c_str(), NULL); - else if (key == "userrating") - item->GetVideoInfoTag()->m_iUserRating = strtol(value.c_str(), NULL, 10); else if (key == "size") item->m_dwSize = (int64_t)strtoll(value.c_str(), NULL, 10); else if (key == "watched") // backward compat - do we need it? @@ -406,12 +396,24 @@ } else if (key == "dateadded") item->GetVideoInfoTag()->m_dateAdded.SetFromDBDateTime(value.c_str()); - else if (key == "mediatype") + } + + // For backward compatibility. + // FIXME: Remove this behaviour. It should be possible to set only tvshowtitle without + // having mediatype implicitly changed. + if (item->GetVideoInfoTag()->m_type == MediaTypeNone) + { + if (!item->GetVideoInfoTag()->m_strShowTitle.empty() && item->GetVideoInfoTag()->m_iSeason == -1) { - if (MediaTypes::IsValidMediaType(value)) - item->GetVideoInfoTag()->m_type = value; - else - CLog::Log(LOGWARNING, "Invalid media type \"%s\"", value.c_str()); + item->GetVideoInfoTag()->m_type = MediaTypeTvShow; + } + else if (item->GetVideoInfoTag()->m_iSeason > -1) + { + item->GetVideoInfoTag()->m_type = MediaTypeEpisode; + } + else if (!item->GetVideoInfoTag()->m_artist.empty()) + { + item->GetVideoInfoTag()->m_type = MediaTypeMusicVideo; } } } @@ -451,7 +453,7 @@ else if (key == "title") item->GetMusicInfoTag()->SetTitle(value); else if (key == "rating") - item->GetMusicInfoTag()->SetUserrating(value[0]); + item->GetMusicInfoTag()->SetRating(value[0]); else if (key == "lyrics") item->GetMusicInfoTag()->SetLyrics(value); else if (key == "lastplayed") diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ListItem.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ListItem.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ListItem.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ListItem.h 2015-10-19 08:39:16.000000000 +0000 @@ -52,15 +52,6 @@ // If it's a list of items then the items can be either a String or a Tuple. typedef Dictionary InfoLabelDict; - /** - * ListItem([label, label2, iconImage, thumbnailImage, path])\n - * \n - * label : [opt] string - * label2 : [opt] string - * iconImage : Deprecated. Use setArt - * thumbnailImage : Deprecated. Use setArt - * path : [opt] string - */ class ListItem : public AddonClass { public: @@ -124,12 +115,22 @@ void setLabel2(const String& label); /** - * Deprecated. Use setArt + * setIconImage(icon) -- Sets the listitem's icon image.\n + * \n + * icon : string - image filename.\n + * \n + * example: + * - self.list.getSelectedItem().setIconImage('emailread.png') */ void setIconImage(const String& iconImage); /** - * Deprecated. Use setArt + * setThumbnailImage(thumbFilename) -- Sets the listitem's thumbnail image.\n + * \n + * thumb : string - image filename.\n + * \n + * example: + * - self.list.getSelectedItem().setThumbnailImage('emailread.png') */ void setThumbnailImage(const String& thumbFilename); @@ -146,7 +147,6 @@ * - clearart : string - image filename * - clearlogo : string - image filename * - landscape : string - image filename - * - icon : string - image filename * * example: * - self.list.getSelectedItem().setArt({ 'poster': 'poster.png', 'banner' : 'banner.png' }) @@ -196,7 +196,6 @@ * - top250 : integer (192) * - tracknumber : integer (3) * - rating : float (6.4) - range is 0..10 - * - userrating : integer (9) - range is 1..10 * - watched : depreciated - use playcount instead * - playcount : integer (2) - number of times this item has been played * - overlay : integer (2) - range is 0..8. See GUIListItem.h for values @@ -225,7 +224,6 @@ * - votes : string (12345 votes) * - trailer : string (/home/user/trailer.avi) * - dateadded : string (%Y-%m-%d %h:%m:%s = 2009-04-05 23:16:04) - * - mediatype : string - "video", "movie", "tvshow", "season", "episode" or "musicvideo" * - Music Values: * - tracknumber : integer (8) * - discnumber : integer (2) @@ -342,21 +340,11 @@ * \n * mimetype : string or unicode - mimetype.\n * \n - * If known prehand, this can (but does not have to) avoid HEAD requests - * being sent to HTTP servers to figure out file type.\n + * *If known prehand, this can avoid Kodi doing HEAD requests to http servers to figure out file type.\n */ void setMimeType(const String& mimetype); /** - * setContentLookup(enable) -- Enable or disable content lookup for item. - * - * If disabled, HEAD requests to e.g determine mime type will not be sent. - * - * enable : bool - */ - void setContentLookup(bool enable); - - /** * setSubtitles() -- Sets subtitles for this listitem.\n * * example: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Makefile kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Makefile 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -10,7 +10,6 @@ Dialog.cpp \ File.cpp \ InfoTagMusic.cpp \ - InfoTagRadioRDS.cpp \ InfoTagVideo.cpp \ Keyboard.cpp \ LanguageHook.cpp \ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmc.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmc.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmc.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmc.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -28,8 +28,7 @@ #include "ModuleXbmc.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" -#include "utils/URIUtils.h" +#include "ApplicationMessenger.h" #include "aojsonrpc.h" #ifndef TARGET_WINDOWS #include "XTimeUtils.h" @@ -61,8 +60,6 @@ #include #include "utils/log.h" -using namespace KODI::MESSAGING; - namespace XBMCAddon { @@ -82,13 +79,15 @@ void shutdown() { XBMC_TRACE; - CApplicationMessenger::GetInstance().PostMsg(TMSG_SHUTDOWN); + ThreadMessage tMsg = {TMSG_SHUTDOWN}; + CApplicationMessenger::Get().SendMessage(tMsg); } void restart() { XBMC_TRACE; - CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTART); + ThreadMessage tMsg = {TMSG_RESTART}; + CApplicationMessenger::Get().SendMessage(tMsg); } void executescript(const char* script) @@ -97,7 +96,9 @@ if (! script) return; - CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_SCRIPT, -1, -1, nullptr, script); + ThreadMessage tMsg = {TMSG_EXECUTE_SCRIPT}; + tMsg.strParam = script; + CApplicationMessenger::Get().SendMessage(tMsg); } void executebuiltin(const char* function, bool wait /* = false*/) @@ -105,10 +106,7 @@ XBMC_TRACE; if (! function) return; - if (wait) - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, function); - else - CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, function); + CApplicationMessenger::Get().ExecBuiltIn(function,wait); } String executeJSONRPC(const char* jsonrpccommand) @@ -170,7 +168,7 @@ String getSkinDir() { XBMC_TRACE; - return CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKIN); + return CSettings::Get().GetString("lookandfeel.skin"); } String getLanguage(int format /* = CLangCodeExpander::ENGLISH_NAME */, bool region /*= false*/) @@ -368,7 +366,7 @@ XBMC_TRACE; Crc32 crc; crc.ComputeFromLowerCase(path); - return StringUtils::Format("%08x.tbn", (unsigned __int32)crc); + return StringUtils::Format("%08x.tbn", (unsigned __int32)crc);; } String makeLegalFilename(const String& filename, bool fatX) @@ -420,13 +418,6 @@ result = g_langInfo.GetDateFormat(false); StringUtils::Replace(result, "MM", "%m"); StringUtils::Replace(result, "DD", "%d"); -#ifdef TARGET_WINDOWS - StringUtils::Replace(result, "M", "%#m"); - StringUtils::Replace(result, "D", "%#d"); -#else - StringUtils::Replace(result, "M", "%-m"); - StringUtils::Replace(result, "D", "%-d"); -#endif StringUtils::Replace(result, "YYYY", "%Y"); } else if (strcmpi(id, "tempunit") == 0) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmcgui.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmcgui.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmcgui.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmcgui.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,6 +22,7 @@ #include "LanguageHook.h" #include "guilib/GraphicContext.h" #include "guilib/GUIWindowManager.h" +#include "utils/log.h" #define NOTIFICATION_INFO "info" #define NOTIFICATION_WARNING "warning" @@ -31,6 +32,16 @@ { namespace xbmcgui { + void lock() + { + CLog::Log(LOGWARNING,"'xbmcgui.lock()' is deprecated and serves no purpose anymore, it will be removed in future releases"); + } + + void unlock() + { + CLog::Log(LOGWARNING,"'xbmcgui.unlock()' is deprecated and serves no purpose anymore, it will be removed in future releases"); + } + long getCurrentWindowId() { DelayedCallGuard dg; @@ -44,7 +55,7 @@ CSingleLock gl(g_graphicsContext); return g_windowManager.GetTopMostModalDialogID(); } - + const char* getNOTIFICATION_INFO() { return NOTIFICATION_INFO; } const char* getNOTIFICATION_WARNING() { return NOTIFICATION_WARNING; } const char* getNOTIFICATION_ERROR() { return NOTIFICATION_ERROR; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmcgui.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmcgui.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmcgui.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmcgui.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,16 @@ namespace xbmcgui { /** + * lock() -- deprecated and serves no purpose anymore. + */ + void lock(); + + /** + * unlock() -- deprecated and serves no purpose anymore. + */ + void unlock(); + + /** * getCurrentWindowId() -- Returns the id for the current 'active' window as an integer. * * example: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmc.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmc.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmc.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmc.h 2015-10-19 08:38:33.000000000 +0000 @@ -50,7 +50,7 @@ * See pydocs for valid values for level.\n * * example: - * - xbmc.log(msg='This is a test string.', level=xbmc.LOGDEBUG); + * - xbmc.log(msg='This is a test string.', level=xbmc.LOGDEBUG)); */ void log(const char* msg, int level = lLOGNOTICE); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmcplugin.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmcplugin.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmcplugin.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmcplugin.h 2015-10-19 08:39:16.000000000 +0000 @@ -231,6 +231,5 @@ SWIG_CONSTANT(int,SORT_METHOD_PLAYCOUNT); SWIG_CONSTANT(int,SORT_METHOD_CHANNEL); SWIG_CONSTANT(int,SORT_METHOD_DATE_TAKEN); - SWIG_CONSTANT(int,SORT_METHOD_VIDEO_USER_RATING); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmcvfs.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmcvfs.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/ModuleXbmcvfs.cpp 2015-12-14 05:43:07.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/ModuleXbmcvfs.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,6 @@ #include "filesystem/Directory.h" #include "utils/FileUtils.h" #include "utils/URIUtils.h" -#include "URL.h" #include "Util.h" namespace XBMCAddon @@ -57,7 +56,7 @@ { DelayedCallGuard dg; if (URIUtils::HasSlashAtEnd(path, true)) - return XFILE::CDirectory::Exists(path, false); + return XFILE::CDirectory::Exists(path); return XFILE::CFile::Exists(path, false); } @@ -101,11 +100,6 @@ { URIUtils::RemoveSlashAtEnd(itemPath); std::string strFileName = URIUtils::GetFileName(itemPath); - if (strFileName.empty()) - { - CURL url(itemPath); - strFileName = url.GetHostName(); - } ret.first().push_back(strFileName); } else // file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Player.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Player.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Player.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Player.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,14 +24,12 @@ #include "PlayListPlayer.h" #include "settings/MediaSettings.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "GUIInfoManager.h" #include "AddonUtils.h" #include "utils/log.h" #include "cores/IPlayer.h" -using namespace KODI::MESSAGING; - namespace XBMCAddon { namespace xbmc @@ -89,7 +87,7 @@ if (!item.empty()) { // set fullscreen or windowed - CMediaSettings::GetInstance().SetVideoStartWindowed(windowed); + CMediaSettings::Get().SetVideoStartWindowed(windowed); // force a playercore before playing g_application.m_eForcedNextPlayer = playerCore; @@ -100,13 +98,12 @@ { // set m_strPath to the passed url listitem->item->SetPath(item.c_str()); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast(new CFileItem(*listitem->item))); + CApplicationMessenger::Get().PlayFile((const CFileItem)(*(listitem->item)), false); } else { - CFileItemList *l = new CFileItemList; //don't delete, - l->Add(std::make_shared(item, false)); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l)); + CFileItem nextitem(item, false); + CApplicationMessenger::Get().MediaPlay(nextitem.GetPath()); } } else @@ -118,7 +115,7 @@ XBMC_TRACE; DelayedCallGuard dc(languageHook); // set fullscreen or windowed - CMediaSettings::GetInstance().SetVideoStartWindowed(windowed); + CMediaSettings::Get().SetVideoStartWindowed(windowed); // force a playercore before playing g_application.m_eForcedNextPlayer = playerCore; @@ -126,7 +123,7 @@ // play current file in playlist if (g_playlistPlayer.GetCurrentPlaylist() != iPlayList) g_playlistPlayer.SetCurrentPlaylist(iPlayList); - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_PLAY, g_playlistPlayer.GetCurrentSong()); + CApplicationMessenger::Get().PlayListPlayerPlay(g_playlistPlayer.GetCurrentSong()); } void Player::playPlaylist(const PlayList* playlist, bool windowed, int startpos) @@ -136,7 +133,7 @@ if (playlist != NULL) { // set fullscreen or windowed - CMediaSettings::GetInstance().SetVideoStartWindowed(windowed); + CMediaSettings::Get().SetVideoStartWindowed(windowed); // force a playercore before playing g_application.m_eForcedNextPlayer = playerCore; @@ -146,7 +143,7 @@ g_playlistPlayer.SetCurrentPlaylist(iPlayList); if (startpos > -1) g_playlistPlayer.SetCurrentSong(startpos); - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_PLAY, startpos); + CApplicationMessenger::Get().PlayListPlayerPlay(startpos); } else playCurrent(windowed); @@ -155,13 +152,13 @@ void Player::stop() { XBMC_TRACE; - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); + CApplicationMessenger::Get().MediaStop(); } void Player::pause() { XBMC_TRACE; - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE); + CApplicationMessenger::Get().MediaPause(); } void Player::playnext() @@ -171,7 +168,7 @@ // force a playercore before playing g_application.m_eForcedNextPlayer = playerCore; - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_NEXT); + CApplicationMessenger::Get().PlayListPlayerNext(); } void Player::playprevious() @@ -181,7 +178,7 @@ // force a playercore before playing g_application.m_eForcedNextPlayer = playerCore; - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_PREV); + CApplicationMessenger::Get().PlayListPlayerPrevious(); } void Player::playselected(int selected) @@ -197,7 +194,7 @@ } g_playlistPlayer.SetCurrentSong(selected); - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_PLAY, selected); + CApplicationMessenger::Get().PlayListPlayerPlay(selected); //g_playlistPlayer.Play(selected); //CLog::Log(LOGNOTICE, "Current Song After Play: %i", g_playlistPlayer.GetCurrentSong()); } @@ -319,12 +316,6 @@ return g_application.m_pPlayer->IsPlayingVideo(); } - bool Player::isPlayingRDS() - { - XBMC_TRACE; - return g_application.m_pPlayer->IsPlayingRDS(); - } - String Player::getPlayingFile() { XBMC_TRACE; @@ -360,19 +351,6 @@ return new InfoTagMusic(); } - InfoTagRadioRDS* Player::getRadioRDSInfoTag() throw (PlayerException) - { - XBMC_TRACE; - if (g_application.m_pPlayer->IsPlayingVideo() || !g_application.m_pPlayer->IsPlayingRDS()) - throw PlayerException("XBMC is not playing any music file with RDS"); - - const PVR::CPVRRadioRDSInfoTagPtr tag = g_infoManager.GetCurrentRadioRDSInfoTag(); - if (tag) - return new InfoTagRadioRDS(tag); - - return new InfoTagRadioRDS(); - } - double Player::getTotalTime() { XBMC_TRACE; @@ -445,26 +423,26 @@ } } - std::vector Player::getAvailableSubtitleStreams() + std::vector* Player::getAvailableSubtitleStreams() { if (g_application.m_pPlayer->HasPlayer()) { int subtitleCount = g_application.m_pPlayer->GetSubtitleCount(); - std::vector ret(subtitleCount); + std::vector* ret = new std::vector(subtitleCount); for (int iStream=0; iStream < subtitleCount; iStream++) { SPlayerSubtitleStreamInfo info; g_application.m_pPlayer->GetSubtitleStreamInfo(iStream, info); if (info.language.length() > 0) - ret[iStream] = info.language; + (*ret)[iStream] = info.language; else - ret[iStream] = info.name; + (*ret)[iStream] = info.name; } return ret; } - return std::vector(); + return NULL; } void Player::setSubtitleStream(int iStream) @@ -480,26 +458,26 @@ } } - std::vector Player::getAvailableAudioStreams() + std::vector* Player::getAvailableAudioStreams() { if (g_application.m_pPlayer->HasPlayer()) { int streamCount = g_application.m_pPlayer->GetAudioStreamCount(); - std::vector ret(streamCount); + std::vector* ret = new std::vector(streamCount); for (int iStream=0; iStream < streamCount; iStream++) { SPlayerAudioStreamInfo info; g_application.m_pPlayer->GetAudioStreamInfo(iStream, info); if (info.language.length() > 0) - ret[iStream] = info.language; + (*ret)[iStream] = info.language; else - ret[iStream] = info.name; + (*ret)[iStream] = info.name; } return ret; } - return std::vector(); + return NULL; } void Player::setAudioStream(int iStream) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Player.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Player.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Player.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Player.h 2015-10-19 08:39:16.000000000 +0000 @@ -28,7 +28,6 @@ #include "Exception.h" #include "AddonString.h" #include "InfoTagMusic.h" -#include "InfoTagRadioRDS.h" #include "AddonCallback.h" #include "Alternative.h" @@ -219,12 +218,6 @@ bool isPlayingVideo(); /** - * isPlayingRDS() -- returns True if xbmc is playing a radio data system (RDS). - */ - // Player_IsPlayingRDS - bool isPlayingRDS(); - - /** * getPlayingFile() -- returns the current playing file as a string.\n * Note: For LiveTV, returns a pvr:// url which is not translatable to an OS specific file or external url\n * \n @@ -284,7 +277,7 @@ /** * getAvailableSubtitleStreams() -- get Subtitle stream names */ - std::vector getAvailableSubtitleStreams(); + std::vector* getAvailableSubtitleStreams(); // Player_setSubtitleStream /** @@ -313,14 +306,6 @@ InfoTagMusic* getMusicInfoTag(); /** - * getRadioRDSInfoTag() -- returns the RadioRDSInfoTag of the current playing 'Radio Song if present'. - * - * Throws: Exception, if player is not playing a file or current file is not a rds file. - */ - // Player_GetRadioRDSInfoTag - InfoTagRadioRDS* getRadioRDSInfoTag() throw (PlayerException); - - /** * getTotalTime() -- Returns the total time of the current playing media in * seconds. This is only accurate to the full second. * @@ -332,7 +317,7 @@ /** * getAvailableAudioStreams() -- get Audio stream names */ - std::vector getAvailableAudioStreams(); + std::vector* getAvailableAudioStreams(); /** * setAudioStream(stream) -- set Audio Stream. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Window.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Window.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Window.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Window.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,12 +26,10 @@ #include "guilib/GUIRadioButtonControl.h" #include "guilib/GUIWindowManager.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "utils/Variant.h" #include "WindowException.h" -using namespace KODI::MESSAGING; - #define ACTIVE_WINDOW g_windowManager.GetActiveWindow() @@ -112,7 +110,7 @@ canPulse = true; existingWindow = false; - setWindow(new Interceptor("CGUIWindow",this,getNextAvailableWindowId())); + setWindow(new Interceptor("CGUIWindow",this,getNextAvailalbeWindowId())); } else { @@ -218,7 +216,7 @@ g_windowManager.Add(window->get()); } - int Window::getNextAvailableWindowId() + int Window::getNextAvailalbeWindowId() { XBMC_TRACE; // window id's 13000 - 13100 are reserved for python @@ -377,10 +375,10 @@ pControl->dwWidth = (int)pGUIControl->GetWidth(); pControl->dwPosX = (int)pGUIControl->GetXPosition(); pControl->dwPosY = (int)pGUIControl->GetYPosition(); - pControl->iControlUp = pGUIControl->GetAction(ACTION_MOVE_UP).GetNavigation(); - pControl->iControlDown = pGUIControl->GetAction(ACTION_MOVE_DOWN).GetNavigation(); - pControl->iControlLeft = pGUIControl->GetAction(ACTION_MOVE_LEFT).GetNavigation(); - pControl->iControlRight = pGUIControl->GetAction(ACTION_MOVE_RIGHT).GetNavigation(); + pControl->iControlUp = pGUIControl->GetNavigateAction(ACTION_MOVE_UP).GetNavigation(); + pControl->iControlDown = pGUIControl->GetNavigateAction(ACTION_MOVE_DOWN).GetNavigation(); + pControl->iControlLeft = pGUIControl->GetNavigateAction(ACTION_MOVE_LEFT).GetNavigation(); + pControl->iControlRight = pGUIControl->GetNavigateAction(ACTION_MOVE_RIGHT).GetNavigation(); // It got this far so means the control isn't actually in the vector of controls // so lets add it to save doing all that next time @@ -455,6 +453,20 @@ XBMC_TRACE; switch (message.GetMessage()) { + case GUI_MSG_WINDOW_DEINIT: + { + g_windowManager.ShowOverlay(ref(window)->OVERLAY_STATE_SHOWN); + } + break; + + case GUI_MSG_WINDOW_INIT: + { + ref(window)->OnMessage(message); + g_windowManager.ShowOverlay(ref(window)->OVERLAY_STATE_HIDDEN); + return true; + } + break; + case GUI_MSG_CLICKED: { int iControl=message.GetSenderId(); @@ -505,7 +517,8 @@ DelayedCallGuard dcguard(languageHook); popActiveWindowId(); - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTIVATE_WINDOW, iWindowId, 0); + std::vector params; + CApplicationMessenger::Get().ActivateWindow(iWindowId, params, false); } void Window::setFocus(Control* pControl) @@ -580,7 +593,7 @@ CGUIMessage msg(GUI_MSG_REMOVE_CONTROL, 0, 0); msg.SetPointer(pControl->pGUIControl); - CApplicationMessenger::GetInstance().SendGUIMessage(msg, iWindowId, wait); + CApplicationMessenger::Get().SendGUIMessage(msg, iWindowId, wait); // initialize control to zero pControl->pGUIControl = NULL; @@ -671,9 +684,10 @@ if (!existingWindow) PulseActionEvent(); + std::vector params; { DelayedCallGuard dcguard(languageHook); - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTIVATE_WINDOW, iOldWindowId, 0); + CApplicationMessenger::Get().ActivateWindow(iOldWindowId, params, false); } iOldWindowId = 0; @@ -750,10 +764,10 @@ pControl->iControlLeft = pControl->iControlId; pControl->iControlRight = pControl->iControlId; - pControl->pGUIControl->SetAction(ACTION_MOVE_UP, pControl->iControlUp); - pControl->pGUIControl->SetAction(ACTION_MOVE_DOWN, pControl->iControlDown); - pControl->pGUIControl->SetAction(ACTION_MOVE_LEFT, pControl->iControlLeft); - pControl->pGUIControl->SetAction(ACTION_MOVE_RIGHT, pControl->iControlRight); + pControl->pGUIControl->SetNavigationAction(ACTION_MOVE_UP, pControl->iControlUp); + pControl->pGUIControl->SetNavigationAction(ACTION_MOVE_DOWN, pControl->iControlDown); + pControl->pGUIControl->SetNavigationAction(ACTION_MOVE_LEFT, pControl->iControlLeft); + pControl->pGUIControl->SetNavigationAction(ACTION_MOVE_RIGHT, pControl->iControlRight); // add control to list and allocate recources for the control vecControls.push_back(AddonClass::Ref(pControl)); @@ -762,7 +776,7 @@ // This calls the CGUIWindow parent class to do the final add CGUIMessage msg(GUI_MSG_ADD_CONTROL, 0, 0); msg.SetPointer(pControl->pGUIControl); - CApplicationMessenger::GetInstance().SendGUIMessage(msg, iWindowId, wait); + CApplicationMessenger::Get().SendGUIMessage(msg, iWindowId, wait); } void Window::addControls(std::vector pControls) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/WindowDialog.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/WindowDialog.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/WindowDialog.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/WindowDialog.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,9 +32,9 @@ Window(true), WindowDialogMixin(this) { CSingleLock lock(g_graphicsContext); - InterceptorBase* interceptor = new Interceptor("CGUIWindow", this, getNextAvailableWindowId()); + InterceptorBase* interceptor = new Interceptor("CGUIWindow", this, getNextAvailalbeWindowId()); // set the render order to the dialog's default because this dialog is mapped to CGUIWindow instead of CGUIDialog - interceptor->SetRenderOrder(RENDER_ORDER_DIALOG); + interceptor->SetRenderOrder(RenderOrder::DIALOG); setWindow(interceptor); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/WindowDialogMixin.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/WindowDialogMixin.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/WindowDialogMixin.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/WindowDialogMixin.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,11 +21,9 @@ #include "WindowDialogMixin.h" #include "WindowInterceptor.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "guilib/GUIWindowManager.h" -using namespace KODI::MESSAGING; - namespace XBMCAddon { namespace xbmcgui @@ -33,7 +31,9 @@ void WindowDialogMixin::show() { XBMC_TRACE; - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_PYTHON_DIALOG, HACK_CUSTOM_ACTION_OPENING, 0, static_cast(w->window->get())); + ThreadMessage tMsg = {TMSG_GUI_PYTHON_DIALOG, HACK_CUSTOM_ACTION_OPENING, 0}; + tMsg.lpVoid = w->window->get(); + CApplicationMessenger::Get().SendMessage(tMsg, true); } void WindowDialogMixin::close() @@ -42,7 +42,9 @@ w->bModal = false; w->PulseActionEvent(); - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_PYTHON_DIALOG, HACK_CUSTOM_ACTION_CLOSING, 0, static_cast(w->window->get())); + ThreadMessage tMsg = {TMSG_GUI_PYTHON_DIALOG, HACK_CUSTOM_ACTION_CLOSING, 0}; + tMsg.lpVoid = w->window->get(); + CApplicationMessenger::Get().SendMessage(tMsg, true); w->iOldWindowId = 0; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Window.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Window.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/Window.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/Window.h 2015-10-19 08:39:16.000000000 +0000 @@ -31,6 +31,11 @@ { namespace xbmcgui { + enum RenderOrder { + WINDOW = 0, + DIALOG = 1 + }; + // Forward declare the interceptor as the AddonWindowInterceptor.h // file needs to include the Window class because of the template class InterceptorBase; @@ -140,7 +145,7 @@ * This helper retrieves the next available id. It is assumed * that the global lock is already being held. */ - static int getNextAvailableWindowId(); + static int getNextAvailalbeWindowId(); /** * Child classes MUST call this in their constructors. It should diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/WindowXML.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/WindowXML.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/WindowXML.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/WindowXML.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -142,16 +142,16 @@ m_scriptPath = scriptPath; // sXMLFileName = strSkinPath; - interceptor = new WindowXMLInterceptor(this, lockingGetNextAvailableWindowId(),strSkinPath.c_str()); + interceptor = new WindowXMLInterceptor(this, lockingGetNextAvailalbeWindowId(),strSkinPath.c_str()); setWindow(interceptor); interceptor->SetCoordsRes(res); } - int WindowXML::lockingGetNextAvailableWindowId() + int WindowXML::lockingGetNextAvailalbeWindowId() { XBMC_TRACE; CSingleLock lock(g_graphicsContext); - return getNextAvailableWindowId(); + return getNextAvailalbeWindowId(); } void WindowXML::addItem(const Alternative& item, int position) @@ -473,8 +473,12 @@ { XBMC_TRACE; if (message.GetMessage() == GUI_MSG_WINDOW_DEINIT) + { + CGUIWindow *pWindow = g_windowManager.GetWindow(g_windowManager.GetActiveWindow()); + if (pWindow) + g_windowManager.ShowOverlay(pWindow->GetOverlayState()); return A(CGUIWindow::OnMessage(message)); - + } return WindowXML::OnMessage(message); } @@ -499,8 +503,8 @@ // Set the render order to the dialog's default in case it's not specified in the skin xml // because this dialog is mapped to CGUIMediaWindow instead of CGUIDialog. // This must be done here, because the render order will be reset before loading the skin xml. - if (ref(window)->GetRenderOrder() == RENDER_ORDER_WINDOW) - window->SetRenderOrder(RENDER_ORDER_DIALOG); + if (ref(window)->GetRenderOrder() == RenderOrder::WINDOW) + window->SetRenderOrder(RenderOrder::DIALOG); return true; } return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/WindowXML.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/WindowXML.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/WindowXML.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/WindowXML.h 2015-10-19 08:39:16.000000000 +0000 @@ -61,7 +61,7 @@ * This helper retrieves the next available id. It is doesn't * assume that the global lock is already being held. */ - static int lockingGetNextAvailableWindowId(); + static int lockingGetNextAvailalbeWindowId(); WindowXMLInterceptor* interceptor; #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/wsgi/WsgiResponse.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/wsgi/WsgiResponse.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/legacy/wsgi/WsgiResponse.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/legacy/wsgi/WsgiResponse.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,13 +19,9 @@ */ #include "WsgiResponse.h" - -#include - #include "utils/log.h" #include "utils/StringUtils.h" - namespace XBMCAddon { namespace xbmcwsgi diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/interfaces/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/Makefile.in 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/Makefile.in 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ SRCS = AnnouncementManager.cpp +SRCS += Builtins.cpp LIB = interfaces.a diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/AddonPythonInvoker.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/AddonPythonInvoker.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/AddonPythonInvoker.cpp 2015-11-04 04:00:19.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/AddonPythonInvoker.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,8 +29,6 @@ #include "system.h" #include "AddonPythonInvoker.h" -#include - #define MODULE "xbmc" #define RUNSCRIPT_PRAMBLE \ @@ -38,7 +36,7 @@ "import " MODULE "\n" \ "xbmc.abortRequested = False\n" \ "class xbmcout:\n" \ - " def __init__(self, loglevel=" MODULE ".LOGDEBUG):\n" \ + " def __init__(self, loglevel=" MODULE ".LOGNOTICE):\n" \ " self.ll=loglevel\n" \ " def write(self, data):\n" \ " " MODULE ".log(data,self.ll)\n" \ @@ -88,6 +86,7 @@ void initModule_xbmcvfs(void); } +using namespace std; using namespace PythonBindings; typedef struct @@ -120,7 +119,7 @@ if (modules.empty()) { for (size_t i = 0; i < PythonModulesSize; i++) - modules.insert(std::make_pair(PythonModules[i].name, PythonModules[i].initialization)); + modules.insert(make_pair(PythonModules[i].name, PythonModules[i].initialization)); } return modules; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/PythonInvoker.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/PythonInvoker.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/PythonInvoker.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/PythonInvoker.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,7 +29,7 @@ #include "system.h" #include "PythonInvoker.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "addons/AddonManager.h" #include "dialogs/GUIDialogKaiToast.h" #include "filesystem/File.h" @@ -65,8 +65,8 @@ // Time before ill-behaved scripts are terminated #define PYTHON_SCRIPT_TIMEOUT 5000 // ms +using namespace std; using namespace XFILE; -using namespace KODI::MESSAGING; extern "C" { @@ -202,7 +202,7 @@ "modules installed to python path as fallback. This behaviour will be removed in future " "version.", GetId()); ADDON::VECADDONS addons; - ADDON::CAddonMgr::GetInstance().GetAddons(ADDON::ADDON_SCRIPT_MODULE, addons); + ADDON::CAddonMgr::Get().GetAddons(ADDON::ADDON_SCRIPT_MODULE, addons); for (unsigned int i = 0; i < addons.size(); ++i) addPath(CSpecialProtocol::TranslatePath(addons[i]->LibPath())); } @@ -477,7 +477,7 @@ if (g_application.IsCurrentThread()) { CSingleExit ex(g_graphicsContext); - CApplicationMessenger::GetInstance().ProcessMessages(); + CApplicationMessenger::Get().ProcessMessages(); } } @@ -629,7 +629,7 @@ { //Check if dependency is a module addon ADDON::AddonPtr dependency; - if (ADDON::CAddonMgr::GetInstance().GetAddon(it->first, dependency, ADDON::ADDON_SCRIPT_MODULE)) + if (ADDON::CAddonMgr::Get().GetAddon(it->first, dependency, ADDON::ADDON_SCRIPT_MODULE)) { std::string path = CSpecialProtocol::TranslatePath(dependency->LibPath()); if (paths.find(path) == paths.end()) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/PythonSwig.cpp.template kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/PythonSwig.cpp.template --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/PythonSwig.cpp.template 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/PythonSwig.cpp.template 2015-10-19 08:39:16.000000000 +0000 @@ -67,8 +67,7 @@ 'std::string' : new File('typemaps/python.string.outtm'), 'p.q(const).char' : '${result} = PyString_FromString(${api});', (Pattern.compile('''(p.){0,1}XbmcCommons::Buffer''')) : new File('typemaps/python.buffer.outtm'), - (Pattern.compile('''std::shared_ptr<\\(.*\\)>''')) : new File('typemaps/python.smart_ptr.outtm'), - (Pattern.compile('''std::unique_ptr<\\(.*\\)>''')) : new File('typemaps/python.smart_ptr.outtm'), + (Pattern.compile('''boost::shared_ptr<\\(.*\\)>''')) : new File('typemaps/python.boost_shared_ptr.outtm'), (Pattern.compile('''(p.){0,1}std::vector<\\(.*\\)>''')) : new File('typemaps/python.vector.outtm'), (Pattern.compile('''(p.){0,1}Tuple<\\(.*\\)>''')) : new File('typemaps/python.Tuple.outtm'), (Pattern.compile('''(p.){0,1}Alternative<\\(.*\\)>''')) : new File('typemaps/python.Alternative.outtm') @@ -940,7 +939,7 @@ // constants PyModule_AddStringConstant(module, (char*)"__author__", (char*)"Team Kodi "); PyModule_AddStringConstant(module, (char*)"__date__", (char*)"${new Date().toString()}"); - PyModule_AddStringConstant(module, (char*)"__version__", (char*)"2.24.0"); + PyModule_AddStringConstant(module, (char*)"__version__", (char*)"2.20.0"); PyModule_AddStringConstant(module, (char*)"__credits__", (char*)"Team Kodi"); PyModule_AddStringConstant(module, (char*)"__platform__", (char*)"ALL"); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/swig.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/swig.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/swig.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/swig.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -196,29 +196,18 @@ PyObject *tracebackModule = PyImport_ImportModule("traceback"); if (tracebackModule != NULL) { - char method[] = "format_exception"; - char format[] = "OOO"; - PyObject *tbList = PyObject_CallMethod(tracebackModule, method, format, exc_type, exc_value == NULL ? Py_None : exc_value, exc_traceback == NULL ? Py_None : exc_traceback); - - if (tbList) - { - PyObject *emptyString = PyString_FromString(""); - char method[] = "join"; - char format[] = "O"; - PyObject *strRetval = PyObject_CallMethod(emptyString, method, format, tbList); - Py_DECREF(emptyString); - - if (strRetval) - { - str = PyString_AsString(strRetval); - if (str != NULL) - exceptionTraceback = str; - Py_DECREF(strRetval); - } - Py_DECREF(tbList); - } + PyObject *tbList = PyObject_CallMethod(tracebackModule, "format_exception", "OOO", exc_type, exc_value == NULL ? Py_None : exc_value, exc_traceback == NULL ? Py_None : exc_traceback); + PyObject *emptyString = PyString_FromString(""); + PyObject *strRetval = PyObject_CallMethod(emptyString, "join", "O", tbList); + + str = PyString_AsString(strRetval); + if (str != NULL) + exceptionTraceback = str; + + Py_DECREF(tbList); + Py_DECREF(emptyString); + Py_DECREF(strRetval); Py_DECREF(tracebackModule); - } } @@ -373,7 +362,7 @@ return (PyObject*)self; } - std::map typeInfoLookup; + std::map typeInfoLookup; void registerAddonClassTypeInformation(const TypeInfo* classInfo) { @@ -382,7 +371,7 @@ const TypeInfo* getTypeInfoForInstance(XBMCAddon::AddonClass* obj) { - std::type_index ti(typeid(*obj)); + XbmcCommons::type_index ti(typeid(*obj)); return typeInfoLookup[ti]; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/swig.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/swig.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/swig.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/swig.h 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,8 @@ #include "interfaces/legacy/Exception.h" #include "interfaces/legacy/AddonClass.h" #include "interfaces/legacy/Window.h" -#include + +#include "commons/typeindex.h" namespace PythonBindings { @@ -50,7 +51,7 @@ const char* swigType; TypeInfo* parentType; PyTypeObject pythonType; - const std::type_index typeIndex; + const XbmcCommons::type_index typeIndex; TypeInfo(const std::type_info& ti); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/typemaps/python.boost_shared_ptr.outtm kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/typemaps/python.boost_shared_ptr.outtm --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/typemaps/python.boost_shared_ptr.outtm 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/typemaps/python.boost_shared_ptr.outtm 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,26 @@ +<% +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + itype = swigTypeParser.SwigType_templateparmlist(type)[0] + pointertype = swigTypeParser.SwigType_makepointer(itype) + int seq = sequence.increment() +%> + ${swigTypeParser.SwigType_str(swigTypeParser.SwigType_ltype(pointertype))} entry${seq} = ${api}.get(); + ${helper.getOutConversion(pointertype,'result',method,[ 'api' : 'entry' + seq, 'sequence' : sequence ])} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/typemaps/python.smart_ptr.outtm kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/typemaps/python.smart_ptr.outtm --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/typemaps/python.smart_ptr.outtm 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/typemaps/python.smart_ptr.outtm 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -<% -/* - * Copyright (C) 2005-2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - itype = swigTypeParser.SwigType_templateparmlist(type)[0] - pointertype = swigTypeParser.SwigType_makepointer(itype) - int seq = sequence.increment() -%> - ${swigTypeParser.SwigType_str(swigTypeParser.SwigType_ltype(pointertype))} entry${seq} = ${api}.get(); - ${helper.getOutConversion(pointertype,'result',method,[ 'api' : 'entry' + seq, 'sequence' : sequence ])} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/typemaps/python.vector.outtm kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/typemaps/python.vector.outtm --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/typemaps/python.vector.outtm 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/typemaps/python.vector.outtm 2015-10-19 08:39:16.000000000 +0000 @@ -23,15 +23,15 @@ boolean ispointer = swigTypeParser.SwigType_ispointer(type) String accessor = ispointer ? '->' : '.' seq = sequence.increment() - +%> + ${result} = PyList_New(0); +<% if (ispointer) { %> if (${api} != NULL) { <% } %> - ${result} = PyList_New(0); - for (std::vector<${swigTypeParser.SwigType_str(vectype)}>::iterator iter = ${api}${accessor}begin(); iter != ${api}${accessor}end(); ++iter) { ${swigTypeParser.SwigType_str(swigTypeParser.SwigType_ltype(vectype))}& entry${seq} = *iter; @@ -45,4 +45,4 @@ { %> } -<% } %> +<% } %> \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/XBPython.cpp kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/XBPython.cpp --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/XBPython.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/XBPython.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -35,7 +35,6 @@ #include "filesystem/SpecialProtocol.h" #include "utils/JSONVariantWriter.h" #include "utils/log.h" -#include "utils/Variant.h" #include "Util.h" #ifdef TARGET_WINDOWS #include "utils/Environment.h" @@ -63,13 +62,13 @@ m_vecPlayerCallbackList.clear(); m_vecMonitorCallbackList.clear(); - CAnnouncementManager::GetInstance().AddAnnouncer(this); + CAnnouncementManager::Get().AddAnnouncer(this); } XBPython::~XBPython() { XBMC_TRACE; - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); } #define LOCK_AND_COPY(type, dest, src) \ @@ -490,7 +489,7 @@ // don't handle any more announcements as most scripts are probably already // stopped and executing a callback on one of their already destroyed classes // would lead to a crash - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); LOCK_AND_COPY(std::vector,tmpvec,m_vecPyList); m_vecPyList.clear(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/XBPython.h kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/XBPython.h --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/python/XBPython.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/python/XBPython.h 2015-10-19 08:39:16.000000000 +0000 @@ -31,7 +31,6 @@ #include class CPythonInvoker; -class CVariant; typedef struct { int id; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/interfaces/swig/AddonModuleXbmc.i kodi-15.2~git20151019.1039-final/xbmc/interfaces/swig/AddonModuleXbmc.i --- kodi-16.1~git20160425.1001-final/xbmc/interfaces/swig/AddonModuleXbmc.i 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/interfaces/swig/AddonModuleXbmc.i 2015-10-19 08:39:16.000000000 +0000 @@ -58,7 +58,6 @@ %include "interfaces/legacy/RenderCapture.h" %include "interfaces/legacy/InfoTagMusic.h" -%include "interfaces/legacy/InfoTagRadioRDS.h" %include "interfaces/legacy/InfoTagVideo.h" %include "interfaces/legacy/Keyboard.h" %include "interfaces/legacy/PlayList.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/LangInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/LangInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/LangInfo.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/LangInfo.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -19,34 +19,30 @@ */ #include "LangInfo.h" - -#include - +#include "Application.h" +#include "ApplicationMessenger.h" #include "addons/AddonInstaller.h" #include "addons/AddonManager.h" #include "addons/LanguageResource.h" -#include "addons/RepositoryUpdater.h" -#include "Application.h" -#include "FileItem.h" #include "guilib/LocalizeStrings.h" -#include "messaging/ApplicationMessenger.h" #include "pvr/PVRManager.h" #include "settings/AdvancedSettings.h" #include "settings/lib/Setting.h" #include "settings/Settings.h" -#include "Util.h" #include "utils/CharsetConverter.h" -#include "utils/LangCodeExpander.h" #include "utils/log.h" +#include "utils/LangCodeExpander.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "utils/Weather.h" #include "utils/XBMCTinyXML.h" #include "utils/XMLUtils.h" +#include +#include +using namespace std; using namespace PVR; -using namespace KODI::MESSAGING; static std::string shortDateFormats[] = { // short date formats using "/" @@ -158,6 +154,11 @@ return StringUtils::Format(g_localizeStrings.Get(20036).c_str(), time.GetAsLocalizedTime(timeFormat, true).c_str(), timeFormat.c_str()); } +static std::string ToSettingTimeFormat(const CDateTime& time, bool use24HourClock, bool singleHour, bool meridiem) +{ + return ToSettingTimeFormat(time, ToTimeFormat(use24HourClock, singleHour, meridiem)); +} + static CTemperature::Unit StringToTemperatureUnit(const std::string& temperatureUnit) { std::string unit(temperatureUnit); @@ -263,14 +264,7 @@ std::string strLocale; if (m_strRegionLocaleName.length() > 0) { -#ifdef TARGET_WINDOWS - std::string strLang, strRegion; - g_LangCodeExpander.ConvertToISO6391(m_strLangLocaleName, strLang); - g_LangCodeExpander.ConvertToISO6391(m_strRegionLocaleName, strRegion); - strLocale = strLang + "-" + strRegion; -#else strLocale = m_strLangLocaleName + "_" + m_strRegionLocaleName; -#endif #ifdef TARGET_POSIX strLocale += ".UTF-8"; #endif @@ -293,23 +287,23 @@ setlocale(LC_CTYPE, strLocale.c_str()); } #else - std::locale current_locale = std::locale::classic(); // C-Locale + locale current_locale = locale::classic(); // C-Locale try { - std::locale lcl = std::locale(strLocale.c_str()); + locale lcl = locale(strLocale.c_str()); strLocale = lcl.name(); - current_locale = current_locale.combine< std::collate >(lcl); - current_locale = current_locale.combine< std::ctype >(lcl); + current_locale = current_locale.combine< collate >(lcl); + current_locale = current_locale.combine< ctype >(lcl); - assert(std::use_facet< std::numpunct >(current_locale).decimal_point() == '.'); + assert(use_facet< numpunct >(current_locale).decimal_point() == '.'); } catch(...) { - current_locale = std::locale::classic(); + current_locale = locale::classic(); strLocale = "C"; } g_langInfo.m_systemLocale = current_locale; // TODO: move to CLangInfo class - std::locale::global(current_locale); + locale::global(current_locale); #endif g_charsetConverter.resetSystemCharset(); CLog::Log(LOGINFO, "global locale set to %s", strLocale.c_str()); @@ -336,52 +330,52 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_LOCALE_AUDIOLANGUAGE) + if (settingId == "locale.audiolanguage") SetAudioLanguage(((CSettingString*)setting)->GetValue()); - else if (settingId == CSettings::SETTING_LOCALE_SUBTITLELANGUAGE) + else if (settingId == "locale.subtitlelanguage") SetSubtitleLanguage(((CSettingString*)setting)->GetValue()); - else if (settingId == CSettings::SETTING_LOCALE_LANGUAGE) + else if (settingId == "locale.language") { if (!SetLanguage(((CSettingString*)setting)->GetValue())) - ((CSettingString*)CSettings::GetInstance().GetSetting(CSettings::SETTING_LOCALE_LANGUAGE))->Reset(); + ((CSettingString*)CSettings::Get().GetSetting("locale.language"))->Reset(); } - else if (settingId == CSettings::SETTING_LOCALE_COUNTRY) + else if (settingId == "locale.country") SetCurrentRegion(((CSettingString*)setting)->GetValue()); - else if (settingId == CSettings::SETTING_LOCALE_SHORTDATEFORMAT) + else if (settingId == "locale.shortdateformat") SetShortDateFormat(((CSettingString*)setting)->GetValue()); - else if (settingId == CSettings::SETTING_LOCALE_LONGDATEFORMAT) + else if (settingId == "locale.longdateformat") SetLongDateFormat(((CSettingString*)setting)->GetValue()); - else if (settingId == CSettings::SETTING_LOCALE_TIMEFORMAT) + else if (settingId == "locale.timeformat") SetTimeFormat(((CSettingString*)setting)->GetValue()); - else if (settingId == CSettings::SETTING_LOCALE_USE24HOURCLOCK) + else if (settingId == "locale.use24hourclock") { Set24HourClock(((CSettingString*)setting)->GetValue()); // update the time format - CSettings::GetInstance().SetString(CSettings::SETTING_LOCALE_TIMEFORMAT, PrepareTimeFormat(GetTimeFormat(), m_use24HourClock)); + CSettings::Get().SetString("locale.timeformat", PrepareTimeFormat(GetTimeFormat(), m_use24HourClock)); } - else if (settingId == CSettings::SETTING_LOCALE_TEMPERATUREUNIT) + else if (settingId == "locale.temperatureunit") SetTemperatureUnit(((CSettingString*)setting)->GetValue()); - else if (settingId == CSettings::SETTING_LOCALE_SPEEDUNIT) + else if (settingId == "locale.speedunit") SetSpeedUnit(((CSettingString*)setting)->GetValue()); } void CLangInfo::OnSettingsLoaded() { // set the temperature and speed units based on the settings - SetShortDateFormat(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_SHORTDATEFORMAT)); - SetLongDateFormat(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_LONGDATEFORMAT)); - Set24HourClock(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_USE24HOURCLOCK)); - SetTimeFormat(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_TIMEFORMAT)); - SetTemperatureUnit(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_TEMPERATUREUNIT)); - SetSpeedUnit(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_SPEEDUNIT)); + SetShortDateFormat(CSettings::Get().GetString("locale.shortdateformat")); + SetLongDateFormat(CSettings::Get().GetString("locale.longdateformat")); + Set24HourClock(CSettings::Get().GetString("locale.use24hourclock")); + SetTimeFormat(CSettings::Get().GetString("locale.timeformat")); + SetTemperatureUnit(CSettings::Get().GetString("locale.temperatureunit")); + SetSpeedUnit(CSettings::Get().GetString("locale.speedunit")); } bool CLangInfo::Load(const std::string& strLanguage) { SetDefaults(); - std::string strFileName = GetLanguageInfoPath(strLanguage); + string strFileName = GetLanguageInfoPath(strLanguage); CXBMCTinyXML xmlDoc; if (!xmlDoc.LoadFile(strFileName)) @@ -498,7 +492,7 @@ pRegion=pRegion->NextSiblingElement("region"); } - const std::string& strName = CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_COUNTRY); + const std::string& strName = CSettings::Get().GetString("locale.country"); SetCurrentRegion(strName); } g_charsetConverter.reinitCharsetsFromSettings(); @@ -527,7 +521,7 @@ return URIUtils::AddFileToFolder(GetLanguagePath(language), "langinfo.xml"); } -void CLangInfo::LoadTokens(const TiXmlNode* pTokens, std::set& vecTokens) +void CLangInfo::LoadTokens(const TiXmlNode* pTokens, set& vecTokens) { if (pTokens && !pTokens->NoChildren()) { @@ -575,8 +569,8 @@ std::string CLangInfo::GetGuiCharSet() const { - CSettingString* charsetSetting = static_cast(CSettings::GetInstance().GetSetting(CSettings::SETTING_LOCALE_CHARSET)); - if (charsetSetting == NULL || charsetSetting->IsDefault()) + CSettingString* charsetSetting = static_cast(CSettings::Get().GetSetting("locale.charset")); + if (charsetSetting->IsDefault()) return m_strGuiCharSet; return charsetSetting->GetValue(); @@ -584,7 +578,7 @@ std::string CLangInfo::GetSubtitleCharSet() const { - CSettingString* charsetSetting = static_cast(CSettings::GetInstance().GetSetting(CSettings::SETTING_SUBTITLES_CHARSET)); + CSettingString* charsetSetting = static_cast(CSettings::Get().GetSetting("subtitles.charset")); if (charsetSetting->IsDefault()) return m_strSubtitleCharSet; @@ -599,10 +593,10 @@ std::string addonId = ADDON::CLanguageResource::GetAddonId(locale); if (addonId.empty()) - addonId = CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_LANGUAGE); + addonId = CSettings::Get().GetString("locale.language"); ADDON::AddonPtr addon; - if (ADDON::CAddonMgr::GetInstance().GetAddon(addonId, addon, ADDON::ADDON_RESOURCE_LANGUAGE, true) && addon != NULL) + if (ADDON::CAddonMgr::Get().GetAddon(addonId, addon, ADDON::ADDON_RESOURCE_LANGUAGE, true) && addon != NULL) return std::dynamic_pointer_cast(addon); return NULL; @@ -630,7 +624,7 @@ std::string language = strLanguage; if (language.empty()) { - language = CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_LANGUAGE); + language = CSettings::Get().GetString("locale.language"); if (language.empty()) { @@ -645,7 +639,7 @@ CLog::Log(LOGWARNING, "CLangInfo: unable to load language \"%s\". Trying to determine matching language addon...", language.c_str()); // we may have to fall back to the default language - std::string defaultLanguage = static_cast(CSettings::GetInstance().GetSetting(CSettings::SETTING_LOCALE_LANGUAGE))->GetDefault(); + std::string defaultLanguage = static_cast(CSettings::Get().GetSetting("locale.language"))->GetDefault(); std::string newLanguage = defaultLanguage; // try to determine a language addon matching the given language in name @@ -658,8 +652,7 @@ if (addondb.Open()) { // update the addon repositories to check if there's a matching language addon available for download - ADDON::CRepositoryUpdater::GetInstance().CheckForUpdates(); - ADDON::CRepositoryUpdater::GetInstance().Await(); + CAddonInstaller::Get().UpdateRepos(true, true); ADDON::VECADDONS languageAddons; if (addondb.GetAddons(languageAddons, ADDON::ADDON_RESOURCE_LANGUAGE) && !languageAddons.empty()) @@ -667,7 +660,7 @@ // try to get the proper language addon by its name from all available language addons if (ADDON::CLanguageResource::FindLanguageAddonByName(language, newLanguage, languageAddons)) { - if (CAddonInstaller::GetInstance().InstallOrUpdate(newLanguage, false, false)) + if (CAddonInstaller::Get().Install(newLanguage, true, "", false, false)) { CLog::Log(LOGINFO, "CLangInfo: successfully installed language addon \"%s\" matching current language \"%s\"", newLanguage.c_str(), language.c_str()); foundMatchingAddon = true; @@ -693,10 +686,10 @@ } } - if (!CSettings::GetInstance().SetString(CSettings::SETTING_LOCALE_LANGUAGE, newLanguage)) + if (!CSettings::Get().SetString("locale.language", newLanguage)) return false; - CSettings::GetInstance().Save(); + CSettings::Get().Save(); return true; } @@ -719,7 +712,7 @@ // also tell our weather and skin to reload as these are localized g_weatherManager.Refresh(); g_PVRManager.LocalizationChanged(); - CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "ReloadSkin"); + CApplicationMessenger::Get().ExecBuiltIn("ReloadSkin", false); } return true; @@ -929,7 +922,7 @@ } // Fills the array with the region names available for this language -void CLangInfo::GetRegionNames(std::vector& array) +void CLangInfo::GetRegionNames(vector& array) { for (ITMAPREGIONS it=m_regions.begin(); it!=m_regions.end(); ++it) { @@ -954,22 +947,22 @@ m_currentRegion->SetGlobalLocale(); - if (CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_SHORTDATEFORMAT) == SETTING_REGIONAL_DEFAULT) + if (CSettings::Get().GetString("locale.shortdateformat") == SETTING_REGIONAL_DEFAULT) SetShortDateFormat(m_currentRegion->m_strDateFormatShort); - if (CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_LONGDATEFORMAT) == SETTING_REGIONAL_DEFAULT) + if (CSettings::Get().GetString("locale.longdateformat") == SETTING_REGIONAL_DEFAULT) SetLongDateFormat(m_currentRegion->m_strDateFormatLong); - if (CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_USE24HOURCLOCK) == SETTING_REGIONAL_DEFAULT) + if (CSettings::Get().GetString("locale.use24hourclock") == SETTING_REGIONAL_DEFAULT) { Set24HourClock(m_currentRegion->m_strTimeFormat); // update the time format - SetTimeFormat(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_TIMEFORMAT)); + SetTimeFormat(CSettings::Get().GetString("locale.timeformat")); } - if (CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_TIMEFORMAT) == SETTING_REGIONAL_DEFAULT) + if (CSettings::Get().GetString("locale.timeformat") == SETTING_REGIONAL_DEFAULT) SetTimeFormat(m_currentRegion->m_strTimeFormat); - if (CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_TEMPERATUREUNIT) == SETTING_REGIONAL_DEFAULT) + if (CSettings::Get().GetString("locale.temperatureunit") == SETTING_REGIONAL_DEFAULT) SetTemperatureUnit(m_currentRegion->m_tempUnit); - if (CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_SPEEDUNIT) == SETTING_REGIONAL_DEFAULT) + if (CSettings::Get().GetString("locale.speedunit") == SETTING_REGIONAL_DEFAULT) SetSpeedUnit(m_currentRegion->m_speedUnit); } @@ -1122,7 +1115,7 @@ { // find languages... ADDON::VECADDONS addons; - if (!ADDON::CAddonMgr::GetInstance().GetAddons(ADDON::ADDON_RESOURCE_LANGUAGE, addons, true)) + if (!ADDON::CAddonMgr::Get().GetAddons(ADDON::ADDON_RESOURCE_LANGUAGE, addons, true)) return; for (ADDON::VECADDONS::const_iterator addon = addons.begin(); addon != addons.end(); ++addon) @@ -1134,49 +1127,38 @@ void CLangInfo::SettingOptionsISO6391LanguagesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) { // get a list of language names - std::vector languages = g_LangCodeExpander.GetLanguageNames(CLangCodeExpander::ISO_639_1, true); + vector languages = g_LangCodeExpander.GetLanguageNames(CLangCodeExpander::ISO_639_1, true); sort(languages.begin(), languages.end(), sortstringbyname()); for (std::vector::const_iterator language = languages.begin(); language != languages.end(); ++language) - list.push_back(std::make_pair(*language, *language)); -} - -void CLangInfo::SettingOptionsAudioStreamLanguagesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) -{ - list.push_back(make_pair(g_localizeStrings.Get(308), "original")); - list.push_back(make_pair(g_localizeStrings.Get(309), "default")); - - AddLanguages(list); + list.push_back(make_pair(*language, *language)); } -void CLangInfo::SettingOptionsSubtitleStreamLanguagesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) +void CLangInfo::SettingOptionsStreamLanguagesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) { - list.push_back(make_pair(g_localizeStrings.Get(231), "none")); - list.push_back(make_pair(g_localizeStrings.Get(13207), "forced_only")); list.push_back(make_pair(g_localizeStrings.Get(308), "original")); list.push_back(make_pair(g_localizeStrings.Get(309), "default")); - AddLanguages(list); -} - -void CLangInfo::SettingOptionsSubtitleDownloadlanguagesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) -{ - list.push_back(make_pair(g_localizeStrings.Get(308), "original")); - list.push_back(make_pair(g_localizeStrings.Get(309), "default")); + std::string dummy; + SettingOptionsISO6391LanguagesFiller(NULL, list, dummy, NULL); + SettingOptionsLanguageNamesFiller(NULL, list, dummy, NULL); - AddLanguages(list); + // convert the vector to a set and back again to remove duplicates + std::set> languages(list.begin(), list.end()); + list.assign(languages.begin(), languages.end()); + std::sort(list.begin(), list.end(), SortLanguage()); } void CLangInfo::SettingOptionsRegionsFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) { - std::vector regions; + vector regions; g_langInfo.GetRegionNames(regions); - std::sort(regions.begin(), regions.end(), sortstringbyname()); + sort(regions.begin(), regions.end(), sortstringbyname()); bool match = false; for (unsigned int i = 0; i < regions.size(); ++i) { std::string region = regions[i]; - list.push_back(std::make_pair(region, region)); + list.push_back(make_pair(region, region)); if (!match && region == ((CSettingString*)setting)->GetValue()) { @@ -1404,18 +1386,3 @@ if (!match && !list.empty()) current = list[0].second; } - -void CLangInfo::AddLanguages(std::vector< std::pair > &list) -{ - std::string dummy; - std::vector> languages; - SettingOptionsISO6391LanguagesFiller(NULL, languages, dummy, NULL); - SettingOptionsLanguageNamesFiller(NULL, languages, dummy, NULL); - - // convert the vector to a set to remove duplicates - std::set, SortLanguage> tmp( - languages.begin(), languages.end(), SortLanguage()); - - list.reserve(list.size() + tmp.size()); - list.insert(list.end(), tmp.begin(), tmp.end()); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/LangInfo.h kodi-15.2~git20151019.1039-final/xbmc/LangInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/LangInfo.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/LangInfo.h 2015-10-19 08:39:15.000000000 +0000 @@ -19,14 +19,6 @@ * */ -#include -#include -#include -#include -#include -#include -#include - #include "settings/lib/ISettingCallback.h" #include "settings/lib/ISettingsHandler.h" #include "utils/GlobalsHandling.h" @@ -34,6 +26,13 @@ #include "utils/Speed.h" #include "utils/Temperature.h" +#include +#include +#include +#include +#include +#include + #ifdef TARGET_WINDOWS #ifdef GetDateFormat #undef GetDateFormat @@ -64,10 +63,10 @@ virtual ~CLangInfo(); // implementation of ISettingCallback - virtual void OnSettingChanged(const CSetting *setting) override; + virtual void OnSettingChanged(const CSetting *setting); // implementation of ISettingsHandler - virtual void OnSettingsLoaded() override; + virtual void OnSettingsLoaded(); bool Load(const std::string& strLanguage); @@ -184,9 +183,7 @@ static void LoadTokens(const TiXmlNode* pTokens, std::set& vecTokens); static void SettingOptionsLanguageNamesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); - static void SettingOptionsAudioStreamLanguagesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); - static void SettingOptionsSubtitleStreamLanguagesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); - static void SettingOptionsSubtitleDownloadlanguagesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); + static void SettingOptionsStreamLanguagesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); static void SettingOptionsISO6391LanguagesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); static void SettingOptionsRegionsFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); static void SettingOptionsShortDateFormatsFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data); @@ -202,7 +199,6 @@ static bool DetermineUse24HourClockFromTimeFormat(const std::string& timeFormat); static bool DetermineUseMeridiemFromTimeFormat(const std::string& timeFormat); static std::string PrepareTimeFormat(const std::string& timeFormat, bool use24HourClock); - static void AddLanguages(std::vector< std::pair > &list); class CRegion { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/linux/DBusReserve.cpp kodi-15.2~git20151019.1039-final/xbmc/linux/DBusReserve.cpp --- kodi-16.1~git20160425.1001-final/xbmc/linux/DBusReserve.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/linux/DBusReserve.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,6 +27,8 @@ #include "utils/log.h" +using namespace std; + /* This implements the code to exclusively acquire * * a device on the system describe at: * * http://git.0pointer.de/?p=reserve.git;a=blob_plain;f=reserve.txt */ @@ -159,7 +161,7 @@ DBusError error; dbus_error_init (&error); - std::vector::iterator it = find(m_devs.begin(), m_devs.end(), device); + vector::iterator it = find(m_devs.begin(), m_devs.end(), device); if(it == m_devs.end()) { CLog::Log(LOGDEBUG, "CDBusReserve::ReleaseDevice(%s): device wasn't aquired here", device.c_str()); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/linux/DllBCM.h kodi-15.2~git20151019.1039-final/xbmc/linux/DllBCM.h --- kodi-16.1~git20160425.1001-final/xbmc/linux/DllBCM.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/linux/DllBCM.h 2015-10-19 08:39:16.000000000 +0000 @@ -48,9 +48,6 @@ virtual void bcm_host_init() = 0; virtual void bcm_host_deinit() = 0; virtual int32_t graphics_get_display_size( const uint16_t display_number, uint32_t *width, uint32_t *height) = 0; - virtual int vc_tv_power_off() = 0; - virtual int vc_tv_sdtv_power_on(SDTV_MODE_T mode, SDTV_OPTIONS_T *options) = 0; - virtual int vc_tv_hdmi_power_on_preferred() = 0; virtual int vc_tv_hdmi_power_on_best(uint32_t width, uint32_t height, uint32_t frame_rate, HDMI_INTERLACED_T scan_mode, EDID_MODE_MATCH_FLAG_T match_flags) = 0; virtual int vc_tv_hdmi_power_on_best_3d(uint32_t width, uint32_t height, uint32_t frame_rate, @@ -95,12 +92,6 @@ { return ::bcm_host_deinit(); }; virtual int32_t graphics_get_display_size( const uint16_t display_number, uint32_t *width, uint32_t *height) { return ::graphics_get_display_size(display_number, width, height); }; - virtual int vc_tv_power_off() - { return ::vc_tv_power_off(); } - virtual int vc_tv_sdtv_power_on(SDTV_MODE_T mode, SDTV_OPTIONS_T *options) - { return ::vc_tv_sdtv_power_on(mode, options); } - virtual int vc_tv_hdmi_power_on_preferred() - { return ::vc_tv_hdmi_power_on_preferred(); } virtual int vc_tv_hdmi_power_on_best(uint32_t width, uint32_t height, uint32_t frame_rate, HDMI_INTERLACED_T scan_mode, EDID_MODE_MATCH_FLAG_T match_flags) { return ::vc_tv_hdmi_power_on_best(width, height, frame_rate, scan_mode, match_flags); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/linux/LinuxTimezone.cpp kodi-15.2~git20151019.1039-final/xbmc/linux/LinuxTimezone.cpp --- kodi-16.1~git20160425.1001-final/xbmc/linux/LinuxTimezone.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/linux/LinuxTimezone.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -42,6 +42,8 @@ #include +using namespace std; + CLinuxTimezone::CLinuxTimezone() : m_IsDST(0) { char* line = NULL; @@ -78,13 +80,13 @@ if (m_timezonesByCountryCode.count(countryCode) == 0) { - std::vector timezones; + vector timezones; timezones.push_back(timezoneName); m_timezonesByCountryCode[countryCode] = timezones; } else { - std::vector& timezones = m_timezonesByCountryCode[countryCode]; + vector& timezones = m_timezonesByCountryCode[countryCode]; timezones.push_back(timezoneName); } @@ -157,13 +159,13 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_LOCALE_TIMEZONE) + if (settingId == "locale.timezone") { SetTimezone(((CSettingString*)setting)->GetValue()); CDateTime::ResetTimezoneBias(); } - else if (settingId == CSettings::SETTING_LOCALE_TIMEZONECOUNTRY) + else if (settingId == "locale.timezonecountry") { // nothing to do here. Changing locale.timezonecountry will trigger an // update of locale.timezone and automatically adjust its value @@ -173,16 +175,16 @@ void CLinuxTimezone::OnSettingsLoaded() { - SetTimezone(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_TIMEZONE)); + SetTimezone(CSettings::Get().GetString("locale.timezone")); CDateTime::ResetTimezoneBias(); } -std::vector CLinuxTimezone::GetCounties() +vector CLinuxTimezone::GetCounties() { return m_counties; } -std::vector CLinuxTimezone::GetTimezonesByCountry(const std::string& country) +vector CLinuxTimezone::GetTimezonesByCountry(const std::string& country) { return m_timezonesByCountryCode[m_countryByName[country]]; } @@ -202,6 +204,8 @@ bool use_timezone = true; #else bool use_timezone = false; + if (g_sysinfo.IsAppleTV2()) + use_timezone = true; #endif if (use_timezone) @@ -252,22 +256,22 @@ void CLinuxTimezone::SettingOptionsTimezoneCountriesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) { - std::vector countries = g_timezone.GetCounties(); + vector countries = g_timezone.GetCounties(); for (unsigned int i = 0; i < countries.size(); i++) - list.push_back(std::make_pair(countries[i], countries[i])); + list.push_back(make_pair(countries[i], countries[i])); } void CLinuxTimezone::SettingOptionsTimezonesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) { current = ((const CSettingString*)setting)->GetValue(); bool found = false; - std::vector timezones = g_timezone.GetTimezonesByCountry(CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_TIMEZONECOUNTRY)); + vector timezones = g_timezone.GetTimezonesByCountry(CSettings::Get().GetString("locale.timezonecountry")); for (unsigned int i = 0; i < timezones.size(); i++) { if (!found && StringUtils::EqualsNoCase(timezones[i], current)) found = true; - list.push_back(std::make_pair(timezones[i], timezones[i])); + list.push_back(make_pair(timezones[i], timezones[i])); } if (!found && timezones.size() > 0) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/linux/LinuxTimezone.h kodi-15.2~git20151019.1039-final/xbmc/linux/LinuxTimezone.h --- kodi-16.1~git20160425.1001-final/xbmc/linux/LinuxTimezone.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/linux/LinuxTimezone.h 2015-10-19 08:39:16.000000000 +0000 @@ -34,9 +34,9 @@ public: CLinuxTimezone(); - virtual void OnSettingChanged(const CSetting *setting) override; + virtual void OnSettingChanged(const CSetting *setting); - virtual void OnSettingsLoaded() override; + virtual void OnSettingsLoaded(); std::string GetOSConfiguredTimezone(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/linux/OMXClock.cpp kodi-15.2~git20151019.1039-final/xbmc/linux/OMXClock.cpp --- kodi-16.1~git20160425.1001-final/xbmc/linux/OMXClock.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/linux/OMXClock.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -512,7 +512,7 @@ if(lock) Lock(); // we only support resampling (and hence clock adjustment) in this mode - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK)) + if (CSettings::Get().GetBool("videoplayer.usedisplayasclock")) { m_speedAdjust = adjust; OMXSetSpeed(m_omx_speed, false, true); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/linux/RBP.cpp kodi-15.2~git20151019.1039-final/xbmc/linux/RBP.cpp --- kodi-16.1~git20160425.1001-final/xbmc/linux/RBP.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/linux/RBP.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -78,7 +78,7 @@ if (m_gpu_mem < 128) setenv("V3D_DOUBLE_BUFFER", "1", 1); - m_gui_resolution_limit = CSettings::GetInstance().GetInt("videoscreen.limitgui"); + m_gui_resolution_limit = CSettings::Get().GetInt("videoscreen.limitgui"); if (!m_gui_resolution_limit) m_gui_resolution_limit = m_gpu_mem < 128 ? 720:1080; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/listproviders/DirectoryProvider.cpp kodi-15.2~git20151019.1039-final/xbmc/listproviders/DirectoryProvider.cpp --- kodi-16.1~git20160425.1001-final/xbmc/listproviders/DirectoryProvider.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/listproviders/DirectoryProvider.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,43 +19,33 @@ */ #include "DirectoryProvider.h" - -#include -#include - -#include "FileItem.h" #include "filesystem/Directory.h" #include "filesystem/FavouritesDirectory.h" #include "guilib/GUIWindowManager.h" -#include "interfaces/AnnouncementManager.h" -#include "messaging/ApplicationMessenger.h" -#include "music/MusicThumbLoader.h" -#include "pictures/PictureThumbLoader.h" -#include "settings/Settings.h" -#include "threads/SingleLock.h" #include "utils/JobManager.h" -#include "utils/SortUtils.h" -#include "utils/URIUtils.h" -#include "utils/Variant.h" #include "utils/XMLUtils.h" +#include "utils/URIUtils.h" +#include "threads/SingleLock.h" +#include "FileItem.h" #include "video/VideoThumbLoader.h" +#include "music/MusicThumbLoader.h" +#include "pictures/PictureThumbLoader.h" +#include "interfaces/AnnouncementManager.h" +#include + +using namespace std; using namespace XFILE; using namespace ANNOUNCEMENT; -using namespace KODI::MESSAGING; class CDirectoryJob : public CJob { public: - CDirectoryJob(const std::string &url, SortDescription sort, int limit, int parentID) - : m_url(url), - m_sort(sort), - m_limit(limit), - m_parentID(parentID) - { } - virtual ~CDirectoryJob() { } + CDirectoryJob(const std::string &url, int limit, int parentID) + : m_url(url), m_limit(limit), m_parentID(parentID) {}; + virtual ~CDirectoryJob() {}; - virtual const char* GetType() const { return "directory"; } + virtual const char* GetType() const { return "directory"; }; virtual bool operator==(const CJob *job) const { if (strcmp(job->GetType(),GetType()) == 0) @@ -72,12 +62,8 @@ CFileItemList items; if (CDirectory::GetDirectory(m_url, items, "")) { - // sort the items if necessary - if (m_sort.sortBy != SortByNone) - items.Sort(m_sort); - // limit must not exceed the number of items - int limit = (m_limit == 0) ? items.Size() : std::min((int) m_limit, items.Size()); + int limit = (m_limit == 0) ? items.Size() : min((int) m_limit, items.Size()); // convert to CGUIStaticItem's and set visibility and targets m_items.reserve(limit); for (int i = 0; i < limit; i++) @@ -140,7 +126,6 @@ private: std::string m_url; std::string m_target; - SortDescription m_sort; unsigned int m_limit; int m_parentID; std::vector m_items; @@ -161,19 +146,9 @@ const char *target = element->Attribute("target"); if (target) m_target.SetLabel(target, "", parentID); - - const char *sortMethod = element->Attribute("sortby"); - if (sortMethod) - m_sortMethod.SetLabel(sortMethod, "", parentID); - - const char *sortOrder = element->Attribute("sortorder"); - if (sortOrder) - m_sortOrder.SetLabel(sortOrder, "", parentID); - const char *limit = element->Attribute("limit"); if (limit) m_limit.SetLabel(limit, "", parentID); - m_url.SetLabel(element->FirstChild()->ValueStr(), "", parentID); } } @@ -199,12 +174,11 @@ // update the URL & limit and fire off a new job if needed fireJob |= UpdateURL(); - fireJob |= UpdateSort(); fireJob |= UpdateLimit(); if (fireJob) FireJob(); - for (std::vector::iterator i = m_items.begin(); i != m_items.end(); ++i) + for (vector::iterator i = m_items.begin(); i != m_items.end(); ++i) changed |= (*i)->UpdateVisibility(m_parentID); return changed; // TODO: Also returned changed if properties are changed (if so, need to update scroll to letter). } @@ -239,11 +213,11 @@ } } -void CDirectoryProvider::Fetch(std::vector &items) const +void CDirectoryProvider::Fetch(vector &items) const { CSingleLock lock(m_section); items.clear(); - for (std::vector::const_iterator i = m_items.begin(); i != m_items.end(); ++i) + for (vector::const_iterator i = m_items.begin(); i != m_items.end(); ++i) { if ((*i)->IsVisible()) items.push_back(*i); @@ -264,8 +238,6 @@ m_currentTarget.clear(); m_currentUrl.clear(); m_itemTypes.clear(); - m_currentSort.sortBy = SortByNone; - m_currentSort.sortOrder = SortOrderAscending; m_currentLimit = 0; m_updateState = OK; RegisterListProvider(false); @@ -288,7 +260,7 @@ bool CDirectoryProvider::OnClick(const CGUIListItemPtr &item) { CFileItem fileItem(*std::static_pointer_cast(item)); - std::string target = fileItem.GetProperty("node.target").asString(); + string target = fileItem.GetProperty("node.target").asString(); if (target.empty()) target = m_currentTarget; if (target.empty()) @@ -296,7 +268,7 @@ if (fileItem.HasProperty("node.target_url")) fileItem.SetPath(fileItem.GetProperty("node.target_url").asString()); // grab the execute string - std::string execute = CFavouritesDirectory::GetExecutePath(fileItem, target); + string execute = CFavouritesDirectory::GetExecutePath(fileItem, target); if (!execute.empty()) { CGUIMessage message(GUI_MSG_EXECUTE, 0, 0); @@ -318,7 +290,7 @@ CSingleLock lock(m_section); if (m_jobID) CJobManager::GetInstance().CancelJob(m_jobID); - m_jobID = CJobManager::GetInstance().AddJob(new CDirectoryJob(m_currentUrl, m_currentSort, m_currentLimit, m_parentID), this); + m_jobID = CJobManager::GetInstance().AddJob(new CDirectoryJob(m_currentUrl, m_currentLimit, m_parentID), this); } void CDirectoryProvider::RegisterListProvider(bool hasLibraryContent) @@ -326,12 +298,12 @@ if (hasLibraryContent && !m_isAnnounced) { m_isAnnounced = true; - CAnnouncementManager::GetInstance().AddAnnouncer(this); + CAnnouncementManager::Get().AddAnnouncer(this); } else if (!hasLibraryContent && m_isAnnounced) { m_isAnnounced = false; - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); } } @@ -359,22 +331,3 @@ return true; } - -bool CDirectoryProvider::UpdateSort() -{ - SortBy sortMethod(SortUtils::SortMethodFromString(m_sortMethod.GetLabel(m_parentID, false))); - SortOrder sortOrder(SortUtils::SortOrderFromString(m_sortOrder.GetLabel(m_parentID, false))); - if (sortOrder == SortOrderNone) - sortOrder = SortOrderAscending; - - if (sortMethod == m_currentSort.sortBy && sortOrder == m_currentSort.sortOrder) - return false; - - m_currentSort.sortBy = sortMethod; - m_currentSort.sortOrder = sortOrder; - - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) - m_currentSort.sortAttributes = static_cast(m_currentSort.sortAttributes | SortAttributeIgnoreArticle); - - return true; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/listproviders/DirectoryProvider.h kodi-15.2~git20151019.1039-final/xbmc/listproviders/DirectoryProvider.h --- kodi-16.1~git20160425.1001-final/xbmc/listproviders/DirectoryProvider.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/listproviders/DirectoryProvider.h 2015-10-19 08:39:16.000000000 +0000 @@ -28,7 +28,6 @@ #include "interfaces/IAnnouncer.h" class TiXmlElement; -class CVariant; typedef enum { @@ -70,12 +69,9 @@ unsigned int m_jobID; CGUIInfoLabel m_url; CGUIInfoLabel m_target; - CGUIInfoLabel m_sortMethod; - CGUIInfoLabel m_sortOrder; CGUIInfoLabel m_limit; std::string m_currentUrl; std::string m_currentTarget; ///< \brief node.target property on the list as a whole - SortDescription m_currentSort; unsigned int m_currentLimit; std::vector m_items; std::vector m_itemTypes; @@ -85,5 +81,4 @@ void RegisterListProvider(bool hasLibraryContent); bool UpdateURL(); bool UpdateLimit(); - bool UpdateSort(); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/listproviders/StaticProvider.cpp kodi-15.2~git20151019.1039-final/xbmc/listproviders/StaticProvider.cpp --- kodi-16.1~git20160425.1001-final/xbmc/listproviders/StaticProvider.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/listproviders/StaticProvider.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,6 +22,8 @@ #include "utils/XMLUtils.h" #include "utils/TimeUtils.h" +using namespace std; + CStaticListProvider::CStaticListProvider(const TiXmlElement *element, int parentID) : IListProvider(parentID), m_defaultItem(-1), @@ -70,18 +72,18 @@ else if (CTimeUtils::GetFrameTime() - m_updateTime > 1000) { m_updateTime = CTimeUtils::GetFrameTime(); - for (std::vector::iterator i = m_items.begin(); i != m_items.end(); ++i) + for (vector::iterator i = m_items.begin(); i != m_items.end(); ++i) (*i)->UpdateProperties(m_parentID); } - for (std::vector::iterator i = m_items.begin(); i != m_items.end(); ++i) + for (vector::iterator i = m_items.begin(); i != m_items.end(); ++i) changed |= (*i)->UpdateVisibility(m_parentID); return changed; // TODO: Also returned changed if properties are changed (if so, need to update scroll to letter). } -void CStaticListProvider::Fetch(std::vector &items) const +void CStaticListProvider::Fetch(vector &items) const { items.clear(); - for (std::vector::const_iterator i = m_items.begin(); i != m_items.end(); ++i) + for (vector::const_iterator i = m_items.begin(); i != m_items.end(); ++i) { if ((*i)->IsVisible()) items.push_back(*i); @@ -99,7 +101,7 @@ if (m_defaultItem >= 0) { unsigned int offset = 0; - for (std::vector::const_iterator i = m_items.begin(); i != m_items.end(); ++i) + for (vector::const_iterator i = m_items.begin(); i != m_items.end(); ++i) { if ((*i)->IsVisible()) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/main/main.cpp kodi-15.2~git20151019.1039-final/xbmc/main/main.cpp --- kodi-16.1~git20160425.1001-final/xbmc/main/main.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/main/main.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -42,9 +42,6 @@ #endif #include "XbmcContext.h" -#ifdef __cplusplus -extern "C" -#endif int main(int argc, char* argv[]) { // set up some xbmc specific relationships @@ -73,8 +70,9 @@ setlocale(LC_NUMERIC, "C"); g_advancedSettings.Initialize(); +#ifndef TARGET_WINDOWS CAppParamParser appParamParser; - appParamParser.Parse(const_cast(argv), argc); - + appParamParser.Parse((const char **)argv, argc); +#endif return XBMC_Run(renderGUI); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/main/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/main/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/main/Makefile.in 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/main/Makefile.in 2015-10-19 08:39:16.000000000 +0000 @@ -1,7 +1,6 @@ -.SUFFIXES : .m .mm .cpp +.SUFFIXES : .m .mm SRCS = main.cpp -SRCS += posix/MessagePrinter.cpp ifeq ($(findstring osx,@ARCH@),osx) SRCS += osx/SDLMain.mm diff -Nru kodi-16.1~git20160425.1001-final/xbmc/main/osx/SDLMain.h kodi-15.2~git20151019.1039-final/xbmc/main/osx/SDLMain.h --- kodi-16.1~git20160425.1001-final/xbmc/main/osx/SDLMain.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/main/osx/SDLMain.h 2015-10-19 08:39:16.000000000 +0000 @@ -13,6 +13,6 @@ #import -@interface XBMCDelegate : NSObject +@interface XBMCDelegate : NSObject @end #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/main/osx/SDLMain.mm kodi-15.2~git20151019.1039-final/xbmc/main/osx/SDLMain.mm --- kodi-16.1~git20160425.1001-final/xbmc/main/osx/SDLMain.mm 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/main/osx/SDLMain.mm 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,7 @@ // and obj-c's typedef unsigned char BOOL #define BOOL XBMC_BOOL #import "PlatformDefs.h" -#import "messaging/ApplicationMessenger.h" +#import "ApplicationMessenger.h" #import "storage/osx/DarwinStorageProvider.h" #undef BOOL @@ -589,7 +589,7 @@ // Create XBMCDelegate and make it the app delegate xbmc_delegate = [[XBMCDelegate alloc] init]; - [[NSApplication sharedApplication] setDelegate:xbmc_delegate]; + [NSApp setDelegate:xbmc_delegate]; // Start the main event loop [NSApp run]; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/main/posix/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/main/posix/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/main/posix/Makefile.in 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/main/posix/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -.SUFFIXES : .cpp - -SRCS = MessagePrinter.cpp -LIB=MessagePrinter.a - -include @abs_top_srcdir@/Makefile.include --include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS))) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/main/posix/MessagePrinter.cpp kodi-15.2~git20151019.1039-final/xbmc/main/posix/MessagePrinter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/main/posix/MessagePrinter.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/main/posix/MessagePrinter.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/* -* Copyright (C) 2005-2015 Team XBMC -* http://xbmc.org -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include "MessagePrinter.h" -#include "CompileInfo.h" - -#include - -void CMessagePrinter::DisplayMessage(const std::string& message) -{ - fprintf(stdout, "%s\n", message.c_str()); -} - -void CMessagePrinter::DisplayWarning(const std::string& warning) -{ - fprintf(stderr, "%s\n", warning.c_str()); -} - -void CMessagePrinter::DisplayError(const std::string& error) -{ - fprintf(stderr,"%s\n", error.c_str()); -} - -void CMessagePrinter::DisplayHelpMessage(const std::vector>& help) -{ - //very crude implementation, pretty it up when possible - std::string message; - for (const auto& line : help) - { - message.append(line.first + "\t" + line.second + "\n"); - } - - fprintf(stdout, "%s\n", message.c_str()); -} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/main/posix/MessagePrinter.h kodi-15.2~git20151019.1039-final/xbmc/main/posix/MessagePrinter.h --- kodi-16.1~git20160425.1001-final/xbmc/main/posix/MessagePrinter.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/main/posix/MessagePrinter.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/* -* Copyright (C) 2005-2015 Team XBMC -* http://xbmc.org -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include -#include -#include - -class CMessagePrinter -{ -public: - - /*! \brief Display a normal message to the user during startup - * - * \param[in] message message to display - */ - static void DisplayMessage(const std::string& message); - - /*! \brief Display a warning message to the user during startup - * - * \param[in] warning warning to display - */ - static void DisplayWarning(const std::string& warning); - - /*! \brief Display an error message to the user during startup - * - * \param[in] error error to display - */ - static void DisplayError(const std::string& error); - - /*! \brief Display the help message with command line options available - * - * \param[in] help List of commands and explanations, - help.push_back(std::make_pair("--help", "this displays the help)) - */ - static void DisplayHelpMessage(const std::vector>& help); -}; \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/main/win32/MessagePrinter.cpp kodi-15.2~git20151019.1039-final/xbmc/main/win32/MessagePrinter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/main/win32/MessagePrinter.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/main/win32/MessagePrinter.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/* -* Copyright (C) 2005-2015 Team XBMC -* http://xbmc.org -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include "MessagePrinter.h" -#include "CompileInfo.h" - -#include - -void CMessagePrinter::DisplayMessage(const std::string& message) -{ - MessageBox(NULL, message.c_str(), CCompileInfo::GetAppName(), MB_OK | MB_ICONINFORMATION); -} - -void CMessagePrinter::DisplayWarning(const std::string& warning) -{ - MessageBox(NULL, warning.c_str(), CCompileInfo::GetAppName(), MB_OK | MB_ICONWARNING); -} - -void CMessagePrinter::DisplayError(const std::string& error) -{ - MessageBox(NULL, error.c_str(), CCompileInfo::GetAppName(), MB_OK | MB_ICONERROR); -} - -void CMessagePrinter::DisplayHelpMessage(const std::vector>& help) -{ - //very crude implementation, pretty it up when possible - std::string message; - for (const auto& line : help) - { - message.append(line.first + "\t" + line.second + "\r\n"); - } - - MessageBox(NULL, message.c_str(), CCompileInfo::GetAppName(), MB_OK | MB_ICONINFORMATION); -} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/main/win32/MessagePrinter.h kodi-15.2~git20151019.1039-final/xbmc/main/win32/MessagePrinter.h --- kodi-16.1~git20160425.1001-final/xbmc/main/win32/MessagePrinter.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/main/win32/MessagePrinter.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/* -* Copyright (C) 2005-2015 Team XBMC -* http://xbmc.org -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include -#include -#include - -class CMessagePrinter -{ -public: - - /*! \brief Display a normal message to the user during startup - * - * \param[in] message message to display - */ - static void DisplayMessage(const std::string& message); - - /*! \brief Display a warning message to the user during startup - * - * \param[in] warning warning to display - */ - static void DisplayWarning(const std::string& warning); - - /*! \brief Display an error message to the user during startup - * - * \param[in] error error to display - */ - static void DisplayError(const std::string& error); - - /*! \brief Display the help message with command line options available - * - * \param[in] help List of commands and explanations, - help.push_back(std::make_pair("--help", "this displays the help)) - */ - static void DisplayHelpMessage(const std::vector>& help); -}; \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/main/win32/WinMain.cpp kodi-15.2~git20151019.1039-final/xbmc/main/win32/WinMain.cpp --- kodi-16.1~git20160425.1001-final/xbmc/main/win32/WinMain.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/main/win32/WinMain.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2005-2013 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "CompileInfo.h" -#include "threads/Thread.h" -#include "threads/platform/win/Win32Exception.h" -#include "xbmc.h" -#include "utils/CPUInfo.h" -#include "utils/Environment.h" - -#include -#include - - -extern "C" int main(int argc, char* argv[]); - -// Minidump creation function -LONG WINAPI CreateMiniDump(EXCEPTION_POINTERS* pEp) -{ - win32_exception::write_stacktrace(pEp); - win32_exception::write_minidump(pEp); - return pEp->ExceptionRecord->ExceptionCode; -} - -//----------------------------------------------------------------------------- -// Name: WinMain() -// Desc: The application's entry point -//----------------------------------------------------------------------------- -INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR commandLine, INT) -{ - // this fixes crash if OPENSSL_CONF is set to existed openssl.cfg - // need to set it as soon as possible - CEnvironment::unsetenv("OPENSSL_CONF"); - - // Initializes CreateMiniDump to handle exceptions. - char ver[100]; - if (strlen(CCompileInfo::GetSuffix()) > 0) - sprintf_s(ver, "%d.%d-%s Git:%s", CCompileInfo::GetMajor(), - CCompileInfo::GetMinor(), CCompileInfo::GetSuffix(), CCompileInfo::GetSCMID()); - else - sprintf_s(ver, "%d.%d Git:%s", CCompileInfo::GetMajor(), - CCompileInfo::GetMinor(), CCompileInfo::GetSCMID()); - - win32_exception::set_version(std::string(ver)); - SetUnhandledExceptionFilter(CreateMiniDump); - - // check if Kodi is already running - std::string appName = CCompileInfo::GetAppName(); - CreateMutex(nullptr, FALSE, (appName + " Media Center").c_str()); - if (GetLastError() == ERROR_ALREADY_EXISTS) - { - HWND hwnd = FindWindow(appName.c_str(), appName.c_str()); - if (hwnd != NULL) - { - // switch to the running instance - ShowWindow(hwnd, SW_RESTORE); - SetForegroundWindow(hwnd); - } - return 0; - } - - if ((g_cpuInfo.GetCPUFeatures() & CPU_FEATURE_SSE2) == 0) - { - MessageBox(NULL, "No SSE2 support detected", (appName + ": Fatal Error").c_str(), MB_OK | MB_ICONERROR); - return 0; - } - - //Initialize COM - CoInitializeEx(nullptr, COINIT_MULTITHREADED); - - - int argc; - LPWSTR* argvW = CommandLineToArgvW(GetCommandLineW(), &argc); - - char** argv = new char*[argc]; - - for (int i = 0; i < argc; ++i) - { - int size = WideCharToMultiByte(CP_UTF8, 0, argvW[i], -1, nullptr, 0, nullptr, nullptr); - if (size > 0) - { - argv[i] = new char[size]; - int result = WideCharToMultiByte(CP_UTF8, 0, argvW[i], -1, argv[i], size, nullptr, nullptr); - } - } - - // Initialise Winsock - WSADATA wd; - WSAStartup(MAKEWORD(2, 2), &wd); - - // use 1 ms timer precision - like SDL initialization used to do - timeBeginPeriod(1); - -#ifndef _DEBUG - // we don't want to see the "no disc in drive" windows message box - SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); -#endif - - // Create and run the app - int status = main(argc, argv); - - for (int i = 0; i < argc; ++i) - delete[] argv[i]; - delete[] argv; - - // clear previously set timer resolution - timeEndPeriod(1); - - WSACleanup(); - CoUninitialize(); - - return status; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/Makefile.in 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/Makefile.in 2015-10-19 08:39:15.000000000 +0000 @@ -1,10 +1,10 @@ SRCS=Application.cpp \ + ApplicationMessenger.cpp \ ApplicationPlayer.cpp \ AppParamParser.cpp \ Autorun.cpp \ AutoSwitch.cpp \ BackgroundInfoLoader.cpp \ - ContextMenuItem.cpp \ ContextMenuManager.cpp \ CompileInfo.cpp \ CueDocument.cpp \ @@ -46,10 +46,10 @@ all: $(SRCS) $(LIB) CompileInfo.cpp: ../version.txt CompileInfo.cpp.in GitRevision - $(MAKE) -f gen-compileinfo.mk + make -f gen-compileinfo.mk GitRevision: - $(MAKE) -f gen-compileinfo.mk GitRevision + make -f gen-compileinfo.mk GitRevision include @abs_top_srcdir@/Makefile.include -include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS))) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/media/MediaType.cpp kodi-15.2~git20151019.1039-final/xbmc/media/MediaType.cpp --- kodi-16.1~git20160425.1001-final/xbmc/media/MediaType.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/media/MediaType.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,13 +19,9 @@ */ #include "MediaType.h" - -#include - #include "guilib/LocalizeStrings.h" #include "utils/StringUtils.h" - static std::map fillDefaultMediaTypes() { std::map mediaTypes; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/MediaSource.cpp kodi-15.2~git20151019.1039-final/xbmc/MediaSource.cpp --- kodi-16.1~git20160425.1001-final/xbmc/MediaSource.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/MediaSource.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -25,6 +25,7 @@ #include "utils/URIUtils.h" #include "utils/StringUtils.h" +using namespace std; using namespace XFILE; bool CMediaSource::IsWritable() const @@ -32,7 +33,7 @@ return CUtil::SupportsWriteFileOperations(strPath); } -void CMediaSource::FromNameAndPaths(const std::string &category, const std::string &name, const std::vector &paths) +void CMediaSource::FromNameAndPaths(const std::string &category, const std::string &name, const vector &paths) { vecPaths = paths; if (paths.size() == 0) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/messaging/ApplicationMessenger.cpp kodi-15.2~git20151019.1039-final/xbmc/messaging/ApplicationMessenger.cpp --- kodi-16.1~git20160425.1001-final/xbmc/messaging/ApplicationMessenger.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/messaging/ApplicationMessenger.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,275 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see - * . - * - */ - -#include "ApplicationMessenger.h" - -#include -#include - -#include "Application.h" -#include "guilib/GraphicContext.h" -#include "threads/SingleLock.h" - -namespace KODI -{ -namespace MESSAGING -{ - -CDelayedMessage::CDelayedMessage(ThreadMessage& msg, unsigned int delay) : CThread("DelayedMessage") -{ - m_msg = msg; - - m_delay = delay; -} - -void CDelayedMessage::Process() -{ - Sleep(m_delay); - - if (!m_bStop) - CApplicationMessenger::GetInstance().PostMsg(m_msg.dwMessage, m_msg.param1, m_msg.param1, m_msg.lpVoid, m_msg.strParam, m_msg.params); -} - - -CApplicationMessenger& CApplicationMessenger::GetInstance() -{ - static CApplicationMessenger appMessenger; - return appMessenger; -} - -CApplicationMessenger::CApplicationMessenger() -{ -} - -CApplicationMessenger::~CApplicationMessenger() -{ - Cleanup(); -} - -void CApplicationMessenger::Cleanup() -{ - CSingleLock lock (m_critSection); - - while (!m_vecMessages.empty()) - { - ThreadMessage* pMsg = m_vecMessages.front(); - - if (pMsg->waitEvent) - pMsg->waitEvent->Set(); - - delete pMsg; - m_vecMessages.pop(); - } - - while (!m_vecWindowMessages.empty()) - { - ThreadMessage* pMsg = m_vecWindowMessages.front(); - - if (pMsg->waitEvent) - pMsg->waitEvent->Set(); - - delete pMsg; - m_vecWindowMessages.pop(); - } -} - -int CApplicationMessenger::SendMsg(ThreadMessage&& message, bool wait) -{ - std::shared_ptr waitEvent; - std::shared_ptr result; - - if (wait) - { - //Initialize result here as it's not needed for posted messages - message.result = std::make_shared(-1); - // check that we're not being called from our application thread, else we'll be waiting - // forever! - if (!g_application.IsCurrentThread()) - { - message.waitEvent.reset(new CEvent(true)); - waitEvent = message.waitEvent; - result = message.result; - } - else - { - //OutputDebugString("Attempting to wait on a SendMessage() from our application thread will cause lockup!\n"); - //OutputDebugString("Sending immediately\n"); - ProcessMessage(&message); - return *message.result; - } - } - - - if (g_application.m_bStop) - return -1; - - ThreadMessage* msg = new ThreadMessage(std::move(message)); - - CSingleLock lock (m_critSection); - - if (msg->dwMessage == TMSG_GUI_MESSAGE) - m_vecWindowMessages.push(msg); - else - m_vecMessages.push(msg); - lock.Leave(); // this releases the lock on the vec of messages and - // allows the ProcessMessage to execute and therefore - // delete the message itself. Therefore any accesss - // of the message itself after this point consittutes - // a race condition (yarc - "yet another race condition") - // - if (waitEvent) // ... it just so happens we have a spare reference to the - // waitEvent ... just for such contingencies :) - { - // ensure the thread doesn't hold the graphics lock - CSingleExit exit(g_graphicsContext); - waitEvent->Wait(); - return *result; - } - - return -1; -} - -int CApplicationMessenger::SendMsg(uint32_t messageId) -{ - return SendMsg(ThreadMessage{ messageId }, true); -} - -int CApplicationMessenger::SendMsg(uint32_t messageId, int param1, int param2, void* payload) -{ - return SendMsg(ThreadMessage{ messageId, param1, param2, payload }, true); -} - -int CApplicationMessenger::SendMsg(uint32_t messageId, int param1, int param2, void* payload, std::string strParam) -{ - return SendMsg(ThreadMessage{ messageId, param1, param2, payload, strParam, std::vector{} }, true); -} - -int CApplicationMessenger::SendMsg(uint32_t messageId, int param1, int param2, void* payload, std::string strParam, std::vector params) -{ - return SendMsg(ThreadMessage{ messageId, param1, param2, payload, strParam, params }, true); -} - -void CApplicationMessenger::PostMsg(uint32_t messageId) -{ - SendMsg(ThreadMessage{ messageId }, false); -} - -void CApplicationMessenger::PostMsg(uint32_t messageId, int param1, int param2, void* payload) -{ - SendMsg(ThreadMessage{ messageId, param1, param2, payload }, false); -} - -void CApplicationMessenger::PostMsg(uint32_t messageId, int param1, int param2, void* payload, std::string strParam) -{ - SendMsg(ThreadMessage{ messageId, param1, param2, payload, strParam, std::vector{} }, false); -} - -void CApplicationMessenger::PostMsg(uint32_t messageId, int param1, int param2, void* payload, std::string strParam, std::vector params) -{ - SendMsg(ThreadMessage{ messageId, param1, param2, payload, strParam, params }, false); -} - -void CApplicationMessenger::ProcessMessages() -{ - // process threadmessages - CSingleLock lock (m_critSection); - while (!m_vecMessages.empty()) - { - ThreadMessage* pMsg = m_vecMessages.front(); - //first remove the message from the queue, else the message could be processed more then once - m_vecMessages.pop(); - - //Leave here as the message might make another - //thread call processmessages or sendmessage - - std::shared_ptr waitEvent = pMsg->waitEvent; - lock.Leave(); // <- see the large comment in SendMessage ^ - - ProcessMessage(pMsg); - - if (waitEvent) - waitEvent->Set(); - delete pMsg; - - lock.Enter(); - } -} - -void CApplicationMessenger::ProcessMessage(ThreadMessage *pMsg) -{ - //special case for this that we handle ourselves - if (pMsg->dwMessage == TMSG_CALLBACK) - { - ThreadMessageCallback *callback = static_cast(pMsg->lpVoid); - callback->callback(callback->userptr); - return; - } - - CSingleLock lock(m_critSection); - int mask = pMsg->dwMessage & TMSG_MASK_MESSAGE; - - auto target = m_mapTargets.at(mask); - if (target != nullptr) - { - CSingleExit exit(m_critSection); - target->OnApplicationMessage(pMsg); - } -} - -void CApplicationMessenger::ProcessWindowMessages() -{ - CSingleLock lock (m_critSection); - //message type is window, process window messages - while (!m_vecWindowMessages.empty()) - { - ThreadMessage* pMsg = m_vecWindowMessages.front(); - //first remove the message from the queue, else the message could be processed more then once - m_vecWindowMessages.pop(); - - // leave here in case we make more thread messages from this one - - std::shared_ptr waitEvent = pMsg->waitEvent; - lock.Leave(); // <- see the large comment in SendMessage ^ - - ProcessMessage(pMsg); - if (waitEvent) - waitEvent->Set(); - delete pMsg; - - lock.Enter(); - } -} - -void CApplicationMessenger::SendGUIMessage(const CGUIMessage &message, int windowID, bool waitResult) -{ - ThreadMessage tMsg(TMSG_GUI_MESSAGE); - tMsg.param1 = windowID == WINDOW_INVALID ? 0 : windowID; - tMsg.lpVoid = new CGUIMessage(message); - SendMsg(std::move(tMsg), waitResult); -} - -void CApplicationMessenger::RegisterReceiver(IMessageTarget* target) -{ - CSingleLock lock(m_critSection); - m_mapTargets.insert(std::make_pair(target->GetMessageMask(), target)); -} - -} -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/messaging/ApplicationMessenger.h kodi-15.2~git20151019.1039-final/xbmc/messaging/ApplicationMessenger.h --- kodi-16.1~git20160425.1001-final/xbmc/messaging/ApplicationMessenger.h 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/messaging/ApplicationMessenger.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,219 +0,0 @@ -#pragma once - -/* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see - * . - * - */ - -#include "guilib/WindowIDs.h" -#include "threads/Thread.h" -#include "messaging/ThreadMessage.h" - -#include -#include -#include -#include -#include - -#define TMSG_MASK_MESSAGE 0xFFFF0000 // only keep the high bits to route messages -#define TMSG_MASK_APPLICATION (1<<30) //Don't use bit 31 as it'll fail to build, using unsigned variable to hold the message. -#define TMSG_MASK_PLAYLISTPLAYER (1<<29) -#define TMSG_MASK_GUIINFOMANAGER (1<<28) -#define TMSG_MASK_WINDOWMANAGER (1<<27) -#define TMSG_MASK_PERIPHERALS (1<<26) - -// defines here -#define TMSG_PLAYLISTPLAYER_PLAY TMSG_MASK_PLAYLISTPLAYER + 0 -#define TMSG_PLAYLISTPLAYER_NEXT TMSG_MASK_PLAYLISTPLAYER + 1 -#define TMSG_PLAYLISTPLAYER_PREV TMSG_MASK_PLAYLISTPLAYER + 2 -#define TMSG_PLAYLISTPLAYER_ADD TMSG_MASK_PLAYLISTPLAYER + 3 -#define TMSG_PLAYLISTPLAYER_CLEAR TMSG_MASK_PLAYLISTPLAYER + 4 -#define TMSG_PLAYLISTPLAYER_SHUFFLE TMSG_MASK_PLAYLISTPLAYER + 5 -#define TMSG_PLAYLISTPLAYER_GET_ITEMS TMSG_MASK_PLAYLISTPLAYER + 6 -#define TMSG_PLAYLISTPLAYER_PLAY_SONG_ID TMSG_MASK_PLAYLISTPLAYER + 7 -#define TMSG_PLAYLISTPLAYER_INSERT TMSG_MASK_PLAYLISTPLAYER + 8 -#define TMSG_PLAYLISTPLAYER_REMOVE TMSG_MASK_PLAYLISTPLAYER + 9 -#define TMSG_PLAYLISTPLAYER_SWAP TMSG_MASK_PLAYLISTPLAYER + 10 -#define TMSG_PLAYLISTPLAYER_REPEAT TMSG_MASK_PLAYLISTPLAYER + 11 -#define TMSG_MEDIA_PLAY TMSG_MASK_PLAYLISTPLAYER + 12 -#define TMSG_MEDIA_STOP TMSG_MASK_PLAYLISTPLAYER + 13 -// the PAUSE is indeed a PLAYPAUSE -#define TMSG_MEDIA_PAUSE TMSG_MASK_PLAYLISTPLAYER + 14 -#define TMSG_MEDIA_RESTART TMSG_MASK_PLAYLISTPLAYER + 15 -#define TMSG_MEDIA_UNPAUSE TMSG_MASK_PLAYLISTPLAYER + 16 -#define TMSG_MEDIA_PAUSE_IF_PLAYING TMSG_MASK_PLAYLISTPLAYER + 17 - - - -#define TMSG_SHUTDOWN TMSG_MASK_APPLICATION + 0 -#define TMSG_POWERDOWN TMSG_MASK_APPLICATION + 1 -#define TMSG_QUIT TMSG_MASK_APPLICATION + 2 -#define TMSG_HIBERNATE TMSG_MASK_APPLICATION + 3 -#define TMSG_SUSPEND TMSG_MASK_APPLICATION + 4 -#define TMSG_RESTART TMSG_MASK_APPLICATION + 5 -#define TMSG_RESET TMSG_MASK_APPLICATION + 6 -#define TMSG_RESTARTAPP TMSG_MASK_APPLICATION + 7 -#define TMSG_ACTIVATESCREENSAVER TMSG_MASK_APPLICATION + 8 -#define TMSG_NETWORKMESSAGE TMSG_MASK_APPLICATION + 9 -#define TMSG_SETPVRMANAGERSTATE TMSG_MASK_APPLICATION + 10 -#define TMSG_VOLUME_SHOW TMSG_MASK_APPLICATION + 11 -#define TMSG_DISPLAY_SETUP TMSG_MASK_APPLICATION + 12 -#define TMSG_DISPLAY_DESTROY TMSG_MASK_APPLICATION + 13 -#define TMSG_SETVIDEORESOLUTION TMSG_MASK_APPLICATION + 14 -#define TMSG_SWITCHTOFULLSCREEN TMSG_MASK_APPLICATION + 15 -#define TMSG_MINIMIZE TMSG_MASK_APPLICATION + 16 -#define TMSG_TOGGLEFULLSCREEN TMSG_MASK_APPLICATION + 17 -#define TMSG_SETLANGUAGE TMSG_MASK_APPLICATION + 18 -#define TMSG_RENDERER_FLUSH TMSG_MASK_APPLICATION + 19 -#define TMSG_INHIBITIDLESHUTDOWN TMSG_MASK_APPLICATION + 20 -#define TMSG_START_ANDROID_ACTIVITY TMSG_MASK_APPLICATION + 21 -#define TMSG_EXECUTE_SCRIPT TMSG_MASK_APPLICATION + 22 -#define TMSG_EXECUTE_BUILT_IN TMSG_MASK_APPLICATION + 23 -#define TMSG_EXECUTE_OS TMSG_MASK_APPLICATION + 24 -#define TMSG_PICTURE_SHOW TMSG_MASK_APPLICATION + 25 -#define TMSG_PICTURE_SLIDESHOW TMSG_MASK_APPLICATION + 26 -#define TMSG_LOADPROFILE TMSG_MASK_APPLICATION + 27 -#define TMSG_VIDEORESIZE TMSG_MASK_APPLICATION + 28 -#define TMSG_SETAUDIODSPSTATE TMSG_MASK_APPLICATION + 29 - -#define TMSG_GUI_INFOLABEL TMSG_MASK_GUIINFOMANAGER + 0 -#define TMSG_GUI_INFOBOOL TMSG_MASK_GUIINFOMANAGER + 1 -#define TMSG_UPDATE_CURRENT_ITEM TMSG_MASK_GUIINFOMANAGER + 2 - - -#define TMSG_CECTOGGLESTATE TMSG_MASK_PERIPHERALS + 1 -#define TMSG_CECACTIVATESOURCE TMSG_MASK_PERIPHERALS + 2 -#define TMSG_CECSTANDBY TMSG_MASK_PERIPHERALS + 3 - - - - -#define TMSG_GUI_DIALOG_OPEN TMSG_MASK_WINDOWMANAGER + 1 -#define TMSG_GUI_ACTIVATE_WINDOW TMSG_MASK_WINDOWMANAGER + 2 -#define TMSG_GUI_PYTHON_DIALOG TMSG_MASK_WINDOWMANAGER + 3 -#define TMSG_GUI_WINDOW_CLOSE TMSG_MASK_WINDOWMANAGER + 4 -#define TMSG_GUI_ACTION TMSG_MASK_WINDOWMANAGER + 5 -#define TMSG_GUI_ADDON_DIALOG TMSG_MASK_WINDOWMANAGER + 6 -#define TMSG_GUI_MESSAGE TMSG_MASK_WINDOWMANAGER + 7 - -/*! - \def TMSG_GUI_DIALOG_YESNO - \brief Message sent through CApplicationMessenger to open a yes/no dialog box - - There's two ways to send this message, a short and concise way and a more - flexible way allowing more customization. - - Option 1: - CApplicationMessenger::Get().SendMsg(TMSG_GUI_DIALOG_YESNO, 123, 456); - 123: This is the string id for the heading - 456: This is the string id for the text - - Option 2: - \a HELPERS::DialogYesNoMessage options. - Fill in options - CApplicationMessenger::Get().SendMsg(TMSG_GUI_DIALOG_YESNO, -1, -1, static_cast(&options)); - - \returns -1 for cancelled, 0 for No and 1 for Yes - \sa HELPERS::DialogYesNoMessage -*/ -#define TMSG_GUI_DIALOG_YESNO TMSG_MASK_WINDOWMANAGER + 8 - - -#define TMSG_CALLBACK 800 - - - -class CGUIMessage; - -namespace KODI -{ -namespace MESSAGING -{ - -class CDelayedMessage : public CThread -{ - public: - CDelayedMessage(ThreadMessage& msg, unsigned int delay); - virtual void Process() override; - - private: - unsigned int m_delay; - ThreadMessage m_msg; -}; - -struct ThreadMessageCallback -{ - void (*callback)(void *userptr); - void *userptr; -}; - -class IMessageTarget; - -class CApplicationMessenger -{ -public: - /*! - \brief The only way through which the global instance of the CApplicationMessenger should be accessed. - \return the global instance. - */ - static CApplicationMessenger& GetInstance(); - - void Cleanup(); - // if a message has to be send to the gui, use MSG_TYPE_WINDOW instead - int SendMsg(uint32_t messageId); - int SendMsg(uint32_t messageId, int param1, int param2 = -1, void* payload = nullptr); - int SendMsg(uint32_t messageId, int param1, int param2, void* payload, std::string strParam); - int SendMsg(uint32_t messageId, int param1, int param2, void* payload, std::string strParam, std::vector params); - - void PostMsg(uint32_t messageId); - void PostMsg(uint32_t messageId, int param1, int param2 = -1, void* payload = nullptr); - void PostMsg(uint32_t messageId, int param1, int param2, void* payload, std::string strParam); - void PostMsg(uint32_t messageId, int param1, int param2, void* payload, std::string strParam, std::vector params); - - void ProcessMessages(); // only call from main thread. - void ProcessWindowMessages(); - - /*! \brief Send a GUIMessage, optionally waiting before it's processed to return. - Should be used to send messages to the GUI from other threads. - \param msg the GUIMessage to send. - \param windowID optional window to send the message to (defaults to no specified window). - \param waitResult whether to wait for the result (defaults to false). - */ - void SendGUIMessage(const CGUIMessage &msg, int windowID = WINDOW_INVALID, bool waitResult=false); - - void RegisterReceiver(IMessageTarget* target); - -private: - // private construction, and no assignments; use the provided singleton methods - CApplicationMessenger(); - CApplicationMessenger(const CApplicationMessenger&) = delete; - CApplicationMessenger const& operator=(CApplicationMessenger const&) = delete; - ~CApplicationMessenger(); - - int SendMsg(ThreadMessage&& msg, bool wait); - void ProcessMessage(ThreadMessage *pMsg); - - std::queue m_vecMessages; - std::queue m_vecWindowMessages; - std::map m_mapTargets; - CCriticalSection m_critSection; -}; -} -} - - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/messaging/helpers/DialogHelper.cpp kodi-15.2~git20151019.1039-final/xbmc/messaging/helpers/DialogHelper.cpp --- kodi-16.1~git20160425.1001-final/xbmc/messaging/helpers/DialogHelper.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/messaging/helpers/DialogHelper.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -/* -* Copyright (C) 2005-2015 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Kodi; see the file COPYING. If not, see -* . -* -*/ - -#include "DialogHelper.h" -#include "messaging/ApplicationMessenger.h" - -#include -#include - -namespace KODI -{ -namespace MESSAGING -{ -namespace HELPERS -{ -DialogResponse ShowYesNoDialogText(CVariant heading, CVariant text, CVariant noLabel, CVariant yesLabel, uint32_t autoCloseTimeout) -{ - DialogYesNoMessage options; - options.heading = std::move(heading); - options.text = std::move(text); - options.noLabel = std::move(noLabel); - options.yesLabel = std::move(yesLabel); - options.autoclose = autoCloseTimeout; - - switch (CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_DIALOG_YESNO, -1, -1, static_cast(&options))) - { - case -1: - return DialogResponse::CANCELLED; - case 0: - return DialogResponse::NO; - case 1: - return DialogResponse::YES; - default: - //If we get here someone changed the return values without updating this code - assert(false); - } - //This is unreachable code but we need to return something to suppress warnings about - //no return - return DialogResponse::CANCELLED; -} - -DialogResponse ShowYesNoDialogLines(CVariant heading, CVariant line0, CVariant line1, CVariant line2, CVariant noLabel, CVariant yesLabel, uint32_t autoCloseTimeout) -{ - DialogYesNoMessage options; - options.heading = std::move(heading); - options.lines[0] = std::move(line0); - options.lines[1] = std::move(line1); - options.lines[2] = std::move(line2); - options.noLabel = std::move(noLabel); - options.yesLabel = std::move(yesLabel); - options.autoclose = autoCloseTimeout; - - switch (CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_DIALOG_YESNO, -1, -1, static_cast(&options))) - { - case -1: - return DialogResponse::CANCELLED; - case 0: - return DialogResponse::NO; - case 1: - return DialogResponse::YES; - default: - //If we get here someone changed the return values without updating this code - assert(false); - } - //This is unreachable code but we need to return something to suppress warnings about - //no return - return DialogResponse::CANCELLED; -} - -} -} -} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/messaging/helpers/DialogHelper.h kodi-15.2~git20151019.1039-final/xbmc/messaging/helpers/DialogHelper.h --- kodi-16.1~git20160425.1001-final/xbmc/messaging/helpers/DialogHelper.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/messaging/helpers/DialogHelper.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ -#pragma once -/* -* Copyright (C) 2005-2015 Team Kodi -* http://kodi.tv -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Kodi; see the file COPYING. If not, see -* . -* -*/ - -#include "utils/Variant.h" - -#include -#include - -namespace KODI -{ -namespace MESSAGING -{ -namespace HELPERS -{ - -enum class DialogResponse -{ - CANCELLED, - YES, - NO -}; - -/*! \struct DialogHelper.h "messaging/helpers/DialogHelper.h" - \brief Payload sent for message TMSG_GUI_DIALOG_YESNO - - \sa ShowDialogText - \sa ShowDialogLines -*/ -struct DialogYesNoMessage -{ - CVariant heading; //!< Heading to be displayed in the dialog box - CVariant text; //!< Body text to be displayed, this is mutually exclusive with lines below - std::array lines; //!< Body text to be displayed, specified as three lines. This is mutually exclusive with the text above - CVariant yesLabel; //!< Text to show on the yes button - CVariant noLabel; //!< Text to show on the no button - uint32_t autoclose{0}; //!< Time in milliseconds before autoclosing the dialog, 0 means don't autoclose -}; - -/*! - \brief This is a helper method to send a threadmessage to open a Yes/No dialog box - - \param[in] heading The text to display as the dialog box header - \param[in] text The text to display in the dialog body - \param[in] noLabel The text to display on the No button - defaults to No - \param[in] yesLabel The text to display on the Yes button - defaults to Yes - \param[in] autoCloseTimeout The time before the dialog closes - defaults to 0 show indefinitely - \return -1 on cancelled, 0 on no and 1 on yes - \sa ShowYesNoDialogLines - \sa CGUIDialogYesNo::ShowAndGetInput - \sa DialogYesNoMessage -*/ -DialogResponse ShowYesNoDialogText(CVariant heading, CVariant text, CVariant noLabel = "", CVariant yesLabel = "", uint32_t autoCloseTimeout = 0); - -/*! - \brief This is a helper method to send a threadmessage to open a Yes/No dialog box - - \param[in] heading The text to display as the dialog box header - \param[in] line0 The text to display on the first line - \param[in] line1 The text to display on the second line - \param[in] line2 The text to display on the third line - \param[in] noLabel The text to display on the No button - defaults to No - \param[in] yesLabel The text to display on the Yes button - defaults to Yes - \param[in] autoCloseTimeout The time before the dialog closes - defaults to 0 show indefinitely - \return -1 on cancelled, 0 on no and 1 on yes - \sa ShowYesNoDialogText - \sa CGUIDialogYesNo::ShowAndGetInput - \sa DialogYesNoMessage -*/ -DialogResponse ShowYesNoDialogLines(CVariant heading, CVariant line0, CVariant line1 = "", - CVariant line2 = "", CVariant noLabel = "", CVariant yesLabel = "", uint32_t autoCloseTimeout = 0); - -} -} -} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/messaging/helpers/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/messaging/helpers/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/messaging/helpers/Makefile.in 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/messaging/helpers/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -SRCS = DialogHelper.cpp - -LIB = messagingHelpers.a - -include @abs_top_srcdir@/Makefile.include --include $(patsubst %.cpp,%.P,$(patsubst %c,%.P,$(patsubst %.S,,$(SRCS)))) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/messaging/IMessageTarget.h kodi-15.2~git20151019.1039-final/xbmc/messaging/IMessageTarget.h --- kodi-16.1~git20160425.1001-final/xbmc/messaging/IMessageTarget.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/messaging/IMessageTarget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -#pragma once -/* -* Copyright (C) 2005-2015 Team XBMC -* http://xbmc.org -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -namespace KODI -{ -namespace MESSAGING -{ -class ThreadMessage; - -class IMessageTarget -{ -public: - virtual ~IMessageTarget() { } - virtual int GetMessageMask() = 0; - virtual void OnApplicationMessage(ThreadMessage* msg) = 0; -}; -} -} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/messaging/Makefile kodi-15.2~git20151019.1039-final/xbmc/messaging/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/messaging/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/messaging/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,7 @@ +SRCS = ApplicationMessenger.cpp + +LIB = messaging.a + +include /Users/haggi/Home/devs/workspace/xbmc/Makefile.include +-include $(patsubst %.cpp,%.P,$(patsubst %c,%.P,$(patsubst %.S,,$(SRCS)))) + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/messaging/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/messaging/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/messaging/Makefile.in 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/messaging/Makefile.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -SRCS = ApplicationMessenger.cpp - -LIB = messaging.a - -include @abs_top_srcdir@/Makefile.include --include $(patsubst %.cpp,%.P,$(patsubst %c,%.P,$(patsubst %.S,,$(SRCS)))) - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/messaging/ThreadMessage.h kodi-15.2~git20151019.1039-final/xbmc/messaging/ThreadMessage.h --- kodi-16.1~git20160425.1001-final/xbmc/messaging/ThreadMessage.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/messaging/ThreadMessage.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ -#pragma once -/* -* Copyright (C) 2005-2015 Team XBMC -* http://xbmc.org -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ - -#include -#include -#include - -class CEvent; - -namespace KODI -{ -namespace MESSAGING -{ - -class CApplicationMessenger; - -class ThreadMessage -{ - friend CApplicationMessenger; -public: - ThreadMessage() - : ThreadMessage{ 0, -1, -1, nullptr } - { - } - - explicit ThreadMessage(uint32_t messageId) - : ThreadMessage{ messageId, -1, -1, nullptr } - { - } - - ThreadMessage(uint32_t messageId, int p1, int p2, void* payload) - : dwMessage{ messageId } - , param1{ p1 } - , param2{ p2 } - , lpVoid{ payload } - { - } - - ThreadMessage(uint32_t messageId, int p1, int p2, void* payload, std::string param, std::vector vecParams) - : dwMessage{ messageId } - , param1{ p1 } - , param2{ p2 } - , lpVoid{ payload } - , strParam( param ) - , params( vecParams ) - { - } - - ThreadMessage(const ThreadMessage& other) - : dwMessage(other.dwMessage), - param1(other.param1), - param2(other.param2), - lpVoid(other.lpVoid), - strParam(other.strParam), - params(other.params), - waitEvent(other.waitEvent), - result(other.result) - { - } - - ThreadMessage(ThreadMessage&& other) - : dwMessage(other.dwMessage), - param1(other.param1), - param2(other.param2), - lpVoid(other.lpVoid), - strParam(std::move(other.strParam)), - params(std::move(other.params)), - waitEvent(std::move(other.waitEvent)), - result(std::move(other.result)) - { - } - - ThreadMessage& operator=(const ThreadMessage& other) - { - if (this == &other) - return *this; - dwMessage = other.dwMessage; - param1 = other.param1; - param2 = other.param2; - lpVoid = other.lpVoid; - strParam = other.strParam; - params = other.params; - waitEvent = other.waitEvent; - result = other.result; - return *this; - } - - ThreadMessage& operator=(ThreadMessage&& other) - { - if (this == &other) - return *this; - dwMessage = other.dwMessage; - param1 = other.param1; - param2 = other.param2; - lpVoid = other.lpVoid; - strParam = std::move(other.strParam); - params = std::move(other.params); - waitEvent = std::move(other.waitEvent); - result = std::move(other.result); - return *this; - } - - uint32_t dwMessage; - int param1; - int param2; - void* lpVoid; - std::string strParam; - std::vector params; - - void SetResult(int res) - { - //On posted messages result will be zero, since they can't - //retreive the response we silently ignore this to let message - //handlers not have to worry about it - if (result) - *result = res; - } -protected: - std::shared_ptr waitEvent; - std::shared_ptr result; -}; -} -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/Album.cpp kodi-15.2~git20151019.1039-final/xbmc/music/Album.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/Album.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/Album.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -28,6 +28,7 @@ #include +using namespace std; using namespace MUSIC_INFO; typedef struct ReleaseTypeInfo { @@ -51,45 +52,31 @@ strAlbum = tag.GetAlbum(); strMusicBrainzAlbumID = tag.GetMusicBrainzAlbumID(); genre = tag.GetGenre(); - std::vector musicBrainAlbumArtistHints = tag.GetMusicBrainzAlbumArtistHints(); - strArtistDesc = tag.GetAlbumArtistString(); - + artist = tag.GetAlbumArtist(); if (!tag.GetMusicBrainzAlbumArtistID().empty()) { // have musicbrainz artist info, so use it for (size_t i = 0; i < tag.GetMusicBrainzAlbumArtistID().size(); i++) { std::string artistId = tag.GetMusicBrainzAlbumArtistID()[i]; std::string artistName; - /* - We try and get the mbrainzid <-> name matching from the hints and match on the same index. - If not found, we try and use the mbrainz <-> name matching from the artists fields - If still not found, try and use the same index of the albumartist field. - If still not found, use the mbrainzid and hope we later on can update that entry - */ - - if (i < musicBrainAlbumArtistHints.size()) - artistName = musicBrainAlbumArtistHints[i]; + We try and get the corresponding artist name from the album artist tag. + We match on the same index, and if that fails just use the first name we have. + If no albumartist exists, try matching on artist if the MBArtistID matches. + */ + if (!artist.empty()) + artistName = (i < artist.size()) ? artist[i] : artist[0]; else if (!tag.GetMusicBrainzArtistID().empty() && !tag.GetArtist().empty()) { - for (size_t j = 0; j < tag.GetMusicBrainzArtistID().size(); j++) - { - if (artistId == tag.GetMusicBrainzArtistID()[j]) - { - if (j < tag.GetMusicBrainzArtistHints().size()) - artistName = tag.GetMusicBrainzArtistHints()[j]; - else - artistName = (j < tag.GetArtist().size()) ? tag.GetArtist()[j] : tag.GetArtist()[0]; - } + vector::const_iterator j = std::find(tag.GetMusicBrainzArtistID().begin(), tag.GetMusicBrainzArtistID().end(), artistId); + if (j != tag.GetMusicBrainzArtistID().end()) + { // find corresponding artist + size_t d = std::distance(j,tag.GetMusicBrainzArtistID().begin()); + artistName = (d < tag.GetArtist().size()) ? tag.GetArtist()[d] : tag.GetArtist()[0]; } } - - if (artistName.empty() && tag.GetMusicBrainzAlbumArtistID().size() == tag.GetAlbumArtist().size()) - artistName = tag.GetAlbumArtist()[i]; - if (artistName.empty()) artistName = artistId; - std::string strJoinPhrase = (i == tag.GetMusicBrainzAlbumArtistID().size()-1) ? "" : g_advancedSettings.m_musicItemSeparator; CArtistCredit artistCredit(artistName, tag.GetMusicBrainzAlbumArtistID()[i], strJoinPhrase); artistCredits.push_back(artistCredit); @@ -97,7 +84,7 @@ } else { // no musicbrainz info, so fill in directly - for (std::vector::const_iterator it = tag.GetAlbumArtist().begin(); it != tag.GetAlbumArtist().end(); ++it) + for (vector::const_iterator it = tag.GetAlbumArtist().begin(); it != tag.GetAlbumArtist().end(); ++it) { std::string strJoinPhrase = (it == --tag.GetAlbumArtist().end() ? "" : g_advancedSettings.m_musicItemSeparator); CArtistCredit artistCredit(*it, "", strJoinPhrase); @@ -107,8 +94,6 @@ iYear = stTime.wYear; bCompilation = tag.GetCompilation(); iTimesPlayed = 0; - dateAdded.Reset(); - lastPlayed.Reset(); releaseType = tag.GetAlbumReleaseType(); } @@ -148,6 +133,7 @@ if (override) { artistCredits = source.artistCredits; + artist = source.artist; // artist information is read-only from the database. artistCredits is what counts on scan } else if (source.artistCredits.size() > artistCredits.size()) artistCredits.insert(artistCredits.end(), source.artistCredits.begin()+artistCredits.size(), source.artistCredits.end()); @@ -165,52 +151,14 @@ infoSongs = source.infoSongs; } -std::string CAlbum::GetGenreString() const -{ - return StringUtils::Join(genre, g_advancedSettings.m_musicItemSeparator); -} - -const std::vector CAlbum::GetAlbumArtist() const +std::string CAlbum::GetArtistString() const { - //Get artist names as vector from artist credits - std::vector albumartists; - for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit) - { - albumartists.push_back(artistCredit->GetArtist()); - } - return albumartists; + return StringUtils::Join(artist, g_advancedSettings.m_musicItemSeparator); } -const std::vector CAlbum::GetMusicBrainzAlbumArtistID() const -{ - //Get artist MusicBrainz IDs as vector from artist credits - std::vector muisicBrainzID; - for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit) - { - muisicBrainzID.push_back(artistCredit->GetMusicBrainzArtistID()); - } - return muisicBrainzID; -} - -const std::string CAlbum::GetAlbumArtistString() const -{ - //Artist description may be different from the artists in artistcredits (see ALBUMARTISTS tag processing) - //but is takes precidence as a string because artistcredits is not always filled during processing - if (!strArtistDesc.empty()) - return strArtistDesc; - std::string artistString; - for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit) - artistString += artistCredit->GetArtist() + artistCredit->GetJoinPhrase(); - return artistString; -} - -const std::vector CAlbum::GetArtistIDArray() const +std::string CAlbum::GetGenreString() const { - // Get album artist IDs for json rpc - std::vector artistids; - for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit) - artistids.push_back(artistCredit->GetArtistId()); - return artistids; + return StringUtils::Join(genre, g_advancedSettings.m_musicItemSeparator); } std::string CAlbum::GetReleaseType() const @@ -223,16 +171,6 @@ releaseType = ReleaseTypeFromString(strReleaseType); } -void CAlbum::SetDateAdded(const std::string& strDateAdded) -{ - dateAdded.SetFromDBDateTime(strDateAdded); -} - -void CAlbum::SetLastPlayed(const std::string& strLastPlayed) -{ - lastPlayed.SetFromDBDateTime(strLastPlayed); -} - std::string CAlbum::ReleaseTypeToString(CAlbum::ReleaseType releaseType) { for (size_t i = 0; i < RELEASE_TYPES_SIZE; i++) @@ -265,8 +203,8 @@ if (strAlbum > a.strAlbum) return false; // This will do an std::vector compare (i.e. item by item) - if (GetAlbumArtist() < a.GetAlbumArtist()) return true; - if (GetAlbumArtist() > a.GetAlbumArtist()) return false; + if (artist < a.artist) return true; + if (artist > a.artist) return false; return false; } @@ -283,7 +221,7 @@ XMLUtils::GetString(album, "title", strAlbum); XMLUtils::GetString(album, "musicBrainzAlbumID", strMusicBrainzAlbumID); - std::vector artist; // Support old style for backwards compatibility + XMLUtils::GetStringArray(album, "artist", artist, prioritise, g_advancedSettings.m_musicItemSeparator); XMLUtils::GetStringArray(album, "genre", genre, prioritise, g_advancedSettings.m_musicItemSeparator); XMLUtils::GetStringArray(album, "style", styles, prioritise, g_advancedSettings.m_musicItemSeparator); @@ -357,7 +295,7 @@ // or removed entirely in preference for better tags (MusicBrainz?) if (artistCredits.empty() && !artist.empty()) { - for (std::vector::const_iterator it = artist.begin(); it != artist.end(); ++it) + for (vector::const_iterator it = artist.begin(); it != artist.end(); ++it) { CArtistCredit artistCredit(*it, "", it == --artist.end() ? "" : g_advancedSettings.m_musicItemSeparator); @@ -435,7 +373,7 @@ XMLUtils::SetString(album, "title", strAlbum); XMLUtils::SetString(album, "musicBrainzAlbumID", strMusicBrainzAlbumID); - XMLUtils::SetStringArray(album, "artist", GetAlbumArtist()); + XMLUtils::SetStringArray(album, "artist", artist); XMLUtils::SetStringArray(album, "genre", genre); XMLUtils::SetStringArray(album, "style", styles); XMLUtils::SetStringArray(album, "mood", moods); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/Album.h kodi-15.2~git20151019.1039-final/xbmc/music/Album.h --- kodi-16.1~git20160425.1001-final/xbmc/music/Album.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/Album.h 2015-10-19 08:39:16.000000000 +0000 @@ -28,7 +28,6 @@ #include #include "Artist.h" #include "Song.h" -#include "XBDateTime.h" #include "utils/ScraperUrl.h" class TiXmlNode; @@ -37,13 +36,7 @@ { public: CAlbum(const CFileItem& item); - CAlbum() : idAlbum{0} - , iRating{0} - , iYear{0} - , bCompilation{false} - , iTimesPlayed{0} - , releaseType{Album} - {}; + CAlbum() { idAlbum = 0; iRating = 0; iYear = 0; iTimesPlayed = 0; releaseType = Album; }; bool operator<(const CAlbum &a) const; void MergeScrapedAlbum(const CAlbum& album, bool override = true); @@ -52,8 +45,8 @@ idAlbum = -1; strAlbum.clear(); strMusicBrainzAlbumID.clear(); + artist.clear(); artistCredits.clear(); - strArtistDesc.clear(); genre.clear(); thumbURL.Clear(); moods.clear(); @@ -69,35 +62,14 @@ iYear=-1; bCompilation = false; iTimesPlayed = 0; - dateAdded.Reset(); - lastPlayed.Reset(); songs.clear(); infoSongs.clear(); releaseType = Album; } - /*! \brief Get album artist names from the vector of artistcredits objects - \return album artist names as a vector of strings - */ - const std::vector GetAlbumArtist() const; - - /*! \brief Get album artist MusicBrainz IDs from the vector of artistcredits objects - \return album artist MusicBrainz IDs as a vector of strings - */ - const std::vector GetMusicBrainzAlbumArtistID() const; + std::string GetArtistString() const; std::string GetGenreString() const; - /*! \brief Get album artist names from the artist decription string (if it exists) - or concatenated from the vector of artistcredits objects - \return album artist names as a single string - */ - const std::string GetAlbumArtistString() const; - - /*! \brief Get album artist IDs (for json rpc) from the vector of artistcredits objects - \return album artist IDs as a vector of integers - */ - const std::vector GetArtistIDArray() const; - typedef enum ReleaseType { Album = 0, Single @@ -105,8 +77,6 @@ std::string GetReleaseType() const; void SetReleaseType(const std::string& strReleaseType); - void SetDateAdded(const std::string& strDateAdded); - void SetLastPlayed(const std::string& strLastPlayed); static std::string ReleaseTypeToString(ReleaseType releaseType); static ReleaseType ReleaseTypeFromString(const std::string& strReleaseType); @@ -124,7 +94,7 @@ long idAlbum; std::string strAlbum; std::string strMusicBrainzAlbumID; - std::string strArtistDesc; + std::vector artist; VECARTISTCREDITS artistCredits; std::vector genre; CScraperUrl thumbURL; @@ -141,8 +111,6 @@ int iYear; bool bCompilation; int iTimesPlayed; - CDateTime dateAdded; - CDateTime lastPlayed; VECSONGS songs; ///< Local songs VECSONGS infoSongs; ///< Scraped songs ReleaseType releaseType; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/Artist.cpp kodi-15.2~git20151019.1039-final/xbmc/music/Artist.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/Artist.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/Artist.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,6 +24,8 @@ #include +using namespace std; + void CArtist::MergeScrapedArtist(const CArtist& source, bool override /* = true */) { /* @@ -173,7 +175,7 @@ } // albums - for (std::vector >::const_iterator it = discography.begin(); it != discography.end(); ++it) + for (vector< pair >::const_iterator it = discography.begin(); it != discography.end(); ++it) { // add a tag TiXmlElement cast("album"); @@ -191,8 +193,3 @@ return true; } -void CArtist::SetDateAdded(const std::string& strDateAdded) -{ - dateAdded.SetFromDBDateTime(strDateAdded); -} - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/Artist.h kodi-15.2~git20151019.1039-final/xbmc/music/Artist.h --- kodi-16.1~git20160425.1001-final/xbmc/music/Artist.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/Artist.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,12 +22,10 @@ #include #include -#include #include -#include "utils/Fanart.h" #include "utils/ScraperUrl.h" -#include "XBDateTime.h" +#include "utils/Fanart.h" class TiXmlNode; class CAlbum; @@ -70,7 +68,6 @@ discography.clear(); idArtist = -1; strPath.clear(); - dateAdded.Reset(); } /*! \brief Load artist information from an XML file. @@ -83,8 +80,6 @@ bool Load(const TiXmlElement *element, bool append = false, bool prioritise = false); bool Save(TiXmlNode *node, const std::string &tag, const std::string& strPath); - void SetDateAdded(const std::string& strDateAdded); - std::string strArtist; std::string strMusicBrainzArtistID; std::vector genre; @@ -101,7 +96,6 @@ CScraperUrl thumbURL; CFanart fanart; std::vector > discography; - CDateTime dateAdded; }; class CArtistCredit diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogMusicInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogMusicInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogMusicInfo.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogMusicInfo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -39,6 +39,7 @@ #include "music/MusicThumbLoader.h" #include "filesystem/Directory.h" +using namespace std; using namespace XFILE; #define CONTROL_IMAGE 3 @@ -148,11 +149,11 @@ SetSongs(m_album.infoSongs); *m_albumItem = CFileItem(path, true); m_albumItem->GetMusicInfoTag()->SetAlbum(m_album.strAlbum); - m_albumItem->GetMusicInfoTag()->SetAlbumArtist(m_album.GetAlbumArtist()); - m_albumItem->GetMusicInfoTag()->SetArtist(m_album.GetAlbumArtist()); + m_albumItem->GetMusicInfoTag()->SetAlbumArtist(StringUtils::Join(m_album.artist, g_advancedSettings.m_musicItemSeparator)); + m_albumItem->GetMusicInfoTag()->SetArtist(m_album.artist); m_albumItem->GetMusicInfoTag()->SetYear(m_album.iYear); m_albumItem->GetMusicInfoTag()->SetLoaded(true); - m_albumItem->GetMusicInfoTag()->SetUserrating('0' + m_album.iRating); + m_albumItem->GetMusicInfoTag()->SetRating('0' + m_album.iRating); m_albumItem->GetMusicInfoTag()->SetGenre(m_album.genre); m_albumItem->GetMusicInfoTag()->SetDatabaseId(m_album.idAlbum, MediaTypeAlbum); CMusicDatabase::SetPropertiesFromAlbum(*m_albumItem,m_album); @@ -161,11 +162,11 @@ loader.LoadItem(m_albumItem.get()); // set the artist thumb, fanart - if (!m_album.GetAlbumArtist().empty()) + if (!m_album.artist.empty()) { CMusicDatabase db; db.Open(); - std::map artwork; + map artwork; if (db.GetArtistArtForItem(m_album.idAlbum, MediaTypeAlbum, artwork)) { if (artwork.find("thumb") != artwork.end()) @@ -217,7 +218,7 @@ CMusicDatabase database; database.Open(); - std::vector albumsByArtist; + vector albumsByArtist; database.GetAlbumsByArtist(m_artist.idArtist, true, albumsByArtist); for (unsigned int i=0;iSetLabel2(m_artist.discography[i].second); int idAlbum = -1; - for (std::vector::const_iterator album = albumsByArtist.begin(); album != albumsByArtist.end(); ++album) + for (vector::const_iterator album = albumsByArtist.begin(); album != albumsByArtist.end(); ++album) { if (StringUtils::EqualsNoCase(database.GetAlbumById(*album), item->GetLabel())) { @@ -305,7 +306,7 @@ } // disable the GetThumb button if the user isn't allowed it - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_GET_THUMB, CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser); + CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_GET_THUMB, CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser); } void CGUIDialogMusicInfo::SetLabel(int iControl, const std::string& strLabel) @@ -353,7 +354,7 @@ } // Grab the thumbnail(s) from the web - std::vector thumbs; + vector thumbs; if (m_bArtistInfo) m_artist.thumbURL.GetThumbURLs(thumbs); else @@ -369,7 +370,7 @@ item->SetLabel(g_localizeStrings.Get(20015)); // TODO: Do we need to clear the cached image? - // CTextureCache::GetInstance().ClearCachedImage(thumb); + // CTextureCache::Get().ClearCachedImage(thumb); items.Add(item); } @@ -405,7 +406,7 @@ std::string result; bool flip=false; - VECSOURCES sources(*CMediaSourceSettings::GetInstance().GetSources("music")); + VECSOURCES sources(*CMediaSourceSettings::Get().GetSources("music")); AddItemPathToFileBrowserSources(sources, *m_albumItem); g_mediaManager.GetLocalDrives(sources); if (!CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(1030), result, &flip)) @@ -471,7 +472,7 @@ item->SetLabel(g_localizeStrings.Get(20441)); // TODO: Do we need to clear the cached image? - // CTextureCache::GetInstance().ClearCachedImage(thumb); + // CTextureCache::Get().ClearCachedImage(thumb); items.Add(item); } @@ -489,7 +490,7 @@ itemLocal->SetLabel(g_localizeStrings.Get(20438)); // TODO: Do we need to clear the cached image? - CTextureCache::GetInstance().ClearCachedImage(strLocal); + CTextureCache::Get().ClearCachedImage(strLocal); items.Add(itemLocal); } else @@ -501,7 +502,7 @@ } std::string result; - VECSOURCES sources = *CMediaSourceSettings::GetInstance().GetSources("music"); + VECSOURCES sources = *CMediaSourceSettings::Get().GetSources("music"); g_mediaManager.GetLocalDrives(sources); bool flip=false; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(20437), result, &flip, 20445)) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogMusicOSD.cpp kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogMusicOSD.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogMusicOSD.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogMusicOSD.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -51,8 +51,8 @@ std::string addonID; if (CGUIWindowAddonBrowser::SelectAddonID(ADDON::ADDON_VIZ, addonID, true) == 1) { - CSettings::GetInstance().SetString(CSettings::SETTING_MUSICPLAYER_VISUALISATION, addonID); - CSettings::GetInstance().Save(); + CSettings::Get().SetString("musicplayer.visualisation", addonID); + CSettings::Get().Save(); g_windowManager.SendMessage(GUI_MSG_VISUALISATION_RELOAD, 0, 0); } } @@ -88,11 +88,9 @@ if (m_autoClosing) { // check for movement of mouse or a submenu open - if (CInputManager::GetInstance().IsMouseActive() || + if (CInputManager::Get().IsMouseActive() || g_windowManager.IsWindowActive(WINDOW_DIALOG_VIS_SETTINGS) || - g_windowManager.IsWindowActive(WINDOW_DIALOG_VIS_PRESET_LIST) || - g_windowManager.IsWindowActive(WINDOW_DIALOG_AUDIO_DSP_OSD_SETTINGS) || - g_windowManager.IsWindowActive(WINDOW_DIALOG_PVR_RADIO_RDS_INFO)) + g_windowManager.IsWindowActive(WINDOW_DIALOG_VIS_PRESET_LIST)) // extend show time by original value SetAutoClose(m_showDuration); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogMusicOverlay.cpp kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogMusicOverlay.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogMusicOverlay.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogMusicOverlay.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "GUIDialogMusicOverlay.h" +#include "guilib/GUIWindowManager.h" +#include "input/Key.h" +#include "input/MouseStat.h" +#include "input/InputManager.h" + +#define CONTROL_LOGO_PIC 1 + +CGUIDialogMusicOverlay::CGUIDialogMusicOverlay() + : CGUIDialog(WINDOW_DIALOG_MUSIC_OVERLAY, "MusicOverlay.xml") +{ + m_renderOrder = 0; + m_loadType = KEEP_IN_MEMORY; +} + +CGUIDialogMusicOverlay::~CGUIDialogMusicOverlay() +{ +} + +bool CGUIDialogMusicOverlay::OnMessage(CGUIMessage& message) +{ // check that the mouse wasn't clicked on the thumb... + if (message.GetMessage() == GUI_MSG_CLICKED) + { + if (message.GetControlId() == GetID() && message.GetSenderId() == 0) + { + if (message.GetParam1() == ACTION_SELECT_ITEM) + { // switch to fullscreen visualisation mode... + CGUIMessage msg(GUI_MSG_FULLSCREEN, 0, GetID()); + g_windowManager.SendMessage(msg); + } + } + } + return CGUIDialog::OnMessage(message); +} + +EVENT_RESULT CGUIDialogMusicOverlay::OnMouseEvent(const CPoint &point, const CMouseEvent &event) +{ + CGUIControl *pControl = GetControl(CONTROL_LOGO_PIC); + if (pControl && pControl->HitTest(point)) + { + // send highlight message + CInputManager::Get().SetMouseState(MOUSE_STATE_FOCUS); + if (event.m_id == ACTION_MOUSE_LEFT_CLICK) + { // send mouse message + CGUIMessage message(GUI_MSG_FULLSCREEN, CONTROL_LOGO_PIC, GetID()); + g_windowManager.SendMessage(message); + } + if (event.m_id == ACTION_MOUSE_RIGHT_CLICK) + { // toggle the playlist window + if (g_windowManager.GetActiveWindow() == WINDOW_MUSIC_PLAYLIST) + g_windowManager.PreviousWindow(); + else + g_windowManager.ActivateWindow(WINDOW_MUSIC_PLAYLIST); + } + return EVENT_RESULT_HANDLED; + } + return EVENT_RESULT_UNHANDLED; +} + +void CGUIDialogMusicOverlay::SetDefaults() +{ + CGUIDialog::SetDefaults(); + m_renderOrder = 0; + SetVisibleCondition("skin.hasmusicoverlay"); +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogMusicOverlay.h kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogMusicOverlay.h --- kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogMusicOverlay.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogMusicOverlay.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,34 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "guilib/GUIDialog.h" + +class CGUIDialogMusicOverlay: public CGUIDialog +{ +public: + CGUIDialogMusicOverlay(void); + virtual ~CGUIDialogMusicOverlay(void); + virtual bool OnMessage(CGUIMessage& message); +protected: + virtual EVENT_RESULT OnMouseEvent(const CPoint &point, const CMouseEvent &event); + virtual void SetDefaults(); +}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogSongInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogSongInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogSongInfo.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogSongInfo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,9 +21,7 @@ #include "GUIDialogSongInfo.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "dialogs/GUIDialogFileBrowser.h" -#include "dialogs/GUIDialogSelect.h" #include "GUIPassword.h" #include "GUIUserMessages.h" #include "music/MusicDatabase.h" @@ -42,9 +40,10 @@ using namespace XFILE; -#define CONTROL_USERRATING 7 -#define CONTROL_ALBUMINFO 12 -#define CONTROL_GETTHUMB 13 +#define CONTROL_OK 10 +#define CONTROL_CANCEL 11 +#define CONTROL_ALBUMINFO 12 +#define CONTROL_GETTHUMB 13 CGUIDialogSongInfo::CGUIDialogSongInfo(void) : CGUIDialog(WINDOW_DIALOG_SONG_INFO, "DialogSongInfo.xml") @@ -52,7 +51,7 @@ { m_cancelled = false; m_needsUpdate = false; - m_startUserrating = -1; + m_startRating = -1; m_loadType = KEEP_IN_MEMORY; } @@ -66,15 +65,20 @@ { case GUI_MSG_WINDOW_DEINIT: { - if (m_startUserrating != m_song->GetMusicInfoTag()->GetUserrating()) + if (!m_cancelled && m_startRating != m_song->GetMusicInfoTag()->GetRating()) { CMusicDatabase db; if (db.Open()) // OpenForWrite() ? { - m_needsUpdate = true; - db.SetSongUserrating(m_song->GetPath(), m_song->GetMusicInfoTag()->GetUserrating()); + db.SetSongRating(m_song->GetPath(), m_song->GetMusicInfoTag()->GetRating()); db.Close(); } + m_needsUpdate = true; + } + else + { // cancelled - reset the song rating + SetRating(m_startRating); + m_needsUpdate = false; } break; } @@ -85,9 +89,17 @@ case GUI_MSG_CLICKED: { int iControl = message.GetSenderId(); - if (iControl == CONTROL_USERRATING) + if (iControl == CONTROL_CANCEL) { - OnSetUserrating(); + m_cancelled = true; + Close(); + return true; + } + else if (iControl == CONTROL_OK) + { + m_cancelled = false; + Close(); + return true; } else if (iControl == CONTROL_ALBUMINFO) { @@ -98,7 +110,7 @@ std::string path = StringUtils::Format("musicdb://albums/%li",m_albumId); item.SetPath(path); item.m_bIsFolder = true; - window->OnItemInfo(&item, true); + window->OnInfo(&item, true); } return true; } @@ -116,15 +128,17 @@ bool CGUIDialogSongInfo::OnAction(const CAction &action) { - char rating = m_song->GetMusicInfoTag()->GetUserrating(); + char rating = m_song->GetMusicInfoTag()->GetRating(); if (action.GetID() == ACTION_INCREASE_RATING) { - SetUserrating(rating + 1); + if (rating < '5') + SetRating(rating + 1); return true; } else if (action.GetID() == ACTION_DECREASE_RATING) { - SetUserrating(rating - 1); + if (rating > '0') + SetRating(rating - 1); return true; } else if (action.GetID() == ACTION_SHOW_INFO) @@ -163,13 +177,13 @@ CGUIDialog::OnInitWindow(); } -void CGUIDialogSongInfo::SetUserrating(char rating) +void CGUIDialogSongInfo::SetRating(char rating) { if (rating < '0') rating = '0'; if (rating > '5') rating = '5'; - if (rating != m_song->GetMusicInfoTag()->GetUserrating()) + if (rating != m_song->GetMusicInfoTag()->GetRating()) { - m_song->GetMusicInfoTag()->SetUserrating(rating); + m_song->GetMusicInfoTag()->SetRating(rating); // send a message to all windows to tell them to update the fileitem (eg playlistplayer, media windows) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_ITEM, 0, m_song); g_windowManager.SendMessage(msg); @@ -180,7 +194,7 @@ { *m_song = *item; m_song->LoadMusicTag(); - m_startUserrating = m_song->GetMusicInfoTag()->GetUserrating(); + m_startRating = m_song->GetMusicInfoTag()->GetRating(); MUSIC_INFO::CMusicInfoLoader::LoadAdditionalTagInfo(m_song.get()); // set artist thumb as well CMusicDatabase db; @@ -287,7 +301,7 @@ } std::string result; - VECSOURCES sources(*CMediaSourceSettings::GetInstance().GetSources("music")); + VECSOURCES sources(*CMediaSourceSettings::Get().GetSources("music")); CGUIDialogMusicInfo::AddItemPathToFileBrowserSources(sources, *m_song); g_mediaManager.GetLocalDrives(sources); if (!CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(1030), result)) @@ -326,25 +340,3 @@ // m_hasUpdatedThumb = true; } - -void CGUIDialogSongInfo::OnSetUserrating() -{ - CGUIDialogSelect *dialog = (CGUIDialogSelect *)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); - if (dialog) - { - dialog->SetHeading(CVariant{ 38023 }); - dialog->Add(g_localizeStrings.Get(38022)); - for (int i = 1; i <= 5; i++) - dialog->Add(StringUtils::Format("%s: %i", g_localizeStrings.Get(563).c_str(), i)); - - dialog->SetSelected(m_song->GetMusicInfoTag()->GetUserrating()); - - dialog->Open(); - - int iItem = dialog->GetSelectedLabel(); - if (iItem < 0) - return; - - SetUserrating('0' + iItem); // This is casting the int rating to char - } -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogSongInfo.h kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogSongInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogSongInfo.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogSongInfo.h 2015-10-19 08:39:16.000000000 +0000 @@ -42,11 +42,10 @@ virtual void OnInitWindow(); bool DownloadThumbnail(const std::string &thumbFile); void OnGetThumb(); - void SetUserrating(char rating); - void OnSetUserrating(); + void SetRating(char rating); CFileItemPtr m_song; - char m_startUserrating; + char m_startRating; bool m_cancelled; bool m_needsUpdate; long m_albumId; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogVisualisationPresetList.cpp kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogVisualisationPresetList.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/GUIDialogVisualisationPresetList.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/GUIDialogVisualisationPresetList.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,14 +27,14 @@ #include "guilib/LocalizeStrings.h" #include "utils/StringUtils.h" -#define CONTROL_HEADER_LABEL 1 +#define CONTROL_HEADER_LABEL 2 #define CONTROL_NONE_AVAILABLE 4 -#define CONTROL_LIST 3 +#define CONTROL_LIST 5 using ADDON::CVisualisation; CGUIDialogVisualisationPresetList::CGUIDialogVisualisationPresetList(void) - : CGUIDialog(WINDOW_DIALOG_VIS_PRESET_LIST, "DialogSelect.xml") + : CGUIDialog(WINDOW_DIALOG_VIS_PRESET_LIST, "VisualisationPresetList.xml") { m_currentPreset = 0; m_vecPresets = new CFileItemList; @@ -158,15 +158,11 @@ // update our dialog's label SET_CONTROL_LABEL(CONTROL_HEADER_LABEL, strHeading); - // hide / show proper controls from DialogSelect (5: add more button, 6: detailed list) - SET_CONTROL_VISIBLE(CONTROL_LIST); - SET_CONTROL_HIDDEN(5); - SET_CONTROL_HIDDEN(6); + // if there is no presets, add a label saying so if (m_vecPresets->Size() == 0) { SET_CONTROL_VISIBLE(CONTROL_NONE_AVAILABLE); - SET_CONTROL_LABEL(CONTROL_NONE_AVAILABLE, 13389); } else { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/Makefile kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/music/dialogs/Makefile 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/dialogs/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -1,5 +1,6 @@ SRCS=GUIDialogMusicInfo.cpp \ GUIDialogMusicOSD.cpp \ + GUIDialogMusicOverlay.cpp \ GUIDialogSongInfo.cpp \ GUIDialogVisualisationPresetList.cpp \ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/GUIViewStateMusic.cpp kodi-15.2~git20151019.1039-final/xbmc/music/GUIViewStateMusic.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/GUIViewStateMusic.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/GUIViewStateMusic.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,6 @@ #include "guilib/WindowIDs.h" #include "guilib/LocalizeStrings.h" #include "utils/log.h" -#include "utils/SortUtils.h" #include "view/ViewStateSettings.h" #include "filesystem/Directory.h" @@ -45,8 +44,8 @@ bool CGUIViewStateWindowMusic::AutoPlayNextItem() { - return CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICPLAYER_AUTOPLAYNEXTITEM) && - !CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICPLAYER_QUEUEBYDEFAULT); + return CSettings::Get().GetBool("musicplayer.autoplaynextitem") && + !CSettings::Get().GetBool("musicplayer.queuebydefault"); } std::string CGUIViewStateWindowMusic::GetLockType() @@ -67,14 +66,28 @@ CGUIViewStateMusicSearch::CGUIViewStateMusicSearch(const CFileItemList& items) : CGUIViewStateWindowMusic(items) { + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.librarytrackformat"); + if (strTrackLeft.empty()) + strTrackLeft = CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.librarytrackformatright"); + if (strTrackRight.empty()) + strTrackRight = CSettings::Get().GetString("musicfiles.trackformatright"); + + std::string strAlbumLeft = g_advancedSettings.m_strMusicLibraryAlbumFormat; + if (strAlbumLeft.empty()) + strAlbumLeft = "%B"; // album + std::string strAlbumRight = g_advancedSettings.m_strMusicLibraryAlbumFormatRight; + if (strAlbumRight.empty()) + strAlbumRight = "%A"; // artist + SortAttribute sortAttribute = SortAttributeNone; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) + if (CSettings::Get().GetBool("filelists.ignorethewhensorting")) sortAttribute = SortAttributeIgnoreArticle; - AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D", "%L", "%A")); // Title - Artist, Duration | Label, Artist + AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D", "%L", "%A")); // Title, Artist, Duration| empty, empty SetSortMethod(SortByTitle); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavsongs"); + const CViewState *viewState = CViewStateSettings::Get().Get("musicnavsongs"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -83,7 +96,7 @@ void CGUIViewStateMusicSearch::SaveViewState() { - SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV, CViewStateSettings::GetInstance().Get("musicnavsongs")); + SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV, CViewStateSettings::Get().Get("musicnavsongs")); } CGUIViewStateMusicDatabase::CGUIViewStateMusicDatabase(const CFileItemList& items) : CGUIViewStateWindowMusic(items) @@ -91,15 +104,25 @@ CMusicDatabaseDirectory dir; NODE_TYPE NodeType=dir.GetDirectoryChildType(items.GetPath()); - std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_LIBRARYTRACKFORMAT); - if (strTrack.empty()) - strTrack = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - std::string strAlbum = g_advancedSettings.m_strMusicLibraryAlbumFormat; - if (strAlbum.empty()) - strAlbum = "%B"; // album - CLog::Log(LOGDEBUG,"Custom album format = [%s]", strAlbum.c_str()); + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.librarytrackformat"); + if (strTrackLeft.empty()) + strTrackLeft = CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.librarytrackformatright"); + if (strTrackRight.empty()) + strTrackRight = CSettings::Get().GetString("musicfiles.trackformatright"); + + std::string strAlbumLeft = g_advancedSettings.m_strMusicLibraryAlbumFormat; + if (strAlbumLeft.empty()) + strAlbumLeft = "%B"; // album + std::string strAlbumRight = g_advancedSettings.m_strMusicLibraryAlbumFormatRight; + if (strAlbumRight.empty()) + strAlbumRight = "%A"; // artist + + CLog::Log(LOGDEBUG,"Album format left = [%s]", strAlbumLeft.c_str()); + CLog::Log(LOGDEBUG,"Album format right = [%s]", strAlbumRight.c_str()); + SortAttribute sortAttribute = SortAttributeNone; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) + if (CSettings::Get().GetBool("filelists.ignorethewhensorting")) sortAttribute = SortAttributeIgnoreArticle; switch (NodeType) @@ -147,10 +170,9 @@ case NODE_TYPE_ARTIST: { AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%F", "", "%A", "")); // Filename, empty | Artist, empty - AddSortMethod(SortByDateAdded, sortAttribute, 570, LABEL_MASKS("%F", "", "%A", "%a")); // Filename, empty | Artist, dateAdded SetSortMethod(SortByArtist); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavartists"); + const CViewState *viewState = CViewStateSettings::Get().Get("musicnavartists"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } @@ -160,19 +182,13 @@ case NODE_TYPE_YEAR_ALBUM: { // album - AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%F", "", strAlbum, "%A")); // Filename, empty | Userdefined (default=%B), Artist + AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // artist - AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%F", "", strAlbum, "%A")); // Filename, empty | Userdefined, Artist - // artist / year - AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%F", "", strAlbum, "%A / %Y")); // Filename, empty | Userdefined, Artist / Year + AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // year - AddSortMethod(SortByYear, 562, LABEL_MASKS("%F", "", strAlbum, "%Y")); // Filename, empty | Userdefined, Year - // album date added - AddSortMethod(SortByDateAdded, sortAttribute, 570, LABEL_MASKS("%F", "", strAlbum, "%a")); // Filename, empty | Userdefined, dateAdded - // play count - AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%F", "", strAlbum, "%V")); // Filename, empty | Userdefined, Play count + AddSortMethod(SortByYear, 562, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavalbums"); + const CViewState *viewState = CViewStateSettings::Get().Get("musicnavalbums"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -180,41 +196,47 @@ break; case NODE_TYPE_ALBUM_RECENTLY_ADDED: { - AddSortMethod(SortByNone, 552, LABEL_MASKS("%F", "", strAlbum, "%a")); // Filename, empty | Userdefined, dateAdded + AddSortMethod(SortByNone, 552, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined SetSortMethod(SortByNone); - SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavalbums")->m_viewMode); + SetViewAsControl(CViewStateSettings::Get().Get("musicnavalbums")->m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_RECENTLY_ADDED_SONGS: { - AddSortMethod(SortByNone, 552, LABEL_MASKS(strTrack, "%a")); // Userdefined, dateAdded | empty, empty + AddSortMethod(SortByNone, 552, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined | empty, empty SetSortMethod(SortByNone); - SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavsongs")->m_viewMode); + SetViewAsControl(CViewStateSettings::Get().Get("musicnavsongs")->m_viewMode); SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_RECENTLY_PLAYED: { - AddSortMethod(SortByLastPlayed, 568, LABEL_MASKS("%F", "", strAlbum, "%p")); // Filename, empty | Userdefined, last played + AddSortMethod(SortByNone, 568, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined + SetSortMethod(SortByNone); - SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavalbums")->m_viewMode); + SetViewAsControl(CViewStateSettings::Get().Get("musicnavalbums")->m_viewMode); + + SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_RECENTLY_PLAYED_SONGS: { - AddSortMethod(SortByLastPlayed, 568, LABEL_MASKS(strTrack, "%p")); // Userdefined, last played | empty, empty + AddSortMethod(SortByNone, 568, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined | empty, empty + SetSortMethod(SortByNone); + + SetViewAsControl(CViewStateSettings::Get().Get("musicnavalbums")->m_viewMode); - SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavalbums")->m_viewMode); + SetSortOrder(SortOrderNone); } break; case NODE_TYPE_ALBUM_TOP100: { - AddSortMethod(SortByNone, 551, LABEL_MASKS("%F", "", strAlbum, "%V")); // Filename, empty | Userdefined, Play count + AddSortMethod(SortByNone, 551, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined SetSortMethod(SortByNone); SetViewAsControl(DEFAULT_VIEW_LIST); @@ -224,14 +246,12 @@ case NODE_TYPE_SINGLES: { AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty - AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A - %T", "%Y")); // Artist, Title, Year| empty, empty AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty - AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrack, "%D")); + AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); AddSortMethod(SortByTime, 180, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%T - %A", "%R")); // Title - Artist, Rating - AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T - %A", "%a")); // Title - Artist, DateAdded | empty, empty - const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavsongs"); + const CViewState *viewState = CViewStateSettings::Get().Get("musicnavsongs"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -242,19 +262,16 @@ case NODE_TYPE_YEAR_SONG: case NODE_TYPE_SONG: { - AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrack, "%D")); // Userdefined, Duration| empty, empty + AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined| empty, empty AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Title, Artist, Duration| empty, empty AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty - AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A - %T", "%Y")); // Artist, Title, Year| empty, empty - AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrack, "%D")); + AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); AddSortMethod(SortByTime, 180, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%T - %A", "%R")); // Title - Artist, Rating AddSortMethod(SortByYear, 562, LABEL_MASKS("%T - %A", "%Y")); // Title, Artist, Year - AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T - %A", "%a")); // Title - Artist, DateAdded | empty, empty - AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T - %A", "%V")); // Titel - Artist, PlayCount - const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavsongs"); + const CViewState *viewState = CViewStateSettings::Get().Get("musicnavsongs"); // the "All Albums" entries always default to SortByAlbum as this is most logical - user can always // change it and the change will be saved for this particular path if (dir.IsAllItem(items.GetPath())) @@ -262,6 +279,8 @@ else SetSortMethod(viewState->m_sortDescription); + AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T - %A", "%V")); // Titel - Artist, PlayCount + SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } @@ -271,7 +290,7 @@ AddSortMethod(SortByNone, 576, LABEL_MASKS("%T - %A", "%V")); SetSortMethod(SortByPlaycount); - SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavsongs")->m_viewMode); + SetViewAsControl(CViewStateSettings::Get().Get("musicnavsongs")->m_viewMode); SetSortOrder(SortOrderNone); } @@ -291,18 +310,28 @@ switch (NodeType) { case NODE_TYPE_ARTIST: - SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV, CViewStateSettings::GetInstance().Get("musicnavartists")); + SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV, CViewStateSettings::Get().Get("musicnavartists")); break; case NODE_TYPE_ALBUM_COMPILATIONS: case NODE_TYPE_ALBUM: case NODE_TYPE_YEAR_ALBUM: - SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV, CViewStateSettings::GetInstance().Get("musicnavalbums")); + SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV, CViewStateSettings::Get().Get("musicnavalbums")); + break; + case NODE_TYPE_ALBUM_RECENTLY_ADDED: + case NODE_TYPE_ALBUM_TOP100: + case NODE_TYPE_ALBUM_RECENTLY_PLAYED: + SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV); break; case NODE_TYPE_SINGLES: case NODE_TYPE_ALBUM_COMPILATIONS_SONGS: case NODE_TYPE_SONG: case NODE_TYPE_YEAR_SONG: - SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV, CViewStateSettings::GetInstance().Get("musicnavsongs")); + SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV, CViewStateSettings::Get().Get("musicnavsongs")); + break; + case NODE_TYPE_ALBUM_RECENTLY_PLAYED_SONGS: + case NODE_TYPE_ALBUM_RECENTLY_ADDED_SONGS: + case NODE_TYPE_SONG_TOP100: + SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV); break; default: SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV); @@ -313,56 +342,59 @@ CGUIViewStateMusicSmartPlaylist::CGUIViewStateMusicSmartPlaylist(const CFileItemList& items) : CGUIViewStateWindowMusic(items) { SortAttribute sortAttribute = SortAttributeNone; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) + if (CSettings::Get().GetBool("filelists.ignorethewhensorting")) sortAttribute = SortAttributeIgnoreArticle; - const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavsongs"); + const CViewState *viewState = CViewStateSettings::Get().Get("musicnavsongs"); if (items.GetContent() == "songs" || items.GetContent() == "mixed") { - std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrack, "%D")); // Userdefined, Duration| empty, empty + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.trackformatright"); + + AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined| empty, empty AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Titel, Artist, Duration| empty, empty AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Titel, Duration| empty, empty - AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A - %T", "%Y")); // Artist, Titel, Year| empty, empty - AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrack, "%D")); + AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); AddSortMethod(SortByTime, 180, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%T - %A", "%R")); // Titel, Artist, Rating| empty, empty if (items.IsSmartPlayList() || items.IsLibraryFolder()) - AddPlaylistOrder(items, LABEL_MASKS(strTrack, "%D")); + AddPlaylistOrder(items, LABEL_MASKS(strTrackLeft, strTrackRight)); else { SetSortMethod(viewState->m_sortDescription); SetSortOrder(viewState->m_sortDescription.sortOrder); } - SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavsongs")->m_viewMode); + SetViewAsControl(CViewStateSettings::Get().Get("musicnavsongs")->m_viewMode); } else if (items.GetContent() == "albums") { - std::string strAlbum = g_advancedSettings.m_strMusicLibraryAlbumFormat; - if (strAlbum.empty()) - strAlbum = "%B"; // album + std::string strAlbumLeft = g_advancedSettings.m_strMusicLibraryAlbumFormat; + if (strAlbumLeft.empty()) + strAlbumLeft = "%B"; // album + std::string strAlbumRight = g_advancedSettings.m_strMusicLibraryAlbumFormatRight; + if (strAlbumRight.empty()) + strAlbumRight = "%A"; // artist + // album - AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%F", "", strAlbum, "%A")); // Filename, empty | Userdefined (default=%B), Artist + AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // artist - AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%F", "", strAlbum, "%A")); // Filename, empty | Userdefined, Artist - // artist / year - AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%F", "", strAlbum, "%A / %Y")); // Filename, empty | Userdefined, Artist / Year + AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); // Filename, empty | Userdefined, Userdefined // year - AddSortMethod(SortByYear, 562, LABEL_MASKS("%F", "", strAlbum, "%Y")); + AddSortMethod(SortByYear, 562, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); if (items.IsSmartPlayList() || items.IsLibraryFolder()) - AddPlaylistOrder(items, LABEL_MASKS("%F", "", strAlbum, "%D")); + AddPlaylistOrder(items, LABEL_MASKS("%F", "", strAlbumLeft, strAlbumRight)); else { SetSortMethod(viewState->m_sortDescription); SetSortOrder(viewState->m_sortDescription.sortOrder); } - SetViewAsControl(CViewStateSettings::GetInstance().Get("musicnavalbums")->m_viewMode); + SetViewAsControl(CViewStateSettings::Get().Get("musicnavalbums")->m_viewMode); } else { @@ -374,28 +406,29 @@ void CGUIViewStateMusicSmartPlaylist::SaveViewState() { - SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV, CViewStateSettings::GetInstance().Get("musicnavsongs")); + SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_NAV, CViewStateSettings::Get().Get("musicnavsongs")); } CGUIViewStateMusicPlaylist::CGUIViewStateMusicPlaylist(const CFileItemList& items) : CGUIViewStateWindowMusic(items) { SortAttribute sortAttribute = SortAttributeNone; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) + if (CSettings::Get().GetBool("filelists.ignorethewhensorting")) sortAttribute = SortAttributeIgnoreArticle; - - std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - AddSortMethod(SortByPlaylistOrder, 559, LABEL_MASKS(strTrack, "%D")); - AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrack, "%D")); // Userdefined, Duration| empty, empty + + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.trackformatright"); + + AddSortMethod(SortByPlaylistOrder, 559, LABEL_MASKS(strTrackLeft, strTrackRight)); + AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined| empty, empty AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Titel, Artist, Duration| empty, empty AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Titel, Duration| empty, empty - AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A - %T", "%Y")); // Artist, Titel, Year| empty, empty - AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrack, "%D")); + AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS(strTrackLeft, strTrackRight)); AddSortMethod(SortByTime, 180, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%T - %A", "%R")); // Titel, Artist, Rating| empty, empty SetSortMethod(SortByPlaylistOrder); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicfiles"); + const CViewState *viewState = CViewStateSettings::Get().Get("musicfiles"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -410,7 +443,7 @@ CGUIViewStateWindowMusicNav::CGUIViewStateWindowMusicNav(const CFileItemList& items) : CGUIViewStateWindowMusic(items) { SortAttribute sortAttribute = SortAttributeNone; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) + if (CSettings::Get().GetBool("filelists.ignorethewhensorting")) sortAttribute = SortAttributeIgnoreArticle; if (items.IsVirtualDirectoryRoot()) @@ -424,20 +457,20 @@ } else { - if (items.IsVideoDb() && items.Size() > (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS)?1:0)) + if (items.IsVideoDb() && items.Size() > (CSettings::Get().GetBool("filelists.showparentdiritems")?1:0)) { XFILE::VIDEODATABASEDIRECTORY::CQueryParams params; - XFILE::CVideoDatabaseDirectory::GetQueryParams(items[CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS)?1:0]->GetPath(),params); + XFILE::CVideoDatabaseDirectory::GetQueryParams(items[CSettings::Get().GetBool("filelists.showparentdiritems")?1:0]->GetPath(),params); if (params.GetMVideoId() != -1) { AddSortMethod(SortByLabel, sortAttribute, 551, LABEL_MASKS("%T", "%Y")); // Filename, Duration | Foldername, empty AddSortMethod(SortByYear, 562, LABEL_MASKS("%T", "%Y")); AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%Y")); - AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A - %T", "%Y")); AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%B - %T", "%Y")); - std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrack, "%D")); // Userdefined, Duration| empty, empty + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.trackformatright"); + AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined| empty, empty } else { @@ -447,30 +480,10 @@ } else { - //In navigation of music files tag data is scanned whenever present and can be used as sort criteria - //hence sort methods available are similar to song node (not the same as only tag data) - //Unfortunately anything here appears at all levels of file navigation even if no song files there. - std::string strTrack = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_LIBRARYTRACKFORMAT); - if (strTrack.empty()) - strTrack = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - AddSortMethod(SortByLabel, 551, LABEL_MASKS(strTrack, "%D", "%L", ""), // Userdefined, Duration | FolderName, empty - CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); - AddSortMethod(SortBySize, 553, LABEL_MASKS("%F", "%I", "%L", "%I")); // Filename, Size | Foldername, Size - AddSortMethod(SortByDate, 552, LABEL_MASKS("%F", "%J", "%L", "%J")); // Filename, Date | Foldername, Date - AddSortMethod(SortByFile, 561, LABEL_MASKS("%F", "%I", "%L", "")); // Filename, Size | Label, empty - AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrack, "%D")); // Userdefined, Duration| empty, empty - AddSortMethod(SortByTitle, sortAttribute, 556, LABEL_MASKS("%T - %A", "%D")); // Title, Artist, Duration| empty, empty - AddSortMethod(SortByAlbum, sortAttribute, 558, LABEL_MASKS("%B - %T - %A", "%D")); // Album, Title, Artist, Duration| empty, empty - AddSortMethod(SortByArtist, sortAttribute, 557, LABEL_MASKS("%A - %T", "%D")); // Artist, Title, Duration| empty, empty - AddSortMethod(SortByArtistThenYear, sortAttribute, 578, LABEL_MASKS("%A - %T", "%Y")); // Artist(year), Title, Year| empty, empty - AddSortMethod(SortByTime, 180, LABEL_MASKS("%T - %A", "%D")); // Titel, Artist, Duration| empty, empty - AddSortMethod(SortByYear, 562, LABEL_MASKS("%T - %A", "%Y")); // Title, Artist, Year - + AddSortMethod(SortByLabel, 551, LABEL_MASKS("%F", "%D", "%L", "")); // Filename, Duration | Foldername, empty SetSortMethod(SortByLabel); } - const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicnavsongs"); - SetViewAsControl(viewState->m_viewMode); - SetSortOrder(viewState->m_sortDescription.sortOrder); + SetViewAsControl(DEFAULT_VIEW_LIST); SetSortOrder(SortOrderAscending); } @@ -487,7 +500,7 @@ if (!g_advancedSettings.m_bVirtualShares) return; - VECSOURCES *musicSources = CMediaSourceSettings::GetInstance().GetSources("music"); + VECSOURCES *musicSources = CMediaSourceSettings::Get().GetSources("music"); for (int i = 0; i < (int)musicSources->size(); ++i) { @@ -537,16 +550,18 @@ } else { - std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - AddSortMethod(SortByLabel, 551, LABEL_MASKS(strTrack, "%D", "%L", ""), // Userdefined, Duration | FolderName, empty - CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); - AddSortMethod(SortBySize, 553, LABEL_MASKS(strTrack, "%I", "%L", "%I")); // Userdefined, Size | FolderName, Size - AddSortMethod(SortByBitrate, 623, LABEL_MASKS(strTrack, "%X", "%L", "%X")); // Userdefined, Bitrate | FolderName, Bitrate - AddSortMethod(SortByDate, 552, LABEL_MASKS(strTrack, "%J", "%L", "%J")); // Userdefined, Date | FolderName, Date - AddSortMethod(SortByFile, 561, LABEL_MASKS(strTrack, "%F", "%L", "")); // Userdefined, FileName | FolderName, empty - AddSortMethod(SortByListeners, 20455,LABEL_MASKS(strTrack, "%W", "%L", "%W")); + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.trackformatright"); + + AddSortMethod(SortByLabel, 551, LABEL_MASKS(strTrackLeft, strTrackRight, "%L", ""), // Userdefined, Userdefined | FolderName, empty + CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); + AddSortMethod(SortBySize, 553, LABEL_MASKS(strTrackLeft, "%I", "%L", "%I")); // Userdefined, Size | FolderName, Size + AddSortMethod(SortByBitrate, 623, LABEL_MASKS(strTrackLeft, "%X", "%L", "%X")); // Userdefined, Bitrate | FolderName, Bitrate + AddSortMethod(SortByDate, 552, LABEL_MASKS(strTrackLeft, "%J", "%L", "%J")); // Userdefined, Date | FolderName, Date + AddSortMethod(SortByFile, 561, LABEL_MASKS(strTrackLeft, strTrackRight, "%L", "")); // Userdefined, Userdefined | FolderName, empty + AddSortMethod(SortByListeners, 20455,LABEL_MASKS(strTrackLeft, "%W", "%L", "%W")); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("musicfiles"); + const CViewState *viewState = CViewStateSettings::Get().Get("musicfiles"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -556,23 +571,26 @@ void CGUIViewStateWindowMusicSongs::SaveViewState() { - SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_FILES, CViewStateSettings::GetInstance().Get("musicfiles")); + SaveViewToDb(m_items.GetPath(), WINDOW_MUSIC_FILES, CViewStateSettings::Get().Get("musicfiles")); } VECSOURCES& CGUIViewStateWindowMusicSongs::GetSources() { - VECSOURCES *musicSources = CMediaSourceSettings::GetInstance().GetSources("music"); + VECSOURCES *musicSources = CMediaSourceSettings::Get().GetSources("music"); AddOrReplace(*musicSources, CGUIViewStateWindowMusic::GetSources()); return *musicSources; } CGUIViewStateWindowMusicPlaylist::CGUIViewStateWindowMusicPlaylist(const CFileItemList& items) : CGUIViewStateWindowMusic(items) { - std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_NOWPLAYINGTRACKFORMAT); - if (strTrack.empty()) - strTrack = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.nowplayingtrackformat"); + if (strTrackLeft.empty()) + strTrackLeft = CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.nowplayingtrackformatright"); + if (strTrackRight.empty()) + strTrackRight = CSettings::Get().GetString("musicfiles.trackformatright"); - AddSortMethod(SortByNone, 551, LABEL_MASKS(strTrack, "%D", "%L", "")); // Userdefined, Duration | FolderName, empty + AddSortMethod(SortByNone, 551, LABEL_MASKS(strTrackLeft, strTrackRight, "%L", "")); // Userdefined, Userdefined | FolderName, empty SetSortMethod(SortByNone); SetViewAsControl(DEFAULT_VIEW_LIST); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/infoscanner/MusicAlbumInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/music/infoscanner/MusicAlbumInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/infoscanner/MusicAlbumInfo.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/infoscanner/MusicAlbumInfo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,6 +23,7 @@ #include "utils/StringUtils.h" #include "settings/AdvancedSettings.h" +using namespace std; using namespace MUSIC_GRABBER; CMusicAlbumInfo::CMusicAlbumInfo(const std::string& strAlbumInfo, const CScraperUrl& strAlbumURL): @@ -37,8 +38,7 @@ const std::string& strAlbumInfo, const CScraperUrl& strAlbumURL) { m_album.strAlbum = strAlbum; - //Just setting artist desc, not populating album artist credits. - m_album.strArtistDesc = strArtist; + m_album.artist = StringUtils::Split(strArtist, g_advancedSettings.m_musicItemSeparator); m_strTitle2 = strAlbumInfo; m_albumURL = strAlbumURL; m_relevance = -1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/infoscanner/MusicArtistInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/music/infoscanner/MusicArtistInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/infoscanner/MusicArtistInfo.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/infoscanner/MusicArtistInfo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,6 +21,7 @@ #include "MusicArtistInfo.h" #include "addons/Scraper.h" +using namespace std; using namespace XFILE; using namespace MUSIC_GRABBER; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/infoscanner/MusicInfoScanner.cpp kodi-15.2~git20151019.1039-final/xbmc/music/infoscanner/MusicInfoScanner.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/infoscanner/MusicInfoScanner.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/infoscanner/MusicInfoScanner.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,46 +18,42 @@ * */ +#include "threads/SystemClock.h" #include "MusicInfoScanner.h" - -#include -#include - -#include "addons/AddonManager.h" -#include "addons/Scraper.h" -#include "dialogs/GUIDialogExtendedProgressBar.h" -#include "dialogs/GUIDialogProgress.h" -#include "dialogs/GUIDialogSelect.h" -#include "events/EventLog.h" -#include "events/MediaLibraryEvent.h" -#include "FileItem.h" -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "filesystem/MusicDatabaseDirectory.h" -#include "filesystem/MusicDatabaseDirectory/DirectoryNode.h" -#include "GUIInfoManager.h" -#include "guilib/GUIKeyboardFactory.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "GUIUserMessages.h" -#include "interfaces/AnnouncementManager.h" -#include "music/MusicThumbLoader.h" -#include "music/tags/MusicInfoTag.h" #include "music/tags/MusicInfoTagLoaderFactory.h" #include "MusicAlbumInfo.h" #include "MusicInfoScraper.h" +#include "filesystem/MusicDatabaseDirectory.h" +#include "filesystem/MusicDatabaseDirectory/DirectoryNode.h" +#include "Util.h" +#include "utils/md5.h" +#include "GUIInfoManager.h" #include "NfoFile.h" +#include "music/tags/MusicInfoTag.h" +#include "guilib/GUIWindowManager.h" +#include "dialogs/GUIDialogExtendedProgressBar.h" +#include "dialogs/GUIDialogProgress.h" +#include "dialogs/GUIDialogSelect.h" +#include "guilib/GUIKeyboardFactory.h" +#include "filesystem/File.h" +#include "filesystem/Directory.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" -#include "TextureCache.h" -#include "threads/SystemClock.h" -#include "Util.h" -#include "utils/log.h" -#include "utils/md5.h" +#include "FileItem.h" +#include "guilib/LocalizeStrings.h" #include "utils/StringUtils.h" +#include "utils/log.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" +#include "TextureCache.h" +#include "music/MusicThumbLoader.h" +#include "interfaces/AnnouncementManager.h" +#include "GUIUserMessages.h" +#include "addons/AddonManager.h" +#include "addons/Scraper.h" + +#include +using namespace std; using namespace MUSIC_INFO; using namespace XFILE; using namespace MUSICDATABASEDIRECTORY; @@ -81,7 +77,7 @@ void CMusicInfoScanner::Process() { - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnScanStarted"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnScanStarted"); try { if (m_bClean) @@ -96,7 +92,7 @@ m_musicDatabase.Open(); - if (m_showDialog && !CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_BACKGROUNDUPDATE)) + if (m_showDialog && !CSettings::Get().GetBool("musiclibrary.backgroundupdate")) { CGUIDialogExtendedProgressBar* dialog = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); @@ -194,7 +190,7 @@ if (m_handle) { float percentage = (float) std::distance(it, m_pathsToScan.end()) / m_pathsToScan.size(); - m_handle->SetText(album.GetAlbumArtistString() + " - " + album.strAlbum); + m_handle->SetText(StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator) + " - " + album.strAlbum); m_handle->SetPercentage(percentage); } @@ -250,7 +246,7 @@ CLog::Log(LOGDEBUG, "%s - Finished scan", __FUNCTION__); m_bRunning = false; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnScanFinished"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnScanFinished"); // we need to clear the musicdb cache and update any active lists CUtil::DeleteMusicDatabaseDirectoryCache(); @@ -393,12 +389,12 @@ return m_bRunning; } -void CMusicInfoScanner::Stop(bool wait /* = false*/) +void CMusicInfoScanner::Stop() { if (m_bCanInterrupt) m_musicDatabase.Interupt(); - StopThread(wait); + StopThread(false); } void CMusicInfoScanner::CleanDatabase(bool showProgress /* = true */) @@ -439,7 +435,7 @@ m_seenPaths.insert(strDirectory); // Discard all excluded files defined by m_musicExcludeRegExps - std::vector regexps = g_advancedSettings.m_audioExcludeFromScanRegExps; + vector regexps = g_advancedSettings.m_audioExcludeFromScanRegExps; if (CUtil::ExcludeFileOrFolder(strDirectory, regexps)) return true; @@ -459,9 +455,9 @@ if ((m_flags & SCAN_RESCAN) || !m_musicDatabase.GetPathHash(strDirectory, dbHash) || dbHash != hash) { // path has changed - rescan if (dbHash.empty()) - CLog::Log(LOGDEBUG, "%s Scanning dir '%s' as not in the database", __FUNCTION__, CURL::GetRedacted(strDirectory).c_str()); + CLog::Log(LOGDEBUG, "%s Scanning dir '%s' as not in the database", __FUNCTION__, strDirectory.c_str()); else - CLog::Log(LOGDEBUG, "%s Rescanning dir '%s' due to change", __FUNCTION__, CURL::GetRedacted(strDirectory).c_str()); + CLog::Log(LOGDEBUG, "%s Rescanning dir '%s' due to change", __FUNCTION__, strDirectory.c_str()); // filter items in the sub dir (for .cue sheet support) items.FilterCueItems(); @@ -479,7 +475,7 @@ } else { // path is the same - no need to rescan - CLog::Log(LOGDEBUG, "%s Skipping dir '%s' due to no change", __FUNCTION__, CURL::GetRedacted(strDirectory).c_str()); + CLog::Log(LOGDEBUG, "%s Skipping dir '%s' due to no change", __FUNCTION__, strDirectory.c_str()); m_currentItem += CountFiles(items, false); // false for non-recursive // updated the dialog with our progress @@ -514,7 +510,7 @@ INFO_RET CMusicInfoScanner::ScanTags(const CFileItemList& items, CFileItemList& scannedItems) { - std::vector regexps = g_advancedSettings.m_audioExcludeFromScanRegExps; + vector regexps = g_advancedSettings.m_audioExcludeFromScanRegExps; for (int i = 0; i < items.Size(); ++i) { @@ -534,7 +530,7 @@ CMusicInfoTag& tag = *pItem->GetMusicInfoTag(); if (!tag.Loaded()) { - std::unique_ptr pLoader (CMusicInfoTagLoaderFactory::CreateLoader(*pItem)); + unique_ptr pLoader (CMusicInfoTagLoaderFactory::CreateLoader(*pItem)); if (NULL != pLoader.get()) pLoader->Load(pItem->GetPath(), tag); } @@ -573,7 +569,7 @@ * If they're MB tagged, create albums directly from the FileItems. * If they're non-MB tagged, index them by album name ready for step 2. */ - std::map songsByAlbumNames; + map songsByAlbumNames; for (int i = 0; i < items.Size(); ++i) { CMusicInfoTag& tag = *items[i]->GetMusicInfoTag(); @@ -587,6 +583,7 @@ { song.iTimesPlayed = it->second.iTimesPlayed; song.lastPlayed = it->second.lastPlayed; + song.iKaraokeNumber = it->second.iKaraokeNumber; if (song.rating == '0') song.rating = it->second.rating; if (song.strThumb.empty()) song.strThumb = it->second.strThumb; } @@ -617,7 +614,7 @@ In the case where the album artist is unknown, we use the primary artist (i.e. first artist from each song). */ - for (std::map::iterator songsByAlbumName = songsByAlbumNames.begin(); songsByAlbumName != songsByAlbumNames.end(); ++songsByAlbumName) + for (map::iterator songsByAlbumName = songsByAlbumNames.begin(); songsByAlbumName != songsByAlbumNames.end(); ++songsByAlbumName) { VECSONGS &songs = songsByAlbumName->second; // sort the songs by tracknumber to identify duplicate track numbers @@ -628,7 +625,7 @@ bool hasAlbumArtist = false; bool isCompilation = true; - std::map > artists; + map > artists; for (VECSONGS::iterator song = songs.begin(); song != songs.end(); ++song) { // test for song overlap @@ -639,14 +636,14 @@ isCompilation = false; // get primary artist - std::string primary; - if (!song->GetAlbumArtist().empty()) + string primary; + if (!song->albumArtist.empty()) { - primary = song->GetAlbumArtist()[0]; + primary = song->albumArtist[0]; hasAlbumArtist = true; } - else if (!song->artistCredits.empty()) - primary = song->artistCredits.begin()->GetArtist(); + else if (!song->artist.empty()) + primary = song->artist[0]; // add to the artist map artists[primary].push_back(&(*song)); @@ -663,7 +660,7 @@ bool compilation = !songsByAlbumName->first.empty() && (isCompilation || !tracksOverlap); // 1+2b+2a if (artists.size() == 1) { - std::string artist = artists.begin()->first; StringUtils::ToLower(artist); + string artist = artists.begin()->first; StringUtils::ToLower(artist); if (!StringUtils::EqualsNoCase(artist, "various") && !StringUtils::EqualsNoCase(artist, "various artists")) // 3a compilation = false; @@ -676,10 +673,10 @@ CLog::Log(LOGDEBUG, "Album '%s' is a compilation as there's no overlapping tracks and %s", songsByAlbumName->first.c_str(), hasAlbumArtist ? "the album artist is 'Various'" : "there is more than one unique artist"); artists.clear(); std::string various = g_localizeStrings.Get(340); // Various Artists - std::vector va; va.push_back(various); + vector va; va.push_back(various); for (VECSONGS::iterator song = songs.begin(); song != songs.end(); ++song) { - song->SetAlbumArtist(va); + song->albumArtist = va; artists[various].push_back(&(*song)); } } @@ -688,15 +685,15 @@ Step 3: Find the common albumartist for each song and assign albumartist to those tracks that don't have it set. */ - for (std::map >::iterator j = artists.begin(); j != artists.end(); ++j) + for (map >::iterator j = artists.begin(); j != artists.end(); ++j) { // find the common artist for these songs - std::vector &artistSongs = j->second; - std::vector common = artistSongs.front()->GetAlbumArtist().empty() ? artistSongs.front()->GetArtist() : artistSongs.front()->GetAlbumArtist(); - for (std::vector::iterator k = artistSongs.begin() + 1; k != artistSongs.end(); ++k) + vector &artistSongs = j->second; + vector common = artistSongs.front()->albumArtist.empty() ? artistSongs.front()->artist : artistSongs.front()->albumArtist; + for (vector::iterator k = artistSongs.begin() + 1; k != artistSongs.end(); ++k) { unsigned int match = 0; - std::vector compare = (*k)->GetAlbumArtist().empty() ? (*k)->GetArtist() : (*k)->GetAlbumArtist(); + vector &compare = (*k)->albumArtist.empty() ? (*k)->artist : (*k)->albumArtist; for (; match < common.size() && match < compare.size(); match++) { if (compare[match] != common[match]) @@ -711,17 +708,18 @@ */ CAlbum album; album.strAlbum = songsByAlbumName->first; - for (std::vector::iterator it = common.begin(); it != common.end(); ++it) + album.artist = common; + for (vector::iterator it = common.begin(); it != common.end(); ++it) { std::string strJoinPhrase = (it == --common.end() ? "" : g_advancedSettings.m_musicItemSeparator); CArtistCredit artistCredit(*it, strJoinPhrase); album.artistCredits.push_back(artistCredit); } album.bCompilation = compilation; - for (std::vector::iterator k = artistSongs.begin(); k != artistSongs.end(); ++k) + for (vector::iterator k = artistSongs.begin(); k != artistSongs.end(); ++k) { - if ((*k)->GetAlbumArtist().empty()) - (*k)->SetAlbumArtist(common); + if ((*k)->albumArtist.empty()) + (*k)->albumArtist = common; // TODO: in future we may wish to union up the genres, for now we assume they're the same album.genre = (*k)->genre; // in addition, we may want to use year as discriminating for albums @@ -753,10 +751,10 @@ ADDON::AddonPtr addon; ADDON::ScraperPtr albumScraper; ADDON::ScraperPtr artistScraper; - if(ADDON::CAddonMgr::GetInstance().GetDefault(ADDON::ADDON_SCRAPER_ALBUMS, addon)) + if(ADDON::CAddonMgr::Get().GetDefault(ADDON::ADDON_SCRAPER_ALBUMS, addon)) albumScraper = std::dynamic_pointer_cast(addon); - if(ADDON::CAddonMgr::GetInstance().GetDefault(ADDON::ADDON_SCRAPER_ARTISTS, addon)) + if(ADDON::CAddonMgr::Get().GetDefault(ADDON::ADDON_SCRAPER_ARTISTS, addon)) artistScraper = std::dynamic_pointer_cast(addon); // Add each album @@ -965,30 +963,22 @@ { if (pDialog && bAllowSelection) { - if (!CGUIKeyboardFactory::ShowAndGetInput(album.strAlbum, CVariant{g_localizeStrings.Get(16011)}, false)) + if (!CGUIKeyboardFactory::ShowAndGetInput(album.strAlbum, g_localizeStrings.Get(16011), false)) return INFO_CANCELLED; - std::string strTempArtist(album.GetAlbumArtistString()); - if (!CGUIKeyboardFactory::ShowAndGetInput(strTempArtist, CVariant{g_localizeStrings.Get(16025)}, false)) + std::string strTempArtist(StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator)); + if (!CGUIKeyboardFactory::ShowAndGetInput(strTempArtist, g_localizeStrings.Get(16025), false)) return INFO_CANCELLED; - album.strArtistDesc = strTempArtist; + album.artist = StringUtils::Split(strTempArtist, g_advancedSettings.m_musicItemSeparator); goto loop; } - else - { - CEventLog::GetInstance().Add(EventPtr(new CMediaLibraryEvent( - MediaTypeAlbum, album.strPath, 24146, - StringUtils::Format(g_localizeStrings.Get(24147).c_str(), MediaTypeAlbum, album.strAlbum.c_str()), - CScraperUrl::GetThumbURL(album.thumbURL.GetFirstThumb()), CURL::GetRedacted(album.strPath), EventLevelWarning))); - } } else if (albumDownloadStatus == INFO_ADDED) { - bool overridetags = CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_OVERRIDETAGS); - album.MergeScrapedAlbum(albumInfo.GetAlbum(), overridetags); + album.MergeScrapedAlbum(albumInfo.GetAlbum(), CSettings::Get().GetBool("musiclibrary.overridetags")); m_musicDatabase.Open(); - m_musicDatabase.UpdateAlbum(album, overridetags); + m_musicDatabase.UpdateAlbum(album); GetAlbumArtwork(album.idAlbum, album); m_musicDatabase.Close(); albumInfo.SetLoaded(true); @@ -1010,21 +1000,14 @@ { if (pDialog && bAllowSelection) { - if (!CGUIKeyboardFactory::ShowAndGetInput(artist.strArtist, CVariant{g_localizeStrings.Get(16025)}, false)) + if (!CGUIKeyboardFactory::ShowAndGetInput(artist.strArtist, g_localizeStrings.Get(16025), false)) return INFO_CANCELLED; goto loop; } - else - { - CEventLog::GetInstance().Add(EventPtr(new CMediaLibraryEvent( - MediaTypeArtist, artist.strPath, 24146, - StringUtils::Format(g_localizeStrings.Get(24147).c_str(), MediaTypeArtist, artist.strArtist.c_str()), - CScraperUrl::GetThumbURL(artist.thumbURL.GetFirstThumb()), CURL::GetRedacted(artist.strPath), EventLevelWarning))); - } } else if (artistDownloadStatus == INFO_ADDED) { - artist.MergeScrapedArtist(artistInfo.GetArtist(), CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_OVERRIDETAGS)); + artist.MergeScrapedArtist(artistInfo.GetArtist(), CSettings::Get().GetBool("musiclibrary.overridetags")); m_musicDatabase.Open(); m_musicDatabase.UpdateArtist(artist); m_musicDatabase.GetArtistPath(artist.idArtist, artist.strPath); @@ -1042,7 +1025,7 @@ if (m_handle) { m_handle->SetTitle(StringUtils::Format(g_localizeStrings.Get(20321).c_str(), info->Name().c_str())); - m_handle->SetText(album.GetAlbumArtistString() + " - " + album.strAlbum); + m_handle->SetText(StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator) + " - " + album.strAlbum); } // clear our scraper cache @@ -1072,7 +1055,7 @@ CNfoFile nfoReader; if (XFILE::CFile::Exists(strNfo)) { - CLog::Log(LOGDEBUG,"Found matching nfo file: %s", CURL::GetRedacted(strNfo).c_str()); + CLog::Log(LOGDEBUG,"Found matching nfo file: %s", strNfo.c_str()); result = nfoReader.Create(strNfo, info); if (result == CNfoFile::FULL_NFO) { @@ -1095,7 +1078,7 @@ CLog::Log(LOGERROR,"Unable to find an url in nfo file: %s", strNfo.c_str()); } - if (!scraper.CheckValidOrFallback(CSettings::GetInstance().GetString(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER))) + if (!scraper.CheckValidOrFallback(CSettings::Get().GetString("musiclibrary.albumsscraper"))) { // the current scraper is invalid, as is the default - bail CLog::Log(LOGERROR, "%s - current and default scrapers are invalid. Pick another one", __FUNCTION__); return INFO_ERROR; @@ -1103,7 +1086,7 @@ if (!scraper.GetAlbumCount()) { - scraper.FindAlbumInfo(album.strAlbum, album.GetAlbumArtistString()); + scraper.FindAlbumInfo(album.strAlbum, StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator)); while (!scraper.Completed()) { @@ -1131,7 +1114,7 @@ if (pDialog) { pDlg = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); - pDlg->SetHeading(CVariant{g_localizeStrings.Get(181)}); + pDlg->SetHeading(g_localizeStrings.Get(181).c_str()); pDlg->Reset(); pDlg->EnableButton(true, 413); // manual } @@ -1141,13 +1124,11 @@ CMusicAlbumInfo& info = scraper.GetAlbum(i); double relevance = info.GetRelevance(); if (relevance < 0) - relevance = CUtil::AlbumRelevance(info.GetAlbum().strAlbum, album.strAlbum, - info.GetAlbum().GetAlbumArtistString(), - album.GetAlbumArtistString()); + relevance = CUtil::AlbumRelevance(info.GetAlbum().strAlbum, album.strAlbum, StringUtils::Join(info.GetAlbum().artist, g_advancedSettings.m_musicItemSeparator), StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator)); // if we're doing auto-selection (ie querying all albums at once, then allow 95->100% for perfect matches) // otherwise, perfect matches only - if (relevance >= std::max(minRelevance, bestRelevance)) + if (relevance >= max(minRelevance, bestRelevance)) { // we auto-select the best of these bestRelevance = relevance; iSelectedAlbum = i; @@ -1158,7 +1139,7 @@ std::string strTemp = StringUtils::Format("[%0.2f] %s", relevance, info.GetTitle2().c_str()); CFileItem item(strTemp); item.m_idepth = i; // use this to hold the index of the album in the scraper - pDlg->Add(item); + pDlg->Add(&item); } if (relevance > .99f) // we're so close, no reason to search further break; @@ -1167,7 +1148,7 @@ if (pDialog && bestRelevance < THRESHOLD) { pDlg->Sort(false); - pDlg->Open(); + pDlg->DoModal(); // and wait till user selects one if (pDlg->GetSelectedLabel() < 0) @@ -1177,22 +1158,19 @@ // manual button pressed std::string strNewAlbum = album.strAlbum; - if (!CGUIKeyboardFactory::ShowAndGetInput(strNewAlbum, CVariant{g_localizeStrings.Get(16011)}, false)) - return INFO_CANCELLED; - if (strNewAlbum == "") - return INFO_CANCELLED; + if (!CGUIKeyboardFactory::ShowAndGetInput(strNewAlbum, g_localizeStrings.Get(16011), false)) return INFO_CANCELLED; + if (strNewAlbum == "") return INFO_CANCELLED; - std::string strNewArtist = album.GetAlbumArtistString(); - if (!CGUIKeyboardFactory::ShowAndGetInput(strNewArtist, CVariant{g_localizeStrings.Get(16025)}, false)) - return INFO_CANCELLED; + std::string strNewArtist = StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator); + if (!CGUIKeyboardFactory::ShowAndGetInput(strNewArtist, g_localizeStrings.Get(16025), false)) return INFO_CANCELLED; - pDialog->SetLine(0, CVariant{strNewAlbum}); - pDialog->SetLine(1, CVariant{strNewArtist}); + pDialog->SetLine(0, strNewAlbum); + pDialog->SetLine(1, strNewArtist); pDialog->Progress(); CAlbum newAlbum = album; newAlbum.strAlbum = strNewAlbum; - newAlbum.strArtistDesc = strNewArtist; + newAlbum.artist = StringUtils::Split(strNewArtist, g_advancedSettings.m_musicItemSeparator); return DownloadAlbumInfo(newAlbum, info, albumInfo, pDialog); } @@ -1206,8 +1184,8 @@ if (relevance < 0) relevance = CUtil::AlbumRelevance(info.GetAlbum().strAlbum, album.strAlbum, - info.GetAlbum().GetAlbumArtistString(), - album.GetAlbumArtistString()); + StringUtils::Join(info.GetAlbum().artist, g_advancedSettings.m_musicItemSeparator), + StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator)); if (relevance < THRESHOLD) return INFO_NOT_FOUND; @@ -1248,10 +1226,10 @@ { if (m_musicDatabase.GetArtForItem(id, MediaTypeAlbum, "thumb").empty()) { - std::string thumb = CScraperUrl::GetThumbURL(album.thumbURL.GetFirstThumb()); + string thumb = CScraperUrl::GetThumbURL(album.thumbURL.GetFirstThumb()); if (!thumb.empty()) { - CTextureCache::GetInstance().BackgroundCacheImage(thumb); + CTextureCache::Get().BackgroundCacheImage(thumb); m_musicDatabase.SetArtForItem(id, MediaTypeAlbum, "thumb", thumb); } } @@ -1293,7 +1271,7 @@ CNfoFile nfoReader; if (XFILE::CFile::Exists(strNfo)) { - CLog::Log(LOGDEBUG,"Found matching nfo file: %s", CURL::GetRedacted(strNfo).c_str()); + CLog::Log(LOGDEBUG,"Found matching nfo file: %s", strNfo.c_str()); result = nfoReader.Create(strNfo, info); if (result == CNfoFile::FULL_NFO) { @@ -1342,7 +1320,7 @@ CGUIDialogSelect *pDlg = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); if (pDlg) { - pDlg->SetHeading(CVariant{g_localizeStrings.Get(21890)}); + pDlg->SetHeading(g_localizeStrings.Get(21890)); pDlg->Reset(); pDlg->EnableButton(true, 413); // manual @@ -1361,9 +1339,9 @@ } item.SetLabel(strTemp); item.m_idepth = i; // use this to hold the index of the album in the scraper - pDlg->Add(item); + pDlg->Add(&item); } - pDlg->Open(); + pDlg->DoModal(); // and wait till user selects one if (pDlg->GetSelectedLabel() < 0) @@ -1373,12 +1351,11 @@ // manual button pressed std::string strNewArtist = artist.strArtist; - if (!CGUIKeyboardFactory::ShowAndGetInput(strNewArtist, CVariant{g_localizeStrings.Get(16025)}, false)) - return INFO_CANCELLED; + if (!CGUIKeyboardFactory::ShowAndGetInput(strNewArtist, g_localizeStrings.Get(16025), false)) return INFO_CANCELLED; if (pDialog) { - pDialog->SetLine(0, CVariant{strNewArtist}); + pDialog->SetLine(0, strNewArtist); pDialog->Progress(); } @@ -1446,9 +1423,9 @@ return bMusicBrainz; } -std::map CMusicInfoScanner::GetArtistArtwork(const CArtist& artist) +map CMusicInfoScanner::GetArtistArtwork(const CArtist& artist) { - std::map artwork; + map artwork; // check thumb std::string strFolder; @@ -1467,7 +1444,7 @@ thumb = CScraperUrl::GetThumbURL(artist.thumbURL.GetFirstThumb()); if (!thumb.empty()) { - CTextureCache::GetInstance().BackgroundCacheImage(thumb); + CTextureCache::Get().BackgroundCacheImage(thumb); artwork.insert(make_pair("thumb", thumb)); } @@ -1487,7 +1464,7 @@ fanart = artist.fanart.GetImageURL(); if (!fanart.empty()) { - CTextureCache::GetInstance().BackgroundCacheImage(fanart); + CTextureCache::Get().BackgroundCacheImage(fanart); artwork.insert(make_pair("fanart", fanart)); } @@ -1499,7 +1476,7 @@ void CMusicInfoScanner::Run() { int count = 0; - for (std::set::iterator it = m_pathsToScan.begin(); it != m_pathsToScan.end() && !m_bStop; ++it) + for (set::iterator it = m_pathsToScan.begin(); it != m_pathsToScan.end() && !m_bStop; ++it) { count+=CountFilesRecursively(*it); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/infoscanner/MusicInfoScanner.h kodi-15.2~git20151019.1039-final/xbmc/music/infoscanner/MusicInfoScanner.h --- kodi-16.1~git20160425.1001-final/xbmc/music/infoscanner/MusicInfoScanner.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/infoscanner/MusicInfoScanner.h 2015-04-04 00:00:17.000000000 +0000 @@ -59,7 +59,7 @@ void FetchAlbumInfo(const std::string& strDirectory, bool refresh = false); void FetchArtistInfo(const std::string& strDirectory, bool refresh = false); bool IsScanning(); - void Stop(bool wait = false); + void Stop(); void CleanDatabase(bool showProgress = true); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/infoscanner/MusicInfoScraper.cpp kodi-15.2~git20151019.1039-final/xbmc/music/infoscanner/MusicInfoScraper.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/infoscanner/MusicInfoScraper.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/infoscanner/MusicInfoScraper.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,6 +24,7 @@ using namespace MUSIC_GRABBER; using namespace ADDON; +using namespace std; CMusicInfoScraper::CMusicInfoScraper(const ADDON::ScraperPtr &scraper) : CThread("MusicInfoScraper") { @@ -113,8 +114,7 @@ return; CMusicAlbumInfo& album=m_vecAlbums[m_iAlbum]; - // Clear album artist credits - album.GetAlbum().artistCredits.clear(); + album.GetAlbum().artist.clear(); if (album.Load(*m_http,m_scraper)) m_bSucceeded=true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/cdgdata.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/cdgdata.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/cdgdata.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/cdgdata.h 2014-12-18 01:01:57.000000000 +0000 @@ -0,0 +1,73 @@ +#ifndef CDGDATA_H +#define CDGDATA_H + +// CDG Command Code +static const unsigned int CDG_COMMAND = 0x09; + +// CDG Instruction Codes +static const unsigned int CDG_INST_MEMORY_PRESET = 1; +static const unsigned int CDG_INST_BORDER_PRESET = 2; +static const unsigned int CDG_INST_TILE_BLOCK = 6; +static const unsigned int CDG_INST_SCROLL_PRESET = 20; +static const unsigned int CDG_INST_SCROLL_COPY = 24; +static const unsigned int CDG_INST_DEF_TRANSP_COL = 28; +static const unsigned int CDG_INST_LOAD_COL_TBL_0_7 = 30; +static const unsigned int CDG_INST_LOAD_COL_TBL_8_15 = 31; +static const unsigned int CDG_INST_TILE_BLOCK_XOR = 38; + +// Bitmask for all CDG fields +static const unsigned int CDG_MASK = 0x3F; + +// This is the size of the display as defined by the CDG specification. +// The pixels in this region can be painted, and scrolling operations +// rotate through this number of pixels. +static const unsigned int CDG_FULL_WIDTH = 300; +static const unsigned int CDG_FULL_HEIGHT = 216; +static const unsigned int CDG_BORDER_WIDTH = 6; +static const unsigned int CDG_BORDER_HEIGHT = 12; + +typedef struct +{ + char command; + char instruction; + char parityQ[2]; + char data[16]; + char parityP[4]; +} SubCode; + +typedef struct +{ + char color; // Only lower 4 bits are used, mask with 0x0F + char repeat; // Only lower 4 bits are used, mask with 0x0F + char filler[14]; +} CDG_MemPreset; + +typedef struct +{ + char color; // Only lower 4 bits are used, mask with 0x0F + char filler[15]; +} CDG_BorderPreset; + +typedef struct +{ + char color0; // Only lower 4 bits are used, mask with 0x0F + char color1; // Only lower 4 bits are used, mask with 0x0F + char row; // Only lower 5 bits are used, mask with 0x1F + char column; // Only lower 6 bits are used, mask with 0x3F + char tilePixels[12]; // Only lower 6 bits of each byte are used +} CDG_Tile; + +typedef struct +{ + char colorSpec[16]; // AND with 0x3F3F to clear P and Q channel +} CDG_LoadColorTable; + +typedef struct +{ + char color; // Only lower 4 bits are used, mask with 0x0F + char hScroll; // Only lower 6 bits are used, mask with 0x3F + char vScroll; // Only lower 6 bits are used, mask with 0x3F +} +CDG_Scroll; + +#endif // CDG_H diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "GUIDialogKaraokeSongSelector.h" +#include "PlayListPlayer.h" +#include "playlists/PlayList.h" +#include "input/Key.h" +#include "guilib/LocalizeStrings.h" +#include "utils/log.h" +#include "utils/StringUtils.h" + +#define CONTROL_LABEL_SONGNUMBER 401 +#define CONTROL_LABEL_SONGNAME 402 + +static const unsigned int MAX_SONG_ID = 100000; + + +CGUIDialogKaraokeSongSelector::CGUIDialogKaraokeSongSelector( int id, const char *xmlFile ) + : CGUIDialog( id, xmlFile ) +{ + m_selectedNumber = 0; + m_songSelected = false; + m_updateData = false; +} + +CGUIDialogKaraokeSongSelector::~CGUIDialogKaraokeSongSelector(void) +{ +} + +void CGUIDialogKaraokeSongSelector::OnButtonNumeric( unsigned int code, bool reset_autotimer ) +{ + + // Add the number + m_selectedNumber = m_selectedNumber * 10 + code; + CLog::Log( LOGDEBUG, "CGUIDialogKaraokeSongSelector::OnButtonNumeric %d / %d" , code, m_selectedNumber); + + // If overflow (a typical way to delete the old number is add zeros), handle it + if ( m_selectedNumber >= MAX_SONG_ID ) + m_selectedNumber %= MAX_SONG_ID; + + // Reset activity timer + if ( reset_autotimer ) + SetAutoClose( m_autoCloseTimeout ); + + m_updateData = true; +} + +void CGUIDialogKaraokeSongSelector::OnButtonSelect() +{ + // We only handle "select" if a song is selected + if ( m_songSelected ) + { + std::string path = m_karaokeSong.strFileName; + CFileItemPtr pItem( new CFileItem( path, false) ); + m_songSelected = false; + + if ( m_startPlaying ) + { + g_playlistPlayer.ClearPlaylist(PLAYLIST_MUSIC); + g_playlistPlayer.SetRepeat( PLAYLIST_MUSIC, PLAYLIST::REPEAT_NONE ); + g_playlistPlayer.SetShuffle(PLAYLIST_MUSIC, false ); + g_playlistPlayer.Add( PLAYLIST_MUSIC, pItem ); + g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_MUSIC); + g_playlistPlayer.Play(); + + CLog::Log(LOGDEBUG, "Karaoke song selector: playing song %s [%d]", path.c_str(), m_selectedNumber); + } + else + { + g_playlistPlayer.Add( PLAYLIST_MUSIC, pItem ); + CLog::Log(LOGDEBUG, "Karaoke song selector: adding song %s [%d]", path.c_str(), m_selectedNumber); + } + + Close(); + } +} + +int CGUIDialogKaraokeSongSelector::GetKeyNumber( int actionid ) +{ + switch( actionid ) + { + case REMOTE_0: + return 0; + + case REMOTE_1: + return 1; + + case REMOTE_2: + case ACTION_JUMP_SMS2: + return 2; + + case REMOTE_3: + case ACTION_JUMP_SMS3: + return 3; + + case REMOTE_4: + case ACTION_JUMP_SMS4: + return 4; + + case REMOTE_5: + case ACTION_JUMP_SMS5: + return 5; + + case REMOTE_6: + case ACTION_JUMP_SMS6: + return 6; + + case REMOTE_7: + case ACTION_JUMP_SMS7: + return 7; + + case REMOTE_8: + case ACTION_JUMP_SMS8: + return 8; + + case REMOTE_9: + case ACTION_JUMP_SMS9: + return 9; + } + + return -1; +} + +bool CGUIDialogKaraokeSongSelector::OnAction(const CAction & action) +{ + CLog::Log( LOGDEBUG, "CGUIDialogKaraokeSongSelector::OnAction %d" , action.GetID()); + + if ( GetKeyNumber( action.GetID() ) != -1 ) + { + OnButtonNumeric( GetKeyNumber( action.GetID() ) ); + return true; + } + + switch(action.GetID()) + { + case ACTION_SELECT_ITEM: + OnButtonSelect(); + break; + + case ACTION_DELETE_ITEM: + case ACTION_BACKSPACE: + OnBackspace(); + break; + } + + return CGUIDialog::OnAction( action ); +} + +void CGUIDialogKaraokeSongSelector::UpdateData() +{ + if ( m_updateData ) + { + // Update on-screen labels + std::string message = StringUtils::Format("%06d", m_selectedNumber); + message = g_localizeStrings.Get(179) + ": " + message; // Translated "Song" + + SET_CONTROL_LABEL(CONTROL_LABEL_SONGNUMBER, message); + + // Now try to find this song in the database + m_songSelected = m_musicdatabase.GetSongByKaraokeNumber( m_selectedNumber, m_karaokeSong ); + + if ( m_songSelected ) + message = m_karaokeSong.strTitle; + else + message = "* " + g_localizeStrings.Get(13205) + " *"; // Unknown + + SET_CONTROL_LABEL(CONTROL_LABEL_SONGNAME, message); + } + + m_updateData = false; +} + +void CGUIDialogKaraokeSongSelector::FrameMove() +{ + if ( m_updateData ) + UpdateData(); + + CGUIDialog::FrameMove(); +} + + +void CGUIDialogKaraokeSongSelector::OnBackspace() +{ + // Clear the number + m_selectedNumber /= 10; + + // Reset activity timer + SetAutoClose( m_autoCloseTimeout ); + m_updateData = true; +} + + +CGUIDialogKaraokeSongSelectorSmall::CGUIDialogKaraokeSongSelectorSmall() + : CGUIDialogKaraokeSongSelector( WINDOW_DIALOG_KARAOKE_SONGSELECT, "DialogKaraokeSongSelector.xml" ) +{ + m_autoCloseTimeout = 30000; // 30 sec + m_startPlaying = false; +} + + +CGUIDialogKaraokeSongSelectorLarge::CGUIDialogKaraokeSongSelectorLarge() + : CGUIDialogKaraokeSongSelector( WINDOW_DIALOG_KARAOKE_SELECTOR, "DialogKaraokeSongSelectorLarge.xml" ) +{ + m_autoCloseTimeout = 180000; // 180 sec + m_startPlaying = true; +} + +void CGUIDialogKaraokeSongSelector::OnInitWindow() +{ + CGUIDialog::OnInitWindow(); + + // Check if there are any karaoke songs in the database + if ( !m_musicdatabase.Open() ) + { + Close(); + return; + } + + if ( m_musicdatabase.GetKaraokeSongsCount() == 0 ) + { + Close(); + return; + } + + SetAutoClose( m_autoCloseTimeout ); +} + + +void CGUIDialogKaraokeSongSelector::OnDeinitWindow(int nextWindowID) +{ + CGUIDialog::OnDeinitWindow(nextWindowID); + m_musicdatabase.Close(); +} + + +void CGUIDialogKaraokeSongSelectorSmall::DoModal(unsigned int startcode, int iWindowID, const std::string & param) +{ + m_songSelected = false; + m_selectedNumber = 0; + + OnButtonNumeric( startcode, false ); + CGUIDialog::DoModal( iWindowID, param ); +} + + +void CGUIDialogKaraokeSongSelectorLarge::DoModal(int iWindowID, const std::string & param) +{ + m_songSelected = false; + m_selectedNumber = 0; + + OnButtonNumeric( 0, false ); + CGUIDialog::DoModal( iWindowID, param ); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,87 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "guilib/GUIDialog.h" +#include "music/MusicDatabase.h" +#include "music/Song.h" + + +class CGUIDialogKaraokeSongSelector: public CGUIDialog +{ +public: + CGUIDialogKaraokeSongSelector( int id, const char *xmlFile ); + virtual ~CGUIDialogKaraokeSongSelector(void); + + //! Key/button parser; returns 0-9 for a numeric button action, and -1 for anything else + static int GetKeyNumber( int actionid ); + +protected: + // Those functions control the selection process + virtual void OnInitWindow(); + virtual void OnDeinitWindow(int nextWindowID); + virtual bool OnAction(const CAction &action); + virtual void FrameMove(); + + void OnButtonNumeric( unsigned int code, bool reset_autotimer = true ); // 0x00 - 0x09 + void OnButtonSelect(); // Song is selected + void OnBackspace(); // Backspace pressed + void UpdateData(); + + // Configuration + //! Auto-close timeout + unsigned int m_autoCloseTimeout; + + //! Start playing song as soon as it's selected? + bool m_startPlaying; + +protected: + //! Currently selected number + unsigned int m_selectedNumber; + + //! True if the number above did select some song and the info is in m_karaokeData + bool m_songSelected; + + //! True if we need to update fields before rendering + bool m_updateData; + + //! Database stuff + CMusicDatabase m_musicdatabase; + CSong m_karaokeSong; +}; + + +// A 'small' version of dialog using DialogKaraokeSongSelector.xml +class CGUIDialogKaraokeSongSelectorSmall : public CGUIDialogKaraokeSongSelector +{ + public: + CGUIDialogKaraokeSongSelectorSmall(); + void DoModal(unsigned int startcode, int iWindowID = WINDOW_INVALID, const std::string ¶m = ""); +}; + + +// A 'large' version of dialog using DialogKaraokeSongSelectorLarge.xml +class CGUIDialogKaraokeSongSelectorLarge : public CGUIDialogKaraokeSongSelector +{ + public: + CGUIDialogKaraokeSongSelectorLarge(); + void DoModal(int iWindowID = WINDOW_INVALID, const std::string ¶m = ""); +}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/GUIWindowKaraokeLyrics.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/GUIWindowKaraokeLyrics.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/GUIWindowKaraokeLyrics.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/GUIWindowKaraokeLyrics.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "Application.h" +#include "guilib/GUIWindowManager.h" +#include "input/Key.h" +#include "settings/AdvancedSettings.h" + +#include "GUIDialogKaraokeSongSelector.h" +#include "GUIWindowKaraokeLyrics.h" +#include "karaokelyrics.h" +#include "karaokewindowbackground.h" +#include "threads/SingleLock.h" + + +CGUIWindowKaraokeLyrics::CGUIWindowKaraokeLyrics(void) + : CGUIWindow(WINDOW_KARAOKELYRICS, "MusicKaraokeLyrics.xml") +{ + m_Lyrics = 0; + m_Background = new CKaraokeWindowBackground(); +} + + +CGUIWindowKaraokeLyrics::~ CGUIWindowKaraokeLyrics(void ) +{ + delete m_Background; +} + + +bool CGUIWindowKaraokeLyrics::OnAction(const CAction &action) +{ + CSingleLock lock (m_CritSection); + + if ( !m_Lyrics || !g_application.m_pPlayer->IsPlayingAudio() ) + return false; + + CGUIDialogKaraokeSongSelectorSmall * songSelector = (CGUIDialogKaraokeSongSelectorSmall *) + g_windowManager.GetWindow( WINDOW_DIALOG_KARAOKE_SONGSELECT ); + + switch(action.GetID()) + { + case ACTION_SUBTITLE_DELAY_MIN: + m_Lyrics->lyricsDelayDecrease(); + return true; + + case ACTION_SUBTITLE_DELAY_PLUS: + m_Lyrics->lyricsDelayIncrease(); + return true; + + default: + if ( CGUIDialogKaraokeSongSelector::GetKeyNumber( action.GetID() ) != -1 && songSelector && !songSelector->IsActive() ) + songSelector->DoModal( CGUIDialogKaraokeSongSelector::GetKeyNumber( action.GetID() ) ); + + break; + } + + // If our background control could handle the action, let it do it + if ( m_Background && m_Background->OnAction(action) ) + return true; + + return CGUIWindow::OnAction(action); +} + + +bool CGUIWindowKaraokeLyrics::OnMessage(CGUIMessage& message) +{ + switch ( message.GetMessage() ) + { + case GUI_MSG_WINDOW_INIT: + { + // Must be called here so we get our window ID and controls + if ( !CGUIWindow::OnMessage(message) ) + return false; + + m_Background->Init( this ); + return true; + } + break; + + case GUI_MSG_WINDOW_DEINIT: + { + CSingleLock lock (m_CritSection); + + // Close the song selector dialog if shown + CGUIDialogKaraokeSongSelectorSmall * songSelector = (CGUIDialogKaraokeSongSelectorSmall *) + g_windowManager.GetWindow( WINDOW_DIALOG_KARAOKE_SONGSELECT ); + + if ( songSelector && songSelector->IsActive() ) + songSelector->Close(); + } + break; + } + + return CGUIWindow::OnMessage(message); +} + +void CGUIWindowKaraokeLyrics::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) +{ + dirtyregions.push_back(CRect(0.0f, 0.0f, (float)g_graphicsContext.GetWidth(), (float)g_graphicsContext.GetHeight())); +} + +void CGUIWindowKaraokeLyrics::Render() +{ + g_application.ResetScreenSaver(); + CGUIWindow::Render(); + + CSingleLock lock (m_CritSection); + + if ( m_Lyrics ) + { + m_Background->Render(); + m_Lyrics->Render(); + } +} + + +void CGUIWindowKaraokeLyrics::newSong(CKaraokeLyrics * lyrics) +{ + CSingleLock lock (m_CritSection); + m_Lyrics = lyrics; + + m_Lyrics->InitGraphics(); + + // Set up current background mode + if ( m_Lyrics->HasVideo() ) + { + std::string path; + int64_t offset; + + // Start the required video + m_Lyrics->GetVideoParameters( path, offset ); + m_Background->StartVideo( path ); + } + else if ( m_Lyrics->HasBackground() && g_advancedSettings.m_karaokeAlwaysEmptyOnCdgs ) + { + m_Background->StartEmpty(); + } + else + { + m_Background->StartDefault(); + } +} + + +void CGUIWindowKaraokeLyrics::stopSong() +{ + CSingleLock lock (m_CritSection); + m_Lyrics = 0; + + m_Background->Stop(); +} + +void CGUIWindowKaraokeLyrics::pauseSong(bool now_paused) +{ + CSingleLock lock (m_CritSection); + m_Background->Pause( now_paused ); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/GUIWindowKaraokeLyrics.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/GUIWindowKaraokeLyrics.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/GUIWindowKaraokeLyrics.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/GUIWindowKaraokeLyrics.h 2014-12-18 01:01:57.000000000 +0000 @@ -0,0 +1,53 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "guilib/GUIWindow.h" + +class CKaraokeLyrics; +class CKaraokeWindowBackground; + + +class CGUIWindowKaraokeLyrics : public CGUIWindow +{ +public: + CGUIWindowKaraokeLyrics(void); + virtual ~CGUIWindowKaraokeLyrics(void); + virtual bool OnMessage(CGUIMessage& message); + virtual bool OnAction(const CAction &action); + virtual void Render(); + virtual void Process(unsigned int currentTime, CDirtyRegionList &dirtyregions); + + void newSong( CKaraokeLyrics * lyrics ); + void pauseSong( bool now_paused ); + void stopSong(); + +protected: + + //! Critical section protects this class from requests from different threads + CCriticalSection m_CritSection; + + //! Pointer to karaoke lyrics renderer + CKaraokeLyrics * m_Lyrics; + + //! Pointer to background object + CKaraokeWindowBackground * m_Background; +}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricscdg.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricscdg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricscdg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricscdg.cpp 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,610 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "system.h" +#include "filesystem/File.h" +#include "settings/DisplaySettings.h" +#include "guilib/GraphicContext.h" +#include "guilib/Texture.h" +#include "guilib/GUITexture.h" +#include "settings/AdvancedSettings.h" +#include "utils/MathUtils.h" +#include "utils/log.h" +#include "utils/auto_buffer.h" +#include "karaokelyricscdg.h" + + +CKaraokeLyricsCDG::CKaraokeLyricsCDG( const std::string& cdgFile ) + : CKaraokeLyrics() + , m_cdgFile(cdgFile) +{ + m_pCdgTexture = 0; + m_streamIdx = -1; + m_bgAlpha = 0xff000000; + m_fgAlpha = 0xff000000; + m_hOffset = 0; + m_vOffset = 0; + m_borderColor = 0; + m_bgColor = 0; + + memset( m_cdgScreen, 0, sizeof(m_cdgScreen) ); + + for ( int i = 0; i < 16; i++ ) + m_colorTable[i] = 0; +} + +CKaraokeLyricsCDG::~CKaraokeLyricsCDG() +{ + Shutdown(); +} + +bool CKaraokeLyricsCDG::HasBackground() +{ + return true; +} + +bool CKaraokeLyricsCDG::HasVideo() +{ + return false; +} + +void CKaraokeLyricsCDG::GetVideoParameters(std::string& path, int64_t & offset) +{ + // no bg video +} + +BYTE CKaraokeLyricsCDG::getPixel( int x, int y ) +{ + unsigned int offset = x + y * CDG_FULL_WIDTH; + + if ( x >= (int) CDG_FULL_WIDTH || y >= (int) CDG_FULL_HEIGHT ) + return m_borderColor; + + if ( x < 0 || y < 0 || offset >= CDG_FULL_HEIGHT * CDG_FULL_WIDTH ) + { + CLog::Log( LOGERROR, "CDG renderer: requested pixel (%d,%d) is out of boundary", x, y ); + return 0; + } + + return m_cdgScreen[offset]; +} + +void CKaraokeLyricsCDG::setPixel( int x, int y, BYTE color ) +{ + unsigned int offset = x + y * CDG_FULL_WIDTH; + + if ( x < 0 || y < 0 || offset >= CDG_FULL_HEIGHT * CDG_FULL_WIDTH ) + { + CLog::Log( LOGERROR, "CDG renderer: set pixel (%d,%d) is out of boundary", x, y ); + return; + } + + m_cdgScreen[offset] = color; +} + + +bool CKaraokeLyricsCDG::InitGraphics() +{ + // set the background to be completely transparent if we use visualisations, or completely solid if not + if ( g_advancedSettings.m_karaokeAlwaysEmptyOnCdgs ) + m_bgAlpha = 0xff000000; + else + m_bgAlpha = 0; + + if (!m_pCdgTexture) + { + m_pCdgTexture = new CTexture( CDG_FULL_WIDTH, CDG_FULL_HEIGHT, XB_FMT_A8R8G8B8 ); + } + + if ( !m_pCdgTexture ) + { + CLog::Log(LOGERROR, "CDG renderer: failed to create texture" ); + return false; + } + + return true; +} + +void CKaraokeLyricsCDG::Shutdown() +{ + m_cdgStream.clear(); + + if ( m_pCdgTexture ) + { + delete m_pCdgTexture; + m_pCdgTexture = NULL; + } +} + + +void CKaraokeLyricsCDG::Render() +{ + // Do not render if we have no texture + if ( !m_pCdgTexture ) + return; + + // Time to update? + unsigned int songTime = (unsigned int) MathUtils::round_int( (getSongTime() + g_advancedSettings.m_karaokeSyncDelayCDG) * 1000 ); + unsigned int packets_due = songTime * 300 / 1000; + + if ( UpdateBuffer( packets_due ) ) + { + XUTILS::auto_buffer buf(CDG_FULL_HEIGHT * CDG_FULL_WIDTH*sizeof(DWORD)); + DWORD* const pixelbuf = (DWORD*)buf.get(); + + // Update our texture content + for ( UINT y = 0; y < CDG_FULL_HEIGHT; y++ ) + { + DWORD *texel = (DWORD *) (pixelbuf + y * CDG_FULL_WIDTH); + + for ( UINT x = 0; x < CDG_FULL_WIDTH; x++ ) + { + BYTE colorindex = getPixel( x + m_hOffset, y + m_vOffset ); + DWORD TexColor = m_colorTable[ colorindex ]; + + // Is it transparent color? + if ( TexColor != 0xFFFFFFFF ) + { + TexColor &= 0x00FFFFFF; + + if ( colorindex == m_bgColor ) + TexColor |= m_bgAlpha; + else + TexColor |= m_fgAlpha; + } + else + TexColor = 0x00000000; + + *texel++ = TexColor; + } + } + + m_pCdgTexture->Update( CDG_FULL_WIDTH, CDG_FULL_HEIGHT, CDG_FULL_WIDTH * 4, XB_FMT_A8R8G8B8, (BYTE*) pixelbuf, false ); + } + + // Convert texture coordinates to (0..1) + CRect texCoords((float)CDG_BORDER_WIDTH / CDG_FULL_WIDTH, + (float)CDG_BORDER_HEIGHT / CDG_FULL_HEIGHT, + (float)(CDG_FULL_WIDTH - CDG_BORDER_WIDTH) / CDG_FULL_WIDTH, + (float)(CDG_FULL_HEIGHT - CDG_BORDER_HEIGHT) / CDG_FULL_HEIGHT); + + // Get screen coordinates + const RESOLUTION_INFO info = g_graphicsContext.GetResInfo(); + CRect vertCoords((float)info.Overscan.left, + (float)info.Overscan.top, + (float)info.Overscan.right, + (float)info.Overscan.bottom); + + CGUITexture::DrawQuad(vertCoords, 0xffffffff, m_pCdgTexture, &texCoords); +} + +void CKaraokeLyricsCDG::cmdMemoryPreset( const char * data ) +{ + CDG_MemPreset* preset = (CDG_MemPreset*) data; + + if ( preset->repeat & 0x0F ) + return; // No need for multiple clearings + + m_bgColor = preset->color & 0x0F; + + for ( unsigned int i = CDG_BORDER_WIDTH; i < CDG_FULL_WIDTH - CDG_BORDER_WIDTH; i++ ) + for ( unsigned int j = CDG_BORDER_HEIGHT; j < CDG_FULL_HEIGHT - CDG_BORDER_HEIGHT; j++ ) + setPixel( i, j, m_bgColor ); + + //CLog::Log( LOGDEBUG, "CDG: screen color set to %d", m_bgColor ); +} + +void CKaraokeLyricsCDG::cmdBorderPreset( const char * data ) +{ + CDG_BorderPreset* preset = (CDG_BorderPreset*) data; + + m_borderColor = preset->color & 0x0F; + + for ( unsigned int i = 0; i < CDG_BORDER_WIDTH; i++ ) + { + for ( unsigned int j = 0; j < CDG_FULL_HEIGHT; j++ ) + { + setPixel( i, j, m_borderColor ); + setPixel( CDG_FULL_WIDTH - i - 1, j, m_borderColor ); + } + } + + for ( unsigned int i = 0; i < CDG_FULL_WIDTH; i++ ) + { + for ( unsigned int j = 0; j < CDG_BORDER_HEIGHT; j++ ) + { + setPixel( i, j, m_borderColor ); + setPixel( i, CDG_FULL_HEIGHT - j - 1, m_borderColor ); + } + } + + //CLog::Log( LOGDEBUG, "CDG: border color set to %d", borderColor ); +} + +void CKaraokeLyricsCDG::cmdTransparentColor( const char * data ) +{ + int index = data[0] & 0x0F; + m_colorTable[index] = 0xFFFFFFFF; +} + +void CKaraokeLyricsCDG::cmdLoadColorTable( const char * data, int index ) +{ + CDG_LoadColorTable* table = (CDG_LoadColorTable*) data; + + for ( int i = 0; i < 8; i++ ) + { + UINT colourEntry = ((table->colorSpec[2 * i] & CDG_MASK) << 8); + colourEntry = colourEntry + (table->colorSpec[(2 * i) + 1] & CDG_MASK); + colourEntry = ((colourEntry & 0x3F00) >> 2) | (colourEntry & 0x003F); + + BYTE red = ((colourEntry & 0x0F00) >> 8) * 17; + BYTE green = ((colourEntry & 0x00F0) >> 4) * 17; + BYTE blue = ((colourEntry & 0x000F)) * 17; + + m_colorTable[index+i] = (red << 16) | (green << 8) | blue; + + //CLog::Log( LOGDEBUG, "CDG: loadColors: color %d -> %02X %02X %02X (%08X)", index + i, red, green, blue, m_colorTable[index+i] ); + } +} + +void CKaraokeLyricsCDG::cmdTileBlock( const char * data ) +{ + CDG_Tile* tile = (CDG_Tile*) data; + UINT offset_y = (tile->row & 0x1F) * 12; + UINT offset_x = (tile->column & 0x3F) * 6; + + //CLog::Log( LOGERROR, "TileBlockXor: %d, %d", offset_x, offset_y ); + + if ( offset_x + 6 >= CDG_FULL_WIDTH || offset_y + 12 >= CDG_FULL_HEIGHT ) + return; + + // In the XOR variant, the color values are combined with the color values that are + // already onscreen using the XOR operator. Since CD+G only allows a maximum of 16 + // colors, we are XORing the pixel values (0-15) themselves, which correspond to + // indexes into a color lookup table. We are not XORing the actual R,G,B values. + BYTE color_0 = tile->color0 & 0x0F; + BYTE color_1 = tile->color1 & 0x0F; + + BYTE mask[6] = { 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; + + for ( int i = 0; i < 12; i++ ) + { + BYTE bTemp = tile->tilePixels[i] & 0x3F; + + for ( int j = 0; j < 6; j++ ) + { + if ( bTemp & mask[j] ) + setPixel( offset_x + j, offset_y + i, color_1 ); + else + setPixel( offset_x + j, offset_y + i, color_0 ); + } + } +} + +void CKaraokeLyricsCDG::cmdTileBlockXor( const char * data ) +{ + CDG_Tile* tile = (CDG_Tile*) data; + UINT offset_y = (tile->row & 0x1F) * 12; + UINT offset_x = (tile->column & 0x3F) * 6; + + //CLog::Log( LOGERROR, "TileBlockXor: %d, %d", offset_x, offset_y ); + + if ( offset_x + 6 >= CDG_FULL_WIDTH || offset_y + 12 >= CDG_FULL_HEIGHT ) + return; + + // In the XOR variant, the color values are combined with the color values that are + // already onscreen using the XOR operator. Since CD+G only allows a maximum of 16 + // colors, we are XORing the pixel values (0-15) themselves, which correspond to + // indexes into a color lookup table. We are not XORing the actual R,G,B values. + BYTE color_0 = tile->color0 & 0x0F; + BYTE color_1 = tile->color1 & 0x0F; + + BYTE mask[6] = { 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; + + for ( int i = 0; i < 12; i++ ) + { + BYTE bTemp = tile->tilePixels[i] & 0x3F; + + for ( int j = 0; j < 6; j++ ) + { + // Find the original color index + BYTE origindex = getPixel( offset_x + j, offset_y + i ); + + if ( bTemp & mask[j] ) //pixel xored with color1 + setPixel( offset_x + j, offset_y + i, origindex ^ color_1 ); + else + setPixel( offset_x + j, offset_y + i, origindex ^ color_0 ); + } + } +} + +// Based on http://cdg2video.googlecode.com/svn/trunk/cdgfile.cpp +void CKaraokeLyricsCDG::cmdScroll( const char * data, bool copy ) +{ + int colour, hScroll, vScroll; + int hSCmd, hOffset, vSCmd, vOffset; + int vScrollPixels, hScrollPixels; + + // Decode the scroll command parameters + colour = data[0] & 0x0F; + hScroll = data[1] & 0x3F; + vScroll = data[2] & 0x3F; + + hSCmd = (hScroll & 0x30) >> 4; + hOffset = (hScroll & 0x07); + vSCmd = (vScroll & 0x30) >> 4; + vOffset = (vScroll & 0x0F); + + m_hOffset = hOffset < 5 ? hOffset : 5; + m_vOffset = vOffset < 11 ? vOffset : 11; + + // Scroll Vertical - Calculate number of pixels + vScrollPixels = 0; + + if (vSCmd == 2) + { + vScrollPixels = - 12; + } + else if (vSCmd == 1) + { + vScrollPixels = 12; + } + + // Scroll Horizontal- Calculate number of pixels + hScrollPixels = 0; + + if (hSCmd == 2) + { + hScrollPixels = - 6; + } + else if (hSCmd == 1) + { + hScrollPixels = 6; + } + + if (hScrollPixels == 0 && vScrollPixels == 0) + { + return; + } + + // Perform the actual scroll. + unsigned char temp[CDG_FULL_HEIGHT][CDG_FULL_WIDTH]; + int vInc = vScrollPixels + CDG_FULL_HEIGHT; + int hInc = hScrollPixels + CDG_FULL_WIDTH; + unsigned int ri; // row index + unsigned int ci; // column index + + for (ri = 0; ri < CDG_FULL_HEIGHT; ++ri) + { + for (ci = 0; ci < CDG_FULL_WIDTH; ++ci) + { + temp[(ri + vInc) % CDG_FULL_HEIGHT][(ci + hInc) % CDG_FULL_WIDTH] = getPixel( ci, ri ); + } + } + + // if copy is false, we were supposed to fill in the new pixels + // with a new colour. Go back and do that now. + + if (!copy) + { + if (vScrollPixels > 0) + { + for (ci = 0; ci < CDG_FULL_WIDTH; ++ci) + { + for (ri = 0; ri < (unsigned int)vScrollPixels; ++ri) { + temp[ri][ci] = colour; + } + } + } + else if (vScrollPixels < 0) + { + for (ci = 0; ci < CDG_FULL_WIDTH; ++ci) + { + for (ri = CDG_FULL_HEIGHT + vScrollPixels; ri < CDG_FULL_HEIGHT; ++ri) { + temp[ri][ci] = colour; + } + } + } + + if (hScrollPixels > 0) + { + for (ci = 0; ci < (unsigned int)hScrollPixels; ++ci) + { + for (ri = 0; ri < CDG_FULL_HEIGHT; ++ri) { + temp[ri][ci] = colour; + } + } + } + else if (hScrollPixels < 0) + { + for (ci = CDG_FULL_WIDTH + hScrollPixels; ci < CDG_FULL_WIDTH; ++ci) + { + for (ri = 0; ri < CDG_FULL_HEIGHT; ++ri) { + temp[ri][ci] = colour; + } + } + } + } + + // Now copy the temporary buffer back to our array + for (ri = 0; ri < CDG_FULL_HEIGHT; ++ri) + { + for (ci = 0; ci < CDG_FULL_WIDTH; ++ci) + { + setPixel( ci, ri, temp[ri][ci] ); + } + } +} + +bool CKaraokeLyricsCDG::UpdateBuffer( unsigned int packets_due ) +{ + bool screen_changed = false; + + // Are we done? + if ( m_streamIdx == -1 ) + return false; + + // Was the stream position reversed? In this case we have to "replay" the whole stream + // as the screen is a state machine, and "clear" may not be there. + if ( m_streamIdx > 0 && m_cdgStream[ m_streamIdx-1 ].packetnum > packets_due ) + { + CLog::Log( LOGDEBUG, "CDG renderer: packet number changed backward (%d played, %d asked", m_cdgStream[ m_streamIdx-1 ].packetnum, packets_due ); + m_streamIdx = 0; + } + + // Process all packets already due + while ( m_cdgStream[ m_streamIdx ].packetnum <= packets_due ) + { + SubCode& sc = m_cdgStream[ m_streamIdx ].subcode; + + // Execute the instruction + switch ( sc.instruction & CDG_MASK ) + { + case CDG_INST_MEMORY_PRESET: + cmdMemoryPreset( sc.data ); + screen_changed = true; + break; + + case CDG_INST_BORDER_PRESET: + cmdBorderPreset( sc.data ); + screen_changed = true; + break; + + case CDG_INST_LOAD_COL_TBL_0_7: + cmdLoadColorTable( sc.data, 0 ); + break; + + case CDG_INST_LOAD_COL_TBL_8_15: + cmdLoadColorTable( sc.data, 8 ); + break; + + case CDG_INST_DEF_TRANSP_COL: + cmdTransparentColor( sc.data ); + break; + + case CDG_INST_TILE_BLOCK: + cmdTileBlock( sc.data ); + screen_changed = true; + break; + + case CDG_INST_TILE_BLOCK_XOR: + cmdTileBlockXor( sc.data ); + screen_changed = true; + break; + + case CDG_INST_SCROLL_PRESET: + cmdScroll( sc.data, false ); + screen_changed = true; + break; + + case CDG_INST_SCROLL_COPY: + cmdScroll( sc.data, true ); + screen_changed = true; + break; + + default: // this shouldn't happen as we validated the stream in Load() + break; + } + + m_streamIdx++; + + if ( m_streamIdx >= (int) m_cdgStream.size() ) + { + m_streamIdx = -1; + break; + } + } + + return screen_changed; +} + +bool CKaraokeLyricsCDG::Load() +{ + // Read the whole CD+G file into memory array + XFILE::CFile file; + + m_cdgStream.clear(); + + XFILE::auto_buffer buf; + if (file.LoadFile(m_cdgFile, buf) <= 0) + { + CLog::Log(LOGERROR, "CDG loader: can't load CDG file \"%s\"", m_cdgFile.c_str()); + return false; + } + + file.Close(); + + // Parse the CD+G stream + int buggy_commands = 0; + + for (unsigned int offset = 0; offset < buf.size(); offset += sizeof(SubCode)) + { + SubCode * sc = (SubCode *)(buf.get() + offset); + + if ( ( sc->command & CDG_MASK) == CDG_COMMAND ) + { + CDGPacket packet; + + // Validate the command and instruction + switch ( sc->instruction & CDG_MASK ) + { + case CDG_INST_MEMORY_PRESET: + case CDG_INST_BORDER_PRESET: + case CDG_INST_LOAD_COL_TBL_0_7: + case CDG_INST_LOAD_COL_TBL_8_15: + case CDG_INST_TILE_BLOCK_XOR: + case CDG_INST_TILE_BLOCK: + case CDG_INST_DEF_TRANSP_COL: + case CDG_INST_SCROLL_PRESET: + case CDG_INST_SCROLL_COPY: + memcpy( &packet.subcode, sc, sizeof(SubCode) ); + packet.packetnum = offset / sizeof( SubCode ); + m_cdgStream.push_back( packet ); + break; + + default: + buggy_commands++; + break; + } + } + } + + // Init the screen + memset( m_cdgScreen, 0, sizeof(m_cdgScreen) ); + + // Init color table + for ( int i = 0; i < 16; i++ ) + m_colorTable[i] = 0; + + m_streamIdx = 0; + m_borderColor = 0; + m_bgColor = 0; + m_hOffset = 0; + m_vOffset = 0; + + if ( buggy_commands == 0 ) + CLog::Log( LOGDEBUG, "CDG loader: CDG file %s has been loading successfully, %d useful packets, %dKb used", + m_cdgFile.c_str(), (int)m_cdgStream.size(), (int)(m_cdgStream.size() * sizeof(CDGPacket) / 1024) ); + else + CLog::Log( LOGDEBUG, "CDG loader: CDG file %s was damaged, %d errors ignored, %d useful packets, %dKb used", + m_cdgFile.c_str(), buggy_commands, (int)m_cdgStream.size(), (int)(m_cdgStream.size() * sizeof(CDGPacket) / 1024) ); + + return true; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricscdg.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricscdg.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricscdg.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricscdg.h 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,114 @@ +#ifndef KARAOKELYRICSCDG_H +#define KARAOKELYRICSCDG_H + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Interface: karaokelyricscdg + +#include "cdgdata.h" +#include "karaokelyrics.h" + +class CBaseTexture; +typedef uint32_t color_t; + +class CKaraokeLyricsCDG : public CKaraokeLyrics +{ + public: + CKaraokeLyricsCDG( const std::string& cdgFile ); + ~CKaraokeLyricsCDG(); + + //! Parses the lyrics or song file, and loads the lyrics into memory. Returns true if the + //! lyrics are successfully loaded, false otherwise. + bool Load(); + + //! Virtually all CDG lyrics have some kind of background + virtual bool HasBackground(); + + //! Should return true if the lyrics have video file to play + virtual bool HasVideo(); + + //! Should return video parameters if HasVideo() returned true + virtual void GetVideoParameters(std::string& path, int64_t& offset); + + //! This function is called when the karoke visualisation window created. It may + //! be called after Start(), but is guaranteed to be called before Render() + //! Default implementation does nothing. + virtual bool InitGraphics(); + + //! This function is called when the karoke visualisation window is destroyed. + //! Default implementation does nothing. + virtual void Shutdown(); + + //! This function is called to render the lyrics (each frame(?)) + virtual void Render(); + + protected: + void cmdMemoryPreset( const char * data ); + void cmdBorderPreset( const char * data ); + void cmdLoadColorTable( const char * data, int index ); + void cmdTileBlock( const char * data ); + void cmdTileBlockXor( const char * data ); + void cmdTransparentColor( const char * data ); + + void cmdScroll( const char * data, bool loop ); + void scrollLeft( int color ); + void scrollRight( int color ); + void scrollUp( int color ); + void scrollDown( int color ); + + bool UpdateBuffer( unsigned int packets_due ); + void RenderIntoBuffer( unsigned char *pixels, unsigned int width, unsigned int height, unsigned int pitch ) const; + + private: + BYTE getPixel( int x, int y ); + void setPixel( int x, int y, BYTE color ); + + //! CDG file name + std::string m_cdgFile; + + typedef struct + { + unsigned int packetnum; + SubCode subcode; + } CDGPacket; + + std::vector m_cdgStream; //!< Parsed CD+G stream storage + int m_streamIdx; //!< Packet about to be rendered + DWORD m_colorTable[16]; //!< CD+G color table; color format is A8R8G8B8 + BYTE m_bgColor; //!< Background color index + BYTE m_borderColor; //!< Border color index + BYTE m_cdgScreen[CDG_FULL_WIDTH*CDG_FULL_HEIGHT]; //!< Image state for CD+G stream + + // These values are used to implement screen shifting. The CDG specification allows the entire + // screen to be shifted, up to 5 pixels right and 11 pixels down. This shift is persistent + // until it is reset to a different value. In practice, this is used in conjunction with + // scrolling (which always jumps in integer blocks of 6x12 pixels) to perform + // one-pixel-at-a-time scrolls. + BYTE m_hOffset; + BYTE m_vOffset; + + //! Rendering stuff + CBaseTexture * m_pCdgTexture; + color_t m_bgAlpha; //!< background alpha + color_t m_fgAlpha; //!< foreground alpha +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyrics.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyrics.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyrics.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyrics.cpp 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Implementation: karaokelyrics + +#include + +#include "utils/MathUtils.h" +#include "Application.h" +#include "music/MusicDatabase.h" +#include "settings/AdvancedSettings.h" +#include "utils/log.h" + +#include "karaokelyrics.h" + +CKaraokeLyrics::CKaraokeLyrics() +{ + m_avOrigDelay = 0; + m_avDelay = 0; + m_idSong = 0; +} + + +CKaraokeLyrics::~CKaraokeLyrics() +{ +} + +void CKaraokeLyrics::Shutdown() +{ + // Update the song-specific delay in the database + if ( m_idSong && m_avOrigDelay != m_avDelay && g_advancedSettings.m_karaokeKeepDelay ) + { + // If the song is in karaoke db, get the delay + CMusicDatabase musicdatabase; + if ( musicdatabase.Open() ) + { + int delayval = MathUtils::round_int( m_avDelay * 10.0 ); + musicdatabase.SetKaraokeSongDelay( m_idSong, delayval ); + CLog::Log( LOGDEBUG, "Karaoke timing correction: set new delay %d for song %ld", delayval, m_idSong ); + } + + musicdatabase.Close(); + } + + m_idSong = 0; +} + +bool CKaraokeLyrics::InitGraphics() +{ + return true; +} + +void CKaraokeLyrics::initData( const std::string & songPath ) +{ + m_songPath = songPath; + + // Reset AV delay + m_avOrigDelay = m_avDelay = 0; + + // Get song ID if available + m_idSong = 0; + CMusicDatabase musicdatabase; + + // Get song-specific delay from the database + if ( g_advancedSettings.m_karaokeKeepDelay && musicdatabase.Open() ) + { + CSong song; + if ( musicdatabase.GetSongByFileName( songPath, song) ) + { + m_idSong = song.idSong; + if ( song.iKaraokeDelay != 0 ) + { + m_avOrigDelay = m_avDelay = (double) song.iKaraokeDelay / 10.0; + CLog::Log( LOGDEBUG, "Karaoke timing correction: restored lyrics delay from database to %g", m_avDelay ); + } + } + + musicdatabase.Close(); + } +} + +void CKaraokeLyrics::lyricsDelayIncrease() +{ + m_avDelay += 0.05; // 50ms +} + +void CKaraokeLyrics::lyricsDelayDecrease() +{ + m_avDelay -= 0.05; // 50ms +} + +double CKaraokeLyrics::getSongTime() const +{ + // m_avDelay may be negative + double songtime = g_application.GetTime() + m_avDelay; + return songtime >= 0 ? songtime : 0.0; +} + +std::string CKaraokeLyrics::getSongFile() const +{ + return m_songPath; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricsfactory.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricsfactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricsfactory.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricsfactory.cpp 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Implementation: karaokelyricsfactory + +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "filesystem/File.h" + +#include "karaokelyricscdg.h" +#include "karaokelyricstextkar.h" +#include "karaokelyricstextlrc.h" +#include "karaokelyricstextustar.h" +#include "karaokelyricsfactory.h" + + +// A helper function to have all the checks in a single place +bool CheckAndCreateLyrics( const std::string & songName, CKaraokeLyrics ** lyricptr ) +{ + std::string filename = songName; + URIUtils::RemoveExtension( filename ); + std::string ext = URIUtils::GetExtension(songName); + + // LRC lyrics have .lrc extension + if ( XFILE::CFile::Exists( filename + ".lrc" ) ) + { + if ( lyricptr ) + *lyricptr = new CKaraokeLyricsTextLRC( filename + ".lrc" ); + + return true; + } + + // MIDI/KAR files keep lyrics inside + if (StringUtils::StartsWith(ext, ".mid") || + StringUtils::StartsWith(ext, ".kar")) + { + if ( lyricptr ) + *lyricptr = new CKaraokeLyricsTextKAR( songName ); + + return true; + } + + // CD-G lyrics have .cdg extension + if ( XFILE::CFile::Exists( filename + ".cdg" ) ) + { + if ( lyricptr ) + *lyricptr = new CKaraokeLyricsCDG( filename + ".cdg" ); + + return true; + } + + // UltraStar lyrics have .txt extension + if ( XFILE::CFile::Exists( filename + ".txt" ) && CKaraokeLyricsTextUStar::isValidFile( filename + ".txt" ) ) + { + if ( lyricptr ) + *lyricptr = new CKaraokeLyricsTextUStar( filename + ".txt" ); + + return true; + } + + if ( lyricptr ) + *lyricptr = 0; + + return false; +} + + +CKaraokeLyrics * CKaraokeLyricsFactory::CreateLyrics( const std::string & songName ) +{ + CKaraokeLyrics * lyricptr = 0; + + CheckAndCreateLyrics( songName, &lyricptr ); + return lyricptr; +} + + +bool CKaraokeLyricsFactory::HasLyrics(const std::string & songName) +{ + return CheckAndCreateLyrics( songName, 0 ); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricsfactory.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricsfactory.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricsfactory.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricsfactory.h 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,45 @@ +#ifndef KARAOKELYRICSFACTORY_H +#define KARAOKELYRICSFACTORY_H + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Interface: karaokelyricsfactory + +#include "karaokelyrics.h" + +class CKaraokeLyricsFactory +{ + public: + CKaraokeLyricsFactory() {}; + ~CKaraokeLyricsFactory() {}; + + //! This function will be called to check if there are any classes which could load lyrics + //! for the song played. The action will be executed in a single thread, and therefore + //! should be limited to simple checks like whether the specific filename exists. + //! If the loader needs more than that to make sure lyrics are there, it must create this + //! loader, which should handle the processing in load(). + static CKaraokeLyrics * CreateLyrics( const std::string& songName ); + + //! This function returns true if the lyrics are (or might be) available for this song. + static bool HasLyrics( const std::string& songName ); +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyrics.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyrics.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyrics.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyrics.h 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,92 @@ +#ifndef KARAOKELYRICS_H +#define KARAOKELYRICS_H + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include + +// C++ Interface: karaokelyrics + +// Abstract interface class for all Karaoke lyrics +class CKaraokeLyrics +{ + public: + CKaraokeLyrics(); + virtual ~CKaraokeLyrics(); + + //! Parses the lyrics or song file, and loads the lyrics into memory. This function + //! returns true if the lyrics are successfully loaded, or loading is in progress, + //! and false otherwise. + virtual bool Load() = 0; + + //! Should return true if the lyrics have background, and therefore should not use + //! predefined background. + virtual bool HasBackground() = 0; + + //! Should return true if the lyrics have video file to play + virtual bool HasVideo() = 0; + + //! Should return video parameters if HasVideo() returned true + virtual void GetVideoParameters( std::string& path, int64_t& offset ) = 0; + + //! This function is called when the karoke visualisation window created. It may + //! be called after Start(), but is guaranteed to be called before Render() + //! Default implementation does nothing and returns true. + virtual bool InitGraphics(); + + //! This function is called to render the lyrics (each frame(?)) + virtual void Render() = 0; + + //! This function is called before the object is destroyed. Default implementation does nothing. + //! You must override it if your lyrics class starts threads which need to be stopped, and stop + //! all of them before returning back. + virtual void Shutdown(); + + //! This function gets 'real' time since the moment song begins, corrected by using remote control + //! to increase/decrease lyrics delays. All lyric show functions must use it to properly calculate + //! the offset. + double getSongTime() const; + + //! This function gets 'real' time since the moment song begins, corrected by using remote control + //! to increase/decrease lyrics delays. All lyric show functions must use it to properly calculate + //! the offset. + std::string getSongFile() const; + + //! Sets the path to the lyrics file, and restores musicdb values + void initData( const std::string& songPath ); + + //! Adjusts lyrics delay + void lyricsDelayIncrease(); + void lyricsDelayDecrease(); + + private: + //! Number of milliseconds the lyrics are delayed to compensate. + double m_avDelay; + + //! Original m_avDelay to see if it was changed + double m_avOrigDelay; + + //! Current playing song + std::string m_songPath; + long m_idSong; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricsmanager.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricsmanager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricsmanager.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricsmanager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Implementation: karaokelyricsmanager + +#include "threads/SystemClock.h" +#include "Application.h" +#include "guilib/GUIWindowManager.h" +#include "settings/Settings.h" + +#include "karaokelyrics.h" +#include "karaokelyricsfactory.h" +#include "karaokelyricsmanager.h" + +#include "GUIDialogKaraokeSongSelector.h" +#include "GUIWindowKaraokeLyrics.h" +#include "threads/SingleLock.h" +#include "utils/log.h" + +CKaraokeLyricsManager::CKaraokeLyricsManager() +{ + m_Lyrics = 0; + m_karaokeSongPlaying = false; + m_karaokeSongPlayed = false; + m_lastPlayedTime = 0; +} + +CKaraokeLyricsManager::~ CKaraokeLyricsManager() +{ + if ( m_Lyrics ) + { + m_Lyrics->Shutdown(); + delete m_Lyrics; + } +} + +bool CKaraokeLyricsManager::Start(const std::string & strSongPath) +{ + CSingleLock lock (m_CritSection); + + // Init to false + m_karaokeSongPlayed = false; + m_lastPlayedTime = 0; + + if ( m_Lyrics ) + Stop(); // shouldn't happen, but... + + // If disabled by configuration, do nothing + if ( !CSettings::Get().GetBool("karaoke.enabled") ) + return false; + + m_Lyrics = CKaraokeLyricsFactory::CreateLyrics( strSongPath ); + + if ( !m_Lyrics ) + { + CLog::Log( LOGDEBUG, "Karaoke: lyrics for song %s not found", strSongPath.c_str() ); + return false; + } + + m_Lyrics->initData( strSongPath ); + + // Load the lyrics + if ( !m_Lyrics->Load() ) + { + CLog::Log( LOGWARNING, "Karaoke: lyrics for song %s found but cannot be loaded", strSongPath.c_str() ); + delete m_Lyrics; + m_Lyrics = 0; + return false; + } + + CLog::Log( LOGDEBUG, "Karaoke: lyrics for song %s loaded successfully", strSongPath.c_str() ); + + CGUIWindowKaraokeLyrics *window = (CGUIWindowKaraokeLyrics*) g_windowManager.GetWindow(WINDOW_KARAOKELYRICS); + + if ( !window ) + { + CLog::Log( LOGERROR, "Karaoke window is not found" ); + return false; + } + + // Activate karaoke window + g_windowManager.ActivateWindow(WINDOW_KARAOKELYRICS); + + // Start the song + window->newSong( m_Lyrics ); + + m_karaokeSongPlaying = true; + m_karaokeSongPlayed = true; + return true; +} + +void CKaraokeLyricsManager::Stop() +{ + CSingleLock lock (m_CritSection); + + m_karaokeSongPlaying = false; + + if ( !m_Lyrics ) + return; + + // Clean up and close karaoke window when stopping + CGUIWindowKaraokeLyrics *window = (CGUIWindowKaraokeLyrics*) g_windowManager.GetWindow(WINDOW_KARAOKELYRICS); + + if ( window ) + window->stopSong(); + + // turn off visualisation window when stopping + if (g_windowManager.GetActiveWindow() == WINDOW_KARAOKELYRICS) + g_windowManager.PreviousWindow(); + + m_Lyrics->Shutdown(); + delete m_Lyrics; + m_Lyrics = 0; +} + + +void CKaraokeLyricsManager::ProcessSlow() +{ + CSingleLock lock (m_CritSection); + + if ( g_application.m_pPlayer->IsPlaying() ) + { + if ( m_karaokeSongPlaying ) + m_lastPlayedTime = XbmcThreads::SystemClockMillis(); + + return; + } + + if ( !m_karaokeSongPlayed || !CSettings::Get().GetBool("karaoke.autopopupselector") ) + return; + + // If less than 750ms passed return; we're still processing STOP events + if ( !m_lastPlayedTime || XbmcThreads::SystemClockMillis() - m_lastPlayedTime < 750 ) + return; + + m_karaokeSongPlayed = false; // so it won't popup again + + CGUIDialogKaraokeSongSelectorLarge * selector = + (CGUIDialogKaraokeSongSelectorLarge*)g_windowManager.GetWindow( WINDOW_DIALOG_KARAOKE_SELECTOR ); + + selector->DoModal(); +} + +void CKaraokeLyricsManager::SetPaused(bool now_paused) +{ + CSingleLock lock (m_CritSection); + + // Clean up and close karaoke window when stopping + CGUIWindowKaraokeLyrics *window = (CGUIWindowKaraokeLyrics*) g_windowManager.GetWindow(WINDOW_KARAOKELYRICS); + + if ( window ) + window->pauseSong( now_paused ); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricsmanager.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricsmanager.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricsmanager.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricsmanager.h 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,74 @@ +#ifndef KARAOKELYRICSMANAGER_H +#define KARAOKELYRICSMANAGER_H + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Interface: karaokelyricsmanager +// +#include + +class CKaraokeLyrics; +class CGUIDialogKaraokeSongSelectorSmall; + + +//! This is the main lyrics manager class, which is called from XBMC code. +class CKaraokeLyricsManager +{ + public: + //! The class instance created only once during the application life, + //! and is destroyed when the app shuts down. + CKaraokeLyricsManager(); + ~CKaraokeLyricsManager(); + + //! A new song is started playing + bool Start( const std::string& strSongPath ); + + //! Called when the current song is being paused or unpaused + void SetPaused( bool now_paused ); + + //! Called when the current song is being stopped. Changing to a new song + //! in the queue generates Stop() with followed Start() calls. May be called even if + //! Start() was not called before, so please check. + void Stop(); + + //! Might pop up a selection dialog if playback is ended + void ProcessSlow(); + + private: + //! Critical section protects this class from requests from different threads + CCriticalSection m_CritSection; + + //! A class which handles loading and rendering for this specific karaoke song. + //! Obtained from KaraokeLyricsFactory + CKaraokeLyrics * m_Lyrics; + + //! True if we're playing a karaoke song + bool m_karaokeSongPlaying; + + //! True if we played a karaoke song + bool m_karaokeSongPlayed; + + //! Stores the last time the song was still played + unsigned int m_lastPlayedTime; +}; + + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstext.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstext.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstext.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstext.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,748 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Implementation: karaokelyricstext + +#include + +#include "utils/CharsetConverter.h" +#include "settings/DisplaySettings.h" +#include "settings/Settings.h" +#include "guilib/GUITextLayout.h" +#include "guilib/GUIFont.h" +#include "karaokelyricstext.h" +#include "utils/URIUtils.h" +#include "filesystem/File.h" +#include "guilib/GUIFontManager.h" +#include "addons/Skin.h" +#include "utils/MathUtils.h" +#include "utils/log.h" +#include "utils/StringUtils.h" + +typedef struct +{ + unsigned int text; + unsigned int active; + unsigned int outline; + +} LyricColors; + +// Must be synchronized with strings.xml and GUISettings.cpp! +static LyricColors gLyricColors[] = +{ + // white/green + // First 0xFF is alpha! + { 0xFFDADADA, 0xFF00FF00, 0xFF000000 }, + + // white/red + { 0xFFDADADA, 0xFFFF0000, 0xFF000000 }, + + // white/blue + { 0xFFDADADA, 0xFF0000FF, 0xFF000000 }, + + // black/white + { 0xFF000000, 0xFFDADADA, 0xFFFFFFFF }, +}; + + +CKaraokeLyricsText::CKaraokeLyricsText() + : CKaraokeLyrics() +{ + m_karaokeLayout = 0; + m_preambleLayout = 0; + m_karaokeFont = 0; + + int coloridx = CSettings::Get().GetInt("karaoke.fontcolors"); + if ( coloridx < KARAOKE_COLOR_START || coloridx >= KARAOKE_COLOR_END ) + coloridx = 0; + + m_colorLyrics = gLyricColors[coloridx].text; + m_colorLyricsOutline = gLyricColors[coloridx].outline; + m_colorSinging = StringUtils::Format("%08X", gLyricColors[coloridx].active); + + m_delayAfter = 50; // 5 seconds + m_showLyricsBeforeStart = 50; // 7.5 seconds + m_showPreambleBeforeStart = 35; // 5.5 seconds + m_paragraphBreakTime = 50; // 5 seconds; for autodetection paragraph breaks + m_mergeLines = true; + m_hasPitch = false; + m_videoOffset = 0; + + m_lyricsState = STATE_END_SONG; +} + + +CKaraokeLyricsText::~CKaraokeLyricsText() +{ +} + +void CKaraokeLyricsText::clearLyrics() +{ + m_lyrics.clear(); + m_songName.clear(); + m_artist.clear(); + m_hasPitch = false; + m_videoFile.clear(); + m_videoOffset = 0; +} + + +void CKaraokeLyricsText::addLyrics(const std::string & text, unsigned int timing, unsigned int flags, unsigned int pitch) +{ + Lyric line; + + if ( flags & LYRICS_CONVERT_UTF8 ) + { + // Reset the flag + flags &= ~LYRICS_CONVERT_UTF8; + g_charsetConverter.unknownToUTF8(text, line.text); + } + else + { + line.text = text; + } + + line.flags = flags; + line.timing = timing; + line.pitch = pitch; + + // If this is the first entry, remove LYRICS_NEW_LINE and LYRICS_NEW_PARAGRAPH flags + if ( m_lyrics.size() == 0 ) + line.flags &= ~(LYRICS_NEW_LINE | LYRICS_NEW_PARAGRAPH ); + + // 'New paragraph' includes new line as well + if ( line.flags & LYRICS_NEW_PARAGRAPH ) + line.flags &= ~LYRICS_NEW_LINE; + + m_lyrics.push_back( line ); +} + + +bool CKaraokeLyricsText::InitGraphics() +{ + if ( m_lyrics.empty() ) + return false; + + std::string fontPath = URIUtils::AddFileToFolder("special://home/media/Fonts/", CSettings::Get().GetString("karaoke.font")); + if (!XFILE::CFile::Exists(fontPath)) + fontPath = URIUtils::AddFileToFolder("special://xbmc/media/Fonts/", CSettings::Get().GetString("karaoke.font")); + m_karaokeFont = g_fontManager.LoadTTF("__karaoke__", fontPath, + m_colorLyrics, 0, CSettings::Get().GetInt("karaoke.fontheight"), FONT_STYLE_BOLD ); + CGUIFont *karaokeBorder = g_fontManager.LoadTTF("__karaokeborder__", fontPath, + m_colorLyrics, 0, CSettings::Get().GetInt("karaoke.fontheight"), FONT_STYLE_BOLD, true ); + + if ( !m_karaokeFont ) + { + CLog::Log(LOGERROR, "CKaraokeLyricsText::PrepareGraphicsData - Unable to load subtitle font"); + return false; + } + + m_karaokeLayout = new CGUITextLayout( m_karaokeFont, true, 0, karaokeBorder ); + m_preambleLayout = new CGUITextLayout( m_karaokeFont, true, 0, karaokeBorder ); + + if ( !m_karaokeLayout || !m_preambleLayout ) + { + delete m_preambleLayout; + delete m_karaokeLayout; + m_karaokeLayout = m_preambleLayout = 0; + + CLog::Log(LOGERROR, "CKaraokeLyricsText::PrepareGraphicsData - cannot create layout"); + return false; + } + + rescanLyrics(); + + m_indexNextPara = 0; + + // Generate next paragraph + nextParagraph(); + + m_lyricsState = STATE_WAITING; + return true; +} + + +void CKaraokeLyricsText::Shutdown() +{ + CKaraokeLyrics::Shutdown(); + + delete m_preambleLayout; + m_preambleLayout = 0; + + if ( m_karaokeLayout ) + { + g_fontManager.Unload("__karaoke__"); + g_fontManager.Unload("__karaokeborder__"); + delete m_karaokeLayout; + m_karaokeLayout = NULL; + } + + m_lyricsState = STATE_END_SONG; +} + + +void CKaraokeLyricsText::Render() +{ + if ( !m_karaokeLayout ) + return; + + // Get the current song timing + unsigned int songTime = (unsigned int) MathUtils::round_int( (getSongTime() * 10) ); + + bool updatePreamble = false; + bool updateText = false; + + // No returns in switch if anything needs to be drawn! Just break! + switch ( m_lyricsState ) + { + // the next paragraph lyrics are not shown yet. Screen is clear. + // m_index points to the first entry. + case STATE_WAITING: + if ( songTime + m_showLyricsBeforeStart < m_lyrics[ m_index ].timing ) + return; + + // Is it time to play already? + if ( songTime >= m_lyrics[ m_index ].timing ) + { + m_lyricsState = STATE_PLAYING_PARAGRAPH; + } + else + { + m_lyricsState = STATE_PREAMBLE; + m_lastPreambleUpdate = songTime; + } + + updateText = true; + break; + + // the next paragraph lyrics are shown, but the paragraph hasn't start yet. + // Using m_lastPreambleUpdate, we redraw the marker each second. + case STATE_PREAMBLE: + if ( songTime < m_lyrics[ m_index ].timing ) + { + // Time to redraw preamble? + if ( songTime + m_showPreambleBeforeStart >= m_lyrics[ m_index ].timing ) + { + if ( songTime - m_lastPreambleUpdate >= 10 ) + { + // Fall through out of switch() to redraw + m_lastPreambleUpdate = songTime; + updatePreamble = true; + } + } + } + else + { + updateText = true; + m_lyricsState = STATE_PLAYING_PARAGRAPH; + } + break; + + // The lyrics are shown, but nothing is colored or no color is changed yet. + // m_indexStart, m_indexEnd and m_index are set, m_index timing shows when to color. + case STATE_PLAYING_PARAGRAPH: + if ( songTime >= m_lyrics[ m_index ].timing ) + { + while ( songTime >= m_lyrics[ m_index ].timing && m_index <= m_indexEndPara ) + m_index++; + + updateText = true; + + if ( m_index > m_indexEndPara ) + m_lyricsState = STATE_END_PARAGRAPH; + } + break; + + // the whole paragraph is colored, but still shown, waiting until it's time to clear the lyrics. + // m_index still points to the last entry, and m_indexNextPara points to the first entry of next + // paragraph, or to LYRICS_END. When the next paragraph is about to start (which is + // m_indexNextPara timing - m_showLyricsBeforeStart), the state switches to STATE_START_PARAGRAPH. When time + // goes after m_index timing + m_delayAfter, the state switches to STATE_WAITING, + case STATE_END_PARAGRAPH: + { + unsigned int paraEnd = m_lyrics[ m_indexEndPara ].timing + m_delayAfter; + + // If the next paragraph starts before current ends, use its start time as our end + if ( m_indexNextPara != LYRICS_END && m_lyrics[ m_indexNextPara ].timing <= paraEnd + m_showLyricsBeforeStart ) + { + if ( m_lyrics[ m_indexNextPara ].timing > m_showLyricsBeforeStart ) + paraEnd = m_lyrics[ m_indexNextPara ].timing - m_showLyricsBeforeStart; + else + paraEnd = 0; + } + + if ( songTime >= paraEnd ) + { + // Is the song ended? + if ( m_indexNextPara != LYRICS_END ) + { + // Are we still waiting? + if ( songTime >= m_lyrics[ m_indexNextPara ].timing ) + m_lyricsState = STATE_PLAYING_PARAGRAPH; + else + m_lyricsState = STATE_WAITING; + + // Get next paragraph + nextParagraph(); + updateText = true; + } + else + { + m_lyricsState = STATE_END_SONG; + return; + } + } + } + break; + + case STATE_END_SONG: + // the song is completed, there are no more lyrics to show. This state is finita la comedia. + return; + } + + // Calculate drawing parameters + const RESOLUTION_INFO info = g_graphicsContext.GetResInfo(); + g_graphicsContext.SetRenderingResolution(info, false); + float maxWidth = (float) info.Overscan.right - info.Overscan.left; + + // We must only fall through for STATE_DRAW_SYLLABLE or STATE_PREAMBLE + if ( updateText ) + { + // So we need to update the layout with current paragraph text, optionally colored according to index + bool color_used = false; + m_currentLyrics = ""; + + // Draw the current paragraph test if needed + if ( songTime + m_showLyricsBeforeStart >= m_lyrics[ m_indexStartPara ].timing ) + { + for ( unsigned int i = m_indexStartPara; i <= m_indexEndPara; i++ ) + { + if ( m_lyrics[i].flags & LYRICS_NEW_LINE ) + m_currentLyrics += "[CR]"; + + if ( i == m_indexStartPara && songTime >= m_lyrics[ m_indexStartPara ].timing ) + { + color_used = true; + m_currentLyrics += "[COLOR " + m_colorSinging + "]"; + } + + if ( songTime < m_lyrics[ i ].timing && color_used ) + { + color_used = false; + m_currentLyrics += "[/COLOR]"; + } + + m_currentLyrics += m_lyrics[i].text; + } + + if ( color_used ) + m_currentLyrics += "[/COLOR]"; + +// CLog::Log( LOGERROR, "Updating text: state %d, time %d, start %d, index %d (time %d) [%s], text %s", +// m_lyricsState, songTime, m_lyrics[ m_indexStartPara ].timing, m_index, m_lyrics[ m_index ].timing, +// m_lyrics[ m_index ].text.c_str(), m_currentLyrics.c_str()); + } + + m_karaokeLayout->Update(m_currentLyrics, maxWidth * 0.9f); + updateText = false; + } + + if ( updatePreamble ) + { + m_currentPreamble = ""; + + // Get number of seconds left to the song start + if ( m_lyrics[ m_indexStartPara ].timing >= songTime ) + { + unsigned int seconds = (m_lyrics[ m_indexStartPara ].timing - songTime) / 10; + + while ( seconds-- > 0 ) + m_currentPreamble += "- "; + } + + m_preambleLayout->Update( m_currentPreamble, maxWidth * 0.9f ); + } + + float x = maxWidth * 0.5f + info.Overscan.left; + float y = (float)info.Overscan.top + + (info.Overscan.bottom - info.Overscan.top) / 8; + + float textWidth, textHeight; + m_karaokeLayout->GetTextExtent(textWidth, textHeight); + m_karaokeLayout->RenderOutline(x, y, 0, m_colorLyricsOutline, XBFONT_CENTER_X, maxWidth); + + if ( !m_currentPreamble.empty() ) + { + float pretextWidth, pretextHeight; + m_preambleLayout->GetTextExtent(pretextWidth, pretextHeight); + m_preambleLayout->RenderOutline(x - textWidth / 2, y - pretextHeight, 0, m_colorLyricsOutline, XBFONT_LEFT, maxWidth); + } +} + + +void CKaraokeLyricsText::nextParagraph() +{ + if ( m_indexNextPara == LYRICS_END ) + return; + + bool new_para_found = false; + m_indexStartPara = m_index = m_indexNextPara; + + for ( m_indexEndPara = m_index + 1; m_indexEndPara < m_lyrics.size(); m_indexEndPara++ ) + { + if ( m_lyrics[ m_indexEndPara ].flags & LYRICS_NEW_PARAGRAPH + || ( m_lyrics[ m_indexEndPara ].timing - m_lyrics[ m_indexEndPara - 1 ].timing ) > m_paragraphBreakTime ) + { + new_para_found = true; + break; + } + } + + // Is this the end of array? + if ( new_para_found ) + m_indexNextPara = m_indexEndPara; + else + m_indexNextPara = LYRICS_END; + + m_indexEndPara--; +} + + +typedef struct +{ + float width; // total screen width of all lyrics in this line + int timediff; // time difference between prev line ends and this line starts + bool upper_start; // true if this line started with a capital letter + int offset_start; // offset points to a 'new line' flag entry of the current line + +} LyricTimingData; + +void CKaraokeLyricsText::rescanLyrics() +{ + // Rescan fixes the following things: + // - lyrics without spaces; + // - lyrics without paragraphs + std::vector lyricdata; + unsigned int spaces = 0, syllables = 0, paragraph_lines = 0, max_lines_per_paragraph = 0; + + // First get some statistics from the lyrics: number of paragraphs, number of spaces + // and time difference between one line ends and second starts + for ( unsigned int i = 0; i < m_lyrics.size(); i++ ) + { + if (m_lyrics[i].text.find(" ") != std::string::npos) + spaces++; + + if ( m_lyrics[i].flags & LYRICS_NEW_LINE ) + paragraph_lines++; + + if ( m_lyrics[i].flags & LYRICS_NEW_PARAGRAPH ) + { + if ( max_lines_per_paragraph < paragraph_lines ) + max_lines_per_paragraph = paragraph_lines; + + paragraph_lines = 0; + } + + syllables++; + } + + // Second, add spaces if less than 5%, and rescan to gather more data. + bool add_spaces = (syllables && (spaces * 100 / syllables < 5)) ? true : false; + const RESOLUTION_INFO info = g_graphicsContext.GetResInfo(); + float maxWidth = (float) info.Overscan.right - info.Overscan.left; + + std::string line_text; + int prev_line_idx = -1; + int prev_line_timediff = -1; + + for ( unsigned int i = 0; i < m_lyrics.size(); i++ ) + { + if ( add_spaces ) + m_lyrics[i].text += " "; + + // We split the lyric when it is end of line, end of array, or current string is too long already + if ( i == (m_lyrics.size() - 1) + || (m_lyrics[i+1].flags & (LYRICS_NEW_LINE | LYRICS_NEW_PARAGRAPH)) != 0 + || getStringWidth( line_text + m_lyrics[i].text ) >= maxWidth ) + { + // End of line, or end of array. Add current string. + line_text += m_lyrics[i].text; + + // Reparagraph if we're out of screen width + if ( getStringWidth( line_text ) >= maxWidth ) + max_lines_per_paragraph = 0; + + LyricTimingData ld; + ld.width = getStringWidth( line_text ); + ld.timediff = prev_line_timediff; + ld.offset_start = prev_line_idx; + + // This piece extracts the first character of a new string and makes it uppercase in Unicode way + std::wstring temptext; + g_charsetConverter.utf8ToW( line_text, temptext ); + + // This is pretty ugly upper/lowercase for Russian unicode character set + if ( temptext[0] >= 0x410 && temptext[0] <= 0x44F ) + ld.upper_start = temptext[0] <= 0x42F; + else + { + std::string lower = m_lyrics[i].text; + StringUtils::ToLower(lower); + ld.upper_start = (m_lyrics[i].text == lower); + } + + lyricdata.push_back( ld ); + + // Reset the params + line_text = ""; + prev_line_idx = i + 1; + prev_line_timediff = (i == m_lyrics.size() - 1) ? -1 : m_lyrics[i+1].timing - m_lyrics[i].timing; + } + else + { + // Handle incorrect lyrics with no line feeds in the condition statement above + line_text += m_lyrics[i].text; + } + } + + // Now see if we need to re-paragraph. Basically we reasonably need a paragraph + // to have no more than 8 lines + if ( max_lines_per_paragraph == 0 || max_lines_per_paragraph > 8 ) + { + // Reparagraph + unsigned int paragraph_lines = 0; + float total_width = 0; + + CLog::Log( LOGDEBUG, "CKaraokeLyricsText: lines need to be reparagraphed" ); + + for ( unsigned int i = 0; i < lyricdata.size(); i++ ) + { + // Is this the first line? + if ( lyricdata[i].timediff == -1 ) + { + total_width = lyricdata[i].width; + continue; + } + + // Do we merge the current line with previous? We do it if: + // - there is a room on the screen for those lines combined + // - the time difference between line ends and new starts is less than 1.5 sec + // - the first character in the new line is not uppercase (i.e. new logic line) + if ( m_mergeLines && total_width + lyricdata[i].width < maxWidth && !lyricdata[i].upper_start && lyricdata[i].timediff < 15 ) + { + // Merge + m_lyrics[ lyricdata[i].offset_start ].flags &= ~(LYRICS_NEW_LINE | LYRICS_NEW_PARAGRAPH); + + // Since we merged the line, add the extra space. It will be removed later if not necessary. + m_lyrics[ lyricdata[i].offset_start ].text = " " + m_lyrics[ lyricdata[i].offset_start ].text; + total_width += lyricdata[i].width; + +// CLog::Log(LOGERROR, "Line merged; diff %d width %g, start %d, offset %d, max %g", +// lyricdata[i].timediff, lyricdata[i].width, lyricdata[i].upper_start, lyricdata[i].offset_start, maxWidth ); + } + else + { + // Do not merge; reset width and add counter + total_width = lyricdata[i].width; + paragraph_lines++; + +// CLog::Log(LOGERROR, "Line not merged; diff %d width %g, start %d, offset %d, max %g", +// lyricdata[i].timediff, lyricdata[i].width, lyricdata[i].upper_start, lyricdata[i].offset_start, maxWidth ); + } + + // Set paragraph + if ( paragraph_lines > 3 ) + { + m_lyrics[ lyricdata[i].offset_start ].flags &= ~LYRICS_NEW_LINE; + m_lyrics[ lyricdata[i].offset_start ].flags |= LYRICS_NEW_PARAGRAPH; + paragraph_lines = 0; + line_text = ""; + } + } + } + + // Prepare a new first lyric entry with song name and artist. + if ( m_songName.empty() ) + { + m_songName = URIUtils::GetFileName( getSongFile() ); + URIUtils::RemoveExtension( m_songName ); + } + + // Split the lyrics into per-character array + std::vector newlyrics; + bool title_entry = false; + + if ( m_lyrics.size() > 0 && m_lyrics[0].timing >= 50 ) + { + // Add a new title/artist entry + Lyric ltitle; + ltitle.flags = 0; + ltitle.timing = 0; + ltitle.text = m_songName; + + if ( !m_artist.empty() ) + ltitle.text += "[CR][CR]" + m_artist; + + newlyrics.push_back( ltitle ); + title_entry = true; + } + + bool last_was_space = false; + bool invalid_timing_reported = false; + for ( unsigned int i = 0; i < m_lyrics.size(); i++ ) + { + std::wstring utf16; + g_charsetConverter.utf8ToW( m_lyrics[i].text, utf16 ); + + // Skip empty lyrics + if ( utf16.size() == 0 ) + continue; + + // Use default timing for the last note + unsigned int next_timing = m_lyrics[ i ].timing + m_delayAfter; + + if ( i < (m_lyrics.size() - 1) ) + { + // Set the lenght for the syllable to the length of prev syllable if: + // - this is not the first lyric (as there is no prev otherwise) + // - this is the last lyric on this line (otherwise use next); + // - this is not the ONLY lyric on this line (otherwise the calculation is wrong) + // - lyrics size is the same as previous (currently removed). + if ( i > 0 + && m_lyrics[ i + 1 ].flags & (LYRICS_NEW_LINE | LYRICS_NEW_PARAGRAPH) + && ! (m_lyrics[ i ].flags & (LYRICS_NEW_LINE | LYRICS_NEW_PARAGRAPH) ) ) +// && m_lyrics[ i ].text.size() == m_lyrics[ i -1 ].text.size() ) + next_timing = m_lyrics[ i ].timing + (m_lyrics[ i ].timing - m_lyrics[ i -1 ].timing ); + + // Sanity check + if ( m_lyrics[ i+1 ].timing < m_lyrics[ i ].timing ) + { + if ( !invalid_timing_reported ) + CLog::Log( LOGERROR, "Karaoke lyrics normalizer: time went backward, enabling workaround" ); + + invalid_timing_reported = true; + m_lyrics[ i ].timing = m_lyrics[ i+1 ].timing; + } + + if ( m_lyrics[ i+1 ].timing < next_timing ) + next_timing = m_lyrics[ i+1 ].timing; + } + + // Calculate how many 1/10 seconds we have per lyric character + double time_per_char = ((double) next_timing - m_lyrics[ i ].timing) / utf16.size(); + + // Convert to characters + for ( unsigned int j = 0; j < utf16.size(); j++ ) + { + Lyric l; + + // Copy flags only to the first character + if ( j == 0 ) + l.flags = m_lyrics[i].flags; + else + l.flags = 0; + l.timing = (unsigned int) MathUtils::round_int( m_lyrics[ i ].timing + j * time_per_char ); + + g_charsetConverter.wToUTF8( utf16.substr(j, 1), l.text); + + if ( l.text == " " ) + { + if ( last_was_space ) + continue; + + last_was_space = true; + } + else + last_was_space = false; + + newlyrics.push_back( l ); + } + } + + m_lyrics = newlyrics; + + // Set the NEW PARAGRAPH flag on the first real lyric entry since we changed it + if ( title_entry ) + m_lyrics[1].flags |= LYRICS_NEW_PARAGRAPH; + + saveLyrics(); +} + + +float CKaraokeLyricsText::getStringWidth(const std::string & text) +{ + std::wstring utf16; + vecText utf32; + + g_charsetConverter.utf8ToW(text, utf16); + + utf32.resize( utf16.size() ); + for ( unsigned int i = 0; i < utf16.size(); i++ ) + utf32[i] = utf16[i]; + + return m_karaokeFont->GetTextWidth(utf32); +} + +void CKaraokeLyricsText::saveLyrics() +{ + XFILE::CFile file; + + std::string out; + + for ( unsigned int i = 0; i < m_lyrics.size(); i++ ) + { + std::string timing = StringUtils::Format("%02d:%02d.%d", + m_lyrics[i].timing / 600, + (m_lyrics[i].timing % 600) / 10, + (m_lyrics[i].timing % 10)); + + if ( (m_lyrics[i].flags & LYRICS_NEW_PARAGRAPH) != 0 ) + out += "\n\n"; + + if ( (m_lyrics[i].flags & LYRICS_NEW_LINE) != 0 ) + out += "\n"; + + out += "[" + timing + "]" + m_lyrics[i].text; + } + + out += "\n"; + + if ( !file.OpenForWrite( "special://temp/tmp.lrc", true ) ) + return; + + file.Write( out.c_str(), out.size() ); +} + + +bool CKaraokeLyricsText::HasBackground() +{ + return false; +} + +bool CKaraokeLyricsText::HasVideo() +{ + return m_videoFile.empty() ? false : true; +} + +void CKaraokeLyricsText::GetVideoParameters(std::string& path, int64_t& offset) +{ + path = m_videoFile; + offset = m_videoOffset; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstext.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstext.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstext.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstext.h 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,205 @@ +#ifndef KARAOKELYRICSTEXT_H +#define KARAOKELYRICSTEXT_H + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Interface: karaokelyricstext + +#include "karaokelyrics.h" + +// Karaoke colours +// If you want to add more colors, it should be done the following way: +// 1. Increase KARAOKE_COLOR_END +// 2. Add a new color description in language/English/strings.xml in block +// with id 22040 + KARAOKE_COLOR_END value +// 3. Add a new color hex mask into gLyricColors structure in karaoke/karaokelyricstext.cpp +#define KARAOKE_COLOR_START 0 +#define KARAOKE_COLOR_END 4 + +class CGUITextLayout; +class CGUIFont; + +//! This class is a base abstract class for all lyric loaders which provide text-based lyrics. +//! Once the lyrics are properly transferred to this class, it will take care of rendering. +//! Therefore the Render() function in the derived class might be empty, but must still call +//! the parent function to function properly. +class CKaraokeLyricsText : public CKaraokeLyrics +{ + public: + CKaraokeLyricsText(); + virtual ~CKaraokeLyricsText(); + + //! Parses the lyrics or song file, and loads the lyrics into memory. + //! Done in derived classes, this class only takes care of rendering. + virtual bool Load() = 0; + + //! Most of text lyrics do not have any backgrounds + virtual bool HasBackground(); + + //! UStar lyrics might have video + virtual bool HasVideo(); + virtual void GetVideoParameters(std::string& path, int64_t& offset ); + + protected: + enum + { + LYRICS_NONE = 0, + LYRICS_NEW_LINE = 0x0001, + LYRICS_NEW_PARAGRAPH = 0x0002, + LYRICS_CONVERT_UTF8 = 0x0010, + LYRICS_INVALID_PITCH = 0xFFFFFFFE, + LYRICS_END = 0xFFFFFFFF + }; + + //! Render functionality from the parent class is handled here + virtual void Render(); + + //! This function is called when the karoke visualisation window created. It may + //! be called after Start(), but is guaranteed to be called before Render() + //! Default implementation does nothing and returns true. + virtual bool InitGraphics(); + + //! This function is called when the karoke visualisation window is destroyed. + //! Default implementation does nothing. + virtual void Shutdown(); + + //! The loader should call this function to add each separate lyrics syllable. + //! timing is in 1/10 seconds; if you have time in milliseconds, multiple by 100. + //! flags could be 0 (regular), LYRICS_NEW_LINE (this syllable should start on a new line), + //! and LYRICS_NEW_PARAGRAPH (this syllable should start on a new paragraph). + //! If the lyrics support pitch (i.e. Ultrastar), it also should be specified. + void addLyrics( const std::string& text, unsigned int timing, unsigned int flags = 0, unsigned int pitch = LYRICS_INVALID_PITCH ); + + //! This function clears the lyrics array and resets song information + void clearLyrics(); + + //! This function calculares next paragraph of lyrics which will be shown. Returns true if indexes change + void nextParagraph(); + + //! Rescan lyrics, fix typical issues + void rescanLyrics(); + + //! Returns string width if rendered using current font + float getStringWidth( const std::string& text ); + + //! Saves parsed lyrics into a temporary file for debugging + void saveLyrics(); + + //! Those variables keep the song information if available, parsed from the lyrics file. + //! It should not be based on filename, as this case will be handled internally. + //! Should be set to "" if no information available. + std::string m_songName; + std::string m_artist; + bool m_hasPitch; + std::string m_videoFile; + int64_t m_videoOffset; + + private: + + //! Lyrics render state machine + enum + { + //! the next paragraph lyrics are not shown yet. Screen is clear. + //! All indexes are set, m_index points to the first element. + //! m_index timing - m_delayBefore shows when the state changes to STATE_DRAW_SYLLABLE + STATE_WAITING, + + //! the next paragraph lyrics are shown, but the paragraph hasn't start yet. + //! Using m_preambleTime, we redraw the marker each second. + STATE_PREAMBLE, + + //! the lyrics are played, the end of paragraph is not reached. + STATE_PLAYING_PARAGRAPH, + + //! the whole paragraph is colored, but still shown, waiting until it's time to clear the lyrics. + //! m_index still points to the last entry, and m_indexNextPara points to the first entry of next + //! paragraph, or to LYRICS_END. When the next paragraph is about to start (which is + //! m_indexNextPara timing - m_delayBefore), the state switches to STATE_START_PARAGRAPH. When time + //! goes after m_index timing + m_delayAfter, the state switches to STATE_WAITING, + STATE_END_PARAGRAPH, + + //!< the song is completed, there are no more lyrics to show. This state is finita la comedia. + STATE_END_SONG + }; + + typedef struct + { + std::string text; + unsigned int timing; + unsigned int flags; + unsigned int pitch; + + } Lyric; + + std::vector m_lyrics; + + //! Text layout for lyrics + CGUITextLayout * m_karaokeLayout; + + //! Text layout for preamble + CGUITextLayout * m_preambleLayout; + + //! Fond for lyrics + CGUIFont * m_karaokeFont; + + //! Lyrics colors + unsigned int m_colorLyrics; + unsigned int m_colorLyricsOutline; + std::string m_colorSinging; + + //! This is index in m_lyrics pointing to current paragraph first, last and current elements + unsigned int m_indexEndPara; + unsigned int m_indexStartPara; + unsigned int m_index; + + //! This is preamble timing, used to update preamble each second + unsigned int m_lastPreambleUpdate; + + //! This is index in m_lyrics pointing to next paragraph. + //! If LYRICS_END - there is no next paragraph + unsigned int m_indexNextPara; + + //! Current lyrics rendering state + unsigned int m_lyricsState; + + //! Lyrics text on screen + std::string m_currentLyrics; + + //! Preamble text on screen + std::string m_currentPreamble; + + // + // Configuration settings + // + //! Number of 1/10 seconds between the lyrics are shown and start singing. 50 means 5 seconds + unsigned int m_showLyricsBeforeStart; + unsigned int m_showPreambleBeforeStart; + bool m_mergeLines; + + //! Autosplitter uses this value to split paragraphs. If a new line starts in more than + //! m_paragraphBreakTime after current line ends, it's a new paragraph. + unsigned int m_paragraphBreakTime; + + //! Number of 1/10 seconds after the lyrics are sung. 50 means 5 seconds + unsigned int m_delayAfter; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextkar.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextkar.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextkar.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextkar.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,597 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Implementation: karaokelyricstextkar + +#include "utils/CharsetConverter.h" +#include "filesystem/File.h" +#include "settings/Settings.h" +#include "utils/log.h" +#include "utils/Utf8Utils.h" +#include + +#include "karaokelyricstextkar.h" + + +// Parsed lyrics +typedef struct +{ + unsigned int clocks; + unsigned int track; + std::string text; + unsigned int flags; + +} MidiLyrics; + + +// Parsed tempo change structure +typedef struct +{ + unsigned int clocks; + unsigned int tempo; + +} MidiTempo; + + +// Parsed per-channel info +typedef struct +{ + unsigned int total_lyrics; + unsigned int total_lyrics_space; + +} MidiChannelInfo; + + +// Based entirely on class MidiTimestamp from pyKaraoke +// Based entirely on class MidiTimestamp from pyKaraoke +class MidiTimestamp +{ + private: + const std::vector& m_tempo; + double m_currentMs; + unsigned int m_currentClick; + unsigned int m_tempoIndex; + unsigned int m_division; + + public: + MidiTimestamp( const std::vector& tempo, unsigned int division ) + : m_tempo (tempo), m_division (division) + { + reset(); + } + + void reset() + { + m_currentMs = 0.0; + m_currentClick = 0; + m_tempoIndex = 0; + } + + double getTimeForClicks( unsigned int click, unsigned int tempo ) + { + double microseconds = ( ( float(click) / m_division ) * tempo ); + return microseconds / 1000.0; + } + + // Returns the "advanced" clock value in ms. + double advanceClocks( unsigned int click ) + { + // Moves time forward to the indicated click number. + if ( m_currentClick > click ) + throw("Malformed lyrics timing"); + + unsigned int clicks = click - m_currentClick; + + while ( clicks > 0 && m_tempoIndex < m_tempo.size() ) + { + // How many clicks remain at the current tempo? + unsigned int clicksRemaining = 0; + + if ( m_tempo[ m_tempoIndex ].clocks - m_currentClick > 0 ) + clicksRemaining = m_tempo[ m_tempoIndex ].clocks - m_currentClick; + + unsigned int clicksUsed = clicks < clicksRemaining ? clicks : clicksRemaining; + + if ( clicksUsed > 0 && m_tempoIndex > 0 ) + m_currentMs += getTimeForClicks( clicksUsed, m_tempo[ m_tempoIndex - 1 ].tempo ); + + m_currentClick += clicksUsed; + clicks -= clicksUsed; + clicksRemaining -= clicksUsed; + + if ( clicksRemaining == 0 ) + m_tempoIndex++; + } + + if ( clicks > 0 ) + { + // We have reached the last tempo mark of the song, so this tempo holds forever. + m_currentMs += getTimeForClicks( clicks, m_tempo[ m_tempoIndex - 1 ].tempo ); + m_currentClick += clicks; + } + + return m_currentMs; + } +}; + + + +CKaraokeLyricsTextKAR::CKaraokeLyricsTextKAR( const std::string & midiFile ) + : CKaraokeLyricsText() + , m_midiFile(midiFile) +{ +} + + +CKaraokeLyricsTextKAR::~CKaraokeLyricsTextKAR() +{ +} + + +bool CKaraokeLyricsTextKAR::Load() +{ + XFILE::CFile file; + bool succeed = true; + m_reportedInvalidVarField = false; + + // Clear the lyrics array + clearLyrics(); + + if (file.LoadFile(m_midiFile, m_midiData) <= 0) + return false; + + file.Close(); + + // Parse MIDI + try + { + parseMIDI(); + } + catch ( const char * p ) + { + CLog::Log( LOGERROR, "KAR lyrics loader: cannot load file: %s", p ); + succeed = false; + } + + m_midiData.clear(); + return succeed; +} + + +// +// Got a lot of good ideas from pykaraoke by Kelvin Lawson (kelvinl@users.sf.net). Thanks! +// +void CKaraokeLyricsTextKAR::parseMIDI() +{ + m_midiOffset = 0; + + // Bytes 0-4: header + unsigned int header = readDword(); + + // If we get MS RIFF header, skip it + if ( header == 0x52494646 ) + { + setPos( currentPos() + 16 ); + header = readDword(); + } + + // MIDI header + if ( header != 0x4D546864 ) + throw( "Not a MIDI file" ); + + // Bytes 5-8: header length + unsigned int header_length = readDword(); + + // Bytes 9-10: format + unsigned short format = readWord(); + + if ( format > 2 ) + throw( "Unsupported format" ); + + // Bytes 11-12: tracks + unsigned short tracks = readWord(); + + // Bytes 13-14: divisious + unsigned short divisions = readWord(); + + if ( divisions > 32768 ) + throw( "Unsupported division" ); + + // Number of tracks is always 1 if format is 0 + if ( format == 0 ) + tracks = 1; + + // Parsed per-channel info + std::vector lyrics; + std::vector tempos; + std::vector channels; + + channels.resize( tracks ); + + // Set up default tempo + MidiTempo te; + te.clocks = 0; + te.tempo = 500000; + tempos.push_back( te ); + + int preferred_lyrics_track = -1; + int lastchannel = 0; + int laststatus = 0; + unsigned int firstNoteClocks = 1000000000; // arbitrary large value + unsigned int next_line_flag = 0; + + // Point to first byte after MIDI header + setPos( 8 + header_length ); + + // Parse all tracks + for ( int track = 0; track < tracks; track++ ) + { + char tempbuf[1024]; + unsigned int clocks = 0; + + channels[track].total_lyrics = 0; + channels[track].total_lyrics_space = 0; + + // Skip malformed files + if ( readDword() != 0x4D54726B ) + throw( "Malformed track header" ); + + // Next track position + int tracklen = readDword(); + unsigned int nexttrackstart = tracklen + currentPos(); + + // Parse track until end of track event + while ( currentPos() < nexttrackstart ) + { + // field length + clocks += readVarLen(); + unsigned char msgtype = readByte(); + + // + // Meta event + // + if ( msgtype == 0xFF ) + { + unsigned char metatype = readByte(); + unsigned int metalength = readVarLen(); + + if ( metatype == 3 ) + { + // Track title metatype + if ( metalength >= sizeof( tempbuf ) ) + throw( "Meta event too long" ); + + readData( tempbuf, metalength ); + tempbuf[metalength] = '\0'; + + if ( !strcmp( tempbuf, "Words" ) ) + preferred_lyrics_track = track; + } + else if ( metatype == 5 || metatype == 1 ) + { + // Lyrics metatype + if ( metalength >= sizeof( tempbuf ) ) + throw( "Meta event too long" ); + + readData( tempbuf, metalength ); + tempbuf[metalength] = '\0'; + + if ( (tempbuf[0] == '@' && tempbuf[1] >= 'A' && tempbuf[1] <= 'Z') + || strstr( tempbuf, " SYX" ) || strstr( tempbuf, "Track-" ) + || strstr( tempbuf, "%-" ) || strstr( tempbuf, "%+" ) ) + { + // Keywords + if ( tempbuf[0] == '@' && tempbuf[1] == 'T' && strlen( tempbuf + 2 ) > 0 ) + { + if ( m_songName.empty() ) + m_songName = convertText( tempbuf + 2 ); + else + { + if ( !m_artist.empty() ) + m_artist += "[CR]"; + + m_artist += convertText( tempbuf + 2 ); + } + } + } + else + { + MidiLyrics lyric; + lyric.clocks = clocks; + lyric.track = track; + lyric.flags = next_line_flag; + + if ( tempbuf[0] == '\\' ) + { + lyric.flags = CKaraokeLyricsText::LYRICS_NEW_PARAGRAPH; + lyric.text = convertText( tempbuf + 1 ); + } + else if ( tempbuf[0] == '/' ) + { + lyric.flags = CKaraokeLyricsText::LYRICS_NEW_LINE; + lyric.text = convertText( tempbuf + 1 ); + } + else if ( tempbuf[1] == '\0' && (tempbuf[0] == '\n' || tempbuf[0] == '\r' ) ) + { + // An empty line; do not add it but set the flag + if ( next_line_flag == CKaraokeLyricsText::LYRICS_NEW_LINE ) + next_line_flag = CKaraokeLyricsText::LYRICS_NEW_PARAGRAPH; + else + next_line_flag = CKaraokeLyricsText::LYRICS_NEW_LINE; + } + else + { + next_line_flag = (strchr(tempbuf, '\n') || strchr(tempbuf, '\r')) ? CKaraokeLyricsText::LYRICS_NEW_LINE : CKaraokeLyricsText::LYRICS_NONE; + lyric.text = convertText( tempbuf ); + } + + lyrics.push_back( lyric ); + + // Calculate the number of spaces in current syllable + for ( unsigned int j = 0; j < metalength; j++ ) + { + channels[ track ].total_lyrics++; + + if ( tempbuf[j] == 0x20 ) + channels[ track ].total_lyrics_space++; + } + } + } + else if ( metatype == 0x51 ) + { + // Set tempo event + if ( metalength != 3 ) + throw( "Invalid tempo" ); + + unsigned char a1 = readByte(); + unsigned char a2 = readByte(); + unsigned char a3 = readByte(); + unsigned int tempo = (a1 << 16) | (a2 << 8) | a3; + + // MIDI spec says tempo could only be on the first track... + // but some MIDI editors still put it on second. Shouldn't break anything anyway, but let's see + //if ( track != 0 ) + // throw( "Invalid tempo track" ); + + // Check tempo array. If previous tempo has higher clocks, abort. + if ( tempos.size() > 0 && tempos[ tempos.size() - 1 ].clocks > clocks ) + throw( "Invalid tempo" ); + + // If previous tempo has the same clocks value, override it. Otherwise add new. + if ( tempos.size() > 0 && tempos[ tempos.size() - 1 ].clocks == clocks ) + tempos[ tempos.size() - 1 ].tempo = tempo; + else + { + MidiTempo mt; + mt.clocks = clocks; + mt.tempo = tempo; + + tempos.push_back( mt ); + } + } + else + { + // Skip the event completely + setPos( currentPos() + metalength ); + } + } + else if ( msgtype== 0xF0 || msgtype == 0xF7 ) + { + // SysEx event + unsigned int length = readVarLen(); + setPos( currentPos() + length ); + } + else + { + // Regular MIDI event + if ( msgtype & 0x80 ) + { + // Status byte + laststatus = ( msgtype >> 4) & 0x07; + lastchannel = msgtype & 0x0F; + + if ( laststatus != 0x07 ) + msgtype = readByte() & 0x7F; + } + + switch ( laststatus ) + { + case 0: // Note off + readByte(); + break; + + case 1: // Note on + if ( (readByte() & 0x7F) != 0 ) // this would be in fact Note off + { + // Remember the time the first note played + if ( firstNoteClocks > clocks ) + firstNoteClocks = clocks; + } + break; + + case 2: // Key Pressure + case 3: // Control change + case 6: // Pitch wheel + readByte(); + break; + + case 4: // Program change + case 5: // Channel pressure + break; + + default: // case 7: Ignore this event + if ( (lastchannel & 0x0F) == 2 ) // Sys Com Song Position Pntr + readWord(); + else if ( (lastchannel & 0x0F) == 3 ) // Sys Com Song Select(Song #) + readByte(); + break; + } + } + } + } + + // The MIDI file is parsed. Now try to find the preferred lyric track + if ( preferred_lyrics_track == -1 || channels[preferred_lyrics_track].total_lyrics == 0 ) + { + unsigned int max_lyrics = 0; + + for ( unsigned int t = 0; t < tracks; t++ ) + { + if ( channels[t].total_lyrics > max_lyrics ) + { + preferred_lyrics_track = t; + max_lyrics = channels[t].total_lyrics; + } + } + } + + if ( preferred_lyrics_track == -1 ) + throw( "No lyrics found" ); + + // We found the lyrics track. Dump some debug information. + MidiTimestamp mts( tempos, divisions ); + double firstNoteTime = mts.advanceClocks( firstNoteClocks ); + + CLog::Log( LOGDEBUG, "KAR lyric loader: found lyric track %d, first offset %d (%g ms)", preferred_lyrics_track, firstNoteClocks, firstNoteTime ); + + // Now go through all lyrics on this track, convert them into time. + mts.reset(); + + for ( unsigned int i = 0; i < lyrics.size(); i++ ) + { + if ( (int) lyrics[i].track != preferred_lyrics_track ) + continue; + + double lyrics_timing = mts.advanceClocks( lyrics[i].clocks ); + + // Skip lyrics which start before the first note + if ( lyrics_timing < firstNoteTime ) + continue; + + unsigned int mstime = (unsigned int)ceil( (lyrics_timing - firstNoteTime) / 100); + addLyrics( lyrics[i].text, mstime, lyrics[i].flags ); + } +} + + +unsigned char CKaraokeLyricsTextKAR::readByte() +{ + if (m_midiOffset >= m_midiData.size()) + throw( "Cannot read byte: premature end of file" ); + + return (unsigned char) m_midiData.get()[m_midiOffset++]; +} + +unsigned short CKaraokeLyricsTextKAR::readWord() +{ + if (m_midiOffset + 1 >= m_midiData.size()) + throw( "Cannot read word: premature end of file" ); + + m_midiOffset += 2; + return ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-2])) << 8 | + ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-1])); +} + + +unsigned int CKaraokeLyricsTextKAR::readDword() +{ + if (m_midiOffset + 3 >= m_midiData.size()) + throw( "Cannot read dword: premature end of file" ); + + m_midiOffset += 4; + return ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-4])) << 24 | + ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-3])) << 16 | + ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-2])) << 8 | + ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-1])); +} + +int CKaraokeLyricsTextKAR::readVarLen() +{ + int l = 0, c; + + c = readByte(); + + if ( !(c & 0x80) ) + return l | c; + + l = (l | (c & 0x7f)) << 7; + c = readByte(); + + if ( !(c & 0x80) ) + return l | c; + + l = (l | (c & 0x7f)) << 7; + c = readByte(); + + if ( !(c & 0x80) ) + return l | c; + + l = (l | (c & 0x7f)) << 7; + c = readByte(); + + if ( !(c & 0x80) ) + return l | c; + + if ( !m_reportedInvalidVarField ) + { + m_reportedInvalidVarField = true; + CLog::Log( LOGWARNING, "Warning: invalid MIDI file, workaround enabled but MIDI might not sound as expected" ); + } + + l = (l | (c & 0x7f)) << 7; + c = readByte(); + + if ( !(c & 0x80) ) + return l | c; + + throw( "Cannot read variable field" ); +} + +unsigned int CKaraokeLyricsTextKAR::currentPos() const +{ + return m_midiOffset; +} + +void CKaraokeLyricsTextKAR::setPos(unsigned int offset) +{ + m_midiOffset = offset; +} + +void CKaraokeLyricsTextKAR::readData(void * buf, unsigned int length) +{ + for ( unsigned int i = 0; i < length; i++ ) + *((char*)buf + i) = readByte(); +} + +std::string CKaraokeLyricsTextKAR::convertText( const char * data ) +{ + std::string strUTF8; + + // Use some heuristics; need to replace by real detection stuff later + if (CUtf8Utils::isValidUtf8(data) || CSettings::Get().GetString("karaoke.charset") == "DEFAULT") + strUTF8 = data; + else + g_charsetConverter.ToUtf8( CSettings::Get().GetString("karaoke.charset"), data, strUTF8 ); + + if ( strUTF8.size() == 0 ) + strUTF8 = " "; + + return strUTF8; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextkar.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextkar.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextkar.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextkar.h 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,62 @@ +#ifndef KARAOKELYRICSTEXTKAR_H +#define KARAOKELYRICSTEXTKAR_H + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Interface: karaokelyricstextkar + +#include "karaokelyricstext.h" +#include "utils/auto_buffer.h" + +//! This class loads MIDI/KAR format lyrics +class CKaraokeLyricsTextKAR : public CKaraokeLyricsText +{ + public: + CKaraokeLyricsTextKAR( const std::string & midiFile ); + ~CKaraokeLyricsTextKAR(); + + //! Parses the lyrics or song file, and loads the lyrics into memory. + //! Returns true if the lyrics are successfully loaded, false otherwise. + bool Load(); + + private: + void parseMIDI(); + std::string convertText( const char * data ); + + unsigned char readByte(); + unsigned short readWord(); + unsigned int readDword(); + int readVarLen(); + void readData( void * buf, unsigned int length ); + + unsigned int currentPos() const; + void setPos( unsigned int offset ); + + // MIDI file name + std::string m_midiFile; + + // MIDI in-memory information + XUTILS::auto_buffer m_midiData; + size_t m_midiOffset; + bool m_reportedInvalidVarField; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextlrc.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextlrc.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextlrc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextlrc.cpp 2015-06-14 19:32:50.000000000 +0000 @@ -0,0 +1,541 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Implementation: karaokelyricstextlrc + +#include + +#include "filesystem/File.h" +#include "settings/AdvancedSettings.h" +#include "utils/MathUtils.h" +#include "utils/log.h" + +#include "karaokelyricstextlrc.h" + +enum ParserState +{ + PARSER_INIT, // looking for time + PARSER_IN_TIME, // processing time + PARSER_IN_LYRICS // processing lyrics +}; + +// Used in multi-time lyric loader +typedef struct +{ + std::string text; + unsigned int timing; + unsigned int flags; +} MtLyric; + +CKaraokeLyricsTextLRC::CKaraokeLyricsTextLRC( const std::string & lyricsFile ) + : CKaraokeLyricsText() + , m_lyricsFile(lyricsFile) +{ +} + + +CKaraokeLyricsTextLRC::~CKaraokeLyricsTextLRC() +{ +} + +bool CKaraokeLyricsTextLRC::Load() +{ + XFILE::CFile file; + + // Clear the lyrics array + clearLyrics(); + + XFILE::auto_buffer buf; + if (file.LoadFile(m_lyricsFile, buf) <= 0) + { + CLog::Log(LOGERROR, "%s: can't load \"%s\" file", __FUNCTION__, m_lyricsFile.c_str()); + return false; + } + + file.Close(); + + // Parse the correction value + int timing_correction = MathUtils::round_int( g_advancedSettings.m_karaokeSyncDelayLRC * 10 ); + + unsigned int offset = 0; + + std::string songfilename = getSongFile(); + + // Skip windoze UTF8 file prefix, if any, and reject UTF16 files + if (buf.size() > 3) + { + if ((unsigned char)buf.get()[0] == 0xFF && (unsigned char)buf.get()[1] == 0xFE) + { + CLog::Log( LOGERROR, "LRC lyric loader: lyrics file is in UTF16 encoding, must be in UTF8" ); + return false; + } + + // UTF8 prefix added by some windoze apps + if ((unsigned char)buf.get()[0] == 0xEF && (unsigned char)buf.get()[1] == 0xBB && (unsigned char)buf.get()[2] == 0xBF) + offset = 3; + } + + if (checkMultiTime(buf.get() + offset, buf.size() - offset)) + return ParserMultiTime(buf.get() + offset, buf.size() - offset, timing_correction); + else + return ParserNormal(buf.get() + offset, buf.size() - offset, timing_correction); +} + +bool CKaraokeLyricsTextLRC::checkMultiTime(char *lyricData, unsigned int lyricSize) +{ + // return true only when find lines like: + // [02:24][01:40][00:51][00:05]I'm a big big girl + // but not like: + // [00:01.10]I [00:01.09]just [00:01.50]call + bool inTime = false; + bool newLine = true; + bool maybeMultiTime = false; + unsigned int i = 0; + for ( char * p = lyricData; i < lyricSize; i++, p++ ) + { + if (inTime) + { + if (*p == ']') + inTime = false; + } + else + { + if (*p == '[') + { + inTime = true; + if (newLine) + { + newLine = false; + } + else + { + if (*(p - 1) != ']') + return false; + else + maybeMultiTime = true; + } + } + if (*p == '\n') + newLine = true; + } + } + return maybeMultiTime; +} + +bool CKaraokeLyricsTextLRC::ParserNormal(char *lyricData, unsigned int lyricSize, int timing_correction) +{ + CLog::Log( LOGDEBUG, "LRC lyric loader: parser normal lyrics file" ); + // + // A simple state machine to parse the file + // + ParserState state = PARSER_INIT; + unsigned int state_offset = 0; + unsigned int lyric_flags = 0; + int lyric_time = -1; + int start_offset = 0; + unsigned int offset = 0; + + for ( char * p = lyricData; offset < lyricSize; offset++, p++ ) + { + // Skip \r + if ( *p == 0x0D ) + continue; + + if ( state == PARSER_IN_LYRICS ) + { + // Lyrics are terminated either by \n or by [ + if ( *p == '\n' || *p == '[' || *p == '<' ) + { + // Time must be there + if ( lyric_time == -1 ) + { + CLog::Log( LOGERROR, "LRC lyric loader: lyrics file has no time before lyrics" ); + return false; + } + + // Add existing lyrics + char current = *p; + std::string text; + + if ( offset > state_offset ) + { + // null-terminate string, we saved current char anyway + *p = '\0'; + text = &lyricData[0] + state_offset; + } + else + text = " "; // add a single space for empty lyric + + // If this was end of line, set the flags accordingly + if ( current == '\n' ) + { + // Add space after the trailing lyric in lrc + text += " "; + addLyrics( text, lyric_time, lyric_flags | LYRICS_CONVERT_UTF8 ); + state_offset = -1; + lyric_flags = CKaraokeLyricsText::LYRICS_NEW_LINE; + state = PARSER_INIT; + } + else + { + // No conversion needed as the file should be in UTF8 already + addLyrics( text, lyric_time, lyric_flags | LYRICS_CONVERT_UTF8 ); + lyric_flags = 0; + state_offset = offset + 1; + state = PARSER_IN_TIME; + } + + lyric_time = -1; + } + } + else if ( state == PARSER_IN_TIME ) + { + // Time is terminated by ] or > + if ( *p == ']' || *p == '>' ) + { + int mins, secs, htenths, ltenths = 0; + + if ( offset == state_offset ) + { + CLog::Log( LOGERROR, "LRC lyric loader: empty time" ); + return false; // [] - empty time + } + + // null-terminate string + char * timestr = &lyricData[0] + state_offset; + *p = '\0'; + + // Now check if this is time field or info tag. Info tags are like [ar:Pink Floyd] + char * fieldptr = strchr( timestr, ':' ); + if ( timestr[0] >= 'a' && timestr[0] <= 'z' && timestr[1] >= 'a' && timestr[1] <= 'z' && fieldptr ) + { + // Null-terminate the field name and switch to the field value + *fieldptr = '\0'; + fieldptr++; + + while ( isspace( *fieldptr ) ) + fieldptr++; + + // Check the info field + if ( !strcmp( timestr, "ar" ) ) + m_artist += fieldptr; + else if ( !strcmp( timestr, "sr" ) ) + { + // m_artist += "[CR]" + std::string( fieldptr ); // Add source to the artist name as a separate line + } + else if ( !strcmp( timestr, "ti" ) ) + m_songName = fieldptr; + else if ( !strcmp( timestr, "offset" ) ) + { + if ( sscanf( fieldptr, "%d", &start_offset ) != 1 ) + { + CLog::Log( LOGERROR, "LRC lyric loader: invalid [offset:] value '%s'", fieldptr ); + return false; // [] - empty time + } + + // Offset is in milliseconds; convert to 1/10 seconds + start_offset /= 100; + } + + state_offset = -1; + state = PARSER_INIT; + continue; + } + else if ( sscanf( timestr, "%d:%d.%1d%1d", &mins, &secs, &htenths, <enths ) == 4 ) + lyric_time = mins * 600 + secs * 10 + htenths + MathUtils::round_int( ltenths / 10 ); + else if ( sscanf( timestr, "%d:%d.%1d", &mins, &secs, &htenths ) == 3 ) + lyric_time = mins * 600 + secs * 10 + htenths; + else if ( sscanf( timestr, "%d:%d", &mins, &secs ) == 2 ) + lyric_time = mins * 600 + secs * 10; + else + { + // bad time + CLog::Log( LOGERROR, "LRC lyric loader: lyrics file has no proper time field: '%s'", timestr ); + return false; + } + + // Correct timing if necessary + lyric_time += start_offset; + lyric_time += timing_correction; + + if ( lyric_time < 0 ) + lyric_time = 0; + + // Set to next char + state_offset = offset + 1; + state = PARSER_IN_LYRICS; + } + } + else if ( state == PARSER_INIT ) + { + // Ignore spaces + if ( *p == ' ' || *p == '\t' ) + continue; + + // We're looking for [ or < + if ( *p == '[' || *p == '<' ) + { + // Set to next char + state_offset = offset + 1; + state = PARSER_IN_TIME; + lyric_time = -1; + } + else if ( *p == '\n' ) + { + // If we get a newline and we're not paragraph, set it + if ( lyric_flags & CKaraokeLyricsText::LYRICS_NEW_LINE ) + lyric_flags = CKaraokeLyricsText::LYRICS_NEW_PARAGRAPH; + } + else + { + // Everything else is error + CLog::Log( LOGERROR, "LRC lyric loader: lyrics file does not start from time" ); + return false; + } + } + } + return true; +} + +bool CKaraokeLyricsTextLRC::ParserMultiTime(char *lyricData, unsigned int lyricSize, int timing_correction) +{ + CLog::Log( LOGDEBUG, "LRC lyric loader: parser mult-time lyrics file" ); + ParserState state = PARSER_INIT; + unsigned int state_offset = 0; + unsigned int lyric_flags = 0; + std::vector lyric_time(1, -1); + int time_num = 0; + std::vector mtline; + MtLyric line; + int start_offset = 0; + unsigned int offset = 0; + + for ( char * p = lyricData; offset < lyricSize; offset++, p++ ) + { + // Skip \r + if ( *p == 0x0D ) + continue; + + if ( state == PARSER_IN_LYRICS ) + { + // Lyrics are terminated either by \n or by [ + if ( *p == '\n' || *p == '[' ) + { + // Time must be there + if ( lyric_time[0] == -1 ) + { + CLog::Log( LOGERROR, "LRC lyric loader: lyrics file has no time before lyrics" ); + return false; + } + + // Add existing lyrics + char current = *p; + std::string text; + + if ( offset > state_offset ) + { + // null-terminate string, we saved current char anyway + *p = '\0'; + text = &lyricData[0] + state_offset; + } + else + text = " "; // add a single space for empty lyric + + // If this was end of line, set the flags accordingly + if ( current == '\n' ) + { + // Add space after the trailing lyric in lrc + text += " "; + for ( int i = 0; i <= time_num; i++ ) + { + line.text = text; + line.flags = lyric_flags | LYRICS_CONVERT_UTF8; + line.timing = lyric_time[i]; + mtline.push_back( line ); + } + state_offset = -1; + lyric_flags = CKaraokeLyricsText::LYRICS_NEW_LINE; + state = PARSER_INIT; + } + else + { + // No conversion needed as the file should be in UTF8 already + for ( int i = 0; i <= time_num; i++ ) + { + line.text = text; + line.flags = lyric_flags | LYRICS_CONVERT_UTF8; + line.timing = lyric_time[i]; + mtline.push_back( line ); + } + lyric_flags = 0; + state_offset = offset + 1; + state = PARSER_IN_TIME; + } + + time_num = 0; + lyric_time.resize(1); + lyric_time[0] = -1; + } + } + else if ( state == PARSER_IN_TIME ) + { + // Time is terminated by ] or > + if ( *p == ']' || *p == '>' ) + { + int mins, secs, htenths, ltenths = 0; + + if ( offset == state_offset ) + { + CLog::Log( LOGERROR, "LRC lyric loader: empty time" ); + return false; // [] - empty time + } + + // null-terminate string + char * timestr = &lyricData[0] + state_offset; + *p = '\0'; + + // Now check if this is time field or info tag. Info tags are like [ar:Pink Floyd] + char * fieldptr = strchr( timestr, ':' ); + if ( timestr[0] >= 'a' && timestr[0] <= 'z' && timestr[1] >= 'a' && timestr[1] <= 'z' && fieldptr ) + { + // Null-terminate the field name and switch to the field value + *fieldptr = '\0'; + fieldptr++; + + while ( isspace( *fieldptr ) ) + fieldptr++; + + // Check the info field + if ( !strcmp( timestr, "ar" ) ) + m_artist += fieldptr; + else if ( !strcmp( timestr, "sr" ) ) + { + // m_artist += "[CR]" + std::string( fieldptr ); // Add source to the artist name as a separate line + } + else if ( !strcmp( timestr, "ti" ) ) + m_songName = fieldptr; + else if ( !strcmp( timestr, "offset" ) ) + { + if ( sscanf( fieldptr, "%d", &start_offset ) != 1 ) + { + CLog::Log( LOGERROR, "LRC lyric loader: invalid [offset:] value '%s'", fieldptr ); + return false; // [] - empty time + } + + // Offset is in milliseconds; convert to 1/10 seconds + start_offset /= 100; + } + + state_offset = -1; + state = PARSER_INIT; + continue; + } + else if ( sscanf( timestr, "%d:%d.%1d%1d", &mins, &secs, &htenths, <enths ) == 4 ) + lyric_time[time_num] = mins * 600 + secs * 10 + htenths + MathUtils::round_int( ltenths / 10 ); + else if ( sscanf( timestr, "%d:%d.%1d", &mins, &secs, &htenths ) == 3 ) + lyric_time[time_num] = mins * 600 + secs * 10 + htenths; + else if ( sscanf( timestr, "%d:%d", &mins, &secs ) == 2 ) + lyric_time[time_num] = mins * 600 + secs * 10; + else + { + // bad time + CLog::Log( LOGERROR, "LRC lyric loader: lyrics file has no proper time field: '%s'", timestr ); + return false; + } + + // Correct timing if necessary + lyric_time[time_num] += start_offset; + lyric_time[time_num] += timing_correction; + + if ( lyric_time[time_num] < 0 ) + lyric_time[time_num] = 0; + + // Multi-time line + if ( *(p + 1) == '[' ) + { + offset++; + p++; + state_offset = offset + 1; + state = PARSER_IN_TIME; + time_num++; + lyric_time.push_back(-1); + } + else + { + // Set to next char + state_offset = offset + 1; + state = PARSER_IN_LYRICS; + } + } + } + else if ( state == PARSER_INIT ) + { + // Ignore spaces + if ( *p == ' ' || *p == '\t' ) + continue; + + // We're looking for [ or < + if ( *p == '[' || *p == '<' ) + { + // Set to next char + state_offset = offset + 1; + state = PARSER_IN_TIME; + + time_num = 0; + lyric_time.resize(1); + lyric_time[0] = -1; + } + else if ( *p == '\n' ) + { + // If we get a newline and we're not paragraph, set it + if ( lyric_flags & CKaraokeLyricsText::LYRICS_NEW_LINE ) + lyric_flags = CKaraokeLyricsText::LYRICS_NEW_PARAGRAPH; + } + else + { + // Everything else is error + CLog::Log( LOGERROR, "LRC lyric loader: lyrics file does not start from time" ); + return false; + } + } + } + + unsigned int lyricsNum = mtline.size(); + if ( lyricsNum >= 2 ) + { + for ( unsigned int i = 0; i < lyricsNum - 1; i++ ) + { + for ( unsigned int j = i + 1; j < lyricsNum; j++ ) + { + if ( mtline[i].timing > mtline[j].timing ) + { + line = mtline[i]; + mtline[i] = mtline[j]; + mtline[j] = line; + } + } + } + } + for ( unsigned int i=0; i < lyricsNum; i++ ) + addLyrics( mtline[i].text, mtline[i].timing, mtline[i].flags ); + + return true; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextlrc.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextlrc.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextlrc.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextlrc.h 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,48 @@ +#ifndef KARAOKELYRICSTEXTLRC_H +#define KARAOKELYRICSTEXTLRC_H + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Interface: karaokelyricstextlrc + +#include "karaokelyricstext.h" + + +//! This class loads LRC format lyrics +class CKaraokeLyricsTextLRC : public CKaraokeLyricsText +{ + public: + CKaraokeLyricsTextLRC( const std::string & lyricsFile ); + ~CKaraokeLyricsTextLRC(); + + //! Parses the lyrics or song file, and loads the lyrics into memory. Returns true if the + //! lyrics are successfully loaded, false otherwise. + bool Load(); + + private: + bool checkMultiTime(char *lyricData, unsigned int lyricSize); + bool ParserNormal(char *lyricData, unsigned int lyricSize, int timing_correction); + bool ParserMultiTime(char *lyricData, unsigned int lyricSize, int timing_correction); + + std::string m_lyricsFile; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextustar.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextustar.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextustar.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextustar.cpp 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,271 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Implementation: karaokelyricstextlrc + +#include +#include + +#include "filesystem/File.h" +#include "utils/log.h" +#include "utils/URIUtils.h" +#include "utils/StringUtils.h" +#include "karaokelyricstextustar.h" + + +CKaraokeLyricsTextUStar::CKaraokeLyricsTextUStar( const std::string & lyricsFile ) + : CKaraokeLyricsText() + , m_lyricsFile(lyricsFile) +{ +} + + +CKaraokeLyricsTextUStar::~CKaraokeLyricsTextUStar() +{ +} + + +std::vector< std::string > CKaraokeLyricsTextUStar::readFile(const std::string & lyricsFile, bool report_errors ) +{ + std::vector< std::string > lines; + + XFILE::CFile file; + XFILE::auto_buffer buf; + + if (file.LoadFile(lyricsFile, buf) <= 0) + { + if (report_errors) + CLog::Log(LOGERROR, "%s: can't load \"%s\" file", __FUNCTION__, lyricsFile.c_str()); + + return std::vector< std::string >(); + } + file.Close(); + + const size_t lyricSize = buf.size(); + + // Parse into the string array + size_t offset = 0; + size_t lineoffset = 0; + + while ( offset < lyricSize ) + { + // End of line? + if (buf.get()[offset] == 0x0D || buf.get()[offset] == 0x0A) + { + // An empty line? + if ( lineoffset != offset ) + lines.push_back(std::string(buf.get() + lineoffset, offset - lineoffset)); + + // Point to the next symbol + lineoffset = offset + 1; + } + + offset++; + } + + // Last line, if any + if ( lineoffset < lyricSize ) + lines.push_back(std::string(buf.get() + lineoffset, buf.size() - lineoffset)); + + return lines; +} + + +bool CKaraokeLyricsTextUStar::isValidFile(const std::string & lyricsFile) +{ + std::vector< std::string > lines = readFile( lyricsFile, false ); + + if ( lines.size() == 0 ) + return false; + + // Generally the first line should start with '#' and the last line should start with 'E' + return ( lines[0][0] == '#' && lines[lines.size()-1][0] == 'E' ); +} + + +bool CKaraokeLyricsTextUStar::Load() +{ + // Header parameters + std::string coverimage, bgimage; + int bpm = 0, startoffsetms = 0; + bool relative = false; + + // Read the text file + std::vector< std::string > lines = readFile( m_lyricsFile, true ); + + if ( lines.size() == 0 ) + return false; + + // Clear the lyrics array + clearLyrics(); + + // Parse and validate the header according to + // http://ultrastardeluxe.xtremeweb-hosting.net/wiki/doku.php?id=editor:txt_file + unsigned int idx = 0; + + for ( ; idx < lines.size() && lines[idx][0] == '#'; idx++ ) + { + // Parse into key:value + size_t offset = lines[idx].find(':'); + if (offset == std::string::npos) + { + CLog::Log( LOGERROR, "UStar lyric loader: invalid line '%s', no semicolon", lines[idx].c_str() ); + return false; + } + + std::string key = lines[idx].substr(1, offset - 1); + std::string value = lines[idx].substr(offset + 1); + + if ( key == "TITLE" ) + m_songName = value; + else if ( key == "ARTIST" ) + m_artist = value; + else if ( key == "VIDEO" ) + { + m_videoFile = URIUtils::GetDirectory(m_lyricsFile); + m_videoFile = URIUtils::AddFileToFolder(m_videoFile, value); + + if ( !XFILE::CFile::Exists( m_videoFile ) ) + { + CLog::Log( LOGERROR, "UStar lyric loader: VIDEO entry is present, but video file %s is not found", m_videoFile.c_str() ); + m_videoFile.clear(); + } + } + else if ( key == "COVER" ) + coverimage = value; + else if ( key == "BACKGROUND" ) + bgimage = value; + else if ( key == "VIDEOGAP" ) + m_videoOffset = atoi( value.c_str() ); + else if ( key == "BPM" ) + bpm = atoi( value.c_str() ); + else if ( key == "GAP" ) + startoffsetms = atoi( value.c_str() ); + else if ( key == "RELATIVE" ) + relative = StringUtils::EqualsNoCase(value, "YES"); + else if ( key == "LANGUAGE" || key == "EDITION" || key == "GENRE" || key == "YEAR" || key == "MP3" ) + { + ; // do nothing + } + else + CLog::Log( LOGWARNING, "UStar lyric loader: unsupported keyword '%s'", key.c_str() ); + } + + // BPM must be defined + if ( bpm == 0 ) + { + CLog::Log( LOGERROR, "UStar lyric loader: BPM is not defined, file is invalid" ); + return false; + } + + // Should be more lines + if ( idx == lines.size() ) + { + CLog::Log( LOGERROR, "UStar lyric loader: no lyrics found besides the header" ); + return false; + } + + double beatstep = 60.0 / bpm / 4.0; + CLog::Log( LOGDEBUG, "UStar lyric loader: found valid lyrics, BPM is %d (%g)", bpm, beatstep ); + + // Now parse the words/notes part + int lyric_flags = 0; + + for ( ; idx < lines.size() && lines[idx][0] != 'E'; idx++ ) + { + char type = lines[idx][0]; + + // A valid type should be followed by space + if ( type != 'F' && type != ':' && type != '*' && type != '-' && lines[idx][1] != ' ' ) + { + CLog::Log( LOGERROR, "UStar lyric loader: invalid line '%s', bad note type or no tail space", lines[idx].c_str() ); + return false; + } + + // Parse the numbers in the line into the vector + int numbercount = (type == '-') ? 1 : 3; + char * p = &(lines[idx][1]); + std::vector< int > numbers; + + while ( numbercount > 0 ) + { + unsigned int length = 0; + + // Skip all leading space + while ( isspace( *p ) ) + p++; + + // skip non-space + while ( p[length] && !isspace( p[length] ) ) + { + if ( !isdigit( p[length] ) ) + { + CLog::Log( LOGERROR, "UStar lyric loader: invalid line '%s', bad digit at back-position %d", lines[idx].c_str(), numbercount ); + return false; + } + + length++; + } + + p[length++] = '\0'; + + if ( strlen(p) == 0 ) + { + CLog::Log( LOGERROR, "UStar lyric loader: invalid line '%s', empty digit at back-position %d", lines[idx].c_str(), numbercount ); + return false; + } + + numbers.push_back( atoi( p ) ); + + // Adjust p + p += length; + numbercount--; + } + + int notestart_timing = (int)((numbers[0] * beatstep) * 10 + (startoffsetms / 100)); + + if ( type != '-' ) + { + // Pitch is not used yet; notelenght will not be used at all + //int notelength = numbers[1] * beatstep * 10; + //int notepitch = numbers[2]; + + addLyrics( p, notestart_timing, lyric_flags | LYRICS_CONVERT_UTF8 ); + lyric_flags = 0; + + //CLog::Log( LOGDEBUG, ":: %d %d [%d - %d] %d '%s'", numbers[0], numbers[1], notestart_timing, notelength, notepitch, text ); + } + else + { + lyric_flags = CKaraokeLyricsText::LYRICS_NEW_LINE; + addLyrics( " ", notestart_timing, lyric_flags | LYRICS_CONVERT_UTF8 ); + + // If we're relative, adjust to the pause start + if ( relative ) + startoffsetms += (int)((numbers[0] * beatstep) * 10); + + //CLog::Log( LOGERROR, ":: [stop] %d [%d]", numbers[0], notestart_timing ); + } + } + + // Indicate that lyrics have pitch + m_hasPitch = true; + return true; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextustar.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextustar.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokelyricstextustar.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokelyricstextustar.h 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,49 @@ +#ifndef KARAOKELYRICSTEXTUSTAR_H +#define KARAOKELYRICSTEXTUSTAR_H + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Interface: karaokelyricstextlrc + +#include "karaokelyricstext.h" + + +//! This class loads UltraStar format lyrics +class CKaraokeLyricsTextUStar : public CKaraokeLyricsText +{ + public: + CKaraokeLyricsTextUStar( const std::string & lyricsFile ); + ~CKaraokeLyricsTextUStar(); + + //! Parses the lyrics or song file, and loads the lyrics into memory. Returns true if the + //! lyrics are successfully loaded, false otherwise. + bool Load(); + + static bool isValidFile( const std::string & lyricsFile ); + + private: + static std::vector readFile( const std::string & lyricsFile, bool report_errors ); + + private: + std::string m_lyricsFile; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokevideobackground.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokevideobackground.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokevideobackground.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokevideobackground.cpp 2015-06-14 19:32:50.000000000 +0000 @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "karaokevideobackground.h" + +#include "guilib/GraphicContext.h" +#include "guilib/Texture.h" +#include "guilib/GUITexture.h" +#include "Application.h" +#include "filesystem/SpecialProtocol.h" +#include "settings/AdvancedSettings.h" +#include "video/FFmpegVideoDecoder.h" +#include "system.h" +#include "utils/log.h" + +KaraokeVideoBackground::KaraokeVideoBackground() +{ + m_decoder = new FFmpegVideoDecoder(); + m_timeFromPrevSong = 0.0; + m_texture = 0; +} + +KaraokeVideoBackground::~KaraokeVideoBackground() +{ + delete m_decoder; + delete m_texture; +} + +bool KaraokeVideoBackground::openVideoFile( const std::string& filename ) +{ + std::string realPath = CSpecialProtocol::TranslatePath( filename ); + + if ( !m_decoder->open( realPath ) ) + { + CLog::Log( LOGERROR, "Karaoke Video Background: %s, video file %s (%s)", m_decoder->getErrorMsg().c_str(), filename.c_str(), realPath.c_str() ); + return false; + } + + m_videoWidth = m_decoder->getWidth(); + m_videoHeight = m_decoder->getHeight(); + m_curVideoFile = filename; + + // Find out the necessary aspect ratio for height (assuming fit by width) and width (assuming fit by height) + const RESOLUTION_INFO info = g_graphicsContext.GetResInfo(); + m_displayLeft = info.Overscan.left; + m_displayRight = info.Overscan.right; + m_displayTop = info.Overscan.top; + m_displayBottom = info.Overscan.bottom; + + int screen_width = m_displayRight - m_displayLeft; + int screen_height = m_displayBottom - m_displayTop; + + // Do we need to modify the output video size? This could happen in two cases: + // 1. Either video dimension is larger than the screen - video needs to be downscaled + // 2. Both video dimensions are smaller than the screen - video needs to be upscaled + if ( ( m_videoWidth > 0 && m_videoHeight > 0 ) + && ( ( m_videoWidth > screen_width || m_videoHeight > screen_height ) + || ( m_videoWidth < screen_width && m_videoHeight < screen_height ) ) ) + { + // Calculate the scale coefficients for width/height separately + double scale_width = (double) screen_width / (double) m_videoWidth; + double scale_height = (double) screen_height / (double) m_videoHeight; + + // And apply the smallest + double scale = scale_width < scale_height ? scale_width : scale_height; + m_videoWidth = (int) (m_videoWidth * scale); + m_videoHeight = (int) (m_videoHeight * scale); + } + + // Calculate the desktop dimensions to show the video + if ( m_videoWidth < screen_width || m_videoHeight < screen_height ) + { + m_displayLeft = (screen_width - m_videoWidth) / 2; + m_displayRight -= m_displayLeft; + + m_displayTop = (screen_height - m_videoHeight) / 2; + m_displayBottom -= m_displayTop; + } + + m_millisecondsPerFrame = 1.0 / m_decoder->getFramesPerSecond(); + + CLog::Log( LOGDEBUG, "Karaoke Video Background: Video file %s (%dx%d) length %g seconds opened successfully, will be shown as %dx%d at (%d, %d - %d, %d) rectangle", + filename.c_str(), + m_decoder->getWidth(), m_decoder->getHeight(), + m_decoder->getDuration(), + m_videoWidth, m_videoHeight, + m_displayLeft, m_displayTop, m_displayRight, m_displayBottom ); + + return true; +} + +void KaraokeVideoBackground::closeVideoFile() +{ + m_decoder->close(); +} + +void KaraokeVideoBackground::Render() +{ + // Just in case + if ( !m_texture ) + return; + + // Get the current song timing in ms. + // This will only fit songs up to 71,000 hours, so if you got a larger one, change to int64 + double current = g_application.GetTime(); + + // We're supposed to show m_decoder->getFramesPerSecond() frames in one second. + if ( current >= m_nextFrameTime ) + { + // We don't care to adjust for the exact timing as we don't worry about the exact frame rate + m_nextFrameTime = current + m_millisecondsPerFrame - (current - m_nextFrameTime); + + while ( true ) + { + if ( !m_decoder->nextFrame( m_texture ) ) + { + // End of video; restart + m_decoder->seek( 0.0 ); + m_nextFrameTime = 0.0; + continue; + } + + break; + } + } + + // We got a frame. Draw it. + CRect vertCoords((float) m_displayLeft, (float) m_displayTop, (float) m_displayRight, (float) m_displayBottom ); + CGUITexture::DrawQuad(vertCoords, 0xffffffff, m_texture ); +} + +bool KaraokeVideoBackground::Start( const std::string& filename ) +{ + if ( !filename.empty() ) + { + if ( !openVideoFile( filename ) ) + return false; + + m_timeFromPrevSong = 0; + } + else + { + if ( !openVideoFile( g_advancedSettings.m_karaokeDefaultBackgroundFilePath ) ) + return false; + + if ( m_timeFromPrevSong != 0.0 && !m_decoder->seek( m_timeFromPrevSong ) ) + m_timeFromPrevSong = 0; + } + + // Allocate the texture + m_texture = new CTexture( m_videoWidth, m_videoHeight, XB_FMT_A8R8G8B8 ); + + if ( !m_texture ) + { + CLog::Log( LOGERROR, "Karaoke Video Background: Could not allocate texture" ); + return false; + } + + m_nextFrameTime = 0.0; + return true; +} + +void KaraokeVideoBackground::Stop() +{ + delete m_texture; + m_texture = 0; + + m_timeFromPrevSong = m_decoder->getLastFrameTime(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokevideobackground.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokevideobackground.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokevideobackground.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokevideobackground.h 2015-10-19 08:38:33.000000000 +0000 @@ -0,0 +1,85 @@ +#ifndef KARAOKEVIDEOFFMPEG_H +#define KARAOKEVIDEOFFMPEG_H + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include + +class CBaseTexture; +class FFmpegVideoDecoder; + +// C++ Interface: karaokevideoffmpeg +// Contact: oldnemesis +// +// FFMpeg-based background video decoder for Karaoke background. +// We are not using DVDPlayer for this because: +// 1. DVDPlayer was not designed to run at the same time when music is being played and other things (like lyrics) rendered. +// While this setup works from time to time, it constantly gets broken. Some modes, like VDPAU, lead to crash right away. +// +// 2. We do not need to decode audio, hence we don't have to use extra CPU. +// +// 3. We do not really care about frame rate. Jerky video is fine for the background. Lyrics sync is much more important. +// +class KaraokeVideoBackground +{ +public: + KaraokeVideoBackground(); + ~KaraokeVideoBackground(); + + // Start playing the video. It is called each time a new song is being played. Should continue playing existing + // video from the position it was paused. If it returns false, the video rendering is disabled and + // KaraokeVideoFFMpeg object is deleted. Must write the reason for failure into the log file. + bool Start( const std::string& filename = "" ); + + // Render the current frame into the screen. This function also must handle video loops and + // switching to the next video when necessary. Hence it shouldn't take too long. + void Render(); + + // Stops playing the video. It is called once the song is finished and the Render() is not going to be called anymore. + // The object, however, is kept and should keep its state because it must continue on next Start() call. + void Stop(); + +private: + // Initialize the object. This function is called only once when the object is created or after it has been dismissed. + // If it returns false, the video rendering is disabled and KaraokeVideoFFMpeg object is deleted + bool Init(); + + // Dismisses the object, freeing all the memory and unloading the libraries. The object must be inited before using again. + void Dismiss(); + + bool openVideoFile( const std::string& filename ); + void closeVideoFile(); + + // FFMpeg objects + FFmpegVideoDecoder * m_decoder; + + std::string m_curVideoFile; + int m_videoWidth; // shown video width, i.e. upscaled or downscaled as necessary + int m_videoHeight; // shown video height, i.e. upscaled or downscaled as necessary + int m_displayLeft, m_displayRight, m_displayTop, m_displayBottom; // Video as shown at the display + double m_millisecondsPerFrame; + double m_nextFrameTime; + double m_timeFromPrevSong; + + CBaseTexture *m_texture; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokewindowbackground.cpp kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokewindowbackground.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokewindowbackground.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokewindowbackground.cpp 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Implementation: karaokewindowbackground + +#include "system.h" +#include "settings/AdvancedSettings.h" +#include "guilib/GUIWindowManager.h" +#include "Application.h" +#include "GUIUserMessages.h" +#include "guilib/GUIVisualisationControl.h" +#include "guilib/GUIImage.h" +#include "threads/SingleLock.h" +#include "utils/log.h" + +#include "karaokewindowbackground.h" +#include "karaokevideobackground.h" + + +#define CONTROL_ID_VIS 1 +#define CONTROL_ID_IMG 2 + + +CKaraokeWindowBackground::CKaraokeWindowBackground() +{ + m_currentMode = BACKGROUND_NONE; + m_defaultMode = BACKGROUND_NONE; + m_parentWindow = 0; + + m_VisControl = 0; + m_ImgControl = 0; + + m_videoPlayer = 0; + m_parentWindow = 0; +} + + +CKaraokeWindowBackground::~CKaraokeWindowBackground() +{ + if ( m_videoPlayer ) + delete m_videoPlayer; +} + + +void CKaraokeWindowBackground::Init(CGUIWindow * wnd) +{ + // Init controls + m_VisControl = (CGUIVisualisationControl*) wnd->GetControl( CONTROL_ID_VIS ); + m_ImgControl = (CGUIImage*) wnd->GetControl( CONTROL_ID_IMG ); + + // Init visialisation variables + std::string defBkgType = g_advancedSettings.m_karaokeDefaultBackgroundType; + + if ( defBkgType.empty() || defBkgType == "none" ) + { + CLog::Log( LOGDEBUG, "Karaoke default background is set to none" ); + m_defaultMode = BACKGROUND_NONE; + } + else if ( defBkgType == "vis" || defBkgType == "viz" ) + { + CLog::Log( LOGDEBUG, "Karaoke default background is visualisation" ); + m_defaultMode = BACKGROUND_VISUALISATION; + } + else if ( defBkgType == "image" && !g_advancedSettings.m_karaokeDefaultBackgroundFilePath.empty() ) + { + CLog::Log( LOGDEBUG, "Karaoke default background is image %s", g_advancedSettings.m_karaokeDefaultBackgroundFilePath.c_str() ); + m_defaultMode = BACKGROUND_IMAGE; + m_path = g_advancedSettings.m_karaokeDefaultBackgroundFilePath; + } + else if ( defBkgType == "video" && !g_advancedSettings.m_karaokeDefaultBackgroundFilePath.empty() ) + { + CLog::Log( LOGDEBUG, "Karaoke default background is video %s", g_advancedSettings.m_karaokeDefaultBackgroundFilePath.c_str() ); + m_defaultMode = BACKGROUND_VIDEO; + } +} + + +bool CKaraokeWindowBackground::OnAction(const CAction & action) +{ + CSingleLock lock (m_CritSectionShared); + + // Send it to the visualisation if we have one + if ( m_currentMode == BACKGROUND_VISUALISATION ) + return m_VisControl->OnAction(action); + + return false; +} + + +bool CKaraokeWindowBackground::OnMessage(CGUIMessage & message) +{ + CSingleLock lock (m_CritSectionShared); + + // Forward visualisation control messages + switch ( message.GetMessage() ) + { + case GUI_MSG_PLAYBACK_STARTED: + if ( m_currentMode == BACKGROUND_VISUALISATION ) + return m_VisControl->OnMessage(message); + break; + + case GUI_MSG_GET_VISUALISATION: + if ( m_currentMode == BACKGROUND_VISUALISATION ) + return m_VisControl->OnMessage(message); + break; + + case GUI_MSG_VISUALISATION_ACTION: + if ( m_currentMode == BACKGROUND_VISUALISATION ) + return m_VisControl->OnMessage(message); + break; + } + + return false; +} + + +void CKaraokeWindowBackground::Render() +{ + CSingleLock lock (m_CritSectionShared); + + // Proceed with video rendering + if ( m_currentMode == BACKGROUND_VIDEO && m_videoPlayer ) + { + m_videoPlayer->Render(); + } + + // For other visualisations just disable the screen saver + g_application.ResetScreenSaver(); +} + + +void CKaraokeWindowBackground::StartEmpty() +{ + m_VisControl->SetVisible( false ); + m_ImgControl->SetVisible( false ); + m_currentMode = BACKGROUND_NONE; + CLog::Log( LOGDEBUG, "Karaoke background started using BACKGROUND_NONE mode" ); +} + + +void CKaraokeWindowBackground::StartVisualisation() +{ + // Showing controls + m_ImgControl->SetVisible( false ); + m_VisControl->SetVisible( true ); + + m_currentMode = BACKGROUND_VISUALISATION; + CLog::Log( LOGDEBUG, "Karaoke background started using BACKGROUND_VISUALISATION mode" ); +} + + +void CKaraokeWindowBackground::StartImage( const std::string& path ) +{ + // Showing controls + m_ImgControl->SetVisible( true ); + m_VisControl->SetVisible( false ); + + m_ImgControl->SetFileName( path ); + + m_currentMode = BACKGROUND_IMAGE; + CLog::Log( LOGDEBUG, "Karaoke background started using BACKGROUND_IMAGE mode using image %s", path.c_str() ); +} + + +void CKaraokeWindowBackground::StartVideo( const std::string& path ) +{ + if ( !m_videoPlayer ) + m_videoPlayer = new KaraokeVideoBackground(); + + if ( !m_videoPlayer->Start( path ) ) + { + delete m_videoPlayer; + m_videoPlayer = 0; + m_currentMode = BACKGROUND_NONE; + return; + } + + m_ImgControl->SetVisible( false ); + m_VisControl->SetVisible( false ); + m_currentMode = BACKGROUND_VIDEO; +} + + +void CKaraokeWindowBackground::StartDefault() +{ + // just in case + m_ImgControl->SetVisible( false ); + m_VisControl->SetVisible( false ); + + switch ( m_defaultMode ) + { + case BACKGROUND_VISUALISATION: + StartVisualisation(); + break; + + case BACKGROUND_IMAGE: + StartImage( m_path ); + break; + + case BACKGROUND_VIDEO: + StartVideo(); + break; + + default: + StartEmpty(); + break; + } +} + + +void CKaraokeWindowBackground::Stop() +{ + CSingleLock lock (m_CritSectionShared); + m_currentMode = BACKGROUND_NONE; + + if ( m_videoPlayer ) + m_videoPlayer->Stop(); + + CLog::Log( LOGDEBUG, "Karaoke background stopped" ); +} + + +void CKaraokeWindowBackground::OnPlayBackEnded() +{ +} + +void CKaraokeWindowBackground::OnPlayBackStarted() +{ +} + +void CKaraokeWindowBackground::OnPlayBackStopped() +{ +} + +void CKaraokeWindowBackground::OnQueueNextItem() +{ +} + +void CKaraokeWindowBackground::Pause(bool now_paused) +{ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokewindowbackground.h kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokewindowbackground.h --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/karaokewindowbackground.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/karaokewindowbackground.h 2015-04-04 00:00:17.000000000 +0000 @@ -0,0 +1,102 @@ +#ifndef KARAOKEWINDOWBACKGROUND_H +#define KARAOKEWINDOWBACKGROUND_H + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// C++ Interface: karaokewindowbackground + +#include "cores/IPlayerCallback.h" + +class CGUIWindow; +class CGUIImage; +class CGUIVisualisationControl; +class KaraokeVideoBackground; + +class CKaraokeWindowBackground : public IPlayerCallback +{ +public: + CKaraokeWindowBackground(); + ~CKaraokeWindowBackground(); + + virtual void Init(CGUIWindow * wnd); + + // Start with empty background + virtual void StartEmpty(); + + // Start with visualisation background + virtual void StartVisualisation(); + + // Start with song-specific still image background + virtual void StartImage( const std::string& path ); + + // Start with song-specific video background + virtual void StartVideo( const std::string& path = "" ); + + // Start with default (setting-specific) background + virtual void StartDefault(); + + // Pause or continue the background + virtual void Pause( bool now_paused ); + + // Stop any kind of background + virtual void Stop(); + + // Function forwarders + virtual bool OnAction(const CAction &action); + virtual bool OnMessage(CGUIMessage& message); + virtual void Render(); + + // IPlayer callbacks + virtual void OnPlayBackEnded(); + virtual void OnPlayBackStarted(); + virtual void OnPlayBackStopped(); + virtual void OnQueueNextItem(); + +private: + enum BackgroundMode + { + BACKGROUND_NONE, + BACKGROUND_VISUALISATION, + BACKGROUND_IMAGE, + BACKGROUND_VIDEO + }; + + // This critical section protects all variables except m_videoEnded + CCriticalSection m_CritSectionShared; + + // for visualization background + CGUIVisualisationControl * m_VisControl; + CGUIImage * m_ImgControl; + + BackgroundMode m_currentMode; + + // Parent window pointer + CGUIWindow * m_parentWindow; + + // Video player pointer + KaraokeVideoBackground * m_videoPlayer; + + // For default visualisation mode + BackgroundMode m_defaultMode; + std::string m_path; // image +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/music/karaoke/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/karaoke/Makefile.in 2014-12-18 01:01:57.000000000 +0000 @@ -0,0 +1,17 @@ +SRCS = GUIDialogKaraokeSongSelector.cpp +SRCS += GUIWindowKaraokeLyrics.cpp +SRCS += karaokelyrics.cpp +SRCS += karaokelyricscdg.cpp +SRCS += karaokelyricsfactory.cpp +SRCS += karaokelyricsmanager.cpp +SRCS += karaokelyricstext.cpp +SRCS += karaokelyricstextkar.cpp +SRCS += karaokelyricstextlrc.cpp +SRCS += karaokelyricstextustar.cpp +SRCS += karaokevideobackground.cpp +SRCS += karaokewindowbackground.cpp + +LIB = karaoke.a + +include @abs_top_srcdir@/Makefile.include +-include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS))) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/MusicDatabase.cpp kodi-15.2~git20151019.1039-final/xbmc/music/MusicDatabase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/MusicDatabase.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/MusicDatabase.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,61 +18,58 @@ * */ +#include "network/Network.h" +#include "threads/SystemClock.h" +#include "system.h" #include "MusicDatabase.h" - -#include "addons/Addon.h" +#include "network/cddb.h" +#include "filesystem/DirectoryCache.h" +#include "filesystem/MusicDatabaseDirectory/DirectoryNode.h" +#include "filesystem/MusicDatabaseDirectory/QueryParams.h" +#include "GUIInfoManager.h" +#include "music/tags/MusicInfoTag.h" #include "addons/AddonManager.h" #include "addons/Scraper.h" -#include "Album.h" -#include "Application.h" +#include "addons/Addon.h" +#include "utils/URIUtils.h" #include "Artist.h" -#include "CueInfoLoader.h" -#include "dbwrappers/dataset.h" -#include "dialogs/GUIDialogKaiToast.h" +#include "Album.h" +#include "Song.h" +#include "guilib/GUIWindowManager.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogProgress.h" +#include "dialogs/GUIDialogYesNo.h" +#include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogSelect.h" -#include "FileItem.h" -#include "filesystem/DirectoryCache.h" #include "filesystem/File.h" -#include "filesystem/MusicDatabaseDirectory/DirectoryNode.h" -#include "filesystem/MusicDatabaseDirectory/QueryParams.h" -#include "guiinfo/GUIInfoLabels.h" -#include "GUIInfoManager.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "interfaces/AnnouncementManager.h" -#include "messaging/helpers/DialogHelper.h" -#include "music/tags/MusicInfoTag.h" -#include "network/cddb.h" -#include "network/Network.h" -#include "playlists/SmartPlayList.h" #include "profiles/ProfilesManager.h" #include "settings/AdvancedSettings.h" +#include "FileItem.h" +#include "Application.h" +#ifdef HAS_KARAOKE +#include "karaoke/karaokelyricsfactory.h" +#endif +#include "storage/MediaManager.h" #include "settings/MediaSettings.h" #include "settings/Settings.h" -#include "Song.h" -#include "storage/MediaManager.h" -#include "system.h" -#include "TextureCache.h" -#include "threads/SystemClock.h" -#include "URL.h" -#include "utils/FileUtils.h" +#include "utils/StringUtils.h" +#include "guilib/LocalizeStrings.h" #include "utils/LegacyPathTranslation.h" #include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" #include "TextureCache.h" +#include "utils/AutoPtrHandle.h" #include "interfaces/AnnouncementManager.h" #include "dbwrappers/dataset.h" #include "utils/XMLUtils.h" +#include "URL.h" +#include "playlists/SmartPlayList.h" +#include "CueInfoLoader.h" +using namespace std; +using namespace AUTOPTR; using namespace XFILE; using namespace MUSICDATABASEDIRECTORY; -using namespace KODI::MESSAGING; - using ADDON::AddonPtr; -using KODI::MESSAGING::HELPERS::DialogResponse; #define RECENTLY_PLAYED_LIMIT 25 #define MIN_FULL_SEARCH_LENGTH 3 @@ -89,7 +86,7 @@ data["id"] = id; if (g_application.IsMusicScanning()) data["transaction"] = true; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnRemove", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnRemove", data); } static void AnnounceUpdate(const std::string& content, int id) @@ -99,7 +96,7 @@ data["id"] = id; if (g_application.IsMusicScanning()) data["transaction"] = true; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnUpdate", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnUpdate", data); } CMusicDatabase::CMusicDatabase(void) @@ -125,7 +122,8 @@ " strStyles text, strInstruments text, strBiography text, " " strDied text, strDisbanded text, strYearsActive text, " " strImage text, strFanart text, " - " lastScraped varchar(20) default NULL)"); + " lastScraped varchar(20) default NULL, " + " dateAdded varchar (20) default NULL)"); CLog::Log(LOGINFO, "create album table"); m_pDS->exec("CREATE TABLE album (idAlbum integer primary key, " " strAlbum varchar(256), strMusicBrainzAlbumID text, " @@ -137,6 +135,7 @@ " strType text, " " iRating integer, " " lastScraped varchar(20) default NULL, " + " dateAdded varchar (20) default NULL, " " strReleaseType text)"); CLog::Log(LOGINFO, "create album_artist table"); m_pDS->exec("CREATE TABLE album_artist (idArtist integer, idAlbum integer, strJoinPhrase text, boolFeatured integer, iOrder integer, strArtist text)"); @@ -157,7 +156,7 @@ " iTimesPlayed integer, iStartOffset integer, iEndOffset integer, " " idThumb integer, " " lastplayed varchar(20) default NULL, " - " rating char default '0', comment text, mood text, dateAdded text)"); + " rating char default '0', comment text, mood text)"); CLog::Log(LOGINFO, "create song_artist table"); m_pDS->exec("CREATE TABLE song_artist (idArtist integer, idSong integer, strJoinPhrase text, boolFeatured integer, iOrder integer, strArtist text)"); CLog::Log(LOGINFO, "create song_genre table"); @@ -171,6 +170,10 @@ CLog::Log(LOGINFO, "create discography table"); m_pDS->exec("CREATE TABLE discography (idArtist integer, strAlbum text, strYear text)"); + CLog::Log(LOGINFO, "create karaokedata table"); + m_pDS->exec("CREATE TABLE karaokedata (iKaraNumber integer, idSong integer, iKaraDelay integer, strKaraEncoding text, " + "strKaralyrics text, strKaraLyrFileCRC text)"); + CLog::Log(LOGINFO, "create art table"); m_pDS->exec("CREATE TABLE art(art_id INTEGER PRIMARY KEY, media_id INTEGER, media_type TEXT, type TEXT, url TEXT)"); @@ -215,6 +218,9 @@ m_pDS->exec("CREATE INDEX idxAlbumInfoSong_1 ON albuminfosong ( idAlbumInfo )"); + m_pDS->exec("CREATE INDEX idxKaraNumber on karaokedata(iKaraNumber)"); + m_pDS->exec("CREATE INDEX idxKarSong on karaokedata(idSong)"); + m_pDS->exec("CREATE INDEX idxDiscography_1 ON discography ( idArtist )"); m_pDS->exec("CREATE INDEX ix_art ON art(media_id, media_type(20), type(20))"); @@ -238,6 +244,7 @@ m_pDS->exec("CREATE TRIGGER tgrDeleteSong AFTER delete ON song FOR EACH ROW BEGIN" " DELETE FROM song_artist WHERE song_artist.idSong = old.idSong;" " DELETE FROM song_genre WHERE song_genre.idSong = old.idSong;" + " DELETE FROM karaokedata WHERE karaokedata.idSong = old.idSong;" " DELETE FROM art WHERE media_id=old.idSong AND media_type='song';" " END"); m_pDS->exec("CREATE TRIGGER tgrDeletePath AFTER delete ON path FOR EACH ROW BEGIN" @@ -265,16 +272,18 @@ " song.idAlbum AS idAlbum, " " strAlbum, " " strPath, " + " iKaraNumber, iKaraDelay, strKaraEncoding," " album.bCompilation AS bCompilation," " album.strArtists AS strAlbumArtists," " album.strReleaseType AS strAlbumReleaseType," - " song.mood as mood," - " song.dateAdded as dateAdded " + " song.mood as mood " "FROM song" " JOIN album ON" " song.idAlbum=album.idAlbum" " JOIN path ON" - " song.idPath=path.idPath"); + " song.idPath=path.idPath" + " LEFT OUTER JOIN karaokedata ON" + " song.idSong=karaokedata.idSong"); CLog::Log(LOGINFO, "create album view"); m_pDS->exec("CREATE VIEW albumview AS SELECT " @@ -294,9 +303,7 @@ " iRating, " " bCompilation, " " (SELECT MIN(song.iTimesPlayed) FROM song WHERE song.idAlbum = album.idAlbum) AS iTimesPlayed, " - " strReleaseType, " - " (SELECT MAX(song.dateAdded) FROM song WHERE song.idAlbum = album.idAlbum) AS dateAdded, " - " (SELECT MAX(song.lastplayed) FROM song WHERE song.idAlbum = album.idAlbum) AS lastplayed " + " strReleaseType " "FROM album" ); @@ -307,9 +314,7 @@ " strBorn, strFormed, strGenres," " strMoods, strStyles, strInstruments, " " strBiography, strDied, strDisbanded, " - " strYearsActive, strImage, strFanart, " - " (SELECT MAX(song.dateAdded) FROM song_artist INNER JOIN song ON song.idSong = song_artist.idSong " - " WHERE song_artist.idArtist = artist.idArtist) AS dateAdded " + " strYearsActive, strImage, strFanart " "FROM artist"); CLog::Log(LOGINFO, "create albumartist view"); @@ -359,6 +364,14 @@ } } +std::string GetArtistString(const VECARTISTCREDITS &credits) +{ + std::string artistString; + for (VECARTISTCREDITS::const_iterator i = credits.begin(); i != credits.end(); ++i) + artistString += i->GetArtist() + i->GetJoinPhrase(); + return artistString; +} + void CMusicDatabase::SaveCuesheet(const std::string& fullSongPath, const std::string& strCuesheet) { std::string strPath, strFileName; @@ -385,7 +398,7 @@ return; strSQL = PrepareSQL("SELECT * FROM cue WHERE idPath=%i AND strFileName='%s'", idPath, strFileName.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() == 0) { if (strCuesheet.empty()) @@ -410,7 +423,7 @@ } } m_pDS->close(); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); m_cueCache.insert(CueCache::value_type(fullSongPath, strCuesheet)); } catch (...) @@ -445,7 +458,7 @@ return strCuesheet; strSQL = PrepareSQL("select strCuesheet from cue where idPath=%i AND strFileName='%s'", idPath, strFileName.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (0 < m_pDS->num_rows()) strCuesheet = m_pDS->get_sql_record()->at(0).get_asString(); @@ -464,7 +477,7 @@ album.idAlbum = AddAlbum(album.strAlbum, album.strMusicBrainzAlbumID, - album.GetAlbumArtistString(), + GetArtistString(album.artistCredits), album.GetGenreString(), album.iYear, album.bCompilation, album.releaseType); @@ -484,18 +497,17 @@ for (VECSONGS::iterator song = album.songs.begin(); song != album.songs.end(); ++song) { song->idAlbum = album.idAlbum; - song->idSong = AddSong(song->idAlbum, song->strTitle, song->strMusicBrainzTrackID, song->strFileName, song->strComment, song->strMood, song->strThumb, - song->GetArtistString(), song->genre, + GetArtistString(song->artistCredits), song->genre, song->iTrack, song->iDuration, song->iYear, song->iTimesPlayed, song->iStartOffset, song->iEndOffset, song->lastPlayed, - song->rating); - + song->rating, + song->iKaraokeNumber); for (VECARTISTCREDITS::iterator artistCredit = song->artistCredits.begin(); artistCredit != song->artistCredits.end(); ++artistCredit) { @@ -523,13 +535,13 @@ return true; } -bool CMusicDatabase::UpdateAlbum(CAlbum& album, bool OverrideTagData /* = true*/) +bool CMusicDatabase::UpdateAlbum(CAlbum& album) { BeginTransaction(); UpdateAlbum(album.idAlbum, album.strAlbum, album.strMusicBrainzAlbumID, - album.GetAlbumArtistString(), album.GetGenreString(), + GetArtistString(album.artistCredits), album.GetGenreString(), StringUtils::Join(album.moods, g_advancedSettings.m_musicItemSeparator).c_str(), StringUtils::Join(album.styles, g_advancedSettings.m_musicItemSeparator).c_str(), StringUtils::Join(album.themes, g_advancedSettings.m_musicItemSeparator).c_str(), @@ -538,58 +550,55 @@ album.strLabel, album.strType, album.iRating, album.iYear, album.bCompilation, album.releaseType); - if (OverrideTagData) + // Add the album artists + DeleteAlbumArtistsByAlbum(album.idAlbum); + for (VECARTISTCREDITS::iterator artistCredit = album.artistCredits.begin(); artistCredit != album.artistCredits.end(); ++artistCredit) + { + artistCredit->idArtist = AddArtist(artistCredit->GetArtist(), + artistCredit->GetMusicBrainzArtistID()); + AddAlbumArtist(artistCredit->idArtist, + album.idAlbum, + artistCredit->GetArtist(), + artistCredit->GetJoinPhrase(), + artistCredit == album.artistCredits.begin() ? false : true, + std::distance(album.artistCredits.begin(), artistCredit)); + } + + for (VECSONGS::iterator song = album.songs.begin(); song != album.songs.end(); ++song) { - // Add the album artists - DeleteAlbumArtistsByAlbum(album.idAlbum); - for (VECARTISTCREDITS::iterator artistCredit = album.artistCredits.begin(); artistCredit != album.artistCredits.end(); ++artistCredit) + UpdateSong(song->idSong, + song->strTitle, + song->strMusicBrainzTrackID, + song->strFileName, + song->strComment, + song->strMood, + song->strThumb, + GetArtistString(song->artistCredits), + song->genre, + song->iTrack, + song->iDuration, + song->iYear, + song->iTimesPlayed, + song->iStartOffset, + song->iEndOffset, + song->lastPlayed, + song->rating, + song->iKaraokeNumber); + DeleteSongArtistsBySong(song->idSong); + for (VECARTISTCREDITS::iterator artistCredit = song->artistCredits.begin(); artistCredit != song->artistCredits.end(); ++artistCredit) { artistCredit->idArtist = AddArtist(artistCredit->GetArtist(), - artistCredit->GetMusicBrainzArtistID()); - AddAlbumArtist(artistCredit->idArtist, - album.idAlbum, - artistCredit->GetArtist(), - artistCredit->GetJoinPhrase(), - artistCredit == album.artistCredits.begin() ? false : true, - std::distance(album.artistCredits.begin(), artistCredit)); - } - - for (VECSONGS::iterator song = album.songs.begin(); song != album.songs.end(); ++song) - { - UpdateSong(song->idSong, - song->strTitle, - song->strMusicBrainzTrackID, - song->strFileName, - song->strComment, - song->strMood, - song->strThumb, - song->GetArtistString(), - song->genre, - song->iTrack, - song->iDuration, - song->iYear, - song->iTimesPlayed, - song->iStartOffset, - song->iEndOffset, - song->lastPlayed, - song->rating); - DeleteSongArtistsBySong(song->idSong); - for (VECARTISTCREDITS::iterator artistCredit = song->artistCredits.begin(); artistCredit != song->artistCredits.end(); ++artistCredit) - { - artistCredit->idArtist = AddArtist(artistCredit->GetArtist(), - artistCredit->GetMusicBrainzArtistID()); - AddSongArtist(artistCredit->idArtist, - song->idSong, - artistCredit->GetArtist(), - artistCredit->GetJoinPhrase(), - artistCredit == song->artistCredits.begin() ? false : true, - std::distance(song->artistCredits.begin(), artistCredit)); - } - - SaveCuesheet(song->strFileName, song->strCueSheet); + artistCredit->GetMusicBrainzArtistID()); + AddSongArtist(artistCredit->idArtist, + song->idSong, + artistCredit->GetArtist(), + artistCredit->GetJoinPhrase(), + artistCredit == song->artistCredits.begin() ? false : true, + std::distance(song->artistCredits.begin(), artistCredit)); } - } + SaveCuesheet(song->strFileName, song->strCueSheet); + } for (VECSONGS::const_iterator infoSong = album.infoSongs.begin(); infoSong != album.infoSongs.end(); ++infoSong) AddAlbumInfoSong(album.idAlbum, *infoSong); @@ -607,7 +616,7 @@ const std::string &artistString, const std::vector& genres, int iTrack, int iDuration, int iYear, const int iTimesPlayed, int iStartOffset, int iEndOffset, - const CDateTime& dtLastPlayed, char rating) + const CDateTime& dtLastPlayed, char rating, int iKaraokeNumber) { int idSong = -1; std::string strSQL; @@ -624,18 +633,22 @@ URIUtils::Split(strPathAndFileName, strPath, strFileName); int idPath = AddPath(strPath); + bool bHasKaraoke = false; +#ifdef HAS_KARAOKE + bHasKaraoke = CKaraokeLyricsFactory::HasLyrics(strPathAndFileName); +#endif + if (!strMusicBrainzTrackID.empty()) strSQL = PrepareSQL("SELECT * FROM song WHERE idAlbum = %i AND strMusicBrainzTrackID = '%s'", idAlbum, strMusicBrainzTrackID.c_str()); else - strSQL = PrepareSQL("SELECT * FROM song WHERE idAlbum=%i AND strFileName='%s' AND strTitle='%s' AND iTrack=%i AND strMusicBrainzTrackID IS NULL", + strSQL = PrepareSQL("SELECT * FROM song WHERE idAlbum=%i AND strFileName='%s' AND strTitle='%s' AND strMusicBrainzTrackID IS NULL", idAlbum, strFileName.c_str(), - strTitle.c_str(), - iTrack); + strTitle.c_str()); - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return -1; if (m_pDS->num_rows() == 0) @@ -661,21 +674,28 @@ else strSQL += PrepareSQL(",%i,%i,%i,NULL,'%c','%s', '%s')", iTimesPlayed, iStartOffset, iEndOffset, rating, strComment.c_str(), strMood.c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); idSong = (int)m_pDS->lastinsertid(); } else { idSong = m_pDS->fv("idSong").get_asInt(); m_pDS->close(); - UpdateSong(idSong, strTitle, strMusicBrainzTrackID, strPathAndFileName, strComment, strMood, strThumb, artistString, genres, iTrack, iDuration, iYear, iTimesPlayed, iStartOffset, iEndOffset, dtLastPlayed, rating); + UpdateSong(idSong, strTitle, strMusicBrainzTrackID, strPathAndFileName, strComment, strMood, strThumb, artistString, genres, iTrack, iDuration, iYear, iTimesPlayed, iStartOffset, iEndOffset, dtLastPlayed, rating, iKaraokeNumber); } if (!strThumb.empty()) SetArtForItem(idSong, MediaTypeSong, "thumb", strThumb); unsigned int index = 0; - for (std::vector::const_iterator i = genres.begin(); i != genres.end(); ++i) + // If this is karaoke song, change the genre to 'Karaoke' (and add it if it's not there) + if ( bHasKaraoke && g_advancedSettings.m_karaokeChangeGenreForKaraokeSongs ) + { + int idGenre = AddGenre("Karaoke"); + AddSongGenre(idGenre, idSong, index); + AddAlbumGenre(idGenre, idAlbum, index++); + } + for (vector::const_iterator i = genres.begin(); i != genres.end(); ++i) { // index will be wrong for albums, but ordering is not all that relevant // for genres anyway @@ -684,7 +704,9 @@ AddAlbumGenre(idGenre, idAlbum, index++); } - UpdateFileDateAdded(idSong, strPathAndFileName); + // Add karaoke information (if any) + if (bHasKaraoke) + AddKaraokeData(idSong, iKaraokeNumber); AnnounceUpdate(MediaTypeSong, idSong); } @@ -708,7 +730,7 @@ " LEFT JOIN songartistview ON songview.idSong = songartistview.idSong " " WHERE songview.idSong = %i", idSong); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { @@ -718,7 +740,7 @@ int songArtistOffset = song_enumCount; - std::set artistcredits; + set artistcredits; song = GetSongFromDataset(m_pDS.get()->get_sql_record()); while (!m_pDS->eof()) { @@ -753,7 +775,7 @@ song.strComment, song.strMood, song.strThumb, - song.GetArtistString(), // NOTE: Don't call this function internally!!! + StringUtils::Join(song.artist, g_advancedSettings.m_musicItemSeparator), // NOTE: Don't call this function internally!!! song.genre, song.iTrack, song.iDuration, @@ -762,7 +784,8 @@ song.iStartOffset, song.iEndOffset, song.lastPlayed, - song.rating); + song.rating, + song.iKaraokeNumber); } int CMusicDatabase::UpdateSong(int idSong, @@ -772,7 +795,7 @@ const std::string& artistString, const std::vector& genres, int iTrack, int iDuration, int iYear, int iTimesPlayed, int iStartOffset, int iEndOffset, - const CDateTime& dtLastPlayed, char rating) + const CDateTime& dtLastPlayed, char rating, int iKaraokeNumber) { if (idSong < 0) return -1; @@ -803,9 +826,6 @@ strSQL += PrepareSQL(" WHERE idSong = %i", idSong); bool status = ExecuteQuery(strSQL); - - UpdateFileDateAdded(idSong, strPathAndFileName); - if (status) AnnounceUpdate(MediaTypeSong, idSong); return idSong; @@ -828,7 +848,7 @@ strSQL = PrepareSQL("SELECT * FROM album WHERE strArtists LIKE '%s' AND strAlbum LIKE '%s' AND strMusicBrainzAlbumID IS NULL", strArtist.c_str(), strAlbum.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() == 0) { @@ -851,7 +871,7 @@ year, bCompilation, CAlbum::ReleaseTypeToString(releaseType).c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return (int)m_pDS->lastinsertid(); } @@ -884,7 +904,7 @@ bCompilation, CAlbum::ReleaseTypeToString(releaseType).c_str(), idAlbum); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); DeleteAlbumArtistsByAlbum(idAlbum); DeleteAlbumGenresByAlbum(idAlbum); return idAlbum; @@ -971,7 +991,7 @@ } CLog::Log(LOGDEBUG, "%s", sql.c_str()); - if (!m_pDS->query(sql)) return false; + if (!m_pDS->query(sql.c_str())) return false; if (m_pDS->num_rows() == 0) { m_pDS->close(); @@ -983,10 +1003,10 @@ int songArtistOffset = songOffset + song_enumCount; int infoSongOffset = songArtistOffset + artistCredit_enumCount; - std::set artistcredits; - std::set songs; - std::set > songartistcredits; - std::set infosongs; + set artistcredits; + set songs; + set > songartistcredits; + set infosongs; album = GetAlbumFromDataset(m_pDS.get()->get_sql_record(), 0, true); // true to grab and parse the imageURL while (!m_pDS->eof()) { @@ -1015,12 +1035,12 @@ int idSongArtistSong = record->at(songArtistOffset + artistCredit_idEntity).get_asInt(); int idSongArtistArtist = record->at(songArtistOffset + artistCredit_idArtist).get_asInt(); - if (songartistcredits.find(std::make_pair(idSongArtistSong, idSongArtistArtist)) == songartistcredits.end()) + if (songartistcredits.find(make_pair(idSongArtistSong, idSongArtistArtist)) == songartistcredits.end()) { for (VECSONGS::iterator si = album.songs.begin(); si != album.songs.end(); ++si) if (si->idSong == idSongArtistSong) si->artistCredits.push_back(GetArtistCreditFromDataset(record, songArtistOffset)); - songartistcredits.insert(std::make_pair(idSongArtistSong, idSongArtistArtist)); + songartistcredits.insert(make_pair(idSongArtistSong, idSongArtistArtist)); } int idAlbumInfoSong = m_pDS.get()->get_sql_record()->at(infoSongOffset + albumInfoSong_idAlbumInfoSong).get_asInt(); @@ -1068,7 +1088,7 @@ if (NULL == m_pDB.get()) return -1; if (NULL == m_pDS.get()) return -1; - std::map::const_iterator it; + map ::const_iterator it; it = m_genreCache.find(strGenre); if (it != m_genreCache.end()) @@ -1076,22 +1096,22 @@ strSQL=PrepareSQL("select * from genre where strGenre like '%s'", strGenre.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() == 0) { m_pDS->close(); // doesnt exists, add it strSQL=PrepareSQL("insert into genre (idGenre, strGenre) values( NULL, '%s' )", strGenre.c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); int idGenre = (int)m_pDS->lastinsertid(); - m_genreCache.insert(std::pair(strGenre1, idGenre)); + m_genreCache.insert(pair(strGenre1, idGenre)); return idGenre; } else { int idGenre = m_pDS->fv("idGenre").get_asInt(); - m_genreCache.insert(std::pair(strGenre1, idGenre)); + m_genreCache.insert(pair(strGenre1, idGenre)); m_pDS->close(); return idGenre; } @@ -1143,18 +1163,11 @@ // 1.a) Match on a MusicBrainz ID strSQL = PrepareSQL("SELECT * FROM artist WHERE strMusicBrainzArtistID = '%s'", strMusicBrainzArtistID.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() > 0) { int idArtist = (int)m_pDS->fv("idArtist").get_asInt(); - bool update = m_pDS->fv("strArtist").get_asString().compare(strMusicBrainzArtistID) == 0; m_pDS->close(); - if (update) - { - strSQL = PrepareSQL( "UPDATE artist SET strArtist = '%s' WHERE idArtist = %i", strArtist.c_str(), idArtist); - m_pDS->exec(strSQL); - m_pDS->close(); - } return idArtist; } m_pDS->close(); @@ -1163,7 +1176,7 @@ // 1.b) No match on MusicBrainz ID. Look for a previously added artist with no MusicBrainz ID // and update that if it exists. strSQL = PrepareSQL("SELECT * FROM artist WHERE strArtist LIKE '%s' AND strMusicBrainzArtistID IS NULL", strArtist.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() > 0) { int idArtist = (int)m_pDS->fv("idArtist").get_asInt(); @@ -1173,7 +1186,7 @@ strArtist.c_str(), strMusicBrainzArtistID.c_str(), idArtist); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return idArtist; } @@ -1186,7 +1199,7 @@ strSQL = PrepareSQL("SELECT * FROM artist WHERE strArtist LIKE '%s'", strArtist.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() > 0) { int idArtist = (int)m_pDS->fv("idArtist").get_asInt(); @@ -1205,7 +1218,7 @@ strArtist.c_str(), strMusicBrainzArtistID.c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); int idArtist = (int)m_pDS->lastinsertid(); return idArtist; } @@ -1274,7 +1287,7 @@ else strSQL = PrepareSQL("SELECT * FROM artistview WHERE artistview.idArtist = %i", idArtist); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) { m_pDS->close(); @@ -1291,7 +1304,7 @@ { const dbiplus::sql_record* const record = m_pDS.get()->get_sql_record(); - artist.discography.push_back(std::make_pair(record->at(discographyOffset + 1).get_asString(), record->at(discographyOffset + 2).get_asString())); + artist.discography.push_back(make_pair(record->at(discographyOffset + 1).get_asString(), record->at(discographyOffset + 2).get_asString())); m_pDS->next(); } } @@ -1402,7 +1415,7 @@ strPrepSQL += " AND boolFeatured = 0"; strSQL=PrepareSQL(strPrepSQL, idArtist); - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) { @@ -1425,14 +1438,18 @@ return false; } -bool CMusicDatabase::GetArtistsByAlbum(int idAlbum, CFileItem* item) +bool CMusicDatabase::GetArtistsByAlbum(int idAlbum, bool includeFeatured, std::vector &artists) { try { std::string strSQL, strPrepSQL; - - strSQL = PrepareSQL("SELECT * FROM albumartistview WHERE idAlbum = %i", idAlbum); - if (!m_pDS->query(strSQL)) + + strPrepSQL = "select idArtist from album_artist where idAlbum=%i"; + if (includeFeatured == false) + strPrepSQL += " AND boolFeatured = 0"; + + strSQL=PrepareSQL(strPrepSQL, idAlbum); + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) { @@ -1440,31 +1457,12 @@ return false; } - // Get album artist credits - VECARTISTCREDITS artistCredits; while (!m_pDS->eof()) { - artistCredits.push_back(GetArtistCreditFromDataset(m_pDS->get_sql_record(), 0)); + artists.push_back(m_pDS->fv("idArtist").get_asInt()); m_pDS->next(); } m_pDS->close(); - - // Populate item with song albumartist credits - std::vector musicBrainzID; - std::vector albumartists; - CVariant artistidObj(CVariant::VariantTypeArray); - for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit) - { - artistidObj.push_back(artistCredit->GetArtistId()); - albumartists.push_back(artistCredit->GetArtist()); - if (!artistCredit->GetMusicBrainzArtistID().empty()) - musicBrainzID.push_back(artistCredit->GetMusicBrainzArtistID()); - } - item->GetMusicInfoTag()->SetAlbumArtist(albumartists); - item->GetMusicInfoTag()->SetMusicBrainzAlbumArtistID(musicBrainzID); - // Add song albumartistIds as separate property as not part of CMusicInfoTag - item->SetProperty("albumartistid", artistidObj); - return true; } catch (...) @@ -1485,7 +1483,7 @@ strPrepSQL += " AND boolFeatured = 0"; strSQL=PrepareSQL(strPrepSQL, idArtist); - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) { @@ -1519,7 +1517,7 @@ strPrepSQL += " AND boolFeatured = 0"; strSQL=PrepareSQL(strPrepSQL, idSong); - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) { @@ -1547,7 +1545,7 @@ try { std::string strSQL = PrepareSQL("select idGenre from album_genre where idAlbum = %i ORDER BY iOrder ASC", idAlbum); - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) { @@ -1576,7 +1574,7 @@ try { std::string strSQL = PrepareSQL("select idGenre from song_genre where idSong = %i ORDER BY iOrder ASC", idSong); - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) { @@ -1612,29 +1610,29 @@ if (NULL == m_pDB.get()) return -1; if (NULL == m_pDS.get()) return -1; - std::map::const_iterator it; + map ::const_iterator it; it = m_pathCache.find(strPath); if (it != m_pathCache.end()) return it->second; strSQL=PrepareSQL( "select * from path where strPath='%s'", strPath.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() == 0) { m_pDS->close(); // doesnt exists, add it strSQL=PrepareSQL("insert into path (idPath, strPath) values( NULL, '%s' )", strPath.c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); int idPath = (int)m_pDS->lastinsertid(); - m_pathCache.insert(std::pair(strPath, idPath)); + m_pathCache.insert(pair(strPath, idPath)); return idPath; } else { int idPath = m_pDS->fv("idPath").get_asInt(); - m_pathCache.insert(std::pair(strPath, idPath)); + m_pathCache.insert(pair(strPath, idPath)); m_pDS->close(); return idPath; } @@ -1656,10 +1654,9 @@ { CSong song; song.idSong = record->at(offset + song_idSong).get_asInt(); - // Note this function does not populate artist credits, this must be done separately. - // However artist names are held as a descriptive string - song.strArtistDesc = record->at(offset + song_strArtists).get_asString(); - // Get the full genre string + // get the full artist string + song.artist = StringUtils::Split(record->at(offset + song_strArtists).get_asString(), g_advancedSettings.m_musicItemSeparator); + // and the full genre string song.genre = StringUtils::Split(record->at(offset + song_strGenres).get_asString(), g_advancedSettings.m_musicItemSeparator); // and the rest... song.strAlbum = record->at(offset + song_strAlbum).get_asString(); @@ -1670,14 +1667,17 @@ song.strTitle = record->at(offset + song_strTitle).get_asString(); song.iTimesPlayed = record->at(offset + song_iTimesPlayed).get_asInt(); song.lastPlayed.SetFromDBDateTime(record->at(offset + song_lastplayed).get_asString()); - song.dateAdded.SetFromDBDateTime(record->at(offset + song_dateAdded).get_asString()); song.iStartOffset = record->at(offset + song_iStartOffset).get_asInt(); song.iEndOffset = record->at(offset + song_iEndOffset).get_asInt(); song.strMusicBrainzTrackID = record->at(offset + song_strMusicBrainzTrackID).get_asString(); - song.rating = record->at(offset + song_userrating).get_asChar(); + song.rating = record->at(offset + song_rating).get_asChar(); song.strComment = record->at(offset + song_comment).get_asString(); song.strMood = record->at(offset + song_mood).get_asString(); + song.iKaraokeNumber = record->at(offset + song_iKarNumber).get_asInt(); + song.strKaraokeLyrEncoding = record->at(offset + song_strKarEncoding).get_asString(); + song.iKaraokeDelay = record->at(offset + song_iKarDelay).get_asInt(); song.bCompilation = record->at(offset + song_bCompilation).get_asInt() == 1; + song.albumArtist = StringUtils::Split(record->at(offset + song_strAlbumArtists).get_asString(), g_advancedSettings.m_musicItemSeparator); // Get filename with full path song.strFileName = URIUtils::AddFileToFolder(record->at(offset + song_strPath).get_asString(), record->at(offset + song_strFileName).get_asString()); @@ -1691,8 +1691,8 @@ void CMusicDatabase::GetFileItemFromDataset(const dbiplus::sql_record* const record, CFileItem* item, const CMusicDbUrl &baseUrl) { - // get the artist string from songview (not the song_artist and artist tables) - item->GetMusicInfoTag()->SetArtistDesc(record->at(song_strArtists).get_asString()); + // get the full artist string + item->GetMusicInfoTag()->SetArtist(StringUtils::Split(record->at(song_strArtists).get_asString(), g_advancedSettings.m_musicItemSeparator)); // and the full genre string item->GetMusicInfoTag()->SetGenre(record->at(song_strGenres).get_asString()); // and the rest... @@ -1710,16 +1710,14 @@ item->SetProperty("item_start", item->m_lStartOffset); item->m_lEndOffset = record->at(song_iEndOffset).get_asInt(); item->GetMusicInfoTag()->SetMusicBrainzTrackID(record->at(song_strMusicBrainzTrackID).get_asString()); - item->GetMusicInfoTag()->SetUserrating(record->at(song_userrating).get_asChar()); + item->GetMusicInfoTag()->SetRating(record->at(song_rating).get_asChar()); item->GetMusicInfoTag()->SetComment(record->at(song_comment).get_asString()); item->GetMusicInfoTag()->SetMood(record->at(song_mood).get_asString()); item->GetMusicInfoTag()->SetPlayCount(record->at(song_iTimesPlayed).get_asInt()); item->GetMusicInfoTag()->SetLastPlayed(record->at(song_lastplayed).get_asString()); - item->GetMusicInfoTag()->SetDateAdded(record->at(song_dateAdded).get_asString()); std::string strRealPath = URIUtils::AddFileToFolder(record->at(song_strPath).get_asString(), record->at(song_strFileName).get_asString()); item->GetMusicInfoTag()->SetURL(strRealPath); item->GetMusicInfoTag()->SetCompilation(record->at(song_bCompilation).get_asInt() == 1); - // get the album artist string from songview (not the album_artist and artist tables) item->GetMusicInfoTag()->SetAlbumArtist(record->at(song_strAlbumArtists).get_asString()); item->GetMusicInfoTag()->SetAlbumReleaseType(CAlbum::ReleaseTypeFromString(record->at(song_strAlbumReleaseType).get_asString())); item->GetMusicInfoTag()->SetLoaded(true); @@ -1737,25 +1735,6 @@ } } -void CMusicDatabase::GetFileItemFromArtistCredits(VECARTISTCREDITS& artistCredits, CFileItem* item) -{ - // Populate fileitem with artists from vector of artist credits - std::vector musicBrainzID; - std::vector songartists; - CVariant artistidObj(CVariant::VariantTypeArray); - for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit) - { - artistidObj.push_back(artistCredit->GetArtistId()); - songartists.push_back(artistCredit->GetArtist()); - if (!artistCredit->GetMusicBrainzArtistID().empty()) - musicBrainzID.push_back(artistCredit->GetMusicBrainzArtistID()); - } - item->GetMusicInfoTag()->SetArtist(songartists); - item->GetMusicInfoTag()->SetMusicBrainzArtistID(musicBrainzID); - // Add album artistIds as separate property as not part of CMusicInfoTag - item->SetProperty("artistid", artistidObj); -} - CAlbum CMusicDatabase::GetAlbumFromDataset(dbiplus::Dataset* pDS, int offset /* = 0 */, bool imageURL /* = false*/) { return GetAlbumFromDataset(pDS->get_sql_record(), offset, imageURL); @@ -1769,7 +1748,7 @@ if (album.strAlbum.empty()) album.strAlbum = g_localizeStrings.Get(1050); album.strMusicBrainzAlbumID = record->at(offset + album_strMusicBrainzAlbumID).get_asString(); - album.strArtistDesc = record->at(offset + album_strArtists).get_asString(); + album.artist = StringUtils::Split(record->at(offset + album_strArtists).get_asString(), g_advancedSettings.m_musicItemSeparator); album.genre = StringUtils::Split(record->at(offset + album_strGenres).get_asString(), g_advancedSettings.m_musicItemSeparator); album.iYear = record->at(offset + album_iYear).get_asInt(); if (imageURL) @@ -1785,8 +1764,6 @@ album.bCompilation = record->at(offset + album_bCompilation).get_asInt() == 1; album.iTimesPlayed = record->at(offset + album_iTimesPlayed).get_asInt(); album.SetReleaseType(record->at(offset + album_strReleaseType).get_asString()); - album.SetDateAdded(record->at(offset + album_dtDateAdded).get_asString()); - album.SetLastPlayed(record->at(offset + album_dtLastPlayed).get_asString()); return album; } @@ -1822,7 +1799,6 @@ artist.strDisbanded = record->at(offset + artist_strDisbanded).get_asString(); artist.yearsActive = StringUtils::Split(record->at(offset + artist_strYearsActive).get_asString(), g_advancedSettings.m_musicItemSeparator); artist.instruments = StringUtils::Split(record->at(offset + artist_strInstruments).get_asString(), g_advancedSettings.m_musicItemSeparator); - artist.SetDateAdded(record->at(offset + artist_dtDateAdded).get_asString()); if (needThumb) { @@ -1880,7 +1856,7 @@ try { std::string strSQL=PrepareSQL("select distinct idAlbum from song join path on song.idPath = path.idPath where path.strPath='%s'", strPath.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->eof()) return -1; @@ -1905,7 +1881,7 @@ "where strArtists like '%s' and strAlbum like '%s' and " "strTitle like '%s'",strArtist.c_str(),strAlbum.c_str(),strTitle.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { @@ -1942,7 +1918,7 @@ "where strArtist like '%s%%' and strArtist <> '%s' " , search.c_str(), strVariousArtists.c_str() ); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) { m_pDS->close(); @@ -1991,7 +1967,7 @@ "limit 100"; CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { @@ -2026,38 +2002,24 @@ if (NULL == m_pDB.get()) return false; if (NULL == m_pDS.get()) return false; - // Get data from album and album_artist tables to fully populate albums - std::string strSQL = "SELECT albumview.*, albumartistview.* FROM albumview " - "LEFT JOIN albumartistview ON albumview.idAlbum = albumartistview.idAlbum " - "WHERE albumartistview.idAlbum in " - "(SELECT albumview.idAlbum FROM albumview " - "WHERE albumview.strAlbum != '' AND albumview.iTimesPlayed>0 " - "ORDER BY albumview.iTimesPlayed DESC LIMIT 100) " - "ORDER BY albumview.iTimesPlayed DESC, albumartistview.iOrder"; + // NOTE: The song.idAlbum is needed for the group by, as for some reason group by albumview.idAlbum doesn't work + // consistently - possibly an SQLite bug, as it works fine in SQLiteSpy (v3.3.17) + std::string strSQL = "select albumview.* from albumview " + "where albumview.iTimesPlayed>0 and albumview.strAlbum != '' " + "order by albumview.iTimesPlayed desc " + "limit 100 "; CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { m_pDS->close(); return true; } - - int albumArtistOffset = album_enumCount; - int albumId = -1; while (!m_pDS->eof()) { - const dbiplus::sql_record* const record = m_pDS->get_sql_record(); - - if (albumId != record->at(album_idAlbum).get_asInt()) - { // New album - albumId = record->at(album_idAlbum).get_asInt(); - albums.push_back(GetAlbumFromDataset(record)); - } - // Get artist details - albums.back().artistCredits.push_back(GetArtistCreditFromDataset(record, albumArtistOffset)); - + albums.push_back(GetAlbumFromDataset(m_pDS.get())); m_pDS->next(); } @@ -2085,7 +2047,7 @@ std::string strSQL = StringUtils::Format("SELECT songview.*, albumview.* FROM songview JOIN albumview ON (songview.idAlbum = albumview.idAlbum) JOIN (SELECT song.idAlbum, SUM(song.iTimesPlayed) AS iTimesPlayedSum FROM song WHERE song.iTimesPlayed > 0 GROUP BY idAlbum ORDER BY iTimesPlayedSum DESC LIMIT 100) AS _albumlimit ON (songview.idAlbum = _albumlimit.idAlbum) ORDER BY _albumlimit.iTimesPlayedSum DESC"); CLog::Log(LOGDEBUG,"GetTop100AlbumSongs() query: %s", strSQL.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) @@ -2123,39 +2085,21 @@ if (NULL == m_pDB.get()) return false; if (NULL == m_pDS.get()) return false; - // Get data from album and album_artist tables to fully populate albums - std::string strSQL = PrepareSQL("SELECT albumview.*, albumartistview.* FROM " - "(SELECT idAlbum FROM albumview WHERE albumview.lastplayed IS NOT NULL " - "ORDER BY albumview.lastplayed DESC LIMIT %u) as playedalbums " - "JOIN albumview ON albumview.idAlbum = playedalbums.idAlbum " - "LEFT JOIN albumartistview ON albumview.idAlbum = albumartistview.idAlbum " - "ORDER BY albumview.lastplayed DESC, albumartistview.iorder ", RECENTLY_PLAYED_LIMIT); - + std::string strSQL = StringUtils::Format("select distinct albumview.* from song join albumview on albumview.idAlbum=song.idAlbum where song.lastplayed IS NOT NULL order by song.lastplayed desc limit %i", RECENTLY_PLAYED_LIMIT); CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { m_pDS->close(); return true; } - - int albumArtistOffset = album_enumCount; - int albumId = -1; while (!m_pDS->eof()) { - const dbiplus::sql_record* const record = m_pDS->get_sql_record(); - - if (albumId != record->at(album_idAlbum).get_asInt()) - { // New album - albumId = record->at(album_idAlbum).get_asInt(); - albums.push_back(GetAlbumFromDataset(record)); - } - // Get artist details - albums.back().artistCredits.push_back(GetArtistCreditFromDataset(record, albumArtistOffset)); - + albums.push_back(GetAlbumFromDataset(m_pDS.get())); m_pDS->next(); } + m_pDS->close(); // cleanup recordset data return true; } @@ -2178,14 +2122,9 @@ if (!strBaseDir.empty() && !baseUrl.FromString(strBaseDir)) return false; - std::string strSQL = PrepareSQL("SELECT songview.*, songartistview.* FROM " - "(SELECT idAlbum FROM albumview WHERE albumview.lastplayed IS NOT NULL " - "ORDER BY albumview.lastplayed DESC LIMIT %u) as playedalbums " - "JOIN songview ON songview.idAlbum = playedalbums.idAlbum " - "LEFT JOIN songartistview ON songview.idSong = songartistview.idSong ", - g_advancedSettings.m_iMusicLibraryRecentlyAddedItems); + std::string strSQL = StringUtils::Format("SELECT songview.*, albumview.* FROM songview JOIN albumview ON (songview.idAlbum = albumview.idAlbum) JOIN (SELECT DISTINCT album.idAlbum FROM album JOIN song ON album.idAlbum = song.idAlbum WHERE song.lastplayed IS NOT NULL ORDER BY song.lastplayed DESC LIMIT %i) AS _albumlimit ON (albumview.idAlbum = _albumlimit.idAlbum)", g_advancedSettings.m_iMusicLibraryRecentlyAddedItems); CLog::Log(LOGDEBUG,"GetRecentlyPlayedAlbumSongs() query: %s", strSQL.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) @@ -2194,38 +2133,15 @@ return true; } - // Needs a separate query to determine number of songs to set items size. - // Get songs from returned rows. Join means there is a row for every song artist - int songArtistOffset = song_enumCount; - int songId = -1; - VECARTISTCREDITS artistCredits; + // get data from returned rows + items.Reserve(iRowsFound); while (!m_pDS->eof()) { - const dbiplus::sql_record* const record = m_pDS->get_sql_record(); - - if (songId != record->at(song_idSong).get_asInt()) - { //New song - if (songId > 0 && !artistCredits.empty()) - { - //Store artist credits for previous song - GetFileItemFromArtistCredits(artistCredits, items[items.Size() - 1].get()); - artistCredits.clear(); - } - songId = record->at(song_idSong).get_asInt(); - CFileItemPtr item(new CFileItem); - GetFileItemFromDataset(record, item.get(), baseUrl); - items.Add(item); - } - // Get song artist credits - artistCredits.push_back(GetArtistCreditFromDataset(record, songArtistOffset)); + CFileItemPtr item(new CFileItem); + GetFileItemFromDataset(item.get(), baseUrl); + items.Add(item); m_pDS->next(); } - if (!artistCredits.empty()) - { - //Store artist credits for final song - GetFileItemFromArtistCredits(artistCredits, items[items.Size() - 1].get()); - artistCredits.clear(); - } // cleanup m_pDS->close(); @@ -2246,18 +2162,10 @@ if (NULL == m_pDB.get()) return false; if (NULL == m_pDS.get()) return false; - // Get data from album and album_artist tables to fully populate albums - // Use idAlbum to determine the recently added albums - // (not "dateAdded" as this is file time stamp and nothing to do with when albums added to library) - std::string strSQL = PrepareSQL("SELECT albumview.*, albumartistview.* FROM " - "(SELECT idAlbum FROM album WHERE strAlbum != '' ORDER BY idAlbum DESC LIMIT %u) AS recentalbums " - "JOIN albumview ON albumview.idAlbum = recentalbums.idAlbum " - "LEFT JOIN albumartistview ON albumview.idAlbum = albumartistview.idAlbum " - "ORDER BY albumview.idAlbum desc, albumartistview.iOrder ", - limit ? limit : g_advancedSettings.m_iMusicLibraryRecentlyAddedItems); + std::string strSQL = StringUtils::Format("select * from albumview where strAlbum != '' order by idAlbum desc limit %u", limit ? limit : g_advancedSettings.m_iMusicLibraryRecentlyAddedItems); CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { @@ -2265,22 +2173,12 @@ return true; } - int albumArtistOffset = album_enumCount; - int albumId = -1; while (!m_pDS->eof()) { - const dbiplus::sql_record* const record = m_pDS->get_sql_record(); - - if (albumId != record->at(album_idAlbum).get_asInt()) - { // New album - albumId = record->at(album_idAlbum).get_asInt(); - albums.push_back(GetAlbumFromDataset(record)); - } - // Get artist details - albums.back().artistCredits.push_back(GetArtistCreditFromDataset(record, albumArtistOffset)); - + albums.push_back(GetAlbumFromDataset(m_pDS.get())); m_pDS->next(); } + m_pDS->close(); // cleanup recordset data return true; } @@ -2303,18 +2201,10 @@ if (!strBaseDir.empty() && !baseUrl.FromString(strBaseDir)) return false; - // Get data from song and song_artist tables to fully populate songs - // Use idAlbum to determine the recently added albums - // (not "dateAdded" as this is file time stamp and nothing to do with when albums added to library) std::string strSQL; - strSQL = PrepareSQL("SELECT songview.*, songartistview.* FROM " - "(SELECT idAlbum FROM album ORDER BY idAlbum DESC LIMIT %u) AS recentalbums " - "JOIN songview ON songview.idAlbum = recentalbums.idAlbum " - "JOIN songartistview ON songview.idSong = songartistview.idSong " - "ORDER BY songview.idAlbum desc, songview.itrack, songartistview.iOrder ", - limit ? limit : g_advancedSettings.m_iMusicLibraryRecentlyAddedItems); + strSQL = PrepareSQL("SELECT songview.* FROM (SELECT idAlbum FROM albumview ORDER BY idAlbum DESC LIMIT %u) AS recentalbums JOIN songview ON songview.idAlbum=recentalbums.idAlbum", limit ? limit : g_advancedSettings.m_iMusicLibraryRecentlyAddedItems); CLog::Log(LOGDEBUG,"GetRecentlyAddedAlbumSongs() query: %s", strSQL.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) @@ -2323,39 +2213,15 @@ return true; } - // Needs a separate query to determine number of songs to set items size. - // Get songs from returned rows. Join means there is a row for every song artist - int songArtistOffset = song_enumCount; - int songId = -1; - VECARTISTCREDITS artistCredits; + // get data from returned rows + items.Reserve(iRowsFound); while (!m_pDS->eof()) { - const dbiplus::sql_record* const record = m_pDS->get_sql_record(); - - if (songId != record->at(song_idSong).get_asInt()) - { //New song - if (songId > 0 && !artistCredits.empty()) - { - //Store artist credits for previous song - GetFileItemFromArtistCredits(artistCredits, items[items.Size() - 1].get()); - artistCredits.clear(); - } - songId = record->at(song_idSong).get_asInt(); - CFileItemPtr item(new CFileItem); - GetFileItemFromDataset(record, item.get(), baseUrl); - items.Add(item); - } - // Get song artist credits - artistCredits.push_back(GetArtistCreditFromDataset(record, songArtistOffset)); - + CFileItemPtr item(new CFileItem); + GetFileItemFromDataset(item.get(), baseUrl); + items.Add(item); m_pDS->next(); } - if (!artistCredits.empty()) - { - //Store artist credits for final song - GetFileItemFromArtistCredits(artistCredits, items[items.Size() - 1].get()); - artistCredits.clear(); - } // cleanup m_pDS->close(); @@ -2378,7 +2244,7 @@ int idSong = GetSongIDFromPath(item.GetPath()); std::string sql=PrepareSQL("UPDATE song SET iTimesPlayed=iTimesPlayed+1, lastplayed=CURRENT_TIMESTAMP where idSong=%i", idSong); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } catch (...) { @@ -2401,7 +2267,7 @@ if (NULL == m_pDS.get()) return false; std::string strSQL=PrepareSQL("select * from songview where strPath='%s'", strPath.c_str() ); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { @@ -2411,7 +2277,7 @@ while (!m_pDS->eof()) { CSong song = GetSongFromDataset(); - songs.insert(std::make_pair(song.strFileName, song)); + songs.insert(make_pair(song.strFileName, song)); m_pDS->next(); } @@ -2472,7 +2338,7 @@ else strSQL=PrepareSQL("select * from songview where strTitle like '%s%%' limit 1000", search.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) return false; std::string songLabel = g_localizeStrings.Get(179); // Song @@ -2508,7 +2374,7 @@ else strSQL=PrepareSQL("select * from albumview where strAlbum like '%s%%'", search.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; std::string albumLabel(g_localizeStrings.Get(558)); // Album while (!m_pDS->eof()) @@ -2541,14 +2407,14 @@ if (NULL == m_pDS.get()) return false; // ok, now find all idSong's std::string strSQL=PrepareSQL("select * from song join path on song.idPath = path.idPath where song.idSong in %s", strSongIds.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { m_pDS->close(); return true; } - std::vector songsToDelete; + vector songsToDelete; while (!m_pDS->eof()) { // get the full song path std::string strFileName = URIUtils::AddFileToFolder(m_pDS->fv("path.strPath").get_asString(), m_pDS->fv("song.strFileName").get_asString()); @@ -2563,7 +2429,7 @@ URIUtils::RemoveSlashAtEnd(strFileName); } - if (!CFile::Exists(strFileName, false)) + if (!CFile::Exists(strFileName)) { // file no longer exists, so add to deletion list songsToDelete.push_back(m_pDS->fv("song.idSong").get_asString()); } @@ -2576,7 +2442,7 @@ std::string strSongsToDelete = "(" + StringUtils::Join(songsToDelete, ",") + ")"; // ok, now delete these songs + all references to them from the linked tables strSQL = "delete from song where idSong in " + strSongsToDelete; - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); m_pDS->close(); } return true; @@ -2597,7 +2463,7 @@ for (int i=0;;i+=iLIMIT) { std::string strSQL=PrepareSQL("select song.idSong from song order by song.idSong limit %i offset %i",iLIMIT,i); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); // keep going until no rows are left! if (iRowsFound == 0) @@ -2633,7 +2499,7 @@ // This must be run AFTER songs have been cleaned up // delete albums with no reference to songs std::string strSQL = "select * from album where album.idAlbum not in (select idAlbum from song)"; - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { @@ -2652,7 +2518,7 @@ std::string strAlbumIds = "(" + StringUtils::Join(albumIds, ",") + ")"; // ok, now we can delete them and the references in the linked tables strSQL = "delete from album where idAlbum in " + strAlbumIds; - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return true; } catch (...) @@ -2676,7 +2542,7 @@ // grab all paths that aren't immediately connected with a song std::string sql = "select * from path where idPath not in (select idPath from song)"; - if (!m_pDS->query(sql)) return false; + if (!m_pDS->query(sql.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { @@ -2690,7 +2556,7 @@ // anything that isn't a parent path of a song path is to be deleted std::string path = m_pDS->fv("strPath").get_asString(); std::string sql = PrepareSQL("select count(idPath) from songpaths where SUBSTR(strPath,1,%i)='%s'", StringUtils::utf8_strlen(path.c_str()), path.c_str()); - if (m_pDS2->query(sql) && m_pDS2->num_rows() == 1 && m_pDS2->fv(0).get_asInt() == 0) + if (m_pDS2->query(sql.c_str()) && m_pDS2->num_rows() == 1 && m_pDS2->fv(0).get_asInt() == 0) pathIds.push_back(m_pDS->fv("idPath").get_asString()); // nothing found, so delete m_pDS2->close(); m_pDS->next(); @@ -2701,7 +2567,7 @@ { // do the deletion, and drop our temp table std::string deleteSQL = "DELETE FROM path WHERE idPath IN (" + StringUtils::Join(pathIds, ",") + ")"; - m_pDS->exec(deleteSQL); + m_pDS->exec(deleteSQL.c_str()); } m_pDS->exec("drop table songpaths"); return true; @@ -2751,7 +2617,7 @@ // Must be executed AFTER the song, song_genre, album and album_genre tables have been cleaned. std::string strSQL = "delete from genre where idGenre not in (select idGenre from song_genre) and"; strSQL += " idGenre not in (select idGenre from album_genre)"; - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return true; } catch (...) @@ -2781,7 +2647,7 @@ CGUIDialogProgress* pDlgProgress = NULL; unsigned int time = XbmcThreads::SystemClockMillis(); CLog::Log(LOGNOTICE, "%s: Starting musicdatabase cleanup ..", __FUNCTION__); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnCleanStarted"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnCleanStarted"); // first cleanup any songs with invalid paths if (bShowProgress) @@ -2789,12 +2655,12 @@ pDlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); if (pDlgProgress) { - pDlgProgress->SetHeading(CVariant{700}); - pDlgProgress->SetLine(0, CVariant{""}); - pDlgProgress->SetLine(1, CVariant{318}); - pDlgProgress->SetLine(2, CVariant{330}); + pDlgProgress->SetHeading(700); + pDlgProgress->SetLine(0, ""); + pDlgProgress->SetLine(1, 318); + pDlgProgress->SetLine(2, 330); pDlgProgress->SetPercentage(0); - pDlgProgress->Open(); + pDlgProgress->StartModal(); pDlgProgress->ShowProgressBar(true); } } @@ -2806,7 +2672,7 @@ // then the albums that are not linked to a song or to album, or whose path is removed if (pDlgProgress) { - pDlgProgress->SetLine(1, CVariant{326}); + pDlgProgress->SetLine(1, 326); pDlgProgress->SetPercentage(20); pDlgProgress->Progress(); } @@ -2818,7 +2684,7 @@ // now the paths if (pDlgProgress) { - pDlgProgress->SetLine(1, CVariant{324}); + pDlgProgress->SetLine(1, 324); pDlgProgress->SetPercentage(40); pDlgProgress->Progress(); } @@ -2830,7 +2696,7 @@ // and finally artists + genres if (pDlgProgress) { - pDlgProgress->SetLine(1, CVariant{320}); + pDlgProgress->SetLine(1, 320); pDlgProgress->SetPercentage(60); pDlgProgress->Progress(); } @@ -2841,7 +2707,7 @@ } if (pDlgProgress) { - pDlgProgress->SetLine(1, CVariant{322}); + pDlgProgress->SetLine(1, 322); pDlgProgress->SetPercentage(80); pDlgProgress->Progress(); } @@ -2853,7 +2719,7 @@ // commit transaction if (pDlgProgress) { - pDlgProgress->SetLine(1, CVariant{328}); + pDlgProgress->SetLine(1, 328); pDlgProgress->SetPercentage(90); pDlgProgress->Progress(); } @@ -2865,14 +2731,14 @@ // and compress the database if (pDlgProgress) { - pDlgProgress->SetLine(1, CVariant{331}); + pDlgProgress->SetLine(1, 331); pDlgProgress->SetPercentage(100); pDlgProgress->Progress(); pDlgProgress->Close(); } time = XbmcThreads::SystemClockMillis() - time; CLog::Log(LOGNOTICE, "%s: Cleaning musicdatabase done. Operation took %s", __FUNCTION__, StringUtils::SecondsToTimeString(time / 1000).c_str()); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnCleanFinished"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnCleanFinished"); if (!Compress(false)) { @@ -2882,14 +2748,14 @@ error: RollbackTransaction(); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnCleanFinished"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnCleanFinished"); return ret; } bool CMusicDatabase::LookupCDDBInfo(bool bRequery/*=false*/) { #ifdef HAS_DVD_DRIVE - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOCDS_USECDDB)) + if (!CSettings::Get().GetBool("audiocds.usecddb")) return false; // check network connectivity @@ -2910,12 +2776,12 @@ if (bRequery) { std::string strFile = StringUtils::Format("%x.cddb", pCdInfo->GetCddbDiscId()); - CFile::Delete(URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetCDDBFolder(), strFile)); + CFile::Delete(URIUtils::AddFileToFolder(CProfilesManager::Get().GetCDDBFolder(), strFile)); } // Prepare cddb Xcddb cddb; - cddb.setCacheDir(CProfilesManager::GetInstance().GetCDDBFolder()); + cddb.setCacheDir(CProfilesManager::Get().GetCDDBFolder()); // Do we have to look for cddb information if (pCdInfo->HasCDDBInfo() && !cddb.isCDCached(pCdInfo)) @@ -2927,12 +2793,12 @@ if (!pDlgSelect) return false; // Show progress dialog if we have to connect to freedb.org - pDialogProgress->SetHeading(CVariant{255}); //CDDB - pDialogProgress->SetLine(0, CVariant{""}); // Querying freedb for CDDB info - pDialogProgress->SetLine(1, CVariant{256}); - pDialogProgress->SetLine(2, CVariant{""}); + pDialogProgress->SetHeading(255); //CDDB + pDialogProgress->SetLine(0, ""); // Querying freedb for CDDB info + pDialogProgress->SetLine(1, 256); + pDialogProgress->SetLine(2, ""); pDialogProgress->ShowProgressBar(false); - pDialogProgress->Open(); + pDialogProgress->StartModal(); // get cddb information if (!cddb.queryCDinfo(pCdInfo)) @@ -2946,7 +2812,7 @@ // ...yes, show the matches found in a select dialog // and let the user choose an entry. pDlgSelect->Reset(); - pDlgSelect->SetHeading(CVariant{255}); + pDlgSelect->SetHeading(255); int i = 1; while (1) { @@ -2960,7 +2826,7 @@ pDlgSelect->Add(strTitle); i++; } - pDlgSelect->Open(); + pDlgSelect->DoModal(); // Has the user selected a match... int iSelectedCD = pDlgSelect->GetSelectedLabel(); @@ -2982,7 +2848,7 @@ pCdInfo->SetNoCDDBInfo(); // ..no, an error occured, display it to the user std::string strErrorText = StringUtils::Format("[%d] %s", cddb.getLastError(), cddb.getLastErrorText()); - CGUIDialogOK::ShowAndGetInput(CVariant{255}, CVariant{257}, CVariant{std::move(strErrorText)}, CVariant{0}); + CGUIDialogOK::ShowAndGetInput(255, 257, strErrorText, 0); } } // if ( !cddb.queryCDinfo( pCdInfo ) ) else @@ -3001,19 +2867,19 @@ { #ifdef HAS_DVD_DRIVE CFileItemList items; - if (!CDirectory::GetDirectory(CProfilesManager::GetInstance().GetCDDBFolder(), items, ".cddb", DIR_FLAG_NO_FILE_DIRS)) + if (!CDirectory::GetDirectory(CProfilesManager::Get().GetCDDBFolder(), items, ".cddb", DIR_FLAG_NO_FILE_DIRS)) { - CGUIDialogOK::ShowAndGetInput(CVariant{313}, CVariant{426}); + CGUIDialogOK::ShowAndGetInput(313, 426); return ; } // Show a selectdialog that the user can select the album to delete CGUIDialogSelect *pDlg = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); if (pDlg) { - pDlg->SetHeading(CVariant{g_localizeStrings.Get(181)}); + pDlg->SetHeading(g_localizeStrings.Get(181).c_str()); pDlg->Reset(); - std::map mapCDDBIds; + map mapCDDBIds; for (int i = 0; i < items.Size(); ++i) { if (items[i]->m_bIsFolder) @@ -3023,7 +2889,7 @@ strFile.erase(strFile.size() - 5, 5); ULONG lDiscId = strtoul(strFile.c_str(), NULL, 16); Xcddb cddb; - cddb.setCacheDir(CProfilesManager::GetInstance().GetCDDBFolder()); + cddb.setCacheDir(CProfilesManager::Get().GetCDDBFolder()); if (!cddb.queryCache(lDiscId)) continue; @@ -3039,11 +2905,11 @@ str = strDiskTitle + " - " + strDiskArtist; pDlg->Add(str); - mapCDDBIds.insert(std::pair(lDiscId, str)); + mapCDDBIds.insert(pair(lDiscId, str)); } pDlg->Sort(); - pDlg->Open(); + pDlg->DoModal(); // and wait till user selects one int iSelectedAlbum = pDlg->GetSelectedLabel(); @@ -3054,13 +2920,13 @@ } std::string strSelectedAlbum = pDlg->GetSelectedLabelText(); - std::map::iterator it; + map::iterator it; for (it = mapCDDBIds.begin();it != mapCDDBIds.end();++it) { if (it->second == strSelectedAlbum) { std::string strFile = StringUtils::Format("%x.cddb", (unsigned int) it->first); - CFile::Delete(URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetCDDBFolder(), strFile)); + CFile::Delete(URIUtils::AddFileToFolder(CProfilesManager::Get().GetCDDBFolder(), strFile)); break; } } @@ -3075,11 +2941,11 @@ // other writing access to the database is prohibited. if (g_application.IsMusicScanning()) { - CGUIDialogOK::ShowAndGetInput(CVariant{189}, CVariant{14057}); + CGUIDialogOK::ShowAndGetInput(189, 14057); return; } - - if (HELPERS::ShowYesNoDialogText(CVariant{313}, CVariant{333}) == DialogResponse::YES) + + if (CGUIDialogYesNo::ShowAndGetInput(313, 333)) { CMusicDatabase musicdatabase; if (musicdatabase.Open()) @@ -3089,7 +2955,7 @@ if (iReturnString != ERROR_OK) { - CGUIDialogOK::ShowAndGetInput(CVariant{313}, CVariant{iReturnString}); + CGUIDialogOK::ShowAndGetInput(313, iReturnString); } } } @@ -3115,12 +2981,12 @@ // to songview or albumview for these conditions if (extFilter.where.size() > 0) { - if (extFilter.where.find("artistview") != std::string::npos) + if (extFilter.where.find("artistview") != string::npos) extFilter.AppendJoin("JOIN song_genre ON song_genre.idGenre = genre.idGenre JOIN songview ON songview.idSong = song_genre.idSong " "JOIN song_artist ON song_artist.idSong = songview.idSong JOIN artistview ON artistview.idArtist = song_artist.idArtist"); - else if (extFilter.where.find("songview") != std::string::npos) + else if (extFilter.where.find("songview") != string::npos) extFilter.AppendJoin("JOIN song_genre ON song_genre.idGenre = genre.idGenre JOIN songview ON songview.idSong = song_genre.idSong"); - else if (extFilter.where.find("albumview") != std::string::npos) + else if (extFilter.where.find("albumview") != string::npos) extFilter.AppendJoin("JOIN album_genre ON album_genre.idGenre = genre.idGenre JOIN albumview ON albumview.idAlbum = album_genre.idAlbum"); extFilter.AppendGroup("genre.idGenre"); @@ -3214,7 +3080,7 @@ // run query CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) @@ -3297,7 +3163,7 @@ // run query CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); @@ -3320,7 +3186,7 @@ // get data from returned rows while (!m_pDS->eof()) { - std::string labelValue = m_pDS->fv(labelField.c_str()).get_asString(); + string labelValue = m_pDS->fv(labelField.c_str()).get_asString(); CFileItemPtr pItem(new CFileItem(labelValue)); CMusicDbUrl itemUrl = musicUrl; @@ -3377,10 +3243,7 @@ else if (idSong > 0) musicUrl.AddOption("songid", idSong); - // Override albumArtistsOnly parameter (usually externally set to SETTING_MUSICLIBRARY_SHOWCOMPILATIONARTISTS) - // when local option already present in muscic URL thus allowing it to be an option in custom nodes - if (!musicUrl.HasOption("albumartistsonly")) - musicUrl.AddOption("albumartistsonly", albumArtistsOnly); + musicUrl.AddOption("albumartistsonly", albumArtistsOnly); bool result = GetArtistsByWhere(musicUrl.ToString(), filter, items, sortDescription, countOnly); CLog::Log(LOGDEBUG,"Time to retrieve artists from dataset = %i", XbmcThreads::SystemClockMillis() - time); @@ -3417,12 +3280,12 @@ if (extFilter.where.size() > 0) { bool extended = false; - if (extFilter.where.find("songview") != std::string::npos) + if (extFilter.where.find("songview") != string::npos) { extended = true; extFilter.AppendJoin("JOIN song_artist ON song_artist.idArtist = artistview.idArtist JOIN songview ON songview.idSong = song_artist.idSong"); } - else if (extFilter.where.find("albumview") != std::string::npos) + else if (extFilter.where.find("albumview") != string::npos) { extended = true; extFilter.AppendJoin("JOIN album_artist ON album_artist.idArtist = artistview.idArtist JOIN albumview ON albumview.idAlbum = album_artist.idAlbum"); @@ -3456,7 +3319,7 @@ // run query CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { @@ -3536,7 +3399,7 @@ if (NULL == m_pDS.get()) return false; std::string strSQL = PrepareSQL("select albumview.* from song join albumview on song.idAlbum = albumview.idAlbum where song.idSong='%i'", idSong); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound != 1) { @@ -3592,7 +3455,7 @@ // if there are extra WHERE conditions we might need access // to songview for these conditions - if (extFilter.where.find("songview") != std::string::npos) + if (extFilter.where.find("songview") != string::npos) { extFilter.AppendJoin("JOIN songview ON songview.idAlbum = albumview.idAlbum"); extFilter.AppendGroup("albumview.idAlbum"); @@ -3616,7 +3479,7 @@ CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); // run query unsigned int time = XbmcThreads::SystemClockMillis(); - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; CLog::Log(LOGDEBUG, "%s - query took %i ms", __FUNCTION__, XbmcThreads::SystemClockMillis() - time); time = XbmcThreads::SystemClockMillis(); @@ -3685,17 +3548,17 @@ return false; } -bool CMusicDatabase::GetAlbumsByWhere(const std::string &baseDir, const Filter &filter, VECALBUMS& albums, int& total, const SortDescription &sortDescription /* = SortDescription() */, bool countOnly /* = false */) +bool CMusicDatabase::GetSongsByWhere(const std::string &baseDir, const Filter &filter, CFileItemList &items, const SortDescription &sortDescription /* = SortDescription() */) { - albums.erase(albums.begin(), albums.end()); - if (NULL == m_pDB.get()) return false; - if (NULL == m_pDS.get()) return false; + if (m_pDB.get() == NULL || m_pDS.get() == NULL) + return false; try { - total = -1; - // Get data from album and album_artist tables to fully populate albums - std::string strSQL = "SELECT %s FROM albumview LEFT JOIN albumartistview on albumartistview.idalbum = albumview.idalbum "; + unsigned int time = XbmcThreads::SystemClockMillis(); + int total = -1; + + std::string strSQL = "SELECT %s FROM songview "; Filter extFilter = filter; CMusicDbUrl musicUrl; @@ -3705,377 +3568,354 @@ // if there are extra WHERE conditions we might need access // to songview for these conditions - if (extFilter.where.find("songview") != std::string::npos) + if (extFilter.where.find("albumview") != string::npos) { - extFilter.AppendJoin("JOIN songview ON songview.idAlbum = albumview.idAlbum"); - extFilter.AppendGroup("albumview.idAlbum"); + extFilter.AppendJoin("JOIN albumview ON albumview.idAlbum = songview.idAlbum"); + extFilter.AppendGroup("songview.idSong"); } std::string strSQLExtra; if (!BuildSQL(strSQLExtra, extFilter, strSQLExtra)) return false; - // Count and return number of albums that satisfy selection criteria - total = (int)strtol(GetSingleValue("SELECT COUNT(1) FROM albumview " + strSQLExtra, m_pDS).c_str(), NULL, 10); - if (countOnly) - return true; - // Apply the limiting directly here if there's no special sorting but limiting if (extFilter.limit.empty() && - sortDescription.sortBy == SortByNone && - (sortDescription.limitStart > 0 || sortDescription.limitEnd > 0)) + sortDescription.sortBy == SortByNone && + (sortDescription.limitStart > 0 || sortDescription.limitEnd > 0)) { + total = (int)strtol(GetSingleValue(PrepareSQL(strSQL, "COUNT(1)") + strSQLExtra, m_pDS).c_str(), NULL, 10); strSQLExtra += DatabaseUtils::BuildLimitClause(sortDescription.limitEnd, sortDescription.limitStart); - albums.reserve(sortDescription.limitEnd - sortDescription.limitStart); } - else - albums.reserve(total); - strSQL = PrepareSQL(strSQL, !filter.fields.empty() && filter.fields.compare("*") != 0 ? filter.fields.c_str() : "albumview.*, albumartistview.* ") + strSQLExtra; + strSQL = PrepareSQL(strSQL, !filter.fields.empty() && filter.fields.compare("*") != 0 ? filter.fields.c_str() : "songview.*") + strSQLExtra; - CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); + CLog::Log(LOGDEBUG, "%s query = %s", __FUNCTION__, strSQL.c_str()); // run query - unsigned int time = XbmcThreads::SystemClockMillis(); - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; - CLog::Log(LOGDEBUG, "%s - query took %i ms", - __FUNCTION__, XbmcThreads::SystemClockMillis() - time); time = XbmcThreads::SystemClockMillis(); int iRowsFound = m_pDS->num_rows(); - if (iRowsFound <= 0) + if (iRowsFound == 0) { m_pDS->close(); return true; } - //Sort the results set - need to add sort by iOrder to maintain artist name order?? + // store the total value of items as a property + if (total < iRowsFound) + total = iRowsFound; + items.SetProperty("total", total); + DatabaseResults results; results.reserve(iRowsFound); - if (!SortUtils::SortFromDataset(sortDescription, MediaTypeAlbum, m_pDS, results)) + if (!SortUtils::SortFromDataset(sortDescription, MediaTypeSong, m_pDS, results)) return false; - // Get albums from returned rows. Join means there is a row for every album artist - int albumArtistOffset = album_enumCount; - int albumId = -1; - + // get data from returned rows + items.Reserve(results.size()); const dbiplus::query_data &data = m_pDS->get_result_set().records; + int count = 0; for (DatabaseResults::const_iterator it = results.begin(); it != results.end(); ++it) { unsigned int targetRow = (unsigned int)it->at(FieldRow).asInteger(); const dbiplus::sql_record* const record = data.at(targetRow); - - if (albumId != record->at(album_idAlbum).get_asInt()) - { // New album - albumId = record->at(album_idAlbum).get_asInt(); - albums.push_back(GetAlbumFromDataset(record)); + + try + { + CFileItemPtr item(new CFileItem); + GetFileItemFromDataset(record, item.get(), musicUrl); + // HACK for sorting by database returned order + item->m_iprogramCount = ++count; + items.Add(item); + } + catch (...) + { + m_pDS->close(); + CLog::Log(LOGERROR, "%s: out of memory loading query: %s", __FUNCTION__, filter.where.c_str()); + return (items.Size() > 0); } - // Get album artist credits - albums.back().artistCredits.push_back(GetArtistCreditFromDataset(record, albumArtistOffset)); } - m_pDS->close(); // cleanup recordset data + // cleanup + m_pDS->close(); + + // Load some info from embedded cuesheet if present (now only ReplayGain) + CueInfoLoader cueLoader; + for (int i = 0; i < items.Size(); ++i) + cueLoader.Load(LoadCuesheet(items[i]->GetMusicInfoTag()->GetURL()), items[i]); + + CLog::Log(LOGDEBUG, "%s(%s) - took %d ms", __FUNCTION__, filter.where.c_str(), XbmcThreads::SystemClockMillis() - time); return true; } catch (...) { + // cleanup m_pDS->close(); - CLog::Log(LOGERROR, "%s (%s) failed", __FUNCTION__, filter.where.c_str()); + CLog::Log(LOGERROR, "%s(%s) failed", __FUNCTION__, filter.where.c_str()); } return false; } -bool CMusicDatabase::GetSongsFullByWhere(const std::string &baseDir, const Filter &filter, CFileItemList &items, const SortDescription &sortDescription /* = SortDescription() */, bool artistData /* = false*/) +bool CMusicDatabase::GetSongsByYear(const std::string& baseDir, CFileItemList& items, int year) { - if (m_pDB.get() == NULL || m_pDS.get() == NULL) + CMusicDbUrl musicUrl; + if (!musicUrl.FromString(baseDir)) return false; - try - { - unsigned int time = XbmcThreads::SystemClockMillis(); - int total = -1; + musicUrl.AddOption("year", year); + + Filter filter; + return GetSongsByWhere(baseDir, filter, items); +} - Filter extFilter = filter; - CMusicDbUrl musicUrl; - SortDescription sorting = sortDescription; - if (!musicUrl.FromString(baseDir) || !GetFilter(musicUrl, extFilter, sorting)) - return false; +bool CMusicDatabase::GetSongsNav(const std::string& strBaseDir, CFileItemList& items, int idGenre, int idArtist, int idAlbum, const SortDescription &sortDescription /* = SortDescription() */) +{ + CMusicDbUrl musicUrl; + if (!musicUrl.FromString(strBaseDir)) + return false; - // if there are extra WHERE conditions we might need access - // to songview for these conditions - if (extFilter.where.find("albumview") != std::string::npos) - { - extFilter.AppendJoin("JOIN albumview ON albumview.idAlbum = songview.idAlbum"); - extFilter.AppendGroup("songview.idSong"); - } + if (idAlbum > 0) + musicUrl.AddOption("albumid", idAlbum); - std::string strSQLExtra; - if (!BuildSQL(strSQLExtra, extFilter, strSQLExtra)) - return false; - - // Count number of songs that satisfy selection criteria - total = (int)strtol(GetSingleValue("SELECT COUNT(1) FROM songview " + strSQLExtra, m_pDS).c_str(), NULL, 10); + if (idGenre > 0) + musicUrl.AddOption("genreid", idGenre); - // Apply the limiting directly here if there's no special sorting but limiting - bool limited = extFilter.limit.empty() && sortDescription.sortBy == SortByNone && - (sortDescription.limitStart > 0 || sortDescription.limitEnd > 0); - if (limited) - strSQLExtra += DatabaseUtils::BuildLimitClause(sortDescription.limitEnd, sortDescription.limitStart); + if (idArtist > 0) + musicUrl.AddOption("artistid", idArtist); + + Filter filter; + return GetSongsByWhere(musicUrl.ToString(), filter, items, sortDescription); +} + +void CMusicDatabase::UpdateTables(int version) +{ + if (version < 19) + { + int len = g_advancedSettings.m_musicItemSeparator.size() + 1; + std::string sql = PrepareSQL("UPDATE song SET strExtraArtists=SUBSTR(strExtraArtists,%i), strExtraGenres=SUBSTR(strExtraGenres,%i)", len, len); + m_pDS->exec(sql.c_str()); + sql = PrepareSQL("UPDATE album SET strExtraArtists=SUBSTR(strExtraArtists,%i), strExtraGenres=SUBSTR(strExtraGenres,%i)", len, len); + m_pDS->exec(sql.c_str()); + } + + if (version < 21) + { + m_pDS->exec("CREATE TABLE album_artist ( idArtist integer, idAlbum integer, boolFeatured integer, iOrder integer )\n"); + m_pDS->exec("INSERT INTO album_artist (idArtist, idAlbum, boolFeatured, iOrder) SELECT idArtist, idAlbum, 1, iPosition FROM exartistalbum"); + m_pDS->exec("REPLACE INTO album_artist (idArtist, idAlbum, boolFeatured, iOrder) SELECT idArtist, idAlbum, 0, 0 FROM album"); std::string strSQL; - if (artistData) - { // Get data from song and song_artist tables to fully populate songs with artists - // Some songs may not have artists so Left join. - // Bug in SQLite optimiser for left join on views means have to use tables not songartistview - if (limited) - //Apply where clause and limits to songview, then join as mutiple records in result set per song - strSQL = "SELECT sv.*, " - "song_artist.idArtist AS idArtist, " - "artist.strArtist AS strArtist, " - "artist.strMusicBrainzArtistID AS strMusicBrainzArtistID " - "FROM (SELECT songview.* FROM songview " + strSQLExtra + ") AS sv " - "LEFT JOIN song_artist on song_artist.idsong = sv.idsong " - "LEFT JOIN artist ON song_artist.idArtist = artist.idArtist "; - else - strSQL = "SELECT songview.*, " - "song_artist.idArtist AS idArtist, " - "artist.strArtist AS strArtist, " - "artist.strMusicBrainzArtistID AS strMusicBrainzArtistID " - "FROM songview LEFT JOIN song_artist on song_artist.idsong = songview.idsong " - "LEFT JOIN artist ON song_artist.idArtist = artist.idArtist " + strSQLExtra; + strSQL=PrepareSQL("SELECT album.idAlbum AS idAlbum, strExtraArtists," + " album.idArtist AS idArtist, strArtist FROM album " + " LEFT OUTER JOIN artist ON album.idArtist=artist.idArtist"); + m_pDS->query(strSQL.c_str()); + + VECALBUMS albums; + while (!m_pDS->eof()) + { + CAlbum album; + album.idAlbum = m_pDS->fv("idAlbum").get_asInt(); + album.artist.push_back(m_pDS->fv("strArtist").get_asString()); + if (!m_pDS->fv("strExtraArtists").get_asString().empty()) + { + std::vector extraArtists = StringUtils::Split(m_pDS->fv("strExtraArtists").get_asString(), g_advancedSettings.m_musicItemSeparator); + album.artist.insert(album.artist.end(), extraArtists.begin(), extraArtists.end()); + } + albums.push_back(album); + m_pDS->next(); } - else - strSQL = "SELECT songview.* FROM songview " + strSQLExtra; - - CLog::Log(LOGDEBUG, "%s query = %s", __FUNCTION__, strSQL.c_str()); - // run query - if (!m_pDS->query(strSQL)) - return false; + m_pDS->close(); + m_pDS->exec("CREATE TABLE album_new ( idAlbum integer primary key, strAlbum varchar(256), strArtists text, idGenre integer, strExtraGenres text, iYear integer, idThumb integer)"); + m_pDS->exec("INSERT INTO album_new ( idAlbum, strAlbum, idGenre, strExtraGenres, iYear, idThumb ) SELECT idAlbum, strAlbum, idGenre, strExtraGenres, iYear, idThumb FROM album"); - int iRowsFound = m_pDS->num_rows(); - if (iRowsFound == 0) + for (VECALBUMS::iterator it = albums.begin(); it != albums.end(); ++it) { - m_pDS->close(); - return true; + std::string strSQL; + strSQL = PrepareSQL("UPDATE album_new SET strArtists='%s' WHERE idAlbum=%i", StringUtils::Join(it->artist, g_advancedSettings.m_musicItemSeparator).c_str(), it->idAlbum); + m_pDS->exec(strSQL); } - // Store the total number of songs as a property - items.SetProperty("total", total); + m_pDS->exec("DROP TABLE album"); + m_pDS->exec("ALTER TABLE album_new RENAME TO album"); + m_pDS->exec("DROP TABLE IF EXISTS exartistalbum"); + } - DatabaseResults results; - results.reserve(iRowsFound); - if (!SortUtils::SortFromDataset(sortDescription, MediaTypeSong, m_pDS, results)) - return false; + if (version < 22) + { + m_pDS->exec("CREATE TABLE song_artist ( idArtist integer, idSong integer, boolFeatured integer, iOrder integer )\n"); + m_pDS->exec("INSERT INTO song_artist (idArtist, idSong, boolFeatured, iOrder) SELECT idArtist, idSong, 1, iPosition FROM exartistsong"); + m_pDS->exec("REPLACE INTO song_artist (idArtist, idSong, boolFeatured, iOrder) SELECT idArtist, idSong, 0, 0 FROM song"); - // Get songs from returned rows. If join songartistview then there is a row for every album artist - items.Reserve(total); - int songArtistOffset = song_enumCount; - int songId = -1; - VECARTISTCREDITS artistCredits; - const dbiplus::query_data &data = m_pDS->get_result_set().records; - int count = 0; - for (DatabaseResults::const_iterator it = results.begin(); it != results.end(); ++it) + std::string strSQL; + strSQL=PrepareSQL("SELECT song.idSong AS idSong, strExtraArtists," + " song.idArtist AS idArtist, strArtist FROM song " + " LEFT OUTER JOIN artist ON song.idArtist=artist.idArtist"); + m_pDS->query(strSQL.c_str()); + + VECSONGS songs; + while (!m_pDS->eof()) { - unsigned int targetRow = (unsigned int)it->at(FieldRow).asInteger(); - const dbiplus::sql_record* const record = data.at(targetRow); - - try - { - if (songId != record->at(song_idSong).get_asInt()) - { //New song - if (songId > 0 && !artistCredits.empty()) - { - //Store artist credits for previous song - GetFileItemFromArtistCredits(artistCredits, items[items.Size()-1].get()); - artistCredits.clear(); - } - songId = record->at(song_idSong).get_asInt(); - CFileItemPtr item(new CFileItem); - GetFileItemFromDataset(record, item.get(), musicUrl); - // HACK for sorting by database returned order - item->m_iprogramCount = ++count; - items.Add(item); - } - // Get song artist credits, API only exposes id, name and mbid fields - if (artistData) - { - CArtistCredit artistCredit; - artistCredit.idArtist = record->at(songArtistOffset).get_asInt(); - artistCredit.m_strArtist = record->at(songArtistOffset + 1).get_asString(); - artistCredit.m_strMusicBrainzArtistID = record->at(songArtistOffset + 2).get_asString(); - artistCredits.push_back(artistCredit); - } - } - catch (...) + CSong song; + song.idSong = m_pDS->fv("idSong").get_asInt(); + song.artist.push_back(m_pDS->fv("strArtist").get_asString()); + if (!m_pDS->fv("strExtraArtists").get_asString().empty()) { - m_pDS->close(); - CLog::Log(LOGERROR, "%s: out of memory loading query: %s", __FUNCTION__, filter.where.c_str()); - return (items.Size() > 0); + std::vector extraArtists = StringUtils::Split(m_pDS->fv("strExtraArtists").get_asString(), g_advancedSettings.m_musicItemSeparator); + song.artist.insert(song.artist.end(), extraArtists.begin(), extraArtists.end()); } - + songs.push_back(song); + m_pDS->next(); } - if (!artistCredits.empty()) + m_pDS->close(); + m_pDS->exec("CREATE TABLE song_new ( idSong integer primary key, idAlbum integer, idPath integer, strArtists text, idGenre integer, strExtraGenres text, strTitle varchar(512), iTrack integer, iDuration integer, iYear integer, dwFileNameCRC text, strFileName text, strMusicBrainzTrackID text, strMusicBrainzArtistID text, strMusicBrainzAlbumID text, strMusicBrainzAlbumArtistID text, strMusicBrainzTRMID text, iTimesPlayed integer, iStartOffset integer, iEndOffset integer, idThumb integer, lastplayed varchar(20) default NULL, rating char default '0', comment text)"); + m_pDS->exec("INSERT INTO song_new ( idSong, idAlbum, idPath, idGenre, strExtraGenres, strTitle, iTrack, iDuration, iYear, dwFileNameCRC, strFileName, strMusicBrainzTrackID, strMusicBrainzArtistID, strMusicBrainzAlbumID, strMusicBrainzAlbumArtistID, strMusicBrainzTRMID, iTimesPlayed, iStartOffset, iEndOffset, idThumb, lastplayed, rating, comment ) SELECT idSong, idAlbum, idPath, idGenre, strExtraGenres, strTitle, iTrack, iDuration, iYear, dwFileNameCRC, strFileName, strMusicBrainzTrackID, strMusicBrainzArtistID, strMusicBrainzAlbumID, strMusicBrainzAlbumArtistID, strMusicBrainzTRMID, iTimesPlayed, iStartOffset, iEndOffset, idThumb, lastplayed, rating, comment FROM song"); + + for (VECSONGS::iterator it = songs.begin(); it != songs.end(); ++it) { - //Store artist credits for final song - GetFileItemFromArtistCredits(artistCredits, items[items.Size() - 1].get()); - artistCredits.clear(); + std::string strSQL; + strSQL = PrepareSQL("UPDATE song_new SET strArtists='%s' WHERE idSong=%i", StringUtils::Join(it->artist, g_advancedSettings.m_musicItemSeparator).c_str(), it->idSong); + m_pDS->exec(strSQL); } - // cleanup - m_pDS->close(); - CLog::Log(LOGDEBUG, "%s(%s) - took %d ms", __FUNCTION__, filter.where.c_str(), XbmcThreads::SystemClockMillis() - time); - return true; - } - catch (...) - { - // cleanup - m_pDS->close(); - CLog::Log(LOGERROR, "%s(%s) failed", __FUNCTION__, filter.where.c_str()); + m_pDS->exec("DROP TABLE song"); + m_pDS->exec("ALTER TABLE song_new RENAME TO song"); + m_pDS->exec("DROP TABLE IF EXISTS exartistsong"); } - return false; -} -bool CMusicDatabase::GetSongsByWhere(const std::string &baseDir, const Filter &filter, CFileItemList &items, const SortDescription &sortDescription /* = SortDescription() */) -{ - if (m_pDB.get() == NULL || m_pDS.get() == NULL) - return false; - - try + if (version < 23) { - unsigned int time = XbmcThreads::SystemClockMillis(); - int total = -1; + m_pDS->exec("CREATE TABLE album_genre ( idGenre integer, idAlbum integer, iOrder integer )\n"); + m_pDS->exec("INSERT INTO album_genre ( idGenre, idAlbum, iOrder) SELECT idGenre, idAlbum, iPosition FROM exgenrealbum"); + m_pDS->exec("REPLACE INTO album_genre ( idGenre, idAlbum, iOrder) SELECT idGenre, idAlbum, 0 FROM album"); - std::string strSQL = "SELECT %s FROM songview "; - - Filter extFilter = filter; - CMusicDbUrl musicUrl; - SortDescription sorting = sortDescription; - if (!musicUrl.FromString(baseDir) || !GetFilter(musicUrl, extFilter, sorting)) - return false; + std::string strSQL; + strSQL=PrepareSQL("SELECT album.idAlbum AS idAlbum, strExtraGenres," + " album.idGenre AS idGenre, strGenre FROM album " + " JOIN genre ON album.idGenre=genre.idGenre"); + m_pDS->query(strSQL.c_str()); - // if there are extra WHERE conditions we might need access - // to songview for these conditions - if (extFilter.where.find("albumview") != std::string::npos) + VECALBUMS albums; + while (!m_pDS->eof()) { - extFilter.AppendJoin("JOIN albumview ON albumview.idAlbum = songview.idAlbum"); - extFilter.AppendGroup("songview.idSong"); + CAlbum album; + album.idAlbum = m_pDS->fv("idAlbum").get_asInt(); + album.genre.push_back(m_pDS->fv("strGenre").get_asString()); + if (!m_pDS->fv("strExtraGenres").get_asString().empty()) + { + std::vector extraGenres = StringUtils::Split(m_pDS->fv("strExtraGenres").get_asString(), g_advancedSettings.m_musicItemSeparator); + album.genre.insert(album.genre.end(), extraGenres.begin(), extraGenres.end()); + } + albums.push_back(album); + m_pDS->next(); } + m_pDS->close(); + m_pDS->exec("CREATE TABLE album_new ( idAlbum integer primary key, strAlbum varchar(256), strArtists text, strGenres text, iYear integer, idThumb integer)"); + m_pDS->exec("INSERT INTO album_new ( idAlbum, strAlbum, strArtists, iYear, idThumb) SELECT idAlbum, strAlbum, strArtists, iYear, idThumb FROM album"); - std::string strSQLExtra; - if (!BuildSQL(strSQLExtra, extFilter, strSQLExtra)) - return false; - - // Apply the limiting directly here if there's no special sorting but limiting - if (extFilter.limit.empty() && - sortDescription.sortBy == SortByNone && - (sortDescription.limitStart > 0 || sortDescription.limitEnd > 0)) + for (VECALBUMS::iterator it = albums.begin(); it != albums.end(); ++it) { - total = (int)strtol(GetSingleValue(PrepareSQL(strSQL, "COUNT(1)") + strSQLExtra, m_pDS).c_str(), NULL, 10); - strSQLExtra += DatabaseUtils::BuildLimitClause(sortDescription.limitEnd, sortDescription.limitStart); + std::string strSQL; + strSQL = PrepareSQL("UPDATE album_new SET strGenres='%s' WHERE idAlbum=%i", StringUtils::Join(it->genre, g_advancedSettings.m_musicItemSeparator).c_str(), it->idAlbum); + m_pDS->exec(strSQL); } - strSQL = PrepareSQL(strSQL, !filter.fields.empty() && filter.fields.compare("*") != 0 ? filter.fields.c_str() : "songview.*") + strSQLExtra; - - CLog::Log(LOGDEBUG, "%s query = %s", __FUNCTION__, strSQL.c_str()); - // run query - if (!m_pDS->query(strSQL)) - return false; + m_pDS->exec("DROP TABLE album"); + m_pDS->exec("ALTER TABLE album_new RENAME TO album"); + m_pDS->exec("DROP TABLE IF EXISTS exgenrealbum"); + } - int iRowsFound = m_pDS->num_rows(); - if (iRowsFound == 0) - { - m_pDS->close(); - return true; - } + if (version < 24) + { + m_pDS->exec("CREATE TABLE song_genre ( idGenre integer, idSong integer, iOrder integer )\n"); + m_pDS->exec("INSERT INTO song_genre ( idGenre, idSong, iOrder) SELECT idGenre, idSong, iPosition FROM exgenresong"); + m_pDS->exec("REPLACE INTO song_genre ( idGenre, idSong, iOrder) SELECT idGenre, idSong, 0 FROM song"); - // store the total value of items as a property - if (total < iRowsFound) - total = iRowsFound; - items.SetProperty("total", total); - - DatabaseResults results; - results.reserve(iRowsFound); - if (!SortUtils::SortFromDataset(sortDescription, MediaTypeSong, m_pDS, results)) - return false; + std::string strSQL; + strSQL=PrepareSQL("SELECT song.idSong AS idSong, strExtraGenres," + " song.idGenre AS idGenre, strGenre FROM song " + " JOIN genre ON song.idGenre=genre.idGenre"); + m_pDS->query(strSQL.c_str()); - // get data from returned rows - items.Reserve(results.size()); - const dbiplus::query_data &data = m_pDS->get_result_set().records; - int count = 0; - for (DatabaseResults::const_iterator it = results.begin(); it != results.end(); ++it) + VECSONGS songs; + while (!m_pDS->eof()) { - unsigned int targetRow = (unsigned int)it->at(FieldRow).asInteger(); - const dbiplus::sql_record* const record = data.at(targetRow); - - try + CSong song; + song.idSong = m_pDS->fv("idSong").get_asInt(); + song.genre.push_back(m_pDS->fv("strGenre").get_asString()); + if (!m_pDS->fv("strExtraGenres").get_asString().empty()) { - CFileItemPtr item(new CFileItem); - GetFileItemFromDataset(record, item.get(), musicUrl); - // HACK for sorting by database returned order - item->m_iprogramCount = ++count; - items.Add(item); - } - catch (...) - { - m_pDS->close(); - CLog::Log(LOGERROR, "%s: out of memory loading query: %s", __FUNCTION__, filter.where.c_str()); - return (items.Size() > 0); + std::vector extraGenres = StringUtils::Split(m_pDS->fv("strExtraGenres").get_asString(), g_advancedSettings.m_musicItemSeparator); + song.genre.insert(song.genre.end(), extraGenres.begin(), extraGenres.end()); } + songs.push_back(song); + m_pDS->next(); } - - // cleanup m_pDS->close(); + m_pDS->exec("CREATE TABLE song_new ( idSong integer primary key, idAlbum integer, idPath integer, strArtists text, strGenres text, strTitle varchar(512), iTrack integer, iDuration integer, iYear integer, dwFileNameCRC text, strFileName text, strMusicBrainzTrackID text, strMusicBrainzArtistID text, strMusicBrainzAlbumID text, strMusicBrainzAlbumArtistID text, strMusicBrainzTRMID text, iTimesPlayed integer, iStartOffset integer, iEndOffset integer, idThumb integer, lastplayed varchar(20) default NULL, rating char default '0', comment text)\n"); + m_pDS->exec("INSERT INTO song_new ( idSong, idAlbum, idPath, strArtists, strTitle, iTrack, iDuration, iYear, dwFileNameCRC, strFileName, strMusicBrainzTrackID, strMusicBrainzArtistID, strMusicBrainzAlbumID, strMusicBrainzAlbumArtistID, strMusicBrainzTRMID, iTimesPlayed, iStartOffset, iEndOffset, idThumb, lastplayed, rating, comment) SELECT idSong, idAlbum, idPath, strArtists, strTitle, iTrack, iDuration, iYear, dwFileNameCRC, strFileName, strMusicBrainzTrackID, strMusicBrainzArtistID, strMusicBrainzAlbumID, strMusicBrainzAlbumArtistID, strMusicBrainzTRMID, iTimesPlayed, iStartOffset, iEndOffset, idThumb, lastplayed, rating, comment FROM song"); - // Load some info from embedded cuesheet if present (now only ReplayGain) - CueInfoLoader cueLoader; - for (int i = 0; i < items.Size(); ++i) - cueLoader.Load(LoadCuesheet(items[i]->GetMusicInfoTag()->GetURL()), items[i]); + for (VECSONGS::iterator it = songs.begin(); it != songs.end(); ++it) + { + std::string strSQL; + strSQL = PrepareSQL("UPDATE song_new SET strGenres='%s' WHERE idSong=%i", StringUtils::Join(it->genre, g_advancedSettings.m_musicItemSeparator).c_str(), it->idSong); + m_pDS->exec(strSQL); + } - CLog::Log(LOGDEBUG, "%s(%s) - took %d ms", __FUNCTION__, filter.where.c_str(), XbmcThreads::SystemClockMillis() - time); - return true; + m_pDS->exec("DROP TABLE song"); + m_pDS->exec("ALTER TABLE song_new RENAME TO song"); + m_pDS->exec("DROP TABLE IF EXISTS exgenresong"); } - catch (...) + + if (version < 25) { - // cleanup - m_pDS->close(); - CLog::Log(LOGERROR, "%s(%s) failed", __FUNCTION__, filter.where.c_str()); + m_pDS->exec("ALTER TABLE album ADD bCompilation integer not null default '0'"); } - return false; -} -bool CMusicDatabase::GetSongsByYear(const std::string& baseDir, CFileItemList& items, int year) -{ - CMusicDbUrl musicUrl; - if (!musicUrl.FromString(baseDir)) - return false; - - musicUrl.AddOption("year", year); - - Filter filter; - return GetSongsByWhere(baseDir, filter, items); -} - -bool CMusicDatabase::GetSongsNav(const std::string& strBaseDir, CFileItemList& items, int idGenre, int idArtist, int idAlbum, const SortDescription &sortDescription /* = SortDescription() */) -{ - CMusicDbUrl musicUrl; - if (!musicUrl.FromString(strBaseDir)) - return false; + if (version < 26) + { // add art table + m_pDS->exec("CREATE TABLE art(art_id INTEGER PRIMARY KEY, media_id INTEGER, media_type TEXT, type TEXT, url TEXT)"); + } - if (idAlbum > 0) - musicUrl.AddOption("albumid", idAlbum); + if (version < 27) + { + m_pDS->exec("DROP TABLE IF EXISTS thumb"); - if (idGenre > 0) - musicUrl.AddOption("genreid", idGenre); + CMediaSettings::Get().SetMusicNeedsUpdate(27); + CSettings::Get().Save(); + } - if (idArtist > 0) - musicUrl.AddOption("artistid", idArtist); + if (version < 29) + { // update old art URLs + m_pDS->query("select art_id,url from art where url like 'image://%%'"); + vector< pair > art; + while (!m_pDS->eof()) + { + art.push_back(make_pair(m_pDS->fv(0).get_asInt(), CURL(m_pDS->fv(1).get_asString()).Get())); + m_pDS->next(); + } + m_pDS->close(); + for (vector< pair >::iterator i = art.begin(); i != art.end(); ++i) + m_pDS->exec(PrepareSQL("update art set url='%s' where art_id=%d", i->second.c_str(), i->first)); + } + if (version < 30) + { // update URL encoded paths + m_pDS->query("select idSong, strFileName from song"); + vector< pair > files; + while (!m_pDS->eof()) + { + files.push_back(make_pair(m_pDS->fv(0).get_asInt(), m_pDS->fv(1).get_asString())); + m_pDS->next(); + } + m_pDS->close(); - Filter filter; - return GetSongsByWhere(musicUrl.ToString(), filter, items, sortDescription); -} + for (vector< pair >::iterator i = files.begin(); i != files.end(); ++i) + { + std::string filename = i->second; + if (URIUtils::UpdateUrlEncoding(filename)) + m_pDS->exec(PrepareSQL("UPDATE song SET strFileName='%s' WHERE idSong=%d", filename.c_str(), i->first)); + } + } -void CMusicDatabase::UpdateTables(int version) -{ - CLog::Log(LOGINFO, "%s - updating tables", __FUNCTION__); if (version < 34) { m_pDS->exec("ALTER TABLE artist ADD strMusicBrainzArtistID text\n"); @@ -4093,8 +3933,8 @@ { m_pDS->exec("ALTER TABLE album_artist ADD strJoinPhrase text\n"); m_pDS->exec("ALTER TABLE song_artist ADD strJoinPhrase text\n"); - CMediaSettings::GetInstance().SetMusicNeedsUpdate(35); - CSettings::GetInstance().Save(); + CMediaSettings::Get().SetMusicNeedsUpdate(35); + CSettings::Get().Save(); } if (version < 36) @@ -4102,7 +3942,7 @@ // translate legacy musicdb:// paths if (m_pDS->query("SELECT strPath FROM content")) { - std::vector contentPaths; + vector contentPaths; while (!m_pDS->eof()) { contentPaths.push_back(m_pDS->fv(0).get_asString()); @@ -4110,11 +3950,11 @@ } m_pDS->close(); - for (std::vector::const_iterator it = contentPaths.begin(); it != contentPaths.end(); ++it) + for (vector::const_iterator it = contentPaths.begin(); it != contentPaths.end(); ++it) { std::string originalPath = *it; std::string path = CLegacyPathTranslation::TranslateMusicDbPath(originalPath); - m_pDS->exec(PrepareSQL("UPDATE content SET strPath='%s' WHERE strPath='%s'", path.c_str(), originalPath.c_str())); + m_pDS->exec(PrepareSQL("UPDATE content SET strPath='%s' WHERE strPath='%s'", path.c_str(), originalPath.c_str()).c_str()); } } } @@ -4195,7 +4035,7 @@ m_pDS->exec("ALTER TABLE song_artist ADD strArtist text\n"); // populate these std::string sql = "select idArtist,strArtist from artist"; - m_pDS->query(sql); + m_pDS->query(sql.c_str()); while (!m_pDS->eof()) { m_pDS2->exec(PrepareSQL("UPDATE song_artist SET strArtist='%s' where idArtist=%i", m_pDS->fv(1).get_asString().c_str(), m_pDS->fv(0).get_asInt())); @@ -4209,6 +4049,7 @@ if (version < 48) { // null out columns that are no longer used m_pDS->exec("UPDATE song SET dwFileNameCRC=NULL, idThumb=NULL"); + m_pDS->exec("UPDATE karaokedata SET strKaraLyrFileCRC=NULL"); m_pDS->exec("UPDATE album SET idThumb=NULL"); } if (version < 49) @@ -4228,87 +4069,14 @@ { m_pDS->exec("ALTER TABLE song ADD mood text\n"); } - if (version < 53) - { - m_pDS->exec("ALTER TABLE song ADD dateAdded text"); - CMediaSettings::GetInstance().SetMusicNeedsUpdate(53); - CSettings::GetInstance().Save(); - } - if (version < 54) - { - //Remove dateAdded from artist table - m_pDS->exec("CREATE TABLE artist_new ( idArtist integer primary key, " - " strArtist varchar(256), strMusicBrainzArtistID text, " - " strBorn text, strFormed text, strGenres text, strMoods text, " - " strStyles text, strInstruments text, strBiography text, " - " strDied text, strDisbanded text, strYearsActive text, " - " strImage text, strFanart text, " - " lastScraped varchar(20) default NULL)"); - m_pDS->exec("INSERT INTO artist_new " - "(idArtist, strArtist, strMusicBrainzArtistID, " - " strBorn, strFormed, strGenres, strMoods, " - " strStyles , strInstruments , strBiography , " - " strDied, strDisbanded, strYearsActive, " - " strImage, strFanart, lastScraped) " - " SELECT " - " idArtist, " - " strArtist, strMusicBrainzArtistID, " - " strBorn, strFormed, strGenres, strMoods, " - " strStyles, strInstruments, strBiography, " - " strDied, strDisbanded, strYearsActive, " - " strImage, strFanart, lastScraped " - " FROM artist"); - m_pDS->exec("DROP TABLE artist"); - m_pDS->exec("ALTER TABLE artist_new RENAME TO artist"); - - //Remove dateAdded from album table - m_pDS->exec("CREATE TABLE album_new (idAlbum integer primary key, " - " strAlbum varchar(256), strMusicBrainzAlbumID text, " - " strArtists text, strGenres text, " - " iYear integer, idThumb integer, " - " bCompilation integer not null default '0', " - " strMoods text, strStyles text, strThemes text, " - " strReview text, strImage text, strLabel text, " - " strType text, " - " iRating integer, " - " lastScraped varchar(20) default NULL, " - " strReleaseType text)"); - m_pDS->exec("INSERT INTO album_new " - "(idAlbum, " - " strAlbum, strMusicBrainzAlbumID, " - " strArtists, strGenres, " - " iYear, idThumb, " - " bCompilation, " - " strMoods, strStyles, strThemes, " - " strReview, strImage, strLabel, " - " strType, iRating, lastScraped, " - " strReleaseType) " - " SELECT " - " album.idAlbum, " - " strAlbum, strMusicBrainzAlbumID, " - " strArtists, strGenres, " - " iYear, idThumb, " - " bCompilation, " - " strMoods, strStyles, strThemes, " - " strReview, strImage, strLabel, " - " strType, iRating, lastScraped, " - " strReleaseType" - " FROM album"); - m_pDS->exec("DROP TABLE album"); - m_pDS->exec("ALTER TABLE album_new RENAME TO album"); - } - if (version < 55) - { - m_pDS->exec("DROP TABLE karaokedata"); - } } int CMusicDatabase::GetSchemaVersion() const { - return 56; + return 52; } -unsigned int CMusicDatabase::GetSongIDs(const Filter &filter, std::vector > &songIDs) +unsigned int CMusicDatabase::GetSongIDs(const Filter &filter, vector > &songIDs) { try { @@ -4319,7 +4087,7 @@ if (!CDatabase::BuildSQL(strSQL, filter, strSQL)) return false; - if (!m_pDS->query(strSQL)) return 0; + if (!m_pDS->query(strSQL.c_str())) return 0; songIDs.clear(); if (m_pDS->num_rows() == 0) { @@ -4329,7 +4097,7 @@ songIDs.reserve(m_pDS->num_rows()); while (!m_pDS->eof()) { - songIDs.push_back(std::make_pair(1,m_pDS->fv(song_idSong).get_asInt())); + songIDs.push_back(make_pair(1,m_pDS->fv(song_idSong).get_asInt())); m_pDS->next(); } // cleanup m_pDS->close(); @@ -4353,7 +4121,7 @@ if (!CDatabase::BuildSQL(strSQL, filter, strSQL)) return false; - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; if (m_pDS->num_rows() == 0) { m_pDS->close(); @@ -4382,7 +4150,7 @@ path.clear(); std::string strSQL=PrepareSQL("select strPath from song join path on song.idPath = path.idPath where song.idAlbum=%ld", idAlbum); - if (!m_pDS2->query(strSQL)) return false; + if (!m_pDS2->query(strSQL.c_str())) return false; int iRowsFound = m_pDS2->num_rows(); if (iRowsFound == 0) { @@ -4437,7 +4205,7 @@ " GROUP BY song.idPath", idArtist); // run query - if (!m_pDS2->query(strSQL)) return false; + if (!m_pDS2->query(strSQL.c_str())) return false; int iRowsFound = m_pDS2->num_rows(); if (iRowsFound == 0) { @@ -4488,7 +4256,7 @@ std::string strSQL=PrepareSQL("select idArtist from artist where artist.strArtist like '%s'", strArtist.c_str()); // run query - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound != 1) { @@ -4519,7 +4287,7 @@ else strSQL=PrepareSQL("SELECT album.idAlbum FROM album WHERE album.strAlbum LIKE '%s' AND album.strArtists LIKE '%s'", strAlbum.c_str(),strArtist.c_str()); // run query - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound != 1) { @@ -4565,7 +4333,7 @@ std::string strSQL; strSQL=PrepareSQL("select idGenre from genre where genre.strGenre like '%s'", strGenre.c_str()); // run query - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound != 1) { @@ -4601,7 +4369,7 @@ CLog::Log(LOGDEBUG, "%s query = %s", __FUNCTION__, strSQL.c_str()); // run query - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound != 1) @@ -4673,7 +4441,7 @@ if (idPath < 0) return false; std::string strSQL=PrepareSQL("update path set strHash='%s' where idPath=%ld", hash.c_str(), idPath); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return true; } @@ -4693,7 +4461,7 @@ if (NULL == m_pDS.get()) return false; std::string strSQL=PrepareSQL("select strHash from path where strPath='%s'", path.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() == 0) return false; hash = m_pDS->fv("strHash").get_asString(); @@ -4750,7 +4518,7 @@ else where = PrepareSQL(" where SUBSTR(strPath,1,%i)='%s'", StringUtils::utf8_strlen(path.c_str()), path.c_str()); std::string sql = "select * from songview" + where; - if (!m_pDS->query(sql)) return false; + if (!m_pDS->query(sql.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound > 0) { @@ -4759,7 +4527,7 @@ { CSong song = GetSongFromDataset(); song.strThumb = GetArtForItem(song.idSong, MediaTypeSong, "thumb"); - songs.insert(std::make_pair(song.strFileName, song)); + songs.insert(make_pair(song.strFileName, song)); songIds.push_back(PrepareSQL("%i", song.idSong)); m_pDS->next(); } @@ -4771,11 +4539,11 @@ // and delete all songs, and anything linked to them sql = "delete from song where idSong in (" + StringUtils::Join(songIds, ",") + ")"; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } // and remove the path as well (it'll be re-added later on with the new hash if it's non-empty) sql = "delete from path" + where; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); return iRowsFound > 0; } catch (...) @@ -4785,7 +4553,7 @@ return false; } -bool CMusicDatabase::GetPaths(std::set &paths) +bool CMusicDatabase::GetPaths(set &paths) { try { @@ -4817,7 +4585,7 @@ return false; } -bool CMusicDatabase::SetSongUserrating(const std::string &filePath, char rating) +bool CMusicDatabase::SetSongRating(const std::string &filePath, char rating) { try { @@ -4829,7 +4597,7 @@ if (-1 == songID) return false; std::string sql = PrepareSQL("update song set rating='%c' where idSong = %i", rating, songID); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); return true; } catch (...) @@ -4860,7 +4628,7 @@ URIUtils::AddSlashAtEnd(strPath); std::string sql = PrepareSQL("select idSong from song join path on song.idPath = path.idPath where song.strFileName='%s' and path.strPath='%s'", strFileName.c_str(), strPath.c_str()); - if (!m_pDS->query(sql)) return -1; + if (!m_pDS->query(sql.c_str())) return -1; if (m_pDS->num_rows() == 0) { @@ -4898,12 +4666,12 @@ // wipe old settings std::string strSQL = PrepareSQL("delete from content where strPath='%s'",strPath.c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); // insert new settings strSQL = PrepareSQL("insert into content (strPath, strScraperPath, strContent, strSettings) values ('%s','%s','%s','%s')", strPath.c_str(), scraper->ID().c_str(), ADDON::TranslateContent(scraper->Content()).c_str(), scraper->GetPathSettings().c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return true; } @@ -4922,7 +4690,7 @@ if (NULL == m_pDS.get()) return false; std::string strSQL = PrepareSQL("select * from content where strPath='%s'",strPath.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->eof()) // no info set for path - fallback logic commencing { CQueryParams params; @@ -4930,27 +4698,27 @@ if (params.GetGenreId() != -1) // check genre { strSQL = PrepareSQL("select * from content where strPath='musicdb://genres/%i/'",params.GetGenreId()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); } if (m_pDS->eof() && params.GetAlbumId() != -1) // check album { strSQL = PrepareSQL("select * from content where strPath='musicdb://albums/%i/'",params.GetAlbumId()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->eof()) // general albums setting { strSQL = PrepareSQL("select * from content where strPath='musicdb://albums/'"); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); } } if (m_pDS->eof() && params.GetArtistId() != -1) // check artist { strSQL = PrepareSQL("select * from content where strPath='musicdb://artists/%i/'",params.GetArtistId()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->eof()) // general artist setting { strSQL = PrepareSQL("select * from content where strPath='musicdb://artists/'"); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); } } } @@ -4963,7 +4731,7 @@ if (content != CONTENT_NONE) { // content set, use pre configured or default scraper ADDON::AddonPtr addon; - if (!scraperUUID.empty() && ADDON::CAddonMgr::GetInstance().GetAddon(scraperUUID, addon) && addon) + if (!scraperUUID.empty() && ADDON::CAddonMgr::Get().GetAddon(scraperUUID, addon) && addon) { info = std::dynamic_pointer_cast(addon->Clone()); if (!info) @@ -4975,7 +4743,7 @@ else { // use default scraper of the requested type ADDON::AddonPtr defaultScraper; - if (ADDON::CAddonMgr::GetInstance().GetDefault(type, defaultScraper)) + if (ADDON::CAddonMgr::Get().GetDefault(type, defaultScraper)) { info = std::dynamic_pointer_cast(defaultScraper->Clone()); } @@ -4986,7 +4754,7 @@ if (!info) { // use default music scraper instead ADDON::AddonPtr addon; - if(ADDON::CAddonMgr::GetInstance().GetDefault(type, addon)) + if(ADDON::CAddonMgr::Get().GetDefault(type, addon)) { info = std::dynamic_pointer_cast(addon); return info != NULL; @@ -5012,7 +4780,7 @@ if (NULL == m_pDS.get()) return false; std::string sql = PrepareSQL("select count(1) from content where strScraperPath='%s'",scraperID.c_str()); - if (!m_pDS->query(sql) || m_pDS->num_rows() == 0) + if (!m_pDS->query(sql.c_str()) || m_pDS->num_rows() == 0) return false; bool found = m_pDS->fv(0).get_asInt() > 0; m_pDS->close(); @@ -5041,7 +4809,7 @@ else if (StringUtils::EqualsNoCase(itemType, "years")) return GetYearsNav(strBaseDir, items, filter); else if (StringUtils::EqualsNoCase(itemType, "artists")) - return GetArtistsNav(strBaseDir, items, !CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_SHOWCOMPILATIONARTISTS), -1, -1, -1, filter, sortDescription); + return GetArtistsNav(strBaseDir, items, !CSettings::Get().GetBool("musiclibrary.showcompilationartists"), -1, -1, -1, filter, sortDescription); else if (StringUtils::EqualsNoCase(itemType, "albums")) return GetAlbumsByWhere(strBaseDir, filter, items, sortDescription); else if (StringUtils::EqualsNoCase(itemType, "songs")) @@ -5064,7 +4832,7 @@ return ""; } -void CMusicDatabase::ExportToXML(const std::string &xmlFile, bool singleFile, bool images, bool overwrite) +void CMusicDatabase::ExportToXML(const std::string &xmlFile, bool singleFiles, bool images, bool overwrite) { int iFailCount = 0; CGUIDialogProgress *progress=NULL; @@ -5075,9 +4843,9 @@ if (NULL == m_pDS2.get()) return; // find all albums - std::vector albumIds; + vector albumIds; std::string sql = "select idAlbum FROM album WHERE lastScraped IS NOT NULL"; - m_pDS->query(sql); + m_pDS->query(sql.c_str()); int total = m_pDS->num_rows(); int current = 0; @@ -5093,12 +4861,12 @@ progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); if (progress) { - progress->SetHeading(CVariant{20196}); - progress->SetLine(0, CVariant{650}); - progress->SetLine(1, CVariant{""}); - progress->SetLine(2, CVariant{""}); + progress->SetHeading(20196); + progress->SetLine(0, 650); + progress->SetLine(1, ""); + progress->SetLine(2, ""); progress->SetPercentage(0); - progress->Open(); + progress->StartModal(); progress->ShowProgressBar(true); } @@ -5107,21 +4875,21 @@ TiXmlDeclaration decl("1.0", "UTF-8", "yes"); xmlDoc.InsertEndChild(decl); TiXmlNode *pMain = NULL; - if (!singleFile) + if (singleFiles) pMain = &xmlDoc; else { TiXmlElement xmlMainElement("musicdb"); pMain = xmlDoc.InsertEndChild(xmlMainElement); } - for (std::vector::iterator albumId = albumIds.begin(); albumId != albumIds.end(); ++albumId) + for (vector::iterator albumId = albumIds.begin(); albumId != albumIds.end(); ++albumId) { CAlbum album; GetAlbum(*albumId, album); std::string strPath; GetAlbumPath(*albumId, strPath); album.Save(pMain, "album", strPath); - if (!singleFile) + if (singleFiles) { if (!CDirectory::Exists(strPath)) CLog::Log(LOGDEBUG, "%s - Not exporting item %s as it does not exist", __FUNCTION__, strPath.c_str()); @@ -5140,9 +4908,9 @@ if (images) { - std::string thumb = GetArtForItem(album.idAlbum, MediaTypeAlbum, "thumb"); + string thumb = GetArtForItem(album.idAlbum, MediaTypeAlbum, "thumb"); if (!thumb.empty() && (overwrite || !CFile::Exists(URIUtils::AddFileToFolder(strPath,"folder.jpg")))) - CTextureCache::GetInstance().Export(thumb, URIUtils::AddFileToFolder(strPath,"folder.jpg")); + CTextureCache::Get().Export(thumb, URIUtils::AddFileToFolder(strPath,"folder.jpg")); } xmlDoc.Clear(); TiXmlDeclaration decl("1.0", "UTF-8", "yes"); @@ -5152,7 +4920,7 @@ if ((current % 50) == 0 && progress) { - progress->SetLine(1, CVariant{album.strAlbum}); + progress->SetLine(1, album.strAlbum); progress->SetPercentage(current * 100 / total); progress->Progress(); if (progress->IsCanceled()) @@ -5166,9 +4934,9 @@ } // find all artists - std::vector artistIds; + vector artistIds; std::string artistSQL = "SELECT idArtist FROM artist where lastScraped IS NOT NULL"; - m_pDS->query(artistSQL); + m_pDS->query(artistSQL.c_str()); total = m_pDS->num_rows(); current = 0; artistIds.reserve(total); @@ -5179,7 +4947,7 @@ } m_pDS->close(); - for (std::vector::iterator artistId = artistIds.begin(); artistId != artistIds.end(); ++artistId) + for (vector::iterator artistId = artistIds.begin(); artistId != artistIds.end(); ++artistId) { CArtist artist; GetArtist(*artistId, artist); @@ -5187,15 +4955,15 @@ GetArtistPath(artist.idArtist,strPath); artist.Save(pMain, "artist", strPath); - std::map artwork; - if (GetArtForItem(artist.idArtist, MediaTypeArtist, artwork) && singleFile) + map artwork; + if (GetArtForItem(artist.idArtist, MediaTypeArtist, artwork) && !singleFiles) { // append to the XML TiXmlElement additionalNode("art"); - for (std::map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) + for (map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) XMLUtils::SetString(&additionalNode, i->first.c_str(), i->second); pMain->LastChild()->InsertEndChild(additionalNode); } - if (!singleFile) + if (singleFiles) { if (!CDirectory::Exists(strPath)) CLog::Log(LOGDEBUG, "%s - Not exporting item %s as it does not exist", __FUNCTION__, strPath.c_str()); @@ -5217,9 +4985,9 @@ std::string savedThumb = URIUtils::AddFileToFolder(strPath,"folder.jpg"); std::string savedFanart = URIUtils::AddFileToFolder(strPath,"fanart.jpg"); if (artwork.find("thumb") != artwork.end() && (overwrite || !CFile::Exists(savedThumb))) - CTextureCache::GetInstance().Export(artwork["thumb"], savedThumb); + CTextureCache::Get().Export(artwork["thumb"], savedThumb); if (artwork.find("fanart") != artwork.end() && (overwrite || !CFile::Exists(savedFanart))) - CTextureCache::GetInstance().Export(artwork["fanart"], savedFanart); + CTextureCache::Get().Export(artwork["fanart"], savedFanart); } xmlDoc.Clear(); TiXmlDeclaration decl("1.0", "UTF-8", "yes"); @@ -5229,7 +4997,7 @@ if ((current % 50) == 0 && progress) { - progress->SetLine(1, CVariant{artist.strArtist}); + progress->SetLine(1, artist.strArtist); progress->SetPercentage(current * 100 / total); progress->Progress(); if (progress->IsCanceled()) @@ -5243,15 +5011,6 @@ } xmlDoc.SaveFile(xmlFile); - - CVariant data; - if (singleFile) - { - data["file"] = xmlFile; - if (iFailCount > 0) - data["failcount"] = iFailCount; - } - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnExport", data); } catch (...) { @@ -5263,7 +5022,7 @@ progress->Close(); if (iFailCount > 0) - CGUIDialogOK::ShowAndGetInput(CVariant{20196}, CVariant{StringUtils::Format(g_localizeStrings.Get(15011).c_str(), iFailCount)}); + CGUIDialogOK::ShowAndGetInput(20196, StringUtils::Format(g_localizeStrings.Get(15011).c_str(), iFailCount)); } void CMusicDatabase::ImportFromXML(const std::string &xmlFile) @@ -5283,12 +5042,12 @@ if (progress) { - progress->SetHeading(CVariant{20197}); - progress->SetLine(0, CVariant{649}); - progress->SetLine(1, CVariant{330}); - progress->SetLine(2, CVariant{""}); + progress->SetHeading(20197); + progress->SetLine(0, 649); + progress->SetLine(1, 330); + progress->SetLine(2, ""); progress->SetPercentage(0); - progress->Open(); + progress->StartModal(); progress->ShowProgressBar(true); } @@ -5330,7 +5089,7 @@ CAlbum importedAlbum; importedAlbum.Load(entry); strTitle = importedAlbum.strAlbum; - int idAlbum = GetAlbumByName(importedAlbum.strAlbum, importedAlbum.GetAlbumArtistString()); + int idAlbum = GetAlbumByName(importedAlbum.strAlbum, importedAlbum.artist); if (idAlbum > -1) { CAlbum album; @@ -5345,7 +5104,7 @@ if (progress && total) { progress->SetPercentage(current * 100 / total); - progress->SetLine(2, CVariant{std::move(strTitle)}); + progress->SetLine(2, strTitle); progress->Progress(); if (progress->IsCanceled()) { @@ -5368,6 +5127,358 @@ progress->Close(); } +void CMusicDatabase::AddKaraokeData(int idSong, int iKaraokeNumber) +{ + try + { + std::string strSQL; + + // If song.iKaraokeNumber is non-zero, we already have it in the database. Just replace the song ID. + if (iKaraokeNumber > 0) + { + std::string strSQL = PrepareSQL("UPDATE karaokedata SET idSong=%i WHERE iKaraNumber=%i", idSong, iKaraokeNumber); + m_pDS->exec(strSQL.c_str()); + return; + } + + // Get the maximum number allocated + strSQL=PrepareSQL( "SELECT MAX(iKaraNumber) FROM karaokedata" ); + if (!m_pDS->query(strSQL.c_str())) return; + + int iKaraokeNumber = g_advancedSettings.m_karaokeStartIndex; + + if ( m_pDS->num_rows() == 1 ) + iKaraokeNumber = m_pDS->fv("MAX(iKaraNumber)").get_asInt() + 1; + + // Add the data + strSQL=PrepareSQL( "INSERT INTO karaokedata (iKaraNumber, idSong, iKaraDelay, strKaraEncoding, strKaralyrics) " + "VALUES( %i, %i, 0, NULL, NULL)", iKaraokeNumber, idSong ); + + m_pDS->exec(strSQL.c_str()); + } + catch (...) + { + CLog::Log(LOGERROR, "%s -(%i, %i) failed", __FUNCTION__, idSong, iKaraokeNumber); + } +} + +bool CMusicDatabase::GetSongByKaraokeNumber(int number, CSong & song) +{ + try + { + // Get info from karaoke db + if (NULL == m_pDB.get()) return false; + if (NULL == m_pDS.get()) return false; + + std::string strSQL=PrepareSQL("SELECT * FROM karaokedata where iKaraNumber=%ld", number); + + if (!m_pDS->query(strSQL.c_str())) return false; + if (m_pDS->num_rows() == 0) + { + m_pDS->close(); + return false; + } + + int idSong = m_pDS->fv("karaokedata.idSong").get_asInt(); + m_pDS->close(); + + return GetSong( idSong, song ); + } + catch (...) + { + CLog::Log(LOGERROR, "%s(%i) failed", __FUNCTION__, number); + } + + return false; +} + +void CMusicDatabase::ExportKaraokeInfo(const std::string & outFile, bool asHTML) +{ + try + { + if (NULL == m_pDB.get()) return; + if (NULL == m_pDS.get()) return; + + // find all karaoke songs + std::string sql = "SELECT * FROM songview WHERE iKaraNumber > 0 ORDER BY strFileName"; + + m_pDS->query(sql.c_str()); + + int total = m_pDS->num_rows(); + int current = 0; + + if ( total == 0 ) + { + m_pDS->close(); + return; + } + + // Write the document + XFILE::CFile file; + + if ( !file.OpenForWrite( outFile, true ) ) + return; + + CGUIDialogProgress *progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); + if (progress) + { + progress->SetHeading(asHTML ? 22034 : 22035); + progress->SetLine(0, 650); + progress->SetLine(1, ""); + progress->SetLine(2, ""); + progress->SetPercentage(0); + progress->StartModal(); + progress->ShowProgressBar(true); + } + + std::string outdoc; + if ( asHTML ) + { + outdoc = "\n" + "\n\n"; + + if (file.Write(outdoc.c_str(), outdoc.size()) != static_cast(outdoc.size())) + return; // error + } + + while (!m_pDS->eof()) + { + CSong song = GetSongFromDataset(); + std::string songnum = StringUtils::Format("%06ld", song.iKaraokeNumber); + + if ( asHTML ) + outdoc = "\r\n"; + else + outdoc = songnum + '\t' + StringUtils::Join(song.artist, g_advancedSettings.m_musicItemSeparator) + '\t' + song.strTitle + '\t' + song.strFileName + "\r\n"; + + if (file.Write(outdoc.c_str(), outdoc.size()) != static_cast(outdoc.size())) + return; // error + + if ((current % 50) == 0 && progress) + { + progress->SetPercentage(current * 100 / total); + progress->Progress(); + if (progress->IsCanceled()) + { + progress->Close(); + m_pDS->close(); + return; + } + } + m_pDS->next(); + current++; + } + + m_pDS->close(); + + if ( asHTML ) + { + outdoc = "
" + songnum + "" + StringUtils::Join(song.artist, g_advancedSettings.m_musicItemSeparator) + "" + song.strTitle + "
\n\n\n"; + if (file.Write(outdoc.c_str(), outdoc.size()) != static_cast(outdoc.size())) + return; // error + } + + file.Close(); + + if (progress) + progress->Close(); + } + catch (...) + { + CLog::Log(LOGERROR, "%s failed", __FUNCTION__); + } +} + +void CMusicDatabase::ImportKaraokeInfo(const std::string & inputFile) +{ + CGUIDialogProgress *progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); + + try + { + if (NULL == m_pDB.get()) return; + + XFILE::CFile file; + XFILE::auto_buffer buf; + + if (file.LoadFile(inputFile, buf) <= 0) + { + CLog::Log(LOGERROR, "%s: Cannot read karaoke import file \"%s\"", __FUNCTION__, inputFile.c_str()); + return; + } + + // Null-terminate content + buf.resize(buf.size() + 1); + buf.get()[buf.size() - 1] = 0; + + file.Close(); + + if (progress) + { + progress->SetHeading( 22036 ); + progress->SetLine(0, 649); + progress->SetLine(1, ""); + progress->SetLine(2, ""); + progress->SetPercentage(0); + progress->StartModal(); + progress->ShowProgressBar(true); + } + + if (NULL == m_pDS.get()) return; + BeginTransaction(); + + // + // A simple state machine to parse the file + // + char * linestart = buf.get(); + unsigned int offset = 0, lastpercentage = 0; + + for (char * p = buf.get(); *p; p++, offset++) + { + // Skip \r + if ( *p == 0x0D ) + { + *p = '\0'; + continue; + } + + // Line number + if ( *p == 0x0A ) + { + *p = '\0'; + + unsigned int tabs = 0; + char * songpath, *artist = 0, *title = 0; + for ( songpath = linestart; *songpath; songpath++ ) + { + if ( *songpath == '\t' ) + { + tabs++; + *songpath = '\0'; + + switch( tabs ) + { + case 1: // the number end + artist = songpath + 1; + break; + + case 2: // the artist end + title = songpath + 1; + break; + + case 3: // the title end + break; + } + } + } + + int num = atoi( linestart ); + if ( num <= 0 || tabs < 3 || *artist == '\0' || *title == '\0' ) + { + CLog::Log( LOGERROR, "Karaoke import: error in line %s", linestart ); + linestart = p + 1; + continue; + } + + linestart = p + 1; + std::string strSQL=PrepareSQL("select idSong from songview " + "where strArtists like '%s' and strTitle like '%s'", artist, title ); + + if ( !m_pDS->query(strSQL.c_str()) ) + { + RollbackTransaction(); + if (progress) + progress->Close(); + m_pDS->close(); + return; + } + + int iRowsFound = m_pDS->num_rows(); + if (iRowsFound == 0) + { + CLog::Log( LOGERROR, "Karaoke import: song %s by %s #%d is not found in the database, skipped", + title, artist, num ); + continue; + } + + int lResult = m_pDS->fv(0).get_asInt(); + strSQL = PrepareSQL("UPDATE karaokedata SET iKaraNumber=%i WHERE idSong=%i", num, lResult ); + m_pDS->exec(strSQL.c_str()); + + if ( progress && (offset * 100 / buf.size()) != lastpercentage ) + { + lastpercentage = offset * 100 / buf.size(); + progress->SetPercentage( lastpercentage); + progress->Progress(); + if ( progress->IsCanceled() ) + { + RollbackTransaction(); + progress->Close(); + m_pDS->close(); + return; + } + } + } + } + + CommitTransaction(); + CLog::Log( LOGNOTICE, "Karaoke import: file '%s' was imported successfully", inputFile.c_str() ); + } + catch (...) + { + CLog::Log(LOGERROR, "%s failed", __FUNCTION__); + RollbackTransaction(); + } + + if (progress) + progress->Close(); +} + +bool CMusicDatabase::SetKaraokeSongDelay(int idSong, int delay) +{ + try + { + if (NULL == m_pDB.get()) return false; + if (NULL == m_pDS.get()) return false; + + std::string strSQL = PrepareSQL("UPDATE karaokedata SET iKaraDelay=%i WHERE idSong=%i", delay, idSong); + m_pDS->exec(strSQL.c_str()); + + return true; + } + catch (...) + { + CLog::Log(LOGERROR, "%s failed", __FUNCTION__); + } + + return false; +} + +int CMusicDatabase::GetKaraokeSongsCount() +{ + try + { + if (NULL == m_pDB.get()) return 0; + if (NULL == m_pDS.get()) return 0; + + if (!m_pDS->query( "select count(idSong) as NumSongs from karaokedata")) return 0; + if (m_pDS->num_rows() == 0) + { + m_pDS->close(); + return 0; + } + + int iNumSongs = m_pDS->fv("NumSongs").get_asInt(); + // cleanup + m_pDS->close(); + return iNumSongs; + } + catch (...) + { + CLog::Log(LOGERROR, "%s failed", __FUNCTION__); + } + return 0; +} + void CMusicDatabase::SetPropertiesFromArtist(CFileItem& item, const CArtist& artist) { item.SetProperty("artist_instrument", StringUtils::Join(artist.instruments, g_advancedSettings.m_musicItemSeparator)); @@ -5398,8 +5509,8 @@ item.SetProperty("album_style_array", album.styles); item.SetProperty("album_type", album.strType); item.SetProperty("album_label", album.strLabel); - item.SetProperty("album_artist", album.GetAlbumArtistString()); - item.SetProperty("album_artist_array", album.GetAlbumArtist()); + item.SetProperty("album_artist", StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator)); + item.SetProperty("album_artist_array", album.artist); item.SetProperty("album_genre", StringUtils::Join(album.genre, g_advancedSettings.m_musicItemSeparator)); item.SetProperty("album_genre_array", album.genre); item.SetProperty("album_title", album.strAlbum); @@ -5412,7 +5523,7 @@ { if (!item.HasMusicInfoTag()) return; - int idArtist = GetArtistByName(item.GetMusicInfoTag()->GetArtistString()); + int idArtist = GetArtistByName(StringUtils::Join(item.GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator)); if (idArtist > -1) { CArtist artist; @@ -5422,7 +5533,7 @@ int idAlbum = item.GetMusicInfoTag()->GetAlbumId(); if (idAlbum <= 0) idAlbum = GetAlbumByName(item.GetMusicInfoTag()->GetAlbum(), - item.GetMusicInfoTag()->GetArtistString()); + item.GetMusicInfoTag()->GetArtist()); if (idAlbum > -1) { CAlbum album; @@ -5431,13 +5542,13 @@ } } -void CMusicDatabase::SetArtForItem(int mediaId, const std::string &mediaType, const std::map &art) +void CMusicDatabase::SetArtForItem(int mediaId, const string &mediaType, const map &art) { - for (std::map::const_iterator i = art.begin(); i != art.end(); ++i) + for (map::const_iterator i = art.begin(); i != art.end(); ++i) SetArtForItem(mediaId, mediaType, i->first, i->second); } -void CMusicDatabase::SetArtForItem(int mediaId, const std::string &mediaType, const std::string &artType, const std::string &url) +void CMusicDatabase::SetArtForItem(int mediaId, const string &mediaType, const string &artType, const string &url) { try { @@ -5445,23 +5556,23 @@ if (NULL == m_pDS.get()) return; // don't set . art types - these are derivative types from parent items - if (artType.find('.') != std::string::npos) + if (artType.find('.') != string::npos) return; std::string sql = PrepareSQL("SELECT art_id FROM art WHERE media_id=%i AND media_type='%s' AND type='%s'", mediaId, mediaType.c_str(), artType.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (!m_pDS->eof()) { // update int artId = m_pDS->fv(0).get_asInt(); m_pDS->close(); sql = PrepareSQL("UPDATE art SET url='%s' where art_id=%d", url.c_str(), artId); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } else { // insert m_pDS->close(); sql = PrepareSQL("INSERT INTO art(media_id, media_type, type, url) VALUES (%d, '%s', '%s', '%s')", mediaId, mediaType.c_str(), artType.c_str(), url.c_str()); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } } catch (...) @@ -5470,7 +5581,7 @@ } } -bool CMusicDatabase::GetArtForItem(int mediaId, const std::string &mediaType, std::map &art) +bool CMusicDatabase::GetArtForItem(int mediaId, const string &mediaType, map &art) { try { @@ -5478,10 +5589,10 @@ if (NULL == m_pDS2.get()) return false; // using dataset 2 as we're likely called in loops on dataset 1 std::string sql = PrepareSQL("SELECT type,url FROM art WHERE media_id=%i AND media_type='%s'", mediaId, mediaType.c_str()); - m_pDS2->query(sql); + m_pDS2->query(sql.c_str()); while (!m_pDS2->eof()) { - art.insert(std::make_pair(m_pDS2->fv(0).get_asString(), m_pDS2->fv(1).get_asString())); + art.insert(make_pair(m_pDS2->fv(0).get_asString(), m_pDS2->fv(1).get_asString())); m_pDS2->next(); } m_pDS2->close(); @@ -5494,7 +5605,7 @@ return false; } -std::string CMusicDatabase::GetArtForItem(int mediaId, const std::string &mediaType, const std::string &artType) +string CMusicDatabase::GetArtForItem(int mediaId, const string &mediaType, const string &artType) { std::string query = PrepareSQL("SELECT url FROM art WHERE media_id=%i AND media_type='%s' AND type='%s'", mediaId, mediaType.c_str(), artType.c_str()); return GetSingleValue(query, m_pDS2); @@ -5508,10 +5619,10 @@ if (NULL == m_pDS2.get()) return false; // using dataset 2 as we're likely called in loops on dataset 1 std::string sql = PrepareSQL("SELECT type,url FROM art WHERE media_id=(SELECT idArtist from %s_artist WHERE id%s=%i AND iOrder=0) AND media_type='artist'", mediaType.c_str(), mediaType.c_str(), mediaId); - m_pDS2->query(sql); + m_pDS2->query(sql.c_str()); while (!m_pDS2->eof()) { - art.insert(std::make_pair(m_pDS2->fv(0).get_asString(), m_pDS2->fv(1).get_asString())); + art.insert(make_pair(m_pDS2->fv(0).get_asString(), m_pDS2->fv(1).get_asString())); m_pDS2->next(); } m_pDS2->close(); @@ -5524,7 +5635,7 @@ return false; } -std::string CMusicDatabase::GetArtistArtForItem(int mediaId, const std::string &mediaType, const std::string &artType) +string CMusicDatabase::GetArtistArtForItem(int mediaId, const string &mediaType, const string &artType) { std::string query = PrepareSQL("SELECT url FROM art WHERE media_id=(SELECT idArtist from %s_artist WHERE id%s=%i AND iOrder=0) AND media_type='artist' AND type='%s'", mediaType.c_str(), mediaType.c_str(), mediaId, artType.c_str()); return GetSingleValue(query, m_pDS2); @@ -5603,7 +5714,10 @@ " OR artistview.idArtist IN "; // and always show any artists linked to an album (may be different from above due to album artist tag) - strSQL += "(SELECT album_artist.idArtist FROM album_artist)"; // Includes compliation albums hence "Various artists" + strSQL += "(SELECT album_artist.idArtist FROM album_artist"; // All artists linked to an album + if (albumArtistsOnly) + strSQL += " JOIN album ON album.idAlbum = album_artist.idAlbum WHERE album.bCompilation = 0 "; // then exclude those that have no extra artists + strSQL += ")"; } // remove the null string @@ -5738,7 +5852,7 @@ if (xsp.GetOrder() != SortByNone) sorting.sortBy = xsp.GetOrder(); sorting.sortOrder = xsp.GetOrderAscending() ? SortOrderAscending : SortOrderDescending; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) + if (CSettings::Get().GetBool("filelists.ignorethewhensorting")) sorting.sortAttributes = SortAttributeIgnoreArticle; } } @@ -5763,32 +5877,3 @@ return true; } - -void CMusicDatabase::UpdateFileDateAdded(int songId, const std::string& strFileNameAndPath) -{ - if (songId < 0 || strFileNameAndPath.empty()) - return; - - CDateTime dateAdded; - try - { - if (NULL == m_pDB.get()) return; - if (NULL == m_pDS.get()) return; - - // 1 prefering to use the files mtime(if it's valid) and only using the file's ctime if the mtime isn't valid - if (g_advancedSettings.m_iMusicLibraryDateAdded == 1) - dateAdded = CFileUtils::GetModificationDate(strFileNameAndPath, false); - //2 using the newer datetime of the file's mtime and ctime - else if (g_advancedSettings.m_iMusicLibraryDateAdded == 2) - dateAdded = CFileUtils::GetModificationDate(strFileNameAndPath, true); - //0 using the current datetime if non of the above matches or one returns an invalid datetime - if (!dateAdded.IsValid()) - dateAdded = CDateTime::GetCurrentDateTime(); - - m_pDS->exec(PrepareSQL("UPDATE song SET dateAdded='%s' WHERE idSong=%d", dateAdded.GetAsDBDateTime().c_str(), songId)); - } - catch (...) - { - CLog::Log(LOGERROR, "%s (%s, %s) failed", __FUNCTION__, CURL::GetRedacted(strFileNameAndPath).c_str(), dateAdded.GetAsDBDateTime().c_str()); - } -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/MusicDatabase.h kodi-15.2~git20151019.1039-final/xbmc/music/MusicDatabase.h --- kodi-16.1~git20160425.1001-final/xbmc/music/MusicDatabase.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/MusicDatabase.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,13 +22,11 @@ \brief */ #pragma once -#include - -#include "addons/Scraper.h" -#include "Album.h" #include "dbwrappers/Database.h" -#include "MusicDbUrl.h" +#include "Album.h" +#include "addons/Scraper.h" #include "utils/SortUtils.h" +#include "MusicDbUrl.h" class CArtist; class CFileItem; @@ -125,6 +123,7 @@ \param iEndOffset [in] the end offset of the song (when using a single audio file with .cue) \param dtLastPlayed [in] the time the song was last played \param rating [in] a rating for the song + \param iKaraokeNumber [in] the karaoke id of the song \return the id of the song */ int AddSong(const int idAlbum, @@ -137,7 +136,8 @@ const std::string &artistString, const std::vector& genres, int iTrack, int iDuration, int iYear, const int iTimesPlayed, int iStartOffset, int iEndOffset, - const CDateTime& dtLastPlayed, char rating); + const CDateTime& dtLastPlayed, + char rating, int iKaraokeNumber); bool GetSong(int idSong, CSong& song); /*! \brief Update a song in the database. @@ -171,6 +171,7 @@ \param iEndOffset [in] the end offset of the song (when using a single audio file with .cue) \param dtLastPlayed [in] the time the song was last played \param rating [in] a rating for the song + \param iKaraokeNumber [in] the karaoke id of the song \return the id of the song */ int UpdateSong(int idSong, @@ -180,14 +181,15 @@ const std::string& artistString, const std::vector& genres, int iTrack, int iDuration, int iYear, int iTimesPlayed, int iStartOffset, int iEndOffset, - const CDateTime& dtLastPlayed, char rating); + const CDateTime& dtLastPlayed, + char rating, int iKaraokeNumber); //// Misc Song bool GetSongByFileName(const std::string& strFileName, CSong& song, int startOffset = 0); bool GetSongsByPath(const std::string& strPath, MAPSONGS& songs, bool bAppendToMap = false); bool Search(const std::string& search, CFileItemList &items); bool RemoveSongsFromPath(const std::string &path, MAPSONGS& songs, bool exact=true); - bool SetSongUserrating(const std::string &filePath, char rating); + bool SetSongRating(const std::string &filePath, char rating); int GetSongByArtistAndAlbumAndTitle(const std::string& strArtist, const std::string& strAlbum, const std::string& strTitle); ///////////////////////////////////////////////// @@ -196,10 +198,9 @@ bool AddAlbum(CAlbum& album); /*! \brief Update an album and all its nested entities (artists, songs, infoSongs, etc) \param album the album to update - \param OverrideTagData whether or not to replace the artist and song data, defaults to true. \return true or false */ - bool UpdateAlbum(CAlbum& album, bool OverrideTagData = true); + bool UpdateAlbum(CAlbum& album); /*! \brief Add an album and all its songs to the database \param album the album to add @@ -294,7 +295,7 @@ ///////////////////////////////////////////////// bool AddAlbumArtist(int idArtist, int idAlbum, std::string strArtist, std::string joinPhrase, bool featured, int iOrder); bool GetAlbumsByArtist(int idArtist, bool includeFeatured, std::vector& albums); - bool GetArtistsByAlbum(int idAlbum, CFileItem* item); + bool GetArtistsByAlbum(int idAlbum, bool includeFeatured, std::vector& artists); bool DeleteAlbumArtistsByAlbum(int idAlbum); bool AddSongArtist(int idArtist, int idSong, std::string strArtist, std::string joinPhrase, bool featured, int iOrder); @@ -355,9 +356,7 @@ bool GetSongsNav(const std::string& strBaseDir, CFileItemList& items, int idGenre, int idArtist,int idAlbum, const SortDescription &sortDescription = SortDescription()); bool GetSongsByYear(const std::string& baseDir, CFileItemList& items, int year); bool GetSongsByWhere(const std::string &baseDir, const Filter &filter, CFileItemList& items, const SortDescription &sortDescription = SortDescription()); - bool GetSongsFullByWhere(const std::string &baseDir, const Filter &filter, CFileItemList& items, const SortDescription &sortDescription = SortDescription(), bool artistData = false); bool GetAlbumsByWhere(const std::string &baseDir, const Filter &filter, CFileItemList &items, const SortDescription &sortDescription = SortDescription(), bool countOnly = false); - bool GetAlbumsByWhere(const std::string &baseDir, const Filter &filter, VECALBUMS& albums, int& total, const SortDescription &sortDescription = SortDescription(), bool countOnly = false); bool GetArtistsByWhere(const std::string& strBaseDir, const Filter &filter, CFileItemList& items, const SortDescription &sortDescription = SortDescription(), bool countOnly = false); bool GetRandomSong(CFileItem* item, int& idSong, const Filter &filter); int GetSongsCount(const Filter &filter = Filter()); @@ -377,6 +376,16 @@ bool ScraperInUse(const std::string &scraperID) const; ///////////////////////////////////////////////// + // Karaoke + ///////////////////////////////////////////////// + void AddKaraokeData(int idSong, int iKaraokeNumber); + bool GetSongByKaraokeNumber( int number, CSong& song ); + bool SetKaraokeSongDelay( int idSong, int delay ); + int GetKaraokeSongsCount(); + void ExportKaraokeInfo(const std::string &outFile, bool asHTML ); + void ImportKaraokeInfo(const std::string &inputFile ); + + ///////////////////////////////////////////////// // Filters ///////////////////////////////////////////////// bool GetItems(const std::string &strBaseDir, CFileItemList &items, const Filter &filter = Filter(), const SortDescription &sortDescription = SortDescription()); @@ -386,7 +395,7 @@ ///////////////////////////////////////////////// // XML ///////////////////////////////////////////////// - void ExportToXML(const std::string &xmlFile, bool singleFile = false, bool images=false, bool overwrite=false); + void ExportToXML(const std::string &xmlFile, bool singleFiles = false, bool images=false, bool overwrite=false); void ImportFromXML(const std::string &xmlFile); ///////////////////////////////////////////////// @@ -470,7 +479,7 @@ virtual void CreateTables(); virtual void CreateAnalytics(); - virtual int GetMinSchemaVersion() const { return 32; } + virtual int GetMinSchemaVersion() const { return 18; } virtual int GetSchemaVersion() const; const char *GetBaseDBName() const { return "MyMusic"; }; @@ -488,15 +497,8 @@ CAlbum GetAlbumFromDataset(dbiplus::Dataset* pDS, int offset = 0, bool imageURL = false); CAlbum GetAlbumFromDataset(const dbiplus::sql_record* const record, int offset = 0, bool imageURL = false); CArtistCredit GetArtistCreditFromDataset(const dbiplus::sql_record* const record, int offset = 0); - /*! \brief Updates the dateAdded field in the song table for the file - with the given songId and the given path based on the files modification date - \param songId id of the song in the song table - \param strFileNameAndPath path to the file - */ - void UpdateFileDateAdded(int songId, const std::string& strFileNameAndPath); void GetFileItemFromDataset(CFileItem* item, const CMusicDbUrl &baseUrl); void GetFileItemFromDataset(const dbiplus::sql_record* const record, CFileItem* item, const CMusicDbUrl &baseUrl); - void GetFileItemFromArtistCredits(VECARTISTCREDITS& artistCredits, CFileItem* item); CSong GetAlbumInfoSongFromDataset(const dbiplus::sql_record* const record, int offset = 0); bool CleanupSongs(); bool CleanupSongsByIds(const std::string &strSongIds); @@ -512,7 +514,7 @@ // Fields should be ordered as they // appear in the songview - static enum _SongFields + enum _SongFields { song_idSong=0, song_strArtists, @@ -527,22 +529,24 @@ song_iStartOffset, song_iEndOffset, song_lastplayed, - song_userrating, + song_rating, song_comment, song_idAlbum, song_strAlbum, song_strPath, + song_iKarNumber, + song_iKarDelay, + song_strKarEncoding, song_bCompilation, song_strAlbumArtists, song_strAlbumReleaseType, song_mood, - song_dateAdded, song_enumCount // end of the enum, do not add past here } SongFields; // Fields should be ordered as they // appear in the albumview - static enum _AlbumFields + enum _AlbumFields { album_idAlbum=0, album_strAlbum, @@ -561,12 +565,10 @@ album_bCompilation, album_iTimesPlayed, album_strReleaseType, - album_dtDateAdded, - album_dtLastPlayed, album_enumCount // end of the enum, do not add past here } AlbumFields; - static enum _ArtistCreditFields + enum _ArtistCreditFields { // used for GetAlbum to get the cascaded album/song artist credits artistCredit_idEntity = 0, // can be idSong or idAlbum depending on context @@ -579,7 +581,7 @@ artistCredit_enumCount } ArtistCreditFields; - static enum _ArtistFields + enum _ArtistFields { artist_idArtist=0, artist_strArtist, @@ -596,11 +598,10 @@ artist_strYearsActive, artist_strImage, artist_strFanart, - artist_dtDateAdded, artist_enumCount // end of the enum, do not add past here } ArtistFields; - static enum _AlbumInfoSongFields + enum _AlbumInfoSongFields { albumInfoSong_idAlbumInfoSong=0, albumInfoSong_idAlbumInfo, diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/MusicDbUrl.cpp kodi-15.2~git20151019.1039-final/xbmc/music/MusicDbUrl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/MusicDbUrl.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/MusicDbUrl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,6 +24,7 @@ #include "utils/StringUtils.h" #include "utils/Variant.h" +using namespace std; using namespace XFILE; using namespace XFILE::MUSICDATABASEDIRECTORY; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/MusicDbUrl.h kodi-15.2~git20151019.1039-final/xbmc/music/MusicDbUrl.h --- kodi-16.1~git20160425.1001-final/xbmc/music/MusicDbUrl.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/MusicDbUrl.h 2015-10-19 08:39:16.000000000 +0000 @@ -23,8 +23,6 @@ #include "DbUrl.h" -class CVariant; - class CMusicDbUrl : public CDbUrl { public: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/MusicInfoLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/music/MusicInfoLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/MusicInfoLoader.cpp 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/MusicInfoLoader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -34,14 +34,12 @@ #include "Album.h" #include "MusicThumbLoader.h" +using namespace std; using namespace XFILE; using namespace MUSIC_INFO; // HACK until we make this threadable - specify 1 thread only for now -CMusicInfoLoader::CMusicInfoLoader() - : CBackgroundInfoLoader() - , m_databaseHits{0} - , m_tagReads{0} +CMusicInfoLoader::CMusicInfoLoader() : CBackgroundInfoLoader() { m_mapFileItems = new CFileItemList; @@ -112,7 +110,7 @@ // we load up the actual tag for this file in order to // fetch the lyrics and add it to the current music info tag CFileItem tempItem(path, false); - std::unique_ptr pLoader (CMusicInfoTagLoaderFactory::CreateLoader(tempItem)); + unique_ptr pLoader (CMusicInfoTagLoaderFactory::CreateLoader(tempItem)); if (NULL != pLoader.get()) { CMusicInfoTag tag; @@ -193,11 +191,11 @@ pItem->SetArt("thumb", song.strThumb); } } - else if (CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICFILES_USETAGS) || pItem->IsCDDA()) + else if (CSettings::Get().GetBool("musicfiles.usetags") || pItem->IsCDDA()) { // Nothing found, load tag from file, // always try to load cddb info // get correct tag parser - std::unique_ptr pLoader (CMusicInfoTagLoaderFactory::CreateLoader(*pItem)); + unique_ptr pLoader (CMusicInfoTagLoaderFactory::CreateLoader(*pItem)); if (NULL != pLoader.get()) // get tag pLoader->Load(pItem->GetPath(), *pItem->GetMusicInfoTag()); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/MusicThumbLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/music/MusicThumbLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/MusicThumbLoader.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/MusicThumbLoader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,16 +19,14 @@ */ #include "MusicThumbLoader.h" - -#include - #include "FileItem.h" -#include "music/infoscanner/MusicInfoScanner.h" +#include "TextureDatabase.h" #include "music/tags/MusicInfoTag.h" #include "music/tags/MusicInfoTagLoaderFactory.h" -#include "TextureDatabase.h" +#include "music/infoscanner/MusicInfoScanner.h" #include "video/VideoThumbLoader.h" +using namespace std; using namespace MUSIC_INFO; CMusicThumbLoader::CMusicThumbLoader() : CThumbLoader() @@ -105,7 +103,7 @@ int idArtist = m_musicDatabase->GetArtistByName(artist); if (idArtist >= 0) { - std::string fanart = m_musicDatabase->GetArtForItem(idArtist, MediaTypeArtist, "fanart"); + string fanart = m_musicDatabase->GetArtForItem(idArtist, MediaTypeArtist, "fanart"); if (!fanart.empty()) { pItem->SetArt("artist.fanart", fanart); @@ -196,7 +194,7 @@ if (tag.GetDatabaseId() > -1 && !tag.GetType().empty()) { m_musicDatabase->Open(); - std::map artwork; + map artwork; if (m_musicDatabase->GetArtForItem(tag.GetDatabaseId(), tag.GetType(), artwork)) item.SetArt(artwork); else if (tag.GetType() == MediaTypeSong) @@ -210,13 +208,13 @@ if (i != m_albumArt.end()) { item.AppendArt(i->second, MediaTypeAlbum); - for (std::map::const_iterator j = i->second.begin(); j != i->second.end(); ++j) + for (map::const_iterator j = i->second.begin(); j != i->second.end(); ++j) item.SetArtFallback(j->first, "album." + j->first); } } if (tag.GetType() == MediaTypeSong || tag.GetType() == MediaTypeAlbum) { // fanart from the artist - std::string fanart = m_musicDatabase->GetArtistArtForItem(tag.GetDatabaseId(), tag.GetType(), "fanart"); + string fanart = m_musicDatabase->GetArtistArtForItem(tag.GetDatabaseId(), tag.GetType(), "fanart"); if (!fanart.empty()) { item.SetArt("artist.fanart", fanart); @@ -241,7 +239,7 @@ bool CMusicThumbLoader::GetEmbeddedThumb(const std::string &path, EmbeddedArt &art) { CFileItem item(path, false); - std::unique_ptr pLoader (CMusicInfoTagLoaderFactory::CreateLoader(item)); + unique_ptr pLoader (CMusicInfoTagLoaderFactory::CreateLoader(item)); CMusicInfoTag tag; if (NULL != pLoader.get()) pLoader->Load(path, tag, &art); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/Song.cpp kodi-15.2~git20151019.1039-final/xbmc/music/Song.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/Song.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/Song.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,10 +21,10 @@ #include "Song.h" #include "music/tags/MusicInfoTag.h" #include "utils/Variant.h" -#include "utils/StringUtils.h" #include "FileItem.h" #include "settings/AdvancedSettings.h" +using namespace std; using namespace MUSIC_INFO; CSong::CSong(CFileItem& item) @@ -34,9 +34,7 @@ tag.GetReleaseDate(stTime); strTitle = tag.GetTitle(); genre = tag.GetGenre(); - std::vector artist = tag.GetArtist(); - std::vector musicBrainArtistHints = tag.GetMusicBrainzArtistHints(); - strArtistDesc = tag.GetArtistString(); + artist = tag.GetArtist(); if (!tag.GetMusicBrainzArtistID().empty()) { // have musicbrainz artist info, so use it for (size_t i = 0; i < tag.GetMusicBrainzArtistID().size(); i++) @@ -44,13 +42,10 @@ std::string artistId = tag.GetMusicBrainzArtistID()[i]; std::string artistName; /* - We try and get the corresponding artist name from the hints list. - If the hints list is missing or the wrong length, it will try the artist list. + We try and get the corresponding artist name from the album artist tag. We match on the same index, and if that fails just use the first name we have. */ - if (i < musicBrainArtistHints.size()) - artistName = musicBrainArtistHints[i]; - else if (!artist.empty()) + if (!artist.empty()) artistName = (i < artist.size()) ? artist[i] : artist[0]; if (artistName.empty()) artistName = artistId; @@ -61,7 +56,7 @@ } else { // no musicbrainz info, so fill in directly - for (std::vector::const_iterator it = tag.GetArtist().begin(); it != tag.GetArtist().end(); ++it) + for (vector::const_iterator it = tag.GetArtist().begin(); it != tag.GetArtist().end(); ++it) { std::string strJoinPhrase = (it == --tag.GetArtist().end() ? "" : g_advancedSettings.m_musicItemSeparator); CArtistCredit artistCredit(*it, "", strJoinPhrase); @@ -69,24 +64,25 @@ } } strAlbum = tag.GetAlbum(); - m_albumArtist = tag.GetAlbumArtist(); + albumArtist = tag.GetAlbumArtist(); strMusicBrainzTrackID = tag.GetMusicBrainzTrackID(); strComment = tag.GetComment(); strCueSheet = tag.GetCueSheet(); strMood = tag.GetMood(); - rating = tag.GetUserrating(); + rating = tag.GetRating(); iYear = stTime.wYear; iTrack = tag.GetTrackAndDiscNumber(); iDuration = tag.GetDuration(); bCompilation = tag.GetCompilation(); embeddedArt = tag.GetCoverArtInfo(); strFileName = tag.GetURL().empty() ? item.GetPath() : tag.GetURL(); - dateAdded = tag.GetDateAdded(); strThumb = item.GetUserMusicThumb(true); iStartOffset = item.m_lStartOffset; iEndOffset = item.m_lEndOffset; idSong = -1; iTimesPlayed = 0; + iKaraokeNumber = 0; + iKaraokeDelay = 0; //! Karaoke song lyrics-music delay in 1/10 seconds. idAlbum = -1; } @@ -112,9 +108,9 @@ { value["filename"] = strFileName; value["title"] = strTitle; - value["artist"] = GetArtist(); + value["artist"] = artist; value["album"] = strAlbum; - value["albumartist"] = GetAlbumArtist(); + value["albumartist"] = albumArtist; value["genre"] = genre; value["duration"] = iDuration; value["track"] = iTrack; @@ -125,7 +121,7 @@ value["rating"] = rating; value["timesplayed"] = iTimesPlayed; value["lastplayed"] = lastPlayed.IsValid() ? lastPlayed.GetAsDBDateTime() : ""; - value["dateadded"] = dateAdded.IsValid() ? dateAdded.GetAsDBDateTime() : ""; + value["karaokenumber"] = (int64_t) iKaraokeNumber; value["albumid"] = idAlbum; } @@ -133,8 +129,9 @@ { strFileName.clear(); strTitle.clear(); + artist.clear(); strAlbum.clear(); - m_albumArtist.clear(); + albumArtist.clear(); genre.clear(); strThumb.clear(); strMusicBrainzTrackID.clear(); @@ -149,53 +146,13 @@ idSong = -1; iTimesPlayed = 0; lastPlayed.Reset(); - dateAdded.Reset(); + iKaraokeNumber = 0; + strKaraokeLyrEncoding.clear(); + iKaraokeDelay = 0; idAlbum = -1; bCompilation = false; embeddedArt.clear(); } -const std::vector CSong::GetArtist() const -{ - //Get artist names as vector from artist credits - std::vector songartists; - for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit) - { - songartists.push_back(artistCredit->GetArtist()); - } - return songartists; -} - -const std::vector CSong::GetMusicBrainzArtistID() const -{ - //Get artist MusicBrainz IDs as vector from artist credits - std::vector muisicBrainzID; - for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit) - { - muisicBrainzID.push_back(artistCredit->GetMusicBrainzArtistID()); - } - return muisicBrainzID; -} - -const std::string CSong::GetArtistString() const -{ - //Artist description may be different from the artists in artistcredits (see ARTISTS tag processing) - //but is takes precidence as a string because artistcredits is not always filled during processing - if (!strArtistDesc.empty()) - return strArtistDesc; - std::string artistString; - for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit) - artistString += artistCredit->GetArtist() + artistCredit->GetJoinPhrase(); - return artistString; -} - -const std::vector CSong::GetArtistIDArray() const -{ - // Get song artist IDs for json rpc - std::vector artistids; - for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit) - artistids.push_back(artistCredit->GetArtistId()); - return artistids; -} bool CSong::HasArt() const { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/Song.h kodi-15.2~git20151019.1039-final/xbmc/music/Song.h --- kodi-16.1~git20160425.1001-final/xbmc/music/Song.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/Song.h 2015-10-19 08:39:16.000000000 +0000 @@ -32,8 +32,6 @@ #include #include -class CVariant; - /*! \ingroup music \brief Class to store and read album information from CMusicDatabase @@ -72,47 +70,6 @@ return false; } - /*! \brief Get artist names from the vector of artistcredits objects - \return artist names as a vector of strings - */ - const std::vector GetArtist() const; - - /*! \brief Get artist MusicBrainz IDs from the vector of artistcredits objects - \return artist MusicBrainz IDs as a vector of strings - */ - const std::vector GetMusicBrainzArtistID() const; - - /*! \brief Get artist names from the artist decription string (if it exists) - or concatenated from the vector of artistcredits objects - \return artist names as a single string - */ - const std::string GetArtistString() const; - - /*! \brief Get song artist IDs (for json rpc) from the vector of artistcredits objects - \return album artist IDs as a vector of integers - */ - const std::vector GetArtistIDArray() const; - - /*! \brief Get album artist names associated with song from tag data - Note for initial album processing only, normalised album artist data belongs to album - and is stored in album artist credits - \return album artist names as a vector of strings - */ - const std::vector GetAlbumArtist() const { return m_albumArtist; } - - /*! \brief Set album artist vector. - Album artist is held local to song until album created for inital processing only. - Normalised album artist data belongs to album and is stored in album artist credits - \param album artist names as a vector of strings - */ - void SetAlbumArtist(const std::vector& albumartists) { m_albumArtist = albumartists; } - - /*! \brief Whether this song has any artists in artist credits vector - Tests if artist credits has been populated yet, during processing there can be - artists in the artist description but not yet in the credits - */ - bool HasArtistCredits() const { return !artistCredits.empty(); } - /*! \brief whether this song has art associated with it Tests both the strThumb and embeddedArt members. */ @@ -127,9 +84,10 @@ int idAlbum; std::string strFileName; std::string strTitle; - std::string strArtistDesc; + std::vector artist; VECARTISTCREDITS artistCredits; std::string strAlbum; + std::vector albumArtist; std::vector genre; std::string strThumb; MUSIC_INFO::EmbeddedArtInfo embeddedArt; @@ -143,15 +101,15 @@ int iYear; int iTimesPlayed; CDateTime lastPlayed; - CDateTime dateAdded; int iStartOffset; int iEndOffset; bool bCompilation; + // Karaoke-specific information + long iKaraokeNumber; //! Karaoke song number to "select by number". 0 for non-karaoke + std::string strKaraokeLyrEncoding; //! Karaoke song lyrics encoding if known. Empty if unknown. + int iKaraokeDelay; //! Karaoke song lyrics-music delay in 1/10 seconds. ReplayGain replayGain; - -private: - std::vector m_albumArtist; // Album artist from tag for album processing, no desc or MBID }; /*! diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/Makefile kodi-15.2~git20151019.1039-final/xbmc/music/tags/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/Makefile 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -3,7 +3,6 @@ MusicInfoTagLoaderCDDA.cpp \ MusicInfoTagLoaderDatabase.cpp \ MusicInfoTagLoaderFactory.cpp \ - MusicInfoTagLoaderFFmpeg.cpp \ MusicInfoTagLoaderShn.cpp \ TagLoaderTagLib.cpp \ TagLibVFSStream.cpp \ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTag.cpp kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTag.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTag.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTag.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,8 +18,6 @@ * */ -#include - #include "MusicInfoTag.h" #include "music/Album.h" #include "music/Artist.h" @@ -103,25 +101,20 @@ m_strURL = tag.m_strURL; m_artist = tag.m_artist; - m_strArtistDesc = tag.m_strArtistDesc; m_albumArtist = tag.m_albumArtist; - m_strAlbumArtistDesc = tag.m_strAlbumArtistDesc; m_strAlbum = tag.m_strAlbum; m_genre = tag.m_genre; m_strTitle = tag.m_strTitle; m_strMusicBrainzTrackID = tag.m_strMusicBrainzTrackID; m_musicBrainzArtistID = tag.m_musicBrainzArtistID; - m_musicBrainzArtistHints = tag.m_musicBrainzArtistHints; m_strMusicBrainzAlbumID = tag.m_strMusicBrainzAlbumID; m_musicBrainzAlbumArtistID = tag.m_musicBrainzAlbumArtistID; - m_musicBrainzAlbumArtistHints = tag.m_musicBrainzAlbumArtistHints; m_strMusicBrainzTRMID = tag.m_strMusicBrainzTRMID; m_strComment = tag.m_strComment; m_strMood = tag.m_strMood; m_strLyrics = tag.m_strLyrics; m_cuesheet = tag.m_cuesheet; m_lastPlayed = tag.m_lastPlayed; - m_dateAdded = tag.m_dateAdded; m_bCompilation = tag.m_bCompilation; m_iDuration = tag.m_iDuration; m_iTrack = tag.m_iTrack; @@ -190,16 +183,6 @@ return m_artist; } -const std::string CMusicInfoTag::GetArtistString() const -{ - if (!m_strArtistDesc.empty()) - return m_strArtistDesc; - else if (!m_artist.empty()) - return StringUtils::Join(m_artist, g_advancedSettings.m_musicItemSeparator); - else - return std::string(); -} - const std::string& CMusicInfoTag::GetAlbum() const { return m_strAlbum; @@ -215,17 +198,6 @@ return m_albumArtist; } -const std::string CMusicInfoTag::GetAlbumArtistString() const -{ - if (!m_strAlbumArtistDesc.empty()) - return m_strAlbumArtistDesc; - if (!m_albumArtist.empty()) - return StringUtils::Join(m_albumArtist, g_advancedSettings.m_musicItemSeparator); - else - return std::string(); -} - - const std::vector& CMusicInfoTag::GetGenre() const { return m_genre; @@ -276,7 +248,7 @@ return m_cuesheet; } -char CMusicInfoTag::GetUserrating() const +char CMusicInfoTag::GetRating() const { return m_rating; } @@ -296,11 +268,6 @@ return m_lastPlayed; } -const CDateTime &CMusicInfoTag::GetDateAdded() const -{ - return m_dateAdded; -} - bool CMusicInfoTag::GetCompilation() const { return m_bCompilation; @@ -334,29 +301,14 @@ void CMusicInfoTag::SetArtist(const std::string& strArtist) { if (!strArtist.empty()) - { - SetArtistDesc(strArtist); SetArtist(StringUtils::Split(strArtist, g_advancedSettings.m_musicItemSeparator)); - } else - { - m_strArtistDesc.clear(); m_artist.clear(); - } } -void CMusicInfoTag::SetArtist(const std::vector& artists, bool FillDesc /* = false*/) +void CMusicInfoTag::SetArtist(const std::vector& artists) { m_artist = artists; - if (m_strArtistDesc.empty() || FillDesc) - { - SetArtistDesc(StringUtils::Join(artists, g_advancedSettings.m_musicItemSeparator)); - } -} - -void CMusicInfoTag::SetArtistDesc(const std::string& strArtistDesc) -{ - m_strArtistDesc = strArtistDesc; } void CMusicInfoTag::SetAlbum(const std::string& strAlbum) @@ -372,27 +324,14 @@ void CMusicInfoTag::SetAlbumArtist(const std::string& strAlbumArtist) { if (!strAlbumArtist.empty()) - { - SetAlbumArtistDesc(strAlbumArtist); SetAlbumArtist(StringUtils::Split(strAlbumArtist, g_advancedSettings.m_musicItemSeparator)); - } else - { - m_strAlbumArtistDesc.clear(); m_albumArtist.clear(); - } } -void CMusicInfoTag::SetAlbumArtist(const std::vector& albumArtists, bool FillDesc /* = false*/) +void CMusicInfoTag::SetAlbumArtist(const std::vector& albumArtists) { m_albumArtist = albumArtists; - if (m_strAlbumArtistDesc.empty() || FillDesc) - SetAlbumArtistDesc(StringUtils::Join(albumArtists, g_advancedSettings.m_musicItemSeparator)); -} - -void CMusicInfoTag::SetAlbumArtistDesc(const std::string& strAlbumArtistDesc) -{ - m_strAlbumArtistDesc = strAlbumArtistDesc; } void CMusicInfoTag::SetGenre(const std::string& strGenre) @@ -465,14 +404,14 @@ m_strLyrics = lyrics; } -void CMusicInfoTag::SetUserrating(char rating) +void CMusicInfoTag::SetRating(char rating) { m_rating = rating; } void CMusicInfoTag::SetListeners(int listeners) { - m_listeners = std::max(listeners, 0); + m_listeners = listeners; } void CMusicInfoTag::SetPlayCount(int playcount) @@ -490,16 +429,6 @@ m_lastPlayed = lastplayed; } -void CMusicInfoTag::SetDateAdded(const std::string& dateAdded) -{ - m_dateAdded.SetFromDBDateTime(dateAdded); -} - -void CMusicInfoTag::SetDateAdded(const CDateTime& dateAdded) -{ - m_dateAdded = dateAdded; -} - void CMusicInfoTag::SetCompilation(bool compilation) { m_bCompilation = compilation; @@ -525,11 +454,6 @@ return m_musicBrainzArtistID; } -const std::vector& CMusicInfoTag::GetMusicBrainzArtistHints() const -{ - return m_musicBrainzArtistHints; -} - const std::string& CMusicInfoTag::GetMusicBrainzAlbumID() const { return m_strMusicBrainzAlbumID; @@ -540,11 +464,6 @@ return m_musicBrainzAlbumArtistID; } -const std::vector& CMusicInfoTag::GetMusicBrainzAlbumArtistHints() const -{ - return m_musicBrainzAlbumArtistHints; -} - const std::string& CMusicInfoTag::GetMusicBrainzTRMID() const { return m_strMusicBrainzTRMID; @@ -560,11 +479,6 @@ m_musicBrainzArtistID = musicBrainzArtistId; } -void CMusicInfoTag::SetMusicBrainzArtistHints(const std::vector& musicBrainzArtistHints) -{ - m_musicBrainzArtistHints = musicBrainzArtistHints; -} - void CMusicInfoTag::SetMusicBrainzAlbumID(const std::string& strAlbumID) { m_strMusicBrainzAlbumID=strAlbumID; @@ -575,12 +489,6 @@ m_musicBrainzAlbumArtistID = musicBrainzAlbumArtistId; } -void CMusicInfoTag::SetMusicBrainzAlbumArtistHints(const std::vector& musicBrainzAlbumArtistHints) -{ - m_musicBrainzAlbumArtistHints = musicBrainzAlbumArtistHints; -} - - void CMusicInfoTag::SetMusicBrainzTRMID(const std::string& strTRMID) { m_strMusicBrainzTRMID=strTRMID; @@ -606,10 +514,8 @@ SetArtist(artist.strArtist); SetAlbumArtist(artist.strArtist); SetMusicBrainzArtistID({ artist.strMusicBrainzArtistID }); - SetMusicBrainzAlbumArtistID({ artist.strMusicBrainzArtistID }); SetGenre(artist.genre); SetMood(StringUtils::Join(artist.moods, g_advancedSettings.m_musicItemSeparator)); - SetDateAdded(artist.dateAdded); SetDatabaseId(artist.idArtist, MediaTypeArtist); SetLoaded(); @@ -617,29 +523,23 @@ void CMusicInfoTag::SetAlbum(const CAlbum& album) { - //Set all artist infomation from album artist credits and artist description - SetArtistDesc(album.GetAlbumArtistString()); - SetArtist(album.GetAlbumArtist()); - SetMusicBrainzArtistID(album.GetMusicBrainzAlbumArtistID()); - SetAlbumArtistDesc(album.GetAlbumArtistString()); - SetAlbumArtist(album.GetAlbumArtist()); - SetMusicBrainzAlbumArtistID(album.GetMusicBrainzAlbumArtistID()); + SetArtist(album.artist); SetAlbumId(album.idAlbum); SetAlbum(album.strAlbum); SetTitle(album.strAlbum); + SetAlbumArtist(album.artist); SetMusicBrainzAlbumID(album.strMusicBrainzAlbumID); SetGenre(album.genre); SetMood(StringUtils::Join(album.moods, g_advancedSettings.m_musicItemSeparator)); - SetUserrating('0' + album.iRating); + SetRating('0' + album.iRating); SetCompilation(album.bCompilation); SYSTEMTIME stTime; stTime.wYear = album.iYear; SetReleaseDate(stTime); SetAlbumReleaseType(album.releaseType); - SetDateAdded(album.dateAdded); SetPlayCount(album.iTimesPlayed); + SetCompilation(album.bCompilation); SetDatabaseId(album.idAlbum, MediaTypeAlbum); - SetLastPlayed(album.lastPlayed); SetLoaded(); } @@ -648,34 +548,23 @@ { SetTitle(song.strTitle); SetGenre(song.genre); - /* Set all artist infomation from song artist credits and artist description. - During processing e.g. Cue Sheets, song may only have artist description string - rather than a fully populated artist credits vector. - */ - if (!song.HasArtistCredits()) - SetArtist(song.GetArtistString()); //Sets both artist description string and artist vector from string - else - { - SetArtistDesc(song.GetArtistString()); - SetArtist(song.GetArtist()); - SetMusicBrainzArtistID(song.GetMusicBrainzArtistID()); - } + SetArtist(song.artist); SetAlbum(song.strAlbum); - SetAlbumArtist(song.GetAlbumArtist()); //Only have album artist in song as vector, no desc or MBID + SetAlbumArtist(song.albumArtist); SetMusicBrainzTrackID(song.strMusicBrainzTrackID); SetComment(song.strComment); SetCueSheet(song.strCueSheet); SetPlayCount(song.iTimesPlayed); SetLastPlayed(song.lastPlayed); - SetDateAdded(song.dateAdded); SetCoverArtInfo(song.embeddedArt.size, song.embeddedArt.mime); - SetUserrating(song.rating); + SetRating(song.rating); SetURL(song.strFileName); SYSTEMTIME stTime; stTime.wYear = song.iYear; SetReleaseDate(stTime); - SetTrackAndDiscNumber(song.iTrack); + SetTrackNumber(song.iTrack); SetDuration(song.iDuration); + SetPlayCount(song.iTimesPlayed); SetMood(song.strMood); SetCompilation(song.bCompilation); SetAlbumId(song.idAlbum); @@ -697,18 +586,7 @@ value["artist"] = m_artist[0]; else value["artist"] = m_artist; - - // There are situations where the individual artist(s) are not queried from the song_artist and artist tables e.g. playlist, - // only artist description from song table. Since processing of the ARTISTS tag was added the individual artists may not always - // be accurately derrived by simply splitting the artist desc. Hence m_artist is only populated when the individual artists are - // queried, whereas GetArtistString() will always return the artist description. - // To avoid empty artist array in JSON, when m_artist is empty then an attempt is made to split the artist desc into artists. - // A longer term soltion would be to ensure that when individual artists are to be returned then the song_artist and artist tables - // are queried. - if (m_artist.empty()) - value["artist"] = StringUtils::Split(GetArtistString(), g_advancedSettings.m_musicItemSeparator); - value["displayartist"] = GetArtistString(); - value["displayalbumartist"] = GetAlbumArtistString(); + value["displayartist"] = StringUtils::Join(m_artist, g_advancedSettings.m_musicItemSeparator); value["album"] = m_strAlbum; value["albumartist"] = m_albumArtist; value["genre"] = m_genre; @@ -718,16 +596,15 @@ value["loaded"] = m_bLoaded; value["year"] = m_dwReleaseDate.wYear; value["musicbrainztrackid"] = m_strMusicBrainzTrackID; - value["musicbrainzartistid"] = m_musicBrainzArtistID; + value["musicbrainzartistid"] = StringUtils::Join(m_musicBrainzArtistID, " / "); value["musicbrainzalbumid"] = m_strMusicBrainzAlbumID; - value["musicbrainzalbumartistid"] = m_musicBrainzAlbumArtistID; + value["musicbrainzalbumartistid"] = StringUtils::Join(m_musicBrainzAlbumArtistID, " / "); value["musicbrainztrmid"] = m_strMusicBrainzTRMID; value["comment"] = m_strComment; - value["mood"] = StringUtils::Split(m_strMood, g_advancedSettings.m_musicItemSeparator); + value["mood"] = m_strMood; value["rating"] = (int)(m_rating - '0'); value["playcount"] = m_iTimesPlayed; value["lastplayed"] = m_lastPlayed.IsValid() ? m_lastPlayed.GetAsDBDateTime() : StringUtils::Empty; - value["dateadded"] = m_dateAdded.IsValid() ? m_dateAdded.GetAsDBDateTime() : StringUtils::Empty; value["lyrics"] = m_strLyrics; value["albumid"] = m_iAlbumId; value["compilationartist"] = m_bCompilation; @@ -750,9 +627,9 @@ sortable[FieldTitle] = title; break; } - case FieldArtist: sortable[FieldArtist] = m_strArtistDesc; break; + case FieldArtist: sortable[FieldArtist] = m_artist; break; case FieldAlbum: sortable[FieldAlbum] = m_strAlbum; break; - case FieldAlbumArtist: sortable[FieldAlbumArtist] = m_strAlbumArtistDesc; break; + case FieldAlbumArtist: sortable[FieldAlbumArtist] = m_albumArtist; break; case FieldGenre: sortable[FieldGenre] = m_genre; break; case FieldTime: sortable[FieldTime] = m_iDuration; break; case FieldTrackNumber: sortable[FieldTrackNumber] = m_iTrack; break; @@ -762,7 +639,6 @@ case FieldRating: sortable[FieldRating] = (float)(m_rating - '0'); break; case FieldPlaycount: sortable[FieldPlaycount] = m_iTimesPlayed; break; case FieldLastPlayed: sortable[FieldLastPlayed] = m_lastPlayed.IsValid() ? m_lastPlayed.GetAsDBDateTime() : StringUtils::Empty; break; - case FieldDateAdded: sortable[FieldDateAdded] = m_dateAdded.IsValid() ? m_dateAdded.GetAsDBDateTime() : StringUtils::Empty; break; case FieldListeners: sortable[FieldListeners] = m_listeners; break; case FieldId: sortable[FieldId] = (int64_t)m_iDbId; break; default: break; @@ -776,10 +652,8 @@ ar << m_strURL; ar << m_strTitle; ar << m_artist; - ar << m_strArtistDesc; ar << m_strAlbum; ar << m_albumArtist; - ar << m_strAlbumArtistDesc; ar << m_genre; ar << m_iDuration; ar << m_iTrack; @@ -791,7 +665,6 @@ ar << m_musicBrainzAlbumArtistID; ar << m_strMusicBrainzTRMID; ar << m_lastPlayed; - ar << m_dateAdded; ar << m_strComment; ar << m_strMood; ar << m_rating; @@ -811,10 +684,8 @@ ar >> m_strURL; ar >> m_strTitle; ar >> m_artist; - ar >> m_strArtistDesc; ar >> m_strAlbum; ar >> m_albumArtist; - ar >> m_strAlbumArtistDesc; ar >> m_genre; ar >> m_iDuration; ar >> m_iTrack; @@ -826,7 +697,6 @@ ar >> m_musicBrainzAlbumArtistID; ar >> m_strMusicBrainzTRMID; ar >> m_lastPlayed; - ar >> m_dateAdded; ar >> m_strComment; ar >> m_strMood; ar >> m_rating; @@ -863,7 +733,6 @@ m_iTrack = 0; m_bLoaded = false; m_lastPlayed.Reset(); - m_dateAdded.Reset(); m_bCompilation = false; m_strComment.clear(); m_strMood.clear(); @@ -877,7 +746,6 @@ m_coverArt.clear(); m_replayGain = ReplayGain(); m_albumReleaseType = CAlbum::Album; - m_listeners = 0; } void CMusicInfoTag::AppendArtist(const std::string &artist) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTag.h kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTag.h --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTag.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTag.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,6 @@ class CSong; class CArtist; -class CVariant; #include #include @@ -50,11 +49,9 @@ const std::string& GetTitle() const; const std::string& GetURL() const; const std::vector& GetArtist() const; - const std::string GetArtistString() const; const std::string& GetAlbum() const; int GetAlbumId() const; const std::vector& GetAlbumArtist() const; - const std::string GetAlbumArtistString() const; const std::vector& GetGenre() const; int GetTrackNumber() const; int GetDiscNumber() const; @@ -68,19 +65,16 @@ std::string GetYearString() const; const std::string& GetMusicBrainzTrackID() const; const std::vector& GetMusicBrainzArtistID() const; - const std::vector& GetMusicBrainzArtistHints() const; const std::string& GetMusicBrainzAlbumID() const; const std::vector& GetMusicBrainzAlbumArtistID() const; - const std::vector& GetMusicBrainzAlbumArtistHints() const; const std::string& GetMusicBrainzTRMID() const; const std::string& GetComment() const; const std::string& GetMood() const; const std::string& GetLyrics() const; const std::string& GetCueSheet() const; const CDateTime& GetLastPlayed() const; - const CDateTime& GetDateAdded() const; bool GetCompilation() const; - char GetUserrating() const; + char GetRating() const; int GetListeners() const; int GetPlayCount() const; const EmbeddedArtInfo &GetCoverArtInfo() const; @@ -90,13 +84,11 @@ void SetURL(const std::string& strURL); void SetTitle(const std::string& strTitle); void SetArtist(const std::string& strArtist); - void SetArtist(const std::vector& artists, bool FillDesc = false); - void SetArtistDesc(const std::string& strArtistDesc); + void SetArtist(const std::vector& artists); void SetAlbum(const std::string& strAlbum); void SetAlbumId(const int iAlbumId); void SetAlbumArtist(const std::string& strAlbumArtist); - void SetAlbumArtist(const std::vector& albumArtists, bool FillDesc = false); - void SetAlbumArtistDesc(const std::string& strAlbumArtistDesc); + void SetAlbumArtist(const std::vector& albumArtists); void SetGenre(const std::string& strGenre); void SetGenre(const std::vector& genres); void SetYear(int year); @@ -112,22 +104,18 @@ void SetSong(const CSong& song); void SetMusicBrainzTrackID(const std::string& strTrackID); void SetMusicBrainzArtistID(const std::vector& musicBrainzArtistId); - void SetMusicBrainzArtistHints(const std::vector& musicBrainzArtistHints); void SetMusicBrainzAlbumID(const std::string& strAlbumID); void SetMusicBrainzAlbumArtistID(const std::vector& musicBrainzAlbumArtistId); - void SetMusicBrainzAlbumArtistHints(const std::vector& musicBrainzAlbumArtistHints); void SetMusicBrainzTRMID(const std::string& strTRMID); void SetComment(const std::string& comment); void SetMood(const std::string& mood); void SetLyrics(const std::string& lyrics); void SetCueSheet(const std::string& cueSheet); - void SetUserrating(char rating); + void SetRating(char rating); void SetListeners(int listeners); void SetPlayCount(int playcount); void SetLastPlayed(const std::string& strLastPlayed); void SetLastPlayed(const CDateTime& strLastPlayed); - void SetDateAdded(const std::string& strDateAdded); - void SetDateAdded(const CDateTime& strDateAdded); void SetCompilation(bool compilation); void SetCoverArtInfo(size_t size, const std::string &mimeType); void SetReplayGain(const ReplayGain& aGain); @@ -166,24 +154,19 @@ std::string m_strURL; std::string m_strTitle; std::vector m_artist; - std::string m_strArtistDesc; std::string m_strAlbum; std::vector m_albumArtist; - std::string m_strAlbumArtistDesc; std::vector m_genre; std::string m_strMusicBrainzTrackID; std::vector m_musicBrainzArtistID; - std::vector m_musicBrainzArtistHints; std::string m_strMusicBrainzAlbumID; std::vector m_musicBrainzAlbumArtistID; - std::vector m_musicBrainzAlbumArtistHints; std::string m_strMusicBrainzTRMID; std::string m_strComment; std::string m_strMood; std::string m_strLyrics; std::string m_cuesheet; CDateTime m_lastPlayed; - CDateTime m_dateAdded; bool m_bCompilation; int m_iDuration; int m_iTrack; // consists of the disk number in the high 16 bits, the track number in the low 16bits diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTagLoaderCDDA.cpp kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTagLoaderCDDA.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTagLoaderCDDA.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTagLoaderCDDA.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -62,7 +62,7 @@ // Prepare cddb Xcddb cddb; - cddb.setCacheDir(CProfilesManager::GetInstance().GetCDDBFolder()); + cddb.setCacheDir(CProfilesManager::Get().GetCDDBFolder()); int iTrack = atoi(strFileName.substr(13, strFileName.size() - 13 - 5).c_str()); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTagLoaderFactory.cpp kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTagLoaderFactory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTagLoaderFactory.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTagLoaderFactory.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,6 @@ #include "MusicInfoTagLoaderCDDA.h" #include "MusicInfoTagLoaderShn.h" #include "MusicInfoTagLoaderDatabase.h" -#include "MusicInfoTagLoaderFFmpeg.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "FileItem.h" @@ -59,7 +58,7 @@ return NULL; VECADDONS codecs; - CAddonMgr::GetInstance().GetAddons(ADDON_AUDIODECODER, codecs); + CAddonMgr::Get().GetAddons(ADDON_AUDIODECODER, codecs); for (size_t i=0;i dec(std::static_pointer_cast(codecs[i])); @@ -101,8 +100,6 @@ CMusicInfoTagLoaderSHN *pTagLoader = new CMusicInfoTagLoaderSHN(); return (IMusicInfoTagLoader*)pTagLoader; } - else if (strExtension == "mka" || strExtension == "dsf") - return new CMusicInfoTagLoaderFFmpeg(); return NULL; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTagLoaderFFmpeg.cpp kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTagLoaderFFmpeg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTagLoaderFFmpeg.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTagLoaderFFmpeg.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "MusicInfoTagLoaderFFmpeg.h" -#include "MusicInfoTag.h" -#include "filesystem/File.h" -#include "cores/FFmpeg.h" -#include "utils/URIUtils.h" -#include "utils/StringUtils.h" - -using namespace MUSIC_INFO; -using namespace XFILE; - -static int vfs_file_read(void *h, uint8_t* buf, int size) -{ - CFile* pFile = static_cast(h); - return pFile->Read(buf, size); -} - -static int64_t vfs_file_seek(void *h, int64_t pos, int whence) -{ - CFile* pFile = static_cast(h); - if (whence == AVSEEK_SIZE) - return pFile->GetLength(); - else - return pFile->Seek(pos, whence & ~AVSEEK_FORCE); -} - -CMusicInfoTagLoaderFFmpeg::CMusicInfoTagLoaderFFmpeg(void) -{ -} - -CMusicInfoTagLoaderFFmpeg::~CMusicInfoTagLoaderFFmpeg() -{ -} - -bool CMusicInfoTagLoaderFFmpeg::Load(const std::string& strFileName, CMusicInfoTag& tag, EmbeddedArt *art) -{ - tag.SetLoaded(false); - - CFile file; - if (!file.Open(strFileName)) - return false; - - uint8_t* buffer = (uint8_t*)av_malloc(FFMPEG_FILE_BUFFER_SIZE); - AVIOContext* ioctx = avio_alloc_context(buffer, FFMPEG_FILE_BUFFER_SIZE, 0, - &file, vfs_file_read, NULL, - vfs_file_seek); - - AVFormatContext* fctx = avformat_alloc_context(); - fctx->pb = ioctx; - - if (file.IoControl(IOCTRL_SEEK_POSSIBLE, NULL) != 1) - ioctx->seekable = 0; - - ioctx->max_packet_size = FFMPEG_FILE_BUFFER_SIZE; - - AVInputFormat* iformat=NULL; - av_probe_input_buffer(ioctx, &iformat, strFileName.c_str(), NULL, 0, 0); - - if (avformat_open_input(&fctx, strFileName.c_str(), iformat, NULL) < 0) - { - if (fctx) - avformat_close_input(&fctx); - av_free(ioctx->buffer); - av_free(ioctx); - return false; - } - - AVDictionaryEntry* avtag=NULL; - while ((avtag = av_dict_get(fctx->metadata, "", avtag, AV_DICT_IGNORE_SUFFIX))) - { - if (StringUtils::EqualsNoCase(URIUtils::GetExtension(strFileName), ".mka") || - StringUtils::EqualsNoCase(URIUtils::GetExtension(strFileName), ".dsf")) - { - if (strcasecmp(avtag->key, "title") == 0) - tag.SetTitle(avtag->value); - else if (strcasecmp(avtag->key, "artist") == 0) - tag.SetArtist(avtag->value); - else if (strcasecmp(avtag->key, "album") == 0) - tag.SetAlbum(avtag->value); - else if (strcasecmp(avtag->key, "part_number") == 0 || - strcasecmp(avtag->key, "track") == 0) - tag.SetTrackNumber(strtol(avtag->value, NULL, 10)); - } - } - - if (!tag.GetTitle().empty()) - tag.SetLoaded(true); - - avformat_close_input(&fctx); - av_free(ioctx->buffer); - av_free(ioctx); - - return true; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTagLoaderFFmpeg.h kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTagLoaderFFmpeg.h --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/MusicInfoTagLoaderFFmpeg.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/MusicInfoTagLoaderFFmpeg.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "ImusicInfoTagLoader.h" - -namespace MUSIC_INFO -{ - class CMusicInfoTagLoaderFFmpeg: public IMusicInfoTagLoader - { - public: - CMusicInfoTagLoaderFFmpeg(void); - virtual ~CMusicInfoTagLoaderFFmpeg(); - - virtual bool Load(const std::string& strFileName, CMusicInfoTag& tag, EmbeddedArt *art = NULL); - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/TagLibVFSStream.cpp kodi-15.2~git20151019.1039-final/xbmc/music/tags/TagLibVFSStream.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/TagLibVFSStream.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/TagLibVFSStream.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,7 @@ using namespace XFILE; using namespace TagLib; using namespace MUSIC_INFO; +using namespace std; #ifdef TARGET_WINDOWS #pragma comment(lib, "tag.lib") @@ -34,7 +35,7 @@ * Construct a File object and opens the \a file. \a file should be a * be an XBMC Vfile. */ -TagLibVFSStream::TagLibVFSStream(const std::string& strFileName, bool readOnly) +TagLibVFSStream::TagLibVFSStream(const string& strFileName, bool readOnly) { m_bIsOpen = true; if (readOnly) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/TagLoaderTagLib.cpp kodi-15.2~git20151019.1039-final/xbmc/music/tags/TagLoaderTagLib.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/TagLoaderTagLib.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/TagLoaderTagLib.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,7 +25,6 @@ #include #include #include -#include #include #include @@ -50,6 +49,7 @@ #include "utils/Base64.h" #include "settings/AdvancedSettings.h" +using namespace std; using namespace TagLib; using namespace MUSIC_INFO; @@ -77,11 +77,12 @@ CTagLoaderTagLib::~CTagLoaderTagLib() { + } -static const std::vector StringListToVectorString(const StringList& stringList) +static const vector StringListToVectorString(const StringList& stringList) { - std::vector values; + vector values; for (StringList::ConstIterator it = stringList.begin(); it != stringList.end(); ++it) values.push_back(it->to8Bit(true)); return values; @@ -92,9 +93,173 @@ return Load(strFileName, tag, "", art); } +bool CTagLoaderTagLib::Load(const std::string& strFileName, CMusicInfoTag& tag, const std::string& fallbackFileExtension, MUSIC_INFO::EmbeddedArt *art /* = NULL */) +{ + std::string strExtension = URIUtils::GetExtension(strFileName); + StringUtils::ToLower(strExtension); + StringUtils::TrimLeft(strExtension, "."); + + if (strExtension.empty()) + { + strExtension = fallbackFileExtension; + if (strExtension.empty()) + return false; + StringUtils::ToLower(strExtension); + } + + TagLibVFSStream* stream = new TagLibVFSStream(strFileName, true); + if (!stream) + { + CLog::Log(LOGERROR, "could not create TagLib VFS stream for: %s", strFileName.c_str()); + return false; + } + + ID3v1::Tag::setStringHandler(&ID3v1StringHandler); + ID3v2::Tag::setLatin1StringHandler(&ID3v2StringHandler); + TagLib::File* file = NULL; + TagLib::APE::File* apeFile = NULL; + TagLib::ASF::File* asfFile = NULL; + TagLib::FLAC::File* flacFile = NULL; + TagLib::IT::File* itFile = NULL; + TagLib::Mod::File* modFile = NULL; + TagLib::MP4::File* mp4File = NULL; + TagLib::MPC::File* mpcFile = NULL; + TagLib::MPEG::File* mpegFile = NULL; + TagLib::Ogg::Vorbis::File* oggVorbisFile = NULL; + TagLib::Ogg::FLAC::File* oggFlacFile = NULL; + TagLib::S3M::File* s3mFile = NULL; + TagLib::TrueAudio::File* ttaFile = NULL; + TagLib::WavPack::File* wvFile = NULL; + TagLib::XM::File* xmFile = NULL; + TagLib::RIFF::WAV::File * wavFile = NULL; + TagLib::RIFF::AIFF::File * aiffFile = NULL; + + if (strExtension == "ape") + file = apeFile = new APE::File(stream); + else if (strExtension == "asf" || strExtension == "wmv" || strExtension == "wma") + file = asfFile = new ASF::File(stream); + else if (strExtension == "flac") + file = flacFile = new FLAC::File(stream, ID3v2::FrameFactory::instance()); + else if (strExtension == "it") + file = itFile = new IT::File(stream); + else if (strExtension == "mod" || strExtension == "module" || strExtension == "nst" || strExtension == "wow") + file = modFile = new Mod::File(stream); + else if (strExtension == "mp4" || strExtension == "m4a" || + strExtension == "m4r" || strExtension == "m4b" || + strExtension == "m4p" || strExtension == "3g2") + file = mp4File = new MP4::File(stream); + else if (strExtension == "mpc") + file = mpcFile = new MPC::File(stream); + else if (strExtension == "mp3" || strExtension == "aac") + file = mpegFile = new MPEG::File(stream, ID3v2::FrameFactory::instance()); + else if (strExtension == "s3m") + file = s3mFile = new S3M::File(stream); + else if (strExtension == "tta") + file = ttaFile = new TrueAudio::File(stream, ID3v2::FrameFactory::instance()); + else if (strExtension == "wv") + file = wvFile = new WavPack::File(stream); + else if (strExtension == "aif" || strExtension == "aiff") + file = aiffFile = new RIFF::AIFF::File(stream); + else if (strExtension == "wav") + file = wavFile = new RIFF::WAV::File(stream); + else if (strExtension == "xm") + file = xmFile = new XM::File(stream); + else if (strExtension == "ogg") + file = oggVorbisFile = new Ogg::Vorbis::File(stream); + else if (strExtension == "oga") // Leave this madness until last - oga container can have Vorbis or FLAC + { + file = oggFlacFile = new Ogg::FLAC::File(stream); + if (!file || !file->isValid()) + { + delete file; + oggFlacFile = NULL; + file = oggVorbisFile = new Ogg::Vorbis::File(stream); + } + } + + if (!file || !file->isOpen()) + { + delete file; + delete stream; + CLog::Log(LOGDEBUG, "file could not be opened for tag reading"); + return false; + } + + APE::Tag *ape = NULL; + ASF::Tag *asf = NULL; + MP4::Tag *mp4 = NULL; + ID3v1::Tag *id3v1 = NULL; + ID3v2::Tag *id3v2 = NULL; + Ogg::XiphComment *xiph = NULL; + Tag *generic = NULL; + + if (apeFile) + ape = apeFile->APETag(false); + else if (asfFile) + asf = asfFile->tag(); + else if (flacFile) + { + xiph = flacFile->xiphComment(false); + id3v2 = flacFile->ID3v2Tag(false); + } + else if (mp4File) + mp4 = mp4File->tag(); + else if (mpegFile) + { + id3v1 = mpegFile->ID3v1Tag(false); + id3v2 = mpegFile->ID3v2Tag(false); + ape = mpegFile->APETag(false); + } + else if (oggFlacFile) + xiph = dynamic_cast(oggFlacFile->tag()); + else if (oggVorbisFile) + xiph = dynamic_cast(oggVorbisFile->tag()); + else if (ttaFile) + id3v2 = ttaFile->ID3v2Tag(false); + else if (aiffFile) + id3v2 = aiffFile->tag(); + else if (wavFile) + id3v2 = wavFile->tag(); + else if (wvFile) + ape = wvFile->APETag(false); + else if (mpcFile) + ape = mpcFile->APETag(false); + else // This is a catch all to get generic information for other files types (s3m, xm, it, mod, etc) + generic = file->tag(); + + if (file->audioProperties()) + tag.SetDuration(file->audioProperties()->length()); + + if (asf) + ParseASF(asf, art, tag); + if (id3v1) + ParseID3v1Tag(id3v1, art, tag); + if (id3v2) + ParseID3v2Tag(id3v2, art, tag); + if (generic) + ParseGenericTag(generic, art, tag); + if (mp4) + ParseMP4Tag(mp4, art, tag); + if (xiph) // xiph tags override id3v2 tags in badly tagged FLACs + ParseXiphComment(xiph, art, tag); + if (ape && (!id3v2 || g_advancedSettings.m_prioritiseAPEv2tags)) // ape tags override id3v2 if we're prioritising them + ParseAPETag(ape, art, tag); + + // art for flac files is outside the tag + if (flacFile) + SetFlacArt(flacFile, art, tag); + + if (!tag.GetTitle().empty() || !tag.GetArtist().empty() || !tag.GetAlbum().empty()) + tag.SetLoaded(); + tag.SetURL(strFileName); + + delete file; + delete stream; + + return true; +} -template<> -bool CTagLoaderTagLib::ParseTag(ASF::Tag *asf, EmbeddedArt *art, CMusicInfoTag& tag) +bool CTagLoaderTagLib::ParseASF(ASF::Tag *asf, EmbeddedArt *art, CMusicInfoTag& tag) { if (!asf) return false; @@ -170,14 +335,12 @@ if (tag.GetArtist().empty()) tag.SetArtist(asf->artist().toCString(true)); - if (asf->comment() != String::null) - tag.SetComment(asf->comment().toCString(true)); tag.SetReplayGain(replayGainInfo); tag.SetLoaded(true); return true; } -char CTagLoaderTagLib::POPMtoXBMC(int popm) +char POPMtoXBMC(int popm) { // Ratings: // FROM: http://thiagoarrais.com/repos/banshee/src/Core/Banshee.Core/Banshee.Streaming/StreamRatingTagger.cs @@ -198,8 +361,7 @@ return '5'; } -template<> -bool CTagLoaderTagLib::ParseTag(ID3v1::Tag *id3v1, EmbeddedArt *art, CMusicInfoTag& tag) +bool CTagLoaderTagLib::ParseID3v1Tag(ID3v1::Tag *id3v1, EmbeddedArt *art, CMusicInfoTag& tag) { if (!id3v1) return false; tag.SetTitle(id3v1->title().to8Bit(true)); @@ -212,20 +374,17 @@ return true; } -template<> -bool CTagLoaderTagLib::ParseTag(ID3v2::Tag *id3v2, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag) +bool CTagLoaderTagLib::ParseID3v2Tag(ID3v2::Tag *id3v2, EmbeddedArt *art, CMusicInfoTag& tag) { + // tag.SetURL(strFile); if (!id3v2) return false; + ReplayGain replayGainInfo; ID3v2::AttachedPictureFrame *pictures[3] = {}; const ID3v2::FrameListMap& frameListMap = id3v2->frameListMap(); for (ID3v2::FrameListMap::ConstIterator it = frameListMap.begin(); it != frameListMap.end(); ++it) { - // It is possible that the taglist is empty. In that case no useable values can be extracted. - // and we should skip the tag. - if (it->second.isEmpty()) continue; - if (it->first == "TPE1") SetArtist(tag, GetID3v2StringList(it->second)); else if (it->first == "TALB") tag.SetAlbum(it->second.front()->toString().to8Bit(true)); else if (it->first == "TPE2") SetAlbumArtist(tag, GetID3v2StringList(it->second)); @@ -247,7 +406,7 @@ for (ID3v2::FrameList::ConstIterator lt = it->second.begin(); lt != it->second.end(); ++lt) { ID3v2::UnsynchronizedLyricsFrame *lyricsFrame = dynamic_cast (*lt); - if (lyricsFrame) + if (lyricsFrame) tag.SetLyrics(lyricsFrame->text().to8Bit(true)); } else if (it->first == "COMM") @@ -264,10 +423,9 @@ { ID3v2::UserTextIdentificationFrame *frame = dynamic_cast (*ut); if (!frame) continue; - + // First field is the same as the description - StringList stringList = frame->fieldList(); - if (stringList.size() == 1) continue; + StringList stringList = frame->fieldList(); stringList.erase(stringList.begin()); String desc = frame->description().upper(); if (desc == "MUSICBRAINZ ARTIST ID") @@ -286,12 +444,10 @@ replayGainInfo.ParsePeak(ReplayGain::TRACK, stringList.front().toCString(true)); else if (desc == "REPLAYGAIN_ALBUM_PEAK") replayGainInfo.ParsePeak(ReplayGain::ALBUM, stringList.front().toCString(true)); - else if (desc == "ALBUMARTIST" || desc == "ALBUM ARTIST") + else if (desc == "ALBUMARTIST") + SetAlbumArtist(tag, StringListToVectorString(stringList)); + else if (desc == "ALBUM ARTIST") SetAlbumArtist(tag, StringListToVectorString(stringList)); - else if (desc == "ARTISTS") - SetArtistHints(tag, StringListToVectorString(stringList)); - else if (desc == "ALBUMARTISTS" || desc == "ALBUM ARTISTS") - SetAlbumArtistHints(tag, StringListToVectorString(stringList)); else if (desc == "MOOD") tag.SetMood(stringList.front().to8Bit(true)); else if (g_advancedSettings.m_logLevel == LOG_LEVEL_MAX) @@ -318,7 +474,7 @@ { ID3v2::AttachedPictureFrame *pictureFrame = dynamic_cast (*pi); if (!pictureFrame) continue; - + if (pictureFrame->type() == ID3v2::AttachedPictureFrame::FrontCover) pictures[0] = pictureFrame; else if (pictureFrame->type() == ID3v2::AttachedPictureFrame::Other) pictures[1] = pictureFrame; else if (pi == it->second.begin()) pictures[2] = pictureFrame; @@ -329,11 +485,11 @@ { ID3v2::PopularimeterFrame *popFrame = dynamic_cast (*ct); if (!popFrame) continue; - + // @xbmc.org ratings trump others (of course) if (popFrame->email() == "ratings@xbmc.org") - tag.SetUserrating(popFrame->rating() / 51 + '0'); - else if (tag.GetUserrating() == '0') + tag.SetRating(popFrame->rating() / 51 + '0'); + else if (tag.GetRating() == '0') { if (popFrame->email() != "Windows Media Player 9 Series" && popFrame->email() != "Banshee" && @@ -341,7 +497,7 @@ popFrame->email() != "quodlibet@lists.sacredchao.net" && popFrame->email() != "rating@winamp.com") CLog::Log(LOGDEBUG, "unrecognized ratings schema detected: %s", popFrame->email().toCString(true)); - tag.SetUserrating(POPMtoXBMC(popFrame->rating())); + tag.SetRating(POPMtoXBMC(popFrame->rating())); } } else if (g_advancedSettings.m_logLevel == LOG_LEVEL_MAX) @@ -352,26 +508,21 @@ for (int i = 0; i < 3; ++i) if (pictures[i]) { - std::string mime = pictures[i]->mimeType().to8Bit(true); + string mime = pictures[i]->mimeType().to8Bit(true); TagLib::uint size = pictures[i]->picture().size(); tag.SetCoverArtInfo(size, mime); if (art) art->set((const uint8_t*)pictures[i]->picture().data(), size, mime); - + // Stop after we find the first picture for now. break; } - - if (id3v2->comment() != String::null) - tag.SetComment(id3v2->comment().toCString(true)); - tag.SetReplayGain(replayGainInfo); return true; } -template<> -bool CTagLoaderTagLib::ParseTag(APE::Tag *ape, EmbeddedArt *art, CMusicInfoTag& tag) +bool CTagLoaderTagLib::ParseAPETag(APE::Tag *ape, EmbeddedArt *art, CMusicInfoTag& tag) { if (!ape) return false; @@ -382,12 +533,8 @@ { if (it->first == "ARTIST") SetArtist(tag, StringListToVectorString(it->second.toStringList())); - else if (it->first == "ARTISTS") - SetArtistHints(tag, StringListToVectorString(it->second.toStringList())); - else if (it->first == "ALBUMARTIST" || it->first == "ALBUM ARTIST") + else if (it->first == "ALBUM ARTIST" || it->first == "ALBUMARTIST") SetAlbumArtist(tag, StringListToVectorString(it->second.toStringList())); - else if (it->first == "ALBUMARTISTS" || it->first == "ALBUM ARTISTS") - SetAlbumArtistHints(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "ALBUM") tag.SetAlbum(it->second.toString().to8Bit(true)); else if (it->first == "TITLE") @@ -400,8 +547,6 @@ tag.SetYear(it->second.toString().toInt()); else if (it->first == "GENRE") SetGenre(tag, StringListToVectorString(it->second.toStringList())); - else if (it->first == "MOOD") - tag.SetMood(it->second.toString().to8Bit(true)); else if (it->first == "COMMENT") tag.SetComment(it->second.toString().to8Bit(true)); else if (it->first == "CUESHEET") @@ -438,8 +583,7 @@ return true; } -template<> -bool CTagLoaderTagLib::ParseTag(Ogg::XiphComment *xiph, EmbeddedArt *art, CMusicInfoTag& tag) +bool CTagLoaderTagLib::ParseXiphComment(Ogg::XiphComment *xiph, EmbeddedArt *art, CMusicInfoTag& tag) { if (!xiph) return false; @@ -452,12 +596,10 @@ { if (it->first == "ARTIST") SetArtist(tag, StringListToVectorString(it->second)); - else if (it->first == "ARTISTS") - SetArtistHints(tag, StringListToVectorString(it->second)); - else if (it->first == "ALBUMARTIST" || it->first == "ALBUM ARTIST") + else if (it->first == "ALBUMARTIST") + SetAlbumArtist(tag, StringListToVectorString(it->second)); + else if (it->first == "ALBUM ARTIST") SetAlbumArtist(tag, StringListToVectorString(it->second)); - else if (it->first == "ALBUMARTISTS" || it->first == "ALBUM ARTISTS") - SetAlbumArtistHints(tag, StringListToVectorString(it->second)); else if (it->first == "ALBUM") tag.SetAlbum(it->second.front().to8Bit(true)); else if (it->first == "TITLE") @@ -472,8 +614,6 @@ tag.SetYear(it->second.front().toInt()); else if (it->first == "GENRE") SetGenre(tag, StringListToVectorString(it->second)); - else if (it->first == "MOOD") - tag.SetMood(it->second.front().to8Bit(true)); else if (it->first == "COMMENT") tag.SetComment(it->second.front().to8Bit(true)); else if (it->first == "CUESHEET") @@ -513,7 +653,7 @@ // So, that's what we'll support for now. int iRating = it->second.front().toInt(); if (iRating > 0 && iRating <= 100) - tag.SetUserrating((iRating / 20) + '0'); + tag.SetRating((iRating / 20) + '0'); } else if (it->first == "METADATA_BLOCK_PICTURE") { @@ -524,7 +664,7 @@ if (pictureFrame->type() == FLAC::Picture::FrontCover) pictures[0].parse(bv); else if (pictureFrame->type() == FLAC::Picture::Other) pictures[1].parse(bv); - + delete pictureFrame; } else if (it->first == "COVERART") @@ -549,7 +689,7 @@ for (int i = 0; i < 3; ++i) if (pictures[i].data().size()) { - std::string mime = pictures[i].mimeType().toCString(); + string mime = pictures[i].mimeType().toCString(); if (mime.compare(0, 6, "image/") != 0) continue; TagLib::uint size = pictures[i].data().size(); @@ -560,15 +700,11 @@ break; } - if (xiph->comment() != String::null) - tag.SetComment(xiph->comment().toCString(true)); - tag.SetReplayGain(replayGainInfo); return true; } -template<> -bool CTagLoaderTagLib::ParseTag(MP4::Tag *mp4, EmbeddedArt *art, CMusicInfoTag& tag) +bool CTagLoaderTagLib::ParseMP4Tag(MP4::Tag *mp4, EmbeddedArt *art, CMusicInfoTag& tag) { if (!mp4) return false; @@ -581,18 +717,12 @@ tag.SetTitle(it->second.toStringList().front().to8Bit(true)); else if (it->first == "\251ART") SetArtist(tag, StringListToVectorString(it->second.toStringList())); - else if (it->first == "----:com.apple.iTunes:ARTISTS") - SetArtistHints(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "\251alb") tag.SetAlbum(it->second.toStringList().front().to8Bit(true)); else if (it->first == "aART") SetAlbumArtist(tag, StringListToVectorString(it->second.toStringList())); - else if (it->first == "----:com.apple.iTunes:ALBUMARTISTS") - SetAlbumArtistHints(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "\251gen") SetGenre(tag, StringListToVectorString(it->second.toStringList())); - else if (it->first == "----:com.apple.iTunes:MOOD") - tag.SetMood(it->second.toStringList().front().to8Bit(true)); else if (it->first == "\251cmt") tag.SetComment(it->second.toStringList().front().to8Bit(true)); else if (it->first == "cpil") @@ -626,7 +756,7 @@ MP4::CoverArtList coverArtList = it->second.toCoverArtList(); for (MP4::CoverArtList::ConstIterator pt = coverArtList.begin(); pt != coverArtList.end(); ++pt) { - std::string mime; + string mime; switch (pt->format()) { case MP4::CoverArt::PNG: @@ -648,15 +778,11 @@ } } - if (mp4->comment() != String::null) - tag.SetComment(mp4->comment().toCString(true)); - tag.SetReplayGain(replayGainInfo); return true; } -template<> -bool CTagLoaderTagLib::ParseTag(Tag *generic, EmbeddedArt *art, CMusicInfoTag& tag) +bool CTagLoaderTagLib::ParseGenericTag(Tag *generic, EmbeddedArt *art, CMusicInfoTag& tag) { if (!generic) return false; @@ -707,39 +833,28 @@ } } -const std::vector CTagLoaderTagLib::GetASFStringList(const List& list) +const vector CTagLoaderTagLib::GetASFStringList(const List& list) { - std::vector values; + vector values; for (List::ConstIterator at = list.begin(); at != list.end(); ++at) values.push_back(at->toString().to8Bit(true)); return values; } -const std::vector CTagLoaderTagLib::GetID3v2StringList(const ID3v2::FrameList& frameList) +const vector CTagLoaderTagLib::GetID3v2StringList(const ID3v2::FrameList& frameList) const { const ID3v2::TextIdentificationFrame *frame = dynamic_cast(frameList.front()); if (frame) return StringListToVectorString(frame->fieldList()); - return std::vector(); + return vector(); } - -void CTagLoaderTagLib::SetArtist(CMusicInfoTag &tag, const std::vector &values) +void CTagLoaderTagLib::SetArtist(CMusicInfoTag &tag, const vector &values) { if (values.size() == 1) tag.SetArtist(values[0]); else - // Fill both artist vector and artist desc from tag value. - // Note desc may not be empty as it could have been set by previous parsing of ID3v2 before APE - tag.SetArtist(values, true); -} - -void CTagLoaderTagLib::SetArtistHints(CMusicInfoTag &tag, const std::vector &values) -{ - if (values.size() == 1) - tag.SetMusicBrainzArtistHints(StringUtils::Split(values[0], g_advancedSettings.m_musicItemSeparator)); - else - tag.SetMusicBrainzArtistHints(values); + tag.SetArtist(values); } const std::vector CTagLoaderTagLib::SplitMBID(const std::vector &values) @@ -762,34 +877,24 @@ return ret; } -void CTagLoaderTagLib::SetAlbumArtist(CMusicInfoTag &tag, const std::vector &values) +void CTagLoaderTagLib::SetAlbumArtist(CMusicInfoTag &tag, const vector &values) { if (values.size() == 1) tag.SetAlbumArtist(values[0]); else - // Fill both artist vector and artist desc from tag value. - // Note desc may not be empty as it could have been set by previous parsing of ID3v2 before APE - tag.SetAlbumArtist(values, true); + tag.SetAlbumArtist(values); } -void CTagLoaderTagLib::SetAlbumArtistHints(CMusicInfoTag &tag, const std::vector &values) -{ - if (values.size() == 1) - tag.SetMusicBrainzAlbumArtistHints(StringUtils::Split(values[0], g_advancedSettings.m_musicItemSeparator)); - else - tag.SetMusicBrainzAlbumArtistHints(values); -} - -void CTagLoaderTagLib::SetGenre(CMusicInfoTag &tag, const std::vector &values) +void CTagLoaderTagLib::SetGenre(CMusicInfoTag &tag, const vector &values) { /* TagLib doesn't resolve ID3v1 genre numbers in the case were only a number is specified, thus this workaround. */ - std::vector genres; - for (std::vector::const_iterator i = values.begin(); i != values.end(); ++i) + vector genres; + for (vector::const_iterator i = values.begin(); i != values.end(); ++i) { - std::string genre = *i; + string genre = *i; if (StringUtils::IsNaturalNumber(genre)) { int number = strtol(i->c_str(), NULL, 10); @@ -803,179 +908,3 @@ else tag.SetGenre(genres); } - -bool CTagLoaderTagLib::Load(const std::string& strFileName, CMusicInfoTag& tag, const std::string& fallbackFileExtension, MUSIC_INFO::EmbeddedArt *art /* = NULL */) -{ - std::string strExtension = URIUtils::GetExtension(strFileName); - StringUtils::TrimLeft(strExtension, "."); - - if (strExtension.empty()) - { - strExtension = fallbackFileExtension; - if (strExtension.empty()) - return false; - } - - StringUtils::ToLower(strExtension); - TagLibVFSStream* stream = new TagLibVFSStream(strFileName, true); - if (!stream) - { - CLog::Log(LOGERROR, "could not create TagLib VFS stream for: %s", strFileName.c_str()); - return false; - } - - ID3v1::Tag::setStringHandler(&ID3v1StringHandler); - ID3v2::Tag::setLatin1StringHandler(&ID3v2StringHandler); - TagLib::File* file = NULL; - TagLib::APE::File* apeFile = NULL; - TagLib::ASF::File* asfFile = NULL; - TagLib::FLAC::File* flacFile = NULL; - TagLib::IT::File* itFile = NULL; - TagLib::Mod::File* modFile = NULL; - TagLib::MP4::File* mp4File = NULL; - TagLib::MPC::File* mpcFile = NULL; - TagLib::MPEG::File* mpegFile = NULL; - TagLib::Ogg::Vorbis::File* oggVorbisFile = NULL; - TagLib::Ogg::FLAC::File* oggFlacFile = NULL; - TagLib::S3M::File* s3mFile = NULL; - TagLib::TrueAudio::File* ttaFile = NULL; - TagLib::WavPack::File* wvFile = NULL; - TagLib::XM::File* xmFile = NULL; - TagLib::RIFF::WAV::File * wavFile = NULL; - TagLib::RIFF::AIFF::File * aiffFile = NULL; - - try - { - if (strExtension == "ape") - file = apeFile = new APE::File(stream); - else if (strExtension == "asf" || strExtension == "wmv" || strExtension == "wma") - file = asfFile = new ASF::File(stream); - else if (strExtension == "flac") - file = flacFile = new FLAC::File(stream, ID3v2::FrameFactory::instance()); - else if (strExtension == "it") - file = itFile = new IT::File(stream); - else if (strExtension == "mod" || strExtension == "module" || strExtension == "nst" || strExtension == "wow") - file = modFile = new Mod::File(stream); - else if (strExtension == "mp4" || strExtension == "m4a" || - strExtension == "m4r" || strExtension == "m4b" || - strExtension == "m4p" || strExtension == "3g2") - file = mp4File = new MP4::File(stream); - else if (strExtension == "mpc") - file = mpcFile = new MPC::File(stream); - else if (strExtension == "mp3" || strExtension == "aac") - file = mpegFile = new MPEG::File(stream, ID3v2::FrameFactory::instance()); - else if (strExtension == "s3m") - file = s3mFile = new S3M::File(stream); - else if (strExtension == "tta") - file = ttaFile = new TrueAudio::File(stream, ID3v2::FrameFactory::instance()); - else if (strExtension == "wv") - file = wvFile = new WavPack::File(stream); - else if (strExtension == "aif" || strExtension == "aiff") - file = aiffFile = new RIFF::AIFF::File(stream); - else if (strExtension == "wav") - file = wavFile = new RIFF::WAV::File(stream); - else if (strExtension == "xm") - file = xmFile = new XM::File(stream); - else if (strExtension == "ogg") - file = oggVorbisFile = new Ogg::Vorbis::File(stream); - else if (strExtension == "oga") // Leave this madness until last - oga container can have Vorbis or FLAC - { - file = oggFlacFile = new Ogg::FLAC::File(stream); - if (!file || !file->isValid()) - { - delete file; - oggFlacFile = NULL; - file = oggVorbisFile = new Ogg::Vorbis::File(stream); - } - } - } - catch (const std::exception& ex) - { - CLog::Log(LOGERROR, "Taglib exception: %s", ex.what()); - } - - if (!file || !file->isOpen()) - { - delete file; - delete stream; - CLog::Log(LOGDEBUG, "file %s could not be opened for tag reading", strFileName.c_str()); - return false; - } - - APE::Tag *ape = NULL; - ASF::Tag *asf = NULL; - MP4::Tag *mp4 = NULL; - ID3v1::Tag *id3v1 = NULL; - ID3v2::Tag *id3v2 = NULL; - Ogg::XiphComment *xiph = NULL; - Tag *generic = NULL; - - if (apeFile) - ape = apeFile->APETag(false); - else if (asfFile) - asf = asfFile->tag(); - else if (flacFile) - { - xiph = flacFile->xiphComment(false); - id3v2 = flacFile->ID3v2Tag(false); - } - else if (mp4File) - mp4 = mp4File->tag(); - else if (mpegFile) - { - id3v1 = mpegFile->ID3v1Tag(false); - id3v2 = mpegFile->ID3v2Tag(false); - ape = mpegFile->APETag(false); - } - else if (oggFlacFile) - xiph = dynamic_cast(oggFlacFile->tag()); - else if (oggVorbisFile) - xiph = dynamic_cast(oggVorbisFile->tag()); - else if (ttaFile) - id3v2 = ttaFile->ID3v2Tag(false); - else if (aiffFile) - id3v2 = aiffFile->tag(); - else if (wavFile) -#if TAGLIB_MAJOR_VERSION > 1 || TAGLIB_MINOR_VERSION > 8 - id3v2 = wavFile->ID3v2Tag(); -#else - id3v2 = wavFile->tag(); -#endif - else if (wvFile) - ape = wvFile->APETag(false); - else if (mpcFile) - ape = mpcFile->APETag(false); - else // This is a catch all to get generic information for other files types (s3m, xm, it, mod, etc) - generic = file->tag(); - - if (file->audioProperties()) - tag.SetDuration(file->audioProperties()->length()); - - if (asf) - ParseTag(asf, art, tag); - if (id3v1) - ParseTag(id3v1, art, tag); - if (id3v2) - ParseTag(id3v2, art, tag); - if (generic) - ParseTag(generic, art, tag); - if (mp4) - ParseTag(mp4, art, tag); - if (xiph) // xiph tags override id3v2 tags in badly tagged FLACs - ParseTag(xiph, art, tag); - if (ape && (!id3v2 || g_advancedSettings.m_prioritiseAPEv2tags)) // ape tags override id3v2 if we're prioritising them - ParseTag(ape, art, tag); - - // art for flac files is outside the tag - if (flacFile) - SetFlacArt(flacFile, art, tag); - - if (!tag.GetTitle().empty() || !tag.GetArtist().empty() || !tag.GetAlbum().empty()) - tag.SetLoaded(); - tag.SetURL(strFileName); - - delete file; - delete stream; - - return true; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/TagLoaderTagLib.h kodi-15.2~git20151019.1039-final/xbmc/music/tags/TagLoaderTagLib.h --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/TagLoaderTagLib.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/TagLoaderTagLib.h 2015-06-14 19:32:50.000000000 +0000 @@ -56,23 +56,24 @@ CTagLoaderTagLib(); virtual ~CTagLoaderTagLib(); virtual bool Load(const std::string& strFileName, MUSIC_INFO::CMusicInfoTag& tag, MUSIC_INFO::EmbeddedArt *art = NULL); - bool Load(const std::string& strFileName, MUSIC_INFO::CMusicInfoTag& tag, const std::string& fallbackFileExtension, MUSIC_INFO::EmbeddedArt *art = NULL); - static const std::vector SplitMBID(const std::vector &values); -protected: - static void SetArtist(MUSIC_INFO::CMusicInfoTag &tag, const std::vector &values); - static void SetArtistHints(MUSIC_INFO::CMusicInfoTag &tag, const std::vector &values); - static void SetAlbumArtist(MUSIC_INFO::CMusicInfoTag &tag, const std::vector &values); - static void SetAlbumArtistHints(MUSIC_INFO::CMusicInfoTag &tag, const std::vector &values); - static void SetGenre(MUSIC_INFO::CMusicInfoTag &tag, const std::vector &values); - static char POPMtoXBMC(int popm); + bool Load(const std::string& strFileName, MUSIC_INFO::CMusicInfoTag& tag, const std::string& fallbackFileExtension, MUSIC_INFO::EmbeddedArt *art = NULL); -template - static bool ParseTag(T *tag, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& infoTag); + const std::vector SplitMBID(const std::vector &values); private: bool Open(const std::string& strFileName, bool readOnly); - static const std::vector GetASFStringList(const TagLib::List& list); - static const std::vector GetID3v2StringList(const TagLib::ID3v2::FrameList& frameList); + const std::vector GetASFStringList(const TagLib::List& list); + const std::vector GetID3v2StringList(const TagLib::ID3v2::FrameList& frameList) const; + + bool ParseAPETag(TagLib::APE::Tag *ape, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag); + bool ParseASF(TagLib::ASF::Tag *asf, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag); + bool ParseID3v1Tag(TagLib::ID3v1::Tag *id3v1, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag); + bool ParseID3v2Tag(TagLib::ID3v2::Tag *id3v2, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag); + bool ParseXiphComment(TagLib::Ogg::XiphComment *id3v2, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag); + bool ParseMP4Tag(TagLib::MP4::Tag *mp4, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag); + bool ParseGenericTag(TagLib::Tag *generic, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag); void SetFlacArt(TagLib::FLAC::File *flacFile, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag &tag); + void SetArtist(MUSIC_INFO::CMusicInfoTag &tag, const std::vector &values); + void SetAlbumArtist(MUSIC_INFO::CMusicInfoTag &tag, const std::vector &values); + void SetGenre(MUSIC_INFO::CMusicInfoTag &tag, const std::vector &values); }; - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/tags/test/TestTagLoaderTagLib.cpp kodi-15.2~git20151019.1039-final/xbmc/music/tags/test/TestTagLoaderTagLib.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/tags/test/TestTagLoaderTagLib.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/tags/test/TestTagLoaderTagLib.cpp 2014-12-18 01:01:57.000000000 +0000 @@ -20,154 +20,6 @@ #include "gtest/gtest.h" #include "music/tags/TagLoaderTagLib.h" -#include "music/tags/MusicInfoTag.h" -#include -#include -#include -#include -#include -#include - -using namespace TagLib; -using namespace MUSIC_INFO; - -template -class TestTagParser : public ::testing::Test, public CTagLoaderTagLib { - public: - T value_; -}; - - -typedef ::testing::Types TagTypes; -TYPED_TEST_CASE(TestTagParser, TagTypes); - -TYPED_TEST(TestTagParser, ParsesBasicTag) { - // Create a basic tag - TypeParam *tg = &this->value_; - // Configure a basic tag.. - tg->setTitle ("title"); - tg->setArtist ("artist"); - tg->setAlbum ("album"); - tg->setComment("comment"); - tg->setGenre("Jazz"); - tg->setYear (1985); - tg->setTrack (2); - - CMusicInfoTag tag; - EXPECT_TRUE(CTagLoaderTagLib::ParseTag(tg, NULL, tag)); - - EXPECT_EQ(1985, tag.GetYear()); - EXPECT_EQ(2, tag.GetTrackNumber()); - EXPECT_EQ(1u, tag.GetArtist().size()); - if (tag.GetArtist().size() > 0) EXPECT_EQ("artist", tag.GetArtist().front()); - EXPECT_EQ("album", tag.GetAlbum()); - EXPECT_EQ("comment", tag.GetComment()); - EXPECT_EQ(1u, tag.GetGenre().size()); - if (tag.GetGenre().size() > 0) EXPECT_EQ("Jazz", tag.GetGenre().front()); - EXPECT_EQ("title", tag.GetTitle()); -} - - -TYPED_TEST(TestTagParser, HandleNullTag) { - // A Null tag should not parse, and not break us either - CMusicInfoTag tag; - EXPECT_FALSE(CTagLoaderTagLib::ParseTag(NULL, NULL, tag)); -} - -template -T * end(T (&ra)[N]) { - return ra + N; -} - -const char *tags[] = { "APIC", "ASPI", "COMM", "COMR", "ENCR", "EQU2", - "ETCO", "GEOB", "GRID", "LINK", "MCDI", "MLLT", "OWNE", "PRIV", "PCNT", - "POPM", "POSS", "RBUF", "RVA2", "RVRB", "SEEK", "SIGN", "SYLT", - "SYTC", "TALB", "TBPM", "TCOM", "TCON", "TCOP", "TDEN", "TDLY", "TDOR", - "TDRC", "TDRL", "TDTG", "TENC", "TEXT", "TFLT", "TIPL", "TIT1", "TIT2", - "TIT3", "TKEY", "TLAN", "TLEN", "TMCL", "TMED", "TMOO", "TOAL", "TOFN", - "TOLY", "TOPE", "TOWN", "TPE1", "TPE2", "TPE3", "TPE4", "TPOS", "TPRO", - "TPUB", "TRCK", "TRSN", "TRSO", "TSOA", "TSOP", "TSOT", "TSRC", "TSSE", - "TSST", "TXXX", "UFID", "USER", "USLT", "WCOM", "WCOP", "WOAF", "WOAR", - "WOAS", "WORS", "WPAY", "WPUB", "WXXX", "ARTIST", "ARTISTS", - "ALBUMARTIST" , "ALBUM ARTIST", "ALBUMARTISTS" , "ALBUM ARTISTS", "ALBUM", - "TITLE", "TRACKNUMBER" "TRACK", "DISCNUMBER" "DISC", "YEAR", "GENRE", - "COMMENT", "CUESHEET", "ENCODEDBY", "COMPILATION", "LYRICS", - "REPLAYGAIN_TRACK_GAIN", "REPLAYGAIN_ALBUM_GAIN", "REPLAYGAIN_TRACK_PEAK", - "REPLAYGAIN_ALBUM_PEAK", "MUSICBRAINZ_ARTISTID", - "MUSICBRAINZ_ALBUMARTISTID", "RATING", "MUSICBRAINZ_ALBUMARTIST", - "MUSICBRAINZ_ALBUMID", "MUSICBRAINZ_TRACKID", "METADATA_BLOCK_PICTURE", - "COVERART" -}; - - -// This test exposes a bug in taglib library (#670) so for now we will not run it for all tag types -// See https://github.com/taglib/taglib/issues/670 for details. -typedef ::testing::Types EmptyPropertiesTagTypes; -template -class EmptyTagParser : public ::testing::Test, public CTagLoaderTagLib { - public: - T value_; -}; -TYPED_TEST_CASE(EmptyTagParser, EmptyPropertiesTagTypes); - -TYPED_TEST(EmptyTagParser, EmptyProperties) { - TypeParam *tg = &this->value_; - CMusicInfoTag tag; - PropertyMap props; - int tagcount = end(tags) - tags; - for(int i = 0; i < tagcount; i++) { - props.insert(tags[i], StringList()); - } - - // Even though all the properties are empty, we shouldn't - // crash - EXPECT_TRUE(CTagLoaderTagLib::ParseTag(tg, NULL, tag)); -} - - - -TYPED_TEST(TestTagParser, FooProperties) { - TypeParam *tg = &this->value_; - CMusicInfoTag tag; - PropertyMap props; - int tagcount = end(tags) - tags; - for(int i = 0; i < tagcount; i++) { - props.insert(tags[i], String("foo")); - } - tg->setProperties(props); - - EXPECT_TRUE(CTagLoaderTagLib::ParseTag(tg, NULL, tag)); - EXPECT_EQ(0, tag.GetYear()); - EXPECT_EQ(0, tag.GetTrackNumber()); - EXPECT_EQ(1u, tag.GetArtist().size()); - if (tag.GetArtist().size() > 0) EXPECT_EQ("foo", tag.GetArtist().front()); - EXPECT_EQ("foo", tag.GetAlbum()); - EXPECT_EQ("foo", tag.GetComment()); - if (tag.GetGenre().size() > 0) EXPECT_EQ("foo", tag.GetGenre().front()); - EXPECT_EQ("foo", tag.GetTitle()); -} - -class TestCTagLoaderTagLib : public ::testing::Test, public CTagLoaderTagLib {}; -TEST_F(TestCTagLoaderTagLib, SetGenre) -{ - CMusicInfoTag tag, tag2; - const char *genre_nr[] = {"0", "2", "4"}; - const char *names[] = { "Jazz", "Funk", "Ska" }; - std::vector genres(genre_nr, end(genre_nr)); - std::vector named_genre(names, end(names)); - - CTagLoaderTagLib::SetGenre(tag, genres); - EXPECT_EQ(3u, tag.GetGenre().size()); - EXPECT_EQ("Blues", tag.GetGenre()[0]); - EXPECT_EQ("Country", tag.GetGenre()[1]); - EXPECT_EQ("Disco", tag.GetGenre()[2]); - - CTagLoaderTagLib::SetGenre(tag2, named_genre); - EXPECT_EQ(3u, tag2.GetGenre().size()); - for(int i = 0; i < 3; i++) - EXPECT_EQ(names[i], tag2.GetGenre()[i]); - -} TEST(TestTagLoaderTagLib, SplitMBID) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicBase.cpp kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicBase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicBase.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicBase.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -50,22 +50,16 @@ #include "storage/MediaManager.h" #include "settings/AdvancedSettings.h" #include "settings/MediaSettings.h" -#include "settings/MediaSourceSettings.h" #include "settings/Settings.h" #include "guilib/LocalizeStrings.h" #include "utils/log.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "URL.h" #include "music/infoscanner/MusicInfoScanner.h" -#include "guiinfo/GUIInfoLabels.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" -#include "cores/IPlayer.h" -#include "CueDocument.h" -#include "Autorun.h" +using namespace std; using namespace XFILE; using namespace MUSICDATABASEDIRECTORY; using namespace PLAYLIST; @@ -76,16 +70,11 @@ #define CONTROL_BTNSORTBY 3 #define CONTROL_BTNSORTASC 4 #define CONTROL_BTNTYPE 5 -#define CONTROL_BTNPLAYLISTS 7 -#define CONTROL_BTNSCAN 9 -#define CONTROL_BTNREC 10 -#define CONTROL_BTNRIP 11 CGUIWindowMusicBase::CGUIWindowMusicBase(int id, const std::string &xmlFile) : CGUIMediaWindow(id, xmlFile.c_str()) { m_dlgProgress = NULL; - m_thumbLoader.SetObserver(this); } CGUIWindowMusicBase::~CGUIWindowMusicBase () @@ -132,8 +121,6 @@ { case GUI_MSG_WINDOW_DEINIT: { - if (m_thumbLoader.IsLoading()) - m_thumbLoader.StopThread(); m_musicdatabase.Close(); } break; @@ -149,29 +136,15 @@ // save current window, unless the current window is the music playlist window if (GetID() != WINDOW_MUSIC_PLAYLIST && - CSettings::GetInstance().GetInt(CSettings::SETTING_MYMUSIC_STARTWINDOW) != GetID()) + CSettings::Get().GetInt("mymusic.startwindow") != GetID()) { - CSettings::GetInstance().SetInt(CSettings::SETTING_MYMUSIC_STARTWINDOW, GetID()); - CSettings::GetInstance().Save(); + CSettings::Get().SetInt("mymusic.startwindow", GetID()); + CSettings::Get().Save(); } return true; } break; - case GUI_MSG_DIRECTORY_SCANNED: - { - CFileItem directory(message.GetStringParam(), true); - - // Only update thumb on a local drive - if (directory.IsHD()) - { - std::string strParent; - URIUtils::GetParentPath(directory.GetPath(), strParent); - if (directory.GetPath() == m_vecItems->GetPath() || strParent == m_vecItems->GetPath()) - Refresh(); - } - } - break; // update the display case GUI_MSG_SCAN_FINISHED: @@ -192,40 +165,15 @@ if (nWindow == GetID()) return true; - CSettings::GetInstance().SetInt(CSettings::SETTING_MYMUSIC_STARTWINDOW, nWindow); - CSettings::GetInstance().Save(); + CSettings::Get().SetInt("mymusic.startwindow", nWindow); + CSettings::Get().Save(); g_windowManager.ChangeActiveWindow(nWindow); - CGUIMessage msg2(GUI_MSG_SETFOCUS, CSettings::GetInstance().GetInt(CSettings::SETTING_MYMUSIC_STARTWINDOW), CONTROL_BTNTYPE); + CGUIMessage msg2(GUI_MSG_SETFOCUS, CSettings::Get().GetInt("mymusic.startwindow"), CONTROL_BTNTYPE); g_windowManager.SendMessage(msg2); return true; } - else if (iControl == CONTROL_BTNRIP) - { - OnRipCD(); - } - else if (iControl == CONTROL_BTNPLAYLISTS) - { - if (!m_vecItems->IsPath("special://musicplaylists/")) - Update("special://musicplaylists/"); - } - else if (iControl == CONTROL_BTNSCAN) - { - OnScan(-1); - } - else if (iControl == CONTROL_BTNREC) - { - if (g_application.m_pPlayer->IsPlayingAudio() ) - { - if (g_application.m_pPlayer->CanRecord() ) - { - bool bIsRecording = g_application.m_pPlayer->IsRecording(); - g_application.m_pPlayer->Record(!bIsRecording); - UpdateButtons(); - } - } - } else if (m_viewControl.HasControl(iControl)) // list/thumb control { int iItem = m_viewControl.GetSelectedItem(); @@ -238,7 +186,7 @@ } else if (iAction == ACTION_SHOW_INFO) { - OnItemInfo(iItem); + OnInfo(iItem); } else if (iAction == ACTION_DELETE_ITEM) { @@ -249,7 +197,7 @@ // or be at the files window and have file deletion enabled else if (GetID() == WINDOW_MUSIC_FILES && - CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_ALLOWFILEDELETION)) + CSettings::Get().GetBool("filelists.allowfiledeletion")) { OnDeleteItem(iItem); } @@ -277,12 +225,6 @@ } } break; - case GUI_MSG_NOTIFY_ALL: - { - if (message.GetParam1()==GUI_MSG_REMOVED_MEDIA) - CUtil::DeleteDirectoryCache("r-"); - } - break; } return CGUIMediaWindow::OnMessage(message); } @@ -299,19 +241,10 @@ } } - if (action.GetID() == ACTION_SCAN_ITEM) - { - int item = m_viewControl.GetSelectedItem(); - if (item > -1 && m_vecItems->Get(item)->m_bIsFolder) - OnScan(item); - - return true; - } - return CGUIMediaWindow::OnAction(action); } -void CGUIWindowMusicBase::OnItemInfoAll(int iItem, bool bCurrent /* = false */, bool refresh /* = false */) +void CGUIWindowMusicBase::OnInfoAll(int iItem, bool bCurrent /* = false */, bool refresh /* = false */) { CMusicDatabaseDirectory dir; std::string strPath = m_vecItems->GetPath(); @@ -328,7 +261,7 @@ /// \brief Retrieves music info for albums from allmusic.com and displays them in CGUIDialogMusicInfo /// \param iItem Item in list/thumb control -void CGUIWindowMusicBase::OnItemInfo(int iItem, bool bShowInfo) +void CGUIWindowMusicBase::OnInfo(int iItem, bool bShowInfo) { if ( iItem < 0 || iItem >= m_vecItems->Size() ) return; @@ -347,10 +280,10 @@ return; } - OnItemInfo(item.get(), bShowInfo); + OnInfo(item.get(), bShowInfo); } -void CGUIWindowMusicBase::OnItemInfo(CFileItem *pItem, bool bShowInfo) +void CGUIWindowMusicBase::OnInfo(CFileItem *pItem, bool bShowInfo) { if ((pItem->IsMusicDb() && !pItem->HasMusicInfoTag()) || pItem->IsParentFolder() || URIUtils::IsSpecial(pItem->GetPath()) || StringUtils::StartsWithNoCase(pItem->GetPath(), "musicsearch://")) @@ -408,35 +341,34 @@ return; m_musicdatabase.GetArtistPath(params.GetArtistId(), artist.strPath); - bool refresh = false; while (1) { - // Check if the entry should be refreshed (Only happens if a user pressed refresh) - if (refresh) + // Check if we have the information in the database first + if (!m_musicdatabase.HasArtistBeenScraped(params.GetArtistId())) { - if (!CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) + if (!CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) break; // should display a dialog saying no permissions if (g_application.IsMusicScanning()) { - CGUIDialogOK::ShowAndGetInput(CVariant{189}, CVariant{14057}); + CGUIDialogOK::ShowAndGetInput(189, 14057); break; } // show dialog box indicating we're searching the album if (m_dlgProgress && bShowInfo) { - m_dlgProgress->SetHeading(CVariant{21889}); - m_dlgProgress->SetLine(0, CVariant{pItem->GetMusicInfoTag()->GetArtist()}); - m_dlgProgress->SetLine(1, CVariant{""}); - m_dlgProgress->SetLine(2, CVariant{""}); - m_dlgProgress->Open(); + m_dlgProgress->SetHeading(21889); + m_dlgProgress->SetLine(0, pItem->GetMusicInfoTag()->GetArtist()); + m_dlgProgress->SetLine(1, ""); + m_dlgProgress->SetLine(2, ""); + m_dlgProgress->StartModal(); } CMusicInfoScanner scanner; if (scanner.UpdateDatabaseArtistInfo(artist, scraper, bShowInfo, m_dlgProgress) != INFO_ADDED) { - CGUIDialogOK::ShowAndGetInput(CVariant{21889}, CVariant{20199}); + CGUIDialogOK::ShowAndGetInput(21889, 20199); break; } } @@ -448,12 +380,11 @@ if (pDlgArtistInfo) { pDlgArtistInfo->SetArtist(artist, artist.strPath); - pDlgArtistInfo->Open(); + pDlgArtistInfo->DoModal(); if (pDlgArtistInfo->NeedRefresh()) { m_musicdatabase.ClearArtistLastScrapedTime(params.GetArtistId()); - refresh = true; continue; } else if (pDlgArtistInfo->HasUpdatedThumb()) @@ -481,13 +412,11 @@ return false; m_musicdatabase.GetAlbumPath(params.GetAlbumId(), album.strPath); - bool refresh = false; while (1) { - // Check if the entry should be refreshed (Only happens if a user pressed refresh) - if (refresh) + if (!m_musicdatabase.HasAlbumBeenScraped(params.GetAlbumId())) { - if (!CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) + if (!CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) { // TODO: should display a dialog saying no permissions if (m_dlgProgress) @@ -497,7 +426,7 @@ if (g_application.IsMusicScanning()) { - CGUIDialogOK::ShowAndGetInput(CVariant{189}, CVariant{14057}); + CGUIDialogOK::ShowAndGetInput(189, 14057); if (m_dlgProgress) m_dlgProgress->Close(); return false; @@ -506,17 +435,17 @@ // show dialog box indicating we're searching the album if (m_dlgProgress && bShowInfo) { - m_dlgProgress->SetHeading(CVariant{185}); - m_dlgProgress->SetLine(0, CVariant{pItem->GetMusicInfoTag()->GetAlbum()}); - m_dlgProgress->SetLine(1, CVariant{pItem->GetMusicInfoTag()->GetAlbumArtistString()}); - m_dlgProgress->SetLine(2, CVariant{""}); - m_dlgProgress->Open(); + m_dlgProgress->SetHeading(185); + m_dlgProgress->SetLine(0, pItem->GetMusicInfoTag()->GetAlbum()); + m_dlgProgress->SetLine(1, StringUtils::Join(pItem->GetMusicInfoTag()->GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator)); + m_dlgProgress->SetLine(2, ""); + m_dlgProgress->StartModal(); } CMusicInfoScanner scanner; if (scanner.UpdateDatabaseAlbumInfo(album, scraper, bShowInfo, m_dlgProgress) != INFO_ADDED) { - CGUIDialogOK::ShowAndGetInput(CVariant{185}, CVariant{500}); + CGUIDialogOK::ShowAndGetInput(185, 500); if (m_dlgProgress) m_dlgProgress->Close(); return false; @@ -530,12 +459,11 @@ if (pDlgAlbumInfo) { pDlgAlbumInfo->SetAlbum(album, album.strPath); - pDlgAlbumInfo->Open(); + pDlgAlbumInfo->DoModal(); if (pDlgAlbumInfo->NeedRefresh()) { m_musicdatabase.ClearAlbumLastScrapedTime(params.GetAlbumId()); - refresh = true; continue; } else if (pDlgAlbumInfo->HasUpdatedThumb()) @@ -561,7 +489,7 @@ return; dialog->SetSong(pItem); - dialog->Open(); + dialog->DoModal(GetID()); if (dialog->NeedsUpdate()) Refresh(true); // update our file list } @@ -583,7 +511,7 @@ OnRetrieveMusicInfo(*m_vecItems); // \todo Scan for multitrack items here... - std::vector itemsForRemove; + vector itemsForRemove; CFileItemList itemsForAdd; for (int i = 0; i < m_vecItems->Size(); ++i) { @@ -721,13 +649,13 @@ { if (pItem->IsPlayList()) { - std::unique_ptr pPlayList (CPlayListFactory::Create(*pItem)); + unique_ptr pPlayList (CPlayListFactory::Create(*pItem)); if (pPlayList.get()) { // load it if (!pPlayList->Load(pItem->GetPath())) { - CGUIDialogOK::ShowAndGetInput(CVariant{6}, CVariant{477}); + CGUIDialogOK::ShowAndGetInput(6, 477); return; //hmmm unable to load playlist? } @@ -781,47 +709,7 @@ g_windowManager.SendMessage(msg2); // Select the current window as default item - CONTROL_SELECT_ITEM(CONTROL_BTNTYPE, CSettings::GetInstance().GetInt(CSettings::SETTING_MYMUSIC_STARTWINDOW) - WINDOW_MUSIC_FILES); - - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTNRIP, g_mediaManager.IsAudio()); - - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTNSCAN, - !(m_vecItems->IsVirtualDirectoryRoot() || - m_vecItems->IsMusicDb())); - - if (g_application.IsMusicScanning()) - SET_CONTROL_LABEL(CONTROL_BTNSCAN, 14056); // Stop Scan - else - SET_CONTROL_LABEL(CONTROL_BTNSCAN, 102); // Scan - - bool bIsPlaying = g_application.m_pPlayer->IsPlayingAudio(); - bool bCanRecord = false; - bool bIsRecording = false; - - if (bIsPlaying) - { - bCanRecord = g_application.m_pPlayer->CanRecord(); - bIsRecording = g_application.m_pPlayer->IsRecording(); - } - - // Update Record button - if (bIsPlaying && bCanRecord) - { - CONTROL_ENABLE(CONTROL_BTNREC); - if (bIsRecording) - { - SET_CONTROL_LABEL(CONTROL_BTNREC, 265); //Stop Recording - } - else - { - SET_CONTROL_LABEL(CONTROL_BTNREC, 264); //Record - } - } - else - { - SET_CONTROL_LABEL(CONTROL_BTNREC, 264); //Record - CONTROL_DISABLE(CONTROL_BTNREC); - } + CONTROL_SELECT_ITEM(CONTROL_BTNTYPE, CSettings::Get().GetInt("mymusic.startwindow") - WINDOW_MUSIC_FILES); CGUIMediaWindow::UpdateButtons(); } @@ -851,7 +739,7 @@ else { // check what players we have, if we have multiple display play with option VECPLAYERCORES vecCores; - CPlayerCoreFactory::GetInstance().GetPlayers(*item, vecCores); + CPlayerCoreFactory::Get().GetPlayers(*item, vecCores); if (vecCores.size() >= 1) buttons.Add(CONTEXT_BUTTON_PLAY_WITH, 15213); // Play With... } @@ -865,35 +753,6 @@ else if (item->IsPlayList() || m_vecItems->IsPlayList()) buttons.Add(CONTEXT_BUTTON_EDIT, 586); } - // Add the scan button(s) - if (g_application.IsMusicScanning()) - buttons.Add(CONTEXT_BUTTON_STOP_SCANNING, 13353); // Stop Scanning - else if (!m_vecItems->IsMusicDb() && !m_vecItems->IsInternetStream() && - !item->IsPath("add") && !item->IsParentFolder() && - !item->IsPlugin() && !item->IsMusicDb() && - !item->IsLibraryFolder() && - !StringUtils::StartsWithNoCase(item->GetPath(), "addons://") && - (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser)) - { - buttons.Add(CONTEXT_BUTTON_SCAN, 13352); - } -#ifdef HAS_DVD_DRIVE - // enable Rip CD Audio or Track button if we have an audio disc - if (g_mediaManager.IsDiscInDrive() && m_vecItems->IsCDDA()) - { - // those cds can also include Audio Tracks: CDExtra and MixedMode! - MEDIA_DETECT::CCdInfo *pCdInfo = g_mediaManager.GetCdInfo(); - if (pCdInfo->IsAudio(1) || pCdInfo->IsCDExtra(1) || pCdInfo->IsMixedMode(1)) - buttons.Add(CONTEXT_BUTTON_RIP_TRACK, 610); - } -#endif - } - - // enable CDDB lookup if the current dir is CDDA - if (g_mediaManager.IsDiscInDrive() && m_vecItems->IsCDDA() && - (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser)) - { - buttons.Add(CONTEXT_BUTTON_CDDB, 16002); } } CGUIMediaWindow::GetContextButtons(itemNumber, buttons); @@ -903,8 +762,7 @@ { if (!m_vecItems->IsVirtualDirectoryRoot()) buttons.Add(CONTEXT_BUTTON_GOTO_ROOT, 20128); - if (ActiveAE::CActiveAEDSP::GetInstance().IsProcessing()) - buttons.Add(CONTEXT_BUTTON_ACTIVE_ADSP_SETTINGS, 15047); + buttons.Add(CONTEXT_BUTTON_SETTINGS, 5); } bool CGUIWindowMusicBase::OnContextButton(int itemNumber, CONTEXT_BUTTON button) @@ -913,15 +771,6 @@ if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); - if (CGUIDialogContextMenu::OnContextButton("music", item, button)) - { - if (button == CONTEXT_BUTTON_REMOVE_SOURCE) - OnRemoveSource(itemNumber); - - Update(m_vecItems->GetPath()); - return true; - } - switch (button) { case CONTEXT_BUTTON_QUEUE_ITEM: @@ -929,7 +778,7 @@ return true; case CONTEXT_BUTTON_INFO: - OnItemInfo(itemNumber); + OnInfo(itemNumber); return true; case CONTEXT_BUTTON_SONG_INFO: @@ -962,8 +811,8 @@ case CONTEXT_BUTTON_PLAY_WITH: { VECPLAYERCORES vecCores; // base class? - CPlayerCoreFactory::GetInstance().GetPlayers(*item, vecCores); - g_application.m_eForcedNextPlayer = CPlayerCoreFactory::GetInstance().SelectPlayerDialog(vecCores); + CPlayerCoreFactory::Get().GetPlayers(*item, vecCores); + g_application.m_eForcedNextPlayer = CPlayerCoreFactory::Get().SelectPlayerDialog(vecCores); if( g_application.m_eForcedNextPlayer != EPC_NONE ) OnClick(itemNumber); return true; @@ -983,33 +832,9 @@ Update(""); return true; - case CONTEXT_BUTTON_ACTIVE_ADSP_SETTINGS: - g_windowManager.ActivateWindow(WINDOW_DIALOG_AUDIO_DSP_OSD_SETTINGS); - return true; - - case CONTEXT_BUTTON_RIP_CD: - OnRipCD(); - return true; - -#ifdef HAS_CDDA_RIPPER - case CONTEXT_BUTTON_CANCEL_RIP_CD: - CCDDARipper::GetInstance().CancelJobs(); - return true; -#endif - - case CONTEXT_BUTTON_RIP_TRACK: - OnRipTrack(itemNumber); + case CONTEXT_BUTTON_SETTINGS: + g_windowManager.ActivateWindow(WINDOW_SETTINGS_MYMUSIC); return true; - - case CONTEXT_BUTTON_SCAN: - OnScan(itemNumber); - return true; - - case CONTEXT_BUTTON_CDDB: - if (m_musicdatabase.LookupCDDBInfo(true)) - Refresh(); - return true; - default: break; } @@ -1028,7 +853,7 @@ #endif } else - CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{20099}); + CGUIDialogOK::ShowAndGetInput(257, 20099); } } @@ -1044,7 +869,7 @@ #endif } else - CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{20099}); + CGUIDialogOK::ShowAndGetInput(257, 20099); } } @@ -1055,13 +880,6 @@ // the current playlist const CFileItemPtr pItem = m_vecItems->Get(iItem); -#ifdef HAS_DVD_DRIVE - if (pItem->IsDVD()) - { - MEDIA_DETECT::CAutorun::PlayDiscAskResume(pItem->GetPath()); - return; - } -#endif // if its a folder, build a playlist if ((pItem->m_bIsFolder && !pItem->IsPlugin()) || (g_windowManager.GetActiveWindow() == WINDOW_MUSIC_NAV && pItem->IsPlayList())) @@ -1120,13 +938,13 @@ // load a playlist like .m3u, .pls // first get correct factory to load playlist - std::unique_ptr pPlayList (CPlayListFactory::Create(strPlayList)); + unique_ptr pPlayList (CPlayListFactory::Create(strPlayList)); if (pPlayList.get()) { // load it if (!pPlayList->Load(strPlayList)) { - CGUIDialogOK::ShowAndGetInput(CVariant{6}, CVariant{477}); + CGUIDialogOK::ShowAndGetInput(6, 477); return; //hmmm unable to load playlist? } } @@ -1160,7 +978,9 @@ { // single music file - if we get here then we have autoplaynextitem turned off or queuebydefault // turned on, but we still want to use the playlist player in order to handle more queued items // following etc. - if ( (CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICPLAYER_QUEUEBYDEFAULT) && g_windowManager.GetActiveWindow() != WINDOW_MUSIC_PLAYLIST_EDITOR) ) + // Karaoke items also can be added in runtime (while the song is played), so it should be queued too. + if ( (CSettings::Get().GetBool("musicplayer.queuebydefault") && g_windowManager.GetActiveWindow() != WINDOW_MUSIC_PLAYLIST_EDITOR) + || pItem->IsKaraoke() ) { // TODO: Should the playlist be cleared if nothing is already playing? OnQueueItem(iItem); @@ -1181,7 +1001,7 @@ // check user permissions bool saveDb = album.idAlbum != -1; bool saveDirThumb = true; - if (!CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) + if (!CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) { saveDb = false; saveDirThumb = false; @@ -1205,8 +1025,8 @@ // really, this may not be enough as it is to reliably update this item. eg think of various artists albums // that aren't tagged as such (and aren't yet scanned). But we probably can't do anything better than this // in that case - if (album.strAlbum == tag->GetAlbum() && (album.GetAlbumArtist() == tag->GetAlbumArtist() || - album.GetAlbumArtist() == tag->GetArtist())) + if (album.strAlbum == tag->GetAlbum() && (album.artist == tag->GetAlbumArtist() || + album.artist == tag->GetArtist())) { g_infoManager.SetCurrentAlbumThumb(albumThumb); } @@ -1244,7 +1064,7 @@ void CGUIWindowMusicBase::OnRetrieveMusicInfo(CFileItemList& items) { if (items.GetFolderCount()==items.Size() || items.IsMusicDb() || - (!CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICFILES_USETAGS) && !items.IsCDDA())) + (!CSettings::Get().GetBool("musicfiles.usetags") && !items.IsCDDA())) { return; } @@ -1266,11 +1086,12 @@ if (!bProgressVisible && elapsed>1500 && m_dlgProgress) { // tag loading takes more then 1.5 secs, show a progress dialog CURL url(items.GetPath()); - m_dlgProgress->SetHeading(CVariant{189}); - m_dlgProgress->SetLine(0, CVariant{505}); - m_dlgProgress->SetLine(1, CVariant{""}); - m_dlgProgress->SetLine(2, CVariant{url.GetWithoutUserDetails()}); - m_dlgProgress->Open(); + std::string strStrippedPath = url.GetWithoutUserDetails(); + m_dlgProgress->SetHeading(189); + m_dlgProgress->SetLine(0, 505); + m_dlgProgress->SetLine(1, ""); + m_dlgProgress->SetLine(2, strStrippedPath ); + m_dlgProgress->StartModal(); m_dlgProgress->ShowProgressBar(true); bProgressVisible = true; } @@ -1295,57 +1116,44 @@ { CMusicThumbLoader loader; loader.FillThumb(items); + } - CQueryParams params; - CDirectoryNode::GetDatabaseInfo(items.GetPath(), params); - - if (params.GetAlbumId() > 0) - { - std::map artistArt; - if (m_musicdatabase.GetArtistArtForItem(params.GetAlbumId(), MediaTypeAlbum, artistArt)) - items.AppendArt(artistArt, MediaTypeArtist); - - std::map albumArt; - if (m_musicdatabase.GetArtForItem(params.GetAlbumId(), MediaTypeAlbum, albumArt)) - items.AppendArt(albumArt, MediaTypeAlbum); - } - if (params.GetArtistId() > 0) - { - std::map artistArt; - if (m_musicdatabase.GetArtForItem(params.GetArtistId(), "artist", artistArt)) - items.AppendArt(artistArt, MediaTypeArtist); - } - - // add in the "New Playlist" item if we're in the playlists folder - if ((items.GetPath() == "special://musicplaylists/") && !items.Contains("newplaylist://")) - { - CFileItemPtr newPlaylist(new CFileItem(CProfilesManager::GetInstance().GetUserDataItem("PartyMode.xsp"),false)); - newPlaylist->SetLabel(g_localizeStrings.Get(16035)); - newPlaylist->SetLabelPreformated(true); - newPlaylist->m_bIsFolder = true; - items.Add(newPlaylist); - - newPlaylist.reset(new CFileItem("newplaylist://", false)); - newPlaylist->SetLabel(g_localizeStrings.Get(525)); - newPlaylist->SetLabelPreformated(true); - newPlaylist->SetSpecialSort(SortSpecialOnBottom); - newPlaylist->SetCanQueue(false); - items.Add(newPlaylist); - - newPlaylist.reset(new CFileItem("newsmartplaylist://music", false)); - newPlaylist->SetLabel(g_localizeStrings.Get(21437)); - newPlaylist->SetLabelPreformated(true); - newPlaylist->SetSpecialSort(SortSpecialOnBottom); - newPlaylist->SetCanQueue(false); - items.Add(newPlaylist); - } - - // check for .CUE files here. - items.FilterCueItems(); + CQueryParams params; + CDirectoryNode::GetDatabaseInfo(items.GetPath(), params); - std::string label; - if (items.GetLabel().empty() && m_rootDir.IsSource(items.GetPath(), CMediaSourceSettings::GetInstance().GetSources("music"), &label)) - items.SetLabel(label); + if (params.GetAlbumId()) + { + map artistArt; + if (m_musicdatabase.GetArtistArtForItem(params.GetAlbumId(), MediaTypeAlbum, artistArt)) + items.AppendArt(artistArt, MediaTypeArtist); + + map albumArt; + if (m_musicdatabase.GetArtForItem(params.GetAlbumId(), MediaTypeAlbum, albumArt)) + items.AppendArt(albumArt, MediaTypeAlbum); + } + + // add in the "New Playlist" item if we're in the playlists folder + if ((items.GetPath() == "special://musicplaylists/") && !items.Contains("newplaylist://")) + { + CFileItemPtr newPlaylist(new CFileItem(CProfilesManager::Get().GetUserDataItem("PartyMode.xsp"),false)); + newPlaylist->SetLabel(g_localizeStrings.Get(16035)); + newPlaylist->SetLabelPreformated(true); + newPlaylist->m_bIsFolder = true; + items.Add(newPlaylist); + + newPlaylist.reset(new CFileItem("newplaylist://", false)); + newPlaylist->SetLabel(g_localizeStrings.Get(525)); + newPlaylist->SetLabelPreformated(true); + newPlaylist->SetSpecialSort(SortSpecialOnBottom); + newPlaylist->SetCanQueue(false); + items.Add(newPlaylist); + + newPlaylist.reset(new CFileItem("newsmartplaylist://music", false)); + newPlaylist->SetLabel(g_localizeStrings.Get(21437)); + newPlaylist->SetLabelPreformated(true); + newPlaylist->SetSpecialSort(SortSpecialOnBottom); + newPlaylist->SetCanQueue(false); + items.Add(newPlaylist); } return bResult; @@ -1371,28 +1179,28 @@ void CGUIWindowMusicBase::OnInitWindow() { CGUIMediaWindow::OnInitWindow(); - if (CMediaSettings::GetInstance().GetMusicNeedsUpdate() == 53) + if (CMediaSettings::Get().GetMusicNeedsUpdate() == 35) { if (g_infoManager.GetLibraryBool(LIBRARY_HAS_MUSIC) && !g_application.IsMusicScanning()) { // rescan of music library required - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{799}, CVariant{800})) + if (CGUIDialogYesNo::ShowAndGetInput(799, 800)) { int flags = CMusicInfoScanner::SCAN_RESCAN; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_DOWNLOADINFO)) + if (CSettings::Get().GetBool("musiclibrary.downloadinfo")) flags |= CMusicInfoScanner::SCAN_ONLINE; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICLIBRARY_BACKGROUNDUPDATE)) + if (CSettings::Get().GetBool("musiclibrary.backgroundupdate")) flags |= CMusicInfoScanner::SCAN_BACKGROUND; g_application.StartMusicScan("", true, flags); - CMediaSettings::GetInstance().SetMusicNeedsUpdate(0); // once is enough (user may interrupt, but that's up to them) - CSettings::GetInstance().Save(); + CMediaSettings::Get().SetMusicNeedsUpdate(0); // once is enough (user may interrupt, but that's up to them) + CSettings::Get().Save(); } } else { // no need to force a rescan if there's no music in the library or if a library scan is already active - CMediaSettings::GetInstance().SetMusicNeedsUpdate(0); - CSettings::GetInstance().Save(); + CMediaSettings::Get().SetMusicNeedsUpdate(0); + CSettings::Get().Save(); } } } @@ -1406,66 +1214,3 @@ return "special://musicplaylists/"; return CGUIMediaWindow::GetStartFolder(dir); } - -void CGUIWindowMusicBase::OnScan(int iItem) -{ - std::string strPath; - if (iItem < 0 || iItem >= m_vecItems->Size()) - strPath = m_vecItems->GetPath(); - else if (m_vecItems->Get(iItem)->m_bIsFolder) - strPath = m_vecItems->Get(iItem)->GetPath(); - else - { // TODO: MUSICDB - should we allow scanning a single item into the database? - // This will require changes to the info scanner, which assumes we're running on a folder - strPath = m_vecItems->GetPath(); - } - DoScan(strPath); -} - -void CGUIWindowMusicBase::DoScan(const std::string &strPath) -{ - if (g_application.IsMusicScanning()) - { - g_application.StopMusicScan(); - return; - } - - // Start background loader - int iControl=GetFocusedControlID(); - g_application.StartMusicScan(strPath); - SET_CONTROL_FOCUS(iControl, 0); - UpdateButtons(); -} - -void CGUIWindowMusicBase::OnRemoveSource(int iItem) -{ - bool bCanceled; - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{522}, CVariant{20340}, bCanceled, CVariant{""}, CVariant{""}, CGUIDialogYesNo::NO_TIMEOUT)) - { - MAPSONGS songs; - CMusicDatabase database; - database.Open(); - database.RemoveSongsFromPath(m_vecItems->Get(iItem)->GetPath(), songs, false); - database.CleanupOrphanedItems(); - g_infoManager.ResetLibraryBools(); - m_vecItems->RemoveDiscCache(GetID()); - } -} - -void CGUIWindowMusicBase::OnPrepareFileItems(CFileItemList &items) -{ - CGUIMediaWindow::OnPrepareFileItems(items); - - if (!items.IsMusicDb()) - RetrieveMusicInfo(); -} - -void CGUIWindowMusicBase::OnAssignContent(const std::string &path) -{ - // Add content selection logic here, if music is ready for that some day - - // This won't ask you to clean/delete your content, when you change the scraper to none (if music gets this), might ne nice in the future - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{ 20444 }, CVariant{ 20447 })) - g_application.StartMusicScan(path, true); -} - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicBase.h kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicBase.h --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicBase.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicBase.h 2015-10-19 08:39:16.000000000 +0000 @@ -37,7 +37,7 @@ CGUIWindowMusicBase is the base class for all music windows. */ -class CGUIWindowMusicBase : public CGUIMediaWindow, public IBackgroundLoaderObserver +class CGUIWindowMusicBase : public CGUIMediaWindow { public: CGUIWindowMusicBase(int id, const std::string &xmlFile); @@ -46,14 +46,8 @@ virtual bool OnAction(const CAction &action); virtual bool OnBack(int actionID); - void OnItemInfo(CFileItem *pItem, bool bShowInfo = false); + void OnInfo(CFileItem *pItem, bool bShowInfo = false); - void DoScan(const std::string &strPath); - - /*! \brief Prompt the user if he wants to start a scan for this folder - \param path the path to assign content for - */ - static void OnAssignContent(const std::string &path); protected: virtual void OnInitWindow(); /*! @@ -70,13 +64,10 @@ virtual bool GetDirectory(const std::string &strDirectory, CFileItemList &items); virtual void OnRetrieveMusicInfo(CFileItemList& items); - virtual void OnPrepareFileItems(CFileItemList &items); void AddItemToPlayList(const CFileItemPtr &pItem, CFileItemList &queuedItems); + virtual void OnScan(int iItem) {}; void OnRipCD(); virtual std::string GetStartFolder(const std::string &dir); - virtual void OnItemLoaded(CFileItem* pItem) {} - - virtual void OnScan(int iItem); virtual bool CheckFilterAdvanced(CFileItemList &items) const; virtual bool CanContainFilter(const std::string &strDirectory) const; @@ -86,8 +77,8 @@ virtual bool OnPlayMedia(int iItem); void RetrieveMusicInfo(); - void OnItemInfo(int iItem, bool bShowInfo = true); - void OnItemInfoAll(int iItem, bool bCurrent=false, bool refresh=false); + void OnInfo(int iItem, bool bShowInfo = true); + void OnInfoAll(int iItem, bool bCurrent=false, bool refresh=false); virtual void OnQueueItem(int iItem); enum ALLOW_SELECTION { SELECTION_ALLOWED = 0, SELECTION_AUTO, SELECTION_FORCED }; bool FindAlbumInfo(const CFileItem* album, MUSIC_GRABBER::CMusicAlbumInfo& albumInfo, ALLOW_SELECTION allowSelection); @@ -101,13 +92,12 @@ void OnRipTrack(int iItem); void OnSearch(); virtual void LoadPlayList(const std::string& strPlayList); - virtual void OnRemoveSource(int iItem); typedef std::vector ::iterator ivecItems; ///< CFileItem* vector Iterator CGUIDialogProgress* m_dlgProgress; ///< Progress dialog + // member variables to save frequently used CSettings (which is slow) + bool m_hideExtensions; CMusicDatabase m_musicdatabase; MUSIC_INFO::CMusicInfoLoader m_musicInfoLoader; - - CMusicThumbLoader m_thumbLoader; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicNav.cpp kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicNav.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicNav.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicNav.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -44,23 +44,21 @@ #include "GUIUserMessages.h" #include "FileItem.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "settings/Settings.h" #include "settings/AdvancedSettings.h" #include "guilib/LocalizeStrings.h" #include "utils/LegacyPathTranslation.h" #include "utils/log.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "Util.h" #include "URL.h" #include "ContextMenuManager.h" -#include "storage/MediaManager.h" +using namespace std; using namespace XFILE; using namespace PLAYLIST; using namespace MUSICDATABASEDIRECTORY; -using namespace KODI::MESSAGING; #define CONTROL_BTNVIEWASICONS 2 #define CONTROL_BTNSORTBY 3 @@ -73,6 +71,7 @@ #define CONTROL_BTNPARTYMODE 16 #define CONTROL_BTNMANUALINFO 17 #define CONTROL_BTN_FILTER 19 +#define CONTROL_LABELEMPTY 18 #define CONTROL_UPDATE_LIBRARY 20 @@ -80,6 +79,8 @@ : CGUIWindowMusicBase(WINDOW_MUSIC_NAV, "MyMusicNav.xml") { m_vecItems->SetPath("?"); + m_bDisplayEmptyDatabaseMessage = false; + m_thumbLoader.SetObserver(this); m_searchWithEdit = false; } @@ -94,6 +95,10 @@ case GUI_MSG_WINDOW_RESET: m_vecItems->SetPath("?"); break; + case GUI_MSG_WINDOW_DEINIT: + if (m_thumbLoader.IsLoading()) + m_thumbLoader.StopThread(); + break; case GUI_MSG_WINDOW_INIT: { /* We don't want to show Autosourced items (ie removable pendrives, memorycards) in Library mode */ @@ -101,11 +106,25 @@ // is this the first time the window is opened? if (m_vecItems->GetPath() == "?" && message.GetStringParam().empty()) - message.SetStringParam(CSettings::GetInstance().GetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW)); + message.SetStringParam(CSettings::Get().GetString("mymusic.defaultlibview")); + + DisplayEmptyDatabaseMessage(false); // reset message state if (!CGUIWindowMusicBase::OnMessage(message)) return false; + // base class has opened the database, do our check + DisplayEmptyDatabaseMessage(m_musicdatabase.GetSongsCount() <= 0); + + if (m_bDisplayEmptyDatabaseMessage) + { + // no library - make sure we focus on a known control, and default to the root. + SET_CONTROL_FOCUS(CONTROL_BTNTYPE, 0); + m_vecItems->SetPath(""); + SetHistoryForPath(""); + Update(""); + } + return true; } break; @@ -189,10 +208,9 @@ if (item > -1 && m_vecItems->Get(item)->m_bIsFolder && (dir.HasAlbumInfo(m_vecItems->Get(item)->GetPath())|| dir.IsArtistDir(m_vecItems->Get(item)->GetPath()))) - { OnContextButton(item,CONTEXT_BUTTON_INFO); - return true; - } + + return true; } return CGUIWindowMusicBase::OnAction(action); @@ -274,6 +292,9 @@ bool CGUIWindowMusicNav::GetDirectory(const std::string &strDirectory, CFileItemList &items) { + if (m_bDisplayEmptyDatabaseMessage) + return true; + if (strDirectory.empty()) AddSearchFolder(); @@ -288,7 +309,7 @@ if (StringUtils::StartsWithNoCase(strDirectory, "videodb://") || items.IsVideoDb()) { CVideoDatabaseDirectory dir; - VIDEODATABASEDIRECTORY::NODE_TYPE node = dir.GetDirectoryChildType(items.GetPath()); + VIDEODATABASEDIRECTORY::NODE_TYPE node = dir.GetDirectoryChildType(strDirectory); if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS || node == VIDEODATABASEDIRECTORY::NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS) items.SetContent("musicvideos"); @@ -308,13 +329,11 @@ items.SetContent("albums"); else if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_TAGS) items.SetContent("tags"); - else - items.SetContent(""); } else if (StringUtils::StartsWithNoCase(strDirectory, "musicdb://") || items.IsMusicDb()) { CMusicDatabaseDirectory dir; - NODE_TYPE node = dir.GetDirectoryChildType(items.GetPath()); + NODE_TYPE node = dir.GetDirectoryChildType(strDirectory); if (node == NODE_TYPE_ALBUM || node == NODE_TYPE_ALBUM_RECENTLY_ADDED || node == NODE_TYPE_ALBUM_RECENTLY_PLAYED || @@ -337,20 +356,13 @@ items.SetContent("genres"); else if (node == NODE_TYPE_YEAR) items.SetContent("years"); - else - items.SetContent(""); } - else if (items.IsPlayList()) - items.SetContent("songs"); - else if (URIUtils::PathEquals(strDirectory, "special://musicplaylists/") || - URIUtils::PathEquals(strDirectory, "library://music/playlists.xml/")) + else if (URIUtils::PathEquals(strDirectory, "special://musicplaylists/")) items.SetContent("playlists"); else if (URIUtils::PathEquals(strDirectory, "plugin://music/")) items.SetContent("plugins"); - else if (items.IsAddonsPath()) - items.SetContent("addons"); - else if (!items.IsSourcesPath() && !items.IsVirtualDirectoryRoot() && !items.IsLibraryFolder()) - items.SetContent("files"); + else if (items.IsPlayList()) + items.SetContent("songs"); return bResult; } @@ -413,7 +425,7 @@ // and cleared! // root is not allowed - if (m_vecItems->IsVirtualDirectoryRoot() && !m_vecItems->Get(iItem)->IsDVD()) + if (m_vecItems->IsVirtualDirectoryRoot()) return; CGUIWindowMusicBase::PlayItem(iItem); @@ -435,6 +447,8 @@ void CGUIWindowMusicNav::GetContextButtons(int itemNumber, CContextButtons &buttons) { + CGUIWindowMusicBase::GetContextButtons(itemNumber, buttons); + CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); @@ -444,164 +458,121 @@ bool inPlaylists = m_vecItems->IsPath(CUtil::MusicPlaylistsLocation()) || m_vecItems->IsPath("special://musicplaylists/"); - if (m_vecItems->IsPath("sources://music/")) + CMusicDatabaseDirectory dir; + // enable music info button on an album or on a song. + if (item->IsAudio() && !item->IsPlayList() && !item->IsSmartPlayList() && + !item->m_bIsFolder) { - // get the usual music shares, and anything for all media windows - CGUIDialogContextMenu::GetContextButtons("music", item, buttons); -#ifdef HAS_DVD_DRIVE - // enable Rip CD an audio disc - if (g_mediaManager.IsDiscInDrive() && item->IsCDDA()) - { - // those cds can also include Audio Tracks: CDExtra and MixedMode! - MEDIA_DETECT::CCdInfo *pCdInfo = g_mediaManager.GetCdInfo(); - if (pCdInfo->IsAudio(1) || pCdInfo->IsCDExtra(1) || pCdInfo->IsMixedMode(1)) - { - if (CJobManager::GetInstance().IsProcessing("cdrip")) - buttons.Add(CONTEXT_BUTTON_CANCEL_RIP_CD, 14100); - else - buttons.Add(CONTEXT_BUTTON_RIP_CD, 600); - } - } -#endif - // Add the scan button(s) - if (g_application.IsMusicScanning()) - buttons.Add(CONTEXT_BUTTON_STOP_SCANNING, 13353); // Stop Scanning - else if (!inPlaylists && !m_vecItems->IsInternetStream() && - !item->IsPath("add") && !item->IsParentFolder() && - !item->IsPlugin() && - !StringUtils::StartsWithNoCase(item->GetPath(), "addons://") && - (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser)) - { - buttons.Add(CONTEXT_BUTTON_SCAN, 13352); - } - CGUIMediaWindow::GetContextButtons(itemNumber, buttons); + buttons.Add(CONTEXT_BUTTON_SONG_INFO, 658); } - else + else if (item->IsVideoDb()) { - CGUIWindowMusicBase::GetContextButtons(itemNumber, buttons); - - CMusicDatabaseDirectory dir; - // enable music info button on an album or on a song. - if (item->IsAudio() && !item->IsPlayList() && !item->IsSmartPlayList() && - !item->m_bIsFolder) - buttons.Add(CONTEXT_BUTTON_SONG_INFO, 658); - else if (item->IsVideoDb()) - { - if (!item->m_bIsFolder) // music video - buttons.Add(CONTEXT_BUTTON_INFO, 20393); - if (StringUtils::StartsWithNoCase(item->GetPath(), "videodb://musicvideos/artists/") && item->m_bIsFolder) - { - long idArtist = m_musicdatabase.GetArtistByName(m_vecItems->Get(itemNumber)->GetLabel()); - if (idArtist > - 1) - buttons.Add(CONTEXT_BUTTON_INFO,21891); - } - } - else if (!inPlaylists && (dir.HasAlbumInfo(item->GetPath())|| - dir.IsArtistDir(item->GetPath()) ) && - !dir.IsAllItem(item->GetPath()) && !item->IsParentFolder() && - !item->IsPlugin() && !item->IsScript() && - !StringUtils::StartsWithNoCase(item->GetPath(), "musicsearch://")) - { - if (dir.IsArtistDir(item->GetPath())) - buttons.Add(CONTEXT_BUTTON_INFO, 21891); - else - buttons.Add(CONTEXT_BUTTON_INFO, 13351); - } - - // enable query all albums button only in album view - if (dir.HasAlbumInfo(item->GetPath()) && !dir.IsAllItem(item->GetPath()) && - item->m_bIsFolder && !item->IsVideoDb() && !item->IsParentFolder() && - !item->IsPlugin() && !StringUtils::StartsWithNoCase(item->GetPath(), "musicsearch://")) - { - buttons.Add(CONTEXT_BUTTON_INFO_ALL, 20059); - } - - // enable query all artist button only in album view - if (dir.IsArtistDir(item->GetPath()) && !dir.IsAllItem(item->GetPath()) && - item->m_bIsFolder && !item->IsVideoDb()) + if (!item->m_bIsFolder) // music video + buttons.Add(CONTEXT_BUTTON_INFO, 20393); + if (StringUtils::StartsWithNoCase(item->GetPath(), "videodb://musicvideos/artists/") && item->m_bIsFolder) { - ADDON::ScraperPtr info; - if(m_musicdatabase.GetScraperForPath(item->GetPath(), info, ADDON::ADDON_SCRAPER_ARTISTS)) - { - if (info && info->Supports(CONTENT_ARTISTS)) - buttons.Add(CONTEXT_BUTTON_INFO_ALL, 21884); - } + long idArtist = m_musicdatabase.GetArtistByName(m_vecItems->Get(itemNumber)->GetLabel()); + if (idArtist > - 1) + buttons.Add(CONTEXT_BUTTON_INFO,21891); } + } + else if (!inPlaylists && (dir.HasAlbumInfo(item->GetPath())|| + dir.IsArtistDir(item->GetPath()) ) && + !dir.IsAllItem(item->GetPath()) && !item->IsParentFolder() && + !item->IsPlugin() && !item->IsScript() && + !StringUtils::StartsWithNoCase(item->GetPath(), "musicsearch://")) + { + if (dir.IsArtistDir(item->GetPath())) + buttons.Add(CONTEXT_BUTTON_INFO, 21891); + else + buttons.Add(CONTEXT_BUTTON_INFO, 13351); + } - //Set default or clear default - NODE_TYPE nodetype = dir.GetDirectoryType(item->GetPath()); - if (!item->IsParentFolder() && !inPlaylists && - (nodetype == NODE_TYPE_ROOT || - nodetype == NODE_TYPE_OVERVIEW || - nodetype == NODE_TYPE_TOP100)) - { - if (!item->IsPath(CSettings::GetInstance().GetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW))) - buttons.Add(CONTEXT_BUTTON_SET_DEFAULT, 13335); // set default - if (!CSettings::GetInstance().GetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW).empty()) - buttons.Add(CONTEXT_BUTTON_CLEAR_DEFAULT, 13403); // clear default - } - NODE_TYPE childtype = dir.GetDirectoryChildType(item->GetPath()); - if (childtype == NODE_TYPE_ALBUM || - childtype == NODE_TYPE_ARTIST || - nodetype == NODE_TYPE_GENRE || - nodetype == NODE_TYPE_ALBUM || - nodetype == NODE_TYPE_ALBUM_RECENTLY_ADDED || - nodetype == NODE_TYPE_ALBUM_COMPILATIONS) - { - // we allow the user to set content for - // 1. general artist and album nodes - // 2. specific per genre - // 3. specific per artist - // 4. specific per album - buttons.Add(CONTEXT_BUTTON_SET_CONTENT, 20195); - } - if (item->HasMusicInfoTag() && !item->GetMusicInfoTag()->GetArtistString().empty()) - { - CVideoDatabase database; - database.Open(); - if (database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString()) > -1) - buttons.Add(CONTEXT_BUTTON_GO_TO_ARTIST, 20400); - } - if (item->HasMusicInfoTag() && !item->GetMusicInfoTag()->GetArtistString().empty() && - !item->GetMusicInfoTag()->GetAlbum().empty() && - !item->GetMusicInfoTag()->GetTitle().empty()) - { - CVideoDatabase database; - database.Open(); - if (database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString(), item->GetMusicInfoTag()->GetAlbum(), item->GetMusicInfoTag()->GetTitle()) > -1) - buttons.Add(CONTEXT_BUTTON_PLAY_OTHER, 20401); - } - if (item->HasVideoInfoTag() && !item->m_bIsFolder) - { - if (item->GetVideoInfoTag()->m_playCount > 0) - buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); //Mark as UnWatched - else - buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); //Mark as Watched - if ((CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) && !item->IsPlugin()) - { - buttons.Add(CONTEXT_BUTTON_RENAME, 16105); - buttons.Add(CONTEXT_BUTTON_DELETE, 646); - } - } - if (inPlaylists && URIUtils::GetFileName(item->GetPath()) != "PartyMode.xsp" - && (item->IsPlayList() || item->IsSmartPlayList())) - buttons.Add(CONTEXT_BUTTON_DELETE, 117); + // enable query all albums button only in album view + if (dir.HasAlbumInfo(item->GetPath()) && !dir.IsAllItem(item->GetPath()) && + item->m_bIsFolder && !item->IsVideoDb() && !item->IsParentFolder() && + !item->IsPlugin() && !StringUtils::StartsWithNoCase(item->GetPath(), "musicsearch://")) + { + buttons.Add(CONTEXT_BUTTON_INFO_ALL, 20059); + } - if (item->IsPlugin() || item->IsScript() || m_vecItems->IsPlugin()) - buttons.Add(CONTEXT_BUTTON_PLUGIN_SETTINGS, 1045); + // enable query all artist button only in album view + if (dir.IsArtistDir(item->GetPath()) && !dir.IsAllItem(item->GetPath()) && + item->m_bIsFolder && !item->IsVideoDb()) + { + ADDON::ScraperPtr info; + m_musicdatabase.GetScraperForPath(item->GetPath(), info, ADDON::ADDON_SCRAPER_ARTISTS); + if (info && info->Supports(CONTENT_ARTISTS)) + buttons.Add(CONTEXT_BUTTON_INFO_ALL, 21884); + } - if (!item->IsReadOnly() && CSettings::GetInstance().GetBool("filelists.allowfiledeletion")) + //Set default or clear default + NODE_TYPE nodetype = dir.GetDirectoryType(item->GetPath()); + if (!item->IsParentFolder() && !inPlaylists && + (nodetype == NODE_TYPE_ROOT || + nodetype == NODE_TYPE_OVERVIEW || + nodetype == NODE_TYPE_TOP100)) + { + if (!item->IsPath(CSettings::Get().GetString("mymusic.defaultlibview"))) + buttons.Add(CONTEXT_BUTTON_SET_DEFAULT, 13335); // set default + if (!CSettings::Get().GetString("mymusic.defaultlibview").empty()) + buttons.Add(CONTEXT_BUTTON_CLEAR_DEFAULT, 13403); // clear default + } + NODE_TYPE childtype = dir.GetDirectoryChildType(item->GetPath()); + if (childtype == NODE_TYPE_ALBUM || + childtype == NODE_TYPE_ARTIST || + nodetype == NODE_TYPE_GENRE || + nodetype == NODE_TYPE_ALBUM || + nodetype == NODE_TYPE_ALBUM_RECENTLY_ADDED || + nodetype == NODE_TYPE_ALBUM_COMPILATIONS) + { + // we allow the user to set content for + // 1. general artist and album nodes + // 2. specific per genre + // 3. specific per artist + // 4. specific per album + buttons.Add(CONTEXT_BUTTON_SET_CONTENT,20195); + } + if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetArtist().size() > 0) + { + CVideoDatabase database; + database.Open(); + if (database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator)) > -1) + buttons.Add(CONTEXT_BUTTON_GO_TO_ARTIST, 20400); + } + if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetArtist().size() > 0 && + item->GetMusicInfoTag()->GetAlbum().size() > 0 && + item->GetMusicInfoTag()->GetTitle().size() > 0) + { + CVideoDatabase database; + database.Open(); + if (database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator),item->GetMusicInfoTag()->GetAlbum(),item->GetMusicInfoTag()->GetTitle()) > -1) + buttons.Add(CONTEXT_BUTTON_PLAY_OTHER, 20401); + } + if (item->HasVideoInfoTag() && !item->m_bIsFolder) + { + if (item->GetVideoInfoTag()->m_playCount > 0) + buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); //Mark as UnWatched + else + buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); //Mark as Watched + if ((CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) && !item->IsPlugin()) { - buttons.Add(CONTEXT_BUTTON_DELETE, 117); - buttons.Add(CONTEXT_BUTTON_RENAME, 118); + buttons.Add(CONTEXT_BUTTON_RENAME, 16105); + buttons.Add(CONTEXT_BUTTON_DELETE, 646); } } + if (inPlaylists && URIUtils::GetFileName(item->GetPath()) != "PartyMode.xsp" + && (item->IsPlayList() || item->IsSmartPlayList())) + buttons.Add(CONTEXT_BUTTON_DELETE, 117); + + if (item->IsPlugin() || item->IsScript() || m_vecItems->IsPlugin()) + buttons.Add(CONTEXT_BUTTON_PLUGIN_SETTINGS, 1045); } // noncontextual buttons CGUIWindowMusicBase::GetNonContextButtons(buttons); - CContextMenuManager::GetInstance().AddVisibleItems(item, buttons); + CContextMenuManager::Get().AddVisibleItems(item, buttons); } bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) @@ -657,7 +628,7 @@ if (pWindow) { ADDON::ScraperPtr info; - pWindow->OnItemInfo(item.get(),info); + pWindow->OnInfo(item.get(),info); Refresh(); } } @@ -665,17 +636,17 @@ } case CONTEXT_BUTTON_INFO_ALL: - OnItemInfoAll(itemNumber); + OnInfoAll(itemNumber); return true; case CONTEXT_BUTTON_SET_DEFAULT: - CSettings::GetInstance().SetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW, GetQuickpathName(item->GetPath())); - CSettings::GetInstance().Save(); + CSettings::Get().SetString("mymusic.defaultlibview", GetQuickpathName(item->GetPath())); + CSettings::Get().Save(); return true; case CONTEXT_BUTTON_CLEAR_DEFAULT: - CSettings::GetInstance().SetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW, ""); - CSettings::GetInstance().Save(); + CSettings::Get().SetString("mymusic.defaultlibview", ""); + CSettings::Get().Save(); return true; case CONTEXT_BUTTON_GO_TO_ARTIST: @@ -684,7 +655,7 @@ CVideoDatabase database; database.Open(); strPath = StringUtils::Format("videodb://musicvideos/artists/%i/", - database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString())); + database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator))); g_windowManager.ActivateWindow(WINDOW_VIDEO_NAV,strPath); return true; } @@ -694,15 +665,12 @@ CVideoDatabase database; database.Open(); CVideoInfoTag details; - database.GetMusicVideoInfo("", details, database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString(), item->GetMusicInfoTag()->GetAlbum(), item->GetMusicInfoTag()->GetTitle())); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast(new CFileItem(details))); + database.GetMusicVideoInfo("",details,database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator),item->GetMusicInfoTag()->GetAlbum(),item->GetMusicInfoTag()->GetTitle())); + CApplicationMessenger::Get().PlayFile(CFileItem(details)); return true; } case CONTEXT_BUTTON_RENAME: - if (!item->IsVideoDb() && !item->IsReadOnly()) - OnRenameItem(itemNumber); - CGUIDialogVideoInfo::UpdateVideoItemTitle(item); CUtil::DeleteVideoDatabaseDirectoryCache(); Refresh(); @@ -714,8 +682,6 @@ item->m_bIsFolder = false; CFileUtils::DeleteItem(item); } - else if (!item->IsVideoDb()) - OnDeleteItem(itemNumber); else { CGUIDialogVideoInfo::DeleteVideoItemFromDatabase(item); @@ -747,7 +713,7 @@ if (!m_musicdatabase.GetScraperForPath(path, scraper, ADDON::ScraperTypeFromContent(content))) { ADDON::AddonPtr defaultScraper; - if (ADDON::CAddonMgr::GetInstance().GetDefault(ADDON::ScraperTypeFromContent(content), defaultScraper)) + if (ADDON::CAddonMgr::Get().GetDefault(ADDON::ScraperTypeFromContent(content), defaultScraper)) { scraper = std::dynamic_pointer_cast(defaultScraper->Clone()); } @@ -756,12 +722,12 @@ if (CGUIDialogContentSettings::Show(scraper, content)) { m_musicdatabase.SetScraperForPath(path,scraper); - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{20442}, CVariant{20443})) + if (CGUIDialogYesNo::ShowAndGetInput(20442, 20443)) { - OnItemInfoAll(itemNumber,true,true); + OnInfoAll(itemNumber,true,true); } - } + } return true; } @@ -786,13 +752,13 @@ items.SetPath(strPlayList); CLog::Log(LOGDEBUG,"CGUIWindowMusicNav, opening playlist [%s]", strPlayList.c_str()); - std::unique_ptr pPlayList (CPlayListFactory::Create(strPlayList)); + unique_ptr pPlayList (CPlayListFactory::Create(strPlayList)); if ( NULL != pPlayList.get()) { // load it if (!pPlayList->Load(strPlayList)) { - CGUIDialogOK::ShowAndGetInput(CVariant{6}, CVariant{477}); + CGUIDialogOK::ShowAndGetInput(6, 477); return false; //hmmm unable to load playlist? } CPlayList playlist = *pPlayList; @@ -806,6 +772,11 @@ return true; } +void CGUIWindowMusicNav::DisplayEmptyDatabaseMessage(bool bDisplay) +{ + m_bDisplayEmptyDatabaseMessage = bDisplay; +} + void CGUIWindowMusicNav::OnSearchUpdate() { std::string search(CURL::Encode(GetProperty("search").asString())); @@ -830,6 +801,10 @@ m_searchTimer.Stop(); OnSearchUpdate(); } + if (m_bDisplayEmptyDatabaseMessage) + SET_CONTROL_LABEL(CONTROL_LABELEMPTY,g_localizeStrings.Get(745)+'\n'+g_localizeStrings.Get(746)); + else + SET_CONTROL_LABEL(CONTROL_LABELEMPTY,""); CGUIWindowMusicBase::FrameMove(); } @@ -900,8 +875,5 @@ return "musicdb://compilations/"; else if (lower == "years") return "musicdb://years/"; - else if (lower == "files") - return "sources://music/"; - return CGUIWindowMusicBase::GetStartFolder(dir); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicNav.h kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicNav.h --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicNav.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicNav.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,7 +25,7 @@ class CFileItemList; -class CGUIWindowMusicNav : public CGUIWindowMusicBase +class CGUIWindowMusicNav : public CGUIWindowMusicBase, public IBackgroundLoaderObserver { public: @@ -50,10 +50,15 @@ virtual std::string GetStartFolder(const std::string &url); bool GetSongsFromPlayList(const std::string& strPlayList, CFileItemList &items); + void DisplayEmptyDatabaseMessage(bool bDisplay); std::string GetQuickpathName(const std::string& strPath) const; VECSOURCES m_shares; + bool m_bDisplayEmptyDatabaseMessage; ///< If true we display a message informing the user to switch back to the Files view. + + CMusicThumbLoader m_thumbLoader; ///< used for the loading of thumbs in the special://musicplaylist folder + // searching void OnSearchUpdate(); void AddSearchFolder(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicPlaylist.cpp kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicPlaylist.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicPlaylist.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicPlaylist.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -40,7 +40,6 @@ #include "utils/StringUtils.h" #include "utils/log.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" using namespace PLAYLIST; @@ -140,8 +139,8 @@ if (!g_partyModeManager.IsEnabled()) { g_playlistPlayer.SetShuffle(PLAYLIST_MUSIC, !(g_playlistPlayer.IsShuffled(PLAYLIST_MUSIC))); - CMediaSettings::GetInstance().SetMusicPlaylistShuffled(g_playlistPlayer.IsShuffled(PLAYLIST_MUSIC)); - CSettings::GetInstance().Save(); + CMediaSettings::Get().SetMusicPlaylistShuffled(g_playlistPlayer.IsShuffled(PLAYLIST_MUSIC)); + CSettings::Get().Save(); UpdateButtons(); Refresh(); } @@ -190,8 +189,8 @@ g_playlistPlayer.SetRepeat(PLAYLIST_MUSIC, PLAYLIST::REPEAT_NONE); // save settings - CMediaSettings::GetInstance().SetMusicPlaylistRepeat(g_playlistPlayer.GetRepeat(PLAYLIST_MUSIC) == PLAYLIST::REPEAT_ALL); - CSettings::GetInstance().Save(); + CMediaSettings::Get().SetMusicPlaylistRepeat(g_playlistPlayer.GetRepeat(PLAYLIST_MUSIC) == PLAYLIST::REPEAT_ALL); + CSettings::Get().Save(); UpdateButtons(); } @@ -283,10 +282,10 @@ void CGUIWindowMusicPlayList::SavePlayList() { std::string strNewFileName; - if (CGUIKeyboardFactory::ShowAndGetInput(strNewFileName, CVariant{g_localizeStrings.Get(16012)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(strNewFileName, g_localizeStrings.Get(16012), false)) { // need 2 rename it - std::string strFolder = URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH), "music"); + std::string strFolder = URIUtils::AddFileToFolder(CSettings::Get().GetString("system.playlistspath"), "music"); strNewFileName = CUtil::MakeLegalFileName(strNewFileName); strNewFileName += ".m3u"; std::string strPath = URIUtils::AddFileToFolder(strFolder, strNewFileName); @@ -447,10 +446,14 @@ { if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->Loaded()) { // set label 1+2 from tags - std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_NOWPLAYINGTRACKFORMAT); - if (strTrack.empty()) - strTrack = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - CLabelFormatter formatter(strTrack, "%D"); + if (m_guiState.get()) m_hideExtensions = m_guiState->HideExtensions(); + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.nowplayingtrackformat"); + if (strTrackLeft.empty()) + strTrackLeft = CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.nowplayingtrackformatright"); + if (strTrackRight.empty()) + strTrackRight = CSettings::Get().GetString("musicfiles.trackformatright"); + CLabelFormatter formatter(strTrackLeft, strTrackRight); formatter.FormatLabels(pItem); } // if (pItem->m_musicInfoTag.Loaded()) else @@ -513,7 +516,7 @@ { // aren't in a move // check what players we have, if we have multiple display play with option VECPLAYERCORES vecCores; - CPlayerCoreFactory::GetInstance().GetPlayers(*item, vecCores); + CPlayerCoreFactory::Get().GetPlayers(*item, vecCores); if (vecCores.size() > 1) buttons.Add(CONTEXT_BUTTON_PLAY_WITH, 15213); // Play With... @@ -540,7 +543,7 @@ } if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) - CContextMenuManager::GetInstance().AddVisibleItems(m_vecItems->Get(itemNumber), buttons); + CContextMenuManager::Get().AddVisibleItems(m_vecItems->Get(itemNumber), buttons); } bool CGUIWindowMusicPlayList::OnContextButton(int itemNumber, CONTEXT_BUTTON button) @@ -556,8 +559,8 @@ break; VECPLAYERCORES vecCores; - CPlayerCoreFactory::GetInstance().GetPlayers(*item, vecCores); - g_application.m_eForcedNextPlayer = CPlayerCoreFactory::GetInstance().SelectPlayerDialog(vecCores); + CPlayerCoreFactory::Get().GetPlayers(*item, vecCores); + g_application.m_eForcedNextPlayer = CPlayerCoreFactory::Get().SelectPlayerDialog(vecCores); if( g_application.m_eForcedNextPlayer != EPC_NONE ) OnClick(itemNumber); return true; @@ -600,7 +603,7 @@ case CONTEXT_BUTTON_EDIT_PARTYMODE: { - std::string playlist = CProfilesManager::GetInstance().GetUserDataItem("PartyMode.xsp"); + std::string playlist = CProfilesManager::Get().GetUserDataItem("PartyMode.xsp"); if (CGUIDialogSmartPlaylistEditor::EditPlaylist(playlist)) { // apply new rules diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicPlaylistEditor.cpp kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicPlaylistEditor.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicPlaylistEditor.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicPlaylistEditor.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,6 @@ #include "Util.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "Autorun.h" #include "dialogs/GUIDialogFileBrowser.h" #include "filesystem/PlaylistFileDirectory.h" @@ -48,6 +47,7 @@ CGUIWindowMusicPlaylistEditor::CGUIWindowMusicPlaylistEditor(void) : CGUIWindowMusicBase(WINDOW_MUSIC_PLAYLIST_EDITOR, "MyMusicPlaylistEditor.xml") { + m_thumbLoader.SetObserver(this); m_playlistThumbLoader.SetObserver(this); m_playlist = new CFileItemList; } @@ -325,7 +325,7 @@ } buttons.Add(CONTEXT_BUTTON_LOAD, 21385); - CContextMenuManager::GetInstance().AddVisibleItems(item, buttons); + CContextMenuManager::Get().AddVisibleItems(item, buttons); } bool CGUIWindowMusicPlaylistEditor::OnContextButton(int itemNumber, CONTEXT_BUTTON button) @@ -402,11 +402,11 @@ std::string name = URIUtils::GetFileName(m_strLoadedPlaylist); URIUtils::RemoveExtension(name); - if (CGUIKeyboardFactory::ShowAndGetInput(name, CVariant{g_localizeStrings.Get(16012)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(name, g_localizeStrings.Get(16012), false)) { // save playlist as an .m3u PLAYLIST::CPlayListM3U playlist; playlist.Add(*m_playlist); - std::string strBase = URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH), "music"); + std::string strBase = URIUtils::AddFileToFolder(CSettings::Get().GetString("system.playlistspath"), "music"); std::string path = URIUtils::AddFileToFolder(strBase, name + ".m3u"); playlist.Save(path); m_strLoadedPlaylist = name; @@ -416,7 +416,7 @@ void CGUIWindowMusicPlaylistEditor::AppendToPlaylist(CFileItemList &newItems) { OnRetrieveMusicInfo(newItems); - FormatItemLabels(newItems, LABEL_MASKS(CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT), "%D", "%L", "")); + FormatItemLabels(newItems, LABEL_MASKS(CSettings::Get().GetString("musicfiles.trackformat"), CSettings::Get().GetString("musicfiles.trackformatright"), "%L", "")); m_playlist->Append(newItems); UpdatePlaylist(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicPlaylistEditor.h kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicPlaylistEditor.h --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicPlaylistEditor.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicPlaylistEditor.h 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,7 @@ class CFileItemList; -class CGUIWindowMusicPlaylistEditor : public CGUIWindowMusicBase +class CGUIWindowMusicPlaylistEditor : public CGUIWindowMusicBase, public IBackgroundLoaderObserver { public: CGUIWindowMusicPlaylistEditor(void); @@ -34,6 +34,7 @@ virtual bool OnBack(int actionID); protected: + virtual void OnItemLoaded(CFileItem* pItem) {}; virtual bool GetDirectory(const std::string &strDirectory, CFileItemList &items); virtual void UpdateButtons(); virtual bool Update(const std::string &strDirectory, bool updateFilterPath = true); @@ -60,6 +61,7 @@ void DeleteRemoveableMediaDirectoryCache(); + CMusicThumbLoader m_thumbLoader; CMusicThumbLoader m_playlistThumbLoader; CFileItemList* m_playlist; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicPlaylist.h kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicPlaylist.h --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicPlaylist.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicPlaylist.h 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,7 @@ #include "GUIWindowMusicBase.h" #include "BackgroundInfoLoader.h" -class CGUIWindowMusicPlayList : public CGUIWindowMusicBase +class CGUIWindowMusicPlayList : public CGUIWindowMusicBase, public IBackgroundLoaderObserver { public: CGUIWindowMusicPlayList(void); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicSongs.cpp kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicSongs.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicSongs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicSongs.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,515 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "system.h" +#include "GUIWindowMusicSongs.h" +#include "Util.h" +#include "GUIInfoManager.h" +#include "Application.h" +#include "GUIPassword.h" +#include "dialogs/GUIDialogYesNo.h" +#include "GUIUserMessages.h" +#include "FileItem.h" +#include "profiles/ProfilesManager.h" +#include "storage/MediaManager.h" +#include "settings/MediaSourceSettings.h" +#include "settings/Settings.h" +#include "input/Key.h" +#include "guilib/LocalizeStrings.h" +#include "utils/URIUtils.h" +#include "utils/StringUtils.h" +#include "Autorun.h" +#include "cdrip/CDDARipper.h" +#include "ContextMenuManager.h" + +#define CONTROL_BTNVIEWASICONS 2 +#define CONTROL_BTNSORTBY 3 +#define CONTROL_BTNSORTASC 4 +#define CONTROL_BTNTYPE 5 +#define CONTROL_LABELFILES 12 + +#define CONTROL_BTNPLAYLISTS 7 +#define CONTROL_BTNSCAN 9 +#define CONTROL_BTNREC 10 +#define CONTROL_BTNRIP 11 + +#ifdef HAS_DVD_DRIVE +using namespace MEDIA_DETECT; +#endif + +CGUIWindowMusicSongs::CGUIWindowMusicSongs(void) + : CGUIWindowMusicBase(WINDOW_MUSIC_FILES, "MyMusicSongs.xml") +{ + m_vecItems->SetPath("?"); + + m_thumbLoader.SetObserver(this); + // Remove old HD cache every time XBMC is loaded + CUtil::DeleteDirectoryCache(); +} + +CGUIWindowMusicSongs::~CGUIWindowMusicSongs(void) +{ +} + +bool CGUIWindowMusicSongs::OnMessage(CGUIMessage& message) +{ + switch ( message.GetMessage() ) + { + case GUI_MSG_WINDOW_DEINIT: + if (m_thumbLoader.IsLoading()) + m_thumbLoader.StopThread(); + break; + case GUI_MSG_WINDOW_INIT: + { + // removed the start window check from files view + // the window translator does it by using a virtual window id (5) + + // is this the first time the window is opened? + if (m_vecItems->GetPath() == "?" && message.GetStringParam().empty()) + message.SetStringParam(CMediaSourceSettings::Get().GetDefaultSource("music")); + + return CGUIWindowMusicBase::OnMessage(message); + } + break; + + case GUI_MSG_DIRECTORY_SCANNED: + { + CFileItem directory(message.GetStringParam(), true); + + // Only update thumb on a local drive + if (directory.IsHD()) + { + std::string strParent; + URIUtils::GetParentPath(directory.GetPath(), strParent); + if (directory.GetPath() == m_vecItems->GetPath() || strParent == m_vecItems->GetPath()) + Refresh(); + } + } + break; + + case GUI_MSG_NOTIFY_ALL: + { + if (message.GetParam1()==GUI_MSG_REMOVED_MEDIA) + DeleteRemoveableMediaDirectoryCache(); + } + break; + + case GUI_MSG_CLICKED: + { + int iControl = message.GetSenderId(); + + if (iControl == CONTROL_BTNPLAYLISTS) + { + if (!m_vecItems->IsPath("special://musicplaylists/")) + Update("special://musicplaylists/"); + } + else if (iControl == CONTROL_BTNSCAN) + { + OnScan(-1); + } + else if (iControl == CONTROL_BTNREC) + { + if (g_application.m_pPlayer->IsPlayingAudio() ) + { + if (g_application.m_pPlayer->CanRecord() ) + { + bool bIsRecording = g_application.m_pPlayer->IsRecording(); + g_application.m_pPlayer->Record(!bIsRecording); + UpdateButtons(); + } + } + } + else if (iControl == CONTROL_BTNRIP) + { + OnRipCD(); + } + } + break; + } + + return CGUIWindowMusicBase::OnMessage(message); +} + +bool CGUIWindowMusicSongs::OnAction(const CAction& action) +{ + if (action.GetID() == ACTION_SCAN_ITEM) + { + int item = m_viewControl.GetSelectedItem(); + if (item > -1 && m_vecItems->Get(item)->m_bIsFolder) + OnScan(item); + + return true; + } + + return CGUIWindowMusicBase::OnAction(action); +} + +void CGUIWindowMusicSongs::OnScan(int iItem) +{ + std::string strPath; + if (iItem < 0 || iItem >= m_vecItems->Size()) + strPath = m_vecItems->GetPath(); + else if (m_vecItems->Get(iItem)->m_bIsFolder) + strPath = m_vecItems->Get(iItem)->GetPath(); + else + { // TODO: MUSICDB - should we allow scanning a single item into the database? + // This will require changes to the info scanner, which assumes we're running on a folder + strPath = m_vecItems->GetPath(); + } + DoScan(strPath); +} + +void CGUIWindowMusicSongs::DoScan(const std::string &strPath) +{ + if (g_application.IsMusicScanning()) + { + g_application.StopMusicScan(); + return; + } + + // Start background loader + int iControl=GetFocusedControlID(); + g_application.StartMusicScan(strPath); + SET_CONTROL_FOCUS(iControl, 0); + UpdateButtons(); + + return; +} + +bool CGUIWindowMusicSongs::GetDirectory(const std::string &strDirectory, CFileItemList &items) +{ + if (!CGUIWindowMusicBase::GetDirectory(strDirectory, items)) + return false; + + // check for .CUE files here. + items.FilterCueItems(); + + std::string label; + if (items.GetLabel().empty() && m_rootDir.IsSource(items.GetPath(), CMediaSourceSettings::Get().GetSources("music"), &label)) + items.SetLabel(label); + + return true; +} + +void CGUIWindowMusicSongs::OnPrepareFileItems(CFileItemList &items) +{ + CGUIWindowMusicBase::OnPrepareFileItems(items); + + RetrieveMusicInfo(); +} + +void CGUIWindowMusicSongs::UpdateButtons() +{ + CGUIWindowMusicBase::UpdateButtons(); + + bool bIsPlaying = g_application.m_pPlayer->IsPlayingAudio(); + bool bCanRecord = false; + bool bIsRecording = false; + + if (bIsPlaying) + { + bCanRecord = g_application.m_pPlayer->CanRecord(); + bIsRecording = g_application.m_pPlayer->IsRecording(); + } + + // Update Record button + if (bIsPlaying && bCanRecord) + { + CONTROL_ENABLE(CONTROL_BTNREC); + if (bIsRecording) + { + SET_CONTROL_LABEL(CONTROL_BTNREC, 265); //Stop Recording + } + else + { + SET_CONTROL_LABEL(CONTROL_BTNREC, 264); //Record + } + } + else + { + SET_CONTROL_LABEL(CONTROL_BTNREC, 264); //Record + CONTROL_DISABLE(CONTROL_BTNREC); + } + + // Update CDDA Rip button + if (g_mediaManager.IsAudio()) + { + CONTROL_ENABLE(CONTROL_BTNRIP); + } + else + { + CONTROL_DISABLE(CONTROL_BTNRIP); + } + + // Disable scan button if shoutcast + if (m_vecItems->IsVirtualDirectoryRoot() || + m_vecItems->IsMusicDb()) + { + CONTROL_DISABLE(CONTROL_BTNSCAN); + } + else + { + CONTROL_ENABLE(CONTROL_BTNSCAN); + } + + if (g_application.IsMusicScanning()) + { + SET_CONTROL_LABEL(CONTROL_BTNSCAN, 14056); // Stop Scan + } + else + { + SET_CONTROL_LABEL(CONTROL_BTNSCAN, 102); // Scan + } + + // Update object count label + std::string items = StringUtils::Format("%i %s", m_vecItems->GetObjectCount(), g_localizeStrings.Get(127).c_str()); + SET_CONTROL_LABEL(CONTROL_LABELFILES, items); +} + +void CGUIWindowMusicSongs::GetContextButtons(int itemNumber, CContextButtons &buttons) +{ + CFileItemPtr item; + if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) + item = m_vecItems->Get(itemNumber); + + if (item) + { + // are we in the playlists location? + bool inPlaylists = m_vecItems->IsPath(CUtil::MusicPlaylistsLocation()) || + m_vecItems->IsPath("special://musicplaylists/"); + + if (m_vecItems->IsVirtualDirectoryRoot() || m_vecItems->GetPath() == "sources://music/") + { + // get the usual music shares, and anything for all media windows + CGUIDialogContextMenu::GetContextButtons("music", item, buttons); +#ifdef HAS_DVD_DRIVE + // enable Rip CD an audio disc + if (g_mediaManager.IsDiscInDrive() && item->IsCDDA()) + { + // those cds can also include Audio Tracks: CDExtra and MixedMode! + CCdInfo *pCdInfo = g_mediaManager.GetCdInfo(); + if (pCdInfo->IsAudio(1) || pCdInfo->IsCDExtra(1) || pCdInfo->IsMixedMode(1)) + { + if (CJobManager::GetInstance().IsProcessing("cdrip")) + buttons.Add(CONTEXT_BUTTON_CANCEL_RIP_CD, 14100); + else + buttons.Add(CONTEXT_BUTTON_RIP_CD, 600); + } + } +#endif + CGUIMediaWindow::GetContextButtons(itemNumber, buttons); + } + else + { + CGUIWindowMusicBase::GetContextButtons(itemNumber, buttons); + if (item->GetProperty("pluginreplacecontextitems").asBoolean()) + return; + if (!item->IsPlayList() && !item->IsPlugin() && !item->IsScript()) + { + if (item->IsAudio()) + buttons.Add(CONTEXT_BUTTON_SONG_INFO, 658); // Song Info + else if (!item->IsParentFolder() && + !StringUtils::StartsWithNoCase(item->GetPath(), "new") && item->m_bIsFolder) + { + if (m_musicdatabase.GetAlbumIdByPath(item->GetPath()) > -1) + buttons.Add(CONTEXT_BUTTON_INFO, 13351); // Album Info + } + } + +#ifdef HAS_DVD_DRIVE + // enable Rip CD Audio or Track button if we have an audio disc + if (g_mediaManager.IsDiscInDrive() && m_vecItems->IsCDDA()) + { + // those cds can also include Audio Tracks: CDExtra and MixedMode! + CCdInfo *pCdInfo = g_mediaManager.GetCdInfo(); + if (pCdInfo->IsAudio(1) || pCdInfo->IsCDExtra(1) || pCdInfo->IsMixedMode(1)) + buttons.Add(CONTEXT_BUTTON_RIP_TRACK, 610); + } +#endif + + // enable CDDB lookup if the current dir is CDDA + if (g_mediaManager.IsDiscInDrive() && m_vecItems->IsCDDA() && + (CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser)) + { + buttons.Add(CONTEXT_BUTTON_CDDB, 16002); + } + + if (!item->IsParentFolder() && !item->IsReadOnly()) + { + // either we're at the playlist location or its been explicitly allowed + if (inPlaylists || CSettings::Get().GetBool("filelists.allowfiledeletion")) + { + buttons.Add(CONTEXT_BUTTON_DELETE, 117); + buttons.Add(CONTEXT_BUTTON_RENAME, 118); + } + } + } + + // Add the scan button(s) + if (g_application.IsMusicScanning()) + buttons.Add(CONTEXT_BUTTON_STOP_SCANNING, 13353); // Stop Scanning + else if (!inPlaylists && !m_vecItems->IsInternetStream() && + !item->IsPath("add") && !item->IsParentFolder() && + !item->IsPlugin() && + !StringUtils::StartsWithNoCase(item->GetPath(), "addons://") && + (CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser)) + { + buttons.Add(CONTEXT_BUTTON_SCAN, 13352); + } + if (item->IsPlugin() || item->IsScript() || m_vecItems->IsPlugin()) + buttons.Add(CONTEXT_BUTTON_PLUGIN_SETTINGS, 1045); + } + if (!m_vecItems->IsVirtualDirectoryRoot() && !m_vecItems->IsPlugin()) + buttons.Add(CONTEXT_BUTTON_SWITCH_MEDIA, 523); + CGUIWindowMusicBase::GetNonContextButtons(buttons); + + CContextMenuManager::Get().AddVisibleItems(item, buttons); +} + +bool CGUIWindowMusicSongs::OnContextButton(int itemNumber, CONTEXT_BUTTON button) +{ + CFileItemPtr item; + if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) + item = m_vecItems->Get(itemNumber); + if (CGUIDialogContextMenu::OnContextButton("music", item, button)) + { + if (button == CONTEXT_BUTTON_REMOVE_SOURCE) + OnRemoveSource(itemNumber); + + Update(""); + return true; + } + + switch (button) + { + case CONTEXT_BUTTON_SCAN: + OnScan(itemNumber); + return true; + + case CONTEXT_BUTTON_RIP_TRACK: + OnRipTrack(itemNumber); + return true; + + case CONTEXT_BUTTON_RIP_CD: + OnRipCD(); + return true; + +#ifdef HAS_CDDA_RIPPER + case CONTEXT_BUTTON_CANCEL_RIP_CD: + CCDDARipper::GetInstance().CancelJobs(); + return true; +#endif + + case CONTEXT_BUTTON_CDDB: + if (m_musicdatabase.LookupCDDBInfo(true)) + Refresh(); + return true; + + case CONTEXT_BUTTON_DELETE: + OnDeleteItem(itemNumber); + return true; + + case CONTEXT_BUTTON_RENAME: + OnRenameItem(itemNumber); + return true; + + case CONTEXT_BUTTON_SWITCH_MEDIA: + CGUIDialogContextMenu::SwitchMedia("music", m_vecItems->GetPath()); + return true; + default: + break; + } + return CGUIWindowMusicBase::OnContextButton(itemNumber, button); +} + +void CGUIWindowMusicSongs::DeleteRemoveableMediaDirectoryCache() +{ + CUtil::DeleteDirectoryCache("r-"); +} + +void CGUIWindowMusicSongs::PlayItem(int iItem) +{ + // unlike additemtoplaylist, we need to check the items here + // before calling it since the current playlist will be stopped + // and cleared! + + // we're at the root source listing + if (m_vecItems->IsVirtualDirectoryRoot() && !m_vecItems->Get(iItem)->IsDVD()) + return; + +#ifdef HAS_DVD_DRIVE + if (m_vecItems->Get(iItem)->IsDVD()) + MEDIA_DETECT::CAutorun::PlayDiscAskResume(m_vecItems->Get(iItem)->GetPath()); + else +#endif + CGUIWindowMusicBase::PlayItem(iItem); +} + +bool CGUIWindowMusicSongs::Update(const std::string &strDirectory, bool updateFilterPath /* = true */) +{ + if (m_thumbLoader.IsLoading()) + m_thumbLoader.StopThread(); + + if (!CGUIMediaWindow::Update(strDirectory, updateFilterPath)) + return false; + + if (m_vecItems->GetContent().empty()) + m_vecItems->SetContent("files"); + m_thumbLoader.Load(*m_vecItems); + + return true; +} + +void CGUIWindowMusicSongs::OnRemoveSource(int iItem) +{ + bool bCanceled; + if (CGUIDialogYesNo::ShowAndGetInput(522, 20340, bCanceled)) + { + MAPSONGS songs; + CMusicDatabase database; + database.Open(); + database.RemoveSongsFromPath(m_vecItems->Get(iItem)->GetPath(),songs,false); + database.CleanupOrphanedItems(); + g_infoManager.ResetLibraryBools(); + } +} + +std::string CGUIWindowMusicSongs::GetStartFolder(const std::string &dir) +{ + SetupShares(); + VECSOURCES shares; + m_rootDir.GetSources(shares); + bool bIsSourceName = false; + int iIndex = CUtil::GetMatchingSource(dir, shares, bIsSourceName); + if (iIndex > -1) + { + if (iIndex < (int)shares.size() && shares[iIndex].m_iHasLock == 2) + { + CFileItem item(shares[iIndex]); + if (!g_passwordManager.IsItemUnlocked(&item,"music")) + return ""; + } + // set current directory to matching share + if (bIsSourceName) + return shares[iIndex].strPath; + return dir; + } + return CGUIWindowMusicBase::GetStartFolder(dir); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicSongs.h kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicSongs.h --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowMusicSongs.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowMusicSongs.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,53 @@ +#pragma once +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "GUIWindowMusicBase.h" +#include "music/MusicThumbLoader.h" + +class CGUIWindowMusicSongs : public CGUIWindowMusicBase, public IBackgroundLoaderObserver +{ +public: + CGUIWindowMusicSongs(void); + virtual ~CGUIWindowMusicSongs(void); + + virtual bool OnMessage(CGUIMessage& message); + virtual bool OnAction(const CAction& action); + + void DoScan(const std::string &strPath); +protected: + virtual void OnItemLoaded(CFileItem* pItem) {}; + virtual bool GetDirectory(const std::string &strDirectory, CFileItemList &items); + virtual void UpdateButtons(); + virtual bool Update(const std::string &strDirectory, bool updateFilterPath = true); + virtual void OnPrepareFileItems(CFileItemList &items); + virtual void GetContextButtons(int itemNumber, CContextButtons &buttons); + virtual bool OnContextButton(int itemNumber, CONTEXT_BUTTON button); + virtual void OnScan(int iItem); + virtual void OnRemoveSource(int iItem); + virtual std::string GetStartFolder(const std::string &dir); + + // new method + virtual void PlayItem(int iItem); + + void DeleteRemoveableMediaDirectoryCache(); + + CMusicThumbLoader m_thumbLoader; +}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowVisualisation.cpp kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowVisualisation.cpp --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/GUIWindowVisualisation.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/GUIWindowVisualisation.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,12 +20,10 @@ #include "GUIWindowVisualisation.h" #include "Application.h" -#include "FileItem.h" #include "music/dialogs/GUIDialogMusicOSD.h" #include "GUIUserMessages.h" #include "GUIInfoManager.h" #include "guilib/GUIWindowManager.h" -#include "input/ButtonTranslator.h" #include "input/Key.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" @@ -46,17 +44,6 @@ bool CGUIWindowVisualisation::OnAction(const CAction &action) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPLAYBACK_CONFIRMCHANNELSWITCH) && - g_infoManager.IsPlayerChannelPreviewActive() && - (action.GetID() == ACTION_SELECT_ITEM || CButtonTranslator::GetInstance().GetGlobalAction(action.GetButtonCode()).GetID() == ACTION_SELECT_ITEM)) - { - // If confirm channel switch is active, channel preview is currently shown - // and the button that caused this action matches (global) action "Select" (OK) - // switch to the channel currently displayed within the preview. - g_application.m_pPlayer->SwitchChannel(g_application.CurrentFileItem().GetPVRChannelInfoTag()); - return true; - } - bool passToVis = false; switch (action.GetID()) { @@ -71,7 +58,7 @@ case ACTION_SHOW_INFO: { m_initTimer.Stop(); - CSettings::GetInstance().SetBool(CSettings::SETTING_MYMUSIC_SONGTHUMBINVIS, g_infoManager.ToggleShowInfo()); + CSettings::Get().SetBool("mymusic.songthumbinvis", g_infoManager.ToggleShowInfo()); return true; } break; @@ -82,7 +69,7 @@ case ACTION_SHOW_GUI: // save the settings - CSettings::GetInstance().Save(); + CSettings::Get().Save(); g_windowManager.PreviousWindow(); return true; break; @@ -163,7 +150,7 @@ case GUI_MSG_WINDOW_DEINIT: { if (IsActive()) // save any changed settings from the OSD - CSettings::GetInstance().Save(); + CSettings::Get().Save(); // close all active modal dialogs g_windowManager.CloseInternalModalDialogs(true); @@ -186,7 +173,7 @@ if (g_infoManager.GetCurrentSongTag()) m_tag = *g_infoManager.GetCurrentSongTag(); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYMUSIC_SONGTHUMBINVIS)) + if (CSettings::Get().GetBool("mymusic.songthumbinvis")) { // always on m_initTimer.Stop(); } @@ -216,7 +203,7 @@ if (pOSD) { pOSD->SetAutoClose(3000); - pOSD->Open(); + pOSD->DoModal(); } return EVENT_RESULT_HANDLED; } @@ -237,7 +224,7 @@ if (m_initTimer.IsRunning() && m_initTimer.GetElapsedSeconds() > (float)g_advancedSettings.m_songInfoDuration) { m_initTimer.Stop(); - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_MYMUSIC_SONGTHUMBINVIS)) + if (!CSettings::Get().GetBool("mymusic.songthumbinvis")) { // reached end of fade in, fade out again g_infoManager.SetShowInfo(false); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/music/windows/Makefile kodi-15.2~git20151019.1039-final/xbmc/music/windows/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/music/windows/Makefile 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/music/windows/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -2,6 +2,7 @@ GUIWindowMusicNav.cpp \ GUIWindowMusicPlaylist.cpp \ GUIWindowMusicPlaylistEditor.cpp \ + GUIWindowMusicSongs.cpp \ GUIWindowVisualisation.cpp \ LIB=musicwindows.a diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/AirPlayServer.cpp kodi-15.2~git20151019.1039-final/xbmc/network/AirPlayServer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/AirPlayServer.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/AirPlayServer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -36,7 +36,7 @@ #include "filesystem/Directory.h" #include "FileItem.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "utils/md5.h" #include "utils/Variant.h" #include "settings/Settings.h" @@ -49,7 +49,7 @@ #endif // HAS_ZEROCONF using namespace ANNOUNCEMENT; -using namespace KODI::MESSAGING; +using namespace std; #ifdef TARGET_WINDOWS #define close closesocket @@ -313,12 +313,12 @@ m_ServerSocket = INVALID_SOCKET; m_usePassword = false; m_origVolume = -1; - CAnnouncementManager::GetInstance().AddAnnouncer(this); + CAnnouncementManager::Get().AddAnnouncer(this); } CAirPlayServer::~CAirPlayServer() { - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); } void handleZeroconfAnnouncement() @@ -641,12 +641,12 @@ //from a string field1="value1", field2="value2" it parses the value to a field std::string getFieldFromString(const std::string &str, const char* field) { - std::vector tmpAr1 = StringUtils::Split(str, ","); - for(std::vector::const_iterator i = tmpAr1.begin(); i != tmpAr1.end(); ++i) + vector tmpAr1 = StringUtils::Split(str, ","); + for(vector::const_iterator i = tmpAr1.begin(); i != tmpAr1.end(); ++i) { if (i->find(field) != std::string::npos) { - std::vector tmpAr2 = StringUtils::Split(*i, "="); + vector tmpAr2 = StringUtils::Split(*i, "="); if (tmpAr2.size() == 2) { StringUtils::Replace(tmpAr2[1], "\"", "");//remove quotes @@ -734,7 +734,7 @@ { CSingleLock lock(ServerInstanceLock); - if (ServerInstance && ServerInstance->m_origVolume != -1 && CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_AIRPLAYVOLUMECONTROL)) + if (ServerInstance && ServerInstance->m_origVolume != -1 && CSettings::Get().GetBool("services.airplayvolumecontrol")) { g_application.SetVolume((float)ServerInstance->m_origVolume); ServerInstance->m_origVolume = -1; @@ -821,14 +821,14 @@ { if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE); + CApplicationMessenger::Get().MediaPause(); } } else { if (g_application.m_pPlayer->IsPausedPlayback()) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE); + CApplicationMessenger::Get().MediaPause(); } } } @@ -852,11 +852,11 @@ { float oldVolume = g_application.GetVolume(); volume *= 100; - if(oldVolume != volume && CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_AIRPLAYVOLUMECONTROL)) + if(oldVolume != volume && CSettings::Get().GetBool("services.airplayvolumecontrol")) { backupVolume(); g_application.SetVolume(volume); - CApplicationMessenger::GetInstance().PostMsg(TMSG_VOLUME_SHOW, oldVolume < volume ? ACTION_VOLUME_UP : ACTION_VOLUME_DOWN); + CApplicationMessenger::Get().ShowVolumeBar(oldVolume < volume); } } } @@ -981,15 +981,12 @@ // froce to internal dvdplayer cause it is the only // one who will work well with airplay g_application.m_eForcedNextPlayer = EPC_DVDPLAYER; - - CFileItemList *l = new CFileItemList; //don't delete, - l->Add(std::make_shared(fileToPlay)); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l)); + CApplicationMessenger::Get().MediaPlay(fileToPlay); // allow starting the player paused in ios8 mode (needed by camera roll app) - if (!startPlayback) + if (CSettings::Get().GetBool("services.airplayios8compat") && !startPlayback) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE); + CApplicationMessenger::Get().MediaPause(); g_application.m_pPlayer->SeekPercentage(position * 100.0f); } } @@ -1042,12 +1039,12 @@ { if (IsPlaying()) //only stop player if we started him { - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); + CApplicationMessenger::Get().MediaStop(); CAirPlayServer::m_isPlaying--; } else //if we are not playing and get the stop request - we just wanna stop picture streaming { - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(ACTION_STOP))); + CApplicationMessenger::Get().SendAction(ACTION_PREVIOUS_MENU); } } ClearPhotoAssetCache(); @@ -1118,7 +1115,7 @@ CLog::Log(LOGWARNING, "AIRPLAY: Asset %s not found in our cache.", photoCacheId.c_str()); } else - CApplicationMessenger::GetInstance().PostMsg(TMSG_PICTURE_SHOW, -1, -1, nullptr, tmpFileName); + CApplicationMessenger::Get().PictureShow(tmpFileName); } else { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/AirPlayServer.h kodi-15.2~git20151019.1039-final/xbmc/network/AirPlayServer.h --- kodi-16.1~git20160425.1001-final/xbmc/network/AirPlayServer.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/AirPlayServer.h 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,6 @@ #include "interfaces/IAnnouncer.h" class DllLibPlist; -class CVariant; #define AIRPLAY_SERVER_VERSION_STR "101.28" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/AirTunesServer.cpp kodi-15.2~git20151019.1039-final/xbmc/network/AirTunesServer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/AirTunesServer.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/AirTunesServer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,53 +21,45 @@ * */ -#include "system.h" +#include "network/Network.h" +#if !defined(TARGET_WINDOWS) +#pragma GCC diagnostic ignored "-Wwrite-strings" +#endif -#ifdef HAS_AIRTUNES #include "AirTunesServer.h" -#include -#include -#include +#ifdef HAS_AIRPLAY +#include "network/AirPlayServer.h" +#endif + +#ifdef HAS_AIRTUNES +#include "utils/log.h" +#include "network/Zeroconf.h" +#include "ApplicationMessenger.h" +#include "filesystem/PipeFile.h" #include "Application.h" #include "cores/dvdplayer/DVDDemuxers/DVDDemuxBXA.h" -#include "FileItem.h" #include "filesystem/File.h" -#include "filesystem/PipeFile.h" +#include "music/tags/MusicInfoTag.h" +#include "FileItem.h" #include "GUIInfoManager.h" #include "guilib/GUIWindowManager.h" -#include "interfaces/AnnouncementManager.h" -#include "messaging/ApplicationMessenger.h" -#include "music/tags/MusicInfoTag.h" -#include "network/dacp/dacp.h" -#include "network/Network.h" -#include "network/Zeroconf.h" -#include "network/ZeroconfBrowser.h" +#include "utils/Variant.h" +#include "utils/StringUtils.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" -#include "URL.h" #include "utils/EndianSwap.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/SystemInfo.h" -#include "utils/Variant.h" - -#if !defined(TARGET_WINDOWS) -#pragma GCC diagnostic ignored "-Wwrite-strings" -#endif +#include "URL.h" +#include "interfaces/AnnouncementManager.h" -#ifdef HAS_AIRPLAY -#include "network/AirPlayServer.h" -#endif +#include +#include -#define TMP_COVERART_PATH_JPG "special://temp/airtunes_album_thumb.jpg" -#define TMP_COVERART_PATH_PNG "special://temp/airtunes_album_thumb.png" -#define ZEROCONF_DACP_SERVICE "_dacp._tcp" +#define TMP_COVERART_PATH "special://temp/airtunes_album_thumb.jpg" using namespace XFILE; using namespace ANNOUNCEMENT; -using namespace KODI::MESSAGING; DllLibShairplay *CAirTunesServer::m_pLibShairplay = NULL; CAirTunesServer *CAirTunesServer::ServerInstance = NULL; @@ -75,15 +67,6 @@ std::string CAirTunesServer::m_metadata[3]; CCriticalSection CAirTunesServer::m_metadataLock; bool CAirTunesServer::m_streamStarted = false; -CCriticalSection CAirTunesServer::m_dacpLock; -CDACP *CAirTunesServer::m_pDACP = NULL; -std::string CAirTunesServer::m_dacp_id; -std::string CAirTunesServer::m_active_remote_header; -CCriticalSection CAirTunesServer::m_actionQueueLock; -std::list CAirTunesServer::m_actionQueue; -CEvent CAirTunesServer::m_processActions; -int CAirTunesServer::m_sampleRate = 44100; - //parse daap metadata - thx to project MythTV std::map decodeDMAP(const char *buffer, unsigned int size) @@ -109,8 +92,7 @@ { CSingleLock lock(m_metadataLock); - XFILE::CFile::Delete(TMP_COVERART_PATH_JPG); - XFILE::CFile::Delete(TMP_COVERART_PATH_PNG); + XFILE::CFile::Delete(TMP_COVERART_PATH); RefreshCoverArt(); m_metadata[0] = ""; @@ -123,8 +105,6 @@ { CSingleLock lock(m_metadataLock); MUSIC_INFO::CMusicInfoTag tag; - if (g_infoManager.GetCurrentSongTag()) - tag = *g_infoManager.GetCurrentSongTag(); if (m_metadata[0].length()) tag.SetAlbum(m_metadata[0]);//album if (m_metadata[1].length()) @@ -132,22 +112,17 @@ if (m_metadata[2].length()) tag.SetArtist(m_metadata[2]);//artist - CApplicationMessenger::GetInstance().PostMsg(TMSG_UPDATE_CURRENT_ITEM, 1, -1, static_cast(new CFileItem(tag))); + CApplicationMessenger::Get().SetCurrentSongTag(tag); } -void CAirTunesServer::RefreshCoverArt(const char *outputFilename/* = NULL*/) +void CAirTunesServer::RefreshCoverArt() { - static std::string coverArtFile = TMP_COVERART_PATH_JPG; - - if (outputFilename != NULL) - coverArtFile = std::string(outputFilename); - CSingleLock lock(m_metadataLock); //reset to empty before setting the new one //else it won't get refreshed because the name didn't change g_infoManager.SetCurrentAlbumThumb(""); //update the ui - g_infoManager.SetCurrentAlbumThumb(coverArtFile); + g_infoManager.SetCurrentAlbumThumb(TMP_COVERART_PATH); //update the ui CGUIMessage msg(GUI_MSG_NOTIFY_ALL,0,0,GUI_MSG_REFRESH_THUMBS); g_windowManager.SendThreadMessage(msg); @@ -177,150 +152,30 @@ { RefreshMetadata(); RefreshCoverArt(); - CSingleLock lock(m_dacpLock); - if (m_pDACP) - m_pDACP->Play(); - } - - if (strcmp(message, "OnStop") == 0 && m_streamStarted) - { - CSingleLock lock(m_dacpLock); - if (m_pDACP) - m_pDACP->Stop(); - } - - if (strcmp(message, "OnPause") == 0 && m_streamStarted) - { - CSingleLock lock(m_dacpLock); - if (m_pDACP) - m_pDACP->Pause(); - } - } -} - -void CAirTunesServer::EnableActionProcessing(bool enable) -{ - ServerInstance->RegisterActionListener(enable); -} - -bool CAirTunesServer::OnAction(const CAction &action) -{ - switch(action.GetID()) - { - case ACTION_NEXT_ITEM: - case ACTION_PREV_ITEM: - case ACTION_VOLUME_UP: - case ACTION_VOLUME_DOWN: - case ACTION_MUTE: - { - CSingleLock lock(m_actionQueueLock); - m_actionQueue.push_back(action); - m_processActions.Set(); } } - return false; -} - -void CAirTunesServer::Process() -{ - m_bStop = false; - while(!m_bStop) - { - if (m_streamStarted) - SetupRemoteControl();// check for remote controls - - m_processActions.WaitMSec(1000);// timeout for beeing able to stop - std::list currentActions; - { - CSingleLock lock(m_actionQueueLock);// copy and clear the source queue - currentActions.insert(currentActions.begin(), m_actionQueue.begin(), m_actionQueue.end()); - m_actionQueue.clear(); - } - - for (auto currentAction : currentActions) - { - CSingleLock lock(m_dacpLock); - if (m_pDACP) - { - switch(currentAction.GetID()) - { - case ACTION_NEXT_ITEM: - m_pDACP->NextItem(); - break; - case ACTION_PREV_ITEM: - m_pDACP->PrevItem(); - break; - case ACTION_VOLUME_UP: - m_pDACP->VolumeUp(); - break; - case ACTION_VOLUME_DOWN: - m_pDACP->VolumeDown(); - break; - case ACTION_MUTE: - m_pDACP->ToggleMute(); - break; - } - } - } - } -} - -bool IsJPEG(const char *buffer, unsigned int size) -{ - bool ret = false; - if (size < 2) - return false; - - //JPEG image files begin with FF D8 and end with FF D9. - // check for FF D8 big + little endian on start - if ((buffer[0] == (char)0xd8 && buffer[1] == (char)0xff) || - (buffer[1] == (char)0xd8 && buffer[0] == (char)0xff)) - ret = true; - - if (ret) - { - ret = false; - //check on FF D9 big + little endian on end - if ((buffer[size - 2] == (char)0xd9 && buffer[size - 1] == (char)0xff) || - (buffer[size - 1] == (char)0xd9 && buffer[size - 2] == (char)0xff)) - ret = true; - } - - return ret; } void CAirTunesServer::SetCoverArtFromBuffer(const char *buffer, unsigned int size) { XFILE::CFile tmpFile; - std::string tmpFilename = TMP_COVERART_PATH_PNG; if(!size) return; CSingleLock lock(m_metadataLock); - if (IsJPEG(buffer, size)) - tmpFilename = TMP_COVERART_PATH_JPG; - - if (tmpFile.OpenForWrite(tmpFilename, true)) + if (tmpFile.OpenForWrite(TMP_COVERART_PATH, true)) { int writtenBytes=0; writtenBytes = tmpFile.Write(buffer, size); tmpFile.Close(); if (writtenBytes > 0) - RefreshCoverArt(tmpFilename.c_str()); + RefreshCoverArt(); } } -void CAirTunesServer::FreeDACPRemote() -{ - CSingleLock lock(m_dacpLock); - if (m_pDACP) - delete m_pDACP; - m_pDACP = NULL; -} - #define RSA_KEY " \ -----BEGIN RSA PRIVATE KEY-----\ MIIEpQIBAAKCAQEA59dE8qLieItsH1WgjrcFRKj6eUWqi+bGLOX1HL3U3GhC/j0Qg90u3sG/1CUt\ @@ -356,7 +211,7 @@ CAirTunesServer::SetCoverArtFromBuffer((char *)buffer, buflen); } -char session[]="Kodi-AirTunes"; +char *session="Kodi-AirTunes"; void* CAirTunesServer::AudioOutputFunctions::audio_init(void *cls, int bits, int channels, int samplerate) { @@ -376,90 +231,24 @@ if (pipe->Write(&header, sizeof(header)) == 0) return 0; - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); + ThreadMessage tMsg = { TMSG_MEDIA_STOP }; + CApplicationMessenger::Get().SendMessage(tMsg, true); - CFileItem *item = new CFileItem(); - item->SetPath(pipe->GetName()); - item->SetMimeType("audio/x-xbmc-pcm"); + CFileItem item; + item.SetPath(pipe->GetName()); + item.SetMimeType("audio/x-xbmc-pcm"); m_streamStarted = true; - m_sampleRate = samplerate; - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast(item)); + CApplicationMessenger::Get().PlayFile(item); // Not all airplay streams will provide metadata (e.g. if using mirroring, // no metadata will be sent). If there *is* metadata, it will be received // in a later call to audio_set_metadata/audio_set_coverart. ResetMetadata(); - - // browse for dacp services protocol which gives us the remote control service - CZeroconfBrowser::GetInstance()->Start(); - CZeroconfBrowser::GetInstance()->AddServiceType(ZEROCONF_DACP_SERVICE); - CAirTunesServer::EnableActionProcessing(true); return session;//session } -void CAirTunesServer::AudioOutputFunctions::audio_remote_control_id(void *cls, const char *dacp_id, const char *active_remote_header) -{ - if (dacp_id && active_remote_header) - { - m_dacp_id = dacp_id; - m_active_remote_header = active_remote_header; - } -} - -void CAirTunesServer::AudioOutputFunctions::audio_set_progress(void *cls, void *session, unsigned int start, unsigned int curr, unsigned int end) -{ - unsigned int duration = end - start; - unsigned int position = curr - start; - duration /= m_sampleRate; - position /= m_sampleRate; - - if (g_application.m_pPlayer->GetInternal()) - { - g_application.m_pPlayer->GetInternal()->SetTime(position * 1000); - g_application.m_pPlayer->GetInternal()->SetTotalTime(duration * 1000); - } -} - -void CAirTunesServer::SetupRemoteControl() -{ - // check if we found the remote control service via zeroconf already or - // if no valid id and headers was received yet - if (m_dacp_id.empty() || m_active_remote_header.empty() || m_pDACP != NULL) - return; - - // check for the service matching m_dacp_id - std::vector services = CZeroconfBrowser::GetInstance()->GetFoundServices(); - for (auto service : services ) - { - if (StringUtils::CompareNoCase(service.GetType(), std::string(ZEROCONF_DACP_SERVICE) + ".") == 0) - { -#define DACP_NAME_PREFIX "iTunes_Ctrl_" - // name has the form "iTunes_Ctrl_56B29BB6CB904862" - // were we are interested in the 56B29BB6CB904862 identifier - if (StringUtils::StartsWithNoCase(service.GetName(), DACP_NAME_PREFIX)) - { - std::vector tokens = StringUtils::Split(service.GetName(), DACP_NAME_PREFIX); - // if we found the service matching the given identifier - if (tokens.size() > 1 && tokens[1] == m_dacp_id) - { - // resolve the service and save it - CZeroconfBrowser::GetInstance()->ResolveService(service); - CSingleLock lock(m_dacpLock); - // recheck with lock hold - if (m_pDACP == NULL) - { - // we can control the client with this object now - m_pDACP = new CDACP(m_active_remote_header, service.GetIP(), service.GetPort()); - } - break; - } - } - } - } -} - void CAirTunesServer::AudioOutputFunctions::audio_set_volume(void *cls, void *session, float volume) { //volume from -30 - 0 - -144 means mute @@ -467,7 +256,7 @@ #ifdef HAS_AIRPLAY CAirPlayServer::backupVolume(); #endif - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_AIRPLAYVOLUMECONTROL)) + if (CSettings::Get().GetBool("services.airplayvolumecontrol")) g_application.SetVolume(volPercent, false);//non-percent volume 0.0-1.0 } @@ -482,10 +271,6 @@ XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; pipe->SetEof(); pipe->Close(); - - CAirTunesServer::FreeDACPRemote(); - m_dacp_id.clear(); - m_active_remote_header.clear(); //fix airplay video for ios5 devices //on ios5 when airplaying video @@ -497,17 +282,12 @@ if (!CAirPlayServer::IsPlaying()) #endif { - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); + ThreadMessage tMsg = { TMSG_MEDIA_STOP }; + CApplicationMessenger::Get().SendMessage(tMsg, true); CLog::Log(LOGDEBUG, "AIRTUNES: AirPlay not running - stopping player"); } m_streamStarted = false; - - // no need to browse for dacp services while we don't receive - // any airtunes streams... - CZeroconfBrowser::GetInstance()->RemoveServiceType(ZEROCONF_DACP_SERVICE); - CZeroconfBrowser::GetInstance()->Stop(); - CAirTunesServer::EnableActionProcessing(false); } void shairplay_log(void *cls, int level, const char *msg) @@ -578,7 +358,7 @@ success = true; std::string appName = StringUtils::Format("%s@%s", m_macAddress.c_str(), - CSysInfo::GetDeviceName().c_str()); + g_infoManager.GetLabel(SYSTEM_FRIENDLY_NAME).c_str()); std::vector > txt; txt.push_back(std::make_pair("txtvers", "1")); @@ -628,11 +408,11 @@ } CAirTunesServer::CAirTunesServer(int port, bool nonlocal) -: CThread("AirTunesActionThread") { m_port = port; m_pLibShairplay = new DllLibShairplay(); - m_pPipe = new XFILE::CPipeFile; + m_pPipe = new XFILE::CPipeFile; + CAnnouncementManager::Get().AddAnnouncer(this); } CAirTunesServer::~CAirTunesServer() @@ -643,22 +423,7 @@ } delete m_pLibShairplay; delete m_pPipe; -} - -void CAirTunesServer::RegisterActionListener(bool doRegister) -{ - if (doRegister) - { - CAnnouncementManager::GetInstance().AddAnnouncer(this); - g_application.RegisterActionListener(this); - ServerInstance->Create(); - } - else - { - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); - g_application.UnregisterActionListener(this); - ServerInstance->StopThread(true); - } + CAnnouncementManager::Get().RemoveAnnouncer(this); } bool CAirTunesServer::Initialize(const std::string &password) @@ -678,8 +443,6 @@ ao.audio_set_coverart = AudioOutputFunctions::audio_set_coverart; ao.audio_process = AudioOutputFunctions::audio_process; ao.audio_destroy = AudioOutputFunctions::audio_destroy; - ao.audio_remote_control_id = AudioOutputFunctions::audio_remote_control_id; - ao.audio_set_progress = AudioOutputFunctions::audio_set_progress; m_pLibShairplay->EnableDelayedUnload(false); m_pRaop = m_pLibShairplay->raop_init(1, &ao, RSA_KEY);//1 - we handle one client at a time max ret = m_pRaop != NULL; @@ -712,8 +475,6 @@ void CAirTunesServer::Deinitialize() { - RegisterActionListener(false); - if (m_pLibShairplay && m_pLibShairplay->IsLoaded()) { m_pLibShairplay->raop_stop(m_pRaop); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/AirTunesServer.h kodi-15.2~git20151019.1039-final/xbmc/network/AirTunesServer.h --- kodi-16.1~git20160425.1001-final/xbmc/network/AirTunesServer.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/AirTunesServer.h 2015-10-19 08:39:16.000000000 +0000 @@ -32,45 +32,30 @@ #include #include #include -#include #include "threads/Thread.h" #include "threads/CriticalSection.h" #include "utils/HttpParser.h" #include "filesystem/PipeFile.h" #include "interfaces/IAnnouncer.h" -#include "interfaces/IActionListener.h" -class CDACP; -class CVariant; -class CAirTunesServer : public ANNOUNCEMENT::IAnnouncer, public IActionListener, public CThread +class CAirTunesServer : public ANNOUNCEMENT::IAnnouncer { public: - // ANNOUNCEMENT::IAnnouncer virtual void Announce(ANNOUNCEMENT::AnnouncementFlag flag, const char *sender, const char *message, const CVariant &data); - void RegisterActionListener(bool doRegister); - static void EnableActionProcessing(bool enable); - // IACtionListener - virtual bool OnAction(const CAction &action); - - //CThread - virtual void Process(); - static bool StartServer(int port, bool nonlocal, bool usePassword, const std::string &password=""); static void StopServer(bool bWait); static bool IsRunning(); static void SetMetadataFromBuffer(const char *buffer, unsigned int size); static void SetCoverArtFromBuffer(const char *buffer, unsigned int size); - static void SetupRemoteControl(); - static void FreeDACPRemote(); private: CAirTunesServer(int port, bool nonlocal); ~CAirTunesServer(); bool Initialize(const std::string &password); void Deinitialize(); - static void RefreshCoverArt(const char *outputFilename = NULL); + static void RefreshCoverArt(); static void RefreshMetadata(); static void ResetMetadata(); @@ -83,14 +68,6 @@ static CCriticalSection m_metadataLock; static std::string m_metadata[3];//0 - album, 1 - title, 2 - artist static bool m_streamStarted; - static CCriticalSection m_dacpLock; - static CDACP *m_pDACP; - static std::string m_dacp_id; - static std::string m_active_remote_header; - static CCriticalSection m_actionQueueLock; - static std::list m_actionQueue; - static CEvent m_processActions; - static int m_sampleRate; class AudioOutputFunctions { @@ -101,8 +78,6 @@ static void audio_set_coverart(void *cls, void *session, const void *buffer, int buflen); static void audio_process(void *cls, void *session, const void *buffer, int buflen); static void audio_destroy(void *cls, void *session); - static void audio_remote_control_id(void *cls, const char *identifier, const char *active_remote_header); - static void audio_set_progress(void *cls, void *session, unsigned int start, unsigned int curr, unsigned int end); }; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/cddb.cpp kodi-15.2~git20151019.1039-final/xbmc/network/cddb.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/cddb.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/cddb.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -38,25 +38,22 @@ #include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "filesystem/File.h" +#include "GUIInfoManager.h" #include "utils/CharsetConverter.h" #include "utils/log.h" -#include "utils/SystemInfo.h" -#include #include #include #include +using namespace std; using namespace MEDIA_DETECT; +using namespace AUTOPTR; using namespace CDDB; //------------------------------------------------------------------------------------------------------------------- Xcddb::Xcddb() -#if defined(TARGET_WINDOWS) - : m_cddb_socket(closesocket, INVALID_SOCKET) -#else - : m_cddb_socket(close, -1) -#endif + : m_cddb_socket(INVALID_SOCKET) , m_cddb_ip_adress(g_advancedSettings.m_cddbAddress) { m_lastError = 0; @@ -127,7 +124,7 @@ //------------------------------------------------------------------------------------------------------------------- bool Xcddb::closeSocket() { - if (m_cddb_socket) + if ( m_cddb_socket.isValid() ) { m_cddb_socket.reset(); } @@ -137,7 +134,7 @@ //------------------------------------------------------------------------------------------------------------------- bool Xcddb::Send( const void *buffer, int bytes ) { - std::unique_ptr tmp_buffer(new char[bytes + 10]); + auto_aptr tmp_buffer (new char[bytes + 10]); strcpy(tmp_buffer.get(), (const char*)buffer); tmp_buffer.get()[bytes] = '.'; tmp_buffer.get()[bytes + 1] = 0x0d; @@ -163,12 +160,12 @@ } //------------------------------------------------------------------------------------------------------------------- -std::string Xcddb::Recv(bool wait4point) +string Xcddb::Recv(bool wait4point) { char tmpbuffer[1]; char prevChar; int counter = 0; - std::string str_buffer; + string str_buffer; //########################################################## @@ -399,7 +396,7 @@ } // track artist" / "track title - std::vector values = StringUtils::Split(value, " / "); + vector values = StringUtils::Split(value, " / "); if (values.size() > 1) { g_charsetConverter.unknownToUTF8(values[0]); @@ -417,7 +414,7 @@ //------------------------------------------------------------------------------------------------------------------- const std::string& Xcddb::getInexactCommand(int select) const { - typedef std::map::const_iterator iter; + typedef map::const_iterator iter; iter i = m_mapInexact_cddb_command_list.find(select); if (i == m_mapInexact_cddb_command_list.end()) return m_strNull; @@ -427,7 +424,7 @@ //------------------------------------------------------------------------------------------------------------------- const std::string& Xcddb::getInexactArtist(int select) const { - typedef std::map::const_iterator iter; + typedef map::const_iterator iter; iter i = m_mapInexact_artist_list.find(select); if (i == m_mapInexact_artist_list.end()) return m_strNull; @@ -437,7 +434,7 @@ //------------------------------------------------------------------------------------------------------------------- const std::string& Xcddb::getInexactTitle(int select) const { - typedef std::map::const_iterator iter; + typedef map::const_iterator iter; iter i = m_mapInexact_title_list.find(select); if (i == m_mapInexact_title_list.end()) return m_strNull; @@ -447,7 +444,7 @@ //------------------------------------------------------------------------------------------------------------------- const std::string& Xcddb::getTrackArtist(int track) const { - typedef std::map::const_iterator iter; + typedef map::const_iterator iter; iter i = m_mapArtists.find(track); if (i == m_mapArtists.end()) return m_strNull; @@ -457,7 +454,7 @@ //------------------------------------------------------------------------------------------------------------------- const std::string& Xcddb::getTrackTitle(int track) const { - typedef std::map::const_iterator iter; + typedef map::const_iterator iter; iter i = m_mapTitles.find(track); if (i == m_mapTitles.end()) return m_strNull; @@ -622,7 +619,7 @@ //------------------------------------------------------------------------------------------------------------------- const std::string& Xcddb::getTrackExtended(int track) const { - typedef std::map::const_iterator iter; + typedef map::const_iterator iter; iter i = m_mapExtended_track.find(track); if (i == m_mapExtended_track.end()) return m_strNull; @@ -873,7 +870,7 @@ //########################################################## // Send the Hello message - std::string version = CSysInfo::GetVersion(); + std::string version = g_infoManager.GetLabel(SYSTEM_BUILD_VERSION); std::string lcAppName = CCompileInfo::GetAppName(); StringUtils::ToLower(lcAppName); if (version.find(" ") != std::string::npos) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/cddb.h kodi-15.2~git20151019.1039-final/xbmc/network/cddb.h --- kodi-16.1~git20160425.1001-final/xbmc/network/cddb.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/cddb.h 2015-10-19 08:39:16.000000000 +0000 @@ -32,7 +32,7 @@ #endif #include "storage/cdioSupport.h" -#include "utils/ScopeGuard.h" +#include "utils/AutoPtrHandle.h" namespace CDDB { @@ -92,12 +92,7 @@ protected: std::string m_strNull; -#if defined(TARGET_WINDOWS) - using CAutoPtrSocket = KODI::UTILS::CScopeGuard; -#else - using CAutoPtrSocket = KODI::UTILS::CScopeGuard; -#endif - CAutoPtrSocket m_cddb_socket; + AUTOPTR::CAutoPtrSocket m_cddb_socket; const static int recv_buffer = 4096; int m_lastError; std::map m_mapTitles; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/dacp/dacp.cpp kodi-15.2~git20151019.1039-final/xbmc/network/dacp/dacp.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/dacp/dacp.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/dacp/dacp.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "dacp.h" -#include "filesystem/File.h" - -#define AIRTUNES_DACP_CMD_URI "ctrl-int/1/" - -// AirTunes related DACP implementation taken from http://nto.github.io/AirPlay.html#audio-remotecontrol - -CDACP::CDACP(const std::string &active_remote_header, const std::string &hostname, int port) -{ - m_dacpUrl.SetHostName(hostname); - m_dacpUrl.SetPort(port); - m_dacpUrl.SetProtocol("http"); - m_dacpUrl.SetProtocolOption("Active-Remote", active_remote_header); -} - -void CDACP::SendCmd(const std::string &cmd) -{ - m_dacpUrl.SetFileName(AIRTUNES_DACP_CMD_URI + cmd); - // issue the command - XFILE::CFile file; - file.Open(m_dacpUrl); - file.Write(NULL, 0); -} - -void CDACP::BeginFwd() -{ - SendCmd("beginff"); -} - -void CDACP::BeginRewnd() -{ - SendCmd("beginrew"); -} - -void CDACP::ToggleMute() -{ - SendCmd("mutetoggle"); -} - -void CDACP::NextItem() -{ - SendCmd("nextitem"); -} - -void CDACP::PrevItem() -{ - SendCmd("previtem"); -} - -void CDACP::Pause() -{ - SendCmd("pause"); -} - -void CDACP::PlayPause() -{ - SendCmd("playpause"); -} - -void CDACP::Play() -{ - SendCmd("play"); -} - -void CDACP::Stop() -{ - SendCmd("stop"); -} - -void CDACP::PlayResume() -{ - SendCmd("playresume"); -} - -void CDACP::ShuffleSongs() -{ - SendCmd("shuffle_songs"); -} - -void CDACP::VolumeDown() -{ - SendCmd("volumedown"); -} - -void CDACP::VolumeUp() -{ - SendCmd("volumeup"); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/dacp/dacp.h kodi-15.2~git20151019.1039-final/xbmc/network/dacp/dacp.h --- kodi-16.1~git20160425.1001-final/xbmc/network/dacp/dacp.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/dacp/dacp.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -#pragma once - -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include "URL.h" - -class CDACP -{ - public: - CDACP(const std::string &active_remote_header, const std::string &hostname, int port); - - void BeginFwd(); - void BeginRewnd(); - void ToggleMute(); - void NextItem(); - void PrevItem(); - void Pause(); - void PlayPause(); - void Play(); - void Stop(); - void PlayResume(); - void ShuffleSongs(); - void VolumeDown(); - void VolumeUp(); - - private: - void SendCmd(const std::string &cmd); - - CURL m_dacpUrl; -}; \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/dacp/Makefile kodi-15.2~git20151019.1039-final/xbmc/network/dacp/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/network/dacp/Makefile 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/dacp/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -SRCS=dacp.cpp - -LIB=dacp.a - -include ../../../Makefile.include --include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS))) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/EventClient.cpp kodi-15.2~git20151019.1039-final/xbmc/network/EventClient.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/EventClient.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/EventClient.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -40,6 +40,8 @@ using namespace EVENTCLIENT; using namespace EVENTPACKET; +using namespace std; + struct ButtonStateFinder { @@ -57,8 +59,8 @@ } private: unsigned short m_keycode; - std::string m_map; - std::string m_button; + string m_map; + string m_button; }; /************************************************************************/ @@ -90,7 +92,7 @@ (StringUtils::StartsWith(m_mapName, "LI:")) ) // starts with LI: ? { #if defined(HAS_LIRC) || defined(HAS_IRSERVERSUITE) - std::string lircDevice = m_mapName.substr(3); + string lircDevice = m_mapName.substr(3); m_iKeyCode = CButtonTranslator::GetInstance().TranslateLircRemoteString( lircDevice.c_str(), m_buttonName.c_str() ); #else @@ -302,7 +304,7 @@ ParseUInt32(payload, psize, reserved); // image data if any - std::string iconfile = "special://temp/helo"; + string iconfile = "special://temp/helo"; if (m_eLogoType != LT_NONE && psize>0) { switch (m_eLogoType) @@ -359,7 +361,7 @@ unsigned char *payload = (unsigned char *)packet->Payload(); int psize = (int)packet->PayloadSize(); - std::string map, button; + string map, button; unsigned short flags; unsigned short bcode; unsigned short amount; @@ -431,7 +433,7 @@ state.m_fAmount = 0.0; } - std::list::reverse_iterator it; + list::reverse_iterator it; it = find_if( m_buttonQueue.rbegin() , m_buttonQueue.rend(), ButtonStateFinder(state)); if(it == m_buttonQueue.rend()) @@ -444,7 +446,7 @@ if(!active && it->m_bActive) { /* since modifying the list invalidates the referse iteratator */ - std::list::iterator it2 = (++it).base(); + list::iterator it2 = (++it).base(); /* if last event had an amount, we must resend without amount */ if(it2->m_bUseAmount && it2->m_fAmount != 0.0) @@ -549,7 +551,7 @@ { unsigned char *payload = (unsigned char *)packet->Payload(); int psize = (int)packet->PayloadSize(); - std::string title, message; + string title, message; // parse caption if (!ParseString(payload, psize, title)) @@ -570,7 +572,7 @@ ParseUInt32(payload, psize, reserved); // image data if any - std::string iconfile = "special://temp/notification"; + string iconfile = "special://temp/notification"; if (m_eLogoType != LT_NONE && psize>0) { switch (m_eLogoType) @@ -614,7 +616,7 @@ { unsigned char *payload = (unsigned char *)packet->Payload(); int psize = (int)packet->PayloadSize(); - std::string logmsg; + string logmsg; unsigned char ltype; if (!ParseByte(payload, psize, ltype)) @@ -630,7 +632,7 @@ { unsigned char *payload = (unsigned char *)packet->Payload(); int psize = (int)packet->PayloadSize(); - std::string actionString; + string actionString; unsigned char actionType; if (!ParseByte(payload, psize, actionType)) @@ -656,7 +658,7 @@ return true; } -bool CEventClient::ParseString(unsigned char* &payload, int &psize, std::string& parsedVal) +bool CEventClient::ParseString(unsigned char* &payload, int &psize, string& parsedVal) { if (psize <= 0) return false; @@ -713,7 +715,7 @@ m_readyPackets.pop(); } - std::map::iterator iter = m_seqPackets.begin(); + map::iterator iter = m_seqPackets.begin(); while (iter != m_seqPackets.end()) { if (iter->second) @@ -725,7 +727,7 @@ m_seqPackets.clear(); } -unsigned int CEventClient::GetButtonCode(std::string& joystickName, bool& isAxis, float& amount) +unsigned int CEventClient::GetButtonCode(string& joystickName, bool& isAxis, float& amount) { CSingleLock lock(m_critSection); unsigned int bcode = 0; @@ -751,8 +753,8 @@ return 0; - std::list repeat; - std::list::iterator it; + list repeat; + list::iterator it; for(it = m_buttonQueue.begin(); bcode == 0 && it != m_buttonQueue.end(); ++it) { bcode = it->KeyCode(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/EventClient.h kodi-15.2~git20151019.1039-final/xbmc/network/EventClient.h --- kodi-16.1~git20160425.1001-final/xbmc/network/EventClient.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/EventClient.h 2015-10-19 08:39:16.000000000 +0000 @@ -155,8 +155,8 @@ void RefreshSettings() { - m_iRepeatDelay = CSettings::GetInstance().GetInt(CSettings::SETTING_SERVICES_ESINITIALDELAY); - m_iRepeatSpeed = CSettings::GetInstance().GetInt(CSettings::SETTING_SERVICES_ESCONTINUOUSDELAY); + m_iRepeatDelay = CSettings::Get().GetInt("services.esinitialdelay"); + m_iRepeatSpeed = CSettings::Get().GetInt("services.escontinuousdelay"); } SOCKETS::CAddress& Address() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/EventServer.cpp kodi-15.2~git20151019.1039-final/xbmc/network/EventServer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/EventServer.cpp 2016-04-24 12:10:27.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/EventServer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -28,15 +28,14 @@ #include "Socket.h" #include "threads/CriticalSection.h" #include "Application.h" -#include "interfaces/builtins/Builtins.h" +#include "GUIInfoManager.h" +#include "interfaces/Builtins.h" #include "input/ButtonTranslator.h" #include "threads/SingleLock.h" #include "Zeroconf.h" #include "guilib/GUIAudioManager.h" #include "input/Key.h" #include "utils/log.h" -#include "utils/SystemInfo.h" -#include "Util.h" #include #include #include @@ -45,6 +44,7 @@ using namespace EVENTPACKET; using namespace EVENTCLIENT; using namespace SOCKETS; +using namespace std; /************************************************************************/ /* CEventServer */ @@ -87,11 +87,11 @@ return; // set default port - m_iPort = CSettings::GetInstance().GetInt(CSettings::SETTING_SERVICES_ESPORT); + m_iPort = CSettings::Get().GetInt("services.esport"); assert(m_iPort <= 65535 && m_iPort >= 1); // max clients - m_iMaxClients = CSettings::GetInstance().GetInt(CSettings::SETTING_SERVICES_ESMAXCLIENTS); + m_iMaxClients = CSettings::Get().GetInt("services.esmaxclients"); if (m_iMaxClients < 0) { CLog::Log(LOGERROR, "ES: Invalid maximum number of clients specified %d", m_iMaxClients); @@ -123,7 +123,7 @@ } CSingleLock lock(m_critSection); - std::map::iterator iter = m_clients.begin(); + map::iterator iter = m_clients.begin(); while (iter != m_clients.end()) { if (iter->second) @@ -157,9 +157,6 @@ CSocketListener listener; int packetSize = 0; - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESALLINTERFACES)) - any_addr.SetAddress("127.0.0.1"); // only listen on localhost - CLog::Log(LOGNOTICE, "ES: Starting UDP Event server on %s:%d", any_addr.Address(), m_iPort); Cleanup(); @@ -180,7 +177,7 @@ } // bind to IP and start listening on port - int port_range = CSettings::GetInstance().GetInt(CSettings::SETTING_SERVICES_ESPORTRANGE); + int port_range = CSettings::Get().GetInt("services.esportrange"); if (port_range < 1 || port_range > 100) { CLog::Log(LOGERROR, "ES: Invalid port range specified %d, defaulting to 10", port_range); @@ -196,7 +193,7 @@ std::vector > txt; CZeroconf::GetInstance()->PublishService("servers.eventserver", "_xbmc-events._udp", - CSysInfo::GetDeviceName(), + g_infoManager.GetLabel(SYSTEM_FRIENDLY_NAME), m_iPort, txt); @@ -266,7 +263,7 @@ CSingleLock lock(m_critSection); // first check if we have a client for this address - std::map::iterator iter = m_clients.find(clientToken); + map::iterator iter = m_clients.find(clientToken); if ( iter == m_clients.end() ) { @@ -294,7 +291,7 @@ void CEventServer::RefreshClients() { CSingleLock lock(m_critSection); - std::map::iterator iter = m_clients.begin(); + map::iterator iter = m_clients.begin(); while ( iter != m_clients.end() ) { @@ -321,7 +318,7 @@ void CEventServer::ProcessEvents() { CSingleLock lock(m_critSection); - std::map::iterator iter = m_clients.begin(); + map::iterator iter = m_clients.begin(); while (iter != m_clients.end()) { @@ -335,7 +332,7 @@ CSingleLock lock(m_critSection); CEventAction actionEvent; - std::map::iterator iter = m_clients.begin(); + map::iterator iter = m_clients.begin(); while (iter != m_clients.end()) { @@ -346,7 +343,7 @@ switch(actionEvent.actionType) { case AT_EXEC_BUILTIN: - CBuiltins::GetInstance().Execute(actionEvent.actionName); + CBuiltins::Execute(actionEvent.actionName); break; case AT_BUTTON: @@ -370,7 +367,7 @@ unsigned int CEventServer::GetButtonCode(std::string& strMapName, bool& isAxis, float& fAmount) { CSingleLock lock(m_critSection); - std::map::iterator iter = m_clients.begin(); + map::iterator iter = m_clients.begin(); unsigned int bcode = 0; while (iter != m_clients.end()) @@ -386,7 +383,7 @@ bool CEventServer::GetMousePos(float &x, float &y) { CSingleLock lock(m_critSection); - std::map::iterator iter = m_clients.begin(); + map::iterator iter = m_clients.begin(); while (iter != m_clients.end()) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/GUIDialogAccessPoints.cpp kodi-15.2~git20151019.1039-final/xbmc/network/GUIDialogAccessPoints.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/GUIDialogAccessPoints.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/GUIDialogAccessPoints.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,6 @@ #include "FileItem.h" #include "input/Key.h" #include "guilib/LocalizeStrings.h" -#include "utils/Variant.h" #define CONTROL_ACCESS_POINTS 3 @@ -53,7 +52,7 @@ if (iItem == (int) m_aps.size()) { m_selectedAPEssId = ""; - if (CGUIKeyboardFactory::ShowAndGetInput(m_selectedAPEssId, CVariant{g_localizeStrings.Get(789)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(m_selectedAPEssId, g_localizeStrings.Get(789), false)) { m_selectedAPEncMode = m_aps[iItem].getEncryptionMode(); m_wasItemSelected = true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/GUIDialogNetworkSetup.cpp kodi-15.2~git20151019.1039-final/xbmc/network/GUIDialogNetworkSetup.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/GUIDialogNetworkSetup.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/GUIDialogNetworkSetup.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,16 +19,13 @@ */ #include "GUIDialogNetworkSetup.h" - -#include - #include "dialogs/GUIDialogFileBrowser.h" -#include "guilib/GUIEditControl.h" #include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "URL.h" -#include "utils/StringUtils.h" +#include "guilib/GUIEditControl.h" #include "utils/URIUtils.h" +#include "utils/StringUtils.h" +#include "URL.h" +#include "guilib/LocalizeStrings.h" #define CONTROL_PROTOCOL 10 #define CONTROL_SERVER_ADDRESS 11 @@ -104,7 +101,7 @@ if (!dialog) return false; dialog->Initialize(); dialog->SetPath(path); - dialog->Open(); + dialog->DoModal(); path = dialog->ConstructPath(); return dialog->IsConfirmed(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,9 +29,8 @@ #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#define TRANSFORMATION_OPTION_WIDTH "width" -#define TRANSFORMATION_OPTION_HEIGHT "height" -#define TRANSFORMATION_OPTION_SCALING_ALGORITHM "scaling_algorithm" +#define TRANSFORMATION_OPTION_WIDTH "width" +#define TRANSFORMATION_OPTION_HEIGHT "height" static const std::string ImageBasePath = "/image/"; @@ -142,10 +141,6 @@ if (option != options.end()) urlOptions.push_back(TRANSFORMATION_OPTION_HEIGHT "=" + option->second); - option = options.find(TRANSFORMATION_OPTION_SCALING_ALGORITHM); - if (option != options.end()) - urlOptions.push_back(TRANSFORMATION_OPTION_SCALING_ALGORITHM "=" + option->second); - std::string imagePath = m_url; if (!urlOptions.empty()) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,7 +25,6 @@ #include "network/WebServer.h" #include "utils/JSONVariantWriter.h" #include "utils/log.h" -#include "utils/Variant.h" #define MAX_STRING_POST_SIZE 20000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPPythonHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPPythonHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPPythonHandler.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPPythonHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -162,7 +162,7 @@ CHTTPPythonInvoker* pythonInvoker = new CHTTPPythonWsgiInvoker(&g_pythonParser, pythonRequest); LanguageInvokerPtr languageInvokerPtr(pythonInvoker); - int result = CScriptInvocationManager::GetInstance().ExecuteSync(m_scriptPath, languageInvokerPtr, m_addon, args, 30000, false); + int result = CScriptInvocationManager::Get().ExecuteSync(m_scriptPath, languageInvokerPtr, m_addon, args, 30000, false); // check if the script couldn't be started if (result < 0) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPVfsHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPVfsHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPVfsHandler.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPVfsHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -54,7 +54,7 @@ VECSOURCES *sources = NULL; for (unsigned int index = 0; index < size && !accessible; index++) { - sources = CMediaSourceSettings::GetInstance().GetSources(sourceTypes[index]); + sources = CMediaSourceSettings::Get().GetSources(sourceTypes[index]); if (sources == NULL) continue; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,7 @@ { m_responseData = ADDON_HEADER; ADDON::VECADDONS addons; - if (!ADDON::CAddonMgr::GetInstance().GetAddons(ADDON::ADDON_WEB_INTERFACE, addons) || addons.empty()) + if (!ADDON::CAddonMgr::Get().GetAddons(ADDON::ADDON_WEB_INTERFACE, addons) || addons.empty()) { m_response.type = HTTPError; m_response.status = MHD_HTTP_INTERNAL_SERVER_ERROR; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -95,7 +95,7 @@ if (components.size() <= 1) return false; - if (!ADDON::CAddonMgr::GetInstance().GetAddon(components.at(1), addon) || addon == NULL) + if (!ADDON::CAddonMgr::Get().GetAddon(components.at(1), addon) || addon == NULL) return false; addonPath = addon->Path(); @@ -108,7 +108,7 @@ // determine the path within the addon path = StringUtils::Join(components, WEBSERVER_DIRECTORY_SEPARATOR); } - else if (!ADDON::CAddonMgr::GetInstance().GetDefault(ADDON::ADDON_WEB_INTERFACE, addon) || addon == NULL) + else if (!ADDON::CAddonMgr::Get().GetDefault(ADDON::ADDON_WEB_INTERFACE, addon) || addon == NULL) return false; // get the path of the addon @@ -121,12 +121,5 @@ // append the path within the addon to the path of the addon addonPath = URIUtils::AddFileToFolder(addonPath, path); - // ensure that we don't have a directory traversal hack here - // by checking if the resolved absolute path is inside the addon path - std::string realPath = URIUtils::GetRealPath(addonPath); - std::string realAddonPath = URIUtils::GetRealPath(addon->Path()); - if (!URIUtils::IsInPath(realPath, realAddonPath)) - return false; - return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/IHTTPRequestHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/IHTTPRequestHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/IHTTPRequestHandler.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/IHTTPRequestHandler.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,8 +24,6 @@ #include "network/WebServer.h" #include "utils/StringUtils.h" -#include - IHTTPRequestHandler::IHTTPRequestHandler() : m_request(), m_response(), diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/IHTTPRequestHandler.h kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/IHTTPRequestHandler.h --- kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/IHTTPRequestHandler.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/IHTTPRequestHandler.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,6 +19,9 @@ * */ +#include +#include + #include #include #include @@ -26,9 +29,6 @@ #include #include #include -#include -#include - #include #include "utils/HttpRangeUtils.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/python/HTTPPythonWsgiInvoker.cpp kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/python/HTTPPythonWsgiInvoker.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/httprequesthandler/python/HTTPPythonWsgiInvoker.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/httprequesthandler/python/HTTPPythonWsgiInvoker.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,16 +18,14 @@ * */ -#include "HTTPPythonWsgiInvoker.h" - -#include +#include "interfaces/python/swig.h" +#include "HTTPPythonWsgiInvoker.h" +#include "URL.h" #include "addons/Webinterface.h" #include "interfaces/legacy/wsgi/WsgiErrorStream.h" #include "interfaces/legacy/wsgi/WsgiInputStream.h" #include "interfaces/legacy/wsgi/WsgiResponse.h" -#include "interfaces/python/swig.h" -#include "URL.h" #include "utils/URIUtils.h" #define MODULE "xbmc" @@ -394,6 +392,8 @@ return; PyObject* pyEnviron = reinterpret_cast(environ); + if (pyEnviron == NULL) + return; // WSGI-defined variables { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/linux/NetworkLinux.cpp kodi-15.2~git20151019.1039-final/xbmc/network/linux/NetworkLinux.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/linux/NetworkLinux.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/linux/NetworkLinux.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -67,6 +67,8 @@ #include "utils/log.h" #include "utils/StringUtils.h" +using namespace std; + CNetworkInterfaceLinux::CNetworkInterfaceLinux(CNetworkLinux* network, std::string interfaceName, char interfaceMacAddrRaw[6]): m_interfaceName(interfaceName), m_interfaceMacAdr(StringUtils::Format("%02X:%02X:%02X:%02X:%02X:%02X", @@ -319,7 +321,7 @@ if (m_sock != -1) close(CNetworkLinux::m_sock); - std::vector::iterator it = m_interfaces.begin(); + vector::iterator it = m_interfaces.begin(); while(it != m_interfaces.end()) { CNetworkInterface* nInt = *it; @@ -476,7 +478,7 @@ Sleep(100); if (pipe) { - std::vector tmpStr; + vector tmpStr; char buffer[256] = {'\0'}; if (fread(buffer, sizeof(char), sizeof(buffer), pipe) > 0 && !ferror(pipe)) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/linux/ZeroconfBrowserAvahi.cpp kodi-15.2~git20151019.1039-final/xbmc/network/linux/ZeroconfBrowserAvahi.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/linux/ZeroconfBrowserAvahi.cpp 2016-04-24 12:10:27.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/linux/ZeroconfBrowserAvahi.cpp 2014-12-18 01:01:57.000000000 +0000 @@ -47,7 +47,7 @@ }; } -CZeroconfBrowserAvahi::CZeroconfBrowserAvahi() : mp_client ( 0 ), mp_poll ( 0 ) +CZeroconfBrowserAvahi::CZeroconfBrowserAvahi() : mp_client ( 0 ), mp_poll ( 0 ), m_shutdown(false), m_thread_id(0) { if ( ! ( mp_poll = avahi_threaded_poll_new() ) ) { @@ -74,8 +74,27 @@ CLog::Log ( LOGDEBUG, "CZeroconfAvahi::~CZeroconfAvahi() Going down! cleaning up..." ); if ( mp_poll ) { - //stop avahi polling thread - avahi_threaded_poll_stop(mp_poll); + //normally we would stop the avahi thread here and do our work, but + //it looks like this does not work -> www.avahi.org/ticket/251 + //so instead of calling + //avahi_threaded_poll_stop(mp_poll); + //we set m_shutdown=true, post an event and wait for it to stop itself + struct timeval tv = { 0, 0 }; //TODO: does tv survive the thread? + AvahiTimeout* lp_timeout; + { + ScopedEventLoopBlock l_block(mp_poll); + const AvahiPoll* cp_apoll = avahi_threaded_poll_get(mp_poll); + m_shutdown = true; + lp_timeout = cp_apoll->timeout_new(cp_apoll, + &tv, + shutdownCallback, + this); + } + + //now wait for the thread to stop + assert(m_thread_id); + pthread_join(m_thread_id, NULL); + avahi_threaded_poll_get(mp_poll)->timeout_free(lp_timeout); } //free the client (frees all browsers, groups, ...) if ( mp_client ) @@ -130,13 +149,9 @@ } m_browsers.erase ( it ); //remove this serviceType from the list of discovered services - for (auto itr = m_discovered_services.begin(); itr != m_discovered_services.end();) - { - if (itr->first.GetType() == fcr_service_type) - itr = m_discovered_services.erase(itr); - else - ++itr; - } + for ( tDiscoveredServices::iterator it = m_discovered_services.begin(); it != m_discovered_services.end(); ++it ) + if ( it->first.GetType() == fcr_service_type ) + m_discovered_services.erase ( it++ ); } return true; } @@ -188,6 +203,15 @@ void CZeroconfBrowserAvahi::clientCallback ( AvahiClient* fp_client, AvahiClientState f_state, void* fp_data ) { CZeroconfBrowserAvahi* p_instance = static_cast ( fp_data ); + + //store our thread ID and check for shutdown -> check details in destructor + p_instance->m_thread_id = pthread_self(); + if (p_instance->m_shutdown) + { + avahi_threaded_poll_quit(p_instance->mp_poll); + return; + } + switch ( f_state ) { case AVAHI_CLIENT_S_RUNNING: @@ -376,4 +400,15 @@ return ret; } + +void CZeroconfBrowserAvahi::shutdownCallback(AvahiTimeout *fp_e, void *fp_data) +{ + CZeroconfBrowserAvahi* p_instance = static_cast(fp_data); + //should only be called on shutdown + if (p_instance->m_shutdown) + { + avahi_threaded_poll_quit(p_instance->mp_poll); + } +} + #endif //HAS_AVAHI diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/linux/ZeroconfBrowserAvahi.h kodi-15.2~git20151019.1039-final/xbmc/network/linux/ZeroconfBrowserAvahi.h --- kodi-16.1~git20160425.1001-final/xbmc/network/linux/ZeroconfBrowserAvahi.h 2016-04-24 12:10:27.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/linux/ZeroconfBrowserAvahi.h 2014-12-18 01:01:57.000000000 +0000 @@ -78,6 +78,8 @@ AvahiStringList *txt, AvahiLookupResultFlags flags, AVAHI_GCC_UNUSED void* userdata); + //helper to workaround avahi bug + static void shutdownCallback(AvahiTimeout *fp_e, void *fp_data); //helpers bool createClient(); static AvahiServiceBrowser* createServiceBrowser(const std::string& fcr_service_type, AvahiClient* fp_client, void* fp_userdata); @@ -104,6 +106,10 @@ tDiscoveredServices m_discovered_services; CZeroconfBrowser::ZeroconfService m_resolving_service; CEvent m_resolved_event; + + //2 variables below are needed for workaround of avahi bug (see destructor for details) + bool m_shutdown; + pthread_t m_thread_id; }; #endif //HAS_AVAHI diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/mdns/ZeroconfBrowserMDNS.cpp kodi-15.2~git20151019.1039-final/xbmc/network/mdns/ZeroconfBrowserMDNS.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/mdns/ZeroconfBrowserMDNS.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/mdns/ZeroconfBrowserMDNS.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,21 +19,17 @@ */ #include "ZeroconfBrowserMDNS.h" - -#include -#include - -#include "guilib/GUIMessage.h" +#include +#include #include "guilib/GUIWindowManager.h" +#include "guilib/GUIMessage.h" #include "GUIUserMessages.h" -#include "network/DNSNameCache.h" -#include "system.h" -#include "threads/SingleLock.h" -#include "utils/log.h" - #if defined(TARGET_WINDOWS) #include "win32/WIN32Util.h" #endif //TARGET_WINDOWS +#include "network/DNSNameCache.h" +#include +#include #pragma comment(lib, "dnssd.lib") diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/mdns/ZeroconfBrowserMDNS.h kodi-15.2~git20151019.1039-final/xbmc/network/mdns/ZeroconfBrowserMDNS.h --- kodi-16.1~git20160425.1001-final/xbmc/network/mdns/ZeroconfBrowserMDNS.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/mdns/ZeroconfBrowserMDNS.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,15 +19,13 @@ */ #pragma once -#include #include -#include - -#include +#include #include "network/ZeroconfBrowser.h" -#include "threads/CriticalSection.h" #include "threads/Thread.h" +#include "threads/CriticalSection.h" +#include //platform specific implementation of zeroconfbrowser interface using native os x APIs class CZeroconfBrowserMDNS : public CZeroconfBrowser diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/mdns/ZeroconfMDNS.h kodi-15.2~git20151019.1039-final/xbmc/network/mdns/ZeroconfMDNS.h --- kodi-16.1~git20160425.1001-final/xbmc/network/mdns/ZeroconfMDNS.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/mdns/ZeroconfMDNS.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,14 +19,13 @@ */ #pragma once +#include + #include "network/Zeroconf.h" #include "threads/CriticalSection.h" #include #include "threads/Thread.h" -#include -#include - class CZeroconfMDNS : public CZeroconf,public CThread { public: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/Network.cpp kodi-15.2~git20151019.1039-final/xbmc/network/Network.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/Network.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/Network.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,7 @@ #include #include "Network.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "network/NetworkServices.h" #include "utils/log.h" #ifdef TARGET_WINDOWS @@ -33,8 +33,6 @@ #endif #include "utils/StringUtils.h" -using namespace KODI::MESSAGING; - /* slightly modified in_ether taken from the etherboot project (http://sourceforge.net/projects/etherboot) */ bool in_ether (const char *bufp, unsigned char *addr) { @@ -134,12 +132,12 @@ CNetwork::CNetwork() { - CApplicationMessenger::GetInstance().PostMsg(TMSG_NETWORKMESSAGE, SERVICES_UP, 0); + CApplicationMessenger::Get().NetworkMessage(SERVICES_UP, 0); } CNetwork::~CNetwork() { - CApplicationMessenger::GetInstance().PostMsg(TMSG_NETWORKMESSAGE, SERVICES_DOWN, 0); + CApplicationMessenger::Get().NetworkMessage(SERVICES_DOWN, 0); } int CNetwork::ParseHex(char *str, unsigned char *addr) @@ -243,8 +241,15 @@ return false; } -bool CNetwork::IsAvailable(void) +bool CNetwork::IsAvailable(bool wait /*= false*/) { + if (wait) + { + // NOTE: Not implemented in linuxport branch as 99.9% of the time + // we have the network setup already. Trunk code has a busy + // wait for 5 seconds here. + } + std::vector& ifaces = GetInterfaceList(); return (ifaces.size() != 0); } @@ -275,14 +280,14 @@ { case SERVICES_UP: CLog::Log(LOGDEBUG, "%s - Starting network services",__FUNCTION__); - CNetworkServices::GetInstance().Start(); + CNetworkServices::Get().Start(); break; case SERVICES_DOWN: CLog::Log(LOGDEBUG, "%s - Signaling network services to stop",__FUNCTION__); - CNetworkServices::GetInstance().Stop(false); // tell network services to stop, but don't wait for them yet + CNetworkServices::Get().Stop(false); // tell network services to stop, but don't wait for them yet CLog::Log(LOGDEBUG, "%s - Waiting for network services to stop",__FUNCTION__); - CNetworkServices::GetInstance().Stop(true); // wait for network services to stop + CNetworkServices::Get().Stop(true); // wait for network services to stop break; } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/Network.h kodi-15.2~git20151019.1039-final/xbmc/network/Network.h --- kodi-16.1~git20160425.1001-final/xbmc/network/Network.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/Network.h 2015-10-19 08:39:16.000000000 +0000 @@ -123,7 +123,7 @@ bool HasInterfaceForIP(unsigned long address); // Return true if there's at least one defined network interface - bool IsAvailable(void); + bool IsAvailable(bool wait = false); // Return true if there's at least one interface which is connected bool IsConnected(void); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/NetworkServices.cpp kodi-15.2~git20151019.1039-final/xbmc/network/NetworkServices.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/NetworkServices.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/NetworkServices.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,27 +19,18 @@ */ #include "NetworkServices.h" - -#include - #include "Application.h" +#include "ApplicationMessenger.h" +#include "GUIInfoManager.h" +#ifdef TARGET_LINUX +#include "Util.h" +#endif #include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogOK.h" +#include "dialogs/GUIDialogYesNo.h" #include "guilib/LocalizeStrings.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" #include "network/Network.h" -#include "settings/AdvancedSettings.h" -#include "settings/lib/Setting.h" -#include "settings/Settings.h" -#include "utils/log.h" -#include "utils/RssManager.h" -#include "utils/SystemInfo.h" -#include "utils/Variant.h" -#ifdef TARGET_LINUX -#include "Util.h" -#endif #ifdef HAS_AIRPLAY #include "network/AirPlayServer.h" #endif // HAS_AIRPLAY @@ -86,7 +77,13 @@ #include "osx/XBMCHelper.h" #endif -using namespace KODI::MESSAGING; +#include "settings/AdvancedSettings.h" +#include "settings/lib/Setting.h" +#include "settings/Settings.h" +#include "utils/log.h" +#include "utils/RssManager.h" + +using namespace std; #ifdef HAS_JSONRPC using namespace JSONRPC; #endif // HAS_JSONRPC @@ -97,8 +94,6 @@ using namespace UPNP; #endif // HAS_UPNP -using KODI::MESSAGING::HELPERS::DialogResponse; - CNetworkServices::CNetworkServices() #ifdef HAS_WEB_SERVER : @@ -163,7 +158,7 @@ #endif // HAS_WEB_SERVER } -CNetworkServices& CNetworkServices::GetInstance() +CNetworkServices& CNetworkServices::Get() { static CNetworkServices sNetworkServices; return sNetworkServices; @@ -176,29 +171,29 @@ const std::string &settingId = setting->GetId(); #ifdef HAS_WEB_SERVER - if (settingId == CSettings::SETTING_SERVICES_WEBSERVER || - settingId == CSettings::SETTING_SERVICES_WEBSERVERPORT) + if (settingId == "services.webserver" || + settingId == "services.webserverport") { if (IsWebserverRunning() && !StopWebserver()) return false; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_WEBSERVER)) + if (CSettings::Get().GetBool("services.webserver")) { if (!StartWebserver()) { - CGUIDialogOK::ShowAndGetInput(CVariant{33101}, CVariant{33100}); + CGUIDialogOK::ShowAndGetInput(33101, 33100); return false; } } } - else if (settingId == CSettings::SETTING_SERVICES_ESPORT || - settingId == CSettings::SETTING_SERVICES_WEBSERVERPORT) + else if (settingId == "services.esport" || + settingId == "services.webserverport") return ValidatePort(((CSettingInt*)setting)->GetValue()); else #endif // HAS_WEB_SERVER #ifdef HAS_ZEROCONF - if (settingId == CSettings::SETTING_SERVICES_ZEROCONF) + if (settingId == "services.zeroconf") { if (((CSettingBool*)setting)->GetValue()) return StartZeroconf(); @@ -208,7 +203,7 @@ // cannot disable if (IsAirPlayServerRunning() || IsAirTunesServerRunning()) { - CGUIDialogOK::ShowAndGetInput(CVariant{1259}, CVariant{34303}); + CGUIDialogOK::ShowAndGetInput(1259, 34303); return false; } @@ -220,15 +215,15 @@ #endif // HAS_ZEROCONF #ifdef HAS_AIRPLAY - if (settingId == CSettings::SETTING_SERVICES_AIRPLAY) + if (settingId == "services.airplay") { if (((CSettingBool*)setting)->GetValue()) { #ifdef HAS_ZEROCONF // AirPlay needs zeroconf - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ZEROCONF)) + if (!CSettings::Get().GetBool("services.zeroconf")) { - CGUIDialogOK::ShowAndGetInput(CVariant{1273}, CVariant{34302}); + CGUIDialogOK::ShowAndGetInput(1273, 34302); return false; } #endif //HAS_ZEROCONF @@ -237,14 +232,14 @@ #ifdef HAS_AIRTUNES if (!StartAirTunesServer()) { - CGUIDialogOK::ShowAndGetInput(CVariant{1274}, CVariant{33100}); + CGUIDialogOK::ShowAndGetInput(1274, 33100); return false; } #endif //HAS_AIRTUNES if (!StartAirPlayServer()) { - CGUIDialogOK::ShowAndGetInput(CVariant{1273}, CVariant{33100}); + CGUIDialogOK::ShowAndGetInput(1273, 33100); return false; } } @@ -263,37 +258,21 @@ return false; } } - else if (settingId == CSettings::SETTING_SERVICES_AIRPLAYVIDEOSUPPORT) + else if (settingId == "services.airplaypassword" || + settingId == "services.useairplaypassword") { - if (((CSettingBool*)setting)->GetValue()) - { - if (!StartAirPlayServer()) - { - CGUIDialogOK::ShowAndGetInput(CVariant{1273}, CVariant{33100}); - return false; - } - } - else - { - if (!StopAirPlayServer(true)) - return false; - } - } - else if (settingId == CSettings::SETTING_SERVICES_AIRPLAYPASSWORD || - settingId == CSettings::SETTING_SERVICES_USEAIRPLAYPASSWORD) - { - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_AIRPLAY)) + if (!CSettings::Get().GetBool("services.airplay")) return false; - if (!CAirPlayServer::SetCredentials(CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_USEAIRPLAYPASSWORD), - CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_AIRPLAYPASSWORD))) + if (!CAirPlayServer::SetCredentials(CSettings::Get().GetBool("services.useairplaypassword"), + CSettings::Get().GetString("services.airplaypassword"))) return false; } else #endif //HAS_AIRPLAY #ifdef HAS_UPNP - if (settingId == CSettings::SETTING_SERVICES_UPNPSERVER) + if (settingId == "services.upnpserver") { if (((CSettingBool*)setting)->GetValue()) { @@ -309,14 +288,14 @@ else return StopUPnPServer(); } - else if (settingId == CSettings::SETTING_SERVICES_UPNPRENDERER) + else if (settingId == "services.upnprenderer") { if (((CSettingBool*)setting)->GetValue()) return StartUPnPRenderer(); else return StopUPnPRenderer(); } - else if (settingId == CSettings::SETTING_SERVICES_UPNPCONTROLLER) + else if (settingId == "services.upnpcontroller") { // always stop and restart StopUPnPController(); @@ -326,14 +305,14 @@ else #endif // HAS_UPNP - if (settingId == CSettings::SETTING_SERVICES_ESENABLED) + if (settingId == "services.esenabled") { #ifdef HAS_EVENT_SERVER if (((CSettingBool*)setting)->GetValue()) { if (!StartEventServer()) { - CGUIDialogOK::ShowAndGetInput(CVariant{33102}, CVariant{33100}); + CGUIDialogOK::ShowAndGetInput(33102, 33100); return false; } } @@ -342,11 +321,11 @@ #endif // HAS_EVENT_SERVER #ifdef HAS_JSONRPC - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESENABLED)) + if (CSettings::Get().GetBool("services.esenabled")) { if (!StartJSONRPCServer()) { - CGUIDialogOK::ShowAndGetInput(CVariant{33103}, CVariant{33100}); + CGUIDialogOK::ShowAndGetInput(33103, 33100); return false; } } @@ -354,7 +333,7 @@ return StopJSONRPCServer(false); #endif // HAS_JSONRPC } - else if (settingId == CSettings::SETTING_SERVICES_ESPORT) + else if (settingId == "services.esport") { #ifdef HAS_EVENT_SERVER // restart eventserver without asking user @@ -363,7 +342,7 @@ if (!StartEventServer()) { - CGUIDialogOK::ShowAndGetInput(CVariant{33102}, CVariant{33100}); + CGUIDialogOK::ShowAndGetInput(33102, 33100); return false; } @@ -373,28 +352,28 @@ #endif // TARGET_DARWIN_OSX #endif // HAS_EVENT_SERVER } - else if (settingId == CSettings::SETTING_SERVICES_ESALLINTERFACES) + else if (settingId == "services.esallinterfaces") { #ifdef HAS_EVENT_SERVER - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESENABLED)) + if (CSettings::Get().GetBool("services.esenabled")) { if (!StopEventServer(true, true)) return false; if (!StartEventServer()) { - CGUIDialogOK::ShowAndGetInput(CVariant{33102}, CVariant{33100}); + CGUIDialogOK::ShowAndGetInput(33102, 33100); return false; } } #endif // HAS_EVENT_SERVER #ifdef HAS_JSONRPC - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESENABLED)) + if (CSettings::Get().GetBool("services.esenabled")) { if (!StartJSONRPCServer()) { - CGUIDialogOK::ShowAndGetInput(CVariant{33103}, CVariant{33100}); + CGUIDialogOK::ShowAndGetInput(33103, 33100); return false; } } @@ -402,10 +381,10 @@ } #ifdef HAS_EVENT_SERVER - else if (settingId == CSettings::SETTING_SERVICES_ESINITIALDELAY || - settingId == CSettings::SETTING_SERVICES_ESCONTINUOUSDELAY) + else if (settingId == "services.esinitialdelay" || + settingId == "services.escontinuousdelay") { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESENABLED)) + if (CSettings::Get().GetBool("services.esenabled")) return RefreshEventServer(); } #endif // HAS_EVENT_SERVER @@ -420,23 +399,23 @@ const std::string &settingId = setting->GetId(); #ifdef HAS_WEB_SERVER - if (settingId == CSettings::SETTING_SERVICES_WEBSERVERUSERNAME || - settingId == CSettings::SETTING_SERVICES_WEBSERVERPASSWORD) + if (settingId == "services.webserverusername" || + settingId == "services.webserverpassword") { - m_webserver.SetCredentials(CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_WEBSERVERUSERNAME), - CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_WEBSERVERPASSWORD)); + m_webserver.SetCredentials(CSettings::Get().GetString("services.webserverusername"), + CSettings::Get().GetString("services.webserverpassword")); } else #endif // HAS_WEB_SERVER - if (settingId == CSettings::SETTING_SMB_WINSSERVER || - settingId == CSettings::SETTING_SMB_WORKGROUP) + if (settingId == "smb.winsserver" || + settingId == "smb.workgroup") { // okey we really don't need to restart, only deinit samba, but that could be damn hard if something is playing // TODO - General way of handling setting changes that require restart - if (HELPERS::ShowYesNoDialogText(CVariant{14038}, CVariant{14039}) == DialogResponse::YES) + if (CGUIDialogYesNo::ShowAndGetInput(14038, 14039)) { - CSettings::GetInstance().Save(); - CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTARTAPP); + CSettings::Get().Save(); + CApplicationMessenger::Get().RestartApp(); } } } @@ -447,19 +426,12 @@ return false; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_SERVICES_WEBSERVERUSERNAME) + if (settingId == "services.webserverusername") { // if webserverusername is xbmc and pw is not empty we treat it as altered // and don't change the username to kodi - part of rebrand - if (CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_WEBSERVERUSERNAME) == "xbmc" && - !CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_WEBSERVERPASSWORD).empty()) - return true; - } - if (settingId == CSettings::SETTING_SERVICES_WEBSERVERPORT) - { - // if webserverport is default but webserver is activated then treat it as altered - // and don't change the port to new value - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_WEBSERVER)) + if (CSettings::Get().GetString("services.webserverusername") == "xbmc" && + !CSettings::Get().GetString("services.webserverpassword").empty()) return true; } return false; @@ -469,13 +441,13 @@ { StartZeroconf(); #ifdef HAS_WEB_SERVER - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_WEBSERVER) && !StartWebserver()) + if (CSettings::Get().GetBool("services.webserver") && !StartWebserver()) CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(33101), g_localizeStrings.Get(33100)); #endif // HAS_WEB_SERVER StartUPnP(); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESENABLED) && !StartEventServer()) + if (CSettings::Get().GetBool("services.esenabled") && !StartEventServer()) CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(33102), g_localizeStrings.Get(33100)); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESENABLED) && !StartJSONRPCServer()) + if (CSettings::Get().GetBool("services.esenabled") && !StartJSONRPCServer()) CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(33103), g_localizeStrings.Get(33100)); // note - airtunesserver has to start before airplay server (ios7 client detection bug) @@ -506,10 +478,10 @@ if (!g_application.getNetwork().IsAvailable()) return false; - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_WEBSERVER)) + if (!CSettings::Get().GetBool("services.webserver")) return false; - int webPort = CSettings::GetInstance().GetInt(CSettings::SETTING_SERVICES_WEBSERVERPORT); + int webPort = CSettings::Get().GetInt("services.webserverport"); if (!ValidatePort(webPort)) { CLog::Log(LOGERROR, "Cannot start Web Server on port %i", webPort); @@ -519,17 +491,18 @@ if (IsWebserverRunning()) return true; - if (!m_webserver.Start(webPort, CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_WEBSERVERUSERNAME), CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_WEBSERVERPASSWORD))) + CLog::Log(LOGNOTICE, "Webserver: Starting..."); + if (!m_webserver.Start(webPort, CSettings::Get().GetString("services.webserverusername"), CSettings::Get().GetString("services.webserverpassword"))) return false; #ifdef HAS_ZEROCONF std::vector > txt; // publish web frontend and API services #ifdef HAS_WEB_INTERFACE - CZeroconf::GetInstance()->PublishService("servers.webserver", "_http._tcp", CSysInfo::GetDeviceName(), webPort, txt); + CZeroconf::GetInstance()->PublishService("servers.webserver", "_http._tcp", g_infoManager.GetLabel(SYSTEM_FRIENDLY_NAME), webPort, txt); #endif // HAS_WEB_INTERFACE #ifdef HAS_JSONRPC - CZeroconf::GetInstance()->PublishService("servers.jsonrpc-http", "_xbmc-jsonrpc-h._tcp", CSysInfo::GetDeviceName(), webPort, txt); + CZeroconf::GetInstance()->PublishService("servers.jsonrpc-http", "_xbmc-jsonrpc-h._tcp", g_infoManager.GetLabel(SYSTEM_FRIENDLY_NAME), webPort, txt); #endif // HAS_JSONRPC #endif // HAS_ZEROCONF @@ -552,12 +525,14 @@ if (!IsWebserverRunning()) return true; + CLog::Log(LOGNOTICE, "Webserver: Stopping..."); if (!m_webserver.Stop() || m_webserver.IsStarted()) { CLog::Log(LOGWARNING, "Webserver: Failed to stop."); return false; } + CLog::Log(LOGNOTICE, "Webserver: Stopped..."); #ifdef HAS_ZEROCONF #ifdef HAS_WEB_INTERFACE CZeroconf::GetInstance()->RemoveService("servers.webserver"); @@ -574,11 +549,8 @@ bool CNetworkServices::StartAirPlayServer() { - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_AIRPLAYVIDEOSUPPORT)) - return true; - #ifdef HAS_AIRPLAY - if (!g_application.getNetwork().IsAvailable() || !CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_AIRPLAY)) + if (!g_application.getNetwork().IsAvailable() || !CSettings::Get().GetBool("services.airplay")) return false; if (IsAirPlayServerRunning()) @@ -587,24 +559,31 @@ if (!CAirPlayServer::StartServer(g_advancedSettings.m_airPlayPort, true)) return false; - if (!CAirPlayServer::SetCredentials(CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_USEAIRPLAYPASSWORD), - CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_AIRPLAYPASSWORD))) + if (!CAirPlayServer::SetCredentials(CSettings::Get().GetBool("services.useairplaypassword"), + CSettings::Get().GetString("services.airplaypassword"))) return false; #ifdef HAS_ZEROCONF std::vector > txt; CNetworkInterface* iface = g_application.getNetwork().GetFirstConnectedInterface(); - txt.push_back(std::make_pair("deviceid", iface != NULL ? iface->GetMacAddress() : "FF:FF:FF:FF:FF:F2")); - txt.push_back(std::make_pair("model", "Xbmc,1")); - txt.push_back(std::make_pair("srcvers", AIRPLAY_SERVER_VERSION_STR)); - - // for ios8 clients we need to announce mirroring support - // else we won't get video urls anymore. - // We also announce photo caching support (as it seems faster and - // we have implemented it anyways). - txt.push_back(std::make_pair("features", "0x20F7")); + txt.push_back(make_pair("deviceid", iface != NULL ? iface->GetMacAddress() : "FF:FF:FF:FF:FF:F2")); + txt.push_back(make_pair("model", "Xbmc,1")); + txt.push_back(make_pair("srcvers", AIRPLAY_SERVER_VERSION_STR)); + + if (CSettings::Get().GetBool("services.airplayios8compat")) + { + // for ios8 clients we need to announce mirroring support + // else we won't get video urls anymore. + // We also announce photo caching support (as it seems faster and + // we have implemented it anyways). + txt.push_back(make_pair("features", "0x20F7")); + } + else + { + txt.push_back(make_pair("features", "0x77")); + } - CZeroconf::GetInstance()->PublishService("servers.airplay", "_airplay._tcp", CSysInfo::GetDeviceName(), g_advancedSettings.m_airPlayPort, txt); + CZeroconf::GetInstance()->PublishService("servers.airplay", "_airplay._tcp", g_infoManager.GetLabel(SYSTEM_FRIENDLY_NAME), g_advancedSettings.m_airPlayPort, txt); #endif // HAS_ZEROCONF return true; @@ -640,15 +619,15 @@ bool CNetworkServices::StartAirTunesServer() { #ifdef HAS_AIRTUNES - if (!g_application.getNetwork().IsAvailable() || !CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_AIRPLAY)) + if (!g_application.getNetwork().IsAvailable() || !CSettings::Get().GetBool("services.airplay")) return false; if (IsAirTunesServerRunning()) return true; if (!CAirTunesServer::StartServer(g_advancedSettings.m_airTunesPort, true, - CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_USEAIRPLAYPASSWORD), - CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_AIRPLAYPASSWORD))) + CSettings::Get().GetBool("services.useairplaypassword"), + CSettings::Get().GetString("services.airplaypassword"))) { CLog::Log(LOGERROR, "Failed to start AirTunes Server"); return false; @@ -682,18 +661,18 @@ bool CNetworkServices::StartJSONRPCServer() { #ifdef HAS_JSONRPC - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESENABLED)) + if (!CSettings::Get().GetBool("services.esenabled")) return false; if (IsJSONRPCServerRunning()) return true; - if (!CTCPServer::StartServer(g_advancedSettings.m_jsonTcpPort, CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESALLINTERFACES))) + if (!CTCPServer::StartServer(g_advancedSettings.m_jsonTcpPort, CSettings::Get().GetBool("services.esallinterfaces"))) return false; #ifdef HAS_ZEROCONF std::vector > txt; - CZeroconf::GetInstance()->PublishService("servers.jsonrpc-tpc", "_xbmc-jsonrpc._tcp", CSysInfo::GetDeviceName(), g_advancedSettings.m_jsonTcpPort, txt); + CZeroconf::GetInstance()->PublishService("servers.jsonrpc-tpc", "_xbmc-jsonrpc._tcp", g_infoManager.GetLabel(SYSTEM_FRIENDLY_NAME), g_advancedSettings.m_jsonTcpPort, txt); #endif // HAS_ZEROCONF return true; @@ -729,7 +708,7 @@ bool CNetworkServices::StartEventServer() { #ifdef HAS_EVENT_SERVER - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESENABLED)) + if (!CSettings::Get().GetBool("services.esenabled")) return false; if (IsEventServerRunning()) @@ -742,6 +721,7 @@ return false; } + CLog::Log(LOGNOTICE, "ES: Starting event server"); server->StartServer(); return true; @@ -774,8 +754,9 @@ { if (server->GetNumberOfClients() > 0) { - if (HELPERS::ShowYesNoDialogText(CVariant{13140}, CVariant{13141}, CVariant{""}, CVariant{""}, 10000) != - DialogResponse::YES) + bool cancelled = false; + if (!CGUIDialogYesNo::ShowAndGetInput(13140, 13141, cancelled, "", "", 10000) + || cancelled) { CLog::Log(LOGNOTICE, "ES: Not stopping event server"); return false; @@ -801,7 +782,7 @@ bool CNetworkServices::RefreshEventServer() { #ifdef HAS_EVENT_SERVER - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ESENABLED)) + if (!CSettings::Get().GetBool("services.esenabled")) return false; if (!IsEventServerRunning()) @@ -874,8 +855,8 @@ bool CNetworkServices::StartUPnPController() { #ifdef HAS_UPNP - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_UPNPCONTROLLER) || - !CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_UPNPSERVER)) + if (!CSettings::Get().GetBool("services.upnpcontroller") || + !CSettings::Get().GetBool("services.upnpserver")) return false; CLog::Log(LOGNOTICE, "starting upnp controller"); @@ -910,7 +891,7 @@ bool CNetworkServices::StartUPnPRenderer() { #ifdef HAS_UPNP - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_UPNPRENDERER)) + if (!CSettings::Get().GetBool("services.upnprenderer")) return false; CLog::Log(LOGNOTICE, "starting upnp renderer"); @@ -944,7 +925,7 @@ bool CNetworkServices::StartUPnPServer() { #ifdef HAS_UPNP - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_UPNPSERVER)) + if (!CSettings::Get().GetBool("services.upnpserver")) return false; CLog::Log(LOGNOTICE, "starting upnp server"); @@ -982,13 +963,13 @@ if (IsRssRunning()) return true; - CRssManager::GetInstance().Start(); + CRssManager::Get().Start(); return true; } bool CNetworkServices::IsRssRunning() { - return CRssManager::GetInstance().IsActive(); + return CRssManager::Get().IsActive(); } bool CNetworkServices::StopRss() @@ -996,14 +977,14 @@ if (!IsRssRunning()) return true; - CRssManager::GetInstance().Stop(); + CRssManager::Get().Stop(); return true; } bool CNetworkServices::StartZeroconf() { #ifdef HAS_ZEROCONF - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_ZEROCONF)) + if (!CSettings::Get().GetBool("services.zeroconf")) return false; if (IsZeroconfRunning()) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/NetworkServices.h kodi-15.2~git20151019.1039-final/xbmc/network/NetworkServices.h --- kodi-16.1~git20160425.1001-final/xbmc/network/NetworkServices.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/NetworkServices.h 2015-10-19 08:39:16.000000000 +0000 @@ -42,11 +42,11 @@ class CNetworkServices : public ISettingCallback { public: - static CNetworkServices& GetInstance(); + static CNetworkServices& Get(); - virtual bool OnSettingChanging(const CSetting *setting) override; - virtual void OnSettingChanged(const CSetting *setting) override; - virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode) override; + virtual bool OnSettingChanging(const CSetting *setting); + virtual void OnSettingChanged(const CSetting *setting); + virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode); void Start(); void Stop(bool bWait); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/Socket.cpp kodi-15.2~git20151019.1039-final/xbmc/network/Socket.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/Socket.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/Socket.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,6 +29,7 @@ #include using namespace SOCKETS; +//using namespace std; On VS2010, bind conflicts with std::bind #ifdef WINSOCK_VERSION #define close closesocket diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/TCPServer.cpp kodi-15.2~git20151019.1039-final/xbmc/network/TCPServer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/TCPServer.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/TCPServer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -34,12 +34,10 @@ #include "websocket/WebSocketManager.h" #include "Network.h" -#if defined(TARGET_WINDOWS) || defined(HAVE_LIBBLUETOOTH) static const char bt_service_name[] = "XBMC JSON-RPC"; static const char bt_service_desc[] = "Interface for XBMC remote control over bluetooth"; static const char bt_service_prov[] = "XBMC JSON-RPC Provider"; static const uint32_t bt_service_guid[] = {0x65AE4CC0, 0x775D11E0, 0xBE16CE28, 0x4824019B}; -#endif #ifdef HAVE_LIBBLUETOOTH #include @@ -55,6 +53,7 @@ using namespace JSONRPC; using namespace ANNOUNCEMENT; +//using namespace std; On VS2010, bind conflicts with std::bind #define RECEIVEBUFFER 1024 @@ -256,7 +255,7 @@ if (started) { - CAnnouncementManager::GetInstance().AddAnnouncer(this); + CAnnouncementManager::Get().AddAnnouncer(this); CLog::Log(LOGINFO, "JSONRPC Server: Successfully initialized"); return true; } @@ -478,7 +477,7 @@ m_sdpd = NULL; #endif - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); } CTCPServer::CTCPClient::CTCPClient() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/TCPServer.h kodi-15.2~git20151019.1039-final/xbmc/network/TCPServer.h --- kodi-16.1~git20160425.1001-final/xbmc/network/TCPServer.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/TCPServer.h 2015-10-19 08:39:16.000000000 +0000 @@ -30,8 +30,6 @@ #include "threads/Thread.h" #include "websocket/WebSocket.h" -class CVariant; - namespace JSONRPC { class CTCPServer : public ITransportLayer, public JSONRPC::IJSONRPCAnnouncer, public CThread diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/test/TestWebServer.cpp kodi-15.2~git20151019.1039-final/xbmc/network/test/TestWebServer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/test/TestWebServer.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/test/TestWebServer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,6 @@ #include "utils/JSONVariantParser.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" using namespace XFILE; @@ -84,12 +83,12 @@ source.m_iLockMode = LOCK_MODE_EVERYONE; source.m_ignore = true; - CMediaSourceSettings::GetInstance().AddShare("videos", source); + CMediaSourceSettings::Get().AddShare("videos", source); } void TearDownMediaSources() { - CMediaSourceSettings::GetInstance().Clear(); + CMediaSourceSettings::Get().Clear(); } std::string GetUrl(const std::string& path) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnP.cpp kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnP.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnP.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnP.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,7 @@ #include "UPnPSettings.h" #include "utils/URIUtils.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "network/Network.h" #include "utils/log.h" #include "URL.h" @@ -43,14 +43,14 @@ #include "GUIUserMessages.h" #include "FileItem.h" #include "guilib/GUIWindowManager.h" +#include "GUIInfoManager.h" #include "utils/TimeUtils.h" #include "video/VideoInfoTag.h" #include "input/Key.h" #include "Util.h" -#include "utils/SystemInfo.h" +using namespace std; using namespace UPNP; -using namespace KODI::MESSAGING; NPT_SET_LOCAL_LOGGER("xbmc.upnp") @@ -234,7 +234,7 @@ bool SaveFileState(const CFileItem& item, const CBookmark& bookmark, const bool updatePlayCount) { - std::string path = item.GetProperty("original_listitem_url").asString(); + string path = item.GetProperty("original_listitem_url").asString(); if (!item.HasVideoInfoTag() || path.empty()) { return false; } @@ -382,7 +382,7 @@ if (device->GetUUID().IsEmpty() || device->GetUUID().GetChars() == NULL) return false; - CPlayerCoreFactory::GetInstance().OnPlayerDiscovered((const char*)device->GetUUID() + CPlayerCoreFactory::Get().OnPlayerDiscovered((const char*)device->GetUUID() ,(const char*)device->GetFriendlyName() , EPC_UPNPPLAYER); m_registeredRenderers.insert(std::string(device->GetUUID().GetChars())); @@ -402,7 +402,7 @@ private: void unregisterRenderer(const std::string &deviceUUID) { - CPlayerCoreFactory::GetInstance().OnPlayerRemoved(deviceUUID); + CPlayerCoreFactory::Get().OnPlayerRemoved(deviceUUID); } std::set m_registeredRenderers; @@ -627,19 +627,19 @@ CUPnP::CreateServer(int port /* = 0 */) { CUPnPServer* device = - new CUPnPServer(CSysInfo::GetDeviceName().c_str(), - CUPnPSettings::GetInstance().GetServerUUID().length() ? CUPnPSettings::GetInstance().GetServerUUID().c_str() : NULL, + new CUPnPServer(g_infoManager.GetLabel(SYSTEM_FRIENDLY_NAME).c_str(), + CUPnPSettings::Get().GetServerUUID().length() ? CUPnPSettings::Get().GetServerUUID().c_str() : NULL, port); // trying to set optional upnp values for XP UPnP UI Icons to detect us // but it doesn't work anyways as it requires multicast for XP to detect us device->m_PresentationURL = NPT_HttpUrl(m_IP.c_str(), - CSettings::GetInstance().GetInt(CSettings::SETTING_SERVICES_WEBSERVERPORT), + CSettings::Get().GetInt("services.webserverport"), "/").ToString(); device->m_ModelName = "Kodi"; - device->m_ModelNumber = CSysInfo::GetVersion().c_str(); + device->m_ModelNumber = g_infoManager.GetVersion().c_str(); device->m_ModelDescription = "Kodi - Media Server"; device->m_ModelURL = "http://kodi.tv/"; device->m_Manufacturer = "XBMC Foundation"; @@ -658,38 +658,38 @@ if (!m_ServerHolder->m_Device.IsNull()) return false; // load upnpserver.xml - std::string filename = URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetUserDataFolder(), "upnpserver.xml"); - CUPnPSettings::GetInstance().Load(filename); + std::string filename = URIUtils::AddFileToFolder(CProfilesManager::Get().GetUserDataFolder(), "upnpserver.xml"); + CUPnPSettings::Get().Load(filename); // create the server with a XBox compatible friendlyname and UUID from upnpserver.xml if found - m_ServerHolder->m_Device = CreateServer(CUPnPSettings::GetInstance().GetServerPort()); + m_ServerHolder->m_Device = CreateServer(CUPnPSettings::Get().GetServerPort()); // start server NPT_Result res = m_UPnP->AddDevice(m_ServerHolder->m_Device); if (NPT_FAILED(res)) { // if the upnp device port was not 0, it could have failed because // of port being in used, so restart with a random port - if (CUPnPSettings::GetInstance().GetServerPort() > 0) m_ServerHolder->m_Device = CreateServer(0); + if (CUPnPSettings::Get().GetServerPort() > 0) m_ServerHolder->m_Device = CreateServer(0); res = m_UPnP->AddDevice(m_ServerHolder->m_Device); } // save port but don't overwrite saved settings if port was random if (NPT_SUCCEEDED(res)) { - if (CUPnPSettings::GetInstance().GetServerPort() == 0) { - CUPnPSettings::GetInstance().SetServerPort(m_ServerHolder->m_Device->GetPort()); + if (CUPnPSettings::Get().GetServerPort() == 0) { + CUPnPSettings::Get().SetServerPort(m_ServerHolder->m_Device->GetPort()); } CUPnPServer::m_MaxReturnedItems = UPNP_DEFAULT_MAX_RETURNED_ITEMS; - if (CUPnPSettings::GetInstance().GetMaximumReturnedItems() > 0) { + if (CUPnPSettings::Get().GetMaximumReturnedItems() > 0) { // must be > UPNP_DEFAULT_MIN_RETURNED_ITEMS - CUPnPServer::m_MaxReturnedItems = std::max(UPNP_DEFAULT_MIN_RETURNED_ITEMS, CUPnPSettings::GetInstance().GetMaximumReturnedItems()); + CUPnPServer::m_MaxReturnedItems = max(UPNP_DEFAULT_MIN_RETURNED_ITEMS, CUPnPSettings::Get().GetMaximumReturnedItems()); } - CUPnPSettings::GetInstance().SetMaximumReturnedItems(CUPnPServer::m_MaxReturnedItems); + CUPnPSettings::Get().SetMaximumReturnedItems(CUPnPServer::m_MaxReturnedItems); } // save UUID - CUPnPSettings::GetInstance().SetServerUUID(m_ServerHolder->m_Device->GetUUID().GetChars()); - return CUPnPSettings::GetInstance().Save(filename); + CUPnPSettings::Get().SetServerUUID(m_ServerHolder->m_Device->GetUUID().GetChars()); + return CUPnPSettings::Get().Save(filename); } /*---------------------------------------------------------------------- @@ -711,17 +711,17 @@ CUPnP::CreateRenderer(int port /* = 0 */) { CUPnPRenderer* device = - new CUPnPRenderer(CSysInfo::GetDeviceName().c_str(), + new CUPnPRenderer(g_infoManager.GetLabel(SYSTEM_FRIENDLY_NAME).c_str(), false, - (CUPnPSettings::GetInstance().GetRendererUUID().length() ? CUPnPSettings::GetInstance().GetRendererUUID().c_str() : NULL), + (CUPnPSettings::Get().GetRendererUUID().length() ? CUPnPSettings::Get().GetRendererUUID().c_str() : NULL), port); device->m_PresentationURL = NPT_HttpUrl(m_IP.c_str(), - CSettings::GetInstance().GetInt(CSettings::SETTING_SERVICES_WEBSERVERPORT), + CSettings::Get().GetInt("services.webserverport"), "/").ToString(); device->m_ModelName = "Kodi"; - device->m_ModelNumber = CSysInfo::GetVersion().c_str(); + device->m_ModelNumber = g_infoManager.GetVersion().c_str(); device->m_ModelDescription = "Kodi - Media Renderer"; device->m_ModelURL = "http://kodi.tv/"; device->m_Manufacturer = "XBMC Foundation"; @@ -737,28 +737,28 @@ { if (!m_RendererHolder->m_Device.IsNull()) return false; - std::string filename = URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetUserDataFolder(), "upnpserver.xml"); - CUPnPSettings::GetInstance().Load(filename); + std::string filename = URIUtils::AddFileToFolder(CProfilesManager::Get().GetUserDataFolder(), "upnpserver.xml"); + CUPnPSettings::Get().Load(filename); - m_RendererHolder->m_Device = CreateRenderer(CUPnPSettings::GetInstance().GetRendererPort()); + m_RendererHolder->m_Device = CreateRenderer(CUPnPSettings::Get().GetRendererPort()); NPT_Result res = m_UPnP->AddDevice(m_RendererHolder->m_Device); // failed most likely because port is in use, try again with random port now - if (NPT_FAILED(res) && CUPnPSettings::GetInstance().GetRendererPort() != 0) { + if (NPT_FAILED(res) && CUPnPSettings::Get().GetRendererPort() != 0) { m_RendererHolder->m_Device = CreateRenderer(0); res = m_UPnP->AddDevice(m_RendererHolder->m_Device); } // save port but don't overwrite saved settings if random - if (NPT_SUCCEEDED(res) && CUPnPSettings::GetInstance().GetRendererPort() == 0) { - CUPnPSettings::GetInstance().SetRendererPort(m_RendererHolder->m_Device->GetPort()); + if (NPT_SUCCEEDED(res) && CUPnPSettings::Get().GetRendererPort() == 0) { + CUPnPSettings::Get().SetRendererPort(m_RendererHolder->m_Device->GetPort()); } // save UUID - CUPnPSettings::GetInstance().SetRendererUUID(m_RendererHolder->m_Device->GetUUID().GetChars()); - return CUPnPSettings::GetInstance().Save(filename); + CUPnPSettings::Get().SetRendererUUID(m_RendererHolder->m_Device->GetUUID().GetChars()); + return CUPnPSettings::Get().Save(filename); } /*---------------------------------------------------------------------- diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPInternal.cpp kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPInternal.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPInternal.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPInternal.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -240,11 +240,11 @@ object.m_People.artists.Add(tag.GetArtist().at(index).c_str()); object.m_People.artists.Add(tag.GetArtist().at(index).c_str(), "Performer"); } - object.m_People.artists.Add((!tag.GetAlbumArtistString().empty() ? tag.GetAlbumArtistString() : tag.GetArtistString()).c_str(), "AlbumArtist"); - if(tag.GetAlbumArtistString().empty()) - object.m_Creator = tag.GetArtistString().c_str(); + object.m_People.artists.Add(StringUtils::Join(!tag.GetAlbumArtist().empty() ? tag.GetAlbumArtist() : tag.GetArtist(), g_advancedSettings.m_musicItemSeparator).c_str(), "AlbumArtist"); + if(tag.GetAlbumArtist().empty()) + object.m_Creator = StringUtils::Join(tag.GetArtist(), g_advancedSettings.m_musicItemSeparator).c_str(); else - object.m_Creator = tag.GetAlbumArtistString().c_str(); + object.m_Creator = StringUtils::Join(tag.GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator).c_str(); object.m_MiscInfo.original_track_number = tag.GetTrackNumber(); if(tag.GetDatabaseId() >= 0) { object.m_ReferenceID = NPT_String::Format("musicdb://songs/%i%s", tag.GetDatabaseId(), URIUtils::GetExtension(tag.GetURL()).c_str()); @@ -317,9 +317,6 @@ object.m_XbmcInfo.rating = tag.m_fRating; object.m_XbmcInfo.votes = tag.m_strVotes.c_str(); object.m_XbmcInfo.unique_identifier = tag.m_strIMDBNumber.c_str(); - for (const auto& country : tag.m_country) - object.m_XbmcInfo.countries.Add(country.c_str()); - object.m_XbmcInfo.user_rating = tag.m_iUserRating; for (unsigned int index = 0; index < tag.m_genre.size(); index++) object.m_Affiliation.genres.Add(tag.m_genre.at(index).c_str()); @@ -475,9 +472,9 @@ CMusicInfoTag *tag = (CMusicInfoTag*)item.GetMusicInfoTag(); if (tag) { container->m_People.artists.Add( - CorrectAllItemsSortHack(tag->GetArtistString()).c_str(), "Performer"); + CorrectAllItemsSortHack(StringUtils::Join(tag->GetArtist(), g_advancedSettings.m_musicItemSeparator)).c_str(), "Performer"); container->m_People.artists.Add( - CorrectAllItemsSortHack((!tag->GetAlbumArtistString().empty() ? tag->GetAlbumArtistString() : tag->GetArtistString())).c_str(), "AlbumArtist"); + CorrectAllItemsSortHack(StringUtils::Join(!tag->GetAlbumArtist().empty() ? tag->GetAlbumArtist() : tag->GetArtist(), g_advancedSettings.m_musicItemSeparator)).c_str(), "AlbumArtist"); } #ifdef WMP_ID_MAPPING // Some upnp clients expect all artists to have parent root id 107 @@ -494,9 +491,9 @@ CMusicInfoTag *tag = (CMusicInfoTag*)item.GetMusicInfoTag(); if (tag) { container->m_People.artists.Add( - CorrectAllItemsSortHack(tag->GetArtistString()).c_str(), "Performer"); + CorrectAllItemsSortHack(StringUtils::Join(tag->GetArtist(), g_advancedSettings.m_musicItemSeparator)).c_str(), "Performer"); container->m_People.artists.Add( - CorrectAllItemsSortHack(!tag->GetAlbumArtistString().empty() ? tag->GetAlbumArtistString() : tag->GetArtistString()).c_str(), "AlbumArtist"); + CorrectAllItemsSortHack(StringUtils::Join(!tag->GetAlbumArtist().empty() ? tag->GetAlbumArtist() : tag->GetArtist(), g_advancedSettings.m_musicItemSeparator)).c_str(), "AlbumArtist"); container->m_Affiliation.album = CorrectAllItemsSortHack(tag->GetAlbum()).c_str(); } #ifdef WMP_ID_MAPPING @@ -623,7 +620,7 @@ // to look for external subtitles if (upnp_server != NULL && item.IsVideo() && (upnp_service == UPnPPlayer || upnp_service == UPnPRenderer || - CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_UPNPLOOKFOREXTERNALSUBTITLES))) + CSettings::Get().GetBool("services.upnplookforexternalsubtitles"))) { // find any available external subtitles std::vector filenames; @@ -653,7 +650,7 @@ else if (!subtitles.empty()) { /* trying to find subtitle with prefered language settings */ - std::string preferredLanguage = (CSettings::GetInstance().GetSetting("locale.subtitlelanguage"))->ToString(); + std::string preferredLanguage = (CSettings::Get().GetSetting("locale.subtitlelanguage"))->ToString(); std::string preferredLanguageCode; g_LangCodeExpander.ConvertToISO6392T(preferredLanguage, preferredLanguageCode); @@ -829,9 +826,6 @@ tag.m_fRating = object.m_XbmcInfo.rating; tag.m_strVotes = object.m_XbmcInfo.votes; tag.m_strIMDBNumber = object.m_XbmcInfo.unique_identifier; - for (unsigned int index = 0; index < object.m_XbmcInfo.countries.GetItemCount(); index++) - tag.m_country.push_back(object.m_XbmcInfo.countries.GetItem(index)->GetChars()); - tag.m_iUserRating = object.m_XbmcInfo.user_rating; for (unsigned int index = 0; index < object.m_Affiliation.genres.GetItemCount(); index++) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPPlayer.cpp kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPPlayer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPPlayer.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPPlayer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -29,21 +29,17 @@ #include "threads/Event.h" #include "utils/log.h" #include "utils/TimeUtils.h" -#include "utils/Variant.h" #include "GUIInfoManager.h" #include "ThumbLoader.h" #include "video/VideoThumbLoader.h" #include "music/MusicThumbLoader.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" +#include "ApplicationMessenger.h" #include "Application.h" #include "dialogs/GUIDialogBusy.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" +#include "dialogs/GUIDialogYesNo.h" -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; NPT_SET_LOCAL_LOGGER("xbmc.upnp.player") @@ -195,7 +191,7 @@ if(dialog == NULL) { dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); - dialog->Open(); + dialog->Show(); } g_windowManager.ProcessRenderLoop(false); @@ -531,7 +527,7 @@ m_current_meta = (const char*)meta; CFileItemPtr item = GetFileItem(uri, meta); g_application.CurrentFileItem() = *item; - CApplicationMessenger::GetInstance().PostMsg(TMSG_UPDATE_CURRENT_ITEM, 0, -1, static_cast(new CFileItem(*item))); + CApplicationMessenger::Get().SetCurrentItem(*item.get()); } NPT_CHECK_LABEL(m_delegate->m_transport->GetStateVariableValue("TransportState", data), failed); @@ -607,9 +603,10 @@ case ACTION_STOP: if(IsPlaying()) { - //stop on remote system - m_stopremote = HELPERS::ShowYesNoDialogText(CVariant{37022}, CVariant{37023}) == DialogResponse::YES; - + if(CGUIDialogYesNo::ShowAndGetInput(37022, 37023)) /* stop on remote system */ + m_stopremote = true; + else + m_stopremote = false; return false; /* let normal code handle the action */ } default: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPRenderer.cpp kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPRenderer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPRenderer.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPRenderer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,7 +24,7 @@ #include "UPnP.h" #include "UPnPInternal.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "FileItem.h" #include "filesystem/SpecialProtocol.h" #include "GUIInfoManager.h" @@ -42,12 +42,10 @@ #include "utils/StringUtils.h" #include "playlists/PlayList.h" #include "GUIUserMessages.h" -#include "guiinfo/GUIInfoLabels.h" NPT_SET_LOCAL_LOGGER("xbmc.upnp.renderer") using namespace ANNOUNCEMENT; -using namespace KODI::MESSAGING; namespace UPNP { @@ -59,7 +57,7 @@ const char* uuid /*= NULL*/, unsigned int port /*= 0*/) : PLT_MediaRenderer(friendly_name, show_ip, uuid, port) { - CAnnouncementManager::GetInstance().AddAnnouncer(this); + CAnnouncementManager::Get().AddAnnouncer(this); } /*---------------------------------------------------------------------- @@ -67,7 +65,7 @@ +---------------------------------------------------------------------*/ CUPnPRenderer::~CUPnPRenderer() { - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); } /*---------------------------------------------------------------------- @@ -448,9 +446,10 @@ CUPnPRenderer::OnNext(PLT_ActionReference& action) { if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(ACTION_NEXT_PICTURE))); + CAction action(ACTION_NEXT_PICTURE); + CApplicationMessenger::Get().SendAction(action, WINDOW_SLIDESHOW); } else { - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_NEXT); + CApplicationMessenger::Get().PlayListPlayerNext(); } return NPT_SUCCESS; } @@ -462,9 +461,10 @@ CUPnPRenderer::OnPause(PLT_ActionReference& action) { if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(ACTION_NEXT_PICTURE))); + CAction action(ACTION_PAUSE); + CApplicationMessenger::Get().SendAction(action, WINDOW_SLIDESHOW); } else if (!g_application.m_pPlayer->IsPausedPlayback()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE); + CApplicationMessenger::Get().MediaPause(); return NPT_SUCCESS; } @@ -477,7 +477,7 @@ if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) { return NPT_SUCCESS; } else if (g_application.m_pPlayer->IsPausedPlayback()) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE); + CApplicationMessenger::Get().MediaPause(); } else if (!g_application.m_pPlayer->IsPlaying()) { NPT_String uri, meta; PLT_Service* service; @@ -499,9 +499,10 @@ CUPnPRenderer::OnPrevious(PLT_ActionReference& action) { if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(ACTION_PREV_PICTURE))); + CAction action(ACTION_PREV_PICTURE); + CApplicationMessenger::Get().SendAction(action, WINDOW_SLIDESHOW); } else { - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_PREV); + CApplicationMessenger::Get().PlayListPlayerPrevious(); } return NPT_SUCCESS; } @@ -513,9 +514,10 @@ CUPnPRenderer::OnStop(PLT_ActionReference& action) { if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(ACTION_NEXT_PICTURE))); + CAction action(ACTION_STOP); + CApplicationMessenger::Get().SendAction(action, WINDOW_SLIDESHOW); } else { - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); + CApplicationMessenger::Get().MediaStop(); } return NPT_SUCCESS; } @@ -621,11 +623,9 @@ } if (item->IsPicture()) { - CApplicationMessenger::GetInstance().PostMsg(TMSG_PICTURE_SHOW, -1, -1, nullptr, item->GetPath()); + CApplicationMessenger::Get().PictureShow(item->GetPath()); } else { - CFileItemList *l = new CFileItemList; //don't delete, - l->Add(std::make_shared(*item)); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l)); + CApplicationMessenger::Get().MediaPlay(*item, false); } // just return success because the play actions are asynchronous diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPRenderer.h kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPRenderer.h --- kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPRenderer.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPRenderer.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,8 +22,6 @@ #include "interfaces/IAnnouncer.h" -class CVariant; - namespace UPNP { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPServer.cpp kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPServer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPServer.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPServer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -37,10 +37,8 @@ #include "settings/Settings.h" #include "utils/log.h" #include "utils/md5.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "Util.h" #include "music/MusicDatabase.h" #include "video/VideoDatabase.h" @@ -50,6 +48,7 @@ NPT_SET_LOCAL_LOGGER("xbmc.upnp.server") +using namespace std; using namespace ANNOUNCEMENT; using namespace XFILE; @@ -77,7 +76,7 @@ CUPnPServer::~CUPnPServer() { - ANNOUNCEMENT::CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + ANNOUNCEMENT::CAnnouncementManager::Get().RemoveAnnouncer(this); } /*---------------------------------------------------------------------- @@ -114,7 +113,7 @@ OnScanCompleted(VideoLibrary); // now safe to start passing on new notifications - ANNOUNCEMENT::CAnnouncementManager::GetInstance().AddAnnouncer(this); + ANNOUNCEMENT::CAnnouncementManager::Get().AddAnnouncer(this); return result; } @@ -143,13 +142,13 @@ | CUPnPServer::UpdateContainer +---------------------------------------------------------------------*/ void -CUPnPServer::UpdateContainer(const std::string& id) +CUPnPServer::UpdateContainer(const string& id) { - std::map >::iterator itr = m_UpdateIDs.find(id); + map >::iterator itr = m_UpdateIDs.find(id); unsigned long count = 0; if (itr != m_UpdateIDs.end()) count = ++itr->second.second; - m_UpdateIDs[id] = std::make_pair(true, count); + m_UpdateIDs[id] = make_pair(true, count); PropagateUpdates(); } @@ -161,10 +160,10 @@ { PLT_Service* service = NULL; NPT_String current_ids; - std::string buffer; - std::map >::iterator itr; + string buffer; + map >::iterator itr; - if (m_scanning || !CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_UPNPANNOUNCE)) + if (m_scanning || !CSettings::Get().GetBool("services.upnpannounce")) return; NPT_CHECK_LABEL(FindServiceById("urn:upnp-org:serviceId:ContentDirectory", service), failed); @@ -413,7 +412,7 @@ { NPT_String path; int item_id; - std::string item_type; + string item_type; if (strcmp(sender, "xbmc")) return; @@ -676,10 +675,10 @@ // this is the only way to hide unplayable items in the 'files' // view as we cannot tell what context (eg music vs video) the // request came from - std::string supported = g_advancedSettings.m_pictureExtensions + "|" - + g_advancedSettings.m_videoExtensions + "|" - + g_advancedSettings.GetMusicExtensions() + "|" - + g_advancedSettings.m_discStubExtensions; + string supported = g_advancedSettings.m_pictureExtensions + "|" + + g_advancedSettings.m_videoExtensions + "|" + + g_advancedSettings.GetMusicExtensions() + "|" + + g_advancedSettings.m_discStubExtensions; CDirectory::GetDirectory((const char*)parent_id, items, supported); DefaultSortItems(items); } @@ -770,8 +769,8 @@ // won't return more than UPNP_MAX_RETURNED_ITEMS items at a time to keep things smooth // 0 requested means as many as possible - NPT_UInt32 max_count = (requested_count == 0)?m_MaxReturnedItems:std::min((unsigned long)requested_count, (unsigned long)m_MaxReturnedItems); - NPT_UInt32 stop_index = std::min((unsigned long)(starting_index + max_count), (unsigned long)items.Size()); // don't return more than we can + NPT_UInt32 max_count = (requested_count == 0)?m_MaxReturnedItems:min((unsigned long)requested_count, (unsigned long)m_MaxReturnedItems); + NPT_UInt32 stop_index = min((unsigned long)(starting_index + max_count), (unsigned long)items.Size()); // don't return more than we can NPT_Cardinal count = 0; NPT_Cardinal total = items.Size(); @@ -994,7 +993,7 @@ return BuildResponse(action, itemsall, filter, starting_index, requested_count, sort_criteria, context, NULL); } else if (NPT_String(search_criteria).Find("object.item.imageItem") >= 0) { CFileItemList items; - return BuildResponse(action, items, filter, starting_index, requested_count, sort_criteria, context, NULL); + return BuildResponse(action, items, filter, starting_index, requested_count, sort_criteria, context, NULL);; } return NPT_FAILURE; @@ -1076,7 +1075,7 @@ CVariant data; data["id"] = updated.GetVideoInfoTag()->m_iDbId; data["type"] = updated.GetVideoInfoTag()->m_type; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", data); } updatelisting = true; } @@ -1233,8 +1232,8 @@ } bool sorted = false; - std::vector tokens = StringUtils::Split(criteria, ","); - for (std::vector::reverse_iterator itr = tokens.rbegin(); itr != tokens.rend(); ++itr) { + vector tokens = StringUtils::Split(criteria, ","); + for (vector::reverse_iterator itr = tokens.rbegin(); itr != tokens.rend(); ++itr) { SortDescription sorting; /* Platinum guarantees 1st char is - or + */ sorting.sortOrder = StringUtils::StartsWith(*itr, "+") ? SortOrderAscending : SortOrderDescending; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPServer.h kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPServer.h --- kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPServer.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPServer.h 2015-10-19 08:39:16.000000000 +0000 @@ -18,13 +18,11 @@ * */ #pragma once -#include #include -#include "FileItem.h" #include "interfaces/IAnnouncer.h" +#include "FileItem.h" -class CVariant; class CThumbLoader; class PLT_MediaObject; class PLT_HttpRequestContext; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPSettings.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPSettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,6 +33,7 @@ #define XML_RENDERER_UUID "UUIDRenderer" #define XML_RENDERER_PORT "PortRenderer" +using namespace std; using namespace XFILE; CUPnPSettings::CUPnPSettings() @@ -45,7 +46,7 @@ Clear(); } -CUPnPSettings& CUPnPSettings::GetInstance() +CUPnPSettings& CUPnPSettings::Get() { static CUPnPSettings sUPnPSettings; return sUPnPSettings; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPSettings.h kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/network/upnp/UPnPSettings.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/upnp/UPnPSettings.h 2015-10-19 08:39:16.000000000 +0000 @@ -26,9 +26,9 @@ class CUPnPSettings : public ISettingsHandler { public: - static CUPnPSettings& GetInstance(); + static CUPnPSettings& Get(); - virtual void OnSettingsUnloaded() override; + virtual void OnSettingsUnloaded(); bool Load(const std::string &file); bool Save(const std::string &file) const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/WakeOnAccess.cpp kodi-15.2~git20151019.1039-final/xbmc/network/WakeOnAccess.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/WakeOnAccess.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/WakeOnAccess.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -40,10 +40,11 @@ #include "utils/XMLUtils.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "WakeOnAccess.h" +using namespace std; + #define DEFAULT_NETWORK_INIT_SEC (20) // wait 20 sec for network after startup or resume #define DEFAULT_NETWORK_SETTLE_MS (500) // require 500ms of consistent network availability before trusting it @@ -106,8 +107,8 @@ return false; } - std::vector& ifaces = g_application.getNetwork().GetInterfaceList(); - for (std::vector::const_iterator it = ifaces.begin(); it != ifaces.end(); ++it) + vector& ifaces = g_application.getNetwork().GetInterfaceList(); + for (vector::const_iterator it = ifaces.begin(); it != ifaces.end(); ++it) { if ((*it)->GetHostMacAddress(ipAddress, m_macAddres)) return true; @@ -166,10 +167,17 @@ if (m_dialog) { - m_dialog->SetHeading(CVariant{heading}); - m_dialog->SetLine(0, CVariant{""}); - m_dialog->SetLine(1, CVariant{""}); - m_dialog->SetLine(2, CVariant{""}); + m_dialog->SetHeading (heading); + m_dialog->SetLine(0, ""); + m_dialog->SetLine(1, ""); + m_dialog->SetLine(2, ""); + + int nest_level = NestDetect::Level(); + if (nest_level > 1) + { + std::string nest = StringUtils::Format("Nesting:%d", nest_level); + m_dialog->SetLine(2, nest); + } } } ~ProgressDialogHelper () @@ -188,7 +196,7 @@ if (m_dialog) { - m_dialog->SetLine(0, CVariant{line1}); + m_dialog->SetLine(1, line1); m_dialog->SetPercentage(1); // avoid flickering by starting at 1% .. } @@ -203,7 +211,7 @@ if (m_dialog) { if (!m_dialog->IsActive()) - m_dialog->Open(); + m_dialog->StartModal(); if (m_dialog->IsCanceled()) return Canceled; @@ -213,7 +221,7 @@ unsigned ms_passed = timeOutMs - end_time.MillisLeft(); int percentage = (ms_passed * 100) / timeOutMs; - m_dialog->SetPercentage(std::max(percentage, 1)); // avoid flickering , keep minimum 1% + m_dialog->SetPercentage(max(percentage, 1)); // avoid flickering , keep minimum 1% } Sleep (m_dialog ? 20 : 200); @@ -315,7 +323,7 @@ { } -CWakeOnAccess &CWakeOnAccess::GetInstance() +CWakeOnAccess &CWakeOnAccess::Get() { static CWakeOnAccess sWakeOnAccess; return sWakeOnAccess; @@ -330,7 +338,7 @@ return true; } -bool CWakeOnAccess::WakeUpHost (const std::string& hostName, const std::string& customMessage) +bool CWakeOnAccess::WakeUpHost (const std::string& hostName, const string& customMessage) { if (!IsEnabled()) return true; // bail if feature is turned off @@ -445,7 +453,7 @@ { CDateTime now = CDateTime::GetCurrentDateTime(); - if (now >= server.nextWake) + if (now > server.nextWake) { result = server; need_wakeup = true; @@ -478,9 +486,9 @@ } } -static void AddHost (const std::string& host, std::vector& hosts) +static void AddHost (const std::string& host, vector& hosts) { - for (std::vector::const_iterator it = hosts.begin(); it != hosts.end(); ++it) + for (vector::const_iterator it = hosts.begin(); it != hosts.end(); ++it) if (StringUtils::EqualsNoCase(host, *it)) return; // allready there .. @@ -488,7 +496,7 @@ hosts.push_back(host); } -static void AddHostFromDatabase(const DatabaseSettings& setting, std::vector& hosts) +static void AddHostFromDatabase(const DatabaseSettings& setting, vector& hosts) { if (StringUtils::EqualsNoCase(setting.type, "mysql")) AddHost(setting.host, hosts); @@ -507,7 +515,7 @@ static void AddHostsFromMediaSource(const CMediaSource& source, std::vector& hosts) { - for (std::vector::const_iterator it = source.vecPaths.begin() ; it != source.vecPaths.end(); ++it) + for (vector::const_iterator it = source.vecPaths.begin() ; it != source.vecPaths.end(); ++it) { CURL url(*it); @@ -515,13 +523,13 @@ } } -static void AddHostsFromVecSource(const VECSOURCES& sources, std::vector& hosts) +static void AddHostsFromVecSource(const VECSOURCES& sources, vector& hosts) { for (VECSOURCES::const_iterator it = sources.begin(); it != sources.end(); ++it) AddHostsFromMediaSource(*it, hosts); } -static void AddHostsFromVecSource(const VECSOURCES* sources, std::vector& hosts) +static void AddHostsFromVecSource(const VECSOURCES* sources, vector& hosts) { if (sources) AddHostsFromVecSource(*sources, hosts); @@ -529,10 +537,10 @@ void CWakeOnAccess::QueueMACDiscoveryForAllRemotes() { - std::vector hosts; + vector hosts; // add media sources - CMediaSourceSettings& ms = CMediaSourceSettings::GetInstance(); + CMediaSourceSettings& ms = CMediaSourceSettings::Get(); AddHostsFromVecSource(ms.GetSources("video"), hosts); AddHostsFromVecSource(ms.GetSources("music"), hosts); @@ -554,7 +562,7 @@ AddHost (url.GetHostName(), hosts); } - for (std::vector::const_iterator it = hosts.begin(); it != hosts.end(); ++it) + for (vector::const_iterator it = hosts.begin(); it != hosts.end(); ++it) QueueMACDiscoveryForHost(*it); } @@ -627,23 +635,6 @@ } } -void CWakeOnAccess::OnSettingChanged(const CSetting *setting) -{ - if (setting == nullptr) - return; - - const std::string& settingId = setting->GetId(); - if (settingId == CSettings::SETTING_POWERMANAGEMENT_WAKEONACCESS) - { - bool enabled = static_cast(setting)->GetValue(); - - SetEnabled(enabled); - - if (enabled) - QueueMACDiscoveryForAllRemotes(); - } -} - std::string CWakeOnAccess::GetSettingFile() { return CSpecialProtocol::TranslatePath("special://profile/wakeonlan.xml"); @@ -656,6 +647,19 @@ LoadFromXML(); } +void CWakeOnAccess::OnSettingsSaved() +{ + bool enabled = CSettings::Get().GetBool("powermanagement.wakeonaccess"); + + if (enabled != IsEnabled()) + { + SetEnabled(enabled); + + if (enabled) + QueueMACDiscoveryForAllRemotes(); + } +} + void CWakeOnAccess::SetEnabled(bool enabled) { m_enabled = enabled; @@ -665,7 +669,7 @@ void CWakeOnAccess::LoadFromXML() { - bool enabled = CSettings::GetInstance().GetBool(CSettings::SETTING_POWERMANAGEMENT_WAKEONACCESS); + bool enabled = CSettings::Get().GetBool("powermanagement.wakeonaccess"); CXBMCTinyXML xmlDoc; if (!xmlDoc.LoadFile(GetSettingFile())) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/WakeOnAccess.h kodi-15.2~git20151019.1039-final/xbmc/network/WakeOnAccess.h --- kodi-16.1~git20160425.1001-final/xbmc/network/WakeOnAccess.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/WakeOnAccess.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,23 +21,22 @@ #include "URL.h" #include "XBDateTime.h" #include "utils/Job.h" -#include "settings/lib/ISettingCallback.h" #include "settings/lib/ISettingsHandler.h" #include -class CWakeOnAccess : private IJobCallback, public ISettingCallback, public ISettingsHandler +class CWakeOnAccess : private IJobCallback, public ISettingsHandler { public: - static CWakeOnAccess &GetInstance(); + static CWakeOnAccess &Get(); bool WakeUpHost (const CURL& fileUrl); bool WakeUpHost (const std::string& hostName, const std::string& customMessage); void QueueMACDiscoveryForAllRemotes(); - virtual void OnJobComplete(unsigned int jobID, bool success, CJob *job) override; - virtual void OnSettingChanged(const CSetting *setting) override; - virtual void OnSettingsLoaded() override; + virtual void OnJobComplete(unsigned int jobID, bool success, CJob *job); + virtual void OnSettingsLoaded(); + virtual void OnSettingsSaved(); // struct to keep per host settings struct WakeUpEntry diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/WebServer.cpp kodi-15.2~git20151019.1039-final/xbmc/network/WebServer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/WebServer.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/WebServer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,28 +25,23 @@ #include "WebServer.h" #ifdef HAS_WEB_SERVER -#include #include +#include #include -#include - -#if defined(TARGET_POSIX) -#include -#endif +#include "URL.h" +#include "Util.h" +#include "XBDateTime.h" #include "filesystem/File.h" #include "network/httprequesthandler/IHTTPRequestHandler.h" #include "settings/Settings.h" #include "threads/SingleLock.h" -#include "URL.h" -#include "Util.h" #include "utils/Base64.h" #include "utils/log.h" #include "utils/Mime.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "utils/Variant.h" -#include "XBDateTime.h" //#define WEBSERVER_DEBUG @@ -67,6 +62,8 @@ #define HEADER_NEWLINE "\r\n" +using namespace std; + typedef struct ConnectionHandler { std::string fullUri; @@ -79,37 +76,24 @@ std::shared_ptr file; CHttpRanges ranges; size_t rangeCountTotal; - std::string boundary; - std::string boundaryWithHeader; - std::string boundaryEnd; + string boundary; + string boundaryWithHeader; + string boundaryEnd; bool boundaryWritten; - std::string contentType; + string contentType; uint64_t writePosition; } HttpFileDownloadContext; -std::vector CWebServer::m_requestHandlers; +vector CWebServer::m_requestHandlers; CWebServer::CWebServer() : m_daemon_ip6(NULL), m_daemon_ip4(NULL), m_running(false), m_needcredentials(false), - m_thread_stacksize(0), m_Credentials64Encoded("eGJtYzp4Ym1j") // xbmc:xbmc -{ -#if defined(TARGET_DARWIN) - void *stack_addr; - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_getstack(&attr, &stack_addr, &m_thread_stacksize); - pthread_attr_destroy(&attr); - // double the stack size under darwin, not sure why yet - // but it stoped crashing using Kodi iOS remote -> play video. - // non-darwin will pass a value of zero which means 'system default' - m_thread_stacksize *= 2; - CLog::Log(LOGDEBUG, "CWebServer: increasing thread stack to %zu", m_thread_stacksize); -#endif -} + +{ } HTTPMethod CWebServer::GetMethod(const char *method) { @@ -128,8 +112,8 @@ if (cls == NULL || key == NULL) return MHD_NO; - std::map *arguments = (std::map *)cls; - arguments->insert(std::make_pair(key, value != NULL ? value : "")); + map *arguments = (map *)cls; + arguments->insert(make_pair(key, value != NULL ? value : "")); return MHD_YES; } @@ -138,8 +122,8 @@ if (cls == NULL || key == NULL) return MHD_NO; - std::multimap *arguments = (std::multimap *)cls; - arguments->insert(std::make_pair(key, value != NULL ? value : "")); + multimap *arguments = (multimap *)cls; + arguments->insert(make_pair(key, value != NULL ? value : "")); return MHD_YES; } @@ -185,7 +169,7 @@ return true; const char *base = "Basic "; - std::string authorization = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_AUTHORIZATION); + string authorization = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_AUTHORIZATION); if (authorization.empty() || !StringUtils::StartsWith(authorization, base)) return false; @@ -260,7 +244,7 @@ bool ranged = ranges.Parse(GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_RANGE)); // look for a IHTTPRequestHandler which can take care of the current request - for (std::vector::const_iterator it = m_requestHandlers.begin(); it != m_requestHandlers.end(); ++it) + for (vector::const_iterator it = m_requestHandlers.begin(); it != m_requestHandlers.end(); ++it) { IHTTPRequestHandler *requestHandler = *it; if (requestHandler->CanHandleRequest(request)) @@ -276,13 +260,13 @@ bool cacheable = true; // handle Cache-Control - std::string cacheControl = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CACHE_CONTROL); + string cacheControl = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CACHE_CONTROL); if (!cacheControl.empty()) { - std::vector cacheControls = StringUtils::Split(cacheControl, ","); - for (std::vector::const_iterator it = cacheControls.begin(); it != cacheControls.end(); ++it) + vector cacheControls = StringUtils::Split(cacheControl, ","); + for (vector::const_iterator it = cacheControls.begin(); it != cacheControls.end(); ++it) { - std::string control = *it; + string control = *it; control = StringUtils::Trim(control); // handle no-cache @@ -294,7 +278,7 @@ if (cacheable) { // handle Pragma (but only if "Cache-Control: no-cache" hasn't been set) - std::string pragma = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_PRAGMA); + string pragma = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_PRAGMA); if (pragma.compare(HEADER_VALUE_NO_CACHE) == 0) cacheable = false; } @@ -303,8 +287,8 @@ if (handler->GetLastModifiedDate(lastModified) && lastModified.IsValid()) { // handle If-Modified-Since or If-Unmodified-Since - std::string ifModifiedSince = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_MODIFIED_SINCE); - std::string ifUnmodifiedSince = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_UNMODIFIED_SINCE); + string ifModifiedSince = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_MODIFIED_SINCE); + string ifUnmodifiedSince = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_UNMODIFIED_SINCE); CDateTime ifModifiedSinceDate; CDateTime ifUnmodifiedSinceDate; @@ -331,7 +315,7 @@ // handle If-Range header but only if the Range header is present if (ranged && lastModified.IsValid()) { - std::string ifRange = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_RANGE); + string ifRange = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_RANGE); if (!ifRange.empty() && lastModified.IsValid()) { CDateTime ifRangeDate; @@ -354,7 +338,7 @@ conHandler->requestHandler = handler; // get the content-type of the POST data - std::string contentType = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CONTENT_TYPE); + string contentType = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CONTENT_TYPE); if (!contentType.empty()) { // if the content-type is application/x-ww-form-urlencoded or multipart/form-data we can use MHD's POST processor @@ -430,7 +414,7 @@ // it's unusual to get more than one call to AnswerToConnection for none-POST requests, but let's handle it anyway else { - for (std::vector::const_iterator it = m_requestHandlers.begin(); it != m_requestHandlers.end(); ++it) + for (vector::const_iterator it = m_requestHandlers.begin(); it != m_requestHandlers.end(); ++it) { IHTTPRequestHandler *requestHandler = *it; if (requestHandler->CanHandleRequest(request)) @@ -464,7 +448,7 @@ return MHD_NO; } - conHandler->requestHandler->AddPostField(key, std::string(data, size)); + conHandler->requestHandler->AddPostField(key, string(data, size)); return MHD_YES; } @@ -588,7 +572,7 @@ handler->AddResponseHeader(MHD_HTTP_HEADER_CONTENT_LENGTH, StringUtils::Format("%" PRIu64, responseDetails.totalLength)); // add all headers set by the request handler - for (std::multimap::const_iterator it = responseDetails.headers.begin(); it != responseDetails.headers.end(); ++it) + for (multimap::const_iterator it = responseDetails.headers.begin(); it != responseDetails.headers.end(); ++it) AddHeader(response, it->first, it->second); #ifdef WEBSERVER_DEBUG @@ -746,7 +730,7 @@ return CreateMemoryDownloadResponse(request.connection, result.c_str(), result.size(), false, true, response); } -int CWebServer::CreateRedirect(struct MHD_Connection *connection, const std::string &strURL, struct MHD_Response *&response) +int CWebServer::CreateRedirect(struct MHD_Connection *connection, const string &strURL, struct MHD_Response *&response) { response = MHD_create_response_from_data(0, NULL, MHD_NO, MHD_NO); if (response == NULL) @@ -781,7 +765,7 @@ uint64_t fileLength = static_cast(file->GetLength()); // get the MIME type for the Content-Type header - std::string mimeType = responseDetails.contentType; + string mimeType = responseDetails.contentType; if (mimeType.empty()) { std::string ext = URIUtils::GetExtension(filePath); @@ -842,7 +826,7 @@ for (HttpRanges::const_iterator range = context->ranges.Begin(); range != context->ranges.End(); ++range) { // we need to temporarily add the Content-Range header to the boundary to be able to determine the length - std::string completeBoundaryWithHeader = HttpRangeUtils::GenerateMultipartBoundaryWithHeader(context->boundaryWithHeader, &*range); + string completeBoundaryWithHeader = HttpRangeUtils::GenerateMultipartBoundaryWithHeader(context->boundaryWithHeader, &*range); totalLength += completeBoundaryWithHeader.size(); // add a newline before any new multipart boundary @@ -994,7 +978,7 @@ if (context->rangeCountTotal > 1 && context->ranges.IsEmpty()) { // put together the end-boundary - std::string endBoundary = HttpRangeUtils::GenerateMultipartBoundaryEnd(context->boundary); + string endBoundary = HttpRangeUtils::GenerateMultipartBoundaryEnd(context->boundary); if ((unsigned int)max != endBoundary.size()) return -1; @@ -1025,7 +1009,7 @@ } // put together the boundary for the current range - std::string boundary = HttpRangeUtils::GenerateMultipartBoundaryWithHeader(context->boundaryWithHeader, &range); + string boundary = HttpRangeUtils::GenerateMultipartBoundaryWithHeader(context->boundaryWithHeader, &range); // copy the boundary into the buffer memcpy(buf, boundary.c_str(), boundary.size()); @@ -1150,11 +1134,10 @@ #if (MHD_VERSION >= 0x00040001) MHD_OPTION_EXTERNAL_LOGGER, &logFromMHD, NULL, #endif // MHD_VERSION >= 0x00040001 - MHD_OPTION_THREAD_STACK_SIZE, m_thread_stacksize, MHD_OPTION_END); } -bool CWebServer::Start(int port, const std::string &username, const std::string &password) +bool CWebServer::Start(int port, const string &username, const string &password) { SetCredentials(username, password); if (!m_running) @@ -1202,7 +1185,7 @@ return m_running; } -void CWebServer::SetCredentials(const std::string &username, const std::string &password) +void CWebServer::SetCredentials(const string &username, const string &password) { CSingleLock lock(m_critSection); @@ -1216,7 +1199,7 @@ return false; protocol = "http"; - std::string url; + string url; std::string strPath = path; if (StringUtils::StartsWith(strPath, "image://") || (StringUtils::StartsWith(strPath, "special://") && StringUtils::EndsWith(strPath, ".tbn"))) @@ -1244,7 +1227,7 @@ if (handler == NULL) return; - for (std::vector::iterator it = m_requestHandlers.begin(); it != m_requestHandlers.end(); ++it) + for (vector::iterator it = m_requestHandlers.begin(); it != m_requestHandlers.end(); ++it) { if (*it == handler) return; @@ -1264,7 +1247,7 @@ if (handler == NULL) return; - for (std::vector::iterator it = m_requestHandlers.begin(); it != m_requestHandlers.end(); ++it) + for (vector::iterator it = m_requestHandlers.begin(); it != m_requestHandlers.end(); ++it) { if (*it == handler) { @@ -1287,9 +1270,9 @@ { // Work around a bug in firefox (see https://bugzilla.mozilla.org/show_bug.cgi?id=416178) // by cutting of anything that follows a ";" in a "Content-Type" header field - std::string strValue(value); + string strValue(value); size_t pos = strValue.find(';'); - if (pos != std::string::npos) + if (pos != string::npos) strValue = strValue.substr(0, pos); return strValue; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/WebServer.h kodi-15.2~git20151019.1039-final/xbmc/network/WebServer.h --- kodi-16.1~git20160425.1001-final/xbmc/network/WebServer.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/WebServer.h 2015-10-19 08:39:16.000000000 +0000 @@ -33,7 +33,6 @@ class CFile; } class CDateTime; -class CVariant; class CWebServer : public JSONRPC::ITransportLayer { @@ -121,7 +120,6 @@ struct MHD_Daemon *m_daemon_ip4; bool m_running; bool m_needcredentials; - size_t m_thread_stacksize; std::string m_Credentials64Encoded; CCriticalSection m_critSection; static std::vector m_requestHandlers; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/websocket/WebSocket.cpp kodi-15.2~git20151019.1039-final/xbmc/network/websocket/WebSocket.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/websocket/WebSocket.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/websocket/WebSocket.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -42,6 +42,8 @@ #define LENGTH_MIN 0x2 +using namespace std; + CWebSocketFrame::CWebSocketFrame(const char* data, uint64_t length) { reset(); @@ -158,7 +160,7 @@ m_final = final; m_extension = extension; - std::string buffer; + string buffer; char dataByte = 0; // Set the FIN flag diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/websocket/WebSocketManager.cpp kodi-15.2~git20151019.1039-final/xbmc/network/websocket/WebSocketManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/websocket/WebSocketManager.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/websocket/WebSocketManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -35,7 +35,9 @@ #define WS_HEADER_VERSION "Sec-WebSocket-Version" #define WS_HEADER_VERSION_LC "sec-websocket-version" // "Sec-WebSocket-Version" -CWebSocket* CWebSocketManager::Handle(const char* data, unsigned int length, std::string &response) +using namespace std; + +CWebSocket* CWebSocketManager::Handle(const char* data, unsigned int length, string &response) { if (data == NULL || length <= 0) return NULL; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/websocket/WebSocketV13.cpp kodi-15.2~git20151019.1039-final/xbmc/network/websocket/WebSocketV13.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/websocket/WebSocketV13.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/websocket/WebSocketV13.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -45,9 +45,11 @@ #define WS_PROTOCOL_JSONRPC "jsonrpc.xbmc.org" #define WS_HEADER_UPGRADE_VALUE "websocket" +using namespace std; + bool CWebSocketV13::Handshake(const char* data, size_t length, std::string &response) { - std::string strHeader(data, length); + string strHeader(data, length); const char *value; HttpParser header; if (header.addBytes(data, length) != HttpParser::Done) @@ -66,14 +68,14 @@ // The request must be HTTP/1.1 or higher size_t pos; - if ((pos = strHeader.find(WS_HTTP_TAG)) == std::string::npos) + if ((pos = strHeader.find(WS_HTTP_TAG)) == string::npos) { CLog::Log(LOGINFO, "WebSocket [RFC6455]: invalid handshake received"); return false; } pos += strlen(WS_HTTP_TAG); - std::istringstream converter(strHeader.substr(pos, strHeader.find_first_of(" \r\n\t", pos) - pos)); + istringstream converter(strHeader.substr(pos, strHeader.find_first_of(" \r\n\t", pos) - pos)); float fVersion; converter >> fVersion; @@ -83,7 +85,7 @@ return false; } - std::string websocketKey, websocketProtocol; + string websocketKey, websocketProtocol; // There must be a "Host" header value = header.getValue("host"); if (value == NULL || strlen(value) == 0) @@ -120,8 +122,8 @@ value = header.getValue(WS_HEADER_PROTOCOL_LC); if (value && strlen(value) > 0) { - std::vector protocols = StringUtils::Split(value, ","); - for (std::vector::iterator protocol = protocols.begin(); protocol != protocols.end(); ++protocol) + vector protocols = StringUtils::Split(value, ","); + for (vector::iterator protocol = protocols.begin(); protocol != protocols.end(); ++protocol) { StringUtils::Trim(*protocol); if (*protocol == WS_PROTOCOL_JSONRPC) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/websocket/WebSocketV8.cpp kodi-15.2~git20151019.1039-final/xbmc/network/websocket/WebSocketV8.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/websocket/WebSocketV8.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/websocket/WebSocketV8.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -46,9 +46,11 @@ #define WS_HEADER_UPGRADE_VALUE "websocket" #define WS_KEY_MAGICSTRING "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" +using namespace std; + bool CWebSocketV8::Handshake(const char* data, size_t length, std::string &response) { - std::string strHeader(data, length); + string strHeader(data, length); const char *value; HttpParser header; if (header.addBytes(data, length) != HttpParser::Done) @@ -67,14 +69,14 @@ // The request must be HTTP/1.1 or higher size_t pos; - if ((pos = strHeader.find(WS_HTTP_TAG)) == std::string::npos) + if ((pos = strHeader.find(WS_HTTP_TAG)) == string::npos) { CLog::Log(LOGINFO, "WebSocket [hybi-10]: invalid handshake received"); return false; } pos += strlen(WS_HTTP_TAG); - std::istringstream converter(strHeader.substr(pos, strHeader.find_first_of(" \r\n\t", pos) - pos)); + istringstream converter(strHeader.substr(pos, strHeader.find_first_of(" \r\n\t", pos) - pos)); float fVersion; converter >> fVersion; @@ -84,7 +86,7 @@ return false; } - std::string websocketKey, websocketProtocol; + string websocketKey, websocketProtocol; // There must be a "Host" header value = header.getValue("host"); if (value == NULL || strlen(value) == 0) @@ -105,8 +107,8 @@ value = header.getValue(WS_HEADER_PROTOCOL_LC); if (value && strlen(value) > 0) { - std::vector protocols = StringUtils::Split(value, ","); - for (std::vector::iterator protocol = protocols.begin(); protocol != protocols.end(); ++protocol) + vector protocols = StringUtils::Split(value, ","); + for (vector::iterator protocol = protocols.begin(); protocol != protocols.end(); ++protocol) { StringUtils::Trim(*protocol); if (*protocol == WS_PROTOCOL_JSONRPC) @@ -188,7 +190,7 @@ std::string CWebSocketV8::calculateKey(const std::string &key) { - std::string acceptKey = key; + string acceptKey = key; acceptKey.append(WS_KEY_MAGICSTRING); boost::uuids::detail::sha1 hash; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/windows/NetworkWin32.cpp kodi-15.2~git20151019.1039-final/xbmc/network/windows/NetworkWin32.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/windows/NetworkWin32.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/windows/NetworkWin32.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -39,6 +39,8 @@ #endif +using namespace std; + CNetworkInterfaceWin32::CNetworkInterfaceWin32(CNetworkWin32* network, IP_ADAPTER_INFO adapter): m_adaptername(adapter.Description) { @@ -160,7 +162,7 @@ void CNetworkWin32::CleanInterfaceList() { - std::vector::iterator it = m_interfaces.begin(); + vector::iterator it = m_interfaces.begin(); while(it != m_interfaces.end()) { CNetworkInterface* nInt = *it; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/Zeroconf.cpp kodi-15.2~git20151019.1039-final/xbmc/network/Zeroconf.cpp --- kodi-16.1~git20160425.1001-final/xbmc/network/Zeroconf.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/Zeroconf.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -17,16 +17,10 @@ * . * */ +#include "system.h" //HAS_ZEROCONF define +#include #include "Zeroconf.h" - -#include - #include "settings/Settings.h" -#include "system.h" //HAS_ZEROCONF define -#include "threads/Atomics.h" -#include "threads/CriticalSection.h" -#include "threads/SingleLock.h" -#include "utils/JobManager.h" #if defined(HAS_AVAHI) #include "linux/ZeroconfAvahi.h" @@ -37,6 +31,11 @@ #include "mdns/ZeroconfMDNS.h" #endif +#include "threads/CriticalSection.h" +#include "threads/SingleLock.h" +#include "threads/Atomics.h" +#include "utils/JobManager.h" + #ifndef HAS_ZEROCONF //dummy implementation used if no zeroconf is present //should be optimized away @@ -115,9 +114,9 @@ CSingleLock lock(*mp_crit_sec); if(!IsZCdaemonRunning()) { - CSettings::GetInstance().SetBool(CSettings::SETTING_SERVICES_ZEROCONF, false); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SERVICES_AIRPLAY)) - CSettings::GetInstance().SetBool(CSettings::SETTING_SERVICES_AIRPLAY, false); + CSettings::Get().SetBool("services.zeroconf", false); + if (CSettings::Get().GetBool("services.airplay")) + CSettings::Get().SetBool("services.airplay", false); return false; } if(m_started) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/network/Zeroconf.h kodi-15.2~git20151019.1039-final/xbmc/network/Zeroconf.h --- kodi-16.1~git20160425.1001-final/xbmc/network/Zeroconf.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/network/Zeroconf.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,11 +20,9 @@ * */ -#include #include -#include +#include #include - #include "utils/Job.h" class CCriticalSection; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/NfoFile.cpp kodi-15.2~git20151019.1039-final/xbmc/NfoFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/NfoFile.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/NfoFile.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -31,6 +31,7 @@ #include +using namespace std; using namespace XFILE; using namespace ADDON; @@ -46,7 +47,7 @@ AddonPtr addon; ScraperPtr defaultScraper; - if (CAddonMgr::GetInstance().GetDefault(m_type, addon)) + if (CAddonMgr::Get().GetDefault(m_type, addon)) defaultScraper = std::dynamic_pointer_cast(addon); if (m_type == ADDON_SCRAPER_ALBUMS) @@ -87,7 +88,7 @@ } } - std::vector vecScrapers; + vector vecScrapers; // add selected scraper - first proirity if (m_info) @@ -95,7 +96,7 @@ // Add all scrapers except selected and default VECADDONS addons; - CAddonMgr::GetInstance().GetAddons(m_type,addons); + CAddonMgr::Get().GetAddons(m_type,addons); for (unsigned i = 0; i < addons.size(); ++i) { Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/English.lproj/InfoPlist.strings and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/English.lproj/InfoPlist.strings differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/KodiAppliance.h kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/KodiAppliance.h --- kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/KodiAppliance.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/KodiAppliance.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#import + +@class KodiTopShelfController; + +//-------------------------------------------------------------- +@interface KodiAppliance : BRBaseAppliance { + NSArray *_applianceCategories; + KodiTopShelfController *_topShelfController; +} +@property(nonatomic, readonly, retain) id topShelfController; + +- (id) initWithApplianceInfo:(id) applianceInfo; +- (void) setTopShelfController:(id) topShelfControl; +- (void) setApplianceCategories:(id) applianceCategories; +- (void) XBMCfixUIDevice; +- (id) init; +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/KodiAppliance.mm kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/KodiAppliance.mm --- kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/KodiAppliance.mm 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/KodiAppliance.mm 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,467 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + + +/* HowTo code in this file: + * Since AppleTV/iOS6.x (atv2 version 5.2) Apple removed the AppleTV.framework and put all those classes into the + * AppleTV.app. So we can't use standard obj-c coding here anymore. Instead we need to use the obj-c runtime + * functions for subclassing and adding methods to our instances during runtime (hooking). + * + * 1. For implementing a method of a base class: + * a) declare it in the form like the others + * b) these methods need to be static and have KodiAppliance* self, SEL _cmd (replace KodiAppliance with the class the method gets implemented for) as minimum params. + * c) add the method to the KodiAppliance.h for getting rid of the compiler warnings of unresponsive selectors (declare the method like done in the baseclass). + * d) in initApplianceRuntimeClasses exchange the base class implementation with ours by calling MSHookMessageEx + * e) if we need to call the base class implementation as well we have to save the original implementation (see initWithApplianceInfo$Orig for reference) + * + * 2. For implementing a new method which is not part of the base class: + * a) same as 1.a + * b) same as 1.b + * c) same as 1.c + * d) in initApplianceRuntimeClasses add the method to our class via class_addMethod + * + * 3. Never access any BackRow classes directly - but always get the class via objc_getClass - if the class is used in multiple places + * save it as static (see BRApplianceCategoryCls) + * + * 4. Keep the structure of this file based on the section comments (marked with // SECTIONCOMMENT). + * 5. really - obey 4.! + * + * 6. for adding class members use associated objects - see topShelfControllerKey + * + * For further reference see https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html + */ + +#import +#import + +#import "KodiAppliance.h" +#import "KodiController.h" +#include "substrate.h" + +// SECTIONCOMMENT +// classes we need multiple times +static Class BRApplianceCategoryCls; + +// category for ios5.x and higher is just a short text before xbmc auto starts +#define KodiAppliance_CAT_5andhigher [BRApplianceCategoryCls categoryWithName:@"Kodi is starting..." identifier:@"kodi" preferredOrder:0] +// category for ios4.x is the menu entry +#define KodiAppliance_CAT_4 [BRApplianceCategoryCls categoryWithName:@"Kodi" identifier:@"kodi" preferredOrder:0] + +// SECTIONCOMMENT +// forward declaration all referenced classes +@class KodiAppliance; +@class BRTopShelfView; +@class KodiApplianceInfo; +@class BRMainMenuImageControl; + +// SECTIONCOMMENT +// orig method handlers we wanna call in hooked methods +static id (*KodiAppliance$initWithApplianceInfo$Orig)(KodiAppliance*, SEL, id); +static id (*KodiAppliance$init$Orig)(KodiAppliance*, SEL); +static id (*KodiAppliance$applianceInfo$Orig)(KodiAppliance*, SEL); + +//-------------------------------------------------------------- +//-------------------------------------------------------------- +// ATVVersionInfo declare to shut up compiler warning +@interface ATVVersionInfo : NSObject +{ +} ++ (id)currentOSVersion; + +@end + +@interface AppATV2Detector : NSObject{} ++ (BOOL) hasOldGui; ++ (BOOL) isIos5; ++ (BOOL) needsApplianceInfoHack; +@end + +//-------------------------------------------------------------- +//-------------------------------------------------------------- +// We need a real implementation (not a runtime generated one) +// for getting our NSBundle instance by calling +// [[NSBundle bundleForClass:objc_getClass("AppATV2Detector")] +// so we just implement some usefull helpers here +// and use those +@implementation AppATV2Detector : NSObject{} ++ (BOOL) hasOldGui +{ + Class cls = NSClassFromString(@"ATVVersionInfo"); + if (cls != nil && [[cls currentOSVersion] rangeOfString:@"4."].location != NSNotFound) + return TRUE; + if (cls != nil && [[cls currentOSVersion] rangeOfString:@"5.0"].location != NSNotFound) + return TRUE; + return FALSE; +} + ++ (BOOL) isIos5 +{ + Class cls = NSClassFromString(@"ATVVersionInfo"); + if (cls != nil && [[cls currentOSVersion] rangeOfString:@"5."].location != NSNotFound) + return TRUE; + return FALSE; +} + ++ (BOOL) needsApplianceInfoHack +{ + // if the runtime base class (BRBaseAppliance) doesn't have the initWithApplianceInfo selector + // we need to hack the appliance info in (id) applianceInfo (KodiAppliance$applianceInfo) + if (class_respondsToSelector(objc_getClass("BRBaseAppliance"),@selector(initWithApplianceInfo:))) + return FALSE; + return TRUE; +} +@end + +//-------------------------------------------------------------- +//-------------------------------------------------------------- +// XBMCApplication declare to shut up compiler warning of BRApplication +@interface XBMCApplication : NSObject +{ +} +- (void)setFirstResponder:(id)responder; +@end + +//-------------------------------------------------------------- +//-------------------------------------------------------------- +@interface KodiTopShelfController : NSObject +{ +} +- (void) selectCategoryWithIdentifier:(id)identifier; +- (id) topShelfView; +- (id) mainMenuShelfView; +// added in 4.1+ +- (void) refresh; +@end + +//-------------------------------------------------------------- +//-------------------------------------------------------------- +@implementation KodiTopShelfController + +- (void) selectCategoryWithIdentifier:(id)identifier +{ +} + +- (BRTopShelfView *)topShelfView +{ + Class cls = objc_getClass("BRTopShelfView"); + id topShelf = [[cls alloc] init]; + + // diddle the topshelf logo on old gui + if ([AppATV2Detector hasOldGui]) + { + Class cls = objc_getClass("BRImage"); + BRImageControl *imageControl = (BRImageControl *)MSHookIvar(topShelf, "_productImage");// hook the productImage so we can diddle with it + BRImage *gpImage = [cls imageWithPath:[[NSBundle bundleForClass:[AppATV2Detector class]] pathForResource:@"TopShelf" ofType:@"png"]]; + [imageControl setImage:gpImage]; + } + + return topShelf; +} + +// this method is called with the new ios ui (ios 5.1 and higher) +// its similar to the topshelf view on the opd ios gui +// but its more mighty (thats we we need to dig one level deeper here) +// to get our loogo visible +- (id) mainMenuShelfView; +{ + Class BRTopShelfViewCls = objc_getClass("BRTopShelfView"); + Class BRImageCls = objc_getClass("BRImage"); + + id topShelf = [[BRTopShelfViewCls alloc] init]; + + // first hook into the mainMenuImageControl + // which is a wrapper for an image control + BRMainMenuImageControl *mainMenuImageControl = (BRMainMenuImageControl *)MSHookIvar(topShelf, "_productImage"); + // now get the image instance + BRImageControl *imageControl = (BRImageControl *)MSHookIvar(mainMenuImageControl, "_content");// hook the image so we can diddle with it + + // load our logo into it + BRImage *gpImage = [BRImageCls imageWithPath:[[NSBundle bundleForClass:[AppATV2Detector class]] pathForResource:@"Kodi" ofType:@"png"]]; + [imageControl setImage:gpImage]; + return topShelf; +} + +- (void) refresh +{ +} +@end + +//-------------------------------------------------------------- +//-------------------------------------------------------------- +// SECTIONCOMMENT +// since we can't inject ivars we need to use associated objects +// these are the keys for KodiAppliance +//implementation KodiAppliance +static char topShelfControllerKey; +static char applianceCategoriesKey; + +static NSString* KodiApplianceInfo$key(KodiApplianceInfo* self, SEL _cmd) +{ + return [[[NSBundle bundleForClass:objc_getClass("AppATV2Detector")] infoDictionary] objectForKey:(NSString*)kCFBundleIdentifierKey]; +} + +static NSString* KodiApplianceInfo$name(KodiApplianceInfo* self, SEL _cmd) +{ + return [[[NSBundle bundleForClass:objc_getClass("AppATV2Detector")] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey]; +} + +static id KodiApplianceInfo$localizedStringsFileName(KodiApplianceInfo* self, SEL _cmd) +{ + return @"kodi"; +} + +static void KodiAppliance$XBMCfixUIDevice(KodiAppliance* self, SEL _cmd) +{ + // iOS 5.x has removed the internal load of UIKit in AppleTV app + // and there is an overlap of some UIKit and AppleTV methods. + // This voodoo seems to clear up the wonkiness. :) + if ([AppATV2Detector isIos5]) + { + id cd = nil; + + @try + { + cd = [UIDevice currentDevice]; + } + + @catch (NSException *e) + { + NSLog(@"exception: %@", e); + } + + @finally + { + //NSLog(@"will it work the second try?"); + cd = [UIDevice currentDevice]; + NSLog(@"current device fixed: %@", cd); + } + } +} + + +static id KodiAppliance$init(KodiAppliance* self, SEL _cmd) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + if ([AppATV2Detector needsApplianceInfoHack]) + { + NSLog(@"%s for ios 4", __PRETTY_FUNCTION__); + if ((self = KodiAppliance$init$Orig(self, _cmd))!= nil) + { + id topShelfControl = [[KodiTopShelfController alloc] init]; + [self setTopShelfController:topShelfControl]; + + NSArray *catArray = [[NSArray alloc] initWithObjects:KodiAppliance_CAT_4,nil]; + [self setApplianceCategories:catArray]; + return self; + } + } + else// ios >= 5 + { + NSLog(@"%s for ios 5 and newer", __PRETTY_FUNCTION__); + return [self initWithApplianceInfo:nil]; // legacy for ios < 6 + } + return self; +} + +static id KodiAppliance$identifierForContentAlias(KodiAppliance* self, SEL _cmd, id contentAlias) +{ + return@"kodi"; +} + +static BOOL KodiAppliance$handleObjectSelection(KodiAppliance* self, SEL _cmd, id fp8, id fp12) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + return YES; +} + +static id KodiAppliance$applianceInfo(KodiAppliance* self, SEL _cmd) +{ + //NSLog(@"%s", __PRETTY_FUNCTION) + + // load our plist into memory and merge it with + // the dict from the baseclass if needed + // cause ios seems to fail on that somehow (at least on 4.x) + if ([AppATV2Detector needsApplianceInfoHack] && self != nil) + { + id original = KodiAppliance$applianceInfo$Orig(self, _cmd); + id info = MSHookIvar(original, "_info");// hook the infoDictionary so we can diddle with it + + NSString *plistPath = [[NSBundle bundleForClass:objc_getClass("AppATV2Detector")] pathForResource:@"Info" ofType:@"plist"]; + NSString *bundlePath = [[NSBundle bundleForClass:objc_getClass("AppATV2Detector")] bundlePath]; + NSMutableDictionary *ourInfoDict = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; + + if (ourInfoDict != nil && bundlePath != nil) + { + // inject this or we won't get shown up properly on ios4 + [ourInfoDict setObject:bundlePath forKey:@"NSBundleInitialPath"]; + + // add our plist info to the baseclass info and return it + [(NSMutableDictionary *)info addEntriesFromDictionary:ourInfoDict]; + [ourInfoDict release]; + } + return original; + } + else + { + Class cls = objc_getClass("KodiApplianceInfo"); + return [[[cls alloc] init] autorelease]; + } + return nil; +} + + +static id KodiAppliance$topShelfController(KodiAppliance* self, SEL _cmd) +{ + return objc_getAssociatedObject(self, &topShelfControllerKey); +} + + +static void KodiAppliance$setTopShelfController(KodiAppliance* self, SEL _cmd, id topShelfControl) +{ + objc_setAssociatedObject(self, &topShelfControllerKey, topShelfControl, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +static id KodiAppliance$applianceCategories(KodiAppliance* self, SEL _cmd) +{ + return objc_getAssociatedObject(self, &applianceCategoriesKey); +} + +static void KodiAppliance$setApplianceCategories(KodiAppliance* self, SEL _cmd, id applianceCategories) +{ + objc_setAssociatedObject(self, &applianceCategoriesKey, applianceCategories, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +static id KodiAppliance$initWithApplianceInfo(KodiAppliance* self, SEL _cmd, id applianceInfo) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + if((self = KodiAppliance$initWithApplianceInfo$Orig(self, _cmd, applianceInfo)) != nil) + { + id topShelfControl = [[KodiTopShelfController alloc] init]; + [self setTopShelfController:topShelfControl]; + + NSArray *catArray = [[NSArray alloc] initWithObjects:KodiAppliance_CAT_5andhigher,nil]; + [self setApplianceCategories:catArray]; + } + return self; +} + +static id KodiAppliance$controllerForIdentifier(KodiAppliance* self, SEL _cmd, id identifier, id args) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + id menuController = nil; + Class cls = objc_getClass("BRApplication"); + if ([identifier isEqualToString:@"kodi"]) + { + [self XBMCfixUIDevice]; + menuController = [[objc_getClass("KodiController") alloc] init]; + if (menuController == nil) + NSLog(@"initialise controller - fail"); + } + XBMCApplication *brapp = (XBMCApplication *)[cls sharedApplication]; + [brapp setFirstResponder:menuController]; + return menuController; +} + +static void XBMCPopUpManager$_displayPopUp(BRPopUpManager *self, SEL _cmd, id up) +{ + // suppress all popups + NSLog(@"%s suppressing popup.", __PRETTY_FUNCTION__); +} + +// helper function. If the given class responds to the selector +// we hook via MSHookMessageEx +// bCheckSuperClass <- indicates if the hookClass or ist superclass should be checked for hookSelector +// return true if we hooked - else false +static BOOL safeHook(Class hookClass, SEL hookSelector, IMP ourMethod, IMP *theirMethod, BOOL bCheckSuperClass = true) +{ + Class checkClass = class_getSuperclass(hookClass); + if (!bCheckSuperClass || !checkClass) + checkClass = hookClass; + + if (class_respondsToSelector(checkClass, hookSelector)) + { + MSHookMessageEx(hookClass, hookSelector, ourMethod, theirMethod); + return TRUE; + } + return FALSE; +} + +// SECTIONCOMMENT +// c'tor - this sets up our class at runtime by +// 1. subclassing from the base classes +// 2. adding new methods to our class +// 3. exchanging (hooking) base class methods with ours +// 4. register the classes to the objc runtime system +static __attribute__((constructor)) void initApplianceRuntimeClasses() +{ + // Hook into the popup manager and prevent any popups + // the problem with popups is that when they disappear XBMC is + // getting 100% transparent (invisible). This can be tested with + // the new bluetooth feature in ios6 when a keyboard is connected + // a popup is shown (its behind XBMCs window). When it disappears + // XBMC does so too. + safeHook(objc_getClass("BRPopUpManager"), @selector(_displayPopUp:), (IMP)&XBMCPopUpManager$_displayPopUp, nil, NO); + + // subclass BRApplianceInfo into KodiApplianceInfo + Class KodiApplianceInfoCls = objc_allocateClassPair(objc_getClass("BRApplianceInfo"), "KodiApplianceInfo", 0); + + // and hook up our methods (implementation of the base class methods) + // KodiApplianceInfo::key + safeHook(KodiApplianceInfoCls,@selector(key), (IMP)&KodiApplianceInfo$key, nil); + // KodiApplianceInfo::name + safeHook(KodiApplianceInfoCls,@selector(name), (IMP)&KodiApplianceInfo$name, nil); + // KodiApplianceInfo::localizedStringsFileName + safeHook(KodiApplianceInfoCls,@selector(localizedStringsFileName), (IMP)&KodiApplianceInfo$localizedStringsFileName, nil); + + // and register the class to the runtime + objc_registerClassPair(KodiApplianceInfoCls); + + // subclass BRBaseAppliance into KodiAppliance + Class KodiApplianceCls = objc_allocateClassPair(objc_getClass("BRBaseAppliance"), "KodiAppliance", 0); + // add our custom methods which are not part of the baseclass + // KodiAppliance::XBMCfixUIDevice + class_addMethod(KodiApplianceCls,@selector(XBMCfixUIDevice), (IMP)KodiAppliance$XBMCfixUIDevice, "v@:"); + class_addMethod(KodiApplianceCls,@selector(setTopShelfController:), (IMP)&KodiAppliance$setTopShelfController, "v@:@"); + class_addMethod(KodiApplianceCls,@selector(setApplianceCategories:), (IMP)&KodiAppliance$setApplianceCategories, "v@:@"); + + // and hook up our methods (implementation of the base class methods) + // KodiAppliance::init + safeHook(KodiApplianceCls,@selector(init), (IMP)&KodiAppliance$init, (IMP*)&KodiAppliance$init$Orig); + // KodiAppliance::identifierForContentAlias + safeHook(KodiApplianceCls,@selector(identifierForContentAlias:), (IMP)&KodiAppliance$identifierForContentAlias, nil); + // KodiAppliance::handleObjectSelection + safeHook(KodiApplianceCls,@selector(handleObjectSelection:userInfo:), (IMP)&KodiAppliance$handleObjectSelection, nil); + // KodiAppliance::applianceInfo + safeHook(KodiApplianceCls,@selector(applianceInfo), (IMP)&KodiAppliance$applianceInfo, (IMP *)&KodiAppliance$applianceInfo$Orig); + // KodiAppliance::topShelfController + safeHook(KodiApplianceCls,@selector(topShelfController), (IMP)&KodiAppliance$topShelfController, nil); + // KodiAppliance::applianceCategories + safeHook(KodiApplianceCls,@selector(applianceCategories), (IMP)&KodiAppliance$applianceCategories, nil); + // KodiAppliance::initWithApplianceInfo + safeHook(KodiApplianceCls,@selector(initWithApplianceInfo:), (IMP)&KodiAppliance$initWithApplianceInfo, (IMP*)&KodiAppliance$initWithApplianceInfo$Orig); + // KodiAppliance::controllerForIdentifier + safeHook(KodiApplianceCls,@selector(controllerForIdentifier:args:), (IMP)&KodiAppliance$controllerForIdentifier, nil); + + // and register the class to the runtime + objc_registerClassPair(KodiApplianceCls); + + // save this as static for referencing it in the macro at the top of the file + BRApplianceCategoryCls = objc_getClass("BRApplianceCategory"); +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/kodiclient.h kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/kodiclient.h --- kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/kodiclient.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/kodiclient.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,826 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ +#ifndef __XBMC_CLIENT_H__ +#define __XBMC_CLIENT_H__ + +#include +#include +#include +#include +#ifdef TARGET_WINDOWS +#include +#else +#include +#include +#include +#include +#endif +#include +#include +#include +#include + +#define STD_PORT 9777 + +#define MS_ABSOLUTE 0x01 +//#define MS_RELATIVE 0x02 + +#define BTN_USE_NAME 0x01 +#define BTN_DOWN 0x02 +#define BTN_UP 0x04 +#define BTN_USE_AMOUNT 0x08 +#define BTN_QUEUE 0x10 +#define BTN_NO_REPEAT 0x20 +#define BTN_VKEY 0x40 +#define BTN_AXIS 0x80 + +#define PT_HELO 0x01 +#define PT_BYE 0x02 +#define PT_BUTTON 0x03 +#define PT_MOUSE 0x04 +#define PT_PING 0x05 +#define PT_BROADCAST 0x06 +#define PT_NOTIFICATION 0x07 +#define PT_BLOB 0x08 +#define PT_LOG 0x09 +#define PT_ACTION 0x0A +#define PT_DEBUG 0xFF + +#define ICON_NONE 0x00 +#define ICON_JPEG 0x01 +#define ICON_PNG 0x02 +#define ICON_GIF 0x03 + +#define MAX_PACKET_SIZE 1024 +#define HEADER_SIZE 32 +#define MAX_PAYLOAD_SIZE (MAX_PACKET_SIZE - HEADER_SIZE) + +#define MAJOR_VERSION 2 +#define MINOR_VERSION 0 + +#define LOGDEBUG 0 +#define LOGINFO 1 +#define LOGNOTICE 2 +#define LOGWARNING 3 +#define LOGERROR 4 +#define LOGSEVERE 5 +#define LOGFATAL 6 +#define LOGNONE 7 + +#define ACTION_EXECBUILTIN 0x01 +#define ACTION_BUTTON 0x02 + +class CAddress +{ +private: + struct sockaddr_in m_Addr; +public: + CAddress(int Port = STD_PORT) + { + m_Addr.sin_family = AF_INET; + m_Addr.sin_port = htons(Port); + m_Addr.sin_addr.s_addr = INADDR_ANY; + memset(m_Addr.sin_zero, '\0', sizeof m_Addr.sin_zero); + } + + CAddress(const char *Address, int Port = STD_PORT) + { + m_Addr.sin_port = htons(Port); + + struct hostent *h; + if (Address == NULL || (h=gethostbyname(Address)) == NULL) + { + if (Address != NULL) + printf("Error: Get host by name\n"); + + m_Addr.sin_addr.s_addr = INADDR_ANY; + m_Addr.sin_family = AF_INET; + } + else + { + m_Addr.sin_family = h->h_addrtype; + m_Addr.sin_addr = *((struct in_addr *)h->h_addr); + } + memset(m_Addr.sin_zero, '\0', sizeof m_Addr.sin_zero); + } + + void SetPort(int port) + { + m_Addr.sin_port = htons(port); + } + + const sockaddr *GetAddress() + { + return ((struct sockaddr *)&m_Addr); + } + + bool Bind(int Sockfd) + { + return (bind(Sockfd, (struct sockaddr *)&m_Addr, sizeof m_Addr) == 0); + } +}; + +class XBMCClientUtils +{ +public: + XBMCClientUtils() {} + ~XBMCClientUtils() {} + static unsigned int GetUniqueIdentifier() + { + static time_t id = time(NULL); + return id; + } + + static void Clean() + { + #ifdef TARGET_WINDOWS + WSACleanup(); + #endif + } + + static bool Initialize() + { + #ifdef TARGET_WINDOWS + WSADATA wsaData; + if (WSAStartup(MAKEWORD(1, 1), &wsaData)) + return false; + #endif + return true; + } +}; + +class CPacket +{ +/* Base class that implements a single event packet. + + - Generic packet structure (maximum 1024 bytes per packet) + - Header is 32 bytes long, so 992 bytes available for payload + - large payloads can be split into multiple packets using H4 and H5 + H5 should contain total no. of packets in such a case + - H6 contains length of P1, which is limited to 992 bytes + - if H5 is 0 or 1, then H4 will be ignored (single packet msg) + - H7 must be set to zeros for now + + ----------------------------- + | -H1 Signature ("XBMC") | - 4 x CHAR 4B + | -H2 Version (eg. 2.0) | - 2 x UNSIGNED CHAR 2B + | -H3 PacketType | - 1 x UNSIGNED SHORT 2B + | -H4 Sequence number | - 1 x UNSIGNED LONG 4B + | -H5 No. of packets in msg | - 1 x UNSIGNED LONG 4B + | -H6 Payload size | - 1 x UNSIGNED SHORT 2B + | -H7 Client's unique token | - 1 x UNSIGNED LONG 4B + | -H8 Reserved | - 10 x UNSIGNED CHAR 10B + |---------------------------| + | -P1 payload | - + ----------------------------- +*/ +public: + CPacket() + { + m_PacketType = 0; + } + virtual ~CPacket() + { } + + bool Send(int Socket, CAddress &Addr, unsigned int UID = XBMCClientUtils::GetUniqueIdentifier()) + { + if (m_Payload.size() == 0) + ConstructPayload(); + bool SendSuccessfull = true; + int NbrOfPackages = (m_Payload.size() / MAX_PAYLOAD_SIZE) + 1; + int Send = 0; + int Sent = 0; + int Left = m_Payload.size(); + for (int Package = 1; Package <= NbrOfPackages; Package++) + { + if (Left > MAX_PAYLOAD_SIZE) + { + Send = MAX_PAYLOAD_SIZE; + Left -= Send; + } + else + { + Send = Left; + Left = 0; + } + + ConstructHeader(m_PacketType, NbrOfPackages, Package, Send, UID, m_Header); + char t[MAX_PACKET_SIZE]; + int i, j; + for (i = 0; i < 32; i++) + t[i] = m_Header[i]; + + for (j = 0; j < Send; j++) + t[(32 + j)] = m_Payload[j + Sent]; + + int rtn = sendto(Socket, t, (32 + Send), 0, Addr.GetAddress(), sizeof(struct sockaddr)); + + if (rtn != (32 + Send)) + SendSuccessfull = false; + + Sent += Send; + } + return SendSuccessfull; + } +protected: + char m_Header[HEADER_SIZE]; + unsigned short m_PacketType; + + std::vector m_Payload; + + static void ConstructHeader(int PacketType, int NumberOfPackets, int CurrentPacket, unsigned short PayloadSize, unsigned int UniqueToken, char *Header) + { + sprintf(Header, "XBMC"); + for (int i = 4; i < HEADER_SIZE; i++) + Header[i] = 0; + Header[4] = MAJOR_VERSION; + Header[5] = MINOR_VERSION; + if (CurrentPacket == 1) + { + Header[6] = ((PacketType & 0xff00) >> 8); + Header[7] = (PacketType & 0x00ff); + } + else + { + Header[6] = ((PT_BLOB & 0xff00) >> 8); + Header[7] = (PT_BLOB & 0x00ff); + } + Header[8] = ((CurrentPacket & 0xff000000) >> 24); + Header[9] = ((CurrentPacket & 0x00ff0000) >> 16); + Header[10] = ((CurrentPacket & 0x0000ff00) >> 8); + Header[11] = (CurrentPacket & 0x000000ff); + + Header[12] = ((NumberOfPackets & 0xff000000) >> 24); + Header[13] = ((NumberOfPackets & 0x00ff0000) >> 16); + Header[14] = ((NumberOfPackets & 0x0000ff00) >> 8); + Header[15] = (NumberOfPackets & 0x000000ff); + + Header[16] = ((PayloadSize & 0xff00) >> 8); + Header[17] = (PayloadSize & 0x00ff); + + Header[18] = ((UniqueToken & 0xff000000) >> 24); + Header[19] = ((UniqueToken & 0x00ff0000) >> 16); + Header[20] = ((UniqueToken & 0x0000ff00) >> 8); + Header[21] = (UniqueToken & 0x000000ff); + } + + virtual void ConstructPayload() + { } +}; + +class CPacketHELO : public CPacket +{ + /************************************************************************/ + /* Payload format */ + /* %s - device name (max 128 chars) */ + /* %c - icontype ( 0=>NOICON, 1=>JPEG , 2=>PNG , 3=>GIF ) */ + /* %s - my port ( 0=>not listening ) */ + /* %d - reserved1 ( 0 ) */ + /* %d - reserved2 ( 0 ) */ + /* XX - imagedata ( can span multiple packets ) */ + /************************************************************************/ +private: + std::vector m_DeviceName; + unsigned short m_IconType; + char *m_IconData; + unsigned short m_IconSize; +public: + virtual void ConstructPayload() + { + m_Payload.clear(); + + for (unsigned int i = 0; i < m_DeviceName.size(); i++) + m_Payload.push_back(m_DeviceName[i]); + + m_Payload.push_back('\0'); + + m_Payload.push_back(m_IconType); + + m_Payload.push_back(0); + m_Payload.push_back('\0'); + + for (int j = 0; j < 8; j++) + m_Payload.push_back(0); + + for (int ico = 0; ico < m_IconSize; ico++) + m_Payload.push_back(m_IconData[ico]); + } + + CPacketHELO(const char *DevName, unsigned short IconType, const char *IconFile = NULL) : CPacket() + { + m_PacketType = PT_HELO; + + unsigned int len = strlen(DevName); + for (unsigned int i = 0; i < len; i++) + m_DeviceName.push_back(DevName[i]); + + m_IconType = IconType; + + if (IconType == ICON_NONE || IconFile == NULL) + { + m_IconData = NULL; + m_IconSize = 0; + return; + } + + std::ifstream::pos_type size; + + std::ifstream file (IconFile, std::ios::in|std::ios::binary|std::ios::ate); + if (file.is_open()) + { + size = file.tellg(); + m_IconData = new char [size]; + file.seekg (0, std::ios::beg); + file.read (m_IconData, size); + file.close(); + m_IconSize = size; + } + else + { + m_IconType = ICON_NONE; + m_IconSize = 0; + } + } + + virtual ~CPacketHELO() + { + m_DeviceName.clear(); + if (m_IconData) + free(m_IconData); + } +}; + +class CPacketNOTIFICATION : public CPacket +{ + /************************************************************************/ + /* Payload format: */ + /* %s - caption */ + /* %s - message */ + /* %c - icontype ( 0=>NOICON, 1=>JPEG , 2=>PNG , 3=>GIF ) */ + /* %d - reserved ( 0 ) */ + /* XX - imagedata ( can span multiple packets ) */ + /************************************************************************/ +private: + std::vector m_Title; + std::vector m_Message; + unsigned short m_IconType; + char *m_IconData; + unsigned short m_IconSize; +public: + virtual void ConstructPayload() + { + m_Payload.clear(); + + for (unsigned int i = 0; i < m_Title.size(); i++) + m_Payload.push_back(m_Title[i]); + + m_Payload.push_back('\0'); + + for (unsigned int i = 0; i < m_Message.size(); i++) + m_Payload.push_back(m_Message[i]); + + m_Payload.push_back('\0'); + + m_Payload.push_back(m_IconType); + + for (int i = 0; i < 4; i++) + m_Payload.push_back(0); + + for (int ico = 0; ico < m_IconSize; ico++) + m_Payload.push_back(m_IconData[ico]); + } + + CPacketNOTIFICATION(const char *Title, const char *Message, unsigned short IconType, const char *IconFile = NULL) : CPacket() + { + m_PacketType = PT_NOTIFICATION; + m_IconData = NULL; + + unsigned int len = 0; + if (Title != NULL) + { + len = strlen(Title); + for (unsigned int i = 0; i < len; i++) + m_Title.push_back(Title[i]); + } + + if (Message != NULL) + { + len = strlen(Message); + for (unsigned int i = 0; i < len; i++) + m_Message.push_back(Message[i]); + } + m_IconType = IconType; + + if (IconType == ICON_NONE || IconFile == NULL) + return; + + std::ifstream::pos_type size; + + std::ifstream file (IconFile, std::ios::in|std::ios::binary|std::ios::ate); + if (file.is_open()) + { + size = file.tellg(); + m_IconData = new char [size]; + file.seekg (0, std::ios::beg); + file.read (m_IconData, size); + file.close(); + m_IconSize = size; + } + else + { + m_IconType = ICON_NONE; + m_IconSize = 0; + } + } + + virtual ~CPacketNOTIFICATION() + { + m_Title.clear(); + m_Message.clear(); + if (m_IconData) + free(m_IconData); + } +}; + +class CPacketBUTTON : public CPacket +{ + /************************************************************************/ + /* Payload format */ + /* %i - button code */ + /* %i - flags 0x01 => use button map/name instead of code */ + /* 0x02 => btn down */ + /* 0x04 => btn up */ + /* 0x08 => use amount */ + /* 0x10 => queue event */ + /* 0x20 => do not repeat */ + /* 0x40 => virtual key */ + /* 0x40 => axis key */ + /* %i - amount ( 0 => 65k maps to -1 => 1 ) */ + /* %s - device map (case sensitive and required if flags & 0x01) */ + /* "KB" - Standard keyboard map */ + /* "XG" - Xbox Gamepad */ + /* "R1" - Xbox Remote */ + /* "R2" - Xbox Universal Remote */ + /* "LI:devicename" - valid LIRC device map where 'devicename' */ + /* is the actual name of the LIRC device */ + /* "JS:joyname" - valid Joystick device map where */ + /* 'joyname' is the name specified in */ + /* the keymap. JS only supports button code */ + /* and not button name currently (!0x01). */ + /* %s - button name (required if flags & 0x01) */ + /************************************************************************/ +private: + std::vector m_DeviceMap; + std::vector m_Button; + unsigned short m_ButtonCode; + unsigned short m_Amount; + unsigned short m_Flags; +public: + virtual void ConstructPayload() + { + m_Payload.clear(); + + if (m_Button.size() != 0) + { + if (!(m_Flags & BTN_USE_NAME)) // If the BTN_USE_NAME isn't flagged for some reason + m_Flags |= BTN_USE_NAME; + m_ButtonCode = 0; + } + else + m_Button.clear(); + + if (m_Amount > 0) + { + if (!(m_Flags & BTN_USE_AMOUNT)) + m_Flags |= BTN_USE_AMOUNT; + } + if (!((m_Flags & BTN_DOWN) || (m_Flags & BTN_UP))) //If none of them are tagged. + m_Flags |= BTN_DOWN; + + m_Payload.push_back(((m_ButtonCode & 0xff00) >> 8)); + m_Payload.push_back( (m_ButtonCode & 0x00ff)); + + m_Payload.push_back(((m_Flags & 0xff00) >> 8) ); + m_Payload.push_back( (m_Flags & 0x00ff)); + + m_Payload.push_back(((m_Amount & 0xff00) >> 8) ); + m_Payload.push_back( (m_Amount & 0x00ff)); + + + for (unsigned int i = 0; i < m_DeviceMap.size(); i++) + m_Payload.push_back(m_DeviceMap[i]); + + m_Payload.push_back('\0'); + + for (unsigned int i = 0; i < m_Button.size(); i++) + m_Payload.push_back(m_Button[i]); + + m_Payload.push_back('\0'); + } + + CPacketBUTTON(const char *Button, const char *DeviceMap, unsigned short Flags, unsigned short Amount = 0) : CPacket() + { + m_PacketType = PT_BUTTON; + m_Flags = Flags; + m_ButtonCode = 0; + m_Amount = Amount; + + unsigned int len = strlen(DeviceMap); + for (unsigned int i = 0; i < len; i++) + m_DeviceMap.push_back(DeviceMap[i]); + + len = strlen(Button); + for (unsigned int i = 0; i < len; i++) + m_Button.push_back(Button[i]); + } + + CPacketBUTTON(unsigned short ButtonCode, const char *DeviceMap, unsigned short Flags, unsigned short Amount = 0) : CPacket() + { + m_PacketType = PT_BUTTON; + m_Flags = Flags; + m_ButtonCode = ButtonCode; + m_Amount = Amount; + + unsigned int len = strlen(DeviceMap); + for (unsigned int i = 0; i < len; i++) + m_DeviceMap.push_back(DeviceMap[i]); + } + + CPacketBUTTON(unsigned short ButtonCode, unsigned short Flags, unsigned short Amount = 0) : CPacket() + { + m_PacketType = PT_BUTTON; + m_Flags = Flags; + m_ButtonCode = ButtonCode; + m_Amount = Amount; + } + + // Used to send a release event + CPacketBUTTON() : CPacket() + { + m_PacketType = PT_BUTTON; + m_Flags = BTN_UP; + m_Amount = 0; + m_ButtonCode = 0; + } + + virtual ~CPacketBUTTON() + { + m_DeviceMap.clear(); + m_Button.clear(); + } + + inline unsigned short GetFlags() { return m_Flags; } + inline unsigned short GetButtonCode(){ return m_ButtonCode;} +}; + +class CPacketPING : public CPacket +{ + /************************************************************************/ + /* no payload */ + /************************************************************************/ +public: + CPacketPING() : CPacket() + { + m_PacketType = PT_PING; + } + virtual ~CPacketPING() + { } +}; + +class CPacketBYE : public CPacket +{ + /************************************************************************/ + /* no payload */ + /************************************************************************/ +public: + CPacketBYE() : CPacket() + { + m_PacketType = PT_BYE; + } + virtual ~CPacketBYE() + { } +}; + +class CPacketMOUSE : public CPacket +{ + /************************************************************************/ + /* Payload format */ + /* %c - flags */ + /* - 0x01 absolute position */ + /* %i - mousex (0-65535 => maps to screen width) */ + /* %i - mousey (0-65535 => maps to screen height) */ + /************************************************************************/ +private: + unsigned short m_X; + unsigned short m_Y; + unsigned char m_Flag; +public: + CPacketMOUSE(int X, int Y, unsigned char Flag = MS_ABSOLUTE) + { + m_PacketType = PT_MOUSE; + m_Flag = Flag; + m_X = X; + m_Y = Y; + } + + virtual void ConstructPayload() + { + m_Payload.clear(); + + m_Payload.push_back(m_Flag); + + m_Payload.push_back(((m_X & 0xff00) >> 8)); + m_Payload.push_back( (m_X & 0x00ff)); + + m_Payload.push_back(((m_Y & 0xff00) >> 8)); + m_Payload.push_back( (m_Y & 0x00ff)); + } + + virtual ~CPacketMOUSE() + { } +}; + +class CPacketLOG : public CPacket +{ + /************************************************************************/ + /* Payload format */ + /* %c - log type */ + /* %s - message */ + /************************************************************************/ +private: + std::vector m_Message; + unsigned char m_LogLevel; + bool m_AutoPrintf; +public: + CPacketLOG(int LogLevel, const char *Message, bool AutoPrintf = true) + { + m_PacketType = PT_LOG; + + unsigned int len = strlen(Message); + for (unsigned int i = 0; i < len; i++) + m_Message.push_back(Message[i]); + + m_LogLevel = LogLevel; + m_AutoPrintf = AutoPrintf; + } + + virtual void ConstructPayload() + { + m_Payload.clear(); + + m_Payload.push_back( (m_LogLevel & 0x00ff) ); + + if (m_AutoPrintf) + { + char* str=&m_Message[0]; + printf("%s\n", str); + } + for (unsigned int i = 0; i < m_Message.size(); i++) + m_Payload.push_back(m_Message[i]); + + m_Payload.push_back('\0'); + } + + virtual ~CPacketLOG() + { } +}; + +class CPacketACTION : public CPacket +{ + /************************************************************************/ + /* Payload format */ + /* %c - action type */ + /* %s - action message */ + /************************************************************************/ +private: + unsigned char m_ActionType; + std::vector m_Action; +public: + CPacketACTION(const char *Action, unsigned char ActionType = ACTION_EXECBUILTIN) + { + m_PacketType = PT_ACTION; + + m_ActionType = ActionType; + unsigned int len = strlen(Action); + for (unsigned int i = 0; i < len; i++) + m_Action.push_back(Action[i]); + } + + virtual void ConstructPayload() + { + m_Payload.clear(); + + m_Payload.push_back(m_ActionType); + for (unsigned int i = 0; i < m_Action.size(); i++) + m_Payload.push_back(m_Action[i]); + + m_Payload.push_back('\0'); + } + + virtual ~CPacketACTION() + { } +}; + +class CXBMCClient +{ +private: + CAddress m_Addr; + int m_Socket; + unsigned int m_UID; +public: + CXBMCClient(const char *IP = "127.0.0.1", int Port = 9777, int Socket = -1, unsigned int UID = 0) + { + m_Addr = CAddress(IP, Port); + if (Socket == -1) + m_Socket = socket(AF_INET, SOCK_DGRAM, 0); + else + m_Socket = Socket; + + if (UID) + m_UID = UID; + else + m_UID = XBMCClientUtils::GetUniqueIdentifier(); + } + + void SendNOTIFICATION(const char *Title, const char *Message, unsigned short IconType, const char *IconFile = NULL) + { + if (m_Socket < 0) + return; + + CPacketNOTIFICATION notification(Title, Message, IconType, IconFile); + notification.Send(m_Socket, m_Addr, m_UID); + } + + void SendHELO(const char *DevName, unsigned short IconType, const char *IconFile = NULL) + { + if (m_Socket < 0) + return; + + CPacketHELO helo(DevName, IconType, IconFile); + helo.Send(m_Socket, m_Addr, m_UID); + } + + void SendButton(const char *Button, const char *DeviceMap, unsigned short Flags, unsigned short Amount = 0) + { + if (m_Socket < 0) + return; + + CPacketBUTTON button(Button, DeviceMap, Flags, Amount); + button.Send(m_Socket, m_Addr, m_UID); + } + + void SendBUTTON(unsigned short ButtonCode, unsigned Flags, unsigned short Amount = 0) + { + if (m_Socket < 0) + return; + + CPacketBUTTON button(ButtonCode, Flags, Amount); + button.Send(m_Socket, m_Addr, m_UID); + } + + void SendMOUSE(int X, int Y, unsigned char Flag = MS_ABSOLUTE) + { + if (m_Socket < 0) + return; + + CPacketMOUSE mouse(X, Y, Flag); + mouse.Send(m_Socket, m_Addr, m_UID); + } + + void SendLOG(int LogLevel, const char *Message, bool AutoPrintf = true) + { + if (m_Socket < 0) + return; + + CPacketLOG log(LogLevel, Message, AutoPrintf); + log.Send(m_Socket, m_Addr, m_UID); + } + + void SendACTION(const char *ActionMessage, int ActionType = ACTION_EXECBUILTIN) + { + if (m_Socket < 0) + return; + + CPacketACTION action(ActionMessage, ActionType); + action.Send(m_Socket, m_Addr, m_UID); + } +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/kodiclientwrapper.h kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/kodiclientwrapper.h --- kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/kodiclientwrapper.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/kodiclientwrapper.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,69 @@ +/* + * xbmcclient.cpp + * xbmclauncher + * + * Created by Stephan Diederich on 17.09.08. + * Copyright 2008 Stephan Diederich. All rights reserved. + * Copyright (C) 2008-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ +typedef enum{ + ATV_BUTTON_DONT_USE_THIS = 0, //don't use zero, as those enums get converted to strings later + ATV_BUTTON_PLAY=1, + ATV_BUTTON_PLAY_H, //present on ATV>=2.2 + ATV_BUTTON_RIGHT, + ATV_BUTTON_RIGHT_RELEASE, + ATV_BUTTON_RIGHT_H, //present on ATV<=2.1 + ATV_BUTTON_LEFT, + ATV_BUTTON_LEFT_RELEASE, + ATV_BUTTON_LEFT_H, //present on ATV<=2.1 + ATV_BUTTON_UP, + ATV_BUTTON_UP_RELEASE, + ATV_BUTTON_DOWN, + ATV_BUTTON_DOWN_RELEASE, + ATV_BUTTON_MENU, + ATV_BUTTON_MENU_H, + ATV_LEARNED_PLAY, + ATV_LEARNED_PAUSE, + ATV_LEARNED_STOP, + ATV_LEARNED_PREVIOUS, + ATV_LEARNED_NEXT, + ATV_LEARNED_REWIND, //>=ATV 2.3 + ATV_LEARNED_REWIND_RELEASE, //>=ATV 2.3 + ATV_LEARNED_FORWARD, //>=ATV 2.3 + ATV_LEARNED_FORWARD_RELEASE, //>=ATV 2.3 + ATV_LEARNED_RETURN, + ATV_LEARNED_ENTER, + ATV_GESTURE_SWIPE_LEFT, + ATV_GESTURE_SWIPE_RIGHT, + ATV_GESTURE_SWIPE_UP, + ATV_GESTURE_SWIPE_DOWN, + ATV_ALUMINIUM_PLAY, + ATV_ALUMINIUM_PLAY_H, + ATV_INVALID_BUTTON +} eATVClientEvent; + +@interface KodiClientWrapper : NSObject{ + struct KodiClientWrapperImpl* mp_impl; +} +- (id) initWithUniversalMode:(bool) f_yes_no serverAddress:(NSString*) fp_server; +- (void) setUniversalModeTimeout:(double) f_timeout; + +-(void) handleEvent:(eATVClientEvent) f_event; + +@end \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/kodiclientwrapper.mm kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/kodiclientwrapper.mm --- kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/kodiclientwrapper.mm 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/kodiclientwrapper.mm 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,355 @@ +/* + * xbmcclient.cpp + * xbmclauncher + * + * Created by Stephan Diederich on 17.09.08. + * Copyright 2008 Stephan Diederich. All rights reserved. + * Copyright (C) 2008-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ +#include +#include +#include +#include +#include +#import + +#include "kodiclient.h" +#include "XBMCDebugHelpers.h" +#include "KodiClientWrapper.h" + +//helper class for easy EventSequence handling +class XBMCClientEventSequence{ +public: + XBMCClientEventSequence(){} + + //implicit conversion + XBMCClientEventSequence(eATVClientEvent f_event){ + m_stream.push_back(f_event); + } + + std::string str() const{ + std::stringstream ss; + for(std::vector::const_iterator it = m_stream.begin(); + it != m_stream.end(); + ++it){ + ss << *it; + } + return ss.str(); + } + void clear(){ + m_stream.clear(); + } + + // + // operators + // + friend XBMCClientEventSequence operator+ (XBMCClientEventSequence f_seq, eATVClientEvent f_event){ + f_seq.m_stream.push_back(f_event); + return f_seq; + } + XBMCClientEventSequence& operator << (eATVClientEvent f_event){ + m_stream.push_back(f_event); + return *this; + } + friend bool operator <(XBMCClientEventSequence const& fcr_lhs,XBMCClientEventSequence const& fcr_rhs){ + return fcr_lhs.m_stream < fcr_rhs.m_stream; + } + friend bool operator ==(XBMCClientEventSequence const& fcr_lhs,XBMCClientEventSequence const& fcr_rhs){ + return fcr_lhs.m_stream == fcr_rhs.m_stream; + } +private: + std::vector m_stream; +}; + + +//typedef is here, as is seems that I can't put it into iterface declaration +//CPacketBUTTON is a pointer, as I'm not sure how well it's copy constructor is implemented +typedef std::map tEventMap; +typedef std::map tSequenceMap; + +class KodiClientWrapperImpl{ + tEventMap m_event_map; + tSequenceMap m_sequence_map; + + int m_socket; + std::string m_address; + bool m_universal_mode; + XBMCClientEventSequence m_sequence; + CFRunLoopTimerRef m_timer; + double m_sequence_timeout; + + void populateEventMap(); + void populateSequenceMap(); + void sendButton(eATVClientEvent f_event); + void sendSequence(); + void restartTimer(); + void resetTimer(); + bool isStartToken(eATVClientEvent f_event); + static void timerCallBack (CFRunLoopTimerRef timer, void *info); +public: + KodiClientWrapperImpl(bool f_universal_mode, const std::string& fcr_address = "localhost"); + ~KodiClientWrapperImpl(); + void setUniversalModeTimeout(double f_timeout){ + m_sequence_timeout = f_timeout; + } + void handleEvent(eATVClientEvent f_event); +}; + +void KodiClientWrapperImpl::timerCallBack (CFRunLoopTimerRef timer, void *info) +{ + if (!info) + { + fprintf(stderr, "Error. invalid argument to timer callback\n"); + return; + } + + KodiClientWrapperImpl *p_impl = (KodiClientWrapperImpl *)info; + p_impl->sendSequence(); + p_impl->resetTimer(); +} + +void KodiClientWrapperImpl::resetTimer(){ + if (m_timer) + { + CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), m_timer, kCFRunLoopCommonModes); + CFRunLoopTimerInvalidate(m_timer); + CFRelease(m_timer); + m_timer = NULL; + } +} + +void KodiClientWrapperImpl::restartTimer(){ + if (m_timer) + resetTimer(); + + CFRunLoopTimerContext context = { 0, this, 0, 0, 0 }; + m_timer = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + m_sequence_timeout, 0, 0, 0, timerCallBack, &context); + CFRunLoopAddTimer(CFRunLoopGetCurrent(), m_timer, kCFRunLoopCommonModes); +} + +KodiClientWrapperImpl::KodiClientWrapperImpl(bool f_universal_mode, const std::string& fcr_address): m_address(fcr_address), m_universal_mode(f_universal_mode), m_timer(0), m_sequence_timeout(0.5){ + //PRINT_SIGNATURE(); + + populateEventMap(); + if (m_universal_mode) + { + //DLOG(@"KodiClientWrapperImpl started in universal mode sending to address %s", fcr_address.c_str()); + populateSequenceMap(); + } + /* + else + { + DLOG(@"KodiClientWrapperImpl started in normal mode sending to address %s", fcr_address.c_str()); + } + */ + + //open udp port etc + m_socket = socket(AF_INET, SOCK_DGRAM, 0); + if (m_socket < 0) + { + ELOG(@"Error opening UDP socket! error: ", errno); + //TODO What to do? + } +} + +KodiClientWrapperImpl::~KodiClientWrapperImpl(){ + //PRINT_SIGNATURE(); + resetTimer(); + shutdown(m_socket, SHUT_RDWR); +} + +bool KodiClientWrapperImpl::isStartToken(eATVClientEvent f_event){ + return f_event==ATV_BUTTON_MENU_H; +} + +void KodiClientWrapperImpl::sendButton(eATVClientEvent f_event){ + tEventMap::iterator it = m_event_map.find(f_event); + if(it == m_event_map.end()){ + ELOG(@"KodiClientWrapperImpl::sendButton: No mapping defined for button %i", f_event); + return; + } + CPacketBUTTON& packet = *(it->second); + CAddress addr(m_address.c_str()); + packet.Send(m_socket, addr); +} + +void KodiClientWrapperImpl::sendSequence(){ + tSequenceMap::const_iterator it = m_sequence_map.find(m_sequence); + if(it != m_sequence_map.end()){ + CPacketBUTTON& packet = *(it->second); + CAddress addr(m_address.c_str()); + packet.Send(m_socket, addr); + DLOG(@"KodiClientWrapperImpl::sendSequence: sent sequence %s as button %i", m_sequence.str().c_str(), it->second->GetButtonCode()); + } else { + ELOG(@"KodiClientWrapperImpl::sendSequence: No mapping defined for sequence %s", m_sequence.str().c_str()); + } + m_sequence.clear(); +} + +void KodiClientWrapperImpl::handleEvent(eATVClientEvent f_event){ + if(!m_universal_mode){ + sendButton(f_event); + } else { + //in universal mode no keys are directly send. instead a key-sequence is assembled and a timer started + //when the timer expires, that key sequence is checked against predefined sequences and if it is a valid one, + //a button press is generated + if(m_sequence.str().empty()){ + if(isStartToken(f_event)){ + m_sequence << f_event; + DLOG(@"Starting sequence with token %s", m_sequence.str().c_str()); + restartTimer(); + } else { + sendButton(f_event); + } + } else { + //dont queue release-events but restart timer + if(f_event == ATV_BUTTON_LEFT_RELEASE || f_event == ATV_BUTTON_RIGHT_RELEASE || f_event == ATV_BUTTON_UP_RELEASE || f_event == ATV_BUTTON_DOWN_RELEASE) + DLOG(@"Discarded button up event for sequence"); + else{ + m_sequence << f_event; + DLOG(@"Extended sequence to %s", m_sequence.str().c_str()); + } + restartTimer(); + } + } +} + +void KodiClientWrapperImpl::populateEventMap(){ + tEventMap& lr_map = m_event_map; + + lr_map.insert(std::make_pair(ATV_BUTTON_PLAY, new CPacketBUTTON(5, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + + lr_map.insert(std::make_pair(ATV_BUTTON_MENU, new CPacketBUTTON(6, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_BUTTON_MENU_H, new CPacketBUTTON(8, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_BUTTON_UP, new CPacketBUTTON(1, "JS0:AppleRemote", BTN_DOWN | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_BUTTON_UP_RELEASE, new CPacketBUTTON(1, "JS0:AppleRemote", BTN_UP | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_BUTTON_DOWN, new CPacketBUTTON(2, "JS0:AppleRemote", BTN_DOWN | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_BUTTON_DOWN_RELEASE, new CPacketBUTTON(2, "JS0:AppleRemote", BTN_UP | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_BUTTON_RIGHT, new CPacketBUTTON(4, "JS0:AppleRemote", BTN_DOWN | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_BUTTON_RIGHT_RELEASE, new CPacketBUTTON(4, "JS0:AppleRemote", BTN_UP | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_BUTTON_LEFT, new CPacketBUTTON(3, "JS0:AppleRemote", BTN_DOWN | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_BUTTON_LEFT_RELEASE, new CPacketBUTTON(3, "JS0:AppleRemote", BTN_UP | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_BUTTON_PLAY_H, new CPacketBUTTON(7, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + //new aluminium remote buttons + lr_map.insert(std::make_pair(ATV_ALUMINIUM_PLAY, new CPacketBUTTON(12, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_ALUMINIUM_PLAY_H, new CPacketBUTTON(13, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + + //learned remote buttons + lr_map.insert(std::make_pair(ATV_LEARNED_PLAY, new CPacketBUTTON(70, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_LEARNED_PAUSE, new CPacketBUTTON(71, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_LEARNED_STOP, new CPacketBUTTON(72, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_LEARNED_PREVIOUS, new CPacketBUTTON(73, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_LEARNED_NEXT, new CPacketBUTTON(74, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_LEARNED_REWIND, new CPacketBUTTON(75, "JS0:AppleRemote", BTN_DOWN | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_LEARNED_REWIND_RELEASE, new CPacketBUTTON(75, "JS0:AppleRemote", BTN_UP | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_LEARNED_FORWARD, new CPacketBUTTON(76, "JS0:AppleRemote", BTN_DOWN | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_LEARNED_FORWARD_RELEASE, new CPacketBUTTON(76, "JS0:AppleRemote", BTN_UP | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_LEARNED_RETURN, new CPacketBUTTON(77, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_LEARNED_ENTER, new CPacketBUTTON(78, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + + //gestures + lr_map.insert(std::make_pair(ATV_GESTURE_SWIPE_LEFT, new CPacketBUTTON(80, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_GESTURE_SWIPE_RIGHT, new CPacketBUTTON(81, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_GESTURE_SWIPE_UP, new CPacketBUTTON(82, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + lr_map.insert(std::make_pair(ATV_GESTURE_SWIPE_DOWN, new CPacketBUTTON(83, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); +} + +void KodiClientWrapperImpl::populateSequenceMap(){ + XBMCClientEventSequence sequence_prefix; + sequence_prefix << ATV_BUTTON_MENU_H; + m_sequence_map.insert(std::make_pair(sequence_prefix, new CPacketBUTTON(8, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_PLAY, new CPacketBUTTON(20, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_RIGHT, new CPacketBUTTON(21, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_LEFT, new CPacketBUTTON(22, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_UP, new CPacketBUTTON(23, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_DOWN, new CPacketBUTTON(24, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_MENU, new CPacketBUTTON(25, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + + sequence_prefix.clear(); + sequence_prefix << ATV_BUTTON_MENU_H << ATV_BUTTON_PLAY; + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_PLAY, new CPacketBUTTON(26, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_RIGHT, new CPacketBUTTON(27, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_LEFT, new CPacketBUTTON(28, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_UP, new CPacketBUTTON(29, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_DOWN, new CPacketBUTTON(30, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_MENU, new CPacketBUTTON(31, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + + sequence_prefix.clear(); + sequence_prefix << ATV_BUTTON_MENU_H << ATV_BUTTON_UP; + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_PLAY, new CPacketBUTTON(32, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_RIGHT, new CPacketBUTTON(33, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_LEFT, new CPacketBUTTON(34, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_UP, new CPacketBUTTON(35, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_DOWN, new CPacketBUTTON(36, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_MENU, new CPacketBUTTON(37, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + + sequence_prefix.clear(); + sequence_prefix << ATV_BUTTON_MENU_H << ATV_BUTTON_DOWN; + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_PLAY, new CPacketBUTTON(38, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_RIGHT, new CPacketBUTTON(39, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_LEFT, new CPacketBUTTON(40, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_UP, new CPacketBUTTON(41, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_DOWN, new CPacketBUTTON(42, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_MENU, new CPacketBUTTON(43, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + + sequence_prefix.clear(); + sequence_prefix << ATV_BUTTON_MENU_H << ATV_BUTTON_RIGHT; + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_PLAY, new CPacketBUTTON(44, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_RIGHT, new CPacketBUTTON(45, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_LEFT, new CPacketBUTTON(46, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_UP, new CPacketBUTTON(47, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_DOWN, new CPacketBUTTON(48, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_MENU, new CPacketBUTTON(49, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + + sequence_prefix.clear(); + sequence_prefix << ATV_BUTTON_MENU_H << ATV_BUTTON_LEFT; + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_PLAY, new CPacketBUTTON(50, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_RIGHT, new CPacketBUTTON(51, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_LEFT, new CPacketBUTTON(52, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_UP, new CPacketBUTTON(53, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_DOWN, new CPacketBUTTON(54, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); + m_sequence_map.insert(std::make_pair( sequence_prefix + ATV_BUTTON_MENU, new CPacketBUTTON(55, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE))); +} + +@implementation KodiClientWrapper +- (id) init { + return [self initWithUniversalMode:false serverAddress:@"localhost"]; +} +- (id) initWithUniversalMode:(bool) f_yes_no serverAddress:(NSString*) fp_server{ + //PRINT_SIGNATURE(); + if( ![super init] ) + return nil; + mp_impl = new KodiClientWrapperImpl(f_yes_no, [fp_server UTF8String]); + return self; +} + +- (void) setUniversalModeTimeout:(double) f_timeout{ + mp_impl->setUniversalModeTimeout(f_timeout); +} + +- (void)dealloc{ + //PRINT_SIGNATURE(); + delete mp_impl; + [super dealloc]; +} + +-(void) handleEvent:(eATVClientEvent) f_event{ + mp_impl->handleEvent(f_event); +} +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/KodiController.h kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/KodiController.h --- kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/KodiController.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/KodiController.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#import +#import +#import "IOSEAGLView.h" +#import "IOSSCreenManager.h" +#include "XBMC_keysym.h" + +@interface KodiController : BRController +{ + int padding[16]; // credit is due here to SapphireCompatibilityClasses!! + + BRController *m_controller; + + NSTimer *m_keyTimer; + IOSEAGLView *m_glView; + + int m_screensaverTimeout; + int m_systemsleepTimeout; + +} +// message from which our instance is obtained +//+ (KodiController*) sharedInstance; + +- (void) applicationDidExit; +- (void) initDisplayLink; +- (void) deinitDisplayLink; +- (void) setFramebuffer; +- (bool) presentFramebuffer; +- (CGSize) getScreenSize; +- (void) sendKey: (XBMCKey) key; +- (void) disableSystemSleep; +- (void) enableSystemSleep; +- (void) disableScreenSaver; +- (void) enableScreenSaver; +- (void) pauseAnimation; +- (void) resumeAnimation; +- (void) startAnimation; +- (void) stopAnimation; +- (bool) changeScreen: (unsigned int)screenIdx withMode:(UIScreenMode *)mode; +- (void) activateScreen: (UIScreen *)screen withOrientation:(UIInterfaceOrientation)newOrientation; +- (id) glView; +- (void) setGlView:(id)view; +- (BOOL) ATVClientEventFromBREvent:(id)event Repeatable:(bool *)isRepeatable ButtonState:(bool *)isPressed Result:(int *)xbmc_ir_key; +- (void) setUserEvent:(int) eventId withHoldTime:(unsigned int) holdTime; +- (unsigned int) appleModKeyToXbmcModKey: (unsigned int) appleModifier; +- (void) startKeyPressTimer:(int) keyId; +- (void) stopKeyPressTimer; +- (void) setSystemSleepTimeout:(id) timeout; +- (id) systemSleepTimeout; +- (void) setKeyTimer:(id) timer; +- (id) keyTimer; +- (void) setSystemScreenSaverTimeout:(id) timeout; +- (id) systemScreenSaverTimeout; + +@end + +extern KodiController *g_xbmcController; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/KodiController.mm kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/KodiController.mm --- kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/KodiController.mm 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/KodiController.mm 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,1519 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + + +/* HowTo code in this file: + * Since AppleTV/iOS6.x (atv2 version 5.2) Apple removed the AppleTV.framework and put all those classes into the + * AppleTV.app. So we can't use standard obj-c coding here anymore. Instead we need to use the obj-c runtime + * functions for subclassing and adding methods to our instances during runtime (hooking). + * + * 1. For implementing a method of a base class: + * a) declare it in the form like the others + * b) these methods need to be static and have KodiController* self, SEL _cmd (replace ATV2Appliance with the class the method gets implemented for) as minimum params. + * c) add the method to the KodiController.h for getting rid of the compiler warnings of unresponsive selectors (declare the method like done in the baseclass). + * d) in initControllerRuntimeClasses exchange the base class implementation with ours by calling MSHookMessageEx + * e) if we need to call the base class implementation as well we have to save the original implementation (see brEventAction$Orig for reference) + * + * 2. For implementing a new method which is not part of the base class: + * a) same as 1.a + * b) same as 1.b + * c) same as 1.c + * d) in initControllerRuntimeClasses add the method to our class via class_addMethod + * + * 3. Never access any BackRow classes directly - but always get the class via objc_getClass - if the class is used in multiple places + * save it as static (see BRWindowCls) + * + * 4. Keep the structure of this file based on the section comments (marked with // SECTIONCOMMENT). + * 5. really - obey 4.! + * + * 6. for adding class members use associated objects - see timerKey + * + * For further reference see https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html + */ + +//hack around problem with xbmc's typedef int BOOL +// and obj-c's typedef unsigned char BOOL +#define BOOL XBMC_BOOL +#import "WinEvents.h" +#import "XBMC_events.h" +#include "utils/log.h" +#include "osx/DarwinUtils.h" +#include "threads/Event.h" +#include "Application.h" +#include "input/Key.h" +#undef BOOL + +#import +#import + +#import "KodiController.h" +#import "XBMCDebugHelpers.h" + +#import "IOSEAGLView.h" +#import "IOSSCreenManager.h" +#include "XBMC_keysym.h" +#include "substrate.h" + +//start repeating after 0.5s +#define REPEATED_KEYPRESS_DELAY_S 0.5 +//pause 0.01s (10ms) between keypresses +#define REPEATED_KEYPRESS_PAUSE_S 0.01 + +typedef enum { + + ATV_BUTTON_UP = 1, + ATV_BUTTON_DOWN = 2, + ATV_BUTTON_LEFT = 3, + ATV_BUTTON_RIGHT = 4, + ATV_BUTTON_PLAY = 5, + ATV_BUTTON_MENU = 6, + ATV_BUTTON_PLAY_H = 7, + ATV_BUTTON_MENU_H = 8, + ATV_BUTTON_LEFT_H = 9, + ATV_BUTTON_RIGHT_H = 10, + + //new aluminium remote buttons + ATV_ALUMINIUM_PLAY = 12, + ATV_ALUMINIUM_PLAY_H = 11, + + //newly added remote buttons + ATV_BUTTON_PAGEUP = 13, + ATV_BUTTON_PAGEDOWN = 14, + ATV_BUTTON_PAUSE = 15, + ATV_BUTTON_PLAY2 = 16, + ATV_BUTTON_STOP = 17, + ATV_BUTTON_STOP_RELEASE = 17, + ATV_BUTTON_FASTFWD = 18, + ATV_BUTTON_FASTFWD_RELEASE = 18, + ATV_BUTTON_REWIND = 19, + ATV_BUTTON_REWIND_RELEASE = 19, + ATV_BUTTON_SKIPFWD = 20, + ATV_BUTTON_SKIPBACK = 21, + + //learned remote buttons + ATV_LEARNED_PLAY = 70, + ATV_LEARNED_PAUSE = 71, + ATV_LEARNED_STOP = 72, + ATV_LEARNED_PREVIOUS = 73, + ATV_LEARNED_NEXT = 74, + ATV_LEARNED_REWIND = 75, + ATV_LEARNED_REWIND_RELEASE = 75, + ATV_LEARNED_FORWARD = 76, + ATV_LEARNED_FORWARD_RELEASE = 76, + ATV_LEARNED_RETURN = 77, + ATV_LEARNED_ENTER = 78, + + //gestures + ATV_GESTURE_SWIPE_LEFT = 80, + ATV_GESTURE_SWIPE_RIGHT = 81, + ATV_GESTURE_SWIPE_UP = 82, + ATV_GESTURE_SWIPE_DOWN = 83, + + ATV_GESTURE_FLICK_LEFT = 85, + ATV_GESTURE_FLICK_RIGHT = 86, + ATV_GESTURE_FLICK_UP = 87, + ATV_GESTURE_FLICK_DOWN = 88, + ATV_GESTURE_TOUCHHOLD = 89, + + ATV_BTKEYPRESS = 84, + + ATV_INVALID_BUTTON +} eATVClientEvent; + + +typedef enum { + // for originator kBREventOriginatorRemote + kBREventRemoteActionMenu = 1, + kBREventRemoteActionMenuHold = 2, + kBREventRemoteActionUp = 3, + kBREventRemoteActionDown = 4, + kBREventRemoteActionPlay = 5, + kBREventRemoteActionLeft = 6, + kBREventRemoteActionRight = 7, + kBREventRemoteActionRewind2 = 8, + kBREventRemoteActionFastFwd2 = 9, + + kBREventRemoteActionALPlay = 10, + + kBREventRemoteActionPageUp = 13, + kBREventRemoteActionPageDown = 14, + kBREventRemoteActionPause = 15, + kBREventRemoteActionPlay2 = 16, + kBREventRemoteActionStop = 17, + kBREventRemoteActionFastFwd = 18, + kBREventRemoteActionRewind = 19, + kBREventRemoteActionSkipFwd = 20, + kBREventRemoteActionSkipBack = 21, + + + kBREventRemoteActionPlayHold = 22, + kBREventRemoteActionCenterHold, + kBREventRemoteActionCenterHold42, + + // Gestures, for originator kBREventOriginatorGesture + kBREventRemoteActionTouchBegin= 31, + kBREventRemoteActionTouchMove = 32, + kBREventRemoteActionTouchEnd = 33, + + kBREventRemoteActionSwipeLeft = 34, + kBREventRemoteActionSwipeRight= 35, + kBREventRemoteActionSwipeUp = 36, + kBREventRemoteActionSwipeDown = 37, + + kBREventRemoteActionFlickLeft = 38, + kBREventRemoteActionFlickRight= 39, + kBREventRemoteActionFlickUp = 40, + kBREventRemoteActionFlickDown = 41, + + kBREventRemoteActionTouchHold = 46, + + // keypresses, for originator kBREventOriginatorKeyboard + kBREventRemoteActionKeyPress = 47, + kBREventRemoteActionKeyPress42, + + kBREventRemoteActionKeyTab = 53, + + // Custom remote actions for old remote actions + kBREventRemoteActionHoldLeft = 0xfeed0001, + kBREventRemoteActionHoldRight, + kBREventRemoteActionHoldUp, + kBREventRemoteActionHoldDown, +} BREventRemoteAction; + +typedef enum { + kBREventModifierCommandLeft = 0x10000, + kBREventModifierShiftLeft = 0x20000, + kBREventModifierOptionLeft = 0x80000, + kBREventModifierCtrlLeft = 0x100000, + kBREventModifierShiftRight = 0x200000, + kBREventModifierOptionRight = 0x400000, + kBREventModifierCommandRight = 0x1000000, +}BREventModifier; + +typedef enum { + kBREventOriginatorRemote = 1, + kBREventOriginatorKeyboard = 2, + kBREventOriginatorGesture = 3, +}BREventOriginiator; + + +KodiController *g_xbmcController; + +//-------------------------------------------------------------- +// so we don't have to include AppleTV.frameworks/PrivateHeaders/ATVSettingsFacade.h +@interface XBMCSettingsFacade : NSObject +-(int)screenSaverTimeout; +-(void)setScreenSaverTimeout:(int) f_timeout; +-(void)setSleepTimeout:(int)timeout; +-(int)sleepTimeout; +-(void)flushDiskChanges; +@end + +// notification messages +extern NSString* kBRScreenSaverActivated; +extern NSString* kBRScreenSaverDismissed; + +//-------------------------------------------------------------- +//-------------------------------------------------------------- +// SECTIONCOMMENT +// orig method handlers we wanna call in hooked methods ([super method]) +static BOOL (*KodiController$brEventAction$Orig)(KodiController*, SEL, BREvent*); +static id (*KodiController$init$Orig)(KodiController*, SEL); +static void (*KodiController$dealloc$Orig)(KodiController*, SEL); +static void (*KodiController$controlWasActivated$Orig)(KodiController*, SEL); +static void (*KodiController$controlWasDeactivated$Orig)(KodiController*, SEL); + +// SECTIONCOMMENT +// classes we need multiple times +static Class BRWindowCls; + +int padding[16];//obsolete? - was commented with "credit is due here to SapphireCompatibilityClasses!!" + +//-------------------------------------------------------------- +//-------------------------------------------------------------- +// SECTIONCOMMENT +// since we can't inject ivars we need to use associated objects +// these are the keys for KodiController +static char timerKey; +static char glviewKey; +static char screensaverKey; +static char systemsleepKey; + +// +// +// SECTIONCOMMENT +//implementation KodiController + +static id KodiController$keyTimer(KodiController* self, SEL _cmd) +{ + return objc_getAssociatedObject(self, &timerKey); +} + +static void KodiController$setKeyTimer(KodiController* self, SEL _cmd, id timer) +{ + objc_setAssociatedObject(self, &timerKey, timer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +static id KodiController$glView(KodiController* self, SEL _cmd) +{ + return objc_getAssociatedObject(self, &glviewKey); +} + +static void KodiController$setGlView(KodiController* self, SEL _cmd, id view) +{ + objc_setAssociatedObject(self, &glviewKey, view, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +static id KodiController$systemScreenSaverTimeout(KodiController* self, SEL _cmd) +{ + return objc_getAssociatedObject(self, &screensaverKey); +} + +static void KodiController$setSystemScreenSaverTimeout(KodiController* self, SEL _cmd, id timeout) +{ + objc_setAssociatedObject(self, &screensaverKey, timeout, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +static id KodiController$systemSleepTimeout(KodiController* self, SEL _cmd) +{ + return objc_getAssociatedObject(self, &systemsleepKey); +} + +static void KodiController$setSystemSleepTimeout(KodiController* self, SEL _cmd, id timeout) +{ + objc_setAssociatedObject(self, &systemsleepKey, timeout, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +static void KodiController$applicationDidExit(KodiController* self, SEL _cmd) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + + [[self glView] stopAnimation]; + [self enableScreenSaver]; + [self enableSystemSleep]; + [[self stack] popController]; +} + +static void KodiController$initDisplayLink(KodiController* self, SEL _cmd) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + + [[self glView] initDisplayLink]; +} + +static void KodiController$deinitDisplayLink(KodiController* self, SEL _cmd) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + + [[self glView] deinitDisplayLink]; +} + +static void KodiController$setFramebuffer(KodiController* self, SEL _cmd) +{ + [[self glView] setFramebuffer]; +} + +static bool KodiController$presentFramebuffer(KodiController* self, SEL _cmd) +{ + return [[self glView] presentFramebuffer]; +} + +static CGSize KodiController$getScreenSize(KodiController* self, SEL _cmd) +{ + CGSize screensize; + screensize.width = [BRWindowCls interfaceFrame].size.width; + screensize.height = [BRWindowCls interfaceFrame].size.height; + //NSLog(@"%s UpdateResolutions width=%f, height=%f", + //__PRETTY_FUNCTION__, screensize.width, screensize.height); + return screensize; +} + +static void KodiController$sendKey(KodiController* self, SEL _cmd, XBMCKey key) +{ + //empty because its not used here. Only implemented for getting rid + //of "may not respond to selector" compile warnings in IOSExternalTouchController +} + +static id KodiController$init(KodiController* self, SEL _cmd) +{ + if((self = KodiController$init$Orig(self, _cmd)) != nil) + { + //NSLog(@"%s", __PRETTY_FUNCTION__); + + NSNotificationCenter *center; + // first the default notification center, which is all + // notifications that only happen inside of our program + center = [NSNotificationCenter defaultCenter]; + [center addObserver: self + selector: @selector(observeDefaultCenterStuff:) + name: nil + object: nil]; + + IOSEAGLView *view = [[IOSEAGLView alloc] initWithFrame:[BRWindowCls interfaceFrame] withScreen:[UIScreen mainScreen]]; + [self setGlView:view]; + + [[IOSScreenManager sharedInstance] setView:[self glView]]; + + g_xbmcController = self; + } + return self; +} + +static void KodiController$dealloc(KodiController* self, SEL _cmd) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + [[self glView] stopAnimation]; + [[self glView] release]; + + NSNotificationCenter *center; + // take us off the default center for our app + center = [NSNotificationCenter defaultCenter]; + [center removeObserver: self]; + + KodiController$dealloc$Orig(self, _cmd); +} + +static void KodiController$controlWasActivated(KodiController* self, SEL _cmd) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + + KodiController$controlWasActivated$Orig(self, _cmd); + + [self disableSystemSleep]; + [self disableScreenSaver]; + + IOSEAGLView *view = [self glView]; + //inject our gles layer into the backrow root layer + [[BRWindowCls rootLayer] addSublayer:view.layer]; + + [[self glView] startAnimation]; +} + +static void KodiController$controlWasDeactivated(KodiController* self, SEL _cmd) +{ + NSLog(@"forced by FrontRow to exit via controlWasDeactivated"); + + [[self glView] stopAnimation]; + [[[self glView] layer] removeFromSuperlayer]; + + [self enableScreenSaver]; + [self enableSystemSleep]; + + KodiController$controlWasDeactivated$Orig(self, _cmd); +} + +static BOOL KodiController$recreateOnReselect(KodiController* self, SEL _cmd) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + return YES; +} + +static void KodiController$ATVClientEventFromBREvent(KodiController* self, SEL _cmd, BREvent* f_event, bool * isRepeatable, bool * isPressed, int * result) +{ + if(f_event == nil)// paranoia + return; + + int remoteAction = [f_event remoteAction]; + unsigned int originator = [f_event originator]; + CLog::Log(LOGDEBUG,"KodiController: Button press remoteAction = %i originator = %i", remoteAction, originator); + *isRepeatable = false; + *isPressed = false; + + switch (remoteAction) + { + // tap up + case kBREventRemoteActionUp: + case 65676: + *isRepeatable = true; + if([f_event value] == 1) + *isPressed = true; + *result = ATV_BUTTON_UP; + return; + + // tap down + case kBREventRemoteActionDown: + case 65677: + *isRepeatable = true; + if([f_event value] == 1) + *isPressed = true; + *result = ATV_BUTTON_DOWN; + return; + + // tap left + case kBREventRemoteActionLeft: + case 65675: + *isRepeatable = true; + if([f_event value] == 1) + *isPressed = true; + *result = ATV_BUTTON_LEFT; + return; + + // hold left + case 786612: + if([f_event value] == 1) + *result = ATV_LEARNED_REWIND; + else + *result = ATV_INVALID_BUTTON; + return; + + // tap right + case kBREventRemoteActionRight: + case 65674: + *isRepeatable = true; + if ([f_event value] == 1) + *isPressed = true; + *result = ATV_BUTTON_RIGHT; + return ; + + // hold right + case 786611: + if ([f_event value] == 1) + *result = ATV_LEARNED_FORWARD; + else + *result = ATV_INVALID_BUTTON; + return ; + + // tap play + case kBREventRemoteActionPlay: + case 65673: + if (originator == kBREventOriginatorKeyboard) // on bt keyboard play == return! + *result = ATV_BTKEYPRESS; + else + *result = ATV_BUTTON_PLAY; + return ; + + // hold play + case kBREventRemoteActionPlayHold: + case kBREventRemoteActionCenterHold: + case kBREventRemoteActionCenterHold42: + case 65668: + if (originator == kBREventOriginatorKeyboard) // invalid on bt keyboard + *result = ATV_INVALID_BUTTON; + else + *result = ATV_BUTTON_PLAY_H; + return ; + + // menu + case kBREventRemoteActionMenu: + case 65670: + if (originator == kBREventOriginatorKeyboard) // on bt keyboard menu == esc! + *result = ATV_BTKEYPRESS; + else + *result = ATV_BUTTON_MENU; + return ; + + // hold menu + case kBREventRemoteActionMenuHold: + case 786496: + if (originator == kBREventOriginatorKeyboard) // invalid on bt keyboard + *result = ATV_INVALID_BUTTON; + else + *result = ATV_BUTTON_MENU_H; + return ; + + // learned play + case 786608: + *result = ATV_LEARNED_PLAY; + return ; + + // learned pause + case 786609: + *result = ATV_LEARNED_PAUSE; + return ; + + // learned stop + case 786615: + *result = ATV_LEARNED_STOP; + return ; + + // learned next + case 786613: + *result = ATV_LEARNED_NEXT; + return ; + + // learned previous + case 786614: + *result = ATV_LEARNED_PREVIOUS; + return ; + + // learned enter, like go into something + case 786630: + *result = ATV_LEARNED_ENTER; + return ; + + // learned return, like go back + case 786631: + *result = ATV_LEARNED_RETURN; + return ; + + // tap play on new Al IR remote + case kBREventRemoteActionALPlay: + case 786637: + if (originator == kBREventOriginatorKeyboard) // on bt keyboard alplay == space! + *result = ATV_BTKEYPRESS; + else + *result = ATV_ALUMINIUM_PLAY; + return ; + + case kBREventRemoteActionKeyPress: + case kBREventRemoteActionKeyPress42: + *isRepeatable = true; + if (originator == kBREventOriginatorKeyboard) // only valid on bt keyboard + *result = ATV_BTKEYPRESS; + else + *result = ATV_INVALID_BUTTON; + return ; + + case kBREventRemoteActionKeyTab: + *isRepeatable = true; + if (originator == kBREventOriginatorKeyboard) // only valid on bt keyboard + *result = ATV_BTKEYPRESS; + else + *result = ATV_INVALID_BUTTON; + return ; + + // PageUp + case kBREventRemoteActionPageUp: + *result = ATV_BUTTON_PAGEUP; + return ; + + // PageDown + case kBREventRemoteActionPageDown: + *result = ATV_BUTTON_PAGEDOWN; + return ; + + // Pause + case kBREventRemoteActionPause: + *result = ATV_BUTTON_PAUSE; + return ; + + // Play2 + case kBREventRemoteActionPlay2: + *result = ATV_BUTTON_PLAY2; + return ; + + // Stop + case kBREventRemoteActionStop: + *result = ATV_BUTTON_STOP; + return ; + + // Fast Forward + case kBREventRemoteActionFastFwd: + case kBREventRemoteActionFastFwd2: + *isRepeatable = true; + if([f_event value] == 1) + *isPressed = true; + *result = ATV_BUTTON_FASTFWD; + return; + + // Rewind + case kBREventRemoteActionRewind: + case kBREventRemoteActionRewind2: + *isRepeatable = true; + if([f_event value] == 1) + *isPressed = true; + *result = ATV_BUTTON_REWIND; + return; + + // Skip Forward + case kBREventRemoteActionSkipFwd: + *result = ATV_BUTTON_SKIPFWD; + return ; + + // Skip Back + case kBREventRemoteActionSkipBack: + *result = ATV_BUTTON_SKIPBACK; + return ; + + // Gesture Swipe Left + case kBREventRemoteActionSwipeLeft: + if ([f_event value] == 1) + *result = ATV_GESTURE_SWIPE_LEFT; + else + *result = ATV_INVALID_BUTTON; + return ; + + // Gesture Swipe Right + case kBREventRemoteActionSwipeRight: + if ([f_event value] == 1) + *result = ATV_GESTURE_SWIPE_RIGHT; + else + *result = ATV_INVALID_BUTTON; + return ; + + // Gesture Swipe Up + case kBREventRemoteActionSwipeUp: + if ([f_event value] == 1) + *result = ATV_GESTURE_SWIPE_UP; + else + *result = ATV_INVALID_BUTTON; + return ; + + // Gesture Swipe Down + case kBREventRemoteActionSwipeDown: + if ([f_event value] == 1) + *result = ATV_GESTURE_SWIPE_DOWN; + else + *result = ATV_INVALID_BUTTON; + return; + + // Gesture Flick Left + case kBREventRemoteActionFlickLeft: + if ([f_event value] == 1) + *result = ATV_GESTURE_FLICK_LEFT; + else + *result = ATV_INVALID_BUTTON; + return; + + // Gesture Flick Right + case kBREventRemoteActionFlickRight: + if ([f_event value] == 1) + *result = ATV_GESTURE_FLICK_RIGHT; + else + *result = ATV_INVALID_BUTTON; + return; + + // Gesture Flick Up + case kBREventRemoteActionFlickUp: + if ([f_event value] == 1) + *result = ATV_GESTURE_FLICK_UP; + else + *result = ATV_INVALID_BUTTON; + return; + + // Gesture Flick Down + case kBREventRemoteActionFlickDown: + if ([f_event value] == 1) + *result = ATV_GESTURE_FLICK_DOWN; + else + *result = ATV_INVALID_BUTTON; + return; + + default: + ELOG(@"KodiController: Unknown button press remoteAction = %i", remoteAction); + *result = ATV_INVALID_BUTTON; + } +} + +static void KodiController$setUserEvent(KodiController* self, SEL _cmd, int eventId, unsigned int holdTime) +{ + + XBMC_Event newEvent; + memset(&newEvent, 0, sizeof(newEvent)); + + newEvent.type = XBMC_USEREVENT; + newEvent.jbutton.which = eventId; + newEvent.jbutton.holdTime = holdTime; + CWinEvents::MessagePush(&newEvent); +} + +static unsigned int KodiController$appleModKeyToXbmcModKey(KodiController* self, SEL _cmd, unsigned int appleModifier) +{ + unsigned int xbmcModifier = XBMCKMOD_NONE; + // shift left + if (appleModifier & kBREventModifierShiftLeft) + xbmcModifier |= XBMCKMOD_LSHIFT; + // shift right + if (appleModifier & kBREventModifierShiftRight) + xbmcModifier |= XBMCKMOD_RSHIFT; + // left ctrl + if (appleModifier & kBREventModifierCtrlLeft) + xbmcModifier |= XBMCKMOD_LCTRL; + // left alt/option + if (appleModifier & kBREventModifierOptionLeft) + xbmcModifier |= XBMCKMOD_LALT; + // right alt/altgr/option + if (appleModifier & kBREventModifierOptionRight) + xbmcModifier |= XBMCKMOD_RALT; + // left command + if (appleModifier & kBREventModifierCommandLeft) + xbmcModifier |= XBMCKMOD_LMETA; + // right command + if (appleModifier & kBREventModifierCommandRight) + xbmcModifier |= XBMCKMOD_RMETA; + + return xbmcModifier; +} + +static BOOL KodiController$brEventAction(KodiController* self, SEL _cmd, BREvent* event) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + + if ([[self glView] isAnimating]) + { + BOOL is_handled = NO; + bool isRepeatable = false; + bool isPressed = false; + int xbmc_ir_key = ATV_INVALID_BUTTON; + [self ATVClientEventFromBREvent:event + Repeatable:&isRepeatable + ButtonState:&isPressed + Result:&xbmc_ir_key]; + + if ( xbmc_ir_key != ATV_INVALID_BUTTON ) + { + if (xbmc_ir_key == ATV_BTKEYPRESS) + { + XBMC_Event newEvent; + memset(&newEvent, 0, sizeof(newEvent)); + + NSDictionary *dict = [event eventDictionary]; + NSString *key_nsstring = [dict objectForKey:@"kBRKeyEventCharactersKey"]; + unsigned int modifier = [[dict objectForKey:@"kBRKeyEventModifiersKey"] unsignedIntValue]; + bool fireTheKey = false; + + if (key_nsstring != nil && [key_nsstring length] == 1) + { + //ns_string contains the letter you want to input + //unichar c = [key_nsstring characterAtIndex:0]; + //keyEvent = translateCocoaToXBMCEvent(c); + const char* wstr = [key_nsstring cStringUsingEncoding:NSUTF16StringEncoding]; + //NSLog(@"%s, key: wstr[0] = %d, wstr[1] = %d", __PRETTY_FUNCTION__, wstr[0], wstr[1]); + + if (wstr[0] != 92) + { + if (wstr[0] == 62 && wstr[1] == -9) + { + // stupid delete key + newEvent.key.keysym.sym = (XBMCKey)8; + newEvent.key.keysym.unicode = 8; + } + else + { + newEvent.key.keysym.sym = (XBMCKey)wstr[0]; + newEvent.key.keysym.unicode = wstr[0] | (wstr[1] << 8); + } + fireTheKey = true; + } + } + else // this must be one of those duped functions when using the bt keyboard + { + int remoteAction = [event remoteAction]; + fireTheKey = true; + switch (remoteAction) + { + case kBREventRemoteActionALPlay:// play maps to space + case 786637: + newEvent.key.keysym.sym = XBMCK_SPACE; + newEvent.key.keysym.unicode = XBMCK_SPACE; + break; + case kBREventRemoteActionMenu:// menu maps to escape! + case 65670: + newEvent.key.keysym.sym = XBMCK_ESCAPE; + newEvent.key.keysym.unicode = XBMCK_ESCAPE; + break; + case kBREventRemoteActionKeyTab: + newEvent.key.keysym.sym = XBMCK_TAB; + newEvent.key.keysym.unicode = XBMCK_TAB; + break; + case kBREventRemoteActionPlay:// play maps to return + case 65673: + newEvent.key.keysym.sym = XBMCK_RETURN; + newEvent.key.keysym.unicode = XBMCK_RETURN; + break; + default: // unsupported duped function + fireTheKey = false; + break; + } + } + + if (fireTheKey && (!isRepeatable || [event value] == 1)) // some keys might be repeatable - only fire once here + { + newEvent.key.keysym.mod = (XBMCMod)[self appleModKeyToXbmcModKey:modifier]; + newEvent.type = XBMC_KEYDOWN; + CWinEvents::MessagePush(&newEvent); + newEvent.type = XBMC_KEYUP; + CWinEvents::MessagePush(&newEvent); + is_handled = TRUE; + } + } + else + { + if(isRepeatable) + { + if(isPressed) + { + [self setUserEvent:xbmc_ir_key withHoldTime:0]; + [self startKeyPressTimer:xbmc_ir_key]; + } + else + { + //stop the timer + [self stopKeyPressTimer]; + } + } + else + { + [self setUserEvent:xbmc_ir_key withHoldTime:0]; + } + is_handled = TRUE; + } + } + return is_handled; + } + else + { + return KodiController$brEventAction$Orig(self, _cmd, event); + } +} + +#pragma mark - +#pragma mark private helper methods +static void KodiController$startKeyPressTimer(KodiController* self, SEL _cmd, int keyId) +{ + NSNumber *number = [NSNumber numberWithInt:keyId]; + NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSDate date], @"StartDate", + number, @"keyId", nil]; + + NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:REPEATED_KEYPRESS_DELAY_S]; + [self stopKeyPressTimer]; + + //schedule repeated timer which starts after REPEATED_KEYPRESS_DELAY_S and fires + //every REPEATED_KEYPRESS_PAUSE_S + NSTimer *timer = [[NSTimer alloc] initWithFireDate:fireDate + interval:REPEATED_KEYPRESS_PAUSE_S + target:self + selector:@selector(keyPressTimerCallback:) + userInfo:dict + repeats:YES]; + + //schedule the timer to the runloop + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + [runLoop addTimer:timer forMode:NSDefaultRunLoopMode]; + [self setKeyTimer:timer]; +} + +static void KodiController$stopKeyPressTimer(KodiController* self, SEL _cmd) +{ + if([self keyTimer] != nil) + { + [[self keyTimer] invalidate]; + [[self keyTimer] release]; + [self setKeyTimer:nil]; + } +} + +static void KodiController$keyPressTimerCallback(KodiController* self, SEL _cmd, NSTimer* theTimer) +{ + //if queue is empty - skip this timer event + //for letting it process + if(CWinEvents::GetQueueSize()) + return; + + NSDate *startDate = [[theTimer userInfo] objectForKey:@"StartDate"]; + int keyId = [[[theTimer userInfo] objectForKey:@"keyId"] intValue]; + //calc the holdTime - timeIntervalSinceNow gives the + //passed time since startDate in seconds as negative number + //so multiply with -1000 for getting the positive ms + NSTimeInterval holdTime = [startDate timeIntervalSinceNow] * -1000.0f; + [self setUserEvent:keyId withHoldTime:(unsigned int)holdTime]; +} + +static void KodiController$observeDefaultCenterStuff(KodiController* self, SEL _cmd, NSNotification * notification) +{ + //NSLog(@"default: %@", [notification name]); + + if ([notification name] == UIApplicationDidReceiveMemoryWarningNotification) + NSLog(@"Kodi: %@", [notification name]); + + //if ([notification name] == kBRScreenSaverActivated) + // [m_glView stopAnimation]; + + //if ([notification name] == kBRScreenSaverDismissed) + // [m_glView startAnimation]; +} + +static void KodiController$disableSystemSleep(KodiController* self, SEL _cmd) +{ + Class ATVSettingsFacadeCls = objc_getClass("ATVSettingsFacade"); + XBMCSettingsFacade *single = (XBMCSettingsFacade *)[ATVSettingsFacadeCls singleton]; + + int tmpTimeout = [single sleepTimeout]; + NSNumber *timeout = [NSNumber numberWithInt:tmpTimeout]; + [self setSystemSleepTimeout:timeout]; + [single setSleepTimeout: -1]; + [single flushDiskChanges]; +} + +static void KodiController$enableSystemSleep(KodiController* self, SEL _cmd) +{ + Class ATVSettingsFacadeCls = objc_getClass("ATVSettingsFacade"); + int timeoutInt = [[self systemSleepTimeout] intValue]; + [[ATVSettingsFacadeCls singleton] setSleepTimeout:timeoutInt]; + [[ATVSettingsFacadeCls singleton] flushDiskChanges]; +} + +static void KodiController$disableScreenSaver(KodiController* self, SEL _cmd) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + //store screen saver state and disable it + + Class ATVSettingsFacadeCls = objc_getClass("ATVSettingsFacade"); + XBMCSettingsFacade *single = (XBMCSettingsFacade *)[ATVSettingsFacadeCls singleton]; + + int tmpTimeout = [single screenSaverTimeout]; + NSNumber *timeout = [NSNumber numberWithInt:tmpTimeout]; + [self setSystemScreenSaverTimeout:timeout]; + [single setScreenSaverTimeout: -1]; + [single flushDiskChanges]; + + // breaks in 4.2.1 [[BRBackgroundTaskManager singleton] holdOffBackgroundTasks]; +} + +static void KodiController$enableScreenSaver(KodiController* self, SEL _cmd) +{ + //NSLog(@"%s", __PRETTY_FUNCTION__); + //reset screen saver to user settings + Class ATVSettingsFacadeCls = objc_getClass("ATVSettingsFacade"); + + int timeoutInt = [[self systemScreenSaverTimeout] intValue]; + [[ATVSettingsFacadeCls singleton] setScreenSaverTimeout:timeoutInt]; + [[ATVSettingsFacadeCls singleton] flushDiskChanges]; + + // breaks in 4.2.1 [[BRBackgroundTaskManager singleton] okToDoBackgroundProcessing]; +} + +/* +- (XBMC_Event) translateCocoaToXBMCEvent: (unichar) c +{ + XBMC_Event newEvent; + memset(&newEvent, 0, sizeof(newEvent)); + + switch (c) + { + // Alt + case NSMenuFunctionKey: + return "Alt"; + + // "Apps" + // "BrowserBack" + // "BrowserForward" + // "BrowserHome" + // "BrowserRefresh" + // "BrowserSearch" + // "BrowserStop" + // "CapsLock" + + // "Clear" + case NSClearLineFunctionKey: + return "Clear"; + + // "CodeInput" + // "Compose" + // "Control" + // "Crsel" + // "Convert" + // "Copy" + // "Cut" + + // "Down" + case NSDownArrowFunctionKey: + return "Down"; + // "End" + case NSEndFunctionKey: + return "End"; + // "Enter" + case 0x3: case 0xA: case 0xD: // Macintosh calls the one on the main keyboard Return, but Windows calls it Enter, so we'll do the same for the DOM + return "Enter"; + + // "EraseEof" + + // "Execute" + case NSExecuteFunctionKey: + return "Execute"; + + // "Exsel" + + // "F1" + case NSF1FunctionKey: + return "F1"; + // "F2" + case NSF2FunctionKey: + return "F2"; + // "F3" + case NSF3FunctionKey: + return "F3"; + // "F4" + case NSF4FunctionKey: + return "F4"; + // "F5" + case NSF5FunctionKey: + return "F5"; + // "F6" + case NSF6FunctionKey: + return "F6"; + // "F7" + case NSF7FunctionKey: + return "F7"; + // "F8" + case NSF8FunctionKey: + return "F8"; + // "F9" + case NSF9FunctionKey: + return "F9"; + // "F10" + case NSF10FunctionKey: + return "F10"; + // "F11" + case NSF11FunctionKey: + return "F11"; + // "F12" + case NSF12FunctionKey: + return "F12"; + // "F13" + case NSF13FunctionKey: + return "F13"; + // "F14" + case NSF14FunctionKey: + return "F14"; + // "F15" + case NSF15FunctionKey: + return "F15"; + // "F16" + case NSF16FunctionKey: + return "F16"; + // "F17" + case NSF17FunctionKey: + return "F17"; + // "F18" + case NSF18FunctionKey: + return "F18"; + // "F19" + case NSF19FunctionKey: + return "F19"; + // "F20" + case NSF20FunctionKey: + return "F20"; + // "F21" + case NSF21FunctionKey: + return "F21"; + // "F22" + case NSF22FunctionKey: + return "F22"; + // "F23" + case NSF23FunctionKey: + return "F23"; + // "F24" + case NSF24FunctionKey: + return "F24"; + + // "FinalMode" + + // "Find" + case NSFindFunctionKey: + return "Find"; + + // "FullWidth" + // "HalfWidth" + // "HangulMode" + // "HanjaMode" + + // "Help" + case NSHelpFunctionKey: + return "Help"; + + // "Hiragana" + + // "Home" + case NSHomeFunctionKey: + return "Home"; + // "Insert" + case NSInsertFunctionKey: + return "Insert"; + + // "JapaneseHiragana" + // "JapaneseKatakana" + // "JapaneseRomaji" + // "JunjaMode" + // "KanaMode" + // "KanjiMode" + // "Katakana" + // "LaunchApplication1" + // "LaunchApplication2" + // "LaunchMail" + + // "Left" + case NSLeftArrowFunctionKey: + return "Left"; + + // "Meta" + // "MediaNextTrack" + // "MediaPlayPause" + // "MediaPreviousTrack" + // "MediaStop" + + // "ModeChange" + case NSModeSwitchFunctionKey: + return "ModeChange"; + + // "Nonconvert" + // "NumLock" + + // "PageDown" + case NSPageDownFunctionKey: + return "PageDown"; + // "PageUp" + case NSPageUpFunctionKey: + return "PageUp"; + + // "Paste" + + // "Pause" + case NSPauseFunctionKey: + return "Pause"; + + // "Play" + // "PreviousCandidate" + + // "PrintScreen" + case NSPrintScreenFunctionKey: + return "PrintScreen"; + + // "Process" + // "Props" + + // "Right" + case NSRightArrowFunctionKey: + return "Right"; + + // "RomanCharacters" + + // "Scroll" + case NSScrollLockFunctionKey: + return "Scroll"; + // "Select" + case NSSelectFunctionKey: + return "Select"; + + // "SelectMedia" + // "Shift" + + // "Stop" + case NSStopFunctionKey: + return "Stop"; + // "Up" + case NSUpArrowFunctionKey: + return "Up"; + // "Undo" + case NSUndoFunctionKey: + return "Undo"; + + // "VolumeDown" + // "VolumeMute" + // "VolumeUp" + // "Win" + // "Zoom" + + // More function keys, not in the key identifier specification. + case NSF25FunctionKey: + return "F25"; + case NSF26FunctionKey: + return "F26"; + case NSF27FunctionKey: + return "F27"; + case NSF28FunctionKey: + return "F28"; + case NSF29FunctionKey: + return "F29"; + case NSF30FunctionKey: + return "F30"; + case NSF31FunctionKey: + return "F31"; + case NSF32FunctionKey: + return "F32"; + case NSF33FunctionKey: + return "F33"; + case NSF34FunctionKey: + return "F34"; + case NSF35FunctionKey: + return "F35"; + + // Turn 0x7F into 0x08, because backspace needs to always be 0x08. + case 0x7F: + XBMCK_BACKSPACE + // Standard says that DEL becomes U+007F. + case NSDeleteFunctionKey: + XBMCK_DELETE; + + // Always use 0x09 for tab instead of AppKit's backtab character. + case NSBackTabCharacter: + return "U+0009"; + + case NSBeginFunctionKey: + case NSBreakFunctionKey: + case NSClearDisplayFunctionKey: + case NSDeleteCharFunctionKey: + case NSDeleteLineFunctionKey: + case NSInsertCharFunctionKey: + case NSInsertLineFunctionKey: + case NSNextFunctionKey: + case NSPrevFunctionKey: + case NSPrintFunctionKey: + case NSRedoFunctionKey: + case NSResetFunctionKey: + case NSSysReqFunctionKey: + case NSSystemFunctionKey: + case NSUserFunctionKey: + // FIXME: We should use something other than the vendor-area Unicode values for the above keys. + // For now, just fall through to the default. + default: + return String::format("U+%04X", toASCIIUpper(c)); + } + return newEvent; +}*/ + +//-------------------------------------------------------------- +static void KodiController$pauseAnimation(KodiController* self, SEL _cmd) +{ + XBMC_Event newEvent; + memset(&newEvent, 0, sizeof(XBMC_Event)); + + newEvent.appcommand.type = XBMC_APPCOMMAND; + newEvent.appcommand.action = ACTION_PLAYER_PLAYPAUSE; + CWinEvents::MessagePush(&newEvent); + + Sleep(2000); + [[self glView] pauseAnimation]; +} +//-------------------------------------------------------------- +static void KodiController$resumeAnimation(KodiController* self, SEL _cmd) +{ + NSLog(@"%s", __PRETTY_FUNCTION__); + + XBMC_Event newEvent; + memset(&newEvent, 0, sizeof(XBMC_Event)); + + newEvent.appcommand.type = XBMC_APPCOMMAND; + newEvent.appcommand.action = ACTION_PLAYER_PLAY; + CWinEvents::MessagePush(&newEvent); + + [[self glView] resumeAnimation]; +} +//-------------------------------------------------------------- +static void KodiController$startAnimation(KodiController* self, SEL _cmd) +{ + NSLog(@"%s", __PRETTY_FUNCTION__); + + [[self glView] startAnimation]; +} +//-------------------------------------------------------------- +static void KodiController$stopAnimation(KodiController* self, SEL _cmd) +{ + NSLog(@"%s", __PRETTY_FUNCTION__); + + [[self glView] stopAnimation]; +} +//-------------------------------------------------------------- +static bool KodiController$changeScreen(KodiController* self, SEL _cmd, unsigned int screenIdx, UIScreenMode * mode) +{ + return [[IOSScreenManager sharedInstance] changeScreen: screenIdx withMode: mode]; +} +//-------------------------------------------------------------- +static void KodiController$activateScreen(KodiController* self, SEL _cmd, UIScreen * screen, UIInterfaceOrientation newOrientation) +{ +} + +// SECTIONCOMMENT +// c'tor - this sets up our class at runtime by +// 1. subclassing from the base classes +// 2. adding new methods to our class +// 3. exchanging (hooking) base class methods with ours +// 4. register the classes to the objc runtime system +static __attribute__((constructor)) void initControllerRuntimeClasses() +{ + char _typeEncoding[1024]; + unsigned int i = 0; + + // subclass BRController into KodiController + Class KodiControllerCls = objc_allocateClassPair(objc_getClass("BRController"), "KodiController", 0); + // add our custom methods which are not part of the baseclass + // KodiController::keyTimer + class_addMethod(KodiControllerCls, @selector(keyTimer), (IMP)&KodiController$keyTimer, "@@:"); + // KodiController::setKeyTimer + class_addMethod(KodiControllerCls, @selector(setKeyTimer:), (IMP)&KodiController$setKeyTimer, "v@:@"); + // KodiController::glView + class_addMethod(KodiControllerCls, @selector(glView), (IMP)&KodiController$glView, "@@:"); + // KodiController::setGlView + class_addMethod(KodiControllerCls, @selector(setGlView:), (IMP)&KodiController$setGlView, "v@:@"); + // KodiController::systemScreenSaverTimeout + class_addMethod(KodiControllerCls, @selector(systemScreenSaverTimeout), (IMP)&KodiController$systemScreenSaverTimeout, "@@:"); + // KodiController::setSystemScreenSaverTimeout + class_addMethod(KodiControllerCls, @selector(setSystemScreenSaverTimeout:), (IMP)&KodiController$setSystemScreenSaverTimeout, "v@:@"); + // KodiController::systemSleepTimeout + class_addMethod(KodiControllerCls, @selector(systemSleepTimeout), (IMP)&KodiController$systemSleepTimeout, "@@:"); + // KodiController::setSystemSleepTimeout + class_addMethod(KodiControllerCls, @selector(setSystemSleepTimeout:), (IMP)&KodiController$setSystemSleepTimeout, "v@:@"); + // KodiController::applicationDidExit + class_addMethod(KodiControllerCls, @selector(applicationDidExit), (IMP)&KodiController$applicationDidExit, "v@:"); + // KodiController::initDisplayLink + class_addMethod(KodiControllerCls, @selector(initDisplayLink), (IMP)&KodiController$initDisplayLink, "v@:"); + // KodiController::deinitDisplayLink + class_addMethod(KodiControllerCls, @selector(deinitDisplayLink), (IMP)&KodiController$deinitDisplayLink, "v@:"); + // KodiController::setFramebuffer + class_addMethod(KodiControllerCls, @selector(setFramebuffer), (IMP)&KodiController$setFramebuffer, "v@:"); + // KodiController::presentFramebuffer + class_addMethod(KodiControllerCls, @selector(presentFramebuffer), (IMP)&KodiController$presentFramebuffer, "B@:"); + // KodiController::setUserEvent + class_addMethod(KodiControllerCls, @selector(setUserEvent:withHoldTime:), (IMP)&KodiController$setUserEvent, "v@:iI"); + // KodiController::appleModKeyToXbmcModKey + class_addMethod(KodiControllerCls, @selector(appleModKeyToXbmcModKey:), (IMP)&KodiController$appleModKeyToXbmcModKey, "I@:I"); + // KodiController::startKeyPressTimer + class_addMethod(KodiControllerCls, @selector(startKeyPressTimer:), (IMP)&KodiController$startKeyPressTimer, "v@:i"); + // KodiController::stopKeyPressTimer + class_addMethod(KodiControllerCls, @selector(stopKeyPressTimer), (IMP)&KodiController$stopKeyPressTimer, "v@:"); + // KodiController::disableSystemSleep + class_addMethod(KodiControllerCls, @selector(disableSystemSleep), (IMP)&KodiController$disableSystemSleep, "v@:"); + // KodiController__enableSystemSleep + class_addMethod(KodiControllerCls, @selector(enableSystemSleep), (IMP)&KodiController$enableSystemSleep, "v@:"); + // KodiController::disableScreenSaver + class_addMethod(KodiControllerCls, @selector(disableScreenSaver), (IMP)&KodiController$disableScreenSaver, "v@:"); + // KodiController::enableScreenSaver + class_addMethod(KodiControllerCls, @selector(enableScreenSaver), (IMP)&KodiController$enableScreenSaver, "v@:"); + // KodiController::pauseAnimation + class_addMethod(KodiControllerCls, @selector(pauseAnimation), (IMP)&KodiController$pauseAnimation, "v@:"); + // KodiController::resumeAnimation + class_addMethod(KodiControllerCls, @selector(resumeAnimation), (IMP)&KodiController$resumeAnimation, "v@:"); + // KodiController::startAnimation + class_addMethod(KodiControllerCls, @selector(startAnimation), (IMP)&KodiController$startAnimation, "v@:"); + // KodiController::stopAnimation + class_addMethod(KodiControllerCls, @selector(stopAnimation), (IMP)&KodiController$stopAnimation, "v@:"); + + i = 0; + memcpy(_typeEncoding + i, @encode(CGSize), strlen(@encode(CGSize))); + i += strlen(@encode(CGSize)); + _typeEncoding[i] = '@'; + i += 1; + _typeEncoding[i] = ':'; + i += 1; + _typeEncoding[i] = '\0'; + // KodiController::getScreenSize + class_addMethod(KodiControllerCls, @selector(getScreenSize), (IMP)&KodiController$getScreenSize, _typeEncoding); + + i = 0; + _typeEncoding[i] = 'v'; + i += 1; + _typeEncoding[i] = '@'; + i += 1; + _typeEncoding[i] = ':'; + i += 1; + memcpy(_typeEncoding + i, @encode(XBMCKey), strlen(@encode(XBMCKey))); + i += strlen(@encode(XBMCKey)); + _typeEncoding[i] = '\0'; + // KodiController::sendKey + class_addMethod(KodiControllerCls, @selector(sendKey:), (IMP)&KodiController$sendKey, _typeEncoding); + + i = 0; + _typeEncoding[i] = 'v'; + i += 1; + _typeEncoding[i] = '@'; + i += 1; + _typeEncoding[i] = ':'; + i += 1; + memcpy(_typeEncoding + i, @encode(BREvent*), strlen(@encode(BREvent*))); + i += strlen(@encode(BREvent*)); + _typeEncoding[i] = '^'; + _typeEncoding[i + 1] = 'B'; + i += 2; + _typeEncoding[i] = '^'; + _typeEncoding[i + 1] = 'B'; + i += 2; + _typeEncoding[i] = '^'; + _typeEncoding[i + 1] = 'i'; + i += 2; + _typeEncoding[i] = '\0'; + // KodiController::ATVClientEventFromBREvent + class_addMethod(KodiControllerCls, @selector(ATVClientEventFromBREvent:Repeatable:ButtonState:Result:), (IMP)&KodiController$ATVClientEventFromBREvent, _typeEncoding); + + i = 0; + _typeEncoding[i] = 'v'; + i += 1; + _typeEncoding[i] = '@'; + i += 1; + _typeEncoding[i] = ':'; + i += 1; + memcpy(_typeEncoding + i, @encode(NSTimer*), strlen(@encode(NSTimer*))); + i += strlen(@encode(NSTimer*)); + _typeEncoding[i] = '\0'; + // KodiController::keyPressTimerCallback + class_addMethod(KodiControllerCls, @selector(keyPressTimerCallback:), (IMP)&KodiController$keyPressTimerCallback, _typeEncoding); + + i = 0; + _typeEncoding[i] = 'v'; + i += 1; + _typeEncoding[i] = '@'; + i += 1; + _typeEncoding[i] = ':'; + i += 1; + memcpy(_typeEncoding + i, @encode(NSNotification *), strlen(@encode(NSNotification *))); + i += strlen(@encode(NSNotification *)); + _typeEncoding[i] = '\0'; + // KodiController:observeDefaultCenterStuff + class_addMethod(KodiControllerCls, @selector(observeDefaultCenterStuff:), (IMP)&KodiController$observeDefaultCenterStuff, _typeEncoding); + + i = 0; + _typeEncoding[i] = 'B'; + i += 1; + _typeEncoding[i] = '@'; + i += 1; + _typeEncoding[i] = ':'; + i += 1; + _typeEncoding[i] = 'I'; + i += 1; + memcpy(_typeEncoding + i, @encode(UIScreenMode *), strlen(@encode(UIScreenMode *))); + i += strlen(@encode(UIScreenMode *)); + _typeEncoding[i] = '\0'; + // KodiController::changeScreen + class_addMethod(KodiControllerCls, @selector(changeScreen:withMode:), (IMP)&KodiController$changeScreen, _typeEncoding); + + i = 0; + _typeEncoding[i] = 'v'; + i += 1; + _typeEncoding[i] = '@'; + i += 1; + _typeEncoding[i] = ':'; + i += 1; + memcpy(_typeEncoding + i, @encode(UIScreen *), strlen(@encode(UIScreen *))); + i += strlen(@encode(UIScreen *)); + _typeEncoding[i] = 'I'; + i += 1; + _typeEncoding[i] = '\0'; + // KodiController::activateScreen$ + class_addMethod(KodiControllerCls, @selector(activateScreen:withOrientation:), (IMP)&KodiController$activateScreen, _typeEncoding); + + // and hook up our methods (implementation of the base class methods) + // KodiController::brEventAction + MSHookMessageEx(KodiControllerCls, @selector(brEventAction:), (IMP)&KodiController$brEventAction, (IMP*)&KodiController$brEventAction$Orig); + // KodiController::init + MSHookMessageEx(KodiControllerCls, @selector(init), (IMP)&KodiController$init, (IMP*)&KodiController$init$Orig); + // KodiController::dealloc + MSHookMessageEx(KodiControllerCls, @selector(dealloc), (IMP)&KodiController$dealloc, (IMP*)&KodiController$dealloc$Orig); + // KodiController::controlWasActivated + MSHookMessageEx(KodiControllerCls, @selector(controlWasActivated), (IMP)&KodiController$controlWasActivated, (IMP*)&KodiController$controlWasActivated$Orig); + // KodiController::controlWasDeactivated + MSHookMessageEx(KodiControllerCls, @selector(controlWasDeactivated), (IMP)&KodiController$controlWasDeactivated, (IMP*)&KodiController$controlWasDeactivated$Orig); + // KodiController::recreateOnReselect + MSHookMessageEx(KodiControllerCls, @selector(recreateOnReselect), (IMP)&KodiController$recreateOnReselect, nil); + + // and register the class to the runtime + objc_registerClassPair(KodiControllerCls); + + // save this as static for referencing it in multiple methods + BRWindowCls = objc_getClass("BRWindow"); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/substrate.h kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/substrate.h --- kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/substrate.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/substrate.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2008-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ +#include +#include +#include +#ifdef __cplusplus +#define _default(x) = x +extern "C" { +#else +#define _default(x) +#endif +typedef const void *MSImageRef; +void MSHookFunction(void *symbol, void *replace, void **result); +void *MSFindSymbol(const void *image, const char *name); +MSImageRef MSGetImageByName(const char *file); + +#ifdef __APPLE__ +#ifdef __arm__ +IMP MSHookMessage(Class _class, SEL sel, IMP imp, const char *prefix _default(NULL)); +#endif +void MSHookMessageEx(Class _class, SEL sel, IMP imp, IMP *result); +#endif +#ifdef __cplusplus +} +#endif + +template Type_ &MSHookIvar(id self, const char *name) { + Ivar ivar(class_getInstanceVariable(object_getClass(self), name)); + void *pointer(ivar == NULL ? NULL : reinterpret_cast(self) + ivar_getOffset(ivar)); + return *reinterpret_cast(pointer); +} + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/XBMCATV2-Info.plist.in kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/XBMCATV2-Info.plist.in --- kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/XBMCATV2-Info.plist.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/XBMCATV2-Info.plist.in 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,46 @@ + + + + + CFBundleName + @APP_NAME@ + DTXcode + 0324 + FRApplianceDataSourceType + All + CFBundleExecutable + @APP_NAME@ + CFBundleIdentifier + com.apple.frontrow.appliance.@APP_NAME_LC@ + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + fnrw + CFBundleSupportedPlatforms + + iPhoneOS + + CFBundleVersion + 1.0 + DTPlatformName + iphoneos + DTSDKName + iphoneos4.1 + FRAppliancePreferedOrderValue + 2 + FRHideIfNoCategories + + FRRemoteAppliance + + LSRequiresIPhoneOS + 1 + MinimumOSVersion + 4.1 + NSPrincipalClass + KodiAppliance + FRApplianceName + @APP_NAME@ + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/XBMCDebugHelpers.h kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/XBMCDebugHelpers.h --- kodi-16.1~git20160425.1001-final/xbmc/osx/atv2/XBMCDebugHelpers.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/atv2/XBMCDebugHelpers.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,46 @@ +/* + * XBMCDebugHelpers.h + * xbmclauncher + * + * Created by Stephan Diederich on 21.09.08. + * Copyright 2008 University Heidelberg. All rights reserved. + * + * Copyright (C) 2008-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + * Stuff below was taken from LoggingUtils.h of ATVFiles + * + * Just some utility macros for logging... + * + * Created by Eric Steil III on 4/1/07. + * Copyright (C) 2007-2008 Eric Steil III + * + */ +#define DEBUG +#ifdef DEBUG +#define LOG(s, ...) NSLog(@"[DEBUG] " s, ##__VA_ARGS__) +#define ILOG(s, ...) NSLog(@"[INFO] " s, ##__VA_ARGS__) +#define ELOG(s, ...) NSLog(@"[ERROR] " s, ##__VA_ARGS__) +#define DLOG(s, ...) LOG(s, ##__VA_ARGS__) +#else +#define LOG(s, ...) +#define ILOG(s, ...) NSLog(@"[INFO] " s, ##__VA_ARGS__) +#define ELOG(s, ...) NSLog(@"[ERROR] " s, ##__VA_ARGS__) +#define DLOG(s, ...) LOG(s, ##__VA_ARGS__) +#endif + +#define PRINT_SIGNATURE() LOG(@"%s", __PRETTY_FUNCTION__) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/CocoaInterface.h kodi-15.2~git20151019.1039-final/xbmc/osx/CocoaInterface.h --- kodi-16.1~git20160425.1001-final/xbmc/osx/CocoaInterface.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/CocoaInterface.h 2015-10-19 08:39:16.000000000 +0000 @@ -57,8 +57,13 @@ // Version. // bool Cocoa_GPUForDisplayIsNvidiaPureVideo3(); + int Cocoa_GetOSVersion(); - const char *Cocoa_Paste() ; + + void Cocoa_MakeChildWindow(); + void Cocoa_DestroyChildWindow(); + + const char *Cocoa_Paste() ; #ifdef __cplusplus } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/CocoaInterface.mm kodi-15.2~git20151019.1039-final/xbmc/osx/CocoaInterface.mm --- kodi-16.1~git20160425.1001-final/xbmc/osx/CocoaInterface.mm 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/CocoaInterface.mm 2015-10-19 08:39:16.000000000 +0000 @@ -41,6 +41,9 @@ #import "AutoPool.h" +// hack for Cocoa_GL_ResizeWindow +//extern "C" void SDL_SetWidthHeight(int w, int h); + //#define MAX_DISPLAYS 32 //static NSWindow* blankingWindows[MAX_DISPLAYS]; @@ -243,6 +246,7 @@ NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithData:[icon TIFFRepresentation]]; NSData* png = [rep representationUsingType:NSPNGFileType properties:nil]; [png writeToFile:pngFile atomically:YES]; + [png release]; [rep release]; [icon release]; } @@ -400,7 +404,50 @@ return(result); } -const char *Cocoa_Paste() +int Cocoa_GetOSVersion() +{ + static SInt32 version = -1; + + if (version == -1) + Gestalt(gestaltSystemVersion, &version); + + return(version); +} + + +NSWindow* childWindow = nil; +NSWindow* mainWindow = nil; + + +void Cocoa_MakeChildWindow() +{ + NSOpenGLContext* context = Cocoa_GL_GetCurrentContext(); + NSView* view = [context view]; + NSWindow* window = [view window]; + + // Create a child window. + childWindow = [[NSWindow alloc] initWithContentRect:[window frame] + styleMask:NSBorderlessWindowMask + backing:NSBackingStoreBuffered + defer:NO]; + + [childWindow setContentSize:[view frame].size]; + [childWindow setBackgroundColor:[NSColor blackColor]]; + [window addChildWindow:childWindow ordered:NSWindowAbove]; + mainWindow = window; + //childWindow.alphaValue = 0.5; +} + +void Cocoa_DestroyChildWindow() +{ + if (childWindow != nil) + { + [mainWindow removeChildWindow:childWindow]; + [childWindow close]; + childWindow = nil; + } +} +const char *Cocoa_Paste() { NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; NSString *type = [pasteboard availableTypeFromArray:[NSArray arrayWithObject:NSStringPboardType]]; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/DarwinUtils.h kodi-15.2~git20151019.1039-final/xbmc/osx/DarwinUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/osx/DarwinUtils.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/DarwinUtils.h 2015-10-19 08:39:16.000000000 +0000 @@ -31,11 +31,11 @@ { public: static const char *getIosPlatformString(void); + static bool IsAppleTV2(void); static bool IsMavericks(void); static bool IsLion(void); static bool IsSnowLeopard(void); static bool DeviceHasRetina(double &scale); - static bool DeviceHasLeakyVDA(void); static const char *GetOSReleaseString(void); static const char *GetOSVersionString(void); static float GetIOSVersion(void); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/DarwinUtils.mm kodi-15.2~git20151019.1039-final/xbmc/osx/DarwinUtils.mm --- kodi-16.1~git20160425.1001-final/xbmc/osx/DarwinUtils.mm 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/DarwinUtils.mm 2015-10-19 08:39:16.000000000 +0000 @@ -53,11 +53,6 @@ #define NSAppKitVersionNumber10_6 1038 #endif -#ifndef NSAppKitVersionNumber10_9 -#define NSAppKitVersionNumber10_9 1265 -#endif - - enum iosPlatform { iDeviceUnknown = -1, @@ -188,6 +183,18 @@ return eDev; } +bool CDarwinUtils::IsAppleTV2(void) +{ + static enum iosPlatform platform = iDeviceUnknown; +#if defined(TARGET_DARWIN_IOS) + if( platform == iDeviceUnknown ) + { + platform = getIosPlatform(); + } +#endif + return (platform == AppleTV2); +} + bool CDarwinUtils::IsMavericks(void) { static int isMavericks = -1; @@ -258,16 +265,6 @@ return (platform >= iPhone4); } -bool CDarwinUtils::DeviceHasLeakyVDA(void) -{ - static int hasLeakyVDA = -1; -#if defined(TARGET_DARWIN_OSX) - if (hasLeakyVDA == -1) - hasLeakyVDA = NSAppKitVersionNumber <= NSAppKitVersionNumber10_9 ? 1 : 0; -#endif - return hasLeakyVDA == 1; -} - const char *CDarwinUtils::GetOSReleaseString(void) { static std::string osreleaseStr; @@ -343,7 +340,18 @@ path[0] = 0; *pathsize = 0; - // 1) Kodi application running under IOS + // a) Kodi frappliance running under ATV2 + Class Frapp = NSClassFromString(@"AppATV2Detector"); + if (Frapp != NULL) + { + pathname = [[NSBundle bundleForClass:Frapp] pathForResource:@"Frameworks" ofType:@""]; + strcpy(path, [pathname UTF8String]); + *pathsize = strlen(path); + //CLog::Log(LOGDEBUG, "DarwinFrameworkPath(a) -> %s", path); + return 0; + } + + // b) Kodi application running under IOS pathname = [[NSBundle mainBundle] executablePath]; std::string appName = std::string(CCompileInfo::GetAppName()) + ".app/" + std::string(CCompileInfo::GetAppName()); if (pathname && strstr([pathname UTF8String], appName.c_str())) @@ -358,7 +366,7 @@ return 0; } - // 2) Kodi application running under OSX + // d) Kodi application running under OSX pathname = [[NSBundle mainBundle] executablePath]; if (pathname && strstr([pathname UTF8String], "Contents")) { @@ -400,8 +408,20 @@ // see if we can figure out who we are NSString *pathname; - // 1) Kodi application running under IOS - // 2) Kodi application running under OSX + // a) Kodi frappliance running under ATV2 + Class Frapp = NSClassFromString(@"AppATV2Detector"); + if (Frapp != NULL) + { + NSString *appName = [NSString stringWithUTF8String:CCompileInfo::GetAppName()]; + pathname = [[NSBundle bundleForClass:Frapp] pathForResource:appName ofType:@""]; + strcpy(path, [pathname UTF8String]); + *pathsize = strlen(path); + //CLog::Log(LOGDEBUG, "DarwinExecutablePath(a) -> %s", path); + return 0; + } + + // b) Kodi application running under IOS + // c) Kodi application running under OSX pathname = [[NSBundle mainBundle] executablePath]; strcpy(path, [pathname UTF8String]); *pathsize = strlen(path); @@ -450,14 +470,6 @@ { ret = 1; } - - // since ios8 the sandbox filesystem has moved to container approach - // we are also sandboxed if this is our bundle path - if (strlen("/var/mobile/Containers/Bundle/") < path_size && - strncmp(given_path, "/var/mobile/Containers/Bundle/", strlen("/var/mobile/Containers/Bundle/")) == 0) - { - ret = 1; - } } } return ret == 1; @@ -469,6 +481,13 @@ if (DecoderAvailable == -1) { + Class XBMCfrapp = NSClassFromString(@"AppATV2Detector"); + if (XBMCfrapp != NULL) + { + // atv2 has seatbelt profile key removed so nothing to do here + DecoderAvailable = 1; + } + else { /* When XBMC is started from a sandbox directory we have to check the sysctl values */ if (IsIosSandboxed()) @@ -505,7 +524,8 @@ { float batteryLevel = 0; #if defined(TARGET_DARWIN_IOS) - batteryLevel = [[UIDevice currentDevice] batteryLevel]; + if(!IsAppleTV2()) + batteryLevel = [[UIDevice currentDevice] batteryLevel]; #else CFTypeRef powerSourceInfo = IOPSCopyPowerSourcesInfo(); CFArrayRef powerSources = IOPSCopyPowerSourcesList(powerSourceInfo); @@ -531,8 +551,6 @@ batteryLevel = (double)curLevel/(double)maxLevel; } - CFRelease(powerSources); - CFRelease(powerSourceInfo); #endif return batteryLevel * 100; } @@ -543,7 +561,7 @@ struct sched_param param; pthread_t this_pthread_self = pthread_self(); - pthread_getschedparam(this_pthread_self, &policy, ¶m ); + int32_t result = pthread_getschedparam(this_pthread_self, &policy, ¶m ); policy = SCHED_OTHER; thread_extended_policy_data_t theFixedPolicy={true}; @@ -554,12 +572,12 @@ theFixedPolicy.timeshare = false; } - thread_policy_set(pthread_mach_thread_np(this_pthread_self), + result = thread_policy_set(pthread_mach_thread_np(this_pthread_self), THREAD_EXTENDED_POLICY, (thread_policy_t)&theFixedPolicy, THREAD_EXTENDED_POLICY_COUNT); - pthread_setschedparam(this_pthread_self, policy, ¶m ); + result = pthread_setschedparam(this_pthread_self, policy, ¶m ); } bool CFStringRefToStringWithEncoding(CFStringRef source, std::string &destination, CFStringEncoding encoding) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/ios/XBMCController.mm kodi-15.2~git20151019.1039-final/xbmc/osx/ios/XBMCController.mm --- kodi-16.1~git20160425.1001-final/xbmc/osx/ios/XBMCController.mm 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/ios/XBMCController.mm 2015-10-19 08:39:16.000000000 +0000 @@ -31,7 +31,7 @@ #include "MusicInfoTag.h" #include "SpecialProtocol.h" #include "PlayList.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "Application.h" #include "interfaces/AnnouncementManager.h" #include "input/touch/generic/GenericTouchActionHandler.h" @@ -50,8 +50,6 @@ #include #include "osx/DarwinUtils.h" -using namespace KODI::MESSAGING; - #ifndef M_PI #define M_PI 3.1415926535897932384626433832795028842 #endif @@ -149,7 +147,7 @@ if (!thumb.empty()) { bool needsRecaching; - std::string cachedThumb(CTextureCache::GetInstance().CheckCachedImage(thumb, false, needsRecaching)); + std::string cachedThumb(CTextureCache::Get().CheckCachedImage(thumb, false, needsRecaching)); LOG("thumb: %s, %s", thumb.c_str(), cachedThumb.c_str()); if (!cachedThumb.empty()) { @@ -214,12 +212,12 @@ { if (NULL==g_announceReceiver) { g_announceReceiver = new AnnounceReceiver(); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().AddAnnouncer(g_announceReceiver); + ANNOUNCEMENT::CAnnouncementManager::Get().AddAnnouncer(g_announceReceiver); } } static void dealloc() { - ANNOUNCEMENT::CAnnouncementManager::GetInstance().RemoveAnnouncer(g_announceReceiver); + ANNOUNCEMENT::CAnnouncementManager::Get().RemoveAnnouncer(g_announceReceiver); delete g_announceReceiver; } private: @@ -385,46 +383,32 @@ return NO; } //-------------------------------------------------------------- -- (void)addSwipeGesture:(UISwipeGestureRecognizerDirection)direction numTouches : (NSUInteger)numTouches -{ - UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] - initWithTarget:self action:@selector(handleSwipe:)]; - - swipe.delaysTouchesBegan = NO; - swipe.numberOfTouchesRequired = numTouches; - swipe.direction = direction; - swipe.delegate = self; - [m_glView addGestureRecognizer:swipe]; - [swipe release]; -} -//-------------------------------------------------------------- -- (void)addTapGesture:(NSUInteger)numTouches -{ - UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] - initWithTarget:self action:@selector(handleTap:)]; - - tapGesture.delaysTouchesBegan = NO; - tapGesture.numberOfTapsRequired = 1; - tapGesture.numberOfTouchesRequired = numTouches; - - [m_glView addGestureRecognizer:tapGesture]; - [tapGesture release]; -} -//-------------------------------------------------------------- - (void)createGestureRecognizers { - //1 finger single tap - [self addTapGesture:1]; + //1 finger single tab + UITapGestureRecognizer *singleFingerSingleTap = [[UITapGestureRecognizer alloc] + initWithTarget:self action:@selector(handleSingleFingerSingleTap:)]; + + singleFingerSingleTap.delaysTouchesBegan = NO; + singleFingerSingleTap.numberOfTapsRequired = 1; + singleFingerSingleTap.numberOfTouchesRequired = 1; + + [m_glView addGestureRecognizer:singleFingerSingleTap]; + [singleFingerSingleTap release]; - //2 finger single tap - right mouse - //single finger double tap delays single finger single tap - so we + //2 finger single tab - right mouse + //single finger double tab delays single finger single tab - so we //go for 2 fingers here - so single finger single tap is instant - [self addTapGesture:2]; + UITapGestureRecognizer *doubleFingerSingleTap = [[UITapGestureRecognizer alloc] + initWithTarget:self action:@selector(handleDoubleFingerSingleTap:)]; - //3 finger single tap - [self addTapGesture:3]; + doubleFingerSingleTap.delaysTouchesBegan = NO; + doubleFingerSingleTap.numberOfTapsRequired = 1; + doubleFingerSingleTap.numberOfTouchesRequired = 2; + [m_glView addGestureRecognizer:doubleFingerSingleTap]; + [doubleFingerSingleTap release]; - //1 finger single long tap - right mouse - alernative + //1 finger single long tab - right mouse - alernative UILongPressGestureRecognizer *singleFingerSingleLongTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleFingerSingleLongTap:)]; @@ -433,42 +417,61 @@ [m_glView addGestureRecognizer:singleFingerSingleLongTap]; [singleFingerSingleLongTap release]; - //triple finger swipe left - [self addSwipeGesture:UISwipeGestureRecognizerDirectionLeft numTouches:3]; - //double finger swipe left for backspace ... i like this fast backspace feature ;) - [self addSwipeGesture:UISwipeGestureRecognizerDirectionLeft numTouches:2]; - - //single finger swipe left - [self addSwipeGesture:UISwipeGestureRecognizerDirectionLeft numTouches:1]; + UISwipeGestureRecognizer *swipeLeft2 = [[UISwipeGestureRecognizer alloc] + initWithTarget:self action:@selector(handleSwipe:)]; - //triple finger swipe right - [self addSwipeGesture:UISwipeGestureRecognizerDirectionRight numTouches:3]; + swipeLeft2.delaysTouchesBegan = NO; + swipeLeft2.numberOfTouchesRequired = 2; + swipeLeft2.direction = UISwipeGestureRecognizerDirectionLeft; + swipeLeft2.delegate = self; + [m_glView addGestureRecognizer:swipeLeft2]; + [swipeLeft2 release]; - //double finger swipe right - [self addSwipeGesture:UISwipeGestureRecognizerDirectionRight numTouches:2]; + //single finger swipe left + UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] + initWithTarget:self action:@selector(handleSwipe:)]; + swipeLeft.delaysTouchesBegan = NO; + swipeLeft.numberOfTouchesRequired = 1; + swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; + swipeLeft.delegate = self; + [m_glView addGestureRecognizer:swipeLeft]; + [swipeLeft release]; + //single finger swipe right - [self addSwipeGesture:UISwipeGestureRecognizerDirectionRight numTouches:1]; - - //triple finger swipe up - [self addSwipeGesture:UISwipeGestureRecognizerDirectionUp numTouches:3]; - - //double finger swipe up - [self addSwipeGesture:UISwipeGestureRecognizerDirectionUp numTouches:2]; - + UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] + initWithTarget:self action:@selector(handleSwipe:)]; + + swipeRight.delaysTouchesBegan = NO; + swipeRight.numberOfTouchesRequired = 1; + swipeRight.direction = UISwipeGestureRecognizerDirectionRight; + swipeRight.delegate = self; + [m_glView addGestureRecognizer:swipeRight]; + [swipeRight release]; + //single finger swipe up - [self addSwipeGesture:UISwipeGestureRecognizerDirectionUp numTouches:1]; - - //triple finger swipe down - [self addSwipeGesture:UISwipeGestureRecognizerDirectionDown numTouches:3]; - - //double finger swipe down - [self addSwipeGesture:UISwipeGestureRecognizerDirectionDown numTouches:2]; + UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] + initWithTarget:self action:@selector(handleSwipe:)]; + + swipeUp.delaysTouchesBegan = NO; + swipeUp.numberOfTouchesRequired = 1; + swipeUp.direction = UISwipeGestureRecognizerDirectionUp; + swipeUp.delegate = self; + [m_glView addGestureRecognizer:swipeUp]; + [swipeUp release]; //single finger swipe down - [self addSwipeGesture:UISwipeGestureRecognizerDirectionDown numTouches:1]; - + UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc] + initWithTarget:self action:@selector(handleSwipe:)]; + + swipeDown.delaysTouchesBegan = NO; + swipeDown.numberOfTouchesRequired = 1; + swipeDown.direction = UISwipeGestureRecognizerDirectionDown; + swipeDown.delegate = self; + [m_glView addGestureRecognizer:swipeDown]; + [swipeDown release]; + //for pan gestures with one finger UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; @@ -518,7 +521,7 @@ CGPoint point = [touch locationInView:m_glView]; point.x *= screenScale; point.y *= screenScale; - CGenericTouchActionHandler::GetInstance().OnSingleTouchStart(point.x, point.y); + CGenericTouchActionHandler::Get().OnSingleTouchStart(point.x, point.y); } } //-------------------------------------------------------------- @@ -533,14 +536,14 @@ switch(sender.state) { case UIGestureRecognizerStateBegan: - CGenericTouchActionHandler::GetInstance().OnTouchGestureStart(point.x, point.y); + CGenericTouchActionHandler::Get().OnTouchGestureStart(point.x, point.y); break; case UIGestureRecognizerStateChanged: - CGenericTouchActionHandler::GetInstance().OnZoomPinch(point.x, point.y, [sender scale]); + CGenericTouchActionHandler::Get().OnZoomPinch(point.x, point.y, [sender scale]); break; case UIGestureRecognizerStateEnded: case UIGestureRecognizerStateCancelled: - CGenericTouchActionHandler::GetInstance().OnTouchGestureEnd(point.x, point.y, 0, 0, 0, 0); + CGenericTouchActionHandler::Get().OnTouchGestureEnd(point.x, point.y, 0, 0, 0, 0); break; default: break; @@ -559,13 +562,13 @@ switch(sender.state) { case UIGestureRecognizerStateBegan: - CGenericTouchActionHandler::GetInstance().OnTouchGestureStart(point.x, point.y); + CGenericTouchActionHandler::Get().OnTouchGestureStart(point.x, point.y); break; case UIGestureRecognizerStateChanged: - CGenericTouchActionHandler::GetInstance().OnRotate(point.x, point.y, RADIANS_TO_DEGREES([sender rotation])); + CGenericTouchActionHandler::Get().OnRotate(point.x, point.y, RADIANS_TO_DEGREES([sender rotation])); break; case UIGestureRecognizerStateEnded: - CGenericTouchActionHandler::GetInstance().OnTouchGestureEnd(point.x, point.y, 0, 0, 0, 0); + CGenericTouchActionHandler::Get().OnTouchGestureEnd(point.x, point.y, 0, 0, 0, 0); break; default: break; @@ -611,11 +614,11 @@ { if( !touchBeginSignaled ) { - CGenericTouchActionHandler::GetInstance().OnTouchGestureStart((float)point.x, (float)point.y); + CGenericTouchActionHandler::Get().OnTouchGestureStart((float)point.x, (float)point.y); touchBeginSignaled = true; } - CGenericTouchActionHandler::GetInstance().OnTouchGesturePan((float)point.x, (float)point.y, + CGenericTouchActionHandler::Get().OnTouchGesturePan((float)point.x, (float)point.y, (float)xMovement, (float)yMovement, (float)velocity.x, (float)velocity.y); lastGesturePoint = point; @@ -625,7 +628,7 @@ if( touchBeginSignaled && ([sender state] == UIGestureRecognizerStateEnded || [sender state] == UIGestureRecognizerStateCancelled)) { //signal end of pan - this will start inertial scrolling with deacceleration in CApplication - CGenericTouchActionHandler::GetInstance().OnTouchGestureEnd((float)lastGesturePoint.x, (float)lastGesturePoint.y, + CGenericTouchActionHandler::Get().OnTouchGestureEnd((float)lastGesturePoint.x, (float)lastGesturePoint.y, (float)0.0, (float)0.0, (float)velocity.x, (float)velocity.y); @@ -662,7 +665,7 @@ direction = TouchMoveDirectionDown; break; } - CGenericTouchActionHandler::GetInstance().OnSwipe(direction, + CGenericTouchActionHandler::Get().OnSwipe(direction, 0.0, 0.0, point.x, point.y, 0, 0, [sender numberOfTouches]); @@ -670,17 +673,29 @@ } } //-------------------------------------------------------------- -- (IBAction)handleTap:(UIGestureRecognizer *)sender +- (IBAction)handleSingleFingerSingleTap:(UIGestureRecognizer *)sender { //Allow the tap gesture during init //(for allowing the user to tap away any messagboxes during init) - if( ([m_glView isReadyToRun] && [sender numberOfTouches] == 1) || [m_glView isXBMCAlive]) + if( [m_glView isReadyToRun] ) { CGPoint point = [sender locationOfTouch:0 inView:m_glView]; point.x *= screenScale; point.y *= screenScale; //NSLog(@"%s singleTap", __PRETTY_FUNCTION__); - CGenericTouchActionHandler::GetInstance().OnTap((float)point.x, (float)point.y, [sender numberOfTouches]); + CGenericTouchActionHandler::Get().OnTap((float)point.x, (float)point.y, [sender numberOfTouches]); + } +} +//-------------------------------------------------------------- +- (IBAction)handleDoubleFingerSingleTap:(UIGestureRecognizer *)sender +{ + if( [m_glView isXBMCAlive] )//NO GESTURES BEFORE WE ARE UP AND RUNNING + { + CGPoint point = [sender locationOfTouch:0 inView:m_glView]; + point.x *= screenScale; + point.y *= screenScale; + //NSLog(@"%s toubleTap", __PRETTY_FUNCTION__); + CGenericTouchActionHandler::Get().OnTap((float)point.x, (float)point.y, [sender numberOfTouches]); } } //-------------------------------------------------------------- @@ -696,17 +711,17 @@ { lastGesturePoint = point; // mark the control - //CGenericTouchActionHandler::GetInstance().OnSingleTouchStart((float)point.x, (float)point.y); + //CGenericTouchActionHandler::Get().OnSingleTouchStart((float)point.x, (float)point.y); } if (sender.state == UIGestureRecognizerStateEnded) { - CGenericTouchActionHandler::GetInstance().OnSingleTouchMove((float)point.x, (float)point.y, point.x - lastGesturePoint.x, point.y - lastGesturePoint.y, 0, 0); + CGenericTouchActionHandler::Get().OnSingleTouchMove((float)point.x, (float)point.y, point.x - lastGesturePoint.x, point.y - lastGesturePoint.y, 0, 0); } if (sender.state == UIGestureRecognizerStateEnded) { - CGenericTouchActionHandler::GetInstance().OnLongPress((float)point.x, (float)point.y); + CGenericTouchActionHandler::Get().OnLongPress((float)point.x, (float)point.y); } } } @@ -1006,36 +1021,36 @@ switch (receivedEvent.subtype) { case UIEventSubtypeRemoteControlTogglePlayPause: - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_PLAYER_PLAYPAUSE))); + CApplicationMessenger::Get().SendAction(ACTION_PLAYER_PLAYPAUSE); break; case UIEventSubtypeRemoteControlPlay: - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_PLAYER_PLAY))); + CApplicationMessenger::Get().SendAction(ACTION_PLAYER_PLAY); break; case UIEventSubtypeRemoteControlPause: // ACTION_PAUSE sometimes cause unpause, use MediaPauseIfPlaying to make sure pause only - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE_IF_PLAYING); + CApplicationMessenger::Get().MediaPauseIfPlaying(); break; case UIEventSubtypeRemoteControlNextTrack: - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_NEXT_ITEM))); + CApplicationMessenger::Get().SendAction(ACTION_NEXT_ITEM); break; case UIEventSubtypeRemoteControlPreviousTrack: - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_PREV_ITEM))); + CApplicationMessenger::Get().SendAction(ACTION_PREV_ITEM); break; case UIEventSubtypeRemoteControlBeginSeekingForward: // use 4X speed forward. - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_PLAYER_FORWARD))); - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_PLAYER_FORWARD))); + CApplicationMessenger::Get().SendAction(ACTION_PLAYER_FORWARD); + CApplicationMessenger::Get().SendAction(ACTION_PLAYER_FORWARD); break; case UIEventSubtypeRemoteControlBeginSeekingBackward: // use 4X speed rewind. - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_PLAYER_REWIND))); - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_PLAYER_REWIND))); + CApplicationMessenger::Get().SendAction(ACTION_PLAYER_REWIND); + CApplicationMessenger::Get().SendAction(ACTION_PLAYER_REWIND); break; case UIEventSubtypeRemoteControlEndSeekingForward: case UIEventSubtypeRemoteControlEndSeekingBackward: // restore to normal playback speed. if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(new CAction(ACTION_PLAYER_PLAY))); + CApplicationMessenger::Get().SendAction(ACTION_PLAYER_PLAY); break; default: LOG(@"unhandled subtype: %d", receivedEvent.subtype); @@ -1051,7 +1066,7 @@ if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) { m_isPlayingBeforeInactive = YES; - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE_IF_PLAYING); + CApplicationMessenger::Get().MediaPauseIfPlaying(); } g_Windowing.OnAppFocusChange(false); } @@ -1063,7 +1078,7 @@ // when we come back, restore playing if we were. if (m_isPlayingBeforeInactive) { - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_UNPAUSE); + CApplicationMessenger::Get().MediaUnPause(); m_isPlayingBeforeInactive = NO; } } @@ -1075,7 +1090,7 @@ if (g_application.m_pPlayer->IsPlayingVideo() && !g_application.m_pPlayer->IsPaused()) { m_isPlayingBeforeInactive = YES; - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE_IF_PLAYING); + CApplicationMessenger::Get().MediaPauseIfPlaying(); } // check whether we need disable network auto suspend. [self rescheduleNetworkAutoSuspend]; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/IOSEAGLView.mm kodi-15.2~git20151019.1039-final/xbmc/osx/IOSEAGLView.mm --- kodi-16.1~git20160425.1001-final/xbmc/osx/IOSEAGLView.mm 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/IOSEAGLView.mm 2015-10-19 08:39:16.000000000 +0000 @@ -29,7 +29,7 @@ #include "AdvancedSettings.h" #include "FileItem.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "WindowingFactory.h" #include "VideoReferenceClock.h" #include "utils/log.h" @@ -44,7 +44,9 @@ #import #import #import "IOSEAGLView.h" -#if defined(TARGET_DARWIN_IOS) +#if defined(TARGET_DARWIN_IOS_ATV2) +#import "xbmc/osx/atv2/KodiController.h" +#elif defined(TARGET_DARWIN_IOS) #import "xbmc/osx/ios/XBMCController.h" #endif #import "IOSScreenManager.h" @@ -52,8 +54,6 @@ #import "DarwinUtils.h" #import "XBMCDebugHelpers.h" -using namespace KODI::MESSAGING; - //-------------------------------------------------------------- @interface IOSEAGLView (PrivateMethods) - (void) setContext:(EAGLContext *)newContext; @@ -111,6 +111,7 @@ CGFloat ret = 1.0; if ([screen respondsToSelector:@selector(scale)]) { + // atv2 reports 0.0 for scale - thats why we check this here // normal other iDevices report 1.0 here // retina devices report 2.0 here // this info is true as of 19.3.2012. @@ -358,7 +359,8 @@ xbmcAlive = FALSE; if (!g_application.m_bStop) { - CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT); + ThreadMessage tMsg = {TMSG_QUIT}; + CApplicationMessenger::Get().SendMessage(tMsg); } // wait for animation thread to die if ([animationThread isFinished] == NO) @@ -369,9 +371,6 @@ - (void) runAnimation:(id) arg { CCocoaAutoPool outerpool; - - [[NSThread currentThread] setName:@"XBMC_Run"]; - // set up some xbmc specific relationships XBMC::Context context; readyToRun = true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/IOSExternalTouchController.mm kodi-15.2~git20151019.1039-final/xbmc/osx/IOSExternalTouchController.mm --- kodi-16.1~git20160425.1001-final/xbmc/osx/IOSExternalTouchController.mm 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/IOSExternalTouchController.mm 2015-10-19 08:39:16.000000000 +0000 @@ -28,7 +28,11 @@ #undef BOOL #import "IOSExternalTouchController.h" +#if defined(TARGET_DARWIN_IOS_ATV2) +#import "KodiController.h" +#else #import "XBMCController.h" +#endif //dim the touchscreen after 15 secs without touch event const CGFloat touchScreenDimTimeoutSecs = 15.0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/IOSScreenManager.h kodi-15.2~git20151019.1039-final/xbmc/osx/IOSScreenManager.h --- kodi-16.1~git20160425.1001-final/xbmc/osx/IOSScreenManager.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/IOSScreenManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,6 +20,10 @@ /*Class for managing the UIScreens/resolutions of an iOS device*/ +#ifdef TARGET_DARWIN_IOS_ATV2 +#import +#else +#endif #import @class IOSEAGLView; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/IOSScreenManager.mm kodi-15.2~git20151019.1039-final/xbmc/osx/IOSScreenManager.mm --- kodi-16.1~git20160425.1001-final/xbmc/osx/IOSScreenManager.mm 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/IOSScreenManager.mm 2015-10-19 08:39:16.000000000 +0000 @@ -37,7 +37,9 @@ #include #import "IOSScreenManager.h" -#if defined(TARGET_DARWIN_IOS) +#if defined(TARGET_DARWIN_IOS_ATV2) +#import "xbmc/osx/atv2/KodiController.h" +#elif defined(TARGET_DARWIN_IOS) #import "xbmc/osx/ios/XBMCController.h" #endif #import "IOSExternalTouchController.h" @@ -108,7 +110,7 @@ { // portrait on external screen means its landscape for xbmc #if __IPHONE_8_0 - if (CDarwinUtils::GetIOSVersion() >= 8.0 && CDarwinUtils::GetIOSVersion() < 9.0) + if (CDarwinUtils::GetIOSVersion() >= 8.0) [g_xbmcController activateScreen:newScreen withOrientation:UIInterfaceOrientationLandscapeLeft];// will attach the screen to xbmc mainwindow else #endif @@ -256,6 +258,16 @@ + (CGRect) getLandscapeResolution:(UIScreen *)screen { CGRect res = [screen bounds]; +#ifdef TARGET_DARWIN_IOS_ATV2 + //because bounds returns f00bar on atv2 - we return the preferred resolution (which mostly is the + //right resolution +#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_2 + res.size = screen.preferredMode.size; +#else + Class brwin = objc_getClass("BRWindow"); + res.size = [brwin interfaceFrame].size; +#endif +#else #if __IPHONE_8_0 if (CDarwinUtils::GetIOSVersion() < 8.0) #endif @@ -268,6 +280,7 @@ res.size = CGSizeMake(frame.size.height, frame.size.width); } } +#endif return res; } //-------------------------------------------------------------- @@ -277,7 +290,7 @@ //change back to internal screen if([[UIScreen screens] count] == 1 && _screenIdx != 0) { - RESOLUTION_INFO res = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP);//internal screen default res + RESOLUTION_INFO res = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP);//internal screen default res g_Windowing.SetFullScreen(true, res, false); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/OSXTextInputResponder.mm kodi-15.2~git20151019.1039-final/xbmc/osx/OSXTextInputResponder.mm --- kodi-16.1~git20160425.1001-final/xbmc/osx/OSXTextInputResponder.mm 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/OSXTextInputResponder.mm 2015-10-19 08:39:16.000000000 +0000 @@ -27,12 +27,10 @@ #include "guilib/GUIWindowManager.h" #include "GUIUserMessages.h" #include "utils/log.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "input/Key.h" #undef BOOL -using namespace KODI::MESSAGING; - void SendKeyboardText(const char *text) { // CLog::Log(LOGDEBUG, "SendKeyboardText(%s)", text); @@ -41,9 +39,12 @@ if ((unsigned char)*text < ' ' || *text == 127) return; + ThreadMessage tMsg = {TMSG_GUI_ACTION}; + tMsg.param1 = WINDOW_INVALID; CAction *action = new CAction(ACTION_INPUT_TEXT); action->SetText(text); - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast(action)); + tMsg.lpVoid = action; + CApplicationMessenger::Get().SendMessage(tMsg, false); } void SendEditingText(const char *text, unsigned int location, unsigned int length) @@ -177,7 +178,7 @@ // CLog::Log(LOGDEBUG, "firstRectForCharacterRange: (%lu, %lu): windowHeight = %g, rect = %s", // theRange.location, theRange.length, windowHeight, // [NSStringFromRect(rect) UTF8String]); - rect.origin = [[self window] convertRectToScreen:rect].origin; + rect.origin = [[self window] convertBaseToScreen: rect.origin]; return rect; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/XBMCHelper.cpp kodi-15.2~git20151019.1039-final/xbmc/osx/XBMCHelper.cpp --- kodi-16.1~git20160425.1001-final/xbmc/osx/XBMCHelper.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/XBMCHelper.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -98,7 +98,7 @@ return false; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_INPUT_APPLEREMOTEMODE) + if (settingId == "input.appleremotemode") { int remoteMode = ((CSettingInt*)setting)->GetValue(); @@ -106,7 +106,7 @@ if (remoteMode != APPLE_REMOTE_DISABLED) { // if starting the event server fails, we have to revert the change - if (!CSettings::GetInstance().SetBool("services.esenabled", true)) + if (!CSettings::Get().SetBool("services.esenabled", true)) return false; } @@ -114,7 +114,7 @@ if (IsRunning() && GetMode() != remoteMode) { bool cancelled; - if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{13144}, CVariant{13145}, cancelled, CVariant{""}, CVariant{""}, 10000)) + if (!CGUIDialogYesNo::ShowAndGetInput(13144, 13145, cancelled, "", "", 10000)) return false; // reload configuration else @@ -127,12 +127,12 @@ if (ErrorStarting() == true) { // inform user about error - CGUIDialogOK::ShowAndGetInput(CVariant{13620}, CVariant{13621}); + CGUIDialogOK::ShowAndGetInput(13620, 13621); return false; } } - if (settingId == CSettings::SETTING_INPUT_APPLEREMOTEALWAYSON) + if (settingId == "input.appleremotealwayson") { HandleLaunchAgent(); } @@ -175,9 +175,9 @@ // Read the new configuration. m_errorStarting = false; - m_mode = CSettings::GetInstance().GetInt(CSettings::SETTING_INPUT_APPLEREMOTEMODE); - m_sequenceDelay = CSettings::GetInstance().GetInt(CSettings::SETTING_INPUT_APPLEREMOTESEQUENCETIME); - m_port = CSettings::GetInstance().GetInt(CSettings::SETTING_SERVICES_ESPORT); + m_mode = CSettings::Get().GetInt("input.appleremotemode"); + m_sequenceDelay = CSettings::Get().GetInt("input.appleremotesequencetime"); + m_port = CSettings::Get().GetInt("services.esport"); // Don't let it enable if sofa control or remote buddy is around. @@ -188,7 +188,7 @@ m_errorStarting = true; m_mode = APPLE_REMOTE_DISABLED; - CSettings::GetInstance().SetInt(CSettings::SETTING_INPUT_APPLEREMOTEMODE, APPLE_REMOTE_DISABLED); + CSettings::Get().SetInt("input.appleremotemode", APPLE_REMOTE_DISABLED); } // New configuration. @@ -262,8 +262,8 @@ void XBMCHelper::HandleLaunchAgent() { - bool oldAlwaysOn = m_alwaysOn; - m_alwaysOn = CSettings::GetInstance().GetBool(CSettings::SETTING_INPUT_APPLEREMOTEALWAYSON); + int oldAlwaysOn = m_alwaysOn; + m_alwaysOn = CSettings::Get().GetBool("input.appleremotealwayson"); // Installation/uninstallation. if (oldAlwaysOn == false && m_alwaysOn == true) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/osx/XBMCHelper.h kodi-15.2~git20151019.1039-final/xbmc/osx/XBMCHelper.h --- kodi-16.1~git20160425.1001-final/xbmc/osx/XBMCHelper.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/osx/XBMCHelper.h 2015-10-19 08:39:16.000000000 +0000 @@ -38,7 +38,7 @@ public: static XBMCHelper& GetInstance(); - virtual bool OnSettingChanging(const CSetting *setting) override; + virtual bool OnSettingChanging(const CSetting *setting); void Start(); void Stop(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/PartyModeManager.cpp kodi-15.2~git20151019.1039-final/xbmc/PartyModeManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/PartyModeManager.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/PartyModeManager.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -18,28 +18,25 @@ * */ +#include "threads/SystemClock.h" #include "PartyModeManager.h" - -#include - -#include "Application.h" -#include "dialogs/GUIDialogOK.h" -#include "dialogs/GUIDialogProgress.h" -#include "guilib/GUIWindowManager.h" -#include "GUIUserMessages.h" -#include "interfaces/AnnouncementManager.h" +#include "PlayListPlayer.h" #include "music/MusicDatabase.h" #include "music/windows/GUIWindowMusicPlaylist.h" -#include "PlayListPlayer.h" -#include "playlists/PlayList.h" +#include "video/VideoDatabase.h" #include "playlists/SmartPlayList.h" #include "profiles/ProfilesManager.h" -#include "threads/SystemClock.h" +#include "dialogs/GUIDialogProgress.h" +#include "GUIUserMessages.h" +#include "guilib/GUIWindowManager.h" +#include "dialogs/GUIDialogOK.h" +#include "playlists/PlayList.h" #include "utils/log.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" -#include "video/VideoDatabase.h" +#include "Application.h" +#include "interfaces/AnnouncementManager.h" +using namespace std; using namespace PLAYLIST; #define QUEUE_DEPTH 10 @@ -68,9 +65,9 @@ if (!strXspPath.empty()) //if a path to a smartplaylist is supplied use it partyModePath = strXspPath; else if (m_bIsVideo) - partyModePath = CProfilesManager::GetInstance().GetUserDataItem("PartyMode-Video.xsp"); + partyModePath = CProfilesManager::Get().GetUserDataItem("PartyMode-Video.xsp"); else - partyModePath = CProfilesManager::GetInstance().GetUserDataItem("PartyMode.xsp"); + partyModePath = CProfilesManager::Get().GetUserDataItem("PartyMode.xsp"); playlistLoaded=playlist.Load(partyModePath); @@ -103,22 +100,22 @@ CGUIDialogProgress* pDialog = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); int iHeading = (m_bIsVideo ? 20250 : 20121); int iLine0 = (m_bIsVideo ? 20251 : 20123); - pDialog->SetHeading(CVariant{iHeading}); - pDialog->SetLine(0, CVariant{iLine0}); - pDialog->SetLine(1, CVariant{""}); - pDialog->SetLine(2, CVariant{""}); - pDialog->Open(); + pDialog->SetHeading(iHeading); + pDialog->SetLine(0, iLine0); + pDialog->SetLine(1, ""); + pDialog->SetLine(2, ""); + pDialog->StartModal(); ClearState(); unsigned int time = XbmcThreads::SystemClockMillis(); - std::vector< std::pair > songIDs; + vector< pair > songIDs; if (StringUtils::EqualsNoCase(m_type, "songs") || StringUtils::EqualsNoCase(m_type, "mixed")) { CMusicDatabase db; if (db.Open()) { - std::set playlists; + set playlists; if ( playlistLoaded ) m_strCurrentFilterMusic = playlist.GetWhereClause(db, playlists); @@ -144,11 +141,11 @@ if (StringUtils::EqualsNoCase(m_type, "musicvideos") || StringUtils::EqualsNoCase(m_type, "mixed")) { - std::vector< std::pair > songIDs2; + vector< pair > songIDs2; CVideoDatabase db; if (db.Open()) { - std::set playlists; + set playlists; if ( playlistLoaded ) m_strCurrentFilterVideo = playlist.GetWhereClause(db, playlists); @@ -189,7 +186,7 @@ g_playlistPlayer.SetShuffle(iPlaylist, false); g_playlistPlayer.SetRepeat(iPlaylist, PLAYLIST::REPEAT_NONE); - pDialog->SetLine(0, CVariant{m_bIsVideo ? 20252 : 20124}); + pDialog->SetLine(0, (m_bIsVideo ? 20252 : 20124)); pDialog->Progress(); // add initial songs if (!AddInitialSongs(songIDs)) @@ -355,7 +352,7 @@ bool error(false); for (int i = 0; i < iSongsToAdd; i++) { - std::pair whereClause = GetWhereClauseWithHistory(); + pair whereClause = GetWhereClauseWithHistory(); CFileItemPtr item(new CFileItem); int songID; if (database.GetRandomSong(item.get(), songID, whereClause.first)) @@ -403,7 +400,7 @@ bool error(false); for (int i = 0; i < iVidsToAdd; i++) { - std::pair whereClause = GetWhereClauseWithHistory(); + pair whereClause = GetWhereClauseWithHistory(); CFileItemPtr item(new CFileItem); int songID; if (database.GetRandomMusicVideo(item.get(), songID, whereClause.second)) @@ -515,7 +512,7 @@ void CPartyModeManager::OnError(int iError, const std::string& strLogMessage) { // open error dialog - CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{16030}, CVariant{iError}, CVariant{0}); + CGUIDialogOK::ShowAndGetInput(257, 16030, iError, 0); CLog::Log(LOGERROR, "PARTY MODE MANAGER: %s", strLogMessage.c_str()); m_bEnabled = false; SendUpdateMessage(); @@ -595,7 +592,7 @@ m_iRelaxedSongs = 0; // unsupported at this stage } -bool CPartyModeManager::AddInitialSongs(std::vector< std::pair > &songIDs) +bool CPartyModeManager::AddInitialSongs(vector > &songIDs) { int iPlaylist = m_bIsVideo ? PLAYLIST_VIDEO : PLAYLIST_MUSIC; @@ -607,12 +604,12 @@ if (iMissingSongs > (int)songIDs.size()) return false; // can't do it if we have less songs than we need - std::vector > chosenSongIDs; + vector > chosenSongIDs; GetRandomSelection(songIDs, iMissingSongs, chosenSongIDs); std::string sqlWhereMusic = "songview.idSong IN ("; std::string sqlWhereVideo = "idMVideo IN ("; - for (std::vector< std::pair >::iterator it = chosenSongIDs.begin(); it != chosenSongIDs.end(); ++it) + for (vector< pair >::iterator it = chosenSongIDs.begin(); it != chosenSongIDs.end(); ++it) { std::string song = StringUtils::Format("%i,", it->second); if (it->first == 1) @@ -650,7 +647,7 @@ return true; } -std::pair CPartyModeManager::GetWhereClauseWithHistory() const +pair CPartyModeManager::GetWhereClauseWithHistory() const { // now add this on to the normal where clause std::vector historyItemsMusic; @@ -680,20 +677,20 @@ historyWhereVideo += "idMVideo not in (" + StringUtils::Join(historyItemsVideo, ", ") + ")"; } - return std::make_pair(historyWhereMusic, historyWhereVideo); + return make_pair(historyWhereMusic, historyWhereVideo); } void CPartyModeManager::AddToHistory(int type, int songID) { while (m_history.size() >= m_songsInHistory && m_songsInHistory) m_history.erase(m_history.begin()); - m_history.push_back(std::make_pair(type,songID)); + m_history.push_back(make_pair(type,songID)); } -void CPartyModeManager::GetRandomSelection(std::vector< std::pair >& in, unsigned int number, std::vector< std::pair >& out) +void CPartyModeManager::GetRandomSelection(vector< pair >& in, unsigned int number, vector< pair >& out) { - number = std::min(number, (unsigned int)in.size()); - std::random_shuffle(in.begin(), in.end()); + number = min(number, (unsigned int)in.size()); + random_shuffle(in.begin(), in.end()); out.assign(in.begin(), in.begin() + number); } @@ -715,6 +712,6 @@ data["player"]["playerid"] = g_playlistPlayer.GetCurrentPlaylist(); data["property"]["partymode"] = m_bEnabled; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPropertyChanged", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPropertyChanged", data); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/PartyModeManager.h kodi-15.2~git20151019.1039-final/xbmc/PartyModeManager.h --- kodi-16.1~git20160425.1001-final/xbmc/PartyModeManager.h 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/PartyModeManager.h 2015-10-19 08:39:15.000000000 +0000 @@ -19,11 +19,11 @@ * */ -#include #include -#include #include +#include + class CFileItem; typedef std::shared_ptr CFileItemPtr; class CFileItemList; namespace PLAYLIST diff -Nru kodi-16.1~git20160425.1001-final/xbmc/PasswordManager.cpp kodi-15.2~git20151019.1039-final/xbmc/PasswordManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/PasswordManager.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/PasswordManager.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -27,6 +27,8 @@ #include "utils/log.h" #include "filesystem/File.h" +using namespace std; + CPasswordManager &CPasswordManager::GetInstance() { static CPasswordManager sPasswordManager; @@ -45,7 +47,7 @@ if (!m_loaded) Load(); std::string lookup(GetLookupPath(url)); - std::map::const_iterator it = m_temporaryCache.find(lookup); + map::const_iterator it = m_temporaryCache.find(lookup); if (it == m_temporaryCache.end()) { // second step, try something that doesn't quite match it = m_temporaryCache.find(GetServerLookup(lookup)); @@ -114,7 +116,7 @@ void CPasswordManager::Load() { Clear(); - std::string passwordsFile = CProfilesManager::GetInstance().GetUserDataItem("passwords.xml"); + std::string passwordsFile = CProfilesManager::Get().GetUserDataItem("passwords.xml"); if (XFILE::CFile::Exists(passwordsFile)) { CXBMCTinyXML doc; @@ -155,7 +157,7 @@ if (!root) return; - for (std::map::const_iterator i = m_permanentCache.begin(); i != m_permanentCache.end(); ++i) + for (map::const_iterator i = m_permanentCache.begin(); i != m_permanentCache.end(); ++i) { TiXmlElement pathElement("path"); TiXmlNode *path = root->InsertEndChild(pathElement); @@ -163,7 +165,7 @@ XMLUtils::SetPath(path, "to", i->second); } - doc.SaveFile(CProfilesManager::GetInstance().GetUserDataItem("passwords.xml")); + doc.SaveFile(CProfilesManager::Get().GetUserDataItem("passwords.xml")); } std::string CPasswordManager::GetLookupPath(const CURL &url) const diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/bus/PeripheralBus.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/bus/PeripheralBus.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/bus/PeripheralBus.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/bus/PeripheralBus.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,13 +19,12 @@ */ #include "PeripheralBus.h" -#include "guilib/LocalizeStrings.h" #include "peripherals/Peripherals.h" -#include "utils/StringUtils.h" #include "utils/Variant.h" #include "utils/log.h" #include "FileItem.h" +using namespace std; using namespace PERIPHERALS; #define PERIPHERAL_DEFAULT_RESCAN_INTERVAL 5000 @@ -75,7 +74,7 @@ void CPeripheralBus::UnregisterRemovedDevices(const PeripheralScanResults &results) { CSingleLock lock(m_critSection); - std::vector removedPeripherals; + vector removedPeripherals; for (int iDevicePtr = (int) m_peripherals.size() - 1; iDevicePtr >= 0; iDevicePtr--) { CPeripheral *peripheral = m_peripherals.at(iDevicePtr); @@ -93,7 +92,7 @@ for (unsigned int iDevicePtr = 0; iDevicePtr < removedPeripherals.size(); iDevicePtr++) { CPeripheral *peripheral = removedPeripherals.at(iDevicePtr); - std::vector features; + vector features; peripheral->GetFeatures(features); bool peripheralHasFeatures = features.size() > 1 || (features.size() == 1 && features.at(0) != FEATURE_UNKNOWN); if (peripheral->Type() != PERIPHERAL_UNKNOWN || peripheralHasFeatures) @@ -128,7 +127,7 @@ UnregisterRemovedDevices(results); RegisterNewDevices(results); - CPeripherals::GetInstance().NotifyObservers(ObservableMessagePeripheralsChanged); + CPeripherals::Get().NotifyObservers(ObservableMessagePeripheralsChanged); bReturn = true; } @@ -174,7 +173,7 @@ return peripheral; } -int CPeripheralBus::GetPeripheralsWithFeature(std::vector &results, const PeripheralFeature feature) const +int CPeripheralBus::GetPeripheralsWithFeature(vector &results, const PeripheralFeature feature) const { int iReturn(0); CSingleLock lock(m_critSection); @@ -293,18 +292,7 @@ peripheralFile->SetProperty("bus", PeripheralTypeTranslator::BusTypeToString(peripheral->GetBusType())); peripheralFile->SetProperty("location", peripheral->Location()); peripheralFile->SetProperty("class", PeripheralTypeTranslator::TypeToString(peripheral->Type())); - - std::string strVersion(peripheral->GetVersionInfo()); - if (strVersion.empty()) - strVersion = g_localizeStrings.Get(13205); - - std::string strDetails = StringUtils::Format("%s %s", g_localizeStrings.Get(24051).c_str(), strVersion.c_str()); - if (peripheral->GetBusType() == PERIPHERAL_BUS_CEC && !peripheral->GetSettingBool("enabled")) - strDetails = StringUtils::Format("%s: %s", g_localizeStrings.Get(126).c_str(), g_localizeStrings.Get(13106).c_str()); - - peripheralFile->SetProperty("version", strVersion); - peripheralFile->SetProperty("Addon.Summary", strDetails); - peripheralFile->SetIconImage("DefaultAddon.png"); + peripheralFile->SetProperty("version", peripheral->GetVersionInfo()); items.Add(peripheralFile); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -28,6 +28,7 @@ using namespace PERIPHERALS; using namespace CEC; +using namespace std; class DllLibCECInterface { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralCecAdapter.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralCecAdapter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,7 @@ #include "PeripheralCecAdapter.h" #include "input/XBIRRemote.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "DynamicDll.h" #include "threads/SingleLock.h" #include "dialogs/GUIDialogKaiToast.h" @@ -37,10 +37,10 @@ #include -using namespace KODI::MESSAGING; using namespace PERIPHERALS; using namespace ANNOUNCEMENT; using namespace CEC; +using namespace std; #define CEC_LIB_SUPPORTED_VERSION LIBCEC_VERSION_TO_UINT(3, 0, 0) @@ -52,9 +52,6 @@ #define LOCALISED_ID_TV 36037 #define LOCALISED_ID_AVR 36038 #define LOCALISED_ID_TV_AVR 36039 -#define LOCALISED_ID_STOP 36044 -#define LOCALISED_ID_PAUSE 36045 - #define LOCALISED_ID_NONE 231 /* time in seconds to suppress source activation after receiving OnStop */ @@ -96,7 +93,7 @@ { { CSingleLock lock(m_critSection); - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); m_bStop = true; } @@ -150,7 +147,7 @@ { CSingleLock lock(m_critSection); m_iExitCode = static_cast(data["exitcode"].asInteger(EXITCODE_QUIT)); - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); StopThread(false); } else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && m_bIsReady) @@ -368,7 +365,7 @@ m_bActiveSourceBeforeStandby = false; } - CAnnouncementManager::GetInstance().AddAnnouncer(this); + CAnnouncementManager::Get().AddAnnouncer(this); m_queryThread = new CPeripheralCecAdapterUpdateThread(this, &m_configuration); m_queryThread->Create(false); @@ -604,7 +601,7 @@ if (!strGuiLanguage.empty()) { strGuiLanguage = "resource.language." + strGuiLanguage; - CApplicationMessenger::GetInstance().PostMsg(TMSG_SETLANGUAGE, -1, -1, nullptr, strGuiLanguage); + CApplicationMessenger::Get().SetGUILanguage(strGuiLanguage); CLog::Log(LOGDEBUG, "%s - language set to '%s'", __FUNCTION__, strGuiLanguage.c_str()); } else @@ -755,7 +752,7 @@ m_bHasButton = false; if (m_bIsReady) { - std::vector::iterator it = m_buttonQueue.begin(); + vector::iterator it = m_buttonQueue.begin(); if (it != m_buttonQueue.end()) { m_currentButton = (*it); @@ -781,7 +778,7 @@ return; } // if we received a keypress with a duration set, try to find the same one without a duration set, and replace it - for (std::vector::reverse_iterator it = m_buttonQueue.rbegin(); it != m_buttonQueue.rend(); ++it) + for (vector::reverse_iterator it = m_buttonQueue.rbegin(); it != m_buttonQueue.rend(); ++it) { if ((*it).iButton == key.iButton) { @@ -1154,7 +1151,7 @@ if (activated == 1) g_application.WakeUpScreenSaverAndDPMS(); - if (adapter->GetSettingInt("pause_or_stop_playback_on_deactivate") != LOCALISED_ID_NONE) + if (adapter->GetSettingBool("pause_playback_on_deactivate")) { bool bShowingSlideshow = (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW); CGUIWindowSlideShow *pSlideShow = bShowingSlideshow ? (CGUIWindowSlideShow *)g_windowManager.GetWindow(WINDOW_SLIDESHOW) : NULL; @@ -1167,22 +1164,14 @@ else if (bPausedAndActivated) adapter->m_bPlaybackPaused = false; - if ((bPlayingAndDeactivated || bPausedAndActivated) - && adapter->GetSettingInt("pause_or_stop_playback_on_deactivate") == LOCALISED_ID_PAUSE) + if (bPlayingAndDeactivated || bPausedAndActivated) { if (pSlideShow) // pause/resume slideshow pSlideShow->OnAction(CAction(ACTION_PAUSE)); else // pause/resume player - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE); - } - else if (adapter->GetSettingInt("pause_or_stop_playback_on_deactivate") == LOCALISED_ID_STOP) - { - if (pSlideShow) - pSlideShow->OnAction(CAction(ACTION_STOP)); - else - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); + CApplicationMessenger::Get().MediaPause(); } } } @@ -1382,12 +1371,6 @@ // backwards compatibility. will be removed once the next major release of libCEC is out m_configuration.iDoubleTapTimeoutMs = GetSettingInt("double_tap_timeout_ms"); #endif - - if (GetSettingBool("pause_playback_on_deactivate")) - { - SetSetting("pause_or_stop_playback_on_deactivate", 36045); - SetSetting("pause_playback_on_deactivate", false); - } } void CPeripheralCecAdapter::ReadLogicalAddresses(const std::string &strString, cec_logical_addresses &addresses) @@ -1426,7 +1409,7 @@ } } -bool CPeripheralCecAdapter::WriteLogicalAddresses(const cec_logical_addresses& addresses, const std::string& strSettingName, const std::string& strAdvancedSettingName) +bool CPeripheralCecAdapter::WriteLogicalAddresses(const cec_logical_addresses& addresses, const string& strSettingName, const string& strAdvancedSettingName) { bool bChanged(false); @@ -1673,7 +1656,7 @@ { CSingleLock lock(m_critSection); m_iExitCode = EXITCODE_RESTARTAPP; - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); StopThread(false); } StopThread(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralCecAdapter.h kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralCecAdapter.h --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralCecAdapter.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralCecAdapter.h 2015-10-19 08:39:16.000000000 +0000 @@ -58,7 +58,6 @@ #include class DllLibCEC; -class CVariant; namespace CEC { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/Peripheral.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/Peripheral.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/Peripheral.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/Peripheral.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,18 +19,16 @@ */ #include "Peripheral.h" - -#include - -#include "guilib/LocalizeStrings.h" #include "peripherals/Peripherals.h" -#include "settings/lib/Setting.h" #include "utils/log.h" #include "utils/StringUtils.h" +#include "settings/lib/Setting.h" #include "utils/XBMCTinyXML.h" #include "utils/XMLUtils.h" +#include "guilib/LocalizeStrings.h" using namespace PERIPHERALS; +using namespace std; struct SortBySettingsOrder { @@ -55,19 +53,10 @@ { PeripheralTypeTranslator::FormatHexString(scanResult.m_iVendorId, m_strVendorId); PeripheralTypeTranslator::FormatHexString(scanResult.m_iProductId, m_strProductId); - if (scanResult.m_iSequence > 0) - { - m_strFileLocation = StringUtils::Format("peripherals://%s/%s_%d.dev", - PeripheralTypeTranslator::BusTypeToString(scanResult.m_busType), - scanResult.m_strLocation.c_str(), - scanResult.m_iSequence); - } - else - { - m_strFileLocation = StringUtils::Format("peripherals://%s/%s.dev", - PeripheralTypeTranslator::BusTypeToString(scanResult.m_busType), - scanResult.m_strLocation.c_str()); - } + m_strFileLocation = StringUtils::Format(scanResult.m_iSequence > 0 ? "peripherals://%s/%s_%d.dev" : "peripherals://%s/%s.dev", + PeripheralTypeTranslator::BusTypeToString(scanResult.m_busType), + scanResult.m_strLocation.c_str(), + scanResult.m_iSequence); } CPeripheral::~CPeripheral(void) @@ -168,7 +157,7 @@ return bReturn; } -void CPeripheral::GetSubdevices(std::vector &subDevices) const +void CPeripheral::GetSubdevices(vector &subDevices) const { for (unsigned int iSubdevicePtr = 0; iSubdevicePtr < m_subDevices.size(); iSubdevicePtr++) subDevices.push_back(m_subDevices.at(iSubdevicePtr)); @@ -179,15 +168,15 @@ return m_subDevices.size() > 0; } -std::vector CPeripheral::GetSettings(void) const +vector CPeripheral::GetSettings(void) const { - std::vector tmpSettings; - for (std::map::const_iterator it = m_settings.begin(); it != m_settings.end(); ++it) + vector tmpSettings; + for (map::const_iterator it = m_settings.begin(); it != m_settings.end(); ++it) tmpSettings.push_back(it->second); sort(tmpSettings.begin(), tmpSettings.end(), SortBySettingsOrder()); - std::vector settings; - for (std::vector::const_iterator it = tmpSettings.begin(); it != tmpSettings.end(); ++it) + vector settings; + for (vector::const_iterator it = tmpSettings.begin(); it != tmpSettings.end(); ++it) settings.push_back(it->m_setting); return settings; } @@ -261,7 +250,7 @@ bool CPeripheral::HasSetting(const std::string &strKey) const { - std::map:: const_iterator it = m_settings.find(strKey); + map:: const_iterator it = m_settings.find(strKey); return it != m_settings.end(); } @@ -273,7 +262,7 @@ bool CPeripheral::HasConfigurableSettings(void) const { bool bReturn(false); - std::map::const_iterator it = m_settings.begin(); + map::const_iterator it = m_settings.begin(); while (it != m_settings.end() && !bReturn) { if ((*it).second.m_setting->IsVisible()) @@ -290,7 +279,7 @@ bool CPeripheral::GetSettingBool(const std::string &strKey) const { - std::map::const_iterator it = m_settings.find(strKey); + map::const_iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second.m_setting->GetType() == SettingTypeBool) { CSettingBool *boolSetting = (CSettingBool *) (*it).second.m_setting; @@ -303,7 +292,7 @@ int CPeripheral::GetSettingInt(const std::string &strKey) const { - std::map::const_iterator it = m_settings.find(strKey); + map::const_iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second.m_setting->GetType() == SettingTypeInteger) { CSettingInt *intSetting = (CSettingInt *) (*it).second.m_setting; @@ -316,7 +305,7 @@ float CPeripheral::GetSettingFloat(const std::string &strKey) const { - std::map::const_iterator it = m_settings.find(strKey); + map::const_iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second.m_setting->GetType() == SettingTypeNumber) { CSettingNumber *floatSetting = (CSettingNumber *) (*it).second.m_setting; @@ -329,7 +318,7 @@ const std::string CPeripheral::GetSettingString(const std::string &strKey) const { - std::map::const_iterator it = m_settings.find(strKey); + map::const_iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second.m_setting->GetType() == SettingTypeString) { CSettingString *stringSetting = (CSettingString *) (*it).second.m_setting; @@ -343,7 +332,7 @@ bool CPeripheral::SetSetting(const std::string &strKey, bool bValue) { bool bChanged(false); - std::map::iterator it = m_settings.find(strKey); + map::iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second.m_setting->GetType() == SettingTypeBool) { CSettingBool *boolSetting = (CSettingBool *) (*it).second.m_setting; @@ -361,7 +350,7 @@ bool CPeripheral::SetSetting(const std::string &strKey, int iValue) { bool bChanged(false); - std::map::iterator it = m_settings.find(strKey); + map::iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second.m_setting->GetType() == SettingTypeInteger) { CSettingInt *intSetting = (CSettingInt *) (*it).second.m_setting; @@ -379,7 +368,7 @@ bool CPeripheral::SetSetting(const std::string &strKey, float fValue) { bool bChanged(false); - std::map::iterator it = m_settings.find(strKey); + map::iterator it = m_settings.find(strKey); if (it != m_settings.end() && (*it).second.m_setting->GetType() == SettingTypeNumber) { CSettingNumber *floatSetting = (CSettingNumber *) (*it).second.m_setting; @@ -396,14 +385,14 @@ void CPeripheral::SetSettingVisible(const std::string &strKey, bool bSetTo) { - std::map::iterator it = m_settings.find(strKey); + map::iterator it = m_settings.find(strKey); if (it != m_settings.end()) (*it).second.m_setting->SetVisible(bSetTo); } bool CPeripheral::IsSettingVisible(const std::string &strKey) const { - std::map::const_iterator it = m_settings.find(strKey); + map::const_iterator it = m_settings.find(strKey); if (it != m_settings.end()) return (*it).second.m_setting->IsVisible(); return false; @@ -412,7 +401,7 @@ bool CPeripheral::SetSetting(const std::string &strKey, const std::string &strValue) { bool bChanged(false); - std::map::iterator it = m_settings.find(strKey); + map::iterator it = m_settings.find(strKey); if (it != m_settings.end()) { if ((*it).second.m_setting->GetType() == SettingTypeString) @@ -441,7 +430,7 @@ CXBMCTinyXML doc; TiXmlElement node("settings"); doc.InsertEndChild(node); - for (std::map::const_iterator itr = m_settings.begin(); itr != m_settings.end(); ++itr) + for (map::const_iterator itr = m_settings.begin(); itr != m_settings.end(); ++itr) { TiXmlElement nodeSetting("setting"); nodeSetting.SetAttribute("id", itr->first.c_str()); @@ -487,7 +476,7 @@ if (!bExiting) { - for (std::set::const_iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); ++it) + for (set::const_iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); ++it) OnSettingChanged(*it); } m_changedSettings.clear(); @@ -515,7 +504,7 @@ ClearSettings(); g_peripherals.GetSettingsFromMapping(*this); - std::map::iterator it = m_settings.begin(); + map::iterator it = m_settings.begin(); while (it != m_settings.end()) { m_changedSettings.insert((*it).first); @@ -527,7 +516,7 @@ void CPeripheral::ClearSettings(void) { - std::map::iterator it = m_settings.begin(); + map::iterator it = m_settings.begin(); while (it != m_settings.end()) { delete (*it).second.m_setting; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralHID.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralHID.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralHID.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralHID.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,6 +24,7 @@ #include "input/ButtonTranslator.h" using namespace PERIPHERALS; +using namespace std; CPeripheralHID::CPeripheralHID(const PeripheralScanResult& scanResult) : CPeripheral(scanResult) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralImon.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralImon.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralImon.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralImon.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,7 @@ #include "input/InputManager.h" using namespace PERIPHERALS; +using namespace std; volatile long CPeripheralImon::m_lCountOfImonsConflictWithDInput = 0; @@ -99,10 +100,10 @@ if (deviceInserted || m_lCountOfImonsConflictWithDInput == 0) { #if defined(TARGET_WINDOWS) && defined (HAS_SDL_JOYSTICK) - bool enableJoystickNow = !deviceInserted && CSettings::GetInstance().GetBool(CSettings::SETTING_INPUT_ENABLEJOYSTICK); + bool enableJoystickNow = !deviceInserted && CSettings::Get().GetBool("input.enablejoystick"); CLog::Log(LOGNOTICE, "Problematic iMON hardware %s. Joystick usage: %s", (deviceInserted ? "detected" : "was removed"), (enableJoystickNow) ? "enabled." : "disabled." ); - CInputManager::GetInstance().SetEnabledJoystick(enableJoystickNow); + CInputManager::Get().SetEnabledJoystick(enableJoystickNow); #endif } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralNIC.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralNIC.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralNIC.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralNIC.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,6 +22,7 @@ #include "guilib/LocalizeStrings.h" using namespace PERIPHERALS; +using namespace std; CPeripheralNIC::CPeripheralNIC(const PeripheralScanResult& scanResult) : CPeripheral(scanResult) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralNyxboard.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralNyxboard.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/devices/PeripheralNyxboard.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/devices/PeripheralNyxboard.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -24,6 +24,7 @@ #include "Application.h" using namespace PERIPHERALS; +using namespace std; CPeripheralNyxboard::CPeripheralNyxboard(const PeripheralScanResult& scanResult) : CPeripheralHID(scanResult) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "GUIDialogPeripheralManager.h" +#include "FileItem.h" +#include "GUIUserMessages.h" +#include "guilib/GUIWindowManager.h" +#include "input/Key.h" +#include "peripherals/Peripherals.h" +#include "peripherals/dialogs/GUIDialogPeripheralSettings.h" + +#define BUTTON_CLOSE 10 +#define BUTTON_SETTINGS 11 +#define CONTROL_LIST 20 + +using namespace std; +using namespace PERIPHERALS; + +CGUIDialogPeripheralManager::CGUIDialogPeripheralManager(void) : + CGUIDialog(WINDOW_DIALOG_PERIPHERAL_MANAGER, "DialogPeripheralManager.xml"), + m_iSelected(0), + m_peripheralItems(new CFileItemList) +{ + m_loadType = KEEP_IN_MEMORY; +} + +CGUIDialogPeripheralManager::~CGUIDialogPeripheralManager(void) +{ + delete m_peripheralItems; +} + +bool CGUIDialogPeripheralManager::OnAction(const CAction &action) +{ + int iActionId = action.GetID(); + if (GetFocusedControlID() == CONTROL_LIST && + (iActionId == ACTION_MOVE_DOWN || iActionId == ACTION_MOVE_UP || + iActionId == ACTION_PAGE_DOWN || iActionId == ACTION_PAGE_UP)) + { + CGUIDialog::OnAction(action); + int iSelected = m_viewControl.GetSelectedItem(); + if (iSelected != m_iSelected) + m_iSelected = iSelected; + UpdateButtons(); + return true; + } + + return CGUIDialog::OnAction(action); +} + +void CGUIDialogPeripheralManager::OnInitWindow() +{ + m_iSelected = 0; + Update(); + CGUIDialog::OnInitWindow(); +} + +bool CGUIDialogPeripheralManager::OnClickList(CGUIMessage &message) +{ + if (CurrentItemHasSettings()) + return OpenSettingsDialog(); + + return true; +} + +bool CGUIDialogPeripheralManager::OnClickButtonClose(CGUIMessage &message) +{ + Close(); + return true; +} + +bool CGUIDialogPeripheralManager::OnClickButtonSettings(CGUIMessage &message) +{ + return OpenSettingsDialog(); +} + +bool CGUIDialogPeripheralManager::OpenSettingsDialog(void) +{ + CGUIDialogPeripheralSettings *dialog = (CGUIDialogPeripheralSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_PERIPHERAL_SETTINGS); + if (dialog) + { + dialog->SetFileItem(GetCurrentListItem().get()); + dialog->DoModal(); + return true; + } + + return false; +} + +bool CGUIDialogPeripheralManager::OnMessageClick(CGUIMessage &message) +{ + int iControl = message.GetSenderId(); + switch(iControl) + { + case CONTROL_LIST: + return OnClickList(message); + case BUTTON_CLOSE: + return OnClickButtonClose(message); + case BUTTON_SETTINGS: + return OnClickButtonSettings(message); + default: + return false; + } +} + +bool CGUIDialogPeripheralManager::OnMessage(CGUIMessage& message) +{ + unsigned int iMessage = message.GetMessage(); + + switch (iMessage) + { + case GUI_MSG_WINDOW_DEINIT: + Clear(); + break; + case GUI_MSG_ITEM_SELECT: + return true; + case GUI_MSG_CLICKED: + return OnMessageClick(message); + case GUI_MSG_UPDATE: + if (IsActive()) + { + Update(); + return true; + } + break; + } + + return CGUIDialog::OnMessage(message); +} + +void CGUIDialogPeripheralManager::OnWindowLoaded(void) +{ + CGUIDialog::OnWindowLoaded(); + + m_viewControl.Reset(); + m_viewControl.SetParentWindow(GetID()); + const CGUIControl *list = GetControl(CONTROL_LIST); + m_viewControl.AddView(list); +} + +void CGUIDialogPeripheralManager::OnWindowUnload(void) +{ + CGUIDialog::OnWindowUnload(); + m_viewControl.Reset(); +} + +CFileItemPtr CGUIDialogPeripheralManager::GetCurrentListItem(void) const +{ + return m_peripheralItems->Get(m_iSelected); +} + +void CGUIDialogPeripheralManager::Update() +{ + CSingleLock lock(g_graphicsContext); + + m_viewControl.SetCurrentView(CONTROL_LIST); + Clear(); + g_peripherals.GetDirectory("peripherals://all/", *m_peripheralItems); + m_viewControl.SetItems(*m_peripheralItems); + m_viewControl.SetSelectedItem(m_iSelected); + + UpdateButtons(); + CGUIControl *list = (CGUIControl *) GetControl(CONTROL_LIST); + if (list) + list->SetInvalid(); +} + +void CGUIDialogPeripheralManager::Clear(void) +{ + m_viewControl.Clear(); + m_peripheralItems->Clear(); +} + +bool CGUIDialogPeripheralManager::CurrentItemHasSettings(void) const +{ + CSingleLock lock(g_graphicsContext); + CFileItemPtr currentItem = GetCurrentListItem(); + if (!currentItem) + return false; + + CPeripheral *peripheral = g_peripherals.GetByPath(currentItem.get()->GetPath()); + return peripheral && peripheral->HasConfigurableSettings(); +} + +void CGUIDialogPeripheralManager::UpdateButtons(void) +{ + CONTROL_ENABLE_ON_CONDITION(BUTTON_SETTINGS, CurrentItemHasSettings()); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.h kodi-15.2~git20151019.1039-final/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.h --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,58 @@ +#pragma once +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "guilib/GUIDialog.h" +#include "view/GUIViewControl.h" + +namespace PERIPHERALS +{ + class CGUIDialogPeripheralManager : public CGUIDialog + { + public: + CGUIDialogPeripheralManager(void); + virtual ~CGUIDialogPeripheralManager(void); + virtual bool OnMessage(CGUIMessage& message); + virtual bool OnAction(const CAction& action); + virtual void OnInitWindow(); + virtual void OnWindowLoaded(void); + virtual void OnWindowUnload(void); + virtual bool HasListItems() const { return true; }; + virtual CFileItemPtr GetCurrentListItem(void) const; + virtual void Update(void); + + protected: + virtual bool OnMessageClick(CGUIMessage &message); + + virtual bool OnClickList(CGUIMessage &message); + virtual bool OnClickButtonClose(CGUIMessage &message); + virtual bool OnClickButtonSettings(CGUIMessage &message); + virtual bool OpenSettingsDialog(void); + virtual bool CurrentItemHasSettings(void) const; + + private: + void Clear(void); + void UpdateButtons(void); + + int m_iSelected; + CFileItemList* m_peripheralItems; + CGUIViewControl m_viewControl; + }; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,20 +19,17 @@ */ #include "GUIDialogPeripheralSettings.h" - -#include - +#include "FileItem.h" #include "addons/Skin.h" #include "dialogs/GUIDialogYesNo.h" -#include "FileItem.h" #include "peripherals/Peripherals.h" #include "settings/lib/Setting.h" #include "settings/lib/SettingSection.h" #include "utils/log.h" -#include "utils/Variant.h" #define CONTROL_BUTTON_DEFAULTS 50 +using namespace std; using namespace PERIPHERALS; CGUIDialogPeripheralSettings::CGUIDialogPeripheralSettings() @@ -109,7 +106,7 @@ if (peripheral == NULL) return; - if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{10041}, CVariant{10042})) + if (!CGUIDialogYesNo::ShowAndGetInput(10041, 10042)) return; // reset the settings in the peripheral @@ -123,7 +120,7 @@ { CGUIDialogSettingsManualBase::SetupView(); - SetHeading(m_item->GetLabel()); + SetHeading(5); } void CGUIDialogPeripheralSettings::InitializeSettings() @@ -162,8 +159,8 @@ return; } - std::vector settings = peripheral->GetSettings(); - for (std::vector::iterator itSetting = settings.begin(); itSetting != settings.end(); ++itSetting) + vector settings = peripheral->GetSettings(); + for (vector::iterator itSetting = settings.begin(); itSetting != settings.end(); ++itSetting) { CSetting *setting = *itSetting; if (setting == NULL) @@ -191,7 +188,11 @@ case SettingTypeInteger: { - CSettingInt *settingInt = new CSettingInt(setting->GetId(), *static_cast(setting)); + CSettingInt *intSetting = static_cast(setting); + if (intSetting == NULL) + break; + + CSettingInt *settingInt = new CSettingInt(setting->GetId(), *intSetting); if (settingInt->GetOptions().empty()) settingInt->SetControl(GetSliderControl("integer", false, -1, usePopup, -1, "%i")); else diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/dialogs/Makefile kodi-15.2~git20151019.1039-final/xbmc/peripherals/dialogs/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/dialogs/Makefile 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/dialogs/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ -SRCS=GUIDialogPeripheralSettings.cpp +SRCS=GUIDialogPeripheralSettings.cpp \ + GUIDialogPeripheralManager.cpp LIB=peripheral-dialogs.a diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/Peripherals.cpp kodi-15.2~git20151019.1039-final/xbmc/peripherals/Peripherals.cpp --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/Peripherals.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/Peripherals.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,46 +19,39 @@ */ #include "Peripherals.h" - -#include - #include "bus/PeripheralBus.h" -#include "bus/PeripheralBusUSB.h" #include "devices/PeripheralBluetooth.h" -#include "devices/PeripheralCecAdapter.h" #include "devices/PeripheralDisk.h" #include "devices/PeripheralHID.h" -#include "devices/PeripheralImon.h" #include "devices/PeripheralNIC.h" #include "devices/PeripheralNyxboard.h" #include "devices/PeripheralTuner.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "dialogs/GUIDialogPeripheralSettings.h" -#include "dialogs/GUIDialogSelect.h" -#include "FileItem.h" +#include "devices/PeripheralCecAdapter.h" +#include "devices/PeripheralImon.h" +#include "bus/PeripheralBusUSB.h" +#include "dialogs/GUIDialogPeripheralManager.h" + +#if defined(HAVE_LIBCEC) +#include "bus/virtual/PeripheralBusCEC.h" +#endif + +#include "threads/SingleLock.h" +#include "utils/log.h" +#include "utils/XMLUtils.h" +#include "utils/XBMCTinyXML.h" #include "filesystem/Directory.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" +#include "dialogs/GUIDialogKaiToast.h" #include "GUIUserMessages.h" +#include "utils/StringUtils.h" +#include "Util.h" #include "input/Key.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/ThreadMessage.h" #include "settings/lib/Setting.h" -#include "settings/Settings.h" -#include "threads/SingleLock.h" -#include "Util.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/XBMCTinyXML.h" -#include "utils/XMLUtils.h" - -#if defined(HAVE_LIBCEC) -#include "bus/virtual/PeripheralBusCEC.h" -#endif - using namespace PERIPHERALS; using namespace XFILE; +using namespace std; CPeripherals::CPeripherals(void) { @@ -70,7 +63,7 @@ Clear(); } -CPeripherals &CPeripherals::GetInstance() +CPeripherals &CPeripherals::Get(void) { static CPeripherals peripheralsInstance; return peripheralsInstance; @@ -107,7 +100,6 @@ } m_bInitialised = true; - KODI::MESSAGING::CApplicationMessenger::GetInstance().RegisterReceiver(this); } } @@ -122,8 +114,8 @@ /* delete mappings */ for (unsigned int iMappingPtr = 0; iMappingPtr < m_mappings.size(); iMappingPtr++) { - std::map settings = m_mappings.at(iMappingPtr).m_settings; - for (std::map::iterator itr = settings.begin(); itr != settings.end(); ++itr) + map settings = m_mappings.at(iMappingPtr).m_settings; + for (map::iterator itr = settings.begin(); itr != settings.end(); ++itr) delete itr->second.m_setting; m_mappings.at(iMappingPtr).m_settings.clear(); } @@ -203,7 +195,7 @@ return NULL; } -int CPeripherals::GetPeripheralsWithFeature(std::vector &results, const PeripheralFeature feature, PeripheralBusType busType /* = PERIPHERAL_BUS_UNKNOWN */) const +int CPeripherals::GetPeripheralsWithFeature(vector &results, const PeripheralFeature feature, PeripheralBusType busType /* = PERIPHERAL_BUS_UNKNOWN */) const { CSingleLock lock(m_critSection); int iReturn(0); @@ -233,7 +225,7 @@ bool CPeripherals::HasPeripheralWithFeature(const PeripheralFeature feature, PeripheralBusType busType /* = PERIPHERAL_BUS_UNKNOWN */) const { - std::vector dummy; + vector dummy; return (GetPeripheralsWithFeature(dummy, feature, busType) > 0); } @@ -336,6 +328,10 @@ void CPeripherals::OnDeviceChanged() { + // refresh peripherals manager + CGUIMessage msgManager(GUI_MSG_UPDATE, WINDOW_DIALOG_PERIPHERAL_MANAGER, 0); + g_windowManager.SendThreadMessage(msgManager, WINDOW_DIALOG_PERIPHERAL_MANAGER); + // refresh settings (peripherals manager could be enabled/disabled now) CGUIMessage msgSettings(GUI_MSG_UPDATE, WINDOW_SETTINGS_SYSTEM, 0); g_windowManager.SendThreadMessage(msgSettings, WINDOW_SETTINGS_SYSTEM); @@ -404,7 +400,7 @@ if (bBusMatch && bProductMatch && bClassMatch) { - for (std::map::const_iterator itr = mapping->m_settings.begin(); itr != mapping->m_settings.end(); ++itr) + for (map::const_iterator itr = mapping->m_settings.begin(); itr != mapping->m_settings.end(); ++itr) peripheral.AddSetting((*itr).first, (*itr).second.m_setting, (*itr).second.m_order); } } @@ -438,10 +434,10 @@ if (currentNode->Attribute("vendor_product")) { // The vendor_product attribute is a list of comma separated vendor:product pairs - std::vector vpArray = StringUtils::Split(currentNode->Attribute("vendor_product"), ","); - for (std::vector::const_iterator i = vpArray.begin(); i != vpArray.end(); ++i) + vector vpArray = StringUtils::Split(currentNode->Attribute("vendor_product"), ","); + for (vector::const_iterator i = vpArray.begin(); i != vpArray.end(); ++i) { - std::vector idArray = StringUtils::Split(*i, ":"); + vector idArray = StringUtils::Split(*i, ":"); if (idArray.size() != 2) { CLog::Log(LOGERROR, "%s - ignoring node \"%s\" with invalid vendor_product attribute", __FUNCTION__, mapping.m_strDeviceName.c_str()); @@ -466,7 +462,7 @@ return true; } -void CPeripherals::GetSettingsFromMappingsFile(TiXmlElement *xmlNode, std::map &settings) +void CPeripherals::GetSettingsFromMappingsFile(TiXmlElement *xmlNode, map &settings) { TiXmlElement *currentNode = xmlNode->FirstChildElement("setting"); int iMaxOrder = 0; @@ -509,11 +505,11 @@ std::string strEnums = XMLUtils::GetAttribute(currentNode, "lvalues"); if (!strEnums.empty()) { - std::vector< std::pair > enums; - std::vector valuesVec; + vector< pair > enums; + vector valuesVec; StringUtils::Tokenize(strEnums, valuesVec, "|"); for (unsigned int i = 0; i < valuesVec.size(); i++) - enums.push_back(std::make_pair(atoi(valuesVec[i].c_str()), atoi(valuesVec[i].c_str()))); + enums.push_back(make_pair(atoi(valuesVec[i].c_str()), atoi(valuesVec[i].c_str()))); int iValue = currentNode->Attribute("value") ? atoi(currentNode->Attribute("value")) : 0; setting = new CSettingInt(strKey, iLabelId, iValue, enums); } @@ -549,7 +545,7 @@ } /* add the settings without an order attribute or an invalid order attribute set at the end */ - for (std::map::iterator it = settings.begin(); it != settings.end(); ++it) + for (map::iterator it = settings.begin(); it != settings.end(); ++it) { if (it->second.m_order == 0) it->second.m_order = ++iMaxOrder; @@ -600,7 +596,7 @@ if (SupportsCEC() && action.GetAmount() && (action.GetID() == ACTION_VOLUME_UP || action.GetID() == ACTION_VOLUME_DOWN)) { - std::vector peripherals; + vector peripherals; if (GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) { for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) @@ -623,7 +619,7 @@ bool CPeripherals::IsMuted(void) { - std::vector peripherals; + vector peripherals; if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) { for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) @@ -639,7 +635,7 @@ bool CPeripherals::ToggleMute(void) { - std::vector peripherals; + vector peripherals; if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) { for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) @@ -659,7 +655,7 @@ bool CPeripherals::ToggleDeviceState(CecStateChange mode /*= STATE_SWITCH_TOGGLE */, unsigned int iPeripheral /*= 0 */) { bool ret(false); - std::vector peripherals; + vector peripherals; if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) { @@ -678,7 +674,7 @@ bool CPeripherals::GetNextKeypress(float frameTime, CKey &key) { - std::vector peripherals; + vector peripherals; if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) { for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) @@ -703,13 +699,13 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_LOCALE_LANGUAGE) + if (settingId == "locale.language") { // user set language, no longer use the TV's language - std::vector cecDevices; + vector cecDevices; if (g_peripherals.GetPeripheralsWithFeature(cecDevices, FEATURE_CEC) > 0) { - for (std::vector::iterator it = cecDevices.begin(); it != cecDevices.end(); ++it) + for (vector::iterator it = cecDevices.begin(); it != cecDevices.end(); ++it) (*it)->SetSetting("use_tv_menu_language", false); } } @@ -721,69 +717,10 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_INPUT_PERIPHERALS) - { - - CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); - - CFileItemList items; - GetDirectory("peripherals://all/", items); - - int iPos = -1; - do - { - pDialog->Reset(); - pDialog->SetHeading(CVariant{35000}); - pDialog->SetUseDetails(true); - pDialog->SetItems(items); - pDialog->SetSelected(iPos); - pDialog->Open(); - - iPos = pDialog->IsConfirmed() ? pDialog->GetSelectedLabel() : -1; - - if (iPos >= 0) - { - CFileItemPtr pItem = items.Get(iPos); - CGUIDialogPeripheralSettings *pSettingsDialog = (CGUIDialogPeripheralSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_PERIPHERAL_SETTINGS); - if (pItem && pSettingsDialog) - { - // pass peripheral item properties to settings dialog so skin authors - // can use it to show more detailed information about the device - pSettingsDialog->SetProperty("vendor", pItem->GetProperty("vendor")); - pSettingsDialog->SetProperty("product", pItem->GetProperty("product")); - pSettingsDialog->SetProperty("bus", pItem->GetProperty("bus")); - pSettingsDialog->SetProperty("location", pItem->GetProperty("location")); - pSettingsDialog->SetProperty("class", pItem->GetProperty("class")); - pSettingsDialog->SetProperty("version", pItem->GetProperty("version")); - - // open settings dialog - pSettingsDialog->SetFileItem(pItem.get()); - pSettingsDialog->Open(); - } - } - } while (pDialog->IsConfirmed()); - } -} - -void CPeripherals::OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg) -{ - switch (pMsg->dwMessage) + if (settingId == "input.peripherals") { - case TMSG_CECTOGGLESTATE: - *static_cast(pMsg->lpVoid) = ToggleDeviceState(STATE_SWITCH_TOGGLE); - break; - - case TMSG_CECACTIVATESOURCE: - ToggleDeviceState(STATE_ACTIVATE_SOURCE); - break; - - case TMSG_CECSTANDBY: - ToggleDeviceState(STATE_STANDBY); - break; + CGUIDialogPeripheralManager *dialog = (CGUIDialogPeripheralManager *)g_windowManager.GetWindow(WINDOW_DIALOG_PERIPHERAL_MANAGER); + if (dialog != NULL) + dialog->DoModal(); } } - -int CPeripherals::GetMessageMask() -{ - return TMSG_MASK_PERIPHERALS; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/peripherals/Peripherals.h kodi-15.2~git20151019.1039-final/xbmc/peripherals/Peripherals.h --- kodi-16.1~git20160425.1001-final/xbmc/peripherals/Peripherals.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/peripherals/Peripherals.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,11 +19,10 @@ * */ +#include "system.h" #include "bus/PeripheralBus.h" #include "devices/Peripheral.h" -#include "messaging/IMessageTarget.h" #include "settings/lib/ISettingCallback.h" -#include "system.h" #include "threads/CriticalSection.h" #include "threads/Thread.h" #include "utils/Observer.h" @@ -37,14 +36,13 @@ namespace PERIPHERALS { - #define g_peripherals CPeripherals::GetInstance() + #define g_peripherals CPeripherals::Get() class CPeripherals : public ISettingCallback, - public Observable, - public KODI::MESSAGING::IMessageTarget + public Observable { public: - static CPeripherals &GetInstance(); + static CPeripherals &Get(void); virtual ~CPeripherals(void); /*! @@ -209,11 +207,8 @@ #endif } - virtual void OnSettingChanged(const CSetting *setting) override; - virtual void OnSettingAction(const CSetting *setting) override; - - virtual void OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg) override; - virtual int GetMessageMask() override; + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); private: CPeripherals(void); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/GUIDialogPictureInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/pictures/GUIDialogPictureInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pictures/GUIDialogPictureInfo.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/GUIDialogPictureInfo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,7 +25,6 @@ #include "input/Key.h" #include "guilib/LocalizeStrings.h" #include "PictureInfoTag.h" -#include "guiinfo/GUIInfoLabels.h" #define CONTROL_PICTURE_INFO 5 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/GUIViewStatePictures.cpp kodi-15.2~git20151019.1039-final/xbmc/pictures/GUIViewStatePictures.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pictures/GUIViewStatePictures.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/GUIViewStatePictures.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -52,7 +52,7 @@ AddSortMethod(SortByDateTaken, 577, LABEL_MASKS("%L", "%t", "%L", "%J")); // Filename, DateTaken | Foldername, Date AddSortMethod(SortByFile, 561, LABEL_MASKS("%L", "%I", "%L", "")); // Filename, Size | FolderName, empty - const CViewState *viewState = CViewStateSettings::GetInstance().Get("pictures"); + const CViewState *viewState = CViewStateSettings::Get().Get("pictures"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -62,7 +62,7 @@ void CGUIViewStateWindowPictures::SaveViewState() { - SaveViewToDb(m_items.GetPath(), WINDOW_PICTURES, CViewStateSettings::GetInstance().Get("pictures")); + SaveViewToDb(m_items.GetPath(), WINDOW_PICTURES, CViewStateSettings::Get().Get("pictures")); } std::string CGUIViewStateWindowPictures::GetLockType() @@ -73,7 +73,7 @@ std::string CGUIViewStateWindowPictures::GetExtensions() { std::string extensions = g_advancedSettings.m_pictureExtensions; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_PICTURES_SHOWVIDEOS)) + if (CSettings::Get().GetBool("pictures.showvideos")) extensions += "|" + g_advancedSettings.m_videoExtensions; return extensions; @@ -81,7 +81,7 @@ VECSOURCES& CGUIViewStateWindowPictures::GetSources() { - VECSOURCES *pictureSources = CMediaSourceSettings::GetInstance().GetSources("pictures"); + VECSOURCES *pictureSources = CMediaSourceSettings::Get().GetSources("pictures"); AddAddonsSource("image", g_localizeStrings.Get(1039), "DefaultAddonPicture.png"); AddOrReplace(*pictureSources, CGUIViewState::GetSources()); return *pictureSources; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/GUIWindowPictures.cpp kodi-15.2~git20151019.1039-final/xbmc/pictures/GUIWindowPictures.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pictures/GUIWindowPictures.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/GUIWindowPictures.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -38,10 +38,8 @@ #include "settings/Settings.h" #include "utils/log.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "Autorun.h" #include "interfaces/AnnouncementManager.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" #include "ContextMenuManager.h" #include "GUIWindowSlideShow.h" @@ -51,6 +49,7 @@ #define CONTROL_BTNSORTASC 4 #define CONTROL_LABELFILES 12 +using namespace std; using namespace XFILE; using namespace PLAYLIST; @@ -109,7 +108,7 @@ { // is this the first time accessing this window? if (m_vecItems->GetPath() == "?" && message.GetStringParam().empty()) - message.SetStringParam(CMediaSourceSettings::GetInstance().GetDefaultSource("pictures")); + message.SetStringParam(CMediaSourceSettings::Get().GetDefaultSource("pictures")); m_dlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); @@ -138,8 +137,8 @@ } else if (iControl == CONTROL_SHUFFLE) { - CSettings::GetInstance().ToggleBool(CSettings::SETTING_SLIDESHOW_SHUFFLE); - CSettings::GetInstance().Save(); + CSettings::Get().ToggleBool("slideshow.shuffle"); + CSettings::Get().Save(); } else if (m_viewControl.HasControl(iControl)) // list/thumb control { @@ -150,7 +149,7 @@ if (iAction == ACTION_DELETE_ITEM) { // is delete allowed? - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_ALLOWFILEDELETION)) + if (CSettings::Get().GetBool("filelists.allowfiledeletion")) OnDeleteItem(iItem); else return false; @@ -162,7 +161,7 @@ } else if (iAction == ACTION_SHOW_INFO) { - OnItemInfo(iItem); + OnInfo(iItem); return true; } } @@ -177,7 +176,7 @@ CGUIMediaWindow::UpdateButtons(); // Update the shuffle button - SET_CONTROL_SELECTED(GetID(), CONTROL_SHUFFLE, CSettings::GetInstance().GetBool(CSettings::SETTING_SLIDESHOW_SHUFFLE)); + SET_CONTROL_SELECTED(GetID(), CONTROL_SHUFFLE, CSettings::Get().GetBool("slideshow.shuffle")); // check we can slideshow or recursive slideshow int nFolders = m_vecItems->GetFolderCount(); @@ -211,7 +210,7 @@ if (StringUtils::EqualsNoCase(items[i]->GetLabel(), "folder.jpg")) items.Remove(i); - if (items.GetFolderCount() == items.Size()) + if (items.GetFolderCount()==items.Size() || !CSettings::Get().GetBool("pictures.usetags")) return; // Start the music info loader thread @@ -234,11 +233,11 @@ { // tag loading takes more then 1.5 secs, show a progress dialog CURL url(items.GetPath()); - m_dlgProgress->SetHeading(CVariant{189}); - m_dlgProgress->SetLine(0, CVariant{505}); - m_dlgProgress->SetLine(1, CVariant{""}); - m_dlgProgress->SetLine(2, CVariant{url.GetWithoutUserDetails()}); - m_dlgProgress->Open(); + m_dlgProgress->SetHeading(189); + m_dlgProgress->SetLine(0, 505); + m_dlgProgress->SetLine(1, ""); + m_dlgProgress->SetLine(2, url.GetWithoutUserDetails()); + m_dlgProgress->StartModal(); m_dlgProgress->ShowProgressBar(true); bProgressVisible = true; } @@ -264,7 +263,7 @@ return false; m_vecItems->SetArt("thumb", ""); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_PICTURES_GENERATETHUMBS)) + if (CSettings::Get().GetBool("pictures.generatethumbs")) m_thumbLoader.Load(*m_vecItems); CPictureThumbLoader thumbLoader; @@ -302,7 +301,7 @@ return false; std::string label; - if (items.GetLabel().empty() && m_rootDir.IsSource(items.GetPath(), CMediaSourceSettings::GetInstance().GetSources("pictures"), &label)) + if (items.GetLabel().empty() && m_rootDir.IsSource(items.GetPath(), CMediaSourceSettings::Get().GetSources("pictures"), &label)) items.SetLabel(label); return true; @@ -342,7 +341,7 @@ CFileItemPtr pItem = m_vecItems->Get(i); if (!pItem->m_bIsFolder && !(URIUtils::IsRAR(pItem->GetPath()) || URIUtils::IsZIP(pItem->GetPath())) && (pItem->IsPicture() || ( - CSettings::GetInstance().GetBool(CSettings::SETTING_PICTURES_SHOWVIDEOS) && + CSettings::Get().GetBool("pictures.showvideos") && pItem->IsVideo()))) { pSlideShow->Add(pItem.get()); @@ -361,7 +360,7 @@ CVariant param; param["player"]["speed"] = 1; param["player"]["playerid"] = PLAYLIST_PICTURE; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPlay", pSlideShow->GetCurrentSlide(), param); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPlay", pSlideShow->GetCurrentSlide(), param); } m_slideShowStarted = true; @@ -407,7 +406,7 @@ SortDescription sorting = m_guiState->GetSortMethod(); pSlideShow->RunSlideShow(strPicture, true, - CSettings::GetInstance().GetBool(CSettings::SETTING_SLIDESHOW_SHUFFLE),false, + CSettings::Get().GetBool("slideshow.shuffle"),false, "", true, sorting.sortBy, sorting.sortOrder, sorting.sortAttributes, strExtensions); @@ -483,7 +482,7 @@ if (!m_thumbLoader.IsLoading()) buttons.Add(CONTEXT_BUTTON_REFRESH_THUMBS, 13315); // Create Thumbnails - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_ALLOWFILEDELETION) && !item->IsReadOnly()) + if (CSettings::Get().GetBool("filelists.allowfiledeletion") && !item->IsReadOnly()) { buttons.Add(CONTEXT_BUTTON_DELETE, 117); buttons.Add(CONTEXT_BUTTON_RENAME, 118); @@ -500,8 +499,10 @@ } } CGUIMediaWindow::GetContextButtons(itemNumber, buttons); + if (item && !item->GetProperty("pluginreplacecontextitems").asBoolean()) + buttons.Add(CONTEXT_BUTTON_SETTINGS, 5); // Settings - CContextMenuManager::GetInstance().AddVisibleItems(item, buttons); + CContextMenuManager::Get().AddVisibleItems(item, buttons); } bool CGUIWindowPictures::OnContextButton(int itemNumber, CONTEXT_BUTTON button) @@ -525,7 +526,7 @@ OnSlideShowRecursive(item->GetPath()); return true; case CONTEXT_BUTTON_INFO: - OnItemInfo(itemNumber); + OnInfo(itemNumber); return true; case CONTEXT_BUTTON_REFRESH_THUMBS: OnRegenerateThumbs(); @@ -536,6 +537,9 @@ case CONTEXT_BUTTON_RENAME: OnRenameItem(itemNumber); return true; + case CONTEXT_BUTTON_SETTINGS: + g_windowManager.ActivateWindow(WINDOW_SETTINGS_MYPICTURES); + return true; case CONTEXT_BUTTON_GOTO_ROOT: Update(""); return true; @@ -556,12 +560,12 @@ void CGUIWindowPictures::LoadPlayList(const std::string& strPlayList) { CLog::Log(LOGDEBUG,"CGUIWindowPictures::LoadPlayList()... converting playlist into slideshow: %s", strPlayList.c_str()); - std::unique_ptr pPlayList (CPlayListFactory::Create(strPlayList)); + unique_ptr pPlayList (CPlayListFactory::Create(strPlayList)); if ( NULL != pPlayList.get()) { if (!pPlayList->Load(strPlayList)) { - CGUIDialogOK::ShowAndGetInput(CVariant{6}, CVariant{477}); + CGUIDialogOK::ShowAndGetInput(6, 477); return ; //hmmm unable to load playlist? } } @@ -593,7 +597,7 @@ } } -void CGUIWindowPictures::OnItemInfo(int itemNumber) +void CGUIWindowPictures::OnInfo(int itemNumber) { CFileItemPtr item = (itemNumber >= 0 && itemNumber < m_vecItems->Size()) ? m_vecItems->Get(itemNumber) : CFileItemPtr(); if (!item) @@ -609,7 +613,7 @@ if (pictureInfo) { pictureInfo->SetPicture(item.get()); - pictureInfo->Open(); + pictureInfo->DoModal(); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/GUIWindowPictures.h kodi-15.2~git20151019.1039-final/xbmc/pictures/GUIWindowPictures.h --- kodi-16.1~git20160425.1001-final/xbmc/pictures/GUIWindowPictures.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/GUIWindowPictures.h 2015-06-14 19:32:51.000000000 +0000 @@ -36,7 +36,7 @@ protected: virtual bool GetDirectory(const std::string &strDirectory, CFileItemList& items); - virtual void OnItemInfo(int item); + virtual void OnInfo(int item); virtual bool OnClick(int iItem); virtual void UpdateButtons(); virtual void OnPrepareFileItems(CFileItemList& items); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/GUIWindowSlideShow.cpp kodi-15.2~git20151019.1039-final/xbmc/pictures/GUIWindowSlideShow.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pictures/GUIWindowSlideShow.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/GUIWindowSlideShow.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -22,7 +22,7 @@ #include "system.h" #include "GUIWindowSlideShow.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "utils/URIUtils.h" #include "URL.h" #include "guilib/TextureManager.h" @@ -41,13 +41,11 @@ #include "guilib/LocalizeStrings.h" #include "threads/SingleLock.h" #include "utils/log.h" -#include "utils/Variant.h" #include "interfaces/AnnouncementManager.h" #include "pictures/GUIViewStatePictures.h" #include "pictures/PictureThumbLoader.h" using namespace XFILE; -using namespace KODI::MESSAGING; #define MAX_ZOOM_FACTOR 10 #define MAX_PICTURE_SIZE 2048*2048 @@ -72,15 +70,10 @@ static float zoomamount[10] = { 1.0f, 1.2f, 1.5f, 2.0f, 2.8f, 4.0f, 6.0f, 9.0f, 13.5f, 20.0f }; -CBackgroundPicLoader::CBackgroundPicLoader() - : CThread("BgPicLoader") - , m_iPic{0} - , m_iSlideNumber{0} - , m_maxWidth{0} - , m_maxHeight{0} - , m_isLoading{false} - , m_pCallback{nullptr} +CBackgroundPicLoader::CBackgroundPicLoader() : CThread("BgPicLoader") { + m_pCallback = NULL; + m_isLoading = false; } CBackgroundPicLoader::~CBackgroundPicLoader() @@ -106,7 +99,7 @@ if (m_pCallback) { unsigned int start = XbmcThreads::SystemClockMillis(); - CBaseTexture* texture = CTexture::LoadFromFile(m_strFileName, m_maxWidth, m_maxHeight); + CBaseTexture* texture = CTexture::LoadFromFile(m_strFileName, m_maxWidth, m_maxHeight, CSettings::Get().GetBool("pictures.useexifrotation")); totalTime += XbmcThreads::SystemClockMillis() - start; count++; // tell our parent @@ -153,7 +146,6 @@ m_slides = new CFileItemList; m_Resolution = RES_INVALID; m_loadType = KEEP_IN_MEMORY; - m_bLoadNextPic = false; Reset(); } @@ -168,7 +160,7 @@ CVariant param; param["player"]["speed"] = m_bSlideShow && !m_bPause ? 1 : 0; param["player"]["playerid"] = PLAYLIST_PICTURE; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPlay", item, param); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPlay", item, param); } void CGUIWindowSlideShow::AnnouncePlayerPause(const CFileItemPtr& item) @@ -176,7 +168,7 @@ CVariant param; param["player"]["speed"] = 0; param["player"]["playerid"] = PLAYLIST_PICTURE; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPause", item, param); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPause", item, param); } void CGUIWindowSlideShow::AnnouncePlayerStop(const CFileItemPtr& item) @@ -184,7 +176,7 @@ CVariant param; param["player"]["playerid"] = PLAYLIST_PICTURE; param["end"] = true; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Player, "xbmc", "OnStop", item, param); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Player, "xbmc", "OnStop", item, param); } void CGUIWindowSlideShow::AnnouncePlaylistRemove(int pos) @@ -192,14 +184,14 @@ CVariant data; data["playlistid"] = PLAYLIST_PICTURE; data["position"] = pos; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnRemove", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnRemove", data); } void CGUIWindowSlideShow::AnnouncePlaylistClear() { CVariant data; data["playlistid"] = PLAYLIST_PICTURE; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnClear", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnClear", data); } void CGUIWindowSlideShow::AnnouncePlaylistAdd(const CFileItemPtr& item, int pos) @@ -207,7 +199,7 @@ CVariant data; data["playlistid"] = PLAYLIST_PICTURE; data["position"] = pos; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnAdd", item, data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnAdd", item, data); } void CGUIWindowSlideShow::AnnouncePropertyChanged(const std::string &strProperty, const CVariant &value) @@ -218,7 +210,7 @@ CVariant data; data["player"]["playerid"] = PLAYLIST_PICTURE; data["property"][strProperty] = value; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPropertyChanged", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPropertyChanged", data); } bool CGUIWindowSlideShow::IsPlaying() const @@ -257,16 +249,18 @@ void CGUIWindowSlideShow::OnDeinitWindow(int nextWindowID) { - if (m_Resolution != CDisplaySettings::GetInstance().GetCurrentResolution()) + if (m_Resolution != CDisplaySettings::Get().GetCurrentResolution()) { //FIXME: Use GUI resolution for now - //g_graphicsContext.SetVideoResolution(CDisplaySettings::GetInstance().GetCurrentResolution(), TRUE); + //g_graphicsContext.SetVideoResolution(CDisplaySettings::Get().GetCurrentResolution(), TRUE); } // Reset(); if (nextWindowID != WINDOW_PICTURES) m_ImageLib.Unload(); + g_windowManager.ShowOverlay(OVERLAY_STATE_SHOWN); + if (nextWindowID != WINDOW_FULLSCREEN_VIDEO) { // wait for any outstanding picture loads @@ -767,7 +761,7 @@ if (pictureInfo) { // no need to set the picture here, it's done in Render() - pictureInfo->Open(); + pictureInfo->DoModal(); } } break; @@ -858,7 +852,7 @@ case ACTION_GESTURE_SWIPE_DOWN: if (m_iZoomFactor == 1 || !m_Image[m_iCurrentPic].m_bCanMoveVertically) { - bool swipeOnLeft = action.GetAmount() < g_graphicsContext.GetWidth() / 2.0f; + bool swipeOnLeft = action.GetAmount() < g_graphicsContext.GetWidth() / 2; bool swipeUp = action.GetID() == ACTION_GESTURE_SWIPE_UP; if (swipeUp == swipeOnLeft) Rotate(90.0f); @@ -927,10 +921,10 @@ { case GUI_MSG_WINDOW_INIT: { - m_Resolution = (RESOLUTION) CSettings::GetInstance().GetInt(CSettings::SETTING_PICTURES_DISPLAYRESOLUTION); + m_Resolution = (RESOLUTION) CSettings::Get().GetInt("pictures.displayresolution"); //FIXME: Use GUI resolution for now - if (0 /*m_Resolution != CDisplaySettings::GetInstance().GetCurrentResolution() && m_Resolution != INVALID && m_Resolution!=AUTORES*/) + if (0 /*m_Resolution != CDisplaySettings::Get().GetCurrentResolution() && m_Resolution != INVALID && m_Resolution!=AUTORES*/) g_graphicsContext.SetVideoResolution(m_Resolution); else m_Resolution = g_graphicsContext.GetVideoResolution(); @@ -939,6 +933,8 @@ if (message.GetParam1() != WINDOW_PICTURES) m_ImageLib.Load(); + g_windowManager.ShowOverlay(OVERLAY_STATE_HIDDEN); + // turn off slideshow if we only have 1 image if (m_slides->Size() <= 1) m_bSlideShow = false; @@ -1133,7 +1129,7 @@ CSlideShowPic::DISPLAY_EFFECT CGUIWindowSlideShow::GetDisplayEffect(int iSlideNumber) const { if (m_bSlideShow && !m_bPause && !m_slides->Get(iSlideNumber)->IsVideo()) - return CSettings::GetInstance().GetBool(CSettings::SETTING_SLIDESHOW_DISPLAYEFFECTS) ? CSlideShowPic::EFFECT_RANDOM : CSlideShowPic::EFFECT_NONE; + return CSettings::Get().GetBool("slideshow.displayeffects") ? CSlideShowPic::EFFECT_RANDOM : CSlideShowPic::EFFECT_NONE; else return CSlideShowPic::EFFECT_NO_TIMEOUT; } @@ -1239,7 +1235,7 @@ bRandom = bNotRandom = false; // NotRandom overrides the window setting - if ((!bNotRandom && CSettings::GetInstance().GetBool(CSettings::SETTING_SLIDESHOW_SHUFFLE)) || bRandom) + if ((!bNotRandom && CSettings::Get().GetBool("slideshow.shuffle")) || bRandom) Shuffle(); if (!beginSlidePath.empty()) @@ -1252,7 +1248,7 @@ CVariant param; param["player"]["speed"] = 0; param["player"]["playerid"] = PLAYLIST_PICTURE; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPlay", GetCurrentSlide(), param); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPlay", GetCurrentSlide(), param); } g_windowManager.ActivateWindow(WINDOW_SLIDESHOW); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/Makefile kodi-15.2~git20151019.1039-final/xbmc/pictures/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/pictures/Makefile 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -5,7 +5,6 @@ Picture.cpp \ PictureInfoLoader.cpp \ PictureInfoTag.cpp \ - PictureScalingAlgorithm.cpp \ PictureThumbLoader.cpp \ SlideShowPicture.cpp \ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/Picture.cpp kodi-15.2~git20151019.1039-final/xbmc/pictures/Picture.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pictures/Picture.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/Picture.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -129,21 +129,16 @@ return success; } -bool CPicture::ResizeTexture(const std::string &image, CBaseTexture *texture, - uint32_t &dest_width, uint32_t &dest_height, uint8_t* &result, size_t& result_size, - CPictureScalingAlgorithm::Algorithm scalingAlgorithm /* = CPictureScalingAlgorithm::NoAlgorithm */) +bool CPicture::ResizeTexture(const std::string &image, CBaseTexture *texture, uint32_t &dest_width, uint32_t &dest_height, uint8_t* &result, size_t& result_size) { if (image.empty() || texture == NULL) return false; return ResizeTexture(image, texture->GetPixels(), texture->GetWidth(), texture->GetHeight(), texture->GetPitch(), - dest_width, dest_height, result, result_size, - scalingAlgorithm); + dest_width, dest_height, result, result_size); } -bool CPicture::ResizeTexture(const std::string &image, uint8_t *pixels, uint32_t width, uint32_t height, uint32_t pitch, - uint32_t &dest_width, uint32_t &dest_height, uint8_t* &result, size_t& result_size, - CPictureScalingAlgorithm::Algorithm scalingAlgorithm /* = CPictureScalingAlgorithm::NoAlgorithm */) +bool CPicture::ResizeTexture(const std::string &image, uint8_t *pixels, uint32_t width, uint32_t height, uint32_t pitch, uint32_t &dest_width, uint32_t &dest_height, uint8_t* &result, size_t& result_size) { if (image.empty() || pixels == NULL) return false; @@ -183,7 +178,7 @@ return false; } - if (!ScaleImage(pixels, width, height, pitch, buffer, dest_width, dest_height, dest_width * sizeof(uint32_t), scalingAlgorithm)) + if (!ScaleImage(pixels, width, height, pitch, buffer, dest_width, dest_height, dest_width * sizeof(uint32_t))) { delete[] buffer; result = NULL; @@ -203,24 +198,19 @@ return success; } -bool CPicture::CacheTexture(CBaseTexture *texture, uint32_t &dest_width, uint32_t &dest_height, const std::string &dest, - CPictureScalingAlgorithm::Algorithm scalingAlgorithm /* = CPictureScalingAlgorithm::NoAlgorithm */) +bool CPicture::CacheTexture(CBaseTexture *texture, uint32_t &dest_width, uint32_t &dest_height, const std::string &dest) { return CacheTexture(texture->GetPixels(), texture->GetWidth(), texture->GetHeight(), texture->GetPitch(), - texture->GetOrientation(), dest_width, dest_height, dest, scalingAlgorithm); + texture->GetOrientation(), dest_width, dest_height, dest); } -bool CPicture::CacheTexture(uint8_t *pixels, uint32_t width, uint32_t height, uint32_t pitch, int orientation, - uint32_t &dest_width, uint32_t &dest_height, const std::string &dest, - CPictureScalingAlgorithm::Algorithm scalingAlgorithm /* = CPictureScalingAlgorithm::NoAlgorithm */) +bool CPicture::CacheTexture(uint8_t *pixels, uint32_t width, uint32_t height, uint32_t pitch, int orientation, uint32_t &dest_width, uint32_t &dest_height, const std::string &dest) { // if no max width or height is specified, don't resize if (dest_width == 0) dest_width = width; if (dest_height == 0) dest_height = height; - if (scalingAlgorithm == CPictureScalingAlgorithm::NoAlgorithm) - scalingAlgorithm = g_advancedSettings.m_imageScalingAlgorithm; uint32_t max_height = g_advancedSettings.m_imageRes; if (g_advancedSettings.m_fanartRes > g_advancedSettings.m_imageRes) @@ -248,8 +238,7 @@ if (buffer) { if (ScaleImage(pixels, width, height, pitch, - (uint8_t *)buffer, dest_width, dest_height, dest_width * 4, - scalingAlgorithm)) + (uint8_t *)buffer, dest_width, dest_height, dest_width * 4)) { if (!orientation || OrientateImage(buffer, dest_width, dest_height, orientation)) { @@ -290,7 +279,7 @@ int y = i / num_across; // load in the image unsigned int width = tile_width - 2*tile_gap, height = tile_height - 2*tile_gap; - CBaseTexture *texture = CTexture::LoadFromFile(files[i], width, height, true); + CBaseTexture *texture = CTexture::LoadFromFile(files[i], width, height, CSettings::Get().GetBool("pictures.useexifrotation"), true); if (texture && texture->GetWidth() && texture->GetHeight()) { GetScale(texture->GetWidth(), texture->GetHeight(), width, height); @@ -339,12 +328,11 @@ } bool CPicture::ScaleImage(uint8_t *in_pixels, unsigned int in_width, unsigned int in_height, unsigned int in_pitch, - uint8_t *out_pixels, unsigned int out_width, unsigned int out_height, unsigned int out_pitch, - CPictureScalingAlgorithm::Algorithm scalingAlgorithm /* = CPictureScalingAlgorithm::NoAlgorithm */) + uint8_t *out_pixels, unsigned int out_width, unsigned int out_height, unsigned int out_pitch) { struct SwsContext *context = sws_getContext(in_width, in_height, PIX_FMT_BGRA, out_width, out_height, PIX_FMT_BGRA, - CPictureScalingAlgorithm::ToSwscale(scalingAlgorithm) | SwScaleCPUFlags(), NULL, NULL, NULL); + SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); uint8_t *src[] = { in_pixels, 0, 0, 0 }; int srcStride[] = { (int)in_pitch, 0, 0, 0 }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/Picture.h kodi-15.2~git20151019.1039-final/xbmc/pictures/Picture.h --- kodi-16.1~git20160425.1001-final/xbmc/pictures/Picture.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/Picture.h 2015-10-19 08:39:16.000000000 +0000 @@ -18,13 +18,10 @@ * . * */ - +#include "utils/Job.h" #include #include -#include "pictures/PictureScalingAlgorithm.h" -#include "utils/Job.h" - class CBaseTexture; class CPicture @@ -39,12 +36,8 @@ */ static bool CreateTiledThumb(const std::vector &files, const std::string &thumb); - static bool ResizeTexture(const std::string &image, CBaseTexture *texture, - uint32_t &dest_width, uint32_t &dest_height, uint8_t* &result, size_t& result_size, - CPictureScalingAlgorithm::Algorithm scalingAlgorithm = CPictureScalingAlgorithm::NoAlgorithm); - static bool ResizeTexture(const std::string &image, uint8_t *pixels, uint32_t width, uint32_t height, uint32_t pitch, - uint32_t &dest_width, uint32_t &dest_height, uint8_t* &result, size_t& result_size, - CPictureScalingAlgorithm::Algorithm scalingAlgorithm = CPictureScalingAlgorithm::NoAlgorithm); + static bool ResizeTexture(const std::string &image, CBaseTexture *texture, uint32_t &dest_width, uint32_t &dest_height, uint8_t* &result, size_t& result_size); + static bool ResizeTexture(const std::string &image, uint8_t *pixels, uint32_t width, uint32_t height, uint32_t pitch, uint32_t &dest_width, uint32_t &dest_height, uint8_t* &result, size_t& result_size); /*! \brief Cache a texture, resizing, rotating and flipping as needed, and saving as a JPG or PNG \param texture a pointer to a CBaseTexture @@ -53,17 +46,13 @@ \param dest the output cache file \return true if successful, false otherwise */ - static bool CacheTexture(CBaseTexture *texture, uint32_t &dest_width, uint32_t &dest_height, const std::string &dest, - CPictureScalingAlgorithm::Algorithm scalingAlgorithm = CPictureScalingAlgorithm::NoAlgorithm); - static bool CacheTexture(uint8_t *pixels, uint32_t width, uint32_t height, uint32_t pitch, int orientation, - uint32_t &dest_width, uint32_t &dest_height, const std::string &dest, - CPictureScalingAlgorithm::Algorithm scalingAlgorithm = CPictureScalingAlgorithm::NoAlgorithm); + static bool CacheTexture(CBaseTexture *texture, uint32_t &dest_width, uint32_t &dest_height, const std::string &dest); + static bool CacheTexture(uint8_t *pixels, uint32_t width, uint32_t height, uint32_t pitch, int orientation, uint32_t &dest_width, uint32_t &dest_height, const std::string &dest); private: static void GetScale(unsigned int width, unsigned int height, unsigned int &out_width, unsigned int &out_height); static bool ScaleImage(uint8_t *in_pixels, unsigned int in_width, unsigned int in_height, unsigned int in_pitch, - uint8_t *out_pixels, unsigned int out_width, unsigned int out_height, unsigned int out_pitch, - CPictureScalingAlgorithm::Algorithm scalingAlgorithm = CPictureScalingAlgorithm::NoAlgorithm); + uint8_t *out_pixels, unsigned int out_width, unsigned int out_height, unsigned int out_pitch); static bool OrientateImage(uint32_t *&pixels, unsigned int &width, unsigned int &height, int orientation); static bool FlipHorizontal(uint32_t *&pixels, unsigned int &width, unsigned int &height); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureInfoLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureInfoLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureInfoLoader.cpp 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureInfoLoader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,7 +26,6 @@ CPictureInfoLoader::CPictureInfoLoader() { m_mapFileItems = new CFileItemList; - m_tagReads = 0; } CPictureInfoLoader::~CPictureInfoLoader() @@ -43,6 +42,7 @@ m_mapFileItems->SetFastLookup(true); m_tagReads = 0; + m_loadTags = CSettings::Get().GetBool("pictures.usetags"); if (m_pProgressCallback) m_pProgressCallback->SetProgressMax(m_pVecItems->GetFileCount()); @@ -87,8 +87,11 @@ if (pItem->HasPictureInfoTag()) return false; - pItem->GetPictureInfoTag()->Load(pItem->GetPath()); - m_tagReads++; + if (m_loadTags) + { // Nothing found, load tag from file + pItem->GetPictureInfoTag()->Load(pItem->GetPath()); + m_tagReads++; + } return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureInfoLoader.h kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureInfoLoader.h --- kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureInfoLoader.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureInfoLoader.h 2015-10-19 08:39:16.000000000 +0000 @@ -39,5 +39,6 @@ CFileItemList* m_mapFileItems; unsigned int m_tagReads; + bool m_loadTags; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureInfoTag.cpp kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureInfoTag.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureInfoTag.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureInfoTag.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -28,6 +28,8 @@ #include "utils/StringUtils.h" #include "utils/Archive.h" +using namespace std; + void CPictureInfoTag::Reset() { memset(&m_exifInfo, 0, sizeof(m_exifInfo)); @@ -281,7 +283,7 @@ { std::string temp; ar >> temp; - length = std::min((size_t)temp.size(), length - 1); + length = min((size_t)temp.size(), length - 1); if (!temp.empty()) memcpy(string, temp.c_str(), length); string[length] = 0; @@ -325,8 +327,6 @@ } break; case SLIDE_COMMENT: - g_charsetConverter.unknownToUTF8(m_exifInfo.FileComment, value); - break; case SLIDE_EXIF_COMMENT: // The charset used for the UserComment is stored in CommentsCharset: // Ascii, Unicode (UCS2), JIS (X208-1990), Unknown (application specific) @@ -343,16 +343,6 @@ g_charsetConverter.unknownToUTF8(m_exifInfo.Comments, value); } break; - case SLIDE_EXIF_XPCOMMENT: - if (m_exifInfo.XPCommentsCharset == EXIF_COMMENT_CHARSET_UNICODE) - { - g_charsetConverter.ucs2ToUTF8(std::u16string((char16_t*)m_exifInfo.XPComment), value); - } - else - { - value = "Illegal charset used."; - } - break; case SLIDE_EXIF_LONG_DATE_TIME: if (m_dateTimeTaken.IsValid()) value = m_dateTimeTaken.GetAsLocalizedDateTime(true); @@ -624,7 +614,7 @@ { case SLIDE_RESOLUTION: { - std::vector dimension; + vector dimension; StringUtils::Tokenize(value, dimension, ","); if (dimension.size() == 2) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureInfoTag.h kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureInfoTag.h --- kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureInfoTag.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureInfoTag.h 2015-10-19 08:39:16.000000000 +0000 @@ -63,7 +63,6 @@ #define SLIDE_EXIF_GPS_LONGITUDE 941 #define SLIDE_EXIF_GPS_ALTITUDE 942 #define SLIDE_EXIF_ORIENTATION 943 -#define SLIDE_EXIF_XPCOMMENT 944 #define SLIDE_IPTC_SUBLOCATION 957 #define SLIDE_IPTC_IMAGETYPE 958 @@ -90,8 +89,6 @@ #define SLIDE_IPTC_COUNTRY_CODE 979 #define SLIDE_IPTC_REF_SERVICE 980 -class CVariant; - class CPictureInfoTag : public IArchivable, public ISerializable, public ISortable { public: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureScalingAlgorithm.cpp kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureScalingAlgorithm.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureScalingAlgorithm.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureScalingAlgorithm.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include - -extern "C" { -#include "libswscale/swscale.h" -} - -#include "PictureScalingAlgorithm.h" -#include "utils/StringUtils.h" - -CPictureScalingAlgorithm::Algorithm CPictureScalingAlgorithm::Default = CPictureScalingAlgorithm::Bicubic; - -CPictureScalingAlgorithm::AlgorithmMap CPictureScalingAlgorithm::m_algorithms = { - { FastBilinear, { "fast_bilinear", SWS_FAST_BILINEAR } }, - { Bilinear, { "bilinear", SWS_BILINEAR } }, - { Bicubic, { "bicubic", SWS_BICUBIC } }, - { Experimental, { "experimental", SWS_X } }, - { NearestNeighbor, { "nearest_neighbor", SWS_POINT } }, - { AveragingArea, { "averaging_area", SWS_AREA } }, - { Bicublin, { "bicublin", SWS_BICUBLIN } }, - { Gaussian, { "gaussian", SWS_GAUSS } }, - { Sinc, { "sinc", SWS_SINC } }, - { Lanczos, { "lanczos", SWS_LANCZOS } }, - { BicubicSpline, { "bicubic_spline", SWS_SPLINE } }, -}; - -CPictureScalingAlgorithm::Algorithm CPictureScalingAlgorithm::FromString(const std::string& scalingAlgorithm) -{ - const auto& algorithm = std::find_if(m_algorithms.begin(), m_algorithms.end(), - [&scalingAlgorithm](const std::pair& algo) { return StringUtils::EqualsNoCase(algo.second.name, scalingAlgorithm); }); - if (algorithm != m_algorithms.end()) - return algorithm->first; - - return NoAlgorithm; -} - -std::string CPictureScalingAlgorithm::ToString(Algorithm scalingAlgorithm) -{ - const auto& algorithm = m_algorithms.find(scalingAlgorithm); - if (algorithm != m_algorithms.end()) - return algorithm->second.name; - - return ""; -} - -int CPictureScalingAlgorithm::ToSwscale(const std::string& scalingAlgorithm) -{ - return ToSwscale(FromString(scalingAlgorithm)); -} - -int CPictureScalingAlgorithm::ToSwscale(Algorithm scalingAlgorithm) -{ - const auto& algorithm = m_algorithms.find(scalingAlgorithm); - if (algorithm != m_algorithms.end()) - return algorithm->second.swscale; - - return ToSwscale(Default); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureScalingAlgorithm.h kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureScalingAlgorithm.h --- kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureScalingAlgorithm.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureScalingAlgorithm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include -#include - -class CPictureScalingAlgorithm -{ -public: - typedef enum Algorithm - { - NoAlgorithm, - FastBilinear, - Bilinear, - Bicubic, - Experimental, - NearestNeighbor, - AveragingArea, - Bicublin, - Gaussian, - Sinc, - Lanczos, - BicubicSpline - } Algorithm; - - static Algorithm Default; - - static Algorithm FromString(const std::string& scalingAlgorithm); - static std::string ToString(Algorithm scalingAlgorithm); - static int ToSwscale(const std::string& scalingAlgorithm); - static int ToSwscale(Algorithm scalingAlgorithm); - -private: - CPictureScalingAlgorithm(); - - typedef struct ScalingAlgorithm - { - std::string name; - int swscale; - } ScalingAlgorithm; - - typedef std::map AlgorithmMap; - static AlgorithmMap m_algorithms; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureThumbLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureThumbLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pictures/PictureThumbLoader.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/PictureThumbLoader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -34,6 +34,7 @@ #include "URL.h" using namespace XFILE; +using namespace std; CPictureThumbLoader::CPictureThumbLoader() : CThumbLoader(), CJobQueue(true, 1, CJob::PRIORITY_LOW_PAUSABLE) { @@ -67,7 +68,7 @@ if (pItem->HasArt("thumb") && m_regenerateThumbs) { - CTextureCache::GetInstance().ClearCachedImage(pItem->GetArt("thumb")); + CTextureCache::Get().ClearCachedImage(pItem->GetArt("thumb")); if (m_textureDatabase->Open()) { m_textureDatabase->ClearTextureForPath(pItem->GetPath(), "thumb"); @@ -87,11 +88,11 @@ if (!loader.FillThumb(*pItem)) { std::string thumbURL = CVideoThumbLoader::GetEmbeddedThumbURL(*pItem); - if (CTextureCache::GetInstance().HasCachedImage(thumbURL)) + if (CTextureCache::Get().HasCachedImage(thumbURL)) { thumb = thumbURL; } - else if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_EXTRACTTHUMB) && CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_EXTRACTFLAGS)) + else if (CSettings::Get().GetBool("myvideos.extractthumb") && CSettings::Get().GetBool("myvideos.extractflags")) { CFileItem item(*pItem); CThumbExtractor* extract = new CThumbExtractor(item, pItem->GetPath(), true, thumbURL); @@ -106,7 +107,7 @@ } if (!thumb.empty()) { - CTextureCache::GetInstance().BackgroundCacheImage(thumb); + CTextureCache::Get().BackgroundCacheImage(thumb); pItem->SetArt("thumb", thumb); } pItem->FillInDefaultIcon(); @@ -144,7 +145,7 @@ if (CFile::Exists(strTBN)) { db.SetTextureForPath(pItem->GetPath(), "thumb", strTBN); - CTextureCache::GetInstance().BackgroundCacheImage(strTBN); + CTextureCache::Get().BackgroundCacheImage(strTBN); pItem->SetArt("thumb", strTBN); return; } @@ -171,7 +172,7 @@ if (CFile::Exists(thumb)) { db.SetTextureForPath(pItem->GetPath(), "thumb", thumb); - CTextureCache::GetInstance().BackgroundCacheImage(thumb); + CTextureCache::Get().BackgroundCacheImage(thumb); pItem->SetArt("thumb", thumb); return; } @@ -225,14 +226,14 @@ items.Sort(SortByLabel, SortOrderAscending); std::string thumb = CTextureUtils::GetWrappedThumbURL(items[0]->GetPath()); db.SetTextureForPath(pItem->GetPath(), "thumb", thumb); - CTextureCache::GetInstance().BackgroundCacheImage(thumb); + CTextureCache::Get().BackgroundCacheImage(thumb); pItem->SetArt("thumb", thumb); } else { // ok, now we've got the files to get the thumbs from, lets create it... // we basically load the 4 images and combine them - std::vector files; + vector files; for (int thumb = 0; thumb < 4; thumb++) files.push_back(items[thumb]->GetPath()); std::string thumb = CTextureUtils::GetWrappedImageURL(pItem->GetPath(), "picturefolder"); @@ -243,7 +244,7 @@ details.file = relativeCacheFile; details.width = g_advancedSettings.GetThumbSize(); details.height = g_advancedSettings.GetThumbSize(); - CTextureCache::GetInstance().AddCachedTexture(thumb, details); + CTextureCache::Get().AddCachedTexture(thumb, details); db.SetTextureForPath(pItem->GetPath(), "thumb", thumb); pItem->SetArt("thumb", CTextureCache::GetCachedPath(relativeCacheFile)); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/SlideShowPicture.cpp kodi-15.2~git20151019.1039-final/xbmc/pictures/SlideShowPicture.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pictures/SlideShowPicture.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/SlideShowPicture.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -31,6 +31,8 @@ #endif #include +using namespace std; + #define IMMEDIATE_TRANSISTION_TIME 20 #define PICTURE_MOVE_AMOUNT 0.02f @@ -52,9 +54,6 @@ m_bCanMoveHorizontally = false; m_bCanMoveVertically = false; -#ifdef HAS_DX - m_vb = NULL; -#endif } CSlideShowPic::~CSlideShowPic() @@ -75,9 +74,6 @@ m_bDrawNextImage = false; m_bTransistionImmediately = false; m_bIsDirty = true; -#ifdef HAS_DX - SAFE_RELEASE(m_vb); -#endif } void CSlideShowPic::Reset(DISPLAY_EFFECT dispEffect, TRANSISTION_EFFECT transEffect) @@ -125,7 +121,7 @@ // the +1's make sure it actually occurs float fadeTime = 0.2f; if (m_displayEffect != EFFECT_NO_TIMEOUT) - fadeTime = std::min(0.2f*CSettings::GetInstance().GetInt(CSettings::SETTING_SLIDESHOW_STAYTIME), 3.0f); + fadeTime = std::min(0.2f*CSettings::Get().GetInt("slideshow.staytime"), 3.0f); m_transistionStart.length = (int)(g_graphicsContext.GetFPS() * fadeTime); // transition time in frames m_transistionEnd.type = transEffect; m_transistionEnd.length = m_transistionStart.length; @@ -161,7 +157,7 @@ m_fPosX = m_fPosY = 0.0f; m_fPosZ = 1.0f; m_fVelocityX = m_fVelocityY = m_fVelocityZ = 0.0f; - int iFrames = std::max((int)(g_graphicsContext.GetFPS() * CSettings::GetInstance().GetInt(CSettings::SETTING_SLIDESHOW_STAYTIME)), 1); + int iFrames = max((int)(g_graphicsContext.GetFPS() * CSettings::Get().GetInt("slideshow.staytime")), 1); if (m_displayEffect == EFFECT_PANORAMA) { RESOLUTION_INFO res = g_graphicsContext.GetResInfo(); @@ -371,9 +367,9 @@ else if (m_displayEffect == EFFECT_ZOOM) { m_fPosZ += m_fVelocityZ; -/* if (m_fPosZ > 1.0f + 0.01f*CSettings::GetInstance().GetInt("Slideshow.ZoomAmount")) +/* if (m_fPosZ > 1.0f + 0.01f*CSettings::Get().GetInt("Slideshow.ZoomAmount")) { - m_fPosZ = 1.0f + 0.01f * CSettings::GetInstance().GetInt("Slideshow.ZoomAmount"); + m_fPosZ = 1.0f + 0.01f * CSettings::Get().GetInt("Slideshow.ZoomAmount"); m_fVelocityZ = -m_fVelocityZ; } if (m_fPosZ < 1.0f) @@ -702,7 +698,7 @@ m_transistionTemp.length = IMMEDIATE_TRANSISTION_TIME; m_fTransistionAngle = (float)fRotateAngle / (float)m_transistionTemp.length; // reset the timer - m_transistionEnd.start = m_iCounter + m_transistionStart.length + (int)(g_graphicsContext.GetFPS() * CSettings::GetInstance().GetInt(CSettings::SETTING_SLIDESHOW_STAYTIME)); + m_transistionEnd.start = m_iCounter + m_transistionStart.length + (int)(g_graphicsContext.GetFPS() * CSettings::Get().GetInt("slideshow.staytime")); } void CSlideShowPic::Zoom(float fZoom, bool immediate /* = false */) @@ -719,7 +715,7 @@ m_transistionTemp.length = IMMEDIATE_TRANSISTION_TIME; m_fTransistionZoom = (fZoom - m_fZoomAmount) / (float)m_transistionTemp.length; // reset the timer - m_transistionEnd.start = m_iCounter + m_transistionStart.length + (int)(g_graphicsContext.GetFPS() * CSettings::GetInstance().GetInt(CSettings::SETTING_SLIDESHOW_STAYTIME)); + m_transistionEnd.start = m_iCounter + m_transistionStart.length + (int)(g_graphicsContext.GetFPS() * CSettings::Get().GetInt("slideshow.staytime")); // turn off the render effects until we're back down to normal zoom m_bNoEffect = true; } @@ -729,7 +725,7 @@ m_fZoomLeft += fDeltaX; m_fZoomTop += fDeltaY; // reset the timer - // m_transistionEnd.start = m_iCounter + m_transistionStart.length + (int)(g_graphicsContext.GetFPS() * CSettings::GetInstance().GetInt(CSettings::SETTING_SLIDESHOW_STAYTIME)); + // m_transistionEnd.start = m_iCounter + m_transistionStart.length + (int)(g_graphicsContext.GetFPS() * CSettings::Get().GetInt("slideshow.staytime")); } void CSlideShowPic::Render() @@ -746,87 +742,72 @@ Render(m_ox, m_oy, NULL, PICTURE_VIEW_BOX_COLOR); } -#ifdef HAS_DX -bool CSlideShowPic::UpdateVertexBuffer(Vertex* vericies) -{ - if (!m_vb) // create new - { - CD3D11_BUFFER_DESC desc(sizeof(Vertex) * 5, D3D11_BIND_VERTEX_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); - D3D11_SUBRESOURCE_DATA initData = {}; - initData.pSysMem = vericies; - initData.SysMemPitch = sizeof(Vertex) * 5; - if (SUCCEEDED(g_Windowing.Get3D11Device()->CreateBuffer(&desc, &initData, &m_vb))) - return true; - } - else // update - { - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - D3D11_MAPPED_SUBRESOURCE res; - if (SUCCEEDED(pContext->Map(m_vb, 0, D3D11_MAP_WRITE_DISCARD, 0, &res))) - { - memcpy(res.pData, vericies, sizeof(Vertex) * 5); - pContext->Unmap(m_vb, 0); - return true; - } - } - - return false; -} -#endif - void CSlideShowPic::Render(float *x, float *y, CBaseTexture* pTexture, color_t color) { #ifdef HAS_DX + struct VERTEX + { + D3DXVECTOR3 p; + D3DCOLOR col; + FLOAT tu, tv; + }; static const DWORD FVF_VERTEX = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1; - Vertex vertex[5]; + VERTEX vertex[5]; + for (int i = 0; i < 4; i++) { - vertex[i].pos = XMFLOAT3( x[i], y[i], 0); - CD3DHelper::XMStoreColor(&vertex[i].color, color); - vertex[i].texCoord = XMFLOAT2(0.0f, 0.0f); - vertex[i].texCoord2 = XMFLOAT2(0.0f, 0.0f); + vertex[i].p = D3DXVECTOR3( x[i], y[i], 0); + vertex[i].tu = 0; + vertex[i].tv = 0; + vertex[i].col = color; } if (pTexture) { - vertex[1].texCoord.x = vertex[2].texCoord.x = (float) pTexture->GetWidth() / pTexture->GetTextureWidth(); - vertex[2].texCoord.y = vertex[3].texCoord.y = (float) pTexture->GetHeight() / pTexture->GetTextureHeight(); + vertex[1].tu = vertex[2].tu = (float)pTexture->GetWidth() / pTexture->GetTextureWidth(); + vertex[2].tv = vertex[3].tv = (float)pTexture->GetHeight() / pTexture->GetTextureHeight(); } else { - vertex[1].texCoord.x = vertex[2].texCoord.x = 1.0f; - vertex[2].texCoord.y = vertex[3].texCoord.y = 1.0f; + vertex[1].tu = vertex[2].tu = 1.0f; + vertex[2].tv = vertex[3].tv = 1.0f; } + vertex[4] = vertex[0]; // Not used when pTexture != NULL - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - pGUIShader->Begin(SHADER_METHOD_RENDER_TEXTURE_BLEND); - // Set state to render the image if (pTexture) { pTexture->LoadToGPU(); - CDXTexture* dxTexture = reinterpret_cast(pTexture); - ID3D11ShaderResourceView* shaderRes = dxTexture->GetShaderResource(); - pGUIShader->SetShaderViews(1, &shaderRes); - pGUIShader->DrawQuad(vertex[0], vertex[1], vertex[2], vertex[3]); + pTexture->BindToUnit(0); } - else - { - if (!UpdateVertexBuffer(vertex)) - return; - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - - unsigned stride = sizeof(Vertex); - unsigned offset = 0; - pContext->IASetVertexBuffers(0, 1, &m_vb, &stride, &offset); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP); - pGUIShader->Draw(5, 0); - pGUIShader->RestoreBuffers(); - } + g_Windowing.Get3DDevice()->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + g_Windowing.Get3DDevice()->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + g_Windowing.Get3DDevice()->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + g_Windowing.Get3DDevice()->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + g_Windowing.Get3DDevice()->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + g_Windowing.Get3DDevice()->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + g_Windowing.Get3DDevice()->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + g_Windowing.Get3DDevice()->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + g_Windowing.Get3DDevice()->SetRenderState( D3DRS_ZENABLE, FALSE ); + g_Windowing.Get3DDevice()->SetRenderState( D3DRS_FOGENABLE, FALSE ); + g_Windowing.Get3DDevice()->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE ); + g_Windowing.Get3DDevice()->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + g_Windowing.Get3DDevice()->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); + g_Windowing.Get3DDevice()->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); + g_Windowing.Get3DDevice()->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + g_Windowing.Get3DDevice()->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + g_Windowing.Get3DDevice()->SetRenderState(D3DRS_LIGHTING, FALSE); + g_Windowing.Get3DDevice()->SetFVF( FVF_VERTEX ); + // Render the image + if (pTexture) + { + g_Windowing.Get3DDevice()->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, vertex, sizeof(VERTEX) ); + g_Windowing.Get3DDevice()->SetTexture(0, NULL); + } else + g_Windowing.Get3DDevice()->DrawPrimitiveUP( D3DPT_LINESTRIP, 4, vertex, sizeof(VERTEX) ); #elif defined(HAS_GL) g_graphicsContext.BeginPaint(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pictures/SlideShowPicture.h kodi-15.2~git20151019.1039-final/xbmc/pictures/SlideShowPicture.h --- kodi-16.1~git20160425.1001-final/xbmc/pictures/SlideShowPicture.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pictures/SlideShowPicture.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,9 +22,7 @@ #include "threads/CriticalSection.h" #include "guilib/DirtyRegion.h" #include -#ifdef HAS_DX -#include "guilib/GUIShaderDX.h" -#endif + typedef uint32_t color_t; class CBaseTexture; @@ -133,8 +131,4 @@ bool m_bTransistionImmediately; CCriticalSection m_textureAccess; -#ifdef HAS_DX - ID3D11Buffer* m_vb; - bool UpdateVertexBuffer(Vertex *vertecies); -#endif }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/PlayListPlayer.cpp kodi-15.2~git20151019.1039-final/xbmc/PlayListPlayer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/PlayListPlayer.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/PlayListPlayer.cpp 2015-10-19 08:39:15.000000000 +0000 @@ -29,17 +29,14 @@ #include "playlists/PlayList.h" #include "utils/log.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "music/tags/MusicInfoTag.h" #include "dialogs/GUIDialogKaiToast.h" #include "guilib/LocalizeStrings.h" #include "interfaces/AnnouncementManager.h" #include "input/Key.h" #include "URL.h" -#include "messaging/ApplicationMessenger.h" using namespace PLAYLIST; -using namespace KODI::MESSAGING; CPlayListPlayer::CPlayListPlayer(void) { @@ -302,7 +299,7 @@ CLog::Log(LOGDEBUG,"Playlist Player: one or more items failed to play... aborting playback"); // open error dialog - CGUIDialogOK::ShowAndGetInput(CVariant{16026}, CVariant{16027}); + CGUIDialogOK::ShowAndGetInput(16026, 16027); CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_STOPPED, 0, 0, m_iCurrentPlayList, m_iCurrentSong); g_windowManager.SendThreadMessage(msg); @@ -718,228 +715,5 @@ CVariant data; data["player"]["playerid"] = iPlaylist; data["property"][strProperty] = value; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPropertyChanged", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPropertyChanged", data); } - -int PLAYLIST::CPlayListPlayer::GetMessageMask() -{ - return TMSG_MASK_PLAYLISTPLAYER; -} - -void PLAYLIST::CPlayListPlayer::OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg) -{ - switch (pMsg->dwMessage) - { - case TMSG_PLAYLISTPLAYER_PLAY: - if (pMsg->param1 != -1) - Play(pMsg->param1); - else - Play(); - break; - - case TMSG_PLAYLISTPLAYER_PLAY_SONG_ID: - if (pMsg->param1 != -1) - { - bool *result = (bool*)pMsg->lpVoid; - *result = PlaySongId(pMsg->param1); - } - else - Play(); - break; - - case TMSG_PLAYLISTPLAYER_NEXT: - PlayNext(); - break; - - case TMSG_PLAYLISTPLAYER_PREV: - PlayPrevious(); - break; - - case TMSG_PLAYLISTPLAYER_ADD: - if (pMsg->lpVoid) - { - CFileItemList *list = (CFileItemList *)pMsg->lpVoid; - - Add(pMsg->param1, (*list)); - delete list; - } - break; - - case TMSG_PLAYLISTPLAYER_INSERT: - if (pMsg->lpVoid) - { - CFileItemList *list = (CFileItemList *)pMsg->lpVoid; - Insert(pMsg->param1, (*list), pMsg->param2); - delete list; - } - break; - - case TMSG_PLAYLISTPLAYER_REMOVE: - if (pMsg->param1 != -1) - Remove(pMsg->param1, pMsg->param2); - break; - - case TMSG_PLAYLISTPLAYER_CLEAR: - ClearPlaylist(pMsg->param1); - break; - - case TMSG_PLAYLISTPLAYER_SHUFFLE: - SetShuffle(pMsg->param1, pMsg->param2 > 0); - break; - - case TMSG_PLAYLISTPLAYER_REPEAT: - SetRepeat(pMsg->param1, (PLAYLIST::REPEAT_STATE)pMsg->param2); - break; - - case TMSG_PLAYLISTPLAYER_GET_ITEMS: - if (pMsg->lpVoid) - { - PLAYLIST::CPlayList playlist = GetPlaylist(pMsg->param1); - CFileItemList *list = static_cast(pMsg->lpVoid); - - for (int i = 0; i < playlist.size(); i++) - list->Add(std::make_shared(*playlist[i])); - } - break; - - case TMSG_PLAYLISTPLAYER_SWAP: - if (pMsg->lpVoid) - { - auto indexes = static_cast*>(pMsg->lpVoid); - if (indexes->size() == 2) - Swap(pMsg->param1, indexes->at(0), indexes->at(1)); - delete indexes; - } - break; - - case TMSG_MEDIA_PLAY: - { - // first check if we were called from the PlayFile() function - if (pMsg->lpVoid && pMsg->param2 == 0) - { - CFileItem *item = (CFileItem *)pMsg->lpVoid; - g_application.PlayFile(*item, pMsg->param1 != 0); - delete item; - return; - } - // restore to previous window if needed - if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW || - g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO || - g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION) - g_windowManager.PreviousWindow(); - - g_application.ResetScreenSaver(); - g_application.WakeUpScreenSaverAndDPMS(); - - //g_application.StopPlaying(); - // play file - if (pMsg->lpVoid) - { - CFileItemList *list = (CFileItemList *)pMsg->lpVoid; - - if (list->Size() > 0) - { - int playlist = PLAYLIST_MUSIC; - for (int i = 0; i < list->Size(); i++) - { - if ((*list)[i]->IsVideo()) - { - playlist = PLAYLIST_VIDEO; - break; - } - } - - ClearPlaylist(playlist); - SetCurrentPlaylist(playlist); - //For single item lists try PlayMedia. This covers some more cases where a playlist is not appropriate - //It will fall through to PlayFile - if (list->Size() == 1 && !(*list)[0]->IsPlayList()) - g_application.PlayMedia(*((*list)[0]), playlist); - else - { - // Handle "shuffled" option if present - if (list->HasProperty("shuffled") && list->GetProperty("shuffled").isBoolean()) - SetShuffle(playlist, list->GetProperty("shuffled").asBoolean(), false); - // Handle "repeat" option if present - if (list->HasProperty("repeat") && list->GetProperty("repeat").isInteger()) - SetRepeat(playlist, (PLAYLIST::REPEAT_STATE)list->GetProperty("repeat").asInteger(), false); - - Add(playlist, (*list)); - Play(pMsg->param1); - } - } - - delete list; - } - else if (pMsg->param1 == PLAYLIST_MUSIC || pMsg->param1 == PLAYLIST_VIDEO) - { - if (GetCurrentPlaylist() != pMsg->param1) - SetCurrentPlaylist(pMsg->param1); - - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_PLAY, pMsg->param2); - } - } - break; - - case TMSG_MEDIA_RESTART: - g_application.Restart(true); - break; - - case TMSG_MEDIA_STOP: - { - // restore to previous window if needed - bool stopSlideshow = true; - bool stopVideo = true; - bool stopMusic = true; - if (pMsg->param1 >= PLAYLIST_MUSIC && pMsg->param1 <= PLAYLIST_PICTURE) - { - stopSlideshow = (pMsg->param1 == PLAYLIST_PICTURE); - stopVideo = (pMsg->param1 == PLAYLIST_VIDEO); - stopMusic = (pMsg->param1 == PLAYLIST_MUSIC); - } - - if ((stopSlideshow && g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) || - (stopVideo && g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO) || - (stopMusic && g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION)) - g_windowManager.PreviousWindow(); - - g_application.ResetScreenSaver(); - g_application.WakeUpScreenSaverAndDPMS(); - - // stop playing file - if (g_application.m_pPlayer->IsPlaying()) g_application.StopPlaying(); - } - break; - - case TMSG_MEDIA_PAUSE: - if (g_application.m_pPlayer->HasPlayer()) - { - g_application.ResetScreenSaver(); - g_application.WakeUpScreenSaverAndDPMS(); - g_application.m_pPlayer->Pause(); - } - break; - - case TMSG_MEDIA_UNPAUSE: - if (g_application.m_pPlayer->IsPausedPlayback()) - { - g_application.ResetScreenSaver(); - g_application.WakeUpScreenSaverAndDPMS(); - g_application.m_pPlayer->Pause(); - } - break; - - case TMSG_MEDIA_PAUSE_IF_PLAYING: - if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) - { - g_application.ResetScreenSaver(); - g_application.WakeUpScreenSaverAndDPMS(); - g_application.m_pPlayer->Pause(); - } - break; - default: - break; - } -} - - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/PlayListPlayer.h kodi-15.2~git20151019.1039-final/xbmc/PlayListPlayer.h --- kodi-16.1~git20160425.1001-final/xbmc/PlayListPlayer.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/PlayListPlayer.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,7 +20,6 @@ */ #include "guilib/IMsgTargetCallback.h" -#include "messaging/IMessageTarget.h" #include #define PLAYLIST_NONE -1 @@ -44,17 +43,13 @@ class CPlayList; -class CPlayListPlayer : public IMsgTargetCallback, - public KODI::MESSAGING::IMessageTarget +class CPlayListPlayer : public IMsgTargetCallback { public: CPlayListPlayer(void); virtual ~CPlayListPlayer(void); - virtual bool OnMessage(CGUIMessage &message) override; - - virtual int GetMessageMask() override; - virtual void OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg) override; + virtual bool OnMessage(CGUIMessage &message); /*! \brief Play the next (or another) entry in the current playlist \param offset The offset from the current entry (defaults to 1, i.e. the next entry). diff -Nru kodi-16.1~git20160425.1001-final/xbmc/playlists/PlayListB4S.cpp kodi-15.2~git20151019.1039-final/xbmc/playlists/PlayListB4S.cpp --- kodi-16.1~git20160425.1001-final/xbmc/playlists/PlayListB4S.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/playlists/PlayListB4S.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,9 +18,6 @@ * */ -#include -#include - #include "PlayListB4S.h" #include "Util.h" #include "utils/XBMCTinyXML.h" @@ -33,6 +30,7 @@ using namespace XFILE; using namespace PLAYLIST; +using namespace std; /* ------------------------ example b4s playlist file --------------------------------- @@ -57,7 +55,7 @@ {} -bool CPlayListB4S::LoadData(std::istream& stream) +bool CPlayListB4S::LoadData(istream& stream) { CXBMCTinyXML xmlDoc; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/playlists/PlayList.cpp kodi-15.2~git20151019.1039-final/xbmc/playlists/PlayList.cpp --- kodi-16.1~git20160425.1001-final/xbmc/playlists/PlayList.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/playlists/PlayList.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -30,15 +30,10 @@ #include "utils/StringUtils.h" #include "interfaces/AnnouncementManager.h" -#include #include -#include -#include -#include -#include -#include - +#include +//using namespace std; using namespace MUSIC_INFO; using namespace XFILE; using namespace PLAYLIST; @@ -60,7 +55,7 @@ CVariant data; data["playlistid"] = m_id; data["position"] = pos; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnRemove", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnRemove", data); } void CPlayList::AnnounceClear() @@ -70,7 +65,7 @@ CVariant data; data["playlistid"] = m_id; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnClear", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnClear", data); } void CPlayList::AnnounceAdd(const CFileItemPtr& item, int pos) @@ -81,7 +76,7 @@ CVariant data; data["playlistid"] = m_id; data["position"] = pos; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnAdd", item, data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Playlist, "xbmc", "OnAdd", item, data); } void CPlayList::Add(const CFileItemPtr &item, int iPosition, int iOrder) @@ -280,7 +275,7 @@ CLog::Log(LOGDEBUG,"%s shuffling at pos:%i", __FUNCTION__, iPosition); ivecItems it = m_vecItems.begin() + iPosition; - std::random_shuffle(it, m_vecItems.end()); + random_shuffle(it, m_vecItems.end()); // the list is now shuffled! m_bShuffled = true; @@ -297,7 +292,7 @@ void CPlayList::UnShuffle() { - std::sort(m_vecItems.begin(), m_vecItems.end(), SSortPlayListItem::PlaylistSort); + sort(m_vecItems.begin(), m_vecItems.end(), SSortPlayListItem::PlaylistSort); // the list is now unshuffled! m_bShuffled = false; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/playlists/PlayListPLS.cpp kodi-15.2~git20151019.1039-final/xbmc/playlists/PlayListPLS.cpp --- kodi-16.1~git20160425.1001-final/xbmc/playlists/PlayListPLS.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/playlists/PlayListPLS.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,11 +18,6 @@ * */ -#include -#include -#include -#include - #include "PlayListPLS.h" #include "PlayListFactory.h" #include "Util.h" @@ -36,6 +31,7 @@ #include "utils/XBMCTinyXML.h" #include "utils/XMLUtils.h" +using namespace std; using namespace XFILE; using namespace PLAYLIST; @@ -133,7 +129,7 @@ } else if (StringUtils::StartsWith(strLeft, "file")) { - std::vector ::size_type idx = atoi(strLeft.c_str() + 4); + vector ::size_type idx = atoi(strLeft.c_str() + 4); if (!Resize(idx)) { bFailed = true; @@ -158,7 +154,7 @@ } else if (StringUtils::StartsWith(strLeft, "title")) { - std::vector ::size_type idx = atoi(strLeft.c_str() + 5); + vector ::size_type idx = atoi(strLeft.c_str() + 5); if (!Resize(idx)) { bFailed = true; @@ -169,7 +165,7 @@ } else if (StringUtils::StartsWith(strLeft, "length")) { - std::vector ::size_type idx = atoi(strLeft.c_str() + 6); + vector ::size_type idx = atoi(strLeft.c_str() + 6); if (!Resize(idx)) { bFailed = true; @@ -243,11 +239,11 @@ file.Close(); } -bool CPlayListASX::LoadAsxIniInfo(std::istream &stream) +bool CPlayListASX::LoadAsxIniInfo(istream &stream) { CLog::Log(LOGINFO, "Parsing INI style ASX"); - std::string name, value; + string name, value; while( stream.good() ) { @@ -287,7 +283,7 @@ return true; } -bool CPlayListASX::LoadData(std::istream& stream) +bool CPlayListASX::LoadData(istream& stream) { CLog::Log(LOGNOTICE, "Parsing ASX"); @@ -385,7 +381,7 @@ value = XMLUtils::GetAttribute(pElement, "href"); if (!value.empty()) { // found an entryref, let's try loading that url - std::unique_ptr playlist(CPlayListFactory::Create(value)); + unique_ptr playlist(CPlayListFactory::Create(value)); if (NULL != playlist.get()) if (playlist->Load(value)) Add(*playlist); @@ -399,7 +395,7 @@ } -bool CPlayListRAM::LoadData(std::istream& stream) +bool CPlayListRAM::LoadData(istream& stream) { CLog::Log(LOGINFO, "Parsing RAM"); @@ -414,7 +410,7 @@ return true; } -bool CPlayListPLS::Resize(std::vector ::size_type newSize) +bool CPlayListPLS::Resize(vector ::size_type newSize) { if (newSize == 0) return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/playlists/PlayListWPL.cpp kodi-15.2~git20151019.1039-final/xbmc/playlists/PlayListWPL.cpp --- kodi-16.1~git20160425.1001-final/xbmc/playlists/PlayListWPL.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/playlists/PlayListWPL.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,9 +18,6 @@ * */ -#include -#include - #include "PlayListWPL.h" #include "Util.h" #include "utils/XBMCTinyXML.h" @@ -32,6 +29,7 @@ using namespace XFILE; using namespace PLAYLIST; +using namespace std; /* ------------------------ example wpl playlist file --------------------------------- @@ -59,7 +57,7 @@ {} -bool CPlayListWPL::LoadData(std::istream& stream) +bool CPlayListWPL::LoadData(istream& stream) { CXBMCTinyXML xmlDoc; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/playlists/SmartPlayList.cpp kodi-15.2~git20151019.1039-final/xbmc/playlists/SmartPlayList.cpp --- kodi-16.1~git20160425.1001-final/xbmc/playlists/SmartPlayList.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/playlists/SmartPlayList.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,12 +18,6 @@ * */ -#include -#include -#include -#include -#include - #include "SmartPlayList.h" #include "Util.h" #include "filesystem/File.h" @@ -40,12 +34,14 @@ #include "utils/XMLUtils.h" #include "video/VideoDatabase.h" +using namespace std; using namespace XFILE; typedef struct { char string[17]; Field field; + SortBy sort; CDatabaseQueryRule::FIELD_TYPE type; StringValidation::Validator validator; bool browseable; @@ -53,67 +49,67 @@ } translateField; static const translateField fields[] = { - { "none", FieldNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 231 }, - { "filename", FieldFilename, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 561 }, - { "path", FieldPath, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 573 }, - { "album", FieldAlbum, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 558 }, - { "albumartist", FieldAlbumArtist, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 566 }, - { "artist", FieldArtist, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 557 }, - { "tracknumber", FieldTrackNumber, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 554 }, - { "comment", FieldComment, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 569 }, - { "review", FieldReview, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 183 }, - { "themes", FieldThemes, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21895 }, - { "moods", FieldMoods, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 175 }, - { "styles", FieldStyles, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 176 }, - { "type", FieldAlbumType, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 564 }, - { "label", FieldMusicLabel, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21899 }, - { "title", FieldTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 556 }, - { "sorttitle", FieldSortTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 171 }, - { "year", FieldYear, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, true, 562 }, - { "time", FieldTime, CDatabaseQueryRule::SECONDS_FIELD, StringValidation::IsTime, false, 180 }, - { "playcount", FieldPlaycount, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 567 }, - { "lastplayed", FieldLastPlayed, CDatabaseQueryRule::DATE_FIELD, NULL, false, 568 }, - { "inprogress", FieldInProgress, CDatabaseQueryRule::BOOLEAN_FIELD, NULL, false, 575 }, - { "rating", FieldRating, CDatabaseQueryRule::NUMERIC_FIELD, CSmartPlaylistRule::ValidateRating, false, 563 }, - { "votes", FieldVotes, CDatabaseQueryRule::TEXT_FIELD, StringValidation::IsPositiveInteger, false, 205 }, - { "top250", FieldTop250, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 13409 }, - { "mpaarating", FieldMPAA, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 20074 }, - { "dateadded", FieldDateAdded, CDatabaseQueryRule::DATE_FIELD, NULL, false, 570 }, - { "genre", FieldGenre, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 515 }, - { "plot", FieldPlot, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 207 }, - { "plotoutline", FieldPlotOutline, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 203 }, - { "tagline", FieldTagline, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 202 }, - { "set", FieldSet, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20457 }, - { "director", FieldDirector, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20339 }, - { "actor", FieldActor, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20337 }, - { "writers", FieldWriter, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20417 }, - { "airdate", FieldAirDate, CDatabaseQueryRule::DATE_FIELD, NULL, false, 20416 }, - { "hastrailer", FieldTrailer, CDatabaseQueryRule::BOOLEAN_FIELD, NULL, false, 20423 }, - { "studio", FieldStudio, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 572 }, - { "country", FieldCountry, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 574 }, - { "tvshow", FieldTvShowTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20364 }, - { "status", FieldTvShowStatus, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 126 }, - { "season", FieldSeason, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20373 }, - { "episode", FieldEpisodeNumber, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20359 }, - { "numepisodes", FieldNumberOfEpisodes, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20360 }, - { "numwatched", FieldNumberOfWatchedEpisodes, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 21457 }, - { "videoresolution", FieldVideoResolution, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 21443 }, - { "videocodec", FieldVideoCodec, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21445 }, - { "videoaspect", FieldVideoAspectRatio, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 21374 }, - { "audiochannels", FieldAudioChannels, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 21444 }, - { "audiocodec", FieldAudioCodec, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21446 }, - { "audiolanguage", FieldAudioLanguage, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21447 }, - { "subtitlelanguage", FieldSubtitleLanguage, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21448 }, - { "random", FieldRandom, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 590 }, - { "playlist", FieldPlaylist, CDatabaseQueryRule::PLAYLIST_FIELD, NULL, true, 559 }, - { "virtualfolder", FieldVirtualFolder, CDatabaseQueryRule::PLAYLIST_FIELD, NULL, true, 614 }, - { "tag", FieldTag, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20459 }, - { "instruments", FieldInstruments, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21892 }, - { "biography", FieldBiography, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21887 }, - { "born", FieldBorn, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21893 }, - { "bandformed", FieldBandFormed, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21894 }, - { "disbanded", FieldDisbanded, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21896 }, - { "died", FieldDied, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21897 } + { "none", FieldNone, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 231 }, + { "filename", FieldFilename, SortByFile, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 561 }, + { "path", FieldPath, SortByPath, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 573 }, + { "album", FieldAlbum, SortByAlbum, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 558 }, + { "albumartist", FieldAlbumArtist, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 566 }, + { "artist", FieldArtist, SortByArtist, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 557 }, + { "tracknumber", FieldTrackNumber, SortByTrackNumber, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 554 }, + { "comment", FieldComment, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 569 }, + { "review", FieldReview, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 183 }, + { "themes", FieldThemes, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21895 }, + { "moods", FieldMoods, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 175 }, + { "styles", FieldStyles, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 176 }, + { "type", FieldAlbumType, SortByAlbumType, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 564 }, + { "label", FieldMusicLabel, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21899 }, + { "title", FieldTitle, SortByTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 556 }, + { "sorttitle", FieldSortTitle, SortBySortTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 171 }, + { "year", FieldYear, SortByYear, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, true, 562 }, + { "time", FieldTime, SortByTime, CDatabaseQueryRule::SECONDS_FIELD, StringValidation::IsTime, false, 180 }, + { "playcount", FieldPlaycount, SortByPlaycount, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 567 }, + { "lastplayed", FieldLastPlayed, SortByLastPlayed, CDatabaseQueryRule::DATE_FIELD, NULL, false, 568 }, + { "inprogress", FieldInProgress, SortByNone, CDatabaseQueryRule::BOOLEAN_FIELD, NULL, false, 575 }, + { "rating", FieldRating, SortByRating, CDatabaseQueryRule::NUMERIC_FIELD, CSmartPlaylistRule::ValidateRating, false, 563 }, + { "votes", FieldVotes, SortByVotes, CDatabaseQueryRule::TEXT_FIELD, StringValidation::IsPositiveInteger, false, 205 }, + { "top250", FieldTop250, SortByTop250, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 13409 }, + { "mpaarating", FieldMPAA, SortByMPAA, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 20074 }, + { "dateadded", FieldDateAdded, SortByDateAdded, CDatabaseQueryRule::DATE_FIELD, NULL, false, 570 }, + { "genre", FieldGenre, SortByGenre, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 515 }, + { "plot", FieldPlot, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 207 }, + { "plotoutline", FieldPlotOutline, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 203 }, + { "tagline", FieldTagline, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 202 }, + { "set", FieldSet, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20457 }, + { "director", FieldDirector, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20339 }, + { "actor", FieldActor, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20337 }, + { "writers", FieldWriter, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20417 }, + { "airdate", FieldAirDate, SortByYear, CDatabaseQueryRule::DATE_FIELD, NULL, false, 20416 }, + { "hastrailer", FieldTrailer, SortByNone, CDatabaseQueryRule::BOOLEAN_FIELD, NULL, false, 20423 }, + { "studio", FieldStudio, SortByStudio, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 572 }, + { "country", FieldCountry, SortByCountry, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 574 }, + { "tvshow", FieldTvShowTitle, SortByTvShowTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20364 }, + { "status", FieldTvShowStatus, SortByTvShowStatus, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 126 }, + { "season", FieldSeason, SortBySeason, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20373 }, + { "episode", FieldEpisodeNumber, SortByEpisodeNumber, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20359 }, + { "numepisodes", FieldNumberOfEpisodes, SortByNumberOfEpisodes, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20360 }, + { "numwatched", FieldNumberOfWatchedEpisodes, SortByNumberOfWatchedEpisodes, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 21457 }, + { "videoresolution", FieldVideoResolution, SortByVideoResolution, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 21443 }, + { "videocodec", FieldVideoCodec, SortByVideoCodec, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21445 }, + { "videoaspect", FieldVideoAspectRatio, SortByVideoAspectRatio, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 21374 }, + { "audiochannels", FieldAudioChannels, SortByAudioChannels, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 21444 }, + { "audiocodec", FieldAudioCodec, SortByAudioCodec, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21446 }, + { "audiolanguage", FieldAudioLanguage, SortByAudioLanguage, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21447 }, + { "subtitlelanguage", FieldSubtitleLanguage, SortBySubtitleLanguage, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21448 }, + { "random", FieldRandom, SortByRandom, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 590 }, + { "playlist", FieldPlaylist, SortByPlaylistOrder, CDatabaseQueryRule::PLAYLIST_FIELD, NULL, true, 559 }, + { "virtualfolder", FieldVirtualFolder, SortByNone, CDatabaseQueryRule::PLAYLIST_FIELD, NULL, true, 614 }, + { "tag", FieldTag, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20459 }, + { "instruments", FieldInstruments, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21892 }, + { "biography", FieldBiography, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21887 }, + { "born", FieldBorn, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21893 }, + { "bandformed", FieldBandFormed, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21894 }, + { "disbanded", FieldDisbanded, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21896 }, + { "died", FieldDied, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21897 } }; static const size_t NUM_FIELDS = sizeof(fields) / sizeof(translateField); @@ -165,16 +161,16 @@ SortBy CSmartPlaylistRule::TranslateOrder(const char *order) { - return SortUtils::SortMethodFromString(order); + for (unsigned int i = 0; i < NUM_FIELDS; i++) + if (StringUtils::EqualsNoCase(order, fields[i].string)) return fields[i].sort; + return SortByNone; } std::string CSmartPlaylistRule::TranslateOrder(SortBy order) { - std::string sortOrder = SortUtils::SortMethodToString(order); - if (sortOrder.empty()) - return "none"; - - return sortOrder; + for (unsigned int i = 0; i < NUM_FIELDS; i++) + if (order == fields[i].sort) return fields[i].string; + return "none"; } Field CSmartPlaylistRule::TranslateGroup(const char *group) @@ -242,8 +238,8 @@ return true; // split the input into multiple values and validate every value separately - std::vector values = StringUtils::Split(input, RULE_VALUE_SEPARATOR); - for (std::vector::const_iterator it = values.begin(); it != values.end(); ++it) + vector values = StringUtils::Split(input, RULE_VALUE_SEPARATOR); + for (vector::const_iterator it = values.begin(); it != values.end(); ++it) { if (!validator(*it, data)) return false; @@ -255,17 +251,17 @@ bool CSmartPlaylistRule::ValidateRating(const std::string &input, void *data) { char *end = NULL; - std::string strRating = input; + string strRating = input; StringUtils::Trim(strRating); - double rating = std::strtod(strRating.c_str(), &end); + double rating = strtod(strRating.c_str(), &end); return (end == NULL || *end == '\0') && rating >= 0.0 && rating <= 10.0; } -std::vector CSmartPlaylistRule::GetFields(const std::string &type) +vector CSmartPlaylistRule::GetFields(const std::string &type) { - std::vector fields; + vector fields; bool isVideo = false; if (type == "mixed") { @@ -444,7 +440,7 @@ std::vector CSmartPlaylistRule::GetOrders(const std::string &type) { - std::vector orders; + vector orders; orders.push_back(SortByNone); if (type == "songs") { @@ -554,7 +550,7 @@ std::vector CSmartPlaylistRule::GetGroups(const std::string &type) { - std::vector groups; + vector groups; groups.push_back(FieldUnknown); if (type == "artists") @@ -627,7 +623,7 @@ std::string CSmartPlaylistRule::GetVideoResolutionQuery(const std::string ¶meter) const { std::string retVal(" IN (SELECT DISTINCT idFile FROM streamdetails WHERE iVideoWidth "); - int iRes = (int)std::strtol(parameter.c_str(), NULL, 10); + int iRes = (int)strtol(parameter.c_str(), NULL, 10); int min, max; if (iRes >= 1080) { min = 1281; max = INT_MAX; } @@ -754,11 +750,7 @@ table = "artistview"; if (m_field == FieldGenre) - { - query = negate + " (EXISTS (SELECT DISTINCT song_artist.idArtist FROM song_artist, song_genre, genre WHERE song_artist.idArtist = " + GetField(FieldId, strType) + " AND song_artist.idSong = song_genre.idSong AND song_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + ")"; - query += " OR "; - query += "EXISTS (SELECT DISTINCT album_artist.idArtist FROM album_artist, album_genre, genre WHERE album_artist.idArtist = " + GetField(FieldId, strType) + " AND album_artist.idAlbum = album_genre.idAlbum AND album_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + "))"; - } + query = negate + " EXISTS (SELECT DISTINCT song_artist.idArtist FROM song_artist, song_genre, genre WHERE song_artist.idArtist = " + GetField(FieldId, strType) + " AND song_artist.idSong = song_genre.idSong AND song_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + ")"; } else if (strType == "movies") { @@ -1339,7 +1331,7 @@ type == "songs" || type == "mixed"; } -std::string CSmartPlaylist::GetWhereClause(const CDatabase &db, std::set &referencedPlaylists) const +std::string CSmartPlaylist::GetWhereClause(const CDatabase &db, set &referencedPlaylists) const { return m_ruleCombination.GetWhereClause(db, GetType(), referencedPlaylists); } @@ -1361,8 +1353,8 @@ void CSmartPlaylist::GetAvailableFields(const std::string &type, std::vector &fieldList) { - std::vector typeFields = CSmartPlaylistRule::GetFields(type); - for (std::vector::const_iterator field = typeFields.begin(); field != typeFields.end(); ++field) + vector typeFields = CSmartPlaylistRule::GetFields(type); + for (vector::const_iterator field = typeFields.begin(); field != typeFields.end(); ++field) { for (unsigned int i = 0; i < NUM_FIELDS; i++) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/playlists/SmartPlaylistFileItemListModifier.cpp kodi-15.2~git20151019.1039-final/xbmc/playlists/SmartPlaylistFileItemListModifier.cpp --- kodi-16.1~git20160425.1001-final/xbmc/playlists/SmartPlaylistFileItemListModifier.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/playlists/SmartPlaylistFileItemListModifier.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,7 +18,7 @@ * */ -#include +#include #include "SmartPlaylistFileItemListModifier.h" #include "FileItem.h" @@ -29,6 +29,7 @@ #define URL_OPTION_XSP "xsp" #define PROPERTY_SORT_ORDER "sort.order" #define PROPERTY_SORT_ASCENDING "sort.ascending" +using namespace std; bool CSmartPlaylistFileItemListModifier::CanModify(const CFileItemList &items) const { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/powermanagement/DPMSSupport.cpp kodi-15.2~git20151019.1039-final/xbmc/powermanagement/DPMSSupport.cpp --- kodi-16.1~git20160425.1001-final/xbmc/powermanagement/DPMSSupport.cpp 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/powermanagement/DPMSSupport.cpp 2015-06-14 19:32:51.000000000 +0000 @@ -103,7 +103,7 @@ ///////// Platform-specific support -#if defined(HAVE_X11) +#if defined(HAS_GLX) //// X Windows // Here's a sad story: our Windows-inspired BOOL type from linux/PlatformDefs.h diff -Nru kodi-16.1~git20160425.1001-final/xbmc/powermanagement/PowerManager.cpp kodi-15.2~git20151019.1039-final/xbmc/powermanagement/PowerManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/powermanagement/PowerManager.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/powermanagement/PowerManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,26 +18,24 @@ * */ -#include "PowerManager.h" - -#include #include - +#include +#include "system.h" +#include "PowerManager.h" #include "Application.h" #include "cores/AudioEngine/AEFactory.h" -#include "dialogs/GUIDialogBusy.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "interfaces/AnnouncementManager.h" -#include "interfaces/builtins/Builtins.h" -#include "pvr/PVRManager.h" #include "settings/lib/Setting.h" #include "settings/Settings.h" -#include "system.h" +#include "windowing/WindowingFactory.h" #include "utils/log.h" #include "utils/Weather.h" -#include "windowing/WindowingFactory.h" +#include "interfaces/Builtins.h" +#include "interfaces/AnnouncementManager.h" +#include "guilib/LocalizeStrings.h" +#include "guilib/GUIWindowManager.h" +#include "dialogs/GUIDialogBusy.h" +#include "dialogs/GUIDialogKaiToast.h" +#include "pvr/PVRManager.h" #if defined(TARGET_DARWIN) #include "osx/CocoaPowerSyscall.h" @@ -72,8 +70,6 @@ void CPowerManager::Initialize() { - SAFE_DELETE(m_instance); - #if defined(TARGET_DARWIN) m_instance = new CCocoaPowerSyscall(); #elif defined(TARGET_ANDROID) @@ -127,7 +123,7 @@ void CPowerManager::SetDefaults() { - int defaultShutdown = CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE); + int defaultShutdown = CSettings::Get().GetInt("powermanagement.shutdownstate"); switch (defaultShutdown) { @@ -166,7 +162,7 @@ break; } - ((CSettingInt*)CSettings::GetInstance().GetSetting(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE))->SetDefault(defaultShutdown); + ((CSettingInt*)CSettings::Get().GetSetting("powermanagement.shutdownstate"))->SetDefault(defaultShutdown); } bool CPowerManager::Powerdown() @@ -175,7 +171,7 @@ { CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); if (dialog) - dialog->Open(); + dialog->Show(); return true; } @@ -199,11 +195,11 @@ if (success) { - CAnnouncementManager::GetInstance().Announce(System, "xbmc", "OnRestart"); + CAnnouncementManager::Get().Announce(System, "xbmc", "OnRestart"); CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); if (dialog) - dialog->Open(); + dialog->Show(); } return success; @@ -241,21 +237,21 @@ void CPowerManager::OnSleep() { - CAnnouncementManager::GetInstance().Announce(System, "xbmc", "OnSleep"); + CAnnouncementManager::Get().Announce(System, "xbmc", "OnSleep"); CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); if (dialog) - dialog->Open(); + dialog->Show(); CLog::Log(LOGNOTICE, "%s: Running sleep jobs", __FUNCTION__); // stop lirc #if defined(HAS_LIRC) || defined(HAS_IRSERVERSUITE) CLog::Log(LOGNOTICE, "%s: Stopping lirc", __FUNCTION__); - CBuiltins::GetInstance().Execute("LIRC.Stop"); + CBuiltins::Execute("LIRC.Stop"); #endif - PVR::CPVRManager::GetInstance().SetWakeupCommand(); + PVR::CPVRManager::Get().SetWakeupCommand(); g_application.SaveFileState(true); g_application.StopPlaying(); g_application.StopShutdownTimer(); @@ -289,14 +285,14 @@ // restart lirc #if defined(HAS_LIRC) || defined(HAS_IRSERVERSUITE) CLog::Log(LOGNOTICE, "%s: Restarting lirc", __FUNCTION__); - CBuiltins::GetInstance().Execute("LIRC.Start"); + CBuiltins::Execute("LIRC.Start"); #endif CAEFactory::Resume(); g_application.UpdateLibraries(); g_weatherManager.Refresh(); - CAnnouncementManager::GetInstance().Announce(System, "xbmc", "OnWake"); + CAnnouncementManager::Get().Announce(System, "xbmc", "OnWake"); } void CPowerManager::OnLowBattery() @@ -305,7 +301,7 @@ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(13050), ""); - CAnnouncementManager::GetInstance().Announce(System, "xbmc", "OnLowBattery"); + CAnnouncementManager::Get().Announce(System, "xbmc", "OnLowBattery"); } void CPowerManager::SettingOptionsShutdownStatesFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/powermanagement/PowerManager.h kodi-15.2~git20151019.1039-final/xbmc/powermanagement/PowerManager.h --- kodi-16.1~git20160425.1001-final/xbmc/powermanagement/PowerManager.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/powermanagement/PowerManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,7 +22,6 @@ #define _POWER_MANAGER_H_ #include -#include #include #include "IPowerSyscall.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/profiles/dialogs/GUIDialogLockSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/profiles/dialogs/GUIDialogLockSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/profiles/dialogs/GUIDialogLockSettings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/profiles/dialogs/GUIDialogLockSettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,19 +19,16 @@ */ #include "GUIDialogLockSettings.h" - -#include - +#include "URL.h" #include "dialogs/GUIDialogContextMenu.h" #include "dialogs/GUIDialogGamepad.h" -#include "dialogs/GUIDialogNumeric.h" #include "guilib/GUIKeyboardFactory.h" +#include "dialogs/GUIDialogNumeric.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" #include "settings/lib/Setting.h" #include "settings/lib/SettingSection.h" #include "settings/windows/GUIControlSettings.h" -#include "URL.h" #include "utils/log.h" #include "utils/StringUtils.h" @@ -85,7 +82,7 @@ dialog->m_getUser = false; dialog->m_conditionalDetails = conditional; dialog->m_details = details; - dialog->Open(); + dialog->DoModal(); if (!dialog->m_changed) return false; @@ -105,7 +102,7 @@ dialog->m_user = user; dialog->m_url = url; dialog->m_saveUserDetails = saveUserDetails; - dialog->Open(); + dialog->DoModal(); if (!dialog->m_changed) return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/profiles/dialogs/GUIDialogProfileSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/profiles/dialogs/GUIDialogProfileSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/profiles/dialogs/GUIDialogProfileSettings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/profiles/dialogs/GUIDialogProfileSettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,27 +19,23 @@ */ #include "GUIDialogProfileSettings.h" - -#include - +#include "FileItem.h" +#include "GUIPassword.h" +#include "Util.h" #include "dialogs/GUIDialogFileBrowser.h" #include "dialogs/GUIDialogYesNo.h" -#include "FileItem.h" #include "filesystem/Directory.h" #include "filesystem/File.h" #include "guilib/GUIKeyboardFactory.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" -#include "GUIPassword.h" -#include "profiles/dialogs/GUIDialogLockSettings.h" #include "profiles/ProfilesManager.h" +#include "profiles/dialogs/GUIDialogLockSettings.h" #include "settings/lib/Setting.h" #include "storage/MediaManager.h" -#include "Util.h" #include "utils/log.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #define CONTROL_PROFILE_IMAGE CONTROL_SETTINGS_CUSTOM + 1 #define CONTROL_PROFILE_NAME CONTROL_SETTINGS_CUSTOM + 2 @@ -62,7 +58,7 @@ bool CGUIDialogProfileSettings::ShowForProfile(unsigned int iProfile, bool firstLogin) { - if (firstLogin && iProfile > CProfilesManager::GetInstance().GetNumberOfProfiles()) + if (firstLogin && iProfile > CProfilesManager::Get().GetNumberOfProfiles()) return false; CGUIDialogProfileSettings *dialog = (CGUIDialogProfileSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_PROFILE_SETTINGS); @@ -73,7 +69,7 @@ dialog->m_isDefault = iProfile == 0; dialog->m_showDetails = !firstLogin; - const CProfile *profile = CProfilesManager::GetInstance().GetProfile(iProfile); + const CProfile *profile = CProfilesManager::Get().GetProfile(iProfile); if (profile == NULL) { dialog->m_name.clear(); @@ -81,7 +77,7 @@ dialog->m_sourcesMode = 2; dialog->m_locks = CProfile::CLock(); - bool bLock = CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser; + bool bLock = CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser; dialog->m_locks.addonManager = bLock; dialog->m_locks.settings = (bLock) ? LOCK_LEVEL::ALL : LOCK_LEVEL::NONE; dialog->m_locks.files = bLock; @@ -91,7 +87,7 @@ // prompt for a name std::string profileName; - if (!CGUIKeyboardFactory::ShowAndGetInput(profileName, CVariant{g_localizeStrings.Get(20093)}, false) || profileName.empty()) + if (!CGUIKeyboardFactory::ShowAndGetInput(profileName, g_localizeStrings.Get(20093),false) || profileName.empty()) return false; dialog->m_name = profileName; @@ -125,10 +121,10 @@ dialog->m_locks = profile->GetLocks(); } - dialog->Open(); + dialog->DoModal(); if (dialog->m_needsSaving) { - if (iProfile >= CProfilesManager::GetInstance().GetNumberOfProfiles()) + if (iProfile >= CProfilesManager::Get().GetNumberOfProfiles()) { if (dialog->m_name.empty() || dialog->m_directory.empty()) return false; @@ -137,16 +133,16 @@ strLabel.Format(g_localizeStrings.Get(20047),dialog->m_strName); if (!CGUIDialogYesNo::ShowAndGetInput(20058, strLabel, dialog->m_strDirectory, "")) { - CDirectory::Remove(URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetUserDataFolder(), dialog->m_strDirectory)); + CDirectory::Remove(URIUtils::AddFileToFolder(CProfilesManager::Get().GetUserDataFolder(), dialog->m_strDirectory)); return false; }*/ // check for old profile settings - CProfile profile(dialog->m_directory, dialog->m_name, CProfilesManager::GetInstance().GetNextProfileId()); - CProfilesManager::GetInstance().AddProfile(profile); + CProfile profile(dialog->m_directory, dialog->m_name, CProfilesManager::Get().GetNextProfileId()); + CProfilesManager::Get().AddProfile(profile); bool exists = XFILE::CFile::Exists(URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory + "/guisettings.xml")); - if (exists && !CGUIDialogYesNo::ShowAndGetInput(CVariant{20058}, CVariant{20104})) + if (exists && !CGUIDialogYesNo::ShowAndGetInput(20058, 20104)) exists = false; if (!exists) @@ -154,7 +150,7 @@ // copy masterprofile guisettings to new profile guisettings // If the user selects 'start fresh', do nothing as a fresh // guisettings.xml will be created on first profile use. - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{20058}, CVariant{20048}, CVariant{""}, CVariant{""}, CVariant{20044}, CVariant{20064})) + if (CGUIDialogYesNo::ShowAndGetInput(20058, 20048, "", "", 20044, 20064)) { XFILE::CFile::Copy(URIUtils::AddFileToFolder("special://masterprofile/", "guisettings.xml"), URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory + "/guisettings.xml")); @@ -162,7 +158,7 @@ } exists = XFILE::CFile::Exists(URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory + "/sources.xml")); - if (exists && !CGUIDialogYesNo::ShowAndGetInput(CVariant{20058}, CVariant{20106})) + if (exists && !CGUIDialogYesNo::ShowAndGetInput(20058, 20106)) exists = false; if (!exists) @@ -170,7 +166,7 @@ if ((dialog->m_sourcesMode & 2) == 2) // prompt user to copy masterprofile's sources.xml file // If 'start fresh' (no) is selected, do nothing. - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{20058}, CVariant{20071}, CVariant{""}, CVariant{""}, CVariant{20044}, CVariant{20064})) + if (CGUIDialogYesNo::ShowAndGetInput(20058, 20071, "", "", 20044, 20064)) { XFILE::CFile::Copy(URIUtils::AddFileToFolder("special://masterprofile/", "sources.xml"), URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory + "/sources.xml")); @@ -182,7 +178,7 @@ if (!CGUIDialogYesNo::ShowAndGetInput(20067, 20103)) return false;*/ - CProfile *profile = CProfilesManager::GetInstance().GetProfile(iProfile); + CProfile *profile = CProfilesManager::Get().GetProfile(iProfile); assert(profile); profile->setName(dialog->m_name); profile->setDirectory(dialog->m_directory); @@ -192,7 +188,7 @@ profile->setDatabases((dialog->m_dbMode & 2) == 2); profile->setSources((dialog->m_sourcesMode & 2) == 2); profile->SetLocks(dialog->m_locks); - CProfilesManager::GetInstance().Save(); + CProfilesManager::Get().Save(); return true; } @@ -279,15 +275,15 @@ { if (m_showDetails) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE && !m_isDefault) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE && !m_isDefault) { - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{20066}, CVariant{20118})) + if (CGUIDialogYesNo::ShowAndGetInput(20066, 20118)) g_passwordManager.SetMasterLockMode(false); - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE) return; } if (CGUIDialogLockSettings::ShowAndGetLock(m_locks, m_isDefault ? 12360 : 20068, - CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || m_isDefault)) + CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || m_isDefault)) m_needsSaving = true; } else @@ -345,7 +341,7 @@ AddButton(group, SETTING_PROFILE_DIRECTORY, 20070, 0); if (m_showDetails || - (m_locks.mode == LOCK_MODE_EVERYONE && CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE)) + (m_locks.mode == LOCK_MODE_EVERYONE && CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE)) AddButton(group, SETTING_PROFILE_LOCKS, 20066, 0); if (!m_isDefault && m_showDetails) @@ -361,7 +357,7 @@ entries.push_back(std::make_pair(20062, 0)); entries.push_back(std::make_pair(20063, 1)); entries.push_back(std::make_pair(20061, 2)); - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) entries.push_back(std::make_pair(20107, 3)); AddSpinner(groupMedia, SETTING_PROFILE_MEDIA, 20060, 0, m_dbMode, entries); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/profiles/Profile.cpp kodi-15.2~git20151019.1039-final/xbmc/profiles/Profile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/profiles/Profile.cpp 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/profiles/Profile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -82,9 +82,7 @@ XMLUtils::GetBoolean(node, "hassources", m_bSources); XMLUtils::GetBoolean(node, "canwritesources", m_bCanWriteSources); XMLUtils::GetBoolean(node, "lockaddonmanager", m_locks.addonManager); - int settings = m_locks.settings; - XMLUtils::GetInt(node, "locksettings", settings); - m_locks.settings = (LOCK_LEVEL::SETTINGS_LOCK)settings; + XMLUtils::GetInt(node, "locksettings", (int&)m_locks.settings); XMLUtils::GetBoolean(node, "lockfiles", m_locks.files); XMLUtils::GetBoolean(node, "lockmusic", m_locks.music); XMLUtils::GetBoolean(node, "lockvideo", m_locks.video); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/profiles/ProfilesManager.cpp kodi-15.2~git20151019.1039-final/xbmc/profiles/ProfilesManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/profiles/ProfilesManager.cpp 2016-01-29 11:10:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/profiles/ProfilesManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,10 +18,6 @@ * */ -#include -#include -#include - #include "system.h" #include "ProfilesManager.h" #include "Application.h" @@ -30,7 +26,6 @@ #include "GUIInfoManager.h" #include "PasswordManager.h" #include "Util.h" -#include "addons/Skin.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogYesNo.h" #include "filesystem/Directory.h" @@ -50,7 +45,6 @@ #include "utils/log.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "utils/XMLUtils.h" // TODO @@ -66,23 +60,20 @@ #define XML_NEXTID "nextIdProfile" #define XML_PROFILE "profile" +using namespace std; using namespace XFILE; static CProfile EmptyProfile; CProfilesManager::CProfilesManager() - : m_usingLoginScreen(false), - m_profileLoadedForLogin(false), - m_autoLoginProfile(-1), - m_lastUsedProfile(0), - m_currentProfile(0), - m_nextProfileId(0) + : m_usingLoginScreen(false), m_autoLoginProfile(-1), m_lastUsedProfile(0), + m_currentProfile(0), m_nextProfileId(0) { } CProfilesManager::~CProfilesManager() { } -CProfilesManager& CProfilesManager::GetInstance() +CProfilesManager& CProfilesManager::Get() { static CProfilesManager sProfilesManager; return sProfilesManager; @@ -91,11 +82,11 @@ void CProfilesManager::OnSettingsLoaded() { // check them all - std::string strDir = CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH); + string strDir = CSettings::Get().GetString("system.playlistspath"); if (strDir == "set default" || strDir.empty()) { strDir = "special://profile/playlists/"; - CSettings::GetInstance().SetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH, strDir.c_str()); + CSettings::Get().SetString("system.playlistspath", strDir.c_str()); } CDirectory::Create(strDir); @@ -104,7 +95,7 @@ CDirectory::Create(URIUtils::AddFileToFolder(strDir,"mixed")); } -void CProfilesManager::OnSettingsSaved() const +void CProfilesManager::OnSettingsSaved() { // save mastercode Save(); @@ -194,7 +185,7 @@ return ret; } -bool CProfilesManager::Save() const +bool CProfilesManager::Save() { return Save(PROFILES_FILE); } @@ -214,7 +205,7 @@ XMLUtils::SetInt(pRoot, XML_AUTO_LOGIN, m_autoLoginProfile); XMLUtils::SetInt(pRoot, XML_NEXTID, m_nextProfileId); - for (std::vector::const_iterator profile = m_profiles.begin(); profile != m_profiles.end(); ++profile) + for (vector::const_iterator profile = m_profiles.begin(); profile != m_profiles.end(); ++profile) profile->Save(pRoot); // save the file @@ -225,7 +216,6 @@ { CSingleLock lock(m_critical); m_usingLoginScreen = false; - m_profileLoadedForLogin = false; m_lastUsedProfile = 0; m_nextProfileId = 0; SetCurrentProfileId(0); @@ -243,31 +233,25 @@ if (m_currentProfile == index) return true; - // save any settings of the currently used skin but only if the (master) - // profile hasn't just been loaded as a temporary profile for login - if (g_SkinInfo != nullptr && !m_profileLoadedForLogin) - g_SkinInfo->SaveSettings(); - // unload any old settings - CSettings::GetInstance().Unload(); + CSettings::Get().Unload(); SetCurrentProfileId(index); - m_profileLoadedForLogin = false; // load the new settings - if (!CSettings::GetInstance().Load()) + if (!CSettings::Get().Load()) { CLog::Log(LOGFATAL, "CProfilesManager: unable to load settings for profile \"%s\"", m_profiles.at(index).getName().c_str()); return false; } - CSettings::GetInstance().SetLoaded(); + CSettings::Get().SetLoaded(); CreateProfileFolders(); - CDatabaseManager::GetInstance().Initialize(); + CDatabaseManager::Get().Initialize(); CButtonTranslator::GetInstance().Load(true); - CInputManager::GetInstance().SetMouseEnabled(CSettings::GetInstance().GetBool(CSettings::SETTING_INPUT_ENABLEMOUSE)); + CInputManager::Get().SetMouseEnabled(CSettings::Get().GetBool("input.enablemouse")); g_infoManager.ResetCache(); g_infoManager.ResetLibraryBools(); @@ -277,8 +261,8 @@ CXBMCTinyXML doc; if (doc.LoadFile(URIUtils::AddFileToFolder(GetUserDataFolder(), "guisettings.xml"))) { - CSettings::GetInstance().LoadSetting(doc.RootElement(), CSettings::SETTING_MASTERLOCK_MAXRETRIES); - CSettings::GetInstance().LoadSetting(doc.RootElement(), CSettings::SETTING_MASTERLOCK_STARTUPLOCK); + CSettings::Get().LoadSetting(doc.RootElement(), "masterlock.maxretries"); + CSettings::Get().LoadSetting(doc.RootElement(), "masterlock.startuplock"); } } @@ -310,12 +294,14 @@ if (dlgYesNo == NULL) return false; - std::string str = g_localizeStrings.Get(13201); - dlgYesNo->SetHeading(CVariant{13200}); - dlgYesNo->SetLine(0, CVariant{StringUtils::Format(str.c_str(), profile->getName().c_str())}); - dlgYesNo->SetLine(1, CVariant{""}); - dlgYesNo->SetLine(2, CVariant{""}); - dlgYesNo->Open(); + string message; + string str = g_localizeStrings.Get(13201); + message = StringUtils::Format(str.c_str(), profile->getName().c_str()); + dlgYesNo->SetHeading(13200); + dlgYesNo->SetLine(0, message); + dlgYesNo->SetLine(1, ""); + dlgYesNo->SetLine(2, ""); + dlgYesNo->DoModal(); if (!dlgYesNo->IsConfirmed()) return false; @@ -325,14 +311,14 @@ m_autoLoginProfile = 0; // delete profile - std::string strDirectory = profile->getDirectory(); + string strDirectory = profile->getDirectory(); m_profiles.erase(m_profiles.begin() + index); // fall back to master profile if necessary if (index == m_currentProfile) { LoadProfile(0); - CSettings::GetInstance().Save(); + CSettings::Get().Save(); } CFileItemPtr item = CFileItemPtr(new CFileItem(URIUtils::AddFileToFolder(GetUserDataFolder(), strDirectory))); @@ -416,7 +402,7 @@ CSingleLock lock(m_critical); // data integrity check - covers off migration from old profiles.xml, // incrementing of the m_nextIdProfile,and bad data coming in - m_nextProfileId = std::max(m_nextProfileId, profile.getId() + 1); + m_nextProfileId = max(m_nextProfileId, profile.getId() + 1); m_profiles.push_back(profile); } @@ -434,12 +420,7 @@ // save the previous user m_lastUsedProfile = m_currentProfile; if (m_currentProfile != 0) - { LoadProfile(0); - - // remember that the (master) profile has only been loaded for login - m_profileLoadedForLogin = true; - } } bool CProfilesManager::GetProfileName(const size_t profileId, std::string& name) const diff -Nru kodi-16.1~git20160425.1001-final/xbmc/profiles/ProfilesManager.h kodi-15.2~git20151019.1039-final/xbmc/profiles/ProfilesManager.h --- kodi-16.1~git20160425.1001-final/xbmc/profiles/ProfilesManager.h 2016-01-29 11:10:36.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/profiles/ProfilesManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -31,11 +31,11 @@ class CProfilesManager : public ISettingsHandler { public: - static CProfilesManager& GetInstance(); + static CProfilesManager& Get(); - virtual void OnSettingsLoaded() override; - virtual void OnSettingsSaved() const override; - virtual void OnSettingsCleared() override; + virtual void OnSettingsLoaded(); + virtual void OnSettingsSaved(); + virtual void OnSettingsCleared(); bool Load(); /*! \brief Load the user profile information from disk @@ -46,7 +46,7 @@ */ bool Load(const std::string &file); - bool Save() const; + bool Save(); /*! \brief Save the user profile information to disk Saves the list of profiles to the profiles.xml file. \param file XML file to save. @@ -190,7 +190,6 @@ std::vector m_profiles; bool m_usingLoginScreen; - bool m_profileLoadedForLogin; int m_autoLoginProfile; uint32_t m_lastUsedProfile; uint32_t m_currentProfile; // do not modify directly, use SetCurrentProfileId() function instead diff -Nru kodi-16.1~git20160425.1001-final/xbmc/profiles/windows/GUIWindowSettingsProfile.cpp kodi-15.2~git20151019.1039-final/xbmc/profiles/windows/GUIWindowSettingsProfile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/profiles/windows/GUIWindowSettingsProfile.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/profiles/windows/GUIWindowSettingsProfile.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -35,7 +35,6 @@ #include "FileItem.h" #include "input/Key.h" #include "guilib/LocalizeStrings.h" -#include "utils/Variant.h" using namespace XFILE; @@ -66,7 +65,7 @@ void CGUIWindowSettingsProfile::OnPopupMenu(int iItem) { - if (iItem == (int)CProfilesManager::GetInstance().GetNumberOfProfiles()) + if (iItem == (int)CProfilesManager::Get().GetNumberOfProfiles()) return; // popup the context menu @@ -83,14 +82,14 @@ CGUIMessage msg2(GUI_MSG_ITEM_SELECTED, g_windowManager.GetActiveWindow(), iCtrlID); g_windowManager.SendMessage(msg2); g_application.getNetwork().NetworkMessage(CNetwork::SERVICES_DOWN,1); - CProfilesManager::GetInstance().LoadMasterProfileForLogin(); + CProfilesManager::Get().LoadMasterProfileForLogin(); CGUIWindowLoginScreen::LoadProfile(iItem); return; } if (choice == 2) { - if (CProfilesManager::GetInstance().DeleteProfile(iItem)) + if (CProfilesManager::Get().DeleteProfile(iItem)) iItem--; } @@ -130,13 +129,13 @@ if (iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_RIGHT_CLICK) { //contextmenu - if (iItem <= (int)CProfilesManager::GetInstance().GetNumberOfProfiles() - 1) + if (iItem <= (int)CProfilesManager::Get().GetNumberOfProfiles() - 1) { OnPopupMenu(iItem); } return true; } - else if (iItem < (int)CProfilesManager::GetInstance().GetNumberOfProfiles()) + else if (iItem < (int)CProfilesManager::Get().GetNumberOfProfiles()) { if (CGUIDialogProfileSettings::ShowForProfile(iItem)) { @@ -149,10 +148,10 @@ return false; } - else if (iItem > (int)CProfilesManager::GetInstance().GetNumberOfProfiles() - 1) + else if (iItem > (int)CProfilesManager::Get().GetNumberOfProfiles() - 1) { - CDirectory::Create(URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetUserDataFolder(),"profiles")); - if (CGUIDialogProfileSettings::ShowForProfile(CProfilesManager::GetInstance().GetNumberOfProfiles())) + CDirectory::Create(URIUtils::AddFileToFolder(CProfilesManager::Get().GetUserDataFolder(),"profiles")); + if (CGUIDialogProfileSettings::ShowForProfile(CProfilesManager::Get().GetNumberOfProfiles())) { LoadList(); CGUIMessage msg(GUI_MSG_ITEM_SELECT, GetID(), 2,iItem); @@ -166,18 +165,18 @@ } else if (iControl == CONTROL_LOGINSCREEN) { - CProfilesManager::GetInstance().ToggleLoginScreen(); - CProfilesManager::GetInstance().Save(); + CProfilesManager::Get().ToggleLoginScreen(); + CProfilesManager::Get().Save(); return true; } else if (iControl == CONTROL_AUTOLOGIN) { - int currentId = CProfilesManager::GetInstance().GetAutoLoginProfileId(); + int currentId = CProfilesManager::Get().GetAutoLoginProfileId(); int profileId; if (GetAutoLoginProfileChoice(profileId) && (currentId != profileId)) { - CProfilesManager::GetInstance().SetAutoLoginProfileId(profileId); - CProfilesManager::GetInstance().Save(); + CProfilesManager::Get().SetAutoLoginProfileId(profileId); + CProfilesManager::Get().Save(); } return true; } @@ -192,9 +191,9 @@ { ClearListItems(); - for (unsigned int i = 0; i < CProfilesManager::GetInstance().GetNumberOfProfiles(); i++) + for (unsigned int i = 0; i < CProfilesManager::Get().GetNumberOfProfiles(); i++) { - const CProfile *profile = CProfilesManager::GetInstance().GetProfile(i); + const CProfile *profile = CProfilesManager::Get().GetProfile(i); CFileItemPtr item(new CFileItem(profile->getName())); item->SetLabel2(profile->getDate()); item->SetArt("thumb", profile->getThumb()); @@ -208,7 +207,7 @@ CGUIMessage msg(GUI_MSG_LABEL_BIND, GetID(), CONTROL_PROFILES, 0, 0, m_listItems); OnMessage(msg); - if (CProfilesManager::GetInstance().UsingLoginScreen()) + if (CProfilesManager::Get().UsingLoginScreen()) { CONTROL_SELECT(CONTROL_LOGINSCREEN); } @@ -239,16 +238,16 @@ // add items // "Last used profile" option comes first, so up indices by 1 - int autoLoginProfileId = CProfilesManager::GetInstance().GetAutoLoginProfileId() + 1; + int autoLoginProfileId = CProfilesManager::Get().GetAutoLoginProfileId() + 1; CFileItemList items; CFileItemPtr item(new CFileItem()); item->SetLabel(g_localizeStrings.Get(37014)); // Last used profile item->SetIconImage("unknown-user.png"); items.Add(item); - for (unsigned int i = 0; i < CProfilesManager::GetInstance().GetNumberOfProfiles(); i++) + for (unsigned int i = 0; i < CProfilesManager::Get().GetNumberOfProfiles(); i++) { - const CProfile *profile = CProfilesManager::GetInstance().GetProfile(i); + const CProfile *profile = CProfilesManager::Get().GetProfile(i); std::string locked = g_localizeStrings.Get(profile->getLockMode() > 0 ? 20166 : 20165); CFileItemPtr item(new CFileItem(profile->getName())); item->SetProperty("Addon.Summary", locked); // lock setting @@ -259,11 +258,11 @@ items.Add(item); } - dialog->SetHeading(CVariant{20093}); // Profile name + dialog->SetHeading(20093); // Profile name dialog->Reset(); - dialog->SetItems(items); + dialog->SetItems(&items); dialog->SetSelected(autoLoginProfileId); - dialog->Open(); + dialog->DoModal(); if (dialog->IsButtonPressed() || dialog->GetSelectedLabel() < 0) return false; // user cancelled diff -Nru kodi-16.1~git20160425.1001-final/xbmc/programs/GUIViewStatePrograms.cpp kodi-15.2~git20151019.1039-final/xbmc/programs/GUIViewStatePrograms.cpp --- kodi-16.1~git20160425.1001-final/xbmc/programs/GUIViewStatePrograms.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/programs/GUIViewStatePrograms.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -33,9 +33,9 @@ CGUIViewStateWindowPrograms::CGUIViewStateWindowPrograms(const CFileItemList& items) : CGUIViewState(items) { AddSortMethod(SortByLabel, 551, LABEL_MASKS("%K", "%I", "%L", ""), // Titel, Size | Foldername, empty - CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("programs"); + const CViewState *viewState = CViewStateSettings::Get().Get("programs"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -45,7 +45,7 @@ void CGUIViewStateWindowPrograms::SaveViewState() { - SaveViewToDb(m_items.GetPath(), WINDOW_PROGRAMS, CViewStateSettings::GetInstance().Get("programs")); + SaveViewToDb(m_items.GetPath(), WINDOW_PROGRAMS, CViewStateSettings::Get().Get("programs")); } std::string CGUIViewStateWindowPrograms::GetLockType() @@ -65,7 +65,7 @@ AddAndroidSource("apps", g_localizeStrings.Get(20244), "DefaultProgram.png"); #endif - VECSOURCES *programSources = CMediaSourceSettings::GetInstance().GetSources("programs"); + VECSOURCES *programSources = CMediaSourceSettings::Get().GetSources("programs"); AddOrReplace(*programSources, CGUIViewState::GetSources()); return *programSources; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/programs/GUIWindowPrograms.cpp kodi-15.2~git20151019.1039-final/xbmc/programs/GUIWindowPrograms.cpp --- kodi-16.1~git20160425.1001-final/xbmc/programs/GUIWindowPrograms.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/programs/GUIWindowPrograms.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -65,7 +65,7 @@ // is this the first time accessing this window? if (m_vecItems->GetPath() == "?" && message.GetStringParam().empty()) - message.SetStringParam(CMediaSourceSettings::GetInstance().GetDefaultSource("programs")); + message.SetStringParam(CMediaSourceSettings::Get().GetDefaultSource("programs")); return CGUIMediaWindow::OnMessage(message); } @@ -84,7 +84,7 @@ } else if (iAction == ACTION_SHOW_INFO) { - OnItemInfo(iItem); + OnInfo(iItem); return true; } } @@ -118,7 +118,7 @@ } CGUIMediaWindow::GetContextButtons(itemNumber, buttons); - CContextMenuManager::GetInstance().AddVisibleItems(item, buttons); + CContextMenuManager::Get().AddVisibleItems(item, buttons); } bool CGUIWindowPrograms::OnContextButton(int itemNumber, CONTEXT_BUTTON button) @@ -137,7 +137,7 @@ return true; case CONTEXT_BUTTON_INFO: - OnItemInfo(itemNumber); + OnInfo(itemNumber); return true; default: @@ -219,7 +219,7 @@ return CGUIMediaWindow::GetStartFolder(dir); } -void CGUIWindowPrograms::OnItemInfo(int iItem) +void CGUIWindowPrograms::OnInfo(int iItem) { if (iItem < 0 || iItem >= m_vecItems->Size()) return; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/programs/GUIWindowPrograms.h kodi-15.2~git20151019.1039-final/xbmc/programs/GUIWindowPrograms.h --- kodi-16.1~git20160425.1001-final/xbmc/programs/GUIWindowPrograms.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/programs/GUIWindowPrograms.h 2014-12-18 01:01:57.000000000 +0000 @@ -31,7 +31,7 @@ CGUIWindowPrograms(void); virtual ~CGUIWindowPrograms(void); virtual bool OnMessage(CGUIMessage& message); - virtual void OnItemInfo(int iItem); + virtual void OnInfo(int iItem); protected: virtual void OnItemLoaded(CFileItem* pItem) {}; virtual bool Update(const std::string& strDirectory, bool updateFilterPath = true); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/addons/PVRClient.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/addons/PVRClient.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/addons/PVRClient.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/addons/PVRClient.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,35 +19,25 @@ */ #include "Application.h" -#include "epg/Epg.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" -#include "settings/AdvancedSettings.h" -#include "settings/Settings.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/Variant.h" - +#include "PVRClient.h" +#include "dialogs/GUIDialogYesNo.h" #include "pvr/PVRManager.h" #include "pvr/addons/PVRClients.h" +#include "epg/Epg.h" #include "pvr/channels/PVRChannelGroupsContainer.h" -#include "pvr/recordings/PVRRecordings.h" #include "pvr/timers/PVRTimers.h" #include "pvr/timers/PVRTimerInfoTag.h" -#include "pvr/timers/PVRTimerType.h" - -#include "PVRClient.h" +#include "pvr/recordings/PVRRecordings.h" +#include "settings/AdvancedSettings.h" +#include "settings/Settings.h" +#include "utils/log.h" +#include "utils/StringUtils.h" #include -#include -#include using namespace ADDON; using namespace PVR; using namespace EPG; -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; #define DEFAULT_INFO_STRING_VALUE "unknown" @@ -66,10 +56,10 @@ { ResetProperties(); - m_strAvahiType = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@avahi_type"); - m_strAvahiIpSetting = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@avahi_ip_setting"); - m_strAvahiPortSetting = CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@avahi_port_setting"); - m_bNeedsConfiguration = !(CAddonMgr::GetInstance().GetExtValue(ext->configuration, "@needs_configuration") == "false"); + m_strAvahiType = CAddonMgr::Get().GetExtValue(ext->configuration, "@avahi_type"); + m_strAvahiIpSetting = CAddonMgr::Get().GetExtValue(ext->configuration, "@avahi_ip_setting"); + m_strAvahiPortSetting = CAddonMgr::Get().GetExtValue(ext->configuration, "@avahi_port_setting"); + m_bNeedsConfiguration = !(CAddonMgr::Get().GetExtValue(ext->configuration, "@needs_configuration") == "false"); } CPVRClient::~CPVRClient(void) @@ -83,15 +73,15 @@ void CPVRClient::OnDisabled() { // restart the PVR manager if we're disabling a client - if (CPVRManager::GetInstance().IsStarted() && CPVRManager::GetInstance().RestartManagerOnAddonDisabled()) - CPVRManager::GetInstance().Start(true); + if (CPVRManager::Get().IsStarted() && CPVRManager::Get().RestartManagerOnAddonDisabled()) + CPVRManager::Get().Start(true); } void CPVRClient::OnEnabled() { // restart the PVR manager if we're enabling a client - if (CPVRManager::GetInstance().RestartManagerOnAddonDisabled()) - CPVRManager::GetInstance().Start(true); + if (CPVRManager::Get().RestartManagerOnAddonDisabled()) + CPVRManager::Get().Start(true); } AddonPtr CPVRClient::GetRunningInstance() const @@ -108,35 +98,35 @@ void CPVRClient::OnPreInstall() { // stop the pvr manager, so running pvr add-ons are stopped and closed - PVR::CPVRManager::GetInstance().Stop(); + PVR::CPVRManager::Get().Stop(); } void CPVRClient::OnPostInstall(bool update, bool modal) { // (re)start the pvr manager - PVR::CPVRManager::GetInstance().Start(true); + PVR::CPVRManager::Get().Start(true); } void CPVRClient::OnPreUnInstall() { // stop the pvr manager, so running pvr add-ons are stopped and closed - PVR::CPVRManager::GetInstance().Stop(); + PVR::CPVRManager::Get().Stop(); } void CPVRClient::OnPostUnInstall() { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_ENABLED)) - PVR::CPVRManager::GetInstance().Start(true); + if (CSettings::Get().GetBool("pvrmanager.enabled")) + PVR::CPVRManager::Get().Start(true); } -bool CPVRClient::CanInstall() +bool CPVRClient::CanInstall(const std::string &referer) { - if (!PVR::CPVRManager::GetInstance().InstallAddonAllowed(ID())) + if (!PVR::CPVRManager::Get().InstallAddonAllowed(ID())) { - PVR::CPVRManager::GetInstance().MarkAsOutdated(ID()); + PVR::CPVRManager::Get().MarkAsOutdated(ID(), referer); return false; } - return CAddon::CanInstall(); + return CAddon::CanInstall(referer); } void CPVRClient::ResetProperties(int iClientId /* = PVR_INVALID_CLIENT_ID */) @@ -149,7 +139,6 @@ m_strClientPath = CSpecialProtocol::TranslatePath(Path()); m_pInfo->strClientPath = m_strClientPath.c_str(); m_menuhooks.clear(); - m_timertypes.clear(); m_bReadyToUse = false; m_iClientId = iClientId; m_strBackendVersion = DEFAULT_INFO_STRING_VALUE; @@ -169,6 +158,9 @@ if (iClientId <= PVR_INVALID_CLIENT_ID) return status; + /* ensure that a previous instance is destroyed */ + Destroy(); + /* reset all properties to defaults */ ResetProperties(iClientId); @@ -290,32 +282,25 @@ memset(&addonTimer, 0, sizeof(addonTimer)); - addonTimer.iClientIndex = xbmcTimer.m_iClientIndex; - addonTimer.iParentClientIndex = xbmcTimer.m_iParentClientIndex; - addonTimer.state = xbmcTimer.m_state; - addonTimer.iTimerType = xbmcTimer.GetTimerType() ? xbmcTimer.GetTimerType()->GetTypeId() : PVR_TIMER_TYPE_NONE; - addonTimer.iClientChannelUid = xbmcTimer.m_iClientChannelUid; + addonTimer.iClientIndex = xbmcTimer.m_iClientIndex; + addonTimer.state = xbmcTimer.m_state; + addonTimer.iClientIndex = xbmcTimer.m_iClientIndex; + addonTimer.iClientChannelUid = xbmcTimer.m_iClientChannelUid; strncpy(addonTimer.strTitle, xbmcTimer.m_strTitle.c_str(), sizeof(addonTimer.strTitle) - 1); - strncpy(addonTimer.strEpgSearchString, xbmcTimer.m_strEpgSearchString.c_str(), sizeof(addonTimer.strEpgSearchString) - 1); - addonTimer.bFullTextEpgSearch = xbmcTimer.m_bFullTextEpgSearch; strncpy(addonTimer.strDirectory, xbmcTimer.m_strDirectory.c_str(), sizeof(addonTimer.strDirectory) - 1); - addonTimer.iPriority = xbmcTimer.m_iPriority; - addonTimer.iLifetime = xbmcTimer.m_iLifetime; - addonTimer.iMaxRecordings = xbmcTimer.m_iMaxRecordings; - addonTimer.iPreventDuplicateEpisodes = xbmcTimer.m_iPreventDupEpisodes; - addonTimer.iRecordingGroup = xbmcTimer.m_iRecordingGroup; - addonTimer.iWeekdays = xbmcTimer.m_iWeekdays; - addonTimer.startTime = start - g_advancedSettings.m_iPVRTimeCorrection; - addonTimer.endTime = end - g_advancedSettings.m_iPVRTimeCorrection; - addonTimer.bStartAnyTime = xbmcTimer.m_bStartAnyTime; - addonTimer.bEndAnyTime = xbmcTimer.m_bEndAnyTime; - addonTimer.firstDay = firstDay - g_advancedSettings.m_iPVRTimeCorrection; - addonTimer.iEpgUid = epgTag ? epgTag->UniqueBroadcastID() : PVR_TIMER_NO_EPG_UID; + addonTimer.iPriority = xbmcTimer.m_iPriority; + addonTimer.iLifetime = xbmcTimer.m_iLifetime; + addonTimer.bIsRepeating = xbmcTimer.m_bIsRepeating; + addonTimer.iWeekdays = xbmcTimer.m_iWeekdays; + addonTimer.startTime = start - g_advancedSettings.m_iPVRTimeCorrection; + addonTimer.endTime = end - g_advancedSettings.m_iPVRTimeCorrection; + addonTimer.firstDay = firstDay - g_advancedSettings.m_iPVRTimeCorrection; + addonTimer.iEpgUid = epgTag ? epgTag->UniqueBroadcastID() : -1; strncpy(addonTimer.strSummary, xbmcTimer.m_strSummary.c_str(), sizeof(addonTimer.strSummary) - 1); - addonTimer.iMarginStart = xbmcTimer.m_iMarginStart; - addonTimer.iMarginEnd = xbmcTimer.m_iMarginEnd; - addonTimer.iGenreType = xbmcTimer.m_iGenreType; - addonTimer.iGenreSubType = xbmcTimer.m_iGenreSubType; + addonTimer.iMarginStart = xbmcTimer.m_iMarginStart; + addonTimer.iMarginEnd = xbmcTimer.m_iMarginEnd; + addonTimer.iGenreType = xbmcTimer.m_iGenreType; + addonTimer.iGenreSubType = xbmcTimer.m_iGenreSubType; } /*! @@ -387,7 +372,6 @@ { std::string strBackendName, strConnectionString, strFriendlyName, strBackendVersion, strBackendHostname; PVR_ADDON_CAPABILITIES addonCapabilities; - CPVRTimerTypes timerTypes; /* get the capabilities */ try @@ -421,119 +405,6 @@ try { strBackendHostname = m_pStruct->GetBackendHostname(); } catch (std::exception &e) { LogException(e, "GetBackendHostname()"); return false; } - /* timer types */ - if (addonCapabilities.bSupportsTimers) - { - try - { - std::unique_ptr types_array(new PVR_TIMER_TYPE[PVR_ADDON_TIMERTYPE_ARRAY_SIZE]); - int size = PVR_ADDON_TIMERTYPE_ARRAY_SIZE; - - PVR_ERROR retval = m_pStruct->GetTimerTypes(types_array.get(), &size); - - if (retval == PVR_ERROR_NOT_IMPLEMENTED) - { - // begin compat section - CLog::Log(LOGWARNING, "%s - Addon %s does not support timer types. It will work, but not benefit from the timer features introduced with PVR Addon API 2.0.0", __FUNCTION__, strFriendlyName.c_str()); - - // Create standard timer types (mostly) matching the timer functionality available in Isengard. - // This is for migration only and does not make changes to the addons obsolete. Addons should - // work and benefit from some UI changes (e.g. some of the timer settings dialog enhancements), - // but all old problems/bugs due to static attributes and values will remain the same as in - // Isengard. Also, new features (like epg search) are not available to addons automatically. - // This code can be removed once all addons actually support the respective PVR Addon API version. - - size = 0; - // One-shot manual - memset(&types_array[size], 0, sizeof(types_array[size])); - types_array[size].iId = size + 1; - types_array[size].iAttributes = PVR_TIMER_TYPE_IS_MANUAL | - PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE | - PVR_TIMER_TYPE_SUPPORTS_CHANNELS | - PVR_TIMER_TYPE_SUPPORTS_START_TIME | - PVR_TIMER_TYPE_SUPPORTS_END_TIME | - PVR_TIMER_TYPE_SUPPORTS_PRIORITY | - PVR_TIMER_TYPE_SUPPORTS_LIFETIME | - PVR_TIMER_TYPE_SUPPORTS_RECORDING_FOLDERS; - size++; - - // Repeating manual - memset(&types_array[size], 0, sizeof(types_array[size])); - types_array[size].iId = size + 1; - types_array[size].iAttributes = PVR_TIMER_TYPE_IS_MANUAL | - PVR_TIMER_TYPE_IS_REPEATING | - PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE | - PVR_TIMER_TYPE_SUPPORTS_CHANNELS | - PVR_TIMER_TYPE_SUPPORTS_START_TIME | - PVR_TIMER_TYPE_SUPPORTS_END_TIME | - PVR_TIMER_TYPE_SUPPORTS_PRIORITY | - PVR_TIMER_TYPE_SUPPORTS_LIFETIME | - PVR_TIMER_TYPE_SUPPORTS_FIRST_DAY | - PVR_TIMER_TYPE_SUPPORTS_WEEKDAYS | - PVR_TIMER_TYPE_SUPPORTS_RECORDING_FOLDERS; - size++; - - if (addonCapabilities.bSupportsEPG) - { - // One-shot epg-based - memset(&types_array[size], 0, sizeof(types_array[size])); - types_array[size].iId = size + 1; - types_array[size].iAttributes = PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE | - PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE | - PVR_TIMER_TYPE_SUPPORTS_CHANNELS | - PVR_TIMER_TYPE_SUPPORTS_START_TIME | - PVR_TIMER_TYPE_SUPPORTS_END_TIME | - PVR_TIMER_TYPE_SUPPORTS_PRIORITY | - PVR_TIMER_TYPE_SUPPORTS_LIFETIME | - PVR_TIMER_TYPE_SUPPORTS_RECORDING_FOLDERS; - size++; - } - - retval = PVR_ERROR_NO_ERROR; - // end compat section - } - - if (retval == PVR_ERROR_NO_ERROR) - { - timerTypes.reserve(size); - for (int i = 0; i < size; ++i) - { - if (types_array[i].iId == PVR_TIMER_TYPE_NONE) - { - CLog::Log(LOGERROR, "PVR - invalid timer type supplied by add-on '%s'. Please contact the developer of this add-on: %s", GetFriendlyName().c_str(), Author().c_str()); - continue; - } - - if (strlen(types_array[i].strDescription) == 0) - { - int id; - if (types_array[i].iAttributes & PVR_TIMER_TYPE_IS_REPEATING) - { - id = (types_array[i].iAttributes & PVR_TIMER_TYPE_IS_MANUAL) - ? 822 // "Repeating" - : 823; // "Repeating (Guide-based)" - } - else - { - id = (types_array[i].iAttributes & PVR_TIMER_TYPE_IS_MANUAL) - ? 820 // "One Time" - : 821; // "One Time (Guide-based) - } - std::string descr(g_localizeStrings.Get(id)); - strncpy(types_array[i].strDescription, descr.c_str(), descr.size()); - } - timerTypes.push_back(CPVRTimerTypePtr(new CPVRTimerType(types_array[i], m_iClientId))); - } - } - else - { - CLog::Log(LOGERROR, "PVR - couldn't get the timer types for add-on '%s'. Please contact the developer of this add-on: %s", GetFriendlyName().c_str(), Author().c_str()); - return false; - } - } - catch (std::exception &e) { LogException(e, "GetTimerTypes()"); return false; } - } - /* update the members */ m_strBackendName = strBackendName; m_strConnectionString = strConnectionString; @@ -541,7 +412,6 @@ m_strBackendVersion = strBackendVersion; m_addonCapabilities = addonCapabilities; m_strBackendHostname = strBackendHostname; - m_timertypes = timerTypes; return true; } @@ -1297,15 +1167,6 @@ return retVal; } -PVR_ERROR CPVRClient::GetTimerTypes(CPVRTimerTypes& results) const -{ - if (!m_bReadyToUse) - return PVR_ERROR_REJECTED; - - results = m_timertypes; - return PVR_ERROR_NO_ERROR; -} - int CPVRClient::ReadStream(void* lpBuf, int64_t uiBufSize) { if (IsPlayingLiveStream()) @@ -1611,6 +1472,11 @@ return m_addonCapabilities.bSupportsRecordingsUndelete; } +bool CPVRClient::SupportsRecordingFolders(void) const +{ + return m_addonCapabilities.bSupportsRecordingFolders; +} + bool CPVRClient::SupportsRecordingPlayCount(void) const { return m_addonCapabilities.bSupportsRecordingPlayCount; @@ -1840,21 +1706,6 @@ return bReturn; } -bool CPVRClient::IsTimeshifting(void) const -{ - bool bReturn(false); - if (IsPlaying()) - { - try - { - if (m_pStruct->IsTimeshifting) - bReturn = m_pStruct->IsTimeshifting(); - } - catch (std::exception &e) { LogException(e, __FUNCTION__); } - } - return bReturn; -} - time_t CPVRClient::GetPlayingTime(void) const { time_t time = 0; @@ -1947,10 +1798,10 @@ std::string strLogLine(StringUtils::Format(g_localizeStrings.Get(19689).c_str(), (*it).GetName().c_str(), (*it).GetIP().c_str())); CLog::Log(LOGDEBUG, "%s - %s", __FUNCTION__, strLogLine.c_str()); - if (DialogResponse::YES != - HELPERS::ShowYesNoDialogLines(CVariant{19688}, // Scanning for PVR services - CVariant{strLogLine}, - CVariant{19690})) // Do you want to use this service? + if (!CGUIDialogYesNo::ShowAndGetInput(19688, // Scanning for PVR services + strLogLine, + 19690, // Do you want to use this service? + "")) { CLog::Log(LOGDEBUG, "%s - %s service found but not enabled by the user", __FUNCTION__, (*it).GetName().c_str()); m_rejectedAvahiHosts.push_back(*it); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/addons/PVRClient.h kodi-15.2~git20151019.1039-final/xbmc/pvr/addons/PVRClient.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/addons/PVRClient.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/addons/PVRClient.h 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,6 @@ #include "addons/AddonDll.h" #include "addons/DllPVRClient.h" #include "network/ZeroconfBrowser.h" - #include "pvr/channels/PVRChannel.h" #include "pvr/recordings/PVRRecordings.h" @@ -42,15 +41,11 @@ class CPVRRecordings; class CPVREpgContainer; class CPVRClient; - class CPVRTimerType; typedef std::vector PVR_MENUHOOKS; typedef std::shared_ptr PVR_CLIENT; #define PVR_INVALID_CLIENT_ID (-2) - typedef std::shared_ptr CPVRTimerTypePtr; - typedef std::vector CPVRTimerTypes; - /*! * Interface from XBMC to a PVR add-on. * @@ -70,7 +65,7 @@ virtual void OnPostInstall(bool update, bool modal); virtual void OnPreUnInstall(); virtual void OnPostUnInstall(); - virtual bool CanInstall(); + virtual bool CanInstall(const std::string &referer); bool NeedsConfiguration(void) const { return m_bNeedsConfiguration; } /** @name PVR add-on methods */ @@ -384,13 +379,6 @@ */ PVR_ERROR UpdateTimer(const CPVRTimerInfoTag &timer); - /*! - * @brief Get all timer types supported by the backend. - * @param results The container to store the result in. - * @return PVR_ERROR_NO_ERROR if the list has been fetched successfully. - */ - PVR_ERROR GetTimerTypes(CPVRTimerTypes& results) const; - //@} /** @name PVR live stream methods */ //@{ @@ -538,6 +526,7 @@ bool SupportsRadio(void) const; bool SupportsRecordings(void) const; bool SupportsRecordingsUndelete(void) const; + bool SupportsRecordingFolders(void) const; bool SupportsRecordingPlayCount(void) const; bool SupportsRecordingEdl(void) const; bool SupportsTimers(void) const; @@ -557,11 +546,6 @@ static const char *ToString(const PVR_ERROR error); /*! - * @brief is timeshift active? - */ - bool IsTimeshifting() const; - - /*! * @brief actual playing time */ time_t GetPlayingTime() const; @@ -664,7 +648,6 @@ bool m_bReadyToUse; /*!< true if this add-on is connected to the backend, false otherwise */ std::string m_strHostName; /*!< the host name */ PVR_MENUHOOKS m_menuhooks; /*!< the menu hooks for this add-on */ - CPVRTimerTypes m_timertypes; /*!< timer types supported by this backend */ int m_iClientId; /*!< database ID of the client */ /* cached data */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/addons/PVRClients.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/addons/PVRClients.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/addons/PVRClients.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/addons/PVRClients.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,29 +20,25 @@ #include "PVRClients.h" -#include -#include - #include "Application.h" -#include "cores/IPlayer.h" +#include "ApplicationMessenger.h" +#include "GUIUserMessages.h" #include "dialogs/GUIDialogExtendedProgressBar.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogSelect.h" +#include "pvr/PVRManager.h" #include "guilib/GUIWindowManager.h" -#include "GUIUserMessages.h" -#include "messaging/ApplicationMessenger.h" -#include "pvr/channels/PVRChannelGroupInternal.h" +#include "settings/Settings.h" #include "pvr/channels/PVRChannelGroups.h" -#include "pvr/PVRManager.h" +#include "pvr/channels/PVRChannelGroupInternal.h" #include "pvr/recordings/PVRRecordings.h" #include "pvr/timers/PVRTimers.h" -#include "settings/Settings.h" -#include "utils/Variant.h" + +#include using namespace ADDON; using namespace PVR; using namespace EPG; -using namespace KODI::MESSAGING; /** number of iterations when scanning for add-ons. don't use a timer because the user may block in the dialog */ #define PVR_CLIENT_AVAHI_SCAN_ITERATIONS (20) @@ -197,7 +193,7 @@ CSingleLock lock(m_critSection); for (PVR_CLIENTMAP_CITR itr = m_clientMap.begin(); itr != m_clientMap.end(); itr++) - if (!CAddonMgr::GetInstance().IsAddonDisabled(itr->second->ID())) + if (!CAddonMgr::Get().IsAddonDisabled(itr->second->ID())) ++iReturn; return iReturn; @@ -206,7 +202,7 @@ bool CPVRClients::HasEnabledClients(void) const { for (PVR_CLIENTMAP_CITR itr = m_clientMap.begin(); itr != m_clientMap.end(); itr++) - if (!CAddonMgr::GetInstance().IsAddonDisabled(itr->second->ID())) + if (!CAddonMgr::Get().IsAddonDisabled(itr->second->ID())) return true; return false; } @@ -389,7 +385,8 @@ } else { - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast(new CFileItem(channel))); + CFileItem m_currentFile(channel); + CApplicationMessenger::Get().PlayFile(m_currentFile, false); bSwitchSuccessful = true; } } @@ -514,47 +511,6 @@ return error; } -PVR_ERROR CPVRClients::GetTimerTypes(CPVRTimerTypes& results) const -{ - PVR_ERROR error(PVR_ERROR_NO_ERROR); - - PVR_CLIENTMAP clients; - GetConnectedClients(clients); - - for (const auto &clientEntry : clients) - { - CPVRTimerTypes types; - PVR_ERROR currentError = clientEntry.second->GetTimerTypes(types); - if (currentError != PVR_ERROR_NOT_IMPLEMENTED && - currentError != PVR_ERROR_NO_ERROR) - { - CLog::Log(LOGERROR, "PVR - %s - cannot get timer types from client '%d': %s",__FUNCTION__, clientEntry.first, CPVRClient::ToString(currentError)); - error = currentError; - } - else - { - for (const auto &typesEntry : types) - results.push_back(typesEntry); - } - } - - return error; -} - -PVR_ERROR CPVRClients::GetTimerTypes(CPVRTimerTypes& results, int iClientId) const -{ - PVR_ERROR error(PVR_ERROR_UNKNOWN); - - PVR_CLIENT client; - if (GetConnectedClient(iClientId, client)) - error = client->GetTimerTypes(results); - - if (error != PVR_ERROR_NO_ERROR) - CLog::Log(LOGERROR, "PVR - %s - cannot get timer types from client '%d': %s",__FUNCTION__, iClientId, CPVRClient::ToString(error)); - - return error; -} - PVR_ERROR CPVRClients::GetRecordings(CPVRRecordings *recordings, bool deleted) { PVR_ERROR error(PVR_ERROR_NO_ERROR); @@ -639,8 +595,8 @@ // have user select client CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); - pDialog->SetHeading(CVariant{19292}); //Delete all permanently - pDialog->Add(g_localizeStrings.Get(24032)); // All Add-ons + pDialog->SetHeading(19292); /* Delete all permanently */ + pDialog->Add(g_localizeStrings.Get(24032)); /* All Add-ons */ PVR_CLIENTMAP_CITR itrClients; for (itrClients = clients.begin(); itrClients != clients.end(); ++itrClients) @@ -648,7 +604,7 @@ if (itrClients->second->SupportsRecordingsUndelete() && itrClients->second->GetRecordingsAmount(true) > 0) pDialog->Add(itrClients->second->GetBackendName()); } - pDialog->Open(); + pDialog->DoModal(); selection = pDialog->GetSelectedLabel(); } @@ -882,14 +838,14 @@ // have user select client CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); - pDialog->SetHeading(CVariant{19196}); + pDialog->SetHeading(19196); PVR_CLIENTMAP_CITR itrClients; for (itrClients = clients.begin(); itrClients != clients.end(); itrClients++) { pDialog->Add(itrClients->second->GetBackendName()); } - pDialog->Open(); + pDialog->DoModal(); int selection = pDialog->GetSelectedLabel(); if (selection >= 0) @@ -914,7 +870,7 @@ CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); - pDialog->SetHeading(CVariant{19196}); + pDialog->SetHeading(19196); for (unsigned int i = 0; i < hooks->size(); i++) if (hooks->at(i).category == cat || hooks->at(i).category == PVR_MENUHOOK_ALL) { @@ -923,7 +879,7 @@ } if (hookIDs.size() > 1) { - pDialog->Open(); + pDialog->DoModal(); selection = pDialog->GetSelectedLabel(); } if (selection >= 0) @@ -965,12 +921,12 @@ CGUIDialogSelect* pDialog= (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); - pDialog->SetHeading(CVariant{19119}); + pDialog->SetHeading(19119); for (unsigned int i = 0; i < possibleScanClients.size(); i++) pDialog->Add(possibleScanClients[i]->GetFriendlyName()); - pDialog->Open(); + pDialog->DoModal(); int selection = pDialog->GetSelectedLabel(); if (selection >= 0) @@ -984,7 +940,7 @@ /* no clients found */ else if (!scanClient) { - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19192}); + CGUIDialogOK::ShowAndGetInput(19033, 19192); return; } @@ -999,7 +955,7 @@ /* do the scan */ if (scanClient->StartChannelScan() != PVR_ERROR_NO_ERROR) /* an error occured */ - CGUIDialogOK::ShowAndGetInput(CVariant{19111}, CVariant{19193}); + CGUIDialogOK::ShowAndGetInput(19111, 19193); /* restart the supervisor thread */ g_PVRManager.StartUpdateThreads(); @@ -1038,7 +994,7 @@ if (error == PVR_ERROR_NOT_IMPLEMENTED) { - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19038}); + CGUIDialogOK::ShowAndGetInput(19033, 19038); return true; } @@ -1057,7 +1013,7 @@ if (error == PVR_ERROR_NOT_IMPLEMENTED) { - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19038}); + CGUIDialogOK::ShowAndGetInput(19033, 19038); return true; } @@ -1076,7 +1032,7 @@ if (error == PVR_ERROR_NOT_IMPLEMENTED) { - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19038}); + CGUIDialogOK::ShowAndGetInput(19033, 19038); return true; } @@ -1161,7 +1117,7 @@ for (VECADDONS::iterator it = map.begin(); it != map.end(); ++it) { bool bEnabled = (*it)->Enabled() && - !CAddonMgr::GetInstance().IsAddonDisabled((*it)->ID()); + !CAddonMgr::Get().IsAddonDisabled((*it)->ID()); if (!bEnabled && IsKnownClient(*it)) { @@ -1224,7 +1180,7 @@ } if (bDisabled && (g_PVRManager.IsStarted() || g_PVRManager.IsInitialising())) - CGUIDialogOK::ShowAndGetInput(CVariant{24070}, CVariant{16029}); + CGUIDialogOK::ShowAndGetInput(24070, 16029); } } @@ -1235,7 +1191,7 @@ for (VECADDONS::iterator it = disableAddons.begin(); it != disableAddons.end(); ++it) { // disable in the add-on db - CAddonMgr::GetInstance().DisableAddon((*it)->ID()); + CAddonMgr::Get().DisableAddon((*it)->ID()); // remove from the pvr add-on list VECADDONS::iterator addonPtr = std::find(m_addons.begin(), m_addons.end(), *it); @@ -1251,8 +1207,8 @@ { bool bCheckedEnabledClientsOnStartup(false); - CAddonMgr::GetInstance().RegisterAddonMgrCallback(ADDON_PVRDLL, this); - CAddonMgr::GetInstance().RegisterObserver(this); + CAddonMgr::Get().RegisterAddonMgrCallback(ADDON_PVRDLL, this); + CAddonMgr::Get().RegisterObserver(this); UpdateAddons(); @@ -1285,12 +1241,12 @@ std::vector autoConfigAddons; PVR_CLIENT addon; VECADDONS map; - CAddonMgr::GetInstance().GetAddons(ADDON_PVRDLL, map, false); + CAddonMgr::Get().GetAddons(ADDON_PVRDLL, map, false); /** get the auto-configurable add-ons */ for (VECADDONS::iterator it = map.begin(); it != map.end(); ++it) { - if (CAddonMgr::GetInstance().IsAddonDisabled((*it)->ID())) + if (CAddonMgr::Get().IsAddonDisabled((*it)->ID())) { addon = std::dynamic_pointer_cast(*it); if (addon->CanAutoconfigure()) @@ -1330,7 +1286,7 @@ progressHandle->MarkFinished(); /** enable the add-on */ - CAddonMgr::GetInstance().EnableAddon((*it)->ID()); + CAddonMgr::Get().EnableAddon((*it)->ID()); CSingleLock lock(m_critSection); m_addons.push_back(*it); bReturn = true; @@ -1356,7 +1312,7 @@ if (!g_PVRManager.IsStarted() && !g_PVRManager.IsInitialising()) return; - CGUIDialogOK::ShowAndGetInput(CVariant{19240}, CVariant{19241}); + CGUIDialogOK::ShowAndGetInput(19240, 19241); std::vector params; params.push_back("addons://disabled/xbmc.pvrclient"); @@ -1368,7 +1324,7 @@ { VECADDONS addons; PVR_CLIENT addon; - bool bReturn(CAddonMgr::GetInstance().GetAddons(ADDON_PVRDLL, addons, true)); + bool bReturn(CAddonMgr::Get().GetAddons(ADDON_PVRDLL, addons, true)); size_t usableClients; bool bDisable(false); @@ -1397,21 +1353,21 @@ if (bDisable) { CLog::Log(LOGDEBUG, "%s - disabling add-on '%s'", __FUNCTION__, (*it)->Name().c_str()); - CAddonMgr::GetInstance().DisableAddon((*it)->ID()); + CAddonMgr::Get().DisableAddon((*it)->ID()); usableClients--; } } if ((!bReturn || usableClients == 0) && !m_bNoAddonWarningDisplayed && - !CAddonMgr::GetInstance().HasAddons(ADDON_PVRDLL, false) && + !CAddonMgr::Get().HasAddons(ADDON_PVRDLL, false) && (g_PVRManager.IsStarted() || g_PVRManager.IsInitialising())) { // No PVR add-ons could be found // You need a tuner, backend software, and an add-on for the backend to be able to use PVR. // Please visit http://kodi.wiki/view/PVR to learn more. m_bNoAddonWarningDisplayed = true; - CGUIDialogOK::ShowAndGetInput(CVariant{19271}, CVariant{19272}); - CSettings::GetInstance().SetBool(CSettings::SETTING_PVRMANAGER_ENABLED, false); + CGUIDialogOK::ShowAndGetInput(19271, 19272); + CSettings::Get().SetBool("pvrmanager.enabled", false); CGUIMessage msg(GUI_MSG_UPDATE, WINDOW_SETTINGS_MYPVR, 0); g_windowManager.SendThreadMessage(msg, WINDOW_SETTINGS_MYPVR); } @@ -1439,20 +1395,6 @@ return false; } -bool CPVRClients::SupportsTimers() const -{ - PVR_CLIENTMAP clients; - GetConnectedClients(clients); - - for (const auto &entry : clients) - { - if (entry.second->SupportsTimers()) - return true; - } - - return false; -} - bool CPVRClients::SupportsChannelGroups(int iClientId) const { PVR_CLIENT client; @@ -1501,6 +1443,12 @@ return GetConnectedClient(iClientId, client) && client->SupportsRecordingsUndelete(); } +bool CPVRClients::SupportsRecordingFolders(int iClientId) const +{ + PVR_CLIENT client; + return GetConnectedClient(iClientId, client) && client->SupportsRecordingFolders(); +} + bool CPVRClients::SupportsRecordingPlayCount(int iClientId) const { PVR_CLIENT client; @@ -1721,14 +1669,6 @@ return time; } -bool CPVRClients::IsTimeshifting(void) const -{ - PVR_CLIENT client; - if (GetPlayingClient(client)) - return client->IsTimeshifting(); - return false; -} - time_t CPVRClients::GetBufferTimeStart() const { PVR_CLIENT client; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/addons/PVRClients.h kodi-15.2~git20151019.1039-final/xbmc/pvr/addons/PVRClients.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/addons/PVRClients.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/addons/PVRClients.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,18 +19,16 @@ * */ -#include "addons/AddonDatabase.h" #include "threads/CriticalSection.h" #include "threads/Thread.h" #include "utils/Observer.h" - +#include "PVRClient.h" #include "pvr/channels/PVRChannel.h" #include "pvr/recordings/PVRRecording.h" +#include "addons/AddonDatabase.h" -#include "PVRClient.h" - -#include #include +#include namespace EPG { @@ -323,12 +321,6 @@ //@{ /*! - * @brief Check whether there is at least one connected client supporting timers. - * @return True if at least one connected client supports timers, false otherwise. - */ - bool SupportsTimers() const; - - /*! * @brief Check whether a client supports timers. * @param iClientId The id of the client to check. * @return True if the supports timers, false otherwise. @@ -376,21 +368,6 @@ */ PVR_ERROR RenameTimer(const CPVRTimerInfoTag &timer, const std::string &strNewName); - /*! - * @brief Get all supported timer types. - * @param results The container to store the result in. - * @return PVR_ERROR_NO_ERROR if the list has been fetched successfully. - */ - PVR_ERROR GetTimerTypes(CPVRTimerTypes& results) const; - - /*! - * @brief Get all timer types supported by a certain client. - * @param iClientId The id of the client. - * @param results The container to store the result in. - * @return PVR_ERROR_NO_ERROR if the list has been fetched successfully. - */ - PVR_ERROR GetTimerTypes(CPVRTimerTypes& results, int iClientId) const; - //@} /*! @name Recording methods */ @@ -638,6 +615,7 @@ bool SupportsChannelSettings(int iClientId) const; bool SupportsLastPlayedPosition(int iClientId) const; bool SupportsRadio(int iClientId) const; + bool SupportsRecordingFolders(int iClientId) const; bool SupportsRecordingPlayCount(int iClientId) const; bool SupportsRecordingEdl(int iClientId) const; bool SupportsTimers(int iClientId) const; @@ -649,7 +627,6 @@ std::string GetBackendHostnameByClientId(int iClientId) const; - bool IsTimeshifting() const; time_t GetPlayingTime() const; time_t GetBufferTimeStart() const; time_t GetBufferTimeEnd() const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/Makefile kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/Makefile 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -2,8 +2,7 @@ PVRChannelGroup.cpp \ PVRChannelGroupInternal.cpp \ PVRChannelGroups.cpp \ - PVRChannelGroupsContainer.cpp \ - PVRRadioRDSInfoTag.cpp + PVRChannelGroupsContainer.cpp LIB=pvrchannels.a diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannel.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannel.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannel.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannel.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,21 +19,18 @@ */ #include "FileItem.h" -#include "epg/EpgContainer.h" -#include "filesystem/File.h" #include "guilib/LocalizeStrings.h" -#include "threads/SingleLock.h" #include "utils/log.h" +#include "filesystem/File.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" +#include "threads/SingleLock.h" +#include "pvr/channels/PVRChannelGroupInternal.h" +#include "epg/EpgContainer.h" +#include "pvr/timers/PVRTimers.h" #include "pvr/PVRDatabase.h" #include "pvr/PVRManager.h" #include "pvr/addons/PVRClients.h" -#include "pvr/timers/PVRTimers.h" - -#include "PVRChannel.h" -#include "PVRChannelGroupInternal.h" #include @@ -148,7 +145,7 @@ return bReturn; /* delete the EPG table */ - CEpgPtr epg = GetEPG(); + CEpg *epg = GetEPG(); if (epg) { CPVRChannelPtr empty; @@ -162,7 +159,7 @@ return bReturn; } -CEpgPtr CPVRChannel::GetEPG(void) const +CEpg *CPVRChannel::GetEPG(void) const { int iEpgId(-1); { @@ -543,7 +540,7 @@ int CPVRChannel::GetEPG(CFileItemList &results) const { - CEpgPtr epg = GetEPG(); + CEpg *epg = GetEPG(); if (!epg) { CLog::Log(LOGDEBUG, "PVR - %s - cannot get EPG for channel '%s'", @@ -556,7 +553,7 @@ bool CPVRChannel::ClearEPG() const { - CEpgPtr epg = GetEPG(); + CEpg *epg = GetEPG(); if (epg) epg->Clear(); @@ -565,7 +562,7 @@ CEpgInfoTagPtr CPVRChannel::GetEPGNow() const { - CEpgPtr epg = GetEPG(); + CEpg *epg = GetEPG(); if (epg) return epg->GetTagNow(); @@ -575,7 +572,7 @@ CEpgInfoTagPtr CPVRChannel::GetEPGNext() const { - CEpgPtr epg = GetEPG(); + CEpg *epg = GetEPG(); if (epg) return epg->GetTagNext(); @@ -731,12 +728,6 @@ return m_bChanged; } -void CPVRChannel::Persisted() -{ - CSingleLock lock(m_critSection); - m_bChanged = false; -} - int CPVRChannel::UniqueID(void) const { return m_iUniqueId; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroup.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroup.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroup.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroup.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,24 +23,22 @@ * - use Observable here, so we can use event driven operations later */ -#include "Util.h" -#include "dialogs/GUIDialogExtendedProgressBar.h" -#include "epg/EpgContainer.h" -#include "guilib/GUIWindowManager.h" -#include "music/tags/MusicInfoTag.h" #include "settings/AdvancedSettings.h" #include "settings/lib/Setting.h" #include "settings/Settings.h" -#include "threads/SingleLock.h" +#include "guilib/GUIWindowManager.h" +#include "dialogs/GUIDialogExtendedProgressBar.h" +#include "music/tags/MusicInfoTag.h" #include "utils/log.h" +#include "Util.h" #include "utils/StringUtils.h" +#include "threads/SingleLock.h" +#include "PVRChannelGroupsContainer.h" #include "pvr/PVRDatabase.h" #include "pvr/PVRManager.h" #include "pvr/addons/PVRClients.h" - -#include "PVRChannelGroup.h" -#include "PVRChannelGroupsContainer.h" +#include "epg/EpgContainer.h" using namespace PVR; using namespace EPG; @@ -120,7 +118,7 @@ CPVRChannelGroup::~CPVRChannelGroup(void) { - CSettings::GetInstance().UnregisterCallback(this); + CSettings::Get().UnregisterCallback(this); Unload(); } @@ -147,9 +145,9 @@ void CPVRChannelGroup::OnInit(void) { - CSettings::GetInstance().RegisterCallback(this, { - CSettings::SETTING_PVRMANAGER_BACKENDCHANNELORDER, - CSettings::SETTING_PVRMANAGER_USEBACKENDCHANNELNUMBERS + CSettings::Get().RegisterCallback(this, { + "pvrmanager.backendchannelorder", + "pvrmanager.usebackendchannelnumbers" }); } @@ -158,8 +156,8 @@ /* make sure this container is empty before loading */ Unload(); - m_bUsingBackendChannelOrder = CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_BACKENDCHANNELORDER); - m_bUsingBackendChannelNumbers = CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_USEBACKENDCHANNELNUMBERS); + m_bUsingBackendChannelOrder = CSettings::Get().GetBool("pvrmanager.backendchannelorder"); + m_bUsingBackendChannelNumbers = CSettings::Get().GetBool("pvrmanager.usebackendchannelnumbers"); int iChannelCount = m_iGroupId > 0 ? LoadFromDb() : 0; CLog::Log(LOGDEBUG, "PVRChannelGroup - %s - %d channels loaded from the database for group '%s'", @@ -194,7 +192,7 @@ bool CPVRChannelGroup::Update(void) { if (GroupType() == PVR_GROUP_TYPE_USER_DEFINED || - !CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_SYNCCHANNELGROUPS)) + !CSettings::Get().GetBool("pvrmanager.syncchannelgroups")) return true; CPVRChannelGroup PVRChannels_tmp(m_bRadio, m_iGroupId, m_strGroupName); @@ -274,7 +272,7 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */) { - std::string iconPath = CSettings::GetInstance().GetString(CSettings::SETTING_PVRMENU_ICONPATH); + std::string iconPath = CSettings::Get().GetString("pvrmenu.iconpath"); if (iconPath.empty()) return; @@ -489,11 +487,11 @@ CFileItemPtr retval; CSingleLock lock(m_critSection); - for (PVR_CHANNEL_GROUP_SORTED_MEMBERS::const_iterator it = m_sortedMembers.begin(); !retval && it != m_sortedMembers.end(); ++it) + for (PVR_CHANNEL_GROUP_MEMBERS::const_iterator it = m_members.begin(); !retval && it != m_members.end(); ++it) { - if ((*it).iChannelNumber == iChannelNumber && - (iSubChannelNumber == 0 || iSubChannelNumber == (*it).iSubChannelNumber)) - retval = CFileItemPtr(new CFileItem((*it).channel)); + if (it->second.iChannelNumber == iChannelNumber && + (iSubChannelNumber == 0 || iSubChannelNumber == it->second.iSubChannelNumber)) + retval = CFileItemPtr(new CFileItem(it->second.channel)); } if (!retval) @@ -501,27 +499,27 @@ return retval; } -CFileItemPtr CPVRChannelGroup::GetByChannelUp(const CPVRChannelPtr &channel) const +CFileItemPtr CPVRChannelGroup::GetByChannelUp(const CFileItem &channel) const { CFileItemPtr retval; - if (channel) + if (channel.HasPVRChannelInfoTag()) { CSingleLock lock(m_critSection); for (PVR_CHANNEL_GROUP_SORTED_MEMBERS::const_iterator it = m_sortedMembers.begin(); !retval && it != m_sortedMembers.end(); ++it) { - if ((*it).channel == channel) + if ((*it).channel == channel.GetPVRChannelInfoTag()) { do { if ((++it) == m_sortedMembers.end()) it = m_sortedMembers.begin(); if ((*it).channel && !(*it).channel->IsHidden()) - retval = std::make_shared((*it).channel); - } while (!retval && (*it).channel != channel); + retval = CFileItemPtr(new CFileItem((*it).channel)); + } while (!retval && (*it).channel != channel.GetPVRChannelInfoTag()); if (!retval) - retval = std::make_shared(); + retval = CFileItemPtr(new CFileItem); } } } @@ -529,27 +527,27 @@ return retval; } -CFileItemPtr CPVRChannelGroup::GetByChannelDown(const CPVRChannelPtr &channel) const +CFileItemPtr CPVRChannelGroup::GetByChannelDown(const CFileItem &channel) const { CFileItemPtr retval; - if (channel) + if (channel.HasPVRChannelInfoTag()) { CSingleLock lock(m_critSection); for (PVR_CHANNEL_GROUP_SORTED_MEMBERS::const_reverse_iterator it = m_sortedMembers.rbegin(); !retval && it != m_sortedMembers.rend(); ++it) { - if ((*it).channel == channel) + if ((*it).channel == channel.GetPVRChannelInfoTag()) { do { if ((++it) == m_sortedMembers.rend()) it = m_sortedMembers.rbegin(); if ((*it).channel && !(*it).channel->IsHidden()) - retval = std::make_shared((*it).channel); - } while (!retval && (*it).channel != channel); + retval = CFileItemPtr(new CFileItem((*it).channel)); + } while (!retval && (*it).channel != channel.GetPVRChannelInfoTag()); if (!retval) - retval = std::make_shared(); + retval = CFileItemPtr(new CFileItem); } } } @@ -890,14 +888,10 @@ bool bReturn(true); CSingleLock lock(m_critSection); - /* only persist if the group has changes and is fully loaded or never has been saved before */ - if (!HasChanges() || (!m_bLoaded && m_iGroupId != -1)) + /* don't persist until the group is fully loaded and has changes */ + if (!HasChanges() || !m_bLoaded) return bReturn; - // Mark newly created groups as loaded so future updates will also be persisted... - if (m_iGroupId == -1) - m_bLoaded = true; - if (CPVRDatabase *database = GetPVRDatabase()) { CLog::Log(LOGDEBUG, "CPVRChannelGroup - %s - persisting channel group '%s' with %d channels", @@ -919,7 +913,7 @@ { bool bReturn(false); unsigned int iChannelNumber(0); - bool bUseBackendChannelNumbers(CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_USEBACKENDCHANNELNUMBERS) && g_PVRClients->EnabledClientAmount() == 1); + bool bUseBackendChannelNumbers(CSettings::Get().GetBool("pvrmanager.usebackendchannelnumbers") && g_PVRClients->EnabledClientAmount() == 1); if (PreventSortAndRenumber()) return true; @@ -1019,11 +1013,11 @@ } const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_PVRMANAGER_BACKENDCHANNELORDER || settingId == CSettings::SETTING_PVRMANAGER_USEBACKENDCHANNELNUMBERS) + if (settingId == "pvrmanager.backendchannelorder" || settingId == "pvrmanager.usebackendchannelnumbers") { CSingleLock lock(m_critSection); - bool bUsingBackendChannelOrder = CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_BACKENDCHANNELORDER); - bool bUsingBackendChannelNumbers = CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_USEBACKENDCHANNELNUMBERS); + bool bUsingBackendChannelOrder = CSettings::Get().GetBool("pvrmanager.backendchannelorder"); + bool bUsingBackendChannelNumbers = CSettings::Get().GetBool("pvrmanager.usebackendchannelnumbers"); bool bChannelNumbersChanged = m_bUsingBackendChannelNumbers != bUsingBackendChannelNumbers; bool bChannelOrderChanged = m_bUsingBackendChannelOrder != bUsingBackendChannelOrder; @@ -1072,6 +1066,7 @@ int CPVRChannelGroup::GetEPGNowOrNext(CFileItemList &results, bool bGetNext) const { int iInitialSize = results.Size(); + CEpg* epg; CEpgInfoTagPtr epgNext; CPVRChannelPtr channel; CSingleLock lock(m_critSection); @@ -1079,7 +1074,7 @@ for (PVR_CHANNEL_GROUP_SORTED_MEMBERS::const_iterator it = m_sortedMembers.begin(); it != m_sortedMembers.end(); ++it) { channel = (*it).channel; - CEpgPtr epg = channel->GetEPG(); + epg = channel->GetEPG(); if (epg && !channel->IsHidden()) { epgNext = bGetNext ? epg->GetTagNext() : epg->GetTagNow(); @@ -1097,35 +1092,21 @@ return results.Size() - iInitialSize; } -int CPVRChannelGroup::GetEPGAll(CFileItemList &results, bool bIncludeChannelsWithoutEPG /* = false */) const +int CPVRChannelGroup::GetEPGAll(CFileItemList &results) const { int iInitialSize = results.Size(); - CEpgInfoTagPtr epgTag; + CEpg* epg; CPVRChannelPtr channel; CSingleLock lock(m_critSection); for (PVR_CHANNEL_GROUP_SORTED_MEMBERS::const_iterator it = m_sortedMembers.begin(); it != m_sortedMembers.end(); ++it) { channel = (*it).channel; - if (!channel->IsHidden()) + if (!channel->IsHidden() && (epg = channel->GetEPG()) != NULL) { - int iAdded = 0; - - CEpgPtr epg = channel->GetEPG(); - if (epg) - { - // XXX channel pointers aren't set in some occasions. this works around the issue, but is not very nice - epg->SetChannel(channel); - iAdded = epg->Get(results); - } - - if (bIncludeChannelsWithoutEPG && iAdded == 0) - { - // Add dummy EPG tag associated with this channel - epgTag = CEpgInfoTag::CreateDefaultTag(); - epgTag->SetPVRChannel(channel); - results.Add(CFileItemPtr(new CFileItem(epgTag))); - } + // XXX channel pointers aren't set in some occasions. this works around the issue, but is not very nice + epg->SetChannel(channel); + epg->Get(results); } } @@ -1135,14 +1116,14 @@ CDateTime CPVRChannelGroup::GetEPGDate(EpgDateType epgDateType) const { CDateTime date; - CEpgPtr epg; + CEpg* epg; CPVRChannelPtr channel; CSingleLock lock(m_critSection); for (PVR_CHANNEL_GROUP_MEMBERS::const_iterator it = m_members.begin(); it != m_members.end(); ++it) { channel = it->second.channel; - if (!channel->IsHidden() && (epg = channel->GetEPG())) + if (!channel->IsHidden() && (epg = channel->GetEPG()) != NULL) { CDateTime epgDate; switch (epgDateType) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroup.h kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroup.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroup.h 2016-04-25 03:00:07.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroup.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -19,14 +20,13 @@ * */ -#include -#include - #include "FileItem.h" #include "PVRChannel.h" #include "settings/lib/ISettingCallback.h" #include "utils/JobManager.h" +#include + namespace EPG { struct EpgSearchFilter; @@ -271,7 +271,7 @@ //@} - virtual void OnSettingChanged(const CSetting *setting) override; + virtual void OnSettingChanged(const CSetting *setting); /*! * @brief Get a channel given it's EPG ID. @@ -314,14 +314,14 @@ * @param channel The current channel. * @return The channel or NULL if it wasn't found. */ - CFileItemPtr GetByChannelUp(const CPVRChannelPtr &channel) const; + CFileItemPtr GetByChannelUp(const CFileItem &channel) const; /*! * @brief Get the previous channel in this group. * @param channel The current channel. * @return The channel or NULL if it wasn't found. */ - CFileItemPtr GetByChannelDown(const CPVRChannelPtr &channel) const; + CFileItemPtr GetByChannelDown(const CFileItem &channel) const; /*! * Get the current members of this group @@ -379,7 +379,7 @@ */ void ResetChannelNumberCache(void); - void OnJobComplete(unsigned int jobID, bool success, CJob* job) override {} + void OnJobComplete(unsigned int jobID, bool success, CJob* job) {} /*! * @brief Get all EPG tables and apply a filter. @@ -392,10 +392,9 @@ /*! * @brief Get all EPG tables. * @param results The fileitem list to store the results in. - * @param bIncludeChannelsWithoutEPG, for channels without EPG data, put an empty EPG tag associated with the channel into results * @return The amount of entries that were added. */ - int GetEPGAll(CFileItemList &results, bool bIncludeChannelsWithoutEPG = false) const; + int GetEPGAll(CFileItemList &results) const; /*! * @brief Get all entries that are active now. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroupInternal.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroupInternal.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroupInternal.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroupInternal.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -20,19 +20,17 @@ #include "PVRChannelGroupInternal.h" -#include -#include - #include "dialogs/GUIDialogOK.h" -#include "epg/EpgContainer.h" -#include "pvr/addons/PVRClients.h" +#include "settings/AdvancedSettings.h" +#include "utils/log.h" + #include "pvr/PVRDatabase.h" #include "pvr/PVRManager.h" +#include "epg/EpgContainer.h" #include "pvr/timers/PVRTimers.h" -#include "PVRChannelGroupsContainer.h" -#include "settings/AdvancedSettings.h" -#include "utils/log.h" -#include "utils/Variant.h" +#include "pvr/addons/PVRClients.h" + +#include using namespace PVR; using namespace EPG; @@ -171,7 +169,7 @@ CPVRChannelPtr currentChannel(g_PVRManager.GetCurrentChannel()); if (currentChannel && currentChannel == channel) { - CGUIDialogOK::ShowAndGetInput(CVariant{19098}, CVariant{19102}); + CGUIDialogOK::ShowAndGetInput(19098, 19102); return false; } @@ -317,7 +315,7 @@ CSingleLock lock(channel->m_critSection); if (!channel->m_bEPGCreated || bForce) { - CEpgPtr epg = g_EpgContainer.CreateChannelEpg(channel); + CEpg *epg = g_EpgContainer.CreateChannelEpg(channel); if (epg) { channel->m_bEPGCreated = true; @@ -342,7 +340,7 @@ if (HasChangedChannels()) { - g_EpgContainer.MarkTablesForPersist(); + g_EpgContainer.PersistTables(); return Persist(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroupInternal.h kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroupInternal.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroupInternal.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroupInternal.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -19,9 +20,8 @@ * */ -#include "utils/Observer.h" - #include "PVRChannelGroup.h" +#include "utils/Observer.h" namespace PVR { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,16 +18,13 @@ * */ +#include "PVRChannelGroupsContainer.h" #include "URL.h" #include "dialogs/GUIDialogOK.h" #include "guilib/LocalizeStrings.h" -#include "utils/log.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" - -#include "pvr/PVRManager.h" - -#include "PVRChannelGroupsContainer.h" +#include "utils/log.h" using namespace PVR; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroupsContainer.h kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroupsContainer.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroupsContainer.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroupsContainer.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -19,9 +20,8 @@ * */ -#include "threads/CriticalSection.h" - #include "PVRChannelGroups.h" +#include "threads/CriticalSection.h" namespace PVR { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroups.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroups.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroups.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroups.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,19 +18,19 @@ * */ +#include "PVRChannelGroups.h" + #include "FileItem.h" -#include "URL.h" #include "settings/Settings.h" #include "utils/log.h" #include "utils/StringUtils.h" +#include "URL.h" +#include "PVRChannelGroupInternal.h" #include "pvr/PVRDatabase.h" #include "pvr/PVRManager.h" #include "pvr/addons/PVRClients.h" -#include "PVRChannelGroups.h" -#include "PVRChannelGroupInternal.h" - #include using namespace PVR; @@ -53,7 +53,7 @@ bool CPVRChannelGroups::GetGroupsFromClients(void) { - if (! CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_SYNCCHANNELGROUPS)) + if (! CSettings::Get().GetBool("pvrmanager.syncchannelgroups")) return true; return g_PVRClients->GetChannelGroups(this) == PVR_ERROR_NO_ERROR; @@ -173,17 +173,6 @@ return empty; } -std::vector CPVRChannelGroups::GetGroupsByChannel(const CPVRChannelPtr channel, bool bExcludeHidden /* = false */) const -{ - std::vector groups; - for (CPVRChannelGroupPtr group : m_groups) - { - if ((!bExcludeHidden || !group->IsHidden()) && group->IsGroupMember(channel)) - groups.push_back(group); - } - return groups; -} - CPVRChannelGroupPtr CPVRChannelGroups::GetByName(const std::string &strName) const { CSingleLock lock(m_critSection); @@ -210,7 +199,7 @@ bool CPVRChannelGroups::Update(bool bChannelsOnly /* = false */) { - bool bUpdateAllGroups = !bChannelsOnly && CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_SYNCCHANNELGROUPS); + bool bUpdateAllGroups = !bChannelsOnly && CSettings::Get().GetBool("pvrmanager.syncchannelgroups"); bool bReturn(true); // sync groups @@ -243,7 +232,7 @@ // user defined group wasn't found if (existingGroup.GroupType() == PVR_GROUP_TYPE_DEFAULT && !group) { - CLog::Log(LOGDEBUG, "CPVRChannelGroups - %s - user defined group %s with id '%u' does not exist on the client anymore; deleting it", __FUNCTION__, existingGroup.GroupName().c_str(), existingGroup.GroupID()); + CLog::Log(LOGDEBUG, "PVR - %s - user defined group %s with id '%u' does not exist on the client anymore; deleting it", __FUNCTION__, existingGroup.GroupName().c_str(), existingGroup.GroupID()); DeleteGroup(*m_groups.at(iGroupPtr)); } } @@ -269,7 +258,7 @@ bool CPVRChannelGroups::LoadUserDefinedChannelGroups(void) { - bool bSyncWithBackends = CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_SYNCCHANNELGROUPS); + bool bSyncWithBackends = CSettings::Get().GetBool("pvrmanager.syncchannelgroups"); CSingleLock lock(m_critSection); @@ -278,10 +267,10 @@ if (bSyncWithBackends) { GetGroupsFromClients(); - CLog::Log(LOGDEBUG, "CPVRChannelGroups - %s - %" PRIuS" new user defined %s channel groups fetched from clients", __FUNCTION__, (m_groups.size() - iSize), m_bRadio ? "radio" : "TV"); + CLog::Log(LOGDEBUG, "PVR - %s - %" PRIuS" new user defined %s channel groups fetched from clients", __FUNCTION__, (m_groups.size() - iSize), m_bRadio ? "radio" : "TV"); } else - CLog::Log(LOGDEBUG, "CPVRChannelGroups - %s - 'synchannelgroups' is disabled; skipping groups from clients", __FUNCTION__); + CLog::Log(LOGDEBUG, "PVR - %s - 'synchannelgroups' is disabled; skipping groups from clients", __FUNCTION__); std::vector emptyGroups; @@ -293,7 +282,7 @@ { if (!(*it)->Load()) { - CLog::Log(LOGDEBUG, "CPVRChannelGroups - %s - failed to load channel group '%s'", __FUNCTION__, (*it)->GroupName().c_str()); + CLog::Log(LOGDEBUG, "PVR - %s - failed to load channel group '%s'", __FUNCTION__, (*it)->GroupName().c_str()); return false; } @@ -305,7 +294,7 @@ for (std::vector::iterator it = emptyGroups.begin(); it != emptyGroups.end(); ++it) { - CLog::Log(LOGDEBUG, "CPVRChannelGroups - %s - deleting empty group '%s'", __FUNCTION__, (*it)->GroupName().c_str()); + CLog::Log(LOGDEBUG, "PVR - %s - deleting empty group '%s'", __FUNCTION__, (*it)->GroupName().c_str()); DeleteGroup(*(*it)); } @@ -324,7 +313,7 @@ // remove previous contents Clear(); - CLog::Log(LOGDEBUG, "CPVRChannelGroups - %s - loading all %s channel groups", __FUNCTION__, m_bRadio ? "radio" : "TV"); + CLog::Log(LOGDEBUG, "PVR - %s - loading all %s channel groups", __FUNCTION__, m_bRadio ? "radio" : "TV"); // create the internal channel group CPVRChannelGroupPtr internalGroup = CPVRChannelGroupPtr(new CPVRChannelGroupInternal(m_bRadio)); @@ -332,19 +321,19 @@ // load groups from the database database->Get(*this); - CLog::Log(LOGDEBUG, "CPVRChannelGroups - %s - %" PRIuS" %s groups fetched from the database", __FUNCTION__, m_groups.size(), m_bRadio ? "radio" : "TV"); + CLog::Log(LOGDEBUG, "PVR - %s - %" PRIuS" %s groups fetched from the database", __FUNCTION__, m_groups.size(), m_bRadio ? "radio" : "TV"); // load channels of internal group if (!internalGroup->Load()) { - CLog::Log(LOGERROR, "CPVRChannelGroups - %s - failed to load channels", __FUNCTION__); + CLog::Log(LOGERROR, "PVR - %s - failed to load channels", __FUNCTION__); return false; } // load the other groups from the database if (!LoadUserDefinedChannelGroups()) { - CLog::Log(LOGERROR, "CPVRChannelGroups - %s - failed to load channel groups", __FUNCTION__); + CLog::Log(LOGERROR, "PVR - %s - failed to load channel groups", __FUNCTION__); return false; } @@ -352,7 +341,7 @@ CPVRChannelGroupPtr lastPlayedGroup = GetLastPlayedGroup(); SetSelectedGroup(lastPlayedGroup ? lastPlayedGroup : internalGroup); - CLog::Log(LOGDEBUG, "CPVRChannelGroups - %s - %" PRIuS" %s channel groups loaded", __FUNCTION__, m_groups.size(), m_bRadio ? "radio" : "TV"); + CLog::Log(LOGDEBUG, "PVR - %s - %" PRIuS" %s channel groups loaded", __FUNCTION__, m_groups.size(), m_bRadio ? "radio" : "TV"); // need at least 1 group return m_groups.size() > 0; @@ -361,7 +350,7 @@ bool CPVRChannelGroups::PersistAll(void) { bool bReturn(true); - CLog::Log(LOGDEBUG, "CPVRChannelGroups - %s - persisting all changes in channel groups", __FUNCTION__); + CLog::Log(LOGDEBUG, "PVR - %s - persisting all changes in channel groups", __FUNCTION__); CSingleLock lock(m_critSection); for (std::vector::iterator it = m_groups.begin(); it != m_groups.end(); ++it) @@ -405,15 +394,10 @@ return group; } -std::vector CPVRChannelGroups::GetMembers(bool bExcludeHidden /* = false */) const +std::vector CPVRChannelGroups::GetMembers() const { CSingleLock lock(m_critSection); - std::vector groups; - for (CPVRChannelGroupPtr group : m_groups) - { - if (!bExcludeHidden || !group->IsHidden()) - groups.push_back(group); - } + std::vector groups(m_groups.begin(), m_groups.end()); return groups; } @@ -549,7 +533,7 @@ // don't delete internal groups if (group.IsInternalGroup()) { - CLog::Log(LOGERROR, "CPVRChannelGroups - %s - cannot delete internal group '%s'", __FUNCTION__, group.GroupName().c_str()); + CLog::Log(LOGERROR, "PVR - %s - cannot delete internal group '%s'", __FUNCTION__, group.GroupName().c_str()); return false; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroups.h kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroups.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannelGroups.h 2016-04-25 03:00:07.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannelGroups.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -19,12 +20,11 @@ * */ -#include "FileItem.h" -#include "threads/CriticalSection.h" +#include +#include "FileItem.h" #include "PVRChannelGroup.h" - -#include +#include "threads/CriticalSection.h" namespace PVR { @@ -86,14 +86,6 @@ CPVRChannelGroupPtr GetById(int iGroupId) const; /*! - * @brief Get all groups the given channel is a member. - * @param channel The channel. - * @param bExcludeHidden Whenever to exclude hidden channel groups. - * @return A list of groups the channel is a member. - */ - std::vector GetGroupsByChannel(const CPVRChannelPtr channel, bool bExcludeHidden = false) const; - - /*! * @brief Get a group given it's name. * @param strName The name. * @return The group or NULL if it wan't found. @@ -126,10 +118,9 @@ /*! * @brief Get the list of groups. * @param groups The list to store the results in. - * @param bExcludeHidden Whenever to exclude hidden channel groups. * @return The amount of items that were added. */ - std::vector GetMembers(bool bExcludeHidden = false) const; + std::vector GetMembers() const; /*! * @brief Get the list of groups. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannel.h kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannel.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRChannel.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRChannel.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -19,23 +20,19 @@ * */ -#include -#include - -#include "addons/include/xbmc_pvr_types.h" #include "FileItem.h" +#include "addons/include/xbmc_pvr_types.h" +#include "utils/Observer.h" #include "threads/CriticalSection.h" #include "utils/ISerializable.h" -#include "utils/Observer.h" -#define PVR_INVALID_CHANNEL_UID -1 +#include -class CVariant; +#define PVR_INVALID_CHANNEL_UID -1 namespace EPG { class CEpg; - typedef std::shared_ptr CEpgPtr; class CEpgInfoTag; typedef std::shared_ptr CEpgInfoTagPtr; @@ -251,11 +248,6 @@ bool IsEmpty() const; bool IsChanged() const; - - /*! - * @brief reset changed flag after persist - */ - void Persisted(); //@} /*! @name Client related channel methods @@ -397,7 +389,7 @@ * @brief Get the EPG table for this channel. * @return The EPG for this channel. */ - EPG::CEpgPtr GetEPG(void) const; + EPG::CEpg *GetEPG(void) const; /*! * @brief Get the EPG table for this channel. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRRadioRDSInfoTag.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRRadioRDSInfoTag.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRRadioRDSInfoTag.cpp 2016-04-25 03:00:07.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRRadioRDSInfoTag.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,899 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "Application.h" -#include "GUIUserMessages.h" -#include "guilib/GUIMessage.h" -#include "guilib/GUIWindowManager.h" -#include "messaging/ApplicationMessenger.h" -#include "settings/AdvancedSettings.h" -#include "utils/Archive.h" -#include "utils/CharsetConverter.h" -#include "utils/StringUtils.h" -#include "utils/Variant.h" - -#include "PVRRadioRDSInfoTag.h" - -using namespace PVR; - -CPVRRadioRDSInfoTagPtr CPVRRadioRDSInfoTag::CreateDefaultTag() -{ - return CPVRRadioRDSInfoTagPtr(new CPVRRadioRDSInfoTag()); -} - -CPVRRadioRDSInfoTag::CPVRRadioRDSInfoTag(void) -{ - Clear(); -} - -CPVRRadioRDSInfoTag::~CPVRRadioRDSInfoTag() -{} - -void CPVRRadioRDSInfoTag::Serialize(CVariant& value) const -{ - value["strLanguage"] = m_strLanguage; - value["strCountry"] = m_strCountry; - value["strTitle"] = m_strTitle; - value["strBand"] = m_strBand; - value["strArtist"] = m_strArtist; - value["strComposer"] = m_strComposer; - value["strConductor"] = m_strConductor; - value["strAlbum"] = m_strAlbum; - value["iAlbumTracknumber"] = m_iAlbumTracknumber; - value["strProgStation"] = m_strProgStation; - value["strProgStyle"] = m_strProgStyle; - value["strProgHost"] = m_strProgHost; - value["strProgWebsite"] = m_strProgWebsite; - value["strProgNow"] = m_strProgNow; - value["strProgNext"] = m_strProgNext; - value["strPhoneHotline"] = m_strPhoneHotline; - value["strEMailHotline"] = m_strEMailHotline; - value["strPhoneStudio"] = m_strPhoneStudio; - value["strEMailStudio"] = m_strEMailStudio; - value["strSMSStudio"] = m_strSMSStudio; - value["strRadioStyle"] = m_strRadioStyle; -} - -void CPVRRadioRDSInfoTag::Archive(CArchive& ar) -{ - if (ar.IsStoring()) - { - ar << m_strLanguage; - ar << m_strCountry; - ar << m_strTitle; - ar << m_strBand; - ar << m_strArtist; - ar << m_strComposer; - ar << m_strConductor; - ar << m_strAlbum; - ar << m_iAlbumTracknumber; - ar << m_strProgStation; - ar << m_strProgStyle; - ar << m_strProgHost; - ar << m_strProgWebsite; - ar << m_strProgNow; - ar << m_strProgNext; - ar << m_strPhoneHotline; - ar << m_strEMailHotline; - ar << m_strPhoneStudio; - ar << m_strEMailStudio; - ar << m_strSMSStudio; - ar << m_strRadioStyle; - } - else - { - ar >> m_strLanguage; - ar >> m_strCountry; - ar >> m_strTitle; - ar >> m_strBand; - ar >> m_strArtist; - ar >> m_strComposer; - ar >> m_strConductor; - ar >> m_strAlbum; - ar >> m_iAlbumTracknumber; - ar >> m_strProgStation; - ar >> m_strProgStyle; - ar >> m_strProgHost; - ar >> m_strProgWebsite; - ar >> m_strProgNow; - ar >> m_strProgNext; - ar >> m_strPhoneHotline; - ar >> m_strEMailHotline; - ar >> m_strPhoneStudio; - ar >> m_strEMailStudio; - ar >> m_strSMSStudio; - ar >> m_strRadioStyle; - } -} - -bool CPVRRadioRDSInfoTag::operator==(const CPVRRadioRDSInfoTag &right) const -{ - return !(*this != right); -} - -bool CPVRRadioRDSInfoTag::operator !=(const CPVRRadioRDSInfoTag& tag) const -{ - if (this == &tag) return false; - if (m_strLanguage != tag.m_strLanguage) return true; - if (m_strCountry != tag.m_strCountry) return true; - if (m_strTitle != tag.m_strTitle) return true; - if (m_strBand != tag.m_strBand) return true; - if (m_strArtist != tag.m_strArtist) return true; - if (m_strComposer != tag.m_strComposer) return true; - if (m_strConductor != tag.m_strConductor) return true; - if (m_strAlbum != tag.m_strAlbum) return true; - if (m_iAlbumTracknumber != tag.m_iAlbumTracknumber) return true; - if (m_strInfoNews != tag.m_strInfoNews) return true; - if (m_strInfoNewsLocal != tag.m_strInfoNewsLocal) return true; - if (m_strInfoSport != tag.m_strInfoSport) return true; - if (m_strInfoStock != tag.m_strInfoStock) return true; - if (m_strInfoWeather != tag.m_strInfoWeather) return true; - if (m_strInfoLottery != tag.m_strInfoLottery) return true; - if (m_strInfoOther != tag.m_strInfoOther) return true; - if (m_strProgStyle != tag.m_strProgStyle) return true; - if (m_strProgHost != tag.m_strProgHost) return true; - if (m_strProgStation != tag.m_strProgStation) return true; - if (m_strProgWebsite != tag.m_strProgWebsite) return true; - if (m_strProgNow != tag.m_strProgNow) return true; - if (m_strProgNext != tag.m_strProgNext) return true; - if (m_strPhoneHotline != tag.m_strPhoneHotline) return true; - if (m_strEMailHotline != tag.m_strEMailHotline) return true; - if (m_strPhoneStudio != tag.m_strPhoneStudio) return true; - if (m_strEMailStudio != tag.m_strEMailStudio) return true; - if (m_strSMSStudio != tag.m_strSMSStudio) return true; - if (m_strRadioStyle != tag.m_strRadioStyle) return true; - if (m_strInfoHoroscope != tag.m_strInfoHoroscope) return true; - if (m_strInfoCinema != tag.m_strInfoCinema) return true; - if (m_strComment != tag.m_strComment) return true; - if (m_strEditorialStaff != tag.m_strEditorialStaff) return true; - - if (m_bHaveRadiotext != tag.m_bHaveRadiotext) return true; - if (m_bHaveRadiotextPlus != tag.m_bHaveRadiotextPlus) return true; - - return false; -} - -void CPVRRadioRDSInfoTag::Clear() -{ - m_RDS_SpeechActive = false; - - m_strLanguage.erase(); - m_strCountry.erase(); - m_strTitle.erase(); - m_strBand.erase(); - m_strArtist.erase(); - m_strComposer.erase(); - m_strConductor.erase(); - m_strAlbum.erase(); - m_strComment.erase(); - m_iAlbumTracknumber = 0; - m_strInfoNews.clear(); - m_strInfoNewsLocal.clear(); - m_strInfoSport.clear(); - m_strInfoStock.clear(); - m_strInfoWeather.clear(); - m_strInfoLottery.clear(); - m_strInfoOther.clear(); - m_strInfoHoroscope.clear(); - m_strInfoCinema.clear(); - m_strProgStyle.erase(); - m_strProgHost.erase(); - m_strProgStation.erase(); - m_strProgWebsite.erase(); - m_strPhoneHotline.erase(); - m_strEMailHotline.erase(); - m_strPhoneStudio.erase(); - m_strEMailStudio.erase(); - m_strSMSStudio.erase(); - m_strRadioStyle = "unknown"; - m_strEditorialStaff.clear(); - - m_bHaveRadiotext = false; - m_bHaveRadiotextPlus = false; -} - -void CPVRRadioRDSInfoTag::ResetSongInformation() -{ - m_strTitle.erase(); - m_strBand.erase(); - m_strArtist.erase(); - m_strComposer.erase(); - m_strConductor.erase(); - m_strAlbum.erase(); - m_iAlbumTracknumber = 0; -} - -void CPVRRadioRDSInfoTag::SetSpeechActive(bool active) -{ - m_RDS_SpeechActive = active; -} - -bool CPVRRadioRDSInfoTag::IsSpeechActive() -{ - return m_RDS_SpeechActive; -} - -void CPVRRadioRDSInfoTag::SetLanguage(const std::string& strLanguage) -{ - m_strLanguage = Trim(strLanguage); -} - -const std::string& CPVRRadioRDSInfoTag::GetLanguage() const -{ - return m_strLanguage; -} - -void CPVRRadioRDSInfoTag::SetCountry(const std::string& strCountry) -{ - m_strCountry = Trim(strCountry); -} - -const std::string& CPVRRadioRDSInfoTag::GetCountry() const -{ - return m_strCountry; -} - -void CPVRRadioRDSInfoTag::SetTitle(const std::string& strTitle) -{ - m_strTitle = Trim(strTitle); -} - -void CPVRRadioRDSInfoTag::SetArtist(const std::string& strArtist) -{ - m_strArtist = Trim(strArtist); -} - -void CPVRRadioRDSInfoTag::SetBand(const std::string& strBand) -{ - m_strBand = Trim(strBand); - g_charsetConverter.unknownToUTF8(m_strBand); -} - -void CPVRRadioRDSInfoTag::SetComposer(const std::string& strComposer) -{ - m_strComposer = Trim(strComposer); - g_charsetConverter.unknownToUTF8(m_strComposer); -} - -void CPVRRadioRDSInfoTag::SetConductor(const std::string& strConductor) -{ - m_strConductor = Trim(strConductor); - g_charsetConverter.unknownToUTF8(m_strConductor); -} - -void CPVRRadioRDSInfoTag::SetAlbum(const std::string& strAlbum) -{ - m_strAlbum = Trim(strAlbum); - g_charsetConverter.unknownToUTF8(m_strAlbum); -} - -void CPVRRadioRDSInfoTag::SetAlbumTrackNumber(int track) -{ - m_iAlbumTracknumber = track; -} - -void CPVRRadioRDSInfoTag::SetComment(const std::string& strComment) -{ - m_strComment = Trim(strComment); - g_charsetConverter.unknownToUTF8(m_strComment); -} - -const std::string& CPVRRadioRDSInfoTag::GetTitle() const -{ - return m_strTitle; -} - -const std::string& CPVRRadioRDSInfoTag::GetArtist() const -{ - return m_strArtist; -} - -const std::string& CPVRRadioRDSInfoTag::GetBand() const -{ - return m_strBand; -} - -const std::string& CPVRRadioRDSInfoTag::GetComposer() const -{ - return m_strComposer; -} - -const std::string& CPVRRadioRDSInfoTag::GetConductor() const -{ - return m_strConductor; -} - -const std::string& CPVRRadioRDSInfoTag::GetAlbum() const -{ - return m_strAlbum; -} - -int CPVRRadioRDSInfoTag::GetAlbumTrackNumber() const -{ - return m_iAlbumTracknumber; -} - -const std::string& CPVRRadioRDSInfoTag::GetComment() const -{ - return m_strComment; -} - -void CPVRRadioRDSInfoTag::SetInfoNews(const std::string& strNews) -{ - std::string tmpStr = Trim(strNews); - g_charsetConverter.unknownToUTF8(tmpStr); - - for (unsigned i = 0; i < m_strInfoNews.size(); ++i) - { - if (m_strInfoNews[i].compare(tmpStr) == 0) - return; - } - - if (m_strInfoNews.size() >= 10) - m_strInfoNews.pop_front(); - - m_strInfoNews.push_back(tmpStr); - - // send a message to all windows to tell them to update the radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CPVRRadioRDSInfoTag::ClearInfoNews() -{ - m_strInfoNews.clear(); -} - -const std::deque& CPVRRadioRDSInfoTag::GetInfoNewsDeque() const -{ - return m_strInfoNews; -} - -const std::string CPVRRadioRDSInfoTag::GetInfoNews() const -{ - std::string retStr = ""; - for (unsigned i = 0; i < m_strInfoNews.size(); ++i) - { - std::string tmpStr = m_strInfoNews[i]; - tmpStr.insert(tmpStr.end(),'\n'); - retStr += tmpStr; - } - - return retStr; -} - -void CPVRRadioRDSInfoTag::SetInfoNewsLocal(const std::string& strNews) -{ - std::string tmpStr = Trim(strNews); - g_charsetConverter.unknownToUTF8(tmpStr); - - for (unsigned i = 0; i < m_strInfoNewsLocal.size(); ++i) - { - if (m_strInfoNewsLocal[i].compare(tmpStr) == 0) - return; - } - - if (m_strInfoNewsLocal.size() >= 10) - m_strInfoNewsLocal.pop_back(); - - m_strInfoNewsLocal.push_front(tmpStr); - - // send a message to all windows to tell them to update the radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CPVRRadioRDSInfoTag::ClearInfoNewsLocal() -{ - m_strInfoNewsLocal.clear(); -} - -const std::deque& CPVRRadioRDSInfoTag::GetInfoNewsLocalDeque() const -{ - return m_strInfoNewsLocal; -} - -const std::string CPVRRadioRDSInfoTag::GetInfoNewsLocal() const -{ - std::string retStr = ""; - for (unsigned i = 0; i < m_strInfoNewsLocal.size(); ++i) - { - std::string tmpStr = m_strInfoNewsLocal[i]; - tmpStr.insert(tmpStr.end(),'\n'); - retStr += tmpStr; - } - - return retStr; -} - -void CPVRRadioRDSInfoTag::SetInfoSport(const std::string& strSport) -{ - std::string tmpStr = Trim(strSport); - g_charsetConverter.unknownToUTF8(tmpStr); - - for (unsigned i = 0; i < m_strInfoSport.size(); ++i) - { - if (m_strInfoSport[i].compare(tmpStr) == 0) - return; - } - - if (m_strInfoSport.size() >= 10) - m_strInfoSport.pop_back(); - - m_strInfoSport.push_front(tmpStr); - - // send a message to all windows to tell them to update the radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CPVRRadioRDSInfoTag::ClearInfoSport() -{ - m_strInfoSport.clear(); -} - -const std::deque& CPVRRadioRDSInfoTag::GetInfoSportDeque() const -{ - return m_strInfoSport; -} - -const std::string CPVRRadioRDSInfoTag::GetInfoSport() const -{ - std::string retStr = ""; - for (unsigned i = 0; i < m_strInfoSport.size(); ++i) - { - std::string tmpStr = m_strInfoSport[i]; - tmpStr.insert(tmpStr.end(),'\n'); - retStr += tmpStr; - } - - return retStr; -} - -void CPVRRadioRDSInfoTag::SetInfoStock(const std::string& strStock) -{ - std::string tmpStr = Trim(strStock); - g_charsetConverter.unknownToUTF8(tmpStr); - - for (unsigned i = 0; i < m_strInfoStock.size(); ++i) - { - if (m_strInfoStock[i].compare(tmpStr) == 0) - return; - } - - if (m_strInfoStock.size() >= 10) - m_strInfoStock.pop_back(); - - m_strInfoStock.push_front(tmpStr); - - // send a message to all windows to tell them to update the radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CPVRRadioRDSInfoTag::ClearInfoStock() -{ - m_strInfoStock.clear(); -} - -const std::deque& CPVRRadioRDSInfoTag::GetInfoStockDeque() const -{ - return m_strInfoStock; -} - -const std::string CPVRRadioRDSInfoTag::GetInfoStock() const -{ - std::string retStr = ""; - for (unsigned i = 0; i < m_strInfoStock.size(); ++i) - { - std::string tmpStr = m_strInfoStock[i]; - tmpStr.insert(tmpStr.end(),'\n'); - retStr += tmpStr; - } - - return retStr; -} - -void CPVRRadioRDSInfoTag::SetInfoWeather(const std::string& strWeather) -{ - std::string tmpStr = Trim(strWeather); - g_charsetConverter.unknownToUTF8(tmpStr); - - for (unsigned i = 0; i < m_strInfoWeather.size(); ++i) - { - if (m_strInfoWeather[i].compare(tmpStr) == 0) - return; - } - - if (m_strInfoWeather.size() >= 10) - m_strInfoWeather.pop_back(); - - m_strInfoWeather.push_front(tmpStr); - // send a message to all windows to tell them to update the radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CPVRRadioRDSInfoTag::ClearInfoWeather() -{ - m_strInfoWeather.clear(); -} - -const std::deque& CPVRRadioRDSInfoTag::GetInfoWeatherDeque() const -{ - return m_strInfoWeather; -} - -const std::string CPVRRadioRDSInfoTag::GetInfoWeather() const -{ - std::string retStr = ""; - for (unsigned i = 0; i < m_strInfoWeather.size(); ++i) - { - std::string tmpStr = m_strInfoWeather[i]; - tmpStr.insert(tmpStr.end(),'\n'); - retStr += tmpStr; - } - - return retStr; -} - -void CPVRRadioRDSInfoTag::SetInfoLottery(const std::string& strLottery) -{ - std::string tmpStr = Trim(strLottery); - g_charsetConverter.unknownToUTF8(tmpStr); - - for (unsigned i = 0; i < m_strInfoLottery.size(); ++i) - { - if (m_strInfoLottery[i].compare(tmpStr) == 0) - return; - } - - if (m_strInfoLottery.size() >= 10) - m_strInfoLottery.pop_back(); - - m_strInfoLottery.push_front(tmpStr); - // send a message to all windows to tell them to update the radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CPVRRadioRDSInfoTag::ClearInfoLottery() -{ - m_strInfoLottery.clear(); -} - -const std::deque& CPVRRadioRDSInfoTag::GetInfoLotteryDeque() const -{ - return m_strInfoLottery; -} - -const std::string CPVRRadioRDSInfoTag::GetInfoLottery() const -{ - std::string retStr = ""; - for (unsigned i = 0; i < m_strInfoLottery.size(); ++i) - { - std::string tmpStr = m_strInfoLottery[i]; - tmpStr.insert(tmpStr.end(),'\n'); - retStr += tmpStr; - } - - return retStr; -} - -void CPVRRadioRDSInfoTag::SetEditorialStaff(const std::string& strEditorialStaff) -{ - std::string tmpStr = Trim(strEditorialStaff); - g_charsetConverter.unknownToUTF8(tmpStr); - - for (unsigned i = 0; i < m_strEditorialStaff.size(); ++i) - { - if (m_strEditorialStaff[i].compare(tmpStr) == 0) - return; - } - - if (m_strEditorialStaff.size() >= 10) - m_strEditorialStaff.pop_back(); - - m_strEditorialStaff.push_front(tmpStr); - // send a message to all windows to tell them to update the radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CPVRRadioRDSInfoTag::ClearEditorialStaff() -{ - m_strEditorialStaff.clear(); -} - -const std::deque& CPVRRadioRDSInfoTag::GetEditorialStaffDeque() const -{ - return m_strEditorialStaff; -} - -const std::string CPVRRadioRDSInfoTag::GetEditorialStaff() const -{ - std::string retStr = ""; - for (unsigned i = 0; i < m_strEditorialStaff.size(); ++i) - { - std::string tmpStr = m_strEditorialStaff[i]; - tmpStr.insert(tmpStr.end(),'\n'); - retStr += tmpStr; - } - - return retStr; -} - -void CPVRRadioRDSInfoTag::SetInfoHoroscope(const std::string& strHoroscope) -{ - std::string tmpStr = Trim(strHoroscope); - g_charsetConverter.unknownToUTF8(tmpStr); - - for (unsigned i = 0; i < m_strInfoHoroscope.size(); ++i) - { - if (m_strInfoHoroscope[i].compare(tmpStr) == 0) - return; - } - - if (m_strInfoHoroscope.size() >= 10) - m_strInfoHoroscope.pop_back(); - - m_strInfoHoroscope.push_front(tmpStr); - // send a message to all windows to tell them to update the radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CPVRRadioRDSInfoTag::ClearInfoHoroscope() -{ - m_strInfoHoroscope.clear(); -} - -const std::deque& CPVRRadioRDSInfoTag::GetInfoHoroscopeDeque() const -{ - return m_strInfoHoroscope; -} - -const std::string CPVRRadioRDSInfoTag::GetInfoHoroscope() const -{ - std::string retStr = ""; - for (unsigned i = 0; i < m_strInfoHoroscope.size(); ++i) - { - std::string tmpStr = m_strInfoHoroscope[i]; - tmpStr.insert(tmpStr.end(),'\n'); - retStr += tmpStr; - } - - return retStr; -} - -void CPVRRadioRDSInfoTag::SetInfoCinema(const std::string& strCinema) -{ - std::string tmpStr = Trim(strCinema); - g_charsetConverter.unknownToUTF8(tmpStr); - - for (unsigned i = 0; i < m_strInfoCinema.size(); ++i) - { - if (m_strInfoCinema[i].compare(tmpStr) == 0) - return; - } - - if (m_strInfoCinema.size() >= 10) - m_strInfoCinema.pop_back(); - - m_strInfoCinema.push_front(tmpStr); - // send a message to all windows to tell them to update the fileitem radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CPVRRadioRDSInfoTag::ClearInfoCinema() -{ - m_strInfoCinema.clear(); -} - -const std::deque& CPVRRadioRDSInfoTag::GetInfoCinemaDeque() const -{ - return m_strInfoCinema; -} - -const std::string CPVRRadioRDSInfoTag::GetInfoCinema() const -{ - std::string retStr = ""; - for (unsigned i = 0; i < m_strInfoCinema.size(); ++i) - { - std::string tmpStr = m_strInfoCinema[i]; - tmpStr.insert(tmpStr.end(),'\n'); - retStr += tmpStr; - } - - return retStr; -} - -void CPVRRadioRDSInfoTag::SetInfoOther(const std::string& strOther) -{ - std::string tmpStr = Trim(strOther); - g_charsetConverter.unknownToUTF8(tmpStr); - - for (unsigned i = 0; i < m_strInfoOther.size(); ++i) - { - if (m_strInfoOther[i].compare(tmpStr) == 0) - return; - } - - if (m_strInfoOther.size() >= 10) - m_strInfoOther.pop_back(); - - m_strInfoOther.push_front(tmpStr); - // send a message to all windows to tell them to update the fileitem radiotext - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_RADIOTEXT); - g_windowManager.SendThreadMessage(msg); -} - -void CPVRRadioRDSInfoTag::ClearInfoOther() -{ - m_strInfoOther.clear(); -} - -const std::deque& CPVRRadioRDSInfoTag::GetInfoOtherDeque() const -{ - return m_strInfoOther; -} - -const std::string CPVRRadioRDSInfoTag::GetInfoOther() const -{ - std::string retStr = ""; - for (unsigned i = 0; i < m_strInfoOther.size(); ++i) - { - std::string tmpStr = m_strInfoOther[i]; - tmpStr.insert(tmpStr.end(),'\n'); - retStr += tmpStr; - } - - return retStr; -} - -void CPVRRadioRDSInfoTag::SetProgStation(const std::string& strProgStation) -{ - m_strProgStation = Trim(strProgStation); - g_charsetConverter.unknownToUTF8(m_strProgStation); -} - -void CPVRRadioRDSInfoTag::SetProgHost(const std::string& strProgHost) -{ - m_strProgHost = Trim(strProgHost); - g_charsetConverter.unknownToUTF8(m_strProgHost); -} - -void CPVRRadioRDSInfoTag::SetProgStyle(const std::string& strProgStyle) -{ - m_strProgStyle = Trim(strProgStyle); - g_charsetConverter.unknownToUTF8(m_strProgStyle); -} - -void CPVRRadioRDSInfoTag::SetProgWebsite(const std::string& strWebsite) -{ - m_strProgWebsite = Trim(strWebsite); - g_charsetConverter.unknownToUTF8(m_strProgWebsite); -} - -void CPVRRadioRDSInfoTag::SetProgNow(const std::string& strNow) -{ - m_strProgNow = Trim(strNow); - g_charsetConverter.unknownToUTF8(m_strProgNow); -} - -void CPVRRadioRDSInfoTag::SetProgNext(const std::string& strNext) -{ - m_strProgNext = Trim(strNext); - g_charsetConverter.unknownToUTF8(m_strProgNext); -} - -void CPVRRadioRDSInfoTag::SetPhoneHotline(const std::string& strHotline) -{ - m_strPhoneHotline = Trim(strHotline); - g_charsetConverter.unknownToUTF8(m_strPhoneHotline); -} - -void CPVRRadioRDSInfoTag::SetEMailHotline(const std::string& strHotline) -{ - m_strEMailHotline = Trim(strHotline); - g_charsetConverter.unknownToUTF8(m_strEMailHotline); -} - -void CPVRRadioRDSInfoTag::SetPhoneStudio(const std::string& strPhone) -{ - m_strPhoneStudio = Trim(strPhone); - g_charsetConverter.unknownToUTF8(m_strPhoneStudio); -} - -void CPVRRadioRDSInfoTag::SetEMailStudio(const std::string& strEMail) -{ - m_strEMailStudio = Trim(strEMail); - g_charsetConverter.unknownToUTF8(m_strEMailStudio); -} - -void CPVRRadioRDSInfoTag::SetSMSStudio(const std::string& strSMS) -{ - m_strSMSStudio = Trim(strSMS); - g_charsetConverter.unknownToUTF8(m_strSMSStudio); -} - -const std::string& CPVRRadioRDSInfoTag::GetProgStyle() const -{ - return m_strProgStyle; -} - -const std::string& CPVRRadioRDSInfoTag::GetProgHost() const -{ - return m_strProgHost; -} - -const std::string& CPVRRadioRDSInfoTag::GetProgStation() const -{ - return m_strProgStation; -} - -const std::string& CPVRRadioRDSInfoTag::GetProgWebsite() const -{ - return m_strProgWebsite; -} - -const std::string& CPVRRadioRDSInfoTag::GetProgNow() const -{ - return m_strProgNow; -} - -const std::string& CPVRRadioRDSInfoTag::GetProgNext() const -{ - return m_strProgNext; -} - -const std::string& CPVRRadioRDSInfoTag::GetPhoneHotline() const -{ - return m_strPhoneHotline; -} - -const std::string& CPVRRadioRDSInfoTag::GetEMailHotline() const -{ - return m_strEMailHotline; -} - -const std::string& CPVRRadioRDSInfoTag::GetPhoneStudio() const -{ - return m_strPhoneStudio; -} - -const std::string& CPVRRadioRDSInfoTag::GetEMailStudio() const -{ - return m_strEMailStudio; -} - -const std::string& CPVRRadioRDSInfoTag::GetSMSStudio() const -{ - return m_strSMSStudio; -} - -std::string CPVRRadioRDSInfoTag::Trim(const std::string &value) const -{ - std::string trimmedValue(value); - StringUtils::TrimLeft(trimmedValue); - StringUtils::TrimRight(trimmedValue, " \n\r"); - return trimmedValue; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRRadioRDSInfoTag.h kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRRadioRDSInfoTag.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/channels/PVRRadioRDSInfoTag.h 2016-04-25 03:00:07.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/channels/PVRRadioRDSInfoTag.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,231 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "FileItem.h" -#include "utils/IArchivable.h" -#include "utils/ISerializable.h" -#include "XBDateTime.h" - -#include -#include -#include -#include - -namespace PVR -{ - -class CPVRRadioRDSInfoTag : public IArchivable, public ISerializable -{ -public: - /*! - * @brief Create a new empty event . - */ - static CPVRRadioRDSInfoTagPtr CreateDefaultTag(); - -private: - /*! - * @brief Create a new empty event. - */ - CPVRRadioRDSInfoTag(void); - - /*! - * @brief Prevent copy construction, even for CEpgInfoTag instances and friends. - * Note: Only declared, but intentionally not implemented - * to prevent compiler generated copy ctor and to force. - * a linker error in case somebody tries to call it. - */ - CPVRRadioRDSInfoTag(const CPVRRadioRDSInfoTag& tag); - - /*! - * @brief Prevent copy construction, even for CEpgInfoTag instances and friends. - * Note: Only declared, but intentionally not implemented - * to prevent compiler generated copy ctor and to force. - * a linker error in case somebody tries to call it. - */ - const CPVRRadioRDSInfoTag& operator =(const CPVRRadioRDSInfoTag& tag); - -public: - virtual ~CPVRRadioRDSInfoTag(); - - bool operator ==(const CPVRRadioRDSInfoTag& tag) const; - bool operator !=(const CPVRRadioRDSInfoTag& tag) const; - - virtual void Archive(CArchive& ar); - virtual void Serialize(CVariant& value) const; - - void Clear(); - void ResetSongInformation(); - - /**! Basic RDS related information */ - void SetSpeechActive(bool active); - bool IsSpeechActive(); - void SetLanguage(const std::string& strLanguage); - const std::string& GetLanguage() const; - void SetCountry(const std::string& strCountry); - const std::string& GetCountry() const; - - /**! RDS Radiotext related information */ - void SetTitle(const std::string& strTitle); - void SetBand(const std::string& strBand); - void SetArtist(const std::string& strArtist); - void SetComposer(const std::string& strComposer); - void SetConductor(const std::string& strConductor); - void SetAlbum(const std::string& strAlbum); - void SetComment(const std::string& strComment); - void SetAlbumTrackNumber(int track); - - const std::string& GetTitle() const; - const std::string& GetBand() const; - const std::string& GetArtist() const; - const std::string& GetComposer() const; - const std::string& GetConductor() const; - const std::string& GetAlbum() const; - const std::string& GetComment() const; - int GetAlbumTrackNumber() const; - - void SetProgStation(const std::string& strProgStation); - void SetProgStyle(const std::string& strProgStyle); - void SetProgHost(const std::string& strProgHost); - void SetProgWebsite(const std::string& strWebsite); - void SetProgNow(const std::string& strNow); - void SetProgNext(const std::string& strNext); - void SetPhoneHotline(const std::string& strHotline); - void SetEMailHotline(const std::string& strHotline); - void SetPhoneStudio(const std::string& strPhone); - void SetEMailStudio(const std::string& strEMail); - void SetSMSStudio(const std::string& strSMS); - - const std::string& GetProgStation() const; - const std::string& GetProgStyle() const; - const std::string& GetProgHost() const; - const std::string& GetProgWebsite() const; - const std::string& GetProgNow() const; - const std::string& GetProgNext() const; - const std::string& GetPhoneHotline() const; - const std::string& GetEMailHotline() const; - const std::string& GetPhoneStudio() const; - const std::string& GetEMailStudio() const; - const std::string& GetSMSStudio() const; - - void SetInfoNews(const std::string& strNews); - void ClearInfoNews(); - const std::string GetInfoNews() const; - const std::deque& GetInfoNewsDeque() const; - - void SetInfoNewsLocal(const std::string& strNews); - void ClearInfoNewsLocal(); - const std::string GetInfoNewsLocal() const; - const std::deque& GetInfoNewsLocalDeque() const; - - void SetInfoSport(const std::string& strSport); - void ClearInfoSport(); - const std::string GetInfoSport() const; - const std::deque& GetInfoSportDeque() const; - - void SetInfoStock(const std::string& strSport); - void ClearInfoStock(); - const std::string GetInfoStock() const; - const std::deque& GetInfoStockDeque() const; - - void SetInfoWeather(const std::string& strWeather); - void ClearInfoWeather(); - const std::string GetInfoWeather() const; - const std::deque& GetInfoWeatherDeque() const; - - void SetInfoHoroscope(const std::string& strHoroscope); - void ClearInfoHoroscope(); - const std::string GetInfoHoroscope() const; - const std::deque& GetInfoHoroscopeDeque() const; - - void SetInfoCinema(const std::string& strCinema); - void ClearInfoCinema(); - const std::string GetInfoCinema() const; - const std::deque& GetInfoCinemaDeque() const; - - void SetInfoLottery(const std::string& strLottery); - void ClearInfoLottery(); - const std::string GetInfoLottery() const; - const std::deque& GetInfoLotteryDeque() const; - - void SetInfoOther(const std::string& strOther); - void ClearInfoOther(); - const std::string GetInfoOther() const; - const std::deque& GetInfoOtherDeque() const; - - void SetEditorialStaff(const std::string& strEditorialStaff); - void ClearEditorialStaff(); - const std::string GetEditorialStaff() const; - const std::deque& GetEditorialStaffDeque() const; - - void SetRadioStyle(const std::string& style) { m_strRadioStyle = style; } - const std::string GetRadioStyle() const { return m_strRadioStyle; } - void SetPlayingRadiotext(bool yesNo) { m_bHaveRadiotext = yesNo; } - bool IsPlayingRadiotext() { return m_bHaveRadiotext; } - void SetPlayingRadiotextPlus(bool yesNo) { m_bHaveRadiotextPlus = yesNo; } - bool IsPlayingRadiotextPlus() { return m_bHaveRadiotextPlus; } - -protected: - /*! \brief Trim whitespace off the given string - * \param value string to trim - * \return trimmed value, with spaces removed from left and right, as well as carriage returns from the right. - */ - std::string Trim(const std::string &value) const; - - bool m_RDS_SpeechActive; - - std::string m_strLanguage; - std::string m_strCountry; - std::string m_strTitle; - std::string m_strBand; - std::string m_strArtist; - std::string m_strComposer; - std::string m_strConductor; - std::string m_strAlbum; - std::string m_strComment; - int m_iAlbumTracknumber; - std::string m_strRadioStyle; - - std::deque m_strInfoNews; - std::deque m_strInfoNewsLocal; - std::deque m_strInfoSport; - std::deque m_strInfoStock; - std::deque m_strInfoWeather; - std::deque m_strInfoLottery; - std::deque m_strInfoOther; - std::deque m_strInfoHoroscope; - std::deque m_strInfoCinema; - std::deque m_strEditorialStaff; - std::string m_strProgStyle; - std::string m_strProgHost; - std::string m_strProgStation; - std::string m_strProgWebsite; - std::string m_strProgNow; - std::string m_strProgNext; - std::string m_strPhoneHotline; - std::string m_strEMailHotline; - std::string m_strPhoneStudio; - std::string m_strEMailStudio; - std::string m_strSMSStudio; - - bool m_bHaveRadiotext; - bool m_bHaveRadiotextPlus; -}; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,30 +18,27 @@ * */ +#include "GUIDialogPVRChannelManager.h" + #include "FileItem.h" +#include "GUIDialogPVRGroupManager.h" #include "dialogs/GUIDialogFileBrowser.h" +#include "guilib/GUIKeyboardFactory.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogProgress.h" #include "dialogs/GUIDialogSelect.h" #include "dialogs/GUIDialogYesNo.h" -#include "guilib/GUIKeyboardFactory.h" #include "guilib/GUIEditControl.h" #include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" #include "input/Key.h" +#include "guilib/LocalizeStrings.h" #include "profiles/ProfilesManager.h" +#include "pvr/PVRManager.h" +#include "pvr/channels/PVRChannelGroupsContainer.h" +#include "pvr/addons/PVRClients.h" #include "settings/Settings.h" #include "storage/MediaManager.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" - -#include "pvr/PVRManager.h" -#include "pvr/addons/PVRClients.h" -#include "pvr/channels/PVRChannelGroupsContainer.h" - -#include "GUIDialogPVRChannelManager.h" -#include "GUIDialogPVRGroupManager.h" -#include #define BUTTON_OK 4 #define BUTTON_APPLY 5 @@ -240,11 +237,11 @@ if (!pDialog) return true; - pDialog->SetHeading(CVariant{20052}); - pDialog->SetLine(0, CVariant{""}); - pDialog->SetLine(1, CVariant{19212}); - pDialog->SetLine(2, CVariant{20103}); - pDialog->Open(); + pDialog->SetHeading(20052); + pDialog->SetLine(0, ""); + pDialog->SetLine(1, 19212); + pDialog->SetLine(2, 20103); + pDialog->DoModal(); if (pDialog->IsConfirmed()) SaveList(); @@ -333,7 +330,7 @@ CFileItemPtr pItem = m_channelItems->Get(m_iSelected); if (!pItem) return false; - if (CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) + if (CProfilesManager::Get().GetCurrentProfile().canWriteSources() && !g_passwordManager.IsProfileLockUnlocked()) return false; // setup our thumb list @@ -363,10 +360,10 @@ std::string strThumb; VECSOURCES shares; - if (CSettings::GetInstance().GetString(CSettings::SETTING_PVRMENU_ICONPATH) != "") + if (CSettings::Get().GetString("pvrmenu.iconpath") != "") { CMediaSource share1; - share1.strPath = CSettings::GetInstance().GetString(CSettings::SETTING_PVRMENU_ICONPATH); + share1.strPath = CSettings::Get().GetString("pvrmenu.iconpath"); share1.strName = g_localizeStrings.Get(19066); shares.push_back(share1); } @@ -435,7 +432,7 @@ pDlgInfo->SetRadio(m_bIsRadio); /* Open dialog window */ - pDlgInfo->Open(); + pDlgInfo->DoModal(); Update(); return true; @@ -450,12 +447,12 @@ if (!pDlgSelect) return false; - pDlgSelect->SetHeading(CVariant{19213}); // Select Client + pDlgSelect->SetHeading(19213); // Select Client PVR_CLIENT_ITR itr; for (itr = m_clientsWithSettingsList.begin() ; itr != m_clientsWithSettingsList.end(); ++itr) pDlgSelect->Add((*itr)->Name()); - pDlgSelect->Open(); + pDlgSelect->DoModal(); iSelection = pDlgSelect->GetSelectedLabel(); } @@ -472,7 +469,7 @@ if (g_PVRClients->OpenDialogChannelAdd(channel)) Update(); else - CGUIDialogOK::ShowAndGetInput(CVariant{2103}, CVariant{16029}); // Add-on error;Check the log file for details. + CGUIDialogOK::ShowAndGetInput(2103, 16029); // Add-on error;Check the log file for details. } return true; } @@ -599,7 +596,7 @@ else if (button == CONTEXT_BUTTON_SETTINGS) { if (!g_PVRClients->OpenDialogChannelSettings(pItem->GetPVRChannelInfoTag())) - CGUIDialogOK::ShowAndGetInput(CVariant{2103}, CVariant{16029}); // Add-on error;Check the log file for details. + CGUIDialogOK::ShowAndGetInput(2103, 16029); // Add-on error;Check the log file for details. } else if (button == CONTEXT_BUTTON_DELETE) { @@ -607,9 +604,9 @@ if (!pDialog) return true; - pDialog->SetHeading(CVariant{19211}); // Delete channel - pDialog->SetText(CVariant{750}); // Are you sure? - pDialog->Open(); + pDialog->SetHeading(19211); // Delete channel + pDialog->SetText(750); // Are you sure? + pDialog->DoModal(); if (pDialog->IsConfirmed()) { @@ -622,13 +619,13 @@ Renumber(); } else - CGUIDialogOK::ShowAndGetInput(CVariant{2103}, CVariant{16029}); // Add-on error;Check the log file for details. + CGUIDialogOK::ShowAndGetInput(2103, 16029); // Add-on error;Check the log file for details. } } else if (button == CONTEXT_BUTTON_EDIT_SOURCE) { std::string strURL = pItem->GetProperty("StreamURL").asString(); - if (CGUIKeyboardFactory::ShowAndGetInput(strURL, CVariant{g_localizeStrings.Get(19214)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(strURL, g_localizeStrings.Get(19214), false)) pItem->SetProperty("StreamURL", strURL); } return true; @@ -730,7 +727,7 @@ channel->SetChannelName(strChannelName); if (!g_PVRClients->RenameChannel(channel)) - CGUIDialogOK::ShowAndGetInput(CVariant{2103}, CVariant{16029}); // Add-on error;Check the log file for details. + CGUIDialogOK::ShowAndGetInput(2103, 16029); // Add-on error;Check the log file for details. } } @@ -759,11 +756,11 @@ /* display the progress dialog */ CGUIDialogProgress* pDlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); - pDlgProgress->SetHeading(CVariant{190}); - pDlgProgress->SetLine(0, CVariant{""}); - pDlgProgress->SetLine(1, CVariant{328}); - pDlgProgress->SetLine(2, CVariant{""}); - pDlgProgress->Open(); + pDlgProgress->SetHeading(190); + pDlgProgress->SetLine(0, ""); + pDlgProgress->SetLine(1, 328); + pDlgProgress->SetLine(2, ""); + pDlgProgress->StartModal(); pDlgProgress->Progress(); pDlgProgress->SetPercentage(0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.h kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,10 +19,9 @@ * */ -#include "dialogs/GUIDialogContextMenu.h" #include "guilib/GUIDialog.h" +#include "dialogs/GUIDialogContextMenu.h" #include "view/GUIViewControl.h" - #include "pvr/channels/PVRChannelGroup.h" #include "pvr/addons/PVRClient.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,29 +18,27 @@ * */ +#include "GUIDialogPVRChannelsOSD.h" #include "Application.h" +#include "ApplicationMessenger.h" #include "FileItem.h" -#include "GUIInfoManager.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "epg/EpgContainer.h" -#include "guilib/LocalizeStrings.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" -#include "messaging/ApplicationMessenger.h" +#include "guilib/LocalizeStrings.h" +#include "dialogs/GUIDialogKaiToast.h" +#include "GUIDialogPVRGuideInfo.h" +#include "view/ViewState.h" #include "settings/Settings.h" +#include "GUIInfoManager.h" #include "utils/StringUtils.h" -#include "view/ViewState.h" #include "pvr/PVRManager.h" #include "pvr/channels/PVRChannelGroupsContainer.h" #include "pvr/windows/GUIWindowPVRBase.h" - -#include "GUIDialogPVRChannelsOSD.h" -#include "GUIDialogPVRGuideInfo.h" +#include "epg/EpgContainer.h" using namespace PVR; using namespace EPG; -using namespace KODI::MESSAGING; #define MAX_INVALIDATION_FREQUENCY 2000 // limit to one invalidation per X milliseconds @@ -262,10 +260,10 @@ void CGUIDialogPVRChannelsOSD::CloseOrSelect(unsigned int iItem) { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMENU_CLOSECHANNELOSDONSWITCH)) + if (CSettings::Get().GetBool("pvrmenu.closechannelosdonswitch")) { - if (CSettings::GetInstance().GetInt(CSettings::SETTING_PVRMENU_DISPLAYCHANNELINFO) > 0) - g_PVRManager.ShowPlayerInfo(CSettings::GetInstance().GetInt(CSettings::SETTING_PVRMENU_DISPLAYCHANNELINFO)); + if (CSettings::Get().GetInt("pvrmenu.displaychannelinfo") > 0) + g_PVRManager.ShowPlayerInfo(CSettings::Get().GetInt("pvrmenu.displaychannelinfo")); Close(); } else @@ -298,7 +296,7 @@ } } else - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast(new CFileItem(*pItem))); + CApplicationMessenger::Get().PlayFile(*pItem); m_group = GetPlayingGroup(); @@ -330,7 +328,7 @@ /* inform dialog about the file item and open dialog window */ CFileItem *itemNow = new CFileItem(epgnow); pDlgInfo->SetProgInfo(itemNow); - pDlgInfo->Open(); + pDlgInfo->DoModal(); delete itemNow; /* delete previuosly created FileItem */ } @@ -362,7 +360,7 @@ void CGUIDialogPVRChannelsOSD::Notify(const Observable &obs, const ObservableMessage msg) { CGUIMessage m(GUI_MSG_REFRESH_LIST, GetID(), 0, msg); - CApplicationMessenger::GetInstance().SendGUIMessage(m); + CApplicationMessenger::Get().SendGUIMessage(m); } void CGUIDialogPVRChannelsOSD::SaveSelectedItemPath(int iGroupID) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.h kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.h 2015-10-19 08:39:16.000000000 +0000 @@ -20,11 +20,9 @@ */ #include "guilib/GUIDialog.h" -#include "utils/Observer.h" #include "view/GUIViewControl.h" - +#include "utils/Observer.h" #include "pvr/channels/PVRChannelGroupsContainer.h" - #include class CFileItemList; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGroupManager.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGroupManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGroupManager.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGroupManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,22 +18,20 @@ * */ +#include "GUIDialogPVRGroupManager.h" #include "FileItem.h" +#include "guilib/GUIKeyboardFactory.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogYesNo.h" -#include "guilib/GUIKeyboardFactory.h" -#include "guilib/GUIRadioButtonControl.h" #include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" #include "input/Key.h" +#include "guilib/LocalizeStrings.h" +#include "guilib/GUIRadioButtonControl.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "pvr/PVRManager.h" #include "pvr/channels/PVRChannelGroupsContainer.h" -#include "GUIDialogPVRGroupManager.h" - using namespace PVR; #define CONTROL_LIST_CHANNELS_LEFT 11 @@ -102,7 +100,7 @@ { std::string strGroupName = ""; /* prompt for a group name */ - if (CGUIKeyboardFactory::ShowAndGetInput(strGroupName, CVariant{g_localizeStrings.Get(19139)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(strGroupName, g_localizeStrings.Get(19139), false)) { if (strGroupName != "") { @@ -136,11 +134,11 @@ if (!pDialog) return bReturn; - pDialog->SetHeading(CVariant{117}); - pDialog->SetLine(0, CVariant{""}); - pDialog->SetLine(1, CVariant{m_selectedGroup->GroupName()}); - pDialog->SetLine(2, CVariant{""}); - pDialog->Open(); + pDialog->SetHeading(117); + pDialog->SetLine(0, ""); + pDialog->SetLine(1, m_selectedGroup->GroupName()); + pDialog->SetLine(2, ""); + pDialog->DoModal(); if (pDialog->IsConfirmed()) { @@ -165,7 +163,7 @@ return bReturn; std::string strGroupName(m_selectedGroup->GroupName()); - if (CGUIKeyboardFactory::ShowAndGetInput(strGroupName, CVariant{g_localizeStrings.Get(19139)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(strGroupName, g_localizeStrings.Get(19139), false)) { if (strGroupName != "") { @@ -194,7 +192,7 @@ { if (m_channelGroups->GetFolderCount() == 0) { - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19137}); + CGUIDialogOK::ShowAndGetInput(19033, 19137); } else if (m_ungroupedChannels->GetFileCount() > 0) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGroupManager.h kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGroupManager.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGroupManager.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGroupManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,8 +21,7 @@ #include "guilib/GUIDialog.h" #include "view/GUIViewControl.h" - -#include "pvr/channels/PVRChannelGroup.h" +#include "../channels/PVRChannelGroup.h" class CFileItemList; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,25 +18,21 @@ * */ +#include "GUIDialogPVRGuideInfo.h" #include "Application.h" +#include "guilib/GUIWindowManager.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogYesNo.h" -#include "epg/EpgInfoTag.h" -#include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "pvr/PVRManager.h" #include "pvr/channels/PVRChannelGroupsContainer.h" +#include "epg/EpgInfoTag.h" #include "pvr/timers/PVRTimers.h" #include "pvr/timers/PVRTimerInfoTag.h" #include "pvr/windows/GUIWindowPVRBase.h" -#include "GUIDialogPVRGuideInfo.h" - -#include - using namespace PVR; using namespace EPG; @@ -47,7 +43,7 @@ #define CONTROL_BTN_PLAY_RECORDING 8 CGUIDialogPVRGuideInfo::CGUIDialogPVRGuideInfo(void) - : CGUIDialog(WINDOW_DIALOG_PVR_GUIDE_INFO, "DialogPVRInfo.xml") + : CGUIDialog(WINDOW_DIALOG_PVR_GUIDE_INFO, "DialogPVRGuideInfo.xml") , m_progItem(new CFileItem) { } @@ -60,26 +56,67 @@ { bool bReturn = false; - CFileItemPtr item(new CFileItem(tag)); - bReturn = CGUIWindowPVRBase::AddTimer(item.get(), false); + if (!tag) + return false; + + CPVRChannelPtr channel = tag->ChannelTag(); + if (!channel || !g_PVRManager.CheckParentalLock(channel)) + return false; - if (bReturn) - Close(); + // prompt user for confirmation of channel record + CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); + + if (pDialog) + { + pDialog->SetHeading(264); + pDialog->SetLine(0, ""); + pDialog->SetLine(1, tag->Title()); + pDialog->SetLine(2, ""); + pDialog->DoModal(); + + if (pDialog->IsConfirmed()) + { + Close(); + CPVRTimerInfoTagPtr newTimer = CPVRTimerInfoTag::CreateFromEpg(tag); + if (newTimer) + { + bReturn = CPVRTimers::AddTimer(newTimer); + } + else + { + bReturn = false; + } + } + } return bReturn; } -bool CGUIDialogPVRGuideInfo::ActionCancelTimer(const CFileItemPtr &timer) +bool CGUIDialogPVRGuideInfo::ActionCancelTimer(CFileItemPtr timer) { bool bReturn = false; + if (!timer || !timer->HasPVRTimerInfoTag()) + { + return bReturn; + } - if (timer->GetPVRTimerInfoTag()->IsRecording()) - bReturn = CGUIWindowPVRBase::StopRecordFile(timer.get()); - else - bReturn = CGUIWindowPVRBase::DeleteTimer(timer.get()); + // prompt user for confirmation of timer deletion + CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); - if (bReturn) - Close(); + if (pDialog) + { + pDialog->SetHeading(265); + pDialog->SetLine(0, ""); + pDialog->SetLine(1, timer->GetPVRTimerInfoTag()->m_strTitle); + pDialog->SetLine(2, ""); + pDialog->DoModal(); + + if (pDialog->IsConfirmed()) + { + Close(); + bReturn = CPVRTimers::DeleteTimer(*timer); + } + } return bReturn; } @@ -109,7 +146,7 @@ if (!tag || !tag->HasPVRChannel()) { /* invalid channel */ - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19067}); + CGUIDialogOK::ShowAndGetInput(19033, 19067); Close(); return bReturn; } @@ -149,7 +186,7 @@ if (ret == PLAYBACK_FAIL) { std::string msg = StringUtils::Format(g_localizeStrings.Get(19035).c_str(), g_localizeStrings.Get(19029).c_str()); // Channel could not be played. Check the log for details. - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{std::move(msg)}); + CGUIDialogOK::ShowAndGetInput(19033, msg); } else if (ret == PLAYBACK_OK) { @@ -224,26 +261,28 @@ SET_CONTROL_HIDDEN(CONTROL_BTN_PLAY_RECORDING); } - bool bHideRecord(true); - if (tag->HasTimer()) + if (tag->EndAsLocalTime() <= CDateTime::GetCurrentDateTime()) { - if (tag->Timer()->IsRecording()) - { - SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 19059); /* Stop recording */ - bHideRecord = false; - } - else if (tag->Timer()->HasTimerType() && !tag->Timer()->GetTimerType()->IsReadOnly()) - { - SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 19060); /* Delete timer */ - bHideRecord = false; - } + /* event has passed. hide the record button */ + SET_CONTROL_HIDDEN(CONTROL_BTN_RECORD); + return; } - else if (tag->EndAsLocalTime() > CDateTime::GetCurrentDateTime()) + + CFileItemPtr match = g_PVRTimers->GetTimerForEpgTag(m_progItem.get()); + if (!match || !match->HasPVRTimerInfoTag()) { - SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 264); /* Record */ - bHideRecord = false; + /* no timer present on this tag */ + if (tag->StartAsLocalTime() < CDateTime::GetCurrentDateTime()) + SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 264); // Record + else + SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 19061); // Add timer + } + else + { + /* timer present on this tag */ + if (tag->StartAsLocalTime() < CDateTime::GetCurrentDateTime()) + SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 19059); // Stop recording + else + SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 19060); // Delete timer } - - if (bHideRecord) - SET_CONTROL_HIDDEN(CONTROL_BTN_RECORD); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h 2015-04-04 00:00:17.000000000 +0000 @@ -47,7 +47,7 @@ virtual void OnInitWindow(); bool ActionStartTimer(const EPG::CEpgInfoTagPtr &tag); - bool ActionCancelTimer(const CFileItemPtr &timer); + bool ActionCancelTimer(CFileItemPtr timer); bool OnClickButtonOK(CGUIMessage &message); bool OnClickButtonRecord(CGUIMessage &message); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGuideOSD.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGuideOSD.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGuideOSD.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGuideOSD.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,17 +18,16 @@ * */ +#include "GUIDialogPVRGuideOSD.h" #include "FileItem.h" -#include "epg/Epg.h" +#include "GUIDialogPVRGuideInfo.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" #include "view/ViewState.h" +#include "epg/Epg.h" #include "pvr/PVRManager.h" -#include "GUIDialogPVRGuideInfo.h" -#include "GUIDialogPVRGuideOSD.h" - using namespace PVR; #define CONTROL_LIST 11 @@ -134,7 +133,7 @@ /* inform dialog about the file item and open dialog window */ pDlgInfo->SetProgInfo(pItem.get()); - pDlgInfo->Open(); + pDlgInfo->DoModal(); } void CGUIDialogPVRGuideOSD::OnWindowLoaded() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,16 +19,14 @@ */ #include "GUIDialogPVRGuideSearch.h" - -#include +#include "guilib/LocalizeStrings.h" +#include "guilib/GUIEditControl.h" +#include "utils/StringUtils.h" #include "addons/include/xbmc_pvr_types.h" +#include "pvr/PVRManager.h" #include "epg/EpgSearchFilter.h" -#include "guilib/GUIEditControl.h" -#include "guilib/LocalizeStrings.h" #include "pvr/channels/PVRChannelGroupsContainer.h" -#include "pvr/PVRManager.h" -#include "utils/StringUtils.h" using namespace PVR; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.h kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,8 +19,8 @@ * */ -#include "XBDateTime.h" #include "guilib/GUIDialog.h" +#include "XBDateTime.h" namespace EPG { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,426 +0,0 @@ -/* - * Copyright (C) 2012-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "Application.h" -#include "FileItem.h" -#include "GUIDialogPVRRadioRDSInfo.h" -#include "GUIUserMessages.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/GUISpinControl.h" -#include "guilib/GUIMessage.h" -#include "guilib/GUITextBox.h" -#include "guilib/LocalizeStrings.h" -#include "messaging/ApplicationMessenger.h" -#include "pvr/channels/PVRRadioRDSInfoTag.h" - -using namespace PVR; - -#define CONTROL_BTN_OK 10 -#define SPIN_CONTROL_INFO 21 -#define TEXT_INFO 22 -#define CONTROL_NEXT_PAGE 60 -#define CONTROL_INFO_LIST 70 - -#define INFO_NEWS 1 -#define INFO_NEWS_LOCAL 2 -#define INFO_SPORT 3 -#define INFO_WEATHER 4 -#define INFO_LOTTERY 5 -#define INFO_STOCK 6 -#define INFO_OTHER 7 -#define INFO_CINEMA 8 -#define INFO_HOROSCOPE 9 - -CGUIDialogPVRRadioRDSInfo::CGUIDialogPVRRadioRDSInfo(void) - : CGUIDialog(WINDOW_DIALOG_PVR_RADIO_RDS_INFO, "DialogPVRRadioRDSInfo.xml") - , m_rdsItem(new CFileItem) - , m_InfoPresent(false) - , m_LabelInfoNewsPresent(false) - , m_LabelInfoNewsLocalPresent(false) - , m_LabelInfoWeatherPresent(false) - , m_LabelInfoLotteryPresent(false) - , m_LabelInfoSportPresent(false) - , m_LabelInfoStockPresent(false) - , m_LabelInfoOtherPresent(false) - , m_LabelInfoCinemaPresent(false) - , m_LabelInfoHoroscopePresent(false) -{ -} - -bool CGUIDialogPVRRadioRDSInfo::OnMessage(CGUIMessage& message) -{ - if (message.GetMessage() == GUI_MSG_CLICKED) - { - int iControl = message.GetSenderId(); - - if (iControl == CONTROL_BTN_OK) - { - Close(); - return true; - } - else if (iControl == SPIN_CONTROL_INFO) - { - CGUISpinControl *spin = (CGUISpinControl *)GetControl(SPIN_CONTROL_INFO); - if (!spin) return true; - - CGUITextBox *textbox = (CGUITextBox *)GetControl(TEXT_INFO); - if (!textbox) return true; - - PVR::CPVRRadioRDSInfoTagPtr currentRDS = g_application.CurrentFileItem().GetPVRRadioRDSInfoTag(); - switch (spin->GetValue()) - { - case INFO_NEWS: - textbox->SetInfo(currentRDS->GetInfoNews()); - break; - case INFO_NEWS_LOCAL: - textbox->SetInfo(currentRDS->GetInfoNewsLocal()); - break; - case INFO_SPORT: - textbox->SetInfo(currentRDS->GetInfoSport()); - break; - case INFO_WEATHER: - textbox->SetInfo(currentRDS->GetInfoWeather()); - break; - case INFO_LOTTERY: - textbox->SetInfo(currentRDS->GetInfoLottery()); - break; - case INFO_STOCK: - textbox->SetInfo(currentRDS->GetInfoStock()); - break; - case INFO_OTHER: - textbox->SetInfo(currentRDS->GetInfoOther()); - break; - case INFO_CINEMA: - textbox->SetInfo(currentRDS->GetInfoCinema()); - break; - case INFO_HOROSCOPE: - textbox->SetInfo(currentRDS->GetInfoHoroscope()); - break; - } - - SET_CONTROL_VISIBLE(CONTROL_INFO_LIST); - } - } - else if (message.GetMessage() == GUI_MSG_NOTIFY_ALL) - { - if (IsActive() && message.GetParam1() == GUI_MSG_UPDATE_RADIOTEXT && - g_application.m_pPlayer->IsPlaying() && - g_application.CurrentFileItem().HasPVRRadioRDSInfoTag()) - { - PVR::CPVRRadioRDSInfoTagPtr currentRDS = g_application.CurrentFileItem().GetPVRRadioRDSInfoTag(); - CGUISpinControl *spin = (CGUISpinControl *)GetControl(SPIN_CONTROL_INFO); - CGUITextBox *textbox = (CGUITextBox *)GetControl(TEXT_INFO); - - if (currentRDS->GetInfoNews().size()) - { - if (!m_LabelInfoNewsPresent) - { - spin->AddLabel(g_localizeStrings.Get(29916), INFO_NEWS); - m_LabelInfoNewsPresent = true; - m_InfoPresent = true; - } - - if (m_LabelInfoNews != currentRDS->GetInfoNews()) - { - spin->SetValue(INFO_NEWS); - m_LabelInfoNews = currentRDS->GetInfoNews(); - textbox->SetInfo(m_LabelInfoNews); - } - } - if (currentRDS->GetInfoNewsLocal().size()) - { - if (!m_LabelInfoNewsLocalPresent) - { - spin->AddLabel(g_localizeStrings.Get(29917), INFO_NEWS_LOCAL); - m_LabelInfoNewsLocalPresent = true; - m_InfoPresent = true; - } - - if (m_LabelInfoNewsLocal != currentRDS->GetInfoNewsLocal()) - { - spin->SetValue(INFO_NEWS_LOCAL); - m_LabelInfoNewsLocal = currentRDS->GetInfoNewsLocal(); - textbox->SetInfo(m_LabelInfoNewsLocal); - } - } - if (currentRDS->GetInfoSport().size()) - { - if (!m_LabelInfoSportPresent) - { - spin->AddLabel(g_localizeStrings.Get(29918), INFO_SPORT); - m_LabelInfoSportPresent = true; - m_InfoPresent = true; - } - - if (m_LabelInfoSport != currentRDS->GetInfoSport()) - { - spin->SetValue(INFO_SPORT); - m_LabelInfoSport = currentRDS->GetInfoSport(); - textbox->SetInfo(m_LabelInfoSport); - } - } - if (currentRDS->GetInfoWeather().size()) - { - if (!m_LabelInfoWeatherPresent) - { - spin->AddLabel(g_localizeStrings.Get(400), INFO_WEATHER); - m_LabelInfoWeatherPresent = true; - m_InfoPresent = true; - } - - if (m_LabelInfoWeather != currentRDS->GetInfoWeather()) - { - spin->SetValue(INFO_WEATHER); - m_LabelInfoWeather = currentRDS->GetInfoWeather(); - textbox->SetInfo(m_LabelInfoWeather); - } - } - if (currentRDS->GetInfoLottery().size()) - { - if (!m_LabelInfoLotteryPresent) - { - spin->AddLabel(g_localizeStrings.Get(29919), INFO_LOTTERY); - m_LabelInfoLotteryPresent = true; - m_InfoPresent = true; - } - - if (m_LabelInfoLottery != currentRDS->GetInfoLottery()) - { - spin->SetValue(INFO_LOTTERY); - m_LabelInfoLottery = currentRDS->GetInfoLottery(); - textbox->SetInfo(m_LabelInfoLottery); - } - } - if (currentRDS->GetInfoStock().size()) - { - if (!m_LabelInfoStockPresent) - { - spin->AddLabel(g_localizeStrings.Get(29920), INFO_STOCK); - m_LabelInfoStockPresent = true; - m_InfoPresent = true; - } - - if (m_LabelInfoStock != currentRDS->GetInfoStock()) - { - spin->SetValue(INFO_STOCK); - m_LabelInfoStock = currentRDS->GetInfoStock(); - textbox->SetInfo(m_LabelInfoStock); - } - } - if (currentRDS->GetInfoOther().size()) - { - if (!m_LabelInfoOtherPresent) - { - spin->AddLabel(g_localizeStrings.Get(29921), INFO_OTHER); - m_LabelInfoOtherPresent = true; - m_InfoPresent = true; - } - - if (m_LabelInfoOther != currentRDS->GetInfoOther()) - { - spin->SetValue(INFO_OTHER); - m_LabelInfoOther = currentRDS->GetInfoOther(); - textbox->SetInfo(m_LabelInfoOther); - } - } - if (currentRDS->GetInfoCinema().size()) - { - if (!m_LabelInfoCinemaPresent) - { - spin->AddLabel(g_localizeStrings.Get(19602), INFO_CINEMA); - m_LabelInfoCinemaPresent = true; - m_InfoPresent = true; - } - - if (m_LabelInfoCinema != currentRDS->GetInfoCinema()) - { - spin->SetValue(INFO_CINEMA); - m_LabelInfoCinema = currentRDS->GetInfoCinema(); - textbox->SetInfo(m_LabelInfoCinema); - } - } - if (currentRDS->GetInfoHoroscope().size()) - { - if (!m_LabelInfoHoroscopePresent) - { - spin->AddLabel(g_localizeStrings.Get(29922), INFO_HOROSCOPE); - m_LabelInfoHoroscopePresent = true; - m_InfoPresent = true; - } - - if (m_LabelInfoHoroscope != currentRDS->GetInfoHoroscope()) - { - spin->SetValue(INFO_HOROSCOPE); - m_LabelInfoHoroscope = currentRDS->GetInfoHoroscope(); - textbox->SetInfo(m_LabelInfoHoroscope); - } - } - if (m_InfoPresent) - SET_CONTROL_VISIBLE(CONTROL_INFO_LIST); - else - SET_CONTROL_HIDDEN(CONTROL_INFO_LIST); - } - } - - return CGUIDialog::OnMessage(message); -} - -void CGUIDialogPVRRadioRDSInfo::OnInitWindow() -{ - // call init - CGUIDialog::OnInitWindow(); - - m_LabelInfoNewsPresent = false; - m_LabelInfoNewsLocalPresent = false; - m_LabelInfoSportPresent = false; - m_LabelInfoWeatherPresent = false; - m_LabelInfoLotteryPresent = false; - m_LabelInfoStockPresent = false; - m_LabelInfoOtherPresent = false; - m_LabelInfoHoroscopePresent = false; - m_LabelInfoCinemaPresent = false; - m_InfoPresent = false; - - PVR::CPVRRadioRDSInfoTagPtr currentRDS = g_application.CurrentFileItem().GetPVRRadioRDSInfoTag(); - - CGUISpinControl *spin = (CGUISpinControl *)GetControl(SPIN_CONTROL_INFO); - if (!spin) return; - spin->Clear(); - - CGUITextBox *textbox = (CGUITextBox *)GetControl(TEXT_INFO); - if (!textbox) return; - - if (currentRDS->GetInfoNews().size()) - { - spin->AddLabel(g_localizeStrings.Get(29916), INFO_NEWS); - textbox->SetInfo(currentRDS->GetInfoNews()); - spin->SetValue(INFO_NEWS); - m_LabelInfoNewsPresent = true; - m_InfoPresent = true; - } - if (currentRDS->GetInfoNewsLocal().size()) - { - spin->AddLabel(g_localizeStrings.Get(29917), INFO_NEWS_LOCAL); - if (!m_InfoPresent) - { - textbox->SetInfo(currentRDS->GetInfoNewsLocal()); - spin->SetValue(INFO_NEWS_LOCAL); - m_LabelInfoNewsLocalPresent = true; - m_InfoPresent = true; - } - } - if (currentRDS->GetInfoSport().size()) - { - spin->AddLabel(g_localizeStrings.Get(29918), INFO_SPORT); - if (!m_InfoPresent) - { - textbox->SetInfo(currentRDS->GetInfoSport()); - spin->SetValue(INFO_SPORT); - m_LabelInfoSportPresent = true; - m_InfoPresent = true; - } - } - if (currentRDS->GetInfoWeather().size()) - { - spin->AddLabel(g_localizeStrings.Get(400), INFO_WEATHER); - if (!m_InfoPresent) - { - textbox->SetInfo(currentRDS->GetInfoWeather()); - spin->SetValue(INFO_WEATHER); - m_LabelInfoWeatherPresent = true; - m_InfoPresent = true; - } - } - if (currentRDS->GetInfoLottery().size()) - { - spin->AddLabel(g_localizeStrings.Get(29919), INFO_LOTTERY); - if (!m_InfoPresent) - { - textbox->SetInfo(currentRDS->GetInfoLottery()); - spin->SetValue(INFO_LOTTERY); - m_LabelInfoLotteryPresent = true; - m_InfoPresent = true; - } - } - if (currentRDS->GetInfoStock().size()) - { - spin->AddLabel(g_localizeStrings.Get(29920), INFO_STOCK); - if (!m_InfoPresent) - { - textbox->SetInfo(currentRDS->GetInfoStock()); - spin->SetValue(INFO_STOCK); - m_LabelInfoStockPresent = true; - m_InfoPresent = true; - } - } - if (currentRDS->GetInfoOther().size()) - { - spin->AddLabel(g_localizeStrings.Get(29921), INFO_OTHER); - if (!m_InfoPresent) - { - textbox->SetInfo(currentRDS->GetInfoOther()); - spin->SetValue(INFO_OTHER); - m_LabelInfoOtherPresent = true; - m_InfoPresent = true; - } - } - if (currentRDS->GetInfoCinema().size()) - { - spin->AddLabel(g_localizeStrings.Get(19602), INFO_CINEMA); - if (!m_InfoPresent) - { - textbox->SetInfo(currentRDS->GetInfoCinema()); - spin->SetValue(INFO_CINEMA); - m_LabelInfoCinemaPresent = true; - m_InfoPresent = true; - } - } - if (currentRDS->GetInfoHoroscope().size()) - { - spin->AddLabel(g_localizeStrings.Get(29922), INFO_HOROSCOPE); - if (!m_InfoPresent) - { - textbox->SetInfo(currentRDS->GetInfoHoroscope()); - spin->SetValue(INFO_HOROSCOPE); - m_LabelInfoHoroscopePresent = true; - m_InfoPresent = true; - } - } - - if (m_InfoPresent) - SET_CONTROL_VISIBLE(CONTROL_INFO_LIST); - else - SET_CONTROL_HIDDEN(CONTROL_INFO_LIST); -} - -void CGUIDialogPVRRadioRDSInfo::OnDeinitWindow(int nextWindowID) -{ - CGUIDialog::OnDeinitWindow(nextWindowID); -} - -void CGUIDialogPVRRadioRDSInfo::SetRadioRDS(const CFileItem *item) -{ - *m_rdsItem = *item; -} - -CFileItemPtr CGUIDialogPVRRadioRDSInfo::GetCurrentListItem(int offset) -{ - return m_rdsItem; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.h kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -#pragma once -/* - * Copyright (C) 2012-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "guilib/GUIDialog.h" - -namespace PVR -{ - class CGUIDialogPVRRadioRDSInfo : public CGUIDialog - { - public: - CGUIDialogPVRRadioRDSInfo(void); - virtual ~CGUIDialogPVRRadioRDSInfo(void) {} - virtual bool OnMessage(CGUIMessage& message); - virtual bool HasListItems() const { return true; }; - virtual CFileItemPtr GetCurrentListItem(int offset = 0); - - void SetRadioRDS(const CFileItem *item); - - protected: - virtual void OnInitWindow(); - virtual void OnDeinitWindow(int nextWindowID); - - CFileItemPtr m_rdsItem; - - private: - bool m_InfoPresent; - bool m_LabelInfoNewsPresent; - std::string m_LabelInfoNews; - - bool m_LabelInfoNewsLocalPresent; - std::string m_LabelInfoNewsLocal; - - bool m_LabelInfoWeatherPresent; - std::string m_LabelInfoWeather; - - bool m_LabelInfoLotteryPresent; - std::string m_LabelInfoLottery; - - bool m_LabelInfoSportPresent; - std::string m_LabelInfoSport; - - bool m_LabelInfoStockPresent; - std::string m_LabelInfoStock; - - bool m_LabelInfoOtherPresent; - std::string m_LabelInfoOther; - - bool m_LabelInfoCinemaPresent; - std::string m_LabelInfoCinema; - - bool m_LabelInfoHoroscopePresent; - std::string m_LabelInfoHoroscope; - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRRecordingInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRRecordingInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRRecordingInfo.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRRecordingInfo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,16 +18,15 @@ * */ -#include "FileItem.h" - #include "GUIDialogPVRRecordingInfo.h" +#include "FileItem.h" using namespace PVR; -#define CONTROL_BTN_OK 7 +#define CONTROL_BTN_OK 10 CGUIDialogPVRRecordingInfo::CGUIDialogPVRRecordingInfo(void) - : CGUIDialog(WINDOW_DIALOG_PVR_RECORDING_INFO, "DialogPVRInfo.xml") + : CGUIDialog(WINDOW_DIALOG_PVR_RECORDING_INFO, "DialogPVRRecordingInfo.xml") , m_recordItem(new CFileItem) { } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,1280 +19,482 @@ */ #include "GUIDialogPVRTimerSettings.h" - -#include "addons/include/xbmc_pvr_types.h" -#include "dialogs/GUIDialogNumeric.h" #include "FileItem.h" -#include "guilib/GUIWindowManager.h" +#include "dialogs/GUIDialogNumeric.h" #include "guilib/LocalizeStrings.h" +#include "pvr/PVRManager.h" #include "pvr/addons/PVRClient.h" #include "pvr/channels/PVRChannelGroupsContainer.h" -#include "pvr/PVRManager.h" -#include "pvr/PVRSettings.h" #include "pvr/timers/PVRTimerInfoTag.h" -#include "pvr/timers/PVRTimerType.h" #include "settings/lib/Setting.h" #include "settings/lib/SettingsManager.h" -#include "settings/SettingUtils.h" #include "settings/windows/GUIControlSettings.h" #include "utils/log.h" #include "utils/StringUtils.h" using namespace PVR; -#define SETTING_TMR_TYPE "timer.type" -#define SETTING_TMR_ACTIVE "timer.active" -#define SETTING_TMR_NAME "timer.name" -#define SETTING_TMR_EPGSEARCH "timer.epgsearch" -#define SETTING_TMR_FULLTEXT "timer.fulltext" -#define SETTING_TMR_CHANNEL "timer.channel" -#define SETTING_TMR_START_ANYTIME "timer.startanytime" -#define SETTING_TMR_END_ANYTIME "timer.endanytime" -#define SETTING_TMR_START_DAY "timer.startday" -#define SETTING_TMR_END_DAY "timer.endday" -#define SETTING_TMR_BEGIN "timer.begin" -#define SETTING_TMR_END "timer.end" -#define SETTING_TMR_WEEKDAYS "timer.weekdays" -#define SETTING_TMR_FIRST_DAY "timer.firstday" -#define SETTING_TMR_NEW_EPISODES "timer.newepisodes" -#define SETTING_TMR_BEGIN_PRE "timer.startmargin" -#define SETTING_TMR_END_POST "timer.endmargin" -#define SETTING_TMR_PRIORITY "timer.priority" -#define SETTING_TMR_LIFETIME "timer.lifetime" -#define SETTING_TMR_MAX_REC "timer.maxrecordings" -#define SETTING_TMR_DIR "timer.directory" -#define SETTING_TMR_REC_GROUP "timer.recgroup" - -#define TYPE_DEP_VISIBI_COND_ID_POSTFIX "visibi.typedep" -#define TYPE_DEP_ENABLE_COND_ID_POSTFIX "enable.typedep" -#define CHANNEL_DEP_VISIBI_COND_ID_POSTFIX "visibi.channeldep" -#define START_ANYTIME_DEP_VISIBI_COND_ID_POSTFIX "visibi.startanytimedep" -#define END_ANYTIME_DEP_VISIBI_COND_ID_POSTFIX "visibi.endanytimedep" - -#define ENTRY_ANY_CHANNEL (-1) - -CGUIDialogPVRTimerSettings::CGUIDialogPVRTimerSettings() : - CGUIDialogSettingsManualBase(WINDOW_DIALOG_PVR_TIMER_SETTING, "DialogPVRTimerSettings.xml"), - m_bIsRadio(false), - m_bIsNewTimer(true), - m_bTimerActive(false), - m_bFullTextEpgSearch(true), - m_bStartAnyTime(false), - m_bEndAnyTime(false), - m_iWeekdays(PVR_WEEKDAY_NONE), - m_iPreventDupEpisodes(0), - m_iMarginStart(0), - m_iMarginEnd(0), - m_iPriority(0), - m_iLifetime(0), - m_iMaxRecordings(0), - m_iRecordingGroup(0) +#define SETTING_TMR_ACTIVE "timer.active" +#define SETTING_TMR_CHNAME "timer.channelname" +#define SETTING_TMR_DAY "timer.day" +#define SETTING_TMR_BEGIN "timer.begin" +#define SETTING_TMR_END "timer.end" +#define SETTING_TMR_PRIORITY "timer.priority" +#define SETTING_TMR_LIFETIME "timer.lifetime" +#define SETTING_TMR_FIRST_DAY "timer.firstday" +#define SETTING_TMR_NAME "timer.name" +#define SETTING_TMR_DIR "timer.directory" + +CGUIDialogPVRTimerSettings::CGUIDialogPVRTimerSettings(void) + : CGUIDialogSettingsManualBase(WINDOW_DIALOG_PVR_TIMER_SETTING, "DialogPVRTimerSettings.xml"), + m_tmp_iFirstDay(0), + m_tmp_day(11), + m_bTimerActive(false), + m_selectedChannelEntry(0), + m_timerItem(NULL) { m_loadType = LOAD_EVERY_TIME; } -CGUIDialogPVRTimerSettings::~CGUIDialogPVRTimerSettings() -{ -} - void CGUIDialogPVRTimerSettings::SetTimer(CFileItem *item) { - if (item == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::SetTimer - No item"); - return; - } - - m_timerInfoTag = item->GetPVRTimerInfoTag(); - - if (!m_timerInfoTag) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::SetTimer - No timer info tag"); - return; - } - - // Copy data we need from tag. Do not modify the tag itself until Save()! - m_timerType = m_timerInfoTag->GetTimerType(); - m_bIsRadio = m_timerInfoTag->m_bIsRadio; - m_bIsNewTimer = m_timerInfoTag->m_iClientIndex == PVR_TIMER_NO_CLIENT_INDEX; - m_bTimerActive = m_bIsNewTimer || m_timerInfoTag->IsActive(); - m_bStartAnyTime = m_bIsNewTimer || m_timerInfoTag->m_bStartAnyTime; - m_bEndAnyTime = m_bIsNewTimer || m_timerInfoTag->m_bEndAnyTime; - m_strTitle = m_timerInfoTag->m_strTitle; - - m_startLocalTime = m_timerInfoTag->StartAsLocalTime(); - m_endLocalTime = m_timerInfoTag->EndAsLocalTime(); - m_timerStartTimeStr = m_startLocalTime.GetAsLocalizedTime("", false); - m_timerEndTimeStr = m_endLocalTime.GetAsLocalizedTime("", false); - m_firstDayLocalTime = m_timerInfoTag->FirstDayAsLocalTime(); - - m_strEpgSearchString = m_timerInfoTag->m_strEpgSearchString; - - if (m_bIsNewTimer && m_strEpgSearchString.empty() && (m_strTitle != g_localizeStrings.Get(19056))) - m_strEpgSearchString = m_strTitle; - - m_bFullTextEpgSearch = m_timerInfoTag->m_bFullTextEpgSearch; - m_iWeekdays = m_timerInfoTag->m_iWeekdays; - - if (m_bIsNewTimer && (m_iWeekdays == PVR_WEEKDAY_NONE)) - m_iWeekdays = PVR_WEEKDAY_ALLDAYS; - - m_iPreventDupEpisodes = m_timerInfoTag->m_iPreventDupEpisodes; - m_iMarginStart = m_timerInfoTag->m_iMarginStart; - m_iMarginEnd = m_timerInfoTag->m_iMarginEnd; - m_iPriority = m_timerInfoTag->m_iPriority; - m_iLifetime = m_timerInfoTag->m_iLifetime; - m_iMaxRecordings = m_timerInfoTag->m_iMaxRecordings; - m_strDirectory = m_timerInfoTag->m_strDirectory; - m_iRecordingGroup = m_timerInfoTag->m_iRecordingGroup; - - InitializeChannelsList(); - InitializeTypesList(); - - // Channel - m_channel = ChannelDescriptor(); - - if (m_timerInfoTag->m_iClientChannelUid == PVR_INVALID_CHANNEL_UID) - { - bool bChannelSet(false); - if (m_timerType && m_timerType->IsRepeatingEpgBased()) - { - // Select "Any channel" - const auto it = m_channelEntries.find(ENTRY_ANY_CHANNEL); - if (it != m_channelEntries.end()) - { - m_channel = it->second; - bChannelSet = true; - } - } - else if (m_bIsNewTimer) - { - // Select first real (not "Any channel") entry. - for (const auto &channel : m_channelEntries) - { - if (channel.second.channelUid != PVR_INVALID_CHANNEL_UID) - { - m_channel = channel.second; - bChannelSet = true; - break; - } - } - } - - if (!bChannelSet) - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::SetTimer - Unable to map PVR_INVALID_CHANNEL_UID to channel entry!"); - } - else - { - // Find matching channel entry - bool bChannelSet(false); - for (const auto &channel : m_channelEntries) - { - if ((channel.second.channelUid == m_timerInfoTag->m_iClientChannelUid) && - (channel.second.clientId == m_timerInfoTag->m_iClientId)) - { - m_channel = channel.second; - bChannelSet = true; - break; - } - } - - if (!bChannelSet) - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::SetTimer - Unable to map channel uid to channel entry!"); - } + m_timerItem = item; + m_timerItem->GetPVRTimerInfoTag()->StartAsLocalTime().GetAsSystemTime(m_timerStartTime); + m_timerItem->GetPVRTimerInfoTag()->EndAsLocalTime().GetAsSystemTime(m_timerEndTime); + m_timerStartTimeStr = m_timerItem->GetPVRTimerInfoTag()->StartAsLocalTime().GetAsLocalizedTime("", false); + m_timerEndTimeStr = m_timerItem->GetPVRTimerInfoTag()->EndAsLocalTime().GetAsLocalizedTime("", false); - if (!m_timerType) - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::SetTimer - No timer type!"); -} - -void CGUIDialogPVRTimerSettings::SetupView() -{ - CGUIDialogSettingsManualBase::SetupView(); - SetButtonLabels(); -} - -void CGUIDialogPVRTimerSettings::InitializeSettings() -{ - CGUIDialogSettingsManualBase::InitializeSettings(); - - CSettingCategory *category = AddCategory("pvrtimersettings", -1); - if (category == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::InitializeSettings - Unable to add settings category"); - return; - } - - CSettingGroup *group = AddGroup(category); - if (group == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::InitializeSettings - Unable to add settings group"); - return; - } - - CSetting *setting = NULL; - - // Timer type - setting = AddList(group, SETTING_TMR_TYPE, 803, 0, 0, TypesFiller, 803); - AddTypeDependentEnableCondition(setting, SETTING_TMR_TYPE); - - // Timer enabled/disabled - setting = AddToggle(group, SETTING_TMR_ACTIVE, 305, 0, m_bTimerActive); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_ACTIVE); - AddTypeDependentEnableCondition(setting, SETTING_TMR_ACTIVE); - - // Name - setting = AddEdit(group, SETTING_TMR_NAME, 19075, 0, m_strTitle, true, false, 19097); - AddTypeDependentEnableCondition(setting, SETTING_TMR_NAME); - - // epg search string (only for epg-based repeating timers) - setting = AddEdit(group, SETTING_TMR_EPGSEARCH, 804, 0, m_strEpgSearchString, true, false, 805); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_EPGSEARCH); - AddTypeDependentEnableCondition(setting, SETTING_TMR_EPGSEARCH); - - // epg fulltext search (only for epg-based repeating timers) - setting = AddToggle(group, SETTING_TMR_FULLTEXT, 806, 0, m_bFullTextEpgSearch); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_FULLTEXT); - AddTypeDependentEnableCondition(setting, SETTING_TMR_FULLTEXT); - - // Channel - setting = AddList(group, SETTING_TMR_CHANNEL, 19078, 0, 0, ChannelsFiller, 19078); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_CHANNEL); - AddTypeDependentEnableCondition(setting, SETTING_TMR_CHANNEL); - - // Days of week (only for repeating timers) - std::vector weekdaysPreselect; - if (m_iWeekdays & PVR_WEEKDAY_MONDAY) - weekdaysPreselect.push_back(PVR_WEEKDAY_MONDAY); - if (m_iWeekdays & PVR_WEEKDAY_TUESDAY) - weekdaysPreselect.push_back(PVR_WEEKDAY_TUESDAY); - if (m_iWeekdays & PVR_WEEKDAY_WEDNESDAY) - weekdaysPreselect.push_back(PVR_WEEKDAY_WEDNESDAY); - if (m_iWeekdays & PVR_WEEKDAY_THURSDAY) - weekdaysPreselect.push_back(PVR_WEEKDAY_THURSDAY); - if (m_iWeekdays & PVR_WEEKDAY_FRIDAY) - weekdaysPreselect.push_back(PVR_WEEKDAY_FRIDAY); - if (m_iWeekdays & PVR_WEEKDAY_SATURDAY) - weekdaysPreselect.push_back(PVR_WEEKDAY_SATURDAY); - if (m_iWeekdays & PVR_WEEKDAY_SUNDAY) - weekdaysPreselect.push_back(PVR_WEEKDAY_SUNDAY); - - setting = AddList(group, SETTING_TMR_WEEKDAYS, 19079, 0, weekdaysPreselect, WeekdaysFiller, 19079, 1, -1, true, -1, WeekdaysValueFormatter); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_WEEKDAYS); - AddTypeDependentEnableCondition(setting, SETTING_TMR_WEEKDAYS); - - // "Start any time" (only for repeating timers) - setting = AddToggle(group, SETTING_TMR_START_ANYTIME, 810, 0, m_bStartAnyTime); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_START_ANYTIME); - AddTypeDependentEnableCondition(setting, SETTING_TMR_START_ANYTIME); - - // Start day (day + month + year only, no hours, minutes) - setting = AddSpinner(group, SETTING_TMR_START_DAY, 19128, 0, GetDateAsIndex(m_startLocalTime), DaysFiller); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_START_DAY); - AddTypeDependentEnableCondition(setting, SETTING_TMR_START_DAY); - AddStartAnytimeDependentVisibilityCondition(setting, SETTING_TMR_START_DAY); - - // Start time (hours + minutes only, no day, month, year) - setting = AddButton(group, SETTING_TMR_BEGIN, 19126, 0); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_BEGIN); - AddTypeDependentEnableCondition(setting, SETTING_TMR_BEGIN); - AddStartAnytimeDependentVisibilityCondition(setting, SETTING_TMR_BEGIN); - - // "End any time" (only for repeating timers) - setting = AddToggle(group, SETTING_TMR_END_ANYTIME, 817, 0, m_bEndAnyTime); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_END_ANYTIME); - AddTypeDependentEnableCondition(setting, SETTING_TMR_END_ANYTIME); - - // End day (day + month + year only, no hours, minutes) - setting = AddSpinner(group, SETTING_TMR_END_DAY, 19129, 0, GetDateAsIndex(m_endLocalTime), DaysFiller); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_END_DAY); - AddTypeDependentEnableCondition(setting, SETTING_TMR_END_DAY); - AddEndAnytimeDependentVisibilityCondition(setting, SETTING_TMR_END_DAY); - - // End time (hours + minutes only, no day, month, year) - setting = AddButton(group, SETTING_TMR_END, 19127, 0); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_END); - AddTypeDependentEnableCondition(setting, SETTING_TMR_END); - AddEndAnytimeDependentVisibilityCondition(setting, SETTING_TMR_END); - - // First day (only for repeating timers) - setting = AddSpinner(group, SETTING_TMR_FIRST_DAY, 19084, 0, GetDateAsIndex(m_firstDayLocalTime), DaysFiller); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_FIRST_DAY); - AddTypeDependentEnableCondition(setting, SETTING_TMR_FIRST_DAY); - - // "Prevent duplicate episodes" (only for repeating timers) - setting = AddList(group, SETTING_TMR_NEW_EPISODES, 812, 0, m_iPreventDupEpisodes, DupEpisodesFiller, 812); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_NEW_EPISODES); - AddTypeDependentEnableCondition(setting, SETTING_TMR_NEW_EPISODES); - - // Pre and post record time - setting = AddList(group, SETTING_TMR_BEGIN_PRE, 813, 0, m_iMarginStart, MarginTimeFiller, 813); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_BEGIN_PRE); - AddTypeDependentEnableCondition(setting, SETTING_TMR_BEGIN_PRE); - - setting = AddList(group, SETTING_TMR_END_POST, 814, 0, m_iMarginEnd, MarginTimeFiller, 814); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_END_POST); - AddTypeDependentEnableCondition(setting, SETTING_TMR_END_POST); - - // Priority - setting = AddList(group, SETTING_TMR_PRIORITY, 19082, 0, m_iPriority, PrioritiesFiller, 19082); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_PRIORITY); - AddTypeDependentEnableCondition(setting, SETTING_TMR_PRIORITY); - - // Lifetime - setting = AddList(group, SETTING_TMR_LIFETIME, 19083, 0, m_iLifetime, LifetimesFiller, 19083); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_LIFETIME); - AddTypeDependentEnableCondition(setting, SETTING_TMR_LIFETIME); - - // MaxRecordings - setting = AddList(group, SETTING_TMR_MAX_REC, 818, 0, m_iMaxRecordings, MaxRecordingsFiller, 818); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_MAX_REC); - AddTypeDependentEnableCondition(setting, SETTING_TMR_MAX_REC); - - // Recording folder - setting = AddEdit(group, SETTING_TMR_DIR, 19076, 0, m_strDirectory, true, false, 19104); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_DIR); - AddTypeDependentEnableCondition(setting, SETTING_TMR_DIR); - - // Recording group - setting = AddList(group, SETTING_TMR_REC_GROUP, 811, 0, m_iRecordingGroup, RecordingGroupFiller, 811); - AddTypeDependentVisibilityCondition(setting, SETTING_TMR_REC_GROUP); - AddTypeDependentEnableCondition(setting, SETTING_TMR_REC_GROUP); -} - -int CGUIDialogPVRTimerSettings::GetWeekdaysFromSetting(const CSetting *setting) -{ - const CSettingList *settingList = static_cast(setting); - if (settingList->GetElementType() != SettingTypeInteger) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::GetWeekdaysFromSetting - wrong weekdays element type"); - return 0; - } - int weekdays = 0; - std::vector list = CSettingUtils::GetList(settingList); - for (const auto &value : list) - { - if (!value.isInteger()) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::GetWeekdaysFromSetting - wrong weekdays value type"); - return 0; - } - weekdays += static_cast(value.asInteger()); - } - - return weekdays; + m_tmp_iFirstDay = 0; + m_tmp_day = 11; } void CGUIDialogPVRTimerSettings::OnSettingChanged(const CSetting *setting) { if (setting == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::OnSettingChanged - No setting"); return; - } CGUIDialogSettingsManualBase::OnSettingChanged(setting); - const std::string &settingId = setting->GetId(); - - if (settingId == SETTING_TMR_TYPE) - { - int idx = static_cast(setting)->GetValue(); - const auto it = m_typeEntries.find(idx); - if (it != m_typeEntries.end()) - { - m_timerType = it->second; + CPVRTimerInfoTagPtr tag = m_timerItem->GetPVRTimerInfoTag(); + if (tag == NULL) + return; - if (m_timerType->IsRepeating() && (m_iWeekdays == PVR_WEEKDAY_ALLDAYS)) - SetButtonLabels(); // update "Any day" vs. "Every day" - } - else - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::OnSettingChanged - Unable to get 'type' value"); - } - } - else if (settingId == SETTING_TMR_ACTIVE) - { + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_TMR_ACTIVE) m_bTimerActive = static_cast(setting)->GetValue(); - } - else if (settingId == SETTING_TMR_NAME) - { - m_strTitle = static_cast(setting)->GetValue(); - } - else if (settingId == SETTING_TMR_EPGSEARCH) - { - m_strEpgSearchString = static_cast(setting)->GetValue(); - } - else if (settingId == SETTING_TMR_FULLTEXT) + if (settingId == SETTING_TMR_CHNAME) + m_selectedChannelEntry = static_cast(setting)->GetValue(); + else if (settingId == SETTING_TMR_DAY) { - m_bFullTextEpgSearch = static_cast(setting)->GetValue(); - } - else if (settingId == SETTING_TMR_CHANNEL) - { - int idx = static_cast(setting)->GetValue(); - const auto it = m_channelEntries.find(idx); - if (it != m_channelEntries.end()) - { - m_channel = it->second; - } + m_tmp_day = static_cast(setting)->GetValue(); + + if (m_tmp_day <= 10) + SetTimerFromWeekdaySetting(*tag); else { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::OnSettingChanged - Unable to get 'type' value"); + CDateTime time = CDateTime::GetCurrentDateTime(); + CDateTime timestart = m_timerStartTime; + CDateTime timestop = m_timerEndTime; + int m_tmp_diff; + + // get diffence of timer in days between today and timer start date + tm time_cur; time.GetAsTm(time_cur); + tm time_tmr; timestart.GetAsTm(time_tmr); + + m_tmp_diff = time_tmr.tm_yday - time_cur.tm_yday; + if (time_tmr.tm_yday - time_cur.tm_yday < 0) + m_tmp_diff = 365; + + CDateTime newStart = timestart + CDateTimeSpan(m_tmp_day - 11 - m_tmp_diff, 0, 0, 0); + CDateTime newEnd = timestop + CDateTimeSpan(m_tmp_day - 11 - m_tmp_diff, 0, 0, 0); + + // add a day to end time if end time is before start time + // TODO: this should be removed after separate end date control was added + if (newEnd < newStart) + newEnd += CDateTimeSpan(1, 0, 0, 0); + + tag->SetStartFromLocalTime(newStart); + tag->SetEndFromLocalTime(newEnd); + + tag->m_bIsRepeating = false; + tag->m_iWeekdays = 0; } } - else if (settingId == SETTING_TMR_WEEKDAYS) - { - m_iWeekdays = GetWeekdaysFromSetting(setting); - } - else if (settingId == SETTING_TMR_START_ANYTIME) - { - m_bStartAnyTime = static_cast(setting)->GetValue(); - } - else if (settingId == SETTING_TMR_END_ANYTIME) - { - m_bEndAnyTime = static_cast(setting)->GetValue(); - } - else if (settingId == SETTING_TMR_START_DAY) - { - SetDateFromIndex(m_startLocalTime, static_cast(setting)->GetValue()); - } - else if (settingId == SETTING_TMR_END_DAY) - { - SetDateFromIndex(m_endLocalTime, static_cast(setting)->GetValue()); - } - else if (settingId == SETTING_TMR_FIRST_DAY) - { - SetDateFromIndex(m_firstDayLocalTime, static_cast(setting)->GetValue()); - } - else if (settingId == SETTING_TMR_NEW_EPISODES) - { - m_iPreventDupEpisodes = static_cast(setting)->GetValue(); - } - else if (settingId == SETTING_TMR_BEGIN_PRE) - { - m_iMarginStart = static_cast(setting)->GetValue(); - } - else if (settingId == SETTING_TMR_END_POST) - { - m_iMarginEnd = static_cast(setting)->GetValue(); - } else if (settingId == SETTING_TMR_PRIORITY) - { - m_iPriority = static_cast(setting)->GetValue(); - } + tag->m_iPriority = static_cast(setting)->GetValue(); else if (settingId == SETTING_TMR_LIFETIME) + tag->m_iLifetime = static_cast(setting)->GetValue(); + else if (settingId == SETTING_TMR_FIRST_DAY) { - m_iLifetime = static_cast(setting)->GetValue(); - } - else if (settingId == SETTING_TMR_MAX_REC) - { - m_iMaxRecordings = static_cast(setting)->GetValue(); + m_tmp_iFirstDay = static_cast(setting)->GetValue(); + + CDateTime newFirstDay; + if (m_tmp_iFirstDay > 0) + newFirstDay = CDateTime::GetCurrentDateTime() + CDateTimeSpan(m_tmp_iFirstDay - 1, 0, 0, 0); + + tag->SetFirstDayFromLocalTime(newFirstDay); } + else if (settingId == SETTING_TMR_NAME) + tag->m_strTitle = static_cast(setting)->GetValue(); else if (settingId == SETTING_TMR_DIR) - { - m_strDirectory = static_cast(setting)->GetValue(); - } - else if (settingId == SETTING_TMR_REC_GROUP) - { - m_iRecordingGroup = static_cast(setting)->GetValue(); - } + tag->m_strDirectory = static_cast(setting)->GetValue(); + + tag->UpdateSummary(); } void CGUIDialogPVRTimerSettings::OnSettingAction(const CSetting *setting) { if (setting == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::OnSettingAction - No setting"); return; - } CGUIDialogSettingsManualBase::OnSettingAction(setting); + CPVRTimerInfoTagPtr tag = m_timerItem->GetPVRTimerInfoTag(); + if (tag == NULL) + return; + const std::string &settingId = setting->GetId(); if (settingId == SETTING_TMR_BEGIN) { - SYSTEMTIME timerStartTime; - m_startLocalTime.GetAsSystemTime(timerStartTime); - if (CGUIDialogNumeric::ShowAndGetTime(timerStartTime, g_localizeStrings.Get(14066))) + if (CGUIDialogNumeric::ShowAndGetTime(m_timerStartTime, g_localizeStrings.Get(14066))) { - SetTimeFromSystemTime(m_startLocalTime, timerStartTime); - m_timerStartTimeStr = m_startLocalTime.GetAsLocalizedTime("", false); - SetButtonLabels(); + CDateTime timestart = m_timerStartTime; + int start_day = tag->StartAsLocalTime().GetDay(); + int start_month = tag->StartAsLocalTime().GetMonth(); + int start_year = tag->StartAsLocalTime().GetYear(); + int start_hour = timestart.GetHour(); + int start_minute = timestart.GetMinute(); + CDateTime newStart(start_year, start_month, start_day, start_hour, start_minute, 0); + tag->SetStartFromLocalTime(newStart); + + m_timerStartTimeStr = tag->StartAsLocalTime().GetAsLocalizedTime("", false); + setButtonLabels(); } } else if (settingId == SETTING_TMR_END) { - SYSTEMTIME timerEndTime; - m_endLocalTime.GetAsSystemTime(timerEndTime); - if (CGUIDialogNumeric::ShowAndGetTime(timerEndTime, g_localizeStrings.Get(14066))) + if (CGUIDialogNumeric::ShowAndGetTime(m_timerEndTime, g_localizeStrings.Get(14066))) { - SetTimeFromSystemTime(m_endLocalTime, timerEndTime); - m_timerEndTimeStr = m_endLocalTime.GetAsLocalizedTime("", false); - SetButtonLabels(); - } - } -} - -void CGUIDialogPVRTimerSettings::Save() -{ - // Timer type - m_timerInfoTag->SetTimerType(m_timerType); - - // Timer active/inactive - m_timerInfoTag->m_state = m_bTimerActive ? PVR_TIMER_STATE_SCHEDULED : PVR_TIMER_STATE_DISABLED; - - // Name - m_timerInfoTag->m_strTitle = m_strTitle; - - // epg search string (only for epg-based repeating timers) - m_timerInfoTag->m_strEpgSearchString = m_strEpgSearchString; - - // epg fulltext search, instead of just title match. (only for epg-based repeating timers) - m_timerInfoTag->m_bFullTextEpgSearch = m_bFullTextEpgSearch; - - // Channel - CPVRChannelPtr channel(g_PVRChannelGroups->GetByUniqueID(m_channel.channelUid, m_channel.clientId)); - if (channel) - { - m_timerInfoTag->m_iClientChannelUid = channel->UniqueID(); - m_timerInfoTag->m_iClientId = channel->ClientID(); - m_timerInfoTag->m_bIsRadio = channel->IsRadio(); - m_timerInfoTag->m_iChannelNumber = channel->ChannelNumber(); + CDateTime timestop = m_timerEndTime; + // TODO: add separate end date control to schedule a show with more then 24 hours + int start_day = tag->StartAsLocalTime().GetDay(); + int start_month = tag->StartAsLocalTime().GetMonth(); + int start_year = tag->StartAsLocalTime().GetYear(); + int start_hour = timestop.GetHour(); + int start_minute = timestop.GetMinute(); + CDateTime newEnd(start_year, start_month, start_day, start_hour, start_minute, 0); - m_timerInfoTag->UpdateChannel(); - } - else - { - if (m_timerType->IsOnetime() || m_timerType->IsManual()) - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::Save - No channel"); + // add a day to end time if end time is before start time + // TODO: this should be removed after separate end date control was added + if (newEnd < tag->StartAsLocalTime()) + newEnd += CDateTimeSpan(1, 0, 0, 0); - m_timerInfoTag->m_iClientChannelUid = m_channel.channelUid; - m_timerInfoTag->m_iClientId = m_timerType->GetClientId(); - } + tag->SetEndFromLocalTime(newEnd); - if (m_timerType->SupportsStartAnyTime() && m_timerType->IsEpgBased()) // Start anytime toggle is displayed - m_timerInfoTag->m_bStartAnyTime = m_bStartAnyTime; - else - m_bStartAnyTime = false; // Assume start time change needs checking for - if (m_timerType->SupportsEndAnyTime() && m_timerType->IsEpgBased()) // End anytime toggle is displayed - m_timerInfoTag->m_bEndAnyTime = m_bEndAnyTime; - else - m_bEndAnyTime = false; // Assume end time change needs checking for - // Begin and end time - const CDateTime now(CDateTime::GetCurrentDateTime()); - if (!m_bStartAnyTime && !m_bEndAnyTime) - { - if (m_timerType->SupportsStartTime() && // has start clock entry - m_timerType->SupportsEndTime() && // and end clock entry - m_timerType->IsRepeating()) // but no associated start/end day spinners - { - if (m_endLocalTime < m_startLocalTime) // And the end clock is earlier than the start clock - { - CLog::Log(LOGDEBUG, "CGUIDialogPVRTimerSettings::Save - End before start, adding a day."); - m_endLocalTime += CDateTimeSpan(1, 0, 0, 0); - if (m_endLocalTime < m_startLocalTime) - { - CLog::Log(LOGWARNING, "CGUIDialogPVRTimerSettings::Save - End before start. Setting end time to start time."); - m_endLocalTime = m_startLocalTime; - } - } - else if (m_endLocalTime > (m_startLocalTime + CDateTimeSpan(1, 0, 0, 0))) // Or the duration is more than a day - { - CLog::Log(LOGDEBUG, "CGUIDialogPVRTimerSettings::Save - End > 1 day after start, removing a day."); - m_endLocalTime -= CDateTimeSpan(1, 0, 0, 0); - if (m_endLocalTime > (m_startLocalTime + CDateTimeSpan(1, 0, 0, 0))) - { - CLog::Log(LOGWARNING, "CGUIDialogPVRTimerSettings::Save - End > 1 day after start. Setting end time to start time."); - m_endLocalTime = m_startLocalTime; - } - } - } - else if (m_endLocalTime < m_startLocalTime) // Assume the user knows what they are doing, but log a warning just in case - { - CLog::Log(LOGWARNING, "CGUIDialogPVRTimerSettings::Save - Specified recording end time < start time: expect errors!"); + m_timerEndTimeStr = tag->EndAsLocalTime().GetAsLocalizedTime("", false); + setButtonLabels(); } - m_timerInfoTag->SetStartFromLocalTime(m_startLocalTime); - m_timerInfoTag->SetEndFromLocalTime(m_endLocalTime); - } - else if (!m_bStartAnyTime) - m_timerInfoTag->SetStartFromLocalTime(m_startLocalTime); - else if (!m_bEndAnyTime) - m_timerInfoTag->SetEndFromLocalTime(m_endLocalTime); - - // Days of week (only for repeating timers) - if (m_timerType->IsRepeating()) - m_timerInfoTag->m_iWeekdays = m_iWeekdays; - else - m_timerInfoTag->m_iWeekdays = PVR_WEEKDAY_NONE; - - // First day (only for repeating timers) - m_timerInfoTag->SetFirstDayFromLocalTime(m_firstDayLocalTime); - - // "New episodes only" (only for repeating timers) - m_timerInfoTag->m_iPreventDupEpisodes = m_iPreventDupEpisodes; - - // Pre and post record time - m_timerInfoTag->m_iMarginStart = m_iMarginStart; - m_timerInfoTag->m_iMarginEnd = m_iMarginEnd; - - // Priority - m_timerInfoTag->m_iPriority = m_iPriority; - - // Lifetime - m_timerInfoTag->m_iLifetime = m_iLifetime; - - // MaxRecordings - m_timerInfoTag->m_iMaxRecordings = m_iMaxRecordings; - - // Recording folder - m_timerInfoTag->m_strDirectory = m_strDirectory; - - // Recording group - m_timerInfoTag->m_iRecordingGroup = m_iRecordingGroup; - - // Set the timer's title to the channel name if it's empty or 'New Timer' - if (channel && (m_strTitle.empty() || m_strTitle == g_localizeStrings.Get(19056))) - m_timerInfoTag->m_strTitle = channel->ChannelName(); - - // Update summary - m_timerInfoTag->UpdateSummary(); -} - -void CGUIDialogPVRTimerSettings::SetButtonLabels() -{ - // timer start time - BaseSettingControlPtr settingControl = GetSettingControl(SETTING_TMR_BEGIN); - if (settingControl != NULL && settingControl->GetControl() != NULL) - { - SET_CONTROL_LABEL2(settingControl->GetID(), m_timerStartTimeStr); - } - - // timer end time - settingControl = GetSettingControl(SETTING_TMR_END); - if (settingControl != NULL && settingControl->GetControl() != NULL) - { - SET_CONTROL_LABEL2(settingControl->GetID(), m_timerEndTimeStr); } -} - -void CGUIDialogPVRTimerSettings::AddCondition( - CSetting *setting, const std::string &identifier, SettingConditionCheck condition, - SettingDependencyType depType, const std::string &settingId) -{ - m_settingsManager->AddCondition(identifier, condition, this); - CSettingDependency dep(depType, m_settingsManager); - dep.And()->Add( - CSettingDependencyConditionPtr( - new CSettingDependencyCondition(identifier, "true", settingId, false, m_settingsManager))); - SettingDependencies deps(setting->GetDependencies()); - deps.push_back(dep); - setting->SetDependencies(deps); -} - -int CGUIDialogPVRTimerSettings::GetDateAsIndex(const CDateTime &datetime) -{ - const CDateTime date(datetime.GetYear(), datetime.GetMonth(), datetime.GetDay(), 0, 0, 0); - time_t t(0); - date.GetAsTime(t); - return static_cast(t); -} - -void CGUIDialogPVRTimerSettings::SetDateFromIndex(CDateTime &datetime, int date) -{ - const CDateTime newDate(static_cast(date)); - datetime.SetDateTime( - newDate.GetYear(), newDate.GetMonth(), newDate.GetDay(), - datetime.GetHour(), datetime.GetMinute(), datetime.GetSecond()); -} -void CGUIDialogPVRTimerSettings::SetTimeFromSystemTime(CDateTime &datetime, const SYSTEMTIME &time) -{ - const CDateTime newTime(time); - datetime.SetDateTime( - datetime.GetYear(), datetime.GetMonth(), datetime.GetDay(), - newTime.GetHour(), newTime.GetMinute(), newTime.GetSecond()); + tag->UpdateSummary(); } -void CGUIDialogPVRTimerSettings::InitializeTypesList() +void CGUIDialogPVRTimerSettings::Save() { - m_typeEntries.clear(); + CPVRTimerInfoTagPtr tag = m_timerItem->GetPVRTimerInfoTag(); - int idx = 0; - const std::vector types(CPVRTimerType::GetAllTypes()); - for (const auto &type : types) + // Set the timer's channel + std::map, int>::iterator itc = m_channelEntries.find(std::make_pair(tag->m_bIsRadio, m_selectedChannelEntry)); + if (itc != m_channelEntries.end()) { - if (m_bIsNewTimer) + CPVRChannelPtr channel = g_PVRChannelGroups->GetChannelById(itc->second); + if (channel) { - // Type definition prohibits created of new instances. - // But the dialog can act as a viewer for these types. (m_bIsNewTimer is false in this case) - if (type->ForbidsNewInstances()) - continue; - - // Read-only timers cannot be created using this dialog. - // But the dialog can act as a viewer for read-only types (m_bIsNewTimer is false in this case) - if (type->IsReadOnly()) - continue; - - // Drop TimerTypes that require EPGInfo, if none is populated - if (type->RequiresEpgTagOnCreate() && !m_timerInfoTag->HasEpgInfoTag()) - continue; - - // Drop TimerTypes without 'Series' EPG attributes if none are set - if (type->RequiresEpgSeriesOnCreate() && !m_timerInfoTag->HasSeriesEpgInfoTag()) - continue; - - // Drop TimerTypes that forbid EPGInfo, if it is populated - if (type->ForbidsEpgTagOnCreate() && m_timerInfoTag->HasEpgInfoTag()) - continue; - } + tag->m_iClientChannelUid = channel->UniqueID(); + tag->m_iClientId = channel->ClientID(); + tag->m_bIsRadio = channel->IsRadio(); + tag->m_iChannelNumber = channel->ChannelNumber(); - m_typeEntries.insert(std::make_pair(idx++, type)); + // Update channel pointer from above values + tag->UpdateChannel(); + } } -} - -void CGUIDialogPVRTimerSettings::InitializeChannelsList() -{ - m_channelEntries.clear(); - - CFileItemList channelsList; - g_PVRChannelGroups->GetGroupAll(m_bIsRadio)->GetMembers(channelsList); - for (int i = 0; i < channelsList.Size(); ++i) + // Set the timer's title to the channel name if it's 'New Timer' or empty + if (tag->m_strTitle == g_localizeStrings.Get(19056) || tag->m_strTitle.empty()) { - const CPVRChannelPtr channel(channelsList[i]->GetPVRChannelInfoTag()); - std::string channelDescription( - StringUtils::Format("%i %s", channel->ChannelNumber(), channel->ChannelName().c_str())); - m_channelEntries.insert( - std::make_pair(i, ChannelDescriptor(channel->UniqueID(), channel->ClientID(), channelDescription))); + CPVRChannelPtr channel = g_PVRChannelGroups->GetByUniqueID(tag->m_iClientChannelUid, tag->m_iClientId); + if (channel) + tag->m_strTitle = channel->ChannelName(); } - // Add special "any channel" entry (used for epg-based repeating timers). - m_channelEntries.insert( - std::make_pair( - ENTRY_ANY_CHANNEL, ChannelDescriptor(PVR_INVALID_CHANNEL_UID, 0, g_localizeStrings.Get(809)))); -} - -void CGUIDialogPVRTimerSettings::TypesFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) -{ - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis) - { - list.clear(); - current = 0; - - bool foundCurrent(false); - for (const auto &typeEntry : pThis->m_typeEntries) - { - list.push_back(std::make_pair(typeEntry.second->GetDescription(), typeEntry.first)); - - if (!foundCurrent && (*(pThis->m_timerType) == *(typeEntry.second))) - { - current = typeEntry.first; - foundCurrent = true; - } - } - } + if (m_bTimerActive) + tag->m_state = PVR_TIMER_STATE_SCHEDULED; else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::TypesFiller - No dialog"); + tag->m_state = PVR_TIMER_STATE_CANCELLED; } -void CGUIDialogPVRTimerSettings::ChannelsFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) +void CGUIDialogPVRTimerSettings::SetupView() { - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis) - { - list.clear(); - current = 0; + CGUIDialogSettingsManualBase::SetupView(); - bool foundCurrent(false); - for (const auto &channelEntry : pThis->m_channelEntries) - { - if (channelEntry.first == ENTRY_ANY_CHANNEL) - { - // For repeating epg-based timers only, add an "any channel" entry. - if (pThis->m_timerType->IsRepeatingEpgBased()) - list.push_back(std::make_pair(channelEntry.second.description, channelEntry.first)); - else - continue; - } - else - { - // Only include channels supplied by the currently active PVR client. - if (channelEntry.second.clientId == pThis->m_timerType->GetClientId()) - list.push_back(std::make_pair(channelEntry.second.description, channelEntry.first)); - } - - if (!foundCurrent && (pThis->m_channel == channelEntry.second)) - { - current = channelEntry.first; - foundCurrent = true; - } - } - } - else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::ChannelsFiller - No dialog"); + setButtonLabels(); } -void CGUIDialogPVRTimerSettings::DaysFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) +void CGUIDialogPVRTimerSettings::InitializeSettings() { - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis) - { - list.clear(); - current = 0; - - // Data range: "today" until "yesterday next year" - const CDateTime now(CDateTime::GetCurrentDateTime()); - CDateTime time(now.GetYear(), now.GetMonth(), now.GetDay(), 0, 0, 0); - const CDateTime yesterdayPlusOneYear( - time.GetYear() + 1, time.GetMonth(), time.GetDay() - 1, time.GetHour(), time.GetMinute(), time.GetSecond()); - - CDateTime oldCDateTime; - if (setting->GetId() == SETTING_TMR_FIRST_DAY) - oldCDateTime = pThis->m_timerInfoTag->FirstDayAsLocalTime(); - else if (setting->GetId() == SETTING_TMR_START_DAY) - oldCDateTime = pThis->m_timerInfoTag->StartAsLocalTime(); - else - oldCDateTime = pThis->m_timerInfoTag->EndAsLocalTime(); - const CDateTime oldCDate(oldCDateTime.GetYear(), oldCDateTime.GetMonth(), oldCDateTime.GetDay(), 0, 0, 0); - - if ((oldCDate < time) || (oldCDate > yesterdayPlusOneYear)) - list.push_back(std::make_pair(oldCDate.GetAsLocalizedDate(true /*long date*/), GetDateAsIndex(oldCDate))); - - while (time <= yesterdayPlusOneYear) - { - list.push_back(std::make_pair(time.GetAsLocalizedDate(true /*long date*/), GetDateAsIndex(time))); - time += CDateTimeSpan(1, 0, 0, 0); - } + CGUIDialogSettingsManualBase::InitializeSettings(); - if (setting->GetId() == SETTING_TMR_FIRST_DAY) - current = GetDateAsIndex(pThis->m_firstDayLocalTime); - else if (setting->GetId() == SETTING_TMR_START_DAY) - current = GetDateAsIndex(pThis->m_startLocalTime); - else - current = GetDateAsIndex(pThis->m_endLocalTime); + CSettingCategory *category = AddCategory("pvrtimersettings", -1); + if (category == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings: unable to setup settings"); + return; } - else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::DaysFiller - No dialog"); -} -void CGUIDialogPVRTimerSettings::DupEpisodesFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) -{ - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis) + CSettingGroup *group = AddGroup(category); + if (group == NULL) { - list.clear(); - pThis->m_timerType->GetPreventDuplicateEpisodesValues(list); - current = pThis->m_iPreventDupEpisodes; + CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings: unable to setup settings"); + return; } - else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::DupEpisodesFiller - No dialog"); -} -void CGUIDialogPVRTimerSettings::WeekdaysFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) -{ - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis) - { - list.clear(); - list.push_back(std::make_pair(g_localizeStrings.Get(831), PVR_WEEKDAY_MONDAY)); // "Mondays" - list.push_back(std::make_pair(g_localizeStrings.Get(832), PVR_WEEKDAY_TUESDAY)); // "Tuesdays" - list.push_back(std::make_pair(g_localizeStrings.Get(833), PVR_WEEKDAY_WEDNESDAY)); // "Wednesdays" - list.push_back(std::make_pair(g_localizeStrings.Get(834), PVR_WEEKDAY_THURSDAY)); // "Thursdays" - list.push_back(std::make_pair(g_localizeStrings.Get(835), PVR_WEEKDAY_FRIDAY)); // "Fridays" - list.push_back(std::make_pair(g_localizeStrings.Get(836), PVR_WEEKDAY_SATURDAY)); // "Saturdays" - list.push_back(std::make_pair(g_localizeStrings.Get(837), PVR_WEEKDAY_SUNDAY)); // "Sundays" + // add a condition + m_settingsManager->AddCondition("IsTimerDayRepeating", IsTimerDayRepeating); - current = pThis->m_iWeekdays; - } - else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::WeekdaysFiller - No dialog"); -} + CPVRTimerInfoTagPtr tag = m_timerItem->GetPVRTimerInfoTag(); -void CGUIDialogPVRTimerSettings::PrioritiesFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) -{ - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis) - { - list.clear(); - pThis->m_timerType->GetPriorityValues(list); - current = pThis->m_iPriority; + m_selectedChannelEntry = 0; + m_channelEntries.clear(); + m_bTimerActive = tag->IsActive(); - auto it = list.begin(); - while (it != list.end()) - { - if (it->second == current) - break; // value already in list + AddToggle(group, SETTING_TMR_ACTIVE, 19074, 0, m_bTimerActive); + AddEdit(group, SETTING_TMR_NAME, 19075, 0, tag->m_strTitle, false, false, 19097); - ++it; - } + if (tag->SupportsFolders()) + AddEdit(group, SETTING_TMR_DIR, 19076, 0, tag->m_strDirectory, true, false, 19104); - if (it == list.end()) - { - // PVR backend supplied value is not in the list of predefined values. Insert it. - list.insert(it, std::make_pair(StringUtils::Format("%d", current), current)); - } + /// Channel names + { + AddChannelNames(group, tag->m_bIsRadio); } - else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::PrioritiesFiller - No dialog"); -} -void CGUIDialogPVRTimerSettings::LifetimesFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) -{ - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis) + /// Day { - list.clear(); - pThis->m_timerType->GetLifetimeValues(list); - current = pThis->m_iLifetime; + // get diffence of timer in days between today and timer start date + tm time_cur; CDateTime::GetCurrentDateTime().GetAsTm(time_cur); + tm time_tmr; tag->StartAsLocalTime().GetAsTm(time_tmr); - auto it = list.begin(); - while (it != list.end()) - { - if (it->second == current) - break; // value already in list + m_tmp_day += time_tmr.tm_yday - time_cur.tm_yday; + if (time_tmr.tm_yday - time_cur.tm_yday < 0) + m_tmp_day += 365; - ++it; - } + SetWeekdaySettingFromTimer(*tag); - if (it == list.end()) - { - // PVR backend supplied value is not in the list of predefined values. Insert it. - list.insert(it, std::make_pair(StringUtils::Format(g_localizeStrings.Get(17999).c_str(), current) /* %i days */, current)); - } + AddSpinner(group, SETTING_TMR_DAY, 19079, 0, m_tmp_day, DaysOptionsFiller); } - else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::LifetimesFiller - No dialog"); -} -void CGUIDialogPVRTimerSettings::MaxRecordingsFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) -{ - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis) + AddButton(group, SETTING_TMR_BEGIN, 19080, 0); + AddButton(group, SETTING_TMR_END, 19081, 0); + AddSpinner(group, SETTING_TMR_PRIORITY, 19082, 0, tag->m_iPriority, 0, 1, 99); + AddSpinner(group, SETTING_TMR_LIFETIME, 19083, 0, tag->m_iLifetime, 0, 1, 365); + + /// First day { - list.clear(); - pThis->m_timerType->GetMaxRecordingsValues(list); - current = pThis->m_iMaxRecordings; + CDateTime time = CDateTime::GetCurrentDateTime(); + CDateTime timestart = tag->FirstDayAsLocalTime(); - auto it = list.begin(); - while (it != list.end()) + // get diffence of timer in days between today and timer start date + if (time < timestart) { - if (it->second == current) - break; // value already in list + tm time_cur; time.GetAsTm(time_cur); + tm time_tmr; timestart.GetAsTm(time_tmr); - ++it; + m_tmp_iFirstDay += time_tmr.tm_yday - time_cur.tm_yday + 1; + if (time_tmr.tm_yday - time_cur.tm_yday < 0) + m_tmp_iFirstDay += 365; } - if (it == list.end()) - { - // PVR backend supplied value is not in the list of predefined values. Insert it. - list.insert(it, std::make_pair(StringUtils::Format("%d", current), current)); - } - } - else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::MaxRecordingsFiller - No dialog"); -} + CSettingInt *settingFirstDay = AddSpinner(group, SETTING_TMR_FIRST_DAY, 19084, 0, m_tmp_iFirstDay, DaysOptionsFiller); -void CGUIDialogPVRTimerSettings::RecordingGroupFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) -{ - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis) - { - list.clear(); - pThis->m_timerType->GetRecordingGroupValues(list); - current = pThis->m_iRecordingGroup; + // define an enable dependency with m_tmp_day <= 10 + CSettingDependency depdendencyFirstDay(SettingDependencyTypeEnable, m_settingsManager); + depdendencyFirstDay.And() + ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition("IsTimerDayRepeating", "true", SETTING_TMR_DAY, false, m_settingsManager))); + SettingDependencies deps; + deps.push_back(depdendencyFirstDay); + settingFirstDay->SetDependencies(deps); } - else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::RecordingGroupFiller - No dialog"); } -void CGUIDialogPVRTimerSettings::MarginTimeFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) +CSetting* CGUIDialogPVRTimerSettings::AddChannelNames(CSettingGroup *group, bool bRadio) { - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis) - { - list.clear(); + std::vector< std::pair > options; + getChannelNames(bRadio, options, m_selectedChannelEntry, true); - // Get global settings values - CPVRSettings::MarginTimeFiller(setting, list, current, data); + // select the correct channel + int timerChannelID = 0; + if (m_timerItem->GetPVRTimerInfoTag()->ChannelTag()) + timerChannelID = m_timerItem->GetPVRTimerInfoTag()->ChannelTag()->ChannelID(); - if (setting->GetId() == SETTING_TMR_BEGIN_PRE) - current = pThis->m_iMarginStart; - else - current = pThis->m_iMarginEnd; - - bool bInsertValue = true; - auto it = list.begin(); - while (it != list.end()) - { - if (it->second == current) - { - bInsertValue = false; - break; // value already in list - } - - if (it->second > current) - break; - - ++it; - } - - if (bInsertValue) + for (std::vector< std::pair >::const_iterator option = options.begin(); option != options.end(); ++option) + { + std::map, int>::const_iterator channelEntry = m_channelEntries.find(std::make_pair(bRadio, option->second)); + if (channelEntry != m_channelEntries.end() && channelEntry->second == timerChannelID) { - // PVR backend supplied value is not in the list of predefined values. Insert it. - list.insert(it, std::make_pair(StringUtils::Format(g_localizeStrings.Get(14044).c_str(), current) /* %i min */, current)); + m_selectedChannelEntry = option->second; + break; } } - else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::MarginTimeFiller - No dialog"); -} -std::string CGUIDialogPVRTimerSettings::WeekdaysValueFormatter(const CSetting *setting) -{ - return CPVRTimerInfoTag::GetWeekdaysString(GetWeekdaysFromSetting(setting), true, true); -} + CSettingInt *setting = AddSpinner(group, SETTING_TMR_CHNAME, 19078, 0, m_selectedChannelEntry, ChannelNamesOptionsFiller); + if (setting == NULL) + return NULL; -void CGUIDialogPVRTimerSettings::AddTypeDependentEnableCondition(CSetting *setting, const std::string &identifier) -{ - // Enable setting depending on read-only attribute of the selected timer type - std::string id(identifier); - id.append(TYPE_DEP_ENABLE_COND_ID_POSTFIX); - AddCondition(setting, id, TypeReadOnlyCondition, SettingDependencyTypeEnable, SETTING_TMR_TYPE); + return setting; } -bool CGUIDialogPVRTimerSettings::TypeReadOnlyCondition(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +void CGUIDialogPVRTimerSettings::SetWeekdaySettingFromTimer(const CPVRTimerInfoTag &timer) { - if (setting == NULL) - return false; - - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::TypeReadOnlyCondition - No dialog"); - return false; - } - - if (!StringUtils::EqualsNoCase(value, "true")) - return false; - - std::string cond(condition); - cond.erase(cond.find(TYPE_DEP_ENABLE_COND_ID_POSTFIX)); - - // For existing timers, disable type selector (view/edit of existing timer). - if (!pThis->m_bIsNewTimer) - { - if (cond == SETTING_TMR_TYPE) - return false; - } - - // If only one type is available, disable type selector. - if (pThis->m_typeEntries.size() == 1) - { - if (cond == SETTING_TMR_TYPE) - return false; - } - - // For existing one time epg-based timers, disable editing of epg-filled data. - if (!pThis->m_bIsNewTimer && pThis->m_timerType->IsOnetimeEpgBased()) + if (timer.m_bIsRepeating) { - if ((cond == SETTING_TMR_NAME) || - (cond == SETTING_TMR_CHANNEL) || - (cond == SETTING_TMR_START_DAY) || - (cond == SETTING_TMR_END_DAY) || - (cond == SETTING_TMR_BEGIN) || - (cond == SETTING_TMR_END)) - return false; - } - - /* Always enable enable/disable, if supported by the timer type. */ - if (pThis->m_timerType->SupportsEnableDisable()) - { - if (cond == SETTING_TMR_ACTIVE) - return true; - } - - // Let the PVR client decide... - int idx = static_cast(setting)->GetValue(); - const auto entry = pThis->m_typeEntries.find(idx); - if (entry != pThis->m_typeEntries.end()) - return !entry->second->IsReadOnly(); + if (timer.m_iWeekdays == 0x01) + m_tmp_day = 0; + else if (timer.m_iWeekdays == 0x02) + m_tmp_day = 1; + else if (timer.m_iWeekdays == 0x04) + m_tmp_day = 2; + else if (timer.m_iWeekdays == 0x08) + m_tmp_day = 3; + else if (timer.m_iWeekdays == 0x10) + m_tmp_day = 4; + else if (timer.m_iWeekdays == 0x20) + m_tmp_day = 5; + else if (timer.m_iWeekdays == 0x40) + m_tmp_day = 6; + else if (timer.m_iWeekdays == 0x1F) + m_tmp_day = 7; + else if (timer.m_iWeekdays == 0x3F) + m_tmp_day = 8; + else if (timer.m_iWeekdays == 0x7F) + m_tmp_day = 9; + else if (timer.m_iWeekdays == 0x60) + m_tmp_day = 10; + } +} + +void CGUIDialogPVRTimerSettings::SetTimerFromWeekdaySetting(CPVRTimerInfoTag &timer) +{ + timer.m_bIsRepeating = true; + + if (m_tmp_day == 0) + timer.m_iWeekdays = 0x01; + else if (m_tmp_day == 1) + timer.m_iWeekdays = 0x02; + else if (m_tmp_day == 2) + timer.m_iWeekdays = 0x04; + else if (m_tmp_day == 3) + timer.m_iWeekdays = 0x08; + else if (m_tmp_day == 4) + timer.m_iWeekdays = 0x10; + else if (m_tmp_day == 5) + timer.m_iWeekdays = 0x20; + else if (m_tmp_day == 6) + timer.m_iWeekdays = 0x40; + else if (m_tmp_day == 7) + timer.m_iWeekdays = 0x1F; + else if (m_tmp_day == 8) + timer.m_iWeekdays = 0x3F; + else if (m_tmp_day == 9) + timer.m_iWeekdays = 0x7F; + else if (m_tmp_day == 10) + timer.m_iWeekdays = 0x60; else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::TypeReadOnlyCondition - No type entry"); - - return false; + timer.m_iWeekdays = 0; } -void CGUIDialogPVRTimerSettings::AddTypeDependentVisibilityCondition(CSetting *setting, const std::string &identifier) +void CGUIDialogPVRTimerSettings::getChannelNames(bool bRadio, std::vector< std::pair > &list, int ¤t, bool updateChannelEntries /* = false */) { - // Show or hide setting depending on attributes of the selected timer type - std::string id(identifier); - id.append(TYPE_DEP_VISIBI_COND_ID_POSTFIX); - AddCondition(setting, id, TypeSupportsCondition, SettingDependencyTypeVisible, SETTING_TMR_TYPE); -} - -bool CGUIDialogPVRTimerSettings::TypeSupportsCondition(const std::string &condition, const std::string &value, const CSetting *setting, void *data) -{ - if (setting == NULL) - return false; - - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::TypeSupportsCondition - No dialog"); - return false; - } + CFileItemList channelsList; + g_PVRChannelGroups->GetGroupAll(bRadio)->GetMembers(channelsList); - if (!StringUtils::EqualsNoCase(value, "true")) - return false; + int entry = 0; - int idx = static_cast(setting)->GetValue(); - const auto entry = pThis->m_typeEntries.find(idx); - if (entry != pThis->m_typeEntries.end()) + for (int i = 0; i < channelsList.Size(); i++) { - std::string cond(condition); - cond.erase(cond.find(TYPE_DEP_VISIBI_COND_ID_POSTFIX)); + const CPVRChannelPtr channel(channelsList[i]->GetPVRChannelInfoTag()); - if (cond == SETTING_TMR_EPGSEARCH) - return entry->second->SupportsEpgTitleMatch() || entry->second->SupportsEpgFulltextMatch(); - else if (cond == SETTING_TMR_FULLTEXT) - return entry->second->SupportsEpgFulltextMatch(); - else if (cond == SETTING_TMR_ACTIVE) - return entry->second->SupportsEnableDisable(); - else if (cond == SETTING_TMR_CHANNEL) - return entry->second->SupportsChannels(); - else if (cond == SETTING_TMR_START_ANYTIME) - return entry->second->SupportsStartAnyTime() && entry->second->IsEpgBased(); - else if (cond == SETTING_TMR_END_ANYTIME) - return entry->second->SupportsEndAnyTime() && entry->second->IsEpgBased(); - else if (cond == SETTING_TMR_START_DAY) - return entry->second->SupportsStartTime() && entry->second->IsOnetime(); - else if (cond == SETTING_TMR_END_DAY) - return entry->second->SupportsEndTime() && entry->second->IsOnetime(); - else if (cond == SETTING_TMR_BEGIN) - return entry->second->SupportsStartTime(); - else if (cond == SETTING_TMR_END) - return entry->second->SupportsEndTime(); - else if (cond == SETTING_TMR_WEEKDAYS) - return entry->second->SupportsWeekdays(); - else if (cond == SETTING_TMR_FIRST_DAY) - return entry->second->SupportsFirstDay(); - else if (cond == SETTING_TMR_NEW_EPISODES) - return entry->second->SupportsRecordOnlyNewEpisodes(); - else if ((cond == SETTING_TMR_BEGIN_PRE) || - (cond == SETTING_TMR_END_POST)) - return entry->second->SupportsStartEndMargin(); - else if (cond == SETTING_TMR_PRIORITY) - return entry->second->SupportsPriority(); - else if (cond == SETTING_TMR_LIFETIME) - return entry->second->SupportsLifetime(); - else if (cond == SETTING_TMR_MAX_REC) - return entry->second->SupportsMaxRecordings(); - else if (cond == SETTING_TMR_DIR) - return entry->second->SupportsRecordingFolders(); - else if (cond == SETTING_TMR_REC_GROUP) - return entry->second->SupportsRecordingGroup(); - else - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::TypeSupportsCondition - Unknown condition"); - } - else - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::TypeSupportsCondition - No type entry"); + list.push_back(std::make_pair(StringUtils::Format("%i %s", channel->ChannelNumber(), channel->ChannelName().c_str()), entry)); + if (updateChannelEntries) + m_channelEntries.insert(std::make_pair(std::make_pair(bRadio, entry), channel->ChannelID())); + ++entry; } - return false; } -void CGUIDialogPVRTimerSettings::AddStartAnytimeDependentVisibilityCondition(CSetting *setting, const std::string &identifier) +void CGUIDialogPVRTimerSettings::setButtonLabels() { - // Show or hide setting depending on value of setting "any time" - std::string id(identifier); - id.append(START_ANYTIME_DEP_VISIBI_COND_ID_POSTFIX); - AddCondition(setting, id, StartAnytimeSetCondition, SettingDependencyTypeVisible, SETTING_TMR_START_ANYTIME); -} + // timer start time + BaseSettingControlPtr settingControl = GetSettingControl(SETTING_TMR_BEGIN); + if (settingControl != NULL && settingControl->GetControl() != NULL) + SET_CONTROL_LABEL2(settingControl->GetID(), m_timerStartTimeStr); -bool CGUIDialogPVRTimerSettings::StartAnytimeSetCondition(const std::string &condition, const std::string &value, const CSetting *setting, void *data) -{ - if (setting == NULL) - return false; + // timer end time + settingControl = GetSettingControl(SETTING_TMR_END); + if (settingControl != NULL && settingControl->GetControl() != NULL) + SET_CONTROL_LABEL2(settingControl->GetID(), m_timerEndTimeStr); +} - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::AnytimeSetCondition - No dialog"); - return false; - } + bool CGUIDialogPVRTimerSettings::IsTimerDayRepeating(const std::string &condition, const std::string &value, const CSetting *setting) + { + if (setting == NULL || setting->GetType() != SettingTypeInteger) + return false; + + bool result = static_cast(setting)->GetValue() <= 10; + return result == StringUtils::EqualsNoCase(value, "true"); + } - if (!StringUtils::EqualsNoCase(value, "true")) - return false; +void CGUIDialogPVRTimerSettings::ChannelNamesOptionsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) +{ + if (data == NULL) + return; - // "any time" setting is only relevant for epg-based timers. - if (!pThis->m_timerType->IsEpgBased()) - return true; - - // If 'Start anytime' option isn't supported, don't hide start time - if (!pThis->m_timerType->SupportsStartAnyTime()) - return true; + CGUIDialogPVRTimerSettings *dialog = static_cast(data); + if (dialog == NULL) + return; - std::string cond(condition); - cond.erase(cond.find(START_ANYTIME_DEP_VISIBI_COND_ID_POSTFIX)); + const CPVRTimerInfoTagPtr tag = dialog->m_timerItem->GetPVRTimerInfoTag(); + if (tag == NULL) + return; - if ((cond == SETTING_TMR_START_DAY) || - (cond == SETTING_TMR_BEGIN)) - { - bool bAnytime = static_cast(setting)->GetValue(); - return !bAnytime; - } - return false; + dialog->getChannelNames(tag->m_bIsRadio, list, current, false); } -void CGUIDialogPVRTimerSettings::AddEndAnytimeDependentVisibilityCondition(CSetting *setting, const std::string &identifier) +void CGUIDialogPVRTimerSettings::DaysOptionsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) { - // Show or hide setting depending on value of setting "any time" - std::string id(identifier); - id.append(END_ANYTIME_DEP_VISIBI_COND_ID_POSTFIX); - AddCondition(setting, id, EndAnytimeSetCondition, SettingDependencyTypeVisible, SETTING_TMR_END_ANYTIME); -} + if (setting == NULL || data == NULL) + return; -bool CGUIDialogPVRTimerSettings::EndAnytimeSetCondition(const std::string &condition, const std::string &value, const CSetting *setting, void *data) -{ - if (setting == NULL) - return false; + CGUIDialogPVRTimerSettings *dialog = static_cast(data); + if (dialog == NULL) + return; - CGUIDialogPVRTimerSettings *pThis = static_cast(data); - if (pThis == NULL) + const CPVRTimerInfoTagPtr tag = dialog->m_timerItem->GetPVRTimerInfoTag(); + if (tag == NULL) + return; + + if (setting->GetId() == SETTING_TMR_DAY) { - CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::AnytimeSetCondition - No dialog"); - return false; + for (unsigned int iDayPtr = 19086; iDayPtr <= 19096; iDayPtr++) + list.push_back(std::make_pair(g_localizeStrings.Get(iDayPtr), list.size())); } + else if (setting->GetId() == SETTING_TMR_FIRST_DAY) + list.push_back(std::make_pair(g_localizeStrings.Get(19030), 0)); - if (!StringUtils::EqualsNoCase(value, "true")) - return false; - - // "any time" setting is only relevant for epg-based timers. - if (!pThis->m_timerType->IsEpgBased()) - return true; - - // If 'End anytime' option isn't supported, don't hide end time - if (!pThis->m_timerType->SupportsEndAnyTime()) - return true; - - std::string cond(condition); - cond.erase(cond.find(END_ANYTIME_DEP_VISIBI_COND_ID_POSTFIX)); - - if ((cond == SETTING_TMR_END_DAY) || - (cond == SETTING_TMR_END)) + CDateTime time = CDateTime::GetCurrentDateTime(); + for (int i = 1; i < 365; ++i) { - bool bAnytime = static_cast(setting)->GetValue(); - return !bAnytime; + list.push_back(std::make_pair(time.GetAsLocalizedDate(), list.size())); + time += CDateTimeSpan(1, 0, 0, 0); } - return false; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.h kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,35 +19,28 @@ * */ -#include "pvr/channels/PVRChannel.h" // PVR_INVALID_CHANNEL_UID -#include "settings/dialogs/GUIDialogSettingsManualBase.h" - #include -#include -#include -#include + +#include "settings/dialogs/GUIDialogSettingsManualBase.h" class CFileItem; class CSetting; +class CSettingGroup; namespace PVR { class CPVRTimerInfoTag; - typedef std::shared_ptr CPVRTimerInfoTagPtr; - - class CPVRTimerType; - typedef std::shared_ptr CPVRTimerTypePtr; class CGUIDialogPVRTimerSettings : public CGUIDialogSettingsManualBase { public: CGUIDialogPVRTimerSettings(); - virtual ~CGUIDialogPVRTimerSettings(); + virtual ~CGUIDialogPVRTimerSettings() { } void SetTimer(CFileItem *item); protected: - // implementation of ISettingCallback + // implementations of ISettingCallback virtual void OnSettingChanged(const CSetting *setting); virtual void OnSettingAction(const CSetting *setting); @@ -58,114 +51,29 @@ // specialization of CGUIDialogSettingsManualBase virtual void InitializeSettings(); - - private: - void InitializeTypesList(); - void InitializeChannelsList(); - void SetButtonLabels(); - - static int GetDateAsIndex(const CDateTime &datetime); - static void SetDateFromIndex(CDateTime &datetime, int date); - static void SetTimeFromSystemTime(CDateTime &datetime, const SYSTEMTIME &time); - - static int GetWeekdaysFromSetting(const CSetting *setting); - - static void TypesFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - static void ChannelsFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - static void DaysFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - static void DupEpisodesFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - static void WeekdaysFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - static void PrioritiesFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - static void LifetimesFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - static void MaxRecordingsFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - static void RecordingGroupFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - static void MarginTimeFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - - static std::string WeekdaysValueFormatter(const CSetting *setting); - - void AddCondition( - CSetting *setting, const std::string &identifier, SettingConditionCheck condition, - SettingDependencyType depType, const std::string &settingId); - - void AddTypeDependentEnableCondition(CSetting *setting, const std::string &identifier); - static bool TypeReadOnlyCondition( - const std::string &condition, const std::string &value, const CSetting *setting, void *data); - - void AddTypeDependentVisibilityCondition(CSetting *setting, const std::string &identifier); - static bool TypeSupportsCondition( - const std::string &condition, const std::string &value, const CSetting *setting, void *data); - - void AddStartAnytimeDependentVisibilityCondition(CSetting *setting, const std::string &identifier); - static bool StartAnytimeSetCondition( - const std::string &condition, const std::string &value, const CSetting *setting, void *data); - void AddEndAnytimeDependentVisibilityCondition(CSetting *setting, const std::string &identifier); - static bool EndAnytimeSetCondition( - const std::string &condition, const std::string &value, const CSetting *setting, void *data); - - typedef std::map TypeEntriesMap; - - typedef struct ChannelDescriptor - { - int channelUid; - int clientId; - std::string description; - - ChannelDescriptor(int _channelUid = PVR_INVALID_CHANNEL_UID, - int _clientId = -1, - const std::string& _description = "") - : channelUid(_channelUid), - clientId(_clientId), - description(_description) - {} - - inline bool operator ==(const ChannelDescriptor& right) const - { - return (channelUid == right.channelUid && - clientId == right.clientId && - description == right.description); - } - - } ChannelDescriptor; - - typedef std::map ChannelEntriesMap; - - CPVRTimerInfoTagPtr m_timerInfoTag; - TypeEntriesMap m_typeEntries; - ChannelEntriesMap m_channelEntries; - std::string m_timerStartTimeStr; - std::string m_timerEndTimeStr; - - CPVRTimerTypePtr m_timerType; - bool m_bIsRadio; - bool m_bIsNewTimer; - bool m_bTimerActive; - std::string m_strTitle; - std::string m_strEpgSearchString; - bool m_bFullTextEpgSearch; - ChannelDescriptor m_channel; - CDateTime m_startLocalTime; - CDateTime m_endLocalTime; - bool m_bStartAnyTime; - bool m_bEndAnyTime; - unsigned int m_iWeekdays; - CDateTime m_firstDayLocalTime; - unsigned int m_iPreventDupEpisodes; - unsigned int m_iMarginStart; - unsigned int m_iMarginEnd; - int m_iPriority; - int m_iLifetime; - int m_iMaxRecordings; - std::string m_strDirectory; - unsigned int m_iRecordingGroup; + + virtual CSetting* AddChannelNames(CSettingGroup *group, bool bRadio); + virtual void SetWeekdaySettingFromTimer(const CPVRTimerInfoTag &timer); + virtual void SetTimerFromWeekdaySetting(CPVRTimerInfoTag &timer); + + void getChannelNames(bool bRadio, std::vector< std::pair > &list, int ¤t, bool updateChannelEntries = false); + void setButtonLabels(); + + static bool IsTimerDayRepeating(const std::string &condition, const std::string &value, const CSetting *setting); + + static void ChannelNamesOptionsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); + static void DaysOptionsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); + + SYSTEMTIME m_timerStartTime; + SYSTEMTIME m_timerEndTime; + std::string m_timerStartTimeStr; + std::string m_timerEndTimeStr; + int m_tmp_iFirstDay; + int m_tmp_day; + bool m_bTimerActive; + int m_selectedChannelEntry; + std::map, int> m_channelEntries; + + CFileItem *m_timerItem; }; -} // namespace PVR +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/Makefile kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/pvr/dialogs/Makefile 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/dialogs/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -4,7 +4,6 @@ GUIDialogPVRGuideInfo.cpp \ GUIDialogPVRGuideOSD.cpp \ GUIDialogPVRGuideSearch.cpp \ - GUIDialogPVRRadioRDSInfo.cpp \ GUIDialogPVRRecordingInfo.cpp \ GUIDialogPVRTimerSettings.cpp diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/Makefile kodi-15.2~git20151019.1039-final/xbmc/pvr/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/pvr/Makefile 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/Makefile 2015-04-04 00:00:17.000000000 +0000 @@ -1,8 +1,7 @@ SRCS=PVRGUIInfo.cpp \ PVRManager.cpp \ PVRDatabase.cpp \ - PVRActionListener.cpp \ - PVRSettings.cpp + PVRActionListener.cpp LIB=pvr.a diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRActionListener.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRActionListener.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRActionListener.cpp 2016-01-11 16:50:51.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRActionListener.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,12 +18,14 @@ * */ +#include "PVRActionListener.h" + #include "Application.h" -#include "dialogs/GUIDialogNumeric.h" +#include "ApplicationMessenger.h" +#include "input/Key.h" #include "guilib/LocalizeStrings.h" #include "guilib/GUIWindowManager.h" -#include "input/Key.h" -#include "messaging/ApplicationMessenger.h" +#include "dialogs/GUIDialogNumeric.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "utils/log.h" @@ -32,16 +34,13 @@ #include "pvr/PVRManager.h" #include "pvr/channels/PVRChannelGroupsContainer.h" -#include "PVRActionListener.h" - using namespace PVR; -using namespace KODI::MESSAGING; CPVRActionListener::CPVRActionListener() { } -CPVRActionListener &CPVRActionListener::GetInstance() +CPVRActionListener &CPVRActionListener::Get() { static CPVRActionListener instance; return instance; @@ -90,11 +89,6 @@ (g_windowManager.IsWindowActive(WINDOW_FULLSCREEN_VIDEO) || g_windowManager.IsWindowActive(WINDOW_VISUALISATION))) { - // do not consume action if a python modal is the top most dialog - // as a python modal can't return that it consumed the action. - if (g_windowManager.IsPythonWindow(g_windowManager.GetTopMostModalDialogID())) - return false; - if(g_PVRManager.IsPlaying()) { // pvr client addon @@ -112,14 +106,13 @@ if (fileItem && fileItem->HasPVRChannelInfoTag()) { CLog::Log(LOGDEBUG, "%s - switch to channel number %d", __FUNCTION__, fileItem->GetPVRChannelInfoTag()->ChannelNumber()); - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1,static_cast( - new CAction(ACTION_CHANNEL_SWITCH, static_cast(fileItem->GetPVRChannelInfoTag()->ChannelNumber())))); + CApplicationMessenger::Get().SendAction(CAction(ACTION_CHANNEL_SWITCH, (float) fileItem->GetPVRChannelInfoTag()->ChannelNumber()), WINDOW_INVALID, false); } } } else { - int autoCloseTime = CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPLAYBACK_CONFIRMCHANNELSWITCH) ? 0 : g_advancedSettings.m_iPVRNumericChannelSwitchTimeout; + int autoCloseTime = CSettings::Get().GetBool("pvrplayback.confirmchannelswitch") ? 0 : g_advancedSettings.m_iPVRNumericChannelSwitchTimeout; std::string strChannel = StringUtils::Format("%i", action.GetID() - REMOTE_0); if (CGUIDialogNumeric::ShowAndGetNumber(strChannel, g_localizeStrings.Get(19000), autoCloseTime) || autoCloseTime) { @@ -131,16 +124,27 @@ if (!channel || !channel->HasPVRChannelInfoTag()) return false; - CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast( - new CAction(ACTION_CHANNEL_SWITCH, static_cast(iChannelNumber)))); + CApplicationMessenger::Get().SendAction(CAction(ACTION_CHANNEL_SWITCH, (float)iChannelNumber), WINDOW_INVALID, false); } } } } + else + { + // filesystem provider like slingbox etc + int iChannelNumber = -1; + std::string strChannel = StringUtils::Format("%i", action.GetID() - REMOTE_0); + if (CGUIDialogNumeric::ShowAndGetNumber(strChannel, g_localizeStrings.Get(19000))) + iChannelNumber = atoi(strChannel.c_str()); + + if (iChannelNumber > 0) + CApplicationMessenger::Get().SendAction(CAction(ACTION_CHANNEL_SWITCH, (float)iChannelNumber), WINDOW_INVALID, false); + } } return true; } break; } + return false; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRActionListener.h kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRActionListener.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRActionListener.h 2015-11-02 01:00:16.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRActionListener.h 2015-10-19 08:39:16.000000000 +0000 @@ -26,7 +26,7 @@ { public: - static CPVRActionListener &GetInstance(); + static CPVRActionListener &Get(); bool OnAction(const CAction &action); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRDatabase.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRDatabase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRDatabase.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRDatabase.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,19 +19,17 @@ */ #include "PVRDatabase.h" - -#include - #include "dbwrappers/dataset.h" -#include "pvr/addons/PVRClient.h" -#include "pvr/channels/PVRChannelGroupInternal.h" -#include "pvr/channels/PVRChannelGroupsContainer.h" -#include "pvr/PVRManager.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "utils/log.h" #include "utils/StringUtils.h" +#include "PVRManager.h" +#include "channels/PVRChannelGroupsContainer.h" +#include "channels/PVRChannelGroupInternal.h" +#include "addons/PVRClient.h" + using namespace dbiplus; using namespace PVR; using namespace ADDON; @@ -141,7 +139,7 @@ { VECADDONS addons; CAddonDatabase database; - if (database.Open() && CAddonMgr::GetInstance().GetAddons(ADDON_PVRDLL, addons, true)) + if (database.Open() && CAddonMgr::Get().GetAddons(ADDON_PVRDLL, addons, true)) { /** find all old client IDs */ std::string strQuery(PrepareSQL("SELECT idClient, sUid FROM clients")); @@ -235,7 +233,7 @@ { try { - bool bIgnoreEpgDB = CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_IGNOREDBFORCLIENT); + bool bIgnoreEpgDB = CSettings::Get().GetBool("epg.ignoredbforclient"); while (!m_pDS->eof()) { CPVRChannelPtr channel = CPVRChannelPtr(new CPVRChannel()); @@ -562,13 +560,7 @@ for (PVR_CHANNEL_GROUP_MEMBERS::iterator it = group.m_members.begin(); it != group.m_members.end(); ++it) { if (it->second.channel->IsChanged() || it->second.channel->IsNew()) - { - if (Persist(*it->second.channel)) - { - it->second.channel->Persisted(); - bReturn = true; - } - } + bReturn &= Persist(*it->second.channel); } bReturn &= CommitInsertQueries(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRDatabase.h kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRDatabase.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRDatabase.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRDatabase.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,11 +19,10 @@ * */ +#include "PVRManager.h" #include "dbwrappers/Database.h" #include "utils/log.h" -#include "pvr/PVRManager.h" - class CVideoSettings; namespace PVR diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRGUIInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRGUIInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRGUIInfo.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRGUIInfo.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,23 +19,19 @@ */ #include "Application.h" -#include "GUIInfoManager.h" -#include "epg/EpgInfoTag.h" -#include "guiinfo/GUIInfoLabels.h" +#include "PVRGUIInfo.h" #include "guilib/LocalizeStrings.h" -#include "settings/AdvancedSettings.h" -#include "settings/Settings.h" -#include "threads/SingleLock.h" #include "utils/StringUtils.h" - -#include "pvr/PVRManager.h" -#include "pvr/addons/PVRClients.h" +#include "GUIInfoManager.h" +#include "threads/SingleLock.h" +#include "PVRManager.h" +#include "pvr/timers/PVRTimers.h" +#include "pvr/recordings/PVRRecordings.h" #include "pvr/channels/PVRChannel.h" #include "pvr/channels/PVRChannelGroupsContainer.h" -#include "pvr/recordings/PVRRecordings.h" -#include "pvr/timers/PVRTimers.h" - -#include "PVRGUIInfo.h" +#include "epg/EpgInfoTag.h" +#include "settings/AdvancedSettings.h" +#include "settings/Settings.h" using namespace PVR; using namespace EPG; @@ -68,15 +64,10 @@ m_iRecordingTimerAmount = 0; m_iCurrentActiveClient = 0; m_strPlayingClientName .clear(); - m_strBackendName .clear(); - m_strBackendVersion .clear(); - m_strBackendHost .clear(); m_strBackendTimers .clear(); m_strBackendRecordings .clear(); m_strBackendDeletedRecordings .clear(); m_strBackendChannels .clear(); - m_iBackendDiskTotal = 0; - m_iBackendDiskUsed = 0; m_iTimerInfoToggleStart = 0; m_iTimerInfoToggleCurrent = 0; m_ToggleShowInfo.SetInfinite(); @@ -88,18 +79,9 @@ m_bIsPlayingEncryptedStream = false; m_bHasTVChannels = false; m_bHasRadioChannels = false; - m_bIsTimeshifting = false; - m_iTimeshiftStartTime = time_t(0); - m_iTimeshiftEndTime = time_t(0); - m_iTimeshiftPlayTime = time_t(0); - m_strTimeshiftStartTime.clear(); - m_strTimeshiftEndTime.clear(); - m_strTimeshiftPlayTime.clear(); ResetPlayingTag(); ClearQualityInfo(m_qualityInfo); - - m_updateBackendCacheRequested = false; } void CPVRGUIInfo::ClearQualityInfo(PVR_SIGNAL_STATUS &qualityInfo) @@ -131,12 +113,10 @@ void CPVRGUIInfo::ShowPlayerInfo(int iTimeout) { - { - CSingleLock lock(m_critSection); + CSingleLock lock(m_critSection); - if (iTimeout > 0) - m_ToggleShowInfo.Set(iTimeout * 1000); - } + if (iTimeout > 0) + m_ToggleShowInfo.Set(iTimeout * 1000); g_infoManager.SetShowInfo(true); } @@ -148,21 +128,7 @@ if (m_ToggleShowInfo.IsTimePast()) { m_ToggleShowInfo.SetInfinite(); - - /* release our lock while calling into global objects (which have - their own locks) to avoid deadlocks */ - lock.Leave(); - g_infoManager.SetShowInfo(false); - g_PVRManager.UpdateCurrentChannel(); - } - else if (!g_infoManager.GetShowInfo()) // channel infos (no longer) displayed? - { - /* release our lock while calling into global objects (which have - their own locks) to avoid deadlocks */ - lock.Leave(); - - g_PVRManager.UpdateCurrentChannel(); } } @@ -198,9 +164,6 @@ g_PVRTimers->RegisterObserver(this); UpdateTimersCache(); - /* update the backend cache once initially */ - m_updateBackendCacheRequested = true; - while (!g_application.m_bStop && !m_bStop) { if (!m_bStop) @@ -220,10 +183,6 @@ Sleep(0); if (!m_bStop) - UpdateTimeshift(); - Sleep(0); - - if (!m_bStop) UpdateTimersToggle(); Sleep(0); @@ -252,7 +211,7 @@ ClearQualityInfo(qualityInfo); PVR_CLIENT client; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPLAYBACK_SIGNALQUALITY) && + if (CSettings::Get().GetBool("pvrplayback.signalquality") && g_PVRClients->GetPlayingClient(client)) { client->SignalQuality(qualityInfo); @@ -290,34 +249,6 @@ m_strPlayingTVGroup = strPlayingTVGroup; } -void CPVRGUIInfo::UpdateTimeshift(void) -{ - bool bStarted = g_PVRManager.IsStarted(); - - bool bIsTimeshifting = bStarted && g_PVRClients->IsTimeshifting(); - CDateTime tmp; - time_t iTimeshiftStartTime = g_PVRClients->GetBufferTimeStart(); - tmp.SetFromUTCDateTime(iTimeshiftStartTime); - std::string strTimeshiftStartTime = tmp.GetAsLocalizedTime("", false); - - time_t iTimeshiftEndTime = g_PVRClients->GetBufferTimeEnd(); - tmp.SetFromUTCDateTime(iTimeshiftEndTime); - std::string strTimeshiftEndTime = tmp.GetAsLocalizedTime("", false); - - time_t iTimeshiftPlayTime = g_PVRClients->GetPlayingTime(); - tmp.SetFromUTCDateTime(iTimeshiftPlayTime); - std::string strTimeshiftPlayTime = tmp.GetAsLocalizedTime("", true); - - CSingleLock lock(m_critSection); - m_bIsTimeshifting = bIsTimeshifting; - m_iTimeshiftStartTime = iTimeshiftStartTime; - m_iTimeshiftEndTime = iTimeshiftEndTime; - m_iTimeshiftPlayTime = iTimeshiftPlayTime; - m_strTimeshiftStartTime = strTimeshiftStartTime; - m_strTimeshiftEndTime = strTimeshiftEndTime; - m_strTimeshiftPlayTime = strTimeshiftPlayTime; -} - bool CPVRGUIInfo::TranslateCharInfo(DWORD dwInfo, std::string &strValue) const { bool bReturn(true); @@ -430,15 +361,6 @@ case PVR_TOTAL_DISKSPACE: CharInfoTotalDiskSpace(strValue); break; - case PVR_TIMESHIFT_START_TIME: - CharInfoTimeshiftStartTime(strValue); - break; - case PVR_TIMESHIFT_END_TIME: - CharInfoTimeshiftEndTime(strValue); - break; - case PVR_TIMESHIFT_PLAY_TIME: - CharInfoTimeshiftPlayTime(strValue); - break; default: strValue.clear(); bReturn = false; @@ -482,9 +404,6 @@ case PVR_ACTUAL_STREAM_ENCRYPTED: bReturn = m_bIsPlayingEncryptedStream; break; - case PVR_IS_TIMESHIFTING: - bReturn = m_bIsTimeshifting; - break; default: break; } @@ -505,16 +424,13 @@ iReturn = (int) ((float) m_qualityInfo.iSNR / 0xFFFF * 100); else if (dwInfo == PVR_BACKEND_DISKSPACE_PROGR) { - if (m_iBackendDiskTotal > 0) - iReturn = static_cast(100 * m_iBackendDiskUsed / m_iBackendDiskTotal); + const auto &backend = GetCurrentActiveBackend(); + + if (backend.diskTotal > 0) + iReturn = static_cast(100 * backend.diskUsed / backend.diskTotal); else iReturn = 0xFF; } - else if (dwInfo == PVR_TIMESHIFT_PROGRESS) - { - iReturn = static_cast(static_cast(m_iTimeshiftPlayTime - m_iTimeshiftStartTime) / - (m_iTimeshiftEndTime - m_iTimeshiftStartTime) * 100); - } return iReturn; } @@ -564,21 +480,6 @@ strValue = StringUtils::SecondsToTimeString(m_iDuration / 1000, TIME_FORMAT_GUESS).c_str(); } -void CPVRGUIInfo::CharInfoTimeshiftStartTime(std::string &strValue) const -{ - strValue = m_strTimeshiftStartTime; -} - -void CPVRGUIInfo::CharInfoTimeshiftEndTime(std::string &strValue) const -{ - strValue = m_strTimeshiftEndTime; -} - -void CPVRGUIInfo::CharInfoTimeshiftPlayTime(std::string &strValue) const -{ - strValue = m_strTimeshiftPlayTime; -} - void CPVRGUIInfo::CharInfoPlayingTime(std::string &strValue) const { strValue = StringUtils::SecondsToTimeString(GetStartTime()/1000, TIME_FORMAT_GUESS).c_str(); @@ -594,14 +495,14 @@ size_t numBackends = m_backendProperties.size(); if (numBackends > 0) - strValue = StringUtils::Format("%u %s %" PRIuS, m_iCurrentActiveClient + 1, g_localizeStrings.Get(20163).c_str(), numBackends); + strValue = StringUtils::Format("%u %s %u", m_iCurrentActiveClient + 1, g_localizeStrings.Get(20163).c_str(), numBackends); else strValue = g_localizeStrings.Get(14023); } void CPVRGUIInfo::CharInfoTotalDiskSpace(std::string &strValue) const { - strValue = StringUtils::SizeToString(m_iBackendDiskTotal).c_str(); + strValue = StringUtils::SizeToString(GetCurrentActiveBackend().diskTotal).c_str(); } void CPVRGUIInfo::CharInfoVideoBR(std::string &strValue) const @@ -657,28 +558,39 @@ void CPVRGUIInfo::CharInfoBackendName(std::string &strValue) const { - m_updateBackendCacheRequested = true; - strValue = m_strBackendName; + const std::string &backendName = GetCurrentActiveBackend().name; + + if (backendName.empty()) + strValue = g_localizeStrings.Get(13205); + else + strValue = backendName; } void CPVRGUIInfo::CharInfoBackendVersion(std::string &strValue) const { - m_updateBackendCacheRequested = true; - strValue = m_strBackendVersion; + const std::string &backendVersion = GetCurrentActiveBackend().version; + + if (backendVersion.empty()) + strValue = g_localizeStrings.Get(13205); + else + strValue = backendVersion; } void CPVRGUIInfo::CharInfoBackendHost(std::string &strValue) const { - m_updateBackendCacheRequested = true; - strValue = m_strBackendHost; + const std::string &backendHost = GetCurrentActiveBackend().host; + + if (backendHost.empty()) + strValue = g_localizeStrings.Get(13205); + else + strValue = backendHost; } void CPVRGUIInfo::CharInfoBackendDiskspace(std::string &strValue) const { - m_updateBackendCacheRequested = true; - - auto diskTotal = m_iBackendDiskTotal; - auto diskUsed = m_iBackendDiskUsed; + const auto &backend = GetCurrentActiveBackend(); + auto diskTotal = backend.diskTotal; + auto diskUsed = backend.diskUsed; if (diskTotal > 0) { @@ -692,26 +604,34 @@ void CPVRGUIInfo::CharInfoBackendChannels(std::string &strValue) const { - m_updateBackendCacheRequested = true; - strValue = m_strBackendChannels; + if (m_strBackendChannels.empty()) + strValue = g_localizeStrings.Get(13205); + else + strValue = m_strBackendChannels; } void CPVRGUIInfo::CharInfoBackendTimers(std::string &strValue) const { - m_updateBackendCacheRequested = true; - strValue = m_strBackendTimers; + if (m_strBackendTimers.empty()) + strValue = g_localizeStrings.Get(13205); + else + strValue = m_strBackendTimers; } void CPVRGUIInfo::CharInfoBackendRecordings(std::string &strValue) const { - m_updateBackendCacheRequested = true; - strValue = m_strBackendRecordings; + if (m_strBackendRecordings.empty()) + strValue = g_localizeStrings.Get(13205); + else + strValue = m_strBackendRecordings; } void CPVRGUIInfo::CharInfoBackendDeletedRecordings(std::string &strValue) const { - m_updateBackendCacheRequested = true; - strValue = m_strBackendDeletedRecordings; + if (m_strBackendDeletedRecordings.empty()) + strValue = g_localizeStrings.Get(13205); /* Unknown */ + else + strValue = m_strBackendDeletedRecordings; } void CPVRGUIInfo::CharInfoPlayingClientName(std::string &strValue) const @@ -759,61 +679,50 @@ { CSingleLock lock(m_critSection); - // Update the backend information for all backends if - // an update has been requested - if (m_iCurrentActiveClient == 0 && m_updateBackendCacheRequested) + // Update the backend information for all backends once per iteration + if (m_iCurrentActiveClient == 0) { std::vector backendProperties; { CSingleExit exit(m_critSection); backendProperties = g_PVRClients->GetBackendProperties(); } - m_backendProperties = backendProperties; - m_updateBackendCacheRequested = false; } - // Store some defaults - m_strBackendName = g_localizeStrings.Get(13205); - m_strBackendVersion = g_localizeStrings.Get(13205); - m_strBackendHost = g_localizeStrings.Get(13205); - m_strBackendChannels = g_localizeStrings.Get(13205); - m_strBackendTimers = g_localizeStrings.Get(13205); - m_strBackendRecordings = g_localizeStrings.Get(13205); - m_strBackendDeletedRecordings = g_localizeStrings.Get(13205); - m_iBackendDiskTotal = 0; - m_iBackendDiskUsed = 0; - - // Update with values from the current client when we have at least one - if (!m_backendProperties.empty()) - { - const auto &backend = m_backendProperties[m_iCurrentActiveClient]; + // Get the properties for the currently active backend + const auto &backend = GetCurrentActiveBackend(); - m_strBackendName = backend.name; - m_strBackendVersion = backend.version; - m_strBackendHost = backend.host; - - if (backend.numChannels >= 0) - m_strBackendChannels = StringUtils::Format("%i", backend.numChannels); - - if (backend.numTimers >= 0) - m_strBackendTimers = StringUtils::Format("%i", backend.numTimers); + if (backend.numChannels >= 0) + m_strBackendChannels = StringUtils::Format("%i", backend.numChannels); + else + m_strBackendChannels = g_localizeStrings.Get(161); - if (backend.numRecordings >= 0) - m_strBackendRecordings = StringUtils::Format("%i", backend.numRecordings); + if (backend.numTimers >= 0) + m_strBackendTimers = StringUtils::Format("%i", backend.numTimers); + else + m_strBackendTimers = g_localizeStrings.Get(161); - if (backend.numDeletedRecordings >= 0) - m_strBackendDeletedRecordings = StringUtils::Format("%i", backend.numDeletedRecordings); + if (backend.numRecordings >= 0) + m_strBackendRecordings = StringUtils::Format("%i", backend.numRecordings); + else + m_strBackendRecordings = g_localizeStrings.Get(161); - m_iBackendDiskTotal = backend.diskTotal; - m_iBackendDiskUsed = backend.diskUsed; - } + if (backend.numDeletedRecordings >= 0) + m_strBackendDeletedRecordings = StringUtils::Format("%i", backend.numDeletedRecordings); + else + m_strBackendDeletedRecordings = g_localizeStrings.Get(161); // Update the current active client, eventually wrapping around if (++m_iCurrentActiveClient >= m_backendProperties.size()) m_iCurrentActiveClient = 0; } +const SBackend& CPVRGUIInfo::GetCurrentActiveBackend() const +{ + return m_backendProperties[m_iCurrentActiveClient]; +} + void CPVRGUIInfo::UpdateTimersCache(void) { int iTimerAmount = g_PVRTimers->AmountActiveTimers(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRGUIInfo.h kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRGUIInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRGUIInfo.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRGUIInfo.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,14 +19,12 @@ * */ -#include "addons/include/xbmc_pvr_types.h" -#include "pvr/addons/PVRClients.h" #include "threads/CriticalSection.h" #include "threads/SystemClock.h" -#include "threads/Thread.h" #include "utils/Observer.h" - -#include +#include "threads/Thread.h" +#include "pvr/addons/PVRClients.h" +#include "addons/include/xbmc_pvr_types.h" namespace EPG { @@ -102,7 +100,8 @@ void UpdateQualityData(void); void UpdateMisc(void); void UpdateNextTimer(void); - void UpdateTimeshift(void); + + const SBackend& GetCurrentActiveBackend() const; bool TimerInfoToggle(void); void UpdateTimersToggle(void); @@ -143,9 +142,6 @@ void CharInfoService(std::string &strValue) const; void CharInfoMux(std::string &strValue) const; void CharInfoProvider(std::string &strValue) const; - void CharInfoTimeshiftStartTime(std::string &strValue) const; - void CharInfoTimeshiftEndTime(std::string &strValue) const; - void CharInfoTimeshiftPlayTime(std::string &strValue) const; /** @name GUIInfoManager data */ //@{ @@ -163,15 +159,10 @@ unsigned int m_iRecordingTimerAmount; unsigned int m_iCurrentActiveClient; std::string m_strPlayingClientName; - std::string m_strBackendName; - std::string m_strBackendVersion; - std::string m_strBackendHost; std::string m_strBackendTimers; std::string m_strBackendRecordings; std::string m_strBackendDeletedRecordings; std::string m_strBackendChannels; - long long m_iBackendDiskTotal; - long long m_iBackendDiskUsed; unsigned int m_iDuration; bool m_bHasNonRecordingTimers; @@ -190,23 +181,6 @@ XbmcThreads::EndTime m_ToggleShowInfo; EPG::CEpgInfoTagPtr m_playingEpgTag; std::vector m_backendProperties; - - bool m_bIsTimeshifting; - time_t m_iTimeshiftStartTime; - time_t m_iTimeshiftEndTime; - time_t m_iTimeshiftPlayTime; - std::string m_strTimeshiftStartTime; - std::string m_strTimeshiftEndTime; - std::string m_strTimeshiftPlayTime; - CCriticalSection m_critSection; - - /** - * The various backend-related fields will only be updated when this - * flag is set. This is done to limit the amount of unnecessary - * backend querying when we're not displaying any of the queried - * information. - */ - mutable std::atomic m_updateBackendCacheRequested; }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRManager.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRManager.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRManager.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,60 +18,55 @@ * */ -#include "PVRManager.h" - -#include -#include - -#include "addons/AddonInstaller.h" #include "Application.h" -#include "dialogs/GUIDialogExtendedProgressBar.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "dialogs/GUIDialogNumeric.h" +#include "ApplicationMessenger.h" +#include "GUIInfoManager.h" +#include "Util.h" #include "dialogs/GUIDialogOK.h" +#include "dialogs/GUIDialogNumeric.h" #include "dialogs/GUIDialogProgress.h" -#include "epg/EpgContainer.h" -#include "GUIInfoManager.h" +#include "dialogs/GUIDialogExtendedProgressBar.h" +#include "dialogs/GUIDialogKaiToast.h" +#include "dialogs/GUIDialogYesNo.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" -#include "interfaces/AnnouncementManager.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" #include "music/tags/MusicInfoTag.h" -#include "network/Network.h" -#include "pvr/addons/PVRClients.h" -#include "pvr/channels/PVRChannel.h" -#include "pvr/channels/PVRChannelGroupInternal.h" -#include "pvr/channels/PVRChannelGroupsContainer.h" -#include "pvr/dialogs/GUIDialogPVRChannelManager.h" -#include "pvr/dialogs/GUIDialogPVRGroupManager.h" -#include "pvr/PVRActionListener.h" -#include "pvr/PVRDatabase.h" -#include "pvr/PVRGUIInfo.h" -#include "pvr/recordings/PVRRecordings.h" -#include "pvr/timers/PVRTimers.h" -#include "pvr/windows/GUIWindowPVRBase.h" -#include "settings/lib/Setting.h" #include "settings/MediaSettings.h" +#include "settings/lib/Setting.h" #include "settings/Settings.h" #include "threads/SingleLock.h" -#include "Util.h" -#include "utils/JobManager.h" +#include "windows/GUIWindowPVRBase.h" #include "utils/log.h" #include "utils/Stopwatch.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" +#include "utils/JobManager.h" +#include "interfaces/AnnouncementManager.h" #include "video/VideoDatabase.h" +#include "network/Network.h" + +#include "PVRManager.h" +#include "PVRDatabase.h" +#include "PVRGUIInfo.h" +#include "PVRActionListener.h" +#include "addons/PVRClients.h" +#include "channels/PVRChannel.h" +#include "channels/PVRChannelGroupsContainer.h" +#include "channels/PVRChannelGroupInternal.h" +#include "epg/EpgContainer.h" +#include "recordings/PVRRecordings.h" +#include "timers/PVRTimers.h" +#include "addons/AddonInstaller.h" +#include "dialogs/GUIDialogPVRChannelManager.h" +#include "dialogs/GUIDialogPVRGroupManager.h" + +#include using namespace MUSIC_INFO; using namespace PVR; using namespace EPG; using namespace ANNOUNCEMENT; -using namespace KODI::MESSAGING; -using KODI::MESSAGING::HELPERS::DialogResponse; - -const int CPVRManager::m_pvrWindowIds[10] = { +int CPVRManager::m_pvrWindowIds[10] = { WINDOW_TV_CHANNELS, WINDOW_TV_GUIDE, WINDOW_TV_RECORDINGS, @@ -99,13 +94,13 @@ m_progressHandle(NULL), m_managerState(ManagerStateStopped) { - CAnnouncementManager::GetInstance().AddAnnouncer(this); + CAnnouncementManager::Get().AddAnnouncer(this); ResetProperties(); } CPVRManager::~CPVRManager(void) { - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); Stop(); CLog::Log(LOGDEBUG,"PVRManager - destroyed"); } @@ -132,7 +127,7 @@ } } -CPVRManager &CPVRManager::GetInstance() +CPVRManager &CPVRManager::Get(void) { static CPVRManager pvrManagerInstance; return pvrManagerInstance; @@ -154,18 +149,18 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_PVRMANAGER_ENABLED) + if (settingId == "pvrmanager.enabled") { - CApplicationMessenger::GetInstance().PostMsg(TMSG_SETPVRMANAGERSTATE, ((CSettingBool*)setting)->GetValue() ? 1 : 0); + CApplicationMessenger::Get().SetPVRManagerState(((CSettingBool*)setting)->GetValue()); } - else if (settingId == CSettings::SETTING_PVRPARENTAL_ENABLED) + else if (settingId == "pvrparental.enabled") { - if (((CSettingBool*)setting)->GetValue() && CSettings::GetInstance().GetString(CSettings::SETTING_PVRPARENTAL_PIN).empty()) + if (((CSettingBool*)setting)->GetValue() && CSettings::Get().GetString("pvrparental.pin").empty()) { std::string newPassword = ""; // password set... save it if (CGUIDialogNumeric::ShowAndVerifyNewPassword(newPassword)) - CSettings::GetInstance().SetString(CSettings::SETTING_PVRPARENTAL_PIN, newPassword); + CSettings::Get().SetString("pvrparental.pin", newPassword); // password not set... disable parental else ((CSettingBool*)setting)->SetValue(false); @@ -179,52 +174,52 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_PVRMENU_SEARCHICONS) + if (settingId == "pvrmenu.searchicons") { if (IsStarted()) TriggerSearchMissingChannelIcons(); } - else if (settingId == CSettings::SETTING_PVRMANAGER_RESETDB) + else if (settingId == "pvrmanager.resetdb") { if (CheckParentalPIN(g_localizeStrings.Get(19262)) && - HELPERS::ShowYesNoDialogText(CVariant{19098}, CVariant{19186}) == DialogResponse::YES) + CGUIDialogYesNo::ShowAndGetInput(19098, 19186)) { CDateTime::ResetTimezoneBias(); ResetDatabase(false); } } - else if (settingId == CSettings::SETTING_EPG_RESETEPG) + else if (settingId == "epg.resetepg") { - if (HELPERS::ShowYesNoDialogText(CVariant{19098}, CVariant{19188}) == DialogResponse::YES) + if (CGUIDialogYesNo::ShowAndGetInput(19098, 19188)) { CDateTime::ResetTimezoneBias(); ResetDatabase(true); } } - else if (settingId == CSettings::SETTING_PVRMANAGER_CHANNELSCAN) + else if (settingId == "pvrmanager.channelscan") { if (IsStarted()) StartChannelScan(); } - else if (settingId == CSettings::SETTING_PVRMANAGER_CHANNELMANAGER) + else if (settingId == "pvrmanager.channelmanager") { if (IsStarted()) { CGUIDialogPVRChannelManager *dialog = (CGUIDialogPVRChannelManager *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_CHANNEL_MANAGER); if (dialog) - dialog->Open(); + dialog->DoModal(); } } - else if (settingId == CSettings::SETTING_PVRMANAGER_GROUPMANAGER) + else if (settingId == "pvrmanager.groupmanager") { if (IsStarted()) { CGUIDialogPVRGroupManager *dialog = (CGUIDialogPVRGroupManager *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_GROUP_MANAGER); if (dialog) - dialog->Open(); + dialog->DoModal(); } } - else if (settingId == CSettings::SETTING_PVRCLIENT_MENUHOOK) + else if (settingId == "pvrclient.menuhook") { if (IsStarted()) m_addons->ProcessMenuHooks(-1, PVR_MENUHOOK_SETTING, NULL); @@ -274,12 +269,12 @@ (!IsPVRWindowActive() && !IsPlaying()); } -void CPVRManager::MarkAsOutdated(const std::string& strAddonId) +void CPVRManager::MarkAsOutdated(const std::string& strAddonId, const std::string& strReferer) { - if (IsStarted() && CSettings::GetInstance().GetInt(CSettings::SETTING_GENERAL_ADDONUPDATES) == AUTO_UPDATES_ON) + if (IsStarted() && CSettings::Get().GetInt("general.addonupdates") == AUTO_UPDATES_ON) { CSingleLock lock(m_critSection); - m_outdatedAddons.push_back(strAddonId); + m_outdatedAddons.insert(make_pair(strAddonId, strReferer)); } } @@ -290,9 +285,9 @@ return true; // there's add-ons that couldn't be updated - for (auto it = m_outdatedAddons.begin(); it != m_outdatedAddons.end(); ++it) + for (std::map::iterator it = m_outdatedAddons.begin(); it != m_outdatedAddons.end(); ++it) { - if (!InstallAddonAllowed(*it)) + if (!InstallAddonAllowed(it->first)) { // we can't upgrade right now return true; @@ -302,24 +297,19 @@ // all outdated add-ons can be upgraded now CLog::Log(LOGINFO, "PVR - upgrading outdated add-ons"); - auto outdatedAddons = m_outdatedAddons; + std::map outdatedAddons = m_outdatedAddons; // stop threads and unload SetState(ManagerStateInterrupted); - - { - CSingleExit exit(m_critSection); - g_EpgContainer.Stop(); - } - + g_EpgContainer.Stop(); m_guiInfo->Stop(); m_addons->Stop(); Cleanup(); // upgrade all add-ons - for (auto it = outdatedAddons.begin(); it != outdatedAddons.end(); ++it) + for (std::map::iterator it = outdatedAddons.begin(); it != outdatedAddons.end(); ++it) { - CLog::Log(LOGINFO, "PVR - updating add-on '%s'", (*it).c_str()); - CAddonInstaller::GetInstance().InstallOrUpdate(*it, false); + CLog::Log(LOGINFO, "PVR - updating add-on '%s'", it->first.c_str()); + CAddonInstaller::Get().Install(it->first, true, it->second, false); } // reload @@ -339,11 +329,7 @@ if (IsInitialising()) { SetState(ManagerStateStarted); - - { - CSingleExit exit(m_critSection); - g_EpgContainer.Start(true); - } + g_EpgContainer.Start(); CLog::Log(LOGDEBUG, "PVRManager - %s - restarted", __FUNCTION__); return true; @@ -375,10 +361,7 @@ m_pendingUpdates.clear(); /* unregister application action listener */ - { - CSingleExit exit(m_critSection); - g_application.UnregisterActionListener(&CPVRActionListener::GetInstance()); - } + g_application.UnregisterActionListener(&CPVRActionListener::Get()); HideProgressDialog(); @@ -412,6 +395,8 @@ g_PVRManager.Start(false); return true; } +private: + int m_openWindowId; }; void CPVRManager::Start(bool bAsync /* = false */) @@ -429,7 +414,7 @@ Stop(); /* don't start if Settings->Video->TV->Enable isn't checked */ - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_ENABLED)) + if (!CSettings::Get().GetBool("pvrmanager.enabled")) return; ResetProperties(); @@ -441,10 +426,7 @@ m_database->Open(); /* register application action listener */ - { - CSingleExit exit(m_critSection); - g_application.RegisterActionListener(&CPVRActionListener::GetInstance()); - } + g_application.RegisterActionListener(&CPVRActionListener::Get()); /* create the supervisor thread to do all background activities */ StartUpdateThreads(); @@ -467,7 +449,7 @@ if (IsPlaying()) { CLog::Log(LOGNOTICE,"PVRManager - %s - stopping PVR playback", __FUNCTION__); - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); + CApplicationMessenger::Get().MediaStop(); } /* stop all update threads */ @@ -520,11 +502,9 @@ SetState(ManagerStateStarted); - /* start epg container */ - g_EpgContainer.Start(true); - /* main loop */ CLog::Log(LOGDEBUG, "PVRManager - %s - entering main loop", __FUNCTION__); + g_EpgContainer.Start(); bool bRestart(false); while (IsStarted() && m_addons && m_addons->HasConnectedClients() && !bRestart) @@ -567,16 +547,16 @@ if (IsStarted()) { CLog::Log(LOGNOTICE, "PVRManager - %s - no add-ons enabled anymore. restarting the pvrmanager", __FUNCTION__); - CApplicationMessenger::GetInstance().PostMsg(TMSG_SETPVRMANAGERSTATE, 1); + CApplicationMessenger::Get().SetPVRManagerState(true); } } bool CPVRManager::SetWakeupCommand(void) { - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPOWERMANAGEMENT_ENABLED)) + if (!CSettings::Get().GetBool("pvrpowermanagement.enabled")) return false; - const std::string strWakeupCommand = CSettings::GetInstance().GetString(CSettings::SETTING_PVRPOWERMANAGEMENT_SETWAKEUPCMD); + const std::string strWakeupCommand = CSettings::Get().GetString("pvrpowermanagement.setwakeupcmd"); if (!strWakeupCommand.empty() && m_timers) { time_t iWakeupTime; @@ -640,7 +620,6 @@ /* reset observer for pvr windows */ for (std::size_t i = 0; i != ARRAY_SIZE(m_pvrWindowIds); i++) { - CSingleExit exit(m_critSection); CGUIWindowPVRBase *pWindow = (CGUIWindowPVRBase *) g_windowManager.GetWindow(m_pvrWindowIds[i]); if (pWindow) pWindow->ResetObservers(); @@ -693,19 +672,25 @@ } } -bool CPVRManager::ChannelSwitchById(unsigned int iChannelId) +bool CPVRManager::ChannelSwitch(unsigned int iChannelNumber) { CSingleLock lock(m_critSection); - CPVRChannelPtr channel = m_channelGroups->GetChannelById(iChannelId); - if (channel) + CPVRChannelGroupPtr playingGroup = GetPlayingGroup(m_addons->IsPlayingRadio()); + if (!playingGroup) { - SetPlayingGroup(channel); - return PerformChannelSwitch(channel, false); + CLog::Log(LOGERROR, "PVRManager - %s - cannot get the selected group", __FUNCTION__); + return false; } - CLog::Log(LOGERROR, "PVRManager - %s - cannot find channel with id %d", __FUNCTION__, iChannelId); - return false; + CFileItemPtr channel = playingGroup->GetByChannelNumber(iChannelNumber); + if (!channel || !channel->HasPVRChannelInfoTag()) + { + CLog::Log(LOGERROR, "PVRManager - %s - cannot find channel %d", __FUNCTION__, iChannelNumber); + return false; + } + + return PerformChannelSwitch(channel->GetPVRChannelInfoTag(), false); } bool CPVRManager::ChannelUpDown(unsigned int *iNewChannelNumber, bool bPreview, bool bUp) @@ -739,7 +724,7 @@ bool CPVRManager::ContinueLastChannel(void) { - if (CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPLAYBACK_STARTLAST) == CONTINUE_LAST_CHANNEL_OFF) + if (CSettings::Get().GetInt("pvrplayback.startlast") == CONTINUE_LAST_CHANNEL_OFF) return false; CFileItemPtr channel = m_channelGroups->GetLastPlayedChannel(); @@ -747,7 +732,7 @@ { CLog::Log(LOGNOTICE, "PVRManager - %s - continue playback on channel '%s'", __FUNCTION__, channel->GetPVRChannelInfoTag()->ChannelName().c_str()); SetPlayingGroup(m_channelGroups->GetLastPlayedGroup(channel->GetPVRChannelInfoTag()->ChannelID())); - StartPlayback(channel->GetPVRChannelInfoTag(), (CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPLAYBACK_STARTLAST) == CONTINUE_LAST_CHANNEL_IN_BACKGROUND)); + StartPlayback(channel->GetPVRChannelInfoTag(), (CSettings::Get().GetInt("pvrplayback.startlast") == CONTINUE_LAST_CHANNEL_IN_BACKGROUND)); return true; } @@ -763,17 +748,16 @@ g_EpgContainer.Stop(); CGUIDialogProgress* pDlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); - pDlgProgress->SetHeading(CVariant{313}); - pDlgProgress->SetLine(0, CVariant{g_localizeStrings.Get(19187)}); // All data in the PVR database is being erased - pDlgProgress->SetLine(1, CVariant{""}); - pDlgProgress->SetLine(2, CVariant{""}); - pDlgProgress->Open(); + pDlgProgress->SetLine(0, ""); + pDlgProgress->SetLine(1, g_localizeStrings.Get(19186)); // All data in the PVR database is being erased + pDlgProgress->SetLine(2, ""); + pDlgProgress->StartModal(); pDlgProgress->Progress(); if (m_addons && m_addons->IsPlaying()) { CLog::Log(LOGNOTICE,"PVRManager - %s - stopping playback", __FUNCTION__); - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); + CApplicationMessenger::Get().MediaStop(); } pDlgProgress->SetPercentage(10); @@ -833,7 +817,7 @@ CLog::Log(LOGNOTICE,"PVRManager - %s - %s database cleared", __FUNCTION__, bResetEPGOnly ? "EPG" : "PVR and EPG"); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_ENABLED)) + if (CSettings::Get().GetBool("pvrmanager.enabled")) { CLog::Log(LOGNOTICE,"PVRManager - %s - restarting the PVRManager", __FUNCTION__); m_database->Open(); @@ -850,20 +834,6 @@ return IsStarted() && m_addons && m_addons->IsPlaying(); } -bool CPVRManager::IsPlayingChannel(const CPVRChannelPtr &channel) const -{ - bool bReturn(false); - - if (channel && IsStarted()) - { - CPVRChannelPtr current(GetCurrentChannel()); - if (current && *current == *channel) - bReturn = true; - } - - return bReturn; -} - CPVRChannelPtr CPVRManager::GetCurrentChannel(void) const { return m_addons ? m_addons->GetPlayingChannel() : CPVRChannelPtr(); @@ -904,12 +874,12 @@ { bReturn = m_timers->InstantTimer(channel); if (!bReturn) - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19164}); + CGUIDialogOK::ShowAndGetInput(19033, 19164); } else { /* delete active timers */ - bReturn = m_timers->DeleteTimersOnChannel(channel, true, true); + bReturn = m_timers->DeleteTimersOnChannel(channel, false, true); } } @@ -931,7 +901,7 @@ { bReturn = m_timers->InstantTimer(channel); if (!bReturn) - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19164}); + CGUIDialogOK::ShowAndGetInput(19033, 19164); } else if (!bOnOff && channel->IsRecording()) { @@ -964,11 +934,11 @@ if (// different channel (!currentChannel || channel != currentChannel) && // parental control enabled - CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPARENTAL_ENABLED) && + CSettings::Get().GetBool("pvrparental.enabled") && // channel is locked channel && channel->IsLocked()) { - float parentalDurationMs = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPARENTAL_DURATION) * 1000.0f; + float parentalDurationMs = CSettings::Get().GetInt("pvrparental.duration") * 1000.0f; bReturn = m_parentalTimer && (!m_parentalTimer->IsRunning() || m_parentalTimer->GetElapsedMilliseconds() > parentalDurationMs); @@ -979,16 +949,16 @@ bool CPVRManager::CheckParentalPIN(const std::string& strTitle /* = "" */) { - std::string pinCode = CSettings::GetInstance().GetString(CSettings::SETTING_PVRPARENTAL_PIN); + std::string pinCode = CSettings::Get().GetString("pvrparental.pin"); - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPARENTAL_ENABLED) || pinCode.empty()) + if (!CSettings::Get().GetBool("pvrparental.enabled") || pinCode.empty()) return true; // Locked channel. Enter PIN: bool bValidPIN = CGUIDialogNumeric::ShowAndVerifyInput(pinCode, !strTitle.empty() ? strTitle : g_localizeStrings.Get(19263), true); if (!bValidPIN) // display message: The entered PIN number was incorrect - CGUIDialogOK::ShowAndGetInput(CVariant{19264}, CVariant{19265}); + CGUIDialogOK::ShowAndGetInput(19264, 19265); else if (m_parentalTimer) { // reset the timer @@ -1004,20 +974,6 @@ m_channelGroups->Get(group->IsRadio())->SetSelectedGroup(group); } -void CPVRManager::SetPlayingGroup(const CPVRChannelPtr &channel) -{ - CPVRChannelGroupPtr group = m_channelGroups->GetSelectedGroup(channel->IsRadio()); - if (!group || !group->IsGroupMember(channel)) - { - // The channel we'll switch to is not part of the current selected group. - // Set the first group as the selected group where the channel is a member. - CPVRChannelGroups *channelGroups = m_channelGroups->Get(channel->IsRadio()); - std::vector groups = channelGroups->GetGroupsByChannel(channel, true); - if (!groups.empty()) - channelGroups->SetSelectedGroup(groups.front()); - } -} - CPVRChannelGroupPtr CPVRManager::GetPlayingGroup(bool bRadio /* = false */) { if (m_channelGroups) @@ -1052,34 +1008,33 @@ return g_PVRChannelGroups->Update(false); } -bool CPVRManager::OpenLiveStream(const CFileItem &fileItem) +bool CPVRManager::OpenLiveStream(const CFileItem &channel) { bool bReturn(false); - if (!fileItem.HasPVRChannelInfoTag()) + if (!channel.HasPVRChannelInfoTag()) return bReturn; CLog::Log(LOGDEBUG,"PVRManager - %s - opening live stream on channel '%s'", - __FUNCTION__, fileItem.GetPVRChannelInfoTag()->ChannelName().c_str()); + __FUNCTION__, channel.GetPVRChannelInfoTag()->ChannelName().c_str()); // check if we're allowed to play this file - if (IsParentalLocked(fileItem.GetPVRChannelInfoTag())) + if (IsParentalLocked(channel.GetPVRChannelInfoTag())) return bReturn; - if ((bReturn = m_addons->OpenStream(fileItem.GetPVRChannelInfoTag(), false)) != false) + if ((bReturn = m_addons->OpenStream(channel.GetPVRChannelInfoTag(), false)) != false) { CSingleLock lock(m_critSection); if(m_currentFile) delete m_currentFile; - m_currentFile = new CFileItem(fileItem); + m_currentFile = new CFileItem(channel); - CPVRChannelPtr channel(m_addons->GetPlayingChannel()); - if (channel) - { - SetPlayingGroup(channel); - UpdateLastWatched(channel); - // set channel as selected item - CGUIWindowPVRBase::SetSelectedItemPath(channel->IsRadio(), channel->Path()); - } + // set channel as selected item + if (channel.HasPVRChannelInfoTag()) + CGUIWindowPVRBase::SetSelectedItemPath(channel.GetPVRChannelInfoTag()->IsRadio(), channel.GetPVRChannelInfoTag()->Path()); + + CPVRChannelPtr playingChannel(m_addons->GetPlayingChannel()); + if (playingChannel) + UpdateLastWatched(playingChannel); } return bReturn; @@ -1139,30 +1094,13 @@ if (!g_application.IsCurrentThread()) { - CFileItemList *l = new CFileItemList; //don't delete, - l->Add(std::make_shared(pvrItem)); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l)); + CApplicationMessenger::Get().MediaPlay(pvrItem); return true; } return g_application.PlayFile(pvrItem, false) == PLAYBACK_OK; } -void CPVRManager::UpdateCurrentChannel(void) -{ - CSingleLock lock(m_critSection); - - CPVRChannelPtr playingChannel(GetCurrentChannel()); - if (m_currentFile && - playingChannel && - !IsPlayingChannel(m_currentFile->GetPVRChannelInfoTag())) - { - delete m_currentFile; - m_currentFile = new CFileItem(playingChannel); - UpdateItem(*m_currentFile); - } -} - void CPVRManager::UpdateCurrentFile(void) { CSingleLock lock(m_critSection); @@ -1199,7 +1137,7 @@ { musictag->SetTitle(epgTagNow ? epgTagNow->Title() : - CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? + CSettings::Get().GetBool("epg.hidenoinfoavailable") ? "" : g_localizeStrings.Get(19055)); // no information available if (epgTagNow) @@ -1220,7 +1158,7 @@ { videotag->m_strTitle = epgTagNow ? epgTagNow->Title() : - CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? + CSettings::Get().GetBool("epg.hidenoinfoavailable") ? "" : g_localizeStrings.Get(19055); // no information available if (epgTagNow) @@ -1238,12 +1176,8 @@ bool CPVRManager::StartPlayback(const CPVRChannelPtr &channel, bool bMinimised /* = false */) { - CMediaSettings::GetInstance().SetVideoStartWindowed(bMinimised); - - CFileItemList *l = new CFileItemList; //don't delete, - l->Add(std::make_shared(channel)); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l)); - + CMediaSettings::Get().SetVideoStartWindowed(bMinimised); + CApplicationMessenger::Get().MediaPlay(CFileItem(channel)); CLog::Log(LOGNOTICE, "PVRManager - %s - started playback on channel '%s'", __FUNCTION__, channel->ChannelName().c_str()); return true; @@ -1480,7 +1414,7 @@ const CDateTime now(CDateTime::GetUTCDateTime()); const CDateTime start(cause->StartAsUTC()); const CDateTimeSpan prestart(0, 0, cause->MarginStart(), 0); - const CDateTimeSpan prewakeup(0, 0, CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPOWERMANAGEMENT_PREWAKEUP), 0); + const CDateTimeSpan prewakeup(0, 0, CSettings::Get().GetInt("pvrpowermanagement.prewakeup"), 0); CDateTimeSpan diff(start - now); diff -= prestart - prewakeup; @@ -1510,7 +1444,7 @@ const CDateTime now(CDateTime::GetUTCDateTime()); CDateTime dailywakeuptime; - dailywakeuptime.SetFromDBTime(CSettings::GetInstance().GetString(CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME)); + dailywakeuptime.SetFromDBTime(CSettings::Get().GetString("pvrpowermanagement.dailywakeuptime")); dailywakeuptime = dailywakeuptime.GetAsUTCDateTime(); const CDateTimeSpan diff(dailywakeuptime - now); @@ -1533,12 +1467,13 @@ } // Inform user about PVR being busy. Ask if user wants to powerdown anyway. - bReturn = HELPERS::DialogResponse::YES == - HELPERS::ShowYesNoDialogText(CVariant{19685}, // "Confirm shutdown" - CVariant{text}, - CVariant{222}, // "Shutdown anyway", - CVariant{19696}, // "Cancel" - 10000); // timeout value before closing + bool bCanceled = false; + bReturn = CGUIDialogYesNo::ShowAndGetInput(19685, // "Confirm shutdown" + text, + bCanceled, + 222, // "Cancel" + 19696, // "Shutdown anyway" + 10000); } else bReturn = false; // do not powerdown (busy, but no user interaction requested). @@ -1600,7 +1535,7 @@ // timers going off soon? const CDateTime now(CDateTime::GetUTCDateTime()); const CDateTimeSpan idle( - 0, 0, CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME), 0); + 0, 0, CSettings::Get().GetInt("pvrpowermanagement.backendidletime"), 0); const CDateTime next(m_timers->GetNextEventTime()); const CDateTimeSpan delta(next - now); @@ -1748,7 +1683,7 @@ { CVariant data(CVariant::VariantTypeObject); data["end"] = true; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Player, "xbmc", "OnStop", CFileItemPtr(m_previous), data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Player, "xbmc", "OnStop", CFileItemPtr(m_previous), data); } // announce OnPlay if the switch was successful @@ -1757,7 +1692,7 @@ CVariant param; param["player"]["speed"] = 1; param["player"]["playerid"] = g_playlistPlayer.GetCurrentPlaylist(); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPlay", CFileItemPtr(new CFileItem(*m_next)), param); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::Player, "xbmc", "OnPlay", CFileItemPtr(new CFileItem(*m_next)), param); } return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRManager.h kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRManager.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRManager.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRManager.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,24 +19,22 @@ * */ -#include "FileItem.h" +#include + #include "addons/include/xbmc_pvr_types.h" -#include "interfaces/IAnnouncer.h" #include "settings/lib/ISettingCallback.h" #include "threads/Event.h" #include "threads/Thread.h" #include "utils/JobManager.h" #include "utils/Observer.h" - +#include "interfaces/IAnnouncer.h" #include "pvr/recordings/PVRRecording.h" - -#include +#include "FileItem.h" class CGUIDialogProgressBarHandle; class CStopWatch; class CAction; class CFileItemList; -class CVariant; namespace EPG { @@ -82,7 +80,7 @@ CONTINUE_LAST_CHANNEL_IN_FOREGROUND }; - #define g_PVRManager CPVRManager::GetInstance() + #define g_PVRManager CPVRManager::Get() #define g_PVRChannelGroups g_PVRManager.ChannelGroups() #define g_PVRTimers g_PVRManager.Timers() #define g_PVRRecordings g_PVRManager.Recordings() @@ -106,28 +104,22 @@ */ void UpdateLastWatched(const CPVRChannelPtr &channel); - /*! - * @brief Set the playing group to the first group the channel is in if the given channel is not part of the current playing group - * @param channel The channel - */ - void SetPlayingGroup(const CPVRChannelPtr &channel); - public: /*! * @brief Stop the PVRManager and destroy all objects it created. */ virtual ~CPVRManager(void); - virtual void Announce(ANNOUNCEMENT::AnnouncementFlag flag, const char *sender, const char *message, const CVariant &data) override; + virtual void Announce(ANNOUNCEMENT::AnnouncementFlag flag, const char *sender, const char *message, const CVariant &data); /*! * @brief Get the instance of the PVRManager. * @return The PVRManager instance. */ - static CPVRManager &GetInstance(); + static CPVRManager &Get(void); - virtual void OnSettingChanged(const CSetting *setting) override; - virtual void OnSettingAction(const CSetting *setting) override; + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); /*! * @brief Get the channel groups container. @@ -189,8 +181,9 @@ /*! * @brief Mark an add-on as outdated so it will be upgrade when it's possible again * @param strAddonId The add-on to mark as outdated + * @param strReferer The referer to use when downloading */ - void MarkAsOutdated(const std::string& strAddonId); + void MarkAsOutdated(const std::string& strAddonId, const std::string& strReferer); /*! * @return True when updated, false when the pvr manager failed to load after the attempt @@ -244,12 +237,6 @@ bool IsPlaying(void) const; /*! - * @brief Check if the given channel is playing. - * @return True if it's playing, false otherwise. - */ - bool IsPlayingChannel(const CPVRChannelPtr &channel) const; - - /*! * @return True while the PVRManager is initialising. */ inline bool IsInitialising(void) const @@ -297,11 +284,6 @@ CPVRChannelPtr GetCurrentChannel(void) const; /*! - * @brief Update the channel displayed in guiinfomanager and application to match the currently playing channel. - */ - void UpdateCurrentChannel(void); - - /*! * @brief Return the EPG for the channel that is currently playing. * @param channel The EPG or NULL if no channel is playing. * @return The amount of results that was added or -1 if none. @@ -334,10 +316,10 @@ /*! * @brief Open a stream from the given channel. - * @param fileItem The file item with the channel to open. + * @param channel The channel to open. * @return True if the stream was opened, false otherwise. */ - bool OpenLiveStream(const CFileItem &fileItem); + bool OpenLiveStream(const CFileItem &channel); /*! * @brief Open a stream from the given recording. @@ -448,11 +430,11 @@ bool UpdateItem(CFileItem& item); /*! - * @brief Switch to a channel given it's channel id. - * @param iChannelId The channel id to switch to. + * @brief Switch to a channel given it's channel number. + * @param iChannelNumber The channel number to switch to. * @return True if the channel was switched, false otherwise. */ - bool ChannelSwitchById(unsigned int iChannelId); + bool ChannelSwitch(unsigned int iChannelNumber); /*! * @brief Switch to the next channel in this group. @@ -590,7 +572,7 @@ /*! * @brief PVR update and control thread. */ - virtual void Process(void) override; + virtual void Process(void); private: /*! @@ -685,8 +667,8 @@ CCriticalSection m_managerStateMutex; ManagerState m_managerState; CStopWatch *m_parentalTimer; - std::vector m_outdatedAddons; - static const int m_pvrWindowIds[10]; + std::map m_outdatedAddons; + static int m_pvrWindowIds[10]; }; class CPVREpgsCreateJob : public CJob diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRSettings.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRSettings.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see - * . - * - */ - -#include "PVRSettings.h" - -#include "guilib/LocalizeStrings.h" -#include "utils/StringUtils.h" - -using namespace PVR; - -void CPVRSettings::MarginTimeFiller( - const CSetting * /*setting*/, std::vector< std::pair > &list, int ¤t, void * /*data*/) -{ - list.clear(); - - static const int marginTimeValues[] = - { - 0, 1, 3, 5, 10, 15, 20, 30, 60, 90, 120, 180 // minutes - }; - static const size_t marginTimeValuesCount = sizeof(marginTimeValues) / sizeof(int); - - for (size_t i = 0; i < marginTimeValuesCount; ++i) - { - int iValue = marginTimeValues[i]; - list.push_back( - std::make_pair(StringUtils::Format(g_localizeStrings.Get(14044).c_str(), iValue) /* %i min */, iValue)); - } -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRSettings.h kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/PVRSettings.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/PVRSettings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -#pragma once -/* - * Copyright (C) 2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include - -class CSetting; - -namespace PVR -{ - class CPVRSettings - { - public: - // settings value filler for start/end recording margin time for PVR timers. - static void MarginTimeFiller( - const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - - private: - CPVRSettings() = delete; - CPVRSettings(const CPVRSettings&) = delete; - CPVRSettings& operator=(CPVRSettings const&) = delete; - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/recordings/PVRRecording.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/recordings/PVRRecording.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/recordings/PVRRecording.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/recordings/PVRRecording.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -19,18 +19,15 @@ */ #include "dialogs/GUIDialogOK.h" -#include "epg/Epg.h" #include "epg/EpgContainer.h" +#include "pvr/PVRManager.h" #include "settings/AdvancedSettings.h" +#include "pvr/addons/PVRClients.h" #include "utils/StringUtils.h" #include "utils/RegExp.h" -#include "utils/Variant.h" #include "video/VideoDatabase.h" -#include "pvr/PVRManager.h" -#include "pvr/addons/PVRClients.h" - -#include "PVRRecording.h" +#include "epg/Epg.h" using namespace PVR; using namespace EPG; @@ -88,10 +85,6 @@ m_strRecordingId = recording.strRecordingId; m_strTitle = recording.strTitle; - m_strShowTitle = recording.strEpisodeName; - m_iSeason = recording.iSeriesNumber; - m_iEpisode = recording.iEpisodeNumber; - m_iYear = recording.iYear; m_iClientId = iClientId; m_recordingTime = recording.recordingTime + g_advancedSettings.m_iPVRTimeCorrection; m_duration = CDateTimeSpan(0, 0, recording.iDuration / 60, recording.iDuration % 60); @@ -130,10 +123,6 @@ m_strDirectory == right.m_strDirectory && m_strFileNameAndPath == right.m_strFileNameAndPath && m_strTitle == right.m_strTitle && - m_strShowTitle == right.m_strShowTitle && - m_iSeason == right.m_iSeason && - m_iEpisode == right.m_iEpisode && - m_iYear == right.m_iYear && m_strIconPath == right.m_strIconPath && m_strThumbnailPath == right.m_strThumbnailPath && m_strFanartPath == right.m_strFanartPath && @@ -187,9 +176,7 @@ m_bGotMetaData = false; m_iRecordingId = 0; m_bIsDeleted = false; - m_iEpgEventId = 0; - m_iSeason = -1; - m_iEpisode = -1; + m_iEpgEventId = -1; m_recordingTime.Reset(); CVideoInfoTag::Reset(); @@ -217,7 +204,7 @@ void CPVRRecording::OnDelete(void) { - EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::GetInstance().GetTagById(EpgEvent()); + EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::Get().GetTagById(EpgEvent()); if (epgTag) epgTag->ClearRecording(); } @@ -328,11 +315,11 @@ void CPVRRecording::DisplayError(PVR_ERROR err) const { if (err == PVR_ERROR_SERVER_ERROR) - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19111}); /* print info dialog "Server error!" */ + CGUIDialogOK::ShowAndGetInput(19033, 19111); /* print info dialog "Server error!" */ else if (err == PVR_ERROR_REJECTED) - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19068}); /* print info dialog "Couldn't delete recording!" */ + CGUIDialogOK::ShowAndGetInput(19033, 19068); /* print info dialog "Couldn't delete recording!" */ else - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19147}); /* print info dialog "Unknown error!" */ + CGUIDialogOK::ShowAndGetInput(19033, 19147); /* print info dialog "Unknown error!" */ return; } @@ -342,10 +329,6 @@ m_strRecordingId = tag.m_strRecordingId; m_iClientId = tag.m_iClientId; m_strTitle = tag.m_strTitle; - m_strShowTitle = tag.m_strShowTitle; - m_iSeason = tag.m_iSeason; - m_iEpisode = tag.m_iEpisode; - m_iYear = tag.m_iYear; m_recordingTime = tag.m_recordingTime; m_duration = tag.m_duration; m_iPriority = tag.m_iPriority; @@ -371,21 +354,19 @@ m_resumePoint.totalTimeInSeconds = tag.m_resumePoint.totalTimeInSeconds; } - //Old Method of identifying TV show title and subtitle using m_strDirectory and strPlotOutline (deprecated) std::string strShow = StringUtils::Format("%s - ", g_localizeStrings.Get(20364).c_str()); if (StringUtils::StartsWithNoCase(m_strPlotOutline, strShow)) { - CLog::Log(LOGDEBUG,"CPVRRecording::Update - PVR addon provides episode name in strPlotOutline which is deprecated"); std::string strEpisode = m_strPlotOutline; std::string strTitle = m_strDirectory; size_t pos = strTitle.rfind('/'); strTitle.erase(0, pos + 1); strEpisode.erase(0, strShow.size()); - m_strTitle = strTitle; + m_strTitle = StringUtils::Format("%s - %s", strTitle.c_str(), strEpisode.c_str()); pos = strEpisode.find('-'); strEpisode.erase(0, pos + 2); - m_strShowTitle = strEpisode; + m_strPlotOutline = strEpisode; } if (m_bIsDeleted) @@ -405,33 +386,17 @@ std::string strTitle(m_strTitle); std::string strDatetime(m_recordingTime.GetAsSaveString()); std::string strDirectory; - std::string strSubtitle; - std::string strSeasonEpisode; - if ((m_iSeason > -1 && m_iEpisode > -1 && (m_iSeason > 0 || m_iEpisode > 0))) - strSeasonEpisode = StringUtils::Format("s%02de%02d", m_iSeason, m_iEpisode); - std::string strYear(m_iYear > 0 ? StringUtils::Format(" (%i)", m_iYear) : ""); std::string strChannel; - StringUtils::Replace(strTitle, '/', ' '); + StringUtils::Replace(strTitle, '/',' '); if (!m_strDirectory.empty()) strDirectory = StringUtils::Format("%s/", m_strDirectory.c_str()); if (!m_strChannelName.empty()) { strChannel = StringUtils::Format(" (%s)", m_strChannelName.c_str()); - StringUtils::Replace(strChannel, '/', ' '); + StringUtils::Replace(strChannel, '/',' '); } - if (!m_strShowTitle.empty()) - { - strSubtitle = StringUtils::Format(" %s", m_strShowTitle.c_str()); - StringUtils::Replace(strSubtitle, '/', ' '); - } - if (!strSeasonEpisode.empty()) - strSeasonEpisode = StringUtils::Format(" %s", strSeasonEpisode.c_str()); - - m_strFileNameAndPath = StringUtils::Format("pvr://" PVR_RECORDING_BASE_PATH "/%s/%s%s%s%s%s, TV%s, %s.pvr", - m_bIsDeleted ? PVR_RECORDING_DELETED_PATH : PVR_RECORDING_ACTIVE_PATH, strDirectory.c_str(), - strTitle.c_str(), strSeasonEpisode.c_str(), strYear.c_str(), strSubtitle.c_str(), - strChannel.c_str(), strDatetime.c_str()); + m_strFileNameAndPath = StringUtils::Format("pvr://" PVR_RECORDING_BASE_PATH "/%s/%s%s, TV%s, %s.pvr", m_bIsDeleted ? PVR_RECORDING_DELETED_PATH : PVR_RECORDING_ACTIVE_PATH, strDirectory.c_str(), strTitle.c_str(), strChannel.c_str(), strDatetime.c_str()); } } @@ -468,7 +433,7 @@ { if (m_iEpgEventId) { - EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::GetInstance().GetTagById(m_iEpgEventId); + EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::Get().GetTagById(m_iEpgEventId); if (epgTag) return epgTag->ChannelTag(); } @@ -479,7 +444,7 @@ { if (m_iEpgEventId) { - EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::GetInstance().GetTagById(m_iEpgEventId); + EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::Get().GetTagById(m_iEpgEventId); return epgTag ? epgTag->HasRecording() : false; } return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/recordings/PVRRecording.h kodi-15.2~git20151019.1039-final/xbmc/pvr/recordings/PVRRecording.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/recordings/PVRRecording.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/recordings/PVRRecording.h 2015-10-19 08:39:16.000000000 +0000 @@ -22,29 +22,28 @@ /* * DESCRIPTION: * - * CPVRRecordingInfoTag is part of the Kodi PVR system to support recording entrys, + * CPVRRecordingInfoTag is part of the XBMC PVR system to support recording entrys, * stored on a other Backend like VDR or MythTV. * * The recording information tag holds data about name, length, recording time * and so on of recorded stream stored on the backend. * * The filename string is used to by the PVRManager and passed to DVDPlayer - * to stream data from the backend to Kodi. + * to stream data from the backend to XBMC. * * It is a also CVideoInfoTag and some of his variables must be set! * */ -#include "XBDateTime.h" #include "addons/include/xbmc_pvr_types.h" #include "video/VideoInfoTag.h" +#include "XBDateTime.h" #define PVR_RECORDING_BASE_PATH "recordings" #define PVR_RECORDING_DELETED_PATH "deleted" #define PVR_RECORDING_ACTIVE_PATH "active" class CVideoDatabase; -class CVariant; namespace PVR { @@ -209,7 +208,7 @@ /*! * @return Broadcast id of the EPG event associated with this recording */ - unsigned int EpgEvent(void) const { return m_iEpgEventId; } + int EpgEvent(void) const { return m_iEpgEventId; } /*! * @return Get the channel on which this recording is/was running @@ -223,17 +222,11 @@ */ bool IsBeingRecorded(void) const; - /*! - * @brief Retrieve the recording Episode Name - * @note Returns an empty string if no Episode Name was provided by the PVR client - */ - std::string EpisodeName(void) const { return m_strShowTitle; }; - private: - CDateTime m_recordingTime; /*!< start time of the recording */ - bool m_bGotMetaData; - bool m_bIsDeleted; /*!< set if entry is a deleted recording which can be undelete */ - unsigned int m_iEpgEventId; /*!< epg broadcast id associated with this recording */ + CDateTime m_recordingTime; /*!< start time of the recording */ + bool m_bGotMetaData; + bool m_bIsDeleted; /*!< set if entry is a deleted recording which can be undelete */ + int m_iEpgEventId; /*!< epg broadcast id associated with this recording */ void UpdatePath(void); void DisplayError(PVR_ERROR err) const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/recordings/PVRRecordings.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/recordings/PVRRecordings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/recordings/PVRRecordings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/recordings/PVRRecordings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,20 +18,20 @@ * */ -#include "PVRRecordings.h" - -#include - -#include "epg/EpgContainer.h" #include "FileItem.h" -#include "pvr/addons/PVRClients.h" -#include "pvr/PVRManager.h" -#include "threads/SingleLock.h" +#include "epg/EpgContainer.h" +#include "URL.h" #include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" +#include "threads/SingleLock.h" #include "video/VideoDatabase.h" +#include "utils/URIUtils.h" +#include "utils/StringUtils.h" + +#include "pvr/PVRManager.h" +#include "pvr/addons/PVRClients.h" +#include "PVRRecordings.h" + using namespace PVR; CPVRRecordings::CPVRRecordings(void) : @@ -502,7 +502,7 @@ newTag->Update(*tag); if (newTag->EpgEvent() > 0) { - EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::GetInstance().GetTagById(newTag->EpgEvent()); + EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::Get().GetTagById(newTag->EpgEvent()); if (epgTag) epgTag->SetRecording(newTag); } @@ -514,13 +514,13 @@ void CPVRRecordings::UpdateEpgTags(void) { CSingleLock lock(m_critSection); - unsigned int iEpgEvent; + int iEpgEvent; for (PVR_RECORDINGMAP_ITR it = m_recordings.begin(); it != m_recordings.end(); ++it) { iEpgEvent = it->second->EpgEvent(); if (iEpgEvent > 0 && !it->second->IsDeleted()) { - EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::GetInstance().GetTagById(iEpgEvent); + EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::Get().GetTagById(iEpgEvent); if (epgTag) epgTag->SetRecording(it->second); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/recordings/PVRRecordings.h kodi-15.2~git20151019.1039-final/xbmc/pvr/recordings/PVRRecordings.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/recordings/PVRRecordings.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/recordings/PVRRecordings.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,11 +19,10 @@ * */ -#include "FileItem.h" +#include "PVRRecording.h" #include "utils/Observer.h" #include "video/VideoDatabase.h" - -#include "PVRRecording.h" +#include "FileItem.h" #define PVR_ALL_RECORDINGS_PATH_EXTENSION "-1" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/Makefile kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/Makefile 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -1,5 +1,4 @@ SRCS=PVRTimerInfoTag.cpp \ - PVRTimerType.cpp \ PVRTimers.cpp LIB=pvrtimers.a diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimerInfoTag.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimerInfoTag.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimerInfoTag.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimerInfoTag.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,153 +21,75 @@ #include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogYesNo.h" -#include "epg/Epg.h" -#include "epg/EpgContainer.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "utils/log.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" +#include "PVRTimers.h" #include "pvr/PVRManager.h" -#include "pvr/addons/PVRClients.h" #include "pvr/channels/PVRChannelGroupsContainer.h" +#include "epg/EpgContainer.h" +#include "pvr/addons/PVRClients.h" -#include "PVRTimers.h" +#include "epg/Epg.h" using namespace PVR; using namespace EPG; -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; CPVRTimerInfoTag::CPVRTimerInfoTag(bool bRadio /* = false */) : m_strTitle(g_localizeStrings.Get(19056)), // New Timer - m_bFullTextEpgSearch(false) + m_strDirectory("/") { - m_iClientId = g_PVRClients->GetFirstConnectedClientID(); - m_iClientIndex = PVR_TIMER_NO_CLIENT_INDEX; - m_iParentClientIndex = PVR_TIMER_NO_PARENT; - m_iClientChannelUid = PVR_INVALID_CHANNEL_UID; - m_iPriority = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_DEFAULTPRIORITY); - m_iLifetime = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_DEFAULTLIFETIME); - m_iMaxRecordings = 0; - m_iPreventDupEpisodes = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_PREVENTDUPLICATEEPISODES); - m_iRecordingGroup = 0; - m_iChannelNumber = 0; - m_bIsRadio = bRadio; - m_iMarginStart = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_MARGINSTART); - m_iMarginEnd = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_MARGINEND); - m_iGenreType = 0; - m_iGenreSubType = 0; - m_StartTime = CDateTime::GetUTCDateTime(); - m_StopTime = m_StartTime; - m_bStartAnyTime = false; - m_bEndAnyTime = false; - m_state = PVR_TIMER_STATE_SCHEDULED; + m_iClientId = g_PVRClients->GetFirstConnectedClientID(); + m_iClientIndex = -1; + m_iClientChannelUid = PVR_INVALID_CHANNEL_UID; + m_iPriority = CSettings::Get().GetInt("pvrrecord.defaultpriority"); + m_iLifetime = CSettings::Get().GetInt("pvrrecord.defaultlifetime"); + m_bIsRepeating = false; + m_iWeekdays = 0; + m_iChannelNumber = 0; + m_bIsRadio = bRadio; + CEpgInfoTagPtr emptyTag; + m_epgTag = emptyTag; + m_iMarginStart = CSettings::Get().GetInt("pvrrecord.marginstart"); + m_iMarginEnd = CSettings::Get().GetInt("pvrrecord.marginend"); + m_iGenreType = 0; + m_iGenreSubType = 0; + m_StartTime = CDateTime::GetUTCDateTime(); + m_StopTime = m_StartTime; + m_state = PVR_TIMER_STATE_SCHEDULED; m_FirstDay.SetValid(false); - m_iTimerId = 0; - - if (g_PVRClients->SupportsTimers(m_iClientId)) - { - // default to manual one-shot timer for given client - CPVRTimerTypePtr type(CPVRTimerType::CreateFromAttributes( - PVR_TIMER_TYPE_IS_MANUAL, PVR_TIMER_TYPE_IS_REPEATING | PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES, m_iClientId)); - - if (!type) - { - // last resort. default to first available type from any client. - type = CPVRTimerType::GetFirstAvailableType(); - } - - if (type) - SetTimerType(type); - else - CLog::Log(LOGERROR, "%s: no timer type, although timers are supported by client %d!", __FUNCTION__, m_iClientId); - } - - m_iWeekdays = (m_timerType && m_timerType->IsRepeating()) ? PVR_WEEKDAY_ALLDAYS : PVR_WEEKDAY_NONE; + m_iTimerId = 0; } CPVRTimerInfoTag::CPVRTimerInfoTag(const PVR_TIMER &timer, const CPVRChannelPtr &channel, unsigned int iClientId) : m_strTitle(timer.strTitle), - m_strEpgSearchString(timer.strEpgSearchString), - m_bFullTextEpgSearch(timer.bFullTextEpgSearch), m_strDirectory(timer.strDirectory) { - m_iClientId = iClientId; - m_iClientIndex = timer.iClientIndex; - - if (m_iClientIndex == PVR_TIMER_NO_CLIENT_INDEX) - CLog::Log(LOGERROR, "%s: invalid client index supplied by client %d (must be > 0)!", __FUNCTION__, m_iClientId); - - m_iParentClientIndex = timer.iParentClientIndex; - m_iClientChannelUid = channel ? channel->UniqueID() : (timer.iClientChannelUid > 0) ? timer.iClientChannelUid : PVR_INVALID_CHANNEL_UID; - m_iChannelNumber = channel ? g_PVRChannelGroups->GetGroupAll(channel->IsRadio())->GetChannelNumber(channel) : 0; - m_StartTime = timer.startTime + g_advancedSettings.m_iPVRTimeCorrection; - m_StopTime = timer.endTime + g_advancedSettings.m_iPVRTimeCorrection; - m_bStartAnyTime = timer.bStartAnyTime; - m_bEndAnyTime = timer.bEndAnyTime; - m_iPreventDupEpisodes = timer.iPreventDuplicateEpisodes; - m_iRecordingGroup = timer.iRecordingGroup; - m_FirstDay = timer.firstDay + g_advancedSettings.m_iPVRTimeCorrection; - m_iWeekdays = timer.iWeekdays; - m_iPriority = timer.iPriority; - m_iLifetime = timer.iLifetime; - m_iMaxRecordings = timer.iMaxRecordings; - m_iMarginStart = timer.iMarginStart; - m_iMarginEnd = timer.iMarginEnd; - m_genre = StringUtils::Split(CEpg::ConvertGenreIdToString(timer.iGenreType, timer.iGenreSubType), g_advancedSettings.m_videoItemSeparator); - m_iGenreType = timer.iGenreType; - m_iGenreSubType = timer.iGenreSubType; - m_channel = channel; - m_bIsRadio = channel && channel->IsRadio(); - m_state = timer.state; - m_strFileNameAndPath = StringUtils::Format("pvr://client%i/timers/%i", m_iClientId, m_iClientIndex); - m_iTimerId = 0; - - if (g_PVRClients->SupportsTimers(m_iClientId)) - { - // begin compat section - - // Create timer type according to certain timer values already available in Isengard. - // This is for migration only and does not make changes to the addons obsolete. Addons should - // work and benefit from some UI changes (e.g. some of the timer settings dialog enhancements), - // but all old problems/bugs due to static attributes and values will remain the same as in - // Isengard. Also, new features (like epg search) are not available to addons automatically. - // This code can be removed once all addons actually support the respective PVR Addon API version. - if (timer.iTimerType == PVR_TIMER_TYPE_NONE) - { - // Create type according to certain timer values. - unsigned int iMustHave = PVR_TIMER_TYPE_ATTRIBUTE_NONE; - unsigned int iMustNotHave = PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES; - - if (timer.iEpgUid == PVR_TIMER_NO_EPG_UID && timer.iWeekdays != PVR_WEEKDAY_NONE) - iMustHave |= PVR_TIMER_TYPE_IS_REPEATING; - else - iMustNotHave |= PVR_TIMER_TYPE_IS_REPEATING; - - if (timer.iEpgUid == PVR_TIMER_NO_EPG_UID) - iMustHave |= PVR_TIMER_TYPE_IS_MANUAL; - else - iMustNotHave |= PVR_TIMER_TYPE_IS_MANUAL; - - CPVRTimerTypePtr type(CPVRTimerType::CreateFromAttributes(iMustHave, iMustNotHave, m_iClientId)); - - if (type) - SetTimerType(type); - } - // end compat section - else - { - SetTimerType(CPVRTimerType::CreateFromIds(timer.iTimerType, m_iClientId)); - } - - if (!m_timerType) - CLog::Log(LOGERROR, "%s: no timer type, although timers are supported by client %d!", __FUNCTION__, m_iClientId); - } + m_iClientId = iClientId; + m_iClientIndex = timer.iClientIndex; + m_iClientChannelUid = channel ? channel->UniqueID() : timer.iClientChannelUid; + m_iChannelNumber = channel ? g_PVRChannelGroups->GetGroupAll(channel->IsRadio())->GetChannelNumber(channel) : 0; + m_StartTime = timer.startTime + g_advancedSettings.m_iPVRTimeCorrection; + m_StopTime = timer.endTime + g_advancedSettings.m_iPVRTimeCorrection; + m_bIsRepeating = timer.bIsRepeating; + m_FirstDay = timer.firstDay + g_advancedSettings.m_iPVRTimeCorrection; + m_iWeekdays = timer.iWeekdays; + m_iPriority = timer.iPriority; + m_iLifetime = timer.iLifetime; + m_iMarginStart = timer.iMarginStart; + m_iMarginEnd = timer.iMarginEnd; + m_genre = StringUtils::Split(CEpg::ConvertGenreIdToString(timer.iGenreType, timer.iGenreSubType), g_advancedSettings.m_videoItemSeparator); + m_iGenreType = timer.iGenreType; + m_iGenreSubType = timer.iGenreSubType; + CEpgInfoTagPtr emptyTag; + m_epgTag = emptyTag; + m_channel = channel; + m_bIsRadio = channel && channel->IsRadio(); + m_state = timer.state; + m_strFileNameAndPath = StringUtils::Format("pvr://client%i/timers/%i", m_iClientId, m_iClientIndex); + m_iTimerId = 0; UpdateSummary(); } @@ -181,33 +103,25 @@ bChannelsMatch = false; return (bChannelsMatch && - m_iClientIndex == right.m_iClientIndex && - m_iParentClientIndex == right.m_iParentClientIndex && - m_strSummary == right.m_strSummary && - m_iClientChannelUid == right.m_iClientChannelUid && - m_bIsRadio == right.m_bIsRadio && - m_iPreventDupEpisodes == right.m_iPreventDupEpisodes && - m_iRecordingGroup == right.m_iRecordingGroup && - m_StartTime == right.m_StartTime && - m_StopTime == right.m_StopTime && - m_bStartAnyTime == right.m_bStartAnyTime && - m_bEndAnyTime == right.m_bEndAnyTime && - m_FirstDay == right.m_FirstDay && - m_iWeekdays == right.m_iWeekdays && - m_iPriority == right.m_iPriority && - m_iLifetime == right.m_iLifetime && - m_iMaxRecordings == right.m_iMaxRecordings && - m_strFileNameAndPath == right.m_strFileNameAndPath && - m_strTitle == right.m_strTitle && - m_strEpgSearchString == right.m_strEpgSearchString && - m_bFullTextEpgSearch == right.m_bFullTextEpgSearch && - m_strDirectory == right.m_strDirectory && - m_iClientId == right.m_iClientId && - m_iMarginStart == right.m_iMarginStart && - m_iMarginEnd == right.m_iMarginEnd && - m_state == right.m_state && - m_timerType == right.m_timerType && - m_iTimerId == right.m_iTimerId); + m_iClientIndex == right.m_iClientIndex && + m_strSummary == right.m_strSummary && + m_iClientChannelUid == right.m_iClientChannelUid && + m_bIsRadio == right.m_bIsRadio && + m_bIsRepeating == right.m_bIsRepeating && + m_StartTime == right.m_StartTime && + m_StopTime == right.m_StopTime && + m_FirstDay == right.m_FirstDay && + m_iWeekdays == right.m_iWeekdays && + m_iPriority == right.m_iPriority && + m_iLifetime == right.m_iLifetime && + m_strFileNameAndPath == right.m_strFileNameAndPath && + m_strTitle == right.m_strTitle && + m_strDirectory == right.m_strDirectory && + m_iClientId == right.m_iClientId && + m_iMarginStart == right.m_iMarginStart && + m_iMarginEnd == right.m_iMarginEnd && + m_state == right.m_state && + m_iTimerId == right.m_iTimerId); } CPVRTimerInfoTag::~CPVRTimerInfoTag(void) @@ -228,28 +142,26 @@ value["channelid"] = m_channel != NULL ? m_channel->ChannelID() : -1; value["summary"] = m_strSummary; value["isradio"] = m_bIsRadio; - value["preventduplicateepisodes"] = m_iPreventDupEpisodes; + value["repeating"] = m_bIsRepeating; value["starttime"] = m_StartTime.IsValid() ? m_StartTime.GetAsDBDateTime() : ""; value["endtime"] = m_StopTime.IsValid() ? m_StopTime.GetAsDBDateTime() : ""; - value["startanytime"] = m_bStartAnyTime; - value["endanytime"] = m_bEndAnyTime; value["runtime"] = m_StartTime.IsValid() && m_StopTime.IsValid() ? (m_StopTime - m_StartTime).GetSecondsTotal() : 0; value["firstday"] = m_FirstDay.IsValid() ? m_FirstDay.GetAsDBDate() : ""; CVariant weekdays(CVariant::VariantTypeArray); - if (m_iWeekdays & PVR_WEEKDAY_MONDAY) + if (m_iWeekdays & 0x01) weekdays.push_back("monday"); - if (m_iWeekdays & PVR_WEEKDAY_TUESDAY) + if (m_iWeekdays & 0x02) weekdays.push_back("tuesday"); - if (m_iWeekdays & PVR_WEEKDAY_WEDNESDAY) + if (m_iWeekdays & 0x04) weekdays.push_back("wednesday"); - if (m_iWeekdays & PVR_WEEKDAY_THURSDAY) + if (m_iWeekdays & 0x08) weekdays.push_back("thursday"); - if (m_iWeekdays & PVR_WEEKDAY_FRIDAY) + if (m_iWeekdays & 0x10) weekdays.push_back("friday"); - if (m_iWeekdays & PVR_WEEKDAY_SATURDAY) + if (m_iWeekdays & 0x20) weekdays.push_back("saturday"); - if (m_iWeekdays & PVR_WEEKDAY_SUNDAY) + if (m_iWeekdays & 0x40) weekdays.push_back("sunday"); value["weekdays"] = weekdays; @@ -291,36 +203,10 @@ case PVR_TIMER_STATE_ERROR: value["state"] = "error"; break; - case PVR_TIMER_STATE_DISABLED: - value["state"] = "disabled"; - break; default: value["state"] = "unknown"; break; } - - if (m_timerType) - { - if (m_timerType->IsManual()) - { - if (m_timerType->IsRepeating()) - value["type"] = "manual_repeating"; - else - value["type"] = "manual_once"; - } - else - { - if (m_timerType->IsRepeating()) - value["type"] = "epg_repeating"; - else - value["type"] = "epg_once"; - } - } - - value["epgsearchstring"] = m_strEpgSearchString; - value["fulltextepgsearch"] = m_bFullTextEpgSearch; - value["recordinggroup"] = m_iRecordingGroup; - value["maxrecordings"] = m_iMaxRecordings; } int CPVRTimerInfoTag::Compare(const CPVRTimerInfoTag &timer) const @@ -344,62 +230,49 @@ CSingleLock lock(m_critSection); m_strSummary.clear(); - const std::string startDate(StartAsLocalTime().GetAsLocalizedDate()); - const std::string endDate(EndAsLocalTime().GetAsLocalizedDate()); - - if (m_bEndAnyTime) - { - m_strSummary = StringUtils::Format("%s %s %s", - m_iWeekdays != PVR_WEEKDAY_NONE ? - GetWeekdaysString().c_str() : startDate.c_str(), //for "Any day" set PVR_WEEKDAY_ALLDAYS - g_localizeStrings.Get(19107).c_str(), // "at" - m_bStartAnyTime ? - g_localizeStrings.Get(19161).c_str() /* "any time" */ : StartAsLocalTime().GetAsLocalizedTime("", false).c_str()); - } - else if ((m_iWeekdays != PVR_WEEKDAY_NONE) || (startDate == endDate)) + if (!m_bIsRepeating || !m_iWeekdays) { m_strSummary = StringUtils::Format("%s %s %s %s %s", - m_iWeekdays != PVR_WEEKDAY_NONE ? - GetWeekdaysString().c_str() : startDate.c_str(), //for "Any day" set PVR_WEEKDAY_ALLDAYS - g_localizeStrings.Get(19159).c_str(), // "from" - m_bStartAnyTime ? - g_localizeStrings.Get(19161).c_str() /* "any time" */ : StartAsLocalTime().GetAsLocalizedTime("", false).c_str(), - g_localizeStrings.Get(19160).c_str(), // "to" - m_bEndAnyTime ? - g_localizeStrings.Get(19161).c_str() /* "any time" */ : EndAsLocalTime().GetAsLocalizedTime("", false).c_str()); + StartAsLocalTime().GetAsLocalizedDate().c_str(), + g_localizeStrings.Get(19159).c_str(), + StartAsLocalTime().GetAsLocalizedTime("", false).c_str(), + g_localizeStrings.Get(19160).c_str(), + EndAsLocalTime().GetAsLocalizedTime("", false).c_str()); + } + else if (m_FirstDay.IsValid()) + { + m_strSummary = StringUtils::Format("%s-%s-%s-%s-%s-%s-%s %s %s %s %s %s %s", + m_iWeekdays & 0x01 ? g_localizeStrings.Get(19149).c_str() : "__", + m_iWeekdays & 0x02 ? g_localizeStrings.Get(19150).c_str() : "__", + m_iWeekdays & 0x04 ? g_localizeStrings.Get(19151).c_str() : "__", + m_iWeekdays & 0x08 ? g_localizeStrings.Get(19152).c_str() : "__", + m_iWeekdays & 0x10 ? g_localizeStrings.Get(19153).c_str() : "__", + m_iWeekdays & 0x20 ? g_localizeStrings.Get(19154).c_str() : "__", + m_iWeekdays & 0x40 ? g_localizeStrings.Get(19155).c_str() : "__", + g_localizeStrings.Get(19156).c_str(), + FirstDayAsLocalTime().GetAsLocalizedDate(false).c_str(), + g_localizeStrings.Get(19159).c_str(), + StartAsLocalTime().GetAsLocalizedTime("", false).c_str(), + g_localizeStrings.Get(19160).c_str(), + EndAsLocalTime().GetAsLocalizedTime("", false).c_str()); } else { - m_strSummary = StringUtils::Format("%s %s %s %s %s %s", - startDate.c_str(), - g_localizeStrings.Get(19159).c_str(), // "from" - m_bStartAnyTime ? - g_localizeStrings.Get(19161).c_str() /* "any time" */ : StartAsLocalTime().GetAsLocalizedTime("", false).c_str(), - g_localizeStrings.Get(19160).c_str(), // "to" - endDate.c_str(), - m_bEndAnyTime ? - g_localizeStrings.Get(19161).c_str() /* "any time" */ : EndAsLocalTime().GetAsLocalizedTime("", false).c_str()); + m_strSummary = StringUtils::Format("%s-%s-%s-%s-%s-%s-%s %s %s %s %s", + m_iWeekdays & 0x01 ? g_localizeStrings.Get(19149).c_str() : "__", + m_iWeekdays & 0x02 ? g_localizeStrings.Get(19150).c_str() : "__", + m_iWeekdays & 0x04 ? g_localizeStrings.Get(19151).c_str() : "__", + m_iWeekdays & 0x08 ? g_localizeStrings.Get(19152).c_str() : "__", + m_iWeekdays & 0x10 ? g_localizeStrings.Get(19153).c_str() : "__", + m_iWeekdays & 0x20 ? g_localizeStrings.Get(19154).c_str() : "__", + m_iWeekdays & 0x40 ? g_localizeStrings.Get(19155).c_str() : "__", + g_localizeStrings.Get(19159).c_str(), + StartAsLocalTime().GetAsLocalizedTime("", false).c_str(), + g_localizeStrings.Get(19160).c_str(), + EndAsLocalTime().GetAsLocalizedTime("", false).c_str()); } } -void CPVRTimerInfoTag::SetTimerType(const CPVRTimerTypePtr &type) -{ - CSingleLock lock(m_critSection); - m_timerType = type; - - if (m_timerType && m_iClientIndex == PVR_TIMER_NO_CLIENT_INDEX) - { - m_iPriority = m_timerType->GetPriorityDefault(); - m_iLifetime = m_timerType->GetLifetimeDefault(); - m_iMaxRecordings = m_timerType->GetMaxRecordingsDefault(); - m_iPreventDupEpisodes = m_timerType->GetPreventDuplicateEpisodesDefault(); - m_iRecordingGroup = m_timerType->GetRecordingGroupDefault(); - } - - if (m_timerType && !m_timerType->IsRepeating()) - m_iWeekdays = PVR_WEEKDAY_NONE; -} - /** * Get the status string of this Timer, is used by the GUIInfoManager */ @@ -407,7 +280,7 @@ { std::string strReturn = g_localizeStrings.Get(305); CSingleLock lock(m_critSection); - if (URIUtils::PathEquals(m_strFileNameAndPath, CPVRTimersPath::PATH_ADDTIMER)) + if (URIUtils::PathEquals(m_strFileNameAndPath, "pvr://timers/addtimer/")) strReturn = g_localizeStrings.Get(19026); else if (m_state == PVR_TIMER_STATE_CANCELLED || m_state == PVR_TIMER_STATE_ABORTED) strReturn = g_localizeStrings.Get(13106); @@ -419,106 +292,10 @@ strReturn = g_localizeStrings.Get(19276); else if (m_state == PVR_TIMER_STATE_ERROR) strReturn = g_localizeStrings.Get(257); - else if (m_state == PVR_TIMER_STATE_DISABLED) - strReturn = g_localizeStrings.Get(13106); - - return strReturn; -} - -/** - * Get the type string of this timer - */ -std::string CPVRTimerInfoTag::GetTypeAsString() const -{ - CSingleLock lock(m_critSection); - return m_timerType ? m_timerType->GetDescription() : ""; -} -namespace -{ -void AppendDay(std::string &strReturn, unsigned int iId) -{ - if (!strReturn.empty()) - strReturn += "-"; - - if (iId > 0) - strReturn += g_localizeStrings.Get(iId).c_str(); - else - strReturn += "__"; -} -} // unnamed namespace - -std::string CPVRTimerInfoTag::GetWeekdaysString(unsigned int iWeekdays, bool bEpgBased, bool bLongMultiDaysFormat) -{ - std::string strReturn; - - if (iWeekdays == PVR_WEEKDAY_NONE) - return strReturn; - else if (iWeekdays == PVR_WEEKDAY_ALLDAYS) - strReturn = bEpgBased - ? g_localizeStrings.Get(807) // "Any day" - : g_localizeStrings.Get(808); // "Every day" - else if (iWeekdays == PVR_WEEKDAY_MONDAY) - strReturn = g_localizeStrings.Get(831); // "Mondays" - else if (iWeekdays == PVR_WEEKDAY_TUESDAY) - strReturn = g_localizeStrings.Get(832); // "Tuesdays" - else if (iWeekdays == PVR_WEEKDAY_WEDNESDAY) - strReturn = g_localizeStrings.Get(833); // "Wednesdays" - else if (iWeekdays == PVR_WEEKDAY_THURSDAY) - strReturn = g_localizeStrings.Get(834); // "Thursdays" - else if (iWeekdays == PVR_WEEKDAY_FRIDAY) - strReturn = g_localizeStrings.Get(835); // "Fridays" - else if (iWeekdays == PVR_WEEKDAY_SATURDAY) - strReturn = g_localizeStrings.Get(836); // "Saturdays" - else if (iWeekdays == PVR_WEEKDAY_SUNDAY) - strReturn = g_localizeStrings.Get(837); // "Sundays" - else - { - // Any other combination. Assemble custom string. - if (iWeekdays & PVR_WEEKDAY_MONDAY) - AppendDay(strReturn, 19149); // Mo - else if (bLongMultiDaysFormat) - AppendDay(strReturn, 0); - - if (iWeekdays & PVR_WEEKDAY_TUESDAY) - AppendDay(strReturn, 19150); // Tu - else if (bLongMultiDaysFormat) - AppendDay(strReturn, 0); - - if (iWeekdays & PVR_WEEKDAY_WEDNESDAY) - AppendDay(strReturn, 19151); // We - else if (bLongMultiDaysFormat) - AppendDay(strReturn, 0); - - if (iWeekdays & PVR_WEEKDAY_THURSDAY) - AppendDay(strReturn, 19152); // Th - else if (bLongMultiDaysFormat) - AppendDay(strReturn, 0); - - if (iWeekdays & PVR_WEEKDAY_FRIDAY) - AppendDay(strReturn, 19153); // Fr - else if (bLongMultiDaysFormat) - AppendDay(strReturn, 0); - - if (iWeekdays & PVR_WEEKDAY_SATURDAY) - AppendDay(strReturn, 19154); // Sa - else if (bLongMultiDaysFormat) - AppendDay(strReturn, 0); - - if (iWeekdays & PVR_WEEKDAY_SUNDAY) - AppendDay(strReturn, 19155); // So - else if (bLongMultiDaysFormat) - AppendDay(strReturn, 0); - } return strReturn; } -std::string CPVRTimerInfoTag::GetWeekdaysString() const -{ - CSingleLock lock(m_critSection); - return GetWeekdaysString(m_iWeekdays, m_timerType ? m_timerType->IsEpgBased() : false, false); -} - bool CPVRTimerInfoTag::AddToClient(void) const { PVR_ERROR error = g_PVRClients->AddTimer(*this); @@ -537,7 +314,7 @@ if (error == PVR_ERROR_RECORDING_RUNNING) { // recording running. ask the user if it should be deleted anyway - if (HELPERS::ShowYesNoDialogText(CVariant{122}, CVariant{19122}) != DialogResponse::YES) + if (!CGUIDialogYesNo::ShowAndGetInput(122, 19122)) return false; error = g_PVRClients->DeleteTimer(*this, true); @@ -577,37 +354,28 @@ { CSingleLock lock(m_critSection); - m_iClientId = tag->m_iClientId; - m_iClientIndex = tag->m_iClientIndex; - m_iParentClientIndex = tag->m_iParentClientIndex; - m_strTitle = tag->m_strTitle; - m_strEpgSearchString = tag->m_strEpgSearchString; - m_bFullTextEpgSearch = tag->m_bFullTextEpgSearch; - m_strDirectory = tag->m_strDirectory; - m_iClientChannelUid = tag->m_iClientChannelUid; - m_StartTime = tag->m_StartTime; - m_StopTime = tag->m_StopTime; - m_bStartAnyTime = tag->m_bStartAnyTime; - m_bEndAnyTime = tag->m_bEndAnyTime; - m_FirstDay = tag->m_FirstDay; - m_iPriority = tag->m_iPriority; - m_iLifetime = tag->m_iLifetime; - m_iMaxRecordings = tag->m_iMaxRecordings; - m_state = tag->m_state; - m_iPreventDupEpisodes = tag->m_iPreventDupEpisodes; - m_iRecordingGroup = tag->m_iRecordingGroup; - m_iWeekdays = tag->m_iWeekdays; - m_iChannelNumber = tag->m_iChannelNumber; - m_bIsRadio = tag->m_bIsRadio; - m_iMarginStart = tag->m_iMarginStart; - m_iMarginEnd = tag->m_iMarginEnd; - m_epgTag = tag->m_epgTag; - m_genre = tag->m_genre; - m_iGenreType = tag->m_iGenreType; - m_iGenreSubType = tag->m_iGenreSubType; - m_strSummary = tag->m_strSummary; - - SetTimerType(tag->m_timerType); + m_iClientId = tag->m_iClientId; + m_iClientIndex = tag->m_iClientIndex; + m_strTitle = tag->m_strTitle; + m_strDirectory = tag->m_strDirectory; + m_iClientChannelUid = tag->m_iClientChannelUid; + m_StartTime = tag->m_StartTime; + m_StopTime = tag->m_StopTime; + m_FirstDay = tag->m_FirstDay; + m_iPriority = tag->m_iPriority; + m_iLifetime = tag->m_iLifetime; + m_state = tag->m_state; + m_bIsRepeating = tag->m_bIsRepeating; + m_iWeekdays = tag->m_iWeekdays; + m_iChannelNumber = tag->m_iChannelNumber; + m_bIsRadio = tag->m_bIsRadio; + m_iMarginStart = tag->m_iMarginStart; + m_iMarginEnd = tag->m_iMarginEnd; + m_epgTag = tag->m_epgTag; + m_genre = tag->m_genre; + m_iGenreType = tag->m_iGenreType; + m_iGenreSubType = tag->m_iGenreSubType; + m_strSummary = tag->m_strSummary; if (m_strSummary.empty()) UpdateSummary(); @@ -630,22 +398,22 @@ void CPVRTimerInfoTag::DisplayError(PVR_ERROR err) const { if (err == PVR_ERROR_SERVER_ERROR) - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19111}); /* print info dialog "Server error!" */ + CGUIDialogOK::ShowAndGetInput(19033, 19111); /* print info dialog "Server error!" */ else if (err == PVR_ERROR_REJECTED) - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19109}); /* print info dialog "Couldn't save timer!" */ + CGUIDialogOK::ShowAndGetInput(19033, 19109); /* print info dialog "Couldn't save timer!" */ else if (err == PVR_ERROR_ALREADY_PRESENT) - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19067}); /* print info dialog */ + CGUIDialogOK::ShowAndGetInput(19033, 19067); /* print info dialog */ else - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19110}); /* print info dialog "Unknown error!" */ + CGUIDialogOK::ShowAndGetInput(19033, 19110); /* print info dialog "Unknown error!" */ } void CPVRTimerInfoTag::SetEpgInfoTag(CEpgInfoTagPtr &tag) { CSingleLock lock(m_critSection); if (tag && *m_epgTag != *tag) - CLog::Log(LOGINFO, "CPVRTimerInfoTag: timer %s set to epg event %s", m_strTitle.c_str(), tag->Title().c_str()); + CLog::Log(LOGINFO, "cPVRTimerInfoTag: timer %s set to epg event %s", m_strTitle.c_str(), tag->Title().c_str()); else if (!tag && m_epgTag) - CLog::Log(LOGINFO, "CPVRTimerInfoTag: timer %s set to no epg event", m_strTitle.c_str()); + CLog::Log(LOGINFO, "cPVRTimerInfoTag: timer %s set to no epg event", m_strTitle.c_str()); m_epgTag = tag; } @@ -661,9 +429,6 @@ CPVRChannelPtr channeltag = ChannelTag(); if (channeltag) strReturn = channeltag->ChannelName(); - else if (m_timerType && m_timerType->IsRepeatingEpgBased()) - strReturn = StringUtils::Format("(%s)", g_localizeStrings.Get(809).c_str()); // "Any channel" - return strReturn; } @@ -688,10 +453,15 @@ return false; } -CPVRTimerInfoTagPtr CPVRTimerInfoTag::CreateFromEpg(const CEpgInfoTagPtr &tag, bool bRepeating /* = false */) +CPVRTimerInfoTagPtr CPVRTimerInfoTag::CreateFromEpg(const CEpgInfoTagPtr &tag) { /* create a new timer */ CPVRTimerInfoTagPtr newTag(new CPVRTimerInfoTag()); + if (!newTag) + { + CLog::Log(LOGERROR, "%s - couldn't create new timer", __FUNCTION__); + return CPVRTimerInfoTagPtr(); + } /* check if a valid channel is set */ CPVRChannelPtr channel = tag->ChannelTag(); @@ -711,46 +481,36 @@ /* set the timer data */ CDateTime newStart = tag->StartAsUTC(); CDateTime newEnd = tag->EndAsUTC(); - newTag->m_iClientIndex = PVR_TIMER_NO_CLIENT_INDEX; - newTag->m_iParentClientIndex = PVR_TIMER_NO_PARENT; - newTag->m_strTitle = tag->Title().empty() ? channel->ChannelName() : tag->Title(); - newTag->m_iChannelNumber = channel->ChannelNumber(); - newTag->m_iClientChannelUid = channel->UniqueID(); - newTag->m_iClientId = channel->ClientID(); - newTag->m_bIsRadio = channel->IsRadio(); - newTag->m_iGenreType = tag->GenreType(); - newTag->m_iGenreSubType = tag->GenreSubType(); - newTag->m_channel = channel; + newTag->m_iClientIndex = -1; + newTag->m_strTitle = tag->Title().empty() ? channel->ChannelName() : tag->Title(); + newTag->m_iChannelNumber = channel->ChannelNumber(); + newTag->m_iClientChannelUid = channel->UniqueID(); + newTag->m_iClientId = channel->ClientID(); + newTag->m_bIsRadio = channel->IsRadio(); + newTag->m_iGenreType = tag->GenreType(); + newTag->m_iGenreSubType = tag->GenreSubType(); + newTag->m_channel = channel; newTag->SetStartFromUTC(newStart); newTag->SetEndFromUTC(newEnd); - CPVRTimerTypePtr timerType; - if (bRepeating) + if (tag->Plot().empty()) { - // create repeating epg-based timer - timerType = CPVRTimerType::CreateFromAttributes( - PVR_TIMER_TYPE_IS_REPEATING, - PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES, channel->ClientID()); + newTag->m_strSummary= StringUtils::Format("%s %s %s %s %s", + newTag->StartAsLocalTime().GetAsLocalizedDate().c_str(), + g_localizeStrings.Get(19159).c_str(), + newTag->StartAsLocalTime().GetAsLocalizedTime("", false).c_str(), + g_localizeStrings.Get(19160).c_str(), + newTag->EndAsLocalTime().GetAsLocalizedTime("", false).c_str()); } - if (!timerType) + else { - // create one-shot epg-based timer - timerType = CPVRTimerType::CreateFromAttributes( - PVR_TIMER_TYPE_ATTRIBUTE_NONE, - PVR_TIMER_TYPE_IS_REPEATING | PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES, channel->ClientID()); - } - if (!timerType) - { - CLog::Log(LOGERROR, "%s - unable to create any epg-based timer type", __FUNCTION__); - return CPVRTimerInfoTagPtr(); + newTag->m_strSummary = tag->Plot(); } - newTag->SetTimerType(timerType); - newTag->UpdateSummary(); newTag->m_epgTag = g_EpgContainer.GetById(tag->EpgID())->GetTag(tag->StartAsUTC()); /* unused only for reference */ - newTag->m_strFileNameAndPath = CPVRTimersPath::PATH_NEW; + newTag->m_strFileNameAndPath = "pvr://timers/new"; return newTag; } @@ -797,69 +557,51 @@ void CPVRTimerInfoTag::GetNotificationText(std::string &strText) const { CSingleLock lock(m_critSection); - - int stringID = 0; - switch (m_state) { case PVR_TIMER_STATE_ABORTED: case PVR_TIMER_STATE_CANCELLED: - stringID = 19224; // Recording aborted + strText = StringUtils::Format("%s: '%s'", g_localizeStrings.Get(19224).c_str(), m_strTitle.c_str()); break; case PVR_TIMER_STATE_SCHEDULED: - if (IsRepeating()) - stringID = 19058; // Timer enabled - else - stringID = 19225; // Recording scheduled + strText = StringUtils::Format("%s: '%s'", g_localizeStrings.Get(19225).c_str(), m_strTitle.c_str()); break; case PVR_TIMER_STATE_RECORDING: - stringID = 19226; // Recording started + strText = StringUtils::Format("%s: '%s'", g_localizeStrings.Get(19226).c_str(), m_strTitle.c_str()); break; case PVR_TIMER_STATE_COMPLETED: - stringID = 19227; // Recording completed + strText = StringUtils::Format("%s: '%s'", g_localizeStrings.Get(19227).c_str(), m_strTitle.c_str()); break; case PVR_TIMER_STATE_CONFLICT_OK: case PVR_TIMER_STATE_CONFLICT_NOK: - stringID = 19277; // Recording conflict + strText = StringUtils::Format("%s: '%s'", g_localizeStrings.Get(19277).c_str(), m_strTitle.c_str()); break; case PVR_TIMER_STATE_ERROR: - stringID = 19278; // Recording error - break; - case PVR_TIMER_STATE_DISABLED: - stringID = 19057; // Timer disabled + strText = StringUtils::Format("%s: '%s'", g_localizeStrings.Get(19278).c_str(), m_strTitle.c_str()); break; default: break; } - if (stringID != 0) - strText = StringUtils::Format("%s: '%s'", g_localizeStrings.Get(stringID).c_str(), m_strTitle.c_str()); } std::string CPVRTimerInfoTag::GetDeletedNotificationText() const { CSingleLock lock(m_critSection); - int stringID = 0; // The state in this case is the state the timer had when it was last seen switch (m_state) { case PVR_TIMER_STATE_RECORDING: - stringID = 19227; // Recording completed - break; + return StringUtils::Format("%s: '%s'", g_localizeStrings.Get(19227).c_str(), m_strTitle.c_str()); // Recording completed case PVR_TIMER_STATE_SCHEDULED: default: - if (IsRepeating()) - stringID = 828; // Repeating timer deleted - else - stringID = 19228; // Timer deleted + return StringUtils::Format("%s: '%s'", g_localizeStrings.Get(19228).c_str(), m_strTitle.c_str()); // Timer deleted } - - return StringUtils::Format("%s: '%s'", g_localizeStrings.Get(stringID).c_str(), m_strTitle.c_str()); } void CPVRTimerInfoTag::QueueNotification(void) const { - if (CSettings::GetInstance().GetBool(CSettings::SETTING_PVRRECORD_TIMERNOTIFICATIONS)) + if (CSettings::Get().GetBool("pvrrecord.timernotifications")) { std::string strMessage; GetNotificationText(strMessage); @@ -879,16 +621,9 @@ return m_epgTag != NULL; } -bool CPVRTimerInfoTag::HasSeriesEpgInfoTag(void) const +bool CPVRTimerInfoTag::SupportsFolders() const { - if (m_epgTag && - (m_epgTag->IsSeries() || - m_epgTag->SeriesNumber() > 0 || - m_epgTag->EpisodeNumber() > 0 || - m_epgTag->EpisodePart() > 0)) - return true; - else - return false; + return g_PVRClients->SupportsRecordingFolders(m_iClientId); } void CPVRTimerInfoTag::ClearEpgTag(void) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimerInfoTag.h kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimerInfoTag.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimerInfoTag.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimerInfoTag.h 2015-10-19 08:39:16.000000000 +0000 @@ -37,16 +37,13 @@ * number of the tag reported by the PVR backend and can not be played! */ -#include - +#include "XBDateTime.h" #include "addons/include/xbmc_pvr_types.h" -#include "pvr/timers/PVRTimerType.h" -#include "threads/CriticalSection.h" #include "utils/ISerializable.h" -#include "XBDateTime.h" + +#include class CFileItem; -class CVariant; namespace EPG { @@ -93,22 +90,16 @@ void DisplayError(PVR_ERROR err) const; std::string GetStatus() const; - std::string GetTypeAsString() const; bool SetDuration(int iDuration); - static CPVRTimerInfoTagPtr CreateFromEpg(const EPG::CEpgInfoTagPtr &tag, bool bRepeating = false); + static CPVRTimerInfoTagPtr CreateFromEpg(const EPG::CEpgInfoTagPtr &tag); EPG::CEpgInfoTagPtr GetEpgInfoTag(void) const; /*! * @return True if this timer has a corresponding epg info tag, false otherwise */ bool HasEpgInfoTag() const; - /*! - * @return True if this timer has corresponding epg info tag with series attributes, false otherwise - */ - bool HasSeriesEpgInfoTag() const; - int ChannelNumber(void) const; std::string ChannelName(void) const; std::string ChannelIcon(void) const; @@ -127,47 +118,8 @@ || m_state == PVR_TIMER_STATE_ERROR; } - /*! - * @return True if this timer won't result in a recording because it is broken for some reason, false otherwise - */ - bool IsBroken(void) const - { - return m_state == PVR_TIMER_STATE_CONFLICT_NOK - || m_state == PVR_TIMER_STATE_ERROR; - } - bool IsRecording(void) const { return m_state == PVR_TIMER_STATE_RECORDING; } - /*! - * @brief Checks whether this timer has a timer type. - * @return True if this timer has a timer type, false otherwise - */ - bool HasTimerType(void) const { return m_timerType.get() != NULL; } - - /*! - * @brief Gets the type of this timer. - * @return the timer type or NULL if this tag has no timer type. - */ - const CPVRTimerTypePtr GetTimerType() const { return m_timerType; } - - /*! - * @brief Sets the type of this timer. - * @param the new timer type. - */ - void SetTimerType(const CPVRTimerTypePtr &type); - - /*! - * @brief Checks whether this is a repeating (vs. one-shot) timer. - * @return True if this is a repeating timer, false otherwise. - */ - bool IsRepeating(void) const { return m_timerType && m_timerType->IsRepeating(); } - - /*! - * @brief Checks whether this is a manual (vs. epg-based) timer. - * @return True if this is a manual timer, false otherwise. - */ - bool IsManual(void) const { return m_timerType && m_timerType->IsManual(); } - CDateTime StartAsUTC(void) const; CDateTime StartAsLocalTime(void) const; void SetStartFromUTC(CDateTime &start) { m_StartTime = start; } @@ -189,6 +141,8 @@ unsigned int MarginEnd(void) const { return m_iMarginEnd; } void SetMarginEnd(unsigned int iMinutes) { m_iMarginEnd = iMinutes; } + bool SupportsFolders() const; + /*! * @brief Show a notification for this timer in the UI */ @@ -220,59 +174,34 @@ void UpdateChannel(void); - /*! - * @brief Return string representation for any possible combination of weekdays. - * @param iWeekdays weekdays as bit mask (0x01 = Mo, 0x02 = Tu, ...) - * @param bEpgBased context is an epg-based timer - * @param bLongMultiDaysFormat use long format. ("Mo-__-We-__-Fr-Sa-__" vs. "Mo-We-Fr-Sa") - * @return the weekdays string representation - */ - static std::string GetWeekdaysString(unsigned int iWeekdays, bool bEpgBased, bool bLongMultiDaysFormat); - - /*! - * @brief For timers scheduled by repeated timers, return the id of the parent. - * @return the id of the timer schedule or 0 in case the timer was not scheduled by a repeating timer. - */ - unsigned int GetTimerScheduleId() const { return m_iParentClientIndex; } - - std::string m_strTitle; /*!< @brief name of this timer */ - std::string m_strEpgSearchString; /*!< @brief a epg data match string for repeating epg-based timers. Format is backend-dependent, for example regexp */ - bool m_bFullTextEpgSearch; /*!< @brief indicates whether only epg episode title can be matched by the pvr backend or "more" (backend-dependent") data. */ - std::string m_strDirectory; /*!< @brief directory where the recording must be stored */ - std::string m_strSummary; /*!< @brief summary string with the time to show inside a GUI list */ - PVR_TIMER_STATE m_state; /*!< @brief the state of this timer */ - int m_iClientId; /*!< @brief ID of the backend */ - unsigned int m_iClientIndex; /*!< @brief index number of the tag, given by the backend, PVR_TIMER_NO_CLIENT_INDEX for new */ - unsigned int m_iParentClientIndex; /*!< @brief for timers scheduled by repeated timers, the index number of the parent, given by the backend, PVR_TIMER_NO_PARENT for no parent */ - int m_iClientChannelUid; /*!< @brief channel uid */ - bool m_bStartAnyTime; /*!< @brief Ignore start date and time clock. Record at 'Any Time' */ - bool m_bEndAnyTime; /*!< @brief Ignore end date and time clock. Record at 'Any Time' */ - int m_iPriority; /*!< @brief priority of the timer */ - int m_iLifetime; /*!< @brief lifetime of the timer in days */ - int m_iMaxRecordings; /*!< @brief (optional) backend setting for maximum number of recordings to keep*/ - unsigned int m_iWeekdays; /*!< @brief bit based store of weekdays for repeating timers */ - unsigned int m_iPreventDupEpisodes; /*!< @brief only record new episodes for repeating epg based timers */ - unsigned int m_iRecordingGroup; /*!< @brief (optional) if set, the addon/backend stores the recording to a group (sub-folder) */ - std::string m_strFileNameAndPath; /*!< @brief file name is only for reference */ - int m_iChannelNumber; /*!< @brief integer value of the channel number */ - bool m_bIsRadio; /*!< @brief is radio channel if set */ - unsigned int m_iTimerId; /*!< @brief id that won't change as long as XBMC is running */ + std::string m_strTitle; /*!< @brief name of this timer */ + std::string m_strDirectory; /*!< @brief directory where the recording must be stored */ + std::string m_strSummary; /*!< @brief summary string with the time to show inside a GUI list */ + PVR_TIMER_STATE m_state; /*!< @brief the state of this timer */ + int m_iClientId; /*!< @brief ID of the backend */ + int m_iClientIndex; /*!< @brief index number of the tag, given by the backend, -1 for new */ + int m_iClientChannelUid; /*!< @brief channel uid */ + int m_iPriority; /*!< @brief priority of the timer */ + int m_iLifetime; /*!< @brief lifetime of the timer in days */ + bool m_bIsRepeating; /*!< @brief repeating timer if true, use the m_FirstDay and repeat flags */ + int m_iWeekdays; /*!< @brief bit based store of weekdays to repeat */ + std::string m_strFileNameAndPath; /*!< @brief filename is only for reference */ + int m_iChannelNumber; /*!< @brief integer value of the channel number */ + bool m_bIsRadio; /*!< @brief is radio channel if set */ + unsigned int m_iTimerId; /*!< @brief id that won't change as long as XBMC is running */ CPVRChannelPtr m_channel; - unsigned int m_iMarginStart; /*!< @brief (optional) if set, the backend starts the recording iMarginStart minutes before startTime. */ - unsigned int m_iMarginEnd; /*!< @brief (optional) if set, the backend ends the recording iMarginEnd minutes after endTime. */ - std::vector m_genre; /*!< @brief genre of the timer */ - int m_iGenreType; /*!< @brief genre type of the timer */ - int m_iGenreSubType; /*!< @brief genre subtype of the timer */ + unsigned int m_iMarginStart; /*!< @brief (optional) if set, the backend starts the recording iMarginStart minutes before startTime. */ + unsigned int m_iMarginEnd; /*!< @brief (optional) if set, the backend ends the recording iMarginEnd minutes after endTime. */ + std::vector m_genre; /*!< @brief genre of the timer */ + int m_iGenreType; /*!< @brief genre type of the timer */ + int m_iGenreSubType; /*!< @brief genre subtype of the timer */ private: - std::string GetWeekdaysString() const; - CCriticalSection m_critSection; EPG::CEpgInfoTagPtr m_epgTag; CDateTime m_StartTime; /*!< start time */ CDateTime m_StopTime; /*!< stop time */ - CDateTime m_FirstDay; /*!< if it is a manual repeating timer the first date it starts */ - CPVRTimerTypePtr m_timerType; /*!< the type of this timer */ + CDateTime m_FirstDay; /*!< if it is a repeating timer the first date it starts */ }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimers.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimers.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimers.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimers.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,24 +18,22 @@ * */ -#include "PVRTimers.h" - -#include -#include -#include - -#include "dialogs/GUIDialogKaiToast.h" -#include "dialogs/GUIDialogOK.h" -#include "epg/EpgContainer.h" #include "FileItem.h" -#include "pvr/addons/PVRClients.h" -#include "pvr/channels/PVRChannelGroupsContainer.h" -#include "pvr/PVRManager.h" #include "settings/Settings.h" +#include "dialogs/GUIDialogKaiToast.h" +#include "dialogs/GUIDialogOK.h" #include "threads/SingleLock.h" #include "utils/log.h" +#include "utils/URIUtils.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" + +#include "PVRTimers.h" +#include "pvr/PVRManager.h" +#include "pvr/channels/PVRChannelGroupsContainer.h" +#include "epg/EpgContainer.h" +#include "pvr/addons/PVRClients.h" + +#include using namespace PVR; using namespace EPG; @@ -143,11 +141,11 @@ UpdateEpgEvent(newTimer); VecTimerInfoTag* addEntry = NULL; - MapTags::iterator itr = m_tags.find(newTimer->m_bStartAnyTime ? CDateTime() : newTimer->StartAsUTC()); + MapTags::iterator itr = m_tags.find(newTimer->StartAsUTC()); if (itr == m_tags.end()) { addEntry = new VecTimerInfoTag; - m_tags.insert(std::make_pair(newTimer->m_bStartAnyTime ? CDateTime() : newTimer->StartAsUTC(), addEntry)); + m_tags.insert(std::make_pair(newTimer->StartAsUTC(), addEntry)); } else { @@ -198,8 +196,7 @@ bChanged = true; bAddedOrDeleted = true; } - else if ((timer->m_bStartAnyTime && it->first != CDateTime()) || - (!timer->m_bStartAnyTime && timer->StartAsUTC() != it->first)) + else if (timer->StartAsUTC() != it->first) { /* timer start has changed */ CLog::Log(LOGDEBUG,"PVRTimers - %s - changed start time timer %d on client %d", @@ -231,11 +228,11 @@ for (VecTimerInfoTag::const_iterator timerIt = timersToMove.begin(); timerIt != timersToMove.end(); ++timerIt) { VecTimerInfoTag* addEntry = NULL; - MapTags::const_iterator itr = m_tags.find((*timerIt)->m_bStartAnyTime ? CDateTime() : (*timerIt)->StartAsUTC()); + MapTags::const_iterator itr = m_tags.find((*timerIt)->StartAsUTC()); if (itr == m_tags.end()) { addEntry = new VecTimerInfoTag; - m_tags.insert(std::make_pair((*timerIt)->m_bStartAnyTime ? CDateTime() : (*timerIt)->StartAsUTC(), addEntry)); + m_tags.insert(std::make_pair((*timerIt)->StartAsUTC(), addEntry)); } else { @@ -255,7 +252,7 @@ NotifyObservers(bAddedOrDeleted ? ObservableMessageTimersReset : ObservableMessageTimers); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_PVRRECORD_TIMERNOTIFICATIONS)) + if (CSettings::Get().GetBool("pvrrecord.timernotifications")) { /* queue notifications */ for (unsigned int iNotificationPtr = 0; iNotificationPtr < timerNotifications.size(); iNotificationPtr++) @@ -278,11 +275,11 @@ { tag = CPVRTimerInfoTagPtr(new CPVRTimerInfoTag()); VecTimerInfoTag* addEntry = NULL; - MapTags::iterator itr = m_tags.find(timer->m_bStartAnyTime ? CDateTime() : timer->StartAsUTC()); + MapTags::iterator itr = m_tags.find(timer->StartAsUTC()); if (itr == m_tags.end()) { addEntry = new VecTimerInfoTag; - m_tags.insert(std::make_pair(timer->m_bStartAnyTime ? CDateTime() : timer->StartAsUTC(), addEntry)); + m_tags.insert(std::make_pair(timer->StartAsUTC(), addEntry)); } else { @@ -307,7 +304,7 @@ for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt) { CPVRTimerInfoTagPtr current = *timerIt; - if (current->IsActive() && !current->IsRecording() && !current->IsRepeating() && !current->IsBroken()) + if (current->IsActive() && !current->IsRecording()) { CFileItemPtr fileItem(new CFileItem(current)); return fileItem; @@ -329,7 +326,7 @@ for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt) { CPVRTimerInfoTagPtr current = *timerIt; - if (current->IsActive() && !current->IsRepeating()) + if (current->IsActive()) { CFileItemPtr fileItem(new CFileItem(current)); tags.push_back(fileItem); @@ -347,7 +344,7 @@ for (MapTags::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt) - if ((*timerIt)->IsActive() && !(*timerIt)->IsRepeating()) + if ((*timerIt)->IsActive()) ++iReturn; return iReturn; @@ -363,7 +360,7 @@ for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt) { CPVRTimerInfoTagPtr current = *timerIt; - if (current->IsRecording() && !current->IsRepeating()) + if (current->IsRecording()) { CFileItemPtr fileItem(new CFileItem(current)); tags.push_back(fileItem); @@ -381,7 +378,7 @@ for (MapTags::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt) - if ((*timerIt)->IsRecording() && !(*timerIt)->IsRepeating()) + if ((*timerIt)->IsRecording()) ++iReturn; return iReturn; @@ -392,89 +389,41 @@ CSingleLock lock(m_critSection); for (MapTags::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt) - if ((*timerIt)->IsActive() && !(*timerIt)->IsRepeating()) + if ((*timerIt)->IsActive()) return true; return false; } -bool CPVRTimers::GetRootDirectory(const CPVRTimersPath &path, CFileItemList &items) const +bool CPVRTimers::GetDirectory(const std::string& strPath, CFileItemList &items) const { - CFileItemPtr item(new CFileItem(CPVRTimersPath::PATH_ADDTIMER, false)); - item->SetLabel(g_localizeStrings.Get(19026)); // "Add timer..." - item->SetLabelPreformated(true); - item->SetSpecialSort(SortSpecialOnTop); - items.Add(item); - - bool bRadio = path.IsRadio(); - bool bGrouped = path.IsGrouped(); - - CSingleLock lock(m_critSection); - for (const auto &tagsEntry : m_tags) + std::vector dirs = URIUtils::SplitPath(strPath); + if(dirs.size() == 3 && dirs.at(1) == "timers") { - for (const auto &timer : *tagsEntry.second) - { - if ((bRadio == timer->m_bIsRadio) && - (!bGrouped || (timer->m_iParentClientIndex == PVR_TIMER_NO_PARENT))) - { - item.reset(new CFileItem(timer)); - std::string strItemPath( - CPVRTimersPath(path.GetPath(), timer->m_iClientId, timer->m_iClientIndex).GetPath()); - item->SetPath(strItemPath); - items.Add(item); - } - } - } - return true; -} - -bool CPVRTimers::GetSubDirectory(const CPVRTimersPath &path, CFileItemList &items) const -{ - bool bRadio = path.IsRadio(); - unsigned int iParentId = path.GetParentId(); - int iClientId = path.GetClientId(); + bool bRadio = (dirs.at(2) == "radio"); - CFileItemPtr item; + CFileItemPtr item(new CFileItem("pvr://timers/addtimer/", true)); + item->SetLabel(g_localizeStrings.Get(19026)); + item->SetLabelPreformated(true); + item->SetSpecialSort(SortSpecialOnTop); + items.Add(item); - CSingleLock lock(m_critSection); - for (const auto &tagsEntry : m_tags) - { - for (const auto &timer : *tagsEntry.second) + CSingleLock lock(m_critSection); + for (MapTags::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it) { - if ((timer->m_bIsRadio == bRadio) && - (timer->m_iParentClientIndex != PVR_TIMER_NO_PARENT) && - (timer->m_iClientId == iClientId) && - (timer->m_iParentClientIndex == iParentId)) + for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt) { - item.reset(new CFileItem(timer)); - std::string strItemPath( - CPVRTimersPath(path.GetPath(), timer->m_iClientId, timer->m_iClientIndex).GetPath()); - item->SetPath(strItemPath); - items.Add(item); + CPVRTimerInfoTagPtr current = *timerIt; + if (bRadio == current->m_bIsRadio) + { + item.reset(new CFileItem(current)); + items.Add(item); + } } } - } - return true; -} -bool CPVRTimers::GetDirectory(const std::string& strPath, CFileItemList &items) const -{ - CPVRTimersPath path(strPath); - if (path.IsValid()) - { - if (path.IsTimersRoot()) - { - /* Root folder containing both timer schedules and timers. */ - return GetRootDirectory(path, items); - } - else if (path.IsTimerSchedule()) - { - /* Sub folder containing the timers scheduled by the given timer schedule. */ - return GetSubDirectory(path, items); - } + return true; } - - CLog::Log(LOGERROR,"CPVRTimers - %s - invalid URL %s", __FUNCTION__, strPath.c_str()); return false; } @@ -491,7 +440,7 @@ for (VecTimerInfoTag::iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt) { bool bDeleteActiveItem = !bCurrentlyActiveOnly || (*timerIt)->IsRecording(); - bool bDeleteRepeatingItem = bDeleteRepeating || !(*timerIt)->IsRepeating(); + bool bDeleteRepeatingItem = bDeleteRepeating || !(*timerIt)->m_bIsRepeating; bool bChannelsMatch = (*timerIt)->ChannelTag() == channel; if (bDeleteActiveItem && bDeleteRepeatingItem && bChannelsMatch) @@ -525,7 +474,7 @@ { newTimer.reset(new CPVRTimerInfoTag); /* set the timer data */ - newTimer->m_iClientIndex = PVR_TIMER_NO_CLIENT_INDEX; + newTimer->m_iClientIndex = -1; newTimer->m_strTitle = channel->ChannelName(); newTimer->m_strSummary = g_localizeStrings.Get(19056); newTimer->m_iChannelNumber = channel->ChannelNumber(); @@ -546,12 +495,12 @@ newTimer->SetStartFromUTC(startTime); newTimer->m_iMarginStart = 0; /* set the start margin to 0 for instant timers */ - int iDuration = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_INSTANTRECORDTIME); + int iDuration = CSettings::Get().GetInt("pvrrecord.instantrecordtime"); CDateTime endTime = CDateTime::GetUTCDateTime() + CDateTimeSpan(0, 0, iDuration ? iDuration : 120, 0); newTimer->SetEndFromUTC(endTime); /* unused only for reference */ - newTimer->m_strFileNameAndPath = CPVRTimersPath::PATH_NEW; + newTimer->m_strFileNameAndPath = "pvr://timers/new"; bool bReturn = newTimer->AddToClient(); if (!bReturn) @@ -564,16 +513,16 @@ bool CPVRTimers::AddTimer(const CPVRTimerInfoTagPtr &item) { - if (!item->m_channel && item->GetTimerType() && !item->GetTimerType()->IsRepeatingEpgBased()) + if (!item->m_channel) { CLog::Log(LOGERROR, "PVRTimers - %s - no channel given", __FUNCTION__); - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19109}); // Couldn't save timer + CGUIDialogOK::ShowAndGetInput(19033, 19109); // Couldn't save timer return false; } if (!g_PVRClients->SupportsTimers(item->m_iClientId)) { - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19215}); + CGUIDialogOK::ShowAndGetInput(19033, 19215); return false; } @@ -583,7 +532,7 @@ return item->AddToClient(); } -bool CPVRTimers::DeleteTimer(const CFileItem &item, bool bForce /* = false */, bool bDeleteSchedule /* = false */) +bool CPVRTimers::DeleteTimer(const CFileItem &item, bool bForce /* = false */) { /* Check if a CPVRTimerInfoTag is inside file item */ if (!item.IsPVRTimer()) @@ -592,21 +541,10 @@ return false; } - CPVRTimerInfoTagPtr tag = item.GetPVRTimerInfoTag(); + const CPVRTimerInfoTagPtr tag = item.GetPVRTimerInfoTag(); if (!tag) return false; - if (bDeleteSchedule) - { - /* delete the repeating timer that scheduled this timer. */ - tag = g_PVRTimers->GetByClient(tag->m_iClientId, tag->GetTimerScheduleId()); - if (!tag) - { - CLog::Log(LOGERROR, "PVRTimers - %s - unable to obtain parent timer for given timer", __FUNCTION__); - return false; - } - } - return tag->DeleteFromClient(bForce); } @@ -642,7 +580,7 @@ return tag->UpdateOnClient(); } -CPVRTimerInfoTagPtr CPVRTimers::GetByClient(int iClientId, unsigned int iClientTimerId) const +CPVRTimerInfoTagPtr CPVRTimers::GetByClient(int iClientId, int iClientTimerId) const { CSingleLock lock(m_critSection); @@ -692,12 +630,11 @@ { CPVRTimerInfoTagPtr timer = *timerIt; - if (!timer->IsRepeating() && - (timer->GetEpgInfoTag() == epgTag || - (timer->m_iClientChannelUid == channel->UniqueID() && - timer->m_bIsRadio == channel->IsRadio() && - timer->StartAsUTC() <= epgTag->StartAsUTC() && - timer->EndAsUTC() >= epgTag->EndAsUTC()))) + if (timer->GetEpgInfoTag() == epgTag || + (timer->m_iClientChannelUid == channel->UniqueID() && + timer->m_bIsRadio == channel->IsRadio() && + timer->StartAsUTC() <= epgTag->StartAsUTC() && + timer->EndAsUTC() >= epgTag->EndAsUTC())) { CFileItemPtr fileItem(new CFileItem(timer)); return fileItem; @@ -718,10 +655,10 @@ CDateTime CPVRTimers::GetNextEventTime(void) const { - const bool dailywakup = CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUP); + const bool dailywakup = CSettings::Get().GetBool("pvrpowermanagement.dailywakeup"); const CDateTime now = CDateTime::GetUTCDateTime(); - const CDateTimeSpan prewakeup(0, 0, CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPOWERMANAGEMENT_PREWAKEUP), 0); - const CDateTimeSpan idle(0, 0, CSettings::GetInstance().GetInt(CSettings::SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME), 0); + const CDateTimeSpan prewakeup(0, 0, CSettings::Get().GetInt("pvrpowermanagement.prewakeup"), 0); + const CDateTimeSpan idle(0, 0, CSettings::Get().GetInt("pvrpowermanagement.backendidletime"), 0); CDateTime wakeuptime; @@ -740,7 +677,7 @@ if (dailywakup) { CDateTime dailywakeuptime; - dailywakeuptime.SetFromDBTime(CSettings::GetInstance().GetString(CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME)); + dailywakeuptime.SetFromDBTime(CSettings::Get().GetString("pvrpowermanagement.dailywakeuptime")); dailywakeuptime = dailywakeuptime.GetAsUTCDateTime(); dailywakeuptime.SetDateTime( @@ -765,10 +702,6 @@ { CSingleLock lock(timer->m_critSection); - /* repeating timers have no epg event */ - if (timer->IsRepeating()) - return; - /* already got an epg event set */ if (timer->m_epgTag) return; @@ -779,7 +712,7 @@ return; /* try to get the EPG table */ - CEpgPtr epg = channel->GetEPG(); + CEpg *epg = channel->GetEPG(); if (!epg) return; @@ -836,72 +769,3 @@ } return item; } - -//= CPVRTimersPath ============================================================ - -const std::string CPVRTimersPath::PATH_ADDTIMER = "pvr://timers/addtimer/"; -const std::string CPVRTimersPath::PATH_NEW = "pvr://timers/new/"; - -CPVRTimersPath::CPVRTimersPath(const std::string &strPath) -{ - Init(strPath); -} - -CPVRTimersPath::CPVRTimersPath(const std::string &strPath, int iClientId, unsigned int iParentId) -{ - if (Init(strPath)) - { - /* set/replace client and parent id. */ - m_path = StringUtils::Format("pvr://timers/%s/%s/%d/%d", - m_bRadio ? "radio" : "tv", - m_bGrouped ? "grouped" : "all", - iClientId, - iParentId); - m_iClientId = iClientId; - m_iParentId = iParentId; - m_bRoot = false; - } -} - -CPVRTimersPath::CPVRTimersPath(bool bRadio, bool bGrouped) : - m_path(StringUtils::Format( - "pvr://timers/%s/%s", bRadio ? "radio" : "tv", bGrouped ? "grouped" : "all")), - m_bValid(true), - m_bRoot(true), - m_bRadio(bRadio), - m_bGrouped(bGrouped), - m_iClientId(-1), - m_iParentId(0) -{ -} - -bool CPVRTimersPath::Init(const std::string &strPath) -{ - std::string strVarPath(strPath); - URIUtils::RemoveSlashAtEnd(strVarPath); - - m_path = strVarPath; - const std::vector segments = URIUtils::SplitPath(m_path); - - m_bValid = (((segments.size() == 4) || (segments.size() == 6)) && - (segments.at(1) == "timers") && - ((segments.at(2) == "radio") || (segments.at(2) == "tv"))&& - ((segments.at(3) == "grouped") || (segments.at(3) == "all"))); - m_bRoot = (m_bValid && (segments.size() == 4)); - m_bRadio = (m_bValid && (segments.at(2) == "radio")); - m_bGrouped = (m_bValid && (segments.at(3) == "grouped")); - - if (!m_bValid || m_bRoot) - { - m_iClientId = -1; - m_iParentId = 0; - } - else - { - char *end; - m_iClientId = std::strtol (segments.at(4).c_str(), &end, 10); - m_iParentId = std::strtoul(segments.at(5).c_str(), &end, 10); - } - - return m_bValid; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimers.h kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimers.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimers.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimers.h 2015-10-19 08:39:16.000000000 +0000 @@ -19,18 +19,12 @@ * */ -#include -#include - -#include "addons/include/xbmc_pvr_types.h" #include "PVRTimerInfoTag.h" -#include "utils/Observer.h" #include "XBDateTime.h" +#include "addons/include/xbmc_pvr_types.h" +#include "utils/Observer.h" class CFileItem; -class CFileItemList; -typedef std::shared_ptr CFileItemPtr; - namespace EPG { class CEpgInfoTag; @@ -38,7 +32,7 @@ namespace PVR { - class CPVRTimersPath; + class CGUIDialogPVRTimerSettings; class CPVRTimers : public Observer, public Observable @@ -148,10 +142,9 @@ /*! * @brief Delete a timer on the client. Doesn't delete the timer from the container. The backend will do this. - * @param bDeleteSchedule Also delete repeating schedule instead of single timer only. * @return True if it was sent correctly, false if not. */ - static bool DeleteTimer(const CFileItem &item, bool bForce = false, bool bDeleteSchedule = false); + static bool DeleteTimer(const CFileItem &item, bool bForce = false); /*! * @brief Rename a timer on the client. Doesn't update the timer in the container. The backend will do this. @@ -193,45 +186,11 @@ void Unload(void); void UpdateEpgEvent(CPVRTimerInfoTagPtr timer); bool UpdateEntries(const CPVRTimers &timers); - CPVRTimerInfoTagPtr GetByClient(int iClientId, unsigned int iClientTimerId) const; - bool GetRootDirectory(const CPVRTimersPath &path, CFileItemList &items) const; - bool GetSubDirectory(const CPVRTimersPath &path, CFileItemList &items) const; + CPVRTimerInfoTagPtr GetByClient(int iClientId, int iClientTimerId) const; CCriticalSection m_critSection; bool m_bIsUpdating; MapTags m_tags; unsigned int m_iLastId; }; - - class CPVRTimersPath - { - public: - static const std::string PATH_ADDTIMER; - static const std::string PATH_NEW; - - CPVRTimersPath(const std::string &strPath); - CPVRTimersPath(const std::string &strPath, int iClientId, unsigned int iParentId); - CPVRTimersPath(bool bRadio, bool bGrouped); - - bool IsValid() const { return m_bValid; } - - const std::string &GetPath() const { return m_path; } - bool IsTimersRoot() const { return m_bRoot; } - bool IsTimerSchedule() const { return !IsTimersRoot(); } - bool IsRadio() const { return m_bRadio; } - bool IsGrouped() const { return m_bGrouped; } - int GetClientId() const { return m_iClientId; } - unsigned int GetParentId() const { return m_iParentId; } - - private: - bool Init(const std::string &strPath); - - std::string m_path; - bool m_bValid; - bool m_bRoot; - bool m_bRadio; - bool m_bGrouped; - int m_iClientId; - unsigned int m_iParentId; - }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimerType.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimerType.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimerType.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimerType.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,302 +0,0 @@ -/* - * Copyright (C) 2012-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see - * . - * - */ - -#include "addons/include/xbmc_pvr_types.h" -#include "guilib/LocalizeStrings.h" -#include "pvr/timers/PVRTimerType.h" -#include "pvr/addons/PVRClients.h" -#include "pvr/PVRManager.h" -#include "settings/Settings.h" -#include "utils/log.h" -#include "utils/StringUtils.h" - -using namespace PVR; - -const std::vector CPVRTimerType::GetAllTypes() -{ - std::vector allTypes; - g_PVRClients->GetTimerTypes(allTypes); - return allTypes; -} - -const CPVRTimerTypePtr CPVRTimerType::GetFirstAvailableType() -{ - std::vector allTypes(GetAllTypes()); - return allTypes.empty() ? CPVRTimerTypePtr() : *(allTypes.begin()); -} - -CPVRTimerTypePtr CPVRTimerType::CreateFromIds(unsigned int iTypeId, int iClientId) -{ - std::vector types; - PVR_ERROR error = g_PVRClients->GetTimerTypes(types, iClientId); - if (error == PVR_ERROR_NO_ERROR) - { - for (const auto &type : types) - { - if (type->GetTypeId() == iTypeId) - return type; - } - } - - CLog::Log(LOGERROR, "CPVRTimerType::CreateFromIds unable to resolve numeric timer type (%d, %d)", iTypeId, iClientId); - return CPVRTimerTypePtr(); -} - -CPVRTimerTypePtr CPVRTimerType::CreateFromAttributes( - unsigned int iMustHaveAttr, unsigned int iMustNotHaveAttr, int iClientId) -{ - std::vector types; - PVR_ERROR error = g_PVRClients->GetTimerTypes(types, iClientId); - if (error == PVR_ERROR_NO_ERROR) - { - for (const auto &type : types) - { - if (((type->m_iAttributes & iMustHaveAttr) == iMustHaveAttr) && - ((type->m_iAttributes & iMustNotHaveAttr) == 0)) - return type; - } - } - - CLog::Log(LOGERROR, "CPVRTimerType::CreateFromAttributes unable to resolve timer type (0x%x, 0x%x, %d)", iMustHaveAttr, iMustNotHaveAttr, iClientId); - return CPVRTimerTypePtr(); -} - -CPVRTimerType::CPVRTimerType() : - m_iClientId(0), - m_iTypeId(PVR_TIMER_TYPE_NONE), - m_iAttributes(PVR_TIMER_TYPE_ATTRIBUTE_NONE), - m_iPriorityDefault(50), - m_iLifetimeDefault(365), - m_iMaxRecordingsDefault(0), - m_iPreventDupEpisodesDefault(0), - m_iRecordingGroupDefault(0) -{ -} - -CPVRTimerType::CPVRTimerType(const PVR_TIMER_TYPE &type, int iClientId) : - m_iClientId(iClientId), - m_iTypeId(type.iId), - m_iAttributes(type.iAttributes), - m_strDescription(type.strDescription) -{ - InitAttributeValues(type); -} - -CPVRTimerType::~CPVRTimerType() -{ -} - -bool CPVRTimerType::operator ==(const CPVRTimerType& right) const -{ - return (m_iClientId == right.m_iClientId && - m_iTypeId == right.m_iTypeId && - m_iAttributes == right.m_iAttributes && - m_strDescription == right.m_strDescription && - m_priorityValues == right.m_priorityValues && - m_iPriorityDefault == right.m_iPriorityDefault && - m_lifetimeValues == right.m_lifetimeValues && - m_iLifetimeDefault == right.m_iLifetimeDefault && - m_maxRecordingsValues == right.m_maxRecordingsValues && - m_iMaxRecordingsDefault == right.m_iMaxRecordingsDefault && - m_preventDupEpisodesValues == right.m_preventDupEpisodesValues && - m_iPreventDupEpisodesDefault == right.m_iPreventDupEpisodesDefault && - m_recordingGroupValues == right.m_recordingGroupValues && - m_iRecordingGroupDefault == right.m_iRecordingGroupDefault); -} - -bool CPVRTimerType::operator !=(const CPVRTimerType& right) const -{ - return !(*this == right); -} - -void CPVRTimerType::InitAttributeValues(const PVR_TIMER_TYPE &type) -{ - InitPriorityValues(type); - InitLifetimeValues(type); - InitMaxRecordingsValues(type); - InitPreventDuplicateEpisodesValues(type); - InitRecordingGroupValues(type); -} - -void CPVRTimerType::InitPriorityValues(const PVR_TIMER_TYPE &type) -{ - if (type.iPrioritiesSize > 0) - { - for (unsigned int i = 0; i < type.iPrioritiesSize; ++i) - { - std::string strDescr(type.priorities[i].strDescription); - if (strDescr.size() == 0) - { - // No description given by addon. Create one from value. - strDescr = StringUtils::Format("%d", type.priorities[i].iValue); - } - m_priorityValues.push_back(std::make_pair(strDescr, type.priorities[i].iValue)); - } - - m_iPriorityDefault = type.iPrioritiesDefault; - } - else if (SupportsPriority()) - { - // No values given by addon, but priority supported. Use default values 1..100 - for (int i = 1; i < 101; ++i) - m_priorityValues.push_back(std::make_pair(StringUtils::Format("%d", i), i)); - - m_iPriorityDefault = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_DEFAULTPRIORITY); - } - else - { - // No priority supported. - m_iPriorityDefault = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_DEFAULTPRIORITY); - } -} - -void CPVRTimerType::GetPriorityValues(std::vector< std::pair > &list) const -{ - for (const auto &prio : m_priorityValues) - list.push_back(prio); -} - -void CPVRTimerType::InitLifetimeValues(const PVR_TIMER_TYPE &type) -{ - if (type.iLifetimesSize > 0) - { - for (unsigned int i = 0; i < type.iLifetimesSize; ++i) - { - std::string strDescr(type.lifetimes[i].strDescription); - if (strDescr.size() == 0) - { - // No description given by addon. Create one from value. - strDescr = StringUtils::Format("%d", type.lifetimes[i].iValue); - } - m_lifetimeValues.push_back(std::make_pair(strDescr, type.lifetimes[i].iValue)); - } - - m_iLifetimeDefault = type.iLifetimesDefault; - } - else if (SupportsLifetime()) - { - // No values given by addon, but lifetime supported. Use default values 1..365 - for (int i = 1; i < 366; ++i) - { - m_lifetimeValues.push_back(std::make_pair(StringUtils::Format(g_localizeStrings.Get(17999).c_str(), i), i)); // "%s days" - } - m_iLifetimeDefault = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_DEFAULTLIFETIME); - } - else - { - // No lifetime supported. - m_iLifetimeDefault = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_DEFAULTLIFETIME); - } -} - -void CPVRTimerType::GetLifetimeValues(std::vector< std::pair > &list) const -{ - for (const auto &lifetime : m_lifetimeValues) - list.push_back(lifetime); -} - -void CPVRTimerType::InitMaxRecordingsValues(const PVR_TIMER_TYPE &type) -{ - if (type.iMaxRecordingsSize > 0) - { - for (unsigned int i = 0; i < type.iMaxRecordingsSize; ++i) - { - std::string strDescr(type.maxRecordings[i].strDescription); - if (strDescr.size() == 0) - { - // No description given by addon. Create one from value. - strDescr = StringUtils::Format("%d", type.maxRecordings[i].iValue); - } - m_maxRecordingsValues.push_back(std::make_pair(strDescr, type.maxRecordings[i].iValue)); - } - - m_iMaxRecordingsDefault = type.iMaxRecordingsDefault; - } -} - -void CPVRTimerType::GetMaxRecordingsValues(std::vector< std::pair > &list) const -{ - for (const auto &maxRecordings : m_maxRecordingsValues) - list.push_back(maxRecordings); -} - -void CPVRTimerType::InitPreventDuplicateEpisodesValues(const PVR_TIMER_TYPE &type) -{ - if (type.iPreventDuplicateEpisodesSize > 0) - { - for (unsigned int i = 0; i < type.iPreventDuplicateEpisodesSize; ++i) - { - std::string strDescr(type.preventDuplicateEpisodes[i].strDescription); - if (strDescr.size() == 0) - { - // No description given by addon. Create one from value. - strDescr = StringUtils::Format("%d", type.preventDuplicateEpisodes[i].iValue); - } - m_preventDupEpisodesValues.push_back(std::make_pair(strDescr, type.preventDuplicateEpisodes[i].iValue)); - } - - m_iPreventDupEpisodesDefault = type.iPreventDuplicateEpisodesDefault; - } - else if (SupportsRecordOnlyNewEpisodes()) - { - // No values given by addon, but prevent duplicate episodes supported. Use default values 0..1 - m_preventDupEpisodesValues.push_back(std::make_pair(g_localizeStrings.Get(815), 0)); // "Record all episodes" - m_preventDupEpisodesValues.push_back(std::make_pair(g_localizeStrings.Get(816), 1)); // "Record only new episodes" - m_iPreventDupEpisodesDefault = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_PREVENTDUPLICATEEPISODES); - } - else - { - // No prevent duplicate episodes supported. - m_iPreventDupEpisodesDefault = CSettings::GetInstance().GetInt(CSettings::SETTING_PVRRECORD_PREVENTDUPLICATEEPISODES); - } -} - -void CPVRTimerType::GetPreventDuplicateEpisodesValues(std::vector< std::pair > &list) const -{ - for (const auto &preventDupEpisodes : m_preventDupEpisodesValues) - list.push_back(preventDupEpisodes); -} - -void CPVRTimerType::InitRecordingGroupValues(const PVR_TIMER_TYPE &type) -{ - if (type.iRecordingGroupSize > 0) - { - for (unsigned int i = 0; i < type.iRecordingGroupSize; ++i) - { - std::string strDescr(type.recordingGroup[i].strDescription); - if (strDescr.size() == 0) - { - // No description given by addon. Create one from value. - strDescr = StringUtils::Format("%s %d", - g_localizeStrings.Get(811).c_str(), // Recording group - type.recordingGroup[i].iValue); - } - m_recordingGroupValues.push_back(std::make_pair(strDescr, type.recordingGroup[i].iValue)); - } - - m_iRecordingGroupDefault = type.iRecordingGroupDefault; - } -} - -void CPVRTimerType::GetRecordingGroupValues(std::vector< std::pair > &list) const -{ - for (const auto &recordingGroup : m_recordingGroupValues) - list.push_back(recordingGroup); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimerType.h kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimerType.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/timers/PVRTimerType.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/timers/PVRTimerType.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,361 +0,0 @@ -#pragma once -/* - * Copyright (C) 2012-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Kodi; see the file COPYING. If not, see - * . - * - */ - -#include -#include -#include -#include - -struct PVR_TIMER_TYPE; - -namespace PVR -{ - class CPVRTimerType; - typedef std::shared_ptr CPVRTimerTypePtr; - - class CPVRTimerType - { - public: - - /*! - * @brief Return a list with all known timer types. - * @return A list of timer types or an empty list if no types available. - */ - static const std::vector GetAllTypes(); - - /*! - * @brief Return the first available timer type. - * @return A timer type or NULL if none available. - */ - static const CPVRTimerTypePtr GetFirstAvailableType(); - - /*! - * @brief Create a timer type from given timer type id and client id. - * @param iTimerType the timer type id. - * @param iClientId the PVR client id. - * @return A timer type instance. - */ - static CPVRTimerTypePtr CreateFromIds(unsigned int iTypeId, int iClientId); - - /*! - * @brief Create a timer type from given timer type attributes and client id. - * @param iMustHaveAttr a combination of PVR_TIMER_TYPE_* attributes the type to create must have. - * @param iMustNotHaveAttr a combination of PVR_TIMER_TYPE_* attributes the type to create must not have. - * @param iClientId the PVR client id. - * @return A timer type instance. - */ - static CPVRTimerTypePtr CreateFromAttributes(unsigned int iMustHaveAttr, unsigned int iMustNotHaveAttr, int iClientId); - - CPVRTimerType(); - CPVRTimerType(const PVR_TIMER_TYPE &type, int iClientId); - - virtual ~CPVRTimerType(); - - CPVRTimerType(const CPVRTimerType &type) = delete; - CPVRTimerType &operator=(const CPVRTimerType &orig) = delete; - - bool operator ==(const CPVRTimerType &right) const; - bool operator !=(const CPVRTimerType &right) const; - - /*! - * @brief Get the PVR client id for this type. - * @return The PVR client id. - */ - int GetClientId() const { return m_iClientId; } - - /*! - * @brief Get the numeric type id of this type. - * @return The type id. - */ - unsigned int GetTypeId() const { return m_iTypeId; } - - /*! - * @brief Get the plain text (UI) description of this type. - * @return The description. - */ - const std::string& GetDescription() const { return m_strDescription; } - - /*! - * @brief Check whether this type is for repeating ore one time timers. - * @return True if repeating, false otherwise. - */ - bool IsRepeating() const { return (m_iAttributes & PVR_TIMER_TYPE_IS_REPEATING) > 0; } - - /*! - * @brief Check whether this type is for repeating ore one time timers. - * @return True if one time, false otherwise. - */ - bool IsOnetime() const { return !IsRepeating(); } - - /*! - * @brief Check whether this type is for epg-based or manual timers. - * @return True if manual, false otherwise. - */ - bool IsManual() const { return (m_iAttributes & PVR_TIMER_TYPE_IS_MANUAL) > 0; } - - /*! - * @brief Check whether this type is for epg-based or manual timers. - * @return True if epg-based, false otherwise. - */ - bool IsEpgBased() const { return !IsManual(); } - - /*! - * @brief Check whether this type is for repeating epg-based timers. - * @return True if repeating epg-based, false otherwise. - */ - bool IsRepeatingEpgBased() const { return IsRepeating() && IsEpgBased(); } - - /*! - * @brief Check whether this type is for one time epg-based timers. - * @return True if one time epg-based, false otherwise. - */ - bool IsOnetimeEpgBased() const { return IsOnetime() && IsEpgBased(); } - - /*! - * @brief Check whether this type is for repeating manual timers. - * @return True if repeating manual, false otherwise. - */ - bool IsRepeatingManual() const { return IsRepeating() && IsManual(); } - - /*! - * @brief Check whether this type is for one time manual timers. - * @return True if one time manual, false otherwise. - */ - bool IsOnetimeManual() const { return IsOnetime() && IsManual(); } - - /*! - * @brief Check whether this type is readonly (must not be modified after initial creation). - * @return True if readonly, false otherwise. - */ - bool IsReadOnly() const { return (m_iAttributes & PVR_TIMER_TYPE_IS_READONLY) > 0; } - - /*! - * @brief Check whether this type forbids creation of new timers of this type. - * @return True if new instances are forbidden, false otherwise. - */ - bool ForbidsNewInstances() const { return (m_iAttributes & PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES) > 0; } - - /*! - * @brief Check whether this timer type is forbidden when epg tag info is present. - * @return True if new instances are forbidden when epg info is present, false otherwise. - */ - bool ForbidsEpgTagOnCreate() const { return (m_iAttributes & PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE) > 0; } - - /*! - * @brief Check whether this timer type requires epg tag info to be present. - * @return True if new instances require EPG info, false otherwise. - */ - bool RequiresEpgTagOnCreate() const { return (m_iAttributes & (PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE | - PVR_TIMER_TYPE_REQUIRES_EPG_SERIES_ON_CREATE)) > 0; } - - /*! - * @brief Check whether this timer type requires epg tag info including series attributes to be present. - * @return True if new instances require an EPG tag with series attributes, false otherwise. - */ - bool RequiresEpgSeriesOnCreate() const { return (m_iAttributes & PVR_TIMER_TYPE_REQUIRES_EPG_SERIES_ON_CREATE) > 0; } - - /*! - * @brief Check whether this type supports the "enabling/disabling" of timers of its type. - * @return True if "enabling/disabling" feature is supported, false otherwise. - */ - bool SupportsEnableDisable() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE) > 0; } - - /*! - * @brief Check whether this type supports channels. - * @return True if channels are supported, false otherwise. - */ - bool SupportsChannels() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_CHANNELS) > 0; } - - /*! - * @brief Check whether this type supports start time. - * @return True if start time values are supported, false otherwise. - */ - bool SupportsStartTime() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_START_TIME) > 0; } - - /*! - * @brief Check whether this type supports end time. - * @return True if end time values are supported, false otherwise. - */ - bool SupportsEndTime() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_END_TIME) > 0; } - /*! - * @brief Check whether this type supports start any time. - * @return True if start any time is supported, false otherwise. - */ - bool SupportsStartAnyTime() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_START_ANYTIME) > 0; } - - /*! - * @brief Check whether this type supports end any time. - * @return True if end any time is supported, false otherwise. - */ - bool SupportsEndAnyTime() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_END_ANYTIME) > 0; } - - /*! - * @brief Check whether this type supports matching a search string against epg episode title. - * @return True if title matching is supported, false otherwise. - */ - bool SupportsEpgTitleMatch() const { return (m_iAttributes & (PVR_TIMER_TYPE_SUPPORTS_TITLE_EPG_MATCH | PVR_TIMER_TYPE_SUPPORTS_FULLTEXT_EPG_MATCH)) > 0; } - - /*! - * @brief Check whether this type supports matching a search string against extended (fulltext) epg data. This - includes title matching. - * @return True if fulltext matching is supported, false otherwise. - */ - bool SupportsEpgFulltextMatch() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_FULLTEXT_EPG_MATCH) > 0; } - - /*! - * @brief Check whether this type supports a first day the timer is active. - * @return True if first day is supported, false otherwise. - */ - bool SupportsFirstDay() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_FIRST_DAY) > 0; } - - /*! - * @brief Check whether this type supports weekdays for timer schedules. - * @return True if weekdays are supported, false otherwise. - */ - bool SupportsWeekdays() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_WEEKDAYS) > 0; } - - /*! - * @brief Check whether this type supports the "record only new episodes" feature. - * @return True if the "record only new episodes" feature is supported, false otherwise. - */ - bool SupportsRecordOnlyNewEpisodes() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_RECORD_ONLY_NEW_EPISODES) > 0; } - - /*! - * @brief Check whether this type supports pre and post record time. - * @return True if pre and post record time is supported, false otherwise. - */ - bool SupportsStartEndMargin() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_START_END_MARGIN) > 0; } - - /*! - * @brief Check whether this type supports recording priorities. - * @return True if recording priority is supported, false otherwise. - */ - bool SupportsPriority() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_PRIORITY) > 0; } - - /*! - * @brief Check whether this type supports lifetime for recordings. - * @return True if recording lifetime is supported, false otherwise. - */ - bool SupportsLifetime() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_LIFETIME) > 0; } - - /*! - * @brief Check whether this type supports MaxRecordings for recordings. - * @return True if MaxRecordings is supported, false otherwise. - */ - bool SupportsMaxRecordings() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_MAX_RECORDINGS) > 0; } - - /*! - * @brief Check whether this type supports user specified recording folders. - * @return True if recording folders are supported, false otherwise. - */ - bool SupportsRecordingFolders() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_RECORDING_FOLDERS) > 0; } - - /*! - * @brief Check whether this type supports recording groups. - * @return True if recording groups are supported, false otherwise. - */ - bool SupportsRecordingGroup() const { return (m_iAttributes & PVR_TIMER_TYPE_SUPPORTS_RECORDING_GROUP) > 0; } - - /*! - * @brief Obtain a list with all possible values for the priority attribute. - * @param list out, the list with the values or an empty list, if priority is not supported by this type. - */ - void GetPriorityValues(std::vector< std::pair > &list) const; - - /*! - * @brief Obtain the default value for the priority attribute. - * @return the default value. - */ - int GetPriorityDefault() const { return m_iPriorityDefault; } - - /*! - * @brief Obtain a list with all possible values for the lifetime attribute. - * @param list out, the list with the values or an empty list, if liftime is not supported by this type. - */ - void GetLifetimeValues(std::vector< std::pair > &list) const; - - /*! - * @brief Obtain the default value for the lifetime attribute. - * @return the default value. - */ - int GetLifetimeDefault() const { return m_iLifetimeDefault; } - - /*! - * @brief Obtain a list with all possible values for the MaxRecordings attribute. - * @param list out, the list with the values or an empty list, if MaxRecordings is not supported by this type. - */ - void GetMaxRecordingsValues(std::vector< std::pair > &list) const; - - /*! - * @brief Obtain the default value for the MaxRecordings attribute. - * @return the default value. - */ - int GetMaxRecordingsDefault() const { return m_iMaxRecordingsDefault; } - - /*! - * @brief Obtain a list with all possible values for the duplicate episode prevention attribute. - * @param list out, the list with the values or an empty list, if duplicate episode prevention is not supported by this type. - */ - void GetPreventDuplicateEpisodesValues(std::vector< std::pair > &list) const; - - /*! - * @brief Obtain the default value for the duplicate episode prevention attribute. - * @return the default value. - */ - int GetPreventDuplicateEpisodesDefault() const { return m_iPreventDupEpisodesDefault; } - - /*! - * @brief Obtain a list with all possible values for the recording group attribute. - * @param list out, the list with the values or an empty list, if recording group is not supported by this type. - */ - void GetRecordingGroupValues(std::vector< std::pair > &list) const; - - /*! - * @brief Obtain the default value for the Recording Group attribute. - * @return the default value. - */ - int GetRecordingGroupDefault() const { return m_iRecordingGroupDefault; } - - - private: - void InitAttributeValues(const PVR_TIMER_TYPE &type); - void InitPriorityValues(const PVR_TIMER_TYPE &type); - void InitLifetimeValues(const PVR_TIMER_TYPE &type); - void InitMaxRecordingsValues(const PVR_TIMER_TYPE &type); - void InitPreventDuplicateEpisodesValues(const PVR_TIMER_TYPE &type); - void InitRecordingGroupValues(const PVR_TIMER_TYPE &type); - - int m_iClientId; - unsigned int m_iTypeId; - unsigned int m_iAttributes; - std::string m_strDescription; - std::vector< std::pair > m_priorityValues; - int m_iPriorityDefault; - std::vector< std::pair > m_lifetimeValues; - int m_iLifetimeDefault; - std::vector< std::pair > m_maxRecordingsValues; - int m_iMaxRecordingsDefault; - std::vector< std::pair > m_preventDupEpisodesValues; - unsigned int m_iPreventDupEpisodesDefault; - std::vector< std::pair > m_recordingGroupValues; - unsigned int m_iRecordingGroupDefault; - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIViewStatePVR.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIViewStatePVR.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIViewStatePVR.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIViewStatePVR.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,14 +18,12 @@ * */ +#include "GUIViewStatePVR.h" + #include "FileItem.h" #include "settings/Settings.h" #include "view/ViewStateSettings.h" -#include "pvr/timers/PVRTimers.h" - -#include "GUIViewStatePVR.h" - using namespace PVR; CGUIViewStateWindowPVRChannels::CGUIViewStateWindowPVRChannels(const int windowId, const CFileItemList& items) : CGUIViewStatePVR(windowId, items) @@ -41,12 +39,12 @@ void CGUIViewStateWindowPVRChannels::SaveViewState(void) { - SaveViewToDb("pvr://channels/", m_windowId, CViewStateSettings::GetInstance().Get("pvrchannels")); + SaveViewToDb("pvr://channels/", m_windowId, CViewStateSettings::Get().Get("pvrchannels")); } CGUIViewStateWindowPVRRecordings::CGUIViewStateWindowPVRRecordings(const int windowId, const CFileItemList& items) : CGUIViewStatePVR(windowId, items) { - AddSortMethod(SortByLabel, 551, LABEL_MASKS("%L", "%I", "%L", ""), CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); // FileName, Size | Foldername, empty + AddSortMethod(SortByLabel, 551, LABEL_MASKS("%L", "%I", "%L", ""), CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); // FileName, Size | Foldername, empty AddSortMethod(SortByDate, 552, LABEL_MASKS("%L", "%J", "%L", "%J")); // FileName, Date | Foldername, Date AddSortMethod(SortByTime, 180, LABEL_MASKS("%T", "%D")); AddSortMethod(SortByFile, 561, LABEL_MASKS("%L", "%I", "%L", "")); // Filename, Size | FolderName, empty @@ -59,7 +57,7 @@ void CGUIViewStateWindowPVRRecordings::SaveViewState(void) { - SaveViewToDb(m_items.GetPath(), m_windowId, CViewStateSettings::GetInstance().Get("pvrrecordings")); + SaveViewToDb(m_items.GetPath(), m_windowId, CViewStateSettings::Get().Get("pvrrecordings")); } bool CGUIViewStateWindowPVRRecordings::HideParentDirItems(void) @@ -74,15 +72,13 @@ void CGUIViewStateWindowPVRGuide::SaveViewState(void) { - SaveViewToDb("pvr://guide/", m_windowId, CViewStateSettings::GetInstance().Get("pvrguide")); + SaveViewToDb("pvr://guide/", m_windowId, CViewStateSettings::Get().Get("pvrguide")); } CGUIViewStateWindowPVRTimers::CGUIViewStateWindowPVRTimers(const int windowId, const CFileItemList& items) : CGUIViewStatePVR(windowId, items) { - int sortAttributes(CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); - sortAttributes |= SortAttributeIgnoreFolders; - AddSortMethod(SortByLabel, static_cast(sortAttributes), 551, LABEL_MASKS("%L", "%I", "%L", "")); // FileName, Size | Foldername, empty - AddSortMethod(SortByDate, static_cast(sortAttributes), 552, LABEL_MASKS("%L", "%J", "%L", "%J")); // FileName, Date | Foldername, Date + AddSortMethod(SortByLabel, 551, LABEL_MASKS("%L", "%I", "%L", "")); // FileName, Size | Foldername, empty + AddSortMethod(SortByDate, 552, LABEL_MASKS("%L", "%J", "%L", "%J")); // FileName, Date | Foldername, Date // Default sorting SetSortMethod(SortByDate); @@ -92,12 +88,7 @@ void CGUIViewStateWindowPVRTimers::SaveViewState(void) { - SaveViewToDb("pvr://timers/", m_windowId, CViewStateSettings::GetInstance().Get("pvrtimers")); -} - -bool CGUIViewStateWindowPVRTimers::HideParentDirItems(void) -{ - return (CGUIViewState::HideParentDirItems() || CPVRTimersPath(m_items.GetPath()).IsTimersRoot()); + SaveViewToDb("pvr://timers/", m_windowId, CViewStateSettings::Get().Get("pvrtimers")); } CGUIViewStateWindowPVRSearch::CGUIViewStateWindowPVRSearch(const int windowId, const CFileItemList& items) : CGUIViewStatePVR(windowId, items) @@ -113,5 +104,5 @@ void CGUIViewStateWindowPVRSearch::SaveViewState(void) { - SaveViewToDb("pvr://search/", m_windowId, CViewStateSettings::GetInstance().Get("pvrsearch")); + SaveViewToDb("pvr://search/", m_windowId, CViewStateSettings::Get().Get("pvrsearch")); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIViewStatePVR.h kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIViewStatePVR.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIViewStatePVR.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIViewStatePVR.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -68,7 +69,6 @@ protected: virtual void SaveViewState(); - virtual bool HideParentDirItems(void); }; class CGUIViewStateWindowPVRSearch : public CGUIViewStatePVR diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRBase.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRBase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRBase.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRBase.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,48 +18,40 @@ * */ +#include "GUIWindowPVRBase.h" + #include "Application.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" -#include "dialogs/GUIDialogKaiToast.h" +#include "ApplicationMessenger.h" #include "dialogs/GUIDialogNumeric.h" +#include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogOK.h" -#include "dialogs/GUIDialogProgress.h" -#include "dialogs/GUIDialogSelect.h" #include "dialogs/GUIDialogYesNo.h" -#include "epg/Epg.h" -#include "epg/GUIEPGGridContainer.h" +#include "dialogs/GUIDialogSelect.h" +#include "dialogs/GUIDialogProgress.h" #include "filesystem/StackDirectory.h" +#include "input/Key.h" #include "guilib/GUIMessage.h" #include "guilib/GUIWindowManager.h" -#include "input/Key.h" -#include "messaging/ApplicationMessenger.h" -#include "settings/MediaSettings.h" -#include "settings/Settings.h" -#include "threads/SingleLock.h" -#include "utils/Observer.h" -#include "utils/StringUtils.h" -#include "utils/Variant.h" - +#include "GUIWindowPVRRecordings.h" #include "pvr/PVRManager.h" #include "pvr/addons/PVRClients.h" #include "pvr/dialogs/GUIDialogPVRGuideInfo.h" #include "pvr/dialogs/GUIDialogPVRRecordingInfo.h" -#include "pvr/dialogs/GUIDialogPVRTimerSettings.h" #include "pvr/timers/PVRTimers.h" - -#include "GUIWindowPVRBase.h" -#include "GUIWindowPVRRecordings.h" - -#include +#include "epg/Epg.h" +#include "epg/GUIEPGGridContainer.h" +#include "settings/MediaSettings.h" +#include "settings/Settings.h" +#include "threads/SingleLock.h" +#include "utils/StringUtils.h" +#include "utils/Observer.h" #define MAX_INVALIDATION_FREQUENCY 2000 // limit to one invalidation per X milliseconds using namespace PVR; using namespace EPG; -using namespace KODI::MESSAGING; -CCriticalSection CGUIWindowPVRBase::m_selectedItemPathsLock; -std::string CGUIWindowPVRBase::m_selectedItemPaths[2]; +std::map CGUIWindowPVRBase::m_selectedItemPaths; CGUIWindowPVRBase::CGUIWindowPVRBase(bool bRadio, int id, const std::string &xmlFile) : CGUIMediaWindow(id, xmlFile.c_str()), @@ -75,27 +67,24 @@ void CGUIWindowPVRBase::SetSelectedItemPath(bool bRadio, const std::string &path) { - CSingleLock lock(m_selectedItemPathsLock); - m_selectedItemPaths[bRadio] = path; + m_selectedItemPaths.at(bRadio) = path; } std::string CGUIWindowPVRBase::GetSelectedItemPath(bool bRadio) { - CSingleLock lock(m_selectedItemPathsLock); - return m_selectedItemPaths[bRadio]; + if (!m_selectedItemPaths.at(bRadio).empty()) + return m_selectedItemPaths.at(bRadio); + else if (g_PVRManager.IsPlaying()) + return g_application.CurrentFile(); + + return ""; } void CGUIWindowPVRBase::Notify(const Observable &obs, const ObservableMessage msg) { - if (IsActive()) - { - // Only the active window must set the selected item path which is shared - // between all PVR windows, not the last notified window (observer). - UpdateSelectedItemPath(); - } - + UpdateSelectedItemPath(); CGUIMessage m(GUI_MSG_REFRESH_LIST, GetID(), 0, msg); - CApplicationMessenger::GetInstance().SendGUIMessage(m); + CApplicationMessenger::Get().SendGUIMessage(m); } bool CGUIWindowPVRBase::OnAction(const CAction &action) @@ -139,7 +128,7 @@ dialog->SetHeading(CVariant{19235}); dialog->SetText(CVariant{19045}); dialog->ShowProgressBar(false); - dialog->Open(); + dialog->StartModal(); // do not block the gfx context while waiting CSingleExit exit(g_graphicsContext); @@ -276,21 +265,6 @@ return bReturn || CGUIMediaWindow::OnContextButton(itemNumber, button); } -bool CGUIWindowPVRBase::OnContextButtonActiveAEDSPSettings(CFileItem *item, CONTEXT_BUTTON button) -{ - bool bReturn = false; - - if (button == CONTEXT_BUTTON_ACTIVE_ADSP_SETTINGS) - { - bReturn = true; - - if (ActiveAE::CActiveAEDSP::GetInstance().IsProcessing()) - g_windowManager.ActivateWindow(WINDOW_DIALOG_AUDIO_DSP_OSD_SETTINGS); - } - - return bReturn; -} - void CGUIWindowPVRBase::SetInvalid() { if (m_refreshTimeout.IsTimePast()) @@ -303,12 +277,6 @@ } } -bool CGUIWindowPVRBase::CanBeActivated() const -{ - // No activation if PVR is not enabled. - return CSettings::GetInstance().GetBool(CSettings::SETTING_PVRMANAGER_ENABLED); -} - bool CGUIWindowPVRBase::OpenGroupSelectionDialog(void) { CGUIDialogSelect *dialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); @@ -319,11 +287,11 @@ g_PVRChannelGroups->Get(m_bRadio)->GetGroupList(&options, true); dialog->Reset(); - dialog->SetHeading(CVariant{g_localizeStrings.Get(19146)}); - dialog->SetItems(options); + dialog->SetHeading(g_localizeStrings.Get(19146)); + dialog->SetItems(&options); dialog->SetMultiSelection(false); dialog->SetSelected(m_group->GroupName()); - dialog->Open(); + dialog->DoModal(); if (!dialog->IsConfirmed()) return false; @@ -377,7 +345,7 @@ return true; } - CMediaSettings::GetInstance().SetVideoStartWindowed(bPlayMinimized); + CMediaSettings::Get().SetVideoStartWindowed(bPlayMinimized); if (item->HasPVRRecordingInfoTag()) { @@ -396,16 +364,16 @@ CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*) g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (pDialog) { - pDialog->SetHeading(CVariant{19687}); // Play recording - pDialog->SetLine(0, CVariant{""}); - pDialog->SetLine(1, CVariant{12021}); // Start from beginning - pDialog->SetLine(2, CVariant{recording->m_strTitle}); - pDialog->Open(); + pDialog->SetHeading(19687); // Play recording + pDialog->SetLine(0, ""); + pDialog->SetLine(1, 12021); // Start from beginning + pDialog->SetLine(2, recording->m_strTitle.c_str()); + pDialog->DoModal(); if (pDialog->IsConfirmed()) { CFileItem recordingItem(recording); - return PlayRecording(&recordingItem, CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPLAYBACK_PLAYMINIMIZED), bCheckResume); + return PlayRecording(&recordingItem, CSettings::Get().GetBool("pvrplayback.playminimized"), bCheckResume); } } } @@ -420,7 +388,7 @@ if (!bSwitchSuccessful) { - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast(new CFileItem(*item))); + CApplicationMessenger::Get().PlayFile(*item, false); return true; } } @@ -442,134 +410,60 @@ return true; } -bool CGUIWindowPVRBase::ShowTimerSettings(CFileItem *item) +bool CGUIWindowPVRBase::StartRecordFile(const CFileItem &item) { - if (!item->IsPVRTimer()) - return false; - - CGUIDialogPVRTimerSettings* pDlgInfo = (CGUIDialogPVRTimerSettings*)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_TIMER_SETTING); - - if (!pDlgInfo) + if (!item.HasEPGInfoTag()) return false; - pDlgInfo->SetTimer(item); - pDlgInfo->Open(); - - return pDlgInfo->IsConfirmed(); -} - -bool CGUIWindowPVRBase::AddTimer(CFileItem *item, bool bAdvanced) -{ - CFileItemPtr epgTag; - if (item->IsEPG()) - { - epgTag.reset(new CFileItem(*item)); - if (!epgTag->GetEPGInfoTag()->HasPVRChannel()) - return false; - } - else if (item->IsPVRChannel()) - { - CPVRChannelPtr channel(item->GetPVRChannelInfoTag()); - if (!channel) - return false; - - CEpgInfoTagPtr epgNow(channel->GetEPGNow()); - if (!epgNow) - return false; - - epgTag.reset(new CFileItem(epgNow)); - } - - const CEpgInfoTagPtr tag = epgTag->GetEPGInfoTag(); + const CEpgInfoTagPtr tag = item.GetEPGInfoTag(); CPVRChannelPtr channel = tag->ChannelTag(); if (!channel || !g_PVRManager.CheckParentalLock(channel)) return false; - CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(item); + CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(&item); if (timer && timer->HasPVRTimerInfoTag()) { - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19034}); + CGUIDialogOK::ShowAndGetInput(19033, 19034); return false; } - bool bReturn(false); - - if (bAdvanced) - { - CPVRTimerInfoTagPtr newTimer = CPVRTimerInfoTag::CreateFromEpg(tag, true); - if (newTimer) - { - CFileItem *newItem = new CFileItem(newTimer); + // ask for confirmation before starting a timer + CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); + if (!pDialog) + return false; + pDialog->SetHeading(264); + pDialog->SetLine(0, tag->PVRChannelName()); + pDialog->SetLine(1, ""); + pDialog->SetLine(2, tag->Title()); + pDialog->DoModal(); - if (ShowTimerSettings(newItem)) - bReturn = g_PVRTimers->AddTimer(newItem->GetPVRTimerInfoTag()); + if (!pDialog->IsConfirmed()) + return false; - delete newItem; - } - } - else + CPVRTimerInfoTagPtr newTimer = CPVRTimerInfoTag::CreateFromEpg(tag); + bool bReturn(false); + if (newTimer) { - CPVRTimerInfoTagPtr newTimer = CPVRTimerInfoTag::CreateFromEpg(tag); - - if (newTimer) - bReturn = g_PVRTimers->AddTimer(newTimer); + bReturn = g_PVRTimers->AddTimer(newTimer); } return bReturn; } -bool CGUIWindowPVRBase::DeleteTimer(CFileItem *item) -{ - return DeleteTimer(item, false); -} - -bool CGUIWindowPVRBase::StopRecordFile(CFileItem *item) -{ - return DeleteTimer(item, true); -} - -bool CGUIWindowPVRBase::DeleteTimer(CFileItem *item, bool bIsRecording) +bool CGUIWindowPVRBase::StopRecordFile(const CFileItem &item) { - CFileItemPtr timer; - - if (item->IsPVRTimer()) - { - timer.reset(new CFileItem(*item)); - } - else if (item->IsEPG()) - { - timer = g_PVRTimers->GetTimerForEpgTag(item); - } - else if (item->IsPVRChannel()) - { - CPVRChannelPtr channel(item->GetPVRChannelInfoTag()); - if (!channel) - return false; - - CFileItemPtr epgNow(new CFileItem(channel->GetEPGNow())); - timer = g_PVRTimers->GetTimerForEpgTag(epgNow.get()); - } + if (!item.HasEPGInfoTag()) + return false; - if (!timer || !timer->HasPVRTimerInfoTag()) + const CEpgInfoTagPtr tag(item.GetEPGInfoTag()); + if (!tag || !tag->HasPVRChannel()) return false; - if (bIsRecording) - { - if (ConfirmStopRecording(timer.get())) - return CPVRTimers::DeleteTimer(*timer, true, false); - } - else if (timer->GetPVRTimerInfoTag()->HasTimerType() && - timer->GetPVRTimerInfoTag()->GetTimerType()->IsReadOnly()) - { + CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(&item); + if (!timer || !timer->HasPVRTimerInfoTag() || timer->GetPVRTimerInfoTag()->m_bIsRepeating) return false; - } - else - { - bool bDeleteSchedule(false); - if (ConfirmDeleteTimer(timer.get(), bDeleteSchedule)) - return CPVRTimers::DeleteTimer(*timer, false, bDeleteSchedule); - } - return false; + + return g_PVRTimers->DeleteTimer(*timer); } void CGUIWindowPVRBase::CheckResumeRecording(CFileItem *item) @@ -596,7 +490,7 @@ { if (bCheckResume) CheckResumeRecording(item); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast(new CFileItem(*item))); + CApplicationMessenger::Get().PlayFile(*item, false); return true; } @@ -642,13 +536,13 @@ else { CLog::Log(LOGERROR, "CGUIWindowPVRCommon - %s - can't open recording: no valid filename", __FUNCTION__); - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19036}); + CGUIDialogOK::ShowAndGetInput(19033, 19036); return false; } if (bCheckResume) CheckResumeRecording(item); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast(new CFileItem(*item))); + CApplicationMessenger::Get().PlayFile(*item, false); return true; } @@ -659,7 +553,7 @@ if (item->IsPVRRecording() && pDlgInfo) { pDlgInfo->SetRecording(item); - pDlgInfo->Open(); + pDlgInfo->DoModal(); } } @@ -677,16 +571,6 @@ bHasChannel = true; } } - else if (item->IsPVRTimer()) - { - CEpgInfoTagPtr epg(item->GetPVRTimerInfoTag()->GetEpgInfoTag()); - if (epg && epg->HasPVRChannel()) - { - channel = epg->ChannelTag(); - bHasChannel = true; - } - tag = new CFileItem(epg); - } else if (item->IsPVRChannel()) { CEpgInfoTagPtr epgnow(item->GetPVRChannelInfoTag()->GetEPGNow()); @@ -694,7 +578,7 @@ bHasChannel = true; if (!epgnow) { - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19055}); + CGUIDialogOK::ShowAndGetInput(19033, 19055); return; } tag = new CFileItem(epgnow); @@ -704,7 +588,7 @@ if (tag && (!bHasChannel || g_PVRManager.CheckParentalLock(channel)) && pDlgInfo) { pDlgInfo->SetProgInfo(tag); - pDlgInfo->Open(); + pDlgInfo->DoModal(); } delete tag; @@ -747,21 +631,9 @@ return false; } -bool CGUIWindowPVRBase::ActionToggleTimer(CFileItem *item) -{ - if (!item->HasEPGInfoTag()) - return false; - - CPVRTimerInfoTagPtr timer(item->GetEPGInfoTag()->Timer()); - if (timer) - return DeleteTimer(item, timer->IsRecording()); - else - return AddTimer(item, false); -} - bool CGUIWindowPVRBase::ActionPlayChannel(CFileItem *item) { - return PlayFile(item, CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPLAYBACK_PLAYMINIMIZED)); + return PlayFile(item, CSettings::Get().GetBool("pvrplayback.playminimized")); } bool CGUIWindowPVRBase::ActionPlayEpg(CFileItem *item, bool bPlayRecording) @@ -788,7 +660,7 @@ { // CHANNELNAME could not be played. Check the log for details. std::string msg = StringUtils::Format(g_localizeStrings.Get(19035).c_str(), channel->ChannelName().c_str()); - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{std::move(msg)}); + CGUIDialogOK::ShowAndGetInput(19033, msg); return false; } @@ -807,11 +679,11 @@ CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*) g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!pDialog) return false; - pDialog->SetHeading(CVariant{19039}); - pDialog->SetLine(0, CVariant{""}); - pDialog->SetLine(1, CVariant{channel->ChannelName()}); - pDialog->SetLine(2, CVariant{""}); - pDialog->Open(); + pDialog->SetHeading(19039); + pDialog->SetLine(0, ""); + pDialog->SetLine(1, channel->ChannelName()); + pDialog->SetLine(2, ""); + pDialog->DoModal(); /* prompt for the user's confirmation */ if (!pDialog->IsConfirmed()) @@ -823,11 +695,59 @@ return true; } +bool CGUIWindowPVRBase::ActionRecord(CFileItem *item) +{ + bool bReturn = false; + + CEpgInfoTagPtr epgTag(item->GetEPGInfoTag()); + if (!epgTag) + return bReturn; + + CPVRChannelPtr channel = epgTag->ChannelTag(); + if (!channel || !g_PVRManager.CheckParentalLock(channel)) + return bReturn; + + if (epgTag->Timer() == NULL) + { + /* create a confirmation dialog */ + CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*) g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); + if (!pDialog) + return bReturn; + + pDialog->SetHeading(264); + pDialog->SetLine(0, ""); + pDialog->SetLine(1, epgTag->Title()); + pDialog->SetLine(2, ""); + pDialog->DoModal(); + + /* prompt for the user's confirmation */ + if (!pDialog->IsConfirmed()) + return bReturn; + + CPVRTimerInfoTagPtr newTimer = CPVRTimerInfoTag::CreateFromEpg(epgTag); + if (newTimer) + { + bReturn = g_PVRTimers->AddTimer(newTimer); + } + else + { + bReturn = false; + } + } + else + { + CGUIDialogOK::ShowAndGetInput(19033, 19034); + bReturn = true; + } + + return bReturn; +} + bool CGUIWindowPVRBase::UpdateEpgForChannel(CFileItem *item) { CPVRChannelPtr channel(item->GetPVRChannelInfoTag()); - CEpgPtr epg = channel->GetEPG(); + CEpg *epg = channel->GetEPG(); if (!epg) return false; @@ -843,53 +763,5 @@ void CGUIWindowPVRBase::UpdateSelectedItemPath() { - if (!m_viewControl.GetSelectedItemPath().empty()) { - CSingleLock lock(m_selectedItemPathsLock); - m_selectedItemPaths[m_bRadio] = m_viewControl.GetSelectedItemPath(); - } -} - -bool CGUIWindowPVRBase::ConfirmDeleteTimer(CFileItem *item, bool &bDeleteSchedule) -{ - bool bConfirmed(false); - - if (item->GetPVRTimerInfoTag()->GetTimerScheduleId() != PVR_TIMER_NO_PARENT) - { - // timer was scheduled by a repeating timer. prompt user for confirmation for deleting the complete repeating timer, including scheduled timers. - bool bCancel(false); - bDeleteSchedule = CGUIDialogYesNo::ShowAndGetInput( - CVariant{122}, // "Confirm delete" - CVariant{840}, // "Do you only want to delete this timer or also the repeating timer that has scheduled it?" - CVariant{""}, - CVariant{item->GetPVRTimerInfoTag()->Title()}, - bCancel, - CVariant{841}, // "Only this" - CVariant{593}, // "All" - 0); // no autoclose - bConfirmed = !bCancel; - } - else - { - bDeleteSchedule = false; - - // prompt user for confirmation for deleting the timer - bConfirmed = CGUIDialogYesNo::ShowAndGetInput( - CVariant{122}, // "Confirm delete" - item->GetPVRTimerInfoTag()->IsRepeating() - ? CVariant{845} // "Are you sure you want to delete this repeating timer and all timers it has scheduled?" - : CVariant{846}, // "Are you sure you want to delete this timer?" - CVariant{""}, - CVariant{item->GetPVRTimerInfoTag()->Title()}); - } - - return bConfirmed; -} - -bool CGUIWindowPVRBase::ConfirmStopRecording(CFileItem *item) -{ - return CGUIDialogYesNo::ShowAndGetInput( - CVariant{847}, // "Confirm stop recording" - CVariant{848}, // "Are you sure you want to stop this recording?" - CVariant{""}, - CVariant{item->GetPVRTimerInfoTag()->Title()}); + m_selectedItemPaths.at(m_bRadio) = m_viewControl.GetSelectedItemPath(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRBase.h kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRBase.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRBase.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRBase.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -28,7 +29,6 @@ #define CONTROL_BTNGROUPITEMS 5 #define CONTROL_BTNSHOWHIDDEN 6 #define CONTROL_BTNSHOWDELETED 7 -#define CONTROL_BTNTIMERTYPEFILTER 8 #define CONTROL_BTNCHANNELGROUPS 28 #define CONTROL_BTNFILTERCHANNELS 31 @@ -63,7 +63,6 @@ virtual bool OnMessage(CGUIMessage& message); virtual bool OnContextButton(int itemNumber, CONTEXT_BUTTON button); virtual bool OnContextButton(const CFileItem &item, CONTEXT_BUTTON button) { return false; }; - virtual bool OnContextButtonActiveAEDSPSettings(CFileItem *item, CONTEXT_BUTTON button); virtual void UpdateButtons(void); virtual bool OnAction(const CAction &action); virtual bool OnBack(int actionID); @@ -71,16 +70,10 @@ virtual void ResetObservers(void) {}; virtual void Notify(const Observable &obs, const ObservableMessage msg); virtual void SetInvalid(); - virtual bool CanBeActivated() const; static std::string GetSelectedItemPath(bool bRadio); static void SetSelectedItemPath(bool bRadio, const std::string &path); - static bool ShowTimerSettings(CFileItem *item); - static bool AddTimer(CFileItem *item, bool bAdvanced); - static bool DeleteTimer(CFileItem *item); - static bool StopRecordFile(CFileItem *item); - protected: CGUIWindowPVRBase(bool bRadio, int id, const std::string &xmlFile); @@ -88,7 +81,7 @@ virtual CPVRChannelGroupPtr GetGroup(void); virtual void SetGroup(CPVRChannelGroupPtr group); - virtual bool ActionToggleTimer(CFileItem *item); + virtual bool ActionRecord(CFileItem *item); virtual bool ActionPlayChannel(CFileItem *item); virtual bool ActionPlayEpg(CFileItem *item, bool bPlayRecording); virtual bool ActionDeleteChannel(CFileItem *item); @@ -96,6 +89,8 @@ virtual bool PlayRecording(CFileItem *item, bool bPlayMinimized = false, bool bCheckResume = true); virtual bool PlayFile(CFileItem *item, bool bPlayMinimized = false, bool bCheckResume = true); + virtual bool StartRecordFile(const CFileItem &item); + virtual bool StopRecordFile(const CFileItem &item); virtual void ShowEPGInfo(CFileItem *item); virtual void ShowRecordingInfo(CFileItem *item); virtual bool UpdateEpgForChannel(CFileItem *item); @@ -103,33 +98,12 @@ virtual bool IsValidMessage(CGUIMessage& message); void CheckResumeRecording(CFileItem *item); - static CCriticalSection m_selectedItemPathsLock; - static std::string m_selectedItemPaths[2]; + static std::map m_selectedItemPaths; CCriticalSection m_critSection; bool m_bRadio; private: - /*! - * @brief Open a dialog to confirm timer delete. - * @param item the timer to delete. - * @param bDeleteSchedule in: ignored - * out, for one shot timer scheduled by a repeating timer: true to also delete the - * repeating timer that has scheduled this timer, false to only delete the one shot timer. - * out, for one shot timer not scheduled by a repeating timer: ignored - * @return true, to proceed with delete, false otherwise. - */ - static bool ConfirmDeleteTimer(CFileItem *item, bool &bDeleteSchedule); - - /*! - * @brief Open a dialog to confirm stop recording. - * @param item the recording to stop (actually the timer to delete). - * @return true, to proceed with delete, false otherwise. - */ - static bool ConfirmStopRecording(CFileItem *item); - - static bool DeleteTimer(CFileItem *item, bool bIsRecording); - CPVRChannelGroupPtr m_group; XbmcThreads::EndTime m_refreshTimeout; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRChannels.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRChannels.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRChannels.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRChannels.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,11 +18,9 @@ * */ +#include "GUIWindowPVRChannels.h" #include "ContextMenuManager.h" -#include "GUIInfoManager.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" -#include "epg/EpgContainer.h" #include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogYesNo.h" @@ -30,18 +28,16 @@ #include "guilib/GUIRadioButtonControl.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" -#include "threads/SingleLock.h" -#include "utils/StringUtils.h" -#include "utils/Variant.h" - +#include "GUIInfoManager.h" #include "pvr/PVRManager.h" -#include "pvr/addons/PVRClients.h" #include "pvr/channels/PVRChannelGroupsContainer.h" -#include "pvr/dialogs/GUIDialogPVRChannelManager.h" #include "pvr/dialogs/GUIDialogPVRGroupManager.h" +#include "pvr/dialogs/GUIDialogPVRChannelManager.h" +#include "pvr/addons/PVRClients.h" #include "pvr/timers/PVRTimers.h" - -#include "GUIWindowPVRChannels.h" +#include "epg/EpgContainer.h" +#include "utils/StringUtils.h" +#include "threads/SingleLock.h" using namespace PVR; using namespace EPG; @@ -77,29 +73,19 @@ CFileItemPtr pItem = m_vecItems->Get(itemNumber); CPVRChannelPtr channel(pItem->GetPVRChannelInfoTag()); - if (channel->GetEPGNow()) - { - buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */ - buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar */ - } - - if (channel->IsRecording()) - buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */ - else if (g_PVRClients->SupportsTimers(channel->ClientID())) - buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* Record */ - - if (ActiveAE::CActiveAEDSP::GetInstance().IsProcessing()) - buttons.Add(CONTEXT_BUTTON_ACTIVE_ADSP_SETTINGS, 15047); /* Audio DSP settings */ + buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* channel info */ + buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* find similar program */ + buttons.Add(CONTEXT_BUTTON_RECORD_ITEM, channel->IsRecording() ? 19256 : 19255); /* start/stop recording on channel */ - if (g_PVRClients->HasMenuHooks(channel->ClientID(), PVR_MENUHOOK_CHANNEL)) + if (g_PVRClients->HasMenuHooks(pItem->GetPVRChannelInfoTag()->ClientID(), PVR_MENUHOOK_CHANNEL)) buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ // Add parent buttons before the Manage button CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons); - buttons.Add(CONTEXT_BUTTON_EDIT, 16106); /* Manage... */ + buttons.Add(CONTEXT_BUTTON_EDIT, 16106); /* "Manage" submenu */ - CContextMenuManager::GetInstance().AddVisibleItems(pItem, buttons); + CContextMenuManager::Get().AddVisibleItems(pItem, buttons); } std::string CGUIWindowPVRChannels::GetDirectoryPath(void) @@ -119,10 +105,8 @@ OnContextButtonInfo(pItem.get(), button) || OnContextButtonGroupManager(pItem.get(), button) || OnContextButtonUpdateEpg(pItem.get(), button) || - OnContextButtonStartRecord(pItem.get(), button) || - OnContextButtonStopRecord(pItem.get(), button) || + OnContextButtonRecord(pItem.get(), button) || OnContextButtonManage(pItem.get(), button) || - OnContextButtonActiveAEDSPSettings(pItem.get(), button) || CGUIWindowPVRBase::OnContextButton(itemNumber, button); } @@ -269,7 +253,7 @@ if (button == CONTEXT_BUTTON_ADD) { - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19038}); + CGUIDialogOK::ShowAndGetInput(19033, 19038); bReturn = true; } @@ -343,28 +327,16 @@ return bReturn; } -bool CGUIWindowPVRChannels::OnContextButtonStartRecord(CFileItem *item, CONTEXT_BUTTON button) +bool CGUIWindowPVRChannels::OnContextButtonRecord(CFileItem *item, CONTEXT_BUTTON button) { - bool bReturn = false; + bool bReturn(false); - if ((button == CONTEXT_BUTTON_START_RECORD) || - (button == CONTEXT_BUTTON_ADD_TIMER)) + if (button == CONTEXT_BUTTON_RECORD_ITEM) { - AddTimer(item, button == CONTEXT_BUTTON_ADD_TIMER); - bReturn = true; - } - - return bReturn; -} - -bool CGUIWindowPVRChannels::OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button) -{ - bool bReturn = false; + CPVRChannelPtr channel(item->GetPVRChannelInfoTag()); - if (button == CONTEXT_BUTTON_STOP_RECORD) - { - StopRecordFile(item); - bReturn = true; + if (channel) + return g_PVRManager.ToggleRecordingOnChannel(channel->ChannelID()); } return bReturn; @@ -382,11 +354,11 @@ CPVRChannelPtr channel(item->GetPVRChannelInfoTag()); - pDialog->SetHeading(CVariant{19251}); - pDialog->SetLine(0, CVariant{g_localizeStrings.Get(19252)}); - pDialog->SetLine(1, CVariant{channel->ChannelName()}); - pDialog->SetLine(2, CVariant{""}); - pDialog->Open(); + pDialog->SetHeading(19251); + pDialog->SetLine(0, g_localizeStrings.Get(19252)); + pDialog->SetLine(1, channel->ChannelName()); + pDialog->SetLine(2, ""); + pDialog->DoModal(); if (!pDialog->IsConfirmed()) return bReturn; @@ -406,7 +378,7 @@ { CGUIDialogPVRChannelManager *dialog = (CGUIDialogPVRChannelManager *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_CHANNEL_MANAGER); if (dialog) - dialog->Open(); + dialog->DoModal(); } void CGUIWindowPVRChannels::ShowGroupManager(void) @@ -417,7 +389,7 @@ return; pDlgInfo->SetRadio(m_bRadio); - pDlgInfo->Open(); + pDlgInfo->DoModal(); return; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRChannels.h kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRChannels.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRChannels.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRChannels.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -47,8 +48,7 @@ bool OnContextButtonInfo(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonManage(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonUpdateEpg(CFileItem *item, CONTEXT_BUTTON button); - bool OnContextButtonStartRecord(CFileItem *item, CONTEXT_BUTTON button); - bool OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button); + bool OnContextButtonRecord(CFileItem *item, CONTEXT_BUTTON button); void ShowChannelManager(); void ShowGroupManager(void); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRGuide.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRGuide.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRGuide.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRGuide.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,22 +18,21 @@ * */ +#include "GUIWindowPVRGuide.h" + #include "ContextMenuManager.h" #include "GUIUserMessages.h" -#include "epg/EpgContainer.h" #include "input/Key.h" +#include "pvr/PVRManager.h" +#include "pvr/channels/PVRChannelGroupsContainer.h" +#include "epg/EpgContainer.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "threads/SingleLock.h" #include "utils/log.h" - -#include "pvr/PVRManager.h" #include "pvr/addons/PVRClients.h" -#include "pvr/channels/PVRChannelGroupsContainer.h" #include "pvr/timers/PVRTimers.h" -#include "GUIWindowPVRGuide.h" - #define MAX_UPDATE_FREQUENCY 3000 // limit to maximum one update/refresh in x milliseconds using namespace PVR; @@ -82,51 +81,44 @@ return; CFileItemPtr pItem = m_vecItems->Get(itemNumber); - buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 19000); /* Switch channel */ - buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */ - buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar */ + buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 19000); /* switch channel */ - CEpgInfoTagPtr epg(pItem->GetEPGInfoTag()); - if (epg) - { - CPVRTimerInfoTagPtr timer(epg->Timer()); - if (timer) - { - if (timer->IsRecording()) - buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */ - else - { - CPVRTimerTypePtr timerType(timer->GetTimerType()); - if (timerType && !timerType->IsReadOnly()) - buttons.Add(CONTEXT_BUTTON_DELETE_TIMER, 19060); /* Delete timer */ - } - } - else if (g_PVRClients->SupportsTimers() && epg->EndAsLocalTime() > CDateTime::GetCurrentDateTime()) - { - buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* Record */ - buttons.Add(CONTEXT_BUTTON_ADD_TIMER, 19061); /* Add timer */ - } + if (pItem->HasEPGInfoTag() && pItem->GetEPGInfoTag()->HasRecording()) + buttons.Add(CONTEXT_BUTTON_PLAY_OTHER, 19687); /* play recording */ - if (epg->HasRecording()) - buttons.Add(CONTEXT_BUTTON_PLAY_OTHER, 19687); /* Play recording */ + CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(pItem.get()); + if (timer && timer->HasPVRTimerInfoTag()) + { + if (timer->GetPVRTimerInfoTag()->IsRecording()) + buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* stop recording */ + else + buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19060); /* delete timer */ } - - if (m_viewControl.GetCurrentControl() == GUIDE_VIEW_TIMELINE) + else if (pItem->HasEPGInfoTag() && pItem->GetEPGInfoTag()->EndAsLocalTime() > CDateTime::GetCurrentDateTime()) { - buttons.Add(CONTEXT_BUTTON_BEGIN, 19063); /* Go to begin */ - buttons.Add(CONTEXT_BUTTON_NOW, 19070); /* Go to now */ - buttons.Add(CONTEXT_BUTTON_END, 19064); /* Go to end */ + if (pItem->GetEPGInfoTag()->StartAsLocalTime() < CDateTime::GetCurrentDateTime()) + buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* record */ + else + buttons.Add(CONTEXT_BUTTON_START_RECORD, 19061); /* add timer */ } - if (epg) + buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* epg info */ + buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* find similar program */ + + if (m_viewControl.GetCurrentControl() == GUIDE_VIEW_TIMELINE) { - CPVRChannelPtr channel(epg->ChannelTag()); - if (channel && g_PVRClients->HasMenuHooks(channel->ClientID(), PVR_MENUHOOK_EPG)) - buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ + buttons.Add(CONTEXT_BUTTON_BEGIN, 19063); /* go to begin */ + buttons.Add(CONTEXT_BUTTON_NOW, 19070); /* go to now */ + buttons.Add(CONTEXT_BUTTON_END, 19064); /* go to end */ } + if (pItem->HasEPGInfoTag() && + pItem->GetEPGInfoTag()->HasPVRChannel() && + g_PVRClients->HasMenuHooks(pItem->GetEPGInfoTag()->ChannelTag()->ClientID(), PVR_MENUHOOK_EPG)) + buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ + CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons); - CContextMenuManager::GetInstance().AddVisibleItems(pItem, buttons); + CContextMenuManager::Get().AddVisibleItems(pItem, buttons); } void CGUIWindowPVRGuide::UpdateSelectedItemPath() @@ -145,56 +137,6 @@ CGUIWindowPVRBase::UpdateSelectedItemPath(); } -bool CGUIWindowPVRGuide::Update(const std::string &strDirectory, bool updateFilterPath /* = true */) -{ - bool bReturn = CGUIWindowPVRBase::Update(strDirectory, updateFilterPath); - - switch (m_viewControl.GetCurrentControl()) - { - case GUIDE_VIEW_TIMELINE: { - CGUIEPGGridContainer* epgGridContainer = (CGUIEPGGridContainer*) GetControl(m_viewControl.GetCurrentControl()); - if (epgGridContainer) - epgGridContainer->SetChannel(GetSelectedItemPath(m_bRadio)); - break; - } - default: - break; - } - - return bReturn; -} - -void CGUIWindowPVRGuide::UpdateButtons(void) -{ - CGUIWindowPVRBase::UpdateButtons(); - - switch (m_viewControl.GetCurrentControl()) - { - case GUIDE_VIEW_TIMELINE: { - SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, g_localizeStrings.Get(19032)); - break; - } - case GUIDE_VIEW_NOW: { - SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, g_localizeStrings.Get(19030)); - break; - } - case GUIDE_VIEW_NEXT: { - SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, g_localizeStrings.Get(19031)); - break; - } - case GUIDE_VIEW_CHANNEL: { - CPVRChannelPtr currentChannel(g_PVRManager.GetCurrentChannel()); - if (currentChannel) - SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, currentChannel->ChannelName().c_str()); - break; - } - default: - break; - } - - SET_CONTROL_LABEL(CONTROL_LABEL_HEADER2, GetGroup()->GroupName()); -} - bool CGUIWindowPVRGuide::GetDirectory(const std::string &strDirectory, CFileItemList &items) { switch (m_viewControl.GetCurrentControl()) @@ -262,7 +204,7 @@ { case ACTION_SELECT_ITEM: case ACTION_MOUSE_LEFT_CLICK: - switch(CSettings::GetInstance().GetInt(CSettings::SETTING_EPG_SELECTACTION)) + switch(CSettings::Get().GetInt("epg.selectaction")) { case EPG_SELECT_ACTION_CONTEXT_MENU: OnPopupMenu(iItem); @@ -281,7 +223,7 @@ bReturn = true; break; case EPG_SELECT_ACTION_RECORD: - ActionToggleTimer(pItem.get()); + ActionRecord(pItem.get()); bReturn = true; break; } @@ -295,7 +237,7 @@ bReturn = true; break; case ACTION_RECORD: - ActionToggleTimer(pItem.get()); + ActionRecord(pItem.get()); bReturn = true; break; case ACTION_CONTEXT_MENU: @@ -305,31 +247,6 @@ break; } } - else if (iItem == -1) - { - /* process actions */ - switch (message.GetParam1()) - { - case ACTION_SELECT_ITEM: - case ACTION_MOUSE_LEFT_CLICK: - case ACTION_PLAY: - { - // EPG "gap" selected => switch to associated channel. - CGUIEPGGridContainer *epgGridContainer = - dynamic_cast(GetControl(m_viewControl.GetCurrentControl())); - if (epgGridContainer) - { - CFileItemPtr item(epgGridContainer->GetSelectedChannelItem()); - if (item) - { - ActionPlayEpg(item.get(), false); - bReturn = true; - } - } - break; - } - } - } } else if (message.GetSenderId() == CONTROL_BTNVIEWASICONS) { @@ -392,7 +309,6 @@ OnContextButtonInfo(pItem.get(), button) || OnContextButtonStartRecord(pItem.get(), button) || OnContextButtonStopRecord(pItem.get(), button) || - OnContextButtonDeleteTimer(pItem.get(), button) || OnContextButtonBegin(pItem.get(), button) || OnContextButtonEnd(pItem.get(), button) || OnContextButtonNow(pItem.get(), button) || @@ -402,6 +318,11 @@ void CGUIWindowPVRGuide::GetViewChannelItems(CFileItemList &items) { CPVRChannelPtr currentChannel(g_PVRManager.GetCurrentChannel()); + + if (currentChannel) + SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, currentChannel->ChannelName().c_str()); + SET_CONTROL_LABEL(CONTROL_LABEL_HEADER2, GetGroup()->GroupName()); + items.Clear(); if (!currentChannel || g_PVRManager.GetCurrentEpg(items) == 0) { @@ -415,6 +336,9 @@ void CGUIWindowPVRGuide::GetViewNowItems(CFileItemList &items) { + SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, g_localizeStrings.Get(19030)); + SET_CONTROL_LABEL(CONTROL_LABEL_HEADER2, GetGroup()->GroupName()); + items.Clear(); int iEpgItems = GetGroup()->GetEPGNow(items); @@ -430,6 +354,9 @@ void CGUIWindowPVRGuide::GetViewNextItems(CFileItemList &items) { + SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, g_localizeStrings.Get(19031)); + SET_CONTROL_LABEL(CONTROL_LABEL_HEADER2, GetGroup()->GroupName()); + items.Clear(); int iEpgItems = GetGroup()->GetEPGNext(items); @@ -451,17 +378,13 @@ CPVRChannelGroupPtr group = GetGroup(); - // group change detected reset grid coordinate - if (*m_cachedChannelGroup != *group) - epgGridContainer->ResetCoordinates(); - if (m_bUpdateRequired || m_cachedTimeline->IsEmpty() || *m_cachedChannelGroup != *group) { m_bUpdateRequired = false; m_cachedTimeline->Clear(); m_cachedChannelGroup = group; - m_cachedChannelGroup->GetEPGAll(*m_cachedTimeline, true); + m_cachedChannelGroup->GetEPGAll(*m_cachedTimeline); } items.Clear(); @@ -484,6 +407,11 @@ startDate = maxPastDate; epgGridContainer->SetStartEnd(startDate, endDate); + + SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, g_localizeStrings.Get(19032)); + SET_CONTROL_LABEL(CONTROL_LABEL_HEADER2, GetGroup()->GroupName()); + + epgGridContainer->SetChannel(GetSelectedItemPath(m_bRadio)); } bool CGUIWindowPVRGuide::OnContextButtonBegin(CFileItem *item, CONTEXT_BUTTON button) @@ -558,10 +486,9 @@ { bool bReturn = false; - if ((button == CONTEXT_BUTTON_START_RECORD) || - (button == CONTEXT_BUTTON_ADD_TIMER)) + if (button == CONTEXT_BUTTON_START_RECORD) { - AddTimer(item, button == CONTEXT_BUTTON_ADD_TIMER); + StartRecordFile(*item); bReturn = true; } @@ -574,20 +501,7 @@ if (button == CONTEXT_BUTTON_STOP_RECORD) { - StopRecordFile(item); - bReturn = true; - } - - return bReturn; -} - -bool CGUIWindowPVRGuide::OnContextButtonDeleteTimer(CFileItem *item, CONTEXT_BUTTON button) -{ - bool bReturn = false; - - if (button == CONTEXT_BUTTON_DELETE_TIMER) - { - DeleteTimer(item); + StopRecordFile(*item); bReturn = true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRGuide.h kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRGuide.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRGuide.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRGuide.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -19,9 +20,9 @@ * */ +#include "GUIWindowPVRBase.h" #include "epg/GUIEPGGridContainer.h" #include "threads/SystemClock.h" -#include "GUIWindowPVRBase.h" class CSetting; @@ -40,8 +41,6 @@ bool OnContextButton(int itemNumber, CONTEXT_BUTTON button); void ResetObservers(void); void UnregisterObservers(void); - bool Update(const std::string &strDirectory, bool updateFilterPath = true); - void UpdateButtons(void); protected: void UpdateSelectedItemPath(); @@ -57,7 +56,6 @@ bool OnContextButtonPlay(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonStartRecord(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button); - bool OnContextButtonDeleteTimer(CFileItem *item, CONTEXT_BUTTON button); void GetViewChannelItems(CFileItemList &items); void GetViewNowItems(CFileItemList &items); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,26 +18,23 @@ * */ +#include "GUIWindowPVRRecordings.h" + #include "ContextMenuManager.h" -#include "GUIInfoManager.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" -#include "dialogs/GUIDialogYesNo.h" -#include "guilib/LocalizeStrings.h" #include "guilib/GUIKeyboardFactory.h" +#include "dialogs/GUIDialogYesNo.h" #include "guilib/GUIRadioButtonControl.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" -#include "threads/SingleLock.h" -#include "utils/StringUtils.h" -#include "utils/Variant.h" -#include "video/windows/GUIWindowVideoNav.h" - +#include "guilib/LocalizeStrings.h" +#include "GUIInfoManager.h" #include "pvr/PVRManager.h" -#include "pvr/addons/PVRClients.h" #include "pvr/recordings/PVRRecordings.h" #include "pvr/timers/PVRTimers.h" - -#include "GUIWindowPVRRecordings.h" +#include "utils/StringUtils.h" +#include "threads/SingleLock.h" +#include "pvr/addons/PVRClients.h" +#include "video/windows/GUIWindowVideoNav.h" using namespace PVR; @@ -118,24 +115,25 @@ bool isDeletedRecording = false; - CPVRRecordingPtr recording(pItem->GetPVRRecordingInfoTag()); - if (recording) + if (pItem->HasPVRRecordingInfoTag()) { - isDeletedRecording = recording->IsDeleted(); + isDeletedRecording = pItem->GetPVRRecordingInfoTag()->IsDeleted(); - buttons.Add(CONTEXT_BUTTON_INFO, 19053); /* Recording Information */ + buttons.Add(CONTEXT_BUTTON_INFO, 19053); /* Get Information of this recording */ if (!isDeletedRecording) { - buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar */ - buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 12021); /* Start from beginning */ + buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar program */ + buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 12021); /* Play this recording */ std::string resumeString = GetResumeString(*pItem); if (!resumeString.empty()) + { buttons.Add(CONTEXT_BUTTON_RESUME_ITEM, resumeString); + } } else { - buttons.Add(CONTEXT_BUTTON_UNDELETE, 19290); /* Undelete */ - buttons.Add(CONTEXT_BUTTON_DELETE, 19291); /* Delete permanently */ + buttons.Add(CONTEXT_BUTTON_UNDELETE, 19290); /* Undelete this recording */ + buttons.Add(CONTEXT_BUTTON_DELETE, 19291); /* Delete this permanently */ if (m_vecItems->GetObjectCount() > 1) buttons.Add(CONTEXT_BUTTON_DELETE_ALL, 19292); /* Delete all permanently */ } @@ -144,37 +142,35 @@ { if (pItem->m_bIsFolder) { - // Have both options for folders since we don't know whether all children are watched/unwatched - buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); /* Mark as unwatched */ - buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); /* Mark as watched */ + // Have both options for folders since we don't know whether all childs are watched/unwatched + buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); /* Mark as UnWatched */ + buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); /* Mark as Watched */ } - if (recording) + if (pItem->HasPVRRecordingInfoTag()) { - if (recording->m_playCount > 0) - buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); /* Mark as unwatched */ + if (pItem->GetPVRRecordingInfoTag()->m_playCount > 0) + buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); /* Mark as UnWatched */ else - buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); /* Mark as watched */ + buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); /* Mark as Watched */ - buttons.Add(CONTEXT_BUTTON_RENAME, 118); /* Rename */ + buttons.Add(CONTEXT_BUTTON_RENAME, 118); /* Rename this recording */ } - buttons.Add(CONTEXT_BUTTON_DELETE, 117); /* Delete */ + buttons.Add(CONTEXT_BUTTON_DELETE, 117); } - if (ActiveAE::CActiveAEDSP::GetInstance().IsProcessing()) - buttons.Add(CONTEXT_BUTTON_ACTIVE_ADSP_SETTINGS, 15047); /* Audio DSP settings */ - - if (recording) + if (pItem->HasPVRRecordingInfoTag()) { - if ((!isDeletedRecording && g_PVRClients->HasMenuHooks(recording->m_iClientId, PVR_MENUHOOK_RECORDING)) || - (isDeletedRecording && g_PVRClients->HasMenuHooks(recording->m_iClientId, PVR_MENUHOOK_DELETED_RECORDING))) + if (!isDeletedRecording && g_PVRClients->HasMenuHooks(pItem->GetPVRRecordingInfoTag()->m_iClientId, PVR_MENUHOOK_RECORDING)) + buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ + else if (isDeletedRecording && g_PVRClients->HasMenuHooks(pItem->GetPVRRecordingInfoTag()->m_iClientId, PVR_MENUHOOK_DELETED_RECORDING)) buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ } if (!isDeletedRecording) CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons); - CContextMenuManager::GetInstance().AddVisibleItems(pItem, buttons); + CContextMenuManager::Get().AddVisibleItems(pItem, buttons); } bool CGUIWindowPVRRecordings::OnAction(const CAction &action) @@ -204,7 +200,6 @@ OnContextButtonDeleteAll(pItem.get(), button) || OnContextButtonInfo(pItem.get(), button) || OnContextButtonMarkWatched(pItem, button) || - OnContextButtonActiveAEDSPSettings(pItem.get(), button) || CGUIWindowPVRBase::OnContextButton(itemNumber, button); } @@ -338,15 +333,14 @@ if (!pDialog) return bReturn; - int iLine0 = item->m_bIsFolder ? 19113 : item->GetPVRRecordingInfoTag()->IsDeleted() ? 19294 : 19112; - pDialog->SetHeading(CVariant{122}); // Confirm delete - pDialog->SetLine(0, CVariant{iLine0}); // Delete all recordings in this folder? / Delete this recording permanently? / Delete this recording? - pDialog->SetLine(1, CVariant{""}); - pDialog->SetLine(2, CVariant{item->GetLabel()}); - pDialog->SetChoice(1, CVariant{117}); // Delete + pDialog->SetHeading(122); // Confirm delete + pDialog->SetLine(0, item->m_bIsFolder ? 19113 : item->GetPVRRecordingInfoTag()->IsDeleted() ? 19294 : 19112); // Delete all recordings in this folder? / Delete this recording permanently? / Delete this recording? + pDialog->SetLine(1, ""); + pDialog->SetLine(2, item->GetLabel()); + pDialog->SetChoice(1, 117); // Delete /* prompt for the user's confirmation */ - pDialog->Open(); + pDialog->DoModal(); if (!pDialog->IsConfirmed()) return bReturn; @@ -412,14 +406,14 @@ return bReturn; - pDialog->SetHeading(CVariant{19292}); // Delete all permanently - pDialog->SetLine(0, CVariant{19293}); // Delete all recordings permanently? - pDialog->SetLine(1, CVariant{""}); - pDialog->SetLine(2, CVariant{""}); - pDialog->SetChoice(1, CVariant{117}); // Delete + pDialog->SetHeading(19292); // Delete all permanently + pDialog->SetLine(0, 19293); // Delete all recordings permanently? + pDialog->SetLine(1, ""); + pDialog->SetLine(2, ""); + pDialog->SetChoice(1, 117); // Delete /* prompt for the user's confirmation */ - pDialog->Open(); + pDialog->DoModal(); if (!pDialog->IsConfirmed()) return bReturn; @@ -479,7 +473,7 @@ bReturn = true; std::string strNewName = recording->m_strTitle; - if (CGUIKeyboardFactory::ShowAndGetInput(strNewName, CVariant{g_localizeStrings.Get(19041)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(strNewName, g_localizeStrings.Get(19041), false)) { if (g_PVRRecordings->RenameRecording(*item, strNewName)) Refresh(true); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRRecordings.h kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRRecordings.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRRecordings.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRRecordings.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -19,11 +20,10 @@ * */ +#include "GUIWindowPVRBase.h" #include "video/VideoThumbLoader.h" #include "video/VideoDatabase.h" -#include "GUIWindowPVRBase.h" - namespace PVR { class CGUIWindowPVRRecordings : public CGUIWindowPVRBase diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRSearch.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRSearch.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRSearch.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRSearch.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,20 +18,18 @@ * */ +#include "GUIWindowPVRSearch.h" + #include "ContextMenuManager.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogProgress.h" -#include "epg/EpgContainer.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" -#include "utils/Variant.h" - #include "pvr/PVRManager.h" -#include "pvr/addons/PVRClients.h" #include "pvr/channels/PVRChannelGroupsContainer.h" #include "pvr/dialogs/GUIDialogPVRGuideSearch.h" - -#include "GUIWindowPVRSearch.h" +#include "epg/EpgContainer.h" +#include "pvr/addons/PVRClients.h" using namespace PVR; using namespace EPG; @@ -48,42 +46,36 @@ return; CFileItemPtr pItem = m_vecItems->Get(itemNumber); - buttons.Add(CONTEXT_BUTTON_CLEAR, 19232); /* Clear search results */ - - CEpgInfoTagPtr epg(pItem->GetEPGInfoTag()); - if (epg) + if (pItem->HasEPGInfoTag()) { - buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */ - - CPVRTimerInfoTagPtr timer(epg->Timer()); - if (timer) + if (pItem->GetEPGInfoTag()->EndAsLocalTime() > CDateTime::GetCurrentDateTime()) { - if (timer->IsRecording()) - buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */ + if (!pItem->GetEPGInfoTag()->HasTimer()) + { + if (pItem->GetEPGInfoTag()->StartAsLocalTime() < CDateTime::GetCurrentDateTime()) + buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* RECORD programme */ + else + buttons.Add(CONTEXT_BUTTON_START_RECORD, 19061); /* Create a Timer */ + } else { - CPVRTimerTypePtr timerType(timer->GetTimerType()); - if (timerType && !timerType->IsReadOnly()) - buttons.Add(CONTEXT_BUTTON_DELETE_TIMER, 19060); /* Delete timer */ + if (pItem->GetEPGInfoTag()->StartAsLocalTime() < CDateTime::GetCurrentDateTime()) + buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */ + else + buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19060); /* Delete Timer */ } } - else if (g_PVRClients->SupportsTimers() && epg->EndAsLocalTime() > CDateTime::GetCurrentDateTime()) - { - buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* Record */ - buttons.Add(CONTEXT_BUTTON_ADD_TIMER, 19061); /* Add timer */ - } - - if (epg->HasRecording()) - buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 19687); /* Play recording */ - CPVRChannelPtr channel(epg->ChannelTag()); - if (channel && - g_PVRClients->HasMenuHooks(channel->ClientID(), PVR_MENUHOOK_EPG)) + buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Epg info button */ + if (pItem->GetEPGInfoTag()->HasPVRChannel() && + g_PVRClients->HasMenuHooks(pItem->GetEPGInfoTag()->ChannelTag()->ClientID(), PVR_MENUHOOK_EPG)) buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ } + buttons.Add(CONTEXT_BUTTON_CLEAR, 19232); /* Clear search results */ + CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons); - CContextMenuManager::GetInstance().AddVisibleItems(pItem, buttons); + CContextMenuManager::Get().AddVisibleItems(pItem, buttons); } void CGUIWindowPVRSearch::OnWindowLoaded() @@ -100,10 +92,8 @@ return OnContextButtonClear(pItem.get(), button) || OnContextButtonInfo(pItem.get(), button) || - OnContextButtonStartRecord(pItem.get(), button) || OnContextButtonStopRecord(pItem.get(), button) || - OnContextButtonDeleteTimer(pItem.get(), button) || - OnContextButtonPlay(pItem.get(), button) || + OnContextButtonStartRecord(pItem.get(), button) || CGUIWindowPVRBase::OnContextButton(itemNumber, button); } @@ -122,21 +112,15 @@ m_searchfilter.m_strSearchTerm = "\"" + item.GetEPGInfoTag()->Title() + "\""; else if (item.IsPVRChannel()) { - const CEpgInfoTagPtr tag(item.GetPVRChannelInfoTag()->GetEPGNow()); + CEpgInfoTagPtr tag(item.GetPVRChannelInfoTag()->GetEPGNow()); if (tag) m_searchfilter.m_strSearchTerm = "\"" + tag->Title() + "\""; } else if (item.IsUsablePVRRecording()) m_searchfilter.m_strSearchTerm = "\"" + item.GetPVRRecordingInfoTag()->m_strTitle + "\""; else if (item.IsPVRTimer()) - { - const CPVRTimerInfoTagPtr info(item.GetPVRTimerInfoTag()); - const CEpgInfoTagPtr tag(info->GetEpgInfoTag()); - if (tag) - m_searchfilter.m_strSearchTerm = "\"" + tag->Title() + "\""; - else - m_searchfilter.m_strSearchTerm = "\"" + info->m_strTitle + "\""; - } + m_searchfilter.m_strSearchTerm = "\"" + item.GetPVRTimerInfoTag()->m_strTitle + "\""; + m_bSearchConfirmed = true; Refresh(true); bReturn = true; @@ -151,20 +135,22 @@ void CGUIWindowPVRSearch::OnPrepareFileItems(CFileItemList &items) { - bool bAddSpecialSearchItem = items.IsEmpty(); + items.Clear(); + + CFileItemPtr item(new CFileItem("pvr://guide/searchresults/search/", true)); + item->SetLabel(g_localizeStrings.Get(19140)); + item->SetLabelPreformated(true); + item->SetSpecialSort(SortSpecialOnTop); + items.Add(item); if (m_bSearchConfirmed) { - m_bSearchConfirmed = false; - - bAddSpecialSearchItem = true; - CGUIDialogProgress* dlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); if (dlgProgress) { - dlgProgress->SetHeading(CVariant{194}); // "Searching..." - dlgProgress->SetText(CVariant{m_searchfilter.m_strSearchTerm}); - dlgProgress->Open(); + dlgProgress->SetHeading(194); + dlgProgress->SetText(CVariant(m_searchfilter.m_strSearchTerm)); + dlgProgress->StartModal(); dlgProgress->Progress(); } @@ -175,17 +161,10 @@ dlgProgress->Close(); if (items.IsEmpty()) - CGUIDialogOK::ShowAndGetInput(CVariant{194}, // "Searching..." - CVariant{284}); // "No results found" - } - - if (bAddSpecialSearchItem) - { - CFileItemPtr item(new CFileItem("pvr://guide/searchresults/search/", true)); - item->SetLabel(g_localizeStrings.Get(19140)); // "Search..." - item->SetLabelPreformated(true); - item->SetSpecialSort(SortSpecialOnTop); - items.Add(item); + { + CGUIDialogOK::ShowAndGetInput(194, 284); + m_bSearchConfirmed = false; + } } } @@ -223,7 +202,7 @@ return true; case ACTION_RECORD: - ActionToggleTimer(pItem.get()); + ActionRecord(pItem.get()); return true; } } @@ -264,28 +243,15 @@ return bReturn; } -bool CGUIWindowPVRSearch::OnContextButtonPlay(CFileItem *item, CONTEXT_BUTTON button) -{ - bool bReturn = false; - - if (button == CONTEXT_BUTTON_PLAY_ITEM) - { - ActionPlayEpg(item, true /* play recording, not channel */); - bReturn = true; - } - - return bReturn; -} - bool CGUIWindowPVRSearch::OnContextButtonStartRecord(CFileItem *item, CONTEXT_BUTTON button) { bool bReturn = false; - if ((button == CONTEXT_BUTTON_START_RECORD) || - (button == CONTEXT_BUTTON_ADD_TIMER)) + if (button == CONTEXT_BUTTON_START_RECORD) { - AddTimer(item, button == CONTEXT_BUTTON_ADD_TIMER); bReturn = true; + + StartRecordFile(*item); } return bReturn; @@ -297,21 +263,9 @@ if (button == CONTEXT_BUTTON_STOP_RECORD) { - StopRecordFile(item); bReturn = true; - } - - return bReturn; -} -bool CGUIWindowPVRSearch::OnContextButtonDeleteTimer(CFileItem *item, CONTEXT_BUTTON button) -{ - bool bReturn = false; - - if (button == CONTEXT_BUTTON_DELETE_TIMER) - { - DeleteTimer(item); - bReturn = true; + StopRecordFile(*item); } return bReturn; @@ -330,7 +284,7 @@ m_searchfilter.m_bIsRadio = m_bRadio; /* Open dialog window */ - dlgSearch->Open(); + dlgSearch->DoModal(); if (dlgSearch->IsConfirmed()) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRSearch.h kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRSearch.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRSearch.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRSearch.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -19,8 +20,8 @@ * */ -#include "epg/EpgSearchFilter.h" #include "GUIWindowPVRBase.h" +#include "epg/EpgSearchFilter.h" namespace PVR { @@ -42,10 +43,8 @@ private: bool OnContextButtonClear(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonInfo(CFileItem *item, CONTEXT_BUTTON button); - bool OnContextButtonPlay(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonStartRecord(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button); - bool OnContextButtonDeleteTimer(CFileItem *item, CONTEXT_BUTTON button); void OpenDialogSearch(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRTimers.cpp kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRTimers.cpp --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRTimers.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRTimers.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,24 +18,20 @@ * */ +#include "GUIWindowPVRTimers.h" + #include "ContextMenuManager.h" -#include "GUIInfoManager.h" +#include "guilib/GUIKeyboardFactory.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogYesNo.h" -#include "guilib/GUIKeyboardFactory.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" -#include "settings/Settings.h" -#include "threads/SingleLock.h" -#include "utils/StringUtils.h" -#include "utils/Variant.h" - #include "pvr/PVRManager.h" #include "pvr/dialogs/GUIDialogPVRTimerSettings.h" #include "pvr/timers/PVRTimers.h" #include "pvr/addons/PVRClients.h" - -#include "GUIWindowPVRTimers.h" +#include "threads/SingleLock.h" +#include "utils/StringUtils.h" using namespace PVR; @@ -49,7 +45,6 @@ CSingleLock lock(m_critSection); if (g_PVRTimers) g_PVRTimers->UnregisterObserver(this); - g_infoManager.UnregisterObserver(this); } void CGUIWindowPVRTimers::ResetObservers(void) @@ -57,14 +52,11 @@ CSingleLock lock(m_critSection); UnregisterObservers(); g_PVRTimers->RegisterObserver(this); - g_infoManager.RegisterObserver(this); } std::string CGUIWindowPVRTimers::GetDirectoryPath(void) { - const std::string basePath( - CPVRTimersPath(m_bRadio, CSettings::GetInstance().GetBool(CSettings::SETTING_PVRTIMERS_TIMERTYPEFILTER)).GetPath()); - return StringUtils::StartsWith(m_vecItems->GetPath(), basePath) ? m_vecItems->GetPath() : basePath; + return StringUtils::Format("pvr://timers/%s/", m_bRadio ? "radio" : "tv"); } void CGUIWindowPVRTimers::GetContextButtons(int itemNumber, CContextButtons &buttons) @@ -73,63 +65,26 @@ return; CFileItemPtr pItem = m_vecItems->Get(itemNumber); - if (!URIUtils::PathEquals(pItem->GetPath(), CPVRTimersPath::PATH_ADDTIMER)) + /* Check for a empty file item list, means only a + file item with the name "Add timer..." is present */ + if (URIUtils::PathEquals(pItem->GetPath(), "pvr://timers/addtimer/")) { - CPVRTimerInfoTagPtr timer(pItem->GetPVRTimerInfoTag()); - if (timer) - { - if (timer->HasEpgInfoTag()) - buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */ - - CPVRTimerTypePtr timerType(timer->GetTimerType()); - if (timerType) - { - if (timerType->SupportsEnableDisable()) - { - if (timer->m_state == PVR_TIMER_STATE_DISABLED) - buttons.Add(CONTEXT_BUTTON_ACTIVATE, 843); /* Activate */ - else - buttons.Add(CONTEXT_BUTTON_ACTIVATE, 844); /* Deactivate */ - } - - if (!timerType->IsReadOnly()) - { - buttons.Add(CONTEXT_BUTTON_EDIT, 21450); /* Edit */ - - // As epg-based timers will get it's title from the epg tag, they should not be renamable. - if (timer->IsManual()) - buttons.Add(CONTEXT_BUTTON_RENAME, 118); /* Rename */ - - if (timer->IsRecording()) - buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */ - else - buttons.Add(CONTEXT_BUTTON_DELETE, 117); /* Delete */ - } - } - - if (g_PVRClients->HasMenuHooks(timer->m_iClientId, PVR_MENUHOOK_TIMER)) - buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ - } + buttons.Add(CONTEXT_BUTTON_ADD, 19056); /* new timer */ } - - CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons); - CContextMenuManager::GetInstance().AddVisibleItems(pItem, buttons); -} - -bool CGUIWindowPVRTimers::OnAction(const CAction &action) -{ - if (action.GetID() == ACTION_PARENT_DIR || - action.GetID() == ACTION_NAV_BACK) + else { - CPVRTimersPath path(m_vecItems->GetPath()); - if (path.IsValid() && path.IsTimerSchedule()) - { - m_currentFileItem.reset(); - GoParentFolder(); - return true; - } + buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar program */ + buttons.Add(CONTEXT_BUTTON_ACTIVATE, 19058); /* activate/deactivate */ + buttons.Add(CONTEXT_BUTTON_DELETE, 117); /* delete timer */ + buttons.Add(CONTEXT_BUTTON_EDIT, 19057); /* edit timer */ + buttons.Add(CONTEXT_BUTTON_RENAME, 118); /* rename timer */ + buttons.Add(CONTEXT_BUTTON_ADD, 19056); /* new timer */ + if (g_PVRClients->HasMenuHooks(pItem->GetPVRTimerInfoTag()->m_iClientId, PVR_MENUHOOK_TIMER)) + buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ } - return CGUIWindowPVRBase::OnAction(action); + + CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons); + CContextMenuManager::Get().AddVisibleItems(pItem, buttons); } bool CGUIWindowPVRTimers::OnContextButton(int itemNumber, CONTEXT_BUTTON button) @@ -141,10 +96,8 @@ return OnContextButtonActivate(pItem.get(), button) || OnContextButtonAdd(pItem.get(), button) || OnContextButtonDelete(pItem.get(), button) || - OnContextButtonStopRecord(pItem.get(), button) || OnContextButtonEdit(pItem.get(), button) || OnContextButtonRename(pItem.get(), button) || - OnContextButtonInfo(pItem.get(), button) || CGUIWindowPVRBase::OnContextButton(itemNumber, button); } @@ -153,22 +106,6 @@ return CGUIWindowPVRBase::Update(strDirectory); } -void CGUIWindowPVRTimers::UpdateButtons(void) -{ - SET_CONTROL_SELECTED(GetID(), CONTROL_BTNTIMERTYPEFILTER, CSettings::GetInstance().GetBool(CSettings::SETTING_PVRTIMERS_TIMERTYPEFILTER)); - - CGUIWindowPVRBase::UpdateButtons(); - - std::string strHeaderTitle; - if (m_currentFileItem && m_currentFileItem->HasPVRTimerInfoTag()) - { - CPVRTimerInfoTagPtr timer = m_currentFileItem->GetPVRTimerInfoTag(); - strHeaderTitle = timer->Title(); - } - - SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, strHeaderTitle); -} - bool CGUIWindowPVRTimers::OnMessage(CGUIMessage &message) { if (!IsValidMessage(message)) @@ -189,20 +126,8 @@ case ACTION_SHOW_INFO: case ACTION_SELECT_ITEM: case ACTION_MOUSE_LEFT_CLICK: - { - CFileItemPtr item(m_vecItems->Get(iItem)); - if (item->m_bIsFolder && (message.GetParam1() != ACTION_SHOW_INFO)) - { - m_currentFileItem = item; - bReturn = false; // folders are handled by base class - } - else - { - m_currentFileItem.reset(); - ActionShowTimer(item.get()); - } + ActionShowTimer(m_vecItems->Get(iItem).get()); break; - } case ACTION_CONTEXT_MENU: case ACTION_MOUSE_RIGHT_CLICK: OnPopupMenu(iItem); @@ -216,13 +141,6 @@ } } } - else if (message.GetSenderId() == CONTROL_BTNTIMERTYPEFILTER) - { - CSettings::GetInstance().ToggleBool(CSettings::SETTING_PVRTIMERS_TIMERTYPEFILTER); - CSettings::GetInstance().Save(); - Update(GetDirectoryPath()); - bReturn = true; - } break; case GUI_MSG_REFRESH_LIST: switch(message.GetParam1()) @@ -262,11 +180,19 @@ return bReturn; CPVRTimerInfoTagPtr timer = item->GetPVRTimerInfoTag(); - if (timer->m_state == PVR_TIMER_STATE_DISABLED) - timer->m_state = PVR_TIMER_STATE_SCHEDULED; + int iLabelId; + if (timer->IsActive()) + { + timer->m_state = PVR_TIMER_STATE_CANCELLED; + iLabelId = 13106; + } else - timer->m_state = PVR_TIMER_STATE_DISABLED; + { + timer->m_state = PVR_TIMER_STATE_SCHEDULED; + iLabelId = 305; + } + CGUIDialogOK::ShowAndGetInput(19033, 19040, 0, iLabelId); g_PVRTimers->UpdateTimer(*item); } @@ -289,21 +215,23 @@ if (button == CONTEXT_BUTTON_DELETE) { - DeleteTimer(item); bReturn = true; - } + if (!item->HasPVRTimerInfoTag()) + return bReturn; - return bReturn; -} + CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); + if (!pDialog) + return bReturn; + pDialog->SetHeading(122); + pDialog->SetLine(0, 19040); + pDialog->SetLine(1, ""); + pDialog->SetLine(2, item->GetPVRTimerInfoTag()->m_strTitle); + pDialog->DoModal(); -bool CGUIWindowPVRTimers::OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button) -{ - bool bReturn = false; + if (!pDialog->IsConfirmed()) + return bReturn; - if (button == CONTEXT_BUTTON_STOP_RECORD) - { - StopRecordFile(item); - bReturn = true; + g_PVRTimers->DeleteTimer(*item); } return bReturn; @@ -319,7 +247,7 @@ if (!item->HasPVRTimerInfoTag()) return bReturn; - if (ShowTimerSettings(item) && !item->GetPVRTimerInfoTag()->GetTimerType()->IsReadOnly()) + if (ShowTimerSettings(item)) g_PVRTimers->UpdateTimer(*item); } @@ -338,63 +266,52 @@ CPVRTimerInfoTagPtr timer = item->GetPVRTimerInfoTag(); std::string strNewName(timer->m_strTitle); - if (CGUIKeyboardFactory::ShowAndGetInput(strNewName, CVariant{g_localizeStrings.Get(19042)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(strNewName, g_localizeStrings.Get(19042), false)) g_PVRTimers->RenameTimer(*item, strNewName); } return bReturn; } -bool CGUIWindowPVRTimers::OnContextButtonInfo(CFileItem *item, CONTEXT_BUTTON button) +bool CGUIWindowPVRTimers::ActionDeleteTimer(CFileItem *item) { - bool bReturn = false; - - if (button == CONTEXT_BUTTON_INFO) - { - ShowEPGInfo(item); - bReturn = true; - } + /* check if the timer tag is valid */ + CPVRTimerInfoTagPtr timerTag = item->GetPVRTimerInfoTag(); + if (!timerTag || timerTag->m_state == PVR_TIMER_STATE_NEW) + return false; - return bReturn; -} + /* show a confirmation dialog */ + CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); + if (!pDialog) + return false; + pDialog->SetHeading(122); + pDialog->SetLine(0, 19040); + pDialog->SetLine(1, ""); + pDialog->SetLine(2, timerTag->m_strTitle); + pDialog->DoModal(); -bool CGUIWindowPVRTimers::ActionDeleteTimer(CFileItem *item) -{ - bool bReturn = DeleteTimer(item); + /* prompt for the user's confirmation */ + if (!pDialog->IsConfirmed()) + return false; - if (bReturn && (m_vecItems->GetObjectCount() == 0)) - { - /* go to the parent folder if we're in a subdirectory and just deleted the last item */ - CPVRTimersPath path(m_vecItems->GetPath()); - if (path.IsValid() && path.IsTimerSchedule()) - { - m_currentFileItem.reset(); - GoParentFolder(); - } - } - return bReturn; + /* delete the timer */ + return g_PVRTimers->DeleteTimer(*item); } bool CGUIWindowPVRTimers::ActionShowTimer(CFileItem *item) { - if (!g_PVRClients->SupportsTimers()) - { - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19215}); // "Information", "The PVR backend does not support timers." - return false; - } - bool bReturn = false; /* Check if "Add timer..." entry is pressed by OK, if yes create a new timer and open settings dialog, otherwise open settings for selected timer entry */ - if (URIUtils::PathEquals(item->GetPath(), CPVRTimersPath::PATH_ADDTIMER)) + if (URIUtils::PathEquals(item->GetPath(), "pvr://timers/addtimer/")) { bReturn = ShowNewTimerDialog(); } else { - if (ShowTimerSettings(item) && !item->GetPVRTimerInfoTag()->GetTimerType()->IsReadOnly()) + if (ShowTimerSettings(item)) { /* Update timer on pvr backend */ bReturn = g_PVRTimers->UpdateTimer(*item); @@ -404,6 +321,7 @@ return bReturn; } + bool CGUIWindowPVRTimers::ShowNewTimerDialog(void) { bool bReturn(false); @@ -421,3 +339,28 @@ return bReturn; } + +bool CGUIWindowPVRTimers::ShowTimerSettings(CFileItem *item) +{ + /* Check item is TV timer information tag */ + if (!item->IsPVRTimer()) + { + CLog::Log(LOGERROR, "CGUIWindowPVRTimers: Can't open timer settings dialog, no timer info tag!"); + return false; + } + + /* Load timer settings dialog */ + CGUIDialogPVRTimerSettings* pDlgInfo = (CGUIDialogPVRTimerSettings*)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_TIMER_SETTING); + + if (!pDlgInfo) + return false; + + /* inform dialog about the file item */ + pDlgInfo->SetTimer(item); + + /* Open dialog window */ + pDlgInfo->DoModal(); + + /* Get modify flag from window and return it to caller */ + return pDlgInfo->IsConfirmed(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRTimers.h kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRTimers.h --- kodi-16.1~git20160425.1001-final/xbmc/pvr/windows/GUIWindowPVRTimers.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/pvr/windows/GUIWindowPVRTimers.h 2015-10-19 08:39:16.000000000 +0000 @@ -1,4 +1,5 @@ #pragma once + /* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org @@ -21,11 +22,6 @@ #include "GUIWindowPVRBase.h" -#include - -class CFileItem; -typedef std::shared_ptr CFileItemPtr; - namespace PVR { class CGUIWindowPVRTimers : public CGUIWindowPVRBase @@ -35,11 +31,9 @@ virtual ~CGUIWindowPVRTimers(void) {}; bool OnMessage(CGUIMessage& message); - bool OnAction(const CAction &action); void GetContextButtons(int itemNumber, CContextButtons &buttons); bool OnContextButton(int itemNumber, CONTEXT_BUTTON button); bool Update(const std::string &strDirectory, bool updateFilterPath = true); - void UpdateButtons(void); void UnregisterObservers(void); void ResetObservers(void); @@ -49,16 +43,13 @@ private: bool ActionDeleteTimer(CFileItem *item); bool ActionShowTimer(CFileItem *item); + bool ShowTimerSettings(CFileItem *item); bool ShowNewTimerDialog(void); bool OnContextButtonActivate(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonAdd(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonDelete(CFileItem *item, CONTEXT_BUTTON button); - bool OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonEdit(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonRename(CFileItem *item, CONTEXT_BUTTON button); - bool OnContextButtonInfo(CFileItem *item, CONTEXT_BUTTON button); - - CFileItemPtr m_currentFileItem; }; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/rendering/dx/GUIWindowTestPatternDX.cpp kodi-15.2~git20151019.1039-final/xbmc/rendering/dx/GUIWindowTestPatternDX.cpp --- kodi-16.1~git20160425.1001-final/xbmc/rendering/dx/GUIWindowTestPatternDX.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/rendering/dx/GUIWindowTestPatternDX.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,76 +26,62 @@ #define M_PI 3.14159265358979323846 #endif +#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) + CGUIWindowTestPatternDX::CGUIWindowTestPatternDX(void) : CGUIWindowTestPattern() { - m_vb = NULL; - m_bufferWidth = 0; } CGUIWindowTestPatternDX::~CGUIWindowTestPatternDX(void) { - SAFE_RELEASE(m_vb); - m_bufferWidth = 0; } void CGUIWindowTestPatternDX::DrawVerticalLines(int top, int left, int bottom, int right) { - Vertex* vert = new Vertex[2 + (right - left)]; + CUSTOMVERTEX* vert = new CUSTOMVERTEX[2+(right-left)]; int p = 0; for (int i = left; i <= right; i += 2) { - vert[p].pos.x = (float)i; - vert[p].pos.y = (float)top; - vert[p].pos.z = 0.5f; - vert[p].color = XMFLOAT4(m_white, m_white, m_white, 1.0f); + vert[p].x = (float)i; + vert[p].y = (float)top; + vert[p].z = 0.5f; + vert[p].rhw = 1.0f; + vert[p].color = D3DCOLOR_COLORVALUE(m_white, m_white, m_white, 1.0f); ++p; - vert[p].pos.x = (float)i; - vert[p].pos.y = (float)bottom; - vert[p].pos.z = 0.5f; - vert[p].color = XMFLOAT4(m_white, m_white, m_white, 1.0f); + vert[p].x = (float)i; + vert[p].y = (float)bottom; + vert[p].z = 0.5f; + vert[p].rhw = 1.0f; + vert[p].color = D3DCOLOR_COLORVALUE(m_white, m_white, m_white, 1.0f); ++p; } - UpdateVertexBuffer(vert, p); - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - - pGUIShader->Begin(SHADER_METHOD_RENDER_DEFAULT); - unsigned stride = sizeof(Vertex), offset = 0; - pContext->IASetVertexBuffers(0, 1, &m_vb, &stride, &offset); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST); - pGUIShader->Draw(p, 0); + g_Windowing.Get3DDevice()->SetFVF(D3DFVF_CUSTOMVERTEX); + g_Windowing.Get3DDevice()->DrawPrimitiveUP(D3DPT_LINELIST, p/2, vert, sizeof(CUSTOMVERTEX)); delete [] vert; } void CGUIWindowTestPatternDX::DrawHorizontalLines(int top, int left, int bottom, int right) { - Vertex* vert = new Vertex[2 + (bottom - top)]; + CUSTOMVERTEX* vert = new CUSTOMVERTEX[2+(bottom-top)]; int p = 0; for (int i = top; i <= bottom; i += 2) { - vert[p].pos.x = (float)left; - vert[p].pos.y = (float)i; - vert[p].pos.z = 0.5f; - vert[p].color = XMFLOAT4(m_white, m_white, m_white, 1.0f); + vert[p].x = (float)left; + vert[p].y = (float)i; + vert[p].z = 0.5f; + vert[p].rhw = 1.0f; + vert[p].color = D3DCOLOR_COLORVALUE(m_white, m_white, m_white, 1.0f); ++p; - vert[p].pos.x = (float)right; - vert[p].pos.y = (float)i; - vert[p].pos.z = 0.5f; - vert[p].color = XMFLOAT4(m_white, m_white, m_white, 1.0f); + vert[p].x = (float)right; + vert[p].y = (float)i; + vert[p].z = 0.5f; + vert[p].rhw = 1.0f; + vert[p].color = D3DCOLOR_COLORVALUE(m_white, m_white, m_white, 1.0f); ++p; } - UpdateVertexBuffer(vert, p); - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - - pGUIShader->Begin(SHADER_METHOD_RENDER_DEFAULT); - unsigned stride = sizeof(Vertex), offset = 0; - pContext->IASetVertexBuffers(0, 1, &m_vb, &stride, &offset); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST); - pGUIShader->Draw(p, 0); + g_Windowing.Get3DDevice()->SetFVF(D3DFVF_CUSTOMVERTEX); + g_Windowing.Get3DDevice()->DrawPrimitiveUP(D3DPT_LINELIST, p/2, vert, sizeof(CUSTOMVERTEX)); delete [] vert; } @@ -105,7 +91,7 @@ int c = (bottom-top+1)*(1+(right-left)/2); if (c < 1) return; - Vertex* vert = new Vertex[c]; + CUSTOMVERTEX* vert = new CUSTOMVERTEX[c]; int i=0; for (int y = top; y <= bottom; y++) { @@ -113,31 +99,25 @@ { if (y % 2 == 0) { - vert[i].pos.x = (float)x; - vert[i].pos.y = (float)y; - vert[i].pos.z = 0.5f; - vert[i].color = XMFLOAT4(m_white, m_white, m_white, 1.0f); + vert[i].x = (float)x; + vert[i].y = (float)y; + vert[i].z = 0.5f; + vert[i].rhw = 1.0f; + vert[i].color = D3DCOLOR_COLORVALUE(m_white, m_white, m_white, 1.0f); } else { - vert[i].pos.x = (float)x+1.0f; - vert[i].pos.y = (float)y; - vert[i].pos.z = 0.5f; - vert[i].color = XMFLOAT4(m_white, m_white, m_white, 1.0f); + vert[i].x = (float)x+1.0f; + vert[i].y = (float)y; + vert[i].z = 0.5f; + vert[i].rhw = 1.0f; + vert[i].color = D3DCOLOR_COLORVALUE(m_white, m_white, m_white, 1.0f); } ++i; } } - UpdateVertexBuffer(vert, i); - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - - pGUIShader->Begin(SHADER_METHOD_RENDER_DEFAULT); - unsigned stride = sizeof(Vertex), offset = 0; - pContext->IASetVertexBuffers(0, 1, &m_vb, &stride, &offset); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST); - pGUIShader->Draw(i, 0); + g_Windowing.Get3DDevice()->SetFVF(D3DFVF_CUSTOMVERTEX); + g_Windowing.Get3DDevice()->DrawPrimitiveUP(D3DPT_POINTLIST, i, vert, sizeof(CUSTOMVERTEX)); delete [] vert; } @@ -186,41 +166,29 @@ DrawRectangle(x50p, (float)top, (float)right, y50p, color_white); DrawRectangle((float)left, (float)y50p, x50p, (float)bottom, color_white); - XMFLOAT4 xcolor_white, xcolor_black; - CD3DHelper::XMStoreColor(&xcolor_white, color_white); - CD3DHelper::XMStoreColor(&xcolor_black, color_black); - // draw border lines - Vertex vert[] = + CUSTOMVERTEX vert[] = { - { XMFLOAT3((float)left, y5p, 0.5f), xcolor_white, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x50p, y5p, 0.5f), xcolor_white, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x5p, (float)top, 0.5f), xcolor_white, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x5p, y50p, 0.5f), xcolor_white, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x50p, y95p, 0.5f), xcolor_white, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3((float)right, y95p, 0.5f), xcolor_white, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x95p, y50p, 0.5f), xcolor_white, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x95p, (float)bottom, 0.5f), xcolor_white, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - - { XMFLOAT3(x50p, y5p, 0.5f), xcolor_black, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3((float)right, y5p, 0.5f), xcolor_black, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x5p, y50p, 0.5f), xcolor_black, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x5p, (float)bottom, 0.5f), xcolor_black, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3((float)left, y95p, 0.5f), xcolor_black, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x50p, y95p, 0.5f), xcolor_black, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x95p, (float)top, 0.5f), xcolor_black, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x95p, y50p, 0.5f), xcolor_black, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, + {(float)left, y5p, 0.5f, 1.0f, color_white}, + {x50p, y5p, 0.5f, 1.0f, color_white}, + {x5p, (float)top, 0.5f, 1.0f, color_white}, + {x5p, y50p, 0.5f, 1.0f, color_white}, + {x50p, y95p, 0.5f, 1.0f, color_white}, + {(float)right, y95p, 0.5f, 1.0f, color_white}, + {x95p, y50p, 0.5f, 1.0f, color_white}, + {x95p, (float)bottom, 0.5f, 1.0f, color_white}, + + {x50p, y5p, 0.5f, 1.0f, color_black}, + {(float)right, y5p, 0.5f, 1.0f, color_black}, + {x5p, y50p, 0.5f, 1.0f, color_black}, + {x5p, (float)bottom, 0.5f, 1.0f, color_black}, + {(float)left, y95p, 0.5f, 1.0f, color_black}, + {x50p, y95p, 0.5f, 1.0f, color_black}, + {x95p, (float)top, 0.5f, 1.0f, color_black}, + {x95p, y50p, 0.5f, 1.0f, color_black} }; - UpdateVertexBuffer(vert, ARRAYSIZE(vert)); - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - - pGUIShader->Begin(SHADER_METHOD_RENDER_DEFAULT); - unsigned stride = sizeof(Vertex), offset = 0; - pContext->IASetVertexBuffers(0, 1, &m_vb, &stride, &offset); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST); - pGUIShader->Draw(ARRAYSIZE(vert), 0); + g_Windowing.Get3DDevice()->SetFVF(D3DFVF_CUSTOMVERTEX); + g_Windowing.Get3DDevice()->DrawPrimitiveUP(D3DPT_LINELIST, 8, vert, sizeof(CUSTOMVERTEX)); // draw inner rectangles DrawRectangle(x12p, y12p, x37p, y37p, color_white); @@ -257,7 +225,7 @@ float vectorY; float vectorY1 = originY; float vectorX1 = originX; - Vertex vert[1084]; // 361*3 + 1 + CUSTOMVERTEX vert[1083]; // 361*3 int p = 0; for (int i = 0; i <= 360; i++) @@ -265,107 +233,50 @@ angle = (float)(((double)i)/57.29577957795135); vectorX = originX + (radius*(float)sin((double)angle)); vectorY = originY + (radius*(float)cos((double)angle)); - vert[p].pos.x = originX; - vert[p].pos.y = originY; - vert[p].pos.z = 0.5f; - CD3DHelper::XMStoreColor(&vert[p].color, color); + vert[p].x = originX; + vert[p].y = originY; + vert[p].z = 0.5f; + vert[p].rhw = 1.0f; + vert[p].color = color; ++p; - vert[p].pos.x = vectorX1; - vert[p].pos.y = vectorY1; - vert[p].pos.z = 0.5f; - CD3DHelper::XMStoreColor(&vert[p].color, color); + vert[p].x = vectorX1; + vert[p].y = vectorY1; + vert[p].z = 0.5f; + vert[p].rhw = 1.0f; + vert[p].color = color; ++p; - vert[p].pos.x = vectorX; - vert[p].pos.y = vectorY; - vert[p].pos.z = 0.5f; - CD3DHelper::XMStoreColor(&vert[p].color, color); + vert[p].x = vectorX; + vert[p].y = vectorY; + vert[p].z = 0.5f; + vert[p].rhw = 1.0f; + vert[p].color = color; ++p; vectorY1 = vectorY; vectorX1 = vectorX; } - vert[1083] = vert[0]; - - UpdateVertexBuffer(vert, ARRAYSIZE(vert)); - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - - pGUIShader->Begin(SHADER_METHOD_RENDER_DEFAULT); - unsigned stride = sizeof(Vertex), offset = 0; - pContext->IASetVertexBuffers(0, 1, &m_vb, &stride, &offset); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - pGUIShader->Draw(ARRAYSIZE(vert), 0); + g_Windowing.Get3DDevice()->SetFVF(D3DFVF_CUSTOMVERTEX); + g_Windowing.Get3DDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 361, vert, sizeof(CUSTOMVERTEX)); } void CGUIWindowTestPatternDX::BeginRender() { - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - ID3D11RenderTargetView* renderTarget; - - pContext->OMGetRenderTargets(1, &renderTarget, NULL); - float color[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - pContext->ClearRenderTargetView(renderTarget, color); - renderTarget->Release(); + g_Windowing.Get3DDevice()->Clear(0, NULL, D3DCLEAR_TARGET, 0, 0, 0); } void CGUIWindowTestPatternDX::EndRender() { - g_Windowing.GetGUIShader()->RestoreBuffers(); } void CGUIWindowTestPatternDX::DrawRectangle(float x, float y, float x2, float y2, DWORD color) { - XMFLOAT4 float4; - CD3DHelper::XMStoreColor(&float4, color); - - Vertex vert[] = + CUSTOMVERTEX vert[] = { - { XMFLOAT3( x, y, 0.5f), float4, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x2, y, 0.5f), float4, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x2, y2, 0.5f), float4, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x2, y2, 0.5f), float4, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3(x, y2, 0.5f), float4, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, - { XMFLOAT3( x, y, 0.5f), float4, XMFLOAT2(0.0f, 0.0f), XMFLOAT2(0.0f, 0.0f) }, + {x, y, 0.5f, 1.0f, color}, + {x2, y, 0.5f, 1.0f, color}, + {x2, y2, 0.5f, 1.0f, color}, + {x, y2, 0.5f, 1.0f, color}, + {x, y, 0.5f, 1.0f, color}, }; - - UpdateVertexBuffer(vert, ARRAYSIZE(vert)); - - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader(); - - pGUIShader->Begin(SHADER_METHOD_RENDER_DEFAULT); - unsigned stride = sizeof(Vertex), offset = 0; - pContext->IASetVertexBuffers(0, 1, &m_vb, &stride, &offset); - pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - pGUIShader->Draw(ARRAYSIZE(vert), 0); -} - -void CGUIWindowTestPatternDX::UpdateVertexBuffer(Vertex *vertecies, unsigned count) -{ - unsigned width = sizeof(Vertex) * count; - - if (!m_vb || width > m_bufferWidth) // create new - { - SAFE_RELEASE(m_vb); - - CD3D11_BUFFER_DESC desc(width, D3D11_BIND_VERTEX_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); - D3D11_SUBRESOURCE_DATA initData = {}; - initData.pSysMem = vertecies; - initData.SysMemPitch = width; - if (SUCCEEDED(g_Windowing.Get3D11Device()->CreateBuffer(&desc, &initData, &m_vb))) - { - m_bufferWidth = width; - } - return; - } - else // update - { - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - D3D11_MAPPED_SUBRESOURCE res; - if (SUCCEEDED(pContext->Map(m_vb, 0, D3D11_MAP_WRITE_DISCARD, 0, &res))) - { - memcpy(res.pData, vertecies, sizeof(Vertex) * count); - pContext->Unmap(m_vb, 0); - } - } + g_Windowing.Get3DDevice()->SetFVF(D3DFVF_CUSTOMVERTEX); + g_Windowing.Get3DDevice()->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 3, vert, sizeof(CUSTOMVERTEX)); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/rendering/dx/GUIWindowTestPatternDX.h kodi-15.2~git20151019.1039-final/xbmc/rendering/dx/GUIWindowTestPatternDX.h --- kodi-16.1~git20160425.1001-final/xbmc/rendering/dx/GUIWindowTestPatternDX.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/rendering/dx/GUIWindowTestPatternDX.h 2015-10-19 08:39:16.000000000 +0000 @@ -23,7 +23,6 @@ */ #include "settings/windows/GUIWindowTestPattern.h" -#include "guilib/GUIShaderDX.h" class CGUIWindowTestPatternDX : public CGUIWindowTestPattern { @@ -40,12 +39,14 @@ virtual void DrawCircle(int originX, int originY, int radius); virtual void BeginRender(); virtual void EndRender(); - virtual void UpdateVertexBuffer(Vertex *vertecies, unsigned count); + + struct CUSTOMVERTEX + { + FLOAT x, y, z, rhw; // The transformed position for the vertex + DWORD color; // The vertex color + }; void DrawRectangle(float x, float y, float x2, float y2, DWORD color); void DrawCircleEx(float originX, float originY, float radius, DWORD color); - - ID3D11Buffer* m_vb; - unsigned m_bufferWidth; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/rendering/dx/RenderSystemDX.cpp kodi-15.2~git20151019.1039-final/xbmc/rendering/dx/RenderSystemDX.cpp --- kodi-16.1~git20160425.1001-final/xbmc/rendering/dx/RenderSystemDX.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/rendering/dx/RenderSystemDX.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,78 +21,72 @@ #ifdef HAS_DX -#include -#include "Application.h" +#include "threads/SystemClock.h" #include "RenderSystemDX.h" -#include "cores/VideoRenderers/RenderManager.h" -#include "guilib/D3DResource.h" -#include "guilib/GUIShaderDX.h" -#include "guilib/GUITextureD3D.h" +#include "utils/log.h" +#include "utils/TimeUtils.h" +#include "utils/MathUtils.h" #include "guilib/GUIWindowManager.h" -#include "settings/AdvancedSettings.h" #include "threads/SingleLock.h" -#include "utils/MathUtils.h" -#include "utils/TimeUtils.h" -#include "utils/log.h" -#include "win32/WIN32Util.h" -#include "win32/dxerr.h" +#include "guilib/D3DResource.h" +#include "settings/AdvancedSettings.h" +#include "Application.h" +#include "video/VideoReferenceClock.h" +#include "cores/VideoRenderers/RenderManager.h" +#if (D3DX_SDK_VERSION >= 42) //aug 2009 sdk and up use dxerr + #include +#else + #include + #define DXGetErrorString(hr) DXGetErrorString9(hr) + #define DXGetErrorDescription(hr) DXGetErrorDescription9(hr) +#endif -#pragma comment(lib, "d3d11.lib") -#pragma comment(lib, "dxgi.lib") -#pragma comment(lib, "dxguid.lib") +using namespace std; -#define RATIONAL_TO_FLOAT(rational) ((rational.Denominator != 0) ? (float)rational.Numerator / (float)rational.Denominator : 0.0) +// Dynamic loading of Direct3DCreate9Ex to keep compatibility with 2000/XP. +typedef HRESULT (WINAPI *LPDIRECT3DCREATE9EX)( UINT SDKVersion, IDirect3D9Ex **ppD3D); +static LPDIRECT3DCREATE9EX g_Direct3DCreate9Ex; +static HMODULE g_D3D9ExHandle; -using namespace DirectX::PackedVector; +static bool LoadD3D9Ex() +{ + HMODULE hD3d9Dll = GetModuleHandle("d3d9.dll"); + if (!hD3d9Dll) + return false; + g_Direct3DCreate9Ex = (LPDIRECT3DCREATE9EX)GetProcAddress(hD3d9Dll, "Direct3DCreate9Ex" ); + if(g_Direct3DCreate9Ex == NULL) + return false; + return true; +} CRenderSystemDX::CRenderSystemDX() : CRenderSystemBase() { m_enumRenderingSystem = RENDERING_SYSTEM_DIRECTX; - m_hFocusWnd = nullptr; - m_hDeviceWnd = nullptr; + m_pD3D = NULL; + m_pD3DDevice = NULL; + m_devType = D3DDEVTYPE_HAL; +#if defined(DEBUG_PS) || defined (DEBUG_VS) + m_devType = D3DDEVTYPE_REF +#endif + m_hFocusWnd = NULL; + m_hDeviceWnd = NULL; m_nBackBufferWidth = 0; m_nBackBufferHeight = 0; m_bFullScreenDevice = false; - m_bVSync = true; - m_nDeviceStatus = S_OK; - m_inScene = false; - m_needNewDevice = false; - m_resizeInProgress = false; - m_screenHeight = 0; - m_systemFreq = CurrentHostFrequency(); - m_defaultD3DUsage = D3D11_USAGE_DEFAULT; - m_featureLevel = D3D_FEATURE_LEVEL_11_1; - m_driverType = D3D_DRIVER_TYPE_HARDWARE; - m_adapter = nullptr; - m_pOutput = nullptr; - m_dxgiFactory = nullptr; - m_pD3DDev = nullptr; - m_pImdContext = nullptr; - m_pContext = nullptr; - - m_pSwapChain = nullptr; - m_pSwapChain1 = nullptr; - m_pRenderTargetView = nullptr; - m_depthStencilState = nullptr; - m_depthStencilView = nullptr; - m_BlendEnableState = nullptr; - m_BlendDisableState = nullptr; - m_BlendEnabled = false; - m_RSScissorDisable = nullptr; - m_RSScissorEnable = nullptr; - m_ScissorsEnabled = false; - - m_pTextureRight = nullptr; - m_pRenderTargetViewRight = nullptr; - m_pShaderResourceViewRight = nullptr; - m_pGUIShader = nullptr; - m_bResizeRequred = false; - m_bHWStereoEnabled = false; - ZeroMemory(&m_cachedMode, sizeof(m_cachedMode)); - ZeroMemory(&m_viewPort, sizeof(m_viewPort)); - ZeroMemory(&m_scissor, sizeof(CRect)); - ZeroMemory(&m_adapterDesc, sizeof(DXGI_ADAPTER_DESC)); + m_bVSync = true; + m_nDeviceStatus = S_OK; + m_stateBlock = NULL; + m_inScene = false; + m_needNewDevice = false; + m_adapter = D3DADAPTER_DEFAULT; + m_screenHeight = 0; + m_systemFreq = CurrentHostFrequency(); + m_useD3D9Ex = false; + m_defaultD3DUsage = 0; + m_defaultD3DPool = D3DPOOL_MANAGED; + + ZeroMemory(&m_D3DPP, sizeof(D3DPRESENT_PARAMETERS)); } CRenderSystemDX::~CRenderSystemDX() @@ -102,18 +96,50 @@ bool CRenderSystemDX::InitRenderSystem() { m_bVSync = true; - - CLog::Log(LOGDEBUG, __FUNCTION__" - Initializing D3D11 Factory..."); - HRESULT hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), reinterpret_cast(&m_dxgiFactory)); - if (FAILED(hr)) + m_useD3D9Ex = (g_advancedSettings.m_AllowD3D9Ex && LoadD3D9Ex()); + m_pD3D = NULL; + + if (m_useD3D9Ex) { - CLog::Log(LOGERROR, __FUNCTION__" - D3D11 initialization failed."); - return false; + CLog::Log(LOGDEBUG, __FUNCTION__" - trying D3D9Ex..."); + if (FAILED(g_Direct3DCreate9Ex(D3D_SDK_VERSION, (IDirect3D9Ex**) &m_pD3D))) + { + CLog::Log(LOGDEBUG, __FUNCTION__" - D3D9Ex creation failure, falling back to D3D9"); + m_useD3D9Ex = false; + } + else + { + D3DCAPS9 caps; + memset(&caps, 0, sizeof(caps)); + m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, m_devType, &caps); + // Evaluate if the driver is WDDM - this detection method is not guaranteed 100% + if (!g_advancedSettings.m_ForceD3D9Ex && (!(caps.Caps2 & D3DCAPS2_CANSHARERESOURCE) || !(caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES))) + { + CLog::Log(LOGDEBUG, __FUNCTION__" - driver looks like XPDM or earlier, falling back to D3D9"); + m_useD3D9Ex = false; + m_pD3D->Release(); + } + else + { + CLog::Log(LOGDEBUG, __FUNCTION__" - using D3D9Ex"); + } + } + } + + if (!m_useD3D9Ex) + { + m_pD3D = Direct3DCreate9(D3D_SDK_VERSION); + if(m_pD3D == NULL) + return false; } - + UpdateMonitor(); - return CreateDevice(); + + if(CreateDevice()==false) + return false; + + return true; } void CRenderSystemDX::SetRenderParams(unsigned int width, unsigned int height, bool fullScreen, float refreshRate) @@ -126,59 +152,28 @@ void CRenderSystemDX::SetMonitor(HMONITOR monitor) { - if (!m_dxgiFactory) - return; - - DXGI_OUTPUT_DESC outputDesc; - if (m_pOutput && SUCCEEDED(m_pOutput->GetDesc(&outputDesc)) && outputDesc.Monitor == monitor) + if (!m_pD3D) return; // find the appropriate screen - IDXGIAdapter1* pAdapter; - for (unsigned i = 0; m_dxgiFactory->EnumAdapters1(i, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++i) + for (unsigned int adapter = 0; adapter < m_pD3D->GetAdapterCount(); adapter++) { - DXGI_ADAPTER_DESC1 adaperDesc; - pAdapter->GetDesc1(&adaperDesc); - - IDXGIOutput* pOutput; - for (unsigned j = 0; pAdapter->EnumOutputs(j, &pOutput) != DXGI_ERROR_NOT_FOUND; ++j) + HMONITOR hMonitor = m_pD3D->GetAdapterMonitor(adapter); + if (hMonitor == monitor && adapter != m_adapter) { - pOutput->GetDesc(&outputDesc); - if (outputDesc.Monitor == monitor) - { - CLog::Log(LOGDEBUG, __FUNCTION__" - Selected %S output. ", outputDesc.DeviceName); - - // update monitor info - SAFE_RELEASE(m_pOutput); - m_pOutput = pOutput; - - // check if adapter is changed - if ( m_adapterDesc.AdapterLuid.HighPart != adaperDesc.AdapterLuid.HighPart - || m_adapterDesc.AdapterLuid.LowPart != adaperDesc.AdapterLuid.LowPart) - { - CLog::Log(LOGDEBUG, __FUNCTION__" - Selected %S adapter. ", m_adapterDesc.Description); - - pAdapter->GetDesc(&m_adapterDesc); - SAFE_RELEASE(m_adapter); - m_adapter = pAdapter; - m_needNewDevice = true; - return; - } - - return; - } - pOutput->Release(); + m_adapter = adapter; + m_needNewDevice = true; + break; } - pAdapter->Release(); } } bool CRenderSystemDX::ResetRenderSystem(int width, int height, bool fullScreen, float refreshRate) { - if (!m_pD3DDev) + if (!m_pD3DDevice) return false; - if (m_hDeviceWnd != nullptr) + if (m_hDeviceWnd != NULL) { HMONITOR hMonitor = MonitorFromWindow(m_hDeviceWnd, MONITOR_DEFAULTTONULL); if (hMonitor) @@ -187,15 +182,15 @@ SetRenderParams(width, height, fullScreen, refreshRate); - CRect rc(0, 0, float(width), float(height)); + CRect rc; + rc.SetRect(0, 0, (float)width, (float)height); SetViewPort(rc); - if (!m_needNewDevice) - { - SetFullScreenInternal(); - CreateWindowSizeDependentResources(); - } - else + BuildPresentParameters(); + + if (m_useD3D9Ex && !m_needNewDevice) + m_nDeviceStatus = ((IDirect3DDevice9Ex*)m_pD3DDevice)->ResetEx(&m_D3DPP, m_D3DPP.Windowed ? NULL : &m_D3DDMEX); + else { OnDeviceLost(); OnDeviceReset(); @@ -209,215 +204,120 @@ if (!m_bRenderCreated) return; - DXGI_OUTPUT_DESC outputDesc; - m_pOutput->GetDesc(&outputDesc); + HMONITOR currentMonitor = m_pD3D->GetAdapterMonitor(m_adapter); HMONITOR newMonitor = MonitorFromWindow(m_hDeviceWnd, MONITOR_DEFAULTTONULL); - - if (newMonitor != NULL && outputDesc.Monitor != newMonitor) - { - SetMonitor(newMonitor); - if (m_needNewDevice) - { - CLog::Log(LOGDEBUG, "%s - Adapter changed, reseting render system.", __FUNCTION__); - ResetRenderSystem(m_nBackBufferWidth, m_nBackBufferHeight, m_bFullScreenDevice, m_refreshRate); - } - } + if (newMonitor != NULL && currentMonitor != newMonitor) + ResetRenderSystem(m_nBackBufferWidth, m_nBackBufferHeight, m_bFullScreenDevice, m_refreshRate); } -void CRenderSystemDX::OnResize(unsigned int width, unsigned int height) + +bool CRenderSystemDX::IsSurfaceFormatOk(D3DFORMAT surfFormat, DWORD usage) { - if (!m_bRenderCreated) - return; + // Verify the compatibility + HRESULT hr = m_pD3D->CheckDeviceFormat(m_adapter, + m_devType, + m_D3DPP.BackBufferFormat, + usage, + D3DRTYPE_SURFACE, + surfFormat); - m_nBackBufferWidth = width; - m_nBackBufferHeight = height; - CreateWindowSizeDependentResources(); + return (SUCCEEDED(hr)) ? true : false; } -void CRenderSystemDX::GetClosestDisplayModeToCurrent(IDXGIOutput* output, DXGI_MODE_DESC* outCurrentDisplayMode, bool useCached /*= false*/) +bool CRenderSystemDX::IsTextureFormatOk(D3DFORMAT texFormat, DWORD usage) { - DXGI_OUTPUT_DESC outputDesc; - output->GetDesc(&outputDesc); - HMONITOR hMonitor = outputDesc.Monitor; - MONITORINFOEX monitorInfo; - monitorInfo.cbSize = sizeof(MONITORINFOEX); - GetMonitorInfo(hMonitor, &monitorInfo); - DEVMODE devMode; - devMode.dmSize = sizeof(DEVMODE); - devMode.dmDriverExtra = 0; - EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &devMode); - - bool useDefaultRefreshRate = 1 == devMode.dmDisplayFrequency || 0 == devMode.dmDisplayFrequency; - float refreshRate = RATIONAL_TO_FLOAT(m_cachedMode.RefreshRate); + // Verify the compatibility + HRESULT hr = m_pD3D->CheckDeviceFormat(m_adapter, + m_devType, + m_D3DPP.BackBufferFormat, + usage, + D3DRTYPE_TEXTURE, + texFormat); - // this needed to improve performance for VideoSync bacause FindClosestMatchingMode is very slow - if (!useCached - || m_cachedMode.Width != devMode.dmPelsWidth - || m_cachedMode.Height != devMode.dmPelsHeight - || long(refreshRate) != devMode.dmDisplayFrequency) - { - DXGI_MODE_DESC current; - current.Width = devMode.dmPelsWidth; - current.Height = devMode.dmPelsHeight; - current.RefreshRate.Numerator = useDefaultRefreshRate ? 0 : devMode.dmDisplayFrequency; - current.RefreshRate.Denominator = useDefaultRefreshRate ? 0 : 1; - current.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - current.ScanlineOrdering = m_interlaced ? DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST : DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE; - current.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; - - output->FindClosestMatchingMode(¤t, &m_cachedMode, m_pD3DDev); - } - - ZeroMemory(outCurrentDisplayMode, sizeof(DXGI_MODE_DESC)); - outCurrentDisplayMode->Width = m_cachedMode.Width; - outCurrentDisplayMode->Height = m_cachedMode.Height; - outCurrentDisplayMode->RefreshRate.Numerator = m_cachedMode.RefreshRate.Numerator; - outCurrentDisplayMode->RefreshRate.Denominator = m_cachedMode.RefreshRate.Denominator; - outCurrentDisplayMode->Format = m_cachedMode.Format; - outCurrentDisplayMode->ScanlineOrdering = m_cachedMode.ScanlineOrdering; - outCurrentDisplayMode->Scaling = m_cachedMode.Scaling; + return (SUCCEEDED(hr)) ? true : false; } -void CRenderSystemDX::GetDisplayMode(DXGI_MODE_DESC *mode, bool useCached /*= false*/) +BOOL CRenderSystemDX::IsDepthFormatOk(D3DFORMAT DepthFormat, D3DFORMAT RenderTargetFormat) { - GetClosestDisplayModeToCurrent(m_pOutput, mode, useCached); -} + // Verify that the depth format exists + if (!IsSurfaceFormatOk(DepthFormat, D3DUSAGE_DEPTHSTENCIL)) + return false; -inline void DXWait(ID3D11Device* pDevice, ID3D11DeviceContext* pContext) -{ - ID3D11Query* wait = NULL; - CD3D11_QUERY_DESC qd(D3D11_QUERY_EVENT); - if (SUCCEEDED(pDevice->CreateQuery(&qd, &wait))) - { - pContext->End(wait); - while (S_FALSE == pContext->GetData(wait, NULL, 0, 0)) - Sleep(1); - } - SAFE_RELEASE(wait); + // Verify that the depth format is compatible + HRESULT hr = m_pD3D->CheckDepthStencilMatch(m_adapter, + m_devType, + m_D3DPP.BackBufferFormat, + RenderTargetFormat, + DepthFormat); + + return SUCCEEDED(hr); } -void CRenderSystemDX::SetFullScreenInternal() +void CRenderSystemDX::BuildPresentParameters() { - if (!m_bRenderCreated) - return; + OSVERSIONINFOEX osvi; + ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); + osvi.dwOSVersionInfoSize = sizeof(osvi); + GetVersionEx((OSVERSIONINFO *)&osvi); - HRESULT hr; - BOOL bFullScreen; - m_pSwapChain->GetFullscreenState(&bFullScreen, NULL); + ZeroMemory( &m_D3DPP, sizeof(D3DPRESENT_PARAMETERS) ); + m_D3DPP.Windowed = m_useWindowedDX; + m_D3DPP.SwapEffect = D3DSWAPEFFECT_FLIP; + m_D3DPP.BackBufferCount = 2; - // full-screen to windowed translation. Only change FS state and return - if (!!bFullScreen && m_useWindowedDX) + if(m_useD3D9Ex && (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion >= 1 || osvi.dwMajorVersion > 6)) { - CLog::Log(LOGDEBUG, "%s - Switching swap chain to windowed mode.", __FUNCTION__); - hr = m_pSwapChain->SetFullscreenState(false, NULL); - m_bResizeRequred = S_OK == hr; - - if (S_OK != hr) - CLog::Log(LOGERROR, "%s - Failed switch full screen state: %s.", __FUNCTION__, GetErrorDescription(hr).c_str()); - // wait until switching screen state is done - DXWait(m_pD3DDev, m_pImdContext); - return; +#if D3DX_SDK_VERSION >= 42 + //m_D3DPP.SwapEffect = D3DSWAPEFFECT_FLIPEX; +#else +# pragma message("D3D SDK version is too old to support D3DSWAPEFFECT_FLIPEX") + CLog::Log(LOGWARNING, "CRenderSystemDX::BuildPresentParameters - xbmc compiled with an d3d sdk not supporting D3DSWAPEFFECT_FLIPEX"); +#endif } - // true full-screen - if (m_bFullScreenDevice && !m_useWindowedDX) - { - IDXGIOutput* pOutput = NULL; - m_pSwapChain->GetContainingOutput(&pOutput); - - DXGI_OUTPUT_DESC trgDesc, currDesc; - m_pOutput->GetDesc(&trgDesc); - pOutput->GetDesc(&currDesc); - - if (trgDesc.Monitor != currDesc.Monitor || !bFullScreen) - { - // swap chain requires to change FS mode after resize or transition from windowed to full-screen. - CLog::Log(LOGDEBUG, "%s - Switching swap chain to fullscreen state.", __FUNCTION__); - hr = m_pSwapChain->SetFullscreenState(true, m_pOutput); - m_bResizeRequred = S_OK == hr; - - if (S_OK != hr) - CLog::Log(LOGERROR, "%s - Failed switch full screen state: %s.", __FUNCTION__, GetErrorDescription(hr).c_str()); - } - SAFE_RELEASE(pOutput); - - // do not change modes if hw stereo - if (m_bHWStereoEnabled) - goto end; - - DXGI_SWAP_CHAIN_DESC scDesc; - m_pSwapChain->GetDesc(&scDesc); - - DXGI_MODE_DESC currentMode, // closest to current mode - toMatchMode, // required mode - matchedMode; // closest to required mode - - // find current mode on target output - GetClosestDisplayModeToCurrent(m_pOutput, ¤tMode); - - float currentRefreshRate = RATIONAL_TO_FLOAT(currentMode.RefreshRate); - CLog::Log(LOGDEBUG, "%s - Current display mode is: %dx%d@%0.3f", __FUNCTION__, currentMode.Width, currentMode.Height, currentRefreshRate); - - // use backbuffer dimention to find required display mode - toMatchMode.Width = m_nBackBufferWidth; - toMatchMode.Height = m_nBackBufferHeight; - bool useDefaultRefreshRate = 0 == m_refreshRate; - toMatchMode.RefreshRate.Numerator = useDefaultRefreshRate ? 0 : m_refreshRate; - toMatchMode.RefreshRate.Denominator = useDefaultRefreshRate ? 0 : 1; - toMatchMode.Format = scDesc.BufferDesc.Format; - toMatchMode.Scaling = scDesc.BufferDesc.Scaling; - toMatchMode.ScanlineOrdering = scDesc.BufferDesc.ScanlineOrdering; - // force switch to 1080p23 before hardware stereo - if (RENDER_STEREO_MODE_HARDWAREBASED == g_graphicsContext.GetStereoMode()) - { - toMatchMode.RefreshRate.Numerator = 24000; - toMatchMode.RefreshRate.Denominator = 1001; - toMatchMode.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE; - m_refreshRate = RATIONAL_TO_FLOAT(toMatchMode.RefreshRate); - } - - // find closest mode - m_pOutput->FindClosestMatchingMode(&toMatchMode, &matchedMode, m_pD3DDev); - - float matchedRefreshRate = RATIONAL_TO_FLOAT(matchedMode.RefreshRate); - CLog::Log(LOGDEBUG, "%s - Found matched mode: %dx%d@%0.3f", __FUNCTION__, matchedMode.Width, matchedMode.Height, matchedRefreshRate); - - // change mode if required (current != required) - if ( currentMode.Width != matchedMode.Width - || currentMode.Height != matchedMode.Height - || currentRefreshRate != matchedRefreshRate) - { - CLog::Log(LOGDEBUG, "%s - Switching mode to %dx%d@%0.3f.", __FUNCTION__, matchedMode.Width, matchedMode.Height, matchedRefreshRate); - - // resize window (in windowed mode) or monitor resolution (in fullscreen mode) to required mode - hr = m_pSwapChain->ResizeTarget(&matchedMode); - m_bResizeRequred = S_OK == hr; - - if (FAILED(hr)) - CLog::Log(LOGERROR, "%s - Failed to switch output mode: %s", __FUNCTION__, GetErrorDescription(hr).c_str()); - } - DXWait(m_pD3DDev, m_pImdContext); + m_D3DPP.hDeviceWindow = m_hDeviceWnd; + m_D3DPP.BackBufferWidth = m_nBackBufferWidth; + m_D3DPP.BackBufferHeight = m_nBackBufferHeight; + m_D3DPP.Flags = D3DPRESENTFLAG_VIDEO; + m_D3DPP.PresentationInterval = (m_bVSync) ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; + m_D3DPP.FullScreen_RefreshRateInHz = (m_useWindowedDX) ? 0 : (int)m_refreshRate; + m_D3DPP.BackBufferFormat = D3DFMT_X8R8G8B8; + m_D3DPP.MultiSampleType = D3DMULTISAMPLE_NONE; + m_D3DPP.MultiSampleQuality = 0; + + D3DFORMAT zFormat = D3DFMT_D16; + if (IsDepthFormatOk(D3DFMT_D32, m_D3DPP.BackBufferFormat)) zFormat = D3DFMT_D32; + else if (IsDepthFormatOk(D3DFMT_D24S8, m_D3DPP.BackBufferFormat)) zFormat = D3DFMT_D24S8; + else if (IsDepthFormatOk(D3DFMT_D24X4S4, m_D3DPP.BackBufferFormat)) zFormat = D3DFMT_D24X4S4; + else if (IsDepthFormatOk(D3DFMT_D24X8, m_D3DPP.BackBufferFormat)) zFormat = D3DFMT_D24X8; + else if (IsDepthFormatOk(D3DFMT_D16, m_D3DPP.BackBufferFormat)) zFormat = D3DFMT_D16; + else if (IsDepthFormatOk(D3DFMT_D15S1, m_D3DPP.BackBufferFormat)) zFormat = D3DFMT_D15S1; + + m_D3DPP.EnableAutoDepthStencil = TRUE; + m_D3DPP.AutoDepthStencilFormat = zFormat; + + if (m_useD3D9Ex) + { + ZeroMemory( &m_D3DDMEX, sizeof(D3DDISPLAYMODEEX) ); + m_D3DDMEX.Size = sizeof(D3DDISPLAYMODEEX); + m_D3DDMEX.Width = m_D3DPP.BackBufferWidth; + m_D3DDMEX.Height = m_D3DPP.BackBufferHeight; + m_D3DDMEX.RefreshRate = m_D3DPP.FullScreen_RefreshRateInHz; + m_D3DDMEX.Format = m_D3DPP.BackBufferFormat; + m_D3DDMEX.ScanLineOrdering = m_interlaced ? D3DSCANLINEORDERING_INTERLACED : D3DSCANLINEORDERING_PROGRESSIVE; } -end: - // in windowed mode DWM uses triple buffering in any case. - // for FSEM we use double buffering - SetMaximumFrameLatency(2 - m_useWindowedDX); -} - -bool CRenderSystemDX::IsFormatSupport(DXGI_FORMAT format, unsigned int usage) -{ - UINT supported; - m_pD3DDev->CheckFormatSupport(format, &supported); - return (supported & usage) != 0; } bool CRenderSystemDX::DestroyRenderSystem() { DeleteDevice(); - SAFE_RELEASE(m_pOutput); - SAFE_RELEASE(m_adapter); - SAFE_RELEASE(m_dxgiFactory); + SAFE_RELEASE(m_stateBlock); + SAFE_RELEASE(m_pD3D); + SAFE_RELEASE(m_pD3DDevice); + + m_bRenderCreated = false; + return true; } @@ -425,51 +325,11 @@ { CSingleLock lock(m_resourceSection); - if (m_pGUIShader) - m_pGUIShader->End(); - // tell any shared resources - for (std::vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) + for (vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) (*i)->OnDestroyDevice(); - if (m_pSwapChain) - m_pSwapChain->SetFullscreenState(false, NULL); - - SAFE_DELETE(m_pGUIShader); - SAFE_RELEASE(m_pTextureRight); - SAFE_RELEASE(m_pRenderTargetViewRight); - SAFE_RELEASE(m_pShaderResourceViewRight); - SAFE_RELEASE(m_BlendEnableState); - SAFE_RELEASE(m_BlendDisableState); - SAFE_RELEASE(m_RSScissorDisable); - SAFE_RELEASE(m_RSScissorEnable); - SAFE_RELEASE(m_depthStencilState); - SAFE_RELEASE(m_depthStencilView); - SAFE_RELEASE(m_pRenderTargetView); - if (m_pContext && m_pContext != m_pImdContext) - { - m_pContext->ClearState(); - m_pContext->Flush(); - SAFE_RELEASE(m_pContext); - } - if (m_pImdContext) - { - m_pImdContext->ClearState(); - m_pImdContext->Flush(); - SAFE_RELEASE(m_pImdContext); - } - SAFE_RELEASE(m_pSwapChain); - SAFE_RELEASE(m_pSwapChain1); - SAFE_RELEASE(m_pD3DDev); -#ifdef _DEBUG - if (m_d3dDebug) - { - m_d3dDebug->ReportLiveDeviceObjects(D3D11_RLDO_SUMMARY | D3D11_RLDO_DETAIL); - SAFE_RELEASE(m_d3dDebug); - } -#endif - m_bResizeRequred = false; - m_bHWStereoEnabled = false; + SAFE_RELEASE(m_pD3DDevice); m_bRenderCreated = false; } @@ -477,13 +337,14 @@ { CSingleLock lock(m_resourceSection); g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_RENDERER_LOST); + SAFE_RELEASE(m_stateBlock); if (m_needNewDevice) DeleteDevice(); else { // just resetting the device - for (std::vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) + for (vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) (*i)->OnLostDevice(); } } @@ -494,216 +355,176 @@ if (m_needNewDevice) CreateDevice(); - - if (m_bRenderCreated) + else { - // we're back - for (std::vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) + // just need a reset + if (m_useD3D9Ex) + m_nDeviceStatus = ((IDirect3DDevice9Ex*)m_pD3DDevice)->ResetEx(&m_D3DPP, m_D3DPP.Windowed ? NULL : &m_D3DDMEX); + else + m_nDeviceStatus = m_pD3DDevice->Reset(&m_D3DPP); + } + + if (m_nDeviceStatus == S_OK) + { // we're back + for (vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) (*i)->OnResetDevice(); g_renderManager.Flush(); + g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_RENDERER_RESET); } + else + { + for (vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) + (*i)->OnLostDevice(); + } } bool CRenderSystemDX::CreateDevice() { + // Code based on Ogre 3D engine CSingleLock lock(m_resourceSection); HRESULT hr; - SAFE_RELEASE(m_pD3DDev); - D3D_FEATURE_LEVEL featureLevels[] = - { - D3D_FEATURE_LEVEL_11_1, - D3D_FEATURE_LEVEL_11_0, - D3D_FEATURE_LEVEL_10_1, - D3D_FEATURE_LEVEL_10_0, - D3D_FEATURE_LEVEL_9_3, - D3D_FEATURE_LEVEL_9_2, - D3D_FEATURE_LEVEL_9_1, - }; + if(m_pD3D == NULL) + return false; - // the VIDEO_SUPPORT flag force lowering feature level if current env not support video on 11_1 - UINT createDeviceFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT; -#ifdef _DEBUG - createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; -#endif - D3D_DRIVER_TYPE driverType = m_adapter == nullptr ? D3D_DRIVER_TYPE_HARDWARE : D3D_DRIVER_TYPE_UNKNOWN; - // we should specify D3D_DRIVER_TYPE_UNKNOWN if create device with specified adapter. - hr = D3D11CreateDevice(m_adapter, driverType, nullptr, createDeviceFlags, featureLevels, ARRAYSIZE(featureLevels), - D3D11_SDK_VERSION, &m_pD3DDev, &m_featureLevel, &m_pImdContext); - - if (FAILED(hr)) - { - // DirectX 11.0 platforms will not recognize D3D_FEATURE_LEVEL_11_1 so we need to retry without it - CLog::Log(LOGDEBUG, "%s - First try to create device failed with error: %s.", __FUNCTION__, GetErrorDescription(hr).c_str()); - CLog::Log(LOGDEBUG, "%s - Trying to create device with lowest feature level: %#x.", __FUNCTION__, featureLevels[1]); + if(m_hDeviceWnd == NULL) + return false; - hr = D3D11CreateDevice(m_adapter, driverType, nullptr, createDeviceFlags, &featureLevels[1], ARRAYSIZE(featureLevels) - 1, - D3D11_SDK_VERSION, &m_pD3DDev, &m_featureLevel, &m_pImdContext); - if (FAILED(hr)) - { - // still failed. seems driver doesn't support video API acceleration, try without VIDEO_SUPPORT flag - CLog::Log(LOGDEBUG, "%s - Next try to create device failed with error: %s.", __FUNCTION__, GetErrorDescription(hr).c_str()); - CLog::Log(LOGDEBUG, "%s - Trying to create device without video API support.", __FUNCTION__); - - createDeviceFlags &= ~D3D11_CREATE_DEVICE_VIDEO_SUPPORT; - hr = D3D11CreateDevice(m_adapter, driverType, nullptr, createDeviceFlags, &featureLevels[1], ARRAYSIZE(featureLevels) - 1, - D3D11_SDK_VERSION, &m_pD3DDev, &m_featureLevel, &m_pImdContext); - if (SUCCEEDED(hr)) - CLog::Log(LOGNOTICE, "%s - Your video driver doesn't support DirectX 11 Video Acceleration API. Application is not be able to use hardware video processing and decoding", __FUNCTION__); - } - } + CLog::Log(LOGDEBUG, __FUNCTION__" on adapter %d", m_adapter); - if (FAILED(hr)) + BuildPresentParameters(); + + D3DCAPS9 caps; + memset(&caps, 0, sizeof(caps)); + m_pD3D->GetDeviceCaps(m_adapter, m_devType, &caps); + + DWORD VertexProcessingFlags = 0; + if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) { - CLog::Log(LOGERROR, "%s - D3D11 device creation failure with error %s.", __FUNCTION__, GetErrorDescription(hr).c_str()); - return false; + /* Activate when the state management of the fixed pipeline is in order, + to get a bit more performance + if (caps.DevCaps & D3DDEVCAPS_PUREDEVICE) + VertexProcessingFlags = D3DCREATE_PUREDEVICE; + */ + VertexProcessingFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING; + CLog::Log(LOGDEBUG, __FUNCTION__" - using hardware vertex processing"); + } + else + { + VertexProcessingFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING; + CLog::Log(LOGDEBUG, __FUNCTION__" - using software vertex processing"); } - if (!m_adapter) + if (m_useD3D9Ex) { - // get adapter from device if it was not detected previously - IDXGIDevice1* pDXGIDevice = nullptr; - if (SUCCEEDED(m_pD3DDev->QueryInterface(__uuidof(IDXGIDevice1), reinterpret_cast(&pDXGIDevice)))) + hr = ((IDirect3D9Ex*)m_pD3D)->CreateDeviceEx(m_adapter, m_devType, m_hFocusWnd, + VertexProcessingFlags | D3DCREATE_MULTITHREADED, &m_D3DPP, m_D3DPP.Windowed ? NULL : &m_D3DDMEX, (IDirect3DDevice9Ex**)&m_pD3DDevice ); + if (FAILED(hr)) { - IDXGIAdapter *pAdapter = nullptr; - if (SUCCEEDED(pDXGIDevice->GetAdapter(&pAdapter))) + CLog::Log(LOGWARNING, __FUNCTION__" - initial wanted device config failed"); + // Try a second time, may fail the first time due to back buffer count, + // which will be corrected down to 1 by the runtime + hr = ((IDirect3D9Ex*)m_pD3D)->CreateDeviceEx( m_adapter, m_devType, m_hFocusWnd, + VertexProcessingFlags | D3DCREATE_MULTITHREADED, &m_D3DPP, m_D3DPP.Windowed ? NULL : &m_D3DDMEX, (IDirect3DDevice9Ex**)&m_pD3DDevice ); + if( FAILED( hr ) ) { - hr = pAdapter->QueryInterface(__uuidof(IDXGIAdapter1), reinterpret_cast(&m_adapter)); - SAFE_RELEASE(pAdapter); - if (FAILED(hr)) - return false; - - m_adapter->GetDesc(&m_adapterDesc); - CLog::Log(LOGDEBUG, __FUNCTION__" - Selected %S adapter. ", m_adapterDesc.Description); + CLog::Log(LOGERROR, __FUNCTION__" - unable to create a device. %s", GetErrorDescription(hr).c_str()); + return false; } - SAFE_RELEASE(pDXGIDevice); } + // Not sure the following actually does something + ((IDirect3DDevice9Ex*)m_pD3DDevice)->SetGPUThreadPriority(7); } - - if (!m_adapter) + else { - CLog::Log(LOGERROR, "%s - Failed to find adapter.", __FUNCTION__); - return false; + hr = m_pD3D->CreateDevice(m_adapter, m_devType, m_hFocusWnd, + VertexProcessingFlags | D3DCREATE_MULTITHREADED, &m_D3DPP, &m_pD3DDevice ); + if (FAILED(hr)) + { + CLog::Log(LOGWARNING, __FUNCTION__" - initial wanted device config failed"); + // Try a second time, may fail the first time due to back buffer count, + // which will be corrected down to 1 by the runtime + hr = m_pD3D->CreateDevice( m_adapter, m_devType, m_hFocusWnd, + VertexProcessingFlags | D3DCREATE_MULTITHREADED, &m_D3DPP, &m_pD3DDevice ); + if( FAILED( hr ) ) + { + CLog::Log(LOGERROR, __FUNCTION__" - unable to create a device. %s", GetErrorDescription(hr).c_str()); + return false; + } + } } - SAFE_RELEASE(m_dxgiFactory); - m_adapter->GetParent(__uuidof(IDXGIFactory1), reinterpret_cast(&m_dxgiFactory)); - - if (!m_pOutput) + if(m_pD3D->GetAdapterIdentifier(m_adapter, 0, &m_AIdentifier) == D3D_OK) { - HMONITOR hMonitor = MonitorFromWindow(m_hDeviceWnd, MONITOR_DEFAULTTONULL); - SetMonitor(hMonitor); + m_RenderRenderer = (const char*)m_AIdentifier.Description; + m_RenderVendor = (const char*)m_AIdentifier.Driver; + m_RenderVersion = StringUtils::Format("%d.%d.%d.%04d", HIWORD(m_AIdentifier.DriverVersion.HighPart), LOWORD(m_AIdentifier.DriverVersion.HighPart), + HIWORD(m_AIdentifier.DriverVersion.LowPart) , LOWORD(m_AIdentifier.DriverVersion.LowPart)); } - if ( g_advancedSettings.m_bAllowDeferredRendering - && FAILED(m_pD3DDev->CreateDeferredContext(0, &m_pContext))) - { - CLog::Log(LOGERROR, "%s - Failed to create deferred context, deferred rendering is not possible, fallback to immediate rendering.", __FUNCTION__); - } + CLog::Log(LOGDEBUG, __FUNCTION__" - adapter %d: %s, %s, VendorId %lu, DeviceId %lu", + m_adapter, m_AIdentifier.Driver, m_AIdentifier.Description, m_AIdentifier.VendorId, m_AIdentifier.DeviceId); - // make immediate context as default context if deferred context was not created - if (!m_pContext) - m_pContext = m_pImdContext; + // get our render capabilities + // re-read caps, there may be changes depending on the vertex processing type + m_pD3DDevice->GetDeviceCaps(&caps); - if (m_featureLevel < D3D_FEATURE_LEVEL_9_3) - m_maxTextureSize = D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION; - else if (m_featureLevel < D3D_FEATURE_LEVEL_10_0) - m_maxTextureSize = D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION; - else if (m_featureLevel < D3D_FEATURE_LEVEL_11_0) - m_maxTextureSize = D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; - else - // 11_x and greater feature level. Limit this size to avoid memory overheads - m_maxTextureSize = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION >> 1; + m_maxTextureSize = min(caps.MaxTextureWidth, caps.MaxTextureHeight); - // use multi-thread protection on the device context to prevent deadlock issues that can sometimes happen - // when decoder call ID3D11VideoContext::GetDecoderBuffer or ID3D11VideoContext::ReleaseDecoderBuffer. - ID3D10Multithread *pMultiThreading = NULL; - if (SUCCEEDED(m_pD3DDev->QueryInterface(__uuidof(ID3D10Multithread), reinterpret_cast(&pMultiThreading)))) + if (g_advancedSettings.m_AllowDynamicTextures && m_useD3D9Ex && (caps.Caps2 & D3DCAPS2_DYNAMICTEXTURES)) { - pMultiThreading->SetMultithreadProtected(true); - pMultiThreading->Release(); + m_defaultD3DUsage = D3DUSAGE_DYNAMIC; + m_defaultD3DPool = D3DPOOL_DEFAULT; + CLog::Log(LOGDEBUG, __FUNCTION__" - using D3DCAPS2_DYNAMICTEXTURES"); } - - // in windowed mode DWM uses triple buffering in any case. - // for FSEM we use double buffering - SetMaximumFrameLatency(2 - m_useWindowedDX); - -#ifdef _DEBUG - if (SUCCEEDED(m_pD3DDev->QueryInterface(__uuidof(ID3D11Debug), reinterpret_cast(&m_d3dDebug)))) + else { - ID3D11InfoQueue *d3dInfoQueue = nullptr; - if (SUCCEEDED(m_d3dDebug->QueryInterface(__uuidof(ID3D11InfoQueue), reinterpret_cast(&d3dInfoQueue)))) - { - D3D11_MESSAGE_ID hide[] = - { - D3D11_MESSAGE_ID_GETVIDEOPROCESSORFILTERRANGE_UNSUPPORTED, // avoid GETVIDEOPROCESSORFILTERRANGE_UNSUPPORTED (dx bug) - D3D11_MESSAGE_ID_DEVICE_RSSETSCISSORRECTS_NEGATIVESCISSOR // avoid warning for some labels out of screen - // Add more message IDs here as needed - }; - - D3D11_INFO_QUEUE_FILTER filter; - ZeroMemory(&filter, sizeof(filter)); - filter.DenyList.NumIDs = _countof(hide); - filter.DenyList.pIDList = hide; - d3dInfoQueue->AddStorageFilterEntries(&filter); - d3dInfoQueue->Release(); - } + m_defaultD3DUsage = 0; + m_defaultD3DPool = D3DPOOL_MANAGED; } -#endif - m_adapterDesc = {}; - if (SUCCEEDED(m_adapter->GetDesc(&m_adapterDesc))) - { - CLog::Log(LOGDEBUG, "%s - on adapter %S (VendorId: %#x DeviceId: %#x) with feature level %#x.", __FUNCTION__, - m_adapterDesc.Description, m_adapterDesc.VendorId, m_adapterDesc.DeviceId, m_featureLevel); + m_renderCaps = 0; - m_RenderRenderer = StringUtils::Format("%S", m_adapterDesc.Description); - IDXGIFactory2* dxgiFactory2 = nullptr; - m_dxgiFactory->QueryInterface(__uuidof(IDXGIFactory2), reinterpret_cast(&dxgiFactory2)); - m_RenderVersion = StringUtils::Format("DirectX %s (FL %d.%d)", - dxgiFactory2 != nullptr ? "11.1" : "11.0", - (m_featureLevel >> 12) & 0xF, - (m_featureLevel >> 8) & 0xF); - SAFE_RELEASE(dxgiFactory2); - } + CLog::Log(LOGDEBUG, __FUNCTION__" - texture caps: 0x%08X", caps.TextureCaps); - m_renderCaps = 0; - unsigned int usage = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE; - if ( IsFormatSupport(DXGI_FORMAT_BC1_UNORM, usage) - && IsFormatSupport(DXGI_FORMAT_BC2_UNORM, usage) - && IsFormatSupport(DXGI_FORMAT_BC3_UNORM, usage)) + if(IsTextureFormatOk(D3DFMT_DXT1, m_defaultD3DUsage) + && IsTextureFormatOk(D3DFMT_DXT3, m_defaultD3DUsage) + && IsTextureFormatOk(D3DFMT_DXT5, m_defaultD3DUsage)) m_renderCaps |= RENDER_CAPS_DXT; - // MSDN: At feature levels 9_1, 9_2 and 9_3, the display device supports the use of 2D textures with dimensions that are not powers of two under two conditions. - // First, only one MIP-map level for each texture can be created - we are using only 1 mip level) - // Second, no wrap sampler modes for textures are allowed - we are using clamp everywhere - // At feature levels 10_0, 10_1 and 11_0, the display device unconditionally supports the use of 2D textures with dimensions that are not powers of two. - // so, setup caps NPOT - m_renderCaps |= RENDER_CAPS_NPOT; - if ((m_renderCaps & RENDER_CAPS_DXT) != 0) - m_renderCaps |= RENDER_CAPS_DXT_NPOT; + if ((caps.TextureCaps & D3DPTEXTURECAPS_POW2) == 0) + { // we're allowed NPOT textures + m_renderCaps |= RENDER_CAPS_NPOT; + if (((m_renderCaps & RENDER_CAPS_DXT) != 0) && ((caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) == 0)) + m_renderCaps |= RENDER_CAPS_DXT_NPOT; + } + else if ((caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) != 0) + { // we're allowed _some_ NPOT textures (namely non-DXT and only with D3DTADDRESS_CLAMP and no wrapping) + m_renderCaps |= RENDER_CAPS_NPOT; + } // Temporary - allow limiting the caps to debug a texture problem if (g_advancedSettings.m_RestrictCapsMask != 0) m_renderCaps &= ~g_advancedSettings.m_RestrictCapsMask; if (m_renderCaps & RENDER_CAPS_DXT) - CLog::Log(LOGDEBUG, "%s - RENDER_CAPS_DXT", __FUNCTION__); + CLog::Log(LOGDEBUG, __FUNCTION__" - RENDER_CAPS_DXT"); if (m_renderCaps & RENDER_CAPS_NPOT) - CLog::Log(LOGDEBUG, "%s - RENDER_CAPS_NPOT", __FUNCTION__); + CLog::Log(LOGDEBUG, __FUNCTION__" - RENDER_CAPS_NPOT"); if (m_renderCaps & RENDER_CAPS_DXT_NPOT) - CLog::Log(LOGDEBUG, "%s - RENDER_CAPS_DXT_NPOT", __FUNCTION__); + CLog::Log(LOGDEBUG, __FUNCTION__" - RENDER_CAPS_DXT_NPOT"); - /* All the following quirks need to be tested // nVidia quirk: some NPOT DXT textures of the GUI display with corruption // when using D3DPOOL_DEFAULT + D3DUSAGE_DYNAMIC textures (no other choice with D3D9Ex for example) // most likely xbmc bug, but no hw to repro & fix properly. // affects lots of hw generations - 6xxx, 7xxx, GT220, ION1 // see ticket #9269 - if (m_adapterDesc.VendorId == PCIV_nVidia) + if(m_defaultD3DUsage == D3DUSAGE_DYNAMIC + && m_defaultD3DPool == D3DPOOL_DEFAULT + && m_AIdentifier.VendorId == PCIV_nVidia) { CLog::Log(LOGDEBUG, __FUNCTION__" - nVidia workaround - disabling RENDER_CAPS_DXT_NPOT"); m_renderCaps &= ~RENDER_CAPS_DXT_NPOT; @@ -715,498 +536,88 @@ // DXT3/5: 16 pixels wide ---------------------------------------- // Both equal to a pitch of 64. So far no Intel has DXT NPOT (including i3/i5/i7, so just go with the next higher POT. // See ticket #9578 - if (m_adapterDesc.VendorId == PCIV_Intel) + if(m_defaultD3DUsage == D3DUSAGE_DYNAMIC + && m_defaultD3DPool == D3DPOOL_DEFAULT + && m_AIdentifier.VendorId == PCIV_Intel) { CLog::Log(LOGDEBUG, __FUNCTION__" - Intel workaround - specifying minimum pitch for compressed textures."); m_minDXTPitch = 128; - }*/ + } - if (!CreateStates() || !InitGUIShader() || !CreateWindowSizeDependentResources()) - return false; + D3DDISPLAYMODE mode; + if (SUCCEEDED(m_pD3DDevice->GetDisplayMode(0, &mode))) + m_screenHeight = mode.Height; + else + m_screenHeight = m_nBackBufferHeight; + + m_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); + m_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); m_bRenderCreated = true; m_needNewDevice = false; // tell any shared objects about our resurrection - for (std::vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) + for (vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) (*i)->OnCreateDevice(); - RestoreViewPort(); - return true; } -bool CRenderSystemDX::CreateWindowSizeDependentResources() +bool CRenderSystemDX::PresentRenderImpl(const CDirtyRegionList &dirty) { - if (m_resizeInProgress) - return false; - HRESULT hr; - DXGI_SWAP_CHAIN_DESC scDesc = { 0 }; - - bool bNeedRecreate = false; - bool bNeedResize = false; - bool bHWStereoEnabled = RENDER_STEREO_MODE_HARDWAREBASED == g_graphicsContext.GetStereoMode(); - - if (m_pSwapChain) - { - m_pSwapChain->GetDesc(&scDesc); - bNeedResize = m_bResizeRequred || m_nBackBufferWidth != scDesc.BufferDesc.Width || m_nBackBufferHeight != scDesc.BufferDesc.Height; - } - else - bNeedResize = true; - - if (m_pSwapChain1) - { - DXGI_SWAP_CHAIN_DESC1 scDesc; - m_pSwapChain1->GetDesc1(&scDesc); - bNeedRecreate = (scDesc.Stereo && !bHWStereoEnabled) || (!scDesc.Stereo && bHWStereoEnabled); - } - - if (!bNeedRecreate && !bNeedResize) - { - CheckInterlasedStereoView(); - return true; - } - - m_resizeInProgress = true; - - CLog::Log(LOGDEBUG, "%s - (Re)Create window size (%dx%d) dependent resources.", __FUNCTION__, m_nBackBufferWidth, m_nBackBufferHeight); - - bool bRestoreRTView = false; - { - ID3D11RenderTargetView* pRTView; ID3D11DepthStencilView* pDSView; - m_pContext->OMGetRenderTargets(1, &pRTView, &pDSView); - - bRestoreRTView = NULL != pRTView || NULL != pDSView; - - SAFE_RELEASE(pRTView); - SAFE_RELEASE(pDSView); - } - - m_pContext->OMSetRenderTargets(0, NULL, NULL); - FinishCommandList(false); - SAFE_RELEASE(m_pRenderTargetView); - SAFE_RELEASE(m_depthStencilView); - SAFE_RELEASE(m_pRenderTargetViewRight); - SAFE_RELEASE(m_pShaderResourceViewRight); - SAFE_RELEASE(m_pTextureRight); - - if (bNeedRecreate) - { - BOOL fullScreen; - m_pSwapChain1->GetFullscreenState(&fullScreen, NULL); - if (fullScreen) - m_pSwapChain1->SetFullscreenState(false, NULL); - - CLog::Log(LOGDEBUG, "%s - Destroying swapchain in order to switch %s stereoscopic 3D.", __FUNCTION__, bHWStereoEnabled ? "to" : "from"); - - SAFE_RELEASE(m_pSwapChain); - SAFE_RELEASE(m_pSwapChain1); - m_pImdContext->Flush(); - - // flush command is asynchronous, so wait until destruction is completed - // otherwise it can cause problems with flip presentation model swap chains. - DXWait(m_pD3DDev, m_pImdContext); - } - - uint32_t scFlags = m_useWindowedDX ? 0 : DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; - if (!m_pSwapChain) - { - CLog::Log(LOGDEBUG, "%s - Creating swapchain in %s mode.", __FUNCTION__, bHWStereoEnabled ? "Stereoscopic 3D" : "Mono"); - - // Create swap chain - IDXGIFactory2* dxgiFactory2 = NULL; - hr = m_dxgiFactory->QueryInterface(__uuidof(IDXGIFactory2), reinterpret_cast(&dxgiFactory2)); - if (SUCCEEDED(hr) && dxgiFactory2) - { - // DirectX 11.1 or later - DXGI_SWAP_CHAIN_DESC1 scDesc1 = { 0 }; - scDesc1.Width = m_nBackBufferWidth; - scDesc1.Height = m_nBackBufferHeight; - scDesc1.BufferCount = 2; // Use double buffering to minimize latency. - scDesc1.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - scDesc1.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - scDesc1.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; - scDesc1.Stereo = bHWStereoEnabled; - scDesc1.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; - scDesc1.Flags = scFlags; - - scDesc1.SampleDesc.Count = 1; - scDesc1.SampleDesc.Quality = 0; - - DXGI_SWAP_CHAIN_FULLSCREEN_DESC scFSDesc = { 0 }; - scFSDesc.ScanlineOrdering = m_interlaced ? DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST : DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE; - scFSDesc.Windowed = m_useWindowedDX; - - hr = dxgiFactory2->CreateSwapChainForHwnd(m_pD3DDev, m_hFocusWnd, &scDesc1, &scFSDesc, NULL, &m_pSwapChain1); - - // some drivers (AMD) are denied to switch in stereoscopic 3D mode, if so then fallback to mono mode - if (FAILED(hr) && bHWStereoEnabled) - { - // switch to stereo mode failed, create mono swapchain - CLog::Log(LOGERROR, "%s - Creating stereo swap chain failed with error: %s.", __FUNCTION__, GetErrorDescription(hr).c_str()); - CLog::Log(LOGNOTICE, "%s - Fallback to monoscopic mode.", __FUNCTION__); - - scDesc1.Stereo = false; - hr = dxgiFactory2->CreateSwapChainForHwnd(m_pD3DDev, m_hFocusWnd, &scDesc1, &scFSDesc, NULL, &m_pSwapChain1); - - // fallback to split_horisontal mode. - g_graphicsContext.SetStereoMode(RENDER_STEREO_MODE_SPLIT_HORIZONTAL); - } - - if (SUCCEEDED(hr)) - { - m_pSwapChain1->QueryInterface(__uuidof(IDXGISwapChain), reinterpret_cast(&m_pSwapChain)); - // this hackish way to disable stereo in windowed mode: - // - restart presenting, 0 in sync interval discards current frame also - // - wait until new frame will be drawn - // sleep value possible depends on hardware m.b. need a setting in as.xml - if (m_useWindowedDX && !bHWStereoEnabled && m_bHWStereoEnabled) - { - DXGI_PRESENT_PARAMETERS presentParams = {}; - presentParams.DirtyRectsCount = 0; - presentParams.pDirtyRects = NULL; - presentParams.pScrollRect = NULL; - m_pSwapChain1->Present1(0, DXGI_PRESENT_RESTART, &presentParams); - - Sleep(100); - } - m_bHWStereoEnabled = bHWStereoEnabled; - } - dxgiFactory2->Release(); - } - else - { - // DirectX 11.0 systems - scDesc.BufferCount = 2; // Use double buffering to minimize latency. - scDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - scDesc.OutputWindow = m_hFocusWnd; - scDesc.Windowed = m_useWindowedDX; - scDesc.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL; - scDesc.Flags = scFlags; - - scDesc.BufferDesc.Width = m_nBackBufferWidth; - scDesc.BufferDesc.Height = m_nBackBufferHeight; - scDesc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - scDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; - scDesc.BufferDesc.ScanlineOrdering = m_interlaced ? DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST : DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE; - scDesc.SampleDesc.Count = 1; - scDesc.SampleDesc.Quality = 0; - - hr = m_dxgiFactory->CreateSwapChain(m_pD3DDev, &scDesc, &m_pSwapChain); - } - - if (FAILED(hr)) - { - CLog::Log(LOGERROR, "%s - Creating swap chain failed with error: %s.", __FUNCTION__, GetErrorDescription(hr).c_str()); - m_bRenderCreated = false; - return false; - } - - // tell DXGI to not interfere with application's handling of window mode changes - m_dxgiFactory->MakeWindowAssociation(m_hFocusWnd, DXGI_MWA_NO_WINDOW_CHANGES | DXGI_MWA_NO_ALT_ENTER); - } - else - { - // resize swap chain buffers with preserving the existing buffer count and format. - hr = m_pSwapChain->ResizeBuffers(scDesc.BufferCount, m_nBackBufferWidth, m_nBackBufferHeight, scDesc.BufferDesc.Format, scFlags); - if (FAILED(hr)) - { - CLog::Log(LOGERROR, "%s - Failed to resize buffers (%s).", __FUNCTION__, GetErrorDescription(hr).c_str()); - if (DXGI_ERROR_DEVICE_REMOVED == hr) - OnDeviceLost(); - - return false; - } - } - - // Create a render target view - ID3D11Texture2D* pBackBuffer = nullptr; - hr = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast(&pBackBuffer)); - if (FAILED(hr)) - { - CLog::Log(LOGERROR, "%s - Failed to get back buffer (%s).", __FUNCTION__, GetErrorDescription(hr).c_str()); - return false; - } - - // Create a view interface on the rendertarget to use on bind for mono or left eye view. - CD3D11_RENDER_TARGET_VIEW_DESC rtDesc(D3D11_RTV_DIMENSION_TEXTURE2DARRAY, DXGI_FORMAT_UNKNOWN, 0, 0, 1); - hr = m_pD3DDev->CreateRenderTargetView(pBackBuffer, &rtDesc, &m_pRenderTargetView); - if (FAILED(hr)) - { - CLog::Log(LOGERROR, "%s - Failed to create render target view (%s).", __FUNCTION__, GetErrorDescription(hr).c_str()); - pBackBuffer->Release(); - return false; - } - - if (m_bHWStereoEnabled) - { - // Stereo swapchains have an arrayed resource, so create a second Render Target for the right eye buffer. - CD3D11_RENDER_TARGET_VIEW_DESC rtDesc(D3D11_RTV_DIMENSION_TEXTURE2DARRAY, DXGI_FORMAT_UNKNOWN, 0, 1, 1); - hr = m_pD3DDev->CreateRenderTargetView(pBackBuffer, &rtDesc, &m_pRenderTargetViewRight); - if (FAILED(hr)) - { - CLog::Log(LOGERROR, "%s - Failed to create right eye buffer (%s).", __FUNCTION__, GetErrorDescription(hr).c_str()); - pBackBuffer->Release(); - g_graphicsContext.SetStereoMode(RENDER_STEREO_MODE_OFF); // try fallback to mono - } - } - pBackBuffer->Release(); - - DXGI_FORMAT zFormat = DXGI_FORMAT_D16_UNORM; - if (IsFormatSupport(DXGI_FORMAT_D32_FLOAT, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL)) zFormat = DXGI_FORMAT_D32_FLOAT; - else if (IsFormatSupport(DXGI_FORMAT_D24_UNORM_S8_UINT, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL)) zFormat = DXGI_FORMAT_D24_UNORM_S8_UINT; - else if (IsFormatSupport(DXGI_FORMAT_D16_UNORM, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL)) zFormat = DXGI_FORMAT_D16_UNORM; - - ID3D11Texture2D* depthStencilBuffer = NULL; - // Initialize the description of the depth buffer. - CD3D11_TEXTURE2D_DESC depthBufferDesc(zFormat, m_nBackBufferWidth, m_nBackBufferHeight, 1, 1, D3D11_BIND_DEPTH_STENCIL); - // Create the texture for the depth buffer using the filled out description. - hr = m_pD3DDev->CreateTexture2D(&depthBufferDesc, NULL, &depthStencilBuffer); - if (FAILED(hr)) - { - CLog::Log(LOGERROR, "%s - Failed to create depth stencil buffer (%s).", __FUNCTION__, GetErrorDescription(hr).c_str()); + if (!m_bRenderCreated) return false; - } - - // Create the depth stencil view. - CD3D11_DEPTH_STENCIL_VIEW_DESC viewDesc(D3D11_DSV_DIMENSION_TEXTURE2D); - hr = m_pD3DDev->CreateDepthStencilView(depthStencilBuffer, &viewDesc, &m_depthStencilView); - depthStencilBuffer->Release(); - if (FAILED(hr)) - { - CLog::Log(LOGERROR, "%s - Failed to create depth stencil view (%s).", __FUNCTION__, GetErrorDescription(hr).c_str()); + if(m_nDeviceStatus != S_OK) return false; - } - - if (m_viewPort.Height == 0 || m_viewPort.Width == 0) - { - CRect rect(0, 0, m_nBackBufferWidth, m_nBackBufferHeight); - SetViewPort(rect); - } - - // set camera to center of screen - CPoint camPoint = { m_nBackBufferWidth * 0.5f, m_nBackBufferHeight * 0.5f }; - SetCameraPosition(camPoint, m_nBackBufferWidth, m_nBackBufferHeight); - CheckInterlasedStereoView(); + //CVideoReferenceClock polls GetRasterStatus too, + //polling it from two threads at the same time is bad + if (g_advancedSettings.m_sleepBeforeFlip > 0 && !g_VideoReferenceClock.IsRunning()) + { + //save current thread priority and set thread priority to THREAD_PRIORITY_TIME_CRITICAL + int priority = GetThreadPriority(GetCurrentThread()); + if (priority != THREAD_PRIORITY_ERROR_RETURN) + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); - if (bRestoreRTView) - m_pContext->OMSetRenderTargets(1, &m_pRenderTargetView, m_depthStencilView); - - m_resizeInProgress = false; - m_bResizeRequred = false; - - return true; -} - -void CRenderSystemDX::CheckInterlasedStereoView(void) -{ - RENDER_STEREO_MODE stereoMode = g_graphicsContext.GetStereoMode(); - - if ( m_pRenderTargetViewRight - && RENDER_STEREO_MODE_INTERLACED != stereoMode - && RENDER_STEREO_MODE_CHECKERBOARD != stereoMode - && RENDER_STEREO_MODE_HARDWAREBASED != stereoMode) - { - // release resources - SAFE_RELEASE(m_pRenderTargetViewRight); - SAFE_RELEASE(m_pShaderResourceViewRight); - SAFE_RELEASE(m_pTextureRight); - } - - if ( !m_pRenderTargetViewRight - && ( RENDER_STEREO_MODE_INTERLACED == stereoMode - || RENDER_STEREO_MODE_CHECKERBOARD == stereoMode)) - { - // Create a second Render Target for the right eye buffer - HRESULT hr; - CD3D11_TEXTURE2D_DESC texDesc(DXGI_FORMAT_B8G8R8A8_UNORM, m_nBackBufferWidth, m_nBackBufferHeight, 1, 1, - D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE); - hr = m_pD3DDev->CreateTexture2D(&texDesc, NULL, &m_pTextureRight); - if (SUCCEEDED(hr)) - { - CD3D11_RENDER_TARGET_VIEW_DESC rtDesc(D3D11_RTV_DIMENSION_TEXTURE2D); - hr = m_pD3DDev->CreateRenderTargetView(m_pTextureRight, &rtDesc, &m_pRenderTargetViewRight); - - if (SUCCEEDED(hr)) - { - CD3D11_SHADER_RESOURCE_VIEW_DESC srDesc(D3D11_SRV_DIMENSION_TEXTURE2D); - hr = m_pD3DDev->CreateShaderResourceView(m_pTextureRight, &srDesc, &m_pShaderResourceViewRight); - - if (FAILED(hr)) - CLog::Log(LOGERROR, "%s - Failed to create right view shader resource.", __FUNCTION__); - } - else - CLog::Log(LOGERROR, "%s - Failed to create right view render target.", __FUNCTION__); - } + D3DRASTER_STATUS rasterStatus; + int64_t prev = CurrentHostCounter(); - if (FAILED(hr)) + while (SUCCEEDED(m_pD3DDevice->GetRasterStatus(0, &rasterStatus))) { - SAFE_RELEASE(m_pShaderResourceViewRight); - SAFE_RELEASE(m_pRenderTargetViewRight); - SAFE_RELEASE(m_pTextureRight); + //wait for the scanline to go over the given proportion of m_screenHeight mark + if (!rasterStatus.InVBlank && rasterStatus.ScanLine >= g_advancedSettings.m_sleepBeforeFlip * m_screenHeight) + break; + + //in theory it's possible this loop never exits, so don't let it run for longer than 100 ms + int64_t now = CurrentHostCounter(); + if ((now - prev) * 10 > m_systemFreq) + break; - CLog::Log(LOGERROR, "%s - Failed to create right eye buffer.", __FUNCTION__); - g_graphicsContext.SetStereoMode(RENDER_STEREO_MODE_OFF); // try fallback to mono + Sleep(1); } - } -} - -bool CRenderSystemDX::CreateStates() -{ - if (!m_pD3DDev) - return false; - - SAFE_RELEASE(m_depthStencilState); - SAFE_RELEASE(m_BlendEnableState); - SAFE_RELEASE(m_BlendDisableState); - - // Initialize the description of the stencil state. - D3D11_DEPTH_STENCIL_DESC depthStencilDesc; - ZeroMemory(&depthStencilDesc, sizeof(D3D11_DEPTH_STENCIL_DESC)); - - // Set up the description of the stencil state. - depthStencilDesc.DepthEnable = false; - depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - depthStencilDesc.DepthFunc = D3D11_COMPARISON_NEVER; - depthStencilDesc.StencilEnable = false; - depthStencilDesc.StencilReadMask = 0xFF; - depthStencilDesc.StencilWriteMask = 0xFF; - - // Stencil operations if pixel is front-facing. - depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR; - depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - - // Stencil operations if pixel is back-facing. - depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR; - depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - - // Create the depth stencil state. - HRESULT hr = m_pD3DDev->CreateDepthStencilState(&depthStencilDesc, &m_depthStencilState); - if(FAILED(hr)) - return false; - - // Set the depth stencil state. - m_pContext->OMSetDepthStencilState(m_depthStencilState, 0); - - D3D11_RASTERIZER_DESC rasterizerState; - rasterizerState.CullMode = D3D11_CULL_NONE; - rasterizerState.FillMode = D3D11_FILL_SOLID;// DEBUG - D3D11_FILL_WIREFRAME - rasterizerState.FrontCounterClockwise = false; - rasterizerState.DepthBias = 0; - rasterizerState.DepthBiasClamp = 0.0f; - rasterizerState.DepthClipEnable = true; - rasterizerState.SlopeScaledDepthBias = 0.0f; - rasterizerState.ScissorEnable = false; - rasterizerState.MultisampleEnable = false; - rasterizerState.AntialiasedLineEnable = false; - - if (FAILED(m_pD3DDev->CreateRasterizerState(&rasterizerState, &m_RSScissorDisable))) - return false; - - rasterizerState.ScissorEnable = true; - if (FAILED(m_pD3DDev->CreateRasterizerState(&rasterizerState, &m_RSScissorEnable))) - return false; - - m_pContext->RSSetState(m_RSScissorDisable); // by default - - D3D11_BLEND_DESC blendState = { 0 }; - ZeroMemory(&blendState, sizeof(D3D11_BLEND_DESC)); - blendState.RenderTarget[0].BlendEnable = true; - blendState.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; // D3D11_BLEND_SRC_ALPHA; - blendState.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; // D3D11_BLEND_INV_SRC_ALPHA; - blendState.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - blendState.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - blendState.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; - blendState.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - blendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - - m_pD3DDev->CreateBlendState(&blendState, &m_BlendEnableState); - - blendState.RenderTarget[0].BlendEnable = false; - m_pD3DDev->CreateBlendState(&blendState, &m_BlendDisableState); - - // by default - m_pContext->OMSetBlendState(m_BlendEnableState, nullptr, 0xFFFFFFFF); - m_BlendEnabled = true; - - return true; -} - -bool CRenderSystemDX::PresentRenderImpl(const CDirtyRegionList &dirty) -{ - HRESULT hr; - if (!m_bRenderCreated) - return false; - - if (m_nDeviceStatus != S_OK) - { - // if DXGI_STATUS_OCCLUDED occurred we just clear command queue and return - if (m_nDeviceStatus == DXGI_STATUS_OCCLUDED) - FinishCommandList(false); - return false; + //restore thread priority + if (priority != THREAD_PRIORITY_ERROR_RETURN) + SetThreadPriority(GetCurrentThread(), priority); } - if ( m_stereoMode == RENDER_STEREO_MODE_INTERLACED - || m_stereoMode == RENDER_STEREO_MODE_CHECKERBOARD) - { - // all views prepared, let's merge them before present - m_pContext->OMSetRenderTargets(1, &m_pRenderTargetView, m_depthStencilView); - CRect destRect = { 0.0f, 0.0f, float(m_nBackBufferWidth), float(m_nBackBufferHeight) }; - SHADER_METHOD method = RENDER_STEREO_MODE_INTERLACED == m_stereoMode - ? SHADER_METHOD_RENDER_STEREO_INTERLACED_RIGHT - : SHADER_METHOD_RENDER_STEREO_CHECKERBOARD_RIGHT; - SetAlphaBlendEnable(true); - CD3DTexture::DrawQuad(destRect, 0, 1, &m_pShaderResourceViewRight, NULL, method); - CD3DHelper::PSClearShaderResources(m_pContext); - } + hr = m_pD3DDevice->Present( NULL, NULL, 0, NULL ); - FinishCommandList(); - - if (m_pSwapChain1) - { - // will use optimized present with dirty regions. - DXGI_PRESENT_PARAMETERS presentParams = {}; - presentParams.DirtyRectsCount = 0; - presentParams.pDirtyRects = NULL; - presentParams.pScrollRect = NULL; - hr = m_pSwapChain1->Present1((m_bVSync ? 1 : 0), 0, &presentParams); - } - else - hr = m_pSwapChain->Present((m_bVSync ? 1 : 0), 0); - - if (DXGI_ERROR_DEVICE_REMOVED == hr) + if( D3DERR_DEVICELOST == hr ) { - CLog::Log(LOGDEBUG, "%s - device removed", __FUNCTION__); + CLog::Log(LOGDEBUG, "%s - lost device", __FUNCTION__); return false; } - if (DXGI_ERROR_INVALID_CALL == hr) - { - SetFullScreenInternal(); - CreateWindowSizeDependentResources(); - hr = S_OK; - } - - if (FAILED(hr)) + if(FAILED(hr)) { CLog::Log(LOGDEBUG, "%s - Present failed. %s", __FUNCTION__, GetErrorDescription(hr).c_str()); return false; } - // after present swapchain unbinds RT view from immediate context, need to restore it because it can be used by something else - if (m_pContext == m_pImdContext) - m_pContext->OMSetRenderTargets(1, &m_pRenderTargetView, m_depthStencilView); - return true; } @@ -1216,58 +627,89 @@ return false; HRESULT oldStatus = m_nDeviceStatus; - if (m_pSwapChain1) + if (m_useD3D9Ex) { - DXGI_PRESENT_PARAMETERS presentParams = {}; - presentParams.DirtyRectsCount = 0; - presentParams.pDirtyRects = NULL; - presentParams.pScrollRect = NULL; - m_nDeviceStatus = m_pSwapChain1->Present1(0, DXGI_PRESENT_TEST, &presentParams); + m_nDeviceStatus = ((IDirect3DDevice9Ex*)m_pD3DDevice)->CheckDeviceState(m_hDeviceWnd); + + // handling of new D3D9 extensions return values. Others fallback to regular D3D9 handling. + switch(m_nDeviceStatus) + { + case S_PRESENT_MODE_CHANGED: + // Timing leads us here on occasion. + BuildPresentParameters(); + m_nDeviceStatus = ((IDirect3DDevice9Ex*)m_pD3DDevice)->ResetEx(&m_D3DPP, m_D3DPP.Windowed ? NULL : &m_D3DDMEX); + break; + case S_PRESENT_OCCLUDED: + m_nDeviceStatus = D3D_OK; + break; + case D3DERR_DEVICEHUNG: + CLog::Log(LOGERROR, "D3DERR_DEVICEHUNG"); + m_nDeviceStatus = D3DERR_DEVICELOST; + m_needNewDevice = true; + break; + case D3DERR_OUTOFVIDEOMEMORY: + CLog::Log(LOGERROR, "D3DERR_OUTOFVIDEOMEMORY"); + m_nDeviceStatus = D3DERR_DEVICELOST; + m_needNewDevice = true; + break; + case D3DERR_DEVICEREMOVED: + CLog::Log(LOGERROR, "D3DERR_DEVICEREMOVED"); + m_nDeviceStatus = D3DERR_DEVICELOST; + m_needNewDevice = true; + // fixme: also needs to re-enumerate and switch to another screen + break; + } } else { - m_nDeviceStatus = m_pSwapChain->Present(0, DXGI_PRESENT_TEST); + m_nDeviceStatus = m_pD3DDevice->TestCooperativeLevel(); } - // handling of return values. - switch (m_nDeviceStatus) + if( FAILED( m_nDeviceStatus ) ) { - case DXGI_ERROR_DEVICE_REMOVED: // GPU has been physically removed from the system, or a driver upgrade occurred. - CLog::Log(LOGERROR, "DXGI_ERROR_DEVICE_REMOVED"); - m_needNewDevice = true; - break; - case DXGI_ERROR_DEVICE_RESET: // This is an run-time issue that should be investigated and fixed. - CLog::Log(LOGERROR, "DXGI_ERROR_DEVICE_RESET"); - m_nDeviceStatus = DXGI_ERROR_DEVICE_REMOVED; - m_needNewDevice = true; - break; - case DXGI_ERROR_INVALID_CALL: // application provided invalid parameter data. Try to return after resize buffers - CLog::Log(LOGERROR, "DXGI_ERROR_INVALID_CALL"); - SetFullScreenInternal(); - CreateWindowSizeDependentResources(); - m_nDeviceStatus = S_OK; - break; - case DXGI_STATUS_OCCLUDED: // decide what we should do when windows content is not visible - // do not spam to log file - if (m_nDeviceStatus != oldStatus) - CLog::Log(LOGDEBUG, "DXGI_STATUS_OCCLUDED"); - // Status OCCLUDED is not an error and not handled by FAILED macro, - // but if it occurs we should not render anything, this status will be accounted on present stage - } - - if (FAILED(m_nDeviceStatus)) - { - if (DXGI_ERROR_DEVICE_REMOVED == m_nDeviceStatus) + // The device has been lost but cannot be reset at this time. + // Therefore, rendering is not possible and we'll have to return + // and try again at a later time. + if( m_nDeviceStatus == D3DERR_DEVICELOST ) { + if (m_nDeviceStatus != oldStatus) + CLog::Log(LOGDEBUG, "D3DERR_DEVICELOST"); OnDeviceLost(); + return false; + } + + // The device has been lost but it can be reset at this time. + if( m_nDeviceStatus == D3DERR_DEVICENOTRESET ) + { OnDeviceReset(); + if( FAILED(m_nDeviceStatus ) ) + { + CLog::Log(LOGINFO, "m_pD3DDevice->Reset failed"); + return false; + } } + } + + HRESULT hr; + + if(FAILED(hr = m_pD3DDevice->BeginScene())) + { + CLog::Log(LOGERROR, "m_pD3DDevice->BeginScene() failed. %s", CRenderSystemDX::GetErrorDescription(hr).c_str()); + // When XBMC caught an exception after BeginScene(), EndScene() may never been called + // and thus all following BeginScene() will fail too. + if(FAILED(hr = m_pD3DDevice->EndScene())) + CLog::Log(LOGERROR, "m_pD3DDevice->EndScene() failed. %s", CRenderSystemDX::GetErrorDescription(hr).c_str()); return false; } - m_pContext->OMSetRenderTargets(1, &m_pRenderTargetView, m_depthStencilView); - m_inScene = true; + IDirect3DSurface9 *pBackBuffer; + if(m_pD3DDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer) != D3D_OK) + return false; + + m_pD3DDevice->SetRenderTarget(0, pBackBuffer); + pBackBuffer->Release(); + m_inScene = true; return true; } @@ -1277,70 +719,42 @@ if (!m_bRenderCreated) return false; - + if(m_nDeviceStatus != S_OK) return false; + HRESULT hr = m_pD3DDevice->EndScene(); + if(FAILED(hr)) + { + CLog::Log(LOGERROR, "m_pD3DDevice->EndScene() failed. %s", CRenderSystemDX::GetErrorDescription(hr).c_str()); + return false; + } + return true; } bool CRenderSystemDX::ClearBuffers(color_t color) { - if (!m_bRenderCreated || m_resizeInProgress) + if (!m_bRenderCreated) return false; - float fColor[4]; - CD3DHelper::XMStoreColor(fColor, color); - ID3D11RenderTargetView* pRTView = m_pRenderTargetView; - - if ( m_stereoMode != RENDER_STEREO_MODE_OFF - && m_stereoMode != RENDER_STEREO_MODE_MONO) + if(m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_RED_CYAN + || m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_GREEN_MAGENTA + || m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE) { - // if stereo anaglyph/tab/sbs, data was cleared when left view was rendererd - if (m_stereoView == RENDER_STEREO_VIEW_RIGHT) - { - // execute command's queue - FinishCommandList(); - - // do not clear RT for anaglyph modes - if ( m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_GREEN_MAGENTA - || m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_RED_CYAN - || m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE) - { - pRTView = nullptr; - } - // for interlaced/checkerboard/hw clear right view - else if (m_pRenderTargetViewRight) - pRTView = m_pRenderTargetViewRight; - - // for hw stereo clear depth view also - if (m_stereoMode == RENDER_STEREO_MODE_HARDWAREBASED) - m_pContext->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0, 0); - } + // if stereo anaglyph, data was cleared when left view was rendererd + if(m_stereoView == RENDER_STEREO_VIEW_RIGHT) + return true; } - - if (pRTView == nullptr) - return true; - CRect clRect(0, 0, m_nBackBufferWidth, m_nBackBufferHeight); + return SUCCEEDED(m_pD3DDevice->Clear( + 0, + NULL, + D3DCLEAR_TARGET, + color, + 1.0, + 0 ) ); - // Unlike Direct3D 9, D3D11 ClearRenderTargetView always clears full extent of the resource view. - // Viewport and scissor settings are not applied. So clear RT by drawing full sized rect with clear color - if (m_ScissorsEnabled && m_scissor != clRect) - { - bool alphaEnabled = m_BlendEnabled; - if (alphaEnabled) - SetAlphaBlendEnable(false); - - CGUITextureD3D::DrawQuad(clRect, color); - - if (alphaEnabled) - SetAlphaBlendEnable(true); - } - else - m_pContext->ClearRenderTargetView(pRTView, fColor); - - m_pContext->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0, 0); return true; } @@ -1351,7 +765,7 @@ bool CRenderSystemDX::PresentRender(const CDirtyRegionList &dirty) { - if (!m_bRenderCreated || m_resizeInProgress) + if (!m_bRenderCreated) return false; bool result = PresentRenderImpl(dirty); @@ -1361,13 +775,25 @@ void CRenderSystemDX::SetVSync(bool enable) { - m_bVSync = enable; + if (m_bVSync != enable) + { + bool inScene(m_inScene); + if (m_inScene) + EndRender(); + m_bVSync = enable; + ResetRenderSystem(m_nBackBufferWidth, m_nBackBufferHeight, m_bFullScreenDevice, m_refreshRate); + if (inScene) + BeginRender(); + } } void CRenderSystemDX::CaptureStateBlock() { if (!m_bRenderCreated) return; + + SAFE_RELEASE(m_stateBlock); + m_pD3DDevice->CreateStateBlock(D3DSBT_ALL, &m_stateBlock); } void CRenderSystemDX::ApplyStateBlock() @@ -1375,15 +801,11 @@ if (!m_bRenderCreated) return; - m_pContext->RSSetState(m_ScissorsEnabled ? m_RSScissorEnable : m_RSScissorDisable); - m_pContext->OMSetDepthStencilState(m_depthStencilState, 0); - float factors[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - m_pContext->OMSetBlendState(m_BlendEnabled ? m_BlendEnableState : m_BlendDisableState, factors, 0xFFFFFFFF); - - m_pGUIShader->ApplyStateBlock(); + if (m_stateBlock) + m_stateBlock->Apply(); } -void CRenderSystemDX::SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight, float stereoFactor) +void CRenderSystemDX::SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight) { if (!m_bRenderCreated) return; @@ -1392,34 +814,45 @@ float w = m_viewPort.Width*0.5f; float h = m_viewPort.Height*0.5f; - XMFLOAT2 offset = XMFLOAT2(camera.x - screenWidth*0.5f, camera.y - screenHeight*0.5f); + CPoint offset = camera - CPoint(screenWidth*0.5f, screenHeight*0.5f); - // world view. Until this is moved onto the GPU (via a vertex shader for instance), we set it to the identity here. - m_pGUIShader->SetWorld(XMMatrixIdentity()); + // world view. Until this is moved onto the GPU (via a vertex shader for instance), we set it to the identity + // here. + D3DXMATRIX mtxWorld; + D3DXMatrixIdentity(&mtxWorld); + m_pD3DDevice->SetTransform(D3DTS_WORLD, &mtxWorld); - // Initialize the view matrix // camera view. Multiply the Y coord by -1 then translate so that everything is relative to the camera // position. - XMMATRIX flipY, translate; - flipY = XMMatrixScaling(1.0, -1.0f, 1.0f); - translate = XMMatrixTranslation(-(w + offset.x - stereoFactor), -(h + offset.y), 2 * h); - m_pGUIShader->SetView(XMMatrixMultiply(translate, flipY)); + D3DXMATRIX flipY, translate, mtxView; + D3DXMatrixScaling(&flipY, 1.0f, -1.0f, 1.0f); + D3DXMatrixTranslation(&translate, -(w + offset.x), -(h + offset.y), 2*h); + D3DXMatrixMultiply(&mtxView, &translate, &flipY); + m_pD3DDevice->SetTransform(D3DTS_VIEW, &mtxView); // projection onto screen space - m_pGUIShader->SetProjection(XMMatrixPerspectiveOffCenterLH((-w - offset.x)*0.5f, (w - offset.x)*0.5f, (-h + offset.y)*0.5f, (h + offset.y)*0.5f, h, 100 * h)); + D3DXMATRIX mtxProjection; + D3DXMatrixPerspectiveOffCenterLH(&mtxProjection, (-w - offset.x)*0.5f, (w - offset.x)*0.5f, (-h + offset.y)*0.5f, (h + offset.y)*0.5f, h, 100*h); + m_pD3DDevice->SetTransform(D3DTS_PROJECTION, &mtxProjection); + + m_world = mtxWorld; + m_view = mtxView; + m_projection = mtxProjection; } void CRenderSystemDX::Project(float &x, float &y, float &z) { - if (!m_bRenderCreated) - return; + D3DXVECTOR3 vScreenCoord; + D3DXVECTOR3 vLocation(x, y, z); - m_pGUIShader->Project(x, y, z); + D3DXVec3Project(&vScreenCoord, &vLocation, &m_viewPort, &m_projection, &m_view, &m_world); + x = vScreenCoord.x; + y = vScreenCoord.y; + z = 0; } bool CRenderSystemDX::TestRender() { - /* static unsigned int lastTime = 0; static float delta = 0; @@ -1463,7 +896,7 @@ 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pVB, NULL ) ) ) { - return false; + return false;; } // Now we fill the vertex buffer. To do this, we need to Lock() the VB to @@ -1480,7 +913,7 @@ m_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); pVB->Release(); - */ + return true; } @@ -1501,10 +934,10 @@ if (!m_bRenderCreated) return; - viewPort.x1 = m_viewPort.TopLeftX; - viewPort.y1 = m_viewPort.TopLeftY; - viewPort.x2 = m_viewPort.TopLeftX + m_viewPort.Width; - viewPort.y2 = m_viewPort.TopLeftY + m_viewPort.Height; + viewPort.x1 = (float)m_viewPort.X; + viewPort.y1 = (float)m_viewPort.Y; + viewPort.x2 = (float)m_viewPort.X + m_viewPort.Width; + viewPort.y2 = (float)m_viewPort.Y + m_viewPort.Height; } void CRenderSystemDX::SetViewPort(CRect& viewPort) @@ -1512,15 +945,13 @@ if (!m_bRenderCreated) return; - m_viewPort.MinDepth = 0.0f; - m_viewPort.MaxDepth = 1.0f; - m_viewPort.TopLeftX = viewPort.x1; - m_viewPort.TopLeftY = viewPort.y1; - m_viewPort.Width = viewPort.x2 - viewPort.x1; - m_viewPort.Height = viewPort.y2 - viewPort.y1; - - m_pContext->RSSetViewports(1, &m_viewPort); - m_pGUIShader->SetViewPort(m_viewPort); + m_viewPort.MinZ = 0.0f; + m_viewPort.MaxZ = 1.0f; + m_viewPort.X = (DWORD)viewPort.x1; + m_viewPort.Y = (DWORD)viewPort.y1; + m_viewPort.Width = (DWORD)(viewPort.x2 - viewPort.x1); + m_viewPort.Height = (DWORD)(viewPort.y2 - viewPort.y1); + m_pD3DDevice->SetViewport(&m_viewPort); } void CRenderSystemDX::RestoreViewPort() @@ -1528,32 +959,7 @@ if (!m_bRenderCreated) return; - m_pContext->RSSetViewports(1, &m_viewPort); - m_pGUIShader->SetViewPort(m_viewPort); -} - -bool CRenderSystemDX::ScissorsCanEffectClipping() -{ - if (!m_bRenderCreated) - return false; - - return m_pGUIShader != NULL && m_pGUIShader->HardwareClipIsPossible(); -} - -CRect CRenderSystemDX::ClipRectToScissorRect(const CRect &rect) -{ - if (!m_bRenderCreated) - return CRect(); - - float xFactor = m_pGUIShader->GetClipXFactor(); - float xOffset = m_pGUIShader->GetClipXOffset(); - float yFactor = m_pGUIShader->GetClipYFactor(); - float yOffset = m_pGUIShader->GetClipYOffset(); - - return CRect(rect.x1 * xFactor + xOffset, - rect.y1 * yFactor + yOffset, - rect.x2 * xFactor + xOffset, - rect.y2 * yFactor + yOffset); + m_pD3DDevice->SetViewport(&m_viewPort); } void CRenderSystemDX::SetScissors(const CRect& rect) @@ -1561,15 +967,13 @@ if (!m_bRenderCreated) return; - m_scissor = rect; - CD3D11_RECT scissor(MathUtils::round_int(rect.x1) - , MathUtils::round_int(rect.y1) - , MathUtils::round_int(rect.x2) - , MathUtils::round_int(rect.y2)); - - m_pContext->RSSetScissorRects(1, &scissor); - m_pContext->RSSetState(m_RSScissorEnable); - m_ScissorsEnabled = true; + RECT scissor; + scissor.left = MathUtils::round_int(rect.x1); + scissor.top = MathUtils::round_int(rect.y1); + scissor.right = MathUtils::round_int(rect.x2); + scissor.bottom = MathUtils::round_int(rect.y2); + m_pD3DDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); + m_pD3DDevice->SetScissorRect(&scissor); } void CRenderSystemDX::ResetScissors() @@ -1577,10 +981,13 @@ if (!m_bRenderCreated) return; - m_scissor.SetRect(0, 0, m_nBackBufferWidth, m_nBackBufferHeight); - - m_pContext->RSSetState(m_RSScissorDisable); - m_ScissorsEnabled = false; + RECT scissor; + scissor.left = 0; + scissor.top = 0; + scissor.right = m_nBackBufferWidth; + scissor.bottom = m_nBackBufferHeight; + m_pD3DDevice->SetScissorRect(&scissor); + m_pD3DDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); } void CRenderSystemDX::Register(ID3DResource *resource) @@ -1592,99 +999,52 @@ void CRenderSystemDX::Unregister(ID3DResource* resource) { CSingleLock lock(m_resourceSection); - std::vector::iterator i = find(m_resources.begin(), m_resources.end(), resource); + vector::iterator i = find(m_resources.begin(), m_resources.end(), resource); if (i != m_resources.end()) m_resources.erase(i); } std::string CRenderSystemDX::GetErrorDescription(HRESULT hr) { - WCHAR buff[1024]; - DXGetErrorDescription(hr, buff, 1024); - std::wstring error(DXGetErrorString(hr)); - std::wstring descr(buff); - return StringUtils::Format("%X - %ls (%ls)", hr, error.c_str(), descr.c_str()); + return StringUtils::Format("%X - %s (%s)", hr, DXGetErrorString(hr), DXGetErrorDescription(hr)); } void CRenderSystemDX::SetStereoMode(RENDER_STEREO_MODE mode, RENDER_STEREO_VIEW view) { CRenderSystemBase::SetStereoMode(mode, view); - if (!m_bRenderCreated) - return; - - UINT writeMask = D3D11_COLOR_WRITE_ENABLE_ALL; + m_pD3DDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN); if(m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_RED_CYAN) { if(m_stereoView == RENDER_STEREO_VIEW_LEFT) - writeMask = D3D11_COLOR_WRITE_ENABLE_RED; + m_pD3DDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED ); else if(m_stereoView == RENDER_STEREO_VIEW_RIGHT) - writeMask = D3D11_COLOR_WRITE_ENABLE_BLUE | D3D11_COLOR_WRITE_ENABLE_GREEN; + m_pD3DDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN ); } if(m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_GREEN_MAGENTA) { if(m_stereoView == RENDER_STEREO_VIEW_LEFT) - writeMask = D3D11_COLOR_WRITE_ENABLE_GREEN; + m_pD3DDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_GREEN ); else if(m_stereoView == RENDER_STEREO_VIEW_RIGHT) - writeMask = D3D11_COLOR_WRITE_ENABLE_BLUE | D3D11_COLOR_WRITE_ENABLE_RED; + m_pD3DDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_RED ); } - if (m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE) + if(m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE) { - if (m_stereoView == RENDER_STEREO_VIEW_LEFT) - writeMask = D3D11_COLOR_WRITE_ENABLE_RED | D3D11_COLOR_WRITE_ENABLE_GREEN; - else if (m_stereoView == RENDER_STEREO_VIEW_RIGHT) - writeMask = D3D11_COLOR_WRITE_ENABLE_BLUE; - } - if ( RENDER_STEREO_MODE_INTERLACED == m_stereoMode - || RENDER_STEREO_MODE_CHECKERBOARD == m_stereoMode - || RENDER_STEREO_MODE_HARDWAREBASED == m_stereoMode) - { - if (m_stereoView == RENDER_STEREO_VIEW_RIGHT) - { - // render right eye view to right render target - m_pContext->OMSetRenderTargets(1, &m_pRenderTargetViewRight, m_depthStencilView); - } - } - - D3D11_BLEND_DESC desc; - m_BlendEnableState->GetDesc(&desc); - // update blend state - if (desc.RenderTarget[0].RenderTargetWriteMask != writeMask) - { - SAFE_RELEASE(m_BlendDisableState); - SAFE_RELEASE(m_BlendEnableState); - - desc.RenderTarget[0].RenderTargetWriteMask = writeMask; - m_pD3DDev->CreateBlendState(&desc, &m_BlendEnableState); - - desc.RenderTarget[0].BlendEnable = false; - m_pD3DDev->CreateBlendState(&desc, &m_BlendDisableState); - - float blendFactors[] = { 0.0f, 0.0f, 0.0f, 0.0f }; - m_pContext->OMSetBlendState(m_BlendEnabled ? m_BlendEnableState : m_BlendDisableState, blendFactors, 0xFFFFFFFF); + if(m_stereoView == RENDER_STEREO_VIEW_LEFT) + m_pD3DDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN); + else if(m_stereoView == RENDER_STEREO_VIEW_RIGHT) + m_pD3DDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE); } } bool CRenderSystemDX::SupportsStereo(RENDER_STEREO_MODE mode) const { - bool isHWStereoSupport = false; - IDXGIFactory2* dxgiFactory2 = NULL; - if (SUCCEEDED(m_dxgiFactory->QueryInterface(__uuidof(IDXGIFactory2), reinterpret_cast(&dxgiFactory2)))) - { - isHWStereoSupport = dxgiFactory2 && dxgiFactory2->IsWindowedStereoEnabled(); - } - SAFE_RELEASE(dxgiFactory2); - - switch (mode) + switch(mode) { case RENDER_STEREO_MODE_ANAGLYPH_RED_CYAN: case RENDER_STEREO_MODE_ANAGLYPH_GREEN_MAGENTA: case RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE: - case RENDER_STEREO_MODE_INTERLACED: - case RENDER_STEREO_MODE_CHECKERBOARD: return true; - case RENDER_STEREO_MODE_HARDWAREBASED: - return isHWStereoSupport; default: return CRenderSystemBase::SupportsStereo(mode); } @@ -1692,69 +1052,14 @@ void CRenderSystemDX::FlushGPU() { - if (!m_bRenderCreated) - return; + IDirect3DQuery9* pEvent = NULL; - FinishCommandList(); - m_pImdContext->Flush(); -} - -bool CRenderSystemDX::InitGUIShader() -{ - if (!m_pD3DDev) - return false; - - SAFE_DELETE(m_pGUIShader); - m_pGUIShader = new CGUIShaderDX(); - if (!m_pGUIShader->Initialize()) + m_pD3DDevice->CreateQuery(D3DQUERYTYPE_EVENT, &pEvent); + if (pEvent != NULL) { - CLog::Log(LOGERROR, __FUNCTION__ " - Failed to initialize GUI shader."); - return false; - } - - m_pGUIShader->ApplyStateBlock(); - - return true; -} - -void CRenderSystemDX::SetAlphaBlendEnable(bool enable) -{ - if (!m_bRenderCreated) - return; - - float blendFactors[] = { 0.0f, 0.0f, 0.0f, 0.0f }; - m_pContext->OMSetBlendState(enable ? m_BlendEnableState : m_BlendDisableState, 0, 0xFFFFFFFF); - m_BlendEnabled = enable; -} - -void CRenderSystemDX::FinishCommandList(bool bExecute /*= true*/) -{ - if (m_pImdContext == m_pContext) - return; - - ID3D11CommandList* pCommandList = NULL; - if (FAILED(m_pContext->FinishCommandList(true, &pCommandList))) - { - CLog::Log(LOGERROR, "%s - Failed to finish command queue.", __FUNCTION__); - return; - } - - if (bExecute) - m_pImdContext->ExecuteCommandList(pCommandList, false); - - SAFE_RELEASE(pCommandList); -} - -void CRenderSystemDX::SetMaximumFrameLatency(uint32_t latency) -{ - if (!m_pD3DDev) - return; - - IDXGIDevice1* pDXGIDevice = nullptr; - if (SUCCEEDED(m_pD3DDev->QueryInterface(__uuidof(IDXGIDevice1), reinterpret_cast(&pDXGIDevice)))) - { - pDXGIDevice->SetMaximumFrameLatency(latency); - SAFE_RELEASE(pDXGIDevice); + pEvent->Issue(D3DISSUE_END); + while (S_FALSE == pEvent->GetData(NULL, 0, D3DGETDATA_FLUSH)) + Sleep(1); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/rendering/dx/RenderSystemDX.h kodi-15.2~git20151019.1039-final/xbmc/rendering/dx/RenderSystemDX.h --- kodi-16.1~git20160425.1001-final/xbmc/rendering/dx/RenderSystemDX.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/rendering/dx/RenderSystemDX.h 2015-10-19 08:39:16.000000000 +0000 @@ -27,7 +27,6 @@ #include #include "rendering/RenderSystem.h" -#include "guilib/GUIShaderDX.h" #include "threads/CriticalSection.h" enum PCI_Vendors @@ -55,7 +54,8 @@ virtual bool PresentRender(const CDirtyRegionList &dirty); virtual bool ClearBuffers(color_t color); virtual bool IsExtSupported(const char* extension); - virtual bool IsFormatSupport(DXGI_FORMAT format, unsigned int usage); + virtual bool IsSurfaceFormatOk(D3DFORMAT surfFormat, DWORD usage); + virtual bool IsTextureFormatOk(D3DFORMAT texFormat, DWORD usage); virtual void SetVSync(bool vsync); @@ -63,15 +63,13 @@ virtual void GetViewPort(CRect& viewPort); virtual void RestoreViewPort(); - virtual CRect ClipRectToScissorRect(const CRect &rect); - virtual bool ScissorsCanEffectClipping(); virtual void SetScissors(const CRect &rect); virtual void ResetScissors(); virtual void CaptureStateBlock(); virtual void ApplyStateBlock(); - virtual void SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight, float stereoFactor = 0.f); + virtual void SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight); virtual void ApplyHardwareTransform(const TransformMatrix &matrix); virtual void RestoreHardwareTransform(); @@ -79,25 +77,18 @@ virtual bool SupportsStereo(RENDER_STEREO_MODE mode) const; virtual bool TestRender(); - void GetDisplayMode(DXGI_MODE_DESC *mode, bool useCached = false); - IDXGIOutput* GetCurrentOutput(void) { return m_pOutput; } - virtual void Project(float &x, float &y, float &z); - virtual CRect GetBackBufferRect() { return CRect(0.f, 0.f, static_cast(m_nBackBufferWidth), static_cast(m_nBackBufferHeight)); } - void FinishCommandList(bool bExecute = true); void FlushGPU(); - ID3D11Device* Get3D11Device() { return m_pD3DDev; } - ID3D11DeviceContext* Get3D11Context() { return m_pContext; } - ID3D11DeviceContext* GetImmediateContext(){ return m_pImdContext; } - CGUIShaderDX* GetGUIShader() { return m_pGUIShader; } - unsigned GetFeatureLevel() { return m_featureLevel; } - D3D11_USAGE DefaultD3DUsage() { return m_defaultD3DUsage; } - DXGI_ADAPTER_DESC GetAIdentifier() { return m_adapterDesc; } - bool Interlaced() { return m_interlaced; } - int GetBackbufferCount() const { return 2; } - void SetAlphaBlendEnable(bool enable); + LPDIRECT3DDEVICE9 Get3DDevice() { return m_pD3DDevice; } + int GetBackbufferCount() const { return m_D3DPP.BackBufferCount; } + + bool UseD3D9Ex() { return m_useD3D9Ex; } + DWORD DefaultD3DUsage() { return m_defaultD3DUsage; } + D3DPOOL DefaultD3DPool() { return m_defaultD3DPool; } + D3DADAPTER_IDENTIFIER9 GetAIdentifier() { return m_AIdentifier; } + bool Interlaced() { return m_interlaced; } /*! \brief Register as a dependent of the DirectX Render System @@ -130,24 +121,22 @@ void SetDeviceWnd(HWND wnd) { m_hDeviceWnd = wnd; } void SetMonitor(HMONITOR monitor); void SetRenderParams(unsigned int width, unsigned int height, bool fullScreen, float refreshRate); - bool CreateWindowSizeDependentResources(); - bool CreateStates(); - bool InitGUIShader(); + void BuildPresentParameters(); + virtual void UpdateMonitor() {}; + BOOL IsDepthFormatOk(D3DFORMAT DepthFormat, D3DFORMAT RenderTargetFormat); void OnMove(); - void OnResize(unsigned int width, unsigned int height); - void SetFullScreenInternal(); - void GetClosestDisplayModeToCurrent(IDXGIOutput* output, DXGI_MODE_DESC* outCurrentDisplayMode, bool useCached = false); - void CheckInterlasedStereoView(void); - void SetMaximumFrameLatency(uint32_t latency); - virtual void UpdateMonitor() {}; + LPDIRECT3D9 m_pD3D; // our adapter could change as we go bool m_needNewDevice; - bool m_needNewViews; - bool m_resizeInProgress; + unsigned int m_adapter; + LPDIRECT3DDEVICE9 m_pD3DDevice; unsigned int m_screenHeight; + D3DDEVTYPE m_devType; + D3DPRESENT_PARAMETERS m_D3DPP; + D3DDISPLAYMODEEX m_D3DDMEX; HWND m_hFocusWnd; HWND m_hDeviceWnd; unsigned int m_nBackBufferWidth; @@ -156,53 +145,23 @@ float m_refreshRate; bool m_interlaced; HRESULT m_nDeviceStatus; + IDirect3DStateBlock9* m_stateBlock; int64_t m_systemFreq; - D3D11_USAGE m_defaultD3DUsage; + bool m_useD3D9Ex; + DWORD m_defaultD3DUsage; + D3DPOOL m_defaultD3DPool; bool m_useWindowedDX; + D3DADAPTER_IDENTIFIER9 m_AIdentifier; CCriticalSection m_resourceSection; std::vector m_resources; bool m_inScene; ///< True if we're in a BeginScene()/EndScene() block - D3D_DRIVER_TYPE m_driverType; - D3D_FEATURE_LEVEL m_featureLevel; - IDXGIFactory1* m_dxgiFactory; - ID3D11Device* m_pD3DDev; - IDXGIAdapter1* m_adapter; - IDXGIOutput* m_pOutput; - ID3D11DeviceContext* m_pContext; - ID3D11DeviceContext* m_pImdContext; - - IDXGISwapChain* m_pSwapChain; - IDXGISwapChain1* m_pSwapChain1; - ID3D11RenderTargetView* m_pRenderTargetView; - ID3D11DepthStencilState* m_depthStencilState; - ID3D11DepthStencilView* m_depthStencilView; - D3D11_VIEWPORT m_viewPort; - CRect m_scissor; - - CGUIShaderDX* m_pGUIShader; - ID3D11BlendState* m_BlendEnableState; - ID3D11BlendState* m_BlendDisableState; - bool m_BlendEnabled; - ID3D11RasterizerState* m_RSScissorDisable; - ID3D11RasterizerState* m_RSScissorEnable; - bool m_ScissorsEnabled; - DXGI_ADAPTER_DESC m_adapterDesc; - - // stereo interlaced/checkerboard intermediate target - ID3D11Texture2D* m_pTextureRight; - ID3D11RenderTargetView* m_pRenderTargetViewRight; - ID3D11ShaderResourceView* m_pShaderResourceViewRight; - bool m_bResizeRequred; - bool m_bHWStereoEnabled; - - // improve get current mode - DXGI_MODE_DESC m_cachedMode; -#ifdef _DEBUG - ID3D11Debug* m_d3dDebug = NULL; -#endif + D3DVIEWPORT9 m_viewPort; + D3DXMATRIX m_projection; + D3DXMATRIX m_view; + D3DXMATRIX m_world; }; #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/rendering/gl/RenderSystemGL.cpp kodi-15.2~git20151019.1039-final/xbmc/rendering/gl/RenderSystemGL.cpp --- kodi-16.1~git20160425.1001-final/xbmc/rendering/gl/RenderSystemGL.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/rendering/gl/RenderSystemGL.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -147,15 +147,8 @@ } // Get our driver vendor and renderer - const char* tmpVendor = (const char*) glGetString(GL_VENDOR); - m_RenderVendor.clear(); - if (tmpVendor != NULL) - m_RenderVendor = tmpVendor; - - const char* tmpRenderer = (const char*) glGetString(GL_RENDERER); - m_RenderRenderer.clear(); - if (tmpRenderer != NULL) - m_RenderRenderer = tmpRenderer; + m_RenderVendor = (const char*) glGetString(GL_VENDOR); + m_RenderRenderer = (const char*) glGetString(GL_RENDERER); // grab our capabilities if (glewIsSupported("GL_EXT_texture_compression_s3tc")) @@ -171,11 +164,7 @@ CheckOpenGLQuirks(); m_RenderExtensions = " "; - - const char *tmpExtensions = (const char*) glGetString(GL_EXTENSIONS); - if (tmpExtensions != NULL) - m_RenderExtensions += tmpExtensions; - + m_RenderExtensions += (const char*) glGetString(GL_EXTENSIONS); m_RenderExtensions += " "; LogGraphicsInfo(); @@ -302,7 +291,7 @@ name += extension; name += " "; - return m_RenderExtensions.find(name) != std::string::npos; + return m_RenderExtensions.find(name) != std::string::npos;; } bool CRenderSystemGL::PresentRender(const CDirtyRegionList& dirty) @@ -437,7 +426,7 @@ glEnable(GL_SCISSOR_TEST); } -void CRenderSystemGL::SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight, float stereoFactor) +void CRenderSystemGL::SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight) { if (!m_bRenderCreated) return; @@ -451,7 +440,7 @@ float h = (float)m_viewPort[3]*0.5f; glMatrixModview->LoadIdentity(); - glMatrixModview->Translatef(-(w + offset.x - stereoFactor), +(h + offset.y), 0); + glMatrixModview->Translatef(-(w + offset.x), +(h + offset.y), 0); glMatrixModview->LookAt(0.0, 0.0, -2.0*h, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0); glMatrixModview.Load(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/rendering/gl/RenderSystemGL.h kodi-15.2~git20151019.1039-final/xbmc/rendering/gl/RenderSystemGL.h --- kodi-16.1~git20160425.1001-final/xbmc/rendering/gl/RenderSystemGL.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/rendering/gl/RenderSystemGL.h 2015-10-19 08:39:16.000000000 +0000 @@ -57,7 +57,7 @@ virtual void CaptureStateBlock(); virtual void ApplyStateBlock(); - virtual void SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight, float stereoFactor = 0.0f); + virtual void SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight); virtual void ApplyHardwareTransform(const TransformMatrix &matrix); virtual void RestoreHardwareTransform(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/rendering/gles/RenderSystemGLES.cpp kodi-15.2~git20151019.1039-final/xbmc/rendering/gles/RenderSystemGLES.cpp --- kodi-16.1~git20160425.1001-final/xbmc/rendering/gles/RenderSystemGLES.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/rendering/gles/RenderSystemGLES.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -88,24 +88,11 @@ } // Get our driver vendor and renderer - const char *tmpVendor = (const char*) glGetString(GL_VENDOR); - m_RenderVendor.clear(); - if (tmpVendor != NULL) - m_RenderVendor = tmpVendor; - - const char *tmpRenderer = (const char*) glGetString(GL_RENDERER); - m_RenderRenderer.clear(); - if (tmpRenderer != NULL) - m_RenderRenderer = tmpRenderer; + m_RenderVendor = (const char*) glGetString(GL_VENDOR); + m_RenderRenderer = (const char*) glGetString(GL_RENDERER); m_RenderExtensions = " "; - - const char *tmpExtensions = (const char*) glGetString(GL_EXTENSIONS); - if (tmpExtensions != NULL) - { - m_RenderExtensions += tmpExtensions; - } - + m_RenderExtensions += (const char*) glGetString(GL_EXTENSIONS); m_RenderExtensions += " "; LogGraphicsInfo(); @@ -401,7 +388,7 @@ glClear(GL_DEPTH_BUFFER_BIT); } -void CRenderSystemGLES::SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight, float stereoFactor) +void CRenderSystemGLES::SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight) { if (!m_bRenderCreated) return; @@ -414,7 +401,7 @@ float h = (float)m_viewPort[3]*0.5f; glMatrixModview->LoadIdentity(); - glMatrixModview->Translatef(-(w + offset.x - stereoFactor), +(h + offset.y), 0); + glMatrixModview->Translatef(-(w + offset.x), +(h + offset.y), 0); glMatrixModview->LookAt(0.0, 0.0, -2.0*h, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0); glMatrixModview.Load(); @@ -440,7 +427,7 @@ { static float theta = 0.0; - //RESOLUTION_INFO resInfo = CDisplaySettings::GetInstance().GetCurrentResolutionInfo(); + //RESOLUTION_INFO resInfo = CDisplaySettings::Get().GetCurrentResolutionInfo(); //glViewport(0, 0, resInfo.iWidth, resInfo.iHeight); glMatrixModview.Push(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/rendering/gles/RenderSystemGLES.h kodi-15.2~git20151019.1039-final/xbmc/rendering/gles/RenderSystemGLES.h --- kodi-16.1~git20160425.1001-final/xbmc/rendering/gles/RenderSystemGLES.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/rendering/gles/RenderSystemGLES.h 2015-10-19 08:39:16.000000000 +0000 @@ -73,7 +73,7 @@ virtual void CaptureStateBlock(); virtual void ApplyStateBlock(); - virtual void SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight, float stereoFactor = 0.0f); + virtual void SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight); virtual void ApplyHardwareTransform(const TransformMatrix &matrix); virtual void RestoreHardwareTransform(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/rendering/RenderSystem.h kodi-15.2~git20151019.1039-final/xbmc/rendering/RenderSystem.h --- kodi-16.1~git20160425.1001-final/xbmc/rendering/RenderSystem.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/rendering/RenderSystem.h 2015-10-19 08:39:16.000000000 +0000 @@ -76,7 +76,6 @@ RENDER_STEREO_MODE_ANAGLYPH_GREEN_MAGENTA, RENDER_STEREO_MODE_ANAGLYPH_YELLOW_BLUE, RENDER_STEREO_MODE_INTERLACED, - RENDER_STEREO_MODE_CHECKERBOARD, RENDER_STEREO_MODE_HARDWAREBASED, RENDER_STEREO_MODE_MONO, RENDER_STEREO_MODE_COUNT, @@ -121,7 +120,7 @@ virtual void CaptureStateBlock() = 0; virtual void ApplyStateBlock() = 0; - virtual void SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight, float stereoFactor = 0.f) = 0; + virtual void SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight) = 0; virtual void ApplyHardwareTransform(const TransformMatrix &matrix) = 0; virtual void RestoreHardwareTransform() = 0; virtual void SetStereoMode(RENDER_STEREO_MODE mode, RENDER_STEREO_VIEW view) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/acinclude.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/acinclude.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/acinclude.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/acinclude.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,783 @@ +AC_DEFUN([_MAC_SAVE], [ + for mac_i in [$1]; do + eval "mac_save_$mac_i=\$$mac_i" + done +$2 + for mac_i in $1; do + eval "$mac_i=\$mac_save_$mac_i" + done +]) + +dnl Based on AC_CXX_BOOL ver 1.2 by Todd Veldhuizen and Luc Maisonobe +AC_DEFUN([MAC_CXX_BOOL], [ + AC_CACHE_CHECK( + [whether the compiler recognizes bool as a built-in type], + mac_cv_cxx_bool, [ + AC_LANG_PUSH(C++)dnl + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +int f(int x){return 1;} +int f(char x){return 1;} +int f(bool x){return 1;} + ], [ +bool b = true; return f(b); + ])], [mac_cv_cxx_bool=yes], [mac_cv_cxx_bool=no]) + AC_LANG_POP(C++)dnl + ] + ) + HAVE_CXX_BOOL=$mac_cv_cxx_bool + if test "$HAVE_CXX_BOOL" = yes; then + AC_DEFINE(HAVE_CXX_BOOL, 1, [Define to 1 if bool is a built-in type.])dnl + fi +]) + +dnl Based on AC_CXX_NEW_FOR_SCOPING ver 1.2 by Todd Veldhuizen and Luc Maisonobe +AC_DEFUN([MAC_CXX_NEW_FOR_SCOPING], [ + AC_CACHE_CHECK([whether the compiler accepts the new for scoping rules], + mac_cv_cxx_new_for_scoping, [ + AC_LANG_PUSH(C++)dnl + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ +int z = 0; +for (int i = 0; i < 10; ++i) + z = z + i; +for (int i = 0; i < 10; ++i) + z = z - i; +return z; + ])], [mac_cv_cxx_new_for_scoping=yes], [mac_cv_cxx_new_for_scoping=no]) + AC_LANG_POP(C++)dnl + ] + ) + HAVE_CXX_NEW_FOR_SCOPING=$mac_cv_cxx_new_for_scoping + if test "$HAVE_CXX_NEW_FOR_SCOPING" = yes; then + AC_DEFINE(HAVE_CXX_NEW_FOR_SCOPING, 1, + [Define to 1 if the compiler accepts the new for scoping rules.])dnl + fi +]) + +dnl Based on AC_CXX_NAMESPACES ver 1.2 by Todd Veldhuizen and Luc Maisonobe +AC_DEFUN([MAC_CXX_NAMESPACES], [ + AC_CACHE_CHECK([whether the compiler implements namespaces], + mac_cv_cxx_namespaces, [ + AC_LANG_PUSH(C++)dnl + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +namespace Outer { namespace Inner { int i = 0; }} + ], [ +using namespace Outer::Inner; return i; + ])], [mac_cv_cxx_namespaces=yes], [mac_cv_cxx_namespaces=no]) + AC_LANG_POP(C++)dnl + ] + ) + HAVE_CXX_NAMESPACES=$mac_cv_cxx_namespaces + if test "$HAVE_CXX_NAMESPACES" = yes; then + AC_DEFINE(HAVE_CXX_NAMESPACES, 1, + [Define to 1 if the compiler implements namespaces.])dnl + fi +]) + +dnl Based on AC_CXX_HAVE_STD ver 1.2 by Todd Veldhuizen and Luc Maisonobe +AC_DEFUN([MAC_CXX_STD], [ + AC_REQUIRE([MAC_CXX_NAMESPACES])dnl + AC_CACHE_CHECK([whether the compiler supports ISO C++ standard library], + mac_cv_cxx_std, [ + AC_LANG_PUSH(C++)dnl + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +@%:@include +@%:@include +@%:@include +@%:@include +@%:@ifdef HAVE_CXX_NAMESPACES +using namespace std; +@%:@endif + ], [return 0;])], [mac_cv_cxx_std=yes], [mac_cv_cxx_std=no]) + AC_LANG_POP(C++)dnl + ] + ) + HAVE_CXX_STD=$mac_cv_cxx_std + if test "$HAVE_CXX_STD" = yes; then + AC_DEFINE(HAVE_CXX_STD, 1, + [Define to 1 if the compiler supports ISO C++ standard library.])dnl + fi +]) + +AC_DEFUN([MAC_CXX_SSTREAM], [ + AC_REQUIRE([MAC_CXX_STD])dnl + AC_CACHE_CHECK([whether the C++ standard library uses stringstream or strstream], + mac_cv_cxx_sstream, [ + AC_LANG_PUSH(C++)dnl + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +@%:@include +@%:@ifdef HAVE_CXX_NAMESPACES +using namespace std; +@%:@endif + ], [ +istringstream iss(""); +ostringstream oss(); +stringstream ss(); + ])], [mac_cv_cxx_sstream=stringstream], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +@%:@include +@%:@ifdef HAVE_CXX_NAMESPACES +using namespace std; +@%:@endif + ], [ +istrstream iss(""); +ostrstream oss(); +strstream ss(); + ])], [mac_cv_cxx_sstream=strstream], [ + mac_cv_cxx_sstream=unknown + ]) + ]) + AC_LANG_POP(C++)dnl + ] + ) + case "$mac_cv_cxx_sstream" in + stringstream) + AC_DEFINE(HAVE_CXX_STRINGSTREAM, 1, + [Define to 1 if the C++ standard library uses stringstream.])dnl + ;; + strstream) + AC_DEFINE(HAVE_CXX_STRSTREAM, 1, + [Define to 1 if the C++ standard library uses strstream.])dnl + ;; + *) + AC_MSG_ERROR([can't compile without either stringstream or strstream]) + ;; + esac +]) + +AC_DEFUN([MAC_PKG_X], [ + AC_REQUIRE([AC_PATH_XTRA])dnl + if test "$no_x" = yes; then + AC_MSG_ERROR([can't compile without X]) + fi + AC_CHECK_LIB(Xmu, XmuLookupStandardColormap, [ + X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXmu $X_EXTRA_LIBS" + ], [ + X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS" + ], [$X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS])dnl + X_CPPFLAGS="$X_CFLAGS" + X_CFLAGS= + _MAC_SAVE([CPPFLAGS], [ + CPPFLAGS="$CPPFLAGS $X_CPPFLAGS" + AC_CHECK_HEADERS([X11/Xlib.h], , , [#]) + ]) +]) + +AC_DEFUN([MAC_PKG_XSCREENSAVER], [ + AC_REQUIRE([MAC_PKG_X])dnl + + PKG_XSCREENSAVER_SYMLINKS=yes + + AC_ARG_WITH(xscreensaver, + AC_HELP_STRING([--without-xscreensaver], [do not integrate with XScreenSaver]))dnl + case "$with_xscreensaver" in + nosymlinks) + with_xscreensaver= + PKG_XSCREENSAVER_SYMLINKS=no + ;; + yes) + with_xscreensaver=force + ;; + no) + ;; + *) + with_xscreensaver=yes + ;; + esac + + HAVE_PKG_XSCREENSAVER=no + HAVE_PKG_XSCREENSAVER_4=no + if test "$with_xscreensaver" != no; then + PKG_XSCREENSAVER_DEFAULTDIR= + AC_ARG_WITH(defaultdir, + AC_HELP_STRING([--with-defaultdir], + [where application defaults files are stored [[guessed]]]))dnl + case "$with_defaultdir" in + no) + AC_MSG_ERROR([can't install as XScreenSaver hacks without a defaultdir]) + ;; + yes | "") + ;; + *) + PKG_XSCREENSAVER_DEFAULTDIR="$with_defaultdir" + ;; + esac + + PKG_XSCREENSAVER_HACKDIR= + AC_ARG_WITH(hackdir, + AC_HELP_STRING([--with-hackdir], + [where XScreenSaver hacks are installed [[guessed]]]))dnl + case "$with_hackdir" in + no) + AC_MSG_ERROR([can't install as XScreenSaver hacks without a hackdir]) + ;; + yes | "") + ;; + *) + PKG_XSCREENSAVER_HACKDIR="$with_hackdir" + ;; + esac + + PKG_XSCREENSAVER_CONFIGDIR= + mac_xss_use_configdir=yes + AC_ARG_WITH(configdir, + AC_HELP_STRING([--with-configdir], + [where XScreensaver config files are installed [[guessed]]]))dnl + case "$with_configdir" in + no) + mac_xss_use_configdir=no + ;; + no | yes | "") + ;; + *) + PKG_XSCREENSAVER_CONFIGDIR="$with_configdir" + ;; + esac + fi + + if test "$with_xscreensaver" != no; then + AC_MSG_CHECKING([for X11 application defaults directory]) + if test -z "$PKG_XSCREENSAVER_DEFAULTDIR"; then + AC_CACHE_VAL(mac_cv_xss_defaultdir, [ + if test -d "$x_libraries/X11/app-defaults"; then + mac_cv_xss_defaultdir="$x_libraries/X11/app-defaults" + elif test -d /usr/share/X11/app-defaults; then + mac_cv_xss_defaultdir=/usr/share/X11/app-defaults + else + mac_cv_xss_defaultdir= + fi + ]) + if test -z "$mac_cv_xss_defaultdir"; then + AC_MSG_RESULT([not found]) + if test "$with_xscreensaver" = force; then + AC_MSG_WARN([*** XScreenSaver support will be disabled ***]) + AC_MSG_WARN([*** (try using the --with-defaultdir=DIR option) ***]) + with_xscreensaver=no + else + AC_MSG_ERROR([try using the --with-defaultdir=DIR option]) + fi + else + PKG_XSCREENSAVER_DEFAULTDIR="$mac_cv_xss_defaultdir" + AC_MSG_RESULT($PKG_XSCREENSAVER_DEFAULTDIR) + fi + else + AC_MSG_RESULT($PKG_XSCREENSAVER_DEFAULTDIR) + fi + fi + + if test "$with_xscreensaver" != no; then + AC_MSG_CHECKING([for XScreenSaver hacks directory]) + if test -z "$PKG_XSCREENSAVER_HACKDIR"; then + AC_CACHE_VAL(mac_cv_xss_hackdir, [ + if test -d "$x_libraries/xscreensaver"; then + mac_cv_xss_hackdir="$x_libraries/xscreensaver" + elif test -d /usr/libexec/xscreensaver; then + mac_cv_xss_hackdir=/usr/libexec/xscreensaver + else + mac_cv_xss_hackdir= + fi + ])dnl + if test -z "$mac_cv_xss_hackdir"; then + AC_MSG_RESULT([not found]) + if test "$with_xscreensaver" = force; then + AC_MSG_WARN([*** XScreenSaver support will be disabled ***]) + AC_MSG_WARN([*** (try using the --with-hackdir=DIR option) ***]) + with_xscreensaver=no + else + AC_MSG_ERROR([try using the --with-hackdir=DIR option]) + fi + else + PKG_XSCREENSAVER_HACKDIR="$mac_cv_xss_hackdir" + AC_MSG_RESULT($PKG_XSCREENSAVER_HACKDIR) + fi + else + AC_MSG_RESULT($PKG_XSCREENSAVER_HACKDIR) + fi + fi + + if test "$with_xscreensaver" != no; then + AC_MSG_CHECKING([for XScreenSaver config directory]) + if test -z "$PKG_XSCREENSAVER_CONFIGDIR"; then + if test "$mac_xss_use_configdir" = yes; then + AC_CACHE_VAL(mac_cv_xss_configdir, [ + if test -d "$PKG_XSCREENSAVER_HACKDIR/config"; then + mac_cv_xss_configdir="$PKG_XSCREENSAVER_HACKDIR/config" + elif test -d /usr/share/control-center/screensavers; then + mac_cv_xss_configdir=/usr/share/control-center/screensavers + elif test -d /usr/share/xscreensaver/config; then + mac_cv_xss_configdir=/usr/share/xscreensaver/config + else + mac_cv_xss_configdir= + fi + ]) + if test -z "$mac_cv_xss_configdir"; then + AC_MSG_RESULT([not found]) + AC_MSG_NOTICE([*** assuming pre-4.0 version of XScreenSaver ***]) + AC_MSG_NOTICE([*** (if this is wrong, try using the --with-configdir=DIR option) ***]) + mac_xss_use_configdir=no + else + AC_MSG_RESULT($mac_cv_xss_configdir) + fi + PKG_XSCREENSAVER_CONFIGDIR="$mac_cv_xss_configdir" + else + AC_MSG_RESULT(disabled) + fi + else + AC_MSG_RESULT($PKG_XSCREENSAVER_CONFIGDIR) + fi + fi + + if test "$with_xscreensaver" != no; then + if test "$mac_xss_use_configdir" = yes; then + HAVE_PKG_XSCREENSAVER_4=yes + fi + HAVE_PKG_XSCREENSAVER=yes + else + PKG_XSCREENSAVER_DEFAULTDIR= + PKG_XSCREENSAVER_HACKDIR="$bindir" + PKG_XSCREENSAVER_CONFIGDIR= + PKG_XSCREENSAVER_SYMLINKS=no + fi +]) + +AC_DEFUN([MAC_PKG_OPENGL], [ + AC_REQUIRE([MAC_PKG_X]) + + _MAC_SAVE([LIBS], [ + HAVE_PKG_OPENGL=yes + AC_SEARCH_LIBS(glXChooseVisual, [MesaGL GL GLX], + [], [HAVE_PKG_OPENGL=no], [[$X_LIBS]])dnl + AC_SEARCH_LIBS(gluErrorString, [MesaGLU GL GLU], + [], [HAVE_PKG_OPENGL=no], [[$X_LIBS]])dnl + OPENGL_LIBS="$LIBS" + _MAC_SAVE([CPPFLAGS], [ + CPPFLAGS="$CPPFLAGS $X_CPPFLAGS" + AC_CHECK_HEADERS([GL/gl.h], , , [#]) + AC_CHECK_HEADERS([GL/glext.h GL/glu.h GL/glx.h], , , [ +@%:@if HAVE_GL_GL_H +@%:@include +@%:@endif + ]) + ]) + ]) +]) + +AC_DEFUN([MAC_PKG_OPENAL], [ + AC_ARG_WITH(openal, + AC_HELP_STRING([--with-openal=OPREFIX], [prefix to libopenal [[guessed]]]))dnl + AC_ARG_WITH(openal-includes, + AC_HELP_STRING([--with-openal-includes=DIR], [libopenal headers directory [[OPREFIX/include]]]))dnl + AC_ARG_WITH(openal-libraries, + AC_HELP_STRING([--with-openal-libraries=DIR], [libopenal libraries directory [[OPREFIX/lib]]]))dnl + + HAVE_PKG_OPENAL=no + if test "$with_openal" != no; then + OPENAL_CPPFLAGS= + if test x"$with_openal_includes" != x; then + OPENAL_CPPFLAGS="-I$with_openal_includes" + elif test x"$with_openal" != x; then + OPENAL_CPPFLAGS="-I$with_openal/include" + fi + + OPENAL_LDFLAGS= + if test x"$with_openal_libraries" != x; then + OPENAL_LDFLAGS="-L$with_openal_libraries" + elif test x"$with_openal" != x; then + OPENAL_LDFLAGS="-L$with_openal/lib" + fi + + OPENAL_LIBS= + _MAC_SAVE([LIBS], [ + AC_SEARCH_LIBS(alcOpenDevice, [openal AL openAL], + [HAVE_PKG_OPENAL=yes])dnl + OPENAL_LIBS="$LIBS" + ]) + fi +]) + +AC_DEFUN([MAC_PKG_VORBISFILE], [ + AC_ARG_WITH(vorbisfile, + AC_HELP_STRING([--with-vorbisfile=VPREFIX], [prefix to libvorbisfile [[guessed]]]))dnl + AC_ARG_WITH(vorbisfile-includes, + AC_HELP_STRING([--with-vorbisfile-includes=DIR], [libvorbisfile headers directory [[VPREFIX/include]]]))dnl + AC_ARG_WITH(vorbisfile-libraries, + AC_HELP_STRING([--with-vorbisfile-libraries=DIR], [libvorbisfile libraries directory [[VPREFIX/lib]]]))dnl + + HAVE_PKG_VORBISFILE=no + if test "$with_vorbisfile" != no; then + VORBISFILE_CPPFLAGS= + if test x"$with_vorbisfile_includes" != x; then + VORBISFILE_CPPFLAGS="-I$with_vorbisfile_includes" + elif test x"$with_vorbisfile" != x; then + VORBISFILE_CPPFLAGS="-I$with_vorbisfile/include" + fi + + VORBISFILE_LDFLAGS= + if test x"$with_vorbisfile_libraries" != x; then + VORBISFILE_LDFLAGS="-I$with_vorbisfile_libraries" + elif test x"$with_vorbisfile" != x; then + VORBISFILE_LDFLAGS="-I$with_vorbisfile/lib" + fi + + VORBISFILE_LIBS= + _MAC_SAVE([CPPFLAGS LDFLAGS LIBS], [ + CPPFLAGS="$CPPFLAGS $VORBISFILE_CPPFLAGS" + LDFLAGS="$LDFLAGS $VORBISFILE_LDFLAGS" + LIBS= + AC_CHECK_LIB(vorbisfile, ov_open, [ + VORBISFILE_LIBS="-lvorbisfile" + HAVE_PKG_VORBISFILE=yes + ])dnl + ]) + fi +]) + +AC_DEFUN([MAC_PKG_PNG], [ + AC_ARG_WITH(png, + AC_HELP_STRING([--with-png=PPREFIX], [prefix to libpng [[guessed]]]))dnl + AC_ARG_WITH(png-includes, + AC_HELP_STRING([--with-png-includes=DIR], [libpng headers directory [[PPREFIX/include]]]))dnl + AC_ARG_WITH(png-libraries, + AC_HELP_STRING([--with-png-libraries=DIR], [libpng libraries directory [[PPREFIX/lib]]]))dnl + + HAVE_PKG_PNG=no + LIBPNG_SUPPORTS_SETJMP=no + if test "$with_png" != no; then + PNG_CPPFLAGS= + if test x"$with_png_includes" != x; then + PNG_CPPFLAGS="-I$with_png_includes" + elif test x"$with_png" != x; then + PNG_CPPFLAGS="-I$with_png/include" + fi + + PNG_LDFLAGS= + if test x"$with_png_libraries" != x; then + PNG_LDFLAGS="-L$with_png_libraries" + elif test x"$with_png" != x; then + PNG_LDFLAGS="-L$with_png/lib" + fi + + PNG_LIBS= + + mac_libpng_config=libpng-config + if test x"$with_png" != x; then + mac_libpng_config="$with_png/bin/libpng-config" + fi + AC_CACHE_CHECK([for libpng-config], mac_cv_pkg_png, [ + AC_TRY_COMMAND([$mac_libpng_config --version >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD]) + mac_cv_pkg_png="not found" + if test "$ac_status" = 0; then + mac_cv_pkg_png="$mac_libpng_config" + fi + ]) + if test "$mac_cv_pkg_png" != "not found"; then + AC_CACHE_CHECK([for libpng preprocessor flags], mac_cv_pkg_cppflags, [ + mac_cv_pkg_cppflags=`"$mac_libpng_config" --I_opts --cppflags 2>&AS_MESSAGE_LOG_FD` + mac_cv_pkg_cppflags=`echo $mac_cv_pkg_cppflags` + ]) + PNG_CPPFLAGS="$mac_cv_pkg_cppflags" + AC_CACHE_CHECK([for libpng compiler flags], mac_cv_pkg_cxxflags, [ + mac_cv_pkg_cxxflags=`"$mac_libpng_config" --ccopts 2>&AS_MESSAGE_LOG_FD` + mac_cv_pkg_cxxflags=`echo $mac_cv_pkg_cxxflags` + ]) + PNG_CXXFLAGS="$mac_cv_pkg_cxxflags" + AC_CACHE_CHECK([for libpng linker flags], mac_cv_pkg_ldflags, [ + mac_cv_pkg_ldflags=`"$mac_libpng_config" --L_opts --R_opts 2>&AS_MESSAGE_LOG_FD` + mac_cv_pkg_ldflags=`echo $mac_cv_pkg_ldflags` + ]) + PNG_LDFLAGS="$mac_cv_pkg_ldflags" + AC_CACHE_CHECK([for libpng libraries], mac_cv_pkg_libs, [ + mac_cv_pkg_libs=`"$mac_libpng_config" --libs 2>&AS_MESSAGE_LOG_FD` + mac_cv_pkg_libs=`echo $mac_cv_pkg_libs` + ]) + PNG_LIBS="$mac_cv_pkg_libs" + HAVE_PKG_PNG=yes + fi + + if test "$HAVE_PKG_PNG" = no; then + _MAC_SAVE([CPPFLAGS CXXFLAGS LDFLAGS LIBS], [ + CPPFLAGS="$CPPFLAGS $PNG_CPPFLAGS" + CXXFLAGS="$CXXFLAGS $PNG_CXXFLAGS" + LDFLAGS="$LDFLAGS $PNG_LDFLAGS" + LIBS= + AC_CHECK_LIB(png, png_access_version_number, [ + PNG_LIBS="-lpng" + HAVE_PKG_PNG=yes + ])dnl + ]) + fi + + if test "$HAVE_PKG_PNG" = yes; then + _MAC_SAVE([CPPFLAGS CXXFLAGS LDFLAGS LIBS], [ + CPPFLAGS="$CPPFLAGS $PNG_CPPFLAGS" + CXXFLAGS="$CXXFLAGS $PNG_CXXFLAGS" + LDFLAGS="$LDFLAGS $PNG_LDFLAGS" + LIBS="$PNG_LIBS" + AC_CHECK_HEADERS([png.h], [ + AC_CACHE_CHECK( + [whether libpng supports setjmp], + mac_cv_libpng_supports_setjmp, [ + AC_COMPILE_IFELSE([ +@%:@include +@%:@if !defined PNG_SETJMP_SUPPORTED +@%:@error PNG_SETJMP_SUPPORTED not defined +@%:@endif + ], [mac_cv_libpng_supports_setjmp=yes], [mac_cv_libpng_supports_setjmp=no] + ) + ] + ) + ], [mac_cv_libpng_supports_setjmp=unknown], [#]) + LIBPNG_SUPPORTS_SETJMP=$mac_cv_libpng_supports_setjmp + ]) + fi + fi +]) + +AC_DEFUN([_MAC_HACK_ENABLE], [ + AC_ARG_ENABLE([$1], + AS_HELP_STRING(--disable-[$1],do not build [$2] screensaver))dnl + enable_hack=no + if test "$enable_[$1]" != no; then + enable_hack=yes + enable_[$1]=yes + [$3] + fi + AM_CONDITIONAL(BUILD_$4, test "$enable_hack" = yes) + if test "$enable_hack" = yes; then + ENABLED_HACKS="$ENABLED_HACKS [$1]" + ENABLED_BINARIES="$ENABLED_BINARIES rs-[$1]$EXEEXT" + ENABLED_CONFIGS="$ENABLED_CONFIGS rs-[$1].xml" + else + DISABLED_HACKS="$DISABLED_HACKS [$1]" + fi +]) +AC_DEFUN([MAC_HACK_ENABLE], [_MAC_HACK_ENABLE([$1],[$2],[$3],AS_TR_CPP([$1]))]) + +dnl @synopsis adl_NORMALIZE_PATH(VARNAME, [REFERENCE_STRING]) +dnl +dnl Perform some cleanups on the value of $VARNAME (interpreted as a path): +dnl - empty paths are changed to '.' +dnl - trailing slashes are removed +dnl - repeated slashes are squeezed except a leading doubled slash '//' +dnl (which might indicate a networked disk on some OS). +dnl +dnl REFERENCE_STRING is used to turn '/' into '\' and vice-versa: +dnl if REFERENCE_STRING contains some backslashes, all slashes and backslashes +dnl are turned into backslashes, otherwise they are all turned into slashes. +dnl +dnl This makes processing of DOS filenames quite easier, because you +dnl can turn a filename to the Unix notation, make your processing, and +dnl turn it back to original notation. +dnl +dnl filename='A:\FOO\\BAR\' +dnl old_filename="$filename" +dnl # Switch to the unix notation +dnl adl_NORMALIZE_PATH([filename], ["/"]) +dnl # now we have $filename = 'A:/FOO/BAR' and we can process it as if +dnl # it was a Unix path. For instance let's say that you want +dnl # to append '/subpath': +dnl filename="$filename/subpath" +dnl # finally switch back to the original notation +dnl adl_NORMALIZE_PATH([filename], ["$old_filename"]) +dnl # now $filename equals to 'A:\FOO\BAR\subpath' +dnl +dnl One good reason to make all path processing with the unix convention +dnl is that backslashes have a special meaning in many cases. For instance +dnl +dnl expr 'A:\FOO' : 'A:\Foo' +dnl +dnl will return 0 because the second argument is a regex in which +dnl backslashes have to be backslashed. In other words, to have the +dnl two strings to match you should write this instead: +dnl +dnl expr 'A:\Foo' : 'A:\\Foo' +dnl +dnl Such behavior makes DOS filenames extremely unpleasant to work with. +dnl So temporary turn your paths to the Unix notation, and revert +dnl them to the original notation after the processing. See the +dnl macro adl_COMPUTE_RELATIVE_PATHS for a concrete example of this. +dnl +dnl REFERENCE_STRING defaults to $VARIABLE, this means that slashes +dnl will be converted to backslashes if $VARIABLE already contains +dnl some backslashes (see $thirddir below). +dnl +dnl firstdir='/usr/local//share' +dnl seconddir='C:\Program Files\\' +dnl thirddir='C:\home/usr/' +dnl adl_NORMALIZE_PATH([firstdir]) +dnl adl_NORMALIZE_PATH([seconddir]) +dnl adl_NORMALIZE_PATH([thirddir]) +dnl # $firstdir = '/usr/local/share' +dnl # $seconddir = 'C:\Program Files' +dnl # $thirddir = 'C:\home\usr' +dnl +dnl @author Alexandre Duret-Lutz +dnl @version $Id: normpath.m4,v 1.1 2001/07/26 01:12 ac-archive-0.5.37 $ +AC_DEFUN([adl_NORMALIZE_PATH], +[case ":[$]$1:" in +# change empty paths to '.' + ::) $1='.' ;; +# strip trailing slashes + :*[[\\/]]:) $1=`echo "[$]$1" | sed 's,[[\\/]]*[$],,'` ;; + :*:) ;; +esac +# squeze repeated slashes +case ifelse($2,,"[$]$1",$2) in +# if the path contains any backslashes, turn slashes into backslashes + *\\*) $1=`echo "[$]$1" | sed 's,\(.\)[[\\/]][[\\/]]*,\1\\\\,g'` ;; +# if the path contains slashes, also turn backslashes into slashes + *) $1=`echo "[$]$1" | sed 's,\(.\)[[\\/]][[\\/]]*,\1/,g'` ;; +esac]) + +dnl @synopsis adl_COMPUTE_RELATIVE_PATHS(PATH_LIST) +dnl +dnl PATH_LIST is a space-separated list of colon-separated +dnl triplets of the form 'FROM:TO:RESULT'. This function +dnl iterates over these triplets and set $RESULT to the +dnl relative path from $FROM to $TO. Note that $FROM +dnl and $TO needs to be absolute filenames for this macro +dnl to success. +dnl +dnl For instance, +dnl +dnl first=/usr/local/bin +dnl second=/usr/local/share +dnl adl_COMPUTE_RELATIVE_PATHS([first:second:fs second:first:sf]) +dnl # $fs is set to ../share +dnl # $sf is set to ../bin +dnl +dnl $FROM and $TO are both eval'ed recursively and normalized, +dnl this means that you can call this macro with autoconf's dirnames +dnl like `prefix' or `datadir'. For example: +dnl +dnl adl_COMPUTE_RELATIVE_PATHS([bindir:datadir:bin_to_data]) +dnl +dnl adl_COMPUTE_RELATIVE_PATHS should also works with DOS filenames. +dnl +dnl You may want to use this macro in order to make your package +dnl relocatable. Instead of hardcoding $datadir into your programs +dnl just encode $bin_to_data and try to determine $bindir at run-time. +dnl +dnl This macro requires adl_NORMALIZE_PATH. +dnl +dnl @author Alexandre Duret-Lutz +dnl @version $Id: relpaths.m4,v 1.1 2001/07/26 01:12 ac-archive-0.5.37 $ +AC_DEFUN([adl_COMPUTE_RELATIVE_PATHS], +[for _lcl_i in $1; do + _lcl_from=\[$]`echo "[$]_lcl_i" | sed 's,:.*$,,'` + _lcl_to=\[$]`echo "[$]_lcl_i" | sed 's,^[[^:]]*:,,' | sed 's,:[[^:]]*$,,'` + _lcl_result_var=`echo "[$]_lcl_i" | sed 's,^.*:,,'` + adl_RECURSIVE_EVAL([[$]_lcl_from], [_lcl_from]) + adl_RECURSIVE_EVAL([[$]_lcl_to], [_lcl_to]) + _lcl_notation="$_lcl_from$_lcl_to" + adl_NORMALIZE_PATH([_lcl_from],['/']) + adl_NORMALIZE_PATH([_lcl_to],['/']) + adl_COMPUTE_RELATIVE_PATH([_lcl_from], [_lcl_to], [_lcl_result_tmp]) + adl_NORMALIZE_PATH([_lcl_result_tmp],["[$]_lcl_notation"]) + eval $_lcl_result_var='[$]_lcl_result_tmp' +done]) + +## Note: +## ***** +## The following helper macros are too fragile to be used out +## of adl_COMPUTE_RELATIVE_PATHS (mainly because they assume that +## paths are normalized), that's why I'm keeping them in the same file. +## Still, some of them maybe worth to reuse. + +dnl adl_COMPUTE_RELATIVE_PATH(FROM, TO, RESULT) +dnl =========================================== +dnl Compute the relative path to go from $FROM to $TO and set the value +dnl of $RESULT to that value. This function work on raw filenames +dnl (for instead it will considerate /usr//local and /usr/local as +dnl two distinct paths), you should really use adl_COMPUTE_REALTIVE_PATHS +dnl instead to have the paths sanitized automatically. +dnl +dnl For instance: +dnl first_dir=/somewhere/on/my/disk/bin +dnl second_dir=/somewhere/on/another/disk/share +dnl adl_COMPUTE_RELATIVE_PATH(first_dir, second_dir, first_to_second) +dnl will set $first_to_second to '../../../another/disk/share'. +AC_DEFUN([adl_COMPUTE_RELATIVE_PATH], +[adl_COMPUTE_COMMON_PATH([$1], [$2], [_lcl_common_prefix]) +adl_COMPUTE_BACK_PATH([$1], [_lcl_common_prefix], [_lcl_first_rel]) +adl_COMPUTE_SUFFIX_PATH([$2], [_lcl_common_prefix], [_lcl_second_suffix]) +$3="[$]_lcl_first_rel[$]_lcl_second_suffix"]) + +dnl adl_COMPUTE_COMMON_PATH(LEFT, RIGHT, RESULT) +dnl ============================================ +dnl Compute the common path to $LEFT and $RIGHT and set the result to $RESULT. +dnl +dnl For instance: +dnl first_path=/somewhere/on/my/disk/bin +dnl second_path=/somewhere/on/another/disk/share +dnl adl_COMPUTE_COMMON_PATH(first_path, second_path, common_path) +dnl will set $common_path to '/somewhere/on'. +AC_DEFUN([adl_COMPUTE_COMMON_PATH], +[$3='' +_lcl_second_prefix_match='' +while test "[$]_lcl_second_prefix_match" != 0; do + _lcl_first_prefix=`expr "x[$]$1" : "x\([$]$3/*[[^/]]*\)"` + _lcl_second_prefix_match=`expr "x[$]$2" : "x[$]_lcl_first_prefix"` + if test "[$]_lcl_second_prefix_match" != 0; then + if test "[$]_lcl_first_prefix" != "[$]$3"; then + $3="[$]_lcl_first_prefix" + else + _lcl_second_prefix_match=0 + fi + fi +done]) + +dnl adl_COMPUTE_SUFFIX_PATH(PATH, SUBPATH, RESULT) +dnl ============================================== +dnl Substrack $SUBPATH from $PATH, and set the resulting suffix +dnl (or the empty string if $SUBPATH is not a subpath of $PATH) +dnl to $RESULT. +dnl +dnl For instace: +dnl first_path=/somewhere/on/my/disk/bin +dnl second_path=/somewhere/on +dnl adl_COMPUTE_SUFFIX_PATH(first_path, second_path, common_path) +dnl will set $common_path to '/my/disk/bin'. +AC_DEFUN([adl_COMPUTE_SUFFIX_PATH], +[$3=`expr "x[$]$1" : "x[$]$2/*\(.*\)"`]) + +dnl adl_COMPUTE_BACK_PATH(PATH, SUBPATH, RESULT) +dnl ============================================ +dnl Compute the relative path to go from $PATH to $SUBPATH, knowing that +dnl $SUBPATH is a subpath of $PATH (any other words, only repeated '../' +dnl should be needed to move from $PATH to $SUBPATH) and set the value +dnl of $RESULT to that value. If $SUBPATH is not a subpath of PATH, +dnl set $RESULT to the empty string. +dnl +dnl For instance: +dnl first_path=/somewhere/on/my/disk/bin +dnl second_path=/somewhere/on +dnl adl_COMPUTE_BACK_PATH(first_path, second_path, back_path) +dnl will set $back_path to '../../../'. +AC_DEFUN([adl_COMPUTE_BACK_PATH], +[adl_COMPUTE_SUFFIX_PATH([$1], [$2], [_lcl_first_suffix]) +$3='' +_lcl_tmp='xxx' +while test "[$]_lcl_tmp" != ''; do + _lcl_tmp=`expr "x[$]_lcl_first_suffix" : "x[[^/]]*/*\(.*\)"` + if test "[$]_lcl_first_suffix" != ''; then + _lcl_first_suffix="[$]_lcl_tmp" + $3="../[$]$3" + fi +done]) + + +dnl adl_RECURSIVE_EVAL(VALUE, RESULT) +dnl ================================= +dnl Interpolate the VALUE in loop until it doesn't change, +dnl and set the result to $RESULT. +dnl WARNING: It's easy to get an infinite loop with some unsane input. +AC_DEFUN([adl_RECURSIVE_EVAL], +[_lcl_receval="$1" +$2=`(test "x$prefix" = xNONE && prefix="$ac_default_prefix" + test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" + _lcl_receval_old='' + while test "[$]_lcl_receval_old" != "[$]_lcl_receval"; do + _lcl_receval_old="[$]_lcl_receval" + eval _lcl_receval="\"[$]_lcl_receval\"" + done + echo "[$]_lcl_receval")`]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/AUTHORS kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/AUTHORS --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/AUTHORS 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/AUTHORS 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,7 @@ +Original (Windows) Version +-------------------------- +Terry Welsh -- http://www.reallyslick.com/ + +XScreenSaver Port +----------------- +Michael Chapman diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/ChangeLog kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/ChangeLog --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/ChangeLog 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/ChangeLog 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,48 @@ +* Sat Jul 15 2005 Michael Chapman 0.9-1 +- fixed skyrocket memory allocation +- fixed xscreensaver config files +- added hyperspace screensaver +- package overhaul; it now actually builds on modern OSs! +- added libltdl so sound can be dynamically loaded; this simplifies + the RPM packaging considerably + +* Fri Jul 11 2003 Michael Chapman 0.8-1 +- major package restructure +- added skyrocket screensaver + +* Wed Dec 11 2002 Michael Chapman 0.7-1 +- added flocks screensaver +- added flux screensaver +- added solarwinds screensaver +- cleaned up command-line argument handling +- added support for pre-4.0 versions of xscreensaver + +* Sat Dec 07 2002 Michael Chapman 0.6-1 +- added lattice screensaver +- converted textures to PNG format +- small Makefile fix to build correctly on Gentoo + +* Tue Nov 28 2002 Michael Chapman 0.5-1 +- added euphoria screensaver +- fixed bug in timing delay +- removed unnecessary #include + +* Tue Nov 27 2002 Michael Chapman 0.4-2 +- fixed uninstall script -- should upgrade properly now +- fixed bug in timing delay + +* Tue Nov 26 2002 Michael Chapman 0.4-1 +- added helios screensaver +- expanded screensaver descriptions +- removed unnecessary labels + +* Mon Nov 19 2002 Michael Chapman 0.3-1 +- added fieldlines screensaver +- fixed bug in this changelog (!) +- fixed bug in uninstall and verify scripts + +* Mon Nov 18 2002 Michael Chapman 0.2-1 +- added cyclone screensaver + +* Tue Nov 12 2002 Michael Chapman 0.1-1 +- initial version diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,16 @@ +## Process this file with automake to produce Makefile.in + +XML = @ENABLED_CONFIGS@ +EXTRA_DIST = rs-plasma.xml rs-cyclone.xml rs-fieldlines.xml rs-helios.xml \ + rs-euphoria.xml rs-lattice.xml rs-flocks.xml rs-flux.xml \ + rs-solarwinds.xml rs-hyperspace.xml + +if HACKMODE +if XSCREENSAVER4 +dist_config_DATA = $(XML) +else !XSCREENSAVER4 +dist_noinst_DATA = $(XML) +endif !XSCREENSAVER4 +else !HACKMODE +dist_noinst_DATA = $(XML) +endif !HACKMODE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-cyclone.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-cyclone.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-cyclone.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-cyclone.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,79 @@ + + + + + +
+ + +
+ + + + + + + + <_description> +This screen saver is dedicated to my storm chasing partner Andy. We like to go +out on the road and get pummeled by Mother Nature. This saver brings a little +of her action to your screen. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + +
diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-euphoria.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-euphoria.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-euphoria.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-euphoria.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + <_description> +If psychedelic is what you're looking for, you've come to the right place. This +saver is another fine example of what you can do with a few good equations and +a whole lot of geometry. I hope you don't get nauseous looking at it. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-fieldlines.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-fieldlines.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-fieldlines.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-fieldlines.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,77 @@ + + + + + + + + +
+ + +
+ + + + <_description> +Field Lines is a good example of the beauty of physics. It is an accurate +representation of the field lines between positively and negatively charged +particles. The only real artistic license that I took was in my choice of +colors for the lines. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + +
diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-flocks.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-flocks.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-flocks.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-flocks.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,90 @@ + + + + + +
+ + +
+ + + + + + + + + <_description> +There are plenty of screen savers out there with swarms of little bugs, but +I hadn't found a good 3D version. So here it is! For a really nice 3D +effect, you can turn on the ChromaDepth option and try using some of the +ChromaDepth glasses from Chromatek. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + +
diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-flux.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-flux.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-flux.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-flux.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,140 @@ + + + + + +
+ + +
+ + + + + + + + + + + + <_description> +This screen saver started as an experiment with strange attractors. After +playing with some simple strange attractor equations, it became clear that +they could be much more beautiful if the constants could be varied over time. + +This required the introduction of some limiting terms into the equations that +prevented the values from flying off to infinity. So these aren't genuine +strange attractors anymore, but they look much better. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + +
diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-helios.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-helios.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-helios.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-helios.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + <_description> +Beneath its shiny exterior, Helios's particles are powered by some basic +attraction/repulsion math. The Helion surfaces, on the other hand, are much +more complicated. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-hyperspace.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-hyperspace.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-hyperspace.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-hyperspace.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + <_description> +This is a real number cruncher of a screensaver. Computers are getting much +more powerful these days, and my old savers don't bring them to their knees +like they use to. This one does. Of course, you can still turn the settings way +down if you have a pathetic, old computer. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-lattice.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-lattice.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-lattice.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-lattice.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + <_description> +No screensaver collection would be complete without some kind of flight +through an endless field of geometry, right? A special thanks goes to Kevin +for his "doughnut" idea. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-plasma.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-plasma.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-plasma.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-plasma.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,53 @@ + + + + + + + + + + + <_description> +There are probably too many plasma savers out there already. So this +screensaver is pointless, but I made it anyway. Enjoy. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-skyrocket.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-skyrocket.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-skyrocket.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-skyrocket.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + <_description> +This is my little contribution to the myriad of fireworks savers in the world. +There are way too many of them, which is why I tried to make mine really really +good. + +Underneath all the eye candy, I tried to keep the physics of the fireworks as +realistic as possible. It seemed like the best way to produce a believable +effect. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-solarwinds.xml kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-solarwinds.xml --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/config/rs-solarwinds.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/config/rs-solarwinds.xml 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,96 @@ + + + + + +
+ + + +
+ + + + + + + <_description> +My savers seem to be all about color and movement. This one is certainly no +exception. It just shows that a little random math can go a long way. + +Solar Winds started out as a simple particle effects saver, but once I saw +that the particles usually stayed in continuous lines I gave them some +connectivity and threw in the "lines" option. + -- Terry Welsh, Really Slick Screensavers (http://www.reallyslick.com/) + +This version by Michael Chapman <foonly@users.sourceforge.net>. + +
diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/configure.ac kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/configure.ac --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/configure.ac 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/configure.ac 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,313 @@ +## Process this file with autoconf to produce a configure script. + +AC_INIT([Really Slick XScreenSavers],[0.9],[foonly@users.sourceforge.net],[rsxs]) +AC_PREREQ(2.59) +AC_CONFIG_SRCDIR([src/hack.hh]) +AC_CONFIG_HEADERS([config.h]) +AM_INIT_AUTOMAKE([1.7 subdir-objects std-options]) +AC_SUBST(RELEASE, 1) + +AC_CONFIG_MACRO_DIR(m4) +AC_CONFIG_LIBOBJ_DIR(lib) + +AC_GNU_SOURCE + +# Checks for programs. +LT_AC_PROG_SED +AC_LANG(C++) +AC_PROG_CXX +#CXXFLAGS=`echo $CXXFLAGS | sed -e s,-O2,-O3,` +AC_PROG_CXXCPP + +#if test x"$GXX" = x"yes"; then +# CXXFLAGS=`echo $CXXFLAGS -Wall` +#fi + +AC_PROG_CC +AM_PROG_CC_C_O +gl_EARLY +AC_PROG_RANLIB + +# Cut-down version of AC_LIB_LTDL. We don't want the option to install +# libltdl, or to use dlpreopen (we don't want libtool at all). +# Also, we can use gnulib's *_ONCE macros. +AC_DEFUN([MAC_LIB_LTDL], [ + # Some of the below macros have dependencies that are m4_require'd. + # aclocal doesn't resolve those automatically, so we need to call + # LT_PATH_LD and LTSUGAR_VERSION to pull in libtool.m4 and ltsugar.m4 + # where the required dependencies are m4_defun'd. + AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + AC_REQUIRE([LT_PATH_LD])dnl + AC_REQUIRE([LTSUGAR_VERSION])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_HEADER_DIRENT])dnl + AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + AC_REQUIRE([AC_LTDL_SHLIBEXT])dnl + AC_REQUIRE([AC_LTDL_SHLIBPATH])dnl + AC_REQUIRE([AC_LTDL_SYSSEARCHPATH])dnl + AC_REQUIRE([AC_LTDL_OBJDIR])dnl + AC_REQUIRE([AC_LTDL_DLLIB])dnl + AC_REQUIRE([AC_LTDL_SYMBOL_USCORE])dnl + AC_REQUIRE([AC_LTDL_DLSYM_USCORE])dnl + AC_REQUIRE([AC_LTDL_SYS_DLOPEN_DEPLIBS])dnl + + AC_CHECK_HEADERS_ONCE([assert.h ctype.h errno.h malloc.h memory.h stdlib.h stdio.h unistd.h]) + AC_CHECK_HEADERS_ONCE([dl.h sys/dl.h dld.h mach-o/dyld.h]) + AC_CHECK_HEADERS_ONCE([string.h strings.h], [break]) + AC_CHECK_FUNCS_ONCE([strchr index], [break]) + AC_CHECK_FUNCS_ONCE([strrchr rindex], [break]) + AC_CHECK_FUNCS_ONCE([memcpy bcopy], [break]) + AC_CHECK_FUNCS_ONCE([memmove strcmp]) + AC_CHECK_FUNCS_ONCE([closedir opendir readdir]) +])dnl +MAC_LIB_LTDL + +MAC_CXX_BOOL +MAC_CXX_NEW_FOR_SCOPING +MAC_CXX_NAMESPACES +if test "$HAVE_CXX_NAMESPACES" != yes; then + AC_MSG_ERROR([$CXX does not correctly support namespaces]) +fi +MAC_CXX_STD +if test "$HAVE_CXX_STD" != yes; then + AC_MSG_ERROR([the C++ Standard Template Library is unavailable or non-ISO]) +fi +MAC_CXX_SSTREAM + +AC_PROG_INSTALL +AC_PROG_LN_S + +# Checks for libraries. +gl_INIT +MAC_PKG_X +AC_SUBST(X_CPPFLAGS) +AC_SUBST(X_LIBS) +MAC_PKG_XSCREENSAVER +AM_CONDITIONAL(HACKMODE, test $HAVE_PKG_XSCREENSAVER = yes) +AM_CONDITIONAL(XSCREENSAVER4, test $HAVE_PKG_XSCREENSAVER_4 = yes) +AM_CONDITIONAL(SYMLINKS, test $PKG_XSCREENSAVER_SYMLINKS = yes) +AC_SUBST(xscreensaver, $HAVE_PKG_XSCREENSAVER) +AC_SUBST(defaultdir, $PKG_XSCREENSAVER_DEFAULTDIR) +AC_SUBST(hackdir, $PKG_XSCREENSAVER_HACKDIR) +AC_SUBST(configdir, $PKG_XSCREENSAVER_CONFIGDIR) + +MAC_PKG_OPENGL +if test "$HAVE_PKG_OPENGL" != yes; then + AC_MSG_ERROR([can't compile without OpenGL support]) +fi +AC_SUBST(OPENGL_LIBS) + +HAVE_SOUND=no +USE_DLOPEN=no +SOUND_CPPFLAGS= +SOUND_CXXFLAGS= +SOUND_LDFLAGS= +SOUND_LIBS= +AC_ARG_ENABLE(sound, + AS_HELP_STRING(--disable-sound,disable OGG sound file support)) +m4_divert_once([HELP_ENABLE], + AS_HELP_STRING(--enable-sound=dlopen,use OGG sound file support at runtime))dnl +if test "$enable_sound" != "no"; then + MAC_PKG_OPENAL + if test "$HAVE_PKG_OPENAL" = yes; then + MAC_PKG_VORBISFILE + if test "$HAVE_PKG_VORBISFILE" = yes; then + HAVE_SOUND=yes + SOUND_CPPFLAGS="$OPENAL_CPPFLAGS $VORBISFILE_CPPFLAGS" + SOUND_CPPFLAGS="$OPENAL_CXXFLAGS $VORBISFILE_CXXFLAGS" + if test "$enable_sound" = "dlopen"; then + AC_DEFINE(USE_DLOPEN, 1, [Define to 1 if run-time dynamic linking should be used.]) + USE_DLOPEN=yes + else + SOUND_LDFLAGS="$OPENAL_LDFLAGS $VORBISFILE_LDFLAGS" + SOUND_LIBS="$OPENAL_LIBS $VORBISFILE_LIBS" + fi + AC_DEFINE(HAVE_SOUND, 1, [Define to 1 if OGG sound support is available.]) + fi + fi +fi +AC_SUBST(HAVE_SOUND) +AC_SUBST(SOUND_CPPFLAGS) +AC_SUBST(SOUND_CXXFLAGS) +AC_SUBST(SOUND_LDFLAGS) +AC_SUBST(SOUND_LIBS) +AM_CONDITIONAL(SOUND, test "$HAVE_SOUND" = yes) +AM_CONDITIONAL(DLOPEN, test "$USE_DLOPEN" = yes) + +HAVE_IMAGE=no +IMAGE_CPPFLAGS= +IMAGE_CXXFLAGS= +IMAGE_LDFLAGS= +IMAGE_LIBS= +AC_ARG_ENABLE(image, + AS_HELP_STRING(--disable-image,disable PNG image file support)) +if test "$enable_image" != "no"; then + MAC_PKG_PNG + if test "$HAVE_PKG_PNG" = yes; then + case "$LIBPNG_SUPPORTS_SETJMP" in + no) + AC_MSG_ERROR([need a version of libpng with setjmp support]) + ;; + unknown) + AC_MSG_WARN([assuming libpng has setjmp support]) + ;; + esac + HAVE_IMAGE=yes + IMAGE_CPPFLAGS="$PNG_CPPFLAGS" + IMAGE_CXXFLAGS="$PNG_CXXFLAGS" + IMAGE_LDFLAGS="$PNG_LDFLAGS" + IMAGE_LIBS="$PNG_LIBS" + AC_DEFINE(HAVE_IMAGE, 1, [Define to 1 if PNG image support is available.]) + fi +fi +AC_SUBST(HAVE_IMAGE) +AC_SUBST(IMAGE_CPPFLAGS) +AC_SUBST(IMAGE_CXXFLAGS) +AC_SUBST(IMAGE_LDFLAGS) +AC_SUBST(IMAGE_LIBS) +AM_CONDITIONAL(IMAGE, test "$HAVE_IMAGE" = yes) + +# Create a hackdir that is relative to bindir +adl_COMPUTE_RELATIVE_PATHS([bindir:hackdir:hackreldir]) +AC_SUBST(hackreldir) + +# Checks for header files. +AC_CHECK_HEADERS_ONCE([setjmp.h sys/types.h sys/select.h]) + +# Checks for typedefs, structures, and compiler characteristics. + +# Checks for library functions. +AC_CHECK_FUNCS_ONCE([setjmp select], [], [ + AC_MSG_ERROR([your environment is missing a necessary library function]) +]) + +AC_ARG_ENABLE(debug, + AS_HELP_STRING(--enable-debug, [include debug code])) +case "$enable_debug" in +no|"") + AC_DEFINE(NDEBUG, 1, [Define to 1 if debugging is disabled]) + ;; +*) + ;; +esac + +AC_ARG_ENABLE(profile, + AS_HELP_STRING(--enable-profile, [enable profiling])) +case "$enable_profile" in +no|"") + ;; +*) + if test "$GCC" != "yes"; then + AC_MSG_ERROR([I can only use profiling on GCC]) + fi + CFLAGS=`echo $CXXFLAGS -pg -fprofile-arcs -ftest-coverage | sed -e s,-O2,-O0,` + LDFLAGS="$LDFLAGS -pg -fprofile-arcs -ftest-coverage" + ;; +esac + +ENABLED_HACKS= +ENABLED_BINARIES= +ENABLED_CONFIGS= +DISABLED_HACKS= + +MAC_HACK_ENABLE(cyclone, [Cyclone]) +MAC_HACK_ENABLE(euphoria, [Euphoria], [ + if test "$HAVE_IMAGE" != yes; then + enable_euphoria="no (requires PNG image support)" + enable_hack=no + fi +]) +MAC_HACK_ENABLE(fieldlines, [Field Lines]) +MAC_HACK_ENABLE(flocks, [Flocks]) +MAC_HACK_ENABLE(flux, [Flux]) +MAC_HACK_ENABLE(helios, [Helios], [ + if test "$HAVE_IMAGE" != yes; then + enable_helios="no (requires PNG image support)" + enable_hack=no + fi +]) +MAC_HACK_ENABLE(hyperspace, [Hyperspace], [ + if test "$HAVE_IMAGE" != yes; then + enable_hyperspace="no (requires PNG image support)" + enable_hack=no + fi +]) +MAC_HACK_ENABLE(lattice, [Lattice], [ + if test "$HAVE_IMAGE" != yes; then + enable_lattice="no (requires PNG image support)" + enable_hack=no + fi +]) +MAC_HACK_ENABLE(plasma, [Plasma]) +MAC_HACK_ENABLE(skyrocket, [Skyrocket], [ + if test "$HAVE_IMAGE" != yes; then + enable_skyrocket="no (requires PNG image support)" + enable_hack=no + else + if test "$HAVE_SOUND" != yes; then + enable_skyrocket="yes (but without sound)" + elif test "$USE_DLOPEN" = yes; then + enable_skyrocket="yes (if available at run-time)" + fi + fi +]) +MAC_HACK_ENABLE(solarwinds, [Solar Winds]) + +AC_SUBST(ENABLED_HACKS) +AC_SUBST(ENABLED_BINARIES) +AC_SUBST(ENABLED_CONFIGS) +AC_SUBST(DISABLED_HACKS) + +# Embed stuff in the RPM spec +INSTALL_AWK=scripts/install.awk +UNINSTALL_AWK=scripts/uninstall.awk +VERIFY_AWK=scripts/verify.awk +CHANGELOG=ChangeLog +AC_SUBST_FILE(INSTALL_AWK) +AC_SUBST_FILE(UNINSTALL_AWK) +AC_SUBST_FILE(VERIFY_AWK) +AC_SUBST_FILE(CHANGELOG) + +AC_CONFIG_FILES([ + Makefile + config/Makefile + lib/Makefile + libltdl/Makefile + src/Makefile + src/cyclone/Makefile + src/euphoria/Makefile + src/fieldlines/Makefile + src/flocks/Makefile + src/flux/Makefile + src/helios/Makefile + src/hyperspace/Makefile + src/lattice/Makefile + src/plasma/Makefile + src/skyrocket/Makefile + src/solarwinds/Makefile + rsxs.spec +]) +AC_OUTPUT + +# Print a pretty summary +echo >&2 +echo "====================================" >&2 +echo " XScreenSaver support : $HAVE_PKG_XSCREENSAVER" >&2 +echo " PNG image support : $HAVE_IMAGE" >&2 +echo " OGG Vorbis sound support : $HAVE_SOUND" >&2 +echo "------------------------------------" >&2 +echo " Enabled screensavers:" >&2 +echo " - Cyclone : $enable_cyclone" >&2 +echo " - Euphoria : $enable_euphoria" >&2 +echo " - Field Lines : $enable_fieldlines" >&2 +echo " - Flocks : $enable_flocks" >&2 +echo " - Flux : $enable_flux" >&2 +echo " - Helios : $enable_helios" >&2 +echo " - Hyperspace : $enable_hyperspace" >&2 +echo " - Lattice : $enable_lattice" >&2 +echo " - Plasma : $enable_plasma" >&2 +echo " - Skyrocket : $enable_skyrocket" >&2 +echo " - Solar Winds : $enable_solarwinds" >&2 +echo "====================================" >&2 +echo >&2 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/COPYING kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/COPYING --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/COPYING 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/alloca.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/alloca.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/alloca.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/alloca.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,491 @@ +/* alloca.c -- allocate automatically reclaimed memory + (Mostly) portable public-domain implementation -- D A Gwyn + + This implementation of the PWB library alloca function, + which is used to allocate space off the run-time stack so + that it is automatically reclaimed upon procedure exit, + was inspired by discussions with J. Q. Johnson of Cornell. + J.Otto Tennant contributed the Cray support. + + There are some preprocessor constants that can + be defined when compiling for your specific system, for + improved efficiency; however, the defaults should be okay. + + The general concept of this implementation is to keep + track of all alloca-allocated blocks, and reclaim any + that are found to be deeper in the stack than the current + invocation. This heuristic does not reclaim storage as + soon as it becomes invalid, but it will do so eventually. + + As a special case, alloca(0) reclaims storage without + allocating any. It is a good idea to use alloca(0) in + your main control loop, etc. to force garbage collection. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include +#include + +#ifdef emacs +# include "lisp.h" +# include "blockinput.h" +# ifdef EMACS_FREE +# undef free +# define free EMACS_FREE +# endif +#else +# define memory_full() abort () +#endif + +/* If compiling with GCC 2, this file's not needed. */ +#if !defined (__GNUC__) || __GNUC__ < 2 + +/* If someone has defined alloca as a macro, + there must be some other way alloca is supposed to work. */ +# ifndef alloca + +# ifdef emacs +# ifdef static +/* actually, only want this if static is defined as "" + -- this is for usg, in which emacs must undefine static + in order to make unexec workable + */ +# ifndef STACK_DIRECTION +you +lose +-- must know STACK_DIRECTION at compile-time +/* Using #error here is not wise since this file should work for + old and obscure compilers. */ +# endif /* STACK_DIRECTION undefined */ +# endif /* static */ +# endif /* emacs */ + +/* If your stack is a linked list of frames, you have to + provide an "address metric" ADDRESS_FUNCTION macro. */ + +# if defined (CRAY) && defined (CRAY_STACKSEG_END) +long i00afunc (); +# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) +# else +# define ADDRESS_FUNCTION(arg) &(arg) +# endif + +/* Define STACK_DIRECTION if you know the direction of stack + growth for your system; otherwise it will be automatically + deduced at run-time. + + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ + +# ifndef STACK_DIRECTION +# define STACK_DIRECTION 0 /* Direction unknown. */ +# endif + +# if STACK_DIRECTION != 0 + +# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ + +# else /* STACK_DIRECTION == 0; need run-time code. */ + +static int stack_dir; /* 1 or -1 once known. */ +# define STACK_DIR stack_dir + +static void +find_stack_direction (void) +{ + static char *addr = NULL; /* Address of first `dummy', once known. */ + auto char dummy; /* To get stack address. */ + + if (addr == NULL) + { /* Initial entry. */ + addr = ADDRESS_FUNCTION (dummy); + + find_stack_direction (); /* Recurse once. */ + } + else + { + /* Second entry. */ + if (ADDRESS_FUNCTION (dummy) > addr) + stack_dir = 1; /* Stack grew upward. */ + else + stack_dir = -1; /* Stack grew downward. */ + } +} + +# endif /* STACK_DIRECTION == 0 */ + +/* An "alloca header" is used to: + (a) chain together all alloca'ed blocks; + (b) keep track of stack depth. + + It is very important that sizeof(header) agree with malloc + alignment chunk size. The following default should work okay. */ + +# ifndef ALIGN_SIZE +# define ALIGN_SIZE sizeof(double) +# endif + +typedef union hdr +{ + char align[ALIGN_SIZE]; /* To force sizeof(header). */ + struct + { + union hdr *next; /* For chaining headers. */ + char *deep; /* For stack depth measure. */ + } h; +} header; + +static header *last_alloca_header = NULL; /* -> last alloca header. */ + +/* Return a pointer to at least SIZE bytes of storage, + which will be automatically reclaimed upon exit from + the procedure that called alloca. Originally, this space + was supposed to be taken from the current stack frame of the + caller, but that method cannot be made to work for some + implementations of C, for example under Gould's UTX/32. */ + +void * +alloca (size_t size) +{ + auto char probe; /* Probes stack depth: */ + register char *depth = ADDRESS_FUNCTION (probe); + +# if STACK_DIRECTION == 0 + if (STACK_DIR == 0) /* Unknown growth direction. */ + find_stack_direction (); +# endif + + /* Reclaim garbage, defined as all alloca'd storage that + was allocated from deeper in the stack than currently. */ + + { + register header *hp; /* Traverses linked list. */ + +# ifdef emacs + BLOCK_INPUT; +# endif + + for (hp = last_alloca_header; hp != NULL;) + if ((STACK_DIR > 0 && hp->h.deep > depth) + || (STACK_DIR < 0 && hp->h.deep < depth)) + { + register header *np = hp->h.next; + + free (hp); /* Collect garbage. */ + + hp = np; /* -> next header. */ + } + else + break; /* Rest are not deeper. */ + + last_alloca_header = hp; /* -> last valid storage. */ + +# ifdef emacs + UNBLOCK_INPUT; +# endif + } + + if (size == 0) + return NULL; /* No allocation required. */ + + /* Allocate combined header + user data storage. */ + + { + /* Address of header. */ + register header *new; + + size_t combined_size = sizeof (header) + size; + if (combined_size < sizeof (header)) + memory_full (); + + new = malloc (combined_size); + + if (! new) + memory_full (); + + new->h.next = last_alloca_header; + new->h.deep = depth; + + last_alloca_header = new; + + /* User storage begins just after header. */ + + return (void *) (new + 1); + } +} + +# if defined (CRAY) && defined (CRAY_STACKSEG_END) + +# ifdef DEBUG_I00AFUNC +# include +# endif + +# ifndef CRAY_STACK +# define CRAY_STACK +# ifndef CRAY2 +/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ +struct stack_control_header + { + long shgrow:32; /* Number of times stack has grown. */ + long shaseg:32; /* Size of increments to stack. */ + long shhwm:32; /* High water mark of stack. */ + long shsize:32; /* Current size of stack (all segments). */ + }; + +/* The stack segment linkage control information occurs at + the high-address end of a stack segment. (The stack + grows from low addresses to high addresses.) The initial + part of the stack segment linkage control information is + 0200 (octal) words. This provides for register storage + for the routine which overflows the stack. */ + +struct stack_segment_linkage + { + long ss[0200]; /* 0200 overflow words. */ + long sssize:32; /* Number of words in this segment. */ + long ssbase:32; /* Offset to stack base. */ + long:32; + long sspseg:32; /* Offset to linkage control of previous + segment of stack. */ + long:32; + long sstcpt:32; /* Pointer to task common address block. */ + long sscsnm; /* Private control structure number for + microtasking. */ + long ssusr1; /* Reserved for user. */ + long ssusr2; /* Reserved for user. */ + long sstpid; /* Process ID for pid based multi-tasking. */ + long ssgvup; /* Pointer to multitasking thread giveup. */ + long sscray[7]; /* Reserved for Cray Research. */ + long ssa0; + long ssa1; + long ssa2; + long ssa3; + long ssa4; + long ssa5; + long ssa6; + long ssa7; + long sss0; + long sss1; + long sss2; + long sss3; + long sss4; + long sss5; + long sss6; + long sss7; + }; + +# else /* CRAY2 */ +/* The following structure defines the vector of words + returned by the STKSTAT library routine. */ +struct stk_stat + { + long now; /* Current total stack size. */ + long maxc; /* Amount of contiguous space which would + be required to satisfy the maximum + stack demand to date. */ + long high_water; /* Stack high-water mark. */ + long overflows; /* Number of stack overflow ($STKOFEN) calls. */ + long hits; /* Number of internal buffer hits. */ + long extends; /* Number of block extensions. */ + long stko_mallocs; /* Block allocations by $STKOFEN. */ + long underflows; /* Number of stack underflow calls ($STKRETN). */ + long stko_free; /* Number of deallocations by $STKRETN. */ + long stkm_free; /* Number of deallocations by $STKMRET. */ + long segments; /* Current number of stack segments. */ + long maxs; /* Maximum number of stack segments so far. */ + long pad_size; /* Stack pad size. */ + long current_address; /* Current stack segment address. */ + long current_size; /* Current stack segment size. This + number is actually corrupted by STKSTAT to + include the fifteen word trailer area. */ + long initial_address; /* Address of initial segment. */ + long initial_size; /* Size of initial segment. */ + }; + +/* The following structure describes the data structure which trails + any stack segment. I think that the description in 'asdef' is + out of date. I only describe the parts that I am sure about. */ + +struct stk_trailer + { + long this_address; /* Address of this block. */ + long this_size; /* Size of this block (does not include + this trailer). */ + long unknown2; + long unknown3; + long link; /* Address of trailer block of previous + segment. */ + long unknown5; + long unknown6; + long unknown7; + long unknown8; + long unknown9; + long unknown10; + long unknown11; + long unknown12; + long unknown13; + long unknown14; + }; + +# endif /* CRAY2 */ +# endif /* not CRAY_STACK */ + +# ifdef CRAY2 +/* Determine a "stack measure" for an arbitrary ADDRESS. + I doubt that "lint" will like this much. */ + +static long +i00afunc (long *address) +{ + struct stk_stat status; + struct stk_trailer *trailer; + long *block, size; + long result = 0; + + /* We want to iterate through all of the segments. The first + step is to get the stack status structure. We could do this + more quickly and more directly, perhaps, by referencing the + $LM00 common block, but I know that this works. */ + + STKSTAT (&status); + + /* Set up the iteration. */ + + trailer = (struct stk_trailer *) (status.current_address + + status.current_size + - 15); + + /* There must be at least one stack segment. Therefore it is + a fatal error if "trailer" is null. */ + + if (trailer == 0) + abort (); + + /* Discard segments that do not contain our argument address. */ + + while (trailer != 0) + { + block = (long *) trailer->this_address; + size = trailer->this_size; + if (block == 0 || size == 0) + abort (); + trailer = (struct stk_trailer *) trailer->link; + if ((block <= address) && (address < (block + size))) + break; + } + + /* Set the result to the offset in this segment and add the sizes + of all predecessor segments. */ + + result = address - block; + + if (trailer == 0) + { + return result; + } + + do + { + if (trailer->this_size <= 0) + abort (); + result += trailer->this_size; + trailer = (struct stk_trailer *) trailer->link; + } + while (trailer != 0); + + /* We are done. Note that if you present a bogus address (one + not in any segment), you will get a different number back, formed + from subtracting the address of the first block. This is probably + not what you want. */ + + return (result); +} + +# else /* not CRAY2 */ +/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. + Determine the number of the cell within the stack, + given the address of the cell. The purpose of this + routine is to linearize, in some sense, stack addresses + for alloca. */ + +static long +i00afunc (long address) +{ + long stkl = 0; + + long size, pseg, this_segment, stack; + long result = 0; + + struct stack_segment_linkage *ssptr; + + /* Register B67 contains the address of the end of the + current stack segment. If you (as a subprogram) store + your registers on the stack and find that you are past + the contents of B67, you have overflowed the segment. + + B67 also points to the stack segment linkage control + area, which is what we are really interested in. */ + + stkl = CRAY_STACKSEG_END (); + ssptr = (struct stack_segment_linkage *) stkl; + + /* If one subtracts 'size' from the end of the segment, + one has the address of the first word of the segment. + + If this is not the first segment, 'pseg' will be + nonzero. */ + + pseg = ssptr->sspseg; + size = ssptr->sssize; + + this_segment = stkl - size; + + /* It is possible that calling this routine itself caused + a stack overflow. Discard stack segments which do not + contain the target address. */ + + while (!(this_segment <= address && address <= stkl)) + { +# ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); +# endif + if (pseg == 0) + break; + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + this_segment = stkl - size; + } + + result = address - this_segment; + + /* If you subtract pseg from the current end of the stack, + you get the address of the previous stack segment's end. + This seems a little convoluted to me, but I'll bet you save + a cycle somewhere. */ + + while (pseg != 0) + { +# ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o\n", pseg, size); +# endif + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + result += size; + } + return (result); +} + +# endif /* not CRAY2 */ +# endif /* CRAY */ + +# endif /* no alloca */ +#endif /* not GCC version 2 */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/alloca_.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/alloca_.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/alloca_.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/alloca_.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,54 @@ +/* Memory allocation on the stack. + + Copyright (C) 1995, 1999, 2001, 2002, 2003, 2004, 2006 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H + means there is a real alloca function. */ +#ifndef _GNULIB_ALLOCA_H +# define _GNULIB_ALLOCA_H + +/* alloca (N) returns a pointer to N bytes of memory + allocated on the stack, which will last until the function returns. + Use of alloca should be avoided: + - inside arguments of function calls - undefined behaviour, + - in inline functions - the allocation may actually last until the + calling function returns, + - for huge N (say, N >= 65536) - you never know how large (or small) + the stack is, and when the stack cannot fulfill the memory allocation + request, the program just crashes. + */ + +#ifndef alloca +# ifdef __GNUC__ +# define alloca __builtin_alloca +# elif defined _AIX +# define alloca __alloca +# elif defined _MSC_VER +# include +# define alloca _alloca +# else +# include +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +# endif +#endif + +#endif /* _GNULIB_ALLOCA_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-ba.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-ba.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-ba.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-ba.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,25 @@ +/* Default definition for ARGP_PROGRAM_BUG_ADDRESS. + Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* If set by the user program, it should point to string that is the + bug-reporting address for the program. It will be printed by argp_help if + the ARGP_HELP_BUG_ADDR flag is set (as it is by various standard help + messages), embedded in a sentence that says something like `Report bugs to + ADDR.'. */ +const char *argp_program_bug_address; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-eexst.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-eexst.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-eexst.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-eexst.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,31 @@ +/* Default definition for ARGP_ERR_EXIT_STATUS + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "argp.h" + +/* The exit status that argp will use when exiting due to a parsing error. + If not defined or set by the user program, this defaults to EX_USAGE from + . */ +error_t argp_err_exit_status = EX_USAGE; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-fmtstream.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-fmtstream.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-fmtstream.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-fmtstream.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,435 @@ +/* Word-wrapping and line-truncating streams + Copyright (C) 1997-1999,2001,2002,2003,2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* This package emulates glibc `line_wrap_stream' semantics for systems that + don't have that. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#include "argp-fmtstream.h" +#include "argp-namefrob.h" + +#ifndef ARGP_FMTSTREAM_USE_LINEWRAP + +#ifndef isblank +#define isblank(ch) ((ch)==' ' || (ch)=='\t') +#endif + +#if defined _LIBC && defined USE_IN_LIBIO +# include +# include +# define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a) +#endif + +#define INIT_BUF_SIZE 200 +#define PRINTF_SIZE_GUESS 150 + +/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines + written on it with LMARGIN spaces and limits them to RMARGIN columns + total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by + replacing the whitespace before them with a newline and WMARGIN spaces. + Otherwise, chars beyond RMARGIN are simply dropped until a newline. + Returns NULL if there was an error. */ +argp_fmtstream_t +__argp_make_fmtstream (FILE *stream, + size_t lmargin, size_t rmargin, ssize_t wmargin) +{ + argp_fmtstream_t fs; + + fs = (struct argp_fmtstream *) malloc (sizeof (struct argp_fmtstream)); + if (fs != NULL) + { + fs->stream = stream; + + fs->lmargin = lmargin; + fs->rmargin = rmargin; + fs->wmargin = wmargin; + fs->point_col = 0; + fs->point_offs = 0; + + fs->buf = (char *) malloc (INIT_BUF_SIZE); + if (! fs->buf) + { + free (fs); + fs = 0; + } + else + { + fs->p = fs->buf; + fs->end = fs->buf + INIT_BUF_SIZE; + } + } + + return fs; +} +#if 0 +/* Not exported. */ +#ifdef weak_alias +weak_alias (__argp_make_fmtstream, argp_make_fmtstream) +#endif +#endif + +/* Flush FS to its stream, and free it (but don't close the stream). */ +void +__argp_fmtstream_free (argp_fmtstream_t fs) +{ + __argp_fmtstream_update (fs); + if (fs->p > fs->buf) + { +#ifdef USE_IN_LIBIO + __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf); +#else + fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); +#endif + } + free (fs->buf); + free (fs); +} +#if 0 +/* Not exported. */ +#ifdef weak_alias +weak_alias (__argp_fmtstream_free, argp_fmtstream_free) +#endif +#endif + +/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the + end of its buffer. This code is mostly from glibc stdio/linewrap.c. */ +void +__argp_fmtstream_update (argp_fmtstream_t fs) +{ + char *buf, *nl; + size_t len; + + /* Scan the buffer for newlines. */ + buf = fs->buf + fs->point_offs; + while (buf < fs->p) + { + size_t r; + + if (fs->point_col == 0 && fs->lmargin != 0) + { + /* We are starting a new line. Print spaces to the left margin. */ + const size_t pad = fs->lmargin; + if (fs->p + pad < fs->end) + { + /* We can fit in them in the buffer by moving the + buffer text up and filling in the beginning. */ + memmove (buf + pad, buf, fs->p - buf); + fs->p += pad; /* Compensate for bigger buffer. */ + memset (buf, ' ', pad); /* Fill in the spaces. */ + buf += pad; /* Don't bother searching them. */ + } + else + { + /* No buffer space for spaces. Must flush. */ + size_t i; + for (i = 0; i < pad; i++) + { +#ifdef USE_IN_LIBIO + if (_IO_fwide (fs->stream, 0) > 0) + putwc_unlocked (L' ', fs->stream); + else +#endif + putc_unlocked (' ', fs->stream); + } + } + fs->point_col = pad; + } + + len = fs->p - buf; + nl = memchr (buf, '\n', len); + + if (fs->point_col < 0) + fs->point_col = 0; + + if (!nl) + { + /* The buffer ends in a partial line. */ + + if (fs->point_col + len < fs->rmargin) + { + /* The remaining buffer text is a partial line and fits + within the maximum line width. Advance point for the + characters to be written and stop scanning. */ + fs->point_col += len; + break; + } + else + /* Set the end-of-line pointer for the code below to + the end of the buffer. */ + nl = fs->p; + } + else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin) + { + /* The buffer contains a full line that fits within the maximum + line width. Reset point and scan the next line. */ + fs->point_col = 0; + buf = nl + 1; + continue; + } + + /* This line is too long. */ + r = fs->rmargin - 1; + + if (fs->wmargin < 0) + { + /* Truncate the line by overwriting the excess with the + newline and anything after it in the buffer. */ + if (nl < fs->p) + { + memmove (buf + (r - fs->point_col), nl, fs->p - nl); + fs->p -= buf + (r - fs->point_col) - nl; + /* Reset point for the next line and start scanning it. */ + fs->point_col = 0; + buf += r + 1; /* Skip full line plus \n. */ + } + else + { + /* The buffer ends with a partial line that is beyond the + maximum line width. Advance point for the characters + written, and discard those past the max from the buffer. */ + fs->point_col += len; + fs->p -= fs->point_col - r; + break; + } + } + else + { + /* Do word wrap. Go to the column just past the maximum line + width and scan back for the beginning of the word there. + Then insert a line break. */ + + char *p, *nextline; + int i; + + p = buf + (r + 1 - fs->point_col); + while (p >= buf && !isblank (*p)) + --p; + nextline = p + 1; /* This will begin the next line. */ + + if (nextline > buf) + { + /* Swallow separating blanks. */ + if (p >= buf) + do + --p; + while (p >= buf && isblank (*p)); + nl = p + 1; /* The newline will replace the first blank. */ + } + else + { + /* A single word that is greater than the maximum line width. + Oh well. Put it on an overlong line by itself. */ + p = buf + (r + 1 - fs->point_col); + /* Find the end of the long word. */ + if (p < nl) + do + ++p; + while (p < nl && !isblank (*p)); + if (p == nl) + { + /* It already ends a line. No fussing required. */ + fs->point_col = 0; + buf = nl + 1; + continue; + } + /* We will move the newline to replace the first blank. */ + nl = p; + /* Swallow separating blanks. */ + do + ++p; + while (isblank (*p)); + /* The next line will start here. */ + nextline = p; + } + + /* Note: There are a bunch of tests below for + NEXTLINE == BUF + LEN + 1; this case is where NL happens to fall + at the end of the buffer, and NEXTLINE is in fact empty (and so + we need not be careful to maintain its contents). */ + + if ((nextline == buf + len + 1 + ? fs->end - nl < fs->wmargin + 1 + : nextline - (nl + 1) < fs->wmargin) + && fs->p > nextline) + { + /* The margin needs more blanks than we removed. */ + if (fs->end - fs->p > fs->wmargin + 1) + /* Make some space for them. */ + { + size_t mv = fs->p - nextline; + memmove (nl + 1 + fs->wmargin, nextline, mv); + nextline = nl + 1 + fs->wmargin; + len = nextline + mv - buf; + *nl++ = '\n'; + } + else + /* Output the first line so we can use the space. */ + { +#ifdef _LIBC + __fxprintf (fs->stream, "%.*s\n", + (int) (nl - fs->buf), fs->buf); +#else + if (nl > fs->buf) + fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream); + putc_unlocked ('\n', fs->stream); +#endif + + len += buf - fs->buf; + nl = buf = fs->buf; + } + } + else + /* We can fit the newline and blanks in before + the next word. */ + *nl++ = '\n'; + + if (nextline - nl >= fs->wmargin + || (nextline == buf + len + 1 && fs->end - nextline >= fs->wmargin)) + /* Add blanks up to the wrap margin column. */ + for (i = 0; i < fs->wmargin; ++i) + *nl++ = ' '; + else + for (i = 0; i < fs->wmargin; ++i) +#ifdef USE_IN_LIBIO + if (_IO_fwide (fs->stream, 0) > 0) + putwc_unlocked (L' ', fs->stream); + else +#endif + putc_unlocked (' ', fs->stream); + + /* Copy the tail of the original buffer into the current buffer + position. */ + if (nl < nextline) + memmove (nl, nextline, buf + len - nextline); + len -= nextline - buf; + + /* Continue the scan on the remaining lines in the buffer. */ + buf = nl; + + /* Restore bufp to include all the remaining text. */ + fs->p = nl + len; + + /* Reset the counter of what has been output this line. If wmargin + is 0, we want to avoid the lmargin getting added, so we set + point_col to a magic value of -1 in that case. */ + fs->point_col = fs->wmargin ? fs->wmargin : -1; + } + } + + /* Remember that we've scanned as far as the end of the buffer. */ + fs->point_offs = fs->p - fs->buf; +} + +/* Ensure that FS has space for AMOUNT more bytes in its buffer, either by + growing the buffer, or by flushing it. True is returned iff we succeed. */ +int +__argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount) +{ + if ((size_t) (fs->end - fs->p) < amount) + { + ssize_t wrote; + + /* Flush FS's buffer. */ + __argp_fmtstream_update (fs); + +#ifdef _LIBC + __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf); + wrote = fs->p - fs->buf; +#else + wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); +#endif + if (wrote == fs->p - fs->buf) + { + fs->p = fs->buf; + fs->point_offs = 0; + } + else + { + fs->p -= wrote; + fs->point_offs -= wrote; + memmove (fs->buf, fs->buf + wrote, fs->p - fs->buf); + return 0; + } + + if ((size_t) (fs->end - fs->buf) < amount) + /* Gotta grow the buffer. */ + { + size_t old_size = fs->end - fs->buf; + size_t new_size = old_size + amount; + char *new_buf; + + if (new_size < old_size || ! (new_buf = realloc (fs->buf, new_size))) + { + __set_errno (ENOMEM); + return 0; + } + + fs->buf = new_buf; + fs->end = new_buf + new_size; + fs->p = fs->buf; + } + } + + return 1; +} + +ssize_t +__argp_fmtstream_printf (struct argp_fmtstream *fs, const char *fmt, ...) +{ + int out; + size_t avail; + size_t size_guess = PRINTF_SIZE_GUESS; /* How much space to reserve. */ + + do + { + va_list args; + + if (! __argp_fmtstream_ensure (fs, size_guess)) + return -1; + + va_start (args, fmt); + avail = fs->end - fs->p; + out = __vsnprintf (fs->p, avail, fmt, args); + va_end (args); + if ((size_t) out >= avail) + size_guess = out + 1; + } + while ((size_t) out >= avail); + + fs->p += out; + + return out; +} +#if 0 +/* Not exported. */ +#ifdef weak_alias +weak_alias (__argp_fmtstream_printf, argp_fmtstream_printf) +#endif +#endif + +#endif /* !ARGP_FMTSTREAM_USE_LINEWRAP */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-fmtstream.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-fmtstream.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-fmtstream.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-fmtstream.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,301 @@ +/* Word-wrapping and line-truncating streams. + Copyright (C) 1997, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* This package emulates glibc `line_wrap_stream' semantics for systems that + don't have that. If the system does have it, it is just a wrapper for + that. This header file is only used internally while compiling argp, and + shouldn't be installed. */ + +#ifndef _ARGP_FMTSTREAM_H +#define _ARGP_FMTSTREAM_H + +#include +#include +#include + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(Spec) /* empty */ +# endif +/* The __-protected variants of `format' and `printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) || __STRICT_ANSI__ +# define __format__ format +# define __printf__ printf +# endif +#endif + +#if (_LIBC - 0 && !defined (USE_IN_LIBIO)) \ + || (defined (__GNU_LIBRARY__) && defined (HAVE_LINEWRAP_H)) +/* line_wrap_stream is available, so use that. */ +#define ARGP_FMTSTREAM_USE_LINEWRAP +#endif + +#ifdef ARGP_FMTSTREAM_USE_LINEWRAP +/* Just be a simple wrapper for line_wrap_stream; the semantics are + *slightly* different, as line_wrap_stream doesn't actually make a new + object, it just modifies the given stream (reversibly) to do + line-wrapping. Since we control who uses this code, it doesn't matter. */ + +#include + +typedef FILE *argp_fmtstream_t; + +#define argp_make_fmtstream line_wrap_stream +#define __argp_make_fmtstream line_wrap_stream +#define argp_fmtstream_free line_unwrap_stream +#define __argp_fmtstream_free line_unwrap_stream + +#define __argp_fmtstream_putc(fs,ch) putc(ch,fs) +#define argp_fmtstream_putc(fs,ch) putc(ch,fs) +#define __argp_fmtstream_puts(fs,str) fputs(str,fs) +#define argp_fmtstream_puts(fs,str) fputs(str,fs) +#define __argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs) +#define argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs) +#define __argp_fmtstream_printf fprintf +#define argp_fmtstream_printf fprintf + +#define __argp_fmtstream_lmargin line_wrap_lmargin +#define argp_fmtstream_lmargin line_wrap_lmargin +#define __argp_fmtstream_set_lmargin line_wrap_set_lmargin +#define argp_fmtstream_set_lmargin line_wrap_set_lmargin +#define __argp_fmtstream_rmargin line_wrap_rmargin +#define argp_fmtstream_rmargin line_wrap_rmargin +#define __argp_fmtstream_set_rmargin line_wrap_set_rmargin +#define argp_fmtstream_set_rmargin line_wrap_set_rmargin +#define __argp_fmtstream_wmargin line_wrap_wmargin +#define argp_fmtstream_wmargin line_wrap_wmargin +#define __argp_fmtstream_set_wmargin line_wrap_set_wmargin +#define argp_fmtstream_set_wmargin line_wrap_set_wmargin +#define __argp_fmtstream_point line_wrap_point +#define argp_fmtstream_point line_wrap_point + +#else /* !ARGP_FMTSTREAM_USE_LINEWRAP */ +/* Guess we have to define our own version. */ + +struct argp_fmtstream +{ + FILE *stream; /* The stream we're outputting to. */ + + size_t lmargin, rmargin; /* Left and right margins. */ + ssize_t wmargin; /* Margin to wrap to, or -1 to truncate. */ + + /* Point in buffer to which we've processed for wrapping, but not output. */ + size_t point_offs; + /* Output column at POINT_OFFS, or -1 meaning 0 but don't add lmargin. */ + ssize_t point_col; + + char *buf; /* Output buffer. */ + char *p; /* Current end of text in BUF. */ + char *end; /* Absolute end of BUF. */ +}; + +typedef struct argp_fmtstream *argp_fmtstream_t; + +/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines + written on it with LMARGIN spaces and limits them to RMARGIN columns + total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by + replacing the whitespace before them with a newline and WMARGIN spaces. + Otherwise, chars beyond RMARGIN are simply dropped until a newline. + Returns NULL if there was an error. */ +extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream, + size_t __lmargin, + size_t __rmargin, + ssize_t __wmargin); +extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream, + size_t __lmargin, + size_t __rmargin, + ssize_t __wmargin); + +/* Flush __FS to its stream, and free it (but don't close the stream). */ +extern void __argp_fmtstream_free (argp_fmtstream_t __fs); +extern void argp_fmtstream_free (argp_fmtstream_t __fs); + +extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs, + const char *__fmt, ...) + __attribute__ ((__format__ (printf, 2, 3))); +extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs, + const char *__fmt, ...) + __attribute__ ((__format__ (printf, 2, 3))); + +extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch); +extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch); + +extern int __argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str); +extern int argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str); + +extern size_t __argp_fmtstream_write (argp_fmtstream_t __fs, + const char *__str, size_t __len); +extern size_t argp_fmtstream_write (argp_fmtstream_t __fs, + const char *__str, size_t __len); + +/* Access macros for various bits of state. */ +#define argp_fmtstream_lmargin(__fs) ((__fs)->lmargin) +#define argp_fmtstream_rmargin(__fs) ((__fs)->rmargin) +#define argp_fmtstream_wmargin(__fs) ((__fs)->wmargin) +#define __argp_fmtstream_lmargin argp_fmtstream_lmargin +#define __argp_fmtstream_rmargin argp_fmtstream_rmargin +#define __argp_fmtstream_wmargin argp_fmtstream_wmargin + +/* Set __FS's left margin to LMARGIN and return the old value. */ +extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, + size_t __lmargin); +extern size_t __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, + size_t __lmargin); + +/* Set __FS's right margin to __RMARGIN and return the old value. */ +extern size_t argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, + size_t __rmargin); +extern size_t __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, + size_t __rmargin); + +/* Set __FS's wrap margin to __WMARGIN and return the old value. */ +extern size_t argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, + size_t __wmargin); +extern size_t __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, + size_t __wmargin); + +/* Return the column number of the current output point in __FS. */ +extern size_t argp_fmtstream_point (argp_fmtstream_t __fs); +extern size_t __argp_fmtstream_point (argp_fmtstream_t __fs); + +/* Internal routines. */ +extern void _argp_fmtstream_update (argp_fmtstream_t __fs); +extern void __argp_fmtstream_update (argp_fmtstream_t __fs); +extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount); +extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount); + +#ifdef __OPTIMIZE__ +/* Inline versions of above routines. */ + +#if !_LIBC +#define __argp_fmtstream_putc argp_fmtstream_putc +#define __argp_fmtstream_puts argp_fmtstream_puts +#define __argp_fmtstream_write argp_fmtstream_write +#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin +#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin +#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin +#define __argp_fmtstream_point argp_fmtstream_point +#define __argp_fmtstream_update _argp_fmtstream_update +#define __argp_fmtstream_ensure _argp_fmtstream_ensure +#endif + +#ifndef ARGP_FS_EI +#define ARGP_FS_EI extern inline __attribute__ ((__gnu_inline__)) +#endif + +ARGP_FS_EI size_t +__argp_fmtstream_write (argp_fmtstream_t __fs, + const char *__str, size_t __len) +{ + if (__fs->p + __len <= __fs->end || __argp_fmtstream_ensure (__fs, __len)) + { + memcpy (__fs->p, __str, __len); + __fs->p += __len; + return __len; + } + else + return 0; +} + +ARGP_FS_EI int +__argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str) +{ + size_t __len = strlen (__str); + if (__len) + { + size_t __wrote = __argp_fmtstream_write (__fs, __str, __len); + return __wrote == __len ? 0 : -1; + } + else + return 0; +} + +ARGP_FS_EI int +__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch) +{ + if (__fs->p < __fs->end || __argp_fmtstream_ensure (__fs, 1)) + return *__fs->p++ = __ch; + else + return EOF; +} + +/* Set __FS's left margin to __LMARGIN and return the old value. */ +ARGP_FS_EI size_t +__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin) +{ + size_t __old; + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + __old = __fs->lmargin; + __fs->lmargin = __lmargin; + return __old; +} + +/* Set __FS's right margin to __RMARGIN and return the old value. */ +ARGP_FS_EI size_t +__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin) +{ + size_t __old; + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + __old = __fs->rmargin; + __fs->rmargin = __rmargin; + return __old; +} + +/* Set FS's wrap margin to __WMARGIN and return the old value. */ +ARGP_FS_EI size_t +__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin) +{ + size_t __old; + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + __old = __fs->wmargin; + __fs->wmargin = __wmargin; + return __old; +} + +/* Return the column number of the current output point in __FS. */ +ARGP_FS_EI size_t +__argp_fmtstream_point (argp_fmtstream_t __fs) +{ + if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) + __argp_fmtstream_update (__fs); + return __fs->point_col >= 0 ? __fs->point_col : 0; +} + +#if !_LIBC +#undef __argp_fmtstream_putc +#undef __argp_fmtstream_puts +#undef __argp_fmtstream_write +#undef __argp_fmtstream_set_lmargin +#undef __argp_fmtstream_set_rmargin +#undef __argp_fmtstream_set_wmargin +#undef __argp_fmtstream_point +#undef __argp_fmtstream_update +#undef __argp_fmtstream_ensure +#endif + +#endif /* __OPTIMIZE__ */ + +#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */ + +#endif /* argp-fmtstream.h */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-fs-xinl.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-fs-xinl.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-fs-xinl.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-fs-xinl.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,43 @@ +/* Real definitions for extern inline functions in argp-fmtstream.h + Copyright (C) 1997, 2003, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#define ARGP_FS_EI +#undef __OPTIMIZE__ +#define __OPTIMIZE__ 1 +#include "argp-fmtstream.h" + +#if 0 +/* Not exported. */ +/* Add weak aliases. */ +#if _LIBC - 0 && !defined (ARGP_FMTSTREAM_USE_LINEWRAP) && defined (weak_alias) + +weak_alias (__argp_fmtstream_putc, argp_fmtstream_putc) +weak_alias (__argp_fmtstream_puts, argp_fmtstream_puts) +weak_alias (__argp_fmtstream_write, argp_fmtstream_write) +weak_alias (__argp_fmtstream_set_lmargin, argp_fmtstream_set_lmargin) +weak_alias (__argp_fmtstream_set_rmargin, argp_fmtstream_set_rmargin) +weak_alias (__argp_fmtstream_set_wmargin, argp_fmtstream_set_wmargin) +weak_alias (__argp_fmtstream_point, argp_fmtstream_point) + +#endif +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,601 @@ +/* Hierarchial argument parsing, layered over getopt. + Copyright (C) 1995-1999,2003-2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ARGP_H +#define _ARGP_H + +#include +#include +#include +#include + +#define __need_error_t +#include + +#ifndef __THROW +# define __THROW +#endif +#ifndef __NTH +# define __NTH(fct) fct __THROW +#endif + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(Spec) /* empty */ +# endif +/* The __-protected variants of `format' and `printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) || __STRICT_ANSI__ +# define __format__ format +# define __printf__ printf +# endif +#endif + +/* GCC 2.95 and later have "__restrict"; C99 compilers have + "restrict", and "configure" may have defined "restrict". */ +#ifndef __restrict +# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)) +# if defined restrict || 199901L <= __STDC_VERSION__ +# define __restrict restrict +# else +# define __restrict +# endif +# endif +#endif + +#ifndef __error_t_defined +typedef int error_t; +# define __error_t_defined +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* A description of a particular option. A pointer to an array of + these is passed in the OPTIONS field of an argp structure. Each option + entry can correspond to one long option and/or one short option; more + names for the same option can be added by following an entry in an option + array with options having the OPTION_ALIAS flag set. */ +struct argp_option +{ + /* The long option name. For more than one name for the same option, you + can use following options with the OPTION_ALIAS flag set. */ + const char *name; + + /* What key is returned for this option. If > 0 and printable, then it's + also accepted as a short option. */ + int key; + + /* If non-NULL, this is the name of the argument associated with this + option, which is required unless the OPTION_ARG_OPTIONAL flag is set. */ + const char *arg; + + /* OPTION_ flags. */ + int flags; + + /* The doc string for this option. If both NAME and KEY are 0, This string + will be printed outdented from the normal option column, making it + useful as a group header (it will be the first thing printed in its + group); in this usage, it's conventional to end the string with a `:'. */ + const char *doc; + + /* The group this option is in. In a long help message, options are sorted + alphabetically within each group, and the groups presented in the order + 0, 1, 2, ..., n, -m, ..., -2, -1. Every entry in an options array with + if this field 0 will inherit the group number of the previous entry, or + zero if it's the first one, unless its a group header (NAME and KEY both + 0), in which case, the previous entry + 1 is the default. Automagic + options such as --help are put into group -1. */ + int group; +}; + +/* The argument associated with this option is optional. */ +#define OPTION_ARG_OPTIONAL 0x1 + +/* This option isn't displayed in any help messages. */ +#define OPTION_HIDDEN 0x2 + +/* This option is an alias for the closest previous non-alias option. This + means that it will be displayed in the same help entry, and will inherit + fields other than NAME and KEY from the aliased option. */ +#define OPTION_ALIAS 0x4 + +/* This option isn't actually an option (and so should be ignored by the + actual option parser), but rather an arbitrary piece of documentation that + should be displayed in much the same manner as the options. If this flag + is set, then the option NAME field is displayed unmodified (e.g., no `--' + prefix is added) at the left-margin (where a *short* option would normally + be displayed), and the documentation string in the normal place. The NAME + field will be translated using gettext, unless OPTION_NO_TRANS is set (see + below). For purposes of sorting, any leading whitespace and punctuation is + ignored, except that if the first non-whitespace character is not `-', this + entry is displayed after all options (and OPTION_DOC entries with a leading + `-') in the same group. */ +#define OPTION_DOC 0x8 + +/* This option shouldn't be included in `long' usage messages (but is still + included in help messages). This is mainly intended for options that are + completely documented in an argp's ARGS_DOC field, in which case including + the option in the generic usage list would be redundant. For instance, + if ARGS_DOC is "FOO BAR\n-x BLAH", and the `-x' option's purpose is to + distinguish these two cases, -x should probably be marked + OPTION_NO_USAGE. */ +#define OPTION_NO_USAGE 0x10 + +/* Valid only in conjunction with OPTION_DOC. This option disables translation + of option name. */ +#define OPTION_NO_TRANS 0x20 + + +struct argp; /* fwd declare this type */ +struct argp_state; /* " */ +struct argp_child; /* " */ + +/* The type of a pointer to an argp parsing function. */ +typedef error_t (*argp_parser_t) (int key, char *arg, + struct argp_state *state); + +/* What to return for unrecognized keys. For special ARGP_KEY_ keys, such + returns will simply be ignored. For user keys, this error will be turned + into EINVAL (if the call to argp_parse is such that errors are propagated + back to the user instead of exiting); returning EINVAL itself would result + in an immediate stop to parsing in *all* cases. */ +#define ARGP_ERR_UNKNOWN E2BIG /* Hurd should never need E2BIG. XXX */ + +/* Special values for the KEY argument to an argument parsing function. + ARGP_ERR_UNKNOWN should be returned if they aren't understood. + + The sequence of keys to a parsing function is either (where each + uppercased word should be prefixed by `ARGP_KEY_' and opt is a user key): + + INIT opt... NO_ARGS END SUCCESS -- No non-option arguments at all + or INIT (opt | ARG)... END SUCCESS -- All non-option args parsed + or INIT (opt | ARG)... SUCCESS -- Some non-option arg unrecognized + + The third case is where every parser returned ARGP_KEY_UNKNOWN for an + argument, in which case parsing stops at that argument (returning the + unparsed arguments to the caller of argp_parse if requested, or stopping + with an error message if not). + + If an error occurs (either detected by argp, or because the parsing + function returned an error value), then the parser is called with + ARGP_KEY_ERROR, and no further calls are made. */ + +/* This is not an option at all, but rather a command line argument. If a + parser receiving this key returns success, the fact is recorded, and the + ARGP_KEY_NO_ARGS case won't be used. HOWEVER, if while processing the + argument, a parser function decrements the NEXT field of the state it's + passed, the option won't be considered processed; this is to allow you to + actually modify the argument (perhaps into an option), and have it + processed again. */ +#define ARGP_KEY_ARG 0 +/* There are remaining arguments not parsed by any parser, which may be found + starting at (STATE->argv + STATE->next). If success is returned, but + STATE->next left untouched, it's assumed that all arguments were consume, + otherwise, the parser should adjust STATE->next to reflect any arguments + consumed. */ +#define ARGP_KEY_ARGS 0x1000006 +/* There are no more command line arguments at all. */ +#define ARGP_KEY_END 0x1000001 +/* Because it's common to want to do some special processing if there aren't + any non-option args, user parsers are called with this key if they didn't + successfully process any non-option arguments. Called just before + ARGP_KEY_END (where more general validity checks on previously parsed + arguments can take place). */ +#define ARGP_KEY_NO_ARGS 0x1000002 +/* Passed in before any parsing is done. Afterwards, the values of each + element of the CHILD_INPUT field, if any, in the state structure is + copied to each child's state to be the initial value of the INPUT field. */ +#define ARGP_KEY_INIT 0x1000003 +/* Use after all other keys, including SUCCESS & END. */ +#define ARGP_KEY_FINI 0x1000007 +/* Passed in when parsing has successfully been completed (even if there are + still arguments remaining). */ +#define ARGP_KEY_SUCCESS 0x1000004 +/* Passed in if an error occurs. */ +#define ARGP_KEY_ERROR 0x1000005 + +/* An argp structure contains a set of options declarations, a function to + deal with parsing one, documentation string, a possible vector of child + argp's, and perhaps a function to filter help output. When actually + parsing options, getopt is called with the union of all the argp + structures chained together through their CHILD pointers, with conflicts + being resolved in favor of the first occurrence in the chain. */ +struct argp +{ + /* An array of argp_option structures, terminated by an entry with both + NAME and KEY having a value of 0. */ + const struct argp_option *options; + + /* What to do with an option from this structure. KEY is the key + associated with the option, and ARG is any associated argument (NULL if + none was supplied). If KEY isn't understood, ARGP_ERR_UNKNOWN should be + returned. If a non-zero, non-ARGP_ERR_UNKNOWN value is returned, then + parsing is stopped immediately, and that value is returned from + argp_parse(). For special (non-user-supplied) values of KEY, see the + ARGP_KEY_ definitions below. */ + argp_parser_t parser; + + /* A string describing what other arguments are wanted by this program. It + is only used by argp_usage to print the `Usage:' message. If it + contains newlines, the strings separated by them are considered + alternative usage patterns, and printed on separate lines (lines after + the first are prefix by ` or: ' instead of `Usage:'). */ + const char *args_doc; + + /* If non-NULL, a string containing extra text to be printed before and + after the options in a long help message (separated by a vertical tab + `\v' character). */ + const char *doc; + + /* A vector of argp_children structures, terminated by a member with a 0 + argp field, pointing to child argps should be parsed with this one. Any + conflicts are resolved in favor of this argp, or early argps in the + CHILDREN list. This field is useful if you use libraries that supply + their own argp structure, which you want to use in conjunction with your + own. */ + const struct argp_child *children; + + /* If non-zero, this should be a function to filter the output of help + messages. KEY is either a key from an option, in which case TEXT is + that option's help text, or a special key from the ARGP_KEY_HELP_ + defines, below, describing which other help text TEXT is. The function + should return either TEXT, if it should be used as-is, a replacement + string, which should be malloced, and will be freed by argp, or NULL, + meaning `print nothing'. The value for TEXT is *after* any translation + has been done, so if any of the replacement text also needs translation, + that should be done by the filter function. INPUT is either the input + supplied to argp_parse, or NULL, if argp_help was called directly. */ + char *(*help_filter) (int __key, const char *__text, void *__input); + + /* If non-zero the strings used in the argp library are translated using + the domain described by this string. Otherwise the currently installed + default domain is used. */ + const char *argp_domain; +}; + +/* Possible KEY arguments to a help filter function. */ +#define ARGP_KEY_HELP_PRE_DOC 0x2000001 /* Help text preceeding options. */ +#define ARGP_KEY_HELP_POST_DOC 0x2000002 /* Help text following options. */ +#define ARGP_KEY_HELP_HEADER 0x2000003 /* Option header string. */ +#define ARGP_KEY_HELP_EXTRA 0x2000004 /* After all other documentation; + TEXT is NULL for this key. */ +/* Explanatory note emitted when duplicate option arguments have been + suppressed. */ +#define ARGP_KEY_HELP_DUP_ARGS_NOTE 0x2000005 +#define ARGP_KEY_HELP_ARGS_DOC 0x2000006 /* Argument doc string. */ + +/* When an argp has a non-zero CHILDREN field, it should point to a vector of + argp_child structures, each of which describes a subsidiary argp. */ +struct argp_child +{ + /* The child parser. */ + const struct argp *argp; + + /* Flags for this child. */ + int flags; + + /* If non-zero, an optional header to be printed in help output before the + child options. As a side-effect, a non-zero value forces the child + options to be grouped together; to achieve this effect without actually + printing a header string, use a value of "". */ + const char *header; + + /* Where to group the child options relative to the other (`consolidated') + options in the parent argp; the values are the same as the GROUP field + in argp_option structs, but all child-groupings follow parent options at + a particular group level. If both this field and HEADER are zero, then + they aren't grouped at all, but rather merged with the parent options + (merging the child's grouping levels with the parents). */ + int group; +}; + +/* Parsing state. This is provided to parsing functions called by argp, + which may examine and, as noted, modify fields. */ +struct argp_state +{ + /* The top level ARGP being parsed. */ + const struct argp *root_argp; + + /* The argument vector being parsed. May be modified. */ + int argc; + char **argv; + + /* The index in ARGV of the next arg that to be parsed. May be modified. */ + int next; + + /* The flags supplied to argp_parse. May be modified. */ + unsigned flags; + + /* While calling a parsing function with a key of ARGP_KEY_ARG, this is the + number of the current arg, starting at zero, and incremented after each + such call returns. At all other times, this is the number of such + arguments that have been processed. */ + unsigned arg_num; + + /* If non-zero, the index in ARGV of the first argument following a special + `--' argument (which prevents anything following being interpreted as an + option). Only set once argument parsing has proceeded past this point. */ + int quoted; + + /* An arbitrary pointer passed in from the user. */ + void *input; + /* Values to pass to child parsers. This vector will be the same length as + the number of children for the current parser. */ + void **child_inputs; + + /* For the parser's use. Initialized to 0. */ + void *hook; + + /* The name used when printing messages. This is initialized to ARGV[0], + or PROGRAM_INVOCATION_NAME if that is unavailable. */ + char *name; + + /* Streams used when argp prints something. */ + FILE *err_stream; /* For errors; initialized to stderr. */ + FILE *out_stream; /* For information; initialized to stdout. */ + + void *pstate; /* Private, for use by argp. */ +}; + +/* Flags for argp_parse (note that the defaults are those that are + convenient for program command line parsing): */ + +/* Don't ignore the first element of ARGV. Normally (and always unless + ARGP_NO_ERRS is set) the first element of the argument vector is + skipped for option parsing purposes, as it corresponds to the program name + in a command line. */ +#define ARGP_PARSE_ARGV0 0x01 + +/* Don't print error messages for unknown options to stderr; unless this flag + is set, ARGP_PARSE_ARGV0 is ignored, as ARGV[0] is used as the program + name in the error messages. This flag implies ARGP_NO_EXIT (on the + assumption that silent exiting upon errors is bad behaviour). */ +#define ARGP_NO_ERRS 0x02 + +/* Don't parse any non-option args. Normally non-option args are parsed by + calling the parse functions with a key of ARGP_KEY_ARG, and the actual arg + as the value. Since it's impossible to know which parse function wants to + handle it, each one is called in turn, until one returns 0 or an error + other than ARGP_ERR_UNKNOWN; if an argument is handled by no one, the + argp_parse returns prematurely (but with a return value of 0). If all + args have been parsed without error, all parsing functions are called one + last time with a key of ARGP_KEY_END. This flag needn't normally be set, + as the normal behavior is to stop parsing as soon as some argument can't + be handled. */ +#define ARGP_NO_ARGS 0x04 + +/* Parse options and arguments in the same order they occur on the command + line -- normally they're rearranged so that all options come first. */ +#define ARGP_IN_ORDER 0x08 + +/* Don't provide the standard long option --help, which causes usage and + option help information to be output to stdout, and exit (0) called. */ +#define ARGP_NO_HELP 0x10 + +/* Don't exit on errors (they may still result in error messages). */ +#define ARGP_NO_EXIT 0x20 + +/* Use the gnu getopt `long-only' rules for parsing arguments. */ +#define ARGP_LONG_ONLY 0x40 + +/* Turns off any message-printing/exiting options. */ +#define ARGP_SILENT (ARGP_NO_EXIT | ARGP_NO_ERRS | ARGP_NO_HELP) + +/* Parse the options strings in ARGC & ARGV according to the options in ARGP. + FLAGS is one of the ARGP_ flags above. If ARG_INDEX is non-NULL, the + index in ARGV of the first unparsed option is returned in it. If an + unknown option is present, ARGP_ERR_UNKNOWN is returned; if some parser + routine returned a non-zero value, it is returned; otherwise 0 is + returned. This function may also call exit unless the ARGP_NO_HELP flag + is set. INPUT is a pointer to a value to be passed in to the parser. */ +extern error_t argp_parse (const struct argp *__restrict __argp, + int __argc, char **__restrict __argv, + unsigned __flags, int *__restrict __arg_index, + void *__restrict __input); +extern error_t __argp_parse (const struct argp *__restrict __argp, + int __argc, char **__restrict __argv, + unsigned __flags, int *__restrict __arg_index, + void *__restrict __input); + +/* Global variables. */ + +/* If defined or set by the user program to a non-zero value, then a default + option --version is added (unless the ARGP_NO_HELP flag is used), which + will print this string followed by a newline and exit (unless the + ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */ +extern const char *argp_program_version; + +/* If defined or set by the user program to a non-zero value, then a default + option --version is added (unless the ARGP_NO_HELP flag is used), which + calls this function with a stream to print the version to and a pointer to + the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is + used). This variable takes precedent over ARGP_PROGRAM_VERSION. */ +extern void (*argp_program_version_hook) (FILE *__restrict __stream, + struct argp_state *__restrict + __state); + +/* If defined or set by the user program, it should point to string that is + the bug-reporting address for the program. It will be printed by + argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various + standard help messages), embedded in a sentence that says something like + `Report bugs to ADDR.'. */ +extern const char *argp_program_bug_address; + +/* The exit status that argp will use when exiting due to a parsing error. + If not defined or set by the user program, this defaults to EX_USAGE from + . */ +extern error_t argp_err_exit_status; + +/* Flags for argp_help. */ +#define ARGP_HELP_USAGE 0x01 /* a Usage: message. */ +#define ARGP_HELP_SHORT_USAGE 0x02 /* " but don't actually print options. */ +#define ARGP_HELP_SEE 0x04 /* a `Try ... for more help' message. */ +#define ARGP_HELP_LONG 0x08 /* a long help message. */ +#define ARGP_HELP_PRE_DOC 0x10 /* doc string preceding long help. */ +#define ARGP_HELP_POST_DOC 0x20 /* doc string following long help. */ +#define ARGP_HELP_DOC (ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC) +#define ARGP_HELP_BUG_ADDR 0x40 /* bug report address */ +#define ARGP_HELP_LONG_ONLY 0x80 /* modify output appropriately to + reflect ARGP_LONG_ONLY mode. */ + +/* These ARGP_HELP flags are only understood by argp_state_help. */ +#define ARGP_HELP_EXIT_ERR 0x100 /* Call exit(1) instead of returning. */ +#define ARGP_HELP_EXIT_OK 0x200 /* Call exit(0) instead of returning. */ + +/* The standard thing to do after a program command line parsing error, if an + error message has already been printed. */ +#define ARGP_HELP_STD_ERR \ + (ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR) +/* The standard thing to do after a program command line parsing error, if no + more specific error message has been printed. */ +#define ARGP_HELP_STD_USAGE \ + (ARGP_HELP_SHORT_USAGE | ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR) +/* The standard thing to do in response to a --help option. */ +#define ARGP_HELP_STD_HELP \ + (ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_EXIT_OK \ + | ARGP_HELP_DOC | ARGP_HELP_BUG_ADDR) + +/* Output a usage message for ARGP to STREAM. FLAGS are from the set + ARGP_HELP_*. */ +extern void argp_help (const struct argp *__restrict __argp, + FILE *__restrict __stream, + unsigned __flags, char *__restrict __name); +extern void __argp_help (const struct argp *__restrict __argp, + FILE *__restrict __stream, unsigned __flags, + char *__name); + +/* The following routines are intended to be called from within an argp + parsing routine (thus taking an argp_state structure as the first + argument). They may or may not print an error message and exit, depending + on the flags in STATE -- in any case, the caller should be prepared for + them *not* to exit, and should return an appropiate error after calling + them. [argp_usage & argp_error should probably be called argp_state_..., + but they're used often enough that they should be short] */ + +/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are + from the set ARGP_HELP_*. */ +extern void argp_state_help (const struct argp_state *__restrict __state, + FILE *__restrict __stream, + unsigned int __flags); +extern void __argp_state_help (const struct argp_state *__restrict __state, + FILE *__restrict __stream, + unsigned int __flags); + +/* Possibly output the standard usage message for ARGP to stderr and exit. */ +extern void argp_usage (const struct argp_state *__state); +extern void __argp_usage (const struct argp_state *__state); + +/* If appropriate, print the printf string FMT and following args, preceded + by the program name and `:', to stderr, and followed by a `Try ... --help' + message, then exit (1). */ +extern void argp_error (const struct argp_state *__restrict __state, + const char *__restrict __fmt, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); +extern void __argp_error (const struct argp_state *__restrict __state, + const char *__restrict __fmt, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); + +/* Similar to the standard gnu error-reporting function error(), but will + respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print + to STATE->err_stream. This is useful for argument parsing code that is + shared between program startup (when exiting is desired) and runtime + option parsing (when typically an error code is returned instead). The + difference between this function and argp_error is that the latter is for + *parsing errors*, and the former is for other problems that occur during + parsing but don't reflect a (syntactic) problem with the input. */ +extern void argp_failure (const struct argp_state *__restrict __state, + int __status, int __errnum, + const char *__restrict __fmt, ...) + __attribute__ ((__format__ (__printf__, 4, 5))); +extern void __argp_failure (const struct argp_state *__restrict __state, + int __status, int __errnum, + const char *__restrict __fmt, ...) + __attribute__ ((__format__ (__printf__, 4, 5))); + +/* Returns true if the option OPT is a valid short option. */ +extern int _option_is_short (const struct argp_option *__opt) __THROW; +extern int __option_is_short (const struct argp_option *__opt) __THROW; + +/* Returns true if the option OPT is in fact the last (unused) entry in an + options array. */ +extern int _option_is_end (const struct argp_option *__opt) __THROW; +extern int __option_is_end (const struct argp_option *__opt) __THROW; + +/* Return the input field for ARGP in the parser corresponding to STATE; used + by the help routines. */ +extern void *_argp_input (const struct argp *__restrict __argp, + const struct argp_state *__restrict __state) + __THROW; +extern void *__argp_input (const struct argp *__restrict __argp, + const struct argp_state *__restrict __state) + __THROW; + +#ifdef __USE_EXTERN_INLINES + +# if !_LIBC +# define __argp_usage argp_usage +# define __argp_state_help argp_state_help +# define __option_is_short _option_is_short +# define __option_is_end _option_is_end +# endif + +# ifndef ARGP_EI +# define ARGP_EI extern __inline__ __attribute__ ((gnu_inline)) +# endif + +ARGP_EI void +__argp_usage (const struct argp_state *__state) +{ + __argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE); +} + +ARGP_EI int +__NTH (__option_is_short (const struct argp_option *__opt)) +{ + if (__opt->flags & OPTION_DOC) + return 0; + else + { + int __key = __opt->key; + return __key > 0 && __key <= UCHAR_MAX && isprint (__key); + } +} + +ARGP_EI int +__NTH (__option_is_end (const struct argp_option *__opt)) +{ + return !__opt->key && !__opt->name && !__opt->doc && !__opt->group; +} + +# if !_LIBC +# undef __argp_usage +# undef __argp_state_help +# undef __option_is_short +# undef __option_is_end +# endif +#endif /* Use extern inlines. */ + +#ifdef __cplusplus +} +#endif + +#endif /* argp.h */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-help.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-help.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-help.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-help.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,1930 @@ +/* Hierarchial argument parsing help output + Copyright (C) 1995-2003, 2004, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef USE_IN_LIBIO +# include +#endif + +#ifdef _LIBC +# include +# undef dgettext +# define dgettext(domain, msgid) \ + INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES) +#else +# include "gettext.h" +#endif + +#include "argp.h" +#include "argp-fmtstream.h" +#include "argp-namefrob.h" + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif + +/* User-selectable (using an environment variable) formatting parameters. + + These may be specified in an environment variable called `ARGP_HELP_FMT', + with a contents like: VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2 + Where VALn must be a positive integer. The list of variables is in the + UPARAM_NAMES vector, below. */ + +/* Default parameters. */ +#define DUP_ARGS 0 /* True if option argument can be duplicated. */ +#define DUP_ARGS_NOTE 1 /* True to print a note about duplicate args. */ +#define SHORT_OPT_COL 2 /* column in which short options start */ +#define LONG_OPT_COL 6 /* column in which long options start */ +#define DOC_OPT_COL 2 /* column in which doc options start */ +#define OPT_DOC_COL 29 /* column in which option text starts */ +#define HEADER_COL 1 /* column in which group headers are printed */ +#define USAGE_INDENT 12 /* indentation of wrapped usage lines */ +#define RMARGIN 79 /* right margin used for wrapping */ + +/* User-selectable (using an environment variable) formatting parameters. + They must all be of type `int' for the parsing code to work. */ +struct uparams +{ + /* If true, arguments for an option are shown with both short and long + options, even when a given option has both, e.g. `-x ARG, --longx=ARG'. + If false, then if an option has both, the argument is only shown with + the long one, e.g., `-x, --longx=ARG', and a message indicating that + this really means both is printed below the options. */ + int dup_args; + + /* This is true if when DUP_ARGS is false, and some duplicate arguments have + been suppressed, an explanatory message should be printed. */ + int dup_args_note; + + /* Various output columns. */ + int short_opt_col; /* column in which short options start */ + int long_opt_col; /* column in which long options start */ + int doc_opt_col; /* column in which doc options start */ + int opt_doc_col; /* column in which option text starts */ + int header_col; /* column in which group headers are printed */ + int usage_indent; /* indentation of wrapped usage lines */ + int rmargin; /* right margin used for wrapping */ + + int valid; /* True when the values in here are valid. */ +}; + +/* This is a global variable, as user options are only ever read once. */ +static struct uparams uparams = { + DUP_ARGS, DUP_ARGS_NOTE, + SHORT_OPT_COL, LONG_OPT_COL, DOC_OPT_COL, OPT_DOC_COL, HEADER_COL, + USAGE_INDENT, RMARGIN, + 0 +}; + +/* A particular uparam, and what the user name is. */ +struct uparam_name +{ + const char *name; /* User name. */ + int is_bool; /* Whether it's `boolean'. */ + size_t uparams_offs; /* Location of the (int) field in UPARAMS. */ +}; + +/* The name-field mappings we know about. */ +static const struct uparam_name uparam_names[] = +{ + { "dup-args", 1, offsetof (struct uparams, dup_args) }, + { "dup-args-note", 1, offsetof (struct uparams, dup_args_note) }, + { "short-opt-col", 0, offsetof (struct uparams, short_opt_col) }, + { "long-opt-col", 0, offsetof (struct uparams, long_opt_col) }, + { "doc-opt-col", 0, offsetof (struct uparams, doc_opt_col) }, + { "opt-doc-col", 0, offsetof (struct uparams, opt_doc_col) }, + { "header-col", 0, offsetof (struct uparams, header_col) }, + { "usage-indent", 0, offsetof (struct uparams, usage_indent) }, + { "rmargin", 0, offsetof (struct uparams, rmargin) }, + { 0 } +}; + +static void +validate_uparams (const struct argp_state *state, struct uparams *upptr) +{ + const struct uparam_name *up; + + for (up = uparam_names; up->name; up++) + { + if (up->is_bool + || up->uparams_offs == offsetof (struct uparams, rmargin)) + continue; + if (*(int *)((char *)upptr + up->uparams_offs) >= upptr->rmargin) + { + __argp_failure (state, 0, 0, + dgettext (state->root_argp->argp_domain, + "\ +ARGP_HELP_FMT: %s value is less than or equal to %s"), + "rmargin", up->name); + return; + } + } + uparams = *upptr; + uparams.valid = 1; +} + +/* Read user options from the environment, and fill in UPARAMS appropiately. */ +static void +fill_in_uparams (const struct argp_state *state) +{ + const char *var = getenv ("ARGP_HELP_FMT"); + struct uparams new_params = uparams; + +#define SKIPWS(p) do { while (isspace (*p)) p++; } while (0); + + if (var) + { + /* Parse var. */ + while (*var) + { + SKIPWS (var); + + if (isalpha (*var)) + { + size_t var_len; + const struct uparam_name *un; + int unspec = 0, val = 0; + const char *arg = var; + + while (isalnum (*arg) || *arg == '-' || *arg == '_') + arg++; + var_len = arg - var; + + SKIPWS (arg); + + if (*arg == '\0' || *arg == ',') + unspec = 1; + else if (*arg == '=') + { + arg++; + SKIPWS (arg); + } + + if (unspec) + { + if (var[0] == 'n' && var[1] == 'o' && var[2] == '-') + { + val = 0; + var += 3; + var_len -= 3; + } + else + val = 1; + } + else if (isdigit (*arg)) + { + val = atoi (arg); + while (isdigit (*arg)) + arg++; + SKIPWS (arg); + } + + for (un = uparam_names; un->name; un++) + if (strlen (un->name) == var_len + && strncmp (var, un->name, var_len) == 0) + { + if (unspec && !un->is_bool) + __argp_failure (state, 0, 0, + dgettext (state->root_argp->argp_domain, + "\ +%.*s: ARGP_HELP_FMT parameter requires a value"), + (int) var_len, var); + else if (val < 0) + __argp_failure (state, 0, 0, + dgettext (state->root_argp->argp_domain, + "\ +%.*s: ARGP_HELP_FMT parameter must be positive"), + (int) var_len, var); + else + *(int *)((char *)&new_params + un->uparams_offs) = val; + break; + } + if (! un->name) + __argp_failure (state, 0, 0, + dgettext (state->root_argp->argp_domain, "\ +%.*s: Unknown ARGP_HELP_FMT parameter"), + (int) var_len, var); + + var = arg; + if (*var == ',') + var++; + } + else if (*var) + { + __argp_failure (state, 0, 0, + dgettext (state->root_argp->argp_domain, + "Garbage in ARGP_HELP_FMT: %s"), var); + break; + } + } + validate_uparams (state, &new_params); + } +} + +/* Returns true if OPT hasn't been marked invisible. Visibility only affects + whether OPT is displayed or used in sorting, not option shadowing. */ +#define ovisible(opt) (! ((opt)->flags & OPTION_HIDDEN)) + +/* Returns true if OPT is an alias for an earlier option. */ +#define oalias(opt) ((opt)->flags & OPTION_ALIAS) + +/* Returns true if OPT is an documentation-only entry. */ +#define odoc(opt) ((opt)->flags & OPTION_DOC) + +/* Returns true if OPT should not be translated */ +#define onotrans(opt) ((opt)->flags & OPTION_NO_TRANS) + +/* Returns true if OPT is the end-of-list marker for a list of options. */ +#define oend(opt) __option_is_end (opt) + +/* Returns true if OPT has a short option. */ +#define oshort(opt) __option_is_short (opt) + +/* + The help format for a particular option is like: + + -xARG, -yARG, --long1=ARG, --long2=ARG Documentation... + + Where ARG will be omitted if there's no argument, for this option, or + will be surrounded by "[" and "]" appropiately if the argument is + optional. The documentation string is word-wrapped appropiately, and if + the list of options is long enough, it will be started on a separate line. + If there are no short options for a given option, the first long option is + indented slighly in a way that's supposed to make most long options appear + to be in a separate column. + + For example, the following output (from ps): + + -p PID, --pid=PID List the process PID + --pgrp=PGRP List processes in the process group PGRP + -P, -x, --no-parent Include processes without parents + -Q, --all-fields Don't elide unusable fields (normally if there's + some reason ps can't print a field for any + process, it's removed from the output entirely) + -r, --reverse, --gratuitously-long-reverse-option + Reverse the order of any sort + --session[=SID] Add the processes from the session SID (which + defaults to the sid of the current process) + + Here are some more options: + -f ZOT, --foonly=ZOT Glork a foonly + -z, --zaza Snit a zar + + -?, --help Give this help list + --usage Give a short usage message + -V, --version Print program version + + The struct argp_option array for the above could look like: + + { + {"pid", 'p', "PID", 0, "List the process PID"}, + {"pgrp", OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"}, + {"no-parent", 'P', 0, 0, "Include processes without parents"}, + {0, 'x', 0, OPTION_ALIAS}, + {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally" + " if there's some reason ps can't" + " print a field for any process, it's" + " removed from the output entirely)" }, + {"reverse", 'r', 0, 0, "Reverse the order of any sort"}, + {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS}, + {"session", OPT_SESS, "SID", OPTION_ARG_OPTIONAL, + "Add the processes from the session" + " SID (which defaults to the sid of" + " the current process)" }, + + {0,0,0,0, "Here are some more options:"}, + {"foonly", 'f', "ZOT", 0, "Glork a foonly"}, + {"zaza", 'z', 0, 0, "Snit a zar"}, + + {0} + } + + Note that the last three options are automatically supplied by argp_parse, + unless you tell it not to with ARGP_NO_HELP. + +*/ + +/* Returns true if CH occurs between BEG and END. */ +static int +find_char (char ch, char *beg, char *end) +{ + while (beg < end) + if (*beg == ch) + return 1; + else + beg++; + return 0; +} + +struct hol_cluster; /* fwd decl */ + +struct hol_entry +{ + /* First option. */ + const struct argp_option *opt; + /* Number of options (including aliases). */ + unsigned num; + + /* A pointers into the HOL's short_options field, to the first short option + letter for this entry. The order of the characters following this point + corresponds to the order of options pointed to by OPT, and there are at + most NUM. A short option recorded in a option following OPT is only + valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's + probably been shadowed by some other entry). */ + char *short_options; + + /* Entries are sorted by their group first, in the order: + 1, 2, ..., n, 0, -m, ..., -2, -1 + and then alphabetically within each group. The default is 0. */ + int group; + + /* The cluster of options this entry belongs to, or 0 if none. */ + struct hol_cluster *cluster; + + /* The argp from which this option came. */ + const struct argp *argp; +}; + +/* A cluster of entries to reflect the argp tree structure. */ +struct hol_cluster +{ + /* A descriptive header printed before options in this cluster. */ + const char *header; + + /* Used to order clusters within the same group with the same parent, + according to the order in which they occurred in the parent argp's child + list. */ + int index; + + /* How to sort this cluster with respect to options and other clusters at the + same depth (clusters always follow options in the same group). */ + int group; + + /* The cluster to which this cluster belongs, or 0 if it's at the base + level. */ + struct hol_cluster *parent; + + /* The argp from which this cluster is (eventually) derived. */ + const struct argp *argp; + + /* The distance this cluster is from the root. */ + int depth; + + /* Clusters in a given hol are kept in a linked list, to make freeing them + possible. */ + struct hol_cluster *next; +}; + +/* A list of options for help. */ +struct hol +{ + /* An array of hol_entry's. */ + struct hol_entry *entries; + /* The number of entries in this hol. If this field is zero, the others + are undefined. */ + unsigned num_entries; + + /* A string containing all short options in this HOL. Each entry contains + pointers into this string, so the order can't be messed with blindly. */ + char *short_options; + + /* Clusters of entries in this hol. */ + struct hol_cluster *clusters; +}; + +/* Create a struct hol from the options in ARGP. CLUSTER is the + hol_cluster in which these entries occur, or 0, if at the root. */ +static struct hol * +make_hol (const struct argp *argp, struct hol_cluster *cluster) +{ + char *so; + const struct argp_option *o; + const struct argp_option *opts = argp->options; + struct hol_entry *entry; + unsigned num_short_options = 0; + struct hol *hol = malloc (sizeof (struct hol)); + + assert (hol); + + hol->num_entries = 0; + hol->clusters = 0; + + if (opts) + { + int cur_group = 0; + + /* The first option must not be an alias. */ + assert (! oalias (opts)); + + /* Calculate the space needed. */ + for (o = opts; ! oend (o); o++) + { + if (! oalias (o)) + hol->num_entries++; + if (oshort (o)) + num_short_options++; /* This is an upper bound. */ + } + + hol->entries = malloc (sizeof (struct hol_entry) * hol->num_entries); + hol->short_options = malloc (num_short_options + 1); + + assert (hol->entries && hol->short_options); + if (SIZE_MAX <= UINT_MAX) + assert (hol->num_entries <= SIZE_MAX / sizeof (struct hol_entry)); + + /* Fill in the entries. */ + so = hol->short_options; + for (o = opts, entry = hol->entries; ! oend (o); entry++) + { + entry->opt = o; + entry->num = 0; + entry->short_options = so; + entry->group = cur_group = + o->group + ? o->group + : ((!o->name && !o->key) + ? cur_group + 1 + : cur_group); + entry->cluster = cluster; + entry->argp = argp; + + do + { + entry->num++; + if (oshort (o) && ! find_char (o->key, hol->short_options, so)) + /* O has a valid short option which hasn't already been used.*/ + *so++ = o->key; + o++; + } + while (! oend (o) && oalias (o)); + } + *so = '\0'; /* null terminated so we can find the length */ + } + + return hol; +} + +/* Add a new cluster to HOL, with the given GROUP and HEADER (taken from the + associated argp child list entry), INDEX, and PARENT, and return a pointer + to it. ARGP is the argp that this cluster results from. */ +static struct hol_cluster * +hol_add_cluster (struct hol *hol, int group, const char *header, int index, + struct hol_cluster *parent, const struct argp *argp) +{ + struct hol_cluster *cl = malloc (sizeof (struct hol_cluster)); + if (cl) + { + cl->group = group; + cl->header = header; + + cl->index = index; + cl->parent = parent; + cl->argp = argp; + cl->depth = parent ? parent->depth + 1 : 0; + + cl->next = hol->clusters; + hol->clusters = cl; + } + return cl; +} + +/* Free HOL and any resources it uses. */ +static void +hol_free (struct hol *hol) +{ + struct hol_cluster *cl = hol->clusters; + + while (cl) + { + struct hol_cluster *next = cl->next; + free (cl); + cl = next; + } + + if (hol->num_entries > 0) + { + free (hol->entries); + free (hol->short_options); + } + + free (hol); +} + +static int +hol_entry_short_iterate (const struct hol_entry *entry, + int (*func)(const struct argp_option *opt, + const struct argp_option *real, + const char *domain, void *cookie), + const char *domain, void *cookie) +{ + unsigned nopts; + int val = 0; + const struct argp_option *opt, *real = entry->opt; + char *so = entry->short_options; + + for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--) + if (oshort (opt) && *so == opt->key) + { + if (!oalias (opt)) + real = opt; + if (ovisible (opt)) + val = (*func)(opt, real, domain, cookie); + so++; + } + + return val; +} + +static inline int +__attribute__ ((always_inline)) +hol_entry_long_iterate (const struct hol_entry *entry, + int (*func)(const struct argp_option *opt, + const struct argp_option *real, + const char *domain, void *cookie), + const char *domain, void *cookie) +{ + unsigned nopts; + int val = 0; + const struct argp_option *opt, *real = entry->opt; + + for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--) + if (opt->name) + { + if (!oalias (opt)) + real = opt; + if (ovisible (opt)) + val = (*func)(opt, real, domain, cookie); + } + + return val; +} + +/* Iterator that returns true for the first short option. */ +static inline int +until_short (const struct argp_option *opt, const struct argp_option *real, + const char *domain, void *cookie) +{ + return oshort (opt) ? opt->key : 0; +} + +/* Returns the first valid short option in ENTRY, or 0 if there is none. */ +static char +hol_entry_first_short (const struct hol_entry *entry) +{ + return hol_entry_short_iterate (entry, until_short, + entry->argp->argp_domain, 0); +} + +/* Returns the first valid long option in ENTRY, or 0 if there is none. */ +static const char * +hol_entry_first_long (const struct hol_entry *entry) +{ + const struct argp_option *opt; + unsigned num; + for (opt = entry->opt, num = entry->num; num > 0; opt++, num--) + if (opt->name && ovisible (opt)) + return opt->name; + return 0; +} + +/* Returns the entry in HOL with the long option name NAME, or 0 if there is + none. */ +static struct hol_entry * +hol_find_entry (struct hol *hol, const char *name) +{ + struct hol_entry *entry = hol->entries; + unsigned num_entries = hol->num_entries; + + while (num_entries-- > 0) + { + const struct argp_option *opt = entry->opt; + unsigned num_opts = entry->num; + + while (num_opts-- > 0) + if (opt->name && ovisible (opt) && strcmp (opt->name, name) == 0) + return entry; + else + opt++; + + entry++; + } + + return 0; +} + +/* If an entry with the long option NAME occurs in HOL, set it's special + sort position to GROUP. */ +static void +hol_set_group (struct hol *hol, const char *name, int group) +{ + struct hol_entry *entry = hol_find_entry (hol, name); + if (entry) + entry->group = group; +} + +/* Order by group: 0, 1, 2, ..., n, -m, ..., -2, -1. + EQ is what to return if GROUP1 and GROUP2 are the same. */ +static int +group_cmp (int group1, int group2, int eq) +{ + if (group1 == group2) + return eq; + else if ((group1 < 0 && group2 < 0) || (group1 >= 0 && group2 >= 0)) + return group1 - group2; + else + return group2 - group1; +} + +/* Compare clusters CL1 & CL2 by the order that they should appear in + output. */ +static int +hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2) +{ + /* If one cluster is deeper than the other, use its ancestor at the same + level, so that finding the common ancestor is straightforward. */ + while (cl1->depth < cl2->depth) + cl1 = cl1->parent; + while (cl2->depth < cl1->depth) + cl2 = cl2->parent; + + /* Now reduce both clusters to their ancestors at the point where both have + a common parent; these can be directly compared. */ + while (cl1->parent != cl2->parent) + cl1 = cl1->parent, cl2 = cl2->parent; + + return group_cmp (cl1->group, cl2->group, cl2->index - cl1->index); +} + +/* Return the ancestor of CL that's just below the root (i.e., has a parent + of 0). */ +static struct hol_cluster * +hol_cluster_base (struct hol_cluster *cl) +{ + while (cl->parent) + cl = cl->parent; + return cl; +} + +/* Return true if CL1 is a child of CL2. */ +static int +hol_cluster_is_child (const struct hol_cluster *cl1, + const struct hol_cluster *cl2) +{ + while (cl1 && cl1 != cl2) + cl1 = cl1->parent; + return cl1 == cl2; +} + +/* Given the name of a OPTION_DOC option, modifies NAME to start at the tail + that should be used for comparisons, and returns true iff it should be + treated as a non-option. */ +static int +canon_doc_option (const char **name) +{ + int non_opt; + + if (!*name) + non_opt = 1; + else + { + /* Skip initial whitespace. */ + while (isspace (**name)) + (*name)++; + /* Decide whether this looks like an option (leading `-') or not. */ + non_opt = (**name != '-'); + /* Skip until part of name used for sorting. */ + while (**name && !isalnum (**name)) + (*name)++; + } + return non_opt; +} + +/* Order ENTRY1 & ENTRY2 by the order which they should appear in a help + listing. */ +static int +hol_entry_cmp (const struct hol_entry *entry1, + const struct hol_entry *entry2) +{ + /* The group numbers by which the entries should be ordered; if either is + in a cluster, then this is just the group within the cluster. */ + int group1 = entry1->group, group2 = entry2->group; + + if (entry1->cluster != entry2->cluster) + { + /* The entries are not within the same cluster, so we can't compare them + directly, we have to use the appropiate clustering level too. */ + if (! entry1->cluster) + /* ENTRY1 is at the `base level', not in a cluster, so we have to + compare it's group number with that of the base cluster in which + ENTRY2 resides. Note that if they're in the same group, the + clustered option always comes laster. */ + return group_cmp (group1, hol_cluster_base (entry2->cluster)->group, -1); + else if (! entry2->cluster) + /* Likewise, but ENTRY2's not in a cluster. */ + return group_cmp (hol_cluster_base (entry1->cluster)->group, group2, 1); + else + /* Both entries are in clusters, we can just compare the clusters. */ + return hol_cluster_cmp (entry1->cluster, entry2->cluster); + } + else if (group1 == group2) + /* The entries are both in the same cluster and group, so compare them + alphabetically. */ + { + int short1 = hol_entry_first_short (entry1); + int short2 = hol_entry_first_short (entry2); + int doc1 = odoc (entry1->opt); + int doc2 = odoc (entry2->opt); + const char *long1 = hol_entry_first_long (entry1); + const char *long2 = hol_entry_first_long (entry2); + + if (doc1) + doc1 = canon_doc_option (&long1); + if (doc2) + doc2 = canon_doc_option (&long2); + + if (doc1 != doc2) + /* `documentation' options always follow normal options (or + documentation options that *look* like normal options). */ + return doc1 - doc2; + else if (!short1 && !short2 && long1 && long2) + /* Only long options. */ + return __strcasecmp (long1, long2); + else + /* Compare short/short, long/short, short/long, using the first + character of long options. Entries without *any* valid + options (such as options with OPTION_HIDDEN set) will be put + first, but as they're not displayed, it doesn't matter where + they are. */ + { + char first1 = short1 ? short1 : long1 ? *long1 : 0; + char first2 = short2 ? short2 : long2 ? *long2 : 0; +#ifdef _tolower + int lower_cmp = _tolower (first1) - _tolower (first2); +#else + int lower_cmp = tolower (first1) - tolower (first2); +#endif + /* Compare ignoring case, except when the options are both the + same letter, in which case lower-case always comes first. */ + return lower_cmp ? lower_cmp : first2 - first1; + } + } + else + /* Within the same cluster, but not the same group, so just compare + groups. */ + return group_cmp (group1, group2, 0); +} + +/* Version of hol_entry_cmp with correct signature for qsort. */ +static int +hol_entry_qcmp (const void *entry1_v, const void *entry2_v) +{ + return hol_entry_cmp (entry1_v, entry2_v); +} + +/* Sort HOL by group and alphabetically by option name (with short options + taking precedence over long). Since the sorting is for display purposes + only, the shadowing of options isn't effected. */ +static void +hol_sort (struct hol *hol) +{ + if (hol->num_entries > 0) + qsort (hol->entries, hol->num_entries, sizeof (struct hol_entry), + hol_entry_qcmp); +} + +/* Append MORE to HOL, destroying MORE in the process. Options in HOL shadow + any in MORE with the same name. */ +static void +hol_append (struct hol *hol, struct hol *more) +{ + struct hol_cluster **cl_end = &hol->clusters; + + /* Steal MORE's cluster list, and add it to the end of HOL's. */ + while (*cl_end) + cl_end = &(*cl_end)->next; + *cl_end = more->clusters; + more->clusters = 0; + + /* Merge entries. */ + if (more->num_entries > 0) + { + if (hol->num_entries == 0) + { + hol->num_entries = more->num_entries; + hol->entries = more->entries; + hol->short_options = more->short_options; + more->num_entries = 0; /* Mark MORE's fields as invalid. */ + } + else + /* Append the entries in MORE to those in HOL, taking care to only add + non-shadowed SHORT_OPTIONS values. */ + { + unsigned left; + char *so, *more_so; + struct hol_entry *e; + unsigned num_entries = hol->num_entries + more->num_entries; + struct hol_entry *entries = + malloc (num_entries * sizeof (struct hol_entry)); + unsigned hol_so_len = strlen (hol->short_options); + char *short_options = + malloc (hol_so_len + strlen (more->short_options) + 1); + + assert (entries && short_options); + if (SIZE_MAX <= UINT_MAX) + assert (num_entries <= SIZE_MAX / sizeof (struct hol_entry)); + + __mempcpy (__mempcpy (entries, hol->entries, + hol->num_entries * sizeof (struct hol_entry)), + more->entries, + more->num_entries * sizeof (struct hol_entry)); + + __mempcpy (short_options, hol->short_options, hol_so_len); + + /* Fix up the short options pointers from HOL. */ + for (e = entries, left = hol->num_entries; left > 0; e++, left--) + e->short_options += (short_options - hol->short_options); + + /* Now add the short options from MORE, fixing up its entries + too. */ + so = short_options + hol_so_len; + more_so = more->short_options; + for (left = more->num_entries; left > 0; e++, left--) + { + int opts_left; + const struct argp_option *opt; + + e->short_options = so; + + for (opts_left = e->num, opt = e->opt; opts_left; opt++, opts_left--) + { + int ch = *more_so; + if (oshort (opt) && ch == opt->key) + /* The next short option in MORE_SO, CH, is from OPT. */ + { + if (! find_char (ch, short_options, + short_options + hol_so_len)) + /* The short option CH isn't shadowed by HOL's options, + so add it to the sum. */ + *so++ = ch; + more_so++; + } + } + } + + *so = '\0'; + + free (hol->entries); + free (hol->short_options); + + hol->entries = entries; + hol->num_entries = num_entries; + hol->short_options = short_options; + } + } + + hol_free (more); +} + +/* Inserts enough spaces to make sure STREAM is at column COL. */ +static void +indent_to (argp_fmtstream_t stream, unsigned col) +{ + int needed = col - __argp_fmtstream_point (stream); + while (needed-- > 0) + __argp_fmtstream_putc (stream, ' '); +} + +/* Output to STREAM either a space, or a newline if there isn't room for at + least ENSURE characters before the right margin. */ +static void +space (argp_fmtstream_t stream, size_t ensure) +{ + if (__argp_fmtstream_point (stream) + ensure + >= __argp_fmtstream_rmargin (stream)) + __argp_fmtstream_putc (stream, '\n'); + else + __argp_fmtstream_putc (stream, ' '); +} + +/* If the option REAL has an argument, we print it in using the printf + format REQ_FMT or OPT_FMT depending on whether it's a required or + optional argument. */ +static void +arg (const struct argp_option *real, const char *req_fmt, const char *opt_fmt, + const char *domain, argp_fmtstream_t stream) +{ + if (real->arg) + { + if (real->flags & OPTION_ARG_OPTIONAL) + __argp_fmtstream_printf (stream, opt_fmt, + dgettext (domain, real->arg)); + else + __argp_fmtstream_printf (stream, req_fmt, + dgettext (domain, real->arg)); + } +} + +/* Helper functions for hol_entry_help. */ + +/* State used during the execution of hol_help. */ +struct hol_help_state +{ + /* PREV_ENTRY should contain the previous entry printed, or 0. */ + struct hol_entry *prev_entry; + + /* If an entry is in a different group from the previous one, and SEP_GROUPS + is true, then a blank line will be printed before any output. */ + int sep_groups; + + /* True if a duplicate option argument was suppressed (only ever set if + UPARAMS.dup_args is false). */ + int suppressed_dup_arg; +}; + +/* Some state used while printing a help entry (used to communicate with + helper functions). See the doc for hol_entry_help for more info, as most + of the fields are copied from its arguments. */ +struct pentry_state +{ + const struct hol_entry *entry; + argp_fmtstream_t stream; + struct hol_help_state *hhstate; + + /* True if nothing's been printed so far. */ + int first; + + /* If non-zero, the state that was used to print this help. */ + const struct argp_state *state; +}; + +/* If a user doc filter should be applied to DOC, do so. */ +static const char * +filter_doc (const char *doc, int key, const struct argp *argp, + const struct argp_state *state) +{ + if (argp->help_filter) + /* We must apply a user filter to this output. */ + { + void *input = __argp_input (argp, state); + return (*argp->help_filter) (key, doc, input); + } + else + /* No filter. */ + return doc; +} + +/* Prints STR as a header line, with the margin lines set appropiately, and + notes the fact that groups should be separated with a blank line. ARGP is + the argp that should dictate any user doc filtering to take place. Note + that the previous wrap margin isn't restored, but the left margin is reset + to 0. */ +static void +print_header (const char *str, const struct argp *argp, + struct pentry_state *pest) +{ + const char *tstr = dgettext (argp->argp_domain, str); + const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_HEADER, argp, pest->state); + + if (fstr) + { + if (*fstr) + { + if (pest->hhstate->prev_entry) + /* Precede with a blank line. */ + __argp_fmtstream_putc (pest->stream, '\n'); + indent_to (pest->stream, uparams.header_col); + __argp_fmtstream_set_lmargin (pest->stream, uparams.header_col); + __argp_fmtstream_set_wmargin (pest->stream, uparams.header_col); + __argp_fmtstream_puts (pest->stream, fstr); + __argp_fmtstream_set_lmargin (pest->stream, 0); + __argp_fmtstream_putc (pest->stream, '\n'); + } + + pest->hhstate->sep_groups = 1; /* Separate subsequent groups. */ + } + + if (fstr != tstr) + free ((char *) fstr); +} + +/* Inserts a comma if this isn't the first item on the line, and then makes + sure we're at least to column COL. If this *is* the first item on a line, + prints any pending whitespace/headers that should precede this line. Also + clears FIRST. */ +static void +comma (unsigned col, struct pentry_state *pest) +{ + if (pest->first) + { + const struct hol_entry *pe = pest->hhstate->prev_entry; + const struct hol_cluster *cl = pest->entry->cluster; + + if (pest->hhstate->sep_groups && pe && pest->entry->group != pe->group) + __argp_fmtstream_putc (pest->stream, '\n'); + + if (cl && cl->header && *cl->header + && (!pe + || (pe->cluster != cl + && !hol_cluster_is_child (pe->cluster, cl)))) + /* If we're changing clusters, then this must be the start of the + ENTRY's cluster unless that is an ancestor of the previous one + (in which case we had just popped into a sub-cluster for a bit). + If so, then print the cluster's header line. */ + { + int old_wm = __argp_fmtstream_wmargin (pest->stream); + print_header (cl->header, cl->argp, pest); + __argp_fmtstream_set_wmargin (pest->stream, old_wm); + } + + pest->first = 0; + } + else + __argp_fmtstream_puts (pest->stream, ", "); + + indent_to (pest->stream, col); +} + +/* Print help for ENTRY to STREAM. */ +static void +hol_entry_help (struct hol_entry *entry, const struct argp_state *state, + argp_fmtstream_t stream, struct hol_help_state *hhstate) +{ + unsigned num; + const struct argp_option *real = entry->opt, *opt; + char *so = entry->short_options; + int have_long_opt = 0; /* We have any long options. */ + /* Saved margins. */ + int old_lm = __argp_fmtstream_set_lmargin (stream, 0); + int old_wm = __argp_fmtstream_wmargin (stream); + /* PEST is a state block holding some of our variables that we'd like to + share with helper functions. */ + struct pentry_state pest; + + pest.entry = entry; + pest.stream = stream; + pest.hhstate = hhstate; + pest.first = 1; + pest.state = state; + + if (! odoc (real)) + for (opt = real, num = entry->num; num > 0; opt++, num--) + if (opt->name && ovisible (opt)) + { + have_long_opt = 1; + break; + } + + /* First emit short options. */ + __argp_fmtstream_set_wmargin (stream, uparams.short_opt_col); /* For truly bizarre cases. */ + for (opt = real, num = entry->num; num > 0; opt++, num--) + if (oshort (opt) && opt->key == *so) + /* OPT has a valid (non shadowed) short option. */ + { + if (ovisible (opt)) + { + comma (uparams.short_opt_col, &pest); + __argp_fmtstream_putc (stream, '-'); + __argp_fmtstream_putc (stream, *so); + if (!have_long_opt || uparams.dup_args) + arg (real, " %s", "[%s]", state->root_argp->argp_domain, stream); + else if (real->arg) + hhstate->suppressed_dup_arg = 1; + } + so++; + } + + /* Now, long options. */ + if (odoc (real)) + /* A `documentation' option. */ + { + __argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col); + for (opt = real, num = entry->num; num > 0; opt++, num--) + if (opt->name && *opt->name && ovisible (opt)) + { + comma (uparams.doc_opt_col, &pest); + /* Calling dgettext here isn't quite right, since sorting will + have been done on the original; but documentation options + should be pretty rare anyway... */ + __argp_fmtstream_puts (stream, + onotrans (opt) ? + opt->name : + dgettext (state->root_argp->argp_domain, + opt->name)); + } + } + else + /* A real long option. */ + { + int first_long_opt = 1; + + __argp_fmtstream_set_wmargin (stream, uparams.long_opt_col); + for (opt = real, num = entry->num; num > 0; opt++, num--) + if (opt->name && ovisible (opt)) + { + comma (uparams.long_opt_col, &pest); + __argp_fmtstream_printf (stream, "--%s", opt->name); + if (first_long_opt || uparams.dup_args) + arg (real, "=%s", "[=%s]", state->root_argp->argp_domain, + stream); + else if (real->arg) + hhstate->suppressed_dup_arg = 1; + } + } + + /* Next, documentation strings. */ + __argp_fmtstream_set_lmargin (stream, 0); + + if (pest.first) + { + /* Didn't print any switches, what's up? */ + if (!oshort (real) && !real->name) + /* This is a group header, print it nicely. */ + print_header (real->doc, entry->argp, &pest); + else + /* Just a totally shadowed option or null header; print nothing. */ + goto cleanup; /* Just return, after cleaning up. */ + } + else + { + const char *tstr = real->doc ? dgettext (state->root_argp->argp_domain, + real->doc) : 0; + const char *fstr = filter_doc (tstr, real->key, entry->argp, state); + if (fstr && *fstr) + { + unsigned int col = __argp_fmtstream_point (stream); + + __argp_fmtstream_set_lmargin (stream, uparams.opt_doc_col); + __argp_fmtstream_set_wmargin (stream, uparams.opt_doc_col); + + if (col > (unsigned int) (uparams.opt_doc_col + 3)) + __argp_fmtstream_putc (stream, '\n'); + else if (col >= (unsigned int) uparams.opt_doc_col) + __argp_fmtstream_puts (stream, " "); + else + indent_to (stream, uparams.opt_doc_col); + + __argp_fmtstream_puts (stream, fstr); + } + if (fstr && fstr != tstr) + free ((char *) fstr); + + /* Reset the left margin. */ + __argp_fmtstream_set_lmargin (stream, 0); + __argp_fmtstream_putc (stream, '\n'); + } + + hhstate->prev_entry = entry; + +cleanup: + __argp_fmtstream_set_lmargin (stream, old_lm); + __argp_fmtstream_set_wmargin (stream, old_wm); +} + +/* Output a long help message about the options in HOL to STREAM. */ +static void +hol_help (struct hol *hol, const struct argp_state *state, + argp_fmtstream_t stream) +{ + unsigned num; + struct hol_entry *entry; + struct hol_help_state hhstate = { 0, 0, 0 }; + + for (entry = hol->entries, num = hol->num_entries; num > 0; entry++, num--) + hol_entry_help (entry, state, stream, &hhstate); + + if (hhstate.suppressed_dup_arg && uparams.dup_args_note) + { + const char *tstr = dgettext (state->root_argp->argp_domain, "\ +Mandatory or optional arguments to long options are also mandatory or \ +optional for any corresponding short options."); + const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE, + state ? state->root_argp : 0, state); + if (fstr && *fstr) + { + __argp_fmtstream_putc (stream, '\n'); + __argp_fmtstream_puts (stream, fstr); + __argp_fmtstream_putc (stream, '\n'); + } + if (fstr && fstr != tstr) + free ((char *) fstr); + } +} + +/* Helper functions for hol_usage. */ + +/* If OPT is a short option without an arg, append its key to the string + pointer pointer to by COOKIE, and advance the pointer. */ +static int +add_argless_short_opt (const struct argp_option *opt, + const struct argp_option *real, + const char *domain, void *cookie) +{ + char **snao_end = cookie; + if (!(opt->arg || real->arg) + && !((opt->flags | real->flags) & OPTION_NO_USAGE)) + *(*snao_end)++ = opt->key; + return 0; +} + +/* If OPT is a short option with an arg, output a usage entry for it to the + stream pointed at by COOKIE. */ +static int +usage_argful_short_opt (const struct argp_option *opt, + const struct argp_option *real, + const char *domain, void *cookie) +{ + argp_fmtstream_t stream = cookie; + const char *arg = opt->arg; + int flags = opt->flags | real->flags; + + if (! arg) + arg = real->arg; + + if (arg && !(flags & OPTION_NO_USAGE)) + { + arg = dgettext (domain, arg); + + if (flags & OPTION_ARG_OPTIONAL) + __argp_fmtstream_printf (stream, " [-%c[%s]]", opt->key, arg); + else + { + /* Manually do line wrapping so that it (probably) won't + get wrapped at the embedded space. */ + space (stream, 6 + strlen (arg)); + __argp_fmtstream_printf (stream, "[-%c %s]", opt->key, arg); + } + } + + return 0; +} + +/* Output a usage entry for the long option opt to the stream pointed at by + COOKIE. */ +static int +usage_long_opt (const struct argp_option *opt, + const struct argp_option *real, + const char *domain, void *cookie) +{ + argp_fmtstream_t stream = cookie; + const char *arg = opt->arg; + int flags = opt->flags | real->flags; + + if (! arg) + arg = real->arg; + + if (! (flags & OPTION_NO_USAGE) && !odoc (opt)) + { + if (arg) + { + arg = dgettext (domain, arg); + if (flags & OPTION_ARG_OPTIONAL) + __argp_fmtstream_printf (stream, " [--%s[=%s]]", opt->name, arg); + else + __argp_fmtstream_printf (stream, " [--%s=%s]", opt->name, arg); + } + else + __argp_fmtstream_printf (stream, " [--%s]", opt->name); + } + + return 0; +} + +/* Print a short usage description for the arguments in HOL to STREAM. */ +static void +hol_usage (struct hol *hol, argp_fmtstream_t stream) +{ + if (hol->num_entries > 0) + { + unsigned nentries; + struct hol_entry *entry; + char *short_no_arg_opts = alloca (strlen (hol->short_options) + 1); + char *snao_end = short_no_arg_opts; + + /* First we put a list of short options without arguments. */ + for (entry = hol->entries, nentries = hol->num_entries + ; nentries > 0 + ; entry++, nentries--) + hol_entry_short_iterate (entry, add_argless_short_opt, + entry->argp->argp_domain, &snao_end); + if (snao_end > short_no_arg_opts) + { + *snao_end++ = 0; + __argp_fmtstream_printf (stream, " [-%s]", short_no_arg_opts); + } + + /* Now a list of short options *with* arguments. */ + for (entry = hol->entries, nentries = hol->num_entries + ; nentries > 0 + ; entry++, nentries--) + hol_entry_short_iterate (entry, usage_argful_short_opt, + entry->argp->argp_domain, stream); + + /* Finally, a list of long options (whew!). */ + for (entry = hol->entries, nentries = hol->num_entries + ; nentries > 0 + ; entry++, nentries--) + hol_entry_long_iterate (entry, usage_long_opt, + entry->argp->argp_domain, stream); + } +} + +/* Make a HOL containing all levels of options in ARGP. CLUSTER is the + cluster in which ARGP's entries should be clustered, or 0. */ +static struct hol * +argp_hol (const struct argp *argp, struct hol_cluster *cluster) +{ + const struct argp_child *child = argp->children; + struct hol *hol = make_hol (argp, cluster); + if (child) + while (child->argp) + { + struct hol_cluster *child_cluster = + ((child->group || child->header) + /* Put CHILD->argp within its own cluster. */ + ? hol_add_cluster (hol, child->group, child->header, + child - argp->children, cluster, argp) + /* Just merge it into the parent's cluster. */ + : cluster); + hol_append (hol, argp_hol (child->argp, child_cluster)) ; + child++; + } + return hol; +} + +/* Calculate how many different levels with alternative args strings exist in + ARGP. */ +static size_t +argp_args_levels (const struct argp *argp) +{ + size_t levels = 0; + const struct argp_child *child = argp->children; + + if (argp->args_doc && strchr (argp->args_doc, '\n')) + levels++; + + if (child) + while (child->argp) + levels += argp_args_levels ((child++)->argp); + + return levels; +} + +/* Print all the non-option args documented in ARGP to STREAM. Any output is + preceded by a space. LEVELS is a pointer to a byte vector the length + returned by argp_args_levels; it should be initialized to zero, and + updated by this routine for the next call if ADVANCE is true. True is + returned as long as there are more patterns to output. */ +static int +argp_args_usage (const struct argp *argp, const struct argp_state *state, + char **levels, int advance, argp_fmtstream_t stream) +{ + char *our_level = *levels; + int multiple = 0; + const struct argp_child *child = argp->children; + const char *tdoc = dgettext (argp->argp_domain, argp->args_doc), *nl = 0; + const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state); + + if (fdoc) + { + const char *cp = fdoc; + nl = __strchrnul (cp, '\n'); + if (*nl != '\0') + /* This is a `multi-level' args doc; advance to the correct position + as determined by our state in LEVELS, and update LEVELS. */ + { + int i; + multiple = 1; + for (i = 0; i < *our_level; i++) + cp = nl + 1, nl = __strchrnul (cp, '\n'); + (*levels)++; + } + + /* Manually do line wrapping so that it (probably) won't get wrapped at + any embedded spaces. */ + space (stream, 1 + nl - cp); + + __argp_fmtstream_write (stream, cp, nl - cp); + } + if (fdoc && fdoc != tdoc) + free ((char *)fdoc); /* Free user's modified doc string. */ + + if (child) + while (child->argp) + advance = !argp_args_usage ((child++)->argp, state, levels, advance, stream); + + if (advance && multiple) + { + /* Need to increment our level. */ + if (*nl) + /* There's more we can do here. */ + { + (*our_level)++; + advance = 0; /* Our parent shouldn't advance also. */ + } + else if (*our_level > 0) + /* We had multiple levels, but used them up; reset to zero. */ + *our_level = 0; + } + + return !advance; +} + +/* Print the documentation for ARGP to STREAM; if POST is false, then + everything preceeding a `\v' character in the documentation strings (or + the whole string, for those with none) is printed, otherwise, everything + following the `\v' character (nothing for strings without). Each separate + bit of documentation is separated a blank line, and if PRE_BLANK is true, + then the first is as well. If FIRST_ONLY is true, only the first + occurrence is output. Returns true if anything was output. */ +static int +argp_doc (const struct argp *argp, const struct argp_state *state, + int post, int pre_blank, int first_only, + argp_fmtstream_t stream) +{ + const char *text; + const char *inp_text; + void *input = 0; + int anything = 0; + size_t inp_text_limit = 0; + const char *doc = dgettext (argp->argp_domain, argp->doc); + const struct argp_child *child = argp->children; + + if (doc) + { + char *vt = strchr (doc, '\v'); + inp_text = post ? (vt ? vt + 1 : 0) : doc; + inp_text_limit = (!post && vt) ? (vt - doc) : 0; + } + else + inp_text = 0; + + if (argp->help_filter) + /* We have to filter the doc strings. */ + { + if (inp_text_limit) + /* Copy INP_TEXT so that it's nul-terminated. */ + inp_text = __strndup (inp_text, inp_text_limit); + input = __argp_input (argp, state); + text = + (*argp->help_filter) (post + ? ARGP_KEY_HELP_POST_DOC + : ARGP_KEY_HELP_PRE_DOC, + inp_text, input); + } + else + text = (const char *) inp_text; + + if (text) + { + if (pre_blank) + __argp_fmtstream_putc (stream, '\n'); + + if (text == inp_text && inp_text_limit) + __argp_fmtstream_write (stream, inp_text, inp_text_limit); + else + __argp_fmtstream_puts (stream, text); + + if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream)) + __argp_fmtstream_putc (stream, '\n'); + + anything = 1; + } + + if (text && text != inp_text) + free ((char *) text); /* Free TEXT returned from the help filter. */ + if (inp_text && inp_text_limit && argp->help_filter) + free ((char *) inp_text); /* We copied INP_TEXT, so free it now. */ + + if (post && argp->help_filter) + /* Now see if we have to output a ARGP_KEY_HELP_EXTRA text. */ + { + text = (*argp->help_filter) (ARGP_KEY_HELP_EXTRA, 0, input); + if (text) + { + if (anything || pre_blank) + __argp_fmtstream_putc (stream, '\n'); + __argp_fmtstream_puts (stream, text); + free ((char *) text); + if (__argp_fmtstream_point (stream) + > __argp_fmtstream_lmargin (stream)) + __argp_fmtstream_putc (stream, '\n'); + anything = 1; + } + } + + if (child) + while (child->argp && !(first_only && anything)) + anything |= + argp_doc ((child++)->argp, state, + post, anything || pre_blank, first_only, + stream); + + return anything; +} + +/* Output a usage message for ARGP to STREAM. If called from + argp_state_help, STATE is the relevent parsing state. FLAGS are from the + set ARGP_HELP_*. NAME is what to use wherever a `program name' is + needed. */ +static void +_help (const struct argp *argp, const struct argp_state *state, FILE *stream, + unsigned flags, char *name) +{ + int anything = 0; /* Whether we've output anything. */ + struct hol *hol = 0; + argp_fmtstream_t fs; + + if (! stream) + return; + +#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) + __flockfile (stream); +#endif + + if (! uparams.valid) + fill_in_uparams (state); + + fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0); + if (! fs) + { +#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) + __funlockfile (stream); +#endif + return; + } + + if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG)) + { + hol = argp_hol (argp, 0); + + /* If present, these options always come last. */ + hol_set_group (hol, "help", -1); + hol_set_group (hol, "version", -1); + + hol_sort (hol); + } + + if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE)) + /* Print a short `Usage:' message. */ + { + int first_pattern = 1, more_patterns; + size_t num_pattern_levels = argp_args_levels (argp); + char *pattern_levels = alloca (num_pattern_levels); + + memset (pattern_levels, 0, num_pattern_levels); + + do + { + int old_lm; + int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent); + char *levels = pattern_levels; + + if (first_pattern) + __argp_fmtstream_printf (fs, "%s %s", + dgettext (argp->argp_domain, "Usage:"), + name); + else + __argp_fmtstream_printf (fs, "%s %s", + dgettext (argp->argp_domain, " or: "), + name); + + /* We set the lmargin as well as the wmargin, because hol_usage + manually wraps options with newline to avoid annoying breaks. */ + old_lm = __argp_fmtstream_set_lmargin (fs, uparams.usage_indent); + + if (flags & ARGP_HELP_SHORT_USAGE) + /* Just show where the options go. */ + { + if (hol->num_entries > 0) + __argp_fmtstream_puts (fs, dgettext (argp->argp_domain, + " [OPTION...]")); + } + else + /* Actually print the options. */ + { + hol_usage (hol, fs); + flags |= ARGP_HELP_SHORT_USAGE; /* But only do so once. */ + } + + more_patterns = argp_args_usage (argp, state, &levels, 1, fs); + + __argp_fmtstream_set_wmargin (fs, old_wm); + __argp_fmtstream_set_lmargin (fs, old_lm); + + __argp_fmtstream_putc (fs, '\n'); + anything = 1; + + first_pattern = 0; + } + while (more_patterns); + } + + if (flags & ARGP_HELP_PRE_DOC) + anything |= argp_doc (argp, state, 0, 0, 1, fs); + + if (flags & ARGP_HELP_SEE) + { + __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\ +Try `%s --help' or `%s --usage' for more information.\n"), + name, name); + anything = 1; + } + + if (flags & ARGP_HELP_LONG) + /* Print a long, detailed help message. */ + { + /* Print info about all the options. */ + if (hol->num_entries > 0) + { + if (anything) + __argp_fmtstream_putc (fs, '\n'); + hol_help (hol, state, fs); + anything = 1; + } + } + + if (flags & ARGP_HELP_POST_DOC) + /* Print any documentation strings at the end. */ + anything |= argp_doc (argp, state, 1, anything, 0, fs); + + if ((flags & ARGP_HELP_BUG_ADDR) && argp_program_bug_address) + { + if (anything) + __argp_fmtstream_putc (fs, '\n'); + __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, + "Report bugs to %s.\n"), + argp_program_bug_address); + anything = 1; + } + +#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) + __funlockfile (stream); +#endif + + if (hol) + hol_free (hol); + + __argp_fmtstream_free (fs); +} + +/* Output a usage message for ARGP to STREAM. FLAGS are from the set + ARGP_HELP_*. NAME is what to use wherever a `program name' is needed. */ +void __argp_help (const struct argp *argp, FILE *stream, + unsigned flags, char *name) +{ + struct argp_state state; + memset (&state, 0, sizeof state); + state.root_argp = argp; + _help (argp, &state, stream, flags, name); +} +#ifdef weak_alias +weak_alias (__argp_help, argp_help) +#endif + +#if ! (defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME) +char * +__argp_short_program_name (void) +{ +# if HAVE_DECL_PROGRAM_INVOCATION_NAME + return __argp_base_name (program_invocation_name); +# else + /* FIXME: What now? Miles suggests that it is better to use NULL, + but currently the value is passed on directly to fputs_unlocked, + so that requires more changes. */ +# if __GNUC__ +# warning No reasonable value to return +# endif /* __GNUC__ */ + return ""; +# endif +} +#endif + +/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are + from the set ARGP_HELP_*. */ +void +__argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags) +{ + if ((!state || ! (state->flags & ARGP_NO_ERRS)) && stream) + { + if (state && (state->flags & ARGP_LONG_ONLY)) + flags |= ARGP_HELP_LONG_ONLY; + + _help (state ? state->root_argp : 0, state, stream, flags, + state ? state->name : __argp_short_program_name ()); + + if (!state || ! (state->flags & ARGP_NO_EXIT)) + { + if (flags & ARGP_HELP_EXIT_ERR) + exit (argp_err_exit_status); + if (flags & ARGP_HELP_EXIT_OK) + exit (0); + } + } +} +#ifdef weak_alias +weak_alias (__argp_state_help, argp_state_help) +#endif + +/* If appropriate, print the printf string FMT and following args, preceded + by the program name and `:', to stderr, and followed by a `Try ... --help' + message, then exit (1). */ +void +__argp_error (const struct argp_state *state, const char *fmt, ...) +{ + if (!state || !(state->flags & ARGP_NO_ERRS)) + { + FILE *stream = state ? state->err_stream : stderr; + + if (stream) + { + va_list ap; + +#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) + __flockfile (stream); +#endif + + va_start (ap, fmt); + +#ifdef USE_IN_LIBIO + if (_IO_fwide (stream, 0) > 0) + { + char *buf; + + if (__asprintf (&buf, fmt, ap) < 0) + buf = NULL; + + __fwprintf (stream, L"%s: %s\n", + state ? state->name : __argp_short_program_name (), + buf); + + free (buf); + } + else +#endif + { + fputs_unlocked (state + ? state->name : __argp_short_program_name (), + stream); + putc_unlocked (':', stream); + putc_unlocked (' ', stream); + + vfprintf (stream, fmt, ap); + + putc_unlocked ('\n', stream); + } + + __argp_state_help (state, stream, ARGP_HELP_STD_ERR); + + va_end (ap); + +#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) + __funlockfile (stream); +#endif + } + } +} +#ifdef weak_alias +weak_alias (__argp_error, argp_error) +#endif + +/* Similar to the standard gnu error-reporting function error(), but will + respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print + to STATE->err_stream. This is useful for argument parsing code that is + shared between program startup (when exiting is desired) and runtime + option parsing (when typically an error code is returned instead). The + difference between this function and argp_error is that the latter is for + *parsing errors*, and the former is for other problems that occur during + parsing but don't reflect a (syntactic) problem with the input. */ +void +__argp_failure (const struct argp_state *state, int status, int errnum, + const char *fmt, ...) +{ + if (!state || !(state->flags & ARGP_NO_ERRS)) + { + FILE *stream = state ? state->err_stream : stderr; + + if (stream) + { +#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) + __flockfile (stream); +#endif + +#ifdef USE_IN_LIBIO + if (_IO_fwide (stream, 0) > 0) + __fwprintf (stream, L"%s", + state ? state->name : __argp_short_program_name ()); + else +#endif + fputs_unlocked (state + ? state->name : __argp_short_program_name (), + stream); + + if (fmt) + { + va_list ap; + + va_start (ap, fmt); +#ifdef USE_IN_LIBIO + if (_IO_fwide (stream, 0) > 0) + { + char *buf; + + if (__asprintf (&buf, fmt, ap) < 0) + buf = NULL; + + __fwprintf (stream, L": %s", buf); + + free (buf); + } + else +#endif + { + putc_unlocked (':', stream); + putc_unlocked (' ', stream); + + vfprintf (stream, fmt, ap); + } + + va_end (ap); + } + + if (errnum) + { + char buf[200]; + +#ifdef USE_IN_LIBIO + if (_IO_fwide (stream, 0) > 0) + __fwprintf (stream, L": %s", + __strerror_r (errnum, buf, sizeof (buf))); + else +#endif + { + char const *s = NULL; + putc_unlocked (':', stream); + putc_unlocked (' ', stream); +#if _LIBC || (HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P) + s = __strerror_r (errnum, buf, sizeof buf); +#elif HAVE_DECL_STRERROR_R + if (__strerror_r (errnum, buf, sizeof buf) == 0) + s = buf; +#endif +#if !_LIBC + if (! s && ! (s = strerror (errnum))) + s = dgettext (state->root_argp->argp_domain, + "Unknown system error"); +#endif + fputs (s, stream); + } + } + +#ifdef USE_IN_LIBIO + if (_IO_fwide (stream, 0) > 0) + putwc_unlocked (L'\n', stream); + else +#endif + putc_unlocked ('\n', stream); + +#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) + __funlockfile (stream); +#endif + + if (status && (!state || !(state->flags & ARGP_NO_EXIT))) + exit (status); + } + } +} +#ifdef weak_alias +weak_alias (__argp_failure, argp_failure) +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,177 @@ +/* Name frobnication for compiling argp outside of glibc + Copyright (C) 1997, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#if !_LIBC +/* This code is written for inclusion in gnu-libc, and uses names in the + namespace reserved for libc. If we're not compiling in libc, define those + names to be the normal ones instead. */ + +/* argp-parse functions */ +#undef __argp_parse +#define __argp_parse argp_parse +#undef __option_is_end +#define __option_is_end _option_is_end +#undef __option_is_short +#define __option_is_short _option_is_short +#undef __argp_input +#define __argp_input _argp_input + +/* argp-help functions */ +#undef __argp_help +#define __argp_help argp_help +#undef __argp_error +#define __argp_error argp_error +#undef __argp_failure +#define __argp_failure argp_failure +#undef __argp_state_help +#define __argp_state_help argp_state_help +#undef __argp_usage +#define __argp_usage argp_usage + +/* argp-fmtstream functions */ +#undef __argp_make_fmtstream +#define __argp_make_fmtstream argp_make_fmtstream +#undef __argp_fmtstream_free +#define __argp_fmtstream_free argp_fmtstream_free +#undef __argp_fmtstream_putc +#define __argp_fmtstream_putc argp_fmtstream_putc +#undef __argp_fmtstream_puts +#define __argp_fmtstream_puts argp_fmtstream_puts +#undef __argp_fmtstream_write +#define __argp_fmtstream_write argp_fmtstream_write +#undef __argp_fmtstream_printf +#define __argp_fmtstream_printf argp_fmtstream_printf +#undef __argp_fmtstream_set_lmargin +#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin +#undef __argp_fmtstream_set_rmargin +#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin +#undef __argp_fmtstream_set_wmargin +#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin +#undef __argp_fmtstream_point +#define __argp_fmtstream_point argp_fmtstream_point +#undef __argp_fmtstream_update +#define __argp_fmtstream_update _argp_fmtstream_update +#undef __argp_fmtstream_ensure +#define __argp_fmtstream_ensure _argp_fmtstream_ensure +#undef __argp_fmtstream_lmargin +#define __argp_fmtstream_lmargin argp_fmtstream_lmargin +#undef __argp_fmtstream_rmargin +#define __argp_fmtstream_rmargin argp_fmtstream_rmargin +#undef __argp_fmtstream_wmargin +#define __argp_fmtstream_wmargin argp_fmtstream_wmargin + +#include "mempcpy.h" +#include "strcase.h" +#include "strchrnul.h" +#include "strndup.h" + +/* normal libc functions we call */ +#undef __flockfile +#define __flockfile flockfile +#undef __funlockfile +#define __funlockfile funlockfile +#undef __mempcpy +#define __mempcpy mempcpy +#undef __sleep +#define __sleep sleep +#undef __strcasecmp +#define __strcasecmp strcasecmp +#undef __strchrnul +#define __strchrnul strchrnul +#undef __strerror_r +#define __strerror_r strerror_r +#undef __strndup +#define __strndup strndup +#undef __vsnprintf +#define __vsnprintf vsnprintf + +#if defined(HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED +# define clearerr_unlocked(x) clearerr (x) +#endif +#if defined(HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED +# define feof_unlocked(x) feof (x) +# endif +#if defined(HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED +# define ferror_unlocked(x) ferror (x) +# endif +#if defined(HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED +# define fflush_unlocked(x) fflush (x) +# endif +#if defined(HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED +# define fgets_unlocked(x,y,z) fgets (x,y,z) +# endif +#if defined(HAVE_DECL_FPUTC_UNLOCKED) && !HAVE_DECL_FPUTC_UNLOCKED +# define fputc_unlocked(x,y) fputc (x,y) +# endif +#if defined(HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED +# define fputs_unlocked(x,y) fputs (x,y) +# endif +#if defined(HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED +# define fread_unlocked(w,x,y,z) fread (w,x,y,z) +# endif +#if defined(HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED +# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z) +# endif +#if defined(HAVE_DECL_GETC_UNLOCKED) && !HAVE_DECL_GETC_UNLOCKED +# define getc_unlocked(x) getc (x) +# endif +#if defined(HAVE_DECL_GETCHAR_UNLOCKED) && !HAVE_DECL_GETCHAR_UNLOCKED +# define getchar_unlocked() getchar () +# endif +#if defined(HAVE_DECL_PUTC_UNLOCKED) && !HAVE_DECL_PUTC_UNLOCKED +# define putc_unlocked(x,y) putc (x,y) +# endif +#if defined(HAVE_DECL_PUTCHAR_UNLOCKED) && !HAVE_DECL_PUTCHAR_UNLOCKED +# define putchar_unlocked(x) putchar (x) +# endif + +/* GNULIB makes sure both program_invocation_name and + program_invocation_short_name are available */ +#ifdef GNULIB_PROGRAM_INVOCATION_NAME +extern char *program_invocation_name; +# undef HAVE_DECL_PROGRAM_INVOCATION_NAME +# define HAVE_DECL_PROGRAM_INVOCATION_NAME 1 +#endif + +#ifdef GNULIB_PROGRAM_INVOCATION_SHORT_NAME +extern char *program_invocation_short_name; +# undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME +# define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 1 +#endif + +#endif /* !_LIBC */ + +#ifndef __set_errno +#define __set_errno(e) (errno = (e)) +#endif + +#if defined GNULIB_ARGP_DISABLE_DIRNAME +# define __argp_base_name(arg) arg +#elif defined GNULIB_ARGP_EXTERN_BASENAME +extern char *__argp_base_name(const char *arg); +#else +# include "dirname.h" +# define __argp_base_name base_name +#endif + +#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME +# define __argp_short_program_name() (program_invocation_short_name) +#else +extern char *__argp_short_program_name (void); +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-parse.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-parse.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-parse.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-parse.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,943 @@ +/* Hierarchial argument parsing, layered over getopt + Copyright (C) 1995-2000, 2002, 2003, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _LIBC +# include +# undef dgettext +# define dgettext(domain, msgid) \ + INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES) +#else +# include "gettext.h" +#endif +#define N_(msgid) msgid + +#include "argp.h" +#include "argp-namefrob.h" +#ifdef __APPLE__ + const char *argp_program_version; + const char *argp_program_bug_address; +#endif + +#define alignof(type) offsetof (struct { char c; type x; }, x) +#define alignto(n, d) ((((n) + (d) - 1) / (d)) * (d)) + +/* Getopt return values. */ +#define KEY_END (-1) /* The end of the options. */ +#define KEY_ARG 1 /* A non-option argument. */ +#define KEY_ERR '?' /* An error parsing the options. */ + +/* The meta-argument used to prevent any further arguments being interpreted + as options. */ +#define QUOTE "--" + +/* The number of bits we steal in a long-option value for our own use. */ +#define GROUP_BITS CHAR_BIT + +/* The number of bits available for the user value. */ +#define USER_BITS ((sizeof ((struct option *)0)->val * CHAR_BIT) - GROUP_BITS) +#define USER_MASK ((1 << USER_BITS) - 1) + +/* EZ alias for ARGP_ERR_UNKNOWN. */ +#define EBADKEY ARGP_ERR_UNKNOWN + +/* Default options. */ + +/* When argp is given the --HANG switch, _ARGP_HANG is set and argp will sleep + for one second intervals, decrementing _ARGP_HANG until it's zero. Thus + you can force the program to continue by attaching a debugger and setting + it to 0 yourself. */ +static volatile int _argp_hang; + +#define OPT_PROGNAME -2 +#define OPT_USAGE -3 +#define OPT_HANG -4 + +static const struct argp_option argp_default_options[] = +{ + {"help", '?', 0, 0, N_("give this help list"), -1}, + {"usage", OPT_USAGE, 0, 0, N_("give a short usage message"), 0}, + {"program-name",OPT_PROGNAME,N_("NAME"), OPTION_HIDDEN, N_("set the program name"), 0}, + {"HANG", OPT_HANG, N_("SECS"), OPTION_ARG_OPTIONAL | OPTION_HIDDEN, + N_("hang for SECS seconds (default 3600)"), 0}, + {NULL, 0, 0, 0, NULL, 0} +}; + +static error_t +argp_default_parser (int key, char *arg, struct argp_state *state) +{ + switch (key) + { + case '?': + __argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP); + break; + case OPT_USAGE: + __argp_state_help (state, state->out_stream, + ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK); + break; + + case OPT_PROGNAME: /* Set the program name. */ +#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_NAME + program_invocation_name = arg; +#endif + /* [Note that some systems only have PROGRAM_INVOCATION_SHORT_NAME (aka + __PROGNAME), in which case, PROGRAM_INVOCATION_NAME is just defined + to be that, so we have to be a bit careful here.] */ + + /* Update what we use for messages. */ + state->name = __argp_base_name (arg); + +#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME + program_invocation_short_name = state->name; +#endif + + if ((state->flags & (ARGP_PARSE_ARGV0 | ARGP_NO_ERRS)) + == ARGP_PARSE_ARGV0) + /* Update what getopt uses too. */ + state->argv[0] = arg; + + break; + + case OPT_HANG: + _argp_hang = atoi (arg ? arg : "3600"); + while (_argp_hang-- > 0) + __sleep (1); + break; + + default: + return EBADKEY; + } + return 0; +} + +static const struct argp argp_default_argp = + {argp_default_options, &argp_default_parser, NULL, NULL, NULL, NULL, "libc"}; + + +static const struct argp_option argp_version_options[] = +{ + {"version", 'V', 0, 0, N_("print program version"), -1}, + {NULL, 0, 0, 0, NULL, 0} +}; + +static error_t +argp_version_parser (int key, char *arg, struct argp_state *state) +{ + switch (key) + { + case 'V': + if (argp_program_version_hook) + (*argp_program_version_hook) (state->out_stream, state); + else if (argp_program_version) + fprintf (state->out_stream, "%s\n", argp_program_version); + else + __argp_error (state, dgettext (state->root_argp->argp_domain, + "(PROGRAM ERROR) No version known!?")); + if (! (state->flags & ARGP_NO_EXIT)) + exit (0); + break; + default: + return EBADKEY; + } + return 0; +} + +static const struct argp argp_version_argp = + {argp_version_options, &argp_version_parser, NULL, NULL, NULL, NULL, "libc"}; + +/* Returns the offset into the getopt long options array LONG_OPTIONS of a + long option with called NAME, or -1 if none is found. Passing NULL as + NAME will return the number of options. */ +static int +find_long_option (struct option *long_options, const char *name) +{ + struct option *l = long_options; + while (l->name != NULL) + if (name != NULL && strcmp (l->name, name) == 0) + return l - long_options; + else + l++; + if (name == NULL) + return l - long_options; + else + return -1; +} + + +/* The state of a `group' during parsing. Each group corresponds to a + particular argp structure from the tree of such descending from the top + level argp passed to argp_parse. */ +struct group +{ + /* This group's parsing function. */ + argp_parser_t parser; + + /* Which argp this group is from. */ + const struct argp *argp; + + /* Points to the point in SHORT_OPTS corresponding to the end of the short + options for this group. We use it to determine from which group a + particular short options is from. */ + char *short_end; + + /* The number of non-option args sucessfully handled by this parser. */ + unsigned args_processed; + + /* This group's parser's parent's group. */ + struct group *parent; + unsigned parent_index; /* And the our position in the parent. */ + + /* These fields are swapped into and out of the state structure when + calling this group's parser. */ + void *input, **child_inputs; + void *hook; +}; + +/* Call GROUP's parser with KEY and ARG, swapping any group-specific info + from STATE before calling, and back into state afterwards. If GROUP has + no parser, EBADKEY is returned. */ +static error_t +group_parse (struct group *group, struct argp_state *state, int key, char *arg) +{ + if (group->parser) + { + error_t err; + state->hook = group->hook; + state->input = group->input; + state->child_inputs = group->child_inputs; + state->arg_num = group->args_processed; + err = (*group->parser)(key, arg, state); + group->hook = state->hook; + return err; + } + else + return EBADKEY; +} + +struct parser +{ + const struct argp *argp; + + /* SHORT_OPTS is the getopt short options string for the union of all the + groups of options. */ + char *short_opts; + /* LONG_OPTS is the array of getop long option structures for the union of + all the groups of options. */ + struct option *long_opts; + /* OPT_DATA is the getopt data used for the re-entrant getopt. */ + struct _getopt_data opt_data; + + /* States of the various parsing groups. */ + struct group *groups; + /* The end of the GROUPS array. */ + struct group *egroup; + /* An vector containing storage for the CHILD_INPUTS field in all groups. */ + void **child_inputs; + + /* True if we think using getopt is still useful; if false, then + remaining arguments are just passed verbatim with ARGP_KEY_ARG. This is + cleared whenever getopt returns KEY_END, but may be set again if the user + moves the next argument pointer backwards. */ + int try_getopt; + + /* State block supplied to parsing routines. */ + struct argp_state state; + + /* Memory used by this parser. */ + void *storage; +}; + +/* The next usable entries in the various parser tables being filled in by + convert_options. */ +struct parser_convert_state +{ + struct parser *parser; + char *short_end; + struct option *long_end; + void **child_inputs_end; +}; + +/* Converts all options in ARGP (which is put in GROUP) and ancestors + into getopt options stored in SHORT_OPTS and LONG_OPTS; SHORT_END and + CVT->LONG_END are the points at which new options are added. Returns the + next unused group entry. CVT holds state used during the conversion. */ +static struct group * +convert_options (const struct argp *argp, + struct group *parent, unsigned parent_index, + struct group *group, struct parser_convert_state *cvt) +{ + /* REAL is the most recent non-alias value of OPT. */ + const struct argp_option *real = argp->options; + const struct argp_child *children = argp->children; + + if (real || argp->parser) + { + const struct argp_option *opt; + + if (real) + for (opt = real; !__option_is_end (opt); opt++) + { + if (! (opt->flags & OPTION_ALIAS)) + /* OPT isn't an alias, so we can use values from it. */ + real = opt; + + if (! (real->flags & OPTION_DOC)) + /* A real option (not just documentation). */ + { + if (__option_is_short (opt)) + /* OPT can be used as a short option. */ + { + *cvt->short_end++ = opt->key; + if (real->arg) + { + *cvt->short_end++ = ':'; + if (real->flags & OPTION_ARG_OPTIONAL) + *cvt->short_end++ = ':'; + } + *cvt->short_end = '\0'; /* keep 0 terminated */ + } + + if (opt->name + && find_long_option (cvt->parser->long_opts, opt->name) < 0) + /* OPT can be used as a long option. */ + { + cvt->long_end->name = opt->name; + cvt->long_end->has_arg = + (real->arg + ? (real->flags & OPTION_ARG_OPTIONAL + ? optional_argument + : required_argument) + : no_argument); + cvt->long_end->flag = 0; + /* we add a disambiguating code to all the user's + values (which is removed before we actually call + the function to parse the value); this means that + the user loses use of the high 8 bits in all his + values (the sign of the lower bits is preserved + however)... */ + cvt->long_end->val = + ((opt->key | real->key) & USER_MASK) + + (((group - cvt->parser->groups) + 1) << USER_BITS); + + /* Keep the LONG_OPTS list terminated. */ + (++cvt->long_end)->name = NULL; + } + } + } + + group->parser = argp->parser; + group->argp = argp; + group->short_end = cvt->short_end; + group->args_processed = 0; + group->parent = parent; + group->parent_index = parent_index; + group->input = 0; + group->hook = 0; + group->child_inputs = 0; + + if (children) + /* Assign GROUP's CHILD_INPUTS field some space from + CVT->child_inputs_end.*/ + { + unsigned num_children = 0; + while (children[num_children].argp) + num_children++; + group->child_inputs = cvt->child_inputs_end; + cvt->child_inputs_end += num_children; + } + + parent = group++; + } + else + parent = 0; + + if (children) + { + unsigned index = 0; + while (children->argp) + group = + convert_options (children++->argp, parent, index++, group, cvt); + } + + return group; +} + +/* Find the merged set of getopt options, with keys appropiately prefixed. */ +static void +parser_convert (struct parser *parser, const struct argp *argp, int flags) +{ + struct parser_convert_state cvt; + + cvt.parser = parser; + cvt.short_end = parser->short_opts; + cvt.long_end = parser->long_opts; + cvt.child_inputs_end = parser->child_inputs; + + if (flags & ARGP_IN_ORDER) + *cvt.short_end++ = '-'; + else if (flags & ARGP_NO_ARGS) + *cvt.short_end++ = '+'; + *cvt.short_end = '\0'; + + cvt.long_end->name = NULL; + + parser->argp = argp; + + if (argp) + parser->egroup = convert_options (argp, 0, 0, parser->groups, &cvt); + else + parser->egroup = parser->groups; /* No parsers at all! */ +} + +/* Lengths of various parser fields which we will allocated. */ +struct parser_sizes +{ + size_t short_len; /* Getopt short options string. */ + size_t long_len; /* Getopt long options vector. */ + size_t num_groups; /* Group structures we allocate. */ + size_t num_child_inputs; /* Child input slots. */ +}; + +/* For ARGP, increments the NUM_GROUPS field in SZS by the total number of + argp structures descended from it, and the SHORT_LEN & LONG_LEN fields by + the maximum lengths of the resulting merged getopt short options string and + long-options array, respectively. */ +static void +calc_sizes (const struct argp *argp, struct parser_sizes *szs) +{ + const struct argp_child *child = argp->children; + const struct argp_option *opt = argp->options; + + if (opt || argp->parser) + { + szs->num_groups++; + if (opt) + { + int num_opts = 0; + while (!__option_is_end (opt++)) + num_opts++; + szs->short_len += num_opts * 3; /* opt + up to 2 `:'s */ + szs->long_len += num_opts; + } + } + + if (child) + while (child->argp) + { + calc_sizes ((child++)->argp, szs); + szs->num_child_inputs++; + } +} + +/* Initializes PARSER to parse ARGP in a manner described by FLAGS. */ +static error_t +parser_init (struct parser *parser, const struct argp *argp, + int argc, char **argv, int flags, void *input) +{ + error_t err = 0; + struct group *group; + struct parser_sizes szs; + struct _getopt_data opt_data = _GETOPT_DATA_INITIALIZER; + char *storage; + size_t glen, gsum; + size_t clen, csum; + size_t llen, lsum; + size_t slen, ssum; + + szs.short_len = (flags & ARGP_NO_ARGS) ? 0 : 1; + szs.long_len = 0; + szs.num_groups = 0; + szs.num_child_inputs = 0; + + if (argp) + calc_sizes (argp, &szs); + + /* Lengths of the various bits of storage used by PARSER. */ + glen = (szs.num_groups + 1) * sizeof (struct group); + clen = szs.num_child_inputs * sizeof (void *); + llen = (szs.long_len + 1) * sizeof (struct option); + slen = szs.short_len + 1; + + /* Sums of previous lengths, properly aligned. There's no need to + align gsum, since struct group is aligned at least as strictly as + void * (since it contains a void * member). And there's no need + to align lsum, since struct option is aligned at least as + strictly as char. */ + gsum = glen; + csum = alignto (gsum + clen, alignof (struct option)); + lsum = csum + llen; + ssum = lsum + slen; + + parser->storage = malloc (ssum); + if (! parser->storage) + return ENOMEM; + + storage = parser->storage; + parser->groups = parser->storage; + parser->child_inputs = (void **) (storage + gsum); + parser->long_opts = (struct option *) (storage + csum); + parser->short_opts = storage + lsum; + parser->opt_data = opt_data; + + memset (parser->child_inputs, 0, clen); + parser_convert (parser, argp, flags); + + memset (&parser->state, 0, sizeof (struct argp_state)); + parser->state.root_argp = parser->argp; + parser->state.argc = argc; + parser->state.argv = argv; + parser->state.flags = flags; + parser->state.err_stream = stderr; + parser->state.out_stream = stdout; + parser->state.next = 0; /* Tell getopt to initialize. */ + parser->state.pstate = parser; + + parser->try_getopt = 1; + + /* Call each parser for the first time, giving it a chance to propagate + values to child parsers. */ + if (parser->groups < parser->egroup) + parser->groups->input = input; + for (group = parser->groups; + group < parser->egroup && (!err || err == EBADKEY); + group++) + { + if (group->parent) + /* If a child parser, get the initial input value from the parent. */ + group->input = group->parent->child_inputs[group->parent_index]; + + if (!group->parser + && group->argp->children && group->argp->children->argp) + /* For the special case where no parsing function is supplied for an + argp, propagate its input to its first child, if any (this just + makes very simple wrapper argps more convenient). */ + group->child_inputs[0] = group->input; + + err = group_parse (group, &parser->state, ARGP_KEY_INIT, 0); + } + if (err == EBADKEY) + err = 0; /* Some parser didn't understand. */ + + if (err) + return err; + + if (parser->state.flags & ARGP_NO_ERRS) + { + parser->opt_data.opterr = 0; + if (parser->state.flags & ARGP_PARSE_ARGV0) + /* getopt always skips ARGV[0], so we have to fake it out. As long + as OPTERR is 0, then it shouldn't actually try to access it. */ + parser->state.argv--, parser->state.argc++; + } + else + parser->opt_data.opterr = 1; /* Print error messages. */ + + if (parser->state.argv == argv && argv[0]) + /* There's an argv[0]; use it for messages. */ + parser->state.name = __argp_base_name (argv[0]); + else + parser->state.name = __argp_short_program_name (); + + return 0; +} + +/* Free any storage consumed by PARSER (but not PARSER itself). */ +static error_t +parser_finalize (struct parser *parser, + error_t err, int arg_ebadkey, int *end_index) +{ + struct group *group; + + if (err == EBADKEY && arg_ebadkey) + /* Suppress errors generated by unparsed arguments. */ + err = 0; + + if (! err) + { + if (parser->state.next == parser->state.argc) + /* We successfully parsed all arguments! Call all the parsers again, + just a few more times... */ + { + for (group = parser->groups; + group < parser->egroup && (!err || err==EBADKEY); + group++) + if (group->args_processed == 0) + err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0); + for (group = parser->egroup - 1; + group >= parser->groups && (!err || err==EBADKEY); + group--) + err = group_parse (group, &parser->state, ARGP_KEY_END, 0); + + if (err == EBADKEY) + err = 0; /* Some parser didn't understand. */ + + /* Tell the user that all arguments are parsed. */ + if (end_index) + *end_index = parser->state.next; + } + else if (end_index) + /* Return any remaining arguments to the user. */ + *end_index = parser->state.next; + else + /* No way to return the remaining arguments, they must be bogus. */ + { + if (!(parser->state.flags & ARGP_NO_ERRS) + && parser->state.err_stream) + fprintf (parser->state.err_stream, + dgettext (parser->argp->argp_domain, + "%s: Too many arguments\n"), + parser->state.name); + err = EBADKEY; + } + } + + /* Okay, we're all done, with either an error or success; call the parsers + to indicate which one. */ + + if (err) + { + /* Maybe print an error message. */ + if (err == EBADKEY) + /* An appropriate message describing what the error was should have + been printed earlier. */ + __argp_state_help (&parser->state, parser->state.err_stream, + ARGP_HELP_STD_ERR); + + /* Since we didn't exit, give each parser an error indication. */ + for (group = parser->groups; group < parser->egroup; group++) + group_parse (group, &parser->state, ARGP_KEY_ERROR, 0); + } + else + /* Notify parsers of success, and propagate back values from parsers. */ + { + /* We pass over the groups in reverse order so that child groups are + given a chance to do there processing before passing back a value to + the parent. */ + for (group = parser->egroup - 1 + ; group >= parser->groups && (!err || err == EBADKEY) + ; group--) + err = group_parse (group, &parser->state, ARGP_KEY_SUCCESS, 0); + if (err == EBADKEY) + err = 0; /* Some parser didn't understand. */ + } + + /* Call parsers once more, to do any final cleanup. Errors are ignored. */ + for (group = parser->egroup - 1; group >= parser->groups; group--) + group_parse (group, &parser->state, ARGP_KEY_FINI, 0); + + if (err == EBADKEY) + err = EINVAL; + + free (parser->storage); + + return err; +} + +/* Call the user parsers to parse the non-option argument VAL, at the current + position, returning any error. The state NEXT pointer is assumed to have + been adjusted (by getopt) to point after this argument; this function will + adjust it correctly to reflect however many args actually end up being + consumed. */ +static error_t +parser_parse_arg (struct parser *parser, char *val) +{ + /* Save the starting value of NEXT, first adjusting it so that the arg + we're parsing is again the front of the arg vector. */ + int index = --parser->state.next; + error_t err = EBADKEY; + struct group *group; + int key = 0; /* Which of ARGP_KEY_ARG[S] we used. */ + + /* Try to parse the argument in each parser. */ + for (group = parser->groups + ; group < parser->egroup && err == EBADKEY + ; group++) + { + parser->state.next++; /* For ARGP_KEY_ARG, consume the arg. */ + key = ARGP_KEY_ARG; + err = group_parse (group, &parser->state, key, val); + + if (err == EBADKEY) + /* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */ + { + parser->state.next--; /* For ARGP_KEY_ARGS, put back the arg. */ + key = ARGP_KEY_ARGS; + err = group_parse (group, &parser->state, key, 0); + } + } + + if (! err) + { + if (key == ARGP_KEY_ARGS) + /* The default for ARGP_KEY_ARGS is to assume that if NEXT isn't + changed by the user, *all* arguments should be considered + consumed. */ + parser->state.next = parser->state.argc; + + if (parser->state.next > index) + /* Remember that we successfully processed a non-option + argument -- but only if the user hasn't gotten tricky and set + the clock back. */ + (--group)->args_processed += (parser->state.next - index); + else + /* The user wants to reparse some args, give getopt another try. */ + parser->try_getopt = 1; + } + + return err; +} + +/* Call the user parsers to parse the option OPT, with argument VAL, at the + current position, returning any error. */ +static error_t +parser_parse_opt (struct parser *parser, int opt, char *val) +{ + /* The group key encoded in the high bits; 0 for short opts or + group_number + 1 for long opts. */ + int group_key = opt >> USER_BITS; + error_t err = EBADKEY; + + if (group_key == 0) + /* A short option. By comparing OPT's position in SHORT_OPTS to the + various starting positions in each group's SHORT_END field, we can + determine which group OPT came from. */ + { + struct group *group; + char *short_index = strchr (parser->short_opts, opt); + + if (short_index) + for (group = parser->groups; group < parser->egroup; group++) + if (group->short_end > short_index) + { + err = group_parse (group, &parser->state, opt, + parser->opt_data.optarg); + break; + } + } + else + /* A long option. We use shifts instead of masking for extracting + the user value in order to preserve the sign. */ + err = + group_parse (&parser->groups[group_key - 1], &parser->state, + (opt << GROUP_BITS) >> GROUP_BITS, + parser->opt_data.optarg); + + if (err == EBADKEY) + /* At least currently, an option not recognized is an error in the + parser, because we pre-compute which parser is supposed to deal + with each option. */ + { + static const char bad_key_err[] = + N_("(PROGRAM ERROR) Option should have been recognized!?"); + if (group_key == 0) + __argp_error (&parser->state, "-%c: %s", opt, + dgettext (parser->argp->argp_domain, bad_key_err)); + else + { + struct option *long_opt = parser->long_opts; + while (long_opt->val != opt && long_opt->name) + long_opt++; + __argp_error (&parser->state, "--%s: %s", + long_opt->name ? long_opt->name : "???", + dgettext (parser->argp->argp_domain, bad_key_err)); + } + } + + return err; +} + +/* Parse the next argument in PARSER (as indicated by PARSER->state.next). + Any error from the parsers is returned, and *ARGP_EBADKEY indicates + whether a value of EBADKEY is due to an unrecognized argument (which is + generally not fatal). */ +static error_t +parser_parse_next (struct parser *parser, int *arg_ebadkey) +{ + int opt; + error_t err = 0; + + if (parser->state.quoted && parser->state.next < parser->state.quoted) + /* The next argument pointer has been moved to before the quoted + region, so pretend we never saw the quoting `--', and give getopt + another chance. If the user hasn't removed it, getopt will just + process it again. */ + parser->state.quoted = 0; + + if (parser->try_getopt && !parser->state.quoted) + /* Give getopt a chance to parse this. */ + { + /* Put it back in OPTIND for getopt. */ + parser->opt_data.optind = parser->state.next; + /* Distinguish KEY_ERR from a real option. */ + parser->opt_data.optopt = KEY_END; + if (parser->state.flags & ARGP_LONG_ONLY) + opt = _getopt_long_only_r (parser->state.argc, parser->state.argv, + parser->short_opts, parser->long_opts, 0, + &parser->opt_data); + else + opt = _getopt_long_r (parser->state.argc, parser->state.argv, + parser->short_opts, parser->long_opts, 0, + &parser->opt_data); + /* And see what getopt did. */ + parser->state.next = parser->opt_data.optind; + + if (opt == KEY_END) + /* Getopt says there are no more options, so stop using + getopt; we'll continue if necessary on our own. */ + { + parser->try_getopt = 0; + if (parser->state.next > 1 + && strcmp (parser->state.argv[parser->state.next - 1], QUOTE) + == 0) + /* Not only is this the end of the options, but it's a + `quoted' region, which may have args that *look* like + options, so we definitely shouldn't try to use getopt past + here, whatever happens. */ + parser->state.quoted = parser->state.next; + } + else if (opt == KEY_ERR && parser->opt_data.optopt != KEY_END) + /* KEY_ERR can have the same value as a valid user short + option, but in the case of a real error, getopt sets OPTOPT + to the offending character, which can never be KEY_END. */ + { + *arg_ebadkey = 0; + return EBADKEY; + } + } + else + opt = KEY_END; + + if (opt == KEY_END) + { + /* We're past what getopt considers the options. */ + if (parser->state.next >= parser->state.argc + || (parser->state.flags & ARGP_NO_ARGS)) + /* Indicate that we're done. */ + { + *arg_ebadkey = 1; + return EBADKEY; + } + else + /* A non-option arg; simulate what getopt might have done. */ + { + opt = KEY_ARG; + parser->opt_data.optarg = parser->state.argv[parser->state.next++]; + } + } + + if (opt == KEY_ARG) + /* A non-option argument; try each parser in turn. */ + err = parser_parse_arg (parser, parser->opt_data.optarg); + else + err = parser_parse_opt (parser, opt, parser->opt_data.optarg); + + if (err == EBADKEY) + *arg_ebadkey = (opt == KEY_END || opt == KEY_ARG); + + return err; +} + +/* Parse the options strings in ARGC & ARGV according to the argp in ARGP. + FLAGS is one of the ARGP_ flags above. If END_INDEX is non-NULL, the + index in ARGV of the first unparsed option is returned in it. If an + unknown option is present, EINVAL is returned; if some parser routine + returned a non-zero value, it is returned; otherwise 0 is returned. */ +error_t +__argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags, + int *end_index, void *input) +{ + error_t err; + struct parser parser; + + /* If true, then err == EBADKEY is a result of a non-option argument failing + to be parsed (which in some cases isn't actually an error). */ + int arg_ebadkey = 0; + + if (! (flags & ARGP_NO_HELP)) + /* Add our own options. */ + { + struct argp_child *child = alloca (4 * sizeof (struct argp_child)); + struct argp *top_argp = alloca (sizeof (struct argp)); + + /* TOP_ARGP has no options, it just serves to group the user & default + argps. */ + memset (top_argp, 0, sizeof (*top_argp)); + top_argp->children = child; + + memset (child, 0, 4 * sizeof (struct argp_child)); + + if (argp) + (child++)->argp = argp; + (child++)->argp = &argp_default_argp; + if (argp_program_version || argp_program_version_hook) + (child++)->argp = &argp_version_argp; + child->argp = 0; + + argp = top_argp; + } + + /* Construct a parser for these arguments. */ + err = parser_init (&parser, argp, argc, argv, flags, input); + + if (! err) + /* Parse! */ + { + while (! err) + err = parser_parse_next (&parser, &arg_ebadkey); + err = parser_finalize (&parser, err, arg_ebadkey, end_index); + } + + return err; +} +#ifdef weak_alias +weak_alias (__argp_parse, argp_parse) +#endif + +/* Return the input field for ARGP in the parser corresponding to STATE; used + by the help routines. */ +void * +__argp_input (const struct argp *argp, const struct argp_state *state) +{ + if (state) + { + struct group *group; + struct parser *parser = state->pstate; + + for (group = parser->groups; group < parser->egroup; group++) + if (group->argp == argp) + return group->input; + } + + return 0; +} +#ifdef weak_alias +weak_alias (__argp_input, _argp_input) +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-pin.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-pin.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-pin.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-pin.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,28 @@ +/* Full and short program names for argp module + Copyright (C) 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME +char *program_invocation_short_name = 0; +#endif +#ifndef HAVE_PROGRAM_INVOCATION_NAME +char *program_invocation_name = 0; +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-pv.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-pv.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-pv.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-pv.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,24 @@ +/* Default definition for ARGP_PROGRAM_VERSION. + Copyright (C) 1996, 1997, 1999, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* If set by the user program to a non-zero value, then a default option + --version is added (unless the ARGP_NO_HELP flag is used), which will + print this string followed by a newline and exit (unless the + ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */ +const char *argp_program_version; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-pvh.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-pvh.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-pvh.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-pvh.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,31 @@ +/* Default definition for ARGP_PROGRAM_VERSION_HOOK. + Copyright (C) 1996, 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "argp.h" + +/* If set by the user program to a non-zero value, then a default option + --version is added (unless the ARGP_NO_HELP flag is used), which calls + this function with a stream to print the version to and a pointer to the + current parsing state, and then exits (unless the ARGP_NO_EXIT flag is + used). This variable takes precedent over ARGP_PROGRAM_VERSION. */ +void (*argp_program_version_hook) (FILE *stream, struct argp_state *state) = NULL; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-xinl.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-xinl.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argp-xinl.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argp-xinl.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,43 @@ +/* Real definitions for extern inline functions in argp.h + Copyright (C) 1997, 1998, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if defined _LIBC || defined HAVE_FEATURES_H +# include +#endif + +#ifndef __USE_EXTERN_INLINES +# define __USE_EXTERN_INLINES 1 +#endif +#define ARGP_EI +#undef __OPTIMIZE__ +#define __OPTIMIZE__ 1 +#include "argp.h" + +/* Add weak aliases. */ +#if _LIBC - 0 && defined (weak_alias) + +weak_alias (__argp_usage, argp_usage) +weak_alias (__option_is_short, _option_is_short) +weak_alias (__option_is_end, _option_is_end) + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argz.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argz.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argz.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argz.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,226 @@ +/* argz.c -- argz implementation for non-glibc systems + Copyright (C) 2004 Free Software Foundation, Inc. + Originally by Gary V. Vaughan + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#if defined(HAVE_CONFIG_H) +# if defined(LTDL) && defined LT_CONFIG_H +# include LT_CONFIG_H +# else +# include +# endif +#endif + +#include + +#include +#include +#include +#include +#include + +#if defined(HAVE_STRING_H) +# include +#elif defined(HAVE_STRINGS_H) +# include +#endif +#if defined(HAVE_MEMORY_H) +# include +#endif + +#define EOS_CHAR '\0' + +error_t +argz_append (char **pargz, size_t *pargz_len, const char *buf, size_t buf_len) +{ + size_t argz_len; + char *argz; + + assert (pargz); + assert (pargz_len); + assert ((*pargz && *pargz_len) || (!*pargz && !*pargz_len)); + + /* If nothing needs to be appended, no more work is required. */ + if (buf_len == 0) + return 0; + + /* Ensure there is enough room to append BUF_LEN. */ + argz_len = *pargz_len + buf_len; + argz = (char *) realloc (*pargz, argz_len); + if (!argz) + return ENOMEM; + + /* Copy characters from BUF after terminating '\0' in ARGZ. */ + memcpy (argz + *pargz_len, buf, buf_len); + + /* Assign new values. */ + *pargz = argz; + *pargz_len = argz_len; + + return 0; +} + + +error_t +argz_create_sep (const char *str, int delim, char **pargz, size_t *pargz_len) +{ + size_t argz_len; + char *argz = 0; + + assert (str); + assert (pargz); + assert (pargz_len); + + /* Make a copy of STR, but replacing each occurrence of + DELIM with '\0'. */ + argz_len = 1+ strlen (str); + if (argz_len) + { + const char *p; + char *q; + + argz = (char *) malloc (argz_len); + if (!argz) + return ENOMEM; + + for (p = str, q = argz; *p != EOS_CHAR; ++p) + { + if (*p == delim) + { + /* Ignore leading delimiters, and fold consecutive + delimiters in STR into a single '\0' in ARGZ. */ + if ((q > argz) && (q[-1] != EOS_CHAR)) + *q++ = EOS_CHAR; + else + --argz_len; + } + else + *q++ = *p; + } + /* Copy terminating EOS_CHAR. */ + *q = *p; + } + + /* If ARGZ_LEN has shrunk to nothing, release ARGZ's memory. */ + if (!argz_len) + argz = (free (argz), (char *) 0); + + /* Assign new values. */ + *pargz = argz; + *pargz_len = argz_len; + + return 0; +} + + +error_t +argz_insert (char **pargz, size_t *pargz_len, char *before, const char *entry) +{ + assert (pargz); + assert (pargz_len); + assert (entry && *entry); + + /* No BEFORE address indicates ENTRY should be inserted after the + current last element. */ + if (!before) + return argz_append (pargz, pargz_len, entry, 1+ strlen (entry)); + + /* This probably indicates a programmer error, but to preserve + semantics, scan back to the start of an entry if BEFORE points + into the middle of it. */ + while ((before > *pargz) && (before[-1] != EOS_CHAR)) + --before; + + { + size_t entry_len = 1+ strlen (entry); + size_t argz_len = *pargz_len + entry_len; + size_t offset = before - *pargz; + char *argz = (char *) realloc (*pargz, argz_len); + + if (!argz) + return ENOMEM; + + /* Make BEFORE point to the equivalent offset in ARGZ that it + used to have in *PARGZ incase realloc() moved the block. */ + before = argz + offset; + + /* Move the ARGZ entries starting at BEFORE up into the new + space at the end -- making room to copy ENTRY into the + resulting gap. */ + memmove (before + entry_len, before, *pargz_len - offset); + memcpy (before, entry, entry_len); + + /* Assign new values. */ + *pargz = argz; + *pargz_len = argz_len; + } + + return 0; +} + + +char * +argz_next (char *argz, size_t argz_len, const char *entry) +{ + assert ((argz && argz_len) || (!argz && !argz_len)); + + if (entry) + { + /* Either ARGZ/ARGZ_LEN is empty, or ENTRY points into an address + within the ARGZ vector. */ + assert ((!argz && !argz_len) + || ((argz <= entry) && (entry < (argz + argz_len)))); + + /* Move to the char immediately after the terminating + '\0' of ENTRY. */ + entry = 1+ strchr (entry, EOS_CHAR); + + /* Return either the new ENTRY, or else NULL if ARGZ is + exhausted. */ + return (entry >= argz + argz_len) ? 0 : (char *) entry; + } + else + { + /* This should probably be flagged as a programmer error, + since starting an argz_next loop with the iterator set + to ARGZ is safer. To preserve semantics, handle the NULL + case by returning the start of ARGZ (if any). */ + if (argz_len > 0) + return argz; + else + return 0; + } +} + + +void +argz_stringify (char *argz, size_t argz_len, int sep) +{ + assert ((argz && argz_len) || (!argz && !argz_len)); + + if (sep) + { + --argz_len; /* don't stringify the terminating EOS */ + while (--argz_len > 0) + { + if (argz[argz_len] == EOS_CHAR) + argz[argz_len] = sep; + } + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argz_.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argz_.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/argz_.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/argz_.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,57 @@ +/* lt__argz.h -- internal argz interface for non-glibc systems + Copyright (C) 2004 Free Software Foundation, Inc. + Originally by Gary V. Vaughan + + NOTE: The canonical source of this file is maintained with the + GNU Libtool package. Report bugs to bug-libtool@gnu.org. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#if !defined(LT__ARGZ_H) +#define LT__ARGZ_H 1 + +#include +#include + +#if defined(LTDL) +# include "lt__glibc.h" +# include "lt_system.h" +#else +# define LT_SCOPE +#endif + +#if defined(_cplusplus) +extern "C" { +#endif + +LT_SCOPE error_t argz_append (char **pargz, size_t *pargz_len, + const char *buf, size_t buf_len); +LT_SCOPE error_t argz_create_sep(const char *str, int delim, + char **pargz, size_t *pargz_len); +LT_SCOPE error_t argz_insert (char **pargz, size_t *pargz_len, + char *before, const char *entry); +LT_SCOPE char * argz_next (char *argz, size_t argz_len, + const char *entry); +LT_SCOPE void argz_stringify (char *argz, size_t argz_len, int sep); + +#if defined(_cplusplus) +} +#endif + +#if !defined(LTDL) +# undef LT_SCOPE +#endif + +#endif /*!defined(LT__ARGZ_H)*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/asnprintf.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/asnprintf.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/asnprintf.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/asnprintf.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,37 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "vasnprintf.h" + +#include + +char * +asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) +{ + va_list args; + char *result; + + va_start (args, format); + result = vasnprintf (resultbuf, lengthp, format, args); + va_end (args); + return result; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/basename.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/basename.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/basename.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/basename.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,131 @@ +/* basename.c -- return the last element in a file name + + Copyright (C) 1990, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006 Free + Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "dirname.h" + +#include +#include "xalloc.h" +#include "xstrndup.h" + +/* Return the address of the last file name component of NAME. If + NAME has no relative file name components because it is a file + system root, return the empty string. */ + +char * +last_component (char const *name) +{ + char const *base = name + FILE_SYSTEM_PREFIX_LEN (name); + char const *p; + bool saw_slash = false; + + while (ISSLASH (*base)) + base++; + + for (p = base; *p; p++) + { + if (ISSLASH (*p)) + saw_slash = true; + else if (saw_slash) + { + base = p; + saw_slash = false; + } + } + + return (char *) base; +} + + +/* In general, we can't use the builtin `basename' function if available, + since it has different meanings in different environments. + In some environments the builtin `basename' modifies its argument. + + Return the last file name component of NAME, allocated with + xmalloc. On systems with drive letters, a leading "./" + distinguishes relative names that would otherwise look like a drive + letter. Unlike POSIX basename(), NAME cannot be NULL, + base_name("") returns "", and the first trailing slash is not + stripped. + + If lstat (NAME) would succeed, then { chdir (dir_name (NAME)); + lstat (base_name (NAME)); } will access the same file. Likewise, + if the sequence { chdir (dir_name (NAME)); + rename (base_name (NAME), "foo"); } succeeds, you have renamed NAME + to "foo" in the same directory NAME was in. */ + +char * +base_name (char const *name) +{ + char const *base = last_component (name); + size_t length; + + /* If there is no last component, then name is a file system root or the + empty string. */ + if (! *base) + return xstrndup (name, base_len (name)); + + /* Collapse a sequence of trailing slashes into one. */ + length = base_len (base); + if (ISSLASH (base[length])) + length++; + + /* On systems with drive letters, `a/b:c' must return `./b:c' rather + than `b:c' to avoid confusion with a drive letter. On systems + with pure POSIX semantics, this is not an issue. */ + if (FILE_SYSTEM_PREFIX_LEN (base)) + { + char *p = xmalloc (length + 3); + p[0] = '.'; + p[1] = '/'; + memcpy (p + 2, base, length); + p[length + 2] = '\0'; + return p; + } + + /* Finally, copy the basename. */ + return xstrndup (base, length); +} + +/* Return the length of the basename NAME. Typically NAME is the + value returned by base_name or last_component. Act like strlen + (NAME), except omit all trailing slashes. */ + +size_t +base_len (char const *name) +{ + size_t len; + size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name); + + for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--) + continue; + + if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1 + && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2]) + return 2; + + if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len + && len == prefix_len && ISSLASH (name[prefix_len])) + return prefix_len + 1; + + return len; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/dirname.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/dirname.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/dirname.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/dirname.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,87 @@ +/* dirname.c -- return all but the last element in a file name + + Copyright (C) 1990, 1998, 2000, 2001, 2003, 2004, 2005, 2006 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "dirname.h" + +#include +#include "xalloc.h" + +/* Return the length of the prefix of FILE that will be used by + dir_name. If FILE is in the working directory, this returns zero + even though `dir_name (FILE)' will return ".". Works properly even + if there are trailing slashes (by effectively ignoring them). */ + +size_t +dir_len (char const *file) +{ + size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file); + size_t length; + + /* Advance prefix_length beyond important leading slashes. */ + prefix_length += (prefix_length != 0 + ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE + && ISSLASH (file[prefix_length])) + : (ISSLASH (file[0]) + ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT + && ISSLASH (file[1]) && ! ISSLASH (file[2]) + ? 2 : 1)) + : 0)); + + /* Strip the basename and any redundant slashes before it. */ + for (length = last_component (file) - file; + prefix_length < length; length--) + if (! ISSLASH (file[length - 1])) + break; + return length; +} + + +/* In general, we can't use the builtin `dirname' function if available, + since it has different meanings in different environments. + In some environments the builtin `dirname' modifies its argument. + + Return the leading directories part of FILE, allocated with xmalloc. + Works properly even if there are trailing slashes (by effectively + ignoring them). Unlike POSIX dirname(), FILE cannot be NULL. + + If lstat (FILE) would succeed, then { chdir (dir_name (FILE)); + lstat (base_name (FILE)); } will access the same file. Likewise, + if the sequence { chdir (dir_name (FILE)); + rename (base_name (FILE), "foo"); } succeeds, you have renamed FILE + to "foo" in the same directory FILE was in. */ + +char * +dir_name (char const *file) +{ + size_t length = dir_len (file); + bool append_dot = (length == 0 + || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE + && length == FILE_SYSTEM_PREFIX_LEN (file) + && file[2] != '\0' && ! ISSLASH (file[2]))); + char *dir = xmalloc (length + append_dot + 1); + memcpy (dir, file, length); + if (append_dot) + dir[length++] = '.'; + dir[length] = '\0'; + return dir; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/dirname.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/dirname.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/dirname.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/dirname.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,70 @@ +/* Take file names apart into directory and base names. + + Copyright (C) 1998, 2001, 2003-2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef DIRNAME_H_ +# define DIRNAME_H_ 1 + +# include +# include + +# ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +# endif + +# ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +# endif + +# ifndef FILE_SYSTEM_PREFIX_LEN +# if FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX + /* This internal macro assumes ASCII, but all hosts that support drive + letters use ASCII. */ +# define _IS_DRIVE_LETTER(c) (((unsigned int) (c) | ('a' - 'A')) - 'a' \ + <= 'z' - 'a') +# define FILE_SYSTEM_PREFIX_LEN(Filename) \ + (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0) +# else +# define FILE_SYSTEM_PREFIX_LEN(Filename) 0 +# endif +# endif + +# ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE +# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0 +# endif + +# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT +# define DOUBLE_SLASH_IS_DISTINCT_ROOT 1 +# endif + +# if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE +# define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)]) +# else +# define IS_ABSOLUTE_FILE_NAME(F) \ + (ISSLASH ((F)[0]) || 0 < FILE_SYSTEM_PREFIX_LEN (F)) +# endif +# define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F)) + +char *base_name (char const *file); +char *dir_name (char const *file); +size_t base_len (char const *file); +size_t dir_len (char const *file); +char *last_component (char const *file); + +bool strip_trailing_slashes (char *file); + +#endif /* not DIRNAME_H_ */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/error.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/error.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/error.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/error.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,304 @@ +/* Error handler for noninteractive utilities + Copyright (C) 1990-1998, 2000-2003, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by David MacKenzie . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "error.h" + +#include +#include +#include +#include + +#if !_LIBC && ENABLE_NLS +# include "gettext.h" +#endif + +#ifdef _LIBC +# include +# define mbsrtowcs __mbsrtowcs +#endif + +#if USE_UNLOCKED_IO +# include "unlocked-io.h" +#endif + +#ifndef _ +# define _(String) String +#endif + +/* If NULL, error will flush stdout, then print on stderr the program + name, a colon and a space. Otherwise, error will call this + function without parameters instead. */ +void (*error_print_progname) (void); + +/* This variable is incremented each time `error' is called. */ +unsigned int error_message_count; + +#ifdef _LIBC +/* In the GNU C library, there is a predefined variable for this. */ + +# define program_name program_invocation_name +# include +# include + +/* In GNU libc we want do not want to use the common name `error' directly. + Instead make it a weak alias. */ +extern void __error (int status, int errnum, const char *message, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); +extern void __error_at_line (int status, int errnum, const char *file_name, + unsigned int line_number, const char *message, + ...) + __attribute__ ((__format__ (__printf__, 5, 6)));; +# define error __error +# define error_at_line __error_at_line + +# include +# define fflush(s) INTUSE(_IO_fflush) (s) +# undef putc +# define putc(c, fp) INTUSE(_IO_putc) (c, fp) + +# include + +#else /* not _LIBC */ + +# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P +# ifndef HAVE_DECL_STRERROR_R +"this configure-time declaration test was not run" +# endif +char *strerror_r (); +# endif + +# ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +# endif + +/* The calling program should define program_name and set it to the + name of the executing program. */ +extern char *program_name; + +# if HAVE_STRERROR_R || defined strerror_r +# define __strerror_r strerror_r +# endif +#endif /* not _LIBC */ + +static void +print_errno_message (int errnum) +{ + char const *s = NULL; + +#if defined HAVE_STRERROR_R || _LIBC + char errbuf[1024]; +# if STRERROR_R_CHAR_P || _LIBC + s = __strerror_r (errnum, errbuf, sizeof errbuf); +# else + if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0) + s = errbuf; +# endif +#endif + +#if !_LIBC + if (! s && ! (s = strerror (errnum))) + s = _("Unknown system error"); +#endif + +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + { + __fwprintf (stderr, L": %s", s); + return; + } +#endif + + fprintf (stderr, ": %s", s); +} + +static void +error_tail (int status, int errnum, const char *message, va_list args) +{ +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + { +# define ALLOCA_LIMIT 2000 + size_t len = strlen (message) + 1; + const wchar_t *wmessage = L"out of memory"; + wchar_t *wbuf = (len < ALLOCA_LIMIT + ? alloca (len * sizeof *wbuf) + : len <= SIZE_MAX / sizeof *wbuf + ? malloc (len * sizeof *wbuf) + : NULL); + + if (wbuf) + { + size_t res; + mbstate_t st; + const char *tmp = message; + memset (&st, '\0', sizeof (st)); + res = mbsrtowcs (wbuf, &tmp, len, &st); + wmessage = res == (size_t) -1 ? L"???" : wbuf; + } + + __vfwprintf (stderr, wmessage, args); + if (! (len < ALLOCA_LIMIT)) + free (wbuf); + } + else +#endif + vfprintf (stderr, message, args); + va_end (args); + + ++error_message_count; + if (errnum) + print_errno_message (errnum); +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + putwc (L'\n', stderr); + else +#endif + putc ('\n', stderr); + fflush (stderr); + if (status) + exit (status); +} + + +/* Print the program name and error message MESSAGE, which is a printf-style + format string with optional args. + If ERRNUM is nonzero, print its corresponding system error message. + Exit with status STATUS if it is nonzero. */ +void +error (int status, int errnum, const char *message, ...) +{ + va_list args; + +#if defined _LIBC && defined __libc_ptf_call + /* We do not want this call to be cut short by a thread + cancellation. Therefore disable cancellation for now. */ + int state = PTHREAD_CANCEL_ENABLE; + __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), + 0); +#endif + + fflush (stdout); +#ifdef _LIBC + _IO_flockfile (stderr); +#endif + if (error_print_progname) + (*error_print_progname) (); + else + { +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s: ", program_name); + else +#endif + fprintf (stderr, "%s: ", program_name); + } + + va_start (args, message); + error_tail (status, errnum, message, args); + +#ifdef _LIBC + _IO_funlockfile (stderr); +# ifdef __libc_ptf_call + __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); +# endif +#endif +} + +/* Sometimes we want to have at most one error per line. This + variable controls whether this mode is selected or not. */ +int error_one_per_line; + +void +error_at_line (int status, int errnum, const char *file_name, + unsigned int line_number, const char *message, ...) +{ + va_list args; + + if (error_one_per_line) + { + static const char *old_file_name; + static unsigned int old_line_number; + + if (old_line_number == line_number + && (file_name == old_file_name + || strcmp (old_file_name, file_name) == 0)) + /* Simply return and print nothing. */ + return; + + old_file_name = file_name; + old_line_number = line_number; + } + +#if defined _LIBC && defined __libc_ptf_call + /* We do not want this call to be cut short by a thread + cancellation. Therefore disable cancellation for now. */ + int state = PTHREAD_CANCEL_ENABLE; + __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), + 0); +#endif + + fflush (stdout); +#ifdef _LIBC + _IO_flockfile (stderr); +#endif + if (error_print_progname) + (*error_print_progname) (); + else + { +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s: ", program_name); + else +#endif + fprintf (stderr, "%s:", program_name); + } + + if (file_name != NULL) + { +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s:%d: ", file_name, line_number); + else +#endif + fprintf (stderr, "%s:%d: ", file_name, line_number); + } + + va_start (args, message); + error_tail (status, errnum, message, args); + +#ifdef _LIBC + _IO_funlockfile (stderr); +# ifdef __libc_ptf_call + __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); +# endif +#endif +} + +#ifdef _LIBC +/* Make the weak alias. */ +# undef error +# undef error_at_line +weak_alias (__error, error) +weak_alias (__error_at_line, error_at_line) +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/error.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/error.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/error.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/error.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,66 @@ +/* Declaration for error-reporting function + Copyright (C) 1995, 1996, 1997, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ERROR_H +#define _ERROR_H 1 + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) +# define __attribute__(Spec) /* empty */ +# endif +/* The __-protected variants of `format' and `printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Print a message with `fprintf (stderr, FORMAT, ...)'; + if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM). + If STATUS is nonzero, terminate the program with `exit (STATUS)'. */ + +extern void error (int __status, int __errnum, const char *__format, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); + +extern void error_at_line (int __status, int __errnum, const char *__fname, + unsigned int __lineno, const char *__format, ...) + __attribute__ ((__format__ (__printf__, 5, 6))); + +/* If NULL, error will flush stdout, then print on stderr the program + name, a colon and a space. Otherwise, error will call this + function without parameters instead. */ +extern void (*error_print_progname) (void); + +/* This variable is incremented each time `error' is called. */ +extern unsigned int error_message_count; + +/* Sometimes we want to have at most one error per line. This + variable controls whether this mode is selected or not. */ +extern int error_one_per_line; + +#ifdef __cplusplus +} +#endif + +#endif /* error.h */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/exitfail.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/exitfail.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/exitfail.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/exitfail.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,27 @@ +/* Failure exit status + + Copyright (C) 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "exitfail.h" +#include "exit.h" + +int volatile exit_failure = EXIT_FAILURE; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/exitfail.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/exitfail.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/exitfail.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/exitfail.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,20 @@ +/* Failure exit status + + Copyright (C) 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +extern int volatile exit_failure; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/exit.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/exit.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/exit.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/exit.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,32 @@ +/* exit() function. + Copyright (C) 1995, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _EXIT_H +#define _EXIT_H + +/* Get exit() declaration. */ +#include + +/* Some systems do not define EXIT_*, despite otherwise supporting C89. */ +#ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +#endif +#ifndef EXIT_FAILURE +# define EXIT_FAILURE 1 +#endif + +#endif /* _EXIT_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/getopt1.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/getopt1.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/getopt1.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/getopt1.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,174 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# include +#else +# include "getopt.h" +#endif +#include "getopt_int.h" + +#include + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal (argc, (char **) argv, options, long_options, + opt_index, 0, 0); +} + +int +_getopt_long_r (int argc, char **argv, const char *options, + const struct option *long_options, int *opt_index, + struct _getopt_data *d) +{ + return _getopt_internal_r (argc, argv, options, long_options, opt_index, + 0, 0, d); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (int argc, char *__getopt_argv_const *argv, + const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal (argc, (char **) argv, options, long_options, + opt_index, 1, 0); +} + +int +_getopt_long_only_r (int argc, char **argv, const char *options, + const struct option *long_options, int *opt_index, + struct _getopt_data *d) +{ + return _getopt_internal_r (argc, argv, options, long_options, opt_index, + 1, 0, d); +} + + +#ifdef TEST + +#include + +int +main (int argc, char **argv) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/getopt.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/getopt.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/getopt.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/getopt.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,1191 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002,2003,2004,2006 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "getopt.h" + +#include +#include +#include +#include + +#ifdef __VMS +# include +#endif + +#ifdef _LIBC +# include +#else +# include "gettext.h" +# define _(msgid) gettext (msgid) +#endif + +#if defined _LIBC && defined USE_IN_LIBIO +# include +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + +/* Unlike standard Unix `getopt', functions like `getopt_long' + let the user intersperse the options with the other arguments. + + As `getopt_long' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Using `getopt' or setting the environment variable POSIXLY_CORRECT + disables permutation. + Then the application's behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt_int.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Keep a global copy of all internal members of getopt_data. */ + +static struct _getopt_data getopt_data; + + +#if defined HAVE_DECL_GETENV && !HAVE_DECL_GETENV +extern char *getenv (); +#endif + +#ifdef _LIBC +/* Stored original parameters. + XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ +extern int __libc_argc; +extern char **__libc_argv; + +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +# ifdef USE_NONOPTION_FLAGS +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; +# endif + +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ + if (d->__nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +# else +# define SWAP_FLAGS(ch1, ch2) +# endif +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +static void +exchange (char **argv, struct _getopt_data *d) +{ + int bottom = d->__first_nonopt; + int middle = d->__last_nonopt; + int top = d->optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + d->__nonoption_flags_max_len), + '\0', top + 1 - d->__nonoption_flags_max_len); + d->__nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + d->__first_nonopt += (d->optind - d->__last_nonopt); + d->__last_nonopt = d->optind; +} + +/* Initialize the internal data when the first call is made. */ + +static const char * +_getopt_initialize (int argc, char **argv, const char *optstring, + int posixly_correct, struct _getopt_data *d) +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + d->__first_nonopt = d->__last_nonopt = d->optind; + + d->__nextchar = NULL; + + d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + d->__ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + d->__ordering = REQUIRE_ORDER; + ++optstring; + } + else if (d->__posixly_correct) + d->__ordering = REQUIRE_ORDER; + else + d->__ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + if (!d->__posixly_correct + && argc == __libc_argc && argv == __libc_argv) + { + if (d->__nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + d->__nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = d->__nonoption_flags_max_len = strlen (orig_str); + if (d->__nonoption_flags_max_len < argc) + d->__nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (d->__nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + d->__nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', d->__nonoption_flags_max_len - len); + } + } + d->__nonoption_flags_len = d->__nonoption_flags_max_len; + } + else + d->__nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. + + If POSIXLY_CORRECT is nonzero, behave as if the POSIXLY_CORRECT + environment variable were set. */ + +int +_getopt_internal_r (int argc, char **argv, const char *optstring, + const struct option *longopts, int *longind, + int long_only, int posixly_correct, struct _getopt_data *d) +{ + int print_errors = d->opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + d->optarg = NULL; + + if (d->optind == 0 || !d->__initialized) + { + if (d->optind == 0) + d->optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring, + posixly_correct, d); + d->__initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#if defined _LIBC && defined USE_NONOPTION_FLAGS +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \ + || (d->optind < d->__nonoption_flags_len \ + && __getopt_nonoption_flags[d->optind] == '1')) +#else +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') +#endif + + if (d->__nextchar == NULL || *d->__nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (d->__last_nonopt > d->optind) + d->__last_nonopt = d->optind; + if (d->__first_nonopt > d->optind) + d->__first_nonopt = d->optind; + + if (d->__ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange ((char **) argv, d); + else if (d->__last_nonopt != d->optind) + d->__first_nonopt = d->optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (d->optind < argc && NONOPTION_P) + d->optind++; + d->__last_nonopt = d->optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (d->optind != argc && !strcmp (argv[d->optind], "--")) + { + d->optind++; + + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange ((char **) argv, d); + else if (d->__first_nonopt == d->__last_nonopt) + d->__first_nonopt = d->optind; + d->__last_nonopt = argc; + + d->optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (d->optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (d->__first_nonopt != d->__last_nonopt) + d->optind = d->__first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (d->__ordering == REQUIRE_ORDER) + return -1; + d->optarg = argv[d->optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + d->__nextchar = (argv[d->optind] + 1 + + (longopts != NULL && argv[d->optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[d->optind][1] == '-' + || (long_only && (argv[d->optind][2] + || !strchr (optstring, argv[d->optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) + { + if ((unsigned int) (nameend - d->__nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[d->optind]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[d->optind]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optind++; + d->optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + d->optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (argv[d->optind - 1][1] == '-') + { + /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("\ +%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); +#else + fprintf (stderr, _("\ +%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); +#endif + } + else + { + /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("\ +%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[d->optind - 1][0], + pfound->name); +#else + fprintf (stderr, _("\ +%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[d->optind - 1][0], + pfound->name); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + + d->__nextchar += strlen (d->__nextchar); + + d->optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + d->__nextchar += strlen (d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[d->optind][1] == '-' + || strchr (optstring, *d->__nextchar) == NULL) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (argv[d->optind][1] == '-') + { + /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), + argv[0], d->__nextchar); +#else + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], d->__nextchar); +#endif + } + else + { + /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[d->optind][0], d->__nextchar); +#else + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[d->optind][0], d->__nextchar); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + d->__nextchar = (char *) ""; + d->optind++; + d->optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *d->__nextchar++; + char *temp = strchr (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*d->__nextchar == '\0') + ++d->optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (d->__posixly_correct) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: illegal option -- %c\n"), + argv[0], c); +#else + fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); +#endif + } + else + { +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: invalid option -- %c\n"), + argv[0], c); +#else + fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + d->optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, + _("%s: option requires an argument -- %c\n"), + argv[0], c) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); +#endif + } + d->optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `d->optind' once; + increment it again when taking next ARGV-elt as argument. */ + d->optarg = argv[d->optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; + nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) + { + if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[d->optind]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[d->optind]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); +#endif + } + + d->__nextchar += strlen (d->__nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + d->__nextchar += strlen (d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + d->__nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + d->optind++; + } + else + d->optarg = NULL; + d->__nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option requires an argument -- %c\n"), + argv[0], c) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); +#endif + } + d->optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + d->optarg = argv[d->optind++]; + d->__nextchar = NULL; + } + } + return c; + } +} + +int +_getopt_internal (int argc, char **argv, const char *optstring, + const struct option *longopts, int *longind, + int long_only, int posixly_correct) +{ + int result; + + getopt_data.optind = optind; + getopt_data.opterr = opterr; + + result = _getopt_internal_r (argc, argv, optstring, longopts, longind, + long_only, posixly_correct, &getopt_data); + + optind = getopt_data.optind; + optarg = getopt_data.optarg; + optopt = getopt_data.optopt; + + return result; +} + +/* glibc gets a LSB-compliant getopt. + Standalone applications get a POSIX-compliant getopt. */ +#if _LIBC +enum { POSIXLY_CORRECT = 0 }; +#else +enum { POSIXLY_CORRECT = 1 }; +#endif + +int +getopt (int argc, char *const *argv, const char *optstring) +{ + return _getopt_internal (argc, (char **) argv, optstring, NULL, NULL, 0, + POSIXLY_CORRECT); +} + + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (int argc, char **argv) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/getopt_.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/getopt_.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/getopt_.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/getopt_.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,225 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2005 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* Standalone applications should #define __GETOPT_PREFIX to an + identifier that prefixes the external functions and variables + defined in this header. When this happens, include the + headers that might declare getopt so that they will not cause + confusion if included after this file. Then systematically rename + identifiers so that they do not collide with the system functions + and variables. Renaming avoids problems with some compilers and + linkers. */ +#if defined __GETOPT_PREFIX && !defined __need_getopt +# include +# include +# include +# undef __need_getopt +# undef getopt +# undef getopt_long +# undef getopt_long_only +# undef optarg +# undef opterr +# undef optind +# undef optopt +# define __GETOPT_CONCAT(x, y) x ## y +# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) +# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) +# define getopt __GETOPT_ID (getopt) +# define getopt_long __GETOPT_ID (getopt_long) +# define getopt_long_only __GETOPT_ID (getopt_long_only) +# define optarg __GETOPT_ID (optarg) +# define opterr __GETOPT_ID (opterr) +# define optind __GETOPT_ID (optind) +# define optopt __GETOPT_ID (optopt) +#endif + +/* Standalone applications get correct prototypes for getopt_long and + getopt_long_only; they declare "char **argv". libc uses prototypes + with "char *const *argv" that are incorrect because getopt_long and + getopt_long_only can permute argv; this is required for backward + compatibility (e.g., for LSB 2.0.1). + + This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt', + but it caused redefinition warnings if both unistd.h and getopt.h were + included, since unistd.h includes getopt.h having previously defined + __need_getopt. + + The only place where __getopt_argv_const is used is in definitions + of getopt_long and getopt_long_only below, but these are visible + only if __need_getopt is not defined, so it is quite safe to rewrite + the conditional as follows: +*/ +#if !defined __need_getopt +# if defined __GETOPT_PREFIX +# define __getopt_argv_const /* empty */ +# else +# define __getopt_argv_const const +# endif +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include +#endif + +#ifndef __THROW +# ifndef __GNUC_PREREQ +# define __GNUC_PREREQ(maj, min) (0) +# endif +# if defined __cplusplus && __GNUC_PREREQ (2,8) +# define __THROW throw () +# else +# define __THROW +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ + const char *name; + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) + __THROW; + +#ifndef __need_getopt +extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind) + __THROW; +extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind) + __THROW; + +#endif + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/getopt_int.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/getopt_int.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/getopt_int.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/getopt_int.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,131 @@ +/* Internal declarations for getopt. + Copyright (C) 1989-1994,1996-1999,2001,2003,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _GETOPT_INT_H +#define _GETOPT_INT_H 1 + +extern int _getopt_internal (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only, int __posixly_correct); + + +/* Reentrant versions which can handle parsing multiple argument + vectors at the same time. */ + +/* Data type for reentrant functions. */ +struct _getopt_data +{ + /* These have exactly the same meaning as the corresponding global + variables, except that they are used for the reentrant + versions of getopt. */ + int optind; + int opterr; + int optopt; + char *optarg; + + /* Internal members. */ + + /* True if the internal members have been initialized. */ + int __initialized; + + /* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + char *__nextchar; + + /* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters, or by calling getopt. + + PERMUTE is the default. We permute the contents of ARGV as we + scan, so that eventually all the non-options are at the end. + This allows options to be given in any order, even with programs + that were not written to expect this. + + RETURN_IN_ORDER is an option available to programs that were + written to expect options and other ARGV-elements in any order + and that care about the ordering of the two. We describe each + non-option ARGV-element as if it were the argument of an option + with character code 1. Using `-' as the first character of the + list of option characters selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + + enum + { + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER + } __ordering; + + /* If the POSIXLY_CORRECT environment variable is set + or getopt was called. */ + int __posixly_correct; + + + /* Handle permutation of arguments. */ + + /* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first + of them; `last_nonopt' is the index after the last of them. */ + + int __first_nonopt; + int __last_nonopt; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + int __nonoption_flags_max_len; + int __nonoption_flags_len; +# endif +}; + +/* The initializer is necessary to set OPTIND and OPTERR to their + default values and to clear the initialization flag. */ +#define _GETOPT_DATA_INITIALIZER { 1, 1 } + +extern int _getopt_internal_r (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only, int __posixly_correct, + struct _getopt_data *__data); + +extern int _getopt_long_r (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + struct _getopt_data *__data); + +extern int _getopt_long_only_r (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, + int *__longind, + struct _getopt_data *__data); + +#endif /* getopt_int.h */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/gettext.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/gettext.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/gettext.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/gettext.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,78 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + , which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include +# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H +# include +# endif +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +#endif /* _LIBGETTEXT_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/gettimeofday.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/gettimeofday.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/gettimeofday.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/gettimeofday.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,123 @@ +/* Work around the bug in some systems whereby gettimeofday clobbers the + static buffer that localtime uses for it's return value. The gettimeofday + function from Mac OS X 10.0.4, i.e. Darwin 1.3.7 has this problem. + The tzset replacement is necessary for at least Solaris 2.5, 2.5.1, and 2.6. + Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* written by Jim Meyering */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Disable the definitions of these functions (from config.h) + so we can use the library versions here. */ +#undef gettimeofday +#undef gmtime +#undef localtime +#undef tzset + +#include + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include + +static struct tm *localtime_buffer_addr; + +/* This is a wrapper for localtime. It is used only on systems for which + gettimeofday clobbers the static buffer used for localtime's result. + + On the first call, record the address of the static buffer that + localtime uses for its result. */ + +struct tm * +rpl_localtime (const time_t *timep) +{ + struct tm *tm = localtime (timep); + + if (! localtime_buffer_addr) + localtime_buffer_addr = tm; + + return tm; +} + +/* Same as above, since gmtime and localtime use the same buffer. */ +struct tm * +rpl_gmtime (const time_t *timep) +{ + struct tm *tm = gmtime (timep); + + if (! localtime_buffer_addr) + localtime_buffer_addr = tm; + + return tm; +} + +/* This is a wrapper for gettimeofday. It is used only on systems for which + gettimeofday clobbers the static buffer used for localtime's result. + + Save and restore the contents of the buffer used for localtime's result + around the call to gettimeofday. */ + +int +rpl_gettimeofday (struct timeval *tv, struct timezone *tz) +{ + struct tm save; + int result; + + if (! localtime_buffer_addr) + { + time_t t = 0; + localtime_buffer_addr = localtime (&t); + } + + save = *localtime_buffer_addr; + result = gettimeofday (tv, tz); + *localtime_buffer_addr = save; + + return result; +} + +/* This is a wrapper for tzset. It is used only on systems for which + tzset may clobber the static buffer used for localtime's result. + Save and restore the contents of the buffer used for localtime's + result around the call to tzset. */ +void +rpl_tzset (void) +{ + struct tm save; + + if (! localtime_buffer_addr) + { + time_t t = 0; + localtime_buffer_addr = localtime (&t); + } + + save = *localtime_buffer_addr; + tzset (); + *localtime_buffer_addr = save; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,233 @@ +## Process this file with automake to produce Makefile.in. +# Copyright (C) 2004-2006 Free Software Foundation, Inc. +# +# This file is free software, distributed under the terms of the GNU +# General Public License. As a special exception to the GNU General +# Public License, this file may be distributed as part of a program +# that contains a configuration script generated by Autoconf, under +# the same distribution terms as the rest of that program. +# +# Generated by gnulib-tool. +# Reproduce by: gnulib-tool --import --dir=. --lib=libmisc --source-base=lib --m4-base=m4 --aux-dir=. --macro-prefix=gl argp argz gettimeofday unistd + +AUTOMAKE_OPTIONS = 1.5 gnits no-dependencies + +noinst_LIBRARIES = libmisc.a + +libmisc_a_SOURCES = +libmisc_a_LIBADD = @LIBOBJS@ +noinst_HEADERS = +EXTRA_DIST = +BUILT_SOURCES = +SUFFIXES = +MOSTLYCLEANFILES = +MOSTLYCLEANDIRS = +CLEANFILES = +DISTCLEANFILES = +MAINTAINERCLEANFILES = + +AM_CPPFLAGS = + +## begin gnulib module alloca + + +libmisc_a_LIBADD += @ALLOCA@ +## end gnulib module alloca + +## begin gnulib module alloca-opt + +BUILT_SOURCES += $(ALLOCA_H) +EXTRA_DIST += alloca_.h + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +alloca.h: alloca_.h + cp $(srcdir)/alloca_.h $@-t + mv $@-t $@ +MOSTLYCLEANFILES += alloca.h alloca.h-t + +## end gnulib module alloca-opt + +## begin gnulib module argp + +libmisc_a_SOURCES += argp.h argp-ba.c argp-eexst.c \ + argp-fmtstream.c argp-fmtstream.h argp-fs-xinl.c argp-help.c \ + argp-namefrob.h argp-parse.c argp-pin.c argp-pv.c argp-pvh.c \ + argp-xinl.c + +## end gnulib module argp + +## begin gnulib module argz + +BUILT_SOURCES += $(ARGZ_H) +EXTRA_DIST += argz_.h + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +argz.h: argz_.h + cp $(srcdir)/argz_.h $@-t + mv $@-t $@ +MOSTLYCLEANFILES += argz.h argz.h-t + +## end gnulib module argz + +## begin gnulib module dirname + +libmisc_a_SOURCES += basename.c stripslash.c + +## end gnulib module dirname + +## begin gnulib module exit + +libmisc_a_SOURCES += exit.h + +## end gnulib module exit + +## begin gnulib module getopt + +BUILT_SOURCES += $(GETOPT_H) +EXTRA_DIST += getopt_.h getopt_int.h + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +getopt.h: getopt_.h + cp $(srcdir)/getopt_.h $@-t + mv $@-t $@ +MOSTLYCLEANFILES += getopt.h getopt.h-t + +## end gnulib module getopt + +## begin gnulib module gettext-h + +libmisc_a_SOURCES += gettext.h + +## end gnulib module gettext-h + +## begin gnulib module mbchar + +libmisc_a_SOURCES += mbchar.h + +## end gnulib module mbchar + +## begin gnulib module mbuiter + +libmisc_a_SOURCES += mbuiter.h + +## end gnulib module mbuiter + +## begin gnulib module minmax + +libmisc_a_SOURCES += minmax.h + +## end gnulib module minmax + +## begin gnulib module size_max + +libmisc_a_SOURCES += size_max.h + +## end gnulib module size_max + +## begin gnulib module stdbool + +BUILT_SOURCES += $(STDBOOL_H) +EXTRA_DIST += stdbool_.h + +# We need the following in order to create when the system +# doesn't have one that works. +stdbool.h: stdbool_.h + sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool_.h > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += stdbool.h stdbool.h-t + +## end gnulib module stdbool + +## begin gnulib module strcase + +libmisc_a_SOURCES += strcase.h + +## end gnulib module strcase + +## begin gnulib module strchrnul + +libmisc_a_SOURCES += strchrnul.h + +## end gnulib module strchrnul + +## begin gnulib module strnlen1 + +libmisc_a_SOURCES += strnlen1.h strnlen1.c + +## end gnulib module strnlen1 + +## begin gnulib module sysexits + +BUILT_SOURCES += $(SYSEXITS_H) +EXTRA_DIST += sysexit_.h + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +sysexits.h: sysexit_.h + cp $(srcdir)/sysexit_.h sysexits.h-t + mv sysexits.h-t sysexits.h +MOSTLYCLEANFILES += sysexits.h sysexits.h-t + +## end gnulib module sysexits + +## begin gnulib module unistd + +BUILT_SOURCES += $(UNISTD_H) + +# We need the following in order to create an empty placeholder for +# when the system doesn't have one. +unistd.h: + echo '/* Empty placeholder for $@. */' >$@ +MOSTLYCLEANFILES += unistd.h + +## end gnulib module unistd + +## begin gnulib module vasnprintf + +libmisc_a_SOURCES += printf-args.h printf-parse.h vasnprintf.h + +## end gnulib module vasnprintf + +## begin gnulib module vsnprintf + +libmisc_a_SOURCES += vsnprintf.h + +## end gnulib module vsnprintf + +## begin gnulib module wcwidth + +libmisc_a_SOURCES += wcwidth.h + +## end gnulib module wcwidth + +## begin gnulib module xalloc-die + +libmisc_a_SOURCES += xalloc-die.c + +## end gnulib module xalloc-die + +## begin gnulib module xsize + +libmisc_a_SOURCES += xsize.h + +## end gnulib module xsize + +## begin gnulib module xstrndup + +libmisc_a_SOURCES += xstrndup.h xstrndup.c + +## end gnulib module xstrndup + + +mostlyclean-local: + @test -z "$(MOSTLYCLEANDIRS)" || \ + for dir in $(MOSTLYCLEANDIRS); do \ + if test -d $$dir; then \ + echo "rmdir $$dir"; rmdir $$dir; \ + fi; \ + done + +# Makefile.am ends here diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/mbchar.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/mbchar.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/mbchar.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/mbchar.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,38 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "mbchar.h" + +#if IS_BASIC_ASCII + +/* Bit table of characters in the ISO C "basic character set". */ +unsigned int is_basic_table [UCHAR_MAX / 32 + 1] = +{ + 0x00001a00, /* '\t' '\v' '\f' */ + 0xffffffef, /* ' '...'#' '%'...'?' */ + 0xfffffffe, /* 'A'...'Z' '[' '\\' ']' '^' '_' */ + 0x7ffffffe /* 'a'...'z' '{' '|' '}' '~' */ + /* The remaining bits are 0. */ +}; + +#endif /* IS_BASIC_ASCII */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/mbchar.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/mbchar.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/mbchar.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/mbchar.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,354 @@ +/* Multibyte character data type. + Copyright (C) 2001, 2005-2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Bruno Haible . */ + +/* A multibyte character is a short subsequence of a char* string, + representing a single wide character. + + We use multibyte characters instead of wide characters because of + the following goals: + 1) correct multibyte handling, i.e. operate according to the LC_CTYPE + locale, + 2) ease of maintenance, i.e. the maintainer needs not know all details + of the ISO C 99 standard, + 3) don't fail grossly if the input is not in the encoding set by the + locale, because often different encodings are in use in the same + countries (ISO-8859-1/UTF-8, EUC-JP/Shift_JIS, ...), + 4) fast in the case of ASCII characters, + 5) portability, i.e. don't make unportable assumptions about wchar_t. + + Multibyte characters are only accessed through the mb* macros. + + mb_ptr (mbc) + return a pointer to the beginning of the multibyte sequence. + + mb_len (mbc) + returns the number of bytes occupied by the multibyte sequence. + Always > 0. + + mb_iseq (mbc, sc) + returns true if mbc is the standard ASCII character sc. + + mb_isnul (mbc) + returns true if mbc is the nul character. + + mb_cmp (mbc1, mbc2) + returns a positive, zero, or negative value depending on whether mbc1 + sorts after, same or before mbc2. + + mb_casecmp (mbc1, mbc2) + returns a positive, zero, or negative value depending on whether mbc1 + sorts after, same or before mbc2, modulo upper/lowercase conversion. + + mb_equal (mbc1, mbc2) + returns true if mbc1 and mbc2 are equal. + + mb_caseequal (mbc1, mbc2) + returns true if mbc1 and mbc2 are equal modulo upper/lowercase conversion. + + mb_isalnum (mbc) + returns true if mbc is alphanumeric. + + mb_isalpha (mbc) + returns true if mbc is alphabetic. + + mb_isascii(mbc) + returns true if mbc is plain ASCII. + + mb_isblank (mbc) + returns true if mbc is a blank. + + mb_iscntrl (mbc) + returns true if mbc is a control character. + + mb_isdigit (mbc) + returns true if mbc is a decimal digit. + + mb_isgraph (mbc) + returns true if mbc is a graphic character. + + mb_islower (mbc) + returns true if mbc is lowercase. + + mb_isprint (mbc) + returns true if mbc is a printable character. + + mb_ispunct (mbc) + returns true if mbc is a punctuation character. + + mb_isspace (mbc) + returns true if mbc is a space character. + + mb_isupper (mbc) + returns true if mbc is uppercase. + + mb_isxdigit (mbc) + returns true if mbc is a hexadecimal digit. + + mb_width (mbc) + returns the number of columns on the output device occupied by mbc. + Always >= 0. + + mb_putc (mbc, stream) + outputs mbc on stream, a byte oriented FILE stream opened for output. + + mb_setascii (&mbc, sc) + assigns the standard ASCII character sc to mbc. + + mb_copy (&destmbc, &srcmbc) + copies srcmbc to destmbc. + + Here are the function prototypes of the macros. + + extern const char * mb_ptr (const mbchar_t mbc); + extern size_t mb_len (const mbchar_t mbc); + extern bool mb_iseq (const mbchar_t mbc, char sc); + extern bool mb_isnul (const mbchar_t mbc); + extern int mb_cmp (const mbchar_t mbc1, const mbchar_t mbc2); + extern int mb_casecmp (const mbchar_t mbc1, const mbchar_t mbc2); + extern bool mb_equal (const mbchar_t mbc1, const mbchar_t mbc2); + extern bool mb_caseequal (const mbchar_t mbc1, const mbchar_t mbc2); + extern bool mb_isalnum (const mbchar_t mbc); + extern bool mb_isalpha (const mbchar_t mbc); + extern bool mb_isascii (const mbchar_t mbc); + extern bool mb_isblank (const mbchar_t mbc); + extern bool mb_iscntrl (const mbchar_t mbc); + extern bool mb_isdigit (const mbchar_t mbc); + extern bool mb_isgraph (const mbchar_t mbc); + extern bool mb_islower (const mbchar_t mbc); + extern bool mb_isprint (const mbchar_t mbc); + extern bool mb_ispunct (const mbchar_t mbc); + extern bool mb_isspace (const mbchar_t mbc); + extern bool mb_isupper (const mbchar_t mbc); + extern bool mb_isxdigit (const mbchar_t mbc); + extern int mb_width (const mbchar_t mbc); + extern void mb_putc (const mbchar_t mbc, FILE *stream); + extern void mb_setascii (mbchar_t *new, char sc); + extern void mb_copy (mbchar_t *new, const mbchar_t *old); + */ + +#ifndef _MBCHAR_H +#define _MBCHAR_H 1 + +#include +#include + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +#include +#include +#include + +#include + +#include "wcwidth.h" + +#define MBCHAR_BUF_SIZE 24 + +struct mbchar +{ + const char *ptr; /* pointer to current character */ + size_t bytes; /* number of bytes of current character, > 0 */ + bool wc_valid; /* true if wc is a valid wide character */ + wchar_t wc; /* if wc_valid: the current character */ + char buf[MBCHAR_BUF_SIZE]; /* room for the bytes, used for file input only */ +}; + +/* EOF (not a real character) is represented with bytes = 0 and + wc_valid = false. */ + +typedef struct mbchar mbchar_t; + +/* Access the current character. */ +#define mb_ptr(mbc) ((mbc).ptr) +#define mb_len(mbc) ((mbc).bytes) + +/* Comparison of characters. */ +#define mb_iseq(mbc, sc) ((mbc).wc_valid && (mbc).wc == (sc)) +#define mb_isnul(mbc) ((mbc).wc_valid && (mbc).wc == 0) +#define mb_cmp(mbc1, mbc2) \ + ((mbc1).wc_valid \ + ? ((mbc2).wc_valid \ + ? (int) (mbc1).wc - (int) (mbc2).wc \ + : -1) \ + : ((mbc2).wc_valid \ + ? 1 \ + : (mbc1).bytes == (mbc2).bytes \ + ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \ + : (mbc1).bytes < (mbc2).bytes \ + ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \ + : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1))) +#define mb_casecmp(mbc1, mbc2) \ + ((mbc1).wc_valid \ + ? ((mbc2).wc_valid \ + ? (int) towlower ((mbc1).wc) - (int) towlower ((mbc2).wc) \ + : -1) \ + : ((mbc2).wc_valid \ + ? 1 \ + : (mbc1).bytes == (mbc2).bytes \ + ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \ + : (mbc1).bytes < (mbc2).bytes \ + ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \ + : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1))) +#define mb_equal(mbc1, mbc2) \ + ((mbc1).wc_valid && (mbc2).wc_valid \ + ? (mbc1).wc == (mbc2).wc \ + : (mbc1).bytes == (mbc2).bytes \ + && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0) +#define mb_caseequal(mbc1, mbc2) \ + ((mbc1).wc_valid && (mbc2).wc_valid \ + ? towlower ((mbc1).wc) == towlower ((mbc2).wc) \ + : (mbc1).bytes == (mbc2).bytes \ + && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0) + +/* , classification. */ +#define mb_isascii(mbc) \ + ((mbc).wc_valid && (mbc).wc >= 0 && (mbc).wc <= 127) +#define mb_isalnum(mbc) ((mbc).wc_valid && iswalnum ((mbc).wc)) +#define mb_isalpha(mbc) ((mbc).wc_valid && iswalpha ((mbc).wc)) +#define mb_isblank(mbc) ((mbc).wc_valid && iswblank ((mbc).wc)) +#define mb_iscntrl(mbc) ((mbc).wc_valid && iswcntrl ((mbc).wc)) +#define mb_isdigit(mbc) ((mbc).wc_valid && iswdigit ((mbc).wc)) +#define mb_isgraph(mbc) ((mbc).wc_valid && iswgraph ((mbc).wc)) +#define mb_islower(mbc) ((mbc).wc_valid && iswlower ((mbc).wc)) +#define mb_isprint(mbc) ((mbc).wc_valid && iswprint ((mbc).wc)) +#define mb_ispunct(mbc) ((mbc).wc_valid && iswpunct ((mbc).wc)) +#define mb_isspace(mbc) ((mbc).wc_valid && iswspace ((mbc).wc)) +#define mb_isupper(mbc) ((mbc).wc_valid && iswupper ((mbc).wc)) +#define mb_isxdigit(mbc) ((mbc).wc_valid && iswxdigit ((mbc).wc)) + +/* Extra function. */ + +/* Unprintable characters appear as a small box of width 1. */ +#define MB_UNPRINTABLE_WIDTH 1 + +static inline int +mb_width_aux (wint_t wc) +{ + int w = wcwidth (wc); + /* For unprintable characters, arbitrarily return 0 for control characters + and MB_UNPRINTABLE_WIDTH otherwise. */ + return (w >= 0 ? w : iswcntrl (wc) ? 0 : MB_UNPRINTABLE_WIDTH); +} + +#define mb_width(mbc) \ + ((mbc).wc_valid ? mb_width_aux ((mbc).wc) : MB_UNPRINTABLE_WIDTH) + +/* Output. */ +#define mb_putc(mbc, stream) fwrite ((mbc).ptr, 1, (mbc).bytes, (stream)) + +/* Assignment. */ +#define mb_setascii(mbc, sc) \ + ((mbc)->ptr = (mbc)->buf, (mbc)->bytes = 1, (mbc)->wc_valid = 1, \ + (mbc)->wc = (mbc)->buf[0] = (sc)) + +/* Copying a character. */ +static inline void +mb_copy (mbchar_t *new, const mbchar_t *old) +{ + if (old->ptr == &old->buf[0]) + { + memcpy (&new->buf[0], &old->buf[0], old->bytes); + new->ptr = &new->buf[0]; + } + else + new->ptr = old->ptr; + new->bytes = old->bytes; + if ((new->wc_valid = old->wc_valid)) + new->wc = old->wc; +} + + +/* is_basic(c) tests whether the single-byte character c is in the + ISO C "basic character set". + This is a convenience function, and is in this file only to share code + between mbiter_multi.h and mbfile_multi.h. */ +#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126) +/* The character set is ISO-646, not EBCDIC. */ +# define IS_BASIC_ASCII 1 + +extern unsigned int is_basic_table[]; + +static inline bool +is_basic (char c) +{ + return (is_basic_table [(unsigned char) c >> 5] >> ((unsigned char) c & 31)) + & 1; +} + +#else + +static inline bool +is_basic (char c) +{ + switch (c) + { + case '\t': case '\v': case '\f': + case ' ': case '!': case '"': case '#': case '%': + case '&': case '\'': case '(': case ')': case '*': + case '+': case ',': case '-': case '.': case '/': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case ':': case ';': case '<': case '=': case '>': + case '?': + case 'A': case 'B': case 'C': case 'D': case 'E': + case 'F': case 'G': case 'H': case 'I': case 'J': + case 'K': case 'L': case 'M': case 'N': case 'O': + case 'P': case 'Q': case 'R': case 'S': case 'T': + case 'U': case 'V': case 'W': case 'X': case 'Y': + case 'Z': + case '[': case '\\': case ']': case '^': case '_': + case 'a': case 'b': case 'c': case 'd': case 'e': + case 'f': case 'g': case 'h': case 'i': case 'j': + case 'k': case 'l': case 'm': case 'n': case 'o': + case 'p': case 'q': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': case 'x': case 'y': + case 'z': case '{': case '|': case '}': case '~': + return 1; + default: + return 0; + } +} + +#endif + +#endif /* _MBCHAR_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/mbuiter.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/mbuiter.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/mbuiter.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/mbuiter.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,203 @@ +/* Iterating through multibyte strings: macros for multi-byte encodings. + Copyright (C) 2001, 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Bruno Haible . */ + +/* The macros in this file implement forward iteration through a + multi-byte string, without knowing its length a-priori. + + With these macros, an iteration loop that looks like + + char *iter; + for (iter = buf; *iter != '\0'; iter++) + { + do_something (*iter); + } + + becomes + + mbui_iterator_t iter; + for (mbui_init (iter, buf); mbui_avail (iter); mbui_advance (iter)) + { + do_something (mbui_cur_ptr (iter), mb_len (mbui_cur (iter))); + } + + The benefit of these macros over plain use of mbrtowc is: + - Handling of invalid multibyte sequences is possible without + making the code more complicated, while still preserving the + invalid multibyte sequences. + + Compared to mbiter.h, the macros here don't need to know the string's + length a-priori. The downside is that at each step, the look-ahead + that guards against overrunning the terminating '\0' is more expensive. + The mbui_* macros are therefore suitable when there is a high probability + that only the first few multibyte characters need to be inspected. + Whereas the mbi_* macros are better if usually the iteration runs + through the entire string. + + mbui_iterator_t + is a type usable for variable declarations. + + mbui_init (iter, startptr) + initializes the iterator, starting at startptr. + + mbui_avail (iter) + returns true if there are more multibyte chracters available before + the end of string is reached. In this case, mbui_cur (iter) is + initialized to the next multibyte chracter. + + mbui_advance (iter) + advances the iterator by one multibyte character. + + mbui_cur (iter) + returns the current multibyte character, of type mbchar_t. All the + macros defined in mbchar.h can be used on it. + + mbui_cur_ptr (iter) + return a pointer to the beginning of the current multibyte character. + + mbui_reloc (iter, ptrdiff) + relocates iterator when the string is moved by ptrdiff bytes. + + Here are the function prototypes of the macros. + + extern void mbui_init (mbui_iterator_t iter, const char *startptr); + extern bool mbui_avail (mbui_iterator_t iter); + extern void mbui_advance (mbui_iterator_t iter); + extern mbchar_t mbui_cur (mbui_iterator_t iter); + extern const char * mbui_cur_ptr (mbui_iterator_t iter); + extern void mbui_reloc (mbui_iterator_t iter, ptrdiff_t ptrdiff); + */ + +#ifndef _MBUITER_H +#define _MBUITER_H 1 + +#include +#include +#include + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +#include +#include +#include + +#include "mbchar.h" +#include "strnlen1.h" + +struct mbuiter_multi +{ + bool in_shift; /* true if next byte may not be interpreted as ASCII */ + mbstate_t state; /* if in_shift: current shift state */ + bool next_done; /* true if mbui_avail has already filled the following */ + struct mbchar cur; /* the current character: + const char *cur.ptr pointer to current character + The following are only valid after mbui_avail. + size_t cur.bytes number of bytes of current character + bool cur.wc_valid true if wc is a valid wide character + wchar_t cur.wc if wc_valid: the current character + */ +}; + +static inline void +mbuiter_multi_next (struct mbuiter_multi *iter) +{ + if (iter->next_done) + return; + if (iter->in_shift) + goto with_shift; + /* Handle most ASCII characters quickly, without calling mbrtowc(). */ + if (is_basic (*iter->cur.ptr)) + { + /* These characters are part of the basic character set. ISO C 99 + guarantees that their wide character code is identical to their + char code. */ + iter->cur.bytes = 1; + iter->cur.wc = *iter->cur.ptr; + iter->cur.wc_valid = true; + } + else + { + assert (mbsinit (&iter->state)); + iter->in_shift = true; + with_shift: + iter->cur.bytes = mbrtowc (&iter->cur.wc, iter->cur.ptr, + strnlen1 (iter->cur.ptr, MB_CUR_MAX), + &iter->state); + if (iter->cur.bytes == (size_t) -1) + { + /* An invalid multibyte sequence was encountered. */ + iter->cur.bytes = 1; + iter->cur.wc_valid = false; + /* Whether to set iter->in_shift = false and reset iter->state + or not is not very important; the string is bogus anyway. */ + } + else if (iter->cur.bytes == (size_t) -2) + { + /* An incomplete multibyte character at the end. */ + iter->cur.bytes = strlen (iter->cur.ptr); + iter->cur.wc_valid = false; + /* Whether to set iter->in_shift = false and reset iter->state + or not is not important; the string end is reached anyway. */ + } + else + { + if (iter->cur.bytes == 0) + { + /* A null wide character was encountered. */ + iter->cur.bytes = 1; + assert (*iter->cur.ptr == '\0'); + assert (iter->cur.wc == 0); + } + iter->cur.wc_valid = true; + + /* When in the initial state, we can go back treating ASCII + characters more quickly. */ + if (mbsinit (&iter->state)) + iter->in_shift = false; + } + } + iter->next_done = true; +} + +static inline void +mbuiter_multi_reloc (struct mbuiter_multi *iter, ptrdiff_t ptrdiff) +{ + iter->cur.ptr += ptrdiff; +} + +/* Iteration macros. */ +typedef struct mbuiter_multi mbui_iterator_t; +#define mbui_init(iter, startptr) \ + ((iter).cur.ptr = (startptr), \ + (iter).in_shift = false, memset (&(iter).state, '\0', sizeof (mbstate_t)), \ + (iter).next_done = false) +#define mbui_avail(iter) \ + (mbuiter_multi_next (&(iter)), !mb_isnul ((iter).cur)) +#define mbui_advance(iter) \ + ((iter).cur.ptr += (iter).cur.bytes, (iter).next_done = false) + +/* Access to the current character. */ +#define mbui_cur(iter) (iter).cur +#define mbui_cur_ptr(iter) (iter).cur.ptr + +/* Relocation. */ +#define mbui_reloc(iter, ptrdiff) mbuiter_multi_reloc (&iter, ptrdiff) + +#endif /* _MBUITER_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/memchr.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/memchr.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/memchr.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/memchr.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,201 @@ +/* Copyright (C) 1991, 1993, 1996, 1997, 1999, 2000, 2003, 2004 Free + Software Foundation, Inc. + + Based on strlen implementation by Torbjorn Granlund (tege@sics.se), + with help from Dan Sahlin (dan@sics.se) and + commentary by Jim Blandy (jimb@ai.mit.edu); + adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), + and implemented by Roland McGrath (roland@ai.mit.edu). + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@prep.ai.mit.edu. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include + +#if defined _LIBC +# include +#else +# define reg_char char +#endif + +#include + +#if HAVE_BP_SYM_H || defined _LIBC +# include +#else +# define BP_SYM(sym) sym +#endif + +#undef memchr +#undef __memchr + +/* Search no more than N bytes of S for C. */ +void * +__memchr (void const *s, int c_in, size_t n) +{ + const unsigned char *char_ptr; + const unsigned long int *longword_ptr; + unsigned long int longword, magic_bits, charmask; + unsigned reg_char c; + int i; + + c = (unsigned char) c_in; + + /* Handle the first few characters by reading one character at a time. + Do this until CHAR_PTR is aligned on a longword boundary. */ + for (char_ptr = (const unsigned char *) s; + n > 0 && (size_t) char_ptr % sizeof longword != 0; + --n, ++char_ptr) + if (*char_ptr == c) + return (void *) char_ptr; + + /* All these elucidatory comments refer to 4-byte longwords, + but the theory applies equally well to any size longwords. */ + + longword_ptr = (const unsigned long int *) char_ptr; + + /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits + the "holes." Note that there is a hole just to the left of + each byte, with an extra at the end: + + bits: 01111110 11111110 11111110 11111111 + bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD + + The 1-bits make sure that carries propagate to the next 0-bit. + The 0-bits provide holes for carries to fall into. */ + + /* Set MAGIC_BITS to be this pattern of 1 and 0 bits. + Set CHARMASK to be a longword, each of whose bytes is C. */ + + magic_bits = 0xfefefefe; + charmask = c | (c << 8); + charmask |= charmask << 16; +#if 0xffffffffU < ULONG_MAX + magic_bits |= magic_bits << 32; + charmask |= charmask << 32; + if (8 < sizeof longword) + for (i = 64; i < sizeof longword * 8; i *= 2) + { + magic_bits |= magic_bits << i; + charmask |= charmask << i; + } +#endif + magic_bits = (ULONG_MAX >> 1) & (magic_bits | 1); + + /* Instead of the traditional loop which tests each character, + we will test a longword at a time. The tricky part is testing + if *any of the four* bytes in the longword in question are zero. */ + while (n >= sizeof longword) + { + /* We tentatively exit the loop if adding MAGIC_BITS to + LONGWORD fails to change any of the hole bits of LONGWORD. + + 1) Is this safe? Will it catch all the zero bytes? + Suppose there is a byte with all zeros. Any carry bits + propagating from its left will fall into the hole at its + least significant bit and stop. Since there will be no + carry from its most significant bit, the LSB of the + byte to the left will be unchanged, and the zero will be + detected. + + 2) Is this worthwhile? Will it ignore everything except + zero bytes? Suppose every byte of LONGWORD has a bit set + somewhere. There will be a carry into bit 8. If bit 8 + is set, this will carry into bit 16. If bit 8 is clear, + one of bits 9-15 must be set, so there will be a carry + into bit 16. Similarly, there will be a carry into bit + 24. If one of bits 24-30 is set, there will be a carry + into bit 31, so all of the hole bits will be changed. + + The one misfire occurs when bits 24-30 are clear and bit + 31 is set; in this case, the hole at bit 31 is not + changed. If we had access to the processor carry flag, + we could close this loophole by putting the fourth hole + at bit 32! + + So it ignores everything except 128's, when they're aligned + properly. + + 3) But wait! Aren't we looking for C, not zero? + Good point. So what we do is XOR LONGWORD with a longword, + each of whose bytes is C. This turns each byte that is C + into a zero. */ + + longword = *longword_ptr++ ^ charmask; + + /* Add MAGIC_BITS to LONGWORD. */ + if ((((longword + magic_bits) + + /* Set those bits that were unchanged by the addition. */ + ^ ~longword) + + /* Look at only the hole bits. If any of the hole bits + are unchanged, most likely one of the bytes was a + zero. */ + & ~magic_bits) != 0) + { + /* Which of the bytes was C? If none of them were, it was + a misfire; continue the search. */ + + const unsigned char *cp = (const unsigned char *) (longword_ptr - 1); + + if (cp[0] == c) + return (void *) cp; + if (cp[1] == c) + return (void *) &cp[1]; + if (cp[2] == c) + return (void *) &cp[2]; + if (cp[3] == c) + return (void *) &cp[3]; + if (4 < sizeof longword && cp[4] == c) + return (void *) &cp[4]; + if (5 < sizeof longword && cp[5] == c) + return (void *) &cp[5]; + if (6 < sizeof longword && cp[6] == c) + return (void *) &cp[6]; + if (7 < sizeof longword && cp[7] == c) + return (void *) &cp[7]; + if (8 < sizeof longword) + for (i = 8; i < sizeof longword; i++) + if (cp[i] == c) + return (void *) &cp[i]; + } + + n -= sizeof longword; + } + + char_ptr = (const unsigned char *) longword_ptr; + + while (n-- > 0) + { + if (*char_ptr == c) + return (void *) char_ptr; + else + ++char_ptr; + } + + return 0; +} +#ifdef weak_alias +weak_alias (__memchr, BP_SYM (memchr)) +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/mempcpy.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/mempcpy.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/mempcpy.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/mempcpy.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,29 @@ +/* Copy memory area and return pointer after last written byte. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Specification. */ +#include "mempcpy.h" + +#include + +/* Copy N bytes of SRC to DEST, return pointer to bytes after the + last written byte. */ +void * +mempcpy (void *dest, const void *src, size_t n) +{ + return (char *) memcpy (dest, src, n) + n; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/mempcpy.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/mempcpy.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/mempcpy.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/mempcpy.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,36 @@ +/* Copy memory area and return pointer after last written byte. + Copyright (C) 2003, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef mempcpy + +# if HAVE_MEMPCPY + +/* Get mempcpy() declaration. */ +# include + +# else + +/* Get size_t */ +# include + +/* Copy N bytes of SRC to DEST, return pointer to bytes after the + last written byte. */ +extern void *mempcpy (void *dest, const void *src, size_t n); + +# endif + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/minmax.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/minmax.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/minmax.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/minmax.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,60 @@ +/* MIN, MAX macros. + Copyright (C) 1995, 1998, 2001, 2003, 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _MINMAX_H +#define _MINMAX_H + +/* Note: MIN, MAX are also defined in on some systems + (glibc, IRIX, HP-UX, OSF/1). Therefore you might get warnings about + MIN, MAX macro redefinitions on some systems; the workaround is to + #include this file as the last one among the #include list. */ + +/* Before we define the following symbols we get the file + since otherwise we get redefinitions on some systems if is + included after this file. Likewise for . + If more than one of these system headers define MIN and MAX, pick just + one of the headers (because the definitions most likely are the same). */ +#if HAVE_MINMAX_IN_LIMITS_H +# include +#elif HAVE_MINMAX_IN_SYS_PARAM_H +# include +#endif + +/* Note: MIN and MAX should be used with two arguments of the + same type. They might not return the minimum and maximum of their two + arguments, if the arguments have different types or have unusual + floating-point values. For example, on a typical host with 32-bit 'int', + 64-bit 'long long', and 64-bit IEEE 754 'double' types: + + MAX (-1, 2147483648) returns 4294967295. + MAX (9007199254740992.0, 9007199254740993) returns 9007199254740992.0. + MAX (NaN, 0.0) returns 0.0. + MAX (+0.0, -0.0) returns -0.0. + + and in each case the answer is in some sense bogus. */ + +/* MAX(a,b) returns the maximum of A and B. */ +#ifndef MAX +# define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif + +/* MIN(a,b) returns the minimum of A and B. */ +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + +#endif /* _MINMAX_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/printf-args.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/printf-args.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/printf-args.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/printf-args.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,137 @@ +/* Decomposed printf argument list. + Copyright (C) 1999, 2002-2003, 2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "printf-args.h" + +#ifdef STATIC +STATIC +#endif +int +printf_fetchargs (va_list args, arguments *a) +{ + size_t i; + argument *ap; + + for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) + switch (ap->type) + { + case TYPE_SCHAR: + ap->a.a_schar = va_arg (args, /*signed char*/ int); + break; + case TYPE_UCHAR: + ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); + break; + case TYPE_SHORT: + ap->a.a_short = va_arg (args, /*short*/ int); + break; + case TYPE_USHORT: + ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); + break; + case TYPE_INT: + ap->a.a_int = va_arg (args, int); + break; + case TYPE_UINT: + ap->a.a_uint = va_arg (args, unsigned int); + break; + case TYPE_LONGINT: + ap->a.a_longint = va_arg (args, long int); + break; + case TYPE_ULONGINT: + ap->a.a_ulongint = va_arg (args, unsigned long int); + break; +#ifdef HAVE_LONG_LONG + case TYPE_LONGLONGINT: + ap->a.a_longlongint = va_arg (args, long long int); + break; + case TYPE_ULONGLONGINT: + ap->a.a_ulonglongint = va_arg (args, unsigned long long int); + break; +#endif + case TYPE_DOUBLE: + ap->a.a_double = va_arg (args, double); + break; +#ifdef HAVE_LONG_DOUBLE + case TYPE_LONGDOUBLE: + ap->a.a_longdouble = va_arg (args, long double); + break; +#endif + case TYPE_CHAR: + ap->a.a_char = va_arg (args, int); + break; +#ifdef HAVE_WINT_T + case TYPE_WIDE_CHAR: + ap->a.a_wide_char = va_arg (args, wint_t); + break; +#endif + case TYPE_STRING: + ap->a.a_string = va_arg (args, const char *); + /* A null pointer is an invalid argument for "%s", but in practice + it occurs quite frequently in printf statements that produce + debug output. Use a fallback in this case. */ + if (ap->a.a_string == NULL) + ap->a.a_string = "(NULL)"; + break; +#ifdef HAVE_WCHAR_T + case TYPE_WIDE_STRING: + ap->a.a_wide_string = va_arg (args, const wchar_t *); + /* A null pointer is an invalid argument for "%ls", but in practice + it occurs quite frequently in printf statements that produce + debug output. Use a fallback in this case. */ + if (ap->a.a_wide_string == NULL) + { + static const wchar_t wide_null_string[] = + { + (wchar_t)'(', + (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L', + (wchar_t)')', + (wchar_t)0 + }; + ap->a.a_wide_string = wide_null_string; + } + break; +#endif + case TYPE_POINTER: + ap->a.a_pointer = va_arg (args, void *); + break; + case TYPE_COUNT_SCHAR_POINTER: + ap->a.a_count_schar_pointer = va_arg (args, signed char *); + break; + case TYPE_COUNT_SHORT_POINTER: + ap->a.a_count_short_pointer = va_arg (args, short *); + break; + case TYPE_COUNT_INT_POINTER: + ap->a.a_count_int_pointer = va_arg (args, int *); + break; + case TYPE_COUNT_LONGINT_POINTER: + ap->a.a_count_longint_pointer = va_arg (args, long int *); + break; +#ifdef HAVE_LONG_LONG + case TYPE_COUNT_LONGLONGINT_POINTER: + ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); + break; +#endif + default: + /* Unknown type. */ + return -1; + } + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/printf-args.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/printf-args.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/printf-args.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/printf-args.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,136 @@ +/* Decomposed printf argument list. + Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _PRINTF_ARGS_H +#define _PRINTF_ARGS_H + +/* Get size_t. */ +#include + +/* Get wchar_t. */ +#ifdef HAVE_WCHAR_T +# include +#endif + +/* Get wint_t. */ +#ifdef HAVE_WINT_T +# include +#endif + +/* Get va_list. */ +#include + + +/* Argument types */ +typedef enum +{ + TYPE_NONE, + TYPE_SCHAR, + TYPE_UCHAR, + TYPE_SHORT, + TYPE_USHORT, + TYPE_INT, + TYPE_UINT, + TYPE_LONGINT, + TYPE_ULONGINT, +#ifdef HAVE_LONG_LONG + TYPE_LONGLONGINT, + TYPE_ULONGLONGINT, +#endif + TYPE_DOUBLE, +#ifdef HAVE_LONG_DOUBLE + TYPE_LONGDOUBLE, +#endif + TYPE_CHAR, +#ifdef HAVE_WINT_T + TYPE_WIDE_CHAR, +#endif + TYPE_STRING, +#ifdef HAVE_WCHAR_T + TYPE_WIDE_STRING, +#endif + TYPE_POINTER, + TYPE_COUNT_SCHAR_POINTER, + TYPE_COUNT_SHORT_POINTER, + TYPE_COUNT_INT_POINTER, + TYPE_COUNT_LONGINT_POINTER +#ifdef HAVE_LONG_LONG +, TYPE_COUNT_LONGLONGINT_POINTER +#endif +} arg_type; + +/* Polymorphic argument */ +typedef struct +{ + arg_type type; + union + { + signed char a_schar; + unsigned char a_uchar; + short a_short; + unsigned short a_ushort; + int a_int; + unsigned int a_uint; + long int a_longint; + unsigned long int a_ulongint; +#ifdef HAVE_LONG_LONG + long long int a_longlongint; + unsigned long long int a_ulonglongint; +#endif + float a_float; + double a_double; +#ifdef HAVE_LONG_DOUBLE + long double a_longdouble; +#endif + int a_char; +#ifdef HAVE_WINT_T + wint_t a_wide_char; +#endif + const char* a_string; +#ifdef HAVE_WCHAR_T + const wchar_t* a_wide_string; +#endif + void* a_pointer; + signed char * a_count_schar_pointer; + short * a_count_short_pointer; + int * a_count_int_pointer; + long int * a_count_longint_pointer; +#ifdef HAVE_LONG_LONG + long long int * a_count_longlongint_pointer; +#endif + } + a; +} +argument; + +typedef struct +{ + size_t count; + argument *arg; +} +arguments; + + +/* Fetch the arguments, putting them into a. */ +#ifdef STATIC +STATIC +#else +extern +#endif +int printf_fetchargs (va_list args, arguments *a); + +#endif /* _PRINTF_ARGS_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/printf-parse.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/printf-parse.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/printf-parse.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/printf-parse.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,536 @@ +/* Formatted output to strings. + Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#if WIDE_CHAR_VERSION +# include "wprintf-parse.h" +#else +# include "printf-parse.h" +#endif + +/* Get size_t, NULL. */ +#include + +/* Get intmax_t. */ +#if HAVE_STDINT_H_WITH_UINTMAX +# include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +# include +#endif + +/* malloc(), realloc(), free(). */ +#include + +/* Checked size_t computations. */ +#include "xsize.h" + +#if WIDE_CHAR_VERSION +# define PRINTF_PARSE wprintf_parse +# define CHAR_T wchar_t +# define DIRECTIVE wchar_t_directive +# define DIRECTIVES wchar_t_directives +#else +# define PRINTF_PARSE printf_parse +# define CHAR_T char +# define DIRECTIVE char_directive +# define DIRECTIVES char_directives +#endif + +#ifdef STATIC +STATIC +#endif +int +PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) +{ + const CHAR_T *cp = format; /* pointer into format */ + size_t arg_posn = 0; /* number of regular arguments consumed */ + size_t d_allocated; /* allocated elements of d->dir */ + size_t a_allocated; /* allocated elements of a->arg */ + size_t max_width_length = 0; + size_t max_precision_length = 0; + + d->count = 0; + d_allocated = 1; + d->dir = malloc (d_allocated * sizeof (DIRECTIVE)); + if (d->dir == NULL) + /* Out of memory. */ + return -1; + + a->count = 0; + a_allocated = 0; + a->arg = NULL; + +#define REGISTER_ARG(_index_,_type_) \ + { \ + size_t n = (_index_); \ + if (n >= a_allocated) \ + { \ + size_t memory_size; \ + argument *memory; \ + \ + a_allocated = xtimes (a_allocated, 2); \ + if (a_allocated <= n) \ + a_allocated = xsum (n, 1); \ + memory_size = xtimes (a_allocated, sizeof (argument)); \ + if (size_overflow_p (memory_size)) \ + /* Overflow, would lead to out of memory. */ \ + goto error; \ + memory = (a->arg \ + ? realloc (a->arg, memory_size) \ + : malloc (memory_size)); \ + if (memory == NULL) \ + /* Out of memory. */ \ + goto error; \ + a->arg = memory; \ + } \ + while (a->count <= n) \ + a->arg[a->count++].type = TYPE_NONE; \ + if (a->arg[n].type == TYPE_NONE) \ + a->arg[n].type = (_type_); \ + else if (a->arg[n].type != (_type_)) \ + /* Ambiguous type for positional argument. */ \ + goto error; \ + } + + while (*cp != '\0') + { + CHAR_T c = *cp++; + if (c == '%') + { + size_t arg_index = ARG_NONE; + DIRECTIVE *dp = &d->dir[d->count];/* pointer to next directive */ + + /* Initialize the next directive. */ + dp->dir_start = cp - 1; + dp->flags = 0; + dp->width_start = NULL; + dp->width_end = NULL; + dp->width_arg_index = ARG_NONE; + dp->precision_start = NULL; + dp->precision_end = NULL; + dp->precision_arg_index = ARG_NONE; + dp->arg_index = ARG_NONE; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const CHAR_T *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + size_t n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = xsum (xtimes (n, 10), *np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + if (size_overflow_p (n)) + /* n too large, would lead to out of memory later. */ + goto error; + arg_index = n - 1; + cp = np + 1; + } + } + + /* Read the flags. */ + for (;;) + { + if (*cp == '\'') + { + dp->flags |= FLAG_GROUP; + cp++; + } + else if (*cp == '-') + { + dp->flags |= FLAG_LEFT; + cp++; + } + else if (*cp == '+') + { + dp->flags |= FLAG_SHOWSIGN; + cp++; + } + else if (*cp == ' ') + { + dp->flags |= FLAG_SPACE; + cp++; + } + else if (*cp == '#') + { + dp->flags |= FLAG_ALT; + cp++; + } + else if (*cp == '0') + { + dp->flags |= FLAG_ZERO; + cp++; + } + else + break; + } + + /* Parse the field width. */ + if (*cp == '*') + { + dp->width_start = cp; + cp++; + dp->width_end = cp; + if (max_width_length < 1) + max_width_length = 1; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const CHAR_T *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + size_t n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = xsum (xtimes (n, 10), *np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + if (size_overflow_p (n)) + /* n too large, would lead to out of memory later. */ + goto error; + dp->width_arg_index = n - 1; + cp = np + 1; + } + } + if (dp->width_arg_index == ARG_NONE) + { + dp->width_arg_index = arg_posn++; + if (dp->width_arg_index == ARG_NONE) + /* arg_posn wrapped around. */ + goto error; + } + REGISTER_ARG (dp->width_arg_index, TYPE_INT); + } + else if (*cp >= '0' && *cp <= '9') + { + size_t width_length; + + dp->width_start = cp; + for (; *cp >= '0' && *cp <= '9'; cp++) + ; + dp->width_end = cp; + width_length = dp->width_end - dp->width_start; + if (max_width_length < width_length) + max_width_length = width_length; + } + + /* Parse the precision. */ + if (*cp == '.') + { + cp++; + if (*cp == '*') + { + dp->precision_start = cp - 1; + cp++; + dp->precision_end = cp; + if (max_precision_length < 2) + max_precision_length = 2; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const CHAR_T *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + size_t n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = xsum (xtimes (n, 10), *np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + if (size_overflow_p (n)) + /* n too large, would lead to out of memory + later. */ + goto error; + dp->precision_arg_index = n - 1; + cp = np + 1; + } + } + if (dp->precision_arg_index == ARG_NONE) + { + dp->precision_arg_index = arg_posn++; + if (dp->precision_arg_index == ARG_NONE) + /* arg_posn wrapped around. */ + goto error; + } + REGISTER_ARG (dp->precision_arg_index, TYPE_INT); + } + else + { + size_t precision_length; + + dp->precision_start = cp - 1; + for (; *cp >= '0' && *cp <= '9'; cp++) + ; + dp->precision_end = cp; + precision_length = dp->precision_end - dp->precision_start; + if (max_precision_length < precision_length) + max_precision_length = precision_length; + } + } + + { + arg_type type; + + /* Parse argument type/size specifiers. */ + { + int flags = 0; + + for (;;) + { + if (*cp == 'h') + { + flags |= (1 << (flags & 1)); + cp++; + } + else if (*cp == 'L') + { + flags |= 4; + cp++; + } + else if (*cp == 'l') + { + flags += 8; + cp++; + } +#ifdef HAVE_INTMAX_T + else if (*cp == 'j') + { + if (sizeof (intmax_t) > sizeof (long)) + { + /* intmax_t = long long */ + flags += 16; + } + else if (sizeof (intmax_t) > sizeof (int)) + { + /* intmax_t = long */ + flags += 8; + } + cp++; + } +#endif + else if (*cp == 'z' || *cp == 'Z') + { + /* 'z' is standardized in ISO C 99, but glibc uses 'Z' + because the warning facility in gcc-2.95.2 understands + only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ + if (sizeof (size_t) > sizeof (long)) + { + /* size_t = long long */ + flags += 16; + } + else if (sizeof (size_t) > sizeof (int)) + { + /* size_t = long */ + flags += 8; + } + cp++; + } + else if (*cp == 't') + { + if (sizeof (ptrdiff_t) > sizeof (long)) + { + /* ptrdiff_t = long long */ + flags += 16; + } + else if (sizeof (ptrdiff_t) > sizeof (int)) + { + /* ptrdiff_t = long */ + flags += 8; + } + cp++; + } + else + break; + } + + /* Read the conversion character. */ + c = *cp++; + switch (c) + { + case 'd': case 'i': +#ifdef HAVE_LONG_LONG + if (flags >= 16 || (flags & 4)) + type = TYPE_LONGLONGINT; + else +#endif + if (flags >= 8) + type = TYPE_LONGINT; + else if (flags & 2) + type = TYPE_SCHAR; + else if (flags & 1) + type = TYPE_SHORT; + else + type = TYPE_INT; + break; + case 'o': case 'u': case 'x': case 'X': +#ifdef HAVE_LONG_LONG + if (flags >= 16 || (flags & 4)) + type = TYPE_ULONGLONGINT; + else +#endif + if (flags >= 8) + type = TYPE_ULONGINT; + else if (flags & 2) + type = TYPE_UCHAR; + else if (flags & 1) + type = TYPE_USHORT; + else + type = TYPE_UINT; + break; + case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': + case 'a': case 'A': +#ifdef HAVE_LONG_DOUBLE + if (flags >= 16 || (flags & 4)) + type = TYPE_LONGDOUBLE; + else +#endif + type = TYPE_DOUBLE; + break; + case 'c': + if (flags >= 8) +#ifdef HAVE_WINT_T + type = TYPE_WIDE_CHAR; +#else + goto error; +#endif + else + type = TYPE_CHAR; + break; +#ifdef HAVE_WINT_T + case 'C': + type = TYPE_WIDE_CHAR; + c = 'c'; + break; +#endif + case 's': + if (flags >= 8) +#ifdef HAVE_WCHAR_T + type = TYPE_WIDE_STRING; +#else + goto error; +#endif + else + type = TYPE_STRING; + break; +#ifdef HAVE_WCHAR_T + case 'S': + type = TYPE_WIDE_STRING; + c = 's'; + break; +#endif + case 'p': + type = TYPE_POINTER; + break; + case 'n': +#ifdef HAVE_LONG_LONG + if (flags >= 16 || (flags & 4)) + type = TYPE_COUNT_LONGLONGINT_POINTER; + else +#endif + if (flags >= 8) + type = TYPE_COUNT_LONGINT_POINTER; + else if (flags & 2) + type = TYPE_COUNT_SCHAR_POINTER; + else if (flags & 1) + type = TYPE_COUNT_SHORT_POINTER; + else + type = TYPE_COUNT_INT_POINTER; + break; + case '%': + type = TYPE_NONE; + break; + default: + /* Unknown conversion character. */ + goto error; + } + } + + if (type != TYPE_NONE) + { + dp->arg_index = arg_index; + if (dp->arg_index == ARG_NONE) + { + dp->arg_index = arg_posn++; + if (dp->arg_index == ARG_NONE) + /* arg_posn wrapped around. */ + goto error; + } + REGISTER_ARG (dp->arg_index, type); + } + dp->conversion = c; + dp->dir_end = cp; + } + + d->count++; + if (d->count >= d_allocated) + { + size_t memory_size; + DIRECTIVE *memory; + + d_allocated = xtimes (d_allocated, 2); + memory_size = xtimes (d_allocated, sizeof (DIRECTIVE)); + if (size_overflow_p (memory_size)) + /* Overflow, would lead to out of memory. */ + goto error; + memory = realloc (d->dir, memory_size); + if (memory == NULL) + /* Out of memory. */ + goto error; + d->dir = memory; + } + } + } + d->dir[d->count].dir_start = cp; + + d->max_width_length = max_width_length; + d->max_precision_length = max_precision_length; + return 0; + +error: + if (a->arg) + free (a->arg); + if (d->dir) + free (d->dir); + return -1; +} + +#undef DIRECTIVES +#undef DIRECTIVE +#undef CHAR_T +#undef PRINTF_PARSE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/printf-parse.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/printf-parse.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/printf-parse.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/printf-parse.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,74 @@ +/* Parse printf format string. + Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _PRINTF_PARSE_H +#define _PRINTF_PARSE_H + +#include "printf-args.h" + + +/* Flags */ +#define FLAG_GROUP 1 /* ' flag */ +#define FLAG_LEFT 2 /* - flag */ +#define FLAG_SHOWSIGN 4 /* + flag */ +#define FLAG_SPACE 8 /* space flag */ +#define FLAG_ALT 16 /* # flag */ +#define FLAG_ZERO 32 + +/* arg_index value indicating that no argument is consumed. */ +#define ARG_NONE (~(size_t)0) + +/* A parsed directive. */ +typedef struct +{ + const char* dir_start; + const char* dir_end; + int flags; + const char* width_start; + const char* width_end; + size_t width_arg_index; + const char* precision_start; + const char* precision_end; + size_t precision_arg_index; + char conversion; /* d i o u x X f e E g G c s p n U % but not C S */ + size_t arg_index; +} +char_directive; + +/* A parsed format string. */ +typedef struct +{ + size_t count; + char_directive *dir; + size_t max_width_length; + size_t max_precision_length; +} +char_directives; + + +/* Parses the format string. Fills in the number N of directives, and fills + in directives[0], ..., directives[N-1], and sets directives[N].dir_start + to the end of the format string. Also fills in the arg_type fields of the + arguments and the needed count of arguments. */ +#ifdef STATIC +STATIC +#else +extern +#endif +int printf_parse (const char *format, char_directives *d, arguments *a); + +#endif /* _PRINTF_PARSE_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/size_max.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/size_max.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/size_max.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/size_max.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,31 @@ +/* size_max.h -- declare SIZE_MAX through system headers + Copyright (C) 2005-2006 Free Software Foundation, Inc. + Written by Simon Josefsson. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef GNULIB_SIZE_MAX_H +#define GNULIB_SIZE_MAX_H + +/* Get SIZE_MAX declaration on systems like Solaris 7/8/9. */ +# include +/* Get SIZE_MAX declaration on systems like glibc 2. */ +# if HAVE_STDINT_H +# include +# endif +/* On systems where these include files don't define it, SIZE_MAX is defined + in config.h. */ + +#endif /* GNULIB_SIZE_MAX_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/stdbool_.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/stdbool_.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/stdbool_.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/stdbool_.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,54 @@ +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + +/* + * ISO C Standard: 7.16 Boolean type and values + */ + +#ifndef _STDBOOL_H +#define _STDBOOL_H + +#ifndef __cplusplus + +#define bool _Bool +#define true 1 +#define false 0 + +#else /* __cplusplus */ + +/* Supporting _Bool in C++ is a GCC extension. */ +#define _Bool bool + +#if __cplusplus < 201103L +/* Defining these macros in C++98 is a GCC extension. */ +#define bool bool +#define false false +#define true true +#endif + +#endif /* __cplusplus */ + +/* Signal that all the definitions are present. */ +#define __bool_true_false_are_defined 1 + +#endif /* stdbool.h */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strcasecmp.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strcasecmp.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strcasecmp.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strcasecmp.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,105 @@ +/* Case-insensitive string comparison function. + Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc. + Written by Bruno Haible , 2005, + based on earlier glibc code. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "strcase.h" + +#include +#include + +#if HAVE_MBRTOWC +# include "mbuiter.h" +#endif + +#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) + +/* Compare strings S1 and S2, ignoring case, returning less than, equal to or + greater than zero if S1 is lexicographically less than, equal to or greater + than S2. + Note: This function may, in multibyte locales, return 0 for strings of + different lengths! */ +int +strcasecmp (const char *s1, const char *s2) +{ + if (s1 == s2) + return 0; + + /* Be careful not to look at the entire extent of s1 or s2 until needed. + This is useful because when two strings differ, the difference is + most often already in the very few first characters. */ +#if HAVE_MBRTOWC + if (MB_CUR_MAX > 1) + { + mbui_iterator_t iter1; + mbui_iterator_t iter2; + + mbui_init (iter1, s1); + mbui_init (iter2, s2); + + while (mbui_avail (iter1) && mbui_avail (iter2)) + { + int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2)); + + if (cmp != 0) + return cmp; + + mbui_advance (iter1); + mbui_advance (iter2); + } + if (mbui_avail (iter1)) + /* s2 terminated before s1. */ + return 1; + if (mbui_avail (iter2)) + /* s1 terminated before s2. */ + return -1; + return 0; + } + else +#endif + { + const unsigned char *p1 = (const unsigned char *) s1; + const unsigned char *p2 = (const unsigned char *) s2; + unsigned char c1, c2; + + do + { + c1 = TOLOWER (*p1); + c2 = TOLOWER (*p2); + + if (c1 == '\0') + break; + + ++p1; + ++p2; + } + while (c1 == c2); + + if (UCHAR_MAX <= INT_MAX) + return c1 - c2; + else + /* On machines where 'char' and 'int' are types of the same size, the + difference of two 'unsigned char' values - including the sign bit - + doesn't fit in an 'int'. */ + return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strcase.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strcase.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strcase.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strcase.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,48 @@ +/* Case-insensitive string comparison functions. + Copyright (C) 1995-1996, 2001, 2003, 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _STRCASE_H +#define _STRCASE_H + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Compare strings S1 and S2, ignoring case, returning less than, equal to or + greater than zero if S1 is lexicographically less than, equal to or greater + than S2. + Note: This function may, in multibyte locales, return 0 for strings of + different lengths! */ +extern int strcasecmp (const char *s1, const char *s2); + +/* Compare no more than N characters of strings S1 and S2, ignoring case, + returning less than, equal to or greater than zero if S1 is + lexicographically less than, equal to or greater than S2. + Note: This function can not work correctly in multibyte locales. */ +extern int strncasecmp (const char *s1, const char *s2, size_t n); + + +#ifdef __cplusplus +} +#endif + + +#endif /* _STRCASE_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strchrnul.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strchrnul.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strchrnul.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strchrnul.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,30 @@ +/* Searching in a string. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Specification. */ +#include "strchrnul.h" + +/* Find the first occurrence of C in S or the final NUL byte. */ +char * +strchrnul (const char *s, int c_in) +{ + char c = c_in; + while (*s && (*s != c)) + s++; + + return (char *) s; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strchrnul.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strchrnul.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strchrnul.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strchrnul.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,28 @@ +/* Searching in a string. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#if HAVE_STRCHRNUL + +/* Get strchrnul() declaration. */ +#include + +#else + +/* Find the first occurrence of C in S or the final NUL byte. */ +extern char *strchrnul (const char *s, int c_in); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/stripslash.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/stripslash.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/stripslash.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/stripslash.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,47 @@ +/* stripslash.c -- remove redundant trailing slashes from a file name + + Copyright (C) 1990, 2001, 2003-2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "dirname.h" + +/* Remove trailing slashes from FILE. Return true if a trailing slash + was removed. This is useful when using file name completion from a + shell that adds a "/" after directory names (such as tcsh and + bash), because on symlinks to directories, several system calls + have different semantics according to whether a trailing slash is + present. */ + +bool +strip_trailing_slashes (char *file) +{ + char *base = last_component (file); + char *base_lim; + bool had_slash; + + /* last_component returns "" for file system roots, but we need to turn + `///' into `/'. */ + if (! *base) + base = file; + base_lim = base + base_len (base); + had_slash = (*base_lim != '\0'); + *base_lim = '\0'; + return had_slash; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strncasecmp.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strncasecmp.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strncasecmp.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strncasecmp.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,65 @@ +/* strncasecmp.c -- case insensitive string comparator + Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "strcase.h" + +#include +#include + +#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) + +/* Compare no more than N bytes of strings S1 and S2, + ignoring case, returning less than, equal to or + greater than zero if S1 is lexicographically less + than, equal to or greater than S2. */ + +int +strncasecmp (const char *s1, const char *s2, size_t n) +{ + register const unsigned char *p1 = (const unsigned char *) s1; + register const unsigned char *p2 = (const unsigned char *) s2; + unsigned char c1, c2; + + if (p1 == p2 || n == 0) + return 0; + + do + { + c1 = TOLOWER (*p1); + c2 = TOLOWER (*p2); + + if (--n == 0 || c1 == '\0') + break; + + ++p1; + ++p2; + } + while (c1 == c2); + + if (UCHAR_MAX <= INT_MAX) + return c1 - c2; + else + /* On machines where 'char' and 'int' are types of the same size, the + difference of two 'unsigned char' values - including the sign bit - + doesn't fit in an 'int'. */ + return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strndup.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strndup.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strndup.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strndup.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,66 @@ +/* Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2005, 2006 Free + Software Foundation, Inc. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif +#if !_LIBC +# include "strndup.h" +#endif + +#include +#include + +#if !_LIBC +# include "strnlen.h" +# ifndef __strnlen +# define __strnlen strnlen +# endif +#endif + +#undef __strndup +#if _LIBC +# undef strndup +#endif + +#ifndef weak_alias +# define __strndup strndup +#endif + +char * +__strndup (s, n) + const char *s; + size_t n; +{ + size_t len = __strnlen (s, n); + char *new = malloc (len + 1); + + if (new == NULL) + return NULL; + + new[len] = '\0'; + return memcpy (new, s, len); +} +#ifdef libc_hidden_def +libc_hidden_def (__strndup) +#endif +#ifdef weak_alias +weak_alias (__strndup, strndup) +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strndup.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strndup.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strndup.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strndup.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,30 @@ +/* Duplicate a size-bounded string. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#if HAVE_STRNDUP + +/* Get strndup() declaration. */ +#include + +#else + +#include + +/* Return a newly allocated copy of at most N bytes of STRING. */ +extern char *strndup (const char *string, size_t n); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strnlen1.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strnlen1.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strnlen1.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strnlen1.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,39 @@ +/* Find the length of STRING + 1, but scan at most MAXLEN bytes. + Copyright (C) 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "strnlen1.h" + +#include + +/* Find the length of STRING + 1, but scan at most MAXLEN bytes. + If no '\0' terminator is found in that many characters, return MAXLEN. */ +/* This is the same as strnlen (string, maxlen - 1) + 1. */ +size_t +strnlen1 (const char *string, size_t maxlen) +{ + const char *end = memchr (string, '\0', maxlen); + if (end != NULL) + return end - string + 1; + else + return maxlen; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strnlen1.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strnlen1.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strnlen1.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strnlen1.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,41 @@ +/* Find the length of STRING + 1, but scan at most MAXLEN bytes. + Copyright (C) 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _STRNLEN1_H +#define _STRNLEN1_H + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Find the length of STRING + 1, but scan at most MAXLEN bytes. + If no '\0' terminator is found in that many characters, return MAXLEN. */ +/* This is the same as strnlen (string, maxlen - 1) + 1. */ +extern size_t strnlen1 (const char *string, size_t maxlen); + + +#ifdef __cplusplus +} +#endif + + +#endif /* _STRNLEN1_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strnlen.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strnlen.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strnlen.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strnlen.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,33 @@ +/* Find the length of STRING, but scan at most MAXLEN characters. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. + Written by Simon Josefsson. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "strnlen.h" + +/* Find the length of STRING, but scan at most MAXLEN characters. + If no '\0' terminator is found in that many characters, return MAXLEN. */ + +size_t +strnlen (const char *string, size_t maxlen) +{ + const char *end = memchr (string, '\0', maxlen); + return end ? (size_t) (end - string) : maxlen; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strnlen.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strnlen.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/strnlen.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/strnlen.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,32 @@ +/* Find the length of STRING, but scan at most MAXLEN characters. + Copyright (C) 2005 Free Software Foundation, Inc. + Written by Simon Josefsson. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef STRNLEN_H +#define STRNLEN_H + +/* Get strnlen declaration, if available. */ +#include + +#if defined HAVE_DECL_STRNLEN && !HAVE_DECL_STRNLEN +/* Find the length (number of bytes) of STRING, but scan at most + MAXLEN bytes. If no '\0' terminator is found in that many bytes, + return MAXLEN. */ +extern size_t strnlen(const char *string, size_t maxlen); +#endif + +#endif /* STRNLEN_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/sysexit_.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/sysexit_.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/sysexit_.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/sysexit_.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,41 @@ +/* exit() exit codes for some BSD system programs. + Copyright (C) 2003, 2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by Simon Josefsson based on sysexits(3) man page */ + +#ifndef _SYSEXITS_H +#define _SYSEXITS_H + +#define EX_OK 0 /* same value as EXIT_SUCCESS */ + +#define EX_USAGE 64 +#define EX_DATAERR 65 +#define EX_NOINPUT 66 +#define EX_NOUSER 67 +#define EX_NOHOST 68 +#define EX_UNAVAILABLE 69 +#define EX_SOFTWARE 70 +#define EX_OSERR 71 +#define EX_OSFILE 72 +#define EX_CANTCREAT 73 +#define EX_IOERR 74 +#define EX_TEMPFAIL 75 +#define EX_PROTOCOL 76 +#define EX_NOPERM 77 +#define EX_CONFIG 78 + +#endif /* _SYSEXITS_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/vasnprintf.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/vasnprintf.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/vasnprintf.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/vasnprintf.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,903 @@ +/* vsprintf with automatic memory allocation. + Copyright (C) 1999, 2002-2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif +#ifndef IN_LIBINTL +# include +#endif + +/* Specification. */ +#if WIDE_CHAR_VERSION +# include "vasnwprintf.h" +#else +# include "vasnprintf.h" +#endif + +#include /* snprintf(), sprintf() */ +#include /* abort(), malloc(), realloc(), free() */ +#include /* memcpy(), strlen() */ +#include /* errno */ +#include /* CHAR_BIT, INT_MAX */ +#include /* DBL_MAX_EXP, LDBL_MAX_EXP */ +#if WIDE_CHAR_VERSION +# include "wprintf-parse.h" +#else +# include "printf-parse.h" +#endif + +/* Checked size_t computations. */ +#include "xsize.h" + +/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */ +#ifndef EOVERFLOW +# define EOVERFLOW E2BIG +#endif + +#ifdef HAVE_WCHAR_T +# ifdef HAVE_WCSLEN +# define local_wcslen wcslen +# else + /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid + a dependency towards this library, here is a local substitute. + Define this substitute only once, even if this file is included + twice in the same compilation unit. */ +# ifndef local_wcslen_defined +# define local_wcslen_defined 1 +static size_t +local_wcslen (const wchar_t *s) +{ + const wchar_t *ptr; + + for (ptr = s; *ptr != (wchar_t) 0; ptr++) + ; + return ptr - s; +} +# endif +# endif +#endif + +#if WIDE_CHAR_VERSION +# define VASNPRINTF vasnwprintf +# define CHAR_T wchar_t +# define DIRECTIVE wchar_t_directive +# define DIRECTIVES wchar_t_directives +# define PRINTF_PARSE wprintf_parse +# define USE_SNPRINTF 1 +# if HAVE_DECL__SNWPRINTF + /* On Windows, the function swprintf() has a different signature than + on Unix; we use the _snwprintf() function instead. */ +# define SNPRINTF _snwprintf +# else + /* Unix. */ +# define SNPRINTF swprintf +# endif +#else +# define VASNPRINTF vasnprintf +# define CHAR_T char +# define DIRECTIVE char_directive +# define DIRECTIVES char_directives +# define PRINTF_PARSE printf_parse +# define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) +# if HAVE_DECL__SNPRINTF + /* Windows. */ +# define SNPRINTF _snprintf +# else + /* Unix. */ +# define SNPRINTF snprintf +# endif +#endif + +CHAR_T * +VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args) +{ + DIRECTIVES d; + arguments a; + + if (PRINTF_PARSE (format, &d, &a) < 0) + { + errno = EINVAL; + return NULL; + } + +#define CLEANUP() \ + free (d.dir); \ + if (a.arg) \ + free (a.arg); + + if (printf_fetchargs (args, &a) < 0) + { + CLEANUP (); + errno = EINVAL; + return NULL; + } + + { + size_t buf_neededlength; + CHAR_T *buf; + CHAR_T *buf_malloced; + const CHAR_T *cp; + size_t i; + DIRECTIVE *dp; + /* Output string accumulator. */ + CHAR_T *result; + size_t allocated; + size_t length; + + /* Allocate a small buffer that will hold a directive passed to + sprintf or snprintf. */ + buf_neededlength = + xsum4 (7, d.max_width_length, d.max_precision_length, 6); +#if HAVE_ALLOCA + if (buf_neededlength < 4000 / sizeof (CHAR_T)) + { + buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T)); + buf_malloced = NULL; + } + else +#endif + { + size_t buf_memsize = xtimes (buf_neededlength, sizeof (CHAR_T)); + if (size_overflow_p (buf_memsize)) + goto out_of_memory_1; + buf = (CHAR_T *) malloc (buf_memsize); + if (buf == NULL) + goto out_of_memory_1; + buf_malloced = buf; + } + + if (resultbuf != NULL) + { + result = resultbuf; + allocated = *lengthp; + } + else + { + result = NULL; + allocated = 0; + } + length = 0; + /* Invariants: + result is either == resultbuf or == NULL or malloc-allocated. + If length > 0, then result != NULL. */ + + /* Ensures that allocated >= needed. Aborts through a jump to + out_of_memory if needed is SIZE_MAX or otherwise too big. */ +#define ENSURE_ALLOCATION(needed) \ + if ((needed) > allocated) \ + { \ + size_t memory_size; \ + CHAR_T *memory; \ + \ + allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ + if ((needed) > allocated) \ + allocated = (needed); \ + memory_size = xtimes (allocated, sizeof (CHAR_T)); \ + if (size_overflow_p (memory_size)) \ + goto out_of_memory; \ + if (result == resultbuf || result == NULL) \ + memory = (CHAR_T *) malloc (memory_size); \ + else \ + memory = (CHAR_T *) realloc (result, memory_size); \ + if (memory == NULL) \ + goto out_of_memory; \ + if (result == resultbuf && length > 0) \ + memcpy (memory, result, length * sizeof (CHAR_T)); \ + result = memory; \ + } + + for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) + { + if (cp != dp->dir_start) + { + size_t n = dp->dir_start - cp; + size_t augmented_length = xsum (length, n); + + ENSURE_ALLOCATION (augmented_length); + memcpy (result + length, cp, n * sizeof (CHAR_T)); + length = augmented_length; + } + if (i == d.count) + break; + + /* Execute a single directive. */ + if (dp->conversion == '%') + { + size_t augmented_length; + + if (!(dp->arg_index == ARG_NONE)) + abort (); + augmented_length = xsum (length, 1); + ENSURE_ALLOCATION (augmented_length); + result[length] = '%'; + length = augmented_length; + } + else + { + if (!(dp->arg_index != ARG_NONE)) + abort (); + + if (dp->conversion == 'n') + { + switch (a.arg[dp->arg_index].type) + { + case TYPE_COUNT_SCHAR_POINTER: + *a.arg[dp->arg_index].a.a_count_schar_pointer = length; + break; + case TYPE_COUNT_SHORT_POINTER: + *a.arg[dp->arg_index].a.a_count_short_pointer = length; + break; + case TYPE_COUNT_INT_POINTER: + *a.arg[dp->arg_index].a.a_count_int_pointer = length; + break; + case TYPE_COUNT_LONGINT_POINTER: + *a.arg[dp->arg_index].a.a_count_longint_pointer = length; + break; +#ifdef HAVE_LONG_LONG + case TYPE_COUNT_LONGLONGINT_POINTER: + *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; + break; +#endif + default: + abort (); + } + } + else + { + arg_type type = a.arg[dp->arg_index].type; + CHAR_T *p; + unsigned int prefix_count; + int prefixes[2]; +#if !USE_SNPRINTF + size_t tmp_length; + CHAR_T tmpbuf[700]; + CHAR_T *tmp; + + /* Allocate a temporary buffer of sufficient size for calling + sprintf. */ + { + size_t width; + size_t precision; + + width = 0; + if (dp->width_start != dp->width_end) + { + if (dp->width_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->width_arg_index].a.a_int; + width = (arg < 0 ? (unsigned int) (-arg) : arg); + } + else + { + const CHAR_T *digitp = dp->width_start; + + do + width = xsum (xtimes (width, 10), *digitp++ - '0'); + while (digitp != dp->width_end); + } + } + + precision = 6; + if (dp->precision_start != dp->precision_end) + { + if (dp->precision_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->precision_arg_index].a.a_int; + precision = (arg < 0 ? 0 : arg); + } + else + { + const CHAR_T *digitp = dp->precision_start + 1; + + precision = 0; + while (digitp != dp->precision_end) + precision = xsum (xtimes (precision, 10), *digitp++ - '0'); + } + } + + switch (dp->conversion) + { + + case 'd': case 'i': case 'u': +# ifdef HAVE_LONG_LONG + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + ) + + 1; /* turn floor into ceil */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + ) + + 1; /* turn floor into ceil */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + ) + + 1; /* turn floor into ceil */ + if (tmp_length < precision) + tmp_length = precision; + /* Multiply by 2, as an estimate for FLAG_GROUP. */ + tmp_length = xsum (tmp_length, tmp_length); + /* Add 1, to account for a leading sign. */ + tmp_length = xsum (tmp_length, 1); + break; + + case 'o': +# ifdef HAVE_LONG_LONG + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1; /* turn floor into ceil */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1; /* turn floor into ceil */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1; /* turn floor into ceil */ + if (tmp_length < precision) + tmp_length = precision; + /* Add 1, to account for a leading sign. */ + tmp_length = xsum (tmp_length, 1); + break; + + case 'x': case 'X': +# ifdef HAVE_LONG_LONG + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + if (tmp_length < precision) + tmp_length = precision; + /* Add 2, to account for a leading sign or alternate form. */ + tmp_length = xsum (tmp_length, 2); + break; + + case 'f': case 'F': +# ifdef HAVE_LONG_DOUBLE + if (type == TYPE_LONGDOUBLE) + tmp_length = + (unsigned int) (LDBL_MAX_EXP + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 10; /* sign, decimal point etc. */ + else +# endif + tmp_length = + (unsigned int) (DBL_MAX_EXP + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 10; /* sign, decimal point etc. */ + tmp_length = xsum (tmp_length, precision); + break; + + case 'e': case 'E': case 'g': case 'G': + case 'a': case 'A': + tmp_length = + 12; /* sign, decimal point, exponent etc. */ + tmp_length = xsum (tmp_length, precision); + break; + + case 'c': +# if defined HAVE_WINT_T && !WIDE_CHAR_VERSION + if (type == TYPE_WIDE_CHAR) + tmp_length = MB_CUR_MAX; + else +# endif + tmp_length = 1; + break; + + case 's': +# ifdef HAVE_WCHAR_T + if (type == TYPE_WIDE_STRING) + { + tmp_length = + local_wcslen (a.arg[dp->arg_index].a.a_wide_string); + +# if !WIDE_CHAR_VERSION + tmp_length = xtimes (tmp_length, MB_CUR_MAX); +# endif + } + else +# endif + tmp_length = strlen (a.arg[dp->arg_index].a.a_string); + break; + + case 'p': + tmp_length = + (unsigned int) (sizeof (void *) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading 0x */ + break; + + default: + abort (); + } + + if (tmp_length < width) + tmp_length = width; + + tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ + } + + if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T)) + tmp = tmpbuf; + else + { + size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T)); + + if (size_overflow_p (tmp_memsize)) + /* Overflow, would lead to out of memory. */ + goto out_of_memory; + tmp = (CHAR_T *) malloc (tmp_memsize); + if (tmp == NULL) + /* Out of memory. */ + goto out_of_memory; + } +#endif + + /* Construct the format string for calling snprintf or + sprintf. */ + p = buf; + *p++ = '%'; + if (dp->flags & FLAG_GROUP) + *p++ = '\''; + if (dp->flags & FLAG_LEFT) + *p++ = '-'; + if (dp->flags & FLAG_SHOWSIGN) + *p++ = '+'; + if (dp->flags & FLAG_SPACE) + *p++ = ' '; + if (dp->flags & FLAG_ALT) + *p++ = '#'; + if (dp->flags & FLAG_ZERO) + *p++ = '0'; + if (dp->width_start != dp->width_end) + { + size_t n = dp->width_end - dp->width_start; + memcpy (p, dp->width_start, n * sizeof (CHAR_T)); + p += n; + } + if (dp->precision_start != dp->precision_end) + { + size_t n = dp->precision_end - dp->precision_start; + memcpy (p, dp->precision_start, n * sizeof (CHAR_T)); + p += n; + } + + switch (type) + { +#ifdef HAVE_LONG_LONG + case TYPE_LONGLONGINT: + case TYPE_ULONGLONGINT: + *p++ = 'l'; + /*FALLTHROUGH*/ +#endif + case TYPE_LONGINT: + case TYPE_ULONGINT: +#ifdef HAVE_WINT_T + case TYPE_WIDE_CHAR: +#endif +#ifdef HAVE_WCHAR_T + case TYPE_WIDE_STRING: +#endif + *p++ = 'l'; + break; +#ifdef HAVE_LONG_DOUBLE + case TYPE_LONGDOUBLE: + *p++ = 'L'; + break; +#endif + default: + break; + } + *p = dp->conversion; +#if USE_SNPRINTF + p[1] = '%'; + p[2] = 'n'; + p[3] = '\0'; +#else + p[1] = '\0'; +#endif + + /* Construct the arguments for calling snprintf or sprintf. */ + prefix_count = 0; + if (dp->width_arg_index != ARG_NONE) + { + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; + } + if (dp->precision_arg_index != ARG_NONE) + { + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; + } + +#if USE_SNPRINTF + /* Prepare checking whether snprintf returns the count + via %n. */ + ENSURE_ALLOCATION (xsum (length, 1)); + result[length] = '\0'; +#endif + + for (;;) + { + size_t maxlen; + int count; + int retcount; + + maxlen = allocated - length; + count = -1; + retcount = 0; + +#if USE_SNPRINTF +# define SNPRINTF_BUF(arg) \ + switch (prefix_count) \ + { \ + case 0: \ + retcount = SNPRINTF (result + length, maxlen, buf, \ + arg, &count); \ + break; \ + case 1: \ + retcount = SNPRINTF (result + length, maxlen, buf, \ + prefixes[0], arg, &count); \ + break; \ + case 2: \ + retcount = SNPRINTF (result + length, maxlen, buf, \ + prefixes[0], prefixes[1], arg, \ + &count); \ + break; \ + default: \ + abort (); \ + } +#else +# define SNPRINTF_BUF(arg) \ + switch (prefix_count) \ + { \ + case 0: \ + count = sprintf (tmp, buf, arg); \ + break; \ + case 1: \ + count = sprintf (tmp, buf, prefixes[0], arg); \ + break; \ + case 2: \ + count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ + arg); \ + break; \ + default: \ + abort (); \ + } +#endif + + switch (type) + { + case TYPE_SCHAR: + { + int arg = a.arg[dp->arg_index].a.a_schar; + SNPRINTF_BUF (arg); + } + break; + case TYPE_UCHAR: + { + unsigned int arg = a.arg[dp->arg_index].a.a_uchar; + SNPRINTF_BUF (arg); + } + break; + case TYPE_SHORT: + { + int arg = a.arg[dp->arg_index].a.a_short; + SNPRINTF_BUF (arg); + } + break; + case TYPE_USHORT: + { + unsigned int arg = a.arg[dp->arg_index].a.a_ushort; + SNPRINTF_BUF (arg); + } + break; + case TYPE_INT: + { + int arg = a.arg[dp->arg_index].a.a_int; + SNPRINTF_BUF (arg); + } + break; + case TYPE_UINT: + { + unsigned int arg = a.arg[dp->arg_index].a.a_uint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_LONGINT: + { + long int arg = a.arg[dp->arg_index].a.a_longint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_ULONGINT: + { + unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_LONG_LONG + case TYPE_LONGLONGINT: + { + long long int arg = a.arg[dp->arg_index].a.a_longlongint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_ULONGLONGINT: + { + unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_DOUBLE: + { + double arg = a.arg[dp->arg_index].a.a_double; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_LONG_DOUBLE + case TYPE_LONGDOUBLE: + { + long double arg = a.arg[dp->arg_index].a.a_longdouble; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_CHAR: + { + int arg = a.arg[dp->arg_index].a.a_char; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_WINT_T + case TYPE_WIDE_CHAR: + { + wint_t arg = a.arg[dp->arg_index].a.a_wide_char; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_STRING: + { + const char *arg = a.arg[dp->arg_index].a.a_string; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_WCHAR_T + case TYPE_WIDE_STRING: + { + const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_POINTER: + { + void *arg = a.arg[dp->arg_index].a.a_pointer; + SNPRINTF_BUF (arg); + } + break; + default: + abort (); + } + +#if USE_SNPRINTF + /* Portability: Not all implementations of snprintf() + are ISO C 99 compliant. Determine the number of + bytes that snprintf() has produced or would have + produced. */ + if (count >= 0) + { + /* Verify that snprintf() has NUL-terminated its + result. */ + if (count < maxlen && result[length + count] != '\0') + abort (); + /* Portability hack. */ + if (retcount > count) + count = retcount; + } + else + { + /* snprintf() doesn't understand the '%n' + directive. */ + if (p[1] != '\0') + { + /* Don't use the '%n' directive; instead, look + at the snprintf() return value. */ + p[1] = '\0'; + continue; + } + else + { + /* Look at the snprintf() return value. */ + if (retcount < 0) + { + /* HP-UX 10.20 snprintf() is doubly deficient: + It doesn't understand the '%n' directive, + *and* it returns -1 (rather than the length + that would have been required) when the + buffer is too small. */ + size_t bigger_need = + xsum (xtimes (allocated, 2), 12); + ENSURE_ALLOCATION (bigger_need); + continue; + } + else + count = retcount; + } + } +#endif + + /* Attempt to handle failure. */ + if (count < 0) + { + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EINVAL; + return NULL; + } + +#if !USE_SNPRINTF + if (count >= tmp_length) + /* tmp_length was incorrectly calculated - fix the + code above! */ + abort (); +#endif + + /* Make room for the result. */ + if (count >= maxlen) + { + /* Need at least count bytes. But allocate + proportionally, to avoid looping eternally if + snprintf() reports a too small count. */ + size_t n = + xmax (xsum (length, count), xtimes (allocated, 2)); + + ENSURE_ALLOCATION (n); +#if USE_SNPRINTF + continue; +#endif + } + +#if USE_SNPRINTF + /* The snprintf() result did fit. */ +#else + /* Append the sprintf() result. */ + memcpy (result + length, tmp, count * sizeof (CHAR_T)); + if (tmp != tmpbuf) + free (tmp); +#endif + + length += count; + break; + } + } + } + } + + /* Add the final NUL. */ + ENSURE_ALLOCATION (xsum (length, 1)); + result[length] = '\0'; + + if (result != resultbuf && length + 1 < allocated) + { + /* Shrink the allocated memory if possible. */ + CHAR_T *memory; + + memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T)); + if (memory != NULL) + result = memory; + } + + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + *lengthp = length; + if (length > INT_MAX) + goto length_overflow; + return result; + + length_overflow: + /* We could produce such a big string, but its length doesn't fit into + an 'int'. POSIX says that snprintf() fails with errno = EOVERFLOW in + this case. */ + if (result != resultbuf) + free (result); + errno = EOVERFLOW; + return NULL; + + out_of_memory: + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + out_of_memory_1: + CLEANUP (); + errno = ENOMEM; + return NULL; + } +} + +#undef SNPRINTF +#undef USE_SNPRINTF +#undef PRINTF_PARSE +#undef DIRECTIVES +#undef DIRECTIVE +#undef CHAR_T +#undef VASNPRINTF diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/vasnprintf.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/vasnprintf.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/vasnprintf.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/vasnprintf.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,77 @@ +/* vsprintf with automatic memory allocation. + Copyright (C) 2002-2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _VASNPRINTF_H +#define _VASNPRINTF_H + +/* Get va_list. */ +#include + +/* Get size_t. */ +#include + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(Spec) /* empty */ +# endif +/* The __-protected variants of `format' and `printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Write formatted output to a string dynamically allocated with malloc(). + You can pass a preallocated buffer for the result in RESULTBUF and its + size in *LENGTHP; otherwise you pass RESULTBUF = NULL. + If successful, return the address of the string (this may be = RESULTBUF + if no dynamic memory allocation was necessary) and set *LENGTHP to the + number of resulting bytes, excluding the trailing NUL. Upon error, set + errno and return NULL. + + When dynamic memory allocation occurs, the preallocated buffer is left + alone (with possibly modified contents). This makes it possible to use + a statically allocated or stack-allocated buffer, like this: + + char buf[100]; + size_t len = sizeof (buf); + char *output = vasnprintf (buf, &len, format, args); + if (output == NULL) + ... error handling ...; + else + { + ... use the output string ...; + if (output != buf) + free (output); + } + */ +extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); +extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) + __attribute__ ((__format__ (__printf__, 3, 0))); + +#ifdef __cplusplus +} +#endif + +#endif /* _VASNPRINTF_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/vsnprintf.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/vsnprintf.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/vsnprintf.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/vsnprintf.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,58 @@ +/* Formatted output to strings. + Copyright (C) 2004 Free Software Foundation, Inc. + Written by Simon Josefsson and Yoann Vandoorselaere . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "vsnprintf.h" + +#include +#include +#include +#include + +#include "vasnprintf.h" + +/* Print formatted output to string STR. Similar to vsprintf, but + additional length SIZE limit how much is written into STR. Returns + string length of formatted string (which may be larger than SIZE). + STR may be NULL, in which case nothing will be written. On error, + return a negative value. */ +int +vsnprintf (char *str, size_t size, const char *format, va_list args) +{ + char *output; + size_t len; + + len = size; + output = vasnprintf (str, &len, format, args); + + if (!output) + return -1; + + if (str != NULL) + if (len > size - 1) /* equivalent to: (size > 0 && len >= size) */ + str[size - 1] = '\0'; + + if (output != str) + free (output); + + return len; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/vsnprintf.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/vsnprintf.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/vsnprintf.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/vsnprintf.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,31 @@ +/* Formatted output to strings. + Copyright (C) 2004 Free Software Foundation, Inc. + Written by Simon Josefsson and Yoann Vandoorselaere . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef VSNPRINTF_H +#define VSNPRINTF_H + +#include + +/* Get vsnprintf declaration, if available. */ +#include + +#if defined HAVE_DECL_VSNPRINTF && !HAVE_DECL_VSNPRINTF +int vsnprintf (char *str, size_t size, const char *format, va_list args); +#endif + +#endif /* VSNPRINTF_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/wcwidth.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/wcwidth.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/wcwidth.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/wcwidth.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,70 @@ +/* Determine the number of screen columns needed for a character. + Copyright (C) 2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _gl_WCWIDTH_H +#define _gl_WCWIDTH_H + +#if HAVE_WCHAR_T + +/* Get wcwidth if available, along with wchar_t. */ +# if HAVE_WCHAR_H +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +# include +# include +# include +# endif + +/* Get iswprint. */ +# if HAVE_WCTYPE_H +# include +# endif +# if !defined iswprint && !HAVE_ISWPRINT +# define iswprint(wc) 1 +# endif + +# ifndef HAVE_DECL_WCWIDTH +"this configure-time declaration test was not run" +# endif +# ifndef wcwidth +# if !HAVE_WCWIDTH + +/* wcwidth doesn't exist, so assume all printable characters have + width 1. */ +static inline int +wcwidth (wchar_t wc) +{ + return wc == 0 ? 0 : iswprint (wc) ? 1 : -1; +} + +# elif !HAVE_DECL_WCWIDTH + +/* wcwidth exists but is not declared. */ +extern +# ifdef __cplusplus +"C" +# endif +int wcwidth (int /* actually wchar_t */); + +# endif +# endif + +#endif /* HAVE_WCHAR_H */ + +#endif /* _gl_WCWIDTH_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xalloc-die.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xalloc-die.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xalloc-die.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xalloc-die.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,44 @@ +/* Report a memory allocation failure and exit. + + Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2006 Free + Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "xalloc.h" + +#include + +#include "error.h" +#include "exitfail.h" + +#include "gettext.h" +#define _(msgid) gettext (msgid) + +void +xalloc_die (void) +{ + error (exit_failure, 0, "%s", _("memory exhausted")); + + /* The `noreturn' cannot be given to error, since it may return if + its first argument is 0. To help compilers understand the + xalloc_die does not return, call abort. Also, the abort is a + safety feature if exit_failure is 0 (which shouldn't happen). */ + abort (); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xalloc.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xalloc.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xalloc.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xalloc.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,79 @@ +/* xalloc.h -- malloc with out-of-memory checking + + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2003, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef XALLOC_H_ +# define XALLOC_H_ + +# include + + +# ifdef __cplusplus +extern "C" { +# endif + + +# ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__ +# define __attribute__(x) +# endif +# endif + +# ifndef ATTRIBUTE_NORETURN +# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +# endif + +/* This function is always triggered when memory is exhausted. + It must be defined by the application, either explicitly + or by using gnulib's xalloc-die module. This is the + function to call when one wants the program to die because of a + memory allocation failure. */ +extern void xalloc_die (void) ATTRIBUTE_NORETURN; + +void *xmalloc (size_t s); +void *xnmalloc (size_t n, size_t s); +void *xzalloc (size_t s); +void *xcalloc (size_t n, size_t s); +void *xrealloc (void *p, size_t s); +void *xnrealloc (void *p, size_t n, size_t s); +void *x2realloc (void *p, size_t *pn); +void *x2nrealloc (void *p, size_t *pn, size_t s); +void *xmemdup (void const *p, size_t s); +char *xstrdup (char const *str); + +/* Return 1 if an array of N objects, each of size S, cannot exist due + to size arithmetic overflow. S must be positive and N must be + nonnegative. This is a macro, not an inline function, so that it + works correctly even when SIZE_MAX < N. + + By gnulib convention, SIZE_MAX represents overflow in size + calculations, so the conservative dividend to use here is + SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value. + However, malloc (SIZE_MAX) fails on all known hosts where + sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for + exactly-SIZE_MAX allocations on such hosts; this avoids a test and + branch when S is known to be 1. */ +# define xalloc_oversized(n, s) \ + ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n)) + +# ifdef __cplusplus +} +# endif + + +#endif /* !XALLOC_H_ */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xmalloc.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xmalloc.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xmalloc.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xmalloc.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,241 @@ +/* xmalloc.c -- malloc with out of memory checking + + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "xalloc.h" + +#include +#include + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif + +/* 1 if calloc is known to be compatible with GNU calloc. This + matters if we are not also using the calloc module, which defines + HAVE_CALLOC and supports the GNU API even on non-GNU platforms. */ +#if defined HAVE_CALLOC || defined __GLIBC__ +enum { HAVE_GNU_CALLOC = 1 }; +#else +enum { HAVE_GNU_CALLOC = 0 }; +#endif + +/* Allocate an array of N objects, each with S bytes of memory, + dynamically, with error checking. S must be nonzero. */ + +static inline void * +xnmalloc_inline (size_t n, size_t s) +{ + void *p; + if (xalloc_oversized (n, s) || (! (p = malloc (n * s)) && n != 0)) + xalloc_die (); + return p; +} + +void * +xnmalloc (size_t n, size_t s) +{ + return xnmalloc_inline (n, s); +} + +/* Allocate N bytes of memory dynamically, with error checking. */ + +void * +xmalloc (size_t n) +{ + return xnmalloc_inline (n, 1); +} + +/* Change the size of an allocated block of memory P to an array of N + objects each of S bytes, with error checking. S must be nonzero. */ + +static inline void * +xnrealloc_inline (void *p, size_t n, size_t s) +{ + if (xalloc_oversized (n, s) || (! (p = realloc (p, n * s)) && n != 0)) + xalloc_die (); + return p; +} + +void * +xnrealloc (void *p, size_t n, size_t s) +{ + return xnrealloc_inline (p, n, s); +} + +/* Change the size of an allocated block of memory P to N bytes, + with error checking. */ + +void * +xrealloc (void *p, size_t n) +{ + return xnrealloc_inline (p, n, 1); +} + + +/* If P is null, allocate a block of at least *PN such objects; + otherwise, reallocate P so that it contains more than *PN objects + each of S bytes. *PN must be nonzero unless P is null, and S must + be nonzero. Set *PN to the new number of objects, and return the + pointer to the new block. *PN is never set to zero, and the + returned pointer is never null. + + Repeated reallocations are guaranteed to make progress, either by + allocating an initial block with a nonzero size, or by allocating a + larger block. + + In the following implementation, nonzero sizes are doubled so that + repeated reallocations have O(N log N) overall cost rather than + O(N**2) cost, but the specification for this function does not + guarantee that sizes are doubled. + + Here is an example of use: + + int *p = NULL; + size_t used = 0; + size_t allocated = 0; + + void + append_int (int value) + { + if (used == allocated) + p = x2nrealloc (p, &allocated, sizeof *p); + p[used++] = value; + } + + This causes x2nrealloc to allocate a block of some nonzero size the + first time it is called. + + To have finer-grained control over the initial size, set *PN to a + nonzero value before calling this function with P == NULL. For + example: + + int *p = NULL; + size_t used = 0; + size_t allocated = 0; + size_t allocated1 = 1000; + + void + append_int (int value) + { + if (used == allocated) + { + p = x2nrealloc (p, &allocated1, sizeof *p); + allocated = allocated1; + } + p[used++] = value; + } + + */ + +static inline void * +x2nrealloc_inline (void *p, size_t *pn, size_t s) +{ + size_t n = *pn; + + if (! p) + { + if (! n) + { + /* The approximate size to use for initial small allocation + requests, when the invoking code specifies an old size of + zero. 64 bytes is the largest "small" request for the + GNU C library malloc. */ + enum { DEFAULT_MXFAST = 64 }; + + n = DEFAULT_MXFAST / s; + n += !n; + } + } + else + { + if (SIZE_MAX / 2 / s < n) + xalloc_die (); + n *= 2; + } + + *pn = n; + return xrealloc (p, n * s); +} + +void * +x2nrealloc (void *p, size_t *pn, size_t s) +{ + return x2nrealloc_inline (p, pn, s); +} + +/* If P is null, allocate a block of at least *PN bytes; otherwise, + reallocate P so that it contains more than *PN bytes. *PN must be + nonzero unless P is null. Set *PN to the new block's size, and + return the pointer to the new block. *PN is never set to zero, and + the returned pointer is never null. */ + +void * +x2realloc (void *p, size_t *pn) +{ + return x2nrealloc_inline (p, pn, 1); +} + +/* Allocate S bytes of zeroed memory dynamically, with error checking. + There's no need for xnzalloc (N, S), since it would be equivalent + to xcalloc (N, S). */ + +void * +xzalloc (size_t s) +{ + return memset (xmalloc (s), 0, s); +} + +/* Allocate zeroed memory for N elements of S bytes, with error + checking. S must be nonzero. */ + +void * +xcalloc (size_t n, size_t s) +{ + void *p; + /* Test for overflow, since some calloc implementations don't have + proper overflow checks. But omit overflow and size-zero tests if + HAVE_GNU_CALLOC, since GNU calloc catches overflow and never + returns NULL if successful. */ + if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s)) + || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0))) + xalloc_die (); + return p; +} + +/* Clone an object P of size S, with error checking. There's no need + for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any + need for an arithmetic overflow check. */ + +void * +xmemdup (void const *p, size_t s) +{ + return memcpy (xmalloc (s), p, s); +} + +/* Clone STRING. */ + +char * +xstrdup (char const *string) +{ + return xmemdup (string, strlen (string) + 1); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xsize.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xsize.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xsize.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xsize.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,108 @@ +/* xsize.h -- Checked size_t computations. + + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _XSIZE_H +#define _XSIZE_H + +/* Get size_t. */ +#include + +/* Get SIZE_MAX. */ +#include +#if HAVE_STDINT_H +# include +#endif + +/* The size of memory objects is often computed through expressions of + type size_t. Example: + void* p = malloc (header_size + n * element_size). + These computations can lead to overflow. When this happens, malloc() + returns a piece of memory that is way too small, and the program then + crashes while attempting to fill the memory. + To avoid this, the functions and macros in this file check for overflow. + The convention is that SIZE_MAX represents overflow. + malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc + implementation that uses mmap --, it's recommended to use size_overflow_p() + or size_in_bounds_p() before invoking malloc(). + The example thus becomes: + size_t size = xsum (header_size, xtimes (n, element_size)); + void *p = (size_in_bounds_p (size) ? malloc (size) : NULL); +*/ + +/* Convert an arbitrary value >= 0 to type size_t. */ +#define xcast_size_t(N) \ + ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX) + +/* Sum of two sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xsum (size_t size1, size_t size2) +{ + size_t sum = size1 + size2; + return (sum >= size1 ? sum : SIZE_MAX); +} + +/* Sum of three sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xsum3 (size_t size1, size_t size2, size_t size3) +{ + return xsum (xsum (size1, size2), size3); +} + +/* Sum of four sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xsum4 (size_t size1, size_t size2, size_t size3, size_t size4) +{ + return xsum (xsum (xsum (size1, size2), size3), size4); +} + +/* Maximum of two sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xmax (size_t size1, size_t size2) +{ + /* No explicit check is needed here, because for any n: + max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */ + return (size1 >= size2 ? size1 : size2); +} + +/* Multiplication of a count with an element size, with overflow check. + The count must be >= 0 and the element size must be > 0. + This is a macro, not an inline function, so that it works correctly even + when N is of a wider tupe and N > SIZE_MAX. */ +#define xtimes(N, ELSIZE) \ + ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX) + +/* Check for overflow. */ +#define size_overflow_p(SIZE) \ + ((SIZE) == SIZE_MAX) +/* Check against overflow. */ +#define size_in_bounds_p(SIZE) \ + ((SIZE) != SIZE_MAX) + +#endif /* _XSIZE_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xstrndup.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xstrndup.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xstrndup.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xstrndup.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,39 @@ +/* Duplicate a bounded initial segment of a string, with out-of-memory + checking. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "xstrndup.h" + +#include "strndup.h" +#include "xalloc.h" + +/* Return a newly allocated copy of at most N bytes of STRING. + In other words, return a copy of the initial segment of length N of + STRING. */ +char * +xstrndup (const char *string, size_t n) +{ + char *s = strndup (string, n); + if (! s) + xalloc_die (); + return s; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xstrndup.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xstrndup.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/lib/xstrndup.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/lib/xstrndup.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,24 @@ +/* Duplicate a bounded initial segment of a string, with out-of-memory + checking. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* Return a newly allocated copy of at most N bytes of STRING. + In other words, return a copy of the initial segment of length N of + STRING. */ +extern char *xstrndup (const char *string, size_t n); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/libltdl/ltdl.c kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/libltdl/ltdl.c --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/libltdl/ltdl.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/libltdl/ltdl.c 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,4521 @@ +/* ltdl.c -- system independent dlopen wrapper + Copyright (C) 1998, 1999, 2000, 2004, 2005 Free Software Foundation, Inc. + Originally by Thomas Tanner + This file is part of GNU Libtool. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +As a special exception to the GNU Lesser General Public License, +if you distribute this file as part of a program or library that +is built using GNU libtool, you may include it under the same +distribution terms that you use for the rest of that program. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + +*/ + +#if HAVE_CONFIG_H +# include +#endif + +#if HAVE_UNISTD_H +# include +#endif + +#if HAVE_STDIO_H +# include +#endif + +/* Include the header defining malloc. On K&R C compilers, + that's , on ANSI C and ISO C compilers, that's . */ +#if HAVE_STDLIB_H +# include +#else +# if HAVE_MALLOC_H +# include +# endif +#endif + +#if HAVE_STRING_H +# include +#else +# if HAVE_STRINGS_H +# include +# endif +#endif + +#if HAVE_CTYPE_H +# include +#endif + +#if HAVE_MEMORY_H +# include +#endif + +#if HAVE_ERRNO_H +# include +#endif + + +#ifndef __WINDOWS__ +# ifdef __WIN32__ +# define __WINDOWS__ +# endif +#endif + + +#undef LT_USE_POSIX_DIRENT +#ifdef HAVE_CLOSEDIR +# ifdef HAVE_OPENDIR +# ifdef HAVE_READDIR +# ifdef HAVE_DIRENT_H +# define LT_USE_POSIX_DIRENT +# endif /* HAVE_DIRENT_H */ +# endif /* HAVE_READDIR */ +# endif /* HAVE_OPENDIR */ +#endif /* HAVE_CLOSEDIR */ + + +#undef LT_USE_WINDOWS_DIRENT_EMULATION +#ifndef LT_USE_POSIX_DIRENT +# ifdef __WINDOWS__ +# define LT_USE_WINDOWS_DIRENT_EMULATION +# endif /* __WINDOWS__ */ +#endif /* LT_USE_POSIX_DIRENT */ + + +#ifdef LT_USE_POSIX_DIRENT +# include +# define LT_D_NAMLEN(dirent) (strlen((dirent)->d_name)) +#else +# ifdef LT_USE_WINDOWS_DIRENT_EMULATION +# define LT_D_NAMLEN(dirent) (strlen((dirent)->d_name)) +# else +# define dirent direct +# define LT_D_NAMLEN(dirent) ((dirent)->d_namlen) +# if HAVE_SYS_NDIR_H +# include +# endif +# if HAVE_SYS_DIR_H +# include +# endif +# if HAVE_NDIR_H +# include +# endif +# endif +#endif + +#if HAVE_ARGZ_H +# include +#endif + +#if HAVE_ASSERT_H +# include +#else +# define assert(arg) ((void) 0) +#endif + +#include "ltdl.h" + +#if WITH_DMALLOC +# include +#endif + + + + +/* --- WINDOWS SUPPORT --- */ + + +#ifdef DLL_EXPORT +# define LT_GLOBAL_DATA __declspec(dllexport) +#else +# define LT_GLOBAL_DATA +#endif + +/* fopen() mode flags for reading a text file */ +#undef LT_READTEXT_MODE +#ifdef __WINDOWS__ +# define LT_READTEXT_MODE "rt" +#else +# define LT_READTEXT_MODE "r" +#endif + +#ifdef LT_USE_WINDOWS_DIRENT_EMULATION + +#include + +#define dirent lt_dirent +#define DIR lt_DIR + +struct dirent +{ + char d_name[2048]; + int d_namlen; +}; + +typedef struct _DIR +{ + HANDLE hSearch; + WIN32_FIND_DATA Win32FindData; + BOOL firsttime; + struct dirent file_info; +} DIR; + +#endif /* LT_USE_WINDOWS_DIRENT_EMULATION */ + + +/* --- MANIFEST CONSTANTS --- */ + + +/* Standard libltdl search path environment variable name */ +#undef LTDL_SEARCHPATH_VAR +#define LTDL_SEARCHPATH_VAR "LTDL_LIBRARY_PATH" + +/* Standard libtool archive file extension. */ +#undef LTDL_ARCHIVE_EXT +#define LTDL_ARCHIVE_EXT ".la" + +/* max. filename length */ +#ifndef LT_FILENAME_MAX +# define LT_FILENAME_MAX 1024 +#endif + +/* This is the maximum symbol size that won't require malloc/free */ +#undef LT_SYMBOL_LENGTH +#define LT_SYMBOL_LENGTH 128 + +/* This accounts for the _LTX_ separator */ +#undef LT_SYMBOL_OVERHEAD +#define LT_SYMBOL_OVERHEAD 5 + + + + +/* --- MEMORY HANDLING --- */ + + +/* These are the functions used internally. In addition to making + use of the associated function pointers above, they also perform + error handling. */ +static char *lt_estrdup LT_PARAMS((const char *str)); +static lt_ptr lt_emalloc LT_PARAMS((size_t size)); +static lt_ptr lt_erealloc LT_PARAMS((lt_ptr addr, size_t size)); + +/* static lt_ptr rpl_realloc LT_PARAMS((lt_ptr ptr, size_t size)); */ +#define rpl_realloc realloc + +/* These are the pointers that can be changed by the caller: */ +LT_GLOBAL_DATA lt_ptr (*lt_dlmalloc) LT_PARAMS((size_t size)) + = (lt_ptr (*) LT_PARAMS((size_t))) malloc; +LT_GLOBAL_DATA lt_ptr (*lt_dlrealloc) LT_PARAMS((lt_ptr ptr, size_t size)) + = (lt_ptr (*) LT_PARAMS((lt_ptr, size_t))) rpl_realloc; +LT_GLOBAL_DATA void (*lt_dlfree) LT_PARAMS((lt_ptr ptr)) + = (void (*) LT_PARAMS((lt_ptr))) free; + +/* The following macros reduce the amount of typing needed to cast + assigned memory. */ +#if WITH_DMALLOC + +#define LT_DLMALLOC(tp, n) ((tp *) xmalloc ((n) * sizeof(tp))) +#define LT_DLREALLOC(tp, p, n) ((tp *) xrealloc ((p), (n) * sizeof(tp))) +#define LT_DLFREE(p) \ + LT_STMT_START { if (p) (p) = (xfree (p), (lt_ptr) 0); } LT_STMT_END + +#define LT_EMALLOC(tp, n) ((tp *) xmalloc ((n) * sizeof(tp))) +#define LT_EREALLOC(tp, p, n) ((tp *) xrealloc ((p), (n) * sizeof(tp))) + +#else + +#define LT_DLMALLOC(tp, n) ((tp *) lt_dlmalloc ((n) * sizeof(tp))) +#define LT_DLREALLOC(tp, p, n) ((tp *) lt_dlrealloc ((p), (n) * sizeof(tp))) +#define LT_DLFREE(p) \ + LT_STMT_START { if (p) (p) = (lt_dlfree (p), (lt_ptr) 0); } LT_STMT_END + +#define LT_EMALLOC(tp, n) ((tp *) lt_emalloc ((n) * sizeof(tp))) +#define LT_EREALLOC(tp, p, n) ((tp *) lt_erealloc ((p), (n) * sizeof(tp))) + +#endif + +#define LT_DLMEM_REASSIGN(p, q) LT_STMT_START { \ + if ((p) != (q)) { if (p) lt_dlfree (p); (p) = (q); (q) = 0; } \ + } LT_STMT_END + + +/* --- REPLACEMENT FUNCTIONS --- */ + + +#undef strdup +#define strdup rpl_strdup + +static char *strdup LT_PARAMS((const char *str)); + +static char * +strdup(str) + const char *str; +{ + char *tmp = 0; + + if (str) + { + tmp = LT_DLMALLOC (char, 1+ strlen (str)); + if (tmp) + { + strcpy(tmp, str); + } + } + + return tmp; +} + + +#if ! HAVE_STRCMP + +#undef strcmp +#define strcmp rpl_strcmp + +static int strcmp LT_PARAMS((const char *str1, const char *str2)); + +static int +strcmp (str1, str2) + const char *str1; + const char *str2; +{ + if (str1 == str2) + return 0; + if (str1 == 0) + return -1; + if (str2 == 0) + return 1; + + for (;*str1 && *str2; ++str1, ++str2) + { + if (*str1 != *str2) + break; + } + + return (int)(*str1 - *str2); +} +#endif + + +#if ! HAVE_STRCHR + +# if HAVE_INDEX +# define strchr index +# else +# define strchr rpl_strchr + +static const char *strchr LT_PARAMS((const char *str, int ch)); + +static const char* +strchr(str, ch) + const char *str; + int ch; +{ + const char *p; + + for (p = str; *p != (char)ch && *p != LT_EOS_CHAR; ++p) + /*NOWORK*/; + + return (*p == (char)ch) ? p : 0; +} + +# endif +#endif /* !HAVE_STRCHR */ + + +#if ! HAVE_STRRCHR + +# if HAVE_RINDEX +# define strrchr rindex +# else +# define strrchr rpl_strrchr + +static const char *strrchr LT_PARAMS((const char *str, int ch)); + +static const char* +strrchr(str, ch) + const char *str; + int ch; +{ + const char *p, *q = 0; + + for (p = str; *p != LT_EOS_CHAR; ++p) + { + if (*p == (char) ch) + { + q = p; + } + } + + return q; +} + +# endif +#endif + +/* NOTE: Neither bcopy nor the memcpy implementation below can + reliably handle copying in overlapping areas of memory. Use + memmove (for which there is a fallback implmentation below) + if you need that behaviour. */ +#if ! HAVE_MEMCPY + +# if HAVE_BCOPY +# define memcpy(dest, src, size) bcopy (src, dest, size) +# else +# define memcpy rpl_memcpy + +static lt_ptr memcpy LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size)); + +static lt_ptr +memcpy (dest, src, size) + lt_ptr dest; + const lt_ptr src; + size_t size; +{ + const char * s = src; + char * d = dest; + size_t i = 0; + + for (i = 0; i < size; ++i) + { + d[i] = s[i]; + } + + return dest; +} + +# endif /* !HAVE_BCOPY */ +#endif /* !HAVE_MEMCPY */ + +#if ! HAVE_MEMMOVE +# define memmove rpl_memmove + +static lt_ptr memmove LT_PARAMS((lt_ptr dest, const lt_ptr src, size_t size)); + +static lt_ptr +memmove (dest, src, size) + lt_ptr dest; + const lt_ptr src; + size_t size; +{ + const char * s = src; + char * d = dest; + size_t i; + + if (d < s) + for (i = 0; i < size; ++i) + { + d[i] = s[i]; + } + else if (d > s && size > 0) + for (i = size -1; ; --i) + { + d[i] = s[i]; + if (i == 0) + break; + } + + return dest; +} + +#endif /* !HAVE_MEMMOVE */ + +#ifdef LT_USE_WINDOWS_DIRENT_EMULATION + +static void closedir LT_PARAMS((DIR *entry)); + +static void +closedir(entry) + DIR *entry; +{ + assert(entry != (DIR *) NULL); + FindClose(entry->hSearch); + lt_dlfree((lt_ptr)entry); +} + + +static DIR * opendir LT_PARAMS((const char *path)); + +static DIR* +opendir (path) + const char *path; +{ + char file_specification[LT_FILENAME_MAX]; + DIR *entry; + + assert(path != (char *) NULL); + /* allow space for: path + '\\' '\\' '*' '.' '*' + '\0' */ + (void) strncpy (file_specification, path, LT_FILENAME_MAX-6); + file_specification[LT_FILENAME_MAX-6] = LT_EOS_CHAR; + (void) strcat(file_specification,"\\"); + entry = LT_DLMALLOC (DIR,sizeof(DIR)); + if (entry != (DIR *) 0) + { + entry->firsttime = TRUE; + entry->hSearch = FindFirstFile(file_specification,&entry->Win32FindData); + } + if (entry->hSearch == INVALID_HANDLE_VALUE) + { + (void) strcat(file_specification,"\\*.*"); + entry->hSearch = FindFirstFile(file_specification,&entry->Win32FindData); + if (entry->hSearch == INVALID_HANDLE_VALUE) + { + LT_DLFREE (entry); + return (DIR *) 0; + } + } + return(entry); +} + + +static struct dirent *readdir LT_PARAMS((DIR *entry)); + +static struct dirent *readdir(entry) + DIR *entry; +{ + int + status; + + if (entry == (DIR *) 0) + return((struct dirent *) 0); + if (!entry->firsttime) + { + status = FindNextFile(entry->hSearch,&entry->Win32FindData); + if (status == 0) + return((struct dirent *) 0); + } + entry->firsttime = FALSE; + (void) strncpy(entry->file_info.d_name,entry->Win32FindData.cFileName, + LT_FILENAME_MAX-1); + entry->file_info.d_name[LT_FILENAME_MAX - 1] = LT_EOS_CHAR; + entry->file_info.d_namlen = strlen(entry->file_info.d_name); + return(&entry->file_info); +} + +#endif /* LT_USE_WINDOWS_DIRENT_EMULATION */ + +/* According to Alexandre Oliva , + ``realloc is not entirely portable'' + In any case we want to use the allocator supplied by the user without + burdening them with an lt_dlrealloc function pointer to maintain. + Instead implement our own version (with known boundary conditions) + using lt_dlmalloc and lt_dlfree. */ + +/* #undef realloc + #define realloc rpl_realloc +*/ +#if 0 + /* You can't (re)define realloc unless you also (re)define malloc. + Right now, this code uses the size of the *destination* to decide + how much to copy. That's not right, but you can't know the size + of the source unless you know enough about, or wrote malloc. So + this code is disabled... */ + +static lt_ptr +realloc (ptr, size) + lt_ptr ptr; + size_t size; +{ + if (size == 0) + { + /* For zero or less bytes, free the original memory */ + if (ptr != 0) + { + lt_dlfree (ptr); + } + + return (lt_ptr) 0; + } + else if (ptr == 0) + { + /* Allow reallocation of a NULL pointer. */ + return lt_dlmalloc (size); + } + else + { + /* Allocate a new block, copy and free the old block. */ + lt_ptr mem = lt_dlmalloc (size); + + if (mem) + { + memcpy (mem, ptr, size); + lt_dlfree (ptr); + } + + /* Note that the contents of PTR are not damaged if there is + insufficient memory to realloc. */ + return mem; + } +} +#endif + + +#if ! HAVE_ARGZ_APPEND +# define argz_append rpl_argz_append + +static error_t argz_append LT_PARAMS((char **pargz, size_t *pargz_len, + const char *buf, size_t buf_len)); + +static error_t +argz_append (pargz, pargz_len, buf, buf_len) + char **pargz; + size_t *pargz_len; + const char *buf; + size_t buf_len; +{ + size_t argz_len; + char *argz; + + assert (pargz); + assert (pargz_len); + assert ((*pargz && *pargz_len) || (!*pargz && !*pargz_len)); + + /* If nothing needs to be appended, no more work is required. */ + if (buf_len == 0) + return 0; + + /* Ensure there is enough room to append BUF_LEN. */ + argz_len = *pargz_len + buf_len; + argz = LT_DLREALLOC (char, *pargz, argz_len); + if (!argz) + return ENOMEM; + + /* Copy characters from BUF after terminating '\0' in ARGZ. */ + memcpy (argz + *pargz_len, buf, buf_len); + + /* Assign new values. */ + *pargz = argz; + *pargz_len = argz_len; + + return 0; +} +#endif /* !HAVE_ARGZ_APPEND */ + + +#if ! HAVE_ARGZ_CREATE_SEP +# define argz_create_sep rpl_argz_create_sep + +static error_t argz_create_sep LT_PARAMS((const char *str, int delim, + char **pargz, size_t *pargz_len)); + +static error_t +argz_create_sep (str, delim, pargz, pargz_len) + const char *str; + int delim; + char **pargz; + size_t *pargz_len; +{ + size_t argz_len; + char *argz = 0; + + assert (str); + assert (pargz); + assert (pargz_len); + + /* Make a copy of STR, but replacing each occurrence of + DELIM with '\0'. */ + argz_len = 1+ LT_STRLEN (str); + if (argz_len) + { + const char *p; + char *q; + + argz = LT_DLMALLOC (char, argz_len); + if (!argz) + return ENOMEM; + + for (p = str, q = argz; *p != LT_EOS_CHAR; ++p) + { + if (*p == delim) + { + /* Ignore leading delimiters, and fold consecutive + delimiters in STR into a single '\0' in ARGZ. */ + if ((q > argz) && (q[-1] != LT_EOS_CHAR)) + *q++ = LT_EOS_CHAR; + else + --argz_len; + } + else + *q++ = *p; + } + /* Copy terminating LT_EOS_CHAR. */ + *q = *p; + } + + /* If ARGZ_LEN has shrunk to nothing, release ARGZ's memory. */ + if (!argz_len) + LT_DLFREE (argz); + + /* Assign new values. */ + *pargz = argz; + *pargz_len = argz_len; + + return 0; +} +#endif /* !HAVE_ARGZ_CREATE_SEP */ + + +#if ! HAVE_ARGZ_INSERT +# define argz_insert rpl_argz_insert + +static error_t argz_insert LT_PARAMS((char **pargz, size_t *pargz_len, + char *before, const char *entry)); + +static error_t +argz_insert (pargz, pargz_len, before, entry) + char **pargz; + size_t *pargz_len; + char *before; + const char *entry; +{ + assert (pargz); + assert (pargz_len); + assert (entry && *entry); + + /* No BEFORE address indicates ENTRY should be inserted after the + current last element. */ + if (!before) + return argz_append (pargz, pargz_len, entry, 1+ LT_STRLEN (entry)); + + /* This probably indicates a programmer error, but to preserve + semantics, scan back to the start of an entry if BEFORE points + into the middle of it. */ + while ((before > *pargz) && (before[-1] != LT_EOS_CHAR)) + --before; + + { + size_t entry_len = 1+ LT_STRLEN (entry); + size_t argz_len = *pargz_len + entry_len; + size_t offset = before - *pargz; + char *argz = LT_DLREALLOC (char, *pargz, argz_len); + + if (!argz) + return ENOMEM; + + /* Make BEFORE point to the equivalent offset in ARGZ that it + used to have in *PARGZ incase realloc() moved the block. */ + before = argz + offset; + + /* Move the ARGZ entries starting at BEFORE up into the new + space at the end -- making room to copy ENTRY into the + resulting gap. */ + memmove (before + entry_len, before, *pargz_len - offset); + memcpy (before, entry, entry_len); + + /* Assign new values. */ + *pargz = argz; + *pargz_len = argz_len; + } + + return 0; +} +#endif /* !HAVE_ARGZ_INSERT */ + + +#if ! HAVE_ARGZ_NEXT +# define argz_next rpl_argz_next + +static char *argz_next LT_PARAMS((char *argz, size_t argz_len, + const char *entry)); + +static char * +argz_next (argz, argz_len, entry) + char *argz; + size_t argz_len; + const char *entry; +{ + assert ((argz && argz_len) || (!argz && !argz_len)); + + if (entry) + { + /* Either ARGZ/ARGZ_LEN is empty, or ENTRY points into an address + within the ARGZ vector. */ + assert ((!argz && !argz_len) + || ((argz <= entry) && (entry < (argz + argz_len)))); + + /* Move to the char immediately after the terminating + '\0' of ENTRY. */ + entry = 1+ strchr (entry, LT_EOS_CHAR); + + /* Return either the new ENTRY, or else NULL if ARGZ is + exhausted. */ + return (entry >= argz + argz_len) ? 0 : (char *) entry; + } + else + { + /* This should probably be flagged as a programmer error, + since starting an argz_next loop with the iterator set + to ARGZ is safer. To preserve semantics, handle the NULL + case by returning the start of ARGZ (if any). */ + if (argz_len > 0) + return argz; + else + return 0; + } +} +#endif /* !HAVE_ARGZ_NEXT */ + + + +#if ! HAVE_ARGZ_STRINGIFY +# define argz_stringify rpl_argz_stringify + +static void argz_stringify LT_PARAMS((char *argz, size_t argz_len, + int sep)); + +static void +argz_stringify (argz, argz_len, sep) + char *argz; + size_t argz_len; + int sep; +{ + assert ((argz && argz_len) || (!argz && !argz_len)); + + if (sep) + { + --argz_len; /* don't stringify the terminating EOS */ + while (--argz_len > 0) + { + if (argz[argz_len] == LT_EOS_CHAR) + argz[argz_len] = sep; + } + } +} +#endif /* !HAVE_ARGZ_STRINGIFY */ + + + + +/* --- TYPE DEFINITIONS -- */ + + +/* This type is used for the array of caller data sets in each handler. */ +typedef struct { + lt_dlcaller_id key; + lt_ptr data; +} lt_caller_data; + + + + +/* --- OPAQUE STRUCTURES DECLARED IN LTDL.H --- */ + + +/* Extract the diagnostic strings from the error table macro in the same + order as the enumerated indices in ltdl.h. */ + +static const char *lt_dlerror_strings[] = + { +#define LT_ERROR(name, diagnostic) (diagnostic), + lt_dlerror_table +#undef LT_ERROR + + 0 + }; + +/* This structure is used for the list of registered loaders. */ +struct lt_dlloader { + struct lt_dlloader *next; + const char *loader_name; /* identifying name for each loader */ + const char *sym_prefix; /* prefix for symbols */ + lt_module_open *module_open; + lt_module_close *module_close; + lt_find_sym *find_sym; + lt_dlloader_exit *dlloader_exit; + lt_user_data dlloader_data; +}; + +struct lt_dlhandle_struct { + struct lt_dlhandle_struct *next; + lt_dlloader *loader; /* dlopening interface */ + lt_dlinfo info; + int depcount; /* number of dependencies */ + lt_dlhandle *deplibs; /* dependencies */ + lt_module module; /* system module handle */ + lt_ptr system; /* system specific data */ + lt_caller_data *caller_data; /* per caller associated data */ + int flags; /* various boolean stats */ +}; + +/* Various boolean flags can be stored in the flags field of an + lt_dlhandle_struct... */ +#define LT_DLGET_FLAG(handle, flag) (((handle)->flags & (flag)) == (flag)) +#define LT_DLSET_FLAG(handle, flag) ((handle)->flags |= (flag)) + +#define LT_DLRESIDENT_FLAG (0x01 << 0) +/* ...add more flags here... */ + +#define LT_DLIS_RESIDENT(handle) LT_DLGET_FLAG(handle, LT_DLRESIDENT_FLAG) + + +#define LT_DLSTRERROR(name) lt_dlerror_strings[LT_CONC(LT_ERROR_,name)] + +static const char objdir[] = LTDL_OBJDIR; +static const char archive_ext[] = LTDL_ARCHIVE_EXT; +#ifdef LTDL_SHLIB_EXT +static const char shlib_ext[] = LTDL_SHLIB_EXT; +#endif +#ifdef LTDL_SYSSEARCHPATH +static const char sys_search_path[] = LTDL_SYSSEARCHPATH; +#endif + + + + +/* --- MUTEX LOCKING --- */ + + +/* Macros to make it easier to run the lock functions only if they have + been registered. The reason for the complicated lock macro is to + ensure that the stored error message from the last error is not + accidentally erased if the current function doesn't generate an + error of its own. */ +#define LT_DLMUTEX_LOCK() LT_STMT_START { \ + if (lt_dlmutex_lock_func) (*lt_dlmutex_lock_func)(); \ + } LT_STMT_END +#define LT_DLMUTEX_UNLOCK() LT_STMT_START { \ + if (lt_dlmutex_unlock_func) (*lt_dlmutex_unlock_func)();\ + } LT_STMT_END +#define LT_DLMUTEX_SETERROR(errormsg) LT_STMT_START { \ + if (lt_dlmutex_seterror_func) \ + (*lt_dlmutex_seterror_func) (errormsg); \ + else lt_dllast_error = (errormsg); } LT_STMT_END +#define LT_DLMUTEX_GETERROR(errormsg) LT_STMT_START { \ + if (lt_dlmutex_seterror_func) \ + (errormsg) = (*lt_dlmutex_geterror_func) (); \ + else (errormsg) = lt_dllast_error; } LT_STMT_END + +/* The mutex functions stored here are global, and are necessarily the + same for all threads that wish to share access to libltdl. */ +static lt_dlmutex_lock *lt_dlmutex_lock_func = 0; +static lt_dlmutex_unlock *lt_dlmutex_unlock_func = 0; +static lt_dlmutex_seterror *lt_dlmutex_seterror_func = 0; +static lt_dlmutex_geterror *lt_dlmutex_geterror_func = 0; +static const char *lt_dllast_error = 0; + + +/* Either set or reset the mutex functions. Either all the arguments must + be valid functions, or else all can be NULL to turn off locking entirely. + The registered functions should be manipulating a static global lock + from the lock() and unlock() callbacks, which needs to be reentrant. */ +int +lt_dlmutex_register (lock, unlock, seterror, geterror) + lt_dlmutex_lock *lock; + lt_dlmutex_unlock *unlock; + lt_dlmutex_seterror *seterror; + lt_dlmutex_geterror *geterror; +{ + lt_dlmutex_unlock *old_unlock = unlock; + int errors = 0; + + /* Lock using the old lock() callback, if any. */ + LT_DLMUTEX_LOCK (); + + if ((lock && unlock && seterror && geterror) + || !(lock || unlock || seterror || geterror)) + { + lt_dlmutex_lock_func = lock; + lt_dlmutex_unlock_func = unlock; + lt_dlmutex_geterror_func = geterror; + } + else + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_MUTEX_ARGS)); + ++errors; + } + + /* Use the old unlock() callback we saved earlier, if any. Otherwise + record any errors using internal storage. */ + if (old_unlock) + (*old_unlock) (); + + /* Return the number of errors encountered during the execution of + this function. */ + return errors; +} + + + + +/* --- ERROR HANDLING --- */ + + +static const char **user_error_strings = 0; +static int errorcount = LT_ERROR_MAX; + +int +lt_dladderror (diagnostic) + const char *diagnostic; +{ + int errindex = 0; + int result = -1; + const char **temp = (const char **) 0; + + assert (diagnostic); + + LT_DLMUTEX_LOCK (); + + errindex = errorcount - LT_ERROR_MAX; + temp = LT_EREALLOC (const char *, user_error_strings, 1 + errindex); + if (temp) + { + user_error_strings = temp; + user_error_strings[errindex] = diagnostic; + result = errorcount++; + } + + LT_DLMUTEX_UNLOCK (); + + return result; +} + +int +lt_dlseterror (errindex) + int errindex; +{ + int errors = 0; + + LT_DLMUTEX_LOCK (); + + if (errindex >= errorcount || errindex < 0) + { + /* Ack! Error setting the error message! */ + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_ERRORCODE)); + ++errors; + } + else if (errindex < LT_ERROR_MAX) + { + /* No error setting the error message! */ + LT_DLMUTEX_SETERROR (lt_dlerror_strings[errindex]); + } + else + { + /* No error setting the error message! */ + LT_DLMUTEX_SETERROR (user_error_strings[errindex - LT_ERROR_MAX]); + } + + LT_DLMUTEX_UNLOCK (); + + return errors; +} + +static lt_ptr +lt_emalloc (size) + size_t size; +{ + lt_ptr mem = lt_dlmalloc (size); + if (size && !mem) + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY)); + return mem; +} + +static lt_ptr +lt_erealloc (addr, size) + lt_ptr addr; + size_t size; +{ + lt_ptr mem = lt_dlrealloc (addr, size); + if (size && !mem) + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY)); + return mem; +} + +static char * +lt_estrdup (str) + const char *str; +{ + char *copy = strdup (str); + if (LT_STRLEN (str) && !copy) + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY)); + return copy; +} + + + + +/* --- DLOPEN() INTERFACE LOADER --- */ + + +#if HAVE_LIBDL + +/* dynamic linking with dlopen/dlsym */ + +#if HAVE_DLFCN_H +# include +#endif + +#if HAVE_SYS_DL_H +# include +#endif + +#ifdef RTLD_GLOBAL +# define LT_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_GLOBAL DL_GLOBAL +# endif +#endif /* !RTLD_GLOBAL */ +#ifndef LT_GLOBAL +# define LT_GLOBAL 0 +#endif /* !LT_GLOBAL */ + +/* We may have to define LT_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_LAZY_OR_NOW DL_LAZY +# endif +# endif /* !RTLD_LAZY */ +#endif +#ifndef LT_LAZY_OR_NOW +# ifdef RTLD_NOW +# define LT_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_LAZY_OR_NOW DL_NOW +# endif +# endif /* !RTLD_NOW */ +#endif +#ifndef LT_LAZY_OR_NOW +# define LT_LAZY_OR_NOW 0 +#endif /* !LT_LAZY_OR_NOW */ + +#if HAVE_DLERROR +# define DLERROR(arg) dlerror () +#else +# define DLERROR(arg) LT_DLSTRERROR (arg) +#endif + +static lt_module +sys_dl_open (loader_data, filename) + lt_user_data loader_data; + const char *filename; +{ + lt_module module = dlopen (filename, LT_GLOBAL | LT_LAZY_OR_NOW); + + if (!module) + { + LT_DLMUTEX_SETERROR (DLERROR (CANNOT_OPEN)); + } + + return module; +} + +static int +sys_dl_close (loader_data, module) + lt_user_data loader_data; + lt_module module; +{ + int errors = 0; + + if (dlclose (module) != 0) + { + LT_DLMUTEX_SETERROR (DLERROR (CANNOT_CLOSE)); + ++errors; + } + + return errors; +} + +static lt_ptr +sys_dl_sym (loader_data, module, symbol) + lt_user_data loader_data; + lt_module module; + const char *symbol; +{ + lt_ptr address = dlsym (module, symbol); + + if (!address) + { + LT_DLMUTEX_SETERROR (DLERROR (SYMBOL_NOT_FOUND)); + } + + return address; +} + +static struct lt_user_dlloader sys_dl = + { +# ifdef NEED_USCORE + "_", +# else + 0, +# endif + sys_dl_open, sys_dl_close, sys_dl_sym, 0, 0 }; + + +#endif /* HAVE_LIBDL */ + + + +/* --- SHL_LOAD() INTERFACE LOADER --- */ + +#if HAVE_SHL_LOAD + +/* dynamic linking with shl_load (HP-UX) (comments from gmodule) */ + +#ifdef HAVE_DL_H +# include +#endif + +/* some flags are missing on some systems, so we provide + * harmless defaults. + * + * Mandatory: + * BIND_IMMEDIATE - Resolve symbol references when the library is loaded. + * BIND_DEFERRED - Delay code symbol resolution until actual reference. + * + * Optionally: + * BIND_FIRST - Place the library at the head of the symbol search + * order. + * BIND_NONFATAL - The default BIND_IMMEDIATE behavior is to treat all + * unsatisfied symbols as fatal. This flag allows + * binding of unsatisfied code symbols to be deferred + * until use. + * [Perl: For certain libraries, like DCE, deferred + * binding often causes run time problems. Adding + * BIND_NONFATAL to BIND_IMMEDIATE still allows + * unresolved references in situations like this.] + * BIND_NOSTART - Do not call the initializer for the shared library + * when the library is loaded, nor on a future call to + * shl_unload(). + * BIND_VERBOSE - Print verbose messages concerning possible + * unsatisfied symbols. + * + * hp9000s700/hp9000s800: + * BIND_RESTRICTED - Restrict symbols visible by the library to those + * present at library load time. + * DYNAMIC_PATH - Allow the loader to dynamically search for the + * library specified by the path argument. + */ + +#ifndef DYNAMIC_PATH +# define DYNAMIC_PATH 0 +#endif +#ifndef BIND_RESTRICTED +# define BIND_RESTRICTED 0 +#endif + +#define LT_BIND_FLAGS (BIND_IMMEDIATE | BIND_NONFATAL | DYNAMIC_PATH) + +static lt_module +sys_shl_open (loader_data, filename) + lt_user_data loader_data; + const char *filename; +{ + static shl_t self = (shl_t) 0; + lt_module module = shl_load (filename, LT_BIND_FLAGS, 0L); + + /* Since searching for a symbol against a NULL module handle will also + look in everything else that was already loaded and exported with + the -E compiler flag, we always cache a handle saved before any + modules are loaded. */ + if (!self) + { + lt_ptr address; + shl_findsym (&self, "main", TYPE_UNDEFINED, &address); + } + + if (!filename) + { + module = self; + } + else + { + module = shl_load (filename, LT_BIND_FLAGS, 0L); + + if (!module) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN)); + } + } + + return module; +} + +static int +sys_shl_close (loader_data, module) + lt_user_data loader_data; + lt_module module; +{ + int errors = 0; + + if (module && (shl_unload ((shl_t) (module)) != 0)) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_CLOSE)); + ++errors; + } + + return errors; +} + +static lt_ptr +sys_shl_sym (loader_data, module, symbol) + lt_user_data loader_data; + lt_module module; + const char *symbol; +{ + lt_ptr address = 0; + + /* sys_shl_open should never return a NULL module handle */ + if (module == (lt_module) 0) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE)); + } + else if (!shl_findsym((shl_t*) &module, symbol, TYPE_UNDEFINED, &address)) + { + if (!address) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND)); + } + } + + return address; +} + +static struct lt_user_dlloader sys_shl = { + 0, sys_shl_open, sys_shl_close, sys_shl_sym, 0, 0 +}; + +#endif /* HAVE_SHL_LOAD */ + + + + +/* --- LOADLIBRARY() INTERFACE LOADER --- */ + +#ifdef __WINDOWS__ + +/* dynamic linking for Win32 */ + +#include + +/* Forward declaration; required to implement handle search below. */ +static lt_dlhandle handles; + +static lt_module +sys_wll_open (loader_data, filename) + lt_user_data loader_data; + const char *filename; +{ + lt_dlhandle cur; + lt_module module = 0; + const char *errormsg = 0; + char *searchname = 0; + char *ext; + char self_name_buf[MAX_PATH]; + + if (!filename) + { + /* Get the name of main module */ + *self_name_buf = 0; + GetModuleFileName (NULL, self_name_buf, sizeof (self_name_buf)); + filename = ext = self_name_buf; + } + else + { + ext = strrchr (filename, '.'); + } + + if (ext) + { + /* FILENAME already has an extension. */ + searchname = lt_estrdup (filename); + } + else + { + /* Append a `.' to stop Windows from adding an + implicit `.dll' extension. */ + searchname = LT_EMALLOC (char, 2+ LT_STRLEN (filename)); + if (searchname) + sprintf (searchname, "%s.", filename); + } + if (!searchname) + return 0; + + { + /* Silence dialog from LoadLibrary on some failures. + No way to get the error mode, but to set it, + so set it twice to preserve any previous flags. */ + UINT errormode = SetErrorMode(SEM_FAILCRITICALERRORS); + SetErrorMode(errormode | SEM_FAILCRITICALERRORS); + +#if defined(__CYGWIN__) + { + char wpath[MAX_PATH]; + cygwin_conv_to_full_win32_path (searchname, wpath); + module = LoadLibrary (wpath); + } +#else + module = LoadLibrary (searchname); +#endif + + /* Restore the error mode. */ + SetErrorMode(errormode); + } + + LT_DLFREE (searchname); + + /* libltdl expects this function to fail if it is unable + to physically load the library. Sadly, LoadLibrary + will search the loaded libraries for a match and return + one of them if the path search load fails. + + We check whether LoadLibrary is returning a handle to + an already loaded module, and simulate failure if we + find one. */ + LT_DLMUTEX_LOCK (); + cur = handles; + while (cur) + { + if (!cur->module) + { + cur = 0; + break; + } + + if (cur->module == module) + { + break; + } + + cur = cur->next; + } + LT_DLMUTEX_UNLOCK (); + + if (cur || !module) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN)); + module = 0; + } + + return module; +} + +static int +sys_wll_close (loader_data, module) + lt_user_data loader_data; + lt_module module; +{ + int errors = 0; + + if (FreeLibrary(module) == 0) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_CLOSE)); + ++errors; + } + + return errors; +} + +static lt_ptr +sys_wll_sym (loader_data, module, symbol) + lt_user_data loader_data; + lt_module module; + const char *symbol; +{ + lt_ptr address = GetProcAddress (module, symbol); + + if (!address) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND)); + } + + return address; +} + +static struct lt_user_dlloader sys_wll = { + 0, sys_wll_open, sys_wll_close, sys_wll_sym, 0, 0 +}; + +#endif /* __WINDOWS__ */ + + + + +/* --- LOAD_ADD_ON() INTERFACE LOADER --- */ + + +#ifdef __BEOS__ + +/* dynamic linking for BeOS */ + +#include + +static lt_module +sys_bedl_open (loader_data, filename) + lt_user_data loader_data; + const char *filename; +{ + image_id image = 0; + + if (filename) + { + image = load_add_on (filename); + } + else + { + image_info info; + int32 cookie = 0; + if (get_next_image_info (0, &cookie, &info) == B_OK) + image = load_add_on (info.name); + } + + if (image <= 0) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN)); + image = 0; + } + + return (lt_module) image; +} + +static int +sys_bedl_close (loader_data, module) + lt_user_data loader_data; + lt_module module; +{ + int errors = 0; + + if (unload_add_on ((image_id) module) != B_OK) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_CLOSE)); + ++errors; + } + + return errors; +} + +static lt_ptr +sys_bedl_sym (loader_data, module, symbol) + lt_user_data loader_data; + lt_module module; + const char *symbol; +{ + lt_ptr address = 0; + image_id image = (image_id) module; + + if (get_image_symbol (image, symbol, B_SYMBOL_TYPE_ANY, address) != B_OK) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND)); + address = 0; + } + + return address; +} + +static struct lt_user_dlloader sys_bedl = { + 0, sys_bedl_open, sys_bedl_close, sys_bedl_sym, 0, 0 +}; + +#endif /* __BEOS__ */ + + + + +/* --- DLD_LINK() INTERFACE LOADER --- */ + + +#if HAVE_DLD + +/* dynamic linking with dld */ + +#if HAVE_DLD_H +#include +#endif + +static lt_module +sys_dld_open (loader_data, filename) + lt_user_data loader_data; + const char *filename; +{ + lt_module module = strdup (filename); + + if (dld_link (filename) != 0) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN)); + LT_DLFREE (module); + module = 0; + } + + return module; +} + +static int +sys_dld_close (loader_data, module) + lt_user_data loader_data; + lt_module module; +{ + int errors = 0; + + if (dld_unlink_by_file ((char*)(module), 1) != 0) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CANNOT_CLOSE)); + ++errors; + } + else + { + LT_DLFREE (module); + } + + return errors; +} + +static lt_ptr +sys_dld_sym (loader_data, module, symbol) + lt_user_data loader_data; + lt_module module; + const char *symbol; +{ + lt_ptr address = dld_get_func (symbol); + + if (!address) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND)); + } + + return address; +} + +static struct lt_user_dlloader sys_dld = { + 0, sys_dld_open, sys_dld_close, sys_dld_sym, 0, 0 +}; + +#endif /* HAVE_DLD */ + +/* --- DYLD() MACOSX/DARWIN INTERFACE LOADER --- */ +#if HAVE_DYLD + + +#if HAVE_MACH_O_DYLD_H +#if !defined(__APPLE_CC__) && !defined(__MWERKS__) && !defined(__private_extern__) +/* Is this correct? Does it still function properly? */ +#define __private_extern__ extern +#endif +# include +#endif +#include + +/* We have to put some stuff here that isn't in older dyld.h files */ +#ifndef ENUM_DYLD_BOOL +# define ENUM_DYLD_BOOL +# undef FALSE +# undef TRUE + enum DYLD_BOOL { + FALSE, + TRUE + }; +#endif +#ifndef LC_REQ_DYLD +# define LC_REQ_DYLD 0x80000000 +#endif +#ifndef LC_LOAD_WEAK_DYLIB +# define LC_LOAD_WEAK_DYLIB (0x18 | LC_REQ_DYLD) +#endif +static const struct mach_header * (*ltdl_NSAddImage)(const char *image_name, unsigned long options) = 0; +static NSSymbol (*ltdl_NSLookupSymbolInImage)(const struct mach_header *image,const char *symbolName, unsigned long options) = 0; +static enum DYLD_BOOL (*ltdl_NSIsSymbolNameDefinedInImage)(const struct mach_header *image, const char *symbolName) = 0; +static enum DYLD_BOOL (*ltdl_NSMakePrivateModulePublic)(NSModule module) = 0; + +#ifndef NSADDIMAGE_OPTION_NONE +#define NSADDIMAGE_OPTION_NONE 0x0 +#endif +#ifndef NSADDIMAGE_OPTION_RETURN_ON_ERROR +#define NSADDIMAGE_OPTION_RETURN_ON_ERROR 0x1 +#endif +#ifndef NSADDIMAGE_OPTION_WITH_SEARCHING +#define NSADDIMAGE_OPTION_WITH_SEARCHING 0x2 +#endif +#ifndef NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED +#define NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED 0x4 +#endif +#ifndef NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME +#define NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME 0x8 +#endif +#ifndef NSLOOKUPSYMBOLINIMAGE_OPTION_BIND +#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND 0x0 +#endif +#ifndef NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW +#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW 0x1 +#endif +#ifndef NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY +#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY 0x2 +#endif +#ifndef NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR +#define NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR 0x4 +#endif + + +static const char * +lt_int_dyld_error(othererror) + char* othererror; +{ +/* return the dyld error string, or the passed in error string if none */ + NSLinkEditErrors ler; + int lerno; + const char *errstr; + const char *file; + NSLinkEditError(&ler,&lerno,&file,&errstr); + if (!errstr || !strlen(errstr)) errstr = othererror; + return errstr; +} + +static const struct mach_header * +lt_int_dyld_get_mach_header_from_nsmodule(module) + NSModule module; +{ +/* There should probably be an apple dyld api for this */ + int i=_dyld_image_count(); + int j; + const char *modname=NSNameOfModule(module); + const struct mach_header *mh=NULL; + if (!modname) return NULL; + for (j = 0; j < i; j++) + { + if (!strcmp(_dyld_get_image_name(j),modname)) + { + mh=_dyld_get_image_header(j); + break; + } + } + return mh; +} + +static const char* lt_int_dyld_lib_install_name(mh) + const struct mach_header *mh; +{ +/* NSAddImage is also used to get the loaded image, but it only works if the lib + is installed, for uninstalled libs we need to check the install_names against + each other. Note that this is still broken if DYLD_IMAGE_SUFFIX is set and a + different lib was loaded as a result +*/ + int j; + struct load_command *lc; + unsigned long offset = sizeof(struct mach_header); + const char* retStr=NULL; + for (j = 0; j < mh->ncmds; j++) + { + lc = (struct load_command*)(((unsigned long)mh) + offset); + if (LC_ID_DYLIB == lc->cmd) + { + retStr=(char*)(((struct dylib_command*)lc)->dylib.name.offset + + (unsigned long)lc); + } + offset += lc->cmdsize; + } + return retStr; +} + +static const struct mach_header * +lt_int_dyld_match_loaded_lib_by_install_name(const char *name) +{ + int i=_dyld_image_count(); + int j; + const struct mach_header *mh=NULL; + const char *id=NULL; + for (j = 0; j < i; j++) + { + id=lt_int_dyld_lib_install_name(_dyld_get_image_header(j)); + if ((id) && (!strcmp(id,name))) + { + mh=_dyld_get_image_header(j); + break; + } + } + return mh; +} + +static NSSymbol +lt_int_dyld_NSlookupSymbolInLinkedLibs(symbol,mh) + const char *symbol; + const struct mach_header *mh; +{ + /* Safe to assume our mh is good */ + int j; + struct load_command *lc; + unsigned long offset = sizeof(struct mach_header); + NSSymbol retSym = 0; + const struct mach_header *mh1; + if ((ltdl_NSLookupSymbolInImage) && NSIsSymbolNameDefined(symbol) ) + { + for (j = 0; j < mh->ncmds; j++) + { + lc = (struct load_command*)(((unsigned long)mh) + offset); + if ((LC_LOAD_DYLIB == lc->cmd) || (LC_LOAD_WEAK_DYLIB == lc->cmd)) + { + mh1=lt_int_dyld_match_loaded_lib_by_install_name((char*)(((struct dylib_command*)lc)->dylib.name.offset + + (unsigned long)lc)); + if (!mh1) + { + /* Maybe NSAddImage can find it */ + mh1=ltdl_NSAddImage((char*)(((struct dylib_command*)lc)->dylib.name.offset + + (unsigned long)lc), + NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED + + NSADDIMAGE_OPTION_WITH_SEARCHING + + NSADDIMAGE_OPTION_RETURN_ON_ERROR ); + } + if (mh1) + { + retSym = ltdl_NSLookupSymbolInImage(mh1, + symbol, + NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW + | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR + ); + if (retSym) break; + } + } + offset += lc->cmdsize; + } + } + return retSym; +} + +static int +sys_dyld_init() +{ + int retCode = 0; + int err = 0; + if (!_dyld_present()) { + retCode=1; + } + else { + err = _dyld_func_lookup("__dyld_NSAddImage",(unsigned long*)<dl_NSAddImage); + err = _dyld_func_lookup("__dyld_NSLookupSymbolInImage",(unsigned long*)<dl_NSLookupSymbolInImage); + err = _dyld_func_lookup("__dyld_NSIsSymbolNameDefinedInImage",(unsigned long*)<dl_NSIsSymbolNameDefinedInImage); + err = _dyld_func_lookup("__dyld_NSMakePrivateModulePublic",(unsigned long*)<dl_NSMakePrivateModulePublic); + } + return retCode; +} + +static lt_module +sys_dyld_open (loader_data, filename) + lt_user_data loader_data; + const char *filename; +{ + lt_module module = 0; + NSObjectFileImage ofi = 0; + NSObjectFileImageReturnCode ofirc; + + if (!filename) + return (lt_module)-1; + ofirc = NSCreateObjectFileImageFromFile(filename, &ofi); + switch (ofirc) + { + case NSObjectFileImageSuccess: + module = NSLinkModule(ofi, filename, + NSLINKMODULE_OPTION_RETURN_ON_ERROR + | NSLINKMODULE_OPTION_PRIVATE + | NSLINKMODULE_OPTION_BINDNOW); + NSDestroyObjectFileImage(ofi); + if (module) + ltdl_NSMakePrivateModulePublic(module); + break; + case NSObjectFileImageInappropriateFile: + if (ltdl_NSIsSymbolNameDefinedInImage && ltdl_NSLookupSymbolInImage) + { + module = (lt_module)ltdl_NSAddImage(filename, NSADDIMAGE_OPTION_RETURN_ON_ERROR); + break; + } + default: + LT_DLMUTEX_SETERROR (lt_int_dyld_error(LT_DLSTRERROR(CANNOT_OPEN))); + return 0; + } + if (!module) LT_DLMUTEX_SETERROR (lt_int_dyld_error(LT_DLSTRERROR(CANNOT_OPEN))); + return module; +} + +static int +sys_dyld_close (loader_data, module) + lt_user_data loader_data; + lt_module module; +{ + int retCode = 0; + int flags = 0; + if (module == (lt_module)-1) return 0; +#ifdef __BIG_ENDIAN__ + if (((struct mach_header *)module)->magic == MH_MAGIC) +#else + if (((struct mach_header *)module)->magic == MH_CIGAM) +#endif + { + LT_DLMUTEX_SETERROR("Can not close a dylib"); + retCode = 1; + } + else + { +#if 1 +/* Currently, if a module contains c++ static destructors and it is unloaded, we + get a segfault in atexit(), due to compiler and dynamic loader differences of + opinion, this works around that. +*/ + if ((const struct section *)NULL != + getsectbynamefromheader(lt_int_dyld_get_mach_header_from_nsmodule(module), + "__DATA","__mod_term_func")) + { + flags += NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED; + } +#endif +#ifdef __ppc__ + flags += NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES; +#endif + if (!NSUnLinkModule(module,flags)) + { + retCode=1; + LT_DLMUTEX_SETERROR (lt_int_dyld_error(LT_DLSTRERROR(CANNOT_CLOSE))); + } + } + + return retCode; +} + +static lt_ptr +sys_dyld_sym (loader_data, module, symbol) + lt_user_data loader_data; + lt_module module; + const char *symbol; +{ + lt_ptr address = 0; + NSSymbol *nssym = 0; + void *unused; + const struct mach_header *mh=NULL; + char saveError[256] = "Symbol not found"; + if (module == (lt_module)-1) + { + _dyld_lookup_and_bind(symbol,(unsigned long*)&address,&unused); + return address; + } +#ifdef __BIG_ENDIAN__ + if (((struct mach_header *)module)->magic == MH_MAGIC) +#else + if (((struct mach_header *)module)->magic == MH_CIGAM) +#endif + { + if (ltdl_NSIsSymbolNameDefinedInImage && ltdl_NSLookupSymbolInImage) + { + mh=module; + if (ltdl_NSIsSymbolNameDefinedInImage((struct mach_header*)module,symbol)) + { + nssym = ltdl_NSLookupSymbolInImage((struct mach_header*)module, + symbol, + NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW + | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR + ); + } + } + + } + else { + nssym = NSLookupSymbolInModule(module, symbol); + } + if (!nssym) + { + strncpy(saveError, lt_int_dyld_error(LT_DLSTRERROR(SYMBOL_NOT_FOUND)), 255); + saveError[255] = 0; + if (!mh) mh=lt_int_dyld_get_mach_header_from_nsmodule(module); + nssym = lt_int_dyld_NSlookupSymbolInLinkedLibs(symbol,mh); + } + if (!nssym) + { + LT_DLMUTEX_SETERROR (saveError); + return NULL; + } + return NSAddressOfSymbol(nssym); +} + +static struct lt_user_dlloader sys_dyld = + { "_", sys_dyld_open, sys_dyld_close, sys_dyld_sym, 0, 0 }; + + +#endif /* HAVE_DYLD */ + + +/* --- DLPREOPEN() INTERFACE LOADER --- */ + + +/* emulate dynamic linking using preloaded_symbols */ + +typedef struct lt_dlsymlists_t +{ + struct lt_dlsymlists_t *next; + const lt_dlsymlist *syms; +} lt_dlsymlists_t; + +static const lt_dlsymlist *default_preloaded_symbols = 0; +static lt_dlsymlists_t *preloaded_symbols = 0; + +static int +presym_init (loader_data) + lt_user_data loader_data; +{ + int errors = 0; + + LT_DLMUTEX_LOCK (); + + preloaded_symbols = 0; + if (default_preloaded_symbols) + { + errors = lt_dlpreload (default_preloaded_symbols); + } + + LT_DLMUTEX_UNLOCK (); + + return errors; +} + +static int +presym_free_symlists () +{ + lt_dlsymlists_t *lists; + + LT_DLMUTEX_LOCK (); + + lists = preloaded_symbols; + while (lists) + { + lt_dlsymlists_t *tmp = lists; + + lists = lists->next; + LT_DLFREE (tmp); + } + preloaded_symbols = 0; + + LT_DLMUTEX_UNLOCK (); + + return 0; +} + +static int +presym_exit (loader_data) + lt_user_data loader_data; +{ + presym_free_symlists (); + return 0; +} + +static int +presym_add_symlist (preloaded) + const lt_dlsymlist *preloaded; +{ + lt_dlsymlists_t *tmp; + lt_dlsymlists_t *lists; + int errors = 0; + + LT_DLMUTEX_LOCK (); + + lists = preloaded_symbols; + while (lists) + { + if (lists->syms == preloaded) + { + goto done; + } + lists = lists->next; + } + + tmp = LT_EMALLOC (lt_dlsymlists_t, 1); + if (tmp) + { + memset (tmp, 0, sizeof(lt_dlsymlists_t)); + tmp->syms = preloaded; + tmp->next = preloaded_symbols; + preloaded_symbols = tmp; + } + else + { + ++errors; + } + + done: + LT_DLMUTEX_UNLOCK (); + return errors; +} + +static lt_module +presym_open (loader_data, filename) + lt_user_data loader_data; + const char *filename; +{ + lt_dlsymlists_t *lists; + lt_module module = (lt_module) 0; + + LT_DLMUTEX_LOCK (); + lists = preloaded_symbols; + + if (!lists) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_SYMBOLS)); + goto done; + } + + /* Can't use NULL as the reflective symbol header, as NULL is + used to mark the end of the entire symbol list. Self-dlpreopened + symbols follow this magic number, chosen to be an unlikely + clash with a real module name. */ + if (!filename) + { + filename = "@PROGRAM@"; + } + + while (lists) + { + const lt_dlsymlist *syms = lists->syms; + + while (syms->name) + { + if (!syms->address && strcmp(syms->name, filename) == 0) + { + module = (lt_module) syms; + goto done; + } + ++syms; + } + + lists = lists->next; + } + + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND)); + + done: + LT_DLMUTEX_UNLOCK (); + return module; +} + +static int +presym_close (loader_data, module) + lt_user_data loader_data; + lt_module module; +{ + /* Just to silence gcc -Wall */ + module = 0; + return 0; +} + +static lt_ptr +presym_sym (loader_data, module, symbol) + lt_user_data loader_data; + lt_module module; + const char *symbol; +{ + lt_dlsymlist *syms = (lt_dlsymlist*) module; + + ++syms; + while (syms->address) + { + if (strcmp(syms->name, symbol) == 0) + { + return syms->address; + } + + ++syms; + } + + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND)); + + return 0; +} + +static struct lt_user_dlloader presym = { + 0, presym_open, presym_close, presym_sym, presym_exit, 0 +}; + + + + + +/* --- DYNAMIC MODULE LOADING --- */ + + +/* The type of a function used at each iteration of foreach_dirinpath(). */ +typedef int foreach_callback_func LT_PARAMS((char *filename, lt_ptr data1, + lt_ptr data2)); + +static int foreach_dirinpath LT_PARAMS((const char *search_path, + const char *base_name, + foreach_callback_func *func, + lt_ptr data1, lt_ptr data2)); + +static int find_file_callback LT_PARAMS((char *filename, lt_ptr data, + lt_ptr ignored)); +static int find_handle_callback LT_PARAMS((char *filename, lt_ptr data, + lt_ptr ignored)); +static int foreachfile_callback LT_PARAMS((char *filename, lt_ptr data1, + lt_ptr data2)); + + +static int canonicalize_path LT_PARAMS((const char *path, + char **pcanonical)); +static int argzize_path LT_PARAMS((const char *path, + char **pargz, + size_t *pargz_len)); +static FILE *find_file LT_PARAMS((const char *search_path, + const char *base_name, + char **pdir)); +static lt_dlhandle *find_handle LT_PARAMS((const char *search_path, + const char *base_name, + lt_dlhandle *handle)); +static int find_module LT_PARAMS((lt_dlhandle *handle, + const char *dir, + const char *libdir, + const char *dlname, + const char *old_name, + int installed)); +static int free_vars LT_PARAMS((char *dlname, char *oldname, + char *libdir, char *deplibs)); +static int load_deplibs LT_PARAMS((lt_dlhandle handle, + char *deplibs)); +static int trim LT_PARAMS((char **dest, + const char *str)); +static int try_dlopen LT_PARAMS((lt_dlhandle *handle, + const char *filename)); +static int tryall_dlopen LT_PARAMS((lt_dlhandle *handle, + const char *filename)); +static int unload_deplibs LT_PARAMS((lt_dlhandle handle)); +static int lt_argz_insert LT_PARAMS((char **pargz, + size_t *pargz_len, + char *before, + const char *entry)); +static int lt_argz_insertinorder LT_PARAMS((char **pargz, + size_t *pargz_len, + const char *entry)); +static int lt_argz_insertdir LT_PARAMS((char **pargz, + size_t *pargz_len, + const char *dirnam, + struct dirent *dp)); +static int lt_dlpath_insertdir LT_PARAMS((char **ppath, + char *before, + const char *dir)); +static int list_files_by_dir LT_PARAMS((const char *dirnam, + char **pargz, + size_t *pargz_len)); +static int file_not_found LT_PARAMS((void)); + +static char *user_search_path= 0; +static lt_dlloader *loaders = 0; +static lt_dlhandle handles = 0; +static int initialized = 0; + +/* Initialize libltdl. */ +int +lt_dlinit () +{ + int errors = 0; + + LT_DLMUTEX_LOCK (); + + /* Initialize only at first call. */ + if (++initialized == 1) + { + handles = 0; + user_search_path = 0; /* empty search path */ + +#if HAVE_LIBDL + errors += lt_dlloader_add (lt_dlloader_next (0), &sys_dl, "dlopen"); +#endif +#if HAVE_SHL_LOAD + errors += lt_dlloader_add (lt_dlloader_next (0), &sys_shl, "dlopen"); +#endif +#ifdef __WINDOWS__ + errors += lt_dlloader_add (lt_dlloader_next (0), &sys_wll, "dlopen"); +#endif +#ifdef __BEOS__ + errors += lt_dlloader_add (lt_dlloader_next (0), &sys_bedl, "dlopen"); +#endif +#if HAVE_DLD + errors += lt_dlloader_add (lt_dlloader_next (0), &sys_dld, "dld"); +#endif +#if HAVE_DYLD + errors += lt_dlloader_add (lt_dlloader_next (0), &sys_dyld, "dyld"); + errors += sys_dyld_init(); +#endif + errors += lt_dlloader_add (lt_dlloader_next (0), &presym, "dlpreload"); + + if (presym_init (presym.dlloader_data)) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INIT_LOADER)); + ++errors; + } + else if (errors != 0) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (DLOPEN_NOT_SUPPORTED)); + ++errors; + } + } + + LT_DLMUTEX_UNLOCK (); + + return errors; +} + +int +lt_dlpreload (preloaded) + const lt_dlsymlist *preloaded; +{ + int errors = 0; + + if (preloaded) + { + errors = presym_add_symlist (preloaded); + } + else + { + presym_free_symlists(); + + LT_DLMUTEX_LOCK (); + if (default_preloaded_symbols) + { + errors = lt_dlpreload (default_preloaded_symbols); + } + LT_DLMUTEX_UNLOCK (); + } + + return errors; +} + +int +lt_dlpreload_default (preloaded) + const lt_dlsymlist *preloaded; +{ + LT_DLMUTEX_LOCK (); + default_preloaded_symbols = preloaded; + LT_DLMUTEX_UNLOCK (); + return 0; +} + +int +lt_dlexit () +{ + /* shut down libltdl */ + lt_dlloader *loader; + int errors = 0; + + LT_DLMUTEX_LOCK (); + loader = loaders; + + if (!initialized) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SHUTDOWN)); + ++errors; + goto done; + } + + /* shut down only at last call. */ + if (--initialized == 0) + { + int level; + + while (handles && LT_DLIS_RESIDENT (handles)) + { + handles = handles->next; + } + + /* close all modules */ + for (level = 1; handles; ++level) + { + lt_dlhandle cur = handles; + int saw_nonresident = 0; + + while (cur) + { + lt_dlhandle tmp = cur; + cur = cur->next; + if (!LT_DLIS_RESIDENT (tmp)) + saw_nonresident = 1; + if (!LT_DLIS_RESIDENT (tmp) && tmp->info.ref_count <= level) + { + if (lt_dlclose (tmp)) + { + ++errors; + } + } + } + /* done if only resident modules are left */ + if (!saw_nonresident) + break; + } + + /* close all loaders */ + while (loader) + { + lt_dlloader *next = loader->next; + lt_user_data data = loader->dlloader_data; + if (loader->dlloader_exit && loader->dlloader_exit (data)) + { + ++errors; + } + + LT_DLMEM_REASSIGN (loader, next); + } + loaders = 0; + } + + done: + LT_DLMUTEX_UNLOCK (); + return errors; +} + +static int +tryall_dlopen (handle, filename) + lt_dlhandle *handle; + const char *filename; +{ + lt_dlhandle cur; + lt_dlloader *loader; + const char *saved_error; + int errors = 0; + + LT_DLMUTEX_GETERROR (saved_error); + LT_DLMUTEX_LOCK (); + + cur = handles; + loader = loaders; + + /* check whether the module was already opened */ + while (cur) + { + /* try to dlopen the program itself? */ + if (!cur->info.filename && !filename) + { + break; + } + + if (cur->info.filename && filename + && strcmp (cur->info.filename, filename) == 0) + { + break; + } + + cur = cur->next; + } + + if (cur) + { + ++cur->info.ref_count; + *handle = cur; + goto done; + } + + cur = *handle; + if (filename) + { + /* Comment out the check of file permissions using access. + This call seems to always return -1 with error EACCES. + */ + /* We need to catch missing file errors early so that + file_not_found() can detect what happened. + if (access (filename, R_OK) != 0) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND)); + ++errors; + goto done; + } */ + + cur->info.filename = lt_estrdup (filename); + if (!cur->info.filename) + { + ++errors; + goto done; + } + } + else + { + cur->info.filename = 0; + } + + while (loader) + { + lt_user_data data = loader->dlloader_data; + + cur->module = loader->module_open (data, filename); + + if (cur->module != 0) + { + break; + } + loader = loader->next; + } + + if (!loader) + { + LT_DLFREE (cur->info.filename); + ++errors; + goto done; + } + + cur->loader = loader; + LT_DLMUTEX_SETERROR (saved_error); + + done: + LT_DLMUTEX_UNLOCK (); + + return errors; +} + +static int +tryall_dlopen_module (handle, prefix, dirname, dlname) + lt_dlhandle *handle; + const char *prefix; + const char *dirname; + const char *dlname; +{ + int error = 0; + char *filename = 0; + size_t filename_len = 0; + size_t dirname_len = LT_STRLEN (dirname); + + assert (handle); + assert (dirname); + assert (dlname); +#ifdef LT_DIRSEP_CHAR + /* Only canonicalized names (i.e. with DIRSEP chars already converted) + should make it into this function: */ + assert (strchr (dirname, LT_DIRSEP_CHAR) == 0); +#endif + + if (dirname_len > 0) + if (dirname[dirname_len -1] == '/') + --dirname_len; + filename_len = dirname_len + 1 + LT_STRLEN (dlname); + + /* Allocate memory, and combine DIRNAME and MODULENAME into it. + The PREFIX (if any) is handled below. */ + filename = LT_EMALLOC (char, dirname_len + 1 + filename_len + 1); + if (!filename) + return 1; + + sprintf (filename, "%.*s/%s", (int) dirname_len, dirname, dlname); + + /* Now that we have combined DIRNAME and MODULENAME, if there is + also a PREFIX to contend with, simply recurse with the arguments + shuffled. Otherwise, attempt to open FILENAME as a module. */ + if (prefix) + { + error += tryall_dlopen_module (handle, + (const char *) 0, prefix, filename); + } + else if (tryall_dlopen (handle, filename) != 0) + { + ++error; + } + + LT_DLFREE (filename); + return error; +} + +static int +find_module (handle, dir, libdir, dlname, old_name, installed) + lt_dlhandle *handle; + const char *dir; + const char *libdir; + const char *dlname; + const char *old_name; + int installed; +{ + /* Try to open the old library first; if it was dlpreopened, + we want the preopened version of it, even if a dlopenable + module is available. */ + if (old_name && tryall_dlopen (handle, old_name) == 0) + { + return 0; + } + + /* Try to open the dynamic library. */ + if (dlname) + { + /* try to open the installed module */ + if (installed && libdir) + { + if (tryall_dlopen_module (handle, + (const char *) 0, libdir, dlname) == 0) + return 0; + } + + /* try to open the not-installed module */ + if (!installed) + { + if (tryall_dlopen_module (handle, dir, objdir, dlname) == 0) + return 0; + } + + /* maybe it was moved to another directory */ + { + if (dir && (tryall_dlopen_module (handle, + (const char *) 0, dir, dlname) == 0)) + return 0; + } + } + + return 1; +} + + +static int +canonicalize_path (path, pcanonical) + const char *path; + char **pcanonical; +{ + char *canonical = 0; + + assert (path && *path); + assert (pcanonical); + + canonical = LT_EMALLOC (char, 1+ LT_STRLEN (path)); + if (!canonical) + return 1; + + { + size_t dest = 0; + size_t src; + for (src = 0; path[src] != LT_EOS_CHAR; ++src) + { + /* Path separators are not copied to the beginning or end of + the destination, or if another separator would follow + immediately. */ + if (path[src] == LT_PATHSEP_CHAR) + { + if ((dest == 0) + || (path[1+ src] == LT_PATHSEP_CHAR) + || (path[1+ src] == LT_EOS_CHAR)) + continue; + } + + /* Anything other than a directory separator is copied verbatim. */ + if ((path[src] != '/') +#ifdef LT_DIRSEP_CHAR + && (path[src] != LT_DIRSEP_CHAR) +#endif + ) + { + canonical[dest++] = path[src]; + } + /* Directory separators are converted and copied only if they are + not at the end of a path -- i.e. before a path separator or + NULL terminator. */ + else if ((path[1+ src] != LT_PATHSEP_CHAR) + && (path[1+ src] != LT_EOS_CHAR) +#ifdef LT_DIRSEP_CHAR + && (path[1+ src] != LT_DIRSEP_CHAR) +#endif + && (path[1+ src] != '/')) + { + canonical[dest++] = '/'; + } + } + + /* Add an end-of-string marker at the end. */ + canonical[dest] = LT_EOS_CHAR; + } + + /* Assign new value. */ + *pcanonical = canonical; + + return 0; +} + +static int +argzize_path (path, pargz, pargz_len) + const char *path; + char **pargz; + size_t *pargz_len; +{ + error_t error; + + assert (path); + assert (pargz); + assert (pargz_len); + + if ((error = argz_create_sep (path, LT_PATHSEP_CHAR, pargz, pargz_len))) + { + switch (error) + { + case ENOMEM: + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY)); + break; + default: + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (UNKNOWN)); + break; + } + + return 1; + } + + return 0; +} + +/* Repeatedly call FUNC with each LT_PATHSEP_CHAR delimited element + of SEARCH_PATH and references to DATA1 and DATA2, until FUNC returns + non-zero or all elements are exhausted. If BASE_NAME is non-NULL, + it is appended to each SEARCH_PATH element before FUNC is called. */ +static int +foreach_dirinpath (search_path, base_name, func, data1, data2) + const char *search_path; + const char *base_name; + foreach_callback_func *func; + lt_ptr data1; + lt_ptr data2; +{ + int result = 0; + int filenamesize = 0; + size_t lenbase = LT_STRLEN (base_name); + size_t argz_len = 0; + char *argz = 0; + char *filename = 0; + char *canonical = 0; + + LT_DLMUTEX_LOCK (); + + if (!search_path || !*search_path) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND)); + goto cleanup; + } + + if (canonicalize_path (search_path, &canonical) != 0) + goto cleanup; + + if (argzize_path (canonical, &argz, &argz_len) != 0) + goto cleanup; + + { + char *dir_name = 0; + while ((dir_name = argz_next (argz, argz_len, dir_name))) + { + size_t lendir = LT_STRLEN (dir_name); + + if (lendir +1 +lenbase >= filenamesize) + { + LT_DLFREE (filename); + filenamesize = lendir +1 +lenbase +1; /* "/d" + '/' + "f" + '\0' */ + filename = LT_EMALLOC (char, filenamesize); + if (!filename) + goto cleanup; + } + + assert (filenamesize > lendir); + strcpy (filename, dir_name); + + if (base_name && *base_name) + { + if (filename[lendir -1] != '/') + filename[lendir++] = '/'; + strcpy (filename +lendir, base_name); + } + + if ((result = (*func) (filename, data1, data2))) + { + break; + } + } + } + + cleanup: + LT_DLFREE (argz); + LT_DLFREE (canonical); + LT_DLFREE (filename); + + LT_DLMUTEX_UNLOCK (); + + return result; +} + +/* If FILEPATH can be opened, store the name of the directory component + in DATA1, and the opened FILE* structure address in DATA2. Otherwise + DATA1 is unchanged, but DATA2 is set to a pointer to NULL. */ +static int +find_file_callback (filename, data1, data2) + char *filename; + lt_ptr data1; + lt_ptr data2; +{ + char **pdir = (char **) data1; + FILE **pfile = (FILE **) data2; + int is_done = 0; + + assert (filename && *filename); + assert (pdir); + assert (pfile); + + if ((*pfile = fopen (filename, LT_READTEXT_MODE))) + { + char *dirend = strrchr (filename, '/'); + + if (dirend > filename) + *dirend = LT_EOS_CHAR; + + LT_DLFREE (*pdir); + *pdir = lt_estrdup (filename); + is_done = (*pdir == 0) ? -1 : 1; + } + + return is_done; +} + +static FILE * +find_file (search_path, base_name, pdir) + const char *search_path; + const char *base_name; + char **pdir; +{ + FILE *file = 0; + + foreach_dirinpath (search_path, base_name, find_file_callback, pdir, &file); + + return file; +} + +static int +find_handle_callback (filename, data, ignored) + char *filename; + lt_ptr data; + lt_ptr ignored; +{ + lt_dlhandle *handle = (lt_dlhandle *) data; + int notfound = access (filename, R_OK); + + /* Bail out if file cannot be read... */ + if (notfound) + return 0; + + /* Try to dlopen the file, but do not continue searching in any + case. */ + if (tryall_dlopen (handle, filename) != 0) + *handle = 0; + + return 1; +} + +/* If HANDLE was found return it, otherwise return 0. If HANDLE was + found but could not be opened, *HANDLE will be set to 0. */ +static lt_dlhandle * +find_handle (search_path, base_name, handle) + const char *search_path; + const char *base_name; + lt_dlhandle *handle; +{ + if (!search_path) + return 0; + + if (!foreach_dirinpath (search_path, base_name, find_handle_callback, + handle, 0)) + return 0; + + return handle; +} + +static int +load_deplibs (handle, deplibs) + lt_dlhandle handle; + char *deplibs; +{ +#if LTDL_DLOPEN_DEPLIBS + char *p, *save_search_path = 0; + int depcount = 0; + int i; + char **names = 0; +#endif + int errors = 0; + + handle->depcount = 0; + +#if LTDL_DLOPEN_DEPLIBS + if (!deplibs) + { + return errors; + } + ++errors; + + LT_DLMUTEX_LOCK (); + if (user_search_path) + { + save_search_path = lt_estrdup (user_search_path); + if (!save_search_path) + goto cleanup; + } + + /* extract search paths and count deplibs */ + p = deplibs; + while (*p) + { + if (!isspace ((int) *p)) + { + char *end = p+1; + while (*end && !isspace((int) *end)) + { + ++end; + } + + if (strncmp(p, "-L", 2) == 0 || strncmp(p, "-R", 2) == 0) + { + char save = *end; + *end = 0; /* set a temporary string terminator */ + if (lt_dladdsearchdir(p+2)) + { + goto cleanup; + } + *end = save; + } + else + { + ++depcount; + } + + p = end; + } + else + { + ++p; + } + } + + if (!depcount) + { + errors = 0; + goto cleanup; + } + + names = LT_EMALLOC (char *, depcount * sizeof (char*)); + if (!names) + goto cleanup; + + /* now only extract the actual deplibs */ + depcount = 0; + p = deplibs; + while (*p) + { + if (isspace ((int) *p)) + { + ++p; + } + else + { + char *end = p+1; + while (*end && !isspace ((int) *end)) + { + ++end; + } + + if (strncmp(p, "-L", 2) != 0 && strncmp(p, "-R", 2) != 0) + { + char *name; + char save = *end; + *end = 0; /* set a temporary string terminator */ + if (strncmp(p, "-l", 2) == 0) + { + size_t name_len = 3+ /* "lib" */ LT_STRLEN (p + 2); + name = LT_EMALLOC (char, 1+ name_len); + if (name) + sprintf (name, "lib%s", p+2); + } + else + name = lt_estrdup(p); + + if (!name) + goto cleanup_names; + + names[depcount++] = name; + *end = save; + } + p = end; + } + } + + /* load the deplibs (in reverse order) + At this stage, don't worry if the deplibs do not load correctly, + they may already be statically linked into the loading application + for instance. There will be a more enlightening error message + later on if the loaded module cannot resolve all of its symbols. */ + if (depcount) + { + int j = 0; + + handle->deplibs = (lt_dlhandle*) LT_EMALLOC (lt_dlhandle *, depcount); + if (!handle->deplibs) + goto cleanup; + + for (i = 0; i < depcount; ++i) + { + handle->deplibs[j] = lt_dlopenext(names[depcount-1-i]); + if (handle->deplibs[j]) + { + ++j; + } + } + + handle->depcount = j; /* Number of successfully loaded deplibs */ + errors = 0; + } + + cleanup_names: + for (i = 0; i < depcount; ++i) + { + LT_DLFREE (names[i]); + } + + cleanup: + LT_DLFREE (names); + /* restore the old search path */ + if (user_search_path) { + LT_DLFREE (user_search_path); + user_search_path = save_search_path; + } + LT_DLMUTEX_UNLOCK (); + +#endif + + return errors; +} + +static int +unload_deplibs (handle) + lt_dlhandle handle; +{ + int i; + int errors = 0; + + if (handle->depcount) + { + for (i = 0; i < handle->depcount; ++i) + { + if (!LT_DLIS_RESIDENT (handle->deplibs[i])) + { + errors += lt_dlclose (handle->deplibs[i]); + } + } + } + + return errors; +} + +static int +trim (dest, str) + char **dest; + const char *str; +{ + /* remove the leading and trailing "'" from str + and store the result in dest */ + const char *end = strrchr (str, '\''); + size_t len = LT_STRLEN (str); + char *tmp; + + LT_DLFREE (*dest); + + if (!end) + return 1; + + if (len > 3 && str[0] == '\'') + { + tmp = LT_EMALLOC (char, end - str); + if (!tmp) + return 1; + + strncpy(tmp, &str[1], (end - str) - 1); + tmp[len-3] = LT_EOS_CHAR; + *dest = tmp; + } + else + { + *dest = 0; + } + + return 0; +} + +static int +free_vars (dlname, oldname, libdir, deplibs) + char *dlname; + char *oldname; + char *libdir; + char *deplibs; +{ + LT_DLFREE (dlname); + LT_DLFREE (oldname); + LT_DLFREE (libdir); + LT_DLFREE (deplibs); + + return 0; +} + +static int +try_dlopen (phandle, filename) + lt_dlhandle *phandle; + const char *filename; +{ + const char * ext = 0; + const char * saved_error = 0; + char * canonical = 0; + char * base_name = 0; + char * dir = 0; + char * name = 0; + int errors = 0; + lt_dlhandle newhandle; + + assert (phandle); + assert (*phandle == 0); + + LT_DLMUTEX_GETERROR (saved_error); + + /* dlopen self? */ + if (!filename) + { + *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1); + if (*phandle == 0) + return 1; + + memset (*phandle, 0, sizeof(struct lt_dlhandle_struct)); + newhandle = *phandle; + + /* lt_dlclose()ing yourself is very bad! Disallow it. */ + LT_DLSET_FLAG (*phandle, LT_DLRESIDENT_FLAG); + + if (tryall_dlopen (&newhandle, 0) != 0) + { + LT_DLFREE (*phandle); + return 1; + } + + goto register_handle; + } + + assert (filename && *filename); + + /* Doing this immediately allows internal functions to safely + assume only canonicalized paths are passed. */ + if (canonicalize_path (filename, &canonical) != 0) + { + ++errors; + goto cleanup; + } + + /* If the canonical module name is a path (relative or absolute) + then split it into a directory part and a name part. */ + base_name = strrchr (canonical, '/'); + if (base_name) + { + size_t dirlen = (1+ base_name) - canonical; + + dir = LT_EMALLOC (char, 1+ dirlen); + if (!dir) + { + ++errors; + goto cleanup; + } + + strncpy (dir, canonical, dirlen); + dir[dirlen] = LT_EOS_CHAR; + + ++base_name; + } + else + base_name = canonical; + + assert (base_name && *base_name); + + /* Check whether we are opening a libtool module (.la extension). */ + ext = strrchr (base_name, '.'); + if (ext && strcmp (ext, archive_ext) == 0) + { + /* this seems to be a libtool module */ + FILE * file = 0; + char * dlname = 0; + char * old_name = 0; + char * libdir = 0; + char * deplibs = 0; + char * line = 0; + size_t line_len; + + /* if we can't find the installed flag, it is probably an + installed libtool archive, produced with an old version + of libtool */ + int installed = 1; + + /* extract the module name from the file name */ + name = LT_EMALLOC (char, ext - base_name + 1); + if (!name) + { + ++errors; + goto cleanup; + } + + /* canonicalize the module name */ + { + size_t i; + for (i = 0; i < ext - base_name; ++i) + { + if (isalnum ((int)(base_name[i]))) + { + name[i] = base_name[i]; + } + else + { + name[i] = '_'; + } + } + name[ext - base_name] = LT_EOS_CHAR; + } + + /* Now try to open the .la file. If there is no directory name + component, try to find it first in user_search_path and then other + prescribed paths. Otherwise (or in any case if the module was not + yet found) try opening just the module name as passed. */ + if (!dir) + { + const char *search_path; + + LT_DLMUTEX_LOCK (); + search_path = user_search_path; + if (search_path) + file = find_file (user_search_path, base_name, &dir); + LT_DLMUTEX_UNLOCK (); + + if (!file) + { + search_path = getenv (LTDL_SEARCHPATH_VAR); + if (search_path) + file = find_file (search_path, base_name, &dir); + } + +#ifdef LTDL_SHLIBPATH_VAR + if (!file) + { + search_path = getenv (LTDL_SHLIBPATH_VAR); + if (search_path) + file = find_file (search_path, base_name, &dir); + } +#endif +#ifdef LTDL_SYSSEARCHPATH + if (!file && sys_search_path) + { + file = find_file (sys_search_path, base_name, &dir); + } +#endif + } + if (!file) + { + file = fopen (filename, LT_READTEXT_MODE); + } + + /* If we didn't find the file by now, it really isn't there. Set + the status flag, and bail out. */ + if (!file) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND)); + ++errors; + goto cleanup; + } + + line_len = LT_FILENAME_MAX; + line = LT_EMALLOC (char, line_len); + if (!line) + { + fclose (file); + ++errors; + goto cleanup; + } + + /* read the .la file */ + while (!feof (file)) + { + if (!fgets (line, (int) line_len, file)) + { + break; + } + + /* Handle the case where we occasionally need to read a line + that is longer than the initial buffer size. */ + while ((line[LT_STRLEN(line) -1] != '\n') && (!feof (file))) + { + line = LT_DLREALLOC (char, line, line_len *2); + if (!fgets (&line[line_len -1], (int) line_len +1, file)) + { + break; + } + line_len *= 2; + } + + if (line[0] == '\n' || line[0] == '#') + { + continue; + } + +#undef STR_DLNAME +#define STR_DLNAME "dlname=" + if (strncmp (line, STR_DLNAME, sizeof (STR_DLNAME) - 1) == 0) + { + errors += trim (&dlname, &line[sizeof (STR_DLNAME) - 1]); + } + +#undef STR_OLD_LIBRARY +#define STR_OLD_LIBRARY "old_library=" + else if (strncmp (line, STR_OLD_LIBRARY, + sizeof (STR_OLD_LIBRARY) - 1) == 0) + { + errors += trim (&old_name, &line[sizeof (STR_OLD_LIBRARY) - 1]); + } +#undef STR_LIBDIR +#define STR_LIBDIR "libdir=" + else if (strncmp (line, STR_LIBDIR, sizeof (STR_LIBDIR) - 1) == 0) + { + errors += trim (&libdir, &line[sizeof(STR_LIBDIR) - 1]); + } + +#undef STR_DL_DEPLIBS +#define STR_DL_DEPLIBS "dependency_libs=" + else if (strncmp (line, STR_DL_DEPLIBS, + sizeof (STR_DL_DEPLIBS) - 1) == 0) + { + errors += trim (&deplibs, &line[sizeof (STR_DL_DEPLIBS) - 1]); + } + else if (strcmp (line, "installed=yes\n") == 0) + { + installed = 1; + } + else if (strcmp (line, "installed=no\n") == 0) + { + installed = 0; + } + +#undef STR_LIBRARY_NAMES +#define STR_LIBRARY_NAMES "library_names=" + else if (! dlname && strncmp (line, STR_LIBRARY_NAMES, + sizeof (STR_LIBRARY_NAMES) - 1) == 0) + { + char *last_libname; + errors += trim (&dlname, &line[sizeof (STR_LIBRARY_NAMES) - 1]); + if (!errors + && dlname + && (last_libname = strrchr (dlname, ' ')) != 0) + { + last_libname = lt_estrdup (last_libname + 1); + if (!last_libname) + { + ++errors; + goto cleanup; + } + LT_DLMEM_REASSIGN (dlname, last_libname); + } + } + + if (errors) + break; + } + + fclose (file); + LT_DLFREE (line); + + /* allocate the handle */ + *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1); + if (*phandle == 0) + ++errors; + + if (errors) + { + free_vars (dlname, old_name, libdir, deplibs); + LT_DLFREE (*phandle); + goto cleanup; + } + + assert (*phandle); + + memset (*phandle, 0, sizeof(struct lt_dlhandle_struct)); + if (load_deplibs (*phandle, deplibs) == 0) + { + newhandle = *phandle; + /* find_module may replace newhandle */ + if (find_module (&newhandle, dir, libdir, dlname, old_name, installed)) + { + unload_deplibs (*phandle); + ++errors; + } + } + else + { + ++errors; + } + + free_vars (dlname, old_name, libdir, deplibs); + if (errors) + { + LT_DLFREE (*phandle); + goto cleanup; + } + + if (*phandle != newhandle) + { + unload_deplibs (*phandle); + } + } + else + { + /* not a libtool module */ + *phandle = (lt_dlhandle) LT_EMALLOC (struct lt_dlhandle_struct, 1); + if (*phandle == 0) + { + ++errors; + goto cleanup; + } + + memset (*phandle, 0, sizeof (struct lt_dlhandle_struct)); + newhandle = *phandle; + + /* If the module has no directory name component, try to find it + first in user_search_path and then other prescribed paths. + Otherwise (or in any case if the module was not yet found) try + opening just the module name as passed. */ + if ((dir || (!find_handle (user_search_path, base_name, &newhandle) + && !find_handle (getenv (LTDL_SEARCHPATH_VAR), base_name, + &newhandle) +#ifdef LTDL_SHLIBPATH_VAR + && !find_handle (getenv (LTDL_SHLIBPATH_VAR), base_name, + &newhandle) +#endif +#ifdef LTDL_SYSSEARCHPATH + && !find_handle (sys_search_path, base_name, &newhandle) +#endif + ))) + { + if (tryall_dlopen (&newhandle, filename) != 0) + { + newhandle = NULL; + } + } + + if (!newhandle) + { + LT_DLFREE (*phandle); + ++errors; + goto cleanup; + } + } + + register_handle: + LT_DLMEM_REASSIGN (*phandle, newhandle); + + if ((*phandle)->info.ref_count == 0) + { + (*phandle)->info.ref_count = 1; + LT_DLMEM_REASSIGN ((*phandle)->info.name, name); + + LT_DLMUTEX_LOCK (); + (*phandle)->next = handles; + handles = *phandle; + LT_DLMUTEX_UNLOCK (); + } + + LT_DLMUTEX_SETERROR (saved_error); + + cleanup: + LT_DLFREE (dir); + LT_DLFREE (name); + LT_DLFREE (canonical); + + return errors; +} + +lt_dlhandle +lt_dlopen (filename) + const char *filename; +{ + lt_dlhandle handle = 0; + + /* Just incase we missed a code path in try_dlopen() that reports + an error, but forgets to reset handle... */ + if (try_dlopen (&handle, filename) != 0) + return 0; + + return handle; +} + +/* If the last error messge store was `FILE_NOT_FOUND', then return + non-zero. */ +static int +file_not_found () +{ + const char *error = 0; + + LT_DLMUTEX_GETERROR (error); + if (error == LT_DLSTRERROR (FILE_NOT_FOUND)) + return 1; + + return 0; +} + +/* If FILENAME has an ARCHIVE_EXT or SHLIB_EXT extension, try to + open the FILENAME as passed. Otherwise try appending ARCHIVE_EXT, + and if a file is still not found try again with SHLIB_EXT appended + instead. */ +lt_dlhandle +lt_dlopenext (filename) + const char *filename; +{ + lt_dlhandle handle = 0; + char * tmp = 0; + char * ext = 0; + size_t len; + int errors = 0; + + if (!filename) + { + return lt_dlopen (filename); + } + + assert (filename); + + len = LT_STRLEN (filename); + ext = strrchr (filename, '.'); + + /* If FILENAME already bears a suitable extension, there is no need + to try appending additional extensions. */ + if (ext && ((strcmp (ext, archive_ext) == 0) +#ifdef LTDL_SHLIB_EXT + || (strcmp (ext, shlib_ext) == 0) +#endif + )) + { + return lt_dlopen (filename); + } + + /* First try appending ARCHIVE_EXT. */ + tmp = LT_EMALLOC (char, len + LT_STRLEN (archive_ext) + 1); + if (!tmp) + return 0; + + strcpy (tmp, filename); + strcat (tmp, archive_ext); + errors = try_dlopen (&handle, tmp); + + /* If we found FILENAME, stop searching -- whether we were able to + load the file as a module or not. If the file exists but loading + failed, it is better to return an error message here than to + report FILE_NOT_FOUND when the alternatives (foo.so etc) are not + in the module search path. */ + if (handle || ((errors > 0) && !file_not_found ())) + { + LT_DLFREE (tmp); + return handle; + } + +#ifdef LTDL_SHLIB_EXT + /* Try appending SHLIB_EXT. */ + if (LT_STRLEN (shlib_ext) > LT_STRLEN (archive_ext)) + { + LT_DLFREE (tmp); + tmp = LT_EMALLOC (char, len + LT_STRLEN (shlib_ext) + 1); + if (!tmp) + return 0; + + strcpy (tmp, filename); + } + else + { + tmp[len] = LT_EOS_CHAR; + } + + strcat(tmp, shlib_ext); + errors = try_dlopen (&handle, tmp); + + /* As before, if the file was found but loading failed, return now + with the current error message. */ + if (handle || ((errors > 0) && !file_not_found ())) + { + LT_DLFREE (tmp); + return handle; + } +#endif + + /* Still here? Then we really did fail to locate any of the file + names we tried. */ + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FILE_NOT_FOUND)); + LT_DLFREE (tmp); + return 0; +} + + +static int +lt_argz_insert (pargz, pargz_len, before, entry) + char **pargz; + size_t *pargz_len; + char *before; + const char *entry; +{ + error_t error; + + /* Prior to Sep 8, 2005, newlib had a bug where argz_insert(pargz, + pargz_len, NULL, entry) failed with EINVAL. */ + if (before) + error = argz_insert (pargz, pargz_len, before, entry); + else + error = argz_append (pargz, pargz_len, entry, 1 + LT_STRLEN (entry)); + + if (error) + { + switch (error) + { + case ENOMEM: + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (NO_MEMORY)); + break; + default: + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (UNKNOWN)); + break; + } + return 1; + } + + return 0; +} + +static int +lt_argz_insertinorder (pargz, pargz_len, entry) + char **pargz; + size_t *pargz_len; + const char *entry; +{ + char *before = 0; + + assert (pargz); + assert (pargz_len); + assert (entry && *entry); + + if (*pargz) + while ((before = argz_next (*pargz, *pargz_len, before))) + { + int cmp = strcmp (entry, before); + + if (cmp < 0) break; + if (cmp == 0) return 0; /* No duplicates! */ + } + + return lt_argz_insert (pargz, pargz_len, before, entry); +} + +static int +lt_argz_insertdir (pargz, pargz_len, dirnam, dp) + char **pargz; + size_t *pargz_len; + const char *dirnam; + struct dirent *dp; +{ + char *buf = 0; + size_t buf_len = 0; + char *end = 0; + size_t end_offset = 0; + size_t dir_len = 0; + int errors = 0; + + assert (pargz); + assert (pargz_len); + assert (dp); + + dir_len = LT_STRLEN (dirnam); + end = dp->d_name + LT_D_NAMLEN(dp); + + /* Ignore version numbers. */ + { + char *p; + for (p = end; p -1 > dp->d_name; --p) + if (strchr (".0123456789", p[-1]) == 0) + break; + + if (*p == '.') + end = p; + } + + /* Ignore filename extension. */ + { + char *p; + for (p = end -1; p > dp->d_name; --p) + if (*p == '.') + { + end = p; + break; + } + } + + /* Prepend the directory name. */ + end_offset = end - dp->d_name; + buf_len = dir_len + 1+ end_offset; + buf = LT_EMALLOC (char, 1+ buf_len); + if (!buf) + return ++errors; + + assert (buf); + + strcpy (buf, dirnam); + strcat (buf, "/"); + strncat (buf, dp->d_name, end_offset); + buf[buf_len] = LT_EOS_CHAR; + + /* Try to insert (in order) into ARGZ/ARGZ_LEN. */ + if (lt_argz_insertinorder (pargz, pargz_len, buf) != 0) + ++errors; + + LT_DLFREE (buf); + + return errors; +} + +static int +list_files_by_dir (dirnam, pargz, pargz_len) + const char *dirnam; + char **pargz; + size_t *pargz_len; +{ + DIR *dirp = 0; + int errors = 0; + + assert (dirnam && *dirnam); + assert (pargz); + assert (pargz_len); + assert (dirnam[LT_STRLEN(dirnam) -1] != '/'); + + dirp = opendir (dirnam); + if (dirp) + { + struct dirent *dp = 0; + + while ((dp = readdir (dirp))) + if (dp->d_name[0] != '.') + if (lt_argz_insertdir (pargz, pargz_len, dirnam, dp)) + { + ++errors; + break; + } + + closedir (dirp); + } + else + ++errors; + + return errors; +} + + +/* If there are any files in DIRNAME, call the function passed in + DATA1 (with the name of each file and DATA2 as arguments). */ +static int +foreachfile_callback (dirname, data1, data2) + char *dirname; + lt_ptr data1; + lt_ptr data2; +{ + int (*func) LT_PARAMS((const char *filename, lt_ptr data)) + = (int (*) LT_PARAMS((const char *filename, lt_ptr data))) data1; + + int is_done = 0; + char *argz = 0; + size_t argz_len = 0; + + if (list_files_by_dir (dirname, &argz, &argz_len) != 0) + goto cleanup; + if (!argz) + goto cleanup; + + { + char *filename = 0; + while ((filename = argz_next (argz, argz_len, filename))) + if ((is_done = (*func) (filename, data2))) + break; + } + + cleanup: + LT_DLFREE (argz); + + return is_done; +} + + +/* Call FUNC for each unique extensionless file in SEARCH_PATH, along + with DATA. The filenames passed to FUNC would be suitable for + passing to lt_dlopenext. The extensions are stripped so that + individual modules do not generate several entries (e.g. libfoo.la, + libfoo.so, libfoo.so.1, libfoo.so.1.0.0). If SEARCH_PATH is NULL, + then the same directories that lt_dlopen would search are examined. */ +int +lt_dlforeachfile (search_path, func, data) + const char *search_path; + int (*func) LT_PARAMS ((const char *filename, lt_ptr data)); + lt_ptr data; +{ + int is_done = 0; + + if (search_path) + { + /* If a specific path was passed, search only the directories + listed in it. */ + is_done = foreach_dirinpath (search_path, 0, + foreachfile_callback, func, data); + } + else + { + /* Otherwise search the default paths. */ + is_done = foreach_dirinpath (user_search_path, 0, + foreachfile_callback, func, data); + if (!is_done) + { + is_done = foreach_dirinpath (getenv("LTDL_LIBRARY_PATH"), 0, + foreachfile_callback, func, data); + } + +#ifdef LTDL_SHLIBPATH_VAR + if (!is_done) + { + is_done = foreach_dirinpath (getenv(LTDL_SHLIBPATH_VAR), 0, + foreachfile_callback, func, data); + } +#endif +#ifdef LTDL_SYSSEARCHPATH + if (!is_done) + { + is_done = foreach_dirinpath (getenv(LTDL_SYSSEARCHPATH), 0, + foreachfile_callback, func, data); + } +#endif + } + + return is_done; +} + +int +lt_dlclose (handle) + lt_dlhandle handle; +{ + lt_dlhandle cur, last; + int errors = 0; + + LT_DLMUTEX_LOCK (); + + /* check whether the handle is valid */ + last = cur = handles; + while (cur && handle != cur) + { + last = cur; + cur = cur->next; + } + + if (!cur) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE)); + ++errors; + goto done; + } + + handle->info.ref_count--; + + /* Note that even with resident modules, we must track the ref_count + correctly incase the user decides to reset the residency flag + later (even though the API makes no provision for that at the + moment). */ + if (handle->info.ref_count <= 0 && !LT_DLIS_RESIDENT (handle)) + { + lt_user_data data = handle->loader->dlloader_data; + + if (handle != handles) + { + last->next = handle->next; + } + else + { + handles = handle->next; + } + + errors += handle->loader->module_close (data, handle->module); + errors += unload_deplibs(handle); + + /* It is up to the callers to free the data itself. */ + LT_DLFREE (handle->caller_data); + + LT_DLFREE (handle->info.filename); + LT_DLFREE (handle->info.name); + LT_DLFREE (handle); + + goto done; + } + + if (LT_DLIS_RESIDENT (handle)) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (CLOSE_RESIDENT_MODULE)); + ++errors; + } + + done: + LT_DLMUTEX_UNLOCK (); + + return errors; +} + +lt_ptr +lt_dlsym (handle, symbol) + lt_dlhandle handle; + const char *symbol; +{ + size_t lensym; + char lsym[LT_SYMBOL_LENGTH]; + char *sym; + lt_ptr address; + lt_user_data data; + + if (!handle) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE)); + return 0; + } + + if (!symbol) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND)); + return 0; + } + + lensym = LT_STRLEN (symbol) + LT_STRLEN (handle->loader->sym_prefix) + + LT_STRLEN (handle->info.name); + + if (lensym + LT_SYMBOL_OVERHEAD < LT_SYMBOL_LENGTH) + { + sym = lsym; + } + else + { + sym = LT_EMALLOC (char, lensym + LT_SYMBOL_OVERHEAD + 1); + if (!sym) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (BUFFER_OVERFLOW)); + return 0; + } + } + + data = handle->loader->dlloader_data; + if (handle->info.name) + { + const char *saved_error; + + LT_DLMUTEX_GETERROR (saved_error); + + /* this is a libtool module */ + if (handle->loader->sym_prefix) + { + strcpy(sym, handle->loader->sym_prefix); + strcat(sym, handle->info.name); + } + else + { + strcpy(sym, handle->info.name); + } + + strcat(sym, "_LTX_"); + strcat(sym, symbol); + + /* try "modulename_LTX_symbol" */ + address = handle->loader->find_sym (data, handle->module, sym); + if (address) + { + if (sym != lsym) + { + LT_DLFREE (sym); + } + return address; + } + LT_DLMUTEX_SETERROR (saved_error); + } + + /* otherwise try "symbol" */ + if (handle->loader->sym_prefix) + { + strcpy(sym, handle->loader->sym_prefix); + strcat(sym, symbol); + } + else + { + strcpy(sym, symbol); + } + + address = handle->loader->find_sym (data, handle->module, sym); + if (sym != lsym) + { + LT_DLFREE (sym); + } + + return address; +} + +const char * +lt_dlerror () +{ + const char *error; + + LT_DLMUTEX_GETERROR (error); + LT_DLMUTEX_SETERROR (0); + + return error ? error : NULL; +} + +static int +lt_dlpath_insertdir (ppath, before, dir) + char **ppath; + char *before; + const char *dir; +{ + int errors = 0; + char *canonical = 0; + char *argz = 0; + size_t argz_len = 0; + + assert (ppath); + assert (dir && *dir); + + if (canonicalize_path (dir, &canonical) != 0) + { + ++errors; + goto cleanup; + } + + assert (canonical && *canonical); + + /* If *PPATH is empty, set it to DIR. */ + if (*ppath == 0) + { + assert (!before); /* BEFORE cannot be set without PPATH. */ + assert (dir); /* Without DIR, don't call this function! */ + + *ppath = lt_estrdup (dir); + if (*ppath == 0) + ++errors; + + return errors; + } + + assert (ppath && *ppath); + + if (argzize_path (*ppath, &argz, &argz_len) != 0) + { + ++errors; + goto cleanup; + } + + /* Convert BEFORE into an equivalent offset into ARGZ. This only works + if *PPATH is already canonicalized, and hence does not change length + with respect to ARGZ. We canonicalize each entry as it is added to + the search path, and don't call this function with (uncanonicalized) + user paths, so this is a fair assumption. */ + if (before) + { + assert (*ppath <= before); + assert (before - *ppath <= strlen (*ppath)); + + before = before - *ppath + argz; + } + + if (lt_argz_insert (&argz, &argz_len, before, dir) != 0) + { + ++errors; + goto cleanup; + } + + argz_stringify (argz, argz_len, LT_PATHSEP_CHAR); + LT_DLMEM_REASSIGN (*ppath, argz); + + cleanup: + LT_DLFREE (canonical); + LT_DLFREE (argz); + + return errors; +} + +int +lt_dladdsearchdir (search_dir) + const char *search_dir; +{ + int errors = 0; + + if (search_dir && *search_dir) + { + LT_DLMUTEX_LOCK (); + if (lt_dlpath_insertdir (&user_search_path, 0, search_dir) != 0) + ++errors; + LT_DLMUTEX_UNLOCK (); + } + + return errors; +} + +int +lt_dlinsertsearchdir (before, search_dir) + const char *before; + const char *search_dir; +{ + int errors = 0; + + if (before) + { + LT_DLMUTEX_LOCK (); + if ((before < user_search_path) + || (before >= user_search_path + LT_STRLEN (user_search_path))) + { + LT_DLMUTEX_UNLOCK (); + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_POSITION)); + return 1; + } + LT_DLMUTEX_UNLOCK (); + } + + if (search_dir && *search_dir) + { + LT_DLMUTEX_LOCK (); + if (lt_dlpath_insertdir (&user_search_path, + (char *) before, search_dir) != 0) + { + ++errors; + } + LT_DLMUTEX_UNLOCK (); + } + + return errors; +} + +int +lt_dlsetsearchpath (search_path) + const char *search_path; +{ + int errors = 0; + + LT_DLMUTEX_LOCK (); + LT_DLFREE (user_search_path); + LT_DLMUTEX_UNLOCK (); + + if (!search_path || !LT_STRLEN (search_path)) + { + return errors; + } + + LT_DLMUTEX_LOCK (); + if (canonicalize_path (search_path, &user_search_path) != 0) + ++errors; + LT_DLMUTEX_UNLOCK (); + + return errors; +} + +const char * +lt_dlgetsearchpath () +{ + const char *saved_path; + + LT_DLMUTEX_LOCK (); + saved_path = user_search_path; + LT_DLMUTEX_UNLOCK (); + + return saved_path; +} + +int +lt_dlmakeresident (handle) + lt_dlhandle handle; +{ + int errors = 0; + + if (!handle) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE)); + ++errors; + } + else + { + LT_DLSET_FLAG (handle, LT_DLRESIDENT_FLAG); + } + + return errors; +} + +int +lt_dlisresident (handle) + lt_dlhandle handle; +{ + if (!handle) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE)); + return -1; + } + + return LT_DLIS_RESIDENT (handle); +} + + + + +/* --- MODULE INFORMATION --- */ + +const lt_dlinfo * +lt_dlgetinfo (handle) + lt_dlhandle handle; +{ + if (!handle) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_HANDLE)); + return 0; + } + + return &(handle->info); +} + +lt_dlhandle +lt_dlhandle_next (place) + lt_dlhandle place; +{ + return place ? place->next : handles; +} + +int +lt_dlforeach (func, data) + int (*func) LT_PARAMS((lt_dlhandle handle, lt_ptr data)); + lt_ptr data; +{ + int errors = 0; + lt_dlhandle cur; + + LT_DLMUTEX_LOCK (); + + cur = handles; + while (cur) + { + lt_dlhandle tmp = cur; + + cur = cur->next; + if ((*func) (tmp, data)) + { + ++errors; + break; + } + } + + LT_DLMUTEX_UNLOCK (); + + return errors; +} + +lt_dlcaller_id +lt_dlcaller_register () +{ + static lt_dlcaller_id last_caller_id = 0; + int result; + + LT_DLMUTEX_LOCK (); + result = ++last_caller_id; + LT_DLMUTEX_UNLOCK (); + + return result; +} + +lt_ptr +lt_dlcaller_set_data (key, handle, data) + lt_dlcaller_id key; + lt_dlhandle handle; + lt_ptr data; +{ + int n_elements = 0; + lt_ptr stale = (lt_ptr) 0; + int i; + + /* This needs to be locked so that the caller data can be updated + simultaneously by different threads. */ + LT_DLMUTEX_LOCK (); + + if (handle->caller_data) + while (handle->caller_data[n_elements].key) + ++n_elements; + + for (i = 0; i < n_elements; ++i) + { + if (handle->caller_data[i].key == key) + { + stale = handle->caller_data[i].data; + break; + } + } + + /* Ensure that there is enough room in this handle's caller_data + array to accept a new element (and an empty end marker). */ + if (i == n_elements) + { + lt_caller_data *temp + = LT_DLREALLOC (lt_caller_data, handle->caller_data, 2+ n_elements); + + if (!temp) + { + stale = 0; + goto done; + } + + handle->caller_data = temp; + + /* We only need this if we needed to allocate a new caller_data. */ + handle->caller_data[i].key = key; + handle->caller_data[1+ i].key = 0; + } + + handle->caller_data[i].data = data; + + done: + LT_DLMUTEX_UNLOCK (); + + return stale; +} + +lt_ptr +lt_dlcaller_get_data (key, handle) + lt_dlcaller_id key; + lt_dlhandle handle; +{ + lt_ptr result = (lt_ptr) 0; + + /* This needs to be locked so that the caller data isn't updated by + another thread part way through this function. */ + LT_DLMUTEX_LOCK (); + + /* Locate the index of the element with a matching KEY. */ + { + int i; + for (i = 0; handle->caller_data[i].key; ++i) + { + if (handle->caller_data[i].key == key) + { + result = handle->caller_data[i].data; + break; + } + } + } + + LT_DLMUTEX_UNLOCK (); + + return result; +} + + + +/* --- USER MODULE LOADER API --- */ + + +int +lt_dlloader_add (place, dlloader, loader_name) + lt_dlloader *place; + const struct lt_user_dlloader *dlloader; + const char *loader_name; +{ + int errors = 0; + lt_dlloader *node = 0, *ptr = 0; + + if ((dlloader == 0) /* diagnose null parameters */ + || (dlloader->module_open == 0) + || (dlloader->module_close == 0) + || (dlloader->find_sym == 0)) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER)); + return 1; + } + + /* Create a new dlloader node with copies of the user callbacks. */ + node = LT_EMALLOC (lt_dlloader, 1); + if (!node) + return 1; + + node->next = 0; + node->loader_name = loader_name; + node->sym_prefix = dlloader->sym_prefix; + node->dlloader_exit = dlloader->dlloader_exit; + node->module_open = dlloader->module_open; + node->module_close = dlloader->module_close; + node->find_sym = dlloader->find_sym; + node->dlloader_data = dlloader->dlloader_data; + + LT_DLMUTEX_LOCK (); + if (!loaders) + { + /* If there are no loaders, NODE becomes the list! */ + loaders = node; + } + else if (!place) + { + /* If PLACE is not set, add NODE to the end of the + LOADERS list. */ + for (ptr = loaders; ptr->next; ptr = ptr->next) + { + /*NOWORK*/; + } + + ptr->next = node; + } + else if (loaders == place) + { + /* If PLACE is the first loader, NODE goes first. */ + node->next = place; + loaders = node; + } + else + { + /* Find the node immediately preceding PLACE. */ + for (ptr = loaders; ptr->next != place; ptr = ptr->next) + { + /*NOWORK*/; + } + + if (ptr->next != place) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER)); + ++errors; + } + else + { + /* Insert NODE between PTR and PLACE. */ + node->next = place; + ptr->next = node; + } + } + + LT_DLMUTEX_UNLOCK (); + + return errors; +} + +int +lt_dlloader_remove (loader_name) + const char *loader_name; +{ + lt_dlloader *place = lt_dlloader_find (loader_name); + lt_dlhandle handle; + int errors = 0; + + if (!place) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER)); + return 1; + } + + LT_DLMUTEX_LOCK (); + + /* Fail if there are any open modules which use this loader. */ + for (handle = handles; handle; handle = handle->next) + { + if (handle->loader == place) + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (REMOVE_LOADER)); + ++errors; + goto done; + } + } + + if (place == loaders) + { + /* PLACE is the first loader in the list. */ + loaders = loaders->next; + } + else + { + /* Find the loader before the one being removed. */ + lt_dlloader *prev; + for (prev = loaders; prev->next; prev = prev->next) + { + if (!strcmp (prev->next->loader_name, loader_name)) + { + break; + } + } + + place = prev->next; + prev->next = prev->next->next; + } + + if (place->dlloader_exit) + { + errors = place->dlloader_exit (place->dlloader_data); + } + + LT_DLFREE (place); + + done: + LT_DLMUTEX_UNLOCK (); + + return errors; +} + +lt_dlloader * +lt_dlloader_next (place) + lt_dlloader *place; +{ + lt_dlloader *next; + + LT_DLMUTEX_LOCK (); + next = place ? place->next : loaders; + LT_DLMUTEX_UNLOCK (); + + return next; +} + +const char * +lt_dlloader_name (place) + lt_dlloader *place; +{ + const char *name = 0; + + if (place) + { + LT_DLMUTEX_LOCK (); + name = place ? place->loader_name : 0; + LT_DLMUTEX_UNLOCK (); + } + else + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER)); + } + + return name; +} + +lt_user_data * +lt_dlloader_data (place) + lt_dlloader *place; +{ + lt_user_data *data = 0; + + if (place) + { + LT_DLMUTEX_LOCK (); + data = place ? &(place->dlloader_data) : 0; + LT_DLMUTEX_UNLOCK (); + } + else + { + LT_DLMUTEX_SETERROR (LT_DLSTRERROR (INVALID_LOADER)); + } + + return data; +} + +lt_dlloader * +lt_dlloader_find (loader_name) + const char *loader_name; +{ + lt_dlloader *place = 0; + + LT_DLMUTEX_LOCK (); + for (place = loaders; place; place = place->next) + { + if (strcmp (place->loader_name, loader_name) == 0) + { + break; + } + } + LT_DLMUTEX_UNLOCK (); + + return place; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/libltdl/ltdl.h kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/libltdl/ltdl.h --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/libltdl/ltdl.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/libltdl/ltdl.h 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,366 @@ +/* ltdl.h -- generic dlopen functions + Copyright (C) 1998-2000 Free Software Foundation, Inc. + Originally by Thomas Tanner + This file is part of GNU Libtool. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +As a special exception to the GNU Lesser General Public License, +if you distribute this file as part of a program or library that +is built using GNU libtool, you may include it under the same +distribution terms that you use for the rest of that program. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free +Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA +*/ + +/* Only include this header file once. */ +#ifndef LTDL_H +#define LTDL_H 1 + +#include /* for size_t declaration */ + + +/* --- MACROS FOR PORTABILITY --- */ + + +/* Saves on those hard to debug '\0' typos.... */ +#define LT_EOS_CHAR '\0' + +/* LTDL_BEGIN_C_DECLS should be used at the beginning of your declarations, + so that C++ compilers don't mangle their names. Use LTDL_END_C_DECLS at + the end of C declarations. */ +#ifdef __cplusplus +# define LT_BEGIN_C_DECLS extern "C" { +# define LT_END_C_DECLS } +#else +# define LT_BEGIN_C_DECLS /* empty */ +# define LT_END_C_DECLS /* empty */ +#endif + +LT_BEGIN_C_DECLS + + +/* LT_PARAMS is a macro used to wrap function prototypes, so that compilers + that don't understand ANSI C prototypes still work, and ANSI C + compilers can issue warnings about type mismatches. */ +#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(WIN32) || defined(__cplusplus) +# define LT_PARAMS(protos) protos +# define lt_ptr void* +#else +# define LT_PARAMS(protos) () +# define lt_ptr char* +#endif + +/* LT_STMT_START/END are used to create macros which expand to a + a single compound statement in a portable way. */ +#if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus) +# define LT_STMT_START (void)( +# define LT_STMT_END ) +#else +# if (defined (sun) || defined (__sun__)) +# define LT_STMT_START if (1) +# define LT_STMT_END else (void)0 +# else +# define LT_STMT_START do +# define LT_STMT_END while (0) +# endif +#endif + +/* LT_CONC creates a new concatenated symbol for the compiler + in a portable way. */ +#if defined(__STDC__) || defined(__cplusplus) || defined(_MSC_VER) +# define LT_CONC(s,t) s##t +#else +# define LT_CONC(s,t) s/**/t +#endif + +/* LT_STRLEN can be used safely on NULL pointers. */ +#define LT_STRLEN(s) (((s) && (s)[0]) ? strlen (s) : 0) + + + +/* --- WINDOWS SUPPORT --- */ + + +/* Canonicalise Windows and Cygwin recognition macros. */ +#ifdef __CYGWIN32__ +# ifndef __CYGWIN__ +# define __CYGWIN__ __CYGWIN32__ +# endif +#endif +#if defined(_WIN32) || defined(WIN32) +# ifndef __WINDOWS__ +# ifdef _WIN32 +# define __WINDOWS__ _WIN32 +# else +# ifdef WIN32 +# define __WINDOWS__ WIN32 +# endif +# endif +# endif +#endif + + +#ifdef __WINDOWS__ +# ifndef __CYGWIN__ +/* LT_DIRSEP_CHAR is accepted *in addition* to '/' as a directory + separator when it is set. */ +# define LT_DIRSEP_CHAR '\\' +# define LT_PATHSEP_CHAR ';' +# endif +#endif +#ifndef LT_PATHSEP_CHAR +# define LT_PATHSEP_CHAR ':' +#endif + +/* DLL building support on win32 hosts; mostly to workaround their + ridiculous implementation of data symbol exporting. */ +#ifndef LT_SCOPE +# ifdef __WINDOWS__ +# ifdef DLL_EXPORT /* defined by libtool (if required) */ +# define LT_SCOPE __declspec(dllexport) +# endif +# ifdef LIBLTDL_DLL_IMPORT /* define if linking with this dll */ +# define LT_SCOPE extern __declspec(dllimport) +# endif +# endif +# ifndef LT_SCOPE /* static linking or !__WINDOWS__ */ +# define LT_SCOPE extern +# endif +#endif + + +#if defined(_MSC_VER) /* Visual Studio */ +# define R_OK 4 +#endif + + + +/* --- DYNAMIC MODULE LOADING API --- */ + + +typedef struct lt_dlhandle_struct *lt_dlhandle; /* A loaded module. */ + +/* Initialisation and finalisation functions for libltdl. */ +LT_SCOPE int lt_dlinit LT_PARAMS((void)); +LT_SCOPE int lt_dlexit LT_PARAMS((void)); + +/* Module search path manipulation. */ +LT_SCOPE int lt_dladdsearchdir LT_PARAMS((const char *search_dir)); +LT_SCOPE int lt_dlinsertsearchdir LT_PARAMS((const char *before, + const char *search_dir)); +LT_SCOPE int lt_dlsetsearchpath LT_PARAMS((const char *search_path)); +LT_SCOPE const char *lt_dlgetsearchpath LT_PARAMS((void)); +LT_SCOPE int lt_dlforeachfile LT_PARAMS(( + const char *search_path, + int (*func) (const char *filename, lt_ptr data), + lt_ptr data)); + +/* Portable libltdl versions of the system dlopen() API. */ +LT_SCOPE lt_dlhandle lt_dlopen LT_PARAMS((const char *filename)); +LT_SCOPE lt_dlhandle lt_dlopenext LT_PARAMS((const char *filename)); +LT_SCOPE lt_ptr lt_dlsym LT_PARAMS((lt_dlhandle handle, + const char *name)); +LT_SCOPE const char *lt_dlerror LT_PARAMS((void)); +LT_SCOPE int lt_dlclose LT_PARAMS((lt_dlhandle handle)); + +/* Module residency management. */ +LT_SCOPE int lt_dlmakeresident LT_PARAMS((lt_dlhandle handle)); +LT_SCOPE int lt_dlisresident LT_PARAMS((lt_dlhandle handle)); + + + + +/* --- MUTEX LOCKING --- */ + + +typedef void lt_dlmutex_lock LT_PARAMS((void)); +typedef void lt_dlmutex_unlock LT_PARAMS((void)); +typedef void lt_dlmutex_seterror LT_PARAMS((const char *errmsg)); +typedef const char *lt_dlmutex_geterror LT_PARAMS((void)); + +LT_SCOPE int lt_dlmutex_register LT_PARAMS((lt_dlmutex_lock *lock, + lt_dlmutex_unlock *unlock, + lt_dlmutex_seterror *seterror, + lt_dlmutex_geterror *geterror)); + + + + +/* --- MEMORY HANDLING --- */ + + +/* By default, the realloc function pointer is set to our internal + realloc implementation which iself uses lt_dlmalloc and lt_dlfree. + libltdl relies on a featureful realloc, but if you are sure yours + has the right semantics then you can assign it directly. Generally, + it is safe to assign just a malloc() and a free() function. */ +LT_SCOPE lt_ptr (*lt_dlmalloc) LT_PARAMS((size_t size)); +LT_SCOPE lt_ptr (*lt_dlrealloc) LT_PARAMS((lt_ptr ptr, size_t size)); +LT_SCOPE void (*lt_dlfree) LT_PARAMS((lt_ptr ptr)); + + + + +/* --- PRELOADED MODULE SUPPORT --- */ + + +/* A preopened symbol. Arrays of this type comprise the exported + symbols for a dlpreopened module. */ +typedef struct { + const char *name; + lt_ptr address; +} lt_dlsymlist; + +LT_SCOPE int lt_dlpreload LT_PARAMS((const lt_dlsymlist *preloaded)); +LT_SCOPE int lt_dlpreload_default + LT_PARAMS((const lt_dlsymlist *preloaded)); + +#define LTDL_SET_PRELOADED_SYMBOLS() LT_STMT_START{ \ + extern const lt_dlsymlist lt_preloaded_symbols[]; \ + lt_dlpreload_default(lt_preloaded_symbols); \ + }LT_STMT_END + + + + +/* --- MODULE INFORMATION --- */ + + +/* Read only information pertaining to a loaded module. */ +typedef struct { + char *filename; /* file name */ + char *name; /* module name */ + int ref_count; /* number of times lt_dlopened minus + number of times lt_dlclosed. */ +} lt_dlinfo; + +LT_SCOPE const lt_dlinfo *lt_dlgetinfo LT_PARAMS((lt_dlhandle handle)); +LT_SCOPE lt_dlhandle lt_dlhandle_next LT_PARAMS((lt_dlhandle place)); +LT_SCOPE int lt_dlforeach LT_PARAMS(( + int (*func) (lt_dlhandle handle, lt_ptr data), + lt_ptr data)); + +/* Associating user data with loaded modules. */ +typedef unsigned lt_dlcaller_id; + +LT_SCOPE lt_dlcaller_id lt_dlcaller_register LT_PARAMS((void)); +LT_SCOPE lt_ptr lt_dlcaller_set_data LT_PARAMS((lt_dlcaller_id key, + lt_dlhandle handle, + lt_ptr data)); +LT_SCOPE lt_ptr lt_dlcaller_get_data LT_PARAMS((lt_dlcaller_id key, + lt_dlhandle handle)); + + + +/* --- USER MODULE LOADER API --- */ + + +typedef struct lt_dlloader lt_dlloader; +typedef lt_ptr lt_user_data; +typedef lt_ptr lt_module; + +/* Function pointer types for creating user defined module loaders. */ +typedef lt_module lt_module_open LT_PARAMS((lt_user_data loader_data, + const char *filename)); +typedef int lt_module_close LT_PARAMS((lt_user_data loader_data, + lt_module handle)); +typedef lt_ptr lt_find_sym LT_PARAMS((lt_user_data loader_data, + lt_module handle, + const char *symbol)); +typedef int lt_dlloader_exit LT_PARAMS((lt_user_data loader_data)); + +struct lt_user_dlloader { + const char *sym_prefix; + lt_module_open *module_open; + lt_module_close *module_close; + lt_find_sym *find_sym; + lt_dlloader_exit *dlloader_exit; + lt_user_data dlloader_data; +}; + +LT_SCOPE lt_dlloader *lt_dlloader_next LT_PARAMS((lt_dlloader *place)); +LT_SCOPE lt_dlloader *lt_dlloader_find LT_PARAMS(( + const char *loader_name)); +LT_SCOPE const char *lt_dlloader_name LT_PARAMS((lt_dlloader *place)); +LT_SCOPE lt_user_data *lt_dlloader_data LT_PARAMS((lt_dlloader *place)); +LT_SCOPE int lt_dlloader_add LT_PARAMS((lt_dlloader *place, + const struct lt_user_dlloader *dlloader, + const char *loader_name)); +LT_SCOPE int lt_dlloader_remove LT_PARAMS(( + const char *loader_name)); + + + +/* --- ERROR MESSAGE HANDLING --- */ + + +/* Defining error strings alongside their symbolic names in a macro in + this way allows us to expand the macro in different contexts with + confidence that the enumeration of symbolic names will map correctly + onto the table of error strings. */ +#define lt_dlerror_table \ + LT_ERROR(UNKNOWN, "unknown error") \ + LT_ERROR(DLOPEN_NOT_SUPPORTED, "dlopen support not available") \ + LT_ERROR(INVALID_LOADER, "invalid loader") \ + LT_ERROR(INIT_LOADER, "loader initialization failed") \ + LT_ERROR(REMOVE_LOADER, "loader removal failed") \ + LT_ERROR(FILE_NOT_FOUND, "file not found") \ + LT_ERROR(DEPLIB_NOT_FOUND, "dependency library not found") \ + LT_ERROR(NO_SYMBOLS, "no symbols defined") \ + LT_ERROR(CANNOT_OPEN, "can't open the module") \ + LT_ERROR(CANNOT_CLOSE, "can't close the module") \ + LT_ERROR(SYMBOL_NOT_FOUND, "symbol not found") \ + LT_ERROR(NO_MEMORY, "not enough memory") \ + LT_ERROR(INVALID_HANDLE, "invalid module handle") \ + LT_ERROR(BUFFER_OVERFLOW, "internal buffer overflow") \ + LT_ERROR(INVALID_ERRORCODE, "invalid errorcode") \ + LT_ERROR(SHUTDOWN, "library already shutdown") \ + LT_ERROR(CLOSE_RESIDENT_MODULE, "can't close resident module") \ + LT_ERROR(INVALID_MUTEX_ARGS, "invalid mutex handler registration") \ + LT_ERROR(INVALID_POSITION, "invalid search path insert position") + +/* Enumerate the symbolic error names. */ +enum { +#define LT_ERROR(name, diagnostic) LT_CONC(LT_ERROR_, name), + lt_dlerror_table +#undef LT_ERROR + + LT_ERROR_MAX +}; + +/* These functions are only useful from inside custom module loaders. */ +LT_SCOPE int lt_dladderror LT_PARAMS((const char *diagnostic)); +LT_SCOPE int lt_dlseterror LT_PARAMS((int errorcode)); + + + + +/* --- SOURCE COMPATIBILITY WITH OLD LIBLTDL --- */ + + +#ifdef LT_NON_POSIX_NAMESPACE +# define lt_ptr_t lt_ptr +# define lt_module_t lt_module +# define lt_module_open_t lt_module_open +# define lt_module_close_t lt_module_close +# define lt_find_sym_t lt_find_sym +# define lt_dlloader_exit_t lt_dlloader_exit +# define lt_dlloader_t lt_dlloader +# define lt_dlloader_data_t lt_user_data +#endif + +LT_END_C_DECLS + +#endif /* !LTDL_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/libltdl/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/libltdl/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/libltdl/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/libltdl/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,6 @@ +## Process this file with automake to produce Makefile.in + +if DLOPEN +noinst_LIBRARIES = libltdl.a +libltdl_a_SOURCES = ltdl.c ltdl.h +endif DLOPEN diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/alloca.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/alloca.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/alloca.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/alloca.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,42 @@ +# alloca.m4 serial 5 +dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_ALLOCA], +[ + dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57. + AC_REQUIRE([AC_PROG_CPP]) + AC_REQUIRE([AC_PROG_EGREP]) + + AC_REQUIRE([AC_FUNC_ALLOCA]) + if test $ac_cv_func_alloca_works = no; then + gl_PREREQ_ALLOCA + fi + + # Define an additional variable used in the Makefile substitution. + if test $ac_cv_working_alloca_h = yes; then + AC_EGREP_CPP([Need own alloca], [ +#if defined __GNUC__ || defined _AIX || defined _MSC_VER + Need own alloca +#endif + ], + [AC_DEFINE(HAVE_ALLOCA, 1, + [Define to 1 if you have `alloca' after including , + a header that may be supplied by this distribution.]) + ALLOCA_H=alloca.h], + [ALLOCA_H=]) + else + ALLOCA_H=alloca.h + fi + AC_SUBST([ALLOCA_H]) + + AC_DEFINE(HAVE_ALLOCA_H, 1, + [Define HAVE_ALLOCA_H for backward compatibility with older code + that includes only if HAVE_ALLOCA_H is defined.]) +]) + +# Prerequisites of lib/alloca.c. +# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA. +AC_DEFUN([gl_PREREQ_ALLOCA], [:]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/argp.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/argp.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/argp.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/argp.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,61 @@ +# argp.m4 serial 6 +dnl Copyright (C) 2003-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_ARGP], +[ + AC_REQUIRE([AC_C_INLINE]) + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + AC_REQUIRE([gl_GETOPT_SUBSTITUTE]) + + AC_CHECK_DECL([program_invocation_name], + [AC_DEFINE(HAVE_DECL_PROGRAM_INVOCATION_NAME, 1, + [Define if program_invocation_name is declared])], + [AC_DEFINE(GNULIB_PROGRAM_INVOCATION_NAME, 1, + [Define to 1 to add extern declaration of program_invocation_name to argp-namefrob.h])], + [#include ]) + AC_CHECK_DECL([program_invocation_short_name], + [AC_DEFINE(HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME, 1, + [Define if program_invocation_short_name is declared])], + [AC_DEFINE(GNULIB_PROGRAM_INVOCATION_SHORT_NAME, 1, + [Define to 1 to add extern declaration of program_invocation_short_name to argp-namefrob.h])], + [#include ]) + + # Check if program_invocation_name and program_invocation_short_name + # are defined elsewhere. It is improbable that only one of them will + # be defined and other not, I prefer to stay on the safe side and to + # test each one separately. + AC_MSG_CHECKING(whether program_invocation_name is defined) + AC_TRY_COMPILE([#include ], + [ program_invocation_name = "test"; ], + [ AC_DEFINE(HAVE_PROGRAM_INVOCATION_NAME,1, + [Define if program_invocation_name is defined]) + AC_MSG_RESULT(yes)], + [ AC_MSG_RESULT(no)] ) + + AC_MSG_CHECKING(whether program_invocation_short_name is defined) + AC_TRY_COMPILE([#include ], + [ program_invocation_short_name = "test"; ], + [ AC_DEFINE(HAVE_PROGRAM_INVOCATION_SHORT_NAME,1, + [Define if program_invocation_short_name is defined]) + AC_MSG_RESULT(yes)], + [ AC_MSG_RESULT(no)] ) + + AC_CHECK_DECLS_ONCE([clearerr_unlocked]) + AC_CHECK_DECLS_ONCE([feof_unlocked]) + AC_CHECK_DECLS_ONCE([ferror_unlocked]) + AC_CHECK_DECLS_ONCE([fflush_unlocked]) + AC_CHECK_DECLS_ONCE([fgets_unlocked]) + AC_CHECK_DECLS_ONCE([fputc_unlocked]) + AC_CHECK_DECLS_ONCE([fputs_unlocked]) + AC_CHECK_DECLS_ONCE([fread_unlocked]) + AC_CHECK_DECLS_ONCE([fwrite_unlocked]) + AC_CHECK_DECLS_ONCE([getc_unlocked]) + AC_CHECK_DECLS_ONCE([getchar_unlocked]) + AC_CHECK_DECLS_ONCE([putc_unlocked]) + AC_CHECK_DECLS_ONCE([putchar_unlocked]) + AC_CHECK_FUNCS_ONCE([flockfile funlockfile]) + AC_CHECK_HEADERS_ONCE([features.h linewrap.h]) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/argz.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/argz.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/argz.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/argz.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,34 @@ +# Portability macros for glibc argz. -*- Autoconf -*- +# Written by Gary V. Vaughan + +# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 4 argz.m4 + +AC_DEFUN([gl_FUNC_ARGZ], +[gl_PREREQ_ARGZ + +AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT]) + +AC_CHECK_TYPES([error_t], + [], + [AC_DEFINE([error_t], [int], + [Define to a type to use for `error_t' if it is not otherwise available.]) + AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h + does not typedef error_t.])], + [#if defined(HAVE_ARGZ_H) +# include +#endif]) + +ARGZ_H= +AC_CHECK_FUNCS([argz_append argz_create_sep argz_insert argz_next \ + argz_stringify], [], [ARGZ_H=argz.h; AC_LIBOBJ([argz])]) +AC_SUBST([ARGZ_H]) +]) + +# Prerequisites of lib/argz.c. +AC_DEFUN([gl_PREREQ_ARGZ], [:]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/dirname.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/dirname.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/dirname.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/dirname.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,17 @@ +#serial 6 -*- autoconf -*- +dnl Copyright (C) 2002-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_DIRNAME], +[ + AC_LIBSOURCES([dirname.c, dirname.h]) + AC_LIBOBJ([dirname]) + + dnl Prerequisites of lib/dirname.h. + AC_REQUIRE([gl_AC_DOS]) + AC_REQUIRE([gl_DOUBLE_SLASH_ROOT]) + + dnl No prerequisites of lib/basename.c, lib/dirname.c, lib/stripslash.c. +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/dos.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/dos.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/dos.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/dos.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,71 @@ +#serial 10 -*- autoconf -*- + +# Define some macros required for proper operation of code in lib/*.c +# on MSDOS/Windows systems. + +# Copyright (C) 2000, 2001, 2004, 2005, 2006 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# From Jim Meyering. + +AC_DEFUN([gl_AC_DOS], + [ + AC_CACHE_CHECK([whether system is Windows or MSDOS], [ac_cv_win_or_dos], + [ + AC_TRY_COMPILE([], + [#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__ +neither MSDOS nor Windows +#endif], + [ac_cv_win_or_dos=yes], + [ac_cv_win_or_dos=no]) + ]) + + if test x"$ac_cv_win_or_dos" = xyes; then + ac_fs_accepts_drive_letter_prefix=1 + ac_fs_backslash_is_file_name_separator=1 + AC_CACHE_CHECK([whether drive letter can start relative path], + [ac_cv_drive_letter_can_be_relative], + [ + AC_TRY_COMPILE([], + [#if defined __CYGWIN__ +drive letters are always absolute +#endif], + [ac_cv_drive_letter_can_be_relative=yes], + [ac_cv_drive_letter_can_be_relative=no]) + ]) + if test x"$ac_cv_drive_letter_can_be_relative" = xyes; then + ac_fs_drive_letter_can_be_relative=1 + else + ac_fs_drive_letter_can_be_relative=0 + fi + else + ac_fs_accepts_drive_letter_prefix=0 + ac_fs_backslash_is_file_name_separator=0 + ac_fs_drive_letter_can_be_relative=0 + fi + + AC_DEFINE_UNQUOTED([FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX], + $ac_fs_accepts_drive_letter_prefix, + [Define on systems for which file names may have a so-called + `drive letter' prefix, define this to compute the length of that + prefix, including the colon.]) + + AH_VERBATIM(ISSLASH, + [#if FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#else +# define ISSLASH(C) ((C) == '/') +#endif]) + + AC_DEFINE_UNQUOTED([FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR], + $ac_fs_backslash_is_file_name_separator, + [Define if the backslash character may also serve as a file name + component separator.]) + + AC_DEFINE_UNQUOTED([FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE], + $ac_fs_drive_letter_can_be_relative, + [Define if a drive letter prefix denotes a relative path if it is + not followed by a file name component separator.]) + ]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/double-slash-root.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/double-slash-root.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/double-slash-root.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/double-slash-root.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,43 @@ +#serial 1 -*- autoconf -*- +dnl Copyright (C) 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_DOUBLE_SLASH_ROOT], +[ + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_CACHE_CHECK([whether // is distinct from /], [ac_cv_double_slash_root], + [ if test x"$cross_compiling" = xyes ; then + # When cross-compiling, there is no way to tell whether // is special + # short of a list of hosts. However, the only known hosts to date + # that have a distinct // are Apollo DomainOS (too old to port to) + # and Cygwin. If anyone knows of another system for which // has + # special semantics and is distinct from /, please report it to + # . + case $host in + *-cygwin) + ac_cv_double_slash_root=yes ;; + *) + # Be optimistic and assume that / and // are the same when we + # don't know. + ac_cv_double_slash_root='unknown, assuming no' ;; + esac + else + set x `ls -di / //` + if test $[2] = $[4]; then + ac_cv_double_slash_root=no + else + ac_cv_double_slash_root=yes + fi + fi]) + if test x"$ac_cv_double_slash_root" = xyes; then + ac_double_slash_root=1 + else + ac_double_slash_root=0 + fi + + AC_DEFINE_UNQUOTED([DOUBLE_SLASH_IS_DISTINCT_ROOT], + $ac_double_slash_root, + [Define to 1 if // is a file system root distinct from /.]) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/eoverflow.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/eoverflow.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/eoverflow.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/eoverflow.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,64 @@ +# eoverflow.m4 serial 1 +dnl Copyright (C) 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +# The EOVERFLOW errno value ought to be defined in , according to +# POSIX. But some systems (like AIX 3) don't define it, and some systems +# (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined. + +# Define EOVERFLOW as a C macro and as a substituted macro in such a way that +# 1. on all systems, after inclusion of , EOVERFLOW is usable, +# 2. on systems where EOVERFLOW is defined elsewhere, we use the same numeric +# value. + +AC_DEFUN([gl_EOVERFLOW], +[ + AC_REQUIRE([AC_PROG_CC])dnl + + AC_CACHE_CHECK([for EOVERFLOW], ac_cv_decl_EOVERFLOW, [ + AC_EGREP_CPP(yes,[ +#include +#ifdef EOVERFLOW +yes +#endif + ], have_eoverflow=1) + if test -n "$have_eoverflow"; then + dnl EOVERFLOW exists in . Don't need to define EOVERFLOW ourselves. + ac_cv_decl_EOVERFLOW=yes + else + AC_EGREP_CPP(yes,[ +#define _XOPEN_SOURCE_EXTENDED 1 +#include +#ifdef EOVERFLOW +yes +#endif + ], have_eoverflow=1) + if test -n "$have_eoverflow"; then + dnl EOVERFLOW exists but is hidden. + dnl Define it to the same value. + _AC_COMPUTE_INT([EOVERFLOW], ac_cv_decl_EOVERFLOW, [ +#define _XOPEN_SOURCE_EXTENDED 1 +#include +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include +]) + else + dnl EOVERFLOW isn't defined by the system. Define EOVERFLOW ourselves, but + dnl don't define it as EINVAL, because snprintf() callers want to + dnl distinguish EINVAL and EOVERFLOW. + ac_cv_decl_EOVERFLOW=E2BIG + fi + fi + ]) + if test "$ac_cv_decl_EOVERFLOW" != yes; then + AC_DEFINE_UNQUOTED([EOVERFLOW], [$ac_cv_decl_EOVERFLOW], + [Define as good substitute value for EOVERFLOW.]) + EOVERFLOW="$ac_cv_decl_EOVERFLOW" + AC_SUBST(EOVERFLOW) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/error.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/error.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/error.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/error.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,22 @@ +#serial 11 + +# Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2004 Free Software +# Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_ERROR], +[ + AC_FUNC_ERROR_AT_LINE + dnl Note: AC_FUNC_ERROR_AT_LINE does AC_LIBSOURCES([error.h, error.c]). + gl_PREREQ_ERROR +]) + +# Prerequisites of lib/error.c. +AC_DEFUN([gl_PREREQ_ERROR], +[ + AC_REQUIRE([AC_FUNC_STRERROR_R]) + : +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/exitfail.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/exitfail.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/exitfail.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/exitfail.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,14 @@ +# exitfail.m4 serial 5 +dnl Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_EXITFAIL], +[ + AC_LIBSOURCES([exitfail.c, exitfail.h]) + AC_LIBOBJ([exitfail]) + + dnl No prerequisites of lib/exitfail.c. + : +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/extensions.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/extensions.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/extensions.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/extensions.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,42 @@ +# Enable extensions on systems that normally disable them. + +# Copyright (C) 2003, 2006 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This file is only needed in autoconf <= 2.59. Newer versions of autoconf +# have a macro AC_USE_SYSTEM_EXTENSIONS with identical semantics. + +# gl_USE_SYSTEM_EXTENSIONS +# ------------------------ +# Enable extensions on systems that normally disable them, +# typically due to standards-conformance issues. +AC_DEFUN([gl_USE_SYSTEM_EXTENSIONS], [ + AC_BEFORE([$0], [AC_COMPILE_IFELSE]) + AC_BEFORE([$0], [AC_RUN_IFELSE]) + + AC_REQUIRE([AC_GNU_SOURCE]) + AC_REQUIRE([AC_AIX]) + AC_REQUIRE([AC_MINIX]) + + AH_VERBATIM([__EXTENSIONS__], +[/* Enable extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif]) + AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__], + [ac_cv_safe_to_define___extensions__], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([ + #define __EXTENSIONS__ 1 + AC_INCLUDES_DEFAULT])], + [ac_cv_safe_to_define___extensions__=yes], + [ac_cv_safe_to_define___extensions__=no])]) + test $ac_cv_safe_to_define___extensions__ = yes && + AC_DEFINE([__EXTENSIONS__]) + AC_DEFINE([_POSIX_PTHREAD_SEMANTICS]) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/getopt.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/getopt.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/getopt.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/getopt.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,83 @@ +# getopt.m4 serial 13 +dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# The getopt module assume you want GNU getopt, with getopt_long etc, +# rather than vanilla POSIX getopt. This means your code should +# always include for the getopt prototypes. + +AC_DEFUN([gl_GETOPT_SUBSTITUTE], +[ + AC_LIBOBJ([getopt]) + AC_LIBOBJ([getopt1]) + gl_GETOPT_SUBSTITUTE_HEADER + gl_PREREQ_GETOPT +]) + +AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER], +[ + GETOPT_H=getopt.h + AC_DEFINE([__GETOPT_PREFIX], [[rpl_]], + [Define to rpl_ if the getopt replacement functions and variables + should be used.]) + AC_SUBST([GETOPT_H]) +]) + +AC_DEFUN([gl_GETOPT_CHECK_HEADERS], +[ + if test -z "$GETOPT_H"; then + AC_CHECK_HEADERS([getopt.h], [], [GETOPT_H=getopt.h]) + fi + + if test -z "$GETOPT_H"; then + AC_CHECK_FUNCS([getopt_long_only], [], [GETOPT_H=getopt.h]) + fi + + dnl BSD getopt_long uses an incompatible method to reset option processing, + dnl and (as of 2004-10-15) mishandles optional option-arguments. + if test -z "$GETOPT_H"; then + AC_CHECK_DECL([optreset], [GETOPT_H=getopt.h], [], [#include ]) + fi + + dnl Solaris 10 getopt doesn't handle `+' as a leading character in an + dnl option string (as of 2005-05-05). + if test -z "$GETOPT_H"; then + AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_gnu_getopt], + [AC_RUN_IFELSE( + [AC_LANG_PROGRAM([#include ], + [[ + char *myargv[3]; + myargv[0] = "conftest"; + myargv[1] = "-+"; + myargv[2] = 0; + return getopt (2, myargv, "+a") != '?'; + ]])], + [gl_cv_func_gnu_getopt=yes], + [gl_cv_func_gnu_getopt=no], + [dnl cross compiling - pessimistically guess based on decls + dnl Solaris 10 getopt doesn't handle `+' as a leading character in an + dnl option string (as of 2005-05-05). + AC_CHECK_DECL([getopt_clip], + [gl_cv_func_gnu_getopt=no], [gl_cv_func_gnu_getopt=yes], + [#include ])])]) + if test "$gl_cv_func_gnu_getopt" = "no"; then + GETOPT_H=getopt.h + fi + fi +]) + +AC_DEFUN([gl_GETOPT_IFELSE], +[ + AC_REQUIRE([gl_GETOPT_CHECK_HEADERS]) + AS_IF([test -n "$GETOPT_H"], [$1], [$2]) +]) + +AC_DEFUN([gl_GETOPT], [gl_GETOPT_IFELSE([gl_GETOPT_SUBSTITUTE])]) + +# Prerequisites of lib/getopt*. +AC_DEFUN([gl_PREREQ_GETOPT], +[ + AC_CHECK_DECLS_ONCE([getenv]) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/gettimeofday.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/gettimeofday.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/gettimeofday.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/gettimeofday.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,80 @@ +#serial 7 + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +dnl From Jim Meyering. +dnl +dnl See if gettimeofday clobbers the static buffer that localtime uses +dnl for its return value. The gettimeofday function from Mac OS X 10.0.4 +dnl (i.e., Darwin 1.3.7) has this problem. +dnl +dnl If it does, then arrange to use gettimeofday and localtime only via +dnl the wrapper functions that work around the problem. + +AC_DEFUN([AC_FUNC_GETTIMEOFDAY_CLOBBER], +[ + AC_REQUIRE([AC_HEADER_TIME]) + AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer], + jm_cv_func_gettimeofday_clobber, + [AC_TRY_RUN([ +#include +#include + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include + +int +main () +{ + time_t t = 0; + struct tm *lt; + struct tm saved_lt; + struct timeval tv; + lt = localtime (&t); + saved_lt = *lt; + gettimeofday (&tv, NULL); + if (memcmp (lt, &saved_lt, sizeof (struct tm)) != 0) + exit (1); + + exit (0); +} + ], + jm_cv_func_gettimeofday_clobber=no, + jm_cv_func_gettimeofday_clobber=yes, + dnl When crosscompiling, assume it is broken. + jm_cv_func_gettimeofday_clobber=yes) + ]) + if test $jm_cv_func_gettimeofday_clobber = yes; then + gl_GETTIMEOFDAY_REPLACE_LOCALTIME + + AC_DEFINE(gettimeofday, rpl_gettimeofday, + [Define to rpl_gettimeofday if the replacement function should be used.]) + gl_PREREQ_GETTIMEOFDAY + fi +]) + +AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [ + AC_LIBOBJ(gettimeofday) + AC_DEFINE(gmtime, rpl_gmtime, + [Define to rpl_gmtime if the replacement function should be used.]) + AC_DEFINE(localtime, rpl_localtime, + [Define to rpl_localtime if the replacement function should be used.]) +]) + +# Prerequisites of lib/gettimeofday.c. +AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [ + AC_REQUIRE([AC_HEADER_TIME]) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/gnulib-comp.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/gnulib-comp.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/gnulib-comp.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/gnulib-comp.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,177 @@ +# Copyright (C) 2004-2006 Free Software Foundation, Inc. +# +# This file is free software, distributed under the terms of the GNU +# General Public License. As a special exception to the GNU General +# Public License, this file may be distributed as part of a program +# that contains a configuration script generated by Autoconf, under +# the same distribution terms as the rest of that program. +# +# Generated by gnulib-tool. +# +# This file represents the compiled summary of the specification in +# gnulib-cache.m4. It lists the computed macro invocations that need +# to be invoked from configure.ac. +# In projects using CVS, this file can be treated like other built files. + + +# This macro should be invoked from ./configure.ac, in the section +# "Checks for programs", right after AC_PROG_CC, and certainly before +# any checks for libraries, header files, types and library functions. +AC_DEFUN([gl_EARLY], +[ + AC_REQUIRE([AC_PROG_RANLIB]) + AC_REQUIRE([AC_GNU_SOURCE]) + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) +]) + +# This macro should be invoked from ./configure.ac, in the section +# "Check for header files, types and library functions". +AC_DEFUN([gl_INIT], +[ + AM_CONDITIONAL([GL_COND_LIBTOOL], [false]) + gl_FUNC_ALLOCA + gl_ARGP + gl_FUNC_ARGZ + gl_DIRNAME + gl_ERROR + gl_EXITFAIL + dnl gl_USE_SYSTEM_EXTENSIONS must be added quite early to configure.ac. + gl_GETOPT + AC_FUNC_GETTIMEOFDAY_CLOBBER + gl_MBCHAR + gl_MBITER + gl_FUNC_MEMCHR + gl_FUNC_MEMPCPY + gl_MINMAX + gl_C_RESTRICT + gl_SIZE_MAX + AM_STDBOOL_H + gl_STRCASE + gl_FUNC_STRCHRNUL + gl_FUNC_STRNDUP + gl_FUNC_STRNLEN + gl_SYSEXITS + gl_HEADER_UNISTD + gl_FUNC_VASNPRINTF + gl_FUNC_VSNPRINTF + gl_FUNC_WCWIDTH + gl_XALLOC + gl_XSIZE + gl_XSTRNDUP +]) + +# This macro records the list of files which have been installed by +# gnulib-tool and may be removed by future gnulib-tool invocations. +AC_DEFUN([gl_FILE_LIST], [ + lib/alloca.c + lib/alloca_.h + lib/argp-ba.c + lib/argp-eexst.c + lib/argp-fmtstream.c + lib/argp-fmtstream.h + lib/argp-fs-xinl.c + lib/argp-help.c + lib/argp-namefrob.h + lib/argp-parse.c + lib/argp-pin.c + lib/argp-pv.c + lib/argp-pvh.c + lib/argp-xinl.c + lib/argp.h + lib/argz.c + lib/argz_.h + lib/asnprintf.c + lib/basename.c + lib/dirname.c + lib/dirname.h + lib/error.c + lib/error.h + lib/exit.h + lib/exitfail.c + lib/exitfail.h + lib/getopt.c + lib/getopt1.c + lib/getopt_.h + lib/getopt_int.h + lib/gettext.h + lib/gettimeofday.c + lib/mbchar.c + lib/mbchar.h + lib/mbuiter.h + lib/memchr.c + lib/mempcpy.c + lib/mempcpy.h + lib/minmax.h + lib/printf-args.c + lib/printf-args.h + lib/printf-parse.c + lib/printf-parse.h + lib/size_max.h + lib/stdbool_.h + lib/strcase.h + lib/strcasecmp.c + lib/strchrnul.c + lib/strchrnul.h + lib/stripslash.c + lib/strncasecmp.c + lib/strndup.c + lib/strndup.h + lib/strnlen.c + lib/strnlen.h + lib/strnlen1.c + lib/strnlen1.h + lib/sysexit_.h + lib/vasnprintf.c + lib/vasnprintf.h + lib/vsnprintf.c + lib/vsnprintf.h + lib/wcwidth.h + lib/xalloc-die.c + lib/xalloc.h + lib/xmalloc.c + lib/xsize.h + lib/xstrndup.c + lib/xstrndup.h + m4/alloca.m4 + m4/argp.m4 + m4/argz.m4 + m4/dirname.m4 + m4/dos.m4 + m4/double-slash-root.m4 + m4/eoverflow.m4 + m4/error.m4 + m4/exitfail.m4 + m4/extensions.m4 + m4/getopt.m4 + m4/gettimeofday.m4 + m4/intmax_t.m4 + m4/inttypes_h.m4 + m4/longdouble.m4 + m4/longlong.m4 + m4/mbchar.m4 + m4/mbiter.m4 + m4/mbrtowc.m4 + m4/memchr.m4 + m4/mempcpy.m4 + m4/minmax.m4 + m4/restrict.m4 + m4/signed.m4 + m4/size_max.m4 + m4/stdbool.m4 + m4/stdint_h.m4 + m4/strcase.m4 + m4/strchrnul.m4 + m4/strerror_r.m4 + m4/strndup.m4 + m4/strnlen.m4 + m4/sysexits.m4 + m4/unistd_h.m4 + m4/vasnprintf.m4 + m4/vsnprintf.m4 + m4/wchar_t.m4 + m4/wcwidth.m4 + m4/wint_t.m4 + m4/xalloc.m4 + m4/xsize.m4 + m4/xstrndup.m4 +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/intmax_t.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/intmax_t.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/intmax_t.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/intmax_t.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,61 @@ +# intmax_t.m4 serial 4 +dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define intmax_t to 'long' or 'long long' +# if it is not already defined in or . + +AC_DEFUN([gl_AC_TYPE_INTMAX_T], +[ + dnl For simplicity, we assume that a header file defines 'intmax_t' if and + dnl only if it defines 'uintmax_t'. + AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([gl_AC_HEADER_STDINT_H]) + if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to long or long long if and don't define.]) + else + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in or .]) + fi +]) + +dnl An alternative would be to explicitly test for 'intmax_t'. + +AC_DEFUN([gt_AC_TYPE_INTMAX_T], +[ + AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([gl_AC_HEADER_STDINT_H]) + AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t, + [AC_TRY_COMPILE([ +#include +#include +#if HAVE_STDINT_H_WITH_UINTMAX +#include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +#include +#endif +], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)]) + if test $gt_cv_c_intmax_t = yes; then + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in or .]) + else + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to long or long long if and don't define.]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/inttypes_h.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/inttypes_h.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/inttypes_h.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/inttypes_h.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,26 @@ +# inttypes_h.m4 serial 6 +dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([gl_AC_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + gl_cv_header_inttypes_h=yes, + gl_cv_header_inttypes_h=no)]) + if test $gl_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/longdouble.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/longdouble.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/longdouble.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/longdouble.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,31 @@ +# longdouble.m4 serial 2 (gettext-0.15) +dnl Copyright (C) 2002-2003, 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. +dnl Test whether the compiler supports the 'long double' type. +dnl Prerequisite: AC_PROG_CC + +dnl This file is only needed in autoconf <= 2.59. Newer versions of autoconf +dnl have a macro AC_TYPE_LONG_DOUBLE with identical semantics. + +AC_DEFUN([gt_TYPE_LONGDOUBLE], +[ + AC_CACHE_CHECK([for long double], gt_cv_c_long_double, + [if test "$GCC" = yes; then + gt_cv_c_long_double=yes + else + AC_TRY_COMPILE([ + /* The Stardent Vistra knows sizeof(long double), but does not support it. */ + long double foo = 0.0; + /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ + int array [2*(sizeof(long double) >= sizeof(double)) - 1]; + ], , + gt_cv_c_long_double=yes, gt_cv_c_long_double=no) + fi]) + if test $gt_cv_c_long_double = yes; then + AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/longlong.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/longlong.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/longlong.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/longlong.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,44 @@ +# longlong.m4 serial 6 +dnl Copyright (C) 1999-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_LONG_LONG_INT if 'long long int' works. +# This fixes a bug in Autoconf 2.60, but can be removed once we +# assume 2.61 everywhere. + +AC_DEFUN([AC_TYPE_LONG_LONG_INT], +[ + AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[long long int ll = 9223372036854775807ll; + long long int nll = -9223372036854775807LL; + typedef int a[((-9223372036854775807LL < 0 + && 0 < 9223372036854775807ll) + ? 1 : -1)]; + int i = 63;]], + [[long long int llmax = 9223372036854775807ll; + return (ll << 63 | ll >> 63 | ll < i | ll > i + | llmax / ll | llmax % ll);]])], + [ac_cv_type_long_long_int=yes], + [ac_cv_type_long_long_int=no])]) + if test $ac_cv_type_long_long_int = yes; then + AC_DEFINE([HAVE_LONG_LONG_INT], 1, + [Define to 1 if the system has the type `long long int'.]) + fi +]) + +# This macro is obsolescent and should go away soon. +AC_DEFUN([gl_AC_TYPE_LONG_LONG], +[ + AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) + ac_cv_type_long_long=$ac_cv_type_long_long_int + if test $ac_cv_type_long_long = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, + [Define if you have the 'long long' type.]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/mbchar.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/mbchar.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/mbchar.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/mbchar.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,20 @@ +# mbchar.m4 serial 2 +dnl Copyright (C) 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl autoconf tests required for use of mbchar.m4 +dnl From Bruno Haible. + +AC_DEFUN([gl_MBCHAR], +[ + AC_REQUIRE([AC_GNU_SOURCE]) + dnl The following line is that so the user can test + dnl HAVE_WCHAR_H && HAVE_WCTYPE_H before #include "mbchar.h". + AC_CHECK_HEADERS_ONCE(wchar.h wctype.h) + dnl Compile mbchar.c only if HAVE_WCHAR_H && HAVE_WCTYPE_H. + if test $ac_cv_header_wchar_h = yes && test $ac_cv_header_wctype_h = yes; then + AC_LIBOBJ([mbchar]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/mbiter.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/mbiter.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/mbiter.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/mbiter.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,17 @@ +# mbiter.m4 serial 2 +dnl Copyright (C) 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl autoconf tests required for use of mbiter.h +dnl From Bruno Haible. + +AC_DEFUN([gl_MBITER], +[ + AC_REQUIRE([AC_TYPE_MBSTATE_T]) + dnl The following line is that so the user can test HAVE_MBRTOWC before + dnl #include "mbiter.h" or "mbuiter.h". + AC_REQUIRE([gl_FUNC_MBRTOWC]) + : +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/mbrtowc.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/mbrtowc.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/mbrtowc.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/mbrtowc.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,31 @@ +# mbrtowc.m4 serial 8 +dnl Copyright (C) 2001-2002, 2004-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert + +dnl This file can be removed, and gl_FUNC_MBRTOWC replaced with +dnl AC_FUNC_MBRTOWC, when autoconf 2.60 can be assumed everywhere. + +AC_DEFUN([gl_FUNC_MBRTOWC], +[ + dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60. + AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared], + gl_cv_func_mbrtowc, + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[wchar_t wc; + char const s[] = ""; + size_t n = 1; + mbstate_t state; + return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])], + gl_cv_func_mbrtowc=yes, + gl_cv_func_mbrtowc=no)]) + if test $gl_cv_func_mbrtowc = yes; then + AC_DEFINE([HAVE_MBRTOWC], 1, + [Define to 1 if mbrtowc and mbstate_t are properly declared.]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/memchr.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/memchr.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/memchr.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/memchr.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,18 @@ +# memchr.m4 serial 4 +dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_MEMCHR], +[ + AC_REPLACE_FUNCS(memchr) + if test $ac_cv_func_memchr = no; then + gl_PREREQ_MEMCHR + fi +]) + +# Prerequisites of lib/memchr.c. +AC_DEFUN([gl_PREREQ_MEMCHR], [ + AC_CHECK_HEADERS(bp-sym.h) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/mempcpy.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/mempcpy.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/mempcpy.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/mempcpy.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,23 @@ +# mempcpy.m4 serial 3 +dnl Copyright (C) 2003, 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_MEMPCPY], +[ + AC_LIBSOURCES([mempcpy.c, mempcpy.h]) + + dnl Persuade glibc to declare mempcpy(). + AC_REQUIRE([AC_GNU_SOURCE]) + + AC_REPLACE_FUNCS(mempcpy) + if test $ac_cv_func_mempcpy = no; then + gl_PREREQ_MEMPCPY + fi +]) + +# Prerequisites of lib/mempcpy.c. +AC_DEFUN([gl_PREREQ_MEMPCPY], [ + : +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/minmax.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/minmax.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/minmax.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/minmax.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,41 @@ +# minmax.m4 serial 2 +dnl Copyright (C) 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_PREREQ(2.52) + +AC_DEFUN([gl_MINMAX], +[ + AC_REQUIRE([gl_PREREQ_MINMAX]) +]) + +# Prerequisites of lib/minmax.h. +AC_DEFUN([gl_PREREQ_MINMAX], +[ + gl_MINMAX_IN_HEADER([limits.h]) + gl_MINMAX_IN_HEADER([sys/param.h]) +]) + +dnl gl_MINMAX_IN_HEADER(HEADER) +dnl The parameter has to be a literal header name; it cannot be macro, +dnl nor a shell variable. (Because autoheader collects only AC_DEFINE +dnl invocations with a literal macro name.) +AC_DEFUN([gl_MINMAX_IN_HEADER], +[ + m4_pushdef([header], AS_TR_SH([$1])) + m4_pushdef([HEADER], AS_TR_CPP([$1])) + AC_CACHE_CHECK([whether <$1> defines MIN and MAX], + [gl_cv_minmax_in_]header, + [AC_TRY_COMPILE([#include <$1> +int x = MIN (42, 17);], [], + [gl_cv_minmax_in_]header[=yes], + [gl_cv_minmax_in_]header[=no])]) + if test $gl_cv_minmax_in_[]header = yes; then + AC_DEFINE([HAVE_MINMAX_IN_]HEADER, 1, + [Define to 1 if <$1> defines the MIN and MAX macros.]) + fi + m4_popdef([HEADER]) + m4_popdef([header]) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/onceonly_2_57.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/onceonly_2_57.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/onceonly_2_57.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/onceonly_2_57.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,86 @@ +# onceonly_2_57.m4 serial 4 +dnl Copyright (C) 2002-2003, 2005-2006 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl This file defines some "once only" variants of standard autoconf macros. +dnl AC_CHECK_HEADERS_ONCE like AC_CHECK_HEADERS +dnl AC_CHECK_FUNCS_ONCE like AC_CHECK_FUNCS +dnl AC_CHECK_DECLS_ONCE like AC_CHECK_DECLS +dnl AC_REQUIRE([AC_FUNC_STRCOLL]) like AC_FUNC_STRCOLL +dnl The advantage is that the check for each of the headers/functions/decls +dnl will be put only once into the 'configure' file. It keeps the size of +dnl the 'configure' file down, and avoids redundant output when 'configure' +dnl is run. +dnl The drawback is that the checks cannot be conditionalized. If you write +dnl if some_condition; then gl_CHECK_HEADERS(stdlib.h); fi +dnl inside an AC_DEFUNed function, the gl_CHECK_HEADERS macro call expands to +dnl empty, and the check will be inserted before the body of the AC_DEFUNed +dnl function. + +dnl This is like onceonly.m4, except that it uses diversions to named sections +dnl DEFAULTS and INIT_PREPARE in order to check all requested headers at once, +dnl thus reducing the size of 'configure'. Works with autoconf-2.57. The +dnl size reduction is ca. 9%. + +dnl Autoconf version 2.57 or newer is recommended. +AC_PREREQ(2.57) + +# AC_CHECK_HEADERS_ONCE(HEADER1 HEADER2 ...) is a once-only variant of +# AC_CHECK_HEADERS(HEADER1 HEADER2 ...). +AC_DEFUN([AC_CHECK_HEADERS_ONCE], [ + : + AC_FOREACH([gl_HEADER_NAME], [$1], [ + AC_DEFUN([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME, + [./-], [___])), [ + m4_divert_text([INIT_PREPARE], + [gl_header_list="$gl_header_list gl_HEADER_NAME"]) + gl_HEADERS_EXPANSION + AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_HEADER_NAME])), + [Define to 1 if you have the <]m4_defn([gl_HEADER_NAME])[> header file.]) + ]) + AC_REQUIRE([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME, + [./-], [___]))) + ]) +]) +m4_define([gl_HEADERS_EXPANSION], [ + m4_divert_text([DEFAULTS], [gl_header_list=]) + AC_CHECK_HEADERS([$gl_header_list]) + m4_define([gl_HEADERS_EXPANSION], []) +]) + +# AC_CHECK_FUNCS_ONCE(FUNC1 FUNC2 ...) is a once-only variant of +# AC_CHECK_FUNCS(FUNC1 FUNC2 ...). +AC_DEFUN([AC_CHECK_FUNCS_ONCE], [ + : + AC_FOREACH([gl_FUNC_NAME], [$1], [ + AC_DEFUN([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]), [ + m4_divert_text([INIT_PREPARE], + [gl_func_list="$gl_func_list gl_FUNC_NAME"]) + gl_FUNCS_EXPANSION + AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_FUNC_NAME])), + [Define to 1 if you have the `]m4_defn([gl_FUNC_NAME])[' function.]) + ]) + AC_REQUIRE([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME])) + ]) +]) +m4_define([gl_FUNCS_EXPANSION], [ + m4_divert_text([DEFAULTS], [gl_func_list=]) + AC_CHECK_FUNCS([$gl_func_list]) + m4_define([gl_FUNCS_EXPANSION], []) +]) + +# AC_CHECK_DECLS_ONCE(DECL1 DECL2 ...) is a once-only variant of +# AC_CHECK_DECLS(DECL1, DECL2, ...). +AC_DEFUN([AC_CHECK_DECLS_ONCE], [ + : + AC_FOREACH([gl_DECL_NAME], [$1], [ + AC_DEFUN([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]), [ + AC_CHECK_DECLS(m4_defn([gl_DECL_NAME])) + ]) + AC_REQUIRE([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME])) + ]) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/restrict.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/restrict.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/restrict.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/restrict.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,38 @@ +#serial 1003 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# This macro can be removed once we can rely on Autoconf 2.57a or later, +# since we can then use its AC_C_RESTRICT. + +# gl_C_RESTRICT +# -------------- +# Determine whether the C/C++ compiler supports the "restrict" keyword +# introduced in ANSI C99, or an equivalent. Do nothing if the compiler +# accepts it. Otherwise, if the compiler supports an equivalent, +# define "restrict" to be that. Here are some variants: +# - GCC supports both __restrict and __restrict__ +# - older DEC Alpha C compilers support only __restrict +# - _Restrict is the only spelling accepted by Sun WorkShop 6 update 2 C +# Otherwise, define "restrict" to be empty. +AC_DEFUN([gl_C_RESTRICT], +[AC_CACHE_CHECK([for C/C++ restrict keyword], gl_cv_c_restrict, + [gl_cv_c_restrict=no + # Try the official restrict keyword, then gcc's __restrict, and + # the less common variants. + for ac_kw in restrict __restrict __restrict__ _Restrict; do + AC_COMPILE_IFELSE([AC_LANG_SOURCE( + [float * $ac_kw x;])], + [gl_cv_c_restrict=$ac_kw; break]) + done + ]) + case $gl_cv_c_restrict in + restrict) ;; + no) AC_DEFINE(restrict,, + [Define to equivalent of C99 restrict keyword, or to nothing if this + is not supported. Do not define if restrict is supported directly.]) ;; + *) AC_DEFINE_UNQUOTED(restrict, $gl_cv_c_restrict) ;; + esac +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/signed.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/signed.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/signed.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/signed.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,17 @@ +# signed.m4 serial 1 (gettext-0.10.40) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([bh_C_SIGNED], +[ + AC_CACHE_CHECK([for signed], bh_cv_c_signed, + [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)]) + if test $bh_cv_c_signed = no; then + AC_DEFINE(signed, , + [Define to empty if the C compiler doesn't support this keyword.]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/size_max.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/size_max.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/size_max.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/size_max.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,60 @@ +# size_max.m4 serial 4 +dnl Copyright (C) 2003, 2005-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([gl_SIZE_MAX], +[ + AC_CHECK_HEADERS(stdint.h) + dnl First test whether the system already has SIZE_MAX. + AC_MSG_CHECKING([for SIZE_MAX]) + result= + AC_EGREP_CPP([Found it], [ +#include +#if HAVE_STDINT_H +#include +#endif +#ifdef SIZE_MAX +Found it +#endif +], result=yes) + if test -z "$result"; then + dnl Define it ourselves. Here we assume that the type 'size_t' is not wider + dnl than the type 'unsigned long'. Try hard to find a definition that can + dnl be used in a preprocessor #if, i.e. doesn't contain a cast. + _AC_COMPUTE_INT([sizeof (size_t) * CHAR_BIT - 1], size_t_bits_minus_1, + [#include +#include ], size_t_bits_minus_1=) + _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint, + [#include ], fits_in_uint=) + if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then + if test $fits_in_uint = 1; then + dnl Even though SIZE_MAX fits in an unsigned int, it must be of type + dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. + AC_TRY_COMPILE([#include + extern size_t foo; + extern unsigned long foo; + ], [], fits_in_uint=0) + fi + dnl We cannot use 'expr' to simplify this expression, because 'expr' + dnl works only with 'long' integers in the host environment, while we + dnl might be cross-compiling from a 32-bit platform to a 64-bit platform. + if test $fits_in_uint = 1; then + result="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" + else + result="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" + fi + else + dnl Shouldn't happen, but who knows... + result='((size_t)~(size_t)0)' + fi + fi + AC_MSG_RESULT([$result]) + if test "$result" != yes; then + AC_DEFINE_UNQUOTED([SIZE_MAX], [$result], + [Define as the maximum value of type 'size_t', if the system doesn't define it.]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/stdbool.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/stdbool.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/stdbool.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/stdbool.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,115 @@ +# Check for stdbool.h that conforms to C99. + +dnl Copyright (C) 2002-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# Prepare for substituting if it is not supported. + +AC_DEFUN([AM_STDBOOL_H], +[ + AC_REQUIRE([AC_HEADER_STDBOOL]) + + # Define two additional variables used in the Makefile substitution. + + if test "$ac_cv_header_stdbool_h" = yes; then + STDBOOL_H='' + else + STDBOOL_H='stdbool.h' + fi + AC_SUBST([STDBOOL_H]) + + if test "$ac_cv_type__Bool" = yes; then + HAVE__BOOL=1 + else + HAVE__BOOL=0 + fi + AC_SUBST([HAVE__BOOL]) +]) + +# AM_STDBOOL_H will be renamed to gl_STDBOOL_H in the future. +AC_DEFUN([gl_STDBOOL_H], [AM_STDBOOL_H]) + +# This macro is only needed in autoconf <= 2.59. Newer versions of autoconf +# have this macro built-in. + +AC_DEFUN([AC_HEADER_STDBOOL], + [AC_CACHE_CHECK([for stdbool.h that conforms to C99], + [ac_cv_header_stdbool_h], + [AC_TRY_COMPILE( + [ + #include + #ifndef bool + "error: bool is not defined" + #endif + #ifndef false + "error: false is not defined" + #endif + #if false + "error: false is not 0" + #endif + #ifndef true + "error: true is not defined" + #endif + #if true != 1 + "error: true is not 1" + #endif + #ifndef __bool_true_false_are_defined + "error: __bool_true_false_are_defined is not defined" + #endif + + struct s { _Bool s: 1; _Bool t; } s; + + char a[true == 1 ? 1 : -1]; + char b[false == 0 ? 1 : -1]; + char c[__bool_true_false_are_defined == 1 ? 1 : -1]; + char d[(bool) 0.5 == true ? 1 : -1]; + bool e = &s; + char f[(_Bool) 0.0 == false ? 1 : -1]; + char g[true]; + char h[sizeof (_Bool)]; + char i[sizeof s.t]; + enum { j = false, k = true, l = false * true, m = true * 256 }; + _Bool n[m]; + char o[sizeof n == m * sizeof n[0] ? 1 : -1]; + char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; + #if defined __xlc__ || defined __GNUC__ + /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 + reported by James Lemley on 2005-10-05; see + http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html + This test is not quite right, since xlc is allowed to + reject this program, as the initializer for xlcbug is + not one of the forms that C requires support for. + However, doing the test right would require a run-time + test, and that would make cross-compilation harder. + Let us hope that IBM fixes the xlc bug, and also adds + support for this kind of constant expression. In the + meantime, this test will reject xlc, which is OK, since + our stdbool.h substitute should suffice. We also test + this with GCC, where it should work, to detect more + quickly whether someone messes up the test in the + future. */ + char digs[] = "0123456789"; + int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); + #endif + /* Catch a bug in an HP-UX C compiler. See + http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html + http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html + */ + _Bool q = true; + _Bool *pq = &q; + ], + [ + *pq |= q; + *pq |= ! q; + /* Refer to every declared value, to avoid compiler optimizations. */ + return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + + !m + !n + !o + !p + !q + !pq); + ], + [ac_cv_header_stdbool_h=yes], + [ac_cv_header_stdbool_h=no])]) + AC_CHECK_TYPES([_Bool]) + if test $ac_cv_header_stdbool_h = yes; then + AC_DEFINE(HAVE_STDBOOL_H, 1, [Define to 1 if stdbool.h conforms to C99.]) + fi]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/stdint_h.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/stdint_h.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/stdint_h.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/stdint_h.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,26 @@ +# stdint_h.m4 serial 5 +dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_STDINT_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([gl_AC_HEADER_STDINT_H], +[ + AC_CACHE_CHECK([for stdint.h], gl_cv_header_stdint_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + gl_cv_header_stdint_h=yes, + gl_cv_header_stdint_h=no)]) + if test $gl_cv_header_stdint_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/strcase.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/strcase.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/strcase.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/strcase.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,39 @@ +# strcase.m4 serial 3 +dnl Copyright (C) 2002, 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_STRCASE], +[ + gl_FUNC_STRCASECMP + gl_FUNC_STRNCASECMP +]) + +AC_DEFUN([gl_FUNC_STRCASECMP], +[ + dnl No known system has a strcasecmp() function that works correctly in + dnl multibyte locales. Therefore we use our version always. + AC_LIBOBJ(strcasecmp) + AC_DEFINE(strcasecmp, rpl_strcasecmp, [Define to rpl_strcasecmp always.]) + gl_PREREQ_STRCASECMP +]) + +AC_DEFUN([gl_FUNC_STRNCASECMP], +[ + AC_REPLACE_FUNCS(strncasecmp) + if test $ac_cv_func_strncasecmp = no; then + gl_PREREQ_STRNCASECMP + fi +]) + +# Prerequisites of lib/strcasecmp.c. +AC_DEFUN([gl_PREREQ_STRCASECMP], [ + AC_REQUIRE([gl_FUNC_MBRTOWC]) + : +]) + +# Prerequisites of lib/strncasecmp.c. +AC_DEFUN([gl_PREREQ_STRNCASECMP], [ + : +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/strchrnul.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/strchrnul.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/strchrnul.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/strchrnul.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,19 @@ +# strchrnul.m4 serial 3 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_STRCHRNUL], +[ + dnl Persuade glibc to declare strchrnul(). + AC_REQUIRE([AC_GNU_SOURCE]) + + AC_REPLACE_FUNCS(strchrnul) + if test $ac_cv_func_strchrnul = no; then + gl_PREREQ_STRCHRNUL + fi +]) + +# Prerequisites of lib/strchrnul.c. +AC_DEFUN([gl_PREREQ_STRCHRNUL], [:]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/strndup.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/strndup.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/strndup.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/strndup.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,54 @@ +# strndup.m4 serial 7 +dnl Copyright (C) 2002-2003, 2005-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_STRNDUP], +[ + AC_LIBSOURCES([strndup.c, strndup.h]) + + dnl Persuade glibc to declare strndup(). + AC_REQUIRE([AC_GNU_SOURCE]) + + AC_CHECK_DECLS_ONCE([strndup]) + + # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'. + AC_CACHE_CHECK([for working strndup], gl_cv_func_strndup, + [AC_RUN_IFELSE([ + AC_LANG_PROGRAM([ +#include +#include + ], [[ +#ifndef HAVE_DECL_STRNDUP + extern char *strndup (const char *, size_t); +#endif + char *s; + s = strndup ("some longer string", 15); + free (s); + s = strndup ("shorter string", 13); + return s[13] != '\0';]])], + [gl_cv_func_strndup=yes], + [gl_cv_func_strndup=no], + [AC_CHECK_FUNC([strndup], + [AC_EGREP_CPP([too risky], [ +#ifdef _AIX + too risky +#endif + ], + [gl_cv_func_strndup=no], + [gl_cv_func_strndup=yes])], + [gl_cv_func_strndup=no])])]) + if test $gl_cv_func_strndup = yes; then + AC_DEFINE([HAVE_STRNDUP], 1, + [Define if you have the strndup() function and it works.]) + else + AC_LIBOBJ([strndup]) + AC_DEFINE(strndup, rpl_strndup, + [Define to rpl_strndup if the replacement function should be used,]) + gl_PREREQ_STRNDUP + fi +]) + +# Prerequisites of lib/strndup.c. +AC_DEFUN([gl_PREREQ_STRNDUP], [:]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/strnlen.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/strnlen.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/strnlen.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/strnlen.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,29 @@ +# strnlen.m4 serial 5 +dnl Copyright (C) 2002-2003, 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_STRNLEN], +[ + AC_LIBSOURCES([strnlen.c, strnlen.h]) + + dnl Persuade glibc to declare strnlen(). + AC_REQUIRE([AC_GNU_SOURCE]) + + AC_FUNC_STRNLEN + if test $ac_cv_func_strnlen_working = no; then + # This is necessary because automake-1.6.1 doens't understand + # that the above use of AC_FUNC_STRNLEN means we may have to use + # lib/strnlen.c. + #AC_LIBOBJ(strnlen) + AC_DEFINE(strnlen, rpl_strnlen, + [Define to rpl_strnlen if the replacement function should be used.]) + gl_PREREQ_STRNLEN + fi +]) + +# Prerequisites of lib/strnlen.c. +AC_DEFUN([gl_PREREQ_STRNLEN], [ + AC_CHECK_DECLS_ONCE(strnlen) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/sysexits.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/sysexits.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/sysexits.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/sysexits.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,13 @@ +# sysexits.m4 serial 2 +dnl Copyright (C) 2003,2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_SYSEXITS], +[ + AC_CHECK_HEADERS(sysexits.h, + [SYSEXITS_H=], + [SYSEXITS_H=sysexits.h]) + AC_SUBST([SYSEXITS_H]) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/unistd_h.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/unistd_h.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/unistd_h.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/unistd_h.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,18 @@ +# unistd_h.m4 serial 2 +dnl Copyright (C) 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Written by Simon Josefsson + +AC_DEFUN([gl_HEADER_UNISTD], +[ + dnl Prerequisites of lib/unistd.h. + AC_CHECK_HEADERS([unistd.h], [ + UNISTD_H='' + ], [ + UNISTD_H='unistd.h' + ]) + AC_SUBST(UNISTD_H) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/vasnprintf.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/vasnprintf.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/vasnprintf.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/vasnprintf.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,58 @@ +# vasnprintf.m4 serial 5 +dnl Copyright (C) 2002-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_VASNPRINTF], +[ + AC_REQUIRE([gl_EOVERFLOW]) + AC_REPLACE_FUNCS(vasnprintf) + if test $ac_cv_func_vasnprintf = no; then + AC_LIBOBJ(printf-args) + AC_LIBOBJ(printf-parse) + AC_LIBOBJ(asnprintf) + gl_PREREQ_PRINTF_ARGS + gl_PREREQ_PRINTF_PARSE + gl_PREREQ_VASNPRINTF + gl_PREREQ_ASNPRINTF + fi +]) + +# Prequisites of lib/printf-args.h, lib/printf-args.c. +AC_DEFUN([gl_PREREQ_PRINTF_ARGS], +[ + AC_REQUIRE([bh_C_SIGNED]) + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + AC_REQUIRE([gt_TYPE_LONGDOUBLE]) + AC_REQUIRE([gt_TYPE_WCHAR_T]) + AC_REQUIRE([gt_TYPE_WINT_T]) +]) + +# Prequisites of lib/printf-parse.h, lib/printf-parse.c. +AC_DEFUN([gl_PREREQ_PRINTF_PARSE], +[ + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + AC_REQUIRE([gt_TYPE_LONGDOUBLE]) + AC_REQUIRE([gt_TYPE_WCHAR_T]) + AC_REQUIRE([gt_TYPE_WINT_T]) + AC_REQUIRE([AC_TYPE_SIZE_T]) + AC_CHECK_TYPES(ptrdiff_t) + AC_REQUIRE([gt_AC_TYPE_INTMAX_T]) +]) + +# Prerequisites of lib/vasnprintf.c. +AC_DEFUN([gl_PREREQ_VASNPRINTF], +[ + AC_REQUIRE([AC_FUNC_ALLOCA]) + AC_REQUIRE([gl_AC_TYPE_LONG_LONG]) + AC_REQUIRE([gt_TYPE_LONGDOUBLE]) + AC_REQUIRE([gt_TYPE_WCHAR_T]) + AC_REQUIRE([gt_TYPE_WINT_T]) + AC_CHECK_FUNCS(snprintf wcslen) +]) + +# Prerequisites of lib/asnprintf.c. +AC_DEFUN([gl_PREREQ_ASNPRINTF], +[ +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/vsnprintf.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/vsnprintf.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/vsnprintf.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/vsnprintf.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,15 @@ +# vsnprintf.m4 serial 2 +dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_VSNPRINTF], +[ + AC_REPLACE_FUNCS(vsnprintf) + AC_CHECK_DECLS_ONCE(vsnprintf) + gl_PREREQ_VSNPRINTF +]) + +# Prerequisites of lib/vsnprintf.c. +AC_DEFUN([gl_PREREQ_VSNPRINTF], [:]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/wchar_t.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/wchar_t.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/wchar_t.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/wchar_t.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,20 @@ +# wchar_t.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. +dnl Test whether has the 'wchar_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WCHAR_T], +[ + AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t, + [AC_TRY_COMPILE([#include + wchar_t foo = (wchar_t)'\0';], , + gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)]) + if test $gt_cv_c_wchar_t = yes; then + AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/wcwidth.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/wcwidth.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/wcwidth.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/wcwidth.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,26 @@ +# wcwidth.m4 serial 3 +dnl Copyright (C) 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_WCWIDTH], +[ + dnl Persuade glibc to declare wcwidth(). + AC_REQUIRE([AC_GNU_SOURCE]) + + AC_REQUIRE([AC_C_INLINE]) + AC_REQUIRE([gt_TYPE_WCHAR_T]) + + AC_CHECK_HEADERS_ONCE([wchar.h wctype.h]) + AC_CHECK_FUNCS_ONCE([iswprint wcwidth]) + + AC_CHECK_DECLS([wcwidth], [], [], [ +/* AIX 3.2.5 declares wcwidth in . */ +#if HAVE_STRING_H +# include +#endif +#if HAVE_WCHAR_H +# include +#endif +])]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/wint_t.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/wint_t.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/wint_t.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/wint_t.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,20 @@ +# wint_t.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. +dnl Test whether has the 'wint_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WINT_T], +[ + AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t, + [AC_TRY_COMPILE([#include + wint_t foo = (wchar_t)'\0';], , + gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)]) + if test $gt_cv_c_wint_t = yes; then + AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.]) + fi +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/xalloc.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/xalloc.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/xalloc.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/xalloc.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,25 @@ +# xalloc.m4 serial 12 +dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_XALLOC], +[ + AC_LIBSOURCES([xmalloc.c, xalloc.h]) + AC_LIBOBJ([xmalloc]) + + gl_PREREQ_XALLOC + gl_PREREQ_XMALLOC +]) + +# Prerequisites of lib/xalloc.h. +AC_DEFUN([gl_PREREQ_XALLOC], [ + : +]) + +# Prerequisites of lib/xmalloc.c. +AC_DEFUN([gl_PREREQ_XMALLOC], [ + AC_REQUIRE([AC_C_INLINE]) + : +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/xsize.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/xsize.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/xsize.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/xsize.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,13 @@ +# xsize.m4 serial 3 +dnl Copyright (C) 2003-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_XSIZE], +[ + dnl Prerequisites of lib/xsize.h. + AC_REQUIRE([gl_SIZE_MAX]) + AC_REQUIRE([AC_C_INLINE]) + AC_CHECK_HEADERS(stdint.h) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/xstrndup.m4 kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/xstrndup.m4 --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/m4/xstrndup.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/m4/xstrndup.m4 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,15 @@ +# xstrndup.m4 serial 2 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_XSTRNDUP], +[ + gl_PREREQ_XSTRNDUP +]) + +# Prerequisites of lib/xstrndup.c. +AC_DEFUN([gl_PREREQ_XSTRNDUP], [ + : +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,49 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = lib libltdl src config +EXTRA_DIST = scripts THANKS +DISTCHECK_CONFIGURE_FLAGS = --without-xscreensaver +ACLOCAL_AMFLAGS = -I m4 + +AM_ETAGSFLAGS = --extra=fq + +dist_noinst_DATA = rsxs.spec +rsxs.spec: ChangeLog scripts/install.awk scripts/install.awk scripts/verify.awk + +rpm: dist + rpmbuild -ta $(PACKAGE)-$(VERSION).tar.gz + +mock: dist + TOPDIR="`rpm -E %_topdir`" || exit 1 && \ + rpmbuild --define='fedora 4' --define='dist .fc4' --nodeps -ts $(PACKAGE)-$(VERSION).tar.gz && \ + mockbuild -r fedora-4-i386-core.cfg --debug "$$TOPDIR/SRPMS/$(PACKAGE)-$(VERSION)-$(RELEASE).fc4.src.rpm" && \ + rpmbuild --define='fedora 5' --define='dist .fc5' --nodeps -ts $(PACKAGE)-$(VERSION).tar.gz && \ + mockbuild -r fedora-5-i386-core.cfg --debug "$$TOPDIR/SRPMS/$(PACKAGE)-$(VERSION)-$(RELEASE).fc5.src.rpm" + +if HACKMODE +install-data-hook: + @$(NORMAL_INSTALL) + if test -f $(defaultdir)/XScreenSaver; then \ + TMPFILE=`mktemp /tmp/$$$$.XXXXXX` || exit 1 && \ + trap "rm -f $$TMPFILE" 0 && \ + $(AWK) -v 'skip=@DISABLED_HACKS@' -f $(srcdir)/scripts/install.awk < $(defaultdir)/XScreenSaver > $$TMPFILE && \ + $(mkinstalldirs) $(DESTDIR)$(defaultdir) && \ + $(SHELL) $(install_sh_DATA) $$TMPFILE $(DESTDIR)$(defaultdir)/XScreenSaver; \ + fi + +uninstall-hook: + @$(NORMAL_UNINSTALL) + if test -f $(defaultdir)/XScreenSaver; then \ + TMPFILE=`mktemp /tmp/$$$$.XXXXXX` || exit 1 && \ + trap "rm -f $$TMPFILE" 0 && \ + $(AWK) -v 'skip=@DISABLED_HACKS@' -f $(srcdir)/scripts/uninstall.awk < $(defaultdir)/XScreenSaver > $$TMPFILE && \ + $(mkinstalldirs) $(DESTDIR)$(defaultdir) && \ + $(SHELL) $(install_sh_DATA) $$TMPFILE $(defaultdir)/XScreenSaver; \ + fi + +else !HACKMODE +install-data-hook: + +uninstall-hook: + +endif !HACKMODE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/NEWS kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/NEWS --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/NEWS 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/NEWS 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1 @@ +Please see the ChangeLog file for more information. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/README kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/README --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/README 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/README 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,131 @@ +Really Slick XScreenSavers +========================== + +1. Description +-------------- + +Really Slick XScreenSavers (rsxs) is an X11 port of the Really Slick +Screensavers collection by Terry Welsh (http://www.reallyslick.com/). + +This collection of screensavers is designed to integrate with Jamie Zawinski's +XScreenSaver package. Alternatively, the screensavers can be run as +stand-alone applications. + +rsxs contains the following eye-candy: + +* rs-cyclone: Tornadoes on your monitor. +* rs-euphoria: Don't look at this if you suffer from motion sickness! +* rs-fieldlines: A simulation of the electric field lines between charged + particles. +* rs-flocks: 3D swarms of colorful bugs. +* rs-flux: A particle system based on strange attractor equations. +* rs-helios: Exploding particles and smooth Helion surfaces. +* rs-hyperspace: Soar through wormholes in liquid spacetime. +* rs-lattice: Fly through an infinite lattice of interlocking rings. +* rs-plasma: Psychadelic gooey plasma goodness. +* rs-skyrocket: The mother of all fireworks screensavers. +* rs-solarwinds: A mesmerising color and movement particle effect. + +2. Requirements +--------------- + +To build rsxs you will need: + +* A C++ compiler and standard C++ library (including STL). + +* An accelerated graphics card. + +* An X server with GLX extensions. To test for this, run `xdpyinfo' and look + for GLX in the list of extensions. + + You will also want direct rendering enabled, otherwise the screensavers will + run _extremely_ slowly. To find out if this is enabled, use `glxinfo' (it + should say "direct rendering: Yes".) + +* X development headers and libraries. If you've got them, `configure' should + find them. + +* OpenGL development headers and libraries. The names of these vary from + system to system. If `configure' doesn't find them, please email me with your + system type and the correct names via the bug-reporting address below. + +rsxs also has the following _optional_ requirements: + +* XScreenSaver -- preferably version 4, though it should work fine on earlier + versions. `configure' will try to determine the correct paths to install + files. If XScreenSaver isn't found, the screensavers will simply be installed + in the standard binary directory (usually /usr/local/bin), just like any + other program. + +* libpng development headers and libraries. `configure' should have no trouble + finding these if you've got them, as the filenames are standardised. + + If you do not have libpng (or choose to disable it through a `configure' + option), the screensavers that load textures at run-time will not be built + or installed. + +* OpenAL development headers and libraries. Only one screensaver (rs-skyrocket) + has a dependency on these; if they are missing then sound will be disabled. + OpenAL can be obtained from http://www.openal.org. + +* libvorbisfile development headers and libraries. The rs-skyrocket + screensaver, when built with OpenAL sound support, requires this to load + OGG audio files. Again, if these are not available then sound will be + disabled. + + libvorbisfile is part of the OGG Vorbis libraries, available at + http://www.xiph.org. + +3. Installation +--------------- + +In general, the standard + +$ ./configure +$ make + +# make install + +will do what you want. To get any currently running xscreensaver daemon to +see the new screensavers you will need to restart it: + +$ xscreensaver-command -restart + +The configure script accepts a large range of command-line options. These are +described in the accompanying INSTALL document -- please read this if you wish +to disable specific screensavers or disable one of the optional packages +described above. + +4. Usage +-------- + +Each of the rs-* screensavers can be run independently. Providing no arguments +will run them with default parameters in a window. Each screensaver can also +accept the following arguments: + + --root Draw on the root window + --geometry GEOM Draw on a window of the specified geometry + (WxH+X+Y) + --fullscreen Draw on a maximized window + +For more information on the parameters an rsxs screensaver takes, run it with +the --help option. + +5. Bugs +------- + +Probably. Please mail reports to and include: + +* What the bug does +* What you did to make the bug appear +* Whether it is reproducable or not + +If the program dumped a core file, please also include a backtrace. + +6. Legal Stuff +-------------- + +rsxs is released under the terms and conditions of the GNU General Public +License version 2. Please read the COPYING file carefully. + +-- Michael Chapman diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/README.xbmc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/README.xbmc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/README.xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/README.xbmc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,10 @@ +Run configure: + +1. compile the stuff +sudo apt-get install libxt-dev libxmu-dev +./configure --without-xscreensaver --disable-sound +make + +2. create the shared library for each screensaver. for example to create plasma: +cd src/plasma +make -f Makefile.xbmc diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/rsxs.spec.in kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/rsxs.spec.in --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/rsxs.spec.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/rsxs.spec.in 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,162 @@ +# Default options: --with sound --with dlopen --with xscreensaver +# +# --without sound: disables all sound support. +# --without dlopen: links with OpenAL and libvorbisfile at compile-time, +# rather than deferring it to run-time. +# --without xscreensaver: +# produce stand-alone programs only. + +%{?_with_sound: %{?_without_sound:%{error:both '--with sound' and '--without sound' specified}}} +%{?_with_dlopen:%{?_without_sound:%{error:both '--with dlopen' and '--without dlopen' specified}}} +%{?_with_xscreensaver: %{?_without_xscreensaver:%{error:both '--with xscreensaver' and '--without xscreensaver' specified}}} + +%{?_without_sound: %define _configure_sound --disable-sound} +%{!?_without_sound:%define _configure_sound --enable-sound%{!?_without_dlopen:=dlopen}} + +# Expand hackdir -- configure leaves this unexpanded so that +# one could do "make install exec_prefix=..." +%define _hackdir %(exec_prefix="%{_exec_prefix}"; echo "@hackdir@") + +# Sanity check: don't allow --with xscreensaver if xscreensaver wasn't +# around when rsxs.spec was generated by configure, because we really don't +# know where files are supposed to go... +%if "@xscreensaver@" == "yes" && 0%{!?_without_xscreensaver:1} + + %define _defaultdir @defaultdir@ + %define _configdir @configdir@ + %define __xscreensaver_command /usr/bin/xscreensaver-command + + %define _configure_xscreensaver --with-xscreensaver --with-defaultdir=%{_defaultdir} --with-hackdir=%{_hackdir} --with-configdir=%{_configdir} + %define _use_xscreensaver 1 + +%else + + %define _configure_xscreensaver --without-xscreensaver + +%endif + +%define _configure_opts %{_configure_sound} %{_configure_xscreensaver} --enable-image + +# %{dist} and %{fedora} are reliable, and they're used in mock. +# But if we don't have %{fedora}, try to determine it programmatically... +%if "0%{?fedora}" == "0" +%define fedora %(awk '{print $4}' /etc/fedora-release 2>/dev/null || echo 0) +%endif + +Name: @PACKAGE_TARNAME@ +Version: @PACKAGE_VERSION@ +Release: @RELEASE@%{?dist} +License: GPL +Source0: @PACKAGE_TARNAME@-@PACKAGE_VERSION@.tar.gz +URL: http://rsxs.sourceforge.net/ +BuildRoot: %{_tmppath}/%{name}-%{version}-root +%if "%{fedora}" >= "5" +BuildRequires: libSM-devel, libICE-devel, libXmu-devel, libXt-devel +%else +BuildRequires: XFree86-devel +%endif +BuildRequires: libGL-devel, libGLU-devel, libpng-devel +%{!?_without_sound:BuildRequires: openal-devel, libvorbis-devel} +Summary: @PACKAGE_NAME@ +Group: Amusements/Graphics +Requires: mktemp%{?_use_xscreensaver:, xscreensaver} +Obsoletes: @PACKAGE_TARNAME@-nosound +Provides: @PACKAGE_TARNAME@-nosound + +%description +The @PACKAGE_NAME@ package is an X11/GLX port of the +Really Slick Screensavers collection, by Terry Welsh +(http://www.reallyslick.com). + +%prep +%setup -q -n @PACKAGE_TARNAME@-@PACKAGE_VERSION@ + +%build +%{configure} %{_configure_opts} +%{__make} + +%install +if test "$RPM_BUILD_ROOT" != "/"; then + %{__rm} -rf $RPM_BUILD_ROOT +fi +%{makeinstall} \ + %{?_defaultdir:defaultdir=$RPM_BUILD_ROOT%{_defaultdir}} \ + hackdir=$RPM_BUILD_ROOT%{_hackdir} \ + %{?_configdir:configdir=$RPM_BUILD_ROOT%{_configdir}} + +%clean +if test "$RPM_BUILD_ROOT" != "/"; then + %{__rm} -rf $RPM_BUILD_ROOT +fi + +%if 0%{?_use_xscreensaver} + +%post +echo "Installing screensavers into %{_defaultdir}/XScreenSaver" +TMPFILE1=`mktemp %{_tmppath}/$$.XXXXXX` || exit 1; +TMPFILE2=`mktemp %{_tmppath}/$$.XXXXXX` || exit 1; +trap "%{__rm} -f $TMPFILE1 $TMPFILE2" 0 +%{__cat} <<"EOF" > $TMPFILE1 +@INSTALL_AWK@ +EOF +%{__awk} -f $TMPFILE1 < %{_defaultdir}/XScreenSaver > $TMPFILE2 +%{__chmod} a+r $TMPFILE2 +%{__mv} -f $TMPFILE2 %{_defaultdir}/XScreenSaver +# Can't just use return code from xscreensaver-command due to +# "xscreensaver window unexpectedly deleted" quirk +if %{__xscreensaver_command} -version &> /dev/null; then + echo "Restarting XScreenSaver" + %{__xscreensaver_command} --restart &> /dev/null || : +fi + +%preun +if test $1 -eq 0; then + echo "Removing screensavers from %{_defaultdir}/XScreenSaver" + TMPFILE1=`mktemp %{_tmppath}/$$.XXXXXX` || exit 1; + TMPFILE2=`mktemp %{_tmppath}/$$.XXXXXX` || exit 1; + trap "%{__rm} -f $TMPFILE1 $TMPFILE2" 0 + %{__cat} <<"EOF" > $TMPFILE1 +@UNINSTALL_AWK@ +EOF + %{__awk} -f $TMPFILE1 < %{_defaultdir}/XScreenSaver > $TMPFILE2 + %{__chmod} a+r $TMPFILE2 + %{__mv} -f $TMPFILE2 %{_defaultdir}/XScreenSaver + # Can't just use return code from xscreensaver-command due to + # "xscreensaver window unexpectedly deleted" quirk + if %{__xscreensaver_command} -version &> /dev/null; then + echo "Restarting XScreenSaver" + %{__xscreensaver_command} --restart &> /dev/null || : + fi +fi + +%verifyscript +echo "Checking screensavers are in %{_defaultdir}/XScreenSaver" +TMPFILE1=`mktemp %{_tmppath}/$$.XXXXXX` || exit 1; +TMPFILE2=`mktemp %{_tmppath}/$$.XXXXXX` || exit 1; +trap "%{__rm} -f $TMPFILE1 $TMPFILE2" 0 +%{__cat} <<"EOF" > $TMPFILE1 +@VERIFY_AWK@ +EOF +%{__awk} -f $TMPFILE1 < %{_defaultdir}/XScreenSaver > $TMPFILE2 +if test $? -eq 0; then + echo "All screensavers correctly installed" +else + echo "Some screensavers not correctly installed" + echo "%{_defaultdir}/XScreenSaver does not have the following screensavers:" + %{__cat} $TMPFILE2 +fi + +%endif + +%files +%defattr(-,root,root) +%doc AUTHORS COPYING ChangeLog INSTALL README THANKS +%if 0%{?_use_xscreensaver} +%{_hackdir}/rs-* +%{_configdir}/rs-* +%endif +%{_bindir}/rs-* +%{_datadir}/@PACKAGE_TARNAME@ + +%changelog +@CHANGELOG@ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/scripts/install.awk kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/scripts/install.awk --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/scripts/install.awk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/scripts/install.awk 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,87 @@ +BEGIN { + if (skip !~ /cyclone/) + add["rs-cyclone"] = " GL: \"Really Slick Cyclones\" rs-cyclone -root \\n\\" + + if (skip !~ /euphoria/) { + add["\\(regular\\)\" rs-euphoria"] = " GL: \"Really Slick Euphoria (regular)\" rs-euphoria -stringy -root \\n\\" + add["\\(grid\\)\" rs-euphoria"] = " GL: \"Really Slick Euphoria (grid)\" rs-euphoria -wisps 4 -background 1 -density 25 -visibility 70 -speed 15 -wireframe -root \\n\\" + add["\\(cubism\\)\" rs-euphoria"] = " GL: \"Really Slick Euphoria (cubism)\" rs-euphoria -wisps 15 -background 0 -density 4 -visibility 15 -speed 10 -root \\n\\" + add["\\(bad math\\)\" rs-euphoria"] = " GL: \"Really Slick Euphoria (bad math)\" rs-euphoria -wisps 2 -background 2 -density 20 -visibility 35 -speed 30 -feedback 40 -feedbacksize 5 -feedbacksize 8 -wireframe -lines -root \\n\\" + add["\\(M-theory\\)\" rs-euphoria"] = " GL: \"Really Slick Euphoria (M-theory)\" rs-euphoria -wisps 3 -background 0 -density 25 -visibility 35 -speed 20 -feedback 40 -feedbackspeed 20 -feedbacksize 8 -root \\n\\" + add["\\(UHF TEM\\)\" rs-euphoria"] = " GL: \"Really Slick Euphoria (UHF TEM)\" rs-euphoria -wisps 0 -background 3 -density 35 -visibility 5 -speed 50 -root \\n\\" + add["\\(nowhere\\)\" rs-euphoria"] = " GL: \"Really Slick Euphoria (nowhere)\" rs-euphoria -wisps 0 -background 3 -density 30 -visibility 40 -speed 20 -feedback 80 -feedbackspeed 10 -feedbacksize 8 -wireframe -random -root \\n\\" + add["\\(echo\\)\" rs-euphoria"] = " GL: \"Really Slick Euphoria (echo)\" rs-euphoria -wisps 3 -background 0 -density 25 -visibility 30 -speed 20 -feedback 85 -feedbackspeed 30 -feedbacksize 8 -plasma -root \\n\\" + add["\\(kaleidoscope\\)\" rs-euphoria"] = " GL: \"Really Slick Euphoria (kaleidoscope)\" rs-euphoria -wisps 3 -background 0 -density 25 -visibility 40 -speed 15 -feedback 90 -feedbackspeed 3 -feedbacksize 8 -root \\n\\" + } + + if (skip !~ /fieldlines/) + add["rs-fieldlines"] = " GL: \"Really Slick Fieldlines\" rs-fieldlines -root \\n\\" + + if (skip !~ /flocks/) + add["rs-flocks"] = " GL: \"Really Slick Flocks\" rs-flocks -root \\n\\" + + if (skip !~ /flux/) { + add["\\(regular\\)\" rs-flux"] = " GL: \"Really Slick Flux (regular)\" rs-flux -root \\n\\" + add["\\(hypnotic\\)\" rs-flux"] = " GL: \"Really Slick Flux (hypnotic)\" rs-flux -fluxes 2 -particles 10 -length 40 -lights -size 15 -randomness 80 -speed 20 -rotation 0 -wind 40 -instability 10 -blur 30 -root \\n\\" + add["\\(insane\\)\" rs-flux"] = " GL: \"Really Slick Flux (insane)\" rs-flux -fluxes 4 -particles 30 -length 8 -lights -size 25 -randomness 0 -speed 80 -rotation 60 -wind 40 -instability 100 -blur 10 -root \\n\\" + add["\\(sparklers\\)\" rs-flux"] = " GL: \"Really Slick Flux (sparklers)\" rs-flux -fluxes 3 -particles 20 -length 6 -spheres -size 20 -randomness 85 -speed 60 -rotation 30 -wind 20 -instability 30 -blur 0 -root \\n\\" + add["\\(paradigm\\)\" rs-flux"] = " GL: \"Really Slick Flux (paradigm)\" rs-flux -fluxes 1 -particles 40 -length 40 -lights -size 5 -randomness 90 -speed 30 -rotation 20 -wind 10 -instability 5 -blur 10 -root \\n\\" + add["\\(fusion\\)\" rs-flux"] = " GL: \"Really Slick Flux (fusion)\" rs-flux -fluxes 10 -particles 3 -length 10 -lights -size 100 -randomness 0 -speed 50 -rotation 30 -wind 40 -instability 35 -blur 50 -root \\n\\" + } + + if (skip !~ /helios/) + add["rs-helios"] = " GL: \"Really Slick Helios\" rs-helios -root \\n\\" + + if (skip !~ /hyperspace/) + add["rs-hyperspace"] = " GL: \"Really Slick Hyperspace\" rs-hyperspace -root \\n\\" + + if (skip !~ /lattice/) { + add["\\(regular\\)\" rs-lattice"] = " GL: \"Really Slick Lattice (regular)\" rs-lattice -root \\n\\" + add["\\(chainmail\\)\" rs-lattice"] = " GL: \"Really Slick Lattice (chainmail)\" rs-lattice -longitude 24 -latitude 12 -thickness 50 -density 80 -depth 3 -chrome -smooth -root \\n\\" + add["\\(brass mesh\\)\" rs-lattice"] = " GL: \"Really Slick Lattice (brass mesh)\" rs-lattice -longitude 4 -latitude 4 -thickness 40 -density 50 -depth 4 -brass -no-smooth -root \\n\\" + add["\\(computer\\)\" rs-lattice"] = " GL: \"Really Slick Lattice (computer)\" rs-lattice -longitude 4 -latitude 6 -thickness 70 -density 90 -depth 4 -circuits -no-smooth -root \\n\\" + add["\\(slick\\)\" rs-lattice"] = " GL: \"Really Slick Lattice (slick)\" rs-lattice -longitude 24 -latitude 12 -thickness 100 -density 30 -depth 4 -shiny -smooth -root \\n\\" + add["\\(tasty\\)\" rs-lattice"] = " GL: \"Really Slick Lattice (tasty)\" rs-lattice -longitude 24 -latitude 12 -thickness 100 -density 25 -depth 4 -donuts -smooth -root \\n\\" + } + + if (skip !~ /plasma/) + add["rs-plasma"] = " GL: \"Really Slick Plasma\" rs-plasma -root \\n\\" + + if (skip !~ /skyrocket/) + add["rs-skyrocket"] = " GL: \"Really Slick Skyrocket\" rs-skyrocket -volume 0 -root \\n\\" + + if (skip !~ /solarwinds/) { + add["\\(regular\\)\" rs-solarwinds"] = " GL: \"Really Slick Solar Winds (regular)\" rs-solarwinds -root \\n\\" + add["\\(cosmic strings\\)\" rs-solarwinds"] = " GL: \"Really Slick Solar Winds (cosmic strings)\" rs-solarwinds -winds 1 -emitters 50 -particles 3000 -lines -size 20 -windspeed 10 -emitterspeed 10 -speed 10 -blur 10 -root \\n\\" + add["\\(cold pricklies\\)\" rs-solarwinds"] = " GL: \"Really Slick Solar Winds (cold pricklies)\" rs-solarwinds -winds 1 -emitters 300 -particles 3000 -lines -size 5 -windspeed 20 -emitterspeed 100 -speed 15 -blur 70 -root \\n\\" + add["\\(space fur\\)\" rs-solarwinds"] = " GL: \"Really Slick Solar Winds (space fur)\" rs-solarwinds -winds 2 -emitters 400 -particles 1600 -lines -size 15 -windspeed 20 -emitterspeed 15 -speed 10 -blur 0 -root \\n\\" + add["\\(jiggly\\)\" rs-solarwinds"] = " GL: \"Really Slick Solar Winds (jiggly)\" rs-solarwinds -winds 1 -emitters 40 -particles 1200 -points -size 20 -windspeed 100 -emitterspeed 20 -speed 4 -blur 50 -root \\n\\" + add["\\(undertow\\)\" rs-solarwinds"] = " GL: \"Really Slick Solar Winds (undertow)\" rs-solarwinds -winds 1 -emitters 400 -particles 1200 -lights -size 40 -windspeed 20 -emitterspeed 1 -speed 100 -blur 50 -root \\n\\" + } +} + +/^[ \t]*\*programs:/ { + print + output = "" + do { + getline + output = output $0 ORS + x = 0 + for (name in add) + if ($0 ~ name) + remove[++x] = name + for (; x > 0; --x) + delete add[remove[x]] + } while ($0 ~ /\\$/) + for (name in add) { + print add[name] + } + ORS="" + print output + next +} + +! /^[ \t]*\*programs:/ { + ORS="\n" + print +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/scripts/uninstall.awk kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/scripts/uninstall.awk --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/scripts/uninstall.awk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/scripts/uninstall.awk 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,85 @@ +BEGIN { + if (skip !~ /cyclone/) + remove["rs-cyclone"] = 1 + + if (skip !~ /euphoria/) { + remove["\\(regular\\)\" rs-euphoria"] = 1 + remove["\\(grid\\)\" rs-euphoria"] = 1 + remove["\\(cubism\\)\" rs-euphoria"] = 1 + remove["\\(bad math\\)\" rs-euphoria"] = 1 + remove["\\(M-theory\\)\" rs-euphoria"] = 1 + remove["\\(UHF TEM\\)\" rs-euphoria"] = 1 + remove["\\(nowhere\\)\" rs-euphoria"] = 1 + remove["\\(echo\\)\" rs-euphoria"] = 1 + remove["\\(kaleidoscope\\)\" rs-euphoria"] = 1 + } + + if (skip !~ /fieldlines/) + remove["rs-fieldlines"] = 1 + + if (skip !~ /flocks/) + remove["rs-flocks"] = 1 + + if (skip !~ /flux/) { + remove["\\(regular\\)\" rs-flux"] = 1 + remove["\\(hypnotic\\)\" rs-flux"] = 1 + remove["\\(insane\\)\" rs-flux"] = 1 + remove["\\(sparklers\\)\" rs-flux"] = 1 + remove["\\(paradigm\\)\" rs-flux"] = 1 + remove["\\(fusion\\)\" rs-flux"] = 1 + } + + if (skip !~ /helios/) + remove["rs-helios"] = 1 + + if (skip !~ /hyperspace/) + remove["rs-hyperspace"] = 1 + + if (skip !~ /lattice/) { + remove["\\(regular\\)\" rs-lattice"] = 1 + remove["\\(chainmail\\)\" rs-lattice"] = 1 + remove["\\(brass mesh\\)\" rs-lattice"] = 1 + remove["\\(computer\\)\" rs-lattice"] = 1 + remove["\\(slick\\)\" rs-lattice"] = 1 + remove["\\(tasty\\)\" rs-lattice"] = 1 + } + + if (skip !~ /plasma/) + remove["rs-plasma"] = 1 + + if (skip !~ /skyrocket/) + remove["rs-skyrocket"] = 1 + + if (skip !~ /solarwinds/) { + remove["\\(regular\\)\" rs-solarwinds"] = 1 + remove["\\(cosmic strings\\)\" rs-solarwinds"] = 1 + remove["\\(cold pricklies\\)\" rs-solarwinds"] = 1 + remove["\\(space fur\\)\" rs-solarwinds"] = 1 + remove["\\(jiggly\\)\" rs-solarwinds"] = 1 + remove["\\(undertow\\)\" rs-solarwinds"] = 1 + } +} + +/^[ \t]*\*programs:/ { + print + output = "" + do { + getline + doRemove = "" + for (name in remove) + if ($0 ~ name) + doRemove = name + if (doRemove) + delete remove[doRemove] + else + output = output $0 ORS + } while ($0 ~ /\\$/) + ORS="" + print output + next +} + +! /^[ \t]*\*programs:/ { + ORS="\n" + print +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/scripts/verify.awk kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/scripts/verify.awk --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/scripts/verify.awk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/scripts/verify.awk 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,86 @@ +BEGIN { + if (skip !~ /cyclone/) + verify["rs-cyclone"] = 1 + + if (skip !~ /euphoria/) { + verify["\\(regular\\)\" rs-euphoria"] = 1 + verify["\\(grid\\)\" rs-euphoria"] = 1 + verify["\\(cubism\\)\" rs-euphoria"] = 1 + verify["\\(bad math\\)\" rs-euphoria"] = 1 + verify["\\(M-theory\\)\" rs-euphoria"] = 1 + verify["\\(UHF TEM\\)\" rs-euphoria"] = 1 + verify["\\(nowhere\\)\" rs-euphoria"] = 1 + verify["\\(echo\\)\" rs-euphoria"] = 1 + verify["\\(kaleidoscope\\)\" rs-euphoria"] = 1 + } + + if (skip !~ /fieldlines/) + verify["rs-fieldlines"] = 1 + + if (skip !~ /flocks/) + verify["rs-flocks"] = 1 + + if (skip !~ /flux/) { + verify["\\(regular\\)\" rs-flux"] = 1 + verify["\\(hypnotic\\)\" rs-flux"] = 1 + verify["\\(insane\\)\" rs-flux"] = 1 + verify["\\(sparklers\\)\" rs-flux"] = 1 + verify["\\(paradigm\\)\" rs-flux"] = 1 + verify["\\(fusion\\)\" rs-flux"] = 1 + } + + if (skip !~ /helios/) + verify["rs-helios"] = 1 + + if (skip !~ /hyperspace/) + verify["rs-helios"] = 1 + + if (skip !~ /lattice/) { + verify["\\(regular\\)\" rs-lattice"] = 1 + verify["\\(chainmail\\)\" rs-lattice"] = 1 + verify["\\(brass mesh\\)\" rs-lattice"] = 1 + verify["\\(computer\\)\" rs-lattice"] = 1 + verify["\\(slick\\)\" rs-lattice"] = 1 + verify["\\(tasty\\)\" rs-lattice"] = 1 + } + + if (skip !~ /plasma/) + verify["rs-plasma"] = 1 + + if (skip !~ /skyrocket/) + verify["rs-skyrocket"] = 1 + + if (skip !~ /solarwinds/) { + verify["\\(regular\\)\" rs-solarwinds"] = 1 + verify["\\(cosmic strings\\)\" rs-solarwinds"] = 1 + verify["\\(cold pricklies\\)\" rs-solarwinds"] = 1 + verify["\\(space fur\\)\" rs-solarwinds"] = 1 + verify["\\(jiggly\\)\" rs-solarwinds"] = 1 + verify["\\(undertow\\)\" rs-solarwinds"] = 1 + } +} + +/^[ \t]*\*programs:/ { + output = "" + do { + getline + doRemove = "" + for (name in verify) + if ($0 ~ name) + doVerify = name + if (doVerify) + delete verify[doVerify] + output = output $0 ORS + } while ($0 ~ /\\$/) + next +} + +END { + ORS="\n" + count = 0 + for (name in verify) { + ++count + print name + } + exit count +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/color.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/color.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/color.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/color.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,219 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include + +/* + * This library converts between colors defined with RGB values and HSL + * values. It also finds in-between colors by moving linearly through + * HSL space. + * All functions take values for r, g, b, h, s, and l between 0.0 and 1.0 + * (RGB = red, green, blue; HSL = hue, saturation, luminosity) + */ + +/* + * For the 'tween functions, a tween value of 0.0 will output the first + * color while a tween value of 1.0 will output the second color. + * A value of false for direction indicates a positive progression around + * the color wheel (i.e. red -> yellow -> green -> cyan...). A value of + * true does the opposite. + */ + +RGBColor::operator HSLColor() const { + unsigned int huezone = 0; + float rr, gg, bb, h, s, l; + + // find huezone + if (_v[0] >= _v[1]) { + huezone = 0; + if (_v[2] > _v[0]) + huezone = 4; + else { + if (_v[2] > _v[1]) + huezone = 5; + } + } else { + huezone = 1; + if (_v[2] > _v[1]) + huezone = 2; + else { + if (_v[2] > _v[0]) + huezone = 3; + } + } + + // luminosity + switch (huezone) { + case 0: + case 5: + l = _v[0]; + rr = 1.0f; + gg = _v[1] / l; + bb = _v[2] / l; + break; + case 1: + case 2: + l = _v[1]; + gg = 1.0f; + rr = _v[0] / l; + bb = _v[2] / l; + break; + default: + l = _v[2]; + bb = 1.0f; + rr = _v[0] / l; + gg = _v[1] / l; + } + + if (l == 0.0) + return HSLColor(0, 1, 0); + + // saturation + switch (huezone) { + case 0: + case 1: + s = 1.0f - _v[2]; + bb = 0.0f; + rr = 1.0f - ((1.0f - rr) / s); + gg = 1.0f - ((1.0f - gg) / s); + break; + case 2: + case 3: + s = 1.0f - _v[0]; + rr = 0.0f; + gg = 1.0f - ((1.0f - gg) / s); + bb = 1.0f - ((1.0f - bb) / s); + break; + default: + s = 1.0f - _v[1]; + gg = 0.0f; + rr = 1.0f - ((1.0f - rr) / s); + bb = 1.0f - ((1.0f - bb) / s); + } + + // hue + switch (huezone) { + case 0: + h = _v[1] / 6.0f; + break; + case 1: + h = ((1.0f - _v[0]) / 6.0f) + 0.166667f; + break; + case 2: + h = (_v[2] / 6.0f) + 0.333333f; + break; + case 3: + h = ((1.0f - _v[1]) / 6.0f) + 0.5f; + break; + case 4: + h = (_v[0] / 6.0f) + 0.666667f; + break; + default: + h = ((1.0f - _v[2]) / 6.0f) + 0.833333f; + } + + return HSLColor(h, s, l); +} + +RGBColor RGBColor::tween(const RGBColor& a, const RGBColor& b, + float tween, bool direction) { + return HSLColor::tween(HSLColor(a), HSLColor(b), tween, direction); +} + +HSLColor::operator RGBColor() const { + float r, g, b; + + // hue influence + if (_v[0] < 0.166667) { // full red, some green + r = 1.0; + g = _v[0] * 6.0f; + b = 0.0; + } else { + if (_v[0] < 0.5) { // full green + g = 1.0; + if (_v[0] < 0.333333) { // some red + r = 1.0f - ((_v[0] - 0.166667f) * 6.0f); + b = 0.0; + } else { // some blue + b = (_v[0] - 0.333333f) * 6.0f; + r = 0.0; + } + } else { + if (_v[0] < 0.833333) { // full blue + b = 1.0; + if (_v[0] < 0.666667) { // some green + g = 1.0f - ((_v[0] - 0.5f) * 6.0f); + r = 0.0; + } else { // some red + r = (_v[0] - 0.666667f) * 6.0f; + g = 0.0; + } + } else { // full red, some blue + r = 1.0; + b = 1.0f - ((_v[0] - 0.833333f) * 6.0f); + g = 0.0; + } + } + } + + // saturation influence + r = 1.0f - (_v[1] * (1.0f - r)); + g = 1.0f - (_v[1] * (1.0f - g)); + b = 1.0f - (_v[1] * (1.0f - b)); + + // luminosity influence + return RGBColor(r * _v[2], g * _v[2], b * _v[2]); +} + +HSLColor HSLColor::tween(const HSLColor& a, const HSLColor& b, + float tween, bool direction) { + float h, s, l; + + // hue + if (!direction) { // forward around color wheel + if (b.h() >= a.h()) + h = a.h() + (tween * (b.h() - a.h())); + else { + h = a.h() + (tween * (1.0f - (a.h() - b.h()))); + if (h > 1.0) + h -= 1.0; + } + } else { // backward around color wheel + if (a.h() >= b.h()) + h = a.h() - (tween * (a.h() - b.h())); + else { + h = a.h() - (tween * (1.0f - (b.h() - a.h()))); + if (h < 0.0) + h += 1.0; + } + } + + // saturation + s = a.s() + (tween * (b.s() - a.s())); + + // luminosity + l = a.l() + (tween * (b.l() - a.l())); + + return HSLColor(h, s, l); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/color.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/color.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/color.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/color.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,158 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _COLOR_HH +#define _COLOR_HH + +#include + +#include + +class HSLColor; + +class RGBColor : protected Vector { +public: + RGBColor(const float*& v) : Vector(v) {} + RGBColor( + float r = 0.0f, float g = 0.0f, float b = 0.0f + ) : Vector(r, g, b) {} + + operator HSLColor() const; + + using Vector::set; + using Vector::get; + + RGBColor operator+(const RGBColor& v) const { + return RGBColor( + _v[0] + v._v[0], _v[1] + v._v[1], _v[2] + v._v[2] + ); + } + + RGBColor operator-(const RGBColor& v) const { + return RGBColor( + _v[0] - v._v[0], _v[1] - v._v[1], _v[2] - v._v[2] + ); + } + + RGBColor operator*(float f) const { + return RGBColor(_v[0] * f, _v[1] * f, _v[2] * f); + } + + RGBColor operator/(float f) const { + return RGBColor(_v[0] / f, _v[1] / f, _v[2] / f); + } + + RGBColor& operator+=(const RGBColor& v) { + _v[0] += v._v[0]; + _v[1] += v._v[1]; + _v[2] += v._v[2]; + return *this; + } + + RGBColor& operator*=(float f) { + _v[0] *= f; + _v[1] *= f; + _v[2] *= f; + return *this; + } + + RGBColor& operator/=(float f) { + _v[0] /= f; + _v[1] /= f; + _v[2] /= f; + return *this; + } + + const float& r() const { return x(); } + float& r() { return x(); } + const float& g() const { return y(); } + float& g() { return y(); } + const float& b() const { return z(); } + float& b() { return z(); } + + void clamp() { + if (_v[0] > 1) + _v[0] = 1; + if (_v[0] < 0) + _v[0] = 0; + if (_v[1] > 1) + _v[1] = 1; + if (_v[1] < 0) + _v[1] = 0; + if (_v[2] > 1) + _v[2] = 1; + if (_v[2] < 0) + _v[2] = 0; + } + + static RGBColor tween( + const RGBColor&, const RGBColor&, float tween, bool direction + ); +}; + +class HSLColor : protected Vector { +public: + HSLColor(const float*& v) : Vector(v) {} + HSLColor( + float h = 0.0f, float s = 0.0f, float l = 0.0f + ) : Vector(h, s, l) {} + + operator RGBColor() const; + + using Vector::set; + using Vector::get; + using Vector::operator+; + using Vector::operator-; + using Vector::operator*; + using Vector::operator/; + using Vector::operator+=; + using Vector::operator*=; + using Vector::operator/=; + + const float& h() const { return x(); } + float& h() { return x(); } + const float& s() const { return y(); } + float& s() { return y(); } + const float& l() const { return z(); } + float& l() { return z(); } + + void clamp() { + while (_v[0] >= 1) + _v[0] -= 1; + while (_v[0] < 0) + _v[0] += 1; + if (_v[1] > 1) + _v[1] = 1; + if (_v[1] < 0) + _v[1] = 0; + if (_v[2] > 1) + _v[2] = 1; + if (_v[2] < 0) + _v[2] = 0; + } + + static HSLColor tween( + const HSLColor&, const HSLColor&, float tween, bool direction + ); +}; + +#endif // _COLOR_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/common.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/common.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/common.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/common.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,622 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#if HAVE_SYS_TYPES_H + #include +#endif +#if HAVE_SYS_SELECT_H + #include +#endif +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(__vms) +#include /* for XmuLookupStandardColormap */ +#else +#include /* for XmuLookupStandardColormap */ +#endif +#include +#include + +#define MAX_DELAY 10000 +#define MIN_DELAY 1000 + +namespace Common { + std::string program; + Display* display; + unsigned int screen; + XVisualInfo *visualInfo; + Window window; + GLXContext context; + std::string resourceDir; + + unsigned int width, height, depth; + unsigned int centerX, centerY; + float aspectRatio; + Colormap colormap; + bool doubleBuffered; + + bool running; + unsigned int elapsedMicros; + float elapsedSecs; + float speed; + float elapsedTime; + + ResourceManager* resources; + + error_t parse(int, char*, struct argp_state*); + void init(int argc, char** argv); + void run(); + void fini(); +}; + +namespace Common { + char* _displayName; + Window _windowID; + int _x, _y, _w, _h; + bool _reverseX, _reverseY; + bool _useOffset; + bool _fullScreen; + bool _onRoot; +#ifndef NDEBUG + bool _showFPS; +#endif // !NDEBUG + + enum Arguments { + ARG_ROOT = 1, +#ifndef NDEBUG + ARG_FPS, +#endif // !NDEBUG + ARG_GEOMETRY, + ARG_FULLSCREEN, + ARG_WINDOWID, + ARG_RESOURCE_DIR, + }; + + struct HasCurrentVisualID; + + Colormap getColormap(); + Window createWindow(int, char**); + void updateAttributes(); + void dumpErrors(const std::string&); +}; + +error_t Common::parse(int key, char* arg, struct argp_state* state) { + switch (key) { + case ARGP_KEY_INIT: + visualInfo = NULL; + window = None; + context = None; + running = false; + resourceDir = std::string(PKGDATADIR "/") + Hack::getShortName(); + _displayName = NULL; + _onRoot = false; + _windowID = 0; + _x = _y = 0; + _reverseX = _reverseY = false; + _w = 640; + _h = 480; + _useOffset = _fullScreen = false; + return 0; + case ARG_ROOT: + _onRoot = true; + return 0; + case ARG_GEOMETRY: + if (std::sscanf(arg, "%dx%d+%d+%d", &_w, &_h, &_x, &_y) == 4) + _useOffset = true; + else if (std::sscanf(arg, "%dx%d-%d+%d", &_w, &_h, &_x, &_y) == 4) { + _useOffset = true; _reverseX = true; + } else if (std::sscanf(arg, "%dx%d+%d-%d", &_w, &_h, &_x, &_y) == 4) { + _useOffset = true; _reverseY = true; + } else if (std::sscanf(arg, "%dx%d-%d-%d", &_w, &_h, &_x, &_y) == 4) { + _useOffset = true; _reverseX = true; _reverseY = true; + } else if (std::sscanf(arg, "%dx%d", &_w, &_h) == 2) + ; + else if (std::sscanf(arg, "%d%d", &_x, &_y) == 2) + _useOffset = true; + else { + argp_error(state, "could not parse geometry `%s'", arg); + return ARGP_ERR_UNKNOWN; + } + return 0; + case ARG_FULLSCREEN: + _fullScreen = true; + return 0; + case ARG_WINDOWID: + if ((_windowID = std::strtol(arg, NULL, 0)) == 0) { + argp_error(state, "invalid window ID `%s'", arg); + return ARGP_ERR_UNKNOWN; + } + return 0; + case ARG_RESOURCE_DIR: + resourceDir = arg; + return 0; +#ifndef NDEBUG + case ARG_FPS: + _showFPS = true; + return 0; +#endif // !NDEBUG + default: + return ARGP_ERR_UNKNOWN; + } +} + +static struct timeval now; +static struct timeval then; + +void Common::init(int argc, char** argv) { +#ifdef NOXBMC + display = XOpenDisplay(_displayName); + if (!display) { + if (_displayName != "") + throw Exception(stdx::oss() << "Could not open display " << _displayName); + else + throw Exception("Could not open default display (DISPLAY variable not set?)"); + } + screen = DefaultScreen(display); + _displayName = XDisplayString(display); + + window = createWindow(argc, argv); + if (!window) return; + + updateAttributes(); + XMapRaised(display, window); +#endif + running = true; + speed = 1.0f; + + resources = new ResourceManager; + + gettimeofday(&now, NULL); +} + + +void Common::run() { +#ifdef NOXBMC + Hack::start(); + +#ifndef NDEBUG + dumpErrors("start"); +#endif // !NDEBUG + + while (running) { + Hack::tick(); +#ifndef NDEBUG + dumpErrors("tick"); +#endif // !NDEBUG + while (XPending(display)) { + XEvent event; + XNextEvent(display, &event); + switch (event.type) { + case ConfigureNotify: + updateAttributes(); + TRACE("Reshaping window"); + Hack::reshape(); + break; + case MappingNotify: + TRACE("Key mapping changed"); + XRefreshKeyboardMapping(&event.xmapping); + break; + case KeyPress: + { + char c; + KeySym keysym; + XLookupString(&event.xkey, &c, 1, &keysym, 0); + TRACE("Key pressed: " << c); + Hack::keyPress(c, keysym); + } + break; + case KeyRelease: + { + char c; + KeySym keysym; + XLookupString(&event.xkey, &c, 1, &keysym, 0); + TRACE("Key released: " << c); + Hack::keyRelease(c, keysym); + } + break; + case ButtonPress: + { + unsigned int button = event.xbutton.button; + TRACE("Button pressed: " << button << " (" << event.xbutton.x << + ',' << event.xbutton.y << ')'); + Hack::buttonPress(button); + } + break; + case ButtonRelease: + { + unsigned int button = event.xbutton.button; + TRACE("Button released: " << button << " (" << event.xbutton.x << + ',' << event.xbutton.y << ')'); + Hack::buttonRelease(button); + } + break; + case MotionNotify: + { + int x = event.xmotion.x; + int y = event.xmotion.y; + Hack::pointerMotion(x, y); + } + break; + case EnterNotify: + if (event.xcrossing.state & ( + Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask + )) + TRACE("Ignoring pointer entering window"); + else { + TRACE("Pointer entered window"); + Hack::pointerEnter(); + } + break; + case LeaveNotify: + if (event.xcrossing.state & ( + Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask + )) + TRACE("Ignoring pointer leaving window"); + else { + TRACE("Pointer exited window"); + Hack::pointerLeave(); + } + break; + } + } +#endif + + then = now; + gettimeofday(&now, NULL); + +#ifndef NDEBUG + if (_showFPS) { + elapsedMicros = 1000000 * (now.tv_sec - then.tv_sec) + + now.tv_usec - then.tv_usec; + elapsedSecs = float(elapsedMicros) / 1000000.0f; + + static float secsSinceUpdate = 0.0f; + static unsigned int frames = 0; + secsSinceUpdate += elapsedSecs; + ++frames; + if (secsSinceUpdate >= 5.0f) { + float fps = float(frames) / secsSinceUpdate; + std::cerr << frames << " frames in " << secsSinceUpdate << + " seconds = " << fps << " FPS" << std::endl; + secsSinceUpdate = 0.0f; + frames = 0; + } + } else { +#endif // !NDEBUG + elapsedMicros *= 4; + elapsedMicros += 1000000 * (now.tv_sec - then.tv_sec) + + now.tv_usec - then.tv_usec; + elapsedMicros /= 5; + elapsedSecs = float(elapsedMicros) / 1000000.0f; + + unsigned int remainingMicros = + (elapsedMicros > MAX_DELAY - MIN_DELAY) ? + MIN_DELAY : MAX_DELAY - elapsedMicros; + + struct timeval tv; + tv.tv_sec = remainingMicros / 1000000L; + tv.tv_usec = remainingMicros % 1000000L; + select(0, 0, 0, 0, &tv); +#ifndef NDEBUG + } +#endif // !NDEBUG + elapsedTime = speed * elapsedSecs; +#ifdef NOXBMC + } + Hack::stop(); +#ifndef NDEBUG + dumpErrors("stop"); +#endif // !NDEBUG +#endif +} + +void Common::fini() { + delete resources; + if (context) glXDestroyContext(display, context); + if (visualInfo) XFree(visualInfo); + if (window) XDestroyWindow(display, window); + if (display) XCloseDisplay(display); +} + +/* See http://www.mesa3d.org/brianp/sig97/glxport.htm */ +Colormap Common::getColormap() { + if (visualInfo->visual == DefaultVisual(display, screen)) + return DefaultColormap(display, screen); + + std::string serverString(glXQueryServerString(display, screen, GLX_VERSION)); + bool mesa = serverString.find("Mesa") != std::string::npos; + + if (mesa) { + Atom atom = XInternAtom(display, "_HP_RGB_SMOOTH_MAP_LIST", True); + if ( + atom && + visualInfo->visual->c_class == TrueColor && + depth == 8 + ) { + XStandardColormap *colormaps; + int numColormaps; + Colormap result = None; + if ( + XGetRGBColormaps(display, RootWindow(display, screen), + &colormaps, &numColormaps, atom) + ) { + for (int i = 0; i < numColormaps; ++i) + if (colormaps[i].visualid == Common::visualInfo->visualid) + result = colormaps[i].colormap; + XFree(colormaps); + } + if (result) return result; + } + } + +#ifndef SOLARIS_BUG + if (XmuLookupStandardColormap( + display, screen, visualInfo->visualid, depth, + XA_RGB_DEFAULT_MAP, False, True + )) { + XStandardColormap* colormaps; + int numColormaps; + Colormap result = None; + if (XGetRGBColormaps( + display, RootWindow(display, screen), + &colormaps, &numColormaps, XA_RGB_DEFAULT_MAP + )) { + for (int i = 0; i < numColormaps; ++i) + if (colormaps[i].visualid == Common::visualInfo->visualid) + result = colormaps[i].colormap; + XFree(colormaps); + } + if (result) return result; + } +#endif + + return XCreateColormap(display, RootWindow(display, screen), + visualInfo->visual, AllocNone); +} + +Window Common::createWindow(int argc, char** argv) { + Window window = 0; + + if (_onRoot || _windowID) { + window = _windowID ? _windowID : RootWindow(display, screen); + TRACE("Drawing on window: " << window); + + XWindowAttributes gwa; + XGetWindowAttributes(display, window, &gwa); + Visual* visual = gwa.visual; + _w = gwa.width; + _h = gwa.height; + + XVisualInfo templ; + templ.screen = screen; + templ.visualid = XVisualIDFromVisual(visual); + + int outCount; + visualInfo = XGetVisualInfo(display, VisualScreenMask | VisualIDMask, + &templ, &outCount); + + if (!visualInfo) { + std::cerr << program << ": could not retrieve visual information for " + "root window" << std::endl; + return 0; + } + } else { +# define R GLX_RED_SIZE +# define G GLX_GREEN_SIZE +# define B GLX_BLUE_SIZE +# define D GLX_DEPTH_SIZE +# define I GLX_BUFFER_SIZE +# define DB GLX_DOUBLEBUFFER + + static int attributeLists[][20] = { + { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, DB, None }, // rgb double + { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, DB, None }, + { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, DB, None }, + { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, None }, // rgb single + { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, None }, + { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, None }, + { I, 8, D, 8, DB, None }, // cmap double + { I, 4, D, 4, DB, None }, + { I, 8, D, 8, None }, // cmap single + { I, 4, D, 4, None }, + { GLX_RGBA, R, 1, G, 1, B, 1, D, 1, None } // monochrome + }; + int fullWidth = WidthOfScreen(DefaultScreenOfDisplay(display)); + int fullHeight = HeightOfScreen(DefaultScreenOfDisplay(display)); + + if (_fullScreen) { + _w = fullWidth; + _h = fullHeight; + _x = _y = 0; + _useOffset = true; + } else if (_useOffset) { + if (_reverseX) + _x = fullWidth - _w - _x; + if (_reverseY) + _y = fullHeight - _h - _y; + } + + for ( + unsigned int i = 0; + i < sizeof(attributeLists) / sizeof(*attributeLists); + ++i + ) { + visualInfo = glXChooseVisual(display, screen, attributeLists[i]); + if (visualInfo) break; + } + + if (!visualInfo) { + std::cerr << program << + ": could not find a GL-capable visual on display " << + _displayName << std::endl; + return 0; + } + depth = visualInfo->depth; + + XSetWindowAttributes swa; + swa.colormap = getColormap(); + swa.border_pixel = swa.background_pixel = swa.backing_pixel = + BlackPixel(display, screen); + swa.event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | + ButtonReleaseMask | PointerMotionMask | EnterWindowMask | + LeaveWindowMask | StructureNotifyMask; + + window = XCreateWindow(display, RootWindow(display, screen), + _x, _y, _w, _h, 0, visualInfo->depth, InputOutput, visualInfo->visual, + CWBorderPixel | CWBackPixel | CWBackingPixel | CWColormap | CWEventMask, + &swa); + TRACE("Created window: 0x" << std::hex << window << std::dec); + + XSizeHints hints; + hints.flags = USSize; + hints.width = _w; + hints.height = _h; + if (_useOffset) { + hints.flags |= USPosition; + hints.x = _x; + hints.y = _y; + } + XWMHints wmHints; + wmHints.flags = InputHint; + wmHints.input = True; + + XmbSetWMProperties(display, window, Hack::getName().c_str(), + Hack::getName().c_str(), argv, argc, &hints, &wmHints, NULL); + } + + int temp; + if (glXGetConfig(display, visualInfo, GLX_DOUBLEBUFFER, &temp)) { + std::cerr << program << + ": could not get GLX_DOUBLEBUFFER attribute from visual 0x" << + std::hex << visualInfo->visualid << std::dec << std::endl; + return 0; + } + doubleBuffered = (temp != False); + + context = glXCreateContext(display, visualInfo, NULL, True); + if (!context) { + std::cerr << program << ": could not create rendering context" << std::endl; + return 0; + } + + if (!glXMakeCurrent(display, window, context)) { + std::cerr << program << ": could not activate rendering context" << + std::endl; + return 0; + } + + return window; +} + +void Common::updateAttributes() { + XWindowAttributes attributes; + XGetWindowAttributes(display, window, &attributes); + width = attributes.width; + height = attributes.height; + depth = attributes.depth; + centerX = width >> 1; + centerY = height >> 1; + aspectRatio = float(width) / float(height); + colormap = attributes.colormap; +} + +#ifndef NDEBUG +void Common::dumpErrors(const std::string& func) { + GLenum error; + while ( (error = glGetError()) ) + WARN(func << ": " << gluErrorString(error)); + + GLint i; + glGetIntegerv(GL_ATTRIB_STACK_DEPTH, &i); + if (i > 1) WARN(func << ": GL_ATTRIB_STACK_DEPTH == " << i); + glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &i); + if (i > 1) WARN(func << ": GL_MODELVIEW_STACK_DEPTH == " << i); + glGetIntegerv(GL_NAME_STACK_DEPTH, &i); + if (i > 1) WARN(func << ": GL_NAME_STACK_DEPTH == " << i); + glGetIntegerv(GL_PROJECTION_STACK_DEPTH, &i); + if (i > 1) WARN(func << ": GL_PROJECTION_STACK_DEPTH == " << i); + glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &i); + if (i > 1) WARN(func << ": GL_TEXTURE_STACK_DEPTH == " << i); +} +#endif // !NDEBUG + +const char * program_name; + +int main(int argc, char** argv) { + int exit_code = EXIT_FAILURE; + + Common::program = argv[0]; + program_name = Hack::getShortName().c_str(); + argp_program_version = PACKAGE_STRING; + argp_program_bug_address = "<" PACKAGE_BUGREPORT ">"; + struct argp_option options[] = { + { NULL, 0, NULL, 0, "Help options:", -1 }, + { NULL, 0, NULL, 0, "Common options:" }, + { "root", Common::ARG_ROOT, NULL, 0, "Draw on the root window" }, + { "geometry", Common::ARG_GEOMETRY, "GEOM", 0, + "Draw on a window of the specified geometry (WxH+X+Y)" }, + { "fullscreen", Common::ARG_FULLSCREEN, NULL, 0, + "Draw on a maximized window" }, + { "window-id", Common::ARG_WINDOWID, "ID", OPTION_HIDDEN }, + { "resource-dir", Common::ARG_RESOURCE_DIR, "DIR", OPTION_HIDDEN }, +#ifndef NDEBUG + { "fps", Common::ARG_FPS, NULL, OPTION_HIDDEN }, +#endif // !NDEBUG + {} + }; + struct argp_child child[] = { + { Hack::getParser(), 0, "" }, + {} + }; + struct argp parser = + { options, Common::parse, NULL, NULL, child }; + + std::srand((unsigned int)std::time(NULL)); + + // Use ARGP_LONG_ONLY to follow XScreenSaver tradition + if (argp_parse(&parser, argc, argv, ARGP_LONG_ONLY, NULL, NULL)) + return EXIT_FAILURE; + + try { + Common::init(argc, argv); + Common::run(); + exit_code = EXIT_SUCCESS; + } catch (Common::Exception e) { + WARN(e); + } + Common::fini(); + + return exit_code; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/common.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/common.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/common.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/common.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,374 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _COMMON_HH +#define _COMMON_HH + +#if HAVE_CONFIG_H + #include +#endif + +#if ! HAVE_CXX_BOOL + enum _boolType { false, true }; + typedef enum _boolType bool; +#endif + +#if ! HAVE_CXX_NEW_FOR_SCOPING +# define for if (0) {} else for +#endif + +#define GLX_GLXEXT_PROTOTYPES 1 + +#include +#include +#include +#include +#include +#include +#if HAVE_CXX_STRINGSTREAM + #include +#endif +#if HAVE_CXX_STRSTREAM + #include +#endif +#include +#include +#include + +#if HAVE_GL_GL_H + #include +#endif +#if HAVE_GL_GLEXT_H + #include +#endif +#if HAVE_GL_GLU_H + #include +#endif +#if HAVE_GL_GLX_H + #include +#endif +#if HAVE_X11_XLIB_H + #include +#endif + +namespace std { +#if HAVE_CXX_STRSTREAM && !HAVE_CXX_STRINGSTREAM + typedef istrstream istringstream; + typedef ostrstream ostringstream; + typedef strstream stringstream; +#endif +}; + +class ResourceManager; + +namespace Common { + typedef std::string Exception; + + extern std::string program; + extern Display* display; + extern XVisualInfo* visualInfo; + extern unsigned int screen; + extern Window window; + extern GLXContext context; + extern std::string resourceDir; + + extern unsigned int width, height, depth; + extern unsigned int centerX, centerY; + extern float aspectRatio; + extern Colormap colormap; + extern bool doubleBuffered; + + extern bool running; + extern unsigned int elapsedMicros; + extern float elapsedSecs; + extern float speed; + extern float elapsedTime; + + extern ResourceManager* resources; + +#ifndef NOXBMC + void init(int argc, char** argv); + void run(); +#endif + + static inline int randomInt(int x) { + return std::rand() % x; + } + + static inline float randomFloat(float x) { + return float(std::rand()) * x / float(RAND_MAX); + } + + static inline void flush(bool swap = doubleBuffered) { + if (swap) + glXSwapBuffers(display, window); + else + glFlush(); + } + + template + static inline const T& clamp( + const T& v, const T& min, const T& max + ) { + return std::max(std::min(v, max), min); + } + + template + static inline bool parseArg( + const char* arg, T& item, const T& min, const T& max + ) { + return + !(std::istringstream(arg) >> item) || + item < min || item > max; + } + + template + static inline bool parseArg( + const char* arg, T& item, const T& min, const T& max, const T& extra + ) { + return + !(std::istringstream(arg) >> item) || + (item != extra && (item < min || item > max)); + } +}; + +#ifdef NDEBUG + #define TRACE(x) do {} while (0) +#else + #define TRACE(x) do { \ + std::cerr << "[" << __PRETTY_FUNCTION__ << " @ " << __FILE__ << \ + ":" << __LINE__ << "]" << std::endl << " " << x << std::endl; \ + } while (0) +#endif + +#define WARN(x) do { \ + std::cerr << Common::program << ": " << x << std::endl; \ +} while (0) + +namespace stdx { + class oss { + private: + std::ostringstream _oss; + public: + operator std::string() const { return _oss.str(); } + template + oss& operator<<(const T& t) { + _oss << t; + return *this; + } + }; + + template + static inline void call_each(In p, In q, MFunc f) { + for ( ; p != q; ++p) + ((*p).*f)(); + } + + template + static inline void call_each(In p, In q, MFunc f, const Arg& a) { + for ( ; p != q; ++p) + ((*p).*f)(a); + } + + template + static inline void call_all(Con& c, MFunc f) { + call_each(c.begin(), c.end(), f); + } + + template + static inline void call_all(Con& c, MFunc f, const Arg& a) { + call_each(c.begin(), c.end(), f, a); + } + + template + static inline void map_each(In p, In q, Out o, UFunc f) { + for ( ; p != q; ++p) + *o++ = ((*p).*f)(); + } + + template + static inline void map_all(const Con1& in, Con2& out, UFunc f) { + map_each(in.begin(), in.end(), out.begin(), f); + } + + template + static inline void call_each_ptr(In p, In q, MFuncPtr f) { + for ( ; p != q; ++p) + ((*p)->*f)(); + } + + template + static inline void call_each_ptr( + In p, In q, MFuncPtr f, const Arg& a + ) { + for ( ; p != q; ++p) + ((*p)->*f)(a); + } + + template + static inline void call_all_ptr(Con& c, MFuncPtr f) { + call_each_ptr(c.begin(), c.end(), f); + } + + template + static inline void call_all_ptr(Con& c, MFuncPtr f, const Arg& a) { + call_each_ptr(c.begin(), c.end(), f, a); + } + + template + static inline void map_each_ptr(In p, In q, Out o, UFunc f) { + for ( ; p != q; ++p) + *o++ = ((*p)->*f)(); + } + + template + static inline void map_all_ptr(const Con1& in, Con2& out, UFunc f) { + map_each_ptr(in.begin(), in.end(), out.begin(), f); + } + + template + static inline void destroy_each_ptr(In p, const In& q) { + for ( ; p != q; ++p) + delete *p; + } + + template + static inline void destroy_all_ptr(Con& c) { + destroy_each_ptr(c.begin(), c.end()); + } + + template + class constructor_t { + public: + inline T operator()() { return T(); } + }; + + template + class constructor1_t { + private: + const Arg& _x; + public: + constructor1_t(const Arg& x) : _x(x) {} + inline T operator()() { return T(_x); } + }; + + template + static inline constructor_t construct() { + return constructor_t(); + } + + template + static inline constructor1_t construct(const Arg& a) { + return constructor1_t(a); + } + + template + static inline void construct_n(Con& c, typename Con::size_type n) { + c.reserve(c.size() + n); + while (n--) c.push_back(typename Con::value_type()); + } + + template + static inline void construct_n( + Con& c, typename Con::size_type n, const Arg& a + ) { + c.reserve(c.size() + n); + while (n--) c.push_back(typename Con::value_type(a)); + } + + template ::size_type I = 0> + class dim2 : public std::vector { + public: + typedef typename std::vector::reference reference; + typedef typename std::vector::const_reference const_reference; + typedef typename std::vector::size_type size_type; + private: + size_type _i; + public: + dim2(size_type i = 0, size_type j = 0) : std::vector() { + resize(i, j); + } + + void resize(size_type i = 0, size_type j = 0) { + if (I) + std::vector::resize(I * i); + else { + _i = i; + std::vector::resize(i * j); + } + } + + reference + operator()(size_type i, size_type j) { + return (*this)[i * (I ? I : _i) + j]; + } + const_reference + operator()(size_type i, size_type j) const { + return (*this)[i * (I ? I : _i) + j]; + } + }; + + template < + typename T, + typename std::vector::size_type J = 0, + typename std::vector::size_type I = 0 + > class dim3 : public std::vector { + public: + typedef typename std::vector::reference reference; + typedef typename std::vector::const_reference const_reference; + typedef typename std::vector::size_type size_type; + private: + size_type _j, _i; + public: + dim3(size_type i = 0, size_type j = 0, size_type k = 0) + : std::vector() + { + resize(i, j, k); + } + + void resize(size_type i = 0, size_type j = 0, size_type k = 0) { + if (I && J) + std::vector::resize(I * J * i); + else if (J) { + _i = i; + std::vector::resize(i * J * j); + } else { + _i = i; + _j = j; + std::vector::resize(i * j * k); + } + } + + reference + operator()(size_type i, size_type j, size_type k) { + return (*this)[(i * (I ? I : _i) + j) * (J ? J : _j) + k]; + } + const_reference + operator()(size_type i, size_type j, size_type k) const { + return (*this)[(i * (I ? I : _i) + j) * (J ? J : _j) + k]; + } + }; +}; + +#include + +#endif // _COMMON_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/blend.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/blend.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/blend.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/blend.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,38 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include + +namespace Blend { + float _fact[13]; +}; + +void Blend::init() { + unsigned int temp = 1; + _fact[0] = 1.0f; + for (unsigned int i = 1; i < 13; ++i) { + temp *= i; + _fact[i] = float(temp); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/blend.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/blend.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/blend.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/blend.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _BLEND_HH +#define _BLEND_HH + +#include + +#include + +namespace Blend { + extern float _fact[13]; + + void init(); + + static inline float blend(unsigned int i, float step) { + return _fact[Hack::complexity + 2] / (_fact[i] + * _fact[Hack::complexity + 2 - i]) * std::pow(step, float(i)) + * std::pow(1.0f - step, float(Hack::complexity + 2 - i)); + } +}; + +#endif // _BLEND_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/cyclone.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/cyclone.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/cyclone.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/cyclone.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,520 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +#define WIDE 200.0f +#define HIGH 200.0f + +namespace Hack { + unsigned int numCyclones = 1; + unsigned int numParticles = 200; + float size = 7.0f; + unsigned int complexity = 3; + float speed = 10.0f; + bool stretch = true; + bool showCurves = false; + bool southern = false; +}; + +namespace Hack { + enum Arguments { + ARG_CYCLONES = 1, + ARG_PARTICLES, + ARG_SIZE, + ARG_COMPLEXITY, + ARG_SPEED, + ARG_STRETCH = 0x100, ARG_NO_STRETCH, + ARG_CURVES = 0x200, ARG_NO_CURVES, + ARG_SOUTH = 0x300, ARG_NORTH + }; + + std::vector _cyclones; + std::vector _particles; + + error_t parse(int, char*, struct argp_state*); +}; + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { + switch (key) { + case ARG_CYCLONES: + if (Common::parseArg(arg, numCyclones, 1u, MAX_COMPLEXITY)) + argp_failure(state, EXIT_FAILURE, 0, + "number of cyclones must be between 1 and %d", MAX_COMPLEXITY); + return 0; + case ARG_PARTICLES: + if (Common::parseArg(arg, numParticles, 1u, 10000u)) + argp_failure(state, EXIT_FAILURE, 0, + "particles per cyclones must be between 1 and 10000"); + return 0; + case ARG_SIZE: + if (Common::parseArg(arg, size, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "particle size must be between 1 and 100"); + return 0; + case ARG_COMPLEXITY: + if (Common::parseArg(arg, complexity, 1u, 10u)) + argp_failure(state, EXIT_FAILURE, 0, + "cyclone complexity must be between 1 and 10"); + return 0; + case ARG_SPEED: + if (Common::parseArg(arg, speed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "particle speed must be between 1 and 100"); + return 0; + case ARG_STRETCH: + stretch = true; + return 0; + case ARG_NO_STRETCH: + stretch = false; + return 0; + case ARG_CURVES: + showCurves = true; + return 0; + case ARG_NO_CURVES: + showCurves = false; + return 0; + case ARG_SOUTH: + southern = true; + return 0; + case ARG_NORTH: + southern = false; + return 0; + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Cyclone options:" }, + { "cyclones", ARG_CYCLONES, "NUM", 0, + "Number of cyclones (1-10, default = 1)" }, + { "complexity", ARG_COMPLEXITY, "NUM", 0, + "Cyclone complexity (1-10, default = 3)" }, + { "particles", ARG_PARTICLES, "NUM", 0, + "Particles per cyclone (1-10000, default = 200)" }, + { "curves", ARG_CURVES, NULL, 0, + "Enable cyclone curves"}, + { "no-curves", ARG_NO_CURVES, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "south", ARG_SOUTH, NULL, 0, + "Use southern/northern hemisphere cyclones (default = north)" }, + { "north", ARG_NORTH, NULL, OPTION_ALIAS }, + { NULL, 0, NULL, 0, "Particle options:" }, + { "size", ARG_SIZE, "NUM", 0, + "Particle size (1-100, default = 7)" }, + { "speed", ARG_SPEED, "NUM", 0, + "Particle speed (1-100, default = 10)" }, + { "stretch", ARG_STRETCH, NULL, OPTION_HIDDEN, + "Disable particle stretching" }, + { "no-stretch", ARG_NO_STRETCH, NULL, OPTION_ALIAS }, + {} + }; + static struct argp parser = + { options, parse, NULL, "Simulates tornadoes on your computer screen." }; + return &parser; +} + +std::string Hack::getShortName() { return "cyclone"; } +std::string Hack::getName() { return "Cyclone"; } + +void Hack::start() { + glViewport(0, 0, Common::width, Common::height); + + glEnable(GL_DEPTH_TEST); + glFrontFace(GL_CCW); + glEnable(GL_CULL_FACE); + glClearColor(0.0, 0.0, 0.0, 1.0); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(80.0, Common::aspectRatio, 50, 3000); + if (Common::randomInt(500) == 0) { + TRACE("Easter egg view!"); + glRotatef(90, 1, 0, 0); + glTranslatef(0.0f, WIDE * -2.0f, 0.0f); + } else + glTranslatef(0.0f, 0.0f, WIDE * -2.0f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + Particle::init(); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + float ambient[4] = {0.25f, 0.25f, 0.25f, 0.0f}; + float diffuse[4] = {1.0f, 1.0f, 1.0f, 0.0f}; + float specular[4] = {1.0f, 1.0f, 1.0f, 0.0f}; + float position[4] = {WIDE * 2.0f, -HIGH, WIDE * 2.0f, 0.0f}; + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, specular); + glLightfv(GL_LIGHT0, GL_POSITION, position); + glEnable(GL_COLOR_MATERIAL); + glMaterialf(GL_FRONT, GL_SHININESS, 20.0f); + glColorMaterial(GL_FRONT, GL_SPECULAR); + glColor3f(0.7f, 0.7f, 0.7f); + glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); + + // Initialize cyclones and their particles + Blend::init(); + stdx::construct_n(_cyclones, numCyclones); + _particles.reserve(numCyclones * numParticles); + for ( + std::vector::const_iterator c = _cyclones.begin(); + c != _cyclones.end(); + ++c + ) stdx::construct_n(_particles, numParticles, c); +} + +void Hack::tick() { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + stdx::call_all(_cyclones, &Cyclone::update); + stdx::call_all(_particles, &Particle::update); + + //Common::flush(); +} + +void Hack::reshape() { + glViewport(0, 0, Common::width, Common::height); +} + +void Hack::stop() {} + +Cyclone::Cyclone() { + // Initialize position stuff + _V[Hack::complexity + 2].set( + Common::randomFloat(WIDE * 2.0f - WIDE), + HIGH, + Common::randomFloat(WIDE * 2.0f - WIDE) + ); + _V[Hack::complexity + 1].set( + _V[Hack::complexity + 2].x(), + Common::randomFloat(HIGH / 3.0f) + HIGH / 4.0f, + _V[Hack::complexity + 2].z() + ); + for (unsigned int i = Hack::complexity; i > 1; --i) + _V[i].set( + _V[i + 1].x() + Common::randomFloat(WIDE) - WIDE / 2.0f, + Common::randomFloat(HIGH * 2.0f) - HIGH, + _V[i + 1].z() + Common::randomFloat(WIDE) - WIDE / 2.0f + ); + _V[1].set( + _V[2].x() + Common::randomFloat(WIDE / 2.0f) - WIDE / 4.0f, + -Common::randomFloat(HIGH / 2.0f) - HIGH / 4.0f, + _V[2].z() + Common::randomFloat(WIDE / 2.0f) - WIDE / 4.0f + ); + _V[0].set( + _V[1].x() + Common::randomFloat(WIDE / 8.0f) - WIDE / 16.0f, + -HIGH, + _V[1].z() + Common::randomFloat(WIDE / 8.0f) - WIDE / 16.0f + ); + + // Initialize width stuff + _width[Hack::complexity + 2] = Common::randomFloat(175.0f) + 75.0f; + _width[Hack::complexity + 1] = Common::randomFloat(60.0f) + 15.0f; + for (unsigned int i = Hack::complexity; i > 1; --i) + _width[i] = Common::randomFloat(25.0f) + 15.0f; + _width[1] = Common::randomFloat(25.0f) + 5.0f; + _width[0] = Common::randomFloat(15.0f) + 5.0f; + + // Initialize transition stuff + for (unsigned int i = 0; i < Hack::complexity + 3; ++i) { + _VChange[i].first = _VChange[i].second = 0; + _widthChange[i].first = _widthChange[i].second = 0; + } + + // Initialize color stuff + _oldHSL.set( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + 0.0f + ); + _targetHSL.set( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + 1.0f + ); + _HSLChange.first = 0; + _HSLChange.second = 300; +} + +void Cyclone::update() { + static int speed10000 = int(10000 / Hack::speed); + static int speed7000 = int(7000 / Hack::speed); + static int speed5000 = int(5000 / Hack::speed); + static int speed4000 = int(4000 / Hack::speed); + static int speed3000 = int(3000 / Hack::speed); + static int speed2000 = int(2000 / Hack::speed); + static int speed1500 = int(1500 / Hack::speed); + + // update cyclone's path + unsigned int temp = Hack::complexity + 2; + if (_VChange[temp].first == _VChange[temp].second) { + _oldV[temp] = _V[temp]; + _targetV[temp].set( + Common::randomFloat(WIDE * 2.0f) - WIDE, + HIGH, + Common::randomFloat(WIDE * 2.0f) - WIDE + ); + _VChange[temp].first = 0; + _VChange[temp].second = Common::randomInt(speed10000) + speed5000; + } + + temp = Hack::complexity + 1; + if (_VChange[temp].first == _VChange[temp].second) { + _oldV[temp] = _V[temp]; + _targetV[temp].set( + _V[temp + 1].x(), + Common::randomFloat(HIGH / 3.0f) + HIGH / 4.0f, + _V[temp + 1].z() + ); + _VChange[temp].first = 0; + _VChange[temp].second = Common::randomInt(speed7000) + speed5000; + } + + for (unsigned int i = Hack::complexity; i > 1; --i) { + if (_VChange[i].first == _VChange[i].second) { + _oldV[i] = _V[i]; + _targetV[i].set( + _targetV[i + 1].x() + + (_targetV[i + 1].x() - _targetV[i + 2].x()) / 2.0f + + Common::randomFloat(WIDE / 2.0f) - WIDE / 4.0f, + (_targetV[i + 1].y() + _targetV[i - 1].y()) / 2.0f + + Common::randomFloat(HIGH / 8.0f) - HIGH / 16.0f, + _targetV[i + 1].z() + + (_targetV[i + 1].z() - _targetV[i + 2].z()) / 2.0f + + Common::randomFloat(WIDE / 2.0f) - WIDE / 4.0f + ); + _targetV[i].y() = Common::clamp(_targetV[i].y(), -HIGH, HIGH); + _VChange[i].first = 0; + _VChange[i].second = Common::randomInt(speed5000) + speed3000; + } + } + if (_VChange[1].first == _VChange[1].second) { + _oldV[1] = _V[1]; + _targetV[1].set( + _targetV[2].x() + Common::randomFloat(WIDE / 2.0f) - WIDE / 4.0f, + -Common::randomFloat(HIGH / 2.0f) - HIGH / 4.0f, + _targetV[2].z() + Common::randomFloat(WIDE / 2.0f) - WIDE / 4.0f + ); + _VChange[1].first = 0; + _VChange[1].second = Common::randomInt(speed4000) + speed2000; + } + if (_VChange[0].first == _VChange[0].second) { + _oldV[0] = _V[0]; + // XXX Should the following be _targetV not _V ? + _targetV[0].set( + _V[1].x() + Common::randomFloat(WIDE / 8.0f) - WIDE / 16.0f, + -HIGH, + _V[1].z() + Common::randomFloat(WIDE / 8.0f) - WIDE / 16.0f + ); + _VChange[0].first = 0; + _VChange[0].second = Common::randomInt(speed3000) + speed1500; + } + for (unsigned int i = 0; i < Hack::complexity + 3; ++i) { + float between = float(_VChange[i].first) / float(_VChange[i].second) * M_PI * 2.0f; + between = (1.0f - std::cos(between)) / 2.0f; + _V[i].set( + ((_targetV[i].x() - _oldV[i].x()) * between) + _oldV[i].x(), + ((_targetV[i].y() - _oldV[i].y()) * between) + _oldV[i].y(), + ((_targetV[i].z() - _oldV[i].z()) * between) + _oldV[i].z() + ); + ++_VChange[i].first; + } + + // Update cyclone's widths + temp = Hack::complexity + 2; + if (_widthChange[temp].first == _widthChange[temp].second) { + _oldWidth[temp] = _width[temp]; + _targetWidth[temp] = Common::randomFloat(225.0f) + 75.0f; + _widthChange[temp].first = 0; + _widthChange[temp].second = Common::randomInt(speed5000) + speed5000; + } + temp = Hack::complexity + 1; + if (_widthChange[temp].first == _widthChange[temp].second) { + _oldWidth[temp] = _width[temp]; + _targetWidth[temp] = Common::randomFloat(80.0f) + 15.0f; + _widthChange[temp].first = 0; + _widthChange[temp].second = Common::randomInt(speed5000) + speed5000; + } + for (unsigned int i = Hack::complexity; i > 1; --i) { + if (_widthChange[i].first == _widthChange[i].second) { + _oldWidth[i] = _width[i]; + _targetWidth[i] = Common::randomFloat(25.0f) + 15.0f; + _widthChange[i].first = 0; + _widthChange[i].second = Common::randomInt(speed5000) + speed4000; + } + } + if (_widthChange[1].first == _widthChange[1].second) { + _oldWidth[1] = _width[1]; + _targetWidth[1] = Common::randomFloat(25.0f) + 5.0f; + _widthChange[1].first = 0; + _widthChange[1].second = Common::randomInt(speed5000) + speed3000; + } + if (_widthChange[0].first == _widthChange[0].second) { + _oldWidth[0] = _width[0]; + _targetWidth[0] = Common::randomFloat(15.0f) + 5.0f; + _widthChange[0].first = 0; + _widthChange[0].second = Common::randomInt(speed5000) + speed2000; + } + for (unsigned int i = 0; i < Hack::complexity + 3; ++i) { + float between = float(_widthChange[i].first) / float(_widthChange[i].second); + _width[i] = ((_targetWidth[i] - _oldWidth[i]) * between) + _oldWidth[i]; + ++_widthChange[i].first; + } + + // Update cyclones color + if (_HSLChange.first == _HSLChange.second) { + _oldHSL = _HSL; + _targetHSL.set( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + Common::randomFloat(1.0f) + 0.5f + ); + _targetHSL.clamp(); + _HSLChange.first = 0; + _HSLChange.second = Common::randomInt(1900) + 100; + } + float between = float(_HSLChange.first) / float(_HSLChange.second); + float diff = _targetHSL.h() - _oldHSL.h(); + bool direction = ( + (_targetHSL.h() > _oldHSL.h() && diff > 0.5f) || + (_targetHSL.h() < _oldHSL.h() && diff < -0.5f) + ) && (diff > 0.5f); + _HSL = HSLColor::tween(_oldHSL, _targetHSL, between, direction); + ++_HSLChange.first; + + if (Hack::showCurves) { + glDisable(GL_LIGHTING); + glColor3f(0.0f, 1.0f, 0.0f); + glBegin(GL_LINE_STRIP); + for (float step = 0.0; step < 1.0; step += 0.02f) { + Vector point; + for (unsigned int i = 0; i < Hack::complexity + 3; ++i) + point += _V[i] * Blend::blend(i, step); + glVertex3fv(point.get()); + } + glEnd(); + glColor3f(1.0f, 0.0f, 0.0f); + glBegin(GL_LINE_STRIP); + for (unsigned int i = 0; i < Hack::complexity + 3; ++i) + glVertex3fv(_V[i].get()); + glEnd(); + glEnable(GL_LIGHTING); + } +} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + case 'q': case 'Q': + Common::running = false; + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} +void Hack::pointerMotion(int, int) {} +void Hack::buttonPress(unsigned int) {} +void Hack::buttonRelease(unsigned int) {} +void Hack::pointerEnter() {} +void Hack::pointerLeave() {} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS Create(void* hdl, void* props) +{ + if (!props) + return STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + + return STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void Stop() +{ + Hack::stop(); +} + +void Destroy() +{ +} + +ADDON_STATUS GetStatus() +{ + return STATUS_OK; +} + +bool HasSettings() +{ + return false; +} + +unsigned int GetSettings(StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS SetSetting(const char *settingName, const void *settingValue) +{ + return STATUS_OK; +} + +void FreeSettings() +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +void Remove() +{ +} + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/cyclone.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/cyclone.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/cyclone.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/cyclone.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,76 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _CYCLONE_HH +#define _CYCLONE_HH + +#include + +#include +#include + +#define MAX_COMPLEXITY 10u + +namespace Hack { + extern unsigned int numCyclones; + extern unsigned int numParticles; + extern float size; + extern unsigned int complexity; + extern float speed; + extern bool stretch; + extern bool showCurves; + extern bool southern; +}; + +class Cyclone { +private: + Vector _targetV[MAX_COMPLEXITY + 3]; + Vector _V[MAX_COMPLEXITY + 3]; + Vector _oldV[MAX_COMPLEXITY + 3]; + float _targetWidth[MAX_COMPLEXITY + 3]; + float _width[MAX_COMPLEXITY + 3]; + float _oldWidth[MAX_COMPLEXITY + 3]; + HSLColor _targetHSL; + HSLColor _HSL; + HSLColor _oldHSL; + std::pair _VChange[MAX_COMPLEXITY + 3]; + std::pair _widthChange[MAX_COMPLEXITY + 3]; + std::pair _HSLChange; +public: + Cyclone(); + + const HSLColor& color() const { + return _HSL; + } + + const Vector& v(unsigned int i) const { + return _V[i]; + } + + float width(unsigned int i) const { + return _width[i]; + } + + void update(); +}; + +#endif // _CYCLONE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,9 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_cyclone_SOURCES = $(COMMON) $(COLOR) $(VECTOR) blend.cc blend.hh cyclone.cc \ + cyclone.hh particle.cc particle.hh +rs_cyclone_LDADD = $(LIBMISC) $(X_LIBS) $(OPENGL_LIBS) + +hack_PROGRAMS = rs-cyclone diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/particle.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/particle.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/particle.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/particle.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,84 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include + +GLuint Particle::_list; + +void Particle::update() { + _lastV = _V; + if (_step > 1.0f) + setup(); + + // Take local copy for optimizability + unsigned int complexity = Hack::complexity; + + _V.set(0, 0, 0); + for (unsigned int i = 0; i < complexity + 3; ++i) + _V += _cy->v(i) * Blend::blend(i, _step); + + Vector dir; + Vector up(0.0f, 1.0f, 0.0f); + + for (unsigned int i = 0; i < complexity + 3; ++i) + dir += _cy->v(i) * Blend::blend(i, _step - 0.01f); + dir = _V - dir; + dir.normalize(); + Vector crossVec(Vector::cross(dir, up)); + + float tiltAngle = -std::acos(Vector::dot(dir, up)) * R2D; + unsigned int i = (unsigned int)(_step * (float(Hack::complexity) + 2.0f)); + if (i >= Hack::complexity + 2) + i = Hack::complexity + 1; + float between = ( + _step - + (float(i) / float(Hack::complexity + 2)) + ) * float(Hack::complexity + 2); + float cyWidth = _cy->width(i) * (1.0f - between) + + _cy->width(i + 1) * between; + float newStep = (0.005f * Hack::speed) / (_width * _width * cyWidth); + _step += newStep; + float newSpinAngle = (40.0f * Hack::speed) / (_width * cyWidth); + _spinAngle += Hack::southern ? -newSpinAngle : newSpinAngle; + + float scale = 1.0f; + if (Hack::stretch) + scale = Common::clamp( + _width * cyWidth * newSpinAngle * 0.02f, + 1.0f, cyWidth * 2.0f / Hack::size + ); + glColor3fv(_RGB.get()); + glPushMatrix(); + glLoadIdentity(); + glTranslatef(_V.x(), _V.y(), _V.z()); + glRotatef(tiltAngle, crossVec.x(), crossVec.y(), crossVec.z()); + glRotatef(_spinAngle, 0, 1, 0); + glTranslatef(_width * cyWidth, 0, 0); + glScalef(1.0f, 1.0f, scale); + glCallList(_list); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/particle.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/particle.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/cyclone/particle.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/cyclone/particle.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,67 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _PARTICLE_HH +#define _PARTICLE_HH + +#include + +#include +#include +#include + +class Particle { +private: + static GLuint _list; + + std::vector::const_iterator _cy; + + RGBColor _RGB; + Vector _V, _lastV; + float _width; + float _step; + float _spinAngle; +public: + static void init() { + _list = Common::resources->genLists(1); + glNewList(_list, GL_COMPILE); + GLUquadricObj* qobj = gluNewQuadric(); + gluSphere(qobj, Hack::size / 4.0f, 3, 2); + gluDeleteQuadric(qobj); + glEndList(); + } + + Particle(const std::vector::const_iterator& cy) : _cy(cy) { + setup(); + } + + void setup() { + _width = Common::randomFloat(0.8f) + 0.2f; + _step = 0.0f; + _spinAngle = Common::randomFloat(360); + _RGB = _cy->color(); + } + + void update(); +}; + +#endif // _PARTICLE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/dlopen.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/dlopen.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/dlopen.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/dlopen.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,73 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _DLOPEN_HH +#define _DLOPEN_HH + +#include + +#if USE_DLOPEN + +#include + +class Loader : public ResourceManager::Resource { +public: + typedef std::string Exception; +public: + Loader() { + if (lt_dlinit()) + throw Exception(lt_dlerror()); + } + ~Loader() { lt_dlexit(); } + void operator()() const {} +}; + +class Library; +class Library : public ResourceManager::Resource { +public: + typedef std::string Exception; +private: + lt_dlhandle _handle; +public: + Library(const std::string& library) { + static bool inited = false; + if (!inited) { + Common::resources->manage(new Loader); + inited = true; + } + _handle = lt_dlopenext(library.c_str()); + if (!_handle) + throw Exception(lt_dlerror()); + } + ~Library() { lt_dlclose(_handle); } + const Library* operator()() const { return this; } + lt_ptr operator()(const std::string& function) const { + lt_ptr ptr = lt_dlsym(_handle, function.c_str()); + if (!ptr) + throw Exception(lt_dlerror()); + return ptr; + } +}; + +#endif // USE_DLOPEN + +#endif // _DLOPEN_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/euphoria.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/euphoria.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/euphoria.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/euphoria.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,475 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include + +namespace Hack { + unsigned int numWisps = 5; + unsigned int numBackWisps = 0; + unsigned int density = 25; + float visibility = 35.0f; + float speed = 15.0f; + float feedback = 0.0f; + float feedbackSpeed = 1.0f; + unsigned int feedbackSize = 8; + std::string texture; + bool wireframe = false; +}; + +namespace Hack { + enum Arguments { + ARG_WISPS = 1, + ARG_BACKWISPS, + ARG_DENSITY, + ARG_VISIBILITY, + ARG_SPEED, + ARG_FEEDBACK, + ARG_FEEDBACKSPEED, + ARG_FEEDBACKSIZE, + ARG_TEXTURE, + ARG_WIREFRAME = 0x100, ARG_NO_WIREFRAME, + ARG_NO_TEXTURE = 0x200, ARG_PLASMA_TEXTURE, ARG_STRINGY_TEXTURE, + ARG_LINES_TEXTURE, ARG_RANDOM_TEXTURE + }; + + float _fr[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; + float _fv[4]; + float _f[4]; + + float _lr[3] = { 0.0f, 0.0f, 0.0f }; + float _lv[3]; + float _l[3]; + + GLuint _tex; + GLuint _feedbackTex; + unsigned int _feedbackTexSize; + stdx::dim3 _feedbackMap; + + std::vector _backWisps; + std::vector _wisps; + + error_t parse(int, char*, struct argp_state*); +}; + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { +retry: + switch (key) { + case ARG_WISPS: + if (Common::parseArg(arg, numWisps, 0u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "number of wisps must be between 0 and 100"); + return 0; + case ARG_BACKWISPS: + if (Common::parseArg(arg, numBackWisps, 0u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "number of background layers must be between 0 and 100"); + return 0; + case ARG_DENSITY: + if (Common::parseArg(arg, density, 2u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "mesh density must be between 2 and 100"); + return 0; + case ARG_VISIBILITY: + if (Common::parseArg(arg, visibility, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "mesh visibility must be between 1 and 100"); + return 0; + case ARG_SPEED: + if (Common::parseArg(arg, speed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "motion speed must be between 1 and 100"); + return 0; + case ARG_FEEDBACK: + if (Common::parseArg(arg, feedback, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "feedback intensity must be between 0 and 100"); + return 0; + case ARG_FEEDBACKSPEED: + if (Common::parseArg(arg, feedbackSpeed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "feedback speed must be between 1 and 100"); + return 0; + case ARG_FEEDBACKSIZE: + if (Common::parseArg(arg, feedbackSize, 1u, 10u)) + argp_failure(state, EXIT_FAILURE, 0, + "feedback speed must be between 1 and 10"); + return 0; + case ARG_WIREFRAME: + wireframe = true; + return 0; + case ARG_NO_WIREFRAME: + wireframe = false; + return 0; + case ARG_TEXTURE: + texture = arg; + return 0; + case ARG_NO_TEXTURE: + texture = ""; + return 0; + case ARG_PLASMA_TEXTURE: + texture = "plasma.png"; + return 0; + case ARG_STRINGY_TEXTURE: + texture = "stringy.png"; + return 0; + case ARG_LINES_TEXTURE: + texture = "lines.png"; + return 0; + case ARG_RANDOM_TEXTURE: + key = Common::randomInt(3) + ARG_PLASMA_TEXTURE; + goto retry; + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Global options:" }, + { "wisps", ARG_WISPS, "NUM", 0, "Number of wisps (0-100, default = 5)" }, + { "background", ARG_BACKWISPS, "NUM", 0, + "Number of background layers (0-100, default = 0)" }, + { NULL, 0, NULL, 0, "Wisp mesh options:" }, + { "density", ARG_DENSITY, "NUM", 0, + "Mesh density (2-100, default = 25)" }, + { "speed", ARG_SPEED, "NUM", 0, + "Motion speed (1-100, default = 15)" }, + { "visibility", ARG_VISIBILITY, "NUM", 0, + "Mesh visibility (1-100, default = 35)" }, + { "wireframe", ARG_WIREFRAME, NULL, 0, + "Enable wireframe mesh" }, + { "no-wireframe", ARG_NO_WIREFRAME, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "texture", ARG_TEXTURE, "FILE", 0, + "Wisp texture (default = no texture)" }, + { NULL, 0, NULL, 0, "Predefined textures:" }, + { "plain", ARG_NO_TEXTURE, NULL, 0 }, + { "plasma", ARG_PLASMA_TEXTURE, NULL, 0 }, + { "stringy", ARG_STRINGY_TEXTURE, NULL, 0 }, + { "lines", ARG_LINES_TEXTURE, NULL, 0 }, + { "random", ARG_RANDOM_TEXTURE, NULL, 0 }, + { NULL, 0, NULL, 0, "Feedback options:" }, + { "feedback", ARG_FEEDBACK, "NUM", 0, + "Feedback intensity (0-100, default = 0)" }, + { "feedbackspeed", ARG_FEEDBACKSPEED, "NUM", 0, + "Feedback speed (1-100, default = 1)" }, + { "feedbacksize", ARG_FEEDBACKSIZE, "NUM", 0, + "Feedback size (1-10, default = 3)" }, + {} + }; + static struct argp parser = { + options, parse, NULL, + "Draws patterned wisps, with optional psychadelic feedback." + }; + return &parser; +} + +std::string Hack::getShortName() { return "euphoria"; } +std::string Hack::getName() { return "Euphoria"; } + +void Hack::start() { + glViewport(0, 0, Common::width, Common::height); + + _tex = 0; + if (texture.length()) { + glEnable(GL_TEXTURE_2D); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + _tex = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + PNG(texture) + ); + } + + if (feedback > 0.0f) { + _feedbackTexSize = 1 << feedbackSize; + while ( + (_feedbackTexSize > Common::width) || + (_feedbackTexSize > Common::height) + ) + _feedbackTexSize >>= 1; + + // feedback texture setup + glEnable(GL_TEXTURE_2D); + _feedbackMap.resize(_feedbackTexSize, _feedbackTexSize); + _feedbackTex = Common::resources->genTexture( + GL_LINEAR, GL_LINEAR, GL_CLAMP, GL_CLAMP, + 3, _feedbackTexSize, _feedbackTexSize, + GL_RGB, GL_UNSIGNED_BYTE, &_feedbackMap.front(), false + ); + + // feedback velocity variable setup + _fv[0] = feedbackSpeed * (Common::randomFloat(0.025f) + 0.025f); + _fv[1] = feedbackSpeed * (Common::randomFloat(0.05f) + 0.05f); + _fv[2] = feedbackSpeed * (Common::randomFloat(0.05f) + 0.05f); + _fv[3] = feedbackSpeed * (Common::randomFloat(0.1f) + 0.1f); + _lv[0] = feedbackSpeed * (Common::randomFloat(0.0025f) + 0.0025f); + _lv[1] = feedbackSpeed * (Common::randomFloat(0.0025f) + 0.0025f); + _lv[2] = feedbackSpeed * (Common::randomFloat(0.0025f) + 0.0025f); + } + + // Initialize wisps + stdx::construct_n(_wisps, numWisps); + stdx::construct_n(_backWisps, numBackWisps); +} + +void Hack::tick() { + +Common::run(); + + // setup regular drawing area just in case feedback isn't used + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluPerspective(20.0, Common::aspectRatio, 0.01, 20); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -5.0); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE); + glLineWidth(2.0f); + glEnable(GL_LINE_SMOOTH); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + + // Update wisps + stdx::call_all(_wisps, &Wisp::update); + stdx::call_all(_backWisps, &Wisp::update); + + if (feedback > 0.0f) { + static float feedbackIntensity = feedback / 101.0f; + + // update feedback variables + for (unsigned int i = 0; i < 4; ++i) { + _fr[i] += Common::elapsedSecs * _fv[i]; + if (_fr[i] > M_PI * 2.0f) + _fr[i] -= M_PI * 2.0f; + } + _f[0] = 30.0f * std::cos(_fr[0]); + _f[1] = 0.2f * std::cos(_fr[1]); + _f[2] = 0.2f * std::cos(_fr[2]); + _f[3] = 0.8f * std::cos(_fr[3]); + for (unsigned int i = 0; i < 3; ++i) { + _lr[i] += Common::elapsedSecs * _lv[i]; + if (_lr[i] > M_PI * 2.0f) + _lr[i] -= M_PI * 2.0f; + _l[i] = std::cos(_lr[i]); + _l[i] = _l[i] * _l[i]; + } + + // Create drawing area for feedback texture + glViewport(0, 0, _feedbackTexSize, _feedbackTexSize); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(30.0, Common::aspectRatio, 0.01f, 20.0f); + glMatrixMode(GL_MODELVIEW); + + // Draw + glClear(GL_COLOR_BUFFER_BIT); + glColor3f(feedbackIntensity, feedbackIntensity, feedbackIntensity); + glBindTexture(GL_TEXTURE_2D, _feedbackTex); + glPushMatrix(); + glTranslatef(_f[1] * _l[1], _f[2] * _l[1], _f[3] * _l[2]); + glRotatef(_f[0] * _l[0], 0, 0, 1); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(-0.5f, -0.5f); + glVertex3f(-Common::aspectRatio * 2.0f, -2.0f, 1.25f); + glTexCoord2f(1.5f, -0.5f); + glVertex3f(Common::aspectRatio * 2.0f, -2.0f, 1.25f); + glTexCoord2f(-0.5f, 1.5f); + glVertex3f(-Common::aspectRatio * 2.0f, 2.0f, 1.25f); + glTexCoord2f(1.5f, 1.5f); + glVertex3f(Common::aspectRatio * 2.0f, 2.0f, 1.25f); + glEnd(); + glPopMatrix(); + glBindTexture(GL_TEXTURE_2D, _tex); + stdx::call_all(_backWisps, &Wisp::drawAsBackground); + stdx::call_all(_wisps, &Wisp::draw); + + // readback feedback texture + glReadBuffer(GL_BACK); + glPixelStorei(GL_UNPACK_ROW_LENGTH, _feedbackTexSize); + glBindTexture(GL_TEXTURE_2D, _feedbackTex); + glReadPixels(0, 0, _feedbackTexSize, _feedbackTexSize, GL_RGB, + GL_UNSIGNED_BYTE, &_feedbackMap.front()); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _feedbackTexSize, _feedbackTexSize, + GL_RGB, GL_UNSIGNED_BYTE, &_feedbackMap.front()); + + // create regular drawing area + glViewport(0, 0, Common::width, Common::height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(20.0, Common::aspectRatio, 0.01f, 20.0f); + glMatrixMode(GL_MODELVIEW); + + // Draw again + glClear(GL_COLOR_BUFFER_BIT); + glColor3f(feedbackIntensity, feedbackIntensity, feedbackIntensity); + glPushMatrix(); + glTranslatef(_f[1] * _l[1], _f[2] * _l[1], _f[3] * _l[2]); + glRotatef(_f[0] * _l[0], 0, 0, 1); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(-0.5f, -0.5f); + glVertex3f(-Common::aspectRatio * 2.0f, -2.0f, 1.25f); + glTexCoord2f(1.5f, -0.5f); + glVertex3f(Common::aspectRatio * 2.0f, -2.0f, 1.25f); + glTexCoord2f(-0.5f, 1.5f); + glVertex3f(-Common::aspectRatio * 2.0f, 2.0f, 1.25f); + glTexCoord2f(1.5f, 1.5f); + glVertex3f(Common::aspectRatio * 2.0f, 2.0f, 1.25f); + glEnd(); + glPopMatrix(); + + glBindTexture(GL_TEXTURE_2D, _tex); + } else + glClear(GL_COLOR_BUFFER_BIT); + + stdx::call_all(_backWisps, &Wisp::drawAsBackground); + stdx::call_all(_wisps, &Wisp::draw); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + //Common::flush(); + + // Clear the error flag + glGetError(); +} + +void Hack::reshape() { + glViewport(0, 0, Common::width, Common::height); + + // setup regular drawing area just in case feedback isn't used + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(20.0, Common::aspectRatio, 0.01, 20); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -5.0); +} + +void Hack::stop() { + _wisps.clear(); + _backWisps.clear(); + _feedbackMap.clear(); +} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + case 'q': case 'Q': + Common::running = false; + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} +void Hack::pointerMotion(int, int) {} +void Hack::buttonPress(unsigned int) {} +void Hack::buttonRelease(unsigned int) {} +void Hack::pointerEnter() {} +void Hack::pointerLeave() {} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + Common::init(0, NULL); + return ADDON_STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void ADDON_Stop() +{ + Hack::stop(); +} + +void ADDON_Destroy() +{ +} + +ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +bool ADDON_HasSettings() +{ + return false; +} + +unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue) +{ + return ADDON_STATUS_OK; +} + +void ADDON_FreeSettings() +{ +} + +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +void Remove() +{ +} + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/euphoria.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/euphoria.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/euphoria.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/euphoria.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,41 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _EUPHORIA_HH +#define _EUPHORIA_HH + +#include + +namespace Hack { + extern unsigned int numWisps; + extern unsigned int numBackWisps; + extern unsigned int density; + extern float visibility; + extern float speed; + extern float feedback; + extern float feedbackSpeed; + extern unsigned int feedbackSize; + extern std::string texture; + extern bool wireframe; +}; + +#endif // _EUPHORIA_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/lines.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/lines.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,19 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_euphoria_SOURCES = $(COMMON) $(COLOR) $(VECTOR) $(IMAGE) euphoria.cc \ + euphoria.hh wisp.cc wisp.hh + +AM_CPPFLAGS += $(IMAGE_CPPFLAGS) +AM_CXXFLAGS += $(IMAGE_CXXFLAGS) +AM_LDFLAGS += $(IMAGE_LDFLAGS) +rs_euphoria_LDADD = $(LIBMISC) $(X_LIBS) $(OPENGL_LIBS) $(IMAGE_LIBS) + +hack_PROGRAMS = rs-euphoria + +euphoriadatadir = $(pkgdatadir)/euphoria +dist_euphoriadata_DATA = lines.png plasma.png stringy.png + +uninstall-hook: + -rmdir $(euphoriadatadir) Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/plasma.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/plasma.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/stringy.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/stringy.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/wisp.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/wisp.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/wisp.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/wisp.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,277 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include + +Wisp::Wisp() { + float recHalfDens = 1.0f / (float(Hack::density) * 0.5f); + + _vertex.resize( Hack::density + 1, Hack::density + 1); + _intensity.resize(Hack::density + 1, Hack::density + 1); + _gridPos.resize( Hack::density + 1, Hack::density + 1); + + for (unsigned int i = 0; i <= Hack::density; ++i) + for (unsigned int j = 0; j <= Hack::density; ++j) { + Vector v( + float(i) * recHalfDens - 1.0f, + float(j) * recHalfDens - 1.0f, + 0.0f + ); + v.z() = v.lengthSquared(); + _gridPos(i, j) = v; + } + + // initialize constants + for (unsigned int i = 0; i < NUMCONSTS; ++i) { + _c[i] = Common::randomFloat(2.0f) - 1.0f; + _cr[i] = Common::randomFloat(M_PI * 2.0f); + _cv[i] = Common::randomFloat(Hack::speed * 0.03f) + + (Hack::speed * 0.001f); + } + + // pick color + _HSL.set( + Common::randomFloat(1.0f), + 0.1f + Common::randomFloat(0.9f), + 1.0f + ); + _hueSpeed = Common::randomFloat(0.1f) - 0.05f; + _saturationSpeed = Common::randomFloat(0.04f) + 0.001f; +} + +void Wisp::update() { + // visibility constants + static float viscon1 = Hack::visibility * 0.01f; + static float viscon2 = 1.0f / viscon1; + + // update constants + for (unsigned int i = 0; i < NUMCONSTS; ++i) { + _cr[i] += _cv[i] * Common::elapsedSecs; + if (_cr[i] > M_PI * 2.0f) + _cr[i] -= M_PI * 2.0f; + _c[i] = std::cos(_cr[i]); + } + + // update vertex positions + for (unsigned int i = 0; i <= Hack::density; ++i) + for (unsigned int j = 0; j <= Hack::density; ++j) + _vertex(i, j).set( + _gridPos(i, j).x() * _gridPos(i, j).x() * + _gridPos(i, j).y() * _c[0] + + _gridPos(i, j).z() * _c[1] + 0.5f * _c[2], + _gridPos(i, j).y() * _gridPos(i, j).y() * + _gridPos(i, j).z() * _c[3] + + _gridPos(i, j).x() * _c[4] + 0.5f * _c[5], + _gridPos(i, j).z() * _gridPos(i, j).z() * + _gridPos(i, j).x() * _c[6] + + _gridPos(i, j).y() * _c[7] + _c[8] + ); + + // update vertex normals for most of mesh + for (unsigned int i = 1; i < Hack::density; ++i) + for (unsigned int j = 1; j < Hack::density; ++j) { + Vector up(_vertex(i, j + 1) - _vertex(i, j - 1)); + Vector right(_vertex(i + 1, j) - _vertex(i - 1, j)); + up.normalize(); + right.normalize(); + Vector crossVec(Vector::cross(right, up)); + // Use depth component of normal to compute intensity + // This way only edges of wisp are bright + _intensity(i, j) = Common::clamp( + viscon2 * (viscon1 - std::abs(crossVec.z())), + 0.0f, 1.0f + ); + } + + // update color + float h = _HSL.h() + _hueSpeed * Common::elapsedSecs; + if (h < 0.0f) h += 1.0f; + if (h > 1.0f) h -= 1.0f; + float s = _HSL.s() + _saturationSpeed * Common::elapsedSecs; + if (s <= 0.1f) { + s = 0.1f; + _saturationSpeed = -_saturationSpeed; + } + if (s >= 1.0f) { + s = 1.0f; + _saturationSpeed = -_saturationSpeed; + } + _HSL.h() = h; + _HSL.s() = s; + _RGB = _HSL; +} + +void Wisp::draw() const { + glPushMatrix(); + + if (Hack::wireframe) { + for (unsigned int i = 1; i < Hack::density; ++i) { + glBegin(GL_LINE_STRIP); + for (unsigned int j = 0; j <= Hack::density; ++j) { + glColor3f( + _RGB.r() + _intensity(i, j) - 1.0f, + _RGB.g() + _intensity(i, j) - 1.0f, + _RGB.b() + _intensity(i, j) - 1.0f + ); + glTexCoord2d( + _gridPos(i, j).x() - _vertex(i, j).x(), + _gridPos(i, j).y() - _vertex(i, j).y() + ); + glVertex3fv(_vertex(i, j).get()); + } + glEnd(); + } + for (unsigned int j = 1; j < Hack::density; ++j) { + glBegin(GL_LINE_STRIP); + for (unsigned int i = 0; i <= Hack::density; ++i) { + glColor3f( + _RGB.r() + _intensity(i, j) - 1.0f, + _RGB.g() + _intensity(i, j) - 1.0f, + _RGB.b() + _intensity(i, j) - 1.0f + ); + glTexCoord2d( + _gridPos(i, j).x() - _vertex(i, j).x(), + _gridPos(i, j).y() - _vertex(i, j).y() + ); + glVertex3fv(_vertex(i, j).get()); + } + glEnd(); + } + } else { + for (unsigned int i = 0; i < Hack::density; ++i) { + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int j = 0; j <= Hack::density; ++j) { + glColor3f( + _RGB.r() + _intensity(i + 1, j) - 1.0f, + _RGB.g() + _intensity(i + 1, j) - 1.0f, + _RGB.b() + _intensity(i + 1, j) - 1.0f + ); + glTexCoord2d( + _gridPos(i + 1, j).x() - _vertex(i + 1, j).x(), + _gridPos(i + 1, j).y() - _vertex(i + 1, j).y() + ); + glVertex3fv(_vertex(i + 1, j).get()); + glColor3f( + _RGB.r() + _intensity(i, j) - 1.0f, + _RGB.g() + _intensity(i, j) - 1.0f, + _RGB.b() + _intensity(i, j) - 1.0f + ); + glTexCoord2d( + _gridPos(i, j).x() - _vertex(i, j).x(), + _gridPos(i, j).y() - _vertex(i, j).y() + ); + glVertex3fv(_vertex(i, j).get()); + } + glEnd(); + } + } + + glPopMatrix(); +} + +void Wisp::drawAsBackground() const { + glPushMatrix(); + glTranslatef(_c[0] * 0.2f, _c[1] * 0.2f, 1.6f); + + if (Hack::wireframe) { + for (unsigned int i = 1; i < Hack::density; ++i) { + glBegin(GL_LINE_STRIP); + for (unsigned int j = 0; j <= Hack::density; ++j) { + glColor3f( + _RGB.r() + _intensity(i, j) - 1.0f, + _RGB.g() + _intensity(i, j) - 1.0f, + _RGB.b() + _intensity(i, j) - 1.0f + ); + glTexCoord2d( + _gridPos(i, j).x() - _vertex(i, j).x(), + _gridPos(i, j).y() - _vertex(i, j).y() + ); + glVertex3f( + _gridPos(i, j).x(), + _gridPos(i, j).y(), + _intensity(i, j) + ); + } + glEnd(); + } + for (unsigned int j = 1; j < Hack::density; ++j) { + glBegin(GL_LINE_STRIP); + for (unsigned int i = 0; i <= Hack::density; ++i) { + glColor3f( + _RGB.r() + _intensity(i, j) - 1.0f, + _RGB.g() + _intensity(i, j) - 1.0f, + _RGB.b() + _intensity(i, j) - 1.0f + ); + glTexCoord2d( + _gridPos(i, j).x() - _vertex(i, j).x(), + _gridPos(i, j).y() - _vertex(i, j).y() + ); + glVertex3f( + _gridPos(i, j).x(), + _gridPos(i, j).y(), + _intensity(i, j) + ); + } + glEnd(); + } + } else { + for (unsigned int i = 0; i < Hack::density; ++i) { + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int j = 0; j <= Hack::density; ++j) { + glColor3f( + _RGB.r() + _intensity(i + 1, j) - 1.0f, + _RGB.g() + _intensity(i + 1, j) - 1.0f, + _RGB.b() + _intensity(i + 1, j) - 1.0f + ); + glTexCoord2d( + _gridPos(i + 1, j).x() - _vertex(i + 1, j).x(), + _gridPos(i + 1, j).y() - _vertex(i + 1, j).y() + ); + glVertex3f( + _gridPos(i + 1, j).x(), + _gridPos(i + 1, j).y(), + _intensity(i + 1, j) + ); + glColor3f( + _RGB.r() + _intensity(i, j) - 1.0f, + _RGB.g() + _intensity(i, j) - 1.0f, + _RGB.b() + _intensity(i, j) - 1.0f + ); + glTexCoord2d( + _gridPos(i, j).x() - _vertex(i, j).x(), + _gridPos(i, j).y() - _vertex(i, j).y() + ); + glVertex3f( + _gridPos(i, j).x(), + _gridPos(i, j).y(), + _intensity(i, j) + ); + } + glEnd(); + } + } + + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/wisp.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/wisp.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/euphoria/wisp.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/euphoria/wisp.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,54 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _WISP_HH +#define _WISP_HH + +#include + +#include +#include + +#define NUMCONSTS 9 + +class Wisp { +private: + stdx::dim2 _vertex; + stdx::dim2 _gridPos; + stdx::dim2 _intensity; + + float _c[NUMCONSTS]; // constants + float _cr[NUMCONSTS]; // constants' radial position + float _cv[NUMCONSTS]; // constants' change velocities + HSLColor _HSL; + RGBColor _RGB; + float _hueSpeed; + float _saturationSpeed; +public: + Wisp(); + + void update(); + void draw() const; + void drawAsBackground() const; +}; + +#endif // _WISP_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/fieldlines.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/fieldlines.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/fieldlines.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/fieldlines.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,373 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +namespace Hack { + unsigned int numIons = 4; + float stepSize = 15.0f; + unsigned int maxSteps = 100; + float width = 30.0f; + float speed = 10.0f; + bool constWidth = false; + bool electric = false; +}; + +namespace Hack { + enum Arguments { + ARG_IONS = 1, + ARG_SEGSIZE, + ARG_MAXSEGS, + ARG_SPEED, + ARG_WIDTH, + ARG_CONSTANT = 0x100, ARG_NO_CONSTANT, + ARG_ELECTRIC = 0x200, ARG_NO_ELECTRIC + }; + + std::vector _ions; + + static void drawFieldLine(const Ion&, float, float, float); + + error_t parse(int, char*, struct argp_state*); +}; + +static void Hack::drawFieldLine(const Ion& ion, float x, float y, float z) { + static float brightness = 10000.0f; + + int charge = ion.getCharge(); + Vector lastV(ion.getV()); + Vector dir(x, y, z); + + // Do the first segment + RGBColor RGB( + std::abs(dir.z()) * brightness, + std::abs(dir.x()) * brightness, + std::abs(dir.y()) * brightness + ); + RGB.clamp(); + RGBColor lastRGB(RGB); + glColor3fv(RGB.get()); + + Vector V(lastV + dir); + if (electric) + V += Vector( + Common::randomFloat(stepSize * 0.3f) - (stepSize * 0.15f), + Common::randomFloat(stepSize * 0.3f) - (stepSize * 0.15f), + Common::randomFloat(stepSize * 0.3f) - (stepSize * 0.15f) + ); + + if (!constWidth) + glLineWidth((V.z() + 300.0f) * 0.000333f * width); + + glBegin(GL_LINE_STRIP); + glColor3fv(lastRGB.get()); + glVertex3fv(lastV.get()); + glColor3fv(RGB.get()); + glVertex3fv(V.get()); + + Vector end; + unsigned int i; + for (i = 0; i < maxSteps; ++i) { + dir.set(0.0f, 0.0f, 0.0f); + for (std::vector::const_iterator j = _ions.begin(); j != _ions.end(); ++j) { + int repulsion = charge * j->getCharge(); + Vector temp(V - j->getV()); + float distSquared = temp.lengthSquared(); + float dist = std::sqrt(distSquared); + if (dist < stepSize && i > 2) { + end = j->getV(); + i = 10000; + } + temp /= dist; + if (distSquared < 1.0f) + distSquared = 1.0f; + dir += temp * (repulsion / distSquared); + } + + lastRGB = RGB; + RGB.set( + std::abs(dir.z()) * brightness, + std::abs(dir.x()) * brightness, + std::abs(dir.y()) * brightness + ); + if (electric) { + RGB *= 10.0f; + if (RGB.r() > RGB.g() * 0.5f) + RGB.r() = RGB.g() * 0.5f; + if (RGB.g() > RGB.b() * 0.3f) + RGB.g() = RGB.b() * 0.3f; + } + RGB.clamp(); + + float distSquared = dir.lengthSquared(); + float distRec = stepSize / std::sqrt(distSquared); + dir *= distRec; + if (electric) + dir += Vector( + Common::randomFloat(stepSize) - (stepSize * 0.5f), + Common::randomFloat(stepSize) - (stepSize * 0.5f), + Common::randomFloat(stepSize) - (stepSize * 0.5f) + ); + + lastV = V; + V += dir; + + if (!constWidth) { + glEnd(); + float lineWidth = (V.z() + 300.0f) * 0.000333f * width; + glLineWidth(lineWidth < 0.01f ? 0.01f : lineWidth); + glBegin(GL_LINE_STRIP); + } + + glColor3fv(lastRGB.get()); + glVertex3fv(lastV.get()); + + if (i != 10000) { + if (i == (maxSteps - 1)) + glColor3f(0.0f, 0.0f, 0.0f); + else + glColor3fv(RGB.get()); + glVertex3fv(V.get()); + } + } + + if (i == 10001) { + glColor3fv(RGB.get()); + glVertex3fv(end.get()); + } + + glEnd(); +} + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { + switch (key) { + case ARG_IONS: + if (Common::parseArg(arg, numIons, 1u, 10u)) + argp_failure(state, EXIT_FAILURE, 0, + "number of ions must be between 1 and 10"); + return 0; + case ARG_SEGSIZE: + if (Common::parseArg(arg, stepSize, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "fieldline segment length must be between 1 and 100"); + return 0; + case ARG_MAXSEGS: + if (Common::parseArg(arg, maxSteps, 1u, 1000u)) + argp_failure(state, EXIT_FAILURE, 0, + "maximum number of fieldline segments must be between 1 and 1000"); + return 0; + case ARG_SPEED: + if (Common::parseArg(arg, speed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "motion speed must be between 1 and 100"); + return 0; + case ARG_WIDTH: + if (Common::parseArg(arg, width, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "fieldline width factor must be between 1 and 100"); + return 0; + case ARG_CONSTANT: + constWidth = true; + return 0; + case ARG_NO_CONSTANT: + constWidth = false; + return 0; + case ARG_ELECTRIC: + electric = true; + return 0; + case ARG_NO_ELECTRIC: + electric = false; + return 0; + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Ion options:" }, + { "ions", ARG_IONS, "NUM", 0, "Number of ions (1-10, default = 4)" }, + { "speed", ARG_SPEED, "NUM", 0, "Motion speed (1-100, default = 10)" }, + { NULL, 0, NULL, 0, "Fieldline options:" }, + { "segsize", ARG_SEGSIZE, "NUM", 0, + "Length of each fieldline segment (1-100, default = 15)" }, + { "maxsegs", ARG_MAXSEGS, "NUM", 0, + "Maximum number of segments per fieldline (1-1000, default = 100)" }, + { "width", ARG_WIDTH, "NUM", 0, + "Fieldline width factor (1-100, default = 30)" }, + { "constant", ARG_CONSTANT, NULL, 0, "Enable constant-width fieldlines" }, + { "no-constant", ARG_NO_CONSTANT, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "electric", ARG_ELECTRIC, NULL, 0, "Enable electric mode" }, + { "no-electric", ARG_NO_ELECTRIC, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + {} + }; + static struct argp parser = { + options, parse, NULL, + "Simulates field lines between charged particles." + }; + return &parser; +} + +std::string Hack::getShortName() { return "fieldlines"; } +std::string Hack::getName() { return "Field Lines"; } + +void Hack::start() { + glViewport(0, 0, Common::width, Common::height); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_LINE_SMOOTH); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(80.0, Common::aspectRatio, 50, 3000); + glTranslatef(0.0, 0.0, -(WIDE * 2)); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + if (constWidth) + glLineWidth(width * 0.1f); + + stdx::construct_n(_ions, numIons); +} + +void Hack::tick() { + static float s = std::sqrt(stepSize * stepSize * 0.333f); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + stdx::call_all(_ions, &Ion::update); + + for (std::vector::const_iterator i = _ions.begin(); i != _ions.end(); ++i) { + drawFieldLine(*i, s, s, s); + drawFieldLine(*i, s, s, -s); + drawFieldLine(*i, s, -s, s); + drawFieldLine(*i, s, -s, -s); + drawFieldLine(*i, -s, s, s); + drawFieldLine(*i, -s, s, -s); + drawFieldLine(*i, -s, -s, s); + drawFieldLine(*i, -s, -s, -s); + } + +// Common::flush(); +} + +void Hack::reshape() { + glViewport(0, 0, Common::width, Common::height); +} + +void Hack::stop() {} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + case 'q': case 'Q': + Common::running = false; + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} +void Hack::pointerMotion(int, int) {} +void Hack::buttonPress(unsigned int) {} +void Hack::buttonRelease(unsigned int) {} +void Hack::pointerEnter() {} +void Hack::pointerLeave() {} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS Create(void* hdl, void* props) +{ + if (!props) + return STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + + return STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void Stop() +{ + Hack::stop(); +} + +void Destroy() +{ +} + +ADDON_STATUS GetStatus() +{ + return STATUS_OK; +} + +bool HasSettings() +{ + return false; +} + +unsigned int GetSettings(StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS SetSetting(const char *settingName, const void *settingValue) +{ + return STATUS_OK; +} + +void FreeSettings() +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +void Remove() +{ +} + +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/fieldlines.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/fieldlines.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/fieldlines.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/fieldlines.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,41 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _FIELDLINES_HH +#define _FIELDLINES_HH + +#include + +#define WIDE 200 +#define HIGH 150 + +namespace Hack { + extern unsigned int numIons; + extern float stepSize; + extern unsigned int maxSteps; + extern float width; + extern float speed; + extern bool constWidth; + extern bool electric; +}; + +#endif // _FIELDLINES_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/ion.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/ion.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/ion.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/ion.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,72 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _ION_HH +#define _ION_HH + +#include + +#include +#include + +class Ion { +private: + int _charge; + Vector _V; + Vector _vel; +public: + Ion() : _charge(Common::randomInt(2) ? 1 : -1), _V( + Common::randomFloat(2.0f * WIDE) - WIDE, + Common::randomFloat(2.0f * HIGH) - HIGH, + Common::randomFloat(2.0f * WIDE) - WIDE + ), _vel( + Common::randomFloat(Hack::speed * 0.1f) - (Hack::speed * 0.05f), + Common::randomFloat(Hack::speed * 0.1f) - (Hack::speed * 0.05f), + Common::randomFloat(Hack::speed * 0.1f) - (Hack::speed * 0.05f) + ) {} + + int getCharge() const { + return _charge; + } + + const Vector& getV() const { + return _V; + } + + void update() { + _V += _vel; + if (_V.x() > WIDE) + _vel.x() = _vel.x() - 0.001f * Hack::speed; + if (_V.x() < -WIDE) + _vel.x() = _vel.x() + 0.001f * Hack::speed; + if (_V.y() > HIGH) + _vel.y() = _vel.y() - 0.001f * Hack::speed; + if (_V.y() < -HIGH) + _vel.y() = _vel.y() + 0.001f * Hack::speed; + if (_V.z() > WIDE) + _vel.z() = _vel.z() - 0.001f * Hack::speed; + if (_V.z() < -WIDE) + _vel.z() = _vel.z() + 0.001f * Hack::speed; + } +}; + +#endif // _ION_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/fieldlines/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,9 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_fieldlines_SOURCES = $(COMMON) $(COLOR) $(VECTOR) fieldlines.cc \ + fieldlines.hh ion.hh +rs_fieldlines_LDADD = $(LIBMISC) $(X_LIBS) $(OPENGL_LIBS) + +hack_PROGRAMS = rs-fieldlines diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flocks/bug.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flocks/bug.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flocks/bug.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flocks/bug.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,240 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +float Bug::_wide, Bug::_high, Bug::_deep; +GLuint Bug::_list; + +void Bug::init() { + if (Hack::blobs) { + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + float ambient[4] = { 0.25f, 0.25f, 0.25f, 0.0f }; + float diffuse[4] = { 1.0f, 1.0f, 1.0f, 0.0f }; + float specular[4] = { 1.0f, 1.0f, 1.0f, 0.0f }; + float position[4] = { 500.0f, 500.0f, 500.0f, 0.0f }; + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, specular); + glLightfv(GL_LIGHT0, GL_POSITION, position); + glEnable(GL_COLOR_MATERIAL); + glMaterialf(GL_FRONT, GL_SHININESS, 10.0f); + glColorMaterial(GL_FRONT, GL_SPECULAR); + glColor3f(0.7f, 0.7f, 0.7f); + glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); + + _list = Common::resources->genLists(1); + glNewList(_list, GL_COMPILE); + GLUquadricObj* qObj = gluNewQuadric(); + gluSphere(qObj, Hack::size * 0.5f, Hack::complexity + 2, + Hack::complexity + 1); + gluDeleteQuadric(qObj); + glEndList(); + } +} + +void Bug::initBoundaries() { + if (Common::aspectRatio > 1.0f) { + _high = _deep = 160.0f; + _wide = _high * Common::aspectRatio; + glTranslatef(0.0f, 0.0f, -_wide * 2.0f); + } else { + _wide = _deep = 160.0f; + _high = _wide * Common::aspectRatio; + glTranslatef(0.0f, 0.0f, -_high * 2.0f); + } +} + +Bug::Bug(const Vector& XYZ, bool dir, float maxSpeed, float accel) : + _HSL(Common::randomFloat(1.0f), 1.0f, 1.0f), _XYZ(XYZ), _right(dir), + _up(dir), _forward(dir), _maxSpeed(maxSpeed), _accel(accel) {} + +void Bug::update() { + _speed.x() = Common::clamp(_speed.x(), -_maxSpeed, _maxSpeed); + _speed.y() = Common::clamp(_speed.y(), -_maxSpeed, _maxSpeed); + _speed.z() = Common::clamp(_speed.z(), -_maxSpeed, _maxSpeed); + + _XYZ += _speed * Common::elapsedSecs; + + RGBColor RGB(_HSL); + _halfRGB = RGB * 0.5f; + + glColor3fv(RGB.get()); + if (Hack::blobs) { + glPushMatrix(); + glTranslatef(_XYZ.x(), _XYZ.y(), _XYZ.z()); + if (Hack::stretch > 0.0f) { + float scale = _speed.length() * Hack::stretch * 0.002; + if (scale < 1.0f) scale = 1.0f; + Vector rotator(_speed); + rotator.normalize(); + glRotatef( + float(std::atan2(-rotator.x(), -rotator.z())) * R2D, + 0.0f, 1.0f, 0.0f + ); + glRotatef( + float(std::asin(rotator.y())) * R2D, + 1.0f, 0.0f, 0.0f + ); + glScalef(1.0f, 1.0f, scale); + } + glCallList(_list); + glPopMatrix(); + } else { + if (Hack::stretch) { + glLineWidth(Hack::size * float(700 - _XYZ.z()) * 0.0002f); + Vector scaler(_speed); + scaler.normalize(); + scaler *= Hack::stretch; + glBegin(GL_LINES); + glVertex3fv((_XYZ - scaler).get()); + glVertex3fv((_XYZ + scaler).get()); + glEnd(); + } else { + glPointSize(Hack::size * float(700 - _XYZ.z()) * 0.001f); + glBegin(GL_POINTS); + glVertex3fv(_XYZ.get()); + glEnd(); + } + } +} + +Leader::Leader() : Bug( + Vector( + Common::randomFloat(_wide * 2.0f) - _wide, + Common::randomFloat(_high * 2.0f) - _high, + Common::randomFloat(_deep * 2.0f) + _deep * 2.0f + ), true, 8.0f * Hack::speed, 13.0f * Hack::speed), + _craziness(Common::randomFloat(4.0f) + 0.05f), _nextChange(1.0f) {} + +void Leader::update() { + _nextChange -= Common::elapsedSecs; + if (_nextChange <= 0.0f) { + if (Common::randomInt(2)) + _right = !_right; + if (Common::randomInt(2)) + _up = !_up; + if (Common::randomInt(2)) + _forward = !_forward; + _nextChange = Common::randomFloat(_craziness); + } + _speed += Vector( + _right ? _accel : -_accel, + _up ? _accel : -_accel, + _forward ? -_accel : _accel + ) * Common::elapsedSecs; + if (_XYZ.x() < -_wide) _right = true; + if (_XYZ.x() > _wide) _right = false; + if (_XYZ.y() < -_high) _up = true; + if (_XYZ.y() > _high) _up = false; + if (_XYZ.z() < -_deep) _forward = false; + if (_XYZ.z() > _deep) _forward = true; + if (Hack::chromatek) { + float h = Common::clamp( + 0.666667f * ((_wide - _XYZ.z()) / (2.0f * _wide)), + 0.0f, 0.666667f + ); + _HSL.h() = h; + } + + Bug::update(); +} + +Follower::Follower(const std::vector::const_iterator& leader) : Bug( + Vector( + Common::randomFloat(_wide * 2.0f) - _wide, + Common::randomFloat(_high * 2.0f) - _high, + Common::randomFloat(_deep * 5.0f) + _deep * 2.5f + ), false, (Common::randomFloat(6.0f) + 4.0f) * Hack::speed, + (Common::randomFloat(4.0f) + 9.0f) * Hack::speed), + _leader(leader) {} + +void Follower::update(const std::vector& leaders) { + if (!Common::randomInt(10)) { + float oldDistance = 10000000.0f; + for ( + std::vector::const_iterator l = leaders.begin(); + l != leaders.end(); + ++l + ) { + float newDistance = (l->_XYZ - _XYZ).lengthSquared(); + if (newDistance < oldDistance) { + oldDistance = newDistance; + _leader = l; + } + } + } + _speed += Vector( + (_leader->_XYZ.x() - _XYZ.x()) > 0.0f ? + _accel : -_accel, + (_leader->_XYZ.y() - _XYZ.y()) > 0.0f ? + _accel : -_accel, + (_leader->_XYZ.z() - _XYZ.z()) > 0.0f ? + _accel : -_accel + ) * Common::elapsedSecs; + if (Hack::chromatek) { + _HSL.h() = Common::clamp( + 0.666667f * ((_wide - _XYZ.z()) / (2.0f * _wide)), + 0.0f, 0.666667f + ); + } else { + float h = _HSL.h(); + float leaderH = _leader->_HSL.h(); + if (std::abs(h - leaderH) < (Hack::colorFadeSpeed * Common::elapsedSecs)) { + _HSL.h() = leaderH; + } else { + if (std::abs(h - leaderH) < 0.5f) { + if (h > leaderH) + h -= Hack::colorFadeSpeed * Common::elapsedSecs; + else + h += Hack::colorFadeSpeed * Common::elapsedSecs; + } else { + if (h > leaderH) + h += Hack::colorFadeSpeed * Common::elapsedSecs; + else + h -= Hack::colorFadeSpeed * Common::elapsedSecs; + if (h > 1.0f) h -= 1.0f; + if (h < 0.0f) h += 1.0f; + } + _HSL.h() = h; + } + } + + Bug::update(); + + if (Hack::connections) { + glLineWidth(1.0f); + glBegin(GL_LINES); + glColor3fv(_halfRGB.get()); + glVertex3fv(_XYZ.get()); + glColor3fv(_leader->_halfRGB.get()); + glVertex3fv(_leader->_XYZ.get()); + glEnd(); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flocks/bug.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flocks/bug.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flocks/bug.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flocks/bug.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,73 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _BUG_HH +#define _BUG_HH + +#include + +#include +#include + +class Bug { +protected: + static float _wide, _high, _deep; + static GLuint _list; + + HSLColor _HSL; + RGBColor _halfRGB; + Vector _XYZ; + Vector _speed; + bool _right, _up, _forward; + float _maxSpeed; + float _accel; + + void update(); + Bug(const Vector&, bool, float, float); +public: + static void init(); + static void fini(); + static void initBoundaries(); +}; + +class Follower; + +class Leader : public Bug { +private: + float _craziness; // How prone to switching direction is this leader + float _nextChange; // Time until this leader's next direction change + + friend class Follower; +public: + Leader(); + void update(); +}; + +class Follower : public Bug { +private: + std::vector::const_iterator _leader; +public: + Follower(const std::vector::const_iterator&); + void update(const std::vector&); +}; + +#endif // _BUG_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flocks/flocks.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flocks/flocks.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flocks/flocks.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flocks/flocks.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,286 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +namespace Hack { + unsigned int numLeaders = 4; + unsigned int numFollowers = 400; + bool blobs = true; + float size = 10.0f; + unsigned int complexity = 1; + float speed = 15.0f; + float stretch = 20.0f; + float colorFadeSpeed = 15.0f; + bool chromatek = false; + bool connections = false; +}; + +namespace Hack { + enum Arguments { + ARG_LEADERS = 1, + ARG_FOLLOWERS, + ARG_SIZE, + ARG_STRETCH, + ARG_SPEED, + ARG_COMPLEXITY, + ARG_COLORSPEED, + ARG_CHROMATEK = 0x100, ARG_NO_CHROMATEK, + ARG_CONNECTIONS = 0x200, ARG_NO_CONNECTIONS + }; + + std::vector _leaders; + std::vector _followers; + + error_t parse(int, char*, struct argp_state*); +}; + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { + switch (key) { + case ARG_LEADERS: + if (Common::parseArg(arg, numLeaders, 1u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "number of leaders must be between 1 and 100"); + return 0; + case ARG_FOLLOWERS: + if (Common::parseArg(arg, numFollowers, 0u, 10000u)) + argp_failure(state, EXIT_FAILURE, 0, + "number of followers must be between 0 and 10000"); + return 0; + case ARG_SIZE: + if (Common::parseArg(arg, size, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "bug size must be between 1 and 100"); + return 0; + case ARG_STRETCH: + if (Common::parseArg(arg, stretch, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "bug stretchability must be between 0 and 100"); + return 0; + case ARG_SPEED: + if (Common::parseArg(arg, speed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "bug speed must be between 1 and 100"); + return 0; + case ARG_COMPLEXITY: + if (Common::parseArg(arg, complexity, 0u, 10u)) + argp_failure(state, EXIT_FAILURE, 0, + "camera speed must be between 0 and 10"); + blobs = complexity != 0; + return 0; + case ARG_COLORSPEED: + if (Common::parseArg(arg, colorFadeSpeed, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "color fade speed must be between 0 and 100"); + return 0; + case ARG_CHROMATEK: + chromatek = true; + return 0; + case ARG_NO_CHROMATEK: + chromatek = false; + return 0; + case ARG_CONNECTIONS: + connections = true; + return 0; + case ARG_NO_CONNECTIONS: + connections = false; + return 0; + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Flock options:" }, + { "leaders", ARG_LEADERS, "NUM", 0, + "Number of leaders (1-100, default = 4)" }, + { "followers", ARG_FOLLOWERS, "NUM", 0, + "Number of followers (0-10000, default = 400)" }, + { NULL, 0, NULL, 0, "Bug options:" }, + { "size", ARG_SIZE, "NUM", 0, "Bug size (1-100, default = 10)" }, + { "stretch", ARG_STRETCH, "NUM", 0, + "Bug stretchability (0-100, default = 20)" }, + { "speed", ARG_SPEED, "NUM", 0, "Bug speed (1-100, default = 15)" }, + { "complexity", ARG_COMPLEXITY, "NUM", 0, + "Bug complexity (1-10, 0 for lines, default = 1)" }, + { "colorspeed", ARG_COLORSPEED, "NUM", 0, + "Color fade speed (0-100, default = 15)" }, + { NULL, 0, NULL, 0, "Other options:" }, + { "chromadepth", ARG_CHROMATEK, NULL, 0, "Enable ChromaDepth mode" }, + { "no-chromadepth", ARG_NO_CHROMATEK, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "connections", ARG_CONNECTIONS, NULL, 0, "Draw connection lines" }, + { "no-connections", ARG_NO_CONNECTIONS, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + {} + }; + static struct argp parser = + { options, parse, NULL, "Draws 3D swarms of little bugs." }; + return &parser; +} + +std::string Hack::getShortName() { return "flocks"; } +std::string Hack::getName() { return "Flocks"; } + +void Hack::start() { + glEnable(GL_DEPTH_TEST); + glFrontFace(GL_CCW); + glEnable(GL_CULL_FACE); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glEnable(GL_LINE_SMOOTH); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + + glViewport(0, 0, Common::width, Common::height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(80.0, Common::aspectRatio, 50, 2000); + + Bug::initBoundaries(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + Bug::init(); + + stdx::construct_n(_leaders, numLeaders); + stdx::construct_n(_followers, numFollowers, _leaders.begin()); + + colorFadeSpeed *= 0.01f; +} + +void Hack::tick() { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + stdx::call_all(_leaders, &Leader::update); + stdx::call_all(_followers, &Follower::update, _leaders); + + Common::flush(); +} + +void Hack::reshape() { + glViewport(0, 0, Common::width, Common::height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(80.0, Common::aspectRatio, 50, 2000); + + Bug::initBoundaries(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +void Hack::stop() {} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + case 'q': case 'Q': + Common::running = false; + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} +void Hack::pointerMotion(int, int) {} +void Hack::buttonPress(unsigned int) {} +void Hack::buttonRelease(unsigned int) {} +void Hack::pointerEnter() {} +void Hack::pointerLeave() {} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS Create(void* hdl, void* props) +{ + if (!props) + return STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + + return STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void Stop() +{ + Hack::stop(); +} + +void Destroy() +{ +} + +ADDON_STATUS GetStatus() +{ + return STATUS_OK; +} + +bool HasSettings() +{ + return false; +} + +unsigned int GetSettings(StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS SetSetting(const char *settingName, const void *settingValue) +{ + return STATUS_OK; +} + +void FreeSettings() +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +void Remove() +{ +} + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flocks/flocks.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flocks/flocks.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flocks/flocks.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flocks/flocks.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,41 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _FLOCKS_HH +#define _FLOCKS_HH + +#include + +namespace Hack { + extern unsigned int numLeaders; + extern unsigned int numFollowers; + extern bool blobs; + extern float size; + extern unsigned int complexity; + extern float speed; + extern float stretch; + extern float colorFadeSpeed; + extern bool chromatek; + extern bool connections; +}; + +#endif // _FLOCKS_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flocks/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flocks/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flocks/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flocks/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,9 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_flocks_SOURCES = $(COMMON) $(COLOR) $(VECTOR) bug.cc bug.hh flocks.cc \ + flocks.hh +rs_flocks_LDADD = $(LIBMISC) $(X_LIBS) $(OPENGL_LIBS) + +hack_PROGRAMS = rs-flocks diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flux/flux.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flux/flux.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flux/flux.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flux/flux.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,403 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +namespace Hack { + unsigned int numFluxes = 1; + unsigned int numTrails = 20; + unsigned int trailLength = 40; + GeometryType geometry = LIGHTS_GEOMETRY; + float size = 15.0f; + unsigned int complexity = 3; + unsigned int randomize = 0; + float expansion = 40.0f; + float rotation = 30.0f; + float wind = 20.0f; + float instability = 20.0f; + float blur = 0.0f; +}; + +namespace Hack { + enum Arguments { + ARG_FLUXES = 1, + ARG_TRAILS, + ARG_LENGTH, + ARG_SIZE, + ARG_COMPLEXITY, + ARG_SPEED, + ARG_RANDOMIZATION, + ARG_ROTATION, + ARG_CROSSWIND, + ARG_INSTABILITY, + ARG_BLUR, + ARG_POINTS_GEOMETRY = 0x100, ARG_SPHERES_GEOMETRY, ARG_LIGHTS_GEOMETRY + }; + + std::vector _fluxes; + + error_t parse(int, char*, struct argp_state*); +}; + +Flux::Flux() { + stdx::construct_n(_trails, Hack::numTrails); + _randomize = 1; + + for (unsigned int i = 0; i < NUMCONSTS; ++i) { + _c[i] = Common::randomFloat(2.0f) - 1.0f; + _cv[i] = Common::randomFloat(0.000005f * + Hack::instability * Hack::instability) + + 0.000001f * Hack::instability * Hack::instability; + } + + _oldDistance = 0.0f; +} + +void Flux::update(float cosCameraAngle, float sinCameraAngle) { + // randomize constants + if (Hack::randomize) { + if (!--_randomize) { + for (unsigned int i = 0; i < NUMCONSTS; ++i) + _c[i] = Common::randomFloat(2.0f) - 1.0f; + unsigned int temp = 101 - Hack::randomize; + temp = temp * temp; + _randomize = temp + Common::randomInt(temp); + } + } + + // update constants + for (unsigned int i = 0; i < NUMCONSTS; ++i) { + _c[i] += _cv[i]; + if (_c[i] >= 1.0f) { + _c[i] = 1.0f; + _cv[i] = -_cv[i]; + } + if (_c[i] <= -1.0f) { + _c[i] = -1.0f; + _cv[i] = -_cv[i]; + } + } + + // update all particles in this flux field + std::vector::iterator j = _trails.end(); + for (std::vector::iterator i = _trails.begin(); i != j; ++i) + i->update(_c, cosCameraAngle, sinCameraAngle); +} + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { + switch (key) { + case ARG_FLUXES: + if (Common::parseArg(arg, numFluxes, 1u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "number of flux fields must be between 1 and 100"); + return 0; + case ARG_TRAILS: + if (Common::parseArg(arg, numTrails, 1u, 1000u)) + argp_failure(state, EXIT_FAILURE, 0, + "particles per flux field must be between 1 and 1000"); + return 0; + case ARG_LENGTH: + if (Common::parseArg(arg, trailLength, 3u, 10000u)) + argp_failure(state, EXIT_FAILURE, 0, + "particle trail length must be between 3 and 10000"); + return 0; + case ARG_SIZE: + if (Common::parseArg(arg, size, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "particle size must be between 1 and 100"); + return 0; + case ARG_POINTS_GEOMETRY: + geometry = POINTS_GEOMETRY; + return 0; + case ARG_SPHERES_GEOMETRY: + geometry = SPHERES_GEOMETRY; + return 0; + case ARG_LIGHTS_GEOMETRY: + geometry = LIGHTS_GEOMETRY; + return 0; + case ARG_COMPLEXITY: + if (Common::parseArg(arg, complexity, 1u, 10u)) + argp_failure(state, EXIT_FAILURE, 0, + "sphere complexity must be between 1 and 10"); + return 0; + case ARG_SPEED: + if (Common::parseArg(arg, expansion, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "expansion rate must be between 0 and 100"); + return 0; + case ARG_RANDOMIZATION: + if (Common::parseArg(arg, randomize, 0u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "randomization frequency must be between 0 and 100"); + return 0; + case ARG_ROTATION: + if (Common::parseArg(arg, rotation, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "rotation rate must be between 0 and 100"); + return 0; + case ARG_CROSSWIND: + if (Common::parseArg(arg, wind, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "crosswind speed must be between 0 and 100"); + return 0; + case ARG_INSTABILITY: + if (Common::parseArg(arg, instability, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "instability must be between 1 and 100"); + return 0; + case ARG_BLUR: + if (Common::parseArg(arg, blur, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "motion blur must be between 0 and 100"); + return 0; + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Flux options:" }, + { "fluxes", ARG_FLUXES, "NUM", 0, + "Number of flux fields (1-100, default = 1)" }, + { "particles", ARG_TRAILS, "NUM", 0, + "Particles per flux field (1-1000, default = 20)" }, + { NULL, 0, NULL, 0, "Particle options:" }, + { "length", ARG_LENGTH, "NUM", 0, + "Particle trail length (3-10000, default = 40)" }, + { "size", ARG_SIZE, "NUM", 0, "Particle size (1-100, default = 15)" }, + { NULL, 0, NULL, 0, "Geometry options:" }, + { "points", ARG_POINTS_GEOMETRY, NULL, 0, + "Particle geometry (default = lights)" }, + { "spheres", ARG_SPHERES_GEOMETRY, NULL, OPTION_ALIAS }, + { "lights", ARG_LIGHTS_GEOMETRY, NULL, OPTION_ALIAS }, + { "complexity", ARG_COMPLEXITY, "NUM", 0, + "Sphere complexity (1-10, default = 3)" }, + { NULL, 0, NULL, 0, "Other options:" }, + { "speed", ARG_SPEED, "NUM", 0, "Expansion rate (0-100, default = 40)" }, + { "randomness", ARG_RANDOMIZATION, "NUM", 0, + "Randomization frequency (0-100, default = 0)" }, + { "rotation", ARG_ROTATION, "NUM", 0, "Rotation rate (0-100, default = 30)" }, + { "wind", ARG_CROSSWIND, "NUM", 0, + "Crosswind speed (0-100, default = 20)" }, + { "instability", ARG_INSTABILITY, "NUM", 0, + "Instability (1-100, default = 20)" }, + { "blur", ARG_BLUR, "NUM", 0, "Motion blur (0-100, default = 0)" }, + {} + }; + static struct argp parser = { + options, parse, NULL, + "Draws a particle system based on strange attractor equations." + }; + return &parser; +} + +std::string Hack::getShortName() { return "flux"; } +std::string Hack::getName() { return "Flux"; } + +void Hack::start() { + glViewport(0, 0, Common::width, Common::height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(100.0, Common::aspectRatio, 0.01, 200); + glTranslatef(0.0, 0.0, -2.5); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + if (geometry == POINTS_GEOMETRY) + glEnable(GL_POINT_SMOOTH); + + glFrontFace(GL_CCW); + glEnable(GL_CULL_FACE); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + Trail::init(); + + // Initialize flux fields + stdx::construct_n(_fluxes, numFluxes); +} + +void Hack::tick() { + // clear the screen + glLoadIdentity(); + if (blur) { // partially + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + glColor4f(0.0f, 0.0f, 0.0f, 0.5f - + float(std::sqrt(std::sqrt(blur))) * 0.15495f); + glBegin(GL_TRIANGLE_STRIP); + glVertex3f(-5.0f, -4.0f, 0.0f); + glVertex3f(5.0f, -4.0f, 0.0f); + glVertex3f(-5.0f, 4.0f, 0.0f); + glVertex3f(5.0f, 4.0f, 0.0f); + glEnd(); + } else // completely + glClear(GL_COLOR_BUFFER_BIT); + + static float cameraAngle = 0.0f; + + cameraAngle += 0.01f * rotation; + if (cameraAngle >= 360.0f) + cameraAngle -= 360.0f; + + float cosCameraAngle = 0.0f, sinCameraAngle = 0.0f; + // set up blend modes for rendering particles + switch (geometry) { + case POINTS_GEOMETRY: + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glEnable(GL_BLEND); + glEnable(GL_POINT_SMOOTH); + glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); + cosCameraAngle = std::cos(cameraAngle * D2R); + sinCameraAngle = std::sin(cameraAngle * D2R); + break; + case SPHERES_GEOMETRY: + glRotatef(cameraAngle, 0.0f, 1.0f, 0.0f); + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + glClear(GL_DEPTH_BUFFER_BIT); + break; + case LIGHTS_GEOMETRY: + glBlendFunc(GL_ONE, GL_ONE); + glEnable(GL_BLEND); + cosCameraAngle = std::cos(cameraAngle * D2R); + sinCameraAngle = std::sin(cameraAngle * D2R); + break; + } + + // Update particles + std::vector::iterator j = _fluxes.end(); + for (std::vector::iterator i = _fluxes.begin(); i != j; ++i) + i->update(cosCameraAngle, sinCameraAngle); + + Common::flush(); +} + +void Hack::reshape() { + glViewport(0, 0, Common::width, Common::height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(100.0, Common::aspectRatio, 0.01, 200); + glTranslatef(0.0, 0.0, -2.5); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +void Hack::stop() {} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + case 'q': case 'Q': + Common::running = false; + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} +void Hack::pointerMotion(int, int) {} +void Hack::buttonPress(unsigned int) {} +void Hack::buttonRelease(unsigned int) {} +void Hack::pointerEnter() {} +void Hack::pointerLeave() {} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS Create(void* hdl, void* props) +{ + if (!props) + return STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + + return STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void Stop() +{ + Hack::stop(); +} + +void Destroy() +{ +} + +ADDON_STATUS GetStatus() +{ + return STATUS_OK; +} + +bool HasSettings() +{ + return false; +} + +unsigned int GetSettings(StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS SetSetting(const char *settingName, const void *settingValue) +{ + return STATUS_OK; +} + +void FreeSettings() +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +void Remove() +{ +} + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flux/flux.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flux/flux.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flux/flux.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flux/flux.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,66 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _FLUX_HH +#define _FLUX_HH + +#include + +#define NUMCONSTS 8 + +namespace Hack { + enum GeometryType { + POINTS_GEOMETRY, + SPHERES_GEOMETRY, + LIGHTS_GEOMETRY + }; + + extern unsigned int numFluxes; + extern unsigned int numTrails; + extern unsigned int trailLength; + extern GeometryType geometry; + extern float size; + extern unsigned int complexity; + extern unsigned int randomize; + extern float expansion; + extern float rotation; + extern float wind; + extern float instability; + extern float blur; +}; + +class Trail; + +class Flux { +private: + std::vector _trails; + unsigned int _randomize; + float _c[NUMCONSTS]; // constants + float _cv[NUMCONSTS]; // constants' change velocities + float _oldDistance; +public: + Flux(); + + void update(float, float); +}; + +#endif // _FLUX_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flux/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flux/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flux/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flux/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,8 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_flux_SOURCES = $(COMMON) $(COLOR) $(VECTOR) flux.cc flux.hh trail.cc trail.hh +rs_flux_LDADD = $(LIBMISC) $(X_LIBS) $(OPENGL_LIBS) + +hack_PROGRAMS = rs-flux diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flux/trail.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flux/trail.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flux/trail.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flux/trail.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,263 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include + +#define LIGHTSIZE 64 + +GLuint Trail::_list; +GLuint Trail::_lightTexture; + +void Trail::init() { + switch (Hack::geometry) { + case Hack::SPHERES_GEOMETRY: + { + _list = Common::resources->genLists(1); + glNewList(_list, GL_COMPILE); + GLUquadricObj* qObj = gluNewQuadric(); + gluSphere(qObj, 0.005f * Hack::size, Hack::complexity + 2, + Hack::complexity + 1); + gluDeleteQuadric(qObj); + glEndList(); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + float ambient[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + float diffuse[4] = {1.0f, 1.0f, 1.0f, 0.0f}; + float specular[4] = {1.0f, 1.0f, 1.0f, 0.0f}; + float position[4] = {500.0f, 500.0f, 500.0f, 0.0f}; + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, specular); + glLightfv(GL_LIGHT0, GL_POSITION, position); + glEnable(GL_COLOR_MATERIAL); + glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); + } + break; + case Hack::LIGHTS_GEOMETRY: + { + GLubyte light[LIGHTSIZE][LIGHTSIZE]; + for (int i = 0; i < LIGHTSIZE; ++i) { + for (int j = 0; j < LIGHTSIZE; ++j) { + float x = float(i - LIGHTSIZE / 2) / float(LIGHTSIZE / 2); + float y = float(j - LIGHTSIZE / 2) / float(LIGHTSIZE / 2); + float temp = Common::clamp( + 1.0f - float(std::sqrt((x * x) + (y * y))), + 0.0f, 1.0f + ); + light[i][j] = GLubyte(255.0f * temp * temp); + } + } + _lightTexture = Common::resources->genTexture( + GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + 1, LIGHTSIZE, LIGHTSIZE, + GL_LUMINANCE, GL_UNSIGNED_BYTE, light, false + ); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glEnable(GL_TEXTURE_2D); + + float temp = Hack::size * 0.005f; + _list = Common::resources->genLists(1); + glNewList(_list, GL_COMPILE); + glBindTexture(GL_TEXTURE_2D, _lightTexture); + glBegin(GL_TRIANGLES); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-temp, -temp, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(temp, -temp, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(temp, temp, 0.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-temp, -temp, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(temp, temp, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-temp, temp, 0.0f); + glEnd(); + glEndList(); + } + break; + default: + break; + } +} + +void Trail::update(const float* c, float cosCameraAngle, float sinCameraAngle) { + unsigned int oldCounter = _counter; + + ++_counter; + if (_counter >= Hack::trailLength) + _counter = 0; + + // Here's the iterative math for calculating new vertex positions + // first calculate limiting terms which keep vertices from constantly + // flying off to infinity + float cx = _vertices[oldCounter].x() * + (1.0f - 1.0f / (_vertices[oldCounter].x() * + _vertices[oldCounter].x() + 1.0f)); + float cy = _vertices[oldCounter].y() * + (1.0f - 1.0f / (_vertices[oldCounter].y() * + _vertices[oldCounter].y() + 1.0f)); + float cz = _vertices[oldCounter].z() * + (1.0f - 1.0f / (_vertices[oldCounter].z() * + _vertices[oldCounter].z() + 1.0f)); + // then calculate new positions + _vertices[_counter].set( + _vertices[oldCounter].x() + c[6] * _offset.x() - cx + + c[2] * _vertices[oldCounter].y() + + c[5] * _vertices[oldCounter].z(), + _vertices[oldCounter].y() + c[6] * _offset.y() - cy + + c[1] * _vertices[oldCounter].z() + + c[4] * _vertices[oldCounter].x(), + _vertices[oldCounter].z() + c[6] * _offset.z() - cz + + c[0] * _vertices[oldCounter].x() + + c[3] * _vertices[oldCounter].y() + ); + + // Pick a hue + _hues[_counter] = cx * cx + cy * cy + cz * cz; + if (_hues[_counter] > 1.0f) _hues[_counter] = 1.0f; + _hues[_counter] += c[7]; + // Limit the hue (0 - 1) + if (_hues[_counter] > 1.0f) _hues[_counter] -= 1.0f; + if (_hues[_counter] < 0.0f) _hues[_counter] += 1.0f; + // Pick a saturation + _sats[_counter] = c[0] + _hues[_counter]; + // Limit the saturation (0 - 1) + if (_sats[_counter] < 0.0f) _sats[_counter] = -_sats[_counter]; + _sats[_counter] -= float(int(_sats[_counter])); + _sats[_counter] = 1.0f - (_sats[_counter] * _sats[_counter]); + + // Bring particles back if they escape + if (!_counter) { + if ( + (_vertices[0].x() > 10000.0f) || + (_vertices[0].x() < -10000.0f) || + (_vertices[0].y() > 10000.0f) || + (_vertices[0].y() < -10000.0f) || + (_vertices[2].z() > 10000.0f) || + (_vertices[0].z() < -10000.0f) + ) { + _vertices[0].set( + Common::randomFloat(2.0f) - 1.0f, + Common::randomFloat(2.0f) - 1.0f, + Common::randomFloat(2.0f) - 1.0f + ); + } + } + + // Draw every vertex in particle trail + unsigned int p = _counter; + unsigned int growth = 0; + static float lumDiff = 1.0f / float(Hack::trailLength); + float luminosity = lumDiff; + for (unsigned int i = 0; i < Hack::trailLength; ++i) { + ++p; + if (p >= Hack::trailLength) p = 0; + ++growth; + + // assign color to particle + glColor3fv(RGBColor(HSLColor(_hues[p], _sats[p], luminosity)).get()); + + float depth = 0.0f; + glPushMatrix(); + if (Hack::geometry == Hack::SPHERES_GEOMETRY) + glTranslatef( + _vertices[p].x(), + _vertices[p].y(), + _vertices[p].z() + ); + else { // Points or lights + depth = + cosCameraAngle * _vertices[p].z() - + sinCameraAngle * _vertices[p].x(); + glTranslatef( + cosCameraAngle * _vertices[p].x() + + sinCameraAngle * _vertices[p].z(), + _vertices[p].y(), + depth + ); + } + if (Hack::geometry != Hack::POINTS_GEOMETRY) { + switch (Hack::trailLength - growth) { + case 0: + glScalef(0.259f, 0.259f, 0.259f); + break; + case 1: + glScalef(0.5f, 0.5f, 0.5f); + break; + case 2: + glScalef(0.707f, 0.707f, 0.707f); + break; + case 3: + glScalef(0.866f, 0.866f, 0.866f); + break; + case 4: + glScalef(0.966f, 0.966f, 0.966f); + break; + } + } + switch (Hack::geometry) { + case Hack::POINTS_GEOMETRY: + switch (Hack::trailLength - growth) { + case 0: + glPointSize(float(Hack::size * (depth + 200.0f) * 0.001036f)); + break; + case 1: + glPointSize(float(Hack::size * (depth + 200.0f) * 0.002f)); + break; + case 2: + glPointSize(float(Hack::size * (depth + 200.0f) * 0.002828f)); + break; + case 3: + glPointSize(float(Hack::size * (depth + 200.0f) * 0.003464f)); + break; + case 4: + glPointSize(float(Hack::size * (depth + 200.0f) * 0.003864f)); + break; + default: + glPointSize(float(Hack::size * (depth + 200.0f) * 0.004f)); + break; + } + glBegin(GL_POINTS); + glVertex3f(0.0f, 0.0f, 0.0f); + glEnd(); + break; + case Hack::SPHERES_GEOMETRY: + case Hack::LIGHTS_GEOMETRY: + glCallList(_list); + } + glPopMatrix(); + + static float expander = 1.0f + 0.0005f * Hack::expansion; + static float blower = 0.001f * Hack::wind; + + _vertices[p] *= expander; + _vertices[p].z() += blower; + luminosity += lumDiff; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flux/trail.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flux/trail.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/flux/trail.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/flux/trail.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,68 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _TRAIL_HH +#define _TRAIL_HH + +#include +#include +#include + +class Trail { +private: + static GLuint _list; + static GLuint _lightTexture; + + std::vector _vertices; + std::vector _hues; + std::vector _sats; + unsigned int _counter; + Vector _offset; +public: + static void init(); + + Trail() { + static unsigned int whichTrail = 0; + + // Offsets are somewhat like default positions for the head of each + // particle trail. Offsets spread out the particle trails and keep + // them from all overlapping. + _offset.set( + std::cos(M_PI * 2.0f * float(whichTrail) / float(Hack::numTrails)), + float(whichTrail) / float(Hack::numTrails) - 0.5f, + std::sin(M_PI * 2.0f * float(whichTrail) / float(Hack::numTrails)) + ); + ++whichTrail; + + // Initialize memory and set initial positions out of view of the + // camera + _vertices.resize(Hack::trailLength, Vector(0.0f, 3.0f, 0.0f)); + _hues.resize(Hack::trailLength); + _sats.resize(Hack::trailLength); + + _counter = 0; + } + + void update(const float*, float, float); +}; + +#endif // _TRAIL_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hack.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hack.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hack.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hack.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,51 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _HACK_HH +#define _HACK_HH + +#include + +#include + +namespace Hack { + typedef Common::Exception Exception; + + std::string getShortName(); + std::string getName(); + + const struct argp* getParser(); + void start(); + void reshape(); + void tick(); + void stop(); + + void keyPress(char, const KeySym&); + void keyRelease(char, const KeySym&); + void buttonPress(unsigned int); + void buttonRelease(unsigned int); + void pointerMotion(int, int); + void pointerEnter(); + void pointerLeave(); +}; + +#endif // _HACK_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/helios.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/helios.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/helios.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/helios.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,770 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Hack { + unsigned int numIons = 1500; + float size = 10.0f; + unsigned int numEmitters = 3; + unsigned int numAttractors = 3; + float speed = 10.0f; + float cameraSpeed = 10.0f; + bool surface = true; + bool wireframe = false; + float blur = 30.0f; + std::string texture("spheremap.png"); +}; + +namespace Hack { + enum Arguments { + ARG_IONS = 1, + ARG_EMITTERS, + ARG_ATTRACTORS, + ARG_SIZE, + ARG_SPEED, + ARG_CAMERASPEED, + ARG_BLUR, + ARG_TEXTURE, + ARG_SURFACE = 0x100, ARG_NO_SURFACE, + ARG_WIREFRAME = 0x200, ARG_NO_WIREFRAME + }; + + std::vector _eList; + std::vector _aList; + std::vector _iList; + std::vector _spheres; + + GLuint _texture; + Implicit* _surface; + + void setTargets(unsigned int); + float surfaceFunction(const Vector&); + + error_t parse(int, char*, struct argp_state*); +}; + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { + switch (key) { + case ARG_IONS: + if (Common::parseArg(arg, numIons, 1u, 30000u)) + argp_failure(state, EXIT_FAILURE, 0, + "number of ions must be between 1 and 30000"); + return 0; + case ARG_EMITTERS: + if (Common::parseArg(arg, numEmitters, 1u, 10u)) + argp_failure(state, EXIT_FAILURE, 0, + "number of ion emitters must be between 1 and 10"); + return 0; + case ARG_ATTRACTORS: + if (Common::parseArg(arg, numAttractors, 1u, 10u)) + argp_failure(state, EXIT_FAILURE, 0, + "number of ion attractors must be between 1 and 10"); + return 0; + case ARG_SIZE: + if (Common::parseArg(arg, size, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "ion size must be between 1 and 100"); + return 0; + case ARG_SPEED: + if (Common::parseArg(arg, speed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "ion speed must be between 1 and 100"); + return 0; + case ARG_CAMERASPEED: + if (Common::parseArg(arg, cameraSpeed, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "camera speed must be between 0 and 100"); + return 0; + case ARG_BLUR: + if (Common::parseArg(arg, blur, 0.0f, 30.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "motion blur must be between 0 and 30"); + return 0; + case ARG_SURFACE: + surface = true; + return 0; + case ARG_NO_SURFACE: + surface = false; + return 0; + case ARG_WIREFRAME: + wireframe = true; + return 0; + case ARG_NO_WIREFRAME: + wireframe = false; + return 0; + case ARG_TEXTURE: + texture = arg; + return 0; + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Ion options:" }, + { "ions", ARG_IONS, "NUM", 0, "Number of ions (1-30000, default = 1500)" }, + { "emitters", ARG_EMITTERS, "NUM", 0, + "Number of ion emitters (1-10, default = 3)" }, + { "attractors", ARG_ATTRACTORS, "NUM", 0, + "Number of ion attractors (1-10, default = 3)" }, + { "size", ARG_SIZE, "NUM", 0, "Ion size (1-100, default = 10)" }, + { "speed", ARG_SPEED, "NUM", 0, "Ion speed (1-100, default = 10)" }, + { NULL, 0, NULL, 0, "Surface options:" }, + { "surface", ARG_SURFACE, NULL, OPTION_HIDDEN, "Disable iso-surface" }, + { "no-surface", ARG_NO_SURFACE, NULL, OPTION_ALIAS }, + { "wireframe", ARG_WIREFRAME, NULL, 0, "Draw iso-surface using wireframe" }, + { "no-wireframe", ARG_NO_WIREFRAME, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "texture", ARG_TEXTURE, "FILE", 0, "Surface image PNG file" }, + { "surfaceimage", ARG_TEXTURE, "FILE", OPTION_ALIAS | OPTION_HIDDEN }, + { NULL, 0, NULL, 0, "View options:" }, + { "cameraspeed", ARG_CAMERASPEED, "NUM", 0, + "Camera speed (0-100, default = 10)" }, + { "blur", ARG_BLUR, "NUM", 0, "Motion blur (0-100, default = 30)" }, + {} + }; + static struct argp parser = { + options, parse, NULL, + "Draws exploding ion systems and smooth helion surfaces." + }; + return &parser; +} + +std::string Hack::getShortName() { return "helios"; } +std::string Hack::getName() { return "Helios"; } + +void Hack::setTargets(unsigned int whichTarget) { + switch (whichTarget) { + case 0: // random + for (unsigned int i = 0; i < numEmitters; ++i) + _eList[i].setTargetPos(Vector( + Common::randomFloat(1000.0f) - 500.0f, + Common::randomFloat(1000.0f) - 500.0f, + Common::randomFloat(1000.0f) - 500.0f + )); + for (unsigned int i = 0; i < numAttractors; ++i) + _aList[i].setTargetPos(Vector( + Common::randomFloat(1000.0f) - 500.0f, + Common::randomFloat(1000.0f) - 500.0f, + Common::randomFloat(1000.0f) - 500.0f + )); + break; + case 1: // line (all emitters on one side, all attracters on the other) + { + float position = -500.0f, change = 1000.0f / + (numEmitters + numAttractors - 1); + for (unsigned int i = 0; i < numEmitters; ++i) { + _eList[i].setTargetPos(Vector( + position, + position * 0.5f, + 0.0f + )); + position += change; + } + for (unsigned int i = 0; i < numAttractors; ++i) { + _aList[i].setTargetPos(Vector( + position, + position * 0.5f, + 0.0f + )); + position += change; + } + } + break; + case 2: // line (emitters and attracters staggered) + { + float change = (numEmitters > numAttractors) + ? 1000.0f / (numEmitters * 2 - 1) + : 1000.0f / (numAttractors * 2 - 1); + float position = -500.0f; + for (unsigned int i = 0; i < numEmitters; ++i) { + _eList[i].setTargetPos(Vector( + position, + position * 0.5f, + 0.0f + )); + position += change * 2.0f; + } + position = -500.0f + change; + for (unsigned int i = 0; i < numAttractors; ++i) { + _aList[i].setTargetPos(Vector( + position, + position * 0.5f, + 0.0f + )); + position += change * 2.0f; + } + } + break; + case 3: // 2 lines (parallel) + { + float change = 1000.0f / (numEmitters * 2 - 1); + float position = -500.0f; + float height = -525.0f + (numEmitters * 25); + for (unsigned int i = 0; i < numEmitters; ++i) { + _eList[i].setTargetPos(Vector( + position, + height, + -50.0f + )); + position += change * 2.0f; + } + change = 1000.0f / (numAttractors * 2 - 1); + position = -500.0f; + height = 525.0f - (numAttractors * 25); + for (unsigned int i = 0; i < numAttractors; ++i) { + _aList[i].setTargetPos(Vector( + position, + height, + 50.0f + )); + position += change * 2.0f; + } + } + break; + case 4: // 2 lines (skewed) + { + float change = 1000.0f / (numEmitters * 2 - 1); + float position = -500.0f; + float height = -525.0f + (numEmitters * 25); + for (unsigned int i = 0; i < numEmitters; ++i) { + _eList[i].setTargetPos(Vector( + position, + height, + 0.0f + )); + position += change * 2.0f; + } + change = 1000.0f / (numAttractors * 2 - 1); + position = -500.0f; + height = 525.0f - (numAttractors * 25); + for (unsigned int i = 0; i < numAttractors; ++i) { + _aList[i].setTargetPos(Vector( + 10.0f, + height, + position + )); + position += change * 2.0f; + } + } + break; + case 5: // random distribution across a plane + for (unsigned int i = 0; i < numEmitters; ++i) + _eList[i].setTargetPos(Vector( + Common::randomFloat(1000.0f) - 500.0f, + 0.0f, + Common::randomFloat(1000.0f) - 500.0f + )); + for (unsigned int i = 0; i < numAttractors; ++i) + _aList[i].setTargetPos(Vector( + Common::randomFloat(1000.0f) - 500.0f, + 0.0f, + Common::randomFloat(1000.0f) - 500.0f + )); + break; + case 6: // random distribution across 2 planes + { + float height = -525.0f + (numEmitters * 25); + for (unsigned int i = 0; i < numEmitters; ++i) + _eList[i].setTargetPos(Vector( + Common::randomFloat(1000.0f) - 500.0f, + height, + Common::randomFloat(1000.0f) - 500.0f + )); + height = 525.0f - (numAttractors * 25); + for (unsigned int i = 0; i < numAttractors; i++) + _aList[i].setTargetPos(Vector( + Common::randomFloat(1000.0f) - 500.0f, + height, + Common::randomFloat(1000.0f) - 500.0f + )); + } + break; + case 7: // 2 rings (1 inside and 1 outside) + { + float angle = 0.5f, cosangle, sinangle; + float change = M_PI * 2.0f / numEmitters; + for (unsigned int i = 0; i < numEmitters; ++i) { + angle += change; + cosangle = std::cos(angle) * 200.0f; + sinangle = std::sin(angle) * 200.0f; + _eList[i].setTargetPos(Vector( + cosangle, + sinangle, + 0.0f + )); + } + angle = 1.5f; + change = M_PI * 2.0f / numAttractors; + for (unsigned int i = 0; i < numAttractors; ++i) { + angle += change; + cosangle = std::cos(angle) * 500.0f; + sinangle = std::sin(angle) * 500.0f; + _aList[i].setTargetPos(Vector( + cosangle, + sinangle, + 0.0f + )); + } + } + break; + case 8: // ring (all emitters on one side, all attracters on the other) + { + float angle = 0.5f, cosangle, sinangle; + float change = M_PI * 2.0f / (numEmitters + numAttractors); + for (unsigned int i = 0; i < numEmitters; ++i) { + angle += change; + cosangle = std::cos(angle) * 500.0f; + sinangle = std::sin(angle) * 500.0f; + _eList[i].setTargetPos(Vector( + cosangle, + sinangle, + 0.0f + )); + } + for (unsigned int i = 0; i < numAttractors; ++i) { + angle += change; + cosangle = std::cos(angle) * 500.0f; + sinangle = std::sin(angle) * 500.0f; + _aList[i].setTargetPos(Vector( + cosangle, + sinangle, + 0.0f + )); + } + } + break; + case 9: // ring (emitters and attracters staggered) + { + float change = (numEmitters > numAttractors) + ? M_PI * 2.0f / (numEmitters * 2) + : M_PI * 2.0f / (numAttractors * 2); + float angle = 0.5f, cosangle, sinangle; + for (unsigned int i = 0; i < numEmitters; ++i) { + cosangle = std::cos(angle) * 500.0f; + sinangle = std::sin(angle) * 500.0f; + _eList[i].setTargetPos(Vector( + cosangle, + sinangle, + 0.0f + )); + angle += change * 2.0f; + } + angle = 0.5f + change; + for (unsigned int i = 0; i < numAttractors; ++i) { + cosangle = std::cos(angle) * 500.0f; + sinangle = std::sin(angle) * 500.0f; + _aList[i].setTargetPos(Vector( + cosangle, + sinangle, + 0.0f + )); + angle += change * 2.0f; + } + } + break; + case 10: // 2 points + for (unsigned int i = 0; i < numEmitters; ++i) + _eList[i].setTargetPos(Vector(500.0f, 100.0f, 50.0f)); + for (unsigned int i = 0; i < numAttractors; ++i) + _aList[i].setTargetPos(Vector(-500.0f, -100.0f, -50.0f)); + break; + } +} + +float Hack::surfaceFunction(const Vector& XYZ) { + static unsigned int points = numEmitters + numAttractors; + + float value = 0.0f; + for (unsigned int i = 0; i < points; ++i) + value += _spheres[i].value(XYZ); + + return value; +} + +void Hack::start() { + glViewport(0, 0, Common::width, Common::height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(60.0, Common::aspectRatio, 0.1, 10000.0f); + glMatrixMode(GL_MODELVIEW); + + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); + glEnable(GL_TEXTURE_2D); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // Initialize surface + if (surface) { + _texture = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + PNG(texture) + ); + + Implicit::init(70, 70, 70, 25.0f); + _surface = new Implicit(surfaceFunction); + Common::resources->manage(_surface); + _spheres = std::vector(numEmitters + numAttractors); + float sphereScaleFactor = 1.0f / + std::sqrt(float(2 * numEmitters + numAttractors)); + stdx::call_each(_spheres.begin(), _spheres.begin() + numEmitters, + &Sphere::setScale, 400.0f * sphereScaleFactor); + stdx::call_each(_spheres.begin() + numEmitters, _spheres.begin() + numEmitters + numAttractors, + &Sphere::setScale, 200.0f * sphereScaleFactor); + } + + Ion::init(); + + // Initialize particles + stdx::construct_n(_eList, numEmitters); + stdx::construct_n(_aList, numAttractors); + stdx::construct_n(_iList, numIons); + + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); +} + +void Hack::tick() { + // Camera movements + // first do translation (distance from center) + static float targetCameraDistance = -1000.0f; + static float preCameraInterp = M_PI; + static float oldCameraDistance; + + preCameraInterp += cameraSpeed * Common::elapsedSecs / 100.0f; + float cameraInterp = 0.5f - (0.5f * std::cos(preCameraInterp)); + float cameraDistance = (1.0f - cameraInterp) * oldCameraDistance + + cameraInterp * targetCameraDistance; + if (preCameraInterp >= M_PI) { + oldCameraDistance = targetCameraDistance; + targetCameraDistance = -Common::randomFloat(1300.0f) - 200.0f; + preCameraInterp = 0.0f; + } + glLoadIdentity(); + glTranslatef(0.0, 0.0, cameraDistance); + + // then do rotation + static Vector radialVel(0.0f, 0.0f, 0.0f); + static Vector targetRadialVel = radialVel; + static UnitQuat rotQuat; + + Vector radialVelDiff(targetRadialVel - radialVel); + float changeRemaining = radialVelDiff.normalize(); + float change = cameraSpeed * 0.0002f * Common::elapsedSecs; + if (changeRemaining > change) { + radialVelDiff *= change; + radialVel += radialVelDiff; + } else { + radialVel = targetRadialVel; + if (Common::randomInt(2)) { + targetRadialVel.set( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + Common::randomFloat(1.0f) + ); + targetRadialVel.normalize(); + targetRadialVel *= cameraSpeed * Common::randomFloat(0.002f); + } else + targetRadialVel.set(0.0f, 0.0f, 0.0f); + } + Vector tempRadialVel(radialVel); + float angle = tempRadialVel.normalize(); + UnitQuat radialQuat(angle, tempRadialVel); + rotQuat.multiplyBy(radialQuat); + RotationMatrix billboardMat(rotQuat); + + // Calculate new color + static HSLColor oldHSL; + static HSLColor newHSL( + Common::randomFloat(1.0f), + 1.0f, + 1.0f + ); + static HSLColor targetHSL; + static float colorInterp = 1.0f; + static float colorChange; + static RGBColor RGB; + colorInterp += Common::elapsedSecs * colorChange; + if (colorInterp >= 1.0f) { + if (!Common::randomInt(3) && numIons >= 100) // change color suddenly + newHSL.set( + Common::randomFloat(1.0f), + 1.0f - (Common::randomFloat(1.0f) * Common::randomFloat(1.0f)), + 1.0f + ); + oldHSL = newHSL; + targetHSL.set( + Common::randomFloat(1.0f), + 1.0f - (Common::randomFloat(1.0f) * Common::randomFloat(1.0f)), + 1.0f + ); + colorInterp = 0.0f; + // amount by which to change colorInterp each second + colorChange = Common::randomFloat(0.005f * speed) + (0.002f * speed); + } else { + float diff = targetHSL.h() - oldHSL.h(); + if (diff < -0.5f || (diff > 0.0f && diff < 0.5f)) + newHSL.h() = oldHSL.h() + colorInterp * diff; + else + newHSL.h() = oldHSL.h() - colorInterp * diff; + diff = targetHSL.s() - oldHSL.s(); + newHSL.s() = oldHSL.s() + colorInterp * diff; + newHSL.clamp(); + RGB = newHSL; + } + + // Release ions + static unsigned int ionsReleased = 0; + static int releaseMicros = 0; + if (ionsReleased < numIons) { + releaseMicros -= Common::elapsedMicros; + while (ionsReleased < numIons && releaseMicros <= 0) { + _iList[ionsReleased].start( + _eList[Common::randomInt(numEmitters)].getPos(), RGB + ); + ++ionsReleased; + // all ions released after 2 minutes + releaseMicros += 120000000 / numIons; + } + } + + // Set interpolation value for emitters and attracters + static int wait = 0; + static float preInterp = M_PI, interp; + static float interpConst = 0.001f; + wait -= Common::elapsedMicros; + if (wait <= 0) { + preInterp += Common::elapsedSecs * speed * interpConst; + interp = 0.5f - (0.5f * std::cos(preInterp)); + } + if (preInterp >= M_PI) { + // select new target points (not the same pattern twice in a row) + static int newTarget = 0, lastTarget; + lastTarget = newTarget; + newTarget = Common::randomInt(10); + if (newTarget == lastTarget) { + ++newTarget; + newTarget %= 10; + } + setTargets(newTarget); + preInterp = 0.0f; + interp = 0.0f; + wait = 10000000; // pause after forming each new pattern + // interpolate really fast sometimes + interpConst = Common::randomInt(4) ? 0.001f : 0.1f; + } + + // Update particles + stdx::call_all(_eList, &Node::update, interp); + stdx::call_all(_aList, &Node::update, interp); + for ( + std::vector::iterator i = _iList.begin(), j = i + ionsReleased; + i != j; + ++i + ) + i->update(_eList, _aList, RGB); + + if (surface) { + for (unsigned int i = 0; i < numEmitters; ++i) + _spheres[i].setCenter(_eList[i].getPos()); + for (unsigned int i = 0; i < numAttractors; ++i) + _spheres[numEmitters + i].setCenter(_aList[i].getPos()); + std::list crawlPointList; + stdx::map_each( + _spheres.begin(), _spheres.end(), + std::back_inserter(crawlPointList), + &Sphere::getCenter + ); + static float valueTrig = 0.0f; + valueTrig += Common::elapsedSecs; + _surface->update(0.45f + 0.05f * std::cos(valueTrig), crawlPointList); + } + + // Draw + // clear the screen + if (blur) { // partially + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(0.0f, 0.0f, 0.0f, 0.5f - (std::sqrt(std::sqrt(blur)) * 0.15495f)); + glBindTexture(GL_TEXTURE_2D, 0); + glPushMatrix(); + glLoadIdentity(); + glBegin(GL_TRIANGLE_STRIP); + glVertex3f(-5.0f, -4.0f, -3.0f); + glVertex3f(5.0f, -4.0f, -3.0f); + glVertex3f(-5.0f, 4.0f, -3.0f); + glVertex3f(5.0f, 4.0f, -3.0f); + glEnd(); + glPopMatrix(); + } else // completely + glClear(GL_COLOR_BUFFER_BIT); + + // Draw ions + glBlendFunc(GL_ONE, GL_ONE); + stdx::call_each(_iList.begin(), _iList.begin() + ionsReleased, + &Ion::draw, billboardMat); + + RGBColor surfaceColor; + if (surface) { + if (numIons >= 100) { + float brightFactor = wireframe + ? 2.0f / ((blur + 30) * (blur + 30)) + : 4.0f / ((blur + 30) * (blur + 30)); + for (unsigned int i = 0; i < 100; ++i) + surfaceColor += _iList[i].getRGB() * brightFactor; + } else { + float brightFactor = wireframe + ? 200.0f / ((blur + 30) * (blur + 30)) + : 400.0f / ((blur + 30) * (blur + 30)); + surfaceColor = RGB * brightFactor; + } + glPushMatrix(); glPushAttrib(GL_ENABLE_BIT); + glBindTexture(GL_TEXTURE_2D, _texture); + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glColor3fv(surfaceColor.get()); + glMultMatrixf(billboardMat.get()); + GLenum mode = GL_TRIANGLE_STRIP; + if (Hack::wireframe) { + glDisable(GL_TEXTURE_2D); + mode = GL_LINE_STRIP; + } + _surface->draw(mode); + glPopAttrib(); glPopMatrix(); + } + + Common::flush(); +} + +void Hack::reshape() { + glViewport(0, 0, Common::width, Common::height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(60.0, Common::aspectRatio, 0.1, 10000.0f); + glMatrixMode(GL_MODELVIEW); +} + +void Hack::stop() {} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + case 'q': case 'Q': + Common::running = false; + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} +void Hack::pointerMotion(int, int) {} +void Hack::buttonPress(unsigned int) {} +void Hack::buttonRelease(unsigned int) {} +void Hack::pointerEnter() {} +void Hack::pointerLeave() {} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS Create(void* hdl, void* props) +{ + if (!props) + return STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + + return STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void Stop() +{ + Hack::stop(); +} + +void Destroy() +{ +} + +ADDON_STATUS GetStatus() +{ + return STATUS_OK; +} + +bool HasSettings() +{ + return false; +} + +unsigned int GetSettings(StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS SetSetting(const char *settingName, const void *settingValue) +{ + return STATUS_OK; +} + +void FreeSettings() +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +void Remove() +{ +} + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/helios.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/helios.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/helios.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/helios.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,41 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _HELIOS_HH +#define _HELIOS_HH + +#include + +namespace Hack { + extern unsigned int numIons; + extern float size; + extern unsigned int numEmitters; + extern unsigned int numAttractors; + extern float speed; + extern float cameraSpeed; + extern bool surface; + extern bool wireframe; + extern float blur; + extern std::string texture; +}; + +#endif // _HELIOS_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,19 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_helios_SOURCES = $(COMMON) $(COLOR) $(VECTOR) $(IMAGE) $(IMPLICIT) \ + helios.cc helios.hh particle.cc particle.hh sphere.hh + +AM_CPPFLAGS += $(IMAGE_CPPFLAGS) +AM_CXXFLAGS += $(IMAGE_CXXFLAGS) +AM_LDFLAGS += $(IMAGE_LDFLAGS) +rs_helios_LDADD = $(LIBMISC) $(X_LIBS) $(OPENGL_LIBS) $(IMAGE_LIBS) + +hack_PROGRAMS = rs-helios + +heliosdatadir = $(pkgdatadir)/helios +dist_heliosdata_DATA = spheremap.png + +uninstall-hook: + -rmdir $(heliosdatadir) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/particle.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/particle.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/particle.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/particle.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,67 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include + +GLuint Ion::_texture; +GLuint Ion::_list; + +void Ion::init() { + GLubyte light[LIGHTSIZE][LIGHTSIZE]; + for (int i = 0; i < LIGHTSIZE; ++i) { + for (int j = 0; j < LIGHTSIZE; ++j) { + float x = float(i - LIGHTSIZE / 2) / float(LIGHTSIZE / 2); + float y = float(j - LIGHTSIZE / 2) / float(LIGHTSIZE / 2); + float temp = Common::clamp( + 1.0f - float(std::sqrt((x * x) + (y * y))), + 0.0f, 1.0f + ); + light[i][j] = GLubyte(255.0f * temp * temp); + } + } + _texture = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + 1, LIGHTSIZE, LIGHTSIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, light + ); + + _list = Common::resources->genLists(1); + glNewList(_list, GL_COMPILE); + glBindTexture(GL_TEXTURE_2D, _texture); + glBegin(GL_TRIANGLES); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-0.5f, -0.5f, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(0.5f, -0.5f, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(0.5f, 0.5f, 0.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-0.5f, -0.5f, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(0.5f, 0.5f, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-0.5f, 0.5f, 0.0f); + glEnd(); + glEndList(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/particle.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/particle.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/particle.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/particle.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,187 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _PARTICLE_HH +#define _PARTICLE_HH + +#include + +#include +#include +#include + +#define LIGHTSIZE 64 + +class Node { +private: + Vector _pos; + Vector _oldPos; + Vector _targetPos; +public: + Node() : _pos(Vector( + Common::randomFloat(1000.0f) - 500.0f, + Common::randomFloat(1000.0f) - 500.0f, + Common::randomFloat(1000.0f) - 500.0f + )), _oldPos(_pos), _targetPos(_pos) {} + + const Vector& getPos() const { + return _pos; + } + + void setTargetPos(const Vector& target) { + _oldPos = _pos; + _targetPos = target; + } + + void update(float n) { + _pos = _oldPos * (1.0f - n) + _targetPos * n; + } +}; + +class Ion { +private: + static GLuint _texture; + static GLuint _list; + + Vector _pos; + float _size; + float _speed; + RGBColor _RGB; +public: + static void init(); + + Ion() { + float temp = Common::randomFloat(2.0f) + 0.4f; + _size = Hack::size * temp; + _speed = Hack::speed * 12.0f / temp; + } + + const RGBColor& getRGB() const { + return _RGB; + } + + void start(const Vector& pos, const RGBColor& RGB) { + _pos = pos; + + float offset = Common::elapsedSecs * _speed; + switch (Common::randomInt(14)) { + case 0: + _pos += Vector(offset, 0, 0); + break; + case 1: + _pos += Vector(-offset, 0, 0); + break; + case 2: + _pos += Vector(0, offset, 0); + break; + case 3: + _pos += Vector(0, -offset, 0); + break; + case 4: + _pos += Vector(0, 0, offset); + break; + case 5: + _pos += Vector(0, 0, -offset); + break; + case 6: + _pos += Vector(offset, offset, offset); + break; + case 7: + _pos += Vector(-offset, offset, offset); + break; + case 8: + _pos += Vector(offset, -offset, offset); + break; + case 9: + _pos += Vector(-offset, -offset, offset); + break; + case 10: + _pos += Vector(offset, offset, -offset); + break; + case 11: + _pos += Vector(-offset, offset, -offset); + break; + case 12: + _pos += Vector(offset, -offset, -offset); + break; + case 13: + _pos += Vector(-offset, -offset, -offset); + break; + } + + _RGB = RGB; + } + + void update( + const std::vector eList, const std::vector aList, + const RGBColor& RGB + ) { + Vector force(0.0f, 0.0f, 0.0f); + + bool startOver = false; + for ( + std::vector::const_iterator i = eList.begin(); + i != eList.end(); + ++i + ) { + Vector temp(_pos - i->getPos()); + float length = temp.normalize(); + startOver = startOver || (length > 11000.0f); + if (length > 1.0f) temp /= length; + force += temp; + } + + float startOverDistance = Common::elapsedSecs * _speed; + for ( + std::vector::const_iterator i = aList.begin(); + i != aList.end(); + ++i + ) { + Vector temp(i->getPos() - _pos); + float length = temp.normalize(); + startOver = startOver || (length < startOverDistance); + if (length > 1.0f) temp /= length; + force += temp; + } + + // Start this ion at an emitter if it gets too close to an attracter + // or too far from an emitter + if (startOver) + start(eList[Common::randomInt(Hack::numEmitters)].getPos(), RGB); + else { + force.normalize(); + _pos += force * Common::elapsedSecs * _speed; + } + } + + void draw(const RotationMatrix& billboardMat) const { + glColor3fv(_RGB.get()); + glPushMatrix(); + Vector transformed(billboardMat.transform(_pos)); + glTranslatef(transformed.x(), transformed.y(), transformed.z()); + glScalef(_size, _size, _size); + glCallList(_list); + glPopMatrix(); + } +}; + +#endif // _PARTICLE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/sphere.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/sphere.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/sphere.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/sphere.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,58 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _SPHERE_HH +#define _SPHERE_HH + +#include + +#include + +class Sphere { +private: + Vector _center; + float _scale; + float _scaleSquared; +public: + void setCenter(const Vector& center) { + _center = center; + } + + const Vector& getCenter() const { + return _center; + } + + void setScale(float scale) { + _scale = scale; + _scaleSquared = scale * scale; + } + + float getScale() const { + return _scale; + } + + float value(const Vector& XYZ) { + return _scaleSquared / (XYZ - _center).lengthSquared(); + } +}; + +#endif // _SPHERE_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/helios/spheremap.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/helios/spheremap.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/caustic.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/caustic.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/caustic.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/caustic.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,311 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software FoundAT2on. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * FoundAT2on, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include + +#define CAUSTIC_RESOLUTION 100 +#define CAUSTIC_SIZE 256 +#define CAUSTIC_DEPTH 1.0f +#define CAUSTIC_AMPLITUDE 0.01f +#define CAUSTIC_REFRACTION 20.0f + +namespace CausticTextures { + std::vector _textures; + + void draw( + const stdx::dim2&, + const float*, const float*, + const stdx::dim2, CAUSTIC_RESOLUTION + 1>&, + unsigned int, unsigned int, unsigned int, unsigned int + ); +}; + +void CausticTextures::init() { + unsigned int size = CAUSTIC_SIZE; + if (Common::width < size) size = Common::width; + if (Common::height < size) size = Common::height; + + float x[CAUSTIC_RESOLUTION + 1]; + float z[CAUSTIC_RESOLUTION + 1]; + + stdx::dim2 y[Hack::frames]; + for (unsigned int i = 0; i < Hack::frames; ++i) + y[i].resize(CAUSTIC_RESOLUTION); + stdx::dim2, CAUSTIC_RESOLUTION + 1> xz(CAUSTIC_RESOLUTION + 1); + stdx::dim2 intensity(CAUSTIC_RESOLUTION + 1); + + // set x and z geometry positions + for (unsigned int i = 0; i <= CAUSTIC_RESOLUTION; ++i) { + x[i] = z[i] = float(i) / float(CAUSTIC_RESOLUTION); + } + + // set y geometry positions (altitudes) + for (unsigned int k = 0; k < Hack::frames; ++k) { + float offset = M_PI * 2.0f * float(k) / float(Hack::frames); + for (unsigned int i = 0; i < CAUSTIC_RESOLUTION; ++i) { + float xx = M_PI * 2.0f * float(i) / float(CAUSTIC_RESOLUTION); + for (unsigned int j = 0; j < CAUSTIC_RESOLUTION; ++j) { + float zz = M_PI * 2.0f * float(j) / float(CAUSTIC_RESOLUTION); + y[k](i, j) = CAUSTIC_AMPLITUDE * ( + 0.08f * std::cos(xx * 2.0f + offset) + + 0.06f * std::cos(-1.0f * xx + 2.0f * zz + offset) + + 0.04f * std::cos(-2.0f * xx - 3.0f * zz + offset) + + 0.01f * std::cos(xx - 7.0f * zz - 2.0f * offset) + + 0.01f * std::cos(3.0f * xx + 5.0f * zz + offset) + + 0.01f * std::cos(9.0f * xx + zz - offset) + + 0.005f * std::cos(11.0f * xx + 7.0f * zz - offset) + + 0.005f * std::cos(4.0f * xx - 13.0f * zz + offset) + + 0.003f * std::cos(19.0f * xx - 9.0f * zz - offset) + ); + } + } + } + + // prepare to draw textures + Common::flush(); + glXWaitX(); + glPushAttrib(GL_ALL_ATTRIB_BITS); + + glDisable(GL_FOG); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glRotatef(-90.0f, 1, 0, 0); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + + glReadBuffer(GL_BACK); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + glDisable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + + std::vector bitmap(size * size * 3); + + // project vertices and create textures + + // reciprocal of vertical component of light ray + float recvert = float(CAUSTIC_RESOLUTION) * 0.5f; + for (unsigned int k = 0; k < Hack::frames; ++k) { + // compute projected offsets + // (this uses surface normals, not actual refractions, but it's faster this way) + for (unsigned int i = 0; i < CAUSTIC_RESOLUTION; ++i) { + for (unsigned int j = 0; j < CAUSTIC_RESOLUTION; ++j) { + unsigned int minus, plus; + + minus = (i == 0 ? CAUSTIC_RESOLUTION - 1 : i - 1); + plus = (i == CAUSTIC_RESOLUTION - 1 ? 0 : i + 1); + xz(i, j).first = (y[k](plus, j) - y[k](minus, j)) * recvert * (CAUSTIC_DEPTH + y[k](i, j)); + + minus = (j == 0 ? CAUSTIC_RESOLUTION - 1 : j - 1); + plus = (j == CAUSTIC_RESOLUTION - 1 ? 0 : j + 1); + xz(i, j).second = (y[k](i, plus) - y[k](i, minus)) * recvert * (CAUSTIC_DEPTH + y[k](i, j)); + } + } + + // copy offsets to edges of xz array + for (unsigned int i = 0; i < CAUSTIC_RESOLUTION; ++i) + xz(i, CAUSTIC_RESOLUTION) = xz(i, 0); + for (unsigned int j = 0; j <= CAUSTIC_RESOLUTION; ++j) + xz(CAUSTIC_RESOLUTION, j) = xz(0, j); + + // compute light intensities + float space = 1.0f / float(CAUSTIC_RESOLUTION); + for (unsigned int i = 0; i < CAUSTIC_RESOLUTION; ++i) { + for (unsigned int j = 0; j < CAUSTIC_RESOLUTION; ++j) { + unsigned int xminus = (i == 0 ? CAUSTIC_RESOLUTION - 1 : i - 1); + unsigned int xplus = (i == CAUSTIC_RESOLUTION - 1 ? 0 : i + 1); + unsigned int zminus = (j == 0 ? CAUSTIC_RESOLUTION - 1 : j - 1); + unsigned int zplus = (j == CAUSTIC_RESOLUTION - 1 ? 0 : j + 1); + // this assumes nominal light intensity is 0.25 + intensity(i, j) = (1.0f / (float(CAUSTIC_RESOLUTION) * float(CAUSTIC_RESOLUTION))) + / ((std::abs(xz(xplus, j).first - xz(i, j).first + space) + + std::abs(xz(i, j).first - xz(xminus, j).first + space)) + * (std::abs(xz(i, zplus).second - xz(i, j).second + space) + + std::abs(xz(i, j).second - xz(i, zminus).second + space))) + - 0.125f; + if (intensity(i, j) > 1.0f) + intensity(i, j) = 1.0f; + } + } + + // copy intensities to edges of intensity array + for (unsigned int i = 0; i < CAUSTIC_RESOLUTION; ++i) + intensity(i, CAUSTIC_RESOLUTION) = intensity(i, 0); + for (unsigned int j = 0; j <= CAUSTIC_RESOLUTION; ++j) + intensity(CAUSTIC_RESOLUTION, j) = intensity(0, j); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0f, 1.0f, 0.0f, 1.0f, -0.5f, 0.5f); + glViewport( + (Common::width - size) >> 1, + (Common::height - size) >> 1, + size, size + ); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + // draw texture + glClear(GL_COLOR_BUFFER_BIT); + // draw most of texture + draw(intensity, x, z, xz, 0, CAUSTIC_RESOLUTION, 0, CAUSTIC_RESOLUTION); + // draw edges of texture that wrap around from opposite sides + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(-1.0f, 0.0f, 0.0f); + draw(intensity, x, z, xz, CAUSTIC_RESOLUTION * 9 / 10, CAUSTIC_RESOLUTION, 0, CAUSTIC_RESOLUTION); + glPopMatrix(); + glPushMatrix(); + glTranslatef(1.0f, 0.0f, 0.0f); + draw(intensity, x, z, xz, 0, CAUSTIC_RESOLUTION / 10, 0, CAUSTIC_RESOLUTION); + glPopMatrix(); + glPushMatrix(); + glTranslatef(0.0f, 0.0f, -1.0f); + draw(intensity, x, z, xz, 0, CAUSTIC_RESOLUTION, CAUSTIC_RESOLUTION * 9 / 10, CAUSTIC_RESOLUTION); + glPopMatrix(); + glPushMatrix(); + glTranslatef(0.0f, 0.0f, 1.0f); + draw(intensity, x, z, xz, 0, CAUSTIC_RESOLUTION, 0, CAUSTIC_RESOLUTION / 10); + glPopMatrix(); + // draw corners too + glPushMatrix(); + glTranslatef(-1.0f, 0.0f, -1.0f); + draw(intensity, x, z, xz, CAUSTIC_RESOLUTION * 9 / 10, CAUSTIC_RESOLUTION, CAUSTIC_RESOLUTION * 9 / 10, CAUSTIC_RESOLUTION); + glPopMatrix(); + glPushMatrix(); + glTranslatef(1.0f, 0.0f, -1.0f); + draw(intensity, x, z, xz, 0, CAUSTIC_RESOLUTION / 10, CAUSTIC_RESOLUTION * 9 / 10, CAUSTIC_RESOLUTION); + glPopMatrix(); + glPushMatrix(); + glTranslatef(-1.0f, 0.0f, 1.0f); + draw(intensity, x, z, xz, CAUSTIC_RESOLUTION * 9 / 10, CAUSTIC_RESOLUTION, 0, CAUSTIC_RESOLUTION / 10); + glPopMatrix(); + glPushMatrix(); + glTranslatef(1.0f, 0.0f, 1.0f); + draw(intensity, x, z, xz, 0, CAUSTIC_RESOLUTION / 10, 0, CAUSTIC_RESOLUTION / 10); + glPopMatrix(); + + // read back texture + glReadPixels( + (Common::width - size) >> 1, + (Common::height - size) >> 1, + size, size, + GL_RGB, GL_UNSIGNED_BYTE, &bitmap.front() + ); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0f, Common::width, 0.0f, Common::height, -0.5f, 0.5f); + glViewport(0, 0, Common::width, Common::height); + + unsigned int left = ((Common::width - size) >> 1) - 5; + unsigned int right = left + size + 10; + unsigned int bottom = ((Common::height - size) >> 1) - 5; + unsigned int top = bottom + size + 10; + unsigned int barBottom = bottom - 10; + unsigned int barTop = barBottom - 20; + + glBlendFunc(GL_ONE, GL_ZERO); + glLineWidth(2.0f); + glBegin(GL_LINE_STRIP); + glColor3f(0.0f, 0.4f, 0.0f); + glVertex3f(left, 0.0f, bottom); + glVertex3f(right, 0.0f, bottom); + glVertex3f(right, 0.0f, top); + glVertex3f(left, 0.0f, top); + glVertex3f(left, 0.0f, bottom); + glEnd(); + glBegin(GL_QUADS); + glColor3f(0.0f, 0.2f, 0.0f); + glVertex3f(left, 0.0f, barBottom); + glVertex3f(left + (k + 1) * float(right - left) / float(Hack::frames), 0.0f, barBottom); + glVertex3f(left + (k + 1) * float(right - left) / float(Hack::frames), 0.0f, barTop); + glVertex3f(left, 0.0f, barTop); + glEnd(); + glBegin(GL_LINE_STRIP); + glColor3f(0.0f, 0.4f, 0.0f); + glVertex3f(left, 0.0f, barBottom); + glVertex3f(right, 0.0f, barBottom); + glVertex3f(right, 0.0f, barTop); + glVertex3f(left, 0.0f, barTop); + glVertex3f(left, 0.0f, barBottom); + glEnd(); + + Common::flush(); + + // create texture object + _textures.push_back(Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + 3, size, size, GL_RGB, GL_UNSIGNED_BYTE, &bitmap.front() + )); + } + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glPopAttrib(); +} + +void CausticTextures::draw( + const stdx::dim2& intensity, + const float* x, const float* z, + const stdx::dim2, CAUSTIC_RESOLUTION + 1>& xz, + unsigned int xLo, unsigned int xHi, unsigned int zLo, unsigned int zHi +) { + for (unsigned int j = zLo; j < zHi; ++j) { + // red + float mult = 1.0f - CAUSTIC_REFRACTION / float(CAUSTIC_RESOLUTION); + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int i = xLo; i <= xHi; ++i) { + glColor3f(intensity(i, j + 1), 0.0f, 0.0f); + glVertex3f(x[i] + xz(i, j + 1).first * mult, 0.0f, z[j + 1] + xz(i, j + 1).second * mult); + glColor3f(intensity(i, j), 0.0f, 0.0f); + glVertex3f(x[i] + xz(i, j).first * mult, 0.0f, z[j] + xz(i, j).second * mult); + } + glEnd(); + // green + glBegin(GL_TRIANGLE_STRIP); + for(unsigned int i = xLo; i <= xHi; ++i) { + glColor3f(0.0f, intensity(i, j + 1), 0.0f); + glVertex3f(x[i] + xz(i, j + 1).first, 0.0f, z[j + 1] + xz(i, j + 1).second); + glColor3f(0.0f, intensity(i, j), 0.0f); + glVertex3f(x[i] + xz(i, j).first, 0.0f, z[j] + xz(i, j).second); + } + glEnd(); + // blue + mult = 1.0f + CAUSTIC_REFRACTION / float(CAUSTIC_RESOLUTION); + glBegin(GL_TRIANGLE_STRIP); + for(unsigned int i = xLo; i <= xHi; ++i) { + glColor3f(0.0f, 0.0f, intensity(i, j + 1)); + glVertex3f(x[i] + xz(i, j + 1).first * mult, 0.0f, z[j + 1] + xz(i, j + 1).second * mult); + glColor3f(0.0f, 0.0f, intensity(i, j)); + glVertex3f(x[i] + xz(i, j).first * mult, 0.0f, z[j] + xz(i, j).second * mult); + } + glEnd(); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/caustic.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/caustic.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/caustic.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/caustic.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,63 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _CAUSTIC_HH +#define _CAUSTIC_HH + +#include + +#include +#include +#include +#include + +namespace CausticTextures { + void init(); + + extern std::vector _textures; + + inline void use() { +#if USE_GL_EXTENSIONS + if (Hack::shaders) { + Extensions::glActiveTextureARB(GL_TEXTURE1_ARB); + glBindTexture( + GL_TEXTURE_2D, _textures[(Hack::current + 1) % Hack::frames] + ); + Extensions::glActiveTextureARB(GL_TEXTURE0_ARB); + glBindTexture( + GL_TEXTURE_2D, _textures[Hack::current] + ); + Extensions::glBindProgramARB( + GL_VERTEX_PROGRAM_ARB, Shaders::tunnelVP + ); + glEnable(GL_VERTEX_PROGRAM_ARB); + Extensions::glBindProgramARB( + GL_FRAGMENT_PROGRAM_ARB, Shaders::tunnelFP + ); + glEnable(GL_FRAGMENT_PROGRAM_ARB); + } else +#endif // USE_GL_EXTENSIONS + glBindTexture(GL_TEXTURE_2D, _textures[Hack::current]); + } +}; + +#endif // _CAUSTIC_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/cubemaps.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/cubemaps.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/cubemaps.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/cubemaps.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,183 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include + +#define CUBEMAPS_SIZE 128 + +#if USE_GL_EXTENSIONS + +namespace WavyNormalCubeMaps { + std::vector textures; +}; + +namespace WavyNormalCubeMaps { + inline UnitVector wavyFunc(const Vector&, float); +}; + +void WavyNormalCubeMaps::init() { + stdx::dim3 map(CUBEMAPS_SIZE); + + // calculate normal cube maps + Vector vec; + Vector norm; + float offset = -0.5f * float(CUBEMAPS_SIZE) + 0.5f; + for (unsigned int g = 0; g < Hack::frames; ++g) { + textures.push_back(Common::resources->genCubeMapTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE + )); + + float phase = M_PI * 2.0f * float(g) / float(Hack::frames); + + // left + for (unsigned int i = 0; i < CUBEMAPS_SIZE; ++i) { + for (unsigned int j = 0; j < CUBEMAPS_SIZE; ++j) { + vec.set( + -0.5f, + -(float(j) + offset) / float(CUBEMAPS_SIZE), + (float(i) + offset) / float(CUBEMAPS_SIZE) + ); + vec.normalize(); + norm = wavyFunc(vec, phase); + map(j, i, 0) = GLubyte(norm.x() * 127.999f + 128.0f); + map(j, i, 1) = GLubyte(norm.y() * 127.999f + 128.0f); + map(j, i, 2) = GLubyte(norm.z() * -127.999f + 128.0f); + } + } + gluBuild2DMipmaps(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, 3, CUBEMAPS_SIZE, CUBEMAPS_SIZE, + GL_RGB, GL_UNSIGNED_BYTE, &map.front()); + + // right + for (unsigned int i = 0; i < CUBEMAPS_SIZE; ++i) { + for (unsigned int j = 0; j < CUBEMAPS_SIZE; ++j) { + vec.set( + 0.5f, + -(float(j) + offset) / float(CUBEMAPS_SIZE), + -(float(i) + offset) / float(CUBEMAPS_SIZE) + ); + vec.normalize(); + norm = wavyFunc(vec, phase); + map(j, i, 0) = GLubyte(norm.x() * 127.999f + 128.0f); + map(j, i, 1) = GLubyte(norm.y() * 127.999f + 128.0f); + map(j, i, 2) = GLubyte(norm.z() * -127.999f + 128.0f); + } + } + gluBuild2DMipmaps(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 3, CUBEMAPS_SIZE, CUBEMAPS_SIZE, + GL_RGB, GL_UNSIGNED_BYTE, &map.front()); + + // back + for (unsigned int i = 0; i < CUBEMAPS_SIZE; ++i) { + for (unsigned int j = 0; j < CUBEMAPS_SIZE; ++j) { + vec.set( + -(float(i) + offset) / float(CUBEMAPS_SIZE), + -(float(j) + offset) / float(CUBEMAPS_SIZE), + -0.5f + ); + vec.normalize(); + norm = wavyFunc(vec, phase); + map(j, i, 0) = GLubyte(norm.x() * 127.999f + 128.0f); + map(j, i, 1) = GLubyte(norm.y() * 127.999f + 128.0f); + map(j, i, 2) = GLubyte(norm.z() * -127.999f + 128.0f); + } + } + gluBuild2DMipmaps(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, 3, CUBEMAPS_SIZE, CUBEMAPS_SIZE, + GL_RGB, GL_UNSIGNED_BYTE, &map.front()); + + // front + for (unsigned int i = 0; i < CUBEMAPS_SIZE; ++i) { + for (unsigned int j = 0; j < CUBEMAPS_SIZE; ++j) { + vec.set( + (float(i) + offset) / float(CUBEMAPS_SIZE), + -(float(j) + offset) / float(CUBEMAPS_SIZE), + 0.5f + ); + vec.normalize(); + norm = wavyFunc(vec, phase); + map(j, i, 0) = GLubyte(norm.x() * 127.999f + 128.0f); + map(j, i, 1) = GLubyte(norm.y() * 127.999f + 128.0f); + map(j, i, 2) = GLubyte(norm.z() * -127.999f + 128.0f); + } + } + gluBuild2DMipmaps(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, 3, CUBEMAPS_SIZE, CUBEMAPS_SIZE, + GL_RGB, GL_UNSIGNED_BYTE, &map.front()); + + // bottom + for (unsigned int i = 0; i < CUBEMAPS_SIZE; ++i) { + for (unsigned int j = 0; j < CUBEMAPS_SIZE; ++j) { + vec.set( + (float(i) + offset) / float(CUBEMAPS_SIZE), + -0.5f, + -(float(j) + offset) / float(CUBEMAPS_SIZE) + ); + vec.normalize(); + norm = wavyFunc(vec, phase); + map(j, i, 0) = GLubyte(norm.x() * 127.999f + 128.0f); + map(j, i, 1) = GLubyte(norm.y() * 127.999f + 128.0f); + map(j, i, 2) = GLubyte(norm.z() * -127.999f + 128.0f); + } + } + gluBuild2DMipmaps(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, 3, CUBEMAPS_SIZE, CUBEMAPS_SIZE, + GL_RGB, GL_UNSIGNED_BYTE, &map.front()); + + // top + for (unsigned int i = 0; i < CUBEMAPS_SIZE; ++i) { + for (unsigned int j = 0; j < CUBEMAPS_SIZE; ++j) { + vec.set( + (float(i) + offset) / float(CUBEMAPS_SIZE), + 0.5f, + (float(j) + offset) / float(CUBEMAPS_SIZE) + ); + vec.normalize(); + norm = wavyFunc(vec, phase); + map(j, i, 0) = GLubyte(norm.x() * 127.999f + 128.0f); + map(j, i, 1) = GLubyte(norm.y() * 127.999f + 128.0f); + map(j, i, 2) = GLubyte(norm.z() * -127.999f + 128.0f); + } + } + gluBuild2DMipmaps(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, 3, CUBEMAPS_SIZE, CUBEMAPS_SIZE, + GL_RGB, GL_UNSIGNED_BYTE, &map.front()); + } +} + +inline UnitVector WavyNormalCubeMaps::wavyFunc(const Vector& vec, float phase) { + Vector normal( + vec.x() + ( + 0.3f * std::cos((1.0f * vec.x() + 4.0f * vec.y()) * M_PI + phase) + + 0.15f * std::cos((3.0f * vec.y() + 13.0f * vec.z()) * M_PI - phase) + ), + vec.y() + ( + 0.3f * std::cos((2.0f * vec.y() - 5.0f * vec.z()) * M_PI + phase) + + 0.15f * std::cos((2.0f * vec.z() + 12.0f * vec.x()) * M_PI - phase) + ), + vec.z() + ( + 0.3f * std::cos((1.0f * vec.z() + 6.0f * vec.x()) * M_PI + phase) + + 0.15f * std::cos((1.0f * vec.x() - 11.0f * vec.y()) * M_PI - phase) + ) + ); + return UnitVector(normal); +} + +#endif // USE_GL_EXTENSIONS diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/cubemaps.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/cubemaps.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/cubemaps.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/cubemaps.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,40 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _CUBEMAPS_HH +#define _CUBEMAPS_HH + +#include + +#include + +#if USE_GL_EXTENSIONS + +namespace WavyNormalCubeMaps { + extern std::vector textures; + + void init(); +}; + +#endif // USE_GL_EXTENSIONS + +#endif // _CUBEMAPS_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/extensions.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/extensions.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/extensions.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/extensions.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,83 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include + +#if USE_GL_EXTENSIONS + +namespace Extensions { + PFNGLACTIVETEXTUREARBPROC glActiveTextureARB; + PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB; + PFNGLGENPROGRAMSARBPROC glGenProgramsARB; + PFNGLBINDPROGRAMARBPROC glBindProgramARB; + PFNGLPROGRAMSTRINGARBPROC glProgramStringARB; +}; + +#if GLX_ARB_get_proc_address + +void Extensions::init() { + std::string extensions((const char*)glGetString(GL_EXTENSIONS)); + TRACE("Extensions: " << extensions); + + std::string::size_type a = 0; + unsigned int count = 0; + while (a < extensions.size()) { + std::string::size_type b = extensions.find(' ', a); + if (b == std::string::npos) b = extensions.size(); + std::string s(extensions.substr(a, b - a)); + if ( + s == "GL_ARB_multitexture" || + s == "GL_ARB_texture_cube_map" || + s == "GL_ARB_vertex_program" || + s == "GL_ARB_fragment_program" + ) + count++; + a = b + 1; + } + + if (count != 4) + throw Exception("Not all required GL extensions available"); + + glActiveTextureARB = PFNGLACTIVETEXTUREARBPROC( + glXGetProcAddressARB((const GLubyte*)"glActiveTextureARB")); + glDeleteProgramsARB = PFNGLDELETEPROGRAMSARBPROC( + glXGetProcAddressARB((const GLubyte*)"glDeleteProgramsARB")); + glGenProgramsARB = PFNGLGENPROGRAMSARBPROC( + glXGetProcAddressARB((const GLubyte*)"glGenProgramsARB")); + glBindProgramARB = PFNGLBINDPROGRAMARBPROC( + glXGetProcAddressARB((const GLubyte*)"glBindProgramARB")); + glProgramStringARB = PFNGLPROGRAMSTRINGARBPROC( + glXGetProcAddressARB((const GLubyte*)"glProgramStringARB")); +} + +#else // !GLX_ARB_get_proc_address + +void Extensions::init() { + // This one's easy! + throw Exception("Can not dynamically get GL procedure addresses"); +} + +#endif // !GLX_ARB_get_proc_address + +#endif // USE_GL_EXTENSIONS diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/extensions.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/extensions.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/extensions.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/extensions.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,51 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _EXTENSIONS_HH +#define _EXTENSIONS_HH + +#include + +#if GL_ARB_multitexture +#if GL_ARB_texture_cube_map +#if GL_ARB_vertex_program +#if GL_ARB_fragment_program +#define USE_GL_EXTENSIONS 1 + +namespace Extensions { + typedef Common::Exception Exception; + + extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB; + extern PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB; + extern PFNGLGENPROGRAMSARBPROC glGenProgramsARB; + extern PFNGLBINDPROGRAMARBPROC glBindProgramARB; + extern PFNGLPROGRAMSTRINGARBPROC glProgramStringARB; + + void init(); +}; + +#endif // GL_ARB_fragment_program +#endif // GL_ARB_vertex_program +#endif // GL_ARB_texture_cube_map +#endif // GL_ARB_multitexture + +#endif // _EXTENSIONS_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/flares.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/flares.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/flares.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/flares.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,282 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include + +#define FLARESIZE 64 + +namespace Flares { + GLuint blob; +}; + +namespace Flares { + GLuint _lists; + GLuint _flare[4]; +}; + +void Flares::init() { + stdx::dim3 flareMap[4]; + for (unsigned int i = 0; i < 4; ++i) + flareMap[i].resize(FLARESIZE); + + for (unsigned int i = 0; i < FLARESIZE; ++i) { + float x = float(int(i) - FLARESIZE / 2) / float(FLARESIZE / 2); + for (unsigned int j = 0; j < FLARESIZE; ++j) { + float y = float(int(j) - FLARESIZE / 2) / float(FLARESIZE / 2); + float temp; + + // Basic flare + flareMap[0](i, j, 0) = 255; + flareMap[0](i, j, 1) = 255; + flareMap[0](i, j, 2) = 255; + temp = 1.0f - ((x * x) + (y * y)); + if (temp > 1.0f) temp = 1.0f; + if (temp < 0.0f) temp = 0.0f; + flareMap[0](i, j, 3) = GLubyte(255.0f * temp * temp); + + // Flattened sphere + flareMap[1](i, j, 0) = 255; + flareMap[1](i, j, 1) = 255; + flareMap[1](i, j, 2) = 255; + temp = 2.5f * (1.0f - ((x * x) + (y * y))); + if (temp > 1.0f) temp = 1.0f; + if (temp < 0.0f) temp = 0.0f; + flareMap[1](i, j, 3) = GLubyte(255.0f * temp); + + // Torus + flareMap[2](i, j, 0) = 255; + flareMap[2](i, j, 1) = 255; + flareMap[2](i, j, 2) = 255; + temp = 4.0f * ((x * x) + (y * y)) * (1.0f - ((x * x) + (y * y))); + if (temp > 1.0f) temp = 1.0f; + if (temp < 0.0f) temp = 0.0f; + temp = temp * temp * temp * temp; + flareMap[2](i, j, 3) = GLubyte(255.0f * temp); + + // Kick-ass! + x = std::abs(x); + y = std::abs(y); + float xy = x * y; + flareMap[3](i, j, 0) = 255; + flareMap[3](i, j, 1) = 255; + temp = 0.14f * (1.0f - ((x > y) ? x : y)) / ((xy > 0.05f) ? xy : 0.05f); + if (temp > 1.0f) temp = 1.0f; + if (temp < 0.0f) temp = 0.0f; + flareMap[3](i, j, 2) = GLubyte(255.0f * temp); + temp = 0.1f * (1.0f - ((x > y) ? x : y)) / ((xy > 0.1f) ? xy : 0.1f); + if (temp > 1.0f) temp = 1.0f; + if (temp < 0.0f) temp = 0.0f; + flareMap[3](i, j, 3) = GLubyte(255.0f * temp); + } + } + + for (unsigned int i = 0; i < 4; ++i) + _flare[i] = Common::resources->genTexture( + GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + 4, FLARESIZE, FLARESIZE, GL_RGBA, GL_UNSIGNED_BYTE, + &flareMap[i].front(), false + ); + + _lists = Common::resources->genLists(4); + for (unsigned int i = 0; i < 4; ++i) { + glNewList(_lists + i, GL_COMPILE); + glBindTexture(GL_TEXTURE_2D, _flare[i]); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-0.5f, -0.5f, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(0.5f, -0.5f, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-0.5f, 0.5f, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(0.5f, 0.5f, 0.0f); + glEnd(); + glEndList(); + } + + blob = _flare[0]; +} + +// Draw a flare at a specified (x,y) location on the screen +// Screen corners are at (0,0) and (1,1) +void Flares::draw(const Vector& XYZ, const RGBColor& RGB, float alpha) { + double winX, winY, winZ; + gluProject( + XYZ.x(), XYZ.y(), XYZ.z(), + Hack::modelMat, Hack::projMat, Hack::viewport, + &winX, &winY, &winZ + ); + if (winZ > 1.0f) + return; + + // Fade alpha if source is off edge of screen + float fadeWidth = float(Common::width) * 0.1f; + if (winY < 0.0f) { + float temp = fadeWidth + winY; + if (temp < 0.0f) return; + alpha *= temp / fadeWidth; + } + if (winY > Common::height) { + float temp = fadeWidth - winY + Common::height; + if (temp < 0.0f) return; + alpha *= temp / fadeWidth; + } + if (winX < 0) { + float temp = fadeWidth + winX; + if (temp < 0.0f) return; + alpha *= temp / fadeWidth; + } + if (winX > Common::width) { + float temp = fadeWidth - winX + Common::width; + if (temp < 0.0f) return; + alpha *= temp / fadeWidth; + } + + float x = (float(winX) / float(Common::width)) * Common::aspectRatio; + float y = float(winY) / float(Common::height); + + // Find lens flare vector + // This vector runs from the light source through the screen's center + float dx = 0.5f * Common::aspectRatio - x; + float dy = 0.5f - y; + + glPushAttrib(GL_ENABLE_BIT); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glEnable(GL_BLEND); + glEnable(GL_TEXTURE_2D); + + // Setup projection matrix + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluOrtho2D(0, Common::aspectRatio, 0, 1.0f); + + // Update fractal flickering + static float flicker = 0.95f; + flicker += Common::elapsedSecs * (Common::randomFloat(2.0f) - 1.0f); + if (flicker < 0.9f) flicker = 0.9f; + if (flicker > 1.1f) flicker = 1.1f; + alpha *= flicker; + + // Draw stuff + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + glLoadIdentity(); + glTranslatef(x, y, 0.0f); + glScalef(0.1f * flicker, 0.1f * flicker, 1.0f); + glColor4f(RGB.r(), RGB.g(), RGB.b() * 0.8f, alpha); + glCallList(_lists + 0); + + // wide flare + glLoadIdentity(); + glTranslatef(x, y, 0.0f); + glScalef(5.0f * alpha, 0.05f * alpha, 1.0f); + glColor4f(RGB.r() * 0.3f, RGB.g() * 0.3f, RGB.b(), alpha); + glCallList(_lists + 0); + + // torus + glLoadIdentity(); + glTranslatef(x, y, 0.0f); + glScalef(0.5f, 0.2f, 1.0f); + glColor4f(RGB.r(), RGB.g() * 0.5f, RGB.b() * 0.5f, alpha * 0.4f); + glCallList(_lists + 2); + + // 3 blueish dots + glLoadIdentity(); + glTranslatef(x + dx * 0.35f, y + dy * 0.35f, 0.0f); + glScalef(0.06f, 0.06f, 1.0f); + glColor4f(RGB.r() * 0.85f, RGB.g() * 0.85f, RGB.b(), alpha * 0.5f); + glCallList(_lists + 1); + + glLoadIdentity(); + glTranslatef(x + dx * 0.45f, y + dy * 0.45f, 0.0f); + glScalef(0.09f, 0.09f, 1.0f); + glColor4f(RGB.r() * 0.7f, RGB.g() * 0.7f, RGB.b(), alpha * 0.4f); + glCallList(_lists + 1); + + glLoadIdentity(); + glTranslatef(x + dx * 0.55f, y + dy * 0.55f, 0.0f); + glScalef(0.12f, 0.12f, 1.0f); + glColor4f(RGB.r() * 0.55f, RGB.g() * 0.55f, RGB.b(), alpha * 0.3f); + glCallList(_lists + 1); + + // 4 more dots + glLoadIdentity(); + glTranslatef(x + dx * 0.75f, y + dy * 0.75f, 0.0f); + glScalef(0.14f, 0.07f, 1.0f); + glColor4f(RGB.r() * 0.3f, RGB.g() * 0.3f, RGB.b() * 0.3f, alpha); + glCallList(_lists + 3); + + glLoadIdentity(); + glTranslatef(x + dx * 0.78f, y + dy * 0.78f, 0.0f); + glScalef(0.06f, 0.06f, 1.0f); + glColor4f(RGB.r() * 0.3f, RGB.g() * 0.4f, RGB.b() * 0.4f, alpha * 0.5f); + glCallList(_lists + 1); + + glLoadIdentity(); + glTranslatef(x + dx * 1.25f, y + dy * 1.25f, 0.0f); + glScalef(0.1f, 0.1f, 1.0f); + glColor4f(RGB.r() * 0.3f, RGB.g() * 0.4f, RGB.b() * 0.3f, alpha * 0.5f); + glCallList(_lists + 1); + + glLoadIdentity(); + glTranslatef(x + dx * 1.3f, y + dy * 1.3f, 0.0f); + glScalef(0.07f, 0.07f, 1.0f); + glColor4f(RGB.r() * 0.6f, RGB.g() * 0.45f, RGB.b() * 0.3f, alpha * 0.5f); + glCallList(_lists + 1); + + // stretched weird flare + glLoadIdentity(); + glTranslatef(x + dx * 1.45f, y + dy * 1.45f, 0.0f); + glScalef(0.8f, 0.2f, 1.0f); + glRotatef(x * 70.0f, 0, 0, 1); + glColor4f(RGB.r(), RGB.g(), RGB.b(), alpha * 0.4f); + glCallList(_lists + 3); + + // circle + glLoadIdentity(); + glTranslatef(x + dx * 2.0f, y + dy * 2.0f, 0.0f); + glScalef(0.3f, 0.3f, 1.0f); + glColor4f(RGB.r(), RGB.g(), RGB.b(), alpha * 0.2f); + glCallList(_lists + 1); + + // big weird flare + glLoadIdentity(); + glTranslatef(x + dx * 2.4f, y + dy * 2.4f, 0.0f); + glRotatef(y * 40.0f, 0, 0, 1); + glScalef(0.7f, 0.7f, 1.0f); + glColor4f(RGB.r(), RGB.g(), RGB.b(), alpha * 0.3f); + glCallList(_lists + 3); + + // Unsetup projection matrix + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + glPopAttrib(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/flares.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/flares.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/flares.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/flares.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,37 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _FLARES_HH +#define _FLARES_HH + +#include + +#include + +namespace Flares { + extern GLuint blob; + + void init(); + void draw(const Vector&, const RGBColor&, float); +}; + +#endif // _FLARES_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/goo.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/goo.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/goo.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/goo.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,169 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +namespace Goo { + int _resolution; + float _unitSize; + float _volumeSize; + int _arraySize; + + std::vector _surface; + std::vector _useSurface; + + float _centerX, _centerZ; + float _shiftX, _shiftZ; + + float _goo[4]; + float _gooPhase[4] = { 0.0f, 1.0f, 2.0f, 3.0f }; + float _gooSpeed[4] = { + 0.1f + Common::randomFloat(0.4f), + 0.1f + Common::randomFloat(0.4f), + 0.1f + Common::randomFloat(0.4f), + 0.1f + Common::randomFloat(0.4f) + }; + float _gooRGB[4]; + + float function(const Vector&); +}; + +#define AT(x, y) ((x) * _arraySize + (y)) + +void Goo::init() { + _volumeSize = 2.0f; + _resolution = (Hack::resolution < 5 ? 5 : Hack::resolution); + _unitSize = _volumeSize / float(_resolution); + _arraySize = 2 * int(0.99f + Hack::fogDepth / _volumeSize); + + Implicit::init(_resolution, _resolution, _resolution, _unitSize); + + stdx::construct_n(_surface, _arraySize * _arraySize, &function); + stdx::construct_n(_useSurface, _arraySize * _arraySize, false); +} + +void Goo::update(float heading, float fov) { + float halfFov = 0.5f * fov; + + _centerX = _unitSize * float(int(0.5f + Hack::camera.x() / _unitSize)); + _centerZ = _unitSize * float(int(0.5f + Hack::camera.z() / _unitSize)); + + float clip[3][2]; + clip[0][0] = std::cos(heading + halfFov); + clip[0][1] = -std::sin(heading + halfFov); + clip[1][0] = -std::cos(heading - halfFov); + clip[1][1] = std::sin(heading - halfFov); + clip[2][0] = std::sin(heading); + clip[2][1] = -std::cos(heading); + + for (int i = 0; i < _arraySize; ++i) { + for (int j = 0; j < _arraySize; ++j) { + _shiftX = _volumeSize * (0.5f + float(int(i) - int(_arraySize) / 2)); + _shiftZ = _volumeSize * (0.5f + float(int(j) - int(_arraySize) / 2)); + if (_shiftX * clip[0][0] + _shiftZ * clip[0][1] > _volumeSize * -M_SQRT2) { + if (_shiftX * clip[1][0] + _shiftZ * clip[1][1] > _volumeSize * -M_SQRT2) { + if (_shiftX * clip[2][0] + _shiftZ * clip[2][1] < Hack::fogDepth + _volumeSize * M_SQRT2) { + _shiftX += _centerX; + _shiftZ += _centerZ; + _surface[AT(i, j)].update(0.4f); + _useSurface[AT(i, j)] = true; + } + } + } + } + } + + // calculate color + static float gooRGBphase[3] = { -0.1f, -0.1f, -0.1f }; + static float gooRGBspeed[3] = { + Common::randomFloat(0.02f) + 0.02f, + Common::randomFloat(0.02f) + 0.02f, + Common::randomFloat(0.02f) + 0.02f + }; + for (int i = 0; i < 3; ++i) { + gooRGBphase[i] += gooRGBspeed[i] * Common::elapsedTime; + if (gooRGBphase[i] >= M_PI * 2.0f) gooRGBphase[i] -= M_PI * 2.0f; + _gooRGB[i] = std::sin(gooRGBphase[i]); + if (_gooRGB[i] < 0.0f) _gooRGB[i] = 0.0f; + } + + // update goo function constants + for (int i = 0; i < 4; ++i) { + _gooPhase[i] += _gooSpeed[i] * Common::elapsedTime; + if (_gooPhase[i] >= M_PI * 2.0f) _gooPhase[i] -= M_PI * 2.0f; + _goo[i] = 0.25f * std::cos(_gooPhase[i]); + } +} + +void Goo::draw() { + glPushAttrib(GL_ENABLE_BIT); + Nebula::use(); + if (Hack::shaders) + _gooRGB[3] = Hack::lerp; + else + _gooRGB[3] = 1.0f; + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glEnable(GL_BLEND); + glColor4fv(_gooRGB); + + for (int i = 0; i < _arraySize; ++i) { + for (int j = 0; j < _arraySize; ++j) { + if (_useSurface[AT(i, j)]) { + float shiftX = _centerX + _volumeSize * (0.5f + float(int(i) - int(_arraySize) / 2)); + float shiftZ = _centerZ + _volumeSize * (0.5f + float(int(j) - int(_arraySize) / 2)); + glPushMatrix(); + glTranslatef(shiftX, 0.0f, shiftZ); + _surface[AT(i, j)].draw(); + glPopMatrix(); + _useSurface[AT(i, j)] = false; + } + } + } + glPopAttrib(); +} + +float Goo::function(const Vector& XYZ) { + float pX = XYZ.x() + _shiftX; + float pZ = XYZ.z() + _shiftZ; + float camX = pX - Hack::camera.x(); + float camZ = pZ - Hack::camera.z(); + + return + // This first term defines upper and lower surfaces. + XYZ.y() * XYZ.y() * 1.25f + // These terms make the surfaces wavy. + + _goo[0] * std::cos(pX - 2.71f * XYZ.y()) + + _goo[1] * std::cos(4.21f * XYZ.y() + pZ) + + _goo[2] * std::cos(1.91f * pX - 1.67f * pZ) + + _goo[3] * std::cos(1.53f * pX + 1.11f * XYZ.y() + 2.11f * pZ) + // The last term creates a bubble around the eyepoint so it doesn't + // punch through the surface. + - 0.1f / (camX * camX + XYZ.y() * XYZ.y() + camZ * camZ); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/goo.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/goo.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/goo.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/goo.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,34 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _GOO_HH +#define _GOO_HH + +#include + +namespace Goo { + void init(); + void update(float, float); + void draw(); +}; + +#endif // _GOO_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/hyperspace.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/hyperspace.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/hyperspace.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/hyperspace.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,448 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Hack { + unsigned int numStars = 1000; + float starSize = 10.0f; + unsigned int depth = 5; + float fov = 50.0f; + float speed = 10.0f; + unsigned int resolution = 10; + bool shaders = true; +}; + +namespace Hack { + unsigned int frames; + unsigned int current; + + float fogDepth; + Vector camera, dir; + float unroll; + float lerp; + + int viewport[4]; + double projMat[16]; + double modelMat[16]; +}; + +namespace Hack { + enum Arguments { + ARG_STARS = 1, + ARG_SIZE, + ARG_DEPTH, + ARG_FOV, + ARG_SPEED, + ARG_RESOLUTION, + ARG_SHADERS = 0x100, ARG_NO_SHADERS + }; + + std::vector _stars; + StretchedParticle* _sun; + + float gooFunction(const Vector&); + float nextFrame(); + + error_t parse(int, char*, struct argp_state*); +}; + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { + switch (key) { + case ARG_STARS: + if (Common::parseArg(arg, numStars, 0u, 10000u)) + argp_failure(state, EXIT_FAILURE, 0, + "stars must be between 0 and 10000"); + return 0; + case ARG_SIZE: + if (Common::parseArg(arg, starSize, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "star size must be between 1 and 100"); + return 0; + case ARG_DEPTH: + if (Common::parseArg(arg, depth, 1u, 10u)) + argp_failure(state, EXIT_FAILURE, 0, + "depth must be between 1 and 10"); + return 0; + case ARG_FOV: + if (Common::parseArg(arg, fov, 10.0f, 150.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "field of view must be between 10 and 150"); + return 0; + case ARG_SPEED: + if (Common::parseArg(arg, speed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "speed must be between 1 and 100"); + return 0; + case ARG_RESOLUTION: + if (Common::parseArg(arg, resolution, 4u, 20u)) + argp_failure(state, EXIT_FAILURE, 0, + "resolution must be between 4 and 20"); + return 0; + case ARG_SHADERS: + shaders = true; + return 0; + case ARG_NO_SHADERS: + shaders = false; + return 0; + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Hyperspace options:" }, + { "stars", ARG_STARS, "NUM", 0, + "Number of stars (0-10000, default = 1000)" }, + { "size", ARG_SIZE, "NUM", 0, + "Star size (1-100, default = 10)" }, + { "depth", ARG_DEPTH, "NUM", 0, "Depth (1-10, default = 5)" }, + { "fov", ARG_FOV, "NUM", 0, "Field of view (10-150, default = 90)" }, + { "speed", ARG_SPEED, "NUM", 0, "Speed (1-100, default = 10)" }, + { "resolution", ARG_RESOLUTION, "NUM", 0, + "Resolution (4-20, default = 10)" }, + { "shaders", ARG_SHADERS, NULL, OPTION_HIDDEN, + "Disable shaders" }, + { "no-shaders", ARG_NO_SHADERS, NULL, OPTION_ALIAS }, + {} + }; + static struct argp parser = + { options, parse, NULL, "Soar through wormholes in liquid spacetime." }; + return &parser; +} + +std::string Hack::getShortName() { return "hyperspace"; } +std::string Hack::getName() { return "Hyperspace"; } + +float Hack::nextFrame() { + static float time = 0.0f; + time += Common::elapsedTime; + + // loop frames every 2 seconds + static float frameTime = 2.0f / float(frames); + + while (time > frameTime) { + time -= frameTime; + current++; + if (current == frames) current = 0; + } + + return time / frameTime; +} + +void Hack::start() { + glViewport(0, 0, Common::width, Common::height); + viewport[0] = 0; + viewport[1] = 0; + viewport[2] = Common::width; + viewport[3] = Common::height; + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(fov, Common::aspectRatio, 0.001f, 200.0f); + glGetDoublev(GL_PROJECTION_MATRIX, projMat); + glMatrixMode(GL_MODELVIEW); + + try { + Shaders::init(); + shaders = true; + } catch (...) { + shaders = false; + } + Hack::frames = shaders ? 20 : 60; + + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); + glEnable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + + Flares::init(); + Spline::init(depth * 2 + 6); + Tunnel::init(); + + fogDepth = depth * 2.0f - 2.0f / float(resolution); + Goo::init(); + + _stars.reserve(numStars); + for (unsigned int i = 0; i < numStars; ++i) { + RGBColor color( + 0.5f + Common::randomFloat(0.5f), + 0.5f + Common::randomFloat(0.5f), + 0.5f + Common::randomFloat(0.5f) + ); + switch (Common::randomInt(3)) { + case 0: color.r() = 1.0f; break; + case 1: color.g() = 1.0f; break; + case 2: color.b() = 1.0f; break; + } + _stars.push_back(StretchedParticle( + Vector( + Common::randomFloat(2.0f * fogDepth) - fogDepth, + Common::randomFloat(4.0f) - 2.0f, + Common::randomFloat(2.0f * fogDepth) - fogDepth + ), + Common::randomFloat(starSize * 0.001f) + starSize * 0.001f, + color, fov + )); + } + + _sun = new StretchedParticle( + Vector(0.0f, 2.0f, 0.0f), starSize * 0.004f, + RGBColor(1.0f, 1.0f, 1.0f), fov + ); + Common::resources->manage(_sun); + + StarBurst::init(); + Nebula::init(); + current = 0; + + glEnable(GL_FOG); + float fog_color[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; + glFogfv(GL_FOG_COLOR, fog_color); + glFogf(GL_FOG_MODE, GL_LINEAR); + glFogf(GL_FOG_START, fogDepth * 0.7f); + glFogf(GL_FOG_END, fogDepth); +} + +void Hack::tick() { + glMatrixMode(GL_MODELVIEW); + + // Camera movements + static float heading[3] = { 0.0f, 0.0f, 0.0f }; // current, target, and last + static bool headingChange = true; + static float headingChangeTime[2] = { 20.0f, 0.0f }; // total, elapsed + static float roll[3] = { 0.0f, 0.0f, 0.0f }; // current, target, and last + static bool rollChange = true; + static float rollChangeTime[2] = { 1.0f, 0.0f }; // total, elapsed + headingChangeTime[1] += Common::elapsedTime; + if( headingChangeTime[1] >= headingChangeTime[0]) { // Choose new direction + headingChangeTime[0] = Common::randomFloat(15.0f) + 5.0f; + headingChangeTime[1] = 0.0f; + heading[2] = heading[1]; // last = target + if (headingChange) { + // face forward most of the time + if (Common::randomInt(6)) + heading[1] = 0.0f; + // face backward the rest of the time + else if (Common::randomInt(2)) + heading[1] = M_PI; + else + heading[1] = -M_PI; + headingChange = false; + } else + headingChange = true; + } + float t = headingChangeTime[1] / headingChangeTime[0]; + t = 0.5f * (1.0f - std::cos(M_PI * t)); + heading[0] = heading[1] * t + heading[2] * (1.0f - t); + rollChangeTime[1] += Common::elapsedTime; + if (rollChangeTime[1] >= rollChangeTime[0]) { // Choose new roll angle + rollChangeTime[0] = Common::randomFloat(5.0f) + 10.0f; + rollChangeTime[1] = 0.0f; + roll[2] = roll[1]; // last = target + if (rollChange) { + roll[1] = Common::randomFloat(M_PI * 4.0f) - M_PI * 2.0f; + rollChange = false; + } else + rollChange = true; + } + t = rollChangeTime[1] / rollChangeTime[0]; + t = 0.5f * (1.0f - std::cos(M_PI * t)); + roll[0] = roll[1] * t + roll[2] * (1.0f - t); + + Spline::moveAlongPath(speed * Common::elapsedTime * 0.03f); + Spline::update(Common::elapsedTime); + camera = Spline::at(depth + 2, Spline::step); + dir = Spline::direction(depth + 2, Spline::step); + float pathAngle = std::atan2(-dir.x(), -dir.z()); + + glLoadIdentity(); + glRotatef(-roll[0] * R2D, 0, 0, 1); + glRotatef((-pathAngle - heading[0]) * R2D, 0, 1, 0); + glTranslatef(-camera.x(), -camera.y(), -camera.z()); + glGetDoublev(GL_MODELVIEW_MATRIX, modelMat); + unroll = roll[0] * R2D; + + // calculate diagonal fov + float diagFov = 0.5f * fov * D2R; + diagFov = std::tan(diagFov); + diagFov = std::sqrt(diagFov * diagFov + (diagFov * Common::aspectRatio * diagFov * Common::aspectRatio)); + diagFov = 2.0f * std::atan(diagFov); + + // clear + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // pick animated texture frame + lerp = Hack::nextFrame(); + + // draw stars + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, Flares::blob); + for ( + std::vector::iterator i = _stars.begin(); + i < _stars.end(); + ++i + ) { + i->update(); + i->draw(); + } + + // draw goo + Goo::update(pathAngle + heading[0], diagFov); + Goo::draw(); + + // update starburst + StarBurst::update(); + StarBurst::draw(); + + // draw tunnel + Tunnel::draw(); + + // draw sun with lens flare + glDisable(GL_FOG); + static Vector flarePos(0.0f, 2.0f, 0.0f); + glBindTexture(GL_TEXTURE_2D, Flares::blob); + _sun->draw(); + float alpha = 0.5f - 0.005f * (flarePos - camera).length(); + if (alpha > 0.0f) + Flares::draw(flarePos, RGBColor(1.0f, 1.0f, 1.0f), alpha); + glEnable(GL_FOG); + + Common::flush(); +} + +void Hack::reshape() { + glViewport(0, 0, Common::width, Common::height); + viewport[0] = 0; + viewport[1] = 0; + viewport[2] = Common::width; + viewport[3] = Common::height; + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(fov, Common::aspectRatio, 0.001f, 200.0f); + glGetDoublev(GL_PROJECTION_MATRIX, projMat); + glMatrixMode(GL_MODELVIEW); +} + +void Hack::stop() {} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + case 'q': case 'Q': + Common::running = false; + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} +void Hack::pointerMotion(int, int) {} +void Hack::buttonPress(unsigned int) {} +void Hack::buttonRelease(unsigned int) {} +void Hack::pointerEnter() {} +void Hack::pointerLeave() {} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS Create(void* hdl, void* props) +{ + if (!props) + return STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + + return STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void Stop() +{ + Hack::stop(); +} + +void Destroy() +{ +} + +ADDON_STATUS GetStatus() +{ + return STATUS_OK; +} + +bool HasSettings() +{ + return false; +} + +unsigned int GetSettings(StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS SetSetting(const char *settingName, const void *settingValue) +{ + return STATUS_OK; +} + +void FreeSettings() +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +void Remove() +{ +} + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/hyperspace.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/hyperspace.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/hyperspace.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/hyperspace.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,47 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _HYPERSPACE_HH +#define _HYPERSPACE_HH + +#include + +#include + +namespace Hack { + extern unsigned int resolution; + extern bool shaders; + + extern unsigned int frames; + extern unsigned int current; + + extern float fogDepth; + extern Vector camera, dir; + extern float unroll; + extern float lerp; + + extern int viewport[4]; + extern double projMat[16]; + extern double modelMat[16]; +}; + +#endif // _HYPERSPACE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,19 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_hyperspace_SOURCES = $(COMMON) $(COLOR) $(VECTOR) $(IMPLICIT) $(IMAGE) \ + caustic.cc caustic.hh cubemaps.cc cubemaps.hh extensions.cc extensions.hh \ + flares.cc flares.hh goo.cc goo.hh hyperspace.cc hyperspace.hh nebula.cc \ + nebula.hh particle.cc particle.hh starburst.cc starburst.hh shaders.cc \ + shaders.hh spline.cc spline.hh tunnel.cc tunnel.hh + +AM_CPPFLAGS += $(IMAGE_CPPFLAGS) +AM_CXXFLAGS += $(IMAGE_CXXFLAGS) +AM_LDFLAGS += $(IMAGE_LDFLAGS) +rs_hyperspace_LDADD = $(LIBMISC) $(X_LIBS) $(OPENGL_LIBS) $(IMAGE_LIBS) + +hack_PROGRAMS = rs-hyperspace + +hyperspacedatadir = $(pkgdatadir)/hyperspace +dist_hyperspacedata_DATA = nebula.png diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/nebula.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/nebula.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/nebula.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/nebula.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,74 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include + +namespace Nebula { + GLuint _texture; +}; + +void Nebula::init() { + PNG png("nebula.png"); + +#if USE_GL_EXTENSIONS + if (Hack::shaders) { + _texture = Common::resources->genCubeMapTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, + png + ); + WavyNormalCubeMaps::init(); + } else +#endif // USE_GL_EXTENSIONS + { + unsigned int h = png.height(); + unsigned int w = png.width(); + float halfH = float(h) / 2.0f; + float halfW = float(w) / 2.0f; + + stdx::dim3 _nebulaMap(w, h); + for (unsigned int i = 0; i < h; ++i) { + float y = (float(i) - halfH) / halfH; + for (unsigned int j = 0; j < w; ++j) { + float x = (float(j) - halfW) / halfW; + float temp = Common::clamp( + (x * x) + (y * y), + 0.0f, 1.0f + ); + RGBColor color(png(i, j)); + _nebulaMap(i, j, 0) = color.r() * temp; + _nebulaMap(i, j, 1) = color.g() * temp; + _nebulaMap(i, j, 2) = color.b() * temp; + } + } + _texture = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + 3, w, h, GL_RGB, GL_FLOAT, &_nebulaMap.front() + ); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/nebula.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/nebula.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/nebula.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/nebula.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,82 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _NEBULA_HH +#define _NEBULA_HH + +#include + +#include +#include +#include +#include + +namespace Nebula { + typedef Common::Exception Exception; + + void init(); + float update(); + + extern GLuint _texture; + + inline void use() { +#if USE_GL_EXTENSIONS + if (Hack::shaders) { + glDisable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_CUBE_MAP_ARB); + Extensions::glActiveTextureARB(GL_TEXTURE2_ARB); + glBindTexture( + GL_TEXTURE_CUBE_MAP_ARB, + _texture + ); + Extensions::glActiveTextureARB(GL_TEXTURE1_ARB); + glBindTexture( + GL_TEXTURE_CUBE_MAP_ARB, + WavyNormalCubeMaps::textures[(Hack::current + 1) % Hack::frames] + ); + Extensions::glActiveTextureARB(GL_TEXTURE0_ARB); + glBindTexture( + GL_TEXTURE_CUBE_MAP_ARB, + WavyNormalCubeMaps::textures[Hack::current] + ); + Extensions::glBindProgramARB( + GL_VERTEX_PROGRAM_ARB, + Shaders::gooVP + ); + glEnable(GL_VERTEX_PROGRAM_ARB); + Extensions::glBindProgramARB( + GL_FRAGMENT_PROGRAM_ARB, + Shaders::gooFP + ); + glEnable(GL_FRAGMENT_PROGRAM_ARB); + } else +#endif // USE_GL_EXTENSIONS + { + glBindTexture(GL_TEXTURE_2D, _texture); + glEnable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + } + } +}; + +#endif // _NEBULA_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/nebula.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/nebula.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/particle.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/particle.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/particle.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/particle.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,126 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include + +StretchedParticle::StretchedParticle( + const Vector& XYZ, float radius, const RGBColor& color, float fov) : + _XYZ(XYZ), _lastXYZ(XYZ), _radius(radius), + _color(color), _fov(fov), _moved(true) { + _lastScreenPos[0] = _lastScreenPos[1] = 0.0f; +} + +void StretchedParticle::update() { + Vector temp(_XYZ - Hack::camera); + if (temp.x() > Hack::fogDepth) { + _XYZ.x() = _XYZ.x() - Hack::fogDepth * 2.0f; + _lastXYZ.x() = _lastXYZ.x() - Hack::fogDepth * 2.0f; + } + if (temp.x() < -Hack::fogDepth) { + _XYZ.x() = _XYZ.x() + Hack::fogDepth * 2.0f; + _lastXYZ.x() = _lastXYZ.x() + Hack::fogDepth * 2.0f; + } + if (temp.z() > Hack::fogDepth) { + _XYZ.z() = _XYZ.z() - Hack::fogDepth * 2.0f; + _lastXYZ.z() = _lastXYZ.z() - Hack::fogDepth * 2.0f; + } + if (temp.z() < -Hack::fogDepth) { + _XYZ.z() = _XYZ.z() + Hack::fogDepth * 2.0f; + _lastXYZ.z() = _lastXYZ.z() + Hack::fogDepth * 2.0f; + } +} + +void StretchedParticle::draw() { + double winX, winY, winZ; + gluProject( + _XYZ.x(), _XYZ.y(), _XYZ.z(), + Hack::modelMat, Hack::projMat, Hack::viewport, + &winX, &winY, &winZ + ); + + double screenPos[2]; + if (winZ > 0.0f) { + screenPos[0] = winX; + screenPos[1] = winY; + } else { + screenPos[0] = _lastScreenPos[0]; + screenPos[1] = _lastScreenPos[1]; + } + + Vector drawXYZ((_XYZ + _lastXYZ) * 0.5f); + _lastXYZ = _XYZ; + + if (_moved) { + // Window co-ords are screwed, so skip it + _moved = false; + } else { + float sd[2]; // screen difference, position difference + sd[0] = float(screenPos[0] - _lastScreenPos[0]); + sd[1] = float(screenPos[1] - _lastScreenPos[1]); + + Vector pd(Hack::camera - drawXYZ); + float n = pd.normalize(); + RotationMatrix bbMat = RotationMatrix::lookAt(pd, Vector(), Vector(0, 1, 0)); + + float stretch = 0.0015f * std::sqrt(sd[0] * sd[0] + sd[1] * sd[1]) * n / _radius; + if (stretch < 1.0f) stretch = 1.0f; + if (stretch > 0.5f / _radius) stretch = 0.5f / _radius; + glPushMatrix(); + glTranslatef(drawXYZ.x(), drawXYZ.y(), drawXYZ.z()); + glMultMatrixf(bbMat.get()); + glRotatef(R2D * std::atan2(sd[1], sd[0]) + Hack::unroll, 0, 0, 1); + glScalef(stretch, 1.0f, 1.0f); + float darkener = stretch * 0.5f; + if (darkener < 1.0f) darkener = 1.0f; + // draw colored aura + glColor3f(_color.r() / darkener, _color.g() / darkener, _color.b() / darkener); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-_radius, -_radius, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(_radius, -_radius, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-_radius, _radius, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(_radius, _radius, 0.0f); + glEnd(); + // draw white center + glColor3f(1.0f / darkener, 1.0f / darkener, 1.0f / darkener); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-_radius * 0.3f, -_radius * 0.3f, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(_radius * 0.3f, -_radius * 0.3f, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-_radius * 0.3f, _radius * 0.3f, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(_radius * 0.3f, _radius * 0.3f, 0.0f); + glEnd(); + glPopMatrix(); + } + + _lastScreenPos[0] = screenPos[0]; + _lastScreenPos[1] = screenPos[1]; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/particle.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/particle.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/particle.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/particle.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,56 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _PARTICLE_H +#define _PARTICLE_H + +#include + +#include +#include + +class StretchedParticle : public ResourceManager::Resource { +private: + Vector _XYZ, _lastXYZ; + float _radius; + RGBColor _color; + float _fov; + + double _lastScreenPos[2]; + bool _moved; +public: + StretchedParticle(const Vector&, float, const RGBColor&, float); + void operator()() const {} + + void update(); + void draw(); + + const Vector& getPos() const { return _XYZ; } + void setPos(const Vector& XYZ) { + _XYZ = _lastXYZ = XYZ; _moved = true; + } + void offsetPos(const Vector& XYZ) { _XYZ += XYZ; } + + void setColor(const RGBColor& RGB) { _color = RGB; } +}; + +#endif // _PARTICLE_H diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/shaders.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/shaders.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/shaders.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/shaders.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,198 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include + +namespace Shaders { + GLuint gooVP, gooFP, tunnelVP, tunnelFP; +}; + +#if USE_GL_EXTENSIONS + +static std::string gooVPasm( + "!!ARBvp1.0\n" + + "PARAM mvp[4] = { state.matrix.mvp };\n" + "PARAM mvit[4] = { state.matrix.modelview.invtrans };\n" + + "TEMP oPos, fogtemp;\n" + + "DP4 oPos.x, mvp[0], vertex.position;\n" + "DP4 oPos.y, mvp[1], vertex.position;\n" + "DP4 oPos.z, mvp[2], vertex.position;\n" + "DP4 oPos.w, mvp[3], vertex.position;\n" + "MOV result.position, oPos;\n" + + "MOV result.color, vertex.color;\n" + + "MOV result.texcoord[0], vertex.normal;\n" + + // vector pointing at eye + "SUB result.texcoord[1], mvit[3], vertex.position;\n" + + "SUB fogtemp, state.fog.params.z, oPos.z;\n" + "MUL result.fogcoord.x, fogtemp.x, state.fog.params.w;\n" + + "END\n" +); + +static std::string gooFPasm( + "!!ARBfp1.0\n" + + "TEMP total, temp, eye_vec, norm, ref_vec, cube_vec, alpha;\n" + + // get normal from normal map + "TEX norm, fragment.texcoord[0], texture[0], CUBE;\n" + // remap to {-1, 1} + "MAD norm, norm, 2.0, -1.0;\n" + // get normal from normal map + "TEX temp, fragment.texcoord[0], texture[1], CUBE;\n" + // remap to {-1, 1} + "MAD temp, temp, 2.0, -1.0;\n" + // lerp between normals + "LRP norm, fragment.color.a, temp, norm;\n" + + // normalize eye vector + "DP3 temp.x, fragment.texcoord[1], fragment.texcoord[1];\n" + "RSQ temp.x, temp.x;\n" + "MUL eye_vec, fragment.texcoord[1], temp.x;\n" + + // calculate reflection vector + "DP3 temp.x, eye_vec, norm;\n" + "MUL temp.x, temp.x, 2.0;\n" + "MUL temp, norm, temp.x;\n" + "SUB ref_vec, temp, eye_vec;\n" + + // use reflection vector to find fragment color + "TEX total, ref_vec, texture[2], CUBE;\n" + + // modulate with vertex color + "MUL_SAT total, total, fragment.color;\n" + + // fresnel alpha + "DP3 alpha.a, norm, eye_vec;\n" + "ABS alpha.a, alpha.a;\n" + "SUB alpha.a, 1.0, alpha.a;\n" + "MUL_SAT total.a, alpha.a, alpha.a;\n" + + // fog + "LRP result.color, fragment.fogcoord.x, total, state.fog.color;\n" + + "END\n" +); + +static std::string tunnelVPasm( + "!!ARBvp1.0\n" + + "PARAM mvp[4] = { state.matrix.mvp };\n" + + "TEMP temppos, fogtemp;\n" + + "DP4 result.position.x, mvp[0], vertex.position;\n" + "DP4 result.position.y, mvp[1], vertex.position;\n" + "DP4 temppos.z, mvp[2], vertex.position;\n" + "MOV result.position.z, temppos.z;\n" + "DP4 result.position.w, mvp[3], vertex.position;\n" + + "MOV result.color, vertex.color;\n" + "MOV result.texcoord[0], vertex.texcoord[0];\n" + + "SUB fogtemp, state.fog.params.z, temppos.z;\n" + "MUL result.fogcoord.x, fogtemp.x, state.fog.params.w;\n" + + "END\n" +); + +static std::string tunnelFPasm( + "!!ARBfp1.0\n" + + "TEMP temp, vertcolor, color, tex0, tex1, coord;\n" + + // texture + "TEX tex0, fragment.texcoord[0], texture[0], 2D;\n" + "TEX tex1, fragment.texcoord[0], texture[1], 2D;\n" + "LRP tex0, fragment.color.a, tex1, tex0;\n" + "MUL color, tex0, fragment.color;\n" + + // higher resolution texture + "MUL coord, fragment.texcoord[0], 3.0;\n" + "TEX tex0, coord, texture[0], 2D;\n" + "TEX tex1, coord, texture[1], 2D;\n" + "LRP tex0, fragment.color.a, tex1, tex0;\n" + "MUL tex0, tex0, 0.5;\n" + "MUL vertcolor, fragment.color, fragment.color;\n" + "MAD color, tex0, vertcolor, color;\n" + + // set alpha + "MOV color.a, 1.0;\n" + + // fog + "LRP result.color, fragment.fogcoord.x, color, state.fog.color;\n" + + "END\n" +); + +class Program : public ResourceManager::Resource { +private: + GLuint _program; +public: + Program( + GLenum target, GLenum format, const std::string& program + ) { + Extensions::glGenProgramsARB(1, &_program); + Extensions::glBindProgramARB(target, _program); + Extensions::glProgramStringARB( + target, format, program.length(), program.c_str() + ); + } + ~Program() { Extensions::glDeleteProgramsARB(1, &_program); } + GLuint operator()() const { return _program; } +}; + +void Shaders::init() { + Extensions::init(); + + gooVP = Common::resources->manage(new Program( + GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, gooVPasm + )); + gooFP = Common::resources->manage(new Program( + GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, gooFPasm + )); + + tunnelVP = Common::resources->manage(new Program( + GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, tunnelVPasm + )); + tunnelFP = Common::resources->manage(new Program( + GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, tunnelFPasm + )); +} + +#else // !USE_GL_EXTENSIONS + +void Shaders::init() { + throw Common::Exception("No shader support"); +} + +#endif // !USE_GL_EXTENSIONS diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/shaders.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/shaders.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/shaders.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/shaders.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,34 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _SHADERS_H +#define _SHADERS_H + +#include + +namespace Shaders { + extern GLuint gooVP, gooFP, tunnelVP, tunnelFP; + + void init(); +}; + +#endif // _SHADERS_H diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/spline.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/spline.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/spline.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/spline.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,155 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include + +namespace Spline { + unsigned int points; + float step; + + std::vector _phase; + std::vector _rate; + std::vector _moveXYZ; + std::vector _baseXYZ; + std::vector _XYZ; + std::vector _baseDir; + std::vector _dir; + + Vector interpolate(const Vector&, const Vector&, const Vector&, const Vector&, float); +}; + +void Spline::init(unsigned int length) { + // 6 is the minimum number of points necessary for a tunnel to have one segment + points = (length < 6 ? 6 : length); + step = 0.0f; + + stdx::construct_n(_phase, points); + stdx::construct_n(_rate, points); + stdx::construct_n(_moveXYZ, points); + stdx::construct_n(_baseXYZ, points); + stdx::construct_n(_XYZ, points); + stdx::construct_n(_baseDir, points); + stdx::construct_n(_dir, points); + + _baseXYZ[points - 2].z() = 4.0f; + + for (unsigned int i = 0; i < points; ++i) + makeNewPoint(); +} + +void Spline::makeNewPoint() { + // shift points to rear of path + std::rotate(_baseXYZ.begin(), _baseXYZ.begin() + 1, _baseXYZ.end()); + std::rotate(_moveXYZ.begin(), _moveXYZ.begin() + 1, _moveXYZ.end()); + std::rotate(_XYZ.begin(), _XYZ.begin() + 1, _XYZ.end()); + std::rotate(_phase.begin(), _phase.begin() + 1, _phase.end()); + std::rotate(_rate.begin(), _rate.begin() + 1, _rate.end()); + + // make vector to new point + int lastPoint = points - 1; + float tempX = _baseXYZ[lastPoint - 1].x() - _baseXYZ[lastPoint - 2].x(); + float tempZ = _baseXYZ[lastPoint - 1].z() - _baseXYZ[lastPoint - 2].z(); + + // find good angle + float turnAngle; + float pathAngle = std::atan2(tempX, tempZ); + float distSquared = + _baseXYZ[lastPoint].x() * _baseXYZ[lastPoint].x() + + _baseXYZ[lastPoint].z() * _baseXYZ[lastPoint].z(); + if (distSquared > 10000.0f) { + float angleToCenter = std::atan2(-_baseXYZ[lastPoint].x(), -_baseXYZ[lastPoint].z()); + turnAngle = angleToCenter - pathAngle; + if (turnAngle > M_PI) + turnAngle -= M_PI * 2.0f; + if (turnAngle < -M_PI) + turnAngle += M_PI * 2.0f; + turnAngle = Common::clamp(turnAngle, -0.7f, 0.7f); + } else + turnAngle = Common::randomFloat(1.4f) - 0.7f; + + // rotate new point to some new position + float ca = std::cos(turnAngle); + float sa = std::cos(turnAngle); + _baseXYZ[lastPoint].set(tempX * ca + tempZ * sa, 0.0f, tempX * -sa + tempZ * ca); + + // normalize and set length of vector + // make it at least length 2, which is the grid size of the goo + float lengthener = (Common::randomFloat(6.0f) + 2.0f) / _baseXYZ[lastPoint].length(); + _baseXYZ[lastPoint] *= lengthener; + + // make new movement vector proportional to base vector + _moveXYZ[lastPoint].set( + Common::randomFloat(0.25f) * -_baseXYZ[lastPoint].z(), + 0.3f, + Common::randomFloat(0.25f) * -_baseXYZ[lastPoint].x() + ); + + // add vector to previous point to get new point + _baseXYZ[lastPoint] += Vector( + _baseXYZ[lastPoint - 1].x(), + 0.0f, + _baseXYZ[lastPoint - 1].z() + ); + + // make new phase and movement rate + _phase[lastPoint] = Common::randomFloat(M_PI * 2); + _rate[lastPoint] = Common::randomFloat(1.0f); + + // reset base direction vectors + _baseDir.front() = _baseXYZ[1] - _baseXYZ[points - 1]; + std::transform( + _baseXYZ.begin() + 2, _baseXYZ.end(), + _baseXYZ.begin(), _baseDir.begin() + 1, + std::minus() + ); + _baseDir.back() = _baseXYZ[0] - _baseXYZ[points - 2]; +} + +Vector Spline::at(unsigned int section, float where) { + section = Common::clamp(section, 1u, points - 3); + + return interpolate(_XYZ[section - 1], _XYZ[section], _XYZ[section + 1], _XYZ[section + 2], where); +} + +Vector Spline::direction(unsigned int section, float where) { + section = Common::clamp(section, 1u, points - 3); + + Vector direction(interpolate(_dir[section - 1], _dir[section], _dir[section + 1], _dir[section + 2], where)); + direction.normalize(); + return direction; +} + +// Here's a little calculus that takes 4 points +// and interpolates smoothly between the second and third +// depending on the value of where which can be 0.0 to 1.0. +// The slope at b is estimated using a and c. The slope at c +// is estimated using b and d. +Vector Spline::interpolate(const Vector& a, const Vector& b, const Vector& c, const Vector& d, float where) { + return + (((b * 3.0f) + d - a - (c * 3.0f)) * (where * where * where)) * 0.5f + + (((a * 2.0f) - (b * 5.0f) + (c * 4.0f) - d) * (where * where)) * 0.5f + + ((c - a) * where) * 0.5f + + b; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/spline.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/spline.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/spline.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/spline.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,72 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _SPLINE_HH +#define _SPLINE_HH + +#include + +#include + +namespace Spline { + extern unsigned int points; + extern float step; + + void init(unsigned int); + + Vector at(unsigned int, float); + Vector direction(unsigned int, float); + + void makeNewPoint(); + inline void moveAlongPath(float increment) { + step += increment; + while (step >= 1.0f) { + step -= 1.0f; + makeNewPoint(); + } + } + + extern std::vector _phase; + extern std::vector _rate; + extern std::vector _moveXYZ; + extern std::vector _baseXYZ; + extern std::vector _XYZ; + extern std::vector _baseDir; + extern std::vector _dir; + + inline void update(float multiplier) { + // calculate xyz positions and direction vectors + _phase[0] += _rate[0] * multiplier; + _XYZ[0] = _baseXYZ[0] + _moveXYZ[0] * std::cos(_phase[0]); + _phase[1] += _rate[1] * multiplier; + _XYZ[1] = _baseXYZ[1] + _moveXYZ[1] * std::cos(_phase[1]); + for (unsigned int i = 2; i < points; ++i) { + _phase[i] += _rate[i] * multiplier; + _XYZ[i] = _baseXYZ[i] + _moveXYZ[i] * std::cos(_phase[i]); + _dir[i - 1] = _XYZ[i] - _XYZ[i - 2]; + } + _dir[points - 1] = _XYZ[0] - _XYZ[points - 2]; + _dir[0] = _XYZ[1] - _XYZ[points - 1]; + } +}; + +#endif // _SPLINE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/starburst.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/starburst.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/starburst.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/starburst.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,167 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include + +#define STARBURST_COUNT 200 + +namespace StarBurst { + std::vector _stars; + bool _active[STARBURST_COUNT]; + UnitVector _velocity[STARBURST_COUNT]; + float _size; + Vector _pos; + + GLuint _list; + + void drawStars(); +}; + +void StarBurst::init() { + for (unsigned int i = 0; i < STARBURST_COUNT; ++i) { + _stars.push_back(StretchedParticle( + Vector(), 0.03f, RGBColor(1.0f, 1.0f, 1.0f), 0.0f + )); + _active[i] = false; + _velocity[i] = UnitVector(Vector( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + )); + } + + _list = Common::resources->genLists(1); + glNewList(_list, GL_COMPILE); + for (unsigned int j = 0; j < 32; ++j) { + float cj = std::cos(float(j) * M_PI * 2.0f / 32.0f); + float sj = std::sin(float(j) * M_PI * 2.0f / 32.0f); + float cjj = std::cos(float(j + 1) * M_PI * 2.0f / 32.0f); + float sjj = std::sin(float(j + 1) * M_PI * 2.0f / 32.0f); + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int i = 0; i <= 32; ++i) { + float ci = std::cos(float(i) * M_PI * 2.0f / 32.0f); + float si = std::sin(float(i) * M_PI * 2.0f / 32.0f); + glNormal3f(sj * ci, cj, sj * si); + glVertex3f(sj * ci, cj, sj * si); + glNormal3f(sjj * ci, cjj, sjj * si); + glVertex3f(sjj * ci, cjj, sjj * si); + } + glEnd(); + } + glEndList(); + + _size = 4.0f; +} + +void StarBurst::drawStars() { + // draw stars + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, Flares::blob); + for (unsigned int i = 0; i < STARBURST_COUNT; ++i) { + _stars[i].offsetPos(_velocity[i] * Common::elapsedTime); + float distance = (_stars[i].getPos() - Hack::camera).length(); + if (distance > Hack::fogDepth) _active[i] = false; + if (_active[i]) _stars[i].draw(); + } +} + +void StarBurst::restart(const Vector& XYZ) { + // don't restart if any star is still active + for (unsigned int i = 0; i < STARBURST_COUNT; ++i) + if (_active[i]) + return; + // or if flare hasn't faded out completely + if (_size < 3.0f) + return; + + RGBColor RGB( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + Common::randomFloat(1.0f) + ); + switch (Common::randomInt(3)) { + case 0: RGB.r() = 1.0f; break; + case 1: RGB.g() = 1.0f; break; + case 2: RGB.b() = 1.0f; break; + } + + for (unsigned int i = 0; i < STARBURST_COUNT; ++i) { + _active[i] = true; + _stars[i].setPos(XYZ); + _stars[i].setColor(RGB); + } + + _size = 0.0f; + _pos = XYZ; +} + +void StarBurst::update() { + static float starBurstTime = Common::randomFloat(180.0f) + 180.0f; // burst after 3-6 minutes + starBurstTime -= Common::elapsedTime; + if (starBurstTime <= 0.0f) { + Vector pos( + Hack::camera.x() + (Hack::dir.x() * Hack::fogDepth * 0.5f) + + Common::randomFloat(Hack::fogDepth * 0.5f) - Hack::fogDepth * 0.25f, + Common::randomFloat(2.0f) - 1.0f, + Hack::camera.z() + (Hack::dir.z() * Hack::fogDepth * 0.5f) + + Common::randomFloat(Hack::fogDepth * 0.5f) - Hack::fogDepth * 0.25f + ); + StarBurst::restart(pos); // it won't actually restart unless it's ready to + starBurstTime = Common::randomFloat(540.0f) + 60.0f; // burst again within 1-10 minutes + } +} + +void StarBurst::draw() { + drawStars(); + + _size += Common::elapsedTime * 0.5f; + if (_size >= 3.0f) + return; + + // draw flare + float brightness = 1.0f - (_size / 3.0f); + if (brightness > 0.0f) + Flares::draw(_pos, RGBColor(1.0f, 1.0f, 1.0f), brightness); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(_size, _size, _size); + + // draw sphere + glPushAttrib(GL_ENABLE_BIT); + Nebula::use(); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glEnable(GL_BLEND); + glColor4f(brightness, brightness, brightness, (Hack::shaders ? Hack::lerp : 1.0f)); + glCallList(_list); + glPopAttrib(); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/starburst.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/starburst.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/starburst.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/starburst.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,38 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _STARBURST_H +#define _STARBURST_H + +#include + +#include + +namespace StarBurst { + void init(); + + void restart(const Vector&); + void update(); + void draw(); +}; + +#endif // _STARBURST_H diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/tunnel.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/tunnel.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/tunnel.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/tunnel.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,174 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +#define TUNNEL_RESOLUTION 20 + +namespace Tunnel { + unsigned int _numSections; + unsigned int _section; + + float _radius; + float _widthOffset; + float _texSpin; + + stdx::dim3 _v; + stdx::dim3 _t; + stdx::dim3 _c; + + float _loH, _loS, _loL; + float _hiH, _hiS, _hiL; + + void make(); +}; + +void Tunnel::init() { + CausticTextures::init(); + + _radius = 0.1f; + _widthOffset = 0.0f; + _texSpin = 0.0f; + + _numSections = Spline::points - 5; + _section = 0; + + _v.resize(_numSections); + _t.resize(_numSections); + _c.resize(_numSections); + + _loH = _loS = _hiH = _hiS = 0.0f; + _loL = _hiL = M_PI; +} + +void Tunnel::make() { + _widthOffset += Common::elapsedTime * 1.5f; + while (_widthOffset >= M_PI * 2.0f) + _widthOffset -= M_PI * 2.0f; + _texSpin += Common::elapsedTime * 0.1f; + while (_texSpin >= M_PI * 2.0f) + _texSpin -= M_PI * 2.0f; + + _loH += Common::elapsedTime * 0.04f; + _hiH += Common::elapsedTime * 0.15f; + _loS += Common::elapsedTime * 0.04f; + _hiS += Common::elapsedTime; + _loL += Common::elapsedTime * 0.04f; + _hiL += Common::elapsedTime * 0.5f; + + while (_loH > M_PI * 2.0f) _loH -= M_PI * 2.0f; + while (_hiH > M_PI * 2.0f) _hiH -= M_PI * 2.0f; + while (_loS > M_PI * 2.0f) _loS -= M_PI * 2.0f; + while (_hiS > M_PI * 2.0f) _hiS -= M_PI * 2.0f; + while (_loL > M_PI * 2.0f) _loL -= M_PI * 2.0f; + while (_hiL > M_PI * 2.0f) _hiL -= M_PI * 2.0f; + + unsigned int n = _numSections; + for (unsigned int k = 0; k < n; ++k) { + // create new vertex data for this section + for (unsigned int i = 0; i <= TUNNEL_RESOLUTION; ++i) { + float where = float(i) / float(TUNNEL_RESOLUTION); + + Vector pos(Spline::at(k + 2, where)); + Vector dir(Spline::direction(k + 2, where)); + RotationMatrix rot(RotationMatrix::lookAt(Vector(), dir, Vector(0.0f, 1.0f, 0.0f))); + + for (unsigned int j = 0; j <= TUNNEL_RESOLUTION; ++j) { + float angle = float(j) * M_PI * 2.0f / float(TUNNEL_RESOLUTION); + Vector vertex(rot.transform(Vector( + (_radius + _radius * 0.5f * std::cos(2.0f * pos.x() + _widthOffset)) * std::cos(angle), + (_radius + _radius * 0.5f * std::cos(pos.z() + _widthOffset)) * std::sin(angle), + 0.0f + ))); + + // set vertex coordinates + _v(k, i, j) = pos + vertex; + + // set texture coordinates + _t(k, i, j).x() = 4.0f * float(i) / float(TUNNEL_RESOLUTION); + _t(k, i, j).y() = float(j) / float(TUNNEL_RESOLUTION) + std::cos(_texSpin); + + // set colors + HSLColor HSL( + 2.0f * std::cos(0.1f * _v(k, i, j).x() + _loH) - 1.0f, + 0.25f * (std::cos(0.013f * _v(k, i, j).y() - _loS) + + std::cos(_v(k, i, j).z() + _hiS) + 2.0f), + 2.0f * std::cos(0.01f * _v(k, i, j).z() + _loL) + + std::cos(0.4f * _v(k, i, j).x() - _hiL) + + 0.3f * std::cos(4.0f * (_v(k, i, j).x() + _v(k, i, j).y() + _v(k, i, j).z())) + ); + HSL.clamp(); + if (HSL.s() > 0.7f) HSL.s() = 0.7f; + _c(k, i, j) = RGBColor(HSL); + } + } + } +} + +void Tunnel::draw() { + Tunnel::make(); + + glPushAttrib(GL_ENABLE_BIT); + glEnable(GL_TEXTURE_2D); + CausticTextures::use(); + + unsigned int n = _numSections; + if (Hack::shaders) { + for (unsigned int k = 0; k < n; ++k) { + for (unsigned int i = 0; i < TUNNEL_RESOLUTION; ++i) { + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int j = 0; j <= TUNNEL_RESOLUTION; ++j) { + glColor4f(_c(k, i + 1, j).r(), _c(k, i + 1, j).g(), _c(k, i + 1, j).b(), Hack::lerp); + glTexCoord2fv(_t(k, i + 1, j).get()); + glVertex3fv(_v(k, i + 1, j).get()); + glColor4f(_c(k, i, j).r(), _c(k, i, j).g(), _c(k, i, j).b(), Hack::lerp); + glTexCoord2fv(_t(k, i, j).get()); + glVertex3fv(_v(k, i, j).get()); + } + glEnd(); + } + } + } else { + for (unsigned int k = 0; k < n; ++k) { + for (unsigned int i = 0; i < TUNNEL_RESOLUTION; ++i) { + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int j = 0; j <= TUNNEL_RESOLUTION; ++j) { + glColor3fv(_c(k, i + 1, j).get()); + glTexCoord2fv(_t(k, i + 1, j).get()); + glVertex3fv(_v(k, i + 1, j).get()); + glColor3fv(_c(k, i, j).get()); + glTexCoord2fv(_t(k, i, j).get()); + glVertex3fv(_v(k, i, j).get()); + } + glEnd(); + } + } + } + + glPopAttrib(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/tunnel.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/tunnel.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/tunnel.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/hyperspace/tunnel.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,34 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2005 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _TUNNEL_HH +#define _TUNNEL_HH + +#include + +namespace Tunnel { + void init(); + + void draw(); +}; + +#endif // _TUNNEL_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/implicit.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/implicit.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/implicit.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/implicit.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,486 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include + +unsigned int Implicit::_width, Implicit::_height, Implicit::_length; +unsigned int Implicit::_width1, Implicit::_height1, Implicit::_length1; +Vector Implicit::_lbf; +float Implicit::_cw; + +unsigned int Implicit::_cubeTable[256][17]; +bool Implicit::_crawlTable[256][6]; + +#define WHL(X, Y, Z) (((X) * _height1 + (Y)) * _length1 + (Z)) + +void Implicit::init( + unsigned int width, unsigned int height, unsigned int length, float cw +) { + _width = width; + _height = height; + _length = length; + _width1 = width + 1; + _height1 = height + 1; + _length1 = length + 1; + _lbf = Vector(width, height, length) * cw * -0.5; + _cw = cw; + + static unsigned int ec[12][2] = { + { 0, 1 }, { 0, 2 }, { 1, 3 }, { 2, 3 }, { 0, 4 }, { 1, 5 }, + { 2, 6 }, { 3, 7 }, { 4, 5 }, { 4, 6 }, { 5, 7 }, { 6, 7 } + }; + static unsigned int next[8][12] = { + { + 1, 4, UINT_MAX, UINT_MAX, + 0, UINT_MAX, UINT_MAX, UINT_MAX, + UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX + }, + { + 5, UINT_MAX, 0, UINT_MAX, + UINT_MAX, 2, UINT_MAX, UINT_MAX, + UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX + }, + { + UINT_MAX, 3, UINT_MAX, 6, + UINT_MAX, UINT_MAX, 1, UINT_MAX, + UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX + }, + { + UINT_MAX, UINT_MAX, 7, 2, + UINT_MAX, UINT_MAX, UINT_MAX, 3, + UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX + }, + { + UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX, + 9, UINT_MAX, UINT_MAX, UINT_MAX, + 4, 8, UINT_MAX, UINT_MAX + }, + { + UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX, + UINT_MAX, 8, UINT_MAX, UINT_MAX, + 10, UINT_MAX, 5, UINT_MAX + }, + { + UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX, + UINT_MAX, UINT_MAX, 11, UINT_MAX, + UINT_MAX, 6, UINT_MAX, 9 + }, + { + UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX, + UINT_MAX, UINT_MAX, UINT_MAX, 10, + UINT_MAX, UINT_MAX, 11, 7 + } + }; + + for (unsigned int i = 0; i < 256; ++i) { + // impCubeTables::makeTriStripPatterns + bool vertices[8]; // true if on low side of gradient (outside of surface) + for (unsigned int j = 0; j < 8; ++j) + vertices[j] = i & (1 << j); + + bool edges[12]; + bool edgesDone[12]; + for (unsigned int j = 0; j < 12; ++j) { + edges[j] = vertices[ec[j][0]] ^ vertices[ec[j][1]]; + edgesDone[j] = false; + } + + unsigned int totalCount = 0; + + // Construct lists of edges that form triangle strips + // try starting from each edge (no need to try last 2 edges) + for (unsigned int j = 0; j < 10; ++j) { + unsigned int edgeList[7]; + unsigned int edgeCount = 0; + for ( + unsigned int currentEdge = j; + edges[currentEdge] && !edgesDone[currentEdge]; + ) { + edgeList[edgeCount++] = currentEdge; + edgesDone[currentEdge] = true; + unsigned int currentVertex = vertices[ec[currentEdge][0]] ? + ec[currentEdge][0] : ec[currentEdge][1]; + currentEdge = next[currentVertex][currentEdge]; + while (!edges[currentEdge]) { + currentVertex = (currentVertex != ec[currentEdge][0]) ? + ec[currentEdge][0] : ec[currentEdge][1]; + currentEdge = next[currentVertex][currentEdge]; + } + } + if (edgeCount) { + _cubeTable[i][totalCount++] = edgeCount; + switch (edgeCount) { + case 3: + _cubeTable[i][totalCount++] = edgeList[0]; + _cubeTable[i][totalCount++] = edgeList[1]; + _cubeTable[i][totalCount++] = edgeList[2]; + break; + case 4: + _cubeTable[i][totalCount++] = edgeList[0]; + _cubeTable[i][totalCount++] = edgeList[1]; + _cubeTable[i][totalCount++] = edgeList[3]; + _cubeTable[i][totalCount++] = edgeList[2]; + break; + case 5: + _cubeTable[i][totalCount++] = edgeList[0]; + _cubeTable[i][totalCount++] = edgeList[1]; + _cubeTable[i][totalCount++] = edgeList[4]; + _cubeTable[i][totalCount++] = edgeList[2]; + _cubeTable[i][totalCount++] = edgeList[3]; + break; + case 6: + _cubeTable[i][totalCount++] = edgeList[0]; + _cubeTable[i][totalCount++] = edgeList[1]; + _cubeTable[i][totalCount++] = edgeList[5]; + _cubeTable[i][totalCount++] = edgeList[2]; + _cubeTable[i][totalCount++] = edgeList[4]; + _cubeTable[i][totalCount++] = edgeList[3]; + break; + case 7: + _cubeTable[i][totalCount++] = edgeList[0]; + _cubeTable[i][totalCount++] = edgeList[1]; + _cubeTable[i][totalCount++] = edgeList[6]; + _cubeTable[i][totalCount++] = edgeList[2]; + _cubeTable[i][totalCount++] = edgeList[5]; + _cubeTable[i][totalCount++] = edgeList[3]; + _cubeTable[i][totalCount++] = edgeList[4]; + break; + } + _cubeTable[i][totalCount] = 0; + } + } + + // impCubeTables::makeCrawlDirections + _crawlTable[i][0] = edges[0] || edges[1] || edges[2] || edges[3]; + _crawlTable[i][1] = edges[8] || edges[9] || edges[10] || edges[11]; + _crawlTable[i][2] = edges[0] || edges[4] || edges[5] || edges[8]; + _crawlTable[i][3] = edges[3] || edges[6] || edges[7] || edges[11]; + _crawlTable[i][4] = edges[1] || edges[4] || edges[6] || edges[9]; + _crawlTable[i][5] = edges[2] || edges[5] || edges[7] || edges[10]; + } +} + +Implicit::Implicit(ImplicitField field) : _serial(0), _field(field) { + stdx::construct_n(_info, _width1 * _height1 * _length1); + for (unsigned int i = 0; i < _width1; ++i) { + for (unsigned int j = 0; j < _height1; ++j) { + for (unsigned int k = 0; k < _length1; ++k) { + unsigned int xyz = WHL(i, j, k); + _info[xyz].cube.serial = 0; + _info[xyz].corner.serial = 0; + _info[xyz].corner.XYZ = _lbf + Vector(i, j, k) * _cw; + _info[xyz].edge[X_AXIS].serial = 0; + _info[xyz].edge[Y_AXIS].serial = 0; + _info[xyz].edge[Z_AXIS].serial = 0; + } + } + } +} + +void Implicit::update(float threshold, const CrawlPointVector& crawlPoints) { + _threshold = threshold; + + ++_serial; + + _vertices.reset(); + _indices.reset(); + _lengths.reset(); + + // crawl from every crawl point to create the surface + CrawlPointVector::const_iterator e = crawlPoints.end(); + for ( + CrawlPointVector::const_iterator it = crawlPoints.begin(); + it != e; + ++it + ) { + // find cube corresponding to crawl point + Vector cube((*it - _lbf) / _cw); + unsigned int x = Common::clamp((unsigned int)cube.x(), 0u, _width - 1); + unsigned int y = Common::clamp((unsigned int)cube.y(), 0u, _height - 1); + unsigned int z = Common::clamp((unsigned int)cube.z(), 0u, _length - 1); + + while (true) { + unsigned int xyz = WHL(x, y, z); + + if (_info[xyz].cube.serial == _serial) + break; // escape if a finished cube + + // find mask for this cube + unsigned char mask = calculateCube(xyz); + + if (mask == 255) + break; // escape if outside surface + + if (mask == 0) { + // this cube is inside volume + _info[xyz].cube.serial = _serial; + if (--x < 0) + break; + } else { + crawl(x, y, z); + break; + } + } + } +} + +void Implicit::update(float threshold) { + _threshold = threshold; + + ++_serial; + + _vertices.reset(); + _indices.reset(); + _lengths.reset(); + + // find gradient value at every corner + unsigned int xyz = 0; + for (unsigned int i = 0; i < _width; ++i) { + for (unsigned int j = 0; j < _height; ++j) { + for (unsigned int k = 0; k < _length; ++k) { + calculateCube(xyz); + polygonize(xyz); + ++xyz; + } + ++xyz; + } + xyz += _length1; + } +} + +#define LBF 0x01 +#define LBN 0x02 +#define LTF 0x04 +#define LTN 0x08 +#define RBF 0x10 +#define RBN 0x20 +#define RTF 0x40 +#define RTN 0x80 + +unsigned char Implicit::calculateCube(unsigned int xyz) { + unsigned char mask = 0; + if (_info[xyz + WHL(0, 0, 0)].corner.serial != _serial) { + _info[xyz + WHL(0, 0, 0)].corner.value = _field(_info[xyz + WHL(0, 0, 0)].corner.XYZ); + _info[xyz + WHL(0, 0, 0)].corner.serial = _serial; + } + if (_info[xyz + WHL(0, 0, 0)].corner.value < _threshold) + mask |= LBF; + if (_info[xyz + WHL(0, 0, 1)].corner.serial != _serial) { + _info[xyz + WHL(0, 0, 1)].corner.value = _field(_info[xyz + WHL(0, 0, 1)].corner.XYZ); + _info[xyz + WHL(0, 0, 1)].corner.serial = _serial; + } + if (_info[xyz + WHL(0, 0, 1)].corner.value < _threshold) + mask |= LBN; + if (_info[xyz + WHL(0, 1, 0)].corner.serial != _serial) { + _info[xyz + WHL(0, 1, 0)].corner.value = _field(_info[xyz + WHL(0, 1, 0)].corner.XYZ); + _info[xyz + WHL(0, 1, 0)].corner.serial = _serial; + } + if (_info[xyz + WHL(0, 1, 0)].corner.value < _threshold) + mask |= LTF; + if (_info[xyz + WHL(0, 1, 1)].corner.serial != _serial) { + _info[xyz + WHL(0, 1, 1)].corner.value = _field(_info[xyz + WHL(0, 1, 1)].corner.XYZ); + _info[xyz + WHL(0, 1, 1)].corner.serial = _serial; + } + if (_info[xyz + WHL(0, 1, 1)].corner.value < _threshold) + mask |= LTN; + if (_info[xyz + WHL(1, 0, 0)].corner.serial != _serial) { + _info[xyz + WHL(1, 0, 0)].corner.value = _field(_info[xyz + WHL(1, 0, 0)].corner.XYZ); + _info[xyz + WHL(1, 0, 0)].corner.serial = _serial; + } + if (_info[xyz + WHL(1, 0, 0)].corner.value < _threshold) + mask |= RBF; + if (_info[xyz + WHL(1, 0, 1)].corner.serial != _serial) { + _info[xyz + WHL(1, 0, 1)].corner.value = _field(_info[xyz + WHL(1, 0, 1)].corner.XYZ); + _info[xyz + WHL(1, 0, 1)].corner.serial = _serial; + } + if (_info[xyz + WHL(1, 0, 1)].corner.value < _threshold) + mask |= RBN; + if (_info[xyz + WHL(1, 1, 0)].corner.serial != _serial) { + _info[xyz + WHL(1, 1, 0)].corner.value = _field(_info[xyz + WHL(1, 1, 0)].corner.XYZ); + _info[xyz + WHL(1, 1, 0)].corner.serial = _serial; + } + if (_info[xyz + WHL(1, 1, 0)].corner.value < _threshold) + mask |= RTF; + if (_info[xyz + WHL(1, 1, 1)].corner.serial != _serial) { + _info[xyz + WHL(1, 1, 1)].corner.value = _field(_info[xyz + WHL(1, 1, 1)].corner.XYZ); + _info[xyz + WHL(1, 1, 1)].corner.serial = _serial; + } + if (_info[xyz + WHL(1, 1, 1)].corner.value < _threshold) + mask |= RTN; + + _info[xyz].cube.mask = mask; + return mask; +} + +void Implicit::crawl(unsigned int x, unsigned int y, unsigned int z) { + unsigned int xyz = WHL(x, y, z); + if (_info[xyz].cube.serial == _serial) + return; + + unsigned char mask = calculateCube(xyz); + + if (mask == 0 || mask == 255) + return; + + // polygonize this cube if it intersects surface + polygonize(xyz); + + // mark this cube as completed + _info[xyz].cube.serial = _serial; + + // polygonize adjacent cubes + if (_crawlTable[mask][0] && x > 0) + crawl(x - 1, y, z); + if (_crawlTable[mask][1] && x < _width - 1) + crawl(x + 1, y, z); + if (_crawlTable[mask][2] && y > 0) + crawl(x, y - 1, z); + if (_crawlTable[mask][3] && y < _height - 1) + crawl(x, y + 1, z); + if (_crawlTable[mask][4] && z > 0) + crawl(x, y, z - 1); + if (_crawlTable[mask][5] && z < _length - 1) + crawl(x, y, z + 1); +} + +// polygonize an individual cube +void Implicit::polygonize(unsigned int xyz) { + unsigned char mask = _info[xyz].cube.mask; + + unsigned int counter = 0; + unsigned int numEdges = _cubeTable[mask][counter]; + + while (numEdges != 0) { + _lengths.push_back(numEdges); + for (unsigned int i = 0; i < numEdges; ++i) { + // generate vertex position and normal data + switch (_cubeTable[mask][i + counter + 1]) { + case 0: + addVertex(Z_AXIS, xyz + WHL(0, 0, 0)); + break; + case 1: + addVertex(Y_AXIS, xyz + WHL(0, 0, 0)); + break; + case 2: + addVertex(Y_AXIS, xyz + WHL(0, 0, 1)); + break; + case 3: + addVertex(Z_AXIS, xyz + WHL(0, 1, 0)); + break; + case 4: + addVertex(X_AXIS, xyz + WHL(0, 0, 0)); + break; + case 5: + addVertex(X_AXIS, xyz + WHL(0, 0, 1)); + break; + case 6: + addVertex(X_AXIS, xyz + WHL(0, 1, 0)); + break; + case 7: + addVertex(X_AXIS, xyz + WHL(0, 1, 1)); + break; + case 8: + addVertex(Z_AXIS, xyz + WHL(1, 0, 0)); + break; + case 9: + addVertex(Y_AXIS, xyz + WHL(1, 0, 0)); + break; + case 10: + addVertex(Y_AXIS, xyz + WHL(1, 0, 1)); + break; + case 11: + addVertex(Z_AXIS, xyz + WHL(1, 1, 0)); + break; + } + } + counter += numEdges + 1; + numEdges = _cubeTable[mask][counter]; + } +} + +void Implicit::addVertex(Axis axis, unsigned int xyz) { + const Info::Corner& corner = _info[xyz].corner; + Info::Edge& edge = _info[xyz].edge[axis]; + if (edge.serial == _serial) { + _indices.push_back(edge.index); + return; + } + + // find position of vertex along this edge + edge.serial = _serial; + _indices.push_back(edge.index = _vertices.size()); + struct VertexData data; + switch (axis) { + case X_AXIS: + data.x = corner.XYZ.x() + + _cw * ((_threshold - corner.value) + / (_info[xyz + WHL(1, 0, 0)].corner.value - corner.value)), + data.y = corner.XYZ.y(); + data.z = corner.XYZ.z(); + break; + case 1: // y-axis + data.x = corner.XYZ.x(); + data.y = corner.XYZ.y() + + _cw * ((_threshold - corner.value) + / (_info[xyz + WHL(0, 1, 0)].corner.value - corner.value)); + data.z = corner.XYZ.z(); + break; + case 2: // z-axis + data.x = corner.XYZ.x(); + data.y = corner.XYZ.y(); + data.z = corner.XYZ.z() + + _cw * ((_threshold - corner.value) + / (_info[xyz + WHL(0, 0, 1)].corner.value - corner.value)); + break; + default: + abort(); + } + + // find normal vector at vertex along this edge + // first find normal vector origin value + Vector pos(data.x, data.y, data.z); + float no = _field(pos); + // then find values at slight displacements and subtract + data.nx = _field(pos - Vector(0.01f, 0.0f, 0.0f)) - no; + data.ny = _field(pos - Vector(0.0f, 0.01f, 0.0f)) - no; + data.nz = _field(pos - Vector(0.0f, 0.0f, 0.01f)) - no; + float normalizer = 1.0f / std::sqrt(data.nx * data.nx + data.ny * data.ny + data.nz * data.nz); + data.nx *= normalizer; + data.ny *= normalizer; + data.nz *= normalizer; + + // Add this vertex to surface + _vertices.push_back(data); +} + +void Implicit::draw(GLenum mode) const { + glInterleavedArrays(GL_N3F_V3F, 0, _vertices.begin()); + LazyVector::const_iterator index = _indices.begin(); + LazyVector::const_iterator e = _lengths.end(); + for (LazyVector::const_iterator it = _lengths.begin(); it < e; ++it) { + glDrawElements(mode, *it, GL_UNSIGNED_INT, index); + index += *it; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/implicit.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/implicit.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/implicit.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/implicit.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,128 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _IMPLICIT_HH +#define _IMPLICIT_HH + +#include + +#include +#include +#include + +typedef float (*ImplicitField)(const Vector&); +typedef std::list CrawlPointVector; + +template class LazyVector { +private: + T* _data; + unsigned int _used, _capacity; +public: + LazyVector() : _data(new T[1000]), _used(0), _capacity(1000) {} + LazyVector(const LazyVector& lv) : _data(new T[lv._capacity]), + _used(lv._used), _capacity(lv._capacity) { + std::copy(lv._data, lv._data + _used, _data); + } + ~LazyVector() { delete[] _data; } + + void reset() { _used = 0; } + unsigned int size() const { return _used; } + + typedef const T* const_iterator; + const T* begin() const { return _data; } + const T* end() const { return _data + _used; } + + void push_back(const T& v) { + if (_used == _capacity) { + _capacity += 1000; + T* temp = new T[_capacity]; + std::uninitialized_copy(_data, _data + _used, temp); + delete[] _data; + _data = temp; + } + _data[_used++] = v; + } +}; + +enum Axis { + X_AXIS, + Y_AXIS, + Z_AXIS +}; + +class Implicit : public ResourceManager::Resource { +private: + static unsigned int _width, _height, _length; + static unsigned int _width1, _height1, _length1; + static Vector _lbf; + static float _cw; + + static unsigned int _cubeTable[256][17]; + static bool _crawlTable[256][6]; +public: + static void init(unsigned int, unsigned int, unsigned int, float); + void operator()() const {} +private: + struct Info { + struct Cube { + unsigned int serial; + unsigned char mask; + } cube; + struct Corner { + unsigned int serial; + float value; + Vector XYZ; + } corner; + struct Edge { + unsigned int serial; + unsigned int index; + } edge[3]; + }; + std::vector _info; + + struct VertexData { + float nx, ny, nz; + float x, y, z; + }; + + unsigned int _serial; + + ImplicitField _field; + float _threshold; + + LazyVector _vertices; + LazyVector _indices; + LazyVector _lengths; + + inline unsigned char calculateCube(unsigned int); + inline void crawl(unsigned int, unsigned int, unsigned int); + inline void polygonize(unsigned int); + inline void addVertex(Axis, unsigned int); +public: + Implicit(ImplicitField); + + void update(float, const CrawlPointVector&); + void update(float); + void draw(GLenum = GL_TRIANGLE_STRIP) const; +}; + +#endif // _IMPLICIT_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/brass.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/brass.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/camera.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/camera.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/camera.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/camera.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,60 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _CAMERA_HH +#define _CAMERA_HH + +#include + +#include + +namespace Camera { + float _farPlane; + Vector _cullVec[4]; // vectors perpendicular to viewing volume planes + + void set(const float* m, float farPlane) { + _farPlane = farPlane; + + float temp; + + // bottom and planes' vectors + temp = std::atan(1.0f / m[5]); + _cullVec[0].set(0.0f, std::cos(temp), -std::sin(temp)); + _cullVec[1].set(0.0f, -std::cos(temp), -std::sin(temp)); + + // left and right planes' vectors + temp = std::atan(1.0f / m[0]); + _cullVec[2].set(std::cos(temp), 0.0f, -std::sin(temp)); + _cullVec[3].set(-std::cos(temp), 0.0f,-std::sin(temp)); + } + + bool isVisible(const Vector& pos, float radius) { + return + pos.z() >= -(_farPlane + radius) && + Vector::dot(pos, _cullVec[0]) >= -radius && + Vector::dot(pos, _cullVec[1]) >= -radius && + Vector::dot(pos, _cullVec[2]) >= -radius && + Vector::dot(pos, _cullVec[3]) >= -radius; + } +}; + +#endif // _CAMERA_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/chrome.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/chrome.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/circuits.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/circuits.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/crystal.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/crystal.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/doughnuts.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/doughnuts.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/ghostly.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/ghostly.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/industrial1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/industrial1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/industrial2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/industrial2.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/lattice.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/lattice.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/lattice.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/lattice.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,868 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include + +// Important: See XXX below +#define LATSIZE 10u + +namespace Hack { + unsigned int longitude = 16; + unsigned int latitude = 8; + float thickness = 50.0f; + unsigned int density = 50; + unsigned int depth = 4; + float fov = 90.0; + unsigned int pathRand = 7; + float speed = 10.0f; + LinkType linkType = UNKNOWN_LINKS; + std::vector textures; + bool smooth = false; + bool fog = true; + bool widescreen = false; +}; + +namespace Hack { + enum Arguments { + ARG_LATITUDE = 1, + ARG_LONGITUDE, + ARG_THICKNESS, + ARG_DENSITY, + ARG_DEPTH, + ARG_FOV, + ARG_RANDOMNESS, + ARG_SPEED, + ARG_SHININESS, + ARG_PLAIN, + ARG_TEXTURE, + ARG_SMOOTH = 0x100, ARG_NO_SMOOTH, + ARG_FOG = 0x200, ARG_NO_FOG, + ARG_WIDESCREEN = 0x300, ARG_NO_WIDESCREEN, + ARG_INDUSTRIAL_TEXTURE = 0x400, ARG_CRYSTAL_TEXTURE, + ARG_CHROME_TEXTURE, ARG_BRASS_TEXTURE, + ARG_SHINY_TEXTURE, ARG_GHOSTLY_TEXTURE, + ARG_CIRCUITS_TEXTURE, ARG_DOUGHNUTS_TEXTURE, + ARG_RANDOM_TEXTURE, + ARG_SOLID_LINKS = 0x500, ARG_TRANSLUCENT_LINKS, ARG_HOLLOW_LINKS, + ARG_SPHEREMAP = 0x600, ARG_NO_SPHEREMAP, + ARG_COLORED = 0x700, ARG_NO_COLORED, + ARG_MODULATE = 0x800, ARG_NO_MODULATE + }; + + GLuint _lattice[LATSIZE][LATSIZE][LATSIZE]; + + // Border points and direction vectors where camera can cross + // from cube to cube + const float _bPnt[][6] = { + { 0.5f , -0.25f, 0.25f, 1.0f , 0.0f , 0.0f }, + { 0.5f , 0.25f, -0.25f, 1.0f , 0.0f , 0.0f }, + { -0.25f, 0.5f , 0.25f, 0.0f , 1.0f , 0.0f }, + { 0.25f, 0.5f , -0.25f, 0.0f , 1.0f , 0.0f }, + { -0.25f, -0.25f, 0.5f , 0.0f , 0.0f , 1.0f }, + { 0.25f, 0.25f, 0.5f , 0.0f , 0.0f , 1.0f }, + { 0.5f , -0.5f , -0.5f , 1.0f , -1.0f , -1.0f }, + { 0.5f , 0.5f , -0.5f , 1.0f , 1.0f , -1.0f }, + { 0.5f , -0.5f , 0.5f , 1.0f , -1.0f , 1.0f }, + { 0.5f , 0.5f , 0.5f , 1.0f , 1.0f , 1.0f } + }; + float _path[7][6]; + const unsigned int _transitions[][6] = { + { 1, 2, 12, 4, 14, 8 }, + { 0, 3, 15, 7, 7, 7 }, + { 3, 4, 14, 0, 7, 16 }, + { 2, 1, 15, 7, 7, 7 }, + { 5, 10, 12, 17, 17, 17 }, + { 4, 3, 13, 11, 9, 17 }, + { 12, 4, 10, 17, 17, 17 }, + { 2, 0, 14, 8, 16, 19 }, + { 1, 3, 15, 7, 7, 7 }, + { 4, 10, 12, 17, 17, 17 }, + { 11, 4, 12, 17, 17, 17 }, + { 10, 5, 15, 13, 17, 18 }, + { 13, 10, 4, 17, 17, 17 }, + { 12, 1, 11, 5, 6, 17 }, + { 15, 2, 12, 0, 7, 19 }, + { 14, 3, 1, 7, 7, 7 }, + { 3, 1, 15, 7, 7, 7 }, + { 5, 11, 13, 6, 9, 18 }, + { 10, 4, 12, 17, 17, 17 }, + { 15, 1, 3, 7, 7, 7 } + }; + int _globalXYZ[3]; + unsigned int _lastBorder; + unsigned int _segments; + + unsigned int latticeMod(int); + float interpolate(float, float, float, float, float); + void reconfigure(); + + void setLinkType(LinkType); + error_t parse(int, char*, struct argp_state*); +}; + +// Modulus function for picking the correct element of lattice array +unsigned int Hack::latticeMod(int x) { + if (x < 0) + return (LATSIZE - (-x % LATSIZE)) % LATSIZE; + else + return x % LATSIZE; +} + +// start point, start slope, end point, end slope, position (0.0 - 1.0) +// returns point somewhere along a smooth curve between the start point +// and end point +float Hack::interpolate(float a, float b, float c, float d, float where) { + float q = 2.0f * (a - c) + b + d; + float r = 3.0f * (c - a) - 2.0f * b - d; + return (where * where * where * q) + (where * where * r) + (where * b) + a; +} + +void Hack::reconfigure() { + // End of old path = start of new path + for (unsigned int i = 0; i < 6; ++i) + _path[0][i] = _path[_segments][i]; + + // determine if direction of motion is positive or negative + // update global position + bool positive; + if (_lastBorder < 6) { + if ((_path[0][3] + _path[0][4] + _path[0][5]) > 0.0f) { + positive = true; + ++_globalXYZ[_lastBorder / 2]; + } else { + positive = false; + --_globalXYZ[_lastBorder / 2]; + } + } else { + if (_path[0][3] > 0.0f) { + positive = true; + ++_globalXYZ[0]; + } else { + positive = false; + --_globalXYZ[0]; + } + if (_path[0][4] > 0.0f) + ++_globalXYZ[1]; + else + --_globalXYZ[1]; + if (_path[0][5] > 0.0f) + ++_globalXYZ[2]; + else + --_globalXYZ[2]; + } + + if (!Common::randomInt(11 - pathRand)) { // Change directions + if (!positive) + _lastBorder += 10; + unsigned int newBorder = _transitions[_lastBorder][Common::randomInt(6)]; + positive = false; + if (newBorder < 10) + positive = true; + else + newBorder -= 10; + for (unsigned int i = 0; i < 6; ++i) // set the new border point + _path[1][i] = _bPnt[newBorder][i]; + if (!positive) { // flip everything if direction is negative + if (newBorder < 6) + _path[1][newBorder / 2] *= -1.0f; + else + for (unsigned int i = 0; i < 3; ++i) + _path[1][i] *= -1.0f; + for (unsigned int i = 3; i < 6; ++i) + _path[1][i] *= -1.0f; + } + for (unsigned int i = 0; i < 3; ++i) // reposition the new border + _path[1][i] += _globalXYZ[i]; + _lastBorder = newBorder; + _segments = 1; + } else { // Just keep going straight + unsigned int newBorder = _lastBorder; + for (unsigned int i = 0; i < 6; ++i) + _path[1][i] = _bPnt[newBorder][i]; + unsigned int i = newBorder / 2; + if (!positive) { + if (newBorder < 6) + _path[1][i] *= -1.0f; + else { + _path[1][0] *= -1.0f; + _path[1][1] *= -1.0f; + _path[1][2] *= -1.0f; + } + _path[1][3] *= -1.0f; + _path[1][4] *= -1.0f; + _path[1][5] *= -1.0f; + } + for (unsigned int j = 0; j < 3; ++j) { + _path[1][j] += _globalXYZ[j]; + if ((newBorder < 6) && (j != 1)) + _path[1][j] += Common::randomFloat(0.15f) - 0.075f; + } + if (newBorder >= 6) + _path[1][0] += Common::randomFloat(0.1f) - 0.05f; + _segments = 1; + } +} + +void Hack::setLinkType(LinkType lt) { + if (linkType == lt) + return; + if (linkType != UNKNOWN_LINKS) { + static char* linkTypeOption[3] = { "--solid", "--translucent", "--hollow" }; + WARN("Overriding " << linkTypeOption[linkType] << " with " << + linkTypeOption[lt]); + } + linkType = lt; +} + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { + static float shininess = 50.0f; + static bool sphereMap = false; + static bool colored = true; + static bool modulate = true; + +retry: + switch (key) { + case ARG_LATITUDE: + if (Common::parseArg(arg, latitude, 2u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "latitudinal divisions must be between 2 and 100"); + return 0; + case ARG_LONGITUDE: + if (Common::parseArg(arg, longitude, 4u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "longitudinal divisions must be between 4 and 100"); + return 0; + case ARG_THICKNESS: + if (Common::parseArg(arg, thickness, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "torus thickness must be between 1 and 100"); + return 0; + case ARG_DENSITY: + if (Common::parseArg(arg, density, 1u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "lattice density must be between 1 and 100"); + return 0; + case ARG_DEPTH: + if (Common::parseArg(arg, depth, 1u, LATSIZE - 2)) + argp_failure(state, EXIT_FAILURE, 0, + "lattice depth must be between 1 and %d", LATSIZE - 2); + return 0; + case ARG_FOV: + if (Common::parseArg(arg, fov, 10.0f, 150.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "field of view must be between 10 and 150"); + return 0; + case ARG_RANDOMNESS: + if (Common::parseArg(arg, pathRand, 1u, 10u)) + argp_failure(state, EXIT_FAILURE, 0, + "path randomness must be between 1 and 10"); + return 0; + case ARG_SPEED: + speed = std::strtod(arg, NULL); + if (speed < 1.0f || speed > 100.0f) + argp_failure(state, EXIT_FAILURE, 0, + "camera speed must be between 1 and 100"); + return 0; + case ARG_SHININESS: + if (Common::parseArg(arg, shininess, 0.0f, 128.0f, -1.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "shininess must be -1 (to disable lighting), or between 0 and 128"); + return 0; + case ARG_PLAIN: + { + Texture texture = { "", shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + return 0; + case ARG_TEXTURE: + { + Texture texture = { arg, shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + return 0; + case ARG_SMOOTH: + smooth = true; + return 0; + case ARG_NO_SMOOTH: + smooth = false; + return 0; + case ARG_FOG: + fog = true; + return 0; + case ARG_NO_FOG: + fog = false; + return 0; + case ARG_WIDESCREEN: + widescreen = true; + return 0; + case ARG_NO_WIDESCREEN: + widescreen = false; + return 0; + case ARG_INDUSTRIAL_TEXTURE: + setLinkType(SOLID_LINKS); + shininess = 0.0f; + sphereMap = false; + colored = false; + modulate = true; + { + Texture texture = { "industrial1.png", + shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + { + Texture texture = { "industrial2.png", + shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + return 0; + case ARG_CRYSTAL_TEXTURE: + setLinkType(TRANSLUCENT_LINKS); + shininess = 10.0f; + sphereMap = true; + colored = false; + modulate = true; + { + Texture texture = { "crystal.png", + shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + return 0; + case ARG_CHROME_TEXTURE: + setLinkType(SOLID_LINKS); + shininess = -1.0f; + sphereMap = true; + colored = false; + modulate = true; + { + Texture texture = { "chrome.png", + shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + return 0; + case ARG_BRASS_TEXTURE: + setLinkType(SOLID_LINKS); + shininess = -1.0f; + sphereMap = true; + colored = false; + modulate = true; + { + Texture texture = { "brass.png", + shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + return 0; + case ARG_SHINY_TEXTURE: + setLinkType(SOLID_LINKS); + shininess = 50.0f; + sphereMap = true; + colored = true; + modulate = false; + { + Texture texture = { "shiny.png", + shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + return 0; + case ARG_GHOSTLY_TEXTURE: + setLinkType(TRANSLUCENT_LINKS); + shininess = -1.0f; + sphereMap = true; + colored = true; + modulate = true; + { + Texture texture = { "ghostly.png", + shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + return 0; + case ARG_CIRCUITS_TEXTURE: + setLinkType(HOLLOW_LINKS); + shininess = 50.0f; + sphereMap = false; + colored = true; + modulate = true; + { + Texture texture = { "circuits.png", + shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + return 0; + case ARG_DOUGHNUTS_TEXTURE: + setLinkType(SOLID_LINKS); + shininess = 50.0f; + sphereMap = false; + colored = true; + modulate = false; + { + Texture texture = { "doughnuts.png", + shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + return 0; + case ARG_RANDOM_TEXTURE: + key = Common::randomInt(8) + ARG_INDUSTRIAL_TEXTURE; + goto retry; + case ARG_SOLID_LINKS: + setLinkType(SOLID_LINKS); + return 0; + case ARG_TRANSLUCENT_LINKS: + setLinkType(TRANSLUCENT_LINKS); + return 0; + case ARG_HOLLOW_LINKS: + setLinkType(HOLLOW_LINKS); + return 0; + case ARG_SPHEREMAP: + sphereMap = true; + return 0; + case ARG_NO_SPHEREMAP: + sphereMap = false; + return 0; + case ARG_COLORED: + colored = true; + return 0; + case ARG_NO_COLORED: + colored = false; + return 0; + case ARG_MODULATE: + modulate = true; + return 0; + case ARG_NO_MODULATE: + modulate = false; + return 0; + case ARGP_KEY_FINI: + if (linkType == UNKNOWN_LINKS) + linkType = SOLID_LINKS; + if (textures.empty()) { + Texture texture = { "", shininess, sphereMap, colored, modulate }; + textures.push_back(texture); + } + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Lattice options:" }, + { "density", ARG_DENSITY, "NUM", 0, "Lattice density (1-100, default = 50)" }, + // XXX 8 = LATSIZE - 2 + { "depth", ARG_DEPTH, "NUM", 0, "Lattice depth (1-8, default = 4)" }, + { "fog", ARG_FOG, NULL, OPTION_HIDDEN, "Disable depth fogging" }, + { "no-fog", ARG_NO_FOG, NULL, OPTION_ALIAS }, + { NULL, 0, NULL, 0, "Torus options:" }, + { "latitude", ARG_LATITUDE, "NUM", 0, + "Latitudinal divisions on each torus (2-100, default = 8)" }, + { "longitude", ARG_LONGITUDE, "NUM", 0, + "Longitudinal divisions on each torus (4-100, default = 16)" }, + { "thickness", ARG_THICKNESS, "NUM", 0, + "Thickness of each torus (1-100, default = 50)" }, + { "smooth", ARG_SMOOTH, NULL, 0, "Enable smooth shading" }, + { "no-smooth", ARG_NO_SMOOTH, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { NULL, 0, NULL, 0, "Rendering options:" }, + { "solid", ARG_SOLID_LINKS, NULL, 0, + "Surface rendering mode (default = solid)" }, + { "translucent", ARG_TRANSLUCENT_LINKS, NULL, OPTION_ALIAS }, + { "hollow", ARG_HOLLOW_LINKS, NULL, OPTION_ALIAS }, + { "These options define the global rendering scheme for the surfaces of the" + " toruses. If more than one of these options are specified, the last" + " will take precedence.", 0, NULL, OPTION_DOC | OPTION_NO_USAGE }, + { NULL, 0, NULL, 0, "Surface options:" }, + { "shininess", ARG_SHININESS, "NUM", 0, + "Degree of specular reflection (0-128, -1 to disable lighting, default" + " = 50)" }, + { "spheremap", ARG_SPHEREMAP, NULL, 0, + "Enable environment mapping of surface texture" }, + { "no-spheremap", ARG_NO_SPHEREMAP, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "colored", ARG_COLORED, NULL, 0, + "Colorize (or whiten) the surfaces (default = colored)" }, + { "white", ARG_NO_COLORED, NULL, OPTION_ALIAS }, + { "no-colored", ARG_NO_COLORED, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "no-white", ARG_COLORED, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "modulate", ARG_MODULATE, NULL, 0, + "Modulate the surface color with the texture, or paste the texture over" + " the color as a decal (default = modulate)" }, + { "decal", ARG_NO_MODULATE, NULL, OPTION_ALIAS }, + { "no-modulate", ARG_NO_MODULATE, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "no-decal", ARG_MODULATE, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { NULL, 0, NULL, 0, "" }, + { "plain", ARG_PLAIN, NULL, 0, "Plain surface" }, + { "texture", ARG_TEXTURE, "FILE", 0, "PNG image surface" }, + { "Any of these options may be specified multiple times. Each --plain and" + " --texture option defines a group of toruses that are rendered in the" + " same manner. Any --shininess, --solid, --translucent, --hollow and" + " --spheremap options must precede the --plain or --texture they are" + " to affect.", 0, NULL, OPTION_DOC | OPTION_NO_USAGE }, + { NULL, 0, NULL, 0, "Predefined surfaces:" }, + { "random", ARG_RANDOM_TEXTURE, NULL, 0, + "Randomly choose a predefined surface" }, + { NULL, 0, NULL, 0, "" }, + { "industrial", ARG_INDUSTRIAL_TEXTURE, NULL, 0 }, + { "crystal", ARG_CRYSTAL_TEXTURE, NULL, 0 }, + { "chrome", ARG_CHROME_TEXTURE, NULL, 0 }, + { "brass", ARG_BRASS_TEXTURE, NULL, 0 }, + { "shiny", ARG_SHINY_TEXTURE, NULL, 0 }, + { "ghostly", ARG_GHOSTLY_TEXTURE, NULL, 0 }, + { "circuits", ARG_CIRCUITS_TEXTURE, NULL, 0 }, + { "donuts", ARG_DOUGHNUTS_TEXTURE, NULL, 0 }, + { "doughnuts", ARG_DOUGHNUTS_TEXTURE, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "Each of these selects one of the rendering options (--solid," + " --translucent, and --hollow) and defines one or more torus groups.", + 0, NULL, OPTION_DOC | OPTION_NO_USAGE }, + { NULL, 0, NULL, 0, "View options:" }, + { "fov", ARG_FOV, "NUM", 0, "Field of view (10-150, default = 90)" }, + { "randomness", ARG_RANDOMNESS, "NUM", 0, + "Path randomness (1-10, default = 7)" }, + { "speed", ARG_SPEED, "NUM", 0, "Camera speed (1-100, default = 10)" }, + { "widescreen", ARG_WIDESCREEN, NULL, 0, "Enable widescreen view" }, + { "no-widescreen", ARG_NO_WIDESCREEN, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + {} + }; + static struct argp parser = { + options, parse, NULL, + "Fly through an infinite lattice of interlocking rings." + }; + return &parser; +} + +std::string Hack::getShortName() { return "lattice"; } +std::string Hack::getName() { return "Lattice"; } + +void Hack::start() { + if (widescreen) + glViewport( + 0, Common::height / 2 - Common::width / 4, + Common::width, Common::width / 2 + ); + else + glViewport(0, 0, Common::width, Common::height); + + Resources::init(); + + glFrontFace(GL_CCW); + glEnable(GL_CULL_FACE); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + float mat[16] = { + std::cos(fov * 0.5f * D2R) / std::sin(fov * 0.5f * D2R), 0.0f, 0.0f, 0.0f, + 0.0f, 0.0, 0.0f, 0.0f, + 0.0f, 0.0f, -1.0f - 0.02f / float(depth), -1.0f, + 0.0f, 0.0f, -(0.02f + 0.0002f / float(depth)), 0.0f + }; + if (widescreen) + mat[5] = mat[0] * 2.0f; + else + mat[5] = mat[0] * Common::aspectRatio; + glLoadMatrixf(mat); + Camera::set(mat, float(depth)); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + if (fog) { + glEnable(GL_FOG); + float fog_color[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + glFogfv(GL_FOG_COLOR, fog_color); + glFogf(GL_FOG_MODE, GL_LINEAR); + glFogf(GL_FOG_START, float(depth) * 0.3f); + glFogf(GL_FOG_END, float(depth) - 0.1f); + } + + // Initialize lattice objects and their positions in the lattice array + for (unsigned int i = 0; i < LATSIZE; ++i) + for (unsigned int j = 0; j < LATSIZE; ++j) + for (unsigned int k = 0; k < LATSIZE; ++k) + _lattice[i][j][k] = Resources::lists + Common::randomInt(NUMOBJECTS); + + _globalXYZ[0] = 0; + _globalXYZ[1] = 0; + _globalXYZ[2] = 0; + + // Set up first path section + _path[0][0] = 0.0f; + _path[0][1] = 0.0f; + _path[0][2] = 0.0f; + _path[0][3] = 0.0f; + _path[0][4] = 0.0f; + _path[0][5] = 0.0f; + unsigned int j = Common::randomInt(12); + unsigned int k = j % 6; + for (unsigned int i = 0; i < 6; ++i) + _path[1][i] = _bPnt[k][i]; + if (j > 5) { // If we want to head in a negative direction + unsigned int i = k / 2; // then we need to flip along the appropriate axis + _path[1][i] *= -1.0f; + _path[1][i + 3] *= -1.0f; + } + _lastBorder = k; + _segments = 1; +} + +void Hack::tick() { + static float where = 0.0f; // Position on path + static unsigned int seg = 0; // Section of path + where += speed * 0.05f * Common::elapsedSecs; + if (where >= 1.0f) { + where -= 1.0f; + seg++; + } + if (seg >= _segments) { + seg = 0; + reconfigure(); + } + + static Vector oldXYZ(0.0f, 0.0f, 0.0f); + static UnitVector oldDir(Vector(0.0f, 0.0f, -1.0f)); + static Vector oldAngVel(0.0f, 0.0f, 0.0f); + + // Calculate position + Vector XYZ( + interpolate(_path[seg][0], _path[seg][3], + _path[seg + 1][0], _path[seg + 1][3], where), + interpolate(_path[seg][1], _path[seg][4], + _path[seg + 1][1], _path[seg + 1][4], where), + interpolate(_path[seg][2], _path[seg][5], + _path[seg + 1][2], _path[seg + 1][5], where) + ); + + static float maxSpin = 0.0025f * speed; + static float rotationInertia = 0.007f * speed; + + // Do rotation stuff + UnitVector dir(XYZ - oldXYZ); // Direction of motion + Vector angVel(Vector::cross(dir, oldDir)); // Desired axis of rotation + float temp = Vector::dot(oldDir, dir); + if (temp < -1.0f) temp = -1.0f; + if (temp > +1.0f) temp = +1.0f; + float angle = Common::clamp( + float(std::acos(temp)), // Desired turn angle + -maxSpin, maxSpin + ); + angVel *= angle; // Desired angular velocity + Vector tempVec(angVel - oldAngVel); // Change in angular velocity + // Don't let angular velocity change too much + float distance = tempVec.length(); + if (distance > rotationInertia * Common::elapsedSecs) { + tempVec *= (rotationInertia * Common::elapsedSecs) / distance; + angVel = oldAngVel + tempVec; + } + + static float flymodeChange = 20.0f; + static int flymode = 1; + + flymodeChange -= Common::elapsedSecs; + if (flymodeChange <= 1.0f) // prepare to transition + angVel *= flymodeChange; + if (flymodeChange <= 0.0f) { // transition from one fly mode to the other? + flymode = Common::randomInt(4); + flymodeChange = Common::randomFloat(float(150 - speed)) + 5.0f; + } + tempVec = angVel; // Recompute desired rotation + angle = tempVec.normalize(); + + static UnitQuat quat; + + if (flymode) // fly normal (straight) + quat.multiplyBy(UnitQuat(angle, tempVec)); + else // don't fly normal (go backwards and stuff) + quat.preMultiplyBy(UnitQuat(angle, tempVec)); + + // Roll + static float rollChange = Common::randomFloat(10.0f) + 2.0f; + static float rollAcc = 0.0f; + static float rollVel = 0.0f; + rollChange -= Common::elapsedSecs; + if (rollChange <= 0.0f) { + rollAcc = Common::randomFloat(0.02f * speed) - (0.01f * speed); + rollChange = Common::randomFloat(10.0f) + 2.0f; + } + rollVel += rollAcc * Common::elapsedSecs; + if (rollVel > (0.04f * speed) && rollAcc > 0.0f) + rollAcc = 0.0f; + if (rollVel < (-0.04f * speed) && rollAcc < 0.0f) + rollAcc = 0.0f; + quat.multiplyBy(UnitQuat(rollVel * Common::elapsedSecs, oldDir)); + + RotationMatrix rotMat(quat); + + // Save old stuff + oldXYZ = XYZ; + oldDir = Vector( + -rotMat.get()[2], + -rotMat.get()[6], + -rotMat.get()[10] + ); + oldAngVel = angVel; + + // Apply transformations + glLoadMatrixf(rotMat.get()); + glTranslatef(-XYZ.x(), -XYZ.y(), -XYZ.z()); + + // Render everything + static int drawDepth = depth + 2; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + for (int i = _globalXYZ[0] - drawDepth; + i <= _globalXYZ[0] + drawDepth; ++i) { + for (int j = _globalXYZ[1] - drawDepth; + j <= _globalXYZ[1] + drawDepth; ++j) { + for (int k = _globalXYZ[2] - drawDepth; + k <= _globalXYZ[2] + drawDepth; ++k) { + Vector tempVec(Vector(i, j, k) - XYZ); + // transformed position + Vector tPos(rotMat.transform(tempVec)); + if (Camera::isVisible(tPos, 0.9f)) { + unsigned int indexX = latticeMod(i); + unsigned int indexY = latticeMod(j); + unsigned int indexZ = latticeMod(k); + // draw it + glPushMatrix(); + glTranslatef(float(i), float(j), float(k)); + glCallList(_lattice[indexX][indexY][indexZ]); + glPopMatrix(); + } + } + } + } + + Common::flush(); +} + +void Hack::reshape() { + if (widescreen) + glViewport(0, Common::height / 2 - Common::width / 4, + Common::width, Common::width / 2); + else + glViewport(0, 0, Common::width, Common::height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + float mat[16] = { + std::cos(fov * 0.5f * D2R) / std::sin(fov * 0.5f * D2R), 0.0f, 0.0f, 0.0f, + 0.0f, 0.0, 0.0f, 0.0f, + 0.0f, 0.0f, -1.0f - 0.02f / float(depth), -1.0f, + 0.0f, 0.0f, -(0.02f + 0.0002f / float(depth)), 0.0f + }; + if (widescreen) + mat[5] = mat[0] * 2.0f; + else + mat[5] = mat[0] * Common::aspectRatio; + glLoadMatrixf(mat); + Camera::set(mat, float(depth)); + glMatrixMode(GL_MODELVIEW); +} + +void Hack::stop() {} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + case 'q': case 'Q': + Common::running = false; + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} +void Hack::pointerMotion(int, int) {} +void Hack::buttonPress(unsigned int) {} +void Hack::buttonRelease(unsigned int) {} +void Hack::pointerEnter() {} +void Hack::pointerLeave() {} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS Create(void* hdl, void* props) +{ + if (!props) + return STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + + return STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void Stop() +{ + Hack::stop(); +} + +void Destroy() +{ +} + +ADDON_STATUS GetStatus() +{ + return STATUS_OK; +} + +bool HasSettings() +{ + return false; +} + +unsigned int GetSettings(StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS SetSetting(const char *settingName, const void *settingValue) +{ + return STATUS_OK; +} + +void FreeSettings() +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +void Remove() +{ +} + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/lattice.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/lattice.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/lattice.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/lattice.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,59 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _LATTICE_HH +#define _LATTICE_HH + +#include + +namespace Hack { + enum LinkType { + UNKNOWN_LINKS = -1, + SOLID_LINKS, + TRANSLUCENT_LINKS, + HOLLOW_LINKS + }; + + struct Texture { + std::string filename; + float shininess; + bool sphereMap; + bool colored; + bool modulate; + }; + + extern unsigned int longitude; + extern unsigned int latitude; + extern float thickness; + extern unsigned int density; + extern unsigned int depth; + extern float fov; + extern unsigned int pathRand; + extern float speed; + extern LinkType linkType; + extern std::vector textures; + extern bool smooth; + extern bool fog; + extern bool widescreen; +}; + +#endif // _LATTICE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,20 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_lattice_SOURCES = $(COMMON) $(VECTOR) $(IMAGE) camera.hh lattice.cc \ + lattice.hh resources.cc resources.hh + +AM_CPPFLAGS += $(IMAGE_CPPFLAGS) +AM_CXXFLAGS += $(IMAGE_CXXFLAGS) +AM_LDFLAGS += $(IMAGE_LDFLAGS) +rs_lattice_LDADD = $(LIBMISC) $(X_LIBS) $(OPENGL_LIBS) $(IMAGE_LIBS) + +hack_PROGRAMS = rs-lattice + +latticedatadir = $(pkgdatadir)/lattice +dist_latticedata_DATA = brass.png chrome.png circuits.png crystal.png \ + doughnuts.png ghostly.png industrial1.png industrial2.png shiny.png + +uninstall-hook: + -rmdir $(latticedatadir) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/resources.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/resources.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/resources.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/resources.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,318 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include + +namespace Resources { + GLuint lists; + + struct TextureData { + unsigned int texture; + float shininess; + bool sphereMap; + bool colored; + bool modulate; + }; + + std::vector _textures; + + void makeTorus(float, float); +}; + +void Resources::makeTorus(float centerRadius, float thickRadius) { + // Smooth shading? + if (Hack::smooth) + glShadeModel(GL_SMOOTH); + else + glShadeModel(GL_FLAT); + + // Initialize texture stuff + float vStep = 1.0f / float(Hack::latitude); + float uStep = float(int((centerRadius / thickRadius) + 0.5f)) / + float(Hack::longitude); + float v2 = 0.0f; + + for (unsigned int i = 0; i < Hack::latitude; ++i) { + float temp = M_PI * 2.0f * float(i) / float(Hack::latitude); + float cosn = std::cos(temp); + float sinn = std::sin(temp); + temp = M_PI * 2.0f * float(i + 1) / float(Hack::latitude); + float cosnn = std::cos(temp); + float sinnn = std::sin(temp); + float r = centerRadius + thickRadius * cosn; + float rr = centerRadius + thickRadius * cosnn; + float z = thickRadius * sinn; + float zz = thickRadius * sinnn; + if (!Hack::smooth) { // Redefine normals for flat shaded model + temp = M_PI * 2.0f * (float(i) + 0.5f) / float(Hack::latitude); + cosn = cosnn = std::cos(temp); + sinn = sinnn = std::sin(temp); + } + float v1 = v2; + v2 += vStep; + float u = 0.0f; + float oldcosa = 0.0f, oldsina = 0.0f, oldncosa = 0.0f, oldnsina = 0.0f; + float oldcosn = 0.0f, oldcosnn = 0.0f, oldsinn = 0.0f, oldsinnn = 0.0f; + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int j = 0; j < Hack::longitude; ++j) { + temp = M_PI * 2.0f * float(j) / float(Hack::longitude); + float cosa = std::cos(temp); + float sina = std::sin(temp); + float ncosa, nsina; + if (Hack::smooth) { + ncosa = cosa; + nsina = sina; + } else { // Redefine longitudinal component of normal for flat shading + temp = M_PI * 2.0f * (float(j) - 0.5f) / float(Hack::longitude); + ncosa = std::cos(temp); + nsina = std::sin(temp); + } + if (j == 0) { // Save first values for end of circular tri-strip + oldcosa = cosa; + oldsina = sina; + oldncosa = ncosa; + oldnsina = nsina; + oldcosn = cosn; + oldcosnn = cosnn; + oldsinn = sinn; + oldsinnn = sinnn; + } + glNormal3f(cosnn * ncosa, cosnn * nsina, sinnn); + glTexCoord2f(u, v2); + glVertex3f(cosa * rr, sina * rr, zz); + glNormal3f(cosn * ncosa, cosn * nsina, sinn); + glTexCoord2f(u, v1); + glVertex3f(cosa * r, sina * r, z); + u += uStep; // update u texture coordinate + } + // Finish off circular tri-strip with saved first values + glNormal3f(oldcosnn * oldncosa, oldcosnn * oldnsina, oldsinnn); + glTexCoord2f(u, v2); + glVertex3f(oldcosa * rr, oldsina * rr, zz); + glNormal3f(oldcosn * oldncosa, oldcosn * oldnsina, oldsinn); + glTexCoord2f(u, v1); + glVertex3f(oldcosa * r, oldsina * r, z); + glEnd(); + } +} + +void Resources::init() { + glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); + glEnable(GL_LIGHT0); + float ambient[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + float diffuse[4] = {1.0f, 1.0f, 1.0f, 0.0f}; + float specular[4] = {1.0f, 1.0f, 1.0f, 0.0f}; + float position[4] = {400.0f, 300.0f, 500.0f, 0.0f}; + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, specular); + glLightfv(GL_LIGHT0, GL_POSITION, position); + glEnable(GL_COLOR_MATERIAL); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + + for ( + std::vector::const_iterator it = Hack::textures.begin(); + it != Hack::textures.end(); + ++it + ) { + TextureData data; + data.shininess = it->shininess; + data.sphereMap = it->sphereMap; + data.colored = it->colored; + data.modulate = it->modulate; + + if (it->filename != "") { + PNG png(it->filename, !data.modulate); + data.texture = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + png + ); + if (Hack::linkType == Hack::SOLID_LINKS) + if (!data.modulate && !png.hasAlphaChannel()) + data.colored = false; + } else + data.texture = 0; + _textures.push_back(data); + } + + switch (Hack::linkType) { + case Hack::SOLID_LINKS: + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + break; + case Hack::TRANSLUCENT_LINKS: + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + break; + case Hack::HOLLOW_LINKS: + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + break; + default: + throw Common::Exception("Invalid linkType"); + } + + unsigned int d = 0; + float thickness = Hack::thickness * 0.001f; + lists = Common::resources->genLists(NUMOBJECTS); + for (unsigned int i = 0; i < NUMOBJECTS; ++i) { + glNewList(lists + i, GL_COMPILE); + const TextureData& data = + _textures[Common::randomInt(Hack::textures.size())]; + + if (data.shininess >= 0.0f) { + glEnable(GL_LIGHTING); + // Add 0.0f to convert -0.0f into +0.0f, else GL complains + glMaterialf(GL_FRONT, GL_SHININESS, 0.0f + data.shininess); + glColorMaterial(GL_FRONT, GL_SPECULAR); + } else + glDisable(GL_LIGHTING); + glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); + + if (data.texture) { + if (data.sphereMap) { + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + } else { + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); + } + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, data.texture); + if (data.modulate) + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + else + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + } else + glDisable(GL_TEXTURE_2D); + + if (!data.colored) + glColor3f(1.0f, 1.0f, 1.0f); + if (d < Hack::density) { + glPushMatrix(); + if (data.colored) + glColor3f( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + Common::randomFloat(1.0f) + ); + glTranslatef(-0.25f, -0.25f, -0.25f); + if (Common::randomInt(2)) + glRotatef(180.0f, 1, 0, 0); + makeTorus(0.36f - thickness, thickness); + glPopMatrix(); + } + d = (d + 37) % 100; + if (d < Hack::density) { + glPushMatrix(); + if (data.colored) + glColor3f( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + Common::randomFloat(1.0f) + ); + glTranslatef(0.25f, -0.25f, -0.25f); + if (Common::randomInt(2)) + glRotatef(90.0f, 1, 0, 0); + else + glRotatef(-90.0f, 1, 0, 0); + makeTorus(0.36f - thickness, thickness); + glPopMatrix(); + } + d = (d + 37) % 100; + if (d < Hack::density) { + glPushMatrix(); + if (data.colored) + glColor3f( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + Common::randomFloat(1.0f) + ); + glTranslatef(0.25f, -0.25f, 0.25f); + if (Common::randomInt(2)) + glRotatef(90.0f, 0, 1, 0); + else + glRotatef(-90.0f, 0, 1, 0); + makeTorus(0.36f - thickness, thickness); + glPopMatrix(); + } + d = (d + 37) % 100; + if (d < Hack::density) { + glPushMatrix(); + if (data.colored) + glColor3f( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + Common::randomFloat(1.0f) + ); + glTranslatef(0.25f, 0.25f, 0.25f); + if (Common::randomInt(2)) + glRotatef(180.0f, 1, 0, 0); + makeTorus(0.36f - thickness, thickness); + glPopMatrix(); + } + d = (d + 37) % 100; + if (d < Hack::density) { + glPushMatrix(); + if (data.colored) + glColor3f( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + Common::randomFloat(1.0f) + ); + glTranslatef(-0.25f, 0.25f, 0.25f); + if (Common::randomInt(2)) + glRotatef(90.0f, 1, 0, 0); + else + glRotatef(-90.0f, 1, 0, 0); + makeTorus(0.36f - thickness, thickness); + glPopMatrix(); + } + d = (d + 37) % 100; + if (d < Hack::density) { + glPushMatrix(); + if (data.colored) + glColor3f( + Common::randomFloat(1.0f), + Common::randomFloat(1.0f), + Common::randomFloat(1.0f) + ); + glTranslatef(-0.25f, 0.25f, -0.25f); + if (Common::randomInt(2)) + glRotatef(90.0f, 0, 1, 0); + else + glRotatef(-90.0f, 0, 1, 0); + makeTorus(0.36f - thickness, thickness); + glPopMatrix(); + } + glEndList(); + d = (d + 37) % 100; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/resources.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/resources.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/resources.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/resources.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,36 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _RESOURCES_HH +#define _RESOURCES_HH + +#include + +#define NUMOBJECTS 10 + +namespace Resources { + extern unsigned int lists; + + void init(); +}; + +#endif // _RESOURCES_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/lattice/shiny.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/lattice/shiny.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,35 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = $(ENABLED_HACKS) +DIST_SUBDIRS = \ + cyclone euphoria fieldlines flocks flux helios hyperspace lattice \ + plasma skyrocket solarwinds + +AM_ETAGSFLAGS = --extra=fq + +if HACKMODE +if SYMLINKS +install-exec-hook: + ${mkinstalldirs} $(bindir) + for i in $(ENABLED_BINARIES); do \ + $(LN_S) -f $(hackreldir)/$$i $(DESTDIR)$(bindir)/$$i; \ + done +endif SYMLINKS + +uninstall-hook: + for i in $(ENABLED_BINARIES); do rm -f $(bindir)/$$i; done + -rmdir $(pkgdatadir) + +else !HACKMODE +install-exec-hook: +uninstall-hook: +endif !HACKMODE + +# Workaround for Exuberant ctags failure when no filenames are specified. +ETAGS = echo | etags +ETAGS_ARGS = -L - + +# See Makefile.common for why this is here. +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/Makefile.common kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/Makefile.common --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/Makefile.common 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/Makefile.common 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,31 @@ +## This file contains common variables for making each of the hacks + +COLOR = ../color.cc ../color.hh +COMMON = ../common.cc ../common.hh ../hack.hh ../pngimage.hh ../resource.hh \ + ../vroot.hh ../../config.h +VECTOR = ../vector.hh +IMPLICIT = ../implicit.cc ../implicit.hh + +IMAGE = ../pngimage.cc +SOUND = ../sound.hh ../sound.cc ../oggsound.hh ../oggsound.cc +DLOPEN = ../dlopen.hh + +LIBMISC = $(top_builddir)/lib/libmisc.a +if DLOPEN +LIBLTDL = $(top_builddir)/libltdl/libltdl.a +LIBLTDL_CPPFLAGS = -I$(top_builddir)/libltdl +endif DLOPEN + +AM_CPPFLAGS = -DPKGDATADIR=\"$(pkgdatadir)\" -I$(srcdir)/.. -I$(top_srcdir)/lib $(X_CPPFLAGS) -D_LINUX -DXBMC +AM_LDFLAGS = +AM_CXXFLAGS = + +AM_ETAGSFLAGS = --extra=fq + +# Normally automake will remove both ../$(DEPDIR) and ./$(DEPDIR) in each of +# the src subdirectories. We only remove ./$(DEPDIR) in the src subdirectories +# (and remove ./$(DEPDIR) in the src directory itself), so that +# 'make distclean' doesn't fail. +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/oggsound.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/oggsound.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/oggsound.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/oggsound.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,170 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#if HAVE_SOUND + +#include +#include +#include + +#include + +namespace OV { +#if USE_DLOPEN + typedef int (*CLEAR)(OggVorbis_File *vf); + CLEAR ov_clear; + typedef vorbis_info * (*INFO)(OggVorbis_File *vf,int link); + INFO ov_info; + typedef int (*OPEN)(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); + OPEN ov_open; + typedef ogg_int64_t (*PCM_TOTAL)(OggVorbis_File *vf,int i); + PCM_TOTAL ov_pcm_total; + typedef long (*READ)(OggVorbis_File *vf,char *buffer,int length, + int bigendianp,int word,int sgned,int *bitstream); + READ ov_read; + typedef long (*SEEKABLE)(OggVorbis_File *vf); + SEEKABLE ov_seekable; + typedef long (*STREAMS)(OggVorbis_File *vf); + STREAMS ov_streams; +#else + using ::ov_clear; + using ::ov_info; + using ::ov_open; + using ::ov_pcm_total; + using ::ov_read; + using ::ov_seekable; + using ::ov_streams; +#endif +}; + +void OGG::load(FILE* in) { + OggVorbis_File ovf; + int result; + + if ((result = OV::ov_open(in, &ovf, NULL, 0)) != 0) { + switch (result) { + case OV_EREAD: + throw Exception("Could not read file"); + case OV_ENOTVORBIS: + throw Exception("Not an Ogg Vorbis file"); + case OV_EVERSION: + throw Exception("Ogg Vorbis version mismatch"); + case OV_EBADHEADER: + throw Exception("Error in Ogg Vorbis header"); + case OV_EFAULT: + throw Exception("Internal Ogg Vorbis fault"); + default: + throw Exception( + stdx::oss() << "Unknown Ogg Vorbis error (" << result << ")" + ); + } + } + + try { + if (!OV::ov_seekable(&ovf)) + throw Exception("Ogg Vorbis file not seekable"); + + if (OV::ov_streams(&ovf) != 1) + throw Exception("Multi-streamed Ogg Vorbis files not yet supported"); + + vorbis_info* vi = OV::ov_info(&ovf, -1); + ALenum format; + switch (vi->channels) { + case 1: + format = AL_FORMAT_MONO16; + break; + case 2: + format = AL_FORMAT_STEREO16; + break; + default: + throw Exception( + stdx::oss() << "Unsupported number of channels: " << vi->channels + ); + } + if (long((unsigned int)vi->rate) != vi->rate) + throw Exception( + stdx::oss() << "Unsupported sample rate: " << vi->rate + ); + + std::vector buffer(vi->channels * 2 * OV::ov_pcm_total(&ovf, -1)); + std::vector::iterator pos = buffer.begin(); + while (true) { + int ignored; + long result = OV::ov_read(&ovf, &*pos, buffer.end() - pos, 0, 2, 1, &ignored); + if (result < 0) + throw Exception("Ogg Vorbis file corrupted"); + if (result == 0) + break; + pos += result; + if (pos > buffer.end()) + throw Exception("libvorbisfile overshot the buffer"); + } + + _buffer = Common::resources->manage(new Buffer( + format, &buffer.front(), pos - buffer.begin(), vi->rate + )); + + OV::ov_clear(&ovf); + } catch (...) { + OV::ov_clear(&ovf); + throw; + } +} + +OGG::OGG( + const std::string& filename, float ref, float delay +) : Sound(ref, delay) { +#if USE_DLOPEN + try { + const Library* libvorbisfile = Common::resources->manage(new Library("libvorbisfile")); + OV::ov_clear = (OV::CLEAR)(*libvorbisfile)("ov_clear"); + OV::ov_info = (OV::INFO)(*libvorbisfile)("ov_info"); + OV::ov_open = (OV::OPEN)(*libvorbisfile)("ov_open"); + OV::ov_pcm_total = (OV::PCM_TOTAL)(*libvorbisfile)("ov_pcm_total"); + OV::ov_read = (OV::READ)(*libvorbisfile)("ov_read"); + OV::ov_seekable = (OV::SEEKABLE)(*libvorbisfile)("ov_seekable"); + OV::ov_streams = (OV::STREAMS)(*libvorbisfile)("ov_streams"); + } catch (Common::Exception e) { + throw Sound::Unavailable(); + } +#endif + + if (filename.empty()) + throw Exception("Empty filename"); + + FILE* in = NULL; + if (filename[0] != '/') + in = std::fopen((Common::resourceDir + '/' + filename).c_str(), "rb"); + + if (!in) + in = std::fopen(filename.c_str(), "rb"); + + if (!in) + throw Exception(std::strerror(errno)); + + load(in); + // File is closed by ov_clear +} + +#endif // HAVE_SOUND diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/oggsound.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/oggsound.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/oggsound.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/oggsound.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,50 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _OGGSOUND_HH +#define _OGGSOUND_HH + +#include + +#include + +#if HAVE_SOUND + +class OGG : public Sound { +public: + typedef Common::Exception Exception; +private: + void load(FILE*); +public: + OGG(const std::string&, float, float = 0.0f); +}; + +#else // !HAVE_SOUND + +class OGG : public Sound { +public: + OGG(const std::string&, float, float = 0.0f) {} +}; + +#endif // !HAVE_SOUND + +#endif // _OGGSOUND_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/plasma/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/plasma/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/plasma/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/plasma/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,8 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_plasma_SOURCES = $(COMMON) plasma.cc plasma.hh +rs_plasma_LDADD = $(LIBMISC) $(X_LIBS) $(OPENGL_LIBS) + +hack_PROGRAMS = rs-plasma diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/plasma/plasma.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/plasma/plasma.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/plasma/plasma.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/plasma/plasma.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,397 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include + +#define NUMCONSTS 18 +#define MAXTEXSIZE 1024 + +namespace Hack { + float zoom = 10.0f; + float focus = 30.0f; + float speed = 20.0f; + unsigned int resolution = 20; +}; + +namespace Hack { + enum Arguments { + ARG_ZOOM = 1, + ARG_FOCUS, + ARG_SPEED, + ARG_RESOLUTION + }; + + float _wide; + float _high; + float _c[NUMCONSTS]; // constant + float _ct[NUMCONSTS]; // temporary value of constant + float _cv[NUMCONSTS]; // velocity of constant + stdx::dim2 > _position; + stdx::dim2 _plasma; + unsigned int _texSize; + unsigned int _plasmaWidth; + unsigned int _plasmaHeight; + stdx::dim3 _plasmaMap; + + float _maxDiff; + float _texRight; + float _texTop; + + static inline float absTrunc(float f) { + if (f >= 0.0f) + return f <= 1.0f ? f : 1.0f; + else + return f >= -1.0f ? -f : 1.0f; + } + + error_t parse(int, char*, struct argp_state*); +}; + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { + switch (key) { + case ARG_ZOOM: + if (Common::parseArg(arg, zoom, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "magnification must be between 1 and 100"); + return 0; + case ARG_FOCUS: + if (Common::parseArg(arg, focus, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "plasma focus must be between 1 and 100"); + return 0; + case ARG_SPEED: + if (Common::parseArg(arg, speed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "plasma speed must be between 1 and 100"); + return 0; + case ARG_RESOLUTION: + if (Common::parseArg(arg, resolution, 1u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "plama resolution must be between 1 and 100"); + return 0; + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Plasma options:" }, + { "zoom", ARG_ZOOM, "NUM", 0, "Magnification (1-100, default = 10)" }, + { "focus", ARG_FOCUS, "NUM", 0, "Plasma focus (1-100, default = 30)" }, + { "speed", ARG_SPEED, "NUM", 0, "Plasma speed (1-100, default = 20)" }, + { "resolution", ARG_RESOLUTION, "NUM", 0, + "Plasma resolution (1-100, default = 20)" }, + {} + }; + static struct argp parser = + { options, parse, NULL, "Draws gooey colorful plasma stuff." }; + return &parser; +} + +std::string Hack::getShortName() { return "plasma"; } +std::string Hack::getName() { return "Plasma"; } + +void Hack::start() { + glViewport(0, 0, Common::width, Common::height); + + if (Common::aspectRatio >= 1.0f) { + _wide = 30.0f / zoom; + _high = _wide / Common::aspectRatio; + } else { + _high = 30.0f / zoom; + _wide = _high * Common::aspectRatio; + } +/* + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0.0f, 1.0f, 0.0f, 1.0f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +*/ + // Set resolution of plasma + if (Common::aspectRatio >= 1.0f) + _plasmaHeight = (resolution * MAXTEXSIZE) / 100; + else + _plasmaHeight = (unsigned int)( + float(resolution * MAXTEXSIZE) * + Common::aspectRatio * 0.01f + ); + + _plasmaWidth = (unsigned int)(float(_plasmaHeight) / Common::aspectRatio); + + // Set resolution of texture + _texSize = 16; + if (Common::aspectRatio >= 1.0f) + while (_plasmaHeight > _texSize) _texSize *= 2; + else + while (_plasmaWidth > _texSize) _texSize *= 2; + + // Initialize memory and positions + _position.resize(_plasmaWidth, _plasmaHeight); + _plasma.resize(_plasmaWidth, _plasmaHeight); + _plasmaMap.resize(_texSize, _texSize); + for (unsigned int i = 0; i < _plasmaHeight; ++i) + for (unsigned int j = 0; j < _plasmaWidth; ++j) + _position(i, j) = + std::make_pair( + (i * _wide) / float(_plasmaHeight - 1) - (_wide * 0.5f), + (j * _high) / + (float(_plasmaHeight) / Common::aspectRatio - 1.0f) - + (_high * 0.5f) + ); + + // Initialize constants + for (unsigned int i = 0; i < NUMCONSTS; ++i) { + _c[i] = 0.0f; + _ct[i] = Common::randomFloat(M_PI * 2.0f); + _cv[i] = Common::randomFloat(0.005f * speed) + 0.0001f; + } + + // Make texture + glBindTexture(GL_TEXTURE_2D, 1000); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexImage2D(GL_TEXTURE_2D, 0, 3, _texSize, _texSize, 0, + GL_RGB, GL_FLOAT, &_plasmaMap.front()); + //glEnable(GL_TEXTURE_2D); + //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + //glPixelStorei(GL_UNPACK_ROW_LENGTH, _texSize); + + focus = focus / 50.0f + 0.3f; + _maxDiff = 0.004f * speed; + + // The "- 1" cuts off right and top edges to get rid of blending to black + _texRight = float(_plasmaHeight - 1) / float(_texSize); + _texTop = _texRight / Common::aspectRatio; + + // Clear the error flag + glGetError(); +} + +void Hack::tick() { + int origRowLength; + + glViewport(0, 0, Common::width, Common::height); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluOrtho2D(0.0f, 1.0f, 0.0f, 1.0f); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glBindTexture(GL_TEXTURE_2D, 1000); + glEnable(GL_TEXTURE_2D); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + glGetIntegerv(GL_UNPACK_ROW_LENGTH, &origRowLength); + glPixelStorei(GL_UNPACK_ROW_LENGTH, _texSize); + + // Update constants + for(unsigned int i = 0; i < NUMCONSTS; ++i) { + _ct[i] += _cv[i]; + if (_ct[i] > M_PI * 2.0f) + _ct[i] -= M_PI * 2.0f; + _c[i] = std::sin(_ct[i]) * focus; + } + + // Update colors + for (unsigned int i = 0; i < _plasmaHeight; ++i) { + for (unsigned int j = 0; j < _plasmaWidth; ++j) { + RGBColor& plasma(_plasma(i, j)); + RGBColor RGB(plasma); + std::pair& pos(_position(i, j)); + + // Calculate vertex colors + plasma.set( + 0.7f + * (_c[0] * pos.first + _c[1] * pos.second + + _c[2] * (pos.first * pos.first + 1.0f) + + _c[3] * pos.first * pos.second + + _c[4] * RGB.g() + _c[5] * RGB.b()), + 0.7f + * (_c[6] * pos.first + _c[7] * pos.second + + _c[8] * pos.first * pos.first + + _c[9] * (pos.second * pos.second - 1.0f) + + _c[10] * RGB.r() + _c[11] * RGB.b()), + 0.7f + * (_c[12] * pos.first + _c[13] * pos.second + + _c[14] * (1.0f - pos.first * pos.second) + + _c[15] * pos.second * pos.second + + _c[16] * RGB.r() + _c[17] * RGB.g()) + ); + + // Don't let the colors change too much + float temp = plasma.r() - RGB.r(); + if (temp > _maxDiff) + plasma.r() = RGB.r() + _maxDiff; + if (temp < -_maxDiff) + plasma.r() = RGB.r() - _maxDiff; + temp = plasma.g() - RGB.g(); + if (temp > _maxDiff) + plasma.g() = RGB.g() + _maxDiff; + if (temp < -_maxDiff) + plasma.g() = RGB.g() - _maxDiff; + temp = plasma.b() - RGB.b(); + if (temp > _maxDiff) + plasma.b() = RGB.b() + _maxDiff; + if (temp < -_maxDiff) + plasma.b() = RGB.b() - _maxDiff; + + // Put colors into texture + _plasmaMap(i, j, 0) = absTrunc(plasma.r()); + _plasmaMap(i, j, 1) = absTrunc(plasma.g()); + _plasmaMap(i, j, 2) = absTrunc(plasma.b()); + } + } + + // Update texture + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, + _plasmaWidth, _plasmaHeight, GL_RGB, GL_FLOAT, &_plasmaMap.front()); + + // Draw it + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f, 0.0f); + glVertex2f(0.0f, 0.0f); + glTexCoord2f(0.0f, _texRight); + glVertex2f(1.0f, 0.0f); + glTexCoord2f(_texTop, 0.0f); + glVertex2f(0.0f, 1.0f); + glTexCoord2f(_texTop, _texRight); + glVertex2f(1.0f, 1.0f); + glEnd(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glPixelStorei(GL_UNPACK_ROW_LENGTH, origRowLength); + + //Common::flush(); + + // Clear the error flag + glGetError(); +} + +void Hack::reshape() { + glViewport(0, 0, Common::width, Common::height); +} + +void Hack::stop() {} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + case 'q': case 'Q': + Common::running = false; + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} +void Hack::pointerMotion(int, int) {} +void Hack::buttonPress(unsigned int) {} +void Hack::buttonRelease(unsigned int) {} +void Hack::pointerEnter() {} +void Hack::pointerLeave() {} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + + return ADDON_STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void ADDON_Stop() +{ + Hack::stop(); +} + +void ADDON_Destroy() +{ +} + +ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +bool ADDON_HasSettings() +{ + return false; +} + +unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue) +{ + return ADDON_STATUS_OK; +} + +void ADDON_FreeSettings() +{ +} + +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +void Remove() +{ +} + +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/plasma/plasma.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/plasma/plasma.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/plasma/plasma.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/plasma/plasma.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,35 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _PLASMA_HH +#define _PLASMA_HH + +#include + +namespace Hack { + extern float zoom; + extern float focus; + extern float speed; + extern unsigned int resolution; +}; + +#endif // _PLASMA_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/pngimage.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/pngimage.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/pngimage.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/pngimage.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,206 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#if HAVE_PNG_H + #include +#endif + +#if HAVE_SETJMP_H + #include +#endif + +#include +#include +#include +#include + +void PNG::load(FILE* in, bool fullColor) { + png_byte sig[8]; + int sigBytes = fread(sig, 1, 8, in); + + if (png_sig_cmp(sig, 0, sigBytes)) + throw Exception("Not a PNG file"); + + png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL); + if (!png) + throw Exception("Could not create PNG read structure"); + png_infop pngInfo = png_create_info_struct(png); + if (!pngInfo) + throw Exception("Could not create PNG info structure"); + + try { + if (setjmp(png_jmpbuf(png))) + throw Exception("PNG could not be decoded"); + + png_init_io(png, in); + png_set_sig_bytes(png, sigBytes); + + png_read_info(png, pngInfo); + + if (png_get_color_type(png, pngInfo) == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png); + if ( + (png_get_color_type(png, pngInfo) == PNG_COLOR_TYPE_GRAY) && + png_get_bit_depth(png, pngInfo) < 8 + ) + png_set_expand_gray_1_2_4_to_8(png); + if (png_get_valid(png, pngInfo, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(png); + if (fullColor) + png_set_gray_to_rgb(png); + if (png_get_bit_depth(png, pngInfo) < 8) + png_set_packing(png); + png_read_update_info(png, pngInfo); + + _width = png_get_image_width(png, pngInfo); + _height = png_get_image_height(png, pngInfo); + + switch (png_get_color_type(png, pngInfo)) { + case PNG_COLOR_TYPE_GRAY: + _format = GL_LUMINANCE; + _bytesPerPixel = 1; + _hasAlphaChannel = false; + break; + case PNG_COLOR_TYPE_RGB: + _format = GL_RGB; + _bytesPerPixel = 3; + _hasAlphaChannel = false; + break; + case PNG_COLOR_TYPE_RGBA: + _format = GL_RGBA; + _bytesPerPixel = 4; + _hasAlphaChannel = true; + break; + case PNG_COLOR_TYPE_GA: + _format = GL_LUMINANCE_ALPHA; + _bytesPerPixel = 2; + _hasAlphaChannel = true; + break; + default: + throw Exception("Unhandled image type"); + } + switch (png_get_bit_depth(png, pngInfo)) { + case 8: + _type = GL_UNSIGNED_BYTE; + break; + case 16: + _type = GL_UNSIGNED_SHORT; + _bytesPerPixel *= 2; + break; + default: + throw Exception("Unhandled image depth"); + } + _numComponents = png_get_channels(png, pngInfo); + + GLint alignment; + glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment); + _rowLength = + ((_width * _bytesPerPixel + alignment - 1) / alignment) * alignment; + _data = new uint8_t[_height * _rowLength]; + png_bytep* rows = new png_bytep[_height]; + for (GLsizei i = 0; i < _height; ++i) + rows[i] = _data + _rowLength * i; + png_read_image(png, rows); + delete[] rows; + + png_read_end(png, NULL); + png_destroy_read_struct(&png, &pngInfo, NULL); + } catch (...) { + png_destroy_read_struct(&png, &pngInfo, NULL); + throw; + } +} + +PNG::PNG(const std::string& filename, bool fullColor) { + if (filename.empty()) + throw Exception("Empty filename"); + + FILE* in = NULL; + if (filename[0] != '/') + in = std::fopen((Common::resourceDir + '/' + filename).c_str(), "rb"); + + if (!in) + in = std::fopen(filename.c_str(), "rb"); + + if (!in) + throw Exception(stdx::oss() << filename << ": " << std::strerror(errno)); + + try { + load(in, fullColor); + } catch (Exception e) { + throw Exception(stdx::oss() << filename << ": " << e); + } + std::fclose(in); +} + +PNG::~PNG() { + if (_data) delete[] _data; +} + +const RGBColor PNG::operator()(GLsizei x, GLsizei y) const { + if (x >= _width || y >= _height) + return RGBColor(); + + uint8_t* pos = _data + _rowLength * y + _bytesPerPixel * x; + if (_type == GL_UNSIGNED_BYTE) { + switch (_format) { + case GL_LUMINANCE: + case GL_LUMINANCE_ALPHA: + { + float l = float(*pos) / 255.0f; + return RGBColor(l, l, l); + } + case GL_RGB: + case GL_RGBA: + { + float r = float(pos[0]) / 255.0f; + float g = float(pos[1]) / 255.0f; + float b = float(pos[2]) / 255.0f; + return RGBColor(r, g, b); + } + default: + return RGBColor(); + } + } else { + switch (_format) { + case GL_LUMINANCE: + case GL_LUMINANCE_ALPHA: + { + float l = float((unsigned int)(pos[0]) * 255 + pos[1]) / 65535.0f; + return RGBColor(l, l, l); + } + case GL_RGB: + case GL_RGBA: + { + float r = float((unsigned int)(pos[0]) * 255 + pos[1]) / 65535.0f; + float g = float((unsigned int)(pos[2]) * 255 + pos[3]) / 65535.0f; + float b = float((unsigned int)(pos[4]) * 255 + pos[5]) / 65535.0f; + return RGBColor(r, g, b); + } + default: + return RGBColor(); + } + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/pngimage.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/pngimage.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/pngimage.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/pngimage.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,67 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _PNGIMAGE_HH +#define _PNGIMAGE_HH + +#include + +#if HAVE_STDINT_H + #include +#endif + +#include +#include + +class PNG { +public: + typedef std::string Exception; +private: + GLint _numComponents; + GLsizei _width; + GLsizei _height; + GLenum _format; + GLenum _type; + uint8_t* _data; + + bool _hasAlphaChannel; + + unsigned int _bytesPerPixel; + unsigned int _rowLength; + + void load(FILE*, bool); +public: + PNG(const std::string&, bool = false); + ~PNG(); + + GLint numComponents() const { return _numComponents; } + unsigned int width() const { return _width; } + unsigned int height() const { return _height; } + GLenum format() const { return _format; } + GLenum type() const { return _type; } + const GLvoid* data() const { return _data; } + + bool hasAlphaChannel() const { return _hasAlphaChannel; } + const RGBColor operator()(GLsizei, GLsizei) const; +}; + +#endif // _PNGIMAGE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/resource.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/resource.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/resource.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/resource.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,213 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _RESOURCE_HH +#define _RESOURCE_HH + +#include + +#include + +class ResourceManager { +public: + typedef Common::Exception Exception; +private: + class _ResourceBase { + protected: + _ResourceBase() {} + public: + virtual ~_ResourceBase() {} + }; + std::list<_ResourceBase*> _resources; +public: + template + class Resource : public _ResourceBase { + protected: + Resource() {} + public: + virtual ~Resource() {} + virtual Ret operator()() const = 0; + }; +public: + template + Ret manage(Resource *resource) { + _resources.push_front(resource); + return (*resource)(); + } +private: + class DisplayLists : public Resource { + private: + GLuint _base; + GLsizei _num; + public: + DisplayLists(GLsizei num) : _base(glGenLists(num)), _num(num) { + if (_base == 0) throw Exception("No more available GL display lists"); + } + ~DisplayLists() { glDeleteLists(_base, _num); } + GLuint operator()() const { return _base; } + }; + + class Texture : public Resource { + private: + GLuint _texture; + public: + Texture(GLenum target, GLenum minFilter, GLenum magFilter, GLenum wrapS, GLenum wrapT) { + glGenTextures(1, &_texture); + glBindTexture(target, _texture); + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, minFilter); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, magFilter); + glTexParameteri(target, GL_TEXTURE_WRAP_S, wrapS); + glTexParameteri(target, GL_TEXTURE_WRAP_T, wrapT); + } + ~Texture() { glDeleteTextures(1, &_texture); } + GLuint operator()() const { return _texture; } + }; +public: + ~ResourceManager() { stdx::destroy_all_ptr(_resources); } + + GLuint genLists(GLsizei num) { + return manage(new DisplayLists(num)); + } + + GLuint genTexture( + GLenum minFilter, GLenum magFilter, GLenum wrapS, GLenum wrapT + ) { + return manage(new Texture( + GL_TEXTURE_2D, minFilter, magFilter, wrapS, wrapT + )); + } + + GLuint genTexture( + GLenum minFilter, GLenum magFilter, GLenum wrapS, GLenum wrapT, + GLint numComponents, GLsizei width, GLsizei height, + GLenum format, GLenum type, const GLvoid* data, bool mipmap = true + ) { + GLuint result = genTexture(minFilter, magFilter, wrapS, wrapT); + if (mipmap) + gluBuild2DMipmaps( + GL_TEXTURE_2D, numComponents, width, height, + format, type, data + ); + else + glTexImage2D( + GL_TEXTURE_2D, 0, numComponents, width, height, 0, + format, type, data + ); + return result; + } + + GLuint genTexture( + GLenum minFilter, GLenum magFilter, GLenum wrapS, GLenum wrapT, + const PNG& png, bool mipmap = true + ) { + return genTexture( + minFilter, magFilter, wrapS, wrapT, + png.numComponents(), png.width(), png.height(), + png.format(), png.type(), png.data(), mipmap + ); + } + +#ifdef GL_ARB_texture_cube_map + + GLuint genCubeMapTexture( + GLenum minFilter, GLenum magFilter, GLenum wrapS, GLenum wrapT + ) { + return manage(new Texture( + GL_TEXTURE_CUBE_MAP_ARB, minFilter, magFilter, wrapS, wrapT + )); + } + + GLuint genCubeMapTexture( + GLenum minFilter, GLenum magFilter, GLenum wrapS, GLenum wrapT, + GLint numComponents, GLsizei width, GLsizei height, + GLenum format, GLenum type, const GLvoid* data, bool mipmap = true + ) { + GLuint result = genCubeMapTexture(minFilter, magFilter, wrapS, wrapT); + if (mipmap) { + gluBuild2DMipmaps( + GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, numComponents, width, height, + format, type, data + ); + gluBuild2DMipmaps( + GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, numComponents, width, height, + format, type, data + ); + gluBuild2DMipmaps( + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, numComponents, width, height, + format, type, data + ); + gluBuild2DMipmaps( + GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, numComponents, width, height, + format, type, data + ); + gluBuild2DMipmaps( + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, numComponents, width, height, + format, type, data + ); + gluBuild2DMipmaps( + GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, numComponents, width, height, + format, type, data + ); + } else { + glTexImage2D( + GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, 0, numComponents, width, height, 0, + format, type, data + ); + glTexImage2D( + GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, numComponents, width, height, 0, + format, type, data + ); + glTexImage2D( + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, 0, numComponents, width, height, 0, + format, type, data + ); + glTexImage2D( + GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, 0, numComponents, width, height, 0, + format, type, data + ); + glTexImage2D( + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, 0, numComponents, width, height, 0, + format, type, data + ); + glTexImage2D( + GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, 0, numComponents, width, height, 0, + format, type, data + ); + } + return result; + } + + GLuint genCubeMapTexture( + GLenum minFilter, GLenum magFilter, GLenum wrapS, GLenum wrapT, + const PNG& png, bool mipmap = true + ) { + return genCubeMapTexture( + minFilter, magFilter, wrapS, wrapT, + png.numComponents(), png.width(), png.height(), + png.format(), png.type(), png.data() + ); + } + +#endif // GL_ARB_texture_cube_map +}; + +#endif // _RESOURCE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bee.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bee.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bee.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bee.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,105 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +void Bee::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f || _pos.y() <= 0.0f) { + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + _vel.y() -= Common::elapsedTime * 32.0f; + _vel += Vector( + std::cos(_accel.x()), + std::cos(_accel.y()) - 0.2f, + std::cos(_accel.z()) + ) * 800.0f * Common::elapsedTime; + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + float temp = (_lifetime - _remaining) / _lifetime; + _brightness = 1.0f - temp * temp * temp * temp; + + _accel += _accelSpeed * Common::elapsedTime; + if (_accel.x() > M_PI) + _accel.x() -= 2.0f * M_PI; + if (_accel.y() > M_PI) + _accel.y() -= 2.0f * M_PI; + if (_accel.z() > M_PI) + _accel.z() -= 2.0f * M_PI; + + Vector step(_pos - _sparkPos); + float distance = step.normalize(); + + if (distance > 10.0f) { + unsigned int n = (unsigned int)(distance / 10.0f); + step *= 10.0f; + for (unsigned int i = 0; i < n; ++i) { + Hack::pending.push_back(new Star(_sparkPos, + Vector( + Common::randomFloat(100.0f) - 20.0f, + Common::randomFloat(100.0f) - 20.0f, + Common::randomFloat(100.0f) - 20.0f + ) - _vel * 0.5f, 0.612f, Common::randomFloat(0.1f) + 0.15f, _RGB, 7.0f, + false, Resources::DisplayLists::flares + 3 + )); + _sparkPos += step; + } + } + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +}; + +void Bee::updateCameraOnly() { + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Bee::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(10.0f, 10.0f, 10.0f); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f(_RGB.r(), _RGB.g(), _RGB.b(), _brightness); + glCallList(Resources::DisplayLists::flares); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bee.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bee.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bee.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bee.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,59 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _BEE_HH +#define _BEE_HH + +#include + +#include +#include +#include + +class Bee : public Particle { +private: + RGBColor _RGB; + float _brightness; + + Vector _accel; + Vector _accelSpeed; + + Vector _sparkPos; +public: + Bee(const Vector& pos, const Vector& vel, const RGBColor& RGB) : + Particle(pos, vel, 0.3f, Common::randomFloat(1.0f) + 2.5f), + _RGB(RGB), _accel( + Common::randomFloat(M_PI * 2), + Common::randomFloat(M_PI * 2), + Common::randomFloat(M_PI * 2) + ), _accelSpeed( + Common::randomFloat(M_PI * 2), + Common::randomFloat(M_PI * 2), + Common::randomFloat(M_PI * 2) + ), _sparkPos(_pos) {} + + void update(); + void updateCameraOnly(); + void draw() const; +}; + +#endif // _BEE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bigmama.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bigmama.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bigmama.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bigmama.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,138 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include + +BigMama::BigMama(const Vector& pos, const Vector& vel) : + Particle(pos, vel, 0.612f, 5.0f) { + Hack::pending.push_back(new Star(_pos, _vel + Vector(0.0f, 15.0f, 0.0f), + 0.0f, 3.0f, RGBColor(1.0f, 1.0f, 0.9f), 400.0f)); + Hack::pending.push_back(new Star(_pos, _vel - Vector(0.0f, 15.0f, 0.0f), + 0.0f, 3.0f, RGBColor(1.0f, 1.0f, 0.9f), 400.0f)); + Hack::pending.push_back(new Star(_pos, _vel + Vector(0.0f, 45.0f, 0.0f), + 0.0f, 3.5f, RGBColor(1.0f, 1.0f, 0.6f), 400.0f)); + Hack::pending.push_back(new Star(_pos, _vel - Vector(0.0f, 45.0f, 0.0f), + 0.0f, 3.5f, RGBColor(1.0f, 1.0f, 0.6f), 400.0f)); + Hack::pending.push_back(new Star(_pos, _vel + Vector(0.0f, 75.0f, 0.0f), + 0.0f, 4.0f, RGBColor(1.0f, 0.5f, 0.3f), 400.0f)); + Hack::pending.push_back(new Star(_pos, _vel - Vector(0.0f, 75.0f, 0.0f), + 0.0f, 4.0f, RGBColor(1.0f, 0.5f, 0.3f), 400.0f)); + Hack::pending.push_back(new Star(_pos, _vel + Vector(0.0f, 105.0f, 0.0f), + 0.0f, 4.5f, RGBColor(1.0f, 0.0f, 0.0f), 400.0f)); + Hack::pending.push_back(new Star(_pos, _vel - Vector(0.0f, 105.0f, 0.0f), + 0.0f, 4.5f, RGBColor(1.0f, 0.0f, 0.0f), 400.0f)); + + RGBColor RGB(Particle::randomColor()); + + for (unsigned int i = 0; i < 75; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity *= 600.0f + Common::randomFloat(50.0f); + velocity += _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(2.0f) + 2.0f, RGB, 30.0f)); + } + + RGB = Particle::randomColor(); + + for (unsigned int i = 0; i < 50; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + 0.0f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity.x() *= 1000.0f + Common::randomFloat(100.0f); + velocity.y() += Common::randomFloat(100.0f) - 50.0f; + velocity.z() *= 1000.0f + Common::randomFloat(100.0f); + velocity += _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(6.0f) + 3.0f, RGB, 100.0f)); + } + + if (Hack::volume > 0.0f) + Resources::Sounds::nuke->play(_pos); +} + +void BigMama::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f || _pos.y() <= 0.0f) { + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + _vel.y() -= Common::elapsedTime * 32.0f; + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + float life = _remaining / _lifetime; + _brightness = life * 2.0f - 1.0f; + if (_brightness < 0.0f) + _brightness = 0.0f; + _size += 1500.0f * Common::elapsedTime; + + Hack::superFlare(_pos, RGBColor(0.6f, 0.6f, 1.0f), _brightness); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void BigMama::updateCameraOnly() { + Hack::superFlare(_pos, RGBColor(0.6f, 0.6f, 1.0f), _brightness); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void BigMama::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(_size, _size, _size); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f(0.6f, 0.6f, 1.0f, _brightness); + glCallList(Resources::DisplayLists::flares + 2); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bigmama.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bigmama.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bigmama.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bigmama.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,43 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _BIGMAMA_HH +#define _BIGMAMA_HH + +#include + +#include +#include + +class BigMama : public Particle { +private: + float _size; + float _brightness; +public: + BigMama(const Vector&, const Vector&); + + void update(); + void updateCameraOnly(); + void draw() const; +}; + +#endif // _BIGMAMA_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bomb.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bomb.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bomb.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bomb.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,81 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include + +void Bomb::update() { + _remaining -= Common::elapsedTime; + + bool alive = _remaining > 0.0f && _pos.y() >= 0.0f; + if (!alive) { + switch (_bombType) { + case BOMB_STARS: + Hack::pending.push_back(new Explosion(_pos, _vel, + Explosion::EXPLODE_STARS_FROM_BOMB, _RGB)); + break; + case BOMB_STREAMERS: + Hack::pending.push_back(new Explosion(_pos, _vel, + Explosion::EXPLODE_STREAMERS_FROM_BOMB, _RGB)); + break; + case BOMB_METEORS: + Hack::pending.push_back(new Explosion(_pos, _vel, + Explosion::EXPLODE_METEORS_FROM_BOMB, _RGB)); + break; + case BOMB_CRACKER: + Hack::pending.push_back(new Star(_pos, _vel, 0.4f, 0.2f, + RGBColor(1.0f, 0.8f, 0.6f), Common::randomFloat(3.0f) + 7.0f)); + break; + } + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + _vel.y() -= Common::elapsedTime * 32.0f; + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Bomb::updateCameraOnly() { + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Bomb::draw() const { + // Invisible! +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bomb.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bomb.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bomb.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/bomb.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,58 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _BOMB_HH +#define _BOMB_HH + +#include + +#include +#include +#include + +class Bomb : public Particle { +public: + enum Type { + BOMB_STARS, + BOMB_STREAMERS, + BOMB_METEORS, + BOMB_CRACKER + }; +private: + RGBColor _RGB; + + Type _bombType; +public: + Bomb(const Vector& pos, const Vector& vel, Type bombType, + const RGBColor& RGB = RGBColor()) : + Particle(pos, vel, 0.4f, + (bombType == BOMB_CRACKER) ? + 4.0f * (0.5f - std::sin(Common::randomFloat(M_PI))) + 4.5f : + Common::randomFloat(1.5f) + 3.0f + ), _RGB(RGB), _bombType(bombType) {} + + void update(); + void updateCameraOnly(); + void draw() const; +}; + +#endif // _BOMB_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/boom1.ogg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/boom1.ogg differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/boom2.ogg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/boom2.ogg differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/boom3.ogg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/boom3.ogg differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/boom4.ogg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/boom4.ogg differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/cloud.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/cloud.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/earth-far.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/earth-far.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/earth-light.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/earth-light.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/earth-near.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/earth-near.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/explosion.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/explosion.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/explosion.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/explosion.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,608 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void Explosion::popSphere( + unsigned int n, float speed, const RGBColor& RGB +) const { + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity *= speed + Common::randomFloat(50.0f); + velocity += _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(1.0f) + 2.0f, RGB, 30.0f, + Common::randomInt(100) < int(Hack::explosionSmoke))); + } +} + +void Explosion::popSplitSphere( + unsigned int n, float speed, const RGBColor& RGB1, const RGBColor& RGB2 +) const { + Vector planeNormal( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + ); + planeNormal.normalize(); + + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity *= speed + Common::randomFloat(50.0f); + velocity += _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(1.0f) + 2.0f, + Vector::dot(planeNormal, velocity) > 0.0f ? RGB1 : RGB2, 30.0f, + Common::randomInt(100) < int(Hack::explosionSmoke))); + } +} + +void Explosion::popMultiColorSphere( + unsigned int n, float speed, const RGBColor RGB[3] +) const { + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity *= speed + Common::randomFloat(50.0f); + velocity += _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(1.0f) + 2.0f, RGB[i % 3], 30.0f, + Common::randomInt(100) < int(Hack::explosionSmoke))); + } +} + +void Explosion::popRing( + unsigned int n, float speed, const RGBColor& RGB +) const { + float heading = Common::randomFloat(M_PI); + float pitch = Common::randomFloat(M_PI); + float ch = std::cos(heading); + float sh = std::sin(heading); + float cp = std::cos(pitch); + float sp = std::sin(pitch); + + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + float r0 = velocity.x(); + float r1 = velocity.z(); + velocity.y() = sp * r1; + velocity.z() = cp * r1; + velocity.x() = ch * r0 + sh * sp * r1; + velocity.y() = -sh * r0 + ch * sp * r1; + + velocity *= speed; + velocity += Vector( + Common::randomFloat(50.0f), + Common::randomFloat(50.0f), + Common::randomFloat(50.0f) + ) + _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(1.0f) + 2.0f, RGB, 30.0f, + Common::randomInt(100) < int(Hack::explosionSmoke))); + } +} + +void Explosion::popStreamers( + unsigned int n, float speed, const RGBColor& RGB +) const { + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity *= speed + Common::randomFloat(50.0f); + velocity += _vel; + + Hack::pending.push_back(new Streamer(_pos, velocity, 0.612f, + Common::randomFloat(1.0f) + 3.0f, RGB, 30.0f)); + } +} + +void Explosion::popMeteors( + unsigned int n, float speed, const RGBColor& RGB +) const { + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity *= speed + Common::randomFloat(50.0f); + velocity += _vel; + + Hack::pending.push_back(new Meteor(_pos, velocity, 0.612f, + Common::randomFloat(1.0f) + 3.0f, RGB, 20.0f)); + } +} + +void Explosion::popStarBombs( + unsigned int n, float speed, const RGBColor& RGB +) const { + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(speed * 2) - speed, + Common::randomFloat(speed * 2) - speed, + Common::randomFloat(speed * 2) - speed + ); + velocity += _vel; + + Hack::pending.push_back(new Bomb(_pos, velocity, Bomb::BOMB_STARS, + RGB)); + } +} + +void Explosion::popStreamerBombs( + unsigned int n, float speed, const RGBColor& RGB +) const { + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(speed * 2) - speed, + Common::randomFloat(speed * 2) - speed, + Common::randomFloat(speed * 2) - speed + ); + velocity += _vel; + + Hack::pending.push_back(new Bomb(_pos, velocity, Bomb::BOMB_STREAMERS, + RGB)); + } +} + +void Explosion::popMeteorBombs( + unsigned int n, float speed, const RGBColor& RGB +) const { + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(speed * 2) - speed, + Common::randomFloat(speed * 2) - speed, + Common::randomFloat(speed * 2) - speed + ); + velocity += _vel; + + Hack::pending.push_back(new Bomb(_pos, velocity, Bomb::BOMB_METEORS, + RGB)); + } +} + +void Explosion::popCrackerBombs(unsigned int n, float speed) const { + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(speed * 2) - speed, + Common::randomFloat(speed * 2) - speed, + Common::randomFloat(speed * 2) - speed + ); + velocity += _vel; + + Hack::pending.push_back(new Bomb(_pos, velocity, Bomb::BOMB_CRACKER)); + } +} + +void Explosion::popBees( + unsigned int n, float speed, const RGBColor& RGB +) const { + for (unsigned int i = 0; i < n; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity *= speed; + velocity += _vel; + + Hack::pending.push_back(new Bee(_pos, velocity, RGB)); + } +} + +Explosion::Explosion( + const Vector& pos, const Vector& vel, Type explosionType, + const RGBColor& RGB, float lifetime +) : Particle(pos, vel, 0.612f, lifetime), _RGB(RGB), _size(100.0f) { + switch (explosionType) { + case EXPLODE_SPHERE: + _RGB = Particle::randomColor(); + if (!Common::randomInt(10)) + popSphere(225, 1000.0f, _RGB); + else + popSphere(175, Common::randomFloat(100.0f) + 400.0f, _RGB); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_SPLIT_SPHERE: + { + RGBColor RGB1 = Particle::randomColor(); + RGBColor RGB2 = Particle::randomColor(); + _RGB = (RGB1 + RGB2) / 2; + if (!Common::randomInt(10)) + popSplitSphere(225, 1000.0f, RGB1, RGB2); + else + popSplitSphere(175, Common::randomFloat(100.0f) + 400.0f, RGB1, RGB2); + } + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_MULTICOLORED_SPHERE: + { + RGBColor RGB[] = { + Particle::randomColor(), + Particle::randomColor(), + Particle::randomColor() + }; + _RGB = (RGB[0] + RGB[1] + RGB[2]) / 3; + if (!Common::randomInt(10)) + popMultiColorSphere(225, 1000.0f, RGB); + else + popMultiColorSphere(175, Common::randomFloat(100.0f) + 400.0f, RGB); + } + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_RING: + _RGB = Particle::randomColor(); + popRing(70, Common::randomFloat(100.0f) + 400.0f, _RGB); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_DOUBLE_SPHERE: + { + RGBColor RGB1 = Particle::randomColor(); + RGBColor RGB2 = Particle::randomColor(); + _RGB = (RGB1 + RGB2) / 2; + popSphere(90, Common::randomFloat(50.0f) + 200.0f, RGB1); + popSphere(150, Common::randomFloat(100.0f) + 500.0f, RGB2); + } + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_SPHERE_INSIDE_RING: + { + RGBColor RGB1 = Particle::randomColor(); + RGBColor RGB2 = Particle::randomColor(); + _RGB = (RGB1 + RGB2) / 2; + popSphere(150, Common::randomFloat(50.0f) + 200.0f, RGB1); + popRing(70, Common::randomFloat(100.0f) + 500.0f, RGB2); + } + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_STREAMERS: + _RGB = Particle::randomColor(); + popStreamers(40, Common::randomFloat(100.0f) + 400.0f, _RGB); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_METEORS: + _RGB = Particle::randomColor(); + popMeteors(40, Common::randomFloat(100.0f) + 400.0f, _RGB); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_STARS_INSIDE_STREAMERS: + { + RGBColor RGB1 = Particle::randomColor(); + RGBColor RGB2 = Particle::randomColor(); + _RGB = (RGB1 + RGB2) / 2; + popSphere(90, Common::randomFloat(50.0f) + 200.0f, RGB1); + popStreamers(25, Common::randomFloat(100.0f) + 500.0f, RGB2); + } + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_STARS_INSIDE_METEORS: + { + RGBColor RGB1 = Particle::randomColor(); + RGBColor RGB2 = Particle::randomColor(); + _RGB = (RGB1 + RGB2) / 2; + popSphere(90, Common::randomFloat(50.0f) + 200.0f, RGB1); + popMeteors(25, Common::randomFloat(100.0f) + 500.0f, RGB2); + } + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_STREAMERS_INSIDE_STARS: + { + RGBColor RGB1 = Particle::randomColor(); + RGBColor RGB2 = Particle::randomColor(); + _RGB = (RGB1 + RGB2) / 2; + popStreamers(20, Common::randomFloat(100.0f) + 450.0f, RGB1); + popSphere(150, Common::randomFloat(50.0f) + 500.0f, RGB2); + } + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_METEORS_INSIDE_STARS: + { + RGBColor RGB1 = Particle::randomColor(); + RGBColor RGB2 = Particle::randomColor(); + _RGB = (RGB1 + RGB2) / 2; + popMeteors(20, Common::randomFloat(100.0f) + 450.0f, RGB1); + popSphere(150, Common::randomFloat(50.0f) + 500.0f, RGB2); + } + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_STAR_BOMBS: + _RGB = Particle::randomColor(); + popStarBombs(8, Common::randomFloat(100.0f) + 300.0f, _RGB); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_STREAMER_BOMBS: + _RGB = Particle::randomColor(); + popStreamerBombs(8, Common::randomFloat(100.0f) + 300.0f, _RGB); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_METEOR_BOMBS: + _RGB = Particle::randomColor(); + popMeteorBombs(8, Common::randomFloat(100.0f) + 300.0f, _RGB); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_CRACKER_BOMBS: + _RGB = Particle::randomColor(); + popCrackerBombs(250, Common::randomFloat(50.0f) + 150.0f); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + Resources::Sounds::popper->play(_pos); + } + break; + case EXPLODE_BEES: + _RGB = Particle::randomColor(); + popBees(30, 10.0f, _RGB); + if (Hack::volume > 0.0f && Common::randomInt(2)) + Resources::Sounds::whistle->play(_pos); + break; + case EXPLODE_FLASH: + _RGB.set(1.0f, 1.0f, 1.0f); + _size = 150.0f; + if (Hack::volume > 0.0f) { + Resources::Sounds::boom4->play(_pos); + if (Common::randomInt(2)) + Resources::Sounds::whistle->play(_pos); + } + break; + case EXPLODE_SUCKER: + case EXPLODE_BIGMAMA: + _size = 200.0f; + break; + case EXPLODE_SHOCKWAVE: + _size = 300.0f; + break; + case EXPLODE_STRETCHER: + _size = 400.0f; + break; + case EXPLODE_STARS_FROM_BOMB: + _RGB = Particle::randomColor(); + popSphere(30, 100.0f, _RGB); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_STREAMERS_FROM_BOMB: + _RGB = Particle::randomColor(); + popStreamers(10, 100.0f, _RGB); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + case EXPLODE_METEORS_FROM_BOMB: + _RGB = Particle::randomColor(); + popMeteors(10, 100.0f, _RGB); + if (Hack::volume > 0.0f) { + switch (Common::randomInt(4)) { + case 0: Resources::Sounds::boom1->play(_pos); break; + case 1: Resources::Sounds::boom2->play(_pos); break; + case 2: Resources::Sounds::boom3->play(_pos); break; + case 3: Resources::Sounds::boom4->play(_pos); break; + } + } + break; + default: + WARN("Unknown explosion type: " << explosionType); + break; + } +} + +void Explosion::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f || _pos.y() <= 0.0f) { + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + float life = _remaining / _lifetime; + _brightness = life * life; + + Hack::illuminate(_pos, _RGB, _brightness, 640000.0f, 2560000.0f); + Hack::flare(_pos, _RGB, _brightness); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Explosion::updateCameraOnly() { + Hack::flare(_pos, _RGB, _brightness); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Explosion::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(_size, _size, _size); + glScalef(_brightness, _brightness, _brightness); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f(_RGB.r(), _RGB.g(), _RGB.b(), _brightness); + glCallList(Resources::DisplayLists::flares); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/explosion.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/explosion.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/explosion.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/explosion.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,90 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _EXPLOSION_HH +#define _EXPLOSION_HH + +#include + +#include +#include +#include + +class Explosion : public Particle { +public: + enum Type { + EXPLODE_NONE = -1, + EXPLODE_SPHERE, + EXPLODE_SPLIT_SPHERE, + EXPLODE_MULTICOLORED_SPHERE, + EXPLODE_RING, + EXPLODE_DOUBLE_SPHERE, + EXPLODE_SPHERE_INSIDE_RING, + EXPLODE_STREAMERS, + EXPLODE_METEORS, + EXPLODE_STARS_INSIDE_STREAMERS, + EXPLODE_STARS_INSIDE_METEORS, + EXPLODE_STREAMERS_INSIDE_STARS, + EXPLODE_METEORS_INSIDE_STARS, + EXPLODE_STAR_BOMBS, + EXPLODE_STREAMER_BOMBS, + EXPLODE_METEOR_BOMBS, + EXPLODE_CRACKER_BOMBS, + EXPLODE_BEES, + EXPLODE_FLASH, + EXPLODE_SPINNER, + EXPLODE_SUCKER, + EXPLODE_SHOCKWAVE, + EXPLODE_STRETCHER, + EXPLODE_BIGMAMA, + EXPLODE_STARS_FROM_BOMB, + EXPLODE_STREAMERS_FROM_BOMB, + EXPLODE_METEORS_FROM_BOMB + }; +private: + RGBColor _RGB; + float _size; + float _brightness; + + void popSphere(unsigned int, float, const RGBColor&) const; + void popSplitSphere(unsigned int, float, const RGBColor&, const RGBColor&) const; + void popMultiColorSphere(unsigned int, float, const RGBColor[3]) const; + void popRing(unsigned int, float, const RGBColor&) const; + void popStreamers(unsigned int, float, const RGBColor&) const; + void popMeteors(unsigned int, float, const RGBColor&) const; + void popStarBombs(unsigned int, float, const RGBColor&) const; + void popStreamerBombs(unsigned int, float, const RGBColor&) const; + void popMeteorBombs(unsigned int, float, const RGBColor&) const; + void popCrackerBombs(unsigned int, float) const; + void popBees(unsigned int, float, const RGBColor&) const; +public: + Explosion( + const Vector&, const Vector&, Type, + const RGBColor& = RGBColor(), float lifetime = 0.5f + ); + + void update(); + void updateCameraOnly(); + void draw() const; +}; + +#endif // _EXPLOSION_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/flares.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/flares.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/flares.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/flares.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,202 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include + +// Draw a flare at a specified (x,y) location on the screen +// Screen corners are at (0,0) and (1,1) +void Flares::draw(float x, float y, const RGBColor& RGB, float alpha) { + // Fade alpha if source is off edge of screen + float fadeWidth = float(Common::width) / 10.0f; + if (y < 0.0f) { + float temp = fadeWidth + y; + if (temp < 0.0f) + return; + alpha *= temp / fadeWidth; + } + if (y > Common::height) { + float temp = fadeWidth - y + Common::height; + if (temp < 0.0f) + return; + alpha *= temp / fadeWidth; + } + if (x < 0) { + float temp = fadeWidth + x; + if (temp < 0.0f) + return; + alpha *= temp / fadeWidth; + } + if (x > Common::width) { + float temp = fadeWidth - x + Common::width; + if (temp < 0.0f) + return; + alpha *= temp / fadeWidth; + } + + // Find lens flare vector + // This vector runs from the light source through the screen's center + float dx = 0.5f * Common::aspectRatio - x; + float dy = 0.5f - y; + + glPushAttrib(GL_COLOR_BUFFER_BIT); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + // Setup projection matrix + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluOrtho2D(0, Common::aspectRatio, 0, 1.0f); + + // Draw stuff + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + glLoadIdentity(); + glTranslatef(x + dx * 0.05f, y + dy * 0.05f, 0.0f); + glScalef(0.065f, 0.065f, 0.065f); + glColor4f(RGB.r(), RGB.g(), RGB.b(), alpha * 0.4f); + glCallList(Resources::DisplayLists::flares + 2); + + glLoadIdentity(); + glTranslatef(x + dx * 0.15f, y + dy * 0.15f, 0.0f); + glScalef(0.04f, 0.04f, 0.04f); + glColor4f(RGB.r() * 0.9f, RGB.g() * 0.9f, RGB.b(), alpha * 0.9f); + glCallList(Resources::DisplayLists::flares + 1); + + glLoadIdentity(); + glTranslatef(x + dx * 0.25f, y + dy * 0.25f, 0.0f); + glScalef(0.06f, 0.06f, 0.06f); + glColor4f(RGB.r() * 0.8f, RGB.g() * 0.8f, RGB.b(), alpha * 0.9f); + glCallList(Resources::DisplayLists::flares + 1); + + glLoadIdentity(); + glTranslatef(x + dx * 0.35f, y + dy * 0.35f, 0.0f); + glScalef(0.08f, 0.08f, 0.08f); + glColor4f(RGB.r() * 0.7f, RGB.g() * 0.7f, RGB.b(), alpha * 0.9f); + glCallList(Resources::DisplayLists::flares + 1); + + glLoadIdentity(); + glTranslatef(x + dx * 1.25f, y + dy * 1.25f, 0.0f); + glScalef(0.05f, 0.05f, 0.05f); + glColor4f(RGB.r(), RGB.g() * 0.6f, RGB.b() * 0.6f, alpha * 0.9f); + glCallList(Resources::DisplayLists::flares + 1); + + glLoadIdentity(); + glTranslatef(x + dx * 1.65f, y + dy * 1.65f, 0.0f); + glRotatef(x, 0, 0, 1); + glScalef(0.3f, 0.3f, 0.3f); + glColor4f(RGB.r(), RGB.g(), RGB.b(), alpha); + glCallList(Resources::DisplayLists::flares + 3); + + glLoadIdentity(); + glTranslatef(x + dx * 1.85f, y + dy * 1.85f, 0.0f); + glScalef(0.04f, 0.04f, 0.04f); + glColor4f(RGB.r(), RGB.g() * 0.6f, RGB.b() * 0.6f, alpha * 0.9f); + glCallList(Resources::DisplayLists::flares + 1); + + glLoadIdentity(); + glTranslatef(x + dx * 2.2f, y + dy * 2.2f, 0.0f); + glScalef(0.3f, 0.3f, 0.3f); + glColor4f(RGB.r(), RGB.g(), RGB.b(), alpha * 0.7f); + glCallList(Resources::DisplayLists::flares + 1); + + glLoadIdentity(); + glTranslatef(x + dx * 2.5f, y + dy * 2.5f, 0.0f); + glScalef(0.6f, 0.6f, 0.6f); + glColor4f(RGB.r(), RGB.g(), RGB.b(), alpha * 0.8f); + glCallList(Resources::DisplayLists::flares + 3); + + glPopMatrix(); + + // Unsetup projection matrix + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopAttrib(); +} + +// super bright elongated glow for sucker, shockwave, stretcher, and bigmama +void Flares::drawSuper(float x, float y, const RGBColor& RGB, float alpha) { + // Fade alpha if source is off edge of screen + float fadeWidth = float(Common::width) / 10.0f; + if (y < 0.0f) { + float temp = fadeWidth + y; + if (temp < 0.0f) + return; + alpha *= temp / fadeWidth; + } + if (y > Common::height) { + float temp = fadeWidth - y + Common::height; + if (temp < 0.0f) + return; + alpha *= temp / fadeWidth; + } + if (x < 0) { + float temp = fadeWidth + x; + if (temp < 0.0f) + return; + alpha *= temp / fadeWidth; + } + if (x > Common::width) { + float temp = fadeWidth - x + Common::width; + if (temp < 0.0f) + return; + alpha *= temp / fadeWidth; + } + + glPushAttrib(GL_COLOR_BUFFER_BIT); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + // Setup projection matrix + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluOrtho2D(0, Common::aspectRatio, 0, 1.0f); + + // Draw stuff + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + glLoadIdentity(); + glTranslatef(x, y, 0.0f); + glScalef(2.0f * alpha, 0.08f, 0.0f); + glColor4f(RGB.r(), RGB.g(), RGB.b(), alpha); + glCallList(Resources::DisplayLists::flares + 0); + + glLoadIdentity(); + glTranslatef(x, y, 0.0f); + glScalef(0.4f, 0.35f * alpha + 0.05f, 1.0f); + glColor4f(RGB.r(), RGB.g(), RGB.b(), alpha * 0.4f); + glCallList(Resources::DisplayLists::flares + 2); + + glPopMatrix(); + + // Unsetup projection matrix + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopAttrib(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/flares.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/flares.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/flares.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/flares.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,35 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _FLARES_HH +#define _FLARES_HH + +#include + +#include + +namespace Flares { + void draw(float, float, const RGBColor&, float); + void drawSuper(float, float, const RGBColor&, float); +}; + +#endif // _FLARES_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/fountain.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/fountain.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/fountain.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/fountain.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,89 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +void Fountain::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f) { + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + float life = _remaining / _lifetime; + _brightness = life * life; + float temp = _lifetime - _remaining; + if (temp < 0.5f) + _brightness *= temp * 2.0f; + + _starTimer += Common::elapsedTime * _brightness * + (Common::randomFloat(10.0f) + 10.0f); + unsigned int stars = (unsigned int)_starTimer; + _starTimer -= float(stars); + for (unsigned int i = 0; i < stars; i++) { + Vector starPos( + 0.0f, Common::randomFloat(Common::elapsedTime * 100.0f), 0.0f + ); + starPos += _pos; + if (starPos.y() > 50.0f) starPos.y() = 50.0f; + Hack::pending.push_back(new Star(starPos, Vector( + Common::randomFloat(20.0f) - 10.0f, + Common::randomFloat(30.0f) + 100.0f, + Common::randomFloat(20.0f) - 10.0f + ), 0.342f, Common::randomFloat(1.0f) + 2.0f, _RGB, 10.0f)); + } + + Hack::illuminate(_pos, _RGB, _brightness, 40000.0f, 0.0f); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Fountain::updateCameraOnly() { + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Fountain::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(30.0f, 30.0f, 30.0f); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f(_RGB.r(), _RGB.g(), _RGB.b(), _brightness); + glCallList(Resources::DisplayLists::flares); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/fountain.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/fountain.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/fountain.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/fountain.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _FOUNTAIN_HH +#define _FOUNTAIN_HH + +#include + +#include +#include +#include +#include +#include + +class Fountain : public Particle { +private: + RGBColor _RGB; + float _brightness; + + float _starTimer; +public: + Fountain() : Particle( + Vector( + Common::randomFloat(300.0f) - 150.0f, + 5.0f, + Common::randomFloat(300.0f) - 150.0f + ), Vector(), 0.0f, Common::randomFloat(5.0f) + 10.0f + ), _RGB(Particle::randomColor()), _brightness(0.0f), _starTimer(0.0f) { + if (Hack::volume > 0.0f) { + if (Common::randomInt(2)) + Resources::Sounds::launch1->play(_pos); + else + Resources::Sounds::launch2->play(_pos); + } + } + + void update(); + void updateCameraOnly(); + void draw() const; +}; + +#endif // _FOUNTAIN_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/launch1.ogg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/launch1.ogg differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/launch2.ogg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/launch2.ogg differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,30 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_skyrocket_SOURCES = $(COMMON) $(COLOR) $(VECTOR) $(IMAGE) $(SOUND) $(DLOPEN) \ + bee.cc bee.hh bigmama.cc bigmama.hh bomb.cc bomb.hh explosion.cc \ + explosion.hh flares.cc flares.hh fountain.cc fountain.hh meteor.cc \ + meteor.hh overlay.cc overlay.hh particle.hh resources.cc resources.hh \ + rocket.cc rocket.hh shockwave.cc shockwave.hh skyrocket.cc skyrocket.hh \ + smoke.cc smoke.hh spinner.cc spinner.hh star.cc star.hh streamer.cc \ + streamer.hh stretcher.cc stretcher.hh sucker.cc sucker.hh world.cc world.hh + +AM_CPPFLAGS += $(LIBLTDL_CPPFLAGS) $(IMAGE_CPPFLAGS) $(SOUND_CPPFLAGS) +AM_CXXFLAGS += $(IMAGE_CXXFLAGS) $(SOUND_CXXFLAGS) +AM_LDFLAGS += $(IMAGE_LDFLAGS) $(SOUND_LDFLAGS) +rs_skyrocket_LDADD = $(LIBMISC) $(LIBLTDL) $(X_LIBS) $(OPENGL_LIBS) $(IMAGE_LIBS) $(SOUND_LIBS) + +hack_PROGRAMS = rs-skyrocket + +skyrocketdatadir = $(pkgdatadir)/skyrocket +dist_skyrocketdata_DATA = cloud.png earth-far.png earth-light.png \ + earth-near.png moon.png smoke1.png smoke2.png smoke3.png smoke4.png \ + smoke5.png +if SOUND +dist_skyrocketdata_DATA += boom1.ogg boom2.ogg boom3.ogg boom4.ogg \ + launch1.ogg launch2.ogg nuke.ogg popper.ogg suck.ogg whistle.ogg +endif SOUND + +uninstall-hook: + -rmdir $(skyrocketdatadir) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/meteor.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/meteor.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/meteor.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/meteor.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,91 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +void Meteor::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f || _pos.y() <= 0.0f) { + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + _vel.y() -= Common::elapsedTime * 32.0f; + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + float temp = (_lifetime - _remaining) / _lifetime; + _brightness = 1.0f - temp * temp * temp * temp; + + Vector step(_pos - _sparkPos); + float distance = step.normalize(); + + if (distance > 10.0f) { + unsigned int n = (unsigned int)(distance / 10.0f); + step *= 10.0f; + for (unsigned int i = 0; i < n; ++i) { + Hack::pending.push_back(new Star(_sparkPos, + _vel + Vector( + Common::randomFloat(40.0f) - 20.0f, + Common::randomFloat(40.0f) - 20.0f, + Common::randomFloat(40.0f) - 20.0f + ), 2.0f, Common::randomFloat(0.5f) + 1.5f, _RGB, 10.0f + )); + _sparkPos += step; + } + } + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Meteor::updateCameraOnly() { + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Meteor::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(_size, _size, _size); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f(_RGB.r(), _RGB.g(), _RGB.b(), _brightness); + glCallList(Resources::DisplayLists::flares); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/meteor.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/meteor.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/meteor.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/meteor.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,51 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _METEOR_HH +#define _METEOR_HH + +#include + +#include +#include +#include + +class Meteor : public Particle { +private: + RGBColor _RGB; + float _size; + float _brightness; + + Vector _sparkPos; +public: + Meteor( + const Vector& pos, const Vector& vel, + float drag, float lifetime, const RGBColor& RGB, float size + ) : Particle(pos, vel, drag, lifetime), + _RGB(RGB), _size(size), _sparkPos(_pos) {} + + void update(); + void updateCameraOnly(); + void draw() const; +}; + +#endif // _METEOR_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/moon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/moon.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/nuke.ogg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/nuke.ogg differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/overlay.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/overlay.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/overlay.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/overlay.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,90 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include + +namespace Overlay { + unsigned int _lists; + float _age; + float _brightness; + + typedef std::list OverlayList; + OverlayList _overlayList; +}; + +void Overlay::init() { + _lists = Common::resources->genLists(96); + Font font = XLoadFont(Common::display, + "-adobe-helvetica-bold-r-*-*-*-180-*-*-*-*-*-*"); + glXUseXFont(font, ' ', 96, _lists); + XUnloadFont(Common::display, font); +} + +void Overlay::set(const std::string& s) { + _overlayList.clear(); + for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) + _overlayList.push_back(_lists + (*it & 0x7f) - ' '); + _age = 0.0f; +} + +void Overlay::update() { + if (_overlayList.empty()) + return; + + _age += Common::elapsedSecs; + if (_age < 2.0f) + _brightness = 1.0f; + else { + _brightness = 1.0f - (_age - 2.0f) * 4.0f; + if (_brightness <= 0.0f) + _overlayList.clear(); + } +} + +void Overlay::draw() { + if (_overlayList.empty()) + return; + + glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_TEXTURE_2D); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluOrtho2D(0, Common::width, Common::height, 0); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glColor4f(1.0f, 1.0f, 1.0f, _brightness); + glRasterPos2i(20, Common::height - 20); + std::for_each( + _overlayList.begin(), _overlayList.end(), + std::pointer_to_unary_function(&glCallList) + ); + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glPopAttrib(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/overlay.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/overlay.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/overlay.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/overlay.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,37 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _OVERLAY_HH +#define _OVERLAY_HH + +#include + +namespace Overlay { + void init(); + + void set(const std::string&); + + void update(); + void draw(); +}; + +#endif // _OVERLAY_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/particle.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/particle.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/particle.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/particle.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,130 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _PARTICLE_HH +#define _PARTICLE_HH + +#include + +#include +#include + +#define DEAD_DEPTH (-1000000.0f) +#define PARTICLE_DEAD (1 << 0) +#define PARTICLE_ROCKET (1 << 1) + +class Particle { +protected: + Vector _pos; + Vector _vel; + float _drag; + + float _lifetime; + float _remaining; + + float _depth; + + static RGBColor randomColor() { + switch (Common::randomInt(6)) { + case 0: + return RGBColor( + 1.0f, Common::randomFloat(1.0f), Common::randomFloat(0.2f) + ); + case 1: + return RGBColor( + 1.0f, Common::randomFloat(0.2f), Common::randomFloat(1.0f) + ); + case 2: + return RGBColor( + Common::randomFloat(1.0f), 1.0f, Common::randomFloat(0.2f) + ); + case 3: + return RGBColor( + Common::randomFloat(0.2f), 1.0f, Common::randomFloat(1.0f) + ); + case 4: + return RGBColor( + Common::randomFloat(1.0f), Common::randomFloat(0.2f), 1.0f + ); + default: + return RGBColor( + Common::randomFloat(0.2f), Common::randomFloat(1.0f), 1.0f + ); + } + } + + Particle( + const Vector& pos, const Vector& vel, float drag, float lifetime + ) : _pos(pos), _vel(vel), _drag(drag), _lifetime(lifetime), + _remaining(lifetime) {} +public: + virtual ~Particle() {} + + virtual void update() = 0; + virtual void updateCameraOnly() = 0; + virtual void draw() const = 0; + + bool operator<(const Particle& other) const { + return _depth > other._depth; + } + virtual void illuminate( + const Vector&, const RGBColor&, float, float + ) {} + virtual void suck(const Vector& pos, float factor) { + if (_remaining <= 0.0f) + return; + + Vector diff(pos - _pos); + float dSquared = diff.lengthSquared(); + if (dSquared < 250000.0f && dSquared > 0.0f) { + diff.normalize(); + _vel += diff * (250000.0f - dSquared) * factor; + } + } + virtual void shock(const Vector& pos, float factor) { + if (_remaining <= 0.0f) + return; + + Vector diff(_pos - pos); + float dSquared = diff.lengthSquared(); + if (dSquared < 640000.0f && dSquared > 0.0f) { + diff.normalize(); + _vel += diff * (640000.0f - dSquared) * factor; + } + } + virtual void stretch(const Vector& pos, float factor) { + if (_remaining <= 0.0f) + return; + + Vector diff(pos - _pos); + float dSquared = diff.lengthSquared(); + if (dSquared < 640000.0f && dSquared > 0.0f) { + diff.normalize(); + float temp = (640000.0f - dSquared) * factor; + _vel.x() += diff.x() * temp * 5.0f; + _vel.y() -= diff.y() * temp; + _vel.z() += diff.z() * temp * 5.0f; + } + } +}; + +#endif // _PARTICLE_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/popper.ogg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/popper.ogg differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/resources.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/resources.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/resources.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/resources.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,800 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include + +#define STARTEXSIZE 512 +#define MOONGLOWTEXSIZE 128 +#define FLARESIZE 128 +#define STARMESH 12 + +namespace Resources { + namespace Sounds { + Sound* boom1; + Sound* boom2; + Sound* boom3; + Sound* boom4; + Sound* launch1; + Sound* launch2; + Sound* nuke; + Sound* popper; + Sound* suck; + Sound* whistle; + + void _init(); + }; + + namespace Textures { + GLuint cloud; + GLuint stars; + GLuint moon; + GLuint moonGlow; + GLuint sunset; + GLuint earthNear; + GLuint earthFar; + GLuint earthLight; + GLuint smoke[5]; + GLuint flare[4]; + + void makeHeights(unsigned int, unsigned int, unsigned int*); + void _init(); + }; + + namespace DisplayLists { + GLuint flares; + GLuint rocket; + GLuint smokes; + GLuint stars; + GLuint moon; + GLuint moonGlow; + GLuint sunset; + GLuint earthNear; + GLuint earthFar; + GLuint earthLight; + + void _init(); + }; + + void init(float, const Vector&, const Vector&, const UnitQuat&); +}; + +void Resources::Sounds::_init() { + boom1 = new OGG("boom1.ogg", 1000.0f); Common::resources->manage(boom1); + boom2 = new OGG("boom2.ogg", 1000.0f); Common::resources->manage(boom2); + boom3 = new OGG("boom3.ogg", 1000.0f); Common::resources->manage(boom3); + boom4 = new OGG("boom4.ogg", 1200.0f); Common::resources->manage(boom4); + launch1 = new OGG("launch1.ogg", 10.0f); Common::resources->manage(launch1); + launch2 = new OGG("launch2.ogg", 10.0f); Common::resources->manage(launch2); + nuke = new OGG("nuke.ogg", 2000.0f); Common::resources->manage(nuke); + popper = new OGG("popper.ogg", 700.0f, 2.5f); Common::resources->manage(popper); + suck = new OGG("suck.ogg", 1500.0f); Common::resources->manage(suck); + whistle = new OGG("whistle.ogg", 700.0f); Common::resources->manage(whistle); +} + +void Resources::Textures::makeHeights(unsigned int first, unsigned int last, + unsigned int* h) { + unsigned int diff = last - first; + if (diff <= 1) return; + unsigned int middle = first + (last - first) / 2; + int newHeight = (int(h[first]) + int(h[last])) / 2 + + Common::randomInt(diff / 2) - (diff / 4); + h[middle] = (newHeight < 1) ? 1 : newHeight; + + makeHeights(first, middle, h); + makeHeights(middle, last, h); +} + +void Resources::Textures::_init() { + // Initialize cloud texture object even if clouds are not turned on. + // Sunsets and shockwaves can also use cloud texture. + PNG cloudPNG("cloud.png"); + cloud = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + cloudPNG + ); + + if (Hack::starDensity > 0) { + stdx::dim3 starMap(STARTEXSIZE); + + for (unsigned int i = 0; i < (Hack::starDensity * 20); ++i) { + unsigned int u = Common::randomInt(STARTEXSIZE - 4) + 2; + unsigned int v = Common::randomInt(STARTEXSIZE - 4) + 2; + RGBColor RGB( + 0.8627f + Common::randomFloat(0.1373f), + 0.8627f + Common::randomFloat(0.1373f), + 0.8627f + Common::randomFloat(0.1373f) + ); + switch (Common::randomInt(3)) { + case 0: RGB.r() = 1.0f; break; + case 1: RGB.g() = 1.0f; break; + case 2: RGB.b() = 1.0f; break; + } + switch (Common::randomInt(6)) { // different stars + case 0: case 1: case 2: // small + starMap(u, v, 0) = RGB.r() / 2.0f; + starMap(u, v, 1) = RGB.g() / 2.0f; + starMap(u, v, 2) = RGB.b() / 2.0f; + RGB /= 3 + Common::randomInt(6); + starMap(u + 1, v, 0) = starMap(u - 1, v, 0) = + starMap(u, v + 1, 0) = starMap(u, v - 1, 0) = RGB.r(); + starMap(u + 1, v, 1) = starMap(u - 1, v, 1) = + starMap(u, v + 1, 1) = starMap(u, v - 1, 1) = RGB.g(); + starMap(u + 1, v, 2) = starMap(u - 1, v, 2) = + starMap(u, v + 1, 2) = starMap(u, v - 1, 2) = RGB.b(); + break; + case 3: case 4: // medium + starMap(u, v, 0) = RGB.r(); + starMap(u, v, 1) = RGB.g(); + starMap(u, v, 2) = RGB.b(); + RGB /= 2; + starMap(u + 1, v, 0) = starMap(u - 1, v, 0) = + starMap(u, v + 1, 0) = starMap(u, v - 1, 0) = RGB.r(); + starMap(u + 1, v, 1) = starMap(u - 1, v, 1) = + starMap(u, v + 1, 1) = starMap(u, v - 1, 1) = RGB.g(); + starMap(u + 1, v, 2) = starMap(u - 1, v, 2) = + starMap(u, v + 1, 2) = starMap(u, v - 1, 2) = RGB.b(); + break; + case 5: // large + starMap(u, v, 0) = RGB.r(); + starMap(u, v, 1) = RGB.g(); + starMap(u, v, 2) = RGB.b(); + starMap(u + 1, v + 1, 0) = starMap(u - 1, v + 1, 0) = + starMap(u + 1, v - 1, 0) = starMap(u - 1, v - 1, 0) = + RGB.r() / 4.0f; + starMap(u + 1, v + 1, 1) = starMap(u - 1, v + 1, 1) = + starMap(u + 1, v - 1, 1) = starMap(u - 1, v - 1, 1) = + RGB.g() / 4.0f; + starMap(u + 1, v + 1, 2) = starMap(u - 1, v + 1, 2) = + starMap(u + 1, v - 1, 2) = starMap(u - 1, v - 1, 2) = + RGB.b() / 4.0f; + RGB *= 0.75; + starMap(u + 1, v, 0) = starMap(u - 1, v, 0) = + starMap(u, v + 1, 0) = starMap(u, v - 1, 0) = RGB.r(); + starMap(u + 1, v, 1) = starMap(u - 1, v, 1) = + starMap(u, v + 1, 1) = starMap(u, v - 1, 1) = RGB.g(); + starMap(u + 1, v, 2) = starMap(u - 1, v, 2) = + starMap(u, v + 1, 2) = starMap(u, v - 1, 2) = RGB.b(); + } + } + stars = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + 3, STARTEXSIZE, STARTEXSIZE, GL_RGB, GL_FLOAT, &starMap.front() + ); + } + + if (Hack::drawMoon) { + moon = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + PNG("moon.png") + ); + + if (Hack::moonGlow > 0.0f) { + stdx::dim3 moonGlowMap(MOONGLOWTEXSIZE); + + for (unsigned int i = 0; i < MOONGLOWTEXSIZE; ++i) { + for (unsigned int j = 0; j < MOONGLOWTEXSIZE; ++j) { + float u = 2 * float(i) / float(MOONGLOWTEXSIZE) - 1; + float v = 2 * float(j) / float(MOONGLOWTEXSIZE) - 1; + float temp1 = Common::clamp( + 4.0f * ((u * u) + (v * v)) * (1.0f - ((u * u) + (v * v))), + 0.0f, 1.0f + ); + temp1 = temp1 * temp1 * temp1 * temp1; + u *= 1.2f; + v *= 1.2f; + float temp2 = Common::clamp( + 4.0f * ((u * u) + (v * v)) * (1.0f - ((u * u) + (v * v))), + 0.0f, 1.0f + ); + temp2 = temp2 * temp2 * temp2 * temp2; + u *= 1.25f; + v *= 1.25f; + float temp3 = Common::clamp( + 4.0f * ((u * u) + (v * v)) * (1.0f - ((u * u) + (v * v))), + 0.0f, 1.0f + ); + temp3 = temp3 * temp3 * temp3 * temp3; + moonGlowMap(i, j, 0) = temp1 * 0.4f + temp2 * 0.4f + temp3 * 0.48f; + moonGlowMap(i, j, 1) = temp1 * 0.4f + temp2 * 0.48f + temp3 * 0.38f; + moonGlowMap(i, j, 2) = temp1 * 0.48f + temp2 * 0.4f + temp3 * 0.38f; + moonGlowMap(i, j, 3) = temp1 * 0.48f + temp2 * 0.48f + temp3 * 0.48f; + } + } + moonGlow = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + 4, MOONGLOWTEXSIZE, MOONGLOWTEXSIZE, GL_RGBA, GL_FLOAT, + &moonGlowMap.front() + ); + } + } + + if (Hack::drawSunset) { + RGBColor RGB; + if (Common::randomInt(3)) + RGB.r() = 0.2353f + Common::randomFloat(0.1647f); + else + RGB.r() = Common::randomFloat(0.4f); + RGB.g() = Common::randomFloat(RGB.r()); + if (RGB.g() < 0.0196f) + RGB.b() = 0.0392f - Common::randomFloat(RGB.r()); + + stdx::dim3 sunsetMap(cloudPNG.width(), cloudPNG.height()); + for (unsigned int i = 0; i < cloudPNG.width(); ++i) { + for (unsigned int j = 0; j < cloudPNG.height(); ++j) { + sunsetMap(i, j, 0) = RGB.r(); + sunsetMap(i, j, 1) = RGB.g(); + sunsetMap(i, j, 2) = RGB.b(); + } + } + + // Maybe clouds in sunset + if (Common::randomInt(3)) { + unsigned int xOffset = Common::randomInt(cloudPNG.width()); + unsigned int yOffset = Common::randomInt(cloudPNG.height()); + for (unsigned int i = 0; i < cloudPNG.width(); ++i) { + for (unsigned int j = 0; j < cloudPNG.height(); ++j) { + unsigned int x = (i + xOffset) % cloudPNG.width(); + unsigned int y = (j + yOffset) % cloudPNG.height(); + float cloudInfluence = cloudPNG(x, y).g(); + sunsetMap(i, j, 0) *= cloudInfluence; + cloudInfluence *= cloudPNG(x, y).r(); + sunsetMap(i, j, 1) *= cloudInfluence; + } + } + } + + std::vector mountains(cloudPNG.width() + 1); + mountains[0] = mountains[cloudPNG.width()] = Common::randomInt(10) + 5; + makeHeights(0, cloudPNG.width(), &mountains.front()); + for (unsigned int i = 0; i < cloudPNG.width(); ++i) { + for (unsigned int j = 0; j <= mountains[i]; ++j) + sunsetMap(i, j, 0) = sunsetMap(i, j, 1) = sunsetMap(i, j, 2) = 0.0f; + sunsetMap(i, mountains[i] + 1, 0) /= 4.0f; + sunsetMap(i, mountains[i] + 1, 1) /= 4.0f; + sunsetMap(i, mountains[i] + 1, 2) /= 4.0f; + sunsetMap(i, mountains[i] + 2, 0) /= 2.0f; + sunsetMap(i, mountains[i] + 2, 1) /= 2.0f; + sunsetMap(i, mountains[i] + 2, 2) /= 2.0f; + sunsetMap(i, mountains[i] + 3, 0) *= 0.75f; + sunsetMap(i, mountains[i] + 3, 1) *= 0.75f; + sunsetMap(i, mountains[i] + 3, 2) *= 0.75f; + } + + sunset = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP, GL_CLAMP, + 3, cloudPNG.width(), cloudPNG.height(), GL_RGB, GL_FLOAT, + &sunsetMap.front() + ); + } + + if (Hack::drawEarth) { + earthNear = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP, GL_CLAMP, + PNG("earth-near.png") + ); + earthFar = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP, GL_CLAMP, + PNG("earth-far.png") + ); + earthLight = Common::resources->genTexture( + GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP, GL_CLAMP, + PNG("earth-light.png") + ); + } + + for (unsigned int i = 0; i < 5; i++) { + smoke[i] = Common::resources->genTexture( + GL_NEAREST, GL_LINEAR, GL_REPEAT, GL_REPEAT, + PNG(stdx::oss() << "smoke" << (char)(i + '1') << ".png") + ); + } + + stdx::dim3 flareMap[4]; + for (unsigned int i = 0; i < 4; ++i) + flareMap[i].resize(FLARESIZE); + + for (int i = 0; i < FLARESIZE; ++i) { + for (int j = 0; j < FLARESIZE; ++j) { + float x = float(i - FLARESIZE / 2) / float(FLARESIZE / 2); + float y = float(j - FLARESIZE / 2) / float(FLARESIZE / 2); + float temp; + + // Basic flare + flareMap[0](i, j, 0) = 255; + flareMap[0](i, j, 1) = 255; + flareMap[0](i, j, 2) = 255; + temp = Common::clamp( + 1.0f - ((x * x) + (y * y)), + 0.0f, 1.0f + ); + flareMap[0](i, j, 3) = GLubyte(255.0f * temp * temp); + + // Flattened sphere + flareMap[1](i, j, 0) = 255; + flareMap[1](i, j, 1) = 255; + flareMap[1](i, j, 2) = 255; + temp = Common::clamp( + 2.5f * (1.0f - ((x * x) + (y * y))), + 0.0f, 1.0f + ); + flareMap[1](i, j, 3) = GLubyte(255.0f * temp); + + // Torus + flareMap[2](i, j, 0) = 255; + flareMap[2](i, j, 1) = 255; + flareMap[2](i, j, 2) = 255; + temp = Common::clamp( + 4.0f * ((x * x) + (y * y)) * (1.0f - ((x * x) + (y * y))), + 0.0f, 1.0f + ); + temp = temp * temp * temp * temp; + flareMap[2](i, j, 3) = GLubyte(255.0f * temp); + + // Kick-ass! + x = std::abs(x); + y = std::abs(y); + float xy = x * y; + flareMap[3](i, j, 0) = 255; + flareMap[3](i, j, 1) = 255; + temp = Common::clamp( + 0.14f * (1.0f - ((x > y) ? x : y)) / ((xy > 0.05f) ? xy : 0.05f), + 0.0f, 1.0f + ); + flareMap[3](i, j, 2) = GLubyte(255.0f * temp); + temp = Common::clamp( + 0.1f * (1.0f - ((x > y) ? x : y)) / ((xy > 0.1f) ? xy : 0.1f), + 0.0f, 1.0f + ); + flareMap[3](i, j, 3) = GLubyte(255.0f * temp); + } + } + + for (unsigned int i = 0; i < 4; ++i) + flare[i] = Common::resources->genTexture( + GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + 4, FLARESIZE, FLARESIZE, GL_RGBA, GL_UNSIGNED_BYTE, + &flareMap[i].front(), false + ); +} + +void Resources::DisplayLists::_init() { + flares = Common::resources->genLists(4); + for (unsigned int i = 0; i < 4; ++i) { + glNewList(flares + i, GL_COMPILE); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::flare[i]); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-0.5f, -0.5f, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(0.5f, -0.5f, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-0.5f, 0.5f, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(0.5f, 0.5f, 0.0f); + glEnd(); + glEndList(); + } + + rocket = Common::resources->genLists(1); + glNewList(rocket, GL_COMPILE); + // Draw rocket (10-sided cylinder) + glBegin(GL_TRIANGLE_STRIP); + glVertex3f(0.075f, 0.0f, 0.0f); + glVertex3f(0.075f, 1.0f, 0.0f); + glVertex3f(0.060676f, 0.0f, 0.033504f); + glVertex3f(0.060676f, 1.0f, 0.033504f); + glVertex3f(0.023176f, 0.0f, 0.071329f); + glVertex3f(0.023176f, 1.0f, 0.071329f); + glVertex3f(-0.023176f, 0.0f, 0.071329f); + glVertex3f(-0.023176f, 1.0f, 0.071329f); + glVertex3f(-0.060676f, 0.0f, 0.033504f); + glVertex3f(-0.060676f, 1.0f, 0.033504f); + glVertex3f(-0.075f, 0.0f, 0.0f); + glVertex3f(-0.075f, 1.0f, 0.0f); + glVertex3f(-0.060676f, 0.0f, -0.033504f); + glVertex3f(-0.060676f, 1.0f, -0.033504f); + glVertex3f(-0.023176f, 0.0f, -0.071329f); + glVertex3f(-0.023176f, 1.0f, -0.071329f); + glVertex3f(0.023176f, 0.0f, -0.071329f); + glVertex3f(0.023176f, 1.0f, -0.071329f); + glVertex3f(0.060676f, 0.0f, -0.033504f); + glVertex3f(0.060676f, 1.0f, -0.033504f); + glVertex3f(0.075f, 0.0f, 0.0f); + glVertex3f(0.075f, 1.0f, 0.0f); + glEnd(); + // bottom of rocket + glBegin(GL_TRIANGLE_STRIP); + glVertex3f(0.075f, 0.0f, 0.0f); + glVertex3f(0.060676f, 0.0f, 0.033504f); + glVertex3f(0.060676f, 0.0f, -0.033504f); + glVertex3f(0.023176f, 0.0f, 0.071329f); + glVertex3f(0.023176f, 0.0f, -0.071329f); + glVertex3f(-0.023176f, 0.0f, 0.071329f); + glVertex3f(-0.023176f, 0.0f, -0.071329f); + glVertex3f(-0.060676f, 0.0f, 0.033504f); + glVertex3f(-0.060676f, 0.0f, -0.033504f); + glVertex3f(-0.075f, 0.0f, 0.0f); + glEnd(); + // top of rocket + glBegin(GL_TRIANGLE_STRIP); + glVertex3f(0.075f, 1.0f, 0.0f); + glVertex3f(0.060676f, 1.0f, -0.033504f); + glVertex3f(0.060676f, 1.0f, 0.033504f); + glVertex3f(0.023176f, 1.0f, -0.071329f); + glVertex3f(0.023176f, 1.0f, 0.071329f); + glVertex3f(-0.023176f, 1.0f, -0.071329f); + glVertex3f(-0.023176f, 1.0f, 0.071329f); + glVertex3f(-0.060676f, 1.0f, -0.033504f); + glVertex3f(-0.060676f, 1.0f, 0.033504f); + glVertex3f(-0.075f, 1.0f, 0.0f); + glEnd(); + glEndList(); + + smokes = Common::resources->genLists(5); + for (unsigned int i = 0; i < 5; i++) { + glNewList(smokes + i, GL_COMPILE); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::smoke[i]); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-0.5f, -0.5f, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(0.5f, -0.5f, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-0.5f, 0.5f, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(0.5f, 0.5f, 0.0f); + glEnd(); + glEndList(); + } + + if (Hack::starDensity > 0) { + Vector starPos[STARMESH + 1][STARMESH / 2]; + float starCoord[STARMESH + 1][STARMESH / 2][2]; + float starBrightness[STARMESH + 1][STARMESH / 2]; + for (unsigned int j = 0; j < STARMESH / 2; ++j) { + float y = std::sin(M_PI_2 * float(j) / float(STARMESH / 2)); + for (unsigned int i = 0; i <= STARMESH; ++i) { + float x = std::cos(M_PI * 2 * float(i) / float(STARMESH)) * + std::cos(M_PI_2 * float(j) / float(STARMESH / 2)); + float z = std::sin(M_PI * 2 * float(i) / float(STARMESH)) * + std::cos(M_PI_2 * float(j) / float(STARMESH / 2)); + starPos[i][j].set( + x * 20000.0f, + 1500.0f + 18500.0f * y, + z * 20000.0f + ); + starCoord[i][j][0] = 1.2f * x * (2.5f - y); + starCoord[i][j][1] = 1.2f * z * (2.5f - y); + starBrightness[i][j] = (starPos[i][j].y() < 1501.0f) ? 0.0f : 1.0f; + } + } + + stars = Common::resources->genLists(1); + glNewList(stars, GL_COMPILE); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::stars); + for (unsigned int j = 0; j < (STARMESH / 2 - 1); ++j) { + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int i = 0; i <= STARMESH; ++i) { + glColor3f( + starBrightness[i][j + 1], + starBrightness[i][j + 1], + starBrightness[i][j + 1] + ); + glTexCoord2fv(starCoord[i][j + 1]); + glVertex3fv(starPos[i][j + 1].get()); + glColor3f( + starBrightness[i][j], + starBrightness[i][j], + starBrightness[i][j] + ); + glTexCoord2fv(starCoord[i][j]); + glVertex3fv(starPos[i][j].get()); + } + glEnd(); + } + glBegin(GL_TRIANGLE_FAN); + glColor3f(1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(0.0f, 20000.0f, 0.0f); + for (unsigned int i = 0; i <= STARMESH; ++i) { + glColor3f( + starBrightness[i][STARMESH / 2 - 1], + starBrightness[i][STARMESH / 2 - 1], + starBrightness[i][STARMESH / 2 - 1] + ); + glTexCoord2fv(starCoord[i][STARMESH / 2 - 1]); + glVertex3fv(starPos[i][STARMESH / 2 - 1].get()); + } + glEnd(); + glEndList(); + } + + if (Hack::drawMoon) { + moon = Common::resources->genLists(1); + glNewList(moon, GL_COMPILE); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::moon); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-800.0f, -800.0f, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(800.0f, -800.0f, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-800.0f, 800.0f, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(800.0f, 800.0f, 0.0f); + glEnd(); + glEndList(); + + if (Hack::moonGlow > 0.0f) { + moonGlow = Common::resources->genLists(1); + glNewList(moonGlow, GL_COMPILE); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::moonGlow); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-7000.0f, -7000.0f, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(7000.0f, -7000.0f, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-7000.0f, 7000.0f, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(7000.0f, 7000.0f, 0.0f); + glEnd(); + glEndList(); + } + } + + if (Hack::drawSunset) { + float vert[6] = { 0.0f, 7654.0f, 8000.0f, 14142.0f, 18448.0f, 20000.0f }; + sunset = Common::resources->genLists(1); + glNewList(sunset, GL_COMPILE); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::sunset); + glBegin(GL_TRIANGLE_STRIP); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(vert[0], vert[2], vert[5]); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(vert[0], vert[0], vert[5]); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(1.0f, 0.125f); + glVertex3f(-vert[1], vert[2], vert[4]); + glColor3f(0.25f, 0.25f, 0.25f); + glTexCoord2f(0.0f, 0.125f); + glVertex3f(-vert[1], vert[0], vert[4]); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(1.0f, 0.25f); + glVertex3f(-vert[3], vert[2], vert[3]); + glColor3f(0.5f, 0.5f, 0.5f); + glTexCoord2f(0.0f, 0.25f); + glVertex3f(-vert[3], vert[0], vert[3]); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(1.0f, 0.375f); + glVertex3f(-vert[4], vert[2], vert[1]); + glColor3f(0.75f, 0.75f, 0.75f); + glTexCoord2f(0.0f, 0.375f); + glVertex3f(-vert[4], vert[0], vert[1]); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(1.0f, 0.5f); + glVertex3f(-vert[5], vert[2], vert[0]); + glColor3f(1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 0.5f); + glVertex3f(-vert[5], vert[0], vert[0]); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(1.0f, 0.625f); + glVertex3f(-vert[4], vert[2], -vert[1]); + glColor3f(0.75f, 0.75f, 0.75f); + glTexCoord2f(0.0f, 0.625f); + glVertex3f(-vert[4], vert[0], -vert[1]); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(1.0f, 0.75f); + glVertex3f(-vert[3], vert[2], -vert[3]); + glColor3f(0.5f, 0.5f, 0.5f); + glTexCoord2f(0.0f, 0.75f); + glVertex3f(-vert[3], vert[0], -vert[3]); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(1.0f, 0.875f); + glVertex3f(-vert[1], vert[2], -vert[4]); + glColor3f(0.25f, 0.25f, 0.25f); + glTexCoord2f(0.0f, 0.875f); + glVertex3f(-vert[1], vert[0], -vert[4]); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(vert[0], vert[2], -vert[5]); + glColor3f(0.0f, 0.0f, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(vert[0], vert[0], -vert[5]); + glEnd(); + glEndList(); + } + + if (Hack::drawEarth) { + float lit[] = { + Hack::ambient * 0.01f, + Hack::ambient * 0.01f, + Hack::ambient * 0.01f + }; + float unlit[] = { 0.0f, 0.0f, 0.0f }; + float vert[] = { 839.68f, 8396.8f }; + float tex[] = { 0.0f, 0.45f, 0.55f, 1.0f }; + earthNear = Common::resources->genLists(1); + glNewList(earthNear, GL_COMPILE); + glColor3fv(lit); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(tex[0], tex[0]); + glVertex3f(-vert[0], 0.0f, -vert[0]); + glTexCoord2f(tex[0], tex[3]); + glVertex3f(-vert[0], 0.0f, vert[0]); + glTexCoord2f(tex[3], tex[0]); + glVertex3f(vert[0], 0.0f, -vert[0]); + glTexCoord2f(tex[3], tex[3]); + glVertex3f(vert[0], 0.0f, vert[0]); + glEnd(); + glEndList(); + earthFar = Common::resources->genLists(1); + glNewList(earthFar, GL_COMPILE); + glBegin(GL_TRIANGLE_STRIP); + glColor3fv(lit); + glTexCoord2f(tex[1], tex[1]); + glVertex3f(-vert[0], 0.0f, -vert[0]); + glTexCoord2f(tex[2], tex[1]); + glVertex3f(vert[0], 0.0f, -vert[0]); + glColor3fv(unlit); + glTexCoord2f(tex[0], tex[0]); + glVertex3f(-vert[1], 0.0f, -vert[1]); + glTexCoord2f(tex[3], tex[0]); + glVertex3f(vert[1], 0.0f, -vert[1]); + glEnd(); + glBegin(GL_TRIANGLE_STRIP); + glColor3fv(lit); + glTexCoord2f(tex[1], tex[2]); + glVertex3f(-vert[0], 0.0f, vert[0]); + glTexCoord2f(tex[1], tex[1]); + glVertex3f(-vert[0], 0.0f, -vert[0]); + glColor3fv(unlit); + glTexCoord2f(tex[0], tex[3]); + glVertex3f(-vert[1], 0.0f, vert[1]); + glTexCoord2f(tex[0], tex[0]); + glVertex3f(-vert[1], 0.0f, -vert[1]); + glEnd(); + glBegin(GL_TRIANGLE_STRIP); + glColor3fv(lit); + glTexCoord2f(tex[2], tex[2]); + glVertex3f(vert[0], 0.0f, vert[0]); + glTexCoord2f(tex[1], tex[2]); + glVertex3f(-vert[0], 0.0f, vert[0]); + glColor3fv(unlit); + glTexCoord2f(tex[3], tex[3]); + glVertex3f(vert[1], 0.0f, vert[1]); + glTexCoord2f(tex[0], tex[3]); + glVertex3f(-vert[1], 0.0f, vert[1]); + glEnd(); + glBegin(GL_TRIANGLE_STRIP); + glColor3fv(lit); + glTexCoord2f(tex[2], tex[1]); + glVertex3f(vert[0], 0.0f, -vert[0]); + glTexCoord2f(tex[2], tex[2]); + glVertex3f(vert[0], 0.0f, vert[0]); + glColor3fv(unlit); + glTexCoord2f(tex[3], tex[0]); + glVertex3f(vert[1], 0.0f, -vert[1]); + glTexCoord2f(tex[3], tex[3]); + glVertex3f(vert[1], 0.0f, vert[1]); + glEnd(); + glEndList(); + earthLight = Common::resources->genLists(1); + glNewList(earthLight, GL_COMPILE); + lit[0] = lit[1] = lit[2] = 0.4f; + glColor3fv(lit); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(tex[1], tex[1]); + glVertex3f(-vert[0], 0.0f, -vert[0]); + glTexCoord2f(tex[1], tex[2]); + glVertex3f(-vert[0], 0.0f, vert[0]); + glTexCoord2f(tex[2], tex[1]); + glVertex3f(vert[0], 0.0f, -vert[0]); + glTexCoord2f(tex[2], tex[2]); + glVertex3f(vert[0], 0.0f, vert[0]); + glEnd(); + glBegin(GL_TRIANGLE_STRIP); + glColor3fv(lit); + glTexCoord2f(tex[1], tex[1]); + glVertex3f(-vert[0], 0.0f, -vert[0]); + glTexCoord2f(tex[2], tex[1]); + glVertex3f(vert[0], 0.0f, -vert[0]); + glColor3fv(unlit); + glTexCoord2f(tex[0], tex[0]); + glVertex3f(-vert[1], 0.0f, -vert[1]); + glTexCoord2f(tex[3], tex[0]); + glVertex3f(vert[1], 0.0f, -vert[1]); + glEnd(); + glBegin(GL_TRIANGLE_STRIP); + glColor3fv(lit); + glTexCoord2f(tex[1], tex[2]); + glVertex3f(-vert[0], 0.0f, vert[0]); + glTexCoord2f(tex[1], tex[1]); + glVertex3f(-vert[0], 0.0f, -vert[0]); + glColor3fv(unlit); + glTexCoord2f(tex[0], tex[3]); + glVertex3f(-vert[1], 0.0f, vert[1]); + glTexCoord2f(tex[0], tex[0]); + glVertex3f(-vert[1], 0.0f, -vert[1]); + glEnd(); + glBegin(GL_TRIANGLE_STRIP); + glColor3fv(lit); + glTexCoord2f(tex[2], tex[2]); + glVertex3f(vert[0], 0.0f, vert[0]); + glTexCoord2f(tex[1], tex[2]); + glVertex3f(-vert[0], 0.0f, vert[0]); + glColor3fv(unlit); + glTexCoord2f(tex[3], tex[3]); + glVertex3f(vert[1], 0.0f, vert[1]); + glTexCoord2f(tex[0], tex[3]); + glVertex3f(-vert[1], 0.0f, vert[1]); + glEnd(); + glBegin(GL_TRIANGLE_STRIP); + glColor3fv(lit); + glTexCoord2f(tex[2], tex[1]); + glVertex3f(vert[0], 0.0f, -vert[0]); + glTexCoord2f(tex[2], tex[2]); + glVertex3f(vert[0], 0.0f, vert[0]); + glColor3fv(unlit); + glTexCoord2f(tex[3], tex[0]); + glVertex3f(vert[1], 0.0f, -vert[1]); + glTexCoord2f(tex[3], tex[3]); + glVertex3f(vert[1], 0.0f, vert[1]); + glEnd(); + glEndList(); + } +} + +void Resources::init() { + if (Hack::volume > 0.0f) { + try { + Sound::init( + Hack::openalSpec, Hack::volume, Hack::speedOfSound, + &Hack::cameraPos, &Hack::cameraVel, &Hack::cameraDir + ); + } catch (Sound::Unavailable e) { + Hack::volume = 0.0f; + } catch (Common::Exception e) { + WARN(e); + Hack::volume = 0.0f; + } + } + if (Hack::volume > 0.0f) { + try { + Sounds::_init(); + } catch (Sound::Unavailable e) { + Hack::volume = 0.0f; + } + } + Textures::_init(); + DisplayLists::_init(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/resources.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/resources.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/resources.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/resources.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,76 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _RESOURCES_HH +#define _RESOURCES_HH + +#include + +#include +#include + +#define CLOUDMESH 48 + +namespace Resources { + namespace Sounds { + extern Sound* boom1; + extern Sound* boom2; + extern Sound* boom3; + extern Sound* boom4; + extern Sound* launch1; + extern Sound* launch2; + extern Sound* nuke; + extern Sound* popper; + extern Sound* suck; + extern Sound* whistle; + }; + + namespace Textures { + extern GLuint cloud; + extern GLuint stars; + extern GLuint moon; + extern GLuint moonGlow; + extern GLuint sunset; + extern GLuint earthNear; + extern GLuint earthFar; + extern GLuint earthLight; + extern GLuint smoke[5]; + extern GLuint flare[4]; + }; + + namespace DisplayLists { + extern GLuint flares; + extern GLuint rocket; + extern GLuint smokes; + extern GLuint stars; + extern GLuint moon; + extern GLuint moonGlow; + extern GLuint sunset; + extern GLuint earthNear; + extern GLuint earthFar; + extern GLuint earthLight; + }; + + void init(); +}; + +#endif // _RESOURCES_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/rocket.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/rocket.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/rocket.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/rocket.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,217 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Rocket::Rocket(Explosion::Type explosionType) : + Particle( + Vector( + Common::randomFloat(200.0f) - 100.0f, + 5.0f, + Common::randomFloat(200.0f) - 100.0f + ), Vector(0.0f, 60.0f, 0.0f), 0.281f, // terminal velocity = 50 ft/s + Common::randomFloat(2.0f) + 5.0f + ), _RGB( + Common::randomFloat(0.7f) + 0.3f, + Common::randomFloat(0.7f) + 0.3f, + 0.3f + ), _brightness(0.0f), + _thrust(Common::randomFloat(100.0f) + 200.0f), + _thrustLifetime(_lifetime * (Common::randomFloat(0.1f) + 0.6f)), + _spin(Common::randomFloat(2.0f * M_PI) - M_PI), + _rotation(Common::randomFloat(std::abs(_spin) * 0.6f)), + _direction(UnitQuat::heading(Common::randomFloat(M_PI * 2))), + _smokePos(_pos), _starPos(_pos), + _explosionType(explosionType) { + // Crash the occasional rocket + if (!Common::randomInt(200)) { + _spin = 0.0f; + _rotation = Common::randomFloat(M_PI / 2.0f) + M_PI / 3.0f; + } + ++Hack::numRockets; + + if (Hack::volume > 0.0f) { + if (Common::randomInt(2)) + Resources::Sounds::launch1->play(_pos); + else + Resources::Sounds::launch2->play(_pos); + } +} + +void Rocket::update() { + _remaining -= Common::elapsedTime; + + bool alive = _remaining > 0.0f && _pos.y() >= 0.0f; + if (!alive) { + switch (_explosionType) { + case Explosion::EXPLODE_SPINNER: + Hack::pending.push_back(new Spinner(_pos, _vel)); + break; + case Explosion::EXPLODE_SUCKER: + Hack::pending.push_back(new Sucker(_pos, _vel)); + Hack::pending.push_back(new Explosion(_pos, _vel, + Explosion::EXPLODE_SUCKER, RGBColor(1.0f, 1.0f, 1.0f), 4.0f)); + break; + case Explosion::EXPLODE_STRETCHER: + Hack::pending.push_back(new Stretcher(_pos, _vel)); + Hack::pending.push_back(new Explosion(_pos, _vel, + Explosion::EXPLODE_STRETCHER, RGBColor(1.0f, 1.0f, 1.0f), 4.0f)); + break; + default: + Hack::pending.push_back(new Explosion(_pos, _vel, _explosionType)); + break; + } + _depth = DEAD_DEPTH; + --Hack::numRockets; + ++Hack::numDead; + return; + } + + if (_remaining + _thrustLifetime > _lifetime) { + _brightness += 2.0f * Common::elapsedTime; + if (_brightness > 1.0f) + _brightness = 1.0f; + } else { + _brightness -= Common::elapsedTime; + if (_brightness < 0.0f) + _brightness = 0.0f; + } + + _direction.multiplyBy(UnitQuat::heading(_spin * Common::elapsedTime)); + _direction.multiplyBy(UnitQuat::pitch(_rotation * Common::elapsedTime)); + _directionMat = RotationMatrix(_direction); + + if (_remaining + _thrustLifetime > _lifetime) + _vel += _direction.up() * _thrust * Common::elapsedTime; + + _vel.y() -= Common::elapsedTime * 32.0f; + float temp = 1.0f / (1.0f + _drag * Common::elapsedTime); + _vel *= temp * temp; + + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + Vector step(_pos - _smokePos); + float distance = step.normalize(); + + if (Hack::smoke && distance > 2.0f) { + unsigned int n = (unsigned int)(distance / 2.0f); + step *= 2.0f; + if (_remaining + _thrustLifetime > _lifetime) { + // exhaustDirection is the exhaust direction and velocity + Vector exhaustDirection(step * -_thrust * + (_remaining + _thrustLifetime - _lifetime) / _lifetime); + for (unsigned int i = 0; i < n; ++i) { + Hack::pending.push_back(new Smoke(_smokePos, + exhaustDirection + Vector( + Common::randomFloat(20.0f) - 10.0f, + Common::randomFloat(20.0f) - 10.0f, + Common::randomFloat(20.0f) - 10.0f + ))); + _smokePos += step; + } + } else { + for (unsigned int i = 0; i < n; ++i) { + Hack::pending.push_back(new Smoke(_smokePos, + Vector( + Common::randomFloat(20.0f) - 10.0f, + Common::randomFloat(20.0f) - 10.0f, + Common::randomFloat(20.0f) - 10.0f + ))); + _smokePos += step; + } + } + } + + step = _pos - _starPos; + distance = step.normalize(); + + if (_remaining + _thrustLifetime > _lifetime && distance > 2.5f) { + // starDirection is the star direction and velocity + Vector starDirection(_vel); + starDirection.normalize(); + starDirection *= _thrust * (_lifetime - _thrustLifetime - _remaining) / + _lifetime; + unsigned int n = (unsigned int)(distance / 2.5f); + step *= 2.5f; + for (unsigned int i = 0; i < n; ++i) { + Hack::pending.push_back(new Star(_starPos + Common::randomFloat(1.0f), + starDirection + Vector( + Common::randomFloat(60.0f) - 30.0f, + Common::randomFloat(60.0f) - 30.0f, + Common::randomFloat(60.0f) - 30.0f + ), 0.612f, Common::randomFloat(0.2f) + 0.1f, _RGB, + 8.0f * _remaining / _lifetime, false, + Resources::DisplayLists::flares + 3) + ); + _starPos += step; + } + } + + Hack::illuminate(_pos, _RGB, _brightness, 40000.0f, 0.0f); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Rocket::updateCameraOnly() { + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Rocket::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(3.0f, 3.0f, 3.0f); + glMultMatrixf(_directionMat.get()); + glDisable(GL_TEXTURE_2D); + glColor4f( + _RGB.r() + Hack::ambient * 0.005f, + _RGB.g() + Hack::ambient * 0.005f, + _RGB.b() + Hack::ambient * 0.005f, + _brightness + ); + glCallList(Resources::DisplayLists::rocket); + glEnable(GL_TEXTURE_2D); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/rocket.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/rocket.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/rocket.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/rocket.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,57 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _ROCKET_HH +#define _ROCKET_HH + +#include + +#include +#include +#include +#include + +class Rocket : public Particle { +private: + RGBColor _RGB; + float _brightness; + + float _thrust; + float _thrustLifetime; + float _spin; + float _rotation; + UnitQuat _direction; + RotationMatrix _directionMat; + + Vector _smokePos; + Vector _starPos; + + Explosion::Type _explosionType; +public: + Rocket(Explosion::Type); + + void update(); + void updateCameraOnly(); + void draw() const; +}; + +#endif // _ROCKET_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/shockwave.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/shockwave.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/shockwave.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/shockwave.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,214 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include + +Vector Shockwave::_geom[7][WAVESTEPS + 1]; + +void Shockwave::init() { + _geom[0][0].set(1.0f, 0.0f, 0.0f); + _geom[1][0].set(0.985f, 0.035f, 0.0f); + _geom[2][0].set(0.95f, 0.05f, 0.0f); + _geom[3][0].set(0.85f, 0.05f, 0.0f); + _geom[4][0].set(0.75f, 0.035f, 0.0f); + _geom[5][0].set(0.65f, 0.01f, 0.0f); + _geom[6][0].set(0.5f, 0.0f, 0.0f); + + for (unsigned int i = 1; i <= WAVESTEPS; ++i) { + float ch = std::cos(M_PI * 2.0f * (float(i) / float(WAVESTEPS))); + float sh = std::sin(M_PI * 2.0f * (float(i) / float(WAVESTEPS))); + for (unsigned int j = 0; j < 7; ++j) + _geom[j][i].set( + ch * _geom[j][0].x(), + _geom[j][0].y(), + sh * _geom[j][0].x() + ); + } +} + +Shockwave::Shockwave(const Vector& pos, const Vector& vel) : + Particle(pos, vel, 0.612f, 5.0f), _size(0.0f) { + RGBColor RGB(Particle::randomColor()); + for (unsigned int i = 0; i < 75; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity *= 100.0f + Common::randomFloat(10.0f); + velocity += _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(2.0f) + 2.0f, RGB, 100.0f)); + } + + RGB = Particle::randomColor(); + for (unsigned int i = 0; i < 150; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + Common::randomFloat(0.03f) - 0.005f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity *= 500.0f + Common::randomFloat(30.0f); + velocity += _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(2.0f) + 3.0f, RGB, 50.0f)); + } + + if (Hack::volume > 0.0f) + Resources::Sounds::nuke->play(_pos); +} + +void Shockwave::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f || _pos.y() <= 0.0f) { + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + _vel.y() -= Common::elapsedTime * 32.0f; + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + _life = _remaining / _lifetime; + _size += 400.0f * _life; + + Hack::shock(_pos, (1.0f - _life) * 0.002f * Common::elapsedTime); + Hack::superFlare(_pos, RGBColor(1.0f, 1.0f, 1.0f), _life); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Shockwave::updateCameraOnly() { + Hack::superFlare(_pos, RGBColor(1.0f, 1.0f, 1.0f), _life); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Shockwave::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(_size, _size, _size); + drawShockwave(_life, float(std::sqrt(_size)) * 0.08f); + if (_life > 0.7f) { + glMultMatrixf(Hack::cameraMat.get()); + glScalef(5.0f, 5.0f, 5.0f); + glColor4f(1.0f, _life, 1.0f, (_life - 0.7f) * 3.333f); + glCallList(Resources::DisplayLists::flares + 2); + } + glPopMatrix(); +} + +void Shockwave::drawShockwave(float temperature, float texMove) const { + float temp; + float alphas[7]; + if (temperature > 0.5f) { + temp = 1.0f; + alphas[0] = 1.0f; alphas[1] = 0.9f; alphas[2] = 0.8f; + alphas[3] = 0.7f; alphas[4] = 0.5f; alphas[5] = 0.3f; + alphas[6] = 0.0f; + } else { + temp = temperature * 2.0f; + alphas[0] = temp; alphas[1] = temp * 0.9f; alphas[2] = temp * 0.8f; + alphas[3] = temp * 0.7f; alphas[4] = temp * 0.5f; alphas[5] = temp * 0.3f; + alphas[6] = 0.0f; + } + RGBColor colors[7]; + for (unsigned int i = 0; i < 6; ++i) + colors[i].set(1.0f, temp, temperature); + + glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT); + glDisable(GL_CULL_FACE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::cloud); + + // draw bottom of shockwave + for (unsigned int i = 0; i < 6; ++i) { + float v1 = float(i + 1) * 0.07f - texMove; + float v2 = float(i) * 0.07f - texMove; + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int j = 0; j <= WAVESTEPS; ++j) { + float u = (float(j) / float(WAVESTEPS)) * 10.0f; + glColor4f(colors[i + 1].r(), colors[i + 1].g(), + colors[i + 1].b(), alphas[i + 1]); + glTexCoord2f(u, v1); + glVertex3fv(_geom[i + 1][j].get()); + glColor4f(colors[i].r(), colors[i].g(), colors[i].b(), + alphas[i]); + glTexCoord2f(u, v2); + glVertex3fv(_geom[i][j].get()); + } + glEnd(); + } + + // keep colors a little warmer on top (more green) + if (temperature < 0.5f) + for (unsigned int i = 1; i < 6; ++i) + colors[i].g() = temperature + 0.5f; + + // draw top of shockwave + for (unsigned int i = 0; i < 6; ++i) { + float v1 = float(i) * 0.07f - texMove; + float v2 = float(i + 1) * 0.07f - texMove; + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int j = 0; j <= WAVESTEPS; ++j) { + float u = (float(j) / float(WAVESTEPS)) * 10.0f; + glColor4f(colors[i + 1].r(), colors[i + 1].g(), + colors[i + 1].b(), alphas[i + 1]); + glTexCoord2f(u, v1); + glVertex3fv(_geom[i + 1][j].get()); + glColor4f(colors[i].r(), colors[i].g(), colors[i].b(), + alphas[i]); + glTexCoord2f(u, v2); + glVertex3fv(_geom[i][j].get()); + } + glEnd(); + } + + glPopAttrib(); +} + +void Shockwave::shock(const Vector&, float) { +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/shockwave.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/shockwave.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/shockwave.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/shockwave.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,51 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _SHOCKWAVE_HH +#define _SHOCKWAVE_HH + +#include + +#include +#include + +#define WAVESTEPS 40 + +class Shockwave : public Particle { +private: + static Vector _geom[7][WAVESTEPS + 1]; + + float _size; + float _life; +public: + Shockwave(const Vector&, const Vector&); + + static void init(); + + void update(); + void updateCameraOnly(); + void draw() const; + void drawShockwave(float, float) const; + void shock(const Vector&, float); +}; + +#endif // _SHOCKWAVE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/skyrocket.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/skyrocket.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/skyrocket.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/skyrocket.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,925 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Hack { + bool drawMoon = true; + bool drawClouds = true; + bool drawEarth = true; + bool drawIllumination = true; + bool drawSunset; + + unsigned int maxRockets = 8; + + unsigned int starDensity = 20; + float moonGlow = 20.0f; + float ambient = 10.0f; + float flares = 20.0f; + + float smoke = 5.0f; + unsigned int explosionSmoke = 0; + + float wind = 20.0f; + +#if HAVE_SOUND + float volume = 100.0f; +#else + float volume = 0.0f; +#endif + std::string openalSpec(""); + float speedOfSound = 1130.0f; +}; + +namespace Hack { + enum Arguments { + ARG_ROCKETS = 1, + ARG_SMOKE, + ARG_EXPLOSIONSMOKE, + ARG_STARS, + ARG_HALO, + ARG_AMBIENT, + ARG_WIND, + ARG_FLARES, + ARG_VOLUME, + ARG_OPENAL_SPEC, + ARG_SPEED_OF_SOUND, + ARG_MOON = 0x100, ARG_NO_MOON, + ARG_CLOUDS = 0x200, ARG_NO_CLOUDS, + ARG_EARTH = 0x300, ARG_NO_EARTH, + ARG_GLOW = 0x400, ARG_NO_GLOW + }; + + bool _action; + + enum CameraMode { + CAMERA_FIXED, + CAMERA_AUTO, + CAMERA_MANUAL + } _cameraMode; + float _cameraTimeTotal; + float _cameraTimeElapsed; + + Vector _cameraStartPos; + RotationMatrix _cameraStartDir; + Vector _cameraEndPos; + RotationMatrix _cameraEndDir; + + Vector _cameraTransPos; + UnitQuat _cameraTransDir; + float _cameraTransAngle; + UnitVector _cameraTransAxis; + + Vector cameraPos; + Vector cameraVel; + RotationMatrix cameraMat; + RotationMatrix _cameraMatInv; + UnitQuat cameraDir; + float _cameraSpeed; + + int _viewport[4]; + double _projectionMat[16]; + double _modelMat[16]; + + int _mouseX, _mouseY; + bool _leftButton, _middleButton, _rightButton; + bool _mouseInWindow; + float _mouseIdleTime; + + Explosion::Type _userDefinedExplosion; + + std::vector _particles; + std::vector pending; + struct _ParticleSorter : + public std::binary_function + { + bool operator()(const Particle* a, const Particle* b) { + return *a < *b; + } + } ParticleSorter; + unsigned int numDead; + unsigned int numRockets; + + std::list<_Illumination> _illuminationList; + std::list<_Flare> _flareList; + std::list<_Flare> _superFlareList; + std::list<_Influence> _suckList; + std::list<_Influence> _shockList; + std::list<_Influence> _stretchList; + + bool frameToggle; + + void newCameraTarget(); + void firstCamera(); + void newCamera(); + void chainCamera(); + void crashChainCamera(); + + error_t parse(int, char*, struct argp_state*); +}; + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { + switch (key) { + case ARG_ROCKETS: + if (Common::parseArg(arg, maxRockets, 1u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "maximum number of rockets must be between 1 and 100"); + return 0; + case ARG_SMOKE: + if (Common::parseArg(arg, smoke, 0.0f, 60.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "smoke lifetime must be between 0 and 60"); + return 0; + case ARG_EXPLOSIONSMOKE: + if (Common::parseArg(arg, explosionSmoke, 0u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "amount of explosion smoke must be between 0 and 100"); + return 0; + case ARG_STARS: + if (Common::parseArg(arg, starDensity, 0u, 100u)) + argp_failure(state, EXIT_FAILURE, 0, + "star field density must be between 0 and 100"); + return 0; + case ARG_HALO: + if (Common::parseArg(arg, moonGlow, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "moon halo intensity must be between 0 and 100"); + return 0; + case ARG_AMBIENT: + if (Common::parseArg(arg, ambient, 0.0f, 50.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "ambient illumination must be between 0 and 50"); + return 0; + case ARG_WIND: + if (Common::parseArg(arg, ambient, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "wind speed must be between 0 and 100"); + return 0; + case ARG_FLARES: + if (Common::parseArg(arg, flares, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "lens flare brightness must be between 0 and 100"); + return 0; + case ARG_VOLUME: + if (Common::parseArg(arg, volume, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "audio volume must be between 0 and 100"); + return 0; + case ARG_OPENAL_SPEC: + openalSpec = arg; + return 0; + case ARG_SPEED_OF_SOUND: + if (Common::parseArg(arg, speedOfSound, 500.0f, 40000.0f, 0.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "speed of sound must be 0, or between 500 and 40000"); + return 0; + case ARG_MOON: + drawMoon = true; + return 0; + case ARG_NO_MOON: + drawMoon = false; + return 0; + case ARG_CLOUDS: + drawClouds = true; + return 0; + case ARG_NO_CLOUDS: + drawClouds = false; + return 0; + case ARG_EARTH: + drawEarth = true; + return 0; + case ARG_NO_EARTH: + drawEarth = false; + return 0; + case ARG_GLOW: + drawIllumination = true; + return 0; + case ARG_NO_GLOW: + drawIllumination = false; + return 0; + case ARGP_KEY_FINI: + drawSunset = Common::randomInt(4) == 0; + return 0; + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Rocket options:" }, + { "rockets", ARG_ROCKETS, "NUM", 0, + "Maximum number of rockets (1-100, default = 8)" }, + { NULL, 0, NULL, 0, "" }, + { "smoke", ARG_SMOKE, "NUM", 0, "Smoke lifetime (0-60, default = 5)" }, + { "explosionsmoke", ARG_EXPLOSIONSMOKE, "NUM", 0, + "Amount of smoke from explosions (0-100, default = 0)" }, + { NULL, 0, NULL, 0, "Environment options:" }, + { "no-moon", ARG_NO_MOON, NULL, 0, "Do not draw the moon" }, + { "moon", ARG_MOON, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "no-clouds", ARG_NO_CLOUDS, NULL, 0, "Do not draw clouds" }, + { "clouds", ARG_CLOUDS, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "no-earth", ARG_NO_EARTH, NULL, 0, "Do not draw the earth" }, + { "earth", ARG_EARTH, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { "no-glow", ARG_NO_GLOW, NULL, 0, + "Disable illumination of smoke and clouds by rockets and explosions" }, + { "glow", ARG_GLOW, NULL, OPTION_ALIAS | OPTION_HIDDEN }, + { NULL, 0, NULL, 0, "" }, + { "stars", ARG_STARS, "NUM", 0, + "Density of star field (0-100, default = 20)" }, + { "halo", ARG_HALO, "NUM", 0, + "Intensity of moon halo (0-100, default = 20)" }, + { "ambient", ARG_AMBIENT, "NUM", 0, + "Ambient illumination (0-50, default = 10)" }, + { "wind", ARG_WIND, "NUM", 0, "Wind speed (0-100, default = 20)" }, + { NULL, 0, NULL, 0, "Other options:" }, + { "flares", ARG_FLARES, "NUM", 0, + "Lens flare brightness (0-100, default = 20)" }, +#if HAVE_SOUND + { "volume", ARG_VOLUME, "NUM", 0, "Audio volume (0-100, default = 100)" }, + { "openal-spec", ARG_OPENAL_SPEC, "SPEC", OPTION_HIDDEN }, + { "speed-of-sound", ARG_SPEED_OF_SOUND, "FPS", OPTION_HIDDEN }, +#else + { "volume", ARG_VOLUME, "NUM", OPTION_HIDDEN }, + { "openal-spec", ARG_OPENAL_SPEC, "SPEC", OPTION_HIDDEN }, + { "speed-of-sound", ARG_SPEED_OF_SOUND, "FPS", OPTION_HIDDEN }, +#endif + {} + }; + static struct argp parser = { + options, parse, NULL, "The mother of all fireworks screensavers." + }; + return &parser; +} + +std::string Hack::getShortName() { return "skyrocket"; } +std::string Hack::getName() { return "Skyrocket"; } + +void Hack::newCameraTarget() { + _cameraEndPos.set( + Common::randomFloat(6000.0f) - 3000.0f, + Common::randomFloat(1700.0f) + 5.0f, + Common::randomFloat(6000.0f) - 3000.0f + ); + _cameraTransPos = _cameraEndPos - _cameraStartPos; + _cameraEndDir = RotationMatrix::lookAt( + _cameraEndPos, + Vector( + Common::randomFloat(1000.0f) - 500.0f, + Common::randomFloat(1100.0f) + 200.0f, + Common::randomFloat(1000.0f) - 500.0f + ), + Vector(0.0f, 1.0f, 0.0f) + ).inverted(); + _cameraTransDir = + UnitQuat(RotationMatrix(_cameraStartDir).transposed() * _cameraEndDir); + _cameraTransDir.toAngleAxis(&_cameraTransAngle, &_cameraTransAxis); +} + +void Hack::firstCamera() { + _cameraTimeTotal = 20.0f; + _cameraTimeElapsed = 0.0f; + + { + _cameraStartPos.set( + Common::randomFloat(1000.0f) + 5000.0f, + 5.0f, + Common::randomFloat(4000.0f) - 2000.0f + ); + _cameraStartDir = RotationMatrix::lookAt( + _cameraStartPos, + Vector(0.0f, 1200.0f, 0.0f), + Vector(0.0f, 1.0f, 0.0f) + ).inverted(); + } + + { + _cameraEndPos.set( + Common::randomFloat(3000.0f), + 400.0f, + Common::randomFloat(3000.0f) - 1500.0f + ); + _cameraTransPos = _cameraEndPos - _cameraStartPos; + _cameraEndDir = RotationMatrix::lookAt( + _cameraEndPos, + Vector(0.0f, 1200.0f, 0.0f), + Vector(0.0f, 1.0f, 0.0f) + ).inverted(); + _cameraTransDir = UnitQuat( + RotationMatrix(_cameraStartDir).transposed() * _cameraEndDir); + _cameraTransDir.toAngleAxis(&_cameraTransAngle, &_cameraTransAxis); + } +} + +void Hack::newCamera() { + _cameraTimeTotal = Common::randomFloat(25.0f) + 5.0f; + _cameraTimeElapsed = 0.0f; + + _cameraStartPos.set( + Common::randomFloat(6000.0f) - 3000.0f, + Common::randomFloat(1700.0f) + 5.0f, + Common::randomFloat(6000.0f) - 3000.0f + ); + _cameraStartDir = RotationMatrix::lookAt( + _cameraStartPos, + Vector( + Common::randomFloat(1000.0f) - 500.0f, + Common::randomFloat(1100.0f) + 200.0f, + Common::randomFloat(1000.0f) - 500.0f + ), + Vector(0.0f, 1.0f, 0.0f) + ).inverted(); + newCameraTarget(); +} + +void Hack::chainCamera() { + _cameraTimeTotal = Common::randomFloat(25.0f) + 5.0f; + _cameraTimeElapsed = 0.0f; + + _cameraStartPos = _cameraEndPos; + _cameraStartDir = _cameraEndDir; + newCameraTarget(); +} + +void Hack::crashChainCamera() { + _cameraTimeTotal = Common::randomFloat(2.0f) + 2.0f; + _cameraTimeElapsed = 0.0f; + + _cameraStartPos = cameraPos; + _cameraStartDir = _cameraMatInv; + _cameraEndPos.set( + _cameraStartPos.x() + Common::randomFloat(800.0f) - 400.0f, + Common::randomFloat(400.0f) + 600.0f, + _cameraStartPos.z() + Common::randomFloat(800.0f) - 400.0f + ); + _cameraTransPos = _cameraEndPos - _cameraStartPos; + _cameraEndDir = RotationMatrix::lookAt( + _cameraEndPos, + _cameraStartPos, + Vector(0.0f, 1.0f, 0.0f) + ).inverted(); + _cameraTransDir = + UnitQuat(RotationMatrix(_cameraStartDir).transposed() * _cameraEndDir); + _cameraTransDir.toAngleAxis(&_cameraTransAngle, &_cameraTransAxis); +} + +void Hack::start() { + _action = true; + _cameraMode = CAMERA_AUTO; + _userDefinedExplosion = Explosion::EXPLODE_NONE; + + firstCamera(); + + _mouseX = Common::centerX; + _mouseY = Common::centerY; + _leftButton = _middleButton = _rightButton = _mouseInWindow = false; + _mouseInWindow = false; + _mouseIdleTime = 0.0f; + + glViewport(0, 0, Common::width, Common::height); + glGetIntegerv(GL_VIEWPORT, _viewport); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(90.0, Common::aspectRatio, 1.0, 10000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_TEXTURE_2D); + glFrontFace(GL_CCW); + glEnable(GL_CULL_FACE); + + Resources::init(); + Shockwave::init(); + Smoke::init(); + World::init(); + Overlay::init(); +} + +void Hack::reshape() {} + +void Hack::tick() { + // build viewing matrix + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(60.0f, Common::aspectRatio, 1.0f, 40000.0f); + glGetDoublev(GL_PROJECTION_MATRIX, _projectionMat); + + // Build modelview matrix + // Don't use gluLookAt() because it's easier to find the billboard matrix + // if we know the heading and pitch + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + switch (_cameraMode) { + case CAMERA_FIXED: + cameraVel.set(0.0f, 0.0f, 0.0f); + break; + case CAMERA_AUTO: + { + _cameraTimeElapsed += Common::elapsedSecs; + if (_cameraTimeElapsed >= _cameraTimeTotal) { + if (!Common::randomInt(30)) + newCamera(); + else + chainCamera(); + } + + // change camera position and angle + float cameraStep = 0.5f * + (1.0f - std::cos(_cameraTimeElapsed / _cameraTimeTotal * M_PI)); + Vector lastPos(cameraPos); + cameraPos = _cameraStartPos + _cameraTransPos * cameraStep; + cameraVel = cameraPos - lastPos; + cameraDir = _cameraStartDir; + cameraDir.multiplyBy( + UnitQuat(_cameraTransAngle * cameraStep, _cameraTransAxis) + ); + cameraMat = RotationMatrix(cameraDir); + _cameraMatInv = cameraMat.inverted(); + } + break; + case CAMERA_MANUAL: + { + float dx = float( + int(Common::centerX) - int(_mouseX)) / + float(Common::width); + dx *= (dx < 0.0f) ? -dx : dx; + float dy = float( + int(Common::centerY) - int(_mouseY)) / + float(Common::height); + dy *= (dy < 0.0f) ? -dy : dy; + if (_leftButton) + _cameraSpeed += Common::elapsedSecs * 400.0f; + if (_rightButton) + _cameraSpeed -= Common::elapsedSecs * 400.0f; + if (_middleButton) + _cameraSpeed = 0.0f; + _cameraSpeed = Common::clamp(_cameraSpeed, -1500.0f, 1500.0f); + cameraDir.multiplyBy( + UnitQuat::heading(2.0f * Common::elapsedSecs * Common::aspectRatio * dx) + ); + cameraDir.multiplyBy( + UnitQuat::roll(5.0f * Common::elapsedSecs * Common::aspectRatio * dx) + ); + cameraDir.multiplyBy( + UnitQuat::pitch(5.0f * Common::elapsedSecs * dy) + ); + cameraMat = RotationMatrix(cameraDir); + _cameraMatInv = cameraMat.inverted(); + cameraVel = cameraDir.forward() * _cameraSpeed * Common::elapsedSecs; + cameraPos += cameraVel; + if (drawEarth && cameraPos.y() < 5.0f) { + _particles.push_back(new Explosion( + Vector(cameraPos.x(), 50.0f, cameraPos.z()), + Vector(0.0f, 200.0f, 0.0f), + Explosion::EXPLODE_SPHERE) + ); + _particles.push_back(new Explosion( + Vector(cameraPos.x(), 1.0f, cameraPos.z()), + Vector(0.0f, 20.0f, 0.0f), + Explosion::EXPLODE_FLASH) + ); + _cameraMode = CAMERA_AUTO; + Overlay::set("Automatic camera"); + crashChainCamera(); + } + } + break; + } + + glMultMatrixf(_cameraMatInv.get()); + glTranslatef(-cameraPos.x(), -cameraPos.y(), -cameraPos.z()); + glGetDoublev(GL_MODELVIEW_MATRIX, _modelMat); + + glClear(GL_COLOR_BUFFER_BIT); + + if (_action) { + World::update(); + + static float rocketSpacing = 10.0f / float(maxRockets); + static float changeRocketTimer = 20.0f; + changeRocketTimer -= Common::elapsedTime; + if (changeRocketTimer <= 0.0f) { + float temp = Common::randomFloat(4.0f); + rocketSpacing = (temp * temp) + (10.0f / float(maxRockets)); + changeRocketTimer = Common::randomFloat(30.0f) + 10.0f; + } + + static float rocketTimer = 0.0f; + rocketTimer -= Common::elapsedTime; + if ( + (rocketTimer <= 0.0f) || + (_userDefinedExplosion != Explosion::EXPLODE_NONE) + ) { + if (numRockets < maxRockets) { + if (_userDefinedExplosion != Explosion::EXPLODE_NONE) + _particles.push_back(new Rocket(_userDefinedExplosion)); + else if (Common::randomInt(30)) { + unsigned int dist = Common::randomInt(5602); + _particles.push_back(new Rocket( + (dist < 1200) ? Explosion::EXPLODE_SPHERE : + (dist < 2400) ? Explosion::EXPLODE_SPLIT_SPHERE : + (dist < 2680) ? Explosion::EXPLODE_MULTICOLORED_SPHERE : + (dist < 2980) ? Explosion::EXPLODE_RING : + (dist < 3280) ? Explosion::EXPLODE_DOUBLE_SPHERE : + (dist < 3580) ? Explosion::EXPLODE_SPHERE_INSIDE_RING : + (dist < 3820) ? Explosion::EXPLODE_STREAMERS : + (dist < 4060) ? Explosion::EXPLODE_METEORS : + (dist < 4170) ? Explosion::EXPLODE_STARS_INSIDE_STREAMERS : + (dist < 4280) ? Explosion::EXPLODE_STARS_INSIDE_METEORS : + (dist < 4390) ? Explosion::EXPLODE_STREAMERS_INSIDE_STARS : + (dist < 4500) ? Explosion::EXPLODE_METEORS_INSIDE_STARS : + (dist < 4720) ? Explosion::EXPLODE_STAR_BOMBS : + (dist < 4940) ? Explosion::EXPLODE_STREAMER_BOMBS : + (dist < 5160) ? Explosion::EXPLODE_METEOR_BOMBS : + (dist < 5270) ? Explosion::EXPLODE_CRACKER_BOMBS : + (dist < 5380) ? Explosion::EXPLODE_BEES : + (dist < 5490) ? Explosion::EXPLODE_FLASH : + (dist < 5600) ? Explosion::EXPLODE_SPINNER : + (dist < 5601) ? Explosion::EXPLODE_SUCKER : + Explosion::EXPLODE_STRETCHER + )); + } else { + _particles.push_back(new Fountain()); + if (Common::randomInt(2)) + _particles.push_back(new Fountain()); + } + } + if (maxRockets > 0) + rocketTimer = Common::randomFloat(rocketSpacing); + else + rocketTimer = 60.0f; // arbitrary number since no rockets ever fire + if (_userDefinedExplosion != Explosion::EXPLODE_NONE) { + _userDefinedExplosion = Explosion::EXPLODE_NONE; + rocketTimer = 20.0f; + } + } + + _particles.insert(_particles.end(), pending.begin(), pending.end()); + pending.clear(); + + numDead = 0; + stdx::call_all_ptr(_particles, &Particle::update); + std::sort(_particles.begin(), _particles.end(), ParticleSorter); + + std::vector::iterator afterAlive(_particles.end() - numDead); + stdx::destroy_each_ptr(afterAlive, _particles.end()); + _particles.erase(afterAlive, _particles.end()); + + std::vector::iterator begin1(_particles.begin()); + std::vector::iterator end1(_particles.end()); + std::list<_Illumination>::iterator begin2(_illuminationList.begin()); + std::list<_Illumination>::iterator end2(_illuminationList.end()); + std::list<_Influence>::iterator begin3(_suckList.begin()); + std::list<_Influence>::iterator end3(_suckList.end()); + std::list<_Influence>::iterator begin4(_shockList.begin()); + std::list<_Influence>::iterator end4(_shockList.end()); + std::list<_Influence>::iterator begin5(_stretchList.begin()); + std::list<_Influence>::iterator end5(_stretchList.end()); + for (std::vector::iterator it1 = begin1; it1 != end1; ++it1) { + for (std::list<_Illumination>::iterator it2 = begin2; it2 != end2; ++it2) + (*it1)->illuminate(it2->pos, it2->RGB, + it2->brightness, it2->smokeDistanceSquared); + for (std::list<_Influence>::iterator it3 = begin3; it3 != end3; ++it3) + (*it1)->suck(it3->pos, it3->factor); + for (std::list<_Influence>::iterator it4 = begin4; it4 != end4; ++it4) + (*it1)->shock(it4->pos, it4->factor); + for (std::list<_Influence>::iterator it5 = begin5; it5 != end5; ++it5) + (*it1)->stretch(it5->pos, it5->factor); + } + _illuminationList.clear(); + _suckList.clear(); + _shockList.clear(); + _stretchList.clear(); + } else { + stdx::call_all_ptr(_particles, &Particle::updateCameraOnly); + std::sort(_particles.begin(), _particles.end(), ParticleSorter); + } + World::draw(); + + glEnable(GL_BLEND); + stdx::call_all_ptr(_particles, &Particle::draw); + + if (flares > 0.0f) { + std::list<_Flare>::iterator begin(_flareList.begin()); + std::list<_Flare>::iterator end(_flareList.end()); + for (std::list<_Flare>::iterator it = begin; it != end; ++it) + Flares::draw(it->x, it->y, it->RGB, it->alpha); + begin = _superFlareList.begin(); + end = _superFlareList.end(); + for (std::list<_Flare>::iterator it = begin; it != end; ++it) + Flares::drawSuper(it->x, it->y, it->RGB, it->alpha); + } + _flareList.clear(); + _superFlareList.clear(); + + if (volume) Sound::update(); + + Overlay::update(); + Overlay::draw(); + + Common::flush(); + + frameToggle = !frameToggle; +} + +void Hack::stop() { + stdx::destroy_all_ptr(pending); + stdx::destroy_all_ptr(_particles); +} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + Common::running = false; + break; + case 'a': case 'A': + _action = !_action; + if (_action) { + Common::speed = 1.0f; + Overlay::set("Action continuing"); + } else { + Common::speed = 0.0f; + Overlay::set("Action paused"); + } + break; + case 'c': case 'C': + _cameraMode = (_cameraMode == CAMERA_FIXED) ? CAMERA_AUTO : CAMERA_FIXED; + if (_cameraMode == CAMERA_AUTO) + Overlay::set("Automatic camera"); + else + Overlay::set("Fixed camera"); + break; + case 'm': case 'M': + _cameraMode = (_cameraMode == CAMERA_MANUAL) ? CAMERA_AUTO : CAMERA_MANUAL; + if (_cameraMode == CAMERA_AUTO) { + Overlay::set("Automatic camera"); + _cameraEndPos = cameraPos; + _cameraEndDir = _cameraMatInv; + chainCamera(); + } else { + Overlay::set("Mouse-controlled camera"); + _cameraSpeed = 100.0f; + } + break; + case 'n': case 'N': + Overlay::set("New camera"); + newCamera(); + break; + case 's': case 'S': + { + static bool slowMotion = false; + slowMotion = !slowMotion; + if (slowMotion) { + Common::speed = 0.125; + Overlay::set("Slow-motion"); + } else { + Common::speed = 1.0f; + Overlay::set("Normal speed"); + } + } + break; + case '1': + _userDefinedExplosion = Explosion::EXPLODE_SPHERE; + Overlay::set("Sphere of stars"); + break; + case '2': + _userDefinedExplosion = Explosion::EXPLODE_SPLIT_SPHERE; + Overlay::set("Split sphere of stars"); + break; + case '3': + _userDefinedExplosion = Explosion::EXPLODE_MULTICOLORED_SPHERE; + Overlay::set("Multicolored sphere of stars"); + break; + case '4': + _userDefinedExplosion = Explosion::EXPLODE_RING; + Overlay::set("Ring of stars"); + break; + case '5': + _userDefinedExplosion = Explosion::EXPLODE_DOUBLE_SPHERE; + Overlay::set("Double-sphere of stars"); + break; + case '6': + _userDefinedExplosion = Explosion::EXPLODE_SPHERE_INSIDE_RING; + Overlay::set("Sphere of stars inside ring of stars"); + break; + case '7': + _userDefinedExplosion = Explosion::EXPLODE_STREAMERS; + Overlay::set("Sphere of streamers"); + break; + case '8': + _userDefinedExplosion = Explosion::EXPLODE_METEORS; + Overlay::set("Sphere of meteors"); + break; + case '9': + _userDefinedExplosion = Explosion::EXPLODE_STARS_INSIDE_STREAMERS; + Overlay::set("Sphere of stars inside sphere of streamers"); + break; + case '0': + _userDefinedExplosion = Explosion::EXPLODE_STARS_INSIDE_METEORS; + Overlay::set("Sphere of stars inside sphere of meteors"); + break; + case 'q': case 'Q': + _userDefinedExplosion = Explosion::EXPLODE_STREAMERS_INSIDE_STARS; + Overlay::set("Sphere of streamers inside sphere of stars"); + break; + case 'w': case 'W': + _userDefinedExplosion = Explosion::EXPLODE_METEORS_INSIDE_STARS; + Overlay::set("Sphere of meteors inside sphere of stars"); + break; + case 'e': case 'E': + _userDefinedExplosion = Explosion::EXPLODE_STAR_BOMBS; + Overlay::set("Star bombs"); + break; + case 'r': case 'R': + _userDefinedExplosion = Explosion::EXPLODE_STREAMER_BOMBS; + Overlay::set("Streamer bombs"); + break; + case 't': case 'T': + _userDefinedExplosion = Explosion::EXPLODE_METEOR_BOMBS; + Overlay::set("Meteor bombs"); + break; + case 'y': case 'Y': + _userDefinedExplosion = Explosion::EXPLODE_CRACKER_BOMBS; + Overlay::set("Cracker bombs"); + break; + case 'u': case 'U': + _userDefinedExplosion = Explosion::EXPLODE_BEES; + Overlay::set("Bees"); + break; + case 'i': case 'I': + _userDefinedExplosion = Explosion::EXPLODE_FLASH; + Overlay::set("Flash-bang"); + break; + case 'o': case 'O': + _userDefinedExplosion = Explosion::EXPLODE_SPINNER; + Overlay::set("Spinner"); + break; + case '{': + _userDefinedExplosion = Explosion::EXPLODE_SUCKER; + Overlay::set("Sucker and shockwave"); + break; + case '}': + _userDefinedExplosion = Explosion::EXPLODE_STRETCHER; + Overlay::set("Stretcher and Big Mama"); + break; + case '/': + TRACE("Particles: " << _particles.size()); + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} + +void Hack::pointerMotion(int x, int y) { + _mouseX = x; + _mouseY = y; + _mouseIdleTime = 0.0f; +} + +void Hack::buttonPress(unsigned int button) { + switch (button) { + case Button1: + _leftButton = true; + break; + case Button2: + _middleButton = true; + break; + case Button3: + _rightButton = true; + break; + } + _mouseIdleTime = 0.0f; +} + +void Hack::buttonRelease(unsigned int button) { + switch (button) { + case Button1: + _leftButton = false; + break; + case Button2: + _middleButton = false; + break; + case Button3: + _rightButton = false; + break; + } + _mouseIdleTime = 0.0f; +} + +void Hack::pointerEnter() { + _mouseInWindow = true; + _mouseIdleTime = 0.0f; +} + +void Hack::pointerLeave() { + _mouseInWindow = false; + _mouseIdleTime = 0.0f; +} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS Create(void* hdl, void* props) +{ + if (!props) + return STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + + return STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void Stop() +{ + Hack::stop(); +} + +void Destroy() +{ +} + +ADDON_STATUS GetStatus() +{ + return STATUS_OK; +} + +bool HasSettings() +{ + return false; +} + +unsigned int GetSettings(StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS SetSetting(const char *settingName, const void *settingValue) +{ + return STATUS_OK; +} + +void Remove() +{ +} + +void FreeSettings() +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/skyrocket.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/skyrocket.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/skyrocket.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/skyrocket.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,208 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _SKYROCKET_HH +#define _SKYROCKET_HH + +#include + +#include +#include +#include + +// User-supplied parameters +namespace Hack { + extern bool drawMoon; + extern bool drawClouds; + extern bool drawEarth; + extern bool drawIllumination; + extern bool drawSunset; + + extern unsigned int maxRockets; + + extern unsigned int starDensity; + extern float moonGlow; + extern float ambient; + extern float flares; + + extern float smoke; + extern unsigned int explosionSmoke; + + extern float wind; + + extern float volume; + extern std::string openalSpec; + extern float speedOfSound; +}; + +#include +#include +#include + +// Public stuff +namespace Hack { + extern std::vector pending; + extern unsigned int numDead; + extern unsigned int numRockets; + + extern Vector cameraPos; + extern Vector cameraVel; + extern UnitQuat cameraDir; + extern RotationMatrix cameraMat; + + extern bool frameToggle; + + inline void illuminate( + const Vector&, const RGBColor&, + float, float, float + ); + inline void flare(const Vector&, const RGBColor&, float); + inline void superFlare(const Vector&, const RGBColor&, float); + inline void suck(const Vector&, float); + inline void shock(const Vector&, float); + inline void stretch(const Vector&, float); +}; + +// Private stuff +namespace Hack { + extern int _viewport[4]; + extern double _projectionMat[16]; + extern double _modelMat[16]; + + struct _Illumination { + Vector pos; + RGBColor RGB; + float brightness; + float smokeDistanceSquared; + }; + extern std::list<_Illumination> _illuminationList; + + struct _Flare { + float x; + float y; + RGBColor RGB; + float alpha; + }; + extern std::list<_Flare> _flareList; + extern std::list<_Flare> _superFlareList; + + struct _Influence { + Vector pos; + float factor; + }; + extern std::list<_Influence> _suckList; + extern std::list<_Influence> _shockList; + extern std::list<_Influence> _stretchList; +}; + +inline void Hack::illuminate( + const Vector& pos, const RGBColor& RGB, + float brightness, float smokeDistanceSquared, + float cloudDistanceSquared +) { + if (!drawIllumination) + return; + + RGBColor newRGB(RGB * 0.6f + 0.4f); + + if (smokeDistanceSquared > 0.0f) { + _Illumination ill = { pos, RGB, brightness, smokeDistanceSquared }; + _illuminationList.push_back(ill); + } + + if (drawClouds && cloudDistanceSquared > 0.0f) + World::illuminateClouds( + pos, newRGB, brightness, cloudDistanceSquared + ); +} + +inline void Hack::flare( + const Vector& pos, const RGBColor& RGB, float brightness +) { + Vector diff(pos - cameraPos); + UnitVector forwards(cameraDir.forward()); + if (Vector::dot(diff, forwards) <= 1.0f) + return; + + double winX, winY, winZ; + gluProject( + pos.x(), pos.y(), pos.z(), + _modelMat, _projectionMat, _viewport, + &winX, &winY, &winZ + ); + + float attenuation = 1.0f - diff.length() * 0.0001f; + if (attenuation < 0.0f) + attenuation = 0.0f; + _Flare flare = { + winX * Common::aspectRatio / Common::width, + winY / Common::height, + RGB, + brightness * flares * 0.01f * attenuation + }; + _flareList.push_back(flare); +} + +inline void Hack::superFlare( + const Vector& pos, const RGBColor& RGB, float brightness +) { + Vector diff(pos - cameraPos); + UnitVector forwards(cameraDir.forward()); + if (Vector::dot(diff, forwards) <= 1.0f) + return; + + double winX, winY, winZ; + gluProject( + pos.x(), pos.y(), pos.z(), + _modelMat, _projectionMat, _viewport, + &winX, &winY, &winZ + ); + + float attenuation = 1.0f - diff.length() * 0.00005f; + if (attenuation < 0.0f) + attenuation = 0.0f; + float temp = 1.0f - (brightness - 0.5f) * flares * 0.02f; + _Flare flare = { + winX * Common::aspectRatio / Common::width, + winY / Common::height, + RGB, + (1.0f - temp * temp * temp * temp) * attenuation + }; + _flareList.push_back(flare); +} + +inline void Hack::suck(const Vector& pos, float factor) { + _Influence suck = { pos, factor }; + _suckList.push_back(suck); +} + +inline void Hack::shock(const Vector& pos, float factor) { + _Influence shock = { pos, factor }; + _shockList.push_back(shock); +} + +inline void Hack::stretch(const Vector& pos, float factor) { + _Influence stretch = { pos, factor }; + _stretchList.push_back(stretch); +} + +#endif // _SKYROCKET_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke1.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke1.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke2.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke2.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke3.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke3.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke4.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke4.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke5.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke5.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,97 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include + +float Smoke::_times[] = { 0.4f, 0.8f, 0.4f, 2.0f, 0.4f, 0.8f, 0.4f, 4.0f }; +unsigned int Smoke::_timeIndex; + +void Smoke::update() { + if (Hack::frameToggle != _frameToggle) { + _addedRGB.set(0.0f, 0.0f, 0.0f); + _frameToggle = Hack::frameToggle; + } + + _remaining -= Common::elapsedTime; + if (_remaining <= 0.0f || _pos.y() < 0.0f) { + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + _brightness = _remaining / _lifetime * 0.7f; + _size += (30.0f - _size) * (1.2f * Common::elapsedTime); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Smoke::updateCameraOnly() { + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Smoke::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(_size, _size, _size); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f( + _RGB.r() + _addedRGB.r(), + _RGB.g() + _addedRGB.g(), + _RGB.b() + _addedRGB.b(), + _brightness + ); + glCallList(_list); + glPopMatrix(); +} + +void Smoke::illuminate(const Vector& pos, const RGBColor& RGB, + float brightness, float smokeDistanceSquared) { + if (Hack::frameToggle != _frameToggle) { + _addedRGB.set(0.0f, 0.0f, 0.0f); + _frameToggle = Hack::frameToggle; + } + float dSquared = (_pos - pos).lengthSquared(); + if (dSquared < smokeDistanceSquared) { + float temp = (smokeDistanceSquared - dSquared) / smokeDistanceSquared; + temp *= temp * brightness; + _addedRGB += RGB * temp; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/smoke.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,72 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _SMOKE_HH +#define _SMOKE_HH + +#include + +#include +#include +#include +#include +#include + +class Smoke : public Particle { +private: + RGBColor _RGB; + RGBColor _addedRGB; + float _brightness; + float _size; + unsigned int _list; + bool _frameToggle; + + static float _times[8]; + static unsigned int _timeIndex; +public: + static void init() { + for (unsigned int i = 0; i < 7; ++i) + if (_times[i] > Hack::smoke) + _times[i] = Hack::smoke; + _times[7] = Hack::smoke; + } + + Smoke(const Vector& pos, const Vector& vel) : + Particle(pos, vel, 2.0f, _times[_timeIndex]), _RGB( + 0.01f * Hack::ambient, + 0.01f * Hack::ambient, + 0.01f * Hack::ambient + ), _addedRGB(0.0f, 0.0f, 0.0f), _size(0.1f), + _list(Resources::DisplayLists::smokes + Common::randomInt(5)), + _frameToggle(false) + { + _timeIndex = (_timeIndex + 1) % 8; + } + + void update(); + void updateCameraOnly(); + void draw() const; + + void illuminate(const Vector&, const RGBColor&, float, float); +}; + +#endif // _SMOKE_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/spinner.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/spinner.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/spinner.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/spinner.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,101 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +void Spinner::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f || _pos.y() < 0.0f) { + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + float life = _remaining / _lifetime; + _brightness = life * life; + float temp = _lifetime - _remaining; + if (temp < 0.5f) + _brightness *= temp * 2.0f; + + _vel.y() -= Common::elapsedTime * 32.0f; + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + Vector crossVector(Vector::cross(Vector(1.0f, 0.0f, 0.0f), _spinAxis)); + crossVector.normalize(); + crossVector *= 400.0f; + + float dr = _radialVelocity * Common::elapsedTime; + _starTimer += Common::elapsedTime * _brightness * + (Common::randomFloat(10.0f) + 90.0f); + unsigned int stars = (unsigned int)(_starTimer); + _starTimer -= float(stars); + for (unsigned int i = 0; i < stars; ++i) { + Hack::pending.push_back(new Star(_pos, _vel - RotationMatrix( + UnitQuat( + _radialPosition + Common::randomFloat(dr), + _spinAxis + ) + ).transform(crossVector) + Vector( + Common::randomFloat(20.0f) - 10.0f, + Common::randomFloat(20.0f) - 10.0f, + Common::randomFloat(20.0f) - 10.0f + ), 0.612f, Common::randomFloat(0.5f) + 1.5f, _RGB, 15.0f)); + } + _radialPosition += dr; + if (_radialPosition > M_PI * 2) + _radialPosition -= M_PI * 2; + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Spinner::updateCameraOnly() { + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Spinner::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(20.0f, 20.0f, 20.0f); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f(_RGB.r(), _RGB.g(), _RGB.b(), _brightness); + glCallList(Resources::DisplayLists::flares); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/spinner.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/spinner.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/spinner.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/spinner.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,72 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _SPINNER_HH +#define _SPINNER_HH + +#include + +#include +#include +#include +#include +#include + +class Spinner : public Particle { +private: + RGBColor _RGB; + float _brightness; + + float _radialVelocity; + float _radialPosition; + UnitVector _spinAxis; + + float _starTimer; +public: + Spinner(const Vector& pos, const Vector& vel) : + Particle(pos, vel, 0.612f, // terminal velocity = 20 ft/s + Common::randomFloat(2.0f) + 6.0f + ), _RGB(Particle::randomColor()), _brightness(0.0f), + _radialVelocity(Common::randomFloat(3.0f) + 12.0f), + _radialPosition(0.0f), + _spinAxis(UnitVector::of( + Vector( + Common::randomFloat(2.0f) - 1.0f, + Common::randomFloat(2.0f) - 1.0f, + Common::randomFloat(2.0f) - 1.0f + ) + )), _starTimer(0.0f) + { + if (Hack::volume > 0.0f) { + if (Common::randomInt(2)) + Resources::Sounds::launch1->play(_pos); + else + Resources::Sounds::launch2->play(_pos); + } + } + + void update(); + void updateCameraOnly(); + void draw() const; +}; + +#endif // _SPINNER_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/star.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/star.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/star.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/star.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,92 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include + +void Star::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f || _pos.y() <= 0.0f) { + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + _vel.y() -= Common::elapsedTime * 32.0f; + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + float temp = (_lifetime - _remaining) / _lifetime; + _brightness = 1.0f - temp * temp * temp * temp; + + if (_smoker && Hack::smoke) { + Vector step(_pos - _smokePos); + float distance = step.normalize(); + + if (distance > 2.0f) { + unsigned int n = (unsigned int)(distance / 2.0f); + step *= 2.0f; + for (unsigned int i = 0; i < n; ++i) { + Hack::pending.push_back(new Smoke(_smokePos, + Vector( + Common::randomFloat(20.0f) - 10.0f, + Common::randomFloat(20.0f) - 10.0f, + Common::randomFloat(20.0f) - 10.0f + )) + ); + _smokePos += step; + } + } + } + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Star::updateCameraOnly() { + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Star::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(_size, _size, _size); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f(_RGB.r(), _RGB.g(), _RGB.b(), _brightness); + glCallList(_list); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/star.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/star.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/star.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/star.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,57 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _STAR_HH +#define _STAR_HH + +#include + +#include +#include +#include +#include + +class Star : public Particle { +private: + RGBColor _RGB; + float _size; + float _brightness; + + bool _smoker; + Vector _smokePos; + + unsigned int _list; +public: + Star( + const Vector& pos, const Vector& vel, float drag, float lifetime, + const RGBColor& RGB, float size, bool smoker = false, + unsigned int list = Resources::DisplayLists::flares + ) : + Particle(pos, vel, drag, lifetime), _RGB(RGB), _size(size), + _smoker(smoker), _smokePos(_pos), _list(list) {} + + void update(); + void updateCameraOnly(); + void draw() const; +}; + +#endif // _STAR_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/streamer.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/streamer.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/streamer.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/streamer.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,93 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include + +void Streamer::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f || _pos.y() <= 0.0f) { + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + _vel.y() -= Common::elapsedTime * 32.0f; + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + float temp = (_lifetime - _remaining) / _lifetime; + _brightness = 1.0f - temp * temp * temp * temp; + + Vector step(_pos - _sparkPos); + float distance = step.normalize(); + + if (distance > 25.0f) { + unsigned int n = (unsigned int)(distance / 25.0f); + step *= 25.0f; + for (unsigned int i = 0; i < n; ++i) { + Hack::pending.push_back(new Star(_sparkPos, + _vel + Vector( + Common::randomFloat(80.0f) - 40.0f, + Common::randomFloat(80.0f) - 40.0f, + Common::randomFloat(80.0f) - 40.0f + ), 2.5f, Common::randomFloat(2.0f) + 1.0f, RGBColor(1.0f, 0.8f, 0.6f), + Common::randomFloat(8.0f) + 4.0f + )); + _sparkPos += step; + } + } + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Streamer::updateCameraOnly() { + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Streamer::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(_size, _size, _size); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f(_RGB.r(), _RGB.g(), _RGB.b(), _brightness); + glCallList(Resources::DisplayLists::flares); + glPopMatrix(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/streamer.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/streamer.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/streamer.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/streamer.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,51 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _STREAMER_HH +#define _STREAMER_HH + +#include + +#include +#include +#include + +class Streamer : public Particle { +private: + RGBColor _RGB; + float _size; + float _brightness; + + Vector _sparkPos; +public: + Streamer( + const Vector& pos, const Vector& vel, float drag, float lifetime, + const RGBColor& RGB, float size + ) : Particle(pos, vel, drag, lifetime), _RGB(RGB), _size(size), + _sparkPos(_pos) {} + + void update(); + void updateCameraOnly(); + void draw() const; +}; + +#endif // _STREAMER_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/stretcher.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/stretcher.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/stretcher.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/stretcher.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,148 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +Stretcher::Stretcher(const Vector& pos, const Vector& vel) : + Particle(pos, vel, 0.612f, 4.0f) { + RGBColor RGB(Particle::randomColor()); + + for (unsigned int i = 0; i < 80; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + 0.0f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity.x() *= 400.0f + Common::randomFloat(30.0f); + velocity.y() += Common::randomFloat(70.0f) - 35.0f; + velocity.z() *= 400.0f + Common::randomFloat(30.0f); + velocity += _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(2.0f) + 2.0f, RGB, 30.0f)); + } + + RGB = Particle::randomColor(); + + for (unsigned int i = 0; i < 80; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + 0.0f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity.x() *= 700.0f + Common::randomFloat(50.0f); + velocity.y() += Common::randomFloat(70.0f) - 35.0f; + velocity.z() *= 700.0f + Common::randomFloat(50.0f); + velocity += _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(2.0f) + 2.0f, RGB, 30.0f)); + } + + RGB = Particle::randomColor(); + + for (unsigned int i = 0; i < 80; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + 0.0f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + velocity.x() *= 550.0f + Common::randomFloat(40.0f); + velocity.y() += Common::randomFloat(70.0f) - 35.0f; + velocity.z() *= 550.0f + Common::randomFloat(40.0f); + velocity += _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(2.0f) + 2.0f, RGB, 30.0f)); + } + + if (Hack::volume > 0.0f) + Resources::Sounds::suck->play(_pos); +} + +void Stretcher::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f || _pos.y() <= 0.0f) { + Hack::pending.push_back(new BigMama(_pos, _vel)); + Hack::pending.push_back(new Explosion(_pos, _vel, + Explosion::EXPLODE_BIGMAMA, RGBColor(1.0f, 1.0f, 1.0f), 2.5f)); + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + _vel.y() -= Common::elapsedTime * 32.0f; + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + float life = _remaining / _lifetime; + _brightness = 1.0f - ((1.0f - life) * (1.0f - life)); + _size = 400.0f * _brightness; + + Hack::stretch(_pos, (1.0f - life) * 0.002f * Common::elapsedTime); + Hack::superFlare(_pos, RGBColor(1.0f, 1.0f, 1.0f), _brightness); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Stretcher::updateCameraOnly() { + Hack::superFlare(_pos, RGBColor(1.0f, 1.0f, 1.0f), _brightness); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Stretcher::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(_size, _size, _size); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f(1.0f, 1.0f, 1.0f, _brightness); + glCallList(Resources::DisplayLists::flares + 3); + glPopMatrix(); +} + +void Stretcher::stretch(const Vector&, float) { +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/stretcher.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/stretcher.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/stretcher.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/stretcher.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,44 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _STRETCHER_HH +#define _STRETCHER_HH + +#include + +#include +#include + +class Stretcher : public Particle { +private: + float _size; + float _brightness; +public: + Stretcher(const Vector&, const Vector&); + + void update(); + void updateCameraOnly(); + void draw() const; + void stretch(const Vector&, float); +}; + +#endif // _STRETCHER_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/sucker.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/sucker.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/sucker.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/sucker.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,155 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +Sucker::Sucker(const Vector& pos, const Vector& vel) : + Particle(pos, vel, 0.612f, 4.0f) { + RGBColor RGB(Particle::randomColor()); + float heading = Common::randomFloat(M_PI); + float pitch = Common::randomFloat(M_PI); + float ch = std::cos(heading); + float sh = std::sin(heading); + float cp = std::cos(pitch); + float sp = std::sin(pitch); + + for (unsigned int i = 0; i < 90; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + 0.0f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + float rx = velocity.x(); + float rz = velocity.z(); + float ry = sp * rz; + rz = cp * rz; + float temp = rx; + rx = ch * temp + sh * ry; + ry = -sh * temp + ch * ry; + rx *= 350.0f + Common::randomFloat(30.0f); + ry *= 350.0f + Common::randomFloat(30.0f); + rz *= 350.0f + Common::randomFloat(30.0f); + + velocity = Vector(rx, ry, rz) + _vel; + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(2.0f) + 2.0f, RGB, 30.0f)); + } + + RGB = Particle::randomColor(); + heading = Common::randomFloat(M_PI); + pitch = Common::randomFloat(M_PI); + ch = std::cos(heading); + sh = std::sin(heading); + cp = std::cos(pitch); + sp = std::sin(pitch); + + for (unsigned int i = 0; i < 90; ++i) { + Vector velocity( + Common::randomFloat(1.0f) - 0.5f, + 0.0f, + Common::randomFloat(1.0f) - 0.5f + ); + velocity.normalize(); + float rx = velocity.x(); + float rz = velocity.z(); + float ry = sp * rz; + rz = cp * rz; + float temp = rx; + rx = ch * temp + sh * ry; + ry = -sh * temp + ch * ry; + rx *= 600.0f + Common::randomFloat(50.0f); + ry *= 600.0f + Common::randomFloat(50.0f); + rz *= 600.0f + Common::randomFloat(50.0f); + + Hack::pending.push_back(new Star(_pos, velocity, 0.612f, + Common::randomFloat(2.0f) + 2.0f, RGB, 30.0f)); + } + + if (Hack::volume > 0.0f) + Resources::Sounds::suck->play(_pos); +} + +void Sucker::update() { + _remaining -= Common::elapsedTime; + + if (_remaining <= 0.0f || _pos.y() <= 0.0f) { + Hack::pending.push_back(new Shockwave(_pos, _vel)); + Hack::pending.push_back(new Explosion(_pos, _vel, + Explosion::EXPLODE_SHOCKWAVE, RGBColor(1.0f, 1.0f, 1.0f), 3.0f)); + _depth = DEAD_DEPTH; + ++Hack::numDead; + return; + } + + _vel.y() -= Common::elapsedTime * 32.0f; + _pos += _vel * Common::elapsedTime; + _pos.x() += + (0.1f - 0.00175f * _pos.y() + 0.0000011f * _pos.y() * _pos.y()) * + Hack::wind * Common::elapsedTime; + + _brightness = _remaining / _lifetime; + _size = 250.0f * _brightness; + + Hack::suck(_pos, (1.0f - _brightness) * 0.01f * Common::elapsedTime); + Hack::superFlare(_pos, RGBColor(1.0f, 1.0f, 1.0f), _brightness); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Sucker::updateCameraOnly() { + Hack::superFlare(_pos, RGBColor(1.0f, 1.0f, 1.0f), _brightness); + + Vector diff(Hack::cameraPos - _pos); + _depth = diff.x() * Hack::cameraMat.get(8) + + diff.y() * Hack::cameraMat.get(9) + + diff.z() * Hack::cameraMat.get(10); +} + +void Sucker::draw() const { + if (_depth < 0.0f) + return; + + glPushMatrix(); + glTranslatef(_pos.x(), _pos.y(), _pos.z()); + glScalef(_size, _size, _size); + glMultMatrixf(Hack::cameraMat.get()); + glColor4f(1.0f, 1.0f, 1.0f, _brightness); + glCallList(Resources::DisplayLists::flares + 2); + glPopMatrix(); +} + +void Sucker::suck(const Vector&, float) { +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/sucker.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/sucker.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/sucker.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/sucker.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,44 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _SUCKER_HH +#define _SUCKER_HH + +#include + +#include +#include + +class Sucker : public Particle { +private: + float _size; + float _brightness; +public: + Sucker(const Vector&, const Vector&); + + void update(); + void updateCameraOnly(); + void draw() const; + void suck(const Vector&, float); +}; + +#endif // _SUCKER_HH Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/suck.ogg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/suck.ogg differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/whistle.ogg and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/whistle.ogg differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/world.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/world.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/world.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/world.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,201 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +namespace World { + Vector _cloudPos[CLOUDMESH + 1][CLOUDMESH + 1]; + float _cloudCoord[CLOUDMESH + 1][CLOUDMESH + 1][2]; + float _cloudBrightness[CLOUDMESH + 1][CLOUDMESH + 1]; + RGBColor _cloudColor[CLOUDMESH + 1][CLOUDMESH + 1]; +}; + +void World::init() { + if (Hack::drawClouds) { + for (unsigned int j = 0; j <= CLOUDMESH; ++j) { + for (unsigned int i = 0; i <= CLOUDMESH; ++i) { + _cloudPos[i][j].x() = 40000.0f * float(i) / float(CLOUDMESH) - 20000.0f; + _cloudPos[i][j].z() = 40000.0f * float(j) / float(CLOUDMESH) - 20000.0f; + float x = std::abs(2 * float(i) / float(CLOUDMESH) - 1); + float z = std::abs(2 * float(j) / float(CLOUDMESH) - 1); + _cloudPos[i][j].y() = 2000.0f - 1000.0f * float(x * x + z * z); + _cloudCoord[i][j][0] = -float(i) / float(CLOUDMESH / 6); + _cloudCoord[i][j][1] = -float(j) / float(CLOUDMESH / 6); + _cloudBrightness[i][j] = (_cloudPos[i][j].y() - 1000.0f) * + 0.00001f * Hack::ambient; + if (_cloudBrightness[i][j] < 0.0f) + _cloudBrightness[i][j] = 0.0f; + } + } + } +} + +void World::update() { + if (Hack::drawClouds) { + // Blow clouds (particles should get the same drift at 2000 feet) + // Maximum wind is 100 and texture repeats every 6666.67 feet + // so 100 * 0.00015 * 6666.67 = 100 ft/sec maximum windspeed. + static float cloudShift = 0.0f; + cloudShift += 0.00015f * Hack::wind * Common::elapsedTime; + if (cloudShift > 1.0f) + cloudShift -= 1.0f; + for (unsigned int j = 0; j <= CLOUDMESH; ++j) { + for (unsigned int i = 0; i <= CLOUDMESH; ++i) { + _cloudColor[i][j].set( + _cloudBrightness[i][j], + _cloudBrightness[i][j], + _cloudBrightness[i][j] + ); // darken clouds + _cloudCoord[i][j][0] = -float(i) * 1.0f / float(CLOUDMESH / 6) + cloudShift; + } + } + } +} + +void World::draw() { + static float moonRotation = Common::randomFloat(360.0f); + static float moonHeight = Common::randomFloat(40.0f) + 20.0f; + + glMatrixMode(GL_MODELVIEW); + + if (Hack::starDensity > 0) { + glPushAttrib(GL_COLOR_BUFFER_BIT); + glDisable(GL_BLEND); + glCallList(Resources::DisplayLists::stars); + glPopAttrib(); + } + + if (Hack::drawMoon) { + glPushMatrix(); + glRotatef(moonRotation, 0, 1, 0); + glRotatef(moonHeight, 1, 0, 0); + glTranslatef(0.0f, 0.0f, -20000.0f); + glCallList(Resources::DisplayLists::moon); + glPopMatrix(); + } + + if (Hack::drawClouds) { + glPushMatrix(); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::cloud); + glTranslatef(0.0f, 0.0f, 0.0f); + for (unsigned int j = 0; j < CLOUDMESH; ++j) { + glBegin(GL_TRIANGLE_STRIP); + for (unsigned int i = 0; i <= CLOUDMESH; ++i) { + glColor3fv(_cloudColor[i][j + 1].get()); + glTexCoord2fv(_cloudCoord[i][j + 1]); + glVertex3fv(_cloudPos[i][j + 1].get()); + glColor3fv(_cloudColor[i][j].get()); + glTexCoord2fv(_cloudCoord[i][j]); + glVertex3fv(_cloudPos[i][j].get()); + } + glEnd(); + } + glPopMatrix(); + } + + if (Hack::drawSunset) { + glPushAttrib(GL_COLOR_BUFFER_BIT); + glBlendFunc(GL_ONE, GL_ONE); + glCallList(Resources::DisplayLists::sunset); + glPopAttrib(); + } + + if (Hack::drawMoon && Hack::moonGlow > 0.0f) { + glPushAttrib(GL_COLOR_BUFFER_BIT); + glPushMatrix(); + float glow = Hack::moonGlow * 0.005f; // half of max possible value + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glRotatef(moonRotation, 0, 1, 0); + glRotatef(moonHeight, 1, 0, 0); + glTranslatef(0.0f, 0.0f, -20000.0f); + glColor4f(1.0f, 1.0f, 1.0f, glow); + glCallList(Resources::DisplayLists::moonGlow); + glScalef(6000.0f, 6000.0f, 6000.0f); + glColor4f(1.0f, 1.0f, 1.0f, glow * 0.7f); + glCallList(Resources::DisplayLists::flares); + glPopMatrix(); + glPopAttrib(); + } + + if (Hack::drawEarth) { + glPushAttrib(GL_COLOR_BUFFER_BIT); + glPushMatrix(); + glDisable(GL_BLEND); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::earthNear); + glCallList(Resources::DisplayLists::earthNear); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::earthFar); + glCallList(Resources::DisplayLists::earthFar); + if (Hack::ambient <= 30.0f) { + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE); + glBindTexture(GL_TEXTURE_2D, Resources::Textures::earthLight); + glCallList(Resources::DisplayLists::earthLight); + } + glPopMatrix(); + glPopAttrib(); + } +} + +void World::illuminateClouds( + const Vector& pos, const RGBColor& newRGB, + float brightness, float cloudDistanceSquared +) { + float cloudDistance = std::sqrt(cloudDistanceSquared); + + unsigned int south = + (unsigned int)( + (pos.z() - cloudDistance) * 0.00005f * + float(CLOUDMESH / 2) + CLOUDMESH / 2 + ); + unsigned int north = + (unsigned int)( + (pos.z() + cloudDistance) * 0.00005f * + float(CLOUDMESH / 2) + 0.5f + CLOUDMESH / 2 + ); + unsigned int west = + (unsigned int)( + (pos.x() - cloudDistance) * 0.00005f * + float(CLOUDMESH / 2) + CLOUDMESH / 2 + ); + unsigned int east = + (unsigned int)( + (pos.x() + cloudDistance) * 0.00005f * + float(CLOUDMESH / 2) + 0.5f + CLOUDMESH / 2 + ); + for (unsigned int i = west; i <= east; ++i) { + for (unsigned int j = south; j <= north; ++j) { + float dSquared = (_cloudPos[i][j] - pos).lengthSquared(); + if (dSquared < cloudDistanceSquared) { + float temp = (cloudDistanceSquared - dSquared) / cloudDistanceSquared; + temp *= temp * brightness; + _cloudColor[i][j] += newRGB * temp; + _cloudColor[i][j].clamp(); + } + } + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/world.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/world.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/world.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/skyrocket/world.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,40 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _WORLD_HH +#define _WORLD_HH + +#include + +#include +#include + +namespace World { + void init(); + + void update(); + void draw(); + + void illuminateClouds(const Vector&, const RGBColor&, float, float); +}; + +#endif // _WORLD_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/Makefile.am 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,9 @@ +## Process this file with automake to produce Makefile.in + +include $(srcdir)/../Makefile.common + +rs_solarwinds_SOURCES = $(COMMON) $(COLOR) $(VECTOR) solarwinds.cc \ + solarwinds.hh wind.cc wind.hh +rs_solarwinds_LDADD = $(LIBMISC) $(X_LIBS) $(OPENGL_LIBS) + +hack_PROGRAMS = rs-solarwinds diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/Makefile.xbmc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/Makefile.xbmc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/Makefile.xbmc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/Makefile.xbmc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,4 @@ +plasma.xbs: solarwinds.o wind.o + g++ -shared -o SolarWinds.xbs ../common.o solarwinds.o wind.o ../../lib/libmisc.a -lXmu +# cp SolarWinds.xbs /home/yuvalt/XBMC/screensavers/ + cp SolarWinds.xbs ../../../../../XBMC/screensavers/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/solarwinds.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/solarwinds.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/solarwinds.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/solarwinds.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,331 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include +#include + +namespace Hack { + unsigned int numWinds = 1; + unsigned int numEmitters = 30; + unsigned int numParticles = 2000; + GeometryType geometry = LIGHTS_GEOMETRY; + float size = 50.0f; + float windSpeed = 20.0f; + float emitterSpeed = 15.0f; + float particleSpeed = 10.0f; + float blur = 40.0f; +}; + +namespace Hack { + enum Arguments { + ARG_WINDS = 1, + ARG_PARTICLES, + ARG_EMITTERS, + ARG_SIZE, + ARG_SPEED, + ARG_EMITTERSPEED, + ARG_WINDSPEED, + ARG_BLUR, + ARG_LIGHTS_GEOMETRY = 0x100, ARG_POINTS_GEOMETRY, ARG_LINES_GEOMETRY + }; + + std::vector _winds; + + error_t parse(int, char*, struct argp_state*); +}; + +error_t Hack::parse(int key, char* arg, struct argp_state* state) { + switch (key) { + case ARG_WINDS: + if (Common::parseArg(arg, numWinds, 1u, 10u)) + argp_failure(state, EXIT_FAILURE, 0, + "number of solar winds must be between 1 and 10"); + return 0; + case ARG_PARTICLES: + if (Common::parseArg(arg, numParticles, 1u, 10000u)) + argp_failure(state, EXIT_FAILURE, 0, + "particles per wind must be between 1 and 10000"); + return 0; + case ARG_EMITTERS: + if (Common::parseArg(arg, numEmitters, 1u, 1000u)) + argp_failure(state, EXIT_FAILURE, 0, + "emitters per wind must be between 1 and 1000"); + return 0; + case ARG_SIZE: + if (Common::parseArg(arg, size, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "particle size must be between 1 and 100"); + return 0; + case ARG_SPEED: + if (Common::parseArg(arg, particleSpeed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "particle speed must be between 1 and 100"); + return 0; + case ARG_EMITTERSPEED: + if (Common::parseArg(arg, emitterSpeed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "emitter speed must be between 1 and 100"); + return 0; + case ARG_WINDSPEED: + if (Common::parseArg(arg, windSpeed, 1.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "wind speed must be between 1 and 100"); + return 0; + case ARG_BLUR: + if (Common::parseArg(arg, blur, 0.0f, 100.0f)) + argp_failure(state, EXIT_FAILURE, 0, + "motion blur must be between 1 and 100"); + return 0; + case ARG_LIGHTS_GEOMETRY: + geometry = LIGHTS_GEOMETRY; + return 0; + case ARG_POINTS_GEOMETRY: + geometry = POINTS_GEOMETRY; + return 0; + case ARG_LINES_GEOMETRY: + geometry = LINES_GEOMETRY; + return 0; + default: + return ARGP_ERR_UNKNOWN; + } +} + +const struct argp* Hack::getParser() { + static struct argp_option options[] = { + { NULL, 0, NULL, 0, "Wind options:" }, + { "winds", ARG_WINDS, "NUM", 0, "Number of solar winds (1-10, default = 1)" }, + { "particles", ARG_PARTICLES, "NUM", 0, + "Particles per wind (1-10000, default = 2000)" }, + { "emitters", ARG_EMITTERS, "NUM", 0, + "Emitters per wind (1-1000, default = 30)" }, + { "windspeed", ARG_WINDSPEED, "NUM", 0, "Wind speed (1-100, default = 20)" }, + { NULL, 0, NULL, 0, "Particle options:" }, + { "size", ARG_SIZE, "NUM", 0, "Particle size (1-100, default = 50)" }, + { "lights", ARG_LIGHTS_GEOMETRY, NULL, 0, + "Particle geometry (default = lights)" }, + { "points", ARG_POINTS_GEOMETRY, NULL, OPTION_ALIAS }, + { "lines", ARG_LINES_GEOMETRY, NULL, OPTION_ALIAS }, + { "speed", ARG_SPEED, "NUM", 0, "Particle speed (1-100, default = 10)" }, + { NULL, 0, NULL, 0, "Emitter options:" }, + { "emitterspeed", ARG_EMITTERSPEED, "NUM", 0, + "Emitter speed (1-100, default = 15)" }, + { NULL, 0, NULL, 0, "Other options:" }, + { "blur", ARG_BLUR, "NUM", 0, "Motion blur (0-100, default = 40)" }, + {} + }; + static struct argp parser = { + options, parse, NULL, "Another color and movement particle effect." + }; + return &parser; +} + +std::string Hack::getShortName() { return "solarwinds"; } +std::string Hack::getName() { return "Solar Winds"; } + +void Hack::start() { +/* + glViewport(0, 0, Common::width, Common::height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(90.0, Common::aspectRatio, 1.0, 10000); + glTranslatef(0.0, 0.0, -15.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +*/ + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + if (geometry == LIGHTS_GEOMETRY) + glBlendFunc(GL_ONE, GL_ONE); + else + // Necessary for point and line smoothing (I don't know why) + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glEnable(GL_BLEND); + Wind::init(); + + // Initialize surfaces + _winds.resize(numWinds); + + // Clear the GL error + glGetError(); +} + +void Hack::reshape() { + glViewport(0, 0, Common::width, Common::height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(90.0, Common::aspectRatio, 1.0, 10000); + glTranslatef(0.0, 0.0, -15.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +void Hack::tick() { + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluPerspective(90.0, Common::aspectRatio, 1.0, 10000); + glTranslatef(0.0, 0.0, -15.0); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glEnable(GL_TEXTURE_2D); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + if (!blur) { + glClear(GL_COLOR_BUFFER_BIT); + } else { + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(0.0f, 0.0f, 0.0f, 0.5f - (blur * 0.0049f)); + glBegin(GL_QUADS); + glVertex3f(-40.0f, -17.0f, 0.0f); + glVertex3f(40.0f, -17.0f, 0.0f); + glVertex3f(40.0f, 17.0f, 0.0f); + glVertex3f(-40.0f, 17.0f, 0.0f); + glEnd(); + if (geometry == LIGHTS_GEOMETRY) + glBlendFunc(GL_ONE, GL_ONE); + else + // Necessary for point and line smoothing (I don't know why) + // Maybe it's just my video card... + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + } + + // Update surfaces + stdx::call_all(_winds, &Wind::update); + + // Common::flush(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + // Clear the GL error + glGetError(); +} + +void Hack::stop() {} + +void Hack::keyPress(char c, const KeySym&) { + switch (c) { + case 3: case 27: + case 'q': case 'Q': + Common::running = false; + break; + } +} + +void Hack::keyRelease(char, const KeySym&) {} +void Hack::pointerMotion(int, int) {} +void Hack::buttonPress(unsigned int) {} +void Hack::buttonRelease(unsigned int) {} +void Hack::pointerEnter() {} +void Hack::pointerLeave() {} + +#define _LINUX +#include "../../../addons/include/xbmc_scr_dll.h" + +extern "C" { + +ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + SCR_PROPS* scrprops = (SCR_PROPS*)props; + + Common::width = scrprops->width; + Common::height = scrprops->height; + Common::aspectRatio = float(Common::width) / float(Common::height); + Common::resources = new ResourceManager; + + return ADDON_STATUS_OK; +} + +void Start() +{ + Hack::start(); +} + +void Render() +{ + Hack::tick(); +} + +void ADDON_Stop() +{ + Hack::stop(); +} + +void ADDON_Destroy() +{ + delete Common::resources; +} + +ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +bool ADDON_HasSettings() +{ + return false; +} + +unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue) +{ + return ADDON_STATUS_OK; +} + +void ADDON_FreeSettings() +{ +} + +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} + +void GetInfo(SCR_INFO *info) +{ +} + +void Remove() +{ +} + +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/solarwinds.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/solarwinds.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/solarwinds.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/solarwinds.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,46 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _SOLARWINDS_HH +#define _SOLARWINDS_HH + +#include + +namespace Hack { + enum GeometryType { + LIGHTS_GEOMETRY, + POINTS_GEOMETRY, + LINES_GEOMETRY + }; + + extern unsigned int numWinds; + extern unsigned int numEmitters; + extern unsigned int numParticles; + extern GeometryType geometry; + extern float size; + extern float windSpeed; + extern float emitterSpeed; + extern float particleSpeed; + extern float blur; +}; + +#endif // _SOLARWINDS_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/wind.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/wind.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/wind.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/wind.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,232 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#include +#include +#include +#include + +#define LIGHTSIZE 64 + +GLuint Wind::_list; +GLuint Wind::_texture; + +void Wind::init() { + switch (Hack::geometry) { + case Hack::LIGHTS_GEOMETRY: + { + GLubyte light[LIGHTSIZE][LIGHTSIZE]; + for (int i = 0; i < LIGHTSIZE; ++i) { + for(int j = 0; j < LIGHTSIZE; ++j) { + float x = float(i - LIGHTSIZE / 2) / float(LIGHTSIZE / 2); + float y = float(j - LIGHTSIZE / 2) / float(LIGHTSIZE / 2); + float temp = Common::clamp( + 1.0f - float(std::sqrt((x * x) + (y * y))), + 0.0f, 1.0f + ); + light[i][j] = GLubyte(255.0f * temp); + } + } + _texture = Common::resources->genTexture( + GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT, + 1, LIGHTSIZE, LIGHTSIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, light, + false + ); + glEnable(GL_TEXTURE_2D); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + float temp = 0.02f * Hack::size; + _list = Common::resources->genLists(1); + glNewList(_list, GL_COMPILE); + glBindTexture(GL_TEXTURE_2D, _texture); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-temp, -temp, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(temp, -temp, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-temp, temp, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(temp, temp, 0.0f); + glEnd(); + glEndList(); + } + break; + case Hack::POINTS_GEOMETRY: + glEnable(GL_POINT_SMOOTH); + glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); + break; + case Hack::LINES_GEOMETRY: + glEnable(GL_LINE_SMOOTH); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + break; + } +} + +Wind::Wind() { + for (unsigned int i = 0; i < Hack::numEmitters; ++i) + _emitters.push_back(Vector( + Common::randomFloat(60.0f) - 30.0f, + Common::randomFloat(60.0f) - 30.0f, + Common::randomFloat(30.0f) - 15.0f + )); + + _particlesXYZ.resize(Hack::numParticles, Vector(0.0f, 0.0f, 100.0f)); + _particlesRGB.resize(Hack::numParticles, RGBColor()); + + _whichParticle = 0; + + if (Hack::geometry == Hack::LINES_GEOMETRY) { + _lineList.resize(Hack::numParticles, std::make_pair(UINT_MAX, UINT_MAX)); + for (unsigned int i = 0; i < Hack::numEmitters; ++i) + _lastParticle.push_back(i); + } + + for (unsigned int i = 0; i < NUMCONSTS; ++i) { + _ct[i] = Common::randomFloat(M_PI * 2.0f); + _cv[i] = Common::randomFloat( + 0.00005f * float(Hack::windSpeed) * float(Hack::windSpeed) + ) + 0.00001f * float(Hack::windSpeed) * float(Hack::windSpeed); + } +} + +void Wind::update() { + // update constants + for (unsigned int i = 0; i < NUMCONSTS; ++i) { + _ct[i] += _cv[i]; + if (_ct[i] > M_PI * 2.0f) + _ct[i] -= M_PI * 2.0f; + _c[i] = std::cos(_ct[i]); + } + + static float eVel = Hack::emitterSpeed * 0.01f; + + // calculate emissions + for (unsigned int i = 0; i < Hack::numEmitters; ++i) { + // emitter moves toward viewer + _emitters[i].z() += eVel; + if (_emitters[i].z() > 15.0f) // reset emitter + _emitters[i].set( + Common::randomFloat(60.0f) - 30.0f, + Common::randomFloat(60.0f) - 30.0f, + -15.0f + ); + _particlesXYZ[_whichParticle] = _emitters[i]; + if (Hack::geometry == Hack::LINES_GEOMETRY) { + // link particles to form lines + if (_lineList[_whichParticle].first != UINT_MAX) + _lineList[_lineList[_whichParticle].first].second = UINT_MAX; + _lineList[_whichParticle].first = UINT_MAX; + if (_emitters[i].z() == -15.0f) + _lineList[_whichParticle].second = UINT_MAX; + else + _lineList[_whichParticle].second = _lastParticle[i]; + _lineList[_lastParticle[i]].first = _whichParticle; + _lastParticle[i] = _whichParticle; + } + ++_whichParticle; + if (_whichParticle >= Hack::numParticles) + _whichParticle = 0; + } + + // calculate particle positions and colors + // first modify constants that affect colors + _c[6] *= 9.0f / Hack::particleSpeed; + _c[7] *= 9.0f / Hack::particleSpeed; + _c[8] *= 9.0f / Hack::particleSpeed; + // then update each particle + static float pVel = Hack::particleSpeed * 0.01f; + for (unsigned int i = 0; i < Hack::numParticles; ++i) { + // store old positions + float x = _particlesXYZ[i].x(); + float y = _particlesXYZ[i].y(); + float z = _particlesXYZ[i].z(); + // make new positions + _particlesXYZ[i].set( + x + (_c[0] * y + _c[1] * z) * pVel, + y + (_c[2] * z + _c[3] * x) * pVel, + z + (_c[4] * x + _c[5] * y) * pVel + ); + // calculate colors + _particlesRGB[i].set( + std::abs((_particlesXYZ[i].x() - x) * _c[6]), + std::abs((_particlesXYZ[i].y() - y) * _c[7]), + std::abs((_particlesXYZ[i].z() - z) * _c[8]) + ); + // clamp colors + _particlesRGB[i].clamp(); + } + + static float pointSize = 0.04f * Hack::size; + static float lineSize = 0.005f * Hack::size; + + // draw particles + switch (Hack::geometry) { + case Hack::LIGHTS_GEOMETRY: + for (unsigned int i = 0; i < Hack::numParticles; ++i) { + glColor3fv(_particlesRGB[i].get()); + glPushMatrix(); + glTranslatef( + _particlesXYZ[i].x(), + _particlesXYZ[i].y(), + _particlesXYZ[i].z() + ); + glCallList(_list); + glPopMatrix(); + } + break; + case Hack::POINTS_GEOMETRY: + for (unsigned int i = 0; i < Hack::numParticles; ++i) { + float temp = _particlesXYZ[i].z() + 40.0f; + if (temp < 0.01f) temp = 0.01f; + glPointSize(pointSize * temp); + glBegin(GL_POINTS); + glColor3fv(_particlesRGB[i].get()); + glVertex3fv(_particlesXYZ[i].get()); + glEnd(); + } + break; + case Hack::LINES_GEOMETRY: + { + for (unsigned int i = 0; i < Hack::numParticles; ++i) { + float temp = _particlesXYZ[i].z() + 40.0f; + if (temp < 0.01f) temp = 0.01f; + glLineWidth(lineSize * temp); + glBegin(GL_LINES); + if (_lineList[i].second != UINT_MAX) { + glColor3fv(_particlesRGB[i].get()); + if (_lineList[i].first == UINT_MAX) + glColor3f(0.0f, 0.0f, 0.0f); + glVertex3fv(_particlesXYZ[i].get()); + glColor3fv(_particlesRGB[_lineList[i].second].get()); + if (_lineList[_lineList[i].second].second == UINT_MAX) + glColor3f(0.0f, 0.0f, 0.0f); + glVertex3fv(_particlesXYZ[_lineList[i].second].get()); + } + glEnd(); + } + } + break; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/wind.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/wind.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/wind.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/solarwinds/wind.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,55 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _WIND_HH +#define _WIND_HH + +#include + +#include +#include + +#define NUMCONSTS 9 + +class Wind { +private: + static GLuint _list; + static GLuint _texture; + + std::vector _emitters; + std::vector _particlesXYZ; + std::vector _particlesRGB; + std::vector > _lineList; + std::vector _lastParticle; + unsigned int _whichParticle; + float _c[NUMCONSTS]; + float _ct[NUMCONSTS]; + float _cv[NUMCONSTS]; +public: + static void init(); + + Wind(); + + void update(); +}; + +#endif // _WIND_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/sound.cc kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/sound.cc --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/sound.cc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/sound.cc 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,272 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#include + +#if HAVE_SOUND + +#if HAVE_UNISTD_H + #include +#endif +#include + +#include + +ALCdevice* Sound::_device; +ALCcontext* Sound::_context; +std::list Sound::_inactive, Sound::_active; + +float Sound::_speedOfSound; +const Vector* Sound::_cameraPos; +const Vector* Sound::_cameraVel; +const UnitQuat* Sound::_cameraDir; + +#if USE_DLOPEN + #define AL_FUNC(T, F) T F; +#else + #define AL_FUNC(T, F) using ::F; +#endif +namespace AL { + AL_FUNC(LPALCCLOSEDEVICE, alcCloseDevice); + AL_FUNC(LPALCCREATECONTEXT, alcCreateContext); + AL_FUNC(LPALCDESTROYCONTEXT, alcDestroyContext); + AL_FUNC(LPALCGETCURRENTCONTEXT, alcGetCurrentContext); + AL_FUNC(LPALCMAKECONTEXTCURRENT, alcMakeContextCurrent); + AL_FUNC(LPALCOPENDEVICE, alcOpenDevice); + AL_FUNC(LPALCPROCESSCONTEXT, alcProcessContext); + + AL_FUNC(LPALBUFFERDATA, alBufferData); + AL_FUNC(LPALDELETEBUFFERS, alDeleteBuffers); + AL_FUNC(LPALDELETESOURCES, alDeleteSources); + AL_FUNC(LPALDISTANCEMODEL, alDistanceModel); + AL_FUNC(LPALGENBUFFERS, alGenBuffers); + AL_FUNC(LPALGENSOURCES, alGenSources); + AL_FUNC(LPALGETSOURCEI, alGetSourcei); + AL_FUNC(LPALLISTENERF, alListenerf); + AL_FUNC(LPALLISTENERFV, alListenerfv); + AL_FUNC(LPALSOURCEF, alSourcef); + AL_FUNC(LPALSOURCEFV, alSourcefv); + AL_FUNC(LPALSOURCEI, alSourcei); + AL_FUNC(LPALSOURCEPAUSE, alSourcePause); + AL_FUNC(LPALSOURCEPLAY, alSourcePlay); + AL_FUNC(LPALSOURCEREWIND, alSourceRewind); +}; + +Buffer::Buffer( + ALenum format, const ALvoid* data, ALsizei size, ALuint frequency +) { + AL::alGenBuffers(1, &_buffer); + AL::alBufferData(_buffer, format, data, size, frequency); +} + +Buffer::~Buffer() { AL::alDeleteBuffers(1, &_buffer); } + +class Device : public ResourceManager::Resource { +private: + ALCdevice* _device; +public: + Device(const std::string& spec) { + _device = AL::alcOpenDevice(spec.c_str()); + if (!_device) { + // Sleep for a moment before trying again + sleep(1); + _device = AL::alcOpenDevice(spec.c_str()); + if (!_device) + throw ResourceManager::Exception( + stdx::oss() << "Could not open AL device: " << + (spec.length() ? spec : "(default)") + ); + } + } + ~Device() { AL::alcCloseDevice(_device); } + ALCdevice* operator()() const { return _device; } +}; + +class Context : public ResourceManager::Resource { +private: + ALCcontext* _prev; + ALCcontext* _context; +public: + Context(ALCdevice* device) : _prev(AL::alcGetCurrentContext()) { + _context = AL::alcCreateContext(device, NULL); + if (!_context) + throw ResourceManager::Exception("Could not create AL context"); + AL::alcMakeContextCurrent(_context); + } + ~Context() { + AL::alcMakeContextCurrent(_prev); + AL::alcDestroyContext(_context); + } + ALCcontext* operator()() const { return _context; } +}; + +class Source : public ResourceManager::Resource { +private: + ALuint _source; + Vector _pos; + float _time; +public: + Source() { AL::alGenSources(1, &_source); } + ~Source() { AL::alDeleteSources(1, &_source); } + ALuint operator()() const { return _source; } + + void start(ALuint buffer, const Vector& pos, float ref, float delay) { + AL::alSourceRewind(_source); + AL::alSourcei(_source, AL_BUFFER, buffer); + AL::alSourcef(_source, AL_GAIN, 1.0f); + AL::alSourcef(_source, AL_REFERENCE_DISTANCE, ref); + AL::alSourcef(_source, AL_ROLLOFF_FACTOR, 1.0f); + AL::alSourcei(_source, AL_LOOPING, AL_FALSE); + AL::alSourcefv(_source, AL_POSITION, (float*)_pos.get()); + _pos = pos; + _time = -delay; + } + + bool update() { + _time += Common::elapsedTime; + if (_time < 0.0f) return false; + + // Do doppler effects manually due to OpenAL bugs + float soundTime = _time; + if (Sound::_speedOfSound) { + Vector toCamera(*Sound::_cameraPos - _pos); + float vls = Vector::dot(toCamera, *Sound::_cameraVel / Common::elapsedSecs) / toCamera.length(); + if (vls > Sound::_speedOfSound) vls = Sound::_speedOfSound; + float factor = (Sound::_speedOfSound - vls) / Sound::_speedOfSound; + AL::alSourcef(_source, AL_PITCH, Common::speed * factor); + soundTime -= toCamera.length() / Sound::_speedOfSound; + } + + ALenum state = 0x1234; + AL::alGetSourcei(_source, AL_SOURCE_STATE, &state); + switch (state) { + case AL_INITIAL: + case AL_PAUSED: + if (Common::speed > 0.0f && soundTime >= 0.0f) + AL::alSourcePlay(_source); + break; + case AL_PLAYING: + if (Common::speed == 0.0f || soundTime < 0.0f) + AL::alSourcePause(_source); + break; + case AL_STOPPED: + return false; + } + + return true; + } +}; + +void Sound::init( + const std::string& spec, float volume, float speedOfSound, + const Vector* cameraPos, const Vector* cameraVel, const UnitQuat* cameraDir +) { +#if USE_DLOPEN + try { + const Library* libopenal = Common::resources->manage(new Library("libopenal")); + AL::alcCloseDevice = (LPALCCLOSEDEVICE)(*libopenal)("alcCloseDevice"); + AL::alcCreateContext = (LPALCCREATECONTEXT)(*libopenal)("alcCreateContext"); + AL::alcDestroyContext = (LPALCDESTROYCONTEXT)(*libopenal)("alcDestroyContext"); + AL::alcGetCurrentContext = (LPALCGETCURRENTCONTEXT)(*libopenal)("alcGetCurrentContext"); + AL::alcMakeContextCurrent = (LPALCMAKECONTEXTCURRENT)(*libopenal)("alcMakeContextCurrent"); + AL::alcOpenDevice = (LPALCOPENDEVICE)(*libopenal)("alcOpenDevice"); + AL::alcProcessContext = (LPALCPROCESSCONTEXT)(*libopenal)("alcProcessContext"); + AL::alBufferData = (LPALBUFFERDATA)(*libopenal)("alBufferData"); + AL::alDeleteBuffers = (LPALDELETEBUFFERS)(*libopenal)("alDeleteBuffers"); + AL::alDeleteSources = (LPALDELETESOURCES)(*libopenal)("alDeleteSources"); + AL::alDistanceModel = (LPALDISTANCEMODEL)(*libopenal)("alDistanceModel"); + AL::alGenBuffers = (LPALGENBUFFERS)(*libopenal)("alGenBuffers"); + AL::alGenSources = (LPALGENSOURCES)(*libopenal)("alGenSources"); + AL::alGetSourcei = (LPALGETSOURCEI)(*libopenal)("alGetSourcei"); + AL::alListenerf = (LPALLISTENERF)(*libopenal)("alListenerf"); + AL::alListenerfv = (LPALLISTENERFV)(*libopenal)("alListenerfv"); + AL::alSourcef = (LPALSOURCEF)(*libopenal)("alSourcef"); + AL::alSourcefv = (LPALSOURCEFV)(*libopenal)("alSourcefv"); + AL::alSourcei = (LPALSOURCEI)(*libopenal)("alSourcei"); + AL::alSourcePause = (LPALSOURCEPAUSE)(*libopenal)("alSourcePause"); + AL::alSourcePlay = (LPALSOURCEPLAY)(*libopenal)("alSourcePlay"); + AL::alSourceRewind = (LPALSOURCEREWIND)(*libopenal)("alSourceRewind"); + } catch (Common::Exception e) { + throw Unavailable(); + } +#endif // USE_DLOPEN + + _device = Common::resources->manage(new Device(spec)); + _context = Common::resources->manage(new Context(_device)); + + for (unsigned int i = 0; i < SOURCES; ++i) { + Source* source = new Source(); + Common::resources->manage(source); + _inactive.push_back(source); + } + + AL::alDistanceModel(AL_INVERSE_DISTANCE); + AL::alListenerf(AL_GAIN, volume * 0.01f); + _speedOfSound = speedOfSound; + _cameraPos = cameraPos; + _cameraVel = cameraVel; + _cameraDir = cameraDir; +} + +void Sound::update() { + Vector forward(_cameraDir->forward()); + Vector up(_cameraDir->up()); + float orientation[] = { + forward.x(), forward.y(), forward.z(), + up.x(), up.y(), up.z() + }; + + AL::alListenerfv(AL_POSITION, (float*)_cameraPos->get()); + AL::alListenerfv(AL_ORIENTATION, orientation); + + for ( + std::list::iterator it = _active.begin(); + it != _active.end(); + ) { + if (!(*it)->update()) { + _inactive.push_back(*it); + it = _active.erase(it); + continue; + } + ++it; + } + + AL::alcProcessContext(_context); +} + +void Sound::play(const Vector& pos) { + Source* source; + if (_inactive.empty()) { + /* Kill the oldest source */ + source = _active.front(); + _active.pop_front(); + } else { + source = _inactive.front(); + _inactive.pop_front(); + } + _active.push_back(source); + source->start(_buffer, pos, _ref, _delay); +} + +Sound::Sound(float ref, float delay) : _ref(ref), _delay(delay) {} + +#endif // HAVE_SOUND diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/sound.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/sound.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/sound.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/sound.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,98 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _SOUND_HH +#define _SOUND_HH + +#include + +#include + +#if HAVE_SOUND + +#include +#include + +#define SOURCES 32 + +class Source; + +class Buffer : public ResourceManager::Resource { +private: + ALuint _buffer; +public: + Buffer(ALenum, const ALvoid*, ALsizei, ALuint); + ~Buffer(); + ALuint operator()() const { return _buffer; } +}; + +class Sound : public ResourceManager::Resource { +private: + static ALCdevice* _device; + static ALCcontext* _context; + static std::list _inactive, _active; + + static float _speedOfSound; + static const Vector* _cameraPos; + static const Vector* _cameraVel; + static const UnitQuat* _cameraDir; + + friend class Source; + + float _ref; + float _delay; +protected: + ALuint _buffer; + + Sound(float, float); +public: + class Unavailable {}; + + static void init( + const std::string&, float, float, + const Vector*, const Vector*, const UnitQuat* + ); + static void update(); + void operator()() const {} + void play(const Vector&); +}; + +#else // !HAVE_SOUND + +class Sound : public ResourceManager::Resource { +public: + class Unavailable {}; + + static void init( + const std::string&, float, float, + const Vector*, const Vector*, const UnitQuat* + ) { + throw Common::Exception("No sound support"); + } + static void update() {} + void operator()() const {} + void play(const Vector&) {} +}; + +#endif // !HAVE_SOUND + +#endif // _SOUND_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/vector.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/vector.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/vector.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/vector.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,797 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ +#ifndef _VECTOR_HH +#define _VECTOR_HH + +#include + +#define R2D (180.0f / M_PI) +#define D2R (M_PI / 180.0f) + +template +class VectorBase { +protected: + T _v[3]; +public: + VectorBase(const T* v) { + set(v[0], v[1], v[2]); + } + + VectorBase(const T& x, const T& y, const T& z) { + set(x, y, z); + } + + void set(const T& x, const T& y, const T& z) { + _v[0] = x; + _v[1] = y; + _v[2] = z; + } + + const T& x() const { return _v[0]; } + T& x() { return _v[0]; } + const T& y() const { return _v[1]; } + T& y() { return _v[1]; } + const T& z() const { return _v[2]; } + T& z() { return _v[2]; } + + const T* get() const { + return _v; + } + + T lengthSquared() const { + return _v[0] * _v[0] + _v[1] * _v[1] + _v[2] * _v[2]; + } +}; + +class Vector : public VectorBase { +public: + Vector(const float* v) : VectorBase(v) {} + + Vector(float x = 0.0f, float y = 0.0f, float z = 0.0f) + : VectorBase(x, y, z) {} + + float length() const { + return std::sqrt(lengthSquared()); + } + + float normalize() { + float l = length(); + if (l == 0.0f) + return 0.0f; + _v[0] /= l; + _v[1] /= l; + _v[2] /= l; + return l; + } + + Vector operator+(const Vector& v) const { + return Vector(_v[0] + v._v[0], _v[1] + v._v[1], _v[2] + v._v[2]); + } + + Vector operator-(const Vector& v) const { + return Vector(_v[0] - v._v[0], _v[1] - v._v[1], _v[2] - v._v[2]); + } + + Vector operator*(float f) const { + return Vector(_v[0] * f, _v[1] * f, _v[2] * f); + } + + Vector operator/(float f) const { + return Vector(_v[0] / f, _v[1] / f, _v[2] / f); + } + + Vector& operator+=(const Vector& v) { + _v[0] += v._v[0]; + _v[1] += v._v[1]; + _v[2] += v._v[2]; + return *this; + } + + Vector& operator-=(const Vector& v) { + _v[0] -= v._v[0]; + _v[1] -= v._v[1]; + _v[2] -= v._v[2]; + return *this; + } + + Vector& operator*=(float f) { + _v[0] *= f; + _v[1] *= f; + _v[2] *= f; + return *this; + } + + Vector& operator/=(float f) { + _v[0] /= f; + _v[1] /= f; + _v[2] /= f; + return *this; + } + + static float dot(const Vector& a, const Vector& b) { + return a.x() * b.x() + a.y() * b.y() + a.z() * b.z(); + } + + static Vector cross(const Vector& a, const Vector& b) { + return Vector( + a.y() * b.z() - b.y() * a.z(), + a.z() * b.x() - b.z() * a.x(), + a.x() * b.y() - b.x() * a.y() + ); + }; +}; + +class UVector : public VectorBase { +public: + UVector(const unsigned int* v) : VectorBase(v) {} + + UVector(unsigned int x = 0, unsigned int y = 0, unsigned int z = 0) + : VectorBase(x, y, z) {} + + UVector operator+(const UVector& v) const { + return UVector(_v[0] + v._v[0], _v[1] + v._v[1], _v[2] + v._v[2]); + } + + UVector operator-(const UVector& v) const { + return UVector(_v[0] - v._v[0], _v[1] - v._v[1], _v[2] - v._v[2]); + } + + UVector& operator+=(const UVector& v) { + _v[0] += v._v[0]; + _v[1] += v._v[1]; + _v[2] += v._v[2]; + return *this; + } + + UVector& operator-=(const UVector& v) { + _v[0] -= v._v[0]; + _v[1] -= v._v[1]; + _v[2] -= v._v[2]; + return *this; + } +}; + +class UnitVector : public Vector { +protected: + using Vector::set; + using Vector::length; + using Vector::lengthSquared; + using Vector::normalize; + + UnitVector(const float* v) { + set(v[0], v[1], v[2]); + } + + UnitVector(float x, float y, float z) { + set(x, y, z); + } + + friend class Vector; + friend class RotationMatrix; + friend class UnitQuat; +public: + UnitVector(const Vector& v) { + float l = v.length(); + if (l == 0.0f) + set(1.0f, 0.0f, 0.0f); + else + set(v.x() / l, v.y() / l, v.z() / l); + } + + UnitVector() { + set(1.0f, 0.0f, 0.0f); + } + + static UnitVector of(const Vector& v) { + float l = v.length(); + if (l == 0.0f) + return UnitVector(); + return UnitVector( + v.x() / l, + v.y() / l, + v.z() / l + ); + } +}; + +class Matrix { +protected: + float _m[16]; +public: + Matrix( + float m0 = 1.0f, float m1 = 0.0f, float m2 = 0.0f, float m3 = 0.0f, + float m4 = 0.0f, float m5 = 1.0f, float m6 = 0.0f, float m7 = 0.0f, + float m8 = 0.0f, float m9 = 0.0f, float m10 = 1.0f, float m11 = 0.0f, + float m12 = 0.0f, float m13 = 0.0f, float m14 = 0.0f, float m15 = 1.0f + ) { + _m[0] = m0; _m[1] = m1; _m[2] = m2; _m[3] = m3; + _m[4] = m4; _m[5] = m5; _m[6] = m6; _m[7] = m7; + _m[8] = m8; _m[9] = m9; _m[10] = m10; _m[11] = m11; + _m[12] = m12; _m[13] = m13; _m[14] = m14; _m[15] = m15; + } + + float get(int i) const { + return _m[i]; + } + + const float* get() const { + return _m; + } + + Matrix transposed() const { + return Matrix( + _m[0], _m[4], _m[8], _m[12], + _m[1], _m[5], _m[9], _m[13], + _m[2], _m[6], _m[10], _m[14], + _m[3], _m[7], _m[11], _m[15] + ); + } + + Vector transform(const Vector& v) const { + float w = _m[3] * v.x() + _m[7] * v.y() + _m[11] * v.z() + _m[15]; + return Vector( + (_m[0] * v.x() + _m[4] * v.y() + _m[8] * v.z() + _m[12]) / w, + (_m[1] * v.x() + _m[5] * v.y() + _m[9] * v.z() + _m[13]) / w, + (_m[2] * v.x() + _m[6] * v.y() + _m[10] * v.z() + _m[14]) / w + ); + } + + Matrix operator*(const Matrix& m) const { + return Matrix( + _m[0] * m._m[0] + _m[1] * m._m[4] + + _m[2] * m._m[8] + _m[3] * m._m[12], + _m[0] * m._m[1] + _m[1] * m._m[5] + + _m[2] * m._m[9] + _m[3] * m._m[13], + _m[0] * m._m[2] + _m[1] * m._m[6] + + _m[2] * m._m[10] + _m[3] * m._m[14], + _m[0] * m._m[3] + _m[1] * m._m[7] + + _m[2] * m._m[11] + _m[3] * m._m[15] + , + _m[4] * m._m[0] + _m[5] * m._m[4] + + _m[6] * m._m[8] + _m[7] * m._m[12], + _m[4] * m._m[1] + _m[5] * m._m[5] + + _m[6] * m._m[9] + _m[7] * m._m[13], + _m[4] * m._m[2] + _m[5] * m._m[6] + + _m[6] * m._m[10] + _m[7] * m._m[14], + _m[4] * m._m[3] + _m[5] * m._m[7] + + _m[6] * m._m[11] + _m[7] * m._m[15] + , + _m[8] * m._m[0] + _m[9] * m._m[4] + + _m[10] * m._m[8] + _m[11] * m._m[12], + _m[8] * m._m[1] + _m[9] * m._m[5] + + _m[10] * m._m[9] + _m[11] * m._m[13], + _m[8] * m._m[2] + _m[9] * m._m[6] + + _m[10] * m._m[10] + _m[11] * m._m[14], + _m[8] * m._m[3] + _m[9] * m._m[7] + + _m[10] * m._m[11] + _m[11] * m._m[15] + , + _m[12] * m._m[0] + _m[13] * m._m[4] + + _m[14] * m._m[8] + _m[15] * m._m[12], + _m[12] * m._m[1] + _m[13] * m._m[5] + + _m[14] * m._m[9] + _m[15] * m._m[13], + _m[12] * m._m[2] + _m[13] * m._m[6] + + _m[14] * m._m[10] + _m[15] * m._m[14], + _m[12] * m._m[3] + _m[13] * m._m[7] + + _m[14] * m._m[11] + _m[15] * m._m[15] + ); + } +}; + +class TranslationMatrix : public Matrix { +protected: + float _dx, _dy, _dz; +public: + TranslationMatrix(float dx = 0.0f, float dy = 0.0f, float dz = 0.0f) : + Matrix( + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + dz, dy, dz, 1.0f + ), _dx(dx), _dy(dy), _dz(dz) {} + + TranslationMatrix inverted() const { + return TranslationMatrix(-_dx, -_dy, -_dz); + } + + Vector transform(const Vector& v) const { + return v + Vector(_dx, _dy, _dz); + } + + TranslationMatrix operator*(const TranslationMatrix& m) const { + return TranslationMatrix(_dx + m._dx, _dy + m._dy, _dz + m._dz); + } +}; + +class ScalingMatrix : public Matrix { +protected: + float _sx, _sy, _sz; +public: + ScalingMatrix(float sx = 0.0f, float sy = 0.0f, float sz = 0.0f) : + Matrix( + sx, 0.0f, 0.0f, 0.0f, + 0.0f, sy, 0.0f, 0.0f, + 0.0f, 0.0f, sz, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + ), _sx(sx), _sy(sy), _sz(sz) {} + + ScalingMatrix inverted() const { + return ScalingMatrix(-_sx, -_sy, -_sz); + } + + ScalingMatrix transposed() const { + return ScalingMatrix(*this); + } + + Vector transform(const Vector& v) const { + return Vector(_sx * v.x(), _sy * v.y(), _sz * v.z()); + } + + ScalingMatrix operator*(const ScalingMatrix& m) const { + return ScalingMatrix(_sx + m._sx, _sy + m._sy, _sz + m._sz); + } +}; + +class ShearingMatrix : public Matrix { +protected: + float _sxy, _sxz, _syx, _syz, _szx, _szy; +public: + ShearingMatrix( + float sxy = 0.0f, float sxz = 0.0f, + float syx = 0.0f, float syz = 0.0f, + float szx = 0.0f, float szy = 0.0f + ) : + Matrix( + 1.0f, sxy, sxz, 0.0f, + syx, 1.0f, syz, 0.0f, + szx, szy, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + ), + _sxy(sxy), _sxz(sxz), _syx(syx), + _syz(syz), _szx(szx), _szy(szy) {} + + ShearingMatrix transposed() const { + return ShearingMatrix(_syx, _szx, _sxy, _szy, _sxz, _syz); + } + + Vector transform(const Vector& v) const { + return Vector( + v.x() + _syx * v.y() + _szx * v.z(), + v.y() + _sxy * v.x() + _szy * v.z(), + v.z() + _sxz * v.x() + _syz * v.y() + ); + } +}; + +class RotationMatrix : public Matrix { +protected: + RotationMatrix( + float m0, float m1, float m2, + float m4, float m5, float m6, + float m8, float m9, float m10 + ) : Matrix( + m0, m1, m2, 0.0f, + m4, m5, m6, 0.0f, + m8, m9, m10, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + ) {} + + RotationMatrix(const Vector& x, const Vector& y, const Vector& z) : + Matrix( + x.x(), x.y(), x.z(), 0.0f, + y.x(), y.y(), y.z(), 0.0f, + z.x(), z.y(), z.z(), 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + ) {} + + friend class UnitQuat; +public: + RotationMatrix() : + Matrix( + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + ) {} + + // Emulate gluLookAt + static RotationMatrix lookAt( + const Vector& eye, const Vector& center, const Vector& up + ) { + Vector f(eye - center); + f.normalize(); + Vector x(Vector::cross(up, f)); + x.normalize(); + return RotationMatrix(x, Vector::cross(f, x), f); + } + + static RotationMatrix heading(float a) { + float sa = std::sin(a); + float ca = std::cos(a); + + return RotationMatrix( + 1.0f, 0.0f, 0.0f, + 0.0f, ca, -sa, + 0.0f, sa, ca + ); + } + + static RotationMatrix pitch(float a) { + float sa = std::sin(a); + float ca = std::cos(a); + + return RotationMatrix( + ca, 0.0f, -sa, + 0.0f, 1.0f, 0.0f, + sa, 0.0f, ca + ); + } + + static RotationMatrix roll(float a) { + float sa = std::sin(a); + float ca = std::cos(a); + + return RotationMatrix( + ca, -sa, 0.0f, + sa, ca, 0.0f, + 0.0f, 0.0f, 1.0f + ); + } + + RotationMatrix inverted() const { + return RotationMatrix( + _m[0], _m[4], _m[8], + _m[1], _m[5], _m[9], + _m[2], _m[6], _m[10] + ); + } + + RotationMatrix transposed() const { + return RotationMatrix( + _m[0], _m[4], _m[8], + _m[1], _m[5], _m[9], + _m[2], _m[6], _m[10] + ); + } + + Vector transform(const Vector& v) const { + return Vector( + _m[0] * v.x() + _m[4] * v.y() + _m[8] * v.z(), + _m[1] * v.x() + _m[5] * v.y() + _m[9] * v.z(), + _m[2] * v.x() + _m[6] * v.y() + _m[10] * v.z() + ); + } + + UnitVector transform(const UnitVector& v) const { + return UnitVector( + _m[0] * v.x() + _m[4] * v.y() + _m[8] * v.z(), + _m[1] * v.x() + _m[5] * v.y() + _m[9] * v.z(), + _m[2] * v.x() + _m[6] * v.y() + _m[10] * v.z() + ); + } + + RotationMatrix operator*(const RotationMatrix& m) const { + return RotationMatrix( + _m[0] * m._m[0] + _m[1] * m._m[4] + _m[2] * m._m[8], + _m[0] * m._m[1] + _m[1] * m._m[5] + _m[2] * m._m[9], + _m[0] * m._m[2] + _m[1] * m._m[6] + _m[2] * m._m[10] + , + _m[4] * m._m[0] + _m[5] * m._m[4] + _m[6] * m._m[8], + _m[4] * m._m[1] + _m[5] * m._m[5] + _m[6] * m._m[9], + _m[4] * m._m[2] + _m[5] * m._m[6] + _m[6] * m._m[10] + , + _m[8] * m._m[0] + _m[9] * m._m[4] + _m[10] * m._m[8], + _m[8] * m._m[1] + _m[9] * m._m[5] + _m[10] * m._m[9], + _m[8] * m._m[2] + _m[9] * m._m[6] + _m[10] * m._m[10] + ); + } +}; + +class UnitQuat { +protected: + float _q[4]; + unsigned int _renormalizeCount; + + // These two are internal, since they do not guarantee length == 1 + UnitQuat(float x, float y, float z, float w) : _renormalizeCount(0) { + _q[0] = x; + _q[1] = y; + _q[2] = z; + _q[3] = w; + } + + void set(float x, float y, float z, float w) { + _q[0] = x; + _q[1] = y; + _q[2] = z; + _q[3] = w; + } +public: + UnitQuat() : _renormalizeCount(0) { + _q[0] = _q[1] = _q[2] = 0.0f; + _q[3] = 1.0f; + } + + UnitQuat(float a, const UnitVector& axis) : _renormalizeCount(0) { + a *= 0.5f; + float sinA = std::sin(a); + set( + sinA * axis.x(), + sinA * axis.y(), + sinA * axis.z(), + std::cos(a) + ); + } + + UnitQuat(const RotationMatrix& r) : _renormalizeCount(0) { + float trace = r.get(0) + r.get(5) + r.get(10) + 1.0f; + if (trace > 0) { + float s = 2.0f * std::sqrt(trace); + set( + (r.get(9) - r.get(6)) / s, + (r.get(2) - r.get(8)) / s, + (r.get(4) - r.get(1)) / s, + s / 4.0f + ); + } else { + if (r.get(0) > r.get(5)) { + if (r.get(0) > r.get(10)) { + // r.get(0) is largest + float s = 2.0f * + std::sqrt(1.0f + r.get(0) - r.get(5) - r.get(10)); + set( + s / 4.0f, + (r.get(1) + r.get(4)) / s, + (r.get(2) + r.get(8)) / s, + (r.get(9) - r.get(6)) / s + ); + } else { + // r.get(10) is largest + float s = 2.0f * + std::sqrt(1.0f + r.get(10) - r.get(0) - r.get(5)); + set( + (r.get(2) + r.get(8)) / s, + (r.get(6) + r.get(9)) / s, + s / 4, + (r.get(4) - r.get(1)) / s + ); + } + } else { + if (r.get(5) > r.get(10)) { + // r.get(5) is largest + float s = 2.0f * + std::sqrt(1.0f + r.get(5) - r.get(0) - r.get(10)); + set( + (r.get(1) + r.get(4)) / s, + s / 4, + (r.get(6) + r.get(9)) / s, + (r.get(2) - r.get(8)) / s + ); + } else { + // r.get(10) is largest + float s = 2.0f * + std::sqrt(1.0f + r.get(10) - r.get(0) - r.get(5)); + set( + (r.get(2) + r.get(8)) / s, + (r.get(6) + r.get(9)) / s, + s / 4, + (r.get(4) - r.get(1)) / s + ); + } + } + } + } + + operator RotationMatrix() const { + float wx = _q[3] * _q[0] * 2.0f; + float wy = _q[3] * _q[1] * 2.0f; + float wz = _q[3] * _q[2] * 2.0f; + float xx = _q[0] * _q[0] * 2.0f; + float xy = _q[0] * _q[1] * 2.0f; + float xz = _q[0] * _q[2] * 2.0f; + float yy = _q[1] * _q[1] * 2.0f; + float yz = _q[1] * _q[2] * 2.0f; + float zz = _q[2] * _q[2] * 2.0f; + + return RotationMatrix( + 1.0f - yy - zz, xy + wz, xz - wy, + xy - wz, 1.0f - xx - zz, yz + wx, + xz + wy, yz - wx, 1.0f - xx - yy + ); + } + + void toAngleAxis(float* a, UnitVector* axis) const { + *a = 2.0f * std::acos(_q[3]); + float sinA = std::sqrt(1.0f - _q[3] * _q[3]); + if (std::abs(sinA) < 0.00001f) + axis->set(1.0f, 0.0f, 0.0f); + else + axis->set( + _q[0] / sinA, + _q[1] / sinA, + _q[2] / sinA + ); + } + + UnitVector forward() const { + float wx = _q[3] * _q[0] * 2.0f; + float wy = _q[3] * _q[1] * 2.0f; + float xx = _q[0] * _q[0] * 2.0f; + float xz = _q[0] * _q[2] * 2.0f; + float yy = _q[1] * _q[1] * 2.0f; + float yz = _q[1] * _q[2] * 2.0f; + + return UnitVector(-xz - wy, -yz + wx, -1.0f + xx + yy); + } + + UnitVector backward() const { + float wx = _q[3] * _q[0] * 2.0f; + float wy = _q[3] * _q[1] * 2.0f; + float xx = _q[0] * _q[0] * 2.0f; + float xz = _q[0] * _q[2] * 2.0f; + float yy = _q[1] * _q[1] * 2.0f; + float yz = _q[1] * _q[2] * 2.0f; + + return UnitVector(xz + wy, yz - wx, 1.0f - xx - yy); + } + + UnitVector left() const { + float wy = _q[3] * _q[1] * 2.0f; + float wz = _q[3] * _q[2] * 2.0f; + float xy = _q[0] * _q[1] * 2.0f; + float xz = _q[0] * _q[2] * 2.0f; + float yy = _q[1] * _q[1] * 2.0f; + float zz = _q[2] * _q[2] * 2.0f; + + return UnitVector(-1.0f + yy + zz, -xy - wz, -xz + wy); + } + + UnitVector right() const { + float wy = _q[3] * _q[1] * 2.0f; + float wz = _q[3] * _q[2] * 2.0f; + float xy = _q[0] * _q[1] * 2.0f; + float xz = _q[0] * _q[2] * 2.0f; + float yy = _q[1] * _q[1] * 2.0f; + float zz = _q[2] * _q[2] * 2.0f; + + return UnitVector(1.0f - yy - zz, xy + wz, xz - wy); + } + + UnitVector up() const { + float wx = _q[3] * _q[0] * 2.0f; + float wz = _q[3] * _q[2] * 2.0f; + float xx = _q[0] * _q[0] * 2.0f; + float xy = _q[0] * _q[1] * 2.0f; + float yz = _q[1] * _q[2] * 2.0f; + float zz = _q[2] * _q[2] * 2.0f; + + return UnitVector(xy - wz, 1.0f - xx - zz, yz + wx); + } + + UnitVector down() const { + float wx = _q[3] * _q[0] * 2.0f; + float wz = _q[3] * _q[2] * 2.0f; + float xx = _q[0] * _q[0] * 2.0f; + float xy = _q[0] * _q[1] * 2.0f; + float yz = _q[1] * _q[2] * 2.0f; + float zz = _q[2] * _q[2] * 2.0f; + + return UnitVector(-xy + wz, -1.0f + xx + zz, -yz + wx); + } + + float getX() const { + return _q[0]; + } + + float getY() const { + return _q[1]; + } + + float getZ() const { + return _q[2]; + } + + float getW() const { + return _q[3]; + } + + void multiplyBy(const UnitQuat& q) { + float tempX = _q[0]; + float tempY = _q[1]; + float tempZ = _q[2]; + float tempW = _q[3]; + + _q[0] = tempW * q._q[0] + q._q[3] * tempX + + tempY * q._q[2] - q._q[1] * tempZ; + _q[1] = tempW * q._q[1] + q._q[3] * tempY + + tempZ * q._q[0] - q._q[2] * tempX; + _q[2] = tempW * q._q[2] + q._q[3] * tempZ + + tempX * q._q[1] - q._q[0] * tempY; + _q[3] = tempW * q._q[3] + - tempX * q._q[0] + - tempY * q._q[1] + - tempZ * q._q[2]; + + if (++_renormalizeCount == 5) { + float length = std::sqrt( + _q[0] * _q[0] + + _q[1] * _q[1] + + _q[2] * _q[2] + + _q[3] * _q[3] + ); + _q[0] /= length; + _q[1] /= length; + _q[2] /= length; + _q[3] /= length; + _renormalizeCount = 0; + } + } + + void preMultiplyBy(const UnitQuat& q) { + float tempX = _q[0]; + float tempY = _q[1]; + float tempZ = _q[2]; + float tempW = _q[3]; + + _q[0] = q._q[3] * tempX + tempW * q._q[0] + + q._q[1] * tempZ - tempY * q._q[2]; + _q[1] = q._q[3] * tempY + tempW * q._q[1] + + q._q[2] * tempX - tempZ * q._q[0]; + _q[2] = q._q[3] * tempZ + tempW * q._q[2] + + q._q[0] * tempY - tempX * q._q[1]; + _q[3] = q._q[3] * tempW + - q._q[0] * tempX + - q._q[1] * tempY + - q._q[2] * tempZ; + + if (++_renormalizeCount == 5) { + float length = std::sqrt( + _q[0] * _q[0] + + _q[1] * _q[1] + + _q[2] * _q[2] + + _q[3] * _q[3] + ); + _q[0] /= length; + _q[1] /= length; + _q[2] /= length; + _q[3] /= length; + _renormalizeCount = 0; + } + } + + static UnitQuat pitch(float a) { + a *= 0.5f; + return UnitQuat(std::sin(a), 0.0f, 0.0f, std::cos(a)); + } + + static UnitQuat heading(float a) { + a *= 0.5f; + return UnitQuat(0.0f, std::sin(a), 0.0f, std::cos(a)); + } + + static UnitQuat roll(float a) { + a *= 0.5f; + return UnitQuat(0.0f, 0.0f, std::sin(a), std::cos(a)); + } +}; + +#endif // _VECTOR_HH diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/vroot.hh kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/vroot.hh --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/src/vroot.hh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/src/vroot.hh 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,160 @@ +/* + * Really Slick XScreenSavers + * Copyright (C) 2002-2006 Michael Chapman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ***************************************************************************** + * + * This is a Linux port of the Really Slick Screensavers, + * Copyright (C) 2002 Terence M. Welsh, available from www.reallyslick.com + */ + +/* + * Changed declaration of i to unsigned int so g++ doesn't give a warning. + * -- Michael Chapman, 17 Nov 2002 + * Filename and wrapper #ifndef update. + * -- Michael Chapman, 22 Jun 2003 + * + * -- Michael Chapman, 17 Nov 2002 + */ + +/*****************************************************************************/ +/** Copyright 1991 by Andreas Stolcke **/ +/** Copyright 1990 by Solbourne Computer Inc. **/ +/** Longmont, Colorado **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** name of Solbourne not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** ANDREAS STOLCKE AND SOLBOURNE COMPUTER INC. DISCLAIMS ALL WARRANTIES **/ +/** WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF **/ +/** MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ANDREAS STOLCKE **/ +/** OR SOLBOURNE BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL **/ +/** DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * vroot.h -- Virtual Root Window handling header file + * + * This header file redefines the X11 macros RootWindow and DefaultRootWindow, + * making them look for a virtual root window as provided by certain `virtual' + * window managers like swm and tvtwm. If none is found, the ordinary root + * window is returned, thus retaining backward compatibility with standard + * window managers. + * The function implementing the virtual root lookup remembers the result of + * its last invocation to avoid overhead in the case of repeated calls + * on the same display and screen arguments. + * The lookup code itself is taken from Tom LaStrange's ssetroot program. + * + * Most simple root window changing X programs can be converted to using + * virtual roots by just including + * + * #include + * + * after all the X11 header files. It has been tested on such popular + * X clients as xphoon, xfroot, xloadimage, and xaqua. + * It also works with the core clients xprop, xwininfo, xwd, and editres + * (and is necessary to get those clients working under tvtwm). + * It does NOT work with xsetroot; get the xsetroot replacement included in + * the tvtwm distribution instead. + * + * Andreas Stolcke , 9/7/90 + * - replaced all NULL's with properly cast 0's, 5/6/91 + * - free children list (suggested by Mark Martin ), 5/16/91 + * - include X11/Xlib.h and support RootWindowOfScreen, too 9/17/91 + */ + +#ifndef _VROOT_HH +#define _VROOT_HH + +#if !defined(lint) && !defined(SABER) +static const char vroot_rcsid[] = + "#Id: vroot.h,v 1.4 1991/09/30 19:23:16 stolcke Exp stolcke #"; +#endif + +#include +#include +#include + +static Window +#ifdef __STDC__ /* ANSIfication added by jwz, to avoid superfluous warnings. */ +VirtualRootWindowOfScreen(Screen *screen) +#else /* !__STDC__ */ +VirtualRootWindowOfScreen(screen) Screen *screen; +#endif /* !__STDC__ */ +{ + static Screen *save_screen = (Screen *)0; + static Window root = (Window)0; + + if (screen != save_screen) { + Display *dpy = DisplayOfScreen(screen); + Atom __SWM_VROOT = None; + unsigned int i; + Window rootReturn, parentReturn, *children; + unsigned int numChildren; + + root = RootWindowOfScreen(screen); + + /* go look for a virtual root */ + __SWM_VROOT = XInternAtom(dpy, "__SWM_VROOT", False); + if (XQueryTree(dpy, root, &rootReturn, &parentReturn, + &children, &numChildren)) { + for (i = 0; i < numChildren; i++) { + Atom actual_type; + int actual_format; + unsigned long nitems, bytesafter; + unsigned char *newRoot = (unsigned char *)0; + + if (XGetWindowProperty(dpy, children[i], + __SWM_VROOT, 0, 1, False, XA_WINDOW, + &actual_type, &actual_format, + &nitems, &bytesafter, &newRoot) == Success + && newRoot) { + root = *(Window *)newRoot; + break; + } + } + if (children) + XFree((char *)children); + } + + save_screen = screen; + } + + return root; +} + +#undef RootWindowOfScreen +#define RootWindowOfScreen(s) VirtualRootWindowOfScreen(s) + +#undef RootWindow +#define RootWindow(dpy,screen) \ + VirtualRootWindowOfScreen(ScreenOfDisplay(dpy,screen)) + +#undef DefaultRootWindow +#define DefaultRootWindow(dpy) \ + VirtualRootWindowOfScreen(DefaultScreenOfDisplay(dpy)) + +#endif /* _VROOT_HH */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/THANKS kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/THANKS --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/THANKS 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/THANKS 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,12 @@ +Many thanks to (in no special order): + +* Terry Welsh, for writing the screensavers in the first place. And releasing + the source! +* Jeff Gibson, for pointing out an incompatibility with older versions of g++. +* Bret Towe, for a useful Makefile patch. +* Ari Pollak, for packaging rsxs for Debian. +* Phillip Pi, for suggesting the configure script should let the user choose + the screensavers to install. +* Florian Thiel, for testing with g++ 2.95 and finding some bugs. + +... and to everyone that's downloaded and tried this package out! diff -Nru kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/xbmc/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/xbmc/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/screensavers/rsxs-0.9/xbmc/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/screensavers/rsxs-0.9/xbmc/Makefile.in 2015-10-19 08:39:16.000000000 +0000 @@ -0,0 +1,58 @@ +ARCH=@ARCH@ +CXXFLAGS=-fPIC + +.PHONY: compile + +OUTDIR=@abs_top_srcdir@/addons +RSXS=.. + +DIRS=$(RSXS) + +RSXS-OBJS=$(RSXS)/src/common.o $(RSXS)/src/color.o $(RSXS)/lib/libmisc.a + +SOLARWINDS-OUT=$(OUTDIR)/screensaver.rsxs.solarwinds/Solarwinds.xbs +SOLARWINDS-DEP=$(RSXS)/src/solarwinds/rs-solarwinds + +PLASMA-OUT=$(OUTDIR)/screensaver.rsxs.plasma/Plasma.xbs +PLASMA-DEP=$(RSXS)/src/plasma/rs-plasma + +EUPHORIA-OUT=$(OUTDIR)/screensaver.rsxs.euphoria/Euphoria.xbs +EUPHORIA-DEP=$(RSXS)/src/euphoria/rs-euphoria + +CLEAN_FILES=$(SOLARWINDS-OUT) $(PLASMA-OUT) $(EUPHORIA-OUT) + +all: $(SOLARWINDS-OUT) $(PLASMA-OUT) $(EUPHORIA-OUT); + +$(SOLARWINDS-OUT): $(SOLARWINDS-DEP) +ifeq ($(findstring osx,$(ARCH)), osx) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -bundle -flat_namespace -undefined dynamic_lookup \ + -o $(SOLARWINDS-OUT) $(RSXS)/src/solarwinds/*.o $(RSXS-OBJS) +else + $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -o $(SOLARWINDS-OUT) $(RSXS)/src/solarwinds/*.o $(RSXS-OBJS) -lXmu -lGL -lX11 -lGLU +endif + +$(PLASMA-OUT): $(PLASMA-DEP) +ifeq ($(findstring osx,$(ARCH)), osx) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -bundle -flat_namespace -undefined dynamic_lookup \ + -o $(PLASMA-OUT) $(RSXS)/src/plasma/*.o $(RSXS-OBJS) +else + $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -o $(PLASMA-OUT) $(RSXS)/src/plasma/*.o $(RSXS-OBJS) -lXmu -lGL -lX11 -lGLU +endif + +$(EUPHORIA-OUT): $(EUPHORIA-DEP) +ifeq ($(findstring osx,$(ARCH)), osx) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -bundle -flat_namespace -undefined dynamic_lookup \ + -o $(EUPHORIA-OUT) $(RSXS)/src/euphoria/*.o $(RSXS)/src/pngimage.o $(RSXS-OBJS) -lpng +else + $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -o $(EUPHORIA-OUT) $(RSXS)/src/euphoria/*.o $(RSXS)/src/pngimage.o $(RSXS-OBJS) -lXmu -lpng -lGL -lX11 -lGLU +endif + +$(SOLARWINDS-DEP) : $(RSXS) +$(PLASMA-DEP) : $(RSXS) +$(EUPHORIA-DEP) : $(RSXS) + +$(RSXS): compile + $(MAKE) -C $(RSXS) + +include @abs_top_srcdir@/Makefile.include + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/SectionLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/SectionLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/SectionLoader.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/SectionLoader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -26,6 +26,8 @@ #include "utils/log.h" #include "utils/StringUtils.h" +using namespace std; + #define g_sectionLoader XBMC_GLOBAL_USE(CSectionLoader) // delay for unloading dll's @@ -128,7 +130,7 @@ { // delete the dll's CSingleLock lock(g_sectionLoader.m_critSection); - std::vector::iterator it = g_sectionLoader.m_vecLoadedDLLs.begin(); + vector::iterator it = g_sectionLoader.m_vecLoadedDLLs.begin(); while (it != g_sectionLoader.m_vecLoadedDLLs.end()) { CDll& dll = *it; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/AdvancedSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/AdvancedSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/AdvancedSettings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/AdvancedSettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,40 +18,35 @@ * */ -#include "AdvancedSettings.h" - -#include -#include -#include -#include +#include -#include "addons/AddonManager.h" -#include "addons/AudioDecoder.h" -#include "addons/IAddon.h" +#include "system.h" +#include "AdvancedSettings.h" #include "Application.h" +#include "network/DNSNameCache.h" #include "filesystem/File.h" -#include "filesystem/SpecialProtocol.h" +#include "utils/LangCodeExpander.h" #include "LangInfo.h" -#include "network/DNSNameCache.h" #include "profiles/ProfilesManager.h" #include "settings/lib/Setting.h" #include "settings/Settings.h" #include "settings/SettingUtils.h" -#include "system.h" -#include "utils/LangCodeExpander.h" -#include "utils/log.h" #include "utils/StringUtils.h" #include "utils/SystemInfo.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "utils/XMLUtils.h" - +#include "utils/log.h" +#include "filesystem/SpecialProtocol.h" +#include "addons/IAddon.h" +#include "addons/AddonManager.h" +#include "addons/AudioDecoder.h" #if defined(TARGET_DARWIN_IOS) #include "osx/DarwinUtils.h" #endif using namespace ADDON; using namespace XFILE; +using namespace std; CAdvancedSettings::CAdvancedSettings() { @@ -70,7 +65,7 @@ CLog::Log(LOGNOTICE, "Default Audio Player: %s", m_audioDefaultPlayer.c_str()); // setup any logging... - if (CSettings::GetInstance().GetBool(CSettings::SETTING_DEBUG_SHOWLOGINFO)) + if (CSettings::Get().GetBool("debug.showloginfo")) { m_logLevel = std::max(m_logLevelHint, LOG_LEVEL_DEBUG_FREEMEM); CLog::Log(LOGNOTICE, "Enabled debug logging due to GUI setting (%d)", m_logLevel); @@ -82,8 +77,8 @@ } CLog::SetLogLevel(m_logLevel); - m_extraLogEnabled = CSettings::GetInstance().GetBool(CSettings::SETTING_DEBUG_EXTRALOGGING); - setExtraLogLevel(CSettings::GetInstance().GetList(CSettings::SETTING_DEBUG_SETEXTRALOGLEVEL)); + m_extraLogEnabled = CSettings::Get().GetBool("debug.extralogging"); + setExtraLogLevel(CSettings::Get().GetList("debug.setextraloglevel")); } void CAdvancedSettings::OnSettingsUnloaded() @@ -97,11 +92,11 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_DEBUG_SHOWLOGINFO) + if (settingId == "debug.showloginfo") SetDebugMode(((CSettingBool*)setting)->GetValue()); - else if (settingId == CSettings::SETTING_DEBUG_EXTRALOGGING) + else if (settingId == "debug.extralogging") m_extraLogEnabled = static_cast(setting)->GetValue(); - else if (settingId == CSettings::SETTING_DEBUG_SETEXTRALOGLEVEL) + else if (settingId == "debug.setextraloglevel") setExtraLogLevel(CSettingUtils::GetList(static_cast(setting))); } @@ -124,6 +119,14 @@ m_omxHWAudioDecode = false; m_omxDecodeStartWithValidFrame = true; + m_karaokeSyncDelayCDG = 0.0f; + m_karaokeSyncDelayLRC = 0.0f; + m_karaokeChangeGenreForKaraokeSongs = false; + m_karaokeKeepDelay = true; + m_karaokeStartIndex = 1; + m_karaokeAlwaysEmptyOnCdgs = 1; + m_karaokeUseSongSpecificBackground = 0; + m_audioDefaultPlayer = "paplayer"; m_audioPlayCountMinimumPercent = 90.0f; @@ -161,7 +164,7 @@ m_DXVACheckCompatibilityPresent = false; m_DXVAForceProcessorRenderer = true; m_DXVANoDeintProcForProgressive = false; - m_DXVAAllowHqScaling = true; + m_DXVAAllowHqScaling = false; m_videoFpsDetect = 1; m_videoBusyDialogDelay_ms = 500; m_stagefrightConfig.useAVCcodec = -1; @@ -200,7 +203,7 @@ m_fullScreenOnMovieStart = true; m_cachePath = "special://temp/"; - m_videoCleanDateTimeRegExp = "(.*[^ _\\,\\.\\(\\)\\[\\]\\-])[ _\\.\\(\\)\\[\\]\\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\\,\\.\\(\\)\\[\\]\\-]|[^0-9]$)?"; + m_videoCleanDateTimeRegExp = "(.*[^ _\\,\\.\\(\\)\\[\\]\\-])[ _\\.\\(\\)\\[\\]\\-]+(19[0-9][0-9]|20[0-1][0-9])([ _\\,\\.\\(\\)\\[\\]\\-]|[^0-9]$)"; m_videoCleanStringRegExps.clear(); m_videoCleanStringRegExps.push_back("[ _\\,\\.\\(\\)\\[\\]\\-](ac3|dts|custom|dc|remastered|divx|divx5|dsr|dsrip|dutch|dvd|dvd5|dvd9|dvdrip|dvdscr|dvdscreener|screener|dvdivx|cam|fragment|fs|hdtv|hdrip|hdtvrip|internal|limited|multisubs|ntsc|ogg|ogm|pal|pdtv|proper|repack|rerip|retail|r3|r5|bd5|se|svcd|swedish|german|read.nfo|nfofix|unrated|extended|ws|telesync|ts|telecine|tc|brrip|bdrip|480p|480i|576p|576i|720p|720i|1080p|1080i|3d|hrhd|hrhdtv|hddvd|bluray|x264|h264|xvid|xvidvd|xxx|www.www|cd[1-9]|\\[.*\\])([ _\\,\\.\\(\\)\\[\\]\\-]|$)"); @@ -250,7 +253,6 @@ m_fanartRes = 1080; m_imageRes = 720; m_useDDSFanart = false; - m_imageScalingAlgorithm = CPictureScalingAlgorithm::Default; m_sambaclienttimeout = 10; m_sambadoscodepage = ""; @@ -264,16 +266,18 @@ m_fanartImages = "fanart.jpg|fanart.png"; m_bMusicLibraryAllItemsOnBottom = false; + m_bMusicLibraryAlbumsSortByArtistThenYear = false; m_bMusicLibraryCleanOnUpdate = false; m_iMusicLibraryRecentlyAddedItems = 25; m_strMusicLibraryAlbumFormat = ""; + m_strMusicLibraryAlbumFormatRight = ""; m_prioritiseAPEv2tags = false; m_musicItemSeparator = " / "; m_videoItemSeparator = " / "; - m_iMusicLibraryDateAdded = 1; // prefer mtime over ctime and current time m_bVideoLibraryAllItemsOnBottom = false; m_iVideoLibraryRecentlyAddedItems = 25; + m_bVideoLibraryHideEmptySeries = false; m_bVideoLibraryCleanOnUpdate = false; m_bVideoLibraryUseFastHash = true; m_bVideoLibraryExportAutoThumbs = false; @@ -313,10 +317,12 @@ m_playlistTimeout = 20; // 20 seconds timeout m_GLRectangleHack = false; m_iSkipLoopFilter = 0; + m_AllowD3D9Ex = true; + m_ForceD3D9Ex = false; + m_AllowDynamicTextures = true; m_RestrictCapsMask = 0; m_sleepBeforeFlip = 0; m_bVirtualShares = true; - m_bAllowDeferredRendering = true; //caused lots of jerks //#ifdef TARGET_WINDOWS @@ -390,7 +396,7 @@ std::string logDir = getenv("HOME"); #if defined(TARGET_DARWIN_OSX) logDir += "/Library/Logs/"; - #else // ios + #else // ios/atv2 logDir += "/" + std::string(CDarwinUtils::GetAppRootFolder()) + "/"; #endif m_logFolder = logDir; @@ -412,7 +418,7 @@ ParseSettingsFile("special://xbmc/system/advancedsettings.xml"); for (unsigned int i = 0; i < m_settingsFiles.size(); i++) ParseSettingsFile(m_settingsFiles[i]); - ParseSettingsFile(CProfilesManager::GetInstance().GetUserDataItem("advancedsettings.xml")); + ParseSettingsFile(CProfilesManager::Get().GetUserDataItem("advancedsettings.xml")); // Add the list of disc stub extensions (if any) to the list of video extensions if (!m_discStubExtensions.empty()) @@ -495,6 +501,25 @@ XMLUtils::GetBoolean(pElement, "omxdecodestartwithvalidframe", m_omxDecodeStartWithValidFrame); } + pElement = pRootElement->FirstChildElement("karaoke"); + if (pElement) + { + XMLUtils::GetFloat(pElement, "syncdelaycdg", m_karaokeSyncDelayCDG, -3.0f, 3.0f); // keep the old name for comp + XMLUtils::GetFloat(pElement, "syncdelaylrc", m_karaokeSyncDelayLRC, -3.0f, 3.0f); + XMLUtils::GetBoolean(pElement, "alwaysreplacegenre", m_karaokeChangeGenreForKaraokeSongs ); + XMLUtils::GetBoolean(pElement, "storedelay", m_karaokeKeepDelay ); + XMLUtils::GetInt(pElement, "autoassignstartfrom", m_karaokeStartIndex, 1, 2000000000); + XMLUtils::GetBoolean(pElement, "nocdgbackground", m_karaokeAlwaysEmptyOnCdgs ); + XMLUtils::GetBoolean(pElement, "lookupsongbackground", m_karaokeUseSongSpecificBackground ); + + TiXmlElement* pKaraokeBackground = pElement->FirstChildElement("defaultbackground"); + if (pKaraokeBackground) + { + pKaraokeBackground->QueryStringAttribute("type", &m_karaokeDefaultBackgroundType); + pKaraokeBackground->QueryStringAttribute("path", &m_karaokeDefaultBackgroundFilePath); + } + } + pElement = pRootElement->FirstChildElement("video"); if (pElement) { @@ -708,10 +733,11 @@ XMLUtils::GetInt(pElement, "recentlyaddeditems", m_iMusicLibraryRecentlyAddedItems, 1, INT_MAX); XMLUtils::GetBoolean(pElement, "prioritiseapetags", m_prioritiseAPEv2tags); XMLUtils::GetBoolean(pElement, "allitemsonbottom", m_bMusicLibraryAllItemsOnBottom); + XMLUtils::GetBoolean(pElement, "albumssortbyartistthenyear", m_bMusicLibraryAlbumsSortByArtistThenYear); XMLUtils::GetBoolean(pElement, "cleanonupdate", m_bMusicLibraryCleanOnUpdate); XMLUtils::GetString(pElement, "albumformat", m_strMusicLibraryAlbumFormat); + XMLUtils::GetString(pElement, "albumformatright", m_strMusicLibraryAlbumFormatRight); XMLUtils::GetString(pElement, "itemseparator", m_musicItemSeparator); - XMLUtils::GetInt(pElement, "dateadded", m_iMusicLibraryDateAdded); } pElement = pRootElement->FirstChildElement("videolibrary"); @@ -719,6 +745,7 @@ { XMLUtils::GetBoolean(pElement, "allitemsonbottom", m_bVideoLibraryAllItemsOnBottom); XMLUtils::GetInt(pElement, "recentlyaddeditems", m_iVideoLibraryRecentlyAddedItems, 1, INT_MAX); + XMLUtils::GetBoolean(pElement, "hideemptyseries", m_bVideoLibraryHideEmptySeries); XMLUtils::GetBoolean(pElement, "cleanonupdate", m_bVideoLibraryCleanOnUpdate); XMLUtils::GetBoolean(pElement, "usefasthash", m_bVideoLibraryUseFastHash); XMLUtils::GetString(pElement, "itemseparator", m_videoItemSeparator); @@ -793,7 +820,7 @@ const char* hide = pElement->Attribute("hide"); if (hide == NULL || strnicmp("false", hide, 4) != 0) { - CSetting *setting = CSettings::GetInstance().GetSetting(CSettings::SETTING_DEBUG_SHOWLOGINFO); + CSetting *setting = CSettings::Get().GetSetting("debug.showloginfo"); if (setting != NULL) setting->SetVisible(false); } @@ -824,11 +851,13 @@ XMLUtils::GetInt(pRootElement,"skiploopfilter", m_iSkipLoopFilter, -16, 48); XMLUtils::GetFloat(pRootElement, "forcedswaptime", m_ForcedSwapTime, 0.0, 100.0); + XMLUtils::GetBoolean(pRootElement,"allowd3d9ex", m_AllowD3D9Ex); + XMLUtils::GetBoolean(pRootElement,"forced3d9ex", m_ForceD3D9Ex); + XMLUtils::GetBoolean(pRootElement,"allowdynamictextures", m_AllowDynamicTextures); XMLUtils::GetUInt(pRootElement,"restrictcapsmask", m_RestrictCapsMask); XMLUtils::GetFloat(pRootElement,"sleepbeforeflip", m_sleepBeforeFlip, 0.0f, 1.0f); XMLUtils::GetBoolean(pRootElement,"virtualshares", m_bVirtualShares); XMLUtils::GetUInt(pRootElement, "packagefoldersize", m_addonPackageFolderSize); - XMLUtils::GetBoolean(pRootElement, "allowdeferredrendering", m_bAllowDeferredRendering); // EPG pElement = pRootElement->FirstChildElement("epg"); @@ -944,7 +973,7 @@ CLog::Log(LOGDEBUG," Registering substition pair:"); CLog::Log(LOGDEBUG," From: [%s]", strFrom.c_str()); CLog::Log(LOGDEBUG," To: [%s]", strTo.c_str()); - m_pathSubstitutions.push_back(std::make_pair(strFrom,strTo)); + m_pathSubstitutions.push_back(make_pair(strFrom,strTo)); } else { @@ -967,8 +996,6 @@ #if !defined(TARGET_RASPBERRY_PI) XMLUtils::GetBoolean(pRootElement, "useddsfanart", m_useDDSFanart); #endif - if (XMLUtils::GetString(pRootElement, "imagescalingalgorithm", tmp)) - m_imageScalingAlgorithm = CPictureScalingAlgorithm::FromString(tmp); XMLUtils::GetBoolean(pRootElement, "playlistasfolders", m_playlistAsFolders); XMLUtils::GetBoolean(pRootElement, "detectasudf", m_detectAsUdf); @@ -1082,22 +1109,6 @@ XMLUtils::GetBoolean(pDatabase, "compression", m_databaseTV.compression); } - pDatabase = pRootElement->FirstChildElement("adspdatabase"); - if (pDatabase) - { - XMLUtils::GetString(pDatabase, "type", m_databaseADSP.type); - XMLUtils::GetString(pDatabase, "host", m_databaseADSP.host); - XMLUtils::GetString(pDatabase, "port", m_databaseADSP.port); - XMLUtils::GetString(pDatabase, "user", m_databaseADSP.user); - XMLUtils::GetString(pDatabase, "pass", m_databaseADSP.pass); - XMLUtils::GetString(pDatabase, "name", m_databaseADSP.name); - XMLUtils::GetString(pDatabase, "key", m_databaseADSP.key); - XMLUtils::GetString(pDatabase, "cert", m_databaseADSP.cert); - XMLUtils::GetString(pDatabase, "ca", m_databaseADSP.ca); - XMLUtils::GetString(pDatabase, "capath", m_databaseADSP.capath); - XMLUtils::GetString(pDatabase, "ciphers", m_databaseADSP.ciphers); - } - pDatabase = pRootElement->FirstChildElement("epgdatabase"); if (pDatabase) { @@ -1134,13 +1145,13 @@ if (!seekSteps.empty()) { m_seekSteps.clear(); - std::vector steps = StringUtils::Split(seekSteps, ','); - for(std::vector::iterator it = steps.begin(); it != steps.end(); ++it) + std::vector steps = StringUtils::Split(seekSteps, ','); + for(std::vector::iterator it = steps.begin(); it != steps.end(); ++it) m_seekSteps.push_back(atoi((*it).c_str())); } // load in the settings overrides - CSettings::GetInstance().Load(pRootElement, true); // true to hide the settings we read in + CSettings::Get().Load(pRootElement, true); // true to hide the settings we read in } void CAdvancedSettings::Clear() @@ -1268,8 +1279,8 @@ extensions += "|" + extraExtensions; if (XMLUtils::GetString(pRootElement, "remove", extraExtensions) && !extraExtensions.empty()) { - std::vector exts = StringUtils::Split(extraExtensions, '|'); - for (std::vector::const_iterator i = exts.begin(); i != exts.end(); ++i) + vector exts = StringUtils::Split(extraExtensions, '|'); + for (vector::const_iterator i = exts.begin(); i != exts.end(); ++i) { size_t iPos = extensions.find(*i); if (iPos != std::string::npos) @@ -1366,7 +1377,7 @@ std::string result(m_musicExtensions); VECADDONS codecs; - CAddonMgr::GetInstance().GetAddons(ADDON_AUDIODECODER, codecs); + CAddonMgr::Get().GetAddons(ADDON_AUDIODECODER, codecs); for (size_t i=0;i dec(std::static_pointer_cast(codecs[i])); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/AdvancedSettings.h kodi-15.2~git20151019.1039-final/xbmc/settings/AdvancedSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/AdvancedSettings.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/AdvancedSettings.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,10 +21,8 @@ #include #include -#include #include -#include "pictures/PictureScalingAlgorithm.h" #include "settings/lib/ISettingCallback.h" #include "settings/lib/ISettingsHandler.h" #include "utils/GlobalsHandling.h" @@ -123,10 +121,10 @@ static CAdvancedSettings* getInstance(); - virtual void OnSettingsLoaded() override; - virtual void OnSettingsUnloaded() override; + virtual void OnSettingsLoaded(); + virtual void OnSettingsUnloaded(); - virtual void OnSettingChanged(const CSetting *setting) override; + virtual void OnSettingChanged(const CSetting *setting); void Initialize(); bool Initialized() { return m_initialized; }; @@ -254,7 +252,6 @@ */ unsigned int GetThumbSize() const { return m_imageRes / 2; }; bool m_useDDSFanart; - CPictureScalingAlgorithm::Algorithm m_imageScalingAlgorithm; int m_sambaclienttimeout; std::string m_sambadoscodepage; @@ -268,10 +265,11 @@ std::string m_fanartImages; int m_iMusicLibraryRecentlyAddedItems; - int m_iMusicLibraryDateAdded; bool m_bMusicLibraryAllItemsOnBottom; + bool m_bMusicLibraryAlbumsSortByArtistThenYear; bool m_bMusicLibraryCleanOnUpdate; std::string m_strMusicLibraryAlbumFormat; + std::string m_strMusicLibraryAlbumFormatRight; bool m_prioritiseAPEv2tags; std::string m_musicItemSeparator; std::string m_videoItemSeparator; @@ -279,6 +277,7 @@ bool m_bVideoLibraryAllItemsOnBottom; int m_iVideoLibraryRecentlyAddedItems; + bool m_bVideoLibraryHideEmptySeries; bool m_bVideoLibraryCleanOnUpdate; bool m_bVideoLibraryUseFastHash; bool m_bVideoLibraryExportAutoThumbs; @@ -325,10 +324,22 @@ int m_iSkipLoopFilter; float m_ForcedSwapTime; /* if nonzero, set's the explicit time in ms to allocate for buffer swap */ + bool m_AllowD3D9Ex; + bool m_ForceD3D9Ex; + bool m_AllowDynamicTextures; unsigned int m_RestrictCapsMask; float m_sleepBeforeFlip; ///< if greather than zero, XBMC waits for raster to be this amount through the frame prior to calling the flip bool m_bVirtualShares; - bool m_bAllowDeferredRendering; + + float m_karaokeSyncDelayCDG; // seems like different delay is needed for CDG and MP3s + float m_karaokeSyncDelayLRC; + bool m_karaokeChangeGenreForKaraokeSongs; + bool m_karaokeKeepDelay; // store user-changed song delay in the database + int m_karaokeStartIndex; // auto-assign numbering start from this value + bool m_karaokeAlwaysEmptyOnCdgs; // always have empty background on CDG files + bool m_karaokeUseSongSpecificBackground; // use song-specific video or image if available instead of default + std::string m_karaokeDefaultBackgroundType; // empty string or "vis", "image" or "video" + std::string m_karaokeDefaultBackgroundFilePath; // only for "image" or "video" types above std::string m_cpuTempCmd; std::string m_gpuTempCmd; @@ -347,7 +358,6 @@ DatabaseSettings m_databaseVideo; // advanced video database setup DatabaseSettings m_databaseTV; // advanced tv database setup DatabaseSettings m_databaseEpg; /*!< advanced EPG database setup */ - DatabaseSettings m_databaseADSP; /*!< advanced audio dsp database setup */ bool m_guiVisualizeDirtyRegions; int m_guiAlgorithmDirtyRegions; @@ -373,9 +383,6 @@ void SetDebugMode(bool debug); - //! \brief Toggles dirty-region visualization - void ToggleDirtyRegionVisualization() { m_guiVisualizeDirtyRegions = !m_guiVisualizeDirtyRegions; }; - // runtime settings which cannot be set from advancedsettings.xml std::string m_pictureExtensions; std::string m_videoExtensions; @@ -400,5 +407,4 @@ void setExtraLogLevel(const std::vector &components); }; -XBMC_GLOBAL_REF(CAdvancedSettings,g_advancedSettings); -#define g_advancedSettings XBMC_GLOBAL_USE(CAdvancedSettings) +XBMC_GLOBAL(CAdvancedSettings,g_advancedSettings); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/AudioDSPSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/AudioDSPSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/AudioDSPSettings.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/AudioDSPSettings.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ -// AudioDSPSettings.cpp: implementation of the CAudioSettings class. -// -////////////////////////////////////////////////////////////////////// - -#include "AudioDSPSettings.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSPMode.h" - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -CAudioSettings::CAudioSettings() -{ - m_MasterStreamType = AE_DSP_ASTREAM_AUTO; - m_MasterStreamTypeSel = AE_DSP_ASTREAM_AUTO; - m_MasterStreamBase = AE_DSP_ABASE_STEREO; - - memset(m_MasterModes, AE_DSP_MASTER_MODE_ID_PASSOVER, sizeof(m_MasterModes)); -} - -bool CAudioSettings::operator!=(const CAudioSettings &right) const -{ - if (m_MasterStreamType != right.m_MasterStreamType) return true; - if (m_MasterStreamTypeSel != right.m_MasterStreamTypeSel) return true; - if (memcmp(m_MasterModes, right.m_MasterModes, sizeof(m_MasterModes))) return true; - - return false; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/AudioDSPSettings.h kodi-15.2~git20151019.1039-final/xbmc/settings/AudioDSPSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/AudioDSPSettings.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/AudioDSPSettings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ -// AudioDSPSettings.h: interface for the CAudioSettings class. -// -////////////////////////////////////////////////////////////////////// - -#pragma once - -#include "addons/DllAudioDSP.h" -#include "cores/AudioEngine/Utils/AEAudioFormat.h" - -class CAudioSettings -{ -public: - CAudioSettings(); - ~CAudioSettings() {}; - - bool operator!=(const CAudioSettings &right) const; - - int m_MasterStreamTypeSel; - int m_MasterStreamType; - int m_MasterStreamBase; - int m_MasterModes[AE_DSP_ASTREAM_MAX][AE_DSP_ABASE_MAX]; - -private: -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogAudioDSPManager.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogAudioDSPManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogAudioDSPManager.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogAudioDSPManager.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1100 +0,0 @@ -/* - * Copyright (C) 2012-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "GUIDialogAudioDSPManager.h" - -#include "FileItem.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" -#include "dialogs/GUIDialogTextViewer.h" -#include "dialogs/GUIDialogOK.h" -#include "dialogs/GUIDialogBusy.h" -#include "dialogs/GUIDialogYesNo.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "guilib/GUIListContainer.h" -#include "guilib/GUIRadioButtonControl.h" -#include "input/Key.h" -#include "utils/StringUtils.h" - -#define CONTROL_LIST_AVAILABLE 20 -#define CONTROL_LIST_ACTIVE 21 -#define CONTROL_RADIO_BUTTON_CONTINOUS_SAVING 22 -#define CONTROL_BUTTON_APPLY_CHANGES 23 -#define CONTROL_BUTTON_CLEAR_ACTIVE_MODES 24 -#define CONTROL_LIST_MODE_SELECTION 9000 - -#define LIST_AVAILABLE 0 -#define LIST_ACTIVE 1 - -#define LIST_INPUT_RESAMPLE 0 -#define LIST_PRE_PROCESS 1 -#define LIST_MASTER_PROCESS 2 -#define LIST_POST_PROCESS 3 -#define LIST_OUTPUT_RESAMPLE 4 - -using namespace ActiveAE; - -typedef struct -{ - const char* sModeType; - int iModeType; -} DSP_MODE_TYPES; - -static const DSP_MODE_TYPES dsp_mode_types[] = { - { "preprocessing", AE_DSP_MODE_TYPE_PRE_PROCESS }, - { "inputresampling", AE_DSP_MODE_TYPE_INPUT_RESAMPLE }, - { "masterprocessing", AE_DSP_MODE_TYPE_MASTER_PROCESS }, - { "outputresampling", AE_DSP_MODE_TYPE_OUTPUT_RESAMPLE }, - { "postprocessing", AE_DSP_MODE_TYPE_POST_PROCESS }, - { "undefined", AE_DSP_MODE_TYPE_UNDEFINED } -}; - -CGUIDialogAudioDSPManager::CGUIDialogAudioDSPManager(void) - : CGUIDialog(WINDOW_DIALOG_AUDIO_DSP_MANAGER, "DialogAudioDSPManager.xml") -{ - m_bMovingMode = false; - m_bContainsChanges = false; - m_bContinousSaving = true; - m_iSelected[LIST_AVAILABLE] = 0; - m_iSelected[LIST_ACTIVE] = 0; - - for (int ii = 0; ii < AE_DSP_MODE_TYPE_MAX; ii++) - { - m_activeItems[ii] = new CFileItemList; - m_availableItems[ii] = new CFileItemList; - } - - m_iCurrentType = AE_DSP_MODE_TYPE_MASTER_PROCESS; -} - -CGUIDialogAudioDSPManager::~CGUIDialogAudioDSPManager(void) -{ - for (int ii = 0; ii < AE_DSP_MODE_TYPE_MAX; ii++) - { - delete m_activeItems[ii]; - delete m_availableItems[ii]; - } -} - -bool CGUIDialogAudioDSPManager::OnActionMove(const CAction &action) -{ - bool bReturn(false); - int iActionId = action.GetID(); - - if (GetFocusedControlID() == CONTROL_LIST_ACTIVE) - { - if (iActionId == ACTION_MOUSE_MOVE) - { - int iSelected = m_activeViewControl.GetSelectedItem(); - if (m_iSelected[LIST_ACTIVE] < iSelected) - { - iActionId = ACTION_MOVE_DOWN; - } - else if (m_iSelected[LIST_ACTIVE] > iSelected) - { - iActionId = ACTION_MOVE_UP; - } - else - { - return bReturn; - } - } - - if (iActionId == ACTION_MOVE_DOWN || iActionId == ACTION_MOVE_UP || - iActionId == ACTION_PAGE_DOWN || iActionId == ACTION_PAGE_UP) - { - bReturn = true; - CGUIDialog::OnAction(action); - - int iSelected = m_activeViewControl.GetSelectedItem(); - if (!m_bMovingMode) - { - if (iSelected != m_iSelected[LIST_ACTIVE]) - { - m_iSelected[LIST_ACTIVE] = iSelected; - } - } - else - { - bool bMoveUp = iActionId == ACTION_PAGE_UP || iActionId == ACTION_MOVE_UP; - unsigned int iLines = bMoveUp ? abs(m_iSelected[LIST_ACTIVE] - iSelected) : 1; - bool bOutOfBounds = bMoveUp ? m_iSelected[LIST_ACTIVE] <= 0 : m_iSelected[LIST_ACTIVE] >= m_activeItems[m_iCurrentType]->Size() - 1; - if (bOutOfBounds) - { - bMoveUp = !bMoveUp; - iLines = m_activeItems[m_iCurrentType]->Size() - 1; - } - - std::string strNumber; - for (unsigned int iLine = 0; iLine < iLines; iLine++) - { - unsigned int iNewSelect = bMoveUp ? m_iSelected[LIST_ACTIVE] - 1 : m_iSelected[LIST_ACTIVE] + 1; - if (m_activeItems[m_iCurrentType]->Get(iNewSelect)->GetProperty("Number").asString() != "-") - { - strNumber = StringUtils::Format("%i", m_iSelected[LIST_ACTIVE]+1); - m_activeItems[m_iCurrentType]->Get(iNewSelect)->SetProperty("Number", strNumber); - strNumber = StringUtils::Format("%i", iNewSelect+1); - m_activeItems[m_iCurrentType]->Get(m_iSelected[LIST_ACTIVE])->SetProperty("Number", strNumber); - } - m_activeItems[m_iCurrentType]->Swap(iNewSelect, m_iSelected[LIST_ACTIVE]); - m_iSelected[LIST_ACTIVE] = iNewSelect; - } - - SET_CONTROL_FOCUS(CONTROL_LIST_ACTIVE, 0); - - m_activeViewControl.SetItems(*m_activeItems[m_iCurrentType]); - m_activeViewControl.SetSelectedItem(m_iSelected[LIST_ACTIVE]); - } - } - } - - return bReturn; -} - -bool CGUIDialogAudioDSPManager::OnAction(const CAction& action) -{ - return OnActionMove(action) || - CGUIDialog::OnAction(action); -} - -void CGUIDialogAudioDSPManager::OnInitWindow() -{ - CGUIDialog::OnInitWindow(); - - m_iSelected[LIST_AVAILABLE] = 0; - m_iSelected[LIST_ACTIVE] = 0; - m_bMovingMode = false; - m_bContainsChanges = false; - - CGUIRadioButtonControl *radioButton = dynamic_cast(GetControl(CONTROL_RADIO_BUTTON_CONTINOUS_SAVING)); - CGUIButtonControl *applyButton = dynamic_cast(GetControl(CONTROL_BUTTON_APPLY_CHANGES)); - if (!radioButton || !applyButton) - { - helper_LogError(__FUNCTION__); - return; - } - - SET_CONTROL_SELECTED(GetID(), CONTROL_RADIO_BUTTON_CONTINOUS_SAVING, m_bContinousSaving); - applyButton->SetEnabled(!m_bContinousSaving); - - Update(); - SetSelectedModeType(); -} - -void CGUIDialogAudioDSPManager::OnDeinitWindow(int nextWindowID) -{ - if (m_bContainsChanges) - { - if (m_bContinousSaving) - { - SaveList(); - } - else - { - if (CGUIDialogYesNo::ShowAndGetInput(g_localizeStrings.Get(19098), g_localizeStrings.Get(15079))) - { - SaveList(); - } - else - { - m_bContinousSaving = false; - } - } - } - - Clear(); - - CGUIDialog::OnDeinitWindow(nextWindowID); -} - -bool CGUIDialogAudioDSPManager::OnClickListAvailable(CGUIMessage &message) -{ - int iAction = message.GetParam1(); - int iItem = m_availableViewControl.GetSelectedItem(); - - /* Check file item is in list range and get his pointer */ - if (iItem < 0 || iItem >= (int)m_availableItems[m_iCurrentType]->Size()) return true; - - /* Process actions */ - if (iAction == ACTION_SELECT_ITEM || iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_LEFT_CLICK || iAction == ACTION_MOUSE_RIGHT_CLICK) - { - /* Show Contextmenu */ - OnPopupMenu(iItem, LIST_AVAILABLE); - - return true; - } - - return false; -} - -bool CGUIDialogAudioDSPManager::OnClickListActive(CGUIMessage &message) -{ - if (!m_bMovingMode) - { - int iAction = message.GetParam1(); - int iItem = m_activeViewControl.GetSelectedItem(); - - /* Check file item is in list range and get his pointer */ - if (iItem < 0 || iItem >= (int)m_activeItems[m_iCurrentType]->Size()) return true; - - /* Process actions */ - if (iAction == ACTION_SELECT_ITEM || iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_LEFT_CLICK || iAction == ACTION_MOUSE_RIGHT_CLICK) - { - /* Show Contextmenu */ - OnPopupMenu(iItem, LIST_ACTIVE); - - return true; - } - } - else - { - CFileItemPtr pItem = m_activeItems[m_iCurrentType]->Get(m_iSelected[LIST_ACTIVE]); - if (pItem) - { - pItem->Select(false); - pItem->SetProperty("Changed", true); - m_bMovingMode = false; - m_bContainsChanges = true; - - if (m_bContinousSaving) - { - SaveList(); - } - - CGUIListContainer *modeList = dynamic_cast(GetControl(CONTROL_LIST_MODE_SELECTION)); - CGUIButtonControl *applyButton = dynamic_cast(GetControl(CONTROL_BUTTON_APPLY_CHANGES)); - CGUIButtonControl *clearActiveModesButton = dynamic_cast(GetControl(CONTROL_BUTTON_CLEAR_ACTIVE_MODES)); - if (!modeList || !applyButton || !clearActiveModesButton) - { - helper_LogError(__FUNCTION__); - return false; - } - - // reenable all buttons and mode selection list - modeList->SetEnabled(true); - clearActiveModesButton->SetEnabled(true); - if (!m_bContinousSaving) - { - applyButton->SetEnabled(true); - } - - return true; - } - } - - return false; -} - -bool CGUIDialogAudioDSPManager::OnClickRadioContinousSaving(CGUIMessage &message) -{ - CGUIRadioButtonControl *radioButton = dynamic_cast(GetControl(CONTROL_RADIO_BUTTON_CONTINOUS_SAVING)); - CGUIButtonControl *applyChangesButton = dynamic_cast(GetControl(CONTROL_BUTTON_APPLY_CHANGES)); - - if (!radioButton || !applyChangesButton) - { - helper_LogError(__FUNCTION__); - return false; - } - - if (!radioButton->IsSelected()) - { - applyChangesButton->SetEnabled(true); - m_bContinousSaving = false; - } - else - { - m_bContinousSaving = true; - applyChangesButton->SetEnabled(false); - } - - return true; -} - -bool CGUIDialogAudioDSPManager::OnClickApplyChanges(CGUIMessage &message) -{ - SaveList(); - return true; -} - -bool CGUIDialogAudioDSPManager::OnClickClearActiveModes(CGUIMessage &message) -{ - if (m_activeItems[m_iCurrentType]->Size() > 0) - { - for (int iItem = 0; iItem < m_activeItems[m_iCurrentType]->Size(); iItem++) - { - CFileItemPtr pItem = m_activeItems[m_iCurrentType]->Get(iItem); - if (pItem) - { - // remove mode from active mode list and add it to available mode list - CFileItemPtr newItem(dynamic_cast(pItem->Clone())); - newItem->SetProperty("ActiveMode", false); - newItem->SetProperty("Changed", true); - m_availableItems[m_iCurrentType]->Add(newItem); - } - } - m_activeItems[m_iCurrentType]->Clear(); - - // reorder available mode list, so that the mode order is always consistent - m_availableItems[m_iCurrentType]->ClearSortState(); - m_availableItems[m_iCurrentType]->Sort(SortByLabel, SortOrderAscending); - - // update active and available mode list - m_availableViewControl.SetItems(*m_availableItems[m_iCurrentType]); - m_activeViewControl.SetItems(*m_activeItems[m_iCurrentType]); - - m_bContainsChanges = true; - if (m_bContinousSaving) - { - SaveList(); - } - } - - return true; -} - -bool CGUIDialogAudioDSPManager::OnMessageClick(CGUIMessage &message) -{ - int iControl = message.GetSenderId(); - switch(iControl) - { - case CONTROL_LIST_AVAILABLE: - return OnClickListAvailable(message); - case CONTROL_LIST_ACTIVE: - return OnClickListActive(message); - case CONTROL_RADIO_BUTTON_CONTINOUS_SAVING: - return OnClickRadioContinousSaving(message); - case CONTROL_BUTTON_CLEAR_ACTIVE_MODES: - return OnClickClearActiveModes(message); - case CONTROL_BUTTON_APPLY_CHANGES: - return OnClickApplyChanges(message); - default: - return false; - } -} - -bool CGUIDialogAudioDSPManager::OnMessage(CGUIMessage& message) -{ - unsigned int iMessage = message.GetMessage(); - - switch (iMessage) - { - case GUI_MSG_CLICKED: - return OnMessageClick(message); - - case GUI_MSG_ITEM_SELECT: - { - int focusedControl = GetFocusedControlID(); - if (focusedControl == CONTROL_LIST_MODE_SELECTION) - { - CGUIListContainer *modeListPtr = dynamic_cast(GetControl(CONTROL_LIST_MODE_SELECTION)); - - if (modeListPtr) - { - CGUIListItemPtr modeListItem = modeListPtr->GetListItem(0); // get current selected list item - if (modeListItem) - { - std::string currentModeString = modeListItem->GetProperty("currentMode").asString(); - int newModeType = helper_TranslateModeType(currentModeString); - - if (m_iCurrentType != newModeType) - { - m_iCurrentType = newModeType; - SetSelectedModeType(); - } - } - } - } - } - } - - return CGUIDialog::OnMessage(message); -} - -void CGUIDialogAudioDSPManager::OnWindowLoaded(void) -{ - g_graphicsContext.Lock(); - - m_availableViewControl.Reset(); - m_availableViewControl.SetParentWindow(GetID()); - m_availableViewControl.AddView(GetControl(CONTROL_LIST_AVAILABLE)); - - m_activeViewControl.Reset(); - m_activeViewControl.SetParentWindow(GetID()); - m_activeViewControl.AddView(GetControl(CONTROL_LIST_ACTIVE)); - - g_graphicsContext.Unlock(); - - CGUIDialog::OnWindowLoaded(); -} - -void CGUIDialogAudioDSPManager::OnWindowUnload(void) -{ - CGUIDialog::OnWindowUnload(); - - m_availableViewControl.Reset(); - m_activeViewControl.Reset(); -} - -bool CGUIDialogAudioDSPManager::OnPopupMenu(int iItem, int listType) -{ - // popup the context menu - // grab our context menu - CContextButtons buttons; - int listSize = 0; - CFileItemPtr pItem; - - if (listType == LIST_ACTIVE) - { - listSize = m_activeItems[m_iCurrentType]->Size(); - pItem = m_activeItems[m_iCurrentType]->Get(iItem); - } - else if (listType == LIST_AVAILABLE) - { - listSize = m_availableItems[m_iCurrentType]->Size(); - pItem = m_availableItems[m_iCurrentType]->Get(iItem); - } - - if (!pItem) - { - return false; - } - - // mark the item - if (iItem >= 0 && iItem < listSize) - { - pItem->Select(true); - } - else - { - return false; - } - - if (listType == LIST_ACTIVE) - { - if (listSize > 1) - { - buttons.Add(CONTEXT_BUTTON_MOVE, 116); /* Move mode up or down */ - } - buttons.Add(CONTEXT_BUTTON_ACTIVATE, 24021); /* Used to deactivate addon process type */ - } - else if (listType == LIST_AVAILABLE) - { - if (m_activeItems[m_iCurrentType]->Size() > 0 && (m_iCurrentType == AE_DSP_MODE_TYPE_INPUT_RESAMPLE || m_iCurrentType == AE_DSP_MODE_TYPE_OUTPUT_RESAMPLE)) - { - buttons.Add(CONTEXT_BUTTON_ACTIVATE, 15080); /* Used to swap addon resampling process type */ - } - else - { - buttons.Add(CONTEXT_BUTTON_ACTIVATE, 24022); /* Used to activate addon process type */ - } - } - - if (pItem->GetProperty("SettingsDialog").asInteger() != 0) - { - buttons.Add(CONTEXT_BUTTON_SETTINGS, 15078); /* Used to activate addon process type help description*/ - } - - if (pItem->GetProperty("Help").asInteger() > 0) - { - buttons.Add(CONTEXT_BUTTON_HELP, 15062); /* Used to activate addon process type help description*/ - } - - int choice = CGUIDialogContextMenu::ShowAndGetChoice(buttons); - - // deselect our item - if (iItem >= 0 && iItem < listSize) - { - pItem->Select(false); - } - - if (choice < 0) - { - return false; - } - - return OnContextButton(iItem, (CONTEXT_BUTTON)choice, listType); -} - -bool CGUIDialogAudioDSPManager::OnContextButton(int itemNumber, CONTEXT_BUTTON button, int listType) -{ - CFileItemPtr pItem; - int listSize = 0; - if (listType == LIST_ACTIVE) - { - pItem = m_activeItems[m_iCurrentType]->Get(itemNumber); - listSize = m_activeItems[m_iCurrentType]->Size(); - } - else if (listType == LIST_AVAILABLE) - { - pItem = m_availableItems[m_iCurrentType]->Get(itemNumber); - listSize = m_availableItems[m_iCurrentType]->Size(); - } - - /* Check file item is in list range and get his pointer */ - if (!pItem || itemNumber < 0 || itemNumber >= listSize) - { - return false; - } - - if (button == CONTEXT_BUTTON_HELP) - { - /*! - * Open audio dsp addon mode help text dialog - */ - AE_DSP_ADDON addon; - if (CActiveAEDSP::GetInstance().GetAudioDSPAddon((int)pItem->GetProperty("AddonId").asInteger(), addon)) - { - CGUIDialogTextViewer* pDlgInfo = (CGUIDialogTextViewer*)g_windowManager.GetWindow(WINDOW_DIALOG_TEXT_VIEWER); - pDlgInfo->SetHeading(g_localizeStrings.Get(15062) + " - " + pItem->GetProperty("Name").asString()); - pDlgInfo->SetText(addon->GetString((uint32_t)pItem->GetProperty("Help").asInteger())); - pDlgInfo->Open(); - } - } - else if (button == CONTEXT_BUTTON_ACTIVATE) - { - /*! - * Deactivate selected processing mode - */ - if (pItem->GetProperty("ActiveMode").asBoolean()) - { - // remove mode from active mode list and add it to available mode list - CFileItemPtr newItem(dynamic_cast(pItem->Clone())); - newItem->SetProperty("ActiveMode", false); - newItem->SetProperty("Changed", true); - m_activeItems[m_iCurrentType]->Remove(itemNumber); - m_availableItems[m_iCurrentType]->Add(newItem); - } - else - { - /*! - * Activate selected processing mode - */ - if ((m_iCurrentType == AE_DSP_MODE_TYPE_INPUT_RESAMPLE || m_iCurrentType == AE_DSP_MODE_TYPE_OUTPUT_RESAMPLE) && m_activeItems[m_iCurrentType]->Size() > 0) - { // if there is already an active resampler, now we remove it - CFileItemPtr activeResampler = m_activeItems[m_iCurrentType]->Get(0); - if (activeResampler) - { - CFileItemPtr newItem(dynamic_cast(activeResampler->Clone())); - newItem->SetProperty("ActiveMode", false); - newItem->SetProperty("Changed", true); - - m_availableItems[m_iCurrentType]->Add(newItem); - // clear active list, because only one active resampling mode is supported by ActiveAEDSP - m_activeItems[m_iCurrentType]->Clear(); - } - } - - // remove mode from available mode list and add it to active mode list - CFileItemPtr newItem(dynamic_cast(pItem->Clone())); - - newItem->SetProperty("Number", (int)m_activeItems[m_iCurrentType]->Size() +1); - newItem->SetProperty("Changed", true); - newItem->SetProperty("ActiveMode", true); - - m_availableItems[m_iCurrentType]->Remove(itemNumber); - m_activeItems[m_iCurrentType]->Add(newItem); - } - - m_bContainsChanges = true; - if (m_bContinousSaving) - { - SaveList(); - } - - // reorder available mode list, so that the mode order is always consistent - m_availableItems[m_iCurrentType]->ClearSortState(); - m_availableItems[m_iCurrentType]->Sort(SortByLabel, SortOrderAscending); - - // update active and available mode list - Renumber(); - m_availableViewControl.SetItems(*m_availableItems[m_iCurrentType]); - m_activeViewControl.SetItems(*m_activeItems[m_iCurrentType]); - } - else if (button == CONTEXT_BUTTON_MOVE) - { - m_bMovingMode = true; - pItem->Select(true); - - CGUIListContainer *modeList = dynamic_cast(GetControl(CONTROL_LIST_MODE_SELECTION)); - CGUIButtonControl *applyButton = dynamic_cast(GetControl(CONTROL_BUTTON_APPLY_CHANGES)); - CGUIButtonControl *clearActiveModesButton = dynamic_cast(GetControl(CONTROL_BUTTON_CLEAR_ACTIVE_MODES)); - if (!modeList || !applyButton || !clearActiveModesButton) - { - helper_LogError(__FUNCTION__); - return false; - } - - // if we are in MovingMode all buttons and mode selection list will be disabled! - modeList->SetEnabled(false); - clearActiveModesButton->SetEnabled(false); - if (!m_bContinousSaving) - { - applyButton->SetEnabled(false); - } - } - else if (button == CONTEXT_BUTTON_SETTINGS) - { - int hookId = (int)pItem->GetProperty("SettingsDialog").asInteger(); - if (hookId > 0) - { - AE_DSP_ADDON addon; - if (CActiveAEDSP::GetInstance().GetAudioDSPAddon((int)pItem->GetProperty("AddonId").asInteger(), addon)) - { - AE_DSP_MENUHOOK hook; - AE_DSP_MENUHOOK_DATA hookData; - - hook.category = AE_DSP_MENUHOOK_ALL; - hook.iHookId = hookId; - hook.iRelevantModeId = (unsigned int)pItem->GetProperty("AddonModeNumber").asInteger(); - hookData.category = AE_DSP_MENUHOOK_ALL; - hookData.data.iStreamId = -1; - - /*! - * @note the addon dialog becomes always opened on the back of Kodi ones for this reason a - * "Conditional" - * on skin is needed to hide dialog. - */ - addon->CallMenuHook(hook, hookData); - } - } - else - { - CGUIDialogOK::ShowAndGetInput(19033, 0, 15040, 0); - } - } - - return true; -} - -void CGUIDialogAudioDSPManager::Update() -{ - CGUIDialogBusy* pDlgBusy = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); - if (!pDlgBusy) - { - helper_LogError(__FUNCTION__); - return; - } - pDlgBusy->Open(); - - Clear(); - - AE_DSP_MODELIST modes; - CActiveAEDSPDatabase db; - if (!db.Open()) - { - pDlgBusy->Close(); - CLog::Log(LOGERROR, "DSP Manager - %s - Could not open DSP database for update!", __FUNCTION__); - return; - } - - for (int iModeType = 0; iModeType < AE_DSP_MODE_TYPE_MAX; iModeType++) - { - modes.clear(); - db.GetModes(modes, iModeType); - - // No modes available, nothing to do. - if (!modes.empty()) - { - AE_DSP_MENUHOOK_CAT menuHook = helper_GetMenuHookCategory(iModeType); - int continuesNo = 1; - for (unsigned int iModePtr = 0; iModePtr < modes.size(); iModePtr++) - { - CFileItem *listItem = helper_CreateModeListItem(modes[iModePtr].first, menuHook, &continuesNo); - if (listItem) - { - CFileItemPtr pItem(listItem); - - if (pItem->GetProperty("ActiveMode").asBoolean()) - { - m_activeItems[iModeType]->Add(pItem); - } - else - { - m_availableItems[iModeType]->Add(pItem); - } - } - g_windowManager.ProcessRenderLoop(false); - } - - m_availableItems[iModeType]->Sort(SortByLabel, SortOrderAscending); - if (iModeType == AE_DSP_MODE_TYPE_MASTER_PROCESS) - { - m_activeItems[iModeType]->Sort(SortByLabel, SortOrderAscending); - } - - } - } - - db.Close(); - - pDlgBusy->Close(); -} - -void CGUIDialogAudioDSPManager::SetSelectedModeType(void) -{ - /* lock our display, as this window is rendered from the player thread */ - g_graphicsContext.Lock(); - if (m_iCurrentType > AE_DSP_MODE_TYPE_UNDEFINED && m_iCurrentType < AE_DSP_MODE_TYPE_MAX && !m_bMovingMode) - { - m_availableViewControl.SetCurrentView(CONTROL_LIST_AVAILABLE); - m_activeViewControl.SetCurrentView(CONTROL_LIST_ACTIVE); - - m_availableViewControl.SetItems(*m_availableItems[m_iCurrentType]); - m_activeViewControl.SetItems(*m_activeItems[m_iCurrentType]); - } - - g_graphicsContext.Unlock(); -} - -void CGUIDialogAudioDSPManager::Clear(void) -{ - m_availableViewControl.Clear(); - m_activeViewControl.Clear(); - - for (int ii = 0; ii < AE_DSP_MODE_TYPE_MAX; ii++) - { - m_activeItems[ii]->Clear(); - m_availableItems[ii]->Clear(); - } -} - -void CGUIDialogAudioDSPManager::SaveList(void) -{ - if (!m_bContainsChanges) - return; - - /* display the progress dialog */ - CGUIDialogBusy* pDlgBusy = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); - if (!pDlgBusy) - { - helper_LogError(__FUNCTION__); - return; - } - pDlgBusy->Open(); - - /* persist all modes */ - if (UpdateDatabase(pDlgBusy)) - { - CActiveAEDSP::GetInstance().TriggerModeUpdate(); - - m_bContainsChanges = false; - SetItemsUnchanged(); - } - - pDlgBusy->Close(); -} - -bool CGUIDialogAudioDSPManager::UpdateDatabase(CGUIDialogBusy* pDlgBusy) -{ - CActiveAEDSPDatabase db; - if (!db.Open()) - { - CLog::Log(LOGERROR, "DSP Manager - %s - Could not open DSP database for update!", __FUNCTION__); - return false; - } - - // calculate available items - int maxItems = 0; - for (int i = 0; i < AE_DSP_MODE_TYPE_MAX; i++) - { - maxItems += m_activeItems[i]->Size() + m_availableItems[i]->Size(); - } - - int processedItems = 0; - for (int i = 0; i < AE_DSP_MODE_TYPE_MAX; i++) - { - for (int iListPtr = 0; iListPtr < m_activeItems[i]->Size(); iListPtr++) - { - CFileItemPtr pItem = m_activeItems[i]->Get(iListPtr); - if (pItem->GetProperty("Changed").asBoolean()) - { - bool success = db.UpdateMode( i, - pItem->GetProperty("ActiveMode").asBoolean(), - (int)pItem->GetProperty("AddonId").asInteger(), - (int)pItem->GetProperty("AddonModeNumber").asInteger(), - (int)pItem->GetProperty("Number").asInteger()); - - if (!success) - { - CLog::Log(LOGERROR, "DSP Manager - Could not update DSP database for active mode %i - %s!", - (int)pItem->GetProperty("AddonModeNumber").asInteger(), - pItem->GetProperty("Name").asString().c_str()); - } - } - - processedItems++; - if (pDlgBusy) - { - pDlgBusy->SetProgress((float)(processedItems * 100 / maxItems)); - - if (pDlgBusy->IsCanceled()) - { - return false; - } - } - - g_windowManager.ProcessRenderLoop(false); - } - - for (int iListPtr = 0; iListPtr < m_availableItems[i]->Size(); iListPtr++) - { - CFileItemPtr pItem = m_availableItems[i]->Get(iListPtr); - if (pItem && pItem->GetProperty("Changed").asBoolean()) - { - bool success = db.UpdateMode( i, - pItem->GetProperty("ActiveMode").asBoolean(), - (int)pItem->GetProperty("AddonId").asInteger(), - (int)pItem->GetProperty("AddonModeNumber").asInteger(), - (int)pItem->GetProperty("Number").asInteger()); - - if (!success) - { - CLog::Log(LOGERROR, "DSP Manager - Could not update DSP database for available mode %i - %s!", - (int)pItem->GetProperty("AddonModeNumber").asInteger(), - pItem->GetProperty("Name").asString().c_str()); - } - } - - processedItems++; - if (pDlgBusy) - { - pDlgBusy->SetProgress((float)(processedItems * 100 / maxItems)); - - if (pDlgBusy->IsCanceled()) - { - return false; - } - } - - g_windowManager.ProcessRenderLoop(false); - } - } - db.Close(); - return true; -} - -void CGUIDialogAudioDSPManager::SetItemsUnchanged() -{ - for (int i = 0; i < AE_DSP_MODE_TYPE_MAX; i++) - { - for (int iItemPtr = 0; iItemPtr < m_activeItems[i]->Size(); iItemPtr++) - { - CFileItemPtr pItem = m_activeItems[i]->Get(iItemPtr); - if (pItem) - pItem->SetProperty("Changed", false); - } - - for (int iItemPtr = 0; iItemPtr < m_availableItems[i]->Size(); iItemPtr++) - { - CFileItemPtr pItem = m_availableItems[i]->Get(iItemPtr); - if (pItem) - pItem->SetProperty("Changed", false); - } - } -} - -void CGUIDialogAudioDSPManager::Renumber(void) -{ - int iNextModeNumber(0); - std::string strNumber; - CFileItemPtr pItem; - - for (int iModePtr = 0; iModePtr < m_activeItems[m_iCurrentType]->Size(); iModePtr++) - { - pItem = m_activeItems[m_iCurrentType]->Get(iModePtr); - strNumber = StringUtils::Format("%i", ++iNextModeNumber); - pItem->SetProperty("Number", strNumber); - } -} - - -//! ---- Helper functions ---- - -void CGUIDialogAudioDSPManager::helper_LogError(const char *function) -{ - CLog::Log(LOGERROR, "DSP Manager - %s - GUI value error", function); -} - -int CGUIDialogAudioDSPManager::helper_TranslateModeType(std::string ModeString) -{ - int iType = AE_DSP_MODE_TYPE_UNDEFINED; - for (unsigned int ii = 0; ii < ARRAY_SIZE(dsp_mode_types) && iType == AE_DSP_MODE_TYPE_UNDEFINED; ii++) - { - if (StringUtils::EqualsNoCase(ModeString, dsp_mode_types[ii].sModeType)) - { - iType = dsp_mode_types[ii].iModeType; - } - } - - return iType; -} - -CFileItem *CGUIDialogAudioDSPManager::helper_CreateModeListItem(CActiveAEDSPModePtr &ModePointer, AE_DSP_MENUHOOK_CAT &MenuHook, int *ContinuesNo) -{ - CFileItem *pItem = NULL; - - if (!ContinuesNo) - { - return pItem; - } - - // start to get Addon and Mode properties - const int AddonID = ModePointer->AddonID(); - - std::string addonName; - if (!CActiveAEDSP::GetInstance().GetAudioDSPAddonName(AddonID, addonName)) - { - return pItem; - } - - AE_DSP_ADDON addon; - if (!CActiveAEDSP::GetInstance().GetAudioDSPAddon(AddonID, addon)) - { - return pItem; - } - - std::string modeName = addon->GetString(ModePointer->ModeName()); - - std::string description; - if (ModePointer->ModeDescription() > -1) - { - description = addon->GetString(ModePointer->ModeDescription()); - } - else - { - description = g_localizeStrings.Get(15063); - } - - bool isActive = ModePointer->IsEnabled(); - int number = ModePointer->ModePosition(); - int dialogId = helper_GetDialogId(ModePointer, MenuHook, addon, addonName); - // end to get Addon and Mode properties - - if (isActive) - { - if (number <= 0) - { - number = *ContinuesNo; - (*ContinuesNo)++; - } - - std::string str = StringUtils::Format("%i:%i:%i:%s", - number, - AddonID, - ModePointer->AddonModeNumber(), - ModePointer->AddonModeName().c_str()); - - pItem = new CFileItem(str); - } - else - { - pItem = new CFileItem(modeName); - } - - // set list item properties - pItem->SetProperty("ActiveMode", isActive); - pItem->SetProperty("Number", number); - pItem->SetProperty("Name", modeName); - pItem->SetProperty("Description", description); - pItem->SetProperty("Help", ModePointer->ModeHelp()); - pItem->SetProperty("Icon", ModePointer->IconOwnModePath()); - pItem->SetProperty("SettingsDialog", dialogId); - pItem->SetProperty("AddonId", AddonID); - pItem->SetProperty("AddonModeNumber", ModePointer->AddonModeNumber()); - pItem->SetProperty("AddonName", addonName); - pItem->SetProperty("Changed", false); - - return pItem; -} - -int CGUIDialogAudioDSPManager::helper_GetDialogId(CActiveAEDSPModePtr &ModePointer, AE_DSP_MENUHOOK_CAT &MenuHook, AE_DSP_ADDON &Addon, std::string AddonName) -{ - int dialogId = 0; - - if (ModePointer->HasSettingsDialog()) - { - AE_DSP_MENUHOOKS hooks; - - // Find first general settings dialog about mode - if (CActiveAEDSP::GetInstance().GetMenuHooks(ModePointer->AddonID(), AE_DSP_MENUHOOK_SETTING, hooks)) - { - for (unsigned int i = 0; i < hooks.size() && dialogId == 0; i++) - { - if (hooks[i].iRelevantModeId == ModePointer->AddonModeNumber()) - { - dialogId = hooks[i].iHookId; - } - } - } - - // If nothing was present, check for playback settings - if (dialogId == 0 && CActiveAEDSP::GetInstance().GetMenuHooks(ModePointer->AddonID(), MenuHook, hooks)) - { - for (unsigned int i = 0; i < hooks.size() && (dialogId == 0 || dialogId != -1); i++) - { - if (hooks[i].iRelevantModeId == ModePointer->AddonModeNumber()) - { - if (!hooks[i].bNeedPlayback) - { - dialogId = hooks[i].iHookId; - } - else - { - dialogId = -1; - } - } - } - } - - if (dialogId == 0) - CLog::Log(LOGERROR, "DSP Dialog Manager - %s - Present marked settings dialog of mode %s on addon %s not found", - __FUNCTION__, - Addon->GetString(ModePointer->ModeName()).c_str(), - AddonName.c_str()); - } - - return dialogId; -} - -AE_DSP_MENUHOOK_CAT CGUIDialogAudioDSPManager::helper_GetMenuHookCategory(int CurrentType) -{ - AE_DSP_MENUHOOK_CAT menuHook = AE_DSP_MENUHOOK_ALL; - switch (CurrentType) - { - case AE_DSP_MODE_TYPE_PRE_PROCESS: - menuHook = AE_DSP_MENUHOOK_PRE_PROCESS; - break; - case AE_DSP_MODE_TYPE_MASTER_PROCESS: - menuHook = AE_DSP_MENUHOOK_MASTER_PROCESS; - break; - case AE_DSP_MODE_TYPE_POST_PROCESS: - menuHook = AE_DSP_MENUHOOK_POST_PROCESS; - break; - case AE_DSP_MODE_TYPE_INPUT_RESAMPLE: - case AE_DSP_MODE_TYPE_OUTPUT_RESAMPLE: - menuHook = AE_DSP_MENUHOOK_RESAMPLE; - break; - default: - menuHook = AE_DSP_MENUHOOK_ALL; - break; - }; - - return menuHook; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogAudioDSPManager.h kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogAudioDSPManager.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogAudioDSPManager.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogAudioDSPManager.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ -#pragma once -/* - * Copyright (C) 2012-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "addons/include/kodi_adsp_types.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSPMode.h" -#include "dialogs/GUIDialogContextMenu.h" -#include "guilib/GUIDialog.h" -#include "view/GUIViewControl.h" - -class CGUIDialogBusy; - -namespace ActiveAE -{ - class CGUIDialogAudioDSPManager : public CGUIDialog - { - public: - CGUIDialogAudioDSPManager(void); - virtual ~CGUIDialogAudioDSPManager(void); - virtual bool OnMessage(CGUIMessage& message); - virtual bool OnAction(const CAction& action); - virtual void OnWindowLoaded(void); - virtual void OnWindowUnload(void); - virtual bool HasListItems() const { return true; }; - - protected: - virtual void OnInitWindow(); - virtual void OnDeinitWindow(int nextWindowID); - - virtual bool OnPopupMenu(int iItem, int listType); - virtual bool OnContextButton(int itemNumber, CONTEXT_BUTTON button, int listType); - - virtual bool OnActionMove(const CAction &action); - - virtual bool OnMessageClick(CGUIMessage &message); - - bool OnClickListAvailable(CGUIMessage &message); - bool OnClickListActive(CGUIMessage &message); - bool OnClickRadioContinousSaving(CGUIMessage &message); - bool OnClickApplyChanges(CGUIMessage &message); - bool OnClickClearActiveModes(CGUIMessage &message); - - void SetItemsUnchanged(void); - - private: - void Clear(void); - void Update(void); - void SaveList(void); - void Renumber(void); - bool UpdateDatabase(CGUIDialogBusy* pDlgBusy); - void SetSelectedModeType(void); - - //! helper function prototypes - static void helper_LogError(const char *function); - static int helper_TranslateModeType(std::string ModeString); - static CFileItem *helper_CreateModeListItem(CActiveAEDSPModePtr &ModePointer, AE_DSP_MENUHOOK_CAT &MenuHook, int *ContinuesNo); - static int helper_GetDialogId(CActiveAEDSPModePtr &ModePointer, AE_DSP_MENUHOOK_CAT &MenuHook, AE_DSP_ADDON &Addon, std::string AddonName); - static AE_DSP_MENUHOOK_CAT helper_GetMenuHookCategory(int CurrentType); - - bool m_bMovingMode; - bool m_bContainsChanges; - bool m_bContinousSaving; // if true, all settings are directly saved - - int m_iCurrentType; - int m_iSelected[AE_DSP_MODE_TYPE_MAX]; - - CFileItemList* m_activeItems[AE_DSP_MODE_TYPE_MAX]; - CFileItemList* m_availableItems[AE_DSP_MODE_TYPE_MAX]; - - CGUIViewControl m_availableViewControl; - CGUIViewControl m_activeViewControl; - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1009 +0,0 @@ -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include "GUIDialogAudioDSPSettings.h" -#include "Application.h" -#include "addons/Skin.h" -#include "cores/IPlayer.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSPMode.h" -#include "cores/AudioEngine/Utils/AEUtil.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "dialogs/GUIDialogYesNo.h" -#include "guilib/GUIMessage.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "profiles/ProfilesManager.h" -#include "settings/AdvancedSettings.h" -#include "settings/MediaSettings.h" -#include "settings/MediaSourceSettings.h" -#include "settings/Settings.h" -#include "settings/lib/SettingSection.h" -#include "settings/lib/Setting.h" -#include "settings/lib/SettingsManager.h" -#include "settings/windows/GUIControlSettings.h" -#include "utils/log.h" -#include "utils/StringUtils.h" - -#define SETTING_AUDIO_CAT_MAIN "audiodspmainsettings" -#define SETTING_AUDIO_CAT_MASTER "audiodspmastersettings" -#define SETTING_AUDIO_CAT_POST_PROCESS "audiodsppostsettings" -#define SETTING_AUDIO_CAT_RESAMPLING "audiodspresamplesettings" -#define SETTING_AUDIO_CAT_PRE_PROCESS "audiodsppresettings" -#define SETTING_AUDIO_CAT_MISC "audiodspmiscsettings" -#define SETTING_AUDIO_CAT_PROC_INFO "audiodspprocinfo" - -#define SETTING_AUDIO_MAIN_STREAMTYPE "audiodsp.main.streamtype" -#define SETTING_AUDIO_MAIN_MODETYPE "audiodsp.main.modetype" -#define SETTING_AUDIO_MAIN_VOLUME "audiodsp.main.volume" -#define SETTING_AUDIO_MAIN_VOLUME_AMPLIFICATION "audiodsp.main.volumeamplification" -#define SETTING_AUDIO_MAIN_BUTTON_MASTER "audiodsp.main.menumaster" -#define SETTING_AUDIO_MAIN_BUTTON_OUTPUT "audiodsp.main.menupostproc" -#define SETTING_AUDIO_MAIN_BUTTON_RESAMPLE "audiodsp.main.menuresample" -#define SETTING_AUDIO_MAIN_BUTTON_PRE_PROC "audiodsp.main.menupreproc" -#define SETTING_AUDIO_MAIN_BUTTON_MISC "audiodsp.main.menumisc" -#define SETTING_AUDIO_MAIN_BUTTON_INFO "audiodsp.main.menuinfo" -#define SETTING_AUDIO_MAIN_MAKE_DEFAULT "audiodsp.main.makedefault" -#define SETTING_AUDIO_MASTER_SETTINGS_MENUS "audiodsp.master.menu_" -#define SETTING_AUDIO_POST_PROC_AUDIO_DELAY "audiodsp.postproc.delay" -#define SETTING_AUDIO_PROC_SETTINGS_MENUS "audiodsp.proc.menu_" - -#define SETTING_STREAM_INFO_INPUT_CHANNELS "audiodsp.info.inputchannels" -#define SETTING_STREAM_INFO_INPUT_CHANNEL_NAMES "audiodsp.info.inputchannelnames" -#define SETTING_STREAM_INFO_INPUT_SAMPLERATE "audiodsp.info.inputsamplerate" -#define SETTING_STREAM_INFO_OUTPUT_CHANNELS "audiodsp.info.outputchannels" -#define SETTING_STREAM_INFO_OUTPUT_CHANNEL_NAMES "audiodsp.info.outputchannelnames" -#define SETTING_STREAM_INFO_OUTPUT_SAMPLERATE "audiodsp.info.outputsamplerate" -#define SETTING_STREAM_INFO_CPU_USAGE "audiodsp.info.cpuusage" -#define SETTING_STREAM_INFO_TYPE_INPUT "audiodsp.info.typeinput" -#define SETTING_STREAM_INFO_TYPE_PREPROC "audiodsp.info.typepreproc" -#define SETTING_STREAM_INFO_TYPE_MASTER "audiodsp.info.typemaster" -#define SETTING_STREAM_INFO_TYPE_POSTPROC "audiodsp.info.typepostproc" -#define SETTING_STREAM_INFO_TYPE_OUTPUT "audiodsp.info.typeoutput" -#define SETTING_STREAM_INFO_MODE_CPU_USAGE "audiodsp.info.modecpuusage_" - -#define CONTROL_SETTINGS_LABEL 2 - -using namespace ActiveAE; - -CGUIDialogAudioDSPSettings::CGUIDialogAudioDSPSettings() - : CGUIDialogSettingsManualBase(WINDOW_DIALOG_AUDIO_DSP_OSD_SETTINGS, "DialogAudioDSPSettings.xml") -{ - m_ActiveStreamId = 0; - m_GetCPUUsage = false; - m_MenuPositions[SETTING_AUDIO_CAT_MAIN] = CONTROL_SETTINGS_START_CONTROL; - m_MenuPositions[SETTING_AUDIO_CAT_MASTER] = CONTROL_SETTINGS_START_CONTROL; - m_MenuPositions[SETTING_AUDIO_CAT_POST_PROCESS] = CONTROL_SETTINGS_START_CONTROL; - m_MenuPositions[SETTING_AUDIO_CAT_RESAMPLING] = CONTROL_SETTINGS_START_CONTROL; - m_MenuPositions[SETTING_AUDIO_CAT_PRE_PROCESS] = CONTROL_SETTINGS_START_CONTROL; - m_MenuPositions[SETTING_AUDIO_CAT_MISC] = CONTROL_SETTINGS_START_CONTROL; - m_MenuPositions[SETTING_AUDIO_CAT_PROC_INFO] = CONTROL_SETTINGS_START_CONTROL+2; -} - -CGUIDialogAudioDSPSettings::~CGUIDialogAudioDSPSettings(void) -{ } - -int CGUIDialogAudioDSPSettings::FindCategoryIndex(const std::string &catId) -{ - for (unsigned int i = 0; i < m_categories.size(); i++) - { - if (m_categories[i]->GetId() == catId) - return i; - } - return 0; -} - -void CGUIDialogAudioDSPSettings::OpenMenu(const std::string &id) -{ - m_GetCPUUsage = false; - m_MenuPositions[m_categories[m_iCategory]->GetId()] = GetFocusedControlID(); - m_MenuHierarchy.push_back(m_iCategory); - m_iCategory = FindCategoryIndex(id); - - /* Get menu name */ - m_MenuName = -1; - if (id == SETTING_AUDIO_CAT_MAIN) - m_MenuName = 15028; - else if (id == SETTING_AUDIO_CAT_MASTER) - m_MenuName = 15029; - else if (id == SETTING_AUDIO_CAT_POST_PROCESS) - m_MenuName = 15030; - else if (id == SETTING_AUDIO_CAT_RESAMPLING) - m_MenuName = 15035; - else if (id == SETTING_AUDIO_CAT_PRE_PROCESS) - m_MenuName = 15037; - else if (id == SETTING_AUDIO_CAT_MISC) - m_MenuName = 15038; - else if (id == SETTING_AUDIO_CAT_PROC_INFO) - m_MenuName = 15031; - - SET_CONTROL_LABEL(CONTROL_SETTINGS_LABEL, g_localizeStrings.Get(m_MenuName)); - CreateSettings(); - SET_CONTROL_FOCUS(m_MenuPositions[id], 0); -} - -bool CGUIDialogAudioDSPSettings::OnMessage(CGUIMessage &message) -{ - switch (message.GetMessage()) - { - case GUI_MSG_CLICKED: - { - int iControl = message.GetSenderId(); - if (iControl >= CONTROL_SETTINGS_START_CONTROL && iControl < (int)(CONTROL_SETTINGS_START_CONTROL + m_settingControls.size())) - { - CSetting *setting = GetSettingControl(iControl)->GetSetting(); - if (setting != NULL) - { - if (setting->GetId() == SETTING_AUDIO_MAIN_BUTTON_MASTER) - OpenMenu(SETTING_AUDIO_CAT_MASTER); - else if (setting->GetId() == SETTING_AUDIO_MAIN_BUTTON_OUTPUT) - OpenMenu(SETTING_AUDIO_CAT_POST_PROCESS); - else if (setting->GetId() == SETTING_AUDIO_MAIN_BUTTON_RESAMPLE) - OpenMenu(SETTING_AUDIO_CAT_RESAMPLING); - else if (setting->GetId() == SETTING_AUDIO_MAIN_BUTTON_PRE_PROC) - OpenMenu(SETTING_AUDIO_CAT_PRE_PROCESS); - else if (setting->GetId() == SETTING_AUDIO_MAIN_BUTTON_MISC) - OpenMenu(SETTING_AUDIO_CAT_MISC); - else if (setting->GetId() == SETTING_AUDIO_MAIN_BUTTON_INFO) - { - SetupView(); - OpenMenu(SETTING_AUDIO_CAT_PROC_INFO); - m_GetCPUUsage = true; - } - else - { - if (setting->GetId().substr(0, 19) == SETTING_AUDIO_PROC_SETTINGS_MENUS) - OpenAudioDSPMenu(strtol(setting->GetId().substr(19).c_str(), NULL, 0)); - else if (setting->GetId().substr(0, 21) == SETTING_AUDIO_MASTER_SETTINGS_MENUS) - OpenAudioDSPMenu(strtol(setting->GetId().substr(21).c_str(), NULL, 0)); - else if (setting->GetId().substr(0, 27) == SETTING_STREAM_INFO_MODE_CPU_USAGE) - { - if (!OpenAudioDSPMenu(m_ActiveModesData[strtol(setting->GetId().substr(27).c_str(), NULL, 0)].MenuListPtr)) - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(15031), g_localizeStrings.Get(416)); - } - } - } - } - break; - } - default: - break; - } - - return CGUIDialogSettingsManualBase::OnMessage(message); -} - -bool CGUIDialogAudioDSPSettings::OnBack(int actionID) -{ - // if the setting dialog is not a window but a dialog we need to close differently - int mainCategory = FindCategoryIndex(SETTING_AUDIO_CAT_MAIN); - if (m_iCategory == mainCategory) - return CGUIDialogSettingsManualBase::OnBack(actionID); - - m_MenuPositions[m_categories[m_iCategory]->GetId()] = GetFocusedControlID(); - if (!m_MenuHierarchy.empty()) - { - m_iCategory = m_MenuHierarchy.back(); - m_MenuHierarchy.pop_back(); - } - else - m_iCategory = mainCategory; - - if (m_iCategory == mainCategory) - SET_CONTROL_LABEL(CONTROL_SETTINGS_LABEL, g_localizeStrings.Get(15028)); - - CreateSettings(); - SET_CONTROL_FOCUS(m_MenuPositions[m_categories[m_iCategory]->GetId()], 0); - - return true; -} - -void CGUIDialogAudioDSPSettings::FrameMove() -{ - // update the volume setting if necessary - float newVolume = g_application.GetVolume(false); - if (newVolume != m_volume) - m_settingsManager->SetNumber(SETTING_AUDIO_MAIN_VOLUME, newVolume); - - if (g_application.m_pPlayer->HasPlayer()) - { - const CVideoSettings &videoSettings = CMediaSettings::GetInstance().GetCurrentVideoSettings(); - - // these settings can change on the fly - if (SupportsAudioFeature(IPC_AUD_OFFSET)) - m_settingsManager->SetNumber(SETTING_AUDIO_POST_PROC_AUDIO_DELAY, videoSettings.m_AudioDelay); - - bool forceReload = false; - unsigned int streamId = CActiveAEDSP::GetInstance().GetActiveStreamId(); - if (m_ActiveStreamId != streamId) - { - m_ActiveStreamId = streamId; - m_ActiveStreamProcess = CActiveAEDSP::GetInstance().GetDSPProcess(m_ActiveStreamId); - if (m_ActiveStreamId == (unsigned int)-1 || !m_ActiveStreamProcess) - { - Close(true); - return; - } - forceReload = true; - } - - int modeUniqueId; - AE_DSP_BASETYPE usedBaseType; - AE_DSP_STREAMTYPE streamTypeUsed; - m_ActiveStreamProcess->GetMasterModeTypeInformation(streamTypeUsed, usedBaseType, modeUniqueId); - if (forceReload || m_baseTypeUsed != usedBaseType || m_streamTypeUsed != streamTypeUsed) - { - m_baseTypeUsed = usedBaseType; - m_streamTypeUsed = streamTypeUsed; - - /*! - * Update settings - */ - int selType = CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterStreamTypeSel; - CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterModes[streamTypeUsed][usedBaseType] = modeUniqueId; - CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterModes[selType][usedBaseType] = modeUniqueId; - CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterStreamBase = usedBaseType; - CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterStreamType = streamTypeUsed; - - m_settingsManager->SetInt(SETTING_AUDIO_MAIN_MODETYPE, modeUniqueId); - } - - // these settings can change on the fly - if (m_GetCPUUsage) - { - m_CPUUsage = StringUtils::Format("%.02f %%", m_ActiveStreamProcess->GetCPUUsage()); - m_settingsManager->SetString(SETTING_STREAM_INFO_CPU_USAGE, m_CPUUsage); - for (unsigned int i = 0; i < m_ActiveModes.size(); i++) - { - std::string settingId = StringUtils::Format("%s%i", SETTING_STREAM_INFO_MODE_CPU_USAGE, i); - m_ActiveModesData[i].CPUUsage = StringUtils::Format("%.02f %%", m_ActiveModes[i]->CPUUsage()); - m_settingsManager->SetString(settingId, m_ActiveModesData[i].CPUUsage); - } - } - } - - CGUIDialogSettingsManualBase::FrameMove(); -} - -std::string CGUIDialogAudioDSPSettings::FormatDelay(float value, float interval) -{ - if (fabs(value) < 0.5f * interval) - return StringUtils::Format(g_localizeStrings.Get(22003).c_str(), 0.0); - if (value < 0) - return StringUtils::Format(g_localizeStrings.Get(22004).c_str(), fabs(value)); - - return StringUtils::Format(g_localizeStrings.Get(22005).c_str(), value); -} - -std::string CGUIDialogAudioDSPSettings::FormatDecibel(float value) -{ - return StringUtils::Format(g_localizeStrings.Get(14054).c_str(), value); -} - -std::string CGUIDialogAudioDSPSettings::FormatPercentAsDecibel(float value) -{ - return StringUtils::Format(g_localizeStrings.Get(14054).c_str(), CAEUtil::PercentToGain(value)); -} - -void CGUIDialogAudioDSPSettings::OnSettingChanged(const CSetting *setting) -{ - if (setting == NULL) - return; - - CGUIDialogSettingsManualBase::OnSettingChanged(setting); - - CVideoSettings &videoSettings = CMediaSettings::GetInstance().GetCurrentVideoSettings(); - const std::string &settingId = setting->GetId(); - if (settingId == SETTING_AUDIO_MAIN_STREAMTYPE) - { - int type = (AE_DSP_STREAMTYPE)static_cast(setting)->GetValue(); - CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterStreamTypeSel = type; - if (type == AE_DSP_ASTREAM_AUTO) - type = m_ActiveStreamProcess->GetDetectedStreamType(); - - CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterStreamType = type; - - /* Set the input stream type if any modes are available for this type */ - if (type >= AE_DSP_ASTREAM_BASIC && type < AE_DSP_ASTREAM_AUTO && !m_MasterModes[type].empty()) - { - /* Find the master mode id for the selected stream type if it was not known before */ - if (CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterModes[type][m_baseTypeUsed] < 0) - CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterModes[type][m_baseTypeUsed] = m_MasterModes[type][0]->ModeID(); - - /* Switch now the master mode and stream type for audio dsp processing */ - m_ActiveStreamProcess->SetMasterMode((AE_DSP_STREAMTYPE)type, - CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterModes[type][m_baseTypeUsed], - true); - } - else - { - CLog::Log(LOGERROR, "ActiveAE DSP Settings - %s - Change of audio stream type failed (type = %i)", __FUNCTION__, type); - } - } - else if (settingId == SETTING_AUDIO_MAIN_MODETYPE) - { - m_modeTypeUsed = static_cast(setting)->GetValue(); - if (m_ActiveStreamProcess->SetMasterMode(m_streamTypeUsed, m_modeTypeUsed)) - CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterModes[m_streamTypeUsed][m_baseTypeUsed] = m_modeTypeUsed; - } - else if (settingId == SETTING_AUDIO_MAIN_VOLUME) - { - m_volume = static_cast(static_cast(setting)->GetValue()); - g_application.SetVolume(m_volume, false); // false - value is not in percent - } - else if (settingId == SETTING_AUDIO_MAIN_VOLUME_AMPLIFICATION) - { - videoSettings.m_VolumeAmplification = static_cast(static_cast(setting)->GetValue()); - g_application.m_pPlayer->SetDynamicRangeCompression((long)(videoSettings.m_VolumeAmplification * 100)); - } - else if (settingId == SETTING_AUDIO_POST_PROC_AUDIO_DELAY) - { - videoSettings.m_AudioDelay = static_cast(static_cast(setting)->GetValue()); - g_application.m_pPlayer->SetAVDelay(videoSettings.m_AudioDelay); - } -} - -void CGUIDialogAudioDSPSettings::OnSettingAction(const CSetting *setting) -{ - if (setting == NULL) - return; - - CGUIDialogSettingsManualBase::OnSettingAction(setting); - - const std::string &settingId = setting->GetId(); - if (settingId == SETTING_AUDIO_MAIN_MAKE_DEFAULT) - Save(); -} - -void CGUIDialogAudioDSPSettings::Save() -{ - if (!g_passwordManager.CheckSettingLevelLock(SettingLevelExpert) && - CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) - return; - - // prompt user if they are sure - if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{12376}, CVariant{12377})) - return; - - // reset the settings - CActiveAEDSPDatabase db; - if (!db.Open()) - return; - - db.EraseActiveDSPSettings(); - db.Close(); - - CMediaSettings::GetInstance().GetDefaultAudioSettings() = CMediaSettings::GetInstance().GetCurrentAudioSettings(); - CMediaSettings::GetInstance().GetDefaultAudioSettings().m_MasterStreamType = AE_DSP_ASTREAM_AUTO; - CSettings::GetInstance().Save(); -} - -void CGUIDialogAudioDSPSettings::SetupView() -{ - CGUIDialogSettingsManualBase::SetupView(); - SET_CONTROL_LABEL(CONTROL_SETTINGS_LABEL, g_localizeStrings.Get(15028)); -} - -void CGUIDialogAudioDSPSettings::InitializeSettings() -{ - CGUIDialogSettingsManualBase::InitializeSettings(); - - CSettingCategory *category = AddCategory(SETTING_AUDIO_CAT_MAIN, -1); - if (category == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings category 'audiodspmainsettings'"); - return; - } - - // get all necessary setting groups - CSettingGroup *groupAudioModeSel = AddGroup(category); - if (groupAudioModeSel == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group 'groupAudioModeSel'"); - return; - } - CSettingGroup *groupAudioVolumeSel = AddGroup(category); - if (groupAudioVolumeSel == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group 'groupAudioVolumeSel'"); - return; - } - CSettingGroup *groupAudioSubmenuSel = AddGroup(category); - if (groupAudioSubmenuSel == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group 'groupAudioSubmenuSel'"); - return; - } - CSettingGroup *groupSaveAsDefault = AddGroup(category); - if (groupSaveAsDefault == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group 'groupSaveAsDefault'"); - return; - } - - bool usePopup = g_SkinInfo->HasSkinFile("DialogSlider.xml"); - - CVideoSettings &videoSettings = CMediaSettings::GetInstance().GetCurrentVideoSettings(); - - m_audioCaps.clear(); - if (g_application.m_pPlayer->HasPlayer()) - g_application.m_pPlayer->GetAudioCapabilities(m_audioCaps); - - m_ActiveStreamId = CActiveAEDSP::GetInstance().GetActiveStreamId(); - m_ActiveStreamProcess = CActiveAEDSP::GetInstance().GetDSPProcess(m_ActiveStreamId); - if (m_ActiveStreamId == (unsigned int)-1 || !m_ActiveStreamProcess) - { - m_iCategory = FindCategoryIndex(SETTING_AUDIO_CAT_MAIN); - Close(true); - return; - } - - int modeUniqueId; - m_ActiveStreamProcess->GetMasterModeTypeInformation(m_streamTypeUsed, m_baseTypeUsed, modeUniqueId); - - int modesAvailable = 0; - for (int i = 0; i < AE_DSP_ASTREAM_AUTO; i++) - { - m_MasterModes[i].clear(); - m_ActiveStreamProcess->GetAvailableMasterModes((AE_DSP_STREAMTYPE)i, m_MasterModes[i]); - if (!m_MasterModes[i].empty()) modesAvailable++; - } - - if (modesAvailable > 0) - { - /* about size() > 1, it is always the fallback (ignore of master processing) present. */ - StaticIntegerSettingOptions modeEntries; - if (m_MasterModes[AE_DSP_ASTREAM_BASIC].size() > 1) - modeEntries.push_back(std::pair(CActiveAEDSP::GetInstance().GetStreamTypeName(AE_DSP_ASTREAM_BASIC), AE_DSP_ASTREAM_BASIC)); - if (m_MasterModes[AE_DSP_ASTREAM_MUSIC].size() > 1) - modeEntries.push_back(std::pair(CActiveAEDSP::GetInstance().GetStreamTypeName(AE_DSP_ASTREAM_MUSIC), AE_DSP_ASTREAM_MUSIC)); - if (m_MasterModes[AE_DSP_ASTREAM_MOVIE].size() > 1) - modeEntries.push_back(std::pair(CActiveAEDSP::GetInstance().GetStreamTypeName(AE_DSP_ASTREAM_MOVIE), AE_DSP_ASTREAM_MOVIE)); - if (m_MasterModes[AE_DSP_ASTREAM_GAME].size() > 1) - modeEntries.push_back(std::pair(CActiveAEDSP::GetInstance().GetStreamTypeName(AE_DSP_ASTREAM_GAME), AE_DSP_ASTREAM_GAME)); - if (m_MasterModes[AE_DSP_ASTREAM_APP].size() > 1) - modeEntries.push_back(std::pair(CActiveAEDSP::GetInstance().GetStreamTypeName(AE_DSP_ASTREAM_APP), AE_DSP_ASTREAM_APP)); - if (m_MasterModes[AE_DSP_ASTREAM_MESSAGE].size() > 1) - modeEntries.push_back(std::pair(CActiveAEDSP::GetInstance().GetStreamTypeName(AE_DSP_ASTREAM_MESSAGE), AE_DSP_ASTREAM_MESSAGE)); - if (m_MasterModes[AE_DSP_ASTREAM_PHONE].size() > 1) - modeEntries.push_back(std::pair(CActiveAEDSP::GetInstance().GetStreamTypeName(AE_DSP_ASTREAM_PHONE), AE_DSP_ASTREAM_PHONE)); - if (modesAvailable > 1 && m_MasterModes[m_streamTypeUsed].size() > 1) - modeEntries.insert(modeEntries.begin(), std::pair(CActiveAEDSP::GetInstance().GetStreamTypeName(AE_DSP_ASTREAM_AUTO), AE_DSP_ASTREAM_AUTO)); - - AddSpinner(groupAudioModeSel, - SETTING_AUDIO_MAIN_STREAMTYPE, 15021, 0, - (AE_DSP_STREAMTYPE)CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterStreamTypeSel, - modeEntries); - } - - bool AddonMasterModeSetupPresent = false; - m_ModeList.clear(); - for (unsigned int i = 0; i < m_MasterModes[m_streamTypeUsed].size(); i++) - { - if (m_MasterModes[m_streamTypeUsed][i]) - { - AE_DSP_ADDON addon; - int modeId = m_MasterModes[m_streamTypeUsed][i]->ModeID(); - if (modeId == AE_DSP_MASTER_MODE_ID_PASSOVER || modeId >= AE_DSP_MASTER_MODE_ID_INTERNAL_TYPES) - { - m_ModeList.push_back(make_pair(g_localizeStrings.Get(m_MasterModes[m_streamTypeUsed][i]->ModeName()), modeId)); - } - else if (CActiveAEDSP::GetInstance().GetAudioDSPAddon(m_MasterModes[m_streamTypeUsed][i]->AddonID(), addon)) - { - m_ModeList.push_back(make_pair(addon->GetString(m_MasterModes[m_streamTypeUsed][i]->ModeName()), modeId)); - if (!AddonMasterModeSetupPresent) - AddonMasterModeSetupPresent = m_MasterModes[m_streamTypeUsed][i]->HasSettingsDialog(); - } - } - } - - m_modeTypeUsed = CMediaSettings::GetInstance().GetCurrentAudioSettings().m_MasterModes[m_streamTypeUsed][m_baseTypeUsed]; - CSettingInt *spinner = AddSpinner(groupAudioModeSel, SETTING_AUDIO_MAIN_MODETYPE, 15022, 0, m_modeTypeUsed, AudioModeOptionFiller); - spinner->SetOptionsFiller(AudioModeOptionFiller, this); - - ///----------------------- - - // audio settings - // audio volume setting - m_volume = g_application.GetVolume(false); - if (!g_windowManager.IsWindowActive(WINDOW_DIALOG_AUDIO_OSD_SETTINGS)) - { - CSettingNumber *settingAudioVolume = AddSlider(groupAudioVolumeSel, SETTING_AUDIO_MAIN_VOLUME, 13376, 0, m_volume, 14054, VOLUME_MINIMUM, VOLUME_MAXIMUM / 100.0f, VOLUME_MAXIMUM); - static_cast(settingAudioVolume->GetControl())->SetFormatter(SettingFormatterPercentAsDecibel); - } - - // audio volume amplification setting - if (SupportsAudioFeature(IPC_AUD_AMP)) - AddSlider(groupAudioVolumeSel, SETTING_AUDIO_MAIN_VOLUME_AMPLIFICATION, 660, 0, videoSettings.m_VolumeAmplification, 14054, VOLUME_DRC_MINIMUM * 0.01f, (VOLUME_DRC_MAXIMUM - VOLUME_DRC_MINIMUM) / 6000.0f, VOLUME_DRC_MAXIMUM * 0.01f); - - ///----------------------- - - AddButton(groupAudioSubmenuSel, SETTING_AUDIO_MAIN_BUTTON_MASTER, 15025, 0, false, AddonMasterModeSetupPresent, -1); - AddButton(groupAudioSubmenuSel, SETTING_AUDIO_MAIN_BUTTON_OUTPUT, 15026, 0, false, HaveActiveMenuHooks(AE_DSP_MENUHOOK_POST_PROCESS) || SupportsAudioFeature(IPC_AUD_OFFSET), -1); - AddButton(groupAudioSubmenuSel, SETTING_AUDIO_MAIN_BUTTON_RESAMPLE, 15033, 0, false, HaveActiveMenuHooks(AE_DSP_MENUHOOK_RESAMPLE), -1); - AddButton(groupAudioSubmenuSel, SETTING_AUDIO_MAIN_BUTTON_PRE_PROC, 15039, 0, false, HaveActiveMenuHooks(AE_DSP_MENUHOOK_PRE_PROCESS), -1); - AddButton(groupAudioSubmenuSel, SETTING_AUDIO_MAIN_BUTTON_MISC, 15034, 0, false, HaveActiveMenuHooks(AE_DSP_MENUHOOK_MISCELLANEOUS), -1); - AddButton(groupAudioSubmenuSel, SETTING_AUDIO_MAIN_BUTTON_INFO, 15027, 0, false, true, -1); - - ///----------------------- - - AddButton(groupSaveAsDefault, SETTING_AUDIO_MAIN_MAKE_DEFAULT, 12376, 0); - - m_Menus.clear(); - - /** - * Audio Master mode settings Dialog init - */ - { - CSettingCategory *categoryMaster = AddCategory(SETTING_AUDIO_CAT_MASTER, -1); - if (categoryMaster == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings category 'audiodspmastersettings'"); - return; - } - - CSettingGroup *groupMasterMode = AddGroup(categoryMaster); - if (groupMasterMode == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group 'groupMasterMode'"); - return; - } - - for (unsigned int i = 0; i < m_MasterModes[m_streamTypeUsed].size(); i++) - { - if (m_MasterModes[m_streamTypeUsed][i]->HasSettingsDialog()) - { - AE_DSP_ADDON addon; - if (CActiveAEDSP::GetInstance().GetAudioDSPAddon(m_MasterModes[m_streamTypeUsed][i]->AddonID(), addon)) - { - AE_DSP_MENUHOOKS hooks; - if (CActiveAEDSP::GetInstance().GetMenuHooks(m_MasterModes[m_streamTypeUsed][i]->AddonID(), AE_DSP_MENUHOOK_MASTER_PROCESS, hooks)) - { - for (unsigned int j = 0; j < hooks.size(); j++) - { - if (hooks[j].iRelevantModeId != m_MasterModes[m_streamTypeUsed][i]->AddonModeNumber()) - continue; - - MenuHookMember menu; - menu.addonId = m_MasterModes[m_streamTypeUsed][i]->AddonID(); - menu.hook.category = hooks[j].category; - menu.hook.iHookId = hooks[j].iHookId; - menu.hook.iLocalizedStringId = hooks[j].iLocalizedStringId; - menu.hook.iRelevantModeId = hooks[j].iRelevantModeId; - m_Menus.push_back(menu); - - std::string setting = StringUtils::Format("%s%i", SETTING_AUDIO_MASTER_SETTINGS_MENUS, (int)m_Menus.size()-1); - AddButton(groupMasterMode, setting, 15041, 0); - break; - } - } - } - } - } - } - - /** - * Audio post processing settings Dialog init - */ - { - CSettingCategory *category = AddCategory(SETTING_AUDIO_CAT_POST_PROCESS, -1); - if (category == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings category 'audiodsppostsettings'"); - return; - } - - CSettingGroup *groupInternal = AddGroup(category); - if (groupInternal == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group 'groupInternal'"); - return; - } - - CSettingGroup *groupAddon = AddGroup(category); - if (groupAddon == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group 'groupAddon'"); - return; - } - - // audio delay setting - if (SupportsAudioFeature(IPC_AUD_OFFSET)) - { - CSettingNumber *settingAudioDelay = AddSlider(groupInternal, SETTING_AUDIO_POST_PROC_AUDIO_DELAY, 297, 0, videoSettings.m_AudioDelay, 0, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange, 297, usePopup); - static_cast(settingAudioDelay->GetControl())->SetFormatter(SettingFormatterDelay); - } - GetAudioDSPMenus(groupAddon, AE_DSP_MENUHOOK_POST_PROCESS); - } - - /** - * Audio add-on resampling setting dialog's - */ - { - CSettingCategory *category = AddCategory(SETTING_AUDIO_CAT_RESAMPLING, -1); - if (category == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings category 'audiodspresamplesettings'"); - return; - } - CSettingGroup *group = AddGroup(category); - if (group == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group 'group'"); - return; - } - GetAudioDSPMenus(group, AE_DSP_MENUHOOK_RESAMPLE); - } - - /** - * Audio add-on's pre processing setting dialog's - */ - { - CSettingCategory *category = AddCategory(SETTING_AUDIO_CAT_PRE_PROCESS, -1); - if (category == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings category 'audiodsppresettings'"); - return; - } - CSettingGroup *group = AddGroup(category); - if (group == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group 'group'"); - return; - } - GetAudioDSPMenus(group, AE_DSP_MENUHOOK_PRE_PROCESS); - } - - /** - * Audio add-on's miscellaneous setting dialog's - */ - { - CSettingCategory *category = AddCategory(SETTING_AUDIO_CAT_MISC, -1); - if (category == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings category 'audiodspmiscsettings'"); - return; - } - CSettingGroup *group = AddGroup(category); - if (group == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group 'group'"); - return; - } - GetAudioDSPMenus(group, AE_DSP_MENUHOOK_MISCELLANEOUS); - } - - /** - * Audio Information Dialog init - */ - { - CSettingGroup *group; - CSettingCategory *category = AddCategory(SETTING_AUDIO_CAT_PROC_INFO, -1); - if (category == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings category 'audiodspprocinfo'"); - return; - } - - m_ActiveModes.clear(); - m_ActiveStreamProcess->GetActiveModes(AE_DSP_MODE_TYPE_UNDEFINED, m_ActiveModes); - m_ActiveModesData.resize(m_ActiveModes.size()); - - group = AddGroup(category, 15089); - if (group == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group for '%s'", g_localizeStrings.Get(15089).c_str()); - return; - } - m_InputChannels = StringUtils::Format("%i", m_ActiveStreamProcess->GetInputChannels()); - AddInfoLabelButton(group, SETTING_STREAM_INFO_INPUT_CHANNELS, 21444, 0, m_InputChannels); - m_InputChannelNames = m_ActiveStreamProcess->GetInputChannelNames(); - AddInfoLabelButton(group, SETTING_STREAM_INFO_INPUT_CHANNEL_NAMES, 15091, 0, m_InputChannelNames); - m_InputSamplerate = StringUtils::Format("%i Hz", (int)m_ActiveStreamProcess->GetInputSamplerate()); - AddInfoLabelButton(group, SETTING_STREAM_INFO_INPUT_SAMPLERATE, 613, 0, m_InputSamplerate); - - group = AddGroup(category, 15090); - if (group == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group for '%s'", g_localizeStrings.Get(15090).c_str()); - return; - } - m_OutputChannels = StringUtils::Format("%i", m_ActiveStreamProcess->GetOutputChannels()); - AddInfoLabelButton(group, SETTING_STREAM_INFO_OUTPUT_CHANNELS, 21444, 0, m_OutputChannels); - m_OutputChannelNames = m_ActiveStreamProcess->GetOutputChannelNames(); - AddInfoLabelButton(group, SETTING_STREAM_INFO_OUTPUT_CHANNEL_NAMES, 15091, 0, m_OutputChannelNames); - m_OutputSamplerate = StringUtils::Format("%i Hz", (int)m_ActiveStreamProcess->GetOutputSamplerate()); - AddInfoLabelButton(group, SETTING_STREAM_INFO_OUTPUT_SAMPLERATE, 613, 0, m_OutputSamplerate); - - group = AddGroup(category, 15081); - if (group == NULL) - { - CLog::Log(LOGERROR, "CGUIDialogAudioDSPSettings: unable to setup settings group for '%s'", g_localizeStrings.Get(15081).c_str()); - return; - } - m_CPUUsage = StringUtils::Format("%.02f %%", m_ActiveStreamProcess->GetCPUUsage()); - AddInfoLabelButton(group, SETTING_STREAM_INFO_CPU_USAGE, 15092, 0, m_CPUUsage); - - bool foundPreProcess = false, foundPostProcess = false; - for (unsigned int i = 0; i < m_ActiveModes.size(); i++) - { - AE_DSP_ADDON addon; - if (CActiveAEDSP::GetInstance().GetAudioDSPAddon(m_ActiveModes[i]->AddonID(), addon)) - { - std::string label; - switch (m_ActiveModes[i]->ModeType()) - { - case AE_DSP_MODE_TYPE_INPUT_RESAMPLE: - group = AddGroup(category, 15087, -1, true, true); - label = StringUtils::Format(g_localizeStrings.Get(15082).c_str(), m_ActiveStreamProcess->GetProcessSamplerate()); - break; - case AE_DSP_MODE_TYPE_OUTPUT_RESAMPLE: - group = AddGroup(category, 15088, -1, true, true); - label = StringUtils::Format(g_localizeStrings.Get(15083).c_str(), m_ActiveStreamProcess->GetOutputSamplerate()); - break; - case AE_DSP_MODE_TYPE_MASTER_PROCESS: - group = AddGroup(category, 15084, -1, true, true); - label = addon->GetString(m_ActiveModes[i]->ModeName()); - break; - case AE_DSP_MODE_TYPE_PRE_PROCESS: - if (!foundPreProcess) - { - foundPreProcess = true; - group = AddGroup(category, 15085, -1, true, true); - } - label = addon->GetString(m_ActiveModes[i]->ModeName()); - break; - case AE_DSP_MODE_TYPE_POST_PROCESS: - if (!foundPostProcess) - { - foundPostProcess = true; - group = AddGroup(category, 15086, -1, true, true); - } - label = addon->GetString(m_ActiveModes[i]->ModeName()); - break; - default: - { - label += addon->GetString(m_ActiveModes[i]->ModeName()); - label += " - "; - label += addon->GetFriendlyName(); - } - }; - m_ActiveModesData[i].CPUUsage = StringUtils::Format("%.02f %%", m_ActiveModes[i]->CPUUsage()); - - MenuHookMember menu; - menu.addonId = -1; - - AE_DSP_MENUHOOKS hooks; - m_ActiveModesData[i].MenuListPtr = -1; - if (CActiveAEDSP::GetInstance().GetMenuHooks(m_ActiveModes[i]->AddonID(), AE_DSP_MENUHOOK_INFORMATION, hooks)) - { - for (unsigned int j = 0; j < hooks.size(); j++) - { - if (hooks[j].iRelevantModeId != m_ActiveModes[i]->AddonModeNumber()) - continue; - - menu.addonId = m_ActiveModes[i]->AddonID(); - menu.hook.category = hooks[j].category; - menu.hook.iHookId = hooks[j].iHookId; - menu.hook.iLocalizedStringId = hooks[j].iLocalizedStringId; - menu.hook.iRelevantModeId = hooks[j].iRelevantModeId; - m_Menus.push_back(menu); - m_ActiveModesData[i].MenuListPtr = m_Menus.size()-1; - label += " ..."; - break; - } - } - m_ActiveModesData[i].MenuName = label; - - std::string settingId = StringUtils::Format("%s%i", SETTING_STREAM_INFO_MODE_CPU_USAGE, i); - AddInfoLabelButton(group, settingId, 15041, 0, m_ActiveModesData[i].CPUUsage); - } - } - } -} - -bool CGUIDialogAudioDSPSettings::SupportsAudioFeature(int feature) -{ - for (Features::iterator itr = m_audioCaps.begin(); itr != m_audioCaps.end(); ++itr) - { - if (*itr == feature || *itr == IPC_AUD_ALL) - return true; - } - - return false; -} - -void CGUIDialogAudioDSPSettings::AudioModeOptionFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) -{ - CGUIDialogAudioDSPSettings *dialog = (CGUIDialogAudioDSPSettings *)data; - list = dialog->m_ModeList; - - if (list.empty()) - { - list.push_back(make_pair(g_localizeStrings.Get(231), -1)); - current = -1; - } -} - -std::string CGUIDialogAudioDSPSettings::SettingFormatterDelay(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum) -{ - if (!value.isDouble()) - return ""; - - float fValue = value.asFloat(); - float fStep = step.asFloat(); - - if (fabs(fValue) < 0.5f * fStep) - return StringUtils::Format(g_localizeStrings.Get(22003).c_str(), 0.0); - if (fValue < 0) - return StringUtils::Format(g_localizeStrings.Get(22004).c_str(), fabs(fValue)); - - return StringUtils::Format(g_localizeStrings.Get(22005).c_str(), fValue); -} - -std::string CGUIDialogAudioDSPSettings::SettingFormatterPercentAsDecibel(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum) -{ - if (control == NULL || !value.isDouble()) - return ""; - - std::string formatString = control->GetFormatString(); - if (control->GetFormatLabel() > -1) - formatString = g_localizeStrings.Get(control->GetFormatLabel()); - - return StringUtils::Format(formatString.c_str(), CAEUtil::PercentToGain(value.asFloat())); -} - -bool CGUIDialogAudioDSPSettings::HaveActiveMenuHooks(AE_DSP_MENUHOOK_CAT category) -{ - /*!> Check menus are active on current stream */ - AE_DSP_ADDONMAP addonMap; - if (CActiveAEDSP::GetInstance().HaveMenuHooks(category) && - CActiveAEDSP::GetInstance().GetEnabledAudioDSPAddons(addonMap) > 0) - { - for (AE_DSP_ADDONMAP_ITR itr = addonMap.begin(); itr != addonMap.end(); itr++) - { - AE_DSP_MENUHOOKS hooks; - if (CActiveAEDSP::GetInstance().GetMenuHooks(itr->second->GetID(), category, hooks)) - { - for (unsigned int i = 0; i < hooks.size(); i++) - { - if (category != AE_DSP_MENUHOOK_MISCELLANEOUS && - !m_ActiveStreamProcess->IsMenuHookModeActive(hooks[i].category, itr->second->GetID(), hooks[i].iRelevantModeId)) - continue; - - return true; - } - } - } - } - - return false; -} - -std::string CGUIDialogAudioDSPSettings::GetSettingsLabel(CSetting *pSetting) -{ - if (pSetting->GetLabel() == 15041) - { - const std::string &settingId = pSetting->GetId(); - - int ptr = -1; - AE_DSP_ADDON addon; - if (settingId.substr(0, 27) == SETTING_STREAM_INFO_MODE_CPU_USAGE) - { - ptr = strtol(settingId.substr(27).c_str(), NULL, 0); - if (ptr >= 0 && CActiveAEDSP::GetInstance().GetAudioDSPAddon(m_ActiveModes[ptr]->AddonID(), addon)) - return m_ActiveModesData[ptr].MenuName; - } - else - { - if (settingId.substr(0, 21) == SETTING_AUDIO_MASTER_SETTINGS_MENUS) - ptr = strtol(settingId.substr(21).c_str(), NULL, 0); - else if (settingId.substr(0, 19) == SETTING_AUDIO_PROC_SETTINGS_MENUS) - ptr = strtol(settingId.substr(19).c_str(), NULL, 0); - - if (ptr >= 0 && CActiveAEDSP::GetInstance().GetAudioDSPAddon(m_Menus[ptr].addonId, addon)) - return addon->GetString(m_Menus[ptr].hook.iLocalizedStringId); - } - } - - return GetLocalizedString(pSetting->GetLabel()); -} - -void CGUIDialogAudioDSPSettings::GetAudioDSPMenus(CSettingGroup *group, AE_DSP_MENUHOOK_CAT category) -{ - AE_DSP_ADDONMAP addonMap; - if (CActiveAEDSP::GetInstance().GetEnabledAudioDSPAddons(addonMap) > 0) - { - for (AE_DSP_ADDONMAP_ITR itr = addonMap.begin(); itr != addonMap.end(); itr++) - { - AE_DSP_MENUHOOKS hooks; - if (CActiveAEDSP::GetInstance().GetMenuHooks(itr->second->GetID(), category, hooks)) - { - for (unsigned int i = 0; i < hooks.size(); i++) - { - if (category != hooks[i].category || (category != AE_DSP_MENUHOOK_MISCELLANEOUS && - !m_ActiveStreamProcess->IsMenuHookModeActive(hooks[i].category, itr->second->GetID(), hooks[i].iRelevantModeId))) - continue; - - MenuHookMember menu; - menu.addonId = itr->second->GetID(); - menu.hook.category = hooks[i].category; - menu.hook.iHookId = hooks[i].iHookId; - menu.hook.iLocalizedStringId = hooks[i].iLocalizedStringId; - menu.hook.iRelevantModeId = hooks[i].iRelevantModeId; - m_Menus.push_back(menu); - } - } - } - } - - for (unsigned int i = 0; i < m_Menus.size(); i++) - { - AE_DSP_ADDON addon; - if (CActiveAEDSP::GetInstance().GetAudioDSPAddon(m_Menus[i].addonId, addon) && category == m_Menus[i].hook.category) - { - std::string modeName = addon->GetString(m_Menus[i].hook.iLocalizedStringId); - if (modeName.empty()) - modeName = g_localizeStrings.Get(15041); - - std::string setting = StringUtils::Format("%s%i", SETTING_AUDIO_PROC_SETTINGS_MENUS, i); - AddButton(group, setting, 15041, 0); - } - } -} - -bool CGUIDialogAudioDSPSettings::OpenAudioDSPMenu(unsigned int setupEntry) -{ - if (setupEntry >= m_Menus.size()) - return false; - - AE_DSP_ADDON addon; - if (!CActiveAEDSP::GetInstance().GetAudioDSPAddon(m_Menus[setupEntry].addonId, addon)) - return false; - - AE_DSP_MENUHOOK hook; - AE_DSP_MENUHOOK_DATA hookData; - - hook.category = m_Menus[setupEntry].hook.category; - hook.iHookId = m_Menus[setupEntry].hook.iHookId; - hook.iLocalizedStringId = m_Menus[setupEntry].hook.iLocalizedStringId; - hook.iRelevantModeId = m_Menus[setupEntry].hook.iRelevantModeId; - hookData.category = m_Menus[setupEntry].hook.category; - switch (hookData.category) - { - case AE_DSP_MENUHOOK_PRE_PROCESS: - case AE_DSP_MENUHOOK_MASTER_PROCESS: - case AE_DSP_MENUHOOK_RESAMPLE: - case AE_DSP_MENUHOOK_POST_PROCESS: - hookData.data.iStreamId = m_ActiveStreamId; - break; - default: - break; - } - - /*! - * @note the addon dialog becomes always opened on the back of Kodi ones for this reason a - * "Conditional" - * on skin is needed to hide dialog. - */ - addon->CallMenuHook(hook, hookData); - - return true; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.h kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2015 Team KODI - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KODI; see the file COPYING. If not, see - * . - * - */ - -#include - -#include "cores/AudioEngine/DSPAddons/ActiveAEDSPProcess.h" -#include "settings/dialogs/GUIDialogSettingsManualBase.h" - -namespace ActiveAE -{ - class CGUIDialogAudioDSPSettings : public CGUIDialogSettingsManualBase - { - public: - CGUIDialogAudioDSPSettings(); - virtual ~CGUIDialogAudioDSPSettings(); - - // specializations of CGUIControl - virtual bool OnMessage(CGUIMessage &message); - virtual bool OnBack(int actionID); - - // specialization of CGUIWindow - virtual void FrameMove(); - - static std::string FormatDelay(float value, float interval); - static std::string FormatDecibel(float value); - static std::string FormatPercentAsDecibel(float value); - - protected: - // implementations of ISettingCallback - virtual void OnSettingChanged(const CSetting *setting); - virtual void OnSettingAction(const CSetting *setting); - - // specialization of CGUIDialogSettingsBase - virtual bool AllowResettingSettings() const { return false; } - virtual void Save(); - virtual void SetupView(); - - // specialization of CGUIDialogSettingsManualBase - virtual void InitializeSettings(); - - bool SupportsAudioFeature(int feature); - - static void AudioModeOptionFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - - static std::string SettingFormatterDelay(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum); - static std::string SettingFormatterPercentAsDecibel(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum); - - std::string GetSettingsLabel(CSetting *pSetting); - - private: - typedef struct - { - int addonId; - AE_DSP_MENUHOOK hook; - } MenuHookMember; - typedef struct - { - std::string MenuName; - int MenuListPtr; - std::string CPUUsage; - } ActiveModeData; - typedef std::vector Features; - - void OpenMenu(const std::string &id); - bool HaveActiveMenuHooks(AE_DSP_MENUHOOK_CAT category); - void GetAudioDSPMenus(CSettingGroup *group, AE_DSP_MENUHOOK_CAT category); - bool OpenAudioDSPMenu(unsigned int setupEntry); - int FindCategoryIndex(const std::string &catId); - - AE_DSP_STREAM_ID m_ActiveStreamId; /*!< The on dialog selectable stream identifier */ - ActiveAE::CActiveAEDSPProcessPtr m_ActiveStreamProcess; /*!< On dialog adjustable dsp processing class */ - AE_DSP_STREAMTYPE m_streamTypeUsed; /*!< The currently available stream type */ - AE_DSP_BASETYPE m_baseTypeUsed; /*!< The currently detected and used base type */ - int m_modeTypeUsed; /*!< The currently selected mode type */ - std::vector m_ActiveModes; /*!< The process modes currently active on dsp processing stream */ - std::vector m_ActiveModesData; /*!< The process modes currently active on dsp processing stream info*/ - std::vector m_MasterModes[AE_DSP_ASTREAM_MAX]; /*!< table about selectable and usable master processing modes */ - std::map m_MenuPositions; /*!< The differnet menu selection positions */ - std::vector m_MenuHierarchy; /*!< Menu selection flow hierachy */ - std::vector m_Menus; /*!< storage about present addon menus on currently selected submenu */ - std::vector< std::pair > m_ModeList; /*!< currently present modes */ - bool m_GetCPUUsage; /*!< if true cpu usage detection is active */ - Features m_audioCaps; /*!< the on current playback on KODI supported audio features */ - int m_MenuName; /*!< current menu name, needed to get after the dialog was closed for addon */ - - /*! Settings control selection and information data */ - std::string m_InputChannels; - std::string m_InputChannelNames; - std::string m_InputSamplerate; - std::string m_OutputChannels; - std::string m_OutputChannelNames; - std::string m_OutputSamplerate; - std::string m_CPUUsage; - float m_volume; - }; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogContentSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogContentSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogContentSettings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogContentSettings.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,12 +18,6 @@ * */ -#include -#include -#include -#include -#include - #include #include "GUIDialogContentSettings.h" @@ -34,7 +28,7 @@ #include "dialogs/GUIDialogKaiToast.h" #include "guilib/GUIWindowManager.h" #include "input/Key.h" -#include "interfaces/builtins/Builtins.h" +#include "interfaces/Builtins.h" #include "settings/lib/Setting.h" #include "settings/lib/SettingDependency.h" #include "settings/lib/SettingsManager.h" @@ -52,6 +46,7 @@ #define SETTING_EXCLUDE "exclude" #define SETTING_NO_UPDATING "noupdating" +using namespace std; using namespace ADDON; CGUIDialogContentSettings::CGUIDialogContentSettings() @@ -114,7 +109,7 @@ std::string content = m_vecItems->Get(iSelected)->GetPath().substr(14); OnCancel(); Close(); - CBuiltins::GetInstance().Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.metadata.scraper." + content + ",return)"); + CBuiltins::Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.metadata.scraper." + content + ",return)"); return true; } @@ -211,7 +206,7 @@ } dialog->SetScanSettings(settings); - dialog->Open(); + dialog->DoModal(); bool confirmed = dialog->IsConfirmed(); if (confirmed) @@ -438,7 +433,7 @@ if (m_content == CONTENT_ALBUMS || m_content == CONTENT_ARTISTS) { FillContentTypes(m_content); - labels.push_back(std::make_pair(ADDON::TranslateContent(m_content, true), m_content)); + labels.push_back(make_pair(ADDON::TranslateContent(m_content, true), m_content)); } else { @@ -446,10 +441,10 @@ FillContentTypes(CONTENT_TVSHOWS); FillContentTypes(CONTENT_MUSICVIDEOS); - labels.push_back(std::make_pair(ADDON::TranslateContent(CONTENT_MOVIES, true), CONTENT_MOVIES)); - labels.push_back(std::make_pair(ADDON::TranslateContent(CONTENT_TVSHOWS, true), CONTENT_TVSHOWS)); - labels.push_back(std::make_pair(ADDON::TranslateContent(CONTENT_MUSICVIDEOS, true), CONTENT_MUSICVIDEOS)); - labels.push_back(std::make_pair(ADDON::TranslateContent(CONTENT_NONE, true), CONTENT_NONE)); + labels.push_back(make_pair(ADDON::TranslateContent(CONTENT_MOVIES, true), CONTENT_MOVIES)); + labels.push_back(make_pair(ADDON::TranslateContent(CONTENT_TVSHOWS, true), CONTENT_TVSHOWS)); + labels.push_back(make_pair(ADDON::TranslateContent(CONTENT_MUSICVIDEOS, true), CONTENT_MUSICVIDEOS)); + labels.push_back(make_pair(ADDON::TranslateContent(CONTENT_NONE, true), CONTENT_NONE)); } SET_CONTROL_LABELS(CONTROL_CONTENT_TYPE, m_content, &labels); @@ -460,18 +455,18 @@ // grab all scrapers which support this content-type VECADDONS addons; TYPE type = ADDON::ScraperTypeFromContent(content); - if (!CAddonMgr::GetInstance().GetAddons(type, addons)) + if (!CAddonMgr::Get().GetAddons(type, addons)) return; AddonPtr addon; std::string defaultID; - if (CAddonMgr::GetInstance().GetDefault(type, addon)) + if (CAddonMgr::Get().GetDefault(type, addon)) defaultID = addon->ID(); for (IVECADDONS it = addons.begin(); it != addons.end(); ++it) { bool isDefault = ((*it)->ID() == defaultID); - std::map::iterator iter = m_scrapers.find(content); + map::iterator iter = m_scrapers.find(content); AddonPtr scraper = (*it)->Clone(); @@ -491,7 +486,7 @@ { VECADDONS vec; vec.push_back(scraper); - m_scrapers.insert(std::make_pair(content,vec)); + m_scrapers.insert(make_pair(content,vec)); } } } @@ -506,7 +501,7 @@ else { AddonPtr scraperAddon; - CAddonMgr::GetInstance().GetDefault(ADDON::ScraperTypeFromContent(m_content), scraperAddon); + CAddonMgr::Get().GetDefault(ADDON::ScraperTypeFromContent(m_content), scraperAddon); m_scraper = std::dynamic_pointer_cast(scraperAddon); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,10 +18,6 @@ * */ -#include -#include -#include - #include "GUIDialogSettingsBase.h" #include "GUIUserMessages.h" #include "dialogs/GUIDialogYesNo.h" @@ -40,7 +36,8 @@ #include "settings/lib/SettingSection.h" #include "settings/windows/GUIControlSettings.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" + +using namespace std; #if defined(TARGET_WINDOWS) // disable 4355: 'this' used in base member initializer list #pragma warning(push) @@ -568,7 +565,7 @@ void CGUIDialogSettingsBase::UpdateSettings() { - for (std::vector::iterator it = m_settingControls.begin(); it != m_settingControls.end(); ++it) + for (vector::iterator it = m_settingControls.begin(); it != m_settingControls.end(); ++it) { BaseSettingControlPtr pSettingControl = *it; CSetting *pSetting = pSettingControl->GetSetting(); @@ -601,7 +598,7 @@ if (parentLevels > 0) { // add additional 2 spaces indentation for anything past one level - std::string indentation; + string indentation; for (int index = 1; index < parentLevels; index++) indentation.append(" "); label = StringUtils::Format(g_localizeStrings.Get(168).c_str(), indentation.c_str(), label.c_str()); @@ -756,9 +753,9 @@ void CGUIDialogSettingsBase::OnResetSettings() { - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{10041}, CVariant{10042})) + if (CGUIDialogYesNo::ShowAndGetInput(10041, 10042)) { - for(std::vector::iterator it = m_settingControls.begin(); it != m_settingControls.end(); ++it) + for(vector::iterator it = m_settingControls.begin(); it != m_settingControls.end(); ++it) { CSetting *setting = (*it)->GetSetting(); if (setting != NULL) @@ -845,7 +842,7 @@ BaseSettingControlPtr CGUIDialogSettingsBase::GetSettingControl(const std::string &strSetting) { - for (std::vector::iterator control = m_settingControls.begin(); control != m_settingControls.end(); ++control) + for (vector::iterator control = m_settingControls.begin(); control != m_settingControls.end(); ++control) { if ((*control)->GetSetting() != NULL && (*control)->GetSetting()->GetId() == strSetting) return *control; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsBase.h kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsBase.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsBase.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsBase.h 2015-10-19 08:39:17.000000000 +0000 @@ -56,8 +56,6 @@ class CSettingCategory; class CSettingSection; -class CVariant; - typedef std::shared_ptr BaseSettingControlPtr; class CGUIDialogSettingsBase @@ -71,23 +69,23 @@ virtual ~CGUIDialogSettingsBase(); // specializations of CGUIControl - virtual bool OnMessage(CGUIMessage &message) override; - virtual bool OnAction(const CAction &action) override; - virtual bool OnBack(int actionID) override; - virtual void DoProcess(unsigned int currentTime, CDirtyRegionList &dirtyregions) override; + virtual bool OnMessage(CGUIMessage &message); + virtual bool OnAction(const CAction &action); + virtual bool OnBack(int actionID); + virtual void DoProcess(unsigned int currentTime, CDirtyRegionList &dirtyregions); virtual bool IsConfirmed() const { return m_confirmed; } protected: // specializations of CGUIWindow - virtual void OnInitWindow() override; + virtual void OnInitWindow(); // implementations of ITimerCallback - virtual void OnTimeout() override; + virtual void OnTimeout(); // implementations of ISettingCallback - virtual void OnSettingChanged(const CSetting *setting) override; - virtual void OnSettingPropertyChanged(const CSetting *setting, const char *propertyName) override; + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingPropertyChanged(const CSetting *setting, const char *propertyName); // new virtual methods virtual bool AllowResettingSettings() const { return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,12 +18,11 @@ * */ -#include -#include - #include "GUIDialogSettingsManagerBase.h" #include "settings/lib/SettingsManager.h" +using namespace std; + CGUIDialogSettingsManagerBase::CGUIDialogSettingsManagerBase(int windowId, const std::string &xmlFile) : CGUIDialogSettingsBase(windowId, xmlFile), m_settingsManager(NULL) @@ -62,7 +61,7 @@ m_settingsManager->UnregisterCallback(this); } -ISettingControl* CGUIDialogSettingsManagerBase::CreateControl(const std::string &controlType) const +ISettingControl* CGUIDialogSettingsManagerBase::CreateControl(const std::string &controlType) { assert(m_settingsManager != NULL); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.h kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.h 2015-10-19 08:39:17.000000000 +0000 @@ -31,13 +31,13 @@ protected: // implementation of CGUIDialogSettingsBase - virtual CSetting* GetSetting(const std::string &settingId) override; + virtual CSetting* GetSetting(const std::string &settingId); - virtual std::set CreateSettings() override; - virtual void FreeSettingsControls() override; + virtual std::set CreateSettings(); + virtual void FreeSettingsControls(); // implementation of ISettingControlCreator - virtual ISettingControl* CreateControl(const std::string &controlType) const override; + virtual ISettingControl* CreateControl(const std::string &controlType); CSettingsManager *m_settingsManager; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsManualBase.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsManualBase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsManualBase.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsManualBase.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,9 +18,6 @@ * */ -#include -#include - #include "GUIDialogSettingsManualBase.h" #include "settings/SettingAddon.h" #include "settings/SettingPath.h" @@ -29,7 +26,8 @@ #include "settings/lib/SettingSection.h" #include "settings/lib/SettingsManager.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" + +using namespace std; CGUIDialogSettingsManualBase::CGUIDialogSettingsManualBase(int windowId, const std::string &xmlFile) : CGUIDialogSettingsManagerBase(windowId, xmlFile), @@ -97,7 +95,7 @@ size_t groups = category->GetGroups().size(); - CSettingGroup *group = new CSettingGroup(StringUtils::Format("%" PRIuS, groups + 1), m_settingsManager); + CSettingGroup *group = new CSettingGroup(StringUtils::Format("%zu", groups + 1), m_settingsManager); if (group == NULL) return NULL; @@ -600,7 +598,7 @@ CSettingList* CGUIDialogSettingsManualBase::AddList(CSettingGroup *group, const std::string &id, int label, int level, std::vector values, IntegerSettingOptionsFiller filler, int heading, int minimumItems /* = 0 */, int maximumItems /* = -1 */, - bool visible /* = true */, int help /* = -1 */, SettingControlListValueFormatter formatter /* = NULL */) + bool visible /* = true */, int help /* = -1 */) { if (group == NULL || id.empty() || label < 0 || filler == NULL || GetSetting(id) != NULL) @@ -632,7 +630,7 @@ // setting the default will also set the actual value on an unchanged setting setting->SetDefault(settingValues); - setting->SetControl(GetListControl("integer", false, heading, true, formatter)); + setting->SetControl(GetListControl("integer", false, heading, true)); setting->SetMinimumItems(minimumItems); setting->SetMaximumItems(maximumItems); setSettingDetails(setting, level, visible, help); @@ -1025,7 +1023,7 @@ return control; } -ISettingControl* CGUIDialogSettingsManualBase::GetListControl(const std::string &format, bool delayed /* = false */, int heading /* = -1 */, bool multiselect /* = false */,SettingControlListValueFormatter formatter /* = NULL */) +ISettingControl* CGUIDialogSettingsManualBase::GetListControl(const std::string &format, bool delayed /* = false */, int heading /* = -1 */, bool multiselect /* = false */) { CSettingControlList *control = new CSettingControlList(); if (!control->SetFormat(format)) @@ -1037,7 +1035,6 @@ control->SetDelayed(delayed); control->SetHeading(heading); control->SetMultiSelect(multiselect); - control->SetFormatter(formatter); return control; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsManualBase.h kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsManualBase.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/GUIDialogSettingsManualBase.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/GUIDialogSettingsManualBase.h 2015-10-19 08:39:17.000000000 +0000 @@ -106,7 +106,7 @@ CSettingList* AddList(CSettingGroup *group, const std::string &id, int label, int level, std::vector values, const StaticIntegerSettingOptions &entries, int heading, int minimumItems = 0, int maximumItems = -1, bool visible = true, int help = -1); CSettingList* AddList(CSettingGroup *group, const std::string &id, int label, int level, std::vector values, IntegerSettingOptionsFiller filler, - int heading, int minimumItems = 0, int maximumItems = -1, bool visible = true, int help = -1, SettingControlListValueFormatter formatter = NULL); + int heading, int minimumItems = 0, int maximumItems = -1, bool visible = true, int help = -1); // slider controls CSettingInt* AddPercentageSlider(CSettingGroup *group, const std::string &id, int label, int level, int value, int formatLabel, int step = 1, int heading = -1, @@ -151,7 +151,7 @@ ISettingControl* GetButtonControl(const std::string &format, bool delayed = false, int heading = -1, bool hideValue = false, bool showInstalledAddons = true, bool showInstallableAddons = false, bool showMoreAddons = true); ISettingControl* GetSpinnerControl(const std::string &format, bool delayed = false, int minimumLabel = -1, int formatLabel = -1, const std::string &formatString = ""); - ISettingControl* GetListControl(const std::string &format, bool delayed = false, int heading = -1, bool multiselect = false, SettingControlListValueFormatter formatter = NULL); + ISettingControl* GetListControl(const std::string &format, bool delayed = false, int heading = -1, bool multiselect = false); ISettingControl* GetSliderControl(const std::string &format, bool delayed = false, int heading = -1, bool usePopup = false, int formatLabel = -1, const std::string &formatString = ""); ISettingControl* GetRangeControl(const std::string &format, bool delayed = false, int formatLabel = -1, int valueFormatLabel = -1, const std::string &valueFormatString = ""); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/Makefile kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/settings/dialogs/Makefile 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/dialogs/Makefile 2015-10-19 08:39:17.000000000 +0000 @@ -1,6 +1,4 @@ -SRCS=GUIDialogAudioDSPManager.cpp \ - GUIDialogAudioDSPSettings.cpp \ - GUIDialogContentSettings.cpp \ +SRCS=GUIDialogContentSettings.cpp \ GUIDialogSettingsBase.cpp \ GUIDialogSettingsManagerBase.cpp \ GUIDialogSettingsManualBase.cpp \ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/DisplaySettings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/DisplaySettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/DisplaySettings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/DisplaySettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,38 +18,29 @@ * */ -#include "DisplaySettings.h" - -#include #include -#include -#include -#include -#include +#include +#include "DisplaySettings.h" +#include "dialogs/GUIDialogYesNo.h" #include "guilib/GraphicContext.h" #include "guilib/gui3d.h" #include "guilib/LocalizeStrings.h" #include "guilib/StereoscopicsManager.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" #include "settings/AdvancedSettings.h" #include "settings/lib/Setting.h" #include "settings/Settings.h" #include "threads/SingleLock.h" #include "utils/log.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "utils/XMLUtils.h" #include "windowing/WindowingFactory.h" -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; - // 0.1 second increments #define MAX_REFRESH_CHANGE_DELAY 200 +using namespace std; + static RESOLUTION_INFO EmptyResolution; static RESOLUTION_INFO EmptyModifiableResolution; @@ -94,7 +85,7 @@ CDisplaySettings::~CDisplaySettings() { } -CDisplaySettings& CDisplaySettings::GetInstance() +CDisplaySettings& CDisplaySettings::Get() { static CDisplaySettings sDisplaySettings; return sDisplaySettings; @@ -227,13 +218,13 @@ return false; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_VIDEOSCREEN_RESOLUTION || - settingId == CSettings::SETTING_VIDEOSCREEN_SCREEN) + if (settingId == "videoscreen.resolution" || + settingId == "videoscreen.screen") { RESOLUTION newRes = RES_DESKTOP; - if (settingId == CSettings::SETTING_VIDEOSCREEN_RESOLUTION) + if (settingId == "videoscreen.resolution") newRes = (RESOLUTION)((CSettingInt*)setting)->GetValue(); - else if (settingId == CSettings::SETTING_VIDEOSCREEN_SCREEN) + else if (settingId == "videoscreen.screen") { int screen = ((CSettingInt*)setting)->GetValue(); @@ -245,10 +236,10 @@ newRes = GetResolutionForScreen(); } - std::string screenmode = GetStringFromResolution(newRes); - CSettings::GetInstance().SetString(CSettings::SETTING_VIDEOSCREEN_SCREENMODE, screenmode); + string screenmode = GetStringFromResolution(newRes); + CSettings::Get().SetString("videoscreen.screenmode", screenmode); } - if (settingId == CSettings::SETTING_VIDEOSCREEN_SCREENMODE) + if (settingId == "videoscreen.screenmode") { RESOLUTION oldRes = GetCurrentResolution(); RESOLUTION newRes = GetResolutionFromString(((CSettingString*)setting)->GetValue()); @@ -262,8 +253,8 @@ { if (!m_resolutionChangeAborted) { - if (HELPERS::ShowYesNoDialogText(CVariant{13110}, CVariant{13111}, CVariant{""}, CVariant{""}, 10000) != - DialogResponse::YES) + bool cancelled = false; + if (!CGUIDialogYesNo::ShowAndGetInput(13110, 13111, cancelled, "", "", 10000)) { m_resolutionChangeAborted = true; return false; @@ -273,7 +264,7 @@ m_resolutionChangeAborted = false; } } - else if (settingId == CSettings::SETTING_VIDEOSCREEN_MONITOR) + else if (settingId == "videoscreen.monitor") { g_Windowing.UpdateResolutions(); RESOLUTION newRes = GetResolutionForScreen(); @@ -283,8 +274,8 @@ if (!m_resolutionChangeAborted) { - if (HELPERS::ShowYesNoDialogText(CVariant{13110}, CVariant{13111}, CVariant{""}, CVariant{""}, 10000) != - DialogResponse::YES) + bool cancelled = false; + if (!CGUIDialogYesNo::ShowAndGetInput(13110, 13111, cancelled, "", "", 10000)) { m_resolutionChangeAborted = true; return false; @@ -296,7 +287,7 @@ return true; } #if defined(HAS_GLX) - else if (settingId == CSettings::SETTING_VIDEOSCREEN_BLANKDISPLAYS) + else if (settingId == "videoscreen.blankdisplays") { g_Windowing.UpdateResolutions(); } @@ -311,7 +302,7 @@ return false; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_VIDEOSCREEN_SCREENMODE) + if (settingId == "videoscreen.screenmode") { CSettingString *screenmodeSetting = (CSettingString*)setting; std::string screenmode = screenmodeSetting->GetValue(); @@ -323,7 +314,7 @@ if (screenmode.size() == 21) return screenmodeSetting->SetValue(screenmode + "std"); } - else if (settingId == CSettings::SETTING_VIDEOSCREEN_VSYNC) + else if (settingId == "videoscreen.vsync") { // This ifdef is intended to catch everything except Linux and FreeBSD #if !defined(TARGET_LINUX) || defined(TARGET_DARWIN) || defined(TARGET_ANDROID) || defined(TARGET_RASPBERRY_PI) @@ -333,22 +324,22 @@ return vsyncSetting->SetValue(VSYNC_ALWAYS); #endif } - else if (settingId == CSettings::SETTING_VIDEOSCREEN_PREFEREDSTEREOSCOPICMODE) + else if (settingId == "videoscreen.preferedstereoscopicmode") { CSettingInt *stereomodeSetting = (CSettingInt*)setting; - STEREOSCOPIC_PLAYBACK_MODE playbackMode = (STEREOSCOPIC_PLAYBACK_MODE) CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_STEREOSCOPICPLAYBACKMODE); + STEREOSCOPIC_PLAYBACK_MODE playbackMode = (STEREOSCOPIC_PLAYBACK_MODE) CSettings::Get().GetInt("videoplayer.stereoscopicplaybackmode"); if (stereomodeSetting->GetValue() == RENDER_STEREO_MODE_OFF) { // if preferred playback mode was OFF, update playback mode to ignore if (playbackMode == STEREOSCOPIC_PLAYBACK_MODE_PREFERRED) - CSettings::GetInstance().SetInt(CSettings::SETTING_VIDEOPLAYER_STEREOSCOPICPLAYBACKMODE, STEREOSCOPIC_PLAYBACK_MODE_IGNORE); + CSettings::Get().SetInt("videoplayer.stereoscopicplaybackmode", STEREOSCOPIC_PLAYBACK_MODE_IGNORE); return stereomodeSetting->SetValue(RENDER_STEREO_MODE_AUTO); } else if (stereomodeSetting->GetValue() == RENDER_STEREO_MODE_MONO) { // if preferred playback mode was MONO, update playback mode if (playbackMode == STEREOSCOPIC_PLAYBACK_MODE_PREFERRED) - CSettings::GetInstance().SetInt(CSettings::SETTING_VIDEOPLAYER_STEREOSCOPICPLAYBACKMODE, STEREOSCOPIC_PLAYBACK_MODE_MONO); + CSettings::Get().SetInt("videoplayer.stereoscopicplaybackmode", STEREOSCOPIC_PLAYBACK_MODE_MONO); return stereomodeSetting->SetValue(RENDER_STEREO_MODE_AUTO); } } @@ -363,8 +354,8 @@ if (save) { - std::string mode = GetStringFromResolution(resolution); - CSettings::GetInstance().SetString(CSettings::SETTING_VIDEOSCREEN_SCREENMODE, mode.c_str()); + string mode = GetStringFromResolution(resolution); + CSettings::Get().SetString("videoscreen.screenmode", mode.c_str()); } if (resolution != m_currentResolution) @@ -376,7 +367,7 @@ RESOLUTION CDisplaySettings::GetDisplayResolution() const { - return GetResolutionFromString(CSettings::GetInstance().GetString(CSettings::SETTING_VIDEOSCREEN_SCREENMODE)); + return GetResolutionFromString(CSettings::Get().GetString("videoscreen.screenmode")); } const RESOLUTION_INFO& CDisplaySettings::GetResolutionInfo(size_t index) const @@ -568,10 +559,10 @@ else if (strResolution.size() >= 21) { // format: SWWWWWHHHHHRRR.RRRRRP333, where S = screen, W = width, H = height, R = refresh, P = interlace, 3 = stereo mode - int screen = std::strtol(StringUtils::Mid(strResolution, 0,1).c_str(), NULL, 10); - int width = std::strtol(StringUtils::Mid(strResolution, 1,5).c_str(), NULL, 10); - int height = std::strtol(StringUtils::Mid(strResolution, 6,5).c_str(), NULL, 10); - float refresh = (float)std::strtod(StringUtils::Mid(strResolution, 11,9).c_str(), NULL); + int screen = strtol(StringUtils::Mid(strResolution, 0,1).c_str(), NULL, 10); + int width = strtol(StringUtils::Mid(strResolution, 1,5).c_str(), NULL, 10); + int height = strtol(StringUtils::Mid(strResolution, 6,5).c_str(), NULL, 10); + float refresh = (float)strtod(StringUtils::Mid(strResolution, 11,9).c_str(), NULL); unsigned flags = 0; // look for 'i' and treat everything else as progressive, @@ -584,8 +575,8 @@ flags |= D3DPRESENTFLAG_MODE3DTB; std::map resolutionInfos; - for (size_t resolution = RES_DESKTOP; resolution < CDisplaySettings::GetInstance().ResolutionInfoSize(); resolution++) - resolutionInfos.insert(std::make_pair((RESOLUTION)resolution, CDisplaySettings::GetInstance().GetResolutionInfo(resolution))); + for (size_t resolution = RES_DESKTOP; resolution < CDisplaySettings::Get().ResolutionInfoSize(); resolution++) + resolutionInfos.insert(make_pair((RESOLUTION)resolution, CDisplaySettings::Get().GetResolutionInfo(resolution))); return FindBestMatchingResolution(resolutionInfos, screen, width, height, refresh, flags); } @@ -598,9 +589,9 @@ if (resolution == RES_WINDOW) return "WINDOW"; - if (resolution >= RES_DESKTOP && resolution < (RESOLUTION)CDisplaySettings::GetInstance().ResolutionInfoSize()) + if (resolution >= RES_DESKTOP && resolution < (RESOLUTION)CDisplaySettings::Get().ResolutionInfoSize()) { - const RESOLUTION_INFO &info = CDisplaySettings::GetInstance().GetResolutionInfo(resolution); + const RESOLUTION_INFO &info = CDisplaySettings::Get().GetResolutionInfo(resolution); // also handle RES_DESKTOP resolutions with non-default refresh rates if (resolution != RES_DESKTOP || (refreshrate > 0.0f && refreshrate != info.fRefreshRate)) { @@ -615,13 +606,13 @@ RESOLUTION CDisplaySettings::GetResolutionForScreen() { - DisplayMode mode = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOSCREEN_SCREEN); + DisplayMode mode = CSettings::Get().GetInt("videoscreen.screen"); if (mode == DM_WINDOWED) return RES_WINDOW; for (int idx=0; idx < g_Windowing.GetNumScreens(); idx++) { - if (CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP + idx).iScreen == mode) + if (CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP + idx).iScreen == mode) return (RESOLUTION)(RES_DESKTOP + idx); } @@ -630,16 +621,16 @@ void CDisplaySettings::SettingOptionsRefreshChangeDelaysFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) { - list.push_back(std::make_pair(g_localizeStrings.Get(13551), 0)); + list.push_back(make_pair(g_localizeStrings.Get(13551), 0)); for (int i = 1; i <= MAX_REFRESH_CHANGE_DELAY; i++) - list.push_back(std::make_pair(StringUtils::Format(g_localizeStrings.Get(13553).c_str(), (double)i / 10.0), i)); + list.push_back(make_pair(StringUtils::Format(g_localizeStrings.Get(13553).c_str(), (double)i / 10.0), i)); } void CDisplaySettings::SettingOptionsRefreshRatesFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t, void *data) { // get the proper resolution - RESOLUTION res = CDisplaySettings::GetInstance().GetDisplayResolution(); + RESOLUTION res = CDisplaySettings::Get().GetDisplayResolution(); if (res < RES_WINDOW) return; @@ -647,21 +638,21 @@ if (res == RES_WINDOW) { current = "WINDOW"; - list.push_back(std::make_pair(g_localizeStrings.Get(242), current)); + list.push_back(make_pair(g_localizeStrings.Get(242), current)); return; } - RESOLUTION_INFO resInfo = CDisplaySettings::GetInstance().GetResolutionInfo(res); + RESOLUTION_INFO resInfo = CDisplaySettings::Get().GetResolutionInfo(res); // The only meaningful parts of res here are iScreen, iScreenWidth, iScreenHeight - std::vector refreshrates = g_Windowing.RefreshRates(resInfo.iScreen, resInfo.iScreenWidth, resInfo.iScreenHeight, resInfo.dwFlags); + vector refreshrates = g_Windowing.RefreshRates(resInfo.iScreen, resInfo.iScreenWidth, resInfo.iScreenHeight, resInfo.dwFlags); bool match = false; - for (std::vector::const_iterator refreshrate = refreshrates.begin(); refreshrate != refreshrates.end(); ++refreshrate) + for (vector::const_iterator refreshrate = refreshrates.begin(); refreshrate != refreshrates.end(); ++refreshrate) { std::string screenmode = GetStringFromResolution((RESOLUTION)refreshrate->ResInfo_Index, refreshrate->RefreshRate); if (!match && StringUtils::EqualsNoCase(((CSettingString*)setting)->GetValue(), screenmode)) match = true; - list.push_back(std::make_pair(StringUtils::Format("%.02f", refreshrate->RefreshRate), screenmode)); + list.push_back(make_pair(StringUtils::Format("%.02f", refreshrate->RefreshRate), screenmode)); } if (!match) @@ -670,25 +661,25 @@ void CDisplaySettings::SettingOptionsResolutionsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) { - RESOLUTION res = CDisplaySettings::GetInstance().GetDisplayResolution(); - RESOLUTION_INFO info = CDisplaySettings::GetInstance().GetResolutionInfo(res); + RESOLUTION res = CDisplaySettings::Get().GetDisplayResolution(); + RESOLUTION_INFO info = CDisplaySettings::Get().GetResolutionInfo(res); if (res == RES_WINDOW) { current = res; - list.push_back(std::make_pair(g_localizeStrings.Get(242), res)); + list.push_back(make_pair(g_localizeStrings.Get(242), res)); } else { std::map resolutionInfos; - std::vector resolutions = g_Windowing.ScreenResolutions(info.iScreen, info.fRefreshRate); - for (std::vector::const_iterator resolution = resolutions.begin(); resolution != resolutions.end(); ++resolution) + vector resolutions = g_Windowing.ScreenResolutions(info.iScreen, info.fRefreshRate); + for (vector::const_iterator resolution = resolutions.begin(); resolution != resolutions.end(); ++resolution) { - list.push_back(std::make_pair( + list.push_back(make_pair( StringUtils::Format("%dx%d%s", resolution->width, resolution->height, ModeFlagsToString(resolution->flags, false).c_str()), resolution->ResInfo_Index)); - resolutionInfos.insert(std::make_pair((RESOLUTION)resolution->ResInfo_Index, CDisplaySettings::GetInstance().GetResolutionInfo(resolution->ResInfo_Index))); + resolutionInfos.insert(make_pair((RESOLUTION)resolution->ResInfo_Index, CDisplaySettings::Get().GetResolutionInfo(resolution->ResInfo_Index))); } current = FindBestMatchingResolution(resolutionInfos, info.iScreen, @@ -700,29 +691,29 @@ void CDisplaySettings::SettingOptionsScreensFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) { if (g_advancedSettings.m_canWindowed) - list.push_back(std::make_pair(g_localizeStrings.Get(242), DM_WINDOWED)); + list.push_back(make_pair(g_localizeStrings.Get(242), DM_WINDOWED)); #if defined(HAS_GLX) - list.push_back(std::make_pair(g_localizeStrings.Get(244), 0)); + list.push_back(make_pair(g_localizeStrings.Get(244), 0)); #else for (int idx = 0; idx < g_Windowing.GetNumScreens(); idx++) { - int screen = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP + idx).iScreen; + int screen = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP + idx).iScreen; #if defined(TARGET_DARWIN_OSX) - if (!CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP + idx).strOutput.empty()) - list.push_back(std::make_pair(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP + idx).strOutput, screen)); + if (!CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP + idx).strOutput.empty()) + list.push_back(make_pair(CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP + idx).strOutput, screen)); else #endif - list.push_back(std::make_pair(StringUtils::Format(g_localizeStrings.Get(241).c_str(), screen + 1), screen)); + list.push_back(make_pair(StringUtils::Format(g_localizeStrings.Get(241).c_str(), screen + 1), screen)); } - RESOLUTION res = CDisplaySettings::GetInstance().GetDisplayResolution(); + RESOLUTION res = CDisplaySettings::Get().GetDisplayResolution(); if (res == RES_WINDOW) current = DM_WINDOWED; else { - RESOLUTION_INFO resInfo = CDisplaySettings::GetInstance().GetResolutionInfo(res); + RESOLUTION_INFO resInfo = CDisplaySettings::Get().GetResolutionInfo(res); current = resInfo.iScreen; } #endif @@ -732,11 +723,11 @@ { // This ifdef is intended to catch everything except Linux and FreeBSD #if defined(TARGET_LINUX) && !defined(TARGET_DARWIN) && !defined(TARGET_ANDROID) && !defined(TARGET_RASPBERRY_PI) - list.push_back(std::make_pair(g_localizeStrings.Get(13101), VSYNC_DRIVER)); + list.push_back(make_pair(g_localizeStrings.Get(13101), VSYNC_DRIVER)); #endif - list.push_back(std::make_pair(g_localizeStrings.Get(13106), VSYNC_DISABLED)); - list.push_back(std::make_pair(g_localizeStrings.Get(13107), VSYNC_VIDEO)); - list.push_back(std::make_pair(g_localizeStrings.Get(13108), VSYNC_ALWAYS)); + list.push_back(make_pair(g_localizeStrings.Get(13106), VSYNC_DISABLED)); + list.push_back(make_pair(g_localizeStrings.Get(13107), VSYNC_VIDEO)); + list.push_back(make_pair(g_localizeStrings.Get(13108), VSYNC_ALWAYS)); } void CDisplaySettings::SettingOptionsStereoscopicModesFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) @@ -745,20 +736,20 @@ { RENDER_STEREO_MODE mode = (RENDER_STEREO_MODE) i; if (g_Windowing.SupportsStereo(mode)) - list.push_back(std::make_pair(CStereoscopicsManager::GetInstance().GetLabelForStereoMode(mode), mode)); + list.push_back(make_pair(CStereoscopicsManager::Get().GetLabelForStereoMode(mode), mode)); } } void CDisplaySettings::SettingOptionsPreferredStereoscopicViewModesFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data) { - list.push_back(std::make_pair(CStereoscopicsManager::GetInstance().GetLabelForStereoMode(RENDER_STEREO_MODE_AUTO), RENDER_STEREO_MODE_AUTO)); // option for autodetect + list.push_back(make_pair(CStereoscopicsManager::Get().GetLabelForStereoMode(RENDER_STEREO_MODE_AUTO), RENDER_STEREO_MODE_AUTO)); // option for autodetect // don't add "off" to the list of preferred modes as this doesn't make sense for (int i = RENDER_STEREO_MODE_OFF +1; i < RENDER_STEREO_MODE_COUNT; i++) { RENDER_STEREO_MODE mode = (RENDER_STEREO_MODE) i; // also skip "mono" mode which is no real stereoscopic mode if (mode != RENDER_STEREO_MODE_MONO && g_Windowing.SupportsStereo(mode)) - list.push_back(std::make_pair(CStereoscopicsManager::GetInstance().GetLabelForStereoMode(mode), mode)); + list.push_back(make_pair(CStereoscopicsManager::Get().GetLabelForStereoMode(mode), mode)); } } @@ -767,15 +758,15 @@ #if defined(HAS_GLX) std::vector monitors; g_Windowing.GetConnectedOutputs(&monitors); - std::string currentMonitor = CSettings::GetInstance().GetString(CSettings::SETTING_VIDEOSCREEN_MONITOR); + std::string currentMonitor = CSettings::Get().GetString("videoscreen.monitor"); for (unsigned int i=0; i #include -#include #include #include "guilib/Resolution.h" @@ -36,14 +35,14 @@ public Observable { public: - static CDisplaySettings& GetInstance(); + static CDisplaySettings& Get(); - virtual bool Load(const TiXmlNode *settings) override; - virtual bool Save(TiXmlNode *settings) const override; - virtual void Clear() override; + virtual bool Load(const TiXmlNode *settings); + virtual bool Save(TiXmlNode *settings) const; + virtual void Clear(); - virtual bool OnSettingChanging(const CSetting *setting) override; - virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode) override; + virtual bool OnSettingChanging(const CSetting *setting); + virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode); /*! \brief Returns the currently active resolution diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/lib/ISetting.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/lib/ISetting.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/lib/ISetting.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/lib/ISetting.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,13 +18,13 @@ * */ -#include - #include "ISetting.h" #include "SettingDefinitions.h" #include "utils/XBMCTinyXML.h" #include "utils/XMLUtils.h" +using namespace std; + ISetting::ISetting(const std::string &id, CSettingsManager *settingsManager /* = NULL */) : m_id(id), m_settingsManager(settingsManager), diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/lib/ISettingsHandler.h kodi-15.2~git20151019.1039-final/xbmc/settings/lib/ISettingsHandler.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/lib/ISettingsHandler.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/lib/ISettingsHandler.h 2015-10-19 08:39:17.000000000 +0000 @@ -52,7 +52,7 @@ This callback can be used to trigger saving other settings. */ - virtual void OnSettingsSaved() const { } + virtual void OnSettingsSaved() { } /*! \brief Setting values have been unloaded. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingConditions.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingConditions.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingConditions.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingConditions.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -118,7 +118,7 @@ m_defines.insert(tmpCondition); } -void CSettingConditionsManager::AddCondition(const std::string &identifier, SettingConditionCheck condition, void *data /*= NULL*/) +void CSettingConditionsManager::AddCondition(const std::string &identifier, SettingConditionCheck condition) { if (identifier.empty() || condition == NULL) return; @@ -126,7 +126,7 @@ std::string tmpIdentifier = identifier; StringUtils::ToLower(tmpIdentifier); - m_conditions.insert(SettingConditionPair(tmpIdentifier, std::make_pair(condition, data))); + m_conditions.insert(SettingConditionPair(tmpIdentifier, condition)); } bool CSettingConditionsManager::Check(const std::string &condition, const std::string &value /* = "" */, const CSetting *setting /* = NULL */) const @@ -150,7 +150,7 @@ if (conditionIt == m_conditions.end()) return false; - return conditionIt->second.first(tmpCondition, value, setting, conditionIt->second.second); + return conditionIt->second(tmpCondition, value, setting); } CSettingConditionsManager::CSettingConditionsManager() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingConditions.h kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingConditions.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingConditions.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingConditions.h 2015-10-19 08:39:17.000000000 +0000 @@ -22,7 +22,6 @@ #include #include #include -#include #include "SettingDefinitions.h" #include "utils/BooleanLogic.h" @@ -30,7 +29,7 @@ class CSettingsManager; class CSetting; -typedef bool (*SettingConditionCheck)(const std::string &condition, const std::string &value, const CSetting *setting, void *data); +typedef bool (*SettingConditionCheck)(const std::string &condition, const std::string &value, const CSetting *setting); class ISettingCondition { @@ -94,7 +93,7 @@ virtual ~CSettingConditionsManager(); void AddCondition(const std::string &condition); - void AddCondition(const std::string &identifier, SettingConditionCheck condition, void *data = NULL); + void AddCondition(const std::string &identifier, SettingConditionCheck condition); bool Check(const std::string &condition, const std::string &value = "", const CSetting *setting = NULL) const; @@ -102,8 +101,8 @@ CSettingConditionsManager(const CSettingConditionsManager&); CSettingConditionsManager const& operator=(CSettingConditionsManager const&); - typedef std::pair > SettingConditionPair; - typedef std::map > SettingConditionMap; + typedef std::pair SettingConditionPair; + typedef std::map SettingConditionMap; SettingConditionMap m_conditions; std::set m_defines; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingDefinitions.h kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingDefinitions.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingDefinitions.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingDefinitions.h 2015-10-19 08:39:17.000000000 +0000 @@ -20,7 +20,6 @@ */ #include -#include #include #define SETTING_XML_ROOT "settings" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingDependency.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingDependency.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingDependency.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingDependency.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,10 +18,6 @@ * */ -#include -#include -#include - #include #include "SettingDependency.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/lib/Setting.h kodi-15.2~git20151019.1039-final/xbmc/settings/lib/Setting.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/lib/Setting.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/lib/Setting.h 2015-10-19 08:39:17.000000000 +0000 @@ -81,7 +81,7 @@ virtual CSetting* Clone(const std::string &id) const = 0; - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); virtual int GetType() const = 0; virtual bool FromString(const std::string &value) = 0; @@ -111,15 +111,15 @@ void SetCallback(ISettingCallback *callback) { m_callback = callback; } // overrides of ISetting - virtual bool IsVisible() const override; + virtual bool IsVisible() const; protected: // implementation of ISettingCallback - virtual bool OnSettingChanging(const CSetting *setting) override; - virtual void OnSettingChanged(const CSetting *setting) override; - virtual void OnSettingAction(const CSetting *setting) override; - virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode) override; - virtual void OnSettingPropertyChanged(const CSetting *setting, const char *propertyName) override; + virtual bool OnSettingChanging(const CSetting *setting); + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); + virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode); + virtual void OnSettingPropertyChanged(const CSetting *setting, const char *propertyName); void Copy(const CSetting &setting); @@ -154,16 +154,16 @@ CSettingList(const std::string &id, const CSettingList &setting); virtual ~CSettingList(); - virtual CSetting* Clone(const std::string &id) const override; + virtual CSetting* Clone(const std::string &id) const; - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); - virtual int GetType() const override { return SettingTypeList; } - virtual bool FromString(const std::string &value) override; - virtual std::string ToString() const override; - virtual bool Equals(const std::string &value) const override; - virtual bool CheckValidity(const std::string &value) const override; - virtual void Reset() override; + virtual int GetType() const { return SettingTypeList; } + virtual bool FromString(const std::string &value); + virtual std::string ToString() const; + virtual bool Equals(const std::string &value) const; + virtual bool CheckValidity(const std::string &value) const; + virtual void Reset(); int GetElementType() const; const CSetting* GetDefinition() const { return m_definition; } @@ -211,16 +211,16 @@ CSettingBool(const std::string &id, int label, bool value, CSettingsManager *settingsManager = NULL); virtual ~CSettingBool() { } - virtual CSetting* Clone(const std::string &id) const override; + virtual CSetting* Clone(const std::string &id) const; - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); - virtual int GetType() const override { return SettingTypeBool; } - virtual bool FromString(const std::string &value) override; - virtual std::string ToString() const override; - virtual bool Equals(const std::string &value) const override; - virtual bool CheckValidity(const std::string &value) const override; - virtual void Reset() override { SetValue(m_default); } + virtual int GetType() const { return SettingTypeBool; } + virtual bool FromString(const std::string &value); + virtual std::string ToString() const; + virtual bool Equals(const std::string &value) const; + virtual bool CheckValidity(const std::string &value) const; + virtual void Reset() { SetValue(m_default); } bool GetValue() const { CSharedLock lock(m_critical); return m_value; } bool SetValue(bool value); @@ -250,17 +250,17 @@ CSettingInt(const std::string &id, int label, int value, const StaticIntegerSettingOptions &options, CSettingsManager *settingsManager = NULL); virtual ~CSettingInt() { } - virtual CSetting* Clone(const std::string &id) const override; + virtual CSetting* Clone(const std::string &id) const; - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); - virtual int GetType() const override { return SettingTypeInteger; } - virtual bool FromString(const std::string &value) override; - virtual std::string ToString() const override; - virtual bool Equals(const std::string &value) const override; - virtual bool CheckValidity(const std::string &value) const override; + virtual int GetType() const { return SettingTypeInteger; } + virtual bool FromString(const std::string &value); + virtual std::string ToString() const; + virtual bool Equals(const std::string &value) const; + virtual bool CheckValidity(const std::string &value) const; virtual bool CheckValidity(int value) const; - virtual void Reset() override { SetValue(m_default); } + virtual void Reset() { SetValue(m_default); } int GetValue() const { CSharedLock lock(m_critical); return m_value; } bool SetValue(int value); @@ -320,17 +320,17 @@ CSettingNumber(const std::string &id, int label, float value, float minimum, float step, float maximum, CSettingsManager *settingsManager = NULL); virtual ~CSettingNumber() { } - virtual CSetting* Clone(const std::string &id) const override; + virtual CSetting* Clone(const std::string &id) const; - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); - virtual int GetType() const override { return SettingTypeNumber; } - virtual bool FromString(const std::string &value) override; - virtual std::string ToString() const override; - virtual bool Equals(const std::string &value) const override; - virtual bool CheckValidity(const std::string &value) const override; + virtual int GetType() const { return SettingTypeNumber; } + virtual bool FromString(const std::string &value); + virtual std::string ToString() const; + virtual bool Equals(const std::string &value) const; + virtual bool CheckValidity(const std::string &value) const; virtual bool CheckValidity(double value) const; - virtual void Reset() override { SetValue(m_default); } + virtual void Reset() { SetValue(m_default); } double GetValue() const { CSharedLock lock(m_critical); return m_value; } bool SetValue(double value); @@ -368,16 +368,16 @@ CSettingString(const std::string &id, int label, const std::string &value, CSettingsManager *settingsManager = NULL); virtual ~CSettingString() { } - virtual CSetting* Clone(const std::string &id) const override; + virtual CSetting* Clone(const std::string &id) const; - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); - virtual int GetType() const override { return SettingTypeString; } - virtual bool FromString(const std::string &value) override { return SetValue(value); } - virtual std::string ToString() const override { return m_value; } - virtual bool Equals(const std::string &value) const override { return m_value == value; } - virtual bool CheckValidity(const std::string &value) const override; - virtual void Reset() override { SetValue(m_default); } + virtual int GetType() const { return SettingTypeString; } + virtual bool FromString(const std::string &value) { return SetValue(value); } + virtual std::string ToString() const { return m_value; } + virtual bool Equals(const std::string &value) const { return m_value == value; } + virtual bool CheckValidity(const std::string &value) const; + virtual void Reset() { SetValue(m_default); } virtual const std::string& GetValue() const { CSharedLock lock(m_critical); return m_value; } virtual bool SetValue(const std::string &value); @@ -430,18 +430,18 @@ CSettingAction(const std::string &id, const CSettingAction &setting); virtual ~CSettingAction() { } - virtual CSetting* Clone(const std::string &id) const override; + virtual CSetting* Clone(const std::string &id) const; - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); - virtual int GetType() const override { return SettingTypeAction; } - virtual bool FromString(const std::string &value) override { return false; } - virtual std::string ToString() const override { return ""; } - virtual bool Equals(const std::string &value) const override { return false; } - virtual bool CheckValidity(const std::string &value) const override { return false; } - virtual void Reset() override { } + virtual int GetType() const { return SettingTypeAction; } + virtual bool FromString(const std::string &value) { return false; } + virtual std::string ToString() const { return ""; } + virtual bool Equals(const std::string &value) const { return false; } + virtual bool CheckValidity(const std::string &value) const { return false; } + virtual void Reset() { } // this needs to be public so it can be triggered when activated // by the user in the GUI. - virtual void OnSettingAction(const CSetting *setting) override { return CSetting::OnSettingAction(this); } + virtual void OnSettingAction(const CSetting *setting) { return CSetting::OnSettingAction(this); } }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingSection.h kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingSection.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingSection.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingSection.h 2015-10-19 08:39:17.000000000 +0000 @@ -47,7 +47,7 @@ ~CSettingGroup(); // implementation of ISetting - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); /*! \brief Gets the full list of settings belonging to the setting group. @@ -98,7 +98,7 @@ ~CSettingCategory(); // implementation of ISetting - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); /*! \brief Gets the full list of setting groups belonging to the setting @@ -153,7 +153,7 @@ ~CSettingSection(); // implementation of ISetting - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); /*! \brief Gets the full list of setting categories belonging to the setting diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingsManager.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingsManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingsManager.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingsManager.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,10 +19,6 @@ */ #include "SettingsManager.h" - -#include -#include - #include "SettingDefinitions.h" #include "SettingSection.h" #include "Setting.h" @@ -30,6 +26,8 @@ #include "utils/StringUtils.h" #include "utils/XBMCTinyXML.h" +#include + CSettingsManager::CSettingsManager() : m_initialized(false), m_loaded(false) { } @@ -639,13 +637,13 @@ m_conditions.AddCondition(condition); } -void CSettingsManager::AddCondition(const std::string &identifier, SettingConditionCheck condition, void *data /*= NULL*/) +void CSettingsManager::AddCondition(const std::string &identifier, SettingConditionCheck condition) { CExclusiveLock lock(m_critical); if (identifier.empty() || condition == NULL) return; - m_conditions.AddCondition(identifier, condition, data); + m_conditions.AddCondition(identifier, condition); } bool CSettingsManager::Serialize(TiXmlNode *parent) const diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingsManager.h kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingsManager.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/lib/SettingsManager.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/lib/SettingsManager.h 2015-10-19 08:39:17.000000000 +0000 @@ -57,10 +57,10 @@ virtual ~CSettingsManager(); // implementation of ISettingCreator - virtual CSetting* CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager = NULL) const override; + virtual CSetting* CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager = NULL) const; // implementation of ISettingControlCreator - virtual ISettingControl* CreateControl(const std::string &controlType) const override; + virtual ISettingControl* CreateControl(const std::string &controlType) const; /*! \brief Initializes the settings manager using the setting definitions @@ -86,7 +86,7 @@ \param root XML node \return True if the setting values were successfully saved, false otherwise */ - virtual bool Save(TiXmlNode *root) const override; + virtual bool Save(TiXmlNode *root) const; /*! \brief Unloads the previously loaded setting values. @@ -100,7 +100,7 @@ returns to the uninitialized state. Any registered callbacks or implementations stay registered. */ - void Clear() override; + void Clear(); /*! \brief Loads the setting being represented by the given XML node with the @@ -390,28 +390,27 @@ \param identifier Identifier of the dynamic condition \param condition Implementation of the dynamic condition - \param data Opaque data pointer, will be passed back to SettingConditionCheck function */ - void AddCondition(const std::string &identifier, SettingConditionCheck condition, void *data = NULL); + void AddCondition(const std::string &identifier, SettingConditionCheck condition); private: // implementation of ISettingCallback - virtual bool OnSettingChanging(const CSetting *setting) override; - virtual void OnSettingChanged(const CSetting *setting) override; - virtual void OnSettingAction(const CSetting *setting) override; - virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode) override; - virtual void OnSettingPropertyChanged(const CSetting *setting, const char *propertyName) override; + virtual bool OnSettingChanging(const CSetting *setting); + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); + virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode); + virtual void OnSettingPropertyChanged(const CSetting *setting, const char *propertyName); // implementation of ISettingsHandler - virtual bool OnSettingsLoading() override; - virtual void OnSettingsLoaded() override; - virtual void OnSettingsUnloaded() override; - virtual bool OnSettingsSaving() const override; - virtual void OnSettingsSaved() const override; - virtual void OnSettingsCleared() override; + virtual bool OnSettingsLoading(); + virtual void OnSettingsLoaded(); + virtual void OnSettingsUnloaded(); + virtual bool OnSettingsSaving() const; + virtual void OnSettingsSaved() const; + virtual void OnSettingsCleared(); // implementation of ISubSettings - virtual bool Load(const TiXmlNode *settings) override; + virtual bool Load(const TiXmlNode *settings); bool Serialize(TiXmlNode *parent) const; bool Deserialize(const TiXmlNode *node, bool &updated, std::map *loadedSettings = NULL); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/Makefile kodi-15.2~git20151019.1039-final/xbmc/settings/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/settings/Makefile 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/Makefile 2015-10-19 08:39:16.000000000 +0000 @@ -1,5 +1,4 @@ SRCS=AdvancedSettings.cpp \ - AudioDSPSettings.cpp \ DisplaySettings.cpp \ MediaSettings.cpp \ MediaSourceSettings.cpp \ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/MediaSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/MediaSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/MediaSettings.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/MediaSettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,8 +18,6 @@ * */ -#include - #include #include "MediaSettings.h" @@ -27,26 +25,19 @@ #include "PlayListPlayer.h" #include "dialogs/GUIDialogContextMenu.h" #include "dialogs/GUIDialogFileBrowser.h" -#include "interfaces/builtins/Builtins.h" +#include "dialogs/GUIDialogYesNo.h" +#include "interfaces/Builtins.h" #include "music/MusicDatabase.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" #include "profiles/ProfilesManager.h" #include "settings/lib/Setting.h" -#include "settings/Settings.h" #include "storage/MediaManager.h" #include "threads/SingleLock.h" -#include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "utils/XBMCTinyXML.h" #include "utils/XMLUtils.h" -#include "utils/Variant.h" #include "video/VideoDatabase.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" - -using namespace KODI::MESSAGING; -using KODI::MESSAGING::HELPERS::DialogResponse; +using namespace std; CMediaSettings::CMediaSettings() { @@ -70,7 +61,7 @@ CMediaSettings::~CMediaSettings() { } -CMediaSettings& CMediaSettings::GetInstance() +CMediaSettings& CMediaSettings::Get() { static CMediaSettings sMediaSettings; return sMediaSettings; @@ -142,31 +133,6 @@ m_defaultVideoSettings.m_SubtitleCached = false; } - pElement = settings->FirstChildElement("defaultaudiosettings"); - if (pElement != NULL) - { - if (!XMLUtils::GetInt(pElement, "masterstreamtype", m_defaultAudioSettings.m_MasterStreamType)) - m_defaultAudioSettings.m_MasterStreamType = AE_DSP_ASTREAM_AUTO; - if (!XMLUtils::GetInt(pElement, "masterstreamtypesel", m_defaultAudioSettings.m_MasterStreamTypeSel)) - m_defaultAudioSettings.m_MasterStreamTypeSel = AE_DSP_ASTREAM_AUTO; - if (!XMLUtils::GetInt(pElement, "masterstreambase", m_defaultAudioSettings.m_MasterStreamBase)) - m_defaultAudioSettings.m_MasterStreamBase = AE_DSP_ABASE_STEREO; - - std::string strTag; - for (int type = AE_DSP_ASTREAM_BASIC; type < AE_DSP_ASTREAM_MAX; type++) - { - for (int base = AE_DSP_ABASE_STEREO; base < AE_DSP_ABASE_MAX; base++) - { - int tmp; - strTag = StringUtils::Format("masterprocess_%i_%i", type, base); - if (XMLUtils::GetInt(pElement, strTag.c_str(), tmp)) - m_defaultAudioSettings.m_MasterModes[type][base] = tmp; - else - m_defaultAudioSettings.m_MasterModes[type][base] = 0; - } - } - } - // mymusic settings pElement = settings->FirstChildElement("mymusic"); if (pElement != NULL) @@ -247,26 +213,6 @@ XMLUtils::SetBoolean(pNode, "nonlinstretch", m_defaultVideoSettings.m_CustomNonLinStretch); XMLUtils::SetInt(pNode, "stereomode", m_defaultVideoSettings.m_StereoMode); - // default audio settings for dsp addons - TiXmlElement audioSettingsNode("defaultaudiosettings"); - pNode = settings->InsertEndChild(audioSettingsNode); - if (pNode == NULL) - return false; - - XMLUtils::SetInt(pNode, "masterstreamtype", m_defaultAudioSettings.m_MasterStreamType); - XMLUtils::SetInt(pNode, "masterstreamtypesel", m_defaultAudioSettings.m_MasterStreamTypeSel); - XMLUtils::SetInt(pNode, "masterstreambase", m_defaultAudioSettings.m_MasterStreamBase); - - std::string strTag; - for (int type = AE_DSP_ASTREAM_BASIC; type < AE_DSP_ASTREAM_MAX; type++) - { - for (int base = AE_DSP_ABASE_STEREO; base < AE_DSP_ABASE_MAX; base++) - { - strTag = StringUtils::Format("masterprocess_%i_%i", type, base); - XMLUtils::SetInt(pNode, strTag.c_str(), m_defaultAudioSettings.m_MasterModes[type][base]); - } - } - // mymusic pNode = settings->FirstChild("mymusic"); if (pNode == NULL) @@ -318,21 +264,62 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_MUSICLIBRARY_CLEANUP) + if (settingId == "karaoke.export") { - if (HELPERS::ShowYesNoDialogText(CVariant{313}, CVariant{333}) == DialogResponse::YES) + CContextButtons choices; + choices.Add(1, g_localizeStrings.Get(22034)); + choices.Add(2, g_localizeStrings.Get(22035)); + + int retVal = CGUIDialogContextMenu::ShowAndGetChoice(choices); + if ( retVal > 0 ) + { + std::string path(CProfilesManager::Get().GetDatabaseFolder()); + VECSOURCES shares; + g_mediaManager.GetLocalDrives(shares); + if (CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(661), path, true)) + { + CMusicDatabase musicdatabase; + musicdatabase.Open(); + + if ( retVal == 1 ) + { + path = URIUtils::AddFileToFolder(path, "karaoke.html"); + musicdatabase.ExportKaraokeInfo( path, true ); + } + else + { + path = URIUtils::AddFileToFolder(path, "karaoke.csv"); + musicdatabase.ExportKaraokeInfo( path, false ); + } + musicdatabase.Close(); + } + } + } + else if (settingId == "karaoke.importcsv") + { + std::string path(CProfilesManager::Get().GetDatabaseFolder()); + VECSOURCES shares; + g_mediaManager.GetLocalDrives(shares); + if (CGUIDialogFileBrowser::ShowAndGetFile(shares, "karaoke.csv", g_localizeStrings.Get(651) , path)) + { + CMusicDatabase musicdatabase; + musicdatabase.Open(); + musicdatabase.ImportKaraokeInfo(path); + musicdatabase.Close(); + } + } + else if (settingId == "musiclibrary.cleanup") + { + if (CGUIDialogYesNo::ShowAndGetInput(313, 333)) g_application.StartMusicCleanup(true); } - else if (settingId == CSettings::SETTING_MUSICLIBRARY_EXPORT) - CBuiltins::GetInstance().Execute("exportlibrary(music)"); - else if (settingId == CSettings::SETTING_MUSICLIBRARY_IMPORT) + else if (settingId == "musiclibrary.export") + CBuiltins::Execute("exportlibrary(music)"); + else if (settingId == "musiclibrary.import") { std::string path; VECSOURCES shares; g_mediaManager.GetLocalDrives(shares); - g_mediaManager.GetNetworkLocations(shares); - g_mediaManager.GetRemovableDrives(shares); - if (CGUIDialogFileBrowser::ShowAndGetFile(shares, "musicdb.xml", g_localizeStrings.Get(651) , path)) { CMusicDatabase musicdatabase; @@ -341,21 +328,18 @@ musicdatabase.Close(); } } - else if (settingId == CSettings::SETTING_VIDEOLIBRARY_CLEANUP) + else if (settingId == "videolibrary.cleanup") { - if (HELPERS::ShowYesNoDialogText(CVariant{313}, CVariant{333}) == DialogResponse::YES) + if (CGUIDialogYesNo::ShowAndGetInput(313, 333)) g_application.StartVideoCleanup(true); } - else if (settingId == CSettings::SETTING_VIDEOLIBRARY_EXPORT) - CBuiltins::GetInstance().Execute("exportlibrary(video)"); - else if (settingId == CSettings::SETTING_VIDEOLIBRARY_IMPORT) + else if (settingId == "videolibrary.export") + CBuiltins::Execute("exportlibrary(video)"); + else if (settingId == "videolibrary.import") { std::string path; VECSOURCES shares; g_mediaManager.GetLocalDrives(shares); - g_mediaManager.GetNetworkLocations(shares); - g_mediaManager.GetRemovableDrives(shares); - if (CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(651) , path)) { CVideoDatabase videodatabase; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/MediaSettings.h kodi-15.2~git20151019.1039-final/xbmc/settings/MediaSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/MediaSettings.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/MediaSettings.h 2015-10-19 08:39:16.000000000 +0000 @@ -25,7 +25,6 @@ #include "settings/lib/ISettingCallback.h" #include "settings/lib/ISettingsHandler.h" #include "settings/lib/ISubSettings.h" -#include "settings/AudioDSPSettings.h" #include "settings/VideoSettings.h" #include "threads/CriticalSection.h" @@ -43,24 +42,19 @@ class CMediaSettings : public ISettingCallback, public ISettingsHandler, public ISubSettings { public: - static CMediaSettings& GetInstance(); + static CMediaSettings& Get(); - virtual bool Load(const TiXmlNode *settings) override; - virtual bool Save(TiXmlNode *settings) const override; + virtual bool Load(const TiXmlNode *settings); + virtual bool Save(TiXmlNode *settings) const; - virtual void OnSettingAction(const CSetting *setting) override; - virtual void OnSettingsLoaded() override; + virtual void OnSettingAction(const CSetting *setting); + virtual void OnSettingsLoaded(); const CVideoSettings& GetDefaultVideoSettings() const { return m_defaultVideoSettings; } CVideoSettings& GetDefaultVideoSettings() { return m_defaultVideoSettings; } const CVideoSettings& GetCurrentVideoSettings() const { return m_currentVideoSettings; } CVideoSettings& GetCurrentVideoSettings() { return m_currentVideoSettings; } - const CAudioSettings& GetDefaultAudioSettings() const { return m_defaultAudioSettings; } - CAudioSettings& GetDefaultAudioSettings() { return m_defaultAudioSettings; } - const CAudioSettings& GetCurrentAudioSettings() const { return m_currentAudioSettings; } - CAudioSettings& GetCurrentAudioSettings() { return m_currentAudioSettings; } - /*! \brief Retreive the watched mode for the given content type \param content Current content type \return the current watch mode for this content type, WATCH_MODE_ALL if the content type is unknown. @@ -109,9 +103,6 @@ CVideoSettings m_defaultVideoSettings; CVideoSettings m_currentVideoSettings; - CAudioSettings m_defaultAudioSettings; - CAudioSettings m_currentAudioSettings; - typedef std::map WatchedModes; WatchedModes m_watchedModes; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/MediaSourceSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/MediaSourceSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/MediaSourceSettings.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/MediaSourceSettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,9 +18,6 @@ * */ -#include -#include - #include "MediaSourceSettings.h" #include "URL.h" #include "Util.h" @@ -37,6 +34,7 @@ #define XML_SOURCES "sources" #define XML_SOURCE "source" +using namespace std; using namespace XFILE; CMediaSourceSettings::CMediaSourceSettings() @@ -47,7 +45,7 @@ CMediaSourceSettings::~CMediaSourceSettings() { } -CMediaSourceSettings& CMediaSourceSettings::GetInstance() +CMediaSourceSettings& CMediaSourceSettings::Get() { static CMediaSourceSettings sMediaSourceSettings; return sMediaSourceSettings; @@ -56,10 +54,10 @@ std::string CMediaSourceSettings::GetSourcesFile() { std::string file; - if (CProfilesManager::GetInstance().GetCurrentProfile().hasSources()) - file = CProfilesManager::GetInstance().GetProfileUserDataFolder(); + if (CProfilesManager::Get().GetCurrentProfile().hasSources()) + file = CProfilesManager::Get().GetProfileUserDataFolder(); else - file = CProfilesManager::GetInstance().GetUserDataFolder(); + file = CProfilesManager::Get().GetUserDataFolder(); return URIUtils::AddFileToFolder(file, SOURCES_FILE); } @@ -132,7 +130,7 @@ SetSources(pRoot, "pictures", m_pictureSources, m_defaultPictureSource); SetSources(pRoot, "files", m_fileSources, m_defaultFileSource); - CWakeOnAccess::GetInstance().QueueMACDiscoveryForAllRemotes(); + CWakeOnAccess::Get().QueueMACDiscoveryForAllRemotes(); return doc.SaveFile(file); } @@ -202,11 +200,11 @@ if (strUpdateChild == "name") it->strName = strUpdateValue; else if (strUpdateChild == "lockmode") - it->m_iLockMode = (LockType)std::strtol(strUpdateValue.c_str(), NULL, 10); + it->m_iLockMode = (LockType)strtol(strUpdateValue.c_str(), NULL, 10); else if (strUpdateChild == "lockcode") it->m_strLockCode = strUpdateValue; else if (strUpdateChild == "badpwdcount") - it->m_iBadPwdCount = (int)std::strtol(strUpdateValue.c_str(), NULL, 10); + it->m_iBadPwdCount = (int)strtol(strUpdateValue.c_str(), NULL, 10); else if (strUpdateChild == "thumbnail") it->m_strThumbnailImage = strUpdateValue; else if (strUpdateChild == "path") @@ -257,7 +255,7 @@ return false; // translate dir and add to our current shares - std::string strPath1 = share.strPath; + string strPath1 = share.strPath; if (strPath1.empty()) { CLog::Log(LOGERROR, "CMediaSourceSettings: unable to add empty path"); @@ -315,12 +313,12 @@ bool CMediaSourceSettings::GetSource(const std::string &category, const TiXmlNode *source, CMediaSource &share) { const TiXmlNode *pNodeName = source->FirstChild("name"); - std::string strName; + string strName; if (pNodeName && pNodeName->FirstChild()) strName = pNodeName->FirstChild()->ValueStr(); // get multiple paths - std::vector vecPaths; + vector vecPaths; const TiXmlElement *pPathName = source->FirstChildElement("path"); while (pPathName != NULL) { @@ -357,7 +355,7 @@ if (strName.empty() || vecPaths.empty()) return false; - std::vector verifiedPaths; + vector verifiedPaths; // disallowed for files, or theres only a single path in the vector if (StringUtils::EqualsNoCase(category, "files") || vecPaths.size() == 1) verifiedPaths.push_back(vecPaths[0]); @@ -365,7 +363,7 @@ else { // validate the paths - for (std::vector::const_iterator path = vecPaths.begin(); path != vecPaths.end(); ++path) + for (vector::const_iterator path = vecPaths.begin(); path != vecPaths.end(); ++path) { CURL url(*path); bool bIsInvalid = false; @@ -401,7 +399,7 @@ share.m_iBadPwdCount = 0; if (pLockMode) { - share.m_iLockMode = (LockType)std::strtol(pLockMode->FirstChild()->Value(), NULL, 10); + share.m_iLockMode = (LockType)strtol(pLockMode->FirstChild()->Value(), NULL, 10); share.m_iHasLock = 2; } @@ -409,7 +407,7 @@ share.m_strLockCode = pLockCode->FirstChild()->Value(); if (pBadPwdCount && pBadPwdCount->FirstChild()) - share.m_iBadPwdCount = (int)std::strtol(pBadPwdCount->FirstChild()->Value(), NULL, 10); + share.m_iBadPwdCount = (int)strtol(pBadPwdCount->FirstChild()->Value(), NULL, 10); if (pThumbnailNode && pThumbnailNode->FirstChild()) share.m_strThumbnailImage = pThumbnailNode->FirstChild()->Value(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/MediaSourceSettings.h kodi-15.2~git20151019.1039-final/xbmc/settings/MediaSourceSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/MediaSourceSettings.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/MediaSourceSettings.h 2015-10-19 08:39:16.000000000 +0000 @@ -29,12 +29,12 @@ class CMediaSourceSettings : public ISettingsHandler { public: - static CMediaSourceSettings& GetInstance(); + static CMediaSourceSettings& Get(); static std::string GetSourcesFile(); - virtual void OnSettingsLoaded() override; - virtual void OnSettingsUnloaded() override; + virtual void OnSettingsLoaded(); + virtual void OnSettingsUnloaded(); bool Load(); bool Load(const std::string &file); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SettingAddon.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/SettingAddon.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/SettingAddon.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SettingAddon.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -38,7 +38,7 @@ CSettingAddon::CSettingAddon(const std::string &id, const CSettingAddon &setting) : CSettingString(id, setting) { - copyaddontype(setting); + copy(setting); } CSetting* CSettingAddon::Clone(const std::string &id) const @@ -83,7 +83,7 @@ return true; } -void CSettingAddon::copyaddontype(const CSettingAddon &setting) +void CSettingAddon::copy(const CSettingAddon &setting) { CSettingString::Copy(setting); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SettingAddon.h kodi-15.2~git20151019.1039-final/xbmc/settings/SettingAddon.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/SettingAddon.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SettingAddon.h 2015-10-19 08:39:16.000000000 +0000 @@ -30,15 +30,15 @@ CSettingAddon(const std::string &id, const CSettingAddon &setting); virtual ~CSettingAddon() { } - virtual CSetting* Clone(const std::string &id) const override; + virtual CSetting* Clone(const std::string &id) const; - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); ADDON::TYPE GetAddonType() const { return m_addonType; } void SetAddonType(ADDON::TYPE addonType) { m_addonType = addonType; } private: - void copyaddontype(const CSettingAddon &setting); + void copy(const CSettingAddon &setting); ADDON::TYPE m_addonType; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SettingConditions.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/SettingConditions.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/SettingConditions.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SettingConditions.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -44,7 +44,7 @@ #include "osx/DarwinUtils.h" #endif// defined(TARGET_DARWIN_OSX) -bool AddonHasSettings(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool AddonHasSettings(const std::string &condition, const std::string &value, const CSetting *setting) { if (setting == NULL) return false; @@ -54,7 +54,7 @@ return false; ADDON::AddonPtr addon; - if (!ADDON::CAddonMgr::GetInstance().GetAddon(settingAddon->GetValue(), addon, settingAddon->GetAddonType()) || addon == NULL) + if (!ADDON::CAddonMgr::Get().GetAddon(settingAddon->GetValue(), addon, settingAddon->GetAddonType()) || addon == NULL) return false; if (addon->Type() == ADDON::ADDON_SKIN) @@ -63,87 +63,87 @@ return addon->HasSettings(); } -bool CheckMasterLock(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool CheckMasterLock(const std::string &condition, const std::string &value, const CSetting *setting) { return g_passwordManager.IsMasterLockUnlocked(StringUtils::EqualsNoCase(value, "true")); } -bool CheckPVRParentalPin(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool CheckPVRParentalPin(const std::string &condition, const std::string &value, const CSetting *setting) { return PVR::g_PVRManager.CheckParentalPIN(g_localizeStrings.Get(19262).c_str()); } -bool HasPeripherals(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool HasPeripherals(const std::string &condition, const std::string &value, const CSetting *setting) { return PERIPHERALS::g_peripherals.GetNumberOfPeripherals() > 0; } -bool IsFullscreen(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool IsFullscreen(const std::string &condition, const std::string &value, const CSetting *setting) { return g_Windowing.IsFullScreen(); } -bool IsMasterUser(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool IsMasterUser(const std::string &condition, const std::string &value, const CSetting *setting) { return g_passwordManager.bMasterUser; } -bool IsUsingTTFSubtitles(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool IsUsingTTFSubtitles(const std::string &condition, const std::string &value, const CSetting *setting) { return CUtil::IsUsingTTFSubtitles(); } -bool ProfileCanWriteDatabase(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileCanWriteDatabase(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases(); + return CProfilesManager::Get().GetCurrentProfile().canWriteDatabases(); } -bool ProfileCanWriteSources(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileCanWriteSources(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources(); + return CProfilesManager::Get().GetCurrentProfile().canWriteSources(); } -bool ProfileHasAddons(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileHasAddons(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().hasAddons(); + return CProfilesManager::Get().GetCurrentProfile().hasAddons(); } -bool ProfileHasDatabase(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileHasDatabase(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().hasDatabases(); + return CProfilesManager::Get().GetCurrentProfile().hasDatabases(); } -bool ProfileHasSources(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileHasSources(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().hasSources(); + return CProfilesManager::Get().GetCurrentProfile().hasSources(); } -bool ProfileHasAddonManagerLocked(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileHasAddonManagerLocked(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().addonmanagerLocked(); + return CProfilesManager::Get().GetCurrentProfile().addonmanagerLocked(); } -bool ProfileHasFilesLocked(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileHasFilesLocked(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().filesLocked(); + return CProfilesManager::Get().GetCurrentProfile().filesLocked(); } -bool ProfileHasMusicLocked(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileHasMusicLocked(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().musicLocked(); + return CProfilesManager::Get().GetCurrentProfile().musicLocked(); } -bool ProfileHasPicturesLocked(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileHasPicturesLocked(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().picturesLocked(); + return CProfilesManager::Get().GetCurrentProfile().picturesLocked(); } -bool ProfileHasProgramsLocked(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileHasProgramsLocked(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().programsLocked(); + return CProfilesManager::Get().GetCurrentProfile().programsLocked(); } -bool ProfileHasSettingsLocked(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileHasSettingsLocked(const std::string &condition, const std::string &value, const CSetting *setting) { LOCK_LEVEL::SETTINGS_LOCK slValue=LOCK_LEVEL::ALL; if (StringUtils::EqualsNoCase(value, "none")) @@ -154,22 +154,22 @@ slValue = LOCK_LEVEL::ADVANCED; else if (StringUtils::EqualsNoCase(value, "expert")) slValue = LOCK_LEVEL::EXPERT; - return slValue <= CProfilesManager::GetInstance().GetCurrentProfile().settingsLockLevel(); + return slValue <= CProfilesManager::Get().GetCurrentProfile().settingsLockLevel(); } -bool ProfileHasVideosLocked(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileHasVideosLocked(const std::string &condition, const std::string &value, const CSetting *setting) { - return CProfilesManager::GetInstance().GetCurrentProfile().videoLocked(); + return CProfilesManager::Get().GetCurrentProfile().videoLocked(); } -bool ProfileLockMode(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool ProfileLockMode(const std::string &condition, const std::string &value, const CSetting *setting) { char *tmp = NULL; LockType lock = (LockType)strtol(value.c_str(), &tmp, 0); if (tmp != NULL && *tmp != '\0') return false; - return CProfilesManager::GetInstance().GetCurrentProfile().getLockMode() == lock; + return CProfilesManager::Get().GetCurrentProfile().getLockMode() == lock; } std::set CSettingConditions::m_simpleConditions; @@ -206,6 +206,9 @@ #if HAS_GLES == 2 m_simpleConditions.insert("has_glesv2"); #endif +#ifdef HAS_KARAOKE + m_simpleConditions.insert("has_karaoke"); +#endif #ifdef HAS_SDL_JOYSTICK m_simpleConditions.insert("has_sdl_joystick"); #endif @@ -251,6 +254,10 @@ if (aml_present()) m_simpleConditions.insert("have_amcodec"); #endif +#ifdef TARGET_DARWIN_IOS_ATV2 + if (g_sysinfo.IsAppleTV2()) + m_simpleConditions.insert("isappletv2"); +#endif #ifdef TARGET_DARWIN_OSX if (CDarwinUtils::IsSnowLeopard()) m_simpleConditions.insert("osxissnowleopard"); @@ -298,7 +305,7 @@ std::map::const_iterator itCondition = m_complexConditions.find(condition); if (itCondition != m_complexConditions.end()) - return itCondition->second(condition, value, setting, NULL); + return itCondition->second(condition, value, setting); return Check(condition); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SettingControl.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/SettingControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/SettingControl.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SettingControl.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -58,7 +58,7 @@ return format.empty() || StringUtils::EqualsNoCase(format, "boolean"); } -bool CSettingControlFormattedRange::Deserialize(const TiXmlNode *node, bool update /* = false */) +bool CSettingControlSpinner::Deserialize(const TiXmlNode *node, bool update /* = false */) { if (!ISettingControl::Deserialize(node, update)) return false; @@ -215,7 +215,7 @@ bool CSettingControlList::Deserialize(const TiXmlNode *node, bool update /* = false */) { - if (!CSettingControlFormattedRange::Deserialize(node, update)) + if (!ISettingControl::Deserialize(node, update)) return false; XMLUtils::GetInt(node, SETTING_XML_ELM_CONTROL_HEADING, m_heading); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SettingControl.h kodi-15.2~git20151019.1039-final/xbmc/settings/SettingControl.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/SettingControl.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SettingControl.h 2015-10-19 08:39:16.000000000 +0000 @@ -44,7 +44,7 @@ virtual ~CSettingControlCreator() { } // implementation of ISettingControlCreator - virtual ISettingControl* CreateControl(const std::string &controlType) const override; + virtual ISettingControl* CreateControl(const std::string &controlType) const; }; class CSettingControlCheckmark : public ISettingControl @@ -57,16 +57,24 @@ virtual ~CSettingControlCheckmark() { } // implementation of ISettingControl - virtual std::string GetType() const override { return "toggle"; } - virtual bool SetFormat(const std::string &format) override; + virtual std::string GetType() const { return "toggle"; } + virtual bool SetFormat(const std::string &format); }; -class CSettingControlFormattedRange : public ISettingControl +class CSettingControlSpinner : public ISettingControl { public: - virtual ~CSettingControlFormattedRange() { } + CSettingControlSpinner() + : m_formatLabel(-1), + m_formatString("%i"), + m_minimumLabel(-1) + { } + virtual ~CSettingControlSpinner() { } - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + // implementation of ISettingControl + virtual std::string GetType() const { return "spinner"; } + virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); int GetFormatLabel() const { return m_formatLabel; } void SetFormatLabel(int formatLabel) { m_formatLabel = formatLabel; } @@ -76,30 +84,11 @@ void SetMinimumLabel(int minimumLabel) { m_minimumLabel = minimumLabel; } protected: - CSettingControlFormattedRange() - : m_formatLabel(-1), - m_formatString("%i"), - m_minimumLabel(-1) - { } - int m_formatLabel; std::string m_formatString; int m_minimumLabel; }; -class CSettingControlSpinner : public CSettingControlFormattedRange -{ -public: - CSettingControlSpinner() { } - virtual ~CSettingControlSpinner() { } - - // implementation of ISettingControl - virtual std::string GetType() const override { return "spinner"; } - - // specialization of CSettingControlFormattedRange - virtual bool SetFormat(const std::string &format) override; -}; - class CSettingControlEdit : public ISettingControl { public: @@ -113,9 +102,9 @@ virtual ~CSettingControlEdit() { } // implementation of ISettingControl - virtual std::string GetType() const override { return "edit"; } - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; - virtual bool SetFormat(const std::string &format) override; + virtual std::string GetType() const { return "edit"; } + virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); bool IsHidden() const { return m_hidden; } void SetHidden(bool hidden) { m_hidden = hidden; } @@ -144,9 +133,9 @@ virtual ~CSettingControlButton() { } // implementation of ISettingControl - virtual std::string GetType() const override { return "button"; } - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; - virtual bool SetFormat(const std::string &format) override; + virtual std::string GetType() const { return "button"; } + virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); int GetHeading() const { return m_heading; } void SetHeading(int heading) { m_heading = heading; } @@ -172,26 +161,20 @@ bool m_showMoreAddons; }; -class CSetting; -typedef std::string (*SettingControlListValueFormatter)(const CSetting *setting); - -class CSettingControlList : public CSettingControlFormattedRange +class CSettingControlList : public ISettingControl { public: CSettingControlList() : m_heading(-1), m_multiselect(false), - m_hideValue(false), - m_formatter(NULL) + m_hideValue(false) { } virtual ~CSettingControlList() { } // implementation of ISettingControl - virtual std::string GetType() const override { return "list"; } - - // specialization of CSettingControlFormattedRange - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; - virtual bool SetFormat(const std::string &format) override; + virtual std::string GetType() const { return "list"; } + virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); int GetHeading() const { return m_heading; } void SetHeading(int heading) { m_heading = heading; } @@ -200,14 +183,10 @@ bool HideValue() const { return m_hideValue; } void SetHideValue(bool hideValue) { m_hideValue = hideValue; } - SettingControlListValueFormatter GetFormatter() const { return m_formatter; } - void SetFormatter(SettingControlListValueFormatter formatter) { m_formatter = formatter; } - -protected: +protected: int m_heading; bool m_multiselect; bool m_hideValue; - SettingControlListValueFormatter m_formatter; }; class CSettingControlSlider; @@ -226,9 +205,9 @@ virtual ~CSettingControlSlider() { } // implementation of ISettingControl - virtual std::string GetType() const override { return "slider"; } - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; - virtual bool SetFormat(const std::string &format) override; + virtual std::string GetType() const { return "slider"; } + virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); int GetHeading() const { return m_heading; } void SetHeading(int heading) { m_heading = heading; } @@ -261,9 +240,9 @@ virtual ~CSettingControlRange() { } // implementation of ISettingControl - virtual std::string GetType() const override { return "range"; } - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; - virtual bool SetFormat(const std::string &format) override; + virtual std::string GetType() const { return "range"; } + virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); int GetFormatLabel() const { return m_formatLabel; } void SetFormatLabel(int formatLabel) { m_formatLabel = formatLabel; } @@ -288,8 +267,9 @@ virtual ~CSettingControlTitle() { } // implementation of ISettingControl - virtual std::string GetType() const override { return "title"; } - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; + virtual std::string GetType() const { return "title"; } + virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format) { return true; } bool IsSeparatorHidden() const { return m_separatorHidden; } void SetSeparatorHidden(bool hidden) { m_separatorHidden = hidden; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SettingCreator.h kodi-15.2~git20151019.1039-final/xbmc/settings/SettingCreator.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/SettingCreator.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SettingCreator.h 2015-10-19 08:39:16.000000000 +0000 @@ -28,5 +28,5 @@ virtual ~CSettingCreator() { } // implementation of ISettingCreator - virtual CSetting* CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager = NULL) const override; + virtual CSetting* CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager = NULL) const; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SettingPath.h kodi-15.2~git20151019.1039-final/xbmc/settings/SettingPath.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/SettingPath.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SettingPath.h 2015-10-19 08:39:16.000000000 +0000 @@ -31,10 +31,10 @@ CSettingPath(const std::string &id, const CSettingPath &setting); virtual ~CSettingPath() { } - virtual CSetting* Clone(const std::string &id) const override; + virtual CSetting* Clone(const std::string &id) const; - virtual bool Deserialize(const TiXmlNode *node, bool update = false) override; - virtual bool SetValue(const std::string &value) override; + virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetValue(const std::string &value); bool Writable() const { return m_writable; } void SetWritable(bool writable) { m_writable = writable; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/Settings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/Settings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/Settings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/Settings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,11 +25,8 @@ #include "Autorun.h" #include "LangInfo.h" #include "Util.h" -#include "events/EventLog.h" -#include "addons/RepositoryUpdater.h" #include "addons/Skin.h" #include "cores/AudioEngine/AEFactory.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" #include "cores/playercorefactory/PlayerCoreFactory.h" #include "cores/VideoRenderers/BaseRenderer.h" #include "filesystem/File.h" @@ -63,7 +60,6 @@ #include "powermanagement/PowerManager.h" #include "profiles/ProfilesManager.h" #include "pvr/PVRManager.h" -#include "pvr/PVRSettings.h" #include "pvr/windows/GUIWindowPVRGuide.h" #include "settings/AdvancedSettings.h" #include "settings/DisplaySettings.h" @@ -82,7 +78,6 @@ #include "utils/Weather.h" #include "utils/XBMCTinyXML.h" #include "utils/SeekHandler.h" -#include "utils/Variant.h" #include "view/ViewStateSettings.h" #include "input/InputManager.h" @@ -91,324 +86,6 @@ using namespace XFILE; -const std::string CSettings::SETTING_LOOKANDFEEL_SKIN = "lookandfeel.skin"; -const std::string CSettings::SETTING_LOOKANDFEEL_SKINSETTINGS = "lookandfeel.skinsettings"; -const std::string CSettings::SETTING_LOOKANDFEEL_SKINTHEME = "lookandfeel.skintheme"; -const std::string CSettings::SETTING_LOOKANDFEEL_SKINCOLORS = "lookandfeel.skincolors"; -const std::string CSettings::SETTING_LOOKANDFEEL_FONT = "lookandfeel.font"; -const std::string CSettings::SETTING_LOOKANDFEEL_SKINZOOM = "lookandfeel.skinzoom"; -const std::string CSettings::SETTING_LOOKANDFEEL_STARTUPWINDOW = "lookandfeel.startupwindow"; -const std::string CSettings::SETTING_LOOKANDFEEL_SOUNDSKIN = "lookandfeel.soundskin"; -const std::string CSettings::SETTING_LOOKANDFEEL_ENABLERSSFEEDS = "lookandfeel.enablerssfeeds"; -const std::string CSettings::SETTING_LOOKANDFEEL_RSSEDIT = "lookandfeel.rssedit"; -const std::string CSettings::SETTING_LOOKANDFEEL_STEREOSTRENGTH = "lookandfeel.stereostrength"; -const std::string CSettings::SETTING_LOCALE_LANGUAGE = "locale.language"; -const std::string CSettings::SETTING_LOCALE_COUNTRY = "locale.country"; -const std::string CSettings::SETTING_LOCALE_CHARSET = "locale.charset"; -const std::string CSettings::SETTING_LOCALE_KEYBOARDLAYOUTS = "locale.keyboardlayouts"; -const std::string CSettings::SETTING_LOCALE_TIMEZONECOUNTRY = "locale.timezonecountry"; -const std::string CSettings::SETTING_LOCALE_TIMEZONE = "locale.timezone"; -const std::string CSettings::SETTING_LOCALE_SHORTDATEFORMAT = "locale.shortdateformat"; -const std::string CSettings::SETTING_LOCALE_LONGDATEFORMAT = "locale.longdateformat"; -const std::string CSettings::SETTING_LOCALE_TIMEFORMAT = "locale.timeformat"; -const std::string CSettings::SETTING_LOCALE_USE24HOURCLOCK = "locale.use24hourclock"; -const std::string CSettings::SETTING_LOCALE_TEMPERATUREUNIT = "locale.temperatureunit"; -const std::string CSettings::SETTING_LOCALE_SPEEDUNIT = "locale.speedunit"; -const std::string CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS = "filelists.showparentdiritems"; -const std::string CSettings::SETTING_FILELISTS_SHOWEXTENSIONS = "filelists.showextensions"; -const std::string CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING = "filelists.ignorethewhensorting"; -const std::string CSettings::SETTING_FILELISTS_ALLOWFILEDELETION = "filelists.allowfiledeletion"; -const std::string CSettings::SETTING_FILELISTS_SHOWADDSOURCEBUTTONS = "filelists.showaddsourcebuttons"; -const std::string CSettings::SETTING_FILELISTS_SHOWHIDDEN = "filelists.showhidden"; -const std::string CSettings::SETTING_SCREENSAVER_MODE = "screensaver.mode"; -const std::string CSettings::SETTING_SCREENSAVER_SETTINGS = "screensaver.settings"; -const std::string CSettings::SETTING_SCREENSAVER_PREVIEW = "screensaver.preview"; -const std::string CSettings::SETTING_SCREENSAVER_TIME = "screensaver.time"; -const std::string CSettings::SETTING_SCREENSAVER_USEMUSICVISINSTEAD = "screensaver.usemusicvisinstead"; -const std::string CSettings::SETTING_SCREENSAVER_USEDIMONPAUSE = "screensaver.usedimonpause"; -const std::string CSettings::SETTING_WINDOW_WIDTH = "window.width"; -const std::string CSettings::SETTING_WINDOW_HEIGHT = "window.height"; -const std::string CSettings::SETTING_VIDEOLIBRARY_SHOWUNWATCHEDPLOTS = "videolibrary.showunwatchedplots"; -const std::string CSettings::SETTING_VIDEOLIBRARY_ACTORTHUMBS = "videolibrary.actorthumbs"; -const std::string CSettings::SETTING_MYVIDEOS_FLATTEN = "myvideos.flatten"; -const std::string CSettings::SETTING_VIDEOLIBRARY_FLATTENTVSHOWS = "videolibrary.flattentvshows"; -const std::string CSettings::SETTING_VIDEOLIBRARY_REMOVE_DUPLICATES = "videolibrary.removeduplicates"; -const std::string CSettings::SETTING_VIDEOLIBRARY_TVSHOWSSELECTFIRSTUNWATCHEDITEM = "videolibrary.tvshowsselectfirstunwatcheditem"; -const std::string CSettings::SETTING_VIDEOLIBRARY_TVSHOWSINCLUDEALLSEASONSANDSPECIALS = "videolibrary.tvshowsincludeallseasonsandspecials"; -const std::string CSettings::SETTING_VIDEOLIBRARY_SHOWALLITEMS = "videolibrary.showallitems"; -const std::string CSettings::SETTING_VIDEOLIBRARY_GROUPMOVIESETS = "videolibrary.groupmoviesets"; -const std::string CSettings::SETTING_VIDEOLIBRARY_GROUPSINGLEITEMSETS = "videolibrary.groupsingleitemsets"; -const std::string CSettings::SETTING_VIDEOLIBRARY_UPDATEONSTARTUP = "videolibrary.updateonstartup"; -const std::string CSettings::SETTING_VIDEOLIBRARY_BACKGROUNDUPDATE = "videolibrary.backgroundupdate"; -const std::string CSettings::SETTING_VIDEOLIBRARY_CLEANUP = "videolibrary.cleanup"; -const std::string CSettings::SETTING_VIDEOLIBRARY_EXPORT = "videolibrary.export"; -const std::string CSettings::SETTING_VIDEOLIBRARY_IMPORT = "videolibrary.import"; -const std::string CSettings::SETTING_VIDEOLIBRARY_SHOWEMPTYTVSHOWS = "videolibrary.showemptytvshows"; -const std::string CSettings::SETTING_LOCALE_AUDIOLANGUAGE = "locale.audiolanguage"; -const std::string CSettings::SETTING_VIDEOPLAYER_PREFERDEFAULTFLAG = "videoplayer.preferdefaultflag"; -const std::string CSettings::SETTING_VIDEOPLAYER_AUTOPLAYNEXTITEM = "videoplayer.autoplaynextitem"; -const std::string CSettings::SETTING_VIDEOPLAYER_SEEKSTEPS = "videoplayer.seeksteps"; -const std::string CSettings::SETTING_VIDEOPLAYER_SEEKDELAY = "videoplayer.seekdelay"; -const std::string CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE = "videoplayer.adjustrefreshrate"; -const std::string CSettings::SETTING_VIDEOPLAYER_PAUSEAFTERREFRESHCHANGE = "videoplayer.pauseafterrefreshchange"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK = "videoplayer.usedisplayasclock"; -const std::string CSettings::SETTING_VIDEOPLAYER_ERRORINASPECT = "videoplayer.errorinaspect"; -const std::string CSettings::SETTING_VIDEOPLAYER_STRETCH43 = "videoplayer.stretch43"; -const std::string CSettings::SETTING_VIDEOPLAYER_TELETEXTENABLED = "videoplayer.teletextenabled"; -const std::string CSettings::SETTING_VIDEOPLAYER_TELETEXTSCALE = "videoplayer.teletextscale"; -const std::string CSettings::SETTING_VIDEOPLAYER_STEREOSCOPICPLAYBACKMODE = "videoplayer.stereoscopicplaybackmode"; -const std::string CSettings::SETTING_VIDEOPLAYER_QUITSTEREOMODEONSTOP = "videoplayer.quitstereomodeonstop"; -const std::string CSettings::SETTING_VIDEOPLAYER_RENDERMETHOD = "videoplayer.rendermethod"; -const std::string CSettings::SETTING_VIDEOPLAYER_HQSCALERS = "videoplayer.hqscalers"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEAMCODEC = "videoplayer.useamcodec"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEMEDIACODEC = "videoplayer.usemediacodec"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEMEDIACODECSURFACE = "videoplayer.usemediacodecsurface"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVDPAU = "videoplayer.usevdpau"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVDPAUMIXER = "videoplayer.usevdpaumixer"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVDPAUMPEG2 = "videoplayer.usevdpaumpeg2"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVDPAUMPEG4 = "videoplayer.usevdpaumpeg4"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVDPAUVC1 = "videoplayer.usevdpauvc1"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVAAPI = "videoplayer.usevaapi"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVAAPIMPEG2 = "videoplayer.usevaapimpeg2"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVAAPIMPEG4 = "videoplayer.usevaapimpeg4"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVAAPIVC1 = "videoplayer.usevaapivc1"; -const std::string CSettings::SETTING_VIDEOPLAYER_PREFERVAAPIRENDER = "videoplayer.prefervaapirender"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEDXVA2 = "videoplayer.usedxva2"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEOMXPLAYER = "videoplayer.useomxplayer"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEOMX = "videoplayer.useomx"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVIDEOTOOLBOX = "videoplayer.usevideotoolbox"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEVDA = "videoplayer.usevda"; -const std::string CSettings::SETTING_VIDEOPLAYER_USEMMAL = "videoplayer.usemmal"; -const std::string CSettings::SETTING_VIDEOPLAYER_USESTAGEFRIGHT = "videoplayer.usestagefright"; -const std::string CSettings::SETTING_VIDEOPLAYER_LIMITGUIUPDATE = "videoplayer.limitguiupdate"; -const std::string CSettings::SETTING_MYVIDEOS_SELECTACTION = "myvideos.selectaction"; -const std::string CSettings::SETTING_MYVIDEOS_EXTRACTFLAGS = "myvideos.extractflags"; -const std::string CSettings::SETTING_MYVIDEOS_EXTRACTCHAPTERTHUMBS = "myvideos.extractchapterthumbs"; -const std::string CSettings::SETTING_MYVIDEOS_REPLACELABELS = "myvideos.replacelabels"; -const std::string CSettings::SETTING_MYVIDEOS_EXTRACTTHUMB = "myvideos.extractthumb"; -const std::string CSettings::SETTING_MYVIDEOS_STACKVIDEOS = "myvideos.stackvideos"; -const std::string CSettings::SETTING_LOCALE_SUBTITLELANGUAGE = "locale.subtitlelanguage"; -const std::string CSettings::SETTING_SUBTITLES_PARSECAPTIONS = "subtitles.parsecaptions"; -const std::string CSettings::SETTING_SUBTITLES_ALIGN = "subtitles.align"; -const std::string CSettings::SETTING_SUBTITLES_STEREOSCOPICDEPTH = "subtitles.stereoscopicdepth"; -const std::string CSettings::SETTING_SUBTITLES_FONT = "subtitles.font"; -const std::string CSettings::SETTING_SUBTITLES_HEIGHT = "subtitles.height"; -const std::string CSettings::SETTING_SUBTITLES_STYLE = "subtitles.style"; -const std::string CSettings::SETTING_SUBTITLES_COLOR = "subtitles.color"; -const std::string CSettings::SETTING_SUBTITLES_CHARSET = "subtitles.charset"; -const std::string CSettings::SETTING_SUBTITLES_OVERRIDEASSFONTS = "subtitles.overrideassfonts"; -const std::string CSettings::SETTING_SUBTITLES_LANGUAGES = "subtitles.languages"; -const std::string CSettings::SETTING_SUBTITLES_STORAGEMODE = "subtitles.storagemode"; -const std::string CSettings::SETTING_SUBTITLES_CUSTOMPATH = "subtitles.custompath"; -const std::string CSettings::SETTING_SUBTITLES_PAUSEONSEARCH = "subtitles.pauseonsearch"; -const std::string CSettings::SETTING_SUBTITLES_DOWNLOADFIRST = "subtitles.downloadfirst"; -const std::string CSettings::SETTING_SUBTITLES_TV = "subtitles.tv"; -const std::string CSettings::SETTING_SUBTITLES_MOVIE = "subtitles.movie"; -const std::string CSettings::SETTING_DVDS_AUTORUN = "dvds.autorun"; -const std::string CSettings::SETTING_DVDS_PLAYERREGION = "dvds.playerregion"; -const std::string CSettings::SETTING_DVDS_AUTOMENU = "dvds.automenu"; -const std::string CSettings::SETTING_DISC_PLAYBACK = "disc.playback"; -const std::string CSettings::SETTING_BLURAY_PLAYERREGION = "bluray.playerregion"; -const std::string CSettings::SETTING_ACCESSIBILITY_AUDIOVISUAL = "accessibility.audiovisual"; -const std::string CSettings::SETTING_ACCESSIBILITY_AUDIOHEARING = "accessibility.audiohearing"; -const std::string CSettings::SETTING_ACCESSIBILITY_SUBHEARING = "accessibility.subhearing"; -const std::string CSettings::SETTING_SCRAPERS_MOVIESDEFAULT = "scrapers.moviesdefault"; -const std::string CSettings::SETTING_SCRAPERS_TVSHOWSDEFAULT = "scrapers.tvshowsdefault"; -const std::string CSettings::SETTING_SCRAPERS_MUSICVIDEOSDEFAULT = "scrapers.musicvideosdefault"; -const std::string CSettings::SETTING_PVRMANAGER_ENABLED = "pvrmanager.enabled"; -const std::string CSettings::SETTING_PVRMANAGER_HIDECONNECTIONLOSTWARNING = "pvrmanager.hideconnectionlostwarning"; -const std::string CSettings::SETTING_PVRMANAGER_SYNCCHANNELGROUPS = "pvrmanager.syncchannelgroups"; -const std::string CSettings::SETTING_PVRMANAGER_BACKENDCHANNELORDER = "pvrmanager.backendchannelorder"; -const std::string CSettings::SETTING_PVRMANAGER_USEBACKENDCHANNELNUMBERS = "pvrmanager.usebackendchannelnumbers"; -const std::string CSettings::SETTING_PVRMANAGER_CHANNELMANAGER = "pvrmanager.channelmanager"; -const std::string CSettings::SETTING_PVRMANAGER_GROUPMANAGER = "pvrmanager.groupmanager"; -const std::string CSettings::SETTING_PVRMANAGER_CHANNELSCAN = "pvrmanager.channelscan"; -const std::string CSettings::SETTING_PVRMANAGER_RESETDB = "pvrmanager.resetdb"; -const std::string CSettings::SETTING_PVRMENU_DISPLAYCHANNELINFO = "pvrmenu.displaychannelinfo"; -const std::string CSettings::SETTING_PVRMENU_CLOSECHANNELOSDONSWITCH = "pvrmenu.closechannelosdonswitch"; -const std::string CSettings::SETTING_PVRMENU_ICONPATH = "pvrmenu.iconpath"; -const std::string CSettings::SETTING_PVRMENU_SEARCHICONS = "pvrmenu.searchicons"; -const std::string CSettings::SETTING_EPG_DAYSTODISPLAY = "epg.daystodisplay"; -const std::string CSettings::SETTING_EPG_SELECTACTION = "epg.selectaction"; -const std::string CSettings::SETTING_EPG_HIDENOINFOAVAILABLE = "epg.hidenoinfoavailable"; -const std::string CSettings::SETTING_EPG_EPGUPDATE = "epg.epgupdate"; -const std::string CSettings::SETTING_EPG_PREVENTUPDATESWHILEPLAYINGTV = "epg.preventupdateswhileplayingtv"; -const std::string CSettings::SETTING_EPG_IGNOREDBFORCLIENT = "epg.ignoredbforclient"; -const std::string CSettings::SETTING_EPG_RESETEPG = "epg.resetepg"; -const std::string CSettings::SETTING_PVRPLAYBACK_PLAYMINIMIZED = "pvrplayback.playminimized"; -const std::string CSettings::SETTING_PVRPLAYBACK_STARTLAST = "pvrplayback.startlast"; -const std::string CSettings::SETTING_PVRPLAYBACK_SIGNALQUALITY = "pvrplayback.signalquality"; -const std::string CSettings::SETTING_PVRPLAYBACK_SCANTIME = "pvrplayback.scantime"; -const std::string CSettings::SETTING_PVRPLAYBACK_CONFIRMCHANNELSWITCH = "pvrplayback.confirmchannelswitch"; -const std::string CSettings::SETTING_PVRPLAYBACK_CHANNELENTRYTIMEOUT = "pvrplayback.channelentrytimeout"; -const std::string CSettings::SETTING_PVRPLAYBACK_FPS = "pvrplayback.fps"; -const std::string CSettings::SETTING_PVRRECORD_INSTANTRECORDTIME = "pvrrecord.instantrecordtime"; -const std::string CSettings::SETTING_PVRRECORD_DEFAULTPRIORITY = "pvrrecord.defaultpriority"; -const std::string CSettings::SETTING_PVRRECORD_DEFAULTLIFETIME = "pvrrecord.defaultlifetime"; -const std::string CSettings::SETTING_PVRRECORD_MARGINSTART = "pvrrecord.marginstart"; -const std::string CSettings::SETTING_PVRRECORD_MARGINEND = "pvrrecord.marginend"; -const std::string CSettings::SETTING_PVRRECORD_PREVENTDUPLICATEEPISODES = "pvrrecord.preventduplicateepisodes"; -const std::string CSettings::SETTING_PVRRECORD_TIMERNOTIFICATIONS = "pvrrecord.timernotifications"; -const std::string CSettings::SETTING_PVRPOWERMANAGEMENT_ENABLED = "pvrpowermanagement.enabled"; -const std::string CSettings::SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME = "pvrpowermanagement.backendidletime"; -const std::string CSettings::SETTING_PVRPOWERMANAGEMENT_SETWAKEUPCMD = "pvrpowermanagement.setwakeupcmd"; -const std::string CSettings::SETTING_PVRPOWERMANAGEMENT_PREWAKEUP = "pvrpowermanagement.prewakeup"; -const std::string CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUP = "pvrpowermanagement.dailywakeup"; -const std::string CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME = "pvrpowermanagement.dailywakeuptime"; -const std::string CSettings::SETTING_PVRPARENTAL_ENABLED = "pvrparental.enabled"; -const std::string CSettings::SETTING_PVRPARENTAL_PIN = "pvrparental.pin"; -const std::string CSettings::SETTING_PVRPARENTAL_DURATION = "pvrparental.duration"; -const std::string CSettings::SETTING_PVRCLIENT_MENUHOOK = "pvrclient.menuhook"; -const std::string CSettings::SETTING_PVRTIMERS_TIMERTYPEFILTER = "pvrtimers.timertypefilter"; -const std::string CSettings::SETTING_MUSICLIBRARY_SHOWCOMPILATIONARTISTS = "musiclibrary.showcompilationartists"; -const std::string CSettings::SETTING_MUSICLIBRARY_DOWNLOADINFO = "musiclibrary.downloadinfo"; -const std::string CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER = "musiclibrary.albumsscraper"; -const std::string CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER = "musiclibrary.artistsscraper"; -const std::string CSettings::SETTING_MUSICLIBRARY_OVERRIDETAGS = "musiclibrary.overridetags"; -const std::string CSettings::SETTING_MUSICLIBRARY_SHOWALLITEMS = "musiclibrary.showallitems"; -const std::string CSettings::SETTING_MUSICLIBRARY_UPDATEONSTARTUP = "musiclibrary.updateonstartup"; -const std::string CSettings::SETTING_MUSICLIBRARY_BACKGROUNDUPDATE = "musiclibrary.backgroundupdate"; -const std::string CSettings::SETTING_MUSICLIBRARY_CLEANUP = "musiclibrary.cleanup"; -const std::string CSettings::SETTING_MUSICLIBRARY_EXPORT = "musiclibrary.export"; -const std::string CSettings::SETTING_MUSICLIBRARY_IMPORT = "musiclibrary.import"; -const std::string CSettings::SETTING_MUSICPLAYER_AUTOPLAYNEXTITEM = "musicplayer.autoplaynextitem"; -const std::string CSettings::SETTING_MUSICPLAYER_QUEUEBYDEFAULT = "musicplayer.queuebydefault"; -const std::string CSettings::SETTING_MUSICPLAYER_SEEKSTEPS = "musicplayer.seeksteps"; -const std::string CSettings::SETTING_MUSICPLAYER_SEEKDELAY = "musicplayer.seekdelay"; -const std::string CSettings::SETTING_MUSICPLAYER_REPLAYGAINTYPE = "musicplayer.replaygaintype"; -const std::string CSettings::SETTING_MUSICPLAYER_REPLAYGAINPREAMP = "musicplayer.replaygainpreamp"; -const std::string CSettings::SETTING_MUSICPLAYER_REPLAYGAINNOGAINPREAMP = "musicplayer.replaygainnogainpreamp"; -const std::string CSettings::SETTING_MUSICPLAYER_REPLAYGAINAVOIDCLIPPING = "musicplayer.replaygainavoidclipping"; -const std::string CSettings::SETTING_MUSICPLAYER_CROSSFADE = "musicplayer.crossfade"; -const std::string CSettings::SETTING_MUSICPLAYER_CROSSFADEALBUMTRACKS = "musicplayer.crossfadealbumtracks"; -const std::string CSettings::SETTING_MUSICPLAYER_VISUALISATION = "musicplayer.visualisation"; -const std::string CSettings::SETTING_MUSICFILES_USETAGS = "musicfiles.usetags"; -const std::string CSettings::SETTING_MUSICFILES_TRACKFORMAT = "musicfiles.trackformat"; -const std::string CSettings::SETTING_MUSICFILES_NOWPLAYINGTRACKFORMAT = "musicfiles.nowplayingtrackformat"; -const std::string CSettings::SETTING_MUSICFILES_LIBRARYTRACKFORMAT = "musicfiles.librarytrackformat"; -const std::string CSettings::SETTING_MUSICFILES_FINDREMOTETHUMBS = "musicfiles.findremotethumbs"; -const std::string CSettings::SETTING_AUDIOCDS_AUTOACTION = "audiocds.autoaction"; -const std::string CSettings::SETTING_AUDIOCDS_USECDDB = "audiocds.usecddb"; -const std::string CSettings::SETTING_AUDIOCDS_RECORDINGPATH = "audiocds.recordingpath"; -const std::string CSettings::SETTING_AUDIOCDS_TRACKPATHFORMAT = "audiocds.trackpathformat"; -const std::string CSettings::SETTING_AUDIOCDS_ENCODER = "audiocds.encoder"; -const std::string CSettings::SETTING_AUDIOCDS_SETTINGS = "audiocds.settings"; -const std::string CSettings::SETTING_AUDIOCDS_EJECTONRIP = "audiocds.ejectonrip"; -const std::string CSettings::SETTING_MYMUSIC_STARTWINDOW = "mymusic.startwindow"; -const std::string CSettings::SETTING_MYMUSIC_SONGTHUMBINVIS = "mymusic.songthumbinvis"; -const std::string CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW = "mymusic.defaultlibview"; -const std::string CSettings::SETTING_PICTURES_GENERATETHUMBS = "pictures.generatethumbs"; -const std::string CSettings::SETTING_PICTURES_SHOWVIDEOS = "pictures.showvideos"; -const std::string CSettings::SETTING_PICTURES_DISPLAYRESOLUTION = "pictures.displayresolution"; -const std::string CSettings::SETTING_SLIDESHOW_STAYTIME = "slideshow.staytime"; -const std::string CSettings::SETTING_SLIDESHOW_DISPLAYEFFECTS = "slideshow.displayeffects"; -const std::string CSettings::SETTING_SLIDESHOW_SHUFFLE = "slideshow.shuffle"; -const std::string CSettings::SETTING_WEATHER_CURRENTLOCATION = "weather.currentlocation"; -const std::string CSettings::SETTING_WEATHER_ADDON = "weather.addon"; -const std::string CSettings::SETTING_WEATHER_ADDONSETTINGS = "weather.addonsettings"; -const std::string CSettings::SETTING_SERVICES_DEVICENAME = "services.devicename"; -const std::string CSettings::SETTING_SERVICES_UPNPSERVER = "services.upnpserver"; -const std::string CSettings::SETTING_SERVICES_UPNPANNOUNCE = "services.upnpannounce"; -const std::string CSettings::SETTING_SERVICES_UPNPLOOKFOREXTERNALSUBTITLES = "services.upnplookforexternalsubtitles"; -const std::string CSettings::SETTING_SERVICES_UPNPCONTROLLER = "services.upnpcontroller"; -const std::string CSettings::SETTING_SERVICES_UPNPRENDERER = "services.upnprenderer"; -const std::string CSettings::SETTING_SERVICES_WEBSERVER = "services.webserver"; -const std::string CSettings::SETTING_SERVICES_WEBSERVERPORT = "services.webserverport"; -const std::string CSettings::SETTING_SERVICES_WEBSERVERUSERNAME = "services.webserverusername"; -const std::string CSettings::SETTING_SERVICES_WEBSERVERPASSWORD = "services.webserverpassword"; -const std::string CSettings::SETTING_SERVICES_WEBSKIN = "services.webskin"; -const std::string CSettings::SETTING_SERVICES_ESENABLED = "services.esenabled"; -const std::string CSettings::SETTING_SERVICES_ESPORT = "services.esport"; -const std::string CSettings::SETTING_SERVICES_ESPORTRANGE = "services.esportrange"; -const std::string CSettings::SETTING_SERVICES_ESMAXCLIENTS = "services.esmaxclients"; -const std::string CSettings::SETTING_SERVICES_ESALLINTERFACES = "services.esallinterfaces"; -const std::string CSettings::SETTING_SERVICES_ESINITIALDELAY = "services.esinitialdelay"; -const std::string CSettings::SETTING_SERVICES_ESCONTINUOUSDELAY = "services.escontinuousdelay"; -const std::string CSettings::SETTING_SERVICES_ZEROCONF = "services.zeroconf"; -const std::string CSettings::SETTING_SERVICES_AIRPLAY = "services.airplay"; -const std::string CSettings::SETTING_SERVICES_AIRPLAYVOLUMECONTROL = "services.airplayvolumecontrol"; -const std::string CSettings::SETTING_SERVICES_USEAIRPLAYPASSWORD = "services.useairplaypassword"; -const std::string CSettings::SETTING_SERVICES_AIRPLAYPASSWORD = "services.airplaypassword"; -const std::string CSettings::SETTING_SERVICES_AIRPLAYVIDEOSUPPORT = "services.airplayvideosupport"; -const std::string CSettings::SETTING_SMB_WINSSERVER = "smb.winsserver"; -const std::string CSettings::SETTING_SMB_WORKGROUP = "smb.workgroup"; -const std::string CSettings::SETTING_VIDEOSCREEN_MONITOR = "videoscreen.monitor"; -const std::string CSettings::SETTING_VIDEOSCREEN_SCREEN = "videoscreen.screen"; -const std::string CSettings::SETTING_VIDEOSCREEN_RESOLUTION = "videoscreen.resolution"; -const std::string CSettings::SETTING_VIDEOSCREEN_SCREENMODE = "videoscreen.screenmode"; -const std::string CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN = "videoscreen.fakefullscreen"; -const std::string CSettings::SETTING_VIDEOSCREEN_BLANKDISPLAYS = "videoscreen.blankdisplays"; -const std::string CSettings::SETTING_VIDEOSCREEN_STEREOSCOPICMODE = "videoscreen.stereoscopicmode"; -const std::string CSettings::SETTING_VIDEOSCREEN_PREFEREDSTEREOSCOPICMODE = "videoscreen.preferedstereoscopicmode"; -const std::string CSettings::SETTING_VIDEOSCREEN_VSYNC = "videoscreen.vsync"; -const std::string CSettings::SETTING_VIDEOSCREEN_GUICALIBRATION = "videoscreen.guicalibration"; -const std::string CSettings::SETTING_VIDEOSCREEN_TESTPATTERN = "videoscreen.testpattern"; -const std::string CSettings::SETTING_VIDEOSCREEN_LIMITEDRANGE = "videoscreen.limitedrange"; -const std::string CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE = "audiooutput.audiodevice"; -const std::string CSettings::SETTING_AUDIOOUTPUT_CHANNELS = "audiooutput.channels"; -const std::string CSettings::SETTING_AUDIOOUTPUT_CONFIG = "audiooutput.config"; -const std::string CSettings::SETTING_AUDIOOUTPUT_SAMPLERATE = "audiooutput.samplerate"; -const std::string CSettings::SETTING_AUDIOOUTPUT_STEREOUPMIX = "audiooutput.stereoupmix"; -const std::string CSettings::SETTING_AUDIOOUTPUT_MAINTAINORIGINALVOLUME = "audiooutput.maintainoriginalvolume"; -const std::string CSettings::SETTING_AUDIOOUTPUT_NORMALIZELEVELS = "audiooutput.normalizelevels"; -const std::string CSettings::SETTING_AUDIOOUTPUT_PROCESSQUALITY = "audiooutput.processquality"; -const std::string CSettings::SETTING_AUDIOOUTPUT_STREAMSILENCE = "audiooutput.streamsilence"; -const std::string CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED = "audiooutput.dspaddonsenabled"; -const std::string CSettings::SETTING_AUDIOOUTPUT_DSPSETTINGS = "audiooutput.dspsettings"; -const std::string CSettings::SETTING_AUDIOOUTPUT_DSPRESETDB = "audiooutput.dspresetdb"; -const std::string CSettings::SETTING_AUDIOOUTPUT_GUISOUNDMODE = "audiooutput.guisoundmode"; -const std::string CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH = "audiooutput.passthrough"; -const std::string CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE = "audiooutput.passthroughdevice"; -const std::string CSettings::SETTING_AUDIOOUTPUT_AC3PASSTHROUGH = "audiooutput.ac3passthrough"; -const std::string CSettings::SETTING_AUDIOOUTPUT_AC3TRANSCODE = "audiooutput.ac3transcode"; -const std::string CSettings::SETTING_AUDIOOUTPUT_EAC3PASSTHROUGH = "audiooutput.eac3passthrough"; -const std::string CSettings::SETTING_AUDIOOUTPUT_DTSPASSTHROUGH = "audiooutput.dtspassthrough"; -const std::string CSettings::SETTING_AUDIOOUTPUT_TRUEHDPASSTHROUGH = "audiooutput.truehdpassthrough"; -const std::string CSettings::SETTING_AUDIOOUTPUT_DTSHDPASSTHROUGH = "audiooutput.dtshdpassthrough"; -const std::string CSettings::SETTING_AUDIOOUTPUT_SUPPORTSDTSHDCPUDECODING = "audiooutput.supportdtshdcpudecoding"; -const std::string CSettings::SETTING_INPUT_PERIPHERALS = "input.peripherals"; -const std::string CSettings::SETTING_INPUT_ENABLEMOUSE = "input.enablemouse"; -const std::string CSettings::SETTING_INPUT_ENABLEJOYSTICK = "input.enablejoystick"; -const std::string CSettings::SETTING_INPUT_APPLEREMOTEMODE = "input.appleremotemode"; -const std::string CSettings::SETTING_INPUT_APPLEREMOTEALWAYSON = "input.appleremotealwayson"; -const std::string CSettings::SETTING_INPUT_APPLEREMOTESEQUENCETIME = "input.appleremotesequencetime"; -const std::string CSettings::SETTING_NETWORK_USEHTTPPROXY = "network.usehttpproxy"; -const std::string CSettings::SETTING_NETWORK_HTTPPROXYTYPE = "network.httpproxytype"; -const std::string CSettings::SETTING_NETWORK_HTTPPROXYSERVER = "network.httpproxyserver"; -const std::string CSettings::SETTING_NETWORK_HTTPPROXYPORT = "network.httpproxyport"; -const std::string CSettings::SETTING_NETWORK_HTTPPROXYUSERNAME = "network.httpproxyusername"; -const std::string CSettings::SETTING_NETWORK_HTTPPROXYPASSWORD = "network.httpproxypassword"; -const std::string CSettings::SETTING_NETWORK_BANDWIDTH = "network.bandwidth"; -const std::string CSettings::SETTING_POWERMANAGEMENT_DISPLAYSOFF = "powermanagement.displaysoff"; -const std::string CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNTIME = "powermanagement.shutdowntime"; -const std::string CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE = "powermanagement.shutdownstate"; -const std::string CSettings::SETTING_POWERMANAGEMENT_WAKEONACCESS = "powermanagement.wakeonaccess"; -const std::string CSettings::SETTING_DEBUG_SHOWLOGINFO = "debug.showloginfo"; -const std::string CSettings::SETTING_DEBUG_EXTRALOGGING = "debug.extralogging"; -const std::string CSettings::SETTING_DEBUG_SETEXTRALOGLEVEL = "debug.setextraloglevel"; -const std::string CSettings::SETTING_DEBUG_SCREENSHOTPATH = "debug.screenshotpath"; -const std::string CSettings::SETTING_EVENTLOG_ENABLED = "eventlog.enabled"; -const std::string CSettings::SETTING_EVENTLOG_ENABLED_NOTIFICATIONS = "eventlog.enablednotifications"; -const std::string CSettings::SETTING_EVENTLOG_SHOW = "eventlog.show"; -const std::string CSettings::SETTING_MASTERLOCK_LOCKCODE = "masterlock.lockcode"; -const std::string CSettings::SETTING_MASTERLOCK_STARTUPLOCK = "masterlock.startuplock"; -const std::string CSettings::SETTING_MASTERLOCK_MAXRETRIES = "masterlock.maxretries"; -const std::string CSettings::SETTING_CACHE_HARDDISK = "cache.harddisk"; -const std::string CSettings::SETTING_CACHEVIDEO_DVDROM = "cachevideo.dvdrom"; -const std::string CSettings::SETTING_CACHEVIDEO_LAN = "cachevideo.lan"; -const std::string CSettings::SETTING_CACHEVIDEO_INTERNET = "cachevideo.internet"; -const std::string CSettings::SETTING_CACHEAUDIO_DVDROM = "cacheaudio.dvdrom"; -const std::string CSettings::SETTING_CACHEAUDIO_LAN = "cacheaudio.lan"; -const std::string CSettings::SETTING_CACHEAUDIO_INTERNET = "cacheaudio.internet"; -const std::string CSettings::SETTING_CACHEDVD_DVDROM = "cachedvd.dvdrom"; -const std::string CSettings::SETTING_CACHEDVD_LAN = "cachedvd.lan"; -const std::string CSettings::SETTING_CACHEUNKNOWN_INTERNET = "cacheunknown.internet"; -const std::string CSettings::SETTING_SYSTEM_PLAYLISTSPATH = "system.playlistspath"; -const std::string CSettings::SETTING_GENERAL_ADDONUPDATES = "general.addonupdates"; -const std::string CSettings::SETTING_GENERAL_ADDONNOTIFICATIONS = "general.addonnotifications"; -const std::string CSettings::SETTING_GENERAL_ADDONFOREIGNFILTER = "general.addonforeignfilter"; -const std::string CSettings::SETTING_GENERAL_ADDONBROKENFILTER = "general.addonbrokenfilter"; - CSettings::CSettings() : m_initialized(false) { @@ -422,7 +99,7 @@ delete m_settingsManager; } -CSettings& CSettings::GetInstance() +CSettings& CSettings::Get() { static CSettings sSettings; return sSettings; @@ -461,7 +138,7 @@ bool CSettings::Load() { - return Load(CProfilesManager::GetInstance().GetSettingsFile()); + return Load(CProfilesManager::Get().GetSettingsFile()); } bool CSettings::Load(const std::string &file) @@ -515,7 +192,7 @@ bool CSettings::Save() { - return Save(CProfilesManager::GetInstance().GetSettingsFile()); + return Save(CProfilesManager::Get().GetSettingsFile()); } bool CSettings::Save(const std::string &file) @@ -574,12 +251,11 @@ m_settingsManager->UnregisterSettingOptionsFiller("videoseeksteps"); m_settingsManager->UnregisterSettingOptionsFiller("shutdownstates"); m_settingsManager->UnregisterSettingOptionsFiller("startupwindows"); - m_settingsManager->UnregisterSettingOptionsFiller("audiostreamlanguages"); - m_settingsManager->UnregisterSettingOptionsFiller("subtitlestreamlanguages"); - m_settingsManager->UnregisterSettingOptionsFiller("subtitledownloadlanguages"); + m_settingsManager->UnregisterSettingOptionsFiller("streamlanguages"); m_settingsManager->UnregisterSettingOptionsFiller("iso6391languages"); m_settingsManager->UnregisterSettingOptionsFiller("skincolors"); m_settingsManager->UnregisterSettingOptionsFiller("skinfonts"); + m_settingsManager->UnregisterSettingOptionsFiller("skinsounds"); m_settingsManager->UnregisterSettingOptionsFiller("skinthemes"); #if defined(TARGET_LINUX) m_settingsManager->UnregisterSettingOptionsFiller("timezonecountries"); @@ -587,58 +263,53 @@ #endif // defined(TARGET_LINUX) m_settingsManager->UnregisterSettingOptionsFiller("verticalsyncs"); m_settingsManager->UnregisterSettingOptionsFiller("keyboardlayouts"); - m_settingsManager->UnregisterSettingOptionsFiller("pvrrecordmargins"); // unregister ISettingCallback implementations - m_settingsManager->UnregisterCallback(&CEventLog::GetInstance()); m_settingsManager->UnregisterCallback(&g_advancedSettings); - m_settingsManager->UnregisterCallback(&CMediaSettings::GetInstance()); - m_settingsManager->UnregisterCallback(&CDisplaySettings::GetInstance()); - m_settingsManager->UnregisterCallback(&CSeekHandler::GetInstance()); - m_settingsManager->UnregisterCallback(&CStereoscopicsManager::GetInstance()); + m_settingsManager->UnregisterCallback(&CMediaSettings::Get()); + m_settingsManager->UnregisterCallback(&CDisplaySettings::Get()); + m_settingsManager->UnregisterCallback(&CSeekHandler::Get()); + m_settingsManager->UnregisterCallback(&CStereoscopicsManager::Get()); m_settingsManager->UnregisterCallback(&g_application); m_settingsManager->UnregisterCallback(&g_audioManager); m_settingsManager->UnregisterCallback(&g_charsetConverter); m_settingsManager->UnregisterCallback(&g_graphicsContext); m_settingsManager->UnregisterCallback(&g_langInfo); - m_settingsManager->UnregisterCallback(&CInputManager::GetInstance()); - m_settingsManager->UnregisterCallback(&CNetworkServices::GetInstance()); + m_settingsManager->UnregisterCallback(&CInputManager::Get()); + m_settingsManager->UnregisterCallback(&CNetworkServices::Get()); m_settingsManager->UnregisterCallback(&g_passwordManager); m_settingsManager->UnregisterCallback(&PVR::g_PVRManager); - m_settingsManager->UnregisterCallback(&CRssManager::GetInstance()); - m_settingsManager->UnregisterCallback(&ADDON::CRepositoryUpdater::GetInstance()); + m_settingsManager->UnregisterCallback(&CRssManager::Get()); #if defined(TARGET_LINUX) m_settingsManager->UnregisterCallback(&g_timezone); #endif // defined(TARGET_LINUX) m_settingsManager->UnregisterCallback(&g_weatherManager); - m_settingsManager->UnregisterCallback(&PERIPHERALS::CPeripherals::GetInstance()); + m_settingsManager->UnregisterCallback(&PERIPHERALS::CPeripherals::Get()); #if defined(TARGET_DARWIN_OSX) m_settingsManager->UnregisterCallback(&XBMCHelper::GetInstance()); #endif - m_settingsManager->UnregisterCallback(&ActiveAE::CActiveAEDSP::GetInstance()); - m_settingsManager->UnregisterCallback(&CWakeOnAccess::GetInstance()); // cleanup the settings manager m_settingsManager->Clear(); // unregister ISubSettings implementations m_settingsManager->UnregisterSubSettings(&g_application); - m_settingsManager->UnregisterSubSettings(&CDisplaySettings::GetInstance()); - m_settingsManager->UnregisterSubSettings(&CMediaSettings::GetInstance()); - m_settingsManager->UnregisterSubSettings(&CSkinSettings::GetInstance()); + m_settingsManager->UnregisterSubSettings(&CDisplaySettings::Get()); + m_settingsManager->UnregisterSubSettings(&CMediaSettings::Get()); + m_settingsManager->UnregisterSubSettings(&CSkinSettings::Get()); m_settingsManager->UnregisterSubSettings(&g_sysinfo); - m_settingsManager->UnregisterSubSettings(&CViewStateSettings::GetInstance()); + m_settingsManager->UnregisterSubSettings(&CViewStateSettings::Get()); // unregister ISettingsHandler implementations m_settingsManager->UnregisterSettingsHandler(&g_advancedSettings); - m_settingsManager->UnregisterSettingsHandler(&CMediaSourceSettings::GetInstance()); - m_settingsManager->UnregisterSettingsHandler(&CPlayerCoreFactory::GetInstance()); - m_settingsManager->UnregisterSettingsHandler(&CProfilesManager::GetInstance()); + m_settingsManager->UnregisterSettingsHandler(&CMediaSourceSettings::Get()); + m_settingsManager->UnregisterSettingsHandler(&CPlayerCoreFactory::Get()); + m_settingsManager->UnregisterSettingsHandler(&CProfilesManager::Get()); #ifdef HAS_UPNP - m_settingsManager->UnregisterSettingsHandler(&CUPnPSettings::GetInstance()); + m_settingsManager->UnregisterSettingsHandler(&CUPnPSettings::Get()); #endif - m_settingsManager->UnregisterSettingsHandler(&CWakeOnAccess::GetInstance()); - m_settingsManager->UnregisterSettingsHandler(&CRssManager::GetInstance()); + m_settingsManager->UnregisterSettingsHandler(&CWakeOnAccess::Get()); + m_settingsManager->UnregisterSettingsHandler(&CRssManager::Get()); m_settingsManager->UnregisterSettingsHandler(&g_langInfo); m_settingsManager->UnregisterSettingsHandler(&g_application); #if defined(TARGET_LINUX) && !defined(TARGET_ANDROID) && !defined(__UCLIBC__) @@ -686,7 +357,7 @@ { // Backward compatibility (skins use this setting) if (StringUtils::EqualsNoCase(id, "lookandfeel.enablemouse")) - return GetBool(CSettings::SETTING_INPUT_ENABLEMOUSE); + return GetBool("input.enablemouse"); return m_settingsManager->GetBool(id); } @@ -816,6 +487,10 @@ #elif defined(TARGET_DARWIN_IOS) if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_ios.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_ios.xml")) CLog::Log(LOGFATAL, "Unable to load ios-specific settings definitions"); +#if defined(TARGET_DARWIN_IOS_ATV2) + if (CFile::Exists(SETTINGS_XML_FOLDER "darwin_ios_atv2.xml") && !Initialize(SETTINGS_XML_FOLDER "darwin_ios_atv2.xml")) + CLog::Log(LOGFATAL, "Unable to load atv2-specific settings definitions"); +#endif #endif #endif @@ -853,10 +528,10 @@ { // hide some settings if necessary #if defined(TARGET_DARWIN) - CSettingString* timezonecountry = (CSettingString*)m_settingsManager->GetSetting(CSettings::SETTING_LOCALE_TIMEZONECOUNTRY); - CSettingString* timezone = (CSettingString*)m_settingsManager->GetSetting(CSettings::SETTING_LOCALE_TIMEZONE); + CSettingString* timezonecountry = (CSettingString*)m_settingsManager->GetSetting("locale.timezonecountry"); + CSettingString* timezone = (CSettingString*)m_settingsManager->GetSetting("locale.timezone"); - if (CDarwinUtils::GetIOSVersion() >= 4.3) + if (!g_sysinfo.IsAppleTV2() || CDarwinUtils::GetIOSVersion() >= 4.3) { timezonecountry->SetRequirementsMet(false); timezone->SetRequirementsMet(false); @@ -867,13 +542,13 @@ void CSettings::InitializeDefaults() { // set some default values if necessary -#if defined(HAS_TOUCH_SKIN) && defined(TARGET_DARWIN_IOS) - ((CSettingAddon*)m_settingsManager->GetSetting(CSettings::SETTING_LOOKANDFEEL_SKIN))->SetDefault("skin.re-touched"); +#if defined(HAS_TOUCH_SKIN) && defined(TARGET_DARWIN_IOS) && !defined(TARGET_DARWIN_IOS_ATV2) + ((CSettingAddon*)m_settingsManager->GetSetting("lookandfeel.skin"))->SetDefault("skin.re-touched"); #endif #if defined(TARGET_POSIX) - CSettingString* timezonecountry = (CSettingString*)m_settingsManager->GetSetting(CSettings::SETTING_LOCALE_TIMEZONECOUNTRY); - CSettingString* timezone = (CSettingString*)m_settingsManager->GetSetting(CSettings::SETTING_LOCALE_TIMEZONE); + CSettingString* timezonecountry = (CSettingString*)m_settingsManager->GetSetting("locale.timezonecountry"); + CSettingString* timezone = (CSettingString*)m_settingsManager->GetSetting("locale.timezone"); if (timezonecountry->IsVisible()) timezonecountry->SetDefault(g_timezone.GetCountryByTimezone(g_timezone.GetOSConfiguredTimezone())); @@ -883,7 +558,7 @@ #if defined(TARGET_WINDOWS) #if defined(HAS_DX) - ((CSettingString*)m_settingsManager->GetSetting(CSettings::SETTING_MUSICPLAYER_VISUALISATION))->SetDefault("visualization.milkdrop"); + ((CSettingString*)m_settingsManager->GetSetting("musicplayer.visualisation"))->SetDefault("visualization.milkdrop"); #endif #if !defined(HAS_GL) @@ -892,17 +567,22 @@ // when we do this (eg non-Aero on ATI in particular) and on others (AppleTV) we can't get XBMC to // the front if (g_sysinfo.IsAeroDisabled()) - ((CSettingBool*)m_settingsManager->GetSetting(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN))->SetDefault(false); + ((CSettingBool*)m_settingsManager->GetSetting("videoscreen.fakefullscreen"))->SetDefault(false); #endif #endif #if !defined(TARGET_WINDOWS) - ((CSettingString*)m_settingsManager->GetSetting(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE))->SetDefault(CAEFactory::GetDefaultDevice(false)); - ((CSettingString*)m_settingsManager->GetSetting(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE))->SetDefault(CAEFactory::GetDefaultDevice(true)); + ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(CAEFactory::GetDefaultDevice(false)); + ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(CAEFactory::GetDefaultDevice(true)); #endif if (g_application.IsStandAlone()) - ((CSettingInt*)m_settingsManager->GetSetting(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE))->SetDefault(POWERSTATE_SHUTDOWN); + ((CSettingInt*)m_settingsManager->GetSetting("powermanagement.shutdownstate"))->SetDefault(POWERSTATE_SHUTDOWN); + +#if defined(HAS_WEB_SERVER) + if (CUtil::CanBindPrivileged()) + ((CSettingInt*)m_settingsManager->GetSetting("services.webserverport"))->SetDefault(80); +#endif } void CSettings::InitializeOptionFillers() @@ -936,12 +616,11 @@ m_settingsManager->RegisterSettingOptionsFiller("videoseeksteps", CSeekHandler::SettingOptionsSeekStepsFiller); m_settingsManager->RegisterSettingOptionsFiller("shutdownstates", CPowerManager::SettingOptionsShutdownStatesFiller); m_settingsManager->RegisterSettingOptionsFiller("startupwindows", ADDON::CSkinInfo::SettingOptionsStartupWindowsFiller); - m_settingsManager->RegisterSettingOptionsFiller("audiostreamlanguages", CLangInfo::SettingOptionsAudioStreamLanguagesFiller); - m_settingsManager->RegisterSettingOptionsFiller("subtitlestreamlanguages", CLangInfo::SettingOptionsSubtitleStreamLanguagesFiller); - m_settingsManager->RegisterSettingOptionsFiller("subtitledownloadlanguages", CLangInfo::SettingOptionsSubtitleDownloadlanguagesFiller); + m_settingsManager->RegisterSettingOptionsFiller("streamlanguages", CLangInfo::SettingOptionsStreamLanguagesFiller); m_settingsManager->RegisterSettingOptionsFiller("iso6391languages", CLangInfo::SettingOptionsISO6391LanguagesFiller); m_settingsManager->RegisterSettingOptionsFiller("skincolors", ADDON::CSkinInfo::SettingOptionsSkinColorsFiller); m_settingsManager->RegisterSettingOptionsFiller("skinfonts", ADDON::CSkinInfo::SettingOptionsSkinFontsFiller); + m_settingsManager->RegisterSettingOptionsFiller("skinsounds", ADDON::CSkinInfo::SettingOptionsSkinSoundFiller); m_settingsManager->RegisterSettingOptionsFiller("skinthemes", ADDON::CSkinInfo::SettingOptionsSkinThemesFiller); #ifdef TARGET_LINUX m_settingsManager->RegisterSettingOptionsFiller("timezonecountries", CLinuxTimezone::SettingOptionsTimezoneCountriesFiller); @@ -950,7 +629,6 @@ m_settingsManager->RegisterSettingOptionsFiller("verticalsyncs", CDisplaySettings::SettingOptionsVerticalSyncsFiller); m_settingsManager->RegisterSettingOptionsFiller("keyboardlayouts", CKeyboardLayoutManager::SettingOptionsKeyboardLayoutsFiller); m_settingsManager->RegisterSettingOptionsFiller("loggingcomponents", CAdvancedSettings::SettingOptionsLoggingComponentsFiller); - m_settingsManager->RegisterSettingOptionsFiller("pvrrecordmargins", PVR::CPVRSettings::MarginTimeFiller); } void CSettings::InitializeConditions() @@ -973,237 +651,219 @@ // register ISettingsHandler implementations // The order of these matters! Handlers are processed in the order they were registered. m_settingsManager->RegisterSettingsHandler(&g_advancedSettings); - m_settingsManager->RegisterSettingsHandler(&CMediaSourceSettings::GetInstance()); - m_settingsManager->RegisterSettingsHandler(&CPlayerCoreFactory::GetInstance()); - m_settingsManager->RegisterSettingsHandler(&CProfilesManager::GetInstance()); + m_settingsManager->RegisterSettingsHandler(&CMediaSourceSettings::Get()); + m_settingsManager->RegisterSettingsHandler(&CPlayerCoreFactory::Get()); + m_settingsManager->RegisterSettingsHandler(&CProfilesManager::Get()); #ifdef HAS_UPNP - m_settingsManager->RegisterSettingsHandler(&CUPnPSettings::GetInstance()); + m_settingsManager->RegisterSettingsHandler(&CUPnPSettings::Get()); #endif - m_settingsManager->RegisterSettingsHandler(&CWakeOnAccess::GetInstance()); - m_settingsManager->RegisterSettingsHandler(&CRssManager::GetInstance()); + m_settingsManager->RegisterSettingsHandler(&CWakeOnAccess::Get()); + m_settingsManager->RegisterSettingsHandler(&CRssManager::Get()); m_settingsManager->RegisterSettingsHandler(&g_langInfo); m_settingsManager->RegisterSettingsHandler(&g_application); #if defined(TARGET_LINUX) && !defined(TARGET_ANDROID) && !defined(__UCLIBC__) m_settingsManager->RegisterSettingsHandler(&g_timezone); #endif - m_settingsManager->RegisterSettingsHandler(&CMediaSettings::GetInstance()); + m_settingsManager->RegisterSettingsHandler(&CMediaSettings::Get()); } void CSettings::InitializeISubSettings() { // register ISubSettings implementations m_settingsManager->RegisterSubSettings(&g_application); - m_settingsManager->RegisterSubSettings(&CDisplaySettings::GetInstance()); - m_settingsManager->RegisterSubSettings(&CMediaSettings::GetInstance()); - m_settingsManager->RegisterSubSettings(&CSkinSettings::GetInstance()); + m_settingsManager->RegisterSubSettings(&CDisplaySettings::Get()); + m_settingsManager->RegisterSubSettings(&CMediaSettings::Get()); + m_settingsManager->RegisterSubSettings(&CSkinSettings::Get()); m_settingsManager->RegisterSubSettings(&g_sysinfo); - m_settingsManager->RegisterSubSettings(&CViewStateSettings::GetInstance()); + m_settingsManager->RegisterSubSettings(&CViewStateSettings::Get()); } void CSettings::InitializeISettingCallbacks() { // register any ISettingCallback implementations std::set settingSet; - settingSet.insert(CSettings::SETTING_EVENTLOG_SHOW); - m_settingsManager->RegisterCallback(&CEventLog::GetInstance(), settingSet); - - settingSet.clear(); - settingSet.insert(CSettings::SETTING_DEBUG_SHOWLOGINFO); - settingSet.insert(CSettings::SETTING_DEBUG_EXTRALOGGING); - settingSet.insert(CSettings::SETTING_DEBUG_SETEXTRALOGLEVEL); + settingSet.insert("debug.showloginfo"); + settingSet.insert("debug.extralogging"); + settingSet.insert("debug.setextraloglevel"); m_settingsManager->RegisterCallback(&g_advancedSettings, settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_MUSICLIBRARY_CLEANUP); - settingSet.insert(CSettings::SETTING_MUSICLIBRARY_EXPORT); - settingSet.insert(CSettings::SETTING_MUSICLIBRARY_IMPORT); - settingSet.insert(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_FLATTENTVSHOWS); - settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_REMOVE_DUPLICATES); - settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_GROUPMOVIESETS); - settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_CLEANUP); - settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_IMPORT); - settingSet.insert(CSettings::SETTING_VIDEOLIBRARY_EXPORT); - m_settingsManager->RegisterCallback(&CMediaSettings::GetInstance(), settingSet); - - settingSet.clear(); - settingSet.insert(CSettings::SETTING_VIDEOSCREEN_SCREEN); - settingSet.insert(CSettings::SETTING_VIDEOSCREEN_RESOLUTION); - settingSet.insert(CSettings::SETTING_VIDEOSCREEN_SCREENMODE); - settingSet.insert(CSettings::SETTING_VIDEOSCREEN_VSYNC); - settingSet.insert(CSettings::SETTING_VIDEOSCREEN_MONITOR); - settingSet.insert(CSettings::SETTING_VIDEOSCREEN_PREFEREDSTEREOSCOPICMODE); - m_settingsManager->RegisterCallback(&CDisplaySettings::GetInstance(), settingSet); + settingSet.insert("karaoke.export"); + settingSet.insert("karaoke.importcsv"); + settingSet.insert("musiclibrary.cleanup"); + settingSet.insert("musiclibrary.export"); + settingSet.insert("musiclibrary.import"); + settingSet.insert("musicfiles.trackformat"); + settingSet.insert("musicfiles.trackformatright"); + settingSet.insert("videolibrary.flattentvshows"); + settingSet.insert("videolibrary.removeduplicates"); + settingSet.insert("videolibrary.groupmoviesets"); + settingSet.insert("videolibrary.cleanup"); + settingSet.insert("videolibrary.import"); + settingSet.insert("videolibrary.export"); + m_settingsManager->RegisterCallback(&CMediaSettings::Get(), settingSet); + + settingSet.clear(); + settingSet.insert("videoscreen.screen"); + settingSet.insert("videoscreen.resolution"); + settingSet.insert("videoscreen.screenmode"); + settingSet.insert("videoscreen.vsync"); + settingSet.insert("videoscreen.monitor"); + settingSet.insert("videoscreen.preferedstereoscopicmode"); + m_settingsManager->RegisterCallback(&CDisplaySettings::Get(), settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_VIDEOPLAYER_SEEKDELAY); - settingSet.insert(CSettings::SETTING_VIDEOPLAYER_SEEKSTEPS); - settingSet.insert(CSettings::SETTING_MUSICPLAYER_SEEKDELAY); - settingSet.insert(CSettings::SETTING_MUSICPLAYER_SEEKSTEPS); - m_settingsManager->RegisterCallback(&CSeekHandler::GetInstance(), settingSet); - - settingSet.clear(); - settingSet.insert(CSettings::SETTING_VIDEOSCREEN_STEREOSCOPICMODE); - m_settingsManager->RegisterCallback(&CStereoscopicsManager::GetInstance(), settingSet); - - settingSet.clear(); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_CONFIG); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_SAMPLERATE); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_CHANNELS); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_PROCESSQUALITY); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_GUISOUNDMODE); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_STEREOUPMIX); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_AC3PASSTHROUGH); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_AC3TRANSCODE); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_EAC3PASSTHROUGH); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_DTSPASSTHROUGH); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_TRUEHDPASSTHROUGH); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_DTSHDPASSTHROUGH); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_STREAMSILENCE); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_MAINTAINORIGINALVOLUME); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_NORMALIZELEVELS); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED); - settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SKIN); - settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SKINSETTINGS); - settingSet.insert(CSettings::SETTING_LOOKANDFEEL_FONT); - settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SKINTHEME); - settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS); - settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SKINZOOM); - settingSet.insert(CSettings::SETTING_MUSICPLAYER_REPLAYGAINPREAMP); - settingSet.insert(CSettings::SETTING_MUSICPLAYER_REPLAYGAINNOGAINPREAMP); - settingSet.insert(CSettings::SETTING_MUSICPLAYER_REPLAYGAINTYPE); - settingSet.insert(CSettings::SETTING_MUSICPLAYER_REPLAYGAINAVOIDCLIPPING); - settingSet.insert(CSettings::SETTING_SCRAPERS_MUSICVIDEOSDEFAULT); - settingSet.insert(CSettings::SETTING_SCREENSAVER_MODE); - settingSet.insert(CSettings::SETTING_SCREENSAVER_PREVIEW); - settingSet.insert(CSettings::SETTING_SCREENSAVER_SETTINGS); - settingSet.insert(CSettings::SETTING_AUDIOCDS_SETTINGS); - settingSet.insert(CSettings::SETTING_VIDEOSCREEN_GUICALIBRATION); - settingSet.insert(CSettings::SETTING_VIDEOSCREEN_TESTPATTERN); - settingSet.insert(CSettings::SETTING_VIDEOPLAYER_USEAMCODEC); - settingSet.insert(CSettings::SETTING_VIDEOPLAYER_USEMEDIACODEC); - settingSet.insert(CSettings::SETTING_VIDEOPLAYER_USEMEDIACODECSURFACE); + settingSet.insert("videoplayer.seekdelay"); + settingSet.insert("videoplayer.seeksteps"); + settingSet.insert("musicplayer.seekdelay"); + settingSet.insert("musicplayer.seeksteps"); + m_settingsManager->RegisterCallback(&CSeekHandler::Get(), settingSet); + + settingSet.clear(); + settingSet.insert("videoscreen.stereoscopicmode"); + m_settingsManager->RegisterCallback(&CStereoscopicsManager::Get(), settingSet); + + settingSet.clear(); + settingSet.insert("audiooutput.config"); + settingSet.insert("audiooutput.samplerate"); + settingSet.insert("audiooutput.passthrough"); + settingSet.insert("audiooutput.channels"); + settingSet.insert("audiooutput.processquality"); + settingSet.insert("audiooutput.guisoundmode"); + settingSet.insert("audiooutput.stereoupmix"); + settingSet.insert("audiooutput.ac3passthrough"); + settingSet.insert("audiooutput.ac3transcode"); + settingSet.insert("audiooutput.eac3passthrough"); + settingSet.insert("audiooutput.dtspassthrough"); + settingSet.insert("audiooutput.truehdpassthrough"); + settingSet.insert("audiooutput.dtshdpassthrough"); + settingSet.insert("audiooutput.audiodevice"); + settingSet.insert("audiooutput.passthroughdevice"); + settingSet.insert("audiooutput.streamsilence"); + settingSet.insert("audiooutput.maintainoriginalvolume"); + settingSet.insert("lookandfeel.skin"); + settingSet.insert("lookandfeel.skinsettings"); + settingSet.insert("lookandfeel.font"); + settingSet.insert("lookandfeel.skintheme"); + settingSet.insert("lookandfeel.skincolors"); + settingSet.insert("lookandfeel.skinzoom"); + settingSet.insert("musicplayer.replaygainpreamp"); + settingSet.insert("musicplayer.replaygainnogainpreamp"); + settingSet.insert("musicplayer.replaygaintype"); + settingSet.insert("musicplayer.replaygainavoidclipping"); + settingSet.insert("scrapers.musicvideosdefault"); + settingSet.insert("screensaver.mode"); + settingSet.insert("screensaver.preview"); + settingSet.insert("screensaver.settings"); + settingSet.insert("audiocds.settings"); + settingSet.insert("videoscreen.guicalibration"); + settingSet.insert("videoscreen.testpattern"); + settingSet.insert("videoplayer.useamcodec"); + settingSet.insert("videoplayer.usemediacodec"); m_settingsManager->RegisterCallback(&g_application, settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_LOOKANDFEEL_SOUNDSKIN); + settingSet.insert("lookandfeel.soundskin"); m_settingsManager->RegisterCallback(&g_audioManager, settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_SUBTITLES_CHARSET); - settingSet.insert(CSettings::SETTING_LOCALE_CHARSET); + settingSet.insert("subtitles.charset"); + settingSet.insert("karaoke.charset"); + settingSet.insert("locale.charset"); m_settingsManager->RegisterCallback(&g_charsetConverter, settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN); + settingSet.insert("videoscreen.fakefullscreen"); m_settingsManager->RegisterCallback(&g_graphicsContext, settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_LOCALE_AUDIOLANGUAGE); - settingSet.insert(CSettings::SETTING_LOCALE_SUBTITLELANGUAGE); - settingSet.insert(CSettings::SETTING_LOCALE_LANGUAGE); - settingSet.insert(CSettings::SETTING_LOCALE_COUNTRY); - settingSet.insert(CSettings::SETTING_LOCALE_SHORTDATEFORMAT); - settingSet.insert(CSettings::SETTING_LOCALE_LONGDATEFORMAT); - settingSet.insert(CSettings::SETTING_LOCALE_TIMEFORMAT); - settingSet.insert(CSettings::SETTING_LOCALE_USE24HOURCLOCK); - settingSet.insert(CSettings::SETTING_LOCALE_TEMPERATUREUNIT); - settingSet.insert(CSettings::SETTING_LOCALE_SPEEDUNIT); + settingSet.insert("locale.audiolanguage"); + settingSet.insert("locale.subtitlelanguage"); + settingSet.insert("locale.language"); + settingSet.insert("locale.country"); + settingSet.insert("locale.shortdateformat"); + settingSet.insert("locale.longdateformat"); + settingSet.insert("locale.timeformat"); + settingSet.insert("locale.use24hourclock"); + settingSet.insert("locale.temperatureunit"); + settingSet.insert("locale.speedunit"); m_settingsManager->RegisterCallback(&g_langInfo, settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_INPUT_ENABLEJOYSTICK); - settingSet.insert(CSettings::SETTING_INPUT_ENABLEMOUSE); - m_settingsManager->RegisterCallback(&CInputManager::GetInstance(), settingSet); + settingSet.insert("input.enablejoystick"); + settingSet.insert("input.enablemouse"); + m_settingsManager->RegisterCallback(&CInputManager::Get(), settingSet); + + settingSet.clear(); + settingSet.insert("services.webserver"); + settingSet.insert("services.webserverport"); + settingSet.insert("services.webserverusername"); + settingSet.insert("services.webserverpassword"); + settingSet.insert("services.zeroconf"); + settingSet.insert("services.airplay"); + settingSet.insert("services.airplayvolumecontrol"); + settingSet.insert("services.useairplaypassword"); + settingSet.insert("services.airplaypassword"); + settingSet.insert("services.upnpserver"); + settingSet.insert("services.upnprenderer"); + settingSet.insert("services.upnpcontroller"); + settingSet.insert("services.esenabled"); + settingSet.insert("services.esport"); + settingSet.insert("services.esallinterfaces"); + settingSet.insert("services.esinitialdelay"); + settingSet.insert("services.escontinuousdelay"); + settingSet.insert("smb.winsserver"); + settingSet.insert("smb.workgroup"); + m_settingsManager->RegisterCallback(&CNetworkServices::Get(), settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_SERVICES_WEBSERVER); - settingSet.insert(CSettings::SETTING_SERVICES_WEBSERVERPORT); - settingSet.insert(CSettings::SETTING_SERVICES_WEBSERVERUSERNAME); - settingSet.insert(CSettings::SETTING_SERVICES_WEBSERVERPASSWORD); - settingSet.insert(CSettings::SETTING_SERVICES_ZEROCONF); - settingSet.insert(CSettings::SETTING_SERVICES_AIRPLAY); - settingSet.insert(CSettings::SETTING_SERVICES_AIRPLAYVOLUMECONTROL); - settingSet.insert(CSettings::SETTING_SERVICES_AIRPLAYVIDEOSUPPORT); - settingSet.insert(CSettings::SETTING_SERVICES_USEAIRPLAYPASSWORD); - settingSet.insert(CSettings::SETTING_SERVICES_AIRPLAYPASSWORD); - settingSet.insert(CSettings::SETTING_SERVICES_UPNPSERVER); - settingSet.insert(CSettings::SETTING_SERVICES_UPNPRENDERER); - settingSet.insert(CSettings::SETTING_SERVICES_UPNPCONTROLLER); - settingSet.insert(CSettings::SETTING_SERVICES_ESENABLED); - settingSet.insert(CSettings::SETTING_SERVICES_ESPORT); - settingSet.insert(CSettings::SETTING_SERVICES_ESALLINTERFACES); - settingSet.insert(CSettings::SETTING_SERVICES_ESINITIALDELAY); - settingSet.insert(CSettings::SETTING_SERVICES_ESCONTINUOUSDELAY); - settingSet.insert(CSettings::SETTING_SMB_WINSSERVER); - settingSet.insert(CSettings::SETTING_SMB_WORKGROUP); - m_settingsManager->RegisterCallback(&CNetworkServices::GetInstance(), settingSet); - - settingSet.clear(); - settingSet.insert(CSettings::SETTING_MASTERLOCK_LOCKCODE); + settingSet.insert("masterlock.lockcode"); m_settingsManager->RegisterCallback(&g_passwordManager, settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_PVRMANAGER_ENABLED); - settingSet.insert(CSettings::SETTING_PVRMANAGER_CHANNELMANAGER); - settingSet.insert(CSettings::SETTING_PVRMANAGER_GROUPMANAGER); - settingSet.insert(CSettings::SETTING_PVRMANAGER_CHANNELSCAN); - settingSet.insert(CSettings::SETTING_PVRMANAGER_RESETDB); - settingSet.insert(CSettings::SETTING_PVRCLIENT_MENUHOOK); - settingSet.insert(CSettings::SETTING_PVRMENU_SEARCHICONS); - settingSet.insert(CSettings::SETTING_EPG_RESETEPG); - settingSet.insert(CSettings::SETTING_PVRPARENTAL_ENABLED); + settingSet.insert("pvrmanager.enabled"); + settingSet.insert("pvrmanager.channelmanager"); + settingSet.insert("pvrmanager.groupmanager"); + settingSet.insert("pvrmanager.channelscan"); + settingSet.insert("pvrmanager.resetdb"); + settingSet.insert("pvrclient.menuhook"); + settingSet.insert("pvrmenu.searchicons"); + settingSet.insert("epg.resetepg"); + settingSet.insert("pvrparental.enabled"); m_settingsManager->RegisterCallback(&PVR::g_PVRManager, settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_LOOKANDFEEL_RSSEDIT); - m_settingsManager->RegisterCallback(&CRssManager::GetInstance(), settingSet); + settingSet.insert("lookandfeel.rssedit"); + m_settingsManager->RegisterCallback(&CRssManager::Get(), settingSet); #if defined(TARGET_LINUX) settingSet.clear(); - settingSet.insert(CSettings::SETTING_LOCALE_TIMEZONE); - settingSet.insert(CSettings::SETTING_LOCALE_TIMEZONECOUNTRY); + settingSet.insert("locale.timezone"); + settingSet.insert("locale.timezonecountry"); m_settingsManager->RegisterCallback(&g_timezone, settingSet); #endif settingSet.clear(); - settingSet.insert(CSettings::SETTING_WEATHER_ADDON); - settingSet.insert(CSettings::SETTING_WEATHER_ADDONSETTINGS); + settingSet.insert("weather.addon"); + settingSet.insert("weather.addonsettings"); m_settingsManager->RegisterCallback(&g_weatherManager, settingSet); settingSet.clear(); - settingSet.insert(CSettings::SETTING_INPUT_PERIPHERALS); - settingSet.insert(CSettings::SETTING_LOCALE_LANGUAGE); - m_settingsManager->RegisterCallback(&PERIPHERALS::CPeripherals::GetInstance(), settingSet); + settingSet.insert("input.peripherals"); + settingSet.insert("locale.language"); + m_settingsManager->RegisterCallback(&PERIPHERALS::CPeripherals::Get(), settingSet); #if defined(TARGET_DARWIN_OSX) settingSet.clear(); - settingSet.insert(CSettings::SETTING_INPUT_APPLEREMOTEMODE); - settingSet.insert(CSettings::SETTING_INPUT_APPLEREMOTEALWAYSON); + settingSet.insert("input.appleremotemode"); + settingSet.insert("input.appleremotealwayson"); m_settingsManager->RegisterCallback(&XBMCHelper::GetInstance(), settingSet); #endif - - settingSet.clear(); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_DSPSETTINGS); - settingSet.insert(CSettings::SETTING_AUDIOOUTPUT_DSPRESETDB); - m_settingsManager->RegisterCallback(&ActiveAE::CActiveAEDSP::GetInstance(), settingSet); - - settingSet.clear(); - settingSet.insert(CSettings::SETTING_GENERAL_ADDONUPDATES); - m_settingsManager->RegisterCallback(&ADDON::CRepositoryUpdater::GetInstance(), settingSet); - - settingSet.clear(); - settingSet.insert(CSettings::SETTING_POWERMANAGEMENT_WAKEONACCESS); - m_settingsManager->RegisterCallback(&CWakeOnAccess::GetInstance(), settingSet); } bool CSettings::Reset() { - std::string settingsFile = CProfilesManager::GetInstance().GetSettingsFile(); + std::string settingsFile = CProfilesManager::Get().GetSettingsFile(); // try to delete the settings file if (XFILE::CFile::Exists(settingsFile, false) && !XFILE::CFile::Delete(settingsFile)) CLog::Log(LOGWARNING, "Unable to delete old settings file at %s", settingsFile.c_str()); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/Settings.h kodi-15.2~git20151019.1039-final/xbmc/settings/Settings.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/Settings.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/Settings.h 2015-10-19 08:39:16.000000000 +0000 @@ -29,6 +29,7 @@ #include "settings/SettingCreator.h" #include "settings/lib/ISettingCallback.h" #include "threads/CriticalSection.h" +#include "utils/Variant.h" class CSetting; class CSettingList; @@ -36,7 +37,6 @@ class CSettingsManager; class TiXmlElement; class TiXmlNode; -class CVariant; /*! \brief Wrapper around CSettingsManager responsible for properly setting up @@ -47,328 +47,10 @@ class CSettings : public CSettingCreator, public CSettingControlCreator { public: - static const std::string SETTING_LOOKANDFEEL_SKIN; - static const std::string SETTING_LOOKANDFEEL_SKINSETTINGS; - static const std::string SETTING_LOOKANDFEEL_SKINTHEME; - static const std::string SETTING_LOOKANDFEEL_SKINCOLORS; - static const std::string SETTING_LOOKANDFEEL_FONT; - static const std::string SETTING_LOOKANDFEEL_SKINZOOM; - static const std::string SETTING_LOOKANDFEEL_STARTUPWINDOW; - static const std::string SETTING_LOOKANDFEEL_SOUNDSKIN; - static const std::string SETTING_LOOKANDFEEL_ENABLERSSFEEDS; - static const std::string SETTING_LOOKANDFEEL_RSSEDIT; - static const std::string SETTING_LOOKANDFEEL_STEREOSTRENGTH; - static const std::string SETTING_LOCALE_LANGUAGE; - static const std::string SETTING_LOCALE_COUNTRY; - static const std::string SETTING_LOCALE_CHARSET; - static const std::string SETTING_LOCALE_KEYBOARDLAYOUTS; - static const std::string SETTING_LOCALE_TIMEZONECOUNTRY; - static const std::string SETTING_LOCALE_TIMEZONE; - static const std::string SETTING_LOCALE_SHORTDATEFORMAT; - static const std::string SETTING_LOCALE_LONGDATEFORMAT; - static const std::string SETTING_LOCALE_TIMEFORMAT; - static const std::string SETTING_LOCALE_USE24HOURCLOCK; - static const std::string SETTING_LOCALE_TEMPERATUREUNIT; - static const std::string SETTING_LOCALE_SPEEDUNIT; - static const std::string SETTING_FILELISTS_SHOWPARENTDIRITEMS; - static const std::string SETTING_FILELISTS_SHOWEXTENSIONS; - static const std::string SETTING_FILELISTS_IGNORETHEWHENSORTING; - static const std::string SETTING_FILELISTS_ALLOWFILEDELETION; - static const std::string SETTING_FILELISTS_SHOWADDSOURCEBUTTONS; - static const std::string SETTING_FILELISTS_SHOWHIDDEN; - static const std::string SETTING_SCREENSAVER_MODE; - static const std::string SETTING_SCREENSAVER_SETTINGS; - static const std::string SETTING_SCREENSAVER_PREVIEW; - static const std::string SETTING_SCREENSAVER_TIME; - static const std::string SETTING_SCREENSAVER_USEMUSICVISINSTEAD; - static const std::string SETTING_SCREENSAVER_USEDIMONPAUSE; - static const std::string SETTING_WINDOW_WIDTH; - static const std::string SETTING_WINDOW_HEIGHT; - static const std::string SETTING_VIDEOLIBRARY_SHOWUNWATCHEDPLOTS; - static const std::string SETTING_VIDEOLIBRARY_ACTORTHUMBS; - static const std::string SETTING_MYVIDEOS_FLATTEN; - static const std::string SETTING_VIDEOLIBRARY_FLATTENTVSHOWS; - static const std::string SETTING_VIDEOLIBRARY_REMOVE_DUPLICATES; - static const std::string SETTING_VIDEOLIBRARY_TVSHOWSSELECTFIRSTUNWATCHEDITEM; - static const std::string SETTING_VIDEOLIBRARY_TVSHOWSINCLUDEALLSEASONSANDSPECIALS; - static const std::string SETTING_VIDEOLIBRARY_SHOWALLITEMS; - static const std::string SETTING_VIDEOLIBRARY_GROUPMOVIESETS; - static const std::string SETTING_VIDEOLIBRARY_GROUPSINGLEITEMSETS; - static const std::string SETTING_VIDEOLIBRARY_UPDATEONSTARTUP; - static const std::string SETTING_VIDEOLIBRARY_BACKGROUNDUPDATE; - static const std::string SETTING_VIDEOLIBRARY_CLEANUP; - static const std::string SETTING_VIDEOLIBRARY_EXPORT; - static const std::string SETTING_VIDEOLIBRARY_IMPORT; - static const std::string SETTING_VIDEOLIBRARY_SHOWEMPTYTVSHOWS; - static const std::string SETTING_LOCALE_AUDIOLANGUAGE; - static const std::string SETTING_VIDEOPLAYER_PREFERDEFAULTFLAG; - static const std::string SETTING_VIDEOPLAYER_AUTOPLAYNEXTITEM; - static const std::string SETTING_VIDEOPLAYER_SEEKSTEPS; - static const std::string SETTING_VIDEOPLAYER_SEEKDELAY; - static const std::string SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE; - static const std::string SETTING_VIDEOPLAYER_PAUSEAFTERREFRESHCHANGE; - static const std::string SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK; - static const std::string SETTING_VIDEOPLAYER_ERRORINASPECT; - static const std::string SETTING_VIDEOPLAYER_STRETCH43; - static const std::string SETTING_VIDEOPLAYER_TELETEXTENABLED; - static const std::string SETTING_VIDEOPLAYER_TELETEXTSCALE; - static const std::string SETTING_VIDEOPLAYER_STEREOSCOPICPLAYBACKMODE; - static const std::string SETTING_VIDEOPLAYER_QUITSTEREOMODEONSTOP; - static const std::string SETTING_VIDEOPLAYER_RENDERMETHOD; - static const std::string SETTING_VIDEOPLAYER_HQSCALERS; - static const std::string SETTING_VIDEOPLAYER_USEAMCODEC; - static const std::string SETTING_VIDEOPLAYER_USEMEDIACODEC; - static const std::string SETTING_VIDEOPLAYER_USEMEDIACODECSURFACE; - static const std::string SETTING_VIDEOPLAYER_USEVDPAU; - static const std::string SETTING_VIDEOPLAYER_USEVDPAUMIXER; - static const std::string SETTING_VIDEOPLAYER_USEVDPAUMPEG2; - static const std::string SETTING_VIDEOPLAYER_USEVDPAUMPEG4; - static const std::string SETTING_VIDEOPLAYER_USEVDPAUVC1; - static const std::string SETTING_VIDEOPLAYER_USEVAAPI; - static const std::string SETTING_VIDEOPLAYER_USEVAAPIMPEG2; - static const std::string SETTING_VIDEOPLAYER_USEVAAPIMPEG4; - static const std::string SETTING_VIDEOPLAYER_USEVAAPIVC1; - static const std::string SETTING_VIDEOPLAYER_PREFERVAAPIRENDER; - static const std::string SETTING_VIDEOPLAYER_USEDXVA2; - static const std::string SETTING_VIDEOPLAYER_USEOMXPLAYER; - static const std::string SETTING_VIDEOPLAYER_USEOMX; - static const std::string SETTING_VIDEOPLAYER_USEVIDEOTOOLBOX; - static const std::string SETTING_VIDEOPLAYER_USEVDA; - static const std::string SETTING_VIDEOPLAYER_USEMMAL; - static const std::string SETTING_VIDEOPLAYER_USESTAGEFRIGHT; - static const std::string SETTING_VIDEOPLAYER_LIMITGUIUPDATE; - static const std::string SETTING_MYVIDEOS_SELECTACTION; - static const std::string SETTING_MYVIDEOS_EXTRACTFLAGS; - static const std::string SETTING_MYVIDEOS_EXTRACTCHAPTERTHUMBS; - static const std::string SETTING_MYVIDEOS_REPLACELABELS; - static const std::string SETTING_MYVIDEOS_EXTRACTTHUMB; - static const std::string SETTING_MYVIDEOS_STACKVIDEOS; - static const std::string SETTING_LOCALE_SUBTITLELANGUAGE; - static const std::string SETTING_SUBTITLES_PARSECAPTIONS; - static const std::string SETTING_SUBTITLES_ALIGN; - static const std::string SETTING_SUBTITLES_STEREOSCOPICDEPTH; - static const std::string SETTING_SUBTITLES_FONT; - static const std::string SETTING_SUBTITLES_HEIGHT; - static const std::string SETTING_SUBTITLES_STYLE; - static const std::string SETTING_SUBTITLES_COLOR; - static const std::string SETTING_SUBTITLES_CHARSET; - static const std::string SETTING_SUBTITLES_OVERRIDEASSFONTS; - static const std::string SETTING_SUBTITLES_LANGUAGES; - static const std::string SETTING_SUBTITLES_STORAGEMODE; - static const std::string SETTING_SUBTITLES_CUSTOMPATH; - static const std::string SETTING_SUBTITLES_PAUSEONSEARCH; - static const std::string SETTING_SUBTITLES_DOWNLOADFIRST; - static const std::string SETTING_SUBTITLES_TV; - static const std::string SETTING_SUBTITLES_MOVIE; - static const std::string SETTING_DVDS_AUTORUN; - static const std::string SETTING_DVDS_PLAYERREGION; - static const std::string SETTING_DVDS_AUTOMENU; - static const std::string SETTING_DISC_PLAYBACK; - static const std::string SETTING_BLURAY_PLAYERREGION; - static const std::string SETTING_ACCESSIBILITY_AUDIOVISUAL; - static const std::string SETTING_ACCESSIBILITY_AUDIOHEARING; - static const std::string SETTING_ACCESSIBILITY_SUBHEARING; - static const std::string SETTING_SCRAPERS_MOVIESDEFAULT; - static const std::string SETTING_SCRAPERS_TVSHOWSDEFAULT; - static const std::string SETTING_SCRAPERS_MUSICVIDEOSDEFAULT; - static const std::string SETTING_PVRMANAGER_ENABLED; - static const std::string SETTING_PVRMANAGER_HIDECONNECTIONLOSTWARNING; - static const std::string SETTING_PVRMANAGER_SYNCCHANNELGROUPS; - static const std::string SETTING_PVRMANAGER_BACKENDCHANNELORDER; - static const std::string SETTING_PVRMANAGER_USEBACKENDCHANNELNUMBERS; - static const std::string SETTING_PVRMANAGER_CHANNELMANAGER; - static const std::string SETTING_PVRMANAGER_GROUPMANAGER; - static const std::string SETTING_PVRMANAGER_CHANNELSCAN; - static const std::string SETTING_PVRMANAGER_RESETDB; - static const std::string SETTING_PVRMENU_DISPLAYCHANNELINFO; - static const std::string SETTING_PVRMENU_CLOSECHANNELOSDONSWITCH; - static const std::string SETTING_PVRMENU_ICONPATH; - static const std::string SETTING_PVRMENU_SEARCHICONS; - static const std::string SETTING_EPG_DAYSTODISPLAY; - static const std::string SETTING_EPG_SELECTACTION; - static const std::string SETTING_EPG_HIDENOINFOAVAILABLE; - static const std::string SETTING_EPG_EPGUPDATE; - static const std::string SETTING_EPG_PREVENTUPDATESWHILEPLAYINGTV; - static const std::string SETTING_EPG_IGNOREDBFORCLIENT; - static const std::string SETTING_EPG_RESETEPG; - static const std::string SETTING_PVRPLAYBACK_PLAYMINIMIZED; - static const std::string SETTING_PVRPLAYBACK_STARTLAST; - static const std::string SETTING_PVRPLAYBACK_SIGNALQUALITY; - static const std::string SETTING_PVRPLAYBACK_SCANTIME; - static const std::string SETTING_PVRPLAYBACK_CONFIRMCHANNELSWITCH; - static const std::string SETTING_PVRPLAYBACK_CHANNELENTRYTIMEOUT; - static const std::string SETTING_PVRPLAYBACK_FPS; - static const std::string SETTING_PVRRECORD_INSTANTRECORDTIME; - static const std::string SETTING_PVRRECORD_DEFAULTPRIORITY; - static const std::string SETTING_PVRRECORD_DEFAULTLIFETIME; - static const std::string SETTING_PVRRECORD_MARGINSTART; - static const std::string SETTING_PVRRECORD_MARGINEND; - static const std::string SETTING_PVRRECORD_PREVENTDUPLICATEEPISODES; - static const std::string SETTING_PVRRECORD_TIMERNOTIFICATIONS; - static const std::string SETTING_PVRPOWERMANAGEMENT_ENABLED; - static const std::string SETTING_PVRPOWERMANAGEMENT_BACKENDIDLETIME; - static const std::string SETTING_PVRPOWERMANAGEMENT_SETWAKEUPCMD; - static const std::string SETTING_PVRPOWERMANAGEMENT_PREWAKEUP; - static const std::string SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUP; - static const std::string SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME; - static const std::string SETTING_PVRPARENTAL_ENABLED; - static const std::string SETTING_PVRPARENTAL_PIN; - static const std::string SETTING_PVRPARENTAL_DURATION; - static const std::string SETTING_PVRCLIENT_MENUHOOK; - static const std::string SETTING_PVRTIMERS_TIMERTYPEFILTER; - static const std::string SETTING_MUSICLIBRARY_SHOWCOMPILATIONARTISTS; - static const std::string SETTING_MUSICLIBRARY_DOWNLOADINFO; - static const std::string SETTING_MUSICLIBRARY_ALBUMSSCRAPER; - static const std::string SETTING_MUSICLIBRARY_ARTISTSSCRAPER; - static const std::string SETTING_MUSICLIBRARY_OVERRIDETAGS; - static const std::string SETTING_MUSICLIBRARY_SHOWALLITEMS; - static const std::string SETTING_MUSICLIBRARY_UPDATEONSTARTUP; - static const std::string SETTING_MUSICLIBRARY_BACKGROUNDUPDATE; - static const std::string SETTING_MUSICLIBRARY_CLEANUP; - static const std::string SETTING_MUSICLIBRARY_EXPORT; - static const std::string SETTING_MUSICLIBRARY_IMPORT; - static const std::string SETTING_MUSICPLAYER_AUTOPLAYNEXTITEM; - static const std::string SETTING_MUSICPLAYER_QUEUEBYDEFAULT; - static const std::string SETTING_MUSICPLAYER_SEEKSTEPS; - static const std::string SETTING_MUSICPLAYER_SEEKDELAY; - static const std::string SETTING_MUSICPLAYER_REPLAYGAINTYPE; - static const std::string SETTING_MUSICPLAYER_REPLAYGAINPREAMP; - static const std::string SETTING_MUSICPLAYER_REPLAYGAINNOGAINPREAMP; - static const std::string SETTING_MUSICPLAYER_REPLAYGAINAVOIDCLIPPING; - static const std::string SETTING_MUSICPLAYER_CROSSFADE; - static const std::string SETTING_MUSICPLAYER_CROSSFADEALBUMTRACKS; - static const std::string SETTING_MUSICPLAYER_VISUALISATION; - static const std::string SETTING_MUSICFILES_USETAGS; - static const std::string SETTING_MUSICFILES_TRACKFORMAT; - static const std::string SETTING_MUSICFILES_NOWPLAYINGTRACKFORMAT; - static const std::string SETTING_MUSICFILES_LIBRARYTRACKFORMAT; - static const std::string SETTING_MUSICFILES_FINDREMOTETHUMBS; - static const std::string SETTING_AUDIOCDS_AUTOACTION; - static const std::string SETTING_AUDIOCDS_USECDDB; - static const std::string SETTING_AUDIOCDS_RECORDINGPATH; - static const std::string SETTING_AUDIOCDS_TRACKPATHFORMAT; - static const std::string SETTING_AUDIOCDS_ENCODER; - static const std::string SETTING_AUDIOCDS_SETTINGS; - static const std::string SETTING_AUDIOCDS_EJECTONRIP; - static const std::string SETTING_MYMUSIC_STARTWINDOW; - static const std::string SETTING_MYMUSIC_SONGTHUMBINVIS; - static const std::string SETTING_MYMUSIC_DEFAULTLIBVIEW; - static const std::string SETTING_PICTURES_GENERATETHUMBS; - static const std::string SETTING_PICTURES_SHOWVIDEOS; - static const std::string SETTING_PICTURES_DISPLAYRESOLUTION; - static const std::string SETTING_SLIDESHOW_STAYTIME; - static const std::string SETTING_SLIDESHOW_DISPLAYEFFECTS; - static const std::string SETTING_SLIDESHOW_SHUFFLE; - static const std::string SETTING_WEATHER_CURRENTLOCATION; - static const std::string SETTING_WEATHER_ADDON; - static const std::string SETTING_WEATHER_ADDONSETTINGS; - static const std::string SETTING_SERVICES_DEVICENAME; - static const std::string SETTING_SERVICES_UPNPSERVER; - static const std::string SETTING_SERVICES_UPNPANNOUNCE; - static const std::string SETTING_SERVICES_UPNPLOOKFOREXTERNALSUBTITLES; - static const std::string SETTING_SERVICES_UPNPCONTROLLER; - static const std::string SETTING_SERVICES_UPNPRENDERER; - static const std::string SETTING_SERVICES_WEBSERVER; - static const std::string SETTING_SERVICES_WEBSERVERPORT; - static const std::string SETTING_SERVICES_WEBSERVERUSERNAME; - static const std::string SETTING_SERVICES_WEBSERVERPASSWORD; - static const std::string SETTING_SERVICES_WEBSKIN; - static const std::string SETTING_SERVICES_ESENABLED; - static const std::string SETTING_SERVICES_ESPORT; - static const std::string SETTING_SERVICES_ESPORTRANGE; - static const std::string SETTING_SERVICES_ESMAXCLIENTS; - static const std::string SETTING_SERVICES_ESALLINTERFACES; - static const std::string SETTING_SERVICES_ESINITIALDELAY; - static const std::string SETTING_SERVICES_ESCONTINUOUSDELAY; - static const std::string SETTING_SERVICES_ZEROCONF; - static const std::string SETTING_SERVICES_AIRPLAY; - static const std::string SETTING_SERVICES_AIRPLAYVOLUMECONTROL; - static const std::string SETTING_SERVICES_USEAIRPLAYPASSWORD; - static const std::string SETTING_SERVICES_AIRPLAYPASSWORD; - static const std::string SETTING_SERVICES_AIRPLAYVIDEOSUPPORT; - static const std::string SETTING_SMB_WINSSERVER; - static const std::string SETTING_SMB_WORKGROUP; - static const std::string SETTING_VIDEOSCREEN_MONITOR; - static const std::string SETTING_VIDEOSCREEN_SCREEN; - static const std::string SETTING_VIDEOSCREEN_RESOLUTION; - static const std::string SETTING_VIDEOSCREEN_SCREENMODE; - static const std::string SETTING_VIDEOSCREEN_FAKEFULLSCREEN; - static const std::string SETTING_VIDEOSCREEN_BLANKDISPLAYS; - static const std::string SETTING_VIDEOSCREEN_STEREOSCOPICMODE; - static const std::string SETTING_VIDEOSCREEN_PREFEREDSTEREOSCOPICMODE; - static const std::string SETTING_VIDEOSCREEN_VSYNC; - static const std::string SETTING_VIDEOSCREEN_GUICALIBRATION; - static const std::string SETTING_VIDEOSCREEN_TESTPATTERN; - static const std::string SETTING_VIDEOSCREEN_LIMITEDRANGE; - static const std::string SETTING_AUDIOOUTPUT_AUDIODEVICE; - static const std::string SETTING_AUDIOOUTPUT_CHANNELS; - static const std::string SETTING_AUDIOOUTPUT_CONFIG; - static const std::string SETTING_AUDIOOUTPUT_SAMPLERATE; - static const std::string SETTING_AUDIOOUTPUT_STEREOUPMIX; - static const std::string SETTING_AUDIOOUTPUT_MAINTAINORIGINALVOLUME; - static const std::string SETTING_AUDIOOUTPUT_NORMALIZELEVELS; - static const std::string SETTING_AUDIOOUTPUT_PROCESSQUALITY; - static const std::string SETTING_AUDIOOUTPUT_STREAMSILENCE; - static const std::string SETTING_AUDIOOUTPUT_DSPADDONSENABLED; - static const std::string SETTING_AUDIOOUTPUT_DSPSETTINGS; - static const std::string SETTING_AUDIOOUTPUT_DSPRESETDB; - static const std::string SETTING_AUDIOOUTPUT_GUISOUNDMODE; - static const std::string SETTING_AUDIOOUTPUT_PASSTHROUGH; - static const std::string SETTING_AUDIOOUTPUT_PASSTHROUGHDEVICE; - static const std::string SETTING_AUDIOOUTPUT_AC3PASSTHROUGH; - static const std::string SETTING_AUDIOOUTPUT_AC3TRANSCODE; - static const std::string SETTING_AUDIOOUTPUT_EAC3PASSTHROUGH; - static const std::string SETTING_AUDIOOUTPUT_DTSPASSTHROUGH; - static const std::string SETTING_AUDIOOUTPUT_TRUEHDPASSTHROUGH; - static const std::string SETTING_AUDIOOUTPUT_DTSHDPASSTHROUGH; - static const std::string SETTING_AUDIOOUTPUT_SUPPORTSDTSHDCPUDECODING; - static const std::string SETTING_INPUT_PERIPHERALS; - static const std::string SETTING_INPUT_ENABLEMOUSE; - static const std::string SETTING_INPUT_ENABLEJOYSTICK; - static const std::string SETTING_INPUT_APPLEREMOTEMODE; - static const std::string SETTING_INPUT_APPLEREMOTEALWAYSON; - static const std::string SETTING_INPUT_APPLEREMOTESEQUENCETIME; - static const std::string SETTING_NETWORK_USEHTTPPROXY; - static const std::string SETTING_NETWORK_HTTPPROXYTYPE; - static const std::string SETTING_NETWORK_HTTPPROXYSERVER; - static const std::string SETTING_NETWORK_HTTPPROXYPORT; - static const std::string SETTING_NETWORK_HTTPPROXYUSERNAME; - static const std::string SETTING_NETWORK_HTTPPROXYPASSWORD; - static const std::string SETTING_NETWORK_BANDWIDTH; - static const std::string SETTING_POWERMANAGEMENT_DISPLAYSOFF; - static const std::string SETTING_POWERMANAGEMENT_SHUTDOWNTIME; - static const std::string SETTING_POWERMANAGEMENT_SHUTDOWNSTATE; - static const std::string SETTING_POWERMANAGEMENT_WAKEONACCESS; - static const std::string SETTING_DEBUG_SHOWLOGINFO; - static const std::string SETTING_DEBUG_EXTRALOGGING; - static const std::string SETTING_DEBUG_SETEXTRALOGLEVEL; - static const std::string SETTING_DEBUG_SCREENSHOTPATH; - static const std::string SETTING_EVENTLOG_ENABLED; - static const std::string SETTING_EVENTLOG_ENABLED_NOTIFICATIONS; - static const std::string SETTING_EVENTLOG_SHOW; - static const std::string SETTING_MASTERLOCK_LOCKCODE; - static const std::string SETTING_MASTERLOCK_STARTUPLOCK; - static const std::string SETTING_MASTERLOCK_MAXRETRIES; - static const std::string SETTING_CACHE_HARDDISK; - static const std::string SETTING_CACHEVIDEO_DVDROM; - static const std::string SETTING_CACHEVIDEO_LAN; - static const std::string SETTING_CACHEVIDEO_INTERNET; - static const std::string SETTING_CACHEAUDIO_DVDROM; - static const std::string SETTING_CACHEAUDIO_LAN; - static const std::string SETTING_CACHEAUDIO_INTERNET; - static const std::string SETTING_CACHEDVD_DVDROM; - static const std::string SETTING_CACHEDVD_LAN; - static const std::string SETTING_CACHEUNKNOWN_INTERNET; - static const std::string SETTING_SYSTEM_PLAYLISTSPATH; - static const std::string SETTING_GENERAL_ADDONUPDATES; - static const std::string SETTING_GENERAL_ADDONNOTIFICATIONS; - static const std::string SETTING_GENERAL_ADDONFOREIGNFILTER; - static const std::string SETTING_GENERAL_ADDONBROKENFILTER; - /*! \brief Creates a new settings wrapper around a new settings manager. - For access to the "global" settings wrapper the static GetInstance() method should + For access to the "global" settings wrapper the static Get() method should be used. */ CSettings(); @@ -379,7 +61,7 @@ \return "global" settings wrapper */ - static CSettings& GetInstance(); + static CSettings& Get(); CSettingsManager* GetSettingsManager() const { return m_settingsManager; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SettingUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/SettingUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/SettingUtils.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SettingUtils.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,6 @@ #include "SettingUtils.h" #include "settings/lib/Setting.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" std::vector CSettingUtils::GetList(const CSettingList *settingList) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SettingUtils.h kodi-15.2~git20151019.1039-final/xbmc/settings/SettingUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/SettingUtils.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SettingUtils.h 2015-10-19 08:39:16.000000000 +0000 @@ -21,7 +21,8 @@ #include #include -class CVariant; +#include "utils/Variant.h" + class CSettingList; class CSetting; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SkinSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/SkinSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/SkinSettings.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SkinSettings.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -18,19 +18,23 @@ * */ -#include -#include +#include #include "SkinSettings.h" #include "GUIInfoManager.h" -#include "addons/Skin.h" #include "settings/Settings.h" #include "threads/SingleLock.h" #include "utils/log.h" #include "utils/StringUtils.h" #include "utils/XBMCTinyXML.h" +#include "utils/XMLUtils.h" #define XML_SKINSETTINGS "skinsettings" +#define XML_SETTING "setting" +#define XML_ATTR_TYPE "type" +#define XML_ATTR_NAME "name" + +using namespace std; CSkinSettings::CSkinSettings() { @@ -40,100 +44,227 @@ CSkinSettings::~CSkinSettings() { } -CSkinSettings& CSkinSettings::GetInstance() +CSkinSettings& CSkinSettings::Get() { static CSkinSettings sSkinSettings; return sSkinSettings; } -int CSkinSettings::TranslateString(const std::string &setting) +int CSkinSettings::TranslateString(const string &setting) { - return g_SkinInfo->TranslateString(setting); + std::string settingName = StringUtils::Format("%s.%s", GetCurrentSkin().c_str(), setting.c_str()); + + CSingleLock lock(m_critical); + // run through and see if we have this setting + for (map::const_iterator it = m_strings.begin(); it != m_strings.end(); ++it) + { + if (StringUtils::EqualsNoCase(settingName, it->second.name)) + return it->first; + } + + // didn't find it - insert it + CSkinString skinString; + skinString.name = settingName; + + int number = m_bools.size() + m_strings.size(); + m_strings.insert(pair(number, skinString)); + return number; } -const std::string& CSkinSettings::GetString(int setting) const +const string& CSkinSettings::GetString(int setting) const { - return g_SkinInfo->GetString(setting); + CSingleLock lock(m_critical); + map::const_iterator it = m_strings.find(setting); + if (it != m_strings.end()) + return it->second.value; + + return StringUtils::Empty; } -void CSkinSettings::SetString(int setting, const std::string &label) +void CSkinSettings::SetString(int setting, const string &label) { - g_SkinInfo->SetString(setting, label); + CSingleLock lock(m_critical); + map::iterator it = m_strings.find(setting); + if (it != m_strings.end()) + { + it->second.value = label; + return; + } + + assert(false); + CLog::Log(LOGFATAL, "%s: unknown setting (%d) requested", __FUNCTION__, setting); } -int CSkinSettings::TranslateBool(const std::string &setting) +int CSkinSettings::TranslateBool(const string &setting) { - return g_SkinInfo->TranslateBool(setting); + string settingName = StringUtils::Format("%s.%s", GetCurrentSkin().c_str(), setting.c_str()); + + CSingleLock lock(m_critical); + // run through and see if we have this setting + for (map::const_iterator it = m_bools.begin(); it != m_bools.end(); ++it) + { + if (StringUtils::EqualsNoCase(settingName, it->second.name)) + return it->first; + } + + // didn't find it - insert it + CSkinBool skinBool; + skinBool.name = settingName; + skinBool.value = false; + + int number = m_bools.size() + m_strings.size(); + m_bools.insert(pair(number, skinBool)); + return number; } bool CSkinSettings::GetBool(int setting) const { - return g_SkinInfo->GetBool(setting); + CSingleLock lock(m_critical); + map::const_iterator it = m_bools.find(setting); + if (it != m_bools.end()) + return it->second.value; + + // default is to return false + return false; } void CSkinSettings::SetBool(int setting, bool set) { - g_SkinInfo->SetBool(setting, set); + CSingleLock lock(m_critical); + map::iterator it = m_bools.find(setting); + if (it != m_bools.end()) + { + it->second.value = set; + return; + } + + assert(false); + CLog::Log(LOGFATAL,"%s: unknown setting (%d) requested", __FUNCTION__, setting); } -void CSkinSettings::Reset(const std::string &setting) +void CSkinSettings::Reset(const string &setting) { - g_SkinInfo->Reset(setting); + string settingName = StringUtils::Format("%s.%s", GetCurrentSkin().c_str(), setting.c_str()); + + CSingleLock lock(m_critical); + // run through and see if we have this setting as a string + for (map::iterator it = m_strings.begin(); it != m_strings.end(); ++it) + { + if (StringUtils::EqualsNoCase(settingName, it->second.name)) + { + it->second.value.clear(); + return; + } + } + + // and now check for the skin bool + for (map::iterator it = m_bools.begin(); it != m_bools.end(); ++it) + { + if (StringUtils::EqualsNoCase(settingName, it->second.name)) + { + it->second.value = false; + return; + } + } } void CSkinSettings::Reset() { - g_SkinInfo->Reset(); + string currentSkin = GetCurrentSkin() + "."; + + CSingleLock lock(m_critical); + // clear all the settings and strings from this skin. + for (map::iterator it = m_bools.begin(); it != m_bools.end(); ++it) + { + if (StringUtils::StartsWithNoCase(it->second.name, currentSkin)) + it->second.value = false; + } + + for (map::iterator it = m_strings.begin(); it != m_strings.end(); ++it) + { + if (StringUtils::StartsWithNoCase(it->second.name, currentSkin)) + it->second.value.clear(); + } g_infoManager.ResetCache(); } bool CSkinSettings::Load(const TiXmlNode *settings) { - if (settings == nullptr) + if (settings == NULL) return false; - const TiXmlElement *rootElement = settings->FirstChildElement(XML_SKINSETTINGS); - - //return true in the case skinsettings is missing. It just means that - //it's been migrated and it's not an error - if (rootElement == nullptr) + const TiXmlElement *pElement = settings->FirstChildElement(XML_SKINSETTINGS); + if (pElement == NULL) { - CLog::Log(LOGDEBUG, "CSkinSettings: no tag found"); - return true; + CLog::Log(LOGWARNING, "CSkinSettings: no tag found"); + return false; } CSingleLock lock(m_critical); - m_settings.clear(); - m_settings = ADDON::CSkinInfo::ParseSettings(rootElement); + m_strings.clear(); + m_bools.clear(); + + int number = 0; + const TiXmlElement *pChild = pElement->FirstChildElement(XML_SETTING); + while (pChild) + { + std::string settingName = XMLUtils::GetAttribute(pChild, XML_ATTR_NAME); + std::string settingType = XMLUtils::GetAttribute(pChild, XML_ATTR_TYPE); + if (settingType == "string") + { // string setting + CSkinString string; + string.name = settingName; + string.value = pChild->FirstChild() ? pChild->FirstChild()->Value() : ""; + m_strings.insert(pair(number++, string)); + } + else + { // bool setting + CSkinBool setting; + setting.name = settingName; + setting.value = pChild->FirstChild() ? StringUtils::EqualsNoCase(pChild->FirstChild()->Value(), "true") : false; + m_bools.insert(pair(number++, setting)); + } + pChild = pChild->NextSiblingElement(XML_SETTING); + } return true; } bool CSkinSettings::Save(TiXmlNode *settings) const { - if (settings == nullptr) + if (settings == NULL) return false; CSingleLock lock(m_critical); - - if (m_settings.empty()) - return true; - // add the tag TiXmlElement xmlSettingsElement(XML_SKINSETTINGS); - TiXmlNode* settingsNode = settings->InsertEndChild(xmlSettingsElement); - if (settingsNode == nullptr) + TiXmlNode *pSettingsNode = settings->InsertEndChild(xmlSettingsElement); + if (pSettingsNode == NULL) { CLog::Log(LOGWARNING, "CSkinSettings: could not create tag"); return false; } - TiXmlElement* settingsElement = settingsNode->ToElement(); - for (const auto& setting : m_settings) + for (map::const_iterator it = m_bools.begin(); it != m_bools.end(); ++it) + { + // Add a true/false + TiXmlElement xmlSetting(XML_SETTING); + xmlSetting.SetAttribute(XML_ATTR_TYPE, "bool"); + xmlSetting.SetAttribute(XML_ATTR_NAME, (*it).second.name.c_str()); + TiXmlText xmlBool((*it).second.value ? "true" : "false"); + xmlSetting.InsertEndChild(xmlBool); + pSettingsNode->InsertEndChild(xmlSetting); + } + for (map::const_iterator it = m_strings.begin(); it != m_strings.end(); ++it) { - if (!setting->Serialize(settingsElement)) - CLog::Log(LOGWARNING, "CSkinSettings: unable to save setting \"%s\"", setting->name.c_str()); + // Add a string + TiXmlElement xmlSetting(XML_SETTING); + xmlSetting.SetAttribute(XML_ATTR_TYPE, "string"); + xmlSetting.SetAttribute(XML_ATTR_NAME, (*it).second.name.c_str()); + TiXmlText xmlLabel((*it).second.value); + xmlSetting.InsertEndChild(xmlLabel); + pSettingsNode->InsertEndChild(xmlSetting); } return true; @@ -142,50 +273,11 @@ void CSkinSettings::Clear() { CSingleLock lock(m_critical); - m_settings.clear(); + m_strings.clear(); + m_bools.clear(); } -void CSkinSettings::MigrateSettings(const ADDON::SkinPtr& skin) +std::string CSkinSettings::GetCurrentSkin() const { - if (skin == nullptr) - return; - - CSingleLock lock(m_critical); - - bool settingsMigrated = false; - const std::string& skinId = skin->ID(); - std::set settingsCopy(m_settings.begin(), m_settings.end()); - for (const auto& setting : settingsCopy) - { - if (!StringUtils::StartsWith(setting->name, skinId + ".")) - continue; - - std::string settingName = setting->name.substr(skinId.size() + 1); - - if (setting->GetType() == "string") - { - int settingNumber = skin->TranslateString(settingName); - if (settingNumber >= 0) - skin->SetString(settingNumber, std::dynamic_pointer_cast(setting)->value); - } - else if (setting->GetType() == "bool") - { - int settingNumber = skin->TranslateBool(settingName); - if (settingNumber >= 0) - skin->SetBool(settingNumber, std::dynamic_pointer_cast(setting)->value); - } - - m_settings.erase(setting); - settingsMigrated = true; - } - - if (settingsMigrated) - { - // save the skin's settings - skin->SaveSettings(); - - // save the guisettings.xml - CSettings::GetInstance().Save(); - } + return CSettings::Get().GetString("lookandfeel.skin"); } - diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/SkinSettings.h kodi-15.2~git20151019.1039-final/xbmc/settings/SkinSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/SkinSettings.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/SkinSettings.h 2015-10-19 08:39:17.000000000 +0000 @@ -19,25 +19,40 @@ * */ -#include +#include #include -#include "addons/Skin.h" #include "settings/lib/ISubSettings.h" #include "threads/CriticalSection.h" class TiXmlNode; -class CSkinSettings : public ISubSettings +class CSkinString +{ +public: + std::string name; + std::string value; +}; + +class CSkinBool { public: - static CSkinSettings& GetInstance(); + CSkinBool() + : value(false) + { } + + std::string name; + bool value; +}; - virtual bool Load(const TiXmlNode *settings) override; - virtual bool Save(TiXmlNode *settings) const override; - virtual void Clear() override; +class CSkinSettings : public ISubSettings +{ +public: + static CSkinSettings& Get(); - void MigrateSettings(const ADDON::SkinPtr& skin); + virtual bool Load(const TiXmlNode *settings); + virtual bool Save(TiXmlNode *settings) const; + virtual void Clear(); int TranslateString(const std::string &setting); const std::string& GetString(int setting) const; @@ -56,7 +71,10 @@ CSkinSettings& operator=(CSkinSettings const&); virtual ~CSkinSettings(); + std::string GetCurrentSkin() const; + private: + std::map m_strings; + std::map m_bools; CCriticalSection m_critical; - std::set m_settings; }; \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/VideoSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/VideoSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/VideoSettings.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/VideoSettings.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -52,9 +52,6 @@ m_AudioDelay = 0.0f; m_OutputToAllSpeakers = false; m_ResumeTime = 0; - m_StereoMode = 0; - m_StereoInvert = false; - } bool CVideoSettings::operator!=(const CVideoSettings &right) const diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/VideoSettings.h kodi-15.2~git20151019.1039-final/xbmc/settings/VideoSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/settings/VideoSettings.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/VideoSettings.h 2015-10-19 08:39:17.000000000 +0000 @@ -111,8 +111,7 @@ ViewModeWideZoom, ViewModeStretch16x9, ViewModeOriginal, - ViewModeCustom, - ViewModeStretch16x9Nonlin + ViewModeCustom } ViewMode; class CVideoSettings diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/windows/GUIControlSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/windows/GUIControlSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/windows/GUIControlSettings.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/windows/GUIControlSettings.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,18 +18,17 @@ * */ -#include "GUIControlSettings.h" - #include -#include +#include "GUIControlSettings.h" +#include "FileItem.h" +#include "Util.h" #include "addons/AddonManager.h" #include "addons/GUIWindowAddonBrowser.h" #include "dialogs/GUIDialogFileBrowser.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogSelect.h" #include "dialogs/GUIDialogSlider.h" -#include "FileItem.h" #include "guilib/GUIEditControl.h" #include "guilib/GUIImage.h" #include "guilib/GUILabelControl.h" @@ -38,136 +37,17 @@ #include "guilib/GUISpinControlEx.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" -#include "settings/lib/Setting.h" -#include "settings/MediaSourceSettings.h" #include "settings/SettingAddon.h" #include "settings/SettingControl.h" #include "settings/SettingPath.h" #include "settings/SettingUtils.h" +#include "settings/MediaSourceSettings.h" +#include "settings/lib/Setting.h" #include "storage/MediaManager.h" -#include "Util.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" using namespace ADDON; -template -static CFileItemPtr GetFileItem(const std::string& label, const TValueType& value, const std::set& selectedValues) -{ - CFileItemPtr item(new CFileItem(label)); - item->SetProperty("value", value); - - if (selectedValues.find(value) != selectedValues.end()) - item->Select(true); - - return item; -} - -static bool GetIntegerOptions(const CSetting* setting, DynamicIntegerSettingOptions& options, std::set& selectedOptions) -{ - const CSettingInt *pSettingInt = NULL; - if (setting->GetType() == SettingTypeInteger) - { - pSettingInt = static_cast(setting); - selectedOptions.insert(pSettingInt->GetValue()); - } - else if (setting->GetType() == SettingTypeList) - { - const CSettingList *settingList = static_cast(setting); - if (settingList->GetElementType() != SettingTypeInteger) - return false; - - pSettingInt = static_cast(settingList->GetDefinition()); - std::vector list = CSettingUtils::GetList(settingList); - for (const auto& itValue : list) - { - if (!itValue.isInteger()) - return false; - selectedOptions.insert((int)itValue.asInteger()); - } - } - else - return false; - - switch (pSettingInt->GetOptionsType()) - { - case SettingOptionsTypeStatic: - { - const StaticIntegerSettingOptions& settingOptions = pSettingInt->GetOptions(); - for (const auto& option : settingOptions) - options.push_back(std::make_pair(g_localizeStrings.Get(option.first), option.second)); - break; - } - - case SettingOptionsTypeDynamic: - { - DynamicIntegerSettingOptions settingOptions = const_cast(pSettingInt)->UpdateDynamicOptions(); - for (const auto& option : settingOptions) - options.push_back(std::make_pair(option.first, option.second)); - break; - } - - case SettingOptionsTypeNone: - default: - { - const CSettingControlFormattedRange *control = static_cast(pSettingInt->GetControl()); - for (int i = pSettingInt->GetMinimum(); i <= pSettingInt->GetMaximum(); i += pSettingInt->GetStep()) - { - std::string strLabel; - if (i == pSettingInt->GetMinimum() && control->GetMinimumLabel() > -1) - strLabel = g_localizeStrings.Get(control->GetMinimumLabel()); - else if (control->GetFormatLabel() > -1) - strLabel = StringUtils::Format(g_localizeStrings.Get(control->GetFormatLabel()).c_str(), i); - else - strLabel = StringUtils::Format(control->GetFormatString().c_str(), i); - - options.push_back(std::make_pair(strLabel, i)); - } - - break; - } - } - - return true; -} - -static bool GetStringOptions(const CSetting* setting, DynamicStringSettingOptions& options, std::set& selectedOptions) -{ - const CSettingString *pSettingString = NULL; - if (setting->GetType() == SettingTypeString) - { - pSettingString = static_cast(setting); - selectedOptions.insert(pSettingString->GetValue()); - } - else if (setting->GetType() == SettingTypeList) - { - const CSettingList *settingList = static_cast(setting); - if (settingList->GetElementType() != SettingTypeString) - return false; - - pSettingString = static_cast(settingList->GetDefinition()); - std::vector list = CSettingUtils::GetList(settingList); - for (const auto& itValue : list) - { - if (!itValue.isString()) - return false; - selectedOptions.insert(itValue.asString()); - } - } - else - return false; - - if (pSettingString->GetOptionsType() == SettingOptionsTypeDynamic) - { - DynamicStringSettingOptions settingOptions = const_cast(pSettingString)->UpdateDynamicOptions(); - options.insert(options.end(), settingOptions.begin(), settingOptions.end()); - } - else - return false; - - return true; -} - CGUIControlBaseSetting::CGUIControlBaseSetting(int id, CSetting *pSetting) : m_id(id), m_pSetting(pSetting), @@ -310,36 +190,69 @@ FillIntegerSettingControl(); else if (m_pSetting->GetType() == SettingTypeString) { - DynamicStringSettingOptions options; - std::set selectedValues; - // get the string options - if (!GetStringOptions(m_pSetting, options, selectedValues) || selectedValues.size() != 1) - return; - - // add them to the spinner - for (const auto& option : options) - m_pSpin->AddLabel(option.first, option.second); + CSettingString *pSettingString = (CSettingString *)m_pSetting; + if (pSettingString->GetOptionsType() == SettingOptionsTypeDynamic) + { + DynamicStringSettingOptions options = pSettingString->UpdateDynamicOptions(); + for (std::vector< std::pair >::const_iterator option = options.begin(); option != options.end(); ++option) + m_pSpin->AddLabel(option->first, option->second); - // and set the current value - m_pSpin->SetStringValue(*selectedValues.begin()); + m_pSpin->SetStringValue(pSettingString->GetValue()); + } } } } void CGUIControlSpinExSetting::FillIntegerSettingControl() { - DynamicIntegerSettingOptions options; - std::set selectedValues; - // get the integer options - if (!GetIntegerOptions(m_pSetting, options, selectedValues) || selectedValues.size() != 1) - return; + CSettingInt *pSettingInt = (CSettingInt *)m_pSetting; + switch (pSettingInt->GetOptionsType()) + { + case SettingOptionsTypeStatic: + { + const StaticIntegerSettingOptions& options = pSettingInt->GetOptions(); + for (StaticIntegerSettingOptions::const_iterator it = options.begin(); it != options.end(); ++it) + m_pSpin->AddLabel(g_localizeStrings.Get(it->first), it->second); + + break; + } + + case SettingOptionsTypeDynamic: + { + DynamicIntegerSettingOptions options = pSettingInt->UpdateDynamicOptions(); + for (DynamicIntegerSettingOptions::const_iterator option = options.begin(); option != options.end(); ++option) + m_pSpin->AddLabel(option->first, option->second); + + break; + } + + case SettingOptionsTypeNone: + default: + { + std::string strLabel; + int i = pSettingInt->GetMinimum(); + const CSettingControlSpinner *control = static_cast(pSettingInt->GetControl()); + if (control->GetMinimumLabel() > -1) + { + strLabel = g_localizeStrings.Get(control->GetMinimumLabel()); + m_pSpin->AddLabel(strLabel, pSettingInt->GetMinimum()); + i += pSettingInt->GetStep(); + } - // add them to the spinner - for (const auto& option : options) - m_pSpin->AddLabel(option.first, option.second); + for (; i <= pSettingInt->GetMaximum(); i += pSettingInt->GetStep()) + { + if (control->GetFormatLabel() > -1) + strLabel = StringUtils::Format(g_localizeStrings.Get(control->GetFormatLabel()).c_str(), i); + else + strLabel = StringUtils::Format(control->GetFormatString().c_str(), i); + m_pSpin->AddLabel(strLabel, i); + } - // and set the current value - m_pSpin->SetValue(*selectedValues.begin()); + break; + } + } + + m_pSpin->SetValue(pSettingInt->GetValue()); } CGUIControlListSetting::CGUIControlListSetting(CGUIButtonControl *pButton, int id, CSetting *pSetting) @@ -372,18 +285,19 @@ const CSettingControlList *control = static_cast(m_pSetting->GetControl()); dialog->Reset(); - dialog->SetHeading(CVariant{g_localizeStrings.Get(m_pSetting->GetLabel())}); - dialog->SetItems(options); + dialog->SetHeading(g_localizeStrings.Get(m_pSetting->GetLabel())); + dialog->SetItems(&options); dialog->SetMultiSelection(control->CanMultiSelect()); - dialog->Open(); + dialog->DoModal(); if (!dialog->IsConfirmed()) return false; + const CFileItemList &items = dialog->GetSelectedItems(); std::vector values; - for (int i : dialog->GetSelectedItems()) + for (int index = 0; index < items.Size(); index++) { - const CFileItemPtr item = options.Get(i); + const CFileItemPtr item = items[index]; if (item == NULL || !item->HasProperty("value")) return false; @@ -429,36 +343,35 @@ CGUIControlBaseSetting::Update(); CFileItemList options; - const CSettingControlList *control = static_cast(m_pSetting->GetControl()); bool optionsValid = GetItems(m_pSetting, options); - std::string label2; - if (optionsValid && !control->HideValue()) + if (optionsValid && !static_cast(m_pSetting->GetControl())->HideValue()) { - SettingControlListValueFormatter formatter = control->GetFormatter(); - if (formatter) - label2 = formatter(m_pSetting); - - if (label2.empty()) + std::vector labels; + for (int index = 0; index < options.Size(); index++) { - std::vector labels; - for (int index = 0; index < options.Size(); index++) - { - const CFileItemPtr pItem = options.Get(index); - if (pItem->IsSelected()) - labels.push_back(pItem->GetLabel()); - } - - label2 = StringUtils::Join(labels, ", "); + const CFileItemPtr pItem = options.Get(index); + if (pItem->IsSelected()) + labels.push_back(pItem->GetLabel()); } - } - m_pButton->SetLabel2(label2); + m_pButton->SetLabel2(StringUtils::Join(labels, ", ")); + } + else + m_pButton->SetLabel2(StringUtils::Empty); // disable the control if it has less than two items if (!m_pButton->IsDisabled() && options.Size() <= 1) m_pButton->SetEnabled(false); } +static CFileItemPtr GetItem(const std::string &label, const CVariant &value) +{ + CFileItemPtr pItem(new CFileItem(label)); + pItem->SetProperty("value", value); + + return pItem; +} + bool CGUIControlListSetting::GetItems(const CSetting *setting, CFileItemList &items) { const CSettingControlList *control = static_cast(setting->GetControl()); @@ -483,30 +396,113 @@ bool CGUIControlListSetting::GetIntegerItems(const CSetting *setting, CFileItemList &items) { - DynamicIntegerSettingOptions options; - std::set selectedValues; - // get the integer options - if (!GetIntegerOptions(setting, options, selectedValues)) + const CSettingInt *pSettingInt = NULL; + std::set values; + if (setting->GetType() == SettingTypeInteger) + { + pSettingInt = static_cast(setting); + values.insert(pSettingInt->GetValue()); + } + else if (setting->GetType() == SettingTypeList) + { + const CSettingList *settingList = static_cast(setting); + if (settingList->GetElementType() != SettingTypeInteger) + return false; + + pSettingInt = static_cast(settingList->GetDefinition()); + std::vector list = CSettingUtils::GetList(settingList); + for (std::vector::const_iterator itValue = list.begin(); itValue != list.end(); ++itValue) + { + if (!itValue->isInteger()) + return false; + values.insert((int)itValue->asInteger()); + } + } + else return false; - // turn them into CFileItems and add them to the item list - for (const auto& option : options) - items.Add(GetFileItem(option.first, option.second, selectedValues)); + switch (pSettingInt->GetOptionsType()) + { + case SettingOptionsTypeStatic: + { + const StaticIntegerSettingOptions& options = pSettingInt->GetOptions(); + for (StaticIntegerSettingOptions::const_iterator it = options.begin(); it != options.end(); ++it) + { + CFileItemPtr pItem = GetItem(g_localizeStrings.Get(it->first), it->second); + + if (values.find(it->second) != values.end()) + pItem->Select(true); + + items.Add(pItem); + } + break; + } + + case SettingOptionsTypeDynamic: + { + DynamicIntegerSettingOptions options = const_cast(pSettingInt)->UpdateDynamicOptions(); + for (DynamicIntegerSettingOptions::const_iterator option = options.begin(); option != options.end(); ++option) + { + CFileItemPtr pItem = GetItem(option->first, option->second); + + if (values.find(option->second) != values.end()) + pItem->Select(true); + + items.Add(pItem); + } + break; + } + + case SettingOptionsTypeNone: + default: + return false; + } return true; } bool CGUIControlListSetting::GetStringItems(const CSetting *setting, CFileItemList &items) { - DynamicStringSettingOptions options; - std::set selectedValues; - // get the string options - if (!GetStringOptions(setting, options, selectedValues)) + const CSettingString *pSettingString = NULL; + std::set values; + if (setting->GetType() == SettingTypeString) + { + pSettingString = static_cast(setting); + values.insert(pSettingString->GetValue()); + } + else if (setting->GetType() == SettingTypeList) + { + const CSettingList *settingList = static_cast(setting); + if (settingList->GetElementType() != SettingTypeString) + return false; + + pSettingString = static_cast(settingList->GetDefinition()); + std::vector list = CSettingUtils::GetList(settingList); + for (std::vector::const_iterator itValue = list.begin(); itValue != list.end(); ++itValue) + { + if (!itValue->isString()) + return false; + values.insert(itValue->asString()); + } + } + else return false; - // turn them into CFileItems and add them to the item list - for (const auto& option : options) - items.Add(GetFileItem(option.first, option.second, selectedValues)); + if (pSettingString->GetOptionsType() == SettingOptionsTypeDynamic) + { + DynamicStringSettingOptions options = const_cast(pSettingString)->UpdateDynamicOptions(); + for (DynamicStringSettingOptions::const_iterator option = options.begin(); option != options.end(); ++option) + { + CFileItemPtr pItem = GetItem(option->first, option->second); + + if (values.find(option->second) != values.end()) + pItem->Select(true); + + items.Add(pItem); + } + } + else + return false; return true; } @@ -610,7 +606,7 @@ if (controlFormat == "addon") { ADDON::AddonPtr addon; - if (ADDON::CAddonMgr::GetInstance().GetAddon(strValue, addon)) + if (ADDON::CAddonMgr::Get().GetAddon(strValue, addon)) strText = addon->Name(); if (strText.empty()) strText = g_localizeStrings.Get(231); // None @@ -674,9 +670,9 @@ VECSOURCES shares; const std::vector& sources = pathSetting->GetSources(); - for (const auto& source : sources) + for (std::vector::const_iterator source = sources.begin(); source != sources.end(); ++source) { - VECSOURCES *sources = CMediaSourceSettings::GetInstance().GetSources(source); + VECSOURCES *sources = CMediaSourceSettings::Get().GetSources(*source); if (sources != NULL) shares.insert(shares.end(), sources->begin(), sources->end()); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/windows/GUIWindowSettingsCategory.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/windows/GUIWindowSettingsCategory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/windows/GUIWindowSettingsCategory.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/windows/GUIWindowSettingsCategory.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,8 +18,6 @@ * */ -#include - #include "GUIWindowSettingsCategory.h" #include "GUIPassword.h" #include "GUIUserMessages.h" @@ -29,6 +27,8 @@ #include "settings/lib/SettingSection.h" #include "view/ViewStateSettings.h" +using namespace std; + #define SETTINGS_PICTURES WINDOW_SETTINGS_MYPICTURES - WINDOW_SETTINGS_START #define SETTINGS_PROGRAMS WINDOW_SETTINGS_MYPROGRAMS - WINDOW_SETTINGS_START #define SETTINGS_WEATHER WINDOW_SETTINGS_MYWEATHER - WINDOW_SETTINGS_START @@ -43,7 +43,7 @@ typedef struct { int id; - std::string name; + string name; } SettingGroup; static const SettingGroup s_settingGroupMap[] = { { SETTINGS_PICTURES, "pictures" }, @@ -60,7 +60,7 @@ CGUIWindowSettingsCategory::CGUIWindowSettingsCategory() : CGUIDialogSettingsManagerBase(WINDOW_SETTINGS_MYPICTURES, "SettingsCategory.xml"), - m_settings(CSettings::GetInstance()), + m_settings(CSettings::Get()), m_iSection(0), m_returningFromSkinLoad(false) { @@ -112,9 +112,9 @@ { if (message.GetParam1() == GUI_MSG_WINDOW_RESIZE) { - if (IsActive() && CDisplaySettings::GetInstance().GetCurrentResolution() != g_graphicsContext.GetVideoResolution()) + if (IsActive() && CDisplaySettings::Get().GetCurrentResolution() != g_graphicsContext.GetVideoResolution()) { - CDisplaySettings::GetInstance().SetCurrentResolution(g_graphicsContext.GetVideoResolution(), true); + CDisplaySettings::Get().SetCurrentResolution(g_graphicsContext.GetVideoResolution(), true); CreateSettings(); } } @@ -132,18 +132,18 @@ case ACTION_SETTINGS_LEVEL_CHANGE: { //Test if we can access the new level - if (!g_passwordManager.CheckSettingLevelLock(CViewStateSettings::GetInstance().GetNextSettingLevel(), true)) + if (!g_passwordManager.CheckSettingLevelLock(CViewStateSettings::Get().GetNextSettingLevel(), true)) return false; - CViewStateSettings::GetInstance().CycleSettingLevel(); - CSettings::GetInstance().Save(); + CViewStateSettings::Get().CycleSettingLevel(); + CSettings::Get().Save(); // try to keep the current position std::string oldCategory; if (m_iCategory >= 0 && m_iCategory < (int)m_categories.size()) oldCategory = m_categories[m_iCategory]->GetId(); - SET_CONTROL_LABEL(CONTRL_BTN_LEVELS, 10036 + (int)CViewStateSettings::GetInstance().GetSettingLevel()); + SET_CONTROL_LABEL(CONTRL_BTN_LEVELS, 10036 + (int)CViewStateSettings::Get().GetSettingLevel()); // only re-create the categories, the settings will be created later SetupControls(false); @@ -180,13 +180,13 @@ void CGUIWindowSettingsCategory::OnWindowLoaded() { - SET_CONTROL_LABEL(CONTRL_BTN_LEVELS, 10036 + (int)CViewStateSettings::GetInstance().GetSettingLevel()); + SET_CONTROL_LABEL(CONTRL_BTN_LEVELS, 10036 + (int)CViewStateSettings::Get().GetSettingLevel()); CGUIDialogSettingsManagerBase::OnWindowLoaded(); } int CGUIWindowSettingsCategory::GetSettingLevel() const { - return (int)CViewStateSettings::GetInstance().GetSettingLevel(); + return (int)CViewStateSettings::Get().GetSettingLevel(); } CSettingSection* CGUIWindowSettingsCategory::GetSection() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/windows/GUIWindowSettingsScreenCalibration.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/windows/GUIWindowSettingsScreenCalibration.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/windows/GUIWindowSettingsScreenCalibration.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/windows/GUIWindowSettingsScreenCalibration.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -34,11 +34,9 @@ #include "guilib/LocalizeStrings.h" #include "utils/log.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "windowing/WindowingFactory.h" -#include -#include +using namespace std; #define CONTROL_LABEL_ROW1 2 #define CONTROL_LABEL_ROW2 3 @@ -76,13 +74,13 @@ case ACTION_CALIBRATE_RESET: { CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); - pDialog->SetHeading(CVariant{20325}); + pDialog->SetHeading(20325); std::string strText = StringUtils::Format(g_localizeStrings.Get(20326).c_str(), g_graphicsContext.GetResInfo(m_Res[m_iCurRes]).strMode.c_str()); - pDialog->SetLine(0, CVariant{std::move(strText)}); - pDialog->SetLine(1, CVariant{20327}); - pDialog->SetChoice(0, CVariant{222}); - pDialog->SetChoice(1, CVariant{186}); - pDialog->Open(); + pDialog->SetLine(0, strText); + pDialog->SetLine(1, 20327); + pDialog->SetChoice(0, 222); + pDialog->SetChoice(1, 186); + pDialog->DoModal(); if (pDialog->IsConfirmed()) { g_graphicsContext.ResetScreenParameters(m_Res[m_iCurRes]); @@ -139,11 +137,12 @@ { case GUI_MSG_WINDOW_DEINIT: { - CDisplaySettings::GetInstance().UpdateCalibrations(); - CSettings::GetInstance().Save(); + CDisplaySettings::Get().UpdateCalibrations(); + CSettings::Get().Save(); g_graphicsContext.SetCalibrating(false); + g_windowManager.ShowOverlay(OVERLAY_STATE_SHOWN); // reset our screen resolution to what it was initially - g_graphicsContext.SetVideoResolution(CDisplaySettings::GetInstance().GetCurrentResolution()); + g_graphicsContext.SetVideoResolution(CDisplaySettings::Get().GetCurrentResolution()); // Inform the player so we can update the resolution #ifdef HAS_VIDEO_PLAYBACK g_renderManager.Update(); @@ -155,6 +154,7 @@ case GUI_MSG_WINDOW_INIT: { CGUIWindow::OnMessage(message); + g_windowManager.ShowOverlay(OVERLAY_STATE_HIDDEN); g_graphicsContext.SetCalibrating(true); // Get the allowable resolutions that we can calibrate... diff -Nru kodi-16.1~git20160425.1001-final/xbmc/settings/windows/GUIWindowTestPattern.cpp kodi-15.2~git20151019.1039-final/xbmc/settings/windows/GUIWindowTestPattern.cpp --- kodi-16.1~git20160425.1001-final/xbmc/settings/windows/GUIWindowTestPattern.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/settings/windows/GUIWindowTestPattern.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -85,14 +85,13 @@ CGUIWindow::Process(currentTime, dirtyregions); m_renderRegion.SetRect(0, 0, (float)g_graphicsContext.GetWidth(), (float)g_graphicsContext.GetHeight()); -#ifndef HAS_DX + if(g_Windowing.UseLimitedColor()) { m_white = 235.0f / 255; m_black = 16.0f / 255; } else -#endif { m_white = 1.0f; m_black = 0.0f; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/SortFileItem.h kodi-15.2~git20151019.1039-final/xbmc/SortFileItem.h --- kodi-16.1~git20160425.1001-final/xbmc/SortFileItem.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/SortFileItem.h 2015-10-19 08:39:16.000000000 +0000 @@ -32,7 +32,6 @@ SORT_METHOD_TITLE, SORT_METHOD_TITLE_IGNORE_THE, SORT_METHOD_ARTIST, - SORT_METHOD_ARTIST_AND_YEAR, SORT_METHOD_ARTIST_IGNORE_THE, SORT_METHOD_ALBUM, SORT_METHOD_ALBUM_IGNORE_THE, @@ -40,7 +39,6 @@ SORT_METHOD_COUNTRY, SORT_METHOD_YEAR, SORT_METHOD_VIDEO_RATING, - SORT_METHOD_VIDEO_USER_RATING, SORT_METHOD_DATEADDED, SORT_METHOD_PROGRAM_COUNT, SORT_METHOD_PLAYLIST_ORDER, diff -Nru kodi-16.1~git20160425.1001-final/xbmc/storage/android/AndroidStorageProvider.cpp kodi-15.2~git20151019.1039-final/xbmc/storage/android/AndroidStorageProvider.cpp --- kodi-16.1~git20160425.1001-final/xbmc/storage/android/AndroidStorageProvider.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/storage/android/AndroidStorageProvider.cpp 2015-09-20 18:09:55.000000000 +0000 @@ -45,8 +45,7 @@ "/mnt/media_rw/extSdCard", "/mnt/media_rw/sdcard", "/mnt/media_rw/usbdisk", - "/storage/emulated", - "/mnt/runtime" + "/storage/emulated" }; static const char * deviceWL[] = { "/dev/block/vold", @@ -56,6 +55,7 @@ CAndroidStorageProvider::CAndroidStorageProvider() { + m_removableLength = 0; PumpDriveChangeEvents(NULL); } @@ -117,10 +117,8 @@ localDrives.push_back(share); } -std::set CAndroidStorageProvider::GetRemovableDrives() +void CAndroidStorageProvider::GetRemovableDrives(VECSOURCES &removableDrives) { - std::set result; - // mounted usb disks char* buf = NULL; FILE* pipe; @@ -212,7 +210,15 @@ if(devok && (fsok || mountok)) { - result.insert(mountStr); + // Reject unreadable + if (XFILE::CDirectory::Exists(mountStr)) + { + CMediaSource share; + share.strPath = unescape(mountStr); + share.strName = URIUtils::GetFileName(mountStr); + share.m_ignore = true; + removableDrives.push_back(share); + } } } } @@ -220,23 +226,6 @@ } free(buf); } - return result; -} - -void CAndroidStorageProvider::GetRemovableDrives(VECSOURCES &removableDrives) -{ - for (const auto& mountStr : GetRemovableDrives()) - { - // Reject unreadable - if (XFILE::CDirectory::Exists(mountStr)) - { - CMediaSource share; - share.strPath = unescape(mountStr); - share.strName = URIUtils::GetFileName(mountStr); - share.m_ignore = true; - removableDrives.push_back(share); - } - } } std::vector CAndroidStorageProvider::GetDiskUsage() @@ -280,8 +269,9 @@ bool CAndroidStorageProvider::PumpDriveChangeEvents(IStorageEventsCallback *callback) { - auto drives = GetRemovableDrives(); - bool changed = m_removableDrives != drives; - m_removableDrives = std::move(drives); + VECSOURCES drives; + GetRemovableDrives(drives); + bool changed = drives.size() != m_removableLength; + m_removableLength = drives.size(); return changed; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/storage/android/AndroidStorageProvider.h kodi-15.2~git20151019.1039-final/xbmc/storage/android/AndroidStorageProvider.h --- kodi-16.1~git20160425.1001-final/xbmc/storage/android/AndroidStorageProvider.h 2016-04-24 12:10:27.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/storage/android/AndroidStorageProvider.h 2014-12-18 01:01:58.000000000 +0000 @@ -19,7 +19,6 @@ * */ -#include #include "storage/IStorageProvider.h" class CAndroidStorageProvider : public IStorageProvider @@ -41,7 +40,6 @@ virtual bool PumpDriveChangeEvents(IStorageEventsCallback *callback); private: - static std::set GetRemovableDrives(); std::string unescape(const std::string& str); - std::set m_removableDrives; + unsigned int m_removableLength; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/storage/AutorunMediaJob.cpp kodi-15.2~git20151019.1039-final/xbmc/storage/AutorunMediaJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/storage/AutorunMediaJob.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/storage/AutorunMediaJob.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,12 +19,11 @@ */ #include "AutorunMediaJob.h" #include "Application.h" -#include "interfaces/builtins/Builtins.h" +#include "interfaces/Builtins.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" #include "dialogs/GUIDialogSelect.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" CAutorunMediaJob::CAutorunMediaJob(const std::string &label, const std::string &path): m_path(path), @@ -41,22 +40,22 @@ pDialog->Reset(); if (m_label.size() > 0) - pDialog->SetHeading(CVariant{m_label}); + pDialog->SetHeading(m_label); else - pDialog->SetHeading(CVariant{g_localizeStrings.Get(21331)}); + pDialog->SetHeading(g_localizeStrings.Get(21331)); pDialog->Add(g_localizeStrings.Get(21332)); pDialog->Add(g_localizeStrings.Get(21333)); pDialog->Add(g_localizeStrings.Get(21334)); pDialog->Add(g_localizeStrings.Get(21335)); - pDialog->Open(); + pDialog->DoModal(); int selection = pDialog->GetSelectedLabel(); if (selection >= 0) { std::string strAction = StringUtils::Format("ActivateWindow(%s, %s)", GetWindowString(selection), m_path.c_str()); - CBuiltins::GetInstance().Execute(strAction); + CBuiltins::Execute(strAction); } return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/storage/cdioSupport.cpp kodi-15.2~git20151019.1039-final/xbmc/storage/cdioSupport.cpp --- kodi-16.1~git20160425.1001-final/xbmc/storage/cdioSupport.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/storage/cdioSupport.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv/ + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -44,7 +44,8 @@ #define UFS_SUPERBLOCK_SECTOR 4 /* buffer[2] */ #define BOOT_SECTOR 17 /* buffer[3] */ #define VCD_INFO_SECTOR 150 /* buffer[4] */ -#define UDF_ANCHOR_SECTOR 256 /* buffer[5] */ +#define UDFX_SECTOR 32 /* buffer[4] */ +#define UDF_ANCHOR_SECTOR 256 /* buffer[5] */ signature_t CCdIoSupport::sigs[] = @@ -63,6 +64,7 @@ {3, 7, "EL TORITO", "BOOTABLE"}, {4, 0, "VIDEO_CD", "VIDEO CD"}, {4, 0, "SUPERVCD", "Chaoji VCD"}, + {0, 0, "MICROSOFT*XBOX*MEDIA", "UDFX CD"}, {0, 1, "BEA01", "UDF"}, { 0 } }; @@ -70,7 +72,7 @@ #undef DEBUG_CDIO static void -cdio_log_handler (cdio_log_level_t level, const char message[]) +xbox_cdio_log_handler (cdio_log_level_t level, const char message[]) { #ifdef DEBUG_CDIO switch (level) @@ -102,7 +104,7 @@ ////////////////////////////////////////////////////////////////////// CLibcdio::CLibcdio(): s_defaultDevice(NULL) { - cdio_log_set_handler( cdio_log_handler ); + cdio_log_set_handler( xbox_cdio_log_handler ); } CLibcdio::~CLibcdio() @@ -200,8 +202,8 @@ { CSingleLock lock(*this); - // If We don't have a DVD device initially present (Darwin or a USB DVD drive), - // We have to keep checking in case one appears. + // if we don't have a DVD device initially present (Darwin or a USB DVD drive), + // we have to keep checking in case one appears. if (s_defaultDevice && strlen(s_defaultDevice) == 0) { free(s_defaultDevice); @@ -384,6 +386,9 @@ case FS_3DO: CLog::Log(LOGINFO, "CD-ROM with Panasonic 3DO filesystem"); break; + case FS_UDFX: + CLog::Log(LOGINFO, "CD-ROM with UDFX filesystem"); + break; case FS_UNKNOWN: CLog::Log(LOGINFO, "CD-ROM with unknown filesystem"); break; @@ -602,6 +607,11 @@ ret = FS_EXT2; break; + case CDIO_FS_UDFX: + ret = FS_UDFX; + udf = true; + break; + case CDIO_FS_UDF: ret = FS_UDF; udf = true; @@ -651,7 +661,7 @@ if (cdtext_get_const(pcdtext, (cdtext_field_t)i, trackNum)) xcdt[(cdtext_field_t)i] = cdtext_field2str((cdtext_field_t)i); #else - // Same ids used in libcdio and for our structure + the ids are consecutive make this copy loop safe. + // same ids used in libcdio and for our structure + the ids are consecutive make this copy loop safe. for (int i = 0; i < MAX_CDTEXT_FIELDS; i++) if (pcdtext->field[i]) xcdt[(cdtext_field_t)i] = pcdtext->field[(cdtext_field_t)i]; @@ -734,11 +744,11 @@ m_nFs = FS_NO_DATA; int temp1 = ::cdio_get_track_lba(cdio, i) - CDIO_PREGAP_SECTORS; int temp2 = ::cdio_get_track_lba(cdio, i + 1) - CDIO_PREGAP_SECTORS; - // The length is the address of the second track minus the address of the first track - temp2 -= temp1; // temp2 now has length of track1 in frames + // the length is the address of the second track minus the address of the first track + temp2 -= temp1; // temp2 now has length of track1 in frames ti.nMins = temp2 / (60 * 75); // calculate the number of minutes - temp2 %= 60 * 75; // calculate the left-over frames - ti.nSecs = temp2 / 75; // calculate the number of seconds + temp2 %= 60 * 75; // calculate the left-over frames + ti.nSecs = temp2 / 75; // calculate the number of seconds if ( -1 == m_nFirstAudio) m_nFirstAudio = i; @@ -784,7 +794,7 @@ CLog::Log(LOGINFO, "CD Analysis Report"); CLog::Log(LOGINFO, STRONG); - /* Try to find out what sort of CD we have */ + /* try to find out what sort of CD we have */ if (0 == m_nNumData) { /* no data track, may be a "real" audio CD or hidden track CD */ @@ -809,7 +819,7 @@ } else { - /* We have data track(s) */ + /* we have data track(s) */ for (j = 2, i = m_nFirstData; i <= m_nNumTracks; i++) { msf_t msf; @@ -843,11 +853,11 @@ m_nStartTrack = (i == 1) ? 0 : ::cdio_msf_to_lsn(&msf); - /* Save the start of the data area */ + /* save the start of the data area */ if (i == m_nFirstData) m_nDataStart = m_nStartTrack; - /* Skip tracks which belong to the current walked session */ + /* skip tracks which belong to the current walked session */ if (m_nStartTrack < m_nDataStart + m_nIsofsSize) continue; @@ -865,7 +875,7 @@ if (i > 1) { - /* Track is beyond last session -> new session found */ + /* track is beyond last session -> new session found */ m_nMsOffset = m_nStartTrack; CLog::Log(LOGINFO, "Session #%d starts at track %2i, LSN: %6i," @@ -914,11 +924,11 @@ } -// Compute the CDDB disk ID for an Audio disk. -// This is a funny checksum consisting of the concatenation of 3 things: -// The sum of the decimal digits of sizes of all tracks, -// The total length of the disk, and -// The number of tracks. +// Compute the CDDB disk ID for an Audio disk. This is a funny checksum +// consisting of the concatenation of 3 things: +// the sum of the decimal digits of sizes of all tracks, +// the total length of the disk, and +// the number of tracks. uint32_t CCdIoSupport::CddbDiscId() { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/storage/cdioSupport.h kodi-15.2~git20151019.1039-final/xbmc/storage/cdioSupport.h --- kodi-16.1~git20160425.1001-final/xbmc/storage/cdioSupport.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/storage/cdioSupport.h 2015-10-19 08:39:17.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv/ + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,9 @@ // // by Bobbin007 in 2003 // CD-Text support by Mog - Oct 2004 +// +// +// #pragma once @@ -43,46 +46,48 @@ #define STRONG "__________________________________\n" //#define NORMAL "" -#define FS_NO_DATA 0 /* audio only */ -#define FS_HIGH_SIERRA 1 -#define FS_ISO_9660 2 -#define FS_INTERACTIVE 3 -#define FS_HFS 4 -#define FS_UFS 5 -#define FS_EXT2 6 +#define FS_NO_DATA 0 /* audio only */ +#define FS_HIGH_SIERRA 1 +#define FS_ISO_9660 2 +#define FS_INTERACTIVE 3 +#define FS_HFS 4 +#define FS_UFS 5 +#define FS_EXT2 6 #define FS_ISO_HFS 7 /* both hfs & isofs filesystem */ #define FS_ISO_9660_INTERACTIVE 8 /* both CD-RTOS and isofs filesystem */ -#define FS_3DO 9 -#define FS_UDF 11 -#define FS_ISO_UDF 12 -#define FS_UNKNOWN 15 -#define FS_MASK 15 - -#define XA 16 -#define MULTISESSION 32 -#define PHOTO_CD 64 -#define HIDDEN_TRACK 128 -#define CDTV 256 -#define BOOTABLE 512 -#define VIDEOCDI 1024 -#define ROCKRIDGE 2048 -#define JOLIET 4096 -#define CVD 8192 /* Choiji Video CD */ - -#define IS_ISOFS 0 -#define IS_CD_I 1 -#define IS_CDTV 2 +#define FS_3DO 9 +#define FS_UDFX 10 +#define FS_UDF 11 +#define FS_ISO_UDF 12 +#define FS_UNKNOWN 15 +#define FS_MASK 15 + +#define XA 16 +#define MULTISESSION 32 +#define PHOTO_CD 64 +#define HIDDEN_TRACK 128 +#define CDTV 256 +#define BOOTABLE 512 +#define VIDEOCDI 1024 +#define ROCKRIDGE 2048 +#define JOLIET 4096 +#define CVD 8192 /* Choiji Video CD */ + +#define IS_ISOFS 0 +#define IS_CD_I 1 +#define IS_CDTV 2 #define IS_CD_RTOS 3 -#define IS_HS 4 -#define IS_BRIDGE 5 -#define IS_XA 6 -#define IS_PHOTO_CD 7 -#define IS_EXT2 8 -#define IS_UFS 9 -#define IS_BOOTABLE 10 -#define IS_VIDEO_CD 11 /* Video CD */ -#define IS_CVD 12 /* Chinese Video CD - slightly incompatible with SVCD */ -#define IS_UDF 14 +#define IS_HS 4 +#define IS_BRIDGE 5 +#define IS_XA 6 +#define IS_PHOTO_CD 7 +#define IS_EXT2 8 +#define IS_UFS 9 +#define IS_BOOTABLE 10 +#define IS_VIDEO_CD 11 /* Video CD */ +#define IS_CVD 12 /* Chinese Video CD - slightly incompatible with SVCD */ +#define IS_UDFX 13 +#define IS_UDF 14 typedef struct signature { @@ -97,14 +102,14 @@ typedef struct TRACKINFO { - int nfsInfo; // Information of the Tracks Filesystem - int nJolietLevel; // Jouliet Level - int ms_offset; // Multisession Offset - int isofs_size; // Size of the ISO9660 Filesystem - int nFrames; // Can be used for cddb query - int nMins; // minutes playtime part of Track - int nSecs; // seconds playtime part of Track - xbmc_cdtext_t cdtext; // CD-Text for this track + int nfsInfo; // Information of the Tracks Filesystem + int nJolietLevel; // Jouliet Level + int ms_offset; // Multisession Offset + int isofs_size; // Size of the ISO9660 Filesystem + int nFrames; // Can be used for cddb query + int nMins; // minutes playtime part of Track + int nSecs; // seconds playtime part of Track + xbmc_cdtext_t cdtext; // CD-Text for this track } trackinfo; @@ -171,6 +176,9 @@ // CD-ROM with Panasonic 3DO filesystem bool Is3DO( int nTrack ) { return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_3DO); } + // CD-ROM with XBOX UDFX filesystem + bool IsUDFX( int nTrack ) { return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_UDFX); } + // Mixed Mode CD-ROM bool IsMixedMode( int nTrack ) { return (m_nFirstData == 1 && m_nNumAudio > 0); } @@ -210,7 +218,7 @@ bool IsUDF( int nTrack ) { return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_UDF); } // Has the cd a filesystem that is readable by the xbox - bool IsValidFs() { return (IsISOHFS(1) || IsIso9660(1) || IsIso9660Interactive(1) || IsISOUDF(1) || IsUDF(1) || IsAudio(1)); } + bool IsValidFs() { return (IsISOHFS(1) || IsIso9660(1) || IsIso9660Interactive(1) || IsISOUDF(1) || IsUDF(1) || IsUDFX(1) || IsAudio(1)); } void SetFirstTrack( int nTrack ) { m_nFirstTrack = nTrack; } void SetTrackCount( int nCount ) { m_nNumTrack = nCount; } @@ -230,14 +238,14 @@ private: int m_nFirstData; /* # of first data track */ - int m_nNumData; /* # of data tracks */ - int m_nFirstAudio; /* # of first audio track */ - int m_nNumAudio; /* # of audio tracks */ + int m_nNumData; /* # of data tracks */ + int m_nFirstAudio; /* # of first audio track */ + int m_nNumAudio; /* # of audio tracks */ int m_nNumTrack; int m_nFirstTrack; trackinfo m_ti[100]; uint32_t m_ulCddbDiscId; - int m_nLength; // Disclength can be used for cddb query, also see trackinfo.nFrames + int m_nLength; // Disclength can be used for cddb query, also see trackinfo.nFrames bool m_bHasCDDBInfo; std::string m_strDiscLabel; xbmc_cdtext_t m_cdtext; // CD-Text for this disc @@ -312,12 +320,12 @@ private: char buffer[7][CDIO_CD_FRAMESIZE_RAW]; /* for CD-Data */ static signature_t sigs[17]; - int i, j; /* index */ - int m_nStartTrack; /* first sector of track */ - int m_nIsofsSize; /* size of session */ + int i, j; /* index */ + int m_nStartTrack; /* first sector of track */ + int m_nIsofsSize; /* size of session */ int m_nJolietLevel; - int m_nMsOffset; /* multisession offset found by track-walking */ - int m_nDataStart; /* start of data area */ + int m_nMsOffset; /* multisession offset found by track-walking */ + int m_nDataStart; /* start of data area */ int m_nFs; int m_nUDFVerMinor; int m_nUDFVerMajor; @@ -329,13 +337,13 @@ std::string m_strDiscLabel; int m_nFirstData; /* # of first data track */ - int m_nNumData; /* # of data tracks */ - int m_nFirstAudio; /* # of first audio track */ - int m_nNumAudio; /* # of audio tracks */ + int m_nNumData; /* # of data tracks */ + int m_nFirstAudio; /* # of first audio track */ + int m_nNumAudio; /* # of audio tracks */ std::shared_ptr m_cdio; }; } -#endif \ No newline at end of file +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/storage/DetectDVDType.cpp kodi-15.2~git20151019.1039-final/xbmc/storage/DetectDVDType.cpp --- kodi-16.1~git20160425.1001-final/xbmc/storage/DetectDVDType.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/storage/DetectDVDType.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv/ + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -64,14 +64,14 @@ std::string CDetectDVDMedia::m_diskLabel = ""; std::string CDetectDVDMedia::m_diskPath = ""; -CDetectDVDMedia::CDetectDVDMedia() : CThread("DetectDVDMedia"), - m_bStartup(true), // Do not autorun on startup - m_bAutorun(false), - m_dwLastTrayState(0), - m_cdio(CLibcdio::GetInstance()) +CDetectDVDMedia::CDetectDVDMedia() : CThread("DetectDVDMedia") { + m_bAutorun = false; m_bStop = false; + m_dwLastTrayState = 0; + m_bStartup = true; // Do not autorun on startup m_pInstance = this; + m_cdio = CLibcdio::GetInstance(); } CDetectDVDMedia::~CDetectDVDMedia() @@ -150,12 +150,12 @@ case DRIVE_NOT_READY: { - // Drive is not ready (closing, opening) + // drive is not ready (closing, opening) m_isoReader.Reset(); SetNewDVDShareUrl("D:\\", false, g_localizeStrings.Get(503)); m_DriveState = DRIVE_NOT_READY; // DVD-ROM in undefined state - // Better delete old CD Information + // better delete old CD Information if ( m_pCdInfo != NULL ) { delete m_pCdInfo; @@ -172,7 +172,7 @@ case DRIVE_CLOSED_NO_MEDIA: { - // Nothing in there... + // nothing in there... m_isoReader.Reset(); SetNewDVDShareUrl("D:\\", false, g_localizeStrings.Get(504)); m_DriveState = DRIVE_CLOSED_NO_MEDIA; @@ -251,7 +251,7 @@ } else { - if (m_pCdInfo->IsUDF(1)) + if (m_pCdInfo->IsUDF(1) || m_pCdInfo->IsUDFX(1)) strNewUrl = "D:\\"; else if (m_pCdInfo->IsAudio(1)) { @@ -308,7 +308,7 @@ if (strDiscLabel != "") strDescription = strDiscLabel; - // Store it in case others want it + // store it in case others want it m_diskLabel = strDescription; m_diskPath = strNewUrl; } @@ -480,7 +480,8 @@ // Static function // Returns a CCdInfo class, which contains -// Media information of the current inserted CD. +// Media information of the current +// inserted CD. // Can be NULL CCdInfo* CDetectDVDMedia::GetCdInfo() { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/storage/DetectDVDType.h kodi-15.2~git20151019.1039-final/xbmc/storage/DetectDVDType.h --- kodi-16.1~git20160425.1001-final/xbmc/storage/DetectDVDType.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/storage/DetectDVDType.h 2015-10-19 08:39:17.000000000 +0000 @@ -1,8 +1,8 @@ #pragma once /* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv/ + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,10 +20,13 @@ * */ -// CDetectDVDMedia -// Thread running in the background to detect a CD change and the filesystem +// CDetectDVDMedia - Thread running in the background to detect a CD change +// and the filesystem // // by Bobbin007 in 2003 +// +// +// #include "system.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/storage/linux/UDevProvider.cpp kodi-15.2~git20151019.1039-final/xbmc/storage/linux/UDevProvider.cpp --- kodi-16.1~git20160425.1001-final/xbmc/storage/linux/UDevProvider.cpp 2016-01-11 16:50:51.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/storage/linux/UDevProvider.cpp 2015-04-04 00:00:17.000000000 +0000 @@ -243,6 +243,7 @@ return false; const char *action = udev_device_get_action(dev); + const char *devtype = udev_device_get_devtype(dev); if (action) { std::string label; @@ -253,40 +254,20 @@ else if (mountpoint) label = URIUtils::GetFileName(mountpoint); - const char *fs_usage = udev_device_get_property_value(dev, "ID_FS_USAGE"); - if (mountpoint && strcmp(action, "add") == 0 && (fs_usage && strcmp(fs_usage, "filesystem") == 0)) + if (!strcmp(action, "add") && !strcmp(devtype, "partition")) { CLog::Log(LOGNOTICE, "UDev: Added %s", mountpoint); if (callback) callback->OnStorageAdded(label, mountpoint); changed = true; } - if (strcmp(action, "remove") == 0 && (fs_usage && strcmp(fs_usage, "filesystem") == 0)) + if (!strcmp(action, "remove") && !strcmp(devtype, "partition")) { + CLog::Log(LOGNOTICE, "UDev: Removed %s", mountpoint); if (callback) callback->OnStorageSafelyRemoved(label); changed = true; } - // browse disk dialog is not wanted for blu-rays - const char *bd = udev_device_get_property_value(dev, "ID_CDROM_MEDIA_BD"); - if (strcmp(action, "change") == 0 && !(bd && strcmp(bd, "1") == 0)) - { - const char *optical = udev_device_get_property_value(dev, "ID_CDROM"); - if (mountpoint && (optical && strcmp(optical, "1") == 0)) - { - CLog::Log(LOGNOTICE, "UDev: Changed / Added %s", mountpoint); - if (callback) - callback->OnStorageAdded(label, mountpoint); - changed = true; - } - const char *eject_request = udev_device_get_property_value(dev, "DISK_EJECT_REQUEST"); - if (eject_request && strcmp(eject_request, "1") == 0) - { - if (callback) - callback->OnStorageSafelyRemoved(label); - changed = true; - } - } } udev_device_unref(dev); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/storage/MediaManager.cpp kodi-15.2~git20151019.1039-final/xbmc/storage/MediaManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/storage/MediaManager.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/storage/MediaManager.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -31,8 +31,6 @@ #ifdef HAS_DVD_DRIVE #ifndef TARGET_WINDOWS // TODO: switch all ports to use auto sources -#include -#include #include "DetectDVDType.h" #include "filesystem/iso9660.h" #endif @@ -67,9 +65,7 @@ #include "windows/Win32StorageProvider.h" #endif -#include -#include - +using namespace std; using namespace XFILE; #ifdef HAS_DVD_DRIVE @@ -88,8 +84,7 @@ void CMediaManager::Stop() { - if (m_platformStorage) - m_platformStorage->Stop(); + m_platformStorage->Stop(); delete m_platformStorage; m_platformStorage = NULL; @@ -163,7 +158,7 @@ TiXmlNode *pNetworkNode = pRoot->InsertEndChild(networkNode); if (pNetworkNode) { - for (std::vector::iterator it = m_locations.begin(); it != m_locations.end(); ++it) + for (vector::iterator it = m_locations.begin(); it != m_locations.end(); ++it) { TiXmlElement locationNode("location"); locationNode.SetAttribute("id", (*it).id); @@ -282,11 +277,11 @@ void CMediaManager::AddAutoSource(const CMediaSource &share, bool bAutorun) { - CMediaSourceSettings::GetInstance().AddShare("files", share); - CMediaSourceSettings::GetInstance().AddShare("video", share); - CMediaSourceSettings::GetInstance().AddShare("pictures", share); - CMediaSourceSettings::GetInstance().AddShare("music", share); - CMediaSourceSettings::GetInstance().AddShare("programs", share); + CMediaSourceSettings::Get().AddShare("files", share); + CMediaSourceSettings::Get().AddShare("video", share); + CMediaSourceSettings::Get().AddShare("pictures", share); + CMediaSourceSettings::Get().AddShare("music", share); + CMediaSourceSettings::Get().AddShare("programs", share); CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_SOURCES); g_windowManager.SendThreadMessage( msg ); @@ -298,11 +293,11 @@ void CMediaManager::RemoveAutoSource(const CMediaSource &share) { - CMediaSourceSettings::GetInstance().DeleteSource("files", share.strName, share.strPath, true); - CMediaSourceSettings::GetInstance().DeleteSource("video", share.strName, share.strPath, true); - CMediaSourceSettings::GetInstance().DeleteSource("pictures", share.strName, share.strPath, true); - CMediaSourceSettings::GetInstance().DeleteSource("music", share.strName, share.strPath, true); - CMediaSourceSettings::GetInstance().DeleteSource("programs", share.strName, share.strPath, true); + CMediaSourceSettings::Get().DeleteSource("files", share.strName, share.strPath, true); + CMediaSourceSettings::Get().DeleteSource("video", share.strName, share.strPath, true); + CMediaSourceSettings::Get().DeleteSource("pictures", share.strName, share.strPath, true); + CMediaSourceSettings::Get().DeleteSource("music", share.strName, share.strPath, true); + CMediaSourceSettings::Get().DeleteSource("programs", share.strName, share.strPath, true); CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_SOURCES); g_windowManager.SendThreadMessage( msg ); @@ -544,7 +539,7 @@ CDVDInputStreamNavigator dvdNavigator(NULL); - dvdNavigator.Open(pathVideoTS.c_str(), "", true); + dvdNavigator.Open(pathVideoTS.c_str(), ""); std::string labelString; dvdNavigator.GetDVDTitleString(labelString); std::string serialString; @@ -680,8 +675,8 @@ void CMediaManager::OnStorageAdded(const std::string &label, const std::string &path) { #ifdef HAS_DVD_DRIVE - if (CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOCDS_AUTOACTION) != AUTOCD_NONE || CSettings::GetInstance().GetBool(CSettings::SETTING_DVDS_AUTORUN)) - if (CSettings::GetInstance().GetInt(CSettings::SETTING_AUDIOCDS_AUTOACTION) == AUTOCD_RIP) + if (CSettings::Get().GetInt("audiocds.autoaction") != AUTOCD_NONE || CSettings::Get().GetBool("dvds.autorun")) + if (CSettings::Get().GetInt("audiocds.autoaction") == AUTOCD_RIP) CJobManager::GetInstance().AddJob(new CAutorunMediaJob(label, path), this, CJob::PRIORITY_LOW); else CJobManager::GetInstance().AddJob(new CAutorunMediaJob(label, path), this, CJob::PRIORITY_HIGH); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/system.h kodi-15.2~git20151019.1039-final/xbmc/system.h --- kodi-16.1~git20160425.1001-final/xbmc/system.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/system.h 2015-10-19 08:39:17.000000000 +0000 @@ -31,12 +31,13 @@ #define HAS_DVD_SWSCALE #define HAS_DVDPLAYER #define HAS_EVENT_SERVER +#define HAS_KARAOKE #define HAS_SCREENSAVER #define HAS_PYTHON +#define HAS_SYSINFO #define HAS_VIDEO_PLAYBACK #define HAS_VISUALISATION #define HAS_PVRCLIENTS -#define HAS_ADSPADDONS #ifdef HAVE_LIBMICROHTTPD #define HAS_WEB_SERVER @@ -83,10 +84,6 @@ #define HAS_MDNS_EMBEDDED #endif -#if defined(HAVE_LIBGIF) - #define HAS_GIFLIB -#endif - /********************** * Non-free Components **********************/ @@ -127,7 +124,6 @@ #define HAVE_LIBVORBISENC #define HAS_MYSQL #define HAS_UPNP -#define HAS_GIFLIB #define DECLARE_UNUSED(a,b) a b; #endif @@ -204,11 +200,8 @@ #undef GetFreeSpace #include "PlatformInclude.h" #ifdef HAS_DX -#include "d3d9.h" // On Win32, we're always using DirectX for something, whether it be the actual rendering -#include "d3d11_1.h" -#include "dxgi.h" -#include "d3dcompiler.h" -#include "directxmath.h" +#include "D3D9.h" // On Win32, we're always using DirectX for something, whether it be the actual rendering +#include "D3DX9.h" // or the reference video clock. #else #include #endif @@ -265,7 +258,7 @@ /**************** * default skin ****************/ -#if defined(HAS_TOUCH_SKIN) && defined(TARGET_DARWIN_IOS) +#if defined(HAS_TOUCH_SKIN) && defined(TARGET_DARWIN_IOS) && !defined(TARGET_DARWIN_IOS_ATV2) #define DEFAULT_SKIN "skin.re-touched" #else #define DEFAULT_SKIN "skin.confluence" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/test/TestBasicEnvironment.cpp kodi-15.2~git20151019.1039-final/xbmc/test/TestBasicEnvironment.cpp --- kodi-16.1~git20160425.1001-final/xbmc/test/TestBasicEnvironment.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/test/TestBasicEnvironment.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -61,7 +61,7 @@ * that the initialization of these components won't be needed. */ g_powerManager.Initialize(); - CSettings::GetInstance().Initialize(); + CSettings::Get().Initialize(); /* Create a temporary directory and set it to be used throughout the * test suite run. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/test/TestURL.cpp kodi-15.2~git20151019.1039-final/xbmc/test/TestURL.cpp --- kodi-16.1~git20160425.1001-final/xbmc/test/TestURL.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/test/TestURL.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -59,20 +59,7 @@ { std::string("smb://god:universe@example.com/example"), std::string("smb://example.com/example"), false }, { std::string("smb://god@example.com/example"), std::string("smb://USERNAME@example.com/example"), true }, { std::string("smb://god:universe@example.com/example"), std::string("smb://USERNAME:PASSWORD@example.com/example"), true }, - { std::string("http://god:universe@example.com:8448/example|auth=digest"), std::string("http://USERNAME:PASSWORD@example.com:8448/example|auth=digest"), true }, - { std::string("smb://fd00::1/example"), std::string("smb://fd00::1/example"), false }, - { std::string("smb://fd00::1/example"), std::string("smb://fd00::1/example"), true }, - { std::string("smb://[fd00::1]:8080/example"), std::string("smb://[fd00::1]:8080/example"), false }, - { std::string("smb://[fd00::1]:8080/example"), std::string("smb://[fd00::1]:8080/example"), true }, - { std::string("smb://god:universe@[fd00::1]:8080/example"), std::string("smb://[fd00::1]:8080/example"), false }, - { std::string("smb://god@[fd00::1]:8080/example"), std::string("smb://USERNAME@[fd00::1]:8080/example"), true }, - { std::string("smb://god:universe@fd00::1/example"), std::string("smb://USERNAME:PASSWORD@fd00::1/example"), true }, - { std::string("http://god:universe@[fd00::1]:8448/example|auth=digest"), std::string("http://USERNAME:PASSWORD@[fd00::1]:8448/example|auth=digest"), true }, - { std::string("smb://00ff:1:0000:abde::/example"), std::string("smb://00ff:1:0000:abde::/example"), true }, - { std::string("smb://god:universe@[00ff:1:0000:abde::]:8080/example"), std::string("smb://[00ff:1:0000:abde::]:8080/example"), false }, - { std::string("smb://god@[00ff:1:0000:abde::]:8080/example"), std::string("smb://USERNAME@[00ff:1:0000:abde::]:8080/example"), true }, - { std::string("smb://god:universe@00ff:1:0000:abde::/example"), std::string("smb://USERNAME:PASSWORD@00ff:1:0000:abde::/example"), true }, - { std::string("http://god:universe@[00ff:1:0000:abde::]:8448/example|auth=digest"), std::string("http://USERNAME:PASSWORD@[00ff:1:0000:abde::]:8448/example|auth=digest"), true } + { std::string("http://god:universe@example.com:8448/example|auth=digest"), std::string("http://USERNAME:PASSWORD@example.com:8448/example|auth=digest"), true } }; INSTANTIATE_TEST_CASE_P(URL, TestURLGetWithoutUserDetails, ValuesIn(values)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/TextureCache.cpp kodi-15.2~git20151019.1039-final/xbmc/TextureCache.cpp --- kodi-16.1~git20160425.1001-final/xbmc/TextureCache.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/TextureCache.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,7 +32,7 @@ using namespace XFILE; -CTextureCache &CTextureCache::GetInstance() +CTextureCache &CTextureCache::Get() { static CTextureCache s_cache; return s_cache; @@ -66,9 +66,8 @@ return true; if (URIUtils::IsInPath(url, "special://skin/") || URIUtils::IsInPath(url, "special://temp/") || - URIUtils::IsInPath(url, "resource://") || URIUtils::IsInPath(url, "androidapp://") || - URIUtils::IsInPath(url, CProfilesManager::GetInstance().GetThumbnailsFolder())) + URIUtils::IsInPath(url, CProfilesManager::Get().GetThumbnailsFolder())) return true; return false; } @@ -260,7 +259,7 @@ std::string CTextureCache::GetCachedPath(const std::string &file) { - return URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetThumbnailsFolder(), file); + return URIUtils::AddFileToFolder(CProfilesManager::Get().GetThumbnailsFolder(), file); } void CTextureCache::OnCachingComplete(bool success, CTextureCacheJob *job) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/TextureCache.h kodi-15.2~git20151019.1039-final/xbmc/TextureCache.h --- kodi-16.1~git20160425.1001-final/xbmc/TextureCache.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/TextureCache.h 2015-10-19 08:39:16.000000000 +0000 @@ -47,7 +47,7 @@ \brief The only way through which the global instance of the CTextureCache should be accessed. \return the global instance. */ - static CTextureCache &GetInstance(); + static CTextureCache &Get(); /*! \brief Initalize the texture cache */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/TextureCacheJob.cpp kodi-15.2~git20151019.1039-final/xbmc/TextureCacheJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/TextureCacheJob.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/TextureCacheJob.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -68,7 +68,7 @@ // check whether we need cache the job anyway bool needsRecaching = false; - std::string path(CTextureCache::GetInstance().CheckCachedImage(m_url, false, needsRecaching)); + std::string path(CTextureCache::Get().CheckCachedImage(m_url, false, needsRecaching)); if (!path.empty() && !needsRecaching) return false; return CacheTexture(); @@ -79,8 +79,7 @@ // unwrap the URL as required std::string additional_info; unsigned int width, height; - CPictureScalingAlgorithm::Algorithm scalingAlgorithm; - std::string image = DecodeImageURL(m_url, width, height, scalingAlgorithm, additional_info); + std::string image = DecodeImageURL(m_url, width, height, additional_info); m_details.updateable = additional_info != "music" && UpdateableURL(image); @@ -99,7 +98,7 @@ m_details.file = m_cachePath + ".jpg"; if (out_texture) *out_texture = LoadImage(CTextureCache::GetCachedPath(m_details.file), width, height, "" /* already flipped */); - CLog::Log(LOGDEBUG, "Fast %s image '%s' to '%s': %p", m_oldHash.empty() ? "Caching" : "Recaching", CURL::GetRedacted(image).c_str(), m_details.file.c_str(), out_texture); + CLog::Log(LOGDEBUG, "Fast %s image '%s' to '%s': %p", m_oldHash.empty() ? "Caching" : "Recaching", image.c_str(), m_details.file.c_str(), out_texture); return true; } #endif @@ -111,9 +110,9 @@ else m_details.file = m_cachePath + ".jpg"; - CLog::Log(LOGDEBUG, "%s image '%s' to '%s':", m_oldHash.empty() ? "Caching" : "Recaching", CURL::GetRedacted(image).c_str(), m_details.file.c_str()); + CLog::Log(LOGDEBUG, "%s image '%s' to '%s':", m_oldHash.empty() ? "Caching" : "Recaching", image.c_str(), m_details.file.c_str()); - if (CPicture::CacheTexture(texture, width, height, CTextureCache::GetCachedPath(m_details.file), scalingAlgorithm)) + if (CPicture::CacheTexture(texture, width, height, CTextureCache::GetCachedPath(m_details.file))) { m_details.width = width; m_details.height = height; @@ -139,8 +138,7 @@ // unwrap the URL as required std::string additional_info; unsigned int width, height; - CPictureScalingAlgorithm::Algorithm scalingAlgorithm; - std::string image = DecodeImageURL(url, width, height, scalingAlgorithm, additional_info); + std::string image = DecodeImageURL(url, width, height, additional_info); if (image.empty()) return false; @@ -148,19 +146,18 @@ if (texture == NULL) return false; - bool success = CPicture::ResizeTexture(image, texture, width, height, result, result_size, scalingAlgorithm); + bool success = CPicture::ResizeTexture(image, texture, width, height, result, result_size); delete texture; return success; } -std::string CTextureCacheJob::DecodeImageURL(const std::string &url, unsigned int &width, unsigned int &height, CPictureScalingAlgorithm::Algorithm& scalingAlgorithm, std::string &additional_info) +std::string CTextureCacheJob::DecodeImageURL(const std::string &url, unsigned int &width, unsigned int &height, std::string &additional_info) { // unwrap the URL as required std::string image(url); additional_info.clear(); width = height = 0; - scalingAlgorithm = CPictureScalingAlgorithm::NoAlgorithm; if (StringUtils::StartsWith(url, "image://")) { // format is image://[type@]?options @@ -185,9 +182,6 @@ if (thumbURL.HasOption("height") && StringUtils::IsInteger(thumbURL.GetOption("height"))) height = strtol(thumbURL.GetOption("height").c_str(), NULL, 0); } - - if (thumbURL.HasOption("scaling_algorithm")) - scalingAlgorithm = CPictureScalingAlgorithm::FromString(thumbURL.GetOption("scaling_algorithm")); } return image; } @@ -208,7 +202,7 @@ && !StringUtils::StartsWithNoCase(file.GetMimeType(), "image/") && !StringUtils::EqualsNoCase(file.GetMimeType(), "application/octet-stream")) // ignore non-pictures return NULL; - CBaseTexture *texture = CBaseTexture::LoadFromFile(image, width, height, requirePixels, file.GetMimeType()); + CBaseTexture *texture = CBaseTexture::LoadFromFile(image, width, height, CSettings::Get().GetBool("pictures.useexifrotation"), requirePixels, file.GetMimeType()); if (!texture) return NULL; @@ -239,13 +233,13 @@ if (!time) time = st.st_ctime; if (time || st.st_size) - return StringUtils::Format("d%" PRId64"s%" PRId64, time, st.st_size); + return StringUtils::Format("d%" PRId64"s%" PRId64, time, st.st_size);; // the image exists but we couldn't determine the mtime/ctime and/or size // so set an obviously bad hash return "BADHASH"; } - CLog::Log(LOGDEBUG, "%s - unable to stat url %s", __FUNCTION__, CURL::GetRedacted(url).c_str()); + CLog::Log(LOGDEBUG, "%s - unable to stat url %s", __FUNCTION__, url.c_str()); return ""; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/TextureCacheJob.h kodi-15.2~git20151019.1039-final/xbmc/TextureCacheJob.h --- kodi-16.1~git20160425.1001-final/xbmc/TextureCacheJob.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/TextureCacheJob.h 2015-10-19 08:39:16.000000000 +0000 @@ -23,8 +23,6 @@ #include #include #include - -#include "pictures/PictureScalingAlgorithm.h" #include "utils/Job.h" class CBaseTexture; @@ -105,11 +103,10 @@ \param url wrapped URL of the image \param width width derived from URL \param height height derived from URL - \param scalingAlgorithm scaling algorithm derived from URL \param additional_info additional information, such as "flipped" to flip horizontally \return URL of the underlying image file. */ - static std::string DecodeImageURL(const std::string &url, unsigned int &width, unsigned int &height, CPictureScalingAlgorithm::Algorithm& scalingAlgorithm, std::string &additional_info); + static std::string DecodeImageURL(const std::string &url, unsigned int &width, unsigned int &height, std::string &additional_info); /*! \brief Load an image at a given target size and orientation. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/TextureDatabase.cpp kodi-15.2~git20151019.1039-final/xbmc/TextureDatabase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/TextureDatabase.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/TextureDatabase.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -259,7 +259,7 @@ if (NULL == m_pDS.get()) return false; std::string sql = PrepareSQL("SELECT id, cachedurl, lasthashcheck, imagehash, width, height FROM texture JOIN sizes ON (texture.id=sizes.idtexture AND sizes.size=1) WHERE url='%s'", url.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (!m_pDS->eof()) { // have some information details.id = m_pDS->fv(0).get_asInt(); @@ -295,7 +295,7 @@ return false; sql = PrepareSQL(sql, !filter.fields.empty() ? filter.fields.c_str() : "*") + sqlFilter; - if (!m_pDS->query(sql)) + if (!m_pDS->query(sql.c_str())) return false; while (!m_pDS->eof()) @@ -343,16 +343,16 @@ if (NULL == m_pDS.get()) return false; std::string sql = PrepareSQL("DELETE FROM texture WHERE url='%s'", url.c_str()); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); std::string date = details.updateable ? CDateTime::GetCurrentDateTime().GetAsDBDateTime() : ""; sql = PrepareSQL("INSERT INTO texture (id, url, cachedurl, imagehash, lasthashcheck) VALUES(NULL, '%s', '%s', '%s', '%s')", url.c_str(), details.file.c_str(), details.hash.c_str(), date.c_str()); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); int textureID = (int)m_pDS->lastinsertid(); // set the size information sql = PrepareSQL("INSERT INTO sizes (idtexture, size, usecount, lastusetime, width, height) VALUES(%u, 1, 1, CURRENT_TIMESTAMP, %u, %u)", textureID, details.width, details.height); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } catch (...) { @@ -375,7 +375,7 @@ if (NULL == m_pDS.get()) return false; std::string sql = PrepareSQL("select cachedurl from texture where id=%u", id); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (!m_pDS->eof()) { // have some information @@ -383,7 +383,7 @@ m_pDS->close(); // remove it sql = PrepareSQL("delete from texture where id=%u", id); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); return true; } m_pDS->close(); @@ -413,7 +413,7 @@ return ""; std::string sql = PrepareSQL("select texture from path where url='%s' and type='%s'", url.c_str(), type.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (!m_pDS->eof()) { // have some information @@ -441,19 +441,19 @@ return; std::string sql = PrepareSQL("select id from path where url='%s' and type='%s'", url.c_str(), type.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (!m_pDS->eof()) { // update int pathID = m_pDS->fv(0).get_asInt(); m_pDS->close(); sql = PrepareSQL("update path set texture='%s' where id=%u", texture.c_str(), pathID); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } else { // add the texture m_pDS->close(); sql = PrepareSQL("insert into path (id, url, type, texture) values(NULL, '%s', '%s', '%s')", url.c_str(), type.c_str(), texture.c_str()); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } } catch (...) @@ -471,7 +471,7 @@ if (NULL == m_pDS.get()) return; std::string sql = PrepareSQL("DELETE FROM path WHERE url='%s' and type='%s'", url.c_str(), type.c_str()); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } catch (...) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/threads/LockFree.cpp kodi-15.2~git20151019.1039-final/xbmc/threads/LockFree.cpp --- kodi-16.1~git20160425.1001-final/xbmc/threads/LockFree.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/threads/LockFree.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,279 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifdef __ppc__ +#pragma GCC optimization_level 0 +#endif + +#include "LockFree.h" +#include + +/////////////////////////////////////////////////////////////////////////// +// Fast stack implementation +// NOTE: non-locking only on systems that support atomic cas2 operations +/////////////////////////////////////////////////////////////////////////// +void lf_stack_init(lf_stack* pStack) +{ + pStack->top.ptr = NULL; + pStack->count = 0; +} + +void lf_stack_push(lf_stack* pStack, lf_node* pNode) +{ + atomic_ptr top, newTop; + do + { + top = pStack->top; + pNode->next.ptr = top.ptr; // Link in the new node + newTop.ptr = pNode; +#if defined(__ppc__) || defined(__powerpc__) || defined(__arm__) + } while(cas((long*)&pStack->top, atomic_ptr_to_long(top), atomic_ptr_to_long(newTop)) != atomic_ptr_to_long(top)); +#else + newTop.version = top.version + 1; + } while(cas2((long long*)&pStack->top, atomic_ptr_to_long_long(top), atomic_ptr_to_long_long(newTop)) != atomic_ptr_to_long_long(top)); +#endif + AtomicIncrement(&pStack->count); +} + +lf_node* lf_stack_pop(lf_stack* pStack) +{ + atomic_ptr top, newTop; + do + { + top = pStack->top; + if (top.ptr == NULL) + return NULL; + newTop.ptr = ((lf_node*)top.ptr)->next.ptr; // Unlink the current top node +#if defined(__ppc__) || defined(__powerpc__) || defined(__arm__) + } while(cas((long*)&pStack->top, atomic_ptr_to_long(top), atomic_ptr_to_long(newTop)) != atomic_ptr_to_long(top)); +#else + newTop.version = top.version + 1; + } while(cas2((long long*)&pStack->top, atomic_ptr_to_long_long(top), atomic_ptr_to_long_long(newTop)) != atomic_ptr_to_long_long(top)); +#endif + AtomicDecrement(&pStack->count); + return (lf_node*)top.ptr; +} + +/////////////////////////////////////////////////////////////////////////// +// Fast heap implementation +// NOTE: non-locking only on systems that support atomic cas2 operations +/////////////////////////////////////////////////////////////////////////// +// TODO: Implement auto-shrink based on chunk reference counts + +// TODO: Read the page size from the OS or allow caller to specify +// Maybe have a minimum number of blocks... +#define MIN_ALLOC 4096 + +void lf_heap_init(lf_heap* pHeap, size_t blockSize, size_t initialSize /*= 0*/) +{ + pHeap->alloc_lock = 0; // Initialize the allocation lock + pHeap->top_chunk = NULL; + + lf_stack_init(&pHeap->free_list); // Initialize the free-list stack + + // Perform a few sanity checks on the parameters + if (blockSize < sizeof(lf_node)) // Make sure we have blocks big enough to store in the free-list + blockSize = sizeof(lf_node); + pHeap->block_size = blockSize; + + if (initialSize < 10 * blockSize) + initialSize = 10 * blockSize; // TODO: This should be more intelligent + + lf_heap_grow(pHeap, initialSize); // Allocate the first chunk +} + +void lf_heap_grow(lf_heap* pHeap, size_t size /*= 0*/) +{ + + long blockSize = pHeap->block_size; // This has already been checked for sanity + if (!size || size < MIN_ALLOC - sizeof(lf_heap_chunk)) // Allocate at least one page from the OS (TODO: Try valloc) + size = MIN_ALLOC - sizeof(lf_heap_chunk); + unsigned int blockCount = size / blockSize; + if (size % blockSize) // maxe sure we have complete blocks + size = blockSize * ++blockCount; + + // Allocate the first chunk from the general heap and link it into the chunk list + long mallocSize = size + sizeof(lf_heap_chunk); + lf_heap_chunk* pChunk = (lf_heap_chunk*) malloc(mallocSize); + if (!pChunk) + return; + pChunk->size = mallocSize; + SPINLOCK_ACQUIRE(pHeap->alloc_lock); // Lock the chunk list. Contention here is VERY unlikely, so use the simplest possible sync mechanism. + pChunk->next = pHeap->top_chunk; + pHeap->top_chunk = pChunk; // Link it into the list + SPINLOCK_RELEASE(pHeap->alloc_lock); // The list is now consistent + + // Add all blocks to the free-list + unsigned char* pBlock = (unsigned char*)pChunk + sizeof(lf_heap_chunk); + for ( unsigned int block = 0; block < blockCount; block++) + { + lf_stack_push(&pHeap->free_list, (lf_node*)pBlock); + pBlock += blockSize; + } +} + +void lf_heap_deinit(lf_heap* pHeap) +{ + // Free all allocated chunks + lf_heap_chunk* pNext; + for(lf_heap_chunk* pChunk = pHeap->top_chunk; pChunk; pChunk = pNext) + { + pNext = pChunk->next; + free(pChunk); + } +} + +void* lf_heap_alloc(lf_heap* pHeap) +{ + void * p = lf_stack_pop(&pHeap->free_list); + if (!p) + { + lf_heap_grow(pHeap, 0); + // TODO: should we just call in recursively? + return lf_stack_pop(&pHeap->free_list); // If growing didn't help, something is wrong (or someone else took them all REALLY fast) + } + return p; +} + +void lf_heap_free(lf_heap* pHeap, void* p) +{ + if (!p) // Allow for NULL to pass safely + return; + lf_stack_push(&pHeap->free_list, (lf_node*)p); // Return the block to the free list +} + +/////////////////////////////////////////////////////////////////////////// +// Lock-free queue +/////////////////////////////////////////////////////////////////////////// +void lf_queue_init(lf_queue* pQueue) +{ + pQueue->len = 0; + lf_heap_init(&pQueue->node_heap, sizeof(lf_queue_node)); // Intialize the node heap + lf_queue_node* pNode = lf_queue_new_node(pQueue); // Create the 'empty' node + pNode->next.ptr = NULL; + pNode->value = (void*)0xdeadf00d; + pQueue->head.ptr = pQueue->tail.ptr = pNode; +} + +void lf_queue_deinit(lf_queue* pQueue) +{ + lf_heap_deinit(&pQueue->node_heap); // Clean up the node heap +} + +// TODO: template-ize +void lf_queue_enqueue(lf_queue* pQueue, void* value) +{ + lf_queue_node* pNode = lf_queue_new_node(pQueue); // Get a container + pNode->value = value; + pNode->next.ptr = NULL; + atomic_ptr tail, next, node; + do + { + tail = pQueue->tail; + next = ((lf_queue_node*)tail.ptr)->next; +#if defined(__ppc__) || defined(__powerpc__) || defined(__arm__) + if (atomic_ptr_to_long(tail) == atomic_ptr_to_long(pQueue->tail)) // Check consistency +#else + if (atomic_ptr_to_long_long(tail) == atomic_ptr_to_long_long(pQueue->tail)) // Check consistency +#endif + { + if (next.ptr == NULL) // Was tail pointing to the last node? + { + node.ptr = pNode; +#if defined(__ppc__) || defined(__powerpc__) || defined(__arm__) + if (cas((long*)&((lf_queue_node*)tail.ptr)->next, atomic_ptr_to_long(next), atomic_ptr_to_long(node)) == atomic_ptr_to_long(next)) // Try to link node at end +#else + node.version = next.version + 1; + if (cas2((long long*)&((lf_queue_node*)tail.ptr)->next, atomic_ptr_to_long_long(next), atomic_ptr_to_long_long(node)) == atomic_ptr_to_long_long(next)) // Try to link node at end +#endif + break; // enqueue is done. + } + else // tail was lagging, try to help... + { + node.ptr = next.ptr; +#if defined(__ppc__) || defined(__powerpc__) || defined(__arm__) + cas((long*)&pQueue->tail, atomic_ptr_to_long(tail), atomic_ptr_to_long(node)); // We don't care if we are successful or not +#else + node.version = tail.version + 1; + cas2((long long*)&pQueue->tail, atomic_ptr_to_long_long(tail), atomic_ptr_to_long_long(node)); // We don't care if we are successful or not +#endif + } + } + } while (true); // Keep trying until the enqueue is done + node.ptr = pNode; +#if defined(__ppc__) || defined(__powerpc__) || defined(__arm__) + cas((long*)&pQueue->tail, atomic_ptr_to_long(tail), atomic_ptr_to_long(node)); // Try to swing the tail to the new node +#else + node.version = tail.version + 1; + cas2((long long*)&pQueue->tail, atomic_ptr_to_long_long(tail), atomic_ptr_to_long_long(node)); // Try to swing the tail to the new node +#endif + AtomicIncrement(&pQueue->len); +} + +// TODO: template-ize +void* lf_queue_dequeue(lf_queue* pQueue) +{ + atomic_ptr head, tail, next, node; + void* pVal = NULL; + do + { + head = pQueue->head; + tail = pQueue->tail; + next = ((lf_queue_node*)head.ptr)->next; +#if defined(__ppc__) || defined(__powerpc__) || defined(__arm__) + if (atomic_ptr_to_long(head) == atomic_ptr_to_long(pQueue->head)) // Check consistency +#else + if (atomic_ptr_to_long_long(head) == atomic_ptr_to_long_long(pQueue->head)) // Check consistency +#endif + { + if (head.ptr == tail.ptr) // Queue is empty or tail is lagging + { + if (next.ptr == NULL) // Queue is empty + return NULL; + node.ptr = next.ptr; +#if defined(__ppc__) || defined(__powerpc__) || defined(__arm__) + cas((long*)&pQueue->tail, atomic_ptr_to_long(tail), atomic_ptr_to_long(node)); // Tail is lagging. Try to advance it. +#else + node.version = tail.version + 1; + cas2((long long*)&pQueue->tail, atomic_ptr_to_long_long(tail), atomic_ptr_to_long_long(node)); // Tail is lagging. Try to advance it. +#endif + } + else // Tail is consistent. No need to deal with it. + { + pVal = ((lf_queue_node*)next.ptr)->value; + node.ptr = next.ptr; +#if defined(__ppc__) || defined(__powerpc__) || defined(__arm__) + if (cas((long*)&pQueue->head, atomic_ptr_to_long(head), atomic_ptr_to_long(node)) == atomic_ptr_to_long(head)) +#else + node.version = head.version + 1; + if (cas2((long long*)&pQueue->head, atomic_ptr_to_long_long(head), atomic_ptr_to_long_long(node)) == atomic_ptr_to_long_long(head)) +#endif + break; // Dequeue is done + } + } + } while (true); // Keep trying until the dequeue is done or the queue empties + lf_queue_free_node(pQueue, head.ptr); + AtomicDecrement(&pQueue->len); + return pVal; +} + +#ifdef __ppc__ +#pragma GCC optimization_level reset +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/threads/LockFree.h kodi-15.2~git20151019.1039-final/xbmc/threads/LockFree.h --- kodi-16.1~git20160425.1001-final/xbmc/threads/LockFree.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/threads/LockFree.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifndef __LOCK_FREE_H__ +#define __LOCK_FREE_H__ + +#include +#include "Atomics.h" + +#define SPINLOCK_ACQUIRE(l) while(cas(&l, 0, 1)) {} +#define SPINLOCK_RELEASE(l) l = 0 + +// A unique-valued pointer. Version is incremented with each write. +union atomic_ptr +{ +#if !defined(__ppc__) && !defined(__powerpc__) && !defined(__arm__) + long long d; + struct { + void* ptr; + long version; + }; +#else + long d; + struct { + void* ptr; + }; +#endif +}; + +#if defined(__ppc__) || defined(__powerpc__) || defined(__arm__) + #define atomic_ptr_to_long(p) (long) *((long*)&p) +#else + // This is ugly but correct as long as sizeof(void*) == sizeof(long)... + #define atomic_ptr_to_long_long(p) (long long) *((long long*)&p) +#endif + +struct lf_node +{ + atomic_ptr next; +}; + +/////////////////////////////////////////////////////////////////////////// +// Fast Stack +/////////////////////////////////////////////////////////////////////////// + + +struct lf_stack +{ + atomic_ptr top; + long count; +}; + + +void lf_stack_init(lf_stack* pStack); +void lf_stack_push(lf_stack* pStack, lf_node* pNode); +lf_node* lf_stack_pop(lf_stack* pStack); + +/////////////////////////////////////////////////////////////////////////// +// Fast Heap for Fixed-size Blocks +/////////////////////////////////////////////////////////////////////////// +struct lf_heap_chunk +{ + lf_heap_chunk* next; + long size; +}; + +struct lf_heap +{ + lf_stack free_list; + long alloc_lock; + lf_heap_chunk* top_chunk; + long block_size; +}; + + +void lf_heap_init(lf_heap* pHeap, size_t blockSize, size_t initialSize = 0); +void lf_heap_grow(lf_heap* pHeap, size_t size = 0); +void lf_heap_deinit(lf_heap* pHeap); +void* lf_heap_alloc(lf_heap* pHeap); +void lf_heap_free(lf_heap* pHeap, void* p); + +/////////////////////////////////////////////////////////////////////////// +// Lock-free queue +/////////////////////////////////////////////////////////////////////////// +struct lf_queue_node +{ + atomic_ptr next; + void* value; // TODO: Convert to a template +}; + +struct lf_queue +{ + atomic_ptr head; + atomic_ptr tail; + lf_heap node_heap; + long len; +}; + +#define lf_queue_new_node(q) (lf_queue_node*)lf_heap_alloc(&q->node_heap) +#define lf_queue_free_node(q,n) lf_heap_free(&q->node_heap, n) + +void lf_queue_init(lf_queue* pQueue); +void lf_queue_deinit(lf_queue* pQueue); +void lf_queue_enqueue(lf_queue* pQueue, void* pVal); +void* lf_queue_dequeue(lf_queue* pQueue); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/threads/Makefile kodi-15.2~git20151019.1039-final/xbmc/threads/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/threads/Makefile 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/threads/Makefile 2015-10-19 08:39:17.000000000 +0000 @@ -1,5 +1,6 @@ SRCS=Atomics.cpp \ Event.cpp \ + LockFree.cpp \ Thread.cpp \ Timer.cpp \ SystemClock.cpp \ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/threads/platform/win/Win32Exception.cpp kodi-15.2~git20151019.1039-final/xbmc/threads/platform/win/Win32Exception.cpp --- kodi-16.1~git20160425.1001-final/xbmc/threads/platform/win/Win32Exception.cpp 2015-11-04 04:00:19.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/threads/platform/win/Win32Exception.cpp 2015-04-04 00:00:17.000000000 +0000 @@ -121,7 +121,7 @@ SYSTEMTIME stLocalTime; GetLocalTime(&stLocalTime); - dumpFileName = StringUtils::Format("kodi_crashlog-%s-%04d%02d%02d-%02d%02d%02d.dmp", + dumpFileName = StringUtils::Format("xbmc_crashlog-%s-%04d%02d%02d-%02d%02d%02d.dmp", mVersion.c_str(), stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond); @@ -224,7 +224,7 @@ pSFTA == NULL || pSGMB == NULL) goto cleanup; - dumpFileName = StringUtils::Format("kodi_stacktrace-%s-%04d%02d%02d-%02d%02d%02d.txt", + dumpFileName = StringUtils::Format("xbmc_stacktrace-%s-%04d%02d%02d-%02d%02d%02d.txt", mVersion.c_str(), stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/threads/Thread.cpp kodi-15.2~git20151019.1039-final/xbmc/threads/Thread.cpp --- kodi-16.1~git20160425.1001-final/xbmc/threads/Thread.cpp 2015-11-04 04:00:19.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/threads/Thread.cpp 2014-12-18 01:01:58.000000000 +0000 @@ -123,7 +123,7 @@ pThread->SetThreadInfo(); - LOG(LOGDEBUG,"Thread %s start, auto delete: %s", name.c_str(), (autodelete ? "true" : "false")); + LOG(LOGNOTICE,"Thread %s start, auto delete: %s", name.c_str(), (autodelete ? "true" : "false")); currentThread.set(pThread); pThread->m_StartEvent.Set(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/threads/Timer.cpp kodi-15.2~git20151019.1039-final/xbmc/threads/Timer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/threads/Timer.cpp 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/threads/Timer.cpp 2014-12-18 01:01:58.000000000 +0000 @@ -60,13 +60,6 @@ return true; } -void CTimer::RestartAsync(uint32_t timeout) -{ - m_timeout = timeout; - m_endTime = XbmcThreads::SystemClockMillis() + timeout; - m_eventTimeout.Set(); -} - bool CTimer::Restart() { if (!IsRunning()) @@ -91,11 +84,11 @@ void CTimer::Process() { + uint32_t currentTime = XbmcThreads::SystemClockMillis(); + m_endTime = currentTime + m_timeout; + while (!m_bStop) { - uint32_t currentTime = XbmcThreads::SystemClockMillis(); - m_endTime = currentTime + m_timeout; - // wait the necessary time if (!m_eventTimeout.WaitMSec(m_endTime - currentTime)) { @@ -105,9 +98,11 @@ // execute OnTimeout() callback m_callback->OnTimeout(); - // continue if this is an interval timer, or if it was restarted during callback - if (!m_interval && m_endTime <= currentTime) + // stop if this is not an interval timer + if (!m_interval) break; + + m_endTime = currentTime + m_timeout; } } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/threads/Timer.h kodi-15.2~git20151019.1039-final/xbmc/threads/Timer.h --- kodi-16.1~git20160425.1001-final/xbmc/threads/Timer.h 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/threads/Timer.h 2014-12-18 01:01:58.000000000 +0000 @@ -39,7 +39,6 @@ bool Start(uint32_t timeout, bool interval = false); bool Stop(bool wait = false); bool Restart(); - void RestartAsync(uint32_t timeout); bool IsRunning() const { return CThread::IsRunning(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/ThumbLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/ThumbLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/ThumbLoader.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/ThumbLoader.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -23,6 +23,7 @@ #include "FileItem.h" #include "TextureCache.h" +using namespace std; using namespace XFILE; CThumbLoader::CThumbLoader() : @@ -113,7 +114,7 @@ if (!thumb.empty()) { - CTextureCache::GetInstance().BackgroundCacheImage(thumb); + CTextureCache::Get().BackgroundCacheImage(thumb); item.SetArt("thumb", thumb); } return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/ThumbnailCache.cpp kodi-15.2~git20151019.1039-final/xbmc/ThumbnailCache.cpp --- kodi-16.1~git20160425.1001-final/xbmc/ThumbnailCache.cpp 2015-11-02 01:00:14.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/ThumbnailCache.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -25,6 +25,7 @@ #include "FileItem.h" #include "video/VideoDatabase.h" +using namespace std; using namespace XFILE; using namespace MUSIC_INFO; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/URL.cpp kodi-15.2~git20151019.1039-final/xbmc/URL.cpp --- kodi-16.1~git20160425.1001-final/xbmc/URL.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/URL.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -32,9 +32,7 @@ #include #endif -#include -#include - +using namespace std; using namespace ADDON; CURL::CURL(const std::string& strURL1) @@ -153,25 +151,13 @@ IsProtocol("virtualpath") || IsProtocol("multipath") || IsProtocol("filereader") || - IsProtocol("special") || - IsProtocol("resource") + IsProtocol("special") ) { SetFileName(strURL.substr(iPos)); return; } - if (IsProtocol("udf")) - { - std::string lower(strURL); - StringUtils::ToLower(lower); - size_t isoPos = lower.find(".iso\\", iPos); - if (isoPos != std::string::npos) - { - strURL = strURL.replace(isoPos + 4, 1, "/"); - } - } - // check for username/password - should occur before first / if (iPos == std::string::npos) iPos = 0; @@ -184,9 +170,6 @@ std::string strProtocol2 = GetTranslatedProtocol(); if(IsProtocol("rss") || IsProtocol("rar") || - IsProtocol("apk") || - IsProtocol("xbt") || - IsProtocol("zip") || IsProtocol("addons") || IsProtocol("image") || IsProtocol("videodb") || @@ -198,7 +181,10 @@ || IsProtocolEqual(strProtocol2, "https") || IsProtocolEqual(strProtocol2, "plugin") || IsProtocolEqual(strProtocol2, "addons") - || IsProtocolEqual(strProtocol2, "rtsp")) + || IsProtocolEqual(strProtocol2, "hdhomerun") + || IsProtocolEqual(strProtocol2, "rtsp") + || IsProtocolEqual(strProtocol2, "apk") + || IsProtocolEqual(strProtocol2, "zip")) sep = "?;#|"; else if(IsProtocolEqual(strProtocol2, "ftp") || IsProtocolEqual(strProtocol2, "ftps")) @@ -267,33 +253,35 @@ } } - std::string strHostNameAndPort = strURL.substr(iPos, (iSlash == std::string::npos) ? iEnd - iPos : iSlash - iPos); - // check for IPv6 numerical representation inside []. - // if [] found, let's store string inside as hostname - // and remove that parsed part from strHostNameAndPort - size_t iBrk = strHostNameAndPort.rfind("]"); - if (iBrk != std::string::npos && strHostNameAndPort.find("[") == 0) - { - m_strHostName = strHostNameAndPort.substr(1, iBrk-1); - strHostNameAndPort.erase(0, iBrk+1); - } - - // detect hostname:port/ or just :port/ if previous step found [IPv6] format - size_t iColon = strHostNameAndPort.rfind(":"); - if (iColon != std::string::npos && iColon == strHostNameAndPort.find(":")) + // detect hostname:port/ + if (iSlash == std::string::npos) { - if (m_strHostName.empty()) + std::string strHostNameAndPort = strURL.substr(iPos, iEnd - iPos); + size_t iColon = strHostNameAndPort.find(":"); + if (iColon != std::string::npos) + { m_strHostName = strHostNameAndPort.substr(0, iColon); - m_iPort = atoi(strHostNameAndPort.substr(iColon + 1).c_str()); - } - - // if we still don't have hostname, the strHostNameAndPort substring - // is 'just' hostname without :port specification - so use it as is. - if (m_strHostName.empty()) - m_strHostName = strHostNameAndPort; + m_iPort = atoi(strHostNameAndPort.substr(iColon + 1).c_str()); + } + else + { + m_strHostName = strHostNameAndPort; + } - if (iSlash != std::string::npos) + } + else { + std::string strHostNameAndPort = strURL.substr(iPos, iSlash - iPos); + size_t iColon = strHostNameAndPort.find(":"); + if (iColon != std::string::npos) + { + m_strHostName = strHostNameAndPort.substr(0, iColon); + m_iPort = atoi(strHostNameAndPort.substr(iColon + 1).c_str()); + } + else + { + m_strHostName = strHostNameAndPort; + } iPos = iSlash + 1; if (iEnd > iPos) m_strFileName = strURL.substr(iPos, iEnd - iPos); @@ -496,7 +484,6 @@ // *.zip and *.rar store the actual zip/rar path in the hostname of the url if ((IsProtocol("rar") || IsProtocol("zip") || - IsProtocol("xbt") || IsProtocol("apk")) && m_strFileName.empty()) return URIUtils::GetFileName(m_strHostName); @@ -507,16 +494,6 @@ return URIUtils::GetFileName(file); } -inline -void protectIPv6(std::string &hn) -{ - if (!hn.empty() && hn.find(":") != hn.rfind(":") - && hn.find(":") != std::string::npos) - { - hn = '[' + hn + ']'; - } -} - char CURL::GetDirectorySeparator() const { #ifndef TARGET_POSIX @@ -532,9 +509,6 @@ std::string CURL::Get() const { - if (m_strProtocol.empty()) - return m_strFileName; - unsigned int sizeneed = m_strProtocol.length() + m_strDomain.length() + m_strUserName.length() @@ -545,28 +519,23 @@ + m_strProtocolOptions.length() + 10; + if (m_strProtocol.empty()) + return m_strFileName; + std::string strURL; strURL.reserve(sizeneed); - strURL = GetWithoutOptions(); + strURL = GetWithoutFilename(); + strURL += m_strFileName; if( !m_strOptions.empty() ) strURL += m_strOptions; - if (!m_strProtocolOptions.empty()) strURL += "|"+m_strProtocolOptions; return strURL; } -std::string CURL::GetWithoutOptions() const -{ - if (m_strProtocol.empty()) - return m_strFileName; - - return GetWithoutFilename() + m_strFileName; -} - std::string CURL::GetWithoutUserDetails(bool redact) const { std::string strURL; @@ -576,7 +545,7 @@ CFileItemList items; XFILE::CStackDirectory dir; dir.GetDirectory(*this,items); - std::vector newItems; + vector newItems; for (int i=0;iGetPath()); @@ -626,16 +595,14 @@ strHostName = m_strHostName; if (URIUtils::HasEncodedHostname(*this)) - strHostName = Encode(strHostName); + strURL += Encode(strHostName); + else + strURL += strHostName; if ( HasPort() ) { - protectIPv6(strHostName); - strURL += strHostName + StringUtils::Format(":%i", m_iPort); + strURL += StringUtils::Format(":%i", m_iPort); } - else - strURL += strHostName; - strURL += "/"; } strURL += m_strFileName; @@ -687,21 +654,12 @@ if (!m_strHostName.empty()) { - std::string hostname; - if( URIUtils::HasEncodedHostname(*this) ) - hostname = Encode(m_strHostName); + strURL += Encode(m_strHostName); else - hostname = m_strHostName; - + strURL += m_strHostName; if (HasPort()) - { - protectIPv6(hostname); - strURL += hostname + StringUtils::Format(":%i", m_iPort); - } - else - strURL += hostname; - + strURL += ':' + StringUtils::Format("%i", m_iPort); strURL += "/"; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/URL.h kodi-15.2~git20151019.1039-final/xbmc/URL.h --- kodi-16.1~git20160425.1001-final/xbmc/URL.h 2016-01-11 16:50:51.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/URL.h 2014-12-18 01:01:55.000000000 +0000 @@ -67,7 +67,6 @@ char GetDirectorySeparator() const; std::string Get() const; - std::string GetWithoutOptions() const; std::string GetWithoutUserDetails(bool redact = false) const; std::string GetWithoutFilename() const; std::string GetRedacted() const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/Util.cpp kodi-15.2~git20151019.1039-final/xbmc/Util.cpp --- kodi-16.1~git20160425.1001-final/xbmc/Util.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/Util.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -41,7 +41,6 @@ #include "android/bionic_supplement/bionic_supplement.h" #endif #include -#include #include "Application.h" #include "Util.h" @@ -96,6 +95,8 @@ #include "cores/dvdplayer/DVDDemuxers/DVDDemux.h" +using namespace std; + #ifdef HAS_DVD_DRIVE using namespace MEDIA_DETECT; #endif @@ -166,6 +167,13 @@ strFilename = url.GetHostName(); } } + // HDHomerun Devices + else if (url.IsProtocol("hdhomerun") && strFilename.empty()) + strFilename = "HDHomerun Devices"; + + // Slingbox Devices + else if (url.IsProtocol("sling")) + strFilename = "Slingbox"; // SAP Streams else if (url.IsProtocol("sap") && strFilename.empty()) @@ -187,7 +195,7 @@ strFilename = URIUtils::GetFileName(url.GetHostName()); // now remove the extension if needed - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWEXTENSIONS) && !bIsFolder) + if (!CSettings::Get().GetBool("filelists.showextensions") && !bIsFolder) { URIUtils::RemoveExtension(strFilename); return strFilename; @@ -210,7 +218,7 @@ if (strFileName == "..") return; - const std::vector ®exps = g_advancedSettings.m_videoCleanStringRegExps; + const vector ®exps = g_advancedSettings.m_videoCleanStringRegExps; CRegExp reTags(true, CRegExp::autoUtf8); CRegExp reYear(false, CRegExp::autoUtf8); @@ -387,7 +395,7 @@ } #endif size_t last_sep = strHomePath.find_last_of(PATH_SEPARATOR_CHAR); - if (last_sep != std::string::npos) + if (last_sep != string::npos) strPath = strHomePath.substr(0, last_sep); else strPath = strHomePath; @@ -424,7 +432,8 @@ if (StringUtils::StartsWithNoCase(strFile, "pvr://channels")) return true; - if(StringUtils::StartsWithNoCase(strFile, "sap:")) + if(URIUtils::IsHDHomeRun(strFile) + || StringUtils::StartsWithNoCase(strFile, "sap:")) return true; return false; @@ -441,7 +450,7 @@ g_advancedSettings.m_pictureExtensions + "|.tbn|.dds"); } -bool CUtil::ExcludeFileOrFolder(const std::string& strFileOrFolder, const std::vector& regexps) +bool CUtil::ExcludeFileOrFolder(const std::string& strFileOrFolder, const vector& regexps) { if (strFileOrFolder.empty()) return false; @@ -528,7 +537,7 @@ if ( URIUtils::IsDVD(strPath) ) { - strIcon = "DefaultDVDFull.png"; + strIcon = "DefaultDVDRom.png"; return ; } @@ -555,7 +564,7 @@ void CUtil::RemoveTempFiles() { - std::string searchPath = CProfilesManager::GetInstance().GetDatabaseFolder(); + std::string searchPath = CProfilesManager::Get().GetDatabaseFolder(); CFileItemList items; if (!XFILE::CDirectory::GetDirectory(searchPath, items, ".tmp", DIR_FLAG_NO_FILE_DIRS)) return; @@ -605,6 +614,8 @@ } } +static const char * sub_exts[] = { ".srt", ".idx", ".sub", ".ass", ".utf", ".utf8", ".utf-8", ".smi", ".rt", ".txt", ".ssa", ".aqt", ".jss", NULL}; + int64_t CUtil::ToInt64(uint32_t high, uint32_t low) { int64_t n; @@ -807,12 +818,12 @@ return false; } - std::vector dirs = URIUtils::SplitPath(strPath); + vector dirs = URIUtils::SplitPath(strPath); if (dirs.empty()) return false; std::string dir(dirs.front()); URIUtils::AddSlashAtEnd(dir); - for (std::vector::const_iterator it = dirs.begin() + 1; it != dirs.end(); it ++) + for (vector::const_iterator it = dirs.begin() + 1; it != dirs.end(); it ++) { dir = URIUtils::AddFileToFolder(dir, *it); CDirectory::Create(dir); @@ -857,7 +868,7 @@ return strPathAndFile; // we don't support writing anywhere except HD, SMB and NFS - no need to legalize path bool trailingSlash = URIUtils::HasSlashAtEnd(strPathAndFile); - std::vector dirs = URIUtils::SplitPath(strPathAndFile); + vector dirs = URIUtils::SplitPath(strPathAndFile); if (dirs.empty()) return strPathAndFile; // we just add first token to path and don't legalize it - possible values: @@ -865,7 +876,7 @@ // "protocol://domain" std::string dir(dirs.front()); URIUtils::AddSlashAtEnd(dir); - for (std::vector::const_iterator it = dirs.begin() + 1; it != dirs.end(); it ++) + for (vector::const_iterator it = dirs.begin() + 1; it != dirs.end(); it ++) dir = URIUtils::AddFileToFolder(dir, MakeLegalFileName(*it, LegalType)); if (trailingSlash) URIUtils::AddSlashAtEnd(dir); return dir; @@ -930,10 +941,10 @@ bool CUtil::IsUsingTTFSubtitles() { - return URIUtils::HasExtension(CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_FONT), ".ttf"); + return URIUtils::HasExtension(CSettings::Get().GetString("subtitles.font"), ".ttf"); } -void CUtil::SplitExecFunction(const std::string &execString, std::string &function, std::vector ¶meters) +void CUtil::SplitExecFunction(const std::string &execString, std::string &function, vector ¶meters) { std::string paramString; @@ -1130,7 +1141,7 @@ } // doesnt match a name, so try the source path - std::vector vecPaths; + vector vecPaths; // add any concatenated paths if they exist if (share.vecPaths.size() > 0) @@ -1217,24 +1228,24 @@ return URIUtils::AddFileToFolder("special://cdrips/", strSpecial.substr(7)); // this one will be removed post 2.0 else if (StringUtils::StartsWithNoCase(strSpecial, "$playlists")) - return URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH), strSpecial.substr(10)); + return URIUtils::AddFileToFolder(CSettings::Get().GetString("system.playlistspath"), strSpecial.substr(10)); } return strSpecial; } std::string CUtil::MusicPlaylistsLocation() { - std::vector vec; - vec.push_back(URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH), "music")); - vec.push_back(URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH), "mixed")); + vector vec; + vec.push_back(URIUtils::AddFileToFolder(CSettings::Get().GetString("system.playlistspath"), "music")); + vec.push_back(URIUtils::AddFileToFolder(CSettings::Get().GetString("system.playlistspath"), "mixed")); return XFILE::CMultiPathDirectory::ConstructMultiPath(vec); } std::string CUtil::VideoPlaylistsLocation() { - std::vector vec; - vec.push_back(URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH), "video")); - vec.push_back(URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH), "mixed")); + vector vec; + vec.push_back(URIUtils::AddFileToFolder(CSettings::Get().GetString("system.playlistspath"), "video")); + vec.push_back(URIUtils::AddFileToFolder(CSettings::Get().GetString("system.playlistspath"), "mixed")); return XFILE::CMultiPathDirectory::ConstructMultiPath(vec); } @@ -1298,7 +1309,7 @@ void CUtil::ForceForwardSlashes(std::string& strPath) { size_t iPos = strPath.rfind('\\'); - while (iPos != std::string::npos) + while (iPos != string::npos) { strPath.at(iPos) = '/'; iPos = strPath.rfind('\\'); @@ -1419,11 +1430,8 @@ return ""; } -void CUtil::GetSkinThemes(std::vector& vecTheme) +void CUtil::GetSkinThemes(vector& vecTheme) { - static const std::string TexturesXbt = "Textures.xbt"; - static const std::string TexturesXpr = "Textures.xpr"; - std::string strPath = URIUtils::AddFileToFolder(g_graphicsContext.GetMediaDir(), "media"); CFileItemList items; CDirectory::GetDirectory(strPath, items); @@ -1434,24 +1442,15 @@ if (!pItem->m_bIsFolder) { std::string strExtension = URIUtils::GetExtension(pItem->GetPath()); - std::string strLabel = pItem->GetLabel(); - if ((strExtension == ".xpr" && !StringUtils::EqualsNoCase(strLabel, TexturesXpr)) || - (strExtension == ".xbt" && !StringUtils::EqualsNoCase(strLabel, TexturesXbt))) - vecTheme.push_back(StringUtils::Left(strLabel, strLabel.size() - strExtension.size())); - } - else - { - // check if this is an xbt:// VFS path - CURL itemUrl(pItem->GetPath()); - if (!itemUrl.IsProtocol("xbt") || !itemUrl.GetFileName().empty()) - continue; - - std::string strLabel = URIUtils::GetFileName(itemUrl.GetHostName()); - if (!StringUtils::EqualsNoCase(strLabel, TexturesXbt)) - vecTheme.push_back(StringUtils::Left(strLabel, strLabel.size() - URIUtils::GetExtension(strLabel).size())); + if ((strExtension == ".xpr" && !StringUtils::EqualsNoCase(pItem->GetLabel(), "Textures.xpr")) || + (strExtension == ".xbt" && !StringUtils::EqualsNoCase(pItem->GetLabel(), "Textures.xbt"))) + { + std::string strLabel = pItem->GetLabel(); + vecTheme.push_back(strLabel.substr(0, strLabel.size() - 4)); + } } } - std::sort(vecTheme.begin(), vecTheme.end(), sortstringbyname()); + sort(vecTheme.begin(), vecTheme.end(), sortstringbyname()); } void CUtil::InitRandomSeed() @@ -1467,13 +1466,13 @@ #ifdef TARGET_POSIX bool CUtil::RunCommandLine(const std::string& cmdLine, bool waitExit) { - std::vector args = StringUtils::Split(cmdLine, ","); + vector args = StringUtils::Split(cmdLine, ","); // Strip quotes and whitespace around the arguments, or exec will fail. // This allows the python invocation to be written more naturally with any amount of whitespace around the args. // But it's still limited, for example quotes inside the strings are not expanded, etc. // TODO: Maybe some python library routine can parse this more properly ? - for (std::vector::iterator it = args.begin(); it != args.end(); ++it) + for (vector::iterator it = args.begin(); it != args.end(); ++it) { size_t pos; pos = it->find_first_not_of(" \t\n\"'"); @@ -1711,66 +1710,94 @@ return strFrameworksPath; } -void CUtil::GetVideoBasePathAndFileName(const std::string& videoPath, std::string& basePath, std::string& videoFileName) +void CUtil::ScanForExternalSubtitles(const std::string& strMovie, std::vector& vecSubtitles ) { - CFileItem item(videoPath, false); - videoFileName = URIUtils::ReplaceExtension(URIUtils::GetFileName(videoPath), ""); + unsigned int startTimer = XbmcThreads::SystemClockMillis(); + + CFileItem item(strMovie, false); + if ( item.IsInternetStream() + || item.IsHDHomeRun() + || item.IsSlingbox() + || item.IsPlayList() + || item.IsLiveTV() + || !item.IsVideo()) + return; + + CLog::Log(LOGDEBUG,"%s: Searching for subtitles...", __FUNCTION__); + + std::string strBasePath; + std::string strSubtitle = URIUtils::ReplaceExtension(URIUtils::GetFileName(strMovie), ""); if (item.HasVideoInfoTag()) - basePath = item.GetVideoInfoTag()->m_basePath; + strBasePath = item.GetVideoInfoTag()->m_basePath; - if (basePath.empty() && item.IsOpticalMediaFile()) - basePath = item.GetLocalMetadataPath(); + if (strBasePath.empty() && item.IsOpticalMediaFile()) + strBasePath = item.GetLocalMetadataPath(); - CURL url(videoPath); - if (basePath.empty() && url.IsProtocol("bluray")) + CURL url(strMovie); + if (strBasePath.empty() && url.IsProtocol("bluray")) { - basePath = url.GetHostName(); - videoFileName = URIUtils::ReplaceExtension(GetTitleFromPath(url.GetHostName()), ""); + strBasePath = url.GetHostName(); + strSubtitle = URIUtils::ReplaceExtension(GetTitleFromPath(url.GetHostName()), ""); url = CURL(url.GetHostName()); if (url.IsProtocol("udf")) - basePath = URIUtils::GetParentPath(url.GetHostName()); + strBasePath = URIUtils::GetParentPath(url.GetHostName()); } - if (basePath.empty()) - basePath = URIUtils::GetBasePath(videoPath); -} + if (strBasePath.empty()) + strBasePath = URIUtils::GetBasePath(strMovie); + + CFileItemList items; + vector strLookInPaths; -void CUtil::GetItemsToScan(const std::string& videoPath, - const std::string& item_exts, - const std::vector& sub_dirs, - CFileItemList& items) -{ int flags = DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_NO_FILE_INFO; - if (!videoPath.empty()) - CDirectory::GetDirectory(videoPath, items, item_exts, flags); + if (!strBasePath.empty()) + CDirectory::GetDirectory(strBasePath, items, g_advancedSettings.m_subtitlesExtensions, flags); + + const std::vector common_sub_dirs = {"subs", "subtitles", "vobsubs", "sub", "vobsub", "subtitle"}; - std::vector additionalPaths; for (int i = 0; i < items.Size(); ++i) { - for (const auto& subdir : sub_dirs) + for (const auto& subdir : common_sub_dirs) { if (StringUtils::EqualsNoCase(items[i]->GetLabel(), subdir)) - additionalPaths.push_back(items[i]->GetPath()); + strLookInPaths.push_back(items[i]->GetPath()); } } - for (std::vector::const_iterator it = additionalPaths.begin(); it != additionalPaths.end(); ++it) + if (!CMediaSettings::Get().GetAdditionalSubtitleDirectoryChecked() && !CSettings::Get().GetString("subtitles.custompath").empty()) // to avoid checking non-existent directories (network) every time.. + { + if (!g_application.getNetwork().IsAvailable() && !URIUtils::IsHD(CSettings::Get().GetString("subtitles.custompath"))) + { + CLog::Log(LOGINFO,"CUtil::CacheSubtitles: disabling alternate subtitle directory for this session, it's nonaccessible"); + CMediaSettings::Get().SetAdditionalSubtitleDirectoryChecked(-1); // disabled + } + else if (!CDirectory::Exists(CSettings::Get().GetString("subtitles.custompath"))) + { + CLog::Log(LOGINFO,"CUtil::CacheSubtitles: disabling alternate subtitle directory for this session, it's nonexistant"); + CMediaSettings::Get().SetAdditionalSubtitleDirectoryChecked(-1); // disabled + } + + CMediaSettings::Get().SetAdditionalSubtitleDirectoryChecked(1); + } + + // this is last because we dont want to check any common subdirs or cd-dirs in the alternate dir. + if (CMediaSettings::Get().GetAdditionalSubtitleDirectoryChecked() == 1) + { + std::string strPath2 = CSettings::Get().GetString("subtitles.custompath"); + URIUtils::AddSlashAtEnd(strPath2); + strLookInPaths.push_back(strPath2); + } + + for (std::vector::const_iterator it = strLookInPaths.begin(); it != strLookInPaths.end(); ++it) { CFileItemList moreItems; CDirectory::GetDirectory(*it, moreItems, g_advancedSettings.m_subtitlesExtensions, flags); items.Append(moreItems); } -} - -void CUtil::ScanPathsForAssociatedItems(const std::string& videoName, - const CFileItemList& items, - const std::vector& item_exts, - std::vector& associatedFiles) -{ for (int i = 0; i < items.Size(); ++i) { CFileItemPtr pItem = items[i]; @@ -1780,31 +1807,57 @@ std::string strCandidate = URIUtils::GetFileName(pItem->GetPath()); URIUtils::RemoveExtension(strCandidate); - if (StringUtils::StartsWithNoCase(strCandidate, videoName)) + if (StringUtils::StartsWithNoCase(strCandidate, strSubtitle)) { if (URIUtils::IsRAR(pItem->GetPath()) || URIUtils::IsZIP(pItem->GetPath())) - CUtil::ScanArchiveForAssociatedItems(pItem->GetPath(), "", item_exts, associatedFiles); + CUtil::ScanArchiveForSubtitles(pItem->GetPath(), "", vecSubtitles); else { - associatedFiles.push_back(pItem->GetPath()); - CLog::Log(LOGINFO, "%s: found associated file %s\n", __FUNCTION__, CURL::GetRedacted(pItem->GetPath()).c_str()); + vecSubtitles.push_back(pItem->GetPath()); + CLog::Log(LOGINFO, "%s: found subtitle file %s\n", __FUNCTION__, CURL::GetRedacted(pItem->GetPath()).c_str()); } } else { if (URIUtils::IsRAR(pItem->GetPath()) || URIUtils::IsZIP(pItem->GetPath())) - CUtil::ScanArchiveForAssociatedItems(pItem->GetPath(), videoName, item_exts, associatedFiles); + CUtil::ScanArchiveForSubtitles(pItem->GetPath(), strSubtitle, vecSubtitles); } } + + int iSize = vecSubtitles.size(); + for (int i = 0; i < iSize; i++) + { + if (URIUtils::HasExtension(vecSubtitles[i], ".smi")) + { + //Cache multi-language sami subtitle + CDVDSubtitleStream* pStream = new CDVDSubtitleStream(); + if(pStream->Open(vecSubtitles[i])) + { + CDVDSubtitleTagSami TagConv; + TagConv.LoadHead(pStream); + if (TagConv.m_Langclass.size() >= 2) + { + for (unsigned int k = 0; k < TagConv.m_Langclass.size(); k++) + { + std::string strDest = StringUtils::Format("special://temp/subtitle.%s.%d.smi", TagConv.m_Langclass[k].Name.c_str(), i); + if (CFile::Copy(vecSubtitles[i], strDest)) + { + CLog::Log(LOGINFO, " cached subtitle %s->%s\n", CURL::GetRedacted(vecSubtitles[i]).c_str(), strDest.c_str()); + vecSubtitles.push_back(strDest); + } + } + } + } + delete pStream; + } + } + CLog::Log(LOGDEBUG,"%s: END (total time: %i ms)", __FUNCTION__, (int)(XbmcThreads::SystemClockMillis() - startTimer)); } -int CUtil::ScanArchiveForAssociatedItems(const std::string& strArchivePath, - const std::string& videoNameNoExt, - const std::vector& item_exts, - std::vector& associatedFiles) +int CUtil::ScanArchiveForSubtitles(const std::string& strArchivePath, const std::string& strMovieFileNameNoExt, std::vector& vecSubtitles) { - CLog::LogFunction(LOGDEBUG, __FUNCTION__, "Scanning archive %s", strArchivePath.c_str()); - int nItemsAdded = 0; + CLog::Log(LOGDEBUG, "ScanArchiveForSubtitles:: Scanning archive %s", strArchivePath.c_str()); + int nSubtitlesAdded = 0; CFileItemList ItemList; // zip only gets the root dir @@ -1841,17 +1894,18 @@ archInArch = URIUtils::CreateArchivePath("rar", pathToUrl, strPathInRar).Get(); } - ScanArchiveForAssociatedItems(archInArch, videoNameNoExt, item_exts, associatedFiles); + ScanArchiveForSubtitles(archInArch, strMovieFileNameNoExt, vecSubtitles); continue; } // check that the found filename matches the movie filename - int fnl = videoNameNoExt.size(); - if (fnl && !StringUtils::StartsWithNoCase(URIUtils::GetFileName(strPathInRar), videoNameNoExt)) + int fnl = strMovieFileNameNoExt.size(); + if (fnl && !StringUtils::StartsWithNoCase(URIUtils::GetFileName(strPathInRar), strMovieFileNameNoExt)) continue; - for (auto ext : item_exts) + int iPos = 0; + while (sub_exts[iPos]) { - if (StringUtils::EqualsNoCase(strExt, ext)) + if (StringUtils::EqualsNoCase(strExt, sub_exts[iPos])) { CURL pathToURL(strArchivePath); std::string strSourceUrl; @@ -1860,106 +1914,17 @@ else strSourceUrl = strPathInRar; - CLog::Log(LOGINFO, "%s: found associated file %s\n", __FUNCTION__, strSourceUrl.c_str()); - associatedFiles.push_back(strSourceUrl); - nItemsAdded++; + CLog::Log(LOGINFO, "%s: found subtitle file %s\n", __FUNCTION__, strSourceUrl.c_str()); + vecSubtitles.push_back(strSourceUrl); + nSubtitlesAdded++; break; } - } - } - - return nItemsAdded; -} - -void CUtil::ScanForExternalSubtitles(const std::string& strMovie, std::vector& vecSubtitles) -{ - unsigned int startTimer = XbmcThreads::SystemClockMillis(); - - CFileItem item(strMovie, false); - if (item.IsInternetStream() - || item.IsPlayList() - || item.IsLiveTV() - || !item.IsVideo()) - return; - - CLog::Log(LOGDEBUG, "%s: Searching for subtitles...", __FUNCTION__); - - std::string strBasePath; - std::string strSubtitle; - GetVideoBasePathAndFileName(strMovie, strBasePath, strSubtitle); - - CFileItemList items; - const std::vector common_sub_dirs = { "subs", "subtitles", "vobsubs", "sub", "vobsub", "subtitle" }; - GetItemsToScan(strBasePath, g_advancedSettings.m_subtitlesExtensions, common_sub_dirs, items); - - if (!CMediaSettings::GetInstance().GetAdditionalSubtitleDirectoryChecked() && !CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_CUSTOMPATH).empty()) // to avoid checking non-existent directories (network) every time.. - { - if (!g_application.getNetwork().IsAvailable() && !URIUtils::IsHD(CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_CUSTOMPATH))) - { - CLog::Log(LOGINFO, "CUtil::CacheSubtitles: disabling alternate subtitle directory for this session, it's nonaccessible"); - CMediaSettings::GetInstance().SetAdditionalSubtitleDirectoryChecked(-1); // disabled + iPos++; } - else if (!CDirectory::Exists(CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_CUSTOMPATH))) - { - CLog::Log(LOGINFO, "CUtil::CacheSubtitles: disabling alternate subtitle directory for this session, it's nonexistant"); - CMediaSettings::GetInstance().SetAdditionalSubtitleDirectoryChecked(-1); // disabled - } - - CMediaSettings::GetInstance().SetAdditionalSubtitleDirectoryChecked(1); } - std::vector strLookInPaths; - // this is last because we dont want to check any common subdirs or cd-dirs in the alternate dir. - if (CMediaSettings::GetInstance().GetAdditionalSubtitleDirectoryChecked() == 1) - { - std::string strPath2 = CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_CUSTOMPATH); - URIUtils::AddSlashAtEnd(strPath2); - strLookInPaths.push_back(strPath2); - } - - int flags = DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_NO_FILE_INFO; - for (std::vector::const_iterator it = strLookInPaths.begin(); it != strLookInPaths.end(); ++it) - { - CFileItemList moreItems; - CDirectory::GetDirectory(*it, moreItems, g_advancedSettings.m_subtitlesExtensions, flags); - items.Append(moreItems); - } - - std::vector exts = StringUtils::Split(g_advancedSettings.m_subtitlesExtensions, '|'); - exts.erase(std::remove(exts.begin(), exts.end(), ".zip"), exts.end()); - exts.erase(std::remove(exts.begin(), exts.end(), ".rar"), exts.end()); - - ScanPathsForAssociatedItems(strSubtitle, items, exts, vecSubtitles); - - int iSize = vecSubtitles.size(); - for (int i = 0; i < iSize; i++) - { - if (URIUtils::HasExtension(vecSubtitles[i], ".smi")) - { - //Cache multi-language sami subtitle - CDVDSubtitleStream* pStream = new CDVDSubtitleStream(); - if (pStream->Open(vecSubtitles[i])) - { - CDVDSubtitleTagSami TagConv; - TagConv.LoadHead(pStream); - if (TagConv.m_Langclass.size() >= 2) - { - for (unsigned int k = 0; k < TagConv.m_Langclass.size(); k++) - { - std::string strDest = StringUtils::Format("special://temp/subtitle.%s.%d.smi", TagConv.m_Langclass[k].Name.c_str(), i); - if (CFile::Copy(vecSubtitles[i], strDest)) - { - CLog::Log(LOGINFO, " cached subtitle %s->%s\n", CURL::GetRedacted(vecSubtitles[i]).c_str(), strDest.c_str()); - vecSubtitles.push_back(strDest); - } - } - } - } - delete pStream; - } - } - CLog::Log(LOGDEBUG, "%s: END (total time: %i ms)", __FUNCTION__, (int)(XbmcThreads::SystemClockMillis() - startTimer)); + return nSubtitlesAdded; } void CUtil::GetExternalStreamDetailsFromFilename(const std::string& strVideo, const std::string& strStream, ExternalStreamInfo& info) @@ -1981,7 +1946,7 @@ } // trim any non-alphanumeric char in the begining - std::string::iterator result = std::find_if(toParse.begin(), toParse.end(), StringUtils::isasciialphanum); + std::string::iterator result = std::find_if(toParse.begin(), toParse.end(), ::isalnum); std::string name; if (result != toParse.end()) // if we have anything to parse diff -Nru kodi-16.1~git20160425.1001-final/xbmc/Util.h kodi-15.2~git20151019.1039-final/xbmc/Util.h --- kodi-16.1~git20160425.1001-final/xbmc/Util.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/Util.h 2015-10-19 08:39:16.000000000 +0000 @@ -83,6 +83,7 @@ static void ClearSubtitles(); static void ScanForExternalSubtitles(const std::string& strMovie, std::vector& vecSubtitles ); + static int ScanArchiveForSubtitles( const std::string& strArchivePath, const std::string& strMovieFileNameNoExt, std::vector& vecSubtitles ); static void GetExternalStreamDetailsFromFilename(const std::string& strMovie, const std::string& strSubtitles, ExternalStreamInfo& info); static bool FindVobSubPair( const std::vector& vecSubtitles, const std::string& strIdxPath, std::string& strSubPath ); static bool IsVobSub(const std::vector& vecSubtitles, const std::string& strSubPath); @@ -195,50 +196,6 @@ private: static unsigned int s_randomSeed; #endif - - protected: - /** \brief Retrieves the base path and the filename of a given video. - * \param[in] videoPath The full path of the video file. - * \param[out] basePath The base path of the given video. - * \param[out] videoFileName The file name of the given video.. - */ - static void GetVideoBasePathAndFileName(const std::string& videoPath, - std::string& basePath, - std::string& videoFileName); - - /** \brief Retrieves FileItems that could contain associated files of a given video. - * \param[in] videoPath The full path of the video file. - * \param[in] item_exts A | separated string of extensions specifying the associated files. - * \param[in] sub_dirs A vector of sub directory names to look for. - * \param[out] items A List of FileItems to scan for associated files. - */ - static void GetItemsToScan(const std::string& videoPath, - const std::string& item_exts, - const std::vector& sub_dirs, - CFileItemList& items); - - /** \brief Searches for associated files of a given video. - * \param[in] videoName The name of the video file. - * \param[in] items A List of FileItems to scan for associated files. - * \param[in] item_exts A vector of extensions specifying the associated files. - * \param[out] associatedFiles A vector containing the full paths of all found associated files. - */ - static void ScanPathsForAssociatedItems(const std::string& videoName, - const CFileItemList& items, - const std::vector& item_exts, - std::vector& associatedFiles); - - /** \brief Searches in an archive for associated files of a given video. - * \param[in] strArchivePath The full path of the archive. - * \param[in] videoNameNoExt The filename of the video without extension for which associated files should be retrieved. - * \param[in] item_exts A vector of extensions specifying the associated files. - * \param[out] associatedFiles A vector containing the full paths of all found associated files. - */ - static int ScanArchiveForAssociatedItems(const std::string& strArchivePath, - const std::string& videoNameNoExt, - const std::vector& item_exts, - std::vector& associatedFiles); - }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/AlarmClock.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/AlarmClock.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/AlarmClock.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/AlarmClock.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,19 +19,14 @@ */ #include "AlarmClock.h" - -#include - -#include "dialogs/GUIDialogKaiToast.h" -#include "events/EventLog.h" -#include "events/NotificationEvent.h" +#include "ApplicationMessenger.h" #include "guilib/LocalizeStrings.h" -#include "log.h" -#include "messaging/ApplicationMessenger.h" #include "threads/SingleLock.h" +#include "log.h" +#include "dialogs/GUIDialogKaiToast.h" #include "utils/StringUtils.h" -using namespace KODI::MESSAGING; +using namespace std; CAlarmClock::CAlarmClock() : CThread("AlarmClock"), m_bIsRunning(false) { @@ -58,25 +53,25 @@ m_bIsRunning = true; } - uint32_t labelAlarmClock; - uint32_t labelStarted; + std::string strAlarmClock; + std::string strStarted; if (StringUtils::EqualsNoCase(strName, "shutdowntimer")) { - labelAlarmClock = 20144; - labelStarted = 20146; + strAlarmClock = g_localizeStrings.Get(20144); + strStarted = g_localizeStrings.Get(20146); } else { - labelAlarmClock = 13208; - labelStarted = 13210; + strAlarmClock = g_localizeStrings.Get(13208); + strStarted = g_localizeStrings.Get(13210); } - EventPtr alarmClockActivity(new CNotificationEvent(labelAlarmClock, - StringUtils::Format(g_localizeStrings.Get(labelStarted).c_str(), static_cast(event.m_fSecs) / 60, static_cast(event.m_fSecs) % 60))); - if (bSilent) - CEventLog::GetInstance().Add(alarmClockActivity); - else - CEventLog::GetInstance().AddWithNotification(alarmClockActivity); + std::string strMessage = StringUtils::Format(strStarted.c_str(), + static_cast(event.m_fSecs)/60, + static_cast(event.m_fSecs)%60); + + if(!bSilent) + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, strAlarmClock, strMessage); event.watch.StartZero(); CSingleLock lock(m_events); @@ -90,16 +85,16 @@ std::string lowerName(strName); StringUtils::ToLower(lowerName); // lookup as lowercase only - std::map::iterator iter = m_event.find(lowerName); + map::iterator iter = m_event.find(lowerName); if (iter == m_event.end()) return; - uint32_t labelAlarmClock; + std::string strAlarmClock; if (StringUtils::EqualsNoCase(strName, "shutdowntimer")) - labelAlarmClock = 20144; + strAlarmClock = g_localizeStrings.Get(20144); else - labelAlarmClock = 13208; + strAlarmClock = g_localizeStrings.Get(13208); std::string strMessage; float elapsed = 0.f; @@ -107,25 +102,24 @@ if (iter->second.watch.IsRunning()) elapsed = iter->second.watch.GetElapsedSeconds(); - if (elapsed > iter->second.m_fSecs) + if( elapsed > iter->second.m_fSecs ) strMessage = g_localizeStrings.Get(13211); else { - float remaining = static_cast(iter->second.m_fSecs - elapsed); - strMessage = StringUtils::Format(g_localizeStrings.Get(13212).c_str(), static_cast(remaining) / 60, static_cast(remaining) % 60); + float remaining = static_cast(iter->second.m_fSecs-elapsed); + std::string strStarted = g_localizeStrings.Get(13212); + strMessage = StringUtils::Format(strStarted.c_str(), + static_cast(remaining)/60, + static_cast(remaining)%60); } - if (iter->second.m_strCommand.empty() || iter->second.m_fSecs > elapsed) { - EventPtr alarmClockActivity(new CNotificationEvent(labelAlarmClock, strMessage)); - if (bSilent) - CEventLog::GetInstance().Add(alarmClockActivity); - else - CEventLog::GetInstance().AddWithNotification(alarmClockActivity); + if(!bSilent) + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, strAlarmClock, strMessage); } else { - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, iter->second.m_strCommand); + CApplicationMessenger::Get().ExecBuiltIn(iter->second.m_strCommand); if (iter->second.m_loop) { iter->second.watch.Reset(); @@ -144,7 +138,7 @@ std::string strLast; { CSingleLock lock(m_events); - for (std::map::iterator iter=m_event.begin();iter != m_event.end(); ++iter) + for (map::iterator iter=m_event.begin();iter != m_event.end(); ++iter) if ( iter->second.watch.IsRunning() && iter->second.watch.GetElapsedSeconds() >= iter->second.m_fSecs) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/AMLUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/AMLUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/AMLUtils.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/AMLUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -32,7 +32,6 @@ #include "utils/StringUtils.h" #include "utils/AMLUtils.h" #include "guilib/gui3d.h" -#include "utils/RegExp.h" bool aml_present() { @@ -147,55 +146,85 @@ bool aml_support_hevc() { - static int has_hevc = -1; - - if (has_hevc == -1) + std::string valstr; + if(SysfsUtils::GetString("/sys/class/amstream/vcodec_profile", valstr) != 0) { - std::string valstr; - if(SysfsUtils::GetString("/sys/class/amstream/vcodec_profile", valstr) != 0) - has_hevc = 0; - else - has_hevc = (valstr.find("hevc:") != std::string::npos) ? 1: 0; + return false; } - return (has_hevc == 1); + return (valstr.find("hevc:") != std::string::npos); } -bool aml_support_hevc_4k2k() +enum AML_DEVICE_TYPE aml_get_device_type() { - static int has_hevc_4k2k = -1; - - if (has_hevc_4k2k == -1) + static enum AML_DEVICE_TYPE aml_device_type = AML_DEVICE_TYPE_UNINIT; + if (aml_device_type == AML_DEVICE_TYPE_UNINIT) { - CRegExp regexp; - regexp.RegComp("hevc:.*4k"); - std::string valstr; - if (SysfsUtils::GetString("/sys/class/amstream/vcodec_profile", valstr) != 0) - has_hevc_4k2k = 0; + std::string cpu_hardware = g_cpuInfo.getCPUHardware(); + + if (cpu_hardware.find("MESON-M1") != std::string::npos) + aml_device_type = AML_DEVICE_TYPE_M1; + else if (cpu_hardware.find("MESON-M3") != std::string::npos + || cpu_hardware.find("MESON3") != std::string::npos) + aml_device_type = AML_DEVICE_TYPE_M3; + else if (cpu_hardware.find("Meson6") != std::string::npos) + aml_device_type = AML_DEVICE_TYPE_M6; + else if ((cpu_hardware.find("Meson8") != std::string::npos) && (cpu_hardware.find("Meson8B") == std::string::npos)) + { + if (aml_support_hevc()) + aml_device_type = AML_DEVICE_TYPE_M8M2; + else + aml_device_type = AML_DEVICE_TYPE_M8; + } else if (cpu_hardware.find("Meson8B") != std::string::npos) + aml_device_type = AML_DEVICE_TYPE_M8B; else - has_hevc_4k2k = (regexp.RegFind(valstr) >= 0) ? 1 : 0; + aml_device_type = AML_DEVICE_TYPE_UNKNOWN; } - return (has_hevc_4k2k == 1); + + return aml_device_type; } -bool aml_support_h264_4k2k() +void aml_cpufreq_min(bool limit) { - static int has_h264_4k2k = -1; +// do not touch scaling_min_freq on android +#if !defined(TARGET_ANDROID) + // only needed for m1/m3 SoCs + if ( aml_get_device_type() != AML_DEVICE_TYPE_UNKNOWN + && aml_get_device_type() <= AML_DEVICE_TYPE_M3) + { + int cpufreq = 300000; + if (limit) + cpufreq = 600000; + + SysfsUtils::SetInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq", cpufreq); + } +#endif +} - if (has_h264_4k2k == -1) +void aml_cpufreq_max(bool limit) +{ + if (!aml_wired_present() && aml_get_device_type() == AML_DEVICE_TYPE_M6) { - std::string valstr; - if (SysfsUtils::GetString("/sys/class/amstream/vcodec_profile", valstr) != 0) - { - return false; - } - return (valstr.find("h264_4k2k:") != std::string::npos); + // this is a MX Stick, they cannot substain 1GHz + // operation without overheating so limit them to 800MHz. + int cpufreq = 1000000; + if (limit) + cpufreq = 800000; + + SysfsUtils::SetInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq", cpufreq); + SysfsUtils::SetString("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor", "ondemand"); } - return (has_h264_4k2k == 1); } void aml_set_audio_passthrough(bool passthrough) { - SysfsUtils::SetInt("/sys/class/audiodsp/digital_raw", passthrough ? 2:0); + if ( aml_present() + && aml_get_device_type() != AML_DEVICE_TYPE_UNKNOWN + && aml_get_device_type() <= AML_DEVICE_TYPE_M8) + { + // m1 uses 1, m3 and above uses 2 + int raw = aml_get_device_type() == AML_DEVICE_TYPE_M1 ? 1:2; + SysfsUtils::SetInt("/sys/class/audiodsp/digital_raw", passthrough ? raw:0); + } } void aml_probe_hdmi_audio() @@ -273,18 +302,6 @@ return value[param]; } -bool aml_IsHdmiConnected() -{ - int hpd_state; - SysfsUtils::GetInt("/sys/class/amhdmitx/amhdmitx0/hpd_state", hpd_state); - if (hpd_state == 2) - { - return 1; - } - - return 0; -} - bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res) { if (!res) @@ -312,43 +329,7 @@ res->fRefreshRate = 60; res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; } - else if ((StringUtils::EqualsNoCase(fromMode, "480cvbs")) || (StringUtils::EqualsNoCase(fromMode, "480i"))) - { - res->iWidth = 720; - res->iHeight= 480; - res->iScreenWidth = 720; - res->iScreenHeight= 480; - res->fRefreshRate = 60; - res->dwFlags = D3DPRESENTFLAG_INTERLACED; - } - else if ((StringUtils::EqualsNoCase(fromMode, "576cvbs")) || (StringUtils::EqualsNoCase(fromMode, "576i"))) - { - res->iWidth = 720; - res->iHeight= 576; - res->iScreenWidth = 720; - res->iScreenHeight= 576; - res->fRefreshRate = 50; - res->dwFlags = D3DPRESENTFLAG_INTERLACED; - } - else if (StringUtils::EqualsNoCase(fromMode, "480p")) - { - res->iWidth = 720; - res->iHeight= 480; - res->iScreenWidth = 720; - res->iScreenHeight= 480; - res->fRefreshRate = 60; - res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; - } - else if (StringUtils::EqualsNoCase(fromMode, "576p")) - { - res->iWidth = 720; - res->iHeight= 576; - res->iScreenWidth = 720; - res->iScreenHeight= 576; - res->fRefreshRate = 50; - res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; - } - else if (StringUtils::EqualsNoCase(fromMode, "720p") || StringUtils::EqualsNoCase(fromMode, "720p60hz")) + else if (StringUtils::EqualsNoCase(fromMode, "720p")) { res->iWidth = 1280; res->iHeight= 720; @@ -366,7 +347,7 @@ res->fRefreshRate = 50; res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; } - else if (StringUtils::EqualsNoCase(fromMode, "1080p") || StringUtils::EqualsNoCase(fromMode, "1080p60hz")) + else if (StringUtils::EqualsNoCase(fromMode, "1080p")) { res->iWidth = 1920; res->iHeight= 1080; @@ -420,7 +401,7 @@ res->fRefreshRate = 59.940; res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; } - else if (StringUtils::EqualsNoCase(fromMode, "1080i") || StringUtils::EqualsNoCase(fromMode, "1080i60hz")) + else if (StringUtils::EqualsNoCase(fromMode, "1080i")) { res->iWidth = 1920; res->iHeight= 1080; @@ -447,7 +428,7 @@ res->fRefreshRate = 59.940; res->dwFlags = D3DPRESENTFLAG_INTERLACED; } - else if (StringUtils::EqualsNoCase(fromMode, "4k2ksmpte") || StringUtils::EqualsNoCase(fromMode, "smpte24hz")) + else if (StringUtils::EqualsNoCase(fromMode, "4k2ksmpte")) { res->iWidth = 1920; res->iHeight= 1080; @@ -456,7 +437,7 @@ res->fRefreshRate = 24; res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; } - else if (StringUtils::EqualsNoCase(fromMode, "4k2k23hz") || StringUtils::EqualsNoCase(fromMode, "2160p23hz")) + else if (StringUtils::EqualsNoCase(fromMode, "4k2k23hz")) { res->iWidth = 1920; res->iHeight= 1080; @@ -465,7 +446,7 @@ res->fRefreshRate = 23.976; res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; } - else if (StringUtils::EqualsNoCase(fromMode, "4k2k24hz") || StringUtils::EqualsNoCase(fromMode, "2160p24hz")) + else if (StringUtils::EqualsNoCase(fromMode, "4k2k24hz")) { res->iWidth = 1920; res->iHeight= 1080; @@ -474,7 +455,7 @@ res->fRefreshRate = 24; res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; } - else if (StringUtils::EqualsNoCase(fromMode, "4k2k25hz") || StringUtils::EqualsNoCase(fromMode, "2160p25hz")) + else if (StringUtils::EqualsNoCase(fromMode, "4k2k25hz")) { res->iWidth = 1920; res->iHeight= 1080; @@ -483,7 +464,7 @@ res->fRefreshRate = 25; res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; } - else if (StringUtils::EqualsNoCase(fromMode, "4k2k29hz") || StringUtils::EqualsNoCase(fromMode, "2160p29hz")) + else if (StringUtils::EqualsNoCase(fromMode, "4k2k29hz")) { res->iWidth = 1920; res->iHeight= 1080; @@ -492,7 +473,7 @@ res->fRefreshRate = 29.970; res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; } - else if (StringUtils::EqualsNoCase(fromMode, "4k2k30hz") || StringUtils::EqualsNoCase(fromMode, "2160p30hz")) + else if (StringUtils::EqualsNoCase(fromMode, "4k2k30hz")) { res->iWidth = 1920; res->iHeight= 1080; @@ -501,24 +482,6 @@ res->fRefreshRate = 30; res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; } - else if (StringUtils::EqualsNoCase(fromMode, "2160p50hz420")) - { - res->iWidth = 1920; - res->iHeight= 1080; - res->iScreenWidth = 3840; - res->iScreenHeight= 2160; - res->fRefreshRate = 50; - res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; - } - else if (StringUtils::EqualsNoCase(fromMode, "2160p60hz420")) - { - res->iWidth = 1920; - res->iHeight= 1080; - res->iScreenWidth = 3840; - res->iScreenHeight= 2160; - res->fRefreshRate = 60; - res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE; - } else { return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/AMLUtils.h kodi-15.2~git20151019.1039-final/xbmc/utils/AMLUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/AMLUtils.h 2015-12-06 15:22:40.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/AMLUtils.h 2015-10-19 08:39:17.000000000 +0000 @@ -46,8 +46,8 @@ bool aml_hw3d_present(); bool aml_wired_present(); bool aml_support_hevc(); -bool aml_support_hevc_4k2k(); -bool aml_support_h264_4k2k(); +enum AML_DEVICE_TYPE aml_get_device_type(); +void aml_cpufreq_min(bool limit); +void aml_cpufreq_max(bool limit); void aml_set_audio_passthrough(bool passthrough); -bool aml_IsHdmiConnected(); bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Archive.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/Archive.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/Archive.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Archive.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -23,7 +23,7 @@ #include "Archive.h" #include "IArchivable.h" #include "filesystem/File.h" -#include "utils/Variant.h" +#include "Variant.h" #include "utils/log.h" #ifdef __GNUC__ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/AsyncFileCopy.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/AsyncFileCopy.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/AsyncFileCopy.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/AsyncFileCopy.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -25,7 +25,6 @@ #include "log.h" #include "utils/StringUtils.h" #include "URL.h" -#include "utils/Variant.h" CAsyncFileCopy::CAsyncFileCopy() : CThread("AsyncFileCopy") { @@ -66,19 +65,20 @@ // start the dialog up as needed if (dlg && !dlg->IsDialogRunning() && (XbmcThreads::SystemClockMillis() - time) > 500) // wait 0.5 seconds before starting dialog { - dlg->SetHeading(CVariant{heading}); - dlg->SetLine(0, CVariant{url1.GetWithoutUserDetails()}); - dlg->SetLine(1, CVariant{url2.GetWithoutUserDetails()}); + dlg->SetHeading(heading); + dlg->SetLine(0, url1.GetWithoutUserDetails()); + dlg->SetLine(1, url2.GetWithoutUserDetails()); dlg->SetPercentage(0); - dlg->Open(); + dlg->StartModal(); } // and update the dialog as we go if (dlg && dlg->IsDialogRunning()) { - dlg->SetHeading(CVariant{heading}); - dlg->SetLine(0, CVariant{url1.Get()}); - dlg->SetLine(1, CVariant{url2.Get()}); - dlg->SetLine(2, CVariant{ StringUtils::Format("%2.2f KB/s", m_speed / 1024) }); + std::string speedString = StringUtils::Format("%2.2f KB/s", m_speed / 1024); + dlg->SetHeading(heading); + dlg->SetLine(0, url1.Get()); + dlg->SetLine(1, url2.Get()); + dlg->SetLine(2, speedString); dlg->SetPercentage(m_percent); dlg->Progress(); m_cancelled = dlg->IsCanceled(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/AutoPtrHandle.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/AutoPtrHandle.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/AutoPtrHandle.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/AutoPtrHandle.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "AutoPtrHandle.h" + +using namespace AUTOPTR; + +CAutoPtrHandle::CAutoPtrHandle(HANDLE hHandle) + : m_hHandle(hHandle) +{} + +CAutoPtrHandle::~CAutoPtrHandle(void) +{ + Cleanup(); +} + +CAutoPtrHandle::operator HANDLE() +{ + return m_hHandle; +} + +void CAutoPtrHandle::attach(HANDLE hHandle) +{ + Cleanup(); + m_hHandle = hHandle; +} + +HANDLE CAutoPtrHandle::release() +{ + HANDLE hTmp = m_hHandle; + m_hHandle = INVALID_HANDLE_VALUE; + return hTmp; +} + +void CAutoPtrHandle::Cleanup() +{ + if ( isValid() ) + { + CloseHandle(m_hHandle); + m_hHandle = INVALID_HANDLE_VALUE; + } +} + +bool CAutoPtrHandle::isValid() const +{ + if ( INVALID_HANDLE_VALUE != m_hHandle) + return true; + return false; +} +void CAutoPtrHandle::reset() +{ + Cleanup(); +} + +//------------------------------------------------------------------------------- +CAutoPtrFind ::CAutoPtrFind(HANDLE hHandle) + : CAutoPtrHandle(hHandle) +{} +CAutoPtrFind::~CAutoPtrFind(void) +{ + Cleanup(); +} + +void CAutoPtrFind::Cleanup() +{ + if ( isValid() ) + { + FindClose(m_hHandle); + m_hHandle = INVALID_HANDLE_VALUE; + } +} + +//------------------------------------------------------------------------------- +CAutoPtrSocket::CAutoPtrSocket(SOCKET hSocket) + : m_hSocket(hSocket) +{} + +CAutoPtrSocket::~CAutoPtrSocket(void) +{ + Cleanup(); +} + +CAutoPtrSocket::operator SOCKET() +{ + return m_hSocket; +} + +void CAutoPtrSocket::attach(SOCKET hSocket) +{ + Cleanup(); + m_hSocket = hSocket; +} + +SOCKET CAutoPtrSocket::release() +{ + SOCKET hTmp = m_hSocket; + m_hSocket = INVALID_SOCKET; + return hTmp; +} + +void CAutoPtrSocket::Cleanup() +{ + if ( isValid() ) + { + closesocket(m_hSocket); + m_hSocket = INVALID_SOCKET; + } +} + +bool CAutoPtrSocket::isValid() const +{ + if ( INVALID_SOCKET != m_hSocket) + return true; + return false; +} +void CAutoPtrSocket::reset() +{ + Cleanup(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/AutoPtrHandle.h kodi-15.2~git20151019.1039-final/xbmc/utils/AutoPtrHandle.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/AutoPtrHandle.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/AutoPtrHandle.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,110 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "system.h" // for HANDLE and SOCKET +#include + +namespace AUTOPTR +{ +class CAutoPtrHandle +{ +public: + CAutoPtrHandle(HANDLE hHandle); + virtual ~CAutoPtrHandle(void); + operator HANDLE(); + void attach(HANDLE hHandle); + HANDLE release(); + bool isValid() const; + void reset(); +protected: + virtual void Cleanup(); + HANDLE m_hHandle; +}; + +class CAutoPtrFind : public CAutoPtrHandle +{ +public: + CAutoPtrFind(HANDLE hHandle); + virtual ~CAutoPtrFind(void); +protected: + virtual void Cleanup(); +}; + + +class CAutoPtrSocket +{ +public: + CAutoPtrSocket(SOCKET hSocket); + virtual ~CAutoPtrSocket(void); + operator SOCKET(); + void attach(SOCKET hSocket); + SOCKET release(); + bool isValid() const; + void reset(); +protected: + virtual void Cleanup(); + SOCKET m_hSocket; +}; + +/* + * This template class is very similar to the standard "unique_ptr", but it is + * used for *array* pointers rather than *object* pointers, i.e. the pointer + * passed to it must have been allocated with "new[]", and "auto_aptr" will + * delete it with "delete[]". + * + * Class released under GPL and was taken from: + * http://userpage.fu-berlin.de/~mbayer/tools/html2text.html + */ +template +class auto_aptr +{ + +public: + + // Constructor/copy/destroy + + explicit auto_aptr(T *x = 0) : p(x) {} + auto_aptr(const auto_aptr &x) : p(x.p) { ((auto_aptr *) &x)->p = 0; } + auto_aptr& operator=(const auto_aptr &x) + { delete[] p; p = x.p; ((auto_aptr *) &x)->p = 0; return *this; } + // Extension: "operator=(T *)" is identical to "auto_aptr::reset(T *)". + void operator=(T *x) { delete[] p; p = x; } + ~auto_aptr() { delete[] p; } + + // Members + + T &operator[](size_t idx) const { if (!p) abort(); return p[idx]; } +T *get() const { return (T *) p; } + T *release() { T *tmp = p; p = 0; return tmp; } + void reset(T *x = 0) { delete[] p; p = x; } + + // These would make a nice extension, but are not provided by many other + // implementations. + //operator const void *() const { return p; } + //int operator!() const { return p == 0; } + +private: + T *p; +}; + + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Base64.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/Base64.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/Base64.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Base64.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -22,6 +22,8 @@ #define PADDING '=' +using namespace std; + const std::string Base64::m_characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; @@ -125,7 +127,7 @@ void Base64::Decode(const std::string &input, std::string &output) { size_t length = input.find_first_of(PADDING); - if (length == std::string::npos) + if (length == string::npos) length = input.size(); Decode(input.c_str(), length, output); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/CharsetConverter.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/CharsetConverter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/CharsetConverter.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/CharsetConverter.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,22 +19,19 @@ */ #include "CharsetConverter.h" - -#include -#include - -#include +#include "utils/StringUtils.h" #include - -#include "guilib/LocalizeStrings.h" #include "LangInfo.h" -#include "log.h" +#include "guilib/LocalizeStrings.h" #include "settings/lib/Setting.h" #include "settings/Settings.h" -#include "system.h" #include "threads/SingleLock.h" -#include "utils/StringUtils.h" #include "utils/Utf8Utils.h" +#include "log.h" + +#include +#include +#include #if !defined(TARGET_WINDOWS) && defined(HAVE_CONFIG_H) #include "config.h" @@ -90,6 +87,7 @@ SystemCharset, UserCharset /* locale.charset */, SubtitleCharset /* subtitles.charset */, + KaraokeCharset /* karaoke.charset */ }; @@ -251,6 +249,14 @@ return g_langInfo.GetGuiCharSet(); case SubtitleCharset: return g_langInfo.GetSubtitleCharSet(); + case KaraokeCharset: + { + CSetting* karaokeSetting = CSettings::Get().GetSetting("karaoke.charset"); + if (karaokeSetting == NULL || ((CSettingString*)karaokeSetting)->GetValue() == "DEFAULT") + return g_langInfo.GetGuiCharSet(); + + return ((CSettingString*)karaokeSetting)->GetValue(); + } case NotSpecialCharset: default: return "UTF-8"; /* dummy value */ @@ -585,10 +591,12 @@ return; const std::string& settingId = setting->GetId(); - if (settingId == CSettings::SETTING_LOCALE_CHARSET) + if (settingId == "locale.charset") resetUserCharset(); - else if (settingId == CSettings::SETTING_SUBTITLES_CHARSET) + else if (settingId == "subtitles.charset") resetSubtitleCharset(); + else if (settingId == "karaoke.charset") + resetKaraokeCharset(); } void CCharsetConverter::clear() @@ -644,6 +652,7 @@ CInnerConverter::m_stdConversion[UserCharsetToUtf8].Reset(); CInnerConverter::m_stdConversion[Utf32ToUserCharset].Reset(); resetSubtitleCharset(); + resetKaraokeCharset(); } void CCharsetConverter::resetSubtitleCharset(void) @@ -651,9 +660,13 @@ CInnerConverter::m_stdConversion[SubtitleCharsetToUtf8].Reset(); } +void CCharsetConverter::resetKaraokeCharset(void) +{ +} + void CCharsetConverter::reinitCharsetsFromSettings(void) { - resetUserCharset(); // this will also reinit Subtitle charsets + resetUserCharset(); // this will also reinit Subtitle and Karaoke charsets } bool CCharsetConverter::utf8ToUtf32(const std::string& utf8StringSrc, std::u32string& utf32StringDst, bool failOnBadChar /*= true*/) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/CharsetConverter.h kodi-15.2~git20151019.1039-final/xbmc/utils/CharsetConverter.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/CharsetConverter.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/CharsetConverter.h 2015-10-19 08:39:17.000000000 +0000 @@ -21,14 +21,13 @@ * */ -#include -#include -#include - #include "settings/lib/ISettingCallback.h" #include "utils/GlobalsHandling.h" #include "utils/uXstrings.h" +#include +#include + class CSetting; class CCharsetConverter : public ISettingCallback @@ -36,7 +35,7 @@ public: CCharsetConverter(); - virtual void OnSettingChanged(const CSetting* setting) override; + virtual void OnSettingChanged(const CSetting* setting); static void reset(); static void resetSystemCharset(); @@ -168,11 +167,12 @@ private: static void resetUserCharset(void); static void resetSubtitleCharset(void); + static void resetKaraokeCharset(void); static const int m_Utf8CharMinSize, m_Utf8CharMaxSize; class CInnerConverter; }; -XBMC_GLOBAL_REF(CCharsetConverter,g_charsetConverter); -#define g_charsetConverter XBMC_GLOBAL_USE(CCharsetConverter) +XBMC_GLOBAL(CCharsetConverter,g_charsetConverter); + #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/CPUInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/CPUInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/CPUInfo.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/CPUInfo.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -99,6 +99,8 @@ #include "utils/StringUtils.h" +using namespace std; + // In milliseconds #define MINIMUM_TIME_BETWEEN_READS 500 @@ -412,14 +414,6 @@ } } fclose(fCPUInfo); - // /proc/cpuinfo is not reliable on some Android platforms - // At least we should get the correct cpu count for multithreaded decoding -#if defined(TARGET_ANDROID) - if (CAndroidFeatures::GetCPUCount() > m_cpuCount) - { - m_cpuCount = CAndroidFeatures::GetCPUCount(); - } -#endif } else { @@ -640,7 +634,7 @@ bool CCPUInfo::HasCoreId(int nCoreId) const { - std::map::const_iterator iter = m_cores.find(nCoreId); + map::const_iterator iter = m_cores.find(nCoreId); if (iter != m_cores.end()) return true; return false; @@ -648,7 +642,7 @@ const CoreInfo &CCPUInfo::GetCoreInfo(int nCoreId) { - std::map::iterator iter = m_cores.find(nCoreId); + map::iterator iter = m_cores.find(nCoreId); if (iter != m_cores.end()) return iter->second; @@ -737,7 +731,7 @@ coreIO = cptimes[i * CPUSTATES + CP_INTR]; coreIdle = cptimes[i * CPUSTATES + CP_IDLE]; - std::map::iterator iter = m_cores.find(i); + map::iterator iter = m_cores.find(i); if (iter != m_cores.end()) { coreUser -= iter->second.m_user; @@ -795,7 +789,7 @@ if (num < 6) coreIO = 0; - std::map::iterator iter = m_cores.find(nCpu); + map::iterator iter = m_cores.find(nCpu); if (num > 4 && iter != m_cores.end()) { coreUser -= iter->second.m_user; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/CryptThreading.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/CryptThreading.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/CryptThreading.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/CryptThreading.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -40,12 +40,9 @@ #include #include -#if GCRYPT_VERSION_NUMBER < 0x010600 GCRY_THREAD_OPTION_PTHREAD_IMPL; #endif -#endif - /* ========================================================================= */ /* openssl locking implementation for curl */ static CCriticalSection* getlock(int index) @@ -85,12 +82,10 @@ locks[i] = NULL; #ifdef HAVE_GCRYPT -#if GCRYPT_VERSION_NUMBER < 0x010600 // set up gcrypt gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); attemptedToSetSSLMTHook = true; #endif -#endif if (!attemptedToSetSSLMTHook) CLog::Log(LOGWARNING, "Could not determine the libcurl security library to set the locking scheme. This may cause problem with multithreaded use of ssl or libraries that depend on it (libcurl)."); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/DatabaseUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/DatabaseUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/DatabaseUtils.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/DatabaseUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -74,7 +74,7 @@ else if (field == FieldMusicLabel) return "albumview.strLabel"; else if (field == FieldAlbumType) return "albumview.strType"; else if (field == FieldRating) return "albumview.iRating"; - else if (field == FieldDateAdded) return "albumview.dateAdded"; + else if (field == FieldDateAdded && queryPart == DatabaseQueryPartOrderBy) return "albumview.idalbum"; // only used for order clauses else if (field == FieldPlaycount) return "albumview.iTimesPlayed"; } else if (mediaType == MediaTypeSong) @@ -96,7 +96,7 @@ else if (field == FieldPath) return "songview.strPath"; else if (field == FieldArtist || field == FieldAlbumArtist) return "songview.strArtists"; else if (field == FieldGenre) return "songview.strGenre"; - else if (field == FieldDateAdded) return "songview.dateAdded"; + else if (field == FieldDateAdded && queryPart == DatabaseQueryPartOrderBy) return "songview.idSong"; // only used for order clauses } else if (mediaType == MediaTypeArtist) { @@ -111,7 +111,6 @@ else if (field == FieldBandFormed) return "artistview.strFormed"; else if (field == FieldDisbanded) return "artistview.strDisbanded"; else if (field == FieldDied) return "artistview.strDied"; - else if (field == FieldDateAdded) return "artistview.dateAdded"; } else if (mediaType == MediaTypeMusicVideo) { @@ -132,7 +131,6 @@ else if (field == FieldPlaycount) return "musicvideo_view.playCount"; else if (field == FieldLastPlayed) return "musicvideo_view.lastPlayed"; else if (field == FieldDateAdded) return "musicvideo_view.dateAdded"; - else if (field == FieldUserRating) return "musicvideo_view.userrating"; if (!result.empty()) return result; @@ -177,7 +175,6 @@ else if (field == FieldPlaycount) return "movie_view.playCount"; else if (field == FieldLastPlayed) return "movie_view.lastPlayed"; else if (field == FieldDateAdded) return "movie_view.dateAdded"; - else if (field == FieldUserRating) return "movie_view.userrating"; if (!result.empty()) return result; @@ -209,7 +206,6 @@ else if (field == FieldSeason) return "tvshow_view.totalSeasons"; else if (field == FieldNumberOfEpisodes) return "tvshow_view.totalCount"; else if (field == FieldNumberOfWatchedEpisodes) return "tvshow_view.watchedcount"; - else if (field == FieldUserRating) return "tvshow_view.userrating"; if (!result.empty()) return result; @@ -240,7 +236,6 @@ else if (field == FieldYear) return "episode_view.premiered"; else if (field == FieldMPAA) return "episode_view.mpaa"; else if (field == FieldStudio) return "episode_view.strStudio"; - else if (field == FieldUserRating) return "episode_view.userrating"; if (!result.empty()) return result; @@ -493,7 +488,6 @@ else if (field == FieldAlbumType) return CMusicDatabase::album_strType; else if (field == FieldRating) return CMusicDatabase::album_iRating; else if (field == FieldPlaycount) return CMusicDatabase::album_iTimesPlayed; - else if (field == FieldDateAdded) return CMusicDatabase::album_dtDateAdded; } else if (mediaType == MediaTypeSong) { @@ -507,7 +501,7 @@ else if (field == FieldStartOffset) return CMusicDatabase::song_iStartOffset; else if (field == FieldEndOffset) return CMusicDatabase::song_iEndOffset; else if (field == FieldLastPlayed) return CMusicDatabase::song_lastplayed; - else if (field == FieldRating) return CMusicDatabase::song_userrating; + else if (field == FieldRating) return CMusicDatabase::song_rating; else if (field == FieldComment) return CMusicDatabase::song_comment; else if (field == FieldMoods) return CMusicDatabase::song_mood; else if (field == FieldAlbum) return CMusicDatabase::song_strAlbum; @@ -528,7 +522,6 @@ else if (field == FieldBandFormed) return CMusicDatabase::artist_strFormed; else if (field == FieldDisbanded) return CMusicDatabase::artist_strDisbanded; else if (field == FieldDied) return CMusicDatabase::artist_strDied; - else if (field == FieldDateAdded) return CMusicDatabase::artist_dtDateAdded; } else if (mediaType == MediaTypeMusicVideo) { @@ -548,7 +541,6 @@ else if (field == FieldPlaycount) return VIDEODB_DETAILS_MUSICVIDEO_PLAYCOUNT; else if (field == FieldLastPlayed) return VIDEODB_DETAILS_MUSICVIDEO_LASTPLAYED; else if (field == FieldDateAdded) return VIDEODB_DETAILS_MUSICVIDEO_DATEADDED; - else if (field == FieldUserRating) return VIDEODB_DETAILS_MUSICVIDEO_USER_RATING; if (index < 0) return index; @@ -586,7 +578,6 @@ else if (field == FieldPlaycount) return VIDEODB_DETAILS_MOVIE_PLAYCOUNT; else if (field == FieldLastPlayed) return VIDEODB_DETAILS_MOVIE_LASTPLAYED; else if (field == FieldDateAdded) return VIDEODB_DETAILS_MOVIE_DATEADDED; - else if (field == FieldUserRating) return VIDEODB_DETAILS_MOVIE_USER_RATING; if (index < 0) return index; @@ -617,7 +608,6 @@ else if (field == FieldNumberOfEpisodes) return VIDEODB_DETAILS_TVSHOW_NUM_EPISODES; else if (field == FieldNumberOfWatchedEpisodes) return VIDEODB_DETAILS_TVSHOW_NUM_WATCHED; else if (field == FieldSeason) return VIDEODB_DETAILS_TVSHOW_NUM_SEASONS; - else if (field == FieldUserRating) return VIDEODB_DETAILS_TVSHOW_USER_RATING; if (index < 0) return index; @@ -654,7 +644,6 @@ else if (field == FieldStudio) return VIDEODB_DETAILS_EPISODE_TVSHOW_STUDIO; else if (field == FieldYear) return VIDEODB_DETAILS_EPISODE_TVSHOW_AIRED; else if (field == FieldMPAA) return VIDEODB_DETAILS_EPISODE_TVSHOW_MPAA; - else if (field == FieldUserRating) return VIDEODB_DETAILS_EPISODE_USER_RATING; if (index < 0) return index; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/DatabaseUtils.h kodi-15.2~git20151019.1039-final/xbmc/utils/DatabaseUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/DatabaseUtils.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/DatabaseUtils.h 2015-10-19 08:39:17.000000000 +0000 @@ -126,7 +126,6 @@ FieldDisbanded, FieldDied, FieldStereoMode, - FieldUserRating, FieldMax } Field; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/FileOperationJob.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/FileOperationJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/FileOperationJob.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/FileOperationJob.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -33,6 +33,7 @@ #include "utils/StringUtils.h" #include "utils/URIUtils.h" +using namespace std; using namespace XFILE; CFileOperationJob::CFileOperationJob() @@ -130,19 +131,18 @@ return true; } + CLog::Log(LOGDEBUG,"FileManager, processing folder: %s",strPath.c_str()); CFileItemList items; CDirectory::GetDirectory(strPath, items, "", DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_GET_HIDDEN); for (int i = 0; i < items.Size(); i++) { CFileItemPtr pItem = items[i]; pItem->Select(true); + CLog::Log(LOGDEBUG," -- %s",pItem->GetPath().c_str()); } if (!DoProcess(action, items, strDestFile, fileOperations, totalTime)) - { - CLog::Log(LOGERROR,"FileManager: error while processing folder: %s", strPath.c_str()); return false; - } if (action == ActionMove) { @@ -273,34 +273,49 @@ { case ActionCopy: case ActionReplace: + { + CLog::Log(LOGDEBUG,"FileManager: copy %s -> %s\n", m_strFileA.c_str(), m_strFileB.c_str()); + bResult = CFile::Copy(m_strFileA, m_strFileB, this, &data); - break; + } + break; case ActionMove: + { + CLog::Log(LOGDEBUG,"FileManager: move %s -> %s\n", m_strFileA.c_str(), m_strFileB.c_str()); + if (CanBeRenamed(m_strFileA, m_strFileB)) bResult = CFile::Rename(m_strFileA, m_strFileB); else if (CFile::Copy(m_strFileA, m_strFileB, this, &data)) bResult = CFile::Delete(m_strFileA); else bResult = false; - break; + } + break; case ActionDelete: + { + CLog::Log(LOGDEBUG,"FileManager: delete %s\n", m_strFileA.c_str()); + bResult = CFile::Delete(m_strFileA); - break; + } + break; case ActionDeleteFolder: + { + CLog::Log(LOGDEBUG,"FileManager: delete folder %s\n", m_strFileA.c_str()); + bResult = CDirectory::Remove(m_strFileA); - break; + } + break; case ActionCreateFolder: - bResult = CDirectory::Create(m_strFileA); - break; + { + CLog::Log(LOGDEBUG,"FileManager: create folder %s\n", m_strFileA.c_str()); - default: - CLog::Log(LOGERROR, "FileManager: unknown operation"); - bResult = false; - break; + bResult = CDirectory::Create(m_strFileA); + } + break; } current += (double)m_time * opWeight; @@ -320,6 +335,11 @@ return false; } +void CFileOperationJob::CFileOperation::Debug() +{ + printf("%i | %s > %s\n", m_action, m_strFileA.c_str(), m_strFileB.c_str()); +} + bool CFileOperationJob::CFileOperation::OnFileCallback(void* pContext, int ipercent, float avgSpeed) { DataHolder *data = (DataHolder *)pContext; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/FileOperationJob.h kodi-15.2~git20151019.1039-final/xbmc/utils/FileOperationJob.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/FileOperationJob.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/FileOperationJob.h 2015-10-19 08:39:17.000000000 +0000 @@ -71,6 +71,7 @@ virtual bool OnFileCallback(void* pContext, int ipercent, float avgSpeed); bool ExecuteOperation(CFileOperationJob *base, double ¤t, double opWeight); + void Debug(); private: FileAction m_action; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/FileUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/FileUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/FileUtils.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/FileUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -26,7 +26,6 @@ #include "JobManager.h" #include "FileOperationJob.h" #include "URIUtils.h" -#include "filesystem/StackDirectory.h" #include "filesystem/MultiPathDirectory.h" #include #include "settings/MediaSourceSettings.h" @@ -34,9 +33,9 @@ #include "StringUtils.h" #include "URL.h" #include "settings/Settings.h" -#include "utils/Variant.h" using namespace XFILE; +using namespace std; bool CFileUtils::DeleteItem(const std::string &strPath, bool force) { @@ -55,11 +54,11 @@ CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!force && pDialog) { - pDialog->SetHeading(CVariant{122}); - pDialog->SetLine(0, CVariant{125}); - pDialog->SetLine(1, CVariant{CURL(item->GetPath()).GetWithoutUserDetails()}); - pDialog->SetLine(2, CVariant{""}); - pDialog->Open(); + pDialog->SetHeading(122); + pDialog->SetLine(0, 125); + pDialog->SetLine(1, CURL(item->GetPath()).GetWithoutUserDetails()); + pDialog->SetLine(2, ""); + pDialog->DoModal(); if (!pDialog->IsConfirmed()) return false; } @@ -82,13 +81,13 @@ URIUtils::RemoveSlashAtEnd(strFileAndPath); std::string strFileName = URIUtils::GetFileName(strFileAndPath); std::string strPath = URIUtils::GetDirectory(strFileAndPath); - if (CGUIKeyboardFactory::ShowAndGetInput(strFileName, CVariant{g_localizeStrings.Get(16013)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(strFileName, g_localizeStrings.Get(16013), false)) { strPath = URIUtils::AddFileToFolder(strPath, strFileName); CLog::Log(LOGINFO,"FileUtils: rename %s->%s\n", strFileAndPath.c_str(), strPath.c_str()); if (URIUtils::IsMultiPath(strFileAndPath)) { // special case for multipath renames - rename all the paths. - std::vector paths; + vector paths; CMultiPathDirectory::GetPaths(strFileAndPath, paths); bool success = false; for (unsigned int i = 0; i < paths.size(); ++i) @@ -112,7 +111,7 @@ const unsigned int SourcesSize = 5; std::string SourceNames[] = { "programs", "files", "video", "music", "pictures" }; - std::string realPath = URIUtils::GetRealPath(strPath); + string realPath = URIUtils::GetRealPath(strPath); // for rar:// and zip:// paths we need to extract the path to the archive // instead of using the VFS path while (URIUtils::IsInArchive(realPath)) @@ -148,7 +147,7 @@ return true; else { - std::string strPlaylistsPath = CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH); + std::string strPlaylistsPath = CSettings::Get().GetString("system.playlistspath"); URIUtils::RemoveSlashAtEnd(strPlaylistsPath); if (StringUtils::StartsWithNoCase(realPath, strPlaylistsPath)) return true; @@ -156,73 +155,10 @@ bool isSource; for (unsigned int index = 0; index < SourcesSize; index++) { - VECSOURCES* sources = CMediaSourceSettings::GetInstance().GetSources(SourceNames[index]); + VECSOURCES* sources = CMediaSourceSettings::Get().GetSources(SourceNames[index]); int sourceIndex = CUtil::GetMatchingSource(realPath, *sources, isSource); if (sourceIndex >= 0 && sourceIndex < (int)sources->size() && sources->at(sourceIndex).m_iHasLock != 2 && sources->at(sourceIndex).m_allowSharing) return true; } return false; } - -CDateTime CFileUtils::GetModificationDate(const std::string& strFileNameAndPath, const bool& bUseLatestDate) -{ - CDateTime dateAdded; - if (strFileNameAndPath.empty()) - { - CLog::Log(LOGDEBUG, "%s empty strFileNameAndPath variable", __FUNCTION__); - return dateAdded; - } - - try - { - std::string file = strFileNameAndPath; - if (URIUtils::IsStack(strFileNameAndPath)) - file = CStackDirectory::GetFirstStackedFile(strFileNameAndPath); - - if (URIUtils::IsInArchive(file)) - file = CURL(file).GetHostName(); - - // Let's try to get the modification datetime - struct __stat64 buffer; - if (CFile::Stat(file, &buffer) == 0 && (buffer.st_mtime != 0 || buffer.st_ctime != 0)) - { - time_t now = time(NULL); - time_t addedTime; - // Prefer the modification time if it's valid - if (!bUseLatestDate) - { - if (buffer.st_mtime != 0 && (time_t)buffer.st_mtime <= now) - addedTime = (time_t)buffer.st_mtime; - else - addedTime = (time_t)buffer.st_ctime; - } - // Use the newer of the creation and modification time - else - { - addedTime = std::max((time_t)buffer.st_ctime, (time_t)buffer.st_mtime); - // if the newer of the two dates is in the future, we try it with the older one - if (addedTime > now) - addedTime = std::min((time_t)buffer.st_ctime, (time_t)buffer.st_mtime); - } - - // make sure the datetime does is not in the future - if (addedTime <= now) - { - struct tm *time; -#ifdef HAVE_LOCALTIME_R - struct tm result = {}; - time = localtime_r(&addedTime, &result); -#else - time = localtime(&addedTime); -#endif - if (time) - dateAdded = *time; - } - } - } - catch (...) - { - CLog::Log(LOGERROR, "%s unable to extract modification date for file (%s)", __FUNCTION__, strFileNameAndPath.c_str()); - } - return dateAdded; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/FileUtils.h kodi-15.2~git20151019.1039-final/xbmc/utils/FileUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/FileUtils.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/FileUtils.h 2015-10-19 08:39:17.000000000 +0000 @@ -29,10 +29,4 @@ static bool RenameFile(const std::string &strFile); static bool RemoteAccessAllowed(const std::string &strPath); static unsigned int LoadFile(const std::string &filename, void* &outputBuffer); - /*! \brief Get the modified date of a file if its invalid it returns the creation date - this behavior changes when you set bUseLatestDate - \param strFileNameAndPath path to the file - \param bUseLatestDate use the newer datetime of the files mtime and ctime - \return Returns the file date, can return a invalid date if problems occure - */ - static CDateTime GetModificationDate(const std::string& strFileNameAndPath, const bool& bUseLatestDate); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/GlobalsHandling.h kodi-15.2~git20151019.1039-final/xbmc/utils/GlobalsHandling.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/GlobalsHandling.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/GlobalsHandling.h 2015-04-04 00:00:18.000000000 +0000 @@ -212,3 +212,13 @@ * #define g_variable XBMC_GLOBAL_USE(classname) */ #define XBMC_GLOBAL_USE(classname) (*(xbmcutil::GlobalsSingleton::getQuick())) + +/** + * For pattern (1) above, you can use the following macro. WARNING: This should only + * be used when the global in question is never accessed, directly or indirectly, from + * a static method called (again, directly or indirectly) during startup or shutdown. + */ +#define XBMC_GLOBAL(classname,g_variable) \ + XBMC_GLOBAL_REF(classname,g_variable); \ + static classname & g_variable = (*(g_variable##Ref.get())) + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/GroupUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/GroupUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/GroupUtils.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/GroupUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,27 +18,22 @@ * */ -#include "GroupUtils.h" - #include #include +#include "GroupUtils.h" #include "FileItem.h" -#include "filesystem/MultiPathDirectory.h" #include "utils/StringUtils.h" -#include "utils/URIUtils.h" #include "video/VideoDbUrl.h" #include "video/VideoInfoTag.h" +#include "utils/URIUtils.h" +#include "filesystem/MultiPathDirectory.h" -using SetMap = std::map >; +using namespace std; -bool GroupUtils::Group(GroupBy groupBy, const std::string &baseDir, const CFileItemList &items, CFileItemList &groupedItems, GroupAttribute groupAttributes /* = GroupAttributeNone */) -{ - CFileItemList ungroupedItems; - return Group(groupBy, baseDir, items, groupedItems, ungroupedItems, groupAttributes); -} +typedef map > SetMap; -bool GroupUtils::Group(GroupBy groupBy, const std::string &baseDir, const CFileItemList &items, CFileItemList &groupedItems, CFileItemList &ungroupedItems, GroupAttribute groupAttributes /* = GroupAttributeNone */) +bool GroupUtils::Group(GroupBy groupBy, const std::string &baseDir, const CFileItemList &items, CFileItemList &groupedItems, GroupAttribute groupAttributes /* = GroupAttributeNone */) { if (groupBy == GroupByNone) return false; @@ -50,19 +45,19 @@ SetMap setMap; for (int index = 0; index < items.Size(); index++) { - bool ungrouped = true; + bool add = true; const CFileItemPtr item = items.Get(index); // group by sets if ((groupBy & GroupBySet) && - item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_iSetId > 0) + item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_iSetId > 0) { - ungrouped = false; + add = false; setMap[item->GetVideoInfoTag()->m_iSetId].insert(item); } - if (ungrouped) - ungroupedItems.Add(item); + if (add) + groupedItems.Add(item); } if ((groupBy & GroupBySet) && !setMap.empty()) @@ -73,10 +68,10 @@ for (SetMap::const_iterator set = setMap.begin(); set != setMap.end(); ++set) { - // only one item in the set, so add it to the ungrouped items + // only one item in the set, so just re-add it if (set->second.size() == 1 && (groupAttributes & GroupAttributeIgnoreSingleItems)) { - ungroupedItems.Add(*set->second.begin()); + groupedItems.Add(*set->second.begin()); continue; } @@ -98,7 +93,6 @@ CVideoInfoTag* setInfo = pItem->GetVideoInfoTag(); setInfo->m_strPath = pItem->GetPath(); setInfo->m_strTitle = pItem->GetLabel(); - setInfo->m_strPlot = (*set->second.begin())->GetVideoInfoTag()->m_strSetOverview; int ratings = 0; int iWatched = 0; // have all the movies been played at least once? @@ -112,19 +106,19 @@ ratings++; setInfo->m_fRating += movieInfo->m_fRating; } - + // handle year if (movieInfo->m_iYear > setInfo->m_iYear) setInfo->m_iYear = movieInfo->m_iYear; - + // handle lastplayed if (movieInfo->m_lastPlayed.IsValid() && movieInfo->m_lastPlayed > setInfo->m_lastPlayed) setInfo->m_lastPlayed = movieInfo->m_lastPlayed; - + // handle dateadded if (movieInfo->m_dateAdded.IsValid() && movieInfo->m_dateAdded > setInfo->m_dateAdded) setInfo->m_dateAdded = movieInfo->m_dateAdded; - + // handle playcount/watched setInfo->m_playCount += movieInfo->m_playCount; if (movieInfo->m_playCount > 0) @@ -141,7 +135,7 @@ if (ratings > 1) pItem->GetVideoInfoTag()->m_fRating /= ratings; - + setInfo->m_playCount = iWatched >= (int)set->second.size() ? (setInfo->m_playCount / set->second.size()) : 0; pItem->SetProperty("total", (int)set->second.size()); pItem->SetProperty("watched", iWatched); @@ -155,14 +149,11 @@ return true; } -bool GroupUtils::GroupAndMix(GroupBy groupBy, const std::string &baseDir, const CFileItemList &items, CFileItemList &groupedItemsMixed, GroupAttribute groupAttributes /* = GroupAttributeNone */) +bool GroupUtils::GroupAndSort(GroupBy groupBy, const std::string &baseDir, const CFileItemList &items, const SortDescription &sortDescription, CFileItemList &groupedItems, GroupAttribute groupAttributes /* = GroupAttributeNone */) { - CFileItemList ungroupedItems; - if (!Group(groupBy, baseDir, items, groupedItemsMixed, ungroupedItems, groupAttributes)) + if (!Group(groupBy, baseDir, items, groupedItems, groupAttributes)) return false; - // add all the ungrouped items as well - groupedItemsMixed.Append(ungroupedItems); - + groupedItems.Sort(sortDescription); return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/GroupUtils.h kodi-15.2~git20151019.1039-final/xbmc/utils/GroupUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/GroupUtils.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/GroupUtils.h 2015-10-19 08:39:17.000000000 +0000 @@ -19,7 +19,7 @@ * */ -#include "utils/SortUtils.h" +#include "SortUtils.h" class CFileItemList; @@ -38,6 +38,5 @@ { public: static bool Group(GroupBy groupBy, const std::string &baseDir, const CFileItemList &items, CFileItemList &groupedItems, GroupAttribute groupAttributes = GroupAttributeNone); - static bool Group(GroupBy groupBy, const std::string &baseDir, const CFileItemList &items, CFileItemList &groupedItems, CFileItemList &ungroupedItems, GroupAttribute groupAttributes = GroupAttributeNone); - static bool GroupAndMix(GroupBy groupBy, const std::string &baseDir, const CFileItemList &items, CFileItemList &groupedItemsMixed, GroupAttribute groupAttributes = GroupAttributeNone); + static bool GroupAndSort(GroupBy groupBy, const std::string &baseDir, const CFileItemList &items, const SortDescription &sortDescription, CFileItemList &groupedItems, GroupAttribute groupAttributes = GroupAttributeNone); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/HTMLUtil.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/HTMLUtil.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/HTMLUtil.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/HTMLUtil.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -22,8 +22,10 @@ #include "utils/StringUtils.h" #include +using namespace std; using namespace HTML; + CHTMLUtil::CHTMLUtil(void) {} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/HttpRangeUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/HttpRangeUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/HttpRangeUtils.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/HttpRangeUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -263,7 +263,7 @@ // split the value of the "Range" header by "," std::vector rangeValues = StringUtils::Split(rangesValue, ","); - for (std::vector::const_iterator range = rangeValues.begin(); range != rangeValues.end(); ++range) + for (std::vector::const_iterator range = rangeValues.begin(); range != rangeValues.end(); range++) { // there must be a "-" in the range definition if (range->find("-") == std::string::npos) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/HttpResponse.h kodi-15.2~git20151019.1039-final/xbmc/utils/HttpResponse.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/HttpResponse.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/HttpResponse.h 2015-10-19 08:39:17.000000000 +0000 @@ -19,10 +19,9 @@ * */ -#include #include -#include #include +#include namespace HTTP { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/JobManager.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/JobManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/JobManager.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/JobManager.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -27,6 +27,8 @@ #include "system.h" +using namespace std; + bool CJob::ShouldCancel(unsigned int progress, unsigned int total) const { if (m_callback) @@ -153,8 +155,8 @@ void CJobQueue::CancelJobs() { CSingleLock lock(m_section); - for_each(m_processing.begin(), m_processing.end(), std::mem_fun_ref(&CJobPointer::CancelJob)); - for_each(m_jobQueue.begin(), m_jobQueue.end(), std::mem_fun_ref(&CJobPointer::FreeJob)); + for_each(m_processing.begin(), m_processing.end(), mem_fun_ref(&CJobPointer::CancelJob)); + for_each(m_jobQueue.begin(), m_jobQueue.end(), mem_fun_ref(&CJobPointer::FreeJob)); m_jobQueue.clear(); m_processing.clear(); } @@ -200,12 +202,12 @@ // clear any pending jobs for (unsigned int priority = CJob::PRIORITY_LOW_PAUSABLE; priority <= CJob::PRIORITY_HIGH; ++priority) { - for_each(m_jobQueue[priority].begin(), m_jobQueue[priority].end(), std::mem_fun_ref(&CWorkItem::FreeJob)); + for_each(m_jobQueue[priority].begin(), m_jobQueue[priority].end(), mem_fun_ref(&CWorkItem::FreeJob)); m_jobQueue[priority].clear(); } // cancel any callbacks on jobs still processing - for_each(m_processing.begin(), m_processing.end(), std::mem_fun_ref(&CWorkItem::Cancel)); + for_each(m_processing.begin(), m_processing.end(), mem_fun_ref(&CWorkItem::Cancel)); // tell our workers to finish while (m_workers.size()) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/JSONVariantParser.h kodi-15.2~git20151019.1039-final/xbmc/utils/JSONVariantParser.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/JSONVariantParser.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/JSONVariantParser.h 2015-10-19 08:39:17.000000000 +0000 @@ -19,7 +19,7 @@ * */ -#include "utils/Variant.h" +#include "Variant.h" #include diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/JSONVariantWriter.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/JSONVariantWriter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/JSONVariantWriter.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/JSONVariantWriter.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -21,11 +21,12 @@ #include #include "JSONVariantWriter.h" -#include "utils/Variant.h" -std::string CJSONVariantWriter::Write(const CVariant &value, bool compact) +using namespace std; + +string CJSONVariantWriter::Write(const CVariant &value, bool compact) { - std::string output; + string output; yajl_gen g = yajl_gen_alloc(NULL); yajl_gen_config(g, yajl_gen_beautify, compact ? 0 : 1); @@ -56,7 +57,7 @@ size_t length; yajl_gen_get_buf(g, &buffer, &length); - output = std::string((const char *)buffer, length); + output = string((const char *)buffer, length); } // Re-set locale to what it was before using yajl diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/JSONVariantWriter.h kodi-15.2~git20151019.1039-final/xbmc/utils/JSONVariantWriter.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/JSONVariantWriter.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/JSONVariantWriter.h 2015-10-19 08:39:17.000000000 +0000 @@ -19,10 +19,8 @@ * */ +#include "Variant.h" #include -#include - -class CVariant; class CJSONVariantWriter { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/LabelFormatter.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/LabelFormatter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/LabelFormatter.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/LabelFormatter.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -100,13 +100,11 @@ * %Y - Year * %Z - tvshow title * %a - Date Added - * %d - Date and Time * %p - Last Played - * %r - User Rating * *t - Date Taken (suitable for Pictures) */ -#define MASK_CHARS "NSATBGYFLDIJRCKMEPHZOQUVXWadprt" +#define MASK_CHARS "NSATBGYFLDIJRCKMEPHZOQUVXWapt" CLabelFormatter::CLabelFormatter(const std::string &mask, const std::string &mask2) { @@ -114,7 +112,7 @@ AssembleMask(0, mask); AssembleMask(1, mask2); // save a bool for faster lookups - m_hideFileExtensions = !CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWEXTENSIONS); + m_hideFileExtensions = !CSettings::Get().GetBool("filelists.showextensions"); } std::string CLabelFormatter::GetContent(unsigned int label, const CFileItem *item) const @@ -173,8 +171,8 @@ value = StringUtils::Format("%02.2i", music->GetDiscNumber()); break; case 'A': - if (music && music->GetArtistString().size()) - value = music->GetArtistString(); + if (music && music->GetArtist().size()) + value = StringUtils::Join(music->GetArtist(), g_advancedSettings.m_musicItemSeparator); if (movie && movie->m_artist.size()) value = StringUtils::Join(movie->m_artist, g_advancedSettings.m_videoItemSeparator); break; @@ -238,7 +236,7 @@ } break; case 'I': // size - if( (item->m_bIsFolder && item->m_dwSize != 0) || item->m_dwSize >= 0 ) + if( !item->m_bIsFolder || item->m_dwSize != 0 ) value = StringUtils::SizeToString(item->m_dwSize); break; case 'J': // date @@ -250,8 +248,8 @@ value = item->m_dateTime.GetAsLocalizedTime("", false); break; case 'R': // rating - if (music && music->GetUserrating() != '0') - value.assign(1, music->GetUserrating()); + if (music && music->GetRating() != '0') + value.assign(1, music->GetRating()); else if (movie && movie->m_fRating != 0.f) value = StringUtils::Format("%.1f", movie->m_fRating); break; @@ -320,22 +318,10 @@ case 'a': // Date Added if (movie && movie->m_dateAdded.IsValid()) value = movie->m_dateAdded.GetAsLocalizedDate(); - if (music && music->GetDateAdded().IsValid()) - value = music->GetDateAdded().GetAsLocalizedDate(); - break; - case 'd': // date and time - if (item->m_dateTime.IsValid()) - value = item->m_dateTime.GetAsLocalizedDateTime(); break; case 'p': // Last played if (movie && movie->m_lastPlayed.IsValid()) value = movie->m_lastPlayed.GetAsLocalizedDate(); - if (music && music->GetLastPlayed().IsValid()) - value = music->GetLastPlayed().GetAsLocalizedDate(); - break; - case 'r': // userrating - if (movie && movie->m_iUserRating != 0) - value = StringUtils::Format("%i", movie->m_iUserRating); break; case 't': // Date Taken if (pic && pic->GetDateTimeTaken().IsValid()) @@ -439,7 +425,7 @@ tag->SetDuration(StringUtils::TimeStringToSeconds(value)); break; case 'R': // rating - tag->SetUserrating(value[0]); + tag->SetRating(value[0]); break; } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/LangCodeExpander.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/LangCodeExpander.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/LangCodeExpander.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/LangCodeExpander.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -32,7 +32,7 @@ const char *name; } LCENTRY; -extern const struct LCENTRY g_iso639_1[185]; +extern const struct LCENTRY g_iso639_1[186]; extern const struct LCENTRY g_iso639_2[538]; struct ISO639 @@ -50,7 +50,7 @@ // declared as extern to allow forward declaration extern const ISO639 LanguageCodes[189]; -extern const ISO3166_1 RegionCodes[245]; +extern const ISO3166_1 RegionCodes[246]; CLangCodeExpander::CLangCodeExpander() { } @@ -515,8 +515,9 @@ return lang; } -extern const LCENTRY g_iso639_1[185] = +extern const LCENTRY g_iso639_1[186] = { + { MAKECODE('\0','\0','c','c'), "Closed Caption" }, { MAKECODE('\0','\0','a','a'), "Afar" }, { MAKECODE('\0','\0','a','b'), "Abkhazian" }, { MAKECODE('\0','\0','a','e'), "Avestan" }, @@ -628,7 +629,7 @@ { MAKECODE('\0','\0','m','t'), "Maltese" }, { MAKECODE('\0','\0','m','y'), "Burmese" }, { MAKECODE('\0','\0','n','a'), "Nauru" }, - { MAKECODE('\0','\0','n','b'), "Norwegian Bokm\xC3\xA5l" }, + { MAKECODE('\0','\0','n','b'), "Bokm\xC3\xA5l, Norwegian" }, { MAKECODE('\0','\0','n','d'), "Ndebele, North" }, { MAKECODE('\0','\0','n','e'), "Nepali" }, { MAKECODE('\0','\0','n','g'), "Ndonga" }, @@ -1441,7 +1442,7 @@ }; // Based on ISO 3166 -const ISO3166_1 RegionCodes[245] = +const ISO3166_1 RegionCodes[246] = { { "af", "afg" }, { "ax", "ala" }, @@ -1489,6 +1490,7 @@ { "cl", "chl" }, { "cn", "chn" }, { "cx", "cxr" }, + { "cc", "cck" }, { "co", "col" }, { "km", "com" }, { "cg", "cog" }, diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/utils/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/utils/Makefile.in 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Makefile.in 2015-10-19 08:39:17.000000000 +0000 @@ -2,6 +2,7 @@ SRCS += AliasShortcutUtils.cpp SRCS += Archive.cpp SRCS += AsyncFileCopy.cpp +SRCS += AutoPtrHandle.cpp SRCS += auto_buffer.cpp SRCS += Base64.cpp SRCS += BitstreamConverter.cpp diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/MathUtils.h kodi-15.2~git20151019.1039-final/xbmc/utils/MathUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/MathUtils.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/MathUtils.h 2015-10-19 08:39:17.000000000 +0000 @@ -62,8 +62,8 @@ */ inline int round_int(double x) { - assert(x > static_cast((int) (INT_MIN / 2)) - 1.0); - assert(x < static_cast((int) (INT_MAX / 2)) + 1.0); + assert(x > static_cast(INT_MIN / 2) - 1.0); + assert(x < static_cast(INT_MAX / 2) + 1.0); #if defined(DISABLE_MATHUTILS_ASM_ROUND_INT) /* This implementation warrants some further explanation. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Mime.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/Mime.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/Mime.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Mime.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -29,504 +29,506 @@ #include "utils/StringUtils.h" #include "filesystem/CurlFile.h" -std::map fillMimeTypes() +using namespace std; + +map fillMimeTypes() { - std::map mimeTypes; + map mimeTypes; - mimeTypes.insert(std::pair("3dm", "x-world/x-3dmf")); - mimeTypes.insert(std::pair("3dmf", "x-world/x-3dmf")); - mimeTypes.insert(std::pair("a", "application/octet-stream")); - mimeTypes.insert(std::pair("aab", "application/x-authorware-bin")); - mimeTypes.insert(std::pair("aam", "application/x-authorware-map")); - mimeTypes.insert(std::pair("aas", "application/x-authorware-seg")); - mimeTypes.insert(std::pair("abc", "text/vnd.abc")); - mimeTypes.insert(std::pair("acgi", "text/html")); - mimeTypes.insert(std::pair("afl", "video/animaflex")); - mimeTypes.insert(std::pair("ai", "application/postscript")); - mimeTypes.insert(std::pair("aif", "audio/aiff")); - mimeTypes.insert(std::pair("aifc", "audio/x-aiff")); - mimeTypes.insert(std::pair("aiff", "audio/aiff")); - mimeTypes.insert(std::pair("aim", "application/x-aim")); - mimeTypes.insert(std::pair("aip", "text/x-audiosoft-intra")); - mimeTypes.insert(std::pair("ani", "application/x-navi-animation")); - mimeTypes.insert(std::pair("aos", "application/x-nokia-9000-communicator-add-on-software")); - mimeTypes.insert(std::pair("aps", "application/mime")); - mimeTypes.insert(std::pair("arc", "application/octet-stream")); - mimeTypes.insert(std::pair("arj", "application/arj")); - mimeTypes.insert(std::pair("art", "image/x-jg")); - mimeTypes.insert(std::pair("asf", "video/x-ms-asf")); - mimeTypes.insert(std::pair("asm", "text/x-asm")); - mimeTypes.insert(std::pair("asp", "text/asp")); - mimeTypes.insert(std::pair("asx", "video/x-ms-asf")); - mimeTypes.insert(std::pair("au", "audio/basic")); - mimeTypes.insert(std::pair("avi", "video/avi")); - mimeTypes.insert(std::pair("avs", "video/avs-video")); - mimeTypes.insert(std::pair("bcpio", "application/x-bcpio")); - mimeTypes.insert(std::pair("bin", "application/octet-stream")); - mimeTypes.insert(std::pair("bm", "image/bmp")); - mimeTypes.insert(std::pair("bmp", "image/bmp")); - mimeTypes.insert(std::pair("boo", "application/book")); - mimeTypes.insert(std::pair("book", "application/book")); - mimeTypes.insert(std::pair("boz", "application/x-bzip2")); - mimeTypes.insert(std::pair("bsh", "application/x-bsh")); - mimeTypes.insert(std::pair("bz", "application/x-bzip")); - mimeTypes.insert(std::pair("bz2", "application/x-bzip2")); - mimeTypes.insert(std::pair("c", "text/plain")); - mimeTypes.insert(std::pair("c++", "text/plain")); - mimeTypes.insert(std::pair("cat", "application/vnd.ms-pki.seccat")); - mimeTypes.insert(std::pair("cc", "text/plain")); - mimeTypes.insert(std::pair("ccad", "application/clariscad")); - mimeTypes.insert(std::pair("cco", "application/x-cocoa")); - mimeTypes.insert(std::pair("cdf", "application/cdf")); - mimeTypes.insert(std::pair("cer", "application/pkix-cert")); - mimeTypes.insert(std::pair("cer", "application/x-x509-ca-cert")); - mimeTypes.insert(std::pair("cha", "application/x-chat")); - mimeTypes.insert(std::pair("chat", "application/x-chat")); - mimeTypes.insert(std::pair("class", "application/java")); - mimeTypes.insert(std::pair("com", "application/octet-stream")); - mimeTypes.insert(std::pair("conf", "text/plain")); - mimeTypes.insert(std::pair("cpio", "application/x-cpio")); - mimeTypes.insert(std::pair("cpp", "text/x-c")); - mimeTypes.insert(std::pair("cpt", "application/x-cpt")); - mimeTypes.insert(std::pair("crl", "application/pkcs-crl")); - mimeTypes.insert(std::pair("crt", "application/pkix-cert")); - mimeTypes.insert(std::pair("csh", "application/x-csh")); - mimeTypes.insert(std::pair("css", "text/css")); - mimeTypes.insert(std::pair("cxx", "text/plain")); - mimeTypes.insert(std::pair("dcr", "application/x-director")); - mimeTypes.insert(std::pair("deepv", "application/x-deepv")); - mimeTypes.insert(std::pair("def", "text/plain")); - mimeTypes.insert(std::pair("der", "application/x-x509-ca-cert")); - mimeTypes.insert(std::pair("dif", "video/x-dv")); - mimeTypes.insert(std::pair("dir", "application/x-director")); - mimeTypes.insert(std::pair("dl", "video/dl")); - mimeTypes.insert(std::pair("divx", "video/x-msvideo")); - mimeTypes.insert(std::pair("doc", "application/msword")); - mimeTypes.insert(std::pair("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document")); - mimeTypes.insert(std::pair("dot", "application/msword")); - mimeTypes.insert(std::pair("dp", "application/commonground")); - mimeTypes.insert(std::pair("drw", "application/drafting")); - mimeTypes.insert(std::pair("dump", "application/octet-stream")); - mimeTypes.insert(std::pair("dv", "video/x-dv")); - mimeTypes.insert(std::pair("dvi", "application/x-dvi")); - mimeTypes.insert(std::pair("dwf", "model/vnd.dwf")); - mimeTypes.insert(std::pair("dwg", "image/vnd.dwg")); - mimeTypes.insert(std::pair("dxf", "image/vnd.dwg")); - mimeTypes.insert(std::pair("dxr", "application/x-director")); - mimeTypes.insert(std::pair("el", "text/x-script.elisp")); - mimeTypes.insert(std::pair("elc", "application/x-elc")); - mimeTypes.insert(std::pair("env", "application/x-envoy")); - mimeTypes.insert(std::pair("eps", "application/postscript")); - mimeTypes.insert(std::pair("es", "application/x-esrehber")); - mimeTypes.insert(std::pair("etx", "text/x-setext")); - mimeTypes.insert(std::pair("evy", "application/envoy")); - mimeTypes.insert(std::pair("exe", "application/octet-stream")); - mimeTypes.insert(std::pair("f", "text/x-fortran")); - mimeTypes.insert(std::pair("f77", "text/x-fortran")); - mimeTypes.insert(std::pair("f90", "text/x-fortran")); - mimeTypes.insert(std::pair("fdf", "application/vnd.fdf")); - mimeTypes.insert(std::pair("fif", "image/fif")); - mimeTypes.insert(std::pair("flac", "audio/flac")); - mimeTypes.insert(std::pair("fli", "video/fli")); - mimeTypes.insert(std::pair("flo", "image/florian")); - mimeTypes.insert(std::pair("flv", "video/x-flv")); - mimeTypes.insert(std::pair("flx", "text/vnd.fmi.flexstor")); - mimeTypes.insert(std::pair("fmf", "video/x-atomic3d-feature")); - mimeTypes.insert(std::pair("for", "text/plain")); - mimeTypes.insert(std::pair("for", "text/x-fortran")); - mimeTypes.insert(std::pair("fpx", "image/vnd.fpx")); - mimeTypes.insert(std::pair("frl", "application/freeloader")); - mimeTypes.insert(std::pair("funk", "audio/make")); - mimeTypes.insert(std::pair("g", "text/plain")); - mimeTypes.insert(std::pair("g3", "image/g3fax")); - mimeTypes.insert(std::pair("gif", "image/gif")); - mimeTypes.insert(std::pair("gl", "video/x-gl")); - mimeTypes.insert(std::pair("gsd", "audio/x-gsm")); - mimeTypes.insert(std::pair("gsm", "audio/x-gsm")); - mimeTypes.insert(std::pair("gsp", "application/x-gsp")); - mimeTypes.insert(std::pair("gss", "application/x-gss")); - mimeTypes.insert(std::pair("gtar", "application/x-gtar")); - mimeTypes.insert(std::pair("gz", "application/x-compressed")); - mimeTypes.insert(std::pair("gzip", "application/x-gzip")); - mimeTypes.insert(std::pair("h", "text/plain")); - mimeTypes.insert(std::pair("hdf", "application/x-hdf")); - mimeTypes.insert(std::pair("help", "application/x-helpfile")); - mimeTypes.insert(std::pair("hgl", "application/vnd.hp-hpgl")); - mimeTypes.insert(std::pair("hh", "text/plain")); - mimeTypes.insert(std::pair("hlb", "text/x-script")); - mimeTypes.insert(std::pair("hlp", "application/hlp")); - mimeTypes.insert(std::pair("hpg", "application/vnd.hp-hpgl")); - mimeTypes.insert(std::pair("hpgl", "application/vnd.hp-hpgl")); - mimeTypes.insert(std::pair("hqx", "application/binhex")); - mimeTypes.insert(std::pair("hta", "application/hta")); - mimeTypes.insert(std::pair("htc", "text/x-component")); - mimeTypes.insert(std::pair("htm", "text/html")); - mimeTypes.insert(std::pair("html", "text/html")); - mimeTypes.insert(std::pair("htmls", "text/html")); - mimeTypes.insert(std::pair("htt", "text/webviewhtml")); - mimeTypes.insert(std::pair("htx", "text/html")); - mimeTypes.insert(std::pair("ice", "x-conference/x-cooltalk")); - mimeTypes.insert(std::pair("ico", "image/x-icon")); - mimeTypes.insert(std::pair("idc", "text/plain")); - mimeTypes.insert(std::pair("ief", "image/ief")); - mimeTypes.insert(std::pair("iefs", "image/ief")); - mimeTypes.insert(std::pair("iges", "application/iges")); - mimeTypes.insert(std::pair("igs", "application/iges")); - mimeTypes.insert(std::pair("igs", "model/iges")); - mimeTypes.insert(std::pair("ima", "application/x-ima")); - mimeTypes.insert(std::pair("imap", "application/x-httpd-imap")); - mimeTypes.insert(std::pair("inf", "application/inf")); - mimeTypes.insert(std::pair("ins", "application/x-internett-signup")); - mimeTypes.insert(std::pair("ip", "application/x-ip2")); - mimeTypes.insert(std::pair("isu", "video/x-isvideo")); - mimeTypes.insert(std::pair("it", "audio/it")); - mimeTypes.insert(std::pair("iv", "application/x-inventor")); - mimeTypes.insert(std::pair("ivr", "i-world/i-vrml")); - mimeTypes.insert(std::pair("ivy", "application/x-livescreen")); - mimeTypes.insert(std::pair("jam", "audio/x-jam")); - mimeTypes.insert(std::pair("jav", "text/x-java-source")); - mimeTypes.insert(std::pair("java", "text/x-java-source")); - mimeTypes.insert(std::pair("jcm", "application/x-java-commerce")); - mimeTypes.insert(std::pair("jfif", "image/jpeg")); - mimeTypes.insert(std::pair("jfif-tbnl", "image/jpeg")); - mimeTypes.insert(std::pair("jpe", "image/jpeg")); - mimeTypes.insert(std::pair("jpeg", "image/jpeg")); - mimeTypes.insert(std::pair("jpg", "image/jpeg")); - mimeTypes.insert(std::pair("jps", "image/x-jps")); - mimeTypes.insert(std::pair("js", "application/javascript")); - mimeTypes.insert(std::pair("json", "application/json")); - mimeTypes.insert(std::pair("jut", "image/jutvision")); - mimeTypes.insert(std::pair("kar", "music/x-karaoke")); - mimeTypes.insert(std::pair("ksh", "application/x-ksh")); - mimeTypes.insert(std::pair("ksh", "text/x-script.ksh")); - mimeTypes.insert(std::pair("la", "audio/nspaudio")); - mimeTypes.insert(std::pair("lam", "audio/x-liveaudio")); - mimeTypes.insert(std::pair("latex", "application/x-latex")); - mimeTypes.insert(std::pair("lha", "application/lha")); - mimeTypes.insert(std::pair("lhx", "application/octet-stream")); - mimeTypes.insert(std::pair("list", "text/plain")); - mimeTypes.insert(std::pair("lma", "audio/nspaudio")); - mimeTypes.insert(std::pair("log", "text/plain")); - mimeTypes.insert(std::pair("lsp", "application/x-lisp")); - mimeTypes.insert(std::pair("lst", "text/plain")); - mimeTypes.insert(std::pair("lsx", "text/x-la-asf")); - mimeTypes.insert(std::pair("ltx", "application/x-latex")); - mimeTypes.insert(std::pair("lzh", "application/x-lzh")); - mimeTypes.insert(std::pair("lzx", "application/lzx")); - mimeTypes.insert(std::pair("m", "text/x-m")); - mimeTypes.insert(std::pair("m1v", "video/mpeg")); - mimeTypes.insert(std::pair("m2a", "audio/mpeg")); - mimeTypes.insert(std::pair("m2v", "video/mpeg")); - mimeTypes.insert(std::pair("m3u", "audio/x-mpequrl")); - mimeTypes.insert(std::pair("man", "application/x-troff-man")); - mimeTypes.insert(std::pair("map", "application/x-navimap")); - mimeTypes.insert(std::pair("mar", "text/plain")); - mimeTypes.insert(std::pair("mbd", "application/mbedlet")); - mimeTypes.insert(std::pair("mc$", "application/x-magic-cap-package-1.0")); - mimeTypes.insert(std::pair("mcd", "application/x-mathcad")); - mimeTypes.insert(std::pair("mcf", "text/mcf")); - mimeTypes.insert(std::pair("mcp", "application/netmc")); - mimeTypes.insert(std::pair("me", "application/x-troff-me")); - mimeTypes.insert(std::pair("mht", "message/rfc822")); - mimeTypes.insert(std::pair("mhtml", "message/rfc822")); - mimeTypes.insert(std::pair("mid", "audio/midi")); - mimeTypes.insert(std::pair("midi", "audio/midi")); - mimeTypes.insert(std::pair("mif", "application/x-mif")); - mimeTypes.insert(std::pair("mime", "message/rfc822")); - mimeTypes.insert(std::pair("mjf", "audio/x-vnd.audioexplosion.mjuicemediafile")); - mimeTypes.insert(std::pair("mjpg", "video/x-motion-jpeg")); - mimeTypes.insert(std::pair("mka", "audio/x-matroska")); - mimeTypes.insert(std::pair("mkv", "video/x-matroska")); - mimeTypes.insert(std::pair("mk3d", "video/x-matroska-3d")); - mimeTypes.insert(std::pair("mm", "application/x-meme")); - mimeTypes.insert(std::pair("mme", "application/base64")); - mimeTypes.insert(std::pair("mod", "audio/mod")); - mimeTypes.insert(std::pair("moov", "video/quicktime")); - mimeTypes.insert(std::pair("mov", "video/quicktime")); - mimeTypes.insert(std::pair("movie", "video/x-sgi-movie")); - mimeTypes.insert(std::pair("mp2", "audio/mpeg")); - mimeTypes.insert(std::pair("mp3", "audio/mpeg3")); - mimeTypes.insert(std::pair("mp4", "video/mp4")); - mimeTypes.insert(std::pair("mpa", "audio/mpeg")); - mimeTypes.insert(std::pair("mpc", "application/x-project")); - mimeTypes.insert(std::pair("mpe", "video/mpeg")); - mimeTypes.insert(std::pair("mpeg", "video/mpeg")); - mimeTypes.insert(std::pair("mpg", "video/mpeg")); - mimeTypes.insert(std::pair("mpga", "audio/mpeg")); - mimeTypes.insert(std::pair("mpp", "application/vnd.ms-project")); - mimeTypes.insert(std::pair("mpt", "application/x-project")); - mimeTypes.insert(std::pair("mpv", "application/x-project")); - mimeTypes.insert(std::pair("mpx", "application/x-project")); - mimeTypes.insert(std::pair("mrc", "application/marc")); - mimeTypes.insert(std::pair("ms", "application/x-troff-ms")); - mimeTypes.insert(std::pair("mv", "video/x-sgi-movie")); - mimeTypes.insert(std::pair("my", "audio/make")); - mimeTypes.insert(std::pair("mzz", "application/x-vnd.audioexplosion.mzz")); - mimeTypes.insert(std::pair("nap", "image/naplps")); - mimeTypes.insert(std::pair("naplps", "image/naplps")); - mimeTypes.insert(std::pair("nc", "application/x-netcdf")); - mimeTypes.insert(std::pair("ncm", "application/vnd.nokia.configuration-message")); - mimeTypes.insert(std::pair("nfo", "text/xml")); - mimeTypes.insert(std::pair("nif", "image/x-niff")); - mimeTypes.insert(std::pair("niff", "image/x-niff")); - mimeTypes.insert(std::pair("nix", "application/x-mix-transfer")); - mimeTypes.insert(std::pair("nsc", "application/x-conference")); - mimeTypes.insert(std::pair("nvd", "application/x-navidoc")); - mimeTypes.insert(std::pair("o", "application/octet-stream")); - mimeTypes.insert(std::pair("oda", "application/oda")); - mimeTypes.insert(std::pair("ogg", "audio/ogg")); - mimeTypes.insert(std::pair("omc", "application/x-omc")); - mimeTypes.insert(std::pair("omcd", "application/x-omcdatamaker")); - mimeTypes.insert(std::pair("omcr", "application/x-omcregerator")); - mimeTypes.insert(std::pair("p", "text/x-pascal")); - mimeTypes.insert(std::pair("p10", "application/pkcs10")); - mimeTypes.insert(std::pair("p12", "application/pkcs-12")); - mimeTypes.insert(std::pair("p7a", "application/x-pkcs7-signature")); - mimeTypes.insert(std::pair("p7c", "application/pkcs7-mime")); - mimeTypes.insert(std::pair("p7m", "application/pkcs7-mime")); - mimeTypes.insert(std::pair("p7r", "application/x-pkcs7-certreqresp")); - mimeTypes.insert(std::pair("p7s", "application/pkcs7-signature")); - mimeTypes.insert(std::pair("part", "application/pro_eng")); - mimeTypes.insert(std::pair("pas", "text/pascal")); - mimeTypes.insert(std::pair("pbm", "image/x-portable-bitmap")); - mimeTypes.insert(std::pair("pcl", "application/vnd.hp-pcl")); - mimeTypes.insert(std::pair("pct", "image/x-pict")); - mimeTypes.insert(std::pair("pcx", "image/x-pcx")); - mimeTypes.insert(std::pair("pdb", "chemical/x-pdb")); - mimeTypes.insert(std::pair("pdf", "application/pdf")); - mimeTypes.insert(std::pair("pfunk", "audio/make.my.funk")); - mimeTypes.insert(std::pair("pgm", "image/x-portable-greymap")); - mimeTypes.insert(std::pair("pic", "image/pict")); - mimeTypes.insert(std::pair("pict", "image/pict")); - mimeTypes.insert(std::pair("pkg", "application/x-newton-compatible-pkg")); - mimeTypes.insert(std::pair("pko", "application/vnd.ms-pki.pko")); - mimeTypes.insert(std::pair("pl", "text/x-script.perl")); - mimeTypes.insert(std::pair("plx", "application/x-pixclscript")); - mimeTypes.insert(std::pair("pm", "text/x-script.perl-module")); - mimeTypes.insert(std::pair("pm4", "application/x-pagemaker")); - mimeTypes.insert(std::pair("pm5", "application/x-pagemaker")); - mimeTypes.insert(std::pair("png", "image/png")); - mimeTypes.insert(std::pair("pnm", "application/x-portable-anymap")); - mimeTypes.insert(std::pair("pot", "application/vnd.ms-powerpoint")); - mimeTypes.insert(std::pair("pov", "model/x-pov")); - mimeTypes.insert(std::pair("ppa", "application/vnd.ms-powerpoint")); - mimeTypes.insert(std::pair("ppm", "image/x-portable-pixmap")); - mimeTypes.insert(std::pair("pps", "application/mspowerpoint")); - mimeTypes.insert(std::pair("ppt", "application/mspowerpoint")); - mimeTypes.insert(std::pair("ppz", "application/mspowerpoint")); - mimeTypes.insert(std::pair("pre", "application/x-freelance")); - mimeTypes.insert(std::pair("prt", "application/pro_eng")); - mimeTypes.insert(std::pair("ps", "application/postscript")); - mimeTypes.insert(std::pair("psd", "application/octet-stream")); - mimeTypes.insert(std::pair("pvu", "paleovu/x-pv")); - mimeTypes.insert(std::pair("pwz", "application/vnd.ms-powerpoint")); - mimeTypes.insert(std::pair("py", "text/x-script.phyton")); - mimeTypes.insert(std::pair("pyc", "applicaiton/x-bytecode.python")); - mimeTypes.insert(std::pair("qcp", "audio/vnd.qcelp")); - mimeTypes.insert(std::pair("qd3", "x-world/x-3dmf")); - mimeTypes.insert(std::pair("qd3d", "x-world/x-3dmf")); - mimeTypes.insert(std::pair("qif", "image/x-quicktime")); - mimeTypes.insert(std::pair("qt", "video/quicktime")); - mimeTypes.insert(std::pair("qtc", "video/x-qtc")); - mimeTypes.insert(std::pair("qti", "image/x-quicktime")); - mimeTypes.insert(std::pair("qtif", "image/x-quicktime")); - mimeTypes.insert(std::pair("ra", "audio/x-realaudio")); - mimeTypes.insert(std::pair("ram", "audio/x-pn-realaudio")); - mimeTypes.insert(std::pair("ras", "image/cmu-raster")); - mimeTypes.insert(std::pair("rast", "image/cmu-raster")); - mimeTypes.insert(std::pair("rexx", "text/x-script.rexx")); - mimeTypes.insert(std::pair("rf", "image/vnd.rn-realflash")); - mimeTypes.insert(std::pair("rgb", "image/x-rgb")); - mimeTypes.insert(std::pair("rm", "audio/x-pn-realaudio")); - mimeTypes.insert(std::pair("rmi", "audio/mid")); - mimeTypes.insert(std::pair("rmm", "audio/x-pn-realaudio")); - mimeTypes.insert(std::pair("rmp", "audio/x-pn-realaudio")); - mimeTypes.insert(std::pair("rng", "application/ringing-tones")); - mimeTypes.insert(std::pair("rnx", "application/vnd.rn-realplayer")); - mimeTypes.insert(std::pair("roff", "application/x-troff")); - mimeTypes.insert(std::pair("rp", "image/vnd.rn-realpix")); - mimeTypes.insert(std::pair("rpm", "audio/x-pn-realaudio-plugin")); - mimeTypes.insert(std::pair("rt", "text/richtext")); - mimeTypes.insert(std::pair("rtf", "text/richtext")); - mimeTypes.insert(std::pair("rtx", "text/richtext")); - mimeTypes.insert(std::pair("rv", "video/vnd.rn-realvideo")); - mimeTypes.insert(std::pair("s", "text/x-asm")); - mimeTypes.insert(std::pair("s3m", "audio/s3m")); - mimeTypes.insert(std::pair("saveme", "application/octet-stream")); - mimeTypes.insert(std::pair("sbk", "application/x-tbook")); - mimeTypes.insert(std::pair("scm", "video/x-scm")); - mimeTypes.insert(std::pair("sdml", "text/plain")); - mimeTypes.insert(std::pair("sdp", "application/sdp")); - mimeTypes.insert(std::pair("sdr", "application/sounder")); - mimeTypes.insert(std::pair("sea", "application/sea")); - mimeTypes.insert(std::pair("set", "application/set")); - mimeTypes.insert(std::pair("sgm", "text/sgml")); - mimeTypes.insert(std::pair("sgml", "text/sgml")); - mimeTypes.insert(std::pair("sh", "text/x-script.sh")); - mimeTypes.insert(std::pair("shar", "application/x-bsh")); - mimeTypes.insert(std::pair("shtml", "text/html")); - mimeTypes.insert(std::pair("shtml", "text/x-server-parsed-html")); - mimeTypes.insert(std::pair("sid", "audio/x-psid")); - mimeTypes.insert(std::pair("sit", "application/x-sit")); - mimeTypes.insert(std::pair("sit", "application/x-stuffit")); - mimeTypes.insert(std::pair("skd", "application/x-koan")); - mimeTypes.insert(std::pair("skm", "application/x-koan")); - mimeTypes.insert(std::pair("skp", "application/x-koan")); - mimeTypes.insert(std::pair("skt", "application/x-koan")); - mimeTypes.insert(std::pair("sl", "application/x-seelogo")); - mimeTypes.insert(std::pair("smi", "application/smil")); - mimeTypes.insert(std::pair("smil", "application/smil")); - mimeTypes.insert(std::pair("snd", "audio/basic")); - mimeTypes.insert(std::pair("sol", "application/solids")); - mimeTypes.insert(std::pair("spc", "text/x-speech")); - mimeTypes.insert(std::pair("spl", "application/futuresplash")); - mimeTypes.insert(std::pair("spr", "application/x-sprite")); - mimeTypes.insert(std::pair("sprite", "application/x-sprite")); - mimeTypes.insert(std::pair("src", "application/x-wais-source")); - mimeTypes.insert(std::pair("ssi", "text/x-server-parsed-html")); - mimeTypes.insert(std::pair("ssm", "application/streamingmedia")); - mimeTypes.insert(std::pair("sst", "application/vnd.ms-pki.certstore")); - mimeTypes.insert(std::pair("step", "application/step")); - mimeTypes.insert(std::pair("stl", "application/sla")); - mimeTypes.insert(std::pair("stp", "application/step")); - mimeTypes.insert(std::pair("sv4cpio", "application/x-sv4cpio")); - mimeTypes.insert(std::pair("sv4crc", "application/x-sv4crc")); - mimeTypes.insert(std::pair("svf", "image/vnd.dwg")); - mimeTypes.insert(std::pair("svr", "application/x-world")); - mimeTypes.insert(std::pair("swf", "application/x-shockwave-flash")); - mimeTypes.insert(std::pair("t", "application/x-troff")); - mimeTypes.insert(std::pair("talk", "text/x-speech")); - mimeTypes.insert(std::pair("tar", "application/x-tar")); - mimeTypes.insert(std::pair("tbk", "application/toolbook")); - mimeTypes.insert(std::pair("tcl", "text/x-script.tcl")); - mimeTypes.insert(std::pair("tcsh", "text/x-script.tcsh")); - mimeTypes.insert(std::pair("tex", "application/x-tex")); - mimeTypes.insert(std::pair("texi", "application/x-texinfo")); - mimeTypes.insert(std::pair("texinfo", "application/x-texinfo")); - mimeTypes.insert(std::pair("text", "text/plain")); - mimeTypes.insert(std::pair("tgz", "application/x-compressed")); - mimeTypes.insert(std::pair("tif", "image/tiff")); - mimeTypes.insert(std::pair("tiff", "image/tiff")); - mimeTypes.insert(std::pair("tr", "application/x-troff")); - mimeTypes.insert(std::pair("ts", "video/mp2t")); - mimeTypes.insert(std::pair("tsi", "audio/tsp-audio")); - mimeTypes.insert(std::pair("tsp", "audio/tsplayer")); - mimeTypes.insert(std::pair("tsv", "text/tab-separated-values")); - mimeTypes.insert(std::pair("turbot", "image/florian")); - mimeTypes.insert(std::pair("txt", "text/plain")); - mimeTypes.insert(std::pair("uil", "text/x-uil")); - mimeTypes.insert(std::pair("uni", "text/uri-list")); - mimeTypes.insert(std::pair("unis", "text/uri-list")); - mimeTypes.insert(std::pair("unv", "application/i-deas")); - mimeTypes.insert(std::pair("uri", "text/uri-list")); - mimeTypes.insert(std::pair("uris", "text/uri-list")); - mimeTypes.insert(std::pair("ustar", "application/x-ustar")); - mimeTypes.insert(std::pair("uu", "text/x-uuencode")); - mimeTypes.insert(std::pair("uue", "text/x-uuencode")); - mimeTypes.insert(std::pair("vcd", "application/x-cdlink")); - mimeTypes.insert(std::pair("vcs", "text/x-vcalendar")); - mimeTypes.insert(std::pair("vda", "application/vda")); - mimeTypes.insert(std::pair("vdo", "video/vdo")); - mimeTypes.insert(std::pair("vew", "application/groupwise")); - mimeTypes.insert(std::pair("viv", "video/vivo")); - mimeTypes.insert(std::pair("vivo", "video/vivo")); - mimeTypes.insert(std::pair("vmd", "application/vocaltec-media-desc")); - mimeTypes.insert(std::pair("vmf", "application/vocaltec-media-file")); - mimeTypes.insert(std::pair("voc", "audio/voc")); - mimeTypes.insert(std::pair("vos", "video/vosaic")); - mimeTypes.insert(std::pair("vox", "audio/voxware")); - mimeTypes.insert(std::pair("vqe", "audio/x-twinvq-plugin")); - mimeTypes.insert(std::pair("vqf", "audio/x-twinvq")); - mimeTypes.insert(std::pair("vql", "audio/x-twinvq-plugin")); - mimeTypes.insert(std::pair("vrml", "application/x-vrml")); - mimeTypes.insert(std::pair("vrt", "x-world/x-vrt")); - mimeTypes.insert(std::pair("vsd", "application/x-visio")); - mimeTypes.insert(std::pair("vst", "application/x-visio")); - mimeTypes.insert(std::pair("vsw", "application/x-visio")); - mimeTypes.insert(std::pair("w60", "application/wordperfect6.0")); - mimeTypes.insert(std::pair("w61", "application/wordperfect6.1")); - mimeTypes.insert(std::pair("w6w", "application/msword")); - mimeTypes.insert(std::pair("wav", "audio/wav")); - mimeTypes.insert(std::pair("wb1", "application/x-qpro")); - mimeTypes.insert(std::pair("wbmp", "image/vnd.wap.wbmp")); - mimeTypes.insert(std::pair("web", "application/vnd.xara")); - mimeTypes.insert(std::pair("wiz", "application/msword")); - mimeTypes.insert(std::pair("wk1", "application/x-123")); - mimeTypes.insert(std::pair("wma", "audio/x-ms-wma")); - mimeTypes.insert(std::pair("wmf", "windows/metafile")); - mimeTypes.insert(std::pair("wml", "text/vnd.wap.wml")); - mimeTypes.insert(std::pair("wmlc", "application/vnd.wap.wmlc")); - mimeTypes.insert(std::pair("wmls", "text/vnd.wap.wmlscript")); - mimeTypes.insert(std::pair("wmlsc", "application/vnd.wap.wmlscriptc")); - mimeTypes.insert(std::pair("wmv", "video/x-ms-wmv")); - mimeTypes.insert(std::pair("word", "application/msword")); - mimeTypes.insert(std::pair("wp", "application/wordperfect")); - mimeTypes.insert(std::pair("wp5", "application/wordperfect")); - mimeTypes.insert(std::pair("wp6", "application/wordperfect")); - mimeTypes.insert(std::pair("wpd", "application/wordperfect")); - mimeTypes.insert(std::pair("wq1", "application/x-lotus")); - mimeTypes.insert(std::pair("wri", "application/mswrite")); - mimeTypes.insert(std::pair("wrl", "model/vrml")); - mimeTypes.insert(std::pair("wrz", "model/vrml")); - mimeTypes.insert(std::pair("wsc", "text/scriplet")); - mimeTypes.insert(std::pair("wsrc", "application/x-wais-source")); - mimeTypes.insert(std::pair("wtk", "application/x-wintalk")); - mimeTypes.insert(std::pair("xbm", "image/xbm")); - mimeTypes.insert(std::pair("xdr", "video/x-amt-demorun")); - mimeTypes.insert(std::pair("xgz", "xgl/drawing")); - mimeTypes.insert(std::pair("xif", "image/vnd.xiff")); - mimeTypes.insert(std::pair("xl", "application/excel")); - mimeTypes.insert(std::pair("xla", "application/excel")); - mimeTypes.insert(std::pair("xlb", "application/excel")); - mimeTypes.insert(std::pair("xlc", "application/excel")); - mimeTypes.insert(std::pair("xld", "application/excel")); - mimeTypes.insert(std::pair("xlk", "application/excel")); - mimeTypes.insert(std::pair("xll", "application/excel")); - mimeTypes.insert(std::pair("xlm", "application/excel")); - mimeTypes.insert(std::pair("xls", "application/excel")); - mimeTypes.insert(std::pair("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); - mimeTypes.insert(std::pair("xlt", "application/excel")); - mimeTypes.insert(std::pair("xlv", "application/excel")); - mimeTypes.insert(std::pair("xlw", "application/excel")); - mimeTypes.insert(std::pair("xm", "audio/xm")); - mimeTypes.insert(std::pair("xml", "text/xml")); - mimeTypes.insert(std::pair("xmz", "xgl/movie")); - mimeTypes.insert(std::pair("xpix", "application/x-vnd.ls-xpix")); - mimeTypes.insert(std::pair("xpm", "image/xpm")); - mimeTypes.insert(std::pair("x-png", "image/png")); - mimeTypes.insert(std::pair("xsr", "video/x-amt-showrun")); - mimeTypes.insert(std::pair("xvid", "video/x-msvideo")); - mimeTypes.insert(std::pair("xwd", "image/x-xwd")); - mimeTypes.insert(std::pair("xyz", "chemical/x-pdb")); - mimeTypes.insert(std::pair("z", "application/x-compressed")); - mimeTypes.insert(std::pair("zip", "application/zip")); - mimeTypes.insert(std::pair("zoo", "application/octet-stream")); - mimeTypes.insert(std::pair("zsh", "text/x-script.zsh")); + mimeTypes.insert(pair("3dm", "x-world/x-3dmf")); + mimeTypes.insert(pair("3dmf", "x-world/x-3dmf")); + mimeTypes.insert(pair("a", "application/octet-stream")); + mimeTypes.insert(pair("aab", "application/x-authorware-bin")); + mimeTypes.insert(pair("aam", "application/x-authorware-map")); + mimeTypes.insert(pair("aas", "application/x-authorware-seg")); + mimeTypes.insert(pair("abc", "text/vnd.abc")); + mimeTypes.insert(pair("acgi", "text/html")); + mimeTypes.insert(pair("afl", "video/animaflex")); + mimeTypes.insert(pair("ai", "application/postscript")); + mimeTypes.insert(pair("aif", "audio/aiff")); + mimeTypes.insert(pair("aifc", "audio/x-aiff")); + mimeTypes.insert(pair("aiff", "audio/aiff")); + mimeTypes.insert(pair("aim", "application/x-aim")); + mimeTypes.insert(pair("aip", "text/x-audiosoft-intra")); + mimeTypes.insert(pair("ani", "application/x-navi-animation")); + mimeTypes.insert(pair("aos", "application/x-nokia-9000-communicator-add-on-software")); + mimeTypes.insert(pair("aps", "application/mime")); + mimeTypes.insert(pair("arc", "application/octet-stream")); + mimeTypes.insert(pair("arj", "application/arj")); + mimeTypes.insert(pair("art", "image/x-jg")); + mimeTypes.insert(pair("asf", "video/x-ms-asf")); + mimeTypes.insert(pair("asm", "text/x-asm")); + mimeTypes.insert(pair("asp", "text/asp")); + mimeTypes.insert(pair("asx", "video/x-ms-asf")); + mimeTypes.insert(pair("au", "audio/basic")); + mimeTypes.insert(pair("avi", "video/avi")); + mimeTypes.insert(pair("avs", "video/avs-video")); + mimeTypes.insert(pair("bcpio", "application/x-bcpio")); + mimeTypes.insert(pair("bin", "application/octet-stream")); + mimeTypes.insert(pair("bm", "image/bmp")); + mimeTypes.insert(pair("bmp", "image/bmp")); + mimeTypes.insert(pair("boo", "application/book")); + mimeTypes.insert(pair("book", "application/book")); + mimeTypes.insert(pair("boz", "application/x-bzip2")); + mimeTypes.insert(pair("bsh", "application/x-bsh")); + mimeTypes.insert(pair("bz", "application/x-bzip")); + mimeTypes.insert(pair("bz2", "application/x-bzip2")); + mimeTypes.insert(pair("c", "text/plain")); + mimeTypes.insert(pair("c++", "text/plain")); + mimeTypes.insert(pair("cat", "application/vnd.ms-pki.seccat")); + mimeTypes.insert(pair("cc", "text/plain")); + mimeTypes.insert(pair("ccad", "application/clariscad")); + mimeTypes.insert(pair("cco", "application/x-cocoa")); + mimeTypes.insert(pair("cdf", "application/cdf")); + mimeTypes.insert(pair("cer", "application/pkix-cert")); + mimeTypes.insert(pair("cer", "application/x-x509-ca-cert")); + mimeTypes.insert(pair("cha", "application/x-chat")); + mimeTypes.insert(pair("chat", "application/x-chat")); + mimeTypes.insert(pair("class", "application/java")); + mimeTypes.insert(pair("com", "application/octet-stream")); + mimeTypes.insert(pair("conf", "text/plain")); + mimeTypes.insert(pair("cpio", "application/x-cpio")); + mimeTypes.insert(pair("cpp", "text/x-c")); + mimeTypes.insert(pair("cpt", "application/x-cpt")); + mimeTypes.insert(pair("crl", "application/pkcs-crl")); + mimeTypes.insert(pair("crt", "application/pkix-cert")); + mimeTypes.insert(pair("csh", "application/x-csh")); + mimeTypes.insert(pair("css", "text/css")); + mimeTypes.insert(pair("cxx", "text/plain")); + mimeTypes.insert(pair("dcr", "application/x-director")); + mimeTypes.insert(pair("deepv", "application/x-deepv")); + mimeTypes.insert(pair("def", "text/plain")); + mimeTypes.insert(pair("der", "application/x-x509-ca-cert")); + mimeTypes.insert(pair("dif", "video/x-dv")); + mimeTypes.insert(pair("dir", "application/x-director")); + mimeTypes.insert(pair("dl", "video/dl")); + mimeTypes.insert(pair("divx", "video/x-msvideo")); + mimeTypes.insert(pair("doc", "application/msword")); + mimeTypes.insert(pair("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document")); + mimeTypes.insert(pair("dot", "application/msword")); + mimeTypes.insert(pair("dp", "application/commonground")); + mimeTypes.insert(pair("drw", "application/drafting")); + mimeTypes.insert(pair("dump", "application/octet-stream")); + mimeTypes.insert(pair("dv", "video/x-dv")); + mimeTypes.insert(pair("dvi", "application/x-dvi")); + mimeTypes.insert(pair("dwf", "model/vnd.dwf")); + mimeTypes.insert(pair("dwg", "image/vnd.dwg")); + mimeTypes.insert(pair("dxf", "image/vnd.dwg")); + mimeTypes.insert(pair("dxr", "application/x-director")); + mimeTypes.insert(pair("el", "text/x-script.elisp")); + mimeTypes.insert(pair("elc", "application/x-elc")); + mimeTypes.insert(pair("env", "application/x-envoy")); + mimeTypes.insert(pair("eps", "application/postscript")); + mimeTypes.insert(pair("es", "application/x-esrehber")); + mimeTypes.insert(pair("etx", "text/x-setext")); + mimeTypes.insert(pair("evy", "application/envoy")); + mimeTypes.insert(pair("exe", "application/octet-stream")); + mimeTypes.insert(pair("f", "text/x-fortran")); + mimeTypes.insert(pair("f77", "text/x-fortran")); + mimeTypes.insert(pair("f90", "text/x-fortran")); + mimeTypes.insert(pair("fdf", "application/vnd.fdf")); + mimeTypes.insert(pair("fif", "image/fif")); + mimeTypes.insert(pair("flac", "audio/flac")); + mimeTypes.insert(pair("fli", "video/fli")); + mimeTypes.insert(pair("flo", "image/florian")); + mimeTypes.insert(pair("flv", "video/x-flv")); + mimeTypes.insert(pair("flx", "text/vnd.fmi.flexstor")); + mimeTypes.insert(pair("fmf", "video/x-atomic3d-feature")); + mimeTypes.insert(pair("for", "text/plain")); + mimeTypes.insert(pair("for", "text/x-fortran")); + mimeTypes.insert(pair("fpx", "image/vnd.fpx")); + mimeTypes.insert(pair("frl", "application/freeloader")); + mimeTypes.insert(pair("funk", "audio/make")); + mimeTypes.insert(pair("g", "text/plain")); + mimeTypes.insert(pair("g3", "image/g3fax")); + mimeTypes.insert(pair("gif", "image/gif")); + mimeTypes.insert(pair("gl", "video/x-gl")); + mimeTypes.insert(pair("gsd", "audio/x-gsm")); + mimeTypes.insert(pair("gsm", "audio/x-gsm")); + mimeTypes.insert(pair("gsp", "application/x-gsp")); + mimeTypes.insert(pair("gss", "application/x-gss")); + mimeTypes.insert(pair("gtar", "application/x-gtar")); + mimeTypes.insert(pair("gz", "application/x-compressed")); + mimeTypes.insert(pair("gzip", "application/x-gzip")); + mimeTypes.insert(pair("h", "text/plain")); + mimeTypes.insert(pair("hdf", "application/x-hdf")); + mimeTypes.insert(pair("help", "application/x-helpfile")); + mimeTypes.insert(pair("hgl", "application/vnd.hp-hpgl")); + mimeTypes.insert(pair("hh", "text/plain")); + mimeTypes.insert(pair("hlb", "text/x-script")); + mimeTypes.insert(pair("hlp", "application/hlp")); + mimeTypes.insert(pair("hpg", "application/vnd.hp-hpgl")); + mimeTypes.insert(pair("hpgl", "application/vnd.hp-hpgl")); + mimeTypes.insert(pair("hqx", "application/binhex")); + mimeTypes.insert(pair("hta", "application/hta")); + mimeTypes.insert(pair("htc", "text/x-component")); + mimeTypes.insert(pair("htm", "text/html")); + mimeTypes.insert(pair("html", "text/html")); + mimeTypes.insert(pair("htmls", "text/html")); + mimeTypes.insert(pair("htt", "text/webviewhtml")); + mimeTypes.insert(pair("htx", "text/html")); + mimeTypes.insert(pair("ice", "x-conference/x-cooltalk")); + mimeTypes.insert(pair("ico", "image/x-icon")); + mimeTypes.insert(pair("idc", "text/plain")); + mimeTypes.insert(pair("ief", "image/ief")); + mimeTypes.insert(pair("iefs", "image/ief")); + mimeTypes.insert(pair("iges", "application/iges")); + mimeTypes.insert(pair("igs", "application/iges")); + mimeTypes.insert(pair("igs", "model/iges")); + mimeTypes.insert(pair("ima", "application/x-ima")); + mimeTypes.insert(pair("imap", "application/x-httpd-imap")); + mimeTypes.insert(pair("inf", "application/inf")); + mimeTypes.insert(pair("ins", "application/x-internett-signup")); + mimeTypes.insert(pair("ip", "application/x-ip2")); + mimeTypes.insert(pair("isu", "video/x-isvideo")); + mimeTypes.insert(pair("it", "audio/it")); + mimeTypes.insert(pair("iv", "application/x-inventor")); + mimeTypes.insert(pair("ivr", "i-world/i-vrml")); + mimeTypes.insert(pair("ivy", "application/x-livescreen")); + mimeTypes.insert(pair("jam", "audio/x-jam")); + mimeTypes.insert(pair("jav", "text/x-java-source")); + mimeTypes.insert(pair("java", "text/x-java-source")); + mimeTypes.insert(pair("jcm", "application/x-java-commerce")); + mimeTypes.insert(pair("jfif", "image/jpeg")); + mimeTypes.insert(pair("jfif-tbnl", "image/jpeg")); + mimeTypes.insert(pair("jpe", "image/jpeg")); + mimeTypes.insert(pair("jpeg", "image/jpeg")); + mimeTypes.insert(pair("jpg", "image/jpeg")); + mimeTypes.insert(pair("jps", "image/x-jps")); + mimeTypes.insert(pair("js", "application/javascript")); + mimeTypes.insert(pair("json", "application/json")); + mimeTypes.insert(pair("jut", "image/jutvision")); + mimeTypes.insert(pair("kar", "music/x-karaoke")); + mimeTypes.insert(pair("ksh", "application/x-ksh")); + mimeTypes.insert(pair("ksh", "text/x-script.ksh")); + mimeTypes.insert(pair("la", "audio/nspaudio")); + mimeTypes.insert(pair("lam", "audio/x-liveaudio")); + mimeTypes.insert(pair("latex", "application/x-latex")); + mimeTypes.insert(pair("lha", "application/lha")); + mimeTypes.insert(pair("lhx", "application/octet-stream")); + mimeTypes.insert(pair("list", "text/plain")); + mimeTypes.insert(pair("lma", "audio/nspaudio")); + mimeTypes.insert(pair("log", "text/plain")); + mimeTypes.insert(pair("lsp", "application/x-lisp")); + mimeTypes.insert(pair("lst", "text/plain")); + mimeTypes.insert(pair("lsx", "text/x-la-asf")); + mimeTypes.insert(pair("ltx", "application/x-latex")); + mimeTypes.insert(pair("lzh", "application/x-lzh")); + mimeTypes.insert(pair("lzx", "application/lzx")); + mimeTypes.insert(pair("m", "text/x-m")); + mimeTypes.insert(pair("m1v", "video/mpeg")); + mimeTypes.insert(pair("m2a", "audio/mpeg")); + mimeTypes.insert(pair("m2v", "video/mpeg")); + mimeTypes.insert(pair("m3u", "audio/x-mpequrl")); + mimeTypes.insert(pair("man", "application/x-troff-man")); + mimeTypes.insert(pair("map", "application/x-navimap")); + mimeTypes.insert(pair("mar", "text/plain")); + mimeTypes.insert(pair("mbd", "application/mbedlet")); + mimeTypes.insert(pair("mc$", "application/x-magic-cap-package-1.0")); + mimeTypes.insert(pair("mcd", "application/x-mathcad")); + mimeTypes.insert(pair("mcf", "text/mcf")); + mimeTypes.insert(pair("mcp", "application/netmc")); + mimeTypes.insert(pair("me", "application/x-troff-me")); + mimeTypes.insert(pair("mht", "message/rfc822")); + mimeTypes.insert(pair("mhtml", "message/rfc822")); + mimeTypes.insert(pair("mid", "audio/midi")); + mimeTypes.insert(pair("midi", "audio/midi")); + mimeTypes.insert(pair("mif", "application/x-mif")); + mimeTypes.insert(pair("mime", "message/rfc822")); + mimeTypes.insert(pair("mjf", "audio/x-vnd.audioexplosion.mjuicemediafile")); + mimeTypes.insert(pair("mjpg", "video/x-motion-jpeg")); + mimeTypes.insert(pair("mka", "audio/x-matroska")); + mimeTypes.insert(pair("mkv", "video/x-matroska")); + mimeTypes.insert(pair("mk3d", "video/x-matroska-3d")); + mimeTypes.insert(pair("mm", "application/x-meme")); + mimeTypes.insert(pair("mme", "application/base64")); + mimeTypes.insert(pair("mod", "audio/mod")); + mimeTypes.insert(pair("moov", "video/quicktime")); + mimeTypes.insert(pair("mov", "video/quicktime")); + mimeTypes.insert(pair("movie", "video/x-sgi-movie")); + mimeTypes.insert(pair("mp2", "audio/mpeg")); + mimeTypes.insert(pair("mp3", "audio/mpeg3")); + mimeTypes.insert(pair("mp4", "video/mp4")); + mimeTypes.insert(pair("mpa", "audio/mpeg")); + mimeTypes.insert(pair("mpc", "application/x-project")); + mimeTypes.insert(pair("mpe", "video/mpeg")); + mimeTypes.insert(pair("mpeg", "video/mpeg")); + mimeTypes.insert(pair("mpg", "video/mpeg")); + mimeTypes.insert(pair("mpga", "audio/mpeg")); + mimeTypes.insert(pair("mpp", "application/vnd.ms-project")); + mimeTypes.insert(pair("mpt", "application/x-project")); + mimeTypes.insert(pair("mpv", "application/x-project")); + mimeTypes.insert(pair("mpx", "application/x-project")); + mimeTypes.insert(pair("mrc", "application/marc")); + mimeTypes.insert(pair("ms", "application/x-troff-ms")); + mimeTypes.insert(pair("mv", "video/x-sgi-movie")); + mimeTypes.insert(pair("my", "audio/make")); + mimeTypes.insert(pair("mzz", "application/x-vnd.audioexplosion.mzz")); + mimeTypes.insert(pair("nap", "image/naplps")); + mimeTypes.insert(pair("naplps", "image/naplps")); + mimeTypes.insert(pair("nc", "application/x-netcdf")); + mimeTypes.insert(pair("ncm", "application/vnd.nokia.configuration-message")); + mimeTypes.insert(pair("nfo", "text/xml")); + mimeTypes.insert(pair("nif", "image/x-niff")); + mimeTypes.insert(pair("niff", "image/x-niff")); + mimeTypes.insert(pair("nix", "application/x-mix-transfer")); + mimeTypes.insert(pair("nsc", "application/x-conference")); + mimeTypes.insert(pair("nvd", "application/x-navidoc")); + mimeTypes.insert(pair("o", "application/octet-stream")); + mimeTypes.insert(pair("oda", "application/oda")); + mimeTypes.insert(pair("ogg", "audio/ogg")); + mimeTypes.insert(pair("omc", "application/x-omc")); + mimeTypes.insert(pair("omcd", "application/x-omcdatamaker")); + mimeTypes.insert(pair("omcr", "application/x-omcregerator")); + mimeTypes.insert(pair("p", "text/x-pascal")); + mimeTypes.insert(pair("p10", "application/pkcs10")); + mimeTypes.insert(pair("p12", "application/pkcs-12")); + mimeTypes.insert(pair("p7a", "application/x-pkcs7-signature")); + mimeTypes.insert(pair("p7c", "application/pkcs7-mime")); + mimeTypes.insert(pair("p7m", "application/pkcs7-mime")); + mimeTypes.insert(pair("p7r", "application/x-pkcs7-certreqresp")); + mimeTypes.insert(pair("p7s", "application/pkcs7-signature")); + mimeTypes.insert(pair("part", "application/pro_eng")); + mimeTypes.insert(pair("pas", "text/pascal")); + mimeTypes.insert(pair("pbm", "image/x-portable-bitmap")); + mimeTypes.insert(pair("pcl", "application/vnd.hp-pcl")); + mimeTypes.insert(pair("pct", "image/x-pict")); + mimeTypes.insert(pair("pcx", "image/x-pcx")); + mimeTypes.insert(pair("pdb", "chemical/x-pdb")); + mimeTypes.insert(pair("pdf", "application/pdf")); + mimeTypes.insert(pair("pfunk", "audio/make.my.funk")); + mimeTypes.insert(pair("pgm", "image/x-portable-greymap")); + mimeTypes.insert(pair("pic", "image/pict")); + mimeTypes.insert(pair("pict", "image/pict")); + mimeTypes.insert(pair("pkg", "application/x-newton-compatible-pkg")); + mimeTypes.insert(pair("pko", "application/vnd.ms-pki.pko")); + mimeTypes.insert(pair("pl", "text/x-script.perl")); + mimeTypes.insert(pair("plx", "application/x-pixclscript")); + mimeTypes.insert(pair("pm", "text/x-script.perl-module")); + mimeTypes.insert(pair("pm4", "application/x-pagemaker")); + mimeTypes.insert(pair("pm5", "application/x-pagemaker")); + mimeTypes.insert(pair("png", "image/png")); + mimeTypes.insert(pair("pnm", "application/x-portable-anymap")); + mimeTypes.insert(pair("pot", "application/vnd.ms-powerpoint")); + mimeTypes.insert(pair("pov", "model/x-pov")); + mimeTypes.insert(pair("ppa", "application/vnd.ms-powerpoint")); + mimeTypes.insert(pair("ppm", "image/x-portable-pixmap")); + mimeTypes.insert(pair("pps", "application/mspowerpoint")); + mimeTypes.insert(pair("ppt", "application/mspowerpoint")); + mimeTypes.insert(pair("ppz", "application/mspowerpoint")); + mimeTypes.insert(pair("pre", "application/x-freelance")); + mimeTypes.insert(pair("prt", "application/pro_eng")); + mimeTypes.insert(pair("ps", "application/postscript")); + mimeTypes.insert(pair("psd", "application/octet-stream")); + mimeTypes.insert(pair("pvu", "paleovu/x-pv")); + mimeTypes.insert(pair("pwz", "application/vnd.ms-powerpoint")); + mimeTypes.insert(pair("py", "text/x-script.phyton")); + mimeTypes.insert(pair("pyc", "applicaiton/x-bytecode.python")); + mimeTypes.insert(pair("qcp", "audio/vnd.qcelp")); + mimeTypes.insert(pair("qd3", "x-world/x-3dmf")); + mimeTypes.insert(pair("qd3d", "x-world/x-3dmf")); + mimeTypes.insert(pair("qif", "image/x-quicktime")); + mimeTypes.insert(pair("qt", "video/quicktime")); + mimeTypes.insert(pair("qtc", "video/x-qtc")); + mimeTypes.insert(pair("qti", "image/x-quicktime")); + mimeTypes.insert(pair("qtif", "image/x-quicktime")); + mimeTypes.insert(pair("ra", "audio/x-realaudio")); + mimeTypes.insert(pair("ram", "audio/x-pn-realaudio")); + mimeTypes.insert(pair("ras", "image/cmu-raster")); + mimeTypes.insert(pair("rast", "image/cmu-raster")); + mimeTypes.insert(pair("rexx", "text/x-script.rexx")); + mimeTypes.insert(pair("rf", "image/vnd.rn-realflash")); + mimeTypes.insert(pair("rgb", "image/x-rgb")); + mimeTypes.insert(pair("rm", "audio/x-pn-realaudio")); + mimeTypes.insert(pair("rmi", "audio/mid")); + mimeTypes.insert(pair("rmm", "audio/x-pn-realaudio")); + mimeTypes.insert(pair("rmp", "audio/x-pn-realaudio")); + mimeTypes.insert(pair("rng", "application/ringing-tones")); + mimeTypes.insert(pair("rnx", "application/vnd.rn-realplayer")); + mimeTypes.insert(pair("roff", "application/x-troff")); + mimeTypes.insert(pair("rp", "image/vnd.rn-realpix")); + mimeTypes.insert(pair("rpm", "audio/x-pn-realaudio-plugin")); + mimeTypes.insert(pair("rt", "text/richtext")); + mimeTypes.insert(pair("rtf", "text/richtext")); + mimeTypes.insert(pair("rtx", "text/richtext")); + mimeTypes.insert(pair("rv", "video/vnd.rn-realvideo")); + mimeTypes.insert(pair("s", "text/x-asm")); + mimeTypes.insert(pair("s3m", "audio/s3m")); + mimeTypes.insert(pair("saveme", "application/octet-stream")); + mimeTypes.insert(pair("sbk", "application/x-tbook")); + mimeTypes.insert(pair("scm", "video/x-scm")); + mimeTypes.insert(pair("sdml", "text/plain")); + mimeTypes.insert(pair("sdp", "application/sdp")); + mimeTypes.insert(pair("sdr", "application/sounder")); + mimeTypes.insert(pair("sea", "application/sea")); + mimeTypes.insert(pair("set", "application/set")); + mimeTypes.insert(pair("sgm", "text/sgml")); + mimeTypes.insert(pair("sgml", "text/sgml")); + mimeTypes.insert(pair("sh", "text/x-script.sh")); + mimeTypes.insert(pair("shar", "application/x-bsh")); + mimeTypes.insert(pair("shtml", "text/html")); + mimeTypes.insert(pair("shtml", "text/x-server-parsed-html")); + mimeTypes.insert(pair("sid", "audio/x-psid")); + mimeTypes.insert(pair("sit", "application/x-sit")); + mimeTypes.insert(pair("sit", "application/x-stuffit")); + mimeTypes.insert(pair("skd", "application/x-koan")); + mimeTypes.insert(pair("skm", "application/x-koan")); + mimeTypes.insert(pair("skp", "application/x-koan")); + mimeTypes.insert(pair("skt", "application/x-koan")); + mimeTypes.insert(pair("sl", "application/x-seelogo")); + mimeTypes.insert(pair("smi", "application/smil")); + mimeTypes.insert(pair("smil", "application/smil")); + mimeTypes.insert(pair("snd", "audio/basic")); + mimeTypes.insert(pair("sol", "application/solids")); + mimeTypes.insert(pair("spc", "text/x-speech")); + mimeTypes.insert(pair("spl", "application/futuresplash")); + mimeTypes.insert(pair("spr", "application/x-sprite")); + mimeTypes.insert(pair("sprite", "application/x-sprite")); + mimeTypes.insert(pair("src", "application/x-wais-source")); + mimeTypes.insert(pair("ssi", "text/x-server-parsed-html")); + mimeTypes.insert(pair("ssm", "application/streamingmedia")); + mimeTypes.insert(pair("sst", "application/vnd.ms-pki.certstore")); + mimeTypes.insert(pair("step", "application/step")); + mimeTypes.insert(pair("stl", "application/sla")); + mimeTypes.insert(pair("stp", "application/step")); + mimeTypes.insert(pair("sv4cpio", "application/x-sv4cpio")); + mimeTypes.insert(pair("sv4crc", "application/x-sv4crc")); + mimeTypes.insert(pair("svf", "image/vnd.dwg")); + mimeTypes.insert(pair("svr", "application/x-world")); + mimeTypes.insert(pair("swf", "application/x-shockwave-flash")); + mimeTypes.insert(pair("t", "application/x-troff")); + mimeTypes.insert(pair("talk", "text/x-speech")); + mimeTypes.insert(pair("tar", "application/x-tar")); + mimeTypes.insert(pair("tbk", "application/toolbook")); + mimeTypes.insert(pair("tcl", "text/x-script.tcl")); + mimeTypes.insert(pair("tcsh", "text/x-script.tcsh")); + mimeTypes.insert(pair("tex", "application/x-tex")); + mimeTypes.insert(pair("texi", "application/x-texinfo")); + mimeTypes.insert(pair("texinfo", "application/x-texinfo")); + mimeTypes.insert(pair("text", "text/plain")); + mimeTypes.insert(pair("tgz", "application/x-compressed")); + mimeTypes.insert(pair("tif", "image/tiff")); + mimeTypes.insert(pair("tiff", "image/tiff")); + mimeTypes.insert(pair("tr", "application/x-troff")); + mimeTypes.insert(pair("ts", "video/mp2t")); + mimeTypes.insert(pair("tsi", "audio/tsp-audio")); + mimeTypes.insert(pair("tsp", "audio/tsplayer")); + mimeTypes.insert(pair("tsv", "text/tab-separated-values")); + mimeTypes.insert(pair("turbot", "image/florian")); + mimeTypes.insert(pair("txt", "text/plain")); + mimeTypes.insert(pair("uil", "text/x-uil")); + mimeTypes.insert(pair("uni", "text/uri-list")); + mimeTypes.insert(pair("unis", "text/uri-list")); + mimeTypes.insert(pair("unv", "application/i-deas")); + mimeTypes.insert(pair("uri", "text/uri-list")); + mimeTypes.insert(pair("uris", "text/uri-list")); + mimeTypes.insert(pair("ustar", "application/x-ustar")); + mimeTypes.insert(pair("uu", "text/x-uuencode")); + mimeTypes.insert(pair("uue", "text/x-uuencode")); + mimeTypes.insert(pair("vcd", "application/x-cdlink")); + mimeTypes.insert(pair("vcs", "text/x-vcalendar")); + mimeTypes.insert(pair("vda", "application/vda")); + mimeTypes.insert(pair("vdo", "video/vdo")); + mimeTypes.insert(pair("vew", "application/groupwise")); + mimeTypes.insert(pair("viv", "video/vivo")); + mimeTypes.insert(pair("vivo", "video/vivo")); + mimeTypes.insert(pair("vmd", "application/vocaltec-media-desc")); + mimeTypes.insert(pair("vmf", "application/vocaltec-media-file")); + mimeTypes.insert(pair("voc", "audio/voc")); + mimeTypes.insert(pair("vos", "video/vosaic")); + mimeTypes.insert(pair("vox", "audio/voxware")); + mimeTypes.insert(pair("vqe", "audio/x-twinvq-plugin")); + mimeTypes.insert(pair("vqf", "audio/x-twinvq")); + mimeTypes.insert(pair("vql", "audio/x-twinvq-plugin")); + mimeTypes.insert(pair("vrml", "application/x-vrml")); + mimeTypes.insert(pair("vrt", "x-world/x-vrt")); + mimeTypes.insert(pair("vsd", "application/x-visio")); + mimeTypes.insert(pair("vst", "application/x-visio")); + mimeTypes.insert(pair("vsw", "application/x-visio")); + mimeTypes.insert(pair("w60", "application/wordperfect6.0")); + mimeTypes.insert(pair("w61", "application/wordperfect6.1")); + mimeTypes.insert(pair("w6w", "application/msword")); + mimeTypes.insert(pair("wav", "audio/wav")); + mimeTypes.insert(pair("wb1", "application/x-qpro")); + mimeTypes.insert(pair("wbmp", "image/vnd.wap.wbmp")); + mimeTypes.insert(pair("web", "application/vnd.xara")); + mimeTypes.insert(pair("wiz", "application/msword")); + mimeTypes.insert(pair("wk1", "application/x-123")); + mimeTypes.insert(pair("wma", "audio/x-ms-wma")); + mimeTypes.insert(pair("wmf", "windows/metafile")); + mimeTypes.insert(pair("wml", "text/vnd.wap.wml")); + mimeTypes.insert(pair("wmlc", "application/vnd.wap.wmlc")); + mimeTypes.insert(pair("wmls", "text/vnd.wap.wmlscript")); + mimeTypes.insert(pair("wmlsc", "application/vnd.wap.wmlscriptc")); + mimeTypes.insert(pair("wmv", "video/x-ms-wmv")); + mimeTypes.insert(pair("word", "application/msword")); + mimeTypes.insert(pair("wp", "application/wordperfect")); + mimeTypes.insert(pair("wp5", "application/wordperfect")); + mimeTypes.insert(pair("wp6", "application/wordperfect")); + mimeTypes.insert(pair("wpd", "application/wordperfect")); + mimeTypes.insert(pair("wq1", "application/x-lotus")); + mimeTypes.insert(pair("wri", "application/mswrite")); + mimeTypes.insert(pair("wrl", "model/vrml")); + mimeTypes.insert(pair("wrz", "model/vrml")); + mimeTypes.insert(pair("wsc", "text/scriplet")); + mimeTypes.insert(pair("wsrc", "application/x-wais-source")); + mimeTypes.insert(pair("wtk", "application/x-wintalk")); + mimeTypes.insert(pair("xbm", "image/xbm")); + mimeTypes.insert(pair("xdr", "video/x-amt-demorun")); + mimeTypes.insert(pair("xgz", "xgl/drawing")); + mimeTypes.insert(pair("xif", "image/vnd.xiff")); + mimeTypes.insert(pair("xl", "application/excel")); + mimeTypes.insert(pair("xla", "application/excel")); + mimeTypes.insert(pair("xlb", "application/excel")); + mimeTypes.insert(pair("xlc", "application/excel")); + mimeTypes.insert(pair("xld", "application/excel")); + mimeTypes.insert(pair("xlk", "application/excel")); + mimeTypes.insert(pair("xll", "application/excel")); + mimeTypes.insert(pair("xlm", "application/excel")); + mimeTypes.insert(pair("xls", "application/excel")); + mimeTypes.insert(pair("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); + mimeTypes.insert(pair("xlt", "application/excel")); + mimeTypes.insert(pair("xlv", "application/excel")); + mimeTypes.insert(pair("xlw", "application/excel")); + mimeTypes.insert(pair("xm", "audio/xm")); + mimeTypes.insert(pair("xml", "text/xml")); + mimeTypes.insert(pair("xmz", "xgl/movie")); + mimeTypes.insert(pair("xpix", "application/x-vnd.ls-xpix")); + mimeTypes.insert(pair("xpm", "image/xpm")); + mimeTypes.insert(pair("x-png", "image/png")); + mimeTypes.insert(pair("xsr", "video/x-amt-showrun")); + mimeTypes.insert(pair("xvid", "video/x-msvideo")); + mimeTypes.insert(pair("xwd", "image/x-xwd")); + mimeTypes.insert(pair("xyz", "chemical/x-pdb")); + mimeTypes.insert(pair("z", "application/x-compressed")); + mimeTypes.insert(pair("zip", "application/zip")); + mimeTypes.insert(pair("zoo", "application/octet-stream")); + mimeTypes.insert(pair("zsh", "text/x-script.zsh")); return mimeTypes; } -std::map CMime::m_mimetypes = fillMimeTypes(); +map CMime::m_mimetypes = fillMimeTypes(); -std::string CMime::GetMimeType(const std::string &extension) +string CMime::GetMimeType(const string &extension) { if (extension.empty()) return ""; - std::string ext = extension; + string ext = extension; size_t posNotPoint = ext.find_first_not_of('.'); - if (posNotPoint != std::string::npos && posNotPoint > 0) + if (posNotPoint != string::npos && posNotPoint > 0) ext = extension.substr(posNotPoint); transform(ext.begin(), ext.end(), ext.begin(), ::tolower); - std::map::const_iterator it = m_mimetypes.find(ext); + map::const_iterator it = m_mimetypes.find(ext); if (it != m_mimetypes.end()) return it->second; return ""; } -std::string CMime::GetMimeType(const CFileItem &item) +string CMime::GetMimeType(const CFileItem &item) { std::string path = item.GetPath(); if (item.HasVideoInfoTag() && !item.GetVideoInfoTag()->GetPath().empty()) @@ -537,7 +539,7 @@ return GetMimeType(URIUtils::GetExtension(path)); } -std::string CMime::GetMimeType(const CURL &url, bool lookup) +string CMime::GetMimeType(const CURL &url, bool lookup) { std::string strMimeType; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Observer.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/Observer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/Observer.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Observer.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -24,6 +24,8 @@ #include +using namespace std; + Observer::~Observer(void) { StopObserving(); @@ -53,7 +55,7 @@ void Observer::UnregisterObservable(Observable *obs) { CSingleLock lock(m_obsCritSection); - std::vector::iterator it = find(m_observables.begin(), m_observables.end(), obs); + vector::iterator it = find(m_observables.begin(), m_observables.end(), obs); if (it != m_observables.end()) m_observables.erase(it); } @@ -107,7 +109,7 @@ void Observable::UnregisterObserver(Observer *obs) { CSingleLock lock(m_obsCritSection); - std::vector::iterator it = find(m_observers.begin(), m_observers.end(), obs); + vector::iterator it = find(m_observers.begin(), m_observers.end(), obs); if (it != m_observers.end()) { obs->UnregisterObservable(this); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/PerformanceSample.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/PerformanceSample.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/PerformanceSample.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/PerformanceSample.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -32,9 +32,11 @@ #include "PerformanceStats.h" #endif +using namespace std; + int64_t CPerformanceSample::m_tmFreq; -CPerformanceSample::CPerformanceSample(const std::string &statName, bool bCheckWhenDone) : m_statName(statName) +CPerformanceSample::CPerformanceSample(const string &statName, bool bCheckWhenDone) : m_statName(statName) { m_bCheckWhenDone = bCheckWhenDone; if (m_tmFreq == 0LL) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/PerformanceStats.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/PerformanceStats.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/PerformanceStats.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/PerformanceStats.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -22,6 +22,8 @@ #include "PerformanceSample.h" #include "log.h" +using namespace std; + CPerformanceStats::CPerformanceStats() { } @@ -29,7 +31,7 @@ CPerformanceStats::~CPerformanceStats() { - std::map::iterator iter = m_mapStats.begin(); + map::iterator iter = m_mapStats.begin(); while (iter != m_mapStats.end()) { delete iter->second; @@ -38,9 +40,9 @@ m_mapStats.clear(); } -void CPerformanceStats::AddSample(const std::string &strStatName, const PerformanceCounter &perf) +void CPerformanceStats::AddSample(const string &strStatName, const PerformanceCounter &perf) { - std::map::iterator iter = m_mapStats.find(strStatName); + map::iterator iter = m_mapStats.find(strStatName); if (iter == m_mapStats.end()) m_mapStats[strStatName] = new PerformanceCounter(perf); else @@ -50,7 +52,7 @@ } } -void CPerformanceStats::AddSample(const std::string &strStatName, double dTime) +void CPerformanceStats::AddSample(const string &strStatName, double dTime) { AddSample(strStatName, PerformanceCounter(dTime)); } @@ -61,7 +63,7 @@ CLog::Log(LOGINFO, "%s - estimated error: %f", __FUNCTION__, dError); CLog::Log(LOGINFO, "%s - ignore user/sys values when sample count is low", __FUNCTION__); - std::map::iterator iter = m_mapStats.begin(); + map::iterator iter = m_mapStats.begin(); while (iter != m_mapStats.end()) { double dAvg = iter->second->m_time / (double)iter->second->m_samples; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/ProgressJob.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/ProgressJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/ProgressJob.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/ProgressJob.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -24,7 +24,8 @@ #include "dialogs/GUIDialogProgress.h" #include "dialogs/GUIDialogExtendedProgressBar.h" #include "guilib/GUIWindowManager.h" -#include "utils/Variant.h" + +using namespace std; CProgressJob::CProgressJob() : m_modal(false), @@ -105,7 +106,7 @@ return; // show the progress dialog as a modal dialog with a progress bar - m_progressDialog->Open(); + m_progressDialog->StartModal(); m_progressDialog->ShowProgressBar(true); } @@ -118,7 +119,7 @@ m_progress->SetTitle(title); else if (m_progressDialog != NULL) { - m_progressDialog->SetHeading(CVariant{title}); + m_progressDialog->SetHeading(title); ShowProgressDialog(); } @@ -133,7 +134,7 @@ m_progress->SetText(text); else if (m_progressDialog != NULL) { - m_progressDialog->SetText(CVariant{text}); + m_progressDialog->SetText(text); ShowProgressDialog(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/RecentlyAddedJob.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/RecentlyAddedJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/RecentlyAddedJob.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/RecentlyAddedJob.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -63,7 +63,7 @@ { CFileItemPtr item = items.Get(i); std::string value = StringUtils::Format("%i", i + 1); - std::string strRating = StringUtils::Format("%.1f", item->GetVideoInfoTag()->m_fRating); + std::string strRating = StringUtils::Format("%.1f", item->GetVideoInfoTag()->m_fRating);; home->SetProperty("LatestMovie." + value + ".Title" , item->GetLabel()); home->SetProperty("LatestMovie." + value + ".Rating" , strRating); @@ -217,7 +217,7 @@ std::string strRating; std::string strAlbum = item->GetMusicInfoTag()->GetAlbum(); - std::string strArtist = item->GetMusicInfoTag()->GetArtistString(); + std::string strArtist = StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator); if (idAlbum != item->GetMusicInfoTag()->GetAlbumId()) { @@ -232,7 +232,7 @@ } } - strRating = StringUtils::Format("%c", item->GetMusicInfoTag()->GetUserrating()); + strRating = StringUtils::Format("%c", item->GetMusicInfoTag()->GetRating()); home->SetProperty("LatestSong." + value + ".Title" , item->GetMusicInfoTag()->GetTitle()); home->SetProperty("LatestSong." + value + ".Year" , item->GetMusicInfoTag()->GetYear()); @@ -272,7 +272,7 @@ home->SetProperty("LatestAlbum." + value + ".Title" , album.strAlbum); home->SetProperty("LatestAlbum." + value + ".Year" , album.iYear); - home->SetProperty("LatestAlbum." + value + ".Artist" , album.GetAlbumArtistString()); + home->SetProperty("LatestAlbum." + value + ".Artist" , StringUtils::Join(album.artist, g_advancedSettings.m_videoItemSeparator)); home->SetProperty("LatestAlbum." + value + ".Rating" , album.iRating); home->SetProperty("LatestAlbum." + value + ".Path" , strDBpath); home->SetProperty("LatestAlbum." + value + ".Thumb" , strThumb); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/RssManager.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/RssManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/RssManager.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/RssManager.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,28 +19,20 @@ */ #include "RssManager.h" - -#include - #include "addons/AddonInstaller.h" #include "addons/AddonManager.h" +#include "dialogs/GUIDialogYesNo.h" #include "filesystem/File.h" -#include "interfaces/builtins/Builtins.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" +#include "interfaces/Builtins.h" #include "profiles/ProfilesManager.h" #include "settings/lib/Setting.h" -#include "settings/Settings.h" #include "threads/SingleLock.h" #include "utils/log.h" #include "utils/RssReader.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" +using namespace std; using namespace XFILE; -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; CRssManager::CRssManager() { @@ -52,7 +44,7 @@ Stop(); } -CRssManager& CRssManager::GetInstance() +CRssManager& CRssManager::Get() { static CRssManager sRssManager; return sRssManager; @@ -74,15 +66,17 @@ return; const std::string &settingId = setting->GetId(); - if (settingId == CSettings::SETTING_LOOKANDFEEL_RSSEDIT) + if (settingId == "lookandfeel.rssedit") { ADDON::AddonPtr addon; - if (!ADDON::CAddonMgr::GetInstance().GetAddon("script.rss.editor", addon)) + ADDON::CAddonMgr::Get().GetAddon("script.rss.editor",addon); + if (!addon) { - if (!CAddonInstaller::GetInstance().InstallModal("script.rss.editor", addon)) + if (!CGUIDialogYesNo::ShowAndGetInput(24076, 24100, "RSS Editor", 24101)) return; + CAddonInstaller::Get().Install("script.rss.editor", true, "", false); } - CBuiltins::GetInstance().Execute("RunScript(script.rss.editor)"); + CBuiltins::Execute("RunScript(script.rss.editor)"); } } @@ -106,7 +100,7 @@ bool CRssManager::Load() { CSingleLock lock(m_critical); - std::string rssXML = CProfilesManager::GetInstance().GetUserDataItem("RssFeeds.xml"); + string rssXML = CProfilesManager::Get().GetUserDataItem("RssFeeds.xml"); if (!CFile::Exists(rssXML)) return false; @@ -147,14 +141,14 @@ { // TODO: UTF-8: Do these URLs need to be converted to UTF-8? // What about the xml encoding? - std::string strUrl = pFeed->FirstChild()->ValueStr(); + string strUrl = pFeed->FirstChild()->ValueStr(); set.url.push_back(strUrl); set.interval.push_back(iInterval); } pFeed = pFeed->NextSiblingElement("feed"); } - m_mapRssUrls.insert(std::make_pair(iId,set)); + m_mapRssUrls.insert(make_pair(iId,set)); } else CLog::Log(LOGERROR, "CRssManager: found rss url set with no id in RssFeeds.xml, ignored"); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/RssManager.h kodi-15.2~git20151019.1039-final/xbmc/utils/RssManager.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/RssManager.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/RssManager.h 2015-10-19 08:39:17.000000000 +0000 @@ -42,12 +42,12 @@ class CRssManager : public ISettingCallback, public ISettingsHandler { public: - static CRssManager& GetInstance(); + static CRssManager& Get(); - virtual void OnSettingsLoaded() override; - virtual void OnSettingsUnloaded() override; + virtual void OnSettingsLoaded(); + virtual void OnSettingsUnloaded(); - virtual void OnSettingAction(const CSetting *setting) override; + virtual void OnSettingAction(const CSetting *setting); void Start(); void Stop(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/RssReader.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/RssReader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/RssReader.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/RssReader.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -40,6 +40,7 @@ #define RSS_COLOR_HEADLINE 1 #define RSS_COLOR_CHANNEL 2 +using namespace std; using namespace XFILE; ////////////////////////////////////////////////////////////////////// @@ -65,7 +66,7 @@ delete m_vecTimeStamps[i]; } -void CRssReader::Create(IRssObserver* aObserver, const std::vector& aUrls, const std::vector ×, int spacesBetweenFeeds, bool rtl) +void CRssReader::Create(IRssObserver* aObserver, const vector& aUrls, const vector ×, int spacesBetweenFeeds, bool rtl) { CSingleLock lock(m_critical); @@ -143,7 +144,7 @@ // we wait for the network to come up if ((url.IsProtocol("http") || url.IsProtocol("https")) && - !g_application.getNetwork().IsAvailable()) + !g_application.getNetwork().IsAvailable(true)) { CLog::Log(LOGWARNING, "RSS: No network connection"); strXML = ""+g_localizeStrings.Get(15301)+""; @@ -256,9 +257,9 @@ HTML::CHTMLUtil html; TiXmlElement * itemNode = channelXmlNode->FirstChildElement("item"); - std::map mTagElements; - typedef std::pair StrPair; - std::list::iterator i; + map mTagElements; + typedef pair StrPair; + list ::iterator i; // Add the title tag in if we didn't pass any tags in at all // Represents default behaviour before configurability @@ -302,7 +303,7 @@ int rsscolour = RSS_COLOR_HEADLINE; for (i = m_tagSet.begin(); i != m_tagSet.end(); ++i) { - std::map::iterator j = mTagElements.find(*i); + map ::iterator j = mTagElements.find(*i); if (j == mTagElements.end()) continue; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/SaveFileStateJob.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/SaveFileStateJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/SaveFileStateJob.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/SaveFileStateJob.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -23,7 +23,7 @@ #include "settings/MediaSettings.h" #include "network/upnp/UPnP.h" #include "StringUtils.h" -#include "utils/Variant.h" +#include "Variant.h" #include "URIUtils.h" #include "URL.h" #include "log.h" @@ -34,7 +34,6 @@ #include "guilib/GUIWindowManager.h" #include "GUIUserMessages.h" #include "music/MusicDatabase.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" bool CSaveFileStateJob::DoWork() { @@ -117,14 +116,14 @@ CVariant data; data["id"] = m_item.GetVideoInfoTag()->m_iDbId; data["type"] = m_item.GetVideoInfoTag()->m_type; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", data); } updateListing = true; } } - if (m_videoSettings != CMediaSettings::GetInstance().GetDefaultVideoSettings()) + if (m_videoSettings != CMediaSettings::Get().GetDefaultVideoSettings()) { videodatabase.SetVideoSettings(progressTrackingFile, m_videoSettings); } @@ -190,30 +189,6 @@ } } } - - if (ActiveAE::CActiveAEDSP::GetInstance().IsProcessing()) - { - std::string redactPath = CURL::GetRedacted(progressTrackingFile); - CLog::Log(LOGDEBUG, "%s - Saving file state for dsp audio item %s", __FUNCTION__, redactPath.c_str()); - - ActiveAE::CActiveAEDSPDatabase audiodatabase; - if (!audiodatabase.Open()) - { - CLog::Log(LOGWARNING, "%s - Unable to open dsp audio database. Can not save file state!", __FUNCTION__); - } - else - { - if (m_audioSettings != CMediaSettings::GetInstance().GetDefaultAudioSettings()) - { - audiodatabase.SetActiveDSPSettings(m_item, m_audioSettings); - } - else - { - audiodatabase.DeleteActiveDSPSettings(m_item); - } - audiodatabase.Close(); - } - } } return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/SaveFileStateJob.h kodi-15.2~git20151019.1039-final/xbmc/utils/SaveFileStateJob.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/SaveFileStateJob.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/SaveFileStateJob.h 2015-10-19 08:39:17.000000000 +0000 @@ -24,7 +24,6 @@ #include "FileItem.h" #include "video/Bookmark.h" #include "settings/VideoSettings.h" -#include "settings/AudioDSPSettings.h" class CSaveFileStateJob : public CJob { @@ -33,20 +32,17 @@ CBookmark m_bookmark; bool m_updatePlayCount; CVideoSettings m_videoSettings; - CAudioSettings m_audioSettings; public: CSaveFileStateJob(const CFileItem& item, const CFileItem& item_discstack, const CBookmark& bookmark, bool updatePlayCount, - const CVideoSettings &videoSettings, - const CAudioSettings &audioSettings) + const CVideoSettings &videoSettings) : m_item(item), m_item_discstack(item_discstack), m_bookmark(bookmark), m_updatePlayCount(updatePlayCount), - m_videoSettings(videoSettings), - m_audioSettings(audioSettings) {} + m_videoSettings(videoSettings) {} virtual ~CSaveFileStateJob() {} virtual bool DoWork(); }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/ScopeGuard.h kodi-15.2~git20151019.1039-final/xbmc/utils/ScopeGuard.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/ScopeGuard.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/ScopeGuard.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -#pragma once - -/* - * Copyright (C) 2005-2015 Team Kodi - * http://kodi.tv - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include - -namespace KODI -{ -namespace UTILS -{ - -/*! \class CScopeGuard - \brief Generic scopeguard designed to handle any type of handle - - This is not necessary but recommended to cut down on some typing - using CSocketHandle = CScopeGuard; - - CSocketHandle sh(closesocket, open(thingy)); - */ -template -class CScopeGuard -{ - -public: - - CScopeGuard(std::function del, Handle handle = invalid) - : m_handle{handle} - , m_deleter{del} - { }; - - ~CScopeGuard() - { - reset(); - } - - operator Handle() - { - return m_handle; - } - - operator bool() - { - return m_handle != invalid; - } - - /*! \brief attach a new handle to this instance, if there's - already a handle it will be closed. - - \param[in] handle The handle to manage - */ - void attach(Handle handle) - { - reset(); - - m_handle = handle; - } - - /*! \brief release the managed handle so that it won't be auto closed - - \return The handle being managed by the guard - */ - Handle release() - { - Handle h = m_handle; - m_handle = invalid; - return h; - } - - /*! \brief reset the instance, closing any managed handle and setting it to invalid - */ - void reset() - { - if (m_handle != invalid) - { - m_deleter(m_handle); - m_handle = invalid; - } - } - - //Disallow default construction and copying - CScopeGuard() = delete; - CScopeGuard(const CScopeGuard& rhs) = delete; - CScopeGuard& operator= (const CScopeGuard& rhs) = delete; - -private: - Handle m_handle; - std::function m_deleter; -}; - -} -} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/ScraperParser.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/ScraperParser.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/ScraperParser.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/ScraperParser.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -33,6 +33,7 @@ #include #include +using namespace std; using namespace ADDON; using namespace XFILE; @@ -574,10 +575,10 @@ void CScraperParser::GetBufferParams(bool* result, const char* attribute, bool defvalue) { for (int iBuf=0;iBuf vecBufs; + vector vecBufs; StringUtils::Tokenize(attribute,vecBufs,","); for (size_t nToken=0; nToken < vecBufs.size(); nToken++) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/ScraperUrl.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/ScraperUrl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/ScraperUrl.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/ScraperUrl.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -35,6 +35,8 @@ #include #include +using namespace std; + CScraperUrl::CScraperUrl(const std::string& strUrl) { relevance = 0; @@ -76,7 +78,7 @@ if (!element || !element->FirstChild() || !element->FirstChild()->Value()) return false; - std::stringstream stream; + stringstream stream; stream << *element; m_xml += stream.str(); @@ -148,7 +150,7 @@ const CScraperUrl::SUrlEntry CScraperUrl::GetFirstThumb(const std::string &type) const { - for (std::vector::const_iterator iter=m_url.begin();iter != m_url.end();++iter) + for (vector::const_iterator iter=m_url.begin();iter != m_url.end();++iter) { if (iter->m_type == URL_TYPE_GENERAL && (type.empty() || type == "thumb" || iter->m_aspect == type)) return *iter; @@ -164,7 +166,7 @@ const CScraperUrl::SUrlEntry CScraperUrl::GetSeasonThumb(int season, const std::string &type) const { - for (std::vector::const_iterator iter=m_url.begin();iter != m_url.end();++iter) + for (vector::const_iterator iter=m_url.begin();iter != m_url.end();++iter) { if (iter->m_type == URL_TYPE_SEASON && iter->m_season == season && (type.empty() || type == "thumb" || iter->m_aspect == type)) @@ -182,7 +184,7 @@ unsigned int CScraperUrl::GetMaxSeasonThumb() const { unsigned int maxSeason = 0; - for (std::vector::const_iterator iter=m_url.begin();iter != m_url.end();++iter) + for (vector::const_iterator iter=m_url.begin();iter != m_url.end();++iter) { if (iter->m_type == URL_TYPE_SEASON && iter->m_season > 0 && (unsigned int)iter->m_season > maxSeason) maxSeason = iter->m_season; @@ -349,7 +351,7 @@ void CScraperUrl::GetThumbURLs(std::vector &thumbs, const std::string &type, int season) const { - for (std::vector::const_iterator iter = m_url.begin(); iter != m_url.end(); ++iter) + for (vector::const_iterator iter = m_url.begin(); iter != m_url.end(); ++iter) { if (iter->m_aspect == type || type.empty() || type == "thumb" || iter->m_aspect.empty()) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Screenshot.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/Screenshot.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/Screenshot.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Screenshot.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -56,6 +56,7 @@ #include "utils/ScreenshotAML.h" #endif +using namespace std; using namespace XFILE; CScreenshotSurface::CScreenshotSurface() @@ -79,6 +80,7 @@ if (!m_buffer) return false; #elif defined(HAS_DX) + LPDIRECT3DSURFACE9 lpSurface = NULL, lpBackbuffer = NULL; g_graphicsContext.Lock(); if (g_application.m_pPlayer->IsPlayingVideo()) { @@ -86,57 +88,40 @@ g_renderManager.SetupScreenshot(); #endif } - g_application.RenderNoPresent(); - g_Windowing.FinishCommandList(); - ID3D11DeviceContext* pImdContext = g_Windowing.GetImmediateContext(); - ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); - ID3D11Device* pDevice = g_Windowing.Get3D11Device(); - - ID3D11RenderTargetView* pRTView = nullptr; - pContext->OMGetRenderTargets(1, &pRTView, nullptr); - if (pRTView == nullptr) + if (FAILED(g_Windowing.Get3DDevice()->CreateOffscreenPlainSurface(g_Windowing.GetWidth(), g_Windowing.GetHeight(), D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &lpSurface, NULL))) return false; - ID3D11Resource *pRTResource = nullptr; - pRTView->GetResource(&pRTResource); - SAFE_RELEASE(pRTView); - - ID3D11Texture2D* pCopyTexture = nullptr; - ID3D11Texture2D* pRTTexture = nullptr; - HRESULT hr = pRTResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&pRTTexture)); - SAFE_RELEASE(pRTResource); - if (FAILED(hr)) + if (FAILED(g_Windowing.Get3DDevice()->GetRenderTarget(0, &lpBackbuffer))) return false; - D3D11_TEXTURE2D_DESC desc; - pRTTexture->GetDesc(&desc); - desc.Usage = D3D11_USAGE_STAGING; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - desc.BindFlags = 0; - - if (SUCCEEDED(pDevice->CreateTexture2D(&desc, nullptr, &pCopyTexture))) + // now take screenshot + if (SUCCEEDED(g_Windowing.Get3DDevice()->GetRenderTargetData(lpBackbuffer, lpSurface))) { - // take copy - pImdContext->CopyResource(pCopyTexture, pRTTexture); - - D3D11_MAPPED_SUBRESOURCE res; - if (SUCCEEDED(pImdContext->Map(pCopyTexture, 0, D3D11_MAP_READ, 0, &res))) + D3DLOCKED_RECT lr; + D3DSURFACE_DESC desc; + lpSurface->GetDesc(&desc); + if (SUCCEEDED(lpSurface->LockRect(&lr, NULL, D3DLOCK_READONLY))) { m_width = desc.Width; m_height = desc.Height; - m_stride = res.RowPitch; + m_stride = lr.Pitch; m_buffer = new unsigned char[m_height * m_stride]; - memcpy(m_buffer, res.pData, m_height * m_stride); - pImdContext->Unmap(pCopyTexture, 0); + memcpy(m_buffer, lr.pBits, m_height * m_stride); + lpSurface->UnlockRect(); } else - CLog::Log(LOGERROR, "%s: MAP_READ failed.", __FUNCTION__); - - SAFE_RELEASE(pCopyTexture); + { + CLog::Log(LOGERROR, "%s LockRect failed", __FUNCTION__); + } + } + else + { + CLog::Log(LOGERROR, "%s GetBackBuffer failed", __FUNCTION__); } - SAFE_RELEASE(pRTTexture); + lpSurface->Release(); + lpBackbuffer->Release(); g_graphicsContext.Unlock(); @@ -255,12 +240,12 @@ void CScreenShot::TakeScreenshot() { static bool savingScreenshots = false; - static std::vector screenShots; + static vector screenShots; bool promptUser = false; std::string strDir; // check to see if we have a screenshot folder yet - CSettingPath *screenshotSetting = (CSettingPath*)CSettings::GetInstance().GetSetting(CSettings::SETTING_DEBUG_SCREENSHOTPATH); + CSettingPath *screenshotSetting = (CSettingPath*)CSettings::Get().GetSetting("debug.screenshotpath"); if (screenshotSetting != NULL) { strDir = screenshotSetting->GetValue(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/SeekHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/SeekHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/SeekHandler.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/SeekHandler.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -21,17 +21,15 @@ #include "SeekHandler.h" #include - +#include "guilib/LocalizeStrings.h" +#include "guilib/GraphicContext.h" #include "Application.h" #include "FileItem.h" -#include "guilib/GraphicContext.h" -#include "guilib/LocalizeStrings.h" #include "settings/AdvancedSettings.h" -#include "settings/lib/Setting.h" #include "settings/Settings.h" +#include "settings/lib/Setting.h" #include "utils/log.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" CSeekHandler::CSeekHandler() : m_seekDelay(500), @@ -49,7 +47,7 @@ m_backwardSeekSteps.clear(); } -CSeekHandler& CSeekHandler::GetInstance() +CSeekHandler& CSeekHandler::Get() { static CSeekHandler instance; return instance; @@ -60,22 +58,22 @@ Reset(); m_seekDelays.clear(); - m_seekDelays.insert(std::make_pair(SEEK_TYPE_VIDEO, CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_SEEKDELAY))); - m_seekDelays.insert(std::make_pair(SEEK_TYPE_MUSIC, CSettings::GetInstance().GetInt(CSettings::SETTING_MUSICPLAYER_SEEKDELAY))); + m_seekDelays.insert(std::make_pair(SEEK_TYPE_VIDEO, CSettings::Get().GetInt("videoplayer.seekdelay"))); + m_seekDelays.insert(std::make_pair(SEEK_TYPE_MUSIC, CSettings::Get().GetInt("musicplayer.seekdelay"))); m_forwardSeekSteps.clear(); m_backwardSeekSteps.clear(); std::map seekTypeSettingMap; - seekTypeSettingMap.insert(std::make_pair(SEEK_TYPE_VIDEO, CSettings::SETTING_VIDEOPLAYER_SEEKSTEPS)); - seekTypeSettingMap.insert(std::make_pair(SEEK_TYPE_MUSIC, CSettings::SETTING_MUSICPLAYER_SEEKSTEPS)); + seekTypeSettingMap.insert(std::make_pair(SEEK_TYPE_VIDEO, "videoplayer.seeksteps")); + seekTypeSettingMap.insert(std::make_pair(SEEK_TYPE_MUSIC, "musicplayer.seeksteps")); for (std::map::iterator it = seekTypeSettingMap.begin(); it!=seekTypeSettingMap.end(); ++it) { std::vector forwardSeekSteps; std::vector backwardSeekSteps; - std::vector seekSteps = CSettings::GetInstance().GetList(it->second); + std::vector seekSteps = CSettings::Get().GetList(it->second); for (std::vector::iterator it = seekSteps.begin(); it != seekSteps.end(); ++it) { int stepSeconds = (*it).asInteger(); @@ -238,10 +236,10 @@ if (setting == NULL) return; - if (setting->GetId() == CSettings::SETTING_VIDEOPLAYER_SEEKDELAY || - setting->GetId() == CSettings::SETTING_VIDEOPLAYER_SEEKSTEPS || - setting->GetId() == CSettings::SETTING_MUSICPLAYER_SEEKDELAY || - setting->GetId() == CSettings::SETTING_MUSICPLAYER_SEEKSTEPS) + if (setting->GetId() == "videoplayer.seekdelay" || + setting->GetId() == "videoplayer.seeksteps" || + setting->GetId() == "musicplayer.seekdelay" || + setting->GetId() == "musicplayer.seeksteps") Configure(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/SeekHandler.h kodi-15.2~git20151019.1039-final/xbmc/utils/SeekHandler.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/SeekHandler.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/SeekHandler.h 2015-10-19 08:39:17.000000000 +0000 @@ -19,16 +19,16 @@ * */ -#include -#include #include - #include "input/Key.h" #include "interfaces/IActionListener.h" #include "settings/lib/ISettingCallback.h" #include "threads/CriticalSection.h" #include "utils/Stopwatch.h" +#include +#include + enum SeekType { SEEK_TYPE_VIDEO = 0, @@ -38,12 +38,12 @@ class CSeekHandler : public ISettingCallback, public IActionListener { public: - static CSeekHandler& GetInstance(); + static CSeekHandler& Get(); static void SettingOptionsSeekStepsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); - virtual void OnSettingChanged(const CSetting *setting) override; - virtual bool OnAction(const CAction &action) override; + virtual void OnSettingChanged(const CSetting *setting); + virtual bool OnAction(const CAction &action); void Seek(bool forward, float amount, float duration = 0, bool analogSeek = false, SeekType type = SEEK_TYPE_VIDEO); void SeekSeconds(int seconds); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/SortUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/SortUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/SortUtils.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/SortUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -23,15 +23,18 @@ #include "URL.h" #include "Util.h" #include "XBDateTime.h" +#include "settings/AdvancedSettings.h" #include "utils/CharsetConverter.h" #include "utils/StringUtils.h" #include "utils/Variant.h" #include -std::string ArrayToString(SortAttribute attributes, const CVariant &variant, const std::string &seperator = " / ") +using namespace std; + +string ArrayToString(SortAttribute attributes, const CVariant &variant, const string &seperator = " / ") { - std::vector strArray; + vector strArray; if (variant.isArray()) { for (CVariant::const_iterator_array it = variant.begin_array(); it != variant.end_array(); it++) @@ -55,7 +58,7 @@ return ""; } -std::string ByLabel(SortAttribute attributes, const SortItem &values) +string ByLabel(SortAttribute attributes, const SortItem &values) { if (attributes & SortAttributeIgnoreArticle) return SortUtils::RemoveArticles(values.at(FieldLabel).asString()); @@ -63,49 +66,49 @@ return values.at(FieldLabel).asString(); } -std::string ByFile(SortAttribute attributes, const SortItem &values) +string ByFile(SortAttribute attributes, const SortItem &values) { CURL url(values.at(FieldPath).asString()); return StringUtils::Format("%s %" PRId64, url.GetFileNameWithoutPath().c_str(), values.at(FieldStartOffset).asInteger()); } -std::string ByPath(SortAttribute attributes, const SortItem &values) +string ByPath(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%s %" PRId64, values.at(FieldPath).asString().c_str(), values.at(FieldStartOffset).asInteger()); } -std::string ByLastPlayed(SortAttribute attributes, const SortItem &values) +string ByLastPlayed(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%s %s", values.at(FieldLastPlayed).asString().c_str(), ByLabel(attributes, values).c_str()); } -std::string ByPlaycount(SortAttribute attributes, const SortItem &values) +string ByPlaycount(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%i %s", (int)values.at(FieldPlaycount).asInteger(), ByLabel(attributes, values).c_str()); } -std::string ByDate(SortAttribute attributes, const SortItem &values) +string ByDate(SortAttribute attributes, const SortItem &values) { return values.at(FieldDate).asString() + " " + ByLabel(attributes, values); } -std::string ByDateAdded(SortAttribute attributes, const SortItem &values) +string ByDateAdded(SortAttribute attributes, const SortItem &values) { - return StringUtils::Format("%s %d", values.at(FieldDateAdded).asString().c_str(), (int)values.at(FieldId).asInteger()); + return StringUtils::Format("%s %d", values.at(FieldDateAdded).asString().c_str(), (int)values.at(FieldId).asInteger());; } -std::string BySize(SortAttribute attributes, const SortItem &values) +string BySize(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%" PRId64, values.at(FieldSize).asInteger()); } -std::string ByDriveType(SortAttribute attributes, const SortItem &values) +string ByDriveType(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%d %s", (int)values.at(FieldDriveType).asInteger(), ByLabel(attributes, values).c_str()); } -std::string ByTitle(SortAttribute attributes, const SortItem &values) +string ByTitle(SortAttribute attributes, const SortItem &values) { if (attributes & SortAttributeIgnoreArticle) return SortUtils::RemoveArticles(values.at(FieldTitle).asString()); @@ -113,9 +116,9 @@ return values.at(FieldTitle).asString(); } -std::string ByAlbum(SortAttribute attributes, const SortItem &values) +string ByAlbum(SortAttribute attributes, const SortItem &values) { - std::string album = values.at(FieldAlbum).asString(); + string album = values.at(FieldAlbum).asString(); if (attributes & SortAttributeIgnoreArticle) album = SortUtils::RemoveArticles(album); @@ -128,32 +131,18 @@ return label; } -std::string ByAlbumType(SortAttribute attributes, const SortItem &values) +string ByAlbumType(SortAttribute attributes, const SortItem &values) { return values.at(FieldAlbumType).asString() + " " + ByLabel(attributes, values); } -std::string ByArtist(SortAttribute attributes, const SortItem &values) -{ - std::string label = ArrayToString(attributes, values.at(FieldArtist)); - - const CVariant &album = values.at(FieldAlbum); - if (!album.isNull()) - label += " " + SortUtils::RemoveArticles(album.asString()); - - const CVariant &track = values.at(FieldTrackNumber); - if (!track.isNull()) - label += StringUtils::Format(" %i", (int)track.asInteger()); - - return label; -} - -std::string ByArtistThenYear(SortAttribute attributes, const SortItem &values) +string ByArtist(SortAttribute attributes, const SortItem &values) { std::string label = ArrayToString(attributes, values.at(FieldArtist)); const CVariant &year = values.at(FieldYear); - if (!year.isNull()) + if (g_advancedSettings.m_bMusicLibraryAlbumsSortByArtistThenYear && + !year.isNull()) label += StringUtils::Format(" %i", (int)year.asInteger()); const CVariant &album = values.at(FieldAlbum); @@ -167,12 +156,12 @@ return label; } -std::string ByTrackNumber(SortAttribute attributes, const SortItem &values) +string ByTrackNumber(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%i", (int)values.at(FieldTrackNumber).asInteger()); } -std::string ByTime(SortAttribute attributes, const SortItem &values) +string ByTime(SortAttribute attributes, const SortItem &values) { std::string label; const CVariant &time = values.at(FieldTime); @@ -183,28 +172,28 @@ return label; } -std::string ByProgramCount(SortAttribute attributes, const SortItem &values) +string ByProgramCount(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%i", (int)values.at(FieldProgramCount).asInteger()); } -std::string ByPlaylistOrder(SortAttribute attributes, const SortItem &values) +string ByPlaylistOrder(SortAttribute attributes, const SortItem &values) { // TODO: Playlist order is hacked into program count variable (not nice, but ok until 2.0) return ByProgramCount(attributes, values); } -std::string ByGenre(SortAttribute attributes, const SortItem &values) +string ByGenre(SortAttribute attributes, const SortItem &values) { return ArrayToString(attributes, values.at(FieldGenre)); } -std::string ByCountry(SortAttribute attributes, const SortItem &values) +string ByCountry(SortAttribute attributes, const SortItem &values) { return ArrayToString(attributes, values.at(FieldCountry)); } -std::string ByYear(SortAttribute attributes, const SortItem &values) +string ByYear(SortAttribute attributes, const SortItem &values) { std::string label; const CVariant &airDate = values.at(FieldAirDate); @@ -226,9 +215,9 @@ return label; } -std::string BySortTitle(SortAttribute attributes, const SortItem &values) +string BySortTitle(SortAttribute attributes, const SortItem &values) { - std::string title = values.at(FieldSortTitle).asString(); + string title = values.at(FieldSortTitle).asString(); if (title.empty()) title = values.at(FieldTitle).asString(); @@ -238,37 +227,32 @@ return title; } -std::string ByRating(SortAttribute attributes, const SortItem &values) +string ByRating(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%f %s", values.at(FieldRating).asFloat(), ByLabel(attributes, values).c_str()); } -std::string ByUserRating(SortAttribute attributes, const SortItem &values) -{ - return StringUtils::Format("%d %s", static_cast(values.at(FieldUserRating).asInteger()), ByLabel(attributes, values).c_str()); -} - -std::string ByVotes(SortAttribute attributes, const SortItem &values) +string ByVotes(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%d %s", (int)values.at(FieldVotes).asInteger(), ByLabel(attributes, values).c_str()); } -std::string ByTop250(SortAttribute attributes, const SortItem &values) +string ByTop250(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%d %s", (int)values.at(FieldTop250).asInteger(), ByLabel(attributes, values).c_str()); } -std::string ByMPAA(SortAttribute attributes, const SortItem &values) +string ByMPAA(SortAttribute attributes, const SortItem &values) { return values.at(FieldMPAA).asString() + " " + ByLabel(attributes, values); } -std::string ByStudio(SortAttribute attributes, const SortItem &values) +string ByStudio(SortAttribute attributes, const SortItem &values) { return ArrayToString(attributes, values.at(FieldStudio)); } -std::string ByEpisodeNumber(SortAttribute attributes, const SortItem &values) +string ByEpisodeNumber(SortAttribute attributes, const SortItem &values) { // we calculate an offset number based on the episode's // sort season and episode values. in addition @@ -296,7 +280,7 @@ return StringUtils::Format("%" PRIu64" %s", num, title.c_str()); } -std::string BySeason(SortAttribute attributes, const SortItem &values) +string BySeason(SortAttribute attributes, const SortItem &values) { int season = (int)values.at(FieldSeason).asInteger(); const CVariant &specialSeason = values.at(FieldSeasonSpecialSort); @@ -306,92 +290,92 @@ return StringUtils::Format("%i %s", season, ByLabel(attributes, values).c_str()); } -std::string ByNumberOfEpisodes(SortAttribute attributes, const SortItem &values) +string ByNumberOfEpisodes(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%i %s", (int)values.at(FieldNumberOfEpisodes).asInteger(), ByLabel(attributes, values).c_str()); } -std::string ByNumberOfWatchedEpisodes(SortAttribute attributes, const SortItem &values) +string ByNumberOfWatchedEpisodes(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%i %s", (int)values.at(FieldNumberOfWatchedEpisodes).asInteger(), ByLabel(attributes, values).c_str()); } -std::string ByTvShowStatus(SortAttribute attributes, const SortItem &values) +string ByTvShowStatus(SortAttribute attributes, const SortItem &values) { return values.at(FieldTvShowStatus).asString() + " " + ByLabel(attributes, values); } -std::string ByTvShowTitle(SortAttribute attributes, const SortItem &values) +string ByTvShowTitle(SortAttribute attributes, const SortItem &values) { return values.at(FieldTvShowTitle).asString() + " " + ByLabel(attributes, values); } -std::string ByProductionCode(SortAttribute attributes, const SortItem &values) +string ByProductionCode(SortAttribute attributes, const SortItem &values) { return values.at(FieldProductionCode).asString(); } -std::string ByVideoResolution(SortAttribute attributes, const SortItem &values) +string ByVideoResolution(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%i %s", (int)values.at(FieldVideoResolution).asInteger(), ByLabel(attributes, values).c_str()); } -std::string ByVideoCodec(SortAttribute attributes, const SortItem &values) +string ByVideoCodec(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%s %s", values.at(FieldVideoCodec).asString().c_str(), ByLabel(attributes, values).c_str()); } -std::string ByVideoAspectRatio(SortAttribute attributes, const SortItem &values) +string ByVideoAspectRatio(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%.03f %s", values.at(FieldVideoAspectRatio).asFloat(), ByLabel(attributes, values).c_str()); } -std::string ByAudioChannels(SortAttribute attributes, const SortItem &values) +string ByAudioChannels(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%i %s", (int)values.at(FieldAudioChannels).asInteger(), ByLabel(attributes, values).c_str()); } -std::string ByAudioCodec(SortAttribute attributes, const SortItem &values) +string ByAudioCodec(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%s %s", values.at(FieldAudioCodec).asString().c_str(), ByLabel(attributes, values).c_str()); } -std::string ByAudioLanguage(SortAttribute attributes, const SortItem &values) +string ByAudioLanguage(SortAttribute attributes, const SortItem &values) { - return StringUtils::Format("%s %s", values.at(FieldAudioLanguage).asString().c_str(), ByLabel(attributes, values).c_str()); + return StringUtils::Format("%s %s", values.at(FieldAudioLanguage).asString().c_str(), ByLabel(attributes, values).c_str());; } -std::string BySubtitleLanguage(SortAttribute attributes, const SortItem &values) +string BySubtitleLanguage(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%s %s", values.at(FieldSubtitleLanguage).asString().c_str(), ByLabel(attributes, values).c_str()); } -std::string ByBitrate(SortAttribute attributes, const SortItem &values) +string ByBitrate(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%" PRId64, values.at(FieldBitrate).asInteger()); } -std::string ByListeners(SortAttribute attributes, const SortItem &values) +string ByListeners(SortAttribute attributes, const SortItem &values) { - return StringUtils::Format("%" PRId64, values.at(FieldListeners).asInteger()); + return StringUtils::Format("%" PRId64, values.at(FieldListeners).asInteger());; } -std::string ByRandom(SortAttribute attributes, const SortItem &values) +string ByRandom(SortAttribute attributes, const SortItem &values) { - return StringUtils::Format("%i", CUtil::GetRandomNumber()); + return StringUtils::Format("%i", CUtil::GetRandomNumber());; } -std::string ByChannel(SortAttribute attributes, const SortItem &values) +string ByChannel(SortAttribute attributes, const SortItem &values) { return values.at(FieldChannelName).asString(); } -std::string ByChannelNumber(SortAttribute attributes, const SortItem &values) +string ByChannelNumber(SortAttribute attributes, const SortItem &values) { return StringUtils::Format("%i", (int)values.at(FieldChannelNumber).asInteger()); } -std::string ByDateTaken(SortAttribute attributes, const SortItem &values) +string ByDateTaken(SortAttribute attributes, const SortItem &values) { return values.at(FieldDateTaken).asString(); } @@ -522,9 +506,9 @@ return SorterIgnoreFoldersDescending(*left, *right); } -std::map fillPreparators() +map fillPreparators() { - std::map preparators; + map preparators; preparators[SortByNone] = NULL; preparators[SortByLabel] = ByLabel; @@ -537,14 +521,12 @@ preparators[SortByTrackNumber] = ByTrackNumber; preparators[SortByTime] = ByTime; preparators[SortByArtist] = ByArtist; - preparators[SortByArtistThenYear] = ByArtistThenYear; preparators[SortByAlbum] = ByAlbum; preparators[SortByAlbumType] = ByAlbumType; preparators[SortByGenre] = ByGenre; preparators[SortByCountry] = ByCountry; preparators[SortByYear] = ByYear; preparators[SortByRating] = ByRating; - preparators[SortByUserRating] = ByUserRating; preparators[SortByVotes] = ByVotes; preparators[SortByTop250] = ByTop250; preparators[SortByProgramCount] = ByProgramCount; @@ -579,11 +561,11 @@ return preparators; } -std::map fillSortingFields() +map fillSortingFields() { - std::map sortingFields; + map sortingFields; - sortingFields.insert(std::pair(SortByNone, Fields())); + sortingFields.insert(pair(SortByNone, Fields())); sortingFields[SortByLabel].insert(FieldLabel); sortingFields[SortByDate].insert(FieldDate); @@ -600,10 +582,6 @@ sortingFields[SortByArtist].insert(FieldYear); sortingFields[SortByArtist].insert(FieldAlbum); sortingFields[SortByArtist].insert(FieldTrackNumber); - sortingFields[SortByArtistThenYear].insert(FieldArtist); - sortingFields[SortByArtistThenYear].insert(FieldYear); - sortingFields[SortByArtistThenYear].insert(FieldAlbum); - sortingFields[SortByArtistThenYear].insert(FieldTrackNumber); sortingFields[SortByAlbum].insert(FieldAlbum); sortingFields[SortByAlbum].insert(FieldArtist); sortingFields[SortByAlbum].insert(FieldTrackNumber); @@ -615,7 +593,6 @@ sortingFields[SortByYear].insert(FieldAlbum); sortingFields[SortByYear].insert(FieldTrackNumber); sortingFields[SortByRating].insert(FieldRating); - sortingFields[SortByUserRating].insert(FieldUserRating); sortingFields[SortByVotes].insert(FieldVotes); sortingFields[SortByTop250].insert(FieldTop250); sortingFields[SortByProgramCount].insert(FieldProgramCount); @@ -653,13 +630,13 @@ sortingFields[SortByChannel].insert(FieldChannelName); sortingFields[SortByChannelNumber].insert(FieldChannelNumber); sortingFields[SortByDateTaken].insert(FieldDateTaken); - sortingFields.insert(std::pair(SortByRandom, Fields())); + sortingFields.insert(pair(SortByRandom, Fields())); return sortingFields; } -std::map SortUtils::m_preparators = fillPreparators(); -std::map SortUtils::m_sortingFields = fillSortingFields(); +map SortUtils::m_preparators = fillPreparators(); +map SortUtils::m_sortingFields = fillSortingFields(); void SortUtils::Sort(SortBy sortBy, SortOrder sortOrder, SortAttribute attributes, DatabaseResults& items, int limitEnd /* = -1 */, int limitStart /* = 0 */) { @@ -678,12 +655,12 @@ for (Fields::const_iterator field = sortingFields.begin(); field != sortingFields.end(); ++field) { if (item->find(*field) == item->end()) - item->insert(std::pair(*field, CVariant::ConstNullVariant)); + item->insert(pair(*field, CVariant::ConstNullVariant)); } std::wstring sortLabel; g_charsetConverter.utf8ToW(preparator(attributes, *item), sortLabel, false); - item->insert(std::pair(FieldSort, CVariant(sortLabel))); + item->insert(pair(FieldSort, CVariant(sortLabel))); } // Do the sorting @@ -717,12 +694,12 @@ for (Fields::const_iterator field = sortingFields.begin(); field != sortingFields.end(); ++field) { if ((*item)->find(*field) == (*item)->end()) - (*item)->insert(std::pair(*field, CVariant::ConstNullVariant)); + (*item)->insert(pair(*field, CVariant::ConstNullVariant)); } std::wstring sortLabel; g_charsetConverter.utf8ToW(preparator(attributes, **item), sortLabel, false); - (*item)->insert(std::pair(FieldSort, CVariant(sortLabel))); + (*item)->insert(pair(FieldSort, CVariant(sortLabel))); } // Do the sorting @@ -772,7 +749,7 @@ const SortUtils::SortPreparator& SortUtils::getPreparator(SortBy sortBy) { - std::map::const_iterator it = m_preparators.find(sortBy); + map::const_iterator it = m_preparators.find(sortBy); if (it != m_preparators.end()) return it->second; @@ -797,14 +774,14 @@ const Fields& SortUtils::GetFieldsForSorting(SortBy sortBy) { - std::map::const_iterator it = m_sortingFields.find(sortBy); + map::const_iterator it = m_sortingFields.find(sortBy); if (it != m_sortingFields.end()) return it->second; return m_sortingFields[SortByNone]; } -std::string SortUtils::RemoveArticles(const std::string &label) +string SortUtils::RemoveArticles(const string &label) { std::set sortTokens = g_langInfo.GetSortTokens(); for (std::set::const_iterator token = sortTokens.begin(); token != sortTokens.end(); ++token) @@ -840,7 +817,6 @@ { SortByTitle, SORT_METHOD_TITLE_IGNORE_THE, SortAttributeIgnoreArticle, 556 }, { SortByTitle, SORT_METHOD_VIDEO_TITLE, SortAttributeNone, 556 }, { SortByArtist, SORT_METHOD_ARTIST, SortAttributeNone, 557 }, - { SortByArtistThenYear, SORT_METHOD_ARTIST_AND_YEAR, SortAttributeNone, 578 }, { SortByArtist, SORT_METHOD_ARTIST_IGNORE_THE, SortAttributeIgnoreArticle, 557 }, { SortByAlbum, SORT_METHOD_ALBUM, SortAttributeNone, 558 }, { SortByAlbum, SORT_METHOD_ALBUM_IGNORE_THE, SortAttributeIgnoreArticle, 558 }, @@ -850,7 +826,6 @@ { SortByFile, SORT_METHOD_FILE, SortAttributeIgnoreFolders, 561 }, { SortByRating, SORT_METHOD_SONG_RATING, SortAttributeNone, 563 }, { SortByRating, SORT_METHOD_VIDEO_RATING, SortAttributeIgnoreFolders, 563 }, - { SortByUserRating, SORT_METHOD_VIDEO_USER_RATING, SortAttributeIgnoreFolders, 38018 }, { SortBySortTitle, SORT_METHOD_VIDEO_SORT_TITLE, SortAttributeIgnoreFolders, 171 }, { SortBySortTitle, SORT_METHOD_VIDEO_SORT_TITLE_IGNORE_THE, (SortAttribute)(SortAttributeIgnoreFolders | SortAttributeIgnoreArticle), 171 }, { SortByYear, SORT_METHOD_YEAR, SortAttributeIgnoreFolders, 562 }, @@ -931,104 +906,3 @@ } return 16018; // None } - -template -T TypeFromString(const std::map& typeMap, const std::string& name, const T& defaultType) -{ - auto it = typeMap.find(name); - if (it == typeMap.end()) - return defaultType; - - return it->second; -} - -template -const std::string& TypeToString(const std::map& typeMap, const T& value) -{ - auto it = std::find_if(typeMap.begin(), typeMap.end(), - [&value](const std::pair& pair) - { - return pair.second == value; - }); - - if (it == typeMap.end()) - return StringUtils::Empty; - - return it->first; -} - -const std::map sortMethods = { - { "label", SortByLabel }, - { "date", SortByDate }, - { "size", SortBySize }, - { "file", SortByFile }, - { "path", SortByPath }, - { "drivetype", SortByDriveType }, - { "title", SortByTitle }, - { "track", SortByTrackNumber }, - { "time", SortByTime }, - { "artist", SortByArtist }, - { "artistyear", SortByArtistThenYear }, - { "album", SortByAlbum }, - { "albumtype", SortByAlbumType }, - { "genre", SortByGenre }, - { "country", SortByCountry }, - { "year", SortByYear }, - { "rating", SortByRating }, - { "votes", SortByVotes }, - { "top250", SortByTop250 }, - { "programcount", SortByProgramCount }, - { "playlist", SortByPlaylistOrder }, - { "episode", SortByEpisodeNumber }, - { "season", SortBySeason }, - { "totalepisodes", SortByNumberOfEpisodes }, - { "watchedepisodes", SortByNumberOfWatchedEpisodes }, - { "tvshowstatus", SortByTvShowStatus }, - { "tvshowtitle", SortByTvShowTitle }, - { "sorttitle", SortBySortTitle }, - { "productioncode", SortByProductionCode }, - { "mpaa", SortByMPAA }, - { "videoresolution", SortByVideoResolution }, - { "videocodec", SortByVideoCodec }, - { "videoaspectratio", SortByVideoAspectRatio }, - { "audiochannels", SortByAudioChannels }, - { "audiocodec", SortByAudioCodec }, - { "audiolanguage", SortByAudioLanguage }, - { "subtitlelanguage", SortBySubtitleLanguage }, - { "studio", SortByStudio }, - { "dateadded", SortByDateAdded }, - { "lastplayed", SortByLastPlayed }, - { "playcount", SortByPlaycount }, - { "listeners", SortByListeners }, - { "bitrate", SortByBitrate }, - { "random", SortByRandom }, - { "channel", SortByChannel }, - { "channelnumber", SortByChannelNumber }, - { "datetaken", SortByDateTaken }, - { "userrating", SortByUserRating } -}; - -SortBy SortUtils::SortMethodFromString(const std::string& sortMethod) -{ - return TypeFromString(sortMethods, sortMethod, SortByNone); -} - -const std::string& SortUtils::SortMethodToString(SortBy sortMethod) -{ - return TypeToString(sortMethods, sortMethod); -} - -const std::map sortOrders = { - { "ascending", SortOrderAscending }, - { "descending", SortOrderDescending } -}; - -SortOrder SortUtils::SortOrderFromString(const std::string& sortOrder) -{ - return TypeFromString(sortOrders, sortOrder, SortOrderNone); -} - -const std::string& SortUtils::SortOrderToString(SortOrder sortOrder) -{ - return TypeToString(sortOrders, sortOrder); -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/SortUtils.h kodi-15.2~git20151019.1039-final/xbmc/utils/SortUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/SortUtils.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/SortUtils.h 2015-10-19 08:39:17.000000000 +0000 @@ -57,14 +57,12 @@ SortByTrackNumber, SortByTime, SortByArtist, - SortByArtistThenYear, SortByAlbum, SortByAlbumType, SortByGenre, SortByCountry, SortByYear, SortByRating, - SortByUserRating, SortByVotes, SortByTop250, SortByProgramCount, @@ -127,11 +125,6 @@ static SORT_METHOD TranslateOldSortMethod(SortBy sortBy, bool ignoreArticle); static SortDescription TranslateOldSortMethod(SORT_METHOD sortBy); - static SortBy SortMethodFromString(const std::string& sortMethod); - static const std::string& SortMethodToString(SortBy sortMethod); - static SortOrder SortOrderFromString(const std::string& sortOrder); - static const std::string& SortOrderToString(SortOrder sortOrder); - /*! \brief retrieve the label id associated with a sort method for displaying in the UI. \param sortBy the sort method in question. \return the label id of the sort method. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Splash.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/Splash.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/Splash.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Splash.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -30,7 +30,6 @@ using namespace XFILE; CSplash::CSplash() - : m_image(nullptr) { } @@ -39,7 +38,7 @@ delete m_image; } -CSplash& CSplash::GetInstance() +CSplash& CSplash::Get() { static CSplash instance; return instance; @@ -54,7 +53,7 @@ splashImage = "special://xbmc/media/Splash.png"; m_image = new CGUIImage(0, 0, 0, 0, g_graphicsContext.GetWidth(), g_graphicsContext.GetHeight(), CTextureInfo(splashImage)); - m_image->SetAspectRatio(CAspectRatio::AR_SCALE); + m_image->SetAspectRatio(CAspectRatio::AR_CENTER); } g_graphicsContext.Lock(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Splash.h kodi-15.2~git20151019.1039-final/xbmc/utils/Splash.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/Splash.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Splash.h 2015-10-19 08:39:17.000000000 +0000 @@ -27,7 +27,7 @@ class CSplash { public: - static CSplash& GetInstance(); + static CSplash& Get(); void Show(); @@ -39,4 +39,9 @@ private: CGUIImage* m_image; +#ifdef HAS_DX + D3DGAMMARAMP newRamp; + D3DGAMMARAMP oldRamp; + +#endif }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/StreamDetails.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/StreamDetails.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/StreamDetails.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/StreamDetails.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -21,7 +21,7 @@ #include #include "StreamDetails.h" #include "StreamUtils.h" -#include "utils/Variant.h" +#include "Variant.h" #include "LangInfo.h" #include "utils/LangCodeExpander.h" #include "utils/Archive.h" @@ -294,9 +294,6 @@ CStreamDetails::CStreamDetails(const CStreamDetails &that) { - m_pBestVideo = nullptr; - m_pBestAudio = nullptr; - m_pBestSubtitle = nullptr; *this = that; } @@ -308,9 +305,9 @@ void CStreamDetails::Reset(void) { - m_pBestVideo = nullptr; - m_pBestAudio = nullptr; - m_pBestSubtitle = nullptr; + m_pBestVideo = NULL; + m_pBestAudio = NULL; + m_pBestSubtitle = NULL; std::vector::iterator iter; for (iter = m_vecItems.begin(); iter != m_vecItems.end(); ++iter) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/StreamDetails.h kodi-15.2~git20151019.1039-final/xbmc/utils/StreamDetails.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/StreamDetails.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/StreamDetails.h 2015-10-19 08:39:17.000000000 +0000 @@ -25,7 +25,6 @@ #include class CStreamDetails; -class CVariant; class CStreamDetail : public IArchivable, public ISerializable { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/StringUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/StringUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/StringUtils.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/StringUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -28,13 +28,9 @@ // //------------------------------------------------------------------------ -#include #include "StringUtils.h" #include "CharsetConverter.h" -#if defined(TARGET_ANDROID) -#include "android/jni/JNIThreading.h" -#endif #include "utils/fstrcmp.h" #include "Util.h" #include "LangInfo.h" @@ -54,10 +50,13 @@ #define FORMAT_BLOCK_SIZE 512 // # of bytes for initial allocation for printf +using namespace std; + const char* ADDON_GUID_RE = "^(\\{){0,1}[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}(\\}){0,1}$"; /* empty string for use in returns by ref */ const std::string StringUtils::Empty = ""; +std::string StringUtils::m_lastUUID = ""; // Copyright (c) Leigh Brasington 2012. All rights reserved. // This code may be used and reproduced without written permission. @@ -220,17 +219,17 @@ (wchar_t)0xFF32, (wchar_t)0xFF33, (wchar_t)0xFF34, (wchar_t)0xFF35, (wchar_t)0xFF36, (wchar_t)0xFF37, (wchar_t)0xFF38, (wchar_t)0xFF39, (wchar_t)0xFF3A }; -std::string StringUtils::Format(const char *fmt, ...) +string StringUtils::Format(const char *fmt, ...) { va_list args; va_start(args, fmt); - std::string str = FormatV(fmt, args); + string str = FormatV(fmt, args); va_end(args); return str; } -std::string StringUtils::FormatV(const char *fmt, va_list args) +string StringUtils::FormatV(const char *fmt, va_list args) { if (!fmt || !fmt[0]) return ""; @@ -274,17 +273,17 @@ return ""; // unreachable } -std::wstring StringUtils::Format(const wchar_t *fmt, ...) +wstring StringUtils::Format(const wchar_t *fmt, ...) { va_list args; va_start(args, fmt); - std::wstring str = FormatV(fmt, args); + wstring str = FormatV(fmt, args); va_end(args); return str; } -std::wstring StringUtils::FormatV(const wchar_t *fmt, va_list args) +wstring StringUtils::FormatV(const wchar_t *fmt, va_list args) { if (!fmt || !fmt[0]) return L""; @@ -356,27 +355,27 @@ return c; } -void StringUtils::ToUpper(std::string &str) +void StringUtils::ToUpper(string &str) { std::transform(str.begin(), str.end(), str.begin(), ::toupper); } -void StringUtils::ToUpper(std::wstring &str) +void StringUtils::ToUpper(wstring &str) { transform(str.begin(), str.end(), str.begin(), toupperUnicode); } -void StringUtils::ToLower(std::string &str) +void StringUtils::ToLower(string &str) { transform(str.begin(), str.end(), str.begin(), ::tolower); } -void StringUtils::ToLower(std::wstring &str) +void StringUtils::ToLower(wstring &str) { transform(str.begin(), str.end(), str.begin(), tolowerUnicode); } -void StringUtils::ToCapitalize(std::string &str) +void StringUtils::ToCapitalize(string &str) { std::wstring wstr; g_charsetConverter.utf8ToW(str, wstr); @@ -442,28 +441,28 @@ return 0; } -std::string StringUtils::Left(const std::string &str, size_t count) +string StringUtils::Left(const string &str, size_t count) { - count = std::max((size_t)0, std::min(count, str.size())); + count = max((size_t)0, min(count, str.size())); return str.substr(0, count); } -std::string StringUtils::Mid(const std::string &str, size_t first, size_t count /* = string::npos */) +string StringUtils::Mid(const string &str, size_t first, size_t count /* = string::npos */) { if (first + count > str.size()) count = str.size() - first; if (first > str.size()) - return std::string(); + return string(); assert(first + count <= str.size()); return str.substr(first, count); } -std::string StringUtils::Right(const std::string &str, size_t count) +string StringUtils::Right(const string &str, size_t count) { - count = std::max((size_t)0, std::min(count, str.size())); + count = max((size_t)0, min(count, str.size())); return str.substr(str.size() - count); } @@ -488,7 +487,7 @@ std::string& StringUtils::TrimLeft(std::string &str) { - str.erase(str.begin(), std::find_if(str.begin(), str.end(), std::not1(std::ptr_fun(isspace_c)))); + str.erase(str.begin(), ::find_if(str.begin(), str.end(), ::not1(::ptr_fun(isspace_c)))); return str; } @@ -501,7 +500,7 @@ std::string& StringUtils::TrimRight(std::string &str) { - str.erase(std::find_if(str.rbegin(), str.rend(), std::not1(std::ptr_fun(isspace_c))).base(), str.end()); + str.erase(::find_if(str.rbegin(), str.rend(), ::not1(::ptr_fun(isspace_c))).base(), str.end()); return str; } @@ -539,10 +538,10 @@ return str; } -int StringUtils::Replace(std::string &str, char oldChar, char newChar) +int StringUtils::Replace(string &str, char oldChar, char newChar) { int replacedChars = 0; - for (std::string::iterator it = str.begin(); it != str.end(); ++it) + for (string::iterator it = str.begin(); it != str.end(); ++it) { if (*it == oldChar) { @@ -562,7 +561,7 @@ int replacedChars = 0; size_t index = 0; - while (index < str.size() && (index = str.find(oldStr, index)) != std::string::npos) + while (index < str.size() && (index = str.find(oldStr, index)) != string::npos) { str.replace(index, oldStr.size(), newStr); index += newStr.size(); @@ -580,7 +579,7 @@ int replacedChars = 0; size_t index = 0; - while (index < str.size() && (index = str.find(oldStr, index)) != std::string::npos) + while (index < str.size() && (index = str.find(oldStr, index)) != string::npos) { str.replace(index, oldStr.size(), newStr); index += newStr.size(); @@ -681,10 +680,10 @@ return true; } -std::string StringUtils::Join(const std::vector &strings, const std::string& delimiter) +std::string StringUtils::Join(const vector &strings, const std::string& delimiter) { std::string result; - for(std::vector::const_iterator it = strings.begin(); it != strings.end(); ++it ) + for(vector::const_iterator it = strings.begin(); it != strings.end(); ++it ) result += (*it) + delimiter; if (!result.empty()) @@ -692,7 +691,7 @@ return result; } -std::vector StringUtils::Split(const std::string& input, const std::string& delimiter, unsigned int iMaxStrings /* = 0 */) +vector StringUtils::Split(const std::string& input, const std::string& delimiter, unsigned int iMaxStrings /* = 0 */) { std::vector results; if (input.empty()) @@ -768,7 +767,7 @@ wchar_t *ld, *rd; wchar_t lc, rc; int64_t lnum, rnum; - const std::collate& coll = std::use_facet >(g_langInfo.GetSystemLocale()); + const collate& coll = use_facet< collate >(g_langInfo.GetSystemLocale()); int cmp_res = 0; while (*l != 0 && *r != 0) { @@ -826,7 +825,7 @@ int StringUtils::DateStringToYYYYMMDD(const std::string &dateString) { - std::vector days = StringUtils::Split(dateString, '-'); + vector days = StringUtils::Split(dateString, '-'); if (days.size() == 1) return atoi(days[0].c_str()); else if (days.size() == 2) @@ -848,7 +847,7 @@ } else { - std::vector secs = StringUtils::Split(strCopy, ':'); + vector secs = StringUtils::Split(strCopy, ':'); int timeInSecs = 0; for (unsigned int i = 0; i < 3 && i < secs.size(); i++) { @@ -953,13 +952,6 @@ if (!i) strLabel = StringUtils::Format("%.0lf B", s); - else if (i == ARRAY_SIZE(prefixes)) - { - if (s >= 1000.0) - strLabel = StringUtils::Format(">999.99 %cB", prefixes[i - 1]); - else - strLabel = StringUtils::Format("%.2lf %cB", s, prefixes[i - 1]); - } else if (s >= 100.0) strLabel = StringUtils::Format("%.1lf %cB", s, prefixes[i]); else @@ -1081,11 +1073,49 @@ std::string StringUtils::CreateUUID() { - static GuidGenerator guidGenerator; - auto guid = guidGenerator.newGuid(); + /* This function generate a DCE 1.1, ISO/IEC 11578:1996 and IETF RFC-4122 + * Version 4 conform local unique UUID based upon random number generation. + */ + char UuidStrTmp[40]; + char *pUuidStr = UuidStrTmp; + int i; + + static bool m_uuidInitialized = false; + if (!m_uuidInitialized) + { + /* use current time as the seed for rand()*/ + srand(time(NULL)); + m_uuidInitialized = true; + } + + /*Data1 - 8 characters.*/ + for(i = 0; i < 8; i++, pUuidStr++) + ((*pUuidStr = (rand() % 16)) < 10) ? *pUuidStr += 48 : *pUuidStr += 55; + + /*Data2 - 4 characters.*/ + *pUuidStr++ = '-'; + for(i = 0; i < 4; i++, pUuidStr++) + ((*pUuidStr = (rand() % 16)) < 10) ? *pUuidStr += 48 : *pUuidStr += 55; + + /*Data3 - 4 characters.*/ + *pUuidStr++ = '-'; + for(i = 0; i < 4; i++, pUuidStr++) + ((*pUuidStr = (rand() % 16)) < 10) ? *pUuidStr += 48 : *pUuidStr += 55; + + /*Data4 - 4 characters.*/ + *pUuidStr++ = '-'; + for(i = 0; i < 4; i++, pUuidStr++) + ((*pUuidStr = (rand() % 16)) < 10) ? *pUuidStr += 48 : *pUuidStr += 55; + + /*Data5 - 12 characters.*/ + *pUuidStr++ = '-'; + for(i = 0; i < 12; i++, pUuidStr++) + ((*pUuidStr = (rand() % 16)) < 10) ? *pUuidStr += 48 : *pUuidStr += 55; + + *pUuidStr = '\0'; - std::stringstream strGuid; strGuid << guid; - return strGuid.str(); + m_lastUUID = UuidStrTmp; + return UuidStrTmp; } bool StringUtils::ValidateUUID(const std::string &uuid) @@ -1100,15 +1130,15 @@ return (0.5 + fstrcmp(left.c_str(), right.c_str(), 0.0) * (left.length() + right.length())) / 2.0; } -int StringUtils::FindBestMatch(const std::string &str, const std::vector &strings, double &matchscore) +int StringUtils::FindBestMatch(const std::string &str, const vector &strings, double &matchscore) { int best = -1; matchscore = 0; int i = 0; - for (std::vector::const_iterator it = strings.begin(); it != strings.end(); ++it, i++) + for (vector::const_iterator it = strings.begin(); it != strings.end(); ++it, i++) { - int maxlength = std::max(str.length(), it->length()); + int maxlength = max(str.length(), it->length()); double score = StringUtils::CompareFuzzy(str, *it) / maxlength; if (score > matchscore) { @@ -1119,9 +1149,9 @@ return best; } -bool StringUtils::ContainsKeyword(const std::string &str, const std::vector &keywords) +bool StringUtils::ContainsKeyword(const std::string &str, const vector &keywords) { - for (std::vector::const_iterator it = keywords.begin(); it != keywords.end(); ++it) + for (vector::const_iterator it = keywords.begin(); it != keywords.end(); ++it) { if (str.find(*it) != str.npos) return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/StringUtils.h kodi-15.2~git20151019.1039-final/xbmc/utils/StringUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/StringUtils.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/StringUtils.h 2015-10-19 08:39:17.000000000 +0000 @@ -193,6 +193,8 @@ static void Tokenize(const std::string& input, std::vector& tokens, const std::string& delimiters); static std::vector Tokenize(const std::string& input, const char delimiter); static void Tokenize(const std::string& input, std::vector& tokens, const char delimiter); +private: + static std::string m_lastUUID; }; struct sortstringbyname diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/SystemInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/SystemInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/SystemInfo.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/SystemInfo.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -28,7 +28,7 @@ #else #include #endif -#include "guiinfo/GUIInfoLabels.h" +#include "GUIInfoManager.h" #include "filesystem/CurlFile.h" #include "network/Network.h" #include "Application.h" @@ -36,7 +36,6 @@ #include "guilib/LocalizeStrings.h" #include "CPUInfo.h" #include "CompileInfo.h" -#include "settings/Settings.h" #ifdef TARGET_WINDOWS #include "dwmapi.h" @@ -264,7 +263,7 @@ std::string CSysInfoJob::GetCPUFreqInfo() { double CPUFreq = GetCPUFrequency(); - return StringUtils::Format("%4.0f MHz", CPUFreq); + return StringUtils::Format("%4.0f MHz", CPUFreq);; } CSysData::INTERNET_STATE CSysInfoJob::GetInternetState() @@ -818,10 +817,10 @@ modelName = CDarwinUtils::getIosPlatformString(); #elif defined(TARGET_DARWIN_OSX) size_t nameLen = 0; // 'nameLen' should include terminating null - if (sysctlbyname("hw.model", NULL, &nameLen, NULL, 0) == 0 && nameLen > 1) + if (sysctlbyname("hw.model", NULL, &nameLen, NULL, NULL) == 0 && nameLen > 1) { XUTILS::auto_buffer buf(nameLen); - if (sysctlbyname("hw.model", buf.get(), &nameLen, NULL, 0) == 0 && nameLen == buf.size()) + if (sysctlbyname("hw.model", buf.get(), &nameLen, NULL, NULL) == 0 && nameLen == buf.size()) modelName.assign(buf.get(), nameLen - 1); // assign exactly 'nameLen-1' characters to 'modelName' } #elif defined(TARGET_WINDOWS) @@ -1091,7 +1090,7 @@ if (!result.empty()) return result; - result = GetAppName() + "/" + CSysInfo::GetVersionShort() + " ("; + result = GetAppName() + "/" + (std::string)g_infoManager.GetLabel(SYSTEM_BUILD_VERSION_SHORT) + " ("; #if defined(TARGET_WINDOWS) result += GetKernelName() + " " + GetKernelVersion(); BOOL bIsWow = FALSE; @@ -1217,44 +1216,20 @@ result += " App_Bitness/" + StringUtils::Format("%d", GetXbmcBitness()); - std::string fullVer(CSysInfo::GetVersion()); + std::string fullVer(g_infoManager.GetLabel(SYSTEM_BUILD_VERSION)); StringUtils::Replace(fullVer, ' ', '-'); result += " Version/" + fullVer; return result; } -std::string CSysInfo::GetDeviceName() +bool CSysInfo::IsAppleTV2() { - std::string friendlyName = CSettings::GetInstance().GetString(CSettings::SETTING_SERVICES_DEVICENAME); - if (StringUtils::EqualsNoCase(friendlyName, CCompileInfo::GetAppName())) - { - std::string hostname("[unknown]"); - g_application.getNetwork().GetHostName(hostname); - return StringUtils::Format("%s (%s)", friendlyName.c_str(), hostname.c_str()); - } - - return friendlyName; -} - -// Version string MUST NOT contain spaces. It is used -// in the HTTP request user agent. -std::string CSysInfo::GetVersionShort() -{ - if (strlen(CCompileInfo::GetSuffix()) == 0) - return StringUtils::Format("%d.%d", CCompileInfo::GetMajor(), CCompileInfo::GetMinor()); - else - return StringUtils::Format("%d.%d-%s", CCompileInfo::GetMajor(), CCompileInfo::GetMinor(), CCompileInfo::GetSuffix()); -} - -std::string CSysInfo::GetVersion() -{ - return GetVersionShort() + " Git:" + CCompileInfo::GetSCMID(); -} - -std::string CSysInfo::GetBuildDate() -{ - return StringUtils::Format("%s", __DATE__); +#if defined(TARGET_DARWIN) + return CDarwinUtils::IsAppleTV2(); +#else + return false; +#endif } bool CSysInfo::HasVideoToolBoxDecoder() @@ -1270,6 +1245,8 @@ { #if defined(TARGET_DARWIN_OSX) return "OS X"; +#elif defined(TARGET_DARWIN_IOS_ATV2) + return "iOS ATV2"; #elif defined(TARGET_DARWIN_IOS) return "iOS"; #elif defined(TARGET_FREEBSD) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/SystemInfo.h kodi-15.2~git20151019.1039-final/xbmc/utils/SystemInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/SystemInfo.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/SystemInfo.h 2015-10-19 08:39:17.000000000 +0000 @@ -95,8 +95,8 @@ CSysInfo(void); virtual ~CSysInfo(); - virtual bool Load(const TiXmlNode *settings) override; - virtual bool Save(TiXmlNode *settings) const override; + virtual bool Load(const TiXmlNode *settings); + virtual bool Save(TiXmlNode *settings) const; char MD5_Sign[32 + 1]; @@ -109,12 +109,8 @@ static std::string GetOsVersion(void); static std::string GetOsPrettyNameWithVersion(void); static std::string GetUserAgent(); - static std::string GetDeviceName(); - static std::string GetVersion(); - static std::string GetVersionShort(); - static std::string GetBuildDate(); - bool HasInternet(); + bool IsAppleTV2(); bool HasVideoToolBoxDecoder(); bool IsAeroDisabled(); bool HasHW3DInterlaced(); @@ -146,9 +142,9 @@ static std::string GetUsedCompilerNameAndVer(void); protected: - virtual CJob *GetJob() const override; - virtual std::string TranslateInfo(int info) const override; - virtual void OnJobComplete(unsigned int jobID, bool success, CJob *job) override; + virtual CJob *GetJob() const; + virtual std::string TranslateInfo(int info) const; + virtual void OnJobComplete(unsigned int jobID, bool success, CJob *job); private: CSysData m_info; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestCharsetConverter.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestCharsetConverter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestCharsetConverter.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestCharsetConverter.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -90,28 +90,28 @@ * Settings here are taken from CGUISettings::Initialize() */ /* TODO - CSettingsCategory *loc = CSettings::GetInstance().AddCategory(7, "locale", 14090); - CSettings::GetInstance().AddString(loc, CSettings::SETTING_LOCALE_LANGUAGE,248,"english", + CSettingsCategory *loc = CSettings::Get().AddCategory(7, "locale", 14090); + CSettings::Get().AddString(loc, "locale.language",248,"english", SPIN_CONTROL_TEXT); - CSettings::GetInstance().AddString(loc, CSettings::SETTING_LOCALE_COUNTRY, 20026, "USA", + CSettings::Get().AddString(loc, "locale.country", 20026, "USA", SPIN_CONTROL_TEXT); - CSettings::GetInstance().AddString(loc, CSettings::SETTING_LOCALE_CHARSET, 14091, "DEFAULT", + CSettings::Get().AddString(loc, "locale.charset", 14091, "DEFAULT", SPIN_CONTROL_TEXT); // charset is set by the // language file // Add default settings for subtitles - CSettingsCategory *sub = CSettings::GetInstance().AddCategory(5, "subtitles", 287); - CSettings::GetInstance().AddString(sub, CSettings::SETTING_SUBTITLES_CHARSET, 735, "DEFAULT", + CSettingsCategory *sub = CSettings::Get().AddCategory(5, "subtitles", 287); + CSettings::Get().AddString(sub, "subtitles.charset", 735, "DEFAULT", SPIN_CONTROL_TEXT); */ - CSettings::GetInstance().Initialize(); + CSettings::Get().Initialize(); g_charsetConverter.reset(); g_charsetConverter.clear(); } ~TestCharsetConverter() { - CSettings::GetInstance().Unload(); + CSettings::Get().Unload(); } std::string refstra1, refstra2, varstra1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestCPUInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestCPUInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestCPUInfo.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestCPUInfo.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -68,8 +68,6 @@ }; } -//Disabled for windows because there is no implementation to get the CPU temp and there will probably never be one -#ifndef TARGET_WINDOWS TEST(TestCPUInfo, getTemperature) { TemporarySetting command(g_advancedSettings.m_cpuTempCmd, "echo '50 c'"); @@ -77,7 +75,6 @@ EXPECT_TRUE(g_cpuInfo.getTemperature(t)); EXPECT_TRUE(t.IsValid()); } -#endif TEST(TestCPUInfo, getCPUModel) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestDatabaseUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestDatabaseUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestDatabaseUtils.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestDatabaseUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -44,7 +44,6 @@ album_strLabel = CMusicDatabase::album_strLabel; album_strType = CMusicDatabase::album_strType; album_iRating = CMusicDatabase::album_iRating; - album_dtDateAdded = CMusicDatabase::album_dtDateAdded; song_idSong = CMusicDatabase::song_idSong; song_strTitle = CMusicDatabase::song_strTitle; @@ -56,7 +55,7 @@ song_iStartOffset = CMusicDatabase::song_iStartOffset; song_iEndOffset = CMusicDatabase::song_iEndOffset; song_lastplayed = CMusicDatabase::song_lastplayed; - song_userrating = CMusicDatabase::song_userrating; + song_rating = CMusicDatabase::song_rating; song_comment = CMusicDatabase::song_comment; song_strAlbum = CMusicDatabase::song_strAlbum; song_strPath = CMusicDatabase::song_strPath; @@ -76,7 +75,6 @@ int album_strLabel; int album_strType; int album_iRating; - int album_dtDateAdded; int song_idSong; int song_strTitle; @@ -88,7 +86,7 @@ int song_iStartOffset; int song_iEndOffset; int song_lastplayed; - int song_userrating; + int song_rating; int song_comment; int song_strAlbum; int song_strPath; @@ -179,13 +177,13 @@ DatabaseQueryPartSelect); EXPECT_STREQ(refstr.c_str(), varstr.c_str()); - refstr = "albumview.dateAdded"; + refstr = "albumview.idalbum"; varstr = DatabaseUtils::GetField(FieldDateAdded, MediaTypeAlbum, - DatabaseQueryPartSelect); + DatabaseQueryPartOrderBy); EXPECT_STREQ(refstr.c_str(), varstr.c_str()); refstr = ""; - varstr = DatabaseUtils::GetField(FieldNone, MediaTypeAlbum, + varstr = DatabaseUtils::GetField(FieldDateAdded, MediaTypeAlbum, DatabaseQueryPartSelect); EXPECT_STREQ(refstr.c_str(), varstr.c_str()); @@ -288,7 +286,12 @@ DatabaseQueryPartSelect); EXPECT_STREQ(refstr.c_str(), varstr.c_str()); - refstr = "songview.dateAdded"; + refstr = "songview.idSong"; + varstr = DatabaseUtils::GetField(FieldDateAdded, MediaTypeSong, + DatabaseQueryPartOrderBy); + EXPECT_STREQ(refstr.c_str(), varstr.c_str()); + + refstr = ""; varstr = DatabaseUtils::GetField(FieldDateAdded, MediaTypeSong, DatabaseQueryPartSelect); EXPECT_STREQ(refstr.c_str(), varstr.c_str()); @@ -401,11 +404,6 @@ varstr = DatabaseUtils::GetField(FieldPath, MediaTypeMusicVideo, DatabaseQueryPartOrderBy); EXPECT_STREQ(refstr.c_str(), varstr.c_str()); - - refstr = "musicvideo_view.userrating"; - varstr = DatabaseUtils::GetField(FieldUserRating, MediaTypeMusicVideo, - DatabaseQueryPartSelect); - EXPECT_STREQ(refstr.c_str(), varstr.c_str()); } TEST(TestDatabaseUtils, GetField_MediaTypeMovie) @@ -539,11 +537,6 @@ DatabaseQueryPartSelect); EXPECT_STREQ(refstr.c_str(), varstr.c_str()); - refstr = "movie_view.userrating"; - varstr = DatabaseUtils::GetField(FieldUserRating, MediaTypeMovie, - DatabaseQueryPartSelect); - EXPECT_STREQ(refstr.c_str(), varstr.c_str()); - refstr = ""; varstr = DatabaseUtils::GetField(FieldRandom, MediaTypeMovie, DatabaseQueryPartSelect); @@ -641,11 +634,6 @@ MediaTypeTvShow, DatabaseQueryPartSelect); EXPECT_STREQ(refstr.c_str(), varstr.c_str()); - refstr = "tvshow_view.userrating"; - varstr = DatabaseUtils::GetField(FieldUserRating, MediaTypeTvShow, - DatabaseQueryPartSelect); - EXPECT_STREQ(refstr.c_str(), varstr.c_str()); - refstr = ""; varstr = DatabaseUtils::GetField(FieldRandom, MediaTypeTvShow, DatabaseQueryPartSelect); @@ -756,11 +744,6 @@ DatabaseQueryPartSelect); EXPECT_STREQ(refstr.c_str(), varstr.c_str()); - refstr = "episode_view.userrating"; - varstr = DatabaseUtils::GetField(FieldUserRating, MediaTypeEpisode, - DatabaseQueryPartSelect); - EXPECT_STREQ(refstr.c_str(), varstr.c_str()); - refstr = ""; varstr = DatabaseUtils::GetField(FieldRandom, MediaTypeEpisode, DatabaseQueryPartSelect); @@ -857,10 +840,6 @@ varindex = DatabaseUtils::GetFieldIndex(FieldRating, MediaTypeAlbum); EXPECT_EQ(refindex, varindex); - refindex = a.album_dtDateAdded; - varindex = DatabaseUtils::GetFieldIndex(FieldDateAdded, MediaTypeAlbum); - EXPECT_EQ(refindex, varindex); - refindex = -1; varindex = DatabaseUtils::GetFieldIndex(FieldRandom, MediaTypeAlbum); EXPECT_EQ(refindex, varindex); @@ -911,7 +890,7 @@ varindex = DatabaseUtils::GetFieldIndex(FieldLastPlayed, MediaTypeSong); EXPECT_EQ(refindex, varindex); - refindex = a.song_userrating; + refindex = a.song_rating; varindex = DatabaseUtils::GetFieldIndex(FieldRating, MediaTypeSong); EXPECT_EQ(refindex, varindex); @@ -1008,10 +987,6 @@ varindex = DatabaseUtils::GetFieldIndex(FieldDateAdded, MediaTypeMusicVideo); EXPECT_EQ(refindex, varindex); - refindex = VIDEODB_DETAILS_MUSICVIDEO_USER_RATING; - varindex = DatabaseUtils::GetFieldIndex(FieldUserRating, MediaTypeMusicVideo); - EXPECT_EQ(refindex, varindex); - refindex = -1; varindex = DatabaseUtils::GetFieldIndex(FieldRandom, MediaTypeMusicVideo); EXPECT_EQ(refindex, varindex); @@ -1113,10 +1088,6 @@ varindex = DatabaseUtils::GetFieldIndex(FieldDateAdded, MediaTypeMovie); EXPECT_EQ(refindex, varindex); - refindex = VIDEODB_DETAILS_MOVIE_USER_RATING; - varindex = DatabaseUtils::GetFieldIndex(FieldUserRating, MediaTypeMovie); - EXPECT_EQ(refindex, varindex); - refindex = -1; varindex = DatabaseUtils::GetFieldIndex(FieldRandom, MediaTypeMovie); EXPECT_EQ(refindex, varindex); @@ -1190,10 +1161,6 @@ varindex = DatabaseUtils::GetFieldIndex(FieldSeason, MediaTypeTvShow); EXPECT_EQ(refindex, varindex); - refindex = VIDEODB_DETAILS_TVSHOW_USER_RATING; - varindex = DatabaseUtils::GetFieldIndex(FieldUserRating, MediaTypeTvShow); - EXPECT_EQ(refindex, varindex); - refindex = -1; varindex = DatabaseUtils::GetFieldIndex(FieldRandom, MediaTypeTvShow); EXPECT_EQ(refindex, varindex); @@ -1283,10 +1250,6 @@ varindex = DatabaseUtils::GetFieldIndex(FieldMPAA, MediaTypeEpisode); EXPECT_EQ(refindex, varindex); - refindex = VIDEODB_DETAILS_EPISODE_USER_RATING; - varindex = DatabaseUtils::GetFieldIndex(FieldUserRating, MediaTypeEpisode); - EXPECT_EQ(refindex, varindex); - refindex = -1; varindex = DatabaseUtils::GetFieldIndex(FieldRandom, MediaTypeEpisode); EXPECT_EQ(refindex, varindex); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestFileUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestFileUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestFileUtils.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestFileUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -37,7 +37,7 @@ item->SetPath(tmpfilepath); item->m_bIsFolder = false; item->Select(true); - tmpfile->Close(); //Close tmpfile before we try to delete it + EXPECT_TRUE(CFileUtils::DeleteItem(item)); } @@ -46,7 +46,6 @@ XFILE::CFile *tmpfile; ASSERT_NE(nullptr, (tmpfile = XBMC_CREATETEMPFILE(""))); - tmpfile->Close(); //Close tmpfile before we try to delete it EXPECT_TRUE(CFileUtils::DeleteItem(XBMC_TEMPFILEPATH(tmpfile))); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestJobManager.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestJobManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestJobManager.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestJobManager.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -31,17 +31,17 @@ TestJobManager() { /* TODO - CSettingsCategory* net = CSettings::GetInstance().AddCategory(4, "network", 798); - CSettings::GetInstance().AddBool(net, CSettings::SETTING_NETWORK_USEHTTPPROXY, 708, false); - CSettings::GetInstance().AddString(net, CSettings::SETTING_NETWORK_HTTPPROXYSERVER, 706, "", + CSettingsCategory* net = CSettings::Get().AddCategory(4, "network", 798); + CSettings::Get().AddBool(net, "network.usehttpproxy", 708, false); + CSettings::Get().AddString(net, "network.httpproxyserver", 706, "", EDIT_CONTROL_INPUT); - CSettings::GetInstance().AddString(net, CSettings::SETTING_NETWORK_HTTPPROXYPORT, 730, "8080", + CSettings::Get().AddString(net, "network.httpproxyport", 730, "8080", EDIT_CONTROL_NUMBER_INPUT, false, 707); - CSettings::GetInstance().AddString(net, CSettings::SETTING_NETWORK_HTTPPROXYUSERNAME, 1048, "", + CSettings::Get().AddString(net, "network.httpproxyusername", 1048, "", EDIT_CONTROL_INPUT); - CSettings::GetInstance().AddString(net, CSettings::SETTING_NETWORK_HTTPPROXYPASSWORD, 733, "", + CSettings::Get().AddString(net, "network.httpproxypassword", 733, "", EDIT_CONTROL_HIDDEN_INPUT,true,733); - CSettings::GetInstance().AddInt(net, CSettings::SETTING_NETWORK_BANDWIDTH, 14041, 0, 0, 512, 100*1024, + CSettings::Get().AddInt(net, "network.bandwidth", 14041, 0, 0, 512, 100*1024, SPIN_CONTROL_INT_PLUS, 14048, 351); */ } @@ -51,7 +51,7 @@ /* Always cancel jobs test completion */ CJobManager::GetInstance().CancelJobs(); CJobManager::GetInstance().Restart(); - CSettings::GetInstance().Unload(); + CSettings::Get().Unload(); } }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestJSONVariantParser.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestJSONVariantParser.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestJSONVariantParser.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestJSONVariantParser.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,7 +19,6 @@ */ #include "utils/JSONVariantParser.h" -#include "utils/Variant.h" #include "gtest/gtest.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestJSONVariantWriter.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestJSONVariantWriter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestJSONVariantWriter.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestJSONVariantWriter.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,7 +19,6 @@ */ #include "utils/JSONVariantWriter.h" -#include "utils/Variant.h" #include "gtest/gtest.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestLabelFormatter.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestLabelFormatter.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestLabelFormatter.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestLabelFormatter.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -34,19 +34,19 @@ TestLabelFormatter() { /* TODO - CSettingsCategory* fl = CSettings::GetInstance().AddCategory(7, "filelists", 14081); - CSettings::GetInstance().AddBool(fl, CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS, 13306, true); - CSettings::GetInstance().AddBool(fl, CSettings::SETTING_FILELISTS_SHOWEXTENSIONS, 497, true); - CSettings::GetInstance().AddBool(fl, CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING, 13399, true); - CSettings::GetInstance().AddBool(fl, CSettings::SETTING_FILELISTS_ALLOWFILEDELETION, 14071, false); - CSettings::GetInstance().AddBool(fl, CSettings::SETTING_FILELISTS_SHOWADDSOURCEBUTTONS, 21382, true); - CSettings::GetInstance().AddBool(fl, CSettings::SETTING_FILELISTS_SHOWHIDDEN, 21330, false); + CSettingsCategory* fl = CSettings::Get().AddCategory(7, "filelists", 14081); + CSettings::Get().AddBool(fl, "filelists.showparentdiritems", 13306, true); + CSettings::Get().AddBool(fl, "filelists.showextensions", 497, true); + CSettings::Get().AddBool(fl, "filelists.ignorethewhensorting", 13399, true); + CSettings::Get().AddBool(fl, "filelists.allowfiledeletion", 14071, false); + CSettings::Get().AddBool(fl, "filelists.showaddsourcebuttons", 21382, true); + CSettings::Get().AddBool(fl, "filelists.showhidden", 21330, false); */ } ~TestLabelFormatter() { - CSettings::GetInstance().Unload(); + CSettings::Get().Unload(); } }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestSystemInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestSystemInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestSystemInfo.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestSystemInfo.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -53,6 +53,7 @@ std::cout << "'GetUsedCompilerNameAndVer()': \"" << g_sysinfo.GetUsedCompilerNameAndVer() << "\"\n"; std::cout << "'GetManufacturerName()': \"" << g_sysinfo.GetManufacturerName() << "\"\n"; std::cout << "'GetModelName()': \"" << g_sysinfo.GetModelName() << "\"\n"; + std::cout << "'IsAppleTV2()': \"" << g_sysinfo.IsAppleTV2() << "\"\n"; std::cout << "'GetUserAgent()': \"" << g_sysinfo.GetUserAgent() << "\"\n"; } @@ -227,7 +228,11 @@ EXPECT_NE(std::string::npos, g_sysinfo.GetUserAgent().find("Windows")) << "'GetUserAgent()' must contain 'Windows'"; #elif defined(TARGET_DARWIN_IOS) EXPECT_NE(std::string::npos, g_sysinfo.GetUserAgent().find("like Mac OS X")) << "'GetUserAgent()' must contain ' like Mac OS X'"; +#ifdef TARGET_DARWIN_IOS_ATV2 + EXPECT_NE(std::string::npos, g_sysinfo.GetUserAgent().find("CPU OS ")) << "'GetUserAgent()' must contain 'CPU OS '"; +#else // ! TARGET_DARWIN_IOS_ATV2 EXPECT_TRUE(g_sysinfo.GetUserAgent().find("CPU OS ") != std::string::npos || g_sysinfo.GetUserAgent().find("CPU iPhone OS ") != std::string::npos) << "'GetUserAgent()' must contain 'CPU OS ' or 'CPU iPhone OS '"; +#endif // ! TARGET_DARWIN_IOS_ATV2 #elif defined(TARGET_DARWIN_OSX) EXPECT_EQ(g_sysinfo.GetUserAgent().find('('), g_sysinfo.GetUserAgent().find("(Macintosh; ")) << "Second parameter in 'GetUserAgent()' string must start from 'Macintosh; '"; #elif defined(TARGET_ANDROID) @@ -249,6 +254,16 @@ EXPECT_NE(std::string::npos, g_sysinfo.GetUserAgent().find(" Version/")) << "'GetUserAgent()' must contain ' Version/'"; } +TEST_F(TestSystemInfo, IsAppleTV2) +{ +#ifdef TARGET_DARWIN_IOS_ATV2 + EXPECT_TRUE(g_sysinfo.IsAppleTV2()) << "'IsAppleTV2()' must return 'true'"; +#else + EXPECT_FALSE(g_sysinfo.IsAppleTV2()) << "'IsAppleTV2()' must return 'false'"; +#endif +} + +// FIXME: TARGET_DARWIN_IOS_ATV2? #ifndef TARGET_DARWIN TEST_F(TestSystemInfo, HasVideoToolBoxDecoder) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestURIUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestURIUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestURIUtils.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestURIUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,14 +18,12 @@ * */ -#include - -#include "gtest/gtest.h" - -#include "filesystem/MultiPathDirectory.h" +#include "utils/URIUtils.h" #include "settings/AdvancedSettings.h" +#include "filesystem/MultiPathDirectory.h" #include "URL.h" -#include "utils/URIUtils.h" + +#include "gtest/gtest.h" using namespace XFILE; @@ -283,6 +281,16 @@ EXPECT_TRUE(URIUtils::IsHD("rar://path/to/file")); } +TEST_F(TestURIUtils, IsHDHomeRun) +{ + EXPECT_TRUE(URIUtils::IsHDHomeRun("hdhomerun://path/to/file")); +} + +TEST_F(TestURIUtils, IsSlingbox) +{ + EXPECT_TRUE(URIUtils::IsSlingbox("sling://path/to/file")); +} + TEST_F(TestURIUtils, IsInArchive) { EXPECT_TRUE(URIUtils::IsInArchive("zip://path/to/file")); @@ -314,6 +322,8 @@ TEST_F(TestURIUtils, IsLiveTV) { + EXPECT_TRUE(URIUtils::IsLiveTV("hdhomerun://path/to/file")); + EXPECT_TRUE(URIUtils::IsLiveTV("sling://path/to/file")); EXPECT_TRUE(URIUtils::IsLiveTV("sap://path/to/file")); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestUrlOptions.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestUrlOptions.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/test/TestUrlOptions.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/test/TestUrlOptions.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,7 +19,6 @@ */ #include "utils/UrlOptions.h" -#include "utils/Variant.h" #include "gtest/gtest.h" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/TextSearch.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/TextSearch.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/TextSearch.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/TextSearch.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -21,6 +21,8 @@ #include "TextSearch.h" #include "StringUtils.h" +using namespace std; + CTextSearch::CTextSearch(const std::string &strSearchTerms, bool bCaseSensitive /* = false */, TextSearchDefault defaultSearchMode /* = SEARCH_DEFAULT_OR */) { m_bCaseSensitive = bCaseSensitive; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/TimeSmoother.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/TimeSmoother.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/TimeSmoother.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/TimeSmoother.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -24,6 +24,8 @@ #include #include "utils/MathUtils.h" +using namespace std; + CTimeSmoother::CTimeSmoother() : m_diffs(num_diffs), m_periods(num_periods), @@ -40,17 +42,17 @@ if (diff) m_diffs.push_back(diff); - std::vector bins; + vector bins; BinData(m_diffs, bins, 0.15, 2); if (bins.size() && m_diffs.size() == num_diffs) { // have enough data to update our estimate - std::vector binMultipliers; + vector binMultipliers; GetGCDMultipliers(bins, binMultipliers, 2); assert(binMultipliers.size() == bins.size()); - std::vector intRepresentation; + vector intRepresentation; GetIntRepresentation(m_diffs, intRepresentation, bins, binMultipliers); assert(intRepresentation.size() == m_diffs.size()); @@ -91,13 +93,13 @@ return currentTime; } -void CTimeSmoother::BinData(const boost::circular_buffer &data, std::vector &bins, const double threshold, const unsigned int minbinsize) +void CTimeSmoother::BinData(const boost::circular_buffer &data, vector &bins, const double threshold, const unsigned int minbinsize) { if (!data.size()) return; bins.clear(); - std::vector counts; + vector counts; for (boost::circular_buffer::const_iterator i = data.begin(); i != data.end(); ++i) { @@ -159,7 +161,7 @@ break; // value out of range of unsigned int unsigned int new_n = f * num + old_n; unsigned int new_d = f * denom + old_d; - if (std::min(new_n, new_d) > maxnumden) + if (min(new_n, new_d) > maxnumden) break; old_n = num; old_d = denom; num = new_n; denom = new_d; @@ -171,14 +173,14 @@ assert(num > 0 && denom > 0); } -void CTimeSmoother::GetGCDMultipliers(const std::vector &data, std::vector &multipliers, const unsigned int maxminmult) +void CTimeSmoother::GetGCDMultipliers(const vector &data, vector &multipliers, const unsigned int maxminmult) { - std::vector::const_iterator i = std::min_element(data.begin(), data.end()); + vector::const_iterator i = std::min_element(data.begin(), data.end()); multipliers.clear(); - std::vector num, denom; - for (std::vector::const_iterator j = data.begin(); j != data.end(); ++j) + vector num, denom; + for (vector::const_iterator j = data.begin(); j != data.end(); ++j) { if (j != i) { @@ -193,17 +195,17 @@ denom.push_back(1); } } - std::vector::const_iterator k = std::max_element(num.begin(), num.end()); + vector::const_iterator k = std::max_element(num.begin(), num.end()); for (unsigned int i = 0; i < num.size(); ++i) multipliers.push_back(denom[i] * (*k) / num[i]); } -void CTimeSmoother::GetIntRepresentation(const boost::circular_buffer &data, std::vector &intData, const std::vector &bins, const std::vector &intBins) +void CTimeSmoother::GetIntRepresentation(const boost::circular_buffer &data, vector &intData, const vector &bins, const vector &intBins) { intData.clear(); for (boost::circular_buffer::const_iterator i = data.begin(); i != data.end(); ++i) { - double min_r2 = std::numeric_limits::max(); + double min_r2 = numeric_limits::max(); unsigned int min_j = 0; for (unsigned int j = 0; j < bins.size(); ++j) { @@ -219,7 +221,7 @@ } } -double CTimeSmoother::EstimatePeriod(const boost::circular_buffer &data, const std::vector &intData) +double CTimeSmoother::EstimatePeriod(const boost::circular_buffer &data, const vector &intData) { double sxy = 0, sxx = 0; for (unsigned int i = 0; i < data.size(); ++i) @@ -235,7 +237,7 @@ assert(m_prevIn.size() == m_prevOut.size()); if (m_period) { - std::vector outTimes; + vector outTimes; for (unsigned int i = 0; i < m_prevIn.size(); ++i) outTimes.push_back(m_prevOut[i] + m_period * MathUtils::round_int((currentTime - m_prevIn[i]) / m_period)); sort(outTimes.begin(), outTimes.end()); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/URIUtils.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/URIUtils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/URIUtils.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/URIUtils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -34,6 +34,7 @@ #include #include +using namespace std; using namespace XFILE; bool URIUtils::IsInPath(const std::string &uri, const std::string &baseURI) @@ -59,7 +60,7 @@ } size_t period = strFileName.find_last_of("./\\"); - if (period == std::string::npos || strFileName[period] != '.') + if (period == string::npos || strFileName[period] != '.') return std::string(); return strFileName.substr(period); @@ -74,7 +75,7 @@ } size_t iPeriod = strFileName.find_last_of("./\\"); - return iPeriod != std::string::npos && strFileName[iPeriod] == '.'; + return iPeriod != string::npos && strFileName[iPeriod] == '.'; } bool URIUtils::HasExtension(const CURL& url, const std::string& strExtensions) @@ -128,7 +129,7 @@ } size_t period = strFileName.find_last_of("./\\"); - if (period != std::string::npos && strFileName[period] == '.') + if (period != string::npos && strFileName[period] == '.') { std::string strExtension = strFileName.substr(period); StringUtils::ToLower(strExtension); @@ -229,7 +230,7 @@ std::string sep(1, url.GetDirectorySeparator()); // split the filename portion of the URL up into separate dirs - std::vector dirs = StringUtils::Split(url.GetFileName(), sep); + vector dirs = StringUtils::Split(url.GetFileName(), sep); // we start with the root path std::string dir = url.GetWithoutFilename(); @@ -248,7 +249,7 @@ { // find the common path of parent and path unsigned int j = 1; - while (j <= std::min(strParent.size(), strPath.size()) && strnicmp(strParent.c_str(), strPath.c_str(), j) == 0) + while (j <= min(strParent.size(), strPath.size()) && strnicmp(strParent.c_str(), strPath.c_str(), j) == 0) j++; strParent.erase(j - 1); // they should at least share a / at the end, though for things such as path/cd1 and path/cd2 there won't be @@ -265,8 +266,7 @@ || url.IsProtocol("rar") || url.IsProtocol("apk") || url.IsProtocol("bluray") - || url.IsProtocol("udf") - || url.IsProtocol("xbt"); + || url.IsProtocol("udf"); } bool URIUtils::HasEncodedHostname(const CURL& url) @@ -425,8 +425,8 @@ std::string URLEncodePath(const std::string& strPath) { - std::vector segments = StringUtils::Split(strPath, "/"); - for (std::vector::iterator i = segments.begin(); i != segments.end(); ++i) + vector segments = StringUtils::Split(strPath, "/"); + for (vector::iterator i = segments.begin(); i != segments.end(); ++i) *i = CURL::Encode(*i); return StringUtils::Join(segments, "/"); @@ -434,8 +434,8 @@ std::string URLDecodePath(const std::string& strPath) { - std::vector segments = StringUtils::Split(strPath, "/"); - for (std::vector::iterator i = segments.begin(); i != segments.end(); ++i) + vector segments = StringUtils::Split(strPath, "/"); + for (vector::iterator i = segments.begin(); i != segments.end(); ++i) *i = CURL::Decode(*i); return StringUtils::Join(segments, "/"); @@ -522,20 +522,10 @@ return StringUtils::StartsWith(url, start); } -bool URIUtils::PathEquals(const std::string& url, const std::string &start, bool ignoreTrailingSlash /* = false */, bool ignoreURLOptions /* = false */) +bool URIUtils::PathEquals(const std::string& url, const std::string &start, bool ignoreTrailingSlash /* = false */) { - std::string path1, path2; - if (ignoreURLOptions) - { - path1 = CURL(url).GetWithoutOptions(); - path2 = CURL(start).GetWithoutOptions(); - } - else - { - path1 = url; - path2 = start; - } - + std::string path1 = url; + std::string path2 = start; if (ignoreTrailingSlash) { RemoveSlashAtEnd(path1); @@ -558,7 +548,7 @@ if(IsMultiPath(strFile)) { // virtual paths need to be checked separately - std::vector paths; + vector paths; if (CMultiPathDirectory::GetPaths(strFile, paths)) { for (unsigned int i = 0; i < paths.size(); i++) @@ -642,7 +632,7 @@ // assume a hostname without dot's // is local (smb netbios hostnames) - if(host.find('.') == std::string::npos) + if(host.find('.') == string::npos) return true; uint32_t address = ntohl(inet_addr(host.c_str())); @@ -908,14 +898,6 @@ return StringUtils::StartsWithNoCase(strFile2, "pvr://channels"); } -bool URIUtils::IsPVRGuideItem(const std::string& strFile) -{ - if (IsStack(strFile)) - return IsPVRGuideItem(CStackDirectory::GetFirstStackedFile(strFile)); - - return StringUtils::StartsWithNoCase(strFile, "pvr://guide"); -} - bool URIUtils::IsDAV(const std::string& strFile) { if (IsStack(strFile)) @@ -972,12 +954,24 @@ return IsProtocol(strFile, "upnp"); } +bool URIUtils::IsHDHomeRun(const std::string& strFile) +{ + return IsProtocol(strFile, "hdhomerun"); +} + +bool URIUtils::IsSlingbox(const std::string& strFile) +{ + return IsProtocol(strFile, "sling"); +} + bool URIUtils::IsLiveTV(const std::string& strFile) { std::string strFileWithoutSlash(strFile); RemoveSlashAtEnd(strFileWithoutSlash); - if (IsProtocol(strFile, "sap") + if (IsHDHomeRun(strFile) + || IsSlingbox(strFile) + || IsProtocol(strFile, "sap") ||(StringUtils::EndsWithNoCase(strFileWithoutSlash, ".pvr") && !PathStarts(strFileWithoutSlash, "pvr://recordings"))) return true; @@ -1163,10 +1157,10 @@ return path; const std::string slashStr(1, slashCharacter); - std::vector pathVec, resultVec; + vector pathVec, resultVec; StringUtils::Tokenize(path, pathVec, slashStr); - for (std::vector::const_iterator it = pathVec.begin(); it != pathVec.end(); ++it) + for (vector::const_iterator it = pathVec.begin(); it != pathVec.end(); ++it) { if (*it == ".") { /* skip - do nothing */ } @@ -1226,11 +1220,11 @@ // Keeps the final slash at end and possible |option=foo options. size_t iPosSlash = strFilePath.find_last_of("/\\"); - if (iPosSlash == std::string::npos) + if (iPosSlash == string::npos) return ""; // No slash, so no path (ignore any options) size_t iPosBar = strFilePath.rfind('|'); - if (iPosBar == std::string::npos) + if (iPosBar == string::npos) return strFilePath.substr(0, iPosSlash + 1); // Only path return strFilePath.substr(0, iPosSlash + 1) + strFilePath.substr(iPosBar); // Path + options @@ -1259,7 +1253,7 @@ return url; } -std::string URIUtils::GetRealPath(const std::string &path) +string URIUtils::GetRealPath(const string &path) { if (path.empty()) return path; @@ -1278,11 +1272,11 @@ size_t posSlash = path.find('/'); size_t posBackslash = path.find('\\'); - std::string delim = posSlash < posBackslash ? "/" : "\\"; - std::vector parts = StringUtils::Split(path, delim); - std::vector realParts; + string delim = posSlash < posBackslash ? "/" : "\\"; + vector parts = StringUtils::Split(path, delim); + vector realParts; - for (std::vector::const_iterator part = parts.begin(); part != parts.end(); ++part) + for (vector::const_iterator part = parts.begin(); part != parts.end(); ++part) { if (part->empty() || part->compare(".") == 0) continue; @@ -1325,11 +1319,11 @@ // if this is a stack:// URL we need to work with its filename if (URIUtils::IsStack(strFilename)) { - std::vector files; + vector files; if (!CStackDirectory::GetPaths(strFilename, files)) return false; - for (std::vector::iterator file = files.begin(); file != files.end(); ++file) + for (vector::iterator file = files.begin(); file != files.end(); ++file) UpdateUrlEncoding(*file); std::string stackPath; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/URIUtils.h kodi-15.2~git20151019.1039-final/xbmc/utils/URIUtils.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/URIUtils.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/URIUtils.h 2015-10-19 08:39:17.000000000 +0000 @@ -117,7 +117,7 @@ \return true if the paths are equal, false otherwise. \sa IsProtocol, PathStarts */ - static bool PathEquals(const std::string& path1, const std::string &path2, bool ignoreTrailingSlash = false, bool ignoreURLOptions = false); + static bool PathEquals(const std::string& path1, const std::string &path2, bool ignoreTrailingSlash = false); static bool IsAddonsPath(const std::string& strFile); static bool IsSourcesPath(const std::string& strFile); @@ -130,6 +130,8 @@ static bool IsUDP(const std::string& strFile); static bool IsTCP(const std::string& strFile); static bool IsHD(const std::string& strFileName); + static bool IsHDHomeRun(const std::string& strFile); + static bool IsSlingbox(const std::string& strFile); static bool IsInArchive(const std::string& strFile); static bool IsInRAR(const std::string& strFile); static bool IsInternetStream(const std::string& path, bool bStrictCheck = false); @@ -163,7 +165,6 @@ static bool IsLibraryFolder(const std::string& strFile); static bool IsLibraryContent(const std::string& strFile); static bool IsPVRChannel(const std::string& strFile); - static bool IsPVRGuideItem(const std::string& strFile); static bool IsUsingFastSwitch(const std::string& strFile); static void AddSlashAtEnd(std::string& strFolder); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/UrlOptions.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/UrlOptions.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/UrlOptions.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/UrlOptions.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -25,6 +25,8 @@ #include "utils/StringUtils.h" #include "utils/log.h" +using namespace std; + CUrlOptions::CUrlOptions() : m_strLead("") { } @@ -67,7 +69,7 @@ if (key.empty() || value == NULL) return; - return AddOption(key, std::string(value)); + return AddOption(key, string(value)); } void CUrlOptions::AddOption(const std::string &key, const std::string &value) @@ -115,7 +117,7 @@ if (options.empty()) return; - std::string strOptions = options; + string strOptions = options; // if matching the preset leading str, remove from options. if (!m_strLead.empty() && strOptions.compare(0, m_strLead.length(), m_strLead) == 0) @@ -130,17 +132,17 @@ } // split the options by & and process them one by one - std::vector optionList = StringUtils::Split(strOptions, "&"); - for (std::vector::const_iterator option = optionList.begin(); option != optionList.end(); ++option) + vector optionList = StringUtils::Split(strOptions, "&"); + for (vector::const_iterator option = optionList.begin(); option != optionList.end(); ++option) { if (option->empty()) continue; - std::string key, value; + string key, value; size_t pos = option->find('='); key = CURL::Decode(option->substr(0, pos)); - if (pos != std::string::npos) + if (pos != string::npos) value = CURL::Decode(option->substr(pos + 1)); // the key cannot be empty diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Variant.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/Variant.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/Variant.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Variant.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -21,7 +21,6 @@ #include #include #include -#include #include "Variant.h" @@ -39,9 +38,11 @@ #endif // TARGET_WINDOWS #endif // strtoll -std::string trimRight(const std::string &str) +using namespace std; + +string trimRight(const string &str) { - std::string tmp = str; + string tmp = str; // find_last_not_of will return string::npos (which is defined as -1) // or a value between 0 and size() - 1 => find_last_not_of() + 1 will // always result in a valid index between 0 and size() @@ -50,9 +51,9 @@ return tmp; } -std::wstring trimRight(const std::wstring &str) +wstring trimRight(const wstring &str) { - std::wstring tmp = str; + wstring tmp = str; // find_last_not_of will return string::npos (which is defined as -1) // or a value between 0 and size() - 1 => find_last_not_of() + 1 will // always result in a valid index between 0 and size() @@ -61,10 +62,10 @@ return tmp; } -int64_t str2int64(const std::string &str, int64_t fallback /* = 0 */) +int64_t str2int64(const string &str, int64_t fallback /* = 0 */) { char *end = NULL; - std::string tmp = trimRight(str); + string tmp = trimRight(str); int64_t result = strtoll(tmp.c_str(), &end, 0); if (end == NULL || *end == '\0') return result; @@ -72,10 +73,10 @@ return fallback; } -int64_t str2int64(const std::wstring &str, int64_t fallback /* = 0 */) +int64_t str2int64(const wstring &str, int64_t fallback /* = 0 */) { wchar_t *end = NULL; - std::wstring tmp = trimRight(str); + wstring tmp = trimRight(str); int64_t result = wcstoll(tmp.c_str(), &end, 0); if (end == NULL || *end == '\0') return result; @@ -83,10 +84,10 @@ return fallback; } -uint64_t str2uint64(const std::string &str, uint64_t fallback /* = 0 */) +uint64_t str2uint64(const string &str, uint64_t fallback /* = 0 */) { char *end = NULL; - std::string tmp = trimRight(str); + string tmp = trimRight(str); uint64_t result = strtoull(tmp.c_str(), &end, 0); if (end == NULL || *end == '\0') return result; @@ -94,10 +95,10 @@ return fallback; } -uint64_t str2uint64(const std::wstring &str, uint64_t fallback /* = 0 */) +uint64_t str2uint64(const wstring &str, uint64_t fallback /* = 0 */) { wchar_t *end = NULL; - std::wstring tmp = trimRight(str); + wstring tmp = trimRight(str); uint64_t result = wcstoull(tmp.c_str(), &end, 0); if (end == NULL || *end == '\0') return result; @@ -105,10 +106,10 @@ return fallback; } -double str2double(const std::string &str, double fallback /* = 0.0 */) +double str2double(const string &str, double fallback /* = 0.0 */) { char *end = NULL; - std::string tmp = trimRight(str); + string tmp = trimRight(str); double result = strtod(tmp.c_str(), &end); if (end == NULL || *end == '\0') return result; @@ -116,10 +117,10 @@ return fallback; } -double str2double(const std::wstring &str, double fallback /* = 0.0 */) +double str2double(const wstring &str, double fallback /* = 0.0 */) { wchar_t *end = NULL; - std::wstring tmp = trimRight(str); + wstring tmp = trimRight(str); double result = wcstod(tmp.c_str(), &end); if (end == NULL || *end == '\0') return result; @@ -148,10 +149,10 @@ m_data.dvalue = 0.0; break; case VariantTypeString: - m_data.string = new std::string(); + m_data.string = new string(); break; case VariantTypeWideString: - m_data.wstring = new std::wstring(); + m_data.wstring = new wstring(); break; case VariantTypeArray: m_data.array = new VariantArray(); @@ -210,49 +211,37 @@ CVariant::CVariant(const char *str) { m_type = VariantTypeString; - m_data.string = new std::string(str); + m_data.string = new string(str); } CVariant::CVariant(const char *str, unsigned int length) { m_type = VariantTypeString; - m_data.string = new std::string(str, length); -} - -CVariant::CVariant(const std::string &str) -{ - m_type = VariantTypeString; - m_data.string = new std::string(str); + m_data.string = new string(str, length); } -CVariant::CVariant(std::string &&str) +CVariant::CVariant(const string &str) { m_type = VariantTypeString; - m_data.string = new std::string(std::move(str)); + m_data.string = new string(str); } CVariant::CVariant(const wchar_t *str) { m_type = VariantTypeWideString; - m_data.wstring = new std::wstring(str); + m_data.wstring = new wstring(str); } CVariant::CVariant(const wchar_t *str, unsigned int length) { m_type = VariantTypeWideString; - m_data.wstring = new std::wstring(str, length); + m_data.wstring = new wstring(str, length); } -CVariant::CVariant(const std::wstring &str) +CVariant::CVariant(const wstring &str) { m_type = VariantTypeWideString; - m_data.wstring = new std::wstring(str); -} - -CVariant::CVariant(std::wstring &&str) -{ - m_type = VariantTypeWideString; - m_data.wstring = new std::wstring(std::move(str)); + m_data.wstring = new wstring(str); } CVariant::CVariant(const std::vector &strArray) @@ -260,8 +249,8 @@ m_type = VariantTypeArray; m_data.array = new VariantArray; m_data.array->reserve(strArray.size()); - for (const auto& item : strArray) - m_data.array->push_back(CVariant(item)); + for (unsigned int index = 0; index < strArray.size(); index++) + m_data.array->push_back(strArray.at(index)); } CVariant::CVariant(const std::map &strMap) @@ -284,15 +273,6 @@ *this = variant; } -CVariant::CVariant(CVariant&& rhs) -{ - //Set this so that operator= don't try and run cleanup - //when we're not initialized. - m_type = VariantTypeNull; - - *this = std::move(rhs); -} - CVariant::~CVariant() { cleanup(); @@ -582,7 +562,7 @@ m_data.integer = rhs.m_data.integer; break; case VariantTypeUnsignedInteger: - m_data.unsignedinteger = rhs.m_data.unsignedinteger; + m_data.integer = rhs.m_data.unsignedinteger; break; case VariantTypeBoolean: m_data.boolean = rhs.m_data.boolean; @@ -591,10 +571,10 @@ m_data.dvalue = rhs.m_data.dvalue; break; case VariantTypeString: - m_data.string = new std::string(*rhs.m_data.string); + m_data.string = new string(*rhs.m_data.string); break; case VariantTypeWideString: - m_data.wstring = new std::wstring(*rhs.m_data.wstring); + m_data.wstring = new wstring(*rhs.m_data.wstring); break; case VariantTypeArray: m_data.array = new VariantArray(rhs.m_data.array->begin(), rhs.m_data.array->end()); @@ -609,34 +589,6 @@ return *this; } -CVariant& CVariant::operator=(CVariant&& rhs) -{ - if (m_type == VariantTypeConstNull || this == &rhs) - return *this; - - //Make sure that if we're moved into we don't leak any pointers - if (m_type != VariantTypeNull) - cleanup(); - - m_type = rhs.m_type; - m_data = std::move(rhs.m_data); - - //Should be enough to just set m_type here - //but better safe than sorry, could probably lead to coverity warnings - if (rhs.m_type == VariantTypeString) - rhs.m_data.string = nullptr; - else if (rhs.m_type == VariantTypeWideString) - rhs.m_data.wstring = nullptr; - else if (rhs.m_type == VariantTypeArray) - rhs.m_data.array = nullptr; - else if (rhs.m_type == VariantTypeObject) - rhs.m_data.map = nullptr; - - rhs.m_type = VariantTypeNull; - - return *this; -} - bool CVariant::operator==(const CVariant &rhs) const { if (m_type == rhs.m_type) @@ -679,28 +631,11 @@ m_data.array->push_back(variant); } -void CVariant::push_back(CVariant &&variant) -{ - if (m_type == VariantTypeNull) - { - m_type = VariantTypeArray; - m_data.array = new VariantArray; - } - - if (m_type == VariantTypeArray) - m_data.array->push_back(std::move(variant)); -} - void CVariant::append(const CVariant &variant) { push_back(variant); } -void CVariant::append(CVariant&& variant) -{ - push_back(std::move(variant)); -} - const char *CVariant::c_str() const { if (m_type == VariantTypeString) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Variant.h kodi-15.2~git20151019.1039-final/xbmc/utils/Variant.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/Variant.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Variant.h 2015-10-19 08:39:17.000000000 +0000 @@ -59,20 +59,15 @@ CVariant(const char *str); CVariant(const char *str, unsigned int length); CVariant(const std::string &str); - CVariant(std::string &&str); CVariant(const wchar_t *str); CVariant(const wchar_t *str, unsigned int length); CVariant(const std::wstring &str); - CVariant(std::wstring &&str); CVariant(const std::vector &strArray); CVariant(const std::map &strMap); CVariant(const std::map &variantMap); CVariant(const CVariant &variant); - CVariant(CVariant &&rhs); ~CVariant(); - - bool isInteger() const; bool isUnsignedInteger() const; bool isBoolean() const; @@ -99,14 +94,11 @@ const CVariant &operator[](unsigned int position) const; CVariant &operator=(const CVariant &rhs); - CVariant &operator=(CVariant &&rhs); bool operator==(const CVariant &rhs) const; bool operator!=(const CVariant &rhs) const { return !(*this == rhs); } void push_back(const CVariant &variant); - void push_back(CVariant &&variant); void append(const CVariant &variant); - void append(CVariant &&variant); const char *c_str() const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Weather.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/Weather.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/Weather.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Weather.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -21,33 +21,30 @@ #if (defined HAVE_CONFIG_H) && (!defined TARGET_WINDOWS) #include "config.h" #endif - #include "Weather.h" - -#include - -#include "addons/AddonManager.h" -#include "addons/GUIDialogAddonSettings.h" -#include "Application.h" -#include "filesystem/Directory.h" #include "filesystem/ZipManager.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "guilib/WindowIDs.h" -#include "GUIUserMessages.h" -#include "interfaces/generic/ScriptInvocationManager.h" -#include "LangInfo.h" -#include "log.h" +#include "XMLUtils.h" +#include "utils/POUtils.h" +#include "utils/Temperature.h" #include "network/Network.h" +#include "Application.h" #include "settings/lib/Setting.h" #include "settings/Settings.h" +#include "guilib/GUIWindowManager.h" +#include "GUIUserMessages.h" +#include "XBDateTime.h" +#include "LangInfo.h" +#include "guilib/WindowIDs.h" +#include "guilib/LocalizeStrings.h" +#include "filesystem/Directory.h" #include "StringUtils.h" #include "URIUtils.h" -#include "utils/POUtils.h" -#include "utils/Temperature.h" -#include "XBDateTime.h" -#include "XMLUtils.h" +#include "log.h" +#include "addons/AddonManager.h" +#include "interfaces/generic/ScriptInvocationManager.h" +#include "addons/GUIDialogAddonSettings.h" +using namespace std; using namespace ADDON; using namespace XFILE; @@ -60,13 +57,17 @@ #define LOCALIZED_TOKEN_FIRSTID4 71 #define LOCALIZED_TOKEN_LASTID4 97 -static const std::string IconAddonPath = "resource://resource.images.weathericons.default"; - /* FIXME'S >strings are not centered */ +#define WEATHER_BASE_PATH "special://temp/weather/" +#define WEATHER_ICON_PATH "special://temp/weather/" +#define WEATHER_SOURCE_FILE "special://xbmc/media/weather.zip" + +bool CWeatherJob::m_imagesOkay = false; + CWeatherJob::CWeatherJob(int location) { m_location = location; @@ -75,11 +76,11 @@ bool CWeatherJob::DoWork() { // wait for the network - if (!g_application.getNetwork().IsAvailable()) + if (!g_application.getNetwork().IsAvailable(true)) return false; AddonPtr addon; - if (!ADDON::CAddonMgr::GetInstance().GetAddon(CSettings::GetInstance().GetString(CSettings::SETTING_WEATHER_ADDON), addon, ADDON_SCRIPT_WEATHER)) + if (!ADDON::CAddonMgr::Get().GetAddon(CSettings::Get().GetString("weather.addon"), addon, ADDON_SCRIPT_WEATHER)) return false; // initialize our sys.argv variables @@ -93,14 +94,20 @@ CLog::Log(LOGINFO, "WEATHER: Downloading weather"); // call our script, passing the areacode int scriptId = -1; - if ((scriptId = CScriptInvocationManager::GetInstance().ExecuteAsync(argv[0], addon, argv)) >= 0) + if ((scriptId = CScriptInvocationManager::Get().ExecuteAsync(argv[0], addon, argv)) >= 0) { while (true) { - if (!CScriptInvocationManager::GetInstance().IsRunning(scriptId)) + if (!CScriptInvocationManager::Get().IsRunning(scriptId)) break; Sleep(100); } + if (!m_imagesOkay) + { + CDirectory::Create(WEATHER_BASE_PATH); + g_ZipManager.ExtractArchive(WEATHER_SOURCE_FILE, WEATHER_BASE_PATH); + m_imagesOkay = true; + } SetFromProperties(); @@ -139,8 +146,8 @@ void CWeatherJob::LocalizeOverview(std::string &str) { - std::vector words = StringUtils::Split(str, " "); - for (std::vector::iterator i = words.begin(); i != words.end(); ++i) + vector words = StringUtils::Split(str, " "); + for (vector::iterator i = words.begin(); i != words.end(); ++i) LocalizeOverviewToken(*i); str = StringUtils::Join(words, " "); } @@ -155,7 +162,7 @@ { // We load the english strings in to get our tokens std::string language = LANGUAGE_DEFAULT; - CSettingString* languageSetting = static_cast(CSettings::GetInstance().GetSetting(CSettings::SETTING_LOCALE_LANGUAGE)); + CSettingString* languageSetting = static_cast(CSettings::Get().GetSetting("locale.language")); if (languageSetting != NULL) language = languageSetting->GetDefault(); @@ -241,7 +248,7 @@ if (in.empty() || in == "N/A") in = "na.png"; - return URIUtils::AddFileToFolder(IconAddonPath, in); + return URIUtils::AddFileToFolder(WEATHER_ICON_PATH,in); } void CWeatherJob::SetFromProperties() @@ -315,7 +322,7 @@ std::string CWeather::BusyInfo(int info) const { if (info == WEATHER_IMAGE_CURRENT_ICON) - return URIUtils::AddFileToFolder(IconAddonPath, "na.png"); + return URIUtils::AddFileToFolder(WEATHER_ICON_PATH,"na.png"); return CInfoLoader::BusyInfo(info); } @@ -374,8 +381,8 @@ */ void CWeather::SetArea(int iLocation) { - CSettings::GetInstance().SetInt(CSettings::SETTING_WEATHER_CURRENTLOCATION, iLocation); - CSettings::GetInstance().Save(); + CSettings::Get().SetInt("weather.currentlocation", iLocation); + CSettings::Get().Save(); } /*! @@ -384,7 +391,7 @@ */ int CWeather::GetArea() const { - return CSettings::GetInstance().GetInt(CSettings::SETTING_WEATHER_CURRENTLOCATION); + return CSettings::Get().GetInt("weather.currentlocation"); } CJob *CWeather::GetJob() const @@ -404,7 +411,7 @@ return; const std::string settingId = setting->GetId(); - if (settingId == CSettings::SETTING_WEATHER_ADDON) + if (settingId == "weather.addon") { // clear "WeatherProviderLogo" property that some weather addons set CGUIWindow* window = g_windowManager.GetWindow(WINDOW_WEATHER); @@ -419,10 +426,10 @@ return; const std::string settingId = setting->GetId(); - if (settingId == CSettings::SETTING_WEATHER_ADDONSETTINGS) + if (settingId == "weather.addonsettings") { AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(CSettings::GetInstance().GetString(CSettings::SETTING_WEATHER_ADDON), addon, ADDON_SCRIPT_WEATHER) && addon != NULL) + if (CAddonMgr::Get().GetAddon(CSettings::Get().GetString("weather.addon"), addon, ADDON_SCRIPT_WEATHER) && addon != NULL) { // TODO: maybe have ShowAndGetInput return a bool if settings changed, then only reset weather if true. CGUIDialogAddonSettings::ShowAndGetInput(addon); Refresh(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/Weather.h kodi-15.2~git20151019.1039-final/xbmc/utils/Weather.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/Weather.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/Weather.h 2015-10-19 08:39:17.000000000 +0000 @@ -156,13 +156,13 @@ void SetArea(int iLocation); int GetArea() const; protected: - virtual CJob *GetJob() const override; - virtual std::string TranslateInfo(int info) const override; - virtual std::string BusyInfo(int info) const override; - virtual void OnJobComplete(unsigned int jobID, bool success, CJob *job) override; + virtual CJob *GetJob() const; + virtual std::string TranslateInfo(int info) const; + virtual std::string BusyInfo(int info) const; + virtual void OnJobComplete(unsigned int jobID, bool success, CJob *job); - virtual void OnSettingChanged(const CSetting *setting) override; - virtual void OnSettingAction(const CSetting *setting) override; + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); private: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/win32/gpu_memcpy_sse4.h kodi-15.2~git20151019.1039-final/xbmc/utils/win32/gpu_memcpy_sse4.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/win32/gpu_memcpy_sse4.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/win32/gpu_memcpy_sse4.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2011-2015 Hendrik Leppkes - * http://www.1f0.de - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Taken from the QuickSync decoder by Eric Gur - */ - -#include - -// gpu_memcpy is a memcpy style function that copied data very fast from a -// GPU tiled memory (write back) -// Performance tip: page offset (12 lsb) of both addresses should be different -// optimally use a 2K offset between them. -inline void* gpu_memcpy(void* d, const void* s, size_t size) -{ - static const size_t regsInLoop = sizeof(size_t) * 2; // 8 or 16 - - if (d == nullptr || s == nullptr) return nullptr; - - // If memory is not aligned, use memcpy - bool isAligned = (((size_t)(s) | (size_t)(d)) & 0xF) == 0; - if (!isAligned) - { - return memcpy(d, s, size); - } - - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; -#ifdef _M_X64 - __m128i xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15; -#endif - - size_t reminder = size & (regsInLoop * sizeof(xmm0) - 1); // Copy 128 or 256 bytes every loop - size_t end = 0; - - __m128i* pTrg = (__m128i*)d; - __m128i* pTrgEnd = pTrg + ((size - reminder) >> 4); - __m128i* pSrc = (__m128i*)s; - - // Make sure source is synced - doesn't hurt if not needed. - _mm_sfence(); - - while (pTrg < pTrgEnd) - { - // _mm_stream_load_si128 emits the Streaming SIMD Extensions 4 (SSE4.1) instruction MOVNTDQA - // Fastest method for copying GPU RAM. Available since Penryn (45nm Core 2 Duo/Quad) - xmm0 = _mm_stream_load_si128(pSrc); - xmm1 = _mm_stream_load_si128(pSrc + 1); - xmm2 = _mm_stream_load_si128(pSrc + 2); - xmm3 = _mm_stream_load_si128(pSrc + 3); - xmm4 = _mm_stream_load_si128(pSrc + 4); - xmm5 = _mm_stream_load_si128(pSrc + 5); - xmm6 = _mm_stream_load_si128(pSrc + 6); - xmm7 = _mm_stream_load_si128(pSrc + 7); -#ifdef _M_X64 // Use all 16 xmm registers - xmm8 = _mm_stream_load_si128(pSrc + 8); - xmm9 = _mm_stream_load_si128(pSrc + 9); - xmm10 = _mm_stream_load_si128(pSrc + 10); - xmm11 = _mm_stream_load_si128(pSrc + 11); - xmm12 = _mm_stream_load_si128(pSrc + 12); - xmm13 = _mm_stream_load_si128(pSrc + 13); - xmm14 = _mm_stream_load_si128(pSrc + 14); - xmm15 = _mm_stream_load_si128(pSrc + 15); -#endif - pSrc += regsInLoop; - // _mm_store_si128 emit the SSE2 intruction MOVDQA (aligned store) - _mm_store_si128(pTrg , xmm0); - _mm_store_si128(pTrg + 1, xmm1); - _mm_store_si128(pTrg + 2, xmm2); - _mm_store_si128(pTrg + 3, xmm3); - _mm_store_si128(pTrg + 4, xmm4); - _mm_store_si128(pTrg + 5, xmm5); - _mm_store_si128(pTrg + 6, xmm6); - _mm_store_si128(pTrg + 7, xmm7); -#ifdef _M_X64 // Use all 16 xmm registers - _mm_store_si128(pTrg + 8, xmm8); - _mm_store_si128(pTrg + 9, xmm9); - _mm_store_si128(pTrg + 10, xmm10); - _mm_store_si128(pTrg + 11, xmm11); - _mm_store_si128(pTrg + 12, xmm12); - _mm_store_si128(pTrg + 13, xmm13); - _mm_store_si128(pTrg + 14, xmm14); - _mm_store_si128(pTrg + 15, xmm15); -#endif - pTrg += regsInLoop; - } - - // Copy in 16 byte steps - if (reminder >= 16) - { - size = reminder; - reminder = size & 15; - end = size >> 4; - for (size_t i = 0; i < end; ++i) - { - pTrg[i] = _mm_stream_load_si128(pSrc + i); - } - } - - // Copy last bytes - shouldn't happen as strides are modulu 16 - if (reminder) - { - __m128i temp = _mm_stream_load_si128(pSrc + end); - - char* ps = (char*)(&temp); - char* pt = (char*)(pTrg + end); - - for (size_t i = 0; i < reminder; ++i) - { - pt[i] = ps[i]; - } - } - - return d; -} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/win32/memcpy_sse2.h kodi-15.2~git20151019.1039-final/xbmc/utils/win32/memcpy_sse2.h --- kodi-16.1~git20160425.1001-final/xbmc/utils/win32/memcpy_sse2.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/win32/memcpy_sse2.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ -/* -* Copyright (C) 2005-2015 Team Kodi -* http://kodi.tv -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; either -* version 2.1 of the License, or (at your option) any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -* -*/ - -#include - -inline void* memcpy_aligned(void* dst, const void* src, size_t size) -{ - size_t i; - __m128i xmm1, xmm2, xmm3, xmm4; - - // if memory is not aligned, use memcpy - if ((((size_t)(src) | (size_t)(dst)) & 0xF)) - return memcpy(dst, src, size); - - uint8_t* d = (uint8_t*)(dst); - uint8_t* s = (uint8_t*)(src); - - for (i = 0; i < size - 63; i += 64) - { - xmm1 = _mm_load_si128((__m128i*)(s + i + 0)); - xmm2 = _mm_load_si128((__m128i*)(s + i + 16)); - xmm3 = _mm_load_si128((__m128i*)(s + i + 32)); - xmm4 = _mm_load_si128((__m128i*)(s + i + 48)); - _mm_stream_si128((__m128i*)(d + i + 0), xmm1); - _mm_stream_si128((__m128i*)(d + i + 16), xmm2); - _mm_stream_si128((__m128i*)(d + i + 32), xmm3); - _mm_stream_si128((__m128i*)(d + i + 48), xmm4); - } - for (; i < size; i += 16) - { - xmm1 = _mm_load_si128((__m128i*)(s + i)); - _mm_stream_si128((__m128i*)(d + i), xmm1); - } - return dst; -} - -inline void convert_yuv420_nv12(uint8_t *const src[], const int srcStride[], int height, int width, uint8_t *const dst[], const int dstStride[]) -{ - __m128i xmm0, xmm1, xmm2, xmm3, xmm4; - _mm_sfence(); - - // Convert to NV12 - Luma - if (srcStride[0] == dstStride[0]) - memcpy_aligned(dst[0], src[0], srcStride[0] * height); - else - { - for (size_t line = 0; line < height; ++line) - { - uint8_t * s = src[0] + srcStride[0] * line; - uint8_t * d = dst[0] + dstStride[0] * line; - memcpy_aligned(d, s, srcStride[0]); - } - } - // Convert to NV12 - Chroma - size_t chromaWidth = (width + 1) >> 1; - size_t chromaHeight = height >> 1; - for (size_t line = 0; line < chromaHeight; ++line) - { - size_t i; - uint8_t * u = src[1] + line * srcStride[1]; - uint8_t * v = src[2] + line * srcStride[2]; - uint8_t * d = dst[1] + line * dstStride[1]; - // if memory is not aligned use memcpy - if (((size_t)(u) | (size_t)(v) | (size_t)(d)) & 0xF) - { - for (i = 0; i < chromaWidth; ++i) - { - *d++ = *u++; - *d++ = *v++; - } - } - else - { - for (i = 0; i < (chromaWidth - 31); i += 32) - { - xmm0 = _mm_load_si128((__m128i*)(v + i)); - xmm1 = _mm_load_si128((__m128i*)(u + i)); - xmm2 = _mm_load_si128((__m128i*)(v + i + 16)); - xmm3 = _mm_load_si128((__m128i*)(u + i + 16)); - - xmm4 = xmm0; - xmm0 = _mm_unpacklo_epi8(xmm1, xmm0); - xmm4 = _mm_unpackhi_epi8(xmm1, xmm4); - - xmm1 = xmm2; - xmm2 = _mm_unpacklo_epi8(xmm3, xmm2); - xmm1 = _mm_unpackhi_epi8(xmm3, xmm1); - - _mm_stream_si128((__m128i *)(d + (i << 1) + 0), xmm0); - _mm_stream_si128((__m128i *)(d + (i << 1) + 16), xmm4); - _mm_stream_si128((__m128i *)(d + (i << 1) + 32), xmm2); - _mm_stream_si128((__m128i *)(d + (i << 1) + 48), xmm1); - } - if (((size_t)chromaWidth) & 0xF) - { - d += (i << 1); - u += i; v += i; - for (; i < chromaWidth; ++i) - { - *d++ = *u++; - *d++ = *v++; - } - } - else if (i < chromaWidth) - { - xmm0 = _mm_load_si128((__m128i*)(v + i)); - xmm1 = _mm_load_si128((__m128i*)(u + i)); - - xmm2 = xmm0; - xmm0 = _mm_unpacklo_epi8(xmm1, xmm0); - xmm2 = _mm_unpackhi_epi8(xmm1, xmm2); - - _mm_stream_si128((__m128i *)(d + (i << 1) + 0), xmm0); - _mm_stream_si128((__m128i *)(d + (i << 1) + 16), xmm2); - } - } - } -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/utils/WindowsShortcut.cpp kodi-15.2~git20151019.1039-final/xbmc/utils/WindowsShortcut.cpp --- kodi-16.1~git20160425.1001-final/xbmc/utils/WindowsShortcut.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/utils/WindowsShortcut.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -43,6 +43,8 @@ #define VOLUME_LOCAL 1 #define VOLUME_NETWORK 2 +using namespace std; + ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// @@ -55,7 +57,7 @@ { } -bool CWindowsShortcut::GetShortcut(const std::string& strFileName, std::string& strFileOrDir) +bool CWindowsShortcut::GetShortcut(const string& strFileName, string& strFileOrDir) { strFileOrDir = ""; if (!IsShortcut(strFileName) ) return false; @@ -115,7 +117,7 @@ return true; } -bool CWindowsShortcut::IsShortcut(const std::string& strFileName) +bool CWindowsShortcut::IsShortcut(const string& strFileName) { CFile file; if (!file.Open(strFileName.c_str(), CFile::typeBinary | CFile::modeRead)) return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,34 +19,28 @@ */ #include "GUIDialogAudioSubtitleSettings.h" - -#include -#include - -#include "addons/Skin.h" #include "Application.h" -#include "cores/AudioEngine/Utils/AEUtil.h" +#include "FileItem.h" +#include "GUIPassword.h" +#include "URL.h" +#include "addons/Skin.h" #include "cores/IPlayer.h" +#include "cores/AudioEngine/Utils/AEUtil.h" #include "dialogs/GUIDialogFileBrowser.h" #include "dialogs/GUIDialogYesNo.h" -#include "FileItem.h" #include "filesystem/File.h" -#include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" -#include "GUIPassword.h" #include "profiles/ProfilesManager.h" #include "settings/AdvancedSettings.h" -#include "settings/lib/Setting.h" -#include "settings/lib/SettingsManager.h" #include "settings/MediaSettings.h" #include "settings/MediaSourceSettings.h" #include "settings/Settings.h" -#include "URL.h" +#include "settings/lib/Setting.h" +#include "settings/lib/SettingsManager.h" #include "utils/LangCodeExpander.h" #include "utils/log.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "video/VideoDatabase.h" #define SETTING_AUDIO_VOLUME "audio.volume" @@ -55,7 +49,6 @@ #define SETTING_AUDIO_STREAM "audio.stream" #define SETTING_AUDIO_OUTPUT_TO_ALL_SPEAKERS "audio.outputtoallspeakers" #define SETTING_AUDIO_PASSTHROUGH "audio.digitalanalog" -#define SETTING_AUDIO_DSP "audio.dsp" #define SETTING_SUBTITLE_ENABLE "subtitles.enable" #define SETTING_SUBTITLE_DELAY "subtitles.delay" @@ -64,10 +57,11 @@ #define SETTING_AUDIO_MAKE_DEFAULT "audio.makedefault" +using namespace std; + CGUIDialogAudioSubtitleSettings::CGUIDialogAudioSubtitleSettings() : CGUIDialogSettingsManualBase(WINDOW_DIALOG_AUDIO_OSD_SETTINGS, "VideoOSDSettings.xml"), - m_passthrough(false), - m_dspEnabled(false) + m_passthrough(false) { } CGUIDialogAudioSubtitleSettings::~CGUIDialogAudioSubtitleSettings() @@ -82,16 +76,13 @@ if (g_application.m_pPlayer->HasPlayer()) { - const CVideoSettings &videoSettings = CMediaSettings::GetInstance().GetCurrentVideoSettings(); + const CVideoSettings &videoSettings = CMediaSettings::Get().GetCurrentVideoSettings(); // these settings can change on the fly + m_settingsManager->SetNumber(SETTING_AUDIO_DELAY, videoSettings.m_AudioDelay); // TODO (needs special handling): m_settingsManager->SetInt(SETTING_AUDIO_STREAM, g_application.m_pPlayer->GetAudioStream()); - if (!m_dspEnabled) //< The follow settings are on enabled DSP system separated to them and need no update here. - { - m_settingsManager->SetNumber(SETTING_AUDIO_DELAY, videoSettings.m_AudioDelay); - m_settingsManager->SetBool(SETTING_AUDIO_OUTPUT_TO_ALL_SPEAKERS, videoSettings.m_OutputToAllSpeakers); - } - m_settingsManager->SetBool(SETTING_AUDIO_PASSTHROUGH, CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH)); + m_settingsManager->SetBool(SETTING_AUDIO_OUTPUT_TO_ALL_SPEAKERS, videoSettings.m_OutputToAllSpeakers); + m_settingsManager->SetBool(SETTING_AUDIO_PASSTHROUGH, CSettings::Get().GetBool("audiooutput.passthrough")); // TODO: m_settingsManager->SetBool(SETTING_SUBTITLE_ENABLE, g_application.m_pPlayer->GetSubtitleVisible()); // \-> Unless subtitle visibility can change on the fly, while Dialog is up, this code should be removed. @@ -129,7 +120,7 @@ CGUIDialogSettingsManualBase::OnSettingChanged(setting); - CVideoSettings &videoSettings = CMediaSettings::GetInstance().GetCurrentVideoSettings(); + CVideoSettings &videoSettings = CMediaSettings::Get().GetCurrentVideoSettings(); const std::string &settingId = setting->GetId(); if (settingId == SETTING_AUDIO_VOLUME) { @@ -164,7 +155,7 @@ else if (settingId == SETTING_AUDIO_PASSTHROUGH) { m_passthrough = static_cast(setting)->GetValue(); - CSettings::GetInstance().SetBool(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH, m_passthrough); + CSettings::Get().SetBool("audiooutput.passthrough", m_passthrough); } else if (settingId == SETTING_SUBTITLE_ENABLE) { @@ -191,11 +182,7 @@ CGUIDialogSettingsManualBase::OnSettingAction(setting); const std::string &settingId = setting->GetId(); - if (settingId == SETTING_AUDIO_DSP) - { - g_windowManager.ActivateWindow(WINDOW_DIALOG_AUDIO_DSP_OSD_SETTINGS); - } - else if (settingId == SETTING_SUBTITLE_BROWSER) + if (settingId == SETTING_SUBTITLE_BROWSER) { std::string strPath; if (URIUtils::IsInRAR(g_application.CurrentFileItem().GetPath()) || URIUtils::IsInZIP(g_application.CurrentFileItem().GetPath())) @@ -206,13 +193,13 @@ std::string strMask = ".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.aqt|.jss|.ass|.idx|.rar|.zip"; if (g_application.GetCurrentPlayer() == EPC_DVDPLAYER) strMask = ".srt|.rar|.zip|.ifo|.smi|.sub|.idx|.ass|.ssa|.txt"; - VECSOURCES shares(*CMediaSourceSettings::GetInstance().GetSources("video")); - if (CMediaSettings::GetInstance().GetAdditionalSubtitleDirectoryChecked() != -1 && !CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_CUSTOMPATH).empty()) + VECSOURCES shares(*CMediaSourceSettings::Get().GetSources("video")); + if (CMediaSettings::Get().GetAdditionalSubtitleDirectoryChecked() != -1 && !CSettings::Get().GetString("subtitles.custompath").empty()) { CMediaSource share; std::vector paths; paths.push_back(URIUtils::GetDirectory(strPath)); - paths.push_back(CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_CUSTOMPATH)); + paths.push_back(CSettings::Get().GetString("subtitles.custompath")); share.FromNameAndPaths("video",g_localizeStrings.Get(21367),paths); shares.push_back(share); strPath = share.strPath; @@ -237,11 +224,11 @@ void CGUIDialogAudioSubtitleSettings::Save() { if (!g_passwordManager.CheckSettingLevelLock(SettingLevelExpert) && - CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) + CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) return; // prompt user if they are sure - if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{12376}, CVariant{12377})) + if (!CGUIDialogYesNo::ShowAndGetInput(12376, 12377)) return; // reset the settings @@ -252,10 +239,10 @@ db.EraseVideoSettings(); db.Close(); - CMediaSettings::GetInstance().GetDefaultVideoSettings() = CMediaSettings::GetInstance().GetCurrentVideoSettings(); - CMediaSettings::GetInstance().GetDefaultVideoSettings().m_SubtitleStream = -1; - CMediaSettings::GetInstance().GetDefaultVideoSettings().m_AudioStream = -1; - CSettings::GetInstance().Save(); + CMediaSettings::Get().GetDefaultVideoSettings() = CMediaSettings::Get().GetCurrentVideoSettings(); + CMediaSettings::Get().GetDefaultVideoSettings().m_SubtitleStream = -1; + CMediaSettings::Get().GetDefaultVideoSettings().m_AudioStream = -1; + CSettings::Get().Save(); } void CGUIDialogAudioSubtitleSettings::SetupView() @@ -298,7 +285,7 @@ bool usePopup = g_SkinInfo->HasSkinFile("DialogSlider.xml"); - CVideoSettings &videoSettings = CMediaSettings::GetInstance().GetCurrentVideoSettings(); + CVideoSettings &videoSettings = CMediaSettings::Get().GetCurrentVideoSettings(); if (g_application.m_pPlayer->HasPlayer()) { @@ -315,9 +302,7 @@ ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition("IsPlayingPassthrough", "", "", true, m_settingsManager))); SettingDependencies depsAudioOutputPassthroughDisabled; depsAudioOutputPassthroughDisabled.push_back(dependencyAudioOutputPassthroughDisabled); - - m_dspEnabled = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_DSPADDONSENABLED); - + // audio settings // audio volume setting m_volume = g_application.GetVolume(false); @@ -325,18 +310,15 @@ settingAudioVolume->SetDependencies(depsAudioOutputPassthroughDisabled); static_cast(settingAudioVolume->GetControl())->SetFormatter(SettingFormatterPercentAsDecibel); - if (m_dspEnabled) - AddButton(groupAudio, SETTING_AUDIO_DSP, 24136, 0); - // audio volume amplification setting - if (SupportsAudioFeature(IPC_AUD_AMP) && !m_dspEnabled) + if (SupportsAudioFeature(IPC_AUD_AMP)) { CSettingNumber *settingAudioVolumeAmplification = AddSlider(groupAudio, SETTING_AUDIO_VOLUME_AMPLIFICATION, 660, 0, videoSettings.m_VolumeAmplification, 14054, VOLUME_DRC_MINIMUM * 0.01f, (VOLUME_DRC_MAXIMUM - VOLUME_DRC_MINIMUM) / 6000.0f, VOLUME_DRC_MAXIMUM * 0.01f); settingAudioVolumeAmplification->SetDependencies(depsAudioOutputPassthroughDisabled); } // audio delay setting - if (SupportsAudioFeature(IPC_AUD_OFFSET) && !m_dspEnabled) + if (SupportsAudioFeature(IPC_AUD_OFFSET)) { CSettingNumber *settingAudioDelay = AddSlider(groupAudio, SETTING_AUDIO_DELAY, 297, 0, videoSettings.m_AudioDelay, 0, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange, 297, usePopup); static_cast(settingAudioDelay->GetControl())->SetFormatter(SettingFormatterDelay); @@ -348,13 +330,13 @@ // audio output to all speakers setting // TODO: remove this setting - if (SupportsAudioFeature(IPC_AUD_OUTPUT_STEREO) && !m_dspEnabled) + if (SupportsAudioFeature(IPC_AUD_OUTPUT_STEREO)) AddToggle(groupAudio, SETTING_AUDIO_OUTPUT_TO_ALL_SPEAKERS, 252, 0, videoSettings.m_OutputToAllSpeakers); // audio digital/analog setting if (SupportsAudioFeature(IPC_AUD_SELECT_OUTPUT)) { - m_passthrough = CSettings::GetInstance().GetBool(CSettings::SETTING_AUDIOOUTPUT_PASSTHROUGH); + m_passthrough = CSettings::Get().GetBool("audiooutput.passthrough"); AddToggle(groupAudio, SETTING_AUDIO_PASSTHROUGH, 348, 0, m_passthrough); } @@ -428,7 +410,7 @@ AddList(group, settingId, 462, 0, m_subtitleStream, SubtitleStreamsOptionFiller, 462); } -bool CGUIDialogAudioSubtitleSettings::IsPlayingPassthrough(const std::string &condition, const std::string &value, const CSetting *setting, void *data) +bool CGUIDialogAudioSubtitleSettings::IsPlayingPassthrough(const std::string &condition, const std::string &value, const CSetting *setting) { return g_application.m_pPlayer->IsPassthrough(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.h kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.h 2015-12-08 04:00:30.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.h 2015-10-19 08:39:17.000000000 +0000 @@ -20,12 +20,8 @@ * */ -#include - #include "settings/dialogs/GUIDialogSettingsManualBase.h" -class CVariant; - class CGUIDialogAudioSubtitleSettings : public CGUIDialogSettingsManualBase { public: @@ -58,7 +54,7 @@ void AddAudioStreams(CSettingGroup *group, const std::string &settingId); void AddSubtitleStreams(CSettingGroup *group, const std::string &settingId); - static bool IsPlayingPassthrough(const std::string &condition, const std::string &value, const CSetting *setting, void *data); + static bool IsPlayingPassthrough(const std::string &condition, const std::string &value, const CSetting *setting); static void AudioStreamsOptionFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); static void SubtitleStreamsOptionFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); @@ -71,7 +67,6 @@ bool m_passthrough; int m_subtitleStream; bool m_subtitleVisible; - bool m_dspEnabled; typedef std::vector Features; Features m_audioCaps; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogFileStacking.cpp kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogFileStacking.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogFileStacking.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogFileStacking.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "GUIDialogFileStacking.h" +#include "input/Key.h" +#include "guilib/LocalizeStrings.h" +#include "FileItem.h" +#include "utils/StringUtils.h" + +using namespace std; + +#define STACK_LIST 450 + +CGUIDialogFileStacking::CGUIDialogFileStacking(void) + : CGUIDialog(WINDOW_DIALOG_FILESTACKING, "DialogFileStacking.xml") +{ + m_iSelectedFile = -1; + m_iNumberOfFiles = 0; + m_stackItems = new CFileItemList; +} + +CGUIDialogFileStacking::~CGUIDialogFileStacking(void) +{ + delete m_stackItems; +} + +bool CGUIDialogFileStacking::OnMessage(CGUIMessage& message) +{ + switch ( message.GetMessage() ) + { + case GUI_MSG_WINDOW_DEINIT: + CGUIDialog::OnMessage(message); + if (m_stackItems) + m_stackItems->Clear(); + return true; + case GUI_MSG_WINDOW_INIT: + { + CGUIDialog::OnMessage(message); + m_iSelectedFile = -1; + return true; + } + break; + + case GUI_MSG_CLICKED: + { + if (message.GetSenderId() == STACK_LIST && (message.GetParam1() == ACTION_SELECT_ITEM || + message.GetParam1() == ACTION_MOUSE_LEFT_CLICK)) + { + // grab the selected item + CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), STACK_LIST); + OnMessage(msg); + m_iSelectedFile = msg.GetParam1() + 1; + } + Close(); + return true; + } + break; + } + return CGUIDialog::OnMessage(message); +} + +int CGUIDialogFileStacking::GetSelectedFile() const +{ + return m_iSelectedFile; +} + +void CGUIDialogFileStacking::SetNumberOfFiles(int iFiles) +{ + m_iNumberOfFiles = iFiles; +} + +void CGUIDialogFileStacking::OnInitWindow() +{ + if (GetControl(STACK_LIST)) + { + // have the new stack list instead - fill it up + SendMessage(GUI_MSG_LABEL_RESET, GetID(), STACK_LIST); + for (int i = 0; i < m_iNumberOfFiles; i++) + { + std::string label = StringUtils::Format(g_localizeStrings.Get(23051).c_str(), i+1); + CFileItemPtr item(new CFileItem(label)); + m_stackItems->Add(item); + } + CGUIMessage msg(GUI_MSG_LABEL_BIND, GetID(), STACK_LIST, 0, 0, m_stackItems); + OnMessage(msg); + } + CGUIDialog::OnInitWindow(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogFileStacking.h kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogFileStacking.h --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogFileStacking.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogFileStacking.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,42 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "guilib/GUIDialog.h" + +class CFileItemList; + +class CGUIDialogFileStacking : + public CGUIDialog +{ +public: + CGUIDialogFileStacking(void); + virtual ~CGUIDialogFileStacking(void); + virtual bool OnMessage(CGUIMessage& message); + + int GetSelectedFile() const; + void SetNumberOfFiles(int iFiles); +protected: + virtual void OnInitWindow(); + int m_iSelectedFile; + int m_iNumberOfFiles; + CFileItemList* m_stackItems; +}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogSubtitles.cpp kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogSubtitles.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogSubtitles.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogSubtitles.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -39,7 +39,6 @@ #include "utils/log.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "URL.h" #include "Util.h" #include "video/VideoDatabase.h" @@ -98,12 +97,13 @@ CGUIDialogSubtitles::CGUIDialogSubtitles(void) : CGUIDialog(WINDOW_DIALOG_SUBTITLES, "DialogSubtitles.xml") - , m_subtitles(new CFileItemList) - , m_serviceItems(new CFileItemList) - , m_pausedOnRun(false) - , m_updateSubsList(false) { - m_loadType = KEEP_IN_MEMORY; + m_loadType = KEEP_IN_MEMORY; + m_subtitles = new CFileItemList; + m_serviceItems = new CFileItemList; + m_pausedOnRun = false; + m_updateSubsList = false; + m_LastAutoDownloaded = ""; } CGUIDialogSubtitles::~CGUIDialogSubtitles(void) @@ -147,7 +147,7 @@ else if (iControl == CONTROL_MANUALSEARCH) { //manual search - if (CGUIKeyboardFactory::ShowAndGetInput(m_strManualSearch, CVariant{g_localizeStrings.Get(24121)}, true)) + if (CGUIKeyboardFactory::ShowAndGetInput(m_strManualSearch, g_localizeStrings.Get(24121), true)) { Search(m_strManualSearch); return true; @@ -173,7 +173,7 @@ { // Pause the video if the user has requested it m_pausedOnRun = false; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_SUBTITLES_PAUSEONSEARCH) && !g_application.m_pPlayer->IsPaused()) + if (CSettings::Get().GetBool("subtitles.pauseonsearch") && !g_application.m_pPlayer->IsPaused()) { g_application.m_pPlayer->Pause(); m_pausedOnRun = true; @@ -234,7 +234,7 @@ ClearServices(); VECADDONS addons; - ADDON::CAddonMgr::GetInstance().GetAddons(ADDON_SUBTITLE_MODULE, addons, true); + ADDON::CAddonMgr::Get().GetAddons(ADDON_SUBTITLE_MODULE, addons, true); if (addons.empty()) { @@ -247,10 +247,10 @@ if (item.GetVideoContentType() == VIDEODB_CONTENT_TVSHOWS || item.GetVideoContentType() == VIDEODB_CONTENT_EPISODES) // Set default service for tv shows - defaultService = CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_TV); + defaultService = CSettings::Get().GetString("subtitles.tv"); else // Set default service for filemode and movies - defaultService = CSettings::GetInstance().GetString(CSettings::SETTING_SUBTITLES_MOVIE); + defaultService = CSettings::Get().GetString("subtitles.movie"); std::string service = addons.front()->ID(); for (VECADDONS::const_iterator addonIt = addons.begin(); addonIt != addons.end(); ++addonIt) @@ -325,7 +325,7 @@ else url.SetOption("action", "search"); - const CSetting *setting = CSettings::GetInstance().GetSetting(CSettings::SETTING_SUBTITLES_LANGUAGES); + const CSetting *setting = CSettings::Get().GetSetting("subtitles.languages"); if (setting) url.SetOption("languages", setting->ToString()); @@ -333,7 +333,7 @@ if (g_application.CurrentFileItem().IsStack()) url.SetOption("stack", "1"); - std::string preferredLanguage = CSettings::GetInstance().GetString(CSettings::SETTING_LOCALE_SUBTITLELANGUAGE); + std::string preferredLanguage = CSettings::Get().GetString("locale.subtitlelanguage"); if(StringUtils::EqualsNoCase(preferredLanguage, "original")) { @@ -375,7 +375,7 @@ m_updateSubsList = true; if (!items->IsEmpty() && g_application.m_pPlayer->GetSubtitleCount() == 0 && - m_LastAutoDownloaded != g_application.CurrentFile() && CSettings::GetInstance().GetBool(CSettings::SETTING_SUBTITLES_DOWNLOADFIRST)) + m_LastAutoDownloaded != g_application.CurrentFile() && CSettings::Get().GetBool("subtitles.downloadfirst")) { CFileItemPtr item = items->Get(0); CLog::Log(LOGDEBUG, "%s - Automatically download first subtitle: %s", __FUNCTION__, item->GetLabel2().c_str()); @@ -441,7 +441,7 @@ return; } - SUBTITLE_STORAGEMODE storageMode = (SUBTITLE_STORAGEMODE) CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_STORAGEMODE); + SUBTITLE_STORAGEMODE storageMode = (SUBTITLE_STORAGEMODE) CSettings::Get().GetInt("subtitles.storagemode"); // Get (unstacked) path std::string strCurrentFile = g_application.CurrentUnstackedItem().GetPath(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogTeletext.cpp kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogTeletext.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogTeletext.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogTeletext.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -27,13 +27,15 @@ #include "dialogs/GUIDialogKaiToast.h" #include "settings/Settings.h" +using namespace std; + static int teletextFadeAmount = 0; CGUIDialogTeletext::CGUIDialogTeletext() : CGUIDialog(WINDOW_DIALOG_OSD_TELETEXT, "") { m_pTxtTexture = NULL; - m_renderOrder = RENDER_ORDER_DIALOG_TELETEXT; + m_renderOrder = INT_MAX - 3; } CGUIDialogTeletext::~CGUIDialogTeletext() @@ -177,7 +179,7 @@ top = g_graphicsContext.ScaleFinalYCoord(0, 0); bottom = g_graphicsContext.ScaleFinalYCoord(0, (float)m_coordsRes.iHeight); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_TELETEXTSCALE)) + if (CSettings::Get().GetBool("videoplayer.teletextscale")) { /* Fixed aspect ratio to 4:3 for teletext */ float width = right - left; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoBookmarks.cpp kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoBookmarks.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoBookmarks.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoBookmarks.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -49,12 +49,10 @@ #include "video/VideoThumbLoader.h" #include "filesystem/File.h" #include "TextureCache.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "settings/Settings.h" -#include -#include -using namespace KODI::MESSAGING; +using namespace std; #define BOOKMARK_THUMB_WIDTH g_advancedSettings.GetThumbSize() @@ -230,7 +228,7 @@ if (itemPos < m_vecItems->Size()) { std::string time = StringUtils::Format("chapter://%s/%i", m_filePath.c_str(), chapterIdx); - std::string cachefile = CTextureCache::GetInstance().GetCachedPath(CTextureCache::GetInstance().GetCacheFile(time) + ".jpg"); + std::string cachefile = CTextureCache::Get().GetCachedPath(CTextureCache::Get().GetCacheFile(time) + ".jpg"); if (XFILE::CFile::Exists(cachefile)) { (*m_vecItems)[itemPos]->SetArt("thumb", cachefile); @@ -294,10 +292,10 @@ item->SetLabel2(time); std::string chapterPath = StringUtils::Format("chapter://%s/%i", m_filePath.c_str(), i); - std::string cachefile = CTextureCache::GetInstance().GetCachedPath(CTextureCache::GetInstance().GetCacheFile(chapterPath)+".jpg"); + std::string cachefile = CTextureCache::Get().GetCachedPath(CTextureCache::Get().GetCacheFile(chapterPath)+".jpg"); if (XFILE::CFile::Exists(cachefile)) item->SetArt("thumb", cachefile); - else if (i > m_jobsStarted && CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_EXTRACTCHAPTERTHUMBS)) + else if (i > m_jobsStarted && CSettings::Get().GetBool("myvideos.extractchapterthumbs")) { CFileItem item(m_filePath, false); CJob* job = new CThumbExtractor(item, m_filePath, true, chapterPath, pos * 1000, false); @@ -319,7 +317,7 @@ // add items to file list and mark the proper item as selected if the current playtime is above int selectedItemIndex = 0; - double playTime = g_application.GetTime(); + int playTime = g_application.GetTime(); for (auto& item : items) { m_vecItems->Add(item); @@ -328,7 +326,7 @@ } m_viewControl.SetItems(*m_vecItems); - m_viewControl.SetSelectedItem(selectedItemIndex); + m_viewControl.SetSelectedItem(selectedItemIndex);; } void CGUIDialogVideoBookmarks::Update() @@ -338,7 +336,7 @@ if (g_application.CurrentFileItem().HasVideoInfoTag() && g_application.CurrentFileItem().GetVideoInfoTag()->m_iEpisode > -1) { - std::vector episodes; + vector episodes; videoDatabase.GetEpisodesByFile(g_application.CurrentFile(),episodes); if (episodes.size() > 1) { @@ -381,14 +379,14 @@ return; CFileItemPtr fileItem = m_vecItems->Get(item); - int chapter = static_cast(fileItem->GetProperty("chapter").asInteger()); - if (chapter <= 0) + int chapter = fileItem->GetProperty("chapter").asInteger(); + if (!chapter) { g_application.m_pPlayer->SetPlayerState(fileItem->GetProperty("playerstate").asString()); g_application.SeekTime(fileItem->GetProperty("resumepoint").asDouble()); } else - g_application.m_pPlayer->SeekChapter(chapter); + g_application.m_pPlayer->SeekChapter(fileItem->GetProperty("chapter").asInteger()); Close(); } @@ -420,7 +418,7 @@ else bookmark.playerState.clear(); - bookmark.player = CPlayerCoreFactory::GetInstance().GetPlayerName(g_application.GetCurrentPlayer()); + bookmark.player = CPlayerCoreFactory::Get().GetPlayerName(g_application.GetCurrentPlayer()); // create the thumbnail image #ifdef HAS_VIDEO_PLAYBACK @@ -453,7 +451,7 @@ Crc32 crc; crc.ComputeFromLowerCase(g_application.CurrentFile()); bookmark.thumbNailImage = StringUtils::Format("%08x_%i.jpg", (unsigned __int32) crc, (int)bookmark.timeInSeconds); - bookmark.thumbNailImage = URIUtils::AddFileToFolder(CProfilesManager::GetInstance().GetBookmarksThumbFolder(), bookmark.thumbNailImage); + bookmark.thumbNailImage = URIUtils::AddFileToFolder(CProfilesManager::Get().GetBookmarksThumbFolder(), bookmark.thumbNailImage); if (!CPicture::CreateThumbnailFromSurface(thumbnail->GetPixels(), width, height, thumbnail->GetWidth() * 4, bookmark.thumbNailImage)) bookmark.thumbNailImage.clear(); @@ -512,7 +510,7 @@ bool CGUIDialogVideoBookmarks::AddEpisodeBookmark() { - std::vector episodes; + vector episodes; CVideoDatabase videoDatabase; videoDatabase.Open(); videoDatabase.GetEpisodesByFile(g_application.CurrentFile(), episodes); @@ -563,7 +561,7 @@ { CVideoDatabase videoDatabase; videoDatabase.Open(); - std::vector episodes; + vector episodes; videoDatabase.GetEpisodesByFile(g_application.CurrentFile(),episodes); if (episodes.size() > 1) { @@ -592,7 +590,7 @@ { unsigned int chapterIdx = (*iter).second; CGUIMessage m(GUI_MSG_REFRESH_LIST, GetID(), 0, 1, chapterIdx); - CApplicationMessenger::GetInstance().SendGUIMessage(m); + CApplicationMessenger::Get().SendGUIMessage(m); m_mapJobsChapter.erase(iter); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoInfo.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoInfo.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -23,13 +23,12 @@ #include "guilib/GUIWindow.h" #include "Util.h" #include "guilib/GUIImage.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "video/windows/GUIWindowVideoNav.h" #include "dialogs/GUIDialogFileBrowser.h" #include "video/VideoInfoScanner.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "video/VideoInfoTag.h" #include "guilib/GUIKeyboardFactory.h" #include "guilib/GUIWindowManager.h" @@ -56,18 +55,18 @@ #include "filesystem/Directory.h" #include "filesystem/VideoDatabaseDirectory.h" #include "filesystem/VideoDatabaseDirectory/QueryParams.h" +#ifdef HAS_UPNP +#endif #include "utils/FileUtils.h" -#include "utils/Variant.h" +using namespace std; using namespace XFILE::VIDEODATABASEDIRECTORY; using namespace XFILE; -using namespace KODI::MESSAGING; #define CONTROL_IMAGE 3 #define CONTROL_TEXTAREA 4 #define CONTROL_BTN_TRACKS 5 #define CONTROL_BTN_REFRESH 6 -#define CONTROL_BTN_USERRATING 7 #define CONTROL_BTN_PLAY 8 #define CONTROL_BTN_RESUME 9 #define CONTROL_BTN_GET_THUMB 10 @@ -90,10 +89,8 @@ m_bRefreshAll = true; m_bRefresh = false; m_hasUpdatedThumb = false; - m_hasUpdatedUserrating = false; m_castList = new CFileItemList; m_loadType = KEEP_IN_MEMORY; - m_startUserrating = -1; } CGUIDialogVideoInfo::~CGUIDialogVideoInfo(void) @@ -108,17 +105,6 @@ case GUI_MSG_WINDOW_DEINIT: { ClearCastList(); - - if (m_startUserrating != m_movieItem->GetVideoInfoTag()->m_iUserRating) - { - CVideoDatabase db; - if (db.Open()) - { - m_hasUpdatedUserrating = true; - db.SetVideoUserRating(m_movieItem->GetVideoInfoTag()->m_iDbId, m_movieItem->GetVideoInfoTag()->m_iUserRating, m_movieItem->GetVideoInfoTag()->m_type); - db.Close(); - } - } } break; @@ -130,7 +116,7 @@ if (m_movieItem->GetVideoInfoTag()->m_type == MediaTypeTvShow) { bool bCanceled=false; - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{20377}, CVariant{20378}, bCanceled, CVariant{ "" }, CVariant{ "" }, CGUIDialogYesNo::NO_TIMEOUT)) + if (CGUIDialogYesNo::ShowAndGetInput(20377, 20378, bCanceled)) { m_bRefreshAll = true; CVideoDatabase db; @@ -159,10 +145,6 @@ { Play(); } - else if (iControl == CONTROL_BTN_USERRATING) - { - OnSetUserrating(); - } else if (iControl == CONTROL_BTN_RESUME) { Play(true); @@ -224,17 +206,14 @@ m_bRefresh = false; m_bRefreshAll = true; m_hasUpdatedThumb = false; - m_hasUpdatedUserrating = false; m_bViewReview = true; - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_REFRESH, (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) && !StringUtils::StartsWithNoCase(m_movieItem->GetVideoInfoTag()->m_strIMDBNumber, "xx")); - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_GET_THUMB, (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) && !StringUtils::StartsWithNoCase(m_movieItem->GetVideoInfoTag()->m_strIMDBNumber.c_str() + 2, "plugin")); - // Disable video user rating button for plugins as they don't have tables to save this - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_USERRATING, !m_movieItem->IsPlugin()); + CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_REFRESH, (CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) && !StringUtils::StartsWithNoCase(m_movieItem->GetVideoInfoTag()->m_strIMDBNumber, "xx")); + CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_GET_THUMB, (CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) && !StringUtils::StartsWithNoCase(m_movieItem->GetVideoInfoTag()->m_strIMDBNumber.c_str() + 2, "plugin")); VIDEODB_CONTENT_TYPE type = (VIDEODB_CONTENT_TYPE)m_movieItem->GetVideoContentType(); if (type == VIDEODB_CONTENT_TVSHOWS || type == VIDEODB_CONTENT_MOVIES) - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_GET_FANART, (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) && !StringUtils::StartsWithNoCase(m_movieItem->GetVideoInfoTag()->m_strIMDBNumber.c_str() + 2, "plugin")); + CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_GET_FANART, (CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) && !StringUtils::StartsWithNoCase(m_movieItem->GetVideoInfoTag()->m_strIMDBNumber.c_str() + 2, "plugin")); else CONTROL_DISABLE(CONTROL_BTN_GET_FANART); @@ -245,18 +224,7 @@ bool CGUIDialogVideoInfo::OnAction(const CAction &action) { - int userrating = m_movieItem->GetVideoInfoTag()->m_iUserRating; - if (action.GetID() == ACTION_INCREASE_RATING) - { - SetUserrating(userrating + 1); - return true; - } - else if (action.GetID() == ACTION_DECREASE_RATING) - { - SetUserrating(userrating - 1); - return true; - } - else if (action.GetID() == ACTION_SHOW_INFO) + if (action.GetID() == ACTION_SHOW_INFO) { Close(); return true; @@ -264,31 +232,16 @@ return CGUIDialog::OnAction(action); } -void CGUIDialogVideoInfo::SetUserrating(int userrating) -{ - userrating = std::max(userrating, 0); - userrating = std::min(userrating, 10); - if (userrating != m_movieItem->GetVideoInfoTag()->m_iUserRating) - { - m_movieItem->GetVideoInfoTag()->SetUserrating(userrating); - - // send a message to all windows to tell them to update the fileitem (eg playlistplayer, media windows) - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_ITEM, 0, m_movieItem); - g_windowManager.SendMessage(msg); - } -} - void CGUIDialogVideoInfo::SetMovie(const CFileItem *item) { *m_movieItem = *item; - - // setup cast list + // setup cast list + determine type. We need to do this here as it makes + // sure that content type (among other things) is set correctly for the + // old fixed id labels that we have floating around (they may be using + // content type to determine visibility, so we'll set the wrong label) ClearCastList(); - MediaType type = item->GetVideoInfoTag()->m_type; - - m_startUserrating = m_movieItem->GetVideoInfoTag()->m_iUserRating; - - if (type == MediaTypeMusicVideo) + VIDEODB_CONTENT_TYPE type = (VIDEODB_CONTENT_TYPE)m_movieItem->GetVideoContentType(); + if (type == VIDEODB_CONTENT_MUSICVIDEOS) { // music video CMusicDatabase database; database.Open(); @@ -303,6 +256,7 @@ item->SetIconImage("DefaultArtist.png"); m_castList->Add(item); } + m_castList->SetContent("musicvideos"); } else { // movie/show/episode @@ -311,13 +265,13 @@ CFileItemPtr item(new CFileItem(it->strName)); if (!it->thumb.empty()) item->SetArt("thumb", it->thumb); - else if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_ACTORTHUMBS)) + else if (CSettings::Get().GetBool("videolibrary.actorthumbs")) { // backward compatibility std::string thumb = CScraperUrl::GetThumbURL(it->thumbUrl.GetFirstThumb()); if (!thumb.empty()) { item->SetArt("thumb", thumb); - CTextureCache::GetInstance().BackgroundCacheImage(thumb); + CTextureCache::Get().BackgroundCacheImage(thumb); } } item->SetIconImage("DefaultActor.png"); @@ -325,34 +279,77 @@ item->SetLabel2(it->strRole); m_castList->Add(item); } - } + // determine type: + if (type == VIDEODB_CONTENT_TVSHOWS) + { + m_castList->SetContent("tvshows"); + // special case stuff for shows (not currently retrieved from the library in filemode (ref: GetTvShowInfo vs GetTVShowsByWhere) + m_movieItem->m_dateTime = m_movieItem->GetVideoInfoTag()->m_premiered; + if(m_movieItem->GetVideoInfoTag()->m_iYear == 0 && m_movieItem->m_dateTime.IsValid()) + m_movieItem->GetVideoInfoTag()->m_iYear = m_movieItem->m_dateTime.GetYear(); + if (!m_movieItem->HasProperty("totalepisodes")) + { + m_movieItem->SetProperty("totalepisodes", m_movieItem->GetVideoInfoTag()->m_iEpisode); + m_movieItem->SetProperty("numepisodes", m_movieItem->GetVideoInfoTag()->m_iEpisode); // info view has no concept of current watched/unwatched filter as we could come here from files view, but set for consistency + m_movieItem->SetProperty("watchedepisodes", m_movieItem->GetVideoInfoTag()->m_playCount); + m_movieItem->SetProperty("unwatchedepisodes", m_movieItem->GetVideoInfoTag()->m_iEpisode - m_movieItem->GetVideoInfoTag()->m_playCount); + m_movieItem->GetVideoInfoTag()->m_playCount = (m_movieItem->GetVideoInfoTag()->m_iEpisode == m_movieItem->GetVideoInfoTag()->m_playCount) ? 1 : 0; + } + } + else if (type == VIDEODB_CONTENT_EPISODES) + { + m_castList->SetContent("episodes"); + // special case stuff for episodes (not currently retrieved from the library in filemode (ref: GetEpisodeInfo vs GetEpisodesByWhere) + m_movieItem->m_dateTime = m_movieItem->GetVideoInfoTag()->m_firstAired; + if(m_movieItem->GetVideoInfoTag()->m_iYear == 0 && m_movieItem->m_dateTime.IsValid()) + m_movieItem->GetVideoInfoTag()->m_iYear = m_movieItem->m_dateTime.GetYear(); + // retrieve the season thumb. + // TODO: should we use the thumbloader for this? + CVideoDatabase db; + if (db.Open()) + { + if (m_movieItem->GetVideoInfoTag()->m_iSeason > -1) + { + int seasonID = m_movieItem->GetVideoInfoTag()->m_iIdSeason; + if (seasonID < 0) + seasonID = db.GetSeasonId(m_movieItem->GetVideoInfoTag()->m_iIdShow, + m_movieItem->GetVideoInfoTag()->m_iSeason); + CGUIListItem::ArtMap thumbs; + if (db.GetArtForItem(seasonID, MediaTypeSeason, thumbs)) + { + for (CGUIListItem::ArtMap::iterator i = thumbs.begin(); i != thumbs.end(); ++i) + m_movieItem->SetArt("season." + i->first, i->second); + } + } + db.Close(); + } + } + else if (type == VIDEODB_CONTENT_MOVIES) + { + m_castList->SetContent("movies"); - if (type == MediaTypeMovie) - { - // local trailers should always override non-local, so check - // for a local one if the registered trailer is online - if (m_movieItem->GetVideoInfoTag()->m_strTrailer.empty() || - URIUtils::IsInternetStream(m_movieItem->GetVideoInfoTag()->m_strTrailer)) - { - std::string localTrailer = m_movieItem->FindTrailer(); - if (!localTrailer.empty()) - { - m_movieItem->GetVideoInfoTag()->m_strTrailer = localTrailer; - CVideoDatabase database; - if(database.Open()) + // local trailers should always override non-local, so check + // for a local one if the registered trailer is online + if (m_movieItem->GetVideoInfoTag()->m_strTrailer.empty() || + URIUtils::IsInternetStream(m_movieItem->GetVideoInfoTag()->m_strTrailer)) + { + std::string localTrailer = m_movieItem->FindTrailer(); + if (!localTrailer.empty()) { - database.SetSingleValue(VIDEODB_CONTENT_MOVIES, VIDEODB_ID_TRAILER, - m_movieItem->GetVideoInfoTag()->m_iDbId, - m_movieItem->GetVideoInfoTag()->m_strTrailer); - database.Close(); - CUtil::DeleteVideoDatabaseDirectoryCache(); + m_movieItem->GetVideoInfoTag()->m_strTrailer = localTrailer; + CVideoDatabase database; + if(database.Open()) + { + database.SetSingleValue(VIDEODB_CONTENT_MOVIES, VIDEODB_ID_TRAILER, + m_movieItem->GetVideoInfoTag()->m_iDbId, + m_movieItem->GetVideoInfoTag()->m_strTrailer); + database.Close(); + CUtil::DeleteVideoDatabaseDirectoryCache(); + } } } } } - - m_castList->SetContent(MediaTypes::ToPlural(type)); - CVideoThumbLoader loader; loader.LoadItem(m_movieItem.get()); } @@ -362,7 +359,7 @@ // setup plot text area std::string strTmp = m_movieItem->GetVideoInfoTag()->m_strPlot; if (m_movieItem->GetVideoInfoTag()->m_type != MediaTypeTvShow) - if (m_movieItem->GetVideoInfoTag()->m_playCount == 0 && !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_SHOWUNWATCHEDPLOTS)) + if (m_movieItem->GetVideoInfoTag()->m_playCount == 0 && !CSettings::Get().GetBool("videolibrary.showunwatchedplots")) strTmp = g_localizeStrings.Get(20370); StringUtils::Trim(strTmp); @@ -437,11 +434,11 @@ CGUIDialogProgress *progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); if (progress) { - progress->SetHeading(CVariant{194}); - progress->SetLine(0, CVariant{strSearch}); - progress->SetLine(1, CVariant{""}); - progress->SetLine(2, CVariant{""}); - progress->Open(); + progress->SetHeading(194); + progress->SetLine(0, strSearch); + progress->SetLine(1, ""); + progress->SetLine(2, ""); + progress->StartModal(); progress->Progress(); } CFileItemList items; @@ -454,7 +451,7 @@ { CGUIDialogSelect* pDlgSelect = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDlgSelect->Reset(); - pDlgSelect->SetHeading(CVariant{283}); + pDlgSelect->SetHeading(283); for (int i = 0; i < (int)items.Size(); i++) { @@ -462,7 +459,7 @@ pDlgSelect->Add(pItem->GetLabel()); } - pDlgSelect->Open(); + pDlgSelect->DoModal(); int iItem = pDlgSelect->GetSelectedLabel(); if (iItem < 0) @@ -476,7 +473,7 @@ } else { - CGUIDialogOK::ShowAndGetInput(CVariant{194}, CVariant{284}); + CGUIDialogOK::ShowAndGetInput(194, 284); } } @@ -556,7 +553,7 @@ SetMovie(&item); // refresh our window entirely Close(); - Open(); + DoModal(); } void CGUIDialogVideoInfo::ClearCastList() @@ -589,14 +586,14 @@ else if (!CGUIWindowVideoBase::ShowResumeMenu(movie)) { // The Resume dialog was closed without any choice - Open(); + DoModal(); return; } pWindow->PlayMovie(&movie); } } -std::string CGUIDialogVideoInfo::ChooseArtType(const CFileItem &videoItem, std::map ¤tArt) +string CGUIDialogVideoInfo::ChooseArtType(const CFileItem &videoItem, map ¤tArt) { // prompt for choice CGUIDialogSelect *dialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); @@ -604,7 +601,7 @@ return ""; CFileItemList items; - dialog->SetHeading(CVariant{13511}); + dialog->SetHeading(13511); dialog->Reset(); dialog->SetUseDetails(true); dialog->EnableButton(true, 13516); @@ -612,7 +609,7 @@ CVideoDatabase db; db.Open(); - std::vector artTypes = CVideoThumbLoader::GetArtTypes(videoItem.GetVideoInfoTag()->m_type); + vector artTypes = CVideoThumbLoader::GetArtTypes(videoItem.GetVideoInfoTag()->m_type); // add in any stored art for this item that is non-empty. db.GetArtForItem(videoItem.GetVideoInfoTag()->m_iDbId, videoItem.GetVideoInfoTag()->m_type, currentArt); @@ -623,17 +620,17 @@ } // add any art types that exist for other media items of the same type - std::vector dbArtTypes; + vector dbArtTypes; db.GetArtTypes(videoItem.GetVideoInfoTag()->m_type, dbArtTypes); - for (std::vector::const_iterator it = dbArtTypes.begin(); it != dbArtTypes.end(); ++it) + for (vector::const_iterator it = dbArtTypes.begin(); it != dbArtTypes.end(); ++it) { if (find(artTypes.begin(), artTypes.end(), *it) == artTypes.end()) artTypes.push_back(*it); } - for (std::vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) + for (vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) { - std::string type = *i; + string type = *i; CFileItemPtr item(new CFileItem(type, "false")); item->SetLabel(type); if (videoItem.HasArt(type)) @@ -641,14 +638,14 @@ items.Add(item); } - dialog->SetItems(items); - dialog->Open(); + dialog->SetItems(&items); + dialog->DoModal(); if (dialog->IsButtonPressed()) { // Get the new artwork name std::string strArtworkName; - if (!CGUIKeyboardFactory::ShowAndGetInput(strArtworkName, CVariant{g_localizeStrings.Get(13516)}, false)) + if (!CGUIKeyboardFactory::ShowAndGetInput(strArtworkName, g_localizeStrings.Get(13516), false)) return ""; return strArtworkName; @@ -659,8 +656,8 @@ void CGUIDialogVideoInfo::OnGetArt() { - std::map currentArt; - std::string type = ChooseArtType(*m_movieItem, currentArt); + map currentArt; + string type = ChooseArtType(*m_movieItem, currentArt); if (type.empty()) return; // cancelled @@ -688,7 +685,7 @@ } // Grab the thumbnails from the web - std::vector thumbs; + vector thumbs; int season = (m_movieItem->GetVideoInfoTag()->m_type == MediaTypeSeason) ? m_movieItem->GetVideoInfoTag()->m_iSeason : -1; m_movieItem->GetVideoInfoTag()->m_strPictureURL.GetThumbURLs(thumbs, type, season); @@ -701,7 +698,7 @@ item->SetLabel(g_localizeStrings.Get(13513)); // TODO: Do we need to clear the cached image? - // CTextureCache::GetInstance().ClearCachedImage(thumb); + // CTextureCache::Get().ClearCachedImage(thumb); items.Add(item); } @@ -724,7 +721,7 @@ } std::string result; - VECSOURCES sources(*CMediaSourceSettings::GetInstance().GetSources("video")); + VECSOURCES sources(*CMediaSourceSettings::Get().GetSources("video")); AddItemPathToFileBrowserSources(sources, *m_movieItem); g_mediaManager.GetLocalDrives(sources); if (CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(13511), result) && @@ -797,7 +794,7 @@ item->SetLabel(g_localizeStrings.Get(20441)); // TODO: Do we need to clear the cached image? -// CTextureCache::GetInstance().ClearCachedImage(thumb); +// CTextureCache::Get().ClearCachedImage(thumb); items.Add(item); } @@ -810,7 +807,7 @@ itemLocal->SetLabel(g_localizeStrings.Get(20438)); // TODO: Do we need to clear the cached image? - CTextureCache::GetInstance().ClearCachedImage(strLocal); + CTextureCache::Get().ClearCachedImage(strLocal); items.Add(itemLocal); } else @@ -822,7 +819,7 @@ } std::string result; - VECSOURCES sources(*CMediaSourceSettings::GetInstance().GetSources("video")); + VECSOURCES sources(*CMediaSourceSettings::Get().GetSources("video")); AddItemPathToFileBrowserSources(sources, item); g_mediaManager.GetLocalDrives(sources); bool flip=false; @@ -867,28 +864,6 @@ Update(); } -void CGUIDialogVideoInfo::OnSetUserrating() -{ - CGUIDialogSelect *dialog = (CGUIDialogSelect *)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); - if (dialog) - { - dialog->SetHeading(CVariant{ 38023 }); - dialog->Add(g_localizeStrings.Get(38022)); - for (int i = 1; i <= 10; i++) - dialog->Add(StringUtils::Format("%s: %i", g_localizeStrings.Get(563).c_str(), i)); - - dialog->SetSelected(m_movieItem->GetVideoInfoTag()->m_iUserRating); - - dialog->Open(); - - int iItem = dialog->GetSelectedLabel(); - if (iItem < 0) - return; - - SetUserrating(iItem); - } -} - void CGUIDialogVideoInfo::PlayTrailer() { CFileItem item; @@ -906,13 +881,9 @@ Close(true); if (item.IsPlayList()) - { - CFileItemList *l = new CFileItemList; //don't delete, - l->Add(std::make_shared(item)); - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l)); - } + CApplicationMessenger::Get().MediaPlay(item); else - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast(new CFileItem(item))); + CApplicationMessenger::Get().PlayFile(item); } void CGUIDialogVideoInfo::SetLabel(int iControl, const std::string &strLabel) @@ -971,7 +942,6 @@ CContextButtons buttons; if (type == MediaTypeMovie || type == MediaTypeVideoCollection || type == MediaTypeTvShow || type == MediaTypeEpisode || - (type == MediaTypeSeason && item->GetVideoInfoTag()->m_iSeason > 0) || // seasons without "all seasons" and "specials" type == MediaTypeMusicVideo) buttons.Add(CONTEXT_BUTTON_EDIT, 16105); @@ -1017,10 +987,6 @@ buttons.Add(CONTEXT_BUTTON_MOVIESET_ADD_REMOVE_ITEMS, 20465); } - // seasons - if (item->m_bIsFolder && type == MediaTypeSeason) - buttons.Add(CONTEXT_BUTTON_SET_SEASON_ART, 13511); - // tags if (item->m_bIsFolder && type == "tag") { @@ -1034,10 +1000,9 @@ } } - if (type != MediaTypeSeason) - buttons.Add(CONTEXT_BUTTON_DELETE, 646); + buttons.Add(CONTEXT_BUTTON_DELETE, 646); - CContextMenuManager::GetInstance().AddVisibleItems(item, buttons, CContextMenuManager::MANAGE); + CContextMenuManager::Get().AddVisibleItems(item, buttons, CONTEXT_MENU_GROUP_MANAGE); bool result = false; int button = CGUIDialogContextMenu::ShowAndGetChoice(buttons); @@ -1079,8 +1044,7 @@ break; case CONTEXT_BUTTON_SET_MOVIESET_ART: - case CONTEXT_BUTTON_SET_SEASON_ART: - result = ManageVideoItemArtwork(item, type); + result = ManageVideoItemArtwork(item, MediaTypeVideoCollection); break; case CONTEXT_BUTTON_MOVIESET_ADD_REMOVE_ITEMS: @@ -1097,12 +1061,12 @@ case CONTEXT_BUTTON_MARK_WATCHED: case CONTEXT_BUTTON_MARK_UNWATCHED: - CVideoLibraryQueue::GetInstance().MarkAsWatched(item, (button == (CONTEXT_BUTTON)CONTEXT_BUTTON_MARK_WATCHED)); + CVideoLibraryQueue::Get().MarkAsWatched(item, (button == (CONTEXT_BUTTON)CONTEXT_BUTTON_MARK_WATCHED)); result = true; break; default: - result = CContextMenuManager::GetInstance().OnClick(button, item); + result = CContextMenuManager::Get().Execute(button, item); break; } } @@ -1124,7 +1088,7 @@ // dont allow update while scanning if (g_application.IsVideoScanning()) { - CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{14057}); + CGUIDialogOK::ShowAndGetInput(257, 14057); return false; } @@ -1133,58 +1097,24 @@ return false; int iDbId = pItem->GetVideoInfoTag()->m_iDbId; - MediaType mediaType = pItem->GetVideoInfoTag()->m_type; - CVideoInfoTag detail; - std::string title; - if (mediaType == MediaTypeMovie) - { + VIDEODB_CONTENT_TYPE iType = (VIDEODB_CONTENT_TYPE)pItem->GetVideoContentType(); + if (iType == VIDEODB_CONTENT_MOVIES) database.GetMovieInfo("", detail, iDbId); - title = detail.m_strTitle; - } - else if (mediaType == MediaTypeVideoCollection) - { + else if (iType == VIDEODB_CONTENT_MOVIE_SETS) database.GetSetInfo(iDbId, detail); - title = detail.m_strTitle; - } - else if (mediaType == MediaTypeEpisode) - { + else if (iType == VIDEODB_CONTENT_EPISODES) database.GetEpisodeInfo(pItem->GetPath(), detail, iDbId); - title = detail.m_strTitle; - } - else if (mediaType == MediaTypeSeason) - { - database.GetSeasonInfo(iDbId, detail); - title = detail.m_strSortTitle; - } - else if (mediaType == MediaTypeTvShow) - { + else if (iType == VIDEODB_CONTENT_TVSHOWS) database.GetTvShowInfo(pItem->GetVideoInfoTag()->m_strFileNameAndPath, detail, iDbId); - title = detail.m_strTitle; - } - else if (mediaType == MediaTypeMusicVideo) - { + else if (iType == VIDEODB_CONTENT_MUSICVIDEOS) database.GetMusicVideoInfo(pItem->GetVideoInfoTag()->m_strFileNameAndPath, detail, iDbId); - title = detail.m_strTitle; - } // get the new title - if (!CGUIKeyboardFactory::ShowAndGetInput(title, CVariant{ g_localizeStrings.Get(16105) }, false)) + if (!CGUIKeyboardFactory::ShowAndGetInput(detail.m_strTitle, g_localizeStrings.Get(16105), false)) return false; - if (mediaType == MediaTypeSeason) - { - detail.m_strSortTitle = title; - std::map artwork; - database.SetDetailsForSeason(detail, artwork, detail.m_iIdShow, detail.m_iDbId); - } - else - { - detail.m_strTitle = title; - VIDEODB_CONTENT_TYPE iType = (VIDEODB_CONTENT_TYPE)pItem->GetVideoContentType(); - database.UpdateMovieTitle(iDbId, detail.m_strTitle, iType); - } - + database.UpdateMovieTitle(iDbId, detail.m_strTitle, iType); return true; } @@ -1213,7 +1143,7 @@ // dont allow update while scanning if (g_application.IsVideoScanning()) { - CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{14057}); + CGUIDialogOK::ShowAndGetInput(257, 14057); return false; } @@ -1245,20 +1175,20 @@ return false; } - pDialog->SetHeading(CVariant{heading}); + pDialog->SetHeading(heading); if (unavailable) { - pDialog->SetLine(0, CVariant{g_localizeStrings.Get(662)}); - pDialog->SetLine(1, CVariant{g_localizeStrings.Get(663)}); + pDialog->SetLine(0, g_localizeStrings.Get(662)); + pDialog->SetLine(1, g_localizeStrings.Get(663)); } else { - pDialog->SetLine(0, CVariant{StringUtils::Format(g_localizeStrings.Get(433).c_str(), item->GetLabel().c_str())}); - pDialog->SetLine(1, CVariant{""}); + pDialog->SetLine(0, StringUtils::Format(g_localizeStrings.Get(433).c_str(), item->GetLabel().c_str())); + pDialog->SetLine(1, ""); } - pDialog->SetLine(2, CVariant{""}); - pDialog->Open(); + pDialog->SetLine(2, ""); + pDialog->DoModal(); if (!pDialog->IsConfirmed()) return false; @@ -1302,9 +1232,9 @@ return false; // check if the user is allowed to delete the actual file as well - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_ALLOWFILEDELETION) && - (CProfilesManager::GetInstance().GetCurrentProfile().getLockMode() == LOCK_MODE_EVERYONE || - !CProfilesManager::GetInstance().GetCurrentProfile().filesLocked() || + if (CSettings::Get().GetBool("filelists.allowfiledeletion") && + (CProfilesManager::Get().GetCurrentProfile().getLockMode() == LOCK_MODE_EVERYONE || + !CProfilesManager::Get().GetCurrentProfile().filesLocked() || g_passwordManager.IsMasterLockUnlocked(true))) { std::string strDeletePath = item->GetVideoInfoTag()->GetPath(); @@ -1388,6 +1318,7 @@ if (!videodb.Open()) return false; + std::string strHeading = g_localizeStrings.Get(20457); std::string baseDir = StringUtils::Format("videodb://movies/sets/%d", setItem->GetVideoInfoTag()->m_iDbId); if (!CDirectory::GetDirectory(baseDir, originalMovies) || originalMovies.Size() <= 0) // keep a copy of the original members of the set @@ -1401,13 +1332,13 @@ if (dialog == NULL) return false; - listItems.Sort(SortByLabel, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + listItems.Sort(SortByLabel, SortOrderAscending, CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); dialog->Reset(); dialog->SetMultiSelection(true); - dialog->SetHeading(CVariant{g_localizeStrings.Get(20457)}); - dialog->SetItems(listItems); - std::vector selectedIndices; + dialog->SetHeading(strHeading); + dialog->SetItems(&listItems); + vector selectedIndices; for (int i = 0; i < originalMovies.Size(); i++) { for (int listIndex = 0; listIndex < listItems.Size(); listIndex++) @@ -1421,12 +1352,11 @@ } dialog->SetSelected(selectedIndices); dialog->EnableButton(true, 186); - dialog->Open(); + dialog->DoModal(); if (dialog->IsConfirmed()) { - for (int i : dialog->GetSelectedItems()) - selectedMovies.Add(listItems.Get(i)); + selectedMovies.Copy(dialog->GetSelectedItems()); return (selectedMovies.Size() > 0); } else @@ -1446,7 +1376,7 @@ std::string baseDir = "videodb://movies/sets/"; if (!CDirectory::GetDirectory(baseDir, listItems)) return false; - listItems.Sort(SortByLabel, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + listItems.Sort(SortByLabel, SortOrderAscending, CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); int currentSetId = 0; std::string currentSetLabel; @@ -1475,9 +1405,10 @@ if (dialog == NULL) return false; + std::string strHeading = g_localizeStrings.Get(20466); dialog->Reset(); - dialog->SetHeading(CVariant{g_localizeStrings.Get(20466)}); - dialog->SetItems(listItems); + dialog->SetHeading(strHeading); + dialog->SetItems(&listItems); if (currentSetId >= 0) { for (int listIndex = 0; listIndex < listItems.Size(); listIndex++) @@ -1490,15 +1421,15 @@ } } dialog->EnableButton(true, 20468); // new set via button - dialog->Open(); + dialog->DoModal(); if (dialog->IsButtonPressed()) { // creating new set std::string newSetTitle; - if (!CGUIKeyboardFactory::ShowAndGetInput(newSetTitle, CVariant{g_localizeStrings.Get(20468)}, false)) + if (!CGUIKeyboardFactory::ShowAndGetInput(newSetTitle, g_localizeStrings.Get(20468), false)) return false; int idSet = videodb.AddSet(newSetTitle); - std::map movieArt, setArt; + map movieArt, setArt; if (!videodb.GetArtForItem(idSet, MediaTypeVideoCollection, setArt)) { videodb.GetArtForItem(movieItem->GetVideoInfoTag()->m_iDbId, MediaTypeMovie, movieArt); @@ -1571,7 +1502,7 @@ if (!showAll) videoUrl.AddOption("tagid", idTag); else - filter.where = videodb.PrepareSQL("%s_view.%s NOT IN (SELECT tag_link.media_id FROM tag_link WHERE tag_link.tag_id = %d AND tag_link.media_type = '%s')", type.c_str(), idColumn.c_str(), idTag, type.c_str()); + filter.where = videodb.PrepareSQL("%s_view.%s NOT IN (SELECT tag_link.media_type FROM tag_link WHERE tag_link.tag_id = %d AND tag_link.media_type = '%s')", type.c_str(), idColumn.c_str(), idTag, type.c_str()); } CFileItemList listItems; @@ -1582,17 +1513,16 @@ if (dialog == NULL) return false; - listItems.Sort(SortByLabel, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + listItems.Sort(SortByLabel, SortOrderAscending, CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); dialog->Reset(); dialog->SetMultiSelection(true); - dialog->SetHeading(CVariant{strHeading}); - dialog->SetItems(listItems); + dialog->SetHeading(strHeading); + dialog->SetItems(&listItems); dialog->EnableButton(true, 186); - dialog->Open(); + dialog->DoModal(); - for (int i : dialog->GetSelectedItems()) - items.Add(listItems.Get(i)); + items.Copy(dialog->GetSelectedItems()); return items.Size() > 0; } @@ -1677,7 +1607,7 @@ std::string currentThumb; int idArtist = -1; std::string artistPath; - std::string artType = "thumb"; + string artType = "thumb"; if (type == MediaTypeArtist) { CMusicDatabase musicdb; @@ -1696,7 +1626,7 @@ currentThumb = videodb.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artType); else { // SEASON, SET - std::map currentArt; + map currentArt; artType = ChooseArtType(*item, currentArt); if (artType.empty()) return false; @@ -1721,7 +1651,7 @@ noneitem->SetLabel(g_localizeStrings.Get(13515)); bool local = false; - std::vector thumbs; + vector thumbs; if (type != MediaTypeArtist) { CVideoInfoTag tag; @@ -1759,7 +1689,7 @@ items.Add(item); // TODO: Do we need to clear the cached image? - // CTextureCache::GetInstance().ClearCachedImage(thumbs[i]); + // CTextureCache::Get().ClearCachedImage(thumbs[i]); } if (type == "actor") @@ -1800,7 +1730,7 @@ items.Add(noneitem); std::string result; - VECSOURCES sources=*CMediaSourceSettings::GetInstance().GetSources("video"); + VECSOURCES sources=*CMediaSourceSettings::Get().GetSources("video"); g_mediaManager.GetLocalDrives(sources); AddItemPathToFileBrowserSources(sources, *item); if (!CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(13511), result)) @@ -1858,7 +1788,7 @@ // dont allow update while scanning if (g_application.IsVideoScanning()) { - CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{14057}); + CGUIDialogOK::ShowAndGetInput(257, 14057); return false; } @@ -1881,7 +1811,7 @@ currentTitle = detail.m_strSortTitle; // get the new sort title - if (!CGUIKeyboardFactory::ShowAndGetInput(currentTitle, CVariant{g_localizeStrings.Get(16107)}, false)) + if (!CGUIKeyboardFactory::ShowAndGetInput(currentTitle, g_localizeStrings.Get(16107), false)) return false; return database.UpdateVideoSortTitle(iDbId, currentTitle, iType); @@ -1894,7 +1824,7 @@ CFileItemList list; if (bRemove) { - std::vector ids; + vector ids; if (!database.GetLinksToTvShow(dbId, ids)) return false; @@ -1911,7 +1841,7 @@ database.GetTvShowsNav("videodb://tvshows/titles", list); // remove already linked shows - std::vector ids; + vector ids; if (!database.GetLinksToTvShow(dbId, ids)) return false; @@ -1933,12 +1863,12 @@ int iSelectedLabel = 0; if (list.Size() > 1 || (!bRemove && !list.IsEmpty())) { - list.Sort(SortByLabel, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + list.Sort(SortByLabel, SortOrderAscending, CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); - pDialog->SetItems(list); - pDialog->SetHeading(CVariant{20356}); - pDialog->Open(); + pDialog->SetItems(&list); + pDialog->SetHeading(20356); + pDialog->DoModal(); iSelectedLabel = pDialog->GetSelectedLabel(); } @@ -1971,7 +1901,7 @@ items.Add(itemCurrent); } - std::vector thumbs; + vector thumbs; if (videoItem->GetVideoInfoTag()->m_type == MediaTypeVideoCollection) { CFileItemList movies; @@ -2010,7 +1940,7 @@ } std::string result; - VECSOURCES sources(*CMediaSourceSettings::GetInstance().GetSources("video")); + VECSOURCES sources(*CMediaSourceSettings::Get().GetSources("video")); g_mediaManager.GetLocalDrives(sources); AddItemPathToFileBrowserSources(sources, item); bool flip = false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoInfo.h kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoInfo.h --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoInfo.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoInfo.h 2015-10-19 08:39:17.000000000 +0000 @@ -37,7 +37,6 @@ bool NeedRefresh() const; bool RefreshAll() const; bool HasUpdatedThumb() const { return m_hasUpdatedThumb; }; - bool HasUpdatedUserrating() const { return m_hasUpdatedUserrating; }; std::string GetThumbnail() const; virtual CFileItemPtr GetCurrentListItem(int offset = 0) { return m_movieItem; } @@ -69,7 +68,6 @@ virtual void OnInitWindow(); void Update(); void SetLabel(int iControl, const std::string& strLabel); - void SetUserrating(int userrating); // link cast to movies void ClearCastList(); @@ -79,7 +77,6 @@ void Play(bool resume = false); void OnGetArt(); void OnGetFanart(); - void OnSetUserrating(); void PlayTrailer(); static bool UpdateVideoItemSortTitle(const CFileItemPtr &pItem); @@ -96,6 +93,4 @@ bool m_bRefresh; bool m_bRefreshAll; bool m_hasUpdatedThumb; - bool m_hasUpdatedUserrating; - int m_startUserrating; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoOSD.cpp kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoOSD.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoOSD.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoOSD.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -42,9 +42,8 @@ if (m_autoClosing) { // check for movement of mouse or a submenu open - if (CInputManager::GetInstance().IsMouseActive() + if (CInputManager::Get().IsMouseActive() || g_windowManager.IsWindowActive(WINDOW_DIALOG_AUDIO_OSD_SETTINGS) - || g_windowManager.IsWindowActive(WINDOW_DIALOG_AUDIO_DSP_OSD_SETTINGS) || g_windowManager.IsWindowActive(WINDOW_DIALOG_VIDEO_OSD_SETTINGS) || g_windowManager.IsWindowActive(WINDOW_DIALOG_VIDEO_BOOKMARKS) || g_windowManager.IsWindowActive(WINDOW_DIALOG_PVR_OSD_CHANNELS) @@ -91,17 +90,6 @@ Close(); } break; - case GUI_MSG_WINDOW_DEINIT: // fired when OSD is hidden - { - // Remove our subdialogs if visible - CGUIDialog *pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_AUDIO_DSP_OSD_SETTINGS); - if (pDialog && pDialog->IsDialogRunning()) - pDialog->Close(true); - pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_AUDIO_OSD_SETTINGS); - if (pDialog && pDialog->IsDialogRunning()) - pDialog->Close(true); - } - break; } return CGUIDialog::OnMessage(message); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoOverlay.cpp kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoOverlay.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoOverlay.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoOverlay.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "GUIDialogVideoOverlay.h" +#include "guilib/GUIWindowManager.h" + +#define CONTROL_PLAYTIME 2 +#define CONTROL_PLAY_LOGO 3 +#define CONTROL_PAUSE_LOGO 4 +#define CONTROL_INFO 5 +#define CONTROL_BIG_PLAYTIME 6 +#define CONTROL_FF_LOGO 7 +#define CONTROL_RW_LOGO 8 + + +CGUIDialogVideoOverlay::CGUIDialogVideoOverlay() + : CGUIDialog(WINDOW_DIALOG_VIDEO_OVERLAY, "VideoOverlay.xml") +{ + m_renderOrder = 0; + m_loadType = KEEP_IN_MEMORY; +} + +CGUIDialogVideoOverlay::~CGUIDialogVideoOverlay() +{} + +void CGUIDialogVideoOverlay::FrameMove() +{ + if (g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO) + { // close immediately + Close(true); + return; + } + CGUIDialog::FrameMove(); +} + +EVENT_RESULT CGUIDialogVideoOverlay::OnMouseEvent(const CPoint &point, const CMouseEvent &event) +{ + return EVENT_RESULT_UNHANDLED; +} + +void CGUIDialogVideoOverlay::SetDefaults() +{ + CGUIDialog::SetDefaults(); + m_renderOrder = 0; + SetVisibleCondition("skin.hasvideooverlay"); +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoOverlay.h kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoOverlay.h --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoOverlay.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoOverlay.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,34 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "guilib/GUIDialog.h" + +class CGUIDialogVideoOverlay: public CGUIDialog +{ +public: + CGUIDialogVideoOverlay(void); + virtual ~CGUIDialogVideoOverlay(void); + virtual void FrameMove(); +protected: + virtual EVENT_RESULT OnMouseEvent(const CPoint &point, const CMouseEvent &event); + virtual void SetDefaults(); +}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/GUIDialogVideoSettings.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/GUIDialogVideoSettings.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,28 +18,23 @@ * */ +#include "system.h" #include "GUIDialogVideoSettings.h" - -#include - +#include "GUIPassword.h" #include "addons/Skin.h" +#ifdef HAS_VIDEO_PLAYBACK +#include "cores/VideoRenderers/RenderManager.h" +#endif #include "dialogs/GUIDialogYesNo.h" #include "guilib/GUIWindowManager.h" -#include "GUIPassword.h" #include "profiles/ProfilesManager.h" -#include "settings/lib/Setting.h" -#include "settings/lib/SettingsManager.h" #include "settings/MediaSettings.h" #include "settings/Settings.h" -#include "system.h" +#include "settings/lib/Setting.h" +#include "settings/lib/SettingsManager.h" #include "utils/log.h" -#include "utils/Variant.h" #include "video/VideoDatabase.h" -#ifdef HAS_VIDEO_PLAYBACK -#include "cores/VideoRenderers/RenderManager.h" -#endif - #define SETTING_VIDEO_VIEW_MODE "video.viewmode" #define SETTING_VIDEO_ZOOM "video.zoom" #define SETTING_VIDEO_PIXEL_RATIO "video.pixelratio" @@ -63,6 +58,8 @@ #define SETTING_VIDEO_MAKE_DEFAULT "video.save" #define SETTING_VIDEO_CALIBRATION "video.calibration" +using namespace std; + CGUIDialogVideoSettings::CGUIDialogVideoSettings() : CGUIDialogSettingsManualBase(WINDOW_DIALOG_VIDEO_OSD_SETTINGS, "VideoOSDSettings.xml"), m_viewModeChanged(false) @@ -78,7 +75,7 @@ CGUIDialogSettingsManualBase::OnSettingChanged(setting); - CVideoSettings &videoSettings = CMediaSettings::GetInstance().GetCurrentVideoSettings(); + CVideoSettings &videoSettings = CMediaSettings::Get().GetCurrentVideoSettings(); const std::string &settingId = setting->GetId(); if (settingId == SETTING_VIDEO_DEINTERLACEMODE) @@ -155,8 +152,8 @@ if (settingId == SETTING_VIDEO_CALIBRATION) { // launch calibration window - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && - g_passwordManager.CheckSettingLevelLock(CSettings::GetInstance().GetSetting(CSettings::SETTING_VIDEOSCREEN_GUICALIBRATION)->GetLevel())) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && + g_passwordManager.CheckSettingLevelLock(CSettings::Get().GetSetting("videoscreen.guicalibration")->GetLevel())) return; g_windowManager.ForceActivateWindow(WINDOW_SCREEN_CALIBRATION); } @@ -167,12 +164,12 @@ void CGUIDialogVideoSettings::Save() { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.CheckSettingLevelLock(::SettingLevelExpert)) return; // prompt user if they are sure - if (CGUIDialogYesNo::ShowAndGetInput(CVariant(12376), CVariant(12377))) + if (CGUIDialogYesNo::ShowAndGetInput(12376, 12377)) { // reset the settings CVideoDatabase db; if (!db.Open()) @@ -180,10 +177,10 @@ db.EraseVideoSettings(); db.Close(); - CMediaSettings::GetInstance().GetDefaultVideoSettings() = CMediaSettings::GetInstance().GetCurrentVideoSettings(); - CMediaSettings::GetInstance().GetDefaultVideoSettings().m_SubtitleStream = -1; - CMediaSettings::GetInstance().GetDefaultVideoSettings().m_AudioStream = -1; - CSettings::GetInstance().Save(); + CMediaSettings::Get().GetDefaultVideoSettings() = CMediaSettings::Get().GetCurrentVideoSettings(); + CMediaSettings::Get().GetDefaultVideoSettings().m_SubtitleStream = -1; + CMediaSettings::Get().GetDefaultVideoSettings().m_AudioStream = -1; + CSettings::Get().Save(); } } @@ -233,47 +230,47 @@ bool usePopup = g_SkinInfo->HasSkinFile("DialogSlider.xml"); - CVideoSettings &videoSettings = CMediaSettings::GetInstance().GetCurrentVideoSettings(); + CVideoSettings &videoSettings = CMediaSettings::Get().GetCurrentVideoSettings(); StaticIntegerSettingOptions entries; if (g_renderManager.Supports(VS_DEINTERLACEMODE_OFF)) - entries.push_back(std::make_pair(16039, VS_DEINTERLACEMODE_OFF)); + entries.push_back(make_pair(16039, VS_DEINTERLACEMODE_OFF)); if (g_renderManager.Supports(VS_DEINTERLACEMODE_AUTO)) - entries.push_back(std::make_pair(16040, VS_DEINTERLACEMODE_AUTO)); + entries.push_back(make_pair(16040, VS_DEINTERLACEMODE_AUTO)); if (g_renderManager.Supports(VS_DEINTERLACEMODE_FORCE)) - entries.push_back(std::make_pair(16041, VS_DEINTERLACEMODE_FORCE)); + entries.push_back(make_pair(16041, VS_DEINTERLACEMODE_FORCE)); if (!entries.empty()) AddSpinner(groupVideo, SETTING_VIDEO_DEINTERLACEMODE, 16037, 0, static_cast(videoSettings.m_DeinterlaceMode), entries); entries.clear(); - entries.push_back(std::make_pair(16019, VS_INTERLACEMETHOD_AUTO)); - entries.push_back(std::make_pair(20131, VS_INTERLACEMETHOD_RENDER_BLEND)); - entries.push_back(std::make_pair(20130, VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED)); - entries.push_back(std::make_pair(20129, VS_INTERLACEMETHOD_RENDER_WEAVE)); - entries.push_back(std::make_pair(16022, VS_INTERLACEMETHOD_RENDER_BOB_INVERTED)); - entries.push_back(std::make_pair(16021, VS_INTERLACEMETHOD_RENDER_BOB)); - entries.push_back(std::make_pair(16020, VS_INTERLACEMETHOD_DEINTERLACE)); - entries.push_back(std::make_pair(16036, VS_INTERLACEMETHOD_DEINTERLACE_HALF)); - entries.push_back(std::make_pair(16324, VS_INTERLACEMETHOD_SW_BLEND)); - entries.push_back(std::make_pair(16314, VS_INTERLACEMETHOD_INVERSE_TELECINE)); - entries.push_back(std::make_pair(16311, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL)); - entries.push_back(std::make_pair(16310, VS_INTERLACEMETHOD_VDPAU_TEMPORAL)); - entries.push_back(std::make_pair(16325, VS_INTERLACEMETHOD_VDPAU_BOB)); - entries.push_back(std::make_pair(16318, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF)); - entries.push_back(std::make_pair(16317, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF)); - entries.push_back(std::make_pair(16314, VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE)); - entries.push_back(std::make_pair(16320, VS_INTERLACEMETHOD_DXVA_BOB)); - entries.push_back(std::make_pair(16321, VS_INTERLACEMETHOD_DXVA_BEST)); - entries.push_back(std::make_pair(16325, VS_INTERLACEMETHOD_AUTO_ION)); - entries.push_back(std::make_pair(16327, VS_INTERLACEMETHOD_VAAPI_BOB)); - entries.push_back(std::make_pair(16328, VS_INTERLACEMETHOD_VAAPI_MADI)); - entries.push_back(std::make_pair(16329, VS_INTERLACEMETHOD_VAAPI_MACI)); - entries.push_back(std::make_pair(16330, VS_INTERLACEMETHOD_MMAL_ADVANCED)); - entries.push_back(std::make_pair(16331, VS_INTERLACEMETHOD_MMAL_ADVANCED_HALF)); - entries.push_back(std::make_pair(16332, VS_INTERLACEMETHOD_MMAL_BOB)); - entries.push_back(std::make_pair(16333, VS_INTERLACEMETHOD_MMAL_BOB_HALF)); - entries.push_back(std::make_pair(16334, VS_INTERLACEMETHOD_IMX_FASTMOTION)); - entries.push_back(std::make_pair(16335, VS_INTERLACEMETHOD_IMX_FASTMOTION_DOUBLE)); + entries.push_back(make_pair(16019, VS_INTERLACEMETHOD_AUTO)); + entries.push_back(make_pair(20131, VS_INTERLACEMETHOD_RENDER_BLEND)); + entries.push_back(make_pair(20130, VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED)); + entries.push_back(make_pair(20129, VS_INTERLACEMETHOD_RENDER_WEAVE)); + entries.push_back(make_pair(16022, VS_INTERLACEMETHOD_RENDER_BOB_INVERTED)); + entries.push_back(make_pair(16021, VS_INTERLACEMETHOD_RENDER_BOB)); + entries.push_back(make_pair(16020, VS_INTERLACEMETHOD_DEINTERLACE)); + entries.push_back(make_pair(16036, VS_INTERLACEMETHOD_DEINTERLACE_HALF)); + entries.push_back(make_pair(16324, VS_INTERLACEMETHOD_SW_BLEND)); + entries.push_back(make_pair(16314, VS_INTERLACEMETHOD_INVERSE_TELECINE)); + entries.push_back(make_pair(16311, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL)); + entries.push_back(make_pair(16310, VS_INTERLACEMETHOD_VDPAU_TEMPORAL)); + entries.push_back(make_pair(16325, VS_INTERLACEMETHOD_VDPAU_BOB)); + entries.push_back(make_pair(16318, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF)); + entries.push_back(make_pair(16317, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF)); + entries.push_back(make_pair(16314, VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE)); + entries.push_back(make_pair(16320, VS_INTERLACEMETHOD_DXVA_BOB)); + entries.push_back(make_pair(16321, VS_INTERLACEMETHOD_DXVA_BEST)); + entries.push_back(make_pair(16325, VS_INTERLACEMETHOD_AUTO_ION)); + entries.push_back(make_pair(16327, VS_INTERLACEMETHOD_VAAPI_BOB)); + entries.push_back(make_pair(16328, VS_INTERLACEMETHOD_VAAPI_MADI)); + entries.push_back(make_pair(16329, VS_INTERLACEMETHOD_VAAPI_MACI)); + entries.push_back(make_pair(16330, VS_INTERLACEMETHOD_MMAL_ADVANCED)); + entries.push_back(make_pair(16331, VS_INTERLACEMETHOD_MMAL_ADVANCED_HALF)); + entries.push_back(make_pair(16332, VS_INTERLACEMETHOD_MMAL_BOB)); + entries.push_back(make_pair(16333, VS_INTERLACEMETHOD_MMAL_BOB_HALF)); + entries.push_back(make_pair(16334, VS_INTERLACEMETHOD_IMX_FASTMOTION)); + entries.push_back(make_pair(16335, VS_INTERLACEMETHOD_IMX_FASTMOTION_DOUBLE)); /* remove unsupported methods */ for (StaticIntegerSettingOptions::iterator it = entries.begin(); it != entries.end(); ) @@ -297,22 +294,22 @@ } entries.clear(); - entries.push_back(std::make_pair(16301, VS_SCALINGMETHOD_NEAREST)); - entries.push_back(std::make_pair(16302, VS_SCALINGMETHOD_LINEAR)); - entries.push_back(std::make_pair(16303, VS_SCALINGMETHOD_CUBIC )); - entries.push_back(std::make_pair(16304, VS_SCALINGMETHOD_LANCZOS2)); - entries.push_back(std::make_pair(16323, VS_SCALINGMETHOD_SPLINE36_FAST)); - entries.push_back(std::make_pair(16315, VS_SCALINGMETHOD_LANCZOS3_FAST)); - entries.push_back(std::make_pair(16322, VS_SCALINGMETHOD_SPLINE36)); - entries.push_back(std::make_pair(16305, VS_SCALINGMETHOD_LANCZOS3)); - entries.push_back(std::make_pair(16306, VS_SCALINGMETHOD_SINC8)); + entries.push_back(make_pair(16301, VS_SCALINGMETHOD_NEAREST)); + entries.push_back(make_pair(16302, VS_SCALINGMETHOD_LINEAR)); + entries.push_back(make_pair(16303, VS_SCALINGMETHOD_CUBIC )); + entries.push_back(make_pair(16304, VS_SCALINGMETHOD_LANCZOS2)); + entries.push_back(make_pair(16323, VS_SCALINGMETHOD_SPLINE36_FAST)); + entries.push_back(make_pair(16315, VS_SCALINGMETHOD_LANCZOS3_FAST)); + entries.push_back(make_pair(16322, VS_SCALINGMETHOD_SPLINE36)); + entries.push_back(make_pair(16305, VS_SCALINGMETHOD_LANCZOS3)); + entries.push_back(make_pair(16306, VS_SCALINGMETHOD_SINC8)); // entries.push_back(make_pair(?????, VS_SCALINGMETHOD_NEDI)); - entries.push_back(std::make_pair(16307, VS_SCALINGMETHOD_BICUBIC_SOFTWARE)); - entries.push_back(std::make_pair(16308, VS_SCALINGMETHOD_LANCZOS_SOFTWARE)); - entries.push_back(std::make_pair(16309, VS_SCALINGMETHOD_SINC_SOFTWARE)); - entries.push_back(std::make_pair(13120, VS_SCALINGMETHOD_VDPAU_HARDWARE)); - entries.push_back(std::make_pair(16319, VS_SCALINGMETHOD_DXVA_HARDWARE)); - entries.push_back(std::make_pair(16316, VS_SCALINGMETHOD_AUTO)); + entries.push_back(make_pair(16307, VS_SCALINGMETHOD_BICUBIC_SOFTWARE)); + entries.push_back(make_pair(16308, VS_SCALINGMETHOD_LANCZOS_SOFTWARE)); + entries.push_back(make_pair(16309, VS_SCALINGMETHOD_SINC_SOFTWARE)); + entries.push_back(make_pair(13120, VS_SCALINGMETHOD_VDPAU_HARDWARE)); + entries.push_back(make_pair(16319, VS_SCALINGMETHOD_DXVA_HARDWARE)); + entries.push_back(make_pair(16316, VS_SCALINGMETHOD_AUTO)); /* remove unsupported methods */ for(StaticIntegerSettingOptions::iterator it = entries.begin(); it != entries.end(); ) @@ -330,7 +327,7 @@ { entries.clear(); for (int i = 0; i < 7; ++i) - entries.push_back(std::make_pair(630 + i, i)); + entries.push_back(make_pair(630 + i, i)); AddSpinner(groupVideo, SETTING_VIDEO_VIEW_MODE, 629, 0, videoSettings.m_ViewMode, entries); } if (g_renderManager.Supports(RENDERFEATURE_ZOOM)) @@ -357,9 +354,9 @@ // stereoscopic settings entries.clear(); - entries.push_back(std::make_pair(16316, RENDER_STEREO_MODE_OFF)); - entries.push_back(std::make_pair(36503, RENDER_STEREO_MODE_SPLIT_HORIZONTAL)); - entries.push_back(std::make_pair(36504, RENDER_STEREO_MODE_SPLIT_VERTICAL)); + entries.push_back(make_pair(16316, RENDER_STEREO_MODE_OFF)); + entries.push_back(make_pair(36503, RENDER_STEREO_MODE_SPLIT_HORIZONTAL)); + entries.push_back(make_pair(36504, RENDER_STEREO_MODE_SPLIT_VERTICAL)); AddSpinner(groupStereoscopic, SETTING_VIDEO_STEREOSCOPICMODE , 36535, 0, videoSettings.m_StereoMode, entries); AddToggle(groupStereoscopic, SETTING_VIDEO_STEREOSCOPICINVERT, 36536, 0, videoSettings.m_StereoInvert); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/Makefile kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/video/dialogs/Makefile 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/dialogs/Makefile 2015-10-19 08:39:17.000000000 +0000 @@ -1,10 +1,12 @@ SRCS=GUIDialogAudioSubtitleSettings.cpp \ + GUIDialogFileStacking.cpp \ GUIDialogFullScreenInfo.cpp \ GUIDialogSubtitles.cpp \ GUIDialogTeletext.cpp \ GUIDialogVideoBookmarks.cpp \ GUIDialogVideoInfo.cpp \ GUIDialogVideoOSD.cpp \ + GUIDialogVideoOverlay.cpp \ GUIDialogVideoSettings.cpp \ LIB=videodialogs.a diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/FFmpegVideoDecoder.cpp kodi-15.2~git20151019.1039-final/xbmc/video/FFmpegVideoDecoder.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/FFmpegVideoDecoder.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/FFmpegVideoDecoder.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -79,12 +79,8 @@ double FFmpegVideoDecoder::getDuration() const { - if (m_pFormatCtx) - { - double duration = static_cast(m_pFormatCtx->duration) / AV_TIME_BASE; - if (duration > 0.0) - return duration; - } + if ( m_pFormatCtx && m_pFormatCtx->duration / AV_TIME_BASE > 0.0 ) + return m_pFormatCtx->duration / AV_TIME_BASE; return 0.0; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/GUIViewStateVideo.cpp kodi-15.2~git20151019.1039-final/xbmc/video/GUIViewStateVideo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/GUIViewStateVideo.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/GUIViewStateVideo.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -30,7 +30,6 @@ #include "FileItem.h" #include "guilib/WindowIDs.h" #include "view/ViewStateSettings.h" -#include "utils/SortUtils.h" using namespace XFILE; using namespace VIDEODATABASEDIRECTORY; @@ -71,12 +70,12 @@ else { AddSortMethod(SortByLabel, 551, LABEL_MASKS("%L", "%I", "%L", ""), // Label, Size | Label, empty - CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); AddSortMethod(SortBySize, 553, LABEL_MASKS("%L", "%I", "%L", "%I")); // Label, Size | Label, Size AddSortMethod(SortByDate, 552, LABEL_MASKS("%L", "%J", "%L", "%J")); // Label, Date | Label, Date AddSortMethod(SortByFile, 561, LABEL_MASKS("%L", "%I", "%L", "")); // Label, Size | Label, empty - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videofiles"); + const CViewState *viewState = CViewStateSettings::Get().Get("videofiles"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -86,12 +85,12 @@ void CGUIViewStateWindowVideoFiles::SaveViewState() { - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_FILES, CViewStateSettings::GetInstance().Get("videofiles")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_FILES, CViewStateSettings::Get().Get("videofiles")); } VECSOURCES& CGUIViewStateWindowVideoFiles::GetSources() { - VECSOURCES *videoSources = CMediaSourceSettings::GetInstance().GetSources("video"); + VECSOURCES *videoSources = CMediaSourceSettings::Get().GetSources("video"); AddOrReplace(*videoSources, CGUIViewStateWindowVideo::GetSources()); return *videoSources; } @@ -99,7 +98,7 @@ CGUIViewStateWindowVideoNav::CGUIViewStateWindowVideoNav(const CFileItemList& items) : CGUIViewStateWindowVideo(items) { SortAttribute sortAttributes = SortAttributeNone; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) + if (CSettings::Get().GetBool("filelists.ignorethewhensorting")) sortAttributes = SortAttributeIgnoreArticle; if (items.IsVirtualDirectoryRoot()) @@ -139,7 +138,7 @@ AddSortMethod(SortByLabel, 551, LABEL_MASKS("%T", "%R", "%L", "")); // Title, Rating | Label, empty SetSortMethod(SortByLabel); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavactors"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavactors"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } @@ -149,7 +148,7 @@ AddSortMethod(SortByLabel, 562, LABEL_MASKS("%T", "%R", "%L", "")); // Title, Rating | Label, empty SetSortMethod(SortByLabel); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavyears"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavyears"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } @@ -159,7 +158,7 @@ AddSortMethod(SortBySortTitle, 556, LABEL_MASKS("%L", "","%L","")); // Label, empty | Label, empty SetSortMethod(SortBySortTitle); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavseasons"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavseasons"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } @@ -172,10 +171,9 @@ AddSortMethod(SortByLastPlayed, 568, LABEL_MASKS("%T", "%p", "%T", "%p")); // Title, #Last played | Title, #Last played AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T", "%a", "%T", "%a")); // Title, DateAdded | Title, DateAdded AddSortMethod(SortByYear, 562, LABEL_MASKS("%L","%Y","%L","%Y")); // Label, Year | Label, Year - AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%T", "%r", "%T", "%r")); // Title, Userrating | Title, Userrating SetSortMethod(SortByLabel); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavtvshows"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavtvshows"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } @@ -188,7 +186,7 @@ AddSortMethod(SortByLabel, 551, LABEL_MASKS("%T", "%R", "%L", "")); // Title, Rating | Label, empty SetSortMethod(SortByLabel); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavgenres"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavgenres"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } @@ -201,12 +199,12 @@ AddSortMethod(SortByRating, 563, LABEL_MASKS("%T", "%R", "%T", "%R")); // Title, Rating | Title, Rating AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T", "%a", "%T", "%a")); // Title, DateAdded | Title, DateAdded - if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) + if (CMediaSettings::Get().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T", "%V", "%T", "%V")); // Title, Playcount | Title, Playcount SetSortMethod(SortByLabel); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavgenres"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavgenres"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } @@ -216,7 +214,7 @@ AddSortMethod(SortByLabel, sortAttributes, 551, LABEL_MASKS("%T","", "%T","")); // Title, empty | Title, empty SetSortMethod(SortByLabel); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavgenres"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavgenres"); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); } @@ -227,29 +225,27 @@ { AddSortMethod(SortByEpisodeNumber, 20359, LABEL_MASKS("%E. %T","%R")); // Episode. Title, Rating | empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%E. %T", "%R")); // Episode. Title, Rating | empty, empty - AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%E. %T", "%r")); // Episode. Title, Userrating | empty, empty AddSortMethod(SortByMPAA, 20074, LABEL_MASKS("%E. %T", "%O")); // Episode. Title, MPAA | empty, empty AddSortMethod(SortByProductionCode, 20368, LABEL_MASKS("%E. %T","%P", "%E. %T","%P")); // Episode. Title, ProductionCode | Episode. Title, ProductionCode AddSortMethod(SortByDate, 552, LABEL_MASKS("%E. %T","%J","%E. %T","%J")); // Episode. Title, Date | Episode. Title, Date - if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) + if (CMediaSettings::Get().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%E. %T", "%V")); // Episode. Title, Playcount | empty, empty } else { AddSortMethod(SortByEpisodeNumber, 20359, LABEL_MASKS("%H. %T","%R")); // Order. Title, Rating | emtpy, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%H. %T", "%R")); // Order. Title, Rating | emtpy, empty - AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%H. %T", "%r")); // Order. Title, Userrating | emtpy, empty AddSortMethod(SortByMPAA, 20074, LABEL_MASKS("%H. %T", "%O")); // Order. Title, MPAA | emtpy, empty AddSortMethod(SortByProductionCode, 20368, LABEL_MASKS("%H. %T","%P", "%H. %T","%P")); // Order. Title, ProductionCode | Episode. Title, ProductionCode AddSortMethod(SortByDate, 552, LABEL_MASKS("%H. %T","%J","%H. %T","%J")); // Order. Title, Date | Episode. Title, Date - if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) + if (CMediaSettings::Get().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%H. %T", "%V")); // Order. Title, Playcount | empty, empty } AddSortMethod(SortByLabel, sortAttributes, 551, LABEL_MASKS("%T","%R")); // Title, Rating | empty, empty - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavepisodes"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavepisodes"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -260,7 +256,7 @@ AddSortMethod(SortByNone, 552, LABEL_MASKS("%Z - %H. %T", "%R")); // TvShow - Order. Title, Rating | empty, empty SetSortMethod(SortByNone); - SetViewAsControl(CViewStateSettings::GetInstance().Get("videonavepisodes")->m_viewMode); + SetViewAsControl(CViewStateSettings::Get().Get("videonavepisodes")->m_viewMode); SetSortOrder(SortOrderNone); break; @@ -278,15 +274,14 @@ AddSortMethod(SortByYear, 562, LABEL_MASKS("%T", "%Y", "%T", "%Y")); // Title, Year | Title, Year } AddSortMethod(SortByRating, 563, LABEL_MASKS("%T", "%R", "%T", "%R")); // Title, Rating | Title, Rating - AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%T", "%r", "%T", "%r")); // Title, Userrating | Title, Userrating AddSortMethod(SortByMPAA, 20074, LABEL_MASKS("%T", "%O")); // Title, MPAA | empty, empty AddSortMethod(SortByTime, 180, LABEL_MASKS("%T", "%D")); // Title, Duration | empty, empty AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T", "%a", "%T", "%a")); // Title, DateAdded | Title, DateAdded - if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) + if (CMediaSettings::Get().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T", "%V", "%T", "%V")); // Title, Playcount | Title, Playcount - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavtitles"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavtitles"); if (params.GetSetId() > -1) { SetSortMethod(SortByYear); @@ -309,13 +304,14 @@ AddSortMethod(SortByArtist, sortAttributes, 557, LABEL_MASKS("%A - %T", "%Y")); // Artist - Title, Year | empty, empty AddSortMethod(SortByAlbum, sortAttributes, 558, LABEL_MASKS("%B - %T", "%Y")); // Album - Title, Year | empty, empty - if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) + if (CMediaSettings::Get().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T", "%V")); // Title, Playcount | empty, empty - std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrack, "%N")); // Userdefined, Track Number | empty, empty + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.trackformatright"); + AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined | empty, empty - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavmusicvideos"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavmusicvideos"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -326,7 +322,7 @@ AddSortMethod(SortByNone, 552, LABEL_MASKS("%T", "%R")); // Title, Rating | empty, empty SetSortMethod(SortByNone); - SetViewAsControl(CViewStateSettings::GetInstance().Get("videonavtitles")->m_viewMode); + SetViewAsControl(CViewStateSettings::Get().Get("videonavtitles")->m_viewMode); SetSortOrder(SortOrderNone); } @@ -336,7 +332,7 @@ AddSortMethod(SortByNone, 552, LABEL_MASKS("%A - %T", "%Y")); // Artist - Title, Year | empty, empty SetSortMethod(SortByNone); - SetViewAsControl(CViewStateSettings::GetInstance().Get("videonavmusicvideos")->m_viewMode); + SetViewAsControl(CViewStateSettings::Get().Get("videonavmusicvideos")->m_viewMode); SetSortOrder(SortOrderNone); } @@ -352,7 +348,7 @@ AddSortMethod(SortByDate, 552, LABEL_MASKS("%L", "%J", "%L", "%J")); // Label, Date | Label, Date AddSortMethod(SortByFile, 561, LABEL_MASKS("%L", "%I", "%L", "")); // Label, Size | Label, empty - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videofiles"); + const CViewState *viewState = CViewStateSettings::Get().Get("videofiles"); SetSortMethod(viewState->m_sortDescription); SetViewAsControl(viewState->m_viewMode); SetSortOrder(viewState->m_sortDescription.sortOrder); @@ -370,28 +366,28 @@ switch (NodeType) { case NODE_TYPE_ACTOR: - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavactors")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavactors")); break; case NODE_TYPE_YEAR: - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavyears")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavyears")); break; case NODE_TYPE_GENRE: - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavgenres")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavgenres")); break; case NODE_TYPE_TITLE_MOVIES: - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, params.GetSetId() > -1 ? NULL : CViewStateSettings::GetInstance().Get("videonavtitles")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, params.GetSetId() > -1 ? NULL : CViewStateSettings::Get().Get("videonavtitles")); break; case NODE_TYPE_EPISODES: - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavepisodes")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavepisodes")); break; case NODE_TYPE_TITLE_TVSHOWS: - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavtvshows")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavtvshows")); break; case NODE_TYPE_SEASONS: - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavseasons")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavseasons")); break; case NODE_TYPE_TITLE_MUSICVIDEOS: - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavmusicvideos")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavmusicvideos")); break; default: SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV); @@ -400,7 +396,7 @@ } else { - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videofiles")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videofiles")); } } @@ -409,7 +405,7 @@ // Setup shares we want to have m_sources.clear(); CFileItemList items; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) + if (CSettings::Get().GetBool("myvideos.flatten")) CDirectory::GetDirectory("library://video_flat/", items, ""); else CDirectory::GetDirectory("library://video/", items, ""); @@ -431,9 +427,9 @@ CQueryParams params; CVideoDatabaseDirectory::GetQueryParams(m_items.GetPath(),params); if (params.GetContentType() == VIDEODB_CONTENT_MUSICVIDEOS || params.GetContentType() == 6) // recently added musicvideos - return CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICPLAYER_AUTOPLAYNEXTITEM); + return CSettings::Get().GetBool("musicplayer.autoplaynextitem"); - return CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_AUTOPLAYNEXTITEM); + return CSettings::Get().GetBool("videoplayer.autoplaynextitem"); } CGUIViewStateWindowVideoPlaylist::CGUIViewStateWindowVideoPlaylist(const CFileItemList& items) : CGUIViewStateWindowVideo(items) @@ -479,18 +475,17 @@ CGUIViewStateVideoMovies::CGUIViewStateVideoMovies(const CFileItemList& items) : CGUIViewStateWindowVideo(items) { AddSortMethod(SortBySortTitle, 556, LABEL_MASKS("%T", "%R", "%T", "%R"), // Title, Rating | Title, Rating - CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); AddSortMethod(SortByYear, 562, LABEL_MASKS("%T", "%Y", "%T", "%Y")); // Title, Year | Title, Year AddSortMethod(SortByRating, 563, LABEL_MASKS("%T", "%R", "%T", "%R")); // Title, Rating | Title, Rating - AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%T", "%r", "%T", "%r")); // Title, Userrating | Title, Userrating AddSortMethod(SortByMPAA, 20074, LABEL_MASKS("%T", "%O")); // Title, MPAA | empty, empty AddSortMethod(SortByTime, 180, LABEL_MASKS("%T", "%D")); // Title, Duration | empty, empty AddSortMethod(SortByDateAdded, 570, LABEL_MASKS("%T", "%a", "%T", "%a")); // Title, DateAdded | Title, DateAdded - if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) + if (CMediaSettings::Get().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T", "%V", "%T", "%V")); // Title, Playcount | Title, Playcount - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavtitles"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavtitles"); if (items.IsSmartPlayList() || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS("%T", "%R", "%T", "%R")); // Title, Rating | Title, Rating else @@ -506,13 +501,13 @@ void CGUIViewStateVideoMovies::SaveViewState() { - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavtitles")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavtitles")); } CGUIViewStateVideoMusicVideos::CGUIViewStateVideoMusicVideos(const CFileItemList& items) : CGUIViewStateWindowVideo(items) { SortAttribute sortAttributes = SortAttributeNone; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING)) + if (CSettings::Get().GetBool("filelists.ignorethewhensorting")) sortAttributes = SortAttributeIgnoreArticle; AddSortMethod(SortByLabel, sortAttributes, 551, LABEL_MASKS("%T", "%Y")); // Title, Year | empty, empty @@ -521,13 +516,14 @@ AddSortMethod(SortByArtist, sortAttributes, 557, LABEL_MASKS("%A - %T", "%Y")); // Artist - Title, Year | empty, empty AddSortMethod(SortByAlbum, sortAttributes, 558, LABEL_MASKS("%B - %T", "%Y")); // Album - Title, Year | empty, empty - if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) + if (CMediaSettings::Get().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%T", "%V")); // Title, Playcount | empty, empty - std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT); - AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrack, "%N")); // Userdefined, Track Number | empty, empty + std::string strTrackLeft=CSettings::Get().GetString("musicfiles.trackformat"); + std::string strTrackRight=CSettings::Get().GetString("musicfiles.trackformatright"); + AddSortMethod(SortByTrackNumber, 554, LABEL_MASKS(strTrackLeft, strTrackRight)); // Userdefined, Userdefined | empty, empty - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavmusicvideos"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavmusicvideos"); if (items.IsSmartPlayList() || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS("%A - %T", "%Y")); // Artist - Title, Year | empty, empty else @@ -543,20 +539,19 @@ void CGUIViewStateVideoMusicVideos::SaveViewState() { - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavmusicvideos")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavmusicvideos")); } CGUIViewStateVideoTVShows::CGUIViewStateVideoTVShows(const CFileItemList& items) : CGUIViewStateWindowVideo(items) { AddSortMethod(SortBySortTitle, 556, LABEL_MASKS("%T", "%M", "%T", "%M"), // Title, #Episodes | Title, #Episodes - CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); AddSortMethod(SortByNumberOfEpisodes, 20360, LABEL_MASKS("%L", "%M", "%L", "%M")); // Label, #Episodes | Label, #Episodes AddSortMethod(SortByLastPlayed, 568, LABEL_MASKS("%T", "%p", "%T", "%p")); // Title, #Last played | Title, #Last played AddSortMethod(SortByYear, 562, LABEL_MASKS("%T", "%Y", "%T", "%Y")); // Title, Year | Title, Year - AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%T", "%r", "%T", "%r")); // Title, Userrating | Title, Userrating - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavtvshows"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavtvshows"); if (items.IsSmartPlayList() || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS("%T", "%M", "%T", "%M")); // Title, #Episodes | Title, #Episodes else @@ -572,7 +567,7 @@ void CGUIViewStateVideoTVShows::SaveViewState() { - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavtvshows")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavtvshows")); } CGUIViewStateVideoEpisodes::CGUIViewStateVideoEpisodes(const CFileItemList& items) : CGUIViewStateWindowVideo(items) @@ -581,31 +576,29 @@ { AddSortMethod(SortByEpisodeNumber, 20359, LABEL_MASKS("%E. %T","%R")); // Episode. Title, Rating | empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%E. %T", "%R")); // Episode. Title, Rating | empty, empty - AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%E. %T", "%r")); // Episode. Title, Userrating | empty, empty AddSortMethod(SortByMPAA, 20074, LABEL_MASKS("%E. %T", "%O")); // Episode. Title, MPAA | empty, empty AddSortMethod(SortByProductionCode, 20368, LABEL_MASKS("%E. %T","%P", "%E. %T","%P")); // Episode. Title, Production Code | Episode. Title, Production Code AddSortMethod(SortByDate, 552, LABEL_MASKS("%E. %T","%J","E. %T","%J")); // Episode. Title, Date | Episode. Title, Date - if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) + if (CMediaSettings::Get().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%E. %T", "%V")); // Episode. Title, Playcount | empty, empty } else { // format here is tvshowtitle - season/episode number. episode title AddSortMethod(SortByEpisodeNumber, 20359, LABEL_MASKS("%Z - %H. %T","%R")); // TvShow - Order. Title, Rating | empty, empty AddSortMethod(SortByRating, 563, LABEL_MASKS("%Z - %H. %T", "%R")); // TvShow - Order. Title, Rating | empty, empty - AddSortMethod(SortByUserRating, 38018, LABEL_MASKS("%Z - %H. %T", "%r")); // TvShow - Order. Title, Userrating | empty, empty AddSortMethod(SortByMPAA, 20074, LABEL_MASKS("%Z - %H. %T", "%O")); // TvShow - Order. Title, MPAA | empty, empty AddSortMethod(SortByProductionCode, 20368, LABEL_MASKS("%Z - %H. %T","%P")); // TvShow - Order. Title, Production Code | empty, empty AddSortMethod(SortByDate, 552, LABEL_MASKS("%Z - %H. %T","%J")); // TvShow - Order. Title, Date | empty, empty - if (CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()) == WatchedModeAll) + if (CMediaSettings::Get().GetWatchedMode(items.GetContent()) == WatchedModeAll) AddSortMethod(SortByPlaycount, 567, LABEL_MASKS("%H. %T", "%V")); // Order. Title, Playcount | empty, empty } AddSortMethod(SortByLabel, 551, LABEL_MASKS("%Z - %H. %T","%R"), // TvShow - Order. Title, Rating | empty, empty - CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); - const CViewState *viewState = CViewStateSettings::GetInstance().Get("videonavepisodes"); + const CViewState *viewState = CViewStateSettings::Get().Get("videonavepisodes"); if (items.IsSmartPlayList() || items.IsLibraryFolder()) AddPlaylistOrder(items, LABEL_MASKS("%Z - %H. %T", "%R")); // TvShow - Order. Title, Rating | empty, empty else @@ -621,6 +614,6 @@ void CGUIViewStateVideoEpisodes::SaveViewState() { - SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::GetInstance().Get("videonavepisodes")); + SaveViewToDb(m_items.GetPath(), WINDOW_VIDEO_NAV, CViewStateSettings::Get().Get("videonavepisodes")); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/jobs/Makefile kodi-15.2~git20151019.1039-final/xbmc/video/jobs/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/video/jobs/Makefile 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/jobs/Makefile 2015-10-19 08:39:17.000000000 +0000 @@ -2,7 +2,6 @@ VideoLibraryJob.cpp \ VideoLibraryMarkWatchedJob.cpp \ VideoLibraryProgressJob.cpp \ - VideoLibraryRefreshingJob.cpp \ VideoLibraryScanningJob.cpp \ LIB=video-jobs.a diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryCleaningJob.cpp kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryCleaningJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryCleaningJob.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryCleaningJob.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -22,6 +22,8 @@ #include "dialogs/GUIDialogExtendedProgressBar.h" #include "video/VideoDatabase.h" +using namespace std; + CVideoLibraryCleaningJob::CVideoLibraryCleaningJob(const std::set& paths /* = std::set() */, bool showDialog /* = false */) : CVideoLibraryProgressJob(NULL), m_paths(paths), diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryJob.cpp kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryJob.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryJob.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -21,6 +21,8 @@ #include "VideoLibraryJob.h" #include "video/VideoDatabase.h" +using namespace std; + CVideoLibraryJob::CVideoLibraryJob() { } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryMarkWatchedJob.cpp kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryMarkWatchedJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryMarkWatchedJob.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryMarkWatchedJob.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -53,7 +53,7 @@ bool CVideoLibraryMarkWatchedJob::Work(CVideoDatabase &db) { - if (!CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases()) + if (!CProfilesManager::Get().GetCurrentProfile().canWriteDatabases()) return false; CFileItemList items; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryProgressJob.cpp kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryProgressJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryProgressJob.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryProgressJob.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -20,6 +20,8 @@ #include "VideoLibraryProgressJob.h" +using namespace std; + CVideoLibraryProgressJob::CVideoLibraryProgressJob(CGUIDialogProgressBarHandle* progressBar) : CProgressJob(progressBar) { } @@ -29,8 +31,11 @@ bool CVideoLibraryProgressJob::DoWork() { + SetProgress(0.0f); + bool result = CVideoLibraryJob::DoWork(); + SetProgress(100.0f); MarkFinished(); return result; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryRefreshingJob.cpp kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryRefreshingJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryRefreshingJob.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryRefreshingJob.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,330 +0,0 @@ -/* - * Copyright (C) 2014 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include "VideoLibraryRefreshingJob.h" -#include "NfoFile.h" -#include "TextureDatabase.h" -#include "addons/Scraper.h" -#include "dialogs/GUIDialogExtendedProgressBar.h" -#include "dialogs/GUIDialogOK.h" -#include "dialogs/GUIDialogProgress.h" -#include "dialogs/GUIDialogSelect.h" -#include "dialogs/GUIDialogYesNo.h" -#include "guilib/GUIKeyboardFactory.h" -#include "guilib/GUIWindowManager.h" -#include "media/MediaType.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "video/VideoDatabase.h" -#include "video/VideoInfoDownloader.h" -#include "video/VideoInfoScanner.h" - -CVideoLibraryRefreshingJob::CVideoLibraryRefreshingJob(CFileItemPtr item, bool forceRefresh, bool refreshAll, bool ignoreNfo /* = false */, const std::string& searchTitle /* = "" */) - : CVideoLibraryProgressJob(nullptr), - m_item(item), - m_forceRefresh(forceRefresh), - m_refreshAll(refreshAll), - m_ignoreNfo(ignoreNfo), - m_searchTitle(searchTitle) -{ } - -CVideoLibraryRefreshingJob::~CVideoLibraryRefreshingJob() -{ } - -bool CVideoLibraryRefreshingJob::operator==(const CJob* job) const -{ - if (strcmp(job->GetType(), GetType()) != 0) - return false; - - const CVideoLibraryRefreshingJob* refreshingJob = dynamic_cast(job); - if (refreshingJob == nullptr) - return false; - - return m_item->GetPath() == refreshingJob->m_item->GetPath(); -} - -bool CVideoLibraryRefreshingJob::Work(CVideoDatabase &db) -{ - if (m_item == nullptr) - return false; - - // determine the scraper for the item's path - VIDEO::SScanSettings scanSettings; - ADDON::ScraperPtr scraper = db.GetScraperForPath(m_item->GetPath(), scanSettings); - if (scraper == nullptr) - return false; - - // copy the scraper in case we need it again - ADDON::ScraperPtr originalScraper(scraper); - - // get the item's correct title - std::string itemTitle = m_searchTitle; - if (itemTitle.empty()) - itemTitle = m_item->GetMovieName(scanSettings.parent_name); - - CScraperUrl scraperUrl; - VIDEO::CVideoInfoScanner scanner; - bool needsRefresh = m_forceRefresh; - bool hasDetails = false; - bool ignoreNfo = m_ignoreNfo; - - // run this in a loop in case we need to refresh again - bool failure = false; - do - { - if (!ignoreNfo) - { - // check if there's an NFO for the item - CNfoFile::NFOResult nfoResult = scanner.CheckForNFOFile(m_item.get(), scanSettings.parent_name_root, scraper, scraperUrl); - // if there's no NFO remember it in case we have to refresh again - if (nfoResult == CNfoFile::ERROR_NFO) - ignoreNfo = true; - else if (nfoResult != CNfoFile::NO_NFO) - hasDetails = true; - - - // if we are performing a forced refresh ask the user to choose between using a valid NFO and a valid scraper - if (needsRefresh && IsModal() && !scraper->IsNoop() && - (nfoResult == CNfoFile::URL_NFO || nfoResult == CNfoFile::COMBINED_NFO || nfoResult == CNfoFile::FULL_NFO)) - { - int heading = 20159; - if (scraper->Content() == CONTENT_MOVIES) - heading = 13346; - else if (scraper->Content() == CONTENT_TVSHOWS) - heading = m_item->m_bIsFolder ? 20351 : 20352; - else if (scraper->Content() == CONTENT_MUSICVIDEOS) - heading = 20393; - if (CGUIDialogYesNo::ShowAndGetInput(heading, 20446)) - { - hasDetails = false; - ignoreNfo = true; - scraperUrl.Clear(); - scraper = originalScraper; - } - } - } - - // no need to re-fetch the episode guide for episodes - if (scraper->Content() == CONTENT_TVSHOWS && !m_item->m_bIsFolder) - hasDetails = true; - - // if we don't have an url or need to refresh anyway do the web search - if (!hasDetails && (needsRefresh || scraperUrl.m_url.empty())) - { - SetTitle(StringUtils::Format(g_localizeStrings.Get(197).c_str(), scraper->Name().c_str())); - SetText(itemTitle); - SetProgress(0); - - // clear any cached data from the scraper - scraper->ClearCache(); - - // create the info downloader for the scraper - CVideoInfoDownloader infoDownloader(scraper); - - // try to find a matching item - MOVIELIST itemResultList; - int result = infoDownloader.FindMovie(itemTitle, itemResultList, GetProgressDialog()); - - // close the progress dialog - MarkFinished(); - - if (result > 0) - { - // there are multiple matches for the item - if (!itemResultList.empty()) - { - // choose the first match - if (!IsModal()) - scraperUrl = itemResultList.at(0); - else - { - // ask the user what to do - CGUIDialogSelect* selectDialog = static_cast(g_windowManager.GetWindow(WINDOW_DIALOG_SELECT)); - selectDialog->Reset(); - selectDialog->SetHeading(scraper->Content() == CONTENT_TVSHOWS ? 20356 : 196); - for (const auto& itemResult : itemResultList) - selectDialog->Add(itemResult.strTitle); - selectDialog->EnableButton(true, 413); // "Manual" - selectDialog->Open(); - - // check if the user has chosen one of the results - int selectedItem = selectDialog->GetSelectedLabel(); - if (selectedItem >= 0) - scraperUrl = itemResultList.at(selectedItem); - // the user hasn't chosen one of the results and but has chosen to manually enter a title to use - else if (selectDialog->IsButtonPressed()) - { - // ask the user to input a title to use - if (!CGUIKeyboardFactory::ShowAndGetInput(itemTitle, g_localizeStrings.Get(scraper->Content() == CONTENT_TVSHOWS ? 20357 : 16009), false)) - return false; - - // go through the whole process again - needsRefresh = true; - continue; - } - // nothing else we can do - else - return false; - } - - CLog::Log(LOGDEBUG, "CVideoLibraryRefreshingJob: user selected item '%s' with URL '%s'", scraperUrl.strTitle.c_str(), scraperUrl.m_url.at(0).m_url.c_str()); - } - } - else if (result < 0 || !VIDEO::CVideoInfoScanner::DownloadFailed(GetProgressDialog())) - { - failure = true; - break; - } - } - - // if the URL is still empty, check whether or not we're allowed - // to prompt and ask the user to input a new search title - if (!hasDetails && scraperUrl.m_url.empty()) - { - if (IsModal()) - { - // ask the user to input a title to use - if (!CGUIKeyboardFactory::ShowAndGetInput(itemTitle, g_localizeStrings.Get(scraper->Content() == CONTENT_TVSHOWS ? 20357 : 16009), false)) - return false; - - // go through the whole process again - needsRefresh = true; - continue; - } - - // nothing else we can do - failure = true; - break; - } - - // before we start downloading all the necessary information cleanup any existing artwork and hashes - CTextureDatabase textureDb; - if (textureDb.Open()) - { - for (const auto& artwork : m_item->GetArt()) - textureDb.InvalidateCachedTexture(artwork.second); - - textureDb.Close(); - } - m_item->ClearArt(); - - // put together the list of items to refresh - std::string path = m_item->GetPath(); - CFileItemList items; - if (m_item->HasVideoInfoTag() && m_item->GetVideoInfoTag()->m_iDbId > 0) - { - // for a tvshow we need to handle all paths of it - std::vector tvshowPaths; - if (MediaTypes::IsMediaType(m_item->GetVideoInfoTag()->m_type, MediaTypeTvShow) && m_refreshAll && - db.GetPathsLinkedToTvShow(m_item->GetVideoInfoTag()->m_iDbId, tvshowPaths)) - { - for (const auto& tvshowPath : tvshowPaths) - { - CFileItemPtr tvshowItem(new CFileItem(*m_item->GetVideoInfoTag())); - tvshowItem->SetPath(tvshowPath); - items.Add(tvshowItem); - } - } - // otherwise just add a copy of the item - else - items.Add(CFileItemPtr(new CFileItem(*m_item->GetVideoInfoTag()))); - - // update the path to the real path (instead of a videodb:// one) - path = m_item->GetVideoInfoTag()->m_strPath; - } - else - items.Add(CFileItemPtr(new CFileItem(*m_item))); - - // set the proper path of the list of items to lookup - items.SetPath(m_item->m_bIsFolder ? URIUtils::GetParentPath(path) : URIUtils::GetDirectory(path)); - - int headingLabel = 198; - if (scraper->Content() == CONTENT_TVSHOWS) - { - if (m_item->m_bIsFolder) - headingLabel = 20353; - else - headingLabel = 20361; - } - else if (scraper->Content() == CONTENT_MUSICVIDEOS) - headingLabel = 20394; - - // prepare the progress dialog for downloading all the necessary information - SetTitle(g_localizeStrings.Get(headingLabel)); - SetText(scraperUrl.strTitle); - SetProgress(0); - - // remove any existing data for the item we're going to refresh - if (m_item->GetVideoInfoTag()->m_iDbId > 0) - { - int dbId = m_item->GetVideoInfoTag()->m_iDbId; - if (scraper->Content() == CONTENT_MOVIES) - db.DeleteMovie(dbId); - else if (scraper->Content() == CONTENT_MUSICVIDEOS) - db.DeleteMusicVideo(dbId); - else if (scraper->Content() == CONTENT_TVSHOWS) - { - if (!m_item->m_bIsFolder) - db.DeleteEpisode(dbId); - else if (m_refreshAll) - db.DeleteTvShow(dbId); - else - db.DeleteDetailsForTvShow(dbId); - } - } - - // finally download the information for the item - if (!scanner.RetrieveVideoInfo(items, scanSettings.parent_name, scraper->Content(), !ignoreNfo, &scraperUrl, m_refreshAll, GetProgressDialog())) - { - // something went wrong - MarkFinished(); - - // check if the user cancelled - if (!IsCancelled() && IsModal()) - CGUIDialogOK::ShowAndGetInput(195, itemTitle); - - return false; - } - - // retrieve the updated information from the database - if (scraper->Content() == CONTENT_MOVIES) - db.GetMovieInfo(m_item->GetPath(), *m_item->GetVideoInfoTag()); - else if (scraper->Content() == CONTENT_MUSICVIDEOS) - db.GetMusicVideoInfo(m_item->GetPath(), *m_item->GetVideoInfoTag()); - else if (scraper->Content() == CONTENT_TVSHOWS) - { - // update tvshow info to get updated episode numbers - if (m_item->m_bIsFolder) - db.GetTvShowInfo(m_item->GetPath(), *m_item->GetVideoInfoTag()); - else - db.GetEpisodeInfo(m_item->GetPath(), *m_item->GetVideoInfoTag()); - } - - // we're finally done - MarkFinished(); - break; - } while (needsRefresh); - - if (failure && IsModal()) - CGUIDialogOK::ShowAndGetInput(195, itemTitle); - - return true; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryRefreshingJob.h kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryRefreshingJob.h --- kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryRefreshingJob.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryRefreshingJob.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -#pragma once -/* - * Copyright (C) 2014 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * . - * - */ - -#include - -#include "FileItem.h" -#include "video/jobs/VideoLibraryProgressJob.h" - -/*! - \brief Video library job implementation for refreshing a single item. -*/ -class CVideoLibraryRefreshingJob : public CVideoLibraryProgressJob -{ -public: - /*! - \brief Creates a new video library cleaning job for the given paths. - - \param[inout] item Video item to be refreshed - \param[in] forceRefresh Whether to force a complete refresh (including NFO or internet lookup) - \param[in] refreshAll Whether to refresh all sub-items (in case of a tvshow) - \param[in] ignoreNfo Whether or not to ignore local NFO files - \param[in] searchTitle Title to use for the search (instead of determining it from the item's filename/path) - */ - CVideoLibraryRefreshingJob(CFileItemPtr item, bool forceRefresh, bool refreshAll, bool ignoreNfo = false, const std::string& searchTitle = ""); - - virtual ~CVideoLibraryRefreshingJob(); - - // specialization of CJob - virtual const char *GetType() const { return "VideoLibraryRefreshingJob"; } - virtual bool operator==(const CJob* job) const; - -protected: - // implementation of CVideoLibraryJob - virtual bool Work(CVideoDatabase &db); - -private: - CFileItemPtr m_item; - bool m_forceRefresh; - bool m_refreshAll; - bool m_ignoreNfo; - std::string m_searchTitle; -}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryScanningJob.cpp kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryScanningJob.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/jobs/VideoLibraryScanningJob.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/jobs/VideoLibraryScanningJob.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -21,6 +21,8 @@ #include "VideoLibraryScanningJob.h" #include "video/VideoDatabase.h" +using namespace std; + CVideoLibraryScanningJob::CVideoLibraryScanningJob(const std::string& directory, bool scanAll /* = false */, bool showProgress /* = true */) : m_scanner(), m_directory(directory), diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/PlayerController.cpp kodi-15.2~git20151019.1039-final/xbmc/video/PlayerController.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/PlayerController.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/PlayerController.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -38,20 +38,14 @@ #include "utils/StringUtils.h" CPlayerController::CPlayerController() - : m_sliderAction(0) { + m_sliderAction = 0; } CPlayerController::~CPlayerController() { } -CPlayerController& CPlayerController::GetInstance() -{ - static CPlayerController instance; - return instance; -} - bool CPlayerController::OnAction(const CAction &action) { const unsigned int MsgTime = 300; @@ -136,12 +130,12 @@ case ACTION_SUBTITLE_DELAY_MIN: { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay -= 0.1f; - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay < -g_advancedSettings.m_videoSubsDelayRange) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay = -g_advancedSettings.m_videoSubsDelayRange; - g_application.m_pPlayer->SetSubTitleDelay(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay); + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay -= 0.1f; + if (CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay < -g_advancedSettings.m_videoSubsDelayRange) + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay = -g_advancedSettings.m_videoSubsDelayRange; + g_application.m_pPlayer->SetSubTitleDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay); - ShowSlider(action.GetID(), 22006, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay, + ShowSlider(action.GetID(), 22006, CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange); return true; @@ -149,12 +143,12 @@ case ACTION_SUBTITLE_DELAY_PLUS: { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay += 0.1f; - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay > g_advancedSettings.m_videoSubsDelayRange) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay = g_advancedSettings.m_videoSubsDelayRange; - g_application.m_pPlayer->SetSubTitleDelay(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay); + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay += 0.1f; + if (CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay > g_advancedSettings.m_videoSubsDelayRange) + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay = g_advancedSettings.m_videoSubsDelayRange; + g_application.m_pPlayer->SetSubTitleDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay); - ShowSlider(action.GetID(), 22006, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay, + ShowSlider(action.GetID(), 22006, CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange); return true; @@ -162,7 +156,7 @@ case ACTION_SUBTITLE_DELAY: { - ShowSlider(action.GetID(), 22006, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay, + ShowSlider(action.GetID(), 22006, CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange, true); return true; @@ -170,7 +164,7 @@ case ACTION_AUDIO_DELAY: { - ShowSlider(action.GetID(), 297, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay, + ShowSlider(action.GetID(), 297, CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange, true); return true; @@ -178,12 +172,12 @@ case ACTION_AUDIO_DELAY_MIN: { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay -= 0.025f; - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay < -g_advancedSettings.m_videoAudioDelayRange) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay = -g_advancedSettings.m_videoAudioDelayRange; - g_application.m_pPlayer->SetAVDelay(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay); + CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay -= 0.025f; + if (CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay < -g_advancedSettings.m_videoAudioDelayRange) + CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay = -g_advancedSettings.m_videoAudioDelayRange; + g_application.m_pPlayer->SetAVDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay); - ShowSlider(action.GetID(), 297, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay, + ShowSlider(action.GetID(), 297, CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange); return true; @@ -191,12 +185,12 @@ case ACTION_AUDIO_DELAY_PLUS: { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay += 0.025f; - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay > g_advancedSettings.m_videoAudioDelayRange) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay = g_advancedSettings.m_videoAudioDelayRange; - g_application.m_pPlayer->SetAVDelay(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay); + CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay += 0.025f; + if (CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay > g_advancedSettings.m_videoAudioDelayRange) + CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay = g_advancedSettings.m_videoAudioDelayRange; + g_application.m_pPlayer->SetAVDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay); - ShowSlider(action.GetID(), 297, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay, + ShowSlider(action.GetID(), 297, CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange); return true; @@ -228,74 +222,74 @@ case ACTION_ZOOM_IN: { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount += 0.01f; - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount > 2.f) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount = 2.f; - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount += 0.01f; + if (CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount > 2.f) + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount = 2.f; + CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; g_renderManager.SetViewMode(ViewModeCustom); - ShowSlider(action.GetID(), 216, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); + ShowSlider(action.GetID(), 216, CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); return true; } case ACTION_ZOOM_OUT: { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount -= 0.01f; - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount < 0.5f) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount = 0.5f; - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount -= 0.01f; + if (CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount < 0.5f) + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount = 0.5f; + CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; g_renderManager.SetViewMode(ViewModeCustom); - ShowSlider(action.GetID(), 216, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); + ShowSlider(action.GetID(), 216, CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); return true; } case ACTION_INCREASE_PAR: { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomPixelRatio += 0.01f; - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomPixelRatio > 2.f) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount = 2.f; - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomPixelRatio += 0.01f; + if (CMediaSettings::Get().GetCurrentVideoSettings().m_CustomPixelRatio > 2.f) + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount = 2.f; + CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; g_renderManager.SetViewMode(ViewModeCustom); - ShowSlider(action.GetID(), 217, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); + ShowSlider(action.GetID(), 217, CMediaSettings::Get().GetCurrentVideoSettings().m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); return true; } case ACTION_DECREASE_PAR: { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomPixelRatio -= 0.01f; - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomZoomAmount < 0.5f) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomPixelRatio = 0.5f; - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomPixelRatio -= 0.01f; + if (CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount < 0.5f) + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomPixelRatio = 0.5f; + CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; g_renderManager.SetViewMode(ViewModeCustom); - ShowSlider(action.GetID(), 217, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); + ShowSlider(action.GetID(), 217, CMediaSettings::Get().GetCurrentVideoSettings().m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); return true; } case ACTION_VSHIFT_UP: { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomVerticalShift -= 0.01f; - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomVerticalShift < -2.0f) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomVerticalShift = -2.0f; - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift -= 0.01f; + if (CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift < -2.0f) + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift = -2.0f; + CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; g_renderManager.SetViewMode(ViewModeCustom); - ShowSlider(action.GetID(), 225, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); + ShowSlider(action.GetID(), 225, CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); return true; } case ACTION_VSHIFT_DOWN: { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomVerticalShift += 0.01f; - if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomVerticalShift > 2.0f) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomVerticalShift = 2.0f; - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift += 0.01f; + if (CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift > 2.0f) + CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift = 2.0f; + CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; g_renderManager.SetViewMode(ViewModeCustom); - ShowSlider(action.GetID(), 225, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); + ShowSlider(action.GetID(), 225, CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); return true; } case ACTION_SUBTITLE_VSHIFT_UP: { RESOLUTION_INFO res_info = g_graphicsContext.GetResInfo(); - int subalign = CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_ALIGN); + int subalign = CSettings::Get().GetInt("subtitles.align"); if ((subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE) || (subalign == SUBTITLE_ALIGN_TOP_INSIDE)) { res_info.iSubtitles ++; @@ -322,7 +316,7 @@ case ACTION_SUBTITLE_VSHIFT_DOWN: { RESOLUTION_INFO res_info = g_graphicsContext.GetResInfo(); - int subalign = CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_ALIGN); + int subalign = CSettings::Get().GetInt("subtitles.align"); if ((subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE) || (subalign == SUBTITLE_ALIGN_TOP_INSIDE)) { res_info.iSubtitles--; @@ -349,7 +343,7 @@ case ACTION_SUBTITLE_ALIGN: { RESOLUTION_INFO res_info = g_graphicsContext.GetResInfo(); - int subalign = CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_ALIGN); + int subalign = CSettings::Get().GetInt("subtitles.align"); subalign++; if (subalign > SUBTITLE_ALIGN_TOP_OUTSIDE) @@ -357,7 +351,7 @@ res_info.iSubtitles = res_info.iHeight - 1; - CSettings::GetInstance().SetInt(CSettings::SETTING_SUBTITLES_ALIGN, subalign); + CSettings::Get().SetInt("subtitles.align", subalign); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(21460), g_localizeStrings.Get(21461 + subalign), @@ -383,16 +377,16 @@ float sliderMin = VOLUME_DRC_MINIMUM / 100.0f; if (action.GetID() == ACTION_VOLAMP_UP) - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification += 1.0f; + CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification += 1.0f; else - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification -= 1.0f; + CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification -= 1.0f; - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification = - std::max(std::min(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification, sliderMax), sliderMin); + CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification = + std::max(std::min(CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification, sliderMax), sliderMin); - g_application.m_pPlayer->SetDynamicRangeCompression((long)(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification * 100)); + g_application.m_pPlayer->SetDynamicRangeCompression((long)(CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification * 100)); - ShowSlider(action.GetID(), 660, CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification, sliderMin, 1.0f, sliderMax); + ShowSlider(action.GetID(), 660, CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification, sliderMin, 1.0f, sliderMax); return true; } @@ -401,7 +395,7 @@ float sliderMax = VOLUME_DRC_MAXIMUM / 100.0f; float sliderMin = VOLUME_DRC_MINIMUM / 100.0f; ShowSlider(action.GetID(), 660, - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification, + CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification, sliderMin, 1.0f, sliderMax, true); return true; } @@ -446,18 +440,18 @@ { if (m_sliderAction == ACTION_AUDIO_DELAY) { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay = slider->GetFloatValue(); - g_application.m_pPlayer->SetAVDelay(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_AudioDelay); + CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay = slider->GetFloatValue(); + g_application.m_pPlayer->SetAVDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay); } else if (m_sliderAction == ACTION_SUBTITLE_DELAY) { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay = slider->GetFloatValue(); - g_application.m_pPlayer->SetSubTitleDelay(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_SubtitleDelay); + CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay = slider->GetFloatValue(); + g_application.m_pPlayer->SetSubTitleDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay); } else if (m_sliderAction == ACTION_VOLAMP) { - CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification = slider->GetFloatValue(); - g_application.m_pPlayer->SetDynamicRangeCompression((long)(CMediaSettings::GetInstance().GetCurrentVideoSettings().m_VolumeAmplification * 100)); + CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification = slider->GetFloatValue(); + g_application.m_pPlayer->SetDynamicRangeCompression((long)(CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification * 100)); } } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/PlayerController.h kodi-15.2~git20151019.1039-final/xbmc/video/PlayerController.h --- kodi-16.1~git20160425.1001-final/xbmc/video/PlayerController.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/PlayerController.h 2015-10-19 08:39:17.000000000 +0000 @@ -22,7 +22,6 @@ #include "guilib/ISliderCallback.h" #include "input/Key.h" -#include "interfaces/IActionListener.h" /*! \brief Player controller class to handle user actions. @@ -30,28 +29,23 @@ altering subtitles and audio tracks, changing aspect ratio, subtitle placement, and placement of the video on screen. */ -class CPlayerController : public ISliderCallback, public IActionListener +class CPlayerController : public ISliderCallback { public: - static CPlayerController& GetInstance(); + CPlayerController(); + virtual ~CPlayerController(); /*! \brief Perform a player control action if appropriate. \param action the action to perform. \return true if the action is considered handled, false if it should be handled elsewhere. */ - virtual bool OnAction(const CAction &action); + bool OnAction(const CAction &action); /*! \brief Callback from the slider dialog. \sa CGUIDialogSlider */ virtual void OnSliderChange(void *data, CGUISliderControl *slider); -protected: - CPlayerController(); - CPlayerController(const CPlayerController&); - CPlayerController& operator=(CPlayerController const&); - virtual ~CPlayerController(); - private: /*! \brief pop up a slider dialog for a particular action \param action id of the action the slider responds to diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/Teletext.cpp kodi-15.2~git20151019.1039-final/xbmc/video/Teletext.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/Teletext.cpp 2015-11-04 04:00:19.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/Teletext.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -32,9 +32,9 @@ #include "filesystem/SpecialProtocol.h" #include "guilib/GraphicContext.h" -#if HAVE_SDL_VERSION == 1 +#if SDL_VERSION == 1 #include -#elif HAVE_SDL_VERSION == 2 +#elif SDL_VERSION == 2 #include #else #define SDL_memset4(dst, val, len) \ @@ -55,6 +55,8 @@ #define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len) << 2) #endif +using namespace std; + static const char *TeletextFont = "special://xbmc/media/Fonts/teletext.ttf"; /* spacing attributes */ @@ -2510,7 +2512,7 @@ } *pPosX += curfontwidth; - return 0; + return 0;; } if (Attribute->charset == C_G3) @@ -2854,7 +2856,7 @@ PageAtrb[i] = atr; /* decode parity/hamming */ - for (unsigned int i = 40; i < TELETEXT_PAGE_SIZE; i++) + for (unsigned int i = 40; i < sizeof(PageChar); i++) { PageAtrb[i] = atr; p = PageChar + i; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/TeletextDefines.h kodi-15.2~git20151019.1039-final/xbmc/video/TeletextDefines.h --- kodi-16.1~git20160425.1001-final/xbmc/video/TeletextDefines.h 2015-11-04 04:00:19.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/TeletextDefines.h 2015-04-04 00:00:18.000000000 +0000 @@ -24,7 +24,6 @@ #define FLOFSIZE 4 #define SUBTITLE_CACHESIZE 50 -#define TELETEXT_PAGE_SIZE (40 * 25) #define number2char(c) ((c) + (((c) <= 9) ? '0' : ('A' - 10))) @@ -394,8 +393,8 @@ { bool Valid; long Timestamp; - unsigned char PageChar[TELETEXT_PAGE_SIZE]; - TextPageAttr_t PageAtrb[TELETEXT_PAGE_SIZE]; + unsigned char PageChar[40 * 25]; + TextPageAttr_t PageAtrb[40 * 25]; } TextSubtitleCache_t; /* main data structure */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoDatabase.cpp kodi-15.2~git20151019.1039-final/xbmc/video/VideoDatabase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoDatabase.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoDatabase.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -22,63 +22,53 @@ #include "config.h" #endif +#include "ApplicationMessenger.h" +#include "threads/SystemClock.h" #include "VideoDatabase.h" - -#include -#include -#include -#include -#include - +#include "video/windows/GUIWindowVideoBase.h" #include "addons/AddonManager.h" -#include "Application.h" -#include "dbwrappers/dataset.h" +#include "GUIInfoManager.h" +#include "Util.h" +#include "utils/URIUtils.h" +#include "utils/XMLUtils.h" +#include "GUIPassword.h" +#include "filesystem/StackDirectory.h" +#include "filesystem/MultiPathDirectory.h" +#include "VideoInfoScanner.h" +#include "guilib/GUIWindowManager.h" +#include "filesystem/Directory.h" +#include "filesystem/File.h" #include "dialogs/GUIDialogExtendedProgressBar.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogProgress.h" #include "dialogs/GUIDialogYesNo.h" +#include "dialogs/GUIDialogKaiToast.h" +#include "dialogs/GUIDialogOK.h" #include "FileItem.h" -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "filesystem/MultiPathDirectory.h" -#include "filesystem/StackDirectory.h" -#include "guiinfo/GUIInfoLabels.h" -#include "GUIInfoManager.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "GUIPassword.h" -#include "interfaces/AnnouncementManager.h" -#include "messaging/ApplicationMessenger.h" -#include "playlists/SmartPlayList.h" #include "profiles/ProfilesManager.h" #include "settings/AdvancedSettings.h" #include "settings/MediaSettings.h" #include "settings/MediaSourceSettings.h" #include "settings/Settings.h" #include "storage/MediaManager.h" +#include "utils/StringUtils.h" +#include "guilib/LocalizeStrings.h" +#include "utils/log.h" #include "TextureCache.h" -#include "threads/SystemClock.h" -#include "URL.h" -#include "Util.h" -#include "utils/FileUtils.h" -#include "utils/GroupUtils.h" +#include "interfaces/AnnouncementManager.h" +#include "dbwrappers/dataset.h" #include "utils/LabelFormatter.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "utils/Variant.h" -#include "utils/XMLUtils.h" -#include "video/VideoDbUrl.h" -#include "video/windows/GUIWindowVideoBase.h" -#include "VideoInfoScanner.h" #include "XBDateTime.h" +#include "URL.h" +#include "video/VideoDbUrl.h" +#include "playlists/SmartPlayList.h" +#include "utils/GroupUtils.h" +#include "Application.h" +using namespace std; using namespace dbiplus; using namespace XFILE; using namespace VIDEO; using namespace ADDON; -using namespace KODI::MESSAGING; //******************************************************************************************************************************** CVideoDatabase::CVideoDatabase(void) @@ -125,8 +115,8 @@ for (int i = 0; i < VIDEODB_MAX_COLUMNS; i++) columns += StringUtils::Format(",c%02d text", i); - columns += ", idSet integer, userrating integer)"; - m_pDS->exec(columns); + columns += ", idSet integer)"; + m_pDS->exec(columns.c_str()); CLog::Log(LOGINFO, "create actor table"); m_pDS->exec("CREATE TABLE actor ( actor_id INTEGER PRIMARY KEY, name TEXT, art_urls TEXT )"); @@ -144,10 +134,10 @@ columns = "CREATE TABLE tvshow ( idShow integer primary key"; for (int i = 0; i < VIDEODB_MAX_COLUMNS; i++) - columns += StringUtils::Format(",c%02d text", i); + columns += StringUtils::Format(",c%02d text", i);; - columns += ", userrating integer)"; - m_pDS->exec(columns); + columns += ")"; + m_pDS->exec(columns.c_str()); CLog::Log(LOGINFO, "create episode table"); columns = "CREATE TABLE episode ( idEpisode integer primary key, idFile integer"; @@ -161,8 +151,8 @@ columns += column; } - columns += ", idShow integer, userrating integer, idSeason integer)"; - m_pDS->exec(columns); + columns += ", idShow integer)"; + m_pDS->exec(columns.c_str()); CLog::Log(LOGINFO, "create tvshowlinkpath table"); m_pDS->exec("CREATE TABLE tvshowlinkpath (idShow integer, idPath integer)\n"); @@ -177,21 +167,21 @@ CLog::Log(LOGINFO, "create musicvideo table"); columns = "CREATE TABLE musicvideo ( idMVideo integer primary key, idFile integer"; for (int i = 0; i < VIDEODB_MAX_COLUMNS; i++) - columns += StringUtils::Format(",c%02d text", i); + columns += StringUtils::Format(",c%02d text", i);; - columns += ", userrating integer)"; - m_pDS->exec(columns); + columns += ")"; + m_pDS->exec(columns.c_str()); CLog::Log(LOGINFO, "create streaminfo table"); m_pDS->exec("CREATE TABLE streamdetails (idFile integer, iStreamType integer, " "strVideoCodec text, fVideoAspect float, iVideoWidth integer, iVideoHeight integer, " "strAudioCodec text, iAudioChannels integer, strAudioLanguage text, strSubtitleLanguage text, iVideoDuration integer, strStereoMode text)"); - CLog::Log(LOGINFO, "create sets table"); - m_pDS->exec("CREATE TABLE sets ( idSet integer primary key, strSet text, strOverview text)"); + CLog::Log(LOGINFO, "create sets table"); + m_pDS->exec("CREATE TABLE sets ( idSet integer primary key, strSet text)\n"); CLog::Log(LOGINFO, "create seasons table"); - m_pDS->exec("CREATE TABLE seasons ( idSeason integer primary key, idShow integer, season integer, name text)"); + m_pDS->exec("CREATE TABLE seasons ( idSeason integer primary key, idShow integer, season integer)"); CLog::Log(LOGINFO, "create art table"); m_pDS->exec("CREATE TABLE art(art_id INTEGER PRIMARY KEY, media_id INTEGER, media_type TEXT, type TEXT, url TEXT)"); @@ -248,9 +238,9 @@ m_pDS->exec("CREATE UNIQUE INDEX ix_episode_file_1 on episode (idEpisode, idFile)"); m_pDS->exec("CREATE UNIQUE INDEX id_episode_file_2 on episode (idFile, idEpisode)"); std::string createColIndex = StringUtils::Format("CREATE INDEX ix_episode_season_episode on episode (c%02d, c%02d)", VIDEODB_ID_EPISODE_SEASON, VIDEODB_ID_EPISODE_EPISODE); - m_pDS->exec(createColIndex); + m_pDS->exec(createColIndex.c_str()); createColIndex = StringUtils::Format("CREATE INDEX ix_episode_bookmark on episode (c%02d)", VIDEODB_ID_EPISODE_BOOKMARK); - m_pDS->exec(createColIndex); + m_pDS->exec(createColIndex.c_str()); m_pDS->exec("CREATE INDEX ix_episode_show1 on episode(idEpisode,idShow)"); m_pDS->exec("CREATE INDEX ix_episode_show2 on episode(idShow,idEpisode)"); @@ -343,27 +333,24 @@ " files.lastPlayed AS lastPlayed," " files.dateAdded AS dateAdded," " tvshow.c%02d AS strTitle," - " tvshow.c%02d AS genre," " tvshow.c%02d AS studio," " tvshow.c%02d AS premiered," " tvshow.c%02d AS mpaa," " bookmark.timeInSeconds AS resumeTimeInSeconds, " - " bookmark.totalTimeInSeconds AS totalTimeInSeconds " + " bookmark.totalTimeInSeconds AS totalTimeInSeconds, " + " seasons.idSeason AS idSeason " "FROM episode" " JOIN files ON" " files.idFile=episode.idFile" " JOIN tvshow ON" " tvshow.idShow=episode.idShow" - " JOIN seasons ON" - " seasons.idSeason=episode.idSeason" + " LEFT JOIN seasons ON" + " seasons.idShow=episode.idShow AND seasons.season=episode.c%02d" " JOIN path ON" " files.idPath=path.idPath" " LEFT JOIN bookmark ON" - " bookmark.idFile=episode.idFile AND bookmark.type=1", - VIDEODB_ID_TV_TITLE, VIDEODB_ID_TV_GENRE, - VIDEODB_ID_TV_STUDIOS, VIDEODB_ID_TV_PREMIERED, - VIDEODB_ID_TV_MPAA); - m_pDS->exec(episodeview); + " bookmark.idFile=episode.idFile AND bookmark.type=1", VIDEODB_ID_TV_TITLE, VIDEODB_ID_TV_STUDIOS, VIDEODB_ID_TV_PREMIERED, VIDEODB_ID_TV_MPAA,VIDEODB_ID_EPISODE_SEASON); + m_pDS->exec(episodeview.c_str()); CLog::Log(LOGINFO, "create tvshowcounts"); std::string tvshowcounts = PrepareSQL("CREATE VIEW tvshowcounts AS SELECT " @@ -379,7 +366,7 @@ " LEFT JOIN files ON" " files.idFile=episode.idFile " " GROUP BY tvshow.idShow"); - m_pDS->exec(tvshowcounts); + m_pDS->exec(tvshowcounts.c_str()); CLog::Log(LOGINFO, "create tvshow_view"); std::string tvshowview = PrepareSQL("CREATE VIEW tvshow_view AS SELECT " @@ -396,7 +383,7 @@ " INNER JOIN tvshowcounts ON" " tvshow.idShow = tvshowcounts.idShow " "GROUP BY tvshow.idShow"); - m_pDS->exec(tvshowview); + m_pDS->exec(tvshowview.c_str()); CLog::Log(LOGINFO, "create season_view"); std::string seasonview = PrepareSQL("CREATE VIEW season_view AS SELECT " @@ -409,8 +396,7 @@ " tvshow_view.c%02d AS studio," " tvshow_view.c%02d AS mpaa," " count(DISTINCT episode_view.idEpisode) AS episodes," - " count(files.playCount) AS playCount," - " min(episode_view.c%02d) AS aired " + " count(files.playCount) AS playCount " "FROM seasons" " JOIN tvshow_view ON" " tvshow_view.idShow = seasons.idShow" @@ -421,8 +407,8 @@ "GROUP BY seasons.idSeason", VIDEODB_ID_TV_TITLE, VIDEODB_ID_TV_PLOT, VIDEODB_ID_TV_PREMIERED, VIDEODB_ID_TV_GENRE, VIDEODB_ID_TV_STUDIOS, VIDEODB_ID_TV_MPAA, - VIDEODB_ID_EPISODE_AIRED, VIDEODB_ID_EPISODE_SEASON); - m_pDS->exec(seasonview); + VIDEODB_ID_EPISODE_SEASON); + m_pDS->exec(seasonview.c_str()); CLog::Log(LOGINFO, "create musicvideo_view"); m_pDS->exec("CREATE VIEW musicvideo_view AS SELECT" @@ -446,7 +432,6 @@ m_pDS->exec("CREATE VIEW movie_view AS SELECT" " movie.*," " sets.strSet AS strSet," - " sets.strOverview AS strSetOverview," " files.strFileName AS strFileName," " path.strPath AS strPath," " files.playCount AS playCount," @@ -482,7 +467,7 @@ URIUtils::AddSlashAtEnd(strPath1); strSQL=PrepareSQL("select idPath from path where strPath='%s'",strPath1.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (!m_pDS->eof()) idPath = m_pDS->fv("path.idPath").get_asInt(); @@ -496,7 +481,7 @@ return -1; } -bool CVideoDatabase::GetPaths(std::set &paths) +bool CVideoDatabase::GetPaths(set &paths) { try { @@ -566,13 +551,13 @@ return false; } -bool CVideoDatabase::GetPathsLinkedToTvShow(int idShow, std::vector &paths) +bool CVideoDatabase::GetPathsLinkedToTvShow(int idShow, vector &paths) { - std::string sql; + string sql; try { sql = PrepareSQL("SELECT strPath FROM path JOIN tvshowlinkpath ON tvshowlinkpath.idPath=path.idPath WHERE idShow=%i", idShow); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); while (!m_pDS->eof()) { paths.push_back(m_pDS->fv(0).get_asString()); @@ -587,7 +572,7 @@ return false; } -bool CVideoDatabase::GetPathsForTvShow(int idShow, std::set& paths) +bool CVideoDatabase::GetPathsForTvShow(int idShow, set& paths) { std::string strSQL; try @@ -597,12 +582,12 @@ // add base path strSQL = PrepareSQL("SELECT strPath FROM tvshow_view WHERE idShow=%i", idShow); - if (m_pDS->query(strSQL)) + if (m_pDS->query(strSQL.c_str())) paths.insert(GetPathId(m_pDS->fv(0).get_asString())); // add all other known paths strSQL = PrepareSQL("SELECT DISTINCT idPath FROM files JOIN episode ON episode.idFile=files.idFile WHERE episode.idShow=%i",idShow); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); while (!m_pDS->eof()) { paths.insert(m_pDS->fv(0).get_asInt()); @@ -622,7 +607,7 @@ { unsigned int time = XbmcThreads::SystemClockMillis(); int rows = -1; - if (m_pDS->query(sql)) + if (m_pDS->query(sql.c_str())) { rows = m_pDS->num_rows(); if (rows == 0) @@ -632,7 +617,7 @@ return rows; } -bool CVideoDatabase::GetSubPaths(const std::string &basepath, std::vector>& subpaths) +bool CVideoDatabase::GetSubPaths(const std::string &basepath, vector< pair >& subpaths) { std::string sql; try @@ -647,7 +632,7 @@ " AND idPath NOT IN (SELECT idPath FROM files WHERE strFileName LIKE 'index.bdmv')" , StringUtils::utf8_strlen(path.c_str()), path.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); while (!m_pDS->eof()) { subpaths.push_back(make_pair(m_pDS->fv(0).get_asInt(), m_pDS->fv(1).get_asString())); @@ -698,7 +683,7 @@ else strSQL=PrepareSQL("insert into path (idPath, strPath, idParentPath) values (NULL, '%s', %i)", strPath1.c_str(), idParentPath); } - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); idPath = (int)m_pDS->lastinsertid(); return idPath; } @@ -717,7 +702,7 @@ if (NULL == m_pDS.get()) return false; std::string strSQL=PrepareSQL("select strHash from path where strPath='%s'", path.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() == 0) return false; hash = m_pDS->fv("strHash").get_asString(); @@ -762,7 +747,7 @@ "path.idPath = %i AND " "path.strContent IS NOT NULL AND path.strContent != '' AND " "path.strScraper IS NOT NULL AND path.strScraper != ''", idPath); - if (m_pDS->query(strSQL) && !m_pDS->eof()) + if (m_pDS->query(strSQL.c_str()) && !m_pDS->eof()) { settings.parent_name_root = settings.parent_name = m_pDS->fv(0).get_asBool(); settings.recurse = m_pDS->fv(1).get_asInt(); @@ -781,7 +766,7 @@ while (URIUtils::GetParentPath(strPath1, strParent)) { std::string strSQL = PrepareSQL("SELECT path.strContent, path.strScraper, path.scanRecursive, path.useFolderNames, path.noUpdate, path.exclude FROM path WHERE strPath = '%s'", strParent.c_str()); - if (m_pDS->query(strSQL) && !m_pDS->eof()) + if (m_pDS->query(strSQL.c_str()) && !m_pDS->eof()) { std::string strContent = m_pDS->fv(0).get_asString(); std::string strScraper = m_pDS->fv(1).get_asString(); @@ -832,7 +817,7 @@ std::string strSQL=PrepareSQL("select idFile from files where strFileName='%s' and idPath=%i", strFileName.c_str(),idPath); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() > 0) { idFile = m_pDS->fv("idFile").get_asInt() ; @@ -842,7 +827,7 @@ m_pDS->close(); strSQL=PrepareSQL("insert into files (idFile, idPath, strFileName) values(NULL, %i, '%s')", idPath, strFileName.c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); idFile = (int)m_pDS->lastinsertid(); return idFile; } @@ -869,28 +854,72 @@ { if (idFile < 0 || strFileNameAndPath.empty()) return; - - CDateTime dateAdded; + + std::string strSQL = ""; try { if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - - // 1 prefering to use the files mtime(if it's valid) and only using the file's ctime if the mtime isn't valid - if (g_advancedSettings.m_iVideoLibraryDateAdded == 1) - dateAdded = CFileUtils::GetModificationDate(strFileNameAndPath, false); - //2 using the newer datetime of the file's mtime and ctime - else if (g_advancedSettings.m_iVideoLibraryDateAdded == 2) - dateAdded = CFileUtils::GetModificationDate(strFileNameAndPath, true); - //0 using the current datetime if non of the above matches or one returns an invalid datetime + + std::string file = strFileNameAndPath; + if (URIUtils::IsStack(strFileNameAndPath)) + file = CStackDirectory::GetFirstStackedFile(strFileNameAndPath); + + if (URIUtils::IsInArchive(file)) + file = CURL(file).GetHostName(); + + CDateTime dateAdded; + // Skip looking at the files ctime/mtime if defined by the user through as.xml + if (g_advancedSettings.m_iVideoLibraryDateAdded > 0) + { + // Let's try to get the modification datetime + struct __stat64 buffer; + if (CFile::Stat(file, &buffer) == 0 && (buffer.st_mtime != 0 || buffer.st_ctime !=0)) + { + time_t now = time(NULL); + time_t addedTime; + // Prefer the modification time if it's valid + if (g_advancedSettings.m_iVideoLibraryDateAdded == 1) + { + if (buffer.st_mtime != 0 && (time_t)buffer.st_mtime <= now) + addedTime = (time_t)buffer.st_mtime; + else + addedTime = (time_t)buffer.st_ctime; + } + // Use the newer of the creation and modification time + else + { + addedTime = max((time_t)buffer.st_ctime, (time_t)buffer.st_mtime); + // if the newer of the two dates is in the future, we try it with the older one + if (addedTime > now) + addedTime = min((time_t)buffer.st_ctime, (time_t)buffer.st_mtime); + } + + // make sure the datetime does is not in the future + if (addedTime <= now) + { + struct tm *time; +#ifdef HAVE_LOCALTIME_R + struct tm result = {}; + time = localtime_r(&addedTime, &result); +#else + time = localtime(&addedTime); +#endif + if (time) + dateAdded = *time; + } + } + } + if (!dateAdded.IsValid()) dateAdded = CDateTime::GetCurrentDateTime(); - m_pDS->exec(PrepareSQL("UPDATE files SET dateAdded='%s' WHERE idFile=%d", dateAdded.GetAsDBDateTime().c_str(), idFile)); + strSQL = PrepareSQL("update files set dateAdded='%s' where idFile=%d", dateAdded.GetAsDBDateTime().c_str(), idFile); + m_pDS->exec(strSQL.c_str()); } catch (...) { - CLog::Log(LOGERROR, "%s (%s, %s) failed", __FUNCTION__, CURL::GetRedacted(strFileNameAndPath).c_str(), dateAdded.GetAsDBDateTime().c_str()); + CLog::Log(LOGERROR, "%s unable to update dateadded for file (%s)", __FUNCTION__, strSQL.c_str()); } } @@ -905,7 +934,7 @@ if (idPath < 0) return false; std::string strSQL=PrepareSQL("update path set strHash='%s' where idPath=%ld", hash.c_str(), idPath); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return true; } @@ -927,12 +956,12 @@ if (bRemove) // delete link { std::string strSQL=PrepareSQL("delete from movielinktvshow where idMovie=%i and idShow=%i", idMovie, idShow); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return true; } std::string strSQL=PrepareSQL("insert into movielinktvshow (idShow,idMovie) values (%i,%i)", idShow,idMovie); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return true; } @@ -952,7 +981,7 @@ if (NULL == m_pDS.get()) return false; std::string strSQL=PrepareSQL("select * from movielinktvshow where idMovie=%i", idMovie); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->eof()) { m_pDS->close(); @@ -970,7 +999,7 @@ return false; } -bool CVideoDatabase::GetLinksToTvShow(int idMovie, std::vector& ids) +bool CVideoDatabase::GetLinksToTvShow(int idMovie, vector& ids) { try { @@ -978,7 +1007,7 @@ if (NULL == m_pDS.get()) return false; std::string strSQL=PrepareSQL("select * from movielinktvshow where idMovie=%i", idMovie); - m_pDS2->query(strSQL); + m_pDS2->query(strSQL.c_str()); while (!m_pDS2->eof()) { ids.push_back(m_pDS2->fv(1).get_asInt()); @@ -1012,7 +1041,7 @@ { std::string strSQL; strSQL=PrepareSQL("select idFile from files where strFileName='%s' and idPath=%i", strFileName.c_str(),idPath); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() > 0) { int idFile = m_pDS->fv("files.idFile").get_asInt(); @@ -1074,7 +1103,7 @@ strSQL=PrepareSQL("select idMovie from movie where idFile=%i", idFile); CLog::Log(LOGDEBUG, "%s (%s), query = %s", __FUNCTION__, CURL::GetRedacted(strFilenameAndPath).c_str(), strSQL.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() > 0) idMovie = m_pDS->fv("idMovie").get_asInt(); m_pDS->close(); @@ -1107,14 +1136,14 @@ int iFound=0; strSQL=PrepareSQL("select idShow from tvshowlinkpath where tvshowlinkpath.idPath=%i",idPath); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (!m_pDS->eof()) iFound = 1; while (iFound == 0 && URIUtils::GetParentPath(strPath1, strParent)) { strSQL=PrepareSQL("SELECT idShow FROM path INNER JOIN tvshowlinkpath ON tvshowlinkpath.idPath=path.idPath WHERE strPath='%s'",strParent.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (!m_pDS->eof()) { int idShow = m_pDS->fv("idShow").get_asInt(); @@ -1145,7 +1174,7 @@ if (NULL == m_pDS.get()) return -1; // need this due to the nested GetEpisodeInfo query - std::unique_ptr pDS; + unique_ptr pDS; pDS.reset(m_pDB->CreateDataset()); if (NULL == pDS.get()) return -1; @@ -1156,7 +1185,7 @@ std::string strSQL=PrepareSQL("select idEpisode from episode where idFile=%i", idFile); CLog::Log(LOGDEBUG, "%s (%s), query = %s", __FUNCTION__, CURL::GetRedacted(strFilenameAndPath).c_str(), strSQL.c_str()); - pDS->query(strSQL); + pDS->query(strSQL.c_str()); if (pDS->num_rows() > 0) { if (idEpisode == -1) @@ -1207,7 +1236,7 @@ std::string strSQL=PrepareSQL("select idMVideo from musicvideo where idFile=%i", idFile); CLog::Log(LOGDEBUG, "%s (%s), query = %s", __FUNCTION__, CURL::GetRedacted(strFilenameAndPath).c_str(), strSQL.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); int idMVideo=-1; if (m_pDS->num_rows() > 0) idMVideo = m_pDS->fv("idMVideo").get_asInt(); @@ -1238,7 +1267,7 @@ return -1; UpdateFileDateAdded(idFile, strFilenameAndPath); std::string strSQL=PrepareSQL("insert into movie (idMovie, idFile) values (NULL, %i)", idFile); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); idMovie = (int)m_pDS->lastinsertid(); } @@ -1313,7 +1342,7 @@ UpdateFileDateAdded(idFile, strFilenameAndPath); std::string strSQL=PrepareSQL("insert into episode (idEpisode, idFile, idShow) values (NULL, %i, %i)", idFile, idShow); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return (int)m_pDS->lastinsertid(); } catch (...) @@ -1338,7 +1367,7 @@ return -1; UpdateFileDateAdded(idFile, strFilenameAndPath); std::string strSQL=PrepareSQL("insert into musicvideo (idMVideo, idFile) values (NULL, %i)", idFile); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); idMVideo = (int)m_pDS->lastinsertid(); } @@ -1360,13 +1389,13 @@ if (NULL == m_pDS.get()) return -1; std::string strSQL = PrepareSQL("select %s from %s where %s like '%s'", firstField.c_str(), table.c_str(), secondField.c_str(), value.substr(0, 255).c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() == 0) { m_pDS->close(); // doesnt exists, add it strSQL = PrepareSQL("insert into %s (%s, %s) values(NULL, '%s')", table.c_str(), firstField.c_str(), secondField.c_str(), value.substr(0, 255).c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); int id = (int)m_pDS->lastinsertid(); return id; } @@ -1385,39 +1414,12 @@ return -1; } -int CVideoDatabase::AddSet(const std::string& strSet, const std::string& strOverview /* = "" */) +int CVideoDatabase::AddSet(const std::string& strSet) { if (strSet.empty()) return -1; - try - { - if (m_pDB.get() == nullptr || m_pDS.get() == nullptr) - return -1; - - std::string strSQL = PrepareSQL("SELECT idSet FROM sets WHERE strSet LIKE '%s'", strSet.c_str()); - m_pDS->query(strSQL); - if (m_pDS->num_rows() == 0) - { - m_pDS->close(); - strSQL = PrepareSQL("INSERT INTO sets (idSet, strSet, strOverview) VALUES(NULL, '%s', '%s')", strSet.c_str(), strOverview.c_str()); - m_pDS->exec(strSQL); - int id = static_cast(m_pDS->lastinsertid()); - return id; - } - else - { - int id = m_pDS->fv("idSet").get_asInt(); - m_pDS->close(); - return id; - } - } - catch (...) - { - CLog::Log(LOGERROR, "%s (%s) failed", __FUNCTION__, strSet.c_str()); - } - - return -1; + return AddToTable("sets", "idSet", "strSet", strSet); } int CVideoDatabase::AddTag(const std::string& name) @@ -1441,13 +1443,13 @@ StringUtils::Trim(trimmedName); std::string strSQL=PrepareSQL("select actor_id from actor where name like '%s'", trimmedName.substr(0, 255).c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (m_pDS->num_rows() == 0) { m_pDS->close(); // doesnt exists, add it strSQL=PrepareSQL("insert into actor (actor_id, name, art_urls) values(NULL, '%s', '%s')", trimmedName.substr(0,255).c_str(), thumbURLs.c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); idActor = (int)m_pDS->lastinsertid(); } else @@ -1458,7 +1460,7 @@ if (!thumbURLs.empty()) { strSQL=PrepareSQL("update actor set art_urls = '%s' where actor_id = %i", thumbURLs.c_str(), idActor); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } } // add artwork @@ -1682,28 +1684,28 @@ std::string strSQL; strSQL=PrepareSQL("DELETE from genre_link WHERE media_id=%i AND media_type='tvshow'", idTvShow); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); strSQL=PrepareSQL("DELETE FROM actor_link WHERE media_id=%i AND media_type='tvshow'", idTvShow); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); strSQL=PrepareSQL("DELETE FROM director_link WHERE media_id=%i AND media_type='tvshow'", idTvShow); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); strSQL=PrepareSQL("DELETE FROM studio_link WHERE media_id=%i AND media_type='tvshow'", idTvShow); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); // remove all info other than the id // we do this due to the way we have the link between the file + movie tables. - std::vector ids; + std::vector ids; for (int iType = VIDEODB_ID_TV_MIN + 1; iType < VIDEODB_ID_TV_MAX; iType++) ids.push_back(StringUtils::Format("c%02d=NULL", iType)); strSQL = "update tvshow set "; strSQL += StringUtils::Join(ids, ", "); strSQL += PrepareSQL(" where idShow=%i", idTvShow); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } catch (...) { @@ -1760,7 +1762,7 @@ strSQL=PrepareSQL("select distinct * from musicvideo_view join actor_link on actor_link.media_id=musicvideo_view.idMVideo AND actor_link.media_type='musicvideo' join actor on actor.actor_id=actor_link.actor_id"); else strSQL=PrepareSQL("select * from musicvideo_view join actor_link on actor_link.media_id=musicvideo_view.idMVideo AND actor_link.media_type='musicvideo' join actor on actor.actor_id=actor_link.actor_id where actor.name='%s'", strArtist.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { @@ -1789,7 +1791,7 @@ if (idMovie < 0) return false; std::string sql = PrepareSQL("select * from movie_view where idMovie=%i", idMovie); - if (!m_pDS->query(sql)) + if (!m_pDS->query(sql.c_str())) return false; details = GetDetailsForMovie(m_pDS, true); return !details.IsEmpty(); @@ -1811,7 +1813,7 @@ if (idTvShow < 0) return false; std::string sql = PrepareSQL("SELECT * FROM tvshow_view WHERE idShow=%i GROUP BY idShow", idTvShow); - if (!m_pDS->query(sql)) + if (!m_pDS->query(sql.c_str())) return false; details = GetDetailsForTvShow(m_pDS, true, item); return !details.IsEmpty(); @@ -1834,7 +1836,7 @@ return false; std::string sql = PrepareSQL("SELECT idShow FROM seasons WHERE idSeason=%i", idSeason); - if (!m_pDS->query(sql)) + if (!m_pDS->query(sql.c_str())) return false; int idShow = -1; @@ -1877,7 +1879,7 @@ if (idEpisode < 0) return false; std::string sql = PrepareSQL("select * from episode_view where idEpisode=%i",idEpisode); - if (!m_pDS->query(sql)) + if (!m_pDS->query(sql.c_str())) return false; details = GetDetailsForEpisode(m_pDS, true); return !details.IsEmpty(); @@ -1899,7 +1901,7 @@ if (idMVideo < 0) return false; std::string sql = PrepareSQL("select * from musicvideo_view where idMVideo=%i", idMVideo); - if (!m_pDS->query(sql)) + if (!m_pDS->query(sql.c_str())) return false; details = GetDetailsForMusicVideo(m_pDS, true); return !details.IsEmpty(); @@ -1949,14 +1951,14 @@ "JOIN path ON path.idPath = files.idPath " "LEFT JOIN bookmark ON bookmark.idFile = files.idFile AND bookmark.type = %i " "WHERE files.idFile = %i", CBookmark::RESUME, idFile); - if (!m_pDS->query(sql)) + if (!m_pDS->query(sql.c_str())) return false; details.m_iFileId = m_pDS->fv("files.idFile").get_asInt(); details.m_strPath = m_pDS->fv("path.strPath").get_asString(); std::string strFileName = m_pDS->fv("files.strFilename").get_asString(); ConstructPath(details.m_strFileNameAndPath, details.m_strPath, strFileName); - details.m_playCount = std::max(details.m_playCount, m_pDS->fv("files.playCount").get_asInt()); + details.m_playCount = max(details.m_playCount, m_pDS->fv("files.playCount").get_asInt()); if (!details.m_lastPlayed.IsValid()) details.m_lastPlayed.SetFromDBDateTime(m_pDS->fv("files.lastPlayed").get_asString()); if (!details.m_dateAdded.IsValid()) @@ -2040,7 +2042,7 @@ return SetDetailsForMovieSet(details, artwork, id); else if (mediaType == MediaTypeTvShow) { - std::map > seasonArtwork; + map > seasonArtwork; if (!UpdateDetailsForTvShow(id, details, artwork, seasonArtwork)) return -1; @@ -2056,8 +2058,7 @@ return -1; } -int CVideoDatabase::SetDetailsForMovie(const std::string& strFilenameAndPath, const CVideoInfoTag& details, - const std::map &artwork, int idMovie /* = -1 */) +int CVideoDatabase::SetDetailsForMovie(const std::string& strFilenameAndPath, const CVideoInfoTag& details, const map &artwork, int idMovie /* = -1 */) { try { @@ -2093,9 +2094,9 @@ int idSet = -1; if (!details.m_strSet.empty()) { - idSet = AddSet(details.m_strSet, details.m_strSetOverview); + idSet = AddSet(details.m_strSet); // add art if not available - std::map setArt; + map setArt; if (!GetArtForItem(idSet, MediaTypeVideoCollection, setArt)) SetArtForItem(idSet, MediaTypeVideoCollection, artwork); } @@ -2108,7 +2109,7 @@ if (!details.m_strIMDBNumber.empty() && details.m_iYear) { // query DB for any movies matching imdbid and year std::string strSQL = PrepareSQL("SELECT files.playCount, files.lastPlayed FROM movie INNER JOIN files ON files.idFile=movie.idFile WHERE movie.c%02d='%s' AND movie.c%02d=%i AND movie.idMovie!=%i AND files.playCount > 0", VIDEODB_ID_IDENT, details.m_strIMDBNumber.c_str(), VIDEODB_ID_YEAR, details.m_iYear, idMovie); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); if (!m_pDS->eof()) { @@ -2121,24 +2122,20 @@ // update with playCount and lastPlayed strSQL = PrepareSQL("update files set playCount=%i,lastPlayed='%s' where idFile=%i", playCount, lastPlayed.GetAsDBDateTime().c_str(), idFile); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } m_pDS->close(); } // update our movie table (we know it was added already above) // and insert the new row - std::string sql = "UPDATE movie SET " + GetValueString(details, VIDEODB_ID_MIN, VIDEODB_ID_MAX, DbMovieOffsets); + std::string sql = "update movie set " + GetValueString(details, VIDEODB_ID_MIN, VIDEODB_ID_MAX, DbMovieOffsets); if (idSet > 0) sql += PrepareSQL(", idSet = %i", idSet); else sql += ", idSet = NULL"; - if (details.m_iUserRating > 0 && details.m_iUserRating < 11) - sql += PrepareSQL(", userrating = %i", details.m_iUserRating); - else - sql += ", userrating = NULL"; sql += PrepareSQL(" where idMovie=%i", idMovie); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); CommitTransaction(); return idMovie; @@ -2185,9 +2182,9 @@ idSet = -1; if (!details.m_strSet.empty()) { - idSet = AddSet(details.m_strSet, details.m_strSetOverview); + idSet = AddSet(details.m_strSet); // add art if not available - std::map setArt; + map setArt; if (!GetArtForItem(idSet, "set", setArt)) SetArtForItem(idSet, "set", artwork); } @@ -2196,7 +2193,7 @@ if (updatedDetails.find("showlink") != updatedDetails.end()) { // remove existing links - std::vector tvShowIds; + vector tvShowIds; GetLinksToTvShow(idMovie, tvShowIds); for (const auto& idTVShow : tvShowIds) LinkMovieToTvshow(idMovie, idTVShow, true); @@ -2214,15 +2211,11 @@ } // and update the movie table - std::string sql = "UPDATE movie SET " + GetValueString(details, VIDEODB_ID_MIN, VIDEODB_ID_MAX, DbMovieOffsets); + std::string sql = "update movie set " + GetValueString(details, VIDEODB_ID_MIN, VIDEODB_ID_MAX, DbMovieOffsets); if (idSet > 0) sql += PrepareSQL(", idSet = %i", idSet); else if (idSet < 0) sql += ", idSet = NULL"; - if (details.m_iUserRating > 0 && details.m_iUserRating < 11) - sql += PrepareSQL(", userrating = %i", details.m_iUserRating); - else - sql += ", userrating = NULL"; sql += PrepareSQL(" where idMovie=%i", idMovie); m_pDS->exec(sql); @@ -2250,7 +2243,7 @@ BeginTransaction(); if (idSet < 0) { - idSet = AddSet(details.m_strTitle, details.m_strPlot); + idSet = AddSet(details.m_strTitle); if (idSet < 0) { RollbackTransaction(); @@ -2261,8 +2254,8 @@ SetArtForItem(idSet, MediaTypeVideoCollection, artwork); // and insert the new row - std::string sql = PrepareSQL("UPDATE sets SET strSet='%s', strOverview='%s' WHERE idSet=%i", details.m_strTitle.c_str(), details.m_strPlot.c_str(), idSet); - m_pDS->exec(sql); + std::string sql = PrepareSQL("UPDATE sets SET strSet='%s' WHERE idSet=%i", details.m_strTitle.c_str(), idSet); + m_pDS->exec(sql.c_str()); CommitTransaction(); return idSet; @@ -2286,9 +2279,7 @@ return id; } -int CVideoDatabase::SetDetailsForTvShow(const std::vector > &paths, - const CVideoInfoTag& details, const std::map &artwork, - const std::map > &seasonArt, int idTvShow /*= -1 */) +int CVideoDatabase::SetDetailsForTvShow(const vector< pair > &paths, const CVideoInfoTag& details, const map &artwork, const map > &seasonArt, int idTvShow /*= -1 */) { /* @@ -2302,7 +2293,7 @@ if (idTvShow < 0) { - for (std::vector>::const_iterator i = paths.begin(); i != paths.end(); ++i) + for (vector< pair >::const_iterator i = paths.begin(); i != paths.end(); ++i) { idTvShow = GetTvShowId(i->first); if (idTvShow > -1) @@ -2319,7 +2310,7 @@ } // add any paths to the tvshow - for (std::vector>::const_iterator i = paths.begin(); i != paths.end(); ++i) + for (vector< pair >::const_iterator i = paths.begin(); i != paths.end(); ++i) AddPathToTvShow(idTvShow, i->first, i->second); UpdateDetailsForTvShow(idTvShow, details, artwork, seasonArt); @@ -2327,8 +2318,7 @@ return idTvShow; } -bool CVideoDatabase::UpdateDetailsForTvShow(int idTvShow, const CVideoInfoTag &details, - const std::map &artwork, const std::map> &seasonArt) +bool CVideoDatabase::UpdateDetailsForTvShow(int idTvShow, const CVideoInfoTag &details, const map &artwork, const map > &seasonArt) { BeginTransaction(); @@ -2343,23 +2333,8 @@ // add "all seasons" - the rest are added in SetDetailsForEpisode AddSeason(idTvShow, -1); - // add any named seasons - for (const auto& namedSeason : details.m_namedSeasons) - { - // make sure the named season exists - int seasonId = AddSeason(idTvShow, namedSeason.first); - - // get any existing details for the named season - CVideoInfoTag season; - if (!GetSeasonInfo(seasonId, season) || season.m_strSortTitle == namedSeason.second) - continue; - - season.SetSortTitle(namedSeason.second); - SetDetailsForSeason(season, std::map(), idTvShow, seasonId); - } - SetArtForItem(idTvShow, MediaTypeTvShow, artwork); - for (std::map>::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) + for (map >::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) { int idSeason = AddSeason(idTvShow, i->first); if (idSeason > -1) @@ -2368,10 +2343,6 @@ // and insert the new row std::string sql = "UPDATE tvshow SET " + GetValueString(details, VIDEODB_ID_TV_MIN, VIDEODB_ID_TV_MAX, DbTvShowOffsets); - if (details.m_iUserRating > 0 && details.m_iUserRating < 11) - sql += PrepareSQL(", userrating = %i", details.m_iUserRating); - else - sql += ", userrating = NULL"; sql += PrepareSQL(" WHERE idShow=%i", idTvShow); if (ExecuteQuery(sql)) { @@ -2382,10 +2353,9 @@ return false; } -int CVideoDatabase::SetDetailsForSeason(const CVideoInfoTag& details, const std::map &artwork, int idShow, int idSeason /* = -1 */) +int CVideoDatabase::SetDetailsForSeason(const CVideoInfoTag& details, const std::map &artwork, int idShow, int idSeason /* = -1 */) { - if (idShow < 0 || details.m_iSeason < -1) + if (idShow < 0 || details.m_iSeason < 0) return -1; try @@ -2404,10 +2374,7 @@ SetArtForItem(idSeason, MediaTypeSeason, artwork); // and insert the new row - std::string sql = PrepareSQL("UPDATE seasons SET season=%i", details.m_iSeason); - if (!details.m_strSortTitle.empty()) - sql += PrepareSQL(", name='%s'", details.m_strSortTitle.c_str()); - sql += PrepareSQL(" WHERE idSeason=%i", idSeason); + std::string sql = PrepareSQL("UPDATE seasons SET season=%i WHERE idSeason=%i", details.m_iSeason, idSeason); m_pDS->exec(sql.c_str()); CommitTransaction(); @@ -2421,8 +2388,7 @@ return -1; } -int CVideoDatabase::SetDetailsForEpisode(const std::string& strFilenameAndPath, const CVideoInfoTag& details, - const std::map &artwork, int idShow, int idEpisode) +int CVideoDatabase::SetDetailsForEpisode(const std::string& strFilenameAndPath, const CVideoInfoTag& details, const map &artwork, int idShow, int idEpisode) { try { @@ -2458,19 +2424,14 @@ } // ensure we have this season already added - int idSeason = AddSeason(idShow, details.m_iSeason); + AddSeason(idShow, details.m_iSeason); SetArtForItem(idEpisode, MediaTypeEpisode, artwork); if (details.m_iEpisode != -1 && details.m_iSeason != -1) { // query DB for any episodes matching idShow, Season and Episode - std::string strSQL = PrepareSQL("SELECT files.playCount, files.lastPlayed " - "FROM episode INNER JOIN files ON files.idFile=episode.idFile " - "WHERE episode.c%02d=%i AND episode.c%02d=%i AND episode.idShow=%i " - "AND episode.idEpisode!=%i AND files.playCount > 0", - VIDEODB_ID_EPISODE_SEASON, details.m_iSeason, VIDEODB_ID_EPISODE_EPISODE, - details.m_iEpisode, idShow, idEpisode); - m_pDS->query(strSQL); + std::string strSQL = PrepareSQL("SELECT files.playCount, files.lastPlayed FROM episode INNER JOIN files ON files.idFile=episode.idFile WHERE episode.c%02d=%i AND episode.c%02d=%i AND episode.idShow=%i AND episode.idEpisode!=%i AND files.playCount > 0", VIDEODB_ID_EPISODE_SEASON, details.m_iSeason, VIDEODB_ID_EPISODE_EPISODE, details.m_iEpisode, idShow, idEpisode); + m_pDS->query(strSQL.c_str()); if (!m_pDS->eof()) { @@ -2483,20 +2444,15 @@ // update with playCount and lastPlayed strSQL = PrepareSQL("update files set playCount=%i,lastPlayed='%s' where idFile=%i", playCount, lastPlayed.GetAsDBDateTime().c_str(), idFile); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } m_pDS->close(); } // and insert the new row - std::string sql = "UPDATE episode SET " + GetValueString(details, VIDEODB_ID_EPISODE_MIN, VIDEODB_ID_EPISODE_MAX, DbEpisodeOffsets); - if (details.m_iUserRating > 0 && details.m_iUserRating < 11) - sql += PrepareSQL(", userrating = %i", details.m_iUserRating); - else - sql += ", userrating = NULL"; - sql += PrepareSQL(", idSeason = %i", idSeason); + std::string sql = "update episode set " + GetValueString(details, VIDEODB_ID_EPISODE_MIN, VIDEODB_ID_EPISODE_MAX, DbEpisodeOffsets); sql += PrepareSQL(" where idEpisode=%i", idEpisode); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); CommitTransaction(); return idEpisode; @@ -2523,14 +2479,13 @@ int seasonId = GetSeasonId(showID, season); if (seasonId < 0) { - if (ExecuteQuery(PrepareSQL("INSERT INTO seasons (idShow,season,name) VALUES(%i,%i,'')", showID, season))) + if (ExecuteQuery(PrepareSQL("INSERT INTO seasons (idShow,season) VALUES(%i,%i)", showID, season))) seasonId = (int)m_pDS->lastinsertid(); } return seasonId; } -int CVideoDatabase::SetDetailsForMusicVideo(const std::string& strFilenameAndPath, const CVideoInfoTag& details, - const std::map &artwork, int idMVideo /* = -1 */) +int CVideoDatabase::SetDetailsForMusicVideo(const std::string& strFilenameAndPath, const CVideoInfoTag& details, const map &artwork, int idMVideo /* = -1 */) { try { @@ -2567,13 +2522,9 @@ // update our movie table (we know it was added already above) // and insert the new row - std::string sql = "UPDATE musicvideo SET " + GetValueString(details, VIDEODB_ID_MUSICVIDEO_MIN, VIDEODB_ID_MUSICVIDEO_MAX, DbMusicVideoOffsets); - if (details.m_iUserRating > 0 && details.m_iUserRating < 11) - sql += PrepareSQL(", userrating = %i", details.m_iUserRating); - else - sql += ", userrating = NULL"; + std::string sql = "update musicvideo set " + GetValueString(details, VIDEODB_ID_MUSICVIDEO_MIN, VIDEODB_ID_MUSICVIDEO_MAX, DbMusicVideoOffsets); sql += PrepareSQL(" where idMVideo=%i", idMVideo); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); CommitTransaction(); return idMVideo; @@ -2636,11 +2587,11 @@ // update the runtime information, if empty if (details.GetVideoDuration()) { - std::vector > tables; - tables.push_back(std::make_pair("movie", VIDEODB_ID_RUNTIME)); - tables.push_back(std::make_pair("episode", VIDEODB_ID_EPISODE_RUNTIME)); - tables.push_back(std::make_pair("musicvideo", VIDEODB_ID_MUSICVIDEO_RUNTIME)); - for (std::vector >::iterator i = tables.begin(); i != tables.end(); ++i) + vector< pair > tables; + tables.push_back(make_pair("movie", VIDEODB_ID_RUNTIME)); + tables.push_back(make_pair("episode", VIDEODB_ID_EPISODE_RUNTIME)); + tables.push_back(make_pair("musicvideo", VIDEODB_ID_MUSICVIDEO_RUNTIME)); + for (vector< pair >::iterator i = tables.begin(); i != tables.end(); ++i) { std::string sql = PrepareSQL("update %s set c%02d=%d where idFile=%d and c%02d=''", i->first.c_str(), i->second, details.GetVideoDuration(), idFile, i->second); @@ -2677,7 +2628,7 @@ if (iType ==VIDEODB_CONTENT_MUSICVIDEOS) strSQL=PrepareSQL("SELECT path.strPath, files.strFileName FROM path INNER JOIN files ON path.idPath=files.idPath INNER JOIN musicvideo ON files.idFile=musicvideo.idFile WHERE musicvideo.idMVideo=%i ORDER BY strFilename", idMovie ); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); if (!m_pDS->eof()) { if (iType != VIDEODB_CONTENT_TVSHOWS) @@ -2722,7 +2673,7 @@ if (NULL == m_pDS.get()) return ; std::string strSQL=PrepareSQL("select * from bookmark where idFile=%i and type=%i order by timeInSeconds", idFile, (int)type); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { CBookmark bookmark; @@ -2736,7 +2687,7 @@ if (type == CBookmark::EPISODE) { std::string strSQL2=PrepareSQL("select c%02d, c%02d from episode where c%02d=%i order by c%02d, c%02d", VIDEODB_ID_EPISODE_EPISODE, VIDEODB_ID_EPISODE_SEASON, VIDEODB_ID_EPISODE_BOOKMARK, m_pDS->fv("idBookmark").get_asInt(), VIDEODB_ID_EPISODE_SORTSEASON, VIDEODB_ID_EPISODE_SORTEPISODE); - m_pDS2->query(strSQL2); + m_pDS2->query(strSQL2.c_str()); bookmark.episodeNumber = m_pDS2->fv(0).get_asInt(); bookmark.seasonNumber = m_pDS2->fv(1).get_asInt(); m_pDS2->close(); @@ -2778,7 +2729,7 @@ try { std::string sql = PrepareSQL("delete from bookmark where idFile=%i and type=%i", fileID, CBookmark::RESUME); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } catch(...) { @@ -2786,12 +2737,12 @@ } } -void CVideoDatabase::GetEpisodesByFile(const std::string& strFilenameAndPath, std::vector& episodes) +void CVideoDatabase::GetEpisodesByFile(const std::string& strFilenameAndPath, vector& episodes) { try { std::string strSQL = PrepareSQL("select * from episode_view where idFile=%i order by c%02d, c%02d asc", GetFileId(strFilenameAndPath), VIDEODB_ID_EPISODE_SORTSEASON, VIDEODB_ID_EPISODE_SORTEPISODE); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); while (!m_pDS->eof()) { episodes.push_back(GetDetailsForEpisode(m_pDS)); @@ -2833,7 +2784,7 @@ if (type != CBookmark::EPISODE) { // get current id - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); if (m_pDS->num_rows() != 0) idBookmark = m_pDS->get_field_value("idBookmark").get_asInt(); m_pDS->close(); @@ -2844,7 +2795,7 @@ else strSQL=PrepareSQL("insert into bookmark (idBookmark, idFile, timeInSeconds, totalTimeInSeconds, thumbNailImage, player, playerState, type) values(NULL,%i,%f,%f,'%s','%s','%s', %i)", idFile, bookmark.timeInSeconds, bookmark.totalTimeInSeconds, bookmark.thumbNailImage.c_str(), bookmark.player.c_str(), bookmark.playerState.c_str(), (int)type); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } catch (...) { @@ -2867,16 +2818,16 @@ double maxtime = bookmark.timeInSeconds + 0.5f; std::string strSQL = PrepareSQL("select idBookmark from bookmark where idFile=%i and type=%i and playerState like '%s' and player like '%s' and (timeInSeconds between %f and %f)", idFile, type, bookmark.playerState.c_str(), bookmark.player.c_str(), mintime, maxtime); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); if (m_pDS->num_rows() != 0) { int idBookmark = m_pDS->get_field_value("idBookmark").get_asInt(); strSQL=PrepareSQL("delete from bookmark where idBookmark=%i",idBookmark); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); if (type == CBookmark::EPISODE) { strSQL=PrepareSQL("update episode set c%02d=-1 where idFile=%i and c%02d=%i", VIDEODB_ID_EPISODE_BOOKMARK, idFile, VIDEODB_ID_EPISODE_BOOKMARK, idBookmark); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } } @@ -2907,11 +2858,11 @@ if (NULL == m_pDS.get()) return ; std::string strSQL=PrepareSQL("delete from bookmark where idFile=%i and type=%i", idFile, (int)type); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); if (type == CBookmark::EPISODE) { strSQL=PrepareSQL("update episode set c%02d=-1 where idFile=%i", VIDEODB_ID_EPISODE_BOOKMARK, idFile); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } } catch (...) @@ -2926,7 +2877,7 @@ try { std::string strSQL = PrepareSQL("select bookmark.* from bookmark join episode on episode.c%02d=bookmark.idBookmark where episode.idEpisode=%i", VIDEODB_ID_EPISODE_BOOKMARK, tag.m_iDbId); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); if (!m_pDS->eof()) { bookmark.timeInSeconds = m_pDS->fv("timeInSeconds").get_asDouble(); @@ -2958,12 +2909,12 @@ int idFile = GetFileId(tag.m_strFileNameAndPath); // delete the current episode for the selected episode number std::string strSQL = PrepareSQL("delete from bookmark where idBookmark in (select c%02d from episode where c%02d=%i and c%02d=%i and idFile=%i)", VIDEODB_ID_EPISODE_BOOKMARK, VIDEODB_ID_EPISODE_SEASON, tag.m_iSeason, VIDEODB_ID_EPISODE_EPISODE, tag.m_iEpisode, idFile); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); AddBookMarkToFile(tag.m_strFileNameAndPath, bookmark, CBookmark::EPISODE); int idBookmark = (int)m_pDS->lastinsertid(); strSQL = PrepareSQL("update episode set c%02d=%i where c%02d=%i and c%02d=%i and idFile=%i", VIDEODB_ID_EPISODE_BOOKMARK, idBookmark, VIDEODB_ID_EPISODE_SEASON, tag.m_iSeason, VIDEODB_ID_EPISODE_EPISODE, tag.m_iEpisode, idFile); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } catch (...) { @@ -2976,9 +2927,9 @@ try { std::string strSQL = PrepareSQL("delete from bookmark where idBookmark in (select c%02d from episode where idEpisode=%i)", VIDEODB_ID_EPISODE_BOOKMARK, tag.m_iDbId); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); strSQL = PrepareSQL("update episode set c%02d=-1 where idEpisode=%i", VIDEODB_ID_EPISODE_BOOKMARK, tag.m_iDbId); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } catch (...) { @@ -3017,7 +2968,7 @@ InvalidatePathHash(path); std::string strSQL = PrepareSQL("delete from movie where idMovie=%i", idMovie); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } // TODO: move this below CommitTransaction() once UPnP doesn't rely on this anymore @@ -3053,11 +3004,11 @@ BeginTransaction(); - std::set paths; + set paths; GetPathsForTvShow(idTvShow, paths); std::string strSQL=PrepareSQL("SELECT episode.idEpisode FROM episode WHERE episode.idShow=%i",idTvShow); - m_pDS2->query(strSQL); + m_pDS2->query(strSQL.c_str()); while (!m_pDS2->eof()) { DeleteEpisode(m_pDS2->fv(0).get_asInt(), bKeepId); @@ -3067,15 +3018,15 @@ DeleteDetailsForTvShow(idTvShow); strSQL=PrepareSQL("delete from seasons where idShow=%i", idTvShow); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); // keep tvshow table and movielink table so we can update data in place if (!bKeepId) { strSQL=PrepareSQL("delete from tvshow where idShow=%i", idTvShow); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); - for (std::set::const_iterator i = paths.begin(); i != paths.end(); ++i) + for (set::const_iterator i = paths.begin(); i != paths.end(); ++i) { std::string path = GetSingleValue(PrepareSQL("SELECT strPath FROM path WHERE idPath=%i", *i)); if (!path.empty()) @@ -3114,7 +3065,7 @@ std::string strSQL = PrepareSQL("SELECT episode.idEpisode FROM episode " "JOIN seasons ON seasons.idSeason = %d AND episode.idShow = seasons.idShow AND episode.c%02d = seasons.season ", idSeason, VIDEODB_ID_EPISODE_SEASON); - m_pDS2->query(strSQL); + m_pDS2->query(strSQL.c_str()); while (!m_pDS2->eof()) { DeleteEpisode(m_pDS2->fv(0).get_asInt(), bKeepId); @@ -3163,7 +3114,7 @@ InvalidatePathHash(path); std::string strSQL = PrepareSQL("delete from episode where idEpisode=%i", idEpisode); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } } @@ -3202,7 +3153,7 @@ InvalidatePathHash(path); std::string strSQL = PrepareSQL("delete from musicvideo where idMVideo=%i", idMVideo); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } //TODO: move this below CommitTransaction() once UPnP doesn't rely on this anymore @@ -3245,9 +3196,9 @@ std::string strSQL; strSQL=PrepareSQL("delete from sets where idSet = %i", idSet); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); strSQL=PrepareSQL("update movie set idSet = null where idSet = %i", idSet); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } catch (...) { @@ -3286,7 +3237,7 @@ return; std::string strSQL = PrepareSQL("DELETE FROM tag_link WHERE tag_id = %i AND media_type = '%s'", idTag, type.c_str()); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } catch (...) { @@ -3294,7 +3245,7 @@ } } -void CVideoDatabase::GetDetailsFromDB(std::unique_ptr &pDS, int min, int max, const SDbTableOffsets *offsets, CVideoInfoTag &details, int idxOffset) +void CVideoDatabase::GetDetailsFromDB(unique_ptr &pDS, int min, int max, const SDbTableOffsets *offsets, CVideoInfoTag &details, int idxOffset) { GetDetailsFromDB(pDS->get_sql_record(), min, max, offsets, details, idxOffset); } @@ -3393,11 +3344,11 @@ CStreamDetails& details = tag.m_streamDetails; details.Reset(); - std::unique_ptr pDS(m_pDB->CreateDataset()); + unique_ptr pDS(m_pDB->CreateDataset()); try { std::string strSQL = PrepareSQL("SELECT * FROM streamdetails WHERE idFile = %i", tag.m_iFileId); - pDS->query(strSQL); + pDS->query(strSQL.c_str()); while (!pDS->eof()) { @@ -3488,7 +3439,7 @@ else { std::string strSQL=PrepareSQL("select timeInSeconds, totalTimeInSeconds from bookmark where idFile=%i and type=%i order by timeInSeconds", tag.m_iFileId, CBookmark::RESUME); - m_pDS2->query( strSQL ); + m_pDS2->query( strSQL.c_str() ); if (!m_pDS2->eof()) { tag.m_resumePoint.timeInSeconds = m_pDS2->fv(0).get_asDouble(); @@ -3508,7 +3459,7 @@ return match; } -CVideoInfoTag CVideoDatabase::GetDetailsForMovie(std::unique_ptr &pDS, bool getDetails /* = false */) +CVideoInfoTag CVideoDatabase::GetDetailsForMovie(unique_ptr &pDS, bool getDetails /* = false */) { return GetDetailsForMovie(pDS->get_sql_record(), getDetails); } @@ -3530,7 +3481,6 @@ details.m_iSetId = record->at(VIDEODB_DETAILS_MOVIE_SET_ID).get_asInt(); details.m_strSet = record->at(VIDEODB_DETAILS_MOVIE_SET_NAME).get_asString(); - details.m_strSetOverview = record->at(VIDEODB_DETAILS_MOVIE_SET_OVERVIEW).get_asString(); details.m_iFileId = record->at(VIDEODB_DETAILS_FILEID).get_asInt(); details.m_strPath = record->at(VIDEODB_DETAILS_MOVIE_PATH).get_asString(); std::string strFileName = record->at(VIDEODB_DETAILS_MOVIE_FILE).get_asString(); @@ -3541,7 +3491,7 @@ details.m_resumePoint.timeInSeconds = record->at(VIDEODB_DETAILS_MOVIE_RESUME_TIME).get_asInt(); details.m_resumePoint.totalTimeInSeconds = record->at(VIDEODB_DETAILS_MOVIE_TOTAL_TIME).get_asInt(); details.m_resumePoint.type = CBookmark::RESUME; - details.m_iUserRating = record->at(VIDEODB_DETAILS_MOVIE_USER_RATING).get_asInt(); + movieTime += XbmcThreads::SystemClockMillis() - time; time = XbmcThreads::SystemClockMillis(); if (getDetails) @@ -3553,13 +3503,13 @@ details.m_strPictureURL.Parse(); // create tvshowlink string - std::vector links; + vector links; GetLinksToTvShow(idMovie,links); for (unsigned int i=0;iquery(strSQL); + m_pDS2->query(strSQL.c_str()); if (!m_pDS2->eof()) details.m_showLink.push_back(m_pDS2->fv(0).get_asString()); } @@ -3571,7 +3521,7 @@ return details; } -CVideoInfoTag CVideoDatabase::GetDetailsForTvShow(std::unique_ptr &pDS, bool getDetails /* = false */, CFileItem* item /* = NULL */) +CVideoInfoTag CVideoDatabase::GetDetailsForTvShow(unique_ptr &pDS, bool getDetails /* = false */, CFileItem* item /* = NULL */) { return GetDetailsForTvShow(pDS->get_sql_record(), getDetails, item); } @@ -3600,7 +3550,6 @@ details.m_strShowTitle = details.m_strTitle; if (details.m_premiered.IsValid()) details.m_iYear = details.m_premiered.GetYear(); - details.m_iUserRating = record->at(VIDEODB_DETAILS_TVSHOW_USER_RATING).get_asInt(); movieTime += XbmcThreads::SystemClockMillis() - time; time = XbmcThreads::SystemClockMillis(); @@ -3627,7 +3576,7 @@ return details; } -CVideoInfoTag CVideoDatabase::GetDetailsForEpisode(std::unique_ptr &pDS, bool getDetails /* = false */) +CVideoInfoTag CVideoDatabase::GetDetailsForEpisode(unique_ptr &pDS, bool getDetails /* = false */) { return GetDetailsForEpisode(pDS->get_sql_record(), getDetails); } @@ -3654,7 +3603,6 @@ details.m_dateAdded.SetFromDBDateTime(record->at(VIDEODB_DETAILS_EPISODE_DATEADDED).get_asString()); details.m_strMPAARating = record->at(VIDEODB_DETAILS_EPISODE_TVSHOW_MPAA).get_asString(); details.m_strShowTitle = record->at(VIDEODB_DETAILS_EPISODE_TVSHOW_NAME).get_asString(); - details.m_genre = StringUtils::Split(record->at(VIDEODB_DETAILS_EPISODE_TVSHOW_GENRE).get_asString(), g_advancedSettings.m_videoItemSeparator); details.m_studio = StringUtils::Split(record->at(VIDEODB_DETAILS_EPISODE_TVSHOW_STUDIO).get_asString(), g_advancedSettings.m_videoItemSeparator); details.m_premiered.SetFromDBDate(record->at(VIDEODB_DETAILS_EPISODE_TVSHOW_AIRED).get_asString()); details.m_iIdShow = record->at(VIDEODB_DETAILS_EPISODE_TVSHOW_ID).get_asInt(); @@ -3663,7 +3611,6 @@ details.m_resumePoint.timeInSeconds = record->at(VIDEODB_DETAILS_EPISODE_RESUME_TIME).get_asInt(); details.m_resumePoint.totalTimeInSeconds = record->at(VIDEODB_DETAILS_EPISODE_TOTAL_TIME).get_asInt(); details.m_resumePoint.type = CBookmark::RESUME; - details.m_iUserRating = record->at(VIDEODB_DETAILS_EPISODE_USER_RATING).get_asInt(); movieTime += XbmcThreads::SystemClockMillis() - time; time = XbmcThreads::SystemClockMillis(); @@ -3675,7 +3622,7 @@ castTime += XbmcThreads::SystemClockMillis() - time; time = XbmcThreads::SystemClockMillis(); details.m_strPictureURL.Parse(); std::string strSQL = PrepareSQL("select * from bookmark join episode on episode.c%02d=bookmark.idBookmark where episode.idEpisode=%i and bookmark.type=%i", VIDEODB_ID_EPISODE_BOOKMARK,details.m_iDbId,CBookmark::EPISODE); - m_pDS2->query(strSQL); + m_pDS2->query(strSQL.c_str()); if (!m_pDS2->eof()) details.m_fEpBookmark = m_pDS2->fv("bookmark.timeInSeconds").get_asFloat(); m_pDS2->close(); @@ -3686,7 +3633,7 @@ return details; } -CVideoInfoTag CVideoDatabase::GetDetailsForMusicVideo(std::unique_ptr &pDS, bool getDetails /* = false */) +CVideoInfoTag CVideoDatabase::GetDetailsForMusicVideo(unique_ptr &pDS, bool getDetails /* = false */) { return GetDetailsForMusicVideo(pDS->get_sql_record(), getDetails); } @@ -3712,8 +3659,7 @@ details.m_resumePoint.timeInSeconds = record->at(VIDEODB_DETAILS_MUSICVIDEO_RESUME_TIME).get_asInt(); details.m_resumePoint.totalTimeInSeconds = record->at(VIDEODB_DETAILS_MUSICVIDEO_TOTAL_TIME).get_asInt(); details.m_resumePoint.type = CBookmark::RESUME; - details.m_iUserRating = record->at(VIDEODB_DETAILS_MUSICVIDEO_USER_RATING).get_asInt(); - + movieTime += XbmcThreads::SystemClockMillis() - time; time = XbmcThreads::SystemClockMillis(); if (getDetails) @@ -3728,7 +3674,7 @@ return details; } -void CVideoDatabase::GetCast(int media_id, const std::string &media_type, std::vector &cast) +void CVideoDatabase::GetCast(int media_id, const std::string &media_type, vector &cast) { try { @@ -3753,7 +3699,7 @@ SActorInfo info; info.strName = m_pDS2->fv(0).get_asString(); bool found = false; - for (std::vector::iterator i = cast.begin(); i != cast.end(); ++i) + for (vector::iterator i = cast.begin(); i != cast.end(); ++i) { if (i->strName == info.strName) { @@ -3822,7 +3768,7 @@ if (NULL == m_pDS.get()) return false; std::string strSQL=PrepareSQL("select * from settings where settings.idFile = '%i'", idFile); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); if (m_pDS->num_rows() > 0) { // get the video settings info @@ -3874,7 +3820,7 @@ if (idFile < 0) return; std::string strSQL = PrepareSQL("select * from settings where idFile=%i", idFile); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); if (m_pDS->num_rows() > 0) { m_pDS->close(); @@ -3891,7 +3837,7 @@ std::string strSQL2; strSQL2=PrepareSQL("ResumeTime=%i,StereoMode=%i,StereoInvert=%i where idFile=%i\n", setting.m_ResumeTime, setting.m_StereoMode, setting.m_StereoInvert, idFile); strSQL += strSQL2; - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); return ; } else @@ -3910,7 +3856,7 @@ setting.m_ResumeTime, setting.m_Sharpness, setting.m_NoiseReduction, setting.m_CustomNonLinStretch, setting.m_PostProcess, setting.m_ScalingMethod, setting.m_DeinterlaceMode, setting.m_StereoMode, setting.m_StereoInvert); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } } catch (...) @@ -3919,13 +3865,13 @@ } } -void CVideoDatabase::SetArtForItem(int mediaId, const MediaType &mediaType, const std::map &art) +void CVideoDatabase::SetArtForItem(int mediaId, const MediaType &mediaType, const map &art) { - for (std::map::const_iterator i = art.begin(); i != art.end(); ++i) + for (map::const_iterator i = art.begin(); i != art.end(); ++i) SetArtForItem(mediaId, mediaType, i->first, i->second); } -void CVideoDatabase::SetArtForItem(int mediaId, const MediaType &mediaType, const std::string &artType, const std::string &url) +void CVideoDatabase::SetArtForItem(int mediaId, const MediaType &mediaType, const string &artType, const string &url) { try { @@ -3933,11 +3879,11 @@ if (NULL == m_pDS.get()) return; // don't set . art types - these are derivative types from parent items - if (artType.find('.') != std::string::npos) + if (artType.find('.') != string::npos) return; std::string sql = PrepareSQL("SELECT art_id,url FROM art WHERE media_id=%i AND media_type='%s' AND type='%s'", mediaId, mediaType.c_str(), artType.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (!m_pDS->eof()) { // update int artId = m_pDS->fv(0).get_asInt(); @@ -3946,14 +3892,14 @@ if (oldUrl != url) { sql = PrepareSQL("UPDATE art SET url='%s' where art_id=%d", url.c_str(), artId); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } } else { // insert m_pDS->close(); sql = PrepareSQL("INSERT INTO art(media_id, media_type, type, url) VALUES (%d, '%s', '%s', '%s')", mediaId, mediaType.c_str(), artType.c_str(), url.c_str()); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } } catch (...) @@ -3962,7 +3908,7 @@ } } -bool CVideoDatabase::GetArtForItem(int mediaId, const MediaType &mediaType, std::map &art) +bool CVideoDatabase::GetArtForItem(int mediaId, const MediaType &mediaType, map &art) { try { @@ -3970,7 +3916,7 @@ if (NULL == m_pDS2.get()) return false; // using dataset 2 as we're likely called in loops on dataset 1 std::string sql = PrepareSQL("SELECT type,url FROM art WHERE media_id=%i AND media_type='%s'", mediaId, mediaType.c_str()); - m_pDS2->query(sql); + m_pDS2->query(sql.c_str()); while (!m_pDS2->eof()) { art.insert(make_pair(m_pDS2->fv(0).get_asString(), m_pDS2->fv(1).get_asString())); @@ -3986,7 +3932,7 @@ return false; } -std::string CVideoDatabase::GetArtForItem(int mediaId, const MediaType &mediaType, const std::string &artType) +string CVideoDatabase::GetArtForItem(int mediaId, const MediaType &mediaType, const string &artType) { std::string query = PrepareSQL("SELECT url FROM art WHERE media_id=%i AND media_type='%s' AND type='%s'", mediaId, mediaType.c_str(), artType.c_str()); return GetSingleValue(query, m_pDS2); @@ -4000,13 +3946,13 @@ bool CVideoDatabase::RemoveArtForItem(int mediaId, const MediaType &mediaType, const std::set &artTypes) { bool result = true; - for (std::set::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) + for (set::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) result &= RemoveArtForItem(mediaId, mediaType, *i); return result; } -bool CVideoDatabase::GetTvShowSeasons(int showId, std::map &seasons) +bool CVideoDatabase::GetTvShowSeasons(int showId, map &seasons) { try { @@ -4015,12 +3961,12 @@ // get all seasons for this show std::string sql = PrepareSQL("select idSeason,season from seasons where idShow=%i", showId); - m_pDS2->query(sql); + m_pDS2->query(sql.c_str()); seasons.clear(); while (!m_pDS2->eof()) { - seasons.insert(std::make_pair(m_pDS2->fv(1).get_asInt(), m_pDS2->fv(0).get_asInt())); + seasons.insert(make_pair(m_pDS2->fv(1).get_asInt(), m_pDS2->fv(0).get_asInt())); m_pDS2->next(); } m_pDS2->close(); @@ -4033,21 +3979,21 @@ return false; } -bool CVideoDatabase::GetTvShowSeasonArt(int showId, std::map > &seasonArt) +bool CVideoDatabase::GetTvShowSeasonArt(int showId, map > &seasonArt) { try { if (NULL == m_pDB.get()) return false; if (NULL == m_pDS2.get()) return false; // using dataset 2 as we're likely called in loops on dataset 1 - std::map seasons; + map seasons; GetTvShowSeasons(showId, seasons); - for (std::map::const_iterator i = seasons.begin(); i != seasons.end(); ++i) + for (map::const_iterator i = seasons.begin(); i != seasons.end(); ++i) { - std::map art; + map art; GetArtForItem(i->second, MediaTypeSeason, art); - seasonArt.insert(std::make_pair(i->first,art)); + seasonArt.insert(make_pair(i->first,art)); } return true; } @@ -4087,7 +4033,7 @@ /// \brief GetStackTimes() obtains any saved video times for the stacked file /// \retval Returns true if the stack times exist, false otherwise. -bool CVideoDatabase::GetStackTimes(const std::string &filePath, std::vector ×) +bool CVideoDatabase::GetStackTimes(const std::string &filePath, vector ×) { try { @@ -4098,13 +4044,13 @@ if (NULL == m_pDS.get()) return false; // ok, now obtain the settings for this file std::string strSQL=PrepareSQL("select times from stacktimes where idFile=%i\n", idFile); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); if (m_pDS->num_rows() > 0) { // get the video settings info int timeTotal = 0; - std::vector timeString = StringUtils::Split(m_pDS->fv("times").get_asString(), ","); + vector timeString = StringUtils::Split(m_pDS->fv("times").get_asString(), ","); times.clear(); - for (std::vector::const_iterator i = timeString.begin(); i != timeString.end(); ++i) + for (vector::const_iterator i = timeString.begin(); i != timeString.end(); ++i) { times.push_back(atoi(i->c_str())); timeTotal += atoi(i->c_str()); @@ -4122,7 +4068,7 @@ } /// \brief Sets the stack times for a particular video file -void CVideoDatabase::SetStackTimes(const std::string& filePath, const std::vector ×) +void CVideoDatabase::SetStackTimes(const std::string& filePath, const vector ×) { try { @@ -4152,7 +4098,7 @@ { if(URIUtils::IsMultiPath(strPath)) { - std::vector paths; + vector paths; CMultiPathDirectory::GetPaths(strPath, paths); for(unsigned i=0;iSetHeading(CVariant{700}); - progress->SetLine(0, CVariant{""}); - progress->SetLine(1, CVariant{313}); - progress->SetLine(2, CVariant{330}); + progress->SetHeading(700); + progress->SetLine(0, ""); + progress->SetLine(1, 313); + progress->SetLine(2, 330); progress->SetPercentage(0); - progress->Open(); + progress->StartModal(); progress->ShowProgressBar(true); } - std::vector > paths; + vector< pair > paths; GetSubPaths(strPath, paths); int iCurr = 0; - for (std::vector >::const_iterator i = paths.begin(); i != paths.end(); ++i) + for (vector< pair >::const_iterator i = paths.begin(); i != paths.end(); ++i) { bool bMvidsChecked=false; if (progress) @@ -4191,11 +4137,11 @@ else { std::string strSQL = PrepareSQL("select files.strFilename from files join movie on movie.idFile=files.idFile where files.idPath=%i", i->first); - m_pDS2->query(strSQL); + m_pDS2->query(strSQL.c_str()); if (m_pDS2->eof()) { strSQL = PrepareSQL("select files.strFilename from files join musicvideo on musicvideo.idFile=files.idFile where files.idPath=%i", i->first); - m_pDS2->query(strSQL); + m_pDS2->query(strSQL.c_str()); bMvidsChecked = true; } while (!m_pDS2->eof()) @@ -4211,7 +4157,7 @@ if (m_pDS2->eof() && !bMvidsChecked) { strSQL =PrepareSQL("select files.strFilename from files join musicvideo on musicvideo.idFile=files.idFile where files.idPath=%i", i->first); - m_pDS2->query(strSQL); + m_pDS2->query(strSQL.c_str()); bMvidsChecked = true; } } @@ -4233,7 +4179,7 @@ // if we have a multipath, set scraper for all contained paths if(URIUtils::IsMultiPath(filePath)) { - std::vector paths; + vector paths; CMultiPathDirectory::GetPaths(filePath, paths); for(unsigned i=0;iContent()); strSQL=PrepareSQL("update path set strContent='%s', strScraper='%s', scanRecursive=%i, useFolderNames=%i, strSettings='%s', noUpdate=%i, exclude=0 where idPath=%i", content.c_str(), scraper->ID().c_str(),settings.recurse,settings.parent_name,scraper->GetPathSettings().c_str(),settings.noupdate, idPath); } - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } catch (...) { @@ -4282,7 +4228,7 @@ if (NULL == m_pDS.get()) return false; std::string sql = PrepareSQL("select count(1) from path where strScraper='%s'", scraperID.c_str()); - if (!m_pDS->query(sql) || m_pDS->num_rows() == 0) + if (!m_pDS->query(sql.c_str()) || m_pDS->num_rows() == 0) return false; bool found = m_pDS->fv(0).get_asInt() > 0; m_pDS->close(); @@ -4300,10 +4246,10 @@ public: CArtItem() { art_id = 0; media_id = 0; }; int art_id; - std::string art_type; - std::string art_url; + string art_type; + string art_url; int media_id; - std::string media_type; + string media_type; }; // used for database update to v83 @@ -4316,9 +4262,9 @@ }; int id; int path; - std::string title; - std::string year; - std::string ident; + string title; + string year; + string ident; }; // used for database update to v84 @@ -4332,6 +4278,162 @@ void CVideoDatabase::UpdateTables(int iVersion) { + if (iVersion < 61) + { + m_pDS->exec("ALTER TABLE path ADD dateAdded text"); + m_pDS->exec("ALTER TABLE files ADD dateAdded text"); + } + if (iVersion < 62) + { // add seasons table + m_pDS->exec("CREATE TABLE seasons ( idSeason integer primary key, idShow integer, season integer)"); + // insert all seasons for each show + m_pDS->query("SELECT idShow FROM tvshow"); + while (!m_pDS->eof()) + { + std::string sql = PrepareSQL("INSERT INTO seasons (idShow,season)" + " SELECT DISTINCT" + " idShow,c%02d" + " FROM" + " episode" + " JOIN tvshowlinkepisode ON" + " episode.idEpisode=tvshowlinkepisode.idEpisode" + " WHERE idShow=%i", VIDEODB_ID_EPISODE_SEASON, m_pDS->fv(0).get_asInt()); + m_pDS2->exec(sql.c_str()); + // and the "all seasons node" + sql = PrepareSQL("INSERT INTO seasons (idShow,season) VALUES(%i,-1)", m_pDS->fv(0).get_asInt()); + m_pDS2->exec(sql.c_str()); + m_pDS->next(); + } + } + if (iVersion < 63) + { // add art table + m_pDS->exec("CREATE TABLE art(art_id INTEGER PRIMARY KEY, media_id INTEGER, media_type TEXT, type TEXT, url TEXT)"); + + CMediaSettings::Get().SetVideoNeedsUpdate(63); + CSettings::Get().Save(); + } + if (iVersion < 64) + { // add idShow to episode table + m_pDS->exec("ALTER TABLE episode ADD idShow integer"); + m_pDS->query("SELECT idEpisode FROM episode"); + while (!m_pDS->eof()) + { + int idEpisode = m_pDS->fv(0).get_asInt(); + std::string update = PrepareSQL("UPDATE episode SET idShow=(SELECT idShow FROM tvshowlinkepisode WHERE idEpisode=%d) WHERE idEpisode=%d", idEpisode, idEpisode); + m_pDS2->exec(update.c_str()); + m_pDS->next(); + } + m_pDS->exec("DROP TABLE tvshowlinkepisode"); + } + if (iVersion < 67) + { + m_pDS->exec("CREATE TABLE tag (idTag integer primary key, strTag text)"); + m_pDS->exec("CREATE TABLE taglinks (idTag integer, idMedia integer, media_type TEXT)"); + } + if (iVersion < 68) + { // add idSet to movie table + m_pDS->exec("ALTER TABLE movie ADD idSet integer"); + m_pDS->query("SELECT idMovie FROM movie"); + while (!m_pDS->eof()) + { + int idMovie = m_pDS->fv(0).get_asInt(); + std::string sql = PrepareSQL("UPDATE movie SET idSet=(SELECT idSet FROM setlinkmovie WHERE idMovie = %d LIMIT 1) WHERE idMovie = %d", idMovie, idMovie); + m_pDS2->exec(sql.c_str()); + m_pDS->next(); + } + m_pDS->exec("DROP TABLE IF EXISTS setlinkmovie"); + } + if (iVersion < 70) + { // update old art URLs + m_pDS->query("select art_id,url from art where url like 'image://%%'"); + vector< pair > art; + while (!m_pDS->eof()) + { + art.push_back(make_pair(m_pDS->fv(0).get_asInt(), CURL(m_pDS->fv(1).get_asString()).Get())); + m_pDS->next(); + } + m_pDS->close(); + for (vector< pair >::iterator i = art.begin(); i != art.end(); ++i) + m_pDS->exec(PrepareSQL("update art set url='%s' where art_id=%d", i->second.c_str(), i->first)); + } + if (iVersion < 71) + { // update URL encoded paths + m_pDS->query("select idFile, strFilename from files"); + vector< pair > files; + while (!m_pDS->eof()) + { + files.push_back(make_pair(m_pDS->fv(0).get_asInt(), m_pDS->fv(1).get_asString())); + m_pDS->next(); + } + m_pDS->close(); + + for (vector< pair >::iterator i = files.begin(); i != files.end(); ++i) + { + std::string filename = i->second; + bool update = URIUtils::UpdateUrlEncoding(filename) && + (!m_pDS->query(PrepareSQL("SELECT idFile FROM files WHERE strFilename = '%s'", filename.c_str()).c_str()) || m_pDS->num_rows() <= 0); + m_pDS->close(); + + if (update) + m_pDS->exec(PrepareSQL("UPDATE files SET strFilename='%s' WHERE idFile=%d", filename.c_str(), i->first)); + } + } + if (iVersion < 72) + { // Update thumb to poster or banner as applicable + CTextureDatabase db; + if (db.Open()) + { + m_pDS->query("select art_id,url,media_id,media_type from art where type='thumb' and media_type in ('movie', 'musicvideo', 'tvshow', 'season', 'set')"); + vector art; + while (!m_pDS->eof()) + { + CTextureDetails details; + if (db.GetCachedTexture(m_pDS->fv(1).get_asString(), details)) + { + CArtItem item; + item.art_id = m_pDS->fv(0).get_asInt(); + item.art_url = m_pDS->fv(1).get_asString(); + item.art_type = CVideoInfoScanner::GetArtTypeFromSize(details.width, details.height); + item.media_id = m_pDS->fv(2).get_asInt(); + item.media_type = m_pDS->fv(3).get_asString(); + if (item.art_type != "thumb") + art.push_back(item); + } + m_pDS->next(); + } + m_pDS->close(); + for (vector::iterator i = art.begin(); i != art.end(); ++i) + { + if (GetArtForItem(i->media_id, i->media_type, i->art_type).empty()) + m_pDS->exec(PrepareSQL("update art set type='%s' where art_id=%d", i->art_type.c_str(), i->art_id)); + else + m_pDS->exec(PrepareSQL("delete from art where art_id=%d", i->art_id)); + } + } + } + if (iVersion < 74) + { // update the runtime columns + vector< pair > tables; + tables.push_back(make_pair("movie", VIDEODB_ID_RUNTIME)); + tables.push_back(make_pair("episode", VIDEODB_ID_EPISODE_RUNTIME)); + tables.push_back(make_pair("mvideo", VIDEODB_ID_MUSICVIDEO_RUNTIME)); + for (vector< pair >::iterator i = tables.begin(); i != tables.end(); ++i) + { + std::string sql = PrepareSQL("select id%s,c%02d from %s where c%02d != ''", i->first.c_str(), i->second, (i->first=="mvideo")?"musicvideo":i->first.c_str(), i->second); + m_pDS->query(sql.c_str()); + vector< pair > videos; + while (!m_pDS->eof()) + { + int duration = CVideoInfoTag::GetDurationFromMinuteString(m_pDS->fv(1).get_asString()); + if (duration) + videos.push_back(make_pair(m_pDS->fv(0).get_asInt(), duration)); + m_pDS->next(); + } + m_pDS->close(); + for (vector< pair >::iterator j = videos.begin(); j != videos.end(); ++j) + m_pDS->exec(PrepareSQL("update %s set c%02d=%d where id%s=%d", (i->first=="mvideo")?"musicvideo":i->first.c_str(), i->second, j->second, i->first.c_str(), j->first)); + } + } if (iVersion < 76) { m_pDS->exec("ALTER TABLE settings ADD StereoMode integer"); @@ -4343,7 +4445,7 @@ if (iVersion < 81) { // add idParentPath to path table m_pDS->exec("ALTER TABLE path ADD idParentPath integer"); - std::map paths; + map paths; m_pDS->query("select idPath,strPath from path"); while (!m_pDS->eof()) { @@ -4352,10 +4454,10 @@ } m_pDS->close(); // run through these paths figuring out the parent path, and add to the table if found - for (std::map::const_iterator i = paths.begin(); i != paths.end(); ++i) + for (map::const_iterator i = paths.begin(); i != paths.end(); ++i) { std::string parent = URIUtils::GetParentPath(i->first); - std::map::const_iterator j = paths.find(parent); + map::const_iterator j = paths.find(parent); if (j != paths.end()) m_pDS->exec(PrepareSQL("UPDATE path SET idParentPath=%i WHERE idPath=%i", j->second, i->second)); } @@ -4369,8 +4471,8 @@ { // drop duplicates in tvshow table, and update tvshowlinkpath accordingly std::string sql = PrepareSQL("SELECT tvshow.idShow,idPath,c%02d,c%02d,c%02d FROM tvshow JOIN tvshowlinkpath ON tvshow.idShow = tvshowlinkpath.idShow", VIDEODB_ID_TV_TITLE, VIDEODB_ID_TV_PREMIERED, VIDEODB_ID_TV_IDENT); - m_pDS->query(sql); - std::vector shows; + m_pDS->query(sql.c_str()); + vector shows; while (!m_pDS->eof()) { CShowItem show; @@ -4385,10 +4487,10 @@ m_pDS->close(); if (!shows.empty()) { - for (std::vector::iterator i = shows.begin() + 1; i != shows.end(); ++i) + for (vector::iterator i = shows.begin() + 1; i != shows.end(); ++i) { // has this show been found before? - std::vector::const_iterator j = find(shows.begin(), i, *i); + vector::const_iterator j = find(shows.begin(), i, *i); if (j != i) { // this is a duplicate // update the tvshowlinkpath table @@ -4412,7 +4514,7 @@ if (iVersion < 84) { // replace any multipaths in tvshowlinkpath table m_pDS->query("SELECT idShow, tvshowlinkpath.idPath, strPath FROM tvshowlinkpath JOIN path ON tvshowlinkpath.idPath=path.idPath WHERE path.strPath LIKE 'multipath://%'"); - std::vector shows; + vector shows; while (!m_pDS->eof()) { CShowLink link; @@ -4424,11 +4526,11 @@ } m_pDS->close(); // update these - for (std::vector::const_iterator i = shows.begin(); i != shows.end(); ++i) + for (vector::const_iterator i = shows.begin(); i != shows.end(); ++i) { - std::vector paths; + vector paths; CMultiPathDirectory::GetPaths(i->path, paths); - for (std::vector::const_iterator j = paths.begin(); j != paths.end(); ++j) + for (vector::const_iterator j = paths.begin(); j != paths.end(); ++j) { int idPath = AddPath(*j, URIUtils::GetParentPath(*j)); /* we can't rely on REPLACE INTO here as analytics (indices) aren't online yet */ @@ -4646,45 +4748,11 @@ } } } - - if (iVersion < 96) - { - m_pDS->exec("ALTER TABLE movie ADD userrating integer"); - m_pDS->exec("ALTER TABLE episode ADD userrating integer"); - m_pDS->exec("ALTER TABLE tvshow ADD userrating integer"); - m_pDS->exec("ALTER TABLE musicvideo ADD userrating integer"); - } - - if (iVersion < 97) - m_pDS->exec("ALTER TABLE sets ADD strOverview TEXT"); - - if (iVersion < 98) - m_pDS->exec("ALTER TABLE seasons ADD name text"); - - if (iVersion < 99) - { - // Add idSeason to episode table, so we don't have to join via idShow and season in the future - m_pDS->exec("ALTER TABLE episode ADD idSeason integer"); - - m_pDS->query("SELECT idSeason, idShow, season FROM seasons"); - while (!m_pDS->eof()) - { - m_pDS2->exec(PrepareSQL("UPDATE episode " - "SET idSeason = %d " - "WHERE " - "episode.idShow = %d AND " - "episode.c%02d = %d", - m_pDS->fv(0).get_asInt(), m_pDS->fv(1).get_asInt(), - VIDEODB_ID_EPISODE_SEASON, m_pDS->fv(2).get_asInt())); - - m_pDS->next(); - } - } } int CVideoDatabase::GetSchemaVersion() const { - return 99; + return 93; } bool CVideoDatabase::LookupByFolders(const std::string &path, bool shows) @@ -4701,7 +4769,7 @@ { if(URIUtils::IsMultiPath(strPath)) { - std::vector paths; + vector paths; CMultiPathDirectory::GetPaths(strPath, paths); bool ret = false; @@ -4780,7 +4848,7 @@ std::string strSQL = PrepareSQL("select playCount from files WHERE idFile=%i", iFileId); int count = 0; - if (m_pDS->query(strSQL)) + if (m_pDS->query(strSQL.c_str())) { // there should only ever be one row returned if (m_pDS->num_rows() == 1) @@ -4820,7 +4888,7 @@ try { - m_pDS->exec(exec); + m_pDS->exec(exec.c_str()); if (type == VIDEODB_CONTENT_TVSHOWS) AnnounceUpdate(MediaTypeTvShow, item.GetVideoInfoTag()->m_iDbId); @@ -4870,7 +4938,7 @@ strSQL = PrepareSQL("update files set playCount=NULL,lastPlayed='%s' where idFile=%i", date.GetAsDBDateTime().c_str(), id); } - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); // We only need to announce changes to video items in the library if (item.HasVideoInfoTag() && item.GetVideoInfoTag()->m_iDbId > 0) @@ -4881,7 +4949,7 @@ // Only provide the "playcount" value if it has actually changed if (item.GetVideoInfoTag()->m_playCount != count) data["playcount"] = count; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", CFileItemPtr(new CFileItem(item)), data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", CFileItemPtr(new CFileItem(item)), data); } } catch (...) @@ -4931,7 +4999,7 @@ { CLog::Log(LOGINFO, "Changing Movie set:id:%i New Title:%s", idMovie, strNewMovieTitle.c_str()); std::string strSQL = PrepareSQL("UPDATE sets SET strSet='%s' WHERE idSet=%i", strNewMovieTitle.c_str(), idMovie ); - m_pDS->exec(strSQL); + m_pDS->exec(strSQL.c_str()); } if (!content.empty()) @@ -5023,7 +5091,7 @@ std::string strSQL; Filter extFilter = filter; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) { std::string view, view_id, media_type, extraField, extraJoin; if (idContent == VIDEODB_CONTENT_MOVIES) @@ -5125,10 +5193,10 @@ return true; } - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) { - std::map > mapItems; - std::map >::iterator it; + map > mapItems; + map >::iterator it; while (!m_pDS->eof()) { int id = m_pDS->fv(0).get_asInt(); @@ -5139,12 +5207,12 @@ if (it == mapItems.end()) { // check path - if (g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv(2).get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv(2).get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { if (idContent == VIDEODB_CONTENT_MOVIES || idContent == VIDEODB_CONTENT_MUSICVIDEOS) - mapItems.insert(std::pair >(id, std::pair(str,m_pDS->fv(3).get_asInt()))); //fv(3) is file.playCount + mapItems.insert(pair >(id, pair(str,m_pDS->fv(3).get_asInt()))); //fv(3) is file.playCount else if (idContent == VIDEODB_CONTENT_TVSHOWS) - mapItems.insert(std::pair >(id, std::pair(str,0))); + mapItems.insert(pair >(id, pair(str,0))); } } m_pDS->next(); @@ -5240,8 +5308,7 @@ return false; CFileItemList sets; - GroupAttribute groupingAttributes = ignoreSingleMovieSets ? GroupAttributeIgnoreSingleItems : GroupAttributeNone; - if (!GroupUtils::Group(GroupBySet, strBaseDir, items, sets, groupingAttributes)) + if (!GroupUtils::Group(GroupBySet, strBaseDir, items, sets)) return false; items.ClearItems(); @@ -5272,7 +5339,7 @@ extFilter.fields = PrepareSQL("musicvideo_view.c%02d, musicvideo_view.idMVideo, actor.name", VIDEODB_ID_MUSICVIDEO_ALBUM); extFilter.AppendJoin(PrepareSQL("JOIN actor_link ON actor_link.media_id=musicvideo_view.idMVideo AND actor_link.media_type='musicvideo'")); extFilter.AppendJoin(PrepareSQL("JOIN actor ON actor.actor_id = actor_link.actor_id")); - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) { extFilter.fields += ", path.strPath"; extFilter.AppendJoin("join files on files.idFile = musicvideo_view.idFile join path on path.idPath = files.idPath"); @@ -5308,10 +5375,10 @@ return true; } - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) { - std::map > mapAlbums; - std::map >::iterator it; + map > mapAlbums; + map >::iterator it; while (!m_pDS->eof()) { int lidMVideo = m_pDS->fv(1).get_asInt(); @@ -5321,7 +5388,7 @@ if (it == mapAlbums.end()) { // check path - if (g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) mapAlbums.insert(make_pair(lidMVideo, make_pair(strAlbum,m_pDS->fv(2).get_asString()))); } m_pDS->next(); @@ -5431,7 +5498,7 @@ // get primary genres for movies std::string strSQL; Filter extFilter = filter; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) { std::string view, view_id, media_type, extraField; if (idContent == VIDEODB_CONTENT_MOVIES) @@ -5531,7 +5598,7 @@ // run query unsigned int time = XbmcThreads::SystemClockMillis(); - if (!m_pDS->query(strSQL)) return false; + if (!m_pDS->query(strSQL.c_str())) return false; CLog::Log(LOGDEBUG, "%s - query took %i ms", __FUNCTION__, XbmcThreads::SystemClockMillis() - time); time = XbmcThreads::SystemClockMillis(); int iRowsFound = m_pDS->num_rows(); @@ -5551,10 +5618,10 @@ return true; } - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) { - std::map mapActors; - std::map::iterator it; + map mapActors; + map::iterator it; while (!m_pDS->eof()) { @@ -5569,8 +5636,8 @@ if (it == mapActors.end()) { // check path - if (g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) - mapActors.insert(std::pair(idActor, actor)); + if (g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) + mapActors.insert(pair(idActor, actor)); } m_pDS->next(); } @@ -5652,7 +5719,7 @@ std::string strSQL; Filter extFilter = filter; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) { if (idContent == VIDEODB_CONTENT_MOVIES) { @@ -5704,10 +5771,10 @@ if (iRowsFound <= 0) return iRowsFound == 0; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) { - std::map > mapYears; - std::map >::iterator it; + map > mapYears; + map >::iterator it; while (!m_pDS->eof()) { int lYear = 0; @@ -5723,13 +5790,13 @@ if (it == mapYears.end()) { // check path - if (g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { std::string year = StringUtils::Format("%d", lYear); if (idContent == VIDEODB_CONTENT_MOVIES || idContent == VIDEODB_CONTENT_MUSICVIDEOS) - mapYears.insert(std::pair >(lYear, std::pair(year,m_pDS->fv(2).get_asInt()))); + mapYears.insert(pair >(lYear, pair(year,m_pDS->fv(2).get_asInt()))); else - mapYears.insert(std::pair >(lYear, std::pair(year,0))); + mapYears.insert(pair >(lYear, pair(year,0))); } } m_pDS->next(); @@ -5868,29 +5935,25 @@ if (iRowsFound <= 0) return iRowsFound == 0; - std::set> mapSeasons; + set< std::pair > mapSeasons; while (!m_pDS->eof()) { int id = m_pDS->fv(VIDEODB_ID_SEASON_ID).get_asInt(); int showId = m_pDS->fv(VIDEODB_ID_SEASON_TVSHOW_ID).get_asInt(); int iSeason = m_pDS->fv(VIDEODB_ID_SEASON_NUMBER).get_asInt(); - std::string name = m_pDS->fv(VIDEODB_ID_SEASON_NAME).get_asString(); std::string path = m_pDS->fv(VIDEODB_ID_SEASON_TVSHOW_PATH).get_asString(); if (mapSeasons.find(std::make_pair(showId, iSeason)) == mapSeasons.end() && - (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || g_passwordManager.bMasterUser || - g_passwordManager.IsDatabasePathUnlocked(path, *CMediaSourceSettings::GetInstance().GetSources("video")))) + (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || g_passwordManager.bMasterUser || + g_passwordManager.IsDatabasePathUnlocked(path, *CMediaSourceSettings::Get().GetSources("video")))) { mapSeasons.insert(std::make_pair(showId, iSeason)); - std::string strLabel = name; - if (strLabel.empty()) - { - if (iSeason == 0) - strLabel = g_localizeStrings.Get(20381); - else - strLabel = StringUtils::Format(g_localizeStrings.Get(20358).c_str(), iSeason); - } + std::string strLabel; + if (iSeason == 0) + strLabel = g_localizeStrings.Get(20381); + else + strLabel = StringUtils::Format(g_localizeStrings.Get(20358).c_str(), iSeason); CFileItemPtr pItem(new CFileItem(strLabel)); CVideoDbUrl itemUrl = videoUrl; @@ -5903,23 +5966,14 @@ pItem->m_bIsFolder = true; pItem->GetVideoInfoTag()->m_strTitle = strLabel; - if (!name.empty()) - pItem->GetVideoInfoTag()->m_strSortTitle = name; pItem->GetVideoInfoTag()->m_iSeason = iSeason; pItem->GetVideoInfoTag()->m_iDbId = id; - pItem->GetVideoInfoTag()->m_iIdSeason = id; pItem->GetVideoInfoTag()->m_type = MediaTypeSeason; pItem->GetVideoInfoTag()->m_strPath = path; pItem->GetVideoInfoTag()->m_strShowTitle = m_pDS->fv(VIDEODB_ID_SEASON_TVSHOW_TITLE).get_asString(); pItem->GetVideoInfoTag()->m_strPlot = m_pDS->fv(VIDEODB_ID_SEASON_TVSHOW_PLOT).get_asString(); pItem->GetVideoInfoTag()->m_premiered.SetFromDBDate(m_pDS->fv(VIDEODB_ID_SEASON_TVSHOW_PREMIERED).get_asString()); - pItem->GetVideoInfoTag()->m_firstAired.SetFromDBDate(m_pDS->fv(VIDEODB_ID_SEASON_PREMIERED).get_asString()); - - // season premiered date based on first episode airdate associated to the season - // tvshow premiered date is used as a fallback - if (pItem->GetVideoInfoTag()->m_firstAired.IsValid()) - pItem->GetVideoInfoTag()->m_iYear = pItem->GetVideoInfoTag()->m_firstAired.GetYear(); - else if (pItem->GetVideoInfoTag()->m_premiered.IsValid()) + if (pItem->GetVideoInfoTag()->m_premiered.IsValid()) pItem->GetVideoInfoTag()->m_iYear = pItem->GetVideoInfoTag()->m_premiered.GetYear(); pItem->GetVideoInfoTag()->m_genre = StringUtils::Split(m_pDS->fv(VIDEODB_ID_SEASON_TVSHOW_GENRE).get_asString(), g_advancedSettings.m_videoItemSeparator); pItem->GetVideoInfoTag()->m_studio = StringUtils::Split(m_pDS->fv(VIDEODB_ID_SEASON_TVSHOW_STUDIO).get_asString(), g_advancedSettings.m_videoItemSeparator); @@ -5969,7 +6023,6 @@ sortDescription.sortBy == SortByLabel || sortDescription.sortBy == SortByDateAdded || sortDescription.sortBy == SortByRating || - sortDescription.sortBy == SortByUserRating || sortDescription.sortBy == SortByYear || sortDescription.sortBy == SortByLastPlayed || sortDescription.sortBy == SortByPlaycount) @@ -6045,7 +6098,7 @@ else if (StringUtils::EqualsNoCase(itemType, "studios")) return GetStudiosNav(strBaseDir, items, mediaType, filter); else if (StringUtils::EqualsNoCase(itemType, "sets")) - return GetSetsNav(strBaseDir, items, mediaType, filter, !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_GROUPSINGLEITEMSETS)); + return GetSetsNav(strBaseDir, items, mediaType, filter); else if (StringUtils::EqualsNoCase(itemType, "countries")) return GetCountriesNav(strBaseDir, items, mediaType, filter); else if (StringUtils::EqualsNoCase(itemType, "tags")) @@ -6171,9 +6224,9 @@ const dbiplus::sql_record* const record = data.at(targetRow); CVideoInfoTag movie = GetDetailsForMovie(record); - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || + if (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || g_passwordManager.bMasterUser || - g_passwordManager.IsDatabasePathUnlocked(movie.m_strPath, *CMediaSourceSettings::GetInstance().GetSources("video"))) + g_passwordManager.IsDatabasePathUnlocked(movie.m_strPath, *CMediaSourceSettings::Get().GetSources("video"))) { CFileItemPtr pItem(new CFileItem(movie)); @@ -6277,10 +6330,10 @@ CFileItemPtr pItem(new CFileItem()); CVideoInfoTag movie = GetDetailsForTvShow(record, false, pItem.get()); - if ((CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || + if ((CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || g_passwordManager.bMasterUser || - g_passwordManager.IsDatabasePathUnlocked(movie.m_strPath, *CMediaSourceSettings::GetInstance().GetSources("video"))) && - (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_SHOWEMPTYTVSHOWS) || movie.m_iEpisode > 0)) + g_passwordManager.IsDatabasePathUnlocked(movie.m_strPath, *CMediaSourceSettings::Get().GetSources("video"))) && + (!g_advancedSettings.m_bVideoLibraryHideEmptySeries || movie.m_iEpisode > 0)) { pItem->SetFromVideoInfoTag(movie); @@ -6405,9 +6458,9 @@ const dbiplus::sql_record* const record = data.at(targetRow); CVideoInfoTag movie = GetDetailsForEpisode(record); - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || + if (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || g_passwordManager.bMasterUser || - g_passwordManager.IsDatabasePathUnlocked(movie.m_strPath, *CMediaSourceSettings::GetInstance().GetSources("video"))) + g_passwordManager.IsDatabasePathUnlocked(movie.m_strPath, *CMediaSourceSettings::Get().GetSources("video"))) { CFileItemPtr pItem(new CFileItem(movie)); formatter.FormatLabel(pItem.get()); @@ -6561,7 +6614,7 @@ // make sure we use m_pDS2, as this is called in loops using m_pDS std::string strSQL=PrepareSQL("select idShow from episode where idEpisode=%i", idEpisode); - m_pDS2->query( strSQL ); + m_pDS2->query( strSQL.c_str() ); int result=-1; if (!m_pDS2->eof()) @@ -6609,7 +6662,7 @@ sql = "select count(1) from tvshow"; else if (type == VIDEODB_CONTENT_MUSICVIDEOS) sql = "select count(1) from musicvideo"; - m_pDS->query( sql ); + m_pDS->query( sql.c_str() ); if (!m_pDS->eof()) result = (m_pDS->fv(0).get_asInt() > 0); @@ -6656,7 +6709,7 @@ if (idPath > -1) { std::string strSQL=PrepareSQL("select path.strContent,path.strScraper,path.scanRecursive,path.useFolderNames,path.strSettings,path.noUpdate,path.exclude from path where path.idPath=%i",idPath); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); } int iFound = 1; @@ -6683,7 +6736,7 @@ AddonPtr addon; if (!scraperID.empty() && - CAddonMgr::GetInstance().GetAddon(scraperID, addon)) + CAddonMgr::Get().GetAddon(scraperID, addon)) { scraper = std::dynamic_pointer_cast(addon->Clone()); if (!scraper) @@ -6706,7 +6759,7 @@ iFound++; std::string strSQL=PrepareSQL("select path.strContent,path.strScraper,path.scanRecursive,path.useFolderNames,path.strSettings,path.noUpdate, path.exclude from path where strPath='%s'",strParent.c_str()); - m_pDS->query(strSQL); + m_pDS->query(strSQL.c_str()); CONTENT_TYPE content = CONTENT_NONE; if (!m_pDS->eof()) @@ -6726,7 +6779,7 @@ AddonPtr addon; if (content != CONTENT_NONE && - CAddonMgr::GetInstance().GetAddon(m_pDS->fv("path.strScraper").get_asString(), addon)) + CAddonMgr::Get().GetAddon(m_pDS->fv("path.strScraper").get_asString(), addon)) { scraper = std::dynamic_pointer_cast(addon->Clone()); scraper->SetPathSettings(content, m_pDS->fv("path.strSettings").get_asString()); @@ -6802,7 +6855,7 @@ else sql += PrepareSQL("WHERE strPath LIKE '%s%%'", strPath.c_str()); - m_pDS->query( sql ); + m_pDS->query( sql.c_str() ); if (m_pDS->num_rows() && m_pDS->fv(0).get_asInt() > 0) return "episodes"; return foundDirectly ? "tvshows" : "seasons"; @@ -6821,17 +6874,17 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL=PrepareSQL("SELECT genre.genre_id, genre.name, path.strPath FROM genre INNER JOIN genre_link ON genre_link.genre_id = genre.genre_id INNER JOIN movie ON (genre_link.media_type='movie' = genre_link.media_id=movie.idMovie) INNER JOIN files ON files.idFile=movie.idFile INNER JOIN path ON path.idPath=files.idPath WHERE genre.name LIKE '%%%s%%'",strSearch.c_str()); else strSQL=PrepareSQL("SELECT DISTINCT genre.genre_id, genre.name FROM genre INNER JOIN genre_link ON genre_link.genre_id=genre.genre_id WHERE genre_link.media_type='movie' AND name LIKE '%%%s%%'", strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()), - *CMediaSourceSettings::GetInstance().GetSources("video"))) + *CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -6861,17 +6914,17 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL=PrepareSQL("SELECT country.country_id, country.name, path.strPath FROM country INNER JOIN country_link ON country_link.country_id=country.country_id INNER JOIN movie ON country_link.media_id=movie.idMovie INNER JOIN files ON files.idFile=movie.idFile INNER JOIN path ON path.idPath=files.idPath WHERE country_link.media_type='movie' AND country.name LIKE '%%%s%%'", strSearch.c_str()); else strSQL=PrepareSQL("SELECT DISTINCT country.country_id, country.name FROM country INNER JOIN country_link ON country_link.country_id=country.country_id WHERE country_link.media_type='movie' AND name like '%%%s%%'", strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()), - *CMediaSourceSettings::GetInstance().GetSources("video"))) + *CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -6901,16 +6954,16 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL=PrepareSQL("SELECT genre.genre_id, genre.name, path.strPath FROM genre INNER JOIN genre_link ON genre_link.genre_id=genre.genre_id INNER JOIN tvshow ON genre_link.media_id=tvshow.idShow INNER JOIN tvshowlinkpath ON tvshowlinkpath.idShow=tvshow.idShow INNER JOIN path ON path.idPath=tvshowlinkpath.idPath WHERE genre_link.media_type='tvshow' AND genre.name LIKE '%%%s%%'", strSearch.c_str()); else strSQL=PrepareSQL("SELECT DISTINCT genre.genre_id, genre.name FROM genre INNER JOIN genre_link ON genre_link.genre_id=genre.genre_id WHERE genre_link.media_type='tvshow' AND name LIKE '%%%s%%'", strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -6940,16 +6993,16 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL=PrepareSQL("SELECT actor.actor_id, actor.name, path.strPath FROM actor INNER JOIN actor_link ON actor_link.actor_id=actor.actor_id INNER JOIN movie ON actor_link.media_id=movie.idMovie INNER JOIN files ON files.idFile=movie.idFile INNER JOIN path ON path.idPath=files.idPath WHERE actor_link.media_type='movie' AND actor.name LIKE '%%%s%%'", strSearch.c_str()); else strSQL=PrepareSQL("SELECT DISTINCT actor.actor_id, actor.name FROM actor INNER JOIN actor_link ON actor_link.actor_id=actor.actor_id INNER JOIN movie ON actor_link.media_id=movie.idMovie WHERE actor_link.media_type='movie' AND actor.name LIKE '%%%s%%'", strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -6979,16 +7032,16 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL=PrepareSQL("SELECT actor.actor_id, actor.name, path.strPath FROM actor INNER JOIN actor_link ON actor_link.actor_id=actor.actor_id INNER JOIN tvshow ON actor_link.media_id=tvshow.idShow INNER JOIN tvshowlinkpath ON tvshowlinkpath.idPath=tvshow.idShow INNER JOIN path ON path.idPath=tvshowlinkpath.idPath WHERE actor_link.media_type='tvshow' AND actor.name LIKE '%%%s%%'", strSearch.c_str()); else strSQL=PrepareSQL("SELECT DISTINCT actor.actor_id, actor.name FROM actor INNER JOIN actor_link ON actor_link.actor_id=actor.actor_id INNER JOIN tvshow ON actor_link.media_id=tvshow.idShow WHERE actor_link.media_type='tvshow' AND actor.name LIKE '%%%s%%'",strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7021,16 +7074,16 @@ std::string strLike; if (!strSearch.empty()) strLike = "and actor.name like '%%%s%%'"; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL=PrepareSQL("SELECT actor.actor_id, actor.name, path.strPath FROM actor INNER JOIN actor_link ON actor_link.actor_id=actor.actor_id INNER JOIN musicvideo ON actor_link.media_id=musicvideo.idMVideo INNER JOIN files ON files.idFile=musicvideo.idFile INNER JOIN path ON path.idPath=files.idPath WHERE actor_link.media_type='musicvideo' "+strLike, strSearch.c_str()); else strSQL=PrepareSQL("SELECT DISTINCT actor.actor_id, actor.name from actor INNER JOIN actor_link ON actor_link.actor_id=actor.actor_id WHERE actor_link.media_type='musicvideo' "+strLike,strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7060,16 +7113,16 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL=PrepareSQL("SELECT genre.genre_id, genre.name, path.strPath FROM genre INNER JOIN genre_link ON genre_link.genre_id=genre.genre_id INNER JOIN musicvideo ON genre_link.media_id=musicvideo.idMVideo INNER JOIN files ON files.idFile=musicvideo.idFile INNER JOIN path ON path.idPath=files.idPath WHERE genre_link.media_type='musicvideo' AND genre.name LIKE '%%%s%%'", strSearch.c_str()); else strSQL=PrepareSQL("SELECT DISTINCT genre.genre_id, genre.name FROM genre INNER JOIN genre_link ON genre_link.genre_id=genre.genre_id WHERE genre_link.media_type='musicvideo' AND genre.name LIKE '%%%s%%'", strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7112,7 +7165,7 @@ if (!strSearch.empty()) strSQL += PrepareSQL(" WHERE musicvideo.c%02d like '%%%s%%'",VIDEODB_ID_MUSICVIDEO_ALBUM, strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { @@ -7122,8 +7175,8 @@ continue; } - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv(2).get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv(2).get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7153,16 +7206,16 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("SELECT musicvideo.idMVideo, musicvideo.c%02d,musicvideo.c%02d, path.strPath FROM musicvideo INNER JOIN files ON files.idFile=musicvideo.idFile INNER JOIN path ON path.idPath=files.idPath WHERE musicvideo.c%02d LIKE '%%%s%%'", VIDEODB_ID_MUSICVIDEO_ALBUM, VIDEODB_ID_MUSICVIDEO_TITLE, VIDEODB_ID_MUSICVIDEO_ALBUM, strSearch.c_str()); else strSQL = PrepareSQL("select musicvideo.idMVideo,musicvideo.c%02d,musicvideo.c%02d from musicvideo where musicvideo.c%02d like '%%%s%%'",VIDEODB_ID_MUSICVIDEO_ALBUM,VIDEODB_ID_MUSICVIDEO_TITLE,VIDEODB_ID_MUSICVIDEO_ALBUM,strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7239,8 +7292,8 @@ const dbiplus::sql_record* const record = data.at(targetRow); CVideoInfoTag musicvideo = GetDetailsForMusicVideo(record); - if (!checkLocks || CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || g_passwordManager.bMasterUser || - g_passwordManager.IsDatabasePathUnlocked(musicvideo.m_strPath, *CMediaSourceSettings::GetInstance().GetSources("video"))) + if (!checkLocks || CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || g_passwordManager.bMasterUser || + g_passwordManager.IsDatabasePathUnlocked(musicvideo.m_strPath, *CMediaSourceSettings::Get().GetSources("video"))) { CFileItemPtr item(new CFileItem(musicvideo)); @@ -7265,7 +7318,7 @@ return false; } -unsigned int CVideoDatabase::GetMusicVideoIDs(const std::string& strWhere, std::vector > &songIDs) +unsigned int CVideoDatabase::GetMusicVideoIDs(const std::string& strWhere, vector > &songIDs) { try { @@ -7276,7 +7329,7 @@ if (!strWhere.empty()) strSQL += " where " + strWhere; - if (!m_pDS->query(strSQL)) return 0; + if (!m_pDS->query(strSQL.c_str())) return 0; songIDs.clear(); if (m_pDS->num_rows() == 0) { @@ -7286,7 +7339,7 @@ songIDs.reserve(m_pDS->num_rows()); while (!m_pDS->eof()) { - songIDs.push_back(std::make_pair(2,m_pDS->fv(0).get_asInt())); + songIDs.push_back(make_pair(2,m_pDS->fv(0).get_asInt())); m_pDS->next(); } // cleanup m_pDS->close(); @@ -7314,7 +7367,7 @@ strSQL += PrepareSQL(" order by RANDOM() limit 1"); CLog::Log(LOGDEBUG, "%s query = %s", __FUNCTION__, strSQL.c_str()); // run query - if (!m_pDS->query(strSQL)) + if (!m_pDS->query(strSQL.c_str())) return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound != 1) @@ -7347,25 +7400,25 @@ std::string strSQL; if (strAlbum.empty() && strTitle.empty()) { // we want to return matching artists only - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL=PrepareSQL("SELECT DISTINCT actor.actor_id, path.strPath FROM actor INNER JOIN actor_link ON actor_link.actor_id=actor.actor_id INNER JOIN musicvideo ON actor_link.media_id=musicvideo.idMVideo INNER JOIN files ON files.idFile=musicvideo.idFile INNER JOIN path ON path.idPath=files.idPath WHERE actor_link.media_type='musicvideo' AND actor.name like '%s'", strArtist.c_str()); else strSQL=PrepareSQL("SELECT DISTINCT actor.actor_id FROM actor INNER JOIN actor_link ON actor_link.actor_id=actor.actor_id WHERE actor_link.media_type='musicvideo' AND actor.name LIKE '%s'", strArtist.c_str()); } else { // we want to return the matching musicvideo - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("SELECT musicvideo.idMVideo FROM actor INNER JOIN actor_link ON actor_link.actor_id=actor.actor_id INNER JOIN musicvideo ON actor_link.media_id=musicvideo.idMVideo INNER JOIN files ON files.idFile=musicvideo.idFile INNER JOIN path ON path.idPath=files.idPath WHERE actor_link.media_type='musicvideo' AND musicvideo.c%02d LIKE '%s' AND musicvideo.c%02d LIKE '%s' AND actor.name LIKE '%s'", VIDEODB_ID_MUSICVIDEO_ALBUM, strAlbum.c_str(), VIDEODB_ID_MUSICVIDEO_TITLE, strTitle.c_str(), strArtist.c_str()); else strSQL = PrepareSQL("select musicvideo.idMVideo from musicvideo join actor_link on actor_link.media_id=musicvideo.idMVideo AND actor_link.media_type='musicvideo' join actor on actor.actor_id=actor_link.actor_id where musicvideo.c%02d like '%s' and musicvideo.c%02d like '%s' and actor.name like '%s'",VIDEODB_ID_MUSICVIDEO_ALBUM,strAlbum.c_str(),VIDEODB_ID_MUSICVIDEO_TITLE,strTitle.c_str(),strArtist.c_str()); } - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); if (m_pDS->eof()) return -1; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->close(); return -1; @@ -7391,16 +7444,16 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("SELECT movie.idMovie, movie.c%02d, path.strPath, movie.idSet FROM movie INNER JOIN files ON files.idFile=movie.idFile INNER JOIN path ON path.idPath=files.idPath WHERE movie.c%02d LIKE '%%%s%%'", VIDEODB_ID_TITLE, VIDEODB_ID_TITLE, strSearch.c_str()); else strSQL = PrepareSQL("select movie.idMovie,movie.c%02d, movie.idSet from movie where movie.c%02d like '%%%s%%'",VIDEODB_ID_TITLE,VIDEODB_ID_TITLE,strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7410,7 +7463,7 @@ int setId = m_pDS->fv("movie.idSet").get_asInt(); CFileItemPtr pItem(new CFileItem(m_pDS->fv(1).get_asString())); std::string path; - if (setId <= 0 || !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_GROUPMOVIESETS)) + if (setId <= 0 || !CSettings::Get().GetBool("videolibrary.groupmoviesets")) path = StringUtils::Format("videodb://movies/titles/%i", movieId); else path = StringUtils::Format("videodb://movies/sets/%i/%i", setId, movieId); @@ -7436,16 +7489,16 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("SELECT tvshow.idShow, tvshow.c%02d, path.strPath FROM tvshow INNER JOIN tvshowlinkpath ON tvshowlinkpath.idShow=tvshow.idShow INNER JOIN path ON path.idPath=tvshowlinkpath.idPath WHERE tvshow.c%02d LIKE '%%%s%%'", VIDEODB_ID_TV_TITLE, VIDEODB_ID_TV_TITLE, strSearch.c_str()); else strSQL = PrepareSQL("select tvshow.idShow,tvshow.c%02d from tvshow where tvshow.c%02d like '%%%s%%'",VIDEODB_ID_TV_TITLE,VIDEODB_ID_TV_TITLE,strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7477,16 +7530,16 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("SELECT episode.idEpisode, episode.c%02d, episode.c%02d, episode.idShow, tvshow.c%02d, path.strPath FROM episode INNER JOIN tvshow ON tvshow.idShow=episode.idShow INNER JOIN files ON files.idFile=episode.idFile INNER JOIN path ON path.idPath=files.idPath WHERE episode.c%02d LIKE '%%%s%%'", VIDEODB_ID_EPISODE_TITLE, VIDEODB_ID_EPISODE_SEASON, VIDEODB_ID_TV_TITLE, VIDEODB_ID_EPISODE_TITLE, strSearch.c_str()); else strSQL = PrepareSQL("SELECT episode.idEpisode, episode.c%02d, episode.c%02d, episode.idShow, tvshow.c%02d FROM episode INNER JOIN tvshow ON tvshow.idShow=episode.idShow WHERE episode.c%02d like '%%%s%%'", VIDEODB_ID_EPISODE_TITLE, VIDEODB_ID_EPISODE_SEASON, VIDEODB_ID_TV_TITLE, VIDEODB_ID_EPISODE_TITLE, strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7520,16 +7573,16 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("SELECT musicvideo.idMVideo, musicvideo.c%02d, path.strPath FROM musicvideo INNER JOIN files ON files.idFile=musicvideo.idFile INNER JOIN path ON path.idPath=files.idPath WHERE musicvideo.c%02d LIKE '%%%s%%'", VIDEODB_ID_MUSICVIDEO_TITLE, VIDEODB_ID_MUSICVIDEO_TITLE, strSearch.c_str()); else strSQL = PrepareSQL("select musicvideo.idMVideo,musicvideo.c%02d from musicvideo where musicvideo.c%02d like '%%%s%%'",VIDEODB_ID_MUSICVIDEO_TITLE,VIDEODB_ID_MUSICVIDEO_TITLE,strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7567,16 +7620,16 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("SELECT episode.idEpisode, episode.c%02d, episode.c%02d, episode.idShow, tvshow.c%02d, path.strPath FROM episode INNER JOIN tvshow ON tvshow.idShow=episode.idShow INNER JOIN files ON files.idFile=episode.idFile INNER JOIN path ON path.idPath=files.idPath WHERE episode.c%02d LIKE '%%%s%%'", VIDEODB_ID_EPISODE_TITLE, VIDEODB_ID_EPISODE_SEASON, VIDEODB_ID_TV_TITLE, VIDEODB_ID_EPISODE_PLOT, strSearch.c_str()); else strSQL = PrepareSQL("SELECT episode.idEpisode, episode.c%02d, episode.c%02d, episode.idShow, tvshow.c%02d FROM episode INNER JOIN tvshow ON tvshow.idShow=episode.idShow WHERE episode.c%02d LIKE '%%%s%%'", VIDEODB_ID_EPISODE_TITLE, VIDEODB_ID_EPISODE_SEASON, VIDEODB_ID_TV_TITLE, VIDEODB_ID_EPISODE_PLOT, strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7606,17 +7659,17 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("select movie.idMovie, movie.c%02d, path.strPath FROM movie INNER JOIN files ON files.idFile=movie.idFile INNER JOIN path ON path.idPath=files.idPath WHERE movie.c%02d LIKE '%%%s%%' OR movie.c%02d LIKE '%%%s%%' OR movie.c%02d LIKE '%%%s%%'", VIDEODB_ID_TITLE,VIDEODB_ID_PLOT, strSearch.c_str(), VIDEODB_ID_PLOTOUTLINE, strSearch.c_str(), VIDEODB_ID_TAGLINE,strSearch.c_str()); else strSQL = PrepareSQL("SELECT movie.idMovie, movie.c%02d FROM movie WHERE (movie.c%02d LIKE '%%%s%%' OR movie.c%02d LIKE '%%%s%%' OR movie.c%02d LIKE '%%%s%%')", VIDEODB_ID_TITLE, VIDEODB_ID_PLOT, strSearch.c_str(), VIDEODB_ID_PLOTOUTLINE, strSearch.c_str(), VIDEODB_ID_TAGLINE, strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv(2).get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv(2).get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7648,17 +7701,17 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("SELECT DISTINCT director_link.actor_id, actor.name, path.strPath FROM movie INNER JOIN director_link ON (director_link.media_id=movie.idMovie AND director_link.media_type='movie') INNER JOIN actor ON actor.actor_id=director_link.actor_id INNER JOIN files ON files.idFile=movie.idFile INNER JOIN path ON path.idPath=files.idPath WHERE actor.name LIKE '%%%s%%'", strSearch.c_str()); else strSQL = PrepareSQL("SELECT DISTINCT director_link.actor_id, actor.name FROM actor INNER JOIN director_link ON director_link.actor_id=actor.actor_id INNER JOIN movie ON director_link.media_id=movie.idMovie WHERE director_link.media_type='movie' AND actor.name like '%%%s%%'", strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7689,17 +7742,17 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("SELECT DISTINCT director_link.actor_id, actor.name, path.strPath FROM actor INNER JOIN director_link ON director_link.actor_id=actor.actor_id INNER JOIN tvshow ON director_link.media_id=tvshow.idShow INNER JOIN tvshowlinkpath ON tvshowlinkpath.idShow=tvshow.idShow INNER JOIN path ON path.idPath=tvshowlinkpath.idPath WHERE director_link.media_type='tvshow' AND actor.name LIKE '%%%s%%'", strSearch.c_str()); else strSQL = PrepareSQL("SELECT DISTINCT director_link.actor_id, actor.name FROM actor INNER JOIN director_link ON director_link.actor_id=actor.actor_id INNER JOIN tvshow ON director_link.media_id=tvshow.idShow WHERE director_link.media_type='tvshow' AND actor.name LIKE '%%%s%%'", strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7730,17 +7783,17 @@ if (NULL == m_pDB.get()) return; if (NULL == m_pDS.get()) return; - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) strSQL = PrepareSQL("SELECT DISTINCT director_link.actor_id, actor.name, path.strPath FROM actor INNER JOIN director_link ON director_link.actor_id=actor.actor_id INNER JOIN musicvideo ON director_link.media_id=musicvideo.idMVideo INNER JOIN files ON files.idFile=musicvideo.idFile INNER JOIN path ON path.idPath=files.idPath WHERE director_link.media_type='musicvideo' AND actor.name LIKE '%%%s%%'", strSearch.c_str()); else strSQL = PrepareSQL("SELECT DISTINCT director_link.actor_id, actor.name FROM actor INNER JOIN director_link ON director_link.actor_id=actor.actor_id INNER JOIN musicvideo ON director_link.media_id=musicvideo.idMVideo WHERE director_link.media_type='musicvideo' AND actor.name LIKE '%%%s%%'", strSearch.c_str()); - m_pDS->query( strSQL ); + m_pDS->query( strSQL.c_str() ); while (!m_pDS->eof()) { - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) - if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::GetInstance().GetSources("video"))) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser) + if (!g_passwordManager.IsDatabasePathUnlocked(std::string(m_pDS->fv("path.strPath").get_asString()),*CMediaSourceSettings::Get().GetSources("video"))) { m_pDS->next(); continue; @@ -7762,7 +7815,7 @@ } } -void CVideoDatabase::CleanDatabase(CGUIDialogProgressBarHandle* handle, const std::set& paths, bool showProgress) +void CVideoDatabase::CleanDatabase(CGUIDialogProgressBarHandle* handle, const set& paths, bool showProgress) { CGUIDialogProgress *progress=NULL; try @@ -7772,7 +7825,7 @@ unsigned int time = XbmcThreads::SystemClockMillis(); CLog::Log(LOGNOTICE, "%s: Starting videodatabase cleanup ..", __FUNCTION__); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnCleanStarted"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnCleanStarted"); BeginTransaction(); @@ -7786,7 +7839,7 @@ sql += PrepareSQL(" AND path.idPath IN (%s)", strPaths.substr(1).c_str()); } - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (m_pDS->num_rows() == 0) return; if (handle) @@ -7799,18 +7852,18 @@ progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); if (progress) { - progress->SetHeading(CVariant{700}); - progress->SetLine(0, CVariant{""}); - progress->SetLine(1, CVariant{313}); - progress->SetLine(2, CVariant{330}); + progress->SetHeading(700); + progress->SetLine(0, ""); + progress->SetLine(1, 313); + progress->SetLine(2, 330); progress->SetPercentage(0); - progress->Open(); + progress->StartModal(); progress->ShowProgressBar(true); } } std::string filesToTestForDelete; - VECSOURCES videoSources(*CMediaSourceSettings::GetInstance().GetSources("video")); + VECSOURCES videoSources(*CMediaSourceSettings::Get().GetSources("video")); g_mediaManager.GetRemovableDrives(videoSources); int total = m_pDS->num_rows(); @@ -7849,7 +7902,7 @@ { progress->Close(); m_pDS->close(); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnCleanFinished"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnCleanFinished"); return; } } @@ -7867,7 +7920,7 @@ m_pDS->query("SELECT files.idFile FROM files WHERE NOT EXISTS (SELECT 1 FROM path WHERE path.idPath = files.idPath)"); while (!m_pDS->eof()) { - std::string file = m_pDS->fv("files.idFile").get_asString() + ","; + string file = m_pDS->fv("files.idFile").get_asString() + ","; filesToTestForDelete += file; filesToDelete += file; @@ -7902,7 +7955,7 @@ CLog::Log(LOGDEBUG, "%s: Cleaning files table", __FUNCTION__); sql = "DELETE FROM files WHERE idFile IN " + filesToDelete; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } if (!movieIDs.empty()) @@ -7914,7 +7967,7 @@ CLog::Log(LOGDEBUG, "%s: Cleaning movie table", __FUNCTION__); sql = "DELETE FROM movie WHERE idMovie IN " + moviesToDelete; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } if (!episodeIDs.empty()) @@ -7926,7 +7979,7 @@ CLog::Log(LOGDEBUG, "%s: Cleaning episode table", __FUNCTION__); sql = "DELETE FROM episode WHERE idEpisode IN " + episodesToDelete; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } CLog::Log(LOGDEBUG, "%s: Cleaning paths that don't exist and have content set...", __FUNCTION__); @@ -7935,7 +7988,7 @@ "AND (strSettings IS NULL OR strSettings = '') " "AND (strHash IS NULL OR strHash = '') " "AND (exclude IS NULL OR exclude != 1))"; - m_pDS->query(sql); + m_pDS->query(sql.c_str()); std::string strIds; while (!m_pDS->eof()) { @@ -7955,16 +8008,16 @@ if (!strIds.empty()) { sql = PrepareSQL("DELETE FROM path WHERE idPath IN (%s)", StringUtils::TrimRight(strIds, ",").c_str()); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); sql = "DELETE FROM tvshowlinkpath WHERE NOT EXISTS (SELECT 1 FROM path WHERE path.idPath = tvshowlinkpath.idPath)"; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } CLog::Log(LOGDEBUG, "%s: Cleaning tvshow table", __FUNCTION__); std::string tvshowsToDelete; sql = "SELECT idShow FROM tvshow WHERE NOT EXISTS (SELECT 1 FROM tvshowlinkpath WHERE tvshowlinkpath.idShow = tvshow.idShow)"; - m_pDS->query(sql); + m_pDS->query(sql.c_str()); while (!m_pDS->eof()) { tvshowIDs.push_back(m_pDS->fv(0).get_asInt()); @@ -7975,7 +8028,31 @@ if (!tvshowsToDelete.empty()) { sql = "DELETE FROM tvshow WHERE idShow IN (" + StringUtils::TrimRight(tvshowsToDelete, ",") + ")"; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); + } + + // Keep empty series if the user wants to hide them + if (!g_advancedSettings.m_bVideoLibraryHideEmptySeries) + { + tvshowsToDelete = ""; + sql = "SELECT tvshow.idShow FROM tvshow " + "JOIN tvshowlinkpath ON tvshow.idShow = tvshowlinkpath.idShow " + "JOIN path ON path.idPath = tvshowlinkpath.idPath " + "WHERE NOT EXISTS (SELECT 1 FROM episode WHERE episode.idShow = tvshow.idShow) " + "AND (path.strContent IS NULL OR path.strContent = '')"; + m_pDS->query(sql.c_str()); + while (!m_pDS->eof()) + { + tvshowIDs.push_back(m_pDS->fv(0).get_asInt()); + tvshowsToDelete += m_pDS->fv(0).get_asString() + ","; + m_pDS->next(); + } + m_pDS->close(); + if (!tvshowsToDelete.empty()) + { + sql = "DELETE FROM tvshow WHERE idShow IN (" + StringUtils::TrimRight(tvshowsToDelete, ",") + ")"; + m_pDS->exec(sql.c_str()); + } } if (!musicVideoIDs.empty()) @@ -7987,7 +8064,7 @@ CLog::Log(LOGDEBUG, "%s: Cleaning musicvideo table", __FUNCTION__); sql = "DELETE FROM musicvideo WHERE idMVideo IN " + musicVideosToDelete; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } CLog::Log(LOGDEBUG, "%s: Cleaning path table", __FUNCTION__); @@ -8003,32 +8080,32 @@ "AND NOT EXISTS (SELECT 1 FROM episode WHERE episode.c%02d = path.idPath) " "AND NOT EXISTS (SELECT 1 FROM musicvideo WHERE musicvideo.c%02d = path.idPath)" , VIDEODB_ID_PARENTPATHID, VIDEODB_ID_EPISODE_PARENTPATHID, VIDEODB_ID_MUSICVIDEO_PARENTPATHID ); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); CLog::Log(LOGDEBUG, "%s: Cleaning genre table", __FUNCTION__); sql = "DELETE FROM genre " "WHERE NOT EXISTS (SELECT 1 FROM genre_link WHERE genre_link.genre_id = genre.genre_id)"; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); CLog::Log(LOGDEBUG, "%s: Cleaning country table", __FUNCTION__); sql = "DELETE FROM country WHERE NOT EXISTS (SELECT 1 FROM country_link WHERE country_link.country_id = country.country_id)"; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); CLog::Log(LOGDEBUG, "%s: Cleaning actor table of actors, directors and writers", __FUNCTION__); sql = "DELETE FROM actor " "WHERE NOT EXISTS (SELECT 1 FROM actor_link WHERE actor_link.actor_id = actor.actor_id) " "AND NOT EXISTS (SELECT 1 FROM director_link WHERE director_link.actor_id = actor.actor_id) " "AND NOT EXISTS (SELECT 1 FROM writer_link WHERE writer_link.actor_id = actor.actor_id)"; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); CLog::Log(LOGDEBUG, "%s: Cleaning studio table", __FUNCTION__); sql = "DELETE FROM studio " "WHERE NOT EXISTS (SELECT 1 FROM studio_link WHERE studio_link.studio_id = studio.studio_id)"; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); CLog::Log(LOGDEBUG, "%s: Cleaning set table", __FUNCTION__); sql = "DELETE FROM sets WHERE NOT EXISTS (SELECT 1 FROM movie WHERE movie.idSet = sets.idSet)"; - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); CommitTransaction(); @@ -8062,7 +8139,7 @@ if (progress) progress->Close(); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnCleanFinished"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnCleanFinished"); } std::vector CVideoDatabase::CleanMediaType(const std::string &mediaType, const std::string &cleanableFileIDs, @@ -8110,12 +8187,12 @@ parentPathIdField.c_str(), table.c_str(), cleanableFileIDs.c_str()); - VECSOURCES videoSources(*CMediaSourceSettings::GetInstance().GetSources("video")); + VECSOURCES videoSources(*CMediaSourceSettings::Get().GetSources("video")); g_mediaManager.GetRemovableDrives(videoSources); // map of parent path ID to boolean pair (if not exists and user choice) std::map > sourcePathsDeleteDecisions; - m_pDS2->query(sql); + m_pDS2->query(sql.c_str()); while (!m_pDS2->eof()) { bool del = true; @@ -8153,19 +8230,22 @@ if (pDialog != NULL) { CURL sourceUrl(sourcePath); - pDialog->SetHeading(CVariant{15012}); - pDialog->SetText(CVariant{StringUtils::Format(g_localizeStrings.Get(15013).c_str(), sourceUrl.GetWithoutUserDetails().c_str())}); - pDialog->SetChoice(0, CVariant{15015}); - pDialog->SetChoice(1, CVariant{15014}); - pDialog->Open(); + pDialog->SetHeading(15012); + pDialog->SetText(StringUtils::Format(g_localizeStrings.Get(15013).c_str(), sourceUrl.GetWithoutUserDetails().c_str())); + pDialog->SetChoice(0, 15015); + pDialog->SetChoice(1, 15014); + + //send message and wait for user input + ThreadMessage tMsg = { TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_YES_NO, g_windowManager.GetActiveWindow() }; + CApplicationMessenger::Get().SendMessage(tMsg, true); del = !pDialog->IsConfirmed(); } } } - sourcePathsDeleteDecisions.insert(std::make_pair(sourcePathID, std::make_pair(sourcePathNotExists, del))); - pathsDeleteDecisions.insert(std::make_pair(sourcePathID, sourcePathNotExists && del)); + sourcePathsDeleteDecisions.insert(make_pair(sourcePathID, make_pair(sourcePathNotExists, del))); + pathsDeleteDecisions.insert(make_pair(sourcePathID, sourcePathNotExists && del)); } // the only reason not to delete the file is if the parent path doesn't // exist and the user decided to delete all the items it contained @@ -8174,7 +8254,7 @@ del = false; if (scanSettings.parent_name) - pathsDeleteDecisions.insert(std::make_pair(m_pDS2->fv(2).get_asInt(), del)); + pathsDeleteDecisions.insert(make_pair(m_pDS2->fv(2).get_asInt(), del)); } if (del) @@ -8234,7 +8314,7 @@ } } -void CVideoDatabase::ExportToXML(const std::string &path, bool singleFile /* = true */, bool images /* = false */, bool actorThumbs /* false */, bool overwrite /*=false*/) +void CVideoDatabase::ExportToXML(const std::string &path, bool singleFiles /* = false */, bool images /* = false */, bool actorThumbs /* false */, bool overwrite /*=false*/) { int iFailCount = 0; CGUIDialogProgress *progress=NULL; @@ -8245,11 +8325,11 @@ if (NULL == m_pDS2.get()) return; // create a 3rd dataset as well as GetEpisodeDetails() etc. uses m_pDS2, and we need to do 3 nested queries on tv shows - std::unique_ptr pDS; + unique_ptr pDS; pDS.reset(m_pDB->CreateDataset()); if (NULL == pDS.get()) return; - std::unique_ptr pDS2; + unique_ptr pDS2; pDS2.reset(m_pDB->CreateDataset()); if (NULL == pDS2.get()) return; @@ -8260,7 +8340,7 @@ std::string moviesDir = URIUtils::AddFileToFolder(exportRoot, "movies"); std::string musicvideosDir = URIUtils::AddFileToFolder(exportRoot, "musicvideos"); std::string tvshowsDir = URIUtils::AddFileToFolder(exportRoot, "tvshows"); - if (singleFile) + if (!singleFiles) { images = true; overwrite = false; @@ -8277,16 +8357,16 @@ // find all movies std::string sql = "select * from movie_view"; - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (progress) { - progress->SetHeading(CVariant{647}); - progress->SetLine(0, CVariant{650}); - progress->SetLine(1, CVariant{""}); - progress->SetLine(2, CVariant{""}); + progress->SetHeading(647); + progress->SetLine(0, 650); + progress->SetLine(1, ""); + progress->SetLine(2, ""); progress->SetPercentage(0); - progress->Open(); + progress->StartModal(); progress->ShowProgressBar(true); } @@ -8298,7 +8378,7 @@ TiXmlDeclaration decl("1.0", "UTF-8", "yes"); xmlDoc.InsertEndChild(decl); TiXmlNode *pMain = NULL; - if (!singleFile) + if (singleFiles) pMain = &xmlDoc; else { @@ -8313,23 +8393,23 @@ // strip paths to make them relative if (StringUtils::StartsWith(movie.m_strTrailer, movie.m_strPath)) movie.m_strTrailer = movie.m_strTrailer.substr(movie.m_strPath.size()); - std::map artwork; - if (GetArtForItem(movie.m_iDbId, movie.m_type, artwork) && singleFile) + map artwork; + if (GetArtForItem(movie.m_iDbId, movie.m_type, artwork) && !singleFiles) { TiXmlElement additionalNode("art"); - for (std::map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) + for (map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) XMLUtils::SetString(&additionalNode, i->first.c_str(), i->second); movie.Save(pMain, "movie", true, &additionalNode); } else - movie.Save(pMain, "movie", singleFile); + movie.Save(pMain, "movie", !singleFiles); // reset old skip state bool bSkip = false; if (progress) { - progress->SetLine(1, CVariant{movie.m_strTitle}); + progress->SetLine(1, movie.m_strTitle); progress->SetPercentage(current * 100 / total); progress->Progress(); if (progress->IsCanceled()) @@ -8341,7 +8421,7 @@ } CFileItem item(movie.m_strFileNameAndPath,false); - if (!singleFile && CUtil::SupportsWriteFileOperations(movie.m_strFileNameAndPath)) + if (singleFiles && CUtil::SupportsWriteFileOperations(movie.m_strFileNameAndPath)) { if (!item.Exists(false)) { @@ -8370,7 +8450,7 @@ } } } - if (!singleFile) + if (singleFiles) { xmlDoc.Clear(); TiXmlDeclaration decl("1.0", "UTF-8", "yes"); @@ -8379,20 +8459,20 @@ if (images && !bSkip) { - if (singleFile) + if (!singleFiles) { std::string strFileName(movie.m_strTitle); if (movie.m_iYear > 0) strFileName += StringUtils::Format("_%i", movie.m_iYear); item.SetPath(GetSafeFile(moviesDir, strFileName) + ".avi"); } - for (std::map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) + for (map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) { std::string savedThumb = item.GetLocalArt(i->first, false); - CTextureCache::GetInstance().Export(i->second, savedThumb, overwrite); + CTextureCache::Get().Export(i->second, savedThumb, overwrite); } if (actorThumbs) - ExportActorThumbs(actorsDir, movie, !singleFile, overwrite); + ExportActorThumbs(actorsDir, movie, singleFiles, overwrite); } m_pDS->next(); current++; @@ -8402,7 +8482,7 @@ // find all musicvideos sql = "select * from musicvideo_view"; - m_pDS->query(sql); + m_pDS->query(sql.c_str()); total = m_pDS->num_rows(); current = 0; @@ -8410,23 +8490,23 @@ while (!m_pDS->eof()) { CVideoInfoTag movie = GetDetailsForMusicVideo(m_pDS, true); - std::map artwork; - if (GetArtForItem(movie.m_iDbId, movie.m_type, artwork) && singleFile) + map artwork; + if (GetArtForItem(movie.m_iDbId, movie.m_type, artwork) && !singleFiles) { TiXmlElement additionalNode("art"); - for (std::map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) + for (map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) XMLUtils::SetString(&additionalNode, i->first.c_str(), i->second); movie.Save(pMain, "musicvideo", true, &additionalNode); } else - movie.Save(pMain, "musicvideo", singleFile); + movie.Save(pMain, "musicvideo", !singleFiles); // reset old skip state bool bSkip = false; if (progress) { - progress->SetLine(1, CVariant{movie.m_strTitle}); + progress->SetLine(1, movie.m_strTitle); progress->SetPercentage(current * 100 / total); progress->Progress(); if (progress->IsCanceled()) @@ -8438,7 +8518,7 @@ } CFileItem item(movie.m_strFileNameAndPath,false); - if (!singleFile && CUtil::SupportsWriteFileOperations(movie.m_strFileNameAndPath)) + if (singleFiles && CUtil::SupportsWriteFileOperations(movie.m_strFileNameAndPath)) { if (!item.Exists(false)) { @@ -8460,7 +8540,7 @@ } } } - if (!singleFile) + if (singleFiles) { xmlDoc.Clear(); TiXmlDeclaration decl("1.0", "UTF-8", "yes"); @@ -8468,17 +8548,17 @@ } if (images && !bSkip) { - if (singleFile) + if (!singleFiles) { std::string strFileName(StringUtils::Join(movie.m_artist, g_advancedSettings.m_videoItemSeparator) + "." + movie.m_strTitle); if (movie.m_iYear > 0) strFileName += StringUtils::Format("_%i", movie.m_iYear); item.SetPath(GetSafeFile(moviesDir, strFileName) + ".avi"); } - for (std::map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) + for (map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) { std::string savedThumb = item.GetLocalArt(i->first, false); - CTextureCache::GetInstance().Export(i->second, savedThumb, overwrite); + CTextureCache::Get().Export(i->second, savedThumb, overwrite); } } m_pDS->next(); @@ -8488,7 +8568,7 @@ // repeat for all tvshows sql = "SELECT * FROM tvshow_view"; - m_pDS->query(sql); + m_pDS->query(sql.c_str()); total = m_pDS->num_rows(); current = 0; @@ -8497,34 +8577,34 @@ { CVideoInfoTag tvshow = GetDetailsForTvShow(m_pDS, true); - std::map > seasonArt; + map > seasonArt; GetTvShowSeasonArt(tvshow.m_iDbId, seasonArt); - std::map artwork; - if (GetArtForItem(tvshow.m_iDbId, tvshow.m_type, artwork) && singleFile) + map artwork; + if (GetArtForItem(tvshow.m_iDbId, tvshow.m_type, artwork) && !singleFiles) { TiXmlElement additionalNode("art"); - for (std::map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) + for (map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) XMLUtils::SetString(&additionalNode, i->first.c_str(), i->second); - for (std::map >::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) + for (map >::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) { TiXmlElement seasonNode("season"); seasonNode.SetAttribute("num", i->first); - for (std::map::const_iterator j = i->second.begin(); j != i->second.end(); ++j) + for (map::const_iterator j = i->second.begin(); j != i->second.end(); ++j) XMLUtils::SetString(&seasonNode, j->first.c_str(), j->second); additionalNode.InsertEndChild(seasonNode); } tvshow.Save(pMain, "tvshow", true, &additionalNode); } else - tvshow.Save(pMain, "tvshow", singleFile); + tvshow.Save(pMain, "tvshow", !singleFiles); // reset old skip state bool bSkip = false; if (progress) { - progress->SetLine(1, CVariant{tvshow.m_strTitle}); + progress->SetLine(1, tvshow.m_strTitle); progress->SetPercentage(current * 100 / total); progress->Progress(); if (progress->IsCanceled()) @@ -8536,7 +8616,7 @@ } CFileItem item(tvshow.m_strPath, true); - if (!singleFile && CUtil::SupportsWriteFileOperations(tvshow.m_strPath)) + if (singleFiles && CUtil::SupportsWriteFileOperations(tvshow.m_strPath)) { if (!item.Exists(false)) { @@ -8558,7 +8638,7 @@ } } } - if (!singleFile) + if (singleFiles) { xmlDoc.Clear(); TiXmlDeclaration decl("1.0", "UTF-8", "yes"); @@ -8566,64 +8646,64 @@ } if (images && !bSkip) { - if (singleFile) + if (!singleFiles) item.SetPath(GetSafeFile(tvshowsDir, tvshow.m_strTitle)); - for (std::map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) + for (map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) { std::string savedThumb = item.GetLocalArt(i->first, true); - CTextureCache::GetInstance().Export(i->second, savedThumb, overwrite); + CTextureCache::Get().Export(i->second, savedThumb, overwrite); } if (actorThumbs) - ExportActorThumbs(actorsDir, tvshow, !singleFile, overwrite); + ExportActorThumbs(actorsDir, tvshow, singleFiles, overwrite); // export season thumbs - for (std::map >::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) + for (map >::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) { - std::string seasonThumb; + string seasonThumb; if (i->first == -1) seasonThumb = "season-all"; else if (i->first == 0) seasonThumb = "season-specials"; else seasonThumb = StringUtils::Format("season%02i", i->first); - for (std::map::const_iterator j = i->second.begin(); j != i->second.end(); ++j) + for (map::const_iterator j = i->second.begin(); j != i->second.end(); ++j) { std::string savedThumb(item.GetLocalArt(seasonThumb + "-" + j->first, true)); if (!i->second.empty()) - CTextureCache::GetInstance().Export(j->second, savedThumb, overwrite); + CTextureCache::Get().Export(j->second, savedThumb, overwrite); } } } // now save the episodes from this show sql = PrepareSQL("select * from episode_view where idShow=%i order by strFileName, idEpisode",tvshow.m_iDbId); - pDS->query(sql); + pDS->query(sql.c_str()); std::string showDir(item.GetPath()); while (!pDS->eof()) { CVideoInfoTag episode = GetDetailsForEpisode(pDS, true); - std::map artwork; - if (GetArtForItem(episode.m_iDbId, MediaTypeEpisode, artwork) && singleFile) + map artwork; + if (GetArtForItem(episode.m_iDbId, MediaTypeEpisode, artwork) && !singleFiles) { TiXmlElement additionalNode("art"); - for (std::map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) + for (map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) XMLUtils::SetString(&additionalNode, i->first.c_str(), i->second); episode.Save(pMain->LastChild(), "episodedetails", true, &additionalNode); } - else if (singleFile) - episode.Save(pMain->LastChild(), "episodedetails", singleFile); + else if (!singleFiles) + episode.Save(pMain->LastChild(), "episodedetails", !singleFiles); else - episode.Save(pMain, "episodedetails", singleFile); + episode.Save(pMain, "episodedetails", !singleFiles); pDS->next(); // multi-episode files need dumping to the same XML - while (!singleFile && !pDS->eof() && + while (singleFiles && !pDS->eof() && episode.m_iFileId == pDS->fv("idFile").get_asInt()) { episode = GetDetailsForEpisode(pDS, true); - episode.Save(pMain, "episodedetails", singleFile); + episode.Save(pMain, "episodedetails", !singleFiles); pDS->next(); } @@ -8631,7 +8711,7 @@ bool bSkip = false; CFileItem item(episode.m_strFileNameAndPath, false); - if (!singleFile && CUtil::SupportsWriteFileOperations(episode.m_strFileNameAndPath)) + if (singleFiles && CUtil::SupportsWriteFileOperations(episode.m_strFileNameAndPath)) { if (!item.Exists(false)) { @@ -8653,7 +8733,7 @@ } } } - if (!singleFile) + if (singleFiles) { xmlDoc.Clear(); TiXmlDeclaration decl("1.0", "UTF-8", "yes"); @@ -8662,18 +8742,18 @@ if (images && !bSkip) { - if (singleFile) + if (!singleFiles) { std::string epName = StringUtils::Format("s%02ie%02i.avi", episode.m_iSeason, episode.m_iEpisode); item.SetPath(URIUtils::AddFileToFolder(showDir, epName)); } - for (std::map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) + for (map::const_iterator i = artwork.begin(); i != artwork.end(); ++i) { std::string savedThumb = item.GetLocalArt(i->first, false); - CTextureCache::GetInstance().Export(i->second, savedThumb, overwrite); + CTextureCache::Get().Export(i->second, savedThumb, overwrite); } if (actorThumbs) - ExportActorThumbs(actorsDir, episode, !singleFile, overwrite); + ExportActorThumbs(actorsDir, episode, singleFiles, overwrite); } } pDS->close(); @@ -8682,20 +8762,20 @@ } m_pDS->close(); - if (!singleFile && progress) + if (singleFiles && progress) { progress->SetPercentage(100); progress->Progress(); } - if (singleFile) + if (!singleFiles) { // now dump path info - std::set paths; + set paths; GetPaths(paths); TiXmlElement xmlPathElement("paths"); TiXmlNode *pPaths = pMain->InsertEndChild(xmlPathElement); - for(std::set::iterator iter = paths.begin(); iter != paths.end(); ++iter) + for( set::iterator iter = paths.begin(); iter != paths.end(); ++iter) { bool foundDirectly = false; SScanSettings settings; @@ -8713,15 +8793,6 @@ } xmlDoc.SaveFile(xmlFile); } - CVariant data; - if (singleFile) - { - data["root"] = exportRoot; - data["file"] = xmlFile; - if (iFailCount > 0) - data["failcount"] = iFailCount; - } - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnExport", data); } catch (...) { @@ -8733,7 +8804,7 @@ progress->Close(); if (iFailCount > 0) - CGUIDialogOK::ShowAndGetInput(CVariant{647}, CVariant{StringUtils::Format(g_localizeStrings.Get(15011).c_str(), iFailCount)}); + CGUIDialogOK::ShowAndGetInput(647, StringUtils::Format(g_localizeStrings.Get(15011).c_str(), iFailCount)); } void CVideoDatabase::ExportActorThumbs(const std::string &strDir, const CVideoInfoTag &tag, bool singleFiles, bool overwrite /*=false*/) @@ -8756,7 +8827,7 @@ if (!iter->thumb.empty()) { std::string thumbFile(GetSafeFile(strPath, iter->strName)); - CTextureCache::GetInstance().Export(iter->thumb, thumbFile, overwrite); + CTextureCache::Get().Export(iter->thumb, thumbFile, overwrite); } } } @@ -8779,12 +8850,12 @@ progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); if (progress) { - progress->SetHeading(CVariant{648}); - progress->SetLine(0, CVariant{649}); - progress->SetLine(1, CVariant{330}); - progress->SetLine(2, CVariant{""}); + progress->SetHeading(648); + progress->SetLine(0, 649); + progress->SetLine(1, 330); + progress->SetLine(2, ""); progress->SetPercentage(0); - progress->Open(); + progress->StartModal(); progress->ShowProgressBar(true); } @@ -8826,7 +8897,7 @@ AddonPtr addon; std::string id; XMLUtils::GetString(path,"scraperpath",id); - if (CAddonMgr::GetInstance().GetAddon(id, addon)) + if (CAddonMgr::Get().GetAddon(id, addon)) { SScanSettings settings; ScraperPtr scraper = std::dynamic_pointer_cast(addon); @@ -8889,10 +8960,10 @@ showItem.SetArt(artItem.GetArt()); int showID = scanner.AddVideo(&showItem, CONTENT_TVSHOWS, useFolders, true, NULL, true); // season artwork - std::map > seasonArt; + map > seasonArt; artItem.GetVideoInfoTag()->m_strPath = artPath; scanner.GetSeasonThumbs(*artItem.GetVideoInfoTag(), seasonArt, CVideoThumbLoader::GetArtTypes(MediaTypeSeason), true); - for (std::map >::iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) + for (map >::iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) { int seasonID = AddSeason(showID, i->first); SetArtForItem(seasonID, MediaTypeSeason, i->second); @@ -8919,7 +8990,7 @@ if (progress && total) { progress->SetPercentage(current * 100 / total); - progress->SetLine(2, CVariant{info.m_strTitle}); + progress->SetLine(2, info.m_strTitle); progress->Progress(); if (progress->IsCanceled()) { @@ -8937,7 +9008,7 @@ progress->Close(); } -bool CVideoDatabase::ImportArtFromXML(const TiXmlNode *node, std::map &artwork) +bool CVideoDatabase::ImportArtFromXML(const TiXmlNode *node, map &artwork) { if (!node) return false; const TiXmlNode *art = node->FirstChild(); @@ -9008,13 +9079,13 @@ bool CVideoDatabase::SetSingleValue(VIDEODB_CONTENT_TYPE type, int dbId, int dbField, const std::string &strValue) { - std::string strSQL; + string strSQL; try { if (NULL == m_pDB.get() || NULL == m_pDS.get()) return false; - std::string strTable, strField; + string strTable, strField; if (type == VIDEODB_CONTENT_MOVIES) { strTable = "movie"; @@ -9076,7 +9147,7 @@ sql = PrepareSQL("UPDATE %s SET %s='%s'", table.c_str(), fieldName.c_str(), strValue.c_str()); if (!conditionName.empty()) sql += PrepareSQL(" WHERE %s=%u", conditionName.c_str(), conditionValue); - if (m_pDS->exec(sql) == 0) + if (m_pDS->exec(sql.c_str()) == 0) return true; } catch (...) @@ -9100,7 +9171,7 @@ data["id"] = id; if (scanning) data["transaction"] = true; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnRemove", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnRemove", data); } void CVideoDatabase::AnnounceUpdate(std::string content, int id) @@ -9108,7 +9179,7 @@ CVariant data; data["type"] = content; data["id"] = id; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", data); } bool CVideoDatabase::GetItemsForPath(const std::string &content, const std::string &strPath, CFileItemList &items) @@ -9117,7 +9188,7 @@ if(URIUtils::IsMultiPath(path)) { - std::vector paths; + vector paths; CMultiPathDirectory::GetPaths(path, paths); for(unsigned i=0;iexec(sql); - return true; - } - catch (...) - { - CLog::Log(LOGERROR, "%s (%i, %s, %i) failed", __FUNCTION__, dbId, mediaType.c_str(), rating); - } - return false; -} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoDatabase.h kodi-15.2~git20151019.1039-final/xbmc/video/VideoDatabase.h --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoDatabase.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoDatabase.h 2015-10-19 08:39:17.000000000 +0000 @@ -18,17 +18,15 @@ * . * */ - -#include -#include -#include - +#include "dbwrappers/Database.h" +#include "VideoInfoTag.h" #include "addons/Scraper.h" #include "Bookmark.h" -#include "dbwrappers/Database.h" #include "utils/SortUtils.h" #include "video/VideoDbUrl.h" -#include "VideoInfoTag.h" + +#include +#include class CFileItem; class CFileItemList; @@ -73,50 +71,44 @@ #define VIDEODB_DETAILS_FILEID 1 #define VIDEODB_DETAILS_MOVIE_SET_ID VIDEODB_MAX_COLUMNS + 2 -#define VIDEODB_DETAILS_MOVIE_USER_RATING VIDEODB_MAX_COLUMNS + 3 -#define VIDEODB_DETAILS_MOVIE_SET_NAME VIDEODB_MAX_COLUMNS + 4 -#define VIDEODB_DETAILS_MOVIE_SET_OVERVIEW VIDEODB_MAX_COLUMNS + 5 -#define VIDEODB_DETAILS_MOVIE_FILE VIDEODB_MAX_COLUMNS + 6 -#define VIDEODB_DETAILS_MOVIE_PATH VIDEODB_MAX_COLUMNS + 7 -#define VIDEODB_DETAILS_MOVIE_PLAYCOUNT VIDEODB_MAX_COLUMNS + 8 -#define VIDEODB_DETAILS_MOVIE_LASTPLAYED VIDEODB_MAX_COLUMNS + 9 -#define VIDEODB_DETAILS_MOVIE_DATEADDED VIDEODB_MAX_COLUMNS + 10 -#define VIDEODB_DETAILS_MOVIE_RESUME_TIME VIDEODB_MAX_COLUMNS + 11 -#define VIDEODB_DETAILS_MOVIE_TOTAL_TIME VIDEODB_MAX_COLUMNS + 12 +#define VIDEODB_DETAILS_MOVIE_SET_NAME VIDEODB_MAX_COLUMNS + 3 +#define VIDEODB_DETAILS_MOVIE_FILE VIDEODB_MAX_COLUMNS + 4 +#define VIDEODB_DETAILS_MOVIE_PATH VIDEODB_MAX_COLUMNS + 5 +#define VIDEODB_DETAILS_MOVIE_PLAYCOUNT VIDEODB_MAX_COLUMNS + 6 +#define VIDEODB_DETAILS_MOVIE_LASTPLAYED VIDEODB_MAX_COLUMNS + 7 +#define VIDEODB_DETAILS_MOVIE_DATEADDED VIDEODB_MAX_COLUMNS + 8 +#define VIDEODB_DETAILS_MOVIE_RESUME_TIME VIDEODB_MAX_COLUMNS + 9 +#define VIDEODB_DETAILS_MOVIE_TOTAL_TIME VIDEODB_MAX_COLUMNS + 10 #define VIDEODB_DETAILS_EPISODE_TVSHOW_ID VIDEODB_MAX_COLUMNS + 2 -#define VIDEODB_DETAILS_EPISODE_USER_RATING VIDEODB_MAX_COLUMNS + 3 -#define VIDEODB_DETAILS_EPISODE_SEASON_ID VIDEODB_MAX_COLUMNS + 4 -#define VIDEODB_DETAILS_EPISODE_FILE VIDEODB_MAX_COLUMNS + 5 -#define VIDEODB_DETAILS_EPISODE_PATH VIDEODB_MAX_COLUMNS + 6 -#define VIDEODB_DETAILS_EPISODE_PLAYCOUNT VIDEODB_MAX_COLUMNS + 7 -#define VIDEODB_DETAILS_EPISODE_LASTPLAYED VIDEODB_MAX_COLUMNS + 8 -#define VIDEODB_DETAILS_EPISODE_DATEADDED VIDEODB_MAX_COLUMNS + 9 -#define VIDEODB_DETAILS_EPISODE_TVSHOW_NAME VIDEODB_MAX_COLUMNS + 10 -#define VIDEODB_DETAILS_EPISODE_TVSHOW_GENRE VIDEODB_MAX_COLUMNS + 11 -#define VIDEODB_DETAILS_EPISODE_TVSHOW_STUDIO VIDEODB_MAX_COLUMNS + 12 -#define VIDEODB_DETAILS_EPISODE_TVSHOW_AIRED VIDEODB_MAX_COLUMNS + 13 -#define VIDEODB_DETAILS_EPISODE_TVSHOW_MPAA VIDEODB_MAX_COLUMNS + 14 -#define VIDEODB_DETAILS_EPISODE_RESUME_TIME VIDEODB_MAX_COLUMNS + 15 -#define VIDEODB_DETAILS_EPISODE_TOTAL_TIME VIDEODB_MAX_COLUMNS + 16 - -#define VIDEODB_DETAILS_TVSHOW_USER_RATING VIDEODB_MAX_COLUMNS + 1 -#define VIDEODB_DETAILS_TVSHOW_PARENTPATHID VIDEODB_MAX_COLUMNS + 2 -#define VIDEODB_DETAILS_TVSHOW_PATH VIDEODB_MAX_COLUMNS + 3 -#define VIDEODB_DETAILS_TVSHOW_DATEADDED VIDEODB_MAX_COLUMNS + 4 -#define VIDEODB_DETAILS_TVSHOW_LASTPLAYED VIDEODB_MAX_COLUMNS + 5 -#define VIDEODB_DETAILS_TVSHOW_NUM_EPISODES VIDEODB_MAX_COLUMNS + 6 -#define VIDEODB_DETAILS_TVSHOW_NUM_WATCHED VIDEODB_MAX_COLUMNS + 7 -#define VIDEODB_DETAILS_TVSHOW_NUM_SEASONS VIDEODB_MAX_COLUMNS + 8 - -#define VIDEODB_DETAILS_MUSICVIDEO_USER_RATING VIDEODB_MAX_COLUMNS + 2 -#define VIDEODB_DETAILS_MUSICVIDEO_FILE VIDEODB_MAX_COLUMNS + 3 -#define VIDEODB_DETAILS_MUSICVIDEO_PATH VIDEODB_MAX_COLUMNS + 4 -#define VIDEODB_DETAILS_MUSICVIDEO_PLAYCOUNT VIDEODB_MAX_COLUMNS + 5 -#define VIDEODB_DETAILS_MUSICVIDEO_LASTPLAYED VIDEODB_MAX_COLUMNS + 6 -#define VIDEODB_DETAILS_MUSICVIDEO_DATEADDED VIDEODB_MAX_COLUMNS + 7 -#define VIDEODB_DETAILS_MUSICVIDEO_RESUME_TIME VIDEODB_MAX_COLUMNS + 8 -#define VIDEODB_DETAILS_MUSICVIDEO_TOTAL_TIME VIDEODB_MAX_COLUMNS + 9 +#define VIDEODB_DETAILS_EPISODE_FILE VIDEODB_MAX_COLUMNS + 3 +#define VIDEODB_DETAILS_EPISODE_PATH VIDEODB_MAX_COLUMNS + 4 +#define VIDEODB_DETAILS_EPISODE_PLAYCOUNT VIDEODB_MAX_COLUMNS + 5 +#define VIDEODB_DETAILS_EPISODE_LASTPLAYED VIDEODB_MAX_COLUMNS + 6 +#define VIDEODB_DETAILS_EPISODE_DATEADDED VIDEODB_MAX_COLUMNS + 7 +#define VIDEODB_DETAILS_EPISODE_TVSHOW_NAME VIDEODB_MAX_COLUMNS + 8 +#define VIDEODB_DETAILS_EPISODE_TVSHOW_STUDIO VIDEODB_MAX_COLUMNS + 9 +#define VIDEODB_DETAILS_EPISODE_TVSHOW_AIRED VIDEODB_MAX_COLUMNS + 10 +#define VIDEODB_DETAILS_EPISODE_TVSHOW_MPAA VIDEODB_MAX_COLUMNS + 11 +#define VIDEODB_DETAILS_EPISODE_RESUME_TIME VIDEODB_MAX_COLUMNS + 12 +#define VIDEODB_DETAILS_EPISODE_TOTAL_TIME VIDEODB_MAX_COLUMNS + 13 +#define VIDEODB_DETAILS_EPISODE_SEASON_ID VIDEODB_MAX_COLUMNS + 14 + +#define VIDEODB_DETAILS_TVSHOW_PARENTPATHID VIDEODB_MAX_COLUMNS + 1 +#define VIDEODB_DETAILS_TVSHOW_PATH VIDEODB_MAX_COLUMNS + 2 +#define VIDEODB_DETAILS_TVSHOW_DATEADDED VIDEODB_MAX_COLUMNS + 3 +#define VIDEODB_DETAILS_TVSHOW_LASTPLAYED VIDEODB_MAX_COLUMNS + 4 +#define VIDEODB_DETAILS_TVSHOW_NUM_EPISODES VIDEODB_MAX_COLUMNS + 5 +#define VIDEODB_DETAILS_TVSHOW_NUM_WATCHED VIDEODB_MAX_COLUMNS + 6 +#define VIDEODB_DETAILS_TVSHOW_NUM_SEASONS VIDEODB_MAX_COLUMNS + 7 + +#define VIDEODB_DETAILS_MUSICVIDEO_FILE VIDEODB_MAX_COLUMNS + 2 +#define VIDEODB_DETAILS_MUSICVIDEO_PATH VIDEODB_MAX_COLUMNS + 3 +#define VIDEODB_DETAILS_MUSICVIDEO_PLAYCOUNT VIDEODB_MAX_COLUMNS + 4 +#define VIDEODB_DETAILS_MUSICVIDEO_LASTPLAYED VIDEODB_MAX_COLUMNS + 5 +#define VIDEODB_DETAILS_MUSICVIDEO_DATEADDED VIDEODB_MAX_COLUMNS + 6 +#define VIDEODB_DETAILS_MUSICVIDEO_RESUME_TIME VIDEODB_MAX_COLUMNS + 7 +#define VIDEODB_DETAILS_MUSICVIDEO_TOTAL_TIME VIDEODB_MAX_COLUMNS + 8 #define VIDEODB_TYPE_STRING 1 #define VIDEODB_TYPE_INT 2 @@ -246,17 +238,15 @@ VIDEODB_ID_SEASON_ID = 0, VIDEODB_ID_SEASON_TVSHOW_ID = 1, VIDEODB_ID_SEASON_NUMBER = 2, - VIDEODB_ID_SEASON_NAME = 3, - VIDEODB_ID_SEASON_TVSHOW_PATH = 4, - VIDEODB_ID_SEASON_TVSHOW_TITLE = 5, - VIDEODB_ID_SEASON_TVSHOW_PLOT = 6, - VIDEODB_ID_SEASON_TVSHOW_PREMIERED = 7, - VIDEODB_ID_SEASON_TVSHOW_GENRE = 8, - VIDEODB_ID_SEASON_TVSHOW_STUDIO = 9, - VIDEODB_ID_SEASON_TVSHOW_MPAA = 10, - VIDEODB_ID_SEASON_EPISODES_TOTAL = 11, - VIDEODB_ID_SEASON_EPISODES_WATCHED = 12, - VIDEODB_ID_SEASON_PREMIERED = 13, + VIDEODB_ID_SEASON_TVSHOW_PATH = 3, + VIDEODB_ID_SEASON_TVSHOW_TITLE = 4, + VIDEODB_ID_SEASON_TVSHOW_PLOT = 5, + VIDEODB_ID_SEASON_TVSHOW_PREMIERED = 6, + VIDEODB_ID_SEASON_TVSHOW_GENRE = 7, + VIDEODB_ID_SEASON_TVSHOW_STUDIO = 8, + VIDEODB_ID_SEASON_TVSHOW_MPAA = 9, + VIDEODB_ID_SEASON_EPISODES_TOTAL = 10, + VIDEODB_ID_SEASON_EPISODES_WATCHED = 11, VIDEODB_ID_SEASON_MAX } VIDEODB_SEASON_IDS; @@ -733,7 +723,7 @@ */ void UpdateFileDateAdded(int idFile, const std::string& strFileNameAndPath); - void ExportToXML(const std::string &path, bool singleFile = true, bool images=false, bool actorThumbs=false, bool overwrite=false); + void ExportToXML(const std::string &path, bool singleFiles = false, bool images=false, bool actorThumbs=false, bool overwrite=false); void ExportActorThumbs(const std::string &path, const CVideoInfoTag& tag, bool singleFiles, bool overwrite=false); void ImportFromXML(const std::string &path); void DumpToDummyFiles(const std::string &path); @@ -798,16 +788,10 @@ virtual bool GetFilter(CDbUrl &videoUrl, Filter &filter, SortDescription &sorting); - /*! \brief Will check if the season exists and if that is not the case add it to the database. - \param showID The id of the show in question. - \param season The season number we want to add. - \return The dbId of the season. - */ int AddSeason(int showID, int season); - int AddSet(const std::string& strSet, const std::string& strOverview = ""); + int AddSet(const std::string& strSet); void ClearMovieSet(int idMovie); void SetMovieSet(int idMovie, int idSet); - bool SetVideoUserRating(int dbId, int rating, const MediaType& mediaType); protected: int GetMovieId(const std::string& strFilenameAndPath); @@ -920,7 +904,7 @@ */ int GetPlayCount(int iFileId); - virtual int GetMinSchemaVersion() const { return 75; }; + virtual int GetMinSchemaVersion() const { return 60; }; virtual int GetSchemaVersion() const; virtual int GetExportVersion() const { return 1; }; const char *GetBaseDBName() const { return "MyVideos"; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoDbUrl.cpp kodi-15.2~git20151019.1039-final/xbmc/video/VideoDbUrl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoDbUrl.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoDbUrl.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -24,6 +24,7 @@ #include "utils/StringUtils.h" #include "utils/Variant.h" +using namespace std; using namespace XFILE; CVideoDbUrl::CVideoDbUrl() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoDbUrl.h kodi-15.2~git20151019.1039-final/xbmc/video/VideoDbUrl.h --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoDbUrl.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoDbUrl.h 2015-10-19 08:39:17.000000000 +0000 @@ -21,8 +21,6 @@ #include "DbUrl.h" -class CVariant; - class CVideoDbUrl : public CDbUrl { public: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoInfoDownloader.cpp kodi-15.2~git20151019.1039-final/xbmc/video/VideoInfoDownloader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoInfoDownloader.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoInfoDownloader.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -21,13 +21,12 @@ #include "VideoInfoDownloader.h" #include "dialogs/GUIDialogProgress.h" #include "dialogs/GUIDialogOK.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "guilib/GUIWindowManager.h" #include "utils/log.h" -#include "utils/Variant.h" +using namespace std; using namespace VIDEO; -using namespace KODI::MESSAGING; #ifndef __GNUC__ #pragma warning (disable:4018) @@ -66,9 +65,9 @@ if (!sce.Title().empty()) { CGUIDialogOK *pdlg = (CGUIDialogOK *)g_windowManager.GetWindow(WINDOW_DIALOG_OK); - pdlg->SetHeading(CVariant{sce.Title()}); - pdlg->SetLine(0, CVariant{sce.Message()}); - pdlg->Open(); + pdlg->SetHeading(sce.Title()); + pdlg->SetLine(0, sce.Message()); + CApplicationMessenger::Get().DoModal(pdlg, WINDOW_DIALOG_OK); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoInfoScanner.cpp kodi-15.2~git20151019.1039-final/xbmc/video/VideoInfoScanner.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoInfoScanner.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoInfoScanner.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,49 +18,41 @@ * */ -#include "VideoInfoScanner.h" - -#include - -#include "dialogs/GUIDialogExtendedProgressBar.h" -#include "dialogs/GUIDialogOK.h" -#include "dialogs/GUIDialogProgress.h" -#include "events/EventLog.h" -#include "events/MediaLibraryEvent.h" +#include "threads/SystemClock.h" #include "FileItem.h" +#include "VideoInfoScanner.h" #include "filesystem/DirectoryCache.h" -#include "filesystem/File.h" +#include "Util.h" +#include "NfoFile.h" +#include "utils/RegExp.h" +#include "utils/md5.h" #include "filesystem/MultiPathDirectory.h" #include "filesystem/StackDirectory.h" +#include "VideoInfoDownloader.h" #include "GUIInfoManager.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "GUIUserMessages.h" +#include "filesystem/File.h" +#include "dialogs/GUIDialogExtendedProgressBar.h" +#include "dialogs/GUIDialogProgress.h" +#include "dialogs/GUIDialogYesNo.h" +#include "dialogs/GUIDialogOK.h" #include "interfaces/AnnouncementManager.h" -#include "messaging/ApplicationMessenger.h" -#include "messaging/helpers/DialogHelper.h" -#include "NfoFile.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" -#include "TextureCache.h" -#include "threads/SystemClock.h" -#include "URL.h" -#include "Util.h" -#include "utils/log.h" -#include "utils/md5.h" -#include "utils/RegExp.h" #include "utils/StringUtils.h" +#include "guilib/LocalizeStrings.h" +#include "guilib/GUIWindowManager.h" +#include "utils/log.h" #include "utils/URIUtils.h" #include "utils/Variant.h" #include "video/VideoLibraryQueue.h" #include "video/VideoThumbLoader.h" -#include "VideoInfoDownloader.h" +#include "TextureCache.h" +#include "GUIUserMessages.h" +#include "URL.h" +using namespace std; using namespace XFILE; using namespace ADDON; -using namespace KODI::MESSAGING; - -using KODI::MESSAGING::HELPERS::DialogResponse; namespace VIDEO { @@ -88,7 +80,7 @@ try { - if (m_showDialog && !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_BACKGROUNDUPDATE)) + if (m_showDialog && !CSettings::Get().GetBool("videolibrary.backgroundupdate")) { CGUIDialogExtendedProgressBar* dialog = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); @@ -100,7 +92,7 @@ if (m_bClean && m_pathsToScan.empty()) { std::set paths; - CVideoLibraryQueue::GetInstance().CleanLibrary(paths, false, m_handle); + CVideoLibraryQueue::Get().CleanLibrary(paths, false, m_handle); if (m_handle) m_handle->MarkFinished(); @@ -118,7 +110,7 @@ m_bCanInterrupt = true; CLog::Log(LOGNOTICE, "VideoInfoScanner: Starting scan .."); - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnScanStarted"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnScanStarted"); // Reset progress vars m_currentItem = 0; @@ -156,7 +148,7 @@ if (!bCancelled) { if (m_bClean) - CVideoLibraryQueue::GetInstance().CleanLibrary(m_pathsToClean, false, m_handle); + CVideoLibraryQueue::Get().CleanLibrary(m_pathsToClean, false, m_handle); else { if (m_handle) @@ -177,7 +169,7 @@ } m_bRunning = false; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnScanFinished"); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnScanFinished"); if (m_handle) m_handle->MarkFinished(); @@ -199,18 +191,18 @@ } else { // scan all the paths of this subtree that is in the database - std::vector rootDirs; + vector rootDirs; if (URIUtils::IsMultiPath(strDirectory)) CMultiPathDirectory::GetPaths(strDirectory, rootDirs); else rootDirs.push_back(strDirectory); - for (std::vector::const_iterator it = rootDirs.begin(); it < rootDirs.end(); ++it) + for (vector::const_iterator it = rootDirs.begin(); it < rootDirs.end(); ++it) { m_pathsToScan.insert(*it); - std::vector> subpaths; + vector< pair > subpaths; m_database.GetSubPaths(*it, subpaths); - for (std::vector>::iterator it = subpaths.begin(); it < subpaths.end(); ++it) + for (vector< pair >::iterator it = subpaths.begin(); it < subpaths.end(); ++it) m_pathsToScan.insert(it->second); } } @@ -254,7 +246,7 @@ * the check for file or folder exclusion to prevent an infinite while loop * in Process(). */ - std::set::iterator it = m_pathsToScan.find(strDirectory); + set::iterator it = m_pathsToScan.find(strDirectory); if (it != m_pathsToScan.end()) m_pathsToScan.erase(it); @@ -268,7 +260,7 @@ CONTENT_TYPE content = info ? info->Content() : CONTENT_NONE; // exclude folders that match our exclude regexps - const std::vector ®exps = content == CONTENT_TVSHOWS ? g_advancedSettings.m_tvshowExcludeFromScanRegExps + const vector ®exps = content == CONTENT_TVSHOWS ? g_advancedSettings.m_tvshowExcludeFromScanRegExps : g_advancedSettings.m_moviesExcludeFromScanRegExps; if (CUtil::ExcludeFileOrFolder(strDirectory, regexps)) @@ -425,7 +417,7 @@ m_database.Open(); bool FoundSomeInfo = false; - std::vector seenPaths; + vector seenPaths; for (int i = 0; i < (int)items.Size(); ++i) { m_nfoReader.Close(); @@ -473,16 +465,6 @@ else if (ret == INFO_NOT_FOUND) { CLog::Log(LOGWARNING, "No information found for item '%s', it won't be added to the library.", CURL::GetRedacted(pItem->GetPath()).c_str()); - - MediaType mediaType = MediaTypeMovie; - if (info2->Content() == CONTENT_TVSHOWS) - mediaType = MediaTypeTvShow; - else if (info2->Content() == CONTENT_MUSICVIDEOS) - mediaType = MediaTypeMusicVideo; - CEventLog::GetInstance().Add(EventPtr(new CMediaLibraryEvent( - mediaType, pItem->GetPath(), 24145, - StringUtils::Format(g_localizeStrings.Get(24147).c_str(), mediaType.c_str(), URIUtils::GetFileName(pItem->GetPath()).c_str()), - pItem->GetArt("thumb"), CURL::GetRedacted(pItem->GetPath()), EventLevelWarning))); } pURL = NULL; @@ -494,9 +476,9 @@ if (content == CONTENT_TVSHOWS && ! seenPaths.empty()) { - std::vector> libPaths; + vector< pair > libPaths; m_database.GetSubPaths(items.GetPath(), libPaths); - for (std::vector >::iterator i = libPaths.begin(); i < libPaths.end(); ++i) + for (vector< pair >::iterator i = libPaths.begin(); i < libPaths.end(); ++i) { if (find(seenPaths.begin(), seenPaths.end(), i->first) == seenPaths.end()) m_pathsToClean.insert(i->first); @@ -511,11 +493,6 @@ INFO_RET CVideoInfoScanner::RetrieveInfoForTvShow(CFileItem *pItem, bool bDirNames, ScraperPtr &info2, bool useLocal, CScraperUrl* pURL, bool fetchEpisodes, CGUIDialogProgress* pDlgProgress) { - if (pItem->m_bIsFolder && IsExcluded(pItem->GetPath())) - { - CLog::Log(LOGWARNING, "Skipping show '%s' with '.nomedia' file in its directory, it won't be added to the library.", CURL::GetRedacted(pItem->GetPath()).c_str()); - return INFO_NOT_NEEDED; - } long idTvShow = -1; if (pItem->m_bIsFolder) idTvShow = m_database.GetTvShowId(pItem->GetPath()); @@ -701,11 +678,11 @@ if (ret == INFO_ADDED) { - std::map> seasonArt; + map > seasonArt; m_database.GetTvShowSeasonArt(showID, seasonArt); bool updateSeasonArt = false; - for (std::map>::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) + for (map >::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) { if (i->second.empty()) { @@ -719,7 +696,7 @@ CVideoInfoDownloader loader(scraper); loader.GetArtwork(showInfo); GetSeasonThumbs(showInfo, seasonArt, CVideoThumbLoader::GetArtTypes(MediaTypeSeason), useLocal); - for (std::map >::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) + for (map >::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i) { int seasonID = m_database.AddSeason(showID, i->first); m_database.SetArtForItem(seasonID, MediaTypeSeason, i->second); @@ -732,7 +709,7 @@ bool CVideoInfoScanner::EnumerateSeriesFolder(CFileItem* item, EPISODELIST& episodeList) { CFileItemList items; - const std::vector ®exps = g_advancedSettings.m_tvshowExcludeFromScanRegExps; + const vector ®exps = g_advancedSettings.m_tvshowExcludeFromScanRegExps; bool bSkip = false; @@ -743,7 +720,7 @@ * Remove this path from the list we're processing in order to avoid hitting * it twice in the main loop. */ - std::set::iterator it = m_pathsToScan.find(item->GetPath()); + set::iterator it = m_pathsToScan.find(item->GetPath()); if (it != m_pathsToScan.end()) m_pathsToScan.erase(it); @@ -1169,7 +1146,7 @@ GetArtwork(pItem, content, videoFolder, useLocal, showInfo ? showInfo->m_strPath : ""); // ensure the art map isn't completely empty by specifying an empty thumb - std::map art = pItem->GetArt(); + map art = pItem->GetArt(); if (art.empty()) art["thumb"] = ""; @@ -1225,14 +1202,14 @@ multipaths are not stored in the database, so in the case we have one, we split the paths, and compute the parent paths in each case. */ - std::vector multipath; + vector multipath; if (!URIUtils::IsMultiPath(pItem->GetPath()) || !CMultiPathDirectory::GetPaths(pItem->GetPath(), multipath)) multipath.push_back(pItem->GetPath()); - std::vector > paths; - for (std::vector::const_iterator i = multipath.begin(); i != multipath.end(); ++i) - paths.push_back(std::make_pair(*i, URIUtils::GetParentPath(*i))); + vector< pair > paths; + for (vector::const_iterator i = multipath.begin(); i != multipath.end(); ++i) + paths.push_back(make_pair(*i, URIUtils::GetParentPath(*i))); - std::map > seasonArt; + map > seasonArt; if (!libraryImport) GetSeasonThumbs(movieDetails, seasonArt, CVideoThumbLoader::GetArtTypes(MediaTypeSeason), useLocal); @@ -1282,11 +1259,11 @@ CVariant data; if (m_bRunning) data["transaction"] = true; - ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", itemCopy, data); + ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", itemCopy, data); return lResult; } - std::string ContentToMediaType(CONTENT_TYPE content, bool folder) + string ContentToMediaType(CONTENT_TYPE content, bool folder) { switch (content) { @@ -1320,8 +1297,8 @@ CGUIListItem::ArtMap art = pItem->GetArt(); // get and cache thumb images - std::vector artTypes = CVideoThumbLoader::GetArtTypes(ContentToMediaType(content, pItem->m_bIsFolder)); - std::vector::iterator i = find(artTypes.begin(), artTypes.end(), "fanart"); + vector artTypes = CVideoThumbLoader::GetArtTypes(ContentToMediaType(content, pItem->m_bIsFolder)); + vector::iterator i = find(artTypes.begin(), artTypes.end(), "fanart"); if (i != artTypes.end()) artTypes.erase(i); // fanart is handled below bool lookForThumb = find(artTypes.begin(), artTypes.end(), "thumb") == artTypes.end() && @@ -1329,13 +1306,13 @@ // find local art if (useLocal) { - for (std::vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) + for (vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) { if (art.find(*i) == art.end()) { std::string image = CVideoThumbLoader::GetLocalArt(*pItem, *i, bApplyToDir); if (!image.empty()) - art.insert(std::make_pair(*i, image)); + art.insert(make_pair(*i, image)); } } // find and classify the local thumb (backcompat) if available @@ -1345,24 +1322,24 @@ if (!image.empty()) { // cache the image and determine sizing CTextureDetails details; - if (CTextureCache::GetInstance().CacheImage(image, details)) + if (CTextureCache::Get().CacheImage(image, details)) { std::string type = GetArtTypeFromSize(details.width, details.height); if (art.find(type) == art.end()) - art.insert(std::make_pair(type, image)); + art.insert(make_pair(type, image)); } } } } // find online art - for (std::vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) + for (vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) { if (art.find(*i) == art.end()) { std::string image = GetImage(pItem, false, bApplyToDir, *i); if (!image.empty()) - art.insert(std::make_pair(*i, image)); + art.insert(make_pair(*i, image)); } } @@ -1371,26 +1348,26 @@ { std::string image = GetImage(pItem, false, bApplyToDir, "thumb"); if (!image.empty()) - art.insert(std::make_pair(artTypes.front(), image)); + art.insert(make_pair(artTypes.front(), image)); } // get & save fanart image (treated separately due to it being stored in m_fanart) bool isEpisode = (content == CONTENT_TVSHOWS && !pItem->m_bIsFolder); if (!isEpisode && art.find("fanart") == art.end()) { - std::string fanart = GetFanart(pItem, useLocal); + string fanart = GetFanart(pItem, useLocal); if (!fanart.empty()) - art.insert(std::make_pair("fanart", fanart)); + art.insert(make_pair("fanart", fanart)); } for (CGUIListItem::ArtMap::const_iterator i = art.begin(); i != art.end(); ++i) - CTextureCache::GetInstance().BackgroundCacheImage(i->second); + CTextureCache::Get().BackgroundCacheImage(i->second); pItem->SetArt(art); // parent folder to apply the thumb to and to search for local actor thumbs std::string parentDir = URIUtils::GetBasePath(pItem->GetPath()); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_ACTORTHUMBS)) + if (CSettings::Get().GetBool("videolibrary.actorthumbs")) FetchActorThumbs(movieDetails.m_cast, actorArtPath.empty() ? parentDir : actorArtPath); if (bApplyToDir) ApplyThumbToFolder(parentDir, art["thumb"]); @@ -1407,9 +1384,9 @@ thumb = CScraperUrl::GetThumbURL(pItem->GetVideoInfoTag()->m_strPictureURL.GetFirstThumb(type)); if (!thumb.empty()) { - if (thumb.find("http://") == std::string::npos && - thumb.find("/") == std::string::npos && - thumb.find("\\") == std::string::npos) + if (thumb.find("http://") == string::npos && + thumb.find("/") == string::npos && + thumb.find("\\") == string::npos) { std::string strPath = URIUtils::GetDirectory(pItem->GetPath()); thumb = URIUtils::AddFileToFolder(strPath, thumb); @@ -1435,8 +1412,8 @@ { if (pDlgProgress) { - pDlgProgress->SetLine(1, CVariant{showInfo.m_strTitle}); - pDlgProgress->SetLine(2, CVariant{20361}); + pDlgProgress->SetLine(1, showInfo.m_strTitle); + pDlgProgress->SetLine(2, 20361); pDlgProgress->SetPercentage(0); pDlgProgress->ShowProgressBar(true); pDlgProgress->Progress(); @@ -1452,7 +1429,7 @@ m_nfoReader.Close(); if (pDlgProgress) { - pDlgProgress->SetLine(2, CVariant{20361}); + pDlgProgress->SetLine(2, 20361); pDlgProgress->SetPercentage((int)((float)(iCurr++)/iMax*100)); pDlgProgress->Progress(); } @@ -1503,7 +1480,7 @@ if (pDlgProgress) { - pDlgProgress->SetLine(2, CVariant{20354}); + pDlgProgress->SetLine(2, 20354); pDlgProgress->Progress(); } @@ -1526,7 +1503,7 @@ EPISODE key(file->iSeason, file->iEpisode, file->iSubepisode); EPISODE backupkey(file->iSeason, file->iEpisode, 0); bool bFound = false; - EPISODELIST::iterator guide = episodes.begin(); + EPISODELIST::iterator guide = episodes.begin();; EPISODELIST matches; for (; guide != episodes.end(); ++guide ) @@ -1582,7 +1559,7 @@ else // Multiple matches found. Use fuzzy match on the title with already matched episodes to pick the best. candidates = &matches; - std::vector titles; + vector titles; for (guide = candidates->begin(); guide != candidates->end(); ++guide) { StringUtils::ToLower(guide->cScraperUrl.strTitle); @@ -1760,7 +1737,7 @@ if (pDialog) { - pDialog->SetLine(1, CVariant{movieDetails.m_strTitle}); + pDialog->SetLine(1, movieDetails.m_strTitle); pDialog->Progress(); } @@ -1801,7 +1778,7 @@ return count; } - bool CVideoInfoScanner::CanFastHash(const CFileItemList &items, const std::vector &excludes) const + bool CVideoInfoScanner::CanFastHash(const CFileItemList &items, const vector &excludes) const { if (!g_advancedSettings.m_bVideoLibraryUseFastHash) return false; @@ -1814,8 +1791,7 @@ return true; } - std::string CVideoInfoScanner::GetFastHash(const std::string &directory, - const std::vector &excludes) const + std::string CVideoInfoScanner::GetFastHash(const std::string &directory, const vector &excludes) const { XBMC::XBMC_MD5 md5state; @@ -1837,8 +1813,7 @@ return ""; } - std::string CVideoInfoScanner::GetRecursiveFastHash(const std::string &directory, - const std::vector &excludes) const + std::string CVideoInfoScanner::GetRecursiveFastHash(const std::string &directory, const vector &excludes) const { CFileItemList items; items.Add(CFileItemPtr(new CFileItem(directory, true))); @@ -1874,8 +1849,7 @@ return ""; } - void CVideoInfoScanner::GetSeasonThumbs(const CVideoInfoTag &show, - std::map> &seasonArt, const std::vector &artTypes, bool useLocal) + void CVideoInfoScanner::GetSeasonThumbs(const CVideoInfoTag &show, map > &seasonArt, const vector &artTypes, bool useLocal) { bool lookForThumb = find(artTypes.begin(), artTypes.end(), "thumb") == artTypes.end(); @@ -1901,14 +1875,14 @@ for (int season = -1; season <= maxSeasons; season++) { // skip if we already have some art - std::map>::const_iterator it = seasonArt.find(season); + map >::const_iterator it = seasonArt.find(season); if (it != seasonArt.end() && !it->second.empty()) continue; - std::map art; + map art; if (useLocal) { - std::string basePath; + string basePath; if (season == -1) basePath = "season-all"; else if (season == 0) @@ -1917,11 +1891,11 @@ basePath = StringUtils::Format("season%02i", season); CFileItem artItem(URIUtils::AddFileToFolder(show.m_strPath, basePath), false); - for (std::vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) + for (vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) { std::string image = CVideoThumbLoader::GetLocalArt(artItem, *i, false); if (!image.empty()) - art.insert(std::make_pair(*i, image)); + art.insert(make_pair(*i, image)); } // find and classify the local thumb (backcompat) if available if (lookForThumb) @@ -1930,46 +1904,46 @@ if (!image.empty()) { // cache the image and determine sizing CTextureDetails details; - if (CTextureCache::GetInstance().CacheImage(image, details)) + if (CTextureCache::Get().CacheImage(image, details)) { std::string type = GetArtTypeFromSize(details.width, details.height); if (art.find(type) == art.end()) - art.insert(std::make_pair(type, image)); + art.insert(make_pair(type, image)); } } } } // find online art - for (std::vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) + for (vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) { if (art.find(*i) == art.end()) { - std::string image = CScraperUrl::GetThumbURL(show.m_strPictureURL.GetSeasonThumb(season, *i)); + string image = CScraperUrl::GetThumbURL(show.m_strPictureURL.GetSeasonThumb(season, *i)); if (!image.empty()) - art.insert(std::make_pair(*i, image)); + art.insert(make_pair(*i, image)); } } // use the first piece of online art as the first art type if no thumb type is available yet if (art.empty() && lookForThumb) { - std::string image = CScraperUrl::GetThumbURL(show.m_strPictureURL.GetSeasonThumb(season, "thumb")); + string image = CScraperUrl::GetThumbURL(show.m_strPictureURL.GetSeasonThumb(season, "thumb")); if (!image.empty()) - art.insert(std::make_pair(artTypes.front(), image)); + art.insert(make_pair(artTypes.front(), image)); } seasonArt[season] = art; } } - void CVideoInfoScanner::FetchActorThumbs(std::vector& actors, const std::string& strPath) + void CVideoInfoScanner::FetchActorThumbs(vector& actors, const std::string& strPath) { CFileItemList items; std::string actorsDir = URIUtils::AddFileToFolder(strPath, ".actors"); if (CDirectory::Exists(actorsDir)) CDirectory::GetDirectory(actorsDir, items, ".png|.jpg|.tbn", DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_NO_FILE_INFO); - for (std::vector::iterator i = actors.begin(); i != actors.end(); ++i) + for (vector::iterator i = actors.begin(); i != actors.end(); ++i) { if (i->thumb.empty()) { @@ -1988,7 +1962,7 @@ if (i->thumb.empty() && !i->thumbUrl.GetFirstThumb().m_url.empty()) i->thumb = CScraperUrl::GetThumbURL(i->thumbUrl.GetFirstThumb()); if (!i->thumb.empty()) - CTextureCache::GetInstance().BackgroundCacheImage(i->thumb); + CTextureCache::Get().BackgroundCacheImage(i->thumb); } } } @@ -1999,7 +1973,7 @@ if (info->Content() == CONTENT_MOVIES || info->Content() == CONTENT_MUSICVIDEOS || (info->Content() == CONTENT_TVSHOWS && !pItem->m_bIsFolder)) strNfoFile = GetnfoFile(pItem, bGrabAny); - else if (info->Content() == CONTENT_TVSHOWS && pItem->m_bIsFolder) + if (info->Content() == CONTENT_TVSHOWS && pItem->m_bIsFolder) strNfoFile = URIUtils::AddFileToFolder(pItem->GetPath(), "tvshow.nfo"); CNfoFile::NFOResult result=CNfoFile::NO_NFO; @@ -2040,7 +2014,6 @@ scrUrl = m_nfoReader.ScraperUrl(); info = m_nfoReader.GetScraperInfo(); - StringUtils::RemoveCRLF(scrUrl.m_url[0].m_url); CLog::Log(LOGDEBUG, "VideoInfoScanner: Fetching url '%s' using %s scraper (content: '%s')", scrUrl.m_url[0].m_url.c_str(), info->Name().c_str(), TranslateContent(info->Content()).c_str()); @@ -2061,19 +2034,19 @@ if (pDialog) { - CGUIDialogOK::ShowAndGetInput(CVariant{20448}, CVariant{20449}); + CGUIDialogOK::ShowAndGetInput(20448, 20449); return false; } - return HELPERS::ShowYesNoDialogText(CVariant{20448}, CVariant{20450}) == DialogResponse::YES; + return CGUIDialogYesNo::ShowAndGetInput(20448, 20450); } bool CVideoInfoScanner::ProgressCancelled(CGUIDialogProgress* progress, int heading, const std::string &line1) { if (progress) { - progress->SetHeading(CVariant{heading}); - progress->SetLine(0, CVariant{line1}); - progress->SetLine(2, CVariant{""}); + progress->SetHeading(heading); + progress->SetLine(0, line1); + progress->SetLine(2, ""); progress->Progress(); return progress->IsCanceled(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoInfoTag.cpp kodi-15.2~git20151019.1039-final/xbmc/video/VideoInfoTag.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoInfoTag.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoInfoTag.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -28,10 +28,10 @@ #include "utils/Archive.h" #include "TextureDatabase.h" -#include -#include #include -#include +#include + +using namespace std; void CVideoInfoTag::Reset() { @@ -51,7 +51,6 @@ m_cast.clear(); m_strSet.clear(); m_iSetId = -1; - m_strSetOverview.clear(); m_tags.clear(); m_strFile.clear(); m_strPath.clear(); @@ -74,7 +73,6 @@ m_iSpecialSortSeason = -1; m_iSpecialSortEpisode = -1; m_fRating = 0.0f; - m_iUserRating = 0; m_iDbId = -1; m_iFileId = -1; m_iBookmarkId = -1; @@ -83,7 +81,6 @@ m_duration = 0; m_lastPlayed.Reset(); m_showLink.clear(); - m_namedSeasons.clear(); m_streamDetails.Reset(); m_playCount = 0; m_fEpBookmark = 0; @@ -115,7 +112,6 @@ if (!m_strSortTitle.empty()) XMLUtils::SetString(movie, "sorttitle", m_strSortTitle); XMLUtils::SetFloat(movie, "rating", m_fRating); - XMLUtils::SetInt(movie, "userrating", m_iUserRating); XMLUtils::SetFloat(movie, "epbookmark", m_fEpBookmark); XMLUtils::SetInt(movie, "year", m_iYear); XMLUtils::SetInt(movie, "top250", m_iTop250); @@ -177,14 +173,7 @@ XMLUtils::SetString(movie, "id", m_strIMDBNumber); XMLUtils::SetStringArray(movie, "genre", m_genre); XMLUtils::SetStringArray(movie, "country", m_country); - if (!m_strSet.empty()) - { - TiXmlElement set("set"); - XMLUtils::SetString(&set, "name", m_strSet); - if (!m_strSetOverview.empty()) - XMLUtils::SetString(&set, "overview", m_strSetOverview); - movie->InsertEndChild(set); - } + XMLUtils::SetString(movie, "set", m_strSet); XMLUtils::SetStringArray(movie, "tag", m_tags); XMLUtils::SetStringArray(movie, "credits", m_writingCredits); XMLUtils::SetStringArray(movie, "director", m_director); @@ -242,14 +231,6 @@ } XMLUtils::SetStringArray(movie, "artist", m_artist); XMLUtils::SetStringArray(movie, "showlink", m_showLink); - - for (const auto& namedSeason : m_namedSeasons) - { - TiXmlElement season("namedseason"); - season.SetAttribute("number", namedSeason.first); - season.SetValue(namedSeason.second); - movie->InsertEndChild(season); - } TiXmlElement resume("resume"); XMLUtils::SetFloat(&resume, "position", (float)m_resumePoint.timeInSeconds); @@ -305,7 +286,6 @@ ar << m_strSet; ar << m_iSetId; - ar << m_strSetOverview; ar << m_tags; ar << m_duration; ar << m_strFile; @@ -330,7 +310,6 @@ ar << m_iEpisode; ar << m_strUniqueId; ar << m_fRating; - ar << m_iUserRating; ar << m_iDbId; ar << m_iFileId; ar << m_iSpecialSortSeason; @@ -339,12 +318,6 @@ ar << m_iTrack; ar << dynamic_cast(m_streamDetails); ar << m_showLink; - ar << static_cast(m_namedSeasons.size()); - for (const auto& namedSeason : m_namedSeasons) - { - ar << namedSeason.first; - ar << namedSeason.second; - } ar << m_fEpBookmark; ar << m_basePath; ar << m_parentPathID; @@ -390,7 +363,6 @@ ar >> m_strSet; ar >> m_iSetId; - ar >> m_strSetOverview; ar >> m_tags; ar >> m_duration; ar >> m_strFile; @@ -415,7 +387,6 @@ ar >> m_iEpisode; ar >> m_strUniqueId; ar >> m_fRating; - ar >> m_iUserRating; ar >> m_iDbId; ar >> m_iFileId; ar >> m_iSpecialSortSeason; @@ -424,18 +395,6 @@ ar >> m_iTrack; ar >> dynamic_cast(m_streamDetails); ar >> m_showLink; - - int namedSeasonSize; - ar >> namedSeasonSize; - for (int i = 0; i < namedSeasonSize; ++i) - { - int seasonNumber; - ar >> seasonNumber; - std::string seasonName; - ar >> seasonName; - m_namedSeasons.insert(std::make_pair(seasonNumber, seasonName)); - } - ar >> m_fEpBookmark; ar >> m_basePath; ar >> m_parentPathID; @@ -477,7 +436,6 @@ } value["set"] = m_strSet; value["setid"] = m_iSetId; - value["setoverview"] = m_strSetOverview; value["tag"] = m_tags; value["runtime"] = GetDuration(); value["file"] = m_strFile; @@ -503,7 +461,6 @@ value["episode"] = m_iEpisode; value["uniqueid"]["unknown"] = m_strUniqueId; value["rating"] = m_fRating; - value["userrating"] = m_iUserRating; value["dbid"] = m_iDbId; value["fileid"] = m_iFileId; value["track"] = m_iTrack; @@ -555,15 +512,7 @@ sortable[FieldPath] = path; break; } - case FieldSortTitle: - { - // seasons with a custom name/title need special handling as they should be sorted by season number - if (m_type == MediaTypeSeason && !m_strSortTitle.empty()) - sortable[FieldSortTitle] = StringUtils::Format(g_localizeStrings.Get(20358).c_str(), m_iSeason); - else - sortable[FieldSortTitle] = m_strSortTitle; - break; - } + case FieldSortTitle: sortable[FieldSortTitle] = m_strSortTitle; break; case FieldTvShowStatus: sortable[FieldTvShowStatus] = m_strStatus; break; case FieldProductionCode: sortable[FieldProductionCode] = m_strProductionCode; break; case FieldAirDate: sortable[FieldAirDate] = m_firstAired.IsValid() ? m_firstAired.GetAsDBDate() : (m_premiered.IsValid() ? m_premiered.GetAsDBDate() : StringUtils::Empty); break; @@ -581,7 +530,6 @@ case FieldEpisodeNumberSpecialSort: sortable[FieldEpisodeNumberSpecialSort] = m_iSpecialSortEpisode; break; case FieldSeasonSpecialSort: sortable[FieldSeasonSpecialSort] = m_iSpecialSortSeason; break; case FieldRating: sortable[FieldRating] = m_fRating; break; - case FieldUserRating: sortable[FieldUserRating] = m_iUserRating; break; case FieldId: sortable[FieldId] = m_iDbId; break; case FieldTrackNumber: sortable[FieldTrackNumber] = m_iTrack; break; case FieldTag: sortable[FieldTag] = m_tags; break; @@ -636,7 +584,6 @@ SetSortTitle(value); XMLUtils::GetFloat(movie, "rating", m_fRating); - XMLUtils::GetInt(movie, "userrating", m_iUserRating); XMLUtils::GetFloat(movie, "epbookmark", m_fEpBookmark); int max_value = 10; const TiXmlElement* rElement = movie->FirstChildElement("rating"); @@ -644,9 +591,6 @@ { m_fRating = m_fRating / max_value * 10; // Normalise the Movie Rating to between 1 and 10 } - const TiXmlElement* urElement = movie->FirstChildElement("userrating"); - if (urElement && (urElement->QueryIntAttribute("max", &max_value) == TIXML_SUCCESS) && max_value >= 1) - m_iUserRating = m_iUserRating / max_value * 10; // Normalise the user Movie Rating to between 1 and 10 XMLUtils::GetInt(movie, "year", m_iYear); XMLUtils::GetInt(movie, "top250", m_iTop250); XMLUtils::GetInt(movie, "season", m_iSeason); @@ -762,18 +706,6 @@ if (XMLUtils::GetStringArray(movie, "showlink", showLink, prioritise, g_advancedSettings.m_videoItemSeparator)) SetShowLink(showLink); - const TiXmlElement* namedSeason = movie->FirstChildElement("namedseason"); - while (namedSeason != nullptr) - { - int seasonNumber; - std::string seasonName = namedSeason->ValueStr(); - if (!seasonName.empty() && - namedSeason->Attribute("number", &seasonNumber) != nullptr) - m_namedSeasons.insert(std::make_pair(seasonNumber, seasonName)); - - namedSeason = namedSeason->NextSiblingElement("namedseason"); - } - // cast const TiXmlElement* node = movie->FirstChildElement("actor"); if (node && node->FirstChild() && prioritise) @@ -804,23 +736,8 @@ node = node->NextSiblingElement("actor"); } - // Pre-Jarvis NFO file: - // A set if (XMLUtils::GetString(movie, "set", value)) SetSet(value); - // Jarvis+: - // A setA set with a number of movies... - node = movie->FirstChildElement("set"); - if (node) - { - // No name, no set - if (XMLUtils::GetString(node, "name", value)) - { - SetSet(value); - if (XMLUtils::GetString(node, "overview", value)) - SetSetOverview(value); - } - } std::vector tags(m_tags); if (XMLUtils::GetStringArray(movie, "tag", tags, prioritise, g_advancedSettings.m_videoItemSeparator)) @@ -848,7 +765,7 @@ const char* clear=node->Attribute("clear"); if (clear && stricmp(clear,"true")==0) artist.clear(); - std::vector newArtists = StringUtils::Split(pValue, g_advancedSettings.m_videoItemSeparator); + vector newArtists = StringUtils::Split(pValue, g_advancedSettings.m_videoItemSeparator); artist.insert(artist.end(), newArtists.begin(), newArtists.end()); } node = node->NextSiblingElement("artist"); @@ -916,7 +833,7 @@ m_strEpisodeGuide = epguide->FirstChild()->Value(); else { - std::stringstream stream; + stringstream stream; stream << *epguide; m_strEpisodeGuide = stream.str(); } @@ -1060,11 +977,6 @@ m_strSet = Trim(std::move(set)); } -void CVideoInfoTag::SetSetOverview(std::string setOverview) -{ - m_strSetOverview = Trim(std::move(setOverview)); -} - void CVideoInfoTag::SetTags(std::vector tags) { m_tags = Trim(std::move(tags)); @@ -1140,20 +1052,6 @@ m_strUniqueId = Trim(std::move(uniqueId)); } -void CVideoInfoTag::SetNamedSeasons(std::map namedSeasons) -{ - m_namedSeasons = std::move(namedSeasons); -} - -void CVideoInfoTag::SetUserrating(int userrating) -{ - //This value needs to be between 0-10 - 0 will unset the userrating - userrating = std::max(userrating, 0); - userrating = std::min(userrating, 10); - - m_iUserRating = userrating; -} - std::string CVideoInfoTag::Trim(std::string &&value) { return StringUtils::Trim(value); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoInfoTag.h kodi-15.2~git20151019.1039-final/xbmc/video/VideoInfoTag.h --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoInfoTag.h 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoInfoTag.h 2015-10-19 08:39:17.000000000 +0000 @@ -31,7 +31,6 @@ class CArchive; class TiXmlNode; class TiXmlElement; -class CVariant; struct SActorInfo { @@ -109,7 +108,6 @@ void SetVotes(std::string votes); void SetArtist(std::vector artist); void SetSet(std::string set); - void SetSetOverview(std::string setOverview); void SetTags(std::vector tags); void SetFile(std::string file); void SetPath(std::string path); @@ -125,8 +123,7 @@ void SetAlbum(std::string album); void SetShowLink(std::vector showLink); void SetUniqueId(std::string uniqueId); - void SetNamedSeasons(std::map namedSeasons); - void SetUserrating(int userrating); + std::string m_basePath; // the base path of the video, for folder-based lookups int m_parentPathID; // the parent path id where the base path of the video lies @@ -147,7 +144,6 @@ typedef std::vector< SActorInfo >::const_iterator iCast; std::string m_strSet; int m_iSetId; - std::string m_strSetOverview; std::vector m_tags; std::string m_strFile; std::string m_strPath; @@ -165,7 +161,6 @@ std::string m_strAlbum; CDateTime m_lastPlayed; std::vector m_showLink; - std::map m_namedSeasons; int m_playCount; int m_iTop250; int m_iYear; @@ -178,7 +173,6 @@ int m_iSpecialSortEpisode; int m_iTrack; float m_fRating; - int m_iUserRating; float m_fEpBookmark; int m_iBookmarkId; int m_iIdShow; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoLibraryQueue.cpp kodi-15.2~git20151019.1039-final/xbmc/video/VideoLibraryQueue.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoLibraryQueue.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoLibraryQueue.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,24 +19,21 @@ */ #include "VideoLibraryQueue.h" - -#include - -#include "guilib/GUIWindowManager.h" #include "GUIUserMessages.h" -#include "threads/SingleLock.h" #include "Util.h" +#include "guilib/GUIWindowManager.h" +#include "threads/SingleLock.h" +#include "video/VideoDatabase.h" #include "video/jobs/VideoLibraryCleaningJob.h" #include "video/jobs/VideoLibraryJob.h" #include "video/jobs/VideoLibraryMarkWatchedJob.h" -#include "video/jobs/VideoLibraryRefreshingJob.h" #include "video/jobs/VideoLibraryScanningJob.h" -#include "video/VideoDatabase.h" + +using namespace std; CVideoLibraryQueue::CVideoLibraryQueue() : CJobQueue(false, 1, CJob::PRIORITY_LOW), m_jobs(), - m_modal(false), m_cleaning(false) { } @@ -46,7 +43,7 @@ m_jobs.clear(); } -CVideoLibraryQueue& CVideoLibraryQueue::GetInstance() +CVideoLibraryQueue& CVideoLibraryQueue::Get() { static CVideoLibraryQueue s_instance; return s_instance; @@ -100,13 +97,11 @@ AddJob(cleaningJob); else { - m_modal = true; m_cleaning = true; cleaningJob->DoWork(); delete cleaningJob; m_cleaning = false; - m_modal = false; Refresh(); } } @@ -117,35 +112,13 @@ if (IsRunning()) return; - m_modal = true; m_cleaning = true; CVideoLibraryCleaningJob cleaningJob(paths, true); cleaningJob.DoWork(); m_cleaning = false; - m_modal = false; Refresh(); } -void CVideoLibraryQueue::RefreshItem(CFileItemPtr item, bool ignoreNfo /* = false */, bool forceRefresh /* = true */, bool refreshAll /* = false */, const std::string& searchTitle /* = "" */) -{ - AddJob(new CVideoLibraryRefreshingJob(item, forceRefresh, refreshAll, ignoreNfo, searchTitle)); -} - -bool CVideoLibraryQueue::RefreshItemModal(CFileItemPtr item, bool forceRefresh /* = true */, bool refreshAll /* = false */) -{ - // we can't perform a modal library cleaning if other jobs are running - if (IsRunning()) - return false; - - m_modal = true; - CVideoLibraryRefreshingJob refreshingJob(item, forceRefresh, refreshAll); - - bool result = refreshingJob.DoModal(); - m_modal = false; - - return result; -} - void CVideoLibraryQueue::MarkAsWatched(const CFileItemPtr &item, bool watched) { if (item == NULL) @@ -212,7 +185,7 @@ bool CVideoLibraryQueue::IsRunning() const { - return CJobQueue::IsProcessing() || m_modal; + return CJobQueue::IsProcessing() || m_cleaning; } void CVideoLibraryQueue::Refresh() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoLibraryQueue.h kodi-15.2~git20151019.1039-final/xbmc/video/VideoLibraryQueue.h --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoLibraryQueue.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoLibraryQueue.h 2015-10-19 08:39:17.000000000 +0000 @@ -43,7 +43,7 @@ /*! \brief Gets the singleton instance of the video library queue. */ - static CVideoLibraryQueue& GetInstance(); + static CVideoLibraryQueue& Get(); /*! \brief Enqueue a library scan job. @@ -83,27 +83,6 @@ void CleanLibraryModal(const std::set& paths = std::set()); /*! - \brief Enqueues a job to refresh the details of the given item. - - \param[inout] item Video item to be refreshed - \param[in] ignoreNfo Whether or not to ignore local NFO files - \param[in] forceRefresh Whether to force a complete refresh (including NFO or internet lookup) - \param[in] refreshAll Whether to refresh all sub-items (in case of a tvshow) - \param[in] searchTitle Title to use for the search (instead of determining it from the item's filename/path) - */ - void RefreshItem(CFileItemPtr item, bool ignoreNfo = false, bool forceRefresh = true, bool refreshAll = false, const std::string& searchTitle = ""); - - /*! - \brief Refreshes the details of the given item with a modal dialog. - - \param[inout] item Video item to be refreshed - \param[in] forceRefresh Whether to force a complete refresh (including NFO or internet lookup) - \param[in] refreshAll Whether to refresh all sub-items (in case of a tvshow) - \return True if the item has been successfully refreshed, false otherwise. - */ - bool RefreshItemModal(CFileItemPtr item, bool forceRefresh = true, bool refreshAll = false); - - /*! \brief Queue a watched status update job. \param[in] item Item to update watched status for @@ -154,6 +133,5 @@ VideoLibraryJobMap m_jobs; CCriticalSection m_critical; - bool m_modal; bool m_cleaning; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoReferenceClock.cpp kodi-15.2~git20151019.1039-final/xbmc/video/VideoReferenceClock.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoReferenceClock.cpp 2016-04-25 08:01:37.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoReferenceClock.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -47,6 +47,8 @@ #include "video/videosync/VideoSyncIos.h" #endif +using namespace std; + CVideoReferenceClock::CVideoReferenceClock() : CThread("RefClock") { m_SystemFrequency = CurrentHostFrequency(); @@ -73,7 +75,7 @@ void CVideoReferenceClock::Start() { CSingleExit lock(g_graphicsContext); - if(CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK) && !IsRunning()) + if(CSettings::Get().GetBool("videoplayer.usedisplayasclock") && !IsRunning()) Create(); } @@ -235,7 +237,7 @@ //interpolate from the last time the clock was updated double elapsed = (double)(Now - m_VblankTime) * m_ClockSpeed * m_fineadjust; //don't interpolate more than 2 vblank periods - elapsed = std::min(elapsed, UpdateInterval() * 2.0); + elapsed = min(elapsed, UpdateInterval() * 2.0); //make sure the clock doesn't go backwards int64_t intTime = m_CurrTime + (int64_t)elapsed; @@ -361,7 +363,7 @@ //sleep until the timestamp has passed SleepTime = (int)((Target - (Now + ClockOffset)) * 1000 / m_SystemFrequency); if (SleepTime > 0) - Sleep(SleepTime); + ::Sleep(SleepTime); Now = CurrentHostCounter(); return Now + ClockOffset; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/videosync/VideoSyncD3D.cpp kodi-15.2~git20151019.1039-final/xbmc/video/videosync/VideoSyncD3D.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/videosync/VideoSyncD3D.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/videosync/VideoSyncD3D.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -22,14 +22,15 @@ #if defined(TARGET_WINDOWS) +#pragma comment (lib,"d3d9.lib") +#pragma comment (lib,"DxErr.lib") +#include #include "utils/log.h" #include "Utils/TimeUtils.h" #include "Utils/MathUtils.h" #include "windowing\WindowingFactory.h" #include "video/videosync/VideoSyncD3D.h" #include "guilib/GraphicContext.h" -#include "win32/dxerr.h" -#include "utils/StringUtils.h" void CVideoSyncD3D::OnDestroyDevice() { @@ -52,6 +53,7 @@ bool CVideoSyncD3D::Setup(PUPDATECLOCK func) { + int ReturnV; CLog::Log(LOGDEBUG, "CVideoSyncD3D: Setting up Direct3d"); CSingleLock lock(g_graphicsContext); g_Windowing.Register(this); @@ -60,54 +62,119 @@ m_lostEvent.Reset(); UpdateClock = func; - // we need a high priority thread to get accurate timing + //get d3d device + m_D3dDev = g_Windowing.Get3DDevice(); + //we need a high priority thread to get accurate timing if (!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL)) CLog::Log(LOGDEBUG, "CVideoSyncD3D: SetThreadPriority failed"); + D3DCAPS9 DevCaps; + ReturnV = m_D3dDev->GetDeviceCaps(&DevCaps); + + if (ReturnV != D3D_OK) + { + CLog::Log(LOGDEBUG, "CVideoSyncD3D: GetDeviceCaps returned %s: %s", + DXGetErrorString(ReturnV), DXGetErrorDescription(ReturnV)); + return false; + } + + if ((DevCaps.Caps & D3DCAPS_READ_SCANLINE) != D3DCAPS_READ_SCANLINE) + { + CLog::Log(LOGDEBUG, "CVideoSyncD3D: Hardware does not support GetRasterStatus"); + return false; + } + + D3DRASTER_STATUS RasterStatus; + ReturnV = m_D3dDev->GetRasterStatus(0, &RasterStatus); + if (ReturnV != D3D_OK) + { + CLog::Log(LOGDEBUG, "CVideoSyncD3D: GetRasterStatus returned returned %s: %s", + DXGetErrorString(ReturnV), DXGetErrorDescription(ReturnV)); + return false; + } + + D3DDISPLAYMODE DisplayMode; + ReturnV = m_D3dDev->GetDisplayMode(0, &DisplayMode); + if (ReturnV != D3D_OK) + { + CLog::Log(LOGDEBUG, "CVideoSyncD3D: GetDisplayMode returned returned %s: %s", + DXGetErrorString(ReturnV), DXGetErrorDescription(ReturnV)); + return false; + } + m_height = DisplayMode.Height; + return true; } void CVideoSyncD3D::Run(volatile bool& stop) { + D3DRASTER_STATUS RasterStatus; int64_t Now; int64_t LastVBlankTime; + unsigned int LastLine; int NrVBlanks; double VBlankTime; + int ReturnV; int64_t systemFrequency = CurrentHostFrequency(); - // init the vblanktime + //get the scanline we're currently at + m_D3dDev->GetRasterStatus(0, &RasterStatus); + if (RasterStatus.InVBlank) + LastLine = 0; + else + LastLine = RasterStatus.ScanLine; + + //init the vblanktime Now = CurrentHostCounter(); LastVBlankTime = Now; m_lastUpdateTime = Now - systemFrequency; while (!stop && !m_displayLost && !m_displayReset) { - // sleep until vblank - HRESULT hr = g_Windowing.GetCurrentOutput()->WaitForVBlank(); - - // calculate how many vblanks happened - Now = CurrentHostCounter(); - VBlankTime = (double)(Now - LastVBlankTime) / (double)systemFrequency; - NrVBlanks = MathUtils::round_int(VBlankTime * m_fps); - - // update the vblank timestamp, update the clock and send a signal that we got a vblank - UpdateClock(NrVBlanks, Now); - - // save the timestamp of this vblank so we can calculate how many vblanks happened next time - LastVBlankTime = Now; + //get the scanline we're currently at + ReturnV = m_D3dDev->GetRasterStatus(0, &RasterStatus); + if (ReturnV != D3D_OK) + { + CLog::Log(LOGDEBUG, "CVideoSyncD3D: GetRasterStatus returned returned %s: %s", + DXGetErrorString(ReturnV), DXGetErrorDescription(ReturnV)); + return; + } - if ((Now - m_lastUpdateTime) >= systemFrequency) + //if InVBlank is set, or the current scanline is lower than the previous scanline, a vblank happened + if ((RasterStatus.InVBlank && LastLine > 0) || (RasterStatus.ScanLine < LastLine)) + { + //calculate how many vblanks happened + Now = CurrentHostCounter() - systemFrequency * RasterStatus.ScanLine / (m_height * MathUtils::round_int(m_fps)); + VBlankTime = (double)(Now - LastVBlankTime) / (double)systemFrequency; + NrVBlanks = MathUtils::round_int(VBlankTime * m_fps); + //update the vblank timestamp, update the clock and send a signal that we got a vblank + UpdateClock(NrVBlanks, Now); + + //save the timestamp of this vblank so we can calculate how many vblanks happened next time + LastVBlankTime = Now; + //because we had a vblank, sleep until half the refreshrate period + Now = CurrentHostCounter(); + + if ((Now - m_lastUpdateTime) >= systemFrequency) + { + if (m_fps != GetFps()) + break; + } + + int SleepTime = (int)((LastVBlankTime + (systemFrequency / MathUtils::round_int(m_fps) / 2) - Now) * 1000 / systemFrequency); + if (SleepTime > 100) + SleepTime = 100; //failsafe + if (SleepTime > 0) + ::Sleep(SleepTime); + } + else { - if (m_fps != GetFps()) - break; + ::Sleep(1); } - // because we had a vblank, sleep until half the refreshrate period because i think WaitForVBlank block any rendering stuf - // without sleeping we have freeze rendering - int SleepTime = (int)((LastVBlankTime + (systemFrequency / MathUtils::round_int(m_fps) / 2) - Now) * 1000 / systemFrequency); - if (SleepTime > 100) - SleepTime = 100; //failsafe - if (SleepTime > 0) - ::Sleep(SleepTime); + if (RasterStatus.InVBlank) + LastLine = 0; + else + LastLine = RasterStatus.ScanLine; } m_lostEvent.Set(); @@ -128,13 +195,11 @@ float CVideoSyncD3D::GetFps() { - DXGI_MODE_DESC DisplayMode; - g_Windowing.GetDisplayMode(&DisplayMode, true); - - m_fps = (DisplayMode.RefreshRate.Denominator != 0) ? (float)DisplayMode.RefreshRate.Numerator / (float)DisplayMode.RefreshRate.Denominator : 0.0f; - - if (m_fps == 0.0) - m_fps = 60.0f; + D3DDISPLAYMODE DisplayMode; + m_D3dDev->GetDisplayMode(0, &DisplayMode); + m_fps = DisplayMode.RefreshRate; + if (m_fps == 0) + m_fps = 60; if (m_fps == 23 || m_fps == 29 || m_fps == 59) m_fps++; @@ -145,14 +210,4 @@ } return m_fps; } - -std::string CVideoSyncD3D::GetErrorDescription(HRESULT hr) -{ - WCHAR buff[1024]; - DXGetErrorDescription(hr, buff, 1024); - std::wstring error(DXGetErrorString(hr)); - std::wstring descr(buff); - return StringUtils::Format("%ls: %ls", error.c_str(), descr.c_str()); -} - #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/videosync/VideoSyncD3D.h kodi-15.2~git20151019.1039-final/xbmc/video/videosync/VideoSyncD3D.h --- kodi-16.1~git20160425.1001-final/xbmc/video/videosync/VideoSyncD3D.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/videosync/VideoSyncD3D.h 2015-10-19 08:39:17.000000000 +0000 @@ -22,6 +22,7 @@ #if defined(TARGET_WINDOWS) #include "video/videosync/VideoSync.h" +#include #include "guilib/D3DResource.h" #include "threads/Event.h" @@ -38,8 +39,8 @@ virtual void OnDestroyDevice(); virtual void OnResetDevice(); private: - static std::string GetErrorDescription(HRESULT hr); - + LPDIRECT3DDEVICE9 m_D3dDev; + int m_height; volatile bool m_displayLost; volatile bool m_displayReset; CEvent m_lostEvent; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/videosync/VideoSyncGLX.cpp kodi-15.2~git20151019.1039-final/xbmc/video/videosync/VideoSyncGLX.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/videosync/VideoSyncGLX.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/videosync/VideoSyncGLX.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -32,6 +32,8 @@ #include "utils/TimeUtils.h" #include +using namespace std; + Display* CVideoSyncGLX::m_Dpy = NULL; void CVideoSyncGLX::OnLostDevice() @@ -100,8 +102,8 @@ } bool ExtensionFound = false; - std::istringstream Extensions(glXQueryExtensionsString(m_Dpy, g_Windowing.GetCurrentScreen())); - std::string ExtensionStr; + istringstream Extensions(glXQueryExtensionsString(m_Dpy, g_Windowing.GetCurrentScreen())); + string ExtensionStr; while (!ExtensionFound) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/videosync/VideoSyncIos.cpp kodi-15.2~git20151019.1039-final/xbmc/video/videosync/VideoSyncIos.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/videosync/VideoSyncIos.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/videosync/VideoSyncIos.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -32,13 +32,14 @@ bool CVideoSyncIos::Setup(PUPDATECLOCK func) { CLog::Log(LOGDEBUG, "CVideoSyncIos::%s setting up OSX", __FUNCTION__); + bool setupOk = false; //init the vblank timestamp m_LastVBlankTime = CurrentHostCounter(); UpdateClock = func; m_abort = false; - bool setupOk = InitDisplayLink(); + setupOk = InitDisplayLink(); if (setupOk) { g_Windowing.Register(this); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoThumbLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/video/VideoThumbLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoThumbLoader.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoThumbLoader.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,32 +18,31 @@ * */ -#include "VideoThumbLoader.h" - #include -#include -#include "cores/dvdplayer/DVDFileInfo.h" -#include "FileItem.h" -#include "filesystem/DirectoryCache.h" +#include "VideoThumbLoader.h" #include "filesystem/StackDirectory.h" +#include "utils/URIUtils.h" +#include "URL.h" +#include "filesystem/DirectoryCache.h" +#include "FileItem.h" +#include "settings/Settings.h" +#include "settings/VideoSettings.h" +#include "GUIUserMessages.h" #include "guilib/GUIWindowManager.h" #include "guilib/StereoscopicsManager.h" -#include "GUIUserMessages.h" -#include "music/MusicDatabase.h" #include "rendering/RenderSystem.h" -#include "settings/AdvancedSettings.h" -#include "settings/Settings.h" -#include "settings/VideoSettings.h" #include "TextureCache.h" -#include "URL.h" #include "utils/log.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "video/VideoDatabase.h" #include "video/VideoInfoTag.h" +#include "video/VideoDatabase.h" +#include "cores/dvdplayer/DVDFileInfo.h" +#include "music/MusicDatabase.h" +#include "utils/StringUtils.h" +#include "settings/AdvancedSettings.h" using namespace XFILE; +using namespace std; using namespace VIDEO; CThumbExtractor::CThumbExtractor(const CFileItem& item, @@ -87,8 +86,6 @@ { if (m_item.IsLiveTV() || URIUtils::IsUPnP(m_item.GetPath()) - || URIUtils::IsBluray(m_item.GetPath()) - || m_item.IsBDFile() || m_item.IsDVD() || m_item.IsDiscImage() || m_item.IsDVDFile(false, true) @@ -114,7 +111,7 @@ result = CDVDFileInfo::ExtractThumb(m_item.GetPath(), details, m_fillStreamDetails ? &m_item.GetVideoInfoTag()->m_streamDetails : NULL, (int) m_pos); if(result) { - CTextureCache::GetInstance().AddCachedTexture(m_target, details); + CTextureCache::Get().AddCachedTexture(m_target, details); m_item.SetProperty("HasAutoThumb", true); m_item.SetProperty("AutoThumbImage", m_target); m_item.SetArt("thumb", m_target); @@ -159,9 +156,7 @@ db.SetStreamDetailsForFileId(info->m_streamDetails, info->m_iFileId); // overwrite the runtime value if the one from streamdetails is available - if (info->m_iDbId > 0 - && info->m_duration > 0 - && static_cast(info->m_duration) != info->GetDuration()) + if (info->m_iDbId > 0 && info->m_duration != static_cast(info->GetDuration())) { info->m_duration = info->GetDuration(); @@ -193,7 +188,6 @@ { m_videoDatabase->Open(); m_showArt.clear(); - m_seasonArt.clear(); CThumbLoader::OnLoaderStart(); } @@ -201,7 +195,6 @@ { m_videoDatabase->Close(); m_showArt.clear(); - m_seasonArt.clear(); CThumbLoader::OnLoaderFinish(); } @@ -226,9 +219,9 @@ g_directoryCache.ClearDirectory(url.GetWithoutFilename()); } -std::vector CVideoThumbLoader::GetArtTypes(const std::string &type) +vector CVideoThumbLoader::GetArtTypes(const string &type) { - std::vector ret; + vector ret; if (type == MediaTypeEpisode) ret.push_back("thumb"); else if (type == MediaTypeTvShow || type == MediaTypeSeason) @@ -301,18 +294,18 @@ } // if we have no art, look for it all - std::map artwork = pItem->GetArt(); + map artwork = pItem->GetArt(); if (artwork.empty()) { - std::vector artTypes = GetArtTypes(pItem->HasVideoInfoTag() ? pItem->GetVideoInfoTag()->m_type : ""); + vector artTypes = GetArtTypes(pItem->HasVideoInfoTag() ? pItem->GetVideoInfoTag()->m_type : ""); if (find(artTypes.begin(), artTypes.end(), "thumb") == artTypes.end()) artTypes.push_back("thumb"); // always look for "thumb" art for files - for (std::vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) + for (vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) { std::string type = *i; std::string art = GetCachedImage(*pItem, type); if (!art.empty()) - artwork.insert(std::make_pair(type, art)); + artwork.insert(make_pair(type, art)); } SetArt(*pItem, artwork); } @@ -339,11 +332,11 @@ m_videoDatabase->Open(); - std::map artwork = pItem->GetArt(); - std::vector artTypes = GetArtTypes(pItem->HasVideoInfoTag() ? pItem->GetVideoInfoTag()->m_type : ""); + map artwork = pItem->GetArt(); + vector artTypes = GetArtTypes(pItem->HasVideoInfoTag() ? pItem->GetVideoInfoTag()->m_type : ""); if (find(artTypes.begin(), artTypes.end(), "thumb") == artTypes.end()) artTypes.push_back("thumb"); // always look for "thumb" art for files - for (std::vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) + for (vector::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i) { std::string type = *i; if (!pItem->HasArt(type)) @@ -352,8 +345,8 @@ if (!art.empty()) // cache it { SetCachedImage(*pItem, type, art); - CTextureCache::GetInstance().BackgroundCacheImage(art); - artwork.insert(std::make_pair(type, art)); + CTextureCache::Get().BackgroundCacheImage(art); + artwork.insert(make_pair(type, art)); } } } @@ -364,16 +357,16 @@ { // An auto-generated thumb may have been cached on a different device - check we have it here std::string url = pItem->GetArt("thumb"); - if (StringUtils::StartsWith(url, "image://video@") && !CTextureCache::GetInstance().HasCachedImage(url)) + if (StringUtils::StartsWith(url, "image://video@") && !CTextureCache::Get().HasCachedImage(url)) pItem->SetArt("thumb", ""); if (!pItem->HasArt("thumb")) { // create unique thumb for auto generated thumbs std::string thumbURL = GetEmbeddedThumbURL(*pItem); - if (CTextureCache::GetInstance().HasCachedImage(thumbURL)) + if (CTextureCache::Get().HasCachedImage(thumbURL)) { - CTextureCache::GetInstance().BackgroundCacheImage(thumbURL); + CTextureCache::Get().BackgroundCacheImage(thumbURL); pItem->SetProperty("HasAutoThumb", true); pItem->SetProperty("AutoThumbImage", thumbURL); pItem->SetArt("thumb", thumbURL); @@ -386,8 +379,8 @@ m_videoDatabase->SetArtForItem(info->m_iDbId, info->m_type, "thumb", thumbURL); } } - else if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_EXTRACTTHUMB) && - CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_EXTRACTFLAGS)) + else if (CSettings::Get().GetBool("myvideos.extractthumb") && + CSettings::Get().GetBool("myvideos.extractflags")) { CFileItem item(*pItem); std::string path(item.GetPath()); @@ -403,7 +396,7 @@ } // flag extraction - if (CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_EXTRACTFLAGS) && + if (CSettings::Get().GetBool("myvideos.extractflags") && (!pItem->HasVideoInfoTag() || !pItem->GetVideoInfoTag()->HasStreamDetails() ) ) { @@ -420,7 +413,7 @@ return true; } -void CVideoThumbLoader::SetArt(CFileItem &item, const std::map &artwork) +void CVideoThumbLoader::SetArt(CFileItem &item, const map &artwork) { item.SetArt(artwork); if (artwork.find("thumb") == artwork.end()) @@ -437,7 +430,7 @@ CVideoInfoTag &tag = *item.GetVideoInfoTag(); if (tag.m_iDbId > -1 && !tag.m_type.empty()) { - std::map artwork; + map artwork; m_videoDatabase->Open(); if (m_videoDatabase->GetArtForItem(tag.m_iDbId, tag.m_type, artwork)) SetArt(item, artwork); @@ -457,39 +450,21 @@ if (database.GetArtForItem(idAlbum, MediaTypeAlbum, artwork)) item.SetArt(artwork); } - - if (tag.m_type == MediaTypeEpisode || tag.m_type == MediaTypeSeason) + // For episodes and seasons, we want to set fanart for that of the show + if (!item.HasArt("fanart") && tag.m_iIdShow >= 0) { - // For episodes and seasons, we want to set fanart for that of the show - if (!item.HasArt("fanart") && tag.m_iIdShow >= 0) + ArtCache::const_iterator i = m_showArt.find(tag.m_iIdShow); + if (i == m_showArt.end()) { - ArtCache::const_iterator i = m_showArt.find(tag.m_iIdShow); - if (i == m_showArt.end()) - { - std::map showArt; - m_videoDatabase->GetArtForItem(tag.m_iIdShow, MediaTypeTvShow, showArt); - i = m_showArt.insert(std::make_pair(tag.m_iIdShow, showArt)).first; - } - if (i != m_showArt.end()) - { - item.AppendArt(i->second, "tvshow"); - item.SetArtFallback("fanart", "tvshow.fanart"); - item.SetArtFallback("tvshow.thumb", "tvshow.poster"); - } + map showArt; + m_videoDatabase->GetArtForItem(tag.m_iIdShow, MediaTypeTvShow, showArt); + i = m_showArt.insert(make_pair(tag.m_iIdShow, showArt)).first; } - - if (!item.HasArt("season.poster") && tag.m_iSeason > -1) + if (i != m_showArt.end()) { - ArtCache::const_iterator i = m_seasonArt.find(tag.m_iIdSeason); - if (i == m_seasonArt.end()) - { - std::map seasonArt; - m_videoDatabase->GetArtForItem(tag.m_iIdSeason, MediaTypeSeason, seasonArt); - i = m_seasonArt.insert(std::make_pair(tag.m_iIdSeason, seasonArt)).first; - } - - if (i != m_seasonArt.end()) - item.AppendArt(i->second, MediaTypeSeason); + item.AppendArt(i->second, "tvshow"); + item.SetArtFallback("fanart", "tvshow.fanart"); + item.SetArtFallback("tvshow.thumb", "tvshow.poster"); } } m_videoDatabase->Close(); @@ -581,27 +556,6 @@ { if (item.m_bIsFolder) return; - if (item.HasVideoInfoTag()) - { - CStreamDetails& details = item.GetVideoInfoTag()->m_streamDetails; - - // add audio language properties - for (int i = 1; i <= details.GetAudioStreamCount(); i++) - { - std::string index = StringUtils::Format("%i", i); - item.SetProperty("AudioChannels." + index, details.GetAudioChannels(i)); - item.SetProperty("AudioCodec." + index, details.GetAudioCodec(i).c_str()); - item.SetProperty("AudioLanguage." + index, details.GetAudioLanguage(i).c_str()); - } - - // add subtitle language properties - for (int i = 1; i <= details.GetSubtitleStreamCount(); i++) - { - std::string index = StringUtils::Format("%i", i); - item.SetProperty("SubtitleLanguage." + index, details.GetSubtitleLanguage(i).c_str()); - } - } - std::string stereoMode; // detect stereomode for videos if (item.HasVideoInfoTag()) @@ -616,14 +570,14 @@ CVideoSettings itemVideoSettings; m_videoDatabase->Open(); if (m_videoDatabase->GetVideoSettings(item, itemVideoSettings) && itemVideoSettings.m_StereoMode != RENDER_STEREO_MODE_OFF) - stereoMode = CStereoscopicsManager::GetInstance().ConvertGuiStereoModeToString( (RENDER_STEREO_MODE) itemVideoSettings.m_StereoMode ); + stereoMode = CStereoscopicsManager::Get().ConvertGuiStereoModeToString( (RENDER_STEREO_MODE) itemVideoSettings.m_StereoMode ); m_videoDatabase->Close(); // still empty, try grabbing from filename // TODO: in case of too many false positives due to using the full path, extract the filename only using string utils if (stereoMode.empty()) - stereoMode = CStereoscopicsManager::GetInstance().DetectStereoModeByString( path ); + stereoMode = CStereoscopicsManager::Get().DetectStereoModeByString( path ); } if (!stereoMode.empty()) - item.SetProperty("stereomode", CStereoscopicsManager::GetInstance().NormalizeStereoMode(stereoMode)); + item.SetProperty("stereomode", CStereoscopicsManager::Get().NormalizeStereoMode(stereoMode)); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/VideoThumbLoader.h kodi-15.2~git20151019.1039-final/xbmc/video/VideoThumbLoader.h --- kodi-16.1~git20160425.1001-final/xbmc/video/VideoThumbLoader.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/VideoThumbLoader.h 2015-10-19 08:39:17.000000000 +0000 @@ -129,7 +129,6 @@ CVideoDatabase *m_videoDatabase; typedef std::map > ArtCache; ArtCache m_showArt; - ArtCache m_seasonArt; /*! \brief Tries to detect missing data/info from a file and adds those \param item The CFileItem to process diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowFullScreen.cpp kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowFullScreen.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowFullScreen.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowFullScreen.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -22,7 +22,7 @@ #include "system.h" #include "GUIWindowFullScreen.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #ifdef HAS_VIDEO_PLAYBACK #include "cores/VideoRenderers/RenderManager.h" #endif @@ -46,7 +46,6 @@ #include "input/ButtonTranslator.h" #include "windowing/WindowingFactory.h" #include "cores/IPlayer.h" -#include "guiinfo/GUIInfoLabels.h" #include #include @@ -54,8 +53,6 @@ #include "linux/LinuxResourceCounter.h" #endif -using namespace KODI::MESSAGING; - #define BLUE_BAR 0 #define LABEL_ROW1 10 #define LABEL_ROW2 11 @@ -122,17 +119,6 @@ } } - if (CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPLAYBACK_CONFIRMCHANNELSWITCH) && - g_infoManager.IsPlayerChannelPreviewActive() && - (action.GetID() == ACTION_SELECT_ITEM || CButtonTranslator::GetInstance().GetGlobalAction(action.GetButtonCode()).GetID() == ACTION_SELECT_ITEM)) - { - // If confirm channel switch is active, channel preview is currently shown - // and the button that caused this action matches (global) action "Select" (OK) - // switch to the channel currently displayed within the preview. - g_application.m_pPlayer->SwitchChannel(g_application.CurrentFileItem().GetPVRChannelInfoTag()); - return true; - } - switch (action.GetID()) { case ACTION_SHOW_OSD: @@ -194,7 +180,7 @@ if (pDialog) { CFileItem item(g_application.CurrentFileItem()); - pDialog->Open(); + pDialog->DoModal(); return true; } break; @@ -224,7 +210,7 @@ if (m_bShowViewModeInfo) { #ifdef HAS_VIDEO_PLAYBACK - g_renderManager.SetViewMode(++CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode); + g_renderManager.SetViewMode(++CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); #endif } m_bShowViewModeInfo = true; @@ -335,7 +321,7 @@ CGUIWindow::OnMessage(message); - CSettings::GetInstance().Save(); + CSettings::Get().Save(); CSingleLock lock (g_graphicsContext); g_graphicsContext.SetFullScreenVideo(false); @@ -457,7 +443,7 @@ { // get the "View Mode" string std::string strTitle = g_localizeStrings.Get(629); - std::string strMode = g_localizeStrings.Get(630 + CMediaSettings::GetInstance().GetCurrentVideoSettings().m_ViewMode); + std::string strMode = g_localizeStrings.Get(630 + CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); std::string strInfo = StringUtils::Format("%s : %s", strTitle.c_str(), strMode.c_str()); CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), LABEL_ROW1); msg.SetLabel(strInfo); @@ -476,10 +462,10 @@ (int)info.SrcRect.Height(), (int)(info.DestRect.Width() * xscale), (int)(info.DestRect.Height() * yscale), - CDisplaySettings::GetInstance().GetZoomAmount(), - info.videoAspectRatio*CDisplaySettings::GetInstance().GetPixelRatio(), - CDisplaySettings::GetInstance().GetPixelRatio(), - CDisplaySettings::GetInstance().GetVerticalShift()); + CDisplaySettings::Get().GetZoomAmount(), + info.videoAspectRatio*CDisplaySettings::Get().GetPixelRatio(), + CDisplaySettings::Get().GetPixelRatio(), + CDisplaySettings::Get().GetVerticalShift()); CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), LABEL_ROW2); msg.SetLabel(strSizing); OnMessage(msg); @@ -649,7 +635,7 @@ if (pOSD->IsDialogRunning()) pOSD->Close(); else - pOSD->Open(); + pOSD->DoModal(); } MarkDirtyRegion(); @@ -661,6 +647,6 @@ if (pOSD && !pOSD->IsDialogRunning()) { pOSD->SetAutoClose(3000); - pOSD->Open(); + pOSD->DoModal(); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowVideoBase.cpp kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowVideoBase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowVideoBase.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowVideoBase.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -23,7 +23,7 @@ #include "Util.h" #include "video/VideoInfoDownloader.h" #include "video/VideoInfoScanner.h" -#include "video/VideoLibraryQueue.h" +#include "utils/Variant.h" #include "addons/GUIDialogAddonInfo.h" #include "video/dialogs/GUIDialogVideoInfo.h" #include "dialogs/GUIDialogSmartPlaylistEditor.h" @@ -35,6 +35,7 @@ #include "PlayListPlayer.h" #include "GUIPassword.h" #include "filesystem/StackDirectory.h" +#include "video/dialogs/GUIDialogFileStacking.h" #include "filesystem/VideoDatabaseDirectory.h" #include "PartyModeManager.h" #include "guilib/GUIWindowManager.h" @@ -53,7 +54,6 @@ #include "utils/StringUtils.h" #include "utils/log.h" #include "utils/FileUtils.h" -#include "utils/Variant.h" #include "pvr/PVRManager.h" #include "pvr/recordings/PVRRecordings.h" #include "utils/URIUtils.h" @@ -64,6 +64,7 @@ #include "utils/GroupUtils.h" #include "TextureDatabase.h" +using namespace std; using namespace XFILE; using namespace PLAYLIST; using namespace VIDEODATABASEDIRECTORY; @@ -153,7 +154,7 @@ } else if (iAction == ACTION_SHOW_INFO) { - return OnItemInfo(iItem); + return OnInfo(iItem); } else if (iAction == ACTION_PLAYER_PLAY) { @@ -172,14 +173,14 @@ else if (iAction == ACTION_DELETE_ITEM) { // is delete allowed? - if (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases()) + if (CProfilesManager::Get().GetCurrentProfile().canWriteDatabases()) { // must be at the title window if (GetID() == WINDOW_VIDEO_NAV) OnDeleteItem(iItem); // or be at the files window and have file deletion enabled - else if (GetID() == WINDOW_VIDEO_FILES && CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_ALLOWFILEDELETION)) + else if (GetID() == WINDOW_VIDEO_FILES && CSettings::Get().GetBool("filelists.allowfiledeletion")) OnDeleteItem(iItem); // or be at the video playlists location @@ -201,7 +202,7 @@ return CGUIMediaWindow::OnMessage(message); } -void CGUIWindowVideoBase::OnItemInfo(CFileItem* pItem, ADDON::ScraperPtr& scraper) +void CGUIWindowVideoBase::OnInfo(CFileItem* pItem, ADDON::ScraperPtr& scraper) { if (!pItem) return; @@ -252,7 +253,7 @@ // no video file in this folder if (!bFoundFile) { - CGUIDialogOK::ShowAndGetInput(CVariant{13346}, CVariant{20349}); + CGUIDialogOK::ShowAndGetInput(13346, 20349); return; } } @@ -262,7 +263,7 @@ if (pItem->m_bIsFolder) item.SetProperty("set_folder_thumb", pItem->GetPath()); - bool modified = ShowIMDB(CFileItemPtr(new CFileItem(item)), scraper, fromDB); + bool modified = ShowIMDB(&item, scraper, fromDB); if (modified && (g_windowManager.GetActiveWindow() == WINDOW_VIDEO_FILES || g_windowManager.GetActiveWindow() == WINDOW_VIDEO_NAV)) // since we can be called from the music library we need this check @@ -294,7 +295,7 @@ // and show the information. // 6. Check for a refresh, and if so, go to 3. -bool CGUIWindowVideoBase::ShowIMDB(CFileItemPtr item, const ScraperPtr &info2, bool fromDB) +bool CGUIWindowVideoBase::ShowIMDB(CFileItem *item, const ScraperPtr &info2, bool fromDB) { /* CLog::Log(LOGDEBUG,"CGUIWindowVideoBase::ShowIMDB"); @@ -375,17 +376,15 @@ if (!info || info->Content() == CONTENT_NONE) // disable refresh button movieDetails.m_strIMDBNumber = "xx"+movieDetails.m_strIMDBNumber; *item->GetVideoInfoTag() = movieDetails; - pDlgInfo->SetMovie(item.get()); - pDlgInfo->Open(); - if (pDlgInfo->HasUpdatedUserrating()) - return true; + pDlgInfo->SetMovie(item); + pDlgInfo->DoModal(); needsRefresh = pDlgInfo->NeedRefresh(); if (!needsRefresh) return pDlgInfo->HasUpdatedThumb(); // check if the item in the video info dialog has changed and if so, get the new item else if (pDlgInfo->GetCurrentListItem() != NULL) { - item = pDlgInfo->GetCurrentListItem(); + item = pDlgInfo->GetCurrentListItem().get(); if (item->IsVideoDb() && item->HasVideoInfoTag()) item->SetPath(item->GetVideoInfoTag()->GetPath()); @@ -393,37 +392,271 @@ } // quietly return if Internet lookups are disabled - if (!CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) + if (!CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) return false; - if (!info) + if(!info) return false; if (g_application.IsVideoScanning()) { - CGUIDialogOK::ShowAndGetInput(CVariant{13346}, CVariant{14057}); + CGUIDialogOK::ShowAndGetInput(13346, 14057); return false; } + m_database.Open(); + // 2. Look for a nfo File to get the search URL + SScanSettings settings; + info = m_database.GetScraperForPath(item->GetPath(),settings); + + if (!info) + return false; + + // Get the correct movie title + std::string movieName = item->GetMovieName(settings.parent_name); + + CScraperUrl scrUrl; + CVideoInfoScanner scanner; + bool hasDetails = false; bool listNeedsUpdating = false; + bool ignoreNfo = false; // 3. Run a loop so that if we Refresh we re-run this block do { - if (!CVideoLibraryQueue::GetInstance().RefreshItemModal(item, needsRefresh, pDlgInfo->RefreshAll())) - return listNeedsUpdating; + if (!ignoreNfo) + { + CNfoFile::NFOResult nfoResult = scanner.CheckForNFOFile(item,settings.parent_name_root,info,scrUrl); + if (nfoResult == CNfoFile::ERROR_NFO) + ignoreNfo = true; + else + if (nfoResult != CNfoFile::NO_NFO) + hasDetails = true; - // remove directory caches and reload images - CUtil::DeleteVideoDatabaseDirectoryCache(); - CGUIMessage reload(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); - OnMessage(reload); + if (needsRefresh) + { + bHasInfo = true; + if (!info->IsNoop() && (nfoResult == CNfoFile::URL_NFO || nfoResult == CNfoFile::COMBINED_NFO || nfoResult == CNfoFile::FULL_NFO)) + { + if (CGUIDialogYesNo::ShowAndGetInput(13346, 20446)) + { + hasDetails = false; + ignoreNfo = true; + scrUrl.Clear(); + info = info2; + } + } + } + } - pDlgInfo->SetMovie(item.get()); - pDlgInfo->Open(); - item->SetArt("thumb", pDlgInfo->GetThumbnail()); - needsRefresh = pDlgInfo->NeedRefresh(); - listNeedsUpdating = true; - } while (needsRefresh); + // 4. if we don't have an url, or need to refresh the search + // then do the web search + MOVIELIST movielist; + if (info->Content() == CONTENT_TVSHOWS && !item->m_bIsFolder) + hasDetails = true; + + if (!hasDetails && (scrUrl.m_url.size() == 0 || needsRefresh)) + { + // 4a. show dialog that we're busy querying www.imdb.com + std::string strHeading = StringUtils::Format(g_localizeStrings.Get(197).c_str(),info->Name().c_str()); + pDlgProgress->SetHeading(strHeading); + pDlgProgress->SetLine(0, movieName); + pDlgProgress->SetLine(1, ""); + pDlgProgress->SetLine(2, ""); + pDlgProgress->StartModal(); + pDlgProgress->Progress(); + + // 4b. do the websearch + info->ClearCache(); + CVideoInfoDownloader imdb(info); + int returncode = imdb.FindMovie(movieName, movielist, pDlgProgress); + if (returncode > 0) + { + pDlgProgress->Close(); + if (movielist.size() > 0) + { + int iString = 196; + if (info->Content() == CONTENT_TVSHOWS) + iString = 20356; + pDlgSelect->SetHeading(iString); + pDlgSelect->Reset(); + for (unsigned int i = 0; i < movielist.size(); ++i) + pDlgSelect->Add(movielist[i].strTitle); + pDlgSelect->EnableButton(true, 413); // manual + pDlgSelect->DoModal(); + + // and wait till user selects one + int iSelectedMovie = pDlgSelect->GetSelectedLabel(); + if (iSelectedMovie >= 0) + { + scrUrl = movielist[iSelectedMovie]; + CLog::Log(LOGDEBUG, "%s: user selected movie '%s' with URL '%s'", + __FUNCTION__, scrUrl.strTitle.c_str(), scrUrl.m_url[0].m_url.c_str()); + } + else if (!pDlgSelect->IsButtonPressed()) + { + m_database.Close(); + return listNeedsUpdating; // user backed out + } + } + } + else if (returncode == -1 || !CVideoInfoScanner::DownloadFailed(pDlgProgress)) + { + pDlgProgress->Close(); + return false; + } + } + // 4c. Check if url is still empty - occurs if user has selected to do a manual + // lookup, or if the IMDb lookup failed or was cancelled. + if (!hasDetails && scrUrl.m_url.size() == 0) + { + // Check for cancel of the progress dialog + pDlgProgress->Close(); + if (pDlgProgress->IsCanceled()) + { + m_database.Close(); + return listNeedsUpdating; + } + + // Prompt the user to input the movieName + int iString = 16009; + if (info->Content() == CONTENT_TVSHOWS) + iString = 20357; + if (!CGUIKeyboardFactory::ShowAndGetInput(movieName, g_localizeStrings.Get(iString), false)) + { + m_database.Close(); + return listNeedsUpdating; // user backed out + } + + needsRefresh = true; + } + else + { + // 5. Download the movie information + // show dialog that we're downloading the movie info + // clear artwork and invalidate hashes + CTextureDatabase db; + if (db.Open()) + { + for (CGUIListItem::ArtMap::const_iterator i = item->GetArt().begin(); i != item->GetArt().end(); ++i) + db.InvalidateCachedTexture(i->second); + db.Close(); + } + item->ClearArt(); + + CFileItemList list; + std::string strPath=item->GetPath(); + if (item->IsVideoDb() || fromDB) + { + vector paths; + if (item->GetVideoInfoTag()->m_type == "tvshow" && pDlgInfo->RefreshAll() && + m_database.GetPathsLinkedToTvShow(item->GetVideoInfoTag()->m_iDbId, paths)) + { + for (vector::const_iterator i = paths.begin(); i != paths.end(); ++i) + { + CFileItemPtr newItem(new CFileItem(*item->GetVideoInfoTag())); + newItem->SetPath(*i); + list.Add(newItem); + } + } + else + { + CFileItemPtr newItem(new CFileItem(*item->GetVideoInfoTag())); + list.Add(newItem); + } + strPath = item->GetVideoInfoTag()->m_strPath; + } + else + { + CFileItemPtr newItem(new CFileItem(*item)); + list.Add(newItem); + } + + if (item->m_bIsFolder) + list.SetPath(URIUtils::GetParentPath(strPath)); + else + list.SetPath(URIUtils::GetDirectory(strPath)); + + int iString=198; + if (info->Content() == CONTENT_TVSHOWS) + { + if (item->m_bIsFolder) + iString = 20353; + else + iString = 20361; + } + if (info->Content() == CONTENT_MUSICVIDEOS) + iString = 20394; + pDlgProgress->SetHeading(iString); + pDlgProgress->SetLine(0, movieName); + pDlgProgress->SetLine(1, scrUrl.strTitle); + pDlgProgress->SetLine(2, ""); + pDlgProgress->StartModal(); + pDlgProgress->Progress(); + if (bHasInfo && movieDetails.m_iDbId != -1) + { + if (info->Content() == CONTENT_MOVIES) + m_database.DeleteMovie(movieDetails.m_iDbId); + if (info->Content() == CONTENT_TVSHOWS && !item->m_bIsFolder) + m_database.DeleteEpisode(movieDetails.m_iDbId); + if (info->Content() == CONTENT_MUSICVIDEOS) + m_database.DeleteMusicVideo(movieDetails.m_iDbId); + if (info->Content() == CONTENT_TVSHOWS && item->m_bIsFolder) + { + if (pDlgInfo->RefreshAll()) + m_database.DeleteTvShow(movieDetails.m_iDbId); + else + m_database.DeleteDetailsForTvShow(movieDetails.m_iDbId); + } + } + if (scanner.RetrieveVideoInfo(list,settings.parent_name_root,info->Content(),!ignoreNfo,&scrUrl,pDlgInfo->RefreshAll(),pDlgProgress)) + { + if (info->Content() == CONTENT_MOVIES) + m_database.GetMovieInfo(item->GetPath(),movieDetails); + if (info->Content() == CONTENT_MUSICVIDEOS) + m_database.GetMusicVideoInfo(item->GetPath(),movieDetails); + if (info->Content() == CONTENT_TVSHOWS) + { + // update tvshow info to get updated episode numbers + if (item->m_bIsFolder) + m_database.GetTvShowInfo(item->GetPath(),movieDetails); + else + m_database.GetEpisodeInfo(item->GetPath(),movieDetails); + } + + // got all movie details :-) + pDlgProgress->Close(); + + // now show the imdb info + + // remove directory caches and reload images + CUtil::DeleteVideoDatabaseDirectoryCache(); + CGUIMessage reload(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); + OnMessage(reload); + + *item->GetVideoInfoTag() = movieDetails; + pDlgInfo->SetMovie(item); + pDlgInfo->DoModal(); + item->SetArt("thumb", pDlgInfo->GetThumbnail()); + needsRefresh = pDlgInfo->NeedRefresh(); + listNeedsUpdating = true; + } + else + { + pDlgProgress->Close(); + if (pDlgProgress->IsCanceled()) + { + m_database.Close(); + return listNeedsUpdating; // user cancelled + } + CGUIDialogOK::ShowAndGetInput(195, movieName); + m_database.Close(); + return listNeedsUpdating; + } + } + // 6. Check for a refresh + } while (needsRefresh); + m_database.Close(); return listNeedsUpdating; } @@ -496,7 +729,7 @@ GetDirectory(pItem->GetPath(), items); FormatAndSort(items); - int watchedMode = CMediaSettings::GetInstance().GetWatchedMode(items.GetContent()); + int watchedMode = CMediaSettings::Get().GetWatchedMode(items.GetContent()); bool unwatchedOnly = watchedMode == WatchedModeUnwatched; bool watchedOnly = watchedMode == WatchedModeWatched; for (int i = 0; i < items.Size(); ++i) @@ -523,13 +756,13 @@ // just an item if (pItem->IsPlayList()) { - std::unique_ptr pPlayList (CPlayListFactory::Create(*pItem)); + unique_ptr pPlayList (CPlayListFactory::Create(*pItem)); if (pPlayList.get()) { // load it if (!pPlayList->Load(pItem->GetPath())) { - CGUIDialogOK::ShowAndGetInput(CVariant{6}, CVariant{477}); + CGUIDialogOK::ShowAndGetInput(6, 477); return; //hmmm unable to load playlist? } @@ -624,9 +857,8 @@ if (!item->m_bIsFolder && path != "add" && path != "addons://more/video" && !StringUtils::StartsWith(path, "newsmartplaylist://") && !StringUtils::StartsWith(path, "newplaylist://") && - !StringUtils::StartsWith(path, "newtag://") && - !StringUtils::StartsWith(path, "script://")) - return OnFileAction(iItem, CSettings::GetInstance().GetInt(CSettings::SETTING_MYVIDEOS_SELECTACTION)); + !StringUtils::StartsWith(path, "newtag://")) + return OnFileAction(iItem, CSettings::Get().GetInt("myvideos.selectaction")); return CGUIMediaWindow::OnSelect(iItem); } @@ -674,7 +906,7 @@ case SELECT_ACTION_PLAY_OR_RESUME: return OnResumeItem(iItem); case SELECT_ACTION_INFO: - if (OnItemInfo(iItem)) + if (OnInfo(iItem)) return true; break; case SELECT_ACTION_MORE: @@ -694,7 +926,7 @@ return OnClick(iItem); } -bool CGUIWindowVideoBase::OnItemInfo(int iItem) +bool CGUIWindowVideoBase::OnInfo(int iItem) { if (iItem < 0 || iItem >= m_vecItems->Size()) return false; @@ -737,12 +969,9 @@ return true; } - OnItemInfo(item.get(), scraper); + OnInfo(item.get(), scraper); - // Return whether or not we have information to display. - // Note: This will cause the default select action to start - // playback in case it's set to "Show information". - return item->HasVideoInfoTag(); + return true; } void CGUIWindowVideoBase::OnRestartItem(int iItem) @@ -835,7 +1064,7 @@ { if (URIUtils::IsStack(path)) { - std::vector times; + vector times; if (m_database.GetStackTimes(path,times) || CFileItem(CStackDirectory::GetFirstStackedFile(path),false).IsDiscImage()) buttons.Add(CONTEXT_BUTTON_PLAY_PART, 20324); } @@ -863,10 +1092,10 @@ if (item->IsVideoDb()) { CFileItem item2(item->GetVideoInfoTag()->m_strFileNameAndPath, false); - CPlayerCoreFactory::GetInstance().GetPlayers(item2, vecCores); + CPlayerCoreFactory::Get().GetPlayers(item2, vecCores); } else - CPlayerCoreFactory::GetInstance().GetPlayers(*item, vecCores); + CPlayerCoreFactory::Get().GetPlayers(*item, vecCores); if (vecCores.size() > 1) buttons.Add(CONTEXT_BUTTON_PLAY_WITH, 15213); } @@ -887,7 +1116,7 @@ //then add add either 'play from here' or 'play only this' depending on default behaviour if (!(item->m_bIsFolder || item->IsScript()) && m_vecItems->Size() > 1 && itemNumber < m_vecItems->Size()-1) { - if (!CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_AUTOPLAYNEXTITEM)) + if (!CSettings::Get().GetBool("videoplayer.autoplaynextitem")) buttons.Add(CONTEXT_BUTTON_PLAY_AND_QUEUE, 13412); else buttons.Add(CONTEXT_BUTTON_PLAY_ONLY_THIS, 13434); @@ -913,28 +1142,18 @@ return false; CFileItemList parts; - CDirectory::GetDirectory(path, parts); - - for (int i = 0; i < parts.Size(); i++) - parts[i]->SetLabel(StringUtils::Format(g_localizeStrings.Get(23051).c_str(), i+1)); - - CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); - - pDialog->Reset(); - pDialog->SetHeading(CVariant{20324}); - pDialog->SetItems(parts); - pDialog->Open(); - - if (!pDialog->IsConfirmed()) - return false; - - int selectedFile = pDialog->GetSelectedLabel(); - if (selectedFile >= 0) + CDirectory::GetDirectory(path,parts); + CGUIDialogFileStacking* dlg = (CGUIDialogFileStacking*)g_windowManager.GetWindow(WINDOW_DIALOG_FILESTACKING); + if (!dlg) return true; + dlg->SetNumberOfFiles(parts.Size()); + dlg->DoModal(); + int selectedFile = dlg->GetSelectedFile(); + if (selectedFile > 0) { // ISO stack if (CFileItem(CStackDirectory::GetFirstStackedFile(path),false).IsDiscImage()) { - std::string resumeString = CGUIWindowVideoBase::GetResumeString(*(parts[selectedFile].get())); + std::string resumeString = CGUIWindowVideoBase::GetResumeString(*(parts[selectedFile - 1].get())); stack->m_lStartOffset = 0; if (!resumeString.empty()) { @@ -943,20 +1162,20 @@ choices.Add(SELECT_ACTION_PLAY, 12021); // Start from beginning int value = CGUIDialogContextMenu::ShowAndGetChoice(choices); if (value == SELECT_ACTION_RESUME) - GetResumeItemOffset(parts[selectedFile].get(), stack->m_lStartOffset, stack->m_lStartPartNumber); + GetResumeItemOffset(parts[selectedFile - 1].get(), stack->m_lStartOffset, stack->m_lStartPartNumber); else if (value != SELECT_ACTION_PLAY) return false; // if not selected PLAY, then we changed our mind so return } - stack->m_lStartPartNumber = selectedFile + 1; + stack->m_lStartPartNumber = selectedFile; } // regular stack else { - if (selectedFile > 0) + if (selectedFile > 1) { - std::vector times; + vector times; if (m_database.GetStackTimes(path,times)) - stack->m_lStartOffset = times[selectedFile - 1] * 75; + stack->m_lStartOffset = times[selectedFile-2]*75; // wtf? } else stack->m_lStartOffset = 0; @@ -1005,17 +1224,17 @@ if (item->IsVideoDb()) { CFileItem item2(*item->GetVideoInfoTag()); - CPlayerCoreFactory::GetInstance().GetPlayers(item2, vecCores); + CPlayerCoreFactory::Get().GetPlayers(item2, vecCores); } else - CPlayerCoreFactory::GetInstance().GetPlayers(*item, vecCores); - g_application.m_eForcedNextPlayer = CPlayerCoreFactory::GetInstance().SelectPlayerDialog(vecCores); + CPlayerCoreFactory::Get().GetPlayers(*item, vecCores); + g_application.m_eForcedNextPlayer = CPlayerCoreFactory::Get().SelectPlayerDialog(vecCores); if (g_application.m_eForcedNextPlayer != EPC_NONE) { // any other select actions but play or resume, resume, play or playpart // don't make any sense here since the user already decided that he'd // like to play the item (just with a specific player) - VideoSelectAction selectAction = (VideoSelectAction)CSettings::GetInstance().GetInt(CSettings::SETTING_MYVIDEOS_SELECTACTION); + VideoSelectAction selectAction = (VideoSelectAction)CSettings::Get().GetInt("myvideos.selectaction"); if (selectAction != SELECT_ACTION_PLAY_OR_RESUME && selectAction != SELECT_ACTION_RESUME && selectAction != SELECT_ACTION_PLAY && @@ -1038,7 +1257,7 @@ return OnFileAction(itemNumber, SELECT_ACTION_RESUME); case CONTEXT_BUTTON_INFO: - OnItemInfo(itemNumber); + OnInfo(itemNumber); return true; case CONTEXT_BUTTON_STOP_SCANNING: @@ -1069,7 +1288,7 @@ OnScan(strPath, true); } else - OnItemInfo(item.get(),info); + OnInfo(item.get(),info); return true; } @@ -1154,7 +1373,7 @@ CDirectory::GetDirectory(dir, items); items.Sort(SortByFile, SortOrderAscending); - std::vector stack; + vector stack; for (int i = 0; i < items.Size(); ++i) { if (URIUtils::HasExtension(items[i]->GetPath(), ext)) @@ -1178,7 +1397,7 @@ else { CLog::Log(LOGERROR, "CGUIWindowTV: Can't open recording, no valid filename!"); - CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19036}); + CGUIDialogOK::ShowAndGetInput(19033, 19036); return false; } } @@ -1239,14 +1458,14 @@ // HACK: stacked files need to be treated as folders in order to be deleted if (item->IsStack()) item->m_bIsFolder = true; - if (CProfilesManager::GetInstance().GetCurrentProfile().getLockMode() != LOCK_MODE_EVERYONE && - CProfilesManager::GetInstance().GetCurrentProfile().filesLocked()) + if (CProfilesManager::Get().GetCurrentProfile().getLockMode() != LOCK_MODE_EVERYONE && + CProfilesManager::Get().GetCurrentProfile().filesLocked()) { if (!g_passwordManager.IsMasterLockUnlocked(true)) return; } - if ((CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_ALLOWFILEDELETION) || + if ((CSettings::Get().GetBool("filelists.allowfiledeletion") || m_vecItems->IsPath("special://videoplaylists/")) && CUtil::SupportsWriteFileOperations(item->GetPath())) CFileUtils::DeleteItem(item); @@ -1260,13 +1479,13 @@ // load a playlist like .m3u, .pls // first get correct factory to load playlist - std::unique_ptr pPlayList (CPlayListFactory::Create(strPlayList)); + unique_ptr pPlayList (CPlayListFactory::Create(strPlayList)); if (pPlayList.get()) { // load it if (!pPlayList->Load(strPlayList)) { - CGUIDialogOK::ShowAndGetInput(CVariant{6}, CVariant{477}); + CGUIDialogOK::ShowAndGetInput(6, 477); return; //hmmm unable to load playlist? } } @@ -1344,7 +1563,7 @@ // add in the "New Playlist" item if we're in the playlists folder if ((items.GetPath() == "special://videoplaylists/") && !items.Contains("newplaylist://")) { - CFileItemPtr newPlaylist(new CFileItem(CProfilesManager::GetInstance().GetUserDataItem("PartyMode-Video.xsp"),false)); + CFileItemPtr newPlaylist(new CFileItem(CProfilesManager::Get().GetUserDataItem("PartyMode-Video.xsp"),false)); newPlaylist->SetLabel(g_localizeStrings.Get(16035)); newPlaylist->SetLabelPreformated(true); newPlaylist->m_bIsFolder = true; @@ -1369,7 +1588,7 @@ if (info && info->Content() == CONTENT_TVSHOWS) m_stackingAvailable = false; - if (m_stackingAvailable && !items.IsStack() && CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_STACKVIDEOS)) + if (m_stackingAvailable && !items.IsStack() && CSettings::Get().GetBool("myvideos.stackvideos")) items.Stack(); return bResult; @@ -1403,11 +1622,10 @@ VIDEODATABASEDIRECTORY::NODE_TYPE nodeType = CVideoDatabaseDirectory::GetDirectoryChildType(m_strFilterPath); if (items.GetContent() == "movies" && params.GetSetId() <= 0 && nodeType == NODE_TYPE_TITLE_MOVIES && - (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_GROUPMOVIESETS) || (StringUtils::EqualsNoCase(group, "sets") && mixed))) + (CSettings::Get().GetBool("videolibrary.groupmoviesets") || (StringUtils::EqualsNoCase(group, "sets") && mixed))) { CFileItemList groupedItems; - GroupAttribute groupAttributes = CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_GROUPSINGLEITEMSETS) ? GroupAttributeNone : GroupAttributeIgnoreSingleItems; - if (GroupUtils::GroupAndMix(GroupBySet, m_strFilterPath, items, groupedItems, groupAttributes)) + if (GroupUtils::Group(GroupBySet, m_strFilterPath, items, groupedItems, GroupAttributeIgnoreSingleItems)) { items.ClearItems(); items.Append(groupedItems); @@ -1455,7 +1673,7 @@ // prompt for data // enter a new title std::string strTitle = pItem->GetLabel(); - if (!CGUIKeyboardFactory::ShowAndGetInput(strTitle, CVariant{g_localizeStrings.Get(528)}, false)) // Enter Title + if (!CGUIKeyboardFactory::ShowAndGetInput(strTitle, g_localizeStrings.Get(528), false)) // Enter Title return; // pick genre @@ -1463,14 +1681,14 @@ if (!pSelect) return; - pSelect->SetHeading(CVariant{530}); // Select Genre + pSelect->SetHeading(530); // Select Genre pSelect->Reset(); CFileItemList items; if (!CDirectory::GetDirectory("videodb://movies/genres/", items)) return; - pSelect->SetItems(items); + pSelect->SetItems(&items); pSelect->EnableButton(true, 531); // New Genre - pSelect->Open(); + pSelect->DoModal(); std::string strGenre; int iSelected = pSelect->GetSelectedLabel(); if (iSelected >= 0) @@ -1482,7 +1700,7 @@ if (strGenre.empty()) { strGenre = g_localizeStrings.Get(532); // Manual Addition - if (!CGUIKeyboardFactory::ShowAndGetInput(strGenre, CVariant{g_localizeStrings.Get(533)}, false)) // Enter Genre + if (!CGUIKeyboardFactory::ShowAndGetInput(strGenre, g_localizeStrings.Get(533), false)) // Enter Genre return; // user backed out if (strGenre.empty()) return; // no genre string @@ -1500,9 +1718,7 @@ m_database.Close(); // done... - CGUIDialogOK::ShowAndGetInput(CVariant{20177}, CVariant{movie.m_strTitle}, - CVariant{StringUtils::Join(movie.m_genre, g_advancedSettings.m_videoItemSeparator)}, - CVariant{movie.m_strIMDBNumber}); + CGUIDialogOK::ShowAndGetInput(20177, movie.m_strTitle, StringUtils::Join(movie.m_genre, g_advancedSettings.m_videoItemSeparator), movie.m_strIMDBNumber); // library view cache needs to be cleared CUtil::DeleteVideoDatabaseDirectoryCache(); @@ -1512,17 +1728,17 @@ void CGUIWindowVideoBase::OnSearch() { std::string strSearch; - if (!CGUIKeyboardFactory::ShowAndGetInput(strSearch, CVariant{g_localizeStrings.Get(16017)}, false)) + if (!CGUIKeyboardFactory::ShowAndGetInput(strSearch, g_localizeStrings.Get(16017), false)) return ; StringUtils::ToLower(strSearch); if (m_dlgProgress) { - m_dlgProgress->SetHeading(CVariant{194}); - m_dlgProgress->SetLine(0, CVariant{strSearch}); - m_dlgProgress->SetLine(1, CVariant{""}); - m_dlgProgress->SetLine(2, CVariant{""}); - m_dlgProgress->Open(); + m_dlgProgress->SetHeading(194); + m_dlgProgress->SetLine(0, strSearch); + m_dlgProgress->SetLine(1, ""); + m_dlgProgress->SetLine(2, ""); + m_dlgProgress->StartModal(); m_dlgProgress->Progress(); } CFileItemList items; @@ -1535,7 +1751,7 @@ { CGUIDialogSelect* pDlgSelect = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDlgSelect->Reset(); - pDlgSelect->SetHeading(CVariant{283}); + pDlgSelect->SetHeading(283); for (int i = 0; i < (int)items.Size(); i++) { @@ -1543,7 +1759,7 @@ pDlgSelect->Add(pItem->GetLabel()); } - pDlgSelect->Open(); + pDlgSelect->DoModal(); int iItem = pDlgSelect->GetSelectedLabel(); if (iItem < 0) @@ -1555,7 +1771,7 @@ } else { - CGUIDialogOK::ShowAndGetInput(CVariant{194}, CVariant{284}); + CGUIDialogOK::ShowAndGetInput(194, 284); } } @@ -1571,7 +1787,7 @@ Update(strParentPath); - if (pSelItem->IsVideoDb() && CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) + if (pSelItem->IsVideoDb() && CSettings::Get().GetBool("myvideos.flatten")) SetHistoryForPath(""); else SetHistoryForPath(strParentPath); @@ -1597,7 +1813,7 @@ Update(strPath); - if (pSelItem->IsVideoDb() && CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) + if (pSelItem->IsVideoDb() && CSettings::Get().GetBool("myvideos.flatten")) SetHistoryForPath(""); else SetHistoryForPath(strPath); @@ -1659,7 +1875,7 @@ if (!searchItems.Size()) return; - searchItems.Sort(SortByLabel, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); + searchItems.Sort(SortByLabel, SortOrderAscending, CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone); for (int i = 0; i < searchItems.Size(); i++) searchItems[i]->SetLabel(prependLabel + searchItems[i]->GetLabel()); results.Append(searchItems); @@ -1672,7 +1888,7 @@ bool bCanceled; CVideoDatabase db; db.Open(); - if (CGUIDialogYesNo::ShowAndGetInput(CVariant{header}, CVariant{text}, bCanceled, CVariant{ "" }, CVariant{ "" }, CGUIDialogYesNo::NO_TIMEOUT)) + if (CGUIDialogYesNo::ShowAndGetInput(header, text, bCanceled)) { CGUIDialogProgress *progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); db.RemoveContentForPath(path, progress); @@ -1717,9 +1933,10 @@ if (OnUnAssignContent(path, 20442, 20443)) bScan = true; } - db.SetScraperForPath(path, info, settings); } + db.SetScraperForPath(path,info,settings); + if (bScan) { g_application.StartVideoScan(path, true, true); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowVideoBase.h kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowVideoBase.h --- kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowVideoBase.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowVideoBase.h 2015-10-19 08:39:17.000000000 +0000 @@ -49,7 +49,7 @@ static bool HasResumeItemOffset(const CFileItem *item); void AddToDatabase(int iItem); - virtual void OnItemInfo(CFileItem* pItem, ADDON::ScraperPtr& scraper); + virtual void OnInfo(CFileItem* pItem, ADDON::ScraperPtr& scraper); /*! \brief Show the resume menu for this item (if it has a resume bookmark) @@ -109,7 +109,7 @@ \param item the selected item \return true if the action is performed, false otherwise */ - bool OnItemInfo(int item); + bool OnInfo(int item); /*! \brief perform a given action on a file \param item the selected item \param action the action to perform @@ -124,7 +124,7 @@ virtual bool OnPlayAndQueueMedia(const CFileItemPtr &item); void LoadPlayList(const std::string& strPlayList, int iPlayList = PLAYLIST_VIDEO); - bool ShowIMDB(CFileItemPtr item, const ADDON::ScraperPtr& content, bool fromDB); + bool ShowIMDB(CFileItem *item, const ADDON::ScraperPtr& content, bool fromDB); void AddItemToPlayList(const CFileItemPtr &pItem, CFileItemList &queuedItems); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowVideoNav.cpp kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowVideoNav.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowVideoNav.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowVideoNav.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -34,7 +34,7 @@ #include "filesystem/Directory.h" #include "FileItem.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "profiles/ProfilesManager.h" #include "settings/AdvancedSettings.h" #include "settings/MediaSettings.h" @@ -45,18 +45,15 @@ #include "utils/log.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" -#include "utils/Variant.h" #include "guilib/GUIKeyboardFactory.h" #include "video/VideoInfoScanner.h" #include "video/dialogs/GUIDialogVideoInfo.h" #include "pvr/recordings/PVRRecording.h" #include "ContextMenuManager.h" -#include - using namespace XFILE; using namespace VIDEODATABASEDIRECTORY; -using namespace KODI::MESSAGING; +using namespace std; #define CONTROL_BTNVIEWASICONS 2 #define CONTROL_BTNSORTBY 3 @@ -116,9 +113,9 @@ /* We don't want to show Autosourced items (ie removable pendrives, memorycards) in Library mode */ m_rootDir.AllowNonLocalSources(false); - SetProperty("flattened", CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)); + SetProperty("flattened", CSettings::Get().GetBool("myvideos.flatten")); if (message.GetNumStringParams() && StringUtils::EqualsNoCase(message.GetStringParam(0), "Files") && - CMediaSourceSettings::GetInstance().GetSources("video")->empty()) + CMediaSourceSettings::Get().GetSources("video")->empty()) { message.SetStringParam(""); } @@ -159,18 +156,18 @@ } else if (iControl == CONTROL_BTNSHOWMODE) { - CMediaSettings::GetInstance().CycleWatchedMode(m_vecItems->GetContent()); - CSettings::GetInstance().Save(); + CMediaSettings::Get().CycleWatchedMode(m_vecItems->GetContent()); + CSettings::Get().Save(); OnFilterItems(GetProperty("filter").asString()); return true; } else if (iControl == CONTROL_BTNSHOWALL) { - if (CMediaSettings::GetInstance().GetWatchedMode(m_vecItems->GetContent()) == WatchedModeAll) - CMediaSettings::GetInstance().SetWatchedMode(m_vecItems->GetContent(), WatchedModeUnwatched); + if (CMediaSettings::Get().GetWatchedMode(m_vecItems->GetContent()) == WatchedModeAll) + CMediaSettings::Get().SetWatchedMode(m_vecItems->GetContent(), WatchedModeUnwatched); else - CMediaSettings::GetInstance().SetWatchedMode(m_vecItems->GetContent(), WatchedModeAll); - CSettings::GetInstance().Save(); + CMediaSettings::Get().SetWatchedMode(m_vecItems->GetContent(), WatchedModeAll); + CSettings::Get().Save(); OnFilterItems(GetProperty("filter").asString()); return true; } @@ -200,7 +197,7 @@ if (nodeType == NODE_TYPE_SEASONS || nodeType == NODE_TYPE_EPISODES) { - int iValue = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOLIBRARY_TVSHOWSSELECTFIRSTUNWATCHEDITEM); + int iValue = CSettings::Get().GetInt("videolibrary.tvshowsselectfirstunwatcheditem"); if (iValue >= SelectFirstUnwatchedItem::NEVER && iValue <= SelectFirstUnwatchedItem::ALWAYS) return (SelectFirstUnwatchedItem)iValue; } @@ -211,7 +208,7 @@ IncludeAllSeasonsAndSpecials CGUIWindowVideoNav::GetSettingIncludeAllSeasonsAndSpecials() { - int iValue = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOLIBRARY_TVSHOWSINCLUDEALLSEASONSANDSPECIALS); + int iValue = CSettings::Get().GetInt("videolibrary.tvshowsincludeallseasonsandspecials"); if (iValue >= IncludeAllSeasonsAndSpecials::NEITHER && iValue <= IncludeAllSeasonsAndSpecials::SPECIALS) return (IncludeAllSeasonsAndSpecials)iValue; @@ -318,7 +315,7 @@ dir.GetQueryParams(items.GetPath(),params); VIDEODATABASEDIRECTORY::NODE_TYPE node = dir.GetDirectoryChildType(items.GetPath()); - int iFlatten = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOLIBRARY_FLATTENTVSHOWS); + int iFlatten = CSettings::Get().GetInt("videolibrary.flattentvshows"); int itemsSize = items.GetObjectCount(); int firstIndex = items.Size() - itemsSize; @@ -333,7 +330,7 @@ (itemsSize == 2 && iFlatten == 1 && // flatten if one season + specials (items[firstIndex]->GetVideoInfoTag()->m_iSeason == 0 || items[firstIndex + 1]->GetVideoInfoTag()->m_iSeason == 0)); - if (iFlatten > 0 && !bFlatten && (WatchedMode)CMediaSettings::GetInstance().GetWatchedMode("tvshows") == WatchedModeUnwatched) + if (iFlatten > 0 && !bFlatten && (WatchedMode)CMediaSettings::Get().GetWatchedMode("tvshows") == WatchedModeUnwatched) { int count = 0; for(int i = 0; i < items.Size(); i++) @@ -366,7 +363,7 @@ // grab the show thumb CVideoInfoTag details; m_database.GetTvShowInfo("", details, params.GetTvShowId()); - std::map art; + map art; if (m_database.GetArtForItem(details.m_iDbId, details.m_type, art)) { items.AppendArt(art, details.m_type); @@ -421,20 +418,7 @@ } else if (node == NODE_TYPE_TITLE_MOVIES || node == NODE_TYPE_RECENTLY_ADDED_MOVIES) - { - if (params.GetSetId() > 0) - { - CGUIListItem::ArtMap setArt; - if (m_database.GetArtForItem(params.GetSetId(), MediaTypeVideoCollection, setArt)) - { - items.AppendArt(setArt, MediaTypeVideoCollection); - items.SetArtFallback("fanart", "set.fanart"); - if (items.HasArt("set.poster")) - items.SetArtFallback("thumb", "set.poster"); - } - } items.SetContent("movies"); - } else if (node == NODE_TYPE_TITLE_TVSHOWS) items.SetContent("tvshows"); else if (node == NODE_TYPE_TITLE_MUSICVIDEOS || @@ -466,14 +450,12 @@ else items.SetContent(""); } - else if (URIUtils::PathEquals(items.GetPath(), "special://videoplaylists/")) - items.SetContent("playlists"); else if (!items.IsVirtualDirectoryRoot()) { // load info from the database std::string label; - if (items.GetLabel().empty() && m_rootDir.IsSource(items.GetPath(), CMediaSourceSettings::GetInstance().GetSources("video"), &label)) + if (items.GetLabel().empty() && m_rootDir.IsSource(items.GetPath(), CMediaSourceSettings::Get().GetSources("video"), &label)) items.SetLabel(label); - if (!items.IsSourcesPath() && !items.IsLibraryFolder()) + if (!items.IsSourcesPath()) LoadVideoInfo(items); } @@ -522,8 +504,8 @@ Similarly, we assign the "clean" library labels to the item only if the "Replace filenames with library titles" setting is enabled. */ - const bool stackItems = items.GetProperty("isstacked").asBoolean() || (StackingAvailable(items) && CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_STACKVIDEOS)); - const bool replaceLabels = allowReplaceLabels && CSettings::GetInstance().GetBool(CSettings::SETTING_MYVIDEOS_REPLACELABELS); + const bool stackItems = items.GetProperty("isstacked").asBoolean() || (StackingAvailable(items) && CSettings::Get().GetBool("myvideos.stackvideos")); + const bool replaceLabels = allowReplaceLabels && CSettings::Get().GetBool("myvideos.replacelabels"); CFileItemList dbItems; /* NOTE: In the future when GetItemsForPath returns all items regardless of whether they're "in the library" @@ -637,7 +619,7 @@ SET_CONTROL_LABEL(CONTROL_FILTER, strLabel); - int watchMode = CMediaSettings::GetInstance().GetWatchedMode(m_vecItems->GetContent()); + int watchMode = CMediaSettings::Get().GetWatchedMode(m_vecItems->GetContent()); SET_CONTROL_LABEL(CONTROL_BTNSHOWMODE, g_localizeStrings.Get(16100 + watchMode)); SET_CONTROL_SELECTED(GetID(), CONTROL_BTNSHOWALL, watchMode != WatchedModeAll); @@ -733,7 +715,7 @@ CGUIWindowVideoBase::PlayItem(iItem); } -void CGUIWindowVideoNav::OnItemInfo(CFileItem* pItem, ADDON::ScraperPtr& scraper) +void CGUIWindowVideoNav::OnInfo(CFileItem* pItem, ADDON::ScraperPtr& scraper) { if (!scraper || scraper->Content() == CONTENT_NONE) { @@ -748,7 +730,7 @@ } m_database.Close(); } - CGUIWindowVideoBase::OnItemInfo(pItem,scraper); + CGUIWindowVideoBase::OnInfo(pItem,scraper); } void CGUIWindowVideoNav::OnDeleteItem(CFileItemPtr pItem) @@ -768,11 +750,11 @@ pItem->GetPath().size() > 22 && pItem->m_bIsFolder) { CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); - pDialog->SetHeading(CVariant{432}); + pDialog->SetHeading(432); std::string strLabel = StringUtils::Format(g_localizeStrings.Get(433).c_str(),pItem->GetLabel().c_str()); - pDialog->SetLine(1, CVariant{std::move(strLabel)}); - pDialog->SetLine(2, CVariant{""}); - pDialog->Open(); + pDialog->SetLine(1, strLabel); + pDialog->SetLine(2, "");; + pDialog->DoModal(); if (pDialog->IsConfirmed()) { CFileItemList items; @@ -789,10 +771,11 @@ else if (m_vecItems->GetContent() == "tags" && pItem->m_bIsFolder) { CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); - pDialog->SetHeading(CVariant{432}); - pDialog->SetLine(1, CVariant{ StringUtils::Format(g_localizeStrings.Get(433).c_str(), pItem->GetLabel().c_str()) }); - pDialog->SetLine(2, CVariant{""}); - pDialog->Open(); + pDialog->SetHeading(432); + std::string strLabel = StringUtils::Format(g_localizeStrings.Get(433).c_str(), pItem->GetLabel().c_str()); + pDialog->SetLine(1, strLabel); + pDialog->SetLine(2, ""); + pDialog->DoModal(); if (pDialog->IsConfirmed()) { CVideoDatabaseDirectory dir; @@ -845,7 +828,7 @@ if (g_application.IsVideoScanning()) buttons.Add(CONTEXT_BUTTON_STOP_SCANNING, 13353); // Stop Scanning if (!item->IsDVD() && item->GetPath() != "add" && !item->IsParentFolder() && - (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser)) + (CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser)) { CVideoDatabase database; database.Open(); @@ -910,7 +893,7 @@ buttons.Add(CONTEXT_BUTTON_INFO, 13346); // can we update the database? - if (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) { if (!item->IsPlugin() && !item->IsScript() && !item->IsLiveTV() && !item->IsAddonsPath() && item->GetPath() != "sources://video/" && @@ -936,7 +919,6 @@ if (!g_application.IsVideoScanning() && item->IsVideoDb() && item->HasVideoInfoTag() && (item->GetVideoInfoTag()->m_type == MediaTypeMovie || // movies item->GetVideoInfoTag()->m_type == MediaTypeTvShow || // tvshows - item->GetVideoInfoTag()->m_type == MediaTypeSeason || // seasons item->GetVideoInfoTag()->m_type == MediaTypeEpisode || // episodes item->GetVideoInfoTag()->m_type == MediaTypeMusicVideo || // musicvideos item->GetVideoInfoTag()->m_type == "tag" || // tags @@ -952,6 +934,9 @@ buttons.Add(CONTEXT_BUTTON_SCAN, 13349); } + if (node == NODE_TYPE_SEASONS && item->m_bIsFolder) + buttons.Add(CONTEXT_BUTTON_SET_SEASON_ART, 13511); + if (node == NODE_TYPE_ACTOR && !dir.IsAllItem(item->GetPath()) && item->m_bIsFolder) { if (StringUtils::StartsWithNoCase(m_vecItems->GetPath(), "videodb://musicvideos")) // mvids @@ -963,7 +948,7 @@ if (!m_vecItems->IsVideoDb() && !m_vecItems->IsVirtualDirectoryRoot()) { // non-video db items, file operations are allowed - if ((CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_ALLOWFILEDELETION) && + if ((CSettings::Get().GetBool("filelists.allowfiledeletion") && CUtil::SupportsWriteFileOperations(item->GetPath())) || (inPlaylists && URIUtils::GetFileName(item->GetPath()) != "PartyMode-Video.xsp" && (item->IsPlayList() || item->IsSmartPlayList()))) @@ -986,7 +971,7 @@ if (item->IsPlugin() || item->IsScript() || m_vecItems->IsPlugin()) buttons.Add(CONTEXT_BUTTON_PLUGIN_SETTINGS, 1045); } - CContextMenuManager::GetInstance().AddVisibleItems(item, buttons); + CContextMenuManager::Get().AddVisibleItems(item, buttons); } } @@ -1001,9 +986,7 @@ if (button == CONTEXT_BUTTON_REMOVE_SOURCE && !item->IsPlugin() && !item->IsLiveTV() &&!item->IsRSS() && !URIUtils::IsUPnP(item->GetPath())) { - // if the source has been properly removed, remove the cached source list because the list has changed - if (OnUnAssignContent(item->GetPath(), 20375, 20340)) - m_vecItems->RemoveDiscCache(GetID()); + OnUnAssignContent(item->GetPath(), 20375, 20340); } Refresh(); return true; @@ -1028,6 +1011,7 @@ return true; } + case CONTEXT_BUTTON_SET_SEASON_ART: case CONTEXT_BUTTON_SET_ACTOR_THUMB: case CONTEXT_BUTTON_SET_ARTIST_THUMB: { @@ -1071,7 +1055,7 @@ m_vecItems->Get(itemNumber)->GetVideoInfoTag()->m_strTitle), song)) { - CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast(new CFileItem(song))); + CApplicationMessenger::Get().PlayFile(song); } return true; } @@ -1089,7 +1073,7 @@ if (!item->m_bIsFolder && item->IsVideoDb() && !item->Exists()) { CLog::Log(LOGDEBUG, "%s called on '%s' but file doesn't exist", __FUNCTION__, item->GetPath().c_str()); - if (CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) + if (CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) { if (!CGUIDialogVideoInfo::DeleteVideoItemFromDatabase(item, true)) return true; @@ -1101,7 +1085,7 @@ } else { - CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{662}); + CGUIDialogOK::ShowAndGetInput(257, 662); return true; } } @@ -1110,13 +1094,13 @@ // dont allow update while scanning if (g_application.IsVideoScanning()) { - CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{14057}); + CGUIDialogOK::ShowAndGetInput(257, 14057); return true; } //Get the new title std::string strTag; - if (!CGUIKeyboardFactory::ShowAndGetInput(strTag, CVariant{g_localizeStrings.Get(20462)}, false)) + if (!CGUIKeyboardFactory::ShowAndGetInput(strTag, g_localizeStrings.Get(20462), false)) return true; CVideoDatabase videodb; @@ -1133,7 +1117,7 @@ if (!videodb.GetSingleValue("tag", "tag.tag_id", videodb.PrepareSQL("tag.name = '%s' AND tag.tag_id IN (SELECT tag_link.tag_id FROM tag_link WHERE tag_link.media_type = '%s')", strTag.c_str(), mediaType.c_str())).empty()) { std::string strError = StringUtils::Format(g_localizeStrings.Get(20463).c_str(), strTag.c_str()); - CGUIDialogOK::ShowAndGetInput(CVariant{20462}, CVariant{std::move(strError)}); + CGUIDialogOK::ShowAndGetInput(20462, strError); return true; } @@ -1249,7 +1233,7 @@ (items.IsSmartPlayList() || items.IsLibraryFolder())) node = NODE_TYPE_TITLE_TVSHOWS; // so that the check below works - int watchMode = CMediaSettings::GetInstance().GetWatchedMode(m_vecItems->GetContent()); + int watchMode = CMediaSettings::Get().GetWatchedMode(m_vecItems->GetContent()); for (int i = 0; i < items.Size(); i++) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowVideoNav.h kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowVideoNav.h --- kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowVideoNav.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowVideoNav.h 2015-04-04 00:00:18.000000000 +0000 @@ -49,7 +49,7 @@ virtual bool OnAction(const CAction &action); virtual bool OnMessage(CGUIMessage& message); - virtual void OnItemInfo(CFileItem* pItem, ADDON::ScraperPtr &info); + virtual void OnInfo(CFileItem* pItem, ADDON::ScraperPtr &info); /*! \brief Load video information from the database for these items (public static version) Useful for grabbing information for file listings, from watched status to full metadata diff -Nru kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowVideoPlaylist.cpp kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowVideoPlaylist.cpp --- kodi-16.1~git20160425.1001-final/xbmc/video/windows/GUIWindowVideoPlaylist.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/video/windows/GUIWindowVideoPlaylist.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -35,7 +35,6 @@ #include "guilib/LocalizeStrings.h" #include "utils/log.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "ContextMenuManager.h" using namespace PLAYLIST; @@ -128,8 +127,8 @@ if (!g_partyModeManager.IsEnabled()) { g_playlistPlayer.SetShuffle(PLAYLIST_VIDEO, !(g_playlistPlayer.IsShuffled(PLAYLIST_VIDEO))); - CMediaSettings::GetInstance().SetVideoPlaylistShuffled(g_playlistPlayer.IsShuffled(PLAYLIST_VIDEO)); - CSettings::GetInstance().Save(); + CMediaSettings::Get().SetVideoPlaylistShuffled(g_playlistPlayer.IsShuffled(PLAYLIST_VIDEO)); + CSettings::Get().Save(); UpdateButtons(); Refresh(); } @@ -171,8 +170,8 @@ g_playlistPlayer.SetRepeat(PLAYLIST_VIDEO, PLAYLIST::REPEAT_NONE); // save settings - CMediaSettings::GetInstance().SetVideoPlaylistRepeat(g_playlistPlayer.GetRepeat(PLAYLIST_VIDEO) == PLAYLIST::REPEAT_ALL); - CSettings::GetInstance().Save(); + CMediaSettings::Get().SetVideoPlaylistRepeat(g_playlistPlayer.GetRepeat(PLAYLIST_VIDEO) == PLAYLIST::REPEAT_ALL); + CSettings::Get().Save(); UpdateButtons(); } @@ -373,10 +372,10 @@ void CGUIWindowVideoPlaylist::SavePlayList() { std::string strNewFileName; - if (CGUIKeyboardFactory::ShowAndGetInput(strNewFileName, CVariant{g_localizeStrings.Get(16012)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(strNewFileName, g_localizeStrings.Get(16012), false)) { // need 2 rename it - std::string strFolder = URIUtils::AddFileToFolder(CSettings::GetInstance().GetString(CSettings::SETTING_SYSTEM_PLAYLISTSPATH), "video"); + std::string strFolder = URIUtils::AddFileToFolder(CSettings::Get().GetString("system.playlistspath"), "video"); strNewFileName = CUtil::MakeLegalFileName(strNewFileName); strNewFileName += ".m3u"; std::string strPath = URIUtils::AddFileToFolder(strFolder, strNewFileName); @@ -409,10 +408,10 @@ if (item->IsVideoDb()) { CFileItem item2(item->GetVideoInfoTag()->m_strFileNameAndPath, false); - CPlayerCoreFactory::GetInstance().GetPlayers(item2, vecCores); + CPlayerCoreFactory::Get().GetPlayers(item2, vecCores); } else - CPlayerCoreFactory::GetInstance().GetPlayers(*item, vecCores); + CPlayerCoreFactory::Get().GetPlayers(*item, vecCores); if (vecCores.size() > 1) buttons.Add(CONTEXT_BUTTON_PLAY_WITH, 15213); // Play With... @@ -438,7 +437,7 @@ } if(itemNumber > 0 && itemNumber < m_vecItems->Size()) - CContextMenuManager::GetInstance().AddVisibleItems(m_vecItems->Get(itemNumber), buttons); + CContextMenuManager::Get().AddVisibleItems(m_vecItems->Get(itemNumber), buttons); } bool CGUIWindowVideoPlaylist::OnContextButton(int itemNumber, CONTEXT_BUTTON button) @@ -457,11 +456,11 @@ if (item->IsVideoDb()) { CFileItem item2(*item->GetVideoInfoTag()); - CPlayerCoreFactory::GetInstance().GetPlayers(item2, vecCores); + CPlayerCoreFactory::Get().GetPlayers(item2, vecCores); } else - CPlayerCoreFactory::GetInstance().GetPlayers(*item, vecCores); - g_application.m_eForcedNextPlayer = CPlayerCoreFactory::GetInstance().SelectPlayerDialog(vecCores); + CPlayerCoreFactory::Get().GetPlayers(*item, vecCores); + g_application.m_eForcedNextPlayer = CPlayerCoreFactory::Get().SelectPlayerDialog(vecCores); if (g_application.m_eForcedNextPlayer != EPC_NONE) OnClick(itemNumber); return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/view/GUIViewControl.cpp kodi-15.2~git20151019.1039-final/xbmc/view/GUIViewControl.cpp --- kodi-16.1~git20160425.1001-final/xbmc/view/GUIViewControl.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/view/GUIViewControl.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,17 +19,14 @@ */ #include "GUIViewControl.h" - -#include - -#include "FileItem.h" -#include "GUIInfoManager.h" #include "guilib/GUIWindowManager.h" -#include "guilib/IGUIContainer.h" +#include "utils/URIUtils.h" +#include "utils/StringUtils.h" +#include "FileItem.h" #include "guilib/LocalizeStrings.h" +#include "GUIInfoManager.h" #include "guilib/WindowIDs.h" -#include "utils/StringUtils.h" -#include "utils/URIUtils.h" +#include "guilib/IGUIContainer.h" CGUIViewControl::CGUIViewControl(void) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/view/GUIViewState.cpp kodi-15.2~git20151019.1039-final/xbmc/view/GUIViewState.cpp --- kodi-16.1~git20160425.1001-final/xbmc/view/GUIViewState.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/view/GUIViewState.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,7 +19,6 @@ */ #include "view/GUIViewState.h" -#include "events/windows/GUIViewStateEventLog.h" #include "pvr/windows/GUIViewStatePVR.h" #include "addons/GUIViewStateAddonBrowser.h" #include "music/GUIViewStateMusic.h" @@ -52,6 +51,7 @@ #define PROPERTY_SORT_ORDER "sort.order" #define PROPERTY_SORT_ASCENDING "sort.ascending" +using namespace std; using namespace ADDON; using namespace PVR; @@ -109,9 +109,6 @@ if (url.IsProtocol("androidapp")) return new CGUIViewStateWindowPrograms(items); - if (url.IsProtocol("activities")) - return new CGUIViewStateEventLog(items); - if (windowId == WINDOW_MUSIC_NAV) return new CGUIViewStateWindowMusicNav(items); @@ -172,9 +169,6 @@ if (windowId == WINDOW_ADDON_BROWSER) return new CGUIViewStateAddonBrowser(items); - if (windowId == WINDOW_EVENT_LOG) - return new CGUIViewStateEventLog(items); - // Use as fallback/default return new CGUIViewStateGeneral(items); } @@ -209,15 +203,6 @@ return SortOrderAscending; } -int CGUIViewState::GetSortOrderLabel() const -{ - if (m_currentSortMethod >= 0 && m_currentSortMethod < (int)m_sortMethods.size()) - if (m_sortMethods[m_currentSortMethod].m_sortDescription.sortOrder == SortOrderDescending) - return 585; - - return 584; // default sort order label 'Ascending' -} - int CGUIViewState::GetViewAsControl() const { return m_currentViewAsControl; @@ -291,8 +276,7 @@ // the following sort methods are sorted in descending order by default if (sortBy == SortByDate || sortBy == SortBySize || sortBy == SortByPlaycount || sortBy == SortByRating || sortBy == SortByProgramCount || - sortBy == SortByBitrate || sortBy == SortByListeners || - sortBy == SortByUserRating || sortBy == SortByLastPlayed) + sortBy == SortByBitrate || sortBy == SortByListeners) sortOrder = SortOrderDescending; else sortOrder = SortOrderAscending; @@ -358,18 +342,18 @@ bool CGUIViewState::HideExtensions() { - return !CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWEXTENSIONS); + return !CSettings::Get().GetBool("filelists.showextensions"); } bool CGUIViewState::HideParentDirItems() { - return !CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS); + return !CSettings::Get().GetBool("filelists.showparentdiritems"); } bool CGUIViewState::DisableAddSourceButtons() { - if (CProfilesManager::GetInstance().GetCurrentProfile().canWriteSources() || g_passwordManager.bMasterUser) - return !CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWADDSOURCEBUTTONS); + if (CProfilesManager::Get().GetCurrentProfile().canWriteSources() || g_passwordManager.bMasterUser) + return !CSettings::Get().GetBool("filelists.showaddsourcebuttons"); return true; } @@ -462,7 +446,7 @@ void CGUIViewState::AddLiveTVSources() { - VECSOURCES *sources = CMediaSourceSettings::GetInstance().GetSources("video"); + VECSOURCES *sources = CMediaSourceSettings::Get().GetSources("video"); for (IVECSOURCES it = sources->begin(); it != sources->end(); it++) { if (URIUtils::IsLiveTV((*it).strPath)) @@ -496,7 +480,7 @@ return; CViewState state; - if (db.GetViewState(path, windowID, state, CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKIN)) || + if (db.GetViewState(path, windowID, state, CSettings::Get().GetString("lookandfeel.skin")) || db.GetViewState(path, windowID, state, "")) { SetViewAsControl(state.m_viewMode); @@ -515,11 +499,11 @@ if (viewState != NULL) *viewState = state; - db.SetViewState(path, windowID, state, CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKIN)); + db.SetViewState(path, windowID, state, CSettings::Get().GetString("lookandfeel.skin")); db.Close(); if (viewState != NULL) - CSettings::GetInstance().Save(); + CSettings::Get().Save(); } void CGUIViewState::AddPlaylistOrder(const CFileItemList &items, LABEL_MASKS label_masks) @@ -551,7 +535,7 @@ CGUIViewStateFromItems::CGUIViewStateFromItems(const CFileItemList &items) : CGUIViewState(items) { - const std::vector &details = items.GetSortDetails(); + const vector &details = items.GetSortDetails(); for (unsigned int i = 0; i < details.size(); i++) { const GUIViewSortDetails sort = details[i]; @@ -566,7 +550,7 @@ { CURL url(items.GetPath()); AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN)) + if (CAddonMgr::Get().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN)) { PluginPtr plugin = std::static_pointer_cast(addon); if (plugin->Provides(CPluginSource::AUDIO)) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/view/GUIViewState.h kodi-15.2~git20151019.1039-final/xbmc/view/GUIViewState.h --- kodi-16.1~git20160425.1001-final/xbmc/view/GUIViewState.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/view/GUIViewState.h 2015-10-19 08:39:17.000000000 +0000 @@ -42,7 +42,6 @@ SortDescription GetSortMethod() const; bool HasMultipleSortMethods() const; int GetSortMethodLabel() const; - int GetSortOrderLabel() const; void GetSortMethodLabelMasks(LABEL_MASKS& masks) const; SortOrder SetNextSortOrder(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/view/ViewDatabase.cpp kodi-15.2~git20151019.1039-final/xbmc/view/ViewDatabase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/view/ViewDatabase.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/view/ViewDatabase.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -19,22 +19,17 @@ */ #include "ViewDatabase.h" - -#include - -#include "dbwrappers/dataset.h" -#include "SortFileItem.h" -#include "system.h" +#include "utils/URIUtils.h" +#include "view/ViewState.h" #include "utils/LegacyPathTranslation.h" #include "utils/log.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "view/ViewState.h" - #ifdef TARGET_POSIX #include "linux/ConvUtils.h" // GetLastError() #endif +#include "dbwrappers/dataset.h" +#include "SortFileItem.h" + CViewDatabase::CViewDatabase(void) { } @@ -93,7 +88,7 @@ m_pDS->close(); for (std::vector< std::pair >::const_iterator it = paths.begin(); it != paths.end(); ++it) - m_pDS->exec(PrepareSQL("UPDATE view SET path='%s' WHERE idView=%d", it->second.c_str(), it->first)); + m_pDS->exec(PrepareSQL("UPDATE view SET path='%s' WHERE idView=%d", it->second.c_str(), it->first).c_str()); } } if (version < 6) @@ -144,7 +139,7 @@ sql = PrepareSQL("select * from view where window = %i and path='%s'", window, path1.c_str()); else sql = PrepareSQL("select * from view where window = %i and path='%s' and skin='%s'", window, path1.c_str(), skin.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (!m_pDS->eof()) { // have some information @@ -176,21 +171,21 @@ if (path1.empty()) path1 = "root://"; std::string sql = PrepareSQL("select idView from view where window = %i and path='%s' and skin='%s'", window, path1.c_str(), skin.c_str()); - m_pDS->query(sql); + m_pDS->query(sql.c_str()); if (!m_pDS->eof()) { // update the view int idView = m_pDS->fv("idView").get_asInt(); m_pDS->close(); sql = PrepareSQL("update view set viewMode=%i,sortMethod=%i,sortOrder=%i,sortAttributes=%i where idView=%i", state.m_viewMode, (int)state.m_sortDescription.sortBy, (int)state.m_sortDescription.sortOrder, (int)state.m_sortDescription.sortAttributes, idView); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } else { // add the view m_pDS->close(); sql = PrepareSQL("insert into view (idView, path, window, viewMode, sortMethod, sortOrder, sortAttributes, skin) values(NULL, '%s', %i, %i, %i, %i, %i, '%s')", path1.c_str(), window, state.m_viewMode, (int)state.m_sortDescription.sortBy, (int)state.m_sortDescription.sortOrder, (int)state.m_sortDescription.sortAttributes, skin.c_str()); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } } catch (...) @@ -208,7 +203,7 @@ if (NULL == m_pDS.get()) return false; std::string sql = PrepareSQL("delete from view where window = %i", windowID); - m_pDS->exec(sql); + m_pDS->exec(sql.c_str()); } catch (...) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/view/ViewStateSettings.cpp kodi-15.2~git20151019.1039-final/xbmc/view/ViewStateSettings.cpp --- kodi-16.1~git20160425.1001-final/xbmc/view/ViewStateSettings.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/view/ViewStateSettings.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -18,32 +18,25 @@ * */ -#include "ViewStateSettings.h" - -#include -#include +#include +#include "ViewStateSettings.h" #include "threads/SingleLock.h" #include "utils/log.h" -#include "utils/SortUtils.h" #include "utils/XBMCTinyXML.h" #include "utils/XMLUtils.h" -#define XML_VIEWSTATESETTINGS "viewstates" -#define XML_VIEWMODE "viewmode" -#define XML_SORTMETHOD "sortmethod" -#define XML_SORTORDER "sortorder" -#define XML_SORTATTRIBUTES "sortattributes" -#define XML_GENERAL "general" -#define XML_SETTINGLEVEL "settinglevel" -#define XML_EVENTLOG "eventlog" -#define XML_EVENTLOG_LEVEL "level" -#define XML_EVENTLOG_LEVEL_HIGHER "showhigherlevels" +#define XML_VIEWSTATESETTINGS "viewstates" +#define XML_VIEWMODE "viewmode" +#define XML_SORTMETHOD "sortmethod" +#define XML_SORTORDER "sortorder" +#define XML_SORTATTRIBUTES "sortattributes" +#define XML_GENERAL "general" +#define XML_SETTINGLEVEL "settinglevel" + +using namespace std; CViewStateSettings::CViewStateSettings() - : m_settingLevel(SettingLevelStandard), - m_eventLevel(EventLevelBasic), - m_eventShowHigherLevels(true) { AddViewState("musicnavartists"); AddViewState("musicnavalbums"); @@ -68,12 +61,12 @@ CViewStateSettings::~CViewStateSettings() { - for (std::map::const_iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); ++viewState) + for (map::const_iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); ++viewState) delete viewState->second; m_viewStates.clear(); } -CViewStateSettings& CViewStateSettings::GetInstance() +CViewStateSettings& CViewStateSettings::Get() { static CViewStateSettings sViewStateSettings; return sViewStateSettings; @@ -92,7 +85,7 @@ return false; } - for (std::map::iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); ++viewState) + for (map::iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); ++viewState) { const TiXmlNode* pViewState = pElement->FirstChildElement(viewState->first); if (pViewState == NULL) @@ -129,19 +122,6 @@ m_settingLevel = (SettingLevel)settingLevel; else m_settingLevel = SettingLevelStandard; - - const TiXmlNode* pEventLogNode = pElement->FirstChild(XML_EVENTLOG); - if (pEventLogNode != NULL) - { - int eventLevel; - if (XMLUtils::GetInt(pEventLogNode, XML_EVENTLOG_LEVEL, eventLevel, (const int)EventLevelBasic, (const int)EventLevelError)) - m_eventLevel = (EventLevel)eventLevel; - else - m_eventLevel = EventLevelBasic; - - if (!XMLUtils::GetBoolean(pEventLogNode, XML_EVENTLOG_LEVEL_HIGHER, m_eventShowHigherLevels)) - m_eventShowHigherLevels = true; - } } return true; @@ -162,7 +142,7 @@ return false; } - for (std::map::const_iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); ++viewState) + for (map::const_iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); ++viewState) { TiXmlElement newElement(viewState->first); TiXmlNode *pNewNode = pViewStateNode->InsertEndChild(newElement); @@ -186,18 +166,6 @@ XMLUtils::SetInt(generalNode, XML_SETTINGLEVEL, (int)m_settingLevel); - TiXmlNode *eventLogNode = generalNode->FirstChild(XML_EVENTLOG); - if (eventLogNode == NULL) - { - TiXmlElement eventLogElement(XML_EVENTLOG); - eventLogNode = generalNode->InsertEndChild(eventLogElement); - if (eventLogNode == NULL) - return false; - } - - XMLUtils::SetInt(eventLogNode, XML_EVENTLOG_LEVEL, (int)m_eventLevel); - XMLUtils::SetBoolean(eventLogNode, XML_EVENTLOG_LEVEL_HIGHER, (int)m_eventShowHigherLevels); - return true; } @@ -209,7 +177,7 @@ const CViewState* CViewStateSettings::Get(const std::string &viewState) const { CSingleLock lock(m_critical); - std::map::const_iterator view = m_viewStates.find(viewState); + map::const_iterator view = m_viewStates.find(viewState); if (view != m_viewStates.end()) return view->second; @@ -219,7 +187,7 @@ CViewState* CViewStateSettings::Get(const std::string &viewState) { CSingleLock lock(m_critical); - std::map::iterator view = m_viewStates.find(viewState); + map::iterator view = m_viewStates.find(viewState); if (view != m_viewStates.end()) return view->second; @@ -249,29 +217,6 @@ return level; } -void CViewStateSettings::SetEventLevel(EventLevel eventLevel) -{ - if (eventLevel < EventLevelBasic) - m_eventLevel = EventLevelBasic; - if (eventLevel > EventLevelError) - m_eventLevel = EventLevelError; - else - m_eventLevel = eventLevel; -} - -void CViewStateSettings::CycleEventLevel() -{ - m_eventLevel = GetNextEventLevel(); -} - -EventLevel CViewStateSettings::GetNextEventLevel() const -{ - EventLevel level = (EventLevel)((int)m_eventLevel + 1); - if (level > EventLevelError) - level = EventLevelBasic; - return level; -} - void CViewStateSettings::AddViewState(const std::string& strTagName, int defaultView /* = DEFAULT_VIEW_LIST */, SortBy defaultSort /* = SortByLabel */) { if (strTagName.empty() || m_viewStates.find(strTagName) != m_viewStates.end()) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/view/ViewStateSettings.h kodi-15.2~git20151019.1039-final/xbmc/view/ViewStateSettings.h --- kodi-16.1~git20160425.1001-final/xbmc/view/ViewStateSettings.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/view/ViewStateSettings.h 2015-10-19 08:39:17.000000000 +0000 @@ -23,7 +23,6 @@ #include #include "ViewState.h" -#include "events/IEvent.h" #include "guilib/GraphicContext.h" #include "settings/lib/ISubSettings.h" #include "settings/lib/Setting.h" @@ -34,11 +33,11 @@ class CViewStateSettings : public ISubSettings { public: - static CViewStateSettings& GetInstance(); + static CViewStateSettings& Get(); - virtual bool Load(const TiXmlNode *settings) override; - virtual bool Save(TiXmlNode *settings) const override; - virtual void Clear() override; + virtual bool Load(const TiXmlNode *settings); + virtual bool Save(TiXmlNode *settings) const; + virtual void Clear(); const CViewState* Get(const std::string &viewState) const; CViewState* Get(const std::string &viewState); @@ -48,14 +47,6 @@ void CycleSettingLevel(); SettingLevel GetNextSettingLevel() const; - EventLevel GetEventLevel() const { return m_eventLevel; } - void SetEventLevel(EventLevel eventLevel); - void CycleEventLevel(); - EventLevel GetNextEventLevel() const; - bool ShowHigherEventLevels() const { return m_eventShowHigherLevels; } - void SetShowHigherEventLevels(bool showHigherEventLevels) { m_eventShowHigherLevels = showHigherEventLevels; } - void ToggleShowHigherEventLevels() { m_eventShowHigherLevels = !m_eventShowHigherLevels; } - protected: CViewStateSettings(); CViewStateSettings(const CViewStateSettings&); @@ -65,8 +56,6 @@ private: std::map m_viewStates; SettingLevel m_settingLevel; - EventLevel m_eventLevel; - bool m_eventShowHigherLevels; CCriticalSection m_critical; void AddViewState(const std::string& strTagName, int defaultView = DEFAULT_VIEW_LIST, SortBy defaultSort = SortByLabel); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,472 @@ +/* XMMS - Cross-platform multimedia player + * Copyright (C) 1998-2000 Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * Wed May 24 10:49:37 CDT 2000 + * Fixes to threading/context creation for the nVidia X4 drivers by + * Christian Zander + */ + +/* + * Ported to XBMC by d4rk + * Also added 'hSpeed' to animate transition between bar heights + */ + + +#include "../../addons/include/xbmc_vis_dll.h" +#include +#include +#include + +#define NUM_BANDS 16 + +float y_angle = 45.0f, y_speed = 0.5f; +float x_angle = 20.0f, x_speed = 0.0f; +float z_angle = 0.0f, z_speed = 0.0f; +float heights[16][16], cHeights[16][16], scale; +float hSpeed = 0.05f; +DWORD g_mode = D3DFILL_SOLID; +LPDIRECT3DDEVICE9 g_device; + +typedef struct +{ + float x, y, z; + D3DCOLOR col; +} Vertex_t; + +#define VERTEX_FORMAT (D3DFVF_XYZ | D3DFVF_DIFFUSE) + +void draw_vertex(Vertex_t * pVertex, float x, float y, float z, D3DCOLOR color) { + pVertex->col = color; + pVertex->x = x; + pVertex->y = y; + pVertex->z = z; +} + +int draw_rectangle(Vertex_t * verts, float x1, float y1, float z1, float x2, float y2, float z2, D3DCOLOR color) +{ + if(y1 == y2) + { + draw_vertex(&verts[0], x1, y1, z1, color); + draw_vertex(&verts[1], x2, y1, z1, color); + draw_vertex(&verts[2], x2, y2, z2, color); + + draw_vertex(&verts[3], x2, y2, z2, color); + draw_vertex(&verts[4], x1, y2, z2, color); + draw_vertex(&verts[5], x1, y1, z1, color); + } + else + { + draw_vertex(&verts[0], x1, y1, z1, color); + draw_vertex(&verts[1], x2, y1, z2, color); + draw_vertex(&verts[2], x2, y2, z2, color); + + draw_vertex(&verts[3], x2, y2, z2, color); + draw_vertex(&verts[4], x1, y2, z1, color); + draw_vertex(&verts[5], x1, y1, z1, color); + } + return 6; +} + +void draw_bar(float x_offset, float z_offset, float height, float red, float green, float blue) +{ + Vertex_t verts[36]; + int verts_idx = 0; + + float width = 0.1f; + D3DCOLOR color; + + if (g_mode == D3DFILL_POINT) + color = D3DXCOLOR(0.2f, 1.0f, 0.2f, 1.0f); + + if (g_mode != D3DFILL_POINT) + { + color = D3DXCOLOR(red, green, blue, 1.0f); + verts_idx += draw_rectangle(&verts[verts_idx], x_offset, height, z_offset, x_offset + width, height, z_offset + 0.1f, color); + } + verts_idx += draw_rectangle(&verts[verts_idx], x_offset, 0.0f, z_offset, x_offset + width, 0.0f, z_offset + 0.1f, color); + + if (g_mode != D3DFILL_POINT) + { + color = D3DXCOLOR(0.5f * red, 0.5f * green, 0.5f * blue, 1.0f); + verts_idx += draw_rectangle(&verts[verts_idx], x_offset, 0.0f, z_offset + 0.1f, x_offset + width, height, z_offset + 0.1f, color); + } + verts_idx += draw_rectangle(&verts[verts_idx], x_offset, 0.0f, z_offset, x_offset + width, height, z_offset, color); + + if (g_mode != D3DFILL_POINT) + { + color = D3DXCOLOR(0.25f * red, 0.25f * green, 0.25f * blue, 1.0f); + verts_idx += draw_rectangle(&verts[verts_idx], x_offset, 0.0f, z_offset , x_offset, height, z_offset + 0.1f, color); + } + verts_idx += draw_rectangle(&verts[verts_idx], x_offset + width, 0.0f, z_offset , x_offset + width, height, z_offset + 0.1f, color); + + g_device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, verts_idx / 3, verts, sizeof(Vertex_t)); +} + +void draw_bars(void) +{ + int x,y; + float x_offset, z_offset, r_base, b_base; + D3DXMATRIX matRotationX, matRotationY, matRotationZ, matTranslation, matWorld; + + D3DXMatrixIdentity(&matWorld); + D3DXMatrixRotationZ(&matRotationZ, D3DXToRadian(z_angle)); + D3DXMatrixRotationY(&matRotationY, -D3DXToRadian(y_angle)); + D3DXMatrixRotationX(&matRotationX, -D3DXToRadian(x_angle)); + D3DXMatrixTranslation(&matTranslation, 0.0f, -0.5f, 5.0f); + matWorld = matRotationZ * matRotationY * matRotationX * matTranslation; + g_device->SetTransform(D3DTS_WORLD, &matWorld); + + for(y = 0; y < 16; y++) + { + z_offset = -1.6f + ((15 - y) * 0.2f); + + b_base = y * (1.0f / 15); + r_base = 1.0f - b_base; + + for(x = 0; x < 16; x++) + { + x_offset = -1.6f + (x * 0.2f); + if (::fabs(cHeights[y][x]-heights[y][x])>hSpeed) + { + if (cHeights[y][x]device; + + return ADDON_STATUS_NEED_SETTINGS; +} + +//-- Render ------------------------------------------------------------------- +// Called once per frame. Do all rendering here. +//----------------------------------------------------------------------------- +extern "C" void Render() +{ + bool configured = true; //FALSE; + + g_device->SetRenderState(D3DRS_SRCBLEND , D3DBLEND_ONE); + g_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); + g_device->SetRenderState(D3DRS_AMBIENT, 0xffffffff); + g_device->SetRenderState(D3DRS_LIGHTING, FALSE); + g_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + g_device->SetRenderState(D3DRS_ZENABLE, TRUE); + g_device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); + g_device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); + g_device->SetRenderState(D3DRS_FILLMODE, g_mode); + g_device->SetFVF(VERTEX_FORMAT); + g_device->SetPixelShader(NULL); + g_device->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f), 1.0f, 0); + + D3DXMATRIX matProjection; + D3DXMatrixPerspectiveOffCenterLH(&matProjection, -1.0f, 1.0f, -1.0f, 1.0f, 1.5f, 10.0f); + g_device->SetTransform(D3DTS_PROJECTION, &matProjection); + + D3DXMATRIX matView; + D3DXMatrixIdentity(&matView); + g_device->SetTransform(D3DTS_VIEW, &matView); + + if(configured) + { + x_angle += x_speed; + if(x_angle >= 360.0f) + x_angle -= 360.0f; + + y_angle += y_speed; + if(y_angle >= 360.0f) + y_angle -= 360.0f; + + z_angle += z_speed; + if(z_angle >= 360.0f) + z_angle -= 360.0f; + + draw_bars(); + } +} + +extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName) +{ + int x, y; + + for(x = 0; x < 16; x++) + { + for(y = 0; y < 16; y++) + { + cHeights[y][x] = 0.0f; + } + } + + scale = 1.0f / log(256.0f); + + x_speed = 0.0f; + y_speed = 0.5f; + z_speed = 0.0f; + x_angle = 20.0f; + y_angle = 45.0f; + z_angle = 0.0f; +} + +extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +{ + int i,c; + int y=0; + float val; + + int xscale[] = {0, 1, 2, 3, 5, 7, 10, 14, 20, 28, 40, 54, 74, 101, 137, 187, 255}; + + for(y = 15; y > 0; y--) + { + for(i = 0; i < 16; i++) + { + heights[y][i] = heights[y - 1][i]; + } + } + + for(i = 0; i < NUM_BANDS; i++) + { + for(c = xscale[i], y = 0; c < xscale[i + 1]; c++) + { + if (c y)) + y = (int)(pAudioData[c] * (0x07fff+.5f)); + } + else + continue; + } + y >>= 7; + if(y > 0) + val = (logf((float)y) * scale); + else + val = 0; + heights[0][i] = val; + } +} + + +//-- GetInfo ------------------------------------------------------------------ +// Tell XBMC our requirements +//----------------------------------------------------------------------------- +extern "C" void GetInfo(VIS_INFO* pInfo) +{ + pInfo->bWantsFreq = false; + pInfo->iSyncDelay = 0; +} + +//-- GetSubModules ------------------------------------------------------------ +// Return any sub modules supported by this vis +//----------------------------------------------------------------------------- +extern "C" unsigned int GetSubModules(char ***names) +{ + return 0; // this vis supports 0 sub modules +} + +//-- OnAction ----------------------------------------------------------------- +// Handle XBMC actions such as next preset, lock preset, album art changed etc +//----------------------------------------------------------------------------- +extern "C" bool OnAction(long flags, const void *param) +{ + bool ret = false; + return ret; +} + +//-- GetPresets --------------------------------------------------------------- +// Return a list of presets to XBMC for display +//----------------------------------------------------------------------------- +extern "C" unsigned int GetPresets(char ***presets) +{ + return 0; +} + +//-- GetPreset ---------------------------------------------------------------- +// Return the index of the current playing preset +//----------------------------------------------------------------------------- +extern "C" unsigned GetPreset() +{ + return 0; +} + +//-- IsLocked ----------------------------------------------------------------- +// Returns true if this add-on use settings +//----------------------------------------------------------------------------- +extern "C" bool IsLocked() +{ + return false; +} + +//-- Stop --------------------------------------------------------------------- +// This dll must stop all runtime activities +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Stop() +{ +} + +//-- Destroy ------------------------------------------------------------------ +// Do everything before unload of this add-on +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Destroy() +{ +} + +//-- HasSettings -------------------------------------------------------------- +// Returns true if this add-on use settings +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" bool ADDON_HasSettings() +{ + return true; +} + +//-- GetStatus --------------------------------------------------------------- +// Returns the current Status of this visualisation +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +//-- GetSettings -------------------------------------------------------------- +// Return the settings for XBMC to display +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +//-- FreeSettings -------------------------------------------------------------- +// Free the settings struct passed from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- + +extern "C" void ADDON_FreeSettings() +{ +} + +//-- SetSetting --------------------------------------------------------------- +// Set a specific Setting value (called from XBMC) +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_SetSetting(const char *strSetting, const void* value) +{ + if (!strSetting || !value) + return ADDON_STATUS_UNKNOWN; + + if (strcmp(strSetting, "bar_height")==0) + { + switch (*(int*) value) + { + case 0: + scale = 1.0f / log(256.0f); + break; + + case 1: + scale = 2.0f / log(256.0f); + break; + + case 2: + scale = 3.0f / log(256.0f); + break; + + case 3: + scale = 0.5f / log(256.0f); + break; + + case 4: + scale = 0.33f / log(256.0f); + break; + } + return ADDON_STATUS_OK; + } + + else if (strcmp(strSetting, "speed")==0) + { + switch (*(int*) value) + { + case 0: + hSpeed = 0.05f; + break; + + case 1: + hSpeed = 0.025f; + break; + + case 2: + hSpeed = 0.0125f; + break; + + case 3: + hSpeed = 0.10f; + break; + + case 4: + hSpeed = 0.20f; + break; + } + return ADDON_STATUS_OK; + } + + else if (strcmp(strSetting, "mode")==0) + { + switch (*(int*) value) + { + case 0: + g_mode = D3DFILL_SOLID; + break; + + case 1: + g_mode = D3DFILL_WIREFRAME; + break; + + case 2: + g_mode = D3DFILL_POINT; + break; + } + return ADDON_STATUS_OK; + } + return ADDON_STATUS_UNKNOWN; +} + +//-- Announce ----------------------------------------------------------------- +// Receive announcements from XBMC +//----------------------------------------------------------------------------- + +extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.sln kodi-15.2~git20151019.1039-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.sln --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.sln 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.sln 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "visDirectxSpectrum", "directx_spectrum.vcxproj", "{0D91724A-E6F6-4708-AF47-9F88BBE2114C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug (DirectX)|Win32 = Debug (DirectX)|Win32 + Release (DirectX)|Win32 = Release (DirectX)|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0D91724A-E6F6-4708-AF47-9F88BBE2114C}.Debug (DirectX)|Win32.ActiveCfg = Debug (DirectX)|Win32 + {0D91724A-E6F6-4708-AF47-9F88BBE2114C}.Debug (DirectX)|Win32.Build.0 = Debug (DirectX)|Win32 + {0D91724A-E6F6-4708-AF47-9F88BBE2114C}.Release (DirectX)|Win32.ActiveCfg = Release (DirectX)|Win32 + {0D91724A-E6F6-4708-AF47-9F88BBE2114C}.Release (DirectX)|Win32.Build.0 = Release (DirectX)|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.vcxproj kodi-15.2~git20151019.1039-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.vcxproj --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.vcxproj 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + visDirectxSpectrum + {0D91724A-E6F6-4708-AF47-9F88BBE2114C} + visDirectxSpectrum + Win32Proj + + + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + true + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)libs\$(TargetName)\$(Configuration)\ + $(SolutionDir)objs\$(TargetName)\$(Configuration)\ + $(SolutionDir)libs\$(TargetName)\$(Configuration)\ + $(SolutionDir)objs\$(TargetName)\$(Configuration)\ + $(DXSDK_DIR)Include;$(IncludePath) + $(DXSDK_DIR)Lib\x86;$(LibraryPath) + Spectrum_win32dx + .vis + Spectrum_win32dx + .vis + $(DXSDK_DIR)Include;$(IncludePath) + $(DXSDK_DIR)Lib\x86;$(LibraryPath) + true + + + + DIRECTX_SPEKTRUM_EXPORTS;_WIN32PC;_USRDLL;%(PreprocessorDefinitions) + NotUsing + + + d3dx9.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(OutDir)Spectrum_win32dx.pdb + true + + + $(OutDir)Spectrum_win32dx.lib + + + copy "$(TargetPath)" "$(SolutionDir)..\..\addons\visualization.dxspectrum\$(TargetFileName)" + + + + + + + DIRECTX_SPEKTRUM_EXPORTS;_WIN32PC;_USRDLL;%(PreprocessorDefinitions) + NotUsing + + + d3dx9.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(OutDir)Spectrum_win32dx.pdb + true + + + $(OutDir)Spectrum_win32dx.lib + + + copy "$(TargetPath)" "$(SolutionDir)..\..\addons\visualization.dxspectrum\$(TargetFileName)" + + + + + + + + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.vcxproj.filters kodi-15.2~git20151019.1039-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.vcxproj.filters --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/DirectXSpectrum/directx_spectrum.vcxproj.filters 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FG} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/Makefile.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,8 @@ +SRCS=VisGUIShader.cpp \ + VisMatrixGLES.cpp \ + VisShader.cpp + +LIB=eglhelpers.a + +include @abs_top_srcdir@/Makefile.include +-include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS))) \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisGUIShader.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisGUIShader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisGUIShader.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisGUIShader.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,74 @@ +/* +* Copyright (C) 2005-2013 Team XBMC +* http://xbmc.org +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, see +* . +* +*/ + +#include "VisGUIShader.h" + +CVisGUIShader::CVisGUIShader(const char *vert, const char *frag ) : CVisGLSLShaderProgram(vert, frag) +{ + // Initialise values + m_hTex0 = 0; + m_hTex1 = 0; + m_hProj = 0; + m_hModel = 0; + m_hPos = 0; + m_hCol = 0; + m_hCord0 = 0; + m_hCord1 = 0; + + m_proj = NULL; + m_model = NULL; +} + +void CVisGUIShader::OnCompiledAndLinked() +{ + // This is called after CompileAndLink() + + // Variables passed directly to the Fragment shader + m_hTex0 = glGetUniformLocation(ProgramHandle(), "m_samp0"); + m_hTex1 = glGetUniformLocation(ProgramHandle(), "m_samp1"); + // Variables passed directly to the Vertex shader + m_hProj = glGetUniformLocation(ProgramHandle(), "m_proj"); + m_hModel = glGetUniformLocation(ProgramHandle(), "m_model"); + m_hPos = glGetAttribLocation(ProgramHandle(), "m_attrpos"); + m_hCol = glGetAttribLocation(ProgramHandle(), "m_attrcol"); + m_hCord0 = glGetAttribLocation(ProgramHandle(), "m_attrcord0"); + m_hCord1 = glGetAttribLocation(ProgramHandle(), "m_attrcord1"); + + // It's okay to do this only one time. Textures units never change. + glUseProgram( ProgramHandle() ); + glUniform1i(m_hTex0, 0); + glUniform1i(m_hTex1, 1); + glUseProgram( 0 ); +} + +bool CVisGUIShader::OnEnabled() +{ + // This is called after glUseProgram() + glUniformMatrix4fv(m_hProj, 1, GL_FALSE, GetMatrix(MM_PROJECTION)); + glUniformMatrix4fv(m_hModel, 1, GL_FALSE, GetMatrix(MM_MODELVIEW)); + + return true; +} + +void CVisGUIShader::Free() +{ + // Do Cleanup here + CVisShaderProgram::Free(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisGUIShader.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisGUIShader.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisGUIShader.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisGUIShader.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,51 @@ +#pragma once +/* +* Copyright (C) 2005-2013 Team XBMC +* http://xbmc.org +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, see +* . +* +*/ + +#include "VisShader.h" +#include "VisMatrixGLES.h" + +class CVisGUIShader : public CVisGLSLShaderProgram, public CVisMatrixGLES +{ +public: + CVisGUIShader(const char *vert, const char *frag); + + void OnCompiledAndLinked(); + bool OnEnabled(); + void Free(); + + GLint GetPosLoc() { return m_hPos; } + GLint GetColLoc() { return m_hCol; } + GLint GetCord0Loc() { return m_hCord0; } + GLint GetCord1Loc() { return m_hCord1; } + +protected: + GLint m_hTex0; + GLint m_hTex1; + GLint m_hProj; + GLint m_hModel; + GLint m_hPos; + GLint m_hCol; + GLint m_hCord0; + GLint m_hCord1; + + GLfloat *m_proj; + GLfloat *m_model; +}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisMatrixGLES.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisMatrixGLES.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisMatrixGLES.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisMatrixGLES.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,369 @@ +/* +* Copyright (C) 2005-2013 Team XBMC +* http://xbmc.org +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, see +* . +* +*/ + +#include "VisMatrixGLES.h" +#include + +#define MODE_WITHIN_RANGE(m) ((m >= 0) && (m < (int)MM_MATRIXSIZE)) + +CVisMatrixGLES::CVisMatrixGLES() +{ + for (unsigned int i=0; i < MM_MATRIXSIZE; i++) + { + m_matrices[i].push_back(MatrixWrapper()); + MatrixMode((EMATRIXMODE)i); + LoadIdentity(); + } + m_matrixMode = (EMATRIXMODE)-1; + m_pMatrix = NULL; +} + +CVisMatrixGLES::~CVisMatrixGLES() +{ +} + +GLfloat* CVisMatrixGLES::GetMatrix(EMATRIXMODE mode) +{ + if (MODE_WITHIN_RANGE(mode)) + { + if (!m_matrices[mode].empty()) + { + return m_matrices[mode].back(); + } + } + return NULL; +} + +void CVisMatrixGLES::MatrixMode(EMATRIXMODE mode) +{ + if (MODE_WITHIN_RANGE(mode)) + { + m_matrixMode = mode; + m_pMatrix = m_matrices[mode].back(); + } + else + { + m_matrixMode = (EMATRIXMODE)-1; + m_pMatrix = NULL; + } +} + +void CVisMatrixGLES::PushMatrix() +{ + if (m_pMatrix && MODE_WITHIN_RANGE(m_matrixMode)) + { + m_matrices[m_matrixMode].push_back(MatrixWrapper(m_pMatrix)); + m_pMatrix = m_matrices[m_matrixMode].back(); + } +} + +void CVisMatrixGLES::PopMatrix() +{ + if (MODE_WITHIN_RANGE(m_matrixMode)) + { + if (m_matrices[m_matrixMode].size() > 1) + { + m_matrices[m_matrixMode].pop_back(); + } + m_pMatrix = m_matrices[m_matrixMode].back(); + } +} + +void CVisMatrixGLES::LoadIdentity() +{ + if (m_pMatrix) + { + m_pMatrix[0] = 1.0f; m_pMatrix[4] = 0.0f; m_pMatrix[8] = 0.0f; m_pMatrix[12] = 0.0f; + m_pMatrix[1] = 0.0f; m_pMatrix[5] = 1.0f; m_pMatrix[9] = 0.0f; m_pMatrix[13] = 0.0f; + m_pMatrix[2] = 0.0f; m_pMatrix[6] = 0.0f; m_pMatrix[10] = 1.0f; m_pMatrix[14] = 0.0f; + m_pMatrix[3] = 0.0f; m_pMatrix[7] = 0.0f; m_pMatrix[11] = 0.0f; m_pMatrix[15] = 1.0f; + } +} + +void CVisMatrixGLES::Ortho(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) +{ + GLfloat u = 2.0f / (r - l); + GLfloat v = 2.0f / (t - b); + GLfloat w = -2.0f / (f - n); + GLfloat x = - (r + l) / (r - l); + GLfloat y = - (t + b) / (t - b); + GLfloat z = - (f + n) / (f - n); + GLfloat matrix[16] = { u, 0.0f, 0.0f, 0.0f, + 0.0f, v, 0.0f, 0.0f, + 0.0f, 0.0f, w, 0.0f, + x, y, z, 1.0f}; + MultMatrixf(matrix); +} + +void CVisMatrixGLES::Ortho2D(GLfloat l, GLfloat r, GLfloat b, GLfloat t) +{ + GLfloat u = 2.0f / (r - l); + GLfloat v = 2.0f / (t - b); + GLfloat x = - (r + l) / (r - l); + GLfloat y = - (t + b) / (t - b); + GLfloat matrix[16] = { u, 0.0f, 0.0f, 0.0f, + 0.0f, v, 0.0f, 0.0f, + 0.0f, 0.0f,-1.0f, 0.0f, + x, y, 0.0f, 1.0f}; + MultMatrixf(matrix); +} + +void CVisMatrixGLES::Frustum(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) +{ + GLfloat u = (2.0f * n) / (r - l); + GLfloat v = (2.0f * n) / (t - b); + GLfloat w = (r + l) / (r - l); + GLfloat x = (t + b) / (t - b); + GLfloat y = - (f + n) / (f - n); + GLfloat z = - (2.0f * f * n) / (f - n); + GLfloat matrix[16] = { u, 0.0f, 0.0f, 0.0f, + 0.0f, v, 0.0f, 0.0f, + w, x, y,-1.0f, + 0.0f, 0.0f, z, 0.0f}; + MultMatrixf(matrix); +} + +void CVisMatrixGLES::Translatef(GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat matrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + x, y, z, 1.0f}; + MultMatrixf(matrix); +} + +void CVisMatrixGLES::Scalef(GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat matrix[16] = { x, 0.0f, 0.0f, 0.0f, + 0.0f, y, 0.0f, 0.0f, + 0.0f, 0.0f, z, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + MultMatrixf(matrix); +} + +void CVisMatrixGLES::Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat modulous = sqrt((x*x)+(y*y)+(z*z)); + if (modulous != 0.0) + { + x /= modulous; + y /= modulous; + z /= modulous; + } + GLfloat cosine = cos(angle); + GLfloat sine = sin(angle); + GLfloat cos1 = 1 - cosine; + GLfloat a = (x*x*cos1) + cosine; + GLfloat b = (x*y*cos1) - (z*sine); + GLfloat c = (x*z*cos1) + (y*sine); + GLfloat d = (y*x*cos1) + (z*sine); + GLfloat e = (y*y*cos1) + cosine; + GLfloat f = (y*z*cos1) - (x*sine); + GLfloat g = (z*x*cos1) - (y*sine); + GLfloat h = (z*y*cos1) + (x*sine); + GLfloat i = (z*z*cos1) + cosine; + GLfloat matrix[16] = { a, d, g, 0.0f, + b, e, h, 0.0f, + c, f, i, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + MultMatrixf(matrix); +} + +#if defined(__ARM_NEON__) + +inline void Matrix4Mul(const float* src_mat_1, const float* src_mat_2, float* dst_mat) +{ + asm volatile ( + // Store A & B leaving room at top of registers for result (q0-q3) + "vldmia %1, { q4-q7 } \n\t" + "vldmia %2, { q8-q11 } \n\t" + + // result = first column of B x first row of A + "vmul.f32 q0, q8, d8[0]\n\t" + "vmul.f32 q1, q8, d10[0]\n\t" + "vmul.f32 q2, q8, d12[0]\n\t" + "vmul.f32 q3, q8, d14[0]\n\t" + + // result += second column of B x second row of A + "vmla.f32 q0, q9, d8[1]\n\t" + "vmla.f32 q1, q9, d10[1]\n\t" + "vmla.f32 q2, q9, d12[1]\n\t" + "vmla.f32 q3, q9, d14[1]\n\t" + + // result += third column of B x third row of A + "vmla.f32 q0, q10, d9[0]\n\t" + "vmla.f32 q1, q10, d11[0]\n\t" + "vmla.f32 q2, q10, d13[0]\n\t" + "vmla.f32 q3, q10, d15[0]\n\t" + + // result += last column of B x last row of A + "vmla.f32 q0, q11, d9[1]\n\t" + "vmla.f32 q1, q11, d11[1]\n\t" + "vmla.f32 q2, q11, d13[1]\n\t" + "vmla.f32 q3, q11, d15[1]\n\t" + + // output = result registers + "vstmia %2, { q0-q3 }" + : //no output + : "r" (dst_mat), "r" (src_mat_2), "r" (src_mat_1) // input - note *value* of pointer doesn't change + : "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11" //clobber + ); +} +void CVisMatrixGLES::MultMatrixf(const GLfloat *matrix) +{ + if (m_pMatrix) + { + GLfloat m[16]; + Matrix4Mul(m_pMatrix, matrix, m); + } +} + +#else +void CVisMatrixGLES::MultMatrixf(const GLfloat *matrix) +{ + if (m_pMatrix) + { + GLfloat a = (matrix[0] * m_pMatrix[0]) + (matrix[1] * m_pMatrix[4]) + (matrix[2] * m_pMatrix[8]) + (matrix[3] * m_pMatrix[12]); + GLfloat b = (matrix[0] * m_pMatrix[1]) + (matrix[1] * m_pMatrix[5]) + (matrix[2] * m_pMatrix[9]) + (matrix[3] * m_pMatrix[13]); + GLfloat c = (matrix[0] * m_pMatrix[2]) + (matrix[1] * m_pMatrix[6]) + (matrix[2] * m_pMatrix[10]) + (matrix[3] * m_pMatrix[14]); + GLfloat d = (matrix[0] * m_pMatrix[3]) + (matrix[1] * m_pMatrix[7]) + (matrix[2] * m_pMatrix[11]) + (matrix[3] * m_pMatrix[15]); + GLfloat e = (matrix[4] * m_pMatrix[0]) + (matrix[5] * m_pMatrix[4]) + (matrix[6] * m_pMatrix[8]) + (matrix[7] * m_pMatrix[12]); + GLfloat f = (matrix[4] * m_pMatrix[1]) + (matrix[5] * m_pMatrix[5]) + (matrix[6] * m_pMatrix[9]) + (matrix[7] * m_pMatrix[13]); + GLfloat g = (matrix[4] * m_pMatrix[2]) + (matrix[5] * m_pMatrix[6]) + (matrix[6] * m_pMatrix[10]) + (matrix[7] * m_pMatrix[14]); + GLfloat h = (matrix[4] * m_pMatrix[3]) + (matrix[5] * m_pMatrix[7]) + (matrix[6] * m_pMatrix[11]) + (matrix[7] * m_pMatrix[15]); + GLfloat i = (matrix[8] * m_pMatrix[0]) + (matrix[9] * m_pMatrix[4]) + (matrix[10] * m_pMatrix[8]) + (matrix[11] * m_pMatrix[12]); + GLfloat j = (matrix[8] * m_pMatrix[1]) + (matrix[9] * m_pMatrix[5]) + (matrix[10] * m_pMatrix[9]) + (matrix[11] * m_pMatrix[13]); + GLfloat k = (matrix[8] * m_pMatrix[2]) + (matrix[9] * m_pMatrix[6]) + (matrix[10] * m_pMatrix[10]) + (matrix[11] * m_pMatrix[14]); + GLfloat l = (matrix[8] * m_pMatrix[3]) + (matrix[9] * m_pMatrix[7]) + (matrix[10] * m_pMatrix[11]) + (matrix[11] * m_pMatrix[15]); + GLfloat m = (matrix[12] * m_pMatrix[0]) + (matrix[13] * m_pMatrix[4]) + (matrix[14] * m_pMatrix[8]) + (matrix[15] * m_pMatrix[12]); + GLfloat n = (matrix[12] * m_pMatrix[1]) + (matrix[13] * m_pMatrix[5]) + (matrix[14] * m_pMatrix[9]) + (matrix[15] * m_pMatrix[13]); + GLfloat o = (matrix[12] * m_pMatrix[2]) + (matrix[13] * m_pMatrix[6]) + (matrix[14] * m_pMatrix[10]) + (matrix[15] * m_pMatrix[14]); + GLfloat p = (matrix[12] * m_pMatrix[3]) + (matrix[13] * m_pMatrix[7]) + (matrix[14] * m_pMatrix[11]) + (matrix[15] * m_pMatrix[15]); + m_pMatrix[0] = a; m_pMatrix[4] = e; m_pMatrix[8] = i; m_pMatrix[12] = m; + m_pMatrix[1] = b; m_pMatrix[5] = f; m_pMatrix[9] = j; m_pMatrix[13] = n; + m_pMatrix[2] = c; m_pMatrix[6] = g; m_pMatrix[10] = k; m_pMatrix[14] = o; + m_pMatrix[3] = d; m_pMatrix[7] = h; m_pMatrix[11] = l; m_pMatrix[15] = p; + } +} +#endif + +// gluLookAt implementation taken from Mesa3D +void CVisMatrixGLES::LookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx, GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat upz) +{ + GLfloat forward[3], side[3], up[3]; + GLfloat m[4][4]; + + forward[0] = centerx - eyex; + forward[1] = centery - eyey; + forward[2] = centerz - eyez; + + up[0] = upx; + up[1] = upy; + up[2] = upz; + + GLfloat tmp = sqrt(forward[0]*forward[0] + forward[1]*forward[1] + forward[2]*forward[2]); + if (tmp != 0.0) + { + forward[0] /= tmp; + forward[1] /= tmp; + forward[2] /= tmp; + } + + side[0] = forward[1]*up[2] - forward[2]*up[1]; + side[1] = forward[2]*up[0] - forward[0]*up[2]; + side[2] = forward[0]*up[1] - forward[1]*up[0]; + + tmp = sqrt(side[0]*side[0] + side[1]*side[1] + side[2]*side[2]); + if (tmp != 0.0) + { + side[0] /= tmp; + side[1] /= tmp; + side[2] /= tmp; + } + + up[0] = side[1]*forward[2] - side[2]*forward[1]; + up[1] = side[2]*forward[0] - side[0]*forward[2]; + up[2] = side[0]*forward[1] - side[1]*forward[0]; + + m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; + m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; + m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; + m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; + + m[0][0] = side[0]; + m[1][0] = side[1]; + m[2][0] = side[2]; + + m[0][1] = up[0]; + m[1][1] = up[1]; + m[2][1] = up[2]; + + m[0][2] = -forward[0]; + m[1][2] = -forward[1]; + m[2][2] = -forward[2]; + + MultMatrixf(&m[0][0]); + Translatef(-eyex, -eyey, -eyez); +} + +static void __gluMultMatrixVecf(const GLfloat matrix[16], const GLfloat in[4], GLfloat out[4]) +{ + int i; + + for (i=0; i<4; i++) + { + out[i] = in[0] * matrix[0*4+i] + + in[1] * matrix[1*4+i] + + in[2] * matrix[2*4+i] + + in[3] * matrix[3*4+i]; + } +} + +// gluProject implementation taken from Mesa3D +bool CVisMatrixGLES::Project(GLfloat objx, GLfloat objy, GLfloat objz, const GLfloat modelMatrix[16], const GLfloat projMatrix[16], const GLint viewport[4], GLfloat* winx, GLfloat* winy, GLfloat* winz) +{ + GLfloat in[4]; + GLfloat out[4]; + + in[0]=objx; + in[1]=objy; + in[2]=objz; + in[3]=1.0; + __gluMultMatrixVecf(modelMatrix, in, out); + __gluMultMatrixVecf(projMatrix, out, in); + if (in[3] == 0.0) + return false; + in[0] /= in[3]; + in[1] /= in[3]; + in[2] /= in[3]; + /* Map x, y and z to range 0-1 */ + in[0] = in[0] * 0.5 + 0.5; + in[1] = in[1] * 0.5 + 0.5; + in[2] = in[2] * 0.5 + 0.5; + + /* Map x,y to viewport */ + in[0] = in[0] * viewport[2] + viewport[0]; + in[1] = in[1] * viewport[3] + viewport[1]; + + *winx=in[0]; + *winy=in[1]; + *winz=in[2]; + return true; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisMatrixGLES.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisMatrixGLES.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisMatrixGLES.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisMatrixGLES.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,80 @@ +#pragma once +/* +* Copyright (C) 2005-2013 Team XBMC +* http://xbmc.org +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, see +* . +* +*/ + +#if defined(TARGET_DARWIN) + #include + #include +#else + #include + #include +#endif + +#include +#include + +enum EMATRIXMODE +{ + MM_PROJECTION = 0, + MM_MODELVIEW, + MM_TEXTURE, + MM_MATRIXSIZE // Must be last! used for size of matrices +}; + +class CVisMatrixGLES +{ +public: + CVisMatrixGLES(); + ~CVisMatrixGLES(); + + GLfloat* GetMatrix(EMATRIXMODE mode); + + void MatrixMode(EMATRIXMODE mode); + void PushMatrix(); + void PopMatrix(); + void LoadIdentity(); + void Ortho(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + void Ortho2D(GLfloat l, GLfloat r, GLfloat b, GLfloat t); + void Frustum(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + void Translatef(GLfloat x, GLfloat y, GLfloat z); + void Scalef(GLfloat x, GLfloat y, GLfloat z); + void Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); + void MultMatrixf(const GLfloat *matrix); + void LookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx, GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat upz); + bool Project(GLfloat objx, GLfloat objy, GLfloat objz, const GLfloat modelMatrix[16], const GLfloat projMatrix[16], const GLint viewport[4], GLfloat* winx, GLfloat* winy, GLfloat* winz); + +protected: + + struct MatrixWrapper + { + MatrixWrapper(){}; + MatrixWrapper( const float values[16]) { memcpy(m_values,values,sizeof(m_values)); } + MatrixWrapper( const MatrixWrapper &rhs ) { memcpy(m_values, rhs.m_values, sizeof(m_values)); } + MatrixWrapper &operator=( const MatrixWrapper &rhs ) { memcpy(m_values, rhs.m_values, sizeof(m_values)); return *this;} + operator float*() { return m_values; } + operator const float*() const { return m_values; } + + float m_values[16]; + }; + + std::vector m_matrices[(int)MM_MATRIXSIZE]; + GLfloat *m_pMatrix; + EMATRIXMODE m_matrixMode; +}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisShader.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisShader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisShader.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisShader.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,221 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "VisShader.h" +#include + +#define LOG_SIZE 1024 +#define GLchar char + +////////////////////////////////////////////////////////////////////// +// CShader +////////////////////////////////////////////////////////////////////// +bool CVisShader::LoadSource(const char *buffer) +{ + m_source = buffer; + return true; +} + +////////////////////////////////////////////////////////////////////// +// CVisGLSLVertexShader +////////////////////////////////////////////////////////////////////// + +bool CVisGLSLVertexShader::Compile() +{ + GLint params[4]; + + Free(); + + m_vertexShader = glCreateShader(GL_VERTEX_SHADER); + const char *ptr = m_source.c_str(); + glShaderSource(m_vertexShader, 1, &ptr, 0); + glCompileShader(m_vertexShader); + glGetShaderiv(m_vertexShader, GL_COMPILE_STATUS, params); + if (params[0]!=GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_vertexShader, LOG_SIZE, NULL, log); + m_lastLog = log; + m_compiled = false; + } + else + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_vertexShader, LOG_SIZE, NULL, log); + m_lastLog = log; + m_compiled = true; + } + return m_compiled; +} + +void CVisGLSLVertexShader::Free() +{ + if (m_vertexShader) + glDeleteShader(m_vertexShader); + m_vertexShader = 0; +} + +////////////////////////////////////////////////////////////////////// +// CVisGLSLPixelShader +////////////////////////////////////////////////////////////////////// +bool CVisGLSLPixelShader::Compile() +{ + GLint params[4]; + + Free(); + + // Pixel shaders are not mandatory. + if (m_source.length()==0) + return true; + + m_pixelShader = glCreateShader(GL_FRAGMENT_SHADER); + const char *ptr = m_source.c_str(); + glShaderSource(m_pixelShader, 1, &ptr, 0); + glCompileShader(m_pixelShader); + glGetShaderiv(m_pixelShader, GL_COMPILE_STATUS, params); + if (params[0]!=GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_pixelShader, LOG_SIZE, NULL, log); + m_lastLog = log; + m_compiled = false; + } + else + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_pixelShader, LOG_SIZE, NULL, log); + m_lastLog = log; + m_compiled = true; + } + return m_compiled; +} + +void CVisGLSLPixelShader::Free() +{ + if (m_pixelShader) + glDeleteShader(m_pixelShader); + m_pixelShader = 0; +} + +////////////////////////////////////////////////////////////////////// +// CVisGLSLShaderProgram +////////////////////////////////////////////////////////////////////// +void CVisGLSLShaderProgram::Free() +{ + m_pVP->Free(); + m_pFP->Free(); + if (m_shaderProgram) + glDeleteProgram(m_shaderProgram); + m_shaderProgram = 0; + m_ok = false; + m_lastProgram = 0; +} + +bool CVisGLSLShaderProgram::CompileAndLink() +{ + GLint params[4]; + + // free resources + Free(); + + // compiled vertex shader + if (!m_pVP->Compile()) + return false; + + // compile pixel shader + if (!m_pFP->Compile()) + { + m_pVP->Free(); + return false; + } + + // create program object + if (!(m_shaderProgram = glCreateProgram())) + goto error; + + // attach the vertex shader + glAttachShader(m_shaderProgram, m_pVP->Handle()); + + // if we have a pixel shader, attach it. If not, fixed pipeline + // will be used. + if (m_pFP->Handle()) + glAttachShader(m_shaderProgram, m_pFP->Handle()); + + // link the program + glLinkProgram(m_shaderProgram); + glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, params); + if (params[0]!=GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, NULL, log); + goto error; + } + + m_validated = false; + m_ok = true; + OnCompiledAndLinked(); + return true; + + error: + m_ok = false; + Free(); + return false; +} + +bool CVisGLSLShaderProgram::Enable() +{ + if (OK()) + { + glUseProgram(m_shaderProgram); + if (OnEnabled()) + { + if (!m_validated) + { + // validate the program + GLint params[4]; + glValidateProgram(m_shaderProgram); + glGetProgramiv(m_shaderProgram, GL_VALIDATE_STATUS, params); + if (params[0]!=GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, NULL, log); + } + m_validated = true; + } + return true; + } + else + { + glUseProgram(0); + return false; + } + return true; + } + return false; +} + +void CVisGLSLShaderProgram::Disable() +{ + if (OK()) + { + glUseProgram(0); + OnDisabled(); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisShader.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisShader.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/EGLHelpers/VisShader.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/EGLHelpers/VisShader.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,198 @@ +#pragma once +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#if defined(TARGET_DARWIN) +#include +#include +#else +#include +#include +#endif + +#include +#include + +////////////////////////////////////////////////////////////////////// +// CVisShader - base class +////////////////////////////////////////////////////////////////////// +class CVisShader +{ +public: + CVisShader() { m_compiled = false; } + virtual ~CVisShader() {} + virtual bool Compile() = 0; + virtual void Free() = 0; + virtual GLuint Handle() = 0; + virtual void SetSource(const char *src) { m_source = src; } + virtual bool LoadSource(const char *buffer); + bool OK() { return m_compiled; } + +protected: + std::string m_source; + std::string m_lastLog; + std::vector m_attr; + bool m_compiled; + +}; + + +////////////////////////////////////////////////////////////////////// +// CVisVertexShader - vertex shader class +////////////////////////////////////////////////////////////////////// +class CVisVertexShader : public CVisShader +{ +public: + CVisVertexShader() { m_vertexShader = 0; } + virtual ~CVisVertexShader() { Free(); } + virtual void Free() {} + virtual GLuint Handle() { return m_vertexShader; } + +protected: + GLuint m_vertexShader; +}; + +class CVisGLSLVertexShader : public CVisVertexShader +{ +public: + virtual void Free(); + virtual bool Compile(); +}; + +////////////////////////////////////////////////////////////////////// +// CVisPixelShader - abstract pixel shader class +////////////////////////////////////////////////////////////////////// +class CVisPixelShader : public CVisShader +{ +public: + CVisPixelShader() { m_pixelShader = 0; } + virtual ~CVisPixelShader() { Free(); } + virtual void Free() {} + virtual GLuint Handle() { return m_pixelShader; } + +protected: + GLuint m_pixelShader; +}; + + +class CVisGLSLPixelShader : public CVisPixelShader +{ +public: + virtual void Free(); + virtual bool Compile(); +}; + +////////////////////////////////////////////////////////////////////// +// CShaderProgram - the complete shader consisting of both the vertex +// and pixel programs. (abstract) +////////////////////////////////////////////////////////////////////// +class CVisShaderProgram +{ +public: + CVisShaderProgram() + { + m_ok = false; + m_shaderProgram = 0; + m_pFP = NULL; + m_pVP = NULL; + } + + virtual ~CVisShaderProgram() + { + Free(); + delete m_pFP; + delete m_pVP; + } + + // enable the shader + virtual bool Enable() = 0; + + // disable the shader + virtual void Disable() = 0; + + // returns true if shader is compiled and linked + bool OK() { return m_ok; } + + // free resources + virtual void Free() {} + + // return the vertex shader object + CVisVertexShader* VertexShader() { return m_pVP; } + + // return the pixel shader object + CVisPixelShader* PixelShader() { return m_pFP; } + + // compile and link the shaders + virtual bool CompileAndLink() = 0; + + // override to to perform custom tasks on successfull compilation + // and linkage. E.g. obtaining handles to shader attributes. + virtual void OnCompiledAndLinked() {} + + // override to to perform custom tasks before shader is enabled + // and after it is disabled. Return false in OnDisabled() to + // disable shader. + // E.g. setting attributes, disabling texture unites, etc + virtual bool OnEnabled() { return true; } + virtual void OnDisabled() { } + + virtual GLuint ProgramHandle() { return m_shaderProgram; } + +protected: + CVisVertexShader* m_pVP; + CVisPixelShader* m_pFP; + GLuint m_shaderProgram; + bool m_ok; +}; + + +class CVisGLSLShaderProgram + : virtual public CVisShaderProgram +{ +public: + CVisGLSLShaderProgram() + { + m_pFP = new CVisGLSLPixelShader(); + m_pVP = new CVisGLSLVertexShader(); + } + CVisGLSLShaderProgram(const char *vert, const char *frag) + { + m_pFP = new CVisGLSLPixelShader(); + m_pFP->LoadSource(frag); + m_pVP = new CVisGLSLVertexShader(); + m_pVP->LoadSource(vert); + } + + // enable the shader + virtual bool Enable(); + + // disable the shader + virtual void Disable(); + + // free resources + virtual void Free(); + + // compile and link the shaders + virtual bool CompileAndLink(); + +protected: + GLint m_lastProgram; + bool m_validated; +}; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/analyst.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/analyst.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/analyst.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/analyst.c 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,193 @@ +#include "fische_internal.h" + +#include +#include + +#ifdef DEBUG +#include +#endif + +enum {_FISCHE__WAITING_, _FISCHE__MAYBEWAITING_, _FISCHE__BEAT_}; + +int +_fische__compare_int_fast16_t_ (void const* value1, void const* value2) +{ + return (* (int_fast16_t*) value1 - * (int_fast16_t*) value2); +} + +double +_fische__guess_frames_per_beat_ (uint_fast16_t* beat_gap_history) +{ + uint_fast16_t gap_history_sorted[30]; + + memcpy (gap_history_sorted, beat_gap_history, 30 * sizeof (uint_fast16_t)); + qsort (gap_history_sorted, 30, sizeof (uint_fast16_t), _fische__compare_int_fast16_t_); + + uint_fast16_t guess = gap_history_sorted[14]; + + double result = 0; + int count = 0; + + uint_fast8_t i; + for (i = 0; i < 30; ++ i) { + if (abs (gap_history_sorted[i] - guess) <= 2) { + result += gap_history_sorted[i]; + ++ count; + } + } + + return result / count; +} + +double +_fische__get_audio_level_ (double* data, uint_fast32_t data_size) +{ + double E = 0; + + uint_fast32_t i; + for (i = 0; i < data_size; ++ i) { + E += fabs (* (data + i)); + } + + if (E <= 0) E = 1e-9; + E /= data_size; + + return log10 (E) * 10; +} + +struct fische__analyst* +fische__analyst_new (struct fische* parent) { + + struct fische__analyst* retval = malloc (sizeof (struct fische__analyst)); + retval->priv = malloc (sizeof (struct _fische__analyst_)); + + struct _fische__analyst_* P = retval->priv; + + P->fische = parent; + P->bghist_head = 0; + P->intensity_moving_avg = 0; + P->intensity_std_dev = 0; + P->last_beat_frame = 0; + P->moving_avg_03 = 0; + P->moving_avg_30 = 0; + P->state = _FISCHE__WAITING_; + P->std_dev = 0; + + P->beat_gap_history = malloc (30 * sizeof (uint_fast16_t)); + memset (P->beat_gap_history, '\0', 30 * sizeof (uint_fast16_t)); + + retval->frames_per_beat = 0; + retval->relative_energy = 1; + + return retval; +} + +void +fische__analyst_free (struct fische__analyst* self) +{ + if (!self) + return; + + free (self->priv->beat_gap_history); + free (self->priv); + free (self); +} + +int_fast8_t +fische__analyst_analyse (struct fische__analyst* self, + double* data, + uint_fast16_t size) +{ + if (!size) + return -1; + + struct _fische__analyst_* P = self->priv; + + double dezibel = _fische__get_audio_level_ (data, size * 2); + + if (P->moving_avg_30 == 0) + P->moving_avg_30 = dezibel; + else + P->moving_avg_30 = P->moving_avg_30 * 0.9667 + dezibel * 0.0333; + + P->std_dev = P->std_dev * 0.9667 + fabs (dezibel - P->moving_avg_30) * 0.0333; + + uint_fast32_t frameno = P->fische->frame_counter; + if ( (frameno - P->last_beat_frame) > 90) { + self->frames_per_beat = 0; + memset (P->beat_gap_history, '\0', 30 * sizeof (uint_fast16_t)); + P->bghist_head = 0; + } + + self->relative_energy = P->moving_avg_03 / P->moving_avg_30; + + double relative_intensity = 0; + double new_frames_per_beat; + + switch (P->state) { + case _FISCHE__WAITING_: + // don't bother if intensity too low + if (dezibel < P->moving_avg_30 + P->std_dev) + break; + + // initialisation fallbacks + if (P->std_dev == 0) + relative_intensity = 1; // avoid div by 0 + else + relative_intensity = (dezibel - P->moving_avg_30) / P->std_dev; + + if (P->intensity_moving_avg == 0) + P->intensity_moving_avg = relative_intensity; // initial assignment + else + P->intensity_moving_avg = P->intensity_moving_avg * 0.95 + relative_intensity * 0.05; + + // update intensity standard deviation + P->intensity_std_dev = P->intensity_std_dev * 0.95 + fabs (P->intensity_moving_avg - relative_intensity) * 0.05; + + // we DO have a beat + P->state = _FISCHE__BEAT_; + + // update beat gap history + P->beat_gap_history[P->bghist_head++] = frameno - P->last_beat_frame; + if (P->bghist_head == 30) + P->bghist_head = 0; + + // remember this as the last beat + P->last_beat_frame = frameno; + + // reset the short-term moving average + P->moving_avg_03 = dezibel; + + // try a guess at the tempo + new_frames_per_beat = _fische__guess_frames_per_beat_ (P->beat_gap_history); + if ( (self->frames_per_beat) && (self->frames_per_beat / new_frames_per_beat < 1.2) && (new_frames_per_beat / self->frames_per_beat < 1.2)) + self->frames_per_beat = (self->frames_per_beat * 2 + new_frames_per_beat) / 3; + else + self->frames_per_beat = new_frames_per_beat; + + // return based on relative beat intensity + if (relative_intensity > P->intensity_moving_avg + 3 * P->intensity_std_dev) + return 4; + if (relative_intensity > P->intensity_moving_avg + 2 * P->intensity_std_dev) + return 3; + if (relative_intensity > P->intensity_moving_avg + 1 * P->intensity_std_dev) + return 2; + + return 1; + + case _FISCHE__BEAT_: + case _FISCHE__MAYBEWAITING_: + // update short term moving average + P->moving_avg_03 = P->moving_avg_03 * 0.6667 + dezibel * 0.3333; + + // needs to be low enough twice to exit BEAT state + if (P->moving_avg_03 < P->moving_avg_30 + P->std_dev) { + P->state = P->state == _FISCHE__MAYBEWAITING_ ? _FISCHE__WAITING_ : _FISCHE__MAYBEWAITING_; + return 0; + } + } + + // report level too low + if (dezibel < -45) return -1; + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/analyst.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/analyst.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/analyst.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/analyst.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,40 @@ +#ifndef ANALYST_H +#define ANALYST_H + +#include + +struct fische; +struct _fische__analyst_; +struct fische__analyst; + + + +struct fische__analyst* fische__analyst_new (struct fische* parent); +void fische__analyst_free (struct fische__analyst* self); + +int_fast8_t fische__analyst_analyse (struct fische__analyst* self, double* data, uint_fast16_t size); + + + +struct _fische__analyst_ { + uint_fast8_t state; + double moving_avg_30; + double moving_avg_03; + double std_dev; + double intensity_moving_avg; + double intensity_std_dev; + uint_fast32_t last_beat_frame; + uint_fast16_t* beat_gap_history; + uint_fast8_t bghist_head; + + struct fische* fische; +}; + +struct fische__analyst { + double relative_energy; + double frames_per_beat; + + struct _fische__analyst_* priv; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/audiobuffer.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/audiobuffer.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/audiobuffer.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/audiobuffer.c 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,181 @@ +#include "fische_internal.h" + +#include +#include +#include + +#ifdef DEBUG +#include +#endif + +struct fische__audiobuffer* +fische__audiobuffer_new (struct fische* parent) { + + struct fische__audiobuffer* retval = malloc (sizeof (struct fische__audiobuffer)); + retval->priv = malloc (sizeof (struct _fische__audiobuffer_)); + struct _fische__audiobuffer_* P = retval->priv; + + P->fische = parent; + P->buffer = 0; + P->buffer_size = 0; + P->format = parent->audio_format; + P->is_locked = 0; + P->puts = 0; + P->gets = 0; + P->last_get = 0; + + retval->front_sample_count = 0; + retval->front_samples = 0; + retval->back_sample_count = 0; + retval->back_samples = 0; + + return retval; +} + +void +fische__audiobuffer_free (struct fische__audiobuffer* self) +{ + if (!self) + return; + + fische__audiobuffer_lock( self ); + + free (self->priv->buffer); + free (self->priv); + free (self); +} + +void +fische__audiobuffer_insert (struct fische__audiobuffer* self, const void* data, uint_fast32_t size) +{ + struct _fische__audiobuffer_* P = self->priv; + + if (P->buffer_size > 44100) + return; + + uint_fast8_t width = 1; + + switch (P->format) { + case FISCHE_AUDIOFORMAT_DOUBLE: + width = 8; + break; + case FISCHE_AUDIOFORMAT_FLOAT: + case FISCHE_AUDIOFORMAT_S32: + case FISCHE_AUDIOFORMAT_U32: + width = 4; + break; + case FISCHE_AUDIOFORMAT_S16: + case FISCHE_AUDIOFORMAT_U16: + width = 2; + } + + uint_fast32_t old_bufsize = P->buffer_size; + P->buffer_size += size / width; + P->buffer = realloc (P->buffer, P->buffer_size * sizeof (double)); + + uint_fast32_t i; + for (i = 0; i < size / width; ++ i) { + double* dest = (P->buffer + old_bufsize + i); + + switch (P->format) { + case FISCHE_AUDIOFORMAT_FLOAT: + *dest = * ( (float*) data + i); + break; + case FISCHE_AUDIOFORMAT_DOUBLE: + *dest = * ( (double*) data + i); + break; + case FISCHE_AUDIOFORMAT_S32: + *dest = * ( (int32_t*) data + i); + *dest /= INT32_MAX; + break; + case FISCHE_AUDIOFORMAT_U32: + *dest = * ( (uint32_t*) data + i); + *dest -= INT32_MAX; + *dest /= INT32_MAX; + break; + case FISCHE_AUDIOFORMAT_S16: + *dest = * ( (int16_t*) data + i); + *dest /= INT16_MAX; + break; + case FISCHE_AUDIOFORMAT_U16: + *dest = * ( (uint16_t*) data + i); + *dest -= INT16_MAX; + *dest /= INT16_MAX; + break; + case FISCHE_AUDIOFORMAT_S8: + *dest = * ( (int8_t*) data + i); + *dest /= INT8_MAX; + break; + case FISCHE_AUDIOFORMAT_U8: + *dest = * ( (uint8_t*) data + i); + *dest /= INT8_MAX; + *dest /= INT8_MAX; + break; + } + } + + ++ P->puts; +} + +void +fische__audiobuffer_get (struct fische__audiobuffer* self) +{ + struct _fische__audiobuffer_* P = self->priv; + + if (P->buffer_size == 0) + return; + + double* new_start = P->buffer + P->last_get * 2; + P->buffer_size -= P->last_get * 2; + + // pop used data off front + memmove (P->buffer, new_start, P->buffer_size * sizeof (double)); + P->buffer = realloc (P->buffer, P->buffer_size * sizeof (double)); + + if (!P->puts) + return; + + // fallback for first get + if (P->gets == 0) { + P->gets = 3; + P->puts = 1; + } + + // get/put ratio + double d_ratio = ( (double) P->gets ) / P->puts; + uint_fast8_t ratio = ceil( d_ratio ); + + // how many samples to return + uint_fast32_t n_samples = P->buffer_size / 2 / ratio; + + // set return data size and remember + self->front_sample_count = n_samples; + self->back_sample_count = n_samples; + P->last_get = n_samples; + + // set export buffer + self->front_samples = P->buffer; + self->back_samples = P->buffer + P->buffer_size - n_samples * 2; + + // increment get counter + ++ P->gets; +} + +void +fische__audiobuffer_lock (struct fische__audiobuffer* self) +{ + #ifdef __GNUC__ + while ( !__sync_bool_compare_and_swap( &self->priv->is_locked, 0, 1 ) ) + usleep( 1 ); + #else + while( self->priv->is_locked ) + usleep( 1 ); + self->priv->is_locked = 1; + #endif +} + +void +fische__audiobuffer_unlock (struct fische__audiobuffer* self) +{ + self->priv->is_locked = 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/audiobuffer.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/audiobuffer.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/audiobuffer.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/audiobuffer.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,43 @@ +#ifndef AUDIOBUFFER_H +#define AUDIOBUFFER_H + +#include + +struct fische; +struct _fische__audiobuffer_; +struct fische__audiobuffer; + + + +struct fische__audiobuffer* fische__audiobuffer_new (struct fische* parent); +void fische__audiobuffer_free (struct fische__audiobuffer* self); + +void fische__audiobuffer_insert (struct fische__audiobuffer* self, const void* data, uint_fast32_t size); +void fische__audiobuffer_lock (struct fische__audiobuffer* self); +void fische__audiobuffer_unlock (struct fische__audiobuffer* self); +void fische__audiobuffer_get (struct fische__audiobuffer* self); + + + +struct _fische__audiobuffer_ { + double* buffer; + uint_fast32_t buffer_size; + uint_fast8_t format; + uint_fast8_t is_locked; + uint_fast32_t puts; + uint_fast32_t gets; + uint_fast32_t last_get; + + struct fische* fische; +}; + +struct fische__audiobuffer { + double* front_samples; + uint_fast16_t front_sample_count; + double* back_samples; + uint_fast16_t back_sample_count; + + struct _fische__audiobuffer_* priv; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/blurengine.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/blurengine.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/blurengine.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/blurengine.c 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,169 @@ +#include "fische_internal.h" + +#include +#include + +#ifdef DEBUG +#include +#endif + +void* +blur_worker (void* arg) +{ + struct _fische__blurworker_* params = arg; + + uint_fast16_t const width = params->width; + uint_fast16_t const width_x2 = 2 * width; + uint_fast16_t const y_start = params->y_start; + uint_fast16_t const y_end = params->y_end; + + uint32_t source_component[4]; + + uint_fast16_t const two_lines = 2 * width; + uint_fast16_t const one_line = width; + uint_fast16_t const two_columns = 2; + + uint_fast16_t x, y; + int_fast8_t vector_x, vector_y; + + while (!params->kill) { + + if (!params->work) { + usleep (1); + continue; + } + + uint32_t* source = params->source; + uint32_t* source_pixel; + + uint32_t* destination = params->destination; + uint32_t* destination_pixel = destination + y_start * width; + + int8_t* vectors = (int8_t*) params->vectors; + int8_t* vector_pointer = vectors + y_start * width_x2; + + // vertical loop + for (y = y_start; y < y_end; y ++) { + // horizontal loop + for (x = 0; x < width; x ++) { + + // read the motion vector (actually its opposite) + vector_x = * (vector_pointer + 0); + vector_y = * (vector_pointer + 1); + + // point to the pixel at [present + motion vector] + source_pixel = source + (y + vector_y) * width + x + vector_x; + + // read the pixels at [source + (2,1)] [source + (-2,1)] [source + (0,-2)] + // shift them right by 2 and remove the bits that overflow each byte + source_component[0] = (* (source_pixel + one_line - two_columns) >> 2) & 0x3f3f3f3f; + source_component[1] = (* (source_pixel + one_line + two_columns) >> 2) & 0x3f3f3f3f; + source_component[2] = (* (source_pixel - two_lines) >> 2) & 0x3f3f3f3f; + source_component[3] = (* (source_pixel) >> 2) & 0x3f3f3f3f; + + // add those four components and write to the destination + // increment destination pointer + * (destination_pixel ++) = source_component[0] + + source_component[1] + + source_component[2] + + source_component[3]; + + // increment vector source pointer + vector_pointer += 2; + } + } + + // mark work as done + params->work = 0; + } + + return 0; +} + +struct fische__blurengine* +fische__blurengine_new (struct fische* parent) { + + struct fische__blurengine* retval = malloc (sizeof (struct fische__blurengine)); + retval->priv = malloc (sizeof (struct _fische__blurengine_)); + struct _fische__blurengine_* P = retval->priv; + + P->fische = parent; + P->width = parent->width; + P->height = parent->height; + P->threads = parent->used_cpus; + P->sourcebuffer = FISCHE_PRIVATE(P)->screenbuffer->pixels; + P->destinationbuffer = malloc (P->width * P->height * sizeof (uint32_t)); + + uint_fast8_t i; + for (i = 0; i < P->threads; ++ i) { + P->worker[i].source = P->sourcebuffer; + P->worker[i].destination = P->destinationbuffer; + P->worker[i].vectors = 0; + P->worker[i].width = P->width; + P->worker[i].y_start = (i * P->height) / P->threads; + P->worker[i].y_end = ( (i + 1) * P->height) / P->threads; + P->worker[i].kill = 0; + P->worker[i].work = 0; + + pthread_create (&P->worker[i].thread_id, NULL, blur_worker, &P->worker[i]); + } + + return retval; +} + +void +fische__blurengine_free (struct fische__blurengine* self) +{ + if (!self) + return; + + struct _fische__blurengine_* P = self->priv; + + uint_fast8_t i; + for (i = 0; i < P->threads; ++ i) { + P->worker[i].kill = 1; + pthread_join (P->worker[i].thread_id, NULL); + } + + free (self->priv->destinationbuffer); + free (self->priv); + free (self); +} + +void +fische__blurengine_blur (struct fische__blurengine* self, uint16_t* vectors) +{ + struct _fische__blurengine_* P = self->priv; + uint_fast8_t i; + for (i = 0; i < P->threads; ++ i) { + P->worker[i].source = P->sourcebuffer; + P->worker[i].destination = P->destinationbuffer; + P->worker[i].vectors = vectors; + P->worker[i].work = 1; + } +} + +void +fische__blurengine_swapbuffers (struct fische__blurengine* self) +{ + struct _fische__blurengine_* P = self->priv; + + // wait for all workers to finish + uint_fast8_t work = 1; + while (work) { + + work = 0; + uint_fast8_t i; + for (i = 0; i < P->threads; ++ i) { + work += P->worker[i].work; + } + + if (work) + usleep (1); + } + + uint32_t* t = P->destinationbuffer; + P->destinationbuffer = P->sourcebuffer; + P->sourcebuffer = t; + FISCHE_PRIVATE(P)->screenbuffer->pixels = t; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/blurengine.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/blurengine.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/blurengine.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/blurengine.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,51 @@ +#ifndef BLURENGINE_H +#define BLURENGINE_H + +#include +#include + +struct fische; + +struct _fische__blurworker_; +struct _fische__blurengine_; +struct fische__blurengine; + + + +struct fische__blurengine* fische__blurengine_new (struct fische* parent); +void fische__blurengine_free (struct fische__blurengine* self); + +void fische__blurengine_blur (struct fische__blurengine* self, uint16_t* vectors); +void fische__blurengine_swapbuffers (struct fische__blurengine* self); + + + +struct _fische__blurworker_ { + pthread_t thread_id; + uint32_t* source; + uint32_t* destination; + uint_fast16_t width; + uint_fast16_t y_start; + uint_fast16_t y_end; + uint16_t* vectors; + uint_fast8_t work; + uint_fast8_t kill; +}; + +struct _fische__blurengine_ { + int_fast16_t width; + int_fast16_t height; + uint_fast8_t threads; + uint32_t* sourcebuffer; + uint32_t* destinationbuffer; + + struct _fische__blurworker_ worker[8]; + + struct fische* fische; +}; + +struct fische__blurengine { + struct _fische__blurengine_* priv; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/cpudetect.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/cpudetect.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/cpudetect.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/cpudetect.c 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,80 @@ +#include "fische_internal.h" + +#include + +#if defined(__x86_64__) + +void +_fische__host_get_cpuid_ (uint32_t t, uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) +{ + asm ("pushq %%rbx\n\t" + "movl %%esi, %%ebx\n\t" + "cpuid\n\t" + "movl %%ebx, %%esi\n\t" + "popq %%rbx" + : "=a" (*eax) + , "=S" (*ebx) + , "=c" (*ecx) + , "=d" (*edx) + : "a" (t) + , "c" (0) + , "S" (0) + , "d" (0)); +} + +#elif defined(__i386__) + +void +_fische__host_get_cpuid_ (uint32_t t, uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) +{ + asm ("pushl %%ebx\n\t" + "movl %%esi, %%ebx\n\t" + "cpuid\n\t" + "movl %%ebx, %%esi\n\t" + "popl %%ebx" + : "=a" (*eax) + , "=S" (*ebx) + , "=c" (*ecx) + , "=d" (*edx) + : "a" (t) + , "c" (0) + , "S" (0) + , "d" (0)); +} + +#endif + +uint_fast8_t +_fische__cpu_detect_() +{ + +#if defined(__i386__) || defined(__x86_64__) + int n = 1; + uint32_t eax, ebx, ecx, edx; + _fische__host_get_cpuid_ (0x0, &eax, &ebx, &ecx, &edx); + + char cpuid[13]; + memcpy (cpuid, &ebx, 4); + memcpy (cpuid + 4, &edx, 4); + memcpy (cpuid + 8, &ecx, 4); + cpuid[12] = '\0'; + + if (!strcmp (cpuid, "AuthenticAMD")) { + _fische__host_get_cpuid_ (0x80000000, &eax, &ebx, &ecx, &edx); + if (eax < 0x80000008) return 1; + _fische__host_get_cpuid_ (0x80000008, &eax, &ebx, &ecx, &edx); + n = (ecx & 0xff) + 1; + + } else { /* if it's not AMD, it's most likely Intel */ + _fische__host_get_cpuid_ (0x00000000, &eax, &ebx, &ecx, &edx); + if (eax < 4) return 1; + _fische__host_get_cpuid_ (0x4, &eax, &ebx, &ecx, &edx); + n = (eax >> 26) + 1; + } + + return n; + +#else /* don't have cpuid */ + return 1; +#endif +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fische.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fische.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fische.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fische.c 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,296 @@ +#include "fische_internal.h" + +#include +#include +#include + +#ifdef DEBUG +#include +#endif + +void* +create_vectors (void* arg) +{ + struct fische* F = arg; + struct _fische__internal_ * P = F->priv; + P->vectorfield = fische__vectorfield_new (F, + &P->init_progress, + &P->init_cancel); + return 0; +} + +void* +indicate_busy (void* arg) +{ + struct fische* F = arg; + struct _fische__internal_ * P = F->priv; + struct fische__screenbuffer* sbuf = P->screenbuffer; + + fische__point center; + center.x = sbuf->priv->width / 2; + center.y = sbuf->priv->height / 2; + double dim = (center.x > center.y) ? center.y / 2 : center.x / 2; + + double last = -1; + + while ( (P->init_progress < 1) && (!P->init_cancel)) { + + if ( (P->init_progress < 0) || (P->init_progress == last)) { + usleep (10000); + continue; + } + + last = P->init_progress; + double angle = P->init_progress * -2 * 3.1415 + 3.0415; + + fische__vector c1; + c1.x = sin (angle) * dim; + c1.y = cos (angle) * dim; + + fische__vector c2; + c2.x = sin (angle + 0.1) * dim; + c2.y = cos (angle + 0.1) * dim; + + fische__vector e1 = fische__vector_single (&c1); + fische__vector_mul (&e1, dim / 2); + fische__vector e2 = fische__vector_single (&c2); + fische__vector_mul (&e2, dim / 2); + + fische__vector c3 = c2; + fische__vector_sub (&c3, &e2); + fische__vector c4 = c1; + fische__vector_sub (&c4, &e1); + + fische__vector_mul (&c1, F->scale); + fische__vector_mul (&c2, F->scale); + fische__vector_mul (&c3, F->scale); + fische__vector_mul (&c4, F->scale); + + fische__vector_add (&c1, ¢er); + fische__vector_add (&c2, ¢er); + fische__vector_add (&c3, ¢er); + fische__vector_add (&c4, ¢er); + + fische__screenbuffer_lock (sbuf); + fische__screenbuffer_line (sbuf, c1.x, c1.y, c2.x, c2.y, 0xffffffff); + fische__screenbuffer_line (sbuf, c2.x, c2.y, c3.x, c3.y, 0xffffffff); + fische__screenbuffer_line (sbuf, c3.x, c3.y, c4.x, c4.y, 0xffffffff); + fische__screenbuffer_line (sbuf, c4.x, c4.y, c1.x, c1.y, 0xffffffff); + fische__screenbuffer_unlock (sbuf); + } + + return 0; +} + +struct fische * +fische_new() { + struct fische* retval = malloc (sizeof (struct fische)); + + retval->used_cpus = _fische__cpu_detect_(); + if (retval->used_cpus > 8) + retval->used_cpus = 8; + + retval->frame_counter = 0; + retval->audio_format = FISCHE_AUDIOFORMAT_FLOAT; + retval->pixel_format = FISCHE_PIXELFORMAT_0xAABBGGRR; + retval->width = 512; + retval->height = 256; + retval->read_vectors = 0; + retval->write_vectors = 0; + retval->on_beat = 0; + retval->nervous_mode = 0; + retval->blur_mode = FISCHE_BLUR_SLICK; + retval->line_style = FISCHE_LINESTYLE_ALPHA_SIMULATION; + retval->scale = 1; + retval->amplification = 0; + retval->priv = 0; + retval->error_text = "no error"; + + return retval; +} + +int +fische_start (struct fische* handle) +{ + // plausibility checks + if ( (handle->used_cpus > 8) || (handle->used_cpus < 1)) { + handle->error_text = "CPU count out of range (1 <= used_cpus <= 8)"; + return 1; + } + + if (handle->audio_format >= _FISCHE__AUDIOFORMAT_LAST_) { + handle->error_text = "audio format invalid"; + return 1; + } + + if (handle->line_style >= _FISCHE__LINESTYLE_LAST_) { + handle->error_text = "line style invalid"; + return 1; + } + + if (handle->frame_counter != 0) { + handle->error_text = "frame counter garbled"; + return 1; + } + + if ( (handle->amplification < -10) || (handle->amplification > 10)) { + handle->error_text = "amplification value out of range (-10 <= amplification <= 10)"; + return 1; + } + + if ( (handle->height < 16) || (handle->height > 2048)) { + handle->error_text = "height value out of range (16 <= height <= 2048)"; + return 1; + } + + if ( (handle->width < 16) || (handle->width > 2048)) { + handle->error_text = "width value out of range (16 <= width <= 2048)"; + return 1; + } + + if (handle->width % 4 != 0) { + handle->error_text = "width value invalid (must be a multiple of four)"; + return 1; + } + + if (handle->pixel_format >= _FISCHE__PIXELFORMAT_LAST_) { + handle->error_text = "pixel format invalid"; + return 1; + } + + if ( (handle->scale < 0.5) || (handle->scale > 2)) { + handle->error_text = "scale value out of range (0.5 <= scale <= 2.0)"; + return 1; + } + + if (handle->blur_mode >= _FISCHE__BLUR_LAST_) { + handle->error_text = "blur option invalid"; + return 1; + } + + // initialize private struct + handle->priv = malloc (sizeof (struct _fische__internal_)); + memset (handle->priv, '\0', sizeof (struct _fische__internal_)); + struct _fische__internal_* P = handle->priv; + + P->init_progress = -1; + + P->analyst = fische__analyst_new (handle); + P->screenbuffer = fische__screenbuffer_new (handle); + P->wavepainter = fische__wavepainter_new (handle); + P->blurengine = fische__blurengine_new (handle); + P->audiobuffer = fische__audiobuffer_new (handle); + + // start vector creation and busy indicator threads + pthread_t vector_thread; + pthread_create (&vector_thread, NULL, create_vectors, handle); + pthread_detach (vector_thread); + + pthread_t busy_thread; + pthread_create (&busy_thread, NULL, indicate_busy, handle); + pthread_detach (busy_thread); + + return 0; +} + +uint32_t* +fische_render (struct fische* handle) +{ + struct _fische__internal_* P = handle->priv; + + // only if init completed + if (P->init_progress >= 1) { + + // analyse sound data + fische__audiobuffer_lock (P->audiobuffer); + fische__audiobuffer_get (P->audiobuffer); + int_fast8_t analysis = fische__analyst_analyse (P->analyst, P->audiobuffer->back_samples, P->audiobuffer->back_sample_count); + + // act accordingly + if (handle->nervous_mode) { + if (analysis >= 2) + fische__wavepainter_change_shape (P->wavepainter); + if (analysis >= 1) + fische__vectorfield_change (P->vectorfield); + } else { + if (analysis >= 1) + fische__wavepainter_change_shape (P->wavepainter); + if (analysis >= 2) + fische__vectorfield_change (P->vectorfield); + } + + if (analysis >= 3) { + fische__wavepainter_beat (P->wavepainter, P->analyst->frames_per_beat); + } + if (analysis >= 4) { + if (handle->on_beat) + handle->on_beat (P->analyst->frames_per_beat); + } + + P->audio_valid = analysis >= 0 ? 1 : 0; + + fische__wavepainter_change_color (P->wavepainter, P->analyst->frames_per_beat, P->analyst->relative_energy); + + + // wait for blurring to be finished + // and swap buffers + fische__screenbuffer_lock (P->screenbuffer); + fische__blurengine_swapbuffers (P->blurengine); + fische__screenbuffer_unlock (P->screenbuffer); + + // draw waves + if (P->audio_valid) + fische__wavepainter_paint (P->wavepainter, P->audiobuffer->front_samples, P->audiobuffer->front_sample_count); + + // start blurring for the next frame + fische__blurengine_blur (P->blurengine, P->vectorfield->field); + + fische__audiobuffer_unlock (P->audiobuffer); + } + + handle->frame_counter ++; + + return P->screenbuffer->pixels; +} + +void +fische_free (struct fische* handle) +{ + if (!handle) + return; + + struct _fische__internal_* P = handle->priv; + + if (handle->priv) { + // tell init threads to quit + P->init_cancel = 1; + + // wait for init threads to quit + while (P->init_progress < 1) + usleep (10); + + fische__audiobuffer_free (P->audiobuffer); + fische__blurengine_free (P->blurengine); + fische__vectorfield_free (P->vectorfield); + fische__wavepainter_free (P->wavepainter); + fische__screenbuffer_free (P->screenbuffer); + fische__analyst_free (P->analyst); + + free (handle->priv); + } + + free (handle); +} + +void +fische_audiodata (struct fische* handle, const void* data, size_t data_size) +{ + struct _fische__internal_* P = handle->priv; + + if (NULL == P->audiobuffer) + return; + + fische__audiobuffer_lock (P->audiobuffer); + fische__audiobuffer_insert (P->audiobuffer, data, data_size); + fische__audiobuffer_unlock (P->audiobuffer); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fische.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fische.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fische.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fische.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,149 @@ +#ifndef FISCHE_H +#define FISCHE_H + +/* int types */ +#include +/* size_t */ +#include + +typedef struct fische { + + /* 16 <= width <= 2048 + * DEFAULT: 512 + * constant after fische_start() */ + uint16_t width; + + /* 16 <= height <= 2048 + * DEFAULT: 256 + * constant after fische_start() */ + uint16_t height; + + /* 1 <= used_cpus <= 8 + * DEFAULT: all available (autodetect) + * constant after fische_start() */ + uint8_t used_cpus; + + /* true (!=0) or false (0) + * DEFAULT: 0 */ + uint8_t nervous_mode; + + /* see below (audio format enum) + * DEFAULT: FISCHE_AUDIOFORMAT_FLOAT + * constant after fische_start() */ + uint8_t audio_format; + + /* see below (pixel format enum) + * DEFAULT: FISCHE_PIXELFORMAT_0xAABBGGRR + * constant after fische_start() */ + uint8_t pixel_format; + + /* see below (blur mode enum) + * DEFAULT: FISCHE_BLUR_SLICK + * constant after fische_start() */ + uint8_t blur_mode; + + /* see below (line style enum) + * DEFAULT: FISCHE_LINESTYLE_ALPHA_SIMULATION */ + uint8_t line_style; + + /* 0.5 <= scale <= 2.0 + * DEFAULT: 1.0 + * constant after fische_start() */ + double scale; + + /* -10 <= amplification <= 10 + * DEFAULT: 0 */ + double amplification; + + /* if non-NULL, + * fische calls this to read vector fields from an external source + * takes a void** for data placement + * returns the number of bytes read */ + size_t (*read_vectors) (void**); + + /* if non-NULL, + * fische calls this to write vector field data to an external sink + * takes a void* and the number of bytes to be written */ + void (*write_vectors) (const void*, size_t); + + /* if non-NULL, + * fische calls this on major beats that are not handled internally + * takes frames per beat */ + void (*on_beat) (double); + + /* read only */ + uint32_t frame_counter; + + /* read only */ + char* error_text; + + void* priv; + +} FISCHE; + + + +#ifdef __cplusplus +extern "C" { +#endif + + + + /* creates a new FISCHE object + * and initialzes it with default values */ + FISCHE* fische_new(); + + /* starts FISCHE */ + int fische_start (FISCHE* handle); + + /* makes the next frame available */ + uint32_t* fische_render (FISCHE* handle); + + /* destructs the FISCHE object */ + void fische_free (FISCHE* handle); + + /* inserts audio data */ + void fische_audiodata (FISCHE* handle, const void* data, size_t data_size); + + + +#ifdef __cplusplus +} +#endif + + + +/* audio sample formats */ +enum {FISCHE_AUDIOFORMAT_U8, + FISCHE_AUDIOFORMAT_S8, + FISCHE_AUDIOFORMAT_U16, + FISCHE_AUDIOFORMAT_S16, + FISCHE_AUDIOFORMAT_U32, + FISCHE_AUDIOFORMAT_S32, + FISCHE_AUDIOFORMAT_FLOAT, + FISCHE_AUDIOFORMAT_DOUBLE, + _FISCHE__AUDIOFORMAT_LAST_ + }; + +/* pixel formats */ +enum {FISCHE_PIXELFORMAT_0xRRGGBBAA, + FISCHE_PIXELFORMAT_0xAABBGGRR, + FISCHE_PIXELFORMAT_0xAARRGGBB, + FISCHE_PIXELFORMAT_0xBBGGRRAA, + _FISCHE__PIXELFORMAT_LAST_ + }; + +/* blur style */ +enum {FISCHE_BLUR_SLICK, + FISCHE_BLUR_FUZZY, + _FISCHE__BLUR_LAST_ + }; + +/* line style */ +enum {FISCHE_LINESTYLE_THIN, + FISCHE_LINESTYLE_THICK, + FISCHE_LINESTYLE_ALPHA_SIMULATION, + _FISCHE__LINESTYLE_LAST_ + }; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fische_internal.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fische_internal.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fische_internal.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fische_internal.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,34 @@ +#ifndef FISCHE_INTERNAL_H +#define FISCHE_INTERNAL_H + +#include "fische.h" +#include "wavepainter.h" +#include "screenbuffer.h" +#include "analyst.h" +#include "vector.h" +#include "vectorfield.h" +#include "blurengine.h" +#include "audiobuffer.h" + +#ifdef WIN32 +#define rand_r(_seed) (_seed == _seed ? rand() : rand()) +#endif + +#define FISCHE_PRIVATE(P) ((struct _fische__internal_*) P->fische->priv) + +uint_fast8_t _fische__cpu_detect_(); + + +struct _fische__internal_ { + struct fische__screenbuffer* screenbuffer; + struct fische__wavepainter* wavepainter; + struct fische__analyst* analyst; + struct fische__blurengine* blurengine; + struct fische__vectorfield* vectorfield; + struct fische__audiobuffer* audiobuffer; + double init_progress; + uint_fast8_t init_cancel; + uint_fast8_t audio_valid; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fishbmc_addon.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fishbmc_addon.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fishbmc_addon.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fishbmc_addon.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,378 @@ +/* fishBMC visualization plugin + * Copyright (C) 2012 Marcel Ebmer + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ + +#ifdef __GNUC__ +#define __cdecl +#endif + +#include "addons/include/xbmc_vis_types.h" +#include "addons/include/xbmc_vis_dll.h" + +#include "fische.h" + +#include +#include +#include +#include +#include +#include +#include +#include + + +// global variables +FISCHE* g_fische; +double g_aspect; +bool g_isrotating; +double g_angle; +double g_lastangle; +bool g_errorstate; +int g_framedivisor; +double g_angleincrement; +double g_texright; +double g_texleft; +bool g_filemode; +int g_size; +uint8_t* g_axis = 0; + + + + + +// render functions +// must be included AFTER global variables +#if defined(_WIN32) +#include "fishbmc_directx.hpp" +#else // _WIN32 +#include "fishbmc_opengl.hpp" +#endif // _WIN32 + + + + + +void on_beat (double frames_per_beat) +{ + if (!g_isrotating) { + g_isrotating = true; + if (frames_per_beat < 1) frames_per_beat = 12; + g_angleincrement = 180 / 4 / frames_per_beat; + } +} + +void write_vectors (const void* data, size_t bytes) +{ + char const * homedir = getenv ("HOME"); + if (!homedir) + return; + + std::string dirname = std::string (homedir) + "/.fishBMC-data"; + mkdir (dirname.c_str(), 0755); + + std::ostringstream filename; + filename << dirname << "/" << g_fische->height; + + // open the file + std::fstream vectorsfile (filename.str().c_str(), std::fstream::out | std::fstream::binary); + if (!vectorsfile.good()) + return; + + // write it + vectorsfile.write (reinterpret_cast (data), bytes); + vectorsfile.close(); +} + +size_t read_vectors (void** data) +{ + char const * homedir = getenv ("HOME"); + if (!homedir) + return 0; + + std::string dirname = std::string (homedir) + "/.fishBMC-data"; + mkdir (dirname.c_str(), 0755); + + std::ostringstream filename; + filename << dirname << "/" << g_fische->height; + + // open the file + std::fstream vectorsfile (filename.str().c_str(), std::fstream::in); + if (!vectorsfile.good()) + return 0; + + vectorsfile.seekg (0, std::ios::end); + size_t n = vectorsfile.tellg(); + vectorsfile.seekg (0, std::ios::beg); + + *data = malloc (n); + vectorsfile.read (reinterpret_cast (*data), n); + vectorsfile.close(); + + return n; +} + +void delete_vectors() +{ + char const * homedir = getenv ("HOME"); + if (!homedir) + return; + + std::string dirname = std::string (homedir) + "/.fishBMC-data"; + mkdir (dirname.c_str(), 0755); + + for (int i = 64; i <= 2048; i *= 2) { + std::ostringstream filename; + filename << dirname << "/" << i; + unlink (filename.str().c_str()); + } +} + +extern "C" ADDON_STATUS ADDON_Create (void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + VIS_PROPS* visProps = (VIS_PROPS*) props; + + init (visProps); + + g_fische = fische_new(); + g_fische->on_beat = &on_beat; + g_fische->pixel_format = FISCHE_PIXELFORMAT_0xAABBGGRR; + g_fische->line_style = FISCHE_LINESTYLE_THICK; + g_aspect = double (visProps->width) / double (visProps->height); + g_texleft = (2 - g_aspect) / 4; + g_texright = 1 - g_texleft; + g_framedivisor = 1; + g_filemode = false; + g_size = 128; + + return ADDON_STATUS_NEED_SETTINGS; +} + +extern "C" void Start (int, int, int, const char*) +{ + g_errorstate = false; + + g_fische->audio_format = FISCHE_AUDIOFORMAT_FLOAT; + + g_fische->height = g_size; + g_fische->width = 2 * g_size; + + if (g_filemode) { + g_fische->read_vectors = &read_vectors; + g_fische->write_vectors = &write_vectors; + } + + else { + delete_vectors(); + } + + if (fische_start (g_fische) != 0) { + std::cerr << "fische failed to start" << std::endl; + g_errorstate = true; + return; + } + + uint32_t* pixels = fische_render (g_fische); + + init_texture (g_fische->width, g_fische->height, pixels); + + g_isrotating = false; + g_angle = 0; + g_lastangle = 0; + g_angleincrement = 0; +} + +extern "C" void AudioData (const float* pAudioData, int iAudioDataLength, float*, int) +{ + fische_audiodata (g_fische, pAudioData, iAudioDataLength * 4); +} + +extern "C" void Render() +{ + static int frame = 0; + + // check if this frame is to be skipped + if (++ frame % g_framedivisor == 0) { + uint32_t* pixels = fische_render (g_fische); + replace_texture (g_fische->width, g_fische->height, pixels); + if (g_isrotating) + g_angle += g_angleincrement; + } + + // stop rotation if required + if (g_isrotating) { + if (g_angle - g_lastangle > 180) { + g_lastangle = g_lastangle ? 0 : 180; + g_angle = g_lastangle; + g_isrotating = false; + } + } + + // how many quads will there be? + int n_Y = 8; + int n_X = (g_aspect * 8 + 0.5); + + // one-time initialization of rotation axis array + if (!g_axis) { + g_axis = new uint8_t[n_X * n_Y]; + for (int i = 0; i < n_X * n_Y; ++ i) { + g_axis[i] = rand() % 2; + } + } + + start_render(); + + // loop over and draw all quads + int quad_count = 0; + double quad_width = 4.0 / n_X; + double quad_height = 4.0 / n_Y; + double tex_width = (g_texright - g_texleft); + + for (double X = 0; X < n_X; X += 1) { + for (double Y = 0; Y < n_Y; Y += 1) { + double center_x = -2 + (X + 0.5) * 4 / n_X; + double center_y = -2 + (Y + 0.5) * 4 / n_Y; + double tex_left = g_texleft + tex_width * X / n_X; + double tex_right = g_texleft + tex_width * (X + 1) / n_X; + double tex_top = Y / n_Y; + double tex_bottom = (Y + 1) / n_Y; + double angle = (g_angle - g_lastangle) * 4 - (X + Y * n_X) / (n_X * n_Y) * 360; + if (angle < 0) angle = 0; + if (angle > 360) angle = 360; + + textured_quad (center_x, + center_y, + angle, + g_axis[quad_count ++], + quad_width, + quad_height, + tex_left, + tex_right, + tex_top, + tex_bottom); + } + } + + finish_render(); +} + +extern "C" void GetInfo (VIS_INFO* pInfo) +{ + // std::cerr << "fishBMC::GetInfo" << std::endl; + pInfo->bWantsFreq = false; + pInfo->iSyncDelay = 0; +} + +extern "C" bool OnAction (long flags, const void *param) +{ + return false; +} + +extern "C" unsigned int GetPresets (char ***presets) +{ + return 0; +} + +extern "C" unsigned GetPreset() +{ + return 0; +} + +extern "C" bool IsLocked() +{ + return false; +} + +extern "C" unsigned int GetSubModules (char ***names) +{ + return 0; +} + +extern "C" void ADDON_Stop() +{ + fische_free (g_fische); + g_fische = 0; + delete_texture(); + delete [] g_axis; + g_axis = 0; +} + +extern "C" void ADDON_Destroy() +{ + return; +} + +extern "C" bool ADDON_HasSettings() +{ + return false; +} + +extern "C" ADDON_STATUS ADDON_GetStatus() +{ + if (g_errorstate) + return ADDON_STATUS_UNKNOWN; + + return ADDON_STATUS_OK; +} + +extern "C" unsigned int ADDON_GetSettings (ADDON_StructSetting ***sSet) +{ + return 0; +} + +extern "C" void ADDON_FreeSettings() +{ +} + +extern "C" ADDON_STATUS ADDON_SetSetting (const char *strSetting, const void* value) +{ + if (!strSetting || !value) + return ADDON_STATUS_UNKNOWN; + + if (!strncmp (strSetting, "nervous", 7)) { + bool nervous = * ( (bool*) value); + g_fische->nervous_mode = nervous ? 1 : 0; + } + + else if (!strncmp (strSetting, "filemode", 7)) { + bool filemode = * ( (bool*) value); + g_filemode = filemode; + } + + else if (!strncmp (strSetting, "detail", 6)) { + int detail = * ( (int*) value); + g_size = 128; + while (detail--) { + g_size *= 2; + } + } + + else if (!strncmp (strSetting, "divisor", 7)) { + int divisor = * ( (int*) value); + g_framedivisor = 8; + while (divisor--) { + g_framedivisor /= 2; + } + } + + return ADDON_STATUS_OK; +} + +extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fishbmc_directx.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fishbmc_directx.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fishbmc_directx.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fishbmc_directx.hpp 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,69 @@ +// TEMPLATE for DirectX implementation +// check out fishbmc_opengl.hpp +// contact marcel@26elf.at for questions +// thanks for porting! + +#include + +// declare a global texture +// declare other globals you may need + +void init (VIS_PROPS* vis_props) +{ + // take anything from the VIS_PROPS struct +} + +inline void init_texture (int width, int height, uint32_t* pixels) +{ + // initialize the global texture of size (width x height) with data from pixels +} + +inline void replace_texture (int width, int height, uint32_t* pixels) +{ + // replace the texture data with pixels +} + +inline void delete_texture() +{ + // free memory held by global texture +} + +void textured_quad (double center_x, + double center_y, + double angle, + double axis, + double width, + double height, + double tex_left, + double tex_right, + double tex_top, + double tex_bottom) +{ + // draw a textured quad, sized (width x height), centered at (center_x, center_y), + // rotated by angle (this is in degrees) around an axis defined as (axis, 1 - axis, 0), + // scaled by (1 - sin (angle / 360 * M_PI) / 3) + // texture coordinates are given for all corners +} + +inline void start_render() +{ + // save state + // enable blending + // disable depth testing + // paint both sides of polygons + + // setup coordinate system: + // screen top left: (-1, -1) + // screen bottom right: (1, 1) + // screen distance from eye: 3 + // screen depth clipping: 3 to 15 + + // bind global texture + // move 6 units into the screen + // rotate by global variable g_angle, around axis (0, 1, 0) +} + +inline void finish_render() +{ + // restore original state +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fishbmc_opengl.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fishbmc_opengl.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/fishbmc_opengl.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/fishbmc_opengl.hpp 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,135 @@ +#if defined(__APPLE__) +#include +#include +#else // __APPLE__ +#include +#include +#endif // __APPLE__ + + +// additional global variable +GLuint g_texture; + + +// OpenGL: ignores VIS_PROPS +void init (VIS_PROPS*) {} + +// OpenGL: texture initialization +inline void init_texture (int width, int height, uint32_t* pixels) +{ + // generate a texture for drawing into + glEnable (GL_TEXTURE_2D); + glGenTextures (1, &g_texture); + glBindTexture (GL_TEXTURE_2D, g_texture); + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); +} + +// OpenGL: replace texture +inline void replace_texture (int width, int height, uint32_t* pixels) +{ + glBindTexture (GL_TEXTURE_2D, g_texture); + glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); +} + +// OpenGL: delete texture +inline void delete_texture() +{ + glDeleteTextures (1, &g_texture); +} + +// OpenGL: paint a textured quad +void textured_quad (double center_x, + double center_y, + double angle, + double axis, + double width, + double height, + double tex_left, + double tex_right, + double tex_top, + double tex_bottom) +{ + glPushMatrix(); + + glTranslatef (center_x, center_y, 0); + glRotatef (angle, axis, 1 - axis, 0); + + double scale = 1 - sin (angle / 360 * M_PI) / 3; + glScalef (scale, scale, scale); + + glBegin (GL_QUADS); + + glTexCoord2d (tex_left, tex_top); + glVertex3d (- width / 2, - height / 2, 0); + + glTexCoord2d (tex_right, tex_top); + glVertex3d (width / 2, - height / 2, 0); + + glTexCoord2d (tex_right, tex_bottom); + glVertex3d (width / 2, height / 2, 0); + + glTexCoord2d (tex_left, tex_bottom); + glVertex3d (- width / 2, height / 2, 0); + + glEnd(); + + glPopMatrix(); +} + +// OpenGL: setup to start rendering +inline void start_render() +{ + // save state + glPushAttrib (GL_ENABLE_BIT | GL_TEXTURE_BIT); + + // enable blending + glEnable (GL_BLEND); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + // enable texturing + glEnable (GL_TEXTURE_2D); + + // disable depth testing + glDisable (GL_DEPTH_TEST); + + // paint both sides of polygons + glPolygonMode (GL_FRONT, GL_FILL); + + // OpenGL projection matrix setup + glMatrixMode (GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + + // coordinate system: + // screen top left: (-1, -1) + // screen bottom right: (1, 1) + // screen depth clipping: 3 to 15 + glFrustum (-1, 1, 1, -1, 3, 15); + + glMatrixMode (GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + // bind global texture + glBindTexture (GL_TEXTURE_2D, g_texture); + + // move 6 units into the screen + glTranslatef (0, 0, -6.0f); + + // rotate + glRotatef (g_angle, 0, 1, 0); +} + +// OpenGL: done rendering +inline void finish_render() +{ + // return OpenGL matrices to original state + glPopMatrix(); + glMatrixMode (GL_PROJECTION); + glPopMatrix(); + + // restore OpenGl original state + glPopAttrib(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/Makefile.in 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,30 @@ +ARCH=@ARCH@ +CXXFLAGS=-fPIC + +SLIB = @abs_top_srcdir@/addons/visualization.fishbmc/fishbmc.vis +OBJS = analyst.o \ + audiobuffer.o \ + blurengine.o \ + cpudetect.o \ + fische.o \ + fishbmc_addon.o \ + screenbuffer.o \ + vector.o \ + vectorfield.o \ + wavepainter.o + + ifeq ($(findstring osx,$(ARCH)), osx) + LDFLAGS += -framework OpenGL + else + LDFLAGS += -lGL + endif + + +$(SLIB): $(OBJS) +ifeq ($(findstring osx,$(ARCH)), osx) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -bundle -o $(SLIB) $(OBJS) +else + $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -o $(SLIB) $(OBJS) +endif + +include @abs_top_srcdir@/Makefile.include diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/screenbuffer.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/screenbuffer.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/screenbuffer.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/screenbuffer.c 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,169 @@ +#include "fische_internal.h" + +#include +#include +#include +#include + +struct fische__screenbuffer* +fische__screenbuffer_new (struct fische* parent) { + struct fische__screenbuffer* retval = malloc (sizeof (struct fische__screenbuffer)); + retval->priv = malloc (sizeof (struct _fische__screenbuffer_)); + struct _fische__screenbuffer_* P = retval->priv; + + P->fische = parent; + P->width = parent->width; + P->height = parent->height; + P->is_locked = 0; + + retval->pixels = malloc (P->width * P->height * sizeof (uint32_t)); + memset (retval->pixels, '\0', P->width * P->height * sizeof (uint32_t)); + + switch (parent->pixel_format) { + + case FISCHE_PIXELFORMAT_0xAABBGGRR: + P->alpha_shift = 24; + P->blue_shift = 16; + P->green_shift = 8; + P->red_shift = 0; + break; + + case FISCHE_PIXELFORMAT_0xAARRGGBB: + P->alpha_shift = 24; + P->blue_shift = 0; + P->green_shift = 8; + P->red_shift = 16; + break; + + case FISCHE_PIXELFORMAT_0xBBGGRRAA: + P->alpha_shift = 0; + P->blue_shift = 24; + P->green_shift = 16; + P->red_shift = 8; + break; + + case FISCHE_PIXELFORMAT_0xRRGGBBAA: + P->alpha_shift = 0; + P->blue_shift = 8; + P->green_shift = 16; + P->red_shift = 24; + break; + } + + return retval; +} + +void +fische__screenbuffer_free (struct fische__screenbuffer* self) +{ + if (!self) + return; + + fische__screenbuffer_lock( self ); + + free (self->priv); + free (self->pixels); + free (self); +} + +void +fische__screenbuffer_lock (struct fische__screenbuffer* self) +{ + #ifdef __GNUC__ + while ( !__sync_bool_compare_and_swap( &self->priv->is_locked, 0, 1 ) ) + usleep( 1 ); + #else + while( self->priv->is_locked ) + usleep( 1 ); + self->priv->is_locked = 1; + #endif +} + +void +fische__screenbuffer_unlock (struct fische__screenbuffer* self) +{ + self->priv->is_locked = 0; +} + +void +fische__screenbuffer_line (struct fische__screenbuffer* self, + int_fast16_t x1, + int_fast16_t y1, + int_fast16_t x2, + int_fast16_t y2, + uint32_t color) +{ + struct _fische__screenbuffer_* P = self->priv; + + double diff_x = (x1 > x2) ? (x1 - x2) : (x2 - x1); + double diff_y = (y1 > y2) ? (y1 - y2) : (y2 - y1); + double dir_x = (x2 < x1) ? -1 : 1; + double dir_y = (y2 < y1) ? -1 : 1; + + if (!diff_x && !diff_y) + return; + + uint32_t half_alpha_mask; + + if (P->fische->line_style == FISCHE_LINESTYLE_ALPHA_SIMULATION) + half_alpha_mask = (0x7f << P->red_shift) + + (0x7f << P->green_shift) + + (0x7f << P->blue_shift) + + (0x7f << P->alpha_shift); + else + half_alpha_mask = (0xff << P->red_shift) + + (0xff << P->green_shift) + + (0xff << P->blue_shift) + + (0x7f << P->alpha_shift); + + + if (diff_x > diff_y) { + + int_fast16_t x; + for (x = x1; x * dir_x <= x2 * dir_x; x += dir_x) { + + int_fast16_t y = (y1 + diff_y / diff_x * dir_y * abs (x - x1) + 0.5); + + if ( (x < 0) || (x >= P->width) || (y < 0) || (y >= P->height)) + continue; + + if (P->fische->line_style != FISCHE_LINESTYLE_THIN) { + y ++; + if (! (y < 0) && ! (y >= P->height)) + * (self->pixels + y * P->width + x) = color & half_alpha_mask; + + y -= 2; + if ( (y < 0) || (y >= P->height)) continue; + * (self->pixels + y * P->width + x) = color & half_alpha_mask; + + y ++; + } + + * (self->pixels + y * P->width + x) = color; + } + } else { + + int_fast16_t y; + for (y = y1; y * dir_y <= y2 * dir_y; y += dir_y) { + + int_fast16_t x = (x1 + diff_x / diff_y * dir_x * abs (y - y1) + 0.5); + + if ( (x < 0) || (x >= P->width) || (y < 0) || (y >= P->height)) + continue; + + if (P->fische->line_style != FISCHE_LINESTYLE_THIN) { + x ++; + if (! (x < 0) && ! (x >= P->width)) + * (self->pixels + y * P->width + x) = color & half_alpha_mask; + + x -= 2; + if ( (x < 0) || (x >= P->width)) continue; + * (self->pixels + y * P->width + x) = color & half_alpha_mask; + + x ++; + } + + * (self->pixels + y * P->width + x) = color; + } + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/screenbuffer.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/screenbuffer.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/screenbuffer.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/screenbuffer.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,45 @@ +#ifndef SCREENBUFFER_H +#define SCREENBUFFER_H + +#include + +struct fische; +struct _fische__screenbuffer; +struct fische__screenbuffer; + + + +struct fische__screenbuffer* fische__screenbuffer_new (struct fische* parent); +void fische__screenbuffer_free (struct fische__screenbuffer* self); + +void fische__screenbuffer_lock (struct fische__screenbuffer* self); +void fische__screenbuffer_unlock (struct fische__screenbuffer* self); + +void fische__screenbuffer_line (struct fische__screenbuffer* self, + int_fast16_t x1, + int_fast16_t y1, + int_fast16_t x2, + int_fast16_t y2, + uint32_t color); + + + +struct _fische__screenbuffer_ { + uint_fast8_t is_locked; + int_fast16_t width; + int_fast16_t height; + uint_fast8_t red_shift; + uint_fast8_t blue_shift; + uint_fast8_t green_shift; + uint_fast8_t alpha_shift; + + struct fische* fische; +}; + +struct fische__screenbuffer { + uint32_t* pixels; + + struct _fische__screenbuffer_* priv; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/vector.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/vector.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/vector.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/vector.c 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,137 @@ +#include "vector.h" + +inline double fische__vector_length (fische__vector* self) +{ + return sqrt (pow (self->x, 2) + pow (self->y, 2)); +} + +inline fische__vector fische__vector_normal (fische__vector* self) +{ + fische__vector r; + r.x = self->y; + r.y = - self->x; + return r; +} + +inline fische__vector fische__vector_single (fische__vector* self) +{ + double l = fische__vector_length (self); + fische__vector r; + r.x = self->x / l; + r.y = self->y / l; + return r; +} + +inline double fische__vector_angle (fische__vector* self) +{ + fische__vector su = fische__vector_single (self); + double a = acos (su.x); + if (self->y > 0) return a; + else return -a; +} + +// conversion to 2x int8 +inline uint16_t fische__vector_to_uint16 (fische__vector* self) +{ + if (self->x < -127) self->x = -127; + if (self->x > 127) self->x = 127; + if (self->y < -127) self->y = -127; + if (self->y > 127) self->y = 127; + + int8_t ix = (self->x < 0) ? self->x - 0.5 : self->x + 0.5; + int8_t iy = (self->y < 0) ? self->y - 0.5 : self->y + 0.5; + + uint16_t retval = (uint8_t) ix; + retval |= ( (uint8_t) iy) << 8; + return retval; +} + +inline fische__vector fische__vector_from_uint16 (uint16_t val) +{ + int8_t ix = val & 0xff; + int8_t iy = val >> 8; + fische__vector r; + r.x = ix; + r.y = iy; + return r; +} + +inline void fische__vector_add (fische__vector* self, fische__vector* other) +{ + self->x += other->x; + self->y += other->y; +} + +inline void fische__vector_sub (fische__vector* self, fische__vector* other) +{ + self->x -= other->x; + self->y -= other->y; +} + +inline void fische__vector_mul (fische__vector* self, double val) +{ + self->x *= val; + self->y *= val; +} + +inline void fische__vector_div (fische__vector* self, double val) +{ + self->x /= val; + self->y /= val; +} + +fische__vector fische__vector_intersect_border (fische__vector* self, + fische__vector* normal_vec, + uint_fast16_t width, + uint_fast16_t height, + int_fast8_t direction) +{ + width--; + height--; + + fische__vector nvec = *normal_vec; + if (direction == _FISCHE__VECTOR_RIGHT_) { + fische__vector_mul (&nvec, -1); + } + + double t1, t2, t3, t4; + + if (nvec.x == 0) { + t1 = 1e6; + t2 = 1e6; + } else { + t1 = - self->x / nvec.x; + t2 = (width - self->x) / nvec.x; + } + + if (nvec.y == 0) { + t3 = 1e6; + t4 = 1e6; + } else { + t3 = -self->y / nvec.y; + t4 = (height - self->y) / nvec.y; + } + + t1 = (t1 < 0) ? 1e6 : t1; + t2 = (t2 < 0) ? 1e6 : t2; + t3 = (t3 < 0) ? 1e6 : t3; + t4 = (t4 < 0) ? 1e6 : t4; + + double a = (t1 < t2) ? t1 : t2; + double b = (t3 < t4) ? t3 : t4; + + double min_t = (a < b) ? a : b; + + int_fast16_t ret_x = self->x + nvec.x * min_t; + while (ret_x < 0) ret_x ++; + while ( (unsigned) ret_x > width) ret_x --; + + int_fast16_t ret_y = self->y + nvec.y * min_t; + while (ret_y < 0) ret_y ++; + while ( (unsigned) ret_y > height) ret_y --; + + fische__vector r; + r.x = ret_x; + r.y = ret_y; + return r; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/vectorfield.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/vectorfield.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/vectorfield.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/vectorfield.c 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,414 @@ +#include "fische_internal.h" + +#include +#include +#include + +#ifdef DEBUG +#include +#endif + +#define N_FIELDS 20 + +struct field_param { + uint16_t* data; + uint_fast8_t number; + uint_fast16_t start_y; + uint_fast16_t end_y; + struct _fische__vectorfield_* vecfield; +}; + +unsigned int rand_seed; + +inline void +_fische__vectorfield_randomize_ (fische__vector* vec) +{ + vec->x += rand_r (&rand_seed) % 3; + vec->x -= 1; + vec->y += rand_r (&rand_seed) % 3; + vec->y -= 1; +} + + +inline void +_fische__vectorfield_validate_ (struct _fische__vectorfield_* P, + fische__vector* vec, + double x, + double y) +{ + while (x + vec->x < 2) + vec->x += 1; + while (x + vec->x > P->width - 3) + vec->x -= 1; + while (y + vec->y < 2) + vec->y += 1; + while (y + vec->y > P->height - 2) + vec->y -= 1; +} + +void* +_fische__fill_thread_ (void* arg) +{ + struct field_param* params = arg; + uint16_t* field = params->data; + int fieldno = params->number; + struct _fische__vectorfield_* P = params->vecfield; + + uint_fast16_t y; + for (y = params->start_y; y < params->end_y; y ++) { + + uint_fast16_t x; + for (x = 0; x < P->width; x++) { + + uint16_t* vector = field + x + y * P->width; + + // distance and direction relative to center + fische__vector rvec; + rvec.x = x; + rvec.x -= P->center_x; + rvec.y = y; + rvec.y -= P->center_y; + + fische__vector e = fische__vector_single (&rvec); + fische__vector n = fische__vector_normal (&e); + + double r = fische__vector_length (&rvec) / P->dimension; + + // distance and direction relative to left co-center + fische__vector rvec_left; + rvec_left.x = (double)x - P->center_x + P->width / 3 * P->fische->scale; + rvec_left.y = (double)y - P->center_y; + + fische__vector e_left = fische__vector_single (&rvec_left); + fische__vector n_left = fische__vector_normal (&e_left); + + double r_left = fische__vector_length (&rvec_left) / P->dimension; + + // distance and direction relative to right co-center + fische__vector rvec_right; + rvec_right.x = (double)x - P->center_x - P->width / 3 * P->fische->scale; + rvec_right.y = (double)y - P->center_y; + + fische__vector e_right = fische__vector_single (&rvec_right); + fische__vector n_right = fische__vector_normal (&e_right); + + double r_right = fische__vector_length (&rvec_right) / P->dimension; + + double speed = P->dimension / 45; + + // correction factors ensure consistent average speeds with all field types + // double const corr[] = {0.77, 0.92, 1.72, 2.06, 1.45, 1.45, 1.73, 1.18, 3.24, 2.76, 0.82, 1.21, 1.73, 3.55, 0.47, 0.66, 0.96, 0.97, 1.00, 1.00}; + double const corr[] = {0.83, 0.83, 1.56, 1.56, 1.08, 3.54, 1.56, 1.00, 4.47, 2.77, 0.74, 1.01, 1.56, 3.12, 0.67, 0.67, 0.83, 2.43, 1.21, 0.77}; + + fische__vector v; + switch (fieldno) { + + case 0: + // linear vectors showing away from a horizontal mirror axis + v.x = 0; + v.y = (y < P->center_y) ? speed * corr[fieldno] : -speed * corr[fieldno]; + break; + + case 1: + // linear vectors showing away from a vertical mirror axis + v.x = (x < P->center_x) ? speed * corr[fieldno] : -speed * corr[fieldno]; + v.y = 0; + break; + + case 2: + // radial vectors showing away from the center + v = e; + fische__vector_mul (&v, -r * speed * corr[fieldno]); + break; + + case 3: + // tangential vectors (right) + v = n; + fische__vector_mul (&v, r * speed * corr[fieldno]); + break; + + case 4: { + // tangential-radial vectors (left) + fische__vector _v1 = n; + fische__vector_mul (&_v1, -r * speed * corr[fieldno]); + v = e; + fische__vector_mul (&v, -r * speed * corr[fieldno]); + fische__vector_add (&v, &_v1); + break; + } + + case 5: { + // tree rings + double dv = cos (M_PI * 24 * r); + v = e; + fische__vector_mul (&v, speed * 0.33 * corr[fieldno] * dv); + break; + } + + case 6: { + // hyperbolic vectors + v.x = e.y; + v.y = e.x; + fische__vector_mul (&v, -r * speed * corr[fieldno]); + break; + } + + case 7: + // purely random + v.x = rand_r (&rand_seed) % (int_fast32_t) (2 * speed * corr[fieldno] + 1) - (speed * corr[fieldno]); + v.y = rand_r (&rand_seed) % (int_fast32_t) (2 * speed * corr[fieldno] + 1) - (speed * corr[fieldno]); + break; + + case 8: { + // sphere + double dv = cos (M_PI * r); + v = e; + fische__vector_mul (&v, -r * dv * speed * corr[fieldno]); + break; + } + + case 9: { + // sine distortion + double dv = sin (M_PI * 8 * r); + v = e; + fische__vector_mul (&v, -r * dv * speed * corr[fieldno]); + break; + } + + case 10: { + // black hole + fische__vector _v1 = n; + fische__vector_mul (&_v1, speed * corr[fieldno]); + v = e; + fische__vector_mul (&v, r * speed * corr[fieldno]); + fische__vector_add (&v, &_v1); + if (r * P->dimension < 10) { + v.x = 0; + v.y = 0; + } + break; + } + + case 11: { + // circular waves + double dim = pow (11 * M_PI, 2); + double _r = r * dim; + v = e; + fische__vector_mul (&v, -speed * corr[fieldno] * sqrt (1.04 - pow (cos (sqrt (_r)), 2) + 0.25 * pow (sin (sqrt (_r)), 2))); + break; + } + + case 12: + // spinning CD + v = n; + if (fabs (r - 0.25) < 0.15) + fische__vector_mul (&v, r * speed * corr[fieldno]); + else + fische__vector_mul (&v, -r * speed * corr[fieldno]); + break; + + case 13: { + // three spinning disks + double rt = 0.3; + if (r < rt * 1.2) { + v = n; + fische__vector_mul (&v, -r * speed * corr[fieldno]); + } else if (r_left < rt) { + v = n_left; + fische__vector_mul (&v, r_left * speed * corr[fieldno]); + } else if (r_right < rt) { + v = n_right; + fische__vector_mul (&v, r_right * speed * corr[fieldno]); + } else { + v.x = 0; + v.y = 0; + } + break; + } + + case 14: { + // 3-centered fields - radial + fische__vector _v1 = e_left; + fische__vector_mul (&_v1, (2 - r_left) * speed * corr[fieldno]); + fische__vector _v2 = e_right; + fische__vector_mul (&_v2, (2 - r_right) * speed * corr[fieldno]); + v = e; + fische__vector_mul (&v, (2 - r) * -speed * corr[fieldno]); + fische__vector_add (&v, &_v1); + fische__vector_add (&v, &_v2); + break; + } + + case 15: { + // 3-centered fields - tangential + fische__vector _v1 = n_left; + fische__vector_mul (&_v1, (2 - r_left) * -speed * corr[fieldno]); + fische__vector _v2 = n_right; + fische__vector_mul (&_v2, (2 - r_right) * -speed * corr[fieldno]); + v = n; + fische__vector_mul (&v, (2 - r) * speed * corr[fieldno]); + fische__vector_add (&v, &_v1); + fische__vector_add (&v, &_v2); + break; + } + + case 16: { + // lenses effect + double _r = r * 8 * M_PI; + fische__vector _v1 = e; + fische__vector_mul (&_v1, sin (_r) * -speed * corr[fieldno]); + v = n; + fische__vector_mul (&v, sin (8 * fische__vector_angle (&e)) * -speed * corr[fieldno]); + fische__vector_add (&v, &_v1); + break; + } + + case 17: { + // lenses effect + double _r = r * 24 * M_PI; + fische__vector _v1 = e; + fische__vector_mul (&_v1, sin (_r) * -speed * 0.33 * corr[fieldno]); + v = n; + fische__vector_mul (&v, sin (24 * fische__vector_angle (&e)) * -speed * 0.33 * corr[fieldno]); + fische__vector_add (&v, &_v1); + break; + } + + case 18: { + // fan 1 + v = e; + double angle = fische__vector_angle (&e); + fische__vector_mul (&v, -speed * corr[fieldno] * sin (8 * angle)); + break; + } + + case 19: { + // fan 1 + v = e; + double angle = fische__vector_angle (&e); + fische__vector_mul (&v, -speed * corr[fieldno] * (1.1 + sin (8 * angle))); + break; + } + + default: + // index too high. return nothing. + return 0; + } + + if (P->fische->blur_mode == FISCHE_BLUR_FUZZY) + _fische__vectorfield_randomize_ (&v); + + _fische__vectorfield_validate_ (P, &v, x, y); + *vector = fische__vector_to_uint16 (&v); + } + } + return 0; +} + +void +_fische__fill_field_ (struct _fische__vectorfield_* P, uint_fast8_t fieldno) +{ + uint16_t* field = P->fields + fieldno * P->fieldsize / 2; + + // threads maximum is 8 + pthread_t vec_threads[8]; + struct field_param params[8]; + + uint_fast8_t i; + for (i = 0; i < P->threads; ++ i) { + params[i].data = field; + params[i].number = fieldno; + params[i].start_y = (i * P->height) / P->threads; + params[i].end_y = ( (i + 1) * P->height) / P->threads; + params[i].vecfield = P; + + pthread_create (&vec_threads[i], NULL, _fische__fill_thread_, ¶ms[i]); + } + + for (i = 0; i < P->threads; ++ i) { + pthread_join (vec_threads[i], NULL); + } +} + +struct fische__vectorfield* +fische__vectorfield_new (struct fische* parent, + double* progress, + uint_fast8_t* cancel) { + + struct fische__vectorfield* retval = malloc (sizeof (struct fische__vectorfield)); + retval->priv = malloc (sizeof (struct _fische__vectorfield_)); + struct _fische__vectorfield_* P = retval->priv; + + rand_seed = time (NULL); + *progress = 0; + + P->fische = parent; + P->width = parent->width; + P->height = parent->height; + P->center_x = P->width / 2; + P->center_y = P->height / 2; + P->dimension = P->width < P->height ? P->width * P->fische->scale : P->height * P->fische->scale; + P->fieldsize = P->width * P->height * sizeof (int16_t); + P->threads = parent->used_cpus; + P->cancelled = 0; + + // if we have stored fields, load them + if (parent->read_vectors) { + size_t bytes = parent->read_vectors ( (void**) (&P->fields)); + if (bytes) { + *progress = 1; + P->n_fields = bytes / P->fieldsize; + retval->field = P->fields; + return retval; + } + } + + // if not, recalculate everything + P->fields = malloc (N_FIELDS * P->fieldsize); + P->n_fields = N_FIELDS; + + uint_fast8_t i; + for (i = 0; i < N_FIELDS; ++i) { + if (*cancel) { + P->cancelled = 1; + break; + } + _fische__fill_field_ (P, i); + *progress = (i + 1); + *progress /= N_FIELDS; + } + + *progress = 1; + + retval->field = P->fields; + + return retval; +} + +void +fische__vectorfield_free (struct fische__vectorfield* self) +{ + if (!self) + return; + + struct _fische__vectorfield_* P = self->priv; + + if (!P->cancelled && P->fische->write_vectors) { + P->fische->write_vectors (P->fields, P->n_fields * P->fieldsize); + } + + free (self->priv->fields); + free (self->priv); + free (self); +} + +void +fische__vectorfield_change (struct fische__vectorfield* self) +{ + struct _fische__vectorfield_* P = self->priv; + + uint16_t* n = self->field; + while (n == self->field) { + self->field = P->fields + rand() % P->n_fields * P->width * P->height; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/vectorfield.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/vectorfield.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/vectorfield.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/vectorfield.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,42 @@ +#ifndef VECTORFIELD_H +#define VECTORFIELD_H + +#include + +struct fische; +struct _fische__vectorfield_; +struct fische__vectorfield; + + + +struct fische__vectorfield* fische__vectorfield_new (struct fische* parent, double* progress, uint_fast8_t* cancel); +void fische__vectorfield_free (struct fische__vectorfield* self); + +void fische__vectorfield_change (struct fische__vectorfield* self); + + + +struct _fische__vectorfield_ { + uint16_t* fields; + uint_fast32_t fieldsize; + uint_fast16_t width; + uint_fast16_t height; + uint_fast16_t dimension; + uint_fast16_t center_x; + uint_fast16_t center_y; + uint_fast8_t threads; + uint_fast8_t n_fields; + uint_fast8_t cancelled; + + struct fische* fische; +}; + + + +struct fische__vectorfield { + uint16_t* field; + + struct _fische__vectorfield_* priv; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/vector.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/vector.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/vector.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/vector.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,34 @@ +#ifndef F_VECTOR_H +#define F_VECTOR_H + +#include +#include + +struct _fische__vector_ { + double x; + double y; +}; + +typedef struct _fische__vector_ fische__vector; +typedef struct _fische__vector_ fische__point; + +enum {_FISCHE__VECTOR_LEFT_, _FISCHE__VECTOR_RIGHT_}; + +double fische__vector_length (fische__vector* self); +fische__vector fische__vector_normal (fische__vector* self); +fische__vector fische__vector_single (fische__vector* self); +double fische__vector_angle (fische__vector* self); +uint16_t fische__vector_to_uint16 (fische__vector* self); +fische__vector fische__vector_from_uint16 (uint16_t val); +void fische__vector_add (fische__vector* self, fische__vector* other); +void fische__vector_sub (fische__vector* self, fische__vector* other); +void fische__vector_mul (fische__vector* self, double val); +void fische__vector_div (fische__vector* self, double val); + +fische__vector fische__vector_intersect_border (fische__vector* self, + fische__vector* normal_vec, + uint_fast16_t width, + uint_fast16_t height, + int_fast8_t direction); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/wavepainter.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/wavepainter.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/wavepainter.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/wavepainter.c 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,314 @@ +#include "fische_internal.h" + +#include +#include + +#ifdef DEBUG +#include +#endif + +struct fische__wavepainter* +fische__wavepainter_new (struct fische* parent) { + + struct fische__wavepainter* retval = malloc (sizeof (struct fische__wavepainter)); + retval->priv = malloc (sizeof (struct _fische__wavepainter_)); + struct _fische__wavepainter_* P = retval->priv; + + P->fische = parent; + + uint32_t full_alpha = 0xff << FISCHE_PRIVATE (P)->screenbuffer->priv->alpha_shift; + + P->width = parent->width; + P->height = parent->height; + P->angle = 0; + P->center_x = P->width / 2; + P->center_y = P->height / 2; + P->color_1 = (rand() % 0xffffffff) | full_alpha; + P->color_2 = (~P->color_1) | full_alpha; + P->direction = 1; + P->is_rotating = 0; + P->n_shapes = 2; + P->rotation_increment = 0; + P->shape = 0; + + return retval; +} + +void +fische__wavepainter_free (struct fische__wavepainter* self) +{ + if (!self) + return; + + free (self->priv); + free (self); +} + +void +fische__wavepainter_paint (struct fische__wavepainter* self, + double* data, + uint_fast16_t size) +{ + if (!size) + return; + + struct _fische__wavepainter_* P = self->priv; + + // rotation + if (P->is_rotating) { + P->angle += P->rotation_increment; + if ( (P->angle > 2 * M_PI) || (P->angle < -2 * M_PI)) { + P->angle = 0; + P->is_rotating = 0; + } + } + + // only init fische scale once + static double f_scale = 0; + if (f_scale == 0) + f_scale = P->fische->scale; + + // necessary parameters + double dim = (P->height < P->width) ? P->height : P->width; + dim *= f_scale; + double factor = pow (10, P->fische->amplification / 10); + double scale = 6 / dim / factor; + + // alpha saturation fix + struct fische__screenbuffer* sbuf = FISCHE_PRIVATE (P)->screenbuffer; + fische__screenbuffer_line (sbuf, 0, 0, P->width - 1, 0, 0); + fische__screenbuffer_line (sbuf, P->width - 1, 0, P->width - 1, P->height - 1, 0); + fische__screenbuffer_line (sbuf, P->width - 1, P->height - 1, 0, P->height - 1, 0); + fische__screenbuffer_line (sbuf, 0, P->height - 1, 0, 0, 0); + + switch (P->shape) { + + case 0: { + fische__point center; + center.x = P->center_x; + center.y = P->center_y; + + // base will be the middle of a line, + // normally horizontal (angle = 0), but could be rotating + fische__point base1; + base1.x = center.x + (dim / 6) * sin (P->angle); + base1.y = center.y + (dim / 6) * cos (P->angle); + + fische__point base2; + base2.x = P->width / 2 - (dim / 6) * sin (P->angle); + base2.y = P->height / 2 - (dim / 6) * cos (P->angle); + + // create vectors perpendicular to the line center->base + fische__vector _nvec1 = base1; + fische__vector_sub (&_nvec1, ¢er); + fische__vector nvec1 = fische__vector_normal (&_nvec1); + + fische__vector _nvec2 = base2; + fische__vector_sub (&_nvec2, ¢er); + fische__vector nvec2 = fische__vector_normal (&_nvec2); + + // find the points where the line would exit the screen + fische__point start1 = fische__vector_intersect_border (&base1, &nvec1, P->width, P->height, _FISCHE__VECTOR_LEFT_); + fische__point end1 = fische__vector_intersect_border (&base1, &nvec1, P->width, P->height, _FISCHE__VECTOR_RIGHT_); + + fische__point start2 = fische__vector_intersect_border (&base2, &nvec2, P->width, P->height, _FISCHE__VECTOR_LEFT_); + fische__point end2 = fische__vector_intersect_border (&base2, &nvec2, P->width, P->height, _FISCHE__VECTOR_RIGHT_); + + // determine the direction and length (i.e. vector) + // of the increment between two sound samples + fische__vector v1 = end1; + fische__vector_sub (&v1, &start1); + fische__vector_div (&v1, size); + + fische__vector v2 = end2; + fische__vector_sub (&v2, &start2); + fische__vector_div (&v2, size); + + // determine the normal vectors + // for calculating the sound sample offset (amplitude) + fische__vector _n1 = fische__vector_normal (&v1); + fische__vector n1 = fische__vector_single (&_n1); + fische__vector _n2 = fische__vector_normal (&v2); + fische__vector n2 = fische__vector_single (&_n2); + + // draw both lines + fische__point base_p1 = start1; + fische__point base_p2 = start2; + + uint_fast16_t i; + for (i = 0; i < size - 1; i ++) { + fische__point pt11 = base_p1; + fische__vector offset11 = n1; + fische__vector_mul (&offset11, (* (data + 2 * i))); + fische__vector_div (&offset11, scale); + fische__vector_add (&pt11, &offset11); + + fische__point pt21 = base_p2; + fische__vector offset21 = n2; + fische__vector_mul (&offset21, (* (data + 1 + 2 * i))); + fische__vector_div (&offset21, scale); + fische__vector_add (&pt21, &offset21); + + fische__vector_add (&base_p1, &v1); + fische__vector_add (&base_p2, &v2); + + fische__point pt12 = base_p1; + fische__vector offset12 = n1; + fische__vector_mul (&offset12, (* (data + 2 * (i + 1)))); + fische__vector_div (&offset12, scale); + fische__vector_add (&pt12, &offset12); + + fische__point pt22 = base_p2; + fische__vector offset22 = n2; + fische__vector_mul (&offset22, (* (data + 1 + 2 * (i + 1)))); + fische__vector_div (&offset22, scale); + fische__vector_add (&pt22, &offset22); + + fische__screenbuffer_line (sbuf, pt11.x, pt11.y, pt12.x, pt12.y, P->color_1); + fische__screenbuffer_line (sbuf, pt21.x, pt21.y, pt22.x, pt22.y, P->color_2); + } + return; + } + + // circular shape + case 1: { + double f = cos (M_PI / 3 + 2 * P->angle) + 0.5; + double e = 1; + + uint_fast16_t i; + for (i = 0; i < size - 1; i ++) { + + double incr = i; + + // calculate angles for this and the next sound sample + double phi1 = M_PI * (0.25 + incr / size) + P->angle; + double phi2 = phi1 + M_PI / size; + + // calculate the corresponding radius + double r1 = dim / 4 + * (data + 2 * i) / scale; + double r2 = dim / 4 + * (data + 2 * (i + 1)) / scale; + + uint_fast16_t x1 = floor ( (P->center_x + f * r1 * sin (phi1)) + 0.5); + uint_fast16_t x2 = floor ( (P->center_x + f * r2 * sin (phi2)) + 0.5); + uint_fast16_t y1 = floor ( (P->center_y + e * r1 * cos (phi1)) + 0.5); + uint_fast16_t y2 = floor ( (P->center_y + e * r2 * cos (phi2)) + 0.5); + + fische__screenbuffer_line (sbuf, x1, y1, x2, y2, P->color_1); + + // the second line will be exactly on the + // opposite side of the circle + phi1 += M_PI; + phi2 += M_PI; + + r1 = dim / 4 + * (data + 1 + 2 * i) / scale; + r2 = dim / 4 + * (data + 1 + 2 * (i + 1)) / scale; + + x1 = floor ( (P->center_x + f * r1 * sin (phi1)) + 0.5); + x2 = floor ( (P->center_x + f * r2 * sin (phi2)) + 0.5); + y1 = floor ( (P->center_y + e * r1 * cos (phi1)) + 0.5); + y2 = floor ( (P->center_y + e * r2 * cos (phi2)) + 0.5); + + fische__screenbuffer_line (sbuf, x1, y1, x2, y2, P->color_2); + } + return; + } + } + +} + +void +fische__wavepainter_beat (struct fische__wavepainter* self, double frames_per_beat) +{ + struct _fische__wavepainter_* P = self->priv; + if (!P->is_rotating) { + if (frames_per_beat != 0) { + P->direction = 1 - 2 * (rand() % 2); + P->rotation_increment = M_PI / frames_per_beat / 2 * P->direction; + P->angle = 0; + P->is_rotating = 1; + } + } + +} + +void +fische__wavepainter_change_color (struct fische__wavepainter* self, + double frames_per_beat, + double energy) +{ + struct _fische__wavepainter_* P = self->priv; + + uint32_t full_alpha = 0xff << FISCHE_PRIVATE (P)->screenbuffer->priv->alpha_shift; + + if (!frames_per_beat && !energy) { + P->color_1 = (rand() % 0xffffffff) | full_alpha; + P->color_2 = (~P->color_1) | full_alpha; + } + + if (!frames_per_beat) + return; + + double hue = frames_per_beat / 2; + while (hue >= 6) + hue -= 6; + + double sv = (energy > 1) ? 1 : pow (energy, 4); + double x = sv * (1 - fabs ( (int_fast32_t) hue % 2 - 1)); + + double r, g, b; + + switch ( (int_fast32_t) hue) { + case 0: + r = sv; + g = x; + b = 0; + break; + case 1: + r = x; + g = sv; + b = 0; + break; + case 2: + r = 0; + g = sv; + b = x; + break; + case 3: + r = 0; + g = x; + b = sv; + break; + case 4: + r = x; + g = 0; + b = sv; + break; + default: + case 5: + r = sv; + g = 0; + b = x; + } + + uint32_t red = floor (r * 255 + 0.5); + uint32_t green = floor (b * 255 + 0.5); + uint32_t blue = floor (g * 255 + 0.5); + + P->color_1 = (blue << FISCHE_PRIVATE (P)->screenbuffer->priv->blue_shift) + + (green << FISCHE_PRIVATE (P)->screenbuffer->priv->green_shift) + + (red << FISCHE_PRIVATE (P)->screenbuffer->priv->red_shift) + + (0xff << FISCHE_PRIVATE (P)->screenbuffer->priv->alpha_shift); + + P->color_2 = (~P->color_1) | full_alpha; +} + +void +fische__wavepainter_change_shape (struct fische__wavepainter* self) +{ + struct _fische__wavepainter_* P = self->priv; + + if (P->is_rotating) return; + int_fast8_t n = P->shape; + while (n == P->shape) n = rand() % P->n_shapes; + P->shape = n; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/wavepainter.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/wavepainter.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/fishBMC/wavepainter.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/fishBMC/wavepainter.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,43 @@ +#ifndef WAVEPAINTER_H +#define WAVEPAINTER_H + +#include + +struct fische; +struct _fische__wavepainter_; +struct fische__wavepainter; + + + +struct fische__wavepainter* fische__wavepainter_new (struct fische* parent); +void fische__wavepainter_free (struct fische__wavepainter* self); + +void fische__wavepainter_paint (struct fische__wavepainter* self, double* data, uint_fast16_t size); +void fische__wavepainter_beat (struct fische__wavepainter* self, double bpm); +void fische__wavepainter_change_color (struct fische__wavepainter* self, double bpm, double energy); +void fische__wavepainter_change_shape (struct fische__wavepainter* self); + + + +struct _fische__wavepainter_ { + uint_fast16_t width; + uint_fast16_t height; + uint_fast16_t center_x; + uint_fast16_t center_y; + int_fast8_t direction; + uint_fast8_t shape; + uint_fast8_t n_shapes; + uint32_t color_1; + uint32_t color_2; + double angle; + uint_fast8_t is_rotating; + double rotation_increment; + + struct fische* fische; +}; + +struct fische__wavepainter { + struct _fische__wavepainter_* priv; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/build_xbmc_win32.sh kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/build_xbmc_win32.sh --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/build_xbmc_win32.sh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/build_xbmc_win32.sh 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,36 @@ + +GOOM_SRC=" +goom2k4-0/src/config_param.c \ +goom2k4-0/src/convolve_fx.c \ +goom2k4-0/src/cpu_info.c \ +goom2k4-0/src/drawmethods.c \ +goom2k4-0/src/filters.c \ +goom2k4-0/src/flying_stars_fx.c \ +goom2k4-0/src/gfontlib.c \ +goom2k4-0/src/gfontrle.c \ +goom2k4-0/src/goom_core.c \ +goom2k4-0/src/goom_tools.c \ +goom2k4-0/src/goomsl.c \ +goom2k4-0/src/goomsl_hash.c \ +goom2k4-0/src/goomsl_heap.c \ +goom2k4-0/src/goomsl_lex.c \ +goom2k4-0/src/goomsl_yacc.c \ +goom2k4-0/src/graphic.c \ +goom2k4-0/src/ifs.c \ +goom2k4-0/src/jitc_test.c \ +goom2k4-0/src/jitc_x86.c \ +goom2k4-0/src/lines.c \ +goom2k4-0/src/mathtools.c \ +goom2k4-0/src/mmx.c \ +goom2k4-0/src/plugin_info.c \ +goom2k4-0/src/sound_tester.c \ +goom2k4-0/src/surf3d.c \ +goom2k4-0/src/tentacle3d.c \ +goom2k4-0/src/v3d.c \ +goom2k4-0/src/xmmx.c \ +" + +gcc -c -O3 -g -D_WIN32PC -DHAVE_MMX -D_MINGW -Igoom2k4-0/src/ -I../../../lib/libSDL-WIN32/include/ -I../../../visualisations/ ${GOOM_SRC} Main.cpp + +gcc -g -s -shared -o ../../../visualisations/goom_win32.vis *.o -lopengl32 -lstdc++ +rm *.o diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/AUTHORS kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/AUTHORS --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/AUTHORS 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/AUTHORS 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,9 @@ +What a GOOM! +============ + +Copyright (c)2000-2004, Jean-Christophe Hoelt +Programmer and Software Designer at iOS software. + +iTunes port/PowerPC/Core-Hacking: Guillaume Borios +WINAMP/WMP port: Fred + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/autogen.sh kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/autogen.sh --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/autogen.sh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/autogen.sh 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh + +if libtoolize --version 2> /dev/null; then +aclocal -I m4 && libtoolize --copy --force && automake --foreign --add-missing && autoconf && ./configure $* +else +aclocal -I m4 && glibtoolize --copy --force && automake --foreign --add-missing && autoconf && ./configure $* +fi + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/ChangeLog kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/ChangeLog --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/ChangeLog 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/ChangeLog 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,85 @@ +ChangeLogs for GOOM +------------------- + +.10/03/2004: version 2k4-dev12 + - A Goom Scripting Language embedded in. It allows hi level of + configuration and easy hacking of the effect's behaviour. + - Zoom filter now works on relative screen coordinates. +.04/12/2003: version 2k4-dev2 + A long time since last entry here but some work has been done during + this year, Goom v2 is now on the track and working pretty well. + Added: + - Configurability. + - A particule system for rain, fireworks and fountains. + - Dynamic brightness changes to make gooms more impressive. + - Cleaning the code. +.30/12/2002: + Auto-CPU detection. New font.. now stored in the binary file. +.28/12/2002: + Optimisation of the asm loop in ExtendedMMX +.30/11/2002: + Added tentacle3d. +.15/11/2002: + Dirty Hack to make inline asm compile well : + remove the -fPIC flag (by modifying ltconfig) +.11/11/2002: + Partial rewriting of the sound evaluator. +.10/11/2002: + bug fixes (crash with some song title, ...) + display/hide of the fps. + show information messages. +.10/08/2002: + xmms-goom now uses SDL. +.**/07/2002: + display the title. +.07/06/2002: version 1.9 + Slow change between FX. +.20/04/2002: version 1.8.1 + Hypercos effect. + - added a param to goom_core to force the fx change + - fullscreen for xmms works well + - keyboard input for xmms + - xmms-ctrl (control xmms from goom) + - auto-change fx after a large number of cycle with the same one +.11/04/2002: version 1.8.0 + IFS point effect.. +.10/12/2001: + Adding some new stuff from iGoom (circle line) + removing the init-close bug. + adding the oportunity to double the size of the pixel. +.11/07/2001: + Hello mister proper.. The code is more portable now. +.16/06/2001: + Fixing a little bug with the initial config loading. + Using the 2 new FX of the zoom filter. + + +ChangeLogs for KOP2ZEDEMO: the zoom filter +------------------------------------------ + +.16/06/2001: + NEW FX -> vPlane & hPlane. (to do rotations) + NEW FX -> noisify ; to add noise to the transformation buffer. +.03/01/2001: + All buffers are now created by a malloc + reduction of the performances... but it is now more configurable... + .(MMX version is now 50 clocks per pixel) +.28/12/2000: + Optimizing a little the sinFilter +.27/12/2000: + Optimizing the buffer generator + .(previous : 767 clocks/pixel => now : 234 clk/pxl) + Adding two effect: AMULETTE and SCRUNCH +.22/12/2000: + Good optimization : reducing mem access + .(MMX version is now 45 clocks per pixel) +.13/12/2000: + Unrolling loop +.12/12/2000: + Optimisation of the ASM code -> 64bits RAM access + .(MMX version is now 55 clocks per pixel) +.10/12/2000: + MMX version of the zoomer + .(MMX version is now 70 clocks per pixel) + +author: Jean-Christophe Hoelt diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/configure.ac kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/configure.ac --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/configure.ac 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/configure.ac 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,147 @@ +AC_INIT(README) + +AM_DISABLE_STATIC +AM_INIT_AUTOMAKE(SDL_Goom, 2k4) + +ACLOCAL="$ACLOCAL -I m4" + +AM_PROG_LIBTOOL +AC_PROG_CC +AC_PROG_LN_S +AM_PROG_LEX +AC_PROG_YACC + +AC_C_BIGENDIAN + +dnl Get the CFlags +CFLAGS="${CFLAGS}" +LDFLAGS="${LDFLAGS}" + +dnl *** check for xmms *** + +HAVE_XMMS="no" +AM_CONDITIONAL(HAVE_XMMS,test "x$HAVE_XMMS" = "xyes") + + +dnl *** SDL *** + +HAVE_SDL="no" +AM_CONDITIONAL(HAVE_SDL,test "x$HAVE_SDL" = "xyes") + + +dnl *** MMX *** + +dnl rm -f mmx_zoom.s +HAVE_MMX="no" +HAVE_PPC="no" +MACTARGET="no" + +dnl HOST +case "$host" in +*-apple-darwin*) + MACTARGET="no" + MACFOLDER="" + AC_SUBST(MACFOLDER) + CCAS='$(CC)' + AC_SUBST(CCAS) + ;; +*-*-cygwin*) + CFLAGS="$CFLAGS -mno-cygwin -mwindows" + LDFLAGS="$LDFLAGS -lmingw32" + ;; +esac + +dnl ARCH +case "$host" in +i*86-*-*) + AC_DEFINE(HAVE_MMX) + AC_DEFINE(CPU_X86) + HAVE_MMX="yes" + ;; + +powerpc-*-*) + CCASFLAGS=-force_cpusubtype_ALL + AC_SUBST(CCASFLAGS) + AC_DEFINE(CPU_POWERPC) + HAVE_PPC="yes" + ;; + +esac +AM_CONDITIONAL(HAVE_MMX,test "x$HAVE_MMX" = "xyes") +AM_CONDITIONAL(HAVE_PPC,test "x$HAVE_PPC" = "xyes") +AM_CONDITIONAL(MACTARGET,test "x$MACTARGET" = "xyes") + + +AC_CHECK_HEADER(pthread.h,,AC_MSG_ERROR([*** POSIX thread support not installed - please install first ***])) + +PTHREAD_LIBS=error +AC_CHECK_LIB(pthread, pthread_attr_init, PTHREAD_LIBS="-lpthread") + +if test "x$PTHREAD_LIBS" = xerror; then + AC_CHECK_LIB(pthreads, pthread_attr_init, PTHREAD_LIBS="-lpthreads") +fi + +if test "x$PTHREAD_LIBS" = xerror; then + AC_CHECK_LIB(c_r, pthread_attr_init, PTHREAD_LIBS="-lc_r") +fi + +if test "x$PTHREAD_LIBS" = xerror; then + AC_CHECK_FUNC(pthread_attr_init, PTHREAD_LIBS="") +fi + +AC_SUBST(PTHREAD_LIBS) + +dnl rm -f mmx_zoom.s +dnl echo -n checking for nasm... +dnl if nasm -r 1> /dev/null 2> /dev/null +dnl then +dnl echo " `nasm -r` founded.."; +dnl else +dnl echo " not found." +dnl echo '*** NASM needed to build x86 assembly..***' +dnl AC_MSG_ERROR +dnl fi +dnl esac + +dnl AC_DEFINE(USE_ASM_MMX) +dnl ln -s mmx_zoom_x86.s mmx_zoom.s ;; +dnl *) +dnl ln -s mmx_zoom_dummy.s mmx_zoom.s ;; +dnl esac + +AC_SUBST(CFLAGS) +AC_SUBST(LDFLAGS) + +AC_OUTPUT(Makefile src/Makefile xmms-goom/Makefile sdl-goom/Makefile libgoom2.pc) + +dnl *** nice user info *** + +AC_MSG_NOTICE([goom2k4 was configured with the following options:]) +if test "x$HAVE_PPC" = "xyes"; then + AC_MSG_NOTICE([ ** PPC support enabled]) +else + AC_MSG_NOTICE([ PPC support disabled]) +fi +if test "x$HAVE_MMX" = "xyes"; then + AC_MSG_NOTICE([ ** MMX support enabled]) +else + AC_MSG_NOTICE([ MMX support disabled]) +fi +AC_MSG_NOTICE([ ** goom lib will be built]) +if test "x$HAVE_XMMS" = "xyes"; then + AC_MSG_NOTICE([ ** XMMS plugin will be built]) +else + AC_MSG_NOTICE([ XMMS plugin will not be built]) +fi +if test "x$MACTARGET" = "xyes"; then + AC_MSG_NOTICE([ ** goom mac application will be built]) + AC_MSG_NOTICE([ ** goom mac iTunes plugin will be built]) +else + AC_MSG_NOTICE([ goom mac application will not be built]) + AC_MSG_NOTICE([ goom mac iTunes plugin will not be built]) +fi +if test "x$HAVE_SDL" = "xyes"; then + AC_MSG_NOTICE([ ** goom sdl application will be built]) +else + AC_MSG_NOTICE([ goom sdl application will not be built]) +fi diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/COPYING kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/COPYING --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/COPYING 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,3 @@ +This program is under the LGPL. +You can find the terms of this licence somewhere on the internet. +(for exemple, search "LGPL" on your favorite search engine). Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/goom2k4.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/goom2k4.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,226 @@ +Notes on the Free Translation Project +************************************* + + Free software is going international! The Free Translation Project +is a way to get maintainers of free software, translators, and users all +together, so that will gradually become able to speak many languages. +A few packages already provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do *not* +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +One advise in advance +===================== + + If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias or message inheritance) as the +implementation here. It is also not possible to offer this additional +functionality on top of a `catgets' implementation. Future versions of +GNU `gettext' will very likely convey even more functionality. So it +might be a good idea to change to GNU `gettext' as soon as possible. + + So you need not provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +INSTALL Matters +=============== + + Some packages are "localizable" when properly installed; the +programs they contain can be made to speak your own native language. +Most such packages use GNU `gettext'. Other packages have their own +ways to internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system provides +usable `catgets' (if using this is selected by the installer) or +`gettext' functions. If neither is available, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is *not* required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --with-catgets + ./configure --disable-nls + +will respectively bypass any pre-existing `catgets' or `gettext' to use +the internationalizing routines provided within this package, enable +the use of the `catgets' functions (if found on the locale system), or +else, *totally* disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + By default the configuration process will not test for the `catgets' +function and therefore they will not be used. The reasons are already +given above: the emulation on top of `catgets' cannot provide all the +extensions provided by the GNU `gettext' library. If you nevertheless +want to use the `catgets' functions use + + ./configure --with-catgets + +to enable the test for `catgets' (this causes no harm if `catgets' is +not available on your system). If you really select this option we +would like to hear about the reasons because we cannot think of any +good one ourself. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + + As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +ISO 639 `LL' two-letter code prior to using the programs in the +package. For example, let's suppose that you speak German. At the +shell prompt, merely execute `setenv LANG de' (in `csh'), +`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash'). This +can be done from your `.login' or `.profile' file, once and for all. + + An operating system might already offer message localization for +many of its programs, while other programs have been installed locally +with the full capabilities of GNU `gettext'. Just using `gettext' +extended syntax for `LANG' would break proper localization of already +available operating system programs. In this case, users should set +both `LANGUAGE' and `LANG' variables in their environment, as programs +using GNU `gettext' give preference to `LANGUAGE'. For example, some +Swedish users would rather read translations in German than English for +when Swedish is not available. This is easily accomplished by setting +`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'. + +Translating Teams +================= + + For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list, courtesy of Linux +International. You may reach your translation team at the address +`LL@li.org', replacing LL by the two-letter ISO 639 code for your +language. Language codes are *not* the same as the country codes given +in ISO 3166. The following translation teams exist, as of December +1997: + + Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en', + Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian + `hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja', + Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish + `pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es', + Swedish `sv', and Turkish `tr'. + +For example, you may reach the Chinese translation team by writing to +`zh@li.org'. + + If you'd like to volunteer to *work* at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is *not* the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +*actively* in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +Available Packages +================== + + Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of December +1997. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination. + + Ready PO files cs da de en es fi fr it ja ko nl no pl pt ru sl sv + .----------------------------------------------------. + bash | [] [] [] | 3 + bison | [] [] [] | 3 + clisp | [] [] [] [] | 4 + cpio | [] [] [] [] [] [] | 6 + diffutils | [] [] [] [] [] | 5 + enscript | [] [] [] [] [] [] | 6 + fileutils | [] [] [] [] [] [] [] [] [] [] | 10 + findutils | [] [] [] [] [] [] [] [] [] | 9 + flex | [] [] [] [] | 4 + gcal | [] [] [] [] [] | 5 + gettext | [] [] [] [] [] [] [] [] [] [] [] | 12 + grep | [] [] [] [] [] [] [] [] [] [] | 10 + hello | [] [] [] [] [] [] [] [] [] [] [] | 11 + id-utils | [] [] [] | 3 + indent | [] [] [] [] [] | 5 + libc | [] [] [] [] [] [] [] | 7 + m4 | [] [] [] [] [] [] | 6 + make | [] [] [] [] [] [] | 6 + music | [] [] | 2 + ptx | [] [] [] [] [] [] [] [] | 8 + recode | [] [] [] [] [] [] [] [] [] | 9 + sh-utils | [] [] [] [] [] [] [] [] | 8 + sharutils | [] [] [] [] [] [] | 6 + tar | [] [] [] [] [] [] [] [] [] [] [] | 11 + texinfo | [] [] [] | 3 + textutils | [] [] [] [] [] [] [] [] [] | 9 + wdiff | [] [] [] [] [] [] [] [] | 8 + `----------------------------------------------------' + 17 languages cs da de en es fi fr it ja ko nl no pl pt ru sl sv + 27 packages 6 4 25 1 18 1 26 2 1 12 20 9 19 7 4 7 17 179 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If December 1997 seems to be old, you may fetch a more recent copy +of this `ABOUT-NLS' file on most GNU archive sites. + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,9 @@ +#undef ENABLE_NLS +#undef HAVE_CATGETS +#undef HAVE_GETTEXT +#undef HAVE_LC_MESSAGES +#undef HAVE_STPCPY +#undef HAVE_LIBSM +#undef PACKAGE_LOCALE_DIR +#undef PACKAGE_DATA_DIR +#undef PACKAGE_SOURCE_DIR diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4 kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4 --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,796 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4a + +dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 1 + +dnl Usage: +dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +AC_DEFUN(AM_INIT_AUTOMAKE, +[AC_REQUIRE([AC_PROG_INSTALL]) +dnl We require 2.13 because we rely on SHELL being computed by configure. +AC_PREREQ([2.13]) +PACKAGE=[$1] +AC_SUBST(PACKAGE) +VERSION=[$2] +AC_SUBST(VERSION) +dnl test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi +ifelse([$3],, +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) +AC_REQUIRE([AM_SANITY_CHECK]) +AC_REQUIRE([AC_ARG_PROGRAM]) +dnl FIXME This is truly gross. +missing_dir=`cd $ac_aux_dir && pwd` +AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) +AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) +AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) +AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) +AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) +AC_REQUIRE([AC_PROG_MAKE_SET])]) + +# +# Check to make sure that the build environment is sane. +# + +AC_DEFUN(AM_SANITY_CHECK, +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "[$]*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "[$]*" != "X $srcdir/configure conftestfile" \ + && test "[$]*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "[$]2" = conftestfile + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +rm -f conftest* +AC_MSG_RESULT(yes)]) + +dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) +dnl The program must properly implement --version. +AC_DEFUN(AM_MISSING_PROG, +[AC_MSG_CHECKING(for working $2) +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if ($2 --version) < /dev/null > /dev/null 2>&1; then + $1=$2 + AC_MSG_RESULT(found) +else + $1="$3/missing $2" + AC_MSG_RESULT(missing) +fi +AC_SUBST($1)]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + +AC_DEFUN(AM_CONFIG_HEADER, +[AC_PREREQ([2.12]) +AC_CONFIG_HEADER([$1]) +dnl When config.status generates a header, we must update the stamp-h file. +dnl This file resides in the same directory as the config header +dnl that is generated. We must strip everything past the first ":", +dnl and everything past the last "/". +AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl +ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, +<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, +<>; do + case " <<$>>CONFIG_HEADERS " in + *" <<$>>am_file "*<<)>> + echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx + ;; + esac + am_indx=`expr "<<$>>am_indx" + 1` +done<<>>dnl>>) +changequote([,]))]) + + +# serial 1 + +# @defmac AC_PROG_CC_STDC +# @maindex PROG_CC_STDC +# @ovindex CC +# If the C compiler in not in ANSI C mode by default, try to add an option +# to output variable @code{CC} to make it so. This macro tries various +# options that select ANSI C on some system or another. It considers the +# compiler to be in ANSI C mode if it handles function prototypes correctly. +# +# If you use this macro, you should check after calling it whether the C +# compiler has been set to accept ANSI C; if not, the shell variable +# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source +# code in ANSI C, you can make an un-ANSIfied copy of it by using the +# program @code{ansi2knr}, which comes with Ghostscript. +# @end defmac + +AC_DEFUN(AM_PROG_CC_STDC, +[AC_REQUIRE([AC_PROG_CC]) +AC_BEFORE([$0], [AC_C_INLINE]) +AC_BEFORE([$0], [AC_C_CONST]) +dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require +dnl a magic option to avoid problems with ANSI preprocessor commands +dnl like #elif. +dnl FIXME: can't do this because then AC_AIX won't work due to a +dnl circular dependency. +dnl AC_BEFORE([$0], [AC_PROG_CPP]) +AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C) +AC_CACHE_VAL(am_cv_prog_cc_stdc, +[am_cv_prog_cc_stdc=no +ac_save_CC="$CC" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + AC_TRY_COMPILE( +[#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +], [ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +], +[am_cv_prog_cc_stdc="$ac_arg"; break]) +done +CC="$ac_save_CC" +]) +if test -z "$am_cv_prog_cc_stdc"; then + AC_MSG_RESULT([none needed]) +else + AC_MSG_RESULT($am_cv_prog_cc_stdc) +fi +case "x$am_cv_prog_cc_stdc" in + x|xno) ;; + *) CC="$CC $am_cv_prog_cc_stdc" ;; +esac +]) + +# Configure paths for GTK+ +# Owen Taylor 97-11-3 + +dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS +dnl +AC_DEFUN(AM_PATH_GTK, +[dnl +dnl Get the cflags and libraries from the gtk-config script +dnl +AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)], + gtk_config_prefix="$withval", gtk_config_prefix="") +AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)], + gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="") +AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program], + , enable_gtktest=yes) + + for module in . $4 + do + case "$module" in + gthread) + gtk_config_args="$gtk_config_args gthread" + ;; + esac + done + + if test x$gtk_config_exec_prefix != x ; then + gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config + fi + fi + if test x$gtk_config_prefix != x ; then + gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_prefix/bin/gtk-config + fi + fi + + AC_PATH_PROG(GTK_CONFIG, gtk-config, no) + min_gtk_version=ifelse([$1], ,0.99.7,$1) + AC_MSG_CHECKING(for GTK - version >= $min_gtk_version) + no_gtk="" + if test "$GTK_CONFIG" = "no" ; then + no_gtk=yes + else + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_gtktest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$GTK_LIBS $LIBS" +dnl +dnl Now check if the installed GTK is sufficiently new. (Also sanity +dnl checks the results of gtk-config to some extent +dnl + rm -f conf.gtktest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gtktest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_gtk_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + + if ((gtk_major_version != $gtk_config_major_version) || + (gtk_minor_version != $gtk_config_minor_version) || + (gtk_micro_version != $gtk_config_micro_version)) + { + printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", + $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf ("*** was found! If gtk-config was correct, then it is best\n"); + printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); + printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } +#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) + else if ((gtk_major_version != GTK_MAJOR_VERSION) || + (gtk_minor_version != GTK_MINOR_VERSION) || + (gtk_micro_version != GTK_MICRO_VERSION)) + { + printf("*** GTK+ header files (version %d.%d.%d) do not match\n", + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + } +#endif /* defined (GTK_MAJOR_VERSION) ... */ + else + { + if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); + printf("*** correct copy of gtk-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gtk" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GTK_CONFIG" = "no" ; then + echo "*** The gtk-config script installed by GTK could not be found" + echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GTK_CONFIG environment variable to the" + echo "*** full path to gtk-config." + else + if test -f conf.gtktest ; then + : + else + echo "*** Could not run GTK test program, checking why..." + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GTK or finding the wrong" + echo "*** version of GTK. If it is not finding GTK, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GTK was incorrectly installed" + echo "*** or that you have moved GTK since it was installed. In the latter case, you" + echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GTK_CFLAGS="" + GTK_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GTK_CFLAGS) + AC_SUBST(GTK_LIBS) + rm -f conf.gtktest +]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. + +# serial 5 + +AC_DEFUN(AM_WITH_NLS, + [AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) + + USE_INCLUDED_LIBINTL=no + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + AC_DEFINE(ENABLE_NLS) + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If gettext or catgets are available (in this order) we + dnl use this. Else we have to fall back to GNU NLS library. + dnl catgets is only used if permitted by option --with-catgets. + nls_cv_header_intl= + nls_cv_header_libgt= + CATOBJEXT=NONE + + AC_CHECK_HEADER(libintl.h, + [AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc, + [AC_TRY_LINK([#include ], [return (int) gettext ("")], + gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)]) + + if test "$gt_cv_func_gettext_libc" != "yes"; then + AC_CHECK_LIB(intl, bindtextdomain, + [AC_CACHE_CHECK([for gettext in libintl], + gt_cv_func_gettext_libintl, + [AC_CHECK_LIB(intl, gettext, + gt_cv_func_gettext_libintl=yes, + gt_cv_func_gettext_libintl=no)], + gt_cv_func_gettext_libintl=no)]) + fi + + if test "$gt_cv_func_gettext_libc" = "yes" \ + || test "$gt_cv_func_gettext_libintl" = "yes"; then + AC_DEFINE(HAVE_GETTEXT) + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl + if test "$MSGFMT" != "no"; then + AC_CHECK_FUNCS(dcgettext) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr], + [CATOBJEXT=.gmo + DATADIRNAME=share], + [CATOBJEXT=.mo + DATADIRNAME=lib]) + INSTOBJEXT=.mo + fi + fi + ]) + + if test "$CATOBJEXT" = "NONE"; then + AC_MSG_CHECKING([whether catgets can be used]) + AC_ARG_WITH(catgets, + [ --with-catgets use catgets functions if available], + nls_cv_use_catgets=$withval, nls_cv_use_catgets=no) + AC_MSG_RESULT($nls_cv_use_catgets) + + if test "$nls_cv_use_catgets" = "yes"; then + dnl No gettext in C library. Try catgets next. + AC_CHECK_LIB(i, main) + AC_CHECK_FUNC(catgets, + [AC_DEFINE(HAVE_CATGETS) + INTLOBJS="\$(CATOBJS)" + AC_PATH_PROG(GENCAT, gencat, no)dnl + if test "$GENCAT" != "no"; then + AC_PATH_PROG(GMSGFMT, gmsgfmt, no) + if test "$GMSGFMT" = "no"; then + AM_PATH_PROG_WITH_TEST(GMSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no) + fi + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.cat + INSTOBJEXT=.cat + DATADIRNAME=lib + INTLDEPS='$(top_builddir)/intl/libintl.a' + INTLLIBS=$INTLDEPS + LIBS=`echo $LIBS | sed -e 's/-lintl//'` + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi]) + fi + fi + + if test "$CATOBJEXT" = "NONE"; then + dnl Neither gettext nor catgets in included in the C library. + dnl Fall back on GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + INTLOBJS="\$(GETTOBJS)" + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_SUBST(MSGFMT) + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.gmo + INSTOBJEXT=.mo + DATADIRNAME=share + INTLDEPS='$(top_builddir)/intl/libintl.a' + INTLLIBS=$INTLDEPS + LIBS=`echo $LIBS | sed -e 's/-lintl//'` + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + else + DATADIRNAME=share + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi + AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl) + AC_OUTPUT_COMMANDS( + [case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac]) + + + # If this is used in GNU gettext we have to set USE_NLS to `yes' + # because some of the sources are only built for this goal. + if test "$PACKAGE" = gettext; then + USE_NLS=yes + USE_INCLUDED_LIBINTL=yes + fi + + dnl These rules are solely for the distribution goal. While doing this + dnl we only have to keep exactly one list of the available catalogs + dnl in configure.in. + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + dnl Make all variables we use known to autoconf. + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATALOGS) + AC_SUBST(CATOBJEXT) + AC_SUBST(DATADIRNAME) + AC_SUBST(GMOFILES) + AC_SUBST(INSTOBJEXT) + AC_SUBST(INTLDEPS) + AC_SUBST(INTLLIBS) + AC_SUBST(INTLOBJS) + AC_SUBST(POFILES) + AC_SUBST(POSUB) + ]) + +AC_DEFUN(AM_GNU_GETTEXT, + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \ +unistd.h sys/param.h]) + AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \ +strdup __argz_count __argz_stringify __argz_next]) + + if test "${ac_cv_func_stpcpy+set}" != "set"; then + AC_CHECK_FUNCS(stpcpy) + fi + if test "${ac_cv_func_stpcpy}" = "yes"; then + AC_DEFINE(HAVE_STPCPY) + fi + + AM_LC_MESSAGES + AM_WITH_NLS + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + dnl The reference to in the installed file + dnl must be resolved because we cannot expect the users of this + dnl to define HAVE_LOCALE_H. + if test $ac_cv_header_locale_h = yes; then + INCLUDE_LOCALE_H="#include " + else + INCLUDE_LOCALE_H="\ +/* The system does not provide the header . Take care yourself. */" + fi + AC_SUBST(INCLUDE_LOCALE_H) + + dnl Determine which catalog format we have (if any is needed) + dnl For now we know about two different formats: + dnl Linux libc-5 and the normal X/Open format + test -d intl || mkdir intl + if test "$CATOBJEXT" = ".cat"; then + AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen) + + dnl Transform the SED scripts while copying because some dumb SEDs + dnl cannot handle comments. + sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed + fi + dnl po2tbl.sed is always needed. + sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ + $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed + + dnl In the intl/Makefile.in we have a special dependency which makes + dnl only sense for gettext. We comment this out for non-gettext + dnl packages. + if test "$PACKAGE" = "gettext"; then + GT_NO="#NO#" + GT_YES= + else + GT_NO= + GT_YES="#YES#" + fi + AC_SUBST(GT_NO) + AC_SUBST(GT_YES) + + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but ($top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) + + dnl *** For now the libtool support in intl/Makefile is not for real. + l= + AC_SUBST(l) + + dnl Generate list of files to be processed by xgettext which will + dnl be included in po/Makefile. + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper , 1996. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. + +# serial 1 + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN(AM_PATH_PROG_WITH_TEST, +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test -n "[$]$1"; then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + +# Check whether LC_MESSAGES is available in . +# Ulrich Drepper , 1995. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. + +# serial 1 + +AC_DEFUN(AM_LC_MESSAGES, + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES) + fi + fi]) + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,148 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +srcdir=`dirname $0` +PKG_NAME="the package." + +DIE=0 + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`autoconf' installed to." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && { + (libtool --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`libtool' installed." + echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +grep "^AM_GNOME_GETTEXT" $srcdir/configure.in >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`automake' installed." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + NO_AUTOMAKE=yes +} + + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$*"; then + echo "**Warning**: I am going to run \`configure' with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo \`$0\'" command line." + echo +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + +for coin in `find $srcdir -name configure.in -print` +do + dr=`dirname $coin` + if test -f $dr/NO-AUTO-GEN; then + echo skipping $dr -- flagged as no auto-gen + else + echo processing $dr + macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin` + ( cd $dr + aclocalinclude="$ACLOCAL_FLAGS" + for k in $macrodirs; do + if test -d $k; then + aclocalinclude="$aclocalinclude -I $k" + ##else + ## echo "**Warning**: No such directory \`$k'. Ignored." + fi + done + if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then + if grep "sed.*POTFILES" configure.in >/dev/null; then + : do nothing -- we still have an old unmodified configure.in + else + echo "Creating $dr/aclocal.m4 ..." + test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 + echo "Running gettextize... Ignore non-fatal messages." + echo "no" | gettextize --force --copy + echo "Making $dr/aclocal.m4 writable ..." + test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 + fi + fi + if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then + echo "Creating $dr/aclocal.m4 ..." + test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 + echo "Running gettextize... Ignore non-fatal messages." + echo "no" | gettextize --force --copy + echo "Making $dr/aclocal.m4 writable ..." + test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 + fi + if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then + echo "Running libtoolize..." + libtoolize --force --copy + fi + echo "Running aclocal $aclocalinclude ..." + aclocal $aclocalinclude + if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then + echo "Running autoheader..." + autoheader + fi + echo "Running automake --gnu $am_opt ..." + automake --add-missing --gnu $am_opt + echo "Running autoconf ..." + autoconf + ) + fi +done + +#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure $conf_flags "$@" ... + $srcdir/configure $conf_flags "$@" \ + && echo Now type \`make\' to compile $PKG_NAME +else + echo Skipping configure process. +fi diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,134 @@ +/* config.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define if using alloca.c. */ +#undef C_ALLOCA + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. + This function is required for alloca.c support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define if you have alloca, as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define if you have and it should be used (not on Ultrix). */ +#undef HAVE_ALLOCA_H + +/* Define if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define to `long' if doesn't define. */ +#undef off_t + +/* Define if you need to in order for stat and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to `unsigned' if doesn't define. */ +#undef size_t + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown + */ +#undef STACK_DIRECTION + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if your processor stores words with the most significant + byte first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN + +#undef ENABLE_NLS +#undef HAVE_CATGETS +#undef HAVE_GETTEXT +#undef HAVE_LC_MESSAGES +#undef HAVE_STPCPY +#undef HAVE_LIBSM +#undef PACKAGE_LOCALE_DIR +#undef PACKAGE_DATA_DIR +#undef PACKAGE_SOURCE_DIR + +/* Define if you have the __argz_count function. */ +#undef HAVE___ARGZ_COUNT + +/* Define if you have the __argz_next function. */ +#undef HAVE___ARGZ_NEXT + +/* Define if you have the __argz_stringify function. */ +#undef HAVE___ARGZ_STRINGIFY + +/* Define if you have the dcgettext function. */ +#undef HAVE_DCGETTEXT + +/* Define if you have the getcwd function. */ +#undef HAVE_GETCWD + +/* Define if you have the getpagesize function. */ +#undef HAVE_GETPAGESIZE + +/* Define if you have the munmap function. */ +#undef HAVE_MUNMAP + +/* Define if you have the putenv function. */ +#undef HAVE_PUTENV + +/* Define if you have the setenv function. */ +#undef HAVE_SETENV + +/* Define if you have the setlocale function. */ +#undef HAVE_SETLOCALE + +/* Define if you have the stpcpy function. */ +#undef HAVE_STPCPY + +/* Define if you have the strcasecmp function. */ +#undef HAVE_STRCASECMP + +/* Define if you have the strchr function. */ +#undef HAVE_STRCHR + +/* Define if you have the strdup function. */ +#undef HAVE_STRDUP + +/* Define if you have the header file. */ +#undef HAVE_ARGZ_H + +/* Define if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define if you have the header file. */ +#undef HAVE_NL_TYPES_H + +/* Define if you have the header file. */ +#undef HAVE_STRING_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the i library (-li). */ +#undef HAVE_LIBI + +/* Name of package */ +#undef PACKAGE + +/* Version number of package */ +#undef VERSION + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,4206 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --with-gtk-prefix=PFX Prefix where GTK is installed (optional)" +ac_help="$ac_help + --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)" +ac_help="$ac_help + --disable-gtktest Do not try to compile and run a test GTK program" +ac_help="$ac_help + --disable-nls do not use Native Language Support" +ac_help="$ac_help + --with-included-gettext use the GNU gettext library included here" +ac_help="$ac_help + --with-catgets use catgets functions if available" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=configure.in + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:568: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 +echo "configure:621: checking whether build environment is sane" >&5 +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "$*" != "X $srcdir/configure conftestfile" \ + && test "$*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { echo "configure: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" 1>&2; exit 1; } + fi + + test "$2" = conftestfile + ) +then + # Ok. + : +else + { echo "configure: error: newly created file is older than distributed files! +Check your system clock" 1>&2; exit 1; } +fi +rm -f conftest* +echo "$ac_t""yes" 1>&6 +if test "$program_transform_name" = s,x,x,; then + program_transform_name= +else + # Double any \ or $. echo might interpret backslashes. + cat <<\EOF_SED > conftestsed +s,\\,\\\\,g; s,\$,$$,g +EOF_SED + program_transform_name="`echo $program_transform_name|sed -f conftestsed`" + rm -f conftestsed +fi +test "$program_prefix" != NONE && + program_transform_name="s,^,${program_prefix},; $program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" + +# sed with no file args requires a program. +test "$program_transform_name" = "" && program_transform_name="s,x,x," + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:678: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + + +PACKAGE=goom2 + +VERSION=0.1 + +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } +fi +cat >> confdefs.h <> confdefs.h <&6 +echo "configure:725: checking for working aclocal" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (aclocal --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal + echo "$ac_t""found" 1>&6 +else + ACLOCAL="$missing_dir/missing aclocal" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 +echo "configure:738: checking for working autoconf" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf + echo "$ac_t""found" 1>&6 +else + AUTOCONF="$missing_dir/missing autoconf" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working automake""... $ac_c" 1>&6 +echo "configure:751: checking for working automake" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (automake --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake + echo "$ac_t""found" 1>&6 +else + AUTOMAKE="$missing_dir/missing automake" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 +echo "configure:764: checking for working autoheader" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader + echo "$ac_t""found" 1>&6 +else + AUTOHEADER="$missing_dir/missing autoheader" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 +echo "configure:777: checking for working makeinfo" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo + echo "$ac_t""found" 1>&6 +else + MAKEINFO="$missing_dir/missing makeinfo" + echo "$ac_t""missing" 1>&6 +fi + + + + + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:797: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:827: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:878: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:910: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 921 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:926: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:952: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:957: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:985: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + +echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 +echo "configure:1017: checking for POSIXized ISC" >&5 +if test -d /etc/conf/kconfig.d && + grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 +then + echo "$ac_t""yes" 1>&6 + ISC=yes # If later tests want to check for ISC. + cat >> confdefs.h <<\EOF +#define _POSIX_SOURCE 1 +EOF + + if test "$GCC" = yes; then + CC="$CC -posix" + else + CC="$CC -Xp" + fi +else + echo "$ac_t""no" 1>&6 + ISC= +fi + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1040: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1070: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1121: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:1153: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 1164 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:1169: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:1195: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:1200: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:1228: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + + + + +echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6 +echo "configure:1263: checking for ${CC-cc} option to accept ANSI C" >&5 +if eval "test \"`echo '$''{'am_cv_prog_cc_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + am_cv_prog_cc_stdc=no +ac_save_CC="$CC" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + cat > conftest.$ac_ext < +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; + +int main() { + +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + +; return 0; } +EOF +if { (eval echo configure:1316: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + am_cv_prog_cc_stdc="$ac_arg"; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done +CC="$ac_save_CC" + +fi + +if test -z "$am_cv_prog_cc_stdc"; then + echo "$ac_t""none needed" 1>&6 +else + echo "$ac_t""$am_cv_prog_cc_stdc" 1>&6 +fi +case "x$am_cv_prog_cc_stdc" in + x|xno) ;; + *) CC="$CC $am_cv_prog_cc_stdc" ;; +esac + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:1340: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1361: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1378: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1395: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1420: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1433: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1500: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 +echo "configure:1524: checking whether byte ordering is bigendian" >&5 +if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_bigendian=unknown +# See if sys/param.h defines the BYTE_ORDER macro. +cat > conftest.$ac_ext < +#include +int main() { + +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros +#endif +; return 0; } +EOF +if { (eval echo configure:1542: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + # It does; now see whether it defined to BIG_ENDIAN or not. +cat > conftest.$ac_ext < +#include +int main() { + +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif +; return 0; } +EOF +if { (eval echo configure:1557: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_bigendian=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_bigendian=no +fi +rm -f conftest* +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +if test $ac_cv_c_bigendian = unknown; then +if test "$cross_compiling" = yes; then + { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_c_bigendian=no +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_c_bigendian=yes +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_c_bigendian" 1>&6 +if test $ac_cv_c_bigendian = yes; then + cat >> confdefs.h <<\EOF +#define WORDS_BIGENDIAN 1 +EOF + +fi + + + +# Check whether --with-gtk-prefix or --without-gtk-prefix was given. +if test "${with_gtk_prefix+set}" = set; then + withval="$with_gtk_prefix" + gtk_config_prefix="$withval" +else + gtk_config_prefix="" +fi + +# Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given. +if test "${with_gtk_exec_prefix+set}" = set; then + withval="$with_gtk_exec_prefix" + gtk_config_exec_prefix="$withval" +else + gtk_config_exec_prefix="" +fi + +# Check whether --enable-gtktest or --disable-gtktest was given. +if test "${enable_gtktest+set}" = set; then + enableval="$enable_gtktest" + : +else + enable_gtktest=yes +fi + + + for module in . + do + case "$module" in + gthread) + gtk_config_args="$gtk_config_args gthread" + ;; + esac + done + + if test x$gtk_config_exec_prefix != x ; then + gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config + fi + fi + if test x$gtk_config_prefix != x ; then + gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_prefix/bin/gtk-config + fi + fi + + # Extract the first word of "gtk-config", so it can be a program name with args. +set dummy gtk-config; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1665: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GTK_CONFIG" in + /*) + ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no" + ;; +esac +fi +GTK_CONFIG="$ac_cv_path_GTK_CONFIG" +if test -n "$GTK_CONFIG"; then + echo "$ac_t""$GTK_CONFIG" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + min_gtk_version=1.2.0 + echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6 +echo "configure:1700: checking for GTK - version >= $min_gtk_version" >&5 + no_gtk="" + if test "$GTK_CONFIG" = "no" ; then + no_gtk=yes + else + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x$enable_gtktest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$GTK_LIBS $LIBS" + rm -f conf.gtktest + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat > conftest.$ac_ext < +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gtktest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_gtk_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + + if ((gtk_major_version != $gtk_config_major_version) || + (gtk_minor_version != $gtk_config_minor_version) || + (gtk_micro_version != $gtk_config_micro_version)) + { + printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", + $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf ("*** was found! If gtk-config was correct, then it is best\n"); + printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); + printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } +#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) + else if ((gtk_major_version != GTK_MAJOR_VERSION) || + (gtk_minor_version != GTK_MINOR_VERSION) || + (gtk_micro_version != GTK_MICRO_VERSION)) + { + printf("*** GTK+ header files (version %d.%d.%d) do not match\n", + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + } +#endif /* defined (GTK_MAJOR_VERSION) ... */ + else + { + if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); + printf("*** correct copy of gtk-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} + +EOF +if { (eval echo configure:1801: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + no_gtk=yes +fi +rm -fr conftest* +fi + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gtk" = x ; then + echo "$ac_t""yes" 1>&6 + : + else + echo "$ac_t""no" 1>&6 + if test "$GTK_CONFIG" = "no" ; then + echo "*** The gtk-config script installed by GTK could not be found" + echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GTK_CONFIG environment variable to the" + echo "*** full path to gtk-config." + else + if test -f conf.gtktest ; then + : + else + echo "*** Could not run GTK test program, checking why..." + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + cat > conftest.$ac_ext < +#include + +int main() { + return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); +; return 0; } +EOF +if { (eval echo configure:1845: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GTK or finding the wrong" + echo "*** version of GTK. If it is not finding GTK, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GTK was incorrectly installed" + echo "*** or that you have moved GTK since it was installed. In the latter case, you" + echo "*** may want to edit the gtk-config script: $GTK_CONFIG" +fi +rm -f conftest* + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GTK_CFLAGS="" + GTK_LIBS="" + { echo "configure: error: Cannot find GTK: Is gtk-config in path?" 1>&2; exit 1; } + fi + + + rm -f conf.gtktest + + +ALL_LINGUAS="" +# Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1888: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:1916: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:1970: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking for inline""... $ac_c" 1>&6 +echo "configure:1991: checking for inline" >&5 +if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_inline=$ac_kw; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done + +fi + +echo "$ac_t""$ac_cv_c_inline" 1>&6 +case "$ac_cv_c_inline" in + inline | yes) ;; + no) cat >> confdefs.h <<\EOF +#define inline +EOF + ;; + *) cat >> confdefs.h <&6 +echo "configure:2031: checking for off_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_off_t=yes +else + rm -rf conftest* + ac_cv_type_off_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_off_t" 1>&6 +if test $ac_cv_type_off_t = no; then + cat >> confdefs.h <<\EOF +#define off_t long +EOF + +fi + +echo $ac_n "checking for size_t""... $ac_c" 1>&6 +echo "configure:2064: checking for size_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_size_t=yes +else + rm -rf conftest* + ac_cv_type_size_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_size_t" 1>&6 +if test $ac_cv_type_size_t = no; then + cat >> confdefs.h <<\EOF +#define size_t unsigned +EOF + +fi + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 +echo "configure:2099: checking for working alloca.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int main() { +char *p = alloca(2 * sizeof(int)); +; return 0; } +EOF +if { (eval echo configure:2111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_header_alloca_h=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_alloca_h=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 +if test $ac_cv_header_alloca_h = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_ALLOCA_H 1 +EOF + +fi + +echo $ac_n "checking for alloca""... $ac_c" 1>&6 +echo "configure:2132: checking for alloca" >&5 +if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +# define alloca _alloca +# else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int main() { +char *p = (char *) alloca(1); +; return 0; } +EOF +if { (eval echo configure:2165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_func_alloca_works=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_func_alloca_works=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_func_alloca_works" 1>&6 +if test $ac_cv_func_alloca_works = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_ALLOCA 1 +EOF + +fi + +if test $ac_cv_func_alloca_works = no; then + # The SVR3 libPW and SVR4 libucb both contain incompatible functions + # that cause trouble. Some versions do not even contain alloca or + # contain a buggy version. If you still want to use their alloca, + # use ar to extract alloca.o from them instead of compiling alloca.c. + ALLOCA=alloca.${ac_objext} + cat >> confdefs.h <<\EOF +#define C_ALLOCA 1 +EOF + + +echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 +echo "configure:2197: checking whether alloca needs Cray hooks" >&5 +if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <&5 | + egrep "webecray" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_os_cray=yes +else + rm -rf conftest* + ac_cv_os_cray=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_os_cray" 1>&6 +if test $ac_cv_os_cray = yes; then +for ac_func in _getb67 GETB67 getb67; do + echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2227: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2255: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <&6 +fi + +done +fi + +echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 +echo "configure:2282: checking stack direction for C alloca" >&5 +if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat > conftest.$ac_ext < addr) ? 1 : -1; +} +main () +{ + exit (find_stack_direction() < 0); +} +EOF +if { (eval echo configure:2309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_c_stack_direction=1 +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_c_stack_direction=-1 +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 +cat >> confdefs.h <&6 +echo "configure:2334: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2344: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + +for ac_func in getpagesize +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2373: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2401: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +echo $ac_n "checking for working mmap""... $ac_c" 1>&6 +echo "configure:2426: checking for working mmap" >&5 +if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat > conftest.$ac_ext < +#include +#include + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef HAVE_UNISTD_H +# include +# endif + +/* Assume that all systems that can run configure have sys/param.h. */ +# ifndef HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +#ifdef __cplusplus +extern "C" { void *malloc(unsigned); } +#else +char *malloc(); +#endif + +int +main() +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize(); + + /* + * First, make a file with some known garbage in it. + */ + data = malloc(pagesize); + if (!data) + exit(1); + for (i = 0; i < pagesize; ++i) + *(data + i) = rand(); + umask(0); + fd = creat("conftestmmap", 0600); + if (fd < 0) + exit(1); + if (write(fd, data, pagesize) != pagesize) + exit(1); + close(fd); + + /* + * Next, try to mmap the file at a fixed address which + * already has something else allocated at it. If we can, + * also make sure that we see the same garbage. + */ + fd = open("conftestmmap", O_RDWR); + if (fd < 0) + exit(1); + data2 = malloc(2 * pagesize); + if (!data2) + exit(1); + data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + exit(1); + + /* + * Finally, make sure that changes to the mapped area + * do not percolate back to the file as seen by read(). + * (This is a bug on some variants of i386 svr4.0.) + */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = malloc(pagesize); + if (!data3) + exit(1); + if (read(fd, data3, pagesize) != pagesize) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + exit(1); + close(fd); + unlink("conftestmmap"); + exit(0); +} + +EOF +if { (eval echo configure:2574: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_func_mmap_fixed_mapped=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_func_mmap_fixed_mapped=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 +if test $ac_cv_func_mmap_fixed_mapped = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_MMAP 1 +EOF + +fi + + + for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h string.h \ +unistd.h sys/param.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:2602: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2612: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + for ac_func in getcwd munmap putenv setenv setlocale strchr strcasecmp \ +strdup __argz_count __argz_stringify __argz_next +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2642: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + + if test "${ac_cv_func_stpcpy+set}" != "set"; then + for ac_func in stpcpy +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2699: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + fi + if test "${ac_cv_func_stpcpy}" = "yes"; then + cat >> confdefs.h <<\EOF +#define HAVE_STPCPY 1 +EOF + + fi + + if test $ac_cv_header_locale_h = yes; then + echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6 +echo "configure:2761: checking for LC_MESSAGES" >&5 +if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int main() { +return LC_MESSAGES +; return 0; } +EOF +if { (eval echo configure:2773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + am_cv_val_LC_MESSAGES=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + am_cv_val_LC_MESSAGES=no +fi +rm -f conftest* +fi + +echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6 + if test $am_cv_val_LC_MESSAGES = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_LC_MESSAGES 1 +EOF + + fi + fi + echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6 +echo "configure:2794: checking whether NLS is requested" >&5 + # Check whether --enable-nls or --disable-nls was given. +if test "${enable_nls+set}" = set; then + enableval="$enable_nls" + USE_NLS=$enableval +else + USE_NLS=yes +fi + + echo "$ac_t""$USE_NLS" 1>&6 + + + USE_INCLUDED_LIBINTL=no + + if test "$USE_NLS" = "yes"; then + cat >> confdefs.h <<\EOF +#define ENABLE_NLS 1 +EOF + + echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6 +echo "configure:2814: checking whether included gettext is requested" >&5 + # Check whether --with-included-gettext or --without-included-gettext was given. +if test "${with_included_gettext+set}" = set; then + withval="$with_included_gettext" + nls_cv_force_use_gnu_gettext=$withval +else + nls_cv_force_use_gnu_gettext=no +fi + + echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6 + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + nls_cv_header_intl= + nls_cv_header_libgt= + CATOBJEXT=NONE + + ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for libintl.h""... $ac_c" 1>&6 +echo "configure:2833: checking for libintl.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6 +echo "configure:2860: checking for gettext in libc" >&5 +if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int main() { +return (int) gettext ("") +; return 0; } +EOF +if { (eval echo configure:2872: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + gt_cv_func_gettext_libc=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + gt_cv_func_gettext_libc=no +fi +rm -f conftest* +fi + +echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6 + + if test "$gt_cv_func_gettext_libc" != "yes"; then + echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6 +echo "configure:2888: checking for bindtextdomain in -lintl" >&5 +ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lintl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6 +echo "configure:2923: checking for gettext in libintl" >&5 +if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6 +echo "configure:2928: checking for gettext in -lintl" >&5 +ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lintl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + gt_cv_func_gettext_libintl=yes +else + echo "$ac_t""no" 1>&6 +gt_cv_func_gettext_libintl=no +fi + +fi + +echo "$ac_t""$gt_cv_func_gettext_libintl" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + fi + + if test "$gt_cv_func_gettext_libc" = "yes" \ + || test "$gt_cv_func_gettext_libintl" = "yes"; then + cat >> confdefs.h <<\EOF +#define HAVE_GETTEXT 1 +EOF + + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:2986: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$MSGFMT" in + /*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then + ac_cv_path_MSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test -n "$MSGFMT"; then + echo "$ac_t""$MSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + if test "$MSGFMT" != "no"; then + for ac_func in dcgettext +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:3020: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:3048: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3075: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GMSGFMT" in + /*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GMSGFMT="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT="$ac_cv_path_GMSGFMT" +if test -n "$GMSGFMT"; then + echo "$ac_t""$GMSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3111: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test -n "$XGETTEXT"; then + echo "$ac_t""$XGETTEXT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + CATOBJEXT=.gmo + DATADIRNAME=share +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CATOBJEXT=.mo + DATADIRNAME=lib +fi +rm -f conftest* + INSTOBJEXT=.mo + fi + fi + +else + echo "$ac_t""no" 1>&6 +fi + + + if test "$CATOBJEXT" = "NONE"; then + echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6 +echo "configure:3174: checking whether catgets can be used" >&5 + # Check whether --with-catgets or --without-catgets was given. +if test "${with_catgets+set}" = set; then + withval="$with_catgets" + nls_cv_use_catgets=$withval +else + nls_cv_use_catgets=no +fi + + echo "$ac_t""$nls_cv_use_catgets" 1>&6 + + if test "$nls_cv_use_catgets" = "yes"; then + echo $ac_n "checking for main in -li""... $ac_c" 1>&6 +echo "configure:3187: checking for main in -li" >&5 +ac_lib_var=`echo i'_'main | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-li $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo i | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +fi + + echo $ac_n "checking for catgets""... $ac_c" 1>&6 +echo "configure:3230: checking for catgets" >&5 +if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char catgets(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_catgets) || defined (__stub___catgets) +choke me +#else +catgets(); +#endif + +; return 0; } +EOF +if { (eval echo configure:3258: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_catgets=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_catgets=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'catgets`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_CATGETS 1 +EOF + + INTLOBJS="\$(CATOBJS)" + # Extract the first word of "gencat", so it can be a program name with args. +set dummy gencat; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3280: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GENCAT" in + /*) + ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GENCAT="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GENCAT" && ac_cv_path_GENCAT="no" + ;; +esac +fi +GENCAT="$ac_cv_path_GENCAT" +if test -n "$GENCAT"; then + echo "$ac_t""$GENCAT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + if test "$GENCAT" != "no"; then + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3316: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GMSGFMT" in + /*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GMSGFMT="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no" + ;; +esac +fi +GMSGFMT="$ac_cv_path_GMSGFMT" +if test -n "$GMSGFMT"; then + echo "$ac_t""$GMSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test "$GMSGFMT" = "no"; then + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3353: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GMSGFMT" in + /*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then + ac_cv_path_GMSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no" + ;; +esac +fi +GMSGFMT="$ac_cv_path_GMSGFMT" +if test -n "$GMSGFMT"; then + echo "$ac_t""$GMSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + fi + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3388: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test -n "$XGETTEXT"; then + echo "$ac_t""$XGETTEXT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.cat + INSTOBJEXT=.cat + DATADIRNAME=lib + INTLDEPS='$(top_builddir)/intl/libintl.a' + INTLLIBS=$INTLDEPS + LIBS=`echo $LIBS | sed -e 's/-lintl//'` + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi +else + echo "$ac_t""no" 1>&6 +fi + + fi + fi + + if test "$CATOBJEXT" = "NONE"; then + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + INTLOBJS="\$(GETTOBJS)" + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3446: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$MSGFMT" in + /*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then + ac_cv_path_MSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="msgfmt" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test -n "$MSGFMT"; then + echo "$ac_t""$MSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3480: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GMSGFMT" in + /*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GMSGFMT="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT="$ac_cv_path_GMSGFMT" +if test -n "$GMSGFMT"; then + echo "$ac_t""$GMSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3516: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test -n "$XGETTEXT"; then + echo "$ac_t""$XGETTEXT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.gmo + INSTOBJEXT=.mo + DATADIRNAME=share + INTLDEPS='$(top_builddir)/intl/libintl.a' + INTLLIBS=$INTLDEPS + LIBS=`echo $LIBS | sed -e 's/-lintl//'` + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi + + if test "$XGETTEXT" != ":"; then + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6 + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + else + DATADIRNAME=share + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi + + + + + # If this is used in GNU gettext we have to set USE_NLS to `yes' + # because some of the sources are only built for this goal. + if test "$PACKAGE" = gettext; then + USE_NLS=yes + USE_INCLUDED_LIBINTL=yes + fi + + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + + + + + + + + + + + + + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6 +echo "configure:3609: checking for catalogs to be installed" >&5 + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + echo "$ac_t""$LINGUAS" 1>&6 + fi + + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + if test $ac_cv_header_locale_h = yes; then + INCLUDE_LOCALE_H="#include " + else + INCLUDE_LOCALE_H="\ +/* The system does not provide the header . Take care yourself. */" + fi + + + test -d intl || mkdir intl + if test "$CATOBJEXT" = ".cat"; then + ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6 +echo "configure:3637: checking for linux/version.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3647: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + msgformat=linux +else + echo "$ac_t""no" 1>&6 +msgformat=xopen +fi + + + sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed + fi + sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ + $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed + + if test "$PACKAGE" = "gettext"; then + GT_NO="#NO#" + GT_YES= + else + GT_NO= + GT_YES="#YES#" + fi + + + + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + + + l= + + + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + + +if test "x${prefix}" = "xNONE"; then + cat >> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h < confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo " +Makefile +gtk-gui/Makefile +intl/Makefile +po/Makefile.in + config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@PACKAGE@%$PACKAGE%g +s%@VERSION@%$VERSION%g +s%@ACLOCAL@%$ACLOCAL%g +s%@AUTOCONF@%$AUTOCONF%g +s%@AUTOMAKE@%$AUTOMAKE%g +s%@AUTOHEADER@%$AUTOHEADER%g +s%@MAKEINFO@%$MAKEINFO%g +s%@SET_MAKE@%$SET_MAKE%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@GTK_CONFIG@%$GTK_CONFIG%g +s%@GTK_CFLAGS@%$GTK_CFLAGS%g +s%@GTK_LIBS@%$GTK_LIBS%g +s%@RANLIB@%$RANLIB%g +s%@ALLOCA@%$ALLOCA%g +s%@USE_NLS@%$USE_NLS%g +s%@MSGFMT@%$MSGFMT%g +s%@GMSGFMT@%$GMSGFMT%g +s%@XGETTEXT@%$XGETTEXT%g +s%@GENCAT@%$GENCAT%g +s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g +s%@CATALOGS@%$CATALOGS%g +s%@CATOBJEXT@%$CATOBJEXT%g +s%@DATADIRNAME@%$DATADIRNAME%g +s%@GMOFILES@%$GMOFILES%g +s%@INSTOBJEXT@%$INSTOBJEXT%g +s%@INTLDEPS@%$INTLDEPS%g +s%@INTLLIBS@%$INTLLIBS%g +s%@INTLOBJS@%$INTLOBJS%g +s%@POFILES@%$POFILES%g +s%@POSUB@%$POSUB%g +s%@INCLUDE_LOCALE_H@%$INCLUDE_LOCALE_H%g +s%@GT_NO@%$GT_NO%g +s%@GT_YES@%$GT_YES%g +s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g +s%@l@%$l%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +srcdir=$ac_given_srcdir +while test -n "$ac_sources"; do + set $ac_dests; ac_dest=$1; shift; ac_dests=$* + set $ac_sources; ac_source=$1; shift; ac_sources=$* + + echo "linking $srcdir/$ac_source to $ac_dest" + + if test ! -r $srcdir/$ac_source; then + { echo "configure: error: $srcdir/$ac_source: File not found" 1>&2; exit 1; } + fi + rm -f $ac_dest + + # Make relative symlinks. + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dest_dir=`echo $ac_dest|sed 's%/[^/][^/]*$%%'` + if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then + # The dest file is in a subdirectory. + test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir" + ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dest_dir_suffix. + ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dest_dir_suffix= ac_dots= + fi + + case "$srcdir" in + [/$]*) ac_rel_source="$srcdir/$ac_source" ;; + *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;; + esac + + # Make a symlink if possible; otherwise try a hard link. + if ln -s $ac_rel_source $ac_dest 2>/dev/null || + ln $srcdir/$ac_source $ac_dest; then : + else + { echo "configure: error: can not link $ac_dest to $srcdir/$ac_source" 1>&2; exit 1; } + fi +done +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h +case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.ac kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.ac --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.ac 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.ac 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,58 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(configure.in) +AM_INIT_AUTOMAKE(goom2, 0.1) +AC_CONFIG_HEADERS(config.h) + +AC_ISC_POSIX +AC_PROG_CC +AC_HEADER_STDC +AC_C_BIGENDIAN + + +AM_PATH_GTK(1.2.0, , + AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?)) + +dnl Add the languages which your application supports here. +ALL_LINGUAS="" +AM_GNU_GETTEXT + +dnl Set PACKAGE_LOCALE_DIR in config.h. +if test "x${prefix}" = "xNONE"; then + AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale") +else + AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale") +fi + +dnl Set PACKAGE_DATA_DIR in config.h. +if test "x${datadir}" = 'x${prefix}/share'; then + if test "x${prefix}" = "xNONE"; then + AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}") + else + AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}") + fi +else + AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}") +fi + +dnl Set PACKAGE_SOURCE_DIR in config.h. +packagesrcdir=`cd $srcdir && pwd` +AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}") + +dnl Use -Wall if we have gcc. +changequote(,)dnl +if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) CFLAGS="$CFLAGS -Wall" ;; + esac +fi +changequote([,])dnl + +AC_OUTPUT([ +Makefile +gtk-gui/Makefile +intl/Makefile +po/Makefile.in +]) + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,158 @@ + + + + + Goom2 + goom2 + + gtk-gui + pixmaps + C + False + True + True + False + gtk-interface.c + gtk-interface.h + gtk-callbacks.c + gtk-callbacks.h + gtk-support.c + gtk-support.h + + + + GtkWindow + config_window + + destroy_event + on_config_window_destroy_event + Fri, 23 May 2003 09:08:30 GMT + + + delete_event + on_config_window_delete_event + Fri, 23 May 2003 09:09:21 GMT + + Goom Control Center + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + True + False + + + GtkVBox + vbox1 + False + 0 + + + GtkToolbar + toolbar1 + 3 + GTK_ORIENTATION_HORIZONTAL + GTK_TOOLBAR_TEXT + 8 + GTK_TOOLBAR_SPACE_LINE + GTK_RELIEF_NORMAL + True + + 0 + False + False + + + + GtkButton + Toolbar:button + b_open_config + + + + + GtkButton + Toolbar:button + b_save_config + + + + + + GtkNotebook + notebook1 + True + True + True + GTK_POS_LEFT + False + 2 + 2 + False + + 0 + True + True + + + + GtkScrolledWindow + scrolledwindow1 + GTK_POLICY_NEVER + GTK_POLICY_ALWAYS + GTK_UPDATE_CONTINUOUS + GTK_UPDATE_CONTINUOUS + + + GtkText + text1 + 400 + 300 + True + False + What a GOOM!! v2 + +copyright 2000-2003, by J.C. Hoelt <jeko@free.fr> + +This is my first visual plugins for XMMS, and I +think that it's the best I have ever done ! + +--- + +This dialog will help you to configure goom. +Many options here will seem strange to you, +anyway, just try things and look what happen ! + +Enjoy, + + Jeko + + + + + GtkLabel + Notebook:tab + goom_control + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + + GtkStatusbar + statusbar1 + + 0 + False + False + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,267 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "gtk-callbacks.h" +#include "gtk-interface.h" +#include "gtk-support.h" + +#define WINSIZE_COMBO "combo_winsize" + +#include "sdl_goom.h" +#include "config_param.h" + +#include +#include + +static SdlGoom *sdlGoom; +static GtkObject *owin; + +void +on_spinbutton_int_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + IVAL(*param) = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(editable)); + param->changed(param); +} + +void +on_list_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + LVAL(*param) = gtk_editable_get_chars (editable,0,-1); + param->changed(param); +} + +void +on_bool_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(togglebutton),"param"); + BVAL(*param) = gtk_toggle_button_get_active(togglebutton); + param->changed(param); +} + +void my_int_listener (PluginParam *param) { + GtkEditable *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_EDITABLE(param->user_data); + + if (editable) { + int pos = 0; + char str[256]; + sprintf (str, "%d", IVAL(*param)); + if (strcmp(str,gtk_editable_get_chars(editable,0,-1))) { + gtk_editable_delete_text (editable,0,-1); + gtk_editable_insert_text (editable,str,strlen(str),&pos); + } + } +} + +void my_list_listener (PluginParam *param) { + GtkEntry *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_ENTRY(param->user_data); + + if (editable) { + if (strcmp(gtk_entry_get_text(editable),LVAL(*param))) { + gtk_entry_set_text (editable, LVAL(*param)); + } + } +} + +void my_bool_listener (PluginParam *param) { + GtkCheckButton *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_CHECK_BUTTON(param->user_data); + + if (editable) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(editable)) != BVAL(*param)) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable),BVAL(*param)); + } +} + +void my_float_listener (PluginParam *param) { + GtkProgressBar *progress; + + if (sdlGoom->config_win == 0) return; + progress = GTK_PROGRESS_BAR(param->user_data); + + if (progress) { + if (FVAL(*param)FMAX(*param)) + FVAL(*param) = FMAX(*param); + gtk_progress_bar_update (progress, FVAL(*param)); + } +} + +void addParams (GtkNotebook *notebook, PluginParameters *params) { + int n; + GtkWidget *table = gtk_table_new (params->nbParams, 2, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (table), 11); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + + for (n=0;nnbParams;++n) { + if (params->params[n] == 0) { + GtkWidget *hseparator = gtk_hseparator_new (); + gtk_widget_show (hseparator); + gtk_table_attach (GTK_TABLE (table), hseparator, 0, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 5); + } else { + PluginParam *p = params->params[n]; + + if (p->type != PARAM_BOOLVAL) { + GtkWidget *label4 = gtk_label_new (p->name); + gtk_widget_show (label4); + gtk_table_attach (GTK_TABLE (table), label4, 0, 1, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5); + } + + switch (p->type) { + case PARAM_INTVAL: { + GtkWidget *spinbutton_adj,*spinbutton; + + spinbutton_adj = (GtkWidget*)gtk_adjustment_new ( + p->param.ival.value, + p->param.ival.min, p->param.ival.max, + p->param.ival.step, p->param.ival.step*10, + p->param.ival.step*10); + spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0); + gtk_widget_show (spinbutton); + gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 1); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE); + gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinbutton), + GTK_UPDATE_IF_VALID); + p->user_data = spinbutton; + gtk_object_set_data (GTK_OBJECT(spinbutton),"param",(void*)p); + p->change_listener = my_int_listener; + gtk_signal_connect (GTK_OBJECT (spinbutton), "changed", + GTK_SIGNAL_FUNC (on_spinbutton_int_changed), + NULL); + break; + } + + case PARAM_FLOATVAL: { + GtkWidget *progress,*prog_adj; + + prog_adj = (GtkWidget*)gtk_adjustment_new ( + p->param.fval.value, + p->param.fval.min, p->param.fval.max, + p->param.fval.step, p->param.fval.step*10, + p->param.fval.step*10); + + progress = gtk_progress_bar_new_with_adjustment(GTK_ADJUSTMENT(prog_adj)); + gtk_widget_show(progress); + gtk_table_attach (GTK_TABLE (table), progress, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 1); + + p->user_data = progress; + p->change_listener = my_float_listener; + break; + } + + case PARAM_LISTVAL: { + int i; + GList *combo_winsize_items = NULL; + GtkWidget *combo_entry_winsize = NULL; + GtkWidget *combo_winsize = gtk_combo_new (); + gtk_widget_show (combo_winsize); + gtk_table_attach (GTK_TABLE (table), combo_winsize, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_combo_set_value_in_list (GTK_COMBO (combo_winsize), TRUE, TRUE); + for (i=0;iparam.slist.nbChoices;++i) + combo_winsize_items = g_list_append (combo_winsize_items, + p->param.slist.choices[i]); + gtk_combo_set_popdown_strings (GTK_COMBO (combo_winsize), combo_winsize_items); + g_list_free (combo_winsize_items); + + combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; + gtk_widget_show (combo_entry_winsize); + gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); + gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); + p->change_listener = my_list_listener; + p->user_data = combo_entry_winsize; + gtk_object_set_data (GTK_OBJECT(combo_entry_winsize),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (combo_entry_winsize), "changed", + GTK_SIGNAL_FUNC (on_list_changed), + NULL); + break; + } + + case PARAM_BOOLVAL: { + GtkWidget *checkbutton_double = + gtk_check_button_new_with_label (p->name); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_double),BVAL(*p)); + gtk_widget_show (checkbutton_double); + gtk_table_attach (GTK_TABLE (table), checkbutton_double, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_signal_connect (GTK_OBJECT (checkbutton_double), "toggled", + GTK_SIGNAL_FUNC (on_bool_toggled), + NULL); + gtk_object_set_data (GTK_OBJECT(checkbutton_double),"param",(void*)p); + p->user_data = checkbutton_double; + p->change_listener = my_bool_listener; + break; + } + } + } + } + + gtk_widget_show_all(GTK_WIDGET(table)); + gtk_container_add(GTK_CONTAINER(notebook),table); + gtk_notebook_set_tab_label_text(notebook,GTK_WIDGET(table),params->name); +} + +void gtk_data_init(SdlGoom *sg) { + sdlGoom = sg; + if (sdlGoom->config_win) { + int i; + GtkNotebook *notebook; + owin = GTK_OBJECT(sdlGoom->config_win); + notebook = GTK_NOTEBOOK(gtk_object_get_data (owin, "notebook1")); + addParams (notebook, &sdlGoom->screen); + for (i = 0; i < sdlGoom->plugin->nbParams; ++i) { + addParams (notebook, &sdlGoom->plugin->params[i]); + } + } +} + +gboolean +on_config_window_destroy_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + sdlGoom->config_win = 0; + owin = 0; + return FALSE; +} + + +gboolean +on_config_window_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + sdlGoom->config_win = 0; + owin = 0; + return FALSE; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,24 @@ +#include + + +void +on_checkbutton_double_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + +void +on_spinbutton_fps_changed (GtkEditable *editable, + gpointer user_data); + +void +on_combo_entry_winsize_changed (GtkEditable *editable, + gpointer user_data); + +gboolean +on_config_window_destroy_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); + +gboolean +on_config_window_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,137 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#include +#include + +#include "gtk-callbacks.h" +#include "gtk-interface.h" +#include "gtk-support.h" + +GtkWidget* +create_config_window (void) +{ + GtkWidget *config_window; + GtkWidget *vbox1; + GtkWidget *toolbar1; + GtkWidget *b_open_config; + GtkWidget *b_save_config; + GtkWidget *notebook1; + GtkWidget *scrolledwindow1; + GtkWidget *text1; + GtkWidget *goom_control; + GtkWidget *statusbar1; + + config_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_set_name (config_window, "config_window"); + gtk_object_set_data (GTK_OBJECT (config_window), "config_window", config_window); + gtk_window_set_title (GTK_WINDOW (config_window), _("Goom Control Center")); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_widget_set_name (vbox1, "vbox1"); + gtk_widget_ref (vbox1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "vbox1", vbox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox1); + gtk_container_add (GTK_CONTAINER (config_window), vbox1); + + toolbar1 = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT); + gtk_widget_set_name (toolbar1, "toolbar1"); + gtk_widget_ref (toolbar1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "toolbar1", toolbar1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (toolbar1); + gtk_box_pack_start (GTK_BOX (vbox1), toolbar1, FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (toolbar1), 3); + gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar1), 8); + gtk_toolbar_set_space_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_SPACE_LINE); + + b_open_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), + GTK_TOOLBAR_CHILD_BUTTON, + NULL, + _("Open..."), + NULL, NULL, + NULL, NULL, NULL); + gtk_widget_set_name (b_open_config, "b_open_config"); + gtk_widget_ref (b_open_config); + gtk_object_set_data_full (GTK_OBJECT (config_window), "b_open_config", b_open_config, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (b_open_config); + + b_save_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), + GTK_TOOLBAR_CHILD_BUTTON, + NULL, + _("Save..."), + NULL, NULL, + NULL, NULL, NULL); + gtk_widget_set_name (b_save_config, "b_save_config"); + gtk_widget_ref (b_save_config); + gtk_object_set_data_full (GTK_OBJECT (config_window), "b_save_config", b_save_config, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (b_save_config); + + notebook1 = gtk_notebook_new (); + gtk_widget_set_name (notebook1, "notebook1"); + gtk_widget_ref (notebook1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "notebook1", notebook1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (notebook1); + gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook1), GTK_POS_LEFT); + + scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_name (scrolledwindow1, "scrolledwindow1"); + gtk_widget_ref (scrolledwindow1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "scrolledwindow1", scrolledwindow1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (scrolledwindow1); + gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); + + text1 = gtk_text_new (NULL, NULL); + gtk_widget_set_name (text1, "text1"); + gtk_widget_ref (text1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "text1", text1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (text1); + gtk_container_add (GTK_CONTAINER (scrolledwindow1), text1); + gtk_widget_set_usize (text1, 400, 300); + gtk_text_insert (GTK_TEXT (text1), NULL, NULL, NULL, + _("What a GOOM!! v2\n\ncopyright 2000-2003, by J.C. Hoelt \n\nThis is my first visual plugins for XMMS, and I\nthink that it's the best I have ever done !\n\n---\n\nThis dialog will help you to configure goom.\nMany options here will seem strange to you,\nanyway, just try things and look what happen !\n\nEnjoy,\n\n\tJeko"), 317); + + goom_control = gtk_label_new (_("About goom...")); + gtk_widget_set_name (goom_control, "goom_control"); + gtk_widget_ref (goom_control); + gtk_object_set_data_full (GTK_OBJECT (config_window), "goom_control", goom_control, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (goom_control); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), goom_control); + + statusbar1 = gtk_statusbar_new (); + gtk_widget_set_name (statusbar1, "statusbar1"); + gtk_widget_ref (statusbar1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "statusbar1", statusbar1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (statusbar1); + gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0); + + gtk_signal_connect (GTK_OBJECT (config_window), "destroy_event", + GTK_SIGNAL_FUNC (on_config_window_destroy_event), + NULL); + gtk_signal_connect (GTK_OBJECT (config_window), "delete_event", + GTK_SIGNAL_FUNC (on_config_window_delete_event), + NULL); + + return config_window; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,5 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +GtkWidget* create_config_window (void); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,162 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#include + +#include "gtk-support.h" + +/* This is an internally used function to check if a pixmap file exists. */ +static gchar* check_file_exists (const gchar *directory, + const gchar *filename); + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* create_dummy_pixmap (GtkWidget *widget); + +GtkWidget* +lookup_widget (GtkWidget *widget, + const gchar *widget_name) +{ + GtkWidget *parent, *found_widget; + + for (;;) + { + if (GTK_IS_MENU (widget)) + parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); + else + parent = widget->parent; + if (parent == NULL) + break; + widget = parent; + } + + found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), + widget_name); + if (!found_widget) + g_warning ("Widget not found: %s", widget_name); + return found_widget; +} + +/* This is a dummy pixmap we use when a pixmap can't be found. */ +static char *dummy_pixmap_xpm[] = { +/* columns rows colors chars-per-pixel */ +"1 1 1 1", +" c None", +/* pixels */ +" " +}; + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* +create_dummy_pixmap (GtkWidget *widget) +{ + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, + NULL, dummy_pixmap_xpm); + if (gdkpixmap == NULL) + g_error ("Couldn't create replacement pixmap."); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +static GList *pixmaps_directories = NULL; + +/* Use this function to set the directory containing installed pixmaps. */ +void +add_pixmap_directory (const gchar *directory) +{ + pixmaps_directories = g_list_prepend (pixmaps_directories, + g_strdup (directory)); +} + +/* This is an internally used function to create pixmaps. */ +GtkWidget* +create_pixmap (GtkWidget *widget, + const gchar *filename) +{ + gchar *found_filename = NULL; + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + GList *elem; + + if (!filename || !filename[0]) + return create_dummy_pixmap (widget); + + /* We first try any pixmaps directories set by the application. */ + elem = pixmaps_directories; + while (elem) + { + found_filename = check_file_exists ((gchar*)elem->data, filename); + if (found_filename) + break; + elem = elem->next; + } + + /* If we haven't found the pixmap, try the source directory. */ + if (!found_filename) + { + found_filename = check_file_exists ("../pixmaps", filename); + } + + if (!found_filename) + { + g_warning (_("Couldn't find pixmap file: %s"), filename); + return create_dummy_pixmap (widget); + } + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, + NULL, found_filename); + if (gdkpixmap == NULL) + { + g_warning (_("Error loading pixmap file: %s"), found_filename); + g_free (found_filename); + return create_dummy_pixmap (widget); + } + g_free (found_filename); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +/* This is an internally used function to check if a pixmap file exists. */ +gchar* +check_file_exists (const gchar *directory, + const gchar *filename) +{ + gchar *full_filename; + struct stat s; + gint status; + + full_filename = (gchar*) g_malloc (strlen (directory) + 1 + + strlen (filename) + 1); + strcpy (full_filename, directory); + strcat (full_filename, G_DIR_SEPARATOR_S); + strcat (full_filename, filename); + + status = stat (full_filename, &s); + if (status == 0 && S_ISREG (s.st_mode)) + return full_filename; + g_free (full_filename); + return NULL; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +/* + * Standard gettext macros. + */ +#ifdef ENABLE_NLS +# include +# undef _ +# define _(String) dgettext (PACKAGE, String) +# ifdef gettext_noop +# define N_(String) gettext_noop (String) +# else +# define N_(String) (String) +# endif +#else +# define textdomain(String) (String) +# define gettext(String) (String) +# define dgettext(Domain,Message) (Message) +# define dcgettext(Domain,Message,Type) (Message) +# define bindtextdomain(Domain,Directory) (Domain) +# define _(String) (String) +# define N_(String) (String) +#endif + + +/* + * Public Functions. + */ + +/* + * This function returns a widget in a component created by Glade. + * Call it with the toplevel widget in the component (i.e. a window/dialog), + * or alternatively any widget in the component, and the name of the widget + * you want returned. + */ +GtkWidget* lookup_widget (GtkWidget *widget, + const gchar *widget_name); + +/* get_widget() is deprecated. Use lookup_widget instead. */ +#define get_widget lookup_widget + +/* Use this function to set the directory containing installed pixmaps. */ +void add_pixmap_directory (const gchar *directory); + + +/* + * Private Functions. + */ + +/* This is used to create the pixmaps in the interface. */ +GtkWidget* create_pixmap (GtkWidget *widget, + const gchar *filename); + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * Initial main.c file generated by Glade. Edit as required. + * Glade will not overwrite this file. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "interface.h" +#include "support.h" + +int +main (int argc, char *argv[]) +{ + GtkWidget *config_window; + +#ifdef ENABLE_NLS + bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR); + textdomain (PACKAGE); +#endif + + gtk_set_locale (); + gtk_init (&argc, &argv); + + add_pixmap_directory (PACKAGE_DATA_DIR "/pixmaps"); + add_pixmap_directory (PACKAGE_SOURCE_DIR "/pixmaps"); + + /* + * The following code was added by Glade to create one of each component + * (except popup menus), just so that you see something after building + * the project. Delete any components that you don't want shown initially. + */ + config_window = create_config_window (); + gtk_widget_show (config_window); + + gtk_main (); + return 0; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,16 @@ +## Process this file with automake to produce Makefile.in + +INCLUDES = \ + -I$(top_srcdir)/intl \ + @GTK_CFLAGS@ + +bin_PROGRAMS = goom2 + +goom2_SOURCES = \ + main.c \ + support.c support.h \ + interface.c interface.h \ + callbacks.c callbacks.h + +goom2_LDADD = @GTK_LIBS@ $(INTLLIBS) + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,231 @@ +Copyright 1994, 1995, 1996, 1999, 2000, 2001 Free Software Foundation, +Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for variables by setting +them in the environment. You can do that on the command line like this: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it cannot guess the host type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the host +platform (i.e., that on which the generated programs will eventually be +run) with `--host=TYPE'. In this case, you should also specify the +build platform with `--build=TYPE', because, in this case, it may not +be possible to guess the build platform (it sometimes involves +compiling and running simple test programs, and this can't be done if +the compiler is a cross compiler). + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + : +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=$mkdirprog + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + : + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + : + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + : + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' + ' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + : + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + : + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,203 @@ +/* Implementation of the bindtextdomain(3) function + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include +#else +# ifdef HAVE_MALLOC_H +# include +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include +#else +# include +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif + +#ifdef _LIBC +# include +#else +# include "libgettext.h" +#endif +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +/* Contains the default location of the message catalogs. */ +extern const char _nl_default_dirname[]; + +/* List with bindings of specific domains. */ +extern struct binding *_nl_domain_bindings; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define BINDTEXTDOMAIN __bindtextdomain +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define BINDTEXTDOMAIN bindtextdomain__ +#endif + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +char * +BINDTEXTDOMAIN (domainname, dirname) + const char *domainname; + const char *dirname; +{ + struct binding *binding; + + /* Some sanity checks. */ + if (domainname == NULL || domainname[0] == '\0') + return NULL; + + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (dirname == NULL) + /* The current binding has be to returned. */ + return binding == NULL ? (char *) _nl_default_dirname : binding->dirname; + + if (binding != NULL) + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + if (strcmp (dirname, binding->dirname) != 0) + { + char *new_dirname; + + if (strcmp (dirname, _nl_default_dirname) == 0) + new_dirname = (char *) _nl_default_dirname; + else + { +#if defined _LIBC || defined HAVE_STRDUP + new_dirname = strdup (dirname); + if (new_dirname == NULL) + return NULL; +#else + size_t len = strlen (dirname) + 1; + new_dirname = (char *) malloc (len); + if (new_dirname == NULL) + return NULL; + + memcpy (new_dirname, dirname, len); +#endif + } + + if (binding->dirname != _nl_default_dirname) + free (binding->dirname); + + binding->dirname = new_dirname; + } + } + else + { + /* We have to create a new binding. */ +#if !defined _LIBC && !defined HAVE_STRDUP + size_t len; +#endif + struct binding *new_binding = + (struct binding *) malloc (sizeof (*new_binding)); + + if (new_binding == NULL) + return NULL; + +#if defined _LIBC || defined HAVE_STRDUP + new_binding->domainname = strdup (domainname); + if (new_binding->domainname == NULL) + return NULL; +#else + len = strlen (domainname) + 1; + new_binding->domainname = (char *) malloc (len); + if (new_binding->domainname == NULL) + return NULL; + memcpy (new_binding->domainname, domainname, len); +#endif + + if (strcmp (dirname, _nl_default_dirname) == 0) + new_binding->dirname = (char *) _nl_default_dirname; + else + { +#if defined _LIBC || defined HAVE_STRDUP + new_binding->dirname = strdup (dirname); + if (new_binding->dirname == NULL) + return NULL; +#else + len = strlen (dirname) + 1; + new_binding->dirname = (char *) malloc (len); + if (new_binding->dirname == NULL) + return NULL; + memcpy (new_binding->dirname, dirname, len); +#endif + } + + /* Now enqueue it. */ + if (_nl_domain_bindings == NULL + || strcmp (domainname, _nl_domain_bindings->domainname) < 0) + { + new_binding->next = _nl_domain_bindings; + _nl_domain_bindings = new_binding; + } + else + { + binding = _nl_domain_bindings; + while (binding->next != NULL + && strcmp (domainname, binding->next->domainname) > 0) + binding = binding->next; + + new_binding->next = binding->next; + binding->next = new_binding; + } + + binding = new_binding; + } + + return binding->dirname; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__bindtextdomain, bindtextdomain); +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,262 @@ +/* Compatibility code for gettext-using-catgets interface. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef STDC_HEADERS +# include +# include +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include +# endif +#endif + +#ifdef HAVE_NL_TYPES_H +# include +#endif + +#include "libgettext.h" + +/* @@ end of prolog @@ */ + +/* XPG3 defines the result of `setlocale (category, NULL)' as: + ``Directs `setlocale()' to query `category' and return the current + setting of `local'.'' + However it does not specify the exact format. And even worse: POSIX + defines this not at all. So we can use this feature only on selected + system (e.g. those using GNU C Library). */ +#ifdef _LIBC +# define HAVE_LOCALE_NULL +#endif + +/* The catalog descriptor. */ +static nl_catd catalog = (nl_catd) -1; + +/* Name of the default catalog. */ +static const char default_catalog_name[] = "messages"; + +/* Name of currently used catalog. */ +static const char *catalog_name = default_catalog_name; + +/* Get ID for given string. If not found return -1. */ +static int msg_to_cat_id PARAMS ((const char *msg)); + +/* Substitution for systems lacking this function in their C library. */ +#if !_LIBC && !HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +#endif + + +/* Set currently used domain/catalog. */ +char * +textdomain (domainname) + const char *domainname; +{ + nl_catd new_catalog; + char *new_name; + size_t new_name_len; + char *lang; + +#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \ + && defined HAVE_LOCALE_NULL + lang = setlocale (LC_MESSAGES, NULL); +#else + lang = getenv ("LC_ALL"); + if (lang == NULL || lang[0] == '\0') + { + lang = getenv ("LC_MESSAGES"); + if (lang == NULL || lang[0] == '\0') + lang = getenv ("LANG"); + } +#endif + if (lang == NULL || lang[0] == '\0') + lang = "C"; + + /* See whether name of currently used domain is asked. */ + if (domainname == NULL) + return (char *) catalog_name; + + if (domainname[0] == '\0') + domainname = default_catalog_name; + + /* Compute length of added path element. */ + new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang) + + sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1 + + sizeof (".cat"); + + new_name = (char *) malloc (new_name_len); + if (new_name == NULL) + return NULL; + + strcpy (new_name, PACKAGE); + new_catalog = catopen (new_name, 0); + + if (new_catalog == (nl_catd) -1) + { + /* NLSPATH search didn't work, try absolute path */ + sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang, + PACKAGE); + new_catalog = catopen (new_name, 0); + + if (new_catalog == (nl_catd) -1) + { + free (new_name); + return (char *) catalog_name; + } + } + + /* Close old catalog. */ + if (catalog != (nl_catd) -1) + catclose (catalog); + if (catalog_name != default_catalog_name) + free ((char *) catalog_name); + + catalog = new_catalog; + catalog_name = new_name; + + return (char *) catalog_name; +} + +char * +bindtextdomain (domainname, dirname) + const char *domainname; + const char *dirname; +{ +#if HAVE_SETENV || HAVE_PUTENV + char *old_val, *new_val, *cp; + size_t new_val_len; + + /* This does not make much sense here but to be compatible do it. */ + if (domainname == NULL) + return NULL; + + /* Compute length of added path element. If we use setenv we don't need + the first byts for NLSPATH=, but why complicate the code for this + peanuts. */ + new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname) + + sizeof ("/%L/LC_MESSAGES/%N.cat"); + + old_val = getenv ("NLSPATH"); + if (old_val == NULL || old_val[0] == '\0') + { + old_val = NULL; + new_val_len += 1 + sizeof (LOCALEDIR) - 1 + + sizeof ("/%L/LC_MESSAGES/%N.cat"); + } + else + new_val_len += strlen (old_val); + + new_val = (char *) malloc (new_val_len); + if (new_val == NULL) + return NULL; + +# if HAVE_SETENV + cp = new_val; +# else + cp = stpcpy (new_val, "NLSPATH="); +# endif + + cp = stpcpy (cp, dirname); + cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:"); + + if (old_val == NULL) + { +# if __STDC__ + stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat"); +# else + + cp = stpcpy (cp, LOCALEDIR); + stpcpy (cp, "/%L/LC_MESSAGES/%N.cat"); +# endif + } + else + stpcpy (cp, old_val); + +# if HAVE_SETENV + setenv ("NLSPATH", new_val, 1); + free (new_val); +# else + putenv (new_val); + /* Do *not* free the environment entry we just entered. It is used + from now on. */ +# endif + +#endif + + return (char *) domainname; +} + +#undef gettext +char * +gettext (msg) + const char *msg; +{ + int msgid; + + if (msg == NULL || catalog == (nl_catd) -1) + return (char *) msg; + + /* Get the message from the catalog. We always use set number 1. + The message ID is computed by the function `msg_to_cat_id' + which works on the table generated by `po-to-tbl'. */ + msgid = msg_to_cat_id (msg); + if (msgid == -1) + return (char *) msg; + + return catgets (catalog, 1, msgid, (char *) msg); +} + +/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries + for the one equal to msg. If it is found return the ID. In case when + the string is not found return -1. */ +static int +msg_to_cat_id (msg) + const char *msg; +{ + int cnt; + + for (cnt = 0; cnt < _msg_tbl_length; ++cnt) + if (strcmp (msg, _msg_tbl[cnt]._msg) == 0) + return _msg_tbl[cnt]._msg_number; + + return -1; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1086 @@ +1998-04-29 Ulrich Drepper + + * intl/localealias.c (read_alias_file): Use unsigned char for + local variables. Remove unused variable tp. + * intl/l10nflist.c (_nl_normalize_codeset): Use unsigned char * + for type of codeset. For loosing Solaris systems. + * intl/loadinfo.h: Adapt prototype of _nl_normalize_codeset. + * intl/bindtextdom.c (BINDTEXTDOMAIN): Don't define local variable + len if not needed. + Patches by Jim Meyering. + +1998-04-28 Ulrich Drepper + + * loadmsgcat.c (_nl_load_domain): Don't assign the element use_mmap if + mmap is not supported. + + * hash-string.h: Don't include . + +1998-04-27 Ulrich Drepper + + * textdomain.c: Use strdup is available. + + * localealias.c: Define HAVE_MEMPCPY so that we can use this + function. Define and use semapahores to protect modfication of + global objects when compiling for glibc. Add code to allow + freeing alias table. + + * l10nflist.c: Don't assume stpcpy not being a macro. + + * gettextP.h: Define internal_function macri if not already done. + Use glibc byte-swap macros instead of defining SWAP when compiled + for glibc. + (struct loaded_domain): Add elements to allow unloading. + + * Makefile.in (distclean): Don't remove libintl.h here. + + * bindtextdomain.c: Carry over changes from glibc. Use strdup if + available. + + * dcgettext.c: Don't assume stpcpy not being a macro. Mark internal + functions. Add memory freeing code for glibc. + + * dgettext.c: Update copyright. + + * explodename.c: Include stdlib.h and string.h only if they exist. + Use strings.h eventually. + + * finddomain.c: Mark internal functions. Use strdup if available. + Add memory freeing code for glibc. + +1997-10-10 20:00 Ulrich Drepper + + * libgettext.h: Fix dummy textdomain and bindtextdomain macros. + They should return reasonable values. + Reported by Tom Tromey . + +1997-09-16 03:33 Ulrich Drepper + + * libgettext.h: Define PARAMS also to `args' if __cplusplus is defined. + * intlh.inst.in: Likewise. + Reported by Jean-Marc Lasgouttes . + + * libintl.glibc: Update from current glibc version. + +1997-09-06 02:10 Ulrich Drepper + + * intlh.inst.in: Reformat copyright. + +1997-08-19 15:22 Ulrich Drepper + + * dcgettext.c (DCGETTEXT): Remove wrong comment. + +1997-08-16 00:13 Ulrich Drepper + + * Makefile.in (install-data): Don't change directory to install. + +1997-08-01 14:30 Ulrich Drepper + + * cat-compat.c: Fix copyright. + + * localealias.c: Don't define strchr unless !HAVE_STRCHR. + + * loadmsgcat.c: Update copyright. Fix typos. + + * l10nflist.c: Don't define strchr unless !HAVE_STRCHR. + (_nl_make_l10nflist): Handle sponsor and revision correctly. + + * gettext.c: Update copyright. + * gettext.h: Likewise. + * hash-string.h: Likewise. + + * finddomain.c: Remoave dead code. Define strchr only if + !HAVE_STRCHR. + + * explodename.c: Include . + + * explodename.c: Reformat copyright text. + (_nl_explode_name): Fix typo. + + * dcgettext.c: Define and use __set_errno. + (guess_category_value): Don't use setlocale if HAVE_LC_MESSAGES is + not defined. + + * bindtextdom.c: Pretty printing. + +1997-05-01 02:25 Ulrich Drepper + + * dcgettext.c (guess_category_value): Don't depend on + HAVE_LC_MESSAGES. We don't need the macro here. + Patch by Bruno Haible . + + * cat-compat.c (textdomain): DoN't refer to HAVE_SETLOCALE_NULL + macro. Instead use HAVE_LOCALE_NULL and define it when using + glibc, as in dcgettext.c. + Patch by Bruno Haible . + + * Makefile.in (CPPFLAGS): New variable. Reported by Franc,ois + Pinard. + +Mon Mar 10 06:51:17 1997 Ulrich Drepper + + * Makefile.in: Implement handling of libtool. + + * gettextP.h: Change data structures for use of generic lowlevel + i18n file handling. + +Wed Dec 4 20:21:18 1996 Ulrich Drepper + + * textdomain.c: Put parentheses around arguments of memcpy macro + definition. + * localealias.c: Likewise. + * l10nflist.c: Likewise. + * finddomain.c: Likewise. + * bindtextdom.c: Likewise. + Reported by Thomas Esken. + +Mon Nov 25 22:57:51 1996 Ulrich Drepper + + * textdomain.c: Move definition of `memcpy` macro to right + position. + +Fri Nov 22 04:01:58 1996 Ulrich Drepper + + * finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using + bcopy if not already defined. Reported by Thomas Esken. + * bindtextdom.c: Likewise. + * l10nflist.c: Likewise. + * localealias.c: Likewise. + * textdomain.c: Likewise. + +Tue Oct 29 11:10:27 1996 Ulrich Drepper + + * Makefile.in (libdir): Change to use exec_prefix instead of + prefix. Reported by Knut-HvardAksnes . + +Sat Aug 31 03:07:09 1996 Ulrich Drepper + + * l10nflist.c (_nl_normalize_codeset): We convert to lower case, + so don't prepend uppercase `ISO' for only numeric arg. + +Fri Jul 19 00:15:46 1996 Ulrich Drepper + + * l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after + definition of _GNU_SOURCE. Patch by Roland McGrath. + + * Makefile.in (uninstall): Fix another bug with `for' loop and + empty arguments. Patch by Jim Meyering. Correct name os + uninstalled files: no intl- prefix anymore. + + * Makefile.in (install-data): Again work around shells which + cannot handle mpty for list. Reported by Jim Meyering. + +Sat Jul 13 18:11:35 1996 Ulrich Drepper + + * Makefile.in (install): Split goal. Now depend on install-exec + and install-data. + (install-exec, install-data): New goals. Created from former + install goal. + Reported by Karl Berry. + +Sat Jun 22 04:58:14 1996 Ulrich Drepper + + * Makefile.in (MKINSTALLDIRS): New variable. Path to + mkinstalldirs script. + (install): use MKINSTALLDIRS variable or if the script is not present + try to find it in the $top_scrdir). + +Wed Jun 19 02:56:56 1996 Ulrich Drepper + + * l10nflist.c: Linux libc *partly* includes the argz_* functions. + Grr. Work around by renaming the static version and use macros + for renaming. + +Tue Jun 18 20:11:17 1996 Ulrich Drepper + + * l10nflist.c: Correct presence test macros of __argz_* functions. + + * l10nflist.c: Include based on test of it instead when + __argz_* functions are available. + Reported by Andreas Schwab. + +Thu Jun 13 15:17:44 1996 Ulrich Drepper + + * explodename.c, l10nflist.c: Define NULL for dumb systems. + +Tue Jun 11 17:05:13 1996 Ulrich Drepper + + * intlh.inst.in, libgettext.h (dcgettext): Rename local variable + result to __result to prevent name clash. + + * l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to + get prototype for stpcpy and strcasecmp. + + * intlh.inst.in, libgettext.h: Move declaration of + `_nl_msg_cat_cntr' outside __extension__ block to prevent warning + from gcc's -Wnested-extern option. + +Fri Jun 7 01:58:00 1996 Ulrich Drepper + + * Makefile.in (install): Remove comment. + +Thu Jun 6 17:28:17 1996 Ulrich Drepper + + * Makefile.in (install): Work around for another Buglix stupidity. + Always use an `else' close for `if's. Reported by Nelson Beebe. + + * Makefile.in (intlh.inst): Correct typo in phony rule. + Reported by Nelson Beebe. + +Thu Jun 6 01:49:52 1996 Ulrich Drepper + + * dcgettext.c (read_alias_file): Rename variable alloca_list to + block_list as the macro calls assume. + Patch by Eric Backus. + + * localealias.c [!HAVE_ALLOCA]: Define alloca as macro using + malloc. + (read_alias_file): Rename varriabe alloca_list to block_list as the + macro calls assume. + Patch by Eric Backus. + + * l10nflist.c: Correct conditional for inclusion. + Reported by Roland McGrath. + + * Makefile.in (all): Depend on all-@USE_INCLUDED_LIBINTL@, not + all-@USE_NLS@. + + * Makefile.in (install): intlh.inst comes from local dir, not + $(srcdir). + + * Makefile.in (intlh.inst): Special handling of this goal. If + used in gettext, this is really a rul to construct this file. If + used in any other package it is defined as a .PHONY rule with + empty body. + + * finddomain.c: Extract locale file information handling into + l10nfile.c. Rename local stpcpy__ function to stpcpy. + + * dcgettext.c (stpcpy): Add local definition. + + * l10nflist.c: Solve some portability problems. Patches partly by + Thomas Esken. Add local definition of stpcpy. + +Tue Jun 4 02:47:49 1996 Ulrich Drepper + + * intlh.inst.in: Don't depend including on + HAVE_LOCALE_H. Instead configure must rewrite this fiile + depending on the result of the configure run. + + * Makefile.in (install): libintl.inst is now called intlh.inst. + Add rules for updating intlh.inst from intlh.inst.in. + + * libintl.inst: Renamed to intlh.inst.in. + + * localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1 + because gcc has __buitlin_alloca. + Reported by Roland McGrath. + +Mon Jun 3 00:32:16 1996 Ulrich Drepper + + * Makefile.in (installcheck): New goal to fulfill needs of + automake's distcheck. + + * Makefile.in (install): Reorder commands so that VERSION is + found. + + * Makefile.in (gettextsrcdir): Now use subdirectory intl/ in + @datadir@/gettext. + (COMSRCS): Add l10nfile.c. + (OBJECTS): Add l10nfile.o. + (DISTFILES): Rename to DISTFILE.normal. Remove $(DISTFILES.common). + (DISTFILE.gettext): Remove $(DISTFILES.common). + (all-gettext): Remove goal. + (install): If $(PACKAGE) = gettext install, otherwose do nothing. No + package but gettext itself should install libintl.h + headers. + (dist): Extend goal to work for gettext, too. + (dist-gettext): Remove goal. + + * dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc. + +Sun Jun 2 17:33:06 1996 Ulrich Drepper + + * loadmsgcat.c (_nl_load_domain): Parameter is now comes from + find_l10nfile. + +Sat Jun 1 02:23:03 1996 Ulrich Drepper + + * l10nflist.c (__argz_next): Add definition. + + * dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca + code. Use new l10nfile handling. + + * localealias.c [!HAVE_ALLOCA]: Add code for handling missing + alloca code. + + * l10nflist.c: Initial revision. + +Tue Apr 2 18:51:18 1996 Ulrich Drepper + + * Makefile.in (all-gettext): New goal. Same as all-yes. + +Thu Mar 28 23:01:22 1996 Karl Eichwalder + + * Makefile.in (gettextsrcdir): Define using @datadir@. + +Tue Mar 26 12:39:14 1996 Ulrich Drepper + + * finddomain.c: Include . Reported by Roland McGrath. + +Sat Mar 23 02:00:35 1996 Ulrich Drepper + + * finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing + with external declaration. + +Sat Mar 2 00:47:09 1996 Ulrich Drepper + + * Makefile.in (all-no): Rename from all_no. + +Sat Feb 17 00:25:59 1996 Ulrich Drepper + + * gettextP.h [loaded_domain]: Array `successor' must now contain up + to 63 elements (because of codeset name normalization). + + * finddomain.c: Implement codeset name normalization. + +Thu Feb 15 04:39:09 1996 Ulrich Drepper + + * Makefile.in (all): Define to `all-@USE_NLS@'. + (all-yes, all_no): New goals. `all-no' is noop, `all-yes' + is former all. + +Mon Jan 15 21:46:01 1996 Howard Gayle + + * localealias.c (alias_compare): Increment string pointers in loop + of strcasecmp replacement. + +Fri Dec 29 21:16:34 1995 Ulrich Drepper + + * Makefile.in (install-src): Who commented this goal out ? :-) + +Fri Dec 29 15:08:16 1995 Ulrich Drepper + + * dcgettext.c (DCGETTEXT): Save `errno'. Failing system calls + should not effect it because a missing catalog is no error. + Reported by Harald Knig . + +Tue Dec 19 22:09:13 1995 Ulrich Drepper + + * Makefile.in (Makefile): Explicitly use $(SHELL) for running + shell scripts. + +Fri Dec 15 17:34:59 1995 Andreas Schwab + + * Makefile.in (install-src): Only install library and header when + we use the own implementation. Don't do it when using the + system's gettext or catgets functions. + + * dcgettext.c (find_msg): Must not swap domain->hash_size here. + +Sat Dec 9 16:24:37 1995 Ulrich Drepper + + * localealias.c, libintl.inst, libgettext.h, hash-string.h, + gettextP.h, finddomain.c, dcgettext.c, cat-compat.c: + Use PARAMS instead of __P. Suggested by Roland McGrath. + +Tue Dec 5 11:39:14 1995 Larry Schwimmer + + * libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if + !_LIBINTL_H' because Solaris defines _LIBINTL_H as empty. + +Mon Dec 4 15:42:07 1995 Ulrich Drepper + + * Makefile.in (install-src): + Install libintl.inst instead of libintl.h.install. + +Sat Dec 2 22:51:38 1995 Marcus Daniels + + * cat-compat.c (textdomain): + Reverse order in which files are tried you load. First + try local file, when this failed absolute path. + +Wed Nov 29 02:03:53 1995 Nelson H. F. Beebe + + * cat-compat.c (bindtextdomain): Add missing { }. + +Sun Nov 26 18:21:41 1995 Ulrich Drepper + + * libintl.inst: Add missing __P definition. Reported by Nelson Beebe. + + * Makefile.in: + Add dummy `all' and `dvi' goals. Reported by Tom Tromey. + +Sat Nov 25 16:12:01 1995 Franc,ois Pinard + + * hash-string.h: Capitalize arguments of macros. + +Sat Nov 25 12:01:36 1995 Ulrich Drepper + + * Makefile.in (DISTFILES): Prevent files names longer than 13 + characters. libintl.h.glibc->libintl.glibc, + libintl.h.install->libintl.inst. Reported by Joshua R. Poulson. + +Sat Nov 25 11:31:12 1995 Eric Backus + + * dcgettext.c: Fix bug in preprocessor conditionals. + +Sat Nov 25 02:35:27 1995 Nelson H. F. Beebe + + * libgettext.h: Solaris cc does not understand + #if !SYMBOL1 && !SYMBOL2. Sad but true. + +Thu Nov 23 16:22:14 1995 Ulrich Drepper + + * hash-string.h (hash_string): + Fix for machine with >32 bit `unsigned long's. + + * dcgettext.c (DCGETTEXT): + Fix horrible bug in loop for alternative translation. + +Thu Nov 23 01:45:29 1995 Ulrich Drepper + + * po2tbl.sed.in, linux-msg.sed, xopen-msg.sed: + Some further simplifications in message number generation. + +Mon Nov 20 21:08:43 1995 Ulrich Drepper + + * libintl.h.glibc: Use __const instead of const in prototypes. + + * Makefile.in (install-src): + Install libintl.h.install instead of libintl.h. This + is a stripped-down version. Suggested by Peter Miller. + + * libintl.h.install, libintl.h.glibc: Initial revision. + + * localealias.c (_nl_expand_alias, read_alias_file): + Protect prototypes in type casts by __P. + +Tue Nov 14 16:43:58 1995 Ulrich Drepper + + * hash-string.h: Correct prototype for hash_string. + +Sun Nov 12 12:42:30 1995 Ulrich Drepper + + * hash-string.h (hash_string): Add prototype. + + * gettextP.h: Fix copyright. + (SWAP): Add prototype. + +Wed Nov 8 22:56:33 1995 Ulrich Drepper + + * localealias.c (read_alias_file): Forgot sizeof. + Avoid calling *printf function. This introduces a big overhead. + Patch by Roland McGrath. + +Tue Nov 7 14:21:08 1995 Ulrich Drepper + + * finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy. + + * finddomain.c (stpcpy): + Define substitution function local. The macro was to flaky. + + * cat-compat.c: Fix typo. + + * xopen-msg.sed, linux-msg.sed: + While bringing message number to right place only accept digits. + + * linux-msg.sed, xopen-msg.sed: Now that the counter does not have + leading 0s we don't need to remove them. Reported by Marcus + Daniels. + + * Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in + dependency. Reported by Marcus Daniels. + + * cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement. + Generally cleanup using #if instead of #ifndef. + + * Makefile.in: Correct typos in comment. By Franc,ois Pinard. + +Mon Nov 6 00:27:02 1995 Ulrich Drepper + + * Makefile.in (install-src): Don't install libintl.h and libintl.a + if we use an available gettext implementation. + +Sun Nov 5 22:02:08 1995 Ulrich Drepper + + * libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS. Reported + by Franc,ois Pinard. + + * libgettext.h: Use #if instead of #ifdef/#ifndef. + + * finddomain.c: + Comments describing what has to be done should start with FIXME. + +Sun Nov 5 19:38:01 1995 Ulrich Drepper + + * Makefile.in (DISTFILES): Split. Use DISTFILES with normal meaning. + DISTFILES.common names the files common to both dist goals. + DISTFILES.gettext are the files only distributed in GNU gettext. + +Sun Nov 5 17:32:54 1995 Ulrich Drepper + + * dcgettext.c (DCGETTEXT): Correct searching in derived locales. + This was necessary since a change in _nl_find_msg several weeks + ago. I really don't know this is still not fixed. + +Sun Nov 5 12:43:12 1995 Ulrich Drepper + + * loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL. This + might mark a special condition. + + * finddomain.c (make_entry_rec): Don't make illegal entry as decided. + + * Makefile.in (dist): Suppress error message when ln failed. + Get files from $(srcdir) explicitly. + + * libgettext.h (gettext_const): Rename to gettext_noop. + +Fri Nov 3 07:36:50 1995 Ulrich Drepper + + * finddomain.c (make_entry_rec): + Protect against wrong locale names by testing mask. + + * libgettext.h (gettext_const): Add macro definition. + Capitalize macro arguments. + +Thu Nov 2 23:15:51 1995 Ulrich Drepper + + * finddomain.c (_nl_find_domain): + Test for pointer != NULL before accessing value. + Reported by Tom Tromey. + + * gettext.c (NULL): + Define as (void*)0 instad of 0. Reported by Franc,ois Pinard. + +Mon Oct 30 21:28:52 1995 Ulrich Drepper + + * po2tbl.sed.in: Serious typo bug fixed by Jim Meyering. + +Sat Oct 28 23:20:47 1995 Ulrich Drepper + + * libgettext.h: Disable dcgettext optimization for Solaris 2.3. + + * localealias.c (alias_compare): + Peter Miller reported that tolower in some systems is + even dumber than I thought. Protect call by `isupper'. + +Fri Oct 27 22:22:51 1995 Ulrich Drepper + + * Makefile.in (libdir, includedir): New variables. + (install-src): Install libintl.a and libintl.h in correct dirs. + +Fri Oct 27 22:07:29 1995 Ulrich Drepper + + * Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c. + + * po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques. + + * localealias.c: + Fix typo and superflous test. Reported by Christian von Roques. + +Fri Oct 6 11:52:05 1995 Ulrich Drepper + + * finddomain.c (_nl_find_domain): + Correct some remainder from the pre-CEN syntax. Now + we don't have a constant number of successors anymore. + +Wed Sep 27 21:41:13 1995 Ulrich Drepper + + * Makefile.in (DISTFILES): Add libintl.h.glibc. + + * Makefile.in (dist-libc): Add goal for packing sources for glibc. + (COMSRCS, COMHDRS): Splitted to separate sources shared with glibc. + + * loadmsgcat.c: Forget to continue #if line. + + * localealias.c: + [_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name + space clean. + + * dcgettext.c, finddomain.c: Better comment to last change. + + * loadmsgcat.c: + [_LIBC]: Rename fstat, open, close, read, mmap, and munmap to + __fstat, __open, __close, __read, __mmap, and __munmap resp + to keep ANSI C name space clean. + + * finddomain.c: + [_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean. + + * dcgettext.c: + [_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to + keep ANSI C name space clean. + + * libgettext.h: + Include sys/types.h for those old SysV systems out there. + Reported by Francesco Potorti`. + + * loadmsgcat.c (use_mmap): Define if compiled for glibc. + + * bindtextdom.c: Include all those standard headers + unconditionally if _LIBC is defined. + + * finddomain.c: Fix 2 times defiend -> defined. + + * textdomain.c: Include libintl.h instead of libgettext.h when + compiling for glibc. Include all those standard headers + unconditionally if _LIBC is defined. + + * localealias.c, loadmsgcat.c: Prepare to be compiled in glibc. + + * gettext.c: + Include libintl.h instead of libgettext.h when compiling for glibc. + Get NULL from stddef.h if we compile for glibc. + + * finddomain.c: Include libintl.h instead of libgettext.h when + compiling for glibc. Include all those standard headers + unconditionally if _LIBC is defined. + + * dcgettext.c: Include all those standard headers unconditionally + if _LIBC is defined. + + * dgettext.c: If compiled in glibc include libintl.h instead of + libgettext.h. + (locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc. + + * dcgettext.c: If compiled in glibc include libintl.h instead of + libgettext.h. + (getcwd): Don't rely on HAVE_GETCWD when compiling for glibc. + + * bindtextdom.c: + If compiled in glibc include libintl.h instead of libgettext.h. + +Mon Sep 25 22:23:06 1995 Ulrich Drepper + + * localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0. + Reported by Marcus Daniels. + + * cat-compat.c (bindtextdomain): + String used in putenv must not be recycled. + Reported by Marcus Daniels. + + * libgettext.h (__USE_GNU_GETTEXT): + Additional symbol to signal that we use GNU gettext + library. + + * cat-compat.c (bindtextdomain): + Fix bug with the strange stpcpy replacement. + Reported by Nelson Beebe. + +Sat Sep 23 08:23:51 1995 Ulrich Drepper + + * cat-compat.c: Include for stpcpy prototype. + + * localealias.c (read_alias_file): + While expand strdup code temporary variable `cp' hided + higher level variable with same name. Rename to `tp'. + + * textdomain.c (textdomain): + Avoid warning by using temporary variable in strdup code. + + * finddomain.c (_nl_find_domain): Remove unused variable `application'. + +Thu Sep 21 15:51:44 1995 Ulrich Drepper + + * localealias.c (alias_compare): + Use strcasecmp() only if available. Else use + implementation in place. + + * intl-compat.c: + Wrapper functions now call *__ functions instead of __*. + + * libgettext.h: Declare prototypes for *__ functions instead for __*. + + * cat-compat.c, loadmsgcat.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + + * bindtextdom.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + Rename to bindtextdomain__ if not used in GNU C Library. + + * dgettext.c: + Rename function to dgettext__ if not used in GNU C Library. + + * gettext.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + Functions now called gettext__ if not used in GNU C Library. + + * dcgettext.c, localealias.c, textdomain.c, finddomain.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + +Sun Sep 17 23:14:49 1995 Ulrich Drepper + + * finddomain.c: Correct some bugs in handling of CEN standard + locale definitions. + +Thu Sep 7 01:49:28 1995 Ulrich Drepper + + * finddomain.c: Implement CEN syntax. + + * gettextP.h (loaded_domain): Extend number of successors to 31. + +Sat Aug 19 19:25:29 1995 Ulrich Drepper + + * Makefile.in (aliaspath): Remove path to X11 locale dir. + + * Makefile.in: Make install-src depend on install. This helps + gettext to install the sources and other packages can use the + install goal. + +Sat Aug 19 15:19:33 1995 Ulrich Drepper + + * Makefile.in (uninstall): Remove stuff installed by install-src. + +Tue Aug 15 13:13:53 1995 Ulrich Drepper + + * VERSION.in: Initial revision. + + * Makefile.in (DISTFILES): + Add VERSION file. This is not necessary for gettext, but + for other packages using this library. + +Tue Aug 15 06:16:44 1995 Ulrich Drepper + + * gettextP.h (_nl_find_domain): + New prototype after changing search strategy. + + * finddomain.c (_nl_find_domain): + We now try only to find a specified catalog. Fall back to other + catalogs listed in the locale list is now done in __dcgettext. + + * dcgettext.c (__dcgettext): + Now we provide message fall back even to different languages. + I.e. if a message is not available in one language all the other + in the locale list a tried. Formerly fall back was only possible + within one language. Implemented by moving one loop from + _nl_find_domain to here. + +Mon Aug 14 23:45:50 1995 Ulrich Drepper + + * Makefile.in (gettextsrcdir): + Directory where source of GNU gettext library are made + available. + (INSTALL, INSTALL_DATA): Programs used for installing sources. + (gettext-src): New. Rule to install GNU gettext sources for use in + gettextize shell script. + +Sun Aug 13 14:40:48 1995 Ulrich Drepper + + * loadmsgcat.c (_nl_load_domain): + Use mmap for loading only when munmap function is + also available. + + * Makefile.in (install): Depend on `all' goal. + +Wed Aug 9 11:04:33 1995 Ulrich Drepper + + * localealias.c (read_alias_file): + Do not overwrite '\n' when terminating alias value string. + + * localealias.c (read_alias_file): + Handle long lines. Ignore the rest not fitting in + the buffer after the initial `fgets' call. + +Wed Aug 9 00:54:29 1995 Ulrich Drepper + + * gettextP.h (_nl_load_domain): + Add prototype, replacing prototype for _nl_load_msg_cat. + + * finddomain.c (_nl_find_domain): + Remove unneeded variable filename and filename_len. + (expand_alias): Remove prototype because functions does not + exist anymore. + + * localealias.c (read_alias_file): + Change type of fname_len parameter to int. + (xmalloc): Add prototype. + + * loadmsgcat.c: Better prototypes for xmalloc. + +Tue Aug 8 22:30:39 1995 Ulrich Drepper + + * finddomain.c (_nl_find_domain): + Allow alias name to be constructed from the four components. + + * Makefile.in (aliaspath): New variable. Set to preliminary value. + (SOURCES): Add localealias.c. + (OBJECTS): Add localealias.o. + + * gettextP.h: Add prototype for _nl_expand_alias. + + * finddomain.c: Aliasing handled in intl/localealias.c. + + * localealias.c: Aliasing for locale names. + + * bindtextdom.c: Better prototypes for xmalloc and xstrdup. + +Mon Aug 7 23:47:42 1995 Ulrich Drepper + + * Makefile.in (DISTFILES): gettext.perl is now found in misc/. + + * cat-compat.c (bindtextdomain): + Correct implementation. dirname parameter was not used. + Reported by Marcus Daniels. + + * gettextP.h (loaded_domain): + New fields `successor' and `decided' for oo, lazy + message handling implementation. + + * dcgettext.c: + Adopt for oo, lazy message handliing. + Now we can inherit translations from less specific locales. + (find_msg): New function. + + * loadmsgcat.c, finddomain.c: + Complete rewrite. Implement oo, lazy message handling :-). + We now have an additional environment variable `LANGUAGE' with + a higher priority than LC_ALL for the LC_MESSAGE locale. + Here we can set a colon separated list of specifications each + of the form `language[_territory[.codeset]][@modifier]'. + +Sat Aug 5 09:55:42 1995 Ulrich Drepper + + * finddomain.c (unistd.h): + Include to get _PC_PATH_MAX defined on system having it. + +Fri Aug 4 22:42:00 1995 Ulrich Drepper + + * finddomain.c (stpcpy): Include prototype. + + * Makefile.in (dist): Remove `copying instead' message. + +Wed Aug 2 18:52:03 1995 Ulrich Drepper + + * Makefile.in (ID, TAGS): Do not use $^. + +Tue Aug 1 20:07:11 1995 Ulrich Drepper + + * Makefile.in (TAGS, ID): Use $^ as command argument. + (TAGS): Give etags -o option t write to current directory, + not $(srcdir). + (ID): Use $(srcdir) instead os $(top_srcdir)/src. + (distclean): Remove ID. + +Sun Jul 30 11:51:46 1995 Ulrich Drepper + + * Makefile.in (gnulocaledir): + New variable, always using share/ for data directory. + (DEFS): Add GNULOCALEDIR, used in finddomain.c. + + * finddomain.c (_nl_default_dirname): + Set to GNULOCALEDIR, because it always has to point + to the directory where GNU gettext Library writes it to. + + * intl-compat.c (textdomain, bindtextdomain): + Undefine macros before function definition. + +Sat Jul 22 01:10:02 1995 Ulrich Drepper + + * libgettext.h (_LIBINTL_H): + Protect definition in case where this file is included as + libgettext.h on Solaris machines. Add comment about this. + +Wed Jul 19 02:36:42 1995 Ulrich Drepper + + * intl-compat.c (textdomain): Correct typo. + +Wed Jul 19 01:51:35 1995 Ulrich Drepper + + * dcgettext.c (dcgettext): Function now called __dcgettext. + + * dgettext.c (dgettext): Now called __dgettext and calls + __dcgettext. + + * gettext.c (gettext): + Function now called __gettext and calls __dgettext. + + * textdomain.c (textdomain): Function now called __textdomain. + + * bindtextdom.c (bindtextdomain): Function now called + __bindtextdomain. + + * intl-compat.c: Initial revision. + + * Makefile.in (SOURCES): Add intl-compat.c. + (OBJECTS): We always compile the GNU gettext library functions. + OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o, + and intl-compat.o. + (GETTOBJS): Contains now only intl-compat.o. + + * libgettext.h: + Re-include protection matches dualistic character of libgettext.h. + For all functions in GNU gettext library define __ counter part. + + * finddomain.c (strchr): Define as index if not found in C library. + (_nl_find_domain): For relative paths paste / in between. + +Tue Jul 18 16:37:45 1995 Ulrich Drepper + + * loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h. + + * xopen-msg.sed: Fix bug with `msgstr ""' lines. + A little bit better comments. + +Tue Jul 18 01:18:27 1995 Ulrich Drepper + + * Makefile.in: + po-mode.el, makelinks, combine-sh are now found in ../misc. + + * po-mode.el, makelinks, combine-sh, elisp-comp: + Moved to ../misc/. + + * libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__. + +Sun Jul 16 22:33:02 1995 Ulrich Drepper + + * Makefile.in (INSTALL, INSTALL_DATA): New variables. + (install-data, uninstall): Install/uninstall .elc file. + + * po-mode.el (Installation comment): + Add .pox as possible extension of .po files. + +Sun Jul 16 13:23:27 1995 Ulrich Drepper + + * elisp-comp: Complete new version by Franc,ois: This does not + fail when not compiling in the source directory. + +Sun Jul 16 00:12:17 1995 Ulrich Drepper + + * Makefile.in (../po/cat-id-tbl.o): + Use $(MAKE) instead of make for recursive make. + + * Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh. + (install-exec): Add missing dummy goal. + (install-data, uninstall): @ in multi-line shell command at + beginning, not in front of echo. Reported by Eric Backus. + +Sat Jul 15 00:21:28 1995 Ulrich Drepper + + * Makefile.in (DISTFILES): + Rename libgettext.perl to gettext.perl to fit in 14 chars + file systems. + + * gettext.perl: + Rename to gettext.perl to fit in 14 chars file systems. + +Thu Jul 13 23:17:20 1995 Ulrich Drepper + + * cat-compat.c: If !STDC_HEADERS try to include malloc.h. + +Thu Jul 13 20:55:02 1995 Ulrich Drepper + + * po2tbl.sed.in: Pretty printing. + + * linux-msg.sed, xopen-msg.sed: + Correct bugs with handling substitute flags in branches. + + * hash-string.h (hash_string): + Old K&R compilers don't under stand `unsigned char'. + + * gettext.h (nls_uint32): + Some old K&R compilers (eg HP) don't understand `unsigned int'. + + * cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes. + +Thu Jul 13 01:34:33 1995 Ulrich Drepper + + * Makefile.in (ELCFILES): New variable. + (DISTFILES): Add elisp-comp. + Add implicit rule for .el -> .elc compilation. + (install-data): install $ELCFILES + (clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp. + + * elisp-comp: Initial revision + +Wed Jul 12 16:14:52 1995 Ulrich Drepper + + * Makefile.in: + cat-id-tbl.c is now found in po/. This enables us to use an identical + intl/ directory in all packages. + + * dcgettext.c (dcgettext): hashing does not work for table size <= 2. + + * textdomain.c: fix typo (#if def -> #if defined) + +Tue Jul 11 18:44:43 1995 Ulrich Drepper + + * Makefile.in (stamp-cat-id): use top_srcdir to address source files + (DISTFILES,distclean): move tupdate.perl to src/ + + * po-to-tbl.sed.in: + add additional jump to clear change flag to recognize multiline strings + +Tue Jul 11 01:32:50 1995 Ulrich Drepper + + * textdomain.c: Protect inclusion of stdlib.h and string.h. + + * loadmsgcat.c: Protect inclusion of stdlib.h. + + * libgettext.h: Protect inclusion of locale.h. + Allow use in C++ programs. + Define NULL is not happened already. + + * Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of + po-to-tbl.sed. + (distclean): remove po-to-tbl.sed and tupdate.perl. + + * tupdate.perl.in: Substitute Perl path even in exec line. + Don't include entries without translation from old .po file. + +Tue Jul 4 00:41:51 1995 Ulrich Drepper + + * tupdate.perl.in: use "Updated: " in msgid "". + + * cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR). + Define getenv if !__STDC__. + + * bindtextdom.c: Protect stdlib.h and string.h inclusion. + Define free if !__STDC__. + + * finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. + Define free if !__STDC__. + + * cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. + +Mon Jul 3 23:56:30 1995 Ulrich Drepper + + * Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR. + Remove unneeded $(srcdir) from Makefile.in dependency. + + * makelinks: Add copyright and short description. + + * po-mode.el: Last version for 0.7. + + * tupdate.perl.in: Fix die message. + + * dcgettext.c: Protect include of string.h. + + * gettext.c: Protect include of stdlib.h and further tries to get NULL. + + * finddomain.c: Some corrections in includes. + + * Makefile.in (INCLUDES): Prune list correct path to Makefile.in. + + * po-to-tbl.sed: Adopt for new .po file format. + + * linux-msg.sed, xopen-msg.sed: Adopt for new .po file format. + +Sun Jul 2 23:55:03 1995 Ulrich Drepper + + * tupdate.perl.in: Complete rewrite for new .po file format. + +Sun Jul 2 02:06:50 1995 Ulrich Drepper + + * First official release. This directory contains all the code + needed to internationalize own packages. It provides functions + which allow to use the X/Open catgets function with an interface + like the Uniforum gettext function. For system which does not + have neither of those a complete implementation is provided. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,624 @@ +/* Implementation of the dcgettext(3) function. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include +#ifndef errno +extern int errno; +#endif +#ifndef __set_errno +# define __set_errno(val) errno = (val) +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include +#else +# include +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include "gettext.h" +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgettext.h" +#endif +#include "hash-string.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define getcwd __getcwd +# ifndef stpcpy +# define stpcpy __stpcpy +# endif +#else +# if !defined HAVE_GETCWD +char *getwd (); +# define getcwd(buf, max) getwd (buf) +# else +char *getcwd (); +# endif +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Amount to increase buffer size by in each try. */ +#define PATH_INCR 32 + +/* The following is from pathmax.h. */ +/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define + PATH_MAX but might cause redefinition warnings when sys/param.h is + later included (as on MORE/BSD 4.3). */ +#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__)) +# include +#endif + +#ifndef _POSIX_PATH_MAX +# define _POSIX_PATH_MAX 255 +#endif + +#if !defined(PATH_MAX) && defined(_PC_PATH_MAX) +# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) +#endif + +/* Don't include sys/param.h if it already has been. */ +#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN) +# include +#endif + +#if !defined(PATH_MAX) && defined(MAXPATHLEN) +# define PATH_MAX MAXPATHLEN +#endif + +#ifndef PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +#endif + +/* XPG3 defines the result of `setlocale (category, NULL)' as: + ``Directs `setlocale()' to query `category' and return the current + setting of `local'.'' + However it does not specify the exact format. And even worse: POSIX + defines this not at all. So we can use this feature only on selected + system (e.g. those using GNU C Library). */ +#ifdef _LIBC +# define HAVE_LOCALE_NULL +#endif + +/* Name of the default domain used for gettext(3) prior any call to + textdomain(3). The default value for this is "messages". */ +const char _nl_default_default_domain[] = "messages"; + +/* Value used as the default domain for gettext(3). */ +const char *_nl_current_default_domain = _nl_default_default_domain; + +/* Contains the default location of the message catalogs. */ +const char _nl_default_dirname[] = GNULOCALEDIR; + +/* List with bindings of specific domains created by bindtextdomain() + calls. */ +struct binding *_nl_domain_bindings; + +/* Prototypes for local functions. */ +static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file, + const char *msgid)) internal_function; +static const char *category_to_name PARAMS ((int category)) internal_function; +static const char *guess_category_value PARAMS ((int category, + const char *categoryname)) + internal_function; + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +#endif /* have alloca */ + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCGETTEXT __dcgettext +#else +# define DCGETTEXT dcgettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCGETTEXT (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + struct loaded_l10nfile *domain; + struct binding *binding; + const char *categoryname; + const char *categoryvalue; + char *dirname, *xdomainname; + char *single_locale; + char *retval; + int saved_errno = errno; + + /* If no real MSGID is given return NULL. */ + if (msgid == NULL) + return NULL; + + /* If DOMAINNAME is NULL, we are interested in the default domain. If + CATEGORY is not LC_MESSAGES this might not make much sense but the + defintion left this undefined. */ + if (domainname == NULL) + domainname = _nl_current_default_domain; + + /* First find matching binding. */ + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding == NULL) + dirname = (char *) _nl_default_dirname; + else if (binding->dirname[0] == '/') + dirname = binding->dirname; + else + { + /* We have a relative path. Make it absolute now. */ + size_t dirname_len = strlen (binding->dirname) + 1; + size_t path_max; + char *ret; + + path_max = (unsigned) PATH_MAX; + path_max += 2; /* The getcwd docs say to do this. */ + + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + + __set_errno (0); + while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE) + { + path_max += PATH_INCR; + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + __set_errno (0); + } + + if (ret == NULL) + { + /* We cannot get the current working directory. Don't signal an + error but simply return the default string. */ + FREE_BLOCKS (block_list); + __set_errno (saved_errno); + return (char *) msgid; + } + + stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); + } + + /* Now determine the symbolic name of CATEGORY and its value. */ + categoryname = category_to_name (category); + categoryvalue = guess_category_value (category, categoryname); + + xdomainname = (char *) alloca (strlen (categoryname) + + strlen (domainname) + 5); + ADD_BLOCK (block_list, xdomainname); + + stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), + domainname), + ".mo"); + + /* Creating working area. */ + single_locale = (char *) alloca (strlen (categoryvalue) + 1); + ADD_BLOCK (block_list, single_locale); + + + /* Search for the given string. This is a loop because we perhaps + got an ordered list of languages to consider for th translation. */ + while (1) + { + /* Make CATEGORYVALUE point to the next element of the list. */ + while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') + ++categoryvalue; + if (categoryvalue[0] == '\0') + { + /* The whole contents of CATEGORYVALUE has been searched but + no valid entry has been found. We solve this situation + by implicitly appending a "C" entry, i.e. no translation + will take place. */ + single_locale[0] = 'C'; + single_locale[1] = '\0'; + } + else + { + char *cp = single_locale; + while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') + *cp++ = *categoryvalue++; + *cp = '\0'; + } + + /* If the current locale value is C (or POSIX) we don't load a + domain. Return the MSGID. */ + if (strcmp (single_locale, "C") == 0 + || strcmp (single_locale, "POSIX") == 0) + { + FREE_BLOCKS (block_list); + __set_errno (saved_errno); + return (char *) msgid; + } + + + /* Find structure describing the message catalog matching the + DOMAINNAME and CATEGORY. */ + domain = _nl_find_domain (dirname, single_locale, xdomainname); + + if (domain != NULL) + { + retval = find_msg (domain, msgid); + + if (retval == NULL) + { + int cnt; + + for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) + { + retval = find_msg (domain->successor[cnt], msgid); + + if (retval != NULL) + break; + } + } + + if (retval != NULL) + { + FREE_BLOCKS (block_list); + __set_errno (saved_errno); + return retval; + } + } + } + /* NOTREACHED */ +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dcgettext, dcgettext); +#endif + + +static char * +internal_function +find_msg (domain_file, msgid) + struct loaded_l10nfile *domain_file; + const char *msgid; +{ + size_t top, act, bottom; + struct loaded_domain *domain; + + if (domain_file->decided == 0) + _nl_load_domain (domain_file); + + if (domain_file->data == NULL) + return NULL; + + domain = (struct loaded_domain *) domain_file->data; + + /* Locate the MSGID and its translation. */ + if (domain->hash_size > 2 && domain->hash_tab != NULL) + { + /* Use the hashing table. */ + nls_uint32 len = strlen (msgid); + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); + + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len + && strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) == 0) + return (char *) domain->data + W (domain->must_swap, + domain->trans_tab[nstr - 1].offset); + + while (1) + { + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + + nstr = W (domain->must_swap, domain->hash_tab[idx]); + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len + && strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) + == 0) + return (char *) domain->data + + W (domain->must_swap, domain->trans_tab[nstr - 1].offset); + } + /* NOTREACHED */ + } + + /* Now we try the default method: binary search in the sorted + array of messages. */ + bottom = 0; + top = domain->nstrings; + while (bottom < top) + { + int cmp_val; + + act = (bottom + top) / 2; + cmp_val = strcmp (msgid, domain->data + + W (domain->must_swap, + domain->orig_tab[act].offset)); + if (cmp_val < 0) + top = act; + else if (cmp_val > 0) + bottom = act + 1; + else + break; + } + + /* If an translation is found return this. */ + return bottom >= top ? NULL : (char *) domain->data + + W (domain->must_swap, + domain->trans_tab[act].offset); +} + + +/* Return string representation of locale CATEGORY. */ +static const char * +internal_function +category_to_name (category) + int category; +{ + const char *retval; + + switch (category) + { +#ifdef LC_COLLATE + case LC_COLLATE: + retval = "LC_COLLATE"; + break; +#endif +#ifdef LC_CTYPE + case LC_CTYPE: + retval = "LC_CTYPE"; + break; +#endif +#ifdef LC_MONETARY + case LC_MONETARY: + retval = "LC_MONETARY"; + break; +#endif +#ifdef LC_NUMERIC + case LC_NUMERIC: + retval = "LC_NUMERIC"; + break; +#endif +#ifdef LC_TIME + case LC_TIME: + retval = "LC_TIME"; + break; +#endif +#ifdef LC_MESSAGES + case LC_MESSAGES: + retval = "LC_MESSAGES"; + break; +#endif +#ifdef LC_RESPONSE + case LC_RESPONSE: + retval = "LC_RESPONSE"; + break; +#endif +#ifdef LC_ALL + case LC_ALL: + /* This might not make sense but is perhaps better than any other + value. */ + retval = "LC_ALL"; + break; +#endif + default: + /* If you have a better idea for a default value let me know. */ + retval = "LC_XXX"; + } + + return retval; +} + +/* Guess value of current locale from value of the environment variables. */ +static const char * +internal_function +guess_category_value (category, categoryname) + int category; + const char *categoryname; +{ + const char *retval; + + /* The highest priority value is the `LANGUAGE' environment + variable. This is a GNU extension. */ + retval = getenv ("LANGUAGE"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* `LANGUAGE' is not set. So we have to proceed with the POSIX + methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some + systems this can be done by the `setlocale' function itself. */ +#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL + return setlocale (category, NULL); +#else + /* Setting of LC_ALL overwrites all other. */ + retval = getenv ("LC_ALL"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Next comes the name of the desired category. */ + retval = getenv (categoryname); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Last possibility is the LANG environment variable. */ + retval = getenv ("LANG"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* We use C as the default domain. POSIX says this is implementation + defined. */ + return "C"; +#endif +} + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif + + +#ifdef _LIBC +/* If we want to free all resources we have to do some work at + program's end. */ +static void __attribute__ ((unused)) +free_mem (void) +{ + struct binding *runp; + + for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next) + { + free (runp->domainname); + if (runp->dirname != _nl_default_dirname) + /* Yes, this is a pointer comparison. */ + free (runp->dirname); + } + + if (_nl_current_default_domain != _nl_default_default_domain) + /* Yes, again a pointer comparison. */ + free ((char *) _nl_current_default_domain); +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,59 @@ +/* Implementation of the dgettext(3) function + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if defined HAVE_LOCALE_H || defined _LIBC +# include +#endif + +#ifdef _LIBC +# include +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DGETTEXT __dgettext +# define DCGETTEXT __dcgettext +#else +# define DGETTEXT dgettext__ +# define DCGETTEXT dcgettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale. */ +char * +DGETTEXT (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return DCGETTEXT (domainname, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dgettext, dgettext); +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,188 @@ +/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Contributed by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include +#else +# include +#endif +#include + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +int +_nl_explode_name (name, language, modifier, territory, codeset, + normalized_codeset, special, sponsor, revision) + char *name; + const char **language; + const char **modifier; + const char **territory; + const char **codeset; + const char **normalized_codeset; + const char **special; + const char **sponsor; + const char **revision; +{ + enum { undecided, xpg, cen } syntax; + char *cp; + int mask; + + *modifier = NULL; + *territory = NULL; + *codeset = NULL; + *normalized_codeset = NULL; + *special = NULL; + *sponsor = NULL; + *revision = NULL; + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = 0; + syntax = undecided; + *language = cp = name; + while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',') + ++cp; + + if (*language == cp) + /* This does not make sense: language has to be specified. Use + this entry as it is without exploding. Perhaps it is an alias. */ + cp = strchr (*language, '\0'); + else if (cp[0] == '_') + { + /* Next is the territory. */ + cp[0] = '\0'; + *territory = ++cp; + + while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= TERRITORY; + + if (cp[0] == '.') + { + /* Next is the codeset. */ + syntax = xpg; + cp[0] = '\0'; + *codeset = ++cp; + + while (cp[0] != '\0' && cp[0] != '@') + ++cp; + + mask |= XPG_CODESET; + + if (*codeset != cp && (*codeset)[0] != '\0') + { + *normalized_codeset = _nl_normalize_codeset (*codeset, + cp - *codeset); + if (strcmp (*codeset, *normalized_codeset) == 0) + free ((char *) *normalized_codeset); + else + mask |= XPG_NORM_CODESET; + } + } + } + + if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) + { + /* Next is the modifier. */ + syntax = cp[0] == '@' ? xpg : cen; + cp[0] = '\0'; + *modifier = ++cp; + + while (syntax == cen && cp[0] != '\0' && cp[0] != '+' + && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= XPG_MODIFIER | CEN_AUDIENCE; + } + + if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) + { + syntax = cen; + + if (cp[0] == '+') + { + /* Next is special application (CEN syntax). */ + cp[0] = '\0'; + *special = ++cp; + + while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= CEN_SPECIAL; + } + + if (cp[0] == ',') + { + /* Next is sponsor (CEN syntax). */ + cp[0] = '\0'; + *sponsor = ++cp; + + while (cp[0] != '\0' && cp[0] != '_') + ++cp; + + mask |= CEN_SPONSOR; + } + + if (cp[0] == '_') + { + /* Next is revision (CEN syntax). */ + cp[0] = '\0'; + *revision = ++cp; + + mask |= CEN_REVISION; + } + } + + /* For CEN syntax values it might be important to have the + separator character in the file name, not for XPG syntax. */ + if (syntax == xpg) + { + if (*territory != NULL && (*territory)[0] == '\0') + mask &= ~TERRITORY; + + if (*codeset != NULL && (*codeset)[0] == '\0') + mask &= ~XPG_CODESET; + + if (*modifier != NULL && (*modifier)[0] == '\0') + mask &= ~XPG_MODIFIER; + } + + return mask; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,216 @@ +/* Handle list of needed message catalogs + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#if defined STDC_HEADERS || defined _LIBC +# include +#else +# ifdef HAVE_MALLOC_H +# include +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include +#else +# include +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include "gettext.h" +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ +/* List of already loaded domains. */ +static struct loaded_l10nfile *_nl_loaded_domains; + + +/* Return a data structure describing the message catalog described by + the DOMAINNAME and CATEGORY parameters with respect to the currently + established bindings. */ +struct loaded_l10nfile * +internal_function +_nl_find_domain (dirname, locale, domainname) + const char *dirname; + char *locale; + const char *domainname; +{ + struct loaded_l10nfile *retval; + const char *language; + const char *modifier; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *special; + const char *sponsor; + const char *revision; + const char *alias_value; + int mask; + + /* LOCALE can consist of up to four recognized parts for the XPG syntax: + + language[_territory[.codeset]][@modifier] + + and six parts for the CEN syntax: + + language[_territory][+audience][+special][,[sponsor][_revision]] + + Beside the first part all of them are allowed to be missing. If + the full specified locale is not found, the less specific one are + looked for. The various parts will be stripped off according to + the following order: + (1) revision + (2) sponsor + (3) special + (4) codeset + (5) normalized codeset + (6) territory + (7) audience/modifier + */ + + /* If we have already tested for this locale entry there has to + be one data set in the list of loaded domains. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, 0, locale, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, domainname, 0); + if (retval != NULL) + { + /* We know something about this locale. */ + int cnt; + + if (retval->decided == 0) + _nl_load_domain (retval); + + if (retval->data != NULL) + return retval; + + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt]); + + if (retval->successor[cnt]->data != NULL) + break; + } + return cnt >= 0 ? retval : NULL; + /* NOTREACHED */ + } + + /* See whether the locale value is an alias. If yes its value + *overwrites* the alias name. No test for the original value is + done. */ + alias_value = _nl_expand_alias (locale); + if (alias_value != NULL) + { +#if defined _LIBC || defined HAVE_STRDUP + locale = strdup (alias_value); + if (locale == NULL) + return NULL; +#else + size_t len = strlen (alias_value) + 1; + locale = (char *) malloc (len); + if (locale == NULL) + return NULL; + + memcpy (locale, alias_value, len); +#endif + } + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = _nl_explode_name (locale, &language, &modifier, &territory, + &codeset, &normalized_codeset, &special, + &sponsor, &revision); + + /* Create all possible locale entries which might be interested in + generalization. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, mask, language, territory, + codeset, normalized_codeset, modifier, special, + sponsor, revision, domainname, 1); + if (retval == NULL) + /* This means we are out of core. */ + return NULL; + + if (retval->decided == 0) + _nl_load_domain (retval); + if (retval->data == NULL) + { + int cnt; + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt]); + if (retval->successor[cnt]->data != NULL) + break; + } + } + + /* The room for an alias was dynamically allocated. Free it now. */ + if (alias_value != NULL) + free (locale); + + return retval; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + struct loaded_l10nfile *runp = _nl_loaded_domains; + + while (runp != NULL) + { + struct loaded_l10nfile *here = runp; + if (runp->data != NULL) + _nl_unload_domain ((struct loaded_domain *) runp->data); + runp = runp->next; + free (here); + } +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,70 @@ +/* Implementation of gettext(3) function. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# define __need_NULL +# include +#else +# ifdef STDC_HEADERS +# include /* Just for NULL. */ +# else +# ifdef HAVE_STRING_H +# include +# else +# define NULL ((void *) 0) +# endif +# endif +#endif + +#ifdef _LIBC +# include +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define GETTEXT __gettext +# define DGETTEXT __dgettext +#else +# define GETTEXT gettext__ +# define DGETTEXT dgettext__ +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +GETTEXT (msgid) + const char *msgid; +{ + return DGETTEXT (NULL, msgid); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__gettext, gettext); +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,105 @@ +/* Internal header for GNU gettext internationalization functions. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _GETTEXT_H +#define _GETTEXT_H 1 + +#include + +#if HAVE_LIMITS_H || _LIBC +# include +#endif + +/* @@ end of prolog @@ */ + +/* The magic number of the GNU message catalog format. */ +#define _MAGIC 0x950412de +#define _MAGIC_SWAPPED 0xde120495 + +/* Revision number of the currently used .mo (binary) file format. */ +#define MO_REVISION_NUMBER 0 + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + doing that would require that the configure script compile and *run* + the resulting executable. Locally running cross-compiled executables + is usually not possible. */ + +#if __STDC__ +# define UINT_MAX_32_BITS 4294967295U +#else +# define UINT_MAX_32_BITS 0xFFFFFFFF +#endif + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have ) have 64+-bit integral types. */ + +#ifndef UINT_MAX +# define UINT_MAX UINT_MAX_32_BITS +#endif + +#if UINT_MAX == UINT_MAX_32_BITS +typedef unsigned nls_uint32; +#else +# if USHRT_MAX == UINT_MAX_32_BITS +typedef unsigned short nls_uint32; +# else +# if ULONG_MAX == UINT_MAX_32_BITS +typedef unsigned long nls_uint32; +# else + /* The following line is intended to throw an error. Using #error is + not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +#endif + + +/* Header for binary .mo file format. */ +struct mo_file_header +{ + /* The magic number. */ + nls_uint32 magic; + /* The revision number of the file format. */ + nls_uint32 revision; + /* The number of strings pairs. */ + nls_uint32 nstrings; + /* Offset of table with start offsets of original strings. */ + nls_uint32 orig_tab_offset; + /* Offset of table with start offsets of translation strings. */ + nls_uint32 trans_tab_offset; + /* Size of hashing table. */ + nls_uint32 hash_tab_size; + /* Offset of first hashing entry. */ + nls_uint32 hash_tab_offset; +}; + +struct string_desc +{ + /* Length of addressed string. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* @@ begin of epilog @@ */ + +#endif /* gettext.h */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,89 @@ +/* Header describing internals of gettext library + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _GETTEXTP_H +#define _GETTEXTP_H + +#include "loadinfo.h" + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +#ifndef W +# define W(flag, data) ((flag) ? SWAP (data) : (data)) +#endif + + +#ifdef _LIBC +# include +# define SWAP(i) bswap_32 (i) +#else +static nls_uint32 SWAP PARAMS ((nls_uint32 i)); + +static inline nls_uint32 +SWAP (i) + nls_uint32 i; +{ + return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); +} +#endif + + +struct loaded_domain +{ + const char *data; + int use_mmap; + size_t mmap_size; + int must_swap; + nls_uint32 nstrings; + struct string_desc *orig_tab; + struct string_desc *trans_tab; + nls_uint32 hash_size; + nls_uint32 *hash_tab; +}; + +struct binding +{ + struct binding *next; + char *domainname; + char *dirname; +}; + +struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, + char *__locale, + const char *__domainname)) + internal_function; +void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain)) + internal_function; +void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) + internal_function; + +/* @@ begin of epilog @@ */ + +#endif /* gettextP.h */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,59 @@ +/* Implements a string hashing function. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +/* We assume to have `unsigned long int' value with at least 32 bits. */ +#define HASHWORDBITS 32 + + +/* Defines the so called `hashpjw' function by P.J. Weinberger + [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, + 1986, 1987 Bell Telephone Laboratories, Inc.] */ +static unsigned long hash_string PARAMS ((const char *__str_param)); + +static inline unsigned long +hash_string (str_param) + const char *str_param; +{ + unsigned long int hval, g; + const char *str = str_param; + + /* Compute the hash value for the given string. */ + hval = 0; + while (*str != '\0') + { + hval <<= 4; + hval += (unsigned long) *str++; + g = hval & ((unsigned long) 0xf << (HASHWORDBITS - 4)); + if (g != 0) + { + hval ^= g >> (HASHWORDBITS - 8); + hval ^= g; + } + } + return hval; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,76 @@ +/* intl-compat.c - Stub functions to call gettext functions from GNU gettext + Library. + Copyright (C) 1995 Software Foundation, Inc. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "libgettext.h" + +/* @@ end of prolog @@ */ + + +#undef gettext +#undef dgettext +#undef dcgettext +#undef textdomain +#undef bindtextdomain + + +char * +bindtextdomain (domainname, dirname) + const char *domainname; + const char *dirname; +{ + return bindtextdomain__ (domainname, dirname); +} + + +char * +dcgettext (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ + return dcgettext__ (domainname, msgid, category); +} + + +char * +dgettext (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return dgettext__ (domainname, msgid); +} + + +char * +gettext (msgid) + const char *msgid; +{ + return gettext__ (msgid); +} + + +char * +textdomain (domainname) + const char *domainname; +{ + return textdomain__ (domainname); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,411 @@ +/* Handle list of needed message catalogs + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + Contributed by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include +#else +# include +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined _LIBC || defined HAVE_ARGZ_H +# include +#endif +#include +#include + +#if defined STDC_HEADERS || defined _LIBC +# include +#endif + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# ifndef stpcpy +# define stpcpy(dest, src) __stpcpy(dest, src) +# endif +#else +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Define function which are usually not available. */ + +#if !defined _LIBC && !defined HAVE___ARGZ_COUNT +/* Returns the number of strings in ARGZ. */ +static size_t argz_count__ PARAMS ((const char *argz, size_t len)); + +static size_t +argz_count__ (argz, len) + const char *argz; + size_t len; +{ + size_t count = 0; + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len + 1; + len -= part_len + 1; + count++; + } + return count; +} +# undef __argz_count +# define __argz_count(argz, len) argz_count__ (argz, len) +#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ + +#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY +/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's + except the last into the character SEP. */ +static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep)); + +static void +argz_stringify__ (argz, len, sep) + char *argz; + size_t len; + int sep; +{ + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len; + len -= part_len + 1; + if (len > 0) + *argz++ = sep; + } +} +# undef __argz_stringify +# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) +#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ + +#if !defined _LIBC && !defined HAVE___ARGZ_NEXT +static char *argz_next__ PARAMS ((char *argz, size_t argz_len, + const char *entry)); + +static char * +argz_next__ (argz, argz_len, entry) + char *argz; + size_t argz_len; + const char *entry; +{ + if (entry) + { + if (entry < argz + argz_len) + entry = strchr (entry, '\0') + 1; + + return entry >= argz + argz_len ? NULL : (char *) entry; + } + else + if (argz_len > 0) + return argz; + else + return 0; +} +# undef __argz_next +# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) +#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ + + +/* Return number of bits set in X. */ +static int pop PARAMS ((int x)); + +static inline int +pop (x) + int x; +{ + /* We assume that no more than 16 bits are used. */ + x = ((x & ~0x5555) >> 1) + (x & 0x5555); + x = ((x & ~0x3333) >> 2) + (x & 0x3333); + x = ((x >> 4) + x) & 0x0f0f; + x = ((x >> 8) + x) & 0xff; + + return x; +} + + +struct loaded_l10nfile * +_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, + territory, codeset, normalized_codeset, modifier, special, + sponsor, revision, filename, do_allocate) + struct loaded_l10nfile **l10nfile_list; + const char *dirlist; + size_t dirlist_len; + int mask; + const char *language; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *modifier; + const char *special; + const char *sponsor; + const char *revision; + const char *filename; + int do_allocate; +{ + char *abs_filename; + struct loaded_l10nfile *last = NULL; + struct loaded_l10nfile *retval; + char *cp; + size_t entries; + int cnt; + + /* Allocate room for the full file name. */ + abs_filename = (char *) malloc (dirlist_len + + strlen (language) + + ((mask & TERRITORY) != 0 + ? strlen (territory) + 1 : 0) + + ((mask & XPG_CODESET) != 0 + ? strlen (codeset) + 1 : 0) + + ((mask & XPG_NORM_CODESET) != 0 + ? strlen (normalized_codeset) + 1 : 0) + + (((mask & XPG_MODIFIER) != 0 + || (mask & CEN_AUDIENCE) != 0) + ? strlen (modifier) + 1 : 0) + + ((mask & CEN_SPECIAL) != 0 + ? strlen (special) + 1 : 0) + + (((mask & CEN_SPONSOR) != 0 + || (mask & CEN_REVISION) != 0) + ? (1 + ((mask & CEN_SPONSOR) != 0 + ? strlen (sponsor) + 1 : 0) + + ((mask & CEN_REVISION) != 0 + ? strlen (revision) + 1 : 0)) : 0) + + 1 + strlen (filename) + 1); + + if (abs_filename == NULL) + return NULL; + + retval = NULL; + last = NULL; + + /* Construct file name. */ + memcpy (abs_filename, dirlist, dirlist_len); + __argz_stringify (abs_filename, dirlist_len, ':'); + cp = abs_filename + (dirlist_len - 1); + *cp++ = '/'; + cp = stpcpy (cp, language); + + if ((mask & TERRITORY) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, territory); + } + if ((mask & XPG_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, codeset); + } + if ((mask & XPG_NORM_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, normalized_codeset); + } + if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) + { + /* This component can be part of both syntaces but has different + leading characters. For CEN we use `+', else `@'. */ + *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; + cp = stpcpy (cp, modifier); + } + if ((mask & CEN_SPECIAL) != 0) + { + *cp++ = '+'; + cp = stpcpy (cp, special); + } + if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) + { + *cp++ = ','; + if ((mask & CEN_SPONSOR) != 0) + cp = stpcpy (cp, sponsor); + if ((mask & CEN_REVISION) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, revision); + } + } + + *cp++ = '/'; + stpcpy (cp, filename); + + /* Look in list of already loaded domains whether it is already + available. */ + last = NULL; + for (retval = *l10nfile_list; retval != NULL; retval = retval->next) + if (retval->filename != NULL) + { + int compare = strcmp (retval->filename, abs_filename); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It's not in the list. */ + retval = NULL; + break; + } + + last = retval; + } + + if (retval != NULL || do_allocate == 0) + { + free (abs_filename); + return retval; + } + + retval = (struct loaded_l10nfile *) + malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len) + * (1 << pop (mask)) + * sizeof (struct loaded_l10nfile *))); + if (retval == NULL) + return NULL; + + retval->filename = abs_filename; + retval->decided = (__argz_count (dirlist, dirlist_len) != 1 + || ((mask & XPG_CODESET) != 0 + && (mask & XPG_NORM_CODESET) != 0)); + retval->data = NULL; + + if (last == NULL) + { + retval->next = *l10nfile_list; + *l10nfile_list = retval; + } + else + { + retval->next = last->next; + last->next = retval; + } + + entries = 0; + /* If the DIRLIST is a real list the RETVAL entry corresponds not to + a real file. So we have to use the DIRLIST separation mechanism + of the inner loop. */ + cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask; + for (; cnt >= 0; --cnt) + if ((cnt & ~mask) == 0 + && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) + && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) + { + /* Iterate over all elements of the DIRLIST. */ + char *dir = NULL; + + while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) + != NULL) + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, + language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + retval->successor[entries] = NULL; + + return retval; +} + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. */ +const char * +_nl_normalize_codeset (codeset, name_len) + const unsigned char *codeset; + size_t name_len; +{ + int len = 0; + int only_digit = 1; + char *retval; + char *wp; + size_t cnt; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalnum (codeset[cnt])) + { + ++len; + + if (isalpha (codeset[cnt])) + only_digit = 0; + } + + retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); + + if (retval != NULL) + { + if (only_digit) + wp = stpcpy (retval, "iso"); + else + wp = retval; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalpha (codeset[cnt])) + *wp++ = tolower (codeset[cnt]); + else if (isdigit (codeset[cnt])) + *wp++ = codeset[cnt]; + + *wp = '\0'; + } + + return (const char *) retval; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,182 @@ +/* Message catalogs for internationalization. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Because on some systems (e.g. Solaris) we sometimes have to include + the systems libintl.h as well as this file we have more complex + include protection above. But the systems header might perhaps also + define _LIBINTL_H and therefore we have to protect the definition here. */ + +#if !defined _LIBINTL_H || !defined _LIBGETTEXT_H +#ifndef _LIBINTL_H +# define _LIBINTL_H 1 +#endif +#define _LIBGETTEXT_H 1 + +/* We define an additional symbol to signal that we use the GNU + implementation of gettext. */ +#define __USE_GNU_GETTEXT 1 + +#include + +#if HAVE_LOCALE_H +# include +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ || defined __cplusplus +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef NULL +# if !defined __cplusplus || defined __GNUC__ +# define NULL ((void *) 0) +# else +# define NULL (0) +# endif +#endif + +#if !HAVE_LC_MESSAGES +/* This value determines the behaviour of the gettext() and dgettext() + function. But some system does not have this defined. Define it + to a default value. */ +# define LC_MESSAGES (-1) +#endif + + +/* Declarations for gettext-using-catgets interface. Derived from + Jim Meyering's libintl.h. */ +struct _msg_ent +{ + const char *_msg; + int _msg_number; +}; + + +#if HAVE_CATGETS +/* These two variables are defined in the automatically by po-to-tbl.sed + generated file `cat-id-tbl.c'. */ +extern const struct _msg_ent _msg_tbl[]; +extern int _msg_tbl_length; +#endif + + +/* For automatical extraction of messages sometimes no real + translation is needed. Instead the string itself is the result. */ +#define gettext_noop(Str) (Str) + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +extern char *gettext PARAMS ((const char *__msgid)); +extern char *gettext__ PARAMS ((const char *__msgid)); + +/* Look up MSGID in the DOMAINNAME message catalog for the current + LC_MESSAGES locale. */ +extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid)); +extern char *dgettext__ PARAMS ((const char *__domainname, + const char *__msgid)); + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid, + int __category)); +extern char *dcgettext__ PARAMS ((const char *__domainname, + const char *__msgid, int __category)); + + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +extern char *textdomain PARAMS ((const char *__domainname)); +extern char *textdomain__ PARAMS ((const char *__domainname)); + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +extern char *bindtextdomain PARAMS ((const char *__domainname, + const char *__dirname)); +extern char *bindtextdomain__ PARAMS ((const char *__domainname, + const char *__dirname)); + +#if ENABLE_NLS + +/* Solaris 2.3 has the gettext function but dcgettext is missing. + So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4 + has dcgettext. */ +# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT) + +# define gettext(Msgid) \ + dgettext (NULL, Msgid) + +# define dgettext(Domainname, Msgid) \ + dcgettext (Domainname, Msgid, LC_MESSAGES) + +# if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7 +/* This global variable is defined in loadmsgcat.c. We need a sign, + whether a new catalog was loaded, which can be associated with all + translations. */ +extern int _nl_msg_cat_cntr; + +# define dcgettext(Domainname, Msgid, Category) \ + (__extension__ \ + ({ \ + char *__result; \ + if (__builtin_constant_p (Msgid)) \ + { \ + static char *__translation__; \ + static int __catalog_counter__; \ + if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \ + { \ + __translation__ = \ + dcgettext__ (Domainname, Msgid, Category); \ + __catalog_counter__ = _nl_msg_cat_cntr; \ + } \ + __result = __translation__; \ + } \ + else \ + __result = dcgettext__ (Domainname, Msgid, Category); \ + __result; \ + })) +# endif +# endif + +#else + +# define gettext(Msgid) (Msgid) +# define dgettext(Domainname, Msgid) (Msgid) +# define dcgettext(Domainname, Msgid, Category) (Msgid) +# define textdomain(Domainname) ((char *) Domainname) +# define bindtextdomain(Domainname, Dirname) ((char *) Dirname) + +#endif + +/* @@ begin of epilog @@ */ + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,100 @@ +# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file +# Copyright (C) 1995 Free Software Foundation, Inc. +# Ulrich Drepper , 1995. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# +# The first directive in the .msg should be the definition of the +# message set number. We use always set number 1. +# +1 { + i\ +$set 1 # Automatically created by po2msg.sed + h + s/.*/0/ + x +} +# +# Mitch's old catalog format does not allow comments. +# +# We copy the original message as a comment into the .msg file. +# +/^msgid/ { + s/msgid[ ]*"// +# +# This does not work now with the new format. +# /"$/! { +# s/\\$// +# s/$/ ... (more lines following)"/ +# } + x +# The following nice solution is by +# Bruno + td +# Increment a decimal number in pattern space. +# First hide trailing `9' digits. + :d + s/9\(_*\)$/_\1/ + td +# Assure at least one digit is available. + s/^\(_*\)$/0\1/ +# Increment the last digit. + s/8\(_*\)$/9\1/ + s/7\(_*\)$/8\1/ + s/6\(_*\)$/7\1/ + s/5\(_*\)$/6\1/ + s/4\(_*\)$/5\1/ + s/3\(_*\)$/4\1/ + s/2\(_*\)$/3\1/ + s/1\(_*\)$/2\1/ + s/0\(_*\)$/1\1/ +# Convert the hidden `9' digits to `0's. + s/_/0/g + x + G + s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p +} +# +# The .msg file contains, other then the .po file, only the translations +# but each given a unique ID. Starting from 1 and incrementing by 1 for +# each message we assign them to the messages. +# It is important that the .po file used to generate the cat-id-tbl.c file +# (with po-to-tbl) is the same as the one used here. (At least the order +# of declarations must not be changed.) +# +/^msgstr/ { + s/msgstr[ ]*"\(.*\)"/# \1/ +# Clear substitution flag. + tb +# Append the next line. + :b + N +# Look whether second part is continuation line. + s/\(.*\n\)"\(.*\)"/\1\2/ +# Yes, then branch. + ta + P + D +# Note that D includes a jump to the start!! +# We found a continuation line. But before printing insert '\'. + :a + s/\(.*\)\(\n.*\)/\1\\\2/ + P +# We cannot use D here. + s/.*\n\(.*\)/\1/ + tb +} +d diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,76 @@ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +/* Encoding of locale name parts. */ +#define CEN_REVISION 1 +#define CEN_SPONSOR 2 +#define CEN_SPECIAL 4 +#define XPG_NORM_CODESET 8 +#define XPG_CODESET 16 +#define TERRITORY 32 +#define CEN_AUDIENCE 64 +#define XPG_MODIFIER 128 + +#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) +#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) + + +struct loaded_l10nfile +{ + const char *filename; + int decided; + + const void *data; + + struct loaded_l10nfile *next; + struct loaded_l10nfile *successor[1]; +}; + + +extern const char *_nl_normalize_codeset PARAMS ((const unsigned char *codeset, + size_t name_len)); + +extern struct loaded_l10nfile * +_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list, + const char *dirlist, size_t dirlist_len, int mask, + const char *language, const char *territory, + const char *codeset, + const char *normalized_codeset, + const char *modifier, const char *special, + const char *sponsor, const char *revision, + const char *filename, int do_allocate)); + + +extern const char *_nl_expand_alias PARAMS ((const char *name)); + +extern int _nl_explode_name PARAMS ((char *name, const char **language, + const char **modifier, + const char **territory, + const char **codeset, + const char **normalized_codeset, + const char **special, + const char **sponsor, + const char **revision)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,222 @@ +/* Load needed message catalogs. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#if defined STDC_HEADERS || defined _LIBC +# include +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC +# include +#endif + +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ISO C functions. This is required by the standard + because some ISO C functions will require linking with this object + file and the name space must not be polluted. */ +# define open __open +# define close __close +# define read __read +# define mmap __mmap +# define munmap __munmap +#endif + +/* We need a sign, whether a new catalog was loaded, which can be associated + with all translations. This is important if the translations are + cached by one of GCC's features. */ +int _nl_msg_cat_cntr = 0; + + +/* Load the message catalogs specified by FILENAME. If it is no valid + message catalog do nothing. */ +void +internal_function +_nl_load_domain (domain_file) + struct loaded_l10nfile *domain_file; +{ + int fd; + size_t size; + struct stat st; + struct mo_file_header *data = (struct mo_file_header *) -1; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + int use_mmap = 0; +#endif + struct loaded_domain *domain; + + domain_file->decided = 1; + domain_file->data = NULL; + + /* If the record does not represent a valid locale the FILENAME + might be NULL. This can happen when according to the given + specification the locale file name is different for XPG and CEN + syntax. */ + if (domain_file->filename == NULL) + return; + + /* Try to open the addressed file. */ + fd = open (domain_file->filename, O_RDONLY); + if (fd == -1) + return; + + /* We must know about the size of the file. */ + if (fstat (fd, &st) != 0 + || (size = (size_t) st.st_size) != st.st_size + || size < sizeof (struct mo_file_header)) + { + /* Something went wrong. */ + close (fd); + return; + } + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + /* Now we are ready to load the file. If mmap() is available we try + this first. If not available or it failed we try to load it. */ + data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, + MAP_PRIVATE, fd, 0); + + if (data != (struct mo_file_header *) -1) + { + /* mmap() call was successful. */ + close (fd); + use_mmap = 1; + } +#endif + + /* If the data is not yet available (i.e. mmap'ed) we try to load + it manually. */ + if (data == (struct mo_file_header *) -1) + { + size_t to_read; + char *read_ptr; + + data = (struct mo_file_header *) malloc (size); + if (data == NULL) + return; + + to_read = size; + read_ptr = (char *) data; + do + { + long int nb = (long int) read (fd, read_ptr, to_read); + if (nb == -1) + { + close (fd); + return; + } + + read_ptr += nb; + to_read -= nb; + } + while (to_read > 0); + + close (fd); + } + + /* Using the magic number we can test whether it really is a message + catalog file. */ + if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED) + { + /* The magic number is wrong: not a message catalog file. */ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + return; + } + + domain_file->data + = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); + if (domain_file->data == NULL) + return; + + domain = (struct loaded_domain *) domain_file->data; + domain->data = (char *) data; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + domain->use_mmap = use_mmap; +#endif + domain->mmap_size = size; + domain->must_swap = data->magic != _MAGIC; + + /* Fill in the information about the available tables. */ + switch (W (domain->must_swap, data->revision)) + { + case 0: + domain->nstrings = W (domain->must_swap, data->nstrings); + domain->orig_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->orig_tab_offset)); + domain->trans_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->trans_tab_offset)); + domain->hash_size = W (domain->must_swap, data->hash_tab_size); + domain->hash_tab = (nls_uint32 *) + ((char *) data + W (domain->must_swap, data->hash_tab_offset)); + break; + default: + /* This is an illegal revision. */ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + free (domain); + domain_file->data = NULL; + return; + } + + /* Show that one domain is changed. This might make some cached + translations invalid. */ + ++_nl_msg_cat_cntr; +} + + +#ifdef _LIBC +void +internal_function +_nl_unload_domain (domain) + struct loaded_domain *domain; +{ + if (domain->use_mmap) + munmap ((caddr_t) domain->data, domain->mmap_size); + else + free ((void *) domain->data); + + free (domain); +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,424 @@ +/* Handle aliases for locale names. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include +#else +# include +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define strcasecmp __strcasecmp + +# define mempcpy __mempcpy +# define HAVE_MEMPCPY 1 + +/* We need locking here since we can be called from different places. */ +# include + +__libc_lock_define_initialized (static, lock); +#endif + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +#endif /* have alloca */ + + +struct alias_map +{ + const char *alias; + const char *value; +}; + + +static char *string_space = NULL; +static size_t string_space_act = 0; +static size_t string_space_max = 0; +static struct alias_map *map; +static size_t nmap = 0; +static size_t maxmap = 0; + + +/* Prototypes for local functions. */ +static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) + internal_function; +static void extend_alias_table PARAMS ((void)); +static int alias_compare PARAMS ((const struct alias_map *map1, + const struct alias_map *map2)); + + +const char * +_nl_expand_alias (name) + const char *name; +{ + static const char *locale_alias_path = LOCALE_ALIAS_PATH; + struct alias_map *retval; + const char *result = NULL; + size_t added; + +#ifdef _LIBC + __libc_lock_lock (lock); +#endif + + do + { + struct alias_map item; + + item.alias = name; + + if (nmap > 0) + retval = (struct alias_map *) bsearch (&item, map, nmap, + sizeof (struct alias_map), + (int (*) PARAMS ((const void *, + const void *)) + ) alias_compare); + else + retval = NULL; + + /* We really found an alias. Return the value. */ + if (retval != NULL) + { + result = retval->value; + break; + } + + /* Perhaps we can find another alias file. */ + added = 0; + while (added == 0 && locale_alias_path[0] != '\0') + { + const char *start; + + while (locale_alias_path[0] == ':') + ++locale_alias_path; + start = locale_alias_path; + + while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':') + ++locale_alias_path; + + if (start < locale_alias_path) + added = read_alias_file (start, locale_alias_path - start); + } + } + while (added != 0); + +#ifdef _LIBC + __libc_lock_unlock (lock); +#endif + + return result; +} + + +static size_t +internal_function +read_alias_file (fname, fname_len) + const char *fname; + int fname_len; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + FILE *fp; + char *full_fname; + size_t added; + static const char aliasfile[] = "/locale.alias"; + + full_fname = (char *) alloca (fname_len + sizeof aliasfile); + ADD_BLOCK (block_list, full_fname); +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (full_fname, fname, fname_len), + aliasfile, sizeof aliasfile); +#else + memcpy (full_fname, fname, fname_len); + memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); +#endif + + fp = fopen (full_fname, "r"); + if (fp == NULL) + { + FREE_BLOCKS (block_list); + return 0; + } + + added = 0; + while (!feof (fp)) + { + /* It is a reasonable approach to use a fix buffer here because + a) we are only interested in the first two fields + b) these fields must be usable as file names and so must not + be that long + */ + unsigned char buf[BUFSIZ]; + unsigned char *alias; + unsigned char *value; + unsigned char *cp; + + if (fgets (buf, sizeof buf, fp) == NULL) + /* EOF reached. */ + break; + + /* Possibly not the whole line fits into the buffer. Ignore + the rest of the line. */ + if (strchr (buf, '\n') == NULL) + { + char altbuf[BUFSIZ]; + do + if (fgets (altbuf, sizeof altbuf, fp) == NULL) + /* Make sure the inner loop will be left. The outer loop + will exit at the `feof' test. */ + break; + while (strchr (altbuf, '\n') == NULL); + } + + cp = buf; + /* Ignore leading white space. */ + while (isspace (cp[0])) + ++cp; + + /* A leading '#' signals a comment line. */ + if (cp[0] != '\0' && cp[0] != '#') + { + alias = cp++; + while (cp[0] != '\0' && !isspace (cp[0])) + ++cp; + /* Terminate alias name. */ + if (cp[0] != '\0') + *cp++ = '\0'; + + /* Now look for the beginning of the value. */ + while (isspace (cp[0])) + ++cp; + + if (cp[0] != '\0') + { + size_t alias_len; + size_t value_len; + + value = cp++; + while (cp[0] != '\0' && !isspace (cp[0])) + ++cp; + /* Terminate value. */ + if (cp[0] == '\n') + { + /* This has to be done to make the following test + for the end of line possible. We are looking for + the terminating '\n' which do not overwrite here. */ + *cp++ = '\0'; + *cp = '\n'; + } + else if (cp[0] != '\0') + *cp++ = '\0'; + + if (nmap >= maxmap) + extend_alias_table (); + + alias_len = strlen (alias) + 1; + value_len = strlen (value) + 1; + + if (string_space_act + alias_len + value_len > string_space_max) + { + /* Increase size of memory pool. */ + size_t new_size = (string_space_max + + (alias_len + value_len > 1024 + ? alias_len + value_len : 1024)); + char *new_pool = (char *) realloc (string_space, new_size); + if (new_pool == NULL) + { + FREE_BLOCKS (block_list); + return added; + } + string_space = new_pool; + string_space_max = new_size; + } + + map[nmap].alias = memcpy (&string_space[string_space_act], + alias, alias_len); + string_space_act += alias_len; + + map[nmap].value = memcpy (&string_space[string_space_act], + value, value_len); + string_space_act += value_len; + + ++nmap; + ++added; + } + } + } + + /* Should we test for ferror()? I think we have to silently ignore + errors. --drepper */ + fclose (fp); + + if (added > 0) + qsort (map, nmap, sizeof (struct alias_map), + (int (*) PARAMS ((const void *, const void *))) alias_compare); + + FREE_BLOCKS (block_list); + return added; +} + + +static void +extend_alias_table () +{ + size_t new_size; + struct alias_map *new_map; + + new_size = maxmap == 0 ? 100 : 2 * maxmap; + new_map = (struct alias_map *) realloc (map, (new_size + * sizeof (struct alias_map))); + if (new_map == NULL) + /* Simply don't extend: we don't have any more core. */ + return; + + map = new_map; + maxmap = new_size; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + if (string_space != NULL) + free (string_space); + if (map != NULL) + free (map); +} +text_set_element (__libc_subfreeres, free_mem); +#endif + + +static int +alias_compare (map1, map2) + const struct alias_map *map1; + const struct alias_map *map2; +{ +#if defined _LIBC || defined HAVE_STRCASECMP + return strcasecmp (map1->alias, map2->alias); +#else + const unsigned char *p1 = (const unsigned char *) map1->alias; + const unsigned char *p2 = (const unsigned char *) map2->alias; + unsigned char c1, c2; + + if (p1 == p2) + return 0; + + do + { + /* I know this seems to be odd but the tolower() function in + some systems libc cannot handle nonalpha characters. */ + c1 = isupper (*p1) ? tolower (*p1) : *p1; + c2 = isupper (*p2) ? tolower (*p2) : *p2; + if (c1 == '\0') + break; + ++p1; + ++p2; + } + while (c1 == c2); + + return c1 - c2; +#endif +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,102 @@ +# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets +# Copyright (C) 1995 Free Software Foundation, Inc. +# Ulrich Drepper , 1995. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +1 { + i\ +/* Automatically generated by po2tbl.sed from @PACKAGE NAME@.pot. */\ +\ +#if HAVE_CONFIG_H\ +# include \ +#endif\ +\ +#include "libgettext.h"\ +\ +const struct _msg_ent _msg_tbl[] = { + h + s/.*/0/ + x +} +# +# Write msgid entries in C array form. +# +/^msgid/ { + s/msgid[ ]*\(".*"\)/ {\1/ + tb +# Append the next line + :b + N +# Look whether second part is continuation line. + s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/ +# Yes, then branch. + ta +# Because we assume that the input file correctly formed the line +# just read cannot be again be a msgid line. So it's safe to ignore +# it. + s/\(.*\)\n.*/\1/ + bc +# We found a continuation line. But before printing insert '\'. + :a + s/\(.*\)\(\n.*\)/\1\\\2/ + P +# We cannot use D here. + s/.*\n\(.*\)/\1/ +# Some buggy seds do not clear the `successful substitution since last ``t''' +# flag on `N', so we do a `t' here to clear it. + tb +# Not reached + :c + x +# The following nice solution is by +# Bruno + td +# Increment a decimal number in pattern space. +# First hide trailing `9' digits. + :d + s/9\(_*\)$/_\1/ + td +# Assure at least one digit is available. + s/^\(_*\)$/0\1/ +# Increment the last digit. + s/8\(_*\)$/9\1/ + s/7\(_*\)$/8\1/ + s/6\(_*\)$/7\1/ + s/5\(_*\)$/6\1/ + s/4\(_*\)$/5\1/ + s/3\(_*\)$/4\1/ + s/2\(_*\)$/3\1/ + s/1\(_*\)$/2\1/ + s/0\(_*\)$/1\1/ +# Convert the hidden `9' digits to `0's. + s/_/0/g + x + G + s/\(.*\)\n\([0-9]*\)/\1, \2},/ + s/\(.*\)"$/\1/ + p +} +# +# Last line. +# +$ { + i\ +};\ + + g + s/0*\(.*\)/int _msg_tbl_length = \1;/p +} +d diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,108 @@ +/* Implementation of the textdomain(3) function. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include +#endif + +#if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC +# include +#else +# include +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif + +#ifdef _LIBC +# include +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Name of the default text domain. */ +extern const char _nl_default_default_domain[]; + +/* Default text domain in which entries for gettext(3) are to be found. */ +extern const char *_nl_current_default_domain; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define TEXTDOMAIN __textdomain +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define TEXTDOMAIN textdomain__ +#endif + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +char * +TEXTDOMAIN (domainname) + const char *domainname; +{ + char *old; + + /* A NULL pointer requests the current setting. */ + if (domainname == NULL) + return (char *) _nl_current_default_domain; + + old = (char *) _nl_current_default_domain; + + /* If domain name is the null string set to default domain "messages". */ + if (domainname[0] == '\0' + || strcmp (domainname, _nl_default_default_domain) == 0) + _nl_current_default_domain = _nl_default_default_domain; + else + { + /* If the following malloc fails `_nl_current_default_domain' + will be NULL. This value will be returned and so signals we + are out of core. */ +#if defined _LIBC || defined HAVE_STRDUP + _nl_current_default_domain = strdup (domainname); +#else + size_t len = strlen (domainname) + 1; + char *cp = (char *) malloc (len); + if (cp != NULL) + memcpy (cp, domainname, len); + _nl_current_default_domain = cp; +#endif + } + + if (old != _nl_default_default_domain) + free (old); + + return (char *) _nl_current_default_domain; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__textdomain, textdomain); +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ +GNU gettext library from gettext-0.10.35 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,104 @@ +# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file +# Copyright (C) 1995 Free Software Foundation, Inc. +# Ulrich Drepper , 1995. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# +# The first directive in the .msg should be the definition of the +# message set number. We use always set number 1. +# +1 { + i\ +$set 1 # Automatically created by po2msg.sed + h + s/.*/0/ + x +} +# +# We copy all comments into the .msg file. Perhaps they can help. +# +/^#/ s/^#[ ]*/$ /p +# +# We copy the original message as a comment into the .msg file. +# +/^msgid/ { +# Does not work now +# /"$/! { +# s/\\$// +# s/$/ ... (more lines following)"/ +# } + s/^msgid[ ]*"\(.*\)"$/$ Original Message: \1/ + p +} +# +# The .msg file contains, other then the .po file, only the translations +# but each given a unique ID. Starting from 1 and incrementing by 1 for +# each message we assign them to the messages. +# It is important that the .po file used to generate the cat-id-tbl.c file +# (with po-to-tbl) is the same as the one used here. (At least the order +# of declarations must not be changed.) +# +/^msgstr/ { + s/msgstr[ ]*"\(.*\)"/\1/ + x +# The following nice solution is by +# Bruno + td +# Increment a decimal number in pattern space. +# First hide trailing `9' digits. + :d + s/9\(_*\)$/_\1/ + td +# Assure at least one digit is available. + s/^\(_*\)$/0\1/ +# Increment the last digit. + s/8\(_*\)$/9\1/ + s/7\(_*\)$/8\1/ + s/6\(_*\)$/7\1/ + s/5\(_*\)$/6\1/ + s/4\(_*\)$/5\1/ + s/3\(_*\)$/4\1/ + s/2\(_*\)$/3\1/ + s/1\(_*\)$/2\1/ + s/0\(_*\)$/1\1/ +# Convert the hidden `9' digits to `0's. + s/_/0/g + x +# Bring the line in the format ` ' + G + s/^[^\n]*$/& / + s/\(.*\)\n\([0-9]*\)/\2 \1/ +# Clear flag from last substitution. + tb +# Append the next line. + :b + N +# Look whether second part is a continuation line. + s/\(.*\n\)"\(.*\)"/\1\2/ +# Yes, then branch. + ta + P + D +# Note that `D' includes a jump to the start!! +# We found a continuation line. But before printing insert '\'. + :a + s/\(.*\)\(\n.*\)/\1\\\2/ + P +# We cannot use the sed command `D' here + s/.*\n\(.*\)/\1/ + tb +} +d diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,29 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = intl po gtk-gui + +EXTRA_DIST = \ + autogen.sh \ + goom2.glade + +install-data-local: + @$(NORMAL_INSTALL) + if test -d $(srcdir)/pixmaps; then \ + $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/pixmaps; \ + for pixmap in $(srcdir)/pixmaps/*; do \ + if test -f $$pixmap; then \ + $(INSTALL_DATA) $$pixmap $(DESTDIR)$(pkgdatadir)/pixmaps; \ + fi \ + done \ + fi + +dist-hook: + if test -d pixmaps; then \ + mkdir $(distdir)/pixmaps; \ + for pixmap in pixmaps/*; do \ + if test -f $$pixmap; then \ + cp -p $$pixmap $(distdir)/pixmaps; \ + fi \ + done \ + fi + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,336 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing 0.4 - GNU automake" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. + You can get \`$1Help2man' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar ${1+"$@"} && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar ${1+"$@"} && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" ${1+"$@"} && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" ${1+"$@"} && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,101 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1.1.1 2004/12/10 13:59:00 jchoelt Exp $ + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case "${1}" in + -h | --help | --h* ) # -h for help + echo "${usage}" 1>&2; exit 0 ;; + -m ) # -m PERM arg + shift + test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } + dirmode="${1}" + shift ;; + -- ) shift; break ;; # stop option processing + -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option + * ) break ;; # first non-opt arg + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in +0) exit 0 ;; +esac + +case $dirmode in +'') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi ;; +*) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 3 +# End: +# mkinstalldirs ends here diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,25 @@ +/* Automatically generated by po2tbl.sed from goom2.pot. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "libgettext.h" + +const struct _msg_ent _msg_tbl[] = { + {"", 1}, + {"Goom Control Window", 2}, + {"_File", 3}, + {"Window Y-Size:", 4}, + {"Window X-Size:", 5}, + {"Double Pixel:", 6}, + {"Frame Rate Limiter:", 7}, + {"Display", 8}, + {"TODO", 9}, + {"Inspect", 10}, + {"Customize", 11}, + {"Couldn't find pixmap file: %s", 12}, + {"Error loading pixmap file: %s", 13}, +}; + +int _msg_tbl_length = 13; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2003-04-27 17:01+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" + +#: gtk-gui/interface.c:56 +msgid "Goom Control Window" +msgstr "" + +#: gtk-gui/interface.c:74 +msgid "_File" +msgstr "" + +#: gtk-gui/interface.c:107 +msgid "Window Y-Size:" +msgstr "" + +#: gtk-gui/interface.c:154 +msgid "Window X-Size:" +msgstr "" + +#: gtk-gui/interface.c:174 +msgid "Double Pixel:" +msgstr "" + +#: gtk-gui/interface.c:185 +msgid "Frame Rate Limiter:" +msgstr "" + +#: gtk-gui/interface.c:206 +msgid "Display" +msgstr "" + +#: gtk-gui/interface.c:213 gtk-gui/interface.c:227 +msgid "TODO" +msgstr "" + +#: gtk-gui/interface.c:220 +msgid "Inspect" +msgstr "" + +#: gtk-gui/interface.c:234 +msgid "Customize" +msgstr "" + +#: gtk-gui/support.c:121 +#, c-format +msgid "Couldn't find pixmap file: %s" +msgstr "" + +#: gtk-gui/support.c:130 +#, c-format +msgid "Error loading pixmap file: %s" +msgstr "" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,248 @@ +# Makefile for program source directory in GNU NLS utilities package. +# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper +# +# This file file be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = $(prefix)/@DATADIRNAME@ +localedir = $(datadir)/locale +gnulocaledir = $(prefix)/share/locale +gettextsrcdir = $(prefix)/share/gettext/po +subdir = po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@ + +CC = @CC@ +GENCAT = @GENCAT@ +GMSGFMT = PATH=../src:$$PATH @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = PATH=../src:$$PATH @XGETTEXT@ +MSGMERGE = PATH=../src:$$PATH msgmerge + +DEFS = @DEFS@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ + +INCLUDES = -I.. -I$(top_srcdir)/intl + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +SOURCES = cat-id-tbl.c +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ +stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) + +POTFILES = \ + +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +INSTOBJEXT = @INSTOBJEXT@ + +.SUFFIXES: +.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat + +.c.o: + $(COMPILE) $< + +.po.pox: + $(MAKE) $(PACKAGE).pot + $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox + +.po.mo: + $(MSGFMT) -o $@ $< + +.po.gmo: + file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ + && rm -f $$file && $(GMSGFMT) -o $$file $< + +.po.cat: + sed -f ../intl/po2msg.sed < $< > $*.msg \ + && rm -f $@ && $(GENCAT) $@ $*.msg + + +all: all-@USE_NLS@ + +all-yes: cat-id-tbl.c $(CATALOGS) +all-no: + +$(srcdir)/$(PACKAGE).pot: $(POTFILES) + $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ + --add-comments --keyword=_ --keyword=N_ \ + --files-from=$(srcdir)/POTFILES.in \ + && test ! -f $(PACKAGE).po \ + || ( rm -f $(srcdir)/$(PACKAGE).pot \ + && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot ) + +$(srcdir)/cat-id-tbl.c: stamp-cat-id; @: +$(srcdir)/stamp-cat-id: $(PACKAGE).pot + rm -f cat-id-tbl.tmp + sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \ + | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp + if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \ + rm cat-id-tbl.tmp; \ + else \ + echo cat-id-tbl.c changed; \ + rm -f $(srcdir)/cat-id-tbl.c; \ + mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \ + fi + cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ +install-data-no: all +install-data-yes: all + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $(datadir); \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(datadir); \ + fi + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + case "$$cat" in \ + *.gmo) destdir=$(gnulocaledir);; \ + *) destdir=$(localedir);; \ + esac; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + dir=$$destdir/$$lang/LC_MESSAGES; \ + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $$dir; \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \ + fi; \ + if test -r $$cat; then \ + $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ + echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \ + else \ + $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ + echo "installing $(srcdir)/$$cat as" \ + "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \ + fi; \ + if test -r $$cat.m; then \ + $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ + echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ + else \ + if test -r $(srcdir)/$$cat.m ; then \ + $(INSTALL_DATA) $(srcdir)/$$cat.m \ + $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ + echo "installing $(srcdir)/$$cat as" \ + "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ + else \ + true; \ + fi; \ + fi; \ + done + if test "$(PACKAGE)" = "gettext"; then \ + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $(gettextsrcdir); \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ + fi; \ + $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ + $(gettextsrcdir)/Makefile.in.in; \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ + rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ + rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ + rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ + done + rm -f $(gettextsrcdir)/po-Makefile.in.in + +check: all + +cat-id-tbl.o: ../intl/libgettext.h + +dvi info tags TAGS ID: + +mostlyclean: + rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f $(GMOFILES) + +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: update-po $(DISTFILES) + dists="$(DISTFILES)"; \ + for file in $$dists; do \ + ln $(srcdir)/$$file $(distdir) 2> /dev/null \ + || cp -p $(srcdir)/$$file $(distdir); \ + done + +update-po: Makefile + $(MAKE) $(PACKAGE).pot + PATH=`pwd`/../src:$$PATH; \ + cd $(srcdir); \ + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + mv $$lang.po $$lang.old.po; \ + echo "$$lang:"; \ + if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \ + rm -f $$lang.old.po; \ + else \ + echo "msgmerge for $$cat failed!"; \ + rm -f $$lang.po; \ + mv $$lang.old.po $$lang.po; \ + fi; \ + done + +POTFILES: POTFILES.in + ( if test 'x$(srcdir)' != 'x.'; then \ + posrcprefix='$(top_srcdir)/'; \ + else \ + posrcprefix="../"; \ + fi; \ + rm -f $@-t $@ \ + && (sed -e '/^#/d' -e '/^[ ]*$$/d' \ + -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ + | sed -e '$$s/\\$$//') > $@-t \ + && chmod a-w $@-t \ + && mv $@-t $@ ) + +Makefile: Makefile.in.in ../config.status POTFILES + cd .. \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,6 @@ +# List of source files containing translatable strings. + +gtk-gui/main.c +gtk-gui/interface.c +gtk-gui/callbacks.c +gtk-gui/support.c diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ +timestamp diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ +timestamp diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/KNOWNBUGS kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/KNOWNBUGS --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/KNOWNBUGS 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/KNOWNBUGS 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/libgoom2.pc.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/libgoom2.pc.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/libgoom2.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/libgoom2.pc.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libgoom2 +Version: @VERSION@ +Description: goom audio visualisation effects. +Requires: +Libs: -L${libdir} -lgoom2 +Cflags: -I${includedir} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/m4/sdl.m4 kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/m4/sdl.m4 --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/m4/sdl.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/m4/sdl.m4 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,175 @@ +# Configure paths for SDL +# Sam Lantinga 9/21/99 +# stolen from Manish Singh +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS +dnl +AC_DEFUN([AM_PATH_SDL2], +[dnl +dnl Get the cflags and libraries from the sdl-config script +dnl +AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], + sdl_prefix="$withval", sdl_prefix="") +AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], + sdl_exec_prefix="$withval", sdl_exec_prefix="") +AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], + , enable_sdltest=yes) + + if test x$sdl_exec_prefix != x ; then + sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_args="$sdl_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + AC_REQUIRE([AC_CANONICAL_HOST]) + PATH="$prefix/bin:$prefix/usr/bin:$PATH" + AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) + min_sdl_version=ifelse([$1], ,0.11.0,$1) + AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" +dnl +dnl Now check if the installed SDL is sufficiently new. (Also sanity +dnl checks the results of sdl-config to some extent +dnl + rm -f conf.sdltest + AC_TRY_RUN([ +#include +#include +#include +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + AC_TRY_LINK([ +#include +#include "SDL.h" + +int main(int argc, char *argv[]) +{ return 0; } +#undef main +#define main K_and_R_C_main +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) + rm -f conf.sdltest +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/m4/xmms.m4 kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/m4/xmms.m4 --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/m4/xmms.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/m4/xmms.m4 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,148 @@ +# CFLAGS and library paths for XMMS +# written 15 December 1999 by Ben Gertzfield + +dnl Usage: +dnl AM_PATH_XMMS([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl +dnl Example: +dnl AM_PATH_XMMS(0.9.5.1, , AC_MSG_ERROR([*** XMMS >= 0.9.5.1 not installed - please install first ***])) +dnl +dnl Defines XMMS_CFLAGS, XMMS_LIBS, XMMS_DATA_DIR, XMMS_PLUGIN_DIR, +dnl XMMS_VISUALIZATION_PLUGIN_DIR, XMMS_INPUT_PLUGIN_DIR, +dnl XMMS_OUTPUT_PLUGIN_DIR, XMMS_GENERAL_PLUGIN_DIR, XMMS_EFFECT_PLUGIN_DIR, +dnl and XMMS_VERSION for your plugin pleasure. +dnl + +dnl XMMS_TEST_VERSION(AVAILABLE-VERSION, NEEDED-VERSION [, ACTION-IF-OKAY [, ACTION-IF-NOT-OKAY]]) +AC_DEFUN(XMMS_TEST_VERSION2, [ + +# Determine which version number is greater. Prints 2 to stdout if +# the second number is greater, 1 if the first number is greater, +# 0 if the numbers are equal. + +# Written 15 December 1999 by Ben Gertzfield +# Revised 15 December 1999 by Jim Monty + + AC_PROG_AWK + xmms_got_version=[` $AWK ' \ +BEGIN { \ + print vercmp(ARGV[1], ARGV[2]); \ +} \ + \ +function vercmp(ver1, ver2, ver1arr, ver2arr, \ + ver1len, ver2len, \ + ver1int, ver2int, len, i, p) { \ + \ + ver1len = split(ver1, ver1arr, /\./); \ + ver2len = split(ver2, ver2arr, /\./); \ + \ + len = ver1len > ver2len ? ver1len : ver2len; \ + \ + for (i = 1; i <= len; i++) { \ + p = 1000 ^ (len - i); \ + ver1int += ver1arr[i] * p; \ + ver2int += ver2arr[i] * p; \ + } \ + \ + if (ver1int < ver2int) \ + return 2; \ + else if (ver1int > ver2int) \ + return 1; \ + else \ + return 0; \ +}' $1 $2`] + + if test $xmms_got_version -eq 2; then # failure + ifelse([$4], , :, $4) + else # success! + ifelse([$3], , :, $3) + fi +]) + +AC_DEFUN(AM_PATH_XMMS2, +[ +AC_ARG_WITH(xmms-prefix,[ --with-xmms-prefix=PFX Prefix where XMMS is installed (optional)], + xmms_config_prefix="$withval", xmms_config_prefix="") +AC_ARG_WITH(xmms-exec-prefix,[ --with-xmms-exec-prefix=PFX Exec prefix where XMMS is installed (optional)], + xmms_config_exec_prefix="$withval", xmms_config_exec_prefix="") + +if test x$xmms_config_exec_prefix != x; then + xmms_config_args="$xmms_config_args --exec-prefix=$xmms_config_exec_prefix" + if test x${XMMS_CONFIG+set} != xset; then + XMMS_CONFIG=$xmms_config_exec_prefix/bin/xmms-config + fi +fi + +if test x$xmms_config_prefix != x; then + xmms_config_args="$xmms_config_args --prefix=$xmms_config_prefix" + if test x${XMMS_CONFIG+set} != xset; then + XMMS_CONFIG=$xmms_config_prefix/bin/xmms-config + fi +fi + +AC_PATH_PROG(XMMS_CONFIG, xmms-config, no) +min_xmms_version=ifelse([$1], ,0.9.5.1, $1) + +if test "$XMMS_CONFIG" = "no"; then + no_xmms=yes +else + XMMS_CFLAGS=`$XMMS_CONFIG $xmms_config_args --cflags` + XMMS_LIBS=`$XMMS_CONFIG $xmms_config_args --libs` + XMMS_VERSION=`$XMMS_CONFIG $xmms_config_args --version` + XMMS_DATA_DIR=`$XMMS_CONFIG $xmms_config_args --data-dir` + XMMS_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --plugin-dir` + XMMS_VISUALIZATION_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args \ + --visualization-plugin-dir` + XMMS_INPUT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --input-plugin-dir` + XMMS_OUTPUT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --output-plugin-dir` + XMMS_EFFECT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --effect-plugin-dir` + XMMS_GENERAL_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --general-plugin-dir` + + XMMS_TEST_VERSION2($XMMS_VERSION, $min_xmms_version, ,no_xmms=version) +fi + +AC_MSG_CHECKING(for XMMS - version >= $min_xmms_version) + +if test "x$no_xmms" = x; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) +else + AC_MSG_RESULT(no) + + if test "$XMMS_CONFIG" = "no" ; then + echo "*** The xmms-config script installed by XMMS could not be found." + echo "*** If XMMS was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the XMMS_CONFIG environment variable to the" + echo "*** full path to xmms-config." + else + if test "$no_xmms" = "version"; then + echo "*** An old version of XMMS, $XMMS_VERSION, was found." + echo "*** You need a version of XMMS newer than $min_xmms_version." + echo "*** The latest version of XMMS is always available from" + echo "*** http://www.xmms.org/" + echo "***" + + echo "*** If you have already installed a sufficiently new version, this error" + echo "*** probably means that the wrong copy of the xmms-config shell script is" + echo "*** being found. The easiest way to fix this is to remove the old version" + echo "*** of XMMS, but you can also set the XMMS_CONFIG environment to point to the" + echo "*** correct copy of xmms-config. (In this case, you will have to" + echo "*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf" + echo "*** so that the correct libraries are found at run-time)" + fi + fi + XMMS_CFLAGS="" + XMMS_LIBS="" + ifelse([$3], , :, [$3]) +fi +AC_SUBST(XMMS_CFLAGS) +AC_SUBST(XMMS_LIBS) +AC_SUBST(XMMS_VERSION) +AC_SUBST(XMMS_DATA_DIR) +AC_SUBST(XMMS_PLUGIN_DIR) +AC_SUBST(XMMS_VISUALIZATION_PLUGIN_DIR) +AC_SUBST(XMMS_INPUT_PLUGIN_DIR) +AC_SUBST(XMMS_OUTPUT_PLUGIN_DIR) +AC_SUBST(XMMS_GENERAL_PLUGIN_DIR) +AC_SUBST(XMMS_EFFECT_PLUGIN_DIR) +]) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1130 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 39; + objects = { + 1058C7A0FEA54F0111CA2CBB = { + children = ( + 1058C7A1FEA54F0111CA2CBB, + 3B336C0906D1537B003DCDCB, + 3B336CD606D159F9003DCDCB, + ); + isa = PBXGroup; + name = "Linked Frameworks"; + refType = 4; + sourceTree = ""; + }; + 1058C7A1FEA54F0111CA2CBB = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = Cocoa.framework; + path = /System/Library/Frameworks/Cocoa.framework; + refType = 0; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB = { + children = ( + 3BE13CC706D3FE26005DAB04, + 29B97325FDCFA39411CA2CEA, + 29B97324FDCFA39411CA2CEA, + ); + isa = PBXGroup; + name = "Other Frameworks"; + refType = 4; + sourceTree = ""; + }; +//100 +//101 +//102 +//103 +//104 +//190 +//191 +//192 +//193 +//194 + 19C28FACFE9D520D11CA2CBB = { + children = ( + 8D1107320486CEB800E47090, + 3BE13C9406D3FD5D005DAB04, + ); + isa = PBXGroup; + name = Products; + refType = 4; + sourceTree = ""; + }; +//190 +//191 +//192 +//193 +//194 +//290 +//291 +//292 +//293 +//294 + 29B97313FDCFA39411CA2CEA = { + buildSettings = { + }; + buildStyles = ( + 4A9504CCFFE6A4B311CA0CBA, + 4A9504CDFFE6A4B311CA0CBA, + ); + hasScannedForEncodings = 1; + isa = PBXProject; + mainGroup = 29B97314FDCFA39411CA2CEA; + projectDirPath = ""; + targets = ( + 8D1107260486CEB800E47090, + 3BE13C9306D3FD5D005DAB04, + ); + }; + 29B97314FDCFA39411CA2CEA = { + children = ( + 3BE13CAB06D3FDB2005DAB04, + 3BE13C9B06D3FDB2005DAB04, + 3B336D8A06D3DE8E003DCDCB, + 29B97315FDCFA39411CA2CEA, + 29B97323FDCFA39411CA2CEA, + 19C28FACFE9D520D11CA2CBB, + ); + isa = PBXGroup; + name = iGoom; + path = ""; + refType = 4; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA = { + children = ( + 32CA4F630368D1EE00C91783, + ); + isa = PBXGroup; + name = "Other Sources"; + path = ""; + refType = 4; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA = { + children = ( + 3BA6971006D8B8EF007E5D2B, + 3BE13C7E06D3FAE8005DAB04, + 1058C7A0FEA54F0111CA2CBB, + 1058C7A2FEA54F0111CA2CBB, + ); + isa = PBXGroup; + name = Frameworks; + path = ""; + refType = 4; + sourceTree = ""; + }; + 29B97324FDCFA39411CA2CEA = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = AppKit.framework; + path = /System/Library/Frameworks/AppKit.framework; + refType = 0; + sourceTree = ""; + }; + 29B97325FDCFA39411CA2CEA = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = Foundation.framework; + path = /System/Library/Frameworks/Foundation.framework; + refType = 0; + sourceTree = ""; + }; +//290 +//291 +//292 +//293 +//294 +//320 +//321 +//322 +//323 +//324 + 32CA4F630368D1EE00C91783 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = iGoom_Prefix.pch; + refType = 4; + sourceTree = ""; + }; +//320 +//321 +//322 +//323 +//324 +//3B0 +//3B1 +//3B2 +//3B3 +//3B4 + 3B336C0906D1537B003DCDCB = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = OpenGL.framework; + path = /System/Library/Frameworks/OpenGL.framework; + refType = 0; + sourceTree = ""; + }; + 3B336C0A06D1537B003DCDCB = { + fileRef = 3B336C0906D1537B003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336CD606D159F9003DCDCB = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = CoreAudio.framework; + path = /System/Library/Frameworks/CoreAudio.framework; + refType = 0; + sourceTree = ""; + }; + 3B336CD706D159F9003DCDCB = { + fileRef = 3B336CD606D159F9003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336D8A06D3DE8E003DCDCB = { + children = ( + 3B336D9A06D3DE8E003DCDCB, + 3B336D8B06D3DE8E003DCDCB, + 3B336D8C06D3DE8E003DCDCB, + 3B336D9D06D3DE8E003DCDCB, + 3B336D9E06D3DE8E003DCDCB, + 3BCD10C30798B01500910E20, + 3BCD10C40798B02D00910E20, + 3B336D9B06D3DE8E003DCDCB, + 3B336D9C06D3DE8E003DCDCB, + 3B336D9306D3DE8E003DCDCB, + 3B336D9406D3DE8E003DCDCB, + 3B336D9506D3DE8E003DCDCB, + 3B336D9606D3DE8E003DCDCB, + 3B336D9706D3DE8E003DCDCB, + 3B336D9806D3DE8E003DCDCB, + ); + isa = PBXGroup; + path = StandAlone; + refType = 4; + sourceTree = ""; + }; + 3B336D8B06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = AppController.h; + refType = 4; + sourceTree = ""; + }; + 3B336D8C06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = AppController.m; + refType = 4; + sourceTree = ""; + }; + 3B336D8F06D3DE8E003DCDCB = { + children = ( + 3B336D9006D3DE8E003DCDCB, + ); + isa = PBXVariantGroup; + name = InfoPlist.strings; + path = ""; + refType = 4; + sourceTree = ""; + }; + 3B336D9006D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = English; + path = English.lproj/InfoPlist.strings; + refType = 4; + sourceTree = ""; + }; + 3B336D9106D3DE8E003DCDCB = { + children = ( + 3B336D9206D3DE8E003DCDCB, + ); + isa = PBXVariantGroup; + name = MainMenu.nib; + path = ""; + refType = 4; + sourceTree = ""; + }; + 3B336D9206D3DE8E003DCDCB = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + name = English; + path = English.lproj/MainMenu.nib; + refType = 4; + sourceTree = ""; + }; + 3B336D9306D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = Goom.h; + refType = 4; + sourceTree = ""; + }; + 3B336D9406D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = Goom.m; + refType = 4; + sourceTree = ""; + }; + 3B336D9506D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = GoomFXParam.h; + refType = 4; + sourceTree = ""; + }; + 3B336D9606D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = GoomFXParam.m; + refType = 4; + sourceTree = ""; + }; + 3B336D9706D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = GoomFXView.h; + refType = 4; + sourceTree = ""; + }; + 3B336D9806D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = GoomFXView.m; + refType = 4; + sourceTree = ""; + }; + 3B336D9A06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = main.m; + refType = 4; + sourceTree = ""; + }; + 3B336D9B06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = MainOpenGLView.h; + refType = 4; + sourceTree = ""; + }; + 3B336D9C06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = MainOpenGLView.m; + refType = 4; + sourceTree = ""; + }; + 3B336D9D06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = MyApplication.h; + refType = 4; + sourceTree = ""; + }; + 3B336D9E06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = MyApplication.m; + refType = 4; + sourceTree = ""; + }; + 3B336D9F06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SoundSampler.h; + refType = 4; + sourceTree = ""; + }; + 3B336DA006D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.objcpp; + path = SoundSampler.mm; + refType = 4; + sourceTree = ""; + }; + 3B336DA106D3DE8E003DCDCB = { + fileRef = 3B336D8B06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA206D3DE8E003DCDCB = { + fileRef = 3B336D8C06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA506D3DE8E003DCDCB = { + fileRef = 3B336D8F06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA606D3DE8E003DCDCB = { + fileRef = 3B336D9106D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA706D3DE8E003DCDCB = { + fileRef = 3B336D9306D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA806D3DE8E003DCDCB = { + fileRef = 3B336D9406D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA906D3DE8E003DCDCB = { + fileRef = 3B336D9506D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DAA06D3DE8E003DCDCB = { + fileRef = 3B336D9606D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DAB06D3DE8E003DCDCB = { + fileRef = 3B336D9706D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DAC06D3DE8E003DCDCB = { + fileRef = 3B336D9806D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DAE06D3DE8E003DCDCB = { + fileRef = 3B336D9A06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DAF06D3DE8E003DCDCB = { + fileRef = 3B336D9B06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DB006D3DE8E003DCDCB = { + fileRef = 3B336D9C06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DB106D3DE8E003DCDCB = { + fileRef = 3B336D9D06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DB206D3DE8E003DCDCB = { + fileRef = 3B336D9E06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DB306D3DE8E003DCDCB = { + fileRef = 3B336D9F06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DB406D3DE8E003DCDCB = { + fileRef = 3B336DA006D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336E1206D3F5D2003DCDCB = { + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3BA696BF06D7FAA2007E5D2B, + ); + isa = PBXCopyFilesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 3B73A57E0798599C001B0B2B = { + isa = PBXFileReference; + lastKnownFileType = image.png; + name = goom2k4.png; + path = ../../goom2k4.png; + refType = 4; + sourceTree = ""; + }; + 3B73A57F0798599C001B0B2B = { + fileRef = 3B73A57E0798599C001B0B2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3B73A60207986421001B0B2B = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = CoreAudioHardware.h; + refType = 4; + sourceTree = ""; + }; + 3B73A60307986421001B0B2B = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = CoreAudioHardware.cpp; + refType = 4; + sourceTree = ""; + }; + 3B73A60407986421001B0B2B = { + fileRef = 3B73A60207986421001B0B2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3B73A60507986421001B0B2B = { + fileRef = 3B73A60307986421001B0B2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3B73A67107986CB2001B0B2B = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = CoreAudioDevice.h; + refType = 4; + sourceTree = ""; + }; + 3B73A67207986CB2001B0B2B = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = CoreAudioDevice.cpp; + refType = 4; + sourceTree = ""; + }; + 3B73A67307986CB2001B0B2B = { + fileRef = 3B73A67107986CB2001B0B2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3B73A67407986CB2001B0B2B = { + fileRef = 3B73A67207986CB2001B0B2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3BA4F62007A1C93D00722D4D = { + fileRef = 3BA7946306D4005C0013ADCC; + isa = PBXBuildFile; + settings = { + }; + }; + 3BA696BE06D7FA9A007E5D2B = { + fileRef = 3BE13C7E06D3FAE8005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BA696BF06D7FAA2007E5D2B = { + fileRef = 3BE13C7E06D3FAE8005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BA6971006D8B8EF007E5D2B = { + isa = PBXFileReference; + lastKnownFileType = archive.ar; + name = libgoom2.0.a; + path = iTunes/libgoom2.0.a; + refType = 4; + sourceTree = ""; + }; + 3BA6971E06D8BCE9007E5D2B = { + fileRef = 3BA6971006D8B8EF007E5D2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3BA7946306D4005C0013ADCC = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.xml; + path = "iGoom-StandAlone.plist"; + refType = 4; + sourceTree = ""; + }; + 3BCD10A60798AF8300910E20 = { + children = ( + 3BCD10A70798AF8300910E20, + ); + isa = PBXVariantGroup; + name = Localizable.strings; + path = French.lproj; + refType = 4; + sourceTree = ""; + }; + 3BCD10A70798AF8300910E20 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = French; + path = Localizable.strings; + refType = 4; + sourceTree = ""; + }; + 3BCD10A80798AF8300910E20 = { + fileRef = 3BCD10A60798AF8300910E20; + isa = PBXBuildFile; + settings = { + }; + }; + 3BCD10C30798B01500910E20 = { + children = ( + 3B73A67107986CB2001B0B2B, + 3B73A67207986CB2001B0B2B, + 3B73A60207986421001B0B2B, + 3B73A60307986421001B0B2B, + 3B336D9F06D3DE8E003DCDCB, + 3B336DA006D3DE8E003DCDCB, + ); + isa = PBXGroup; + name = AudioRecorder; + refType = 4; + sourceTree = ""; + }; + 3BCD10C40798B02D00910E20 = { + children = ( + 3B73A57E0798599C001B0B2B, + 3BA7946306D4005C0013ADCC, + 3B336D8F06D3DE8E003DCDCB, + 3B336D9106D3DE8E003DCDCB, + 3BCD10A60798AF8300910E20, + 3BCD18E9079A034800910E20, + ); + isa = PBXGroup; + name = Ressources; + refType = 4; + sourceTree = ""; + }; + 3BCD18E9079A034800910E20 = { + isa = PBXFileReference; + lastKnownFileType = image.icns; + path = icon.icns; + refType = 4; + sourceTree = ""; + }; + 3BCD18EA079A034800910E20 = { + fileRef = 3BCD18E9079A034800910E20; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13C7E06D3FAE8005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = "compiled.mach-o.dylib"; + name = libgoom2.0.dylib; + path = StandAlone/libgoom2.0.dylib; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 3BE13C9006D3FD5D005DAB04 = { + buildActionMask = 2147483647; + files = ( + 3BE13CAC06D3FDB2005DAB04, + 3BE13CAD06D3FDB2005DAB04, + 3BE13CAE06D3FDB2005DAB04, + 3BE13CB006D3FDB2005DAB04, + 3BE13CB106D3FDB2005DAB04, + ); + isa = PBXResourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 3BE13C9106D3FD5D005DAB04 = { + buildActionMask = 2147483647; + files = ( + 3BE13CAF06D3FDB2005DAB04, + 3BE13CBE06D3FE0D005DAB04, + 3BE13D6B06D3FF60005DAB04, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 3BE13C9206D3FD5D005DAB04 = { + buildActionMask = 2147483647; + files = ( + 3BE13CC806D3FE26005DAB04, + 3BA6971E06D8BCE9007E5D2B, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 3BE13C9306D3FD5D005DAB04 = { + buildPhases = ( + 3BE13C9006D3FD5D005DAB04, + 3BE13C9106D3FD5D005DAB04, + 3BE13C9206D3FD5D005DAB04, + ); + buildRules = ( + ); + buildSettings = { + DSTROOT = "$(USER_LIBRARY_DIR)/iTunes/iTunes Plug-ins/"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h"; + GENERATE_PKGINFO_FILE = YES; + HEADER_SEARCH_PATHS = "/usr/local/include/ ../"; + INFOPLIST_FILE = "iTunes/iGoom-Info.plist"; + INSTALL_PATH = ""; + LIBRARY_SEARCH_PATHS = "$(SRCROOT)/iTunes"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = "-framework Carbon"; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = iGoom; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + }; + dependencies = ( + ); + isa = PBXNativeTarget; + name = "iGoom - iTunes"; + productName = iGoom; + productReference = 3BE13C9406D3FD5D005DAB04; + productSettingsXML = " + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + iGoom + CFBundleIdentifier + com.yourcompany.iGoom + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CSResourcesFileMapped + yes + + +"; + productType = "com.apple.product-type.bundle"; + }; + 3BE13C9406D3FD5D005DAB04 = { + explicitFileType = wrapper.cfbundle; + includeInIndex = 0; + isa = PBXFileReference; + path = iGoom.bundle; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3BE13C9506D3FD5D005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = text.xml; + path = "iGoom-Info.plist"; + refType = 4; + sourceTree = ""; + }; + 3BE13C9B06D3FDB2005DAB04 = { + children = ( + 3BE13CBD06D3FE0D005DAB04, + 3BE13D6A06D3FF60005DAB04, + 3BE13C9C06D3FDB2005DAB04, + 3BE13C9E06D3FDB2005DAB04, + 3BE13CA006D3FDB2005DAB04, + 3BE13CA506D3FDB2005DAB04, + 3BE13C9506D3FD5D005DAB04, + ); + isa = PBXGroup; + path = iTunes; + refType = 4; + sourceTree = ""; + }; + 3BE13C9C06D3FDB2005DAB04 = { + children = ( + 3BE13C9D06D3FDB2005DAB04, + 3BE13CA206D3FDB2005DAB04, + ); + isa = PBXVariantGroup; + name = About.strings; + path = ""; + refType = 4; + sourceTree = ""; + }; + 3BE13C9D06D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = English; + path = English.lproj/About.strings; + refType = 4; + sourceTree = ""; + }; + 3BE13C9E06D3FDB2005DAB04 = { + children = ( + 3BE13C9F06D3FDB2005DAB04, + 3BE13CA306D3FDB2005DAB04, + ); + isa = PBXVariantGroup; + name = InfoPlist.strings; + path = ""; + refType = 4; + sourceTree = ""; + }; + 3BE13C9F06D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = English; + path = English.lproj/InfoPlist.strings; + refType = 4; + sourceTree = ""; + }; + 3BE13CA006D3FDB2005DAB04 = { + children = ( + 3BE13CA106D3FDB2005DAB04, + 3BE13CA406D3FDB2005DAB04, + ); + isa = PBXVariantGroup; + name = SettingsDialog.nib; + path = ""; + refType = 4; + sourceTree = ""; + }; + 3BE13CA106D3FDB2005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + name = English; + path = English.lproj/SettingsDialog.nib; + refType = 4; + sourceTree = ""; + }; + 3BE13CA206D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = French; + path = French.lproj/About.strings; + refType = 4; + sourceTree = ""; + }; + 3BE13CA306D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = French; + path = French.lproj/InfoPlist.strings; + refType = 4; + sourceTree = ""; + }; + 3BE13CA406D3FDB2005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + name = French; + path = French.lproj/SettingsDialog.nib; + refType = 4; + sourceTree = ""; + }; + 3BE13CA506D3FDB2005DAB04 = { + children = ( + 3BE13CA606D3FDB2005DAB04, + 3BE13CA706D3FDB2005DAB04, + 3BE13CA806D3FDB2005DAB04, + ); + isa = PBXGroup; + path = iTuneVisualAPI; + refType = 4; + sourceTree = ""; + }; + 3BE13CA606D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.c; + path = iTunesAPI.c; + refType = 4; + sourceTree = ""; + }; + 3BE13CA706D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = iTunesAPI.h; + refType = 4; + sourceTree = ""; + }; + 3BE13CA806D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = iTunesVisualAPI.h; + refType = 4; + sourceTree = ""; + }; + 3BE13CAB06D3FDB2005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = text.rtf; + path = ReadMe.rtf; + refType = 4; + sourceTree = ""; + }; + 3BE13CAC06D3FDB2005DAB04 = { + fileRef = 3BE13C9C06D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CAD06D3FDB2005DAB04 = { + fileRef = 3BE13C9E06D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CAE06D3FDB2005DAB04 = { + fileRef = 3BE13CA006D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CAF06D3FDB2005DAB04 = { + fileRef = 3BE13CA606D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CB006D3FDB2005DAB04 = { + fileRef = 3BE13CA706D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CB106D3FDB2005DAB04 = { + fileRef = 3BE13CA806D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CBD06D3FE0D005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.c; + path = iGoom.c; + refType = 4; + sourceTree = ""; + }; + 3BE13CBE06D3FE0D005DAB04 = { + fileRef = 3BE13CBD06D3FE0D005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CC706D3FE26005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = Carbon.framework; + path = /System/Library/Frameworks/Carbon.framework; + refType = 0; + sourceTree = ""; + }; + 3BE13CC806D3FE26005DAB04 = { + fileRef = 3BE13CC706D3FE26005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13D6A06D3FF60005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.asm; + path = ppc_doubling.s; + refType = 4; + sourceTree = ""; + }; + 3BE13D6B06D3FF60005DAB04 = { + fileRef = 3BE13D6A06D3FF60005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; +//3B0 +//3B1 +//3B2 +//3B3 +//3B4 +//4A0 +//4A1 +//4A2 +//4A3 +//4A4 + 4A9504CCFFE6A4B311CA0CBA = { + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + ZERO_LINK = YES; + }; + isa = PBXBuildStyle; + name = Development; + }; + 4A9504CDFFE6A4B311CA0CBA = { + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + ZERO_LINK = NO; + }; + isa = PBXBuildStyle; + name = Deployment; + }; +//4A0 +//4A1 +//4A2 +//4A3 +//4A4 +//8D0 +//8D1 +//8D2 +//8D3 +//8D4 + 8D1107260486CEB800E47090 = { + buildPhases = ( + 8D1107290486CEB800E47090, + 8D11072C0486CEB800E47090, + 8D11072E0486CEB800E47090, + 3B336E1206D3F5D2003DCDCB, + ); + buildRules = ( + ); + buildSettings = { + GCC_DYNAMIC_NO_PIC = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Standalone/iGoom_Prefix.pch; + HEADER_SEARCH_PATHS = "/usr/local/include/ ../"; + INFOPLIST_FILE = "StandAlone/iGoom-StandAlone.plist"; + INSTALL_PATH = "$(HOME)/Applications"; + LIBRARY_SEARCH_PATHS = "$(SRCROOT)/StandAlone"; + LIBRARY_STYLE = STATIC; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = iGoom; + WRAPPER_EXTENSION = app; + }; + dependencies = ( + ); + isa = PBXNativeTarget; + name = "iGoom - StandAlone"; + productInstallPath = "$(HOME)/Applications"; + productName = iGoom; + productReference = 8D1107320486CEB800E47090; + productType = "com.apple.product-type.application"; + }; + 8D1107290486CEB800E47090 = { + buildActionMask = 2147483647; + files = ( + 3B336DA106D3DE8E003DCDCB, + 3B336DA506D3DE8E003DCDCB, + 3B336DA606D3DE8E003DCDCB, + 3B336DA706D3DE8E003DCDCB, + 3B336DA906D3DE8E003DCDCB, + 3B336DAB06D3DE8E003DCDCB, + 3B336DAF06D3DE8E003DCDCB, + 3B336DB106D3DE8E003DCDCB, + 3B336DB306D3DE8E003DCDCB, + 3B73A57F0798599C001B0B2B, + 3B73A60407986421001B0B2B, + 3B73A67307986CB2001B0B2B, + 3BCD10A80798AF8300910E20, + 3BCD18EA079A034800910E20, + 3BA4F62007A1C93D00722D4D, + ); + isa = PBXResourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8D11072C0486CEB800E47090 = { + buildActionMask = 2147483647; + files = ( + 3B336DA206D3DE8E003DCDCB, + 3B336DA806D3DE8E003DCDCB, + 3B336DAA06D3DE8E003DCDCB, + 3B336DAC06D3DE8E003DCDCB, + 3B336DAE06D3DE8E003DCDCB, + 3B336DB006D3DE8E003DCDCB, + 3B336DB206D3DE8E003DCDCB, + 3B336DB406D3DE8E003DCDCB, + 3B73A60507986421001B0B2B, + 3B73A67407986CB2001B0B2B, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8D11072E0486CEB800E47090 = { + buildActionMask = 2147483647; + files = ( + 8D11072F0486CEB800E47090, + 3B336C0A06D1537B003DCDCB, + 3B336CD706D159F9003DCDCB, + 3BA696BE06D7FA9A007E5D2B, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8D11072F0486CEB800E47090 = { + fileRef = 1058C7A1FEA54F0111CA2CBB; + isa = PBXBuildFile; + settings = { + }; + }; + 8D1107320486CEB800E47090 = { + explicitFileType = wrapper.application; + includeInIndex = 0; + isa = PBXFileReference; + path = iGoom.app; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; + }; + rootObject = 29B97313FDCFA39411CA2CEA; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,3 @@ +/* Localized versions of about strings */ + +"AboutString" = "Made by Jeko, Gyom and Fred\n \nKeys :\nQ to switch Quality (Pixel Doubling)\nF to toggle frame rate display\nT to disable this display\n< and > to change sensitivity\n \nContact : Gyom (gyom@ios-software.com)"; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,7 @@ +/* Localized versions of Info.plist keys */ + +CFBundleName = "iGoom"; +CFBundleShortVersionString = "2.0"; +CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001/2003, iOS."; +NSHumanReadableCopyright = "Copyright 2001/2003, iOS."; +CFBundleVersion = "2.0"; \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,4 @@ +{ +IBClasses = (); +IBVersion = 1; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ + + + + + IBDocumentLocation + 123 115 356 240 0 0 1280 1002 + IBFramework Version + 364.0 + IBOpenObjects + + 166 + + IBSystem Version + 7M34 + targetFramework + IBCarbonFramework + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,138 @@ + + + IBCarbonFramework + + NSApplication + + + + 226 360 483 751 + Settings + + 0 0 257 391 + 0 0 391 257 + + + 20 20 143 170 + 20 20 150 123 + FALSE + + + 20 194 38 351 + 194 20 157 18 + cbox + 2 + Pixel doubling (Q) + + + 217 163 237 233 + 163 217 70 20 + 1 + OK + ok + 1 + + + 72 20 86 170 + 20 72 150 14 + iGoom 2k4 + 1 + + + 189 30 205 361 + 30 189 331 16 + http://www.ios-software.com/ + 1 + + + 46 194 60 351 + 194 46 157 14 + cbox + 3 + Show frame rate (F) + + + 165 30 181 361 + 30 165 331 16 + Support and bug report : gyom@ios-software.com + 1 + + + 119 193 145 371 + 193 119 178 26 + slid + 4 + TRUE + 11 + 160 + 70 + 250 + + + 99 194 115 371 + 194 99 177 16 + Sensitivity (< and >) : + + + 68 194 82 371 + 194 68 177 14 + cbox + 5 + Show infos when idle (T) + + + + FALSE + FALSE + FALSE + FALSE + FALSE + FALSE + TRUE + 4 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + File's Owner + + IBCarbonButton + + IBCarbonCheckBox + + IBCarbonStaticText + + IBCarbonStaticText21 + + IBCarbonStaticText211 + + PluginSettings + + + 210 + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,3 @@ +/* Localized versions of about strings */ + +"AboutString" = "Ecrit par Jeko, Gyom et Fred\n \nTouches :\nQ pour changer de qualite\nF pour voir la frequence d'affichage\nT pour desactiver cet affichage\n< et > pour modifier la sensibilite\n \nContact : Gyom (gyom@ios-software.com)"; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,7 @@ +/* Localized versions of Info.plist keys */ + +CFBundleName = "iGoom"; +CFBundleShortVersionString = "2.0"; +CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001/2003, iOS."; +NSHumanReadableCopyright = "Copyright 2001/2003, iOS."; +CFBundleVersion = "2.0"; \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,4 @@ +{ +IBClasses = (); +IBVersion = 1; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ + + + + + IBDocumentLocation + 123 115 356 240 0 0 1280 1002 + IBFramework Version + 364.0 + IBOpenObjects + + 166 + + IBSystem Version + 7M34 + targetFramework + IBCarbonFramework + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,138 @@ + + + IBCarbonFramework + + NSApplication + + + + 61 758 318 1149 + Réglages + + 0 0 257 391 + 0 0 391 257 + + + 20 20 143 170 + 20 20 150 123 + FALSE + + + 20 194 38 371 + 194 20 177 18 + cbox + 2 + Pixels doublés (Q) + + + 217 163 237 233 + 163 217 70 20 + 1 + OK + ok + 1 + + + 72 20 86 170 + 20 72 150 14 + iGoom 2k4 + 1 + + + 189 30 205 361 + 30 189 331 16 + http://www.ios-software.com/ + 1 + + + 46 194 60 371 + 194 46 177 14 + cbox + 3 + Fréquence d'affichage (F) + + + 165 20 181 371 + 20 165 351 16 + Support et retours de bugs : gyom@ios-software.com + 1 + + + 119 193 145 371 + 193 119 178 26 + slid + 4 + TRUE + 11 + 160 + 70 + 250 + + + 99 194 115 371 + 194 99 177 16 + Sensibilité (< et >) : + + + 68 194 82 371 + 194 68 177 14 + cbox + 5 + Afficher les infos (T) + + + + FALSE + FALSE + FALSE + FALSE + FALSE + FALSE + TRUE + 4 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + File's Owner + + IBCarbonButton + + IBCarbonCheckBox + + IBCarbonStaticText + + IBCarbonStaticText21 + + IBCarbonStaticText211 + + PluginSettings + + + 210 + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,896 @@ +// includes +#include +#include "iTunesVisualAPI.h" +#include "iTunesAPI.h" +#include "src/goom.h" +#include +#include + +//***************************************************** +#include +#include +//***************************************************** + +CFStringRef CFBundleIdentifier; + +extern void ppc_doubling(unsigned int,UInt32 *,UInt32 *,UInt32 *,UInt32,UInt32); + +// typedef's, struct's, enum's, etc. +#define kTVisualPluginName "\piGoom" +#define kTVisualPluginCreator 'gyom' +#define kTVisualPluginMajorVersion 2 +#define kTVisualPluginMinorVersion 4 +#define kTVisualPluginReleaseStage betaStage +#define kTVisualPluginNonFinalRelease 1 + +#define VERSION "2k4" + +#define kPixelDoublingPrefName "PixelDoubling" +#define kShowFPSPrefName "ShowFPS" +#define kSensitivityPrefName "Sensitivity" +#define kShowAboutWhenIdlePrefName "ShowAboutWhenIdle" + +//#define Timers + +enum +{ + kOKSettingID = 1, + kPixelDoublingSettingID = 2, + kFrameRateSettingID = 3, + kSensitivitySettingID = 4, + kShowAboutWhenIdleSettingID = 5 +}; + +typedef struct VisualPluginData { + void * appCookie; + ITAppProcPtr appProc; + ITFileSpec pluginFileSpec; + + CGrafPtr destPort; + Rect destRect; + OptionBits destOptions; + UInt32 destBitDepth; + + ITTrackInfo trackInfo; + ITStreamInfo streamInfo; + + Boolean playing; + + // Plugin-specific data + GWorldPtr offscreen; + signed short data[2][512]; +} VisualPluginData; + + +// local (static) globals +//static unsigned int useSpectrum = 0; +static CGrafPtr gSavePort; +static GDHandle gSaveDevice; +static unsigned int changeRes = FALSE; +static unsigned int oldx = 0, oldy = 0; +static signed int forced = 0; +static unsigned int showFPS = 0; +static int showTexte = 0, showTitle = 1; +static Boolean doublePixels = true; +static int sensitivity = 160; +static int ShowAboutWhenIdle = 0; +static AbsoluteTime backUpTime; +static char * aboutMessage; + +static PluginInfo * goomInfo; + + +// exported function prototypes +extern OSStatus iTunesPluginMainMachO(OSType message,PluginMessageInfo *messageInfo,void *refCon); + +// Calcul de diff de temps +#ifdef Timers +static void HowLong(const char* text) +{ + AbsoluteTime absTime; + Nanoseconds nanosec; + + absTime = SubAbsoluteFromAbsolute(UpTime(), backUpTime); + nanosec = AbsoluteToNanoseconds(absTime); + fprintf(stderr,"Time for %s: %f\n", text, (float) UnsignedWideToUInt64( nanosec ) / 1000000.0); + backUpTime = UpTime(); +} +#else +#define HowLong(a) +#endif + +// ProcessRenderData --> preprocessing des donnees en entre +static void ProcessRenderData(VisualPluginData *visualPluginData,const RenderVisualData *renderData) +{ + SInt16 index; + SInt32 channel; + + if (renderData == nil) + { + bzero(&visualPluginData->data,sizeof(visualPluginData->data)); + return; + } + else + { + for (channel = 0;channel < 2;channel++) + { + for (index = 0; index < 512; index++) + visualPluginData->data[channel][index] = (renderData->waveformData[channel][index]-127)*sensitivity; + } + } +} + +// GetPortCopyBitsBitMap +// +static BitMap* GetPortCopyBitsBitMap(CGrafPtr port) +{ + BitMap* destBMap; + +#if ACCESSOR_CALLS_ARE_FUNCTIONS + destBMap = (BitMap*)GetPortBitMapForCopyBits(port); +#else +#if OPAQUE_TOOLBOX_STRUCTS + PixMapHandle pixMap; + + pixMap = GetPortPixMap(port); + destBMap = (BitMap*) (*pixMap); +#else + destBMap = (BitMap*) &((GrafPtr)port)->portBits; +#endif +#endif + return destBMap; +} + +// RenderVisualPort +/* OK, This is pretty weird : if we are not in pixel doubling mode, +the goom internal buffer is copied on destPort via CopyBits(). +Now, if we are in pixel doubling mode : if we are full screen, +the goom internal buffer is copied on another buffer with ppc_doubling() +and then to destPort with CopyBits().*/ + +char * Str255ToC(Str255 source) +{ + static char dst[255]; + char * cur = dst, * src = (char*)source; + int i; + int size = *src; + if (source == NULL) return ""; + src++; + for (i=0; ioffscreen); + Point pt = {0,0}; + static float fpssampler = 0; + static char textBuffer[15]; + static char titleBuffer[255]; + unsigned char * str, * str2; + + AbsoluteTime absTime; + Nanoseconds nanosec; + + LocalToGlobal(&pt); + fullscreen = (pt.v == 0); + + if ((NULL == destPort) || (NULL == destRect) || (NULL == visualPluginData->offscreen)) return; + + absTime = SubAbsoluteFromAbsolute(UpTime(), backUpTime); + nanosec = AbsoluteToNanoseconds(absTime); + fpssampler = 1000000000.0 / (float) UnsignedWideToUInt64( nanosec ); + if (fpssampler>35) return; + backUpTime = UpTime(); + + + GetGWorld(&gSavePort,&gSaveDevice); + SetGWorld(destPort,nil); + + srcBitMap = GetPortCopyBitsBitMap(visualPluginData->offscreen); + dstBitMap = GetPortCopyBitsBitMap(destPort); + + OffsetRect(&srcRect,-srcRect.left,-srcRect.top); + if (!pixMapHdl || !*pixMapHdl) return; + + right = srcRect.right; + bottom = srcRect.bottom; + if ((right<2) || (bottom<2)) return; + + // Update our offscreen pixmap + if ((changeRes) || (oldx != right) || (oldy != bottom)) + { + if (doublePixels) + goom_set_resolution (goomInfo,right%2 + right/2, bottom/2 + bottom%2); + else + goom_set_resolution (goomInfo,right, bottom); + oldx = right; + oldy = bottom; + changeRes = FALSE; + } + + str2 = NULL; + if (showTitle == 0) + { + strcpy(titleBuffer, Str255ToC(visualPluginData->trackInfo.name)); + str2 = titleBuffer; + str = " "; + showTexte = 10000; + } + else + { + if (ShowAboutWhenIdle) + { + switch (showTexte) + { + case 0: + str2 = " "; + sprintf(textBuffer,"The iGoom %s",VERSION); + str = textBuffer; + break; + case 500: + str = "http://www.ios-software.com/"; + break; + case 1000 : + str = aboutMessage; + break; + default : + str = NULL; + break; + } + } + else + { + str = " "; + } + } + + if (doublePixels) + { + UInt32 rowBytes = (GetPixRowBytes(pixMapHdl))>>2; + register UInt32 *myX = (UInt32*) GetPixBaseAddr(pixMapHdl); + register UInt32 inc = 2*rowBytes - right - right%2; + register UInt32 *myx = (UInt32*) goom_update (goomInfo,visualPluginData->data,forced,(showFPS > 0)?fpssampler:-1,str2,str); + + ppc_doubling(right/2 + right%2, myx, myX, myX + rowBytes, bottom/2,inc*4); + srcBitMap = GetPortCopyBitsBitMap(visualPluginData->offscreen); + CopyBits(srcBitMap,dstBitMap,&srcRect,&dstRect,srcCopy,nil); + } + else + { + NewGWorldFromPtr(&offscreen, k32ARGBPixelFormat,&srcRect, NULL, NULL, 0, (Ptr) goom_update (goomInfo,visualPluginData->data,forced, (showFPS > 0)?fpssampler:-1, str2, str), right*4); + HowLong("Goom"); + srcBitMap = GetPortCopyBitsBitMap(offscreen); + CopyBits(srcBitMap,dstBitMap,&srcRect,&dstRect,srcCopy,nil); + DisposeGWorld(offscreen); + } + showTexte++; + if (showTexte>10000) showTexte = 10000; + showTitle = 1; + if (forced>0) forced = -1; + + SetGWorld(gSavePort,gSaveDevice); +} + + +/* AllocateVisualData is where you should allocate any information that depends +on the port or rect changing (like offscreen GWorlds). */ +static OSStatus AllocateVisualData(VisualPluginData *visualPluginData,CGrafPtr destPort,const Rect *destRect) +{ + OSStatus status; + Rect allocateRect; + + (void) destPort; + + GetGWorld(&gSavePort,&gSaveDevice); + + allocateRect = *destRect; + OffsetRect(&allocateRect,-allocateRect.left,-allocateRect.top); + + status = NewGWorld(&visualPluginData->offscreen,32,&allocateRect,nil,nil,useTempMem); + if (status == noErr) + { + PixMapHandle pix = GetGWorldPixMap(visualPluginData->offscreen); + LockPixels(pix); + + // Offscreen starts out black + SetGWorld(visualPluginData->offscreen,nil); + ForeColor(blackColor); + PaintRect(&allocateRect); + } + SetGWorld(gSavePort,gSaveDevice); + + return status; +} + +// DeallocateVisualData is where you should deallocate the . +static void DeallocateVisualData(VisualPluginData *visualPluginData) +{ + CFPreferencesAppSynchronize(CFBundleIdentifier); + + if (visualPluginData->offscreen != nil) + { + DisposeGWorld(visualPluginData->offscreen); + visualPluginData->offscreen = nil; + } +} + +// ChangeVisualPort +static OSStatus ChangeVisualPort(VisualPluginData *visualPluginData,CGrafPtr destPort,const Rect *destRect) +{ + OSStatus status; + Boolean doAllocate; + Boolean doDeallocate; + + status = noErr; + + doAllocate = false; + doDeallocate = false; + + if (destPort != nil) + { + if (visualPluginData->destPort != nil) + { + if (false == EqualRect(destRect,&visualPluginData->destRect)) + { + doDeallocate = true; + doAllocate = true; + } + } + else + { + doAllocate = true; + } + } + else + { + doDeallocate = true; + } + + if (doDeallocate) + DeallocateVisualData(visualPluginData); + + if (doAllocate) + status = AllocateVisualData(visualPluginData,destPort,destRect); + + if (status != noErr) + destPort = nil; + + visualPluginData->destPort = destPort; + if (destRect != nil) + visualPluginData->destRect = *destRect; + + return status; +} + +// ResetRenderData +static void ResetRenderData(VisualPluginData *visualPluginData) +{ + bzero(&visualPluginData->data,sizeof(visualPluginData->data)); +} + +// settingsControlHandler +pascal OSStatus settingsControlHandler(EventHandlerCallRef inRef,EventRef inEvent, void* userData) +{ + WindowRef wind=NULL; + ControlID controlID; + ControlRef control=NULL; + //get control hit by event + GetEventParameter(inEvent,kEventParamDirectObject,typeControlRef,NULL,sizeof(ControlRef),NULL,&control); + wind=GetControlOwner(control); + GetControlID(control,&controlID); + switch(controlID.id){ + + case kShowAboutWhenIdleSettingID: + ShowAboutWhenIdle = GetControlValue(control); + CFPreferencesSetAppValue (CFSTR(kShowAboutWhenIdlePrefName),ShowAboutWhenIdle?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); + break; + + case kPixelDoublingSettingID: + doublePixels = GetControlValue(control); + CFPreferencesSetAppValue (CFSTR(kPixelDoublingPrefName),doublePixels?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); + changeRes = TRUE; + break; + + case kFrameRateSettingID: + showFPS = GetControlValue( control ); + CFPreferencesSetAppValue (CFSTR(kShowFPSPrefName),showFPS?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); + break; + + case kSensitivitySettingID: + sensitivity = GetControlValue( control ); + { + CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity); + CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier); + CFRelease(value); + } + break; + + case kOKSettingID: + HideWindow(wind); + break; + } + return noErr; +} + +// VisualPluginHandler +static OSStatus VisualPluginHandler(OSType message,VisualPluginMessageInfo *messageInfo,void *refCon) +{ + OSStatus status; + VisualPluginData * visualPluginData; + + visualPluginData = (VisualPluginData*) refCon; + + status = noErr; + + switch (message) + { + // Sent when the visual plugin is registered. The plugin should do minimal + // memory allocations here. The resource fork of the plugin is still available. + case kVisualPluginInitMessage: + { + visualPluginData = (VisualPluginData*) NewPtrClear(sizeof(VisualPluginData)); + if (visualPluginData == nil) + { + status = memFullErr; + break; + } + visualPluginData->appCookie = messageInfo->u.initMessage.appCookie; + visualPluginData->appProc = messageInfo->u.initMessage.appProc; + // Remember the file spec of our plugin file. + // We need this so we can open our resource fork during + // the configuration message + + status = PlayerGetPluginFileSpec(visualPluginData->appCookie, visualPluginData->appProc, &visualPluginData->pluginFileSpec); + messageInfo->u.initMessage.refCon = (void*) visualPluginData; + goomInfo = goom_init(100,100); + + //fprintf(stderr,"Loc : %s\n", CFStringGetCStringPtr(CFCopyLocalizedStringFromTableInBundle(CFSTR("AboutString"), CFSTR("About"), CFBundleGetBundleWithIdentifier(CFBundleIdentifier), NULL),kCFStringEncodingMacRoman)); + + aboutMessage = (char*)CFStringGetCStringPtr(CFCopyLocalizedStringFromTableInBundle(CFSTR("AboutString"), CFSTR("About"), CFBundleGetBundleWithIdentifier(CFBundleIdentifier), NULL),kCFStringEncodingMacRoman); + + break; + } + + // Sent when the visual plugin is unloaded + case kVisualPluginCleanupMessage: + if (visualPluginData != nil) + DisposePtr((Ptr)visualPluginData); + + goom_close(goomInfo); + break; + + // Sent when the visual plugin is enabled. iTunes currently enables all + // loaded visual plugins. The plugin should not do anything here. + case kVisualPluginEnableMessage: + if (true == visualPluginData->playing) + { + showTexte = 10000; + showTitle = 0; + } + else + { + showTexte = 0; + showTitle = 1; + } + case kVisualPluginDisableMessage: + break; + + // Sent if the plugin requests idle messages. Do this by setting the kVisualWantsIdleMessages + // option in the RegisterVisualMessage.options field. + case kVisualPluginIdleMessage: + RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,false); + break; + + // Sent if the plugin requests the ability for the user to configure it. Do this by setting + // the kVisualWantsConfigure option in the RegisterVisualMessage.options field. + case kVisualPluginConfigureMessage: + { + + // kOKSettingID = 1, + //kPixelDoublingSettingID = 2, + //kFrameRateSettingID = 3, + //kSensitivitySettingID = 4 + + static EventTypeSpec controlEvent={kEventClassControl,kEventControlHit}; + static const ControlID kPixelDoublingSettingControlID={'cbox',kPixelDoublingSettingID}; + static const ControlID kFrameRateSettingControlID={'cbox',kFrameRateSettingID}; + static const ControlID kSensitivitySettingControlID={'slid',kSensitivitySettingID}; + static const ControlID kShowAboutWhenIdleSettingControlID={'cbox',kShowAboutWhenIdleSettingID}; + static WindowRef settingsDialog=NULL; + static ControlRef PixelDoublingCTRL=NULL; + static ControlRef FrameRateCTRL=NULL; + static ControlRef SensitivityCTRL=NULL; + static ControlRef ShowAboutWhenIdleCTRL=NULL; + + if(settingsDialog==NULL){ + IBNibRef nibRef; + CFBundleRef iGoomPlugin; + //we have to find our bundle to load the nib inside of it + iGoomPlugin=CFBundleGetBundleWithIdentifier(CFBundleIdentifier); + CreateNibReferenceWithCFBundle(iGoomPlugin,CFSTR("SettingsDialog"), &nibRef); + CreateWindowFromNib(nibRef, CFSTR("PluginSettings"), &settingsDialog); + DisposeNibReference(nibRef); + + + //fprintf (stderr,"Picture @ %d\n", (PicHandle)GetPicture (12866)); + + InstallWindowEventHandler(settingsDialog,NewEventHandlerUPP(settingsControlHandler), + 1,&controlEvent,0,NULL); + GetControlByID(settingsDialog,&kPixelDoublingSettingControlID,&PixelDoublingCTRL); + GetControlByID(settingsDialog,&kFrameRateSettingControlID,&FrameRateCTRL); + GetControlByID(settingsDialog,&kSensitivitySettingControlID,&SensitivityCTRL); + GetControlByID(settingsDialog,&kShowAboutWhenIdleSettingControlID,&ShowAboutWhenIdleCTRL); + } + SetControlValue(PixelDoublingCTRL,doublePixels); + SetControlValue(FrameRateCTRL,showFPS); + SetControlValue(SensitivityCTRL,sensitivity); + SetControlValue(ShowAboutWhenIdleCTRL,ShowAboutWhenIdle); + + ShowWindow(settingsDialog); + } + break; + + // Sent when iTunes is going to show the visual plugin in a port. At + // this point,the plugin should allocate any large buffers it needs. + case kVisualPluginShowWindowMessage: + if (true == visualPluginData->playing) + { + showTexte = 10000; + showTitle = 0; + } + else + { + showTexte = 0; + showTitle = 1; + } + visualPluginData->destOptions = messageInfo->u.showWindowMessage.options; + status = ChangeVisualPort( visualPluginData, messageInfo->u.showWindowMessage.port, + &messageInfo->u.showWindowMessage.drawRect); + //FIXME setres here + break; + // Sent when iTunes is no longer displayed. + case kVisualPluginHideWindowMessage: + + (void) ChangeVisualPort(visualPluginData,nil,nil); + + bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo)); + bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo)); + break; + + // Sent when iTunes needs to change the port or rectangle of the currently + // displayed visual. + case kVisualPluginSetWindowMessage: + visualPluginData->destOptions = messageInfo->u.setWindowMessage.options; + + status = ChangeVisualPort( visualPluginData, + messageInfo->u.setWindowMessage.port, + &messageInfo->u.setWindowMessage.drawRect); + break; + + // Sent for the visual plugin to render a frame. + case kVisualPluginRenderMessage: + ProcessRenderData(visualPluginData,messageInfo->u.renderMessage.renderData); + RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,false); + break; + + // Sent in response to an update event. The visual plugin should update + // into its remembered port. This will only be sent if the plugin has been + // previously given a ShowWindow message. + case kVisualPluginUpdateMessage: + RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true); + break; + + // Sent when the player starts. + case kVisualPluginPlayMessage: + if (messageInfo->u.playMessage.trackInfo != nil) + visualPluginData->trackInfo = *messageInfo->u.playMessage.trackInfo; + else + bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo)); + + if (messageInfo->u.playMessage.streamInfo != nil) + visualPluginData->streamInfo = *messageInfo->u.playMessage.streamInfo; + else + bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo)); + + visualPluginData->playing = true; + showTexte = 10000; + showTitle = 0; + break; + + // Sent when the player changes the current track information. This + // is used when the information about a track changes,or when the CD + // moves onto the next track. The visual plugin should update any displayed + // information about the currently playing song. + case kVisualPluginChangeTrackMessage: + if (messageInfo->u.changeTrackMessage.trackInfo != nil) + visualPluginData->trackInfo = *messageInfo->u.changeTrackMessage.trackInfo; + else + bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo)); + + if (messageInfo->u.changeTrackMessage.streamInfo != nil) + visualPluginData->streamInfo = *messageInfo->u.changeTrackMessage.streamInfo; + else + bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo)); + showTexte = 10000; + showTitle = 0; + break; + + // Sent when the player stops. + case kVisualPluginStopMessage: + visualPluginData->playing = false; + ResetRenderData(visualPluginData); + //RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true); + showTexte = 0; + showTitle = 1; + break; + + // Sent when the player changes position. + case kVisualPluginSetPositionMessage: + break; + + // Sent when the player pauses. iTunes does not currently use pause or unpause. + // A pause in iTunes is handled by stopping and remembering the position. + case kVisualPluginPauseMessage: + visualPluginData->playing = false; + ResetRenderData(visualPluginData); + //RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true); + break; + + // Sent when the player unpauses. iTunes does not currently use pause or unpause. + // A pause in iTunes is handled by stopping and remembering the position. + case kVisualPluginUnpauseMessage: + visualPluginData->playing = true; + break; + + // Sent to the plugin in response to a MacOS event. The plugin should return noErr + // for any event it handles completely,or an error (unimpErr) if iTunes should handle it. + case kVisualPluginEventMessage: + { + EventRecord* tEventPtr = messageInfo->u.eventMessage.event; + if ((tEventPtr->what == keyDown) || (tEventPtr->what == autoKey)) + { // charCodeMask,keyCodeMask; + char theChar = tEventPtr->message & charCodeMask; + + switch (theChar) // Process keys here + { + + case 't': + case 'T': + ShowAboutWhenIdle = (ShowAboutWhenIdle==0)?1:0; + CFPreferencesSetAppValue (CFSTR(kShowAboutWhenIdlePrefName),ShowAboutWhenIdle?CFSTR("YES"):CFSTR("NO"), CFBundleIdentifier); + break; + case 'q': + case 'Q': + doublePixels = (doublePixels==0)?1:0; + CFPreferencesSetAppValue (CFSTR(kPixelDoublingPrefName),doublePixels?CFSTR("YES"):CFSTR("NO"), CFBundleIdentifier); + changeRes = TRUE; + break; + case '0': + forced = (forced == 0) ? -1 : 0; + break; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + forced = theChar - '0'; + break; + case 'f': + case 'F': + showFPS = (showFPS==0)?1:0; + CFPreferencesSetAppValue (CFSTR(kShowFPSPrefName),showFPS?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); + break; + + case '>': + if (sensitivity <= 240) sensitivity += 10; + { + CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity); + CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier); + CFRelease(value); + } + break; + case '<': + if (sensitivity >= 80) sensitivity -= 10; + { + CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity); + CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier); + CFRelease(value); + } + break; + + case '\r': + case '\n': + break; + default: + status = unimpErr; + break; + } + } + else + status = unimpErr; + } + break; + + default: + status = unimpErr; + break; + } + return status; +} + +// RegisterVisualPlugin +static OSStatus RegisterVisualPlugin(PluginMessageInfo *messageInfo) +{ + OSStatus status; + PlayerMessageInfo playerMessageInfo; + Str255 pluginName = kTVisualPluginName; +#ifdef Timers + backUpTime = UpTime(); +#endif + + CFStringRef aString; + CFNumberRef aNumber; + CFComparisonResult result; + + CFBundleIdentifier = CFSTR("com.ios.igoom"); + + // Read the preferences + aString = CFPreferencesCopyAppValue(CFSTR(kPixelDoublingPrefName),CFBundleIdentifier); + if (aString != NULL) + { + result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive); + if (result == kCFCompareEqualTo) { + doublePixels = true; + } + else doublePixels = false; + } + + aString = CFPreferencesCopyAppValue(CFSTR(kShowFPSPrefName),CFBundleIdentifier); + if (aString != NULL) + { + result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive); + if (result == kCFCompareEqualTo) { + showFPS = true; + } + else showFPS = false; + } + + aString = CFPreferencesCopyAppValue(CFSTR(kShowAboutWhenIdlePrefName),CFBundleIdentifier); + if (aString != NULL) + { + result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive); + if (result == kCFCompareEqualTo) { + ShowAboutWhenIdle = true; + } + else ShowAboutWhenIdle = false; + } + + aNumber = CFPreferencesCopyAppValue(CFSTR(kSensitivityPrefName),CFBundleIdentifier); + if (aNumber != NULL) + { + CFNumberGetValue(aNumber,kCFNumberIntType,&sensitivity); + } + + + + + bzero(&playerMessageInfo.u.registerVisualPluginMessage,sizeof(playerMessageInfo.u.registerVisualPluginMessage)); + BlockMoveData((Ptr)&pluginName[0],(Ptr)&playerMessageInfo.u.registerVisualPluginMessage.name[0],pluginName[0] + 1); + + SetNumVersion(&playerMessageInfo.u.registerVisualPluginMessage.pluginVersion, kTVisualPluginMajorVersion, kTVisualPluginMinorVersion, kTVisualPluginReleaseStage, kTVisualPluginNonFinalRelease); + + playerMessageInfo.u.registerVisualPluginMessage.options = kVisualWantsIdleMessages | kVisualWantsConfigure; + playerMessageInfo.u.registerVisualPluginMessage.handler = (VisualPluginProcPtr)VisualPluginHandler; + playerMessageInfo.u.registerVisualPluginMessage.registerRefCon = 0; + playerMessageInfo.u.registerVisualPluginMessage.creator = kTVisualPluginCreator; + + playerMessageInfo.u.registerVisualPluginMessage.timeBetweenDataInMS = 0xFFFFFFFF; // 16 milliseconds = 1 Tick, 0xFFFFFFFF = Often as possible. + playerMessageInfo.u.registerVisualPluginMessage.numWaveformChannels = 2; + playerMessageInfo.u.registerVisualPluginMessage.numSpectrumChannels = 0; + + playerMessageInfo.u.registerVisualPluginMessage.minWidth = 100; + playerMessageInfo.u.registerVisualPluginMessage.minHeight = 100; + playerMessageInfo.u.registerVisualPluginMessage.maxWidth = 2000; + playerMessageInfo.u.registerVisualPluginMessage.maxHeight = 2000; + playerMessageInfo.u.registerVisualPluginMessage.minFullScreenBitDepth = 32; + playerMessageInfo.u.registerVisualPluginMessage.maxFullScreenBitDepth = 32; + playerMessageInfo.u.registerVisualPluginMessage.windowAlignmentInBytes = 0; + + status = PlayerRegisterVisualPlugin(messageInfo->u.initMessage.appCookie,messageInfo->u.initMessage.appProc,&playerMessageInfo); +/* + Gestalt(gestaltPowerPCProcessorFeatures,&CPU); + if (1 & (CPU >> gestaltPowerPCHasVectorInstructions)) CPU_FLAVOUR = 1; + else CPU_FLAVOUR = 0; +*/ + + return status; +} + +// main entrypoint +OSStatus iTunesPluginMainMachO(OSType message,PluginMessageInfo *messageInfo,void *refCon) +{ + OSStatus status; + + (void) refCon; + + switch (message) + { + case kPluginInitMessage: + status = RegisterVisualPlugin(messageInfo); + break; + case kPluginCleanupMessage: + status = noErr; + break; + default: + status = unimpErr; + break; + } + + return status; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,46 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + iGoom + CFBundleGetInfoString + 2k4 iGoom for iTunes © gyom & jeko / iOS + CFBundleIdentifier + com.ios.igoom + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + iGoom ! + CFBundlePackageType + hvpl + CFBundleShortVersionString + 2.4.1 + CFBundleSignature + hook + CFBundleVersion + 2.4.2 + CFPlugInDynamicRegisterFunction + + CFPlugInDynamicRegistration + NO + CFPlugInFactories + + 00000000-0000-0000-0000-000000000000 + MyFactoryFunction + + CFPlugInTypes + + 00000000-0000-0000-0000-000000000000 + + 00000000-0000-0000-0000-000000000000 + + + CFPlugInUnloadFunction + + NSMainNibFile + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ +(* iTunes installer script for iGoom *) (* If application is running, warn and quit it *) set pid to do shell script "ps -U ${USER} | grep /Applications/iTunes.app/Contents/MacOS/iTunes | grep -v grep | cut -c1-5" if pid is not "" then display dialog "iTunes must not be running while installing. Can I quit it?" with icon 2 tell application "iTunes" quit end tell end if (* Install the new plugin *) set cmd to "\\rm -rf ~/\"Library/iTunes/iTunes Plug-ins\"iGoom.bundle" do shell script cmd set r to "err" set cmd to "\\cp -Rf /Volumes/iGoom/iGoom.bundle ~/\"Library/iTunes/iTunes Plug-ins\"" try do shell script cmd set r to "" end try if r is not "" then (* Troubleshooting *) display dialog "There was a problem during installation." buttons {"Open ReadMe", "Forum", "OK"} default button 1 with icon 0 set dresult to button returned of result if dresult is "Open ReadMe" then do shell script "open /Volumes/iGoom/ReadMe.rtf" else if dresult is "Forum" then open location "http://www.ios-software.com/?page=forum&quoi=1" end if end if else (* relaunch, but not too quickly ! *) set relaunched to false repeat until relaunched is true try tell application "iTunes" activate end tell set relaunched to true end try end repeat (* Select the new plugin et show it if possible *) tell application "iTunes" repeat with i in visuals if name of i is "iGoom" then set current visual to i try set full screen to false set visuals enabled to true play first item of library playlists end try end if end repeat end tell (* Tell the user the plugin was successfully installed *) activate display dialog "Installation was successful. If you like Goom, consider donating or buying some goodies !" buttons {"iOS Store", "Donate", "Use Goom"} default button "iOS Store" with icon 1 set dresult to button returned of result if dresult is "iOS Store" then open location "http://www.cafepress.com/iossoftware" end if if dresult is "Donate" then open location "http://www.ios-software.com/?page=index&what=about" end if if dresult is "Use Goom" then tell application "iTunes" activate end tell end if end if \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ +/* File: iTunesAPI.c Contains: iTunes Plug-ins interfaces Version: Technology: iTunes Release: 1.1 Copyright: 2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #include "iTunesAPI.h" #include "iTunesVisualAPI.h" // MemClear // static void MemClear (LogicalAddress dest, SInt32 length) { register unsigned char *ptr; ptr = (unsigned char *) dest; if( length > 16 ) { register unsigned long *longPtr; while( ((unsigned long) ptr & 3) != 0 ) { *ptr++ = 0; --length; } longPtr = (unsigned long *) ptr; while( length >= 4 ) { *longPtr++ = 0; length -= 4; } ptr = (unsigned char *) longPtr; } while( --length >= 0 ) { *ptr++ = 0; } } // SetNumVersion // void SetNumVersion (NumVersion *numVersion, UInt8 majorRev, UInt8 minorAndBugRev, UInt8 stage, UInt8 nonRelRev) { numVersion->majorRev = majorRev; numVersion->minorAndBugRev = minorAndBugRev; numVersion->stage = stage; numVersion->nonRelRev = nonRelRev; } // ITCallApplication // OSStatus ITCallApplication (void *appCookie, ITAppProcPtr handler, OSType message, PlayerMessageInfo *messageInfo) { PlayerMessageInfo localMessageInfo; if (messageInfo == nil) { MemClear(&localMessageInfo, sizeof(localMessageInfo)); messageInfo = &localMessageInfo; } messageInfo->messageMajorVersion = kITCurrentPluginMajorMessageVersion; messageInfo->messageMinorVersion = kITCurrentPluginMinorMessageVersion; messageInfo->messageInfoSize = sizeof(PlayerMessageInfo); return handler(appCookie, message, messageInfo); } // PlayerSetFullScreen // OSStatus PlayerSetFullScreen (void *appCookie, ITAppProcPtr appProc, Boolean fullScreen) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setFullScreenMessage.fullScreen = fullScreen; return ITCallApplication(appCookie, appProc, kPlayerSetFullScreenMessage, &messageInfo); } // PlayerSetFullScreenOptions // OSStatus PlayerSetFullScreenOptions (void *appCookie, ITAppProcPtr appProc, SInt16 minBitDepth, SInt16 maxBitDepth, SInt16 preferredBitDepth, SInt16 desiredWidth, SInt16 desiredHeight) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setFullScreenOptionsMessage.minBitDepth = minBitDepth; messageInfo.u.setFullScreenOptionsMessage.maxBitDepth = maxBitDepth; messageInfo.u.setFullScreenOptionsMessage.preferredBitDepth = preferredBitDepth; messageInfo.u.setFullScreenOptionsMessage.desiredWidth = desiredWidth; messageInfo.u.setFullScreenOptionsMessage.desiredHeight = desiredHeight; return ITCallApplication(appCookie, appProc, kPlayerSetFullScreenOptionsMessage, &messageInfo); } // PlayerGetPluginData // OSStatus PlayerGetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize) { OSStatus status; PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.getPluginDataMessage.dataPtr = dataPtr; messageInfo.u.getPluginDataMessage.dataBufferSize = dataBufferSize; status = ITCallApplication(appCookie, appProc, kPlayerGetPluginDataMessage, &messageInfo); if (dataSize != nil) *dataSize = messageInfo.u.getPluginDataMessage.dataSize; return status; } // PlayerSetPluginData // OSStatus PlayerSetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataSize) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setPluginDataMessage.dataPtr = dataPtr; messageInfo.u.setPluginDataMessage.dataSize = dataSize; return ITCallApplication(appCookie, appProc, kPlayerSetPluginDataMessage, &messageInfo); } // PlayerGetPluginNamedData // OSStatus PlayerGetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize) { OSStatus status; PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.getPluginNamedDataMessage.dataName = dataName; messageInfo.u.getPluginNamedDataMessage.dataPtr = dataPtr; messageInfo.u.getPluginNamedDataMessage.dataBufferSize = dataBufferSize; status = ITCallApplication(appCookie, appProc, kPlayerGetPluginNamedDataMessage, &messageInfo); if (dataSize != nil) *dataSize = messageInfo.u.getPluginNamedDataMessage.dataSize; return status; } // PlayerSetPluginNamedData // OSStatus PlayerSetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataSize) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setPluginNamedDataMessage.dataName = dataName; messageInfo.u.setPluginNamedDataMessage.dataPtr = dataPtr; messageInfo.u.setPluginNamedDataMessage.dataSize = dataSize; return ITCallApplication(appCookie, appProc, kPlayerSetPluginNamedDataMessage, &messageInfo); } // PlayerIdle // OSStatus PlayerIdle (void *appCookie, ITAppProcPtr appProc) { return ITCallApplication(appCookie, appProc, kPlayerIdleMessage, nil); } // PlayerShowAbout // void PlayerShowAbout (void *appCookie, ITAppProcPtr appProc) { ITCallApplication(appCookie, appProc, kPlayerShowAboutMessage, nil); } // PlayerOpenURL // void PlayerOpenURL (void *appCookie, ITAppProcPtr appProc, SInt8 *string, UInt32 length) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.openURLMessage.url = string; messageInfo.u.openURLMessage.length = length; ITCallApplication(appCookie, appProc, kPlayerOpenURLMessage, &messageInfo); } // PlayerUnregisterPlugin // OSStatus PlayerUnregisterPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo) { return ITCallApplication(appCookie, appProc, kPlayerUnregisterPluginMessage, messageInfo); } // PlayerRegisterVisualPlugin // OSStatus PlayerRegisterVisualPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo) { return ITCallApplication(appCookie, appProc, kPlayerRegisterVisualPluginMessage, messageInfo); } // PlayerRegisterDevicePlugin // OSStatus PlayerRegisterDevicePlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo) { return ITCallApplication(appCookie, appProc, kPlayerRegisterDevicePluginMessage, messageInfo); } // PlayerSetDeviceSerialNumber // OSStatus PlayerSetDeviceSerialNumber (void *appCookie, ITAppProcPtr appProc, ConstStringPtr serialNumber) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setDeviceSerialNumberMessage.serialNumber = serialNumber; return ITCallApplication(appCookie, appProc, kPlayerSetDeviceSerialNumberMessage, &messageInfo); } // PlayerHandleMacOSEvent // OSStatus PlayerHandleMacOSEvent (void *appCookie, ITAppProcPtr appProc, const EventRecord *theEvent, Boolean *eventHandled) { PlayerMessageInfo messageInfo; OSStatus status; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.handleMacOSEventMessage.theEvent = theEvent; status = ITCallApplication(appCookie, appProc, kPlayerHandleMacOSEventMessage, &messageInfo); if( eventHandled != nil ) *eventHandled = messageInfo.u.handleMacOSEventMessage.handled; return status; } // PlayerGetPluginFileSpec // OSStatus PlayerGetPluginFileSpec (void *appCookie, ITAppProcPtr appProc, FSSpec *pluginFileSpec) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.getPluginFileSpecMessage.fileSpec = pluginFileSpec; return ITCallApplication(appCookie, appProc, kPlayerGetPluginFileSpecMessage, &messageInfo); } \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ +/* File: iTunesAPI.h Contains: iTunes Plug-ins interfaces Version: Technology: iTunes Release: 1.1 Copyright: � 2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #ifndef __ITUNESAPI__ #define __ITUNESAPI__ #include /* #if PRAGMA_ONCE #pragma once #endif */ #ifdef __cplusplus extern "C" { #endif /* #if PRAGMA_STRUCT_ALIGN #pragma options align=power #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(push, 2) #elif PRAGMA_STRUCT_PACK #pragma pack(2) #endif */ enum { kITCurrentPluginMajorMessageVersion = 10, kITCurrentPluginMinorMessageVersion = 1 }; enum { kTrackSupportsID3Tags = (1L << 0), kTrackHasVariableBitRate = (1L << 1), kTrackIsFolder = (1L << 2), /* Device tracks only. Information returned is for a folder */ kTrackIsLocked = (1L << 3), /* Device tracks only. Track cannot be deleted or renamed */ kTrackCanBeDownloaded = (1L << 4), /* Device tracks only. Track can be copied from device to desktop. */ kTrackIsHidden = (1L << 5) /* Device tracks only. Track should not be displayed in the device window. */ }; typedef OptionBits ITTrackAttributes; enum { /* These mask values are specified in ITTrackInfo.validFields to indicate which fields contain valid data */ kITTINameFieldMask = (1L << 0), kITTIFileNameFieldMask = (1L << 1), kITTIArtistFieldMask = (1L << 2), kITTIAlbumFieldMask = (1L << 3), kITTIGenreFieldMask = (1L << 4), kITTIKindFieldMask = (1L << 5), kITTITrackNumberFieldsMask = (1L << 6), kITTIYearFieldMask = (1L << 7), kITTISoundVolumeFieldMask = (1L << 8), kITTICommentsFieldMask = (1L << 10), kITTITotalTimeFieldMask = (1L << 11), kITTIStartTimeFieldMask = (1L << 12), kITTIStopTimeFieldMask = (1L << 13), kITTISizeFieldMask = (1L << 14), kITTIBitRateFieldMask = (1L << 15), kITTISampleRateFieldMask = (1L << 16), kITTIAttributesFieldMask = (1L << 17), kITTIFileTypeFieldMask = (1L << 18), kITTIDateFieldMask = (1L << 19) }; typedef OptionBits ITTIFieldMask; struct ITTrackInfo { ITTIFieldMask validFields; UInt32 reserved; /* Must be zero */ Str255 name; Str255 fileName; Str255 artist; Str255 album; Str255 genre; Str255 kind; UInt32 trackNumber; UInt32 numTracks; UInt16 year; SInt16 soundVolumeAdjustment; /* Valid range is -255 to +255 */ Str255 unusedReserved1; /* Must be empty string */ Str255 comments; UInt32 totalTimeInMS; UInt32 startTimeInMS; UInt32 stopTimeInMS; UInt32 sizeInBytes; UInt32 bitRate; UInt32 sampleRateFixed; OSType fileType; UInt32 date; UInt32 unusedReserved2; /* Must be zero */ ITTrackAttributes attributes; ITTrackAttributes validAttributes; /* Mask indicating which attributes are applicable */ }; typedef struct ITTrackInfo ITTrackInfo; enum { kCurrentITStreamInfoVersion = 1 }; typedef FSSpec ITFileSpec; struct ITFileLocation { ITFileSpec spec; FInfo fInfo; }; typedef struct ITFileLocation ITFileLocation; struct ITStreamInfo { SInt32 version; Str255 streamTitle; Str255 streamURL; Str255 streamMessage; }; typedef struct ITStreamInfo ITStreamInfo; enum { /* messages sent to plugin main */ kPluginInitMessage = 'init', kPluginCleanupMessage = 'clr ', kPluginIdleMessage = 'idle' }; enum { /* PluginInitMessage.options */ kPluginWantsIdleMessages = (1L << 1), /* Send idle messages to plugin main */ kPluginWantsToBeLeftOpen = (1L << 2) /* Don't close this plugin just because */ /* it didn't register anyone */ }; enum { /* iTunes API messages */ kPlayerRegisterVisualPluginMessage = 'rvis', /* Register a visual plugin */ kPlayerRegisterDevicePluginMessage = 'rdev', /* Register a device plugin */ /* Available for all plugins */ kPlayerIdleMessage = 'idle', /* Give iTunes some time */ kPlayerShowAboutMessage = 'abou', /* Show the about box. */ kPlayerOpenURLMessage = 'url ', /* Open a URL */ kPlayerSetPluginDataMessage = 'sprf', /* Set plugin preferences */ kPlayerGetPluginDataMessage = 'gprf', /* Get plugin preferences */ kPlayerSetPluginNamedDataMessage = 'snpr', /* Set plugin named preferenes */ kPlayerGetPluginNamedDataMessage = 'gnpr', /* Get plugin named preferenes */ kPlayerHandleMacOSEventMessage = 'evnt', /* Tell player to handle unhandled event */ kPlayerGetPluginFileSpecMessage = 'pspc', /* Get the location of the plugin executable */ /* Available for visual plugins */ kPlayerSetFullScreenMessage = 'sful', /* Set full screen mode */ kPlayerSetFullScreenOptionsMessage = 'sfop', /* Set full screen options */ /* Available for device plugins */ kPlayerSetDeviceSerialNumberMessage = 'dvsn', /* Set a serial number string for a device. Needed for per-device prefs */ kPlayerUnregisterPluginMessage = 'unrg' /* Unregister the plugin this comes from */ }; typedef OSStatus (*ITAppProcPtr)(void *appCookie, OSType message,void *messageInfo); /* Plugin main Messages */ struct PluginInitMessage { UInt32 majorVersion; /* Input */ UInt32 minorVersion; /* Input */ void * appCookie; /* Input */ ITAppProcPtr appProc; /* Input */ OptionBits options; /* Output, see above for values */ void * refCon; /* Output */ }; typedef struct PluginInitMessage PluginInitMessage; struct PluginMessageInfo { union { PluginInitMessage initMessage; } u; }; typedef struct PluginMessageInfo PluginMessageInfo; /* Plugin main entry point message handler */ typedef OSStatus (*PluginProcPtr)(OSType message, PluginMessageInfo *messageInfo, void *refCon); /* Visual plugin message handler */ typedef OSStatus (*VisualPluginProcPtr)(OSType message,void *messageInfo, void *refCon); /* Device plugin message handler */ typedef OSStatus (*DevicePluginProcPtr)(OSType message,void *messageInfo, void *refCon); /* Callbacks to iTunes */ enum { /* PlayerRegisterVisualPluginMessage.options */ kVisualWantsIdleMessages = (1L << 3), kVisualWantsConfigure = (1L << 5) }; struct PlayerRegisterVisualPluginMessage { /* Input from plugin */ Str63 name; /* Displayed in the Visual menu */ OptionBits options; /* See above */ OSType creator; /* Identifies the plugin */ NumVersion pluginVersion; /* Version number of the plugin */ VisualPluginProcPtr handler; /* Handler for the plugin's messages */ void * registerRefCon; /* RefCon for the plugin's handler */ UInt32 timeBetweenDataInMS; /* How often to call the plugin (0xFFFFFFFF = as often as possible) */ UInt32 numWaveformChannels; /* 0-2 waveforms requested */ UInt32 numSpectrumChannels; /* 0-2 spectrums requested */ SInt16 minWidth; /* Minimum resizeable width */ SInt16 minHeight; /* Minimum resizeable height */ SInt16 maxWidth; /* Maximum resizeable width */ SInt16 maxHeight; /* Maximum resizeable height */ UInt16 minFullScreenBitDepth; /* 0 = Any */ UInt16 maxFullScreenBitDepth; /* 0 = Any */ UInt16 windowAlignmentInBytes; /* Reserved (should be zero) */ }; typedef struct PlayerRegisterVisualPluginMessage PlayerRegisterVisualPluginMessage; enum { /* PlayerRegisterDevicePluginMessage.options */ kDeviceWantsIdleMessages = (1L << 0) }; struct PlayerRegisterDevicePluginMessage { /* Input from plugin */ Str63 name; /* Used internally. Not currently displayed */ OptionBits options; /* See above */ NumVersion pluginVersion; /* Version number of the plugin */ DevicePluginProcPtr handler; /* Handler for the plugin's messages */ void * registerRefCon; /* RefCon for the plugin's handler */ UInt32 reserved[2]; /* Must be zero */ }; typedef struct PlayerRegisterDevicePluginMessage PlayerRegisterDevicePluginMessage; struct PlayerSetFullScreenMessage { Boolean fullScreen; }; typedef struct PlayerSetFullScreenMessage PlayerSetFullScreenMessage; struct PlayerSetFullScreenOptionsMessage { SInt16 minBitDepth; /* 0 = Any */ SInt16 maxBitDepth; /* 0 = Any */ SInt16 preferredBitDepth; /* 0 = Current */ SInt16 desiredWidth; /* Must be within minWidth & maxWidth */ SInt16 desiredHeight; /* Must be within minHeight & maxHeight */ }; typedef struct PlayerSetFullScreenOptionsMessage PlayerSetFullScreenOptionsMessage; struct PlayerOpenURLMessage { SInt8 * url; UInt32 length; }; typedef struct PlayerOpenURLMessage PlayerOpenURLMessage; struct PlayerSetPluginDataMessage { void * dataPtr; /* Input */ UInt32 dataSize; /* Input */ }; typedef struct PlayerSetPluginDataMessage PlayerSetPluginDataMessage; struct PlayerGetPluginDataMessage { void * dataPtr; /* Input */ UInt32 dataBufferSize; /* Input */ UInt32 dataSize; /* Output */ }; typedef struct PlayerGetPluginDataMessage PlayerGetPluginDataMessage; struct PlayerSetPluginNamedDataMessage { ConstStringPtr dataName; /* Input */ void * dataPtr; /* Input */ UInt32 dataSize; /* Input */ }; typedef struct PlayerSetPluginNamedDataMessage PlayerSetPluginNamedDataMessage; struct PlayerGetPluginNamedDataMessage { ConstStringPtr dataName; /* Input */ void * dataPtr; /* Input */ UInt32 dataBufferSize; /* Input */ UInt32 dataSize; /* Output */ }; typedef struct PlayerGetPluginNamedDataMessage PlayerGetPluginNamedDataMessage; struct PlayerHandleMacOSEventMessage { const EventRecord * theEvent; /* Input */ Boolean handled; /* Output */ }; typedef struct PlayerHandleMacOSEventMessage PlayerHandleMacOSEventMessage; struct PlayerGetPluginFileSpecMessage { FSSpec * fileSpec; /* Output */ }; typedef struct PlayerGetPluginFileSpecMessage PlayerGetPluginFileSpecMessage; struct PlayerSetDeviceSerialNumberMessage { ConstStringPtr serialNumber; /* Input */ }; typedef struct PlayerSetDeviceSerialNumberMessage PlayerSetDeviceSerialNumberMessage; struct PlayerMessageInfo { UInt32 messageMajorVersion; /* Should be kITCurrentPluginMajorMessageVersion */ UInt32 messageMinorVersion; /* Should be kITCurrentPluginMinorMessageVersion */ UInt32 messageInfoSize; /* Should be sizeof(PlayerMessageInfo) */ union { PlayerRegisterVisualPluginMessage registerVisualPluginMessage; PlayerRegisterDevicePluginMessage registerDevicePluginMessage; PlayerOpenURLMessage openURLMessage; PlayerSetPluginDataMessage setPluginDataMessage; PlayerGetPluginDataMessage getPluginDataMessage; PlayerSetPluginNamedDataMessage setPluginNamedDataMessage; PlayerGetPluginNamedDataMessage getPluginNamedDataMessage; PlayerHandleMacOSEventMessage handleMacOSEventMessage; PlayerGetPluginFileSpecMessage getPluginFileSpecMessage; PlayerSetFullScreenMessage setFullScreenMessage; PlayerSetFullScreenOptionsMessage setFullScreenOptionsMessage; PlayerSetDeviceSerialNumberMessage setDeviceSerialNumberMessage; } u; }; typedef struct PlayerMessageInfo PlayerMessageInfo; extern OSStatus ITCallApplication (void *appCookie, ITAppProcPtr appProc, OSType message, PlayerMessageInfo *messageInfo); extern void SetNumVersion (NumVersion *numVersion, UInt8 majorRev, UInt8 minorAndBugRev, UInt8 stage, UInt8 nonRelRev); /* for use from plugin main */ extern OSStatus PlayerRegisterVisualPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo); extern OSStatus PlayerRegisterDevicePlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo); /* For all plugins */ extern OSStatus PlayerIdle (void *appCookie, ITAppProcPtr appProc); extern void PlayerShowAbout (void *appCookie, ITAppProcPtr appProc); extern void PlayerOpenURL (void *appCookie, ITAppProcPtr appProc, SInt8 *string, UInt32 length); extern OSStatus PlayerGetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize); extern OSStatus PlayerSetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataSize); extern OSStatus PlayerGetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize); extern OSStatus PlayerSetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataSize); extern OSStatus PlayerHandleMacOSEvent (void *appCookie, ITAppProcPtr appProc, const EventRecord *theEvent, Boolean *eventHandled); extern OSStatus PlayerGetPluginFileSpec (void *appCookie, ITAppProcPtr appProc, FSSpec *pluginFileSpec); /* For visual plugins */ extern OSStatus PlayerSetFullScreen (void *appCookie, ITAppProcPtr appProc, Boolean fullScreen); extern OSStatus PlayerSetFullScreenOptions (void *appCookie, ITAppProcPtr appProc, SInt16 minBitDepth, SInt16 maxBitDepth, SInt16 preferredBitDepth, SInt16 desiredWidth, SInt16 desiredHeight); /* For device plugins */ extern OSStatus PlayerSetDeviceSerialNumber (void *appCookie, ITAppProcPtr appProc, ConstStringPtr serialNumber); extern OSStatus PlayerUnregisterPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo); /* #if PRAGMA_STRUCT_ALIGN #pragma options align=reset #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(pop) #elif PRAGMA_STRUCT_PACK #pragma pack() #endif */ #ifdef __cplusplus } #endif #endif /* __ITUNESAPI__ */ \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ +/* File: iTunesVisualAPI.h Contains: iTunes Visual Plug-ins interfaces Version: Technology: iTunes Release: 1.1 Copyright: � 2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #ifndef __ITUNESVISUALAPI__ #define __ITUNESVISUALAPI__ #include "iTunesAPI.h" /* #if PRAGMA_ONCE #pragma once #endif */ #ifdef __cplusplus extern "C" { #endif /* #if PRAGMA_STRUCT_ALIGN #pragma options align=power #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(push, 2) #elif PRAGMA_STRUCT_PACK #pragma pack(2) #endif */ enum { /* VisualPlugin messages */ kVisualPluginIdleMessage = 'null', kVisualPluginInitMessage = 'init', kVisualPluginCleanupMessage = 'clr ', kVisualPluginConfigureMessage = 'cnfg', /* Configure the plugin (may not be enabled) */ kVisualPluginEnableMessage = 'von ', /* Turn on the module (automatic)*/ kVisualPluginDisableMessage = 'voff', /* Turn off the module */ kVisualPluginShowWindowMessage = 'show', /* Show the plugin window (allocate large memory here!) */ kVisualPluginHideWindowMessage = 'hide', /* Hide the plugin window (deallocate large memory here!) */ kVisualPluginSetWindowMessage = 'swin', /* Change the window parameters */ kVisualPluginRenderMessage = 'vrnd', /* Render to window */ kVisualPluginUpdateMessage = 'vupd', /* Update the window */ kVisualPluginPlayMessage = 'vply', /* Playing a track */ kVisualPluginChangeTrackMessage = 'ctrk', /* Change track (for CD continuous play) */ kVisualPluginStopMessage = 'vstp', /* Stopping a track */ kVisualPluginSetPositionMessage = 'setp', /* Setting the position of a track */ kVisualPluginPauseMessage = 'vpau', /* Pausing a track (unused - Pause is stop) */ kVisualPluginUnpauseMessage = 'vunp', /* Unpausing a track (unused - Pause is stop) */ kVisualPluginEventMessage = 'vevt' /* Mac-event. */ }; /* VisualPlugin messages */ enum { kVisualMaxDataChannels = 2, kVisualNumWaveformEntries = 512, kVisualNumSpectrumEntries = 512 }; enum { /* ShowWindow options */ kWindowIsFullScreen = (1L << 0) }; struct RenderVisualData { UInt8 numWaveformChannels; UInt8 waveformData[kVisualMaxDataChannels][kVisualNumWaveformEntries]; UInt8 numSpectrumChannels; UInt8 spectrumData[kVisualMaxDataChannels][kVisualNumSpectrumEntries]; }; typedef struct RenderVisualData RenderVisualData; struct VisualPluginInitMessage { UInt32 messageMajorVersion; /* Input */ UInt32 messageMinorVersion; /* Input */ NumVersion appVersion; /* Input */ void * appCookie; /* Input */ ITAppProcPtr appProc; /* Input */ OptionBits options; /* Output */ void * refCon; /* Output */ }; typedef struct VisualPluginInitMessage VisualPluginInitMessage; struct VisualPluginShowWindowMessage { CGrafPtr port; /* Input */ Rect drawRect; /* Input */ OptionBits options; /* Input */ }; typedef struct VisualPluginShowWindowMessage VisualPluginShowWindowMessage; struct VisualPluginSetWindowMessage { CGrafPtr port; /* Input */ Rect drawRect; /* Input */ OptionBits options; /* Input */ }; typedef struct VisualPluginSetWindowMessage VisualPluginSetWindowMessage; struct VisualPluginPlayMessage { ITTrackInfo * trackInfo; /* Input */ ITStreamInfo * streamInfo; /* Input */ SInt32 volume; /* Input */ UInt32 bitRate; /* Input */ SoundComponentData soundFormat; /* Input */ }; typedef struct VisualPluginPlayMessage VisualPluginPlayMessage; struct VisualPluginChangeTrackMessage { ITTrackInfo * trackInfo; /* Input */ ITStreamInfo * streamInfo; /* Input */ }; typedef struct VisualPluginChangeTrackMessage VisualPluginChangeTrackMessage; struct VisualPluginRenderMessage { RenderVisualData * renderData; /* Input */ UInt32 timeStampID; /* Input */ }; typedef struct VisualPluginRenderMessage VisualPluginRenderMessage; struct VisualPluginSetPositionMessage { UInt32 positionTimeInMS; /* Input */ }; typedef struct VisualPluginSetPositionMessage VisualPluginSetPositionMessage; struct VisualPluginEventMessage { EventRecord * event; /* Input */ }; typedef struct VisualPluginEventMessage VisualPluginEventMessage; struct VisualPluginMessageInfo { union { VisualPluginInitMessage initMessage; VisualPluginShowWindowMessage showWindowMessage; VisualPluginSetWindowMessage setWindowMessage; VisualPluginPlayMessage playMessage; VisualPluginChangeTrackMessage changeTrackMessage; VisualPluginRenderMessage renderMessage; VisualPluginSetPositionMessage setPositionMessage; VisualPluginEventMessage eventMessage; } u; }; typedef struct VisualPluginMessageInfo VisualPluginMessageInfo; /* #if PRAGMA_STRUCT_ALIGN #pragma options align=reset #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(pop) #elif PRAGMA_STRUCT_PACK #pragma pack() #endif */ #ifdef __cplusplus } #endif #endif /* __ITUNESVISUALAPI__ */ \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,50 @@ +.section regular,__TEXT +.globl _ppc_doubling ; name of the function to call by C program + +; width (src width)->r3 +; myx (src) ->r4 +; myX (dest) ->r5 +; myX2 (dest + 1 complete line)->r6 +; heigth (src height)->r7 +; inc (increment for next line in dest) ->r8 + +_ppc_doubling: + +mtspr ctr,r3 + +addi r4,r4,-4 +addi r5,r5,-4 +addi r6,r6,-4 + +1:;boucle: + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r6) + +bdnz 1boucle + +subi r7,r7,1 +add r5,r5,r8 +cmpwi cr1,r7,0 +add r6,r6,r8 +mtspr ctr,r3 +bgt cr1,1boucle + +blr + +;backup + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r5) +stwu r10,4(r6) + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r5) +stwu r10,4(r6) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/Makefile kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/Makefile 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,88 @@ +# Makefile +# author: Gyom / iOS-Software +# Jan 2005 + + +############### +# Settings +macimage_name=iGoom +libobjects=../src/.libs/*.o +#buildroot=defaults read com.apple.Xcode "PBXApplicationwideBuildSettings" | cut -f2 -d"SYMROOT" | cut -f2 -d"\"" +buildroot=. +BUNDLE=$(buildroot)/iGoom.bundle +APP=$(buildroot)/iGoom.app +installer=iTunes/iTunes-Installer.app + + +all: $(APP) $(BUNDLE) + + +############### +# Misc library Targets + +# We build an embedable version of libgoom +StandAlone/libgoom2.0.dylib:$(libobjects) + gcc -dynamiclib -flat_namespace -o StandAlone/libgoom2.0.dylib $(libobjects) -install_name @executable_path/../Frameworks/libgoom2.0.dylib -compatibility_version 1 -current_version 1.0 -seg1addr 0x40000 -prebind + +# We link static only with iTunes because the install_path +# cannot be set properly to embed the lib in the bundle +# We must not place it in the mac folder because the bundle will +# link against the dynamic version if it is present +iTunes/libgoom2.0.a:$(libobjects) + libtool -static -o iTunes/libgoom2.0.a $(libobjects) + + +######################### +# Standalone Application + +standalone:$(APP) + +$(APP): StandAlone/libgoom2.0.dylib Makefile + xcodebuild -target "iGoom - StandAlone" -buildstyle Deployment SYMROOT=$(buildroot) + +cleanstandalone: + xcodebuild clean -target "iGoom - StandAlone" -buildstyle Deployment SYMROOT=$(buildroot) + + + +############### +# iTunes Plugin + +itunes:$(BUNDLE) + +$(BUNDLE):iTunes/libgoom2.0.a Makefile + xcodebuild -target "iGoom - iTunes" -buildstyle Deployment SYMROOT=$(buildroot) + +cleanitunes: + xcodebuild clean -target "iGoom - iTunes" -buildstyle Deployment SYMROOT=$(buildroot) + +$(installer):iTunes/Installer.applescript + osacompile -o $(installer) -x iTunes/Installer.applescript + + + +###################### +# Distribution Package + +all: $(APP) $(BUNDLE) + +package:$(macimage_name).dmg + +$(macimage_name).dmg:all ReadMe.rtf $(installer) + rm -rf $(macimage_name).dmg $(macimage_name) + mkdir -p $(macimage_name) + cp -r $(BUNDLE) $(macimage_name) + cp -r $(APP) $(macimage_name) + cp ReadMe.rtf $(macimage_name) + cp -rf $(installer) $(macimage_name)/ + hdiutil create -srcfolder $(macimage_name) $(macimage_name).dmg + + +########## +# Clean up + +clean: + rm -rf $(BUNDLE) $(APP) $(installer) + rm -rf $(macimage_name).dmg $(macimage_name) $(buildroot)/iGoom.build + rm -f StandAlone/libgoom2.* iTunes/libgoom2.* libgoom2.* + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,256 @@ +{\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fnil\fcharset77 LucidaGrande; +} +{\colortbl;\red255\green255\blue255;\red255\green0\blue0;\red1\green128\blue0;\red0\green12\blue255; +\red0\green0\blue255;\red0\green22\blue255;\red0\green0\blue0;\red0\green132\blue14;} +\vieww15220\viewh13580\viewkind0 +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\qc + +\f0\b\fs36 \cf0 iGoom 2k4\ +\'a9 2001/2005 iOS-Software\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 \ +\cf2 \ +iGoom\cf0 is a wonderful visual effect plug-in for \cf3 iTunes\cf0 for Mac OS X. A mac standalone version is now also available. This is the Mac version of Goom, originally written by Jean-Christophe Hoelt "jeko" (\cf4 \ul \ulc4 jeko@ios-software.com\cf0 \ulnone ) and ported to iTunes by Guillaume Borios "gyom" (\cf4 \ul gyom@ios-software.com\cf0 \ulnone ).\ +\ +Check for informations or updates at \cf5 \ul \ulc5 http://www.\cf4 \ul \ulc4 ios-software.com\cf5 \ul \ulc5 /?page=projet&quoi=1\cf0 \ulnone .\cf6 \ul \ulc6 \ +\cf0 \ulnone \ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 License and Warranty\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 \ +The iTunes plug-in and the StandAlone application are\cf7 distributed under the terms of the GNU General Public License.\ +See \cf5 http://www.gnu.org/licenses/gpl.html\cf7 .\ +\cf0 \ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 How to install\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 \ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 iTunes:\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 Use the included install script\ +OR\ +Quit iTunes and drag the iGoom.bundle file into your "~/Library/iTunes/iTunes Plug-ins" folder. (the "~" means your home folder, the one with your user name). If any previous version of iGoom was already there, you MUST overwrite it or put it away, don't just rename.\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 Standalone:\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 Drag and drop the application anywhere you want on your hard drive.\ +\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 How to use the iTunes plugin\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 Launch iTunes, then select iGoom in the iTunes "Visual" menu, enable the visual effects ( +\f2 \AppleTypeServicesU1 \uc0\u8984 +\f1 \AppleTypeServicesU0 +T) and play your favorite songs.\ +\ +When iGoom is activated you can click the option button in the iTunes window to get the Preference panel.\ +\ +The preferences can also be set 'live' by simply hitting the following keys :\ +\ +* \cf8 Pixel doubling\cf0 (Key : Q): when activated, iGoom calculates a half sized image and artificially doubles its size when rendering.\ +* \cf8 Sensitivity\cf0 (Keys : < to decrease and > to increase) : Use this to make iGoom match the music YOU hear.\ +* \cf8 Presets\cf0 (Keys : 0 to 9) : Presets selection (0 Blocks the current effect).\ +* \cf8 Framerate\cf0 (Key : F) : Display the frame rate.\ +* \cf8 Information display\cf0 (Key : T) : Toggle information display when iTunes is Idle.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 \ +\ +Performance tips +\f1\b0\fs24 \ +To accelerate iGoom, try these tips :\ +\'a5 Quit all other applications you don't need\ +\'a5 Enable the Quick Mode (Lower quality)\ +\'a5 Prefer the full screen mode to large windows in iTunes (full screen mode switches the resolution)\ +\'a5 Reduce the render size in iTunes (select medium size or low size in the visual menu).\ +\'a5 Buy a new Machine ;-)\ +\ +For full screen playback, I recommend at least a G4@800 (better with G4 or G5 and higher clock rates of course). Please note that iGoom can't use a lot of 3D acceleration and is not easily optimizable with Velocity Engine. \cf2 A fast CPU with lots of cache is the key.\cf0 \ +\ +\ + +\f0\b\fs28 Known bugs / Things to do\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 Try to make it even faster (But don't expect too much now...),\ +Add new effects,\ +Finish the scripting system,\ +Enhance the functionalities of the standalone application.\ +\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 Version history +\f1\b0\fs24 \ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +2k4 ~ January 2005\ +\'a5 +\f1\b0 In sync with the final Goom 2k4\ +\'a5 The StandAlone version is available.\ +\'a5 The source tree is back to the sourceforge cvs and mac compatible. +\f0\b \ +\ +2k4 dev 14 ~ March 2004\ +\'a5 +\f1\b0 Added the scripting system into the core (not yet scriptable without recompilation). +\f0\b \ +\ +2k4 dev 8 ~ February 2004\ +\'a5 +\f1\b0 Added G5 optimizations. +\f0\b \ +\'a5 +\f1\b0 Caught a crashing bug in the PowerPC render.\ + +\f0\b \'a5 +\f1\b0 Added luminosity post-processing. +\f0\b \ +\'a5 +\f1\b0 Rewrote the transformation computation to make it independent from the resolution.\ + +\f0\b \'a5 +\f1\b0 A new fireworks effect. +\f0\b \ +\'a5 +\f1\b0 Lots of internal modifications to prepare future features. +\f0\b \ +\'a5 +\f1\b0 Many little optimizations. +\f0\b \ +\ +1.99.5 ~ January 7th 2003\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Information display can now be set on and off using the key T or the preference panel. Since many users seem to find it annoying, this feature is off by default.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.99.4 ~ January 6th 2003\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Not faster but does more than before.\ +\'a5 Smoother animations.\ +\'a5 Nice text display with cool font and effect.\ +\'a5 New "tentacle" line effect.\ +\'a5 New zooms.\ +\'a5 Resize crashing bug hopefully corrected.\ +\'a5 Tuned many effects.\ +\'a5 Preferences window modified.\ +\'a5 iGoom now uses its own preference file instead of parasiting the iTune's one. \ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.9Dev5 ~ July 21st 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Dynamic transitions between transforms.\ +\'a5 Dynamic lines effects transitions with new colors.\ +\'a5 1 new transform.\ +\'a5 Assembly routines rewritten but G4 optimisations disabled.\ +\'a5 Tuned many effects.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.8 ~ April 12th 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Added a tuned version of the fabulous ifs effect.\ +(Copyright (c) 1997 by Massimino Pascal ).\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.7 ~ April 5th 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Little speed bump (+8%) on G3\ +(Improved the G3 assembly code, lend me a G4 and I'll do it for Altivec too!)\ +\'a5 Finally caught the crashing lines bug.\ +\'a5 Enabled the original lines effects again.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.6 ~ March 15th 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 In sync with goom 1.7.6,\ +\'a5 Now retains the quality mode.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.5a3 ~ Not released\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Big speed bump on Smooth Mode (full quality) of about 30%.\ +\'a5 Little speed bump on Quick Mode (doubled pixels) of about 5%.\ +\'a5 Minor speed bump for G3 users.\ +\'a5 Added graphic visualization of setup (not available on fullscreen smooth mode).\ +\'a5 Added sensitivity setup.\ +\'a5 Tuned the moving pixels filter.\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 1.7.4 ~ November 8th 2001\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Pixel doubling mode is now the default.\ +\'a5 Better default parameters.\ +\'a5 Accelerated the full quality mode by about 8%\ +\'a5 Added that nice (?) purple circle in the centre.\ +\'a5 Code clean-up (1.7.0 - 180kb -> 1.7.4 - 72kb)\ +\'a5 Version number corrected again (should be good this time)\ +\'a5 The random resizing crashes seem to be corrected by the code clean up.\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 1.7.3 ~ July 26th 2001 +\f1\b0 \ +\'a5 The 1.7.2 archive was broken for G3, corrected the archive\ +\ + +\f0\b 1.7.2 ~ July 26th 2001 +\f1\b0 \ +\'a5 Now detects if Altivec (Velocity Engine) is present or not and enables a new G4 assembly zoom routine whenever possible. This makes it about 30% faster than before on G4 CPUs.\ +\'a5 Corrected a bug that would make the render go weird with odd horizontal resolutions and pixel doubling enabled.\ +\'a5 G3 Assembly acceleration rewritten for easier Altivec integration (No speed loss).\ +\'a5 Core goom code cleaned up to make possible Altivec accelerations (better data alignment and misc details). This make the G3 version a bit faster too and should accelerate future releases for other platforms.\ +\'a5 Corrected the bundle version number\ +\ + +\f0\b 1.7.1 ~ July 19th 2001 +\f1\b0 \ +\'a5 Added a PowerPC assembly routine instead of pure C to execute the critical part of the zoom (just like on MMX processors). We gain about 50% more Frame Per Second !\ +\ + +\f0\b 1.7.0 ~ July 17th 2001 +\f1\b0 \ +\'a5 In sync with Goom 1.7 (with some new effects available).\ +\'a5 Code clean up.\ +\'a5 Rendering functions (both normal and pixel doubling) rewritten for speed concerns.\ +\ + +\f0\b 1.6.1 ~ July 14th 2001 +\f1\b0 \ +\'a5 Pixel doubling bug corrected.\ +\ + +\f0\b 1.6.0 ~ July 11th 2001 +\f1\b0 \ +\'a5 Initial release, in sync with Goom 1.6 for XMMS.} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,38 @@ +#import + +#import "Goom.h" + +#import "MainOpenGLView.h" + +@interface AppController : NSResponder +{ + // Views + IBOutlet NSWindow * PrefWin; + IBOutlet NSTabView * TabView; + + IBOutlet MainOpenGLView * GLView; + + IBOutlet NSButton * HQButton; + IBOutlet NSTextField * QEWarning; + IBOutlet NSTextField * FPSCounter; + + // Model + BOOL isAnimating; + NSTimer *animationTimer; + CFAbsoluteTime timeBefore; + + BOOL stayInFullScreenMode; + NSOpenGLContext *fullScreenContext; + + IBOutlet Goom * myGoom; + float FrameRate; + float lastFPS; + AbsoluteTime backUpTime; +} + +- (IBAction) goFullScreen:(id)sender; +- (IBAction) setHighQuality:(id)sender; +- (IBAction) setFrameRate:(id)sender; +- (BOOL) isInFullScreenMode; + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,438 @@ +#import "AppController.h" +#import "GoomFXView.h" +#include "src/goom.h" + +#import + +@interface AppController (AnimationMethods) +- (BOOL) isAnimating; +- (void) startAnimation; +- (void) stopAnimation; +- (void) toggleAnimation; + +- (void) startAnimationTimer; +- (void) stopAnimationTimer; +- (void) animationTimerFired:(NSTimer *)timer; +@end + +static float HowLong(AbsoluteTime * backUpTime) +{ + AbsoluteTime absTime; + Nanoseconds nanosec; + + absTime = SubAbsoluteFromAbsolute(UpTime(), *backUpTime); + nanosec = AbsoluteToNanoseconds(absTime); + //fprintf(stderr,"Time : %f\n", (float) UnsignedWideToUInt64( nanosec ) / 1000000000.0); + //fprintf(stderr,"FPS : %f\n", (float) 1000000000.0f/UnsignedWideToUInt64( nanosec )); + *backUpTime = UpTime(); + return (float) (1000000000.0f/UnsignedWideToUInt64( nanosec )); +} + +static void logGLError(int line) +{ + GLenum err = glGetError(); + char * code; + + if (err == GL_NO_ERROR) return; + + switch (err) + { + case GL_INVALID_ENUM: + code = "GL_INVALID_ENUM"; + break; + case GL_INVALID_VALUE: + code = "GL_INVALID_VALUE"; + break; + case GL_INVALID_OPERATION: + code = "GL_INVALID_OPERATION"; + break; + case GL_STACK_OVERFLOW: + code = "GL_STACK_OVERFLOW"; + break; + case GL_STACK_UNDERFLOW: + code = "GL_STACK_UNDERFLOW"; + break; + case GL_OUT_OF_MEMORY: + code = "GL_OUT_OF_MEMORY"; + break; + default: + code = "Unknown Error"; + break; + } + fprintf(stderr,"iGoom OpenGL error : %s", code); + +} + +@implementation AppController + +-(void) awakeFromNib +{ + PluginInfo * goomInfos; + int i; + + goomInfos = [myGoom infos]; + + for (i=0; i < goomInfos->nbParams; i++) + { + NSTabViewItem * item = [[[NSTabViewItem alloc] initWithIdentifier:nil] autorelease]; + [item setLabel:[NSString stringWithCString:goomInfos->params[i].name]]; + [item setView:[[[GoomFXView alloc] initWithFrame:[TabView contentRect] andFX:goomInfos->params[i]] autorelease]]; + [TabView addTabViewItem:item]; + + // Create and load textures for the first time + //[GLView loadTextures:GL_TRUE]; + } + + //[self goFullScreen:self]; + isAnimating = NO; + lastFPS = 0.0f; + backUpTime=UpTime(); + FrameRate = 0.028f; // ~35 FPS + + if ([GLView canBeHQ]) + { + [HQButton setEnabled:YES]; + [QEWarning removeFromSuperview]; + } + + [self startAnimation]; +} + + +// Action method wired up to fire when the user clicks the "Go FullScreen" button. We remain in this method until the user exits FullScreen mode. +- (IBAction) goFullScreen:(id)sender +{ + CFAbsoluteTime timeNow; + CGLContextObj cglContext; + CGDisplayErr err; + long oldSwapInterval; + long newSwapInterval; + BOOL plugrunning = YES; + long rendererID; + + // Pixel Format Attributes for the FullScreen NSOpenGLContext + NSOpenGLPixelFormatAttribute attrs[] = { + + // Specify that we want a full-screen OpenGL context. + NSOpenGLPFAFullScreen, + + // We may be on a multi-display system (and each screen may be driven by a different renderer), + // so we need to specify which screen we want to take over. + // For this demo, we'll specify the main screen. + NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), + + // Attributes Common to FullScreen and non-FullScreen + NSOpenGLPFAColorSize, 24, + NSOpenGLPFADepthSize, 16, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAccelerated, + 0 + }; + + // Create the FullScreen NSOpenGLContext with the attributes listed above. + NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; + if (pixelFormat == nil) { + NSLog(@"Failed to create 1st pixelFormat, trying another format..."); + NSOpenGLPixelFormatAttribute attrs2[] = { + NSOpenGLPFAFullScreen, + NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), + 0 + }; + + // Create the FullScreen NSOpenGLContext with the attributes listed above. + NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs2]; + if (pixelFormat == nil) { + NSLog(@"Failed to create 2nd pixelFormat, canceling full screen mode."); + return; + } + } + + // Just as a diagnostic, report the renderer ID that this pixel format binds to. + // CGLRenderers.h contains a list of known renderers and their corresponding RendererID codes. + [pixelFormat getValues:&rendererID forAttribute:NSOpenGLPFARendererID forVirtualScreen:0]; + + // Create an NSOpenGLContext with the FullScreen pixel format. + // By specifying the non-FullScreen context as our "shareContext", + // we automatically inherit all of the textures, display lists, and other OpenGL objects it has defined. + fullScreenContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:[GLView openGLContext]]; + [pixelFormat release]; + pixelFormat = nil; + + if (fullScreenContext == nil) { + NSLog(@"Failed to create fullScreenContext"); + return; + } + + // Pause animation in the OpenGL view. + // While we're in full-screen mode, we'll drive the animation actively instead of using a timer callback. + if ([self isAnimating]) { + [self stopAnimationTimer]; + } + + // Take control of the display where we're about to go FullScreen. + err = CGCaptureAllDisplays(); + if (err != CGDisplayNoErr) { + [fullScreenContext release]; + fullScreenContext = nil; + return; + } + + // Enter FullScreen mode and make our FullScreen context the active context for OpenGL commands. + [fullScreenContext setFullScreen]; + [fullScreenContext makeCurrentContext]; + + // Save the current swap interval so we can restore it later, and then set the new swap interval to lock us to the display's refresh rate. + cglContext = CGLGetCurrentContext(); + CGLGetParameter(cglContext, kCGLCPSwapInterval, &oldSwapInterval); + newSwapInterval = 1; + CGLSetParameter(cglContext, kCGLCPSwapInterval, &newSwapInterval); + + // Tell the myGoom the dimensions of the area it's going to render to, so it can set up an appropriate viewport and viewing transformation. + [myGoom setSize:NSMakeSize(CGDisplayPixelsWide(kCGDirectMainDisplay), CGDisplayPixelsHigh(kCGDirectMainDisplay))]; + + // Now that we've got the screen, we enter a loop in which we alternately process input events and computer and render the next frame of our animation. The shift here is from a model in which we passively receive events handed to us by the AppKit to one in which we are actively driving event processing. + timeBefore = CFAbsoluteTimeGetCurrent(); + stayInFullScreenMode = YES; + while (stayInFullScreenMode) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + // Check for and process input events. + NSEvent *event; + while (event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]) { + switch ([event type]) { + case NSLeftMouseDown: + [self mouseDown:event]; + break; + + case NSLeftMouseUp: + plugrunning = plugrunning?NO:YES; + [self mouseUp:event]; + break; + + case NSRightMouseUp: + plugrunning = plugrunning?NO:YES; + break; + + case NSLeftMouseDragged: + [self mouseDragged:event]; + break; + + case NSKeyDown: + [self keyDown:event]; + break; + + default: + break; + } + } + + // Render a frame, and swap the front and back buffers. + timeNow = CFAbsoluteTimeGetCurrent(); + if ((timeNow-timeBefore) >= FrameRate) + { + timeBefore = timeNow; + if (plugrunning==YES) { + [myGoom render]; + [fullScreenContext flushBuffer]; + } + } + + + // Clean up any autoreleased objects that were created this time through the loop. + [pool release]; + } + + // Clear the front and back framebuffers before switching out of FullScreen mode. (This is not strictly necessary, but avoids an untidy flash of garbage.) + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + [fullScreenContext flushBuffer]; + glClear(GL_COLOR_BUFFER_BIT); + [fullScreenContext flushBuffer]; + + // Restore the previously set swap interval. + CGLSetParameter(cglContext, kCGLCPSwapInterval, &oldSwapInterval); + + // Exit fullscreen mode and release our FullScreen NSOpenGLContext. + [NSOpenGLContext clearCurrentContext]; + [fullScreenContext clearDrawable]; + [fullScreenContext release]; + fullScreenContext = nil; + + // Release control of the display. + CGReleaseAllDisplays(); + + // Reset the size to the window size + [myGoom setSize:[GLView frame].size]; + + // Mark our view as needing drawing. (The animation has advanced while we were in FullScreen mode, so its current contents are stale.) + [GLView setNeedsDisplay:YES]; + + // Resume animation timer firings. + if ([self isAnimating]) { + [self startAnimationTimer]; + } +} + +- (IBAction) setHighQuality:(id)sender +{ + [myGoom setHighQuality:([sender state]==NSOnState)]; +} + +- (IBAction) setFrameRate:(id)sender +{ + FrameRate = 1.0f/[sender floatValue]; + [self stopAnimation]; + [self startAnimation]; +} + +- (void) keyDown:(NSEvent *)event +{ + unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0]; + switch (c) { + + // [Esc] exits FullScreen mode. + case 27: + stayInFullScreenMode = NO; + break; + + // [space] toggles rotation of the globe. + case 32: + [self toggleAnimation]; + break; + + case 'l': + case 'L': + [myGoom setHighQuality:NO]; + break; + + case 'h': + case 'H': + [myGoom setHighQuality:YES]; + break; + + default: + break; + } +} +/* +- (void)mouseDown:(NSEvent *)theEvent +{ + BOOL wasAnimating = [self isAnimating]; + BOOL dragging = YES; + NSPoint windowPoint; + NSPoint lastWindowPoint = [theEvent locationInWindow]; + float dx, dy; + + if (wasAnimating) { + [self stopAnimation]; + } + while (dragging) { + theEvent = [[GLView window] nextEventMatchingMask:NSLeftMouseUpMask | NSLeftMouseDraggedMask]; + windowPoint = [theEvent locationInWindow]; + switch ([theEvent type]) { + case NSLeftMouseUp: + dragging = NO; + break; + + case NSLeftMouseDragged: + dx = windowPoint.x - lastWindowPoint.x; + dy = windowPoint.y - lastWindowPoint.y; + lastWindowPoint = windowPoint; + + // Render a frame. + if (fullScreenContext) { + [myGoom render]; + [fullScreenContext flushBuffer]; + } else { + [GLView display]; + } + break; + + default: + break; + } + } + if (wasAnimating) { + [self startAnimation]; + timeBefore = CFAbsoluteTimeGetCurrent(); + } +} +*/ +- (BOOL) isInFullScreenMode +{ + return fullScreenContext != nil; +} + +@end + +@implementation AppController (AnimationMethods) + +- (BOOL) isAnimating +{ + return isAnimating; +} + +- (void) startAnimation +{ + if (!isAnimating) { + isAnimating = YES; + if (![self isInFullScreenMode]) + { + [self startAnimationTimer]; + } + } +} + +- (void) stopAnimation +{ + if (isAnimating) { + if (animationTimer != nil) { + [self stopAnimationTimer]; + } + isAnimating = NO; + } +} + +- (void) toggleAnimation +{ + if ([self isAnimating]) [self stopAnimation]; + else [self startAnimation]; +} + +- (void) startAnimationTimer +{ + if (animationTimer == nil) { + animationTimer = [[NSTimer scheduledTimerWithTimeInterval:FrameRate target:self selector:@selector(animationTimerFired:) userInfo:nil repeats:YES] retain]; + } +} + +- (void) stopAnimationTimer +{ + if (animationTimer != nil) { + [animationTimer invalidate]; + [animationTimer release]; + animationTimer = nil; + } +} + +- (void) animationTimerFired:(NSTimer *)timer +{ + lastFPS = (HowLong(&backUpTime) + lastFPS) * 0.5f; + [FPSCounter setStringValue:[NSString stringWithFormat:@"%d/%d FPS",(int)lastFPS,(int)(1.0f/FrameRate)]]; + [GLView setNeedsDisplay:YES]; +} + +// TAB VIEW DELEGATE +- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem +{ + NSRect frame = [PrefWin frame]; + float height; + if(![[tabViewItem identifier] isEqual:@"maintab"]) height = ((GoomFXView*)[tabViewItem view])->height; + else height = 356.0f; + height += 20.0f; + frame.origin.y -= height-frame.size.height; + frame.size.height = height; + [PrefWin setFrame:frame display:YES animate:YES]; +} + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,126 @@ +/* + * CoreAudioDevice.cpp + * iGoom + * + * Created by Guillaume Borios on 14/01/05. + * Copyright 2005 iOS Software. All rights reserved. + * + */ + +#include "CoreAudioDevice.h" + + +CoreAudioDevice::CoreAudioDevice(AudioDeviceID devId):deviceID(devId) {} + +CoreAudioDevice::~CoreAudioDevice() {} + + +CFStringRef CoreAudioDevice::name() const +{ + CFStringRef nom; + try + { + UInt32 size = sizeof(CFStringRef); + propertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceNameCFString, size, &nom); + } + catch(...) + { + nom = CFSTR(""); + } + return nom; +} + +UInt32 CoreAudioDevice::propertyDataSize(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property) const +{ + UInt32 size = 0; + if (AudioDeviceGetPropertyInfo(deviceID, channel, section, property, &size, NULL) != 0) + { + fprintf(stderr,"Error while fetching audio device property size. Exiting."); + exit(0); + } + return size; +} + +void CoreAudioDevice::propertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 &size, void* data) const +{ + AudioDeviceGetProperty(deviceID, channel, section, property, &size, data) != 0; +} + +void CoreAudioDevice::setPropertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 inDataSize, const void* data) +{ + OSStatus theError = AudioDeviceSetProperty(deviceID, NULL, channel, section, property, inDataSize, data); + //if (theError) fprintf(stderr,"Error"); +} + +UInt32 CoreAudioDevice::numberOfChannels(CoreAudioDeviceSection section) const +{ + UInt32 n = 0; + UInt32 size = propertyDataSize(0, section, kAudioDevicePropertyStreamConfiguration); + AudioBufferList* bufList=(AudioBufferList*)malloc(size); + + propertyData(0, section, kAudioDevicePropertyStreamConfiguration, size, bufList); + for(UInt32 i = 0; i < bufList->mNumberBuffers; ++i) + { + n += bufList->mBuffers[i].mNumberChannels; + } + free(bufList); + return n; +} + +pid_t CoreAudioDevice::hogModeOwner() const +{ + pid_t retour = 0; + UInt32 size = sizeof(pid_t); + propertyData(0, kAudioDeviceSectionInput, kAudioDevicePropertyHogMode, size, &retour); + return retour; +} + + +void CoreAudioDevice::AddPropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc, void* inClientData) +{ + if (AudioDeviceAddPropertyListener(deviceID, inChannel, inSection, inPropertyID, inListenerProc, inClientData) != 0) + { + fprintf(stderr,"Error while Installing device notifications listener. Exiting."); + exit(0); + } +} + +void CoreAudioDevice::RemovePropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc) +{ + if (AudioDeviceRemovePropertyListener(deviceID, inChannel, inSection, inPropertyID, inListenerProc) !=0) + { + //fprintf(stderr,"Error while Removing device notifications listener. Exiting."); + //exit(0); + } +} + +// *************************************** VOLUME CONTROL *************************************** + +bool CoreAudioDevice::HasVolumeControl(UInt32 channel, CoreAudioDeviceSection section) const +{ + OSStatus theError = AudioDeviceGetPropertyInfo(deviceID, channel, section, kAudioDevicePropertyVolumeScalar, NULL, NULL); + return (theError == 0); +} + +bool CoreAudioDevice::VolumeControlIsSettable(UInt32 channel, CoreAudioDeviceSection section) const +{ + Boolean isWritable = false; + OSStatus theError = AudioDeviceGetPropertyInfo(deviceID, channel, section, kAudioDevicePropertyVolumeScalar, NULL, &isWritable); + return (isWritable != 0); +} + +Float32 CoreAudioDevice::GetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section) const +{ + Float32 value = 0.0; + UInt32 size = sizeof(Float32); + propertyData(channel, section, kAudioDevicePropertyVolumeScalar, size, &value); + return value; +} + +void CoreAudioDevice::SetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section, Float32 value) +{ + UInt32 size = sizeof(Float32); + setPropertyData(channel, section, kAudioDevicePropertyVolumeScalar, size, &value); +} + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,53 @@ +/* + * CoreAudioDevice.h + * iGoom + * + * Created by Guillaume Borios on 14/01/05. + * Copyright 2005 iOS Software. All rights reserved. + * + */ + +#include +#include + +#ifndef COREAUDIODEVICE +#define COREAUDIODEVICE + +typedef UInt8 CoreAudioDeviceSection; +#define kAudioDeviceSectionInput ((CoreAudioDeviceSection)0x01) +#define kAudioDeviceSectionOutput ((CoreAudioDeviceSection)0x00) +#define kAudioDeviceSectionGlobal ((CoreAudioDeviceSection)0x00) +#define kAudioDeviceSectionWildcard ((CoreAudioDeviceSection)0xFF) + +class CoreAudioDevice +{ + +public: + CoreAudioDevice(AudioDeviceID devId); + ~CoreAudioDevice(); + + AudioDeviceID getDeviceID() const { return deviceID; } + CFStringRef name() const; + + UInt32 propertyDataSize(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property) const; + void propertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 &size, void* data) const; + void setPropertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 inDataSize, const void* data); + + UInt32 numberOfChannels(CoreAudioDeviceSection section) const; + + pid_t hogModeOwner() const; + + void AddPropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc, void* inClientData); + void RemovePropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc); + + bool CoreAudioDevice::HasVolumeControl(UInt32 channel, CoreAudioDeviceSection section) const; + bool CoreAudioDevice::VolumeControlIsSettable(UInt32 channel, CoreAudioDeviceSection section) const; + Float32 CoreAudioDevice::GetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section) const; + void CoreAudioDevice::SetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section, Float32 value); + +private: + AudioDeviceID deviceID; +}; + + +#endif /* COREAUDIODEVICE */ \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,70 @@ +/* + * CoreAudioHardware.cpp + * iGoom + * + * Created by Guillaume Borios on 14/01/05. + * Copyright 2005 iOS Software. All rights reserved. + * + */ + +#include "CoreAudioHardware.h" +#include +#include + +UInt32 CoreAudioHardware::numberOfDevices() +{ + return ( propertyDataSize(kAudioHardwarePropertyDevices) / sizeof(AudioDeviceID) ); +} + +AudioDeviceID CoreAudioHardware::deviceAtIndex(unsigned int i) +{ + AudioDeviceID devID = 0; + int n = numberOfDevices(); + if((n > 0) && (i < n)) + { + UInt32 size = n * sizeof(AudioDeviceID); + AudioDeviceID * list = (AudioDeviceID *)malloc(size); + propertyData(kAudioHardwarePropertyDevices, size, list); + devID = list[i]; + free(list); + } + return devID; +} + +UInt32 CoreAudioHardware::propertyDataSize(AudioHardwarePropertyID property) +{ + UInt32 size = 0; + if (AudioHardwareGetPropertyInfo(property, &size, NULL) != 0) + { + fprintf(stderr,"Error while fetching audio property size. Exiting."); + exit(0); + } + return size; +} + +void CoreAudioHardware::propertyData(AudioHardwarePropertyID property, UInt32 &size, void *data) +{ + if (AudioHardwareGetProperty(property, &size, data) != 0) + { + fprintf(stderr,"Error while fetching audio property. Exiting."); + exit(0); + } +} + +void CoreAudioHardware::AddPropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc proc, void* data) +{ + if (AudioHardwareAddPropertyListener(property, proc, data)!= 0) + { + fprintf(stderr,"Error could not add a property listener. Exiting."); + exit(0); + } +} + +void CoreAudioHardware::RemovePropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc proc) +{ + if (AudioHardwareRemovePropertyListener(property, proc)!= 0) + { + fprintf(stderr,"Error could not remove a property listener. Exiting."); + exit(0); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,29 @@ +/* + * CoreAudioHardware.h + * iGoom + * + * Created by Guillaume Borios on 14/01/05. + * Copyright 2005 iOS Software. All rights reserved. + * + */ + +#include + + +#ifndef COREAUDIOHARDWARE +#define COREAUDIOHARDWARE + +class CoreAudioHardware +{ +public: + static UInt32 numberOfDevices(); + static AudioDeviceID deviceAtIndex(unsigned int i); +public: + static UInt32 propertyDataSize(AudioHardwarePropertyID property); + static void propertyData(AudioHardwarePropertyID property, UInt32 &size, void *data); + static void AddPropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc listenerProc, void* inClientData); + static void RemovePropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc listenerProc); + +}; + +#endif /*COREAUDIOHARDWARE*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,7 @@ +/* Localized versions of Info.plist keys */ + +CFBundleName = "iGoom"; +CFBundleShortVersionString = "2.0"; +CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001~2005, iOS-Software.\nhttp://www.ios-software.com/"; +NSHumanReadableCopyright = "Copyright 2001~2005, iOS-Software.\nhttp://www.ios-software.com/"; +CFBundleVersion = "2.0"; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,44 @@ +{ + IBClasses = ( + { + ACTIONS = {goFullScreen = id; setFrameRate = id; setHighQuality = id; }; + CLASS = AppController; + LANGUAGE = ObjC; + OUTLETS = { + FPSCounter = NSTextField; + GLView = MainOpenGLView; + HQButton = NSButton; + PrefWin = NSWindow; + QEWarning = NSTextField; + TabView = NSTabView; + myGoom = Goom; + }; + SUPERCLASS = NSResponder; + }, + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = Goom; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = { + clientStorage = id; + frameRate = id; + rectTextures = id; + setFullscreen = id; + textureHint = id; + textureRange = id; + }; + CLASS = MainOpenGLView; + LANGUAGE = ObjC; + OUTLETS = {StartingView = NSView; myGoom = Goom; sizeField = NSTextField; }; + SUPERCLASS = NSOpenGLView; + }, + {CLASS = MyApplication; LANGUAGE = ObjC; SUPERCLASS = NSApplication; }, + { + ACTIONS = {changeAudioDevice = id; changeAudioVolume = id; }; + CLASS = SoundSampler; + LANGUAGE = ObjC; + OUTLETS = {ODeviceList = NSPopUpButton; OSoundVolume = NSSlider; }; + SUPERCLASS = NSObject; + } + ); + IBVersion = 1; +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,23 @@ + + + + + IBDocumentLocation + 46 72 356 295 0 0 1024 746 + IBEditorPositions + + 29 + 43 545 183 44 0 0 1280 1002 + + IBFramework Version + 364.0 + IBOpenObjects + + 29 + 508 + 21 + + IBSystem Version + 7S215 + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nib and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nib differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,14 @@ +//---------------------------------------------------------------------------// +// +// Localizable.strings +// iGoom StandAlone Project +// +// Copyright (c) 2002-2003 iOS. All rights reserved. +// +//---------------------------------------------------------------------------// + +/* */ +"" = ""; + +/* Audio Input Devices */ +"Built-in Audio" = "Audio intégré"; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,26 @@ +// +// GoomFXParam.h +// iGoom copie +// +// Created by Guillaume Borios on Sun Jul 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import + +#include "src/goom.h" + +@interface GoomFXParam : NSObject { + PluginParam * parametres; + NSProgressIndicator * progress; + NSSlider * slider; + NSButton * button; + + NSTextField * value; +} + +- (GoomFXParam*)initWithParam:(PluginParam*)p; +- (NSView*)makeViewAtHeight:(float)h; +- (void)setValue:(id)sender; + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,213 @@ +// +// GoomFXParam.m +// iGoom copie +// +// Created by Guillaume Borios on Sun Jul 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import "GoomFXParam.h" + +NSMutableDictionary * paramlist = nil; + +void goom_input_stub(PluginParam *_this) +{ + [(GoomFXParam*)[paramlist objectForKey:[NSString stringWithFormat:@"%p",_this]] setValue:nil]; +} + +@implementation GoomFXParam + +- (GoomFXParam*)initWithParam:(PluginParam*)p +{ + self = [super init]; + + if (self) + { + parametres = p; + if (paramlist == nil) paramlist = [[NSMutableDictionary alloc] init]; + [paramlist setObject:self forKey:[NSString stringWithFormat:@"%p",p]]; + } + return self; +} + +- (void)setValue:(id)sender +{ + + switch (parametres->type) + { + case PARAM_INTVAL: + if (parametres->rw == TRUE) + { + if (sender) + { + parametres->param.ival.value = [sender intValue]; + parametres->changed(parametres); + } + else [slider setIntValue:parametres->param.ival.value]; + [value setIntValue:parametres->param.ival.value]; + } + else + { + [progress setDoubleValue:(double)parametres->param.ival.value]; + } + break; + case PARAM_FLOATVAL: + if (parametres->rw == TRUE) + { + if (sender) + { + parametres->param.fval.value = (float)[sender doubleValue]; + parametres->changed(parametres); + } + else [slider setDoubleValue:(double)parametres->param.fval.value]; + [value setDoubleValue:(double)parametres->param.fval.value]; + } + else + { + [progress setDoubleValue:(double)parametres->param.fval.value]; + } + break; + case PARAM_BOOLVAL: + if ((parametres->rw == TRUE) && (sender != nil)) + { + parametres->param.bval.value = ([sender state]==NSOnState); + parametres->changed(parametres); + } + else + { + [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState]; + } + break; + case PARAM_STRVAL: + break; + case PARAM_LISTVAL: + break; + default: + break; + } +} + +- (NSView*)makeViewAtHeight:(float)h +{ + NSView * container; + NSTextField * text; + + container = [[NSView alloc] initWithFrame:NSMakeRect(20,h,420,25)]; + + if (parametres->type != PARAM_BOOLVAL) + { + text = [[NSTextField alloc] initWithFrame:NSMakeRect(0,5,214,15)]; + [text setStringValue:[NSString stringWithCString:parametres->name]]; + [text setDrawsBackground:NO]; + [text setSelectable:NO]; + [text setEditable:NO]; + [text setBordered:NO]; + [container addSubview:[text autorelease]]; + } + + + if (parametres->rw == TRUE) + { + switch (parametres->type) + { + case PARAM_INTVAL: + case PARAM_FLOATVAL: + // Value text field + value = [[NSTextField alloc] initWithFrame:NSMakeRect(374,5,214,15)]; + [value setDrawsBackground:NO]; + [value setSelectable:NO]; + [value setEditable:NO]; + [value setBordered:NO]; + + [container addSubview:[value autorelease]]; + //slider + slider = [[NSSlider alloc] initWithFrame:NSMakeRect(222,2,144,20)]; + [slider setAction:@selector(setValue:)]; + [slider setTickMarkPosition:NSTickMarkAbove]; + [slider setTarget:self]; + [container addSubview:[slider autorelease]]; + //values + if (parametres->type == PARAM_INTVAL) + { + [value setIntValue:parametres->param.ival.value]; + [slider setMaxValue:(double)parametres->param.ival.max]; + [slider setMinValue:(double)parametres->param.ival.min]; + [slider setIntValue:parametres->param.ival.value]; + } + else + { + [value setDoubleValue:parametres->param.fval.value]; + [[value cell] setFloatingPointFormat:YES left:1 right:1]; + [slider setMaxValue:(double)parametres->param.fval.max]; + [slider setMinValue:(double)parametres->param.fval.min]; + [slider setDoubleValue:(double)parametres->param.fval.value]; + } + break; + case PARAM_BOOLVAL: + button = [[NSButton alloc] initWithFrame:NSMakeRect(0,2,344,18)]; + [button setEnabled:YES]; + [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState]; + [button setTitle:[NSString stringWithCString:parametres->name]]; + [button setButtonType:NSSwitchButton]; + [button setTransparent:NO]; + [button setTarget:self]; + [button setAction:@selector(setValue:)]; + [container addSubview:[button autorelease]]; + break; + case PARAM_STRVAL: + NSLog(@"PARAM_STRVAL rw not implemented"); + break; + case PARAM_LISTVAL: + NSLog(@"PARAM_LISTVAL rw not implemented"); + break; + default: + break; + } + } + else + { + switch (parametres->type) + { + case PARAM_INTVAL: + //slider + progress = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(222,7,144,10)]; + [progress setMaxValue:(double)parametres->param.ival.max]; + [progress setMinValue:(double)parametres->param.ival.min]; + [progress setDoubleValue:(double)parametres->param.ival.value]; + [progress setIndeterminate:NO]; + [container addSubview:[progress autorelease]]; + break; + case PARAM_FLOATVAL: + //slider + progress = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(222,7,144,10)]; + [progress setMaxValue:(double)parametres->param.fval.max]; + [progress setMinValue:(double)parametres->param.fval.min]; + [progress setDoubleValue:(double)parametres->param.fval.value]; + [progress setIndeterminate:NO]; + [container addSubview:[progress autorelease]]; + break; + case PARAM_BOOLVAL: + button = [[NSButton alloc] initWithFrame:NSMakeRect(0,2,344,18)]; + [button setEnabled:NO]; + [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState]; + [button setTitle:[NSString stringWithCString:parametres->name]]; + [button setButtonType:NSSwitchButton]; + [button setTransparent:NO]; + [container addSubview:[button autorelease]]; + break; + case PARAM_STRVAL: + NSLog(@"PARAM_STRVAL ro not implemented"); + break; + case PARAM_LISTVAL: + NSLog(@"PARAM_LISTVAL ro not implemented"); + break; + default: + break; + } + parametres->change_listener = goom_input_stub; + } + + return [container autorelease]; +} + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,22 @@ +// +// GoomFXView.h +// iGoom copie +// +// Created by Guillaume Borios on Sun Jul 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import + +#include "src/goom.h" + +@interface GoomFXView : NSTabView { + + NSMutableArray * params; + @public + float height; +} + +- (id)initWithFrame:(NSRect)frame andFX:(PluginParameters)FX ; + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,65 @@ +// +// GoomFXView.m +// iGoom copie +// +// Created by Guillaume Borios on Sun Jul 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import "GoomFXView.h" +#import "GoomFXParam.h" + + +@implementation GoomFXView + +- (id)initWithFrame:(NSRect)frame andFX:(PluginParameters)FX { + self = [super initWithFrame:frame]; + if (self) { + int i; + height = 15.0f; + params = [[NSMutableArray alloc] init]; + for (i=0; i < FX.nbParams; i++) + { + if (FX.params[i] != NULL) + { + GoomFXParam * FXP = [[[GoomFXParam alloc]initWithParam:FX.params[i]]autorelease]; + [params addObject:FXP]; + [self addSubview:[FXP makeViewAtHeight:height]]; + height += 29.0f; + } + else + { + height += 12.0f; + } + } + } + + height += 73.0f; + + return self; +} + +- (void)resizeWindow +{ + NSWindow * parent = [self window]; + NSRect frame = [parent frame]; + if (frame.size.height != height) + { + frame.origin.y -= height-frame.size.height; + frame.size.height = height; + [parent setFrame:frame display:NO animate:NO]; + } +} + +- (void)drawRect:(NSRect)rect { + // Drawing code here. +} + +-(void)dealloc +{ + [params release]; + + [super dealloc]; +} + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,46 @@ +// +// Goom.h +// iGoom +// +// Created by Guillaume Borios on Sat Dec 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import +#import +#import +#include +#include "src/goom.h" + +@interface Goom : NSObject { + + PluginInfo * goomInfos; + + gint16 sndData[2][512]; + + GLuint textureName; + AbsoluteTime backUpTime; + + GLenum texture_hint; + GLboolean client_storage; + + NSSize curSize; + BOOL HQ; + BOOL dirty; +} + +- (void)setSize:(NSSize)_size; + +- (PluginInfo*)infos; + +-(void)render; + +-(void)setHighQuality:(BOOL)quality; +- (void)prepareTextures; + +- (guint32 *)getGoomDataWithFPS:(float)fps; + +-(void)setTextureHint:(GLenum)hint; +-(void)clientStorage:(GLboolean)client; + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,294 @@ +// +// Goom.m +// iGoom +// +// Created by Guillaume Borios on Sat Dec 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import "Goom.h" +#import +#include +#import "SoundSampler.h" + +@implementation Goom + +unsigned int IMAGE_SIZE(NSSize curSize) +{ + int retour = (1<<(int)(log((curSize.width>curSize.height)?curSize.width:curSize.height)/log(2.0f))); + if (retour > 512) retour = 512; + return retour; +} + +-(Goom*)init +{ + self = [super init]; + + if (self != nil) + { + curSize = NSMakeSize(16,16); + HQ = NO; + dirty = YES; + goomInfos = goom_init(16,16); + backUpTime = UpTime(); + + client_storage = GL_TRUE; + texture_hint = GL_STORAGE_SHARED_APPLE; + } + //NSLog(@"Goom Init"); + return self; +} + +-(Goom*)initWithSize:(NSSize)_size +{ + self = [super init]; + + if (self != nil) + { + curSize = _size; + HQ = NO; + dirty = YES; + backUpTime = UpTime(); + } + //NSLog(@"Goom Init with Size : %f x %f",_size.width,_size.height); + return self; +} + +- (PluginInfo*)infos +{ + return goomInfos; +} + +-(void)setSize:(NSSize)_size +{ + if ((curSize.width != _size.width) || (curSize.height != _size.height)) + { + //NSLog(@"Set size (%f,%f)",_size.width, _size.height); + curSize = _size; + dirty = YES; + } +} + +-(void)render +{ + if (dirty==YES) [self prepareTextures]; + + //glClear(0); + + // Bind, update and draw new image + if(HQ==YES) + { + //NSLog(@"Render HQ (%f,%f)",curSize.width, curSize.height); + + glEnable(GL_TEXTURE_RECTANGLE_EXT); + + glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); + glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, curSize.width, curSize.height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); + + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex2f(-1.0f, 1.0f); + glTexCoord2f(0.0f, curSize.height); + glVertex2f(-1.0f, -1.0f); + glTexCoord2f(curSize.width, curSize.height); + glVertex2f(1.0f, -1.0f); + glTexCoord2f(curSize.width, 0.0f); + glVertex2f(1.0f, 1.0f); + glEnd(); + + glDisable(GL_TEXTURE_RECTANGLE_EXT); + + } + else + { + int loggedSize = IMAGE_SIZE(curSize); + float ratio = curSize.width/curSize.height; + + //NSLog(@"Render LQ (%f,%f / %d)",curSize.width, curSize.height,IMAGE_SIZE(curSize)); + + glEnable(GL_TEXTURE_2D); + + //glColor4f(0.0, 0.5, 0.1, 0.0); + glBindTexture(GL_TEXTURE_2D, textureName); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, loggedSize, loggedSize, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); + + //glShadeModel(GL_SMOOTH); + + glBegin(GL_POLYGON); + + if (ratio>1.0f) + { + float o=0.5f-0.5f/ratio; + float y=1.0f/ratio+o; + //glColor4f(0.0, 0.5, 0.1, 1.0); + glTexCoord2f(0.0f, o); + glVertex2f(-1.0f, 1.0f); + //glColor4f(0.3, 0.5, 0.1, 0.5); + glTexCoord2f(0.0f, y); + glVertex2f(-1.0f, -1.0f); + //glColor4f(0.6, 0.5, 0.1, 0.2); + glTexCoord2f(1.0f, y); + glVertex2f(1.0f, -1.0f); + //glColor4f(0.9, 0.5, 0.1, 0.0); + glTexCoord2f(1.0f, o); + glVertex2f(1.0f, 1.0f); + } + else + { + float o=0.5f-0.5f*ratio; + float x=ratio+o; + //glColor4f(0.0, 0.5, 0.1, 1.0); + glTexCoord2f(o, 0.0f); + glVertex2f(-1.0f, 1.0f); + //glColor4f(0.3, 0.5, 0.1, 0.5); + glTexCoord2f(o, 1.0f); + glVertex2f(-1.0f, -1.0f); + //glColor4f(0.6, 0.5, 0.1, 0.2); + glTexCoord2f(x, 1.0f); + glVertex2f(1.0f, -1.0f); + //glColor4f(0.9, 0.5, 0.1, 0.0); + glTexCoord2f(x, 0.0f); + glVertex2f(1.0f, 1.0f); + } + + glEnd(); + + glDisable(GL_TEXTURE_2D); + //glShadeModel(GL_FLAT); + + /* + glBegin(GL_QUADS); + + glColor4f(0.0, 0.1, 0.0, 1.0); + glVertex3f(-1.0, -1.0, 0.0); + glVertex3f( 1.0, -1.0, 0.0); + + glColor4f(0.0, 0.5, 0.1, 1.0); + glVertex3f( 1.0, 1.0, 0.0); + glVertex3f(-1.0, 1.0, 0.0); + + glEnd();*/ + + } + + //glFlush(); +} + + +-(guint32 *)getGoomDataWithFPS:(float)fps +{ + + if (fps>0) return goom_update(goomInfos, [[SoundSampler sharedSampler] getData], 0, fps, 0, 0); + else return goom_update(goomInfos, [[SoundSampler sharedSampler] getData], 0, 0, 0, 0); + // return goom_update(goomInfos, sndData, 0, fps, 0, 0); + +} + + + +-(void)setHighQuality:(BOOL)quality +{ + HQ = quality; + dirty = YES; +} + +- (void)prepareTextures +{ + //static BOOL first = YES; + //[[self openGLContext] update]; + + // Setup some basic OpenGL stuff + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glClearColor(1.0f, 1.0f, 1.0f, 0.0f); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + dirty = NO; + + glViewport(0, 0, (int) curSize.width, (int) curSize.height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + //glEnable(GL_LIGHTING); + + + if(HQ==YES) + { + //NSLog(@"Prepare HQ (%f,%f)",curSize.width, curSize.height); + + //glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); + + glDeleteTextures(1, &textureName); + glDisable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_RECTANGLE_EXT); + + glGenTextures( 1, &textureName ); + glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName); + + glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); + + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , client_storage); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, texture_hint); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + goom_set_resolution (goomInfos, curSize.width, curSize.height); + glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, curSize.width, curSize.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); + } + else + { + //NSLog(@"Prepare LQ (%f,%f)",curSize.width, curSize.height); + + //glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); + + glDeleteTextures(1, &textureName); + glDisable(GL_TEXTURE_RECTANGLE_EXT); + glEnable(GL_TEXTURE_2D); + + glGenTextures( 1, &textureName ); + glBindTexture(GL_TEXTURE_2D, textureName); + + glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_STORAGE_HINT_APPLE , client_storage); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, texture_hint); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + goom_set_resolution (goomInfos, IMAGE_SIZE(curSize), IMAGE_SIZE(curSize)); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, IMAGE_SIZE(curSize), IMAGE_SIZE(curSize), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); + + } + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); +} + +-(void)setTextureHint:(GLenum)hint +{ + texture_hint = hint; +} + +-(void)clientStorage:(GLboolean)client +{ + client_storage = client; +} + + +- (void)dealloc +{ + goom_close(goomInfos); + [super dealloc]; +} + + + +@end Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/icon.icns and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/icon.icns differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'iGoom' target in the 'iGoom' project +// + +#ifdef __OBJC__ + #import +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + iGoom + CFBundleGetInfoString + + CFBundleIconFile + icon.icns + CFBundleIdentifier + com.ios.igoom.standalone + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + + CFBundlePackageType + APPL + CFBundleShortVersionString + + CFBundleSignature + ???? + CFBundleVersion + 2.0 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,45 @@ +/* + * + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under Apples + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import + +int main(int argc, const char *argv[]) +{ + return NSApplicationMain(argc, argv); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,88 @@ +/* + * + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under Apples + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import + +#include +#include +#include + +#include +#include + +#import "Goom.h" + +#define STAT_UPDATE 0.6f +#define IMAGE_DEPTH 32 + +@interface MainOpenGLView : NSOpenGLView +{ + GLubyte *image; + + GLint buffers; + GLint frame_rate; + + GLboolean rect_texture; + GLboolean client_storage; + GLboolean texture_range; + + bool fullscreen; + NSWindow * FullScreenWindow; + IBOutlet NSView * StartingView; + + + struct timeval cycle_time; + + IBOutlet NSTextField *sizeField; + + IBOutlet Goom * myGoom; + + NSTimer* timer; + + @public + float avg_fps; +} + +- (IBAction) clientStorage: (id) sender; +- (IBAction) textureHint: (id) sender; +- (IBAction) rectTextures: (id) sender; + +- (BOOL)canBeHQ; + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,249 @@ +#define IMAGE_SIZE (1<<(int)(log(([self bounds].size.width<[self bounds].size.height)?[self bounds].size.width:[self bounds].size.height)/log(2.0f))) + +#include +#include +#include + +#include "src/goom.h" + +#include // for image loading and decompression +#include // for file type support + +#include +#include +#include + +#import "MainOpenGLView.h" + +@implementation MainOpenGLView + +- (void) dealloc +{ + [super dealloc]; +} + +- (id)initWithFrame:(NSRect)frameRect +{ + // Init pixel format attribs + NSOpenGLPixelFormatAttribute attrs[] = + { + // Attributes Common to FullScreen and non-FullScreen + NSOpenGLPFAColorSize, 24, + NSOpenGLPFADepthSize, 16, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAccelerated, + NSOpenGLPFANoRecovery, + 0 + }; + + // Get pixel format from OpenGL + NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; + if (!pixFmt) + { + NSLog(@"No pixel format -- exiting"); + exit(1); + } + + self = [super initWithFrame:frameRect pixelFormat:pixFmt]; + return self; +} +/* +- (void)displayMPixels +{ + static long loop_count = 0; + struct timeval t2; + unsigned long t; + + loop_count++; + + gettimeofday(&t2, NULL); + t = 1000000 * (t2.tv_sec - cycle_time.tv_sec) + (t2.tv_usec - cycle_time.tv_usec); + + // Display the average data rate + if(t > 1000000 * STAT_UPDATE) + { + gettimeofday(&t2, NULL); + t = 1000000 * (t2.tv_sec - cycle_time.tv_sec) + (t2.tv_usec - cycle_time.tv_usec); + gettimeofday(&cycle_time, NULL); + avg_fps = (1000000.0f * (float) loop_count) / (float) t; + + loop_count = 0; + + gettimeofday(&cycle_time, NULL); + } +} +*/ + +- (BOOL)canBeHQ +{ + [[self openGLContext] makeCurrentContext]; + return (strstr(glGetString(GL_EXTENSIONS),"GL_EXT_texture_rectangle") != NULL); +} + + - (void) drawRect:(NSRect)rect + { + // Delegate to our scene object for rendering. + + [[self openGLContext] makeCurrentContext]; + + glViewport(0, 0, (GLsizei) rect.size.width, (GLsizei) rect.size.height); + + //GLfloat clear_color[4] = { 1.0f, 0.0f, 0.0f, 0.0f }; + //glClearColor(clear_color[0], clear_color[1], clear_color[2], clear_color[3]); + //glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT+GL_STENCIL_BUFFER_BIT); + + [myGoom render]; + + [[self openGLContext] flushBuffer]; + } + + +- (void)update // moved or resized +{ + NSRect rect; + + [myGoom setSize:[self bounds].size]; + + [super update]; + + [[self openGLContext] makeCurrentContext]; + [[self openGLContext] update]; + + rect = [self bounds]; + + glViewport(0, 0, (int) rect.size.width, (int) rect.size.height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + + [self setNeedsDisplay:true]; +} + +- (void)reshape // scrolled, moved or resized +{ + NSRect rect; + + [myGoom setSize:[self bounds].size]; + + [super reshape]; + + [[self openGLContext] makeCurrentContext]; + [[self openGLContext] update]; + + //[myGoom setSize:[self bounds].size]; + + + rect = [self bounds]; + + glViewport(0, 0, (int) rect.size.width, (int) rect.size.height); + + //[self loadTextures:GL_FALSE]; + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + [self setNeedsDisplay:true]; +} + +- (IBAction) clientStorage: (id) sender +{ + [myGoom clientStorage:([sender state]==NSOnState)?GL_TRUE:GL_FALSE]; + + //[self loadTextures:GL_FALSE]; +} + +- (IBAction) rectTextures: (id) sender +{ + [myGoom setHighQuality:(rect_texture==NSOnState)?YES:NO]; + + //[self loadTextures:GL_FALSE]; +} + +- (IBAction) textureHint: (id) sender +{ + int tag = [[sender selectedItem] tag]; + GLenum texture_hint = GL_STORAGE_CACHED_APPLE; + if(tag == 1) texture_hint = GL_STORAGE_PRIVATE_APPLE; + if(tag == 2) texture_hint = GL_STORAGE_SHARED_APPLE; + + [myGoom setTextureHint:texture_hint]; + //[self loadTextures:YES]; +} +/* +- (void)loadTextures: (GLboolean)first +{ + NSLog(@"LoadsTExtures"); + PluginInfo * goomInfos = [myGoom infos]; + + NSRect rect = [self bounds]; + + [[self openGLContext] makeCurrentContext]; + [[self openGLContext] update]; + glEnable(GL_LIGHTING); + if(rect_texture) + { + if(!first) + { + GLint dt = 1; + glDeleteTextures(1, &dt); + } + + goom_set_resolution (goomInfos, rect.size.width, rect.size.height); + + glDisable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_RECTANGLE_EXT); + glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 1); + + glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); + + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, [self bounds].size.width, + [self bounds].size.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [myGoom getGoomDataWithFPS:avg_fps]); + } + else + { + glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); + glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); + + if(!first) + { + GLint dt = 1; + glDeleteTextures(1, &dt); + } + + goom_set_resolution (goomInfos,IMAGE_SIZE, IMAGE_SIZE); + + glDisable(GL_TEXTURE_RECTANGLE_EXT); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, 1); + + glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); + + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, IMAGE_SIZE, + IMAGE_SIZE, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [myGoom getGoomDataWithFPS:avg_fps]); + } +} +*/ +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,45 @@ +/* + * + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under Apples + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import + +@interface MyApplication : NSApplication +{ +} +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,57 @@ +/* + * + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under Apples + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import "MyApplication.h" +#import "AppController.h" + +@implementation MyApplication + +- (NSEvent *)nextEventMatchingMask:(unsigned int)mask + untilDate:(NSDate *)expiration inMode:(NSString *)mode dequeue:(BOOL)flag +{ + NSEvent *event; + + event = [super nextEventMatchingMask:mask untilDate:expiration inMode:mode dequeue:flag]; + + //[[self delegate] UpdateDrawing]; + + return event; +} + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,36 @@ +// +// SoundSampler.h +// iGoom +// +// Created by Guillaume Borios on Thu May 27 2004. +// Copyright (c) 2004 iOS. All rights reserved. +// + +#import +#include + + +@interface SoundSampler : NSObject { + + @private + + IBOutlet NSPopUpButton * ODeviceList; + IBOutlet NSSlider * OSoundVolume; + + AudioDeviceID oldDevice, curDevice; + + signed short data[3][2][512]; + int BufferIndexReady, BufferIndexRead, BufferIndexWrite; + NSLock * BufferLock; +} + ++(SoundSampler*)sharedSampler; +-(void*)getData; +-(void) UpdateDeviceList; +-(void)updateBuffer:(const AudioBufferList *)inInputData withDevice:(AudioDeviceID)inDevice; + +-(IBAction)changeAudioDevice:(id)sender; +-(IBAction)changeAudioVolume:(id)sender; +-(void)refreshAudioVolumeInterface:(float)value; + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,372 @@ +// +// SoundSampler.mm +// iGoom +// +// Created by Guillaume Borios on Thu May 27 2004. +// Copyright (c) 2004 iOS. All rights reserved. +// + +#import "SoundSampler.h" + +#import "CoreAudioHardware.h" +#import "CoreAudioDevice.h" + +#include +#include + +#define kAudioDeviceNone 0 +#define kAudioDeviceUndefined 0xFFFF + + +OSStatus deviceChanged(AudioDeviceID inDevice, UInt32 /*inChannel*/, Boolean inIsInput, AudioDevicePropertyID inPropertyID, void * deviceController) +{ + if (inIsInput) + { + NS_DURING + + switch(inPropertyID) + { + case kAudioDevicePropertyDeviceIsAlive: + case kAudioDevicePropertyHogMode: + case kAudioDevicePropertyDeviceHasChanged: + { + [(SoundSampler*)deviceController UpdateDeviceList]; + CoreAudioDevice theDevice(inDevice); + [(SoundSampler*)deviceController refreshAudioVolumeInterface:theDevice.GetVolumeControlScalarValue(1,kAudioDeviceSectionInput)]; + } + break; + + default: + break; + }; + + NS_HANDLER + NS_ENDHANDLER + } + return 0; +} + +OSStatus devicesChanged(AudioHardwarePropertyID property, void * deviceController) +{ + NS_DURING + + switch(property) + { + case kAudioHardwarePropertyDevices: + [(SoundSampler*)deviceController UpdateDeviceList]; + break; + + default: + break; + }; + + NS_HANDLER + NS_ENDHANDLER + + return 0; +} + +static SoundSampler * sharedInstance = nil; + +@implementation SoundSampler + +-(SoundSampler*)init +{ + self = [super init]; + if (self) + { + if (sharedInstance==nil) sharedInstance = self; + oldDevice = curDevice = kAudioDeviceUndefined; + BufferIndexReady = 2; + BufferIndexRead = 0; + BufferIndexWrite = 1; + BufferLock = [[NSLock alloc] init]; + } + return self; +} + ++(SoundSampler*)sharedSampler +{ + if (sharedInstance==nil) + { + NSLog(@"Error : Sound Sampler invoked to early"); + exit(0); + } + return sharedInstance; +} + +-(void)awakeFromNib +{ + [ODeviceList setAutoenablesItems:NO]; + [self UpdateDeviceList]; + CoreAudioHardware::AddPropertyListener(kAudioHardwarePropertyDevices, (AudioHardwarePropertyListenerProc)devicesChanged, self); +} + +-(void) dealloc +{ + CoreAudioHardware::RemovePropertyListener(kAudioHardwarePropertyDevices, (AudioHardwarePropertyListenerProc)devicesChanged); + [super dealloc]; +} + + +OSStatus myDeviceProc(AudioDeviceID inDevice, const AudioTimeStamp * inNow, + const AudioBufferList * inInputData, + const AudioTimeStamp * inInputTime, + AudioBufferList * outOutputData, + const AudioTimeStamp * inOutputTime, void * inClientData) +{ + [(SoundSampler*)inClientData updateBuffer:inInputData withDevice:inDevice]; +} + +#define maxValue 32567.0f + +-(void)swapBuffersForRead:(BOOL)read +{ + int tmp; + + [BufferLock lock]; + if (read) + { + tmp = BufferIndexRead; + BufferIndexRead = BufferIndexReady; + BufferIndexReady = tmp; + } + else + { + tmp = BufferIndexWrite; + BufferIndexWrite = BufferIndexReady; + BufferIndexReady = tmp; + } + [BufferLock unlock]; +} + +-(void)updateBuffer:(const AudioBufferList *)inInputData withDevice:(AudioDeviceID)inDevice +{ + // WARNING !!! This function assumes the input format is (interleaved) Float32 !!! + int curBuffer; + int curPosition = 512-1; + int i; + for (curBuffer = inInputData->mNumberBuffers-1; (curBuffer >= 0) && (curPosition >= 0); --curBuffer) + { + UInt32 channels = inInputData->mBuffers[curBuffer].mNumberChannels; + UInt32 size = inInputData->mBuffers[curBuffer].mDataByteSize / (sizeof(Float32)*channels); + if ( (channels > 0) && (size > 0) ) + { + if (channels == 1) + { + // We will duplicate the first channel + for (i=size-1; (i >=0 ) && (curPosition >= 0); --i) + { + data[BufferIndexWrite][0][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]); + data[BufferIndexWrite][1][curPosition]=data[BufferIndexWrite][0][curPosition]; + curPosition--; + } + } + else + { + // Uses only the 2 first channels + for (i=size-1; (i >=0 ) && (curPosition >= 1); --i) + { + data[BufferIndexWrite][0][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]); + i--; + data[BufferIndexWrite][1][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]); + curPosition--; + } + } + } + } + [self swapBuffersForRead:NO]; +} + +-(void*)getData +{ + if (oldDevice != curDevice ) + { + // The device changed + + // Stop the old one + if ( (oldDevice != kAudioDeviceUndefined) && (oldDevice != kAudioDeviceNone) ) + { + AudioDeviceStop(oldDevice, myDeviceProc); + AudioDeviceRemoveIOProc(oldDevice, myDeviceProc); + bzero((void*)data,3*2*512*sizeof(short)); + } + oldDevice = curDevice; + + //Start the new one + if ( (curDevice != kAudioDeviceUndefined) && (curDevice != kAudioDeviceNone) ) + { + AudioDeviceAddIOProc(curDevice, myDeviceProc, (void*)self); + AudioDeviceStart(curDevice, myDeviceProc); + } + } + + [self swapBuffersForRead:YES]; + + return (void*)(&(data[BufferIndexRead][0][0])); +} + + + + +-(IBAction)_changeAudioDevice:(AudioDeviceID)device +{ + if (oldDevice==device) return; + + //NSLog(@"Changing audio device from %d to %d",oldDevice,device); + + if ( (oldDevice != kAudioDeviceUndefined) && (oldDevice != kAudioDeviceNone) ) + { + CoreAudioDevice old(oldDevice); + old.RemovePropertyListener(kAudioPropertyWildcardChannel, kAudioPropertyWildcardSection, kAudioPropertyWildcardPropertyID, (AudioDevicePropertyListenerProc)deviceChanged); + } + + curDevice = device; + + if (device == kAudioDeviceNone) + { + [OSoundVolume setEnabled:NO]; + [OSoundVolume setFloatValue:0.0f]; + } + else + { + CoreAudioDevice theDevice(device); + theDevice.AddPropertyListener(kAudioPropertyWildcardChannel, kAudioPropertyWildcardSection, kAudioPropertyWildcardPropertyID, (AudioDevicePropertyListenerProc)deviceChanged, self); + if (theDevice.HasVolumeControl(1,kAudioDeviceSectionInput)) + { + [OSoundVolume setEnabled:theDevice.VolumeControlIsSettable(1,kAudioDeviceSectionInput)]; + [OSoundVolume setFloatValue:theDevice.GetVolumeControlScalarValue(1,kAudioDeviceSectionInput)]; + } + else + { + [OSoundVolume setEnabled:NO]; + [OSoundVolume setFloatValue:0.0f]; + } + } +} + +-(IBAction)changeAudioDevice:(id)sender +{ + //NSLog(@"Will change to %@",[[ODeviceList selectedItem]title]); + [self _changeAudioDevice:[[ODeviceList selectedItem]tag]]; +} + + +-(void) AddDeviceToMenu:(CoreAudioDevice *)dev +{ + if (dev == nil) + { + [ODeviceList addItemWithTitle:[[NSBundle bundleForClass:[self class]] localizedStringForKey:@"None" value:nil table:nil]]; + [[ODeviceList lastItem] setTag:kAudioDeviceNone]; + } + else + { + [ODeviceList addItemWithTitle:@""]; + NSMenuItem* zeItem = [ODeviceList lastItem]; + + NSString* name = (NSString*)dev->name(); + [zeItem setTitle: [[NSBundle bundleForClass:[self class]] localizedStringForKey:name value:nil table:nil]]; + [name release]; + [zeItem setTag: dev->getDeviceID()]; + } +} + + +-(void) UpdateDeviceList +{ + int i,c; + + + // Cleanup + [ODeviceList removeAllItems]; + [self AddDeviceToMenu:nil]; + + + // List devices + int n = CoreAudioHardware::numberOfDevices(); + //NSLog(@"Current device %d",curDevice); + for(i = 0; i < n; i++) + { + CoreAudioDevice theDevice(CoreAudioHardware::deviceAtIndex(i)); + + // select audio devices with input streams only + if (theDevice.numberOfChannels(kAudioDeviceSectionInput) > 0) + { + [self AddDeviceToMenu:&theDevice]; + } + //NSLog(@"Tag %d : %d",i,[ODeviceList lastItem]); + } + + // Set up the new selection + pid_t theHogModeOwner; + + + // Choose the old device, if not hogged... + c = [ODeviceList indexOfItemWithTag: curDevice]; + if (c != -1) + { + CoreAudioDevice dev(CoreAudioHardware::deviceAtIndex(i-1)); + theHogModeOwner = dev.hogModeOwner(); + if ((theHogModeOwner != -1) && (theHogModeOwner != getpid())) + { + c = -1; + } + } + + // Disables all hogged audio inputs, and choose one if necessary and possible + int m = 1; + for (i = 0; i < n; i++) + { + CoreAudioDevice dev(CoreAudioHardware::deviceAtIndex(i)); + if (dev.numberOfChannels(kAudioDeviceSectionInput) > 0) + { + theHogModeOwner = dev.hogModeOwner(); + if ((theHogModeOwner != -1) && (theHogModeOwner != getpid())) + { + NS_DURING + [[ODeviceList itemAtIndex:m] setEnabled:NO]; + NS_HANDLER + //NSLog(@"Exception 1 a pété ! c = %d, i = %d, n = %d, max = %d",c,i,n,[ODeviceList numberOfItems]); + NS_ENDHANDLER + } + else if (c == -1) + { + c = m; + NS_DURING + [self _changeAudioDevice:[[ODeviceList itemAtIndex:c] tag]]; + NS_HANDLER + //NSLog(@"Exception 2 a pété ! c = %d, i = %d, n = %d, max = %d",c,i,n,[ODeviceList numberOfItems]); + NS_ENDHANDLER + } + m++; + } + } + + // If nothing could be selected, choose "None" + if (c == -1) + { + c = 0; + [self _changeAudioDevice:kAudioDeviceNone]; + } + + [ODeviceList selectItemAtIndex:c]; +} + + +-(void)refreshAudioVolumeInterface:(float)value +{ + [OSoundVolume setFloatValue:value]; +} + +-(IBAction)changeAudioVolume:(id)sender +{ + CoreAudioDevice theDevice(curDevice); + if (theDevice.VolumeControlIsSettable(1,kAudioDeviceSectionInput)) + theDevice.SetVolumeControlScalarValue(1,kAudioDeviceSectionInput,[sender floatValue]); + if (theDevice.VolumeControlIsSettable(2,kAudioDeviceSectionInput)) + theDevice.SetVolumeControlScalarValue(2,kAudioDeviceSectionInput,[sender floatValue]); +} + + + +@end diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/Makefile.am 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,7 @@ +SUBDIRS = src xmms-goom sdl-goom @MACFOLDER@ + +#.pc file +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libgoom2.pc + +DISTCLEANFILES = libgoom2.pc diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/NEWS kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/NEWS --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/NEWS 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/NEWS 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ +see ChangeLog diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/README kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/README --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/README 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/README 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,25 @@ +************************** +* What a GOOM! version 2 * +************************** +copyright 2000-2004, by Jean-Christophe Hoelt + +This is my first visual plugins for XMMS, and I think that it's the best +I have ever done ! + + /-----------------\\ +--< where to get Goom >-- + \\-----------------/ + +You can find the last version on the website of +iOS software: +http://www.ios-software.com/ + + /------\\ +--< thanks >-- + \\------/ + +Skal for the code of IFS +Burkhard for the initial fullscreen patch +Gyom for the iTunes version +Fred for the Windows version and a lot of other Goom Stuff + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,83 @@ +/* + * file : frame_rate_tester.c + * author : JC Hoelt + * + * birth : 2001-03-07 22:56 + * version : 2001-03-07 22:56 + * + * content : the function to calculate the frame rate + */ + +#include "goom_config.h" +#include "frame_rate_tester.h" +#include "gmtimer.h" +#include + +pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; + +/************** data ******************/ + +#define NUMBER_OF_FRAMES_IN_BUFFER 20 + +static float endlessTable[NUMBER_OF_FRAMES_IN_BUFFER]; +static guint32 currentPosInET; + +static GMTimer *timer = 0; + +/************** functions **************/ + +/* initialize the tester. do nothing if it has ever been initialized */ +void +framerate_tester_init () +{ + float curTime; + guint32 i; + + pthread_mutex_lock (&mut); + + if (!timer) { + timer = gmtimer_new (); + } + curTime = gmtimer_getvalue (timer); + for (i = 0; i < NUMBER_OF_FRAMES_IN_BUFFER; i++) + endlessTable[i] = curTime; + currentPosInET = 0; + + pthread_mutex_unlock (&mut); +} + +/* close the tester. do nothing if it hasn't been initialized */ +void +framerate_tester_close () +{ + pthread_mutex_lock (&mut); + gmtimer_delete (&timer); + timer = 0; + pthread_mutex_unlock (&mut); +} + +/* return the frame displayed by seconds */ +float +framerate_tester_getvalue () +{ + guint32 oldPos; + int ret; + + pthread_mutex_lock (&mut); + oldPos = (currentPosInET + 1) % NUMBER_OF_FRAMES_IN_BUFFER; + + ret = (float) NUMBER_OF_FRAMES_IN_BUFFER + / (endlessTable[currentPosInET] - endlessTable[oldPos]); + pthread_mutex_unlock (&mut); + return ret; +} + +/* inform the tester that a new frame has been displayed */ +void +framerate_tester_newframe () +{ + pthread_mutex_lock (&mut); + currentPosInET = (currentPosInET + 1) % NUMBER_OF_FRAMES_IN_BUFFER; + endlessTable[currentPosInET] = gmtimer_getvalue (timer); + pthread_mutex_unlock (&mut); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,30 @@ +/* + * file : frame_rate_tester.h + * author : JC Hoelt + * + * birth : 2001-03-07 22:56 + * version : 2001-03-07 22:56 + * + * content : the function to calculate the frame rate + */ + +#ifndef _FRAME_RATE_TESTER_H +#define _FRAME_RATE_TESTER_H + +#include "goom_config.h" + +/************** functions **************/ + +/* initialize the tester. do nothing if it has ever been initialized */ +void framerate_tester_init (); + +/* close the tester. do nothing if it hasn't been initialized */ +void framerate_tester_close (); + +/* return the frame displayed per seconds */ +float framerate_tester_getvalue (); + +/* inform the tester that a new frame has been displayed */ +void framerate_tester_newframe (); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * file : linux/glibfunc.c + * author : JC Hoelt + * + * birth : 2001-03-03 13:42 + * version : 2001-03-03 14:10 + * + * content : the function to manipulate the time, etc. + */ + +#include +#include "gmtimer.h" + +/************** functions **************/ + +/* initialize the timer. do nothing if the timer has ever been initialized */ +GMTimer * +gmtimer_new () +{ + GTimer *goom_timer = g_timer_new (); + + g_timer_start (goom_timer); + return (void *) goom_timer; +} + +/* close the timer. do nothing if the timer hasn't been initialized */ +void +gmtimer_delete (GMTimer ** t) +{ + GTimer *goom_timer = *(GTimer **) t; + + g_timer_stop (goom_timer); + g_free (goom_timer); + *t = 0; +} + +/* return the number of seconds since the initialization of the timer */ +float +gmtimer_getvalue (GMTimer * t) +{ + return g_timer_elapsed ((GTimer *) t, NULL); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,31 @@ +/* + * file : timer.h + * author : JC Hoelt + * + * birth : 2001-03-03 13:42 + * version : 2001-03-03 13:42 + * + * content : the function to manipulate the time. + * + * this functions are implemented on an os-dependant directory. + */ + +#ifndef _GMTIMER_H +#define _GMTIMER_H + +#include "goom_config.h" + +typedef void GMTimer; + +/************** functions **************/ + +/* initialize the timer. do nothing if the timer has ever been initialized */ +GMTimer *gmtimer_new (); + +/* close the timer. do nothing if the timer hasn't been initialized */ +void gmtimer_delete (GMTimer ** t); + +/* return the number of seconds since the initialization of the timer */ +float gmtimer_getvalue (GMTimer *); + +#endif /* _GMTIMER_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,416 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "gtk-callbacks.h" +#include "gtk-interface.h" +#include "gtk-support.h" + +#define WINSIZE_COMBO "combo_winsize" + +#include "sdl_goom.h" +#include "goom_config_param.h" + +#include +#include +#include + +static SdlGoom *sdlGoom; +static GtkObject *owin; + +static GdkColor color_blue; +static GdkColor color_red; + +void highlight_buffer(GtkText *editable) +{ + static int last_len = 0; + int i, len; + int next_add = 0; + + return; + + gint save_pos = gtk_editable_get_position(GTK_EDITABLE(editable)); /* save current pos */ + gchar *txt = gtk_editable_get_chars (GTK_EDITABLE(editable),0,-1); + len = strlen(txt); + if (len == 0) return; + + if (len == last_len) return; + last_len = len; + + gtk_text_freeze(editable); + + gtk_text_set_point(editable,0); + gtk_text_forward_delete(editable,len); + + for (i=0;inext_add) { + gtk_text_insert (editable, 0, 0, 0, txt+next_add, i-next_add); + next_add = i; + } + } + if ((txt[i]=='*')&&(txt[i+1]=='/')) { + if (i>next_add) { + gtk_text_insert (editable, 0, &color_blue, 0, txt+next_add, i-next_add+2); + next_add = i + 2; + } + } + } + if (next_add < len) { + gtk_text_insert (editable, 0, 0, 0, txt+next_add, len-next_add); + } + + /* gtk_editable_set_position(GTK_EDITABLE(editable),save_pos+40); + gtk_editable_set_position(GTK_EDITABLE(editable),save_pos-40); */ + + gtk_editable_set_position(GTK_EDITABLE(editable),save_pos); /* restore current pos */ + gtk_text_thaw(editable); + g_free(txt); +} + +void +on_spinbutton_int_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + IVAL(*param) = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(editable)); + param->changed(param); +} + +void +on_adj_float_changed (GtkWidget *w, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(w),"param"); + FVAL(*param) = GTK_ADJUSTMENT(w)->value; + param->changed(param); +} + +void +on_text_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + gchar *txt = gtk_editable_get_chars (editable,0,-1); + set_str_param_value(param, txt); + param->changed(param); + g_free(txt); + highlight_buffer(GTK_TEXT(editable)); +} + +void +on_list_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + gchar *txt = gtk_editable_get_chars (editable,0,-1); + set_list_param_value(param, txt); + param->changed(param); + g_free(txt); +} + +void +on_bool_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(togglebutton),"param"); + BVAL(*param) = gtk_toggle_button_get_active(togglebutton); + param->changed(param); +} + +void my_int_listener (PluginParam *param) { + GtkEditable *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_EDITABLE(param->user_data); + + if (editable) { + int pos = 0; + char str[256]; + sprintf (str, "%d", IVAL(*param)); + if (strcmp(str,gtk_editable_get_chars(editable,0,-1))) { + gtk_editable_delete_text (editable,0,-1); + gtk_editable_insert_text (editable,str,strlen(str),&pos); + } + } +} + +void my_list_listener (PluginParam *param) { + GtkEntry *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_ENTRY(param->user_data); + + if (editable) { + if (strcmp(gtk_entry_get_text(editable),LVAL(*param))) { + gtk_entry_set_text (editable, LVAL(*param)); + } + } +} + +void my_bool_listener (PluginParam *param) { + GtkCheckButton *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_CHECK_BUTTON(param->user_data); + + if (editable) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(editable)) != BVAL(*param)) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable),BVAL(*param)); + } +} + +void my_float_listener_progress (PluginParam *param) { + GtkProgressBar *progress; + + if (sdlGoom->config_win == 0) return; + progress = GTK_PROGRESS_BAR(param->user_data); + + if (progress) { + if (FVAL(*param)FMAX(*param)) + FVAL(*param) = FMAX(*param); + gtk_progress_bar_update (progress, FVAL(*param)); + } +} + +void my_float_listener_scale (PluginParam *param) { + GtkRange *range; + + if (sdlGoom->config_win == 0) return; + range = GTK_RANGE(param->user_data); + + if (range) { + GtkAdjustment *adj; + if (FVAL(*param) < FMIN(*param)) + FVAL(*param) = FMIN(*param); + if (FVAL(*param) > FMAX(*param)) + FVAL(*param) = FMAX(*param); + + adj = gtk_range_get_adjustment(range); + adj->value = FVAL(*param); + gtk_adjustment_value_changed(adj); +// gtk_range_set_adjustment(range, adj); + } +} + +void addParams (GtkNotebook *notebook, PluginParameters *params) { + int n; + GtkWidget *table = gtk_table_new (params->nbParams, 2, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (table), 11); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + + for (n=0;nnbParams;++n) { + if (params->params[n] == 0) { + GtkWidget *hseparator = gtk_hseparator_new (); + gtk_widget_show (hseparator); + gtk_table_attach (GTK_TABLE (table), hseparator, 0, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 5); + } else { + PluginParam *p = params->params[n]; + int type = p->type; + + if (type != PARAM_BOOLVAL) { + GtkWidget *label4 = gtk_label_new (p->name); + gtk_widget_show (label4); + gtk_table_attach (GTK_TABLE (table), label4, 0, 1, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5); + } + + switch (type) { + case PARAM_INTVAL: { + GtkWidget *spinbutton_adj,*spinbutton; + + spinbutton_adj = (GtkWidget*)gtk_adjustment_new ( + p->param.ival.value, + p->param.ival.min, p->param.ival.max, + p->param.ival.step, p->param.ival.step*10, + p->param.ival.step*10); + spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0); + gtk_widget_show (spinbutton); + gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 1); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE); + gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinbutton), + GTK_UPDATE_IF_VALID); + p->user_data = spinbutton; + gtk_object_set_data (GTK_OBJECT(spinbutton),"param",(void*)p); + p->change_listener = my_int_listener; + gtk_signal_connect (GTK_OBJECT (spinbutton), "changed", + GTK_SIGNAL_FUNC (on_spinbutton_int_changed), + NULL); + break; + } + + case PARAM_FLOATVAL: { + GtkWidget *progress,*prog_adj; + + prog_adj = (GtkWidget*)gtk_adjustment_new ( + p->param.fval.value, + p->param.fval.min, p->param.fval.max, + p->param.fval.step, p->param.fval.step*10, + p->param.fval.step*10); + + if (p->rw) + progress = gtk_hscale_new(GTK_ADJUSTMENT(prog_adj)); + else + progress = gtk_progress_bar_new_with_adjustment(GTK_ADJUSTMENT(prog_adj)); + gtk_widget_show(progress); + gtk_table_attach (GTK_TABLE (table), progress, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 1); + + p->user_data = progress; + if (p->rw) { + p->change_listener = my_float_listener_scale; + gtk_object_set_data (GTK_OBJECT(prog_adj),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (prog_adj), "value-changed", + GTK_SIGNAL_FUNC (on_adj_float_changed), + NULL); + } + else + p->change_listener = my_float_listener_progress; + break; + } + + case PARAM_STRVAL: { + GtkWidget *vscrollbar = 0; + GtkWidget *text_winsize = gtk_text_new (0,0); + gtk_widget_show (text_winsize); + gtk_table_attach (GTK_TABLE (table), text_winsize, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); + gtk_text_insert (GTK_TEXT(text_winsize), 0, 0, 0, p->param.sval.value, strlen(p->param.sval.value)); + gtk_text_set_editable(GTK_TEXT(text_winsize), p->rw); + /* Add a vertical scrollbar to the GtkText widget */ + vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text_winsize)->vadj); + gtk_table_attach (GTK_TABLE (table), vscrollbar, 2, 3, n, n+1, + GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_show (vscrollbar); + +/* combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; + gtk_widget_show (combo_entry_winsize); + gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); + gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); + p->change_listener = my_list_listener;*/ + p->user_data = text_winsize; + gtk_object_set_data (GTK_OBJECT(text_winsize),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (text_winsize), "changed", + GTK_SIGNAL_FUNC (on_text_changed), + NULL); + break; + } + + case PARAM_LISTVAL: { + int i; + GList *combo_winsize_items = NULL; + GtkWidget *combo_entry_winsize = NULL; + GtkWidget *combo_winsize = gtk_combo_new (); + gtk_widget_show (combo_winsize); + gtk_table_attach (GTK_TABLE (table), combo_winsize, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_combo_set_value_in_list (GTK_COMBO (combo_winsize), TRUE, TRUE); + for (i=0;iparam.slist.nbChoices;++i) + combo_winsize_items = g_list_append (combo_winsize_items, + p->param.slist.choices[i]); + gtk_combo_set_popdown_strings (GTK_COMBO (combo_winsize), combo_winsize_items); + g_list_free (combo_winsize_items); + + combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; + gtk_widget_show (combo_entry_winsize); + gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); + gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); + p->change_listener = my_list_listener; + p->user_data = combo_entry_winsize; + gtk_object_set_data (GTK_OBJECT(combo_entry_winsize),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (combo_entry_winsize), "changed", + GTK_SIGNAL_FUNC (on_list_changed), + NULL); + break; + } + + case PARAM_BOOLVAL: { + GtkWidget *checkbutton_double = + gtk_check_button_new_with_label (p->name); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_double),BVAL(*p)); + gtk_widget_show (checkbutton_double); + gtk_table_attach (GTK_TABLE (table), checkbutton_double, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_signal_connect (GTK_OBJECT (checkbutton_double), "toggled", + GTK_SIGNAL_FUNC (on_bool_toggled), + NULL); + gtk_object_set_data (GTK_OBJECT(checkbutton_double),"param",(void*)p); + p->user_data = checkbutton_double; + p->change_listener = my_bool_listener; + break; + } + } + } + } + + gtk_widget_show_all(GTK_WIDGET(table)); + gtk_container_add(GTK_CONTAINER(notebook),table); + gtk_notebook_set_tab_label_text(notebook,GTK_WIDGET(table),params->name); +} + +void gtk_data_init(SdlGoom *sg) { + + sdlGoom = sg; + if (sdlGoom->config_win) { + int i; + GtkNotebook *notebook; + GdkColormap *cmap; + + cmap = gdk_colormap_get_system(); + color_blue.red = 0; + color_blue.blue = 0xffff; + color_blue.green = 0; + color_red.red = 0xffff; + color_red.blue = 0; + color_red.green = 0; + if ((!gdk_color_alloc(cmap, &color_blue))||(!gdk_color_alloc(cmap, &color_red))) { + g_error("couldn't allocate color"); + } + + owin = GTK_OBJECT(sdlGoom->config_win); + notebook = GTK_NOTEBOOK(gtk_object_get_data (owin, "notebook1")); + addParams (notebook, &sdlGoom->screen); + for (i = 0; i < sdlGoom->plugin->nbParams; ++i) { + addParams (notebook, &sdlGoom->plugin->params[i]); + } + } + +} + +gboolean +on_config_window_destroy_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + sdlGoom->config_win = 0; + owin = 0; + return FALSE; +} + + +gboolean +on_config_window_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + sdlGoom->config_win = 0; + owin = 0; + return FALSE; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,24 @@ +#include + + +void +on_checkbutton_double_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + +void +on_spinbutton_fps_changed (GtkEditable *editable, + gpointer user_data); + +void +on_combo_entry_winsize_changed (GtkEditable *editable, + gpointer user_data); + +gboolean +on_config_window_destroy_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); + +gboolean +on_config_window_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,138 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#include +#include + +#include "gtk-callbacks.h" +#include "gtk-interface.h" +#include "gtk-support.h" + +GtkWidget* +create_config_window (void) +{ + GtkWidget *config_window; + GtkWidget *vbox1; + GtkWidget *toolbar1; + GtkWidget *b_open_config; + GtkWidget *b_save_config; + GtkWidget *notebook1; + GtkWidget *scrolledwindow1; + GtkWidget *text1; + GtkWidget *goom_control; + GtkWidget *statusbar1; + + config_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_set_name (config_window, "config_window"); + gtk_object_set_data (GTK_OBJECT (config_window), "config_window", config_window); + gtk_window_set_title (GTK_WINDOW (config_window), _("Goom Control Center")); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_widget_set_name (vbox1, "vbox1"); + gtk_widget_ref (vbox1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "vbox1", vbox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox1); + gtk_container_add (GTK_CONTAINER (config_window), vbox1); + + toolbar1 = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT); + gtk_widget_set_name (toolbar1, "toolbar1"); + gtk_widget_ref (toolbar1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "toolbar1", toolbar1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (toolbar1); + gtk_box_pack_start (GTK_BOX (vbox1), toolbar1, FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (toolbar1), 3); + gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar1), 8); + gtk_toolbar_set_space_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_SPACE_LINE); + + b_open_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), + GTK_TOOLBAR_CHILD_BUTTON, + NULL, + _("Open..."), + NULL, NULL, + NULL, NULL, NULL); + gtk_widget_set_name (b_open_config, "b_open_config"); + gtk_widget_ref (b_open_config); + gtk_object_set_data_full (GTK_OBJECT (config_window), "b_open_config", b_open_config, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (b_open_config); + + b_save_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), + GTK_TOOLBAR_CHILD_BUTTON, + NULL, + _("Save..."), + NULL, NULL, + NULL, NULL, NULL); + gtk_widget_set_name (b_save_config, "b_save_config"); + gtk_widget_ref (b_save_config); + gtk_object_set_data_full (GTK_OBJECT (config_window), "b_save_config", b_save_config, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (b_save_config); + + notebook1 = gtk_notebook_new (); + gtk_widget_set_name (notebook1, "notebook1"); + gtk_widget_ref (notebook1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "notebook1", notebook1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (notebook1); + gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook1), GTK_POS_LEFT); + + scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_name (scrolledwindow1, "scrolledwindow1"); + gtk_widget_ref (scrolledwindow1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "scrolledwindow1", scrolledwindow1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (scrolledwindow1); + gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); + + text1 = gtk_text_new (NULL, NULL); + gtk_widget_set_name (text1, "text1"); + gtk_widget_ref (text1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "text1", text1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (text1); + gtk_container_add (GTK_CONTAINER (scrolledwindow1), text1); + gtk_widget_set_usize (text1, 400, 300); + { char *str = _("What a GOOM!!\n\nCopyright (c)2000-2004, by Jean-Christophe Hoelt \n\nThis is my first visual plugins for XMMS, and I\nthink that it's the best I have ever done!\nYou can grab our last version and help us with a donation at\nhttp://www.ios-software.com/\nThanks and enjoy!\n\n\tJeko"); + gtk_text_insert (GTK_TEXT (text1), NULL, NULL, NULL, str, strlen(str)); + } + + goom_control = gtk_label_new (_("About goom...")); + gtk_widget_set_name (goom_control, "goom_control"); + gtk_widget_ref (goom_control); + gtk_object_set_data_full (GTK_OBJECT (config_window), "goom_control", goom_control, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (goom_control); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), goom_control); + + statusbar1 = gtk_statusbar_new (); + gtk_widget_set_name (statusbar1, "statusbar1"); + gtk_widget_ref (statusbar1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "statusbar1", statusbar1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (statusbar1); + gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0); + + gtk_signal_connect (GTK_OBJECT (config_window), "destroy_event", + GTK_SIGNAL_FUNC (on_config_window_destroy_event), + NULL); + gtk_signal_connect (GTK_OBJECT (config_window), "delete_event", + GTK_SIGNAL_FUNC (on_config_window_delete_event), + NULL); + + return config_window; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,5 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +GtkWidget* create_config_window (void); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,162 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#include + +#include "gtk-support.h" + +/* This is an internally used function to check if a pixmap file exists. */ +static gchar* check_file_exists (const gchar *directory, + const gchar *filename); + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* create_dummy_pixmap (GtkWidget *widget); + +GtkWidget* +lookup_widget (GtkWidget *widget, + const gchar *widget_name) +{ + GtkWidget *parent, *found_widget; + + for (;;) + { + if (GTK_IS_MENU (widget)) + parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); + else + parent = widget->parent; + if (parent == NULL) + break; + widget = parent; + } + + found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), + widget_name); + if (!found_widget) + g_warning ("Widget not found: %s", widget_name); + return found_widget; +} + +/* This is a dummy pixmap we use when a pixmap can't be found. */ +static char *dummy_pixmap_xpm[] = { +/* columns rows colors chars-per-pixel */ +"1 1 1 1", +" c None", +/* pixels */ +" " +}; + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* +create_dummy_pixmap (GtkWidget *widget) +{ + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, + NULL, dummy_pixmap_xpm); + if (gdkpixmap == NULL) + g_error ("Couldn't create replacement pixmap."); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +static GList *pixmaps_directories = NULL; + +/* Use this function to set the directory containing installed pixmaps. */ +void +add_pixmap_directory (const gchar *directory) +{ + pixmaps_directories = g_list_prepend (pixmaps_directories, + g_strdup (directory)); +} + +/* This is an internally used function to create pixmaps. */ +GtkWidget* +create_pixmap (GtkWidget *widget, + const gchar *filename) +{ + gchar *found_filename = NULL; + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + GList *elem; + + if (!filename || !filename[0]) + return create_dummy_pixmap (widget); + + /* We first try any pixmaps directories set by the application. */ + elem = pixmaps_directories; + while (elem) + { + found_filename = check_file_exists ((gchar*)elem->data, filename); + if (found_filename) + break; + elem = elem->next; + } + + /* If we haven't found the pixmap, try the source directory. */ + if (!found_filename) + { + found_filename = check_file_exists ("../pixmaps", filename); + } + + if (!found_filename) + { + g_warning (_("Couldn't find pixmap file: %s"), filename); + return create_dummy_pixmap (widget); + } + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, + NULL, found_filename); + if (gdkpixmap == NULL) + { + g_warning (_("Error loading pixmap file: %s"), found_filename); + g_free (found_filename); + return create_dummy_pixmap (widget); + } + g_free (found_filename); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +/* This is an internally used function to check if a pixmap file exists. */ +gchar* +check_file_exists (const gchar *directory, + const gchar *filename) +{ + gchar *full_filename; + struct stat s; + gint status; + + full_filename = (gchar*) g_malloc (strlen (directory) + 1 + + strlen (filename) + 1); + strcpy (full_filename, directory); + strcat (full_filename, G_DIR_SEPARATOR_S); + strcat (full_filename, filename); + + status = stat (full_filename, &s); + if (status == 0 && S_ISREG (s.st_mode)) + return full_filename; + g_free (full_filename); + return NULL; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +/* + * Standard gettext macros. + */ +#ifdef ENABLE_NLS +# include +# undef _ +# define _(String) dgettext (PACKAGE, String) +# ifdef gettext_noop +# define N_(String) gettext_noop (String) +# else +# define N_(String) (String) +# endif +#else +# define textdomain(String) (String) +# define gettext(String) (String) +# define dgettext(Domain,Message) (Message) +# define dcgettext(Domain,Message,Type) (Message) +# define bindtextdomain(Domain,Directory) (Domain) +# define _(String) (String) +# define N_(String) (String) +#endif + + +/* + * Public Functions. + */ + +/* + * This function returns a widget in a component created by Glade. + * Call it with the toplevel widget in the component (i.e. a window/dialog), + * or alternatively any widget in the component, and the name of the widget + * you want returned. + */ +GtkWidget* lookup_widget (GtkWidget *widget, + const gchar *widget_name); + +/* get_widget() is deprecated. Use lookup_widget instead. */ +#define get_widget lookup_widget + +/* Use this function to set the directory containing installed pixmaps. */ +void add_pixmap_directory (const gchar *directory); + + +/* + * Private Functions. + */ + +/* This is used to create the pixmaps in the interface. */ +GtkWidget* create_pixmap (GtkWidget *widget, + const gchar *filename); + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,11 @@ +# the goom2 stand alone program + +if HAVE_SDL +bin_PROGRAMS = goom2 + +goom2_LDADD = $(top_builddir)/src/libgoom2.la +goom2_LDFLAGS = $(SDL_LIBS) `gtk-config --libs` +goom2_SOURCES = frame_rate_tester.c gmtimer.c gtk-callbacks.c gtk-interface.c gtk-support.c pixeldoubler.c readme.c sdl_goom.c sdl_pixeldoubler.c surface.c +INCLUDES=$(SDL_CFLAGS) `gtk-config --cflags` -I../src/ +endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,118 @@ +bits 32 +global pixel_doubler + +%macro twopixproc 0 +%rep 2 + movq mm0,[esi] ; -> P1P2 + movq mm2,[esi+8] ; -> P3P4 + + movq mm1,mm0 + movq mm3,mm2 + + punpckldq mm1,mm1 ; P1P2 | P1P2 -> P1P1 + punpckhdq mm0,mm0 ; P1P2 | P1P2 -> P2P2 + + movntq [edi],mm1 + punpckldq mm3,mm3 ; P3P4 | P3P4 -> P3P3 + + movntq [edi+8],mm0 + punpckhdq mm2,mm2 ; P3P4 | P3P4 -> P4P4 + + movntq [edi+16],mm3 + movq mm4,[esi+16] + + movntq [edi+24],mm2 + movq mm6,[esi+24] + + movq mm5,mm4 + movq mm7,mm6 + + punpckldq mm5,mm5 ; P1P2 | P1P2 -> P1P1 + punpckhdq mm4,mm4 ; P1P2 | P1P2 -> P2P2 + + movntq [edi+32],mm5 + punpckldq mm7,mm7 ; P3P4 | P3P4 -> P3P3 + + movntq [edi+40],mm4 + punpckhdq mm6,mm6 ; P3P4 | P3P4 -> P4P4 + + movntq [edi+48],mm7 + add esi,32 + + movntq [edi+56],mm6 + add edi,64 +%endrep +%endmacro + +%macro prefetcher 0 + prefetch [esi+128] +%endmacro + + +align 16 +pixel_doubler: + push ebp + mov ebp,esp + push edi + push esi + push ebx + push ecx + push edx + + mov ecx,[ebp+8] ; ecx <- src + mov edx,[ebp+12] ; edx <- dest + + mov esi,[ecx] ; esi <- src->buf + mov edi,[edx] ; edi <- dest->buf + + mov ebx,[ecx+4] ; ebx <- src->width + mov eax,[ecx+8] ; eax <- src->height + + shl ebx,2 ; width *= 4 (in byte) + mov edx,ebx ; edx <- width in byte + shr ebx,6 ; width in cache page + +align 16 +while_1: + prefetch [esi] ; prefetch the first cache line + prefetch [esi+64] + + mov ecx,ebx + +while_2: + prefetcher + twopixproc + + dec ecx + jnz while_2 +; end_while_2 + + sub esi,edx + mov ecx,ebx + + prefetch [esi] ; prefetch the first cache line + prefetch [esi+64] + +while_3: + prefetcher + twopixproc + + dec ecx + jnz while_3 +; end_while_3 + + dec eax ; decremente le nombre de ligne testee + jnz while_1 ; on continue si c'etait pas la derniere + +; end_while_1: + + sfence + femms + + pop edx + pop ecx + pop ebx + pop esi + pop edi + leave + ret diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,44 @@ +#include "pixeldoubler.h" +#include +#include + +void pixel_doubler (Surface *src, Surface *dest) { + register int *d; // pointeur sur le pixel courant a marquer + register int *s; // pointeur sur le pixel coutant en cours de lecture + int sw; // nombre d'octet de largeur de ligne de la surface source + int sw2; + int fd; // adresse de la fin du buffer destination + int fin; // adresse de fin d'une ligne du buffer source + + d = dest->buf; + s = src->buf; + + sw = src->width << 2; + sw2 = sw << 1; + + fin = (int)s; + fd = (int)d + (dest->size<<2); + + // tant que tout le buffer source n'est pas remplit + while ((int)d < fd) { + + // passer a la ligne suivante du buffer source + fin += sw; + + // l'afficher sur une ligne du buffer destination + while ((int)s < fin) { + register int col = *(s++); + // 2 affichage par point du buffer source (doubling horizontal) + *(d++) = col; *(d++) = col; + } + + // puis l'afficher sur une autre ligne (doubling vertical) + memcpy (d, ((char*)d) - sw2, sw2); +/* s = (int*)((int)s - sw); // retour au debut de la ligne src + while ((int)s < fin) { + register int col = *(s++); + *(d++) = col; *(d++) = col; // idem (cf plus haut) + } */ + d = (int*)((char*)d + sw2); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,58 @@ +#ifndef _PIXELDOUBLER_H +#define _PIXELDOUBLER_H + +#include "surface.h" + +/* + * copie la surface src dans la surface dest en doublant la taille des pixels. + * + * la surface dest doit faire exactement 2 fois la taille de la surface src. + * (segfault sinon). + * + * auteur : JeKo + * + * bench : <2001-11-28|20h00> 9 cycles par pixel marqu (cpm) sur un PII 266. + * (surement limit par le debit de la memoire vive.. + * je fonce chez moi verifier) + * 11 cpm sur un Duron 800. (i.e. pas loin de 300fps) + * surement que les acces memoires sont assez penalisant. + * je tente d'aligner les donnes des surfaces pour voir. + * => pas mieux : le systeme doit deja faire ca comme il faut. + * mais pour l'alignement 64bits ca va etre utile : je passe a l'ASM + * <3h00> l'optimisation asm a permi de gagner vraiment pas grand + * chose (0.1 ms sur mon Duron).. le code en C semble suffisant. + * et je persiste a croire ke la vitesse est plafonn par la vitesse + * d'acces a la memoire.. ceci expliquerait aussi cela. + * + * <2001-12-08|1h20> Travail sur le code assembleur : + * pour reduire les temps d'acces memoire, utilisation de + * l'instruction 3Dnow! PREFETCH/W pour le prechargement des + * page de cache. pour pousser cette optimisation jusque au bout : + * j'ai droul la boucle pour qu'elle traite a chaque passage + * une page de cache complete en lecture et 2 en ecriture. + * (optimis sur un Duron=Athlon, page de cache = 64 octets) + * preformances sur mon Duron 800 : 9 CPM. + * (ce qui fait 18% de mieux que la version en C) + * ATTENTION : CETTE VERSION NE SUPPORTE DONC QUE DES TAILLES DE + * SURFACE AYANT UNE LARGEUR MULTIPLE DE 32 POUR DEST, + * DONC 16 POUR SRC. (ce qui n'est pas tres genant puisque ce sont + * des resolutions standard, mais il faut le savoir) + * explication : alignement des donnes sur la taille des pages de + * cache. + * + * <2001-12-08|14h20> Apres intense potassage de la doc de l'Athlon, + * decouverte certaines subtilits de ce FABULEUX processeur :) + * entrelacement de la copie de 2 pixel, plus utilisation de + * l'instruction de transfert rapide 3Dnow! MOVNTQ... attention les + * chiffres -> sur mon Duron 800 : 4 CPM !!!!! + * + * note : ne fonctionne que sur un systeme 32bits.. mais le faire fonctionner + * sur une machine autre ne posera aucun probleme. + * (le seul truc c'est ke j'ai considr mes pointeurs comme des entiers + * 32bits <- je sais je suis vaxiste, et alors???:) + * + * copyright (c)2001, JC Hoelt for iOS software. + */ +void pixel_doubler (Surface *src, Surface *dest) ; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/readme.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/readme.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/readme.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/readme.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ +#ifndef _GOOM_README_H +#define _GOOM_README_H + +/* Automatically generated from README, via Makefile.am */ +static char goom_readme[] = +"TAB - Enter/Leave Fullscreen\n" +"Numpad +/- - Change resolution\n" +"F1-F8 - Set Background FX\n" +"\n" +"F - Display Frame Rate\n" +"Q - Quit\n"; + +static char goom_big_readme[] = +"****************************\n" +"* What a GOOM! version 2k4 *\n" +"****************************\n" +"by Jean-Christophe 'Jeko' Hoelt\n" +"\n" +"\n" +"The incredible trippy visualization plugin!!\n" +"\n" +"\n" +"\n" +"...... freely offered by iOS-Software\n" +"Wanna find the last version of goom or support\n" +"us with a donation? There you go:\n" +"\n" +"http://www.ios-software.com/\n" +"\n" +"\n" +"\n" +"...... many thanks to:\n" +"\n" +"Skal for the code of IFS\n" +"\n" +"Gyom for the iTunes version\n" +" and some of the main work\n" +"\n" +"Fred for the Windows version and a lot of\n" +" other Goom Stuff\n" +"\n" +"Dennis and guys of libvisual for their\n" +" help on the unix package\n" +"\n" +"\n" +"\n" +"Enjoy!"; + +#endif /* _GOOM_README_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,746 @@ +#include +#include +#include "goom_config.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "goom_tools.h" +#include "goom.h" + +#include "frame_rate_tester.h" +#include "gmtimer.h" + +#include "pixeldoubler.h" +#include "sdl_pixeldoubler.h" + +#include "readme.c" + +#include "gtk-support.h" +#include "gtk-interface.h" + +#include "sdl_goom.h" + +static SdlGoom sdlGoom; + +//#define BENCHMARK_X86 +#ifdef BENCHMARK_X86 +#include +static uint64_t GetTick() +{ + uint64_t x; + /* __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));*/ + asm volatile ("RDTSC" : "=A" (x)); + return x; +} +#endif + +/** + * Callback des parametres + */ +static void screen_size_changed (PluginParam *); +static void fps_limit_changed (PluginParam *); +static void pix_double_changed (PluginParam *); +static void hide_cursor_changed (PluginParam *); + +/** + * Initialise les parametres de la version SDL + */ +static void init_parameters() { + + static char *resolutions[4] = {"320x240","400x300","640x480","800x600"}; + static struct ListVal reslist = { + value:0, + nbChoices:4, + choices:resolutions + }; + + sdlGoom.screen_size = secure_param (); + sdlGoom.screen_size.name = "Window's Size:"; + sdlGoom.screen_size.desc = ""; + sdlGoom.screen_size.type = PARAM_LISTVAL; + sdlGoom.screen_size.param.slist = reslist; + sdlGoom.screen_size.changed = screen_size_changed; + set_list_param_value(&sdlGoom.screen_size, "400x300"); + + sdlGoom.fps_limit = secure_param (); + sdlGoom.fps_limit.name = "Frame Rate:"; + sdlGoom.fps_limit.desc = ""; + sdlGoom.fps_limit.type = PARAM_INTVAL; + sdlGoom.fps_limit.param.ival.min = 1; + sdlGoom.fps_limit.param.ival.max = 35; + sdlGoom.fps_limit.param.ival.value = 30; + sdlGoom.fps_limit.param.ival.step = 1; + sdlGoom.fps_limit.changed = fps_limit_changed; + + sdlGoom.pix_double = secure_param (); + sdlGoom.pix_double.name = "Double Pixel"; + sdlGoom.pix_double.type = PARAM_BOOLVAL; + sdlGoom.pix_double.changed = pix_double_changed; + BVAL(sdlGoom.pix_double) = 0; + + sdlGoom.hide_cursor = secure_param (); + sdlGoom.hide_cursor.name = "Hide Cursor"; + sdlGoom.hide_cursor.type = PARAM_BOOLVAL; + sdlGoom.hide_cursor.changed = hide_cursor_changed; + BVAL(sdlGoom.hide_cursor) = 1; + + sdlGoom.display_fps = secure_param (); + sdlGoom.display_fps.name = "Display FPS"; + sdlGoom.display_fps.type = PARAM_BOOLVAL; + BVAL(sdlGoom.display_fps) = 0; + + sdlGoom.screen = plugin_parameters("Display", 7); + sdlGoom.screen.params[0]=&sdlGoom.screen_size; + sdlGoom.screen.params[1]=&sdlGoom.pix_double; + sdlGoom.screen.params[2]=0; + sdlGoom.screen.params[3]=&sdlGoom.fps_limit; + sdlGoom.screen.params[4]=&sdlGoom.display_fps; + sdlGoom.screen.params[5]=0; + sdlGoom.screen.params[6]=&sdlGoom.hide_cursor; + + sdlGoom.config_win = 0; + sdlGoom.screen_height = 300; + sdlGoom.screen_width = 400; + sdlGoom.doublepix = 0; + sdlGoom.active = 1; +} + +/* + * Methodes utilitaires + */ +char *sdl_goom_set_doublepix (int dp); +static void apply_double (); + + +static int resx = 400; +static int resy = 300; +static int doublepix = 0; +static int doubledec = 0; + +static int MAX_FRAMERATE = 32; +static double INTERPIX = 1000.0f / 32; + +static SDL_Surface *surface = NULL; +static int is_fs = 0; + +/* static void thread_func (); */ + +static void sdl_goom_init (int argc, char **argv); +static void sdl_goom_cleanup (); +static void sdl_goom_loop (); +static void sdl_goom_render_pcm (gint16 data[2][512], gchar *title); + +static Surface *gsurf2 = NULL; +static Surface gsurf; +static char *main_script = NULL; +static char *init_script = NULL; + +static int fini = 0; +static int disable = 0; +static gint16 snd_data[2][512]; + +#include + +void on_kill(int i) { + fini = 1; + disable = 1; +} + +int main (int argc, char **argv) { + + gtk_set_locale (); + gtk_init (&argc, &argv); + + sdl_goom_init(argc, argv); + signal(SIGQUIT, on_kill); + sdl_goom_loop(); + sdl_goom_cleanup(); + return 0; +} + +static char *load_file(const char *fname) +{ + FILE *f = fopen(fname, "rt"); + long size; + char *sc; + + if (!f) { + fprintf(stderr, "Could not load file %s\n", fname); + return ""; + } + + fseek(f, 0L, SEEK_END); + size = ftell(f); + rewind(f); + sc = (char*)malloc(size+1); + fread(sc,1,size,f); + sc[size] = 0; + fclose(f); + printf("%s loaded\n", fname); + return sc; +} + +static void display_help() +{ + printf("usage: goom2 \n"); +} + +static void check_arg(int argc, char *argv) +{ + static int has_init = 0; + static int has_main = 0; + + if (argv[0] == '-') { + if ((!strcmp(argv,"-h"))||(!strcmp(argv,"--help"))) { + display_help(); + exit(0); + } + } + else if (!has_init) { + init_script = load_file(argv); + has_init = 1; + } + else if (!has_main) { + main_script = load_file(argv); + has_main = 1; + } +} + +void sdl_goom_init (int argc, char **argv) +{ + gint16 data[2][512]; + int i; + int init_flags = SDL_INIT_VIDEO; + + for (i=1; i INITIALIZING GOOM\n"); +#endif + + fini = FALSE; +#ifdef THIS_MAKES_ATI_CARDS_TO_CRASH__linux__ + /* This Hack Allows Hardware Surface on Linux */ + setenv("SDL_VIDEODRIVER","dga",0); + + if (SDL_Init(init_flags) < 0) { + printf(":-( Could not use DGA. Try using goom2 as root.\n"); + setenv("SDL_VIDEODRIVER","x11",1); + if (SDL_Init(init_flags) < 0) { + fprintf(stderr, "SDL initialisation error: %s\n", SDL_GetError()); + exit(1); + } + } + else { + printf(":-) DGA Available !\n"); + SDL_WM_GrabInput(SDL_GRAB_ON); + } +#else + if ( SDL_Init(init_flags) < 0 ) { + fprintf(stderr, "SDL initialisation error: %s\n", SDL_GetError()); + exit(1); + } +#endif + surface = SDL_SetVideoMode (resx, resy, 32, + SDL_RESIZABLE|SDL_SWSURFACE); + SDL_WM_SetCaption ("What A Goom!!", NULL); + SDL_ShowCursor (0); + SDL_EnableKeyRepeat (0, 0); + atexit(SDL_Quit); + + apply_double (); + sdlGoom.plugin = goom_init (resx, resy); + + /*if (init_script != NULL) { + gsl_ex(sdlGoom.plugin, init_script); + } + + if (main_script != NULL) { + goom_set_main_script(sdlGoom.plugin, main_script); + }*/ + + for (i = 0; i < 512; i++) { + data[0][i] = 0; + data[1][i] = 0; + } + + framerate_tester_init (); +} + +/* retourne x>>s , en testant le signe de x */ +#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) + +static void +sdl_goom_loop() +{ + static double tnext = 0; + static gint16 prev0 = 0; + static int i, j; + gchar *ptitle = NULL; + static char title[2048]; + + if (tnext < 0.01) + tnext = INTERPIX + SDL_GetTicks(); + + while (!fini) { + double t; + sdl_goom_render_pcm (snd_data, ptitle); + ptitle = NULL; + + /* load the sound data */ + { + fd_set rfds; + struct timeval tv; + int retval; + + tv.tv_sec = 0; + tv.tv_usec = 10; + + FD_ZERO(&rfds); + FD_SET(0, &rfds); + retval = select(1, &rfds, NULL, NULL, &tv); + + if (retval) { + int type; + read (0, &type, sizeof(int)); + switch (type) { + case 0: + read (0, snd_data, 512*2*2); + break; + case 1: + read (0, title, 2048); + ptitle = &title[0]; + break; + case 2: + fini = 1; + disable = TRUE; + break; + } + } + } + + if (prev0 == snd_data[0][0]) { + for (i = 0; i < 2; i++) + for (j = 0; j < 512; j++) + snd_data[i][j] = ShiftRight((snd_data[i][j] * 31),5); + } + prev0 = snd_data[0][0]; + + t = SDL_GetTicks(); + if (t < tnext) { + float t2s = (tnext-t); + while (t2s>20) { + usleep(20*1000); + gtk_main_iteration_do(FALSE); + t = SDL_GetTicks(); + t2s = tnext-t; + } + tnext += INTERPIX; + } + else { + tnext = t+INTERPIX; + } + i = 0; + while (gtk_main_iteration_do(FALSE) == TRUE) { + if (i++ > 10) + break; + } + } + /* else { + * gtk_main_quit(); + * } + */ +} + +static void +sdl_goom_cleanup (void) +{ +#ifdef VERBOSE + printf ("--> CLEANUP GOOM\n"); +#endif + + if (is_fs) { + SDL_WM_ToggleFullScreen (surface); + } + SDL_Quit (); + + goom_close (sdlGoom.plugin); + framerate_tester_close (); +} + + +/*===============================*/ + +static void apply_double () { + + if (gsurf2) surface_delete (&gsurf2); + if (!doublepix) + return; + + if (surface->format->BytesPerPixel == 4) + doublepix = 2; + else + doublepix = 1; + + if (doublepix==2) { + resx /= 2; + resy /= 2; + doubledec = 0; + } + else if (doublepix == 1) { + doubledec = resx % 32; + resx = resx - doubledec; + resx /= 2; + resy /= 2; + doubledec /= 2; + gsurf2 = surface_new (resx*2,resy*2); + } + + gsurf.width = resx; + gsurf.height = resy; + gsurf.size = resx*resy; +} + + +static char * resize_win (int w, int h, int force) { + static char s[256]; + if ((w != sdlGoom.screen_width)||(h != sdlGoom.screen_height)||force) { + static SDL_Event e; + e.resize.type = SDL_VIDEORESIZE; + e.resize.w = w; + e.resize.h = h; + SDL_PushEvent (&e); + } + sprintf (s,"%dx%d",w,h); + return s; +} + +static void +sdl_goom_render_pcm (gint16 data[2][512], gchar *title) +{ +#ifdef BENCHMARK_X86 + uint64_t t0,t1,t2; +#endif + static char *msg_tab[] = { + "What a GOOM! version " VERSION + "\n\n\n\n\n\n\n\n" + "an iOS sotfware production.\n" + "\n\n\n" + "http://www.ios-software.com/", + goom_readme, + goom_big_readme, + "Copyright (c)2000-2004, by Jeko" + }; + static int msg_pos = 0; +#define ENCORE_NUL_LOCK (32*200) + static int encore_nul = 0; + + guint32 *buf; + SDL_Surface *tmpsurf = NULL; + + /* static int spos = -1; */ + + gchar *message = NULL; + + /* TODO : Utiliser une commande dans le pipe * + * int pos = xmms_remote_get_playlist_pos (jeko_vp.xmms_session); + */ + + int forceMode = 0; + +#define NBresoli 11 + static int resoli = 7; + static int resolx[] = {320,320,400,400,512,512,640,640,640,800,800}; + static int resoly[] = {180,240,200,300,280,384,320,400,480,400,600}; + + int i; + SDL_Event event; + + /* Check for events */ + while (SDL_PollEvent (&event)) { /* Loop until there are no events left on + * the queue */ + switch (event.type) { /* Process the appropiate event type */ + case SDL_QUIT: + { + fini = 1; + disable = TRUE; + } + break; + + case SDL_ACTIVEEVENT: + if (event.active.state & SDL_APPACTIVE) + sdlGoom.active = event.active.gain; + break; + + case SDL_KEYDOWN: /* Handle a KEYDOWN event */ + if (event.key.keysym.sym == SDLK_TAB) { + SDL_WM_ToggleFullScreen (surface); + is_fs = !is_fs; + } + + if (event.key.keysym.sym == SDLK_q) { + fini = 1; + } + /* + * TODO : GERER TOUT CA AVEC XMMS REMOTE CTRL ? ou le pipe * + if (event.key.keysym.sym == SDLK_q) { + xmms_remote_quit (jeko_vp.xmms_session); + } + + if (event.key.keysym.sym == SDLK_x) + xmms_remote_play (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_c) + xmms_remote_pause (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_v) + xmms_remote_stop (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_b) + xmms_remote_playlist_next (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_z) + xmms_remote_playlist_prev (jeko_vp.xmms_session); + */ + + if (event.key.keysym.sym == SDLK_f) { + BVAL(sdlGoom.display_fps) = !BVAL(sdlGoom.display_fps); + sdlGoom.display_fps.change_listener(&sdlGoom.display_fps); + } + + if ((event.key.keysym.sym == SDLK_KP_PLUS) && (resoli+10)) { + resoli = resoli-1; + resize_win (resolx[resoli],resoly[resoli],FALSE); + } + + if (event.key.keysym.sym == SDLK_KP_MULTIPLY) { + title = sdl_goom_set_doublepix (!doublepix); + } + if (event.key.keysym.sym == SDLK_ESCAPE) { + if (is_fs) { + SDL_WM_ToggleFullScreen (surface); + is_fs = !is_fs; + } + else if (sdlGoom.config_win == 0) { + sdlGoom.config_win = create_config_window (); + gtk_data_init (&sdlGoom); + gtk_widget_show (sdlGoom.config_win); + message = ""; + } + else { + message = "Configuration Window is Already Open"; + } + } + if (event.key.keysym.sym == SDLK_SPACE) { + encore_nul = ENCORE_NUL_LOCK; + } + + if (event.key.keysym.sym == SDLK_F1) + forceMode = 1; + if (event.key.keysym.sym == SDLK_F2) + forceMode = 2; + if (event.key.keysym.sym == SDLK_F3) + forceMode = 3; + if (event.key.keysym.sym == SDLK_F4) + forceMode = 4; + if (event.key.keysym.sym == SDLK_F5) + forceMode = 5; + if (event.key.keysym.sym == SDLK_F6) + forceMode = 6; + if (event.key.keysym.sym == SDLK_F7) + forceMode = 7; + if (event.key.keysym.sym == SDLK_F8) + forceMode = 8; + if (event.key.keysym.sym == SDLK_F9) + forceMode = 9; + if (event.key.keysym.sym == SDLK_F10) + forceMode = 10; + + break; + case SDL_VIDEORESIZE: + resx = sdlGoom.screen_width = event.resize.w; + resy = sdlGoom.screen_height = event.resize.h; + sdlGoom.doublepix = doublepix; + { + static char s[512]; + sprintf (s,"%dx%d",resx,resy); + title = s; + set_list_param_value(&sdlGoom.screen_size, s); + sdlGoom.screen_size.change_listener (&sdlGoom.screen_size); + } + surface = SDL_SetVideoMode (resx, resy, 32, + SDL_RESIZABLE|SDL_SWSURFACE); + apply_double(); + goom_set_resolution (sdlGoom.plugin,resx, resy); + if (is_fs) + SDL_WM_ToggleFullScreen (surface); + break; + /* default: * Report an unhandled event */ + /* printf("I don't know what this event is!\n"); */ + } + } + + for (i=0;i<512;i++) + if (data[0][i]>2) { + if (encore_nul > ENCORE_NUL_LOCK) + encore_nul = 0; + break; + } + + if ((i == 512) && (!encore_nul)) + encore_nul = ENCORE_NUL_LOCK + 100; + + if (encore_nul == ENCORE_NUL_LOCK) { + message = msg_tab[msg_pos]; + msg_pos ++; + msg_pos %= 4; + } + + if (encore_nul) + encore_nul --; + + if (!sdlGoom.active) { + return; + } + + /* + * TODO: + * if (pos != spos) { + * title = xmms_remote_get_playlist_title (jeko_vp.xmms_session, pos); + * spos = pos; + * } + */ + +#ifdef BENCHMARK_X86 + t0 = GetTick(); +#endif + if (doublepix == 0) + goom_set_screenbuffer(sdlGoom.plugin, surface->pixels); + + buf = goom_update (sdlGoom.plugin, data, forceMode, + BVAL(sdlGoom.display_fps)?framerate_tester_getvalue ():-1, + title, message); + +#ifdef BENCHMARK_X86 + t1 = GetTick(); +#endif + + if (doublepix == 2) { + gsurf.buf = buf; + sdl_pixel_doubler (&gsurf,surface); + } else if (doublepix == 1) { + SDL_Rect rect; + gsurf.buf = buf; + pixel_doubler (&gsurf,gsurf2); + tmpsurf = + SDL_CreateRGBSurfaceFrom (gsurf2->buf, resx*2, resy*2, + 32, resx*8, + 0x00ff0000, 0x0000ff00, 0x000000ff, + 0x00000000); + rect.x = doubledec; + rect.y = 0; + rect.w = resx * 2; + rect.h = resy * 2; + SDL_BlitSurface (tmpsurf, NULL, surface, &rect); + SDL_FreeSurface (tmpsurf); + } + else { +/* tmpsurf = + SDL_CreateRGBSurfaceFrom (buf, resx, resy, 32, resx * 4, + 0x00ff0000, 0x0000ff00, 0x000000ff, + 0x00000000); + SDL_BlitSurface (tmpsurf, NULL, surface, NULL); + SDL_FreeSurface (tmpsurf); + SDL_LockSurface(surface); + memcpy(surface->pixels, buf, resx * resy * 4); + SDL_UnlockSurface(surface); +*/ + } + SDL_Flip (surface); +#ifdef BENCHMARK_X86 + t2 = GetTick(); + + t2 -= t1; + t1 -= t0; + { + double ft1, ft2; + static double min_t1 = 1000.0, + min_t2 = 1000.0; + static double moy_t1 = 150.0; + static double moy_t2 = 40.0; + + ft1 = (double)(t1 / sdlGoom.plugin->screen.size); + ft2 = (double)(t2 / sdlGoom.plugin->screen.size); + + if (ft1 < min_t1) + min_t1 = ft1; + if (ft2 < min_t2) + min_t2 = ft2; + + moy_t1 = ((moy_t1 * 15.0) + ft1) / 16.0; + moy_t2 = ((moy_t2 * 15.0) + ft2) / 16.0; + printf("UPDATE = %4.0f/%3.0f CPP ", moy_t1, min_t1); + printf("DISPLAY = %4.0f/%3.0f CPP\n", moy_t2, min_t2); + } +#endif + + framerate_tester_newframe (); +} + + +char *sdl_goom_set_doublepix (int dp) { + if (doublepix && dp) return " "; + if (!doublepix && !dp) return " "; + + doublepix = dp; + BVAL(sdlGoom.pix_double) = dp; + sdlGoom.pix_double.change_listener(&sdlGoom.pix_double); + if (doublepix) + return resize_win (resx,resy,TRUE); + else + return resize_win (resx*2,resy*2,TRUE); +} + +void sdl_goom_set_fps (int fps) { + MAX_FRAMERATE = fps; + INTERPIX = 1000.0 / MAX_FRAMERATE; +} + +void pix_double_changed (PluginParam *p) { + sdl_goom_set_doublepix (BVAL(*p)); +} + +void screen_size_changed (PluginParam *p) { + int i; + static struct Resol { char*name; int x; int y; } res[4] = { + {"320x240", 320, 240}, + {"400x300", 400, 300}, + {"640x480", 640, 480}, + {"800x600", 800, 600}}; + + for (i=4;i--;) { + if (!strcmp(LVAL(*p),res[i].name)) + resize_win (res[i].x,res[i].y,FALSE); + } +} + +void fps_limit_changed (PluginParam *p) { + MAX_FRAMERATE = IVAL(*p); + INTERPIX = 1000.0 / MAX_FRAMERATE; +} + +void hide_cursor_changed (PluginParam *p) { + SDL_ShowCursor(!BVAL(*p)); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,30 @@ +#ifndef _SDL_GOOM_H +#define _SDL_GOOM_H + +#include +#include "goom_config_param.h" +#include "goom_plugin_info.h" + +typedef struct _SDL_GOOM { + GtkWidget *config_win; + + int screen_width; + int screen_height; + int doublepix; + int active; + + PluginInfo *plugin; /* infos about the plugin (see plugin_info.h) */ + + PluginParameters screen; /* contains screen_size, pix_double, fps_limit */ + + PluginParam screen_size; + PluginParam pix_double; + PluginParam fps_limit; + PluginParam display_fps; + PluginParam hide_cursor; + +} SdlGoom; + +void gtk_data_init(SdlGoom *sdlGoom); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,51 @@ +#include "pixeldoubler.h" +#include +#include +#include + +void sdl_pixel_doubler (Surface *src, SDL_Surface *dest) { + register int *d; // pointeur sur le pixel courant a marquer + register int *s; // pointeur sur le pixel coutant en cours de lecture + int sw; // nombre d'octet de largeur de ligne de la surface source + int sw2,swd; + int fd; // adresse de la fin du buffer destination + int fin; // adresse de fin d'une ligne du buffer source + + SDL_LockSurface (dest); + + d = dest->pixels; + s = src->buf; + + sw = src->width << 2; + sw2 = dest->pitch; + swd = sw2 - sw * 2; + + fin = (int)s; + fd = (int)d + (sw2 * src->height * 2); + + // tant que tout le buffer source n'est pas remplit + while ((int)d < fd) { + + // passer a la ligne suivante du buffer source + fin += sw; + + // l'afficher sur une ligne du buffer destination + while ((int)s < fin) { + register int col = *(s++); + // 2 affichage par point du buffer source (doubling horizontal) + *(d++) = col; *(d++) = col; + } + d = (int*)((char*)d + swd); + + // puis l'afficher sur une autre ligne (doubling vertical) + memcpy (d, ((char*)d) - sw2, sw2); +/* s = (int*)((int)s - sw); // retour au debut de la ligne src + while ((int)s < fin) { + register int col = *(s++); + *(d++) = col; *(d++) = col; // idem (cf plus haut) + } */ + d = (int*)((char*)d + sw2); + } + + SDL_UnlockSurface (dest); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2 @@ +#include +void sdl_pixel_doubler (Surface *src, SDL_Surface *dest); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/surface.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/surface.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/surface.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/surface.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ +#include "surface.h" +#include + +Surface * surface_new (int w, int h) { + Surface * s = (Surface*)malloc(sizeof(Surface)); + s->realstart = (int*)malloc(w*h*4 + 128); + s->buf = (int*)((int)s->realstart + 128 - (((int)s->realstart) % 128)); + s->size = w*h; + s->width = w; + s->height = h; + return s; +} + +void surface_delete (Surface **s) { + free ((*s)->realstart); + free (*s); + *s = NULL; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/surface.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/surface.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/surface.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/surface.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,16 @@ +#ifndef _SURFACE_H +#define _SURFACE_H + +typedef struct { + int * buf; + int width; + int height; + int size; + + int * realstart; +} Surface; + +Surface * surface_new (int w, int h) ; +void surface_delete (Surface **s) ; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/config_param.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/config_param.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/config_param.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/config_param.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,110 @@ +/*---------------------------------------------------------------------------*/ +/* +** config_param.c +** Goom Project +** +** Created by Jean-Christophe Hoelt on Sat Jul 19 2003 +** Copyright (c) 2003 iOS. All rights reserved. +*/ +/*---------------------------------------------------------------------------*/ + +#include "goom_config_param.h" +#include + +/* TODO: Ajouter goom_ devant ces fonctions */ + +static void empty_fct(PluginParam *dummy) { +} + +PluginParam goom_secure_param() { + PluginParam p; + p.changed = empty_fct; + p.change_listener = empty_fct; + p.user_data = 0; + p.name = p.desc = 0; + p.rw = 1; + return p; +} + +PluginParam goom_secure_f_param(char *name) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_FLOATVAL; + FVAL(p) = 0.5f; + FMIN(p) = 0.0f; + FMAX(p) = 1.0f; + FSTEP(p) = 0.01f; + return p; +} + +PluginParam goom_secure_f_feedback(char *name) { + PluginParam p = secure_f_param(name); + p.rw = 0; + return p; +} + +PluginParam goom_secure_s_param(char *name) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_STRVAL; + SVAL(p) = 0; + return p; +} + +PluginParam goom_secure_b_param(char *name, int value) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_BOOLVAL; + BVAL(p) = value; + return p; +} + +PluginParam goom_secure_i_param(char *name) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_INTVAL; + IVAL(p) = 50; + IMIN(p) = 0; + IMAX(p) = 100; + ISTEP(p) = 1; + return p; +} + +PluginParam goom_secure_i_feedback(char *name) { + PluginParam p = secure_i_param(name); + p.rw = 0; + return p; +} + +PluginParameters goom_plugin_parameters(const char *name, int nb) { + PluginParameters p; + p.name = (char *)name; + p.desc = ""; + p.nbParams = nb; + p.params = (PluginParam**)malloc(nb*sizeof(PluginParam*)); + return p; +} + +/*---------------------------------------------------------------------------*/ + +void goom_set_str_param_value(PluginParam *p, const char *str) { + int len = strlen(str); + if (SVAL(*p)) + SVAL(*p) = (char*)realloc(SVAL(*p), len+1); + else + SVAL(*p) = (char*)malloc(len+1); + memcpy(SVAL(*p), str, len+1); +} + +void goom_set_list_param_value(PluginParam *p, const char *str) { + int len = strlen(str); +#ifdef VERBOSE + printf("%s: %d\n", str, len); +#endif + if (LVAL(*p)) + LVAL(*p) = (char*)realloc(LVAL(*p), len+1); + else + LVAL(*p) = (char*)malloc(len+1); + memcpy(LVAL(*p), str, len+1); +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/convolve_fx.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/convolve_fx.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/convolve_fx.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/convolve_fx.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,336 @@ +#include "goom_fx.h" +#include "goom_plugin_info.h" +#include "goomsl.h" +#include "goom_config.h" +#include +#include +#include +#include + +//#define CONV_MOTIF_W 32 +//#define CONV_MOTIF_WMASK 0x1f + +#define CONV_MOTIF_W 128 +#define CONV_MOTIF_WMASK 0x7f + +typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; + +#include "motif_goom1.h" +#include "motif_goom2.h" + +#define NB_THETA 512 + +#define MAX 2.0f + +typedef struct _CONV_DATA{ + PluginParam light; + PluginParam factor_adj_p; + PluginParam factor_p; + PluginParameters params; + + GoomSL *script; + + /* rotozoom */ + int theta; + float ftheta; + int h_sin[NB_THETA]; + int h_cos[NB_THETA]; + int h_height; + float visibility; + Motif conv_motif; + int inverse_motif; + +} ConvData; + +/* init rotozoom tables */ +static void compute_tables(VisualFX *_this, PluginInfo *info) +{ + ConvData *data = (ConvData*)_this->fx_data; + double screen_coef; + int i; + double h; + double radian; + + if (data->h_height == info->screen.height) return; + + screen_coef = 2.0 * 300.0 / (double)info->screen.height; + data->h_height = info->screen.height; + + for ( i=0 ; ih_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); + data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); + } +} + +static void set_motif(ConvData *data, Motif motif) +{ + int i,j; + for (i=0;iconv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +} + +static void convolve_init(VisualFX *_this, PluginInfo *info) { + ConvData *data; + data = (ConvData*)malloc(sizeof(ConvData)); + _this->fx_data = (void*)data; + + data->light = secure_f_param("Screen Brightness"); + data->light.param.fval.max = 300.0f; + data->light.param.fval.step = 1.0f; + data->light.param.fval.value = 100.0f; + + data->factor_adj_p = secure_f_param("Flash Intensity"); + data->factor_adj_p.param.fval.max = 200.0f; + data->factor_adj_p.param.fval.step = 1.0f; + data->factor_adj_p.param.fval.value = 70.0f; + + data->factor_p = secure_f_feedback("Factor"); + + data->params = plugin_parameters ("Bright Flash", 5); + data->params.params[0] = &data->light; + data->params.params[1] = &data->factor_adj_p; + data->params.params[2] = 0; + data->params.params[3] = &data->factor_p; + data->params.params[4] = 0; + + /* init rotozoom tables */ + compute_tables(_this, info); + data->theta = 0; + data->ftheta = 0.0; + data->visibility = 1.0; + set_motif(data, CONV_MOTIF2); + data->inverse_motif = 0; + + _this->params = &data->params; +} + +static void convolve_free(VisualFX *_this) { + ConvData *data = _this->fx_data; + free (data->params.params); + free (data); +} + +static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, + PluginInfo *info, int iff) +{ + ConvData *data = (ConvData*)_this->fx_data; + + int x,y; + int i = 0;//info->screen.height * info->screen.width - 1; + + const int c = data->h_cos [data->theta]; + const int s = data->h_sin [data->theta]; + + const int xi = -(info->screen.width/2) * c; + const int yi = (info->screen.width/2) * s; + + const int xj = -(info->screen.height/2) * s; + const int yj = -(info->screen.height/2) * c; + + int xprime = xj; + int yprime = yj; + + int ifftab[16]; + if (data->inverse_motif) { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); + } + else { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); + } + + for (y=info->screen.height;y--;) { + int xtex,ytex; + + xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; + xprime += s; + + ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; + yprime += c; + +#ifdef HAVE_MMX + __asm__ __volatile__ + ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ + "\n\t movd %[xtex], %%mm2" + "\n\t movd %[ytex], %%mm3" + "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ + "\n\t movd %[c], %%mm4" + "\n\t movd %[s], %%mm6" + "\n\t pxor %%mm5, %%mm5" + "\n\t psubd %%mm6, %%mm5" + "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ + "\n\t movd %[motif], %%mm6" /* mm6 = motif */ + + ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) + , [c]"g"(c), [s]"g"(s) + , [motif] "g"(&data->conv_motif[0][0])); + + for (x=info->screen.width;x--;) + { + __asm__ __volatile__ + ( + "\n\t movd %[src], %%mm0" /* mm0 = src */ + "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ + "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ + "\n\t movq %%mm2, %%mm3" + "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ + "\n\t movd %%mm3, %%eax" /* eax = xtex' */ + + "\n\t psrlq $25, %%mm3" + "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ + + "\n\t andl $127, %%eax" + "\n\t andl $16256, %%ecx" + + "\n\t addl %%ecx, %%eax" + "\n\t movd %%mm6, %%esi" /* esi = motif */ + "\n\t xorl %%ecx, %%ecx" + "\n\t movb (%%eax,%%esi), %%cl" + + "\n\t movl %[ifftab], %%eax" + "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ + "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ + + "\n\t punpcklwd %%mm1, %%mm1" + "\n\t punpcklbw %%mm7, %%mm0" + "\n\t punpckldq %%mm1, %%mm1" + "\n\t psrlw $1, %%mm0" + "\n\t psrlw $2, %%mm1" + "\n\t pmullw %%mm1, %%mm0" + "\n\t psrlw $5, %%mm0" + "\n\t packuswb %%mm7, %%mm0" + "\n\t movd %%mm0, %[dest]" + : [dest] "=g" (dest[i].val) + : [src] "g" (src[i].val) + , [ifftab]"g"(&ifftab[0]) + : "eax","ecx"); + + i++; + } +#else + for (x=info->screen.width;x--;) { + + int iff2; + unsigned int f0,f1,f2,f3; + + xtex += c; + ytex -= s; + + iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; + +#define sat(a) ((a)>0xFF?0xFF:(a)) + f0 = src[i].val; + f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; + f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; + f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; + dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +/* + f0 = (src[i].cop[0] * iff2) >> 8; + f1 = (src[i].cop[1] * iff2) >> 8; + f2 = (src[i].cop[2] * iff2) >> 8; + f3 = (src[i].cop[3] * iff2) >> 8; + + dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; + dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; + dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; + dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +*/ + i++; + } +#endif + } +#ifdef HAVE_MMX + __asm__ __volatile__ ("\n\t emms"); +#endif + + compute_tables(_this, info); +} + + +/*#include + +static uint64_t GetTick() +{ + uint64_t x; + asm volatile ("RDTSC" : "=A" (x)); + return x; +}*/ + + +static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { + + ConvData *data = (ConvData*)_this->fx_data; + float ff; + int iff; + + ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; + iff = (unsigned int)(ff * 256); + + { + double fcycle = (double)info->cycle; + double rotate_param, rotate_coef; + float INCREASE_RATE = 1.5; + float DECAY_RATE = 0.955; + if (FVAL(info->sound.last_goom_p) > 0.8) + FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; + FVAL(data->factor_p) *= DECAY_RATE; + + rotate_param = FVAL(info->sound.last_goom_p); + if (rotate_param < 0.0) + rotate_param = 0.0; + rotate_param += FVAL(info->sound.goom_power_p); + + rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; + data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); + data->theta = ((unsigned int)data->ftheta) % NB_THETA; + data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; + if (data->visibility < 0.0) data->visibility = 0.0; + data->factor_p.change_listener(&data->factor_p); + } + + if (data->visibility < 0.01) { + switch (goom_irand(info->gRandom, 300)) + { + case 1: + set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; + case 2: + set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; + } + } + + if ((ff > 0.98f) && (ff < 1.02f)) + memcpy(dest, src, info->screen.size * sizeof(Pixel)); + else + create_output_with_brightness(_this,src,dest,info,iff); +/* +// Benching suite... + { + uint64_t before, after; + double timed; + static double stimed = 10000.0; + before = GetTick(); + data->visibility = 1.0; + create_output_with_brightness(_this,src,dest,info,iff); + after = GetTick(); + timed = (double)((after-before) / info->screen.size); + if (timed < stimed) { + stimed = timed; + printf ("CLK = %3.0f CPP\n", stimed); + } + } +*/ +} + +VisualFX convolve_create(void) { + VisualFX vfx; + vfx.init = convolve_init; + vfx.free = convolve_free; + vfx.apply = convolve_apply; + vfx.fx_data = 0; + return vfx; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,333 @@ +#include "goom_fx.h" +#include "goom_plugin_info.h" +#include "goomsl.h" +#include "goom_config.h" +#include +#include +#include +#include + +//#define CONV_MOTIF_W 32 +//#define CONV_MOTIF_WMASK 0x1f + +#define CONV_MOTIF_W 128 +#define CONV_MOTIF_WMASK 0x7f + +typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; + +#include "motif_goom1.h" +#include "motif_goom2.h" + +#define NB_THETA 512 + +#define MAX 2.0f + +typedef struct _CONV_DATA{ + PluginParam light; + PluginParam factor_adj_p; + PluginParam factor_p; + PluginParameters params; + + GoomSL *script; + + /* rotozoom */ + int theta; + float ftheta; + int h_sin[NB_THETA]; + int h_cos[NB_THETA]; + int h_height; + float visibility; + Motif conv_motif; + int inverse_motif; + +} ConvData; + +/* init rotozoom tables */ +static void compute_tables(VisualFX *_this, PluginInfo *info) +{ + ConvData *data = (ConvData*)_this->fx_data; + double screen_coef; + int i; + double h; + double radian; + + if (data->h_height == info->screen.height) return; + + screen_coef = 2.0 * 300.0 / (double)info->screen.height; + data->h_height = info->screen.height; + + for ( i=0 ; ih_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); + data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); + } +} + +static void set_motif(ConvData *data, Motif motif) +{ + int i,j; + for (i=0;iconv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +} + +static void convolve_init(VisualFX *_this, PluginInfo *info) { + ConvData *data; + data = (ConvData*)malloc(sizeof(ConvData)); + _this->fx_data = (void*)data; + + data->light = secure_f_param("Screen Brightness"); + data->light.param.fval.max = 300.0f; + data->light.param.fval.step = 1.0f; + data->light.param.fval.value = 100.0f; + + data->factor_adj_p = secure_f_param("Flash Intensity"); + data->factor_adj_p.param.fval.max = 200.0f; + data->factor_adj_p.param.fval.step = 1.0f; + data->factor_adj_p.param.fval.value = 70.0f; + + data->factor_p = secure_f_feedback("Factor"); + + data->params = plugin_parameters ("Bright Flash", 5); + data->params.params[0] = &data->light; + data->params.params[1] = &data->factor_adj_p; + data->params.params[2] = 0; + data->params.params[3] = &data->factor_p; + data->params.params[4] = 0; + + /* init rotozoom tables */ + compute_tables(_this, info); + data->theta = 0; + data->ftheta = 0.0; + data->visibility = 1.0; + set_motif(data, CONV_MOTIF2); + data->inverse_motif = 0; + + _this->params = &data->params; +} + +static void convolve_free(VisualFX *_this) { + free (_this->fx_data); +} + +static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, + PluginInfo *info, int iff) +{ + ConvData *data = (ConvData*)_this->fx_data; + + int x,y; + int i = 0;//info->screen.height * info->screen.width - 1; + + const int c = data->h_cos [data->theta]; + const int s = data->h_sin [data->theta]; + + const int xi = -(info->screen.width/2) * c; + const int yi = (info->screen.width/2) * s; + + const int xj = -(info->screen.height/2) * s; + const int yj = -(info->screen.height/2) * c; + + int xprime = xj; + int yprime = yj; + + int ifftab[16]; + if (data->inverse_motif) { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); + } + else { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); + } + + for (y=info->screen.height;y--;) { + int xtex,ytex; + + xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; + xprime += s; + + ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; + yprime += c; + +#ifdef HAVE_MMX + __asm__ __volatile__ + ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ + "\n\t movd %[xtex], %%mm2" + "\n\t movd %[ytex], %%mm3" + "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ + "\n\t movd %[c], %%mm4" + "\n\t movd %[s], %%mm6" + "\n\t pxor %%mm5, %%mm5" + "\n\t psubd %%mm6, %%mm5" + "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ + "\n\t movd %[motif], %%mm6" /* mm6 = motif */ + + ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) + , [c]"g"(c), [s]"g"(s) + , [motif] "g"(&data->conv_motif[0][0])); + + for (x=info->screen.width;x--;) + { + __asm__ __volatile__ + ( + "\n\t movd %[src], %%mm0" /* mm0 = src */ + "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ + "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ + "\n\t movq %%mm2, %%mm3" + "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ + "\n\t movd %%mm3, %%eax" /* eax = xtex' */ + + "\n\t psrlq $25, %%mm3" + "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ + + "\n\t andl $127, %%eax" + "\n\t andl $16256, %%ecx" + + "\n\t addl %%ecx, %%eax" + "\n\t movd %%mm6, %%esi" /* esi = motif */ + "\n\t xorl %%ecx, %%ecx" + "\n\t movb (%%eax,%%esi), %%cl" + + "\n\t movl %[ifftab], %%eax" + "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ + "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ + + "\n\t punpcklwd %%mm1, %%mm1" + "\n\t punpcklbw %%mm7, %%mm0" + "\n\t punpckldq %%mm1, %%mm1" + "\n\t psrlw $1, %%mm0" + "\n\t psrlw $1, %%mm1" + "\n\t pmullw %%mm1, %%mm0" + "\n\t psrlw $6, %%mm0" + "\n\t packuswb %%mm7, %%mm0" + "\n\t movd %%mm0, %[dest]" + : [dest] "=g" (dest[i].val) + : [src] "g" (src[i].val) + , [ifftab]"g"(&ifftab[0]) + : "eax","ecx"); + + i++; + } +#else + for (x=info->screen.width;x--;) { + + int iff2; + unsigned int f0,f1,f2,f3; + + xtex += c; + ytex -= s; + + iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; + +#define sat(a) ((a)>0xFF?0xFF:(a)) + f0 = src[i].val; + f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; + f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; + f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; + dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +/* + f0 = (src[i].cop[0] * iff2) >> 8; + f1 = (src[i].cop[1] * iff2) >> 8; + f2 = (src[i].cop[2] * iff2) >> 8; + f3 = (src[i].cop[3] * iff2) >> 8; + + dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; + dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; + dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; + dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +*/ + i++; + } +#endif + } + __asm__ __volatile__ ("\n\t emms"); + + compute_tables(_this, info); +} + +/* +#include + +static uint64_t GetTick() +{ + uint64_t x; + asm volatile ("RDTSC" : "=A" (x)); + return x; +} +*/ + +static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { + + ConvData *data = (ConvData*)_this->fx_data; + float ff; + int iff; + + ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; + iff = (unsigned int)(ff * 256); + + { + double fcycle = (double)info->cycle; + double rotate_param, rotate_coef; + float INCREASE_RATE = 1.5; + float DECAY_RATE = 0.955; + if (FVAL(info->sound.last_goom_p) > 0.8) + FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; + FVAL(data->factor_p) *= DECAY_RATE; + + rotate_param = FVAL(info->sound.last_goom_p); + if (rotate_param < 0.0) + rotate_param = 0.0; + rotate_param += FVAL(info->sound.goom_power_p); + + rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; + data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); + data->theta = ((unsigned int)data->ftheta) % NB_THETA; + data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; + if (data->visibility < 0.0) data->visibility = 0.0; + data->factor_p.change_listener(&data->factor_p); + } + + if (data->visibility < 0.01) { + switch (goom_irand(info->gRandom, 300)) + { + case 1: + set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; + case 2: + set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; + } + } + + if ((ff > 0.96f) && (ff < 1.04f)) + memcpy(dest, src, info->screen.size * sizeof(Pixel)); + else + create_output_with_brightness(_this,src,dest,info,iff); +/* + Benching suite... + { + uint64_t before, after; + double timed; + static double stimed = 10000.0; + before = GetTick(); + data->visibility = 1.0; + create_output_with_brightness(_this,src,dest,info,iff); + after = GetTick(); + timed = (double)((after-before) / info->screen.size); + if (timed < stimed) { + stimed = timed; + printf ("CLK = %3.0f CPP\n", stimed); + } + } +*/ +} + +VisualFX convolve_create(void) { + VisualFX vfx = { + init: convolve_init, + free: convolve_free, + apply: convolve_apply, + fx_data: 0 + }; + return vfx; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/cpu_info.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/cpu_info.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/cpu_info.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/cpu_info.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,71 @@ +/* + * cpu_info.c + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +#include "cpu_info.h" + +#ifdef CPU_X86 +#include "mmx.h" +#endif + +#ifdef CPU_POWERPC +#include +#include +#endif + +static unsigned int CPU_FLAVOUR = 0; +static unsigned int CPU_NUMBER = 1; +static unsigned int CPU_DETECTED = 0; + +static void autoset_cpu_info (void) +{ + CPU_DETECTED = 1; + +#ifdef CPU_POWERPC + int result; + size_t size; + + result = 0; + size = 4; + if (sysctlbyname("hw.optional.altivec",&result,&size,NULL,NULL) == 0) + { + if (result != 0) CPU_FLAVOUR |= CPU_OPTION_ALTIVEC; + } + + result = 0; + size = 4; + if (sysctlbyname("hw.optional.64bitops",&result,&size,NULL,NULL) == 0) + { + if (result != 0) CPU_FLAVOUR |= CPU_OPTION_64_BITS; + } + + result = 0; + size = 4; + if (sysctlbyname("hw.ncpu",&result,&size,NULL,NULL) == 0) + { + if (result != 0) CPU_NUMBER = result; + } +#endif /* CPU_POWERPC */ + +#ifdef CPU_X86 + if (mmx_supported()) CPU_FLAVOUR |= CPU_OPTION_MMX; + if (xmmx_supported()) CPU_FLAVOUR |= CPU_OPTION_XMMX; +#endif /* CPU_X86 */ +} + +unsigned int cpu_flavour (void) +{ + if (CPU_DETECTED == 0) autoset_cpu_info(); + return CPU_FLAVOUR; +} + +unsigned int cpu_number (void) +{ + if (CPU_DETECTED == 0) autoset_cpu_info(); + return CPU_NUMBER; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/cpu_info.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/cpu_info.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/cpu_info.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/cpu_info.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,34 @@ +#ifndef CPU_INFO_H +#define CPU_INFO_H + +/* + * cpu_info.h + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +#ifdef HAVE_MMX +#ifndef CPU_X86 +#define CPU_X86 +#endif +#endif + +/* Returns the CPU flavour described with the constants below */ +unsigned int cpu_flavour (void); + +#define CPU_OPTION_ALTIVEC 0x1 +#define CPU_OPTION_64_BITS 0x2 +#define CPU_OPTION_MMX 0x4 +#define CPU_OPTION_XMMX 0x8 +#define CPU_OPTION_SSE 0x10 +#define CPU_OPTION_SSE2 0x20 +#define CPU_OPTION_3DNOW 0x40 + + +/* Returns the CPU number */ +unsigned int cpu_number (void); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/default_script.goom kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/default_script.goom --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/default_script.goom 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/default_script.goom 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,34 @@ +/* + * specify here high-level properties of a flash. + */ + +flash_occurs when (Sound.Goom_Detection > 50%) and (Sound.Sound_Speed > 14%); + +max_flash = 200%; +slow_down_coef = 96%; + +/* + * Here you have the fx's state machin behaviour. + */ + +(locked) ? locked--; + +(not locked) and (flash_occurs) ? +{ + cur_power = Sound_Speed.Goom_Detection; + start flashing_up; +} + +(not locked) and (flashing_up) ? +{ + factor += cur_power * 2 * (speedvar / 4 + 0.95); + if (factor > max_flash) factor = max_flash; + + (not flash_occurs) ? + { + locked = 200; + stop flashing_up; + } +} + +factor *= slow_down_coef; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/default_scripts.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/default_scripts.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/default_scripts.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/default_scripts.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,6 @@ +#ifndef _DEFAULT_SCRIPTS_H +#define _DEFAULT_SCRIPTS_H + +#define GOOM_MAIN_SCRIPT "" + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/DOCODE.TXT kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/DOCODE.TXT --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/DOCODE.TXT 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/DOCODE.TXT 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,55 @@ +Les diffrentes donnes.. +----- + +typedef struct { + int32 * buf; + int32 width; + int32 height; + int32 size; + + int32 * realstart; +} Surface; +----- + +>> taille du buffer de zoom +guint32 mmx_zoom_size; +----- + +>> les buffers bruts contiennent les px et py de chaque point +>> => brutS[0] = px0, brutS[1] = py0, brutS[2] = px1, [...] + +signed int *brutS = 0, *freebrutS = 0; // source +signed int *brutD = 0, *freebrutD = 0; // dest +signed int *brutT = 0, *freebrutT = 0; // temp (en cours de gnration) + +>> pointeur vers p1 +guint32 *expix1 = 0; +>> pointeur vers p2 +guint32 *expix2 = 0; + +>> largeur d'une ligne = prevX +guint32 zoom_width; + +>> largeur et hauteur des differents buffers. +int prevX=0,prevY=0; +----- + +>> buffratio est un fixpoint : 16,16 +>> valeur normalement comprise entre 0 et 1, +>> soit 0<=buffratio<=BUFFPOINTMASK + +int buffratio = 0; + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff +----- + +#define sqrtperte 16 +>> faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +>> faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 +----- + +int precalCoef[16][16]; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/drawmethods.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/drawmethods.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/drawmethods.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/drawmethods.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,203 @@ +#include "drawmethods.h" + +#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \ +{\ + int tra=0,i=0;\ + unsigned char *bra = (unsigned char*)&(_backbuf);\ + unsigned char *dra = (unsigned char*)&(_out);\ + unsigned char *cra = (unsigned char*)&(_col);\ + for (;i<4;i++) {\ + tra = *cra;\ + tra += *bra;\ + if (tra>255) tra=255;\ + *dra = tra;\ + ++dra;++cra;++bra;\ + }\ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col) + +void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return; + + /* clip to top edge + if ((y1 < 0) && (y2 < 0)) + return; + + if (y1 < 0) { + x1 += (y1 * (x1 - x2)) / (y2 - y1); + y1 = 0; + } + if (y2 < 0) { + x2 += (y2 * (x1 - x2)) / (y2 - y1); + y2 = 0; + } + + clip to bottom edge + if ((y1 >= screeny) && (y2 >= screeny)) + return; + if (y1 >= screeny) { + x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1); + y1 = screeny - 1; + } + if (y2 >= screeny) { + x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1); + y2 = screeny - 1; + } + clip to left edge + if ((x1 < 0) && (x2 < 0)) + return; + if (x1 < 0) { + y1 += (x1 * (y1 - y2)) / (x2 - x1); + x1 = 0; + } + if (x2 < 0) { + y2 += (x2 * (y1 - y2)) / (x2 - x1); + x2 = 0; + } + clip to right edge + if ((x1 >= screenx) && (x2 >= screenx)) + return; + if (x1 >= screenx) { + y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1); + x1 = screenx - 1; + } + if (x2 >= screenx) { + y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1); + x2 = screenx - 1; + } + */ + + dx = x2 - x1; + dy = y2 - y1; + if (x1 > x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } + else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + return; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + return; + } + else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + return; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + return; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + return; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + return; + } + } +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/drawmethods.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/drawmethods.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/drawmethods.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/drawmethods.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,9 @@ +#ifndef _DRAWMETHODS_H +#define _DRAWMETHODS_H + +#include "goom_config.h" +#include "goom_graphic.h" + +void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); + +#endif /* _DRAWMETHODS_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filters.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filters.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filters.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filters.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,773 @@ +// --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY --- + +/* filter.c version 0.7 +* contient les filtres applicable a un buffer +* creation : 01/10/2000 +* -ajout de sinFilter() +* -ajout de zoomFilter() +* -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs +* -optimisation de sinFilter (utilisant une table de sin) +* -asm +* -optimisation de la procedure de generation du buffer de transformation +* la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] +*/ + +/* #define _DEBUG_PIXEL */ + +#include +#include +#include +#include +#include + +#include "goom_filters.h" +#include "goom_graphic.h" +#include "goom_tools.h" +#include "goom_plugin_info.h" +#include "goom_fx.h" +#include "v3d.h" + +/* TODO : MOVE THIS AWAY !!! */ +/* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */ +static inline void setPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color c) +{ + Pixel i; + + i.channels.b = c.b; + i.channels.g = c.v; + i.channels.r = c.r; + *(buffer + (x + y * goomInfo->screen.width)) = i; +} + +static inline void setPixelRGB_ (Pixel *buffer, Uint x, Color c) +{ + buffer[x].channels.r = c.r; + buffer[x].channels.g = c.v; + buffer[x].channels.b = c.b; +} + +static inline void getPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color * c) +{ + Pixel i = *(buffer + (x + y * goomInfo->screen.width)); + c->b = i.channels.b; + c->v = i.channels.g; + c->r = i.channels.r; +} + +static inline void getPixelRGB_ (Pixel *buffer, Uint x, Color * c) +{ + Pixel i = *(buffer + x); + c->b = i.channels.b; + c->v = i.channels.g; + c->r = i.channels.r; +} +/* END TODO */ + + +/* DEPRECATED */ +// retourne x>>s , en testant le signe de x +//#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s))) +//#define EFFECT_DISTORS 4 +//#define EFFECT_DISTORS_SL 2 +//#define INTERLACE_ADD 9 +//#define INTERLACE_AND 0xf +/* END DEPRECATED */ + +#define BUFFPOINTNB 16 +#define BUFFPOINTNBF 16.0f +#define BUFFPOINTMASK 0xffff + +#define sqrtperte 16 +/* faire : a % sqrtperte <=> a & pertemask */ +#define PERTEMASK 0xf +/* faire : a / sqrtperte <=> a >> PERTEDEC */ +#define PERTEDEC 4 + +/* pure c version of the zoom filter */ +static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); + +/* simple wrapper to give it the same proto than the others */ +void zoom_filter_c (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) { + c_zoom(src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef); +} + +static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); + + +typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA { + + PluginParam enabled_bp; + PluginParameters params; + + unsigned int *coeffs, *freecoeffs; + + signed int *brutS, *freebrutS; /* source */ + signed int *brutD, *freebrutD; /* dest */ + signed int *brutT, *freebrutT; /* temp (en cours de generation) */ + + guint32 zoom_width; + + unsigned int prevX, prevY; + + float general_speed; + int reverse; /* reverse the speed */ + char theMode; + int waveEffect; + int hypercosEffect; + int vPlaneEffect; + int hPlaneEffect; + char noisify; + int middleX, middleY; + + int mustInitBuffers; + int interlace_start; + + /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ + int buffratio; + int *firedec; + + /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ + int precalCoef[BUFFPOINTNB][BUFFPOINTNB]; + + /** calculatePXandPY statics */ + int wave; + int wavesp; + +} ZoomFilterFXWrapperData; + + + + +static inline v2g zoomVector(ZoomFilterFXWrapperData *data, float X, float Y) +{ + v2g vecteur; + float vx, vy; + float sq_dist = X*X + Y*Y; + + /* sx = (X < 0.0f) ? -1.0f : 1.0f; + sy = (Y < 0.0f) ? -1.0f : 1.0f; + */ + float coefVitesse = (1.0f+ data->general_speed) / 50.0f; + + // Effects + + /* Centralized FX */ + + switch (data->theMode) { + case CRYSTAL_BALL_MODE: + coefVitesse -= (sq_dist-0.3f)/15.0f; + break; + case AMULETTE_MODE: + coefVitesse += sq_dist * 3.5f; + break; + case WAVE_MODE: + coefVitesse += sin(sq_dist*20.0f) / 100.0f; + break; + case SCRUNCH_MODE: + coefVitesse += sq_dist / 10.0f; + break; + //case HYPERCOS1_MODE: + break; + //case HYPERCOS2_MODE: + break; + //case YONLY_MODE: + break; + case SPEEDWAY_MODE: + coefVitesse *= 4.0f * Y; + break; + default: + break; + } + + if (coefVitesse < -2.01f) + coefVitesse = -2.01f; + if (coefVitesse > 2.01f) + coefVitesse = 2.01f; + + vx = coefVitesse * X; + vy = coefVitesse * Y; + + /* Amulette 2 */ + // vx = X * tan(dist); + // vy = Y * tan(dist); + + /* Rotate */ + //vx = (X+Y)*0.1; + //vy = (Y-X)*0.1; + + + // Effects adds-on + + /* Noise */ + if (data->noisify) + { + vx += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; + vy += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; + } + + /* Hypercos */ + if (data->hypercosEffect) + { + vx += sin(Y*10.0f)/120.0f; + vy += sin(X*10.0f)/120.0f; + } + + /* H Plane */ + if (data->hPlaneEffect) vx += Y * 0.0025f * data->hPlaneEffect; + + /* V Plane */ + if (data->vPlaneEffect) vy += X * 0.0025f * data->vPlaneEffect; + + /* TODO : Water Mode */ + // if (data->waveEffect) + + vecteur.x = vx; + vecteur.y = vy; + + return vecteur; +} + + +/* + * Makes a stripe of a transform buffer (brutT) + * + * The transform is (in order) : + * Translation (-data->middleX, -data->middleY) + * Homothetie (Center : 0,0 Coeff : 2/data->prevX) + */ +static void makeZoomBufferStripe(ZoomFilterFXWrapperData * data, int INTERLACE_INCR) +{ + // Position of the pixel to compute in pixmap coordinates + Uint x, y; + // Where (verticaly) to stop generating the buffer stripe + int maxEnd = (data->interlace_start + INTERLACE_INCR); + // Ratio from pixmap to normalized coordinates + float ratio = 2.0f/((float)data->prevX); + // Ratio from normalized to virtual pixmap coordinates + float inv_ratio = BUFFPOINTNBF/ratio; + float min = ratio/BUFFPOINTNBF; + // Y position of the pixel to compute in normalized coordinates + float Y = ((float)(data->interlace_start - data->middleY)) * ratio; + + maxEnd = data->prevY; + if (maxEnd > (data->interlace_start + INTERLACE_INCR)) + maxEnd = (data->interlace_start + INTERLACE_INCR); + + for (y = data->interlace_start; (y < data->prevY) && ((signed int)yprevX * 2; + float X = - ((float)data->middleX) * ratio; + for (x = 0; x < data->prevX; x++) + { + v2g vector = zoomVector (data, X, Y); + + /* Finish and avoid null displacement */ + if (fabs(vector.x) < min) vector.x = (vector.x < 0.0f) ? -min : min; + if (fabs(vector.y) < min) vector.y = (vector.y < 0.0f) ? -min : min; + + data->brutT[premul_y_prevX] = ((int)((X-vector.x)*inv_ratio)+((int)(data->middleX*BUFFPOINTNB))); + data->brutT[premul_y_prevX+1] = ((int)((Y-vector.y)*inv_ratio)+((int)(data->middleY*BUFFPOINTNB))); + premul_y_prevX += 2; + X += ratio; + } + Y += ratio; + } + data->interlace_start += INTERLACE_INCR; + if (y >= data->prevY-1) data->interlace_start = -1; +} + + +/* + * calculer px et py en fonction de x,y,middleX,middleY et theMode + * px et py indique la nouvelle position (en sqrtperte ieme de pixel) + * (valeur * 16) + + inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py) + { + if (data->theMode == WATER_MODE) { + int yy; + + yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10; + if (yy < 0) + yy = 0; + if (yy >= (signed int)goomInfo->screen.height) + yy = goomInfo->screen.height - 1; + + *px = (x << 4) + data->firedec[yy] + (data->wave / 10); + *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130); + + data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + if (data->wave < -10) + data->wavesp += 2; + if (data->wave > 10) + data->wavesp -= 2; + data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + if (data->wavesp > 100) + data->wavesp = (data->wavesp * 9) / 10; + } + else { + int dist = 0, vx9, vy9; + int vx, vy; + int ppx, ppy; + int fvitesse = data->vitesse << 4; + + if (data->noisify) { + x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); + y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); + } + vx = (x - data->middleX) << 9; + vy = (y - data->middleY) << 9; + + if (data->hPlaneEffect) + vx += data->hPlaneEffect * (y - data->middleY); + + if (data->vPlaneEffect) + vy += data->vPlaneEffect * (x - data->middleX); + + if (data->waveEffect) { + fvitesse *= + 1024 + + ShiftRight (goomInfo->sintable + [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6); + fvitesse /= 1024; + } + + if (data->hypercosEffect) { + vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); + vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); + } + + vx9 = ShiftRight (vx, 9); + vy9 = ShiftRight (vy, 9); + dist = vx9 * vx9 + vy9 * vy9; + + switch (data->theMode) { + case WAVE_MODE: + fvitesse *= + 1024 + + ShiftRight (goomInfo->sintable + [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6); + fvitesse>>=10; + break; + case CRYSTAL_BALL_MODE: + fvitesse += (dist >> (10-EFFECT_DISTORS_SL)); + break; + case AMULETTE_MODE: + fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL)); + break; + case SCRUNCH_MODE: + fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL)); + break; + case HYPERCOS1_MODE: + vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); + vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); + break; + case HYPERCOS2_MODE: + vx = + vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0); + vy = + vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0); + fvitesse = 128 << 4; + break; + case YONLY_MODE: + fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6); + fvitesse >>= 10; + break; + case SPEEDWAY_MODE: + fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL)); + break; + } + + if (fvitesse < -3024) + fvitesse = -3024; + + if (vx < 0) // pb avec decalage sur nb negatif + ppx = -(-(vx * fvitesse) >> 16); + // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile) + // * * * * * 9 = nb chiffre virgule de vx) + else + ppx = ((vx * fvitesse) >> 16); + + if (vy < 0) + ppy = -(-(vy * fvitesse) >> 16); + else + ppy = ((vy * fvitesse) >> 16); + + *px = (data->middleX << 4) + ppx; + *py = (data->middleY << 4) + ppy; + } + } + */ + + + +static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, + int buffratio, int precalCoef[16][16]) +{ + int myPos, myPos2; + Color couleur; + + unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; + + int bufsize = prevX * prevY * 2; + int bufwidth = prevX; + + expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; + + for (myPos = 0; myPos < bufsize; myPos += 2) { + Color col1, col2, col3, col4; + int c1, c2, c3, c4, px, py; + int pos; + int coeffs; + + int brutSmypos = brutS[myPos]; + + myPos2 = myPos + 1; + + px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB); + brutSmypos = brutS[myPos2]; + py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); + + if ((py >= ay) || (px >= ax)) { + pos = coeffs = 0; + } else { + pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); + /* coef en modulo 15 */ + coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; + } + getPixelRGB_ (expix1, pos, &col1); + getPixelRGB_ (expix1, pos + 1, &col2); + getPixelRGB_ (expix1, pos + bufwidth, &col3); + getPixelRGB_ (expix1, pos + bufwidth + 1, &col4); + + c1 = coeffs; + c2 = (c1 >> 8) & 0xFF; + c3 = (c1 >> 16) & 0xFF; + c4 = (c1 >> 24) & 0xFF; + c1 = c1 & 0xff; + + couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4; + if (couleur.r > 5) + couleur.r -= 5; + couleur.r >>= 8; + + couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4; + if (couleur.v > 5) + couleur.v -= 5; + couleur.v >>= 8; + + couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4; + if (couleur.b > 5) + couleur.b -= 5; + couleur.b >>= 8; + + setPixelRGB_ (expix2, myPos >> 1, couleur); + } +} + +/** generate the water fx horizontal direction buffer */ +static void generateTheWaterFXHorizontalDirectionBuffer(PluginInfo *goomInfo, ZoomFilterFXWrapperData *data) { + + int loopv; + int decc = goom_irand(goomInfo->gRandom, 8) - 4; + int spdc = goom_irand(goomInfo->gRandom, 8) - 4; + int accel = goom_irand(goomInfo->gRandom, 8) - 4; + + for (loopv = data->prevY; loopv != 0;) { + + loopv--; + data->firedec[loopv] = decc; + decc += spdc / 10; + spdc += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + + if (decc > 4) + spdc -= 1; + if (decc < -4) + spdc += 1; + + if (spdc > 30) + spdc = spdc - goom_irand(goomInfo->gRandom, 3) + accel / 10; + if (spdc < -30) + spdc = spdc + goom_irand(goomInfo->gRandom, 3) + accel / 10; + + if (decc > 8 && spdc > 1) + spdc -= goom_irand(goomInfo->gRandom, 3) - 2; + + if (decc < -8 && spdc < -1) + spdc += goom_irand(goomInfo->gRandom, 3) + 2; + + if (decc > 8 || decc < -8) + decc = decc * 8 / 9; + + accel += goom_irand(goomInfo->gRandom, 2) - goom_irand(goomInfo->gRandom, 2); + if (accel > 20) + accel -= 2; + if (accel < -20) + accel += 2; + } +} + + + +/** +* Main work for the dynamic displacement map. + * + * Reads data from pix1, write to pix2. + * + * Useful datas for this FX are stored in ZoomFilterData. + * + * If you think that this is a strange function name, let me say that a long time ago, + * there has been a slow version and a gray-level only one. Then came these function, + * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image. + * So that is why you have this name, for the nostalgy of the first days of goom + * when it was just a tiny program writen in Turbo Pascal on my i486... + */ +void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult) +{ + Uint x, y; + + ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)goomInfo->zoomFilter_fx.fx_data; + + if (!BVAL(data->enabled_bp)) return; + + /** changement de taille **/ + if ((data->prevX != resx) || (data->prevY != resy)) { + data->prevX = resx; + data->prevY = resy; + + if (data->brutS) free (data->freebrutS); + data->brutS = 0; + if (data->brutD) free (data->freebrutD); + data->brutD = 0; + if (data->brutT) free (data->freebrutT); + data->brutT = 0; + + data->middleX = resx / 2; + data->middleY = resy / 2; + data->mustInitBuffers = 1; + if (data->firedec) free (data->firedec); + data->firedec = 0; + } + + if (data->interlace_start != -2) + zf = NULL; + + /** changement de config **/ + if (zf) { + data->reverse = zf->reverse; + data->general_speed = (float)(zf->vitesse-128)/128.0f; + if (data->reverse) data->general_speed = -data->general_speed; + data->middleX = zf->middleX; + data->middleY = zf->middleY; + data->theMode = zf->mode; + data->hPlaneEffect = zf->hPlaneEffect; + data->vPlaneEffect = zf->vPlaneEffect; + data->waveEffect = zf->waveEffect; + data->hypercosEffect = zf->hypercosEffect; + data->noisify = zf->noisify; + data->interlace_start = 0; + } + + + if (data->mustInitBuffers) { + + data->mustInitBuffers = 0; + data->freebrutS = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); + data->brutS = (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128); + + data->freebrutD = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); + data->brutD = (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128); + + data->freebrutT = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); + data->brutT = (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128); + + data->buffratio = 0; + + data->firedec = (int *) malloc (data->prevY * sizeof (int)); + generateTheWaterFXHorizontalDirectionBuffer(goomInfo, data); + + data->interlace_start = 0; + makeZoomBufferStripe(data,resy); + + /* Copy the data from temp to dest and source */ + memcpy(data->brutS,data->brutT,resx * resy * 2 * sizeof(int)); + memcpy(data->brutD,data->brutT,resx * resy * 2 * sizeof(int)); + } + + /* generation du buffer de trans */ + if (data->interlace_start == -1) { + + /* sauvegarde de l'etat actuel dans la nouvelle source + * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */ + y = data->prevX * data->prevY * 2; + for (x = 0; x < y; x += 2) { + int brutSmypos = data->brutS[x]; + int x2 = x + 1; + + data->brutS[x] = brutSmypos + (((data->brutD[x] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); + brutSmypos = data->brutS[x2]; + data->brutS[x2] = brutSmypos + (((data->brutD[x2] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); + } + data->buffratio = 0; + } + + if (data->interlace_start == -1) { + signed int * tmp; + tmp = data->brutD; + data->brutD=data->brutT; + data->brutT=tmp; + tmp = data->freebrutD; + data->freebrutD=data->freebrutT; + data->freebrutT=tmp; + data->interlace_start = -2; + } + + if (data->interlace_start>=0) + { + /* creation de la nouvelle destination */ + makeZoomBufferStripe(data,resy/16); + } + + if (switchIncr != 0) { + data->buffratio += switchIncr; + if (data->buffratio > BUFFPOINTMASK) + data->buffratio = BUFFPOINTMASK; + } + + if (switchMult != 1.0f) { + data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) + + (float) data->buffratio * switchMult); + } + + data->zoom_width = data->prevX; + + goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2, + data->brutS, data->brutD, data->buffratio, data->precalCoef); +} + +static void generatePrecalCoef (int precalCoef[16][16]) +{ + int coefh, coefv; + + for (coefh = 0; coefh < 16; coefh++) { + for (coefv = 0; coefv < 16; coefv++) { + + int i; + int diffcoeffh; + int diffcoeffv; + + diffcoeffh = sqrtperte - coefh; + diffcoeffv = sqrtperte - coefv; + + if (!(coefh || coefv)) { + i = 255; + } + else { + int i1, i2, i3, i4; + + i1 = diffcoeffh * diffcoeffv; + i2 = coefh * diffcoeffv; + i3 = diffcoeffh * coefv; + i4 = coefh * coefv; + + // TODO: faire mieux... + if (i1) i1--; + if (i2) i2--; + if (i3) i3--; + if (i4) i4--; + + i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24); + } + precalCoef[coefh][coefv] = i; + } + } +} + +/* VisualFX Wrapper */ + +static void zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo *info) +{ + ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)malloc(sizeof(ZoomFilterFXWrapperData)); + + data->coeffs = 0; + data->freecoeffs = 0; + data->brutS = 0; + data->freebrutS = 0; + data->brutD = 0; + data->freebrutD = 0; + data->brutT = 0; + data->freebrutT = 0; + data->prevX = 0; + data->prevY = 0; + + data->mustInitBuffers = 1; + data->interlace_start = -2; + + data->general_speed = 0.0f; + data->reverse = 0; + data->theMode = AMULETTE_MODE; + data->waveEffect = 0; + data->hypercosEffect = 0; + data->vPlaneEffect = 0; + data->hPlaneEffect = 0; + data->noisify = 2; + + /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ + data->buffratio = 0; + data->firedec = 0; + + data->wave = data->wavesp = 0; + + data->enabled_bp = secure_b_param("Enabled", 1); + + data->params = plugin_parameters ("Zoom Filter", 1); + data->params.params[0] = &data->enabled_bp; + + _this->params = &data->params; + _this->fx_data = (void*)data; + + /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ + generatePrecalCoef(data->precalCoef); +} + +static void zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this) +{ + ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)_this->fx_data; + free (data->freebrutS); + free (data->freebrutD); + free (data->freebrutT); + free (data->firedec); + free (data->params.params); + free(_this->fx_data); +} + +static void zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info) +{ +} + +VisualFX zoomFilterVisualFXWrapper_create(void) +{ + VisualFX fx; + fx.init = zoomFilterVisualFXWrapper_init; + fx.free = zoomFilterVisualFXWrapper_free; + fx.apply = zoomFilterVisualFXWrapper_apply; + return fx; +} + + +/* TODO : MOVE THIS AWAY */ + +void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, Uint cycle) +{ + Uint x = (Uint) ((int) (goomInfo->screen.width / 2) + + (int) (t1 * cos ((float) cycle / t3))); + Uint y = (Uint) ((int) (goomInfo->screen.height/2) + + (int) (t2 * sin ((float) cycle / t4))); + + if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) && (y < goomInfo->screen.height - 2)) { + setPixelRGB (goomInfo, pix1, x + 1, y, c); + setPixelRGB (goomInfo, pix1, x, y + 1, c); + setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE); + setPixelRGB (goomInfo, pix1, x + 2, y + 1, c); + setPixelRGB (goomInfo, pix1, x + 1, y + 2, c); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filters_mmx.s kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filters_mmx.s --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filters_mmx.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filters_mmx.s 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,200 @@ +;// file : mmx_zoom.s +;// author : JC Hoelt +;// +;// history +;// 07/01/2001 : Changing FEMMS to EMMS : slower... but run on intel machines +;// 03/01/2001 : WIDTH and HEIGHT are now variable +;// 28/12/2000 : adding comments to the code, suppress some useless lines +;// 27/12/2000 : reducing memory access... improving performance by 20% +;// coefficients are now on 1 byte +;// 22/12/2000 : Changing data structure +;// 16/12/2000 : AT&T version +;// 14/12/2000 : unrolling loop +;// 12/12/2000 : 64 bits memory access + + +.data + +chaine: + .string "pos = %d\n\0" + .long 0x0 + +thezero: + .long 0x00000000 + .long 0x00000000 + +.text + +.globl mmx_zoom ;// name of the function to call by C program +/* .extern coeffs ;// the transformation buffer */ +.extern expix1,expix2 ;// the source and destination buffer +.extern mmx_zoom_size, zoom_width ;// size of the buffers + +.extern brutS,brutD,buffratio,precalCoef,prevX,prevY + +#define PERTEMASK 15 +/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +#define PERTEDEC 4 + +.align 16 +mmx_zoom: + + pushl %ebp + movl %esp,%ebp + subl $12,%esp + + movl prevX,%eax + decl %eax + sarl $4,%eax + movl %eax,-4(%ebp) + + movl prevY,%eax + decl %eax + sarl $4,%eax + movl %eax,-8(%ebp) + +;// initialisation du mm7 zero + movq (thezero), %mm7 + +movl mmx_zoom_size, %ecx +decl %ecx + +.while: + ;// esi <- nouvelle position + movl brutS, %eax + leal (%eax, %ecx, 8),%eax + + movl (%eax),%edx /* = brutS.px (brutSmypos) */ + movl 4(%eax),%eax /* = brutS.py */ + + movl brutD,%ebx + leal (%ebx, %ecx, 8),%ebx + movl (%ebx),%esi + subl %edx, %esi + imull buffratio,%esi + sarl $16,%esi + addl %edx,%esi /* esi = px */ + + /* eax contient deja brutS.py = le nouveau brutSmypos*/ + /* ebx pointe sur brutD[myPos] */ + movl 4(%ebx),%edi + subl %eax,%edi + imull buffratio,%edi + sarl $16,%edi + addl %eax,%edi /* edi = py */ + +/* pushl %eax + pushl %ebx*/ +/* popl %ebx + popl %eax*/ + + movl %esi,%eax + andl $15,%eax /* eax = coefh */ + movl %edi,%ebx + andl $15,%ebx /* ebx = coefv */ + + leal 0(,%ebx,4),%ebx + sall $6,%eax + addl %ebx,%eax + movl $precalCoef,%ebx +/* movd (%eax,%ebx),%mm6*/ /* mm6 = coeffs */ + + cmpl -8(%ebp),%edi + jge .then1 + cmpl -4(%ebp),%esi + jge .then1 + + sarl $4,%esi + sarl $4,%edi + imull zoom_width,%edi + leal (%esi,%edi),%esi + jmp .finsi1 + +.then1: + movl $0,%esi +.finsi1: + + /** apres ce calcul, %esi = pos, %mm6 = coeffs **/ +/* pushl %esi + pushl $chaine + call printf + addl $8,%esp*/ + + movl expix1,%eax + + ;// recuperation des deux premiers pixels dans mm0 et mm1 +/* movq (%eax,%esi,4), %mm0 /* b1-v1-r1-a1-b2-v2-r2-a2 */ + movq %mm0, %mm1 /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + ;// depackage du premier pixel + punpcklbw %mm7, %mm0 /* 00-b2-00-v2-00-r2-00-a2 */ + + movq %mm6, %mm5 /* ??-??-??-??-c4-c3-c2-c1 */ + ;// depackage du 2ieme pixel + punpckhbw %mm7, %mm1 /* 00-b1-00-v1-00-r1-00-a1 */ + + ;// extraction des coefficients... + punpcklbw %mm5, %mm6 /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq %mm6, %mm4 /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq %mm6, %mm5 /* c4-c4-c3-c3-c2-c2-c1-c1 */ + + punpcklbw %mm5, %mm6 /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpckhbw %mm5, %mm4 /* c4-c4-c4-c4-c3-c3-c3-c3 */ + + movq %mm6, %mm3 /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpcklbw %mm7, %mm6 /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw %mm7, %mm3 /* 00-c2-00-c2-00-c2-00-c2 */ + + ;// multiplication des pixels par les coefficients + pmullw %mm6, %mm0 /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw %mm3, %mm1 /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw %mm1, %mm0 + + ;// ...extraction des 2 derniers coefficients + movq %mm4, %mm5 /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw %mm7, %mm4 /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw %mm7, %mm5 /* 00-c4-00-c4-00-c4-00-c4 */ + + /* ajouter la longueur de ligne a esi */ + addl prevX,%esi + + ;// recuperation des 2 derniers pixels +/* movq (%eax,%esi,4), %mm1*/ + movq %mm1, %mm2 + + ;// depackage des pixels + punpcklbw %mm7, %mm1 + punpckhbw %mm7, %mm2 + + ;// multiplication pas les coeffs + pmullw %mm4, %mm1 + pmullw %mm5, %mm2 + + ;// ajout des valeurs obtenues la valeur finale + paddw %mm1, %mm0 + paddw %mm2, %mm0 + + ;// division par 256 = 16+16+16+16, puis repackage du pixel final + psrlw $8, %mm0 + packuswb %mm7, %mm0 + + ;// passage au suivant + + ;// enregistrement du resultat + movl expix2,%eax +/* movd %mm0,(%eax,%ecx,4)*/ + + decl %ecx + ;// test de fin du tantque + cmpl $0, %ecx ;// 400x300 + + jz .fin_while + jmp .while + +.fin_while: + emms + + movl %ebp,%esp + popl %ebp + + ret ;//The End diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,705 @@ +/* mmx.h + + MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for mmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _MMX_H +#define _MMX_H + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ + + + +/* Function to test if multimedia instructions are supported... +*/ +inline extern int +mm_support(void) +{ + /* Returns 1 if MMX instructions are supported, + 3 if Cyrix MMX and Extended MMX instructions are supported + 5 if AMD MMX and 3DNow! instructions are supported + 0 if hardware does not support any of these + */ + register int rval = 0; + + __asm__ __volatile__ ( + /* See if CPUID instruction is supported ... */ + /* ... Get copies of EFLAGS into eax and ecx */ + "pushf\n\t" + "popl %%eax\n\t" + "movl %%eax, %%ecx\n\t" + + /* ... Toggle the ID bit in one copy and store */ + /* to the EFLAGS reg */ + "xorl $0x200000, %%eax\n\t" + "push %%eax\n\t" + "popf\n\t" + + /* ... Get the (hopefully modified) EFLAGS */ + "pushf\n\t" + "popl %%eax\n\t" + + /* ... Compare and test result */ + "xorl %%eax, %%ecx\n\t" + "testl $0x200000, %%ecx\n\t" + "jz NotSupported1\n\t" /* CPUID not supported */ + + + /* Get standard CPUID information, and + go to a specific vendor section */ + "movl $0, %%eax\n\t" + "cpuid\n\t" + + /* Check for Intel */ + "cmpl $0x756e6547, %%ebx\n\t" + "jne TryAMD\n\t" + "cmpl $0x49656e69, %%edx\n\t" + "jne TryAMD\n\t" + "cmpl $0x6c65746e, %%ecx\n" + "jne TryAMD\n\t" + "jmp Intel\n\t" + + /* Check for AMD */ + "\nTryAMD:\n\t" + "cmpl $0x68747541, %%ebx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x69746e65, %%edx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x444d4163, %%ecx\n" + "jne TryCyrix\n\t" + "jmp AMD\n\t" + + /* Check for Cyrix */ + "\nTryCyrix:\n\t" + "cmpl $0x69727943, %%ebx\n\t" + "jne NotSupported2\n\t" + "cmpl $0x736e4978, %%edx\n\t" + "jne NotSupported3\n\t" + "cmpl $0x64616574, %%ecx\n\t" + "jne NotSupported4\n\t" + /* Drop through to Cyrix... */ + + + /* Cyrix Section */ + /* See if extended CPUID level 80000001 is supported */ + /* The value of CPUID/80000001 for the 6x86MX is undefined + according to the Cyrix CPU Detection Guide (Preliminary + Rev. 1.01 table 1), so we'll check the value of eax for + CPUID/0 to see if standard CPUID level 2 is supported. + According to the table, the only CPU which supports level + 2 is also the only one which supports extended CPUID levels. + */ + "cmpl $0x2, %%eax\n\t" + "jne MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported (in theory), so get extended + features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%eax\n\t" /* Test for MMX */ + "jz NotSupported5\n\t" /* MMX not supported */ + "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ + "jnz EMMXSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "EMMXSupported:\n\t" + "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ + "jmp Return\n\t" + + + /* AMD Section */ + "AMD:\n\t" + + /* See if extended CPUID is supported */ + "movl $0x80000000, %%eax\n\t" + "cpuid\n\t" + "cmpl $0x80000000, %%eax\n\t" + "jl MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported, so get extended features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported6\n\t" /* MMX not supported */ + "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ + "jnz ThreeDNowSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "ThreeDNowSupported:\n\t" + "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ + "jmp Return\n\t" + + + /* Intel Section */ + "Intel:\n\t" + + /* Check for MMX */ + "MMXtest:\n\t" + "movl $1, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported7\n\t" /* MMX Not supported */ + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\t" + + /* Nothing supported */ + "\nNotSupported1:\n\t" + "#movl $101, %0:\n\n\t" + "\nNotSupported2:\n\t" + "#movl $102, %0:\n\n\t" + "\nNotSupported3:\n\t" + "#movl $103, %0:\n\n\t" + "\nNotSupported4:\n\t" + "#movl $104, %0:\n\n\t" + "\nNotSupported5:\n\t" + "#movl $105, %0:\n\n\t" + "\nNotSupported6:\n\t" + "#movl $106, %0:\n\n\t" + "\nNotSupported7:\n\t" + "#movl $107, %0:\n\n\t" + "movl $0, %0:\n\n\t" + + "Return:\n\t" + : "=a" (rval) + : /* no input */ + : "eax", "ebx", "ecx", "edx" + ); + + /* Return */ + return(rval); +} + +/* Function to test if mmx instructions are supported... +*/ +inline extern int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} + + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef MMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)) + +#endif + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 2x32, 4x16, and 8x8 Parallel ADDs +*/ +#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) + +#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) + +#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +*/ +#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) + +#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +*/ +#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) + +#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel SUBs +*/ +#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) + +#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) + +#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +*/ +#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) + +#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +*/ +#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) + +#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) + + +/* 4x16 Parallel MULs giving Low 4x16 portions of results +*/ +#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results +*/ +#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) + + +/* 4x16->2x32 Parallel Mul-ADD + (muls like pmullw, then adds adjacent 16-bit fields + in the multiply result to make the final 2x32 result) +*/ +#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) + + +/* 1x64 bitwise AND +*/ +#ifdef BROKEN_PAND +#define pand_m2r(var, reg) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, reg); \ + mmx_m2r(pandn, var, reg); \ + } +#define pand_r2r(regs, regd) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, regd); \ + mmx_r2r(pandn, regs, regd) \ + } +#define pand(vars, vard) \ + { \ + movq_m2r(vard, mm0); \ + mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ + mmx_m2r(pandn, vars, mm0); \ + movq_r2m(mm0, vard); \ + } +#else +#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +#define pand(vars, vard) mmx_m2m(pand, vars, vard) +#endif + + +/* 1x64 bitwise AND with Not the destination +*/ +#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) + + +/* 1x64 bitwise OR +*/ +#define por_m2r(var, reg) mmx_m2r(por, var, reg) +#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +#define por(vars, vard) mmx_m2m(por, vars, vard) + + +/* 1x64 bitwise eXclusive OR +*/ +#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality + (resulting fields are either 0 or -1) +*/ +#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) + +#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) + +#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than + (resulting fields are either 0 or -1) +*/ +#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) + +#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) + +#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +*/ +#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) + +#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) + +#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +*/ +#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) + +#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) + +#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) + + +/* 2x32 and 4x16 Parallel Shift Right Arithmetic +*/ +#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) + +#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) + + +/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate + (packs source and dest fields into dest in that order) +*/ +#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) + +#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) + + +/* 4x16->8x8 PACK and Unsigned Saturate + (packs source and dest fields into dest in that order) +*/ +#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low + (interleaves low half of dest with low half of source + as padding in each result field) +*/ +#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) + +#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) + +#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High + (interleaves high half of dest with high half of source + as padding in each result field) +*/ +#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) + +#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) + +#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) + + +/* Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-mmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef MMX_TRACE + +#define emms() \ + { \ + printf("emms()\n"); \ + __asm__ __volatile__ ("emms"); \ + } + +#else + +#define emms() __asm__ __volatile__ ("emms") + +#endif + +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,94 @@ +#include "mmx.h" + +int testD [] = {0x1200, 0x2011, 0, 0x12, 0x5331, 0x8000}; +int testS [] = {0x1205, 0x11, 0x4210, 0x412, 0x121, 0x1211}; + +int ratios [] = {0x8000, 0x4000, 0x1234, 0x6141, 0xffff, 0}; + +int main () { + int nbERROR = 0; + int i,j; + volatile mmx_t ratiox; + + volatile mmx_t sortie; + + /* creation des variables de test */ + volatile int buffratio = 0x8000; + volatile int loop = 0; + volatile int *buffS; + volatile int *buffD; + buffS = malloc (256); + buffD = malloc (256); + + buffS = buffS + (unsigned)buffS % 64; + buffD = buffD + (unsigned)buffD % 64; + + for (j=0;j<6;j++) + for (i=0;i<3;i++) { + + buffratio = ratios[j]; + + buffS[0] = testS[i<<1]; + buffS[1] = testS[(i<<1)+1]; + + buffD[0] = testD[i*2]; + buffD[1] = testD[i*2+1]; + + /* code */ + + ratiox.d[0] = buffratio; + ratiox.d[1] = buffratio; + movq_m2r (ratiox, mm6); + pslld_i2r (16,mm6); + + /* |0hhhhhhh|llllvvvv| + x |00000000|bbbbbbbb| + ================= + |.bl.high|..bl.low| + + |..bh.low|00000000| + ================= + result1 + */ + + /* + * pre : mm6 = [buffratio<<16|buffratio<<16] + */ + + movq_m2r (buffS[loop],mm0); /* mm0 = S */ + movq_m2r (buffD[loop],mm1); /* mm1 = D */ + psubd_r2r (mm0,mm1); /* mm1 = D - S */ + movq_r2r (mm1, mm2); /* mm2 = D - S */ + + pslld_i2r (16,mm1); + mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ + pmullw_r2r (mm6, mm2); + + paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ + pslld_i2r (16,mm0); + + paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ + psrld_i2r (16, mm0); + movq_r2m (mm0, sortie); + + /* + * post : mm0 = S + ((D-S)*buffratio)>>16 + * modified = mm0,mm1,mm2 + */ + + if ( + (buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16) != sortie.d[0]) + | (buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16) != sortie.d[1])) + { + nbERROR++; + printf ("\ns : (0x%08x,0x%08x)\n", buffS[0], buffS[1]); + printf ("d : (0x%08x,0x%08x)\n", buffD[0], buffD[1]); + printf ("ratio : (0x%08x,0x%08x)\n", buffratio, buffratio); + + printf ("en mmx : (0x%08x,0x%08x)\n", sortie.d[0], sortie.d[1]); + printf ("en c : (0x%08x,0x%08x)\n", + buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16), + buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16)); + } + } + printf ("%d errors\n",nbERROR); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,186 @@ + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + +//#define MMX_TRACE +#include "mmx.h" + +void zoom_filter_mmx (int prevX, int prevY, + unsigned int *expix1, unsigned int *expix2, + int *lbruS, int *lbruD, int buffratio, + int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ + + int pos; + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + volatile mmx_t interpix; + + volatile mmx_t mask; /* masque des nombres a virgules */ + mask.ud[0] = BUFFPOINTMASK; + mask.ud[1] = BUFFPOINTMASK; + + prevXY.ud[0] = (prevX-1)<>16 format [X|Y] + * modified = mm0,mm1,mm2 + */ + + movq_m2r (brutS[loop],mm0); /* mm0 = S */ + movq_m2r (brutD[loop],mm1); /* mm1 = D */ + psubd_r2r (mm0,mm1); /* mm1 = D - S */ + movq_r2r (mm1, mm2); /* mm2 = D - S */ + + pslld_i2r (16,mm1); + mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ + pmullw_r2r (mm6, mm2); + + paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ + pslld_i2r (16,mm0); + + paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ + psrld_i2r (16, mm0); + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1 + */ + movq_m2r (prevXY,mm1); + pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : + 1111 si prevXY > px + 0000 si prevXY <= px + (idem pour y) */ + pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ + + + /* + * pre : mm0 : clipped position on screen + * post : mm6 : coefs for this position + * mm1 : X vector [0|X] + * modif : eax,ebx + */ + __asm__ __volatile__ ( + "movq %%mm0,%%mm1\n" + "movd %%mm0,%%eax\n" + "psrlq $32,%%mm1\n" + "movd %%mm1,%%ebx\n" + "and $15,%%eax\n" + "and $15,%%ebx\n" + "add %0,%%eax\n" + "movd (%%eax,%%ebx,$16),%%mm6\n" + ::"X"(precalCoef):"eax","ebx"); + + /* + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * post : eax : absolute position of the source pixel. + * modif : ebx + */ + psrld_i2r (PERTEDEC,mm0); + psrld_i2r (PERTEDEC,mm1); + __asm__ __volatile__ ( + "movd %%mm1,%%eax\n" +// "movl %1,%%ebx\n" + "mull %1\n" + "movd %%mm0,%%ebx\n" + "addl %%ebx,%%eax\n" + "movl %%eax,%0\n" + :"=X"(pos):"X"(prevX):"eax","ebx" + ); + + expix2[loop] = expix1[pos]; + /* + * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; + * coef en modulo 15 * + * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); + */ +// precal + eax + ebx * 16 + +// movd_m2r (precalCoef[interpix.d[0]][interpix.d[1]],mm6); + + /* recuperation des deux premiers pixels dans mm0 et mm1 */ +// movq_m2r (/*expix1[pos]*/a, mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +// movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ +// punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + +// movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ + /* depackage du 2ieme pixel */ +// punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ + + /* extraction des coefficients... */ +// punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +// movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +// movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + +// punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +// punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + +// movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +// punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ +// punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ +// pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +// pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +// paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ +// movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +// punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +// punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ +// movq_m2r (a/*expix1[pos+largeur]*/, mm1); +// movq_r2r (mm1, mm2); + + /* depackage des pixels */ +// punpcklbw_r2r (mm7, mm1); +// punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ +// pmullw_r2r (mm4, mm1); +// pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues la valeur finale */ +// paddw_r2r (mm1, mm0); +// paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +// psrlw_i2r (8, mm0); +// packuswb_r2r (mm7, mm0); + +// movd_r2m (mm0,expix2[loop]); + + // expix2[loop] = couleur; + } + emms(); /* __asm__ __volatile__ ("emms"); */ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,202 @@ + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + +//#define MMX_TRACE +#include "mmx.h" + +void zoom_filter_mmx (int prevX, int prevY, + unsigned int *expix1, unsigned int *expix2, + int *lbruS, int *lbruD, int buffratio, + int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + volatile mmx_t interpix; + + volatile mmx_t mask; /* masque des nombres a virgules */ + mask.ud[0] = BUFFPOINTMASK; + mask.ud[1] = BUFFPOINTMASK; + + prevXY.ud[0] = (prevX-1)<>16 format [X|Y] + * modified = mm0,mm1,mm2 + */ + + __asm__ __volatile__ ( + "movq %0,%%mm0\n" + "movq %1,%%mm1\n" + : :"X"(brutS[loop]),"X"(brutD[loop]) + ); /* mm0 = S */ + + psubd_r2r (mm0,mm1); /* mm1 = D - S */ + movq_r2r (mm1, mm2); /* mm2 = D - S */ + + pslld_i2r (16,mm1); + mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ + pmullw_r2r (mm6, mm2); + + paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ + pslld_i2r (16,mm0); + + paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ + psrld_i2r (16, mm0); + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1,mm2 + */ + movq_m2r (prevXY,mm1); + pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : + 1111 si prevXY > px + 0000 si prevXY <= px + (idem pour y) */ + movq_r2r (mm1,mm2); + punpckldq_r2r (mm1,mm1); + punpckhdq_r2r (mm2,mm2); + pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ + pand_r2r (mm2, mm0); /* on met a zero la partie qui deborde */ + + /* + * pre : mm0 : clipped position on screen + * post : mm6 : coefs for this position + * mm1 : X vector [0|X] + * modif : eax,ebx + */ + __asm__ __volatile__ ( + "movq %%mm0,%%mm1\n" + "movd %%mm0,%%ebx\n" + "psrlq $32,%%mm1\n" + "movd %%mm1,%%eax\n" + "andl $15,%%eax\n" + "andl $15,%%ebx\n" + + "shll $2,%%eax\n" + "shll $3,%%ebx\n" + + "addl %0,%%eax\n" + + "movd (%%eax,%%ebx,8),%%mm6\n" + ::"X"(precalCoef):"eax","ebx"); + + /* + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * post : eax : absolute position of the source pixel. + * modif : ebx + */ + psrld_i2r (PERTEDEC,mm0); + psrld_i2r (PERTEDEC,mm1); + __asm__ __volatile__ ( + "movd %%mm1,%%eax\n" + "mull %1\n" + "movd %%mm0,%%ebx\n" + "addl %%ebx,%%eax\n" + "movl %0,%%ebx\n" + "movq (%%ebx,%%eax,4),%%mm0\n" + "addl %1,%%eax\n" + "movq (%%ebx,%%eax,4),%%mm2\n" + + : : "X"(expix1), "X"(prevX):"eax","ebx" + ); + + /* + * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; + * coef en modulo 15 * + * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); + */ + + /* recuperation des deux premiers pixels dans mm0 et mm1 */ +// movq_m2r (expix1[pos], mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* recuperation des 2 derniers pixels */ +// movq_m2r (expix1[pos+prevX], mm2); + + /* depackage du premier pixel */ + punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + + movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ + /* depackage du 2ieme pixel */ + punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ + + /* extraction des coefficients... */ + punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + + punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + + movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ + movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ + movq_r2r (mm2, mm1); + + /* depackage des pixels */ + punpcklbw_r2r (mm7, mm1); + punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ + pmullw_r2r (mm4, mm1); + pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues la valeur finale */ + paddw_r2r (mm1, mm0); + paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + psrlw_i2r (8, mm0); + packuswb_r2r (mm7, mm0); + + movd_r2m (mm0,expix2[loop]); + + // expix2[loop] = couleur; + ++loop; + } + emms(); /* __asm__ __volatile__ ("emms"); */ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,316 @@ +#include "goom_fx.h" +#include "goom_plugin_info.h" +#include "goom_tools.h" + +#include "mathtools.h" + +/* TODO:-- FAIRE PROPREMENT... BOAH... */ +#define NCOL 15 + +/*static const int colval[] = { +0xfdf6f5, +0xfae4e4, +0xf7d1d1, +0xf3b6b5, +0xefa2a2, +0xec9190, +0xea8282, +0xe87575, +0xe46060, +0xe14b4c, +0xde3b3b, +0xdc2d2f, +0xd92726, +0xd81619, +0xd50c09, +0 +}; +*/ +static const int colval[] = { + 0x1416181a, + 0x1419181a, + 0x141f181a, + 0x1426181a, + 0x142a181a, + 0x142f181a, + 0x1436181a, + 0x142f1819, + 0x14261615, + 0x13201411, + 0x111a100a, + 0x0c180508, + 0x08100304, + 0x00050101, + 0x0 +}; + + +/* The different modes of the visual FX. + * Put this values on fx_mode */ +#define FIREWORKS_FX 0 +#define RAIN_FX 1 +#define FOUNTAIN_FX 2 +#define LAST_FX 3 + +typedef struct _FS_STAR { + float x,y; + float vx,vy; + float ax,ay; + float age,vage; +} Star; + +typedef struct _FS_DATA{ + + int fx_mode; + int nbStars; + + int maxStars; + Star *stars; + + float min_age; + float max_age; + + PluginParam min_age_p; + PluginParam max_age_p; + PluginParam nbStars_p; + PluginParam nbStars_limit_p; + PluginParam fx_mode_p; + + PluginParameters params; +} FSData; + +static void fs_init(VisualFX *_this, PluginInfo *info) { + + FSData *data; + data = (FSData*)malloc(sizeof(FSData)); + + data->fx_mode = FIREWORKS_FX; + data->maxStars = 4096; + data->stars = (Star*)malloc(data->maxStars * sizeof(Star)); + data->nbStars = 0; + + data->max_age_p = secure_i_param ("Fireworks Smallest Bombs"); + IVAL(data->max_age_p) = 80; + IMIN(data->max_age_p) = 0; + IMAX(data->max_age_p) = 100; + ISTEP(data->max_age_p) = 1; + + data->min_age_p = secure_i_param ("Fireworks Largest Bombs"); + IVAL(data->min_age_p) = 99; + IMIN(data->min_age_p) = 0; + IMAX(data->min_age_p) = 100; + ISTEP(data->min_age_p) = 1; + + data->nbStars_limit_p = secure_i_param ("Max Number of Particules"); + IVAL(data->nbStars_limit_p) = 512; + IMIN(data->nbStars_limit_p) = 0; + IMAX(data->nbStars_limit_p) = data->maxStars; + ISTEP(data->nbStars_limit_p) = 64; + + data->fx_mode_p = secure_i_param ("FX Mode"); + IVAL(data->fx_mode_p) = data->fx_mode; + IMIN(data->fx_mode_p) = 1; + IMAX(data->fx_mode_p) = 3; + ISTEP(data->fx_mode_p) = 1; + + data->nbStars_p = secure_f_feedback ("Number of Particules (% of Max)"); + + data->params = plugin_parameters ("Particule System", 7); + data->params.params[0] = &data->fx_mode_p; + data->params.params[1] = &data->nbStars_limit_p; + data->params.params[2] = 0; + data->params.params[3] = &data->min_age_p; + data->params.params[4] = &data->max_age_p; + data->params.params[5] = 0; + data->params.params[6] = &data->nbStars_p; + + _this->params = &data->params; + _this->fx_data = (void*)data; +} + +static void fs_free(VisualFX *_this) { + FSData *data = (FSData*)_this->fx_data; + free (data->stars); + free (data->params.params); + free (data); +} + + +/** + * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice. + */ +static void addABomb (FSData *fs, int mx, int my, float radius, float vage, float gravity, PluginInfo *info) { + + int i = fs->nbStars; + float ro; + int theta; + + if (fs->nbStars >= fs->maxStars) + return; + fs->nbStars++; + + fs->stars[i].x = mx; + fs->stars[i].y = my; + + ro = radius * (float)goom_irand(info->gRandom,100) / 100.0f; + ro *= (float)goom_irand(info->gRandom,100)/100.0f + 1.0f; + theta = goom_irand(info->gRandom,256); + + fs->stars[i].vx = ro * cos256[theta]; + fs->stars[i].vy = -0.2f + ro * sin256[theta]; + + fs->stars[i].ax = 0; + fs->stars[i].ay = gravity; + + fs->stars[i].age = 0; + if (vage < fs->min_age) + vage=fs->min_age; + fs->stars[i].vage = vage; +} + + +/** + * Met a jour la position et vitesse d'une particule. + */ +static void updateStar (Star *s) { + s->x+=s->vx; + s->y+=s->vy; + s->vx+=s->ax; + s->vy+=s->ay; + s->age+=s->vage; +} + + +/** + * Ajoute de nouvelles particules au moment d'un evenement sonore. + */ +static void fs_sound_event_occured(VisualFX *_this, PluginInfo *info) { + + FSData *data = (FSData*)_this->fx_data; + int i; + + int max = (int)((1.0f+info->sound.goomPower)*goom_irand(info->gRandom,150)) + 100; + float radius = (1.0f+info->sound.goomPower) * (float)(goom_irand(info->gRandom,150)+50)/300; + int mx; + int my; + float vage, gravity = 0.02f; + + switch (data->fx_mode) { + case FIREWORKS_FX: + { + double dx,dy; + do { + mx = goom_irand(info->gRandom,info->screen.width); + my = goom_irand(info->gRandom,info->screen.height); + dx = (mx - info->screen.width/2); + dy = (my - info->screen.height/2); + } while (dx*dx + dy*dy < (info->screen.height/2)*(info->screen.height/2)); + vage = data->max_age * (1.0f - info->sound.goomPower); + } + break; + case RAIN_FX: + mx = goom_irand(info->gRandom,info->screen.width); + if (mx > info->screen.width/2) + mx = info->screen.width; + else + mx = 0; + my = -(info->screen.height/3)-goom_irand(info->gRandom,info->screen.width/3); + radius *= 1.5; + vage = 0.002f; + break; + case FOUNTAIN_FX: + my = info->screen.height+2; + vage = 0.001f; + radius += 1.0f; + mx = info->screen.width / 2; + gravity = 0.04f; + break; + default: + return; + /* my = i R A N D (info->screen.height); vage = 0.01f; */ + } + + radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */ + max *= info->screen.height / 200.0f; + + if (info->sound.timeSinceLastBigGoom < 1) { + radius *= 1.5; + max *= 2; + } + for (i=0;ifx_data; + + /* Get the new parameters values */ + data->min_age = 1.0f - (float)IVAL(data->min_age_p)/100.0f; + data->max_age = 1.0f - (float)IVAL(data->max_age_p)/100.0f; + FVAL(data->nbStars_p) = (float)data->nbStars / (float)data->maxStars; + data->nbStars_p.change_listener(&data->nbStars_p); + data->maxStars = IVAL(data->nbStars_limit_p); + data->fx_mode = IVAL(data->fx_mode_p); + + /* look for events */ + if (info->sound.timeSinceLastGoom < 1) { + fs_sound_event_occured(_this, info); + if (goom_irand(info->gRandom,20)==1) { + IVAL(data->fx_mode_p) = goom_irand(info->gRandom,(LAST_FX*3)); + data->fx_mode_p.change_listener(&data->fx_mode_p); + } + } + + /* update particules */ + for (i=0;inbStars;++i) { + updateStar(&data->stars[i]); + + /* dead particule */ + if (data->stars[i].age>=NCOL) + continue; + + /* choose the color of the particule */ + col = colval[(int)data->stars[i].age]; + + /* draws the particule */ + info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, + (int)(data->stars[i].x-data->stars[i].vx*6), + (int)(data->stars[i].y-data->stars[i].vy*6), + col, + (int)info->screen.width, (int)info->screen.height); + info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, + (int)(data->stars[i].x-data->stars[i].vx*2), + (int)(data->stars[i].y-data->stars[i].vy*2), + col, + (int)info->screen.width, (int)info->screen.height); + } + + /* look for dead particules */ + for (i=0;inbStars;) { + + if ((data->stars[i].x > info->screen.width + 64) + ||((data->stars[i].vy>=0)&&(data->stars[i].y - 16*data->stars[i].vy > info->screen.height)) + ||(data->stars[i].x < -64) + ||(data->stars[i].age>=NCOL)) { + data->stars[i] = data->stars[data->nbStars-1]; + data->nbStars--; + } + else ++i; + } +} + +VisualFX flying_star_create(void) { + VisualFX vfx; + vfx.init = fs_init; + vfx.free = fs_free; + vfx.apply = fs_apply; + vfx.fx_data = 0; + return vfx; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontlib.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontlib.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontlib.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontlib.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,231 @@ +#include "goom_config.h" +#include "gfontrle.h" +#include "gfontlib.h" +#include +#include + +static Pixel ***font_chars; +static int *font_width; +static int *font_height; +static Pixel ***small_font_chars; +static int *small_font_width; +static int *small_font_height; + +void gfont_load (void) { + unsigned char *gfont; + unsigned int i = 0, j = 0; + unsigned int nba = 0; + unsigned int current = 32; + int *font_pos; + /* decompress le rle */ + + + + gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); + while (i>2)<<(ROUGE*8))| + (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))| + (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))| + (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8)); + } + } + } + + /* definir les lettres restantes */ + + for (i=0;i<256;i++) { + if (font_chars[i]==0) { + font_chars[i]=font_chars[42]; + small_font_chars[i]=small_font_chars[42]; + font_width[i]=font_width[42]; + font_pos[i]=font_pos[42]; + font_height[i]=font_height[42]; + small_font_width[i]=small_font_width[42]; + small_font_height[i]=small_font_height[42]; + } + } + + font_width [32] = (the_font.height / 2) - 1; + small_font_width [32] = font_width [32]/2; + font_chars [32] = 0; + small_font_chars [32] = 0; + free( gfont ); + free( font_pos ); +} + +void goom_draw_text (Pixel * buf,int resolx,int resoly, + int x, int y, + const char *str, float charspace, int center) { + float fx = (float) x; + int fin = 0; + + Pixel ***cur_font_chars; + int *cur_font_width; + int *cur_font_height; + + if (resolx>320) + { + /* printf("use big\n"); */ + cur_font_chars = font_chars; + cur_font_width = font_width; + cur_font_height = font_height; + } + else + { + /* printf ("use small\n"); */ + cur_font_chars = small_font_chars; + cur_font_width = small_font_width; + cur_font_height = small_font_height; + } + + if (cur_font_chars == NULL) + return ; + + if (center) { + unsigned char *tmp = (unsigned char*)str; + float lg = -charspace; + + while (*tmp != '\0') + lg += cur_font_width[*(tmp++)] + charspace; + + fx -= lg / 2; + } + + while (!fin) { + unsigned char c = *str; + + x = (int) fx; + + if (c == '\0') + fin = 1; + else if (cur_font_chars[c]==0) { + fx += cur_font_width[c] + charspace; + } + else { + int xx, yy; + int xmin = x; + int xmax = x + cur_font_width[c]; + int ymin = y - cur_font_height[c]; + int ymax = y; + + yy = ymin; + + if (xmin < 0) + xmin = 0; + + if (xmin >= resolx - 1) + return; + + if (xmax >= (int) resolx) + xmax = resolx - 1; + + if (yy < 0) + yy = 0; + + if (yy <= (int) resoly - 1) { + if (ymax >= (int) resoly - 1) + ymax = resoly - 1; + + for (; yy < ymax; yy++) + for (xx = xmin; xx < xmax; xx++) + { + Pixel color = cur_font_chars[c][yy - ymin][xx - x]; + Pixel transparency; + transparency.val = color.val & A_CHANNEL; + if (transparency.val) + { + if (transparency.val==A_CHANNEL) buf[yy * resolx + xx] = color; + else + { + Pixel back = buf[yy * resolx + xx]; + unsigned int a1 = color.channels.a; + unsigned int a2 = 255 - a1; + buf[yy * resolx + xx].channels.r = (unsigned char)((((unsigned int)color.channels.r * a1) + ((unsigned int)back.channels.r * a2)) >> 8); + buf[yy * resolx + xx].channels.g = (unsigned char)((((unsigned int)color.channels.g * a1) + ((unsigned int)back.channels.g * a2)) >> 8); + buf[yy * resolx + xx].channels.b = (unsigned char)((((unsigned int)color.channels.b * a1) + ((unsigned int)back.channels.b * a2)) >> 8); + } + } + } + } + fx += cur_font_width[c] + charspace; + } + str++; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontlib.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontlib.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontlib.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontlib.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,10 @@ +#ifndef _GFONTLIB_H +#define _GFONTLIB_H + +#include "goom_graphic.h" + +void gfont_load (void); +void goom_draw_text (Pixel * buf,int resolx,int resoly, int x, int y, + const char *str, float chspace, int center); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontrle.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontrle.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontrle.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontrle.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2500 @@ +/* RGBA C-Source image dump (with zRLE compression) */ + +const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; + unsigned int rle_size; + unsigned char rle_pixel [49725]; +} the_font = { +1277, 21, 4, 49725, { +121,17,164,255,121,17,164,255,121,17,164,255,121,17,164,255,0,8,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,28,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,121,17,164,255,121,17,164,255,0,56,121,17,164,0,1,121,17, +164,255,121,17,164,255,13,4,17,0,1,13,4,17,0,1,13,4,17,0, +1,16,5,22,0,13,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,25,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,33,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,1,13,4,17,0, +1,13,4,17,0,1,16,5,22,0,61,16,5,22,0,1,14,4,19,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +25,8,6,3,57,10,8,5,85,9,7,4,76,0,12,8,6,3,54,9, +8,4,96,9,7,4,85,0,12,8,6,3,57,9,8,4,96,9,7,4, +85,0,24,8,6,3,57,11,8,4,85,9,7,4,79,0,12,8,6,3, +51,10,8,5,85,8,6,3,85,0,40,8,6,3,57,11,8,4,85,8, +6,3,85,0,32,8,6,3,57,10,8,5,85,9,7,4,85,0,28,5, +4,2,14,8,6,3,85,9,7,4,85,0,24,8,6,3,74,9,7,4, +113,8,6,3,167,8,6,3,139,9,7,4,85,5,4,2,14,0,36,8, +6,3,57,9,8,4,110,9,7,4,85,0,24,5,4,2,20,9,7,4, +85,9,8,4,85,0,16,9,8,4,57,9,8,4,85,6,5,3,48,0, +255,0,29,5,4,2,17,8,6,3,85,9,7,4,82,0,20,5,4,2, +3,8,6,3,85,9,7,4,93,8,6,3,153,8,6,3,161,8,6,3, +110,9,8,4,85,8,6,3,85,6,5,3,31,0,32,5,4,2,3,8, +6,3,85,10,8,5,85,10,7,5,85,0,36,5,4,2,57,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +108,8,6,3,85,6,5,3,71,0,24,5,4,2,42,8,6,3,85,9, +7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,108,8, +6,3,85,6,5,3,71,0,48,5,4,2,3,8,6,3,85,9,8,4, +85,9,7,4,74,0,16,8,6,3,42,9,7,4,85,8,6,3,85,9, +7,4,85,8,6,3,125,8,6,3,170,7,6,4,170,9,7,4,170,12, +9,7,170,19,14,10,170,19,13,10,142,8,6,5,28,0,16,5,4,2, +51,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3, +164,8,6,3,108,8,6,3,85,6,5,3,71,0,20,10,8,5,57,9, +7,4,170,8,6,3,170,8,6,3,170,8,6,3,161,8,6,3,142,9, +7,4,96,9,7,4,85,8,6,3,85,9,7,4,85,9,7,4,74,0, +20,5,4,2,42,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3, +170,8,6,3,164,8,6,3,108,8,6,3,85,6,5,3,76,0,24,8, +6,5,82,10,8,7,133,12,9,7,170,15,11,8,170,15,11,8,170,15, +11,8,170,13,10,8,170,10,8,7,161,10,8,7,85,6,5,5,28,0, +96,8,6,3,74,9,8,4,85,8,6,3,57,0,68,7,6,4,28,9, +7,4,85,9,7,4,85,5,4,2,17,0,40,5,4,2,42,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +108,8,6,3,85,6,5,3,85,0,24,8,6,5,85,10,8,7,133,12, +9,7,170,15,10,8,170,15,11,8,170,15,11,8,170,13,10,8,170,10, +8,7,150,8,6,5,62,0,24,8,6,5,82,10,8,7,133,12,9,7, +170,15,10,8,170,14,10,7,170,9,7,4,170,8,6,5,147,10,8,5, +85,7,6,4,85,5,4,4,3,0,16,12,9,7,57,11,8,6,161,9, +7,6,170,10,8,7,170,13,10,8,170,14,10,7,170,13,10,8,170,12, +9,7,170,10,8,7,156,10,8,7,85,6,5,5,25,0,20,6,5,3, +57,8,7,5,85,9,7,4,110,9,7,4,170,10,8,5,170,10,8,5, +170,11,8,6,170,10,8,7,150,10,8,7,85,6,5,5,25,0,16,15, +11,8,57,11,8,6,170,9,7,6,170,10,8,7,170,13,10,8,170,15, +11,8,170,15,11,8,170,13,10,8,170,10,8,7,159,10,8,7,85,6, +5,5,25,0,16,15,11,8,59,11,9,6,170,9,7,4,125,10,8,5, +85,8,6,3,133,8,6,3,167,8,6,3,170,8,6,3,170,9,8,4, +113,0,16,8,6,3,42,10,8,5,85,10,7,5,85,9,7,4,125,10, +8,5,170,12,10,7,170,14,11,7,170,19,14,10,170,19,14,10,142,8, +6,5,28,0,16,8,6,5,82,10,8,7,133,12,9,7,170,15,11,8, +170,15,11,8,170,15,11,8,170,13,10,8,170,10,8,7,161,10,8,7, +85,6,5,5,25,0,16,12,10,7,74,14,10,7,170,12,9,7,139,7, +6,4,28,0,16,10,8,7,110,14,10,7,170,13,10,8,125,0,16,13, +10,8,71,15,11,8,170,13,10,8,130,5,5,4,8,0,44,11,8,6, +85,9,7,4,170,10,8,5,93,0,16,12,9,7,57,10,8,5,167,11, +8,6,110,6,5,3,8,0,16,11,8,6,57,10,7,5,159,11,8,6, +102,0,16,8,6,3,51,10,8,5,85,9,7,4,85,0,40,10,7,5, +57,11,9,6,85,7,6,4,57,0,28,7,5,4,28,10,8,5,85,11, +8,6,85,0,16,8,6,3,48,10,8,5,85,8,6,3,85,0,20,8, +6,3,57,11,8,4,85,9,7,4,79,0,20,5,4,2,45,8,6,3, +85,9,7,4,85,9,7,4,88,9,7,4,108,9,8,4,93,9,7,4, +85,8,6,3,85,6,5,3,74,0,20,8,6,3,45,9,7,4,85,8, +6,3,85,9,7,4,85,8,6,3,125,8,6,3,170,8,6,3,164,8, +6,3,108,8,6,3,85,6,5,3,74,0,24,6,5,3,57,8,7,5, +85,10,8,5,85,9,7,4,119,8,6,3,142,9,7,4,130,10,8,5, +91,10,7,5,85,6,5,3,85,0,20,9,7,4,57,10,8,5,85,10, +7,5,85,10,8,5,85,8,6,3,144,8,6,3,170,8,6,3,164,8, +6,3,108,8,6,3,85,6,5,3,71,0,24,5,4,2,45,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,9,7,4, +105,8,6,3,85,6,5,3,74,0,20,11,8,4,59,9,7,4,170,8, +6,3,164,9,7,4,91,8,6,3,85,8,6,3,85,8,6,3,85,9, +7,4,85,8,6,3,142,9,6,4,170,9,8,4,116,0,16,8,6,3, +48,10,8,5,85,9,7,4,85,0,20,8,6,3,57,11,8,4,85,9, +7,4,76,0,16,8,6,3,48,10,8,5,85,9,7,4,85,0,20,8, +6,3,57,11,8,4,85,9,7,4,76,0,16,8,6,3,48,10,8,5, +85,9,7,4,85,0,28,8,6,3,57,11,8,4,85,9,7,4,76,0, +16,8,6,3,54,9,8,4,96,9,7,4,85,0,20,8,6,3,57,9, +8,4,96,9,7,4,85,0,16,10,8,5,57,10,7,5,153,10,8,5, +93,0,20,10,8,7,93,14,11,7,170,13,10,8,136,0,16,11,8,6, +91,11,8,6,170,9,7,4,170,9,7,4,170,8,6,5,170,8,6,3, +119,9,7,4,85,8,6,3,85,8,6,3,85,9,7,4,85,9,7,4, +76,0,16,8,6,3,42,9,7,4,85,8,6,3,85,8,6,3,122,9, +8,4,102,0,16,8,6,3,51,9,7,4,85,6,5,3,45,0,40,12, +8,5,57,8,6,3,156,10,7,5,93,11,8,6,85,11,8,6,85,0, +28,6,5,5,14,13,10,8,85,8,7,5,45,0,80,10,8,5,57,10, +7,5,156,10,8,5,96,0,76,9,7,4,57,10,8,5,93,10,8,5, +85,0,140,10,8,7,110,13,10,8,170,12,9,7,133,5,5,4,6,0, +84,8,6,5,79,10,8,7,127,13,10,8,170,16,12,9,142,8,7,5, +28,0,72,8,6,3,57,10,8,5,85,9,6,4,85,0,48,15,11,8, +113,25,18,12,170,20,15,11,142,8,7,5,28,0,28,15,11,8,130,22, +16,11,170,20,15,11,142,7,6,6,23,0,12,13,10,8,68,12,9,7, +170,11,8,6,116,6,5,3,8,0,44,12,9,7,82,15,10,8,170,13, +10,8,130,5,5,4,8,0,255,0,197,6,5,3,57,8,6,3,85,0, +255,0,149,5,4,2,6,8,6,3,85,8,6,3,156,9,8,4,113,0, +16,8,6,3,48,9,8,4,91,9,7,4,76,0,16,10,8,5,57,9, +6,4,170,8,6,3,99,5,4,2,34,0,36,8,6,3,71,9,8,4, +93,9,8,4,96,8,6,3,85,6,5,3,45,0,12,8,6,3,76,0, +44,8,6,3,57,58,31,9,255,93,50,12,255,88,45,11,255,12,10,5, +113,0,4,7,6,4,28,54,29,9,255,93,46,12,255,88,45,11,255,12, +9,5,122,0,4,7,5,4,37,54,29,9,255,93,46,12,255,88,45,11, +255,14,10,5,142,0,16,8,6,3,85,58,31,9,255,93,50,12,255,88, +44,11,255,9,7,4,170,0,4,5,4,2,85,52,28,9,255,93,48,12, +255,88,44,11,255,12,10,5,170,0,32,7,6,4,85,58,31,9,255,93, +50,12,255,88,45,11,255,12,9,5,170,0,24,8,6,3,57,58,31,9, +255,93,50,12,255,88,45,11,255,14,10,5,142,0,20,6,5,3,28,19, +12,6,227,76,37,11,255,88,45,11,255,14,10,5,139,0,16,9,8,4, +170,69,35,10,255,92,47,11,255,92,47,11,255,88,45,11,255,88,45,11, +255,16,11,5,227,7,5,4,28,0,28,8,6,3,57,58,31,9,255,93, +46,12,255,88,45,11,255,14,10,5,142,0,16,6,5,3,28,19,12,6, +227,82,39,11,255,92,47,11,255,14,10,5,105,0,8,7,5,4,20,54, +29,9,255,100,50,13,255,30,19,7,255,8,6,3,85,0,255,0,21,6, +5,3,28,19,12,6,227,76,37,11,255,88,45,11,255,14,10,5,130,0, +12,7,6,4,65,17,11,6,227,71,37,10,255,88,45,11,255,92,47,11, +255,92,47,11,255,88,45,11,255,88,44,11,255,88,44,11,255,25,16,6, +255,8,6,3,142,0,24,7,5,4,85,17,12,6,229,77,39,12,255,107, +51,14,255,113,55,16,255,20,14,9,178,0,28,14,11,7,170,29,18,8, +255,74,39,11,255,88,45,11,255,88,45,11,255,92,47,11,255,92,47,11, +255,88,45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,5,4, +23,0,12,9,7,4,170,26,17,6,255,74,39,11,255,88,45,11,255,88, +45,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,44,11,255,41, +24,8,255,12,9,5,227,6,5,3,28,0,36,6,5,3,85,16,11,5, +227,71,37,10,255,88,45,11,255,88,44,11,255,12,10,5,113,0,8,8, +6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,88,45,11,255,92, +46,13,255,100,52,13,255,109,53,16,255,121,63,20,255,158,74,23,255,180, +88,27,255,183,90,28,255,26,17,11,142,0,12,10,7,5,170,26,17,6, +255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,255,92,47,11, +255,88,45,11,255,88,45,11,255,41,24,8,255,12,9,5,227,6,5,3, +28,0,8,7,6,4,8,61,32,10,255,102,51,13,255,92,46,13,255,92, +46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,90,45,11,255,84, +44,11,255,88,45,11,255,88,44,11,255,14,10,5,119,0,12,9,7,4, +153,26,17,6,255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11, +255,92,47,11,255,88,45,11,255,88,44,11,255,45,25,8,255,13,10,6, +227,7,6,4,28,0,12,17,13,10,170,64,39,21,255,155,78,26,255,169, +83,26,255,165,80,24,255,161,79,24,255,145,71,22,255,136,70,21,255,134, +69,21,255,88,50,23,255,22,17,11,232,9,8,6,31,0,84,4,4,3, +23,12,9,5,173,71,34,10,255,92,43,13,255,33,20,8,255,10,8,5, +57,0,64,20,14,7,227,83,42,12,255,92,46,13,255,19,13,6,227,6, +5,3,34,0,32,10,8,5,170,26,17,6,255,76,37,11,255,90,46,11, +255,92,46,13,255,92,46,13,255,90,45,11,255,90,45,11,255,88,44,11, +255,46,26,9,255,18,13,9,227,8,7,5,28,0,12,15,12,8,170,58, +35,19,255,134,73,23,255,153,76,24,255,142,69,21,255,131,64,20,255,121, +59,18,255,121,59,18,255,121,62,18,255,43,27,12,255,11,9,6,170,0, +16,17,13,10,170,64,39,21,255,164,85,27,255,177,86,26,255,154,75,23, +255,121,62,18,255,115,56,16,255,119,61,18,255,123,61,20,255,80,45,19, +255,22,16,11,227,8,7,5,28,0,8,13,10,8,57,96,48,19,255,165, +80,24,255,159,78,24,255,159,78,24,255,165,80,24,255,165,80,24,255,165, +80,24,255,159,78,24,255,164,81,25,255,91,52,24,255,22,17,11,227,8, +7,5,28,0,12,13,10,8,170,38,24,11,255,99,47,16,255,116,59,17, +255,126,65,21,255,142,69,21,255,153,76,24,255,157,74,24,255,155,76,24, +255,91,52,24,255,23,18,12,227,8,7,5,28,0,8,13,10,8,57,104, +52,21,255,171,84,26,255,155,76,24,255,164,81,25,255,173,81,26,255,180, +88,27,255,180,88,27,255,177,86,26,255,169,80,26,255,92,55,25,255,22, +17,11,227,8,7,5,28,0,8,13,10,8,57,114,63,25,255,177,86,26, +255,114,56,17,255,92,46,13,255,92,47,11,255,93,46,12,255,92,46,13, +255,96,48,13,255,92,46,13,255,18,12,5,91,0,8,8,6,3,40,55, +29,10,255,108,50,15,255,114,56,17,255,130,67,21,255,153,76,24,255,161, +82,24,255,171,84,26,255,179,84,26,255,179,84,26,255,25,17,10,142,0, +12,15,12,8,170,64,39,21,255,162,84,27,255,179,88,28,255,183,90,28, +255,181,89,28,255,181,89,28,255,172,88,27,255,156,77,25,255,88,50,23, +255,22,17,11,227,8,7,5,28,0,8,13,9,6,57,96,48,19,255,153, +71,22,255,134,69,21,255,20,14,9,193,0,12,11,8,6,113,124,62,25, +255,185,91,28,255,169,80,26,255,22,15,9,142,0,8,11,8,6,57,111, +61,24,255,184,90,27,255,177,86,26,255,23,16,10,173,0,40,11,8,6, +113,114,59,23,255,144,73,21,255,126,63,21,255,20,14,9,142,0,8,11, +9,6,57,97,51,20,255,152,71,23,255,134,69,21,255,20,14,9,187,0, +12,12,9,7,96,97,48,18,255,140,71,21,255,138,71,21,255,20,15,9, +142,0,8,8,6,3,40,52,28,9,255,93,50,12,255,88,45,11,255,14, +10,5,142,0,32,13,10,8,82,91,48,16,255,132,71,21,255,63,36,18, +255,10,8,7,136,0,20,7,6,6,62,31,21,12,244,124,66,23,255,134, +69,21,255,20,15,9,142,0,8,8,6,3,28,54,29,9,255,93,46,12, +255,80,39,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +50,12,255,88,44,11,255,14,10,5,116,0,12,9,7,4,153,26,17,6, +255,74,39,11,255,88,45,11,255,88,45,11,255,88,45,11,255,88,45,11, +255,88,44,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,4,4, +17,0,8,8,6,3,34,54,29,9,255,92,43,11,255,88,44,11,255,88, +45,11,255,92,43,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88, +44,11,255,45,25,8,255,12,10,5,227,6,5,3,28,0,12,13,10,6, +170,40,24,11,255,97,48,16,255,113,55,16,255,115,56,16,255,116,57,17, +255,116,57,17,255,113,55,16,255,113,55,16,255,60,33,13,255,18,14,9, +227,8,6,5,28,0,8,12,9,7,57,77,38,14,255,118,57,17,255,116, +59,17,255,118,60,17,255,109,53,16,255,98,47,13,255,92,47,11,255,88, +45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,6,5,3,28,0, +12,10,8,5,170,28,18,7,255,76,37,11,255,90,45,11,255,92,46,13, +255,94,45,13,255,94,45,13,255,92,46,13,255,92,46,13,255,46,26,9, +255,13,10,6,227,6,5,5,28,0,8,7,6,4,8,61,32,10,255,100, +50,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92, +46,13,255,92,46,13,255,94,47,13,255,98,49,13,255,94,47,13,255,18, +12,5,93,0,8,8,6,3,42,60,32,9,255,96,48,13,255,88,45,11, +255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,50,12,255,88, +44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,255,93,50,12, +255,88,44,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +50,12,255,88,44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9, +255,93,50,12,255,88,44,11,255,14,10,5,142,0,20,8,6,3,57,58, +31,9,255,93,50,12,255,88,44,11,255,12,10,5,113,0,8,7,6,4, +28,54,29,9,255,93,50,12,255,88,45,11,255,14,10,5,142,0,12,8, +7,3,57,60,31,9,255,96,48,13,255,92,46,13,255,14,10,5,127,0, +8,10,8,5,57,82,42,15,255,135,66,20,255,121,60,20,255,20,15,9, +176,0,12,11,9,6,108,107,56,22,255,172,84,25,255,158,74,23,255,22, +15,9,142,0,8,11,8,6,54,98,51,19,255,142,72,21,255,136,70,21, +255,138,71,21,255,121,59,18,255,100,52,13,255,90,46,11,255,88,44,11, +255,88,44,11,255,88,44,11,255,88,45,11,255,12,10,5,113,0,8,8, +6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,92,47,11,255,92, +47,11,255,18,12,5,85,0,8,7,6,4,45,54,30,9,255,94,47,13, +255,31,20,8,255,9,7,4,85,0,32,8,6,3,48,65,33,10,255,114, +55,15,255,119,58,18,255,126,63,21,255,128,66,21,255,22,15,9,164,0, +20,5,5,4,28,19,14,10,227,141,72,26,255,43,27,16,255,7,6,6, +85,0,72,14,10,7,71,96,49,17,255,138,71,21,255,130,67,21,255,22, +15,9,164,0,68,12,9,7,76,77,39,14,255,118,57,17,255,109,53,16, +255,22,15,9,153,0,132,11,8,6,96,103,53,20,255,144,73,21,255,121, +60,20,255,24,16,9,153,0,80,15,12,8,184,61,36,20,255,141,68,24, +255,168,82,25,255,171,84,26,255,26,18,11,159,0,68,9,7,4,57,60, +32,9,255,96,48,13,255,92,46,13,255,19,12,6,142,0,40,14,10,7, +76,129,67,26,255,190,97,29,255,180,88,27,255,26,17,11,161,0,24,14, +10,7,85,129,67,26,255,190,97,29,255,180,88,27,255,25,17,10,125,0, +8,11,8,6,57,109,60,24,255,175,86,26,255,142,73,23,255,20,14,9, +187,0,40,12,9,7,93,121,65,24,255,183,89,26,255,168,82,25,255,21, +15,10,178,0,255,0,193,10,8,5,170,39,23,8,255,78,41,11,255,16, +11,5,142,0,255,0,141,6,5,3,85,16,11,5,227,71,37,10,255,92, +47,11,255,92,47,11,255,18,12,5,85,0,8,8,6,3,28,54,29,9, +255,93,46,12,255,88,45,11,255,12,10,5,113,0,12,58,31,9,255,93, +50,12,255,88,45,11,255,25,17,6,255,8,6,3,142,0,24,4,4,3, +25,10,8,5,173,65,33,10,255,92,46,13,255,92,46,13,255,67,34,10, +255,27,18,8,255,9,7,4,156,3,3,2,85,10,8,5,184,69,35,10, +255,19,13,6,147,0,40,9,7,4,113,112,55,13,255,141,69,16,255,141, +75,16,255,18,13,5,170,0,4,8,6,3,85,110,54,13,255,143,76,16, +255,139,68,16,255,19,13,6,170,0,4,8,6,3,85,110,54,13,255,143, +76,16,255,141,72,16,255,23,15,6,170,0,12,10,9,5,110,35,21,8, +255,129,63,14,255,141,69,16,255,139,68,16,255,52,27,9,255,9,7,4, +255,27,17,8,255,135,66,16,255,154,75,17,255,155,79,18,255,91,50,16, +255,20,15,9,207,10,9,7,28,0,16,5,4,4,20,8,6,3,127,31, +20,8,255,130,66,15,255,143,76,16,255,143,76,16,255,67,34,10,255,10, +8,5,215,10,8,5,170,13,10,6,142,7,5,4,23,0,8,12,9,5, +85,115,59,14,255,149,72,16,255,143,76,16,255,18,12,5,235,0,16,7, +6,4,28,14,10,5,227,92,46,13,255,143,73,16,255,143,70,16,255,18, +13,5,170,0,12,14,10,5,170,53,28,10,255,114,56,13,255,56,29,9, +255,16,11,5,255,34,20,7,255,112,55,13,255,87,42,12,255,19,13,6, +235,8,7,5,40,0,24,10,8,5,85,114,56,13,255,143,70,16,255,141, +72,16,255,23,15,6,170,0,12,7,6,4,28,14,10,5,227,90,44,13, +255,112,57,13,255,47,26,8,255,11,8,4,57,0,12,25,16,6,227,96, +48,13,255,112,57,13,255,26,16,7,255,8,6,5,85,0,24,13,10,6, +85,8,7,5,57,0,20,6,5,3,28,15,11,6,85,9,7,4,28,0, +36,9,7,4,105,10,8,5,170,10,8,5,130,6,5,3,23,0,156,8, +6,3,136,77,39,12,255,143,73,16,255,139,74,16,255,18,12,5,170,0, +12,21,14,6,227,112,57,13,255,141,69,16,255,80,40,11,255,16,11,5, +255,14,10,5,227,18,13,5,255,72,35,11,255,136,69,15,255,130,66,15, +255,46,26,9,255,8,6,3,105,0,16,8,7,5,57,42,27,13,255,150, +79,21,255,184,94,21,255,195,99,22,255,199,106,24,255,26,18,11,255,0, +24,10,8,7,99,83,45,18,255,144,74,17,255,143,70,16,255,94,47,13, +255,18,13,5,255,16,11,5,173,14,10,5,227,52,27,9,255,132,67,15, +255,139,68,16,255,75,39,12,255,10,7,5,116,0,8,6,5,3,57,52, +27,9,255,137,73,16,255,143,76,16,255,94,47,13,255,18,13,5,255,16, +11,5,173,14,10,5,227,52,27,9,255,132,67,15,255,139,74,16,255,75, +39,12,255,10,8,5,142,0,32,8,6,5,85,22,15,7,255,102,51,13, +255,137,67,16,255,140,71,15,255,141,75,16,255,20,13,5,170,0,8,9, +6,4,85,108,55,13,255,141,69,16,255,139,74,16,255,74,36,11,255,18, +12,7,255,20,13,7,181,22,15,9,207,20,13,9,238,18,13,9,252,23, +16,10,255,31,21,12,218,14,11,7,42,0,8,7,6,4,57,40,22,9, +255,130,66,15,255,141,75,16,255,84,42,11,255,18,12,5,255,16,12,5, +181,14,10,5,241,69,35,10,255,140,69,17,255,154,78,17,255,117,60,18, +255,17,13,8,142,0,12,21,14,8,190,28,18,9,255,23,15,8,255,21, +14,8,255,21,14,8,255,23,15,8,255,38,24,11,255,98,53,17,255,151, +74,18,255,150,76,17,255,141,75,16,255,21,15,6,170,0,8,5,4,2, +28,33,20,8,255,130,66,15,255,141,72,16,255,84,42,11,255,18,12,5, +255,18,12,5,176,14,10,5,235,57,29,10,255,140,72,17,255,165,85,20, +255,121,67,24,255,14,11,7,142,0,8,8,6,5,57,72,46,23,255,198, +113,29,255,200,102,23,255,131,68,22,255,33,21,12,255,17,13,8,255,21, +14,8,255,88,47,19,255,192,99,23,255,203,113,26,255,146,87,29,255,13, +11,8,164,0,12,10,8,5,85,13,10,6,170,11,9,6,142,7,6,4, +28,0,12,13,10,8,113,18,14,9,170,16,13,9,147,10,8,7,28,0, +24,10,8,7,28,20,15,11,227,104,62,21,255,184,94,21,255,117,62,22, +255,17,12,8,227,7,5,4,28,0,64,11,8,6,170,67,35,16,255,164, +85,21,255,115,58,16,255,20,14,7,252,8,6,5,85,0,24,9,7,4, +82,66,37,13,255,145,75,18,255,154,78,17,255,115,58,16,255,29,18,8, +255,14,10,7,255,16,11,7,255,65,34,12,255,150,74,19,255,189,97,22, +255,138,79,27,255,14,12,9,142,0,8,7,6,6,57,55,33,16,255,158, +81,19,255,162,80,19,255,102,53,17,255,24,15,7,255,19,12,6,170,14, +10,5,204,46,26,9,255,137,67,16,255,139,71,16,255,49,27,10,255,7, +6,4,105,0,8,7,6,6,62,72,46,23,255,199,115,32,255,205,111,28, +255,155,84,26,255,41,24,14,255,18,13,9,255,25,16,10,255,110,61,25, +255,199,100,28,255,205,112,30,255,146,87,29,255,13,11,8,142,0,8,10, +8,7,147,180,87,25,255,206,111,27,255,203,105,26,255,164,85,27,255,40, +24,15,255,20,14,9,255,26,17,11,255,121,64,26,255,201,101,28,255,205, +112,30,255,146,87,29,255,14,11,7,142,0,8,8,6,5,57,71,44,22, +255,192,108,25,255,198,101,23,255,150,78,25,255,41,24,14,255,32,21,13, +255,74,41,21,255,184,105,27,255,202,104,25,255,202,118,27,255,174,102,31, +255,17,14,10,142,0,8,11,9,6,136,182,92,25,255,206,112,29,255,205, +111,28,255,166,79,27,255,43,25,16,255,21,15,10,255,29,19,12,255,116, +67,27,255,202,107,31,255,206,113,31,255,146,87,29,255,12,10,7,142,0, +8,11,8,6,144,185,93,26,255,202,103,23,255,157,77,18,255,83,42,12, +255,19,13,6,255,13,10,6,255,20,13,7,255,27,17,8,255,28,18,9, +227,10,8,5,45,0,8,11,9,6,142,139,73,20,255,198,96,21,255,199, +106,24,255,155,78,26,255,41,25,14,255,21,15,10,255,28,18,11,255,38, +24,15,255,40,24,15,227,14,10,7,62,0,8,8,7,5,57,65,41,20, +255,197,108,28,255,205,111,28,255,170,88,27,255,43,27,16,255,19,14,10, +255,29,19,12,255,123,66,24,255,181,84,20,255,170,87,19,255,114,60,17, +255,11,10,6,142,0,8,11,9,6,85,119,60,15,255,154,75,17,255,154, +78,17,255,18,13,7,255,0,12,13,10,8,170,191,102,30,255,209,118,30, +255,207,113,30,255,28,19,11,201,0,8,13,10,8,105,166,87,23,255,198, +101,23,255,198,97,23,255,26,18,11,255,0,40,13,10,8,170,189,100,28, +255,206,111,27,255,204,102,27,255,28,20,11,201,0,8,12,10,7,116,184, +93,27,255,206,107,27,255,203,113,26,255,23,17,10,255,0,8,6,5,5, +28,25,18,12,244,192,105,27,255,206,112,29,255,207,117,30,255,32,22,13, +170,0,8,11,9,6,88,112,57,13,255,143,70,16,255,141,69,16,255,17, +12,6,227,0,32,14,11,9,170,184,92,25,255,206,111,27,255,192,111,31, +255,49,33,18,255,10,8,7,122,0,12,7,7,6,59,22,16,11,232,167, +100,28,255,205,112,30,255,205,116,30,255,26,18,11,210,0,8,8,7,3, +85,110,54,13,255,141,69,16,255,141,75,16,255,25,16,6,255,5,4,4, +40,0,8,10,8,5,85,112,55,13,255,141,75,16,255,141,75,16,255,20, +13,5,170,0,8,5,4,2,28,33,20,8,255,130,66,15,255,141,72,16, +255,112,55,13,255,45,25,8,255,26,17,6,255,33,20,8,255,94,47,13, +255,141,69,16,255,144,71,17,255,80,40,13,255,9,7,4,125,0,8,10, +8,5,85,112,57,13,255,148,79,17,255,141,75,16,255,87,42,12,255,19, +13,6,255,14,10,5,215,15,10,6,255,60,31,11,255,143,71,18,255,160, +82,19,255,96,54,17,255,12,9,7,142,0,8,8,6,5,57,71,44,22, +255,192,100,25,255,199,106,24,255,185,93,26,255,91,50,22,255,58,33,17, +255,72,41,19,255,158,81,25,255,199,106,24,255,199,106,24,255,138,79,27, +255,13,11,8,142,0,8,10,8,7,147,166,87,23,255,203,108,24,255,202, +108,25,255,153,77,26,255,38,22,13,255,15,11,6,255,14,10,5,255,52, +28,9,255,132,70,15,255,141,75,16,255,80,41,13,255,10,8,5,139,0, +8,7,6,6,57,48,29,13,255,154,79,19,255,160,85,19,255,108,56,17, +255,30,18,9,255,16,11,7,255,24,15,9,255,96,51,17,255,167,86,20, +255,181,88,20,255,140,75,23,255,18,14,9,144,0,12,22,14,7,193,22, +13,7,255,20,13,7,255,78,40,15,255,165,81,20,255,177,90,20,255,177, +90,20,255,115,58,20,255,32,20,11,255,24,15,9,255,30,19,9,227,11, +8,6,54,0,8,11,9,6,142,139,68,20,255,166,78,19,255,144,71,17, +255,19,12,6,215,0,12,9,7,4,136,114,56,13,255,143,70,16,255,139, +68,16,255,19,13,6,170,0,8,10,7,5,85,112,55,13,255,143,70,16, +255,139,74,16,255,17,11,6,221,0,12,9,7,4,136,114,56,13,255,143, +70,16,255,141,75,16,255,20,13,5,170,0,8,9,6,4,85,110,54,13, +255,141,69,16,255,141,72,16,255,17,11,6,221,0,20,9,7,4,136,114, +56,13,255,143,73,16,255,139,74,16,255,19,13,6,170,0,8,8,6,3, +85,110,54,13,255,143,76,16,255,141,69,16,255,18,12,5,252,0,12,11, +9,6,170,131,69,18,255,170,87,19,255,168,86,19,255,28,19,9,170,0, +8,11,8,6,85,145,74,26,255,204,102,27,255,203,105,26,255,52,33,17, +255,6,5,5,57,0,8,17,14,10,227,190,107,25,255,204,113,25,255,174, +86,27,255,18,13,9,170,0,12,28,18,11,198,37,23,14,255,32,21,13, +255,21,15,10,255,20,14,9,255,38,23,11,255,87,44,12,255,137,70,16, +255,141,72,16,255,143,70,16,255,141,72,16,255,18,12,5,170,0,8,9, +6,4,85,110,54,13,255,145,74,16,255,141,69,16,255,94,47,13,255,27, +17,8,227,12,8,5,28,0,8,14,10,7,85,121,62,18,255,172,87,19, +255,139,69,18,255,20,15,9,227,0,36,21,14,8,227,117,61,24,255,199, +100,28,255,205,106,26,255,204,110,27,255,26,18,11,255,0,16,8,7,5, +28,20,15,11,227,135,73,22,255,192,97,21,255,165,83,22,255,33,22,12, +255,10,9,7,85,0,68,11,9,6,170,184,97,27,255,206,112,29,255,204, +110,27,255,28,19,11,255,0,68,14,11,7,170,179,93,24,255,202,103,23, +255,198,97,23,255,22,15,9,255,0,132,9,7,6,170,125,63,18,255,158, +77,17,255,146,75,17,255,17,12,6,255,0,76,8,6,5,76,72,46,23, +255,197,108,28,255,201,107,24,255,164,85,27,255,37,22,14,227,13,9,6, +48,0,68,12,9,7,170,138,67,19,255,170,79,19,255,168,86,19,255,20, +14,9,255,0,40,8,7,5,20,21,15,10,184,26,17,11,255,26,17,11, +215,12,9,7,74,0,24,8,7,5,20,21,15,10,184,26,17,11,255,31, +21,12,207,18,13,9,28,0,8,11,9,8,156,184,93,27,255,208,105,29, +255,205,111,28,255,28,19,11,255,0,40,14,11,7,170,184,92,25,255,203, +104,24,255,200,98,23,255,26,18,11,255,0,255,0,189,8,7,5,57,51, +29,12,255,152,75,19,255,162,86,19,255,19,13,8,246,0,255,0,137,6, +5,3,28,19,13,6,249,92,46,13,255,123,63,14,255,78,39,11,255,21, +15,6,227,9,8,4,28,0,8,9,8,4,85,110,59,13,255,141,69,16, +255,141,75,16,255,21,14,6,170,0,12,16,11,5,170,52,28,9,255,115, +59,14,255,116,60,15,255,43,26,10,255,9,7,6,125,0,16,8,7,5, +28,21,17,10,227,109,59,18,255,160,82,19,255,121,64,18,255,62,34,13, +255,94,53,17,255,149,78,20,255,102,54,19,255,32,22,11,255,72,39,15, +255,121,62,18,255,24,17,9,187,0,40,8,6,3,167,128,66,15,255,161, +85,17,255,159,81,18,255,24,15,7,178,0,4,6,5,3,37,48,28,11, +255,173,92,20,255,181,96,20,255,21,15,8,221,0,4,6,5,3,28,40, +24,9,255,143,74,18,255,158,80,17,255,21,15,6,181,0,8,10,8,5, +54,107,51,14,255,157,83,18,255,164,84,19,255,176,89,19,255,189,92,20, +255,191,98,22,255,190,106,23,255,197,110,26,255,203,108,24,255,203,117,24, +255,205,119,26,255,207,122,30,255,199,118,32,255,32,23,13,170,0,12,7, +6,4,85,22,15,7,232,113,54,14,255,146,75,17,255,158,80,17,255,154, +78,17,255,158,80,17,255,148,76,17,255,139,71,16,255,135,66,16,255,135, +66,16,255,21,14,6,136,0,8,10,8,5,85,128,66,15,255,161,85,17, +255,158,80,17,255,25,16,6,204,0,12,7,6,4,28,25,16,8,227,102, +50,15,255,148,76,17,255,142,73,17,255,84,45,13,255,10,8,5,113,0, +8,9,7,4,82,107,53,14,255,146,75,17,255,84,41,13,255,8,7,5, +198,3,2,2,23,5,4,4,136,38,23,9,255,136,70,17,255,140,72,17, +255,21,15,6,178,0,24,7,6,4,57,45,26,10,255,143,74,18,255,158, +80,17,255,26,17,6,170,0,12,24,16,7,227,115,58,16,255,148,76,17, +255,46,26,9,255,7,6,4,156,0,16,5,4,4,71,19,13,6,255,139, +71,16,255,140,72,17,255,43,26,10,255,9,8,4,85,0,16,14,10,5, +85,109,52,14,255,38,23,9,255,6,5,3,85,0,12,4,4,3,28,15, +12,6,227,115,56,16,255,29,19,8,170,0,32,13,10,6,113,122,64,21, +255,164,85,21,255,138,71,17,255,21,15,6,161,0,156,13,10,6,227,137, +67,16,255,154,75,17,255,84,45,13,255,10,8,5,116,0,8,9,7,4, +85,111,55,14,255,158,87,17,255,158,80,17,255,19,13,6,255,4,4,3, +28,0,4,3,3,2,113,17,12,6,255,139,71,16,255,161,85,17,255,146, +75,17,255,20,14,7,210,0,16,16,13,9,110,184,105,27,255,209,123,30, +255,210,124,31,255,208,123,31,255,207,122,30,255,27,20,12,255,0,24,13, +11,8,147,143,75,20,255,161,85,17,255,158,80,17,255,27,18,8,227,5, +4,2,28,0,8,10,7,5,198,131,65,16,255,161,85,17,255,150,76,17, +255,21,14,6,170,0,8,10,8,5,85,123,61,16,255,163,83,18,255,158, +80,17,255,27,18,8,227,5,4,2,28,0,8,9,7,4,198,130,66,15, +255,163,83,18,255,148,76,17,255,21,14,6,193,0,28,7,6,4,85,22, +15,7,255,131,65,16,255,154,78,17,255,154,78,17,255,154,78,17,255,154, +78,17,255,21,15,6,170,0,8,10,8,5,85,129,64,16,255,163,86,18, +255,180,91,19,255,29,20,10,255,3,3,2,93,0,36,10,8,5,122,121, +60,16,255,161,85,17,255,159,81,18,255,24,15,7,255,4,4,3,34,0, +4,2,2,1,6,17,13,8,181,181,93,22,255,203,108,24,255,205,114,26, +255,32,23,13,210,0,36,5,4,4,161,30,22,13,255,198,116,29,255,206, +106,25,255,191,96,20,255,26,17,7,170,0,8,9,7,4,85,116,60,15, +255,161,85,17,255,158,80,17,255,21,14,6,255,5,4,2,28,0,4,2, +2,1,3,12,9,7,215,190,107,25,255,211,124,30,255,208,134,37,255,32, +22,13,178,0,8,13,11,8,96,187,112,32,255,209,123,30,255,191,96,20, +255,28,19,9,255,4,3,3,74,0,4,3,2,2,28,13,10,8,227,196, +120,31,255,211,124,30,255,199,106,24,255,27,19,10,170,0,8,13,10,6, +57,114,61,19,255,178,91,21,255,182,102,23,255,23,17,10,173,0,8,11, +9,6,91,146,85,25,255,198,113,29,255,196,120,31,255,27,20,12,207,0, +20,5,5,4,28,21,17,12,227,190,118,33,255,209,131,40,255,161,100,34, +255,17,14,10,227,5,5,4,28,0,72,9,8,6,170,91,59,28,255,189, +94,24,255,162,83,19,255,39,25,12,255,7,7,6,85,0,20,13,11,8, +142,183,103,24,255,203,112,24,255,203,112,24,255,42,26,13,249,5,4,4, +62,0,4,3,2,2,25,12,9,7,227,195,115,30,255,212,127,35,255,211, +132,38,255,32,22,13,181,0,8,12,10,7,85,124,65,17,255,161,85,17, +255,159,78,18,255,21,14,6,255,5,4,2,28,0,8,7,6,4,224,133, +68,16,255,159,81,18,255,146,72,17,255,22,14,7,170,0,8,13,11,8, +91,185,111,32,255,210,125,33,255,205,114,26,255,37,26,14,255,4,4,3, +85,0,4,4,4,4,28,13,10,8,227,193,105,26,255,206,111,27,255,202, +118,27,255,32,22,13,170,0,8,11,9,6,127,174,91,23,255,202,102,21, +255,200,105,21,255,36,23,13,255,4,4,3,85,0,4,3,3,2,28,13, +11,8,227,198,118,33,255,212,127,35,255,208,128,33,255,31,22,12,181,0, +8,13,11,8,91,185,114,30,255,211,124,30,255,208,122,29,255,34,24,13, +255,4,4,3,85,0,4,7,6,6,113,32,24,13,255,185,95,22,255,202, +98,21,255,198,97,23,255,33,22,12,170,0,8,10,8,7,156,190,108,27, +255,212,126,33,255,211,127,36,255,40,26,15,255,4,4,3,85,0,4,3, +3,2,28,13,11,8,227,198,118,33,255,214,129,37,255,211,132,38,255,32, +23,13,173,0,8,10,8,7,144,167,87,22,255,185,94,20,255,165,87,18, +255,25,17,8,255,3,3,2,57,0,28,13,11,8,170,195,112,30,255,210, +125,33,255,208,117,29,255,39,26,14,255,4,4,3,85,0,28,12,10,7, +150,184,108,27,255,211,124,30,255,211,127,36,255,40,27,15,255,4,4,3, +85,0,4,3,3,2,28,17,13,8,178,138,71,17,255,161,85,17,255,155, +79,18,255,21,14,6,170,0,8,10,8,5,85,124,61,15,255,169,89,18, +255,180,91,19,255,25,18,10,255,0,12,13,11,8,170,196,113,31,255,211, +124,30,255,205,119,26,255,26,18,11,204,0,8,11,9,6,88,134,70,19, +255,173,87,18,255,168,86,19,255,20,13,7,255,0,40,13,11,8,170,196, +113,31,255,210,125,33,255,207,122,30,255,24,18,11,212,0,8,11,9,6, +119,180,93,23,255,203,108,24,255,202,103,23,255,20,15,9,255,0,8,15, +13,10,195,101,63,26,255,202,117,25,255,206,128,35,255,160,106,35,255,15, +13,10,142,0,8,10,8,5,147,139,70,20,255,191,96,20,255,200,105,21, +255,25,18,10,255,0,32,13,10,8,170,189,99,26,255,206,115,27,255,205, +106,26,255,185,106,28,255,79,52,26,255,10,9,7,122,0,4,7,6,6, +42,36,27,17,244,172,106,35,255,207,128,34,255,211,126,34,255,211,127,36, +255,24,18,11,227,0,8,10,8,5,85,124,64,15,255,159,81,18,255,158, +80,17,255,76,40,13,255,11,8,6,210,0,8,12,9,5,85,129,64,16, +255,161,85,17,255,158,80,17,255,26,16,7,170,0,8,9,7,4,85,115, +56,16,255,161,85,17,255,159,81,18,255,49,27,10,255,7,6,4,170,5, +4,4,85,6,5,3,113,26,19,11,255,185,95,22,255,202,102,21,255,197, +104,22,255,28,20,11,173,0,8,13,10,6,102,167,87,22,255,200,101,21, +255,201,102,22,255,32,21,11,255,4,3,3,65,0,4,2,2,1,17,12, +10,7,221,190,98,23,255,208,116,27,255,204,110,27,255,30,21,11,181,0, +8,13,11,8,91,185,114,30,255,211,124,30,255,209,123,30,255,86,55,25, +255,9,8,6,187,6,6,5,85,7,6,6,130,32,24,15,255,200,122,31, +255,209,123,30,255,206,122,31,255,32,23,13,173,0,8,10,8,7,144,191, +113,30,255,212,127,35,255,210,126,35,255,40,27,15,255,4,4,3,85,0, +4,2,2,1,8,11,9,6,212,157,81,20,255,189,92,20,255,190,97,21, +255,27,19,10,178,0,8,12,10,7,96,183,105,28,255,209,123,30,255,205, +114,26,255,36,24,13,255,4,4,3,85,0,4,4,4,4,28,18,14,9, +187,195,115,30,255,211,124,30,255,210,130,35,255,35,26,14,210,0,20,3, +2,2,28,12,10,7,227,195,115,30,255,211,124,30,255,209,123,30,255,38, +25,15,255,4,4,3,85,0,20,13,11,8,170,194,115,31,255,209,122,28, +255,196,99,21,255,21,15,8,255,0,12,11,9,6,170,153,79,20,255,187, +91,20,255,181,96,20,255,30,20,9,178,0,8,13,10,6,96,151,79,20, +255,187,91,20,255,181,96,20,255,22,16,9,255,0,12,12,9,7,170,146, +76,19,255,167,88,18,255,158,77,17,255,23,15,6,170,0,8,10,8,5, +85,133,66,16,255,167,88,18,255,168,86,19,255,22,16,9,255,0,20,12, +9,7,170,155,80,20,255,185,94,20,255,181,96,20,255,22,16,9,221,0, +8,6,6,5,42,51,29,12,255,150,81,19,255,165,87,18,255,42,26,11, +255,5,5,4,108,0,4,5,5,4,28,18,15,11,255,195,114,28,255,207, +123,32,255,158,94,31,255,17,13,10,142,0,8,6,5,5,57,50,34,19, +255,191,111,32,255,208,117,29,255,113,73,30,255,10,10,9,227,6,6,5, +125,7,7,6,198,42,29,17,255,187,96,22,255,166,87,23,255,42,27,15, +255,8,6,5,110,0,32,5,5,4,184,21,16,8,255,106,54,15,255,154, +78,17,255,151,77,18,255,92,48,15,255,11,9,6,119,0,8,10,8,5, +93,131,69,18,255,189,92,20,255,200,105,21,255,33,22,12,255,5,4,4, +54,0,12,9,8,6,85,76,53,25,255,200,118,31,255,204,114,27,255,65, +43,22,255,6,6,5,113,0,32,4,3,3,17,14,11,9,227,195,111,28, +255,206,115,27,255,204,105,25,255,24,17,11,255,0,12,5,5,4,28,13, +10,6,227,125,66,18,255,165,84,18,255,161,85,17,255,161,85,17,255,155, +79,18,255,28,19,9,255,6,5,3,85,0,64,11,9,8,68,86,56,27, +255,204,126,33,255,210,125,33,255,30,21,13,255,0,68,13,11,8,170,195, +115,30,255,209,123,30,255,207,122,30,255,27,19,12,255,3,3,2,28,0, +128,7,6,4,184,131,65,16,255,161,85,17,255,154,78,17,255,15,11,6, +249,0,76,10,8,7,173,166,87,23,255,198,104,21,255,196,99,21,255,35, +23,12,255,3,3,2,85,0,72,13,11,8,170,194,115,31,255,211,124,30, +255,207,122,30,255,27,19,12,255,3,3,2,28,0,108,13,11,8,170,196, +113,31,255,213,132,36,255,211,127,36,255,30,21,13,255,0,40,11,9,6, +170,155,80,20,255,185,94,20,255,180,91,19,255,21,15,8,255,0,255,0, +189,10,8,7,184,183,100,26,255,208,116,27,255,204,114,27,255,26,18,11, +255,4,4,4,28,0,255,0,133,10,8,5,127,119,60,15,255,160,85,19, +255,91,48,16,255,10,8,5,227,4,4,3,28,0,12,9,7,4,161,131, +67,16,255,159,81,18,255,159,78,18,255,18,13,7,249,0,16,7,6,4, +170,57,34,14,255,176,90,21,255,195,95,22,255,26,19,11,232,0,16,17, +14,10,99,179,106,28,255,207,122,30,255,180,109,33,255,25,20,12,255,7, +6,6,170,20,17,11,255,196,114,27,255,208,117,29,255,203,124,30,255,172, +106,35,255,53,36,20,255,10,9,7,108,0,40,9,8,6,170,159,82,20, +255,202,103,23,255,206,111,27,255,22,17,11,255,0,8,10,9,7,139,115, +74,30,255,213,133,48,255,39,28,16,255,0,8,9,8,4,113,67,39,14, +255,181,92,20,255,24,18,9,255,0,12,28,19,9,227,139,79,26,255,206, +117,31,255,212,123,37,255,214,126,41,255,172,106,35,255,53,34,18,255,122, +78,31,255,211,127,44,255,217,136,50,255,216,135,49,255,190,122,41,255,65, +43,22,255,14,11,7,85,0,8,7,6,4,28,29,21,10,249,153,79,20, +255,174,85,19,255,103,53,16,255,17,12,6,244,19,13,6,170,21,14,6, +170,27,17,6,170,21,14,6,212,21,14,6,255,25,17,6,224,12,9,5, +45,0,12,24,16,7,153,22,15,7,255,26,16,7,210,12,9,5,40,0, +8,8,7,5,28,17,13,8,227,114,61,19,255,174,85,19,255,154,79,19, +255,60,33,13,255,11,9,6,170,0,12,10,8,5,170,146,79,19,255,180, +87,19,255,67,39,14,255,8,6,5,85,0,8,24,17,9,255,143,75,20, +255,162,80,19,255,22,15,7,215,0,28,8,7,5,110,60,33,13,255,166, +78,19,255,22,15,7,227,0,8,7,6,4,85,91,51,16,255,174,88,19, +255,169,78,18,255,25,17,8,255,3,3,2,8,0,20,11,9,6,178,143, +74,18,255,177,89,18,255,138,75,19,255,18,13,7,176,0,16,9,7,4, +28,29,19,8,232,41,25,10,255,17,13,8,255,9,8,6,116,0,4,7, +6,4,59,14,11,7,227,32,21,9,255,40,24,9,255,12,9,5,105,0, +32,14,11,9,170,199,124,36,255,213,119,36,255,202,102,21,255,20,14,7, +246,0,152,8,7,5,142,53,31,12,255,162,86,19,255,121,64,18,255,19, +14,8,252,6,5,3,28,0,8,10,8,5,125,142,74,19,255,180,91,19, +255,183,89,19,255,19,14,8,255,0,4,5,5,4,6,15,13,10,193,69, +42,18,255,171,91,20,255,189,88,20,255,200,101,21,255,31,21,12,255,0, +16,10,8,7,28,30,21,13,227,150,92,35,255,208,121,37,255,211,115,30, +255,208,117,29,255,28,21,13,255,0,24,10,8,7,28,22,15,7,198,26, +17,7,255,24,15,7,221,9,7,4,57,0,12,8,7,5,156,171,89,22, +255,202,107,23,255,202,103,23,255,23,18,10,249,0,12,26,18,9,198,29, +19,8,255,24,16,7,215,10,8,5,51,0,12,10,8,5,85,134,70,19, +255,175,88,18,255,173,87,18,255,20,14,7,255,0,24,10,8,5,85,26, +19,9,255,107,58,18,255,154,83,19,255,168,79,19,255,169,78,18,255,173, +87,18,255,172,80,19,255,26,17,7,170,0,8,11,10,8,136,189,99,26, +255,210,115,31,255,216,129,45,255,143,96,40,255,15,13,10,227,12,12,11, +170,15,13,12,170,13,12,10,170,13,12,10,136,9,8,8,85,0,16,11, +9,6,170,169,91,22,255,202,103,23,255,203,108,24,255,18,15,9,255,0, +12,6,5,5,23,28,19,11,156,31,22,12,255,34,24,13,227,14,11,7, +85,0,36,9,8,8,142,72,54,31,255,215,147,60,255,218,146,61,255,174, +100,35,255,14,11,7,142,0,8,11,8,6,102,142,74,19,255,185,86,20, +255,195,98,20,255,18,14,9,249,0,12,10,8,7,170,202,131,47,255,220, +152,63,255,220,151,61,255,22,19,13,252,0,8,11,9,8,167,203,135,46, +255,217,139,48,255,210,120,33,255,18,14,9,255,0,12,9,8,6,170,198, +117,37,255,211,115,30,255,202,102,21,255,34,22,11,176,0,8,13,11,8, +170,202,122,37,255,218,144,49,255,217,144,50,255,28,21,13,255,0,8,12, +11,9,170,204,122,41,255,217,135,46,255,215,136,42,255,46,33,19,255,0, +16,10,9,7,28,21,19,14,227,153,104,46,255,214,149,55,255,158,103,39, +255,16,14,11,221,7,6,6,28,0,20,20,18,13,142,31,26,18,170,25, +21,16,170,24,20,15,170,24,20,15,170,24,20,15,170,24,21,15,170,31, +26,18,170,25,21,16,170,14,12,9,31,0,20,10,9,7,167,75,51,26, +255,202,117,33,255,186,120,43,255,41,32,20,255,12,11,9,85,0,16,11, +9,8,28,31,22,12,215,49,33,18,255,41,27,16,227,12,10,7,85,0, +12,14,12,9,170,204,137,51,255,220,152,63,255,220,151,61,255,23,19,12, +252,0,8,11,10,6,85,136,70,17,255,175,88,18,255,169,78,18,255,15, +11,6,255,0,8,9,8,6,85,26,19,9,255,153,82,18,255,177,89,18, +255,180,84,19,255,24,17,9,218,0,8,11,9,8,147,196,115,35,255,215, +125,38,255,214,125,39,255,20,16,11,255,0,12,9,8,6,159,165,86,22, +255,197,99,20,255,195,90,20,255,32,21,11,170,0,8,12,10,7,85,145, +76,20,255,189,92,20,255,191,96,20,255,18,14,9,255,0,12,9,8,6, +170,199,126,39,255,217,133,50,255,217,144,50,255,23,18,12,252,0,8,11, +10,8,142,191,105,28,255,206,111,27,255,203,104,24,255,19,15,10,255,0, +12,9,8,6,57,21,15,8,198,28,19,9,255,32,21,11,227,11,9,6, +76,0,8,11,9,8,170,203,125,42,255,220,146,59,255,219,146,60,255,24, +19,13,255,0,12,11,10,8,170,204,136,47,255,220,146,59,255,218,147,55, +255,25,19,12,232,0,8,11,10,8,119,161,87,22,255,195,98,20,255,202, +103,23,255,18,15,9,255,0,32,14,12,9,170,200,125,37,255,214,124,37, +255,205,106,26,255,20,16,9,221,0,32,16,13,9,170,205,130,42,255,219, +144,56,255,219,146,60,255,24,19,13,255,0,12,6,5,3,23,21,14,6, +170,26,16,7,255,26,17,7,224,14,10,5,31,0,8,11,9,6,125,170, +89,23,255,211,115,30,255,214,126,41,255,23,19,12,255,0,12,11,10,8, +170,195,112,30,255,206,106,25,255,200,105,21,255,29,20,10,170,0,8,11, +9,6,85,134,70,19,255,177,85,18,255,172,80,19,255,18,13,7,255,0, +40,14,12,9,170,195,112,30,255,206,111,27,255,202,103,23,255,31,22,10, +170,0,8,13,10,6,85,151,79,20,255,189,92,20,255,183,89,19,255,17, +13,8,255,0,4,8,7,5,59,57,34,16,255,184,97,27,255,198,115,33, +255,114,77,33,255,16,14,11,210,6,5,5,8,0,8,12,10,7,170,195, +113,32,255,215,123,42,255,217,133,50,255,32,24,15,255,0,32,12,11,7, +170,175,90,22,255,198,104,21,255,189,92,20,255,192,97,21,255,189,97,22, +255,45,29,14,255,10,9,7,210,22,17,11,255,183,102,30,255,212,121,41, +255,216,135,49,255,217,137,52,255,214,125,39,255,29,21,12,204,0,8,11, +9,6,85,143,75,20,255,193,97,20,255,195,98,20,255,180,93,23,255,88, +54,23,255,11,10,8,113,0,4,14,12,7,85,170,89,23,255,202,103,23, +255,202,102,21,255,32,22,11,178,0,8,12,10,7,113,176,91,23,255,205, +105,24,255,209,117,28,255,39,28,16,255,5,5,5,28,0,8,15,14,10, +198,206,132,45,255,217,133,50,255,215,133,44,255,25,19,12,232,0,8,11, +10,8,125,198,118,39,255,218,145,51,255,218,146,53,255,20,17,11,255,0, +12,9,8,6,170,198,124,37,255,216,134,45,255,214,139,41,255,22,18,11, +255,0,8,11,10,8,136,191,105,28,255,206,111,27,255,206,106,25,255,36, +26,15,255,5,5,4,28,0,8,15,13,10,198,192,105,27,255,206,106,25, +255,204,105,25,255,23,17,10,232,0,8,12,10,7,125,196,119,37,255,218, +141,51,255,218,139,55,255,20,16,11,255,0,12,9,8,6,170,196,110,33, +255,215,126,40,255,214,125,39,255,23,18,12,252,0,8,11,9,8,167,201, +123,40,255,217,133,50,255,214,136,43,255,20,16,11,255,0,12,6,5,5, +23,29,21,12,153,32,22,13,255,35,25,14,227,15,12,8,85,0,24,12, +10,9,170,198,124,37,255,215,125,38,255,213,124,38,255,23,18,12,255,0, +24,14,12,9,170,204,132,47,255,219,144,56,255,211,127,36,255,28,21,13, +255,0,12,14,12,9,170,198,117,37,255,215,123,42,255,214,125,39,255,25, +20,12,215,0,8,11,10,8,130,198,119,35,255,215,126,40,255,212,123,37, +255,30,22,13,255,0,12,14,12,9,170,196,114,33,255,206,106,25,255,200, +105,21,255,30,21,11,184,0,8,13,11,8,99,184,100,25,255,209,117,28, +255,210,115,31,255,28,21,13,255,0,20,14,12,9,170,198,117,37,255,215, +126,40,255,214,126,41,255,25,19,12,255,0,12,10,9,7,125,61,42,22, +255,190,107,33,255,153,98,38,255,29,23,16,255,13,12,10,255,17,15,10, +255,108,74,37,255,210,144,59,255,153,98,38,255,16,14,11,224,6,6,5, +17,0,12,15,13,8,227,115,67,24,255,197,100,22,255,150,81,25,255,32, +24,13,255,15,13,8,255,19,15,10,255,85,48,18,255,178,95,21,255,115, +65,20,255,15,12,8,255,5,5,4,34,0,32,10,9,7,198,69,46,22, +255,186,103,29,255,195,111,28,255,92,58,25,255,15,12,8,198,0,12,10, +9,7,170,194,112,31,255,215,125,38,255,218,146,53,255,24,19,13,255,0, +20,15,14,10,227,159,103,42,255,212,127,43,255,177,118,48,255,19,17,12, +227,6,6,5,28,0,32,11,10,8,170,182,98,23,255,202,106,21,255,195, +98,20,255,24,17,9,212,0,12,18,14,9,227,102,54,19,255,157,83,18, +255,85,46,14,255,19,13,6,255,47,27,10,255,150,81,19,255,131,67,20, +255,39,26,14,255,12,11,9,85,0,64,10,9,7,170,118,75,33,255,215, +141,54,255,44,33,19,255,0,16,9,9,8,108,19,17,12,170,27,23,16, +170,23,21,16,170,23,21,16,170,24,20,15,170,20,18,13,170,15,14,10, +170,10,9,7,113,7,6,6,28,0,12,12,11,9,170,189,99,26,255,209, +110,30,255,211,118,36,255,141,88,36,255,19,17,12,227,20,18,13,170,24, +20,15,170,21,19,14,170,16,14,11,170,10,9,7,113,6,6,5,28,0, +20,8,7,5,65,11,10,8,142,16,14,11,170,24,21,15,170,25,22,16, +170,23,21,16,170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6, +28,0,20,8,7,5,62,10,9,5,136,12,10,7,170,14,11,7,170,13, +10,6,170,11,9,6,198,31,21,10,255,153,82,18,255,177,85,18,255,169, +78,18,255,22,15,7,204,0,16,8,7,5,57,11,10,6,142,19,17,12, +170,23,21,16,170,25,22,16,170,23,21,16,170,21,19,14,170,15,14,10, +170,10,10,9,113,7,6,6,28,0,16,12,10,7,153,55,32,14,255,175, +93,20,255,185,94,20,255,183,89,19,255,80,44,17,255,13,11,8,187,7, +6,6,25,0,16,8,7,5,62,11,10,6,142,16,14,11,170,23,19,14, +170,25,22,16,170,23,21,16,170,19,17,12,170,15,14,10,170,17,15,10, +170,19,17,12,142,9,8,8,28,0,8,12,10,9,170,204,137,49,255,220, +146,59,255,218,146,53,255,141,91,38,255,19,17,12,227,19,17,12,170,24, +20,15,170,21,19,14,170,15,14,10,170,10,10,9,113,7,6,6,28,0, +16,12,10,7,57,14,12,7,102,14,11,7,85,0,32,12,10,7,57,13, +11,8,105,15,13,8,85,0,12,12,11,9,170,204,136,47,255,220,146,59, +255,218,153,59,255,24,19,13,255,0,12,8,7,5,82,11,10,6,156,11, +9,6,170,10,9,7,91,0,12,10,8,5,127,144,78,19,255,180,87,19, +255,174,81,19,255,24,15,7,210,0,12,14,11,7,68,12,10,7,170,12, +10,7,170,17,15,10,170,24,20,15,170,19,17,12,170,15,14,10,170,18, +15,11,170,24,21,15,170,21,19,14,170,15,14,10,170,11,10,8,113,7, +7,6,28,0,16,15,13,10,119,17,15,12,170,15,13,10,170,16,14,11, +170,19,17,12,170,21,18,12,170,18,15,11,170,15,13,8,170,11,9,6, +170,10,8,7,88,6,5,5,23,0,20,10,9,7,85,14,12,9,170,19, +17,12,170,21,19,14,170,21,19,14,170,21,19,14,170,19,17,12,170,15, +14,10,170,11,10,8,116,7,7,6,28,0,16,15,14,10,119,18,15,11, +170,15,14,10,170,18,15,11,170,21,19,14,170,25,22,16,170,23,21,16, +170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,28,0,20,10, +9,7,85,14,12,9,170,19,17,12,170,20,18,13,170,20,18,13,170,23, +19,14,170,19,17,12,170,15,14,10,170,17,14,10,170,19,17,12,142,10, +9,7,28,0,12,15,13,10,113,18,15,11,170,15,14,10,170,18,15,11, +170,21,19,14,170,25,22,16,170,23,21,16,170,20,18,13,170,16,14,11, +170,11,10,8,113,7,7,6,28,0,20,7,7,6,82,11,10,6,142,16, +13,9,170,19,17,12,170,21,19,14,170,24,21,15,170,25,22,16,170,25, +22,16,170,15,13,10,170,12,11,9,57,0,16,15,13,10,170,97,65,34, +255,209,132,42,255,214,136,43,255,214,127,43,255,159,103,42,255,21,19,14, +227,11,10,8,28,0,12,16,14,11,113,21,19,14,170,18,15,11,153,11, +10,8,28,0,16,15,14,10,125,21,19,14,170,19,17,12,142,10,9,7, +28,0,12,15,14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0, +16,15,13,10,125,21,19,14,170,19,17,12,142,10,9,7,28,0,12,15, +14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,24,15,14,10, +125,21,19,14,170,19,17,12,142,9,9,8,28,0,12,17,14,10,130,27, +24,16,170,21,19,14,142,10,9,7,28,0,16,16,14,11,113,28,24,17, +170,24,21,15,161,12,11,9,28,0,12,16,14,11,113,21,19,14,170,18, +15,11,153,11,10,8,28,0,16,15,13,10,125,21,19,14,170,19,17,12, +142,9,8,6,28,0,12,18,15,11,136,19,16,10,170,16,13,9,170,16, +14,9,170,15,13,8,170,13,11,8,170,12,11,9,170,13,12,8,170,15, +14,10,170,14,13,11,170,11,11,10,113,0,20,13,11,8,170,190,98,23, +255,204,116,31,255,74,52,27,255,9,8,8,113,0,16,13,11,8,170,192, +106,29,255,208,112,27,255,208,117,29,255,27,21,12,255,0,16,5,5,4, +28,27,23,16,255,199,121,44,255,214,139,41,255,31,23,14,255,0,16,13, +11,8,28,32,24,13,227,36,26,15,255,19,16,12,198,8,8,7,51,0, +4,8,8,7,57,29,21,12,218,48,32,17,255,45,30,16,255,20,16,11, +218,10,9,7,105,0,44,14,12,9,170,204,130,51,255,224,153,77,255,225, +169,88,255,33,27,18,255,0,12,21,19,14,215,217,163,86,255,61,46,28, +255,0,12,19,16,12,201,203,121,40,255,51,38,22,255,0,12,4,4,3, +25,16,14,11,227,212,147,71,255,224,160,77,255,223,161,80,255,31,25,16, +255,4,4,4,102,10,10,9,215,206,133,55,255,223,156,70,255,224,164,85, +255,51,39,24,255,5,5,4,82,0,12,15,12,8,110,178,98,27,255,211, +115,30,255,211,121,34,255,36,26,15,255,3,3,2,85,0,60,8,8,5, +28,27,20,10,232,125,73,22,255,190,97,21,255,180,92,21,255,97,56,20, +255,14,11,7,170,0,16,12,10,7,142,165,89,22,255,198,104,21,255,84, +50,19,255,7,6,4,159,0,4,5,5,4,82,32,23,11,255,121,69,22, +255,97,56,20,255,15,13,8,142,0,32,14,12,7,198,172,92,21,255,28, +19,9,207,0,8,11,10,6,85,148,78,21,255,198,104,21,255,192,97,21, +255,21,15,8,255,0,24,10,9,5,170,167,90,22,255,202,93,21,255,202, +103,23,255,21,16,10,255,0,20,4,3,3,133,20,16,9,255,151,80,22, +255,75,42,16,255,10,8,7,255,32,22,11,255,164,86,23,255,60,39,17, +255,5,5,4,252,0,36,12,11,9,198,213,155,80,255,224,166,83,255,211, +121,34,255,20,16,9,255,3,3,2,28,0,144,6,6,5,51,27,20,10, +255,160,84,23,255,198,104,21,255,67,40,16,255,8,7,5,125,0,12,12, +10,9,170,195,112,30,255,215,125,38,255,217,133,50,255,49,35,22,255,5, +5,4,133,13,12,10,210,189,119,50,255,211,127,44,255,212,121,41,255,218, +135,53,255,220,148,63,255,34,27,17,255,0,20,4,4,4,17,13,12,10, +227,196,113,31,255,212,118,35,255,214,123,43,255,33,26,16,255,0,56,12, +11,9,187,208,134,55,255,223,146,70,255,221,152,70,255,34,26,17,255,0, +40,8,7,5,164,165,86,22,255,202,98,21,255,198,96,21,255,22,16,9, +255,0,20,8,8,5,85,32,22,11,255,167,87,22,255,160,84,23,255,93, +54,20,255,120,65,21,255,188,96,21,255,196,99,21,255,200,105,21,255,24, +19,11,207,0,8,15,14,10,110,208,152,71,255,227,174,98,255,228,179,103, +255,225,176,98,255,217,169,94,255,213,166,92,255,215,167,92,255,213,155,80, +255,204,136,55,255,138,89,37,255,25,22,16,227,9,9,8,28,0,8,11, +10,8,170,203,129,50,255,223,149,70,255,222,158,75,255,31,25,16,255,4, +4,4,28,0,60,8,8,7,57,49,40,26,255,206,152,83,255,224,169,91, +255,194,140,71,255,31,27,20,255,9,8,8,28,0,8,12,10,9,161,196, +110,33,255,218,130,51,255,222,158,75,255,31,25,16,255,4,4,4,28,0, +8,11,10,8,198,213,160,84,255,228,180,105,255,227,175,100,255,33,28,18, +207,0,8,12,11,9,130,210,155,77,255,228,169,99,255,226,172,95,255,30, +25,17,255,4,4,4,28,0,8,11,10,8,198,204,129,49,255,214,127,43, +255,213,125,40,255,23,19,12,232,0,8,14,13,9,125,208,152,71,255,223, +159,76,255,218,153,59,255,33,26,16,210,0,8,13,12,10,127,198,118,39, +255,215,127,42,255,213,126,42,255,41,31,18,227,0,12,6,6,5,28,25, +21,16,227,204,150,79,255,223,171,98,255,175,122,60,255,18,15,11,218,5, +4,4,17,0,20,20,18,13,85,177,101,34,255,204,123,37,255,199,117,36, +255,199,117,36,255,202,122,37,255,199,117,36,255,198,114,31,255,198,110,31, +255,202,118,35,255,46,33,21,170,0,24,10,9,7,153,110,78,37,255,213, +162,82,255,218,164,87,255,67,51,30,255,9,8,8,85,0,40,6,5,5, +28,21,19,14,255,217,166,92,255,227,175,100,255,224,169,91,255,31,25,16, +215,0,8,12,10,7,85,154,80,21,255,197,99,20,255,192,97,21,255,28, +20,9,255,4,3,3,110,11,9,6,170,117,63,20,255,184,94,21,255,198, +104,21,255,203,104,24,255,210,122,37,255,21,17,12,252,0,8,10,9,7, +161,203,129,50,255,224,160,77,255,225,169,88,255,30,25,17,255,4,4,4, +28,0,8,8,7,5,190,165,86,22,255,198,104,21,255,196,99,21,255,28, +19,9,170,0,8,13,11,8,85,176,91,23,255,208,112,27,255,210,121,35, +255,27,22,14,255,4,4,4,28,0,8,11,10,8,198,211,149,76,255,224, +168,87,255,224,162,81,255,32,26,17,210,0,8,12,10,7,113,176,91,23, +255,202,107,23,255,202,95,23,255,20,16,9,255,0,40,15,13,10,170,213, +160,84,255,228,180,105,255,227,174,98,255,33,26,18,255,0,12,15,13,10, +170,213,155,80,255,226,172,95,255,224,167,85,255,23,20,14,244,0,8,11, +10,8,127,189,104,28,255,214,127,43,255,221,148,70,255,31,25,16,255,4, +4,4,28,0,28,14,12,9,170,195,113,32,255,209,117,28,255,202,103,23, +255,20,15,9,252,3,3,3,14,0,28,15,14,10,170,213,155,80,255,226, +172,95,255,221,152,70,255,28,24,15,255,0,40,14,12,9,170,208,141,61, +255,225,162,88,255,227,174,98,255,33,26,18,255,4,4,4,28,0,8,10, +8,7,198,182,98,23,255,202,103,23,255,198,104,21,255,28,19,9,170,0, +8,11,10,6,85,154,80,21,255,202,98,21,255,202,103,23,255,25,20,12, +255,0,40,12,10,7,170,186,100,23,255,202,99,23,255,200,105,21,255,30, +21,9,170,0,8,12,9,7,85,154,80,21,255,198,104,21,255,196,99,21, +255,28,20,9,255,4,4,3,113,11,10,6,227,183,100,26,255,212,127,43, +255,167,117,52,255,17,15,12,215,5,5,5,14,0,12,15,13,10,170,211, +149,76,255,224,166,83,255,223,161,80,255,34,26,17,255,0,32,10,9,7, +170,167,87,22,255,198,92,21,255,196,99,21,255,196,95,21,255,198,92,21, +255,195,99,22,255,192,106,29,255,206,127,43,255,217,141,60,255,223,146,70, +255,224,165,81,255,220,148,63,255,212,124,39,255,25,19,12,215,0,8,12, +11,9,116,196,116,37,255,218,141,51,255,218,139,55,255,218,142,61,255,215, +143,58,255,24,19,13,212,0,4,10,9,7,156,203,129,50,255,221,150,66, +255,220,148,63,255,25,21,14,227,0,8,10,10,7,159,204,134,59,255,225, +160,84,255,225,169,88,255,36,29,19,255,0,12,15,14,10,170,204,130,51, +255,220,142,59,255,218,139,55,255,21,18,12,249,0,8,11,10,8,142,206, +145,67,255,226,172,95,255,227,174,98,255,32,26,17,255,4,4,4,28,0, +8,11,10,8,198,198,117,37,255,215,125,38,255,211,122,36,255,28,21,13, +215,0,8,13,11,8,96,174,91,23,255,202,107,23,255,202,103,23,255,22, +17,9,255,0,12,11,10,6,170,176,91,23,255,202,103,23,255,203,108,24, +255,21,15,10,238,0,8,11,10,8,142,206,145,67,255,226,170,91,255,224, +160,85,255,30,24,17,255,4,4,4,28,0,8,11,10,8,198,209,149,70, +255,224,160,77,255,222,158,75,255,31,25,16,212,0,8,12,11,9,127,198, +116,35,255,215,125,38,255,211,122,36,255,28,21,13,255,4,4,4,28,0, +52,13,12,8,170,195,112,30,255,209,110,30,255,207,105,30,255,25,20,12, +255,0,24,15,14,10,170,213,158,80,255,226,172,95,255,224,164,85,255,33, +27,18,255,0,12,15,14,10,170,210,143,65,255,224,168,87,255,224,165,81, +255,25,21,14,232,0,8,10,10,9,153,208,147,67,255,224,166,83,255,222, +158,75,255,34,26,17,255,0,12,15,14,10,170,211,149,76,255,223,149,70, +255,219,146,60,255,25,20,14,235,0,8,10,10,9,150,204,134,59,255,224, +156,83,255,224,165,81,255,33,27,18,255,0,20,15,14,10,170,211,150,70, +255,226,170,91,255,226,172,95,255,33,26,18,255,0,16,9,9,8,150,101, +74,38,255,198,145,77,255,206,157,87,255,202,151,79,255,197,141,74,255,200, +146,75,255,180,126,57,255,21,19,14,227,5,5,4,28,0,16,8,7,5, +113,43,28,14,255,187,96,22,255,181,93,22,255,98,55,21,255,68,42,17, +255,77,46,18,255,129,72,22,255,174,89,21,255,83,47,18,255,11,9,6, +221,0,28,6,6,5,28,16,14,11,195,108,76,35,255,210,141,59,255,218, +162,81,255,167,118,54,255,16,14,11,221,5,5,5,14,0,12,15,13,10, +170,211,149,76,255,224,168,87,255,223,154,80,255,31,25,16,255,0,20,6, +6,5,57,34,27,17,255,203,122,36,255,208,124,41,255,109,76,34,255,13, +12,10,142,0,32,13,11,8,170,176,91,23,255,202,93,21,255,196,99,21, +255,28,19,9,170,0,8,11,9,6,85,132,71,21,255,195,99,22,255,103, +59,20,255,11,10,6,170,3,3,2,25,6,6,5,110,55,35,16,255,198, +113,29,255,212,134,51,255,41,32,20,210,0,68,21,19,14,215,217,163,86, +255,49,38,24,255,0,12,11,10,8,82,54,43,27,255,200,135,59,255,210, +137,59,255,207,131,50,255,205,127,44,255,199,117,36,255,195,111,28,255,187, +101,24,255,93,54,22,255,19,15,10,227,7,6,6,28,0,8,10,9,7, +170,195,109,32,255,218,138,53,255,224,158,81,255,223,173,95,255,219,167,94, +255,217,169,94,255,218,171,97,255,217,166,92,255,208,136,59,255,110,68,27, +255,19,15,10,227,6,6,5,28,0,12,12,11,7,170,61,42,20,255,188, +106,33,255,208,134,55,255,215,163,82,255,217,166,92,255,216,167,88,255,216, +167,89,255,211,150,70,255,146,94,39,255,26,21,15,229,9,8,6,28,0, +12,12,10,7,170,51,32,14,255,151,80,22,255,169,91,22,255,173,86,22, +255,169,88,22,255,173,86,22,255,180,92,21,255,194,98,21,255,196,95,21, +255,192,97,21,255,31,21,10,170,0,12,12,10,7,170,57,37,18,255,189, +107,34,255,212,149,67,255,217,166,92,255,217,166,92,255,218,171,97,255,215, +163,82,255,205,126,48,255,116,72,29,255,20,16,11,227,6,6,5,28,0, +8,11,9,6,68,126,68,21,255,191,98,22,255,194,98,21,255,192,97,21, +255,192,97,21,255,191,98,22,255,177,91,22,255,26,19,9,142,0,12,12, +10,7,170,58,37,17,255,185,107,30,255,208,134,55,255,216,167,88,255,218, +171,97,255,217,166,92,255,213,148,72,255,204,130,51,255,209,141,60,255,211, +159,76,255,30,25,17,170,0,8,10,10,7,167,210,155,77,255,228,178,99, +255,224,165,81,255,221,165,86,255,217,166,92,255,218,169,93,255,217,166,92, +255,214,156,81,255,206,135,51,255,116,72,29,255,20,16,11,227,6,6,5, +28,0,8,13,10,6,57,115,62,20,255,169,91,22,255,165,86,22,255,24, +18,9,167,0,24,12,10,7,88,117,63,20,255,186,100,23,255,191,107,32, +255,35,27,16,144,0,8,10,10,7,170,210,155,77,255,228,178,99,255,221, +152,70,255,24,19,13,255,0,8,12,10,7,170,58,36,15,255,157,79,22, +255,151,80,22,255,58,35,15,255,11,9,6,57,0,8,12,10,7,85,157, +81,20,255,197,99,20,255,192,97,21,255,28,20,9,170,0,8,11,9,6, +57,115,62,20,255,189,94,24,255,198,117,37,255,213,157,76,255,218,171,97, +255,217,169,94,255,214,161,85,255,213,157,76,255,212,149,67,255,208,134,55, +255,205,126,48,255,143,96,40,255,28,26,19,229,8,8,7,28,0,8,13, +12,8,85,141,74,24,255,190,94,23,255,183,95,24,255,183,95,24,255,187, +93,24,255,189,97,22,255,181,93,22,255,177,91,22,255,169,88,22,255,89, +52,20,255,21,18,12,227,9,9,8,28,0,12,18,17,13,181,103,74,40, +255,207,146,74,255,214,156,81,255,210,144,67,255,208,138,55,255,207,129,52, +255,205,133,48,255,205,126,48,255,151,101,42,255,28,26,19,232,9,8,8, +28,0,8,13,12,10,110,186,127,63,255,214,156,81,255,213,158,80,255,213, +155,80,255,214,156,81,255,214,153,75,255,213,148,72,255,213,148,72,255,211, +150,70,255,159,111,54,255,28,25,19,241,9,8,8,31,0,12,18,17,13, +181,103,74,40,255,208,156,81,255,214,156,81,255,208,138,55,255,209,137,60, +255,213,158,80,255,213,155,80,255,213,160,84,255,215,160,88,255,213,163,84, +255,30,24,17,178,0,8,12,11,9,93,178,121,53,255,213,158,80,255,210, +143,65,255,211,146,62,255,213,148,72,255,215,163,82,255,213,158,80,255,212, +149,67,255,209,141,60,255,153,106,49,255,28,25,19,235,9,9,8,31,0, +12,18,15,11,173,66,43,21,255,187,101,32,255,207,132,52,255,210,144,67, +255,213,148,72,255,214,156,81,255,216,167,88,255,214,156,81,255,176,128,65, +255,46,39,27,255,0,12,15,14,10,85,181,111,42,255,215,136,52,255,213, +125,40,255,211,122,36,255,212,123,37,255,210,123,39,255,202,122,37,255,31, +24,14,170,0,8,12,11,9,88,164,89,29,255,203,122,36,255,199,117,36, +255,30,23,15,212,0,12,15,13,10,127,187,133,62,255,213,148,72,255,208, +138,55,255,31,24,16,170,0,8,13,12,10,85,172,104,37,255,209,134,54, +255,206,135,51,255,32,25,17,212,0,12,15,13,10,127,181,116,46,255,211, +143,62,255,210,153,71,255,29,24,16,178,0,8,13,12,10,91,178,121,53, +255,213,154,70,255,208,134,55,255,31,25,16,210,0,20,15,14,10,125,179, +110,42,255,210,135,55,255,208,139,65,255,26,21,15,184,0,8,14,13,9, +85,179,117,44,255,217,165,82,255,213,163,84,255,27,23,16,221,0,12,14, +12,9,136,174,103,39,255,206,127,43,255,199,117,36,255,31,24,14,170,0, +8,12,11,9,88,164,89,29,255,202,118,35,255,196,114,33,255,29,22,14, +210,0,12,14,12,9,125,169,95,30,255,202,119,37,255,199,119,39,255,24, +19,13,190,0,8,14,12,9,85,170,95,29,255,198,113,29,255,199,116,34, +255,204,128,47,255,206,135,51,255,204,129,49,255,204,129,49,255,208,134,55, +255,211,149,76,255,192,140,73,255,95,74,39,255,17,15,12,85,0,16,14, +12,9,198,211,150,70,255,206,152,81,255,31,26,20,255,7,7,6,48,0, +16,15,13,10,170,211,149,76,255,226,170,91,255,226,172,95,255,35,28,18, +255,0,20,15,14,12,218,171,120,60,255,219,154,70,255,41,31,20,255,4, +4,3,28,0,104,17,16,12,170,219,179,116,255,232,193,137,255,232,199,135, +255,40,33,23,255,0,12,10,10,9,76,62,50,31,255,20,18,13,167,0, +12,11,10,8,76,58,46,29,255,20,18,13,167,0,16,13,12,10,170,210, +150,71,255,223,147,72,255,221,150,66,255,26,21,15,210,0,4,11,10,8, +119,211,159,84,255,229,184,114,255,230,186,123,255,30,26,19,255,0,16,12, +11,9,93,137,90,40,255,223,167,94,255,228,180,111,255,167,133,80,255,17, +16,14,227,11,11,10,170,12,11,9,170,12,11,9,170,12,11,9,119,7, +7,6,57,0,36,7,7,6,62,21,18,12,227,157,92,28,255,203,105,26, +255,197,106,26,255,82,48,21,255,14,12,7,173,5,5,4,8,0,16,8, +7,5,28,26,19,11,227,103,68,25,255,158,96,29,255,57,41,22,255,13, +12,10,241,33,26,16,255,146,88,31,255,66,47,23,255,12,10,9,201,6, +5,5,14,0,32,8,7,5,57,30,22,11,255,15,12,8,96,0,8,10, +10,7,130,190,104,27,255,209,118,30,255,211,117,34,255,27,21,14,255,0, +24,13,12,10,170,199,122,39,255,218,130,51,255,223,146,70,255,30,24,17, +255,0,12,23,22,18,139,30,27,21,170,16,15,11,255,89,59,26,255,203, +110,28,255,196,113,31,255,122,81,33,255,186,117,43,255,216,129,51,255,184, +126,57,255,38,34,25,255,24,22,19,221,33,30,24,170,15,15,12,28,0, +12,24,22,19,142,32,31,25,170,21,20,16,198,90,71,45,255,223,179,110, +255,226,172,95,255,221,150,66,255,143,100,44,255,22,21,17,227,28,27,21, +170,29,28,22,170,13,13,12,42,0,36,8,8,8,11,25,24,20,142,39, +35,28,170,30,28,23,170,29,27,22,170,29,27,22,170,29,27,22,170,29, +27,22,170,29,27,20,170,23,21,16,170,14,13,11,34,0,52,13,12,10, +159,142,86,31,255,208,116,35,255,201,119,38,255,32,26,17,255,5,5,4, +28,0,12,14,13,11,170,216,167,97,255,231,184,124,255,231,193,128,255,181, +146,92,255,52,44,33,255,90,71,45,255,201,155,88,255,223,173,102,255,228, +179,115,255,230,183,123,255,230,184,119,255,39,32,22,255,0,24,12,12,11, +170,206,139,61,255,226,164,91,255,228,174,103,255,39,32,22,255,0,48,6, +6,5,28,9,9,8,142,56,46,31,255,222,180,113,255,230,187,119,255,222, +180,113,255,23,21,16,255,0,36,15,14,12,164,79,59,30,255,209,128,42, +255,211,127,44,255,171,117,46,255,18,15,11,170,0,16,9,9,8,116,33, +28,16,255,161,94,28,255,199,107,26,255,65,40,18,255,8,7,5,255,25, +20,12,255,198,113,29,255,210,120,33,255,217,133,50,255,27,23,16,255,0, +8,7,7,6,23,34,28,19,198,46,36,25,255,39,31,22,255,41,33,22, +255,59,46,28,255,51,40,26,255,61,47,28,255,180,133,71,255,227,175,100, +255,226,175,103,255,181,143,88,255,17,16,12,142,0,8,11,11,10,170,214, +166,97,255,229,179,114,255,228,185,111,255,161,121,68,255,23,21,16,227,23, +22,18,170,22,21,17,170,16,15,13,170,11,11,8,147,8,8,7,85,0, +40,14,13,11,170,181,143,88,255,228,185,123,255,218,168,97,255,70,54,35, +255,9,9,8,113,0,12,11,10,8,85,120,87,45,255,223,183,120,255,231, +190,132,255,167,135,80,255,24,22,19,227,19,18,16,170,19,18,16,198,95, +80,46,255,226,193,129,255,228,187,129,255,186,148,87,255,15,14,12,170,0, +8,10,10,9,85,155,113,64,255,229,196,132,255,232,191,133,255,179,142,90, +255,27,25,20,227,18,18,15,170,19,18,16,198,90,71,45,255,222,175,101, +255,227,174,98,255,228,185,111,255,28,25,19,255,0,8,7,7,6,23,34, +28,19,198,49,35,22,255,39,29,18,227,12,11,9,85,0,8,8,7,7, +28,33,26,16,198,52,39,23,255,47,35,22,227,13,12,8,85,0,8,8, +8,7,28,33,30,24,227,201,157,100,255,230,186,123,255,181,137,74,255,16, +15,11,207,6,6,5,23,0,24,11,10,8,28,27,21,12,193,26,19,11, +255,23,18,10,255,23,18,10,255,24,18,11,255,24,18,11,255,26,20,11, +255,35,27,16,255,42,31,19,241,17,14,10,85,0,28,9,9,8,144,91, +67,36,255,217,154,72,255,211,150,70,255,69,55,34,255,15,14,12,85,0, +28,6,6,5,11,11,11,10,142,24,22,19,255,167,135,80,255,225,172,104, +255,224,166,83,255,193,126,54,255,16,14,11,170,0,8,13,12,8,85,185, +97,26,255,207,112,28,255,204,110,27,255,71,46,22,255,8,8,7,255,28, +22,13,255,198,107,27,255,193,111,30,255,126,78,31,255,199,139,62,255,226, +184,111,255,27,24,18,255,0,8,11,10,8,170,214,166,97,255,230,187,119, +255,228,179,103,255,143,102,48,255,17,16,12,227,12,12,9,170,13,12,10, +198,46,33,17,255,199,112,28,255,206,111,27,255,204,110,27,255,32,23,13, +176,0,8,12,11,9,136,204,134,59,255,226,172,95,255,228,181,107,255,162, +125,73,255,24,22,19,227,19,18,16,170,19,18,16,198,95,80,46,255,224, +179,109,255,223,173,95,255,173,117,50,255,15,13,10,156,0,8,12,11,7, +99,185,97,26,255,208,112,27,255,204,110,27,255,22,18,11,255,0,40,16, +15,13,170,219,179,116,255,232,194,133,255,231,193,128,255,40,33,23,255,0, +12,16,15,13,170,219,177,112,255,230,187,119,255,224,159,83,255,24,21,15, +255,0,8,11,10,8,164,211,158,82,255,229,184,114,255,230,191,123,255,166, +127,77,255,22,21,17,227,22,21,17,170,20,19,13,170,14,13,11,28,0, +16,12,11,9,170,195,112,30,255,209,106,30,255,206,111,27,255,101,63,26, +255,16,14,11,227,23,21,16,170,29,27,22,170,13,13,12,42,0,16,16, +15,13,170,216,167,97,255,224,158,87,255,216,125,45,255,24,20,13,255,0, +40,17,16,12,170,219,177,112,255,232,195,137,255,231,189,128,255,162,125,73, +255,22,21,17,227,14,14,11,170,13,12,10,198,50,35,19,255,199,112,28, +255,206,111,27,255,204,110,27,255,32,24,13,170,0,8,13,12,8,93,194, +109,33,255,219,139,54,255,224,158,81,255,39,32,22,255,0,40,11,10,8, +170,190,104,27,255,208,112,27,255,204,110,27,255,32,24,13,170,0,8,13, +12,8,85,184,96,25,255,207,112,28,255,204,102,27,255,129,78,28,255,31, +26,16,255,127,84,34,255,219,147,70,255,173,122,62,255,15,14,12,212,6, +6,5,25,0,16,16,15,13,170,213,155,80,255,221,144,68,255,217,130,52, +255,31,25,16,255,0,32,10,9,7,170,189,99,26,255,208,112,27,255,204, +110,27,255,155,87,26,255,72,46,21,255,179,103,36,255,223,156,76,255,216, +170,97,255,134,96,47,255,174,127,71,255,221,167,90,255,223,147,72,255,222, +158,75,255,23,19,14,252,0,8,11,10,8,170,214,166,97,255,231,187,124, +255,230,191,123,255,228,182,117,255,222,175,101,255,64,50,33,255,7,7,6, +229,26,23,19,255,220,175,105,255,228,183,113,255,228,188,117,255,25,21,16, +255,0,8,11,10,8,170,217,176,112,255,232,197,137,255,232,199,135,255,37, +31,22,255,0,12,13,12,10,170,198,117,37,255,215,127,42,255,217,130,52, +255,21,19,14,255,0,8,11,10,8,167,215,172,104,255,232,191,133,255,231, +190,132,255,166,127,77,255,23,21,16,227,18,17,15,170,17,16,12,198,74, +52,27,255,204,117,33,255,211,111,30,255,173,93,28,255,15,12,8,164,0, +8,13,12,8,88,185,97,26,255,208,112,27,255,204,110,27,255,19,16,10, +255,0,12,10,9,7,170,190,104,27,255,212,118,35,255,216,136,51,255,21, +19,14,252,0,8,11,10,8,167,215,172,104,255,232,194,127,255,231,193,128, +255,166,129,77,255,23,21,16,227,19,18,16,170,19,18,14,198,81,59,34, +255,213,144,62,255,215,140,60,255,165,108,40,255,13,12,10,167,0,8,8, +8,7,85,101,63,26,255,206,114,33,255,212,121,33,255,155,92,36,255,23, +21,16,227,22,21,17,170,28,26,21,170,21,20,18,170,13,13,12,164,10, +10,9,85,6,6,6,6,0,28,12,11,9,170,194,112,31,255,212,119,37, +255,216,134,45,255,35,28,18,255,0,24,16,15,13,170,217,171,106,255,231, +187,124,255,228,181,107,255,39,32,22,255,0,12,16,15,11,170,208,134,55, +255,223,156,70,255,221,148,70,255,23,20,14,238,0,8,11,10,8,170,204, +136,55,255,223,156,70,255,222,158,75,255,34,28,19,255,0,12,14,13,11, +170,217,171,106,255,232,189,127,255,230,186,123,255,25,22,16,255,0,8,10, +10,9,167,210,155,77,255,226,172,95,255,224,165,81,255,31,26,18,255,0, +20,15,13,12,170,217,173,104,255,232,191,133,255,231,195,132,255,40,33,23, +255,0,20,10,9,9,133,73,58,36,255,225,184,120,255,231,193,128,255,228, +180,111,255,147,102,48,255,15,13,10,227,8,7,7,28,0,24,12,11,7, +198,100,59,23,255,169,93,26,255,156,91,27,255,174,96,27,255,180,99,27, +255,168,97,27,255,105,62,24,255,18,15,9,255,7,6,6,48,0,24,7, +7,7,28,15,15,12,227,144,114,67,255,219,177,112,255,223,176,102,255,153, +113,62,255,17,16,12,227,7,7,6,28,0,16,16,15,13,170,213,155,80, +255,223,146,70,255,217,129,50,255,27,22,14,255,0,24,12,10,9,195,161, +94,28,255,207,114,32,255,193,114,36,255,23,20,16,255,0,32,12,11,9, +170,191,105,28,255,207,100,28,255,204,110,27,255,26,20,11,204,0,8,6, +5,5,3,26,19,9,198,24,18,9,246,15,12,8,142,0,12,15,13,10, +91,31,24,16,244,51,39,24,255,21,19,14,91,0,68,10,10,9,76,61, +49,30,255,20,18,13,156,0,16,17,15,12,142,27,22,14,232,30,22,13, +255,25,20,12,255,22,18,11,238,21,16,10,255,99,58,22,255,203,113,26, +255,205,111,28,255,131,80,30,255,12,11,9,142,0,8,11,10,8,170,212, +160,85,255,232,191,127,255,231,195,132,255,196,155,91,255,81,59,34,255,41, +32,20,255,54,43,27,255,180,133,71,255,216,144,59,255,208,115,33,255,129, +78,28,255,12,11,7,142,0,8,8,7,7,57,72,52,29,255,215,155,78, +255,227,174,98,255,207,158,94,255,85,63,34,255,36,29,19,255,57,43,26, +255,189,130,66,255,219,149,66,255,212,121,41,255,172,105,33,255,17,15,10, +147,0,8,7,6,6,54,58,40,21,255,198,113,29,255,206,103,27,255,165, +87,24,255,42,28,13,255,21,16,8,255,27,20,10,255,95,60,22,255,202, +105,27,255,206,100,29,255,204,110,27,255,35,24,12,170,0,8,7,7,6, +54,70,50,27,255,212,145,65,255,227,174,98,255,201,155,88,255,59,44,28, +255,23,20,14,255,34,28,19,255,157,104,48,255,211,126,42,255,208,115,33, +255,132,82,29,255,13,11,8,142,0,12,24,18,9,221,108,61,23,255,201, +112,26,255,207,112,28,255,204,110,27,255,158,91,25,255,46,29,13,249,11, +10,6,57,0,8,8,8,7,57,70,50,27,255,212,142,59,255,226,172,95, +255,207,158,94,255,85,63,34,255,41,32,20,255,57,43,26,255,174,124,59, +255,224,170,93,255,229,184,114,255,231,196,128,255,28,25,19,255,0,8,10, +10,9,167,215,169,102,255,232,191,127,255,231,193,128,255,196,154,87,255,77, +59,34,255,41,31,20,255,54,43,27,255,168,113,49,255,212,121,41,255,206, +114,33,255,132,82,29,255,12,11,9,130,0,8,12,11,7,110,188,98,25, +255,206,111,27,255,206,106,25,255,26,19,11,255,0,24,14,12,9,170,199, +117,36,255,221,148,62,255,227,174,98,255,28,26,19,255,0,8,10,10,9, +167,212,161,89,255,224,166,83,255,217,129,50,255,32,24,15,255,5,5,4, +31,7,7,6,136,65,44,22,255,192,106,29,255,203,108,24,255,114,66,23, +255,17,13,8,221,0,12,10,9,7,139,185,97,26,255,208,112,27,255,208, +117,29,255,32,24,13,170,0,8,15,13,8,91,189,99,26,255,215,123,42, +255,226,172,95,255,198,152,87,255,81,58,34,255,176,133,71,255,224,168,95, +255,197,138,62,255,65,47,26,255,133,81,30,255,208,121,37,255,212,115,37, +255,152,98,35,255,12,11,9,142,0,8,10,9,7,147,190,107,25,255,206, +111,27,255,206,106,25,255,158,91,25,255,42,28,13,255,21,15,8,255,26, +19,9,255,114,66,23,255,204,113,25,255,208,115,33,255,173,122,62,255,16, +15,13,150,0,8,8,8,7,71,110,87,51,255,222,180,113,255,224,166,83, +255,209,137,60,255,133,84,32,255,77,50,24,255,89,59,26,255,181,109,32, +255,210,121,35,255,212,121,41,255,171,116,52,255,15,14,12,142,0,8,14, +13,11,170,219,177,112,255,231,187,124,255,228,180,111,255,205,158,90,255,79, +58,32,255,38,29,19,255,49,35,22,255,167,114,46,255,217,146,62,255,219, +154,70,255,169,117,56,255,15,13,12,156,0,8,8,8,7,71,104,80,45, +255,224,183,119,255,232,191,127,255,210,166,97,255,81,60,32,255,39,30,18, +255,52,40,25,255,175,128,66,255,225,173,98,255,228,180,105,255,226,175,95, +255,29,25,18,255,0,8,12,12,11,170,208,138,55,255,222,145,63,255,220, +139,59,255,193,121,50,255,68,50,29,255,38,28,19,255,48,35,23,255,175, +112,44,255,217,142,54,255,217,144,66,255,191,137,66,255,19,16,12,170,0, +8,9,8,8,74,111,82,40,255,216,155,75,255,226,172,95,255,200,151,81, +255,57,41,26,255,27,23,16,255,35,28,18,255,41,32,20,255,39,30,20, +255,25,22,16,227,15,14,10,142,0,12,10,9,7,28,33,24,14,227,135, +81,28,255,206,117,31,255,210,108,33,255,208,110,31,255,171,92,28,255,49, +33,16,252,13,11,8,68,0,8,11,10,8,170,195,108,30,255,212,118,35, +255,217,137,52,255,42,33,23,255,0,12,20,18,15,170,214,156,81,255,221, +148,62,255,214,127,43,255,23,19,12,238,0,8,10,10,7,159,196,109,31, +255,213,119,36,255,212,123,37,255,31,24,14,255,0,12,15,14,10,170,209, +137,60,255,228,172,99,255,230,189,119,255,28,26,19,255,0,8,12,12,11, +170,208,134,55,255,218,137,51,255,214,127,43,255,35,27,16,255,0,20,16, +14,11,170,199,116,34,255,217,132,48,255,224,166,83,255,32,26,19,255,0, +8,10,10,7,34,81,58,34,255,224,178,105,255,226,172,95,255,129,92,40, +255,9,9,8,170,6,6,6,85,6,6,5,113,35,27,16,255,204,117,33, +255,208,117,29,255,110,69,25,255,14,12,7,108,0,8,10,10,7,170,195, +112,30,255,211,115,30,255,211,115,30,255,30,23,13,255,0,12,14,12,9, +170,196,113,31,255,211,120,32,255,214,126,41,255,33,26,18,255,0,8,9, +8,6,28,44,33,19,212,60,42,23,255,46,35,21,255,74,53,31,255,156, +109,53,255,216,167,97,255,228,179,109,255,229,177,110,255,227,184,108,255,168, +123,69,255,23,21,16,227,9,8,8,28,0,12,17,16,14,170,134,98,51, +255,223,166,92,255,132,100,53,255,9,9,8,133,0,20,16,15,13,170,219, +177,112,255,232,191,133,255,231,195,132,255,40,33,23,255,0,20,6,6,5, +45,39,32,22,255,210,129,49,255,172,106,35,255,20,17,13,227,11,11,8, +28,0,100,17,17,14,170,221,189,132,255,235,205,154,255,234,205,155,255,42, +39,29,255,0,16,9,9,8,25,0,20,9,8,8,25,0,20,14,14,11, +170,208,141,61,255,224,168,87,255,228,174,103,255,31,26,20,221,0,4,13, +12,12,130,218,185,127,255,234,202,147,255,232,198,139,255,40,33,25,255,0, +20,17,17,14,176,140,115,71,255,230,202,147,255,232,202,149,255,218,170,101, +255,200,124,43,255,198,117,37,255,198,117,37,255,196,116,37,255,72,52,27, +255,12,11,9,170,0,28,8,8,7,85,37,31,20,255,174,110,41,255,210, +123,39,255,204,120,37,255,130,87,31,255,15,13,10,190,0,28,5,5,4, +113,28,26,19,255,210,143,65,255,220,163,81,255,217,166,92,255,222,173,97, +255,225,176,98,255,42,37,25,255,4,4,4,74,0,56,13,12,10,170,208, +141,61,255,226,172,95,255,228,183,111,255,40,34,25,255,0,24,17,16,14, +170,219,177,112,255,232,194,133,255,233,202,148,255,27,24,20,255,0,8,16, +15,13,85,199,161,102,255,220,166,89,255,211,143,62,255,217,154,72,255,223, +161,80,255,224,169,91,255,225,185,114,255,229,188,124,255,231,190,132,255,231, +200,143,255,227,195,140,255,227,196,138,255,225,195,136,255,44,37,27,170,0, +8,17,16,14,85,200,165,109,255,227,198,142,255,225,191,132,255,227,195,134, +255,231,199,136,255,231,197,132,255,231,194,124,255,229,191,130,255,225,195,136, +255,225,195,136,255,225,191,132,255,49,42,30,198,0,36,18,17,13,105,193, +135,66,255,221,175,102,255,222,186,123,255,223,190,132,255,224,192,135,255,223, +190,132,255,222,186,123,255,221,178,110,255,218,172,105,255,46,39,27,195,0, +48,6,6,6,28,27,26,20,255,216,170,97,255,225,178,104,255,176,136,83, +255,16,15,13,198,0,16,17,17,14,170,221,188,130,255,235,205,154,255,234, +205,155,255,232,204,149,255,228,199,143,255,171,144,96,255,64,57,41,255,154, +126,81,255,227,189,122,255,230,184,119,255,227,171,98,255,34,30,21,255,0, +24,17,16,14,170,221,186,126,255,234,202,147,255,232,192,135,255,44,39,27, +255,0,44,9,9,8,142,25,24,20,255,114,95,53,255,207,169,102,255,227, +187,118,255,226,188,123,255,178,148,95,255,19,18,16,170,0,32,24,22,19, +85,197,145,84,255,227,187,118,255,231,194,124,255,207,173,114,255,61,55,38, +255,8,8,8,136,0,12,10,10,9,108,45,36,21,255,195,116,38,255,207, +122,38,255,139,90,32,255,13,12,8,170,0,4,10,10,9,198,208,140,59, +255,226,170,91,255,231,193,128,255,40,35,27,255,0,36,4,4,3,28,18, +17,13,227,222,189,131,255,234,201,143,255,229,191,130,255,34,30,23,204,0, +8,11,11,10,170,211,158,82,255,226,170,91,255,224,165,81,255,219,154,70, +255,208,132,51,255,206,128,45,255,204,122,41,255,201,120,40,255,196,116,37, +255,111,74,30,255,20,18,13,227,8,8,7,28,0,28,6,6,6,28,28, +26,21,255,222,186,123,255,229,196,132,255,181,144,92,255,16,15,13,212,0, +16,6,6,6,85,25,24,20,255,180,149,101,255,231,205,154,255,232,204,149, +255,227,198,142,255,223,192,138,255,223,193,136,255,230,199,139,255,232,197,141, +255,211,176,122,255,64,57,41,255,8,8,7,113,0,8,6,6,5,14,33, +31,24,227,186,155,107,255,232,204,149,255,233,205,152,255,227,197,140,255,221, +189,132,255,224,192,135,255,228,198,141,255,232,201,141,255,232,192,135,255,231, +197,132,255,41,35,26,255,0,64,17,16,14,139,211,178,120,255,233,202,148, +255,233,202,148,255,56,48,33,255,4,4,4,85,0,104,11,11,10,255,216, +164,89,255,230,191,123,255,227,195,134,255,40,35,27,227,0,28,16,15,13, +227,126,105,69,255,217,176,112,255,225,175,104,255,223,159,76,255,189,124,49, +255,43,35,20,255,9,8,8,57,0,8,10,10,9,133,194,109,33,255,215, +125,38,255,212,124,39,255,144,93,33,255,29,24,16,255,68,53,29,255,186, +123,49,255,128,95,47,255,25,24,20,255,143,119,78,255,230,201,145,255,33, +30,24,255,0,8,11,11,10,170,217,176,112,255,228,182,109,255,222,158,75, +255,212,134,51,255,204,122,41,255,198,117,37,255,200,118,37,255,208,123,39, +255,212,123,37,255,214,121,39,255,217,133,50,255,24,21,15,244,0,8,11, +11,10,170,218,185,127,255,235,203,148,255,233,202,148,255,230,201,145,255,227, +197,140,255,221,187,128,255,221,184,120,255,224,178,105,255,224,164,85,255,189, +129,58,255,39,32,20,255,7,7,6,85,0,8,11,10,8,125,194,109,33, +255,215,125,38,255,213,125,40,255,29,24,16,255,0,40,17,17,14,170,221, +188,130,255,235,201,152,255,232,201,141,255,42,36,27,255,0,12,17,17,14, +170,219,179,116,255,231,187,124,255,228,183,111,255,24,22,17,255,0,8,11, +11,10,170,218,185,127,255,232,197,137,255,227,179,104,255,219,155,72,255,208, +132,51,255,204,122,41,255,202,120,39,255,38,31,19,170,0,16,12,11,9, +170,196,110,33,255,215,113,38,255,213,122,42,255,215,143,58,255,217,166,92, +255,222,186,123,255,225,195,136,255,52,44,33,198,0,16,17,16,14,170,211, +150,70,255,219,140,56,255,213,126,42,255,25,21,14,255,0,40,17,17,14, +170,221,187,128,255,232,199,141,255,228,180,111,255,219,155,72,255,207,128,44, +255,199,119,39,255,200,118,37,255,208,123,39,255,212,123,37,255,214,125,39, +255,212,124,39,255,34,26,15,181,0,8,11,10,10,161,215,172,104,255,234, +201,143,255,234,206,151,255,42,39,29,255,0,40,12,11,9,170,196,110,33, +255,215,125,38,255,212,124,39,255,36,28,17,170,0,8,15,14,10,85,194, +109,33,255,215,125,38,255,212,124,39,255,210,128,41,255,211,135,54,255,225, +176,98,255,231,197,132,255,56,48,33,255,4,4,4,85,0,20,17,16,14, +170,206,135,51,255,217,133,50,255,213,122,42,255,25,21,14,255,0,32,12, +11,9,170,196,110,33,255,215,125,38,255,213,122,42,255,67,51,28,255,6, +6,5,255,40,34,25,255,226,190,127,255,138,110,69,255,7,7,7,255,25, +24,20,255,221,179,112,255,232,191,127,255,232,201,141,255,26,23,19,255,0, +8,11,11,10,170,214,168,101,255,230,187,119,255,228,188,117,255,212,173,105, +255,150,118,67,255,102,86,47,255,111,90,50,255,185,145,88,255,227,187,118, +255,231,195,132,255,232,201,141,255,26,23,19,255,0,8,11,11,10,170,219, +184,128,255,235,205,154,255,234,206,151,255,42,36,27,255,0,12,15,15,12, +170,213,158,80,255,228,182,109,255,230,191,123,255,27,23,18,255,0,8,11, +11,10,170,219,189,132,255,235,205,154,255,232,197,141,255,225,185,114,255,215, +155,78,255,206,135,51,255,205,126,42,255,209,128,42,255,212,121,41,255,181, +111,36,255,39,30,18,255,8,8,7,57,0,8,10,10,9,136,194,109,33, +255,215,125,38,255,212,124,39,255,24,20,13,255,0,12,15,14,12,170,210, +146,71,255,229,183,110,255,231,197,132,255,26,23,19,255,0,8,11,11,10, +170,218,189,127,255,234,199,143,255,231,197,132,255,225,176,106,255,214,153,75, +255,208,138,55,255,205,133,48,255,210,127,45,255,214,134,49,255,179,119,42, +255,37,30,18,255,7,7,6,85,0,12,23,20,14,227,161,115,50,255,222, +167,89,255,227,186,114,255,225,190,130,255,223,198,136,255,227,198,142,255,224, +196,141,255,221,191,134,255,161,130,86,255,33,30,24,229,10,10,9,42,0, +24,15,15,12,170,211,149,76,255,228,182,109,255,231,189,128,255,44,39,27, +255,0,24,17,17,14,170,216,170,97,255,226,172,95,255,224,165,81,255,31, +26,18,255,0,12,13,12,10,170,201,120,40,255,217,133,50,255,216,125,45, +255,25,21,14,212,0,8,11,10,8,144,203,130,52,255,224,166,83,255,228, +174,103,255,40,34,25,255,0,12,17,16,14,170,221,187,128,255,234,201,143, +255,230,191,123,255,28,25,19,244,0,8,10,10,9,164,203,122,50,255,220, +148,63,255,217,141,52,255,23,20,14,255,0,8,14,13,11,108,10,10,9, +28,0,4,13,13,12,170,221,189,134,255,235,205,154,255,234,206,151,255,42, +37,27,255,0,24,11,11,10,255,222,189,131,255,232,195,131,255,224,162,81, +255,36,29,19,255,4,4,4,54,0,28,7,7,6,28,19,17,12,232,93, +66,30,255,183,112,36,255,209,122,38,255,212,120,39,255,159,102,34,255,22, +19,13,255,7,7,6,85,0,24,6,6,5,28,17,16,14,227,149,122,84, +255,227,195,140,255,227,191,134,255,179,142,90,255,17,16,14,227,5,5,4, +25,0,20,15,14,12,170,204,129,49,255,218,141,51,255,213,126,42,255,25, +21,14,255,0,24,8,7,7,91,68,48,25,255,205,127,44,255,220,153,75, +255,99,78,44,255,8,8,7,113,0,28,12,11,9,170,196,110,33,255,215, +125,38,255,212,124,39,255,24,20,13,255,0,124,9,9,8,25,0,40,2, +2,1,23,9,8,6,255,199,116,34,255,215,125,38,255,212,128,45,255,27, +24,16,207,0,8,11,11,10,170,219,184,128,255,235,205,154,255,234,205,155, +255,58,49,35,255,5,5,4,85,0,4,4,4,3,28,16,15,11,227,204, +122,41,255,215,126,40,255,210,123,39,255,32,25,15,170,0,8,13,13,12, +122,208,168,99,255,234,199,143,255,234,204,151,255,63,54,38,255,5,5,4, +85,0,4,4,4,3,28,18,17,13,215,204,127,45,255,214,125,39,255,212, +121,41,255,34,27,15,170,0,8,13,12,10,85,185,112,34,255,215,125,38, +255,212,123,37,255,35,28,16,255,4,4,3,85,0,4,3,3,2,28,12, +10,9,224,198,117,37,255,215,125,38,255,212,124,39,255,34,27,15,178,0, +8,14,13,11,113,206,162,94,255,232,199,141,255,234,207,155,255,63,53,36, +255,4,4,3,113,0,4,3,3,3,28,10,10,9,255,200,118,37,255,215, +125,38,255,210,123,39,255,27,22,14,227,0,12,3,3,2,6,13,11,8, +221,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,5,4,4, +57,0,12,15,14,12,147,206,154,87,255,232,195,137,255,234,204,151,255,63, +54,38,255,5,5,4,85,0,4,4,4,3,28,18,16,13,227,222,189,131, +255,235,205,152,255,234,205,155,255,27,24,20,255,0,8,11,11,10,170,219, +184,130,255,235,205,152,255,234,205,155,255,58,49,35,255,5,5,4,85,0, +4,4,4,3,28,14,12,9,227,199,117,36,255,215,113,38,255,210,123,39, +255,32,25,15,170,0,8,12,12,9,102,194,109,33,255,215,125,38,255,212, +124,39,255,27,22,14,255,0,24,18,16,13,170,217,176,110,255,234,196,143, +255,234,204,151,255,27,24,20,255,0,8,11,10,10,170,204,134,59,255,219, +136,54,255,213,122,42,255,72,50,27,255,8,8,7,255,25,22,14,255,195, +116,38,255,208,123,39,255,142,91,31,255,16,14,9,193,4,4,3,17,0, +12,11,11,8,170,198,117,37,255,219,133,56,255,221,152,70,255,27,23,16, +221,0,8,13,12,10,99,193,113,34,255,223,156,70,255,231,193,128,255,40, +34,25,255,4,3,3,113,17,16,12,227,208,136,59,255,45,36,21,255,4, +3,3,113,10,9,7,207,196,110,33,255,215,125,38,255,210,128,41,255,32, +25,15,170,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,124,39, +255,35,27,16,255,4,4,3,85,0,4,3,3,2,28,12,11,9,227,199, +117,36,255,221,150,66,255,229,191,126,255,32,29,23,210,0,8,13,13,12, +122,204,150,79,255,223,159,76,255,217,141,52,255,84,57,29,255,9,8,6, +170,5,5,4,85,6,6,5,113,27,22,14,255,207,128,44,255,223,147,72, +255,227,187,118,255,34,30,23,207,0,8,12,11,11,170,218,180,119,255,229, +184,114,255,224,167,85,255,50,40,25,255,5,5,4,85,0,4,4,4,3, +28,14,12,9,227,203,125,42,255,217,128,48,255,213,128,45,255,35,27,16, +173,0,8,12,12,11,130,209,163,98,255,235,203,148,255,233,202,148,255,63, +54,36,255,5,5,4,85,0,4,4,4,3,28,15,15,12,227,209,137,60, +255,221,151,68,255,219,147,62,255,23,20,14,238,0,8,10,10,9,150,196, +121,41,255,217,128,48,255,215,133,44,255,40,31,19,255,5,5,5,85,0, +4,4,4,3,28,16,14,11,207,201,120,40,255,217,133,50,255,221,161,76, +255,57,44,28,170,0,8,15,14,12,105,211,165,98,255,232,197,137,255,232, +199,141,255,58,49,35,255,4,4,3,113,0,40,3,3,2,17,12,11,9, +227,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,4,4,3, +62,0,12,12,11,9,170,200,120,41,255,223,159,76,255,230,191,123,255,44, +37,27,255,0,12,18,17,15,170,208,140,59,255,217,133,50,255,213,125,40, +255,27,23,14,195,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212, +124,39,255,25,21,14,255,0,12,17,16,14,170,219,179,116,255,235,201,152, +255,234,204,151,255,27,24,20,255,0,8,10,10,9,170,198,122,41,255,215, +127,42,255,213,125,40,255,27,22,14,255,0,20,12,11,9,170,201,120,40, +255,224,156,83,255,231,190,132,255,40,33,25,255,0,12,10,10,9,85,52, +42,29,255,200,142,59,255,183,119,44,255,72,52,27,255,39,30,18,255,49, +37,22,255,150,99,33,255,196,116,37,255,77,50,24,255,10,9,7,144,0, +12,10,10,9,170,196,115,35,255,215,125,38,255,212,124,39,255,25,21,14, +255,0,12,12,11,9,170,196,110,33,255,214,127,43,255,222,158,75,255,41, +34,24,255,0,24,5,5,4,85,11,11,10,255,130,101,59,255,223,176,102, +255,224,176,101,255,177,137,74,255,18,17,13,227,6,5,5,28,0,12,20, +19,15,85,186,120,49,255,217,142,62,255,217,139,56,255,34,29,19,255,4, +4,3,17,0,20,17,17,14,170,221,188,130,255,235,205,152,255,234,205,155, +255,42,39,29,255,0,24,13,13,10,181,199,119,39,255,212,121,41,255,203, +121,40,255,35,29,17,170,0,100,20,18,15,170,222,186,123,255,234,201,143, +255,232,197,135,255,47,40,28,255,0,64,14,13,11,170,213,160,84,255,230, +187,119,255,231,197,132,255,35,30,22,198,0,4,14,13,11,108,217,176,112, +255,232,193,137,255,231,197,132,255,33,28,22,255,0,24,12,12,11,113,31, +29,22,210,40,35,27,255,41,34,24,255,29,24,16,255,32,26,17,255,146, +92,35,255,214,134,49,255,212,128,45,255,123,81,36,255,15,13,10,142,0, +20,7,7,6,85,28,26,19,252,194,140,71,255,212,127,43,255,202,118,35, +255,97,66,30,255,15,14,10,207,6,6,5,25,0,24,6,6,5,8,15, +13,12,227,111,86,50,255,209,168,102,255,176,136,83,255,85,67,44,255,163, +129,80,255,221,186,126,255,83,69,44,255,7,7,6,170,5,5,5,8,0, +4,9,9,8,108,20,18,13,170,13,12,10,51,0,36,16,15,13,170,217, +176,110,255,232,194,133,255,232,198,139,255,36,33,25,255,0,24,15,15,12, +170,219,179,116,255,232,193,137,255,232,199,135,255,31,26,20,255,0,8,11, +11,10,28,56,48,33,227,98,76,45,255,104,80,45,255,195,154,96,255,227, +186,114,255,226,189,125,255,207,173,114,255,222,188,123,255,231,190,132,255,217, +188,124,255,137,109,70,255,99,86,54,255,78,64,43,255,21,20,16,85,0, +8,12,12,11,28,54,48,35,227,86,72,47,255,74,63,43,255,171,137,84, +255,229,191,130,255,230,191,123,255,230,186,123,255,202,164,105,255,97,80,50, +255,75,64,44,255,72,61,39,255,22,21,17,102,0,36,12,11,11,45,55, +45,30,227,90,71,45,255,78,63,41,255,72,61,39,255,74,63,43,255,72, +61,39,255,72,61,39,255,91,74,46,255,78,63,41,255,22,20,17,102,0, +48,12,12,11,176,132,106,61,255,228,188,125,255,210,172,113,255,42,37,29, +255,9,9,8,62,0,16,17,16,14,170,221,186,124,255,234,199,143,255,232, +201,141,255,232,201,141,255,221,189,134,255,52,46,33,255,6,7,6,227,24, +23,17,255,208,132,51,255,215,133,44,255,212,124,39,255,24,20,13,255,0, +24,17,16,12,170,219,177,112,255,231,187,124,255,228,182,109,255,40,33,23, +255,0,36,9,9,8,74,17,15,12,227,67,51,28,255,162,107,43,255,200, +142,67,255,204,157,91,255,177,140,86,255,74,63,43,255,19,17,16,198,9, +9,8,28,0,32,14,14,11,31,56,46,31,227,192,157,103,255,229,194,128, +255,225,188,124,255,146,112,67,255,11,10,8,164,0,8,7,7,6,28,34, +27,17,255,190,107,33,255,210,121,35,255,146,95,35,255,16,14,11,187,0, +8,9,9,8,170,214,164,93,255,232,194,127,255,231,195,132,255,40,34,25, +255,0,40,13,13,10,170,213,157,84,255,224,166,83,255,221,150,66,255,23, +20,14,246,0,8,12,11,9,113,194,109,33,255,212,119,37,255,210,113,35, +255,168,103,33,255,56,42,23,255,27,23,14,255,38,31,19,255,149,92,30, +255,207,118,32,255,207,113,30,255,124,75,27,255,13,11,8,161,0,28,12, +12,11,176,130,99,59,255,229,191,126,255,211,174,116,255,43,37,28,255,9, +9,8,59,0,16,8,8,7,85,68,58,37,255,214,177,119,255,231,196,136, +255,207,171,114,255,97,80,50,255,54,47,35,255,66,59,41,255,178,148,95, +255,228,189,121,255,224,187,123,255,146,112,67,255,12,12,11,170,0,12,10, +10,9,28,16,15,13,147,29,28,22,221,48,42,31,255,70,61,41,255,66, +57,39,255,70,61,41,255,171,140,92,255,224,170,101,255,224,168,87,255,224, +165,81,255,39,32,22,255,0,64,14,13,11,57,100,82,51,255,222,186,123, +255,226,172,95,255,113,82,38,255,9,8,8,127,0,32,11,9,6,102,11, +10,6,170,11,10,8,170,12,11,9,170,15,13,10,170,15,13,10,170,15, +14,10,170,18,15,11,170,18,15,11,156,12,11,9,28,0,28,6,6,5, +65,40,34,25,255,224,183,119,255,229,195,136,255,171,140,92,255,21,20,18, +142,0,24,11,10,8,102,131,92,46,255,213,145,56,255,214,119,43,255,210, +128,41,255,151,94,32,255,23,21,14,255,10,10,9,85,0,12,10,9,7, +170,191,106,30,255,211,115,30,255,208,114,31,255,141,87,30,255,36,31,19, +255,121,90,42,255,217,168,92,255,205,163,102,255,132,102,59,255,213,172,108, +255,231,193,128,255,35,30,22,255,0,8,11,11,10,164,203,129,50,255,215, +127,42,255,211,117,34,255,166,97,29,255,54,40,21,255,29,23,14,255,38, +31,19,255,120,78,29,255,206,118,33,255,214,127,43,255,224,155,81,255,23, +21,16,255,0,8,11,10,10,170,217,183,116,255,234,201,143,255,232,198,139, +255,202,166,109,255,97,78,50,255,52,46,33,255,58,50,33,255,150,96,39, +255,208,121,37,255,195,112,30,255,83,53,24,255,9,8,6,113,0,8,13, +12,8,96,189,104,28,255,210,120,33,255,214,132,45,255,34,29,19,255,0, +40,17,16,12,170,217,172,102,255,228,180,105,255,228,181,107,255,40,33,23, +255,0,12,17,15,12,170,216,171,101,255,232,191,127,255,231,197,132,255,24, +22,17,255,0,8,11,11,10,167,209,146,72,255,221,151,68,255,213,126,42, +255,172,106,35,255,57,41,22,255,42,32,19,255,43,33,20,252,18,15,11, +85,0,16,11,10,8,170,193,111,30,255,215,113,38,255,220,144,63,255,197, +145,84,255,91,71,44,255,75,62,42,255,75,64,44,255,22,21,17,99,0, +16,14,13,11,170,196,110,33,255,210,115,31,255,210,115,31,255,22,19,11, +227,0,8,16,13,9,113,24,21,15,170,17,15,12,170,18,15,13,170,19, +17,12,142,9,8,8,28,0,8,14,13,11,170,210,146,71,255,220,142,59, +255,213,125,40,255,168,103,33,255,54,40,21,255,29,23,14,255,38,31,19, +255,119,78,30,255,204,116,31,255,210,119,31,255,210,115,31,255,26,20,13, +210,0,8,11,11,10,170,217,179,120,255,234,202,147,255,232,201,141,255,40, +35,25,255,0,40,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31, +255,36,25,13,170,0,8,14,12,9,85,190,105,29,255,210,107,31,255,208, +114,31,255,187,124,42,255,143,111,56,255,210,171,109,255,229,187,128,255,131, +99,54,255,8,8,7,156,0,20,13,12,10,170,194,112,31,255,210,107,31, +255,210,115,31,255,22,19,11,255,0,32,11,10,8,170,193,111,30,255,215, +125,38,255,218,141,59,255,39,33,22,255,5,5,5,28,12,12,11,170,156, +126,83,255,27,24,20,227,5,5,5,23,14,13,11,198,219,177,112,255,232, +191,127,255,230,191,123,255,25,22,16,249,0,8,11,10,8,153,200,120,41, +255,214,127,43,255,213,126,42,255,93,66,32,255,11,11,10,255,34,31,23, +255,206,152,81,255,226,179,111,255,231,189,128,255,232,192,135,255,232,201,141, +255,25,22,18,255,0,8,11,10,10,170,215,171,102,255,228,174,105,255,222, +158,75,255,27,24,16,255,0,12,15,15,12,170,219,177,112,255,232,193,137, +255,232,201,141,255,25,22,18,255,0,8,11,10,10,170,215,172,104,255,228, +182,109,255,221,155,70,255,177,114,46,255,55,42,24,255,35,28,18,255,41, +31,18,255,35,28,17,255,27,22,14,255,17,16,12,187,9,9,8,79,0, +12,10,9,7,170,191,106,30,255,211,115,30,255,210,115,31,255,33,25,14, +255,0,12,21,20,16,170,221,180,116,255,232,193,137,255,232,201,141,255,25, +22,18,255,0,8,11,11,10,170,212,160,85,255,224,156,83,255,218,141,59, +255,175,115,44,255,55,42,24,255,31,25,16,255,38,30,19,255,127,82,30, +255,204,116,31,255,195,112,30,255,82,55,25,255,11,10,8,150,0,12,9, +9,8,28,15,14,12,142,28,25,19,221,46,40,29,255,71,60,38,255,66, +57,39,255,70,61,41,255,193,159,106,255,227,184,108,255,221,153,72,255,155, +98,36,255,13,12,10,170,0,24,17,15,12,170,219,180,112,255,232,197,137, +255,232,201,141,255,40,35,25,255,0,24,14,13,11,170,198,117,37,255,213, +124,38,255,210,121,35,255,23,19,12,255,0,12,11,10,8,170,193,111,30, +255,211,115,30,255,208,114,31,255,23,19,12,207,0,8,14,13,11,85,181, +132,68,255,228,185,117,255,231,193,128,255,54,46,31,255,5,5,4,8,0, +8,21,20,16,178,215,160,88,255,223,147,72,255,206,135,51,255,23,20,14, +170,0,8,12,11,9,102,192,111,31,255,210,108,33,255,208,114,31,255,22, +18,11,255,0,4,10,10,9,113,79,61,38,255,17,16,12,198,0,4,16, +15,13,170,219,179,116,255,231,187,124,255,224,169,91,255,33,28,20,255,0, +20,9,8,8,85,39,33,24,255,217,166,92,255,219,140,56,255,210,121,35, +255,66,44,21,255,7,7,6,133,0,32,6,6,5,74,19,18,12,255,183, +102,30,255,207,105,30,255,210,111,31,255,73,51,24,255,8,8,7,116,0, +24,6,6,6,28,15,13,12,227,144,112,61,255,221,180,116,255,224,178,113, +255,152,116,65,255,18,17,13,221,8,8,7,28,0,24,12,10,9,170,193, +111,30,255,210,107,31,255,210,115,31,255,22,19,11,255,0,28,16,15,13, +227,164,122,63,255,225,185,114,255,192,153,97,255,21,19,16,232,7,7,6, +28,0,24,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,255,23, +19,12,255,0,148,6,6,5,51,11,9,6,85,12,10,7,102,10,8,5, +156,10,8,5,127,8,7,5,184,27,22,12,255,198,105,29,255,211,122,36, +255,220,136,61,255,25,22,16,255,0,8,10,10,9,170,218,181,123,255,234, +202,147,255,232,197,141,255,30,27,21,255,0,12,9,8,6,170,191,106,30, +255,211,115,30,255,210,111,31,255,39,27,14,170,0,8,12,11,11,170,218, +180,119,255,234,196,143,255,232,201,141,255,29,26,20,255,0,12,7,7,6, +28,27,22,14,156,25,22,14,255,32,25,15,210,22,18,11,28,0,8,10, +9,7,150,195,112,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0, +12,9,9,8,170,191,106,30,255,211,111,30,255,208,114,31,255,25,20,12, +204,0,8,12,11,11,170,218,180,119,255,234,202,147,255,232,201,141,255,142, +111,63,255,14,12,9,227,10,9,7,127,8,7,5,181,35,25,14,255,199, +112,28,255,209,118,30,255,209,117,28,255,30,22,13,255,0,16,9,8,6, +167,191,106,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,16,21, +19,16,170,220,178,113,255,232,197,137,255,232,201,141,255,26,23,19,255,0, +12,11,11,10,170,218,181,123,255,234,201,143,255,231,197,132,255,24,22,17, +255,0,8,11,10,10,170,218,181,123,255,234,201,143,255,231,197,132,255,30, +26,21,255,0,12,9,8,6,167,191,106,30,255,211,115,30,255,210,111,31, +255,39,27,14,170,0,8,13,12,8,85,190,105,29,255,213,119,36,255,214, +132,45,255,32,26,17,255,0,24,17,16,14,170,221,186,124,255,234,202,147, +255,232,199,135,255,25,22,18,252,0,8,11,10,8,127,192,111,31,255,210, +107,31,255,208,114,31,255,161,94,28,255,65,43,20,255,145,85,26,255,207, +117,30,255,122,75,29,255,15,14,10,170,5,5,4,8,0,16,11,10,8, +170,196,115,35,255,223,146,70,255,228,183,111,255,25,22,16,252,0,8,14, +12,9,85,190,105,29,255,215,125,38,255,218,141,59,255,30,24,17,195,0, +4,10,10,7,170,193,111,30,255,20,17,11,252,0,4,11,10,8,85,188, +103,27,255,211,115,30,255,209,106,30,255,39,27,14,170,0,8,13,12,8, +85,190,105,29,255,211,115,30,255,210,115,31,255,19,15,10,255,0,12,9, +8,6,167,192,111,31,255,218,137,51,255,227,175,100,255,27,24,18,255,0, +8,11,10,8,147,196,106,33,255,210,108,33,255,210,115,31,255,30,23,13, +255,4,4,3,14,0,8,15,14,12,195,211,149,76,255,229,184,114,255,232, +199,135,255,28,25,19,255,0,8,11,10,8,167,203,129,50,255,215,127,42, +255,210,121,35,255,20,17,11,232,0,12,9,8,6,139,190,105,29,255,211, +111,30,255,209,114,30,255,30,22,13,198,0,8,13,12,10,170,217,173,104, +255,232,193,137,255,232,194,139,255,25,22,18,255,0,12,9,8,8,156,192, +111,31,255,210,108,33,255,210,115,31,255,32,24,13,173,0,8,13,12,8, +88,190,105,29,255,211,115,30,255,208,114,31,255,19,15,10,255,0,12,7, +7,6,28,27,22,14,198,45,36,21,255,52,43,29,244,14,13,11,85,0, +8,13,13,12,88,177,143,90,255,230,194,131,255,226,172,95,255,137,91,36, +255,10,9,7,227,8,8,5,161,10,9,7,167,10,9,7,136,13,10,6, +85,7,6,6,74,0,24,9,8,6,167,191,106,30,255,211,115,30,255,210, +115,31,255,19,15,10,252,0,16,12,11,9,170,208,141,61,255,230,187,119, +255,232,201,141,255,40,34,25,255,0,12,14,12,9,170,196,109,31,255,210, +107,31,255,210,115,31,255,36,25,13,170,0,8,10,9,7,85,155,91,28, +255,208,114,31,255,209,106,30,255,30,22,13,255,0,12,22,21,17,176,222, +186,123,255,234,199,143,255,226,195,135,255,35,29,22,178,0,8,12,11,9, +105,190,105,29,255,211,115,30,255,208,114,31,255,23,19,12,210,0,8,15, +12,8,59,7,6,4,3,0,4,9,9,8,159,204,134,59,255,230,182,119, +255,232,198,139,255,39,33,24,255,0,16,10,10,9,34,15,14,10,198,52, +40,21,255,165,96,28,255,198,113,29,255,185,102,28,255,80,53,25,255,19, +17,12,227,10,9,7,76,0,16,11,10,8,170,195,112,30,255,211,115,30, +255,210,115,31,255,20,16,11,255,0,12,10,9,7,170,192,111,31,255,215, +125,38,255,224,159,83,255,41,33,24,255,0,24,7,7,6,108,24,20,13, +255,146,88,31,255,195,127,38,255,113,77,34,255,15,14,12,210,7,7,6, +28,0,16,12,12,11,28,37,30,18,227,168,99,31,255,206,114,33,255,51, +34,18,255,6,5,5,71,0,20,17,16,14,170,221,186,124,255,234,202,147, +255,232,201,141,255,40,35,25,255,0,24,17,15,10,227,198,105,29,255,194, +109,33,255,62,44,23,255,16,14,11,85,0,100,19,17,12,142,214,171,97, +255,228,183,113,255,227,186,108,255,50,40,25,227,0,64,12,11,9,198,214, +158,85,255,229,183,110,255,228,181,107,255,21,19,14,249,2,2,1,20,8, +8,7,181,210,156,79,255,226,169,95,255,224,155,81,255,33,26,18,255,4, +4,4,28,0,40,3,3,2,28,11,10,8,255,209,138,62,255,223,154,72, +255,221,164,82,255,27,23,16,249,0,16,7,7,6,79,46,38,25,255,197, +151,84,255,222,161,89,255,209,128,42,255,141,91,32,255,15,13,10,218,5, +5,5,11,0,28,15,13,10,139,191,131,60,255,220,168,93,255,168,123,69, +255,14,13,11,227,5,5,5,85,9,9,8,170,105,78,40,255,162,116,61, +255,88,66,37,255,23,21,16,255,11,11,10,255,78,58,35,255,208,150,75, +255,61,46,28,181,0,36,15,13,10,170,216,170,97,255,230,187,119,255,228, +178,113,255,34,28,19,255,0,24,15,13,10,170,215,167,92,255,229,179,114, +255,228,181,107,255,32,27,19,255,0,16,6,6,6,25,5,5,4,198,52, +42,27,255,220,169,97,255,189,142,76,255,35,31,22,255,134,96,51,255,225, +176,106,255,140,106,53,255,6,6,5,255,6,6,6,51,0,28,5,5,5, +28,15,13,10,227,208,136,59,255,218,138,53,255,213,122,42,255,43,31,18, +255,5,5,4,85,0,136,9,8,8,57,57,47,30,255,212,163,93,255,224, +157,85,255,124,90,45,255,10,10,9,147,0,20,15,13,10,170,216,170,97, +255,228,181,107,255,224,165,81,255,194,136,61,255,58,46,29,255,12,12,11, +85,0,4,10,9,7,156,174,91,23,255,202,103,23,255,202,102,21,255,20, +16,9,255,0,24,15,13,10,170,213,155,80,255,227,175,100,255,227,171,98, +255,35,29,20,255,0,32,7,7,6,85,49,33,18,255,183,108,34,255,209, +128,42,255,209,137,60,255,186,134,67,255,95,74,39,255,22,20,15,229,8, +8,7,105,0,44,5,4,4,28,17,15,12,227,216,167,89,255,228,181,107, +255,223,176,102,255,34,28,19,184,0,8,12,11,9,108,180,106,33,255,214, +125,39,255,217,141,52,255,42,33,21,255,4,4,4,85,0,8,11,10,8, +198,211,149,76,255,224,160,77,255,220,144,63,255,34,27,17,255,0,40,12, +10,7,170,189,99,26,255,206,102,25,255,203,100,24,255,30,21,11,176,0, +8,12,10,7,85,167,87,22,255,202,103,23,255,202,102,21,255,27,20,10, +255,4,4,3,68,0,4,4,4,4,28,12,10,7,215,176,91,23,255,203, +104,24,255,202,105,27,255,28,21,13,249,0,24,9,8,8,57,57,47,30, +255,213,167,94,255,228,184,115,255,126,92,47,255,9,9,8,147,0,20,13, +12,10,167,199,131,58,255,220,148,63,255,219,147,62,255,49,38,24,255,6, +6,6,85,0,4,5,5,5,28,15,14,12,227,217,169,94,255,228,183,111, +255,225,174,102,255,31,25,18,241,0,36,5,5,5,28,15,13,10,227,204, +127,45,255,219,133,56,255,221,150,66,255,35,28,18,255,0,68,10,9,9, +85,45,34,21,255,201,110,30,255,192,100,25,255,57,35,16,255,12,10,7, +85,0,24,13,11,6,79,126,68,21,255,191,100,26,255,198,117,37,255,208, +139,65,255,213,155,80,255,214,161,85,255,215,167,92,255,216,167,89,255,215, +160,88,255,49,38,24,170,0,24,7,7,6,76,45,36,24,249,207,164,90, +255,228,183,111,255,143,111,56,255,13,12,10,170,0,28,13,12,8,142,182, +99,25,255,203,108,24,255,202,102,21,255,112,65,23,255,15,13,8,227,6, +6,5,45,0,16,10,8,7,170,171,89,22,255,202,95,23,255,202,103,23, +255,103,64,26,255,20,18,13,255,79,61,36,255,222,173,97,255,227,179,104, +255,224,172,97,255,226,171,99,255,224,176,93,255,36,29,19,207,0,8,12, +10,7,113,176,91,23,255,202,95,23,255,202,102,21,255,27,20,10,255,4, +4,3,74,0,4,4,4,4,28,11,9,6,215,187,101,24,255,216,134,45, +255,226,172,95,255,23,21,16,241,0,8,10,10,9,161,212,160,85,255,226, +172,95,255,222,158,75,255,51,39,24,255,6,6,6,85,0,4,4,4,3, +28,11,10,6,215,176,91,23,255,202,102,21,255,191,102,22,255,22,17,9, +170,0,8,12,10,7,85,167,87,22,255,204,105,25,255,217,133,50,255,35, +28,18,255,0,40,15,13,10,170,199,116,34,255,212,114,35,255,218,139,55, +255,33,27,18,255,0,12,15,13,10,170,213,160,84,255,227,175,100,255,224, +165,81,255,25,21,14,235,0,8,13,11,8,108,184,96,25,255,203,96,24, +255,202,95,23,255,27,20,10,255,4,4,3,71,0,28,10,9,7,170,187, +101,24,255,216,134,45,255,224,167,85,255,54,42,27,255,6,6,6,85,0, +28,10,9,7,170,171,89,22,255,202,103,23,255,202,102,21,255,29,21,10, +170,0,4,11,9,6,42,137,77,24,255,211,136,56,255,215,167,92,255,216, +166,95,255,213,163,84,255,33,28,18,161,0,8,11,10,8,130,184,100,25, +255,203,100,24,255,202,102,21,255,27,20,10,255,4,4,3,74,0,4,4, +4,4,28,11,9,6,215,176,91,23,255,202,103,23,255,202,95,23,255,28, +21,11,190,0,8,10,10,9,161,212,161,89,255,228,174,105,255,223,161,80, +255,33,28,18,255,0,40,10,9,7,167,171,89,22,255,202,103,23,255,202, +102,21,255,29,21,10,170,0,8,12,10,7,85,167,87,22,255,202,103,23, +255,203,108,24,255,68,47,25,255,6,6,5,255,31,26,20,255,220,168,93, +255,220,177,101,255,110,80,41,255,12,11,9,150,0,16,10,9,7,170,171, +89,22,255,202,103,23,255,202,102,21,255,20,16,9,255,0,32,10,9,7, +170,193,111,30,255,219,136,54,255,224,165,81,255,27,24,16,255,0,4,7, +7,7,28,21,20,16,181,10,10,9,85,0,4,12,11,9,170,204,130,51, +255,218,141,51,255,211,122,36,255,32,23,13,187,0,8,13,11,8,85,167, +87,22,255,203,100,24,255,208,105,29,255,23,19,12,255,4,4,3,28,11, +10,8,181,211,158,82,255,229,183,110,255,228,183,111,255,228,183,113,255,228, +181,107,255,27,23,16,229,0,8,10,10,9,150,192,111,31,255,208,112,27, +255,203,108,24,255,21,17,10,255,0,12,15,13,10,170,216,170,97,255,229, +183,110,255,228,181,107,255,25,21,16,235,0,8,11,10,8,142,194,116,33, +255,209,106,30,255,203,108,24,255,27,20,10,255,4,4,3,74,0,36,10, +8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,42,28,13,255,6, +5,5,48,0,4,6,6,6,28,21,19,14,255,221,175,102,255,229,179,114, +255,228,181,107,255,24,20,15,246,0,8,12,11,9,127,190,104,27,255,206, +106,25,255,202,103,23,255,27,20,10,255,4,4,3,74,0,4,4,4,4, +28,11,10,6,215,176,91,23,255,204,105,25,255,207,122,38,255,28,22,15, +238,0,36,5,5,5,28,15,13,10,227,195,111,28,255,204,105,25,255,197, +100,22,255,22,17,9,224,0,24,15,13,10,170,216,170,97,255,229,184,114, +255,228,181,107,255,34,28,19,255,0,24,10,9,7,170,174,91,23,255,202, +103,23,255,202,102,21,255,20,16,9,252,0,12,10,9,7,170,171,89,22, +255,202,107,23,255,206,111,27,255,22,17,11,252,0,8,8,7,7,45,73, +59,36,255,218,174,105,255,228,178,107,255,89,67,36,255,7,7,6,113,0, +4,5,5,4,28,20,18,13,255,199,110,30,255,202,105,27,255,88,54,23, +255,10,9,7,113,0,8,13,11,6,85,167,87,22,255,202,95,23,255,202, +90,23,255,32,24,13,255,4,4,3,178,19,16,12,238,212,163,93,255,66, +52,31,255,5,5,5,184,14,13,11,255,205,133,48,255,212,114,35,255,208, +117,29,255,29,22,14,255,0,16,12,11,9,85,101,74,38,255,189,121,49, +255,185,104,32,255,180,98,25,255,180,93,23,255,154,82,23,255,75,44,18, +255,11,9,6,144,0,32,10,9,7,170,157,79,22,255,202,102,21,255,202, +102,21,255,22,17,9,255,0,28,14,13,11,224,136,98,53,255,217,165,82, +255,213,145,56,255,150,92,35,255,19,16,12,173,5,5,5,8,0,28,10, +8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,20,16,9,252,0, +28,7,7,6,59,43,35,24,255,221,175,102,255,223,178,106,255,134,98,51, +255,14,13,11,142,0,24,10,9,7,167,171,89,22,255,202,103,23,255,202, +102,21,255,20,16,9,255,0,144,12,10,7,170,46,29,13,255,140,74,21, +255,165,86,22,255,167,87,22,255,165,86,22,255,167,87,22,255,185,95,22, +255,198,97,23,255,206,111,27,255,221,146,66,255,23,19,14,249,0,8,10, +10,9,153,212,161,89,255,229,183,110,255,224,165,81,255,28,23,15,255,0, +12,10,8,7,156,171,89,22,255,202,103,23,255,202,102,21,255,31,21,10, +170,0,8,10,10,9,167,212,160,85,255,228,177,105,255,222,158,75,255,27, +23,16,255,0,40,10,8,7,170,167,87,22,255,202,103,23,255,202,102,21, +255,20,16,9,238,0,12,10,8,7,164,171,89,22,255,202,103,23,255,203, +100,24,255,22,18,11,235,0,8,10,10,9,167,214,164,93,255,228,182,109, +255,223,154,80,255,207,120,36,255,189,94,24,255,167,87,22,255,167,87,22, +255,187,96,22,255,198,93,23,255,202,93,21,255,198,96,21,255,26,19,9, +227,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +15,9,252,0,16,17,15,12,170,216,170,97,255,229,183,110,255,224,164,85, +255,29,24,16,255,3,3,2,28,0,8,12,11,9,198,211,149,76,255,221, +151,68,255,219,146,60,255,22,19,13,246,0,8,10,10,9,161,210,155,77, +255,223,147,72,255,213,122,42,255,23,18,12,255,0,12,10,8,7,167,171, +89,22,255,202,103,23,255,202,102,21,255,29,21,10,170,0,8,12,10,7, +85,166,87,23,255,209,118,30,255,218,139,55,255,33,27,18,255,0,24,15, +13,10,170,215,159,92,255,226,169,95,255,218,141,59,255,34,26,15,190,0, +8,13,10,6,85,167,87,22,255,202,103,23,255,198,96,21,255,197,96,22, +255,189,97,22,255,198,96,21,255,198,96,21,255,25,19,10,255,4,4,3, +28,0,20,10,9,7,170,178,92,23,255,210,107,31,255,215,128,44,255,33, +24,14,193,0,8,12,10,7,85,167,87,22,255,202,95,23,255,202,103,23, +255,32,22,11,170,0,4,10,8,7,170,171,89,22,255,24,17,9,249,0, +4,12,10,7,85,163,82,22,255,202,103,23,255,202,102,21,255,29,21,10, +170,0,8,12,10,7,85,166,87,23,255,202,103,23,255,202,102,21,255,20, +15,9,255,0,12,10,8,7,167,170,89,23,255,206,106,25,255,208,115,33, +255,28,21,13,207,0,8,13,10,6,85,167,87,22,255,202,95,23,255,202, +102,21,255,20,16,9,255,0,12,15,13,10,170,214,158,85,255,229,183,110, +255,228,185,111,255,24,20,15,249,0,8,12,11,9,108,176,91,23,255,202, +95,23,255,202,102,21,255,18,15,9,255,2,2,1,8,0,8,8,7,5, +184,171,89,22,255,202,95,23,255,202,102,21,255,34,23,11,173,0,8,12, +11,9,136,212,160,85,255,228,180,105,255,225,165,88,255,31,25,18,255,3, +3,2,28,0,8,8,7,5,178,171,89,22,255,202,103,23,255,202,102,21, +255,30,21,11,170,0,8,12,10,7,85,167,87,22,255,202,103,23,255,202, +102,21,255,20,15,9,255,0,40,7,7,6,28,30,27,21,238,167,111,50, +255,206,110,33,255,199,102,24,255,175,90,22,255,165,86,22,255,167,87,22, +255,167,87,22,255,161,87,22,255,84,48,19,255,18,15,9,227,8,7,5, +28,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +15,9,252,0,16,15,13,10,170,211,159,76,255,229,180,110,255,228,182,109, +255,34,28,19,255,0,12,10,9,7,170,171,89,22,255,202,103,23,255,202, +102,21,255,31,22,10,170,0,8,7,6,6,28,48,31,15,255,189,93,22, +255,202,102,21,255,45,29,14,255,5,5,4,113,0,4,5,5,4,28,22, +20,15,255,220,169,97,255,226,178,103,255,167,118,54,255,15,13,10,133,0, +8,13,11,6,85,167,87,22,255,202,103,23,255,202,102,21,255,19,15,8, +215,0,4,11,9,6,105,121,65,20,255,26,18,9,190,0,4,9,9,8, +167,208,150,75,255,229,183,110,255,228,181,113,255,37,29,20,255,0,24,8, +8,5,218,167,87,22,255,202,93,21,255,198,104,21,255,23,18,10,255,3, +3,2,51,0,20,10,9,7,153,171,89,22,255,202,95,23,255,202,102,21, +255,20,15,9,255,2,2,1,17,0,8,8,7,5,181,184,100,25,255,215, +119,42,255,224,160,85,255,34,28,19,255,0,20,9,8,6,85,31,22,12, +255,166,87,23,255,189,97,22,255,99,60,22,255,15,13,8,170,0,28,4, +3,3,23,13,11,8,227,182,94,23,255,149,87,26,255,19,17,12,227,7, +7,7,23,0,16,15,13,10,170,216,170,97,255,229,179,114,255,228,182,109, +255,34,28,19,255,0,20,9,8,6,130,69,42,18,255,195,95,22,255,35, +24,12,255,5,5,4,76,0,104,10,9,7,28,27,24,16,184,32,27,19, +255,39,29,20,212,13,12,10,85,0,60,13,11,8,170,81,54,28,255,216, +148,67,255,223,161,72,255,220,147,61,255,117,76,32,255,13,11,8,255,44, +33,19,255,207,123,40,255,217,136,50,255,218,142,53,255,156,100,39,255,18, +15,11,227,10,8,7,28,0,12,15,13,8,125,19,14,10,170,14,11,7, +170,10,8,7,170,11,9,6,122,13,10,8,85,8,7,5,153,46,33,21, +255,212,138,51,255,221,151,68,255,191,132,62,255,19,17,12,176,0,12,7, +7,6,76,26,22,15,241,189,129,58,255,219,152,72,255,217,154,72,255,133, +87,38,255,15,13,10,221,6,6,5,28,0,8,15,12,8,113,20,16,11, +170,17,14,10,142,7,6,6,28,0,8,19,16,12,170,200,117,35,255,212, +123,37,255,115,74,30,255,9,8,6,113,0,8,12,11,9,178,104,73,37, +255,206,147,63,255,178,121,53,255,58,46,29,255,46,36,25,255,40,32,21, +252,19,17,12,85,0,36,12,10,9,164,191,131,60,255,223,161,80,255,221, +151,68,255,46,34,21,255,4,4,3,3,0,20,19,16,12,173,208,134,55, +255,223,156,70,255,216,160,81,255,21,19,14,255,0,16,6,5,5,25,17, +14,10,227,67,48,28,255,94,67,35,255,20,17,13,227,6,6,5,113,12, +11,9,198,67,51,30,255,85,62,32,255,25,20,14,255,9,8,6,82,0, +32,10,8,5,170,161,87,22,255,195,90,20,255,187,91,20,255,19,14,8, +255,0,28,15,12,8,119,20,16,11,170,17,14,10,156,10,8,7,28,0, +64,15,12,8,122,18,15,11,170,17,14,10,144,10,8,7,28,0,16,13, +12,10,170,157,96,36,255,211,123,38,255,199,116,34,255,31,24,16,255,6, +6,6,28,0,20,16,13,11,170,197,110,32,255,209,110,30,255,202,103,23, +255,58,36,15,255,8,7,5,113,0,8,10,8,5,85,137,68,18,255,185, +86,20,255,174,88,19,255,18,13,7,255,0,24,12,10,9,170,204,129,49, +255,220,144,63,255,217,133,50,255,26,20,13,255,0,28,7,6,6,76,23, +19,12,244,185,113,36,255,207,129,52,255,173,117,50,255,59,46,28,255,18, +15,13,198,9,9,8,113,6,6,6,11,0,24,15,12,8,133,22,17,11, +170,17,14,10,142,8,7,5,28,0,12,9,8,6,170,202,128,49,255,220, +148,63,255,219,140,56,255,22,19,13,255,0,8,12,10,9,170,200,125,37, +255,218,141,51,255,220,147,61,255,138,86,35,255,13,10,8,227,11,9,6, +170,13,11,8,198,61,41,22,255,202,111,31,255,204,105,25,255,200,105,21, +255,22,17,9,221,0,12,11,9,6,108,14,11,7,170,11,9,6,139,6, +5,3,17,0,12,9,7,6,133,144,75,19,255,185,86,20,255,178,86,19, +255,27,18,8,170,0,8,11,9,6,85,134,70,19,255,181,88,20,255,180, +87,19,255,24,15,7,178,0,12,10,8,5,99,165,86,22,255,206,111,27, +255,213,124,38,255,36,27,17,255,0,24,10,10,9,133,167,112,48,255,222, +166,77,255,223,157,72,255,54,39,23,255,5,5,4,37,0,20,13,11,8, +170,181,93,22,255,206,111,27,255,214,127,43,255,20,16,11,255,0,12,9, +8,8,170,203,129,50,255,222,145,63,255,220,147,61,255,33,26,16,255,0, +12,12,10,7,113,15,12,8,170,13,10,8,122,0,16,10,8,7,170,200, +120,41,255,220,142,59,255,219,146,60,255,27,21,14,255,0,12,13,11,8, +113,18,15,11,170,17,14,10,142,8,7,5,28,0,12,14,12,9,113,20, +15,11,170,17,14,10,153,10,8,7,28,0,16,9,8,6,85,29,21,10, +255,119,62,20,255,153,79,20,255,40,25,11,255,9,8,6,85,0,20,10, +8,7,28,32,24,13,218,68,47,25,255,61,43,24,255,61,46,28,255,61, +47,28,255,61,47,28,255,66,50,29,255,73,55,32,255,66,48,29,255,24, +20,15,85,0,20,7,6,6,79,32,26,17,244,199,132,54,255,208,150,75, +255,122,87,41,255,17,15,10,170,0,32,10,9,7,28,32,23,11,227,53, +33,14,255,34,23,11,255,12,10,7,190,6,5,5,28,0,20,9,7,4, +170,146,76,19,255,197,99,20,255,204,110,27,255,59,41,22,255,6,6,6, +170,10,9,9,113,31,26,18,184,30,25,17,255,29,25,18,255,34,27,19, +255,37,28,18,221,13,11,8,57,0,8,13,10,6,88,144,75,19,255,185, +86,20,255,178,90,19,255,20,14,7,212,0,12,9,7,4,125,157,81,20, +255,212,117,33,255,220,148,63,255,27,21,14,218,0,8,12,10,9,127,192, +111,31,255,208,112,27,255,202,103,23,255,22,16,9,204,0,12,10,8,5, +93,137,68,18,255,185,94,20,255,180,91,19,255,30,20,9,170,0,8,11, +9,6,85,140,67,19,255,202,106,21,255,214,125,39,255,25,20,14,255,0, +12,6,6,5,28,13,11,8,139,20,16,11,170,19,15,10,142,8,7,5, +28,0,8,10,9,5,142,153,79,20,255,195,90,20,255,206,111,27,255,24, +20,13,255,0,12,12,10,9,170,195,113,32,255,211,115,30,255,203,108,24, +255,31,21,10,173,0,8,11,9,6,85,140,70,19,255,185,86,20,255,180, +87,19,255,24,15,7,181,0,32,9,8,6,170,174,91,23,255,215,123,42, +255,221,150,66,255,25,20,14,255,0,32,9,7,4,170,148,77,19,255,181, +92,20,255,180,87,19,255,25,17,8,170,0,8,34,24,13,170,161,102,38, +255,219,154,70,255,220,142,59,255,213,124,38,255,32,24,13,198,0,8,11, +9,6,85,140,70,19,255,185,86,20,255,178,90,19,255,20,14,7,212,0, +12,8,7,5,127,144,78,19,255,185,86,20,255,180,87,19,255,29,19,10, +170,0,8,13,11,8,116,194,116,33,255,209,110,30,255,202,95,23,255,22, +17,9,221,0,12,10,8,5,85,12,9,5,170,10,8,5,130,6,5,3, +8,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,27, +18,8,170,0,8,11,8,6,85,137,68,18,255,185,86,20,255,200,105,21, +255,29,21,12,255,4,4,4,25,10,9,7,139,154,100,47,255,215,148,70, +255,198,131,45,255,46,34,19,255,11,9,6,88,0,12,10,8,5,119,144, +78,19,255,185,86,20,255,180,87,19,255,21,15,8,210,0,32,13,11,8, +170,199,119,39,255,220,144,63,255,221,155,70,255,27,21,14,255,0,20,10, +9,7,170,171,89,22,255,195,98,20,255,183,89,19,255,29,20,8,170,0, +8,11,9,6,85,139,70,20,255,202,103,23,255,211,118,36,255,28,21,13, +201,0,4,8,8,7,57,118,84,39,255,215,159,86,255,219,149,66,255,216, +129,45,255,211,121,34,255,34,25,13,178,0,8,11,10,6,88,146,76,19, +255,185,94,20,255,178,90,19,255,24,18,9,255,0,12,18,15,11,170,203, +122,42,255,215,126,40,255,209,106,30,255,32,22,13,184,0,8,12,10,7, +85,143,72,20,255,185,94,20,255,178,90,19,255,20,14,7,210,0,40,9, +7,4,170,148,77,19,255,180,87,19,255,178,86,19,255,30,21,9,255,5, +5,4,37,8,7,5,28,20,17,13,227,133,89,38,255,215,142,56,255,216, +129,45,255,209,115,32,255,26,19,11,210,0,8,11,9,6,85,142,74,19, +255,185,86,20,255,178,90,19,255,20,14,7,210,0,12,9,7,4,122,143, +75,20,255,203,108,24,255,216,129,45,255,30,23,15,255,0,12,12,10,7, +110,16,13,9,170,13,10,8,122,0,16,9,8,6,105,142,74,19,255,185, +86,20,255,180,87,19,255,23,16,8,255,0,24,15,13,10,170,203,122,42, +255,215,126,40,255,209,118,30,255,24,17,11,255,0,24,9,8,4,170,148, +77,19,255,181,92,20,255,180,87,19,255,23,16,8,198,0,12,9,7,6, +139,159,82,20,255,203,100,24,255,212,121,33,255,28,21,13,255,0,12,12, +11,9,119,81,59,34,255,216,153,71,255,173,117,50,255,21,18,14,255,10, +10,9,244,11,10,8,255,60,35,15,255,173,85,20,255,84,49,17,255,13, +10,6,170,0,12,10,8,5,130,146,79,19,255,193,89,20,255,203,104,24, +255,120,77,31,255,19,17,12,255,117,80,36,255,219,154,70,255,178,121,53, +255,20,17,13,255,45,33,18,255,184,94,21,255,195,90,20,255,205,106,26, +255,30,22,13,255,0,12,7,7,6,82,35,28,18,255,196,114,33,255,148, +80,25,255,32,22,11,255,20,15,9,255,26,18,9,255,88,49,17,255,149, +78,20,255,40,26,11,255,9,7,4,85,0,28,9,7,4,127,140,70,19, +255,181,88,20,255,180,87,19,255,18,13,7,235,0,24,10,9,7,93,104, +69,35,255,201,131,48,255,194,109,33,255,65,42,20,255,12,10,7,170,0, +36,9,7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,23,16,8, +198,0,32,15,14,10,198,188,133,61,255,219,149,66,255,194,115,37,255,17, +15,10,244,0,24,10,8,5,113,144,78,19,255,185,86,20,255,180,87,19, +255,18,13,7,255,0,140,7,6,4,65,53,31,12,255,162,83,19,255,185, +94,20,255,130,70,21,255,31,22,10,255,25,19,10,198,22,17,9,246,70, +40,15,255,169,87,20,255,200,105,21,255,212,123,37,255,28,21,13,221,0, +8,12,10,9,133,200,127,41,255,210,120,33,255,202,95,23,255,19,14,8, +238,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,28, +19,9,170,0,8,12,10,9,133,194,112,31,255,209,110,30,255,202,102,21, +255,21,15,8,235,0,16,9,7,4,57,12,10,5,88,10,8,5,85,0, +12,10,8,5,125,146,79,19,255,181,88,20,255,180,87,19,255,25,17,8, +195,0,12,10,8,5,119,144,78,19,255,185,94,20,255,200,105,21,255,23, +18,10,221,0,8,11,9,8,153,200,123,41,255,212,117,33,255,202,103,23, +255,111,63,20,255,27,20,10,255,20,16,9,246,22,17,9,249,28,20,9, +198,30,21,9,170,24,17,9,215,28,20,9,201,10,8,5,85,0,16,9, +7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,18,13,7,255,0, +16,11,10,8,113,152,104,47,255,214,134,49,255,204,105,25,255,98,54,19, +255,18,13,9,227,13,10,8,170,14,12,9,198,60,41,21,255,199,112,28, +255,202,102,21,255,202,103,23,255,26,19,11,204,0,8,12,11,9,116,187, +101,24,255,202,93,21,255,187,91,20,255,18,13,7,255,0,12,9,7,4, +170,146,79,19,255,181,88,20,255,178,90,19,255,27,17,8,170,0,8,11, +9,6,85,139,70,20,255,202,103,23,255,212,123,37,255,32,24,15,255,0, +24,13,12,10,170,196,114,33,255,206,106,25,255,196,99,21,255,28,19,9, +170,0,8,11,8,6,85,137,68,18,255,181,88,20,255,178,86,19,255,164, +85,21,255,138,73,21,255,175,93,20,255,178,86,19,255,46,28,11,255,6, +5,3,108,0,20,9,7,4,170,146,76,19,255,189,88,20,255,189,88,20, +255,28,19,9,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,178, +90,19,255,27,17,8,170,0,4,9,7,4,167,146,79,19,255,20,14,7, +252,0,4,11,9,6,85,137,68,18,255,185,94,20,255,178,90,19,255,27, +17,8,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,180,87,19, +255,18,13,7,255,0,12,9,7,4,170,146,79,19,255,185,94,20,255,183, +85,19,255,27,19,8,170,0,8,11,9,6,85,140,73,19,255,181,88,20, +255,178,90,19,255,20,15,7,255,0,12,16,14,11,170,208,143,59,255,223, +156,70,255,216,135,49,255,28,22,13,210,0,8,11,9,6,85,140,70,19, +255,185,94,20,255,178,90,19,255,72,39,13,255,10,8,5,218,8,6,3, +170,9,7,4,193,39,24,10,255,160,82,19,255,185,94,20,255,144,74,23, +255,16,13,9,170,0,8,10,9,7,85,145,101,48,255,218,149,67,255,210, +115,31,255,99,57,19,255,10,8,5,227,8,6,3,170,9,7,4,190,30, +20,9,255,158,81,19,255,185,94,20,255,178,90,19,255,27,17,8,170,0, +8,11,8,6,85,137,68,18,255,185,86,20,255,180,87,19,255,18,13,7, +255,0,44,9,9,8,28,13,12,8,142,27,20,10,170,29,21,10,193,24, +17,9,252,22,17,9,232,22,17,9,255,87,49,18,255,181,88,20,255,178, +90,19,255,100,54,17,255,11,10,6,150,0,16,9,7,4,170,146,79,19, +255,181,88,20,255,180,87,19,255,18,13,7,255,0,16,15,13,10,170,208, +141,55,255,223,156,70,255,217,133,50,255,23,19,12,255,0,12,10,8,5, +122,144,78,19,255,185,86,20,255,180,87,19,255,30,20,9,176,0,12,12, +10,7,85,39,26,12,255,155,80,20,255,99,55,19,255,19,16,12,255,12, +11,9,255,18,15,11,255,119,84,38,255,209,137,60,255,138,86,35,255,18, +15,11,178,0,12,10,8,5,130,144,78,19,255,181,92,20,255,178,90,19, +255,39,24,10,255,6,5,3,210,29,20,8,255,169,87,20,255,97,53,18, +255,8,7,5,255,26,21,15,255,212,142,59,255,221,151,68,255,218,142,53, +255,34,25,15,255,0,20,5,5,4,82,16,12,7,255,160,82,19,255,185, +86,20,255,185,86,20,255,52,29,11,255,7,6,4,170,0,20,8,7,5, +85,83,46,16,255,181,92,20,255,178,86,19,255,87,47,14,255,10,8,5, +224,8,6,3,170,9,7,4,190,29,20,8,255,195,104,24,255,217,136,50, +255,221,155,70,255,30,23,15,255,0,16,8,7,5,85,26,18,9,255,107, +59,20,255,151,80,22,255,60,34,15,255,11,9,6,170,0,36,8,7,5, +170,159,82,20,255,202,118,35,255,66,51,29,255,9,9,8,96,0,16,15, +13,10,170,208,140,59,255,223,156,70,255,215,133,44,255,27,20,12,255,0, +20,14,12,7,244,131,67,20,255,176,89,19,255,17,12,6,255,0,184,17, +14,10,85,171,95,28,255,206,123,33,255,208,123,31,255,207,112,28,255,202, +107,23,255,191,98,22,255,170,91,21,255,195,107,22,255,209,123,30,255,212, +132,37,255,214,134,39,255,211,133,40,255,202,121,35,255,29,21,12,164,0, +8,12,10,7,82,168,98,29,255,202,121,35,255,196,120,31,255,194,115,31, +255,190,115,27,255,185,101,26,255,184,100,25,255,199,107,26,255,208,123,31, +255,168,105,37,255,25,21,14,227,9,8,8,28,0,8,8,8,7,28,39, +30,18,249,183,122,42,255,211,133,40,255,210,133,43,255,161,106,41,255,15, +13,10,221,5,4,4,17,0,8,14,11,7,113,148,83,25,255,193,108,24, +255,180,93,23,255,27,18,10,153,0,8,12,9,7,122,144,78,19,255,180, +91,19,255,83,46,16,255,7,6,4,184,0,8,4,4,3,85,28,21,13, +255,202,121,35,255,209,132,42,255,131,87,36,255,10,9,7,255,5,5,5, +28,0,40,10,9,7,68,86,62,31,255,206,131,43,255,214,130,39,255,76, +50,25,255,7,6,6,113,0,16,5,5,4,28,21,17,12,255,202,121,35, +255,210,135,37,255,157,100,38,255,18,15,11,150,0,16,18,15,9,91,161, +88,24,255,105,64,28,255,11,10,8,170,0,12,8,7,7,85,40,28,17, +255,174,91,23,255,42,27,13,173,0,32,10,8,5,116,133,66,16,255,161, +85,17,255,161,78,17,255,25,16,8,221,0,24,15,12,8,119,170,99,29, +255,203,126,36,255,199,127,34,255,27,20,12,210,0,60,13,11,8,122,170, +99,29,255,204,127,37,255,199,119,34,255,27,20,12,198,0,12,4,4,3, +11,18,13,9,255,154,79,19,255,174,88,19,255,92,51,17,255,12,10,7, +198,0,24,11,9,6,147,142,74,19,255,171,90,18,255,159,81,18,255,17, +12,6,255,0,12,8,7,5,142,133,66,16,255,161,85,17,255,161,85,17, +255,21,14,6,215,0,24,10,9,7,198,190,107,25,255,203,104,24,255,196, +99,21,255,21,15,8,255,2,2,1,14,0,20,9,8,6,37,35,28,18, +255,183,112,36,255,212,132,37,255,178,118,41,255,27,23,16,255,5,5,4, +198,0,32,15,12,8,105,142,79,23,255,189,97,22,255,160,83,21,255,18, +13,7,218,0,12,10,8,7,198,196,114,33,255,214,129,37,255,212,132,37, +255,27,21,12,210,0,8,13,11,8,116,192,114,31,255,210,125,33,255,209, +123,30,255,203,113,26,255,177,91,22,255,159,82,20,255,160,83,21,255,165, +85,20,255,168,89,19,255,163,86,18,255,161,78,17,255,23,15,6,170,0, +8,9,7,4,57,99,48,14,255,142,73,17,255,133,66,16,255,19,13,6, +190,0,12,7,6,4,164,135,66,16,255,161,85,17,255,161,85,17,255,25, +16,6,170,0,8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17, +255,19,13,6,227,0,12,10,8,5,176,190,107,25,255,212,127,35,255,214, +134,39,255,30,21,13,255,0,24,12,10,7,170,194,109,33,255,213,132,36, +255,208,122,29,255,28,20,11,255,0,24,9,7,4,147,136,70,17,255,202, +98,21,255,211,126,34,255,27,20,12,255,3,3,2,28,0,8,10,8,7, +195,180,93,23,255,202,102,21,255,202,102,21,255,25,17,10,221,0,8,13, +11,8,65,129,70,22,255,172,88,21,255,144,78,19,255,22,15,7,176,0, +12,10,8,7,198,198,124,37,255,215,136,42,255,214,134,39,255,27,21,12, +212,0,8,12,10,7,79,151,88,26,255,198,116,29,255,192,109,27,255,25, +18,10,167,0,8,12,9,7,82,119,62,20,255,174,89,21,255,154,79,19, +255,22,15,7,181,0,20,5,5,4,68,20,14,7,249,142,73,17,255,143, +74,18,255,45,26,10,255,10,8,5,85,0,76,7,6,6,85,39,30,18, +255,196,121,41,255,213,135,42,255,115,72,30,255,10,9,7,170,0,40,5, +5,4,17,6,5,5,85,5,5,4,45,0,28,9,7,4,142,146,79,19, +255,204,108,23,255,212,126,33,255,30,22,13,255,3,3,3,40,0,36,10, +8,5,125,133,66,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0, +12,10,8,5,127,136,70,17,255,193,97,20,255,203,108,24,255,30,21,11, +193,0,8,13,10,6,85,134,70,19,255,171,90,18,255,159,81,18,255,17, +12,6,238,0,12,8,6,5,144,135,66,16,255,161,85,17,255,161,85,17, +255,23,15,6,170,0,8,10,7,5,85,133,66,16,255,185,94,20,255,209, +123,30,255,23,18,12,255,3,3,2,28,0,4,5,5,4,28,18,15,11, +227,134,72,21,255,158,81,19,255,143,74,18,255,22,15,7,142,0,8,10, +8,5,85,131,65,16,255,163,79,18,255,178,90,19,255,22,16,9,255,3, +2,2,20,0,8,9,7,6,176,144,78,19,255,175,88,18,255,163,79,18, +255,26,16,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +78,17,255,19,13,6,229,0,32,8,7,5,156,144,78,19,255,202,102,21, +255,206,111,27,255,27,20,12,255,0,32,10,8,5,133,135,66,16,255,161, +85,17,255,161,85,17,255,19,13,6,227,0,12,8,7,5,255,172,85,21, +255,189,92,20,255,172,87,19,255,24,16,7,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,12,10,8,5, +127,135,66,16,255,161,85,17,255,161,85,17,255,26,16,7,170,0,8,11, +9,6,85,134,70,19,255,171,90,18,255,159,78,18,255,23,15,6,170,0, +8,9,7,4,57,98,49,13,255,139,71,16,255,133,66,16,255,19,13,6, +193,0,12,7,6,4,176,133,66,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,129,64,16,255,165,87,18,255,180,91,19, +255,20,15,9,255,0,4,5,5,4,17,26,21,15,227,126,75,25,255,178, +95,21,255,142,74,19,255,46,28,11,255,10,8,5,57,0,8,10,8,5, +85,131,65,16,255,161,85,17,255,161,85,17,255,17,12,6,252,2,1,1, +8,0,28,13,11,8,170,199,119,34,255,215,136,42,255,214,139,41,255,28, +20,13,255,0,20,8,7,5,170,135,66,16,255,161,85,17,255,161,85,17, +255,23,15,6,170,0,8,10,8,5,85,131,67,16,255,202,102,21,255,211, +127,36,255,22,17,11,249,0,8,16,14,11,201,101,67,28,255,191,98,22, +255,185,94,20,255,172,87,19,255,26,17,7,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,31,20,8,255,5,5,4,102,0, +4,5,4,4,28,16,13,9,255,164,85,21,255,180,91,19,255,165,87,18, +255,26,17,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +85,17,255,19,13,6,212,0,40,10,8,5,133,135,66,16,255,161,85,17, +255,161,85,17,255,26,17,7,255,3,3,2,136,9,7,4,227,131,67,20, +255,197,104,22,255,198,104,21,255,183,93,19,255,172,87,19,255,26,17,7, +170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,19, +13,6,212,0,12,10,8,5,127,135,66,16,255,193,97,20,255,209,123,30, +255,19,15,10,252,0,8,13,11,8,65,125,68,22,255,174,86,21,255,146, +76,19,255,22,14,7,178,0,12,8,6,5,144,135,66,16,255,161,85,17, +255,161,85,17,255,19,14,6,238,0,24,13,11,8,170,163,87,20,255,180, +91,19,255,165,87,18,255,17,12,6,255,0,24,9,7,4,139,135,66,16, +255,161,85,17,255,161,85,17,255,15,11,6,246,0,12,9,7,6,184,180, +93,23,255,211,115,30,255,213,133,38,255,28,20,13,255,0,16,12,11,9, +170,152,91,31,255,188,105,31,255,115,66,22,255,91,50,16,255,84,46,15, +255,116,59,17,255,118,62,17,255,15,11,6,221,0,16,10,8,5,116,146, +79,19,255,202,103,23,255,209,128,32,255,200,127,41,255,167,106,40,255,197, +122,42,255,210,130,35,255,186,106,27,255,88,51,19,255,102,55,17,255,157, +83,18,255,189,92,20,255,209,123,30,255,29,21,12,224,0,8,7,6,6, +28,41,31,18,235,160,84,23,255,170,87,19,255,45,26,10,255,5,5,4, +170,4,4,4,8,4,4,3,99,15,12,6,255,140,72,17,255,138,71,17, +255,45,26,10,255,10,8,5,85,0,24,8,7,5,142,133,66,16,255,161, +85,17,255,161,85,17,255,19,13,6,229,0,24,13,11,8,170,160,86,21, +255,185,90,20,255,91,50,16,255,7,6,4,255,0,40,8,7,5,150,133, +66,16,255,161,85,17,255,161,85,17,255,15,11,6,246,0,32,8,8,7, +110,74,52,27,255,191,103,24,255,176,89,19,255,34,22,9,255,6,5,3, +57,0,20,8,6,5,161,133,66,16,255,161,85,17,255,161,78,17,255,15, +11,6,252,0,140,12,10,5,85,123,61,16,255,161,85,17,255,161,85,17, +255,22,15,7,255,2,2,1,85,0,8,7,6,4,244,133,66,16,255,167, +88,18,255,189,92,20,255,27,19,10,195,0,8,12,10,7,110,160,83,21, +255,177,85,18,255,161,78,17,255,15,11,6,252,0,12,7,6,4,161,133, +66,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,8,11,9,6, +85,134,70,19,255,171,90,18,255,159,78,18,255,15,11,6,249,0,12,10, +8,5,85,98,49,13,255,135,72,16,255,133,66,16,255,19,13,6,139,0, +8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,255,15,11,6, +246,0,12,7,6,4,164,133,66,16,255,165,87,18,255,178,90,19,255,24, +17,9,212,0,8,13,11,8,105,165,86,22,255,180,91,19,255,159,81,18, +255,19,14,6,255,2,2,1,79,0,44,8,6,5,167,133,66,16,255,161, +85,17,255,161,85,17,255,15,11,6,252,0,16,7,6,6,28,24,19,13, +227,103,59,20,255,157,83,18,255,154,78,17,255,150,81,19,255,154,79,19, +255,158,81,19,255,162,83,19,255,161,85,17,255,159,81,18,255,163,86,18, +255,27,18,8,170,0,8,11,9,6,85,131,67,16,255,165,87,18,255,161, +85,17,255,15,11,6,252,0,12,8,6,5,167,133,66,16,255,161,85,17, +255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,131,65,16,255,175, +88,18,255,191,96,20,255,25,18,10,255,0,24,11,9,6,170,148,77,19, +255,169,82,18,255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,87,47,14,255,23,17,8,255,65, +34,12,255,150,76,17,255,132,68,17,255,41,25,10,255,10,8,5,85,0, +16,8,7,5,150,133,66,16,255,161,85,17,255,161,78,17,255,23,15,6, +170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,4,8,7,5,153,133,66,16,255,19,13,6,238,0,4,10, +8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0, +8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,15,11,6, +252,0,12,8,6,5,167,133,66,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17, +255,31,20,8,255,5,4,4,85,0,4,5,4,4,40,17,14,10,255,200, +120,35,255,207,112,28,255,195,98,20,255,29,20,8,170,0,8,10,8,5, +85,131,65,16,255,163,86,18,255,159,81,18,255,150,76,17,255,137,70,16, +255,135,72,16,255,135,66,16,255,146,75,17,255,159,81,18,255,131,67,20, +255,42,31,17,255,10,9,7,62,0,8,5,5,4,8,26,21,15,227,137, +79,28,255,174,88,19,255,158,83,17,255,137,70,16,255,135,72,16,255,135, +66,16,255,146,75,17,255,159,81,18,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,131,67,16,255,163,86,18,255,159,81,18, +255,17,12,6,255,0,68,2,1,1,8,7,6,4,249,137,67,16,255,165, +80,18,255,154,78,17,255,27,18,8,170,0,16,8,6,5,167,133,66,16, +255,161,85,17,255,161,85,17,255,15,11,6,252,0,16,13,11,8,170,199, +124,36,255,211,125,32,255,200,105,21,255,18,13,7,255,0,12,7,6,4, +164,133,66,16,255,161,85,17,255,161,78,17,255,19,13,6,227,0,16,8, +7,5,122,68,38,13,255,150,83,23,255,174,107,35,255,181,112,38,255,190, +117,39,255,193,114,36,255,143,84,26,255,15,12,8,212,4,4,3,6,0, +12,10,8,5,108,135,66,16,255,161,85,17,255,161,85,17,255,125,65,16, +255,90,47,13,255,121,60,16,255,164,84,19,255,189,97,22,255,177,104,32, +255,194,123,39,255,212,134,41,255,210,124,31,255,200,105,21,255,23,17,8, +218,0,16,10,8,5,167,56,31,11,255,110,55,15,255,118,62,17,255,115, +58,16,255,115,58,16,255,120,63,17,255,95,46,14,255,17,13,6,227,7, +6,4,28,0,16,14,12,7,227,87,43,14,255,154,78,17,255,152,77,17, +255,139,71,16,255,135,72,16,255,135,66,16,255,146,75,17,255,200,105,21, +255,211,127,36,255,214,134,39,255,23,18,12,255,0,12,7,6,4,85,26, +16,7,255,131,67,16,255,145,75,18,255,78,43,15,255,7,6,4,255,0, +40,10,8,5,136,157,81,20,255,210,129,33,255,139,89,36,255,10,9,7, +198,0,16,13,11,8,170,196,113,31,255,206,114,25,255,189,92,20,255,18, +13,7,244,0,16,5,4,4,88,27,19,8,255,141,73,18,255,161,85,17, +255,21,14,6,218,0,112,12,9,7,99,11,8,6,170,10,8,5,91,0, +60,11,10,8,28,32,23,13,227,108,57,19,255,153,82,18,255,154,78,17, +255,146,75,17,255,97,47,14,255,36,24,11,255,108,64,25,255,203,111,30, +255,207,118,32,255,207,118,32,255,189,110,32,255,63,41,20,255,15,12,8, +76,0,8,9,8,6,28,38,27,15,218,51,33,18,255,48,32,17,255,131, +74,24,255,182,97,21,255,176,89,19,255,170,87,19,255,134,72,21,255,37, +25,14,255,15,13,8,144,7,7,6,28,0,12,11,9,8,127,171,99,28, +255,208,123,31,255,203,124,30,255,104,63,27,255,15,13,10,212,7,6,6, +28,0,12,14,11,7,170,142,74,19,255,161,85,17,255,159,81,18,255,27, +18,8,184,0,8,6,5,3,28,27,17,8,227,92,46,13,255,111,55,14, +255,31,20,8,255,8,6,3,198,9,7,4,170,10,8,5,227,22,16,9, +255,61,39,18,255,107,64,26,255,108,66,25,255,32,22,11,255,9,7,6, +170,0,44,10,9,7,156,56,36,19,255,191,114,32,255,175,98,30,255,41, +27,16,255,11,9,6,57,0,12,21,15,10,227,100,56,21,255,160,83,21, +255,80,44,17,255,14,12,7,190,7,6,6,28,0,16,13,10,6,28,29, +20,10,212,21,15,10,144,0,20,12,9,7,85,39,24,10,173,16,12,7, +85,0,32,6,5,3,20,19,13,6,173,21,14,6,255,21,15,6,215,10, +8,5,85,0,24,15,12,8,170,190,98,23,255,203,108,24,255,202,111,23, +255,23,17,10,255,0,60,17,13,10,170,195,112,30,255,211,124,30,255,205, +106,26,255,31,21,12,255,0,12,8,6,5,139,44,25,9,255,135,72,16, +255,104,54,13,255,15,11,6,249,7,6,4,28,0,24,7,6,4,57,44, +25,9,255,137,73,16,255,143,70,16,255,49,25,8,255,8,6,3,184,8, +6,3,85,8,6,3,142,23,16,6,255,130,66,15,255,145,77,16,255,87, +44,12,255,10,8,5,142,0,20,11,9,8,164,53,31,14,255,150,74,19, +255,154,78,17,255,148,76,17,255,65,33,10,255,10,8,5,184,6,5,5, +28,0,16,11,9,6,142,175,102,30,255,207,123,32,255,208,114,31,255,196, +114,33,255,89,56,26,255,17,13,10,255,11,8,6,170,9,7,6,170,11, +8,6,170,15,11,8,170,18,13,9,142,8,6,5,28,0,8,10,8,5, +93,102,53,17,255,159,81,18,255,154,78,17,255,72,37,11,255,11,8,6, +227,9,7,6,170,11,8,6,198,61,36,20,255,196,107,27,255,204,114,27, +255,182,102,31,255,19,14,10,170,0,8,6,6,5,20,26,19,11,198,28, +20,11,255,22,16,9,255,23,16,8,255,27,18,8,255,24,16,7,255,24, +16,7,255,74,39,11,255,139,68,16,255,143,70,16,255,143,70,16,255,20, +13,5,170,0,8,7,6,4,74,87,44,12,255,155,79,18,255,151,73,16, +255,67,34,10,255,9,7,4,198,9,7,4,96,8,6,5,159,27,17,8, +255,137,67,16,255,158,80,17,255,112,56,15,255,10,8,5,167,0,8,7, +5,4,85,74,36,11,255,150,83,17,255,145,77,16,255,55,29,10,255,8, +6,3,198,8,6,3,88,7,6,4,153,39,24,12,255,199,112,28,255,210, +115,31,255,184,108,33,255,17,14,10,198,0,24,11,9,6,170,139,69,18, +255,168,86,19,255,154,78,17,255,17,12,6,235,0,24,7,6,4,85,64, +32,11,255,162,80,19,255,198,96,21,255,109,63,26,255,15,11,8,227,10, +8,7,170,8,7,5,195,29,18,8,255,137,67,16,255,154,78,17,255,114, +59,15,255,11,10,6,164,0,8,9,7,6,85,97,50,16,255,159,81,18, +255,152,77,17,255,74,36,11,255,10,8,5,198,7,6,4,125,10,8,5, +198,61,36,20,255,200,105,29,255,209,122,28,255,180,104,29,255,16,12,9, +170,0,8,12,10,7,170,160,83,21,255,183,89,19,255,174,88,19,255,28, +19,9,187,0,8,14,10,7,85,143,75,20,255,195,98,20,255,189,92,20, +255,21,15,8,224,0,24,7,6,4,85,26,16,7,255,111,55,14,255,132, +67,15,255,39,23,8,255,8,6,3,113,0,68,9,7,6,85,32,22,13, +255,188,112,31,255,193,114,30,255,94,57,25,255,17,13,10,170,0,44,9, +7,4,142,10,8,5,255,10,8,5,198,6,5,3,28,0,24,8,7,5, +85,88,48,19,255,204,114,27,255,208,118,31,255,111,62,26,255,11,8,6, +227,8,7,5,150,10,8,5,116,10,8,5,88,9,7,4,85,6,5,3, +74,0,16,10,8,5,99,114,56,13,255,143,70,16,255,143,70,16,255,18, +12,5,215,0,12,8,7,3,130,118,60,13,255,148,76,17,255,150,76,17, +255,24,16,7,170,0,8,9,7,4,85,114,56,13,255,145,74,16,255,143, +70,16,255,52,28,9,255,8,6,3,198,8,6,3,88,8,6,3,144,23, +15,6,255,130,66,15,255,151,80,16,255,111,55,14,255,10,8,5,144,0, +8,6,5,3,59,59,32,10,255,157,83,18,255,185,90,20,255,97,54,22, +255,14,10,7,227,13,10,6,170,13,10,6,255,84,41,13,255,148,76,17, +255,155,82,18,255,135,66,16,255,14,10,5,159,0,8,9,7,4,85,114, +56,13,255,145,77,16,255,145,74,16,255,55,28,10,255,9,7,4,198,8, +6,3,93,8,6,3,147,25,16,6,255,130,64,15,255,151,80,16,255,111, +55,14,255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,145,77,16, +255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,102,8,6,3, +139,8,6,3,170,9,8,4,113,0,12,10,8,5,91,114,56,13,255,150, +76,17,255,150,76,17,255,17,12,6,252,0,32,7,6,4,85,64,33,11, +255,145,77,16,255,143,70,16,255,56,29,9,255,8,6,3,198,8,6,3, +85,6,5,3,119,14,11,5,255,128,66,15,255,151,73,16,255,143,76,16, +255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +70,16,255,18,12,5,215,0,12,8,7,3,130,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143, +70,16,255,143,70,16,255,20,13,5,170,0,8,7,6,4,71,87,44,12, +255,158,87,17,255,161,85,17,255,103,53,20,255,15,11,8,227,10,8,7, +170,10,8,7,195,33,20,10,255,137,67,16,255,151,73,16,255,111,55,14, +255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,146, +75,17,255,18,13,7,255,0,8,7,6,6,74,24,16,7,255,132,67,15, +255,145,77,16,255,135,72,16,255,14,10,5,170,0,8,9,7,4,85,114, +56,13,255,145,77,16,255,143,70,16,255,58,31,11,255,11,8,6,227,11, +9,6,170,11,8,6,170,10,7,5,170,9,8,4,113,0,12,11,9,6, +161,175,92,24,255,203,108,24,255,198,101,23,255,25,18,10,255,0,20,8, +6,3,147,114,56,13,255,143,70,16,255,143,70,16,255,20,13,5,170,0, +8,9,7,4,85,114,56,13,255,170,87,19,255,199,106,24,255,24,17,11, +255,0,8,6,6,5,28,15,12,6,255,128,66,15,255,145,74,16,255,143, +70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,77,16, +255,143,70,16,255,90,44,13,255,19,13,6,255,10,8,5,255,13,10,6, +255,62,33,11,255,135,72,16,255,151,73,16,255,108,53,13,255,10,8,5, +142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18, +12,5,215,0,40,7,6,4,85,64,33,11,255,145,77,16,255,143,70,16, +255,67,34,10,255,14,10,5,255,49,27,9,255,140,72,17,255,160,85,19, +255,160,85,19,255,110,55,15,255,31,20,8,255,9,7,4,57,0,8,9, +8,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,12,5,215,0, +12,8,7,3,136,118,60,13,255,154,75,17,255,172,87,19,255,24,17,9, +204,0,8,8,7,5,85,95,49,16,255,161,85,17,255,152,77,17,255,71, +34,10,255,9,7,4,198,8,6,3,88,8,6,3,142,23,15,6,255,130, +66,15,255,151,80,16,255,111,55,14,255,14,10,5,170,0,24,9,7,4, +164,118,56,15,255,145,74,16,255,143,70,16,255,16,12,5,224,0,24,9, +7,4,85,85,43,12,255,151,80,16,255,143,70,16,255,55,29,10,255,8, +6,3,198,8,6,3,93,8,6,5,173,45,27,14,255,199,112,28,255,210, +124,31,255,199,119,34,255,19,15,10,221,0,20,13,11,8,170,46,28,11, +255,131,65,16,255,145,74,16,255,137,67,16,255,70,35,11,255,12,10,5, +224,7,6,4,28,0,16,8,6,5,34,37,25,14,255,181,100,28,255,206, +113,31,255,207,123,32,255,199,119,34,255,107,67,28,255,28,20,11,255,28, +19,9,255,84,41,13,255,141,75,16,255,145,74,16,255,159,82,20,255,88, +53,25,255,13,11,8,99,0,8,13,10,6,85,114,60,17,255,148,76,17, +255,143,70,16,255,21,14,6,255,0,12,10,8,5,170,119,61,14,255,145, +77,16,255,135,72,16,255,19,13,6,170,0,24,8,7,3,142,114,56,13, +255,143,70,16,255,143,70,16,255,16,12,5,218,0,24,11,8,6,170,126, +62,15,255,151,80,16,255,112,57,13,255,19,13,6,255,8,6,3,144,8, +6,3,85,9,7,4,113,8,6,3,167,8,6,3,170,8,6,3,170,9, +8,4,113,0,12,10,8,5,91,114,56,13,255,145,74,16,255,143,70,16, +255,61,32,10,255,9,8,4,170,0,32,12,10,7,207,74,36,11,255,139, +74,16,255,79,40,12,255,10,8,5,210,0,16,9,7,4,85,27,17,6, +255,130,66,15,255,143,70,16,255,143,76,16,255,16,12,5,221,0,140,8, +6,3,85,74,39,11,255,145,77,16,255,143,70,16,255,41,23,8,255,7, +6,4,173,5,5,2,85,6,5,3,113,14,10,5,255,129,65,14,255,145, +74,16,255,145,74,16,255,24,16,7,170,0,8,10,8,5,85,112,57,13, +255,145,77,16,255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3, +88,8,6,3,144,23,15,6,255,130,66,15,255,151,80,16,255,111,55,14, +255,10,8,5,144,0,8,6,5,3,59,63,34,10,255,145,77,16,255,143, +70,16,255,55,29,10,255,8,6,3,198,8,6,3,85,8,6,3,144,32, +19,7,255,139,74,16,255,155,79,18,255,135,66,16,255,14,10,5,170,0, +8,6,5,3,57,57,31,10,255,145,77,16,255,143,70,16,255,55,29,10, +255,8,6,3,198,8,6,3,88,8,6,3,144,21,15,6,255,130,66,15, +255,143,76,16,255,146,75,17,255,24,15,7,184,0,8,7,6,4,71,66, +33,11,255,148,79,17,255,143,70,16,255,45,25,8,255,7,5,4,176,7, +5,4,85,8,6,3,85,9,7,4,85,8,6,3,82,0,28,8,7,3, +136,114,56,13,255,143,70,16,255,143,70,16,255,16,12,5,221,0,20,7, +6,4,28,10,8,5,130,19,13,6,170,29,19,8,173,24,16,7,212,27, +18,8,193,20,13,7,246,55,29,10,255,139,74,16,255,143,70,16,255,143, +70,16,255,18,13,5,170,0,8,9,7,4,85,115,54,14,255,143,70,16, +255,143,70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143, +70,16,255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13, +255,145,74,16,255,145,74,16,255,17,11,6,252,0,24,10,8,5,170,119, +61,14,255,145,74,16,255,143,70,16,255,18,13,5,170,0,8,9,7,4, +85,114,56,13,255,143,70,16,255,143,70,16,255,33,20,8,255,5,4,4, +195,8,6,5,198,46,26,9,255,126,62,15,255,132,67,15,255,35,22,8, +255,9,7,4,93,0,12,10,8,5,93,114,56,13,255,143,70,16,255,143, +70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,4,9,7,4,125,114,56,13,255,21, +13,6,210,0,4,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16, +255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145, +77,16,255,143,70,16,255,90,44,13,255,17,12,6,255,12,9,5,255,20, +15,9,255,97,51,20,255,169,87,20,255,161,85,17,255,112,54,15,255,10, +8,5,142,0,8,9,7,4,85,121,60,16,255,174,88,19,255,176,89,19, +255,112,59,17,255,37,23,10,255,26,16,7,255,25,18,8,255,24,15,7, +255,23,16,8,255,18,13,9,198,10,9,7,99,0,16,9,8,6,34,12, +10,7,167,20,14,7,210,21,15,6,255,26,17,7,255,24,16,7,255,26, +17,7,255,70,35,11,255,142,73,17,255,148,76,17,255,152,77,17,255,24, +15,7,170,0,8,13,10,6,96,129,65,18,255,170,87,19,255,170,87,19, +255,24,16,9,255,0,48,5,4,2,76,8,6,3,85,8,6,3,85,8, +6,3,85,7,5,4,85,6,5,3,119,16,11,5,255,129,65,14,255,151, +73,16,255,118,61,15,255,14,10,5,170,0,16,8,7,3,136,114,56,13, +255,143,70,16,255,143,70,16,255,16,12,5,221,0,16,10,8,7,113,109, +67,26,255,184,90,21,255,148,76,17,255,52,28,9,255,8,6,3,198,8, +6,3,88,8,6,3,144,21,15,6,255,130,66,15,255,143,76,16,255,143, +76,16,255,16,12,5,227,0,20,9,8,6,170,67,42,20,255,202,124,31, +255,208,128,33,255,205,106,26,255,104,58,21,255,14,11,7,218,6,5,5, +28,0,16,7,6,4,28,27,17,8,229,102,51,13,255,139,68,16,255,143, +73,16,255,145,74,16,255,71,37,12,255,26,18,9,255,80,50,23,255,204, +122,33,255,208,115,33,255,202,104,25,255,149,78,20,255,52,30,11,255,10, +8,5,85,0,12,14,10,5,170,85,43,12,255,137,73,16,255,77,39,12, +255,14,10,5,227,10,8,5,170,10,8,5,198,46,26,9,255,137,73,16, +255,115,59,14,255,25,16,6,232,8,6,3,31,0,12,6,5,3,28,10, +8,5,119,19,13,6,170,29,19,8,173,26,16,7,210,27,18,8,187,17, +12,6,246,58,30,11,255,151,77,18,255,192,97,21,255,192,97,21,255,24, +16,9,207,0,8,4,4,3,3,25,16,6,235,115,59,14,255,143,73,16, +255,145,77,16,255,108,53,13,255,21,14,6,255,7,6,4,164,10,7,5, +85,8,7,5,147,9,7,4,136,8,6,5,76,0,20,8,6,5,57,58, +33,13,255,188,107,27,255,192,111,31,255,85,51,24,255,18,13,9,187,6, +5,5,20,0,8,11,9,6,156,139,69,18,255,158,83,17,255,148,76,17, +255,23,15,6,170,0,12,9,7,4,85,19,13,6,255,102,51,13,255,128, +66,15,255,81,41,12,255,12,9,5,142,0,108,13,10,8,85,115,60,24, +255,162,75,23,255,121,60,20,255,23,15,8,142,0,60,3,3,2,6,10, +8,5,170,93,48,12,255,123,65,14,255,123,60,14,255,14,10,5,227,3, +3,2,85,12,10,7,170,163,83,24,255,199,99,26,255,193,96,24,255,41, +26,14,227,6,6,5,45,0,24,3,3,2,28,11,8,6,170,106,50,13, +255,129,63,14,255,129,63,14,255,29,18,8,227,6,5,5,31,0,20,13, +10,8,136,144,73,21,255,182,89,21,255,99,55,19,255,14,11,7,187,4, +4,3,3,0,16,9,7,4,113,93,46,12,255,131,66,14,255,121,62,14, +255,16,11,5,170,0,12,7,6,4,28,14,10,5,227,100,50,13,255,110, +59,13,255,103,52,14,255,121,59,18,255,134,69,21,255,32,21,11,255,6, +5,5,198,10,8,7,227,46,28,13,255,104,51,15,255,96,46,13,255,14, +10,5,139,0,44,10,8,7,108,63,37,18,255,176,88,23,255,160,80,21, +255,20,14,9,170,0,8,8,6,5,79,85,41,12,255,131,65,16,255,66, +34,11,255,10,8,5,170,0,144,9,7,4,167,115,56,16,255,165,85,20, +255,112,65,23,255,18,13,9,142,0,60,13,10,8,142,132,68,21,255,162, +80,19,255,141,70,18,255,17,12,6,181,0,12,17,12,6,255,103,54,14, +255,130,66,15,255,31,20,8,255,6,5,3,113,0,32,8,6,3,156,35, +22,8,255,114,58,13,255,110,59,13,255,88,45,11,255,88,42,11,255,92, +47,11,255,104,54,13,255,119,58,14,255,61,32,10,255,10,8,5,224,5, +4,4,20,0,16,11,8,6,85,113,58,22,255,180,90,23,255,140,69,17, +255,123,63,14,255,123,60,14,255,119,56,14,255,120,61,17,255,24,15,9, +167,0,16,12,10,7,133,180,88,27,255,203,107,30,255,199,100,28,255,197, +104,28,255,191,93,28,255,167,78,24,255,132,68,21,255,121,62,18,255,117, +60,18,255,118,57,17,255,108,50,15,255,17,12,6,113,0,12,14,10,5, +227,65,33,10,255,115,59,14,255,115,59,14,255,109,52,14,255,116,57,17, +255,121,59,18,255,139,68,20,255,154,73,19,255,115,62,20,255,33,23,12, +255,9,8,6,71,0,36,2,2,1,8,8,6,3,170,93,50,12,255,125, +64,14,255,123,60,14,255,14,10,5,159,0,12,14,10,5,224,65,33,10, +255,115,59,14,255,115,59,14,255,109,52,14,255,119,61,18,255,129,66,20, +255,148,75,21,255,170,84,21,255,129,67,22,255,37,25,14,255,8,7,5, +57,0,8,5,5,4,23,24,17,9,255,103,54,18,255,132,63,17,255,120, +62,15,255,98,49,13,255,90,45,11,255,94,45,13,255,124,60,17,255,172, +81,21,255,150,78,25,255,44,29,17,255,9,8,6,91,0,24,8,7,3, +102,93,46,12,255,125,64,14,255,121,62,14,255,18,12,5,170,0,28,12, +10,5,227,64,33,11,255,132,66,17,255,158,79,21,255,151,70,22,255,130, +67,21,255,110,53,15,255,108,53,13,255,118,60,13,255,85,43,12,255,21, +14,6,255,7,6,4,57,0,12,14,10,5,227,65,33,10,255,131,65,16, +255,149,72,20,255,133,68,20,255,111,54,16,255,110,53,15,255,138,72,19, +255,163,81,20,255,112,58,19,255,28,20,9,255,8,7,5,57,0,8,9, +7,4,91,96,48,13,255,132,70,15,255,123,60,14,255,14,10,5,161,0, +8,13,10,6,85,148,73,23,255,202,101,27,255,129,67,26,255,18,13,9, +142,0,28,6,5,3,48,17,12,6,227,108,55,13,255,112,55,13,255,35, +22,8,255,9,7,4,57,0,64,32,22,13,255,137,68,22,255,154,73,19, +255,45,26,10,255,8,6,5,144,0,44,8,6,3,68,67,34,10,255,115, +56,16,255,109,52,14,255,16,11,5,147,0,24,5,4,4,11,22,17,11, +227,129,76,28,255,195,95,28,255,186,84,23,255,121,59,18,255,107,51,14, +255,96,46,13,255,90,45,11,255,88,45,11,255,41,24,8,255,12,10,5, +176,0,12,8,6,3,76,88,44,11,255,125,66,14,255,123,60,14,255,18, +12,5,170,0,12,9,7,4,85,92,47,11,255,125,64,14,255,123,60,14, +255,16,11,5,150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123, +60,14,255,114,58,13,255,93,50,12,255,88,44,11,255,92,47,11,255,104, +54,13,255,119,58,14,255,85,43,12,255,21,15,6,255,7,6,4,51,0, +12,12,10,5,221,61,32,10,255,120,62,15,255,123,61,16,255,109,52,14, +255,96,46,13,255,102,51,13,255,115,59,14,255,123,65,14,255,85,43,12, +255,25,16,6,255,7,6,4,51,0,8,8,6,3,74,88,45,11,255,125, +64,14,255,123,60,14,255,114,58,13,255,93,50,12,255,88,45,11,255,92, +47,11,255,104,52,13,255,118,60,13,255,85,43,12,255,21,15,6,255,7, +5,4,40,0,8,8,6,3,74,88,45,11,255,125,64,14,255,123,60,14, +255,114,58,13,255,93,50,12,255,88,45,11,255,92,43,11,255,93,50,12, +255,93,50,12,255,20,13,5,85,0,8,8,6,3,65,88,45,11,255,125, +64,14,255,121,62,14,255,18,13,5,170,0,36,12,10,5,227,59,31,10, +255,115,62,14,255,114,58,13,255,93,50,12,255,88,44,11,255,88,44,11, +255,104,54,13,255,118,60,13,255,123,60,14,255,123,60,14,255,14,10,5, +150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18, +12,5,170,0,12,9,7,4,85,92,47,11,255,125,66,14,255,123,65,14, +255,14,10,5,150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123, +65,14,255,14,10,5,159,0,12,14,10,5,221,70,35,11,255,155,74,20, +255,193,89,26,255,185,91,28,255,172,85,27,255,165,80,24,255,155,78,22, +255,132,66,17,255,90,44,13,255,21,15,6,255,7,5,4,40,0,8,8, +6,3,74,88,45,11,255,125,64,14,255,121,62,14,255,19,13,6,176,0, +12,9,6,4,133,93,50,12,255,131,66,14,255,123,65,14,255,14,11,5, +150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,60,14,255,118, +56,15,255,120,61,17,255,136,67,21,255,118,57,17,255,96,48,13,255,92, +47,11,255,18,12,5,85,0,8,9,7,4,79,104,51,15,255,140,66,17, +255,135,66,16,255,17,12,6,198,0,20,9,7,4,85,92,47,11,255,125, +66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,65,88,45,11, +255,135,66,16,255,136,67,17,255,22,14,7,198,0,12,8,6,3,119,88, +45,11,255,125,64,14,255,123,60,14,255,14,10,5,159,0,12,12,10,5, +210,59,31,10,255,115,62,14,255,118,60,13,255,104,54,13,255,100,50,13, +255,100,50,13,255,114,58,13,255,119,63,14,255,85,43,12,255,21,15,6, +255,7,5,4,40,0,8,8,6,3,74,88,45,11,255,125,66,14,255,123, +60,14,255,18,12,5,170,0,44,12,10,5,227,59,31,10,255,115,62,14, +255,114,58,13,255,100,50,13,255,114,56,13,255,133,66,16,255,160,80,21, +255,176,83,21,255,45,27,12,255,6,5,3,170,0,12,8,6,3,82,88, +45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,7,4, +85,92,47,11,255,131,61,14,255,126,62,15,255,17,11,6,170,0,12,14, +10,5,227,65,33,10,255,115,59,14,255,115,62,14,255,93,50,12,255,88, +44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,255,21, +15,6,255,7,6,4,57,0,24,9,7,4,85,92,47,11,255,125,66,14, +255,123,60,14,255,18,12,5,170,0,24,5,5,4,28,19,13,6,255,84, +42,11,255,115,62,14,255,110,59,13,255,93,50,12,255,84,44,11,255,106, +54,15,255,176,84,23,255,199,100,28,255,188,101,31,255,90,54,25,255,13, +10,8,142,0,24,8,6,3,164,72,37,11,255,131,66,14,255,110,54,13, +255,12,9,5,224,3,3,2,17,0,24,7,6,6,85,30,20,13,255,190, +96,27,255,199,98,24,255,121,69,22,255,13,10,6,190,4,3,3,28,5, +4,2,105,27,17,6,255,114,56,13,255,125,64,14,255,45,26,10,255,8, +7,5,153,0,12,10,7,5,85,96,48,13,255,125,64,14,255,123,60,14, +255,16,11,5,195,0,12,8,6,3,110,92,47,11,255,131,66,14,255,123, +65,14,255,18,13,5,170,0,24,9,7,4,85,92,47,11,255,125,66,14, +255,123,60,14,255,18,12,5,170,0,24,8,7,3,99,93,50,12,255,125, +66,14,255,115,59,14,255,104,54,13,255,88,45,11,255,88,44,11,255,92, +43,11,255,92,43,11,255,92,43,11,255,93,50,12,255,93,50,12,255,20, +13,5,85,0,8,8,6,3,65,88,45,11,255,125,64,14,255,123,60,14, +255,115,62,14,255,93,46,12,255,16,11,5,127,0,28,5,4,4,28,12, +10,5,246,104,54,13,255,115,59,14,255,39,23,8,255,8,6,3,82,0, +12,58,31,9,255,114,58,13,255,119,63,14,255,123,60,14,255,123,65,14, +255,18,12,5,170,0,144,14,10,5,227,59,31,10,255,115,62,14,255,110, +59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,104,54,13,255,115, +59,14,255,123,60,14,255,123,60,14,255,16,11,5,150,0,8,8,6,3, +65,88,44,11,255,125,64,14,255,123,60,14,255,114,58,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12, +255,21,15,6,255,7,6,4,51,0,12,12,9,5,224,63,32,10,255,115, +62,14,255,114,56,13,255,93,50,12,255,88,44,11,255,88,45,11,255,110, +59,13,255,119,61,14,255,85,43,12,255,25,16,6,255,7,6,4,57,0, +12,12,10,5,221,59,31,10,255,115,62,14,255,114,56,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +255,121,62,14,255,16,11,5,167,0,12,12,10,5,218,59,31,10,255,115, +62,14,255,110,59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,88, +45,11,255,88,44,11,255,16,11,5,105,0,24,9,7,4,85,92,47,11, +255,125,66,14,255,123,60,14,255,18,12,5,170,0,48,7,5,4,198,93, +50,12,255,125,66,14,255,123,60,14,255,12,10,5,170,0,8,8,6,3, +65,88,45,11,255,125,66,14,255,123,65,14,255,18,12,5,170,0,12,9, +7,4,85,92,47,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0, +8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,13,5, +170,0,20,3,3,2,11,9,7,4,227,100,50,13,255,123,60,14,255,123, +60,14,255,12,10,5,170,0,8,8,6,3,62,88,45,11,255,125,66,14, +255,123,60,14,255,14,10,5,198,0,8,8,6,3,170,35,22,8,255,115, +59,14,255,112,55,13,255,33,21,8,255,8,6,3,37,0,8,8,6,3, +74,88,45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8, +6,3,65,88,45,11,255,125,66,14,255,123,65,14,255,14,11,5,147,0, +4,9,7,4,85,92,47,11,255,20,13,5,170,0,4,8,6,3,62,88, +45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3, +65,88,45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9, +7,4,85,92,47,11,255,125,66,14,255,123,60,14,255,14,10,5,159,0, +12,12,10,5,210,59,31,10,255,115,59,14,255,118,60,13,255,104,54,13, +255,102,51,13,255,112,53,13,255,122,63,15,255,123,58,14,255,85,43,12, +255,21,15,6,255,7,5,4,45,0,8,8,6,3,85,113,55,16,255,196, +92,23,255,195,96,24,255,25,17,10,255,4,3,3,79,0,64,3,2,2, +28,10,8,5,227,138,71,21,255,177,87,20,255,174,86,21,255,24,16,9, +170,0,8,13,10,8,85,142,73,23,255,195,96,24,255,194,91,23,255,24, +17,11,227,0,44,12,9,5,150,35,22,8,255,80,42,11,255,84,44,11, +255,88,44,11,255,80,42,11,255,88,44,11,255,97,50,12,255,118,60,13, +255,85,43,12,255,21,15,6,255,8,6,3,57,0,16,9,7,4,85,92, +47,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,16,6,5,5, +28,17,13,8,227,68,34,11,255,115,59,14,255,110,59,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +255,123,65,14,255,18,12,5,170,0,24,12,9,7,170,131,69,24,255,191, +90,22,255,136,71,19,255,15,11,6,227,4,3,3,17,0,24,7,6,4, +31,16,11,5,227,104,52,13,255,131,66,14,255,98,49,13,255,10,8,5, +193,3,2,2,68,8,7,5,170,121,66,26,255,195,96,24,255,156,74,19, +255,34,21,9,255,9,7,4,85,0,12,8,6,3,51,69,35,10,255,121, +62,14,255,123,60,14,255,16,11,5,227,4,3,3,28,0,8,8,6,3, +170,92,47,11,255,125,64,14,255,108,55,13,255,14,10,5,164,0,40,7, +5,4,198,96,48,13,255,134,65,15,255,133,66,16,255,15,11,6,170,0, +8,7,5,4,85,78,39,11,255,130,64,15,255,130,64,15,255,134,65,15, +255,136,67,17,255,124,62,17,255,114,56,17,255,113,55,16,255,118,60,17, +255,107,55,20,255,48,29,15,255,12,10,7,85,0,20,9,8,6,170,45, +27,12,255,139,70,20,255,131,66,18,255,107,53,14,255,19,13,6,99,0, +8,8,6,5,85,92,46,13,255,131,61,14,255,125,64,14,255,14,10,5, +170,0,12,58,31,9,255,110,59,13,255,115,59,14,255,56,29,9,255,10, +8,5,227,5,4,4,23,0,108,10,8,7,28,28,18,11,212,49,28,16, +255,35,21,12,241,13,10,6,85,0,68,14,10,5,142,20,14,5,170,16, +12,5,164,8,6,3,28,0,8,24,16,9,142,21,15,8,252,23,15,8, +184,11,8,6,34,0,36,14,10,5,142,20,14,5,170,16,11,5,170,10, +8,5,28,0,24,7,6,4,25,20,13,7,147,22,15,7,170,10,8,5, +142,5,4,4,3,0,24,14,10,5,142,20,13,5,170,16,11,5,170,9, +7,4,28,0,16,7,5,4,28,14,10,5,156,14,10,5,229,24,15,9, +255,32,20,11,255,28,18,11,244,12,9,7,108,0,8,10,8,5,142,19, +13,8,235,24,15,7,227,10,8,5,59,0,48,10,8,5,93,23,15,8, +170,28,18,9,173,15,11,6,28,0,12,18,12,5,142,21,14,6,170,9, +7,4,133,0,148,8,6,5,113,89,44,14,255,100,51,21,255,13,10,8, +227,6,5,5,28,0,60,6,5,5,8,17,12,6,142,26,16,7,170,18, +12,5,170,9,7,4,28,0,8,6,5,3,85,54,28,11,255,136,66,19, +255,121,59,18,255,15,10,6,241,0,40,8,6,3,57,12,9,5,170,18, +13,5,178,14,10,5,241,14,10,5,255,14,10,5,252,16,11,5,195,16, +11,5,170,8,6,3,113,0,24,8,6,5,28,24,16,9,204,24,17,9, +255,17,12,6,210,14,10,5,170,16,11,5,170,17,11,6,246,27,17,10, +246,14,10,7,85,0,16,8,6,5,28,21,14,10,195,22,15,11,255,18, +13,9,255,18,13,9,255,22,15,9,255,19,13,8,255,17,12,6,255,17, +11,6,255,15,11,6,255,17,12,6,255,19,13,6,204,12,9,5,28,0, +12,5,4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5, +235,15,11,6,255,15,11,6,255,19,12,6,204,19,13,6,170,10,8,5, +170,8,6,5,57,0,48,14,10,5,142,21,13,6,170,16,11,5,170,9, +7,4,28,0,12,5,4,2,25,8,6,3,125,14,10,5,170,14,10,5, +210,23,15,8,255,30,20,11,255,30,20,11,255,23,17,10,255,20,14,9, +244,16,12,9,170,9,8,6,79,0,16,9,7,6,65,15,11,8,170,17, +12,8,232,21,14,8,255,26,16,9,255,23,15,8,255,21,14,8,255,15, +11,6,255,22,15,7,178,11,9,6,170,10,8,7,57,0,32,12,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,5,5,4,28,8, +6,3,133,15,11,6,193,20,15,9,255,28,18,11,255,30,20,11,255,26, +16,9,255,14,10,5,238,16,11,5,170,9,7,4,153,7,5,4,57,0, +16,5,4,2,28,8,6,3,142,18,12,7,207,22,15,9,255,28,18,11, +255,27,18,10,255,18,13,7,255,15,11,6,227,21,13,6,170,10,7,5, +164,7,6,4,57,0,16,14,10,5,142,20,13,5,170,16,12,5,170,9, +7,4,28,0,8,10,8,7,119,149,64,26,255,131,63,26,255,14,11,7, +227,6,5,5,28,0,32,7,5,4,28,14,10,5,156,20,13,5,170,12, +9,5,142,6,5,3,6,0,64,12,10,7,142,24,15,7,170,21,13,6, +170,8,6,3,76,0,48,9,7,6,85,83,43,16,255,176,88,23,255,130, +62,21,255,16,11,7,170,0,28,9,8,6,28,13,10,8,164,23,16,10, +190,16,11,7,252,15,11,6,255,14,10,5,255,14,10,5,255,14,10,5, +255,16,11,5,232,14,10,5,170,8,6,3,85,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,142,20,13,5, +170,16,11,5,170,9,7,4,28,0,12,14,10,5,136,16,12,5,170,16, +11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,249,16, +12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,5,4, +28,8,6,3,125,14,10,5,170,18,12,5,176,14,10,5,238,14,10,5, +246,16,12,5,195,18,13,5,170,16,11,5,170,9,7,4,150,7,5,4, +54,0,16,14,10,5,142,16,12,5,170,16,11,5,170,18,12,5,170,16, +11,5,210,14,10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9, +7,4,153,7,6,4,57,0,16,14,10,5,142,16,12,5,170,16,11,5, +170,18,12,5,170,16,11,5,210,14,10,5,252,12,9,5,255,16,11,5, +255,20,13,5,201,11,9,4,28,0,12,14,10,5,139,20,13,5,170,16, +11,5,170,9,7,4,28,0,36,5,5,4,28,8,6,3,125,14,10,5, +170,18,13,5,176,14,10,5,238,14,10,5,255,16,11,5,235,18,13,5, +173,16,11,5,170,16,12,5,170,16,11,5,164,9,7,4,28,0,12,12, +9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,12,6,5,3,28,8,7,5, +139,19,13,8,193,21,15,10,255,31,21,12,255,32,21,13,255,31,20,12, +255,23,17,10,255,18,12,7,212,10,8,5,159,7,6,4,57,0,16,14, +10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +142,21,13,6,170,16,12,5,170,9,7,4,28,0,12,14,10,5,136,16, +12,5,170,16,11,5,170,18,12,5,176,17,12,6,252,21,14,8,255,17, +12,6,255,16,11,5,255,20,13,5,204,11,9,4,28,0,12,14,10,5, +142,21,14,6,170,18,12,5,170,9,8,4,28,0,24,14,10,5,142,20, +13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +170,16,12,5,170,10,8,5,28,0,16,12,9,5,142,20,13,5,170,16, +11,5,170,9,7,4,28,0,12,5,5,4,28,8,6,3,125,14,10,5, +170,18,12,5,170,20,14,5,173,16,12,5,193,20,13,5,178,20,13,5, +170,16,11,5,170,9,7,4,153,7,6,4,57,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,44,5,5,4,28,8,6,3, +125,14,10,5,170,18,13,5,170,20,14,5,170,18,12,5,170,13,10,6, +227,72,38,19,255,185,86,32,255,144,64,29,255,20,15,11,232,8,7,7, +28,0,12,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0, +16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,5, +4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,238,14, +10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,7,4,153,7, +5,4,57,0,32,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4, +28,0,28,8,6,3,57,9,7,4,164,14,10,5,170,18,13,5,173,14, +10,5,229,14,10,5,255,17,12,6,255,22,15,9,255,20,14,9,252,21, +15,10,176,11,9,6,139,0,32,11,8,4,122,18,12,5,170,14,10,5, +150,7,5,4,28,0,32,8,7,7,57,24,16,11,173,26,18,9,190,13, +10,6,142,5,4,4,11,0,8,8,7,3,68,14,10,5,170,16,11,5, +170,9,7,4,74,0,20,14,10,5,142,20,14,5,170,16,11,5,170,9, +7,4,28,0,16,14,10,5,142,20,14,5,170,16,11,5,170,9,8,4, +28,0,28,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +28,14,10,5,142,18,13,5,170,16,12,5,170,18,13,5,173,14,10,5, +227,14,10,5,255,14,10,5,252,12,9,5,255,12,9,5,255,16,11,5, +255,20,13,5,201,11,9,4,28,0,12,12,10,5,136,16,12,5,170,16, +11,5,170,16,11,5,193,21,15,6,184,14,10,5,31,0,32,8,6,3, +139,54,30,9,255,107,50,12,255,78,39,11,255,9,7,4,161,0,12,20, +13,5,142,18,12,5,210,16,11,5,170,16,11,5,170,16,11,5,170,9, +7,4,28,0,64,13,10,8,57,9,7,6,159,8,6,5,159,10,8,7, +130,10,8,7,119,9,7,6,133,9,7,6,167,10,8,7,170,11,9,8, +113,0,44,5,4,2,28,8,6,3,125,14,10,5,170,18,13,5,176,14, +10,5,238,14,10,5,255,16,11,5,235,18,13,5,173,16,11,5,170,16, +12,5,170,16,11,5,164,9,7,4,28,0,12,14,10,5,136,16,12,5, +170,16,11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5, +249,16,12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5, +5,4,28,8,6,3,125,14,10,5,170,18,13,5,176,14,10,5,238,14, +10,5,255,14,10,5,249,16,11,5,193,16,11,5,170,9,7,4,150,7, +5,4,57,0,16,5,5,4,28,8,6,3,125,14,10,5,170,18,13,5, +176,14,10,5,238,14,10,5,255,14,10,5,235,18,13,5,173,16,11,5, +170,16,12,5,170,16,11,5,170,9,7,4,28,0,12,5,5,4,28,8, +6,3,125,14,10,5,170,18,13,5,176,14,10,5,235,14,10,5,255,14, +10,5,255,16,11,5,255,20,13,5,207,12,9,5,34,0,28,14,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,6,5,3,85,7, +5,4,85,6,5,3,85,5,4,4,85,5,4,4,105,9,8,4,241,72, +37,11,255,110,54,13,255,67,34,10,255,8,6,3,144,0,12,14,10,5, +142,21,14,6,170,16,12,5,170,9,8,4,28,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +170,16,11,5,170,9,7,4,28,0,12,7,5,2,37,8,6,3,142,8, +6,3,227,25,15,6,255,75,36,10,255,99,51,12,255,66,33,9,255,8, +6,3,130,0,12,14,10,5,139,21,13,6,170,16,11,5,170,9,7,4, +28,0,12,8,6,3,79,14,10,5,170,18,13,5,170,12,9,5,142,0, +16,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,12,12, +9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,8,20,13,5, +85,11,8,4,28,0,8,12,9,5,142,21,13,6,170,16,11,5,170,9, +7,4,28,0,12,12,9,5,142,21,13,6,170,16,11,5,170,9,7,4, +28,0,16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +12,5,5,4,28,8,6,3,125,14,10,5,170,18,12,5,170,20,14,5, +173,16,12,5,193,20,13,5,178,20,13,5,170,16,11,5,170,9,7,4, +161,7,6,4,57,0,12,8,6,3,85,84,40,13,255,164,73,23,255,184, +79,27,255,15,11,8,246,0,72,11,10,10,170,176,83,37,255,196,87,33, +255,192,88,31,255,22,15,11,193,0,12,21,15,10,159,26,17,11,255,24, +17,11,221,10,8,7,85,0,44,8,7,3,59,12,9,5,170,16,11,5, +210,14,10,5,255,14,10,5,255,14,10,5,255,14,10,5,246,16,12,5, +193,16,11,5,170,9,7,4,153,6,5,3,57,0,24,14,10,5,142,20, +13,5,170,16,11,5,170,9,7,4,28,0,20,6,5,3,28,8,6,3, +127,14,10,5,170,18,13,5,176,14,10,5,238,14,10,5,255,14,10,5, +235,18,13,5,173,16,11,5,170,16,12,5,170,16,11,5,170,9,7,4, +28,0,28,14,11,7,142,29,19,8,170,17,11,6,159,8,6,3,28,0, +32,7,5,4,28,14,10,5,150,20,13,5,170,12,9,5,142,5,4,2, +14,0,8,15,11,8,142,26,18,9,178,19,13,6,170,8,6,3,68,0, +20,18,12,5,142,16,11,5,238,16,11,5,170,9,7,4,28,0,16,12, +9,5,142,16,11,5,215,18,13,5,187,11,9,4,28,0,16,4,4,3, +6,5,4,2,82,5,4,2,85,5,4,2,85,5,4,2,85,5,4,2, +99,9,7,4,241,72,37,11,255,112,53,13,255,77,39,12,255,10,8,5, +170,0,12,19,13,8,184,20,14,9,255,16,11,7,255,14,11,7,255,17, +12,8,255,22,15,9,255,27,17,10,255,30,19,11,255,28,18,11,255,21, +15,10,255,15,12,8,198,9,7,6,28,0,24,8,6,5,91,15,11,6, +170,14,11,5,238,19,13,6,198,12,9,5,28,0,8,6,5,3,85,54, +29,9,255,100,48,13,255,109,52,14,255,15,11,6,170,0,12,19,13,6, +144,14,10,5,255,16,11,5,178,8,6,3,119,0,255,0,255,0,174,12, +9,7,88,99,44,20,255,26,16,11,232,5,4,4,28,0,92,6,5,3, +57,60,28,11,255,158,67,23,255,88,44,23,255,11,9,6,142,0,255,0, +255,0,150,12,9,7,110,126,51,25,255,25,17,12,232,5,4,4,28,0, +184,6,5,5,28,19,14,10,227,52,29,17,255,30,20,13,255,9,8,6, +82,0,255,0,255,0,255,0,255,0,8,12,10,9,170,172,81,49,255,213, +125,94,255,185,88,58,255,23,16,14,159,0,255,0,255,0,106,5,4,2, +28,16,11,5,244,68,34,9,255,62,33,9,255,9,8,4,139,0,96,10, +8,7,48,71,33,18,255,108,47,23,255,107,48,22,255,113,51,24,255,109, +50,24,255,104,45,21,255,104,45,21,255,113,49,24,255,115,50,24,255,18, +13,9,136,0,255,0,129,9,7,6,34,18,13,9,244,66,31,15,255,84, +37,17,255,83,36,16,255,75,34,14,255,73,35,14,255,91,41,16,255,110, +47,19,255,79,40,16,255,24,16,9,255,8,6,5,57,0,100,22,14,5, +244,40,23,7,255,42,23,7,255,54,28,9,255,60,31,9,255,36,22,7, +255,12,9,5,244,6,5,3,28,0,255,0,29,9,7,6,85,72,34,13, +255,126,56,21,255,148,63,25,255,25,17,14,190,0,72,15,12,12,133,178, +86,57,255,200,89,55,255,194,82,47,255,30,20,17,187,0,255,0,169,9, +7,4,99,17,12,6,255,42,22,9,255,49,25,9,255,54,26,11,255,52, +26,11,255,59,28,12,255,82,37,15,255,111,49,18,255,84,39,17,255,25, +17,10,255,8,7,5,57,0,112,6,5,3,57,38,22,7,255,85,39,12, +255,124,52,21,255,20,13,9,170,0,255,0,255,0,202,8,6,5,28,26, +16,11,170,11,8,6,85,0,100,12,8,5,119,20,14,9,170,12,9,7, +142,0,255,0,255,0,154,9,7,6,28,27,17,12,170,11,9,8,85,0, +192,7,6,6,28,8,7,5,85,8,6,5,57,0,255,0,255,0,255,0, +255,0,16,25,17,16,161,41,27,26,255,40,26,23,235,14,12,11,82,0, +255,0,255,0,110,8,6,3,37,9,7,4,142,9,7,4,136,6,5,3, +6,0,100,23,15,10,153,19,13,10,255,16,11,9,255,16,11,9,255,16, +11,9,255,16,11,9,255,16,11,9,255,18,13,9,255,24,16,11,204,16, +11,9,31,0,255,0,133,10,8,7,142,18,12,9,207,18,13,9,255,16, +11,9,255,15,11,8,255,15,11,8,252,18,13,9,195,18,12,9,170,11, +8,6,167,8,7,5,57,0,104,9,8,4,142,14,10,5,170,13,10,6, +170,13,9,6,170,11,8,6,170,7,6,4,130,6,5,3,28,0,255,0, +37,14,10,7,142,21,14,10,170,19,13,10,170,14,11,9,31,0,72,8, +7,8,14,25,17,16,142,27,18,16,193,26,18,15,170,15,11,10,34,0, +255,0,169,9,7,4,28,11,8,6,170,14,10,7,232,15,10,8,255,15, +10,8,255,15,10,8,255,15,10,8,252,18,12,9,195,18,12,9,170,11, +8,6,167,9,7,6,57,0,120,9,7,4,91,16,11,7,170,20,13,9, +170,13,10,8,28,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255}}; + /* Created by MiniCompress.. an iOS RLE compressor. + * Compress Rate : 46.36 % + */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontrle.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontrle.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontrle.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/gfontrle.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,7 @@ +extern const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; + unsigned int rle_size; + unsigned char rle_pixel [49725]; +} the_font ; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_config.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_config.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_config.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_config.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,28 @@ +#if WORDS_BIGENDIAN +#define COLOR_ARGB +#else +#define COLOR_BGRA +#endif + +#if 1 +/* ndef COLOR_BGRA */ +/** position des composantes **/ + #define BLEU 2 + #define VERT 1 + #define ROUGE 0 + #define ALPHA 3 +#else + #define ROUGE 1 + #define BLEU 3 + #define VERT 2 + #define ALPHA 0 +#endif + +#ifndef guint32 +#define guint8 unsigned char +#define guin16 unsigned short +#define guint32 unsigned int +#define gint8 signed char +#define gint16 signed short int +#define gint32 signed int +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_config_param.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_config_param.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_config_param.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_config_param.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,115 @@ +#ifndef _CONFIG_PARAM_H +#define _CONFIG_PARAM_H + +#include + +/** + * File created on 2003-05-24 by Jeko. + * (c)2003, JC Hoelt for iOS-software. + * + * LGPL Licence. + */ + +typedef enum { + PARAM_INTVAL, + PARAM_FLOATVAL, + PARAM_BOOLVAL, + PARAM_STRVAL, + PARAM_LISTVAL, +} ParamType; + +struct IntVal { + int value; + int min; + int max; + int step; +}; +struct FloatVal { + float value; + float min; + float max; + float step; +}; +struct StrVal { + char *value; +}; +struct ListVal { + char *value; + int nbChoices; + char **choices; +}; +struct BoolVal { + int value; +}; + + +typedef struct _PARAM { + char *name; + char *desc; + char rw; + ParamType type; + union { + struct IntVal ival; + struct FloatVal fval; + struct StrVal sval; + struct ListVal slist; + struct BoolVal bval; + } param; + + /* used by the core to inform the GUI of a change */ + void (*change_listener)(struct _PARAM *_this); + + /* used by the GUI to inform the core of a change */ + void (*changed)(struct _PARAM *_this); + + void *user_data; /* can be used by the GUI */ +} PluginParam; + +#define IVAL(p) ((p).param.ival.value) +#define SVAL(p) ((p).param.sval.value) +#define FVAL(p) ((p).param.fval.value) +#define BVAL(p) ((p).param.bval.value) +#define LVAL(p) ((p).param.slist.value) + +#define FMIN(p) ((p).param.fval.min) +#define FMAX(p) ((p).param.fval.max) +#define FSTEP(p) ((p).param.fval.step) + +#define IMIN(p) ((p).param.ival.min) +#define IMAX(p) ((p).param.ival.max) +#define ISTEP(p) ((p).param.ival.step) + +PluginParam goom_secure_param(void); + +PluginParam goom_secure_f_param(char *name); +PluginParam goom_secure_i_param(char *name); +PluginParam goom_secure_b_param(char *name, int value); +PluginParam goom_secure_s_param(char *name); + +PluginParam goom_secure_f_feedback(char *name); +PluginParam goom_secure_i_feedback(char *name); + +void goom_set_str_param_value(PluginParam *p, const char *str); +void goom_set_list_param_value(PluginParam *p, const char *str); + +typedef struct _PARAMETERS { + char *name; + char *desc; + int nbParams; + PluginParam **params; +} PluginParameters; + +PluginParameters goom_plugin_parameters(const char *name, int nb); + +#define secure_param goom_secure_param +#define secure_f_param goom_secure_f_param +#define secure_i_param goom_secure_i_param +#define secure_b_param goom_secure_b_param +#define secure_s_param goom_secure_s_param +#define secure_f_feedback goom_secure_f_feedback +#define secure_i_feedback goom_secure_i_feedback +#define set_list_param_value goom_set_list_param_value +#define set_str_param_value goom_set_str_param_value +#define plugin_parameters goom_plugin_parameters + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_core.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_core.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_core.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_core.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,895 @@ +/** +* file: goom_core.c + * author: Jean-Christophe Hoelt (which is not so proud of it) + * + * Contains the core of goom's work. + * + * (c)2000-2003, by iOS-software. + */ + +#include +#include +#include +#include +#include + +#include "goom.h" +#include "goom_tools.h" +#include "goom_filters.h" +#include "lines.h" +#include "ifs.h" +#include "tentacle3d.h" +#include "gfontlib.h" + +#include "sound_tester.h" +#include "goom_plugin_info.h" +#include "goom_fx.h" +#include "goomsl.h" + +/* #define VERBOSE */ + +#define STOP_SPEED 128 +/* TODO: put that as variable in PluginInfo */ +#define TIME_BTW_CHG 300 + +static void choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, + int *mode, float *amplitude, int far); + +static void update_message (PluginInfo *goomInfo, char *message); + +static void init_buffers(PluginInfo *goomInfo, int buffsize) +{ + goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + bzero (goomInfo->pixel, buffsize * sizeof (guint32) + 128); + goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + bzero (goomInfo->back, buffsize * sizeof (guint32) + 128); + goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128); + bzero (goomInfo->conv, buffsize * sizeof (guint32) + 128); + + goomInfo->outputBuf = goomInfo->conv; + + goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128); + goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128); +} + +/************************** +* INIT * +**************************/ +PluginInfo *goom_init (guint32 resx, guint32 resy) +{ + PluginInfo *goomInfo = (PluginInfo*)malloc(sizeof(PluginInfo)); + +#ifdef VERBOSE + printf ("GOOM: init (%d, %d);\n", resx, resy); +#endif + + plugin_info_init(goomInfo,4); + + goomInfo->star_fx = flying_star_create(); + goomInfo->star_fx.init(&goomInfo->star_fx, goomInfo); + + goomInfo->zoomFilter_fx = zoomFilterVisualFXWrapper_create (); + goomInfo->zoomFilter_fx.init(&goomInfo->zoomFilter_fx, goomInfo); + + goomInfo->tentacles_fx = tentacle_fx_create(); + goomInfo->tentacles_fx.init(&goomInfo->tentacles_fx, goomInfo); + + goomInfo->convolve_fx = convolve_create(); + goomInfo->convolve_fx.init(&goomInfo->convolve_fx, goomInfo); + + plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx); + plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx); + plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx); + plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx); + + goomInfo->screen.width = resx; + goomInfo->screen.height = resy; + goomInfo->screen.size = resx * resy; + + init_buffers(goomInfo, goomInfo->screen.size); + goomInfo->gRandom = goom_random_init((uintptr_t)goomInfo->pixel); + + goomInfo->cycle = 0; + + goomInfo->ifs_fx = ifs_visualfx_create(); + goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); + + goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, + GML_HLINE, goomInfo->screen.height, GML_BLACK, + GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT); + goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, + GML_HLINE, 0, GML_BLACK, + GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED); + + gfont_load (); + + /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */ + + return goomInfo; +} + + + +void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy) +{ + free (goomInfo->pixel); + free (goomInfo->back); + free (goomInfo->conv); + + goomInfo->screen.width = resx; + goomInfo->screen.height = resy; + goomInfo->screen.size = resx * resy; + + init_buffers(goomInfo, goomInfo->screen.size); + + /* init_ifs (goomInfo, resx, goomInfo->screen.height); */ + goomInfo->ifs_fx.free(&goomInfo->ifs_fx); + goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); + + goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height); + goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height); +} + +int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer) +{ + goomInfo->outputBuf = (Pixel*)buffer; + return 1; +} + +/******************************************** +* UPDATE * +******************************************** + +* WARNING: this is a 600 lines function ! (21-11-2003) +*/ +guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], + int forceMode, float fps, char *songTitle, char *message) +{ + Pixel *return_val; + guint32 pointWidth; + guint32 pointHeight; + int i; + float largfactor; /* elargissement de l'intervalle d'volution des points */ + Pixel *tmp; + + ZoomFilterData *pzfd; + + /* test if the config has changed, update it if so */ + pointWidth = (goomInfo->screen.width * 2) / 5; + pointHeight = ((goomInfo->screen.height) * 2) / 5; + + /* ! etude du signal ... */ + evaluate_sound (data, &(goomInfo->sound)); + + /* goom_execute_main_script(goomInfo); */ + + /* ! calcul du deplacement des petits points ... */ + largfactor = goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f; + + if (largfactor > 1.5f) + largfactor = 1.5f; + + goomInfo->update.decay_ifs--; + if (goomInfo->update.decay_ifs > 0) + goomInfo->update.ifs_incr += 2; + if (goomInfo->update.decay_ifs == 0) + goomInfo->update.ifs_incr = 0; + + if (goomInfo->update.recay_ifs) { + goomInfo->update.ifs_incr -= 2; + goomInfo->update.recay_ifs--; + if ((goomInfo->update.recay_ifs == 0)&&(goomInfo->update.ifs_incr<=0)) + goomInfo->update.ifs_incr = 1; + } + + if (goomInfo->update.ifs_incr > 0) + goomInfo->ifs_fx.apply(&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, goomInfo); + + if (goomInfo->curGState->drawPoints) { + for (i = 1; i * 15 <= goomInfo->sound.speedvar*80.0f + 15; i++) { + goomInfo->update.loopvar += goomInfo->sound.speedvar*50 + 1; + + pointFilter (goomInfo, goomInfo->p1, + YELLOW, + ((pointWidth - 6.0f) * largfactor + 5.0f), + ((pointHeight - 6.0f) * largfactor + 5.0f), + i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032); + pointFilter (goomInfo, goomInfo->p1, ORANGE, + ((pointWidth / 2) * largfactor) / i + 10.0f * i, + ((pointHeight / 2) * largfactor) / i + 10.0f * i, + 96.0f, i * 80.0f, goomInfo->update.loopvar / i); + pointFilter (goomInfo, goomInfo->p1, VIOLET, + ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, + ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, + i + 122.0f, 134.0f, goomInfo->update.loopvar / i); + pointFilter (goomInfo, goomInfo->p1, BLACK, + ((pointHeight / 3) * largfactor + 20.0f), + ((pointHeight / 3) * largfactor + 20.0f), + 58.0f, i * 66.0f, goomInfo->update.loopvar / i); + pointFilter (goomInfo, goomInfo->p1, WHITE, + (pointHeight * largfactor + 10.0f * i) / i, + (pointHeight * largfactor + 10.0f * i) / i, + 66.0f, 74.0f, goomInfo->update.loopvar + i * 500); + } + } + + /* par dfaut pas de changement de zoom */ + pzfd = NULL; + + /* + * Test forceMode + */ +#ifdef VERBOSE + if (forceMode != 0) { + printf ("forcemode = %d\n", forceMode); + } +#endif + + + /* diminuer de 1 le temps de lockage */ + /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ + /* changement d'etat du plugin juste apres un autre changement d'etat. oki */ + if (--goomInfo->update.lockvar < 0) + goomInfo->update.lockvar = 0; + + /* on verifie qu'il ne se pas un truc interressant avec le son. */ + if ((goomInfo->sound.timeSinceLastGoom == 0) + || (forceMode > 0) + || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) { + + /* changement eventuel de mode */ + if (goom_irand(goomInfo->gRandom,16) == 0) + switch (goom_irand(goomInfo->gRandom,34)) { + case 0: + case 10: + goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); + case 13: + case 20: + case 21: + goomInfo->update.zoomFilterData.mode = WAVE_MODE; + goomInfo->update.zoomFilterData.reverse = 0; + goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,3) == 0); + if (goom_irand(goomInfo->gRandom,2)) + goomInfo->update.zoomFilterData.vitesse = (goomInfo->update.zoomFilterData.vitesse + 127) >> 1; + break; + case 1: + case 11: + goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 2: + case 12: + goomInfo->update.zoomFilterData.mode = AMULETTE_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 3: + goomInfo->update.zoomFilterData.mode = WATER_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 4: + case 14: + goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 5: + case 15: + case 22: + goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = (goom_irand(goomInfo->gRandom,3) == 0); + break; + case 6: + case 16: + goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 7: + case 17: + goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; + goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,4) == 0); + goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); + break; + case 8: + case 18: + case 19: + goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; + goomInfo->update.zoomFilterData.waveEffect = 1; + goomInfo->update.zoomFilterData.hypercosEffect = 1; + break; + case 29: + case 30: + goomInfo->update.zoomFilterData.mode = YONLY_MODE; + break; + case 31: + case 32: + case 33: + goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE; + break; + default: + goomInfo->update.zoomFilterData.mode = NORMAL_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + } + } + + /* tout ceci ne sera fait qu'en cas de non-blocage */ + if (goomInfo->update.lockvar == 0) { + /* reperage de goom (acceleration forte de l'acceleration du volume) */ + /* -> coup de boost de la vitesse si besoin.. */ + if (goomInfo->sound.timeSinceLastGoom == 0) { + + int i; + goomInfo->update.goomvar++; + + /* SELECTION OF THE GOOM STATE */ + if ((!goomInfo->update.stateSelectionBlocker)&&(goom_irand(goomInfo->gRandom,3))) { + goomInfo->update.stateSelectionRnd = goom_irand(goomInfo->gRandom,goomInfo->statesRangeMax); + goomInfo->update.stateSelectionBlocker = 3; + } + else if (goomInfo->update.stateSelectionBlocker) goomInfo->update.stateSelectionBlocker--; + + for (i=0;istatesNumber;i++) + if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin) + && (goomInfo->update.stateSelectionRnd <= goomInfo->states[i].rangemax)) + goomInfo->curGState = &(goomInfo->states[i]); + + if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr<=0)) { + goomInfo->update.recay_ifs = 5; + goomInfo->update.ifs_incr = 11; + } + + if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr>0) && (goomInfo->update.decay_ifs<=0)) + goomInfo->update.decay_ifs = 100; + + if (!goomInfo->curGState->drawScope) + goomInfo->update.stop_lines = 0xf000 & 5; + + if (!goomInfo->curGState->drawScope) { + goomInfo->update.stop_lines = 0; + goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; + } + + /* if (goomInfo->update.goomvar % 1 == 0) */ + { + guint32 vtmp; + guint32 newvit; + + goomInfo->update.lockvar = 50; + newvit = STOP_SPEED + 1 - ((float)3.5f * log10(goomInfo->sound.speedvar * 60 + 1)); + /* retablir le zoom avant.. */ + if ((goomInfo->update.zoomFilterData.reverse) && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) { + goomInfo->update.zoomFilterData.reverse = 0; + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2; + goomInfo->update.lockvar = 75; + } + if (goom_irand(goomInfo->gRandom,10) == 0) { + goomInfo->update.zoomFilterData.reverse = 1; + goomInfo->update.lockvar = 100; + } + + if (goom_irand(goomInfo->gRandom,10) == 0) + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; + if (goom_irand(goomInfo->gRandom,12) == 0) + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1; + + /* changement de milieu.. */ + switch (goom_irand(goomInfo->gRandom,25)) { + case 0: + case 3: + case 6: + goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height - 1; + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; + break; + case 1: + case 4: + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width - 1; + break; + case 2: + case 5: + goomInfo->update.zoomFilterData.middleX = 1; + break; + default: + goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; + } + + if ((goomInfo->update.zoomFilterData.mode == WATER_MODE) + || (goomInfo->update.zoomFilterData.mode == YONLY_MODE) + || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) { + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; + goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; + } + + switch (vtmp = (goom_irand(goomInfo->gRandom,15))) { + case 0: + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,3) + - goom_irand(goomInfo->gRandom,3); + goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,3) + - goom_irand(goomInfo->gRandom,3); + break; + case 3: + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,8) + - goom_irand(goomInfo->gRandom,8); + break; + case 4: + case 5: + case 6: + case 7: + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,5) + - goom_irand(goomInfo->gRandom,5); + goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.vPlaneEffect; + break; + case 8: + goomInfo->update.zoomFilterData.hPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); + goomInfo->update.zoomFilterData.vPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; + break; + case 9: + goomInfo->update.zoomFilterData.vPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); + goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; + break; + case 13: + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) + - goom_irand(goomInfo->gRandom,10); + break; + case 14: + goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,10) + - goom_irand(goomInfo->gRandom,10); + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) + - goom_irand(goomInfo->gRandom,10); + break; + default: + if (vtmp < 10) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + } + } + + if (goom_irand(goomInfo->gRandom,5) != 0) + goomInfo->update.zoomFilterData.noisify = 0; + else { + goomInfo->update.zoomFilterData.noisify = goom_irand(goomInfo->gRandom,2) + 1; + goomInfo->update.lockvar *= 2; + } + + if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + goomInfo->update.zoomFilterData.noisify = 0; + } + + if ((goomInfo->update.zoomFilterData.middleX == 1) || (goomInfo->update.zoomFilterData.middleX == (signed int)goomInfo->screen.width - 1)) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + if (goom_irand(goomInfo->gRandom,2)) + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + } + + if ((signed int)newvit < goomInfo->update.zoomFilterData.vitesse) /* on accelere */ + { + pzfd = &goomInfo->update.zoomFilterData; + if (((newvit < STOP_SPEED - 7) && + (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) && + (goomInfo->cycle % 3 == 0)) || (goom_irand(goomInfo->gRandom,40) == 0)) { + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - goom_irand(goomInfo->gRandom,2) + + goom_irand(goomInfo->gRandom,2); + goomInfo->update.zoomFilterData.reverse = !goomInfo->update.zoomFilterData.reverse; + } + else { + goomInfo->update.zoomFilterData.vitesse = (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8; + } + goomInfo->update.lockvar += 50; + } + } + + if (goomInfo->update.lockvar > 150) { + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + goomInfo->update.switchMult = 1.0f; + } + } + /* mode mega-lent */ + if (goom_irand(goomInfo->gRandom,700) == 0) { + /* + * printf ("coup du sort...\n") ; + */ + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + goomInfo->update.goomvar = 1; + goomInfo->update.lockvar += 50; + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + goomInfo->update.switchMult = 1.0f; + } + } + + /* + * gros frein si la musique est calme + */ + if ((goomInfo->sound.speedvar < 0.01f) + && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4) + && (goomInfo->cycle % 16 == 0)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse += 3; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + goomInfo->update.goomvar = 0; + } + + /* + * baisser regulierement la vitesse... + */ + if ((goomInfo->cycle % 73 == 0) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse++; + } + + /* + * arreter de decrmenter au bout d'un certain temps + */ + if ((goomInfo->cycle % 101 == 0) && (goomInfo->update.zoomFilterData.pertedec == 7)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + } + + /* + * Permet de forcer un effet. + */ + if ((forceMode > 0) && (forceMode <= NB_FX)) { + pzfd = &goomInfo->update.zoomFilterData; + pzfd->mode = forceMode - 1; + } + + if (forceMode == -1) { + pzfd = NULL; + } + + /* + * Changement d'effet de zoom ! + */ + if (pzfd != NULL) { + int dif; + + goomInfo->update.cyclesSinceLastChange = 0; + + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + + dif = goomInfo->update.zoomFilterData.vitesse - goomInfo->update.previousZoomSpeed; + if (dif < 0) + dif = -dif; + + if (dif > 2) { + goomInfo->update.switchIncr *= (dif + 2) / 2; + } + goomInfo->update.previousZoomSpeed = goomInfo->update.zoomFilterData.vitesse; + goomInfo->update.switchMult = 1.0f; + + if (((goomInfo->sound.timeSinceLastGoom == 0) + && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) { + goomInfo->update.switchIncr = 0; + goomInfo->update.switchMult = goomInfo->update.switchMultAmount; + } + } + else { + if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.cyclesSinceLastChange = 0; + } + else + goomInfo->update.cyclesSinceLastChange++; + } + +#ifdef VERBOSE + if (pzfd) { + printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); + } +#endif + + /* Zoom here ! */ + zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, goomInfo->screen.width, goomInfo->screen.height, + goomInfo->update.switchIncr, goomInfo->update.switchMult); + + /* + * Affichage tentacule + */ + + goomInfo->tentacles_fx.apply(&goomInfo->tentacles_fx, goomInfo->p1, goomInfo->p2, goomInfo); + goomInfo->star_fx.apply (&goomInfo->star_fx,goomInfo->p2,goomInfo->p1,goomInfo); + + /* + * Affichage de texte + */ + { + /*char title[1024];*/ + char text[64]; + + /* + * Le message + */ + update_message (goomInfo, message); + + if (fps > 0) { + sprintf (text, "%2.0f fps", fps); + goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, + 10, 24, text, 1, 0); + } + + /* + * Le titre + */ + if (songTitle != NULL) { + strncpy (goomInfo->update.titleText, songTitle, 1023); + goomInfo->update.titleText[1023]=0; + goomInfo->update.timeOfTitleDisplay = 200; + } + + if (goomInfo->update.timeOfTitleDisplay) { + goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, + goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, + ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); + goomInfo->update.timeOfTitleDisplay--; + if (goomInfo->update.timeOfTitleDisplay < 4) + goom_draw_text (goomInfo->p2,goomInfo->screen.width,goomInfo->screen.height, + goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, + ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); + } + } + + /* + * Gestion du Scope + */ + + /* + * arret demande + */ + if ((goomInfo->update.stop_lines & 0xf000)||(!goomInfo->curGState->drawScope)) { + float param1, param2, amplitude; + int couleur; + int mode; + + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur, &mode, &litude,1); + couleur = GML_BLACK; + + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur); + goomInfo->update.stop_lines &= 0x0fff; + } + + /* + * arret aleatore.. changement de mode de ligne.. + */ + if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) { + goomInfo->update.lineMode--; + if (goomInfo->update.lineMode == -1) + goomInfo->update.lineMode = 0; + } + else + if ((goomInfo->cycle%80==0)&&(goom_irand(goomInfo->gRandom,5)==0)&&goomInfo->update.lineMode) + goomInfo->update.lineMode--; + + if ((goomInfo->cycle % 120 == 0) + && (goom_irand(goomInfo->gRandom,4) == 0) + && (goomInfo->curGState->drawScope)) { + if (goomInfo->update.lineMode == 0) + goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; + else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) { + float param1, param2, amplitude; + int couleur1,couleur2; + int mode; + + goomInfo->update.lineMode--; + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, + &mode, &litude,goomInfo->update.stop_lines); + + couleur2 = 5-couleur1; + if (goomInfo->update.stop_lines) { + goomInfo->update.stop_lines--; + if (goom_irand(goomInfo->gRandom,2)) + couleur2=couleur1 = GML_BLACK; + } + + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); + } + } + + /* + * si on est dans un goom : afficher les lignes... + */ + if ((goomInfo->update.lineMode != 0) || (goomInfo->sound.timeSinceLastGoom < 5)) { + goomInfo->gmline2->power = goomInfo->gmline1->power; + + goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2); + goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2); + + if (((goomInfo->cycle % 121) == 9) && (goom_irand(goomInfo->gRandom,3) == 1) + && ((goomInfo->update.lineMode == 0) || (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration))) { + float param1, param2, amplitude; + int couleur1,couleur2; + int mode; + + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, + &mode, &litude, goomInfo->update.stop_lines); + couleur2 = 5-couleur1; + + if (goomInfo->update.stop_lines) { + goomInfo->update.stop_lines--; + if (goom_irand(goomInfo->gRandom,2)) + couleur2=couleur1 = GML_BLACK; + } + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); + } + } + + return_val = goomInfo->p1; + tmp = goomInfo->p1; + goomInfo->p1 = goomInfo->p2; + goomInfo->p2 = tmp; + + /* affichage et swappage des buffers.. */ + goomInfo->cycle++; + + goomInfo->convolve_fx.apply(&goomInfo->convolve_fx,return_val,goomInfo->outputBuf,goomInfo); + + return (guint32*)goomInfo->outputBuf; +} + +/**************************************** +* CLOSE * +****************************************/ +void goom_close (PluginInfo *goomInfo) +{ + if (goomInfo->pixel != NULL) + free (goomInfo->pixel); + if (goomInfo->back != NULL) + free (goomInfo->back); + if (goomInfo->conv != NULL) + free (goomInfo->conv); + + goomInfo->pixel = goomInfo->back = NULL; + goomInfo->conv = NULL; + goom_random_free(goomInfo->gRandom); + goom_lines_free (&goomInfo->gmline1); + goom_lines_free (&goomInfo->gmline2); + + /* release_ifs (); */ + goomInfo->ifs_fx.free(&goomInfo->ifs_fx); + goomInfo->convolve_fx.free(&goomInfo->convolve_fx); + goomInfo->star_fx.free(&goomInfo->star_fx); + goomInfo->tentacles_fx.free(&goomInfo->tentacles_fx); + goomInfo->zoomFilter_fx.free(&goomInfo->zoomFilter_fx); + + // Release info visual + free (goomInfo->params); + free (goomInfo->sound.params.params); + + // Release PluginInfo + free (goomInfo->visuals); + gsl_free (goomInfo->scanner); + gsl_free (goomInfo->main_scanner); + + free(goomInfo); +} + + +/* *** */ +void +choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, int *mode, + float *amplitude, int far) +{ + *mode = goom_irand(goomInfo->gRandom,3); + *amplitude = 1.0f; + switch (*mode) { + case GML_CIRCLE: + if (far) { + *param1 = *param2 = 0.47f; + *amplitude = 0.8f; + break; + } + if (goom_irand(goomInfo->gRandom,3) == 0) { + *param1 = *param2 = 0; + *amplitude = 3.0f; + } + else if (goom_irand(goomInfo->gRandom,2)) { + *param1 = 0.40f * goomInfo->screen.height; + *param2 = 0.22f * goomInfo->screen.height; + } + else { + *param1 = *param2 = goomInfo->screen.height * 0.35; + } + break; + case GML_HLINE: + if (goom_irand(goomInfo->gRandom,4) || far) { + *param1 = goomInfo->screen.height / 7; + *param2 = 6.0f * goomInfo->screen.height / 7.0f; + } + else { + *param1 = *param2 = goomInfo->screen.height / 2.0f; + *amplitude = 2.0f; + } + break; + case GML_VLINE: + if (goom_irand(goomInfo->gRandom,3) || far) { + *param1 = goomInfo->screen.width / 7.0f; + *param2 = 6.0f * goomInfo->screen.width / 7.0f; + } + else { + *param1 = *param2 = goomInfo->screen.width / 2.0f; + *amplitude = 1.5f; + } + break; + } + + *couleur = goom_irand(goomInfo->gRandom,6); +} + +#define ECART_VARIATION 1.5 +#define POS_VARIATION 3.0 +#define SCROLLING_SPEED 80 + +/* + * Met a jour l'affichage du message defilant + */ +void update_message (PluginInfo *goomInfo, char *message) { + + int fin = 0; + + if (message) { + int i=1,j=0; + strcpy (goomInfo->update_message.message, message); + for (j=0;goomInfo->update_message.message[j];j++) + if (goomInfo->update_message.message[j]=='\n') + i++; + goomInfo->update_message.numberOfLinesInMessage = i; + goomInfo->update_message.affiche = goomInfo->screen.height + goomInfo->update_message.numberOfLinesInMessage * 25 + 105; + goomInfo->update_message.longueur = strlen(goomInfo->update_message.message); + } + if (goomInfo->update_message.affiche) { + int i = 0; + char *msg = malloc(goomInfo->update_message.longueur + 1); + char *ptr = msg; + int pos; + float ecart; + message = msg; + strcpy (msg, goomInfo->update_message.message); + + while (!fin) { + while (1) { + if (*ptr == 0) { + fin = 1; + break; + } + if (*ptr == '\n') { + *ptr = 0; + break; + } + ++ptr; + } + pos = goomInfo->update_message.affiche - (goomInfo->update_message.numberOfLinesInMessage - i)*25; + pos += POS_VARIATION * (cos((double)pos / 20.0)); + pos -= SCROLLING_SPEED; + ecart = (ECART_VARIATION * sin((double)pos / 20.0)); + if ((fin) && (2 * pos < (int)goomInfo->screen.height)) + pos = (int)goomInfo->screen.height / 2; + pos += 7; + + goom_draw_text(goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, + goomInfo->screen.width/2, pos, + message, + ecart, + 1); + message = ++ptr; + i++; + } + goomInfo->update_message.affiche --; + free (msg); + } +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_filters.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_filters.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_filters.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_filters.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,52 @@ +#ifndef FILTERS_H +#define FILTERS_H + +#include "goom_config.h" +#include "goom_typedefs.h" +#include "goom_visual_fx.h" +#include "goom_graphic.h" + +VisualFX zoomFilterVisualFXWrapper_create(void); + +struct _ZOOM_FILTER_DATA +{ + int vitesse; /* 128 = vitesse nule... * * 256 = en arriere + * hyper vite.. * * 0 = en avant hype vite. */ + unsigned char pertedec; + unsigned char sqrtperte; + int middleX, middleY; /* milieu de l'effet */ + char reverse; /* inverse la vitesse */ + char mode; /* type d'effet appliquer (cf les #define) */ + /** @since June 2001 */ + int hPlaneEffect; /* deviation horitontale */ + int vPlaneEffect; /* deviation verticale */ + /** @since April 2002 */ + int waveEffect; /* applique une "surcouche" de wave effect */ + int hypercosEffect; /* applique une "surcouche de hypercos effect */ + + char noisify; /* ajoute un bruit a la transformation */ +}; + +#define NORMAL_MODE 0 +#define WAVE_MODE 1 +#define CRYSTAL_BALL_MODE 2 +#define SCRUNCH_MODE 3 +#define AMULETTE_MODE 4 +#define WATER_MODE 5 +#define HYPERCOS1_MODE 6 +#define HYPERCOS2_MODE 7 +#define YONLY_MODE 8 +#define SPEEDWAY_MODE 9 + +void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, + float t1, float t2, float t3, float t4, guint32 cycle); + +/* filtre de zoom : + * le contenu de pix1 est copie dans pix2. + * zf : si non NULL, configure l'effet. + * resx,resy : taille des buffers. + */ +void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx, + guint32 resy, int switchIncr, float switchMult); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_fx.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_fx.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_fx.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_fx.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,12 @@ +#ifndef _GOOM_FX_H +#define _GOOM_FX_H + +#include "goom_visual_fx.h" +#include "goom_plugin_info.h" + +VisualFX convolve_create (); +VisualFX flying_star_create (void); + +void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_graphic.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_graphic.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_graphic.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_graphic.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,74 @@ +#ifndef GRAPHIC_H +#define GRAPHIC_H + +typedef unsigned int Uint; + +typedef struct +{ + unsigned short r, v, b; +} +Color; + +extern const Color BLACK; +extern const Color WHITE; +extern const Color RED; +extern const Color BLUE; +extern const Color GREEN; +extern const Color YELLOW; +extern const Color ORANGE; +extern const Color VIOLET; + + +#ifdef COLOR_BGRA + +#define R_CHANNEL 0xFF000000 +#define G_CHANNEL 0x00FF0000 +#define B_CHANNEL 0x0000FF00 +#define A_CHANNEL 0x000000FF +#define R_OFFSET 24 +#define G_OFFSET 16 +#define B_OFFSET 8 +#define A_OFFSET 0 + +typedef union _PIXEL { + struct { + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char a; + } channels; + unsigned int val; + unsigned char cop[4]; +} Pixel; + +#else + +#define A_CHANNEL 0xFF000000 +#define R_CHANNEL 0x00FF0000 +#define G_CHANNEL 0x0000FF00 +#define B_CHANNEL 0x000000FF +#define A_OFFSET 24 +#define R_OFFSET 16 +#define G_OFFSET 8 +#define B_OFFSET 0 + +typedef union _PIXEL { + struct { + unsigned char a; + unsigned char r; + unsigned char g; + unsigned char b; + } channels; + unsigned int val; + unsigned char cop[4]; +} Pixel; + +#endif /* COLOR_BGRA */ + +/* +inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c); +inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c); +*/ + + +#endif /* GRAPHIC_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,30 @@ +#ifndef _GOOMCORE_H +#define _GOOMCORE_H + +#include "goom_config.h" +#include "goom_plugin_info.h" +#include "goomsl.h" + +#define NB_FX 10 + +PluginInfo *goom_init (guint32 resx, guint32 resy); +void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy); + +/* + * forceMode == 0 : do nothing + * forceMode == -1 : lock the FX + * forceMode == 1..NB_FX : force a switch to FX n# forceMode + * + * songTitle = pointer to the title of the song... + * - NULL if it is not the start of the song + * - only have a value at the start of the song + */ +guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], int forceMode, float fps, + char *songTitle, char *message); + +/* returns 0 if the buffer wasn't accepted */ +int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer); + +void goom_close (PluginInfo *goomInfo); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_hash.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_hash.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_hash.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_hash.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,100 @@ +#include "goom_hash.h" +#include +#include + +static GoomHashEntry *entry_new(const char *key, HashValue value) { + + GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); + + entry->key = (char *)malloc(strlen(key)+1); + strcpy(entry->key,key); + entry->value = value; + entry->lower = NULL; + entry->upper = NULL; + + return entry; +} + +static void entry_free(GoomHashEntry *entry) { + if (entry!=NULL) { + entry_free(entry->lower); + entry_free(entry->upper); + free(entry->key); + free(entry); + } +} + +static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { + int cmp = strcmp(key,entry->key); + if (cmp==0) { + entry->value = value; + } + else if (cmp > 0) { + if (entry->upper == NULL) + entry->upper = entry_new(key,value); + else + entry_put(entry->upper, key, value); + } + else { + if (entry->lower == NULL) + entry->lower = entry_new(key,value); + else + entry_put(entry->lower, key, value); + } +} + +static HashValue *entry_get(GoomHashEntry *entry, const char *key) { + + int cmp; + if (entry==NULL) + return NULL; + cmp = strcmp(key,entry->key); + if (cmp > 0) + return entry_get(entry->upper, key); + else if (cmp < 0) + return entry_get(entry->lower, key); + else + return &(entry->value); +} + +GoomHash *goom_hash_new(void) { + GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); + _this->root = NULL; + return _this; +} + +void goom_hash_free(GoomHash *_this) { + entry_free(_this->root); + free(_this); +} + +void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { + if (_this->root == NULL) + _this->root = entry_new(key,value); + else + entry_put(_this->root,key,value); +} + +HashValue *goom_hash_get(GoomHash *_this, const char *key) { + return entry_get(_this->root,key); +} + +void goom_hash_put_int(GoomHash *_this, const char *key, int i) { + HashValue value; + value.i = i; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_float(GoomHash *_this, const char *key, float f) { + HashValue value; + value.f = f; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { + HashValue value; + value.ptr = ptr; + goom_hash_put(_this,key,value); +} + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_hash.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_hash.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_hash.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_hash.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,34 @@ +#ifndef _GOOM_HASH_H +#define _GOOM_HASH_H + +typedef struct GOOM_HASH_ENTRY GoomHashEntry; +typedef struct GOOM_HASH GoomHash; + +typedef union { + void *ptr; + int i; + float f; +} HashValue; + +struct GOOM_HASH_ENTRY { + char *key; + HashValue value; + GoomHashEntry *lower; + GoomHashEntry *upper; +}; + +struct GOOM_HASH { + GoomHashEntry *root; +}; + +GoomHash *goom_hash_new(void); +void goom_hash_free(GoomHash *gh); + +void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +HashValue *goom_hash_get(GoomHash *gh, const char *key); + +void goom_hash_put_int(GoomHash *_this, const char *key, int i); +void goom_hash_put_float(GoomHash *_this, const char *key, float f); +void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr); + +#endif /* _GOOM_HASH_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,176 @@ +#ifndef _PLUGIN_INFO_H +#define _PLUGIN_INFO_H + +#include "goom_typedefs.h" + +#include "goom_config.h" + +#include "goom_graphic.h" +#include "goom_config_param.h" +#include "goom_visual_fx.h" +#include "goom_filters.h" +#include "goom_tools.h" +#include "goomsl.h" + +typedef struct { + char drawIFS; + char drawPoints; + char drawTentacle; + + char drawScope; + int farScope; + + int rangemin; + int rangemax; +} GoomState; + +#define STATES_MAX_NB 128 + +/** + * Gives informations about the sound. + */ +struct _SOUND_INFO { + + /* nota : a Goom is just a sound event... */ + + int timeSinceLastGoom; /* >= 0 */ + float goomPower; /* power of the last Goom [0..1] */ + + int timeSinceLastBigGoom; /* >= 0 */ + + float volume; /* [0..1] */ + short samples[2][512]; + + /* other "internal" datas for the sound_tester */ + float goom_limit; /* auto-updated limit of goom_detection */ + float bigGoomLimit; + float accelvar; /* acceleration of the sound - [0..1] */ + float speedvar; /* speed of the sound - [0..100] */ + int allTimesMax; + int totalgoom; /* number of goom since last reset + * (a reset every 64 cycles) */ + + float prov_max; /* accel max since last reset */ + + int cycle; + + /* private */ + PluginParam volume_p; + PluginParam speed_p; + PluginParam accel_p; + PluginParam goom_limit_p; + PluginParam goom_power_p; + PluginParam last_goom_p; + PluginParam last_biggoom_p; + PluginParam biggoom_speed_limit_p; + PluginParam biggoom_factor_p; + + PluginParameters params; /* contains the previously defined parameters. */ +}; + + +/** + * Allows FXs to know the current state of the plugin. + */ +struct _PLUGIN_INFO { + + /* public datas */ + + int nbParams; + PluginParameters *params; + + /* private datas */ + + struct _SIZE_TYPE { + int width; + int height; + int size; /* == screen.height * screen.width. */ + } screen; + + SoundInfo sound; + + int nbVisuals; + VisualFX **visuals; /* pointers on all the visual fx */ + + /** The known FX */ + VisualFX convolve_fx; + VisualFX star_fx; + VisualFX zoomFilter_fx; + VisualFX tentacles_fx; + VisualFX ifs_fx; + + /** image buffers */ + guint32 *pixel; + guint32 *back; + Pixel *p1, *p2; + Pixel *conv; + Pixel *outputBuf; + + /** state of goom */ + guint32 cycle; + GoomState states[STATES_MAX_NB]; + int statesNumber; + int statesRangeMax; + + GoomState *curGState; + + /** effet de ligne.. */ + GMLine *gmline1; + GMLine *gmline2; + + /** sinus table */ + int sintable[0x10000]; + + /* INTERNALS */ + + /** goom_update internals. + * I took all static variables from goom_update and put them here.. for the moment. + */ + struct { + int lockvar; /* pour empecher de nouveaux changements */ + int goomvar; /* boucle des gooms */ + int loopvar; /* mouvement des points */ + int stop_lines; + int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */ + int decay_ifs; /* disparition de l'ifs */ + int recay_ifs; /* dedisparition de l'ifs */ + int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */ + int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */ + int lineMode; /* l'effet lineaire a dessiner */ + float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */ + int switchIncrAmount; /* 0x7f */ + float switchMult; /* 1.0f */ + int switchIncr; /* = SWITCHINCR; */ + int stateSelectionRnd; + int stateSelectionBlocker; + int previousZoomSpeed; + int timeOfTitleDisplay; + char titleText[1024]; + ZoomFilterData zoomFilterData; + } update; + + struct { + int numberOfLinesInMessage; + char message[0x800]; + int affiche; + int longueur; + } update_message; + + struct { + void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); + void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + } methods; + + GoomRandom *gRandom; + + GoomSL *scanner; + GoomSL *main_scanner; + const char *main_script_str; +}; + +void plugin_info_init(PluginInfo *p, int nbVisual); + +/* i = [0..p->nbVisual-1] */ +void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1514 @@ +#include +#include +#include +#include +#include "goomsl.h" +#include "goomsl_private.h" +#include "goomsl_yacc.h" + +/*#define TRACE_SCRIPT*/ + + /* {{{ definition of the instructions number */ +#define INSTR_SETI_VAR_INTEGER 1 +#define INSTR_SETI_VAR_VAR 2 +#define INSTR_SETF_VAR_FLOAT 3 +#define INSTR_SETF_VAR_VAR 4 +#define INSTR_NOP 5 +/* #define INSTR_JUMP 6 */ +#define INSTR_SETP_VAR_PTR 7 +#define INSTR_SETP_VAR_VAR 8 +#define INSTR_SUBI_VAR_INTEGER 9 +#define INSTR_SUBI_VAR_VAR 10 +#define INSTR_SUBF_VAR_FLOAT 11 +#define INSTR_SUBF_VAR_VAR 12 +#define INSTR_ISLOWERF_VAR_VAR 13 +#define INSTR_ISLOWERF_VAR_FLOAT 14 +#define INSTR_ISLOWERI_VAR_VAR 15 +#define INSTR_ISLOWERI_VAR_INTEGER 16 +#define INSTR_ADDI_VAR_INTEGER 17 +#define INSTR_ADDI_VAR_VAR 18 +#define INSTR_ADDF_VAR_FLOAT 19 +#define INSTR_ADDF_VAR_VAR 20 +#define INSTR_MULI_VAR_INTEGER 21 +#define INSTR_MULI_VAR_VAR 22 +#define INSTR_MULF_VAR_FLOAT 23 +#define INSTR_MULF_VAR_VAR 24 +#define INSTR_DIVI_VAR_INTEGER 25 +#define INSTR_DIVI_VAR_VAR 26 +#define INSTR_DIVF_VAR_FLOAT 27 +#define INSTR_DIVF_VAR_VAR 28 +/* #define INSTR_JZERO 29 */ +#define INSTR_ISEQUALP_VAR_VAR 30 +#define INSTR_ISEQUALP_VAR_PTR 31 +#define INSTR_ISEQUALI_VAR_VAR 32 +#define INSTR_ISEQUALI_VAR_INTEGER 33 +#define INSTR_ISEQUALF_VAR_VAR 34 +#define INSTR_ISEQUALF_VAR_FLOAT 35 +/* #define INSTR_CALL 36 */ +/* #define INSTR_RET 37 */ +/* #define INSTR_EXT_CALL 38 */ +#define INSTR_NOT_VAR 39 +/* #define INSTR_JNZERO 40 */ +#define INSTR_SETS_VAR_VAR 41 +#define INSTR_ISEQUALS_VAR_VAR 42 +#define INSTR_ADDS_VAR_VAR 43 +#define INSTR_SUBS_VAR_VAR 44 +#define INSTR_MULS_VAR_VAR 45 +#define INSTR_DIVS_VAR_VAR 46 + + /* }}} */ +/* {{{ definition of the validation error types */ +static const char *VALIDATE_OK = "ok"; +#define VALIDATE_ERROR "error while validating " +#define VALIDATE_TODO "todo" +#define VALIDATE_SYNTHAX_ERROR "synthax error" +#define VALIDATE_NO_SUCH_INT "no such integer variable" +#define VALIDATE_NO_SUCH_VAR "no such variable" +#define VALIDATE_NO_SUCH_DEST_VAR "no such destination variable" +#define VALIDATE_NO_SUCH_SRC_VAR "no such src variable" +/* }}} */ + + /***********************************/ + /* PROTOTYPE OF INTERNAL FUNCTIONS */ +/***********************************/ + +/* {{{ */ +static void gsl_instr_free(Instruction *_this); +static const char *gsl_instr_validate(Instruction *_this); +static void gsl_instr_display(Instruction *_this); + +static InstructionFlow *iflow_new(void); +static void iflow_add_instr(InstructionFlow *_this, Instruction *instr); +static void iflow_clean(InstructionFlow *_this); +static void iflow_free(InstructionFlow *_this); +static void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl); +/* }}} */ + + /************************************/ + /* DEFINITION OF INTERNAL FUNCTIONS */ +/************************************/ + +void iflow_free(InstructionFlow *_this) +{ /* {{{ */ + free(_this->instr); + goom_hash_free(_this->labels); + free(_this); /*TODO: finir cette fonction */ +} /* }}} */ + +void iflow_clean(InstructionFlow *_this) +{ /* {{{ */ + /* TODO: clean chaque instruction du flot */ + _this->number = 0; + goom_hash_free(_this->labels); + _this->labels = goom_hash_new(); +} /* }}} */ + +InstructionFlow *iflow_new(void) +{ /* {{{ */ + InstructionFlow *_this = (InstructionFlow*)malloc(sizeof(InstructionFlow)); + _this->number = 0; + _this->tabsize = 6; + _this->instr = (Instruction**)malloc(_this->tabsize * sizeof(Instruction*)); + _this->labels = goom_hash_new(); + + return _this; +} /* }}} */ + +void iflow_add_instr(InstructionFlow *_this, Instruction *instr) +{ /* {{{ */ + if (_this->number == _this->tabsize) { + _this->tabsize *= 2; + _this->instr = (Instruction**)realloc(_this->instr, _this->tabsize * sizeof(Instruction*)); + } + _this->instr[_this->number] = instr; + instr->address = _this->number; + _this->number++; +} /* }}} */ + +void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns) +{ /* {{{ */ + if (_this->cur_param <= 0) { + fprintf(stderr, "ERROR: Line %d, No more params to instructions\n", _this->line_number); + exit(1); + } + _this->vnamespace[_this->cur_param-1] = ns; +} /* }}} */ + +void gsl_instr_add_param(Instruction *instr, char *param, int type) +{ /* {{{ */ + int len; + if (instr==NULL) + return; + if (instr->cur_param==0) + return; + --instr->cur_param; + len = strlen(param); + instr->params[instr->cur_param] = (char*)malloc(len+1); + strcpy(instr->params[instr->cur_param], param); + instr->types[instr->cur_param] = type; + if (instr->cur_param == 0) { + + const char *result = gsl_instr_validate(instr); + if (result != VALIDATE_OK) { + printf("ERROR: Line %d: ", instr->parent->num_lines + 1); + gsl_instr_display(instr); + printf("... %s\n", result); + instr->parent->compilationOK = 0; + exit(1); + } + +#if USE_JITC_X86 + iflow_add_instr(instr->parent->iflow, instr); +#else + if (instr->id != INSTR_NOP) + iflow_add_instr(instr->parent->iflow, instr); + else + gsl_instr_free(instr); +#endif + } +} /* }}} */ + +Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number) +{ /* {{{ */ + Instruction *instr = (Instruction*)malloc(sizeof(Instruction)); + instr->params = (char**)malloc(nb_param*sizeof(char*)); + instr->vnamespace = (GoomHash**)malloc(nb_param*sizeof(GoomHash*)); + instr->types = (int*)malloc(nb_param*sizeof(int)); + instr->cur_param = instr->nb_param = nb_param; + instr->parent = parent; + instr->id = id; + instr->name = name; + instr->jump_label = NULL; + instr->line_number = line_number; + return instr; +} /* }}} */ + +void gsl_instr_free(Instruction *_this) +{ /* {{{ */ + int i; + free(_this->types); + for (i=_this->cur_param; i<_this->nb_param; ++i) + free(_this->params[i]); + free(_this->params); + free(_this); +} /* }}} */ + +void gsl_instr_display(Instruction *_this) +{ /* {{{ */ + int i=_this->nb_param-1; + printf("%s", _this->name); + while(i>=_this->cur_param) { + printf(" %s", _this->params[i]); + --i; + } +} /* }}} */ + + /****************************************/ + /* VALIDATION OF INSTRUCTION PARAMETERS */ +/****************************************/ + +static const char *validate_v_v(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + HashValue *src = goom_hash_get(_this->vnamespace[0], _this->params[0]); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_DEST_VAR; + } + if (src == NULL) { + return VALIDATE_NO_SUCH_SRC_VAR; + } + _this->data.udest.var = dest->ptr; + _this->data.usrc.var = src->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate_v_i(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + _this->data.usrc.value_int = strtol(_this->params[0],NULL,0); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_INT; + } + _this->data.udest.var = dest->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate_v_p(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + _this->data.usrc.value_ptr = strtol(_this->params[0],NULL,0); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_INT; + } + _this->data.udest.var = dest->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate_v_f(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + _this->data.usrc.value_float = atof(_this->params[0]); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_VAR; + } + _this->data.udest.var = dest->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate(Instruction *_this, + int vf_f_id, int vf_v_id, + int vi_i_id, int vi_v_id, + int vp_p_id, int vp_v_id, + int vs_v_id) +{ /* {{{ */ + if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FLOAT)) { + _this->id = vf_f_id; + return validate_v_f(_this); + } + else if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FVAR)) { + _this->id = vf_v_id; + return validate_v_v(_this); + } + else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_INTEGER)) { + _this->id = vi_i_id; + return validate_v_i(_this); + } + else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_IVAR)) { + _this->id = vi_v_id; + return validate_v_v(_this); + } + else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PTR)) { + if (vp_p_id == INSTR_NOP) return VALIDATE_ERROR; + _this->id = vp_p_id; + return validate_v_p(_this); + } + else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PVAR)) { + _this->id = vp_v_id; + if (vp_v_id == INSTR_NOP) return VALIDATE_ERROR; + return validate_v_v(_this); + } + else if ((_this->types[1] < FIRST_RESERVED) && (_this->types[1] >= 0) && (_this->types[0] == _this->types[1])) { + _this->id = vs_v_id; + if (vs_v_id == INSTR_NOP) return "Impossible operation to perform between two structs"; + return validate_v_v(_this); + } + return VALIDATE_ERROR; +} /* }}} */ + +const char *gsl_instr_validate(Instruction *_this) +{ /* {{{ */ + if (_this->id != INSTR_EXT_CALL) { + int i = _this->nb_param; + while (i>0) + { + i--; + if (_this->types[i] == TYPE_VAR) { + int type = gsl_type_of_var(_this->vnamespace[i], _this->params[i]); + + if (type == INSTR_INT) + _this->types[i] = TYPE_IVAR; + else if (type == INSTR_FLOAT) + _this->types[i] = TYPE_FVAR; + else if (type == INSTR_PTR) + _this->types[i] = TYPE_PVAR; + else if ((type >= 0) && (type < FIRST_RESERVED)) + _this->types[i] = type; + else fprintf(stderr,"WARNING: Line %d, %s has no namespace\n", _this->line_number, _this->params[i]); + } + } + } + + switch (_this->id) { + + /* set */ + case INSTR_SET: + return validate(_this, + INSTR_SETF_VAR_FLOAT, INSTR_SETF_VAR_VAR, + INSTR_SETI_VAR_INTEGER, INSTR_SETI_VAR_VAR, + INSTR_SETP_VAR_PTR, INSTR_SETP_VAR_VAR, + INSTR_SETS_VAR_VAR); + + /* extcall */ + case INSTR_EXT_CALL: + if (_this->types[0] == TYPE_VAR) { + HashValue *fval = goom_hash_get(_this->parent->functions, _this->params[0]); + if (fval) { + _this->data.udest.external_function = (struct _ExternalFunctionStruct*)fval->ptr; + return VALIDATE_OK; + } + } + return VALIDATE_ERROR; + + /* call */ + case INSTR_CALL: + if (_this->types[0] == TYPE_LABEL) { + _this->jump_label = _this->params[0]; + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* ret */ + case INSTR_RET: + return VALIDATE_OK; + + /* jump */ + case INSTR_JUMP: + + if (_this->types[0] == TYPE_LABEL) { + _this->jump_label = _this->params[0]; + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* jzero / jnzero */ + case INSTR_JZERO: + case INSTR_JNZERO: + + if (_this->types[0] == TYPE_LABEL) { + _this->jump_label = _this->params[0]; + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* label */ + case INSTR_LABEL: + + if (_this->types[0] == TYPE_LABEL) { + _this->id = INSTR_NOP; + _this->nop_label = _this->params[0]; + goom_hash_put_int(_this->parent->iflow->labels, _this->params[0], _this->parent->iflow->number); + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* isequal */ + case INSTR_ISEQUAL: + return validate(_this, + INSTR_ISEQUALF_VAR_FLOAT, INSTR_ISEQUALF_VAR_VAR, + INSTR_ISEQUALI_VAR_INTEGER, INSTR_ISEQUALI_VAR_VAR, + INSTR_ISEQUALP_VAR_PTR, INSTR_ISEQUALP_VAR_VAR, + INSTR_ISEQUALS_VAR_VAR); + + /* not */ + case INSTR_NOT: + _this->id = INSTR_NOT_VAR; + return VALIDATE_OK; + + /* islower */ + case INSTR_ISLOWER: + return validate(_this, + INSTR_ISLOWERF_VAR_FLOAT, INSTR_ISLOWERF_VAR_VAR, + INSTR_ISLOWERI_VAR_INTEGER, INSTR_ISLOWERI_VAR_VAR, + INSTR_NOP, INSTR_NOP, INSTR_NOP); + + /* add */ + case INSTR_ADD: + return validate(_this, + INSTR_ADDF_VAR_FLOAT, INSTR_ADDF_VAR_VAR, + INSTR_ADDI_VAR_INTEGER, INSTR_ADDI_VAR_VAR, + INSTR_NOP, INSTR_NOP, + INSTR_ADDS_VAR_VAR); + + /* mul */ + case INSTR_MUL: + return validate(_this, + INSTR_MULF_VAR_FLOAT, INSTR_MULF_VAR_VAR, + INSTR_MULI_VAR_INTEGER, INSTR_MULI_VAR_VAR, + INSTR_NOP, INSTR_NOP, + INSTR_MULS_VAR_VAR); + + /* sub */ + case INSTR_SUB: + return validate(_this, + INSTR_SUBF_VAR_FLOAT, INSTR_SUBF_VAR_VAR, + INSTR_SUBI_VAR_INTEGER, INSTR_SUBI_VAR_VAR, + INSTR_NOP, INSTR_NOP, + INSTR_SUBS_VAR_VAR); + + /* div */ + case INSTR_DIV: + return validate(_this, + INSTR_DIVF_VAR_FLOAT, INSTR_DIVF_VAR_VAR, + INSTR_DIVI_VAR_INTEGER, INSTR_DIVI_VAR_VAR, + INSTR_NOP,INSTR_NOP, + INSTR_DIVS_VAR_VAR); + + default: + return VALIDATE_TODO; + } + return VALIDATE_ERROR; +} /* }}} */ + + /*************/ + /* EXECUTION */ +/*************/ +void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl) +{ /* {{{ */ + int flag = 0; + int ip = 0; + FastInstruction *instr = _this->instr; + int stack[0x10000]; + int stack_pointer = 0; + + stack[stack_pointer++] = -1; + + /* Quelques Macro pour rendre le code plus lisible */ +#define pSRC_VAR instr[ip].data.usrc.var +#define SRC_VAR_INT *instr[ip].data.usrc.var_int +#define SRC_VAR_FLOAT *instr[ip].data.usrc.var_float +#define SRC_VAR_PTR *instr[ip].data.usrc.var_ptr + +#define pDEST_VAR instr[ip].data.udest.var +#define DEST_VAR_INT *instr[ip].data.udest.var_int +#define DEST_VAR_FLOAT *instr[ip].data.udest.var_float +#define DEST_VAR_PTR *instr[ip].data.udest.var_ptr + +#define VALUE_INT instr[ip].data.usrc.value_int +#define VALUE_FLOAT instr[ip].data.usrc.value_float +#define VALUE_PTR instr[ip].data.usrc.value_ptr + +#define JUMP_OFFSET instr[ip].data.udest.jump_offset + +#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +#define DEST_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +#define SRC_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +#define SRC_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size + + while (1) + { + int i; +#ifdef TRACE_SCRIPT + printf("execute "); gsl_instr_display(instr[ip].proto); printf("\n"); +#endif + switch (instr[ip].id) { + + /* SET.I */ + case INSTR_SETI_VAR_INTEGER: + DEST_VAR_INT = VALUE_INT; + ++ip; break; + + case INSTR_SETI_VAR_VAR: + DEST_VAR_INT = SRC_VAR_INT; + ++ip; break; + + /* SET.F */ + case INSTR_SETF_VAR_FLOAT: + DEST_VAR_FLOAT = VALUE_FLOAT; + ++ip; break; + + case INSTR_SETF_VAR_VAR: + DEST_VAR_FLOAT = SRC_VAR_FLOAT; + ++ip; break; + + /* SET.P */ + case INSTR_SETP_VAR_VAR: + DEST_VAR_PTR = SRC_VAR_PTR; + ++ip; break; + + case INSTR_SETP_VAR_PTR: + DEST_VAR_PTR = VALUE_PTR; + ++ip; break; + + /* JUMP */ + case INSTR_JUMP: + ip += JUMP_OFFSET; break; + + /* JZERO */ + case INSTR_JZERO: + ip += (flag ? 1 : JUMP_OFFSET); break; + + case INSTR_NOP: + ++ip; break; + + /* ISEQUAL.P */ + case INSTR_ISEQUALP_VAR_VAR: + flag = (DEST_VAR_PTR == SRC_VAR_PTR); + ++ip; break; + + case INSTR_ISEQUALP_VAR_PTR: + flag = (DEST_VAR_PTR == VALUE_PTR); + ++ip; break; + + /* ISEQUAL.I */ + case INSTR_ISEQUALI_VAR_VAR: + flag = (DEST_VAR_INT == SRC_VAR_INT); + ++ip; break; + + case INSTR_ISEQUALI_VAR_INTEGER: + flag = (DEST_VAR_INT == VALUE_INT); + ++ip; break; + + /* ISEQUAL.F */ + case INSTR_ISEQUALF_VAR_VAR: + flag = (DEST_VAR_FLOAT == SRC_VAR_FLOAT); + ++ip; break; + + case INSTR_ISEQUALF_VAR_FLOAT: + flag = (DEST_VAR_FLOAT == VALUE_FLOAT); + ++ip; break; + + /* ISLOWER.I */ + case INSTR_ISLOWERI_VAR_VAR: + flag = (DEST_VAR_INT < SRC_VAR_INT); + ++ip; break; + + case INSTR_ISLOWERI_VAR_INTEGER: + flag = (DEST_VAR_INT < VALUE_INT); + ++ip; break; + + /* ISLOWER.F */ + case INSTR_ISLOWERF_VAR_VAR: + flag = (DEST_VAR_FLOAT < SRC_VAR_FLOAT); + ++ip; break; + + case INSTR_ISLOWERF_VAR_FLOAT: + flag = (DEST_VAR_FLOAT < VALUE_FLOAT); + ++ip; break; + + /* ADD.I */ + case INSTR_ADDI_VAR_VAR: + DEST_VAR_INT += SRC_VAR_INT; + ++ip; break; + + case INSTR_ADDI_VAR_INTEGER: + DEST_VAR_INT += VALUE_INT; + ++ip; break; + + /* ADD.F */ + case INSTR_ADDF_VAR_VAR: + DEST_VAR_FLOAT += SRC_VAR_FLOAT; + ++ip; break; + + case INSTR_ADDF_VAR_FLOAT: + DEST_VAR_FLOAT += VALUE_FLOAT; + ++ip; break; + + /* MUL.I */ + case INSTR_MULI_VAR_VAR: + DEST_VAR_INT *= SRC_VAR_INT; + ++ip; break; + + case INSTR_MULI_VAR_INTEGER: + DEST_VAR_INT *= VALUE_INT; + ++ip; break; + + /* MUL.F */ + case INSTR_MULF_VAR_FLOAT: + DEST_VAR_FLOAT *= VALUE_FLOAT; + ++ip; break; + + case INSTR_MULF_VAR_VAR: + DEST_VAR_FLOAT *= SRC_VAR_FLOAT; + ++ip; break; + + /* DIV.I */ + case INSTR_DIVI_VAR_VAR: + DEST_VAR_INT /= SRC_VAR_INT; + ++ip; break; + + case INSTR_DIVI_VAR_INTEGER: + DEST_VAR_INT /= VALUE_INT; + ++ip; break; + + /* DIV.F */ + case INSTR_DIVF_VAR_FLOAT: + DEST_VAR_FLOAT /= VALUE_FLOAT; + ++ip; break; + + case INSTR_DIVF_VAR_VAR: + DEST_VAR_FLOAT /= SRC_VAR_FLOAT; + ++ip; break; + + /* SUB.I */ + case INSTR_SUBI_VAR_VAR: + DEST_VAR_INT -= SRC_VAR_INT; + ++ip; break; + + case INSTR_SUBI_VAR_INTEGER: + DEST_VAR_INT -= VALUE_INT; + ++ip; break; + + /* SUB.F */ + case INSTR_SUBF_VAR_FLOAT: + DEST_VAR_FLOAT -= VALUE_FLOAT; + ++ip; break; + + case INSTR_SUBF_VAR_VAR: + DEST_VAR_FLOAT -= SRC_VAR_FLOAT; + ++ip; break; + + /* CALL */ + case INSTR_CALL: + stack[stack_pointer++] = ip + 1; + ip += JUMP_OFFSET; break; + + /* RET */ + case INSTR_RET: + ip = stack[--stack_pointer]; + if (ip<0) return; + break; + + /* EXT_CALL */ + case INSTR_EXT_CALL: + instr[ip].data.udest.external_function->function(gsl, gsl->vars, instr[ip].data.udest.external_function->vars); + ++ip; break; + + /* NOT */ + case INSTR_NOT_VAR: + flag = !flag; + ++ip; break; + + /* JNZERO */ + case INSTR_JNZERO: + ip += (flag ? JUMP_OFFSET : 1); break; + + case INSTR_SETS_VAR_VAR: + memcpy(pDEST_VAR, pSRC_VAR, DEST_STRUCT_SIZE); + ++ip; break; + + case INSTR_ISEQUALS_VAR_VAR: + break; + + case INSTR_ADDS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) += SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + case INSTR_SUBS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) -= SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) -= SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + case INSTR_MULS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) *= SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) *= SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + case INSTR_DIVS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) /= SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) /= SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + default: + printf("NOT IMPLEMENTED : %d\n", instr[ip].id); + ++ip; + exit(1); + } + } +} /* }}} */ + +int gsl_malloc(GoomSL *_this, int size) +{ /* {{{ */ + if (_this->nbPtr >= _this->ptrArraySize) { + _this->ptrArraySize *= 2; + _this->ptrArray = (void**)realloc(_this->ptrArray, sizeof(void*) * _this->ptrArraySize); + } + _this->ptrArray[_this->nbPtr] = malloc(size); + return _this->nbPtr++; +} /* }}} */ + +void *gsl_get_ptr(GoomSL *_this, int id) +{ /* {{{ */ + if ((id>=0)&&(id<_this->nbPtr)) + return _this->ptrArray[id]; + fprintf(stderr,"INVALID GET PTR 0x%08x\n", id); + return NULL; +} /* }}} */ + +void gsl_free_ptr(GoomSL *_this, int id) +{ /* {{{ */ + if ((id>=0)&&(id<_this->nbPtr)) { + free(_this->ptrArray[id]); + _this->ptrArray[id] = 0; + } +} /* }}} */ + +void gsl_enternamespace(const char *name) +{ /* {{{ */ + HashValue *val = goom_hash_get(currentGoomSL->functions, name); + if (val) { + ExternalFunctionStruct *function = (ExternalFunctionStruct*)val->ptr; + currentGoomSL->currentNS++; + currentGoomSL->namespaces[currentGoomSL->currentNS] = function->vars; + } + else { + fprintf(stderr, "ERROR: Line %d, Could not find namespace: %s\n", currentGoomSL->num_lines, name); + exit(1); + } +} /* }}} */ + +void gsl_reenternamespace(GoomHash *nsinfo) { + currentGoomSL->currentNS++; + currentGoomSL->namespaces[currentGoomSL->currentNS] = nsinfo; +} + +GoomHash *gsl_leavenamespace(void) +{ /* {{{ */ + currentGoomSL->currentNS--; + return currentGoomSL->namespaces[currentGoomSL->currentNS+1]; +} /* }}} */ + +GoomHash *gsl_find_namespace(const char *name) +{ /* {{{ */ + int i; + for (i=currentGoomSL->currentNS;i>=0;--i) { + if (goom_hash_get(currentGoomSL->namespaces[i], name)) + return currentGoomSL->namespaces[i]; + } + return NULL; +} /* }}} */ + +void gsl_declare_task(const char *name) +{ /* {{{ */ + if (goom_hash_get(currentGoomSL->functions, name)) { + return; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); + gef->function = 0; + gef->vars = goom_hash_new(); + gef->is_extern = 0; + goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); + } +} /* }}} */ + +void gsl_declare_external_task(const char *name) +{ /* {{{ */ + if (goom_hash_get(currentGoomSL->functions, name)) { + fprintf(stderr, "ERROR: Line %d, Duplicate declaration of %s\n", currentGoomSL->num_lines, name); + return; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); + gef->function = 0; + gef->vars = goom_hash_new(); + gef->is_extern = 1; + goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); + } +} /* }}} */ + +static void reset_scanner(GoomSL *gss) +{ /* {{{ */ + gss->num_lines = 0; + gss->instr = NULL; + iflow_clean(gss->iflow); + + /* reset variables */ + goom_hash_free(gss->vars); + gss->vars = goom_hash_new(); + gss->currentNS = 0; + gss->namespaces[0] = gss->vars; + + goom_hash_free(gss->structIDS); + gss->structIDS = goom_hash_new(); + + while (gss->nbStructID > 0) { + int i; + gss->nbStructID--; + for(i=0;igsl_struct[gss->nbStructID]->nbFields;++i) + free(gss->gsl_struct[gss->nbStructID]->fields[i]); + free(gss->gsl_struct[gss->nbStructID]); + } + + gss->compilationOK = 1; + + goom_heap_delete(gss->data_heap); + gss->data_heap = goom_heap_new(); +} /* }}} */ + +static void calculate_labels(InstructionFlow *iflow) +{ /* {{{ */ + int i = 0; + while (i < iflow->number) { + Instruction *instr = iflow->instr[i]; + if (instr->jump_label) { + HashValue *label = goom_hash_get(iflow->labels,instr->jump_label); + if (label) { + instr->data.udest.jump_offset = -instr->address + label->i; + } + else { + fprintf(stderr, "ERROR: Line %d, Could not find label %s\n", instr->line_number, instr->jump_label); + instr->id = INSTR_NOP; + instr->nop_label = 0; + exit(1); + } + } + ++i; + } +} /* }}} */ + +static int powerOfTwo(int i) +{ + int b; + for (b=0;b<31;b++) + if (i == (1<iflow->number; + int i; +#ifdef USE_JITC_X86 + + /* pour compatibilite avec les MACROS servant a execution */ + int ip = 0; + GoomSL *gsl = currentGoomSL; + + JitcX86Env *jitc; + + if (currentGoomSL->jitc != NULL) + jitc_x86_delete(currentGoomSL->jitc); + jitc = currentGoomSL->jitc = jitc_x86_env_new(0xffff); + currentGoomSL->jitc_func = jitc_prepare_func(jitc); + +#if 0 +#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +#define DEST_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +#define SRC_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +#define SRC_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size +#endif + + JITC_JUMP_LABEL(jitc, "__very_end__"); + JITC_ADD_LABEL (jitc, "__very_start__"); + + for (i=0;iiflow->instr[i]; + switch (instr->id) { + case INSTR_SETI_VAR_INTEGER : + jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); + break; + case INSTR_SETI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + /* SET.F */ + case INSTR_SETF_VAR_FLOAT : + jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_float, *(int*)(&instr->data.usrc.value_float)); + break; + case INSTR_SETF_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_float); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_float); + break; + case INSTR_NOP : + if (instr->nop_label != 0) + JITC_ADD_LABEL(jitc, instr->nop_label); + break; + case INSTR_JUMP : + JITC_JUMP_LABEL(jitc,instr->jump_label); + break; + case INSTR_SETP_VAR_PTR : + jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_ptr, instr->data.usrc.value_ptr); + break; + case INSTR_SETP_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_ptr); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_ptr); + break; + case INSTR_SUBI_VAR_INTEGER : + jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, -instr->data.usrc.value_int); + break; + case INSTR_SUBI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "sub eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_SUBF_VAR_FLOAT : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_SUBF_VAR_VAR : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISLOWERF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISLOWERF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISLOWERI_VAR_VAR: + jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); + jitc_add(jitc,"sub edx, [$d]", instr->data.usrc.var_int); + jitc_add(jitc,"shr edx, $d", 31); + break; + case INSTR_ISLOWERI_VAR_INTEGER: + jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); + jitc_add(jitc,"sub edx, $d", instr->data.usrc.value_int); + jitc_add(jitc,"shr edx, $d", 31); + break; + case INSTR_ADDI_VAR_INTEGER: + jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); + break; + case INSTR_ADDI_VAR_VAR: + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "add eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_ADDF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ADDF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_MULI_VAR_INTEGER: + if (instr->data.usrc.value_int != 1) + { + int po2 = powerOfTwo(instr->data.usrc.value_int); + if (po2) { + /* performs (V / 2^n) by doing V >> n */ + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "sal eax, $d", po2); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + } + else { + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "imul eax, $d", instr->data.usrc.value_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + } + } + break; + case INSTR_MULI_VAR_VAR: + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "imul eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_MULF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_MULF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_DIVI_VAR_INTEGER: + if ((instr->data.usrc.value_int != 1) && (instr->data.usrc.value_int != 0)) + { + int po2 = powerOfTwo(instr->data.usrc.value_int); + if (po2) { + /* performs (V / 2^n) by doing V >> n */ + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "sar eax, $d", po2); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + } + else { + /* performs (V/n) by doing (V*(32^2/n)) */ + long coef; + double dcoef = (double)4294967296.0 / (double)instr->data.usrc.value_int; + if (dcoef < 0.0) dcoef = -dcoef; + coef = (long)floor(dcoef); + dcoef -= floor(dcoef); + if (dcoef < 0.5) coef += 1; + + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "mov edx, $d", coef); + jitc_add(jitc, "imul edx"); + if (instr->data.usrc.value_int < 0) + jitc_add(jitc, "neg edx"); + jitc_add(jitc, "mov [$d], edx", instr->data.udest.var_int); + } + } + break; + case INSTR_DIVI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "cdq"); /* sign extend eax into edx */ + jitc_add(jitc, "idiv [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_DIVF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_DIVF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_JZERO: + jitc_add(jitc, "cmp edx, $d", 0); + jitc_add(jitc, "je $s", instr->jump_label); + break; + case INSTR_ISEQUALP_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_ptr); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALP_VAR_PTR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_ptr); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALI_VAR_INTEGER : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_int); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALF_VAR_VAR : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISEQUALF_VAR_FLOAT : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_CALL: + jitc_add(jitc, "call $s", instr->jump_label); + break; + case INSTR_RET: + jitc_add(jitc, "ret"); + break; + case INSTR_EXT_CALL: + jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function->vars)); + jitc_add(jitc, "push eax"); + jitc_add(jitc, "mov edx, [$d]", &(currentGoomSL->vars)); + jitc_add(jitc, "push edx"); + jitc_add(jitc, "mov eax, [$d]", &(currentGoomSL)); + jitc_add(jitc, "push eax"); + + jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function)); + jitc_add(jitc, "mov eax, [eax]"); + jitc_add(jitc, "call [eax]"); + jitc_add(jitc, "add esp, $d", 12); + break; + case INSTR_NOT_VAR: + jitc_add(jitc, "mov eax, edx"); + jitc_add(jitc, "mov edx, $d", 1); + jitc_add(jitc, "sub edx, eax"); + break; + case INSTR_JNZERO: + jitc_add(jitc, "cmp edx, $d", 0); + jitc_add(jitc, "jne $s", instr->jump_label); + break; + case INSTR_SETS_VAR_VAR: + { + int loop = DEST_STRUCT_SIZE / sizeof(int); + int dst = (int)pDEST_VAR; + int src = (int)pSRC_VAR; + + while (loop--) { + jitc_add(jitc,"mov eax, [$d]", src); + jitc_add(jitc,"mov [$d], eax", dst); + src += 4; + dst += 4; + } + } + break; + case INSTR_ISEQUALS_VAR_VAR: + break; + case INSTR_ADDS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { /* TODO interlace 2 */ + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "add eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + /* DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); */ + /* TODO */ + } + ++i; + } + break; + } + case INSTR_SUBS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "sub eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + break; + } + case INSTR_MULS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "imul eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + break; + } + case INSTR_DIVS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "cdq"); + jitc_add(jitc, "idiv [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + break; + } + } + } + + JITC_ADD_LABEL (jitc, "__very_end__"); + jitc_add(jitc, "call $s", "__very_start__"); + jitc_add(jitc, "mov eax, $d", 0); + jitc_validate_func(jitc); +#else + InstructionFlow *iflow = currentGoomSL->iflow; + FastInstructionFlow *fastiflow = (FastInstructionFlow*)malloc(sizeof(FastInstructionFlow)); + fastiflow->mallocedInstr = calloc(number*16, sizeof(FastInstruction)); + /* fastiflow->instr = (FastInstruction*)(((int)fastiflow->mallocedInstr) + 16 - (((int)fastiflow->mallocedInstr)%16)); */ + fastiflow->instr = (FastInstruction*)fastiflow->mallocedInstr; + fastiflow->number = number; + for(i=0;iinstr[i].id = iflow->instr[i]->id; + fastiflow->instr[i].data = iflow->instr[i]->data; + fastiflow->instr[i].proto = iflow->instr[i]; + } + currentGoomSL->fastiflow = fastiflow; +#endif +} /* }}} */ + +void yy_scan_string(const char *str); +void yyparse(void); + +GoomHash *gsl_globals(GoomSL *_this) +{ + return _this->vars; +} + + +/** + * Some native external functions + */ +static void ext_charAt(GoomSL *gsl, GoomHash *global, GoomHash *local) +{ + char *string = GSL_LOCAL_PTR(gsl, local, "value"); + int index = GSL_LOCAL_INT(gsl, local, "index"); + GSL_GLOBAL_INT(gsl, "charAt") = 0; + if (string == NULL) { + return; + } + if (index < strlen(string)) + GSL_GLOBAL_INT(gsl, "charAt") = string[index]; +} + +static void ext_i2f(GoomSL *gsl, GoomHash *global, GoomHash *local) +{ + int i = GSL_LOCAL_INT(gsl, local, "value"); + GSL_GLOBAL_FLOAT(gsl, "i2f") = i; +} + +static void ext_f2i(GoomSL *gsl, GoomHash *global, GoomHash *local) +{ + float f = GSL_LOCAL_FLOAT(gsl, local, "value"); + GSL_GLOBAL_INT(gsl, "f2i") = f; +} + +/** + * + */ +void gsl_compile(GoomSL *_currentGoomSL, const char *script) +{ /* {{{ */ + char *script_and_externals; + static const char *sBinds = + "external : int\n" + "external : int\n" + "external : float\n"; + +#ifdef VERBOSE + printf("\n=== Starting Compilation ===\n"); +#endif + + script_and_externals = malloc(strlen(script) + strlen(sBinds) + 2); + strcpy(script_and_externals, sBinds); + strcat(script_and_externals, script); + + /* 0- reset */ + currentGoomSL = _currentGoomSL; + reset_scanner(currentGoomSL); + + /* 1- create the syntaxic tree */ + yy_scan_string(script_and_externals); + yyparse(); + + /* 2- generate code */ + gsl_commit_compilation(); + + /* 3- resolve symbols */ + calculate_labels(currentGoomSL->iflow); + + /* 4- optimize code */ + gsl_create_fast_iflow(); + + /* 5- bind a few internal functions */ + gsl_bind_function(currentGoomSL, "charAt", ext_charAt); + gsl_bind_function(currentGoomSL, "f2i", ext_f2i); + gsl_bind_function(currentGoomSL, "i2f", ext_i2f); + free(script_and_externals); + +#ifdef VERBOSE + printf("=== Compilation done. # of lines: %d. # of instr: %d ===\n", currentGoomSL->num_lines, currentGoomSL->iflow->number); +#endif +} /* }}} */ + +void gsl_execute(GoomSL *scanner) +{ /* {{{ */ + if (scanner->compilationOK) { +#if USE_JITC_X86 + scanner->jitc_func(); +#else + iflow_execute(scanner->fastiflow, scanner); +#endif + } +} /* }}} */ + +GoomSL *gsl_new(void) +{ /* {{{ */ + GoomSL *gss = (GoomSL*)malloc(sizeof(GoomSL)); + + gss->iflow = iflow_new(); + gss->vars = goom_hash_new(); + gss->functions = goom_hash_new(); + gss->nbStructID = 0; + gss->structIDS = goom_hash_new(); + gss->gsl_struct_size = 32; + gss->gsl_struct = (GSL_Struct**)malloc(gss->gsl_struct_size * sizeof(GSL_Struct*)); + gss->currentNS = 0; + gss->namespaces[0] = gss->vars; + gss->data_heap = goom_heap_new(); + + reset_scanner(gss); + + gss->compilationOK = 0; + gss->nbPtr=0; + gss->ptrArraySize=256; + gss->ptrArray = (void**)malloc(gss->ptrArraySize * sizeof(void*)); +#ifdef USE_JITC_X86 + gss->jitc = NULL; +#endif + return gss; +} /* }}} */ + +void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func) +{ /* {{{ */ + HashValue *val = goom_hash_get(gss->functions, fname); + if (val) { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)val->ptr; + gef->function = func; + } + else fprintf(stderr, "Unable to bind function %s\n", fname); +} /* }}} */ + +int gsl_is_compiled(GoomSL *gss) +{ /* {{{ */ + return gss->compilationOK; +} /* }}} */ + +void gsl_free(GoomSL *gss) +{ /* {{{ */ + iflow_free(gss->iflow); + goom_hash_free(gss->vars); + goom_hash_free(gss->functions); + goom_hash_free(gss->structIDS); + free(gss->gsl_struct); + goom_heap_delete(gss->data_heap); + free(gss->ptrArray); + free(gss); +} /* }}} */ + + +static int gsl_nb_import; +static char gsl_already_imported[256][256]; + +char *gsl_init_buffer(const char *fname) +{ + char *fbuffer; + fbuffer = (char*)malloc(512); + fbuffer[0]=0; + gsl_nb_import = 0; + if (fname) + gsl_append_file_to_buffer(fname,&fbuffer); + return fbuffer; +} + +static char *gsl_read_file(const char *fname) +{ + FILE *f; + char *buffer; + int fsize; + f = fopen(fname,"rt"); + if (!f) { + fprintf(stderr, "ERROR: Could not load file %s\n", fname); + exit(1); + } + fseek(f,0,SEEK_END); + fsize = ftell(f); + rewind(f); + buffer = (char*)malloc(fsize+512); + fread(buffer,1,fsize,f); + fclose(f); + buffer[fsize]=0; + return buffer; +} + +void gsl_append_file_to_buffer(const char *fname, char **buffer) +{ + char *fbuffer; + int size,fsize,i=0; + char reset_msg[256]; + + /* look if the file have not been already imported */ + for (i=0;iptr) +#define GSL_LOCAL_INT(gsl,local,name) (*(int*)goom_hash_get(local,name)->ptr) +#define GSL_LOCAL_FLOAT(gsl,local,name) (*(float*)goom_hash_get(local,name)->ptr) + +#define GSL_GLOBAL_PTR(gsl,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +#define GSL_GLOBAL_INT(gsl,name) (*(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +#define GSL_GLOBAL_FLOAT(gsl,name) (*(float*)goom_hash_get(gsl_globals(gsl),name)->ptr) + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_hash.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_hash.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_hash.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_hash.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,120 @@ +#include "goomsl_hash.h" +#include +#include + +static GoomHashEntry *entry_new(const char *key, HashValue value) { + + int len = strlen(key); + GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); + + entry->key = (char *)malloc(len+1); + memcpy(entry->key,key,len+1); + entry->value = value; + entry->lower = NULL; + entry->upper = NULL; + + return entry; +} + +static void entry_free(GoomHashEntry *entry) { + if (entry!=NULL) { + entry_free(entry->lower); + entry_free(entry->upper); + free(entry->key); + free(entry); + } +} + +static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { + int cmp = strcmp(key,entry->key); + if (cmp==0) { + entry->value = value; + } + else if (cmp > 0) { + if (entry->upper == NULL) + entry->upper = entry_new(key,value); + else + entry_put(entry->upper, key, value); + } + else { + if (entry->lower == NULL) + entry->lower = entry_new(key,value); + else + entry_put(entry->lower, key, value); + } +} + +static HashValue *entry_get(GoomHashEntry *entry, const char *key) { + + int cmp; + if (entry==NULL) + return NULL; + cmp = strcmp(key,entry->key); + if (cmp > 0) + return entry_get(entry->upper, key); + else if (cmp < 0) + return entry_get(entry->lower, key); + else + return &(entry->value); +} + +GoomHash *goom_hash_new() { + GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); + _this->root = NULL; + _this->number_of_puts = 0; + return _this; +} + +void goom_hash_free(GoomHash *_this) { + entry_free(_this->root); + free(_this); +} + +void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { + _this->number_of_puts += 1; + if (_this->root == NULL) + _this->root = entry_new(key,value); + else + entry_put(_this->root,key,value); +} + +HashValue *goom_hash_get(GoomHash *_this, const char *key) { + if (_this == NULL) return NULL; + return entry_get(_this->root,key); +} + +void goom_hash_put_int(GoomHash *_this, const char *key, int i) { + HashValue value; + value.i = i; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_float(GoomHash *_this, const char *key, float f) { + HashValue value; + value.f = f; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { + HashValue value; + value.ptr = ptr; + goom_hash_put(_this,key,value); +} + +/* FOR EACH */ + +static void _goom_hash_for_each(GoomHash *_this, GoomHashEntry *entry, GH_Func func) +{ + if (entry == NULL) return; + func(_this, entry->key, &(entry->value)); + _goom_hash_for_each(_this, entry->lower, func); + _goom_hash_for_each(_this, entry->upper, func); +} + +void goom_hash_for_each(GoomHash *_this, GH_Func func) { + _goom_hash_for_each(_this, _this->root, func); +} + +int goom_hash_number_of_puts(GoomHash *_this) { + return _this->number_of_puts; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_hash.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_hash.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_hash.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_hash.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,40 @@ +#ifndef _GOOMSL_HASH_H +#define _GOOMSL_HASH_H + +typedef struct GOOM_HASH_ENTRY GoomHashEntry; +typedef struct GOOM_HASH GoomHash; + +typedef union { + void *ptr; + int i; + float f; +} HashValue; + +struct GOOM_HASH_ENTRY { + char *key; + HashValue value; + GoomHashEntry *lower; + GoomHashEntry *upper; +}; + +struct GOOM_HASH { + GoomHashEntry *root; + int number_of_puts; +}; + +GoomHash *goom_hash_new(); +void goom_hash_free(GoomHash *gh); + +void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +HashValue *goom_hash_get(GoomHash *gh, const char *key); + +void goom_hash_put_int (GoomHash *_this, const char *key, int i); +void goom_hash_put_float(GoomHash *_this, const char *key, float f); +void goom_hash_put_ptr (GoomHash *_this, const char *key, void *ptr); + +typedef void (*GH_Func)(GoomHash *caller, const char *key, HashValue *value); + +void goom_hash_for_each(GoomHash *_this, GH_Func func); +int goom_hash_number_of_puts(GoomHash *_this); + +#endif /* _GOOM_HASH_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_heap.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_heap.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_heap.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_heap.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,105 @@ +#include "goomsl_heap.h" +#include + +struct _GOOM_HEAP { + void **arrays; + int number_of_arrays; + int size_of_each_array; + int consumed_in_last_array; +}; + +/* Constructors / Destructor */ +GoomHeap *goom_heap_new(void) +{ + return goom_heap_new_with_granularity(4096); +} + +GoomHeap *goom_heap_new_with_granularity(int granularity) +{ + GoomHeap *_this; + _this = (GoomHeap*)malloc(sizeof(GoomHeap)); + _this->number_of_arrays = 0; + _this->size_of_each_array = granularity; + _this->consumed_in_last_array = 0; + _this->arrays = (void**)malloc(sizeof(void*)); + return _this; +} + +void goom_heap_delete(GoomHeap *_this) +{ + int i; + for (i=0;i<_this->number_of_arrays;++i) { + free(_this->arrays[i]); + } + free(_this->arrays); + free(_this); +} + +static void align_it(GoomHeap *_this, int alignment) +{ + if ((alignment > 1) && (_this->number_of_arrays>0)) { + void *last_array = _this->arrays[_this->number_of_arrays - 1]; + int last_address = (int)last_array + _this->consumed_in_last_array; + int decal = (last_address % alignment); + if (decal != 0) { + _this->consumed_in_last_array += alignment - decal; + } + } +} + +void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, + int alignment, int prefix_bytes) +{ + void *retval = NULL; + + /* d'abord on gere les problemes d'alignement */ + _this->consumed_in_last_array += prefix_bytes; + align_it(_this, alignment); + + /* ensuite on verifie que la quantite de memoire demandee tient dans le buffer */ + if ((_this->consumed_in_last_array + nb_bytes >= _this->size_of_each_array) + || (_this->number_of_arrays == 0)) { + + if (prefix_bytes + nb_bytes + alignment >= _this->size_of_each_array) { + + /* Si la zone demandee est plus grosse que la granularitee */ + /* On alloue un buffer plus gros que les autres */ + _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * (_this->number_of_arrays+2)); + + _this->number_of_arrays += 1; + _this->consumed_in_last_array = prefix_bytes; + + _this->arrays[_this->number_of_arrays - 1] = malloc(prefix_bytes + nb_bytes + alignment); + align_it(_this,alignment); + retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); + + /* puis on repart sur un nouveau buffer vide */ + _this->number_of_arrays += 1; + _this->consumed_in_last_array = 0; + _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); + return retval; + } + else { + _this->number_of_arrays += 1; + _this->consumed_in_last_array = prefix_bytes; + _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * _this->number_of_arrays); + + _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); + align_it(_this,alignment); + } + } + retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); + _this->consumed_in_last_array += nb_bytes; + return retval; +} + +void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment) +{ + return goom_heap_malloc_with_alignment_prefixed(_this, nb_bytes, alignment, 0); +} + +void *goom_heap_malloc(GoomHeap *_this, int nb_bytes) +{ + return goom_heap_malloc_with_alignment(_this,nb_bytes,1); +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_heap.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_heap.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_heap.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_heap.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,29 @@ +#ifndef GOOMSL_HEAP +#define GOOMSL_HEAP + +/** + * Resizable Array that guarranty that resizes don't change address of + * the stored datas. + * + * This is implemented as an array of arrays... granularity is the size + * of each arrays. + */ + +typedef struct _GOOM_HEAP GoomHeap; + +/* Constructors / Destructor */ +GoomHeap *goom_heap_new(void); +GoomHeap *goom_heap_new_with_granularity(int granularity); +void goom_heap_delete(GoomHeap *_this); + +/* This method behaves like malloc. */ +void *goom_heap_malloc(GoomHeap *_this, int nb_bytes); +/* This adds an alignment constraint. */ +void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment); + +/* Returns a pointeur on the bytes... prefix is before */ +void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, + int alignment, int prefix_bytes); + +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_lex.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_lex.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_lex.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_lex.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2110 @@ +#line 2 "goomsl_lex.c" + +#line 4 "goomsl_lex.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 31 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires + * access to the local variable yy_act. Since yyless() is a macro, it would break + * existing scanners that call yyless() from OUTSIDE yylex. + * One obvious solution it to make yy_act a global. I tried that, and saw + * a 5% performance hit in a non-yylineno scanner, because yy_act is + * normally declared as a register variable-- so it is not worth it. + */ + #define YY_LESS_LINENO(n) \ + do { \ + int yyl;\ + for ( yyl = n; yyl < yyleng; ++yyl )\ + if ( yytext[yyl] == '\n' )\ + --yylineno;\ + }while(0) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef unsigned int yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); + +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + +typedef int yy_state_type; + +#define YY_FLEX_LEX_COMPAT +extern int yylineno; + +int yylineno = 1; + +extern char yytext[]; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + yyleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + if ( yyleng + (yy_more_offset) >= YYLMAX ) \ + YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ + yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \ + yyleng += (yy_more_offset); \ + (yy_prev_more_offset) = (yy_more_offset); \ + (yy_more_offset) = 0; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 49 +#define YY_END_OF_BUFFER 50 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_acclist[214] = + { 0, + 50, 48, 49, 47, 48, 49, 4, 49, 48, 49, + 13, 48, 49, 10, 48, 49, 33, 48, 49, 48, + 49, 48, 49, 48, 49, 48, 49, 48, 49, 34, + 48, 49, 34, 48, 49, 48, 49, 48, 49, 33, + 48, 49, 33, 48, 49, 33, 48, 49, 33, 48, + 49, 33, 48, 49, 33, 48, 49, 33, 48, 49, + 33, 48, 49, 33, 48, 49, 33, 48, 49, 47, + 48, 49, 1, 4, 49, 48, 49, 7, 49, 6, + 49, 7, 49, 7, 49, 1, 6, 49, 7, 49, + 3, 49, 1, 3, 49, 17, 49, 49, 16, 17, + + 49, 17, 49, 47, 45, 10, 10, 10, 33, 40, + 39, 41, 11, 12, 42, 38, 37, 34, 43, 46, + 44, 33, 33, 28, 33, 33, 33, 33, 33, 30, + 33, 33, 33, 33, 33, 33, 47, 1, 12, 5, + 15, 14, 10, 10, 35, 37, 36, 33, 33, 33, + 33, 33, 29, 33, 19, 33, 26, 33, 21, 33, + 33, 33, 33, 2, 10, 10, 33, 33, 33, 33, + 33, 33, 33, 31, 33, 33, 10, 10, 33, 33, + 33, 32, 33, 18, 33, 33, 33, 27, 33, 10, + 10, 33, 33, 33, 22, 33, 25, 33, 10, 9, + + 10, 10, 20, 33, 23, 33, 33, 10, 24, 33, + 10, 8, 10 + } ; + +static yyconst flex_int16_t yy_accept[152] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 4, 7, 9, 11, 14, 17, 20, 22, 24, 26, + 28, 30, 33, 36, 38, 40, 43, 46, 49, 52, + 55, 58, 61, 64, 67, 70, 73, 76, 78, 80, + 82, 84, 86, 89, 91, 93, 96, 98, 99, 102, + 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, + 122, 123, 124, 126, 127, 128, 129, 130, 132, 133, + 134, 135, 136, 137, 138, 139, 139, 140, 141, 141, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + + 151, 152, 153, 155, 157, 159, 161, 162, 163, 164, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 176, 177, 178, 179, 180, 181, 182, 184, 186, + 187, 188, 190, 191, 192, 193, 194, 195, 197, 199, + 200, 202, 203, 205, 207, 208, 209, 211, 212, 214, + 214 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 5, 6, 7, 1, 8, 9, 10, 1, + 1, 11, 12, 1, 13, 14, 15, 16, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 1, 1, 18, + 19, 20, 1, 9, 21, 21, 21, 21, 22, 23, + 21, 21, 24, 21, 21, 25, 21, 26, 21, 21, + 21, 27, 28, 29, 21, 21, 21, 21, 21, 21, + 1, 30, 1, 1, 31, 1, 32, 33, 34, 35, + + 36, 37, 38, 39, 40, 21, 21, 41, 21, 42, + 43, 44, 21, 45, 46, 47, 48, 21, 49, 50, + 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[51] = + { 0, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 4, 4, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, + 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 + } ; + +static yyconst flex_int16_t yy_base[159] = + { 0, + 0, 49, 51, 54, 221, 57, 60, 64, 223, 225, + 69, 225, 203, 225, 51, 0, 0, 202, 201, 200, + 64, 68, 72, 72, 199, 174, 57, 166, 55, 173, + 171, 166, 165, 166, 171, 99, 225, 93, 225, 225, + 194, 107, 225, 193, 225, 225, 225, 225, 225, 71, + 93, 225, 0, 183, 178, 0, 195, 225, 225, 225, + 225, 225, 225, 225, 89, 107, 0, 225, 225, 225, + 161, 169, 0, 155, 160, 157, 154, 151, 150, 151, + 150, 146, 153, 123, 225, 177, 188, 225, 126, 187, + 225, 225, 164, 159, 225, 100, 0, 146, 145, 149, + + 138, 151, 0, 0, 0, 0, 59, 146, 140, 177, + 225, 157, 147, 141, 144, 130, 138, 126, 130, 137, + 0, 134, 165, 143, 133, 112, 109, 0, 0, 102, + 92, 0, 130, 112, 93, 98, 101, 0, 0, 125, + 124, 94, 0, 0, 78, 59, 0, 61, 0, 225, + 141, 145, 149, 151, 155, 51, 159, 163 + } ; + +static yyconst flex_int16_t yy_def[159] = + { 0, + 150, 1, 151, 151, 151, 151, 152, 152, 150, 150, + 150, 150, 150, 150, 153, 154, 155, 150, 150, 150, + 150, 150, 150, 150, 150, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 153, 153, 153, 154, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 156, 150, 150, 150, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 150, 150, 150, 157, 150, 150, 157, + 150, 150, 153, 153, 150, 150, 156, 154, 154, 154, + + 154, 154, 154, 154, 154, 154, 154, 154, 154, 157, + 150, 153, 153, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 153, 153, 154, 154, 154, 154, 154, 154, + 154, 154, 158, 153, 154, 154, 154, 154, 154, 158, + 158, 153, 154, 154, 154, 153, 154, 153, 153, 0, + 150, 150, 150, 150, 150, 150, 150, 150 + } ; + +static yyconst flex_int16_t yy_nxt[276] = + { 0, + 10, 11, 12, 11, 13, 14, 15, 10, 16, 17, + 18, 19, 20, 10, 21, 22, 23, 24, 10, 25, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 10, + 16, 16, 26, 16, 27, 28, 29, 16, 16, 30, + 16, 31, 16, 32, 16, 33, 34, 16, 35, 16, + 36, 37, 36, 40, 97, 42, 43, 42, 42, 46, + 42, 41, 48, 38, 41, 49, 48, 149, 44, 49, + 51, 44, 51, 54, 61, 64, 91, 55, 62, 64, + 148, 65, 63, 66, 66, 65, 75, 66, 66, 50, + 68, 69, 72, 50, 51, 76, 51, 77, 119, 73, + + 84, 85, 84, 61, 96, 96, 120, 87, 89, 85, + 89, 63, 92, 86, 64, 96, 96, 67, 147, 146, + 65, 86, 66, 66, 84, 85, 84, 89, 85, 89, + 141, 141, 145, 144, 143, 142, 141, 86, 139, 138, + 86, 39, 39, 39, 39, 47, 47, 47, 47, 53, + 137, 53, 53, 56, 56, 57, 136, 57, 57, 110, + 110, 110, 110, 140, 135, 140, 140, 134, 133, 132, + 131, 130, 129, 128, 127, 126, 125, 124, 123, 111, + 122, 121, 118, 117, 116, 115, 114, 113, 112, 111, + 111, 90, 109, 108, 107, 106, 105, 104, 103, 102, + + 101, 100, 99, 98, 95, 94, 93, 90, 88, 83, + 82, 81, 80, 79, 78, 74, 71, 70, 60, 59, + 58, 52, 150, 45, 9, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150 + } ; + +static yyconst flex_int16_t yy_chk[276] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 3, 156, 4, 4, 4, 6, 6, + 6, 3, 7, 2, 4, 7, 8, 148, 4, 8, + 11, 6, 11, 15, 21, 22, 50, 15, 21, 23, + 146, 22, 21, 22, 22, 23, 29, 23, 23, 7, + 24, 24, 27, 8, 51, 29, 51, 29, 107, 27, + + 36, 36, 36, 38, 65, 65, 107, 38, 42, 42, + 42, 38, 50, 36, 66, 96, 96, 22, 145, 142, + 66, 42, 66, 66, 84, 84, 84, 89, 89, 89, + 141, 140, 137, 136, 135, 134, 133, 84, 131, 130, + 89, 151, 151, 151, 151, 152, 152, 152, 152, 153, + 127, 153, 153, 154, 154, 155, 126, 155, 155, 157, + 157, 157, 157, 158, 125, 158, 158, 124, 123, 122, + 120, 119, 118, 117, 116, 115, 114, 113, 112, 110, + 109, 108, 102, 101, 100, 99, 98, 94, 93, 90, + 87, 86, 83, 82, 81, 80, 79, 78, 77, 76, + + 75, 74, 72, 71, 57, 55, 54, 44, 41, 35, + 34, 33, 32, 31, 30, 28, 26, 25, 20, 19, + 18, 13, 9, 5, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150 + } ; + +/* Table of booleans, true if rule could match eol. */ +static yyconst flex_int32_t yy_rule_can_match_eol[50] = + { 0, +1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; +static char *yy_full_match; +static int yy_lp; +#define REJECT \ +{ \ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ +yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ +++(yy_lp); \ +goto find_rule; \ +} + +static int yy_more_offset = 0; +static int yy_prev_more_offset = 0; +#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext )) +#define YY_NEED_STRLEN +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET \ + { \ + (yy_more_offset) = (yy_prev_more_offset); \ + yyleng -= (yy_more_offset); \ + } +#ifndef YYLMAX +#define YYLMAX 8192 +#endif + +char yytext[YYLMAX]; +char *yytext_ptr; +#line 1 "goomsl_lex.l" +#line 2 "goomsl_lex.l" + +#include +#include +#include +#include "goomsl.h" +#include "goomsl_private.h" +#include "goomsl_yacc.h" +void yyerror(char *); +void yyparse(void); + +GoomSL *currentGoomSL; +static int string_size; +static char string[1024]; + + + +#line 639 "goomsl_lex.c" + +#define INITIAL 0 +#define C_COMMENT 1 +#define LINE_COMMENT 2 +#define STRING 3 + +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#ifndef _WIN32PC +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (void ); +#else +extern int yywrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 25 "goomsl_lex.l" + + +#line 797 "goomsl_lex.c" + + if ( (yy_init) ) + { + (yy_init) = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_state_buf) ) + (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2 ); + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 151 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *(yy_state_ptr)++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 225 ); + +yy_find_action: + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[(yy_lp)]; + { + (yy_full_match) = yy_cp; + break; + } + } + --yy_cp; + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) + { + int yyl; + for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + + yylineno++; +; + } + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP +#line 27 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } + YY_BREAK +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +#line 28 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } + YY_BREAK +case 3: +/* rule 3 can match eol */ +YY_RULE_SETUP +#line 30 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } + YY_BREAK +case 4: +/* rule 4 can match eol */ +YY_RULE_SETUP +#line 31 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 33 "goomsl_lex.l" +{ BEGIN INITIAL; } + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 34 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 35 "goomsl_lex.l" +{ /* eat up comment */ } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 37 "goomsl_lex.l" +{ currentGoomSL->num_lines = 0; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 38 "goomsl_lex.l" +{ currentGoomSL->num_lines = 0; printf("%s\n", yytext); } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 39 "goomsl_lex.l" +{ /* ignore preprocessor lines */ } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 41 "goomsl_lex.l" +{ BEGIN C_COMMENT; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 42 "goomsl_lex.l" +{ BEGIN LINE_COMMENT; } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 43 "goomsl_lex.l" +{ BEGIN STRING; string_size=0; } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 45 "goomsl_lex.l" +{ string[string_size++] = '\n'; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 46 "goomsl_lex.l" +{ string[string_size++] = '\"'; } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 47 "goomsl_lex.l" +{ /* fin de la chaine: on cree le pointeur qui va bien */ + unsigned int tmp; + BEGIN INITIAL; + string[string_size]=0; + tmp = gsl_malloc(currentGoomSL, string_size+1); + strcpy((char*)currentGoomSL->ptrArray[tmp],string); + sprintf(yylval.strValue, "0x%08x", tmp); + return LTYPE_PTR; + } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 56 "goomsl_lex.l" +{ string[string_size++] = *yytext; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 58 "goomsl_lex.l" +{ return FLOAT_TK; } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 59 "goomsl_lex.l" +{ return INT_TK; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 60 "goomsl_lex.l" +{ return INT_TK; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 61 "goomsl_lex.l" +{ return PTR_TK; } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 62 "goomsl_lex.l" +{ return PTR_TK; } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 63 "goomsl_lex.l" +{ return DECLARE; } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 64 "goomsl_lex.l" +{ return EXTERNAL; } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 65 "goomsl_lex.l" +{ return STRUCT; } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 66 "goomsl_lex.l" +{ return NOT; } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 67 "goomsl_lex.l" +{ return WHILE; } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 68 "goomsl_lex.l" +{ return DO; } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 69 "goomsl_lex.l" +{ return FOR; } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 70 "goomsl_lex.l" +{ return IN; } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 71 "goomsl_lex.l" +{ strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 72 "goomsl_lex.l" +{ strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 73 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 74 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 75 "goomsl_lex.l" +{ sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 76 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 77 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 78 "goomsl_lex.l" +{ sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 79 "goomsl_lex.l" +{ return PLUS_EQ; } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 80 "goomsl_lex.l" +{ return MUL_EQ; } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 81 "goomsl_lex.l" +{ return SUB_EQ; } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 82 "goomsl_lex.l" +{ return DIV_EQ; } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 83 "goomsl_lex.l" +{ return LOW_EQ; } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 84 "goomsl_lex.l" +{ return SUP_EQ; } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 85 "goomsl_lex.l" +{ return NOT_EQ; } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 86 "goomsl_lex.l" +{ return NOT_EQ; } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 87 "goomsl_lex.l" +/* eat up whitespace */ + YY_BREAK +case 48: +YY_RULE_SETUP +#line 88 "goomsl_lex.l" +{ yylval.charValue = *yytext; return *yytext; } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 90 "goomsl_lex.l" +ECHO; + YY_BREAK +#line 1155 "goomsl_lex.c" + case YY_STATE_EOF(INITIAL): + case YY_STATE_EOF(C_COMMENT): + case YY_STATE_EOF(LINE_COMMENT): + case YY_STATE_EOF(STRING): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 151 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *(yy_state_ptr)++ = yy_current_state; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 151 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 150); + if ( ! yy_is_jam ) + *(yy_state_ptr)++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + if ( c == '\n' ){ + --yylineno; + } + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); + if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol ) + + yylineno++; +; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ); + + yyfree((void *) b ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param str a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * str ) +{ + + return yy_scan_bytes(str,strlen(str) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void yyset_lineno (int line_number ) +{ + + yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * in_str ) +{ + yyin = in_str ; +} + +void yyset_out (FILE * out_str ) +{ + yyout = out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int bdebug ) +{ + yy_flex_debug = bdebug ; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + yyfree ( (yy_state_buf) ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif +#line 90 "goomsl_lex.l" + + + + +int yywrap(void) { return 1; yyunput(0,0); } + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_lex.l kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_lex.l --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_lex.l 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_lex.l 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,94 @@ +%{ + +#include +#include +#include +#include "goomsl.h" +#include "goomsl_private.h" +#include "goomsl_yacc.h" +void yyerror(char *); +void yyparse(void); + +GoomSL *currentGoomSL; +static int string_size; +static char string[1024]; +%} + +DIGIT [0-9] +XDIGIT [0-9a-f] +ID [a-zA-Z_@&][a-zA-Z0-9_\.]* + +%S C_COMMENT +%S LINE_COMMENT +%S STRING + +%% + +^[ \t]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } +^[ \t]*"//"[^\n]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } + +\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } +\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } + +"*/" { BEGIN INITIAL; } +\n { ++currentGoomSL->num_lines; } +. { /* eat up comment */ } + +"#RST_LINE#" { currentGoomSL->num_lines = 0; } +"#FILE ".*"#" { currentGoomSL->num_lines = 0; printf("%s\n", yytext); } +"#"[^\n]* { /* ignore preprocessor lines */ } + +"/*" { BEGIN C_COMMENT; } +"//" { BEGIN LINE_COMMENT; } +\" { BEGIN STRING; string_size=0; } + +"\\n" { string[string_size++] = '\n'; } +"\\\"" { string[string_size++] = '\"'; } +\" { /* fin de la chaine: on cree le pointeur qui va bien */ + unsigned int tmp; + BEGIN INITIAL; + string[string_size]=0; + tmp = gsl_malloc(currentGoomSL, string_size+1); + strcpy((char*)currentGoomSL->ptrArray[tmp],string); + sprintf(yylval.strValue, "0x%08x", tmp); + return LTYPE_PTR; + } +. { string[string_size++] = *yytext; } + +"float" { return FLOAT_TK; } +"int" { return INT_TK; } +"boolean" { return INT_TK; } +"ptr" { return PTR_TK; } +"string" { return PTR_TK; } +"declare" { return DECLARE; } +"external" { return EXTERNAL; } +"struct" { return STRUCT; } +"not" { return NOT; } +"while" { return WHILE; } +"do" { return DO; } +"for" { return FOR; } +"in" { return IN; } +"true" { strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } +"false" { strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } +{ID} { strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } +{DIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +\'.\' { sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } +"0x"{XDIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +{DIGIT}+"."{DIGIT}* { strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } +{DIGIT}+"%" { sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } +"+=" { return PLUS_EQ; } +"*=" { return MUL_EQ; } +"-=" { return SUB_EQ; } +"/=" { return DIV_EQ; } +"<=" { return LOW_EQ; } +">=" { return SUP_EQ; } +"!=" { return NOT_EQ; } +"<>" { return NOT_EQ; } +[ \t]+ /* eat up whitespace */ +. { yylval.charValue = *yytext; return *yytext; } + +%% + + +int yywrap(void) { return 1; yyunput(0,0); } + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_private.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_private.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_private.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_private.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,251 @@ +#ifndef _GSL_PRIVATE_H +#define _GSL_PRIVATE_H + +/* -- internal use -- */ + +#include "goomsl.h" + +#ifdef USE_JITC_X86 +#include "jitc_x86.h" +#endif + +#include "goomsl_heap.h" + +/* {{{ type of nodes */ +#define EMPTY_NODE 0 +#define CONST_INT_NODE 1 +#define CONST_FLOAT_NODE 2 +#define CONST_PTR_NODE 3 +#define VAR_NODE 4 +#define PARAM_NODE 5 +#define READ_PARAM_NODE 6 +#define OPR_NODE 7 +/* }}} */ +/* {{{ type of operations */ +#define OPR_SET 1 +#define OPR_IF 2 +#define OPR_WHILE 3 +#define OPR_BLOCK 4 +#define OPR_ADD 5 +#define OPR_MUL 6 +#define OPR_EQU 7 +#define OPR_NOT 8 +#define OPR_LOW 9 +#define OPR_DIV 10 +#define OPR_SUB 11 +#define OPR_FUNC_INTRO 12 +#define OPR_FUNC_OUTRO 13 +#define OPR_CALL 14 +#define OPR_EXT_CALL 15 +#define OPR_PLUS_EQ 16 +#define OPR_SUB_EQ 17 +#define OPR_MUL_EQ 18 +#define OPR_DIV_EQ 19 +#define OPR_CALL_EXPR 20 +#define OPR_AFFECT_LIST 21 +#define OPR_FOREACH 22 +#define OPR_VAR_LIST 23 + +/* }}} */ + +typedef struct _ConstIntNodeType { /* {{{ */ + int val; +} ConstIntNodeType; /* }}} */ +typedef struct _ConstFloatNodeType { /* {{{ */ + float val; +} ConstFloatNodeType; /* }}} */ +typedef struct _ConstPtrNodeType { /* {{{ */ + int id; +} ConstPtrNodeType; /* }}} */ +typedef struct _OprNodeType { /* {{{ */ + int type; + int nbOp; + struct _NODE_TYPE *op[3]; /* maximal number of operand needed */ + struct _NODE_TYPE *next; +} OprNodeType; /* }}} */ +typedef struct _NODE_TYPE { /* {{{ */ + int type; + char *str; + GoomHash *vnamespace; + int line_number; + union { + ConstIntNodeType constInt; + ConstFloatNodeType constFloat; + ConstPtrNodeType constPtr; + OprNodeType opr; + } unode; +} NodeType; /* }}} */ +typedef struct _INSTRUCTION_DATA { /* {{{ */ + + union { + void *var; + int *var_int; + int *var_ptr; + float *var_float; + int jump_offset; + struct _ExternalFunctionStruct *external_function; + } udest; + + union { + void *var; + int *var_int; + int *var_ptr; + float *var_float; + int value_int; + int value_ptr; + float value_float; + } usrc; +} InstructionData; +/* }}} */ +typedef struct _INSTRUCTION { /* {{{ */ + + int id; + InstructionData data; + GoomSL *parent; + const char *name; /* name of the instruction */ + + char **params; /* parametres de l'instruction */ + GoomHash **vnamespace; + int *types; /* type des parametres de l'instruction */ + int cur_param; + int nb_param; + + int address; + char *jump_label; + char *nop_label; + + int line_number; + +} Instruction; +/* }}} */ +typedef struct _INSTRUCTION_FLOW { /* {{{ */ + + Instruction **instr; + int number; + int tabsize; + GoomHash *labels; +} InstructionFlow; +/* }}} */ +typedef struct _FAST_INSTRUCTION { /* {{{ */ + int id; + InstructionData data; + Instruction *proto; +} FastInstruction; +/* }}} */ +typedef struct _FastInstructionFlow { /* {{{ */ + int number; + FastInstruction *instr; + void *mallocedInstr; +} FastInstructionFlow; +/* }}} */ +typedef struct _ExternalFunctionStruct { /* {{{ */ + GoomSL_ExternalFunction function; + GoomHash *vars; + int is_extern; +} ExternalFunctionStruct; +/* }}} */ +typedef struct _Block { + int data; + int size; +} Block; +typedef struct _GSL_StructField { /* {{{ */ + int type; + char name[256]; + int offsetInStruct; /* Where this field is stored... */ +} GSL_StructField; + /* }}} */ +typedef struct _GSL_Struct { /* {{{ */ + int nbFields; + GSL_StructField *fields[64]; + int size; + Block iBlock[64]; + Block fBlock[64]; +} GSL_Struct; + /* }}} */ +struct _GoomSL { /* {{{ */ + int num_lines; + Instruction *instr; /* instruction en cours de construction */ + + InstructionFlow *iflow; /* flow d'instruction 'normal' */ + FastInstructionFlow *fastiflow; /* flow d'instruction optimise */ + + GoomHash *vars; /* table de variables */ + int currentNS; + GoomHash *namespaces[16]; + + GoomHash *functions; /* table des fonctions externes */ + + GoomHeap *data_heap; /* GSL Heap-like memory space */ + + int nbStructID; + GoomHash *structIDS; + GSL_Struct **gsl_struct; + int gsl_struct_size; + + int nbPtr; + int ptrArraySize; + void **ptrArray; + + int compilationOK; +#ifdef USE_JITC_X86 + JitcX86Env *jitc; + JitcFunc jitc_func; +#endif +}; /* }}} */ + +extern GoomSL *currentGoomSL; + +Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number); +void gsl_instr_add_param(Instruction *_this, char *param, int type); +void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns); + +void gsl_declare_task(const char *name); +void gsl_declare_external_task(const char *name); + +int gsl_type_of_var(GoomHash *namespace, const char *name); + +void gsl_enternamespace(const char *name); +void gsl_reenternamespace(GoomHash *ns); +GoomHash *gsl_leavenamespace(void); +GoomHash *gsl_find_namespace(const char *name); + +void gsl_commit_compilation(void); + +/* #define TYPE_PARAM 1 */ + +#define FIRST_RESERVED 0x80000 + +#define TYPE_INTEGER 0x90001 +#define TYPE_FLOAT 0x90002 +#define TYPE_VAR 0x90003 +#define TYPE_PTR 0x90004 +#define TYPE_LABEL 0x90005 + +#define TYPE_OP_EQUAL 6 +#define TYPE_IVAR 0xa0001 +#define TYPE_FVAR 0xa0002 +#define TYPE_PVAR 0xa0003 +#define TYPE_SVAR 0xa0004 + +#define INSTR_JUMP 6 +#define INSTR_JZERO 29 +#define INSTR_CALL 36 +#define INSTR_RET 37 +#define INSTR_EXT_CALL 38 +#define INSTR_JNZERO 40 + +#define INSTR_SET 0x80001 +#define INSTR_INT 0x80002 +#define INSTR_FLOAT 0x80003 +#define INSTR_PTR 0x80004 +#define INSTR_LABEL 0x80005 +#define INSTR_ISLOWER 0x80006 +#define INSTR_ADD 0x80007 +#define INSTR_MUL 0x80008 +#define INSTR_DIV 0x80009 +#define INSTR_SUB 0x80010 +#define INSTR_ISEQUAL 0x80011 +#define INSTR_NOT 0x80012 + + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2997 @@ +/* A Bison parser, made by GNU Bison 1.875. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + LTYPE_INTEGER = 258, + LTYPE_FLOAT = 259, + LTYPE_VAR = 260, + LTYPE_PTR = 261, + PTR_TK = 262, + INT_TK = 263, + FLOAT_TK = 264, + DECLARE = 265, + EXTERNAL = 266, + WHILE = 267, + DO = 268, + NOT = 269, + PLUS_EQ = 270, + SUB_EQ = 271, + DIV_EQ = 272, + MUL_EQ = 273, + SUP_EQ = 274, + LOW_EQ = 275, + NOT_EQ = 276, + STRUCT = 277, + FOR = 278, + IN = 279 + }; +#endif +#define LTYPE_INTEGER 258 +#define LTYPE_FLOAT 259 +#define LTYPE_VAR 260 +#define LTYPE_PTR 261 +#define PTR_TK 262 +#define INT_TK 263 +#define FLOAT_TK 264 +#define DECLARE 265 +#define EXTERNAL 266 +#define WHILE 267 +#define DO 268 +#define NOT 269 +#define PLUS_EQ 270 +#define SUB_EQ 271 +#define DIV_EQ 272 +#define MUL_EQ 273 +#define SUP_EQ 274 +#define LOW_EQ 275 +#define NOT_EQ 276 +#define STRUCT 277 +#define FOR 278 +#define IN 279 + + + + +/* Copy the first part of user declarations. */ +#line 6 "goomsl_yacc.y" + + #include + #include + #include + #include "goomsl.h" + #include "goomsl_private.h" + +#define STRUCT_ALIGNMENT 16 +/* #define VERBOSE */ + + int yylex(void); + void yyerror(char *); + extern GoomSL *currentGoomSL; + + static NodeType *nodeNew(const char *str, int type, int line_number); + static NodeType *nodeClone(NodeType *node); + static void nodeFreeInternals(NodeType *node); + static void nodeFree(NodeType *node); + + static void commit_node(NodeType *node, int releaseIfTemp); + static void precommit_node(NodeType *node); + + static NodeType *new_constInt(const char *str, int line_number); + static NodeType *new_constFloat(const char *str, int line_number); + static NodeType *new_constPtr(const char *str, int line_number); + static NodeType *new_var(const char *str, int line_number); + static NodeType *new_nop(const char *str); + static NodeType *new_op(const char *str, int type, int nbOp); + + static int allocateLabel(); + static int allocateTemp(); + static void releaseTemp(int n); + static void releaseAllTemps(); + + static int is_tmp_expr(NodeType *node) { + if (node->str) { + return (!strncmp(node->str,"_i_tmp_",7)) + || (!strncmp(node->str,"_f_tmp_",7)) + || (!strncmp(node->str,"_p_tmp",7)); + } + return 0; + } + /* pre: is_tmp_expr(node); */ + static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } + + static int is_commutative_expr(int itype) + { /* {{{ */ + return (itype == INSTR_ADD) + || (itype == INSTR_MUL) + || (itype == INSTR_ISEQUAL); + } /* }}} */ + + static void GSL_PUT_LABEL(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("label %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JUMP(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("jump %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + + static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("%s %s\n", iname, name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JZERO(char *name,int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); + } /* }}} */ + static void GSL_PUT_JNZERO(char *name, int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); + } /* }}} */ + + /* Structures Management */ + +#define ALIGN_ADDR(_addr,_align) {\ + if (_align>1) {\ + int _dec = (_addr%_align);\ + if (_dec != 0) _addr += _align - _dec;\ + }} + + /* */ + void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) + { + int i; + int consumed = 0; + int iblk=0, fblk=0; + + s->iBlock[0].size = 0; + s->iBlock[0].data = 0; + s->fBlock[0].size = 0; + s->fBlock[0].data = 0; + + /* Prepare sub-struct and calculate space needed for their storage */ + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type < FIRST_RESERVED) + { + int j=0; + GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; + consumed += sizeof(int); /* stocke le prefix */ + ALIGN_ADDR(consumed, s_align); + s->fields[i]->offsetInStruct = consumed; + gsl_prepare_struct(substruct, s_align, i_align, f_align); + for(j=0;substruct->iBlock[j].size>0;++j) { + s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; + s->iBlock[iblk].size = substruct->iBlock[j].size; + iblk++; + } + for(j=0;substruct->fBlock[j].size>0;++j) { + s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; + s->fBlock[fblk].size = substruct->fBlock[j].size; + fblk++; + } + consumed += substruct->size; + } + } + + /* Then prepare integers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_INT) + { + if (s->iBlock[iblk].size == 0) { + s->iBlock[iblk].size = 1; + s->iBlock[iblk].data = consumed; + } else { + s->iBlock[iblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + iblk++; + s->iBlock[iblk].size = 0; + s->iBlock[iblk].data = 0; + + /* Then prepare floats */ + ALIGN_ADDR(consumed, f_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_FLOAT) + { + if (s->fBlock[fblk].size == 0) { + s->fBlock[fblk].size = 1; + s->fBlock[fblk].data = consumed; + } else { + s->fBlock[fblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + fblk++; + s->fBlock[fblk].size = 0; + s->fBlock[fblk].data = 0; + + /* Finally prepare pointers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_PTR) + { + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + s->size = consumed; + } + + /* Returns the ID of a struct from its name */ + int gsl_get_struct_id(const char *name) /* {{{ */ + { + HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); + if (ret != NULL) return ret->i; + return -1; + } /* }}} */ + + /* Adds the definition of a struct */ + void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ + { + /* Prepare the struct: ie calculate internal storage format */ + gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); + + /* If the struct does not already exists */ + if (gsl_get_struct_id(name) < 0) + { + /* adds it */ + int id = currentGoomSL->nbStructID++; + goom_hash_put_int(currentGoomSL->structIDS, name, id); + if (currentGoomSL->gsl_struct_size <= id) { + currentGoomSL->gsl_struct_size *= 2; + currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, + sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); + } + currentGoomSL->gsl_struct[id] = gsl_struct; + } + } /* }}} */ + + /* Creates a field for a struct */ + GSL_StructField *gsl_new_struct_field(const char *name, int type) + { + GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); + strcpy(field->name, name); + field->type = type; + return field; + } + + /* Create as field for a struct which will be a struct itself */ + GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) + { + GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); + if (field->type < 0) { + fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", + currentGoomSL->num_lines, type); + exit(1); + } + return field; + } + + /* Creates a Struct */ + GSL_Struct *gsl_new_struct(GSL_StructField *field) + { + GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); + s->nbFields = 1; + s->fields[0] = field; + return s; + } + + /* Adds a field to a struct */ + void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) + { + s->fields[s->nbFields++] = field; + } + + int gsl_type_of_var(GoomHash *ns, const char *name) + { + char type_of[256]; + HashValue *hv; + sprintf(type_of, "__type_of_%s", name); + hv = goom_hash_get(ns, type_of); + if (hv != NULL) + return hv->i; + fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); + return -1; + } + + static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) + { + char type_of[256]; + if (name[0] == '@') { ns = currentGoomSL->vars; } + + if (space == NULL) { + switch (type) { + case INSTR_INT: + case INSTR_FLOAT: + case INSTR_PTR: + space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, + sizeof(int), sizeof(int)); + break; + case -1: + fprintf(stderr, "What the fuck!\n"); + exit(1); + default: /* On a un struct_id */ + space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, + currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); + } + } + goom_hash_put_ptr(ns, name, (void*)space); + sprintf(type_of, "__type_of_%s", name); + goom_hash_put_int(ns, type_of, type); + + /* Ensuite le hack: on ajoute les champs en tant que variables. */ + if (type < FIRST_RESERVED) + { + int i; + GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; + ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ + for (i = 0; i < gsl_struct->nbFields; ++i) + { + char full_name[256]; + char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; + sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); + gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); + } + } + } + + /* Declare a variable which will be a struct */ + static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) + { + int struct_id = gsl_get_struct_id(struct_name); + gsl_declare_var(namespace, name, struct_id, NULL); + } + + static void gsl_float_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); + } + static void gsl_int_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); + } + static void gsl_ptr_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); + } + static void gsl_struct_decl_global_from_id(const char *name, int id) + { + gsl_declare_var(currentGoomSL->vars, name, id, NULL); + } + + /* FLOAT */ + static void gsl_float_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); + } + /* INT */ + static void gsl_int_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); + } + /* PTR */ + static void gsl_ptr_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); + } + /* STRUCT */ + static void gsl_struct_decl_local(const char *struct_name, const char *name) + { + gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); + } + + + static void commit_test2(NodeType *set,const char *type, int instr); + static NodeType *new_call(const char *name, NodeType *affect_list); + + /* SETTER */ + static NodeType *new_set(NodeType *lvalue, NodeType *expression) + { /* {{{ */ + NodeType *set = new_op("set", OPR_SET, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } /* }}} */ + static void commit_set(NodeType *set) + { /* {{{ */ + commit_test2(set,"set",INSTR_SET); + } /* }}} */ + + /* PLUS_EQ */ + static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_plus_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* SUB_EQ */ + static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_sub_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* MUL_EQ */ + static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_mul_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* DIV_EQ */ + static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_div_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* commodity method for add, mult, ... */ + + static void precommit_expr(NodeType *expr, const char *type, int instr_id) + { /* {{{ */ + NodeType *tmp, *tmpcpy; + int toAdd; + + /* compute "left" and "right" */ + switch (expr->unode.opr.nbOp) { + case 2: + precommit_node(expr->unode.opr.op[1]); + case 1: + precommit_node(expr->unode.opr.op[0]); + } + + if (is_tmp_expr(expr->unode.opr.op[0])) { + tmp = expr->unode.opr.op[0]; + toAdd = 1; + } + else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { + tmp = expr->unode.opr.op[1]; + toAdd = 0; + } + else { + char stmp[256]; + /* declare a temporary variable to store the result */ + if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else { + int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + } + tmp = new_var(stmp,expr->line_number); + + /* set the tmp to the value of "op1" */ + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,expr->unode.opr.op[0]),0); + toAdd = 1; + + tmp = tmpcpy; + } + + /* add op2 to tmp */ +#ifdef VERBOSE + if (expr->unode.opr.nbOp == 2) + printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); + else + printf("%s %s\n", type, tmp->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); + tmpcpy = nodeClone(tmp); + commit_node(tmp,0); + if (expr->unode.opr.nbOp == 2) { + commit_node(expr->unode.opr.op[toAdd],1); + } + + /* redefine the ADD node now as the computed variable */ + nodeFreeInternals(expr); + *expr = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static NodeType *new_expr1(const char *name, int id, NodeType *expr1) + { /* {{{ */ + NodeType *add = new_op(name, id, 1); + add->unode.opr.op[0] = expr1; + return add; + } /* }}} */ + + static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) + { /* {{{ */ + NodeType *add = new_op(name, id, 2); + add->unode.opr.op[0] = expr1; + add->unode.opr.op[1] = expr2; + return add; + } /* }}} */ + + /* ADD */ + static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("add", OPR_ADD, expr1, expr2); + } + static void precommit_add(NodeType *add) { + precommit_expr(add,"add",INSTR_ADD); + } /* }}} */ + + /* SUB */ + static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("sub", OPR_SUB, expr1, expr2); + } + static void precommit_sub(NodeType *sub) { + precommit_expr(sub,"sub",INSTR_SUB); + } /* }}} */ + + /* NEG */ + static NodeType *new_neg(NodeType *expr) { /* {{{ */ + NodeType *zeroConst = NULL; + if (expr->type == CONST_INT_NODE) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (expr->type == CONST_FLOAT_NODE) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (expr->type == CONST_PTR_NODE) { + fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else { + int type = gsl_type_of_var(expr->vnamespace, expr->str); + if (type == INSTR_FLOAT) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (type == INSTR_PTR) { + fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else if (type == INSTR_INT) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", + expr->line_number, expr->str); + exit(1); + } + } + return new_expr2("sub", OPR_SUB, zeroConst, expr); + } + /* }}} */ + + /* MUL */ + static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("mul", OPR_MUL, expr1, expr2); + } + static void precommit_mul(NodeType *mul) { + precommit_expr(mul,"mul",INSTR_MUL); + } /* }}} */ + + /* DIV */ + static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("div", OPR_DIV, expr1, expr2); + } + static void precommit_div(NodeType *mul) { + precommit_expr(mul,"div",INSTR_DIV); + } /* }}} */ + + /* CALL EXPRESSION */ + static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ + NodeType *call = new_call(name,affect_list); + NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); + node->vnamespace = gsl_find_namespace(name); + if (node->vnamespace == NULL) + fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); + return node; + } + static void precommit_call_expr(NodeType *call) { + char stmp[256]; + NodeType *tmp,*tmpcpy; + int type = gsl_type_of_var(call->vnamespace, call->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + call->line_number, call->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + tmp = new_var(stmp,call->line_number); + commit_node(call->unode.opr.op[0],0); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); + + nodeFreeInternals(call); + *call = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static void commit_test2(NodeType *set,const char *type, int instr) + { /* {{{ */ + NodeType *tmp; + char stmp[256]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + tmp = set->unode.opr.op[0]; + + stmp[0] = 0; + if (set->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + if (stmp[0]) { + NodeType *tmpcpy; + tmp = new_var(stmp, set->line_number); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,set->unode.opr.op[0]),0); + tmp = tmpcpy; + } + +#ifdef VERBOSE + printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); + commit_node(tmp,instr!=INSTR_SET); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* NOT */ + static NodeType *new_not(NodeType *expr1) { /* {{{ */ + return new_expr1("not", OPR_NOT, expr1); + } + static void commit_not(NodeType *set) + { + commit_node(set->unode.opr.op[0],0); +#ifdef VERBOSE + printf("not\n"); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + } /* }}} */ + + /* EQU */ + static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("isequal", OPR_EQU, expr1, expr2); + } + static void commit_equ(NodeType *mul) { + commit_test2(mul,"isequal",INSTR_ISEQUAL); + } /* }}} */ + + /* INF */ + static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("islower", OPR_LOW, expr1, expr2); + } + static void commit_low(NodeType *mul) { + commit_test2(mul,"islower",INSTR_ISLOWER); + } /* }}} */ + + /* WHILE */ + static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("while", OPR_WHILE, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + + static void commit_while(NodeType *node) + { + int lbl = allocateLabel(); + char start_while[1024], test_while[1024]; + sprintf(start_while, "|start_while_%d|", lbl); + sprintf(test_while, "|test_while_%d|", lbl); + + GSL_PUT_JUMP(test_while,node->line_number); + GSL_PUT_LABEL(start_while,node->line_number); + + /* code */ + commit_node(node->unode.opr.op[1],0); + + GSL_PUT_LABEL(test_while,node->line_number); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JNZERO(start_while,node->line_number); + } /* }}} */ + + /* FOR EACH */ + static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("for", OPR_FOREACH, 3); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = var_list; + node->unode.opr.op[2] = instr; + node->line_number = currentGoomSL->num_lines; + return node; + } + static void commit_foreach(NodeType *node) + { + NodeType *cur = node->unode.opr.op[1]; + char tmp_func[256], tmp_loop[256]; + int lbl = allocateLabel(); + sprintf(tmp_func, "|foreach_func_%d|", lbl); + sprintf(tmp_loop, "|foreach_loop_%d|", lbl); + + GSL_PUT_JUMP(tmp_loop, node->line_number); + GSL_PUT_LABEL(tmp_func, node->line_number); + + precommit_node(node->unode.opr.op[2]); + commit_node(node->unode.opr.op[2], 0); + + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +#ifdef VERBOSE + printf("ret\n"); +#endif + + GSL_PUT_LABEL(tmp_loop, node->line_number); + + while (cur != NULL) + { + NodeType *x, *var; + + /* 1: x=var */ + x = nodeClone(node->unode.opr.op[0]); + var = nodeClone(cur->unode.opr.op[0]); + commit_node(new_set(x, var),0); + + /* 2: instr */ + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", tmp_func); +#endif + + /* 3: var=x */ + x = nodeClone(node->unode.opr.op[0]); + var = cur->unode.opr.op[0]; + commit_node(new_set(var, x),0); + cur = cur->unode.opr.op[1]; + } + nodeFree(node->unode.opr.op[0]); + } /* }}} */ + + /* IF */ + static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("if", OPR_IF, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + static void commit_if(NodeType *node) { + + char slab[1024]; + sprintf(slab, "|eif%d|", allocateLabel()); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JZERO(slab,node->line_number); + /* code */ + commit_node(node->unode.opr.op[1],0); + GSL_PUT_LABEL(slab,node->line_number); + } /* }}} */ + + /* BLOCK */ + static NodeType *new_block(NodeType *lastNode) { /* {{{ */ + NodeType *blk = new_op("block", OPR_BLOCK, 2); + blk->unode.opr.op[0] = new_nop("start_of_block"); + blk->unode.opr.op[1] = lastNode; + return blk; + } + static void commit_block(NodeType *node) { + commit_node(node->unode.opr.op[0]->unode.opr.next,0); + } /* }}} */ + + /* FUNCTION INTRO */ + static NodeType *new_function_intro(const char *name) { /* {{{ */ + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + return new_op(stmp, OPR_FUNC_INTRO, 0); + } + static void commit_function_intro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("label %s\n", node->str); +#endif + } /* }}} */ + + /* FUNCTION OUTRO */ + static NodeType *new_function_outro() { /* {{{ */ + return new_op("ret", OPR_FUNC_OUTRO, 0); + } + static void commit_function_outro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + releaseAllTemps(); +#ifdef VERBOSE + printf("ret\n"); +#endif + } /* }}} */ + + /* AFFECTATION LIST */ + static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); + node->unode.opr.op[0] = set; + node->unode.opr.op[1] = next; + return node; + } + static NodeType *new_affect_list_after(NodeType *affect_list) + { + NodeType *ret = NULL; + NodeType *cur = affect_list; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + NodeType *next = cur->unode.opr.op[1]; + NodeType *lvalue = set->unode.opr.op[0]; + NodeType *expression = set->unode.opr.op[1]; + if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { + NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); + ret = new_affec_list(nset, ret); + } + cur = next; + } + return ret; + } + static void commit_affect_list(NodeType *node) + { + NodeType *cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + cur = cur->unode.opr.op[1]; + } + cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + commit_node(set,0); + cur = cur->unode.opr.op[1]; + } + } /* }}} */ + + /* VAR LIST */ + static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = next; + return node; + } + static void commit_var_list(NodeType *node) + { + } /* }}} */ + + /* FUNCTION CALL */ + static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ + HashValue *fval; + fval = goom_hash_get(currentGoomSL->functions, name); + if (!fval) { + gsl_declare_task(name); + fval = goom_hash_get(currentGoomSL->functions, name); + } + if (!fval) { + fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); + exit(1); + return NULL; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; + if (gef->is_extern) { + NodeType *node = new_op(name, OPR_EXT_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + else { + NodeType *node; + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + node = new_op(stmp, OPR_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + } + } + static void commit_ext_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +#ifdef VERBOSE + printf("extcall %s\n", node->str); +#endif + commit_node(alafter,0); + } + static void commit_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", node->str); +#endif + commit_node(alafter,0); + } /* }}} */ + + /** **/ + + static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ + static NodeType *lastNode = 0; + static NodeType *gsl_append(NodeType *curNode) { + if (curNode == 0) return 0; /* {{{ */ + if (lastNode) + lastNode->unode.opr.next = curNode; + lastNode = curNode; + while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; + if (rootNode == 0) + rootNode = curNode; + return curNode; + } /* }}} */ + +#if 1 + int allocateTemp() { + return allocateLabel(); + } + void releaseAllTemps() {} + void releaseTemp(int n) {} +#else + static int nbTemp = 0; + static int *tempArray = 0; + static int tempArraySize = 0; + int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ + int i = 0; /* {{{ */ + if (tempArray == 0) { + tempArraySize = 256; + tempArray = (int*)malloc(tempArraySize * sizeof(int)); + } + while (1) { + int j; + for (j=0;jtype == OPR_NODE) + switch(node->unode.opr.type) { + case OPR_ADD: precommit_add(node); break; + case OPR_SUB: precommit_sub(node); break; + case OPR_MUL: precommit_mul(node); break; + case OPR_DIV: precommit_div(node); break; + case OPR_CALL_EXPR: precommit_call_expr(node); break; + } + } /* }}} */ + + void commit_node(NodeType *node, int releaseIfTmp) + { /* {{{ */ + if (node == 0) return; + + switch(node->type) { + case OPR_NODE: + switch(node->unode.opr.type) { + case OPR_SET: commit_set(node); break; + case OPR_PLUS_EQ: commit_plus_eq(node); break; + case OPR_SUB_EQ: commit_sub_eq(node); break; + case OPR_MUL_EQ: commit_mul_eq(node); break; + case OPR_DIV_EQ: commit_div_eq(node); break; + case OPR_IF: commit_if(node); break; + case OPR_WHILE: commit_while(node); break; + case OPR_BLOCK: commit_block(node); break; + case OPR_FUNC_INTRO: commit_function_intro(node); break; + case OPR_FUNC_OUTRO: commit_function_outro(node); break; + case OPR_CALL: commit_call(node); break; + case OPR_EXT_CALL: commit_ext_call(node); break; + case OPR_EQU: commit_equ(node); break; + case OPR_LOW: commit_low(node); break; + case OPR_NOT: commit_not(node); break; + case OPR_AFFECT_LIST: commit_affect_list(node); break; + case OPR_FOREACH: commit_foreach(node); break; + case OPR_VAR_LIST: commit_var_list(node); break; +#ifdef VERBOSE + case EMPTY_NODE: printf("NOP\n"); break; +#endif + } + + commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ + break; + + case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; + case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; + case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; + case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; + } + if (releaseIfTmp && is_tmp_expr(node)) + releaseTemp(get_tmp_id(node)); + + nodeFree(node); + } /* }}} */ + + NodeType *nodeNew(const char *str, int type, int line_number) { + NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ + node->type = type; + node->str = (char*)malloc(strlen(str)+1); + node->vnamespace = NULL; + node->line_number = line_number; + strcpy(node->str, str); + return node; + } /* }}} */ + static NodeType *nodeClone(NodeType *node) { + NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ + ret->vnamespace = node->vnamespace; + ret->unode = node->unode; + return ret; + } /* }}} */ + + void nodeFreeInternals(NodeType *node) { + free(node->str); /* {{{ */ + } /* }}} */ + + void nodeFree(NodeType *node) { + nodeFreeInternals(node); /* {{{ */ + free(node); + } /* }}} */ + + NodeType *new_constInt(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ + node->unode.constInt.val = atoi(str); + return node; + } /* }}} */ + + NodeType *new_constPtr(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ + node->unode.constPtr.id = strtol(str,NULL,0); + return node; + } /* }}} */ + + NodeType *new_constFloat(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ + node->unode.constFloat.val = atof(str); + return node; + } /* }}} */ + + NodeType *new_var(const char *str, int line_number) { + NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ + node->vnamespace = gsl_find_namespace(str); + if (node->vnamespace == 0) { + fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); + exit(1); + } + return node; + } /* }}} */ + + NodeType *new_nop(const char *str) { + NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ + return node; + } /* }}} */ + + NodeType *new_op(const char *str, int type, int nbOp) { + int i; /* {{{ */ + NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); + node->unode.opr.next = 0; + node->unode.opr.type = type; + node->unode.opr.nbOp = nbOp; + for (i=0;iunode.opr.op[i] = 0; + return node; + } /* }}} */ + + + void gsl_declare_global_variable(int type, char *name) { + switch(type){ + case -1: break; + case FLOAT_TK:gsl_float_decl_global(name);break; + case INT_TK: gsl_int_decl_global(name);break; + case PTR_TK: gsl_ptr_decl_global(name);break; + default: + { + int id = type - 1000; + gsl_struct_decl_global_from_id(name,id); + } + } + } + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 1199 "goomsl_yacc.y" +typedef union YYSTYPE { + int intValue; + float floatValue; + char charValue; + char strValue[2048]; + NodeType *nPtr; + GoomHash *namespace; + GSL_Struct *gsl_struct; + GSL_StructField *gsl_struct_field; + } YYSTYPE; +/* Line 191 of yacc.c. */ +#line 1327 "goomsl_yacc.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 214 of yacc.c. */ +#line 1339 "goomsl_yacc.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 229 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 42 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 30 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 89 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 217 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 279 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 35, 36, 32, 29, 34, 30, 2, 31, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 33, 2, + 27, 26, 28, 37, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 40, 2, 41, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 38, 2, 39, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 7, 10, 19, 30, 39, 50, 53, + 56, 57, 65, 68, 73, 76, 79, 82, 85, 87, + 89, 90, 93, 96, 99, 102, 104, 108, 111, 112, + 116, 122, 130, 131, 132, 137, 142, 147, 152, 154, + 157, 160, 163, 166, 169, 172, 179, 186, 193, 195, + 199, 203, 207, 211, 218, 222, 224, 227, 231, 232, + 234, 236, 240, 244, 248, 252, 255, 259, 261, 265, + 269, 273, 277, 281, 285, 288, 290, 292, 294, 298, + 304, 310, 318, 323, 330, 333, 335, 340, 344, 346 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 43, 0, -1, 44, 55, 52, -1, 44, 59, -1, + 44, 11, 27, 48, 28, 50, 25, 56, -1, 44, + 11, 27, 48, 33, 51, 28, 50, 25, 56, -1, + 44, 10, 27, 49, 28, 50, 25, 56, -1, 44, + 10, 27, 49, 33, 51, 28, 50, 25, 56, -1, + 44, 45, -1, 44, 25, -1, -1, 22, 27, 5, + 33, 46, 28, 25, -1, 71, 47, -1, 46, 34, + 71, 47, -1, 8, 5, -1, 9, 5, -1, 7, + 5, -1, 5, 5, -1, 5, -1, 5, -1, -1, + 33, 8, -1, 33, 9, -1, 33, 7, -1, 33, + 5, -1, 58, -1, 58, 34, 51, -1, 52, 53, + -1, -1, 54, 44, 55, -1, 27, 49, 28, 50, + 25, -1, 27, 49, 33, 51, 28, 50, 25, -1, + -1, -1, 9, 5, 26, 64, -1, 8, 5, 26, + 64, -1, 7, 5, 26, 64, -1, 5, 5, 26, + 64, -1, 58, -1, 9, 5, -1, 8, 5, -1, + 7, 5, -1, 5, 5, -1, 62, 25, -1, 57, + 25, -1, 35, 65, 36, 37, 71, 59, -1, 12, + 65, 71, 13, 71, 59, -1, 38, 25, 63, 44, + 39, 25, -1, 67, -1, 5, 15, 64, -1, 5, + 16, 64, -1, 5, 18, 64, -1, 5, 17, 64, + -1, 23, 5, 24, 60, 13, 59, -1, 35, 61, + 36, -1, 5, -1, 5, 61, -1, 5, 26, 64, + -1, -1, 5, -1, 66, -1, 64, 32, 64, -1, + 64, 31, 64, -1, 64, 29, 64, -1, 64, 30, + 64, -1, 30, 64, -1, 35, 64, 36, -1, 68, + -1, 64, 26, 64, -1, 64, 27, 64, -1, 64, + 28, 64, -1, 64, 19, 64, -1, 64, 20, 64, + -1, 64, 21, 64, -1, 14, 65, -1, 4, -1, + 3, -1, 6, -1, 49, 25, 56, -1, 49, 33, + 69, 25, 56, -1, 40, 49, 41, 25, 56, -1, + 40, 49, 33, 69, 41, 25, 56, -1, 40, 49, + 56, 41, -1, 40, 49, 33, 69, 41, 56, -1, + 70, 69, -1, 70, -1, 5, 26, 56, 64, -1, + 33, 56, 64, -1, 25, -1, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 1236, 1236, 1238, 1239, 1240, 1241, 1242, 1243, 1244, + 1245, 1250, 1253, 1254, 1257, 1258, 1259, 1260, 1265, 1267, + 1270, 1271, 1272, 1273, 1274, 1277, 1278, 1283, 1284, 1287, + 1289, 1291, 1294, 1296, 1300, 1301, 1302, 1303, 1304, 1307, + 1308, 1309, 1310, 1315, 1316, 1317, 1318, 1319, 1320, 1321, + 1322, 1323, 1324, 1325, 1328, 1330, 1331, 1334, 1336, 1339, + 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1350, 1351, + 1352, 1353, 1354, 1355, 1356, 1359, 1360, 1361, 1366, 1367, + 1368, 1369, 1373, 1374, 1377, 1378, 1380, 1384, 1393, 1393 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "LTYPE_INTEGER", "LTYPE_FLOAT", + "LTYPE_VAR", "LTYPE_PTR", "PTR_TK", "INT_TK", "FLOAT_TK", "DECLARE", + "EXTERNAL", "WHILE", "DO", "NOT", "PLUS_EQ", "SUB_EQ", "DIV_EQ", + "MUL_EQ", "SUP_EQ", "LOW_EQ", "NOT_EQ", "STRUCT", "FOR", "IN", "'\\n'", + "'='", "'<'", "'>'", "'+'", "'-'", "'/'", "'*'", "':'", "','", "'('", + "')'", "'?'", "'{'", "'}'", "'['", "']'", "$accept", "gsl", "gsl_code", + "struct_declaration", "struct_members", "struct_member", + "ext_task_name", "task_name", "return_type", "arglist", + "gsl_def_functions", "function", "function_intro", "function_outro", + "leave_namespace", "declaration", "empty_declaration", "instruction", + "var_list", "var_list_content", "affectation", "start_block", + "expression", "test", "constValue", "func_call", "func_call_expression", + "affectation_list", "affectation_in_list", "opt_nl", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 10, 61, 60, 62, 43, + 45, 47, 42, 58, 44, 40, 41, 63, 123, 125, + 91, 93 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 42, 43, 44, 44, 44, 44, 44, 44, 44, + 44, 45, 46, 46, 47, 47, 47, 47, 48, 49, + 50, 50, 50, 50, 50, 51, 51, 52, 52, 53, + 54, 54, 55, 56, 57, 57, 57, 57, 57, 58, + 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 60, 61, 61, 62, 63, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, + 65, 65, 65, 65, 65, 66, 66, 66, 67, 67, + 67, 67, 68, 68, 69, 69, 70, 70, 71, 71 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 3, 2, 8, 10, 8, 10, 2, 2, + 0, 7, 2, 4, 2, 2, 2, 2, 1, 1, + 0, 2, 2, 2, 2, 1, 3, 2, 0, 3, + 5, 7, 0, 0, 4, 4, 4, 4, 1, 2, + 2, 2, 2, 2, 2, 6, 6, 6, 1, 3, + 3, 3, 3, 6, 3, 1, 2, 3, 0, 1, + 1, 3, 3, 3, 3, 2, 3, 1, 3, 3, + 3, 3, 3, 3, 2, 1, 1, 1, 3, 5, + 5, 7, 4, 6, 2, 1, 4, 3, 1, 0 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 10, 0, 32, 1, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 8, 0, 28, + 0, 38, 3, 0, 48, 42, 0, 0, 0, 0, + 0, 41, 40, 39, 0, 0, 76, 75, 59, 77, + 0, 0, 0, 0, 0, 89, 60, 67, 0, 0, + 0, 58, 19, 0, 33, 0, 2, 44, 43, 0, + 49, 50, 52, 51, 57, 0, 0, 0, 0, 18, + 0, 74, 65, 0, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, + 10, 0, 0, 78, 0, 33, 0, 85, 0, 27, + 10, 37, 36, 35, 34, 20, 0, 20, 0, 66, + 0, 0, 71, 72, 73, 68, 69, 70, 63, 64, + 62, 61, 89, 89, 0, 0, 89, 0, 0, 33, + 33, 0, 33, 84, 0, 32, 0, 0, 0, 0, + 0, 0, 0, 25, 0, 0, 0, 82, 0, 0, + 0, 55, 0, 0, 0, 0, 0, 80, 0, 87, + 79, 20, 0, 29, 24, 23, 21, 22, 33, 42, + 41, 40, 39, 20, 0, 33, 20, 33, 46, 0, + 89, 0, 0, 0, 0, 12, 56, 54, 53, 45, + 47, 33, 86, 0, 0, 6, 0, 26, 4, 0, + 83, 11, 0, 17, 16, 14, 15, 81, 30, 20, + 33, 33, 13, 0, 7, 5, 31 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 1, 2, 17, 149, 185, 70, 18, 137, 142, + 56, 99, 100, 19, 93, 20, 21, 22, 125, 152, + 23, 90, 44, 45, 46, 24, 47, 96, 97, 86 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -116 +static const short yypact[] = +{ + -116, 40, 136, -116, 103, 39, 66, 68, 61, 65, + 1, 77, 101, -116, 1, 84, 109, -116, 12, -116, + 91, -116, -116, 97, -116, 98, 72, 72, 72, 72, + 72, 99, 104, 113, 109, 130, -116, -116, -116, -116, + 1, 72, 72, 109, 166, 115, -116, -116, 145, 131, + 118, -116, -116, -24, -116, -3, 138, -116, -116, 72, + 159, 159, 159, 159, 159, 72, 72, 72, 14, -116, + 51, -116, 22, 102, 124, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, -116, 160, 139, 140, 141, + -116, -3, 152, -116, 154, -116, 156, -3, 109, -116, + -116, 159, 159, 159, 159, 150, 82, 150, 82, -116, + -3, 158, 159, 159, 159, 159, 159, 159, 22, 22, + -116, -116, 115, 115, 195, 188, 115, 88, 162, -116, + -116, 72, -116, -116, 52, 136, 155, 177, 199, 200, + 201, 202, 180, 175, 185, 183, 171, -116, 144, 18, + 161, 195, 178, 144, 144, 190, 191, -116, 72, 159, + -116, 150, 82, -116, -116, -116, -116, -116, -116, -116, + -116, -116, -116, 150, 82, -116, 150, -116, -116, 192, + 115, 208, 213, 214, 215, -116, -116, -116, -116, -116, + -116, -116, 159, 196, 194, -116, 198, -116, -116, 203, + -116, -116, 161, -116, -116, -116, -116, -116, -116, 150, + -116, -116, -116, 204, -116, -116, -116 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yysigned_char yypgoto[] = +{ + -116, -116, -68, -116, -116, 23, -116, -15, -104, -92, + -116, -116, -116, 89, -74, -116, -88, -115, -116, 75, + -116, -116, -16, -6, -116, -116, -116, -62, -116, -99 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const unsigned char yytable[] = +{ + 111, 53, 94, 144, 36, 37, 38, 39, 50, 91, + 60, 61, 62, 63, 64, 40, 145, 92, 143, 68, + 143, 131, 127, 148, 150, 72, 73, 154, 74, 128, + 95, 41, 135, 178, 71, 133, 42, 54, 188, 189, + 3, 43, 105, 101, 31, 55, 179, 106, 146, 102, + 103, 104, 180, 83, 84, 157, 158, 193, 160, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 196, + 194, 32, 199, 33, 143, 36, 37, 38, 39, 107, + 161, 202, 197, 134, 108, 162, 143, 138, 34, 139, + 140, 141, 35, 4, 195, 5, 6, 7, 8, 9, + 10, 198, 41, 200, 48, 213, 49, 42, 25, 51, + 11, 12, 43, 13, 52, 159, 57, 207, 26, 27, + 28, 29, 58, 14, 59, 65, 15, 155, 16, 30, + 66, 81, 82, 83, 84, 69, 214, 215, 109, 67, + 85, 4, 192, 5, 6, 7, 8, 9, 10, 4, + 87, 5, 6, 7, 89, 88, 10, 110, 11, 12, + 164, 13, 165, 166, 167, 98, 181, 12, 182, 183, + 184, 14, 123, 122, 15, 124, 16, 129, 126, 14, + 130, 132, 15, 136, 16, 75, 76, 77, 81, 82, + 83, 84, 78, 79, 80, 81, 82, 83, 84, 147, + 151, 153, 168, 156, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 203, 187, 190, 191, 201, 204, 205, + 206, 208, 209, 210, 163, 212, 186, 0, 211, 216 +}; + +static const short yycheck[] = +{ + 74, 16, 5, 107, 3, 4, 5, 6, 14, 33, + 26, 27, 28, 29, 30, 14, 108, 41, 106, 34, + 108, 95, 90, 122, 123, 41, 42, 126, 43, 91, + 33, 30, 100, 148, 40, 97, 35, 25, 153, 154, + 0, 40, 28, 59, 5, 33, 28, 33, 110, 65, + 66, 67, 34, 31, 32, 129, 130, 161, 132, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 173, + 162, 5, 176, 5, 162, 3, 4, 5, 6, 28, + 28, 180, 174, 98, 33, 33, 174, 5, 27, 7, + 8, 9, 27, 5, 168, 7, 8, 9, 10, 11, + 12, 175, 30, 177, 27, 209, 5, 35, 5, 25, + 22, 23, 40, 25, 5, 131, 25, 191, 15, 16, + 17, 18, 25, 35, 26, 26, 38, 39, 40, 26, + 26, 29, 30, 31, 32, 5, 210, 211, 36, 26, + 25, 5, 158, 7, 8, 9, 10, 11, 12, 5, + 5, 7, 8, 9, 36, 24, 12, 33, 22, 23, + 5, 25, 7, 8, 9, 27, 5, 23, 7, 8, + 9, 35, 33, 13, 38, 35, 40, 25, 37, 35, + 26, 25, 38, 33, 40, 19, 20, 21, 29, 30, + 31, 32, 26, 27, 28, 29, 30, 31, 32, 41, + 5, 13, 25, 41, 5, 5, 5, 5, 28, 34, + 25, 28, 41, 5, 36, 25, 25, 25, 5, 5, + 5, 25, 28, 25, 135, 202, 151, -1, 25, 25 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 43, 44, 0, 5, 7, 8, 9, 10, 11, + 12, 22, 23, 25, 35, 38, 40, 45, 49, 55, + 57, 58, 59, 62, 67, 5, 15, 16, 17, 18, + 26, 5, 5, 5, 27, 27, 3, 4, 5, 6, + 14, 30, 35, 40, 64, 65, 66, 68, 27, 5, + 65, 25, 5, 49, 25, 33, 52, 25, 25, 26, + 64, 64, 64, 64, 64, 26, 26, 26, 49, 5, + 48, 65, 64, 64, 49, 19, 20, 21, 26, 27, + 28, 29, 30, 31, 32, 25, 71, 5, 24, 36, + 63, 33, 41, 56, 5, 33, 69, 70, 27, 53, + 54, 64, 64, 64, 64, 28, 33, 28, 33, 36, + 33, 56, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 13, 33, 35, 60, 37, 44, 69, 25, + 26, 56, 25, 69, 49, 44, 33, 50, 5, 7, + 8, 9, 51, 58, 50, 51, 69, 41, 71, 46, + 71, 5, 61, 13, 71, 39, 41, 56, 56, 64, + 56, 28, 33, 55, 5, 7, 8, 9, 25, 5, + 5, 5, 5, 28, 34, 25, 28, 41, 59, 28, + 34, 5, 7, 8, 9, 47, 61, 36, 59, 59, + 25, 25, 64, 50, 51, 56, 50, 51, 56, 50, + 56, 25, 71, 5, 5, 5, 5, 56, 25, 28, + 25, 25, 47, 50, 56, 56, 25 +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.first_line = Rhs[1].first_line; \ + Current.first_column = Rhs[1].first_column; \ + Current.last_line = Rhs[N].last_line; \ + Current.last_column = Rhs[N].last_column; +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (cinluded). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short *bottom, short *top) +#else +static void +yy_stack_print (bottom, top) + short *bottom; + short *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned int yylineno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylineno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 3: +#line 1238 "goomsl_yacc.y" + { gsl_append(yyvsp[0].nPtr); } + break; + + case 4: +#line 1239 "goomsl_yacc.y" + { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); } + break; + + case 5: +#line 1240 "goomsl_yacc.y" + { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); } + break; + + case 6: +#line 1241 "goomsl_yacc.y" + { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); } + break; + + case 7: +#line 1242 "goomsl_yacc.y" + { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); } + break; + + case 11: +#line 1250 "goomsl_yacc.y" + { gsl_add_struct(yyvsp[-4].strValue, yyvsp[-2].gsl_struct); } + break; + + case 12: +#line 1253 "goomsl_yacc.y" + { yyval.gsl_struct = gsl_new_struct(yyvsp[0].gsl_struct_field); } + break; + + case 13: +#line 1254 "goomsl_yacc.y" + { yyval.gsl_struct = yyvsp[-3].gsl_struct; gsl_add_struct_field(yyvsp[-3].gsl_struct, yyvsp[0].gsl_struct_field); } + break; + + case 14: +#line 1257 "goomsl_yacc.y" + { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_INT); } + break; + + case 15: +#line 1258 "goomsl_yacc.y" + { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_FLOAT); } + break; + + case 16: +#line 1259 "goomsl_yacc.y" + { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_PTR); } + break; + + case 17: +#line 1260 "goomsl_yacc.y" + { yyval.gsl_struct_field = gsl_new_struct_field_struct(yyvsp[0].strValue, yyvsp[-1].strValue); } + break; + + case 18: +#line 1265 "goomsl_yacc.y" + { gsl_declare_external_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); } + break; + + case 19: +#line 1267 "goomsl_yacc.y" + { gsl_declare_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); } + break; + + case 20: +#line 1270 "goomsl_yacc.y" + { yyval.intValue=-1; } + break; + + case 21: +#line 1271 "goomsl_yacc.y" + { yyval.intValue=INT_TK; } + break; + + case 22: +#line 1272 "goomsl_yacc.y" + { yyval.intValue=FLOAT_TK; } + break; + + case 23: +#line 1273 "goomsl_yacc.y" + { yyval.intValue=PTR_TK; } + break; + + case 24: +#line 1274 "goomsl_yacc.y" + { yyval.intValue= 1000 + gsl_get_struct_id(yyvsp[0].strValue); } + break; + + case 29: +#line 1287 "goomsl_yacc.y" + { gsl_leavenamespace(); } + break; + + case 30: +#line 1289 "goomsl_yacc.y" + { gsl_append(new_function_intro(yyvsp[-3].strValue)); + gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-3].strValue); } + break; + + case 31: +#line 1291 "goomsl_yacc.y" + { gsl_append(new_function_intro(yyvsp[-5].strValue)); + gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-5].strValue); } + break; + + case 32: +#line 1294 "goomsl_yacc.y" + { gsl_append(new_function_outro()); } + break; + + case 33: +#line 1296 "goomsl_yacc.y" + { yyval.namespace = gsl_leavenamespace(); } + break; + + case 34: +#line 1300 "goomsl_yacc.y" + { gsl_float_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } + break; + + case 35: +#line 1301 "goomsl_yacc.y" + { gsl_int_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } + break; + + case 36: +#line 1302 "goomsl_yacc.y" + { gsl_ptr_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } + break; + + case 37: +#line 1303 "goomsl_yacc.y" + { gsl_struct_decl_local(yyvsp[-3].strValue,yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } + break; + + case 38: +#line 1304 "goomsl_yacc.y" + { yyval.nPtr = 0; } + break; + + case 39: +#line 1307 "goomsl_yacc.y" + { gsl_float_decl_local(yyvsp[0].strValue); } + break; + + case 40: +#line 1308 "goomsl_yacc.y" + { gsl_int_decl_local(yyvsp[0].strValue); } + break; + + case 41: +#line 1309 "goomsl_yacc.y" + { gsl_ptr_decl_local(yyvsp[0].strValue); } + break; + + case 42: +#line 1310 "goomsl_yacc.y" + { gsl_struct_decl_local(yyvsp[-1].strValue,yyvsp[0].strValue); } + break; + + case 43: +#line 1315 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[-1].nPtr; } + break; + + case 44: +#line 1316 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[-1].nPtr; } + break; + + case 45: +#line 1317 "goomsl_yacc.y" + { yyval.nPtr = new_if(yyvsp[-4].nPtr,yyvsp[0].nPtr); } + break; + + case 46: +#line 1318 "goomsl_yacc.y" + { yyval.nPtr = new_while(yyvsp[-4].nPtr,yyvsp[0].nPtr); } + break; + + case 47: +#line 1319 "goomsl_yacc.y" + { lastNode = yyvsp[-3].nPtr->unode.opr.op[1]; yyval.nPtr=yyvsp[-3].nPtr; } + break; + + case 48: +#line 1320 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[0].nPtr; } + break; + + case 49: +#line 1321 "goomsl_yacc.y" + { yyval.nPtr = new_plus_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } + break; + + case 50: +#line 1322 "goomsl_yacc.y" + { yyval.nPtr = new_sub_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } + break; + + case 51: +#line 1323 "goomsl_yacc.y" + { yyval.nPtr = new_mul_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } + break; + + case 52: +#line 1324 "goomsl_yacc.y" + { yyval.nPtr = new_div_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } + break; + + case 53: +#line 1325 "goomsl_yacc.y" + { yyval.nPtr = new_static_foreach(new_var(yyvsp[-4].strValue, currentGoomSL->num_lines), yyvsp[-2].nPtr, yyvsp[0].nPtr); } + break; + + case 54: +#line 1328 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[-1].nPtr; } + break; + + case 55: +#line 1330 "goomsl_yacc.y" + { yyval.nPtr = new_var_list(new_var(yyvsp[0].strValue,currentGoomSL->num_lines), NULL); } + break; + + case 56: +#line 1331 "goomsl_yacc.y" + { yyval.nPtr = new_var_list(new_var(yyvsp[-1].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } + break; + + case 57: +#line 1334 "goomsl_yacc.y" + { yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } + break; + + case 58: +#line 1336 "goomsl_yacc.y" + { yyval.nPtr = new_block(lastNode); lastNode = yyval.nPtr->unode.opr.op[0]; } + break; + + case 59: +#line 1339 "goomsl_yacc.y" + { yyval.nPtr = new_var(yyvsp[0].strValue,currentGoomSL->num_lines); } + break; + + case 60: +#line 1340 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[0].nPtr; } + break; + + case 61: +#line 1341 "goomsl_yacc.y" + { yyval.nPtr = new_mul(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 62: +#line 1342 "goomsl_yacc.y" + { yyval.nPtr = new_div(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 63: +#line 1343 "goomsl_yacc.y" + { yyval.nPtr = new_add(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 64: +#line 1344 "goomsl_yacc.y" + { yyval.nPtr = new_sub(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 65: +#line 1345 "goomsl_yacc.y" + { yyval.nPtr = new_neg(yyvsp[0].nPtr); } + break; + + case 66: +#line 1346 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[-1].nPtr; } + break; + + case 67: +#line 1347 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[0].nPtr; } + break; + + case 68: +#line 1350 "goomsl_yacc.y" + { yyval.nPtr = new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 69: +#line 1351 "goomsl_yacc.y" + { yyval.nPtr = new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 70: +#line 1352 "goomsl_yacc.y" + { yyval.nPtr = new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr); } + break; + + case 71: +#line 1353 "goomsl_yacc.y" + { yyval.nPtr = new_not(new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr)); } + break; + + case 72: +#line 1354 "goomsl_yacc.y" + { yyval.nPtr = new_not(new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr)); } + break; + + case 73: +#line 1355 "goomsl_yacc.y" + { yyval.nPtr = new_not(new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr)); } + break; + + case 74: +#line 1356 "goomsl_yacc.y" + { yyval.nPtr = new_not(yyvsp[0].nPtr); } + break; + + case 75: +#line 1359 "goomsl_yacc.y" + { yyval.nPtr = new_constFloat(yyvsp[0].strValue,currentGoomSL->num_lines); } + break; + + case 76: +#line 1360 "goomsl_yacc.y" + { yyval.nPtr = new_constInt(yyvsp[0].strValue,currentGoomSL->num_lines); } + break; + + case 77: +#line 1361 "goomsl_yacc.y" + { yyval.nPtr = new_constPtr(yyvsp[0].strValue,currentGoomSL->num_lines); } + break; + + case 78: +#line 1366 "goomsl_yacc.y" + { yyval.nPtr = new_call(yyvsp[-2].strValue,NULL); } + break; + + case 79: +#line 1367 "goomsl_yacc.y" + { yyval.nPtr = new_call(yyvsp[-4].strValue,yyvsp[-2].nPtr); } + break; + + case 80: +#line 1368 "goomsl_yacc.y" + { yyval.nPtr = new_call(yyvsp[-3].strValue,NULL); } + break; + + case 81: +#line 1369 "goomsl_yacc.y" + { yyval.nPtr = new_call(yyvsp[-5].strValue,yyvsp[-3].nPtr); } + break; + + case 82: +#line 1373 "goomsl_yacc.y" + { yyval.nPtr = new_call_expr(yyvsp[-2].strValue,NULL); } + break; + + case 83: +#line 1374 "goomsl_yacc.y" + { yyval.nPtr = new_call_expr(yyvsp[-4].strValue,yyvsp[-2].nPtr); } + break; + + case 84: +#line 1377 "goomsl_yacc.y" + { yyval.nPtr = new_affec_list(yyvsp[-1].nPtr,yyvsp[0].nPtr); } + break; + + case 85: +#line 1378 "goomsl_yacc.y" + { yyval.nPtr = new_affec_list(yyvsp[0].nPtr,NULL); } + break; + + case 86: +#line 1380 "goomsl_yacc.y" + { + gsl_reenternamespace(yyvsp[-1].namespace); + yyval.nPtr = new_set(new_var(yyvsp[-3].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); + } + break; + + case 87: +#line 1384 "goomsl_yacc.y" + { + gsl_reenternamespace(yyvsp[-1].namespace); + yyval.nPtr = new_set(new_var("&this", currentGoomSL->num_lines),yyvsp[0].nPtr); + } + break; + + + } + +/* Line 999 of yacc.c. */ +#line 2792 "goomsl_yacc.c" + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("syntax error, unexpected ") + 1; + yysize += yystrlen (yytname[yytype]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror ("syntax error"); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + /* Return failure if at end of input. */ + if (yychar == YYEOF) + { + /* Pop the error token. */ + YYPOPSTACK; + /* Pop the rest of the stack. */ + while (yyss < yyssp) + { + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + YYPOPSTACK; + } + YYABORT; + } + + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; + + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*----------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action. | +`----------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + yyvsp--; + yystate = *--yyssp; + + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + +#line 1396 "goomsl_yacc.y" + + + +void yyerror(char *str) +{ /* {{{ */ + fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); + currentGoomSL->compilationOK = 0; + exit(1); +} /* }}} */ + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,104 @@ +/* A Bison parser, made by GNU Bison 1.875. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + LTYPE_INTEGER = 258, + LTYPE_FLOAT = 259, + LTYPE_VAR = 260, + LTYPE_PTR = 261, + PTR_TK = 262, + INT_TK = 263, + FLOAT_TK = 264, + DECLARE = 265, + EXTERNAL = 266, + WHILE = 267, + DO = 268, + NOT = 269, + PLUS_EQ = 270, + SUB_EQ = 271, + DIV_EQ = 272, + MUL_EQ = 273, + SUP_EQ = 274, + LOW_EQ = 275, + NOT_EQ = 276, + STRUCT = 277, + FOR = 278, + IN = 279 + }; +#endif +#define LTYPE_INTEGER 258 +#define LTYPE_FLOAT 259 +#define LTYPE_VAR 260 +#define LTYPE_PTR 261 +#define PTR_TK 262 +#define INT_TK 263 +#define FLOAT_TK 264 +#define DECLARE 265 +#define EXTERNAL 266 +#define WHILE 267 +#define DO 268 +#define NOT 269 +#define PLUS_EQ 270 +#define SUB_EQ 271 +#define DIV_EQ 272 +#define MUL_EQ 273 +#define SUP_EQ 274 +#define LOW_EQ 275 +#define NOT_EQ 276 +#define STRUCT 277 +#define FOR 278 +#define IN 279 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 1199 "goomsl_yacc.y" +typedef union YYSTYPE { + int intValue; + float floatValue; + char charValue; + char strValue[2048]; + NodeType *nPtr; + GoomHash *namespace; + GSL_Struct *gsl_struct; + GSL_StructField *gsl_struct_field; + } YYSTYPE; +/* Line 1240 of yacc.c. */ +#line 95 "goomsl_yacc.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +extern YYSTYPE yylval; + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1405 @@ +/** + * copyright 2004, Jean-Christophe Hoelt + * + * This program is released under the terms of the GNU Lesser General Public Licence. + */ +%{ + #include + #include + #include + #include "goomsl.h" + #include "goomsl_private.h" + +#define STRUCT_ALIGNMENT 16 +/* #define VERBOSE */ + + int yylex(void); + void yyerror(char *); + extern GoomSL *currentGoomSL; + + static NodeType *nodeNew(const char *str, int type, int line_number); + static NodeType *nodeClone(NodeType *node); + static void nodeFreeInternals(NodeType *node); + static void nodeFree(NodeType *node); + + static void commit_node(NodeType *node, int releaseIfTemp); + static void precommit_node(NodeType *node); + + static NodeType *new_constInt(const char *str, int line_number); + static NodeType *new_constFloat(const char *str, int line_number); + static NodeType *new_constPtr(const char *str, int line_number); + static NodeType *new_var(const char *str, int line_number); + static NodeType *new_nop(const char *str); + static NodeType *new_op(const char *str, int type, int nbOp); + + static int allocateLabel(); + static int allocateTemp(); + static void releaseTemp(int n); + static void releaseAllTemps(); + + static int is_tmp_expr(NodeType *node) { + if (node->str) { + return (!strncmp(node->str,"_i_tmp_",7)) + || (!strncmp(node->str,"_f_tmp_",7)) + || (!strncmp(node->str,"_p_tmp",7)); + } + return 0; + } + /* pre: is_tmp_expr(node); */ + static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } + + static int is_commutative_expr(int itype) + { /* {{{ */ + return (itype == INSTR_ADD) + || (itype == INSTR_MUL) + || (itype == INSTR_ISEQUAL); + } /* }}} */ + + static void GSL_PUT_LABEL(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("label %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JUMP(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("jump %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + + static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("%s %s\n", iname, name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JZERO(char *name,int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); + } /* }}} */ + static void GSL_PUT_JNZERO(char *name, int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); + } /* }}} */ + + /* Structures Management */ + +#define ALIGN_ADDR(_addr,_align) {\ + if (_align>1) {\ + int _dec = (_addr%_align);\ + if (_dec != 0) _addr += _align - _dec;\ + }} + + /* */ + void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) + { + int i; + int consumed = 0; + int iblk=0, fblk=0; + + s->iBlock[0].size = 0; + s->iBlock[0].data = 0; + s->fBlock[0].size = 0; + s->fBlock[0].data = 0; + + /* Prepare sub-struct and calculate space needed for their storage */ + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type < FIRST_RESERVED) + { + int j=0; + GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; + consumed += sizeof(int); /* stocke le prefix */ + ALIGN_ADDR(consumed, s_align); + s->fields[i]->offsetInStruct = consumed; + gsl_prepare_struct(substruct, s_align, i_align, f_align); + for(j=0;substruct->iBlock[j].size>0;++j) { + s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; + s->iBlock[iblk].size = substruct->iBlock[j].size; + iblk++; + } + for(j=0;substruct->fBlock[j].size>0;++j) { + s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; + s->fBlock[fblk].size = substruct->fBlock[j].size; + fblk++; + } + consumed += substruct->size; + } + } + + /* Then prepare integers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_INT) + { + if (s->iBlock[iblk].size == 0) { + s->iBlock[iblk].size = 1; + s->iBlock[iblk].data = consumed; + } else { + s->iBlock[iblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + iblk++; + s->iBlock[iblk].size = 0; + s->iBlock[iblk].data = 0; + + /* Then prepare floats */ + ALIGN_ADDR(consumed, f_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_FLOAT) + { + if (s->fBlock[fblk].size == 0) { + s->fBlock[fblk].size = 1; + s->fBlock[fblk].data = consumed; + } else { + s->fBlock[fblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + fblk++; + s->fBlock[fblk].size = 0; + s->fBlock[fblk].data = 0; + + /* Finally prepare pointers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_PTR) + { + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + s->size = consumed; + } + + /* Returns the ID of a struct from its name */ + int gsl_get_struct_id(const char *name) /* {{{ */ + { + HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); + if (ret != NULL) return ret->i; + return -1; + } /* }}} */ + + /* Adds the definition of a struct */ + void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ + { + /* Prepare the struct: ie calculate internal storage format */ + gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); + + /* If the struct does not already exists */ + if (gsl_get_struct_id(name) < 0) + { + /* adds it */ + int id = currentGoomSL->nbStructID++; + goom_hash_put_int(currentGoomSL->structIDS, name, id); + if (currentGoomSL->gsl_struct_size <= id) { + currentGoomSL->gsl_struct_size *= 2; + currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, + sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); + } + currentGoomSL->gsl_struct[id] = gsl_struct; + } + } /* }}} */ + + /* Creates a field for a struct */ + GSL_StructField *gsl_new_struct_field(const char *name, int type) + { + GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); + strcpy(field->name, name); + field->type = type; + return field; + } + + /* Create as field for a struct which will be a struct itself */ + GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) + { + GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); + if (field->type < 0) { + fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", + currentGoomSL->num_lines, type); + exit(1); + } + return field; + } + + /* Creates a Struct */ + GSL_Struct *gsl_new_struct(GSL_StructField *field) + { + GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); + s->nbFields = 1; + s->fields[0] = field; + return s; + } + + /* Adds a field to a struct */ + void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) + { + s->fields[s->nbFields++] = field; + } + + int gsl_type_of_var(GoomHash *ns, const char *name) + { + char type_of[256]; + HashValue *hv; + sprintf(type_of, "__type_of_%s", name); + hv = goom_hash_get(ns, type_of); + if (hv != NULL) + return hv->i; + fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); + return -1; + } + + static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) + { + char type_of[256]; + if (name[0] == '@') { ns = currentGoomSL->vars; } + + if (space == NULL) { + switch (type) { + case INSTR_INT: + case INSTR_FLOAT: + case INSTR_PTR: + space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, + sizeof(int), sizeof(int)); + break; + case -1: + fprintf(stderr, "What the fuck!\n"); + exit(1); + default: /* On a un struct_id */ + space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, + currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); + } + } + goom_hash_put_ptr(ns, name, (void*)space); + sprintf(type_of, "__type_of_%s", name); + goom_hash_put_int(ns, type_of, type); + + /* Ensuite le hack: on ajoute les champs en tant que variables. */ + if (type < FIRST_RESERVED) + { + int i; + GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; + ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ + for (i = 0; i < gsl_struct->nbFields; ++i) + { + char full_name[256]; + char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; + sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); + gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); + } + } + } + + /* Declare a variable which will be a struct */ + static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) + { + int struct_id = gsl_get_struct_id(struct_name); + gsl_declare_var(namespace, name, struct_id, NULL); + } + + static void gsl_float_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); + } + static void gsl_int_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); + } + static void gsl_ptr_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); + } + static void gsl_struct_decl_global_from_id(const char *name, int id) + { + gsl_declare_var(currentGoomSL->vars, name, id, NULL); + } + + /* FLOAT */ + static void gsl_float_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); + } + /* INT */ + static void gsl_int_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); + } + /* PTR */ + static void gsl_ptr_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); + } + /* STRUCT */ + static void gsl_struct_decl_local(const char *struct_name, const char *name) + { + gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); + } + + + static void commit_test2(NodeType *set,const char *type, int instr); + static NodeType *new_call(const char *name, NodeType *affect_list); + + /* SETTER */ + static NodeType *new_set(NodeType *lvalue, NodeType *expression) + { /* {{{ */ + NodeType *set = new_op("set", OPR_SET, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } /* }}} */ + static void commit_set(NodeType *set) + { /* {{{ */ + commit_test2(set,"set",INSTR_SET); + } /* }}} */ + + /* PLUS_EQ */ + static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_plus_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* SUB_EQ */ + static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_sub_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* MUL_EQ */ + static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_mul_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* DIV_EQ */ + static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_div_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* commodity method for add, mult, ... */ + + static void precommit_expr(NodeType *expr, const char *type, int instr_id) + { /* {{{ */ + NodeType *tmp, *tmpcpy; + int toAdd; + + /* compute "left" and "right" */ + switch (expr->unode.opr.nbOp) { + case 2: + precommit_node(expr->unode.opr.op[1]); + case 1: + precommit_node(expr->unode.opr.op[0]); + } + + if (is_tmp_expr(expr->unode.opr.op[0])) { + tmp = expr->unode.opr.op[0]; + toAdd = 1; + } + else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { + tmp = expr->unode.opr.op[1]; + toAdd = 0; + } + else { + char stmp[256]; + /* declare a temporary variable to store the result */ + if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else { + int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + } + tmp = new_var(stmp,expr->line_number); + + /* set the tmp to the value of "op1" */ + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,expr->unode.opr.op[0]),0); + toAdd = 1; + + tmp = tmpcpy; + } + + /* add op2 to tmp */ +#ifdef VERBOSE + if (expr->unode.opr.nbOp == 2) + printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); + else + printf("%s %s\n", type, tmp->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); + tmpcpy = nodeClone(tmp); + commit_node(tmp,0); + if (expr->unode.opr.nbOp == 2) { + commit_node(expr->unode.opr.op[toAdd],1); + } + + /* redefine the ADD node now as the computed variable */ + nodeFreeInternals(expr); + *expr = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static NodeType *new_expr1(const char *name, int id, NodeType *expr1) + { /* {{{ */ + NodeType *add = new_op(name, id, 1); + add->unode.opr.op[0] = expr1; + return add; + } /* }}} */ + + static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) + { /* {{{ */ + NodeType *add = new_op(name, id, 2); + add->unode.opr.op[0] = expr1; + add->unode.opr.op[1] = expr2; + return add; + } /* }}} */ + + /* ADD */ + static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("add", OPR_ADD, expr1, expr2); + } + static void precommit_add(NodeType *add) { + precommit_expr(add,"add",INSTR_ADD); + } /* }}} */ + + /* SUB */ + static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("sub", OPR_SUB, expr1, expr2); + } + static void precommit_sub(NodeType *sub) { + precommit_expr(sub,"sub",INSTR_SUB); + } /* }}} */ + + /* NEG */ + static NodeType *new_neg(NodeType *expr) { /* {{{ */ + NodeType *zeroConst = NULL; + if (expr->type == CONST_INT_NODE) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (expr->type == CONST_FLOAT_NODE) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (expr->type == CONST_PTR_NODE) { + fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else { + int type = gsl_type_of_var(expr->vnamespace, expr->str); + if (type == INSTR_FLOAT) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (type == INSTR_PTR) { + fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else if (type == INSTR_INT) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", + expr->line_number, expr->str); + exit(1); + } + } + return new_expr2("sub", OPR_SUB, zeroConst, expr); + } + /* }}} */ + + /* MUL */ + static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("mul", OPR_MUL, expr1, expr2); + } + static void precommit_mul(NodeType *mul) { + precommit_expr(mul,"mul",INSTR_MUL); + } /* }}} */ + + /* DIV */ + static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("div", OPR_DIV, expr1, expr2); + } + static void precommit_div(NodeType *mul) { + precommit_expr(mul,"div",INSTR_DIV); + } /* }}} */ + + /* CALL EXPRESSION */ + static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ + NodeType *call = new_call(name,affect_list); + NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); + node->vnamespace = gsl_find_namespace(name); + if (node->vnamespace == NULL) + fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); + return node; + } + static void precommit_call_expr(NodeType *call) { + char stmp[256]; + NodeType *tmp,*tmpcpy; + int type = gsl_type_of_var(call->vnamespace, call->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + call->line_number, call->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + tmp = new_var(stmp,call->line_number); + commit_node(call->unode.opr.op[0],0); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); + + nodeFreeInternals(call); + *call = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static void commit_test2(NodeType *set,const char *type, int instr) + { /* {{{ */ + NodeType *tmp; + char stmp[256]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + tmp = set->unode.opr.op[0]; + + stmp[0] = 0; + if (set->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + if (stmp[0]) { + NodeType *tmpcpy; + tmp = new_var(stmp, set->line_number); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,set->unode.opr.op[0]),0); + tmp = tmpcpy; + } + +#ifdef VERBOSE + printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); + commit_node(tmp,instr!=INSTR_SET); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* NOT */ + static NodeType *new_not(NodeType *expr1) { /* {{{ */ + return new_expr1("not", OPR_NOT, expr1); + } + static void commit_not(NodeType *set) + { + commit_node(set->unode.opr.op[0],0); +#ifdef VERBOSE + printf("not\n"); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + } /* }}} */ + + /* EQU */ + static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("isequal", OPR_EQU, expr1, expr2); + } + static void commit_equ(NodeType *mul) { + commit_test2(mul,"isequal",INSTR_ISEQUAL); + } /* }}} */ + + /* INF */ + static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("islower", OPR_LOW, expr1, expr2); + } + static void commit_low(NodeType *mul) { + commit_test2(mul,"islower",INSTR_ISLOWER); + } /* }}} */ + + /* WHILE */ + static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("while", OPR_WHILE, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + + static void commit_while(NodeType *node) + { + int lbl = allocateLabel(); + char start_while[1024], test_while[1024]; + sprintf(start_while, "|start_while_%d|", lbl); + sprintf(test_while, "|test_while_%d|", lbl); + + GSL_PUT_JUMP(test_while,node->line_number); + GSL_PUT_LABEL(start_while,node->line_number); + + /* code */ + commit_node(node->unode.opr.op[1],0); + + GSL_PUT_LABEL(test_while,node->line_number); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JNZERO(start_while,node->line_number); + } /* }}} */ + + /* FOR EACH */ + static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("for", OPR_FOREACH, 3); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = var_list; + node->unode.opr.op[2] = instr; + node->line_number = currentGoomSL->num_lines; + return node; + } + static void commit_foreach(NodeType *node) + { + NodeType *cur = node->unode.opr.op[1]; + char tmp_func[256], tmp_loop[256]; + int lbl = allocateLabel(); + sprintf(tmp_func, "|foreach_func_%d|", lbl); + sprintf(tmp_loop, "|foreach_loop_%d|", lbl); + + GSL_PUT_JUMP(tmp_loop, node->line_number); + GSL_PUT_LABEL(tmp_func, node->line_number); + + precommit_node(node->unode.opr.op[2]); + commit_node(node->unode.opr.op[2], 0); + + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +#ifdef VERBOSE + printf("ret\n"); +#endif + + GSL_PUT_LABEL(tmp_loop, node->line_number); + + while (cur != NULL) + { + NodeType *x, *var; + + /* 1: x=var */ + x = nodeClone(node->unode.opr.op[0]); + var = nodeClone(cur->unode.opr.op[0]); + commit_node(new_set(x, var),0); + + /* 2: instr */ + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", tmp_func); +#endif + + /* 3: var=x */ + x = nodeClone(node->unode.opr.op[0]); + var = cur->unode.opr.op[0]; + commit_node(new_set(var, x),0); + cur = cur->unode.opr.op[1]; + } + nodeFree(node->unode.opr.op[0]); + } /* }}} */ + + /* IF */ + static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("if", OPR_IF, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + static void commit_if(NodeType *node) { + + char slab[1024]; + sprintf(slab, "|eif%d|", allocateLabel()); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JZERO(slab,node->line_number); + /* code */ + commit_node(node->unode.opr.op[1],0); + GSL_PUT_LABEL(slab,node->line_number); + } /* }}} */ + + /* BLOCK */ + static NodeType *new_block(NodeType *lastNode) { /* {{{ */ + NodeType *blk = new_op("block", OPR_BLOCK, 2); + blk->unode.opr.op[0] = new_nop("start_of_block"); + blk->unode.opr.op[1] = lastNode; + return blk; + } + static void commit_block(NodeType *node) { + commit_node(node->unode.opr.op[0]->unode.opr.next,0); + } /* }}} */ + + /* FUNCTION INTRO */ + static NodeType *new_function_intro(const char *name) { /* {{{ */ + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + return new_op(stmp, OPR_FUNC_INTRO, 0); + } + static void commit_function_intro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("label %s\n", node->str); +#endif + } /* }}} */ + + /* FUNCTION OUTRO */ + static NodeType *new_function_outro() { /* {{{ */ + return new_op("ret", OPR_FUNC_OUTRO, 0); + } + static void commit_function_outro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + releaseAllTemps(); +#ifdef VERBOSE + printf("ret\n"); +#endif + } /* }}} */ + + /* AFFECTATION LIST */ + static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); + node->unode.opr.op[0] = set; + node->unode.opr.op[1] = next; + return node; + } + static NodeType *new_affect_list_after(NodeType *affect_list) + { + NodeType *ret = NULL; + NodeType *cur = affect_list; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + NodeType *next = cur->unode.opr.op[1]; + NodeType *lvalue = set->unode.opr.op[0]; + NodeType *expression = set->unode.opr.op[1]; + if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { + NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); + ret = new_affec_list(nset, ret); + } + cur = next; + } + return ret; + } + static void commit_affect_list(NodeType *node) + { + NodeType *cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + cur = cur->unode.opr.op[1]; + } + cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + commit_node(set,0); + cur = cur->unode.opr.op[1]; + } + } /* }}} */ + + /* VAR LIST */ + static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = next; + return node; + } + static void commit_var_list(NodeType *node) + { + } /* }}} */ + + /* FUNCTION CALL */ + static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ + HashValue *fval; + fval = goom_hash_get(currentGoomSL->functions, name); + if (!fval) { + gsl_declare_task(name); + fval = goom_hash_get(currentGoomSL->functions, name); + } + if (!fval) { + fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); + exit(1); + return NULL; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; + if (gef->is_extern) { + NodeType *node = new_op(name, OPR_EXT_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + else { + NodeType *node; + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + node = new_op(stmp, OPR_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + } + } + static void commit_ext_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +#ifdef VERBOSE + printf("extcall %s\n", node->str); +#endif + commit_node(alafter,0); + } + static void commit_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", node->str); +#endif + commit_node(alafter,0); + } /* }}} */ + + /** **/ + + static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ + static NodeType *lastNode = 0; + static NodeType *gsl_append(NodeType *curNode) { + if (curNode == 0) return 0; /* {{{ */ + if (lastNode) + lastNode->unode.opr.next = curNode; + lastNode = curNode; + while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; + if (rootNode == 0) + rootNode = curNode; + return curNode; + } /* }}} */ + +#if 1 + int allocateTemp() { + return allocateLabel(); + } + void releaseAllTemps() {} + void releaseTemp(int n) {} +#else + static int nbTemp = 0; + static int *tempArray = 0; + static int tempArraySize = 0; + int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ + int i = 0; /* {{{ */ + if (tempArray == 0) { + tempArraySize = 256; + tempArray = (int*)malloc(tempArraySize * sizeof(int)); + } + while (1) { + int j; + for (j=0;jtype == OPR_NODE) + switch(node->unode.opr.type) { + case OPR_ADD: precommit_add(node); break; + case OPR_SUB: precommit_sub(node); break; + case OPR_MUL: precommit_mul(node); break; + case OPR_DIV: precommit_div(node); break; + case OPR_CALL_EXPR: precommit_call_expr(node); break; + } + } /* }}} */ + + void commit_node(NodeType *node, int releaseIfTmp) + { /* {{{ */ + if (node == 0) return; + + switch(node->type) { + case OPR_NODE: + switch(node->unode.opr.type) { + case OPR_SET: commit_set(node); break; + case OPR_PLUS_EQ: commit_plus_eq(node); break; + case OPR_SUB_EQ: commit_sub_eq(node); break; + case OPR_MUL_EQ: commit_mul_eq(node); break; + case OPR_DIV_EQ: commit_div_eq(node); break; + case OPR_IF: commit_if(node); break; + case OPR_WHILE: commit_while(node); break; + case OPR_BLOCK: commit_block(node); break; + case OPR_FUNC_INTRO: commit_function_intro(node); break; + case OPR_FUNC_OUTRO: commit_function_outro(node); break; + case OPR_CALL: commit_call(node); break; + case OPR_EXT_CALL: commit_ext_call(node); break; + case OPR_EQU: commit_equ(node); break; + case OPR_LOW: commit_low(node); break; + case OPR_NOT: commit_not(node); break; + case OPR_AFFECT_LIST: commit_affect_list(node); break; + case OPR_FOREACH: commit_foreach(node); break; + case OPR_VAR_LIST: commit_var_list(node); break; +#ifdef VERBOSE + case EMPTY_NODE: printf("NOP\n"); break; +#endif + } + + commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ + break; + + case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; + case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; + case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; + case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; + } + if (releaseIfTmp && is_tmp_expr(node)) + releaseTemp(get_tmp_id(node)); + + nodeFree(node); + } /* }}} */ + + NodeType *nodeNew(const char *str, int type, int line_number) { + NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ + node->type = type; + node->str = (char*)malloc(strlen(str)+1); + node->vnamespace = NULL; + node->line_number = line_number; + strcpy(node->str, str); + return node; + } /* }}} */ + static NodeType *nodeClone(NodeType *node) { + NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ + ret->vnamespace = node->vnamespace; + ret->unode = node->unode; + return ret; + } /* }}} */ + + void nodeFreeInternals(NodeType *node) { + free(node->str); /* {{{ */ + } /* }}} */ + + void nodeFree(NodeType *node) { + nodeFreeInternals(node); /* {{{ */ + free(node); + } /* }}} */ + + NodeType *new_constInt(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ + node->unode.constInt.val = atoi(str); + return node; + } /* }}} */ + + NodeType *new_constPtr(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ + node->unode.constPtr.id = strtol(str,NULL,0); + return node; + } /* }}} */ + + NodeType *new_constFloat(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ + node->unode.constFloat.val = atof(str); + return node; + } /* }}} */ + + NodeType *new_var(const char *str, int line_number) { + NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ + node->vnamespace = gsl_find_namespace(str); + if (node->vnamespace == 0) { + fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); + exit(1); + } + return node; + } /* }}} */ + + NodeType *new_nop(const char *str) { + NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ + return node; + } /* }}} */ + + NodeType *new_op(const char *str, int type, int nbOp) { + int i; /* {{{ */ + NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); + node->unode.opr.next = 0; + node->unode.opr.type = type; + node->unode.opr.nbOp = nbOp; + for (i=0;iunode.opr.op[i] = 0; + return node; + } /* }}} */ + + + void gsl_declare_global_variable(int type, char *name) { + switch(type){ + case -1: break; + case FLOAT_TK:gsl_float_decl_global(name);break; + case INT_TK: gsl_int_decl_global(name);break; + case PTR_TK: gsl_ptr_decl_global(name);break; + default: + { + int id = type - 1000; + gsl_struct_decl_global_from_id(name,id); + } + } + } + +%} + +%union { + int intValue; + float floatValue; + char charValue; + char strValue[2048]; + NodeType *nPtr; + GoomHash *namespace; + GSL_Struct *gsl_struct; + GSL_StructField *gsl_struct_field; + }; + +%token LTYPE_INTEGER +%token LTYPE_FLOAT +%token LTYPE_VAR +%token LTYPE_PTR + +%token PTR_TK INT_TK FLOAT_TK DECLARE EXTERNAL WHILE DO NOT PLUS_EQ SUB_EQ DIV_EQ MUL_EQ SUP_EQ LOW_EQ NOT_EQ STRUCT FOR IN + +%type return_type +%type expression constValue instruction test func_call func_call_expression +%type start_block affectation_list affectation_in_list affectation declaration +%type var_list_content var_list +%type task_name ext_task_name +%type leave_namespace +%type struct_members +%type struct_member +%left '\n' +%left PLUS_EQ SUB_EQ MUL_EQ DIV_EQ +%left NOT +%left '=' '<' '>' +%left '+' '-' +%left '/' '*' + +%% + +/* -------------- Global architechture of a GSL program ------------*/ + +gsl: gsl_code function_outro gsl_def_functions ; + +gsl_code: gsl_code instruction { gsl_append($2); } + | gsl_code EXTERNAL '<' ext_task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } + | gsl_code EXTERNAL '<' ext_task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } + | gsl_code DECLARE '<' task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } + | gsl_code DECLARE '<' task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } + | gsl_code struct_declaration + | gsl_code '\n' + | + ; + +/* ------------- Declaration of a structure ------------ */ + +struct_declaration: STRUCT '<' LTYPE_VAR ':' struct_members '>' '\n' { gsl_add_struct($3, $5); } + ; + +struct_members: opt_nl struct_member { $$ = gsl_new_struct($2); } + | struct_members ',' opt_nl struct_member { $$ = $1; gsl_add_struct_field($1, $4); } + ; + +struct_member: INT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_INT); } + | FLOAT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_FLOAT); } + | PTR_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_PTR); } + | LTYPE_VAR LTYPE_VAR { $$ = gsl_new_struct_field_struct($2, $1); } + ; + +/* ------------- Fonction declarations -------------- */ + +ext_task_name: LTYPE_VAR { gsl_declare_external_task($1); gsl_enternamespace($1); strcpy($$,$1); } + ; +task_name: LTYPE_VAR { gsl_declare_task($1); gsl_enternamespace($1); strcpy($$,$1); strcpy($$,$1); } + ; + +return_type: { $$=-1; } + | ':' INT_TK { $$=INT_TK; } + | ':' FLOAT_TK { $$=FLOAT_TK; } + | ':' PTR_TK { $$=PTR_TK; } + | ':' LTYPE_VAR { $$= 1000 + gsl_get_struct_id($2); } + ; + +arglist: empty_declaration + | empty_declaration ',' arglist + ; + +/* ------------- Fonction definition -------------- */ + +gsl_def_functions: gsl_def_functions function + | + ; + +function: function_intro gsl_code function_outro { gsl_leavenamespace(); } + +function_intro: '<' task_name '>' return_type '\n' { gsl_append(new_function_intro($2)); + gsl_declare_global_variable($4,$2); } + | '<' task_name ':' arglist '>' return_type '\n' { gsl_append(new_function_intro($2)); + gsl_declare_global_variable($6,$2); } + ; +function_outro: { gsl_append(new_function_outro()); } ; + +leave_namespace: { $$ = gsl_leavenamespace(); }; + +/* ------------ Variable declaration ---------------- */ + +declaration: FLOAT_TK LTYPE_VAR '=' expression { gsl_float_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | INT_TK LTYPE_VAR '=' expression { gsl_int_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | PTR_TK LTYPE_VAR '=' expression { gsl_ptr_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | LTYPE_VAR LTYPE_VAR '=' expression { gsl_struct_decl_local($1,$2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | empty_declaration { $$ = 0; } + ; + +empty_declaration: FLOAT_TK LTYPE_VAR { gsl_float_decl_local($2); } + | INT_TK LTYPE_VAR { gsl_int_decl_local($2); } + | PTR_TK LTYPE_VAR { gsl_ptr_decl_local($2); } + | LTYPE_VAR LTYPE_VAR { gsl_struct_decl_local($1,$2); } + ; + +/* -------------- Instructions and Expressions ------------------ */ + +instruction: affectation '\n' { $$ = $1; } + | declaration '\n' { $$ = $1; } + | '(' test ')' '?' opt_nl instruction { $$ = new_if($2,$6); } + | WHILE test opt_nl DO opt_nl instruction { $$ = new_while($2,$6); } + | '{' '\n' start_block gsl_code '}' '\n' { lastNode = $3->unode.opr.op[1]; $$=$3; } + | func_call { $$ = $1; } + | LTYPE_VAR PLUS_EQ expression { $$ = new_plus_eq(new_var($1,currentGoomSL->num_lines),$3); } + | LTYPE_VAR SUB_EQ expression { $$ = new_sub_eq(new_var($1,currentGoomSL->num_lines),$3); } + | LTYPE_VAR MUL_EQ expression { $$ = new_mul_eq(new_var($1,currentGoomSL->num_lines),$3); } + | LTYPE_VAR DIV_EQ expression { $$ = new_div_eq(new_var($1,currentGoomSL->num_lines),$3); } + | FOR LTYPE_VAR IN var_list DO instruction { $$ = new_static_foreach(new_var($2, currentGoomSL->num_lines), $4, $6); } + ; + +var_list: '(' var_list_content ')' { $$ = $2; } + ; +var_list_content: LTYPE_VAR { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), NULL); } + | LTYPE_VAR var_list_content { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), $2); } + ; + +affectation: LTYPE_VAR '=' expression { $$ = new_set(new_var($1,currentGoomSL->num_lines),$3); } ; + +start_block: { $$ = new_block(lastNode); lastNode = $$->unode.opr.op[0]; } + ; + +expression: LTYPE_VAR { $$ = new_var($1,currentGoomSL->num_lines); } + | constValue { $$ = $1; } + | expression '*' expression { $$ = new_mul($1,$3); } + | expression '/' expression { $$ = new_div($1,$3); } + | expression '+' expression { $$ = new_add($1,$3); } + | expression '-' expression { $$ = new_sub($1,$3); } + | '-' expression { $$ = new_neg($2); } + | '(' expression ')' { $$ = $2; } + | func_call_expression { $$ = $1; } + ; + +test: expression '=' expression { $$ = new_equ($1,$3); } + | expression '<' expression { $$ = new_low($1,$3); } + | expression '>' expression { $$ = new_low($3,$1); } + | expression SUP_EQ expression { $$ = new_not(new_low($1,$3)); } + | expression LOW_EQ expression { $$ = new_not(new_low($3,$1)); } + | expression NOT_EQ expression { $$ = new_not(new_equ($1,$3)); } + | NOT test { $$ = new_not($2); } + ; + +constValue: LTYPE_FLOAT { $$ = new_constFloat($1,currentGoomSL->num_lines); } + | LTYPE_INTEGER { $$ = new_constInt($1,currentGoomSL->num_lines); } + | LTYPE_PTR { $$ = new_constPtr($1,currentGoomSL->num_lines); } + ; + +/* ---------------- Function Calls ------------------ */ + +func_call: task_name '\n' leave_namespace { $$ = new_call($1,NULL); } + | task_name ':' affectation_list '\n' leave_namespace { $$ = new_call($1,$3); } + | '[' task_name ']' '\n' leave_namespace { $$ = new_call($2,NULL); } + | '[' task_name ':' affectation_list ']' '\n' leave_namespace { $$ = new_call($2,$4); } + ; + +func_call_expression: + '[' task_name leave_namespace ']' { $$ = new_call_expr($2,NULL); } + | '[' task_name ':' affectation_list ']' leave_namespace { $$ = new_call_expr($2,$4); } + ; + +affectation_list: affectation_in_list affectation_list { $$ = new_affec_list($1,$2); } + | affectation_in_list { $$ = new_affec_list($1,NULL); } + +affectation_in_list: LTYPE_VAR '=' leave_namespace expression { + gsl_reenternamespace($3); + $$ = new_set(new_var($1,currentGoomSL->num_lines),$4); + } + | ':' leave_namespace expression { + gsl_reenternamespace($2); + $$ = new_set(new_var("&this", currentGoomSL->num_lines),$3); + } + ; + + +/* ------------ Misc ---------- */ + +opt_nl: '\n' | ; + + +%% + + +void yyerror(char *str) +{ /* {{{ */ + fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); + currentGoomSL->compilationOK = 0; + exit(1); +} /* }}} */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_tools.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_tools.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_tools.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_tools.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,25 @@ +#include "goom_tools.h" +#include + +GoomRandom *goom_random_init(int i) { + GoomRandom *grandom = (GoomRandom*)malloc(sizeof(GoomRandom)); + srand (i); + grandom->pos = 1; + goom_random_update_array(grandom, GOOM_NB_RAND); + return grandom; +} + +void goom_random_free(GoomRandom *grandom) { + free(grandom); +} + +void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange) { + while (numberOfValuesToChange > 0) { +#if RAND_MAX < 0x10000 + grandom->array[grandom->pos++] = ((rand()<<16)+rand()) / 127; +#else + grandom->array[grandom->pos++] = rand() / 127; +#endif + numberOfValuesToChange--; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_tools.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_tools.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_tools.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_tools.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,42 @@ +#ifndef _GOOMTOOLS_H +#define _GOOMTOOLS_H + +/** + * Random number generator wrapper for faster random number. + */ + +#ifdef _WIN32PC +#define inline __inline +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#define random rand +#define bzero(x,y) memset(x,0,y) +#endif + +#define GOOM_NB_RAND 0x10000 + +typedef struct _GOOM_RANDOM { + int array[GOOM_NB_RAND]; + unsigned short pos; +} GoomRandom; + +GoomRandom *goom_random_init(int i); +void goom_random_free(GoomRandom *grandom); + +inline static int goom_random(GoomRandom *grandom) { + + grandom->pos++; /* works because pos is an unsigned short */ + return grandom->array[grandom->pos]; +} + +inline static int goom_irand(GoomRandom *grandom, int i) { + + grandom->pos++; + return grandom->array[grandom->pos] % i; +} + +/* called to change the specified number of value in the array, so that the array does not remain the same*/ +void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_typedefs.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_typedefs.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_typedefs.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_typedefs.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,11 @@ +#ifndef _GOOM_TYPEDEFS_H +#define _GOOM_TYPEDEFS_H + +typedef struct _PLUGIN_INFO PluginInfo; +typedef struct _SOUND_INFO SoundInfo; +typedef struct _GMLINE GMLine; +typedef struct _GMUNITPOINTER GMUnitPointer; +typedef struct _ZOOM_FILTER_DATA ZoomFilterData; +typedef struct _VISUAL_FX VisualFX; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,26 @@ +#ifndef _VISUAL_FX_H +#define _VISUAL_FX_H + +/** + * File created on 2003-05-21 by Jeko. + * (c)2003, JC Hoelt for iOS-software. + * + * LGPL Licence. + * If you use this file on a visual program, + * please make my name being visible on it. + */ + +#include "goom_config_param.h" +#include "goom_graphic.h" +#include "goom_typedefs.h" + +struct _VISUAL_FX { + void (*init) (struct _VISUAL_FX *_this, PluginInfo *info); + void (*free) (struct _VISUAL_FX *_this); + void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info); + void *fx_data; + + PluginParameters *params; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/graphic.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/graphic.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/graphic.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/graphic.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,10 @@ +#include "goom_graphic.h" + +const Color BLACK = { 0, 0, 0 }; +const Color WHITE = { 0xff, 0xff, 0xff }; +const Color RED = { 0xff, 0x05, 0x05 }; +const Color GREEN = { 0x05, 0xff, 0x05 }; +const Color BLUE = { 0x05, 0x05, 0xff }; +const Color YELLOW = { 0xff, 0xff, 0x33 }; +const Color ORANGE = { 0xff, 0xcc, 0x05 }; +const Color VIOLET = { 0x55, 0x05, 0xff }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ifs.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ifs.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ifs.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ifs.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,763 @@ +/* + * ifs.c --- modified iterated functions system for goom. + */ + +/*- + * Copyright (c) 1997 by Massimino Pascal + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * If this mode is weird and you have an old MetroX server, it is buggy. + * There is a free SuSE-enhanced MetroX X server that is fine. + * + * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." + * + * Revision History: + * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). + * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) + * 01-Nov-2000: Allocation checks + * 10-May-1997: jwz@jwz.org: turned into a standalone program. + * Made it render into an offscreen bitmap and then copy + * that onto the screen, to reduce flicker. + */ + +/* #ifdef STANDALONE */ + +#include +#include +#include + +#include "goom_config.h" + +#ifdef HAVE_MMX +#include "mmx.h" +#endif + +#include "goom_graphic.h" +#include "ifs.h" +#include "goom_tools.h" + +typedef struct _ifsPoint +{ + gint32 x, y; +} +IFSPoint; + + +#define MODE_ifs + +#define PROGCLASS "IFS" + +#define HACK_INIT init_ifs +#define HACK_DRAW draw_ifs + +#define ifs_opts xlockmore_opts + +#define DEFAULTS "*delay: 20000 \n" \ +"*ncolors: 100 \n" + +#define SMOOTH_COLORS + +#define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff)) +#define NRAND(n) ((int) (LRAND() % (n))) + +#if RAND_MAX < 0x10000 +#define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f) +#else +#define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */ +#endif + +/*****************************************************/ + +typedef float DBL; +typedef int F_PT; + +/* typedef float F_PT; */ + +/*****************************************************/ + +#define FIX 12 +#define UNIT ( 1<c_x = Gauss_Rand (goomInfo, 0.0, .8, 4.0); + Cur->c_y = Gauss_Rand (goomInfo, 0.0, .8, 4.0); + Cur->r = Gauss_Rand (goomInfo, F->r_mean, F->dr_mean, 3.0); + Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, F->dr2_mean, 2.0); + Cur->A = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); + Cur->A2 = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); + Cur++; + } +} + +static void +free_ifs_buffers (FRACTAL * Fractal) +{ + if (Fractal->Buffer1 != NULL) { + (void) free ((void *) Fractal->Buffer1); + Fractal->Buffer1 = (IFSPoint *) NULL; + } + if (Fractal->Buffer2 != NULL) { + (void) free ((void *) Fractal->Buffer2); + Fractal->Buffer2 = (IFSPoint *) NULL; + } +} + + +static void +free_ifs (FRACTAL * Fractal) +{ + free_ifs_buffers (Fractal); +} + +/***************************************************************/ + +static void +init_ifs (PluginInfo *goomInfo, IfsData *data) +{ + int i; + FRACTAL *Fractal; + int width = goomInfo->screen.width; + int height = goomInfo->screen.height; + + if (data->Root == NULL) { + data->Root = (FRACTAL *) malloc (sizeof (FRACTAL)); + if (data->Root == NULL) + return; + data->Root->Buffer1 = (IFSPoint *) NULL; + data->Root->Buffer2 = (IFSPoint *) NULL; + } + Fractal = data->Root; + + free_ifs_buffers (Fractal); + + i = (NRAND (4)) + 2; /* Number of centers */ + switch (i) { + case 3: + Fractal->Depth = MAX_DEPTH_3; + Fractal->r_mean = .6; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + case 4: + Fractal->Depth = MAX_DEPTH_4; + Fractal->r_mean = .5; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + case 5: + Fractal->Depth = MAX_DEPTH_5; + Fractal->r_mean = .5; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + default: + case 2: + Fractal->Depth = MAX_DEPTH_2; + Fractal->r_mean = .7; + Fractal->dr_mean = .3; + Fractal->dr2_mean = .4; + break; + } + Fractal->Nb_Simi = i; + Fractal->Max_Pt = Fractal->Nb_Simi - 1; + for (i = 0; i <= Fractal->Depth + 2; ++i) + Fractal->Max_Pt *= Fractal->Nb_Simi; + + if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt, + sizeof (IFSPoint))) == NULL) { + free_ifs (Fractal); + return; + } + if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt, + sizeof (IFSPoint))) == NULL) { + free_ifs (Fractal); + return; + } + + Fractal->Speed = 6; + Fractal->Width = width; /* modif by JeKo */ + Fractal->Height = height; /* modif by JeKo */ + Fractal->Cur_Pt = 0; + Fractal->Count = 0; + Fractal->Lx = (Fractal->Width - 1) / 2; + Fractal->Ly = (Fractal->Height - 1) / 2; + Fractal->Col = rand () % (width * height); /* modif by JeKo */ + + Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI); +} + + +/***************************************************************/ + +static inline void +Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y) +{ + F_PT xx, yy; + + xo = xo - Simi->Cx; + xo = (xo * Simi->R) >> FIX; /* / UNIT; */ + yo = yo - Simi->Cy; + yo = (yo * Simi->R) >> FIX; /* / UNIT; */ + + xx = xo - Simi->Cx; + xx = (xx * Simi->R2) >> FIX; /* / UNIT; */ + yy = -yo - Simi->Cy; + yy = (yy * Simi->R2) >> FIX; /* / UNIT; */ + + *x = + ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) + >> FIX /* / UNIT */ ) + Simi->Cx; + *y = + ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) + >> FIX /* / UNIT */ ) + Simi->Cy; +} + +/***************************************************************/ + +static void +Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData *data) +{ + F_PT x, y, i; + SIMI *Cur; + + Cur = data->Cur_F->Components; + for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) { + Transform (Cur, xo, yo, &x, &y); + + data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX+1) /* /(UNIT*2) */ ); + data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX+1) /* /(UNIT*2) */ ); + data->Buf++; + + data->Cur_Pt++; + + if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) { + F->Depth--; + Trace (F, x, y, data); + F->Depth++; + } + } +} + +static void +Draw_Fractal (IfsData *data) +{ + FRACTAL *F = data->Root; + int i, j; + F_PT x, y, xo, yo; + SIMI *Cur, *Simi; + + for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { + Cur->Cx = DBL_To_F_PT (Cur->c_x); + Cur->Cy = DBL_To_F_PT (Cur->c_y); + + Cur->Ct = DBL_To_F_PT (cos (Cur->A)); + Cur->St = DBL_To_F_PT (sin (Cur->A)); + Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2)); + Cur->St2 = DBL_To_F_PT (sin (Cur->A2)); + + Cur->R = DBL_To_F_PT (Cur->r); + Cur->R2 = DBL_To_F_PT (Cur->r2); + } + + + data->Cur_Pt = 0; + data->Cur_F = F; + data->Buf = F->Buffer2; + for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { + xo = Cur->Cx; + yo = Cur->Cy; + for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) { + if (Simi == Cur) + continue; + Transform (Simi, xo, yo, &x, &y); + Trace (F, x, y, data); + } + } + + /* Erase previous */ + + F->Cur_Pt = data->Cur_Pt; + data->Buf = F->Buffer1; + F->Buffer1 = F->Buffer2; + F->Buffer2 = data->Buf; +} + + +static IFSPoint * +draw_ifs (PluginInfo *goomInfo, int *nbpt, IfsData *data) +{ + int i; + DBL u, uu, v, vv, u0, u1, u2, u3; + SIMI *S, *S1, *S2, *S3, *S4; + FRACTAL *F; + + if (data->Root == NULL) + return NULL; + F = data->Root; + if (F->Buffer1 == NULL) + return NULL; + + u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; + uu = u * u; + v = 1.0 - u; + vv = v * v; + u0 = vv * v; + u1 = 3.0 * vv * u; + u2 = 3.0 * v * uu; + u3 = u * uu; + + S = F->Components; + S1 = S + F->Nb_Simi; + S2 = S1 + F->Nb_Simi; + S3 = S2 + F->Nb_Simi; + S4 = S3 + F->Nb_Simi; + + for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { + S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; + S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; + S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; + S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; + S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; + S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; + } + + Draw_Fractal (data); + + if (F->Count >= 1000 / F->Speed) { + S = F->Components; + S1 = S + F->Nb_Simi; + S2 = S1 + F->Nb_Simi; + S3 = S2 + F->Nb_Simi; + S4 = S3 + F->Nb_Simi; + + for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { + S2->c_x = 2.0 * S4->c_x - S3->c_x; + S2->c_y = 2.0 * S4->c_y - S3->c_y; + S2->r = 2.0 * S4->r - S3->r; + S2->r2 = 2.0 * S4->r2 - S3->r2; + S2->A = 2.0 * S4->A - S3->A; + S2->A2 = 2.0 * S4->A2 - S3->A2; + + *S1 = *S4; + } + Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); + + Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); + + F->Count = 0; + } + else + F->Count++; + + F->Col++; + + (*nbpt) = data->Cur_Pt; + return F->Buffer2; +} + + +/***************************************************************/ + +static void release_ifs (IfsData *data) +{ + if (data->Root != NULL) { + free_ifs (data->Root); + (void) free ((void *) data->Root); + data->Root = (FRACTAL *) NULL; + } +} + +#define RAND() goom_random(goomInfo->gRandom) + +static void ifs_update (PluginInfo *goomInfo, Pixel * data, Pixel * back, int increment, IfsData *fx_data) +{ + static int couleur = 0xc0c0c0c0; + static int v[4] = { 2, 4, 3, 2 }; + static int col[4] = { 2, 4, 3, 2 }; + +#define MOD_MER 0 +#define MOD_FEU 1 +#define MOD_MERVER 2 + static int mode = MOD_MERVER; + static int justChanged = 0; + static int cycle = 0; + int cycle10; + + int nbpt; + IFSPoint *points; + int i; + + int couleursl = couleur; + int width = goomInfo->screen.width; + int height = goomInfo->screen.height; + + cycle++; + if (cycle >= 80) + cycle = 0; + + if (cycle < 40) + cycle10 = cycle / 10; + else + cycle10 = 7 - cycle / 10; + + { + unsigned char *tmp = (unsigned char *) &couleursl; + + for (i = 0; i < 4; i++) { + *tmp = (*tmp) >> cycle10; + tmp++; + } + } + + points = draw_ifs (goomInfo, &nbpt, fx_data); + nbpt--; + +#ifdef HAVE_MMX + movd_m2r (couleursl, mm1); + punpckldq_r2r (mm1, mm1); + for (i = 0; i < nbpt; i += increment) { + int x = points[i].x; + int y = points[i].y; + + if ((x < width) && (y < height) && (x > 0) && (y > 0)) { + int pos = x + (y * width); + movd_m2r (back[pos], mm0); + paddusb_r2r (mm1, mm0); + movd_r2m (mm0, data[pos]); + } + } + emms();/*__asm__ __volatile__ ("emms");*/ +#else + for (i = 0; i < nbpt; i += increment) { + int x = (int) points[i].x & 0x7fffffff; + int y = (int) points[i].y & 0x7fffffff; + + if ((x < width) && (y < height)) { + int pos = x + (int) (y * width); + int tra = 0, i = 0; + unsigned char *bra = (unsigned char *) &back[pos]; + unsigned char *dra = (unsigned char *) &data[pos]; + unsigned char *cra = (unsigned char *) &couleursl; + + for (; i < 4; i++) { + tra = *cra; + tra += *bra; + if (tra > 255) + tra = 255; + *dra = tra; + ++dra; + ++cra; + ++bra; + } + } + } +#endif /*MMX*/ + justChanged--; + + col[ALPHA] = couleur >> (ALPHA * 8) & 0xff; + col[BLEU] = couleur >> (BLEU * 8) & 0xff; + col[VERT] = couleur >> (VERT * 8) & 0xff; + col[ROUGE] = couleur >> (ROUGE * 8) & 0xff; + + if (mode == MOD_MER) { + col[BLEU] += v[BLEU]; + if (col[BLEU] > 255) { + col[BLEU] = 255; + v[BLEU] = -(RAND() % 4) - 1; + } + if (col[BLEU] < 32) { + col[BLEU] = 32; + v[BLEU] = (RAND() % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND() % 3) - 2; + } + if (col[VERT] > col[BLEU]) { + col[VERT] = col[BLEU]; + v[VERT] = v[BLEU]; + } + if (col[VERT] < 32) { + col[VERT] = 32; + v[VERT] = (RAND() % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 64) { + col[ROUGE] = 64; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 0) { + col[ALPHA] = 0; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) + && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 3 ? MOD_FEU : MOD_MERVER; + justChanged = 250; + } + } + else if (mode == MOD_MERVER) { + col[BLEU] += v[BLEU]; + if (col[BLEU] > 128) { + col[BLEU] = 128; + v[BLEU] = -(RAND () % 4) - 1; + } + if (col[BLEU] < 16) { + col[BLEU] = 16; + v[BLEU] = (RAND () % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND () % 3) - 2; + } + if (col[VERT] > col[ALPHA]) { + col[VERT] = col[ALPHA]; + v[VERT] = v[ALPHA]; + } + if (col[VERT] < 32) { + col[VERT] = 32; + v[VERT] = (RAND () % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 128) { + col[ROUGE] = 128; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 255) { + col[ALPHA] = 255; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) + && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 3 ? MOD_FEU : MOD_MER; + justChanged = 250; + } + } + else if (mode == MOD_FEU) { + + col[BLEU] += v[BLEU]; + if (col[BLEU] > 64) { + col[BLEU] = 64; + v[BLEU] = -(RAND () % 4) - 1; + } + if (col[BLEU] < 0) { + col[BLEU] = 0; + v[BLEU] = (RAND () % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND () % 3) - 2; + } + if (col[VERT] > col[ROUGE] + 20) { + col[VERT] = col[ROUGE] + 20; + v[VERT] = -(RAND () % 3) - 2; + v[ROUGE] = (RAND () % 4) + 1; + v[BLEU] = (RAND () % 4) + 1; + } + if (col[VERT] < 0) { + col[VERT] = 0; + v[VERT] = (RAND () % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 255) { + col[ROUGE] = 255; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] > col[VERT] + 40) { + col[ROUGE] = col[VERT] + 40; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 0) { + col[ALPHA] = 0; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU]) + && (col[BLEU] > 32) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 2 ? MOD_MER : MOD_MERVER; + justChanged = 250; + } + } + + couleur = (col[ALPHA] << (ALPHA * 8)) + | (col[BLEU] << (BLEU * 8)) + | (col[VERT] << (VERT * 8)) + | (col[ROUGE] << (ROUGE * 8)); +} + +/** VISUAL_FX WRAPPER FOR IFS */ + +static void ifs_vfx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) { + + IfsData *data = (IfsData*)_this->fx_data; + if (!data->initalized) { + data->initalized = 1; + init_ifs(goomInfo, data); + } + ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data); + /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */ +} + +static void ifs_vfx_init(VisualFX *_this, PluginInfo *info) { + + IfsData *data = (IfsData*)malloc(sizeof(IfsData)); + data->Root = (FRACTAL*)NULL; + data->initalized = 0; + _this->fx_data = data; +} + +static void ifs_vfx_free(VisualFX *_this) { + IfsData *data = (IfsData*)_this->fx_data; + release_ifs(data); + free(data); +} + +VisualFX ifs_visualfx_create(void) { + VisualFX vfx; + vfx.init = ifs_vfx_init; + vfx.free = ifs_vfx_free; + vfx.apply = ifs_vfx_apply; + return vfx; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ifs.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ifs.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ifs.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ifs.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,27 @@ +/* + * File created 11 april 2002 by JeKo + */ + +#ifndef IFS_H +#define IFS_H + +#include "goom_config.h" +#include "goom_graphic.h" +#include "goom_plugin_info.h" +#include "goom_visual_fx.h" + +VisualFX ifs_visualfx_create(void); + +/* init ifs for a (width)x(height) output. * / +void init_ifs (PluginInfo *goomInfo, int width, int height); + +/ * draw an ifs on the buffer (which size is width * height) + increment means that we draw 1/increment of the ifs's points * / +void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment); + +/ * free all ifs's data. * / +void release_ifs (void); +*/ + + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_test.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_test.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_test.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_test.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,38 @@ +#include "jitc_x86.h" +#include + +int main(int c, char **v) +{ + int i; + int j; + JitcX86Env *jitc = jitc_x86_env_new(0xffff); + JitcFunc func = jitc_prepare_func(jitc); + + jitc_add(jitc, "mov edx, $d", 0xffffffff); + jitc_add(jitc, "mov eax, $d", 40); + jitc_add(jitc, "mov ebx, $d", 2); + jitc_add(jitc, "idiv ebx"); + jitc_add(jitc, "mov eax, [$d]", 0xdeadbeaf); + + jitc_add(jitc, "sal edx, $d", 7); + jitc_add(jitc, "imul ecx"); + jitc_add(jitc, "idiv ecx"); + jitc_add(jitc, "imul $d[ecx]", 2); + jitc_add(jitc, "imul ecx, [ecx]"); + jitc_add(jitc, "mov ecx, $d", (char*)(&i)-12); + jitc_add(jitc, "dec $d[ecx]", 2); + jitc_add(jitc, "add ecx, $d", 12); + jitc_add(jitc, "dec [ecx]"); + jitc_add(jitc, "dec ecx"); + + JITC_FLD_pIMM32(jitc,&i); + JITC_FSTP_pIMM32(jitc,&j); + + jitc_validate_func(jitc); + func(); + + printf("i = 0x%08x\n", i); + + jitc_x86_delete(jitc); + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_x86.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_x86.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_x86.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_x86.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,530 @@ +#include "jitc_x86.h" + +#include +#include +#include + +#define PARAM_INT 1 +#define PARAM_FLOAT 2 +#define PARAM_REG 3 +#define PARAM_dispREG 4 +#define PARAM_DISP32 5 +#define PARAM_LABEL 6 +#define PARAM_NONE 666 + +typedef struct { + int id; + int i; + double f; + int reg; + int disp; + char label[256]; +} IParam; + +struct { + char *name; + int reg; +} RegsName[] = { + {"eax",EAX}, {"ebx",EBX}, {"ecx",ECX}, {"edx",EDX}, + {"edi",EDI}, {"esi",ESI}, {"ebp",EBP}, {"esp",ESP}, + {"st0",0}, {"st1",1}, {"st2",2}, {"st3",3}, + {"st4",4}, {"st5",5}, {"st6",6}, {"st7",7}, + {"mm0",0}, {"mm1",1}, {"mm2",2}, {"mm3",3}, + {"mm4",4}, {"mm5",5}, {"mm6",6}, {"mm7",7}, {NULL,0} +}; + +void modrm(JitcX86Env *jitc, int opcode, IParam *iparam) +{ + int dest = 0; + int src = 1; + int direction = 0x0; + unsigned int byte = 666; + unsigned int int32 = 0; + unsigned int need32 = 0; + + if ((iparam[0].id == PARAM_REG) && (iparam[1].id != PARAM_REG)) { + dest = 1; + src = 0; + direction = 0x02; + } + + if (iparam[src].id != PARAM_REG) { + fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); + exit(1); + } + + if (iparam[dest].id == PARAM_REG) { + byte = ((int)JITC_MOD_REG_REG << 6) | (iparam[src].reg << 3) | (iparam[0].reg); + } + + else if (iparam[dest].id == PARAM_dispREG) + { + if (iparam[dest].disp == 0) + byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | (iparam[dest].reg); + } + + else if (iparam[dest].id == PARAM_DISP32) + { + byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | JITC_RM_DISP32; + need32 = 1; + int32 = iparam[dest].disp; + } + + if (byte == 666) { + fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); + exit(1); + } + else { + if (opcode < 0x100) + JITC_ADD_UCHAR(jitc, opcode + direction); + else { + JITC_ADD_UCHAR(jitc, (opcode>>8)&0xff); + JITC_ADD_UCHAR(jitc, (opcode&0xff)/* + direction*/); + } + JITC_ADD_UCHAR(jitc, byte); + if (need32) + JITC_ADD_UINT(jitc, int32); + } +} + +static void imul_like_modrm_1param(JitcX86Env *jitc, int opcode, int digit, IParam *iparam) +{ + if (iparam[0].id == PARAM_REG) + { + JITC_ADD_UCHAR(jitc, opcode); + JITC_MODRM(jitc, 0x03, digit, iparam[0].reg); + return; + } + if (iparam[0].id == PARAM_dispREG) { + JITC_ADD_UCHAR(jitc, opcode); + if (iparam[0].disp == 0) + { + JITC_MODRM(jitc, 0x00, digit, iparam[0].reg); + } + else if ((iparam[0].disp & 0xff) == iparam[0].disp) + { + JITC_MODRM(jitc, 0x01, digit, iparam[0].reg); + JITC_ADD_UCHAR(jitc, iparam[0].disp); + } + else + { + JITC_MODRM(jitc, 0x02, digit, iparam[0].reg); + JITC_ADD_UINT(jitc, iparam[0].disp); + } + return; + } + if (iparam[0].id == PARAM_DISP32) { + JITC_ADD_UCHAR(jitc, opcode); + JITC_MODRM(jitc, JITC_MOD_pREG_REG, digit, JITC_RM_DISP32); + JITC_ADD_UINT(jitc, iparam[0].disp); + return; + } +} + +/* 1 byte encoded opcode including register... imm32 parameter */ +#define INSTR_1bReg_IMM32(opcode,dest,src) { \ + JITC_ADD_UCHAR(jitc, opcode + iparam[dest].reg); \ + JITC_ADD_UINT (jitc, (int)iparam[src].i); } + +typedef struct { + char *name; + int opcode; + int opcode_reg_int; + int digit_reg_int; + int opcode_eax_int; +} AddLikeInstr; + +static AddLikeInstr addLike[] = { + { "add", 0x01, 0x81, 0x00, 0x05 }, + { "and", 0x21, 0x81, 0x04, 0x25 }, + { "or", 0x0B, 0x81, 0x01, 0x0D }, + { "cmp", 0x39, 0x81, 0x07, 0x3D }, + { "imul", 0x0FAF, 0x69, 0x00, 0x10000 }, + { "sub", 0x29, 0x81, 0x05, 0X2D }, + { NULL, -1, -1, -1, -1 } +}; + +int checkAddLike(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +{ + int i; + for (i=0;addLike[i].name;++i) + { + if (strcmp(op,addLike[i].name) == 0) + { + if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { + if ((iparam[0].reg == EAX) && (addLike[i].opcode_eax_int != 0x10000)) { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_eax_int); + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + else { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); + JITC_MODRM(jitc, 0x03, addLike[i].digit_reg_int, iparam[0].reg); + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + } + else if ((iparam[0].id == PARAM_dispREG) && (iparam[1].id == PARAM_INT)) { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); + if ((iparam[0].disp & 0xff) == iparam[0].disp) + { + JITC_MODRM(jitc, 0x01, addLike[i].digit_reg_int, iparam[0].reg); + JITC_ADD_UCHAR(jitc, iparam[0].disp); + } + else + { + JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, iparam[0].reg); + JITC_ADD_UINT(jitc, iparam[0].disp); + } + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); + JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, 0x05); + JITC_ADD_UINT(jitc, iparam[0].disp); + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + else { + modrm(jitc, addLike[i].opcode, iparam); + return 1; + } + } + } + return 0; +} + +/** + * Check all kind of known instruction... perform special optimisations.. + */ +static void jitc_add_op(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +{ + /* MOV */ + if (strcmp(op,"mov") == 0) + { + if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { + INSTR_1bReg_IMM32(0xb8,0,1); + } + else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { + JITC_ADD_UCHAR(jitc, 0xc7); + JITC_MODRM(jitc, 0x00, 0x00, 0x05); + JITC_ADD_UINT(jitc, iparam[0].disp); + JITC_ADD_UINT(jitc, iparam[1].i); + } + else + modrm(jitc, 0x89, iparam); + return; + } + +#define IMUL_LIKE(_OP,_opcode,_digit)\ + if (strcmp(op, _OP) == 0) { \ + if (nbParams == 1) { \ + imul_like_modrm_1param(jitc, _opcode, _digit, iparam); \ + return; }} + +#define SHIFT_LIKE(_name,_op1,_op2,_digit) \ + if (strcmp(op, _name) == 0) { \ + if (iparam[1].id == PARAM_INT) { \ + if (iparam[1].i == 1) \ + imul_like_modrm_1param(jitc, _op1, _digit, iparam); \ + else { \ + imul_like_modrm_1param(jitc, _op2, _digit, iparam); \ + JITC_ADD_UCHAR(jitc, iparam[1].i); \ + } \ + return; \ + } \ + } + +#define POP_LIKE(_OP,_opcode) \ + if (strcmp(op, _OP) == 0) { \ + if (iparam[0].id == PARAM_REG) { \ + JITC_ADD_UCHAR(jitc, _opcode + iparam[0].reg); \ + return; } } + + IMUL_LIKE("neg", 0xf7, 0x03); + IMUL_LIKE("imul", 0xf7, 0x05); + IMUL_LIKE("idiv", 0xf7, 0x07); + + POP_LIKE("pop", 0x58); + POP_LIKE("push", 0x50); + + SHIFT_LIKE("sal", 0xd1, 0xc1, 0x04); + SHIFT_LIKE("sar", 0xd1, 0xc1, 0x07); + SHIFT_LIKE("shl", 0xd1, 0xc1, 0x04); + SHIFT_LIKE("shr", 0xd1, 0xc1, 0x05); + + /* INC */ + if (strcmp(op, "inc") == 0) { + if (iparam[0].id == PARAM_REG) { + JITC_ADD_UCHAR(jitc, 0x40 + iparam[0].reg); + return; + } + imul_like_modrm_1param(jitc, 0xff, 0x00, iparam); + return; + } + + /* DEC */ + if (strcmp(op, "dec") == 0) { + if (iparam[0].id == PARAM_REG) { + JITC_ADD_UCHAR(jitc, 0x48 + iparam[0].reg); + return; + } + imul_like_modrm_1param(jitc, 0xff, 0x01, iparam); + return; + } + + if (strcmp(op, "call") == 0) + { + if (iparam[0].id == PARAM_LABEL) { + jitc_add_used_label(jitc,iparam[0].label,jitc->used+1); + JITC_CALL(jitc,0); + return; + } + if (iparam[0].id == PARAM_INT) { + JITC_CALL(jitc,iparam[0].i); + return; + } + if (iparam[0].id == PARAM_dispREG) { + JITC_ADD_UCHAR(jitc,0xff); + JITC_ADD_UCHAR(jitc,0xd0+iparam[0].reg); + return; + } + } + +#define MONOBYTE_INSTR(_OP,_opcode) \ + if (strcmp(op, _OP) == 0) { \ + JITC_ADD_UCHAR(jitc, _opcode); \ + return; } + + MONOBYTE_INSTR("ret", 0xc3); + MONOBYTE_INSTR("leave", 0xc9); + MONOBYTE_INSTR("cdq", 0x99); + + /* JNE */ + if (strcmp(op, "jne") == 0) { + if (iparam[0].id == PARAM_LABEL) { + JITC_JUMP_COND_LABEL(jitc,COND_NOT_EQUAL,iparam[0].label); + return; + } + if (iparam[0].id == PARAM_INT) { + JITC_JUMP_COND(jitc,COND_NOT_EQUAL,iparam[0].i); + return; + } + } + + /* JE */ + if (strcmp(op, "je") == 0) { + if (iparam[0].id == PARAM_LABEL) { + JITC_JUMP_COND_LABEL(jitc,COND_EQUAL,iparam[0].label); + return; + } + if (iparam[0].id == PARAM_INT) { + JITC_JUMP_COND(jitc,COND_EQUAL,iparam[0].i); + return; + } + } + + /* ADD LIKE */ + if (checkAddLike(jitc, op, iparam, nbParams)) return; + + /* BSWAP : 0F C8+rd */ + + fprintf(stderr, "JITC_x86: Invalid Operation '%s'\n", op); + exit(1); +} + +/** + * Adds a new instruction to the just in time compiled function + */ +void jitc_add(JitcX86Env *jitc, const char *_instr, ...) +{ + char instr[256]; + char *op; + char *sparam[16]; int nbParam=0; int i; + IParam iparam[16]; + va_list ap; + strcpy(instr,_instr); + +#ifdef DISPLAY_GENCODE + printf("|"); +#endif + + op = strtok(instr, " ,"); + if (!op) return; + + /* decoupage en tokens */ + while ((sparam[nbParam] = strtok(NULL, " ,")) != NULL) if (strlen(sparam[nbParam])>0) nbParam++; + + /* Reconnaissance des parametres */ + va_start(ap, _instr); + for (i=0;i 0) { + if (strcmp(regname, RegsName[r].name) == 0) { + iparam[i].id = PARAM_dispREG; + iparam[i].reg = RegsName[r].reg; + iparam[i].disp = va_arg(ap, int); + } + } + if (sscanf(sparam[i], "[%3s]", regname) > 0) { + if (strcmp(regname, RegsName[r].name) == 0) { + iparam[i].id = PARAM_dispREG; + iparam[i].reg = RegsName[r].reg; + iparam[i].disp = 0; + } + } + } + } + if (iparam[i].id == PARAM_NONE) { + fprintf(stderr, "JITC_x86: Unrecognized parameter '%s'\n", sparam[i]); + exit(1); + } + } + va_end(ap); + + jitc_add_op(jitc, op, &(iparam[0]), nbParam); +#ifdef DISPLAY_GENCODE + printf(" ;;; %s", op); + for (i=0;i_memory = (unsigned char*)malloc(memory_size); + jitc->used = 0; + jitc->memory = (unsigned char*)((int)jitc->_memory + (32-((int)jitc->_memory)%32)%32); + + jitc->nbUsedLabel = 0; + jitc->nbKnownLabel = 0; + + jitc->usedLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); + jitc->knownLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); + + return jitc; +} + +void jitc_x86_delete(JitcX86Env *jitc) { + + free(jitc->usedLabel); + free(jitc->knownLabel); + free(jitc->_memory); + free(jitc); +} + +JitcFunc jitc_prepare_func(JitcX86Env *jitc) { + + JitcFunc ptr = 0; + jitc->used = (32 - jitc->used%32)%32; + ptr = (JitcFunc)&(jitc->memory[jitc->used]); + +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); + printf("-- Function Intro --\n"); + printf("------------------------------------------\n"); +#endif + + /* save the state */ + jitc_add(jitc,"push ebp"); + jitc_add(jitc,"mov ebp, esp"); + jitc_add(jitc,"sub esp, $d", 8); + JITC_PUSH_ALL(jitc); +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); +#endif + return ptr; +} + +void jitc_validate_func(JitcX86Env *jitc) { + +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); + printf("-- Function Outro --\n"); + printf("------------------------------------------\n"); +#endif + /* restore the state */ + JITC_POP_ALL(jitc); + jitc_add(jitc, "leave"); + jitc_add(jitc, "ret"); + jitc_resolve_labels(jitc); +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); +#endif +} + +void jitc_add_used_label(JitcX86Env *jitc, char *label, int where) { + + strncpy(jitc->usedLabel[jitc->nbUsedLabel].label, label, JITC_LABEL_SIZE); + jitc->usedLabel[jitc->nbUsedLabel].address = where; + jitc->nbUsedLabel++; +} + +void jitc_add_known_label(JitcX86Env *jitc, char *label, int where) { + +#ifdef DISPLAY_GENCODE + printf("%s:\n", label); +#endif + strncpy(jitc->knownLabel[jitc->nbKnownLabel].label, label, JITC_LABEL_SIZE); + jitc->knownLabel[jitc->nbKnownLabel].address = where; + jitc->nbKnownLabel++; +} + +void jitc_resolve_labels(JitcX86Env *jitc) { + + int i,j; + for (i=jitc->nbUsedLabel;i-->0;) { + + LabelAddr used = jitc->usedLabel[i]; + for (j=jitc->nbKnownLabel;j-->0;) { + + LabelAddr known = jitc->knownLabel[j]; + if (strcmp(known.label, used.label) == 0) { + int *offset = (int*)&(jitc->memory[used.address]); + *offset = known.address - used.address - 4; /* always using long offset */ + break; + } + } + } + jitc->nbUsedLabel = jitc->nbKnownLabel = 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_x86.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_x86.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_x86.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/jitc_x86.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,214 @@ +/** + * Copyright (c)2004 Jean-Christophe Hoelt + */ + +#include +#include + +#define JITC_MAXLABEL 1024 +#define JITC_LABEL_SIZE 64 + +/** + * low level macros + */ + + /* {{{ Registres Generaux */ +#define EAX 0 +#define ECX 1 +#define EDX 2 +#define EBX 3 +#define ESP 4 +#define EBP 5 +#define ESI 6 +#define EDI 7 + /* }}} */ + /* {{{ Registres MMX */ +#define MM0 0 +#define MM1 1 +#define MM2 2 +#define MM3 3 +#define MM4 4 +#define MM5 5 +#define MM6 6 +#define MM7 7 + /* }}} */ + /* {{{ Registres SSE*/ +#define XMM0 0 +#define XMM1 1 +#define XMM2 2 +#define XMM3 3 +#define XMM4 4 +#define XMM5 5 +#define XMM6 6 +#define XMM7 7 + /* }}} */ + /* {{{ Alias aux registres */ +#define R0 0 +#define R1 1 +#define R2 2 +#define R3 3 +#define R4 4 +#define R5 5 +#define R6 6 +#define R7 7 + /* }}} */ + + /* {{{ Conditions */ +#define COND_OVERFLOW 0 +#define COND_NO_OVERFLOW 1 +#define COND_BELOW 2 +#define COND_NOT_BELOW 3 +#define COND_EQUAL 4 +#define COND_ZERO 4 +#define COND_NOT_EQUAL 5 +#define COND_NOT_ZERO 5 +#define COND_NOT_ABOVE 6 +#define COND_ABOVE 7 +#define COND_SIGN 8 +#define COND_NOT_SIGN 9 +#define COND_EVEN 10 +#define COND_ODD 11 +#define COND_LESS_THAN 12 +#define COND_GREATER_EQUAL 13 +#define COND_LESS_EQUAL 14 +#define COND_GREATER_THAN 15 + /* }}} */ + +typedef int (*JitcFunc)(void); + +typedef struct _LABEL_ADDR { + char label[JITC_LABEL_SIZE]; + int address; +} LabelAddr; + +typedef struct _JITC_X86_ENV { + unsigned char *_memory; + unsigned char *memory; + unsigned int used; + + int nbUsedLabel; + int nbKnownLabel; + LabelAddr *usedLabel; + LabelAddr *knownLabel; +} JitcX86Env; + +#define DISPLAY_GENCODE +/*#define DISPLAY_GENCODE_HEXA*/ + +#ifdef DISPLAY_GENCODE_HEXA + #define JITC_ADD_UCHAR(jitc,op) printf(" 0x%02x", op) && (jitc->memory[jitc->used++]=op) +#else + #define JITC_ADD_UCHAR(jitc,op) (jitc->memory[jitc->used++]=op) +#endif + +#define JITC_ADD_USHORT(jitc,i) { JITC_ADD_UCHAR(jitc,i&0xff); JITC_ADD_UCHAR(jitc,(i>>8)&0xff); } +#define JITC_ADD_UINT(jitc,i) { \ + JITC_ADD_UCHAR(jitc,i&0xff); \ + JITC_ADD_UCHAR(jitc,(i>>8)&0xff); \ + JITC_ADD_UCHAR(jitc,(i>>16)&0xff); \ + JITC_ADD_UCHAR(jitc,(i>>24)&0xff); \ +} +#define JITC_ADD_2UCHAR(jitc,op1,op2) {JITC_ADD_UCHAR(jitc,op1); JITC_ADD_UCHAR(jitc,op2);} + +#define JITC_MODRM(jitc,mod,reg,rm) { JITC_ADD_UCHAR(jitc,((int)mod<<6)|((int)reg<<3)|((int)rm)); } + +/* special values for R/M */ +#define JITC_RM_DISP32 0x05 + +#define JITC_MOD_pREG_REG 0x00 +#define JITC_MOD_disp8REG_REG 0x01 +#define JITC_MOD_disp32REG_REG 0x02 +#define JITC_MOD_REG_REG 0x03 +/* cf 24319101 p.27 */ + +#define JITC_OP_REG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,0xc0+(src<<3)+dest); } +#define JITC_OP_REG_pREG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(dest<<3)+src); } +#define JITC_OP_pREG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(src<<3)+dest); } + +/** + * "high" level macro + */ + +#define JITC_LOAD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0xb8+reg); JITC_ADD_UINT(jitc,(int)(imm32)); } +#define JITC_LOAD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x89,dest,src); } + +#define JITC_LOAD_REG_pREG(jitc,dest,src) { JITC_OP_REG_pREG(jitc,0x8b,dest,src); } +#define JITC_LOAD_pREG_REG(jitc,dest,src) { JITC_OP_pREG_REG(jitc,0x89,dest,src); } + +#define JITC_DEC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x48+reg); } +#define JITC_INC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x40+reg); } + +#define JITC_ADD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x01,dest,src); } +#define JITC_ADD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0x81);\ + JITC_ADD_UCHAR (jitc,0xc0+reg);\ + JITC_ADD_UINT (jitc,(int)imm32); } + +#define JITC_AND_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x21,dest,src); } +#define JITC_CMP_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x39,dest,src); } +#define JITC_CMP_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81,0xf8+reg); \ + JITC_ADD_UINT (jitc,(int)imm32); } + +#define JITC_IDIV_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xf8+reg); } +#define JITC_IMUL_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xe8+reg); } + +/*#define JITC_SUB_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x29,dest,src); } +#define JITC_SUB_EAX_IMM32(jitc,imm32) { JITC_ADD_UCHAR (jitc,0x2d); JITC_ADD_UINT(jitc,(int)imm32); } +#define JITC_SUB_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81, 0xe8+reg);\ + JITC_ADD_UINT (jitc,(int)imm32); }*/ +#define JITC_SUB_REG_IMM8(jitc,reg,imm8) { JITC_ADD_2UCHAR (jitc,0x83, 0xe8+reg);\ + JITC_ADD_UCHAR(jitc,imm8); } + +/* Floating points */ + +#define JITC_FLD_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ + JITC_MODRM (jitc, 0x00, 0x00,JITC_RM_DISP32); \ + JITC_ADD_UINT(jitc,(int)(address)); } +#define JITC_FLD_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xD9, 0xC0+reg); } + +#define JITC_FST_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ + JITC_MODRM (jitc, 0x00, 0x02,JITC_RM_DISP32); \ + JITC_ADD_UINT(jitc,(int)(ADDRess)); } +#define JITC_FST_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD0+reg); } + +#define JITC_FSTP_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ + JITC_MODRM (jitc, 0x00, 0x03, JITC_RM_DISP32); \ + JITC_ADD_UINT(jitc,(int)(address)); } +#define JITC_FSTP_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD8+reg); } + +#define JITC_FADD + +/* Jumps */ + +#define JITC_ADD_LABEL(jitc,label) { jitc_add_known_label(jitc,label,jitc->used); } + +#define JITC_JUMP(jitc,offset) { JITC_ADD_UCHAR(jitc,0xe9); JITC_ADD_UINT(jitc,offset); } +#define JITC_JUMP_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_JUMP(jitc,0); } +#define JITC_JUMP_COND(jitc,cond,offset) { JITC_ADD_UCHAR(jitc,0x0f);\ + JITC_ADD_UCHAR(jitc,0x80+cond);\ + JITC_ADD_UINT(jitc,offset); } +#define JITC_JUMP_COND_LABEL(jitc,cond,label) { jitc_add_used_label(jitc,label,jitc->used+2); JITC_JUMP_COND(jitc,cond,0); } +#define JITC_CALL(jitc,function) { int __offset__ = (int)function - (int)(&jitc->memory[jitc->used+5]);\ + JITC_ADD_UCHAR(jitc,0xe8); JITC_ADD_UINT(jitc,__offset__); } +/*#define JITC_CALL_pREG(jitc,reg) { JITC_ADD_UCHAR(jitc,0xff); JITC_ADD_UCHAR(jitc,0xd0+reg); } +#define JITC_CALL_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_CALL(jitc,0); }*/ + +/* save all registers (except EAX,ESP,EBP) */ +#define JITC_PUSH_ALL(jitc) { jitc_add(jitc,"push ecx"); jitc_add(jitc,"push edx"); jitc_add(jitc,"push ebx"); \ + jitc_add(jitc,"push esi"); jitc_add(jitc,"push edi"); } + +/* restore all registers (except EAX,ESP,EBP) */ +#define JITC_POP_ALL(jitc) { jitc_add(jitc,"pop edi"); jitc_add(jitc,"pop esi"); jitc_add(jitc,"pop ebx"); \ + jitc_add(jitc,"pop edx"); jitc_add(jitc,"pop ecx"); } + +/* public methods */ +JitcX86Env *jitc_x86_env_new(int memory_size); +JitcFunc jitc_prepare_func(JitcX86Env *jitc); +void jitc_add(JitcX86Env *jitc, const char *instr, ...); +void jitc_validate_func(JitcX86Env *jitc); +void jitc_x86_delete(JitcX86Env *jitc); + + +/* private methods */ +void jitc_add_used_label(JitcX86Env *jitc, char *label, int where); +void jitc_add_known_label(JitcX86Env *jitc, char *label, int where); +void jitc_resolve_labels(JitcX86Env *jitc); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/lines.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/lines.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/lines.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/lines.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,239 @@ +/* + * lines.c + */ + +#include "lines.h" +#include +#include +#include +#include "goom_tools.h" +#include "drawmethods.h" +#include "goom_plugin_info.h" + +static inline unsigned char lighten (unsigned char value, float power) +{ + int val = value; + float t = (float) val * log10(power) / 2.0; + + if (t > 0) { + val = (int) t; /* (32.0f * log (t)); */ + if (val > 255) + val = 255; + if (val < 0) + val = 0; + return val; + } + else { + return 0; + } +} + +static void lightencolor (guint32 *col, float power) +{ + unsigned char *color; + + color = (unsigned char *) col; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); +} + + + +static void +genline (int id, float param, GMUnitPointer * l, int rx, int ry) +{ + int i; + + switch (id) { + case GML_HLINE: + for (i = 0; i < 512; i++) { + l[i].x = ((float) i * rx) / 512.0f; + l[i].y = param; + l[i].angle = M_PI / 2.0f; + } + return; + case GML_VLINE: + for (i = 0; i < 512; i++) { + l[i].y = ((float) i * ry) / 512.0f; + l[i].x = param; + l[i].angle = 0.0f; + } + return; + case GML_CIRCLE: + for (i = 0; i < 512; i++) { + float cosa, sina; + + l[i].angle = 2.0f * M_PI * (float) i / 512.0f; + cosa = param * cos (l[i].angle); + sina = param * sin (l[i].angle); + l[i].x = ((float) rx / 2.0f) + cosa; + l[i].y = (float) ry / 2.0f + sina; + } + return; + } +} + +static guint32 getcouleur (int mode) +{ + switch (mode) { + case GML_RED: + return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8)); + case GML_ORANGE_J: + return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8)); + case GML_ORANGE_V: + return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8)); + case GML_BLEUBLANC: + return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8)); + case GML_VERT: + return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8)); + case GML_BLEU: + return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8)); + case GML_BLACK: + return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8)); + } + return 0; +} + +void +goom_lines_set_res (GMLine * gml, int rx, int ry) +{ + if (gml != NULL) { + gml->screenX = rx; + gml->screenY = ry; + + genline (gml->IDdest, gml->param, gml->points2, rx, ry); + } +} + + +static void +goom_lines_move (GMLine * l) +{ + int i; + unsigned char *c1, *c2; + + for (i = 0; i < 512; i++) { + l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f; + l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f; + l->points[i].angle = + (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f; + } + + c1 = (unsigned char *) &l->color; + c2 = (unsigned char *) &l->color2; + for (i = 0; i < 4; i++) { + int cc1, cc2; + + cc1 = *c1; + cc2 = *c2; + *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6); + ++c1; + ++c2; + } + + l->power += l->powinc; + if (l->power < 1.1f) { + l->power = 1.1f; + l->powinc = (float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; + } + if (l->power > 17.5f) { + l->power = 17.5f; + l->powinc = -(float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; + } + + l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f; +} + +void +goom_lines_switch_to (GMLine * gml, int IDdest, + float param, float amplitude, int col) +{ + genline (IDdest, param, gml->points2, gml->screenX, gml->screenY); + gml->IDdest = IDdest; + gml->param = param; + gml->amplitudeF = amplitude; + gml->color2 = getcouleur (col); +} + +GMLine * +goom_lines_init (PluginInfo *goomInfo, int rx, int ry, + int IDsrc, float paramS, int coulS, + int IDdest, float paramD, int coulD) +{ + GMLine *l = (GMLine *) malloc (sizeof (GMLine)); + + l->goomInfo = goomInfo; + + l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); + l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); + l->nbPoints = 512; + + l->IDdest = IDdest; + l->param = paramD; + + l->amplitude = l->amplitudeF = 1.0f; + + genline (IDsrc, paramS, l->points, rx, ry); + genline (IDdest, paramD, l->points2, rx, ry); + + l->color = getcouleur (coulS); + l->color2 = getcouleur (coulD); + + l->screenX = rx; + l->screenY = ry; + + l->power = 0.0f; + l->powinc = 0.01f; + + goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD); + + return l; +} + +void +goom_lines_free (GMLine ** l) +{ + free ((*l)->points); + free ((*l)->points2); + free (*l); + l = NULL; +} + +void goom_lines_draw (PluginInfo *plug, GMLine * line, gint16 data[512], Pixel *p) +{ + if (line != NULL) { + int i, x1, y1; + guint32 color = line->color; + GMUnitPointer *pt = &(line->points[0]); + + float cosa = cos (pt->angle) / 1000.0f; + float sina = sin (pt->angle) / 1000.0f; + + lightencolor (&color, line->power); + + x1 = (int) (pt->x + cosa * line->amplitude * data[0]); + y1 = (int) (pt->y + sina * line->amplitude * data[0]); + + for (i = 1; i < 512; i++) { + int x2, y2; + GMUnitPointer *pt = &(line->points[i]); + + float cosa = cos (pt->angle) / 1000.0f; + float sina = sin (pt->angle) / 1000.0f; + + x2 = (int) (pt->x + cosa * line->amplitude * data[i]); + y2 = (int) (pt->y + sina * line->amplitude * data[i]); + + plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, line->screenY); + + x1 = x2; + y1 = y2; + } + goom_lines_move (line); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/lines.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/lines.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/lines.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/lines.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,81 @@ +#ifndef _LINES_H +#define _LINES_H + +/* + * lines.h + * Goom + * Copyright (c) 2000-2003 iOS-software. All rights reserved. + */ + +#include "goom_typedefs.h" +#include "goom_graphic.h" +#include "goom_config.h" + +struct _GMUNITPOINTER +{ + float x; + float y; + float angle; +}; + +/* tableau de points */ +struct _GMLINE +{ + + GMUnitPointer *points; + GMUnitPointer *points2; + int IDdest; + float param; + float amplitudeF; + float amplitude; + + int nbPoints; + guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */ + guint32 color2; + + int screenX; + int screenY; + + float power; + float powinc; + + PluginInfo *goomInfo; +}; + +/* les ID possibles */ + +#define GML_CIRCLE 0 +/* (param = radius) */ + +#define GML_HLINE 1 +/* (param = y) */ + +#define GML_VLINE 2 +/* (param = x) */ + +/* les modes couleur possible (si tu mets un autre c'est noir) */ + +#define GML_BLEUBLANC 0 +#define GML_RED 1 +#define GML_ORANGE_V 2 +#define GML_ORANGE_J 3 +#define GML_VERT 4 +#define GML_BLEU 5 +#define GML_BLACK 6 + +/* construit un effet de line (une ligne horitontale pour commencer) */ +GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry, + int IDsrc, float paramS, int modeCoulSrc, + int IDdest, float paramD, int modeCoulDest); + +void goom_lines_switch_to (GMLine * gml, int IDdest, float param, + float amplitude, + int modeCoul); + +void goom_lines_set_res (GMLine * gml, int rx, int ry); + +void goom_lines_free (GMLine ** gml); + +void goom_lines_draw (PluginInfo *plugInfo, GMLine * gml, gint16 data[512], Pixel *p); + +#endif /* _LINES_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/Makefile.am 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,34 @@ +# libgoom2 + +if HAVE_MMX +MMX_FILES=mmx.c xmmx.c +else +MMX_FILES= +endif + +if HAVE_PPC +PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s +else +PPC_FILES= +endif + +goom2_lib_LTLIBRARIES = libgoom2.la +goom2_libdir = $(libdir) + +goom2_library_includedir=$(includedir)/goom +goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h +libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*" +libgoom2_la_SOURCES = \ + goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \ + goom_tools.c $(MMX_FILES) $(PPC_FILES) \ + config_param.c convolve_fx.c filters.c \ + flying_stars_fx.c gfontlib.c gfontrle.c \ + goom_core.c graphic.c ifs.c lines.c \ + mathtools.c sound_tester.c surf3d.c \ + tentacle3d.c plugin_info.c \ + v3d.c drawmethods.c \ + cpu_info.c + +AM_YFLAGS=-d + +noinst_HEADERS = mmx.h diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/mathtools.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/mathtools.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/mathtools.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/mathtools.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,84 @@ +/*---------------------------------------------------------------------------*/ +/* +** mathtools.c +** Goom Project +** +** Created by Jeko on Sun Jul 20 2003 + ** Copyright (c) 2003 iOS. All rights reserved. +*/ +/*---------------------------------------------------------------------------*/ + +#include "mathtools.h" + +float sin256[256] = { + 0,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 + ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 + ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 + ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 + ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 + ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 + ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 + ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 + ,1,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 + ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 + ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 + ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 + ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 + ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 + ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 + ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 + ,1.22465e-16,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 + ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 + ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 + ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 + ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 + ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 + ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 + ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 + ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 + ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 + ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 + ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 + ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 + ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 + ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 + ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 + +}; + +float cos256[256] = { + 0,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 + ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 + ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 + ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 + ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 + ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 + ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 + ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 + ,6.12323e-17,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 + ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 + ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 + ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 + ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 + ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 + ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 + ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 + ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 + ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 + ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 + ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 + ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 + ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 + ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 + ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 + ,-1.83697e-16,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 + ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 + ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 + ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 + ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 + ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 + ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 + ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 + +}; + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/mathtools.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/mathtools.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/mathtools.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/mathtools.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,36 @@ +#ifndef MATHTOOLS_H +#define MATHTOOLS_H + + +#define _double2fixmagic (68719476736.0*1.5) +/* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */ +#define _shiftamt 16 +/* 16.16 fixed point representation */ + +#if BigEndian_ +#define iexp_ 0 +#define iman_ 1 +#else +#define iexp_ 1 +#define iman_ 0 +#endif /* BigEndian_ */ + +/* TODO: this optimization is very efficient: put it again when all works +#ifdef HAVE_MMX +#define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;} +#else*/ +#define F2I(dbl,i) i=(int)dbl; +/*#endif*/ + +#if 0 +#define SINCOS(f,s,c) \ + __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f)) +#else +#define SINCOS(f,s,c) {s=sin(f);c=cos(f);} +#endif + +extern float sin256[256]; +extern float cos256[256]; + +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/mmx.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/mmx.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/mmx.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/mmx.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,275 @@ +#ifdef HAVE_MMX + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#include "mmx.h" +#include "goom_graphic.h" + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + +int mmx_supported (void) { + return (mm_support()&0x1); +} + +void zoom_filter_mmx (int prevX, int prevY, + Pixel *expix1, Pixel *expix2, + int *brutS, int *brutD, int buffratio, + int precalCoef[16][16]) +{ + unsigned int ax = (prevX-1)<> BUFFPOINTNB); + brutSmypos = brutS[myPos2]; + py = brutSmypos + (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB); + + if ((py>=ay) || (px>=ax)) { + pos=coeffs=0; + } + else { + pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); + // coef en modulo 15 + coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; + } + + __asm__ __volatile__ ( + "movd %2, %%mm6 \n\t" + + /* recuperation des deux premiers pixels dans mm0 et mm1 */ + "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ + "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ + "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */ + + "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */ + /* depackage du 2ieme pixel */ + "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */ + + /* extraction des coefficients... */ + "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + + "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ + "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ + + "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ + + "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */ + "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */ + "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */ + "paddw %%mm1, %%mm0 \n\t" + + /* ...extraction des 2 derniers coefficients */ + "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ + "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */ + "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */ + + /* ajouter la longueur de ligne a esi */ + "addl %4,%1 \n\t" + + /* recuperation des 2 derniers pixels */ + "movq (%3,%1,4), %%mm1 \n\t" + "movq %%mm1, %%mm2 \n\t" + + /* depackage des pixels */ + "punpcklbw %%mm7, %%mm1 \n\t" + "punpckhbw %%mm7, %%mm2 \n\t" + + /* multiplication pas les coeffs */ + "pmullw %%mm4, %%mm1 \n\t" + "pmullw %%mm5, %%mm2 \n\t" + + /* ajout des valeurs obtenues la valeur finale */ + "paddw %%mm1, %%mm0 \n\t" + "paddw %%mm2, %%mm0 \n\t" + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + "psrlw $8, %%mm0 \n\t" + "packuswb %%mm7, %%mm0 \n\t" + + "movd %%mm0,%0 \n\t" + :"=g"(expix2[loop]) + :"r"(pos),"r"(coeffs),"r"(expix1),"r"(prevX) + + ); + + emms(); + } +} + +#define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \ +{ \ + movd_m2r(_backbuf, mm0); \ + paddusb_m2r(_col, mm0); \ + movd_r2m(mm0, _out); \ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col) + +void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) + goto end_of_line; + + dx = x2 - x1; + dy = y2 - y1; + if (x1 >= x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } + else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + goto end_of_line; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + goto end_of_line; + } + } +end_of_line: + emms(); + /* __asm__ __volatile__ ("emms"); */ +} + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/mmx.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/mmx.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/mmx.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/mmx.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,729 @@ +/* mmx.h + + MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for mmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _MMX_H +#define _MMX_H + +#include "goom_graphic.h" + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ + + + +/* Function to test if multimedia instructions are supported... +*/ +static int +mm_support(void) +{ + /* Returns 1 if MMX instructions are supported, + 3 if Cyrix MMX and Extended MMX instructions are supported + 5 if AMD MMX and 3DNow! instructions are supported + 13 if AMD Extended MMX, &3dNow supported + 0 if hardware does not support any of these + */ + register int rval = 0; + + __asm__ __volatile__ ( + /* See if CPUID instruction is supported ... */ + /* ... Get copies of EFLAGS into eax and ecx */ + "pushl %%ebx\n\t" + "pushf\n\t" + "popl %%eax\n\t" + "movl %%eax, %%ecx\n\t" + + /* ... Toggle the ID bit in one copy and store */ + /* to the EFLAGS reg */ + "xorl $0x200000, %%eax\n\t" + "push %%eax\n\t" + "popf\n\t" + + /* ... Get the (hopefully modified) EFLAGS */ + "pushf\n\t" + "popl %%eax\n\t" + + /* ... Compare and test result */ + "xorl %%eax, %%ecx\n\t" + "testl $0x200000, %%ecx\n\t" + "jz NotSupported1\n\t" /* CPUID not supported */ + + + /* Get standard CPUID information, and + go to a specific vendor section */ + "movl $0, %%eax\n\t" + "cpuid\n\t" + + /* Check for Intel */ + "cmpl $0x756e6547, %%ebx\n\t" + "jne TryAMD\n\t" + "cmpl $0x49656e69, %%edx\n\t" + "jne TryAMD\n\t" + "cmpl $0x6c65746e, %%ecx\n" + "jne TryAMD\n\t" + "jmp Intel\n\t" + + /* Check for AMD */ + "\nTryAMD:\n\t" + "cmpl $0x68747541, %%ebx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x69746e65, %%edx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x444d4163, %%ecx\n" + "jne TryCyrix\n\t" + "jmp AMD\n\t" + + /* Check for Cyrix */ + "\nTryCyrix:\n\t" + "cmpl $0x69727943, %%ebx\n\t" + "jne NotSupported2\n\t" + "cmpl $0x736e4978, %%edx\n\t" + "jne NotSupported3\n\t" + "cmpl $0x64616574, %%ecx\n\t" + "jne NotSupported4\n\t" + /* Drop through to Cyrix... */ + + + /* Cyrix Section */ + /* See if extended CPUID level 80000001 is supported */ + /* The value of CPUID/80000001 for the 6x86MX is undefined + according to the Cyrix CPU Detection Guide (Preliminary + Rev. 1.01 table 1), so we'll check the value of eax for + CPUID/0 to see if standard CPUID level 2 is supported. + According to the table, the only CPU which supports level + 2 is also the only one which supports extended CPUID levels. + */ + "cmpl $0x2, %%eax\n\t" + "jne MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported (in theory), so get extended + features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%eax\n\t" /* Test for MMX */ + "jz NotSupported5\n\t" /* MMX not supported */ + "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ + "jnz EMMXSupported\n\t" + "movl $1, %0\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "EMMXSupported:\n\t" + "movl $3, %0\n\n\t" /* EMMX and MMX Supported */ + "jmp Return\n\t" + + + /* AMD Section */ + "AMD:\n\t" + + /* See if extended CPUID is supported */ + "movl $0x80000000, %%eax\n\t" + "cpuid\n\t" + "cmpl $0x80000000, %%eax\n\t" + "jl MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported, so get extended features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported6\n\t" /* MMX not supported */ + "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ + "jnz ThreeDNowSupported\n\t" + "movl $1, %0\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "ThreeDNowSupported:\n\t" + "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */ + "jnz AMDXMMXSupported\n\t" + "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */ + "jmp Return\n\t" + "AMDXMMXSupported:\n\t" + "movl $13, %0\n\n\t" /* XMMX, 3DNow! and MMX Supported */ + "jmp Return\n\t" + + + /* Intel Section */ + "Intel:\n\t" + + /* Check for MMX */ + "MMXtest:\n\t" + "movl $1, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported7\n\t" /* MMX Not supported */ + "movl $1, %0\n\n\t" /* MMX Supported */ + "jmp Return\n\t" + + /* Nothing supported */ + "\nNotSupported1:\n\t" + "#movl $101, %0\n\n\t" + "\nNotSupported2:\n\t" + "#movl $102, %0\n\n\t" + "\nNotSupported3:\n\t" + "#movl $103, %0\n\n\t" + "\nNotSupported4:\n\t" + "#movl $104, %0\n\n\t" + "\nNotSupported5:\n\t" + "#movl $105, %0\n\n\t" + "\nNotSupported6:\n\t" + "#movl $106, %0\n\n\t" + "\nNotSupported7:\n\t" + "#movl $107, %0\n\n\t" + "movl $0, %0\n\n\t" + + "Return:\n\t" + "popl %%ebx\n\t" + : "=X" (rval) + : /* no input */ + : "eax", "ecx", "edx" + ); + + /* Return */ + return(rval); +} + +/* Function to test if mmx instructions are supported... +*/ +static inline int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} + +int mmx_supported (void); +int xmmx_supported (void); + + +/* MMX optimized implementations */ +void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, + int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, + int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]); + + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef MMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "m" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=m" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=m" (memd) \ + : "m" (mems)); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "m" (mem)) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=m" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=m" (memd) \ + : "m" (mems)) + +#endif + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 2x32, 4x16, and 8x8 Parallel ADDs +*/ +#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) + +#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) + +#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +*/ +#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) + +#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +*/ +#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) + +#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel SUBs +*/ +#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) + +#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) + +#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +*/ +#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) + +#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +*/ +#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) + +#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) + + +/* 4x16 Parallel MULs giving Low 4x16 portions of results +*/ +#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results +*/ +#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) + + +/* 4x16->2x32 Parallel Mul-ADD + (muls like pmullw, then adds adjacent 16-bit fields + in the multiply result to make the final 2x32 result) +*/ +#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) + + +/* 1x64 bitwise AND +*/ +#ifdef BROKEN_PAND +#define pand_m2r(var, reg) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, reg); \ + mmx_m2r(pandn, var, reg); \ + } +#define pand_r2r(regs, regd) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, regd); \ + mmx_r2r(pandn, regs, regd) \ + } +#define pand(vars, vard) \ + { \ + movq_m2r(vard, mm0); \ + mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ + mmx_m2r(pandn, vars, mm0); \ + movq_r2m(mm0, vard); \ + } +#else +#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +#define pand(vars, vard) mmx_m2m(pand, vars, vard) +#endif + + +/* 1x64 bitwise AND with Not the destination +*/ +#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) + + +/* 1x64 bitwise OR +*/ +#define por_m2r(var, reg) mmx_m2r(por, var, reg) +#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +#define por(vars, vard) mmx_m2m(por, vars, vard) + + +/* 1x64 bitwise eXclusive OR +*/ +#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality + (resulting fields are either 0 or -1) +*/ +#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) + +#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) + +#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than + (resulting fields are either 0 or -1) +*/ +#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) + +#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) + +#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +*/ +#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) + +#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) + +#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +*/ +#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) + +#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) + +#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) + + +/* 2x32 and 4x16 Parallel Shift Right Arithmetic +*/ +#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) + +#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) + + +/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate + (packs source and dest fields into dest in that order) +*/ +#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) + +#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) + + +/* 4x16->8x8 PACK and Unsigned Saturate + (packs source and dest fields into dest in that order) +*/ +#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low + (interleaves low half of dest with low half of source + as padding in each result field) +*/ +#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) + +#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) + +#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High + (interleaves high half of dest with high half of source + as padding in each result field) +*/ +#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) + +#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) + +#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) + + +/* Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-mmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef MMX_TRACE + +#define emms() \ + { \ + printf("emms()\n"); \ + __asm__ __volatile__ ("emms" \ + "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \ + } + +#else + +#define emms() __asm__ __volatile__ ("emms"::: \ + "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)") + +#endif + +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/motif_goom1.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/motif_goom1.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/motif_goom1.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/motif_goom1.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1026 @@ +static Motif CONV_MOTIF1 = { + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0, + 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1, + 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3, + 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4, + 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7, + 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0, + 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9, + 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5, + 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10, + 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1, + 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15, + 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12, + 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1, + 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12, + 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15, + 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12, + 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2, + 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15, + 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15, + 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0, + 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15, + 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15, + 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1, + 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15, + 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15, + 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13, + 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15, + 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15, + 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15, + 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15, + 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15, + 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15, + 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11, + 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5, + 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15, + 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15, + 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1, + 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0, + 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15, + 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15, + 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11, + 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0, + 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15, + 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15, + 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12, + 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15, + 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7, + 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15, + 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14, + 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0, + 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15, + 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12, + 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4, + 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6, + 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14, + 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7, + 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4, + 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9, + 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9, + 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3, + 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15, + 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1, + 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4, + 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0, + 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15, + 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0, + 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0, + 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0, + 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15, + 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2, + 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0, + 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0, + 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15, + 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9, + 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15, + 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0, + 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0, + 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6, + 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12, + 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15, + 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0, + 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3, + 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0, + 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7, + 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15, + 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8, + 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9, + 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1, + 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0, + 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12, + 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7, + 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14, + 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15, + 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0, + 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9, + 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9, + 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15, + 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15, + 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4, + 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6, + 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1, + 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15, + 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14, + 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4, + 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0, + 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15, + 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15, + 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4, + 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2, + 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15, + 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6, + 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4, + 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15, + 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10, + 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2, + 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15, + 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12, + 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15, + 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10, + 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0, + 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15, + 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0, + 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15, + 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9, + 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0, + 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4, + 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15, + 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9, + 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2, + 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15, + 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15, + 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15, + 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12, + 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7, + 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15, + 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15, + 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15, + 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15, + 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5, + 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15, + 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15, + 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15, + 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0, + 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10, + 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15, + 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15, + 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6, + 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0, + 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15, + 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15, + 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4, + 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2, + 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1, + 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1, + 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3, + 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15, + 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10, + 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11, + 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4, + 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8, + 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0, + 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0, + 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15, + 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0, + 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5, + 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12, + 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4, + 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1, + 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14, + 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0, + 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4, + 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7, + 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4, + 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0, + 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15, + 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5, + 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2, + 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4, + 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7, + 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3, + 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9, + 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0, + 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15, + 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0, + 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3, + 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10, + 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 + }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/motif_goom2.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/motif_goom2.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/motif_goom2.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/motif_goom2.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1026 @@ +static Motif CONV_MOTIF2 = { + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5, + 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1, + 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10, + 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5, + 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11, + 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0, + 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11, + 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10, + 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15, + 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11, + 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15, + 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6, + 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11, + 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15, + 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0, + 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11, + 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15, + 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0, + 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0, + 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11, + 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9, + 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, + 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15, + 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14, + 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, + 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15, + 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13, + 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15, + 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15, + 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15, + 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15, + 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15, + 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15, + 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12, + 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15, + 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15, + 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3, + 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6, + 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15, + 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11, + 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0, + 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0, + 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0, + 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0, + 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0, + 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0, + 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0, + 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2, + 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3, + 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15, + 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12, + 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15, + 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15, + 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15, + 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, + 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15, + 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15, + 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15, + 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, + 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15, + 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15, + 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, + 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14, + 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15, + 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15, + 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, + 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13, + 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15, + 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15, + 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0, + 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11, + 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15, + 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15, + 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0, + 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8, + 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15, + 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15, + 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1, + 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0, + 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4, + 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8, + 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15, + 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0, + 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0, + 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1, + 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0, + 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15, + 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0, + 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0, + 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0, + 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0, + 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15, + 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0, + 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0, + 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0, + 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0, + 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15, + 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10, + 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0, + 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0, + 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15, + 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15, + 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13, + 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9, + 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15, + 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8, + 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5, + 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15, + 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13, + 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15, + 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12, + 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11, + 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15, + 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0, + 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5, + 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12, + 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15, + 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0, + 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9, + 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1, + 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13, + 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12, + 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4, + 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4, + 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15, + 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1, + 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1, + 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15, + 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15, + 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13, + 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1, + 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4, + 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15, + 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15, + 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5, + 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1, + 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11, + 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15, + 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13, + 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4, + 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4, + 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15, + 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0, + 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15, + 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4, + 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 + }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/plugin_info.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/plugin_info.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/plugin_info.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/plugin_info.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,202 @@ +#include "goom_plugin_info.h" +#include "goom_fx.h" +#include "cpu_info.h" +#include "default_scripts.h" +#include "drawmethods.h" +#include +#include + + +#ifdef CPU_POWERPC +#include +#include +#include "ppc_zoom_ultimate.h" +#include "ppc_drawings.h" +#endif /* CPU_POWERPC */ + + +#ifdef CPU_X86 +#include "mmx.h" +#endif /* CPU_X86 */ + + + +static void setOptimizedMethods(PluginInfo *p) { + + unsigned int cpuFlavour = cpu_flavour(); + + /* set default methods */ + p->methods.draw_line = draw_line; + p->methods.zoom_filter = zoom_filter_c; +/* p->methods.create_output_with_brightness = create_output_with_brightness;*/ + +#ifdef CPU_X86 + if (cpuFlavour & CPU_OPTION_XMMX) { +#ifdef VERBOSE + printf ("Extented MMX detected. Using the fastest methods !\n"); +#endif + p->methods.draw_line = draw_line_mmx; + p->methods.zoom_filter = zoom_filter_xmmx; + } + else if (cpuFlavour & CPU_OPTION_MMX) { +#ifdef VERBOSE + printf ("MMX detected. Using fast methods !\n"); +#endif + p->methods.draw_line = draw_line_mmx; + p->methods.zoom_filter = zoom_filter_mmx; + } +#ifdef VERBOSE + else + printf ("Too bad ! No SIMD optimization available for your CPU.\n"); +#endif +#endif /* CPU_X86 */ + +#ifdef CPU_POWERPC + + if ((cpuFlavour & CPU_OPTION_64_BITS) != 0) { +/* p->methods.create_output_with_brightness = ppc_brightness_G5; */ + p->methods.zoom_filter = ppc_zoom_generic; + } + else if ((cpuFlavour & CPU_OPTION_ALTIVEC) != 0) { +/* p->methods.create_output_with_brightness = ppc_brightness_G4; */ + p->methods.zoom_filter = ppc_zoom_G4; + } + else + { +/* p->methods.create_output_with_brightness = ppc_brightness_generic;*/ + p->methods.zoom_filter = ppc_zoom_generic; + } +#endif /* CPU_POWERPC */ + +} + +void plugin_info_init(PluginInfo *pp, int nbVisuals) { + + PluginInfo p; + int i; + + p.sound.speedvar = p.sound.accelvar = p.sound.totalgoom = 0; + p.sound.prov_max = 0; + p.sound.goom_limit = 1; + p.sound.allTimesMax = 1; + + p.sound.volume_p = secure_f_feedback("Sound Volume"); + p.sound.accel_p = secure_f_feedback("Sound Acceleration"); + p.sound.speed_p = secure_f_feedback("Sound Speed"); + p.sound.goom_limit_p = secure_f_feedback("Goom Limit"); + p.sound.last_goom_p = secure_f_feedback("Goom Detection"); + p.sound.last_biggoom_p = secure_f_feedback("Big Goom Detection"); + p.sound.goom_power_p = secure_f_feedback("Goom Power"); + + p.sound.biggoom_speed_limit_p = secure_i_param("Big Goom Speed Limit"); + IVAL(p.sound.biggoom_speed_limit_p) = 10; + IMIN(p.sound.biggoom_speed_limit_p) = 0; + IMAX(p.sound.biggoom_speed_limit_p) = 100; + ISTEP(p.sound.biggoom_speed_limit_p) = 1; + + p.sound.biggoom_factor_p = secure_i_param("Big Goom Factor"); + IVAL(p.sound.biggoom_factor_p) = 10; + IMIN(p.sound.biggoom_factor_p) = 0; + IMAX(p.sound.biggoom_factor_p) = 100; + ISTEP(p.sound.biggoom_factor_p) = 1; + + p.sound.params = plugin_parameters ("Sound", 11); + + p.nbParams = 0; + p.nbVisuals = nbVisuals; + p.visuals = (VisualFX**)malloc(sizeof(VisualFX*)*nbVisuals); + + *pp = p; + pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p; + pp->sound.params.params[1] = &pp->sound.biggoom_factor_p; + pp->sound.params.params[2] = 0; + pp->sound.params.params[3] = &pp->sound.volume_p; + pp->sound.params.params[4] = &pp->sound.accel_p; + pp->sound.params.params[5] = &pp->sound.speed_p; + pp->sound.params.params[6] = 0; + pp->sound.params.params[7] = &pp->sound.goom_limit_p; + pp->sound.params.params[8] = &pp->sound.goom_power_p; + pp->sound.params.params[9] = &pp->sound.last_goom_p; + pp->sound.params.params[10] = &pp->sound.last_biggoom_p; + + pp->statesNumber = 8; + pp->statesRangeMax = 510; + { + GoomState states[8] = { + {1,0,0,1,4, 0, 100}, + {1,0,0,0,1, 101, 140}, + {1,0,0,1,2, 141, 200}, + {0,1,0,1,2, 201, 260}, + {0,1,0,1,0, 261, 330}, + {0,1,1,1,4, 331, 400}, + {0,0,1,0,5, 401, 450}, + {0,0,1,1,1, 451, 510}}; + for (i=0;i<8;++i) + pp->states[i] = states[i]; + } + pp->curGState = &(pp->states[6]); + + /* datas for the update loop */ + pp->update.lockvar = 0; + pp->update.goomvar = 0; + pp->update.loopvar = 0; + pp->update.stop_lines = 0; + pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */ + pp->update.decay_ifs = 0; /* disparition de l'ifs */ + pp->update.recay_ifs = 0; /* dedisparition de l'ifs */ + pp->update.cyclesSinceLastChange = 0; + pp->update.drawLinesDuration = 80; + pp->update.lineMode= pp->update.drawLinesDuration; + + pp->update.switchMultAmount = (29.0f/30.0f); + pp->update.switchIncrAmount = 0x7f; + pp->update.switchMult = 1.0f; + pp->update.switchIncr = pp->update.switchIncrAmount; + + pp->update.stateSelectionRnd = 0; + pp->update.stateSelectionBlocker = 0; + pp->update.previousZoomSpeed = 128; + pp->update.timeOfTitleDisplay = 0; + + pp->update_message.affiche = 0; + + { + ZoomFilterData zfd = { + 127, 8, 16, + 1, 1, 0, NORMAL_MODE, + 0, 0, 0, 0, 0 + }; + pp->update.zoomFilterData = zfd; + } + + setOptimizedMethods(pp); + + pp->scanner = gsl_new(); + pp->main_scanner = gsl_new(); + pp->main_script_str = GOOM_MAIN_SCRIPT; + + for (i = 0; i < 0xffff; i++) { + pp->sintable[i] = (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5); + /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */ + } +} + +void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual) { + p->visuals[i] = visual; + if (i == p->nbVisuals-1) { + ++i; + p->nbParams = 1; + while (i--) { + if (p->visuals[i]->params) + p->nbParams++; + } + p->params = (PluginParameters *)malloc(sizeof(PluginParameters)*p->nbParams); + i = p->nbVisuals; + p->nbParams = 1; + p->params[0] = p->sound.params; + while (i--) { + if (p->visuals[i]->params) + p->params[p->nbParams++] = *(p->visuals[i]->params); + } + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/pngload.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/pngload.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/pngload.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/pngload.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,144 @@ +#include + +int +loadpng (char *file_name, int *w, int *h, unsigned int ***buf) +{ + FILE *fp; + png_uint_32 width, height; + int bit_depth, + + color_type, interlace_type, compression_type, filter_type; + int rowbytes; + + png_structp png_ptr; + png_infop info_ptr; + png_infop end_info; + + int x, y; + unsigned int **row_pointers; + + /* OUVERTURE DU FICHIER */ + + fp = fopen (file_name, "rb"); + + if (!fp) { + // fprintf (stderr, "Couldn't open file\n"); + return 1; + } + + /* CREATION DES STRUCTURES */ + png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL); + if (!png_ptr) { + fclose (fp); + fprintf (stderr, "Memory error\n"); + return 1; + } + + info_ptr = png_create_info_struct (png_ptr); + if (!info_ptr) { + png_destroy_read_struct (&png_ptr, (png_infopp) NULL, (png_infopp) NULL); + fclose (fp); + fprintf (stderr, "Read error 1\n"); + return 1; + } + + end_info = png_create_info_struct (png_ptr); + if (!end_info) { + png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL); + fclose (fp); + fprintf (stderr, "Read error 2\n"); + return 1; + } + + /* CHARGEMENT DE L'IMAGE */ + if (setjmp (png_ptr->jmpbuf)) { + png_destroy_read_struct (&png_ptr, &info_ptr, &end_info); + fclose (fp); + fprintf (stderr, "Erreur de chargement\n"); + return 1; + } + + png_init_io (png_ptr, fp); + png_set_read_status_fn (png_ptr, NULL); + + png_read_info (png_ptr, info_ptr); + + png_get_IHDR (png_ptr, info_ptr, &width, &height, + &bit_depth, &color_type, &interlace_type, + &compression_type, &filter_type); +/* + printf ("taille : %dx%d\n",width,height); + printf ("depth : %d\n",bit_depth); + printf ("color type : "); + switch (color_type) { + case PNG_COLOR_TYPE_GRAY: + printf ("PNG_COLOR_TYPE_GRAY (bit depths 1, 2, 4, 8, 16)\n"); + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + printf ("PNG_COLOR_TYPE_GRAY_ALPHA (bit depths 8, 16)\n"); + break; + case PNG_COLOR_TYPE_PALETTE: + printf ("PNG_COLOR_TYPE_PALETTE (bit depths 1, 2, 4, 8)\n"); + break; + case PNG_COLOR_TYPE_RGB: + printf ("PNG_COLOR_TYPE_RGB (bit_depths 8, 16)\n"); + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + printf ("PNG_COLOR_TYPE_RGB_ALPHA (bit_depths 8, 16)\n"); + break; + } + */ + // printf ("PNG_COLOR_MASK_ALPHA : %x\n", PNG_COLOR_MASK_ALPHA); + // printf ("PNG_COLOR_MASK_COLOR : %x\n", PNG_COLOR_MASK_COLOR); + // printf ("PNG_COLOR_MASK_PALETTE : %x\n", PNG_COLOR_MASK_PALETTE); + + if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8) + png_set_palette_to_rgb (png_ptr); + + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + png_set_expand_gray_1_2_4_to_8 (png_ptr); + else if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb (png_ptr); + + if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha (png_ptr); + + png_read_update_info (png_ptr, info_ptr); + +// printf ("channels : %d\n", png_get_channels (png_ptr, info_ptr)); + rowbytes = png_get_rowbytes (png_ptr, info_ptr); +// printf ("rowbytes : %d\n", rowbytes); + + row_pointers = (unsigned int **) malloc (height * sizeof (unsigned int *)); + + for (y = 0; y < height; y++) + row_pointers[y] = (unsigned int *) malloc (4 * width); + png_read_image (png_ptr, (png_bytepp) row_pointers); + + // for (y=0;y unsigned int * frompixmap +; r4 <=> unsigned int * topixmap +; r5 <=> unsigned int sizeX (in pixels) +; r6 <=> unsigned int sizeY (in pixels) +; r7 <=> unsigned int * brutS +; r8 <=> unsigned int * brutD +; r9 <=> unsigned int buffratio +; r10 <=> int [16][16] precalccoeffs + +; globals after init +; r3 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r3) +; r4 <=> topixmap - 1 byte needed for preincremental fetch (replaces r4) +; r5 <=> ax = x max in 16th of pixels (replaces old r5) +; r6 <=> ay = y max in 16th of pixels (replaces old r6) +; r20 <=> row size in bytes +; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) + +; ABI notes : +; r1 is the Stack Pointer (SP) => Do not use +; r13..r31 are non-volatiles => Do not use + +_ppc_zoom_generic: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r18,-56(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r5,r6 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r5,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r5,r5,1 +subi r6,r6,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r4,r4,4 +slwi r5,r5,4 +slwi r6,r6,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +L1: + +; computes dynamically the position to fetch +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr6,0,r2,r5 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +cmpl cr7,0,r29,r6 +srawi r29,r29,4 ; pos computing +bge- cr6,L4 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L4 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r3 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stwu r7,4(r4) ; Stores the computed pixel +bdnz L1 ; Iterate again if needed +b L3 ;goto end ; If not, returns from the function + + +; if out of range +L4: +stwu r18,4(r4) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L1 + + +L3: + +; Restore saved registers and return +lmw r18,-56(r1) +blr + + + + + + + + +_ppc_zoom_G4: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r17,-60(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r5,r6 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r5,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r5,r5,1 +subi r6,r6,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r4,r4,4 +slwi r5,r5,4 +slwi r6,r6,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +;********************* +lis r17,0x0F01 + +L100: + +; computes dynamically the position to fetch +;mullw r8,r8,r29 +;mullw r2,r2,r29 +;add r2,r8,r2 +;srawi r2,r2,17 + +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +dst r30,r17,0 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +dst r31,r17,1 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr6,0,r2,r5 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +cmpl cr7,0,r29,r6 +srawi r29,r29,4 ; pos computing +bge- cr6,L400 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L400 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r3 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +dst r2,r17,2 +andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stwu r7,4(r4) ; Stores the computed pixel +bdnz L100 ; Iterate again if needed +b L300 ;goto end ; If not, returns from the function + + +; if out of range +L400: +stwu r18,4(r4) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L100 + + +L300: + +; Restore saved registers and return +lmw r17,-60(r1) +blr diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,50 @@ +.section regular,__TEXT +.globl _ppc_doubling ; name of the function to call by C program + +; width (src width)->r3 +; myx (src) ->r4 +; myX (dest) ->r5 +; myX2 (dest + 1 complete line)->r6 +; heigth (src height)->r7 +; inc (increment for next line in dest) ->r8 + +_ppc_doubling: + +mtspr ctr,r3 + +addi r4,r4,-4 +addi r5,r5,-4 +addi r6,r6,-4 + +1:;boucle: + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r6) + +bdnz 1boucle + +subi r7,r7,1 +add r5,r5,r8 +cmpwi cr1,r7,0 +add r6,r6,r8 +mtspr ctr,r3 +bgt cr1,1boucle + +blr + +;backup + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r5) +stwu r10,4(r6) + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r5) +stwu r10,4(r6) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_drawings.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_drawings.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_drawings.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_drawings.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ +/* + * ppc_drawings.h + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +/* Generic PowerPC Code */ +void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff); + +/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff); + +/* G5 Specific PowerPC Code (Possible use of Altivec) */ +void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff); + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_drawings.s kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_drawings.s --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_drawings.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_drawings.s 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,381 @@ +; PowerPC optimized drawing methods for Goom +; © 2003 Guillaume Borios +; This Source Code is released under the terms of the General Public License + +; Change log : +; 30 May 2003 : File creation + +; Section definition : We use a read only code section for the whole file +.section __TEXT,__text,regular,pure_instructions + + +; -------------------------------------------------------------------------------------- +; Single 32b pixel drawing macros +; Usage : +; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4 +; Only the work registers (WR) can be touched by the macros +; +; Available methods : +; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW) +; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST) +; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing +; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST) +; DRAWMETHOD_B_OR_MACRO : Bitwise OR +; DRAWMETHOD_BAND_MACRO : Bitwise AND +; DRAWMETHOD_BXOR_MACRO : Bitwise XOR +; DRAWMETHOD_BNOT_MACRO : Bitwise NOT +; -------------------------------------------------------------------------------------- + +.macro DRAWMETHOD_OVRW_MACRO + stw $2,0($1) ;; *$1 <- $2 +.endmacro + +.macro DRAWMETHOD_B_OR_MACRO + lwz $3,0($0) ;; $3 <- *$0 + or $3,$3,$2 ;; $3 <- $3 | $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BAND_MACRO + lwz $3,0($0) ;; $3 <- *$0 + and $3,$3,$2 ;; $3 <- $3 & $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BXOR_MACRO + lwz $3,0($0) ;; $3 <- *$0 + xor $3,$3,$2 ;; $3 <- $3 ^ $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BNOT_MACRO + lwz $3,0($0) ;; $3 <- *$0 + nand $3,$3,$3 ;; $3 <- ~$3 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_PLUS_MACRO + lwz $4,0($0) ;; $4 <- *$0 + andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 + andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 + add $3,$3,$5 ;; $3 <- $3 + $5 + rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15) + srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension) + or $3,$3,$5 ;; $3 <- $3 | $5 + lis $5,0xFF ;; $5 <- 0x00FF00FF + addi $5,$5,0xFF + and $4,$4,$5 ;; $4 <- $4 & $5 + and $6,$2,$5 ;; $6 <- $2 & $5 + add $4,$4,$6 ;; $4 <- $4 + $6 + rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7) + srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension) + rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23) + srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension) + rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31] + or $4,$4,$6 ;; $4 <- $4 | $6 + rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23] + stw $4,0($1) ;; *$1 <- $4 +.endmacro + +.macro DRAWMETHOD_HALF_MACRO + lwz $4,0($0) ;; $4 <- *$0 + andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 + andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 + add $3,$3,$5 ;; $3 <- $3 + $5 + lis $5,0xFF ;; $5 <- 0x00FF00FF + addi $5,$5,0xFF + and $4,$4,$5 ;; $4 <- $4 & $5 + and $5,$2,$5 ;; $5 <- $2 & $5 + add $4,$4,$5 ;; $4 <- $4 + $5 + srwi $4,$4,1 ;; $4 <- $4 >> 1 + rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22] + stw $4,0($1) ;; *$1 <- $4 +.endmacro + +.macro DRAWMETHOD_DFLT_MACRO + DRAWMETHOD_PLUS_MACRO +.endmacro + +; -------------------------------------------------------------------------------------- + + + +; ************************************************************************************** +; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col); +; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +; ************************************************************************************** +.globl _DRAWMETHOD_PLUS_2_PPC +.align 3 +_DRAWMETHOD_PLUS_2_PPC: + DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9 + blr ;; return + +.globl _DRAWMETHOD_PLUS_PPC +.align 3 +_DRAWMETHOD_PLUS_PPC: + DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9 + blr ;; return + + +; ************************************************************************************** +; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col); +; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +; ************************************************************************************** +.globl _DRAWMETHOD_HALF_2_PPC +.align 3 +_DRAWMETHOD_HALF_2_PPC: + DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8 + blr ;; return + +.globl _DRAWMETHOD_HALF_PPC +.align 3 +_DRAWMETHOD_HALF_PPC: + DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7 + blr ;; return + + +; ************************************************************************************** +; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col, +; unsigned int screenx, unsigned int screeny) +; ************************************************************************************** +.globl _DRAW_LINE_PPC +.align 3 +_DRAW_LINE_PPC: + ;; NOT IMPLEMENTED YET + blr ;; return + + +; ************************************************************************************** +; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff) +; ************************************************************************************** + + +.const +.align 4 +vectorZERO: + .long 0,0,0,0 + .long 0x10101000, 0x10101001, 0x10101002, 0x10101003 + .long 0x10101004, 0x10101005, 0x10101006, 0x10101007 + .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B + .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F + + +.section __TEXT,__text,regular,pure_instructions + +.globl _ppc_brightness_G4 +.align 3 +_ppc_brightness_G4: + + +;; PowerPC Altivec code + srwi r5,r5,2 + mtctr r5 + +;;vrsave + mfspr r11,256 + lis r12,0xCFFC + mtspr 256,r12 + + mflr r0 + bcl 20,31,"L00000000001$pb" +"L00000000001$pb": + mflr r10 + mtlr r0 + + addis r9,r10,ha16(vectorZERO-"L00000000001$pb") + addi r9,r9,lo16(vectorZERO-"L00000000001$pb") + + vxor v0,v0,v0 ;; V0 = NULL vector + + addi r9,r9,16 + lvx v10,0,r9 + addi r9,r9,16 + lvx v11,0,r9 + addi r9,r9,16 + lvx v12,0,r9 + addi r9,r9,16 + lvx v13,0,r9 + + addis r9,r10,ha16(vectortmpwork-"L00000000001$pb") + addi r9,r9,lo16(vectortmpwork-"L00000000001$pb") + stw r6,0(r9) + li r6,8 + stw r6,4(r9) + lvx v9,0,r9 + li r9,128 + vspltw v8,v9,0 + vspltw v9,v9,1 + +;; elt counter + li r9,0 + lis r7,0x0F01 + b L7 +.align 4 +L7: + lvx v1,r9,r3 + + vperm v4,v1,v0,v10 + ;********************* + add r10,r9,r3 + ;********************* + vperm v5,v1,v0,v11 + vperm v6,v1,v0,v12 + vperm v7,v1,v0,v13 + + vmulouh v4,v4,v8 + ;********************* + dst r10,r7,3 + ;********************* + vmulouh v5,v5,v8 + vmulouh v6,v6,v8 + vmulouh v7,v7,v8 + vsrw v4,v4,v9 + vsrw v5,v5,v9 + vsrw v6,v6,v9 + vsrw v7,v7,v9 + + vpkuwus v4,v4,v5 + vpkuwus v6,v6,v7 + vpkuhus v1,v4,v6 + + stvx v1,r9,r4 + addi r9,r9,16 + + bdnz L7 + + mtspr 256,r11 + blr + + +.globl _ppc_brightness_G5 +.align 3 +_ppc_brightness_G5: + +;; PowerPC Altivec G5 code + srwi r5,r5,2 + mtctr r5 + +;;vrsave + mfspr r11,256 + lis r12,0xCFFC + mtspr 256,r12 + + mflr r0 + bcl 20,31,"L00000000002$pb" +"L00000000002$pb": + mflr r10 + mtlr r0 + + addis r9,r10,ha16(vectorZERO-"L00000000002$pb") + addi r9,r9,lo16(vectorZERO-"L00000000002$pb") + + vxor v0,v0,v0 ;; V0 = NULL vector + + addi r9,r9,16 + lvx v10,0,r9 + addi r9,r9,16 + lvx v11,0,r9 + addi r9,r9,16 + lvx v12,0,r9 + addi r9,r9,16 + lvx v13,0,r9 + + addis r9,r10,ha16(vectortmpwork-"L00000000002$pb") + addi r9,r9,lo16(vectortmpwork-"L00000000002$pb") + stw r6,0(r9) + li r6,8 + stw r6,4(r9) + lvx v9,0,r9 + li r9,128 + vspltw v8,v9,0 + vspltw v9,v9,1 + +;; elt counter + li r9,0 + lis r7,0x0F01 + b L6 +.align 4 +L6: + lvx v1,r9,r3 + + vperm v4,v1,v0,v10 + ;********************* + add r10,r9,r3 + ;********************* + vperm v5,v1,v0,v11 + vperm v6,v1,v0,v12 + vperm v7,v1,v0,v13 + + vmulouh v4,v4,v8 + vmulouh v5,v5,v8 + vmulouh v6,v6,v8 + vmulouh v7,v7,v8 + vsrw v4,v4,v9 + vsrw v5,v5,v9 + vsrw v6,v6,v9 + vsrw v7,v7,v9 + + vpkuwus v4,v4,v5 + vpkuwus v6,v6,v7 + vpkuhus v1,v4,v6 + + stvx v1,r9,r4 + addi r9,r9,16 + + bdnz L6 + + mtspr 256,r11 + blr + + +.globl _ppc_brightness_generic +.align 3 +_ppc_brightness_generic: + lis r12,0x00FF + ori r12,r12,0x00FF + subi r3,r3,4 + subi r4,r4,4 + mtctr r5 + b L1 +.align 4 +L1: + lwzu r7,4(r3) + + rlwinm r8,r7,16,24,31 + rlwinm r9,r7,24,24,31 + mullw r8,r8,r6 + rlwinm r10,r7,0,24,31 + mullw r9,r9,r6 + srwi r8,r8,8 + mullw r10,r10,r6 + srwi r9,r9,8 + + rlwinm. r11,r8,0,0,23 + beq L2 + li r8,0xFF +L2: + srwi r10,r10,8 + rlwinm. r11,r9,0,0,23 + beq L3 + li r9,0xFF +L3: + rlwinm r7,r8,16,8,15 + rlwinm. r11,r10,0,0,23 + beq L4 + li r10,0xFF +L4: + rlwimi r7,r9,8,16,23 + rlwimi r7,r10,0,24,31 + + stwu r7,4(r4) + bdnz L1 + + blr + + + +.static_data +.align 4 +vectortmpwork: + .long 0,0,0,0 + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,14 @@ +/* + * ppc_zoom_ultimate.h + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +/* Generic PowerPC Code */ +void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + +/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,323 @@ +; PowerPC optimized zoom for Goom +; © 2001-2003 Guillaume Borios +; This Source Code is released under the terms of the General Public License + +; Change log : +; 21 Dec 2003 : Use of altivec is now determined with a parameter + +; Section definition : We use a read only section +.text + +; name of the function to call by C program : ppc_zoom +; We declare this label as a global to extend its scope outside this file +.globl _ppc_zoom_generic +.globl _ppc_zoom_G4 + +; Description : +; This routine dynamically computes and applies a zoom filter + +; parameters : +; r3 <=> unsigned int sizeX (in pixels) +; r4 <=> unsigned int sizeY (in pixels) +; r5 <=> unsigned int * frompixmap +; r6 <=> unsigned int * topixmap +; r7 <=> unsigned int * brutS +; r8 <=> unsigned int * brutD +; r9 <=> unsigned int buffratio +; r10 <=> int [16][16] precalccoeffs + +; globals after init +; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5) +; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6) +; r3 <=> ax = x max in 16th of pixels (replaces old r3) +; r4 <=> ay = y max in 16th of pixels (replaces old r4) +; r20 <=> row size in bytes +; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) + +; ABI notes : +; r1 is the Stack Pointer (SP) => Do not use +; r13..r31 are non-volatiles => Do not use + +_ppc_zoom_generic: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r18,-56(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r3,r4 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r3,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r3,r3,1 +subi r4,r4,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r6,r6,4 +slwi r3,r3,4 +slwi r4,r4,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +b L1 +.align 5 +L1: + +; computes dynamically the position to fetch +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr4,0,r2,r3 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +cmpl cr7,0,r29,r4 +srawi r29,r29,4 ; pos computing +bge- cr4,L4 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L4 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r5 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stwu r7,4(r6) ; Stores the computed pixel +bdnz L1 ; Iterate again if needed +b L3 ;goto end ; If not, returns from the function + + +; if out of range +L4: +stwu r18,4(r6) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L1 + + +L3: + +; Restore saved registers and return +lmw r18,-56(r1) +blr + + + + + + + + +_ppc_zoom_G4: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r17,-60(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r3,r4 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r3,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r3,r3,1 +subi r4,r4,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r6,r6,4 +slwi r3,r3,4 +slwi r4,r4,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +;********************* +lis r17,0x0F01 + +b L100 +.align 5 +L100: + +addi r6,r6,4 + +; Optimization to ensure the destination buffer +; won't be loaded into the data cache +rlwinm. r0,r6,0,27,31 +bne+ L500 +dcbz 0,r6 +;dcba 0,r6 +L500: + +; computes dynamically the position to fetch +;mullw r8,r8,r29 +;mullw r2,r2,r29 +;add r2,r8,r2 +;srawi r2,r2,17 + +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +dst r30,r17,0 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +dst r31,r17,1 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr4,0,r2,r3 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +cmpl cr7,0,r29,r4 +srawi r29,r29,4 ; pos computing +bge- cr4,L400 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L400 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r5 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +dst r2,r17,2 +rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00 +;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00 +;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00 +;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00 +;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stw r7,0(r6) ; Stores the computed pixel +bdnz L100 ; Iterate again if needed +b L300 ;goto end ; If not, returns from the function + + +; if out of range +L400: +stw r18,0(r6) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L100 + + +L300: + +; Restore saved registers and return +lmw r17,-60(r1) +blr diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/sound_tester.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/sound_tester.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/sound_tester.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/sound_tester.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,138 @@ +#include "sound_tester.h" + +#include +#include + +/* some constants */ +#define BIG_GOOM_DURATION 100 +#define BIG_GOOM_SPEED_LIMIT 0.1f + +#define ACCEL_MULT 0.95f +#define SPEED_MULT 0.99f + + +void evaluate_sound(gint16 data[2][512], SoundInfo *info) { + + int i; + float difaccel; + float prevspeed; + + /* find the max */ + int incvar = 0; + for (i = 0; i < 512; i+=2) { + if (incvar < data[0][i]) + incvar = data[0][i]; + } + + if (incvar > info->allTimesMax) + info->allTimesMax = incvar; + + /* volume sonore */ + info->volume = (float)incvar / (float)info->allTimesMax; + memcpy(info->samples[0],data[0],512*sizeof(short)); + memcpy(info->samples[1],data[1],512*sizeof(short)); + + difaccel = info->accelvar; + info->accelvar = info->volume; /* accel entre 0 et 1 */ + + /* transformations sur la vitesse du son */ + if (info->speedvar > 1.0f) + info->speedvar = 1.0f; + + if (info->speedvar < 0.1f) + info->accelvar *= (1.0f - (float)info->speedvar); + else if (info->speedvar < 0.3f) + info->accelvar *= (0.9f - (float)(info->speedvar-0.1f)/2.0f); + else + info->accelvar *= (0.8f - (float)(info->speedvar-0.3f)/4.0f); + + /* adoucissement de l'acceleration */ + info->accelvar *= ACCEL_MULT; + if (info->accelvar < 0) + info->accelvar = 0; + + difaccel = info->accelvar - difaccel; + if (difaccel < 0) + difaccel = - difaccel; + + /* mise a jour de la vitesse */ + prevspeed = info->speedvar; + info->speedvar = (info->speedvar + difaccel * 0.5f) / 2; + info->speedvar *= SPEED_MULT; + info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f; + if (info->speedvar < 0) + info->speedvar = 0; + if (info->speedvar > 1) + info->speedvar = 1; + + /* temps du goom */ + info->timeSinceLastGoom++; + info->timeSinceLastBigGoom++; + info->cycle++; + + /* detection des nouveaux gooms */ + if ((info->speedvar > (float)IVAL(info->biggoom_speed_limit_p)/100.0f) + && (info->accelvar > info->bigGoomLimit) + && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) { + info->timeSinceLastBigGoom = 0; + } + + if (info->accelvar > info->goom_limit) { + /* TODO: tester && (info->timeSinceLastGoom > 20)) { */ + info->totalgoom ++; + info->timeSinceLastGoom = 0; + info->goomPower = info->accelvar - info->goom_limit; + } + + if (info->accelvar > info->prov_max) + info->prov_max = info->accelvar; + + if (info->goom_limit>1) + info->goom_limit=1; + + /* toute les 2 secondes : vrifier si le taux de goom est correct + * et le modifier sinon.. */ + if (info->cycle % 64 == 0) { + if (info->speedvar<0.01f) + info->goom_limit *= 0.91; + if (info->totalgoom > 4) { + info->goom_limit+=0.02; + } + if (info->totalgoom > 7) { + info->goom_limit*=1.03f; + info->goom_limit+=0.03; + } + if (info->totalgoom > 16) { + info->goom_limit*=1.05f; + info->goom_limit+=0.04; + } + if (info->totalgoom == 0) { + info->goom_limit = info->prov_max - 0.02; + } + if ((info->totalgoom == 1) && (info->goom_limit > 0.02)) + info->goom_limit-=0.01; + info->totalgoom = 0; + info->bigGoomLimit = info->goom_limit * (1.0f + (float)IVAL(info->biggoom_factor_p)/500.0f); + info->prov_max = 0; + } + + /* mise a jour des parametres pour la GUI */ + FVAL(info->volume_p) = info->volume; + info->volume_p.change_listener(&info->volume_p); + FVAL(info->speed_p) = info->speedvar * 4; + info->speed_p.change_listener(&info->speed_p); + FVAL(info->accel_p) = info->accelvar; + info->accel_p.change_listener(&info->accel_p); + + FVAL(info->goom_limit_p) = info->goom_limit; + info->goom_limit_p.change_listener(&info->goom_limit_p); + FVAL(info->goom_power_p) = info->goomPower; + info->goom_power_p.change_listener(&info->goom_power_p); + FVAL(info->last_goom_p) = 1.0-((float)info->timeSinceLastGoom/20.0f); + info->last_goom_p.change_listener(&info->last_goom_p); + FVAL(info->last_biggoom_p) = 1.0-((float)info->timeSinceLastBigGoom/40.0f); + info->last_biggoom_p.change_listener(&info->last_biggoom_p); + + /* bigGoomLimit ==goomLimit*9/8+7 ? */ + } + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/sound_tester.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/sound_tester.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/sound_tester.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/sound_tester.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,11 @@ +#ifndef _SOUND_TESTER_H +#define _SOUND_TESTER_H + +#include "goom_plugin_info.h" +#include "goom_config.h" + +/** change les donnees du SoundInfo */ +void evaluate_sound(gint16 data[2][512], SoundInfo *sndInfo); + +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,107 @@ +#include "surf3d.h" +#include "goom_plugin_info.h" +#include +#include +#include + +grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) { + int x = defx; + int y = defz; + grid3d *g = malloc (sizeof(grid3d)); + surf3d *s = &(g->surf); + s->nbvertex = x*y; + s->vertex = malloc (x*y*sizeof(v3d)); + s->svertex = malloc (x*y*sizeof(v3d)); + s->center = center; + + g->defx=defx; + g->sizex=sizex; + g->defz=defz; + g->sizez=sizez; + g->mode=0; + + while (y) { + --y; + x = defx; + while (x) { + --x; + s->vertex[x+defx*y].x = (float)(x-defx/2)*sizex/defx; + s->vertex[x+defx*y].y = 0; + s->vertex[x+defx*y].z = (float)(y-defz/2)*sizez/defz; + } + } + return g; +} + +void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, + int dist, Pixel *buf, Pixel *back, int W,int H) { + + int x; + v2d v2,v2x; + + v2d *v2_array = malloc(g->surf.nbvertex * sizeof(v2d)); + v3d_to_v2d(g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array); + + for (x=0;xdefx;x++) { + int z; + v2x = v2_array[x]; + + for (z=1;zdefz;z++) { + v2 = v2_array[z*g->defx + x]; + if (((v2.x != -666) || (v2.y!=-666)) + && ((v2x.x != -666) || (v2x.y!=-666))) { + plug->methods.draw_line (buf,v2x.x,v2x.y,v2.x,v2.y, colorlow, W, H); + plug->methods.draw_line (back,v2x.x,v2x.y,v2.x,v2.y, color, W, H); + } + v2x = v2; + } + } + + free(v2_array); +} + +void surf3d_rotate (surf3d *s, float angle) { + int i; + float cosa; + float sina; + SINCOS(angle,sina,cosa); + for (i=0;inbvertex;i++) { + Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); + } +} + +void surf3d_translate (surf3d *s) { + int i; + for (i=0;inbvertex;i++) { + TRANSLATE_V3D(s->center,s->svertex[i]); + } +} + +void grid3d_update (grid3d *g, float angle, float *vals, float dist) { + int i; + float cosa; + float sina; + surf3d *s = &(g->surf); + v3d cam = s->center; + cam.z += dist; + + SINCOS((angle/4.3f),sina,cosa); + cam.y += sina*2.0f; + SINCOS(angle,sina,cosa); + + if (g->mode==0) { + if (vals) + for (i=0;idefx;i++) + s->vertex[i].y = s->vertex[i].y*0.2 + vals[i]*0.8; + + for (i=g->defx;inbvertex;i++) { + s->vertex[i].y *= 0.255f; + s->vertex[i].y += (s->vertex[i-g->defx].y * 0.777f); + } + } + + for (i=0;inbvertex;i++) { + Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); + TRANSLATE_V3D(cam,s->svertex[i]); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,38 @@ +#ifndef _SURF3D_H +#define _SURF3D_H + +#include "v3d.h" +#include "goom_graphic.h" +#include "goom_typedefs.h" + +typedef struct { + v3d *vertex; + v3d *svertex; + int nbvertex; + + v3d center; +} surf3d; + +typedef struct { + surf3d surf; + + int defx; + int sizex; + int defz; + int sizez; + int mode; +} grid3d; + +/* hi-level */ + +/* works on grid3d */ +grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center); +void grid3d_update (grid3d *s, float angle, float *vals, float dist); + +/* low level */ +void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H); +void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H); +void surf3d_rotate (surf3d *s, float angle); +void surf3d_translate (surf3d *s); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.s kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.s --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/surf3d.s 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,484 @@ + .file "surf3d.c" + .version "01.01" +gcc2_compiled.: +.text + .align 4 +.globl grid3d_new + .type grid3d_new,@function +grid3d_new: + pushl %ebp + movl %esp,%ebp + subl $44,%esp + pushl %edi + pushl %esi + pushl %ebx + movl 20(%ebp),%eax + movl 12(%ebp),%esi + movl %eax,-8(%ebp) + addl $-12,%esp + pushl $44 + call malloc + movl %esi,%edx + imull -8(%ebp),%edx + movl %eax,%edi + movl %edx,-12(%ebp) + leal (%edx,%edx,2),%ebx + movl %edx,8(%edi) + addl $-12,%esp + sall $2,%ebx + pushl %ebx + call malloc + addl $32,%esp + movl %eax,(%edi) + addl $-12,%esp + pushl %ebx + call malloc + movl %eax,4(%edi) + movl 24(%ebp),%eax + movl %eax,12(%edi) + movl 28(%ebp),%eax + movl %eax,16(%edi) + movl 32(%ebp),%eax + movl %eax,20(%edi) + movl 8(%ebp),%eax + movl %eax,28(%edi) + movl %esi,24(%edi) + movl -8(%ebp),%edx + movl 16(%ebp),%eax + movl %edx,32(%edi) + movl %eax,36(%edi) + movl $0,40(%edi) + testl %edx,%edx + je .L480 + movl %esi,%eax + movl %esi,-28(%ebp) + shrl $31,%eax + addl %eax,%esi + movl -8(%ebp),%eax + shrl $31,%eax + addl -8(%ebp),%eax + movl -12(%ebp),%edx + sarl $1,%eax + movl %edx,-24(%ebp) + negl -28(%ebp) + movl %esi,-16(%ebp) + movl %eax,-20(%ebp) + .p2align 4,,7 +.L481: + movl -28(%ebp),%eax + addl %eax,-24(%ebp) + decl -8(%ebp) + movl 12(%ebp),%esi + testl %esi,%esi + je .L479 + movl -8(%ebp),%eax + subl -20(%ebp),%eax + movl %eax,-4(%ebp) + fildl -4(%ebp) + movl %esi,-4(%ebp) + movl -24(%ebp),%edx + leal (%edx,%esi),%eax + movl -16(%ebp),%ebx + fildl 16(%ebp) + leal (%eax,%eax,2),%eax + sarl $1,%ebx + leal 0(,%eax,4),%ecx + fmulp %st,%st(1) + fildl 20(%ebp) + fdivrp %st,%st(1) + fildl 8(%ebp) + fildl -4(%ebp) + jmp .L484 +.L487: + fxch %st(2) + .p2align 4,,7 +.L484: + decl %esi + movl %esi,%eax + movl (%edi),%edx + subl %ebx,%eax + movl %eax,-4(%ebp) + fildl -4(%ebp) + addl $-12,%ecx + fmul %st(2),%st + fdiv %st(1),%st + fstps (%edx,%ecx) + fxch %st(2) + movl (%edi),%eax + movl $0,4(%eax,%ecx) + movl (%edi),%eax + fsts 8(%eax,%ecx) + testl %esi,%esi + jne .L487 + fstp %st(0) + fstp %st(0) + fstp %st(0) +.L479: + cmpl $0,-8(%ebp) + jne .L481 +.L480: + leal -56(%ebp),%esp + popl %ebx + movl %edi,%eax + popl %esi + popl %edi + leave + ret +.Lfe1: + .size grid3d_new,.Lfe1-grid3d_new +.section .rodata + .align 8 +.LC48: + .long 0x0,0x3fe00000 + .align 4 +.LC49: + .long 0x3f19999a + .align 4 +.LC50: + .long 0x3ee3d70a +.text + .align 4 +.globl grid3d_update + .type grid3d_update,@function +grid3d_update: + pushl %ebp + movl %esp,%ebp + subl $32,%esp + pushl %esi + pushl %ebx + flds 12(%ebp) + movl 8(%ebp),%ebx + movl 16(%ebp),%ecx + fld %st(0) +#APP + fsin +#NO_APP + fstps -4(%ebp) + flds -4(%ebp) + fxch %st(1) +#APP + fcos +#NO_APP + fstps -4(%ebp) + flds -4(%ebp) + cmpl $0,40(%ebx) + jne .L519 + testl %ecx,%ecx + je .L520 + xorl %esi,%esi + cmpl 24(%ebx),%esi + jge .L520 + fldl .LC48 + xorl %edx,%edx + .p2align 4,,7 +.L524: + movl (%ebx),%eax + fld %st(0) + fld %st(1) + fxch %st(1) + fmuls 4(%eax,%edx) + fxch %st(1) + fmuls (%ecx,%esi,4) + faddp %st,%st(1) + incl %esi + fstps 4(%eax,%edx) + addl $12,%edx + cmpl 24(%ebx),%esi + jl .L524 + fstp %st(0) +.L520: + movl 24(%ebx),%esi + cmpl 8(%ebx),%esi + jge .L519 + leal (%esi,%esi,2),%eax + flds .LC49 + flds .LC50 + leal 0(,%eax,4),%ecx + .p2align 4,,7 +.L529: + movl (%ebx),%eax + flds 4(%eax,%ecx) + fmul %st(2),%st + fstps 4(%eax,%ecx) + movl %esi,%eax + subl 24(%ebx),%eax + movl (%ebx),%edx + leal (%eax,%eax,2),%eax + flds 4(%edx,%eax,4) + fmul %st(1),%st + fadds 4(%edx,%ecx) + incl %esi + fstps 4(%edx,%ecx) + addl $12,%ecx + cmpl 8(%ebx),%esi + jl .L529 + fstp %st(0) + fstp %st(0) +.L519: + xorl %esi,%esi + cmpl 8(%ebx),%esi + jge .L536 + xorl %ecx,%ecx + .p2align 4,,7 +.L534: + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + fsubp %st,%st(1) + movl 4(%ebx),%edx + incl %esi + fstps (%edx,%ecx) + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fxch %st(1) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + faddp %st,%st(1) + movl 4(%ebx),%edx + fstps 8(%edx,%ecx) + movl (%ebx),%eax + flds 4(%eax,%ecx) + movl 4(%ebx),%edx + fstps 4(%edx,%ecx) + movl 4(%ebx),%eax + flds (%eax,%ecx) + fadds 12(%ebx) + fstps (%eax,%ecx) + movl 4(%ebx),%eax + flds 4(%eax,%ecx) + fadds 16(%ebx) + fstps 4(%eax,%ecx) + movl 4(%ebx),%eax + flds 8(%eax,%ecx) + fadds 20(%ebx) + fstps 8(%eax,%ecx) + addl $12,%ecx + cmpl 8(%ebx),%esi + jl .L534 +.L536: + fstp %st(0) + fstp %st(0) + popl %ebx + popl %esi + leave + ret +.Lfe2: + .size grid3d_update,.Lfe2-grid3d_update +.section .rodata + .align 4 +.LC51: + .long 0x40000000 + .align 8 +.LC52: + .long 0x0,0x42380000 +.text + .align 4 +.globl surf3d_draw + .type surf3d_draw,@function +surf3d_draw: + pushl %ebp + movl %esp,%ebp + subl $60,%esp + pushl %edi + pushl %esi + pushl %ebx + movl $0,-20(%ebp) + movl -20(%ebp),%edx + movl 8(%ebp),%eax + cmpl 8(%eax),%edx + jge .L493 + fldl .LC52 + flds .LC51 + xorl %edi,%edi + .p2align 4,,7 +.L495: + movl 8(%ebp),%eax + movl 4(%eax),%eax + movl %eax,-36(%ebp) + fcoms 8(%eax,%edi) + fnstsw %ax + andb $69,%ah + cmpb $1,%ah + jne .L496 + fildl 16(%ebp) + movl -36(%ebp),%edx + fld %st(0) + fmuls (%edx,%edi) + fdivs 8(%edx,%edi) + fld %st(3) + faddp %st,%st(1) + fstpl -32(%ebp) + movl -32(%ebp),%eax + movl -28(%ebp),%edx + movl %eax,-40(%ebp) + sarl $16,-40(%ebp) + movl -36(%ebp),%edx + fmuls 4(%edx,%edi) + fdivs 8(%edx,%edi) + movl -40(%ebp),%ecx + fld %st(2) + faddp %st,%st(1) + fstpl -32(%ebp) + movl -32(%ebp),%eax + movl -28(%ebp),%edx + movl %eax,-44(%ebp) + movl 28(%ebp),%eax + sarl $1,%eax + addl %eax,%ecx + movl 32(%ebp),%eax + sarl $16,-44(%ebp) + sarl $1,%eax + movl %ecx,%ebx + subl -44(%ebp),%eax + movl %eax,%esi + cmpl 28(%ebp),%ebx + jge .L496 + testl %ecx,%ecx + jl .L496 + cmpl 32(%ebp),%esi + jge .L496 + testl %eax,%eax + jge .L499 +.L496: + xorl %esi,%esi + xorl %ebx,%ebx +.L499: + movl 20(%ebp),%eax + movl %ebx,%edx + leal (%eax,%edx,4),%edx + movl 28(%ebp),%eax + imull %esi,%eax + leal (%edx,%eax,4),%eax + testl %ebx,%ebx + je .L494 + testl %esi,%esi + je .L494 +#APP + movd (%eax), %mm0 + paddusb 12(%ebp), %mm0 + movd %mm0, (%eax) +#NO_APP +.L494: + incl -20(%ebp) + addl $12,%edi + movl -20(%ebp),%eax + movl 8(%ebp),%edx + cmpl 8(%edx),%eax + jl .L495 + fstp %st(0) + fstp %st(0) +.L493: + popl %ebx + popl %esi + popl %edi + leave + ret +.Lfe3: + .size surf3d_draw,.Lfe3-surf3d_draw + .align 4 +.globl surf3d_rotate + .type surf3d_rotate,@function +surf3d_rotate: + pushl %ebp + movl %esp,%ebp + subl $32,%esp + pushl %esi + pushl %ebx + flds 12(%ebp) + movl 8(%ebp),%ebx + fld %st(0) +#APP + fsin +#NO_APP + fstps -4(%ebp) + flds -4(%ebp) + fxch %st(1) +#APP + fcos +#NO_APP + fstps -4(%ebp) + xorl %esi,%esi + flds -4(%ebp) + cmpl 8(%ebx),%esi + jge .L537 + xorl %ecx,%ecx + .p2align 4,,7 +.L508: + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + fsubp %st,%st(1) + movl 4(%ebx),%edx + incl %esi + fstps (%edx,%ecx) + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fxch %st(1) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + faddp %st,%st(1) + movl 4(%ebx),%edx + fstps 8(%edx,%ecx) + movl (%ebx),%eax + flds 4(%eax,%ecx) + movl 4(%ebx),%edx + fstps 4(%edx,%ecx) + addl $12,%ecx + cmpl 8(%ebx),%esi + jl .L508 +.L537: + fstp %st(0) + fstp %st(0) + popl %ebx + popl %esi + leave + ret +.Lfe4: + .size surf3d_rotate,.Lfe4-surf3d_rotate + .align 4 +.globl surf3d_translate + .type surf3d_translate,@function +surf3d_translate: + pushl %ebp + movl %esp,%ebp + pushl %ebx + movl 8(%ebp),%ecx + xorl %ebx,%ebx + cmpl 8(%ecx),%ebx + jge .L512 + xorl %edx,%edx + .p2align 4,,7 +.L514: + movl 4(%ecx),%eax + flds (%eax,%edx) + fadds 12(%ecx) + incl %ebx + fstps (%eax,%edx) + movl 4(%ecx),%eax + flds 4(%eax,%edx) + fadds 16(%ecx) + fstps 4(%eax,%edx) + movl 4(%ecx),%eax + flds 8(%eax,%edx) + fadds 20(%ecx) + fstps 8(%eax,%edx) + addl $12,%edx + cmpl 8(%ecx),%ebx + jl .L514 +.L512: + popl %ebx + leave + ret +.Lfe5: + .size surf3d_translate,.Lfe5-surf3d_translate + .ident "GCC: (GNU) 2.95.3 19991030 (prerelease)" diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/tentacle3d.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/tentacle3d.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/tentacle3d.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/tentacle3d.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,299 @@ +#include + +#include "v3d.h" +#include "surf3d.h" +#include "goom_tools.h" +#include "goom_config.h" +#include "goom_plugin_info.h" +#include "tentacle3d.h" + +#define D 256.0f + +#define nbgrid 6 +#define definitionx 15 +#define definitionz 45 + +typedef struct _TENTACLE_FX_DATA { + PluginParam enabled_bp; + PluginParameters params; + + float cycle; + grid3d *grille[nbgrid]; + float *vals; + +#define NB_TENTACLE_COLORS 4 + int colors[NB_TENTACLE_COLORS]; + + int col; + int dstcol; + float lig; + float ligs; + + /* statics from pretty_move */ + float distt; + float distt2; + float rot; /* entre 0 et 2 * M_PI */ + int happens; + int rotation; + int lock; +} TentacleFXData; + +static void tentacle_new (TentacleFXData *data); +static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, + short[2][512], float, int drawit, TentacleFXData *data); +static void tentacle_free (TentacleFXData *data); + +/* + * VisualFX wrapper for the tentacles + */ + +static void tentacle_fx_init(VisualFX *_this, PluginInfo *info) { + + TentacleFXData *data = (TentacleFXData*)malloc(sizeof(TentacleFXData)); + + data->enabled_bp = secure_b_param("Enabled", 1); + data->params = plugin_parameters ("3D Tentacles", 1); + data->params.params[0] = &data->enabled_bp; + + data->cycle = 0.0f; + data->col = (0x28<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x5f<<(BLEU*8)); + data->dstcol = 0; + data->lig = 1.15f; + data->ligs = 0.1f; + + data->distt = 10.0f; + data->distt2 = 0.0f; + data->rot = 0.0f; /* entre 0 et 2 * M_PI */ + data->happens = 0; + + data->rotation = 0; + data->lock = 0; + data->colors[0] = (0x18<<(ROUGE*8))|(0x4c<<(VERT*8))|(0x2f<<(BLEU*8)); + data->colors[1] = (0x48<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x6f<<(BLEU*8)); + data->colors[2] = (0x58<<(ROUGE*8))|(0x3c<<(VERT*8))|(0x0f<<(BLEU*8)); + data->colors[3] = (0x87<<(ROUGE*8))|(0x55<<(VERT*8))|(0x74<<(BLEU*8)); + tentacle_new(data); + + _this->params = &data->params; + _this->fx_data = (void*)data; +} + +static void tentacle_fx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) +{ + TentacleFXData *data = (TentacleFXData*)_this->fx_data; + if (BVAL(data->enabled_bp)) { + tentacle_update(goomInfo, dest, src, goomInfo->screen.width, + goomInfo->screen.height, goomInfo->sound.samples, + (float)goomInfo->sound.accelvar, + goomInfo->curGState->drawTentacle, data); + } +} + +static void tentacle_fx_free(VisualFX *_this) { + TentacleFXData *data = (TentacleFXData*)_this->fx_data; + free(data->params.params); + tentacle_free(data); + free(_this->fx_data); +} + +VisualFX tentacle_fx_create(void) { + VisualFX fx; + fx.init = tentacle_fx_init; + fx.apply = tentacle_fx_apply; + fx.free = tentacle_fx_free; + return fx; +} + +/* ----- */ + +static void tentacle_free (TentacleFXData *data) { + /* TODO : un vrai FREE GRID!! */ + int tmp; + for (tmp=0;tmpgrille[tmp]; + free (g->surf.vertex); + free (g->surf.svertex); + free (g); + } + free (data->vals); +} + +static void tentacle_new (TentacleFXData *data) { + int tmp; + + v3d center = {0,-17.0,0}; + data->vals = (float*)malloc ((definitionx+20)*sizeof(float)); + + for (tmp=0;tmpgrille[tmp] = grid3d_new (x, definitionx, z, definitionz + rand() % 10, center); + center.y += 8; + } +} + +static inline unsigned char lighten (unsigned char value, float power) +{ + int val = value; + float t = (float) val * log10(power) / 2.0; + + if (t > 0) { + val = (int) t; /* (32.0f * log (t)); */ + if (val > 255) + val = 255; + if (val < 0) + val = 0; + return val; + } + else { + return 0; + } +} + +static void lightencolor (int *col, float power) +{ + unsigned char *color; + + color = (unsigned char *) col; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); +} + +/* retourne x>>s , en testant le signe de x */ +#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) + +static int evolutecolor (unsigned int src,unsigned int dest, + unsigned int mask, unsigned int incr) { + + int color = src & (~mask); + src &= mask; + dest &= mask; + + if ((src!=mask) + &&(srcdest) + src -= incr; + return (src&mask)|color; +} + +static void pretty_move (PluginInfo *goomInfo, float cycle, float *dist, float *dist2, float *rotangle, TentacleFXData *fx_data) { + + float tmp; + + /* many magic numbers here... I don't really like that. */ + if (fx_data->happens) + fx_data->happens -= 1; + else if (fx_data->lock == 0) { + fx_data->happens = goom_irand(goomInfo->gRandom,200)?0:100+goom_irand(goomInfo->gRandom,60); + fx_data->lock = fx_data->happens * 3 / 2; + } + else fx_data->lock --; + + tmp = fx_data->happens?8.0f:0; + *dist2 = fx_data->distt2 = (tmp + 15.0f*fx_data->distt2)/16.0f; + + tmp = 30+D-90.0f*(1.0f+sin(cycle*19/20)); + if (fx_data->happens) + tmp *= 0.6f; + + *dist = fx_data->distt = (tmp + 3.0f*fx_data->distt)/4.0f; + + if (!fx_data->happens){ + tmp = M_PI*sin(cycle)/32+3*M_PI/2; + } + else { + fx_data->rotation = goom_irand(goomInfo->gRandom,500)?fx_data->rotation:goom_irand(goomInfo->gRandom,2); + if (fx_data->rotation) + cycle *= 2.0f*M_PI; + else + cycle *= -1.0f*M_PI; + tmp = cycle - (M_PI*2.0) * floor(cycle/(M_PI*2.0)); + } + + if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot+2.0*M_PI))) { + fx_data->rot = (tmp + 15.0f*(fx_data->rot+2*M_PI)) / 16.0f; + if (fx_data->rot>2.0*M_PI) + fx_data->rot -= 2.0*M_PI; + *rotangle = fx_data->rot; + } + else if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot-2.0*M_PI))) { + fx_data->rot = (tmp + 15.0f*(fx_data->rot-2.0*M_PI)) / 16.0f; + if (fx_data->rot<0.0f) + fx_data->rot += 2.0*M_PI; + *rotangle = fx_data->rot; + } + else + *rotangle = fx_data->rot = (tmp + 15.0f*fx_data->rot) / 16.0f; +} + +static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, + short data[2][512], float rapport, int drawit, TentacleFXData *fx_data) { + + int tmp; + int tmp2; + + int color; + int colorlow; + + float dist,dist2,rotangle; + + if ((!drawit) && (fx_data->ligs>0.0f)) + fx_data->ligs = -fx_data->ligs; + + fx_data->lig += fx_data->ligs; + + if (fx_data->lig > 1.01f) { + if ((fx_data->lig>10.0f) | (fx_data->lig<1.1f)) fx_data->ligs = -fx_data->ligs; + + if ((fx_data->lig<6.3f)&&(goom_irand(goomInfo->gRandom,30)==0)) + fx_data->dstcol=goom_irand(goomInfo->gRandom,NB_TENTACLE_COLORS); + + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff,0x01); + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff00,0x0100); + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff0000,0x010000); + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff000000,0x01000000); + + color = fx_data->col; + colorlow = fx_data->col; + + lightencolor(&color,fx_data->lig * 2.0f + 2.0f); + lightencolor(&colorlow,(fx_data->lig/3.0f)+0.67f); + + rapport = 1.0f + 2.0f * (rapport - 1.0f); + rapport *= 1.2f; + if (rapport > 1.12f) + rapport = 1.12f; + + pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); + + for (tmp=0;tmpgRandom,511)],10)) * rapport; + fx_data->vals[tmp2] = val; + } + + grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2); + } + fx_data->cycle+=0.01f; + for (tmp=0;tmpgrille[tmp],color,colorlow,dist,buf,back,W,H); + } + else { + fx_data->lig = 1.05f; + if (fx_data->ligs < 0.0f) + fx_data->ligs = -fx_data->ligs; + pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); + fx_data->cycle+=0.1f; + if (fx_data->cycle > 1000) + fx_data->cycle = 0; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/tentacle3d.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/tentacle3d.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/tentacle3d.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/tentacle3d.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,8 @@ +#ifndef _TENTACLE3D_H +#define _TENTACLE3D_H + +#include "goom_visual_fx.h" + +VisualFX tentacle_fx_create(void); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/TODO kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/TODO --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/TODO 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/TODO 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,32 @@ +Idees: + +- Flash lights (Phosphor) + --> --> --> + <-- <-- <-- + +- Re-remplir RAND regulierement (1/tour) + +- Un effect qui affecte la displacement map: + +- Enregistrer l'etat de la config, s'en servir pour definir un etat de goom. + +- PluginParam de type Button, avec juste un listener en donnee. + +- PluginParam de type TextField. + +- Liste des modes possibles pour l'effet de BG. + +- Goom lui-meme : liste des effets actifs. + mode automatique / manuel (plus de changement aleatoires) + +- Possibilite d'envoyer des commandes format text au Core. exemples : +" BRIGHT_FLASH.SCREEN_BRIGHTNESS=200.0 + if SOUND.GOOM_DETECTION > 0 + 3D_TENTACLES.ENABLED = 1 + endif + CORE.MAIN_SCRIPT="..." +" + void goom_execute_script(const char *cmds); + void goom_set_main_script(const char *script); /// peut retourner un message d'erreur ? + char *goom_create_state_script(); /* retourne un script permettant de remettre goom dans l'etat actuel */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/v3d.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/v3d.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/v3d.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/v3d.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,15 @@ +#include "v3d.h" + +void v3d_to_v2d(v3d *v3, int nbvertex, int width, int height, float distance, v2d *v2) { + int i; + for (i=0;i 2) { + int Xp, Yp; + F2I((distance * v3[i].x / v3[i].z),Xp); + F2I((distance * v3[i].y / v3[i].z),Yp); + v2[i].x = Xp + (width>>1); + v2[i].y = -Yp + (height>>1); + } + else v2[i].x=v2[i].y=-666; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/v3d.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/v3d.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/v3d.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/v3d.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,65 @@ +#ifndef _V3D_H +#define _V3D_H + +#include +#include +#include + +#include "mathtools.h" + +typedef struct { + float x,y,z; +} v3d; + +typedef struct { + int x,y; +} v2d; + +typedef struct { + double x,y; +} v2g; + +/* + * projete le vertex 3D sur le plan d'affichage + * retourne (0,0) si le point ne doit pas etre affiche. + * + * bonne valeur pour distance : 256 + */ +#define V3D_TO_V2D(v3,v2,width,height,distance) \ +{ \ + int Xp, Yp; \ + if (v3.z > 2) { \ + F2I((distance * v3.x / v3.z),Xp) ; \ + F2I((distance * v3.y / v3.z),Yp) ; \ + v2.x = Xp + (width>>1); \ + v2.y = -Yp + (height>>1); \ + } \ + else v2.x=v2.y=-666; \ +} + +void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array); + +/* + * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a)) + * centerz = centre de rotation en z + */ +#define Y_ROTATE_V3D(vi,vf,sina,cosa)\ +{\ + vf.x = vi.x * cosa - vi.z * sina;\ + vf.z = vi.x * sina + vi.z * cosa;\ + vf.y = vi.y;\ +} + +/* + * translation + */ +#define TRANSLATE_V3D(vsrc,vdest)\ +{\ + vdest.x += vsrc.x;\ + vdest.y += vsrc.y;\ + vdest.z += vsrc.z;\ +} + +#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;} + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/xmmx.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/xmmx.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/xmmx.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/xmmx.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,390 @@ + +#ifdef HAVE_MMX + +/* a definir pour avoir exactement le meme resultat que la fonction C + * (un chouillat plus lent).. mais la difference est assez peu notable. + */ +// #define STRICT_COMPAT + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +/* faire : a % sqrtperte <=> a & pertemask*/ +#define PERTEMASK 0xf +/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +#define PERTEDEC 4 + + +/*#define MMX_TRACE*/ +#include "mmx.h" +/*#include "xmmx.h"*/ +#include "goom_graphic.h" + +int xmmx_supported (void) { + return (mm_support()&0x8)>>3; +} + +void zoom_filter_xmmx (int prevX, int prevY, + Pixel *expix1, Pixel *expix2, + int *lbruS, int *lbruD, int buffratio, + int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + /* volatile mmx_t interpix; */ + + expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; + + prevXY.ud[0] = (prevX-1)<> 16 */ + + "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */ + "#1 \n\t psrld $16, %%mm0" + : + :[brutS] "r" (&brutS[loop]) ,[brutD] "r" (&brutD[loop]) + ); /* mm0 = S */ + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1,mm2 + */ + asm volatile + ("#1 \n\t movq %[prevXY], %%mm1" + "#1 \n\t pcmpgtd %%mm0, %%mm1" + /* mm0 en X contient (idem pour Y) : + * 1111 si prevXY > px + * 0000 si prevXY <= px */ +#ifdef STRICT_COMPAT + "#1 \n\t movq %%mm1, %%mm2" + "#1 \n\t punpckhdq %%mm2, %%mm2" + "#1 \n\t punpckldq %%mm1, %%mm1" + "#1 \n\t pand %%mm2, %%mm0" +#endif + + "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */ + ::[prevXY]"m"(prevXY)); + + /* Thread #2 + * pre : mm0 : clipped position on screen + * + * post : mm3 : coefs for this position + * mm1 : X vector [0|X] + * + * modif : eax,esi + */ + __asm__ __volatile__ ( + "#2 \n\t movd %%mm0,%%esi" + "#2 \n\t movq %%mm0,%%mm1" + + "#2 \n\t andl $15,%%esi" + "#2 \n\t psrlq $32,%%mm1" + + "#2 \n\t shll $6,%%esi" + "#2 \n\t movd %%mm1,%%eax" + + "#2 \n\t addl %[precalCoef],%%esi" + "#2 \n\t andl $15,%%eax" + + "#2 \n\t movd (%%esi,%%eax,4),%%mm3" + ::[precalCoef]"g"(precalCoef):"eax","esi"); + + /* + * extraction des coefficients... (Thread #3) + * + * pre : coef dans mm3 + * + * post : coef extraits dans mm3 (c1 & c2) + * et mm4 (c3 & c4) + * + * modif : mm5 + */ + + /* (Thread #4) + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * + * post : mm0 : expix1[position] + * mm2 : expix1[position+largeur] + * + * modif : eax, esi + */ + __asm__ __volatile__ ( + "#2 \n\t psrld $4, %%mm0" + "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */ + + "#4 \n\t movd %%mm1,%%eax" + "#3 \n\t movq %%mm3,%%mm5" + + "#4 \n\t mull %[prevX]" + "#4 \n\t movd %%mm0,%%esi" + + "#3 \n\t punpcklbw %%mm5, %%mm3" + "#4 \n\t addl %%esi, %%eax" + + "#3 \n\t movq %%mm3, %%mm4" + "#3 \n\t movq %%mm3, %%mm5" + + "#4 \n\t movl %[expix1], %%esi" + "#3 \n\t punpcklbw %%mm5, %%mm3" + + "#4 \n\t movq (%%esi,%%eax,4),%%mm0" + "#3 \n\t punpckhbw %%mm5, %%mm4" + + "#4 \n\t addl %[prevX],%%eax" + "#4 \n\t movq (%%esi,%%eax,4),%%mm2" + + : + : [expix1] "g"(expix1) + , [prevX] "g"(prevX) + :"eax","esi" + ); + + /* + * pre : mm0 : expix1[position] + * mm2 : expix1[position+largeur] + * mm3 & mm4 : coefs + */ + + /* recopie des deux premiers pixels dans mm0 et mm1 */ + movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ + punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + + /* extraction des coefficients... */ + + movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + + /*^en parrallele^*/ /* depackage du 2ieme pixel */ + /*^*/ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ + + punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ + movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ + movq_r2r (mm2, mm1); + + /* depackage des pixels */ + punpcklbw_r2r (mm7, mm1); + punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ + pmullw_r2r (mm4, mm1); + pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues la valeur finale */ + paddw_r2r (mm1, mm0); + paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + psrlw_i2r (8, mm0); + packuswb_r2r (mm7, mm0); + + movd_r2m (mm0,expix2[loop]); + + ++loop; + } + __asm__ __volatile__ ("emms\n"); +} + +#define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \ +{ \ + movd_m2r(_backbuf, mm0); \ + paddusb_m2r(_col, mm0); \ + movd_r2m(mm0, _out); \ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col) + +void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) + goto end_of_line; + + dx = x2 - x1; + dy = y2 - y1; + if (x1 >= x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } + else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + goto end_of_line; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + goto end_of_line; + } + } +end_of_line: + __asm__ __volatile__ ("emms\n"); +} + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/xmmx.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/xmmx.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/src/xmmx.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/src/xmmx.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,537 @@ +/* xmmx.h + + eXtended MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for xmmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DXMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1999 by R. Fisher + Based on libmmx, 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _XMMX_H +#define _XMMX_H + + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an (Extended) MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +#ifndef _MMX_H +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +#endif + + + +/* Function to test if multimedia instructions are supported... +*/ +static int +mm_support(void) +{ + /* Returns 1 if MMX instructions are supported, + 3 if Cyrix MMX and Extended MMX instructions are supported + 5 if AMD MMX and 3DNow! instructions are supported + 0 if hardware does not support any of these + */ + register int rval = 0; + + __asm__ __volatile__ ( + /* See if CPUID instruction is supported ... */ + /* ... Get copies of EFLAGS into eax and ecx */ + "pushf\n\t" + "popl %%eax\n\t" + "movl %%eax, %%ecx\n\t" + + /* ... Toggle the ID bit in one copy and store */ + /* to the EFLAGS reg */ + "xorl $0x200000, %%eax\n\t" + "push %%eax\n\t" + "popf\n\t" + + /* ... Get the (hopefully modified) EFLAGS */ + "pushf\n\t" + "popl %%eax\n\t" + + /* ... Compare and test result */ + "xorl %%eax, %%ecx\n\t" + "testl $0x200000, %%ecx\n\t" + "jz NotSupported1\n\t" /* CPUID not supported */ + + + /* Get standard CPUID information, and + go to a specific vendor section */ + "movl $0, %%eax\n\t" + "cpuid\n\t" + + /* Check for Intel */ + "cmpl $0x756e6547, %%ebx\n\t" + "jne TryAMD\n\t" + "cmpl $0x49656e69, %%edx\n\t" + "jne TryAMD\n\t" + "cmpl $0x6c65746e, %%ecx\n" + "jne TryAMD\n\t" + "jmp Intel\n\t" + + /* Check for AMD */ + "\nTryAMD:\n\t" + "cmpl $0x68747541, %%ebx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x69746e65, %%edx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x444d4163, %%ecx\n" + "jne TryCyrix\n\t" + "jmp AMD\n\t" + + /* Check for Cyrix */ + "\nTryCyrix:\n\t" + "cmpl $0x69727943, %%ebx\n\t" + "jne NotSupported2\n\t" + "cmpl $0x736e4978, %%edx\n\t" + "jne NotSupported3\n\t" + "cmpl $0x64616574, %%ecx\n\t" + "jne NotSupported4\n\t" + /* Drop through to Cyrix... */ + + + /* Cyrix Section */ + /* See if extended CPUID level 80000001 is supported */ + /* The value of CPUID/80000001 for the 6x86MX is undefined + according to the Cyrix CPU Detection Guide (Preliminary + Rev. 1.01 table 1), so we'll check the value of eax for + CPUID/0 to see if standard CPUID level 2 is supported. + According to the table, the only CPU which supports level + 2 is also the only one which supports extended CPUID levels. + */ + "cmpl $0x2, %%eax\n\t" + "jne MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported (in theory), so get extended + features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%eax\n\t" /* Test for MMX */ + "jz NotSupported5\n\t" /* MMX not supported */ + "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ + "jnz EMMXSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "EMMXSupported:\n\t" + "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ + "jmp Return\n\t" + + + /* AMD Section */ + "AMD:\n\t" + + /* See if extended CPUID is supported */ + "movl $0x80000000, %%eax\n\t" + "cpuid\n\t" + "cmpl $0x80000000, %%eax\n\t" + "jl MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported, so get extended features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported6\n\t" /* MMX not supported */ + "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ + "jnz ThreeDNowSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "ThreeDNowSupported:\n\t" + "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ + "jmp Return\n\t" + + + /* Intel Section */ + "Intel:\n\t" + + /* Check for MMX */ + "MMXtest:\n\t" + "movl $1, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported7\n\t" /* MMX Not supported */ + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\t" + + /* Nothing supported */ + "\nNotSupported1:\n\t" + "#movl $101, %0:\n\n\t" + "\nNotSupported2:\n\t" + "#movl $102, %0:\n\n\t" + "\nNotSupported3:\n\t" + "#movl $103, %0:\n\n\t" + "\nNotSupported4:\n\t" + "#movl $104, %0:\n\n\t" + "\nNotSupported5:\n\t" + "#movl $105, %0:\n\n\t" + "\nNotSupported6:\n\t" + "#movl $106, %0:\n\n\t" + "\nNotSupported7:\n\t" + "#movl $107, %0:\n\n\t" + "movl $0, %0:\n\n\t" + + "Return:\n\t" + : "=a" (rval) + : /* no input */ + : "eax", "ebx", "ecx", "edx" + ); + + /* Return */ + return(rval); +} + +/* Function to test if mmx instructions are supported... +*/ +#ifndef _XMMX_H +inline extern int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} +#endif + +/* Function to test if xmmx instructions are supported... +*/ +inline extern int +xmmx_ok(void) +{ + /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */ + return ( (mm_support() & 0x2) >> 1 ); +} + + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef XMMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)) + +#define mmx_m2ir(op, mem, rs) \ + __asm__ __volatile__ (#op " %0, %%" #rs \ + : /* nothing */ \ + : "X" (mem) ) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_r2ir(op, rs1, rs2) \ + __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \ + : /* nothing */ \ + : /* nothing */ ) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)) + +#endif + + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + + +/* 4x16 Parallel MAGnitude +*/ +#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg) +#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd) +#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard) + + +/* 4x16 Parallel ADDs using Saturation arithmetic + and Implied destination +*/ +#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs) +#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2) +#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard) + + +/* 4x16 Parallel SUBs using Saturation arithmetic + and Implied destination +*/ +#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs) +#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2) +#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results + Rounded with 1/2 bit 15. +*/ +#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg) +#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd) +#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results + Rounded with 1/2 bit 15, storing to Implied register +*/ +#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs) +#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2) +#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard) + + +/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions + of results Rounded with 1/2 bit 15, accumulating with Implied register +*/ +#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs) +#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2) +#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard) + + +/* 8x8u Parallel AVErage +*/ +#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg) +#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd) +#define paveb(vars, vard) mmx_m2m(paveb, vars, vard) + + +/* 8x8u Parallel DISTance and accumulate with + unsigned saturation to Implied register +*/ +#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs) +#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Zero +*/ +#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Not Zero +*/ +#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Less than Zero +*/ +#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Greater than or Equal to Zero +*/ +#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs) + + +/* Fast Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-xmmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef XMMX_TRACE + +#define femms() \ + { \ + fprintf(stderr, "femms()\n"); \ + __asm__ __volatile__ ("femms"); \ + } + +#else + +#define femms() __asm__ __volatile__ ("femms") + +#endif + +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/test/testapp.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/test/testapp.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/test/testapp.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/test/testapp.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ +#include +#include + +gint16 data[2][512]; + +int main() +{ + int i; + PluginInfo *goom; + goom = goom_init (640, 480); + for (i = 0; i<100; i++) + { + fprintf(stderr,"*"); + goom_update (goom, data, 0, -1, 0, 0); + } + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/tools/gfont.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/tools/gfont.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/tools/gfont.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/tools/gfont.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,3483 @@ +/* GIMP RGBA C-Source image dump (gfont.c) */ + +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + char *comment; + unsigned char pixel_data[1277 * 21 * 4]; +} the_font = { + 1277, 21, 4, + "Created with The GIMP", + "y\21\244\377y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377" + "y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377" + "y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377" + "y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0" + "\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0" + "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0" + "y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377\15\4\21\0\15\4\21\0\15\4\21\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4" + "\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" + "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" + "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20" + "\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" + "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4" + "\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16" + "\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20" + "\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16" + "\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0" + "\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\15\4\21\0\15\4\21\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\6\3""9\12\10\5U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""6\11\10\4`\11" + "\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4O\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\6\3""3\12\10\5U\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\10\6\3U\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9" + "\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\5\4\2\16\10\6\3U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\6\3J\11\7\4q\10\6\3\247\10\6\3\213\11\7\4U\5\4\2\16\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\10\4" + "n\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\24\11\7\4" + "U\11\10\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4""9\11\10\4U\6\5\3""0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\21\10" + "\6\3U\11\7\4R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\11" + "\7\4]\10\6\3\231\10\6\3\241\10\6\3n\11\10\4U\10\6\3U\6\5\3\37\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\12\10" + "\5U\12\7\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\5\4\2""9\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6" + "\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2" + "*\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3" + "G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\11\10\4U\11\7\4J\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3*\11\7\4U\10\6\3U\11\7\4U\10\6\3}\10\6\3\252\7\6\4" + "\252\11\7\4\252\14\11\7\252\23\16\12\252\23\15\12\216\10\6\5\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\5\4\2""3\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10" + "\6\3\244\10\6\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12" + "\10\5""9\11\7\4\252\10\6\3\252\10\6\3\252\10\6\3\241\10\6\3\216\11\7\4`\11" + "\7\4U\10\6\3U\11\7\4U\11\7\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4" + "\2*\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5" + "\3L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14" + "\11\7\252\17\13\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10\7\241" + "\12\10\7U\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3" + "J\11\10\4U\10\6\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\7\6\4\34\11\7\4U\11\7\4U\5\4\2\21\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2*\10\6\3U\11" + "\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3U\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5U\12\10\7\205\14\11\7\252\17\12" + "\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10\7\226\10\6\5>\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14\11\7\252" + "\17\12\10\252\16\12\7\252\11\7\4\252\10\6\5\223\12\10\5U\7\6\4U\5\4\4\3\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7""9\13\10\6\241\11\7\6\252\12\10\7" + "\252\15\12\10\252\16\12\7\252\15\12\10\252\14\11\7\252\12\10\7\234\12\10" + "\7U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\7\5U\11" + "\7\4n\11\7\4\252\12\10\5\252\12\10\5\252\13\10\6\252\12\10\7\226\12\10\7" + "U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10""9\13\10\6\252\11\7\6" + "\252\12\10\7\252\15\12\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10" + "\7\237\12\10\7U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10;\13\11" + "\6\252\11\7\4}\12\10\5U\10\6\3\205\10\6\3\247\10\6\3\252\10\6\3\252\11\10" + "\4q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3*\12\10\5U\12\7\5U\11\7\4}\12\10" + "\5\252\14\12\7\252\16\13\7\252\23\16\12\252\23\16\12\216\10\6\5\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14\11\7\252\17\13\10\252\17" + "\13\10\252\17\13\10\252\15\12\10\252\12\10\7\241\12\10\7U\6\5\5\31\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7J\16\12\7\252\14\11\7\213\7\6\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7n\16\12\7\252\15\12\10}\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\15\12\10G\17\13\10\252\15\12\10\202\5\5\4\10\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\13\10\6U\11\7\4\252\12\10\5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" + "\7""9\12\10\5\247\13\10\6n\6\5\3\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10" + "\6""9\12\7\5\237\13\10\6f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""3\12\10" + "\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\12\7\5""9\13\11\6U\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\12\10\5U\13\10\6U\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\5\4\2-\10\6\3U\11\7\4U\11\7\4X\11\7\4l\11\10\4]\11\7\4U\10\6\3U\6\5" + "\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3-\11\7\4U\10\6\3U\11\7" + "\4U\10\6\3}\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3J\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\7\5U\12\10\5U\11\7\4w\10\6\3" + "\216\11\7\4\202\12\10\5[\12\7\5U\6\5\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\4""9\12\10\5U\12\7\5U\12\10\5U\10\6\3\220\10\6\3\252\10\6\3\244" + "\10\6\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5" + "\4\2-\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\11\7\4i\10\6\3U\6" + "\5\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\4;\11\7\4\252\10\6\3" + "\244\11\7\4[\10\6\3U\10\6\3U\10\6\3U\11\7\4U\10\6\3\216\11\6\4\252\11\10" + "\4t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6" + "\3""6\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9" + "\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\12\7\5\231\12" + "\10\5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7]\16\13\7\252\15\12" + "\10\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6[\13\10\6\252\11\7\4\252\11" + "\7\4\252\10\6\5\252\10\6\3w\11\7\4U\10\6\3U\10\6\3U\11\7\4U\11\7\4L\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3*\11\7\4U\10\6\3U\10\6\3z\11\10\4f\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""3\11\7\4U\6\5\3-\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\10\5""9\10" + "\6\3\234\12\7\5]\13\10\6U\13\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\6\5\5\16\15\12\10U\10\7\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\12" + "\7\5\234\12\10\5`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9\12\10\5]\12\10\5U\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7n\15\12\10\252\14\11" + "\7\205\5\5\4\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5O\12\10\7\177\15\12\10\252\20" + "\14\11\216\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\6\3""9\12\10\5U\11\6\4U\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17" + "\13\10q\31\22\14\252\24\17\13\216\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10\202\26\20\13\252\24\17\13\216\7\6\6\27" + "\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10D\14\11\7\252\13\10\6t\6\5\3\10\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\14\11\7R\17\12\10\252\15\12\10\202\5\5\4\10\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\6\10\6\3U\10\6" + "\3\234\11\10\4q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0\11\10\4[\11\7\4" + "L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\11\6\4\252\10\6\3c\5\4\2\"\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3G\11\10\4]\11\10\4`\10\6\3U\6\5\3-\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3L\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X-\13\377\14\12\5q\0\0\0\0\7" + "\6\4\34""6\35\11\377].\14\377X-\13\377\14\11\5z\0\0\0\0\7\5\4%6\35\11\377" + "].\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3U:\37" + "\11\377]2\14\377X,\13\377\11\7\4\252\0\0\0\0\5\4\2U4\34\11\377]0\14\377X" + ",\13\377\14\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\7\6\4U:\37\11\377]2\14\377X-\13\377\14\11\5\252\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X-\13\377" + "\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23\14\6\343" + "L%\13\377X-\13\377\16\12\5\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\252" + "E#\12\377\\/\13\377\\/\13\377X-\13\377X-\13\377\20\13\5\343\7\5\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377" + "].\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23" + "\14\6\343R'\13\377\\/\13\377\16\12\5i\0\0\0\0\0\0\0\0\7\5\4\24""6\35\11\377" + "d2\15\377\36\23\7\377\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\6\5\3\34\23\14\6\343L%\13\377X-\13\377\16\12\5\202\0\0\0\0\0\0\0\0\0" + "\0\0\0\7\6\4A\21\13\6\343G%\12\377X-\13\377\\/\13\377\\/\13\377X-\13\377" + "X,\13\377X,\13\377\31\20\6\377\10\6\3\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\7\5\4U\21\14\6\345M'\14\377k3\16\377q7\20\377\24\16\11\262" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\35\22" + "\10\377J'\13\377X-\13\377X-\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377" + ")\27\10\377\14\11\5\343\5\5\4\27\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\32\21" + "\6\377J'\13\377X-\13\377X-\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377)" + "\30\10\377\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\20\13\5\343G%\12\377X-\13\377X,\13" + "\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377\\/\13\377X,\13\377X" + "-\13\377\\.\15\377d4\15\377m5\20\377y?\24\377\236J\27\377\264X\33\377\267" + "Z\34\377\32\21\13\216\0\0\0\0\0\0\0\0\0\0\0\0\12\7\5\252\32\21\6\377J'\13" + "\377X-\13\377\\/\13\377\\/\13\377\\/\13\377X-\13\377X-\13\377)\30\10\377" + "\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\7\6\4\10=\40\12\377f3\15\377\\.\15" + "\377\\.\15\377\\.\15\377\\.\15\377\\.\15\377Z-\13\377T,\13\377X-\13\377X" + ",\13\377\16\12\5w\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\231\32\21\6\377J'\13\377" + "X-\13\377\\/\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377-\31\10\377\15\12" + "\6\343\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\21\15\12\252@'\25\377\233N\32\377" + "\251S\32\377\245P\30\377\241O\30\377\221G\26\377\210F\25\377\206E\25\377" + "X2\27\377\26\21\13\350\11\10\6\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\27\14\11\5" + "\255G\"\12\377\\+\15\377!\24\10\377\12\10\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\16\7\343S*\14\377\\.\15\377\23\15\6\343" + "\6\5\3\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\10\5\252\32\21\6\377L%\13\377Z.\13\377\\.\15\377\\.\15\377Z-\13\377Z" + "-\13\377X,\13\377.\32\11\377\22\15\11\343\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0" + "\0\17\14\10\252:#\23\377\206I\27\377\231L\30\377\216E\25\377\203@\24\377" + "y;\22\377y;\22\377y>\22\377+\33\14\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\21\15\12\252@'\25\377\244U\33\377\261V\32\377\232K\27\377y>\22" + "\377s8\20\377w=\22\377{=\24\377P-\23\377\26\20\13\343\10\7\5\34\0\0\0\0\0" + "\0\0\0\15\12\10""9`0\23\377\245P\30\377\237N\30\377\237N\30\377\245P\30\377" + "\245P\30\377\245P\30\377\237N\30\377\244Q\31\377[4\30\377\26\21\13\343\10" + "\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10\252&\30\13\377c/\20\377t;\21\377" + "~A\25\377\216E\25\377\231L\30\377\235J\30\377\233L\30\377[4\30\377\27\22" + "\14\343\10\7\5\34\0\0\0\0\0\0\0\0\15\12\10""9h4\25\377\253T\32\377\233L\30" + "\377\244Q\31\377\255Q\32\377\264X\33\377\264X\33\377\261V\32\377\251P\32" + "\377\\7\31\377\26\21\13\343\10\7\5\34\0\0\0\0\0\0\0\0\15\12\10""9r?\31\377" + "\261V\32\377r8\21\377\\.\15\377\\/\13\377].\14\377\\.\15\377`0\15\377\\." + "\15\377\22\14\5[\0\0\0\0\0\0\0\0\10\6\3(7\35\12\377l2\17\377r8\21\377\202" + "C\25\377\231L\30\377\241R\30\377\253T\32\377\263T\32\377\263T\32\377\31\21" + "\12\216\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\252@'\25\377\242T\33\377\263X\34" + "\377\267Z\34\377\265Y\34\377\265Y\34\377\254X\33\377\234M\31\377X2\27\377" + "\26\21\13\343\10\7\5\34\0\0\0\0\0\0\0\0\15\11\6""9`0\23\377\231G\26\377\206" + "E\25\377\24\16\11\301\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6q|>\31\377\271[\34\377" + "\251P\32\377\26\17\11\216\0\0\0\0\0\0\0\0\13\10\6""9o=\30\377\270Z\33\377" + "\261V\32\377\27\20\12\255\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6qr;\27\377\220I\25\377~?\25\377\24" + "\16\11\216\0\0\0\0\0\0\0\0\13\11\6""9a3\24\377\230G\27\377\206E\25\377\24" + "\16\11\273\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7`a0\22\377\214G\25\377\212G\25" + "\377\24\17\11\216\0\0\0\0\0\0\0\0\10\6\3(4\34\11\377]2\14\377X-\13\377\16" + "\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\15\12\10R[0\20\377\204G\25\377?$\22\377\12\10\7\210\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\6\6>\37\25\14\364|B\27\377\206E\25\377\24\17\11\216" + "\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377].\14\377P'\13\377\16\12\5\216\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X,\13\377\16\12\5t\0\0" + "\0\0\0\0\0\0\0\0\0\0\11\7\4\231\32\21\6\377J'\13\377X-\13\377X-\13\377X-" + "\13\377X-\13\377X,\13\377X,\13\377)\27\10\377\14\11\5\343\5\4\4\21\0\0\0" + "\0\0\0\0\0\10\6\3\"6\35\11\377\\+\13\377X,\13\377X-\13\377\\+\13\377\\/\13" + "\377\\/\13\377X-\13\377X,\13\377-\31\10\377\14\12\5\343\6\5\3\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\15\12\6\252(\30\13\377a0\20\377q7\20\377s8\20\377t9\21\377" + "t9\21\377q7\20\377q7\20\377\25\377\270^\25\377u>\26\377\21\14\10\343" + "\7\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6" + "\252C#\20\377\244U\25\377s:\20\377\24\16\7\374\10\6\5U\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4RB%\15\377\221K\22\377\232N\21\377s" + ":\20\377\35\22\10\377\16\12\7\377\20\13\7\377A\"\14\377\226J\23\377\275a" + "\26\377\212O\33\377\16\14\11\216\0\0\0\0\0\0\0\0\7\6\6""97!\20\377\236Q\23" + "\377\242P\23\377f5\21\377\30\17\7\377\23\14\6\252\16\12\5\314.\32\11\377" + "\211C\20\377\213G\20\3771\33\12\377\7\6\4i\0\0\0\0\0\0\0\0\7\6\6>H.\27\377" + "\307s\40\377\315o\34\377\233T\32\377)\30\16\377\22\15\11\377\31\20\12\377" + "n=\31\377\307d\34\377\315p\36\377\222W\35\377\15\13\10\216\0\0\0\0\0\0\0" + "\0\12\10\7\223\264W\31\377\316o\33\377\313i\32\377\244U\33\377(\30\17\377" + "\24\16\11\377\32\21\13\377y@\32\377\311e\34\377\315p\36\377\222W\35\377\16" + "\13\7\216\0\0\0\0\0\0\0\0\10\6\5""9G,\26\377\300l\31\377\306e\27\377\226" + "N\31\377)\30\16\377\40\25\15\377J)\25\377\270i\33\377\312h\31\377\312v\33" + "\377\256f\37\377\21\16\12\216\0\0\0\0\0\0\0\0\13\11\6\210\266\\\31\377\316" + "p\35\377\315o\34\377\246O\33\377+\31\20\377\25\17\12\377\35\23\14\377tC\33" + "\377\312k\37\377\316q\37\377\222W\35\377\14\12\7\216\0\0\0\0\0\0\0\0\13\10" + "\6\220\271]\32\377\312g\27\377\235M\22\377S*\14\377\23\15\6\377\15\12\6\377" + "\24\15\7\377\33\21\10\377\34\22\11\343\12\10\5-\0\0\0\0\0\0\0\0\13\11\6\216" + "\213I\24\377\306`\25\377\307j\30\377\233N\32\377)\31\16\377\25\17\12\377" + "\34\22\13\377&\30\17\377(\30\17\343\16\12\7>\0\0\0\0\0\0\0\0\10\7\5""9A)" + "\24\377\305l\34\377\315o\34\377\252X\33\377+\33\20\377\23\16\12\377\35\23" + "\14\377{B\30\377\265T\24\377\252W\23\377r<\21\377\13\12\6\216\0\0\0\0\0\0" + "\0\0\13\11\6Uw<\17\377\232K\21\377\232N\21\377\22\15\7\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\15\12\10\252\277f\36\377\321v\36\377\317q\36\377\34\23\13\311" + "\0\0\0\0\0\0\0\0\15\12\10i\246W\27\377\306e\27\377\306a\27\377\32\22\13\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\15\12\10\252\275d\34\377\316o\33\377\314f\33\377\34\24\13\311\0" + "\0\0\0\0\0\0\0\14\12\7t\270]\33\377\316k\33\377\313q\32\377\27\21\12\377" + "\0\0\0\0\0\0\0\0\6\5\5\34\31\22\14\364\300i\33\377\316p\35\377\317u\36\377" + "\40\26\15\252\0\0\0\0\0\0\0\0\13\11\6Xp9\15\377\217F\20\377\215E\20\377\21" + "\14\6\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\16\13\11\252\270\\\31\377\316o\33\377\300o\37\3771!\22\377\12\10\7z\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\7\6;\26\20\13\350\247d\34\377\315p\36\377\315t\36" + "\377\32\22\13\322\0\0\0\0\0\0\0\0\10\7\3Un6\15\377\215E\20\377\215K\20\377" + "\31\20\6\377\5\4\4(\0\0\0\0\0\0\0\0\12\10\5Up7\15\377\215K\20\377\215K\20" + "\377\24\15\5\252\0\0\0\0\0\0\0\0\5\4\2\34!\24\10\377\202B\17\377\215H\20" + "\377p7\15\377-\31\10\377\32\21\6\377!\24\10\377^/\15\377\215E\20\377\220" + "G\21\377P(\15\377\11\7\4}\0\0\0\0\0\0\0\0\12\10\5Up9\15\377\224O\21\377\215" + "K\20\377W*\14\377\23\15\6\377\16\12\5\327\17\12\6\377<\37\13\377\217G\22" + "\377\240R\23\377`6\21\377\14\11\7\216\0\0\0\0\0\0\0\0\10\6\5""9G,\26\377" + "\300d\31\377\307j\30\377\271]\32\377[2\26\377:!\21\377H)\23\377\236Q\31\377" + "\307j\30\377\307j\30\377\212O\33\377\15\13\10\216\0\0\0\0\0\0\0\0\12\10\7" + "\223\246W\27\377\313l\30\377\312l\31\377\231M\32\377&\26\15\377\17\13\6\377" + "\16\12\5\3774\34\11\377\204F\17\377\215K\20\377P)\15\377\12\10\5\213\0\0" + "\0\0\0\0\0\0\7\6\6""90\35\15\377\232O\23\377\240U\23\377l8\21\377\36\22\11" + "\377\20\13\7\377\30\17\11\377`3\21\377\247V\24\377\265X\24\377\214K\27\377" + "\22\16\11\220\0\0\0\0\0\0\0\0\0\0\0\0\26\16\7\301\26\15\7\377\24\15\7\377" + "N(\17\377\245Q\24\377\261Z\24\377\261Z\24\377s:\24\377\40\24\13\377\30\17" + "\11\377\36\23\11\343\13\10\6""6\0\0\0\0\0\0\0\0\13\11\6\216\213D\24\377\246" + "N\23\377\220G\21\377\23\14\6\327\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\210r8\15" + "\377\217F\20\377\213D\20\377\23\15\6\252\0\0\0\0\0\0\0\0\12\7\5Up7\15\377" + "\217F\20\377\213J\20\377\21\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\210r" + "8\15\377\217F\20\377\215K\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\6\4Un6\15" + "\377\215E\20\377\215H\20\377\21\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\11\7\4\210r8\15\377\217I\20\377\213J\20\377\23\15\6\252\0\0\0\0" + "\0\0\0\0\10\6\3Un6\15\377\217L\20\377\215E\20\377\22\14\5\374\0\0\0\0\0\0" + "\0\0\0\0\0\0\13\11\6\252\203E\22\377\252W\23\377\250V\23\377\34\23\11\252" + "\0\0\0\0\0\0\0\0\13\10\6U\221J\32\377\314f\33\377\313i\32\3774!\21\377\6" + "\5\5""9\0\0\0\0\0\0\0\0\21\16\12\343\276k\31\377\314q\31\377\256V\33\377" + "\22\15\11\252\0\0\0\0\0\0\0\0\0\0\0\0\34\22\13\306%\27\16\377\40\25\15\377" + "\25\17\12\377\24\16\11\377&\27\13\377W,\14\377\211F\20\377\215H\20\377\217" + "F\20\377\215H\20\377\22\14\5\252\0\0\0\0\0\0\0\0\11\6\4Un6\15\377\221J\20" + "\377\215E\20\377^/\15\377\33\21\10\343\14\10\5\34\0\0\0\0\0\0\0\0\16\12\7" + "Uy>\22\377\254W\23\377\213E\22\377\24\17\11\343\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\16\10\343u=\30\377\307" + "d\34\377\315j\32\377\314n\33\377\32\22\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\7\5\34\24\17\13\343\207I\26\377\300a\25\377\245S\26\377!\26\14\377" + "\12\11\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\13\11\6\252\270a\33\377\316p\35\377\314n\33\377\34\23\13\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\263]\30" + "\377\312g\27\377\306a\27\377\26\17\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\7\6\252}?\22\377\236M\21\377\222K\21\377\21\14\6\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\6\5LH.\27\377\305l\34\377\311k\30\377\244U\33\377%\26\16\343" + "\15\11\6""0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\11\7\252\212C\23\377\252O\23\377\250V\23\377\24\16\11\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\7\5\24\25\17\12\270\32\21\13\377\32\21\13\327\14\11\7J\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\24\25\17\12\270\32\21\13\377\37\25" + "\14\317\22\15\11\34\0\0\0\0\0\0\0\0\13\11\10\234\270]\33\377\320i\35\377" + "\315o\34\377\34\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\270\\\31\377\313h\30\377\310" + "b\27\377\32\22\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""93\35\14\377\230K\23" + "\377\242V\23\377\23\15\10\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23\15\6\371\\.\15\377{?\16\377N'\13\377\25" + "\17\6\343\11\10\4\34\0\0\0\0\0\0\0\0\11\10\4Un;\15\377\215E\20\377\215K\20" + "\377\25\16\6\252\0\0\0\0\0\0\0\0\0\0\0\0\20\13\5\2524\34\11\377s;\16\377" + "t<\17\377+\32\12\377\11\7\6}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\34\25" + "\21\12\343m;\22\377\240R\23\377y@\22\377>\"\15\377^5\21\377\225N\24\377f" + "6\23\377\40\26\13\377H'\17\377y>\22\377\30\21\11\273\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3\247\200" + "B\17\377\241U\21\377\237Q\22\377\30\17\7\262\0\0\0\0\6\5\3%0\34\13\377\255" + "\\\24\377\265`\24\377\25\17\10\335\0\0\0\0\6\5\3\34(\30\11\377\217J\22\377" + "\236P\21\377\25\17\6\265\0\0\0\0\0\0\0\0\12\10\5""6k3\16\377\235S\22\377" + "\244T\23\377\260Y\23\377\275\\\24\377\277b\26\377\276j\27\377\305n\32\377" + "\313l\30\377\313u\30\377\315w\32\377\317z\36\377\307v\40\377\40\27\15\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U\26\17\7\350q6\16\377\222K\21\377\236P\21" + "\377\232N\21\377\236P\21\377\224L\21\377\213G\20\377\207B\20\377\207B\20" + "\377\25\16\6\210\0\0\0\0\0\0\0\0\12\10\5U\200B\17\377\241U\21\377\236P\21" + "\377\31\20\6\314\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\34\31\20\10\343f2\17\377\224" + "L\21\377\216I\21\377T-\15\377\12\10\5q\0\0\0\0\0\0\0\0\11\7\4Rk5\16\377\222" + "K\21\377T)\15\377\10\7\5\306\3\2\2\27\5\4\4\210&\27\11\377\210F\21\377\214" + "H\21\377\25\17\6\262\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6" + "\4""9-\32\12\377\217J\22\377\236P\21\377\32\21\6\252\0\0\0\0\0\0\0\0\0\0" + "\0\0\30\20\7\343s:\20\377\224L\21\377.\32\11\377\7\6\4\234\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\5\4\4G\23\15\6\377\213G\20\377\214H\21\377+\32\12\377" + "\11\10\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5Um4\16\377&\27\11\377\6" + "\5\3U\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\34\17\14\6\343s8\20\377\35\23\10\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\6" + "qz@\25\377\244U\25\377\212G\21\377\25\17\6\241\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15" + "\12\6\343\211C\20\377\232K\21\377T-\15\377\12\10\5t\0\0\0\0\0\0\0\0\11\7" + "\4Uo7\16\377\236W\21\377\236P\21\377\23\15\6\377\4\4\3\34\0\0\0\0\3\3\2q" + "\21\14\6\377\213G\20\377\241U\21\377\222K\21\377\24\16\7\322\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\15\11n\270i\33\377\321{\36\377\322|\37\377\320{\37" + "\377\317z\36\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\15\13\10\223\217K\24\377\241U\21\377\236P\21\377\33\22\10\343\5\4\2" + "\34\0\0\0\0\0\0\0\0\12\7\5\306\203A\20\377\241U\21\377\226L\21\377\25\16" + "\6\252\0\0\0\0\0\0\0\0\12\10\5U{=\20\377\243S\22\377\236P\21\377\33\22\10" + "\343\5\4\2\34\0\0\0\0\0\0\0\0\11\7\4\306\202B\17\377\243S\22\377\224L\21" + "\377\25\16\6\301\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\4U\26\17\7\377\203A\20\377\232N\21\377\232N\21\377\232N\21\377\232N" + "\21\377\25\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\243V\22\377\264" + "[\23\377\35\24\12\377\3\3\2]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5zy<\20\377\241U\21\377\237Q\22\377\30" + "\17\7\377\4\4\3\"\0\0\0\0\2\2\1\6\21\15\10\265\265]\26\377\313l\30\377\315" + "r\32\377\40\27\15\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\5\4\4\241\36\26\15\377\306t\35\377\316j\31\377\277`" + "\24\377\32\21\7\252\0\0\0\0\0\0\0\0\11\7\4Ut<\17\377\241U\21\377\236P\21" + "\377\25\16\6\377\5\4\2\34\0\0\0\0\2\2\1\3\14\11\7\327\276k\31\377\323|\36" + "\377\320\206%\377\40\26\15\262\0\0\0\0\0\0\0\0\15\13\10`\273p\40\377\321" + "{\36\377\277`\24\377\34\23\11\377\4\3\3J\0\0\0\0\3\2\2\34\15\12\10\343\304" + "x\37\377\323|\36\377\307j\30\377\33\23\12\252\0\0\0\0\0\0\0\0\15\12\6""9" + "r=\23\377\262[\25\377\266f\27\377\27\21\12\255\0\0\0\0\0\0\0\0\13\11\6[\222" + "U\31\377\306q\35\377\304x\37\377\33\24\14\317\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\5\5\4\34\25\21\14\343\276v!\377\321\203(\377\241d\"\377\21\16" + "\12\343\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\10\6\252[;\34\377\275^\30\377\242S\23\377'\31\14\377" + "\7\7\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\216\267g\30\377" + "\313p\30\377\313p\30\377*\32\15\371\5\4\4>\0\0\0\0\3\2\2\31\14\11\7\343\303" + "s\36\377\324\177#\377\323\204&\377\40\26\15\265\0\0\0\0\0\0\0\0\14\12\7U" + "|A\21\377\241U\21\377\237N\22\377\25\16\6\377\5\4\2\34\0\0\0\0\0\0\0\0\7" + "\6\4\340\205D\20\377\237Q\22\377\222H\21\377\26\16\7\252\0\0\0\0\0\0\0\0" + "\15\13\10[\271o\40\377\322}!\377\315r\32\377%\32\16\377\4\4\3U\0\0\0\0\4" + "\4\4\34\15\12\10\343\301i\32\377\316o\33\377\312v\33\377\40\26\15\252\0\0" + "\0\0\0\0\0\0\13\11\6\177\256[\27\377\312f\25\377\310i\25\377$\27\15\377\4" + "\4\3U\0\0\0\0\3\3\2\34\15\13\10\343\306v!\377\324\177#\377\320\200!\377\37" + "\26\14\265\0\0\0\0\0\0\0\0\15\13\10[\271r\36\377\323|\36\377\320z\35\377" + "\"\30\15\377\4\4\3U\0\0\0\0\7\6\6q\40\30\15\377\271_\26\377\312b\25\377\306" + "a\27\377!\26\14\252\0\0\0\0\0\0\0\0\12\10\7\234\276l\33\377\324~!\377\323" + "\177$\377(\32\17\377\4\4\3U\0\0\0\0\3\3\2\34\15\13\10\343\306v!\377\326\201" + "%\377\323\204&\377\40\27\15\255\0\0\0\0\0\0\0\0\12\10\7\220\247W\26\377\271" + "^\24\377\245W\22\377\31\21\10\377\3\3\2""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\303p\36\377\322}!\377\320u\35\377" + "'\32\16\377\4\4\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\12\7\226\270l\33\377\323|\36\377\323\177$\377(\33\17\377\4\4\3U\0\0" + "\0\0\3\3\2\34\21\15\10\262\212G\21\377\241U\21\377\233O\22\377\25\16\6\252" + "\0\0\0\0\0\0\0\0\12\10\5U|=\17\377\251Y\22\377\264[\23\377\31\22\12\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\304q\37\377\323|\36\377\315w\32\377\32" + "\22\13\314\0\0\0\0\0\0\0\0\13\11\6X\206F\23\377\255W\22\377\250V\23\377\24" + "\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\15\13\10\252\304q\37\377\322}!\377\317z\36\377\30\22\13" + "\324\0\0\0\0\0\0\0\0\13\11\6w\264]\27\377\313l\30\377\312g\27\377\24\17\11" + "\377\0\0\0\0\0\0\0\0\17\15\12\303e?\32\377\312u\31\377\316\200#\377\240j" + "#\377\17\15\12\216\0\0\0\0\0\0\0\0\12\10\5\223\213F\24\377\277`\24\377\310" + "i\25\377\31\22\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\15\12\10\252\275c\32\377\316s\33\377\315j\32\377\271j\34\377" + "O4\32\377\12\11\7z\0\0\0\0\7\6\6*$\33\21\364\254j#\377\317\200\"\377\323" + "~\"\377\323\177$\377\30\22\13\343\0\0\0\0\0\0\0\0\12\10\5U|@\17\377\237Q" + "\22\377\236P\21\377L(\15\377\13\10\6\322\0\0\0\0\0\0\0\0\14\11\5U\201@\20" + "\377\241U\21\377\236P\21\377\32\20\7\252\0\0\0\0\0\0\0\0\11\7\4Us8\20\377" + "\241U\21\377\237Q\22\3771\33\12\377\7\6\4\252\5\4\4U\6\5\3q\32\23\13\377" + "\271_\26\377\312f\25\377\305h\26\377\34\24\13\255\0\0\0\0\0\0\0\0\15\12\6" + "f\247W\26\377\310e\25\377\311f\26\377\40\25\13\377\4\3\3A\0\0\0\0\2\2\1\21" + "\14\12\7\335\276b\27\377\320t\33\377\314n\33\377\36\25\13\265\0\0\0\0\0\0" + "\0\0\15\13\10[\271r\36\377\323|\36\377\321{\36\377V7\31\377\11\10\6\273\6" + "\6\5U\7\6\6\202\40\30\17\377\310z\37\377\321{\36\377\316z\37\377\40\27\15" + "\255\0\0\0\0\0\0\0\0\12\10\7\220\277q\36\377\324\177#\377\322~#\377(\33\17" + "\377\4\4\3U\0\0\0\0\2\2\1\10\13\11\6\324\235Q\24\377\275\\\24\377\276a\25" + "\377\33\23\12\262\0\0\0\0\0\0\0\0\14\12\7`\267i\34\377\321{\36\377\315r\32" + "\377$\30\15\377\4\4\3U\0\0\0\0\4\4\4\34\22\16\11\273\303s\36\377\323|\36" + "\377\322\202#\377#\32\16\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\2" + "\2\34\14\12\7\343\303s\36\377\323|\36\377\321{\36\377&\31\17\377\4\4\3U\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\302s\37\377\321z\34\377" + "\304c\25\377\25\17\10\377\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\231O\24\377" + "\273[\24\377\265`\24\377\36\24\11\262\0\0\0\0\0\0\0\0\15\12\6`\227O\24\377" + "\273[\24\377\265`\24\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7\252" + "\222L\23\377\247X\22\377\236M\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5" + "U\205B\20\377\247X\22\377\250V\23\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\14\11\7\252\233P\24\377\271^\24\377\265`\24\377\26\20" + "\11\335\0\0\0\0\0\0\0\0\6\6\5*3\35\14\377\226Q\23\377\245W\22\377*\32\13" + "\377\5\5\4l\0\0\0\0\5\5\4\34\22\17\13\377\303r\34\377\317{\40\377\236^\37" + "\377\21\15\12\216\0\0\0\0\0\0\0\0\6\5\5""92\"\23\377\277o\40\377\320u\35" + "\377qI\36\377\12\12\11\343\6\6\5}\7\7\6\306*\35\21\377\273`\26\377\246W\27" + "\377*\33\17\377\10\6\5n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\5\5\4\270\25\20\10\377j6\17\377\232N\21\377\227M\22\377\\" + "0\17\377\13\11\6w\0\0\0\0\0\0\0\0\12\10\5]\203E\22\377\275\\\24\377\310i" + "\25\377!\26\14\377\5\4\4""6\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6UL5\31\377\310" + "v\37\377\314r\33\377A+\26\377\6\6\5q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\21\16\13\11\343\303o\34\377\316s\33\377" + "\314i\31\377\30\21\13\377\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\15\12\6\343}B" + "\22\377\245T\22\377\241U\21\377\241U\21\377\233O\22\377\34\23\11\377\6\5" + "\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10DV8\33" + "\377\314~!\377\322}!\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\303s\36\377\321{\36\377\317z\36" + "\377\33\23\14\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4" + "\270\203A\20\377\241U\21\377\232N\21\377\17\13\6\371\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\255" + "\246W\27\377\306h\25\377\304c\25\377#\27\14\377\3\3\2U\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\302s" + "\37\377\323|\36\377\317z\36\377\33\23\14\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\304q\37" + "\377\325\204$\377\323\177$\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\233P\24\377" + "\271^\24\377\264[\23\377\25\17\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\270" + "\267d\32\377\320t\33\377\314r\33\377\32\22\13\377\4\4\4\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177w<\17\377\240U\23\377" + "[0\20\377\12\10\5\343\4\4\3\34\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\241\203C\20" + "\377\237Q\22\377\237N\22\377\22\15\7\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\4\2529\"\16\377\260Z\25\377\303_\26\377\32\23\13\350\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\21\16\12c\263j\34\377\317z\36\377\264m!\377\31\24\14\377" + "\7\6\6\252\24\21\13\377\304r\33\377\320u\35\377\313|\36\377\254j#\3775$\24" + "\377\12\11\7l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\11\10\6\252\237R\24\377\312g\27\377\316o\33\377\26\21" + "\13\377\0\0\0\0\0\0\0\0\12\11\7\213sJ\36\377\325\2050\377'\34\20\377\0\0" + "\0\0\0\0\0\0\11\10\4qC'\16\377\265\\\24\377\30\22\11\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\34\23\11\343\213O\32\377\316u\37\377\324{%\377\326~)\377\254j#\377" + "5\"\22\377zN\37\377\323\177,\377\331\2102\377\330\2071\377\276z)\377A+\26" + "\377\16\13\7U\0\0\0\0\0\0\0\0\7\6\4\34\35\25\12\371\231O\24\377\256U\23\377" + "g5\20\377\21\14\6\364\23\15\6\252\25\16\6\252\33\21\6\252\25\16\6\324\25" + "\16\6\377\31\21\6\340\14\11\5-\0\0\0\0\0\0\0\0\0\0\0\0\30\20\7\231\26\17" + "\7\377\32\20\7\322\14\11\5(\0\0\0\0\0\0\0\0\10\7\5\34\21\15\10\343r=\23\377" + "\256U\23\377\232O\23\377\12\11\5\210\14\12\7\252\16\13\7\252" + "\15\12\6\252\13\11\6\306\37\25\12\377\231R\22\377\261U\22\377\251N\22\377" + "\26\17\7\314\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9\13\12\6\216\23\21" + "\14\252\27\25\20\252\31\26\20\252\27\25\20\252\25\23\16\252\17\16\12\252" + "\12\12\11q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\2317\40\16\377" + "\257]\24\377\271^\24\377\267Y\23\377P,\21\377\15\13\10\273\7\6\6\31\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5>\13\12\6\216\20\16\13\252\27\23\16\252" + "\31\26\20\252\27\25\20\252\23\21\14\252\17\16\12\252\21\17\12\252\23\21\14" + "\216\11\10\10\34\0\0\0\0\0\0\0\0\14\12\11\252\314\2111\377\334\222;\377\332" + "\2225\377\215[&\377\23\21\14\343\23\21\14\252\30\24\17\252\25\23\16\252\17" + "\16\12\252\12\12\11q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7""9" + "\16\14\7f\16\13\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\7""9\15\13\10i\17\15\10U\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" + "\252\314\210/\377\334\222;\377\332\231;\377\30\23\15\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\7\5R\13\12\6\234\13\11\6\252\12\11\7[\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\10\5\177\220N\23\377\264W\23\377\256Q\23\377\30\17\7\322\0\0\0\0\0\0" + "\0\0\0\0\0\0\16\13\7D\14\12\7\252\14\12\7\252\21\17\12\252\30\24\17\252\23" + "\21\14\252\17\16\12\252\22\17\13\252\30\25\17\252\25\23\16\252\17\16\12\252" + "\13\12\10q\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12w\21\17\14\252" + "\17\15\12\252\20\16\13\252\23\21\14\252\25\22\14\252\22\17\13\252\17\15\10" + "\252\13\11\6\252\12\10\7X\6\5\5\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\12\11\7U\16\14\11\252\23\21\14\252\25\23\16\252\25\23\16\252\25\23\16" + "\252\23\21\14\252\17\16\12\252\13\12\10t\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\16\12w\22\17\13\252\17\16\12\252\22\17\13\252\25\23\16\252\31" + "\26\20\252\27\25\20\252\25\23\16\252\20\16\13\252\13\12\10q\7\7\6\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7U\16\14\11\252\23\21\14\252\24" + "\22\15\252\24\22\15\252\27\23\16\252\23\21\14\252\17\16\12\252\21\16\12\252" + "\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12q\22\17\13\252\17" + "\16\12\252\22\17\13\252\25\23\16\252\31\26\20\252\27\25\20\252\24\22\15\252" + "\20\16\13\252\13\12\10q\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\7\6R\13\12\6\216\20\15\11\252\23\21\14\252\25\23\16\252\30\25\17\252\31" + "\26\20\252\31\26\20\252\17\15\12\252\14\13\11""9\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\15\12\252aA\"\377\321\204*\377\326\210+\377\326\177+\377\237" + "g*\377\25\23\16\343\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\25\23\16" + "\252\22\17\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12}\25" + "\23\16\252\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12q\25\23" + "\16\252\22\20\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12" + "}\25\23\16\252\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12q" + "\25\23\16\252\22\20\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\17\16\12}\25\23\16\252\23\21\14\216\11\11\10\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\21\16\12\202\33\30\20\252\25\23\16\216\12\11\7\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\34\30\21\252\30\25\17\241\14\13\11\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\25\23\16\252\22\17\13\231\13\12\10\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12}\25\23\16\252\23\21\14\216\11\10" + "\6\34\0\0\0\0\0\0\0\0\0\0\0\0\22\17\13\210\23\20\12\252\20\15\11\252\20\16" + "\11\252\17\15\10\252\15\13\10\252\14\13\11\252\15\14\10\252\17\16\12\252" + "\16\15\13\252\13\13\12q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10" + "\252\276b\27\377\314t\37\377J4\33\377\11\10\10q\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\15\13\10\252\300j\35\377\320p\33\377\320u\35\377\33\25\14\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\33\27\20\377\307y,\377\326\213)\377" + "\37\27\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\34\40\30\15\343$\32" + "\17\377\23\20\14\306\10\10\7""3\0\0\0\0\10\10\7""9\35\25\14\3320\40\21\377" + "-\36\20\377\24\20\13\332\12\11\7i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\314\2023\377" + "\340\231M\377\341\251X\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\25\23\16\327" + "\331\243V\377=.\34\377\0\0\0\0\0\0\0\0\0\0\0\0\23\20\14\311\313y(\3773&\26" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\31\20\16\13\343\324\223G\377\340\240M" + "\377\337\241P\377\37\31\20\377\4\4\4f\12\12\11\327\316\2057\377\337\234F" + "\377\340\244U\3773'\30\377\5\5\4R\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10n\262b" + "\33\377\323s\36\377\323y\"\377$\32\17\377\3\3\2U\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5\34\33\24\12\350}I\26\377\276a\25\377\264" + "\\\25\377a8\24\377\16\13\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\216" + "\245Y\26\377\306h\25\377T2\23\377\7\6\4\237\0\0\0\0\5\5\4R\40\27\13\377y" + "E\26\377a8\24\377\17\15\10\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\14\7\306\254\\\25\377\34\23\11\317\0\0\0\0\0\0" + "\0\0\13\12\6U\224N\25\377\306h\25\377\300a\25\377\25\17\10\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\5\252\247Z\26\377\312]\25\377" + "\312g\27\377\25\20\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\205" + "\24\20\11\377\227P\26\377K*\20\377\12\10\7\377\40\26\13\377\244V\27\377<" + "'\21\377\5\5\4\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\14\13\11\306\325\233P\377\340\246S\377\323y\"\377\24\20" + "\11\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\6\6\5""3\33\24\12\377\240T\27\377\306h\25\377C(\20\377\10" + "\7\5}\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\303p\36\377\327}&\377\331\205" + "2\3771#\26\377\5\5\4\205\15\14\12\322\275w2\377\323\177,\377\324y)\377\332" + "\2075\377\334\224?\377\"\33\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\4\4\4\21\15\14\12\343\304q\37\377\324v#\377\326{+\377!\32\20\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\273\320\2067\377\337\222F\377" + "\335\230F\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\244\245V\26\377\312b\25\377\306`" + "\25\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5U\40" + "\26\13\377\247W\26\377\240T\27\377]6\24\377xA\25\377\274`\25\377\304c\25" + "\377\310i\25\377\30\23\13\317\0\0\0\0\0\0\0\0\17\16\12n\320\230G\377\343" + "\256b\377\344\263g\377\341\260b\377\331\251^\377\325\246\\\377\327\247\\" + "\377\325\233P\377\314\2107\377\212Y%\377\31\26\20\343\11\11\10\34\0\0\0\0" + "\0\0\0\0\13\12\10\252\313\2012\377\337\225F\377\336\236K\377\37\31\20\377" + "\4\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\7""91(\32" + "\377\316\230S\377\340\251[\377\302\214G\377\37\33\24\377\11\10\10\34\0\0" + "\0\0\0\0\0\0\14\12\11\241\304n!\377\332\2023\377\336\236K\377\37\31\20\377" + "\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\325\240T\377\344\264i\377\343\257" + "d\377!\34\22\317\0\0\0\0\0\0\0\0\14\13\11\202\322\233M\377\344\251c\377\342" + "\254_\377\36\31\21\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\314\2011\377" + "\326\177+\377\325}(\377\27\23\14\350\0\0\0\0\0\0\0\0\16\15\11}\320\230G\377" + "\337\237L\377\332\231;\377!\32\20\322\0\0\0\0\0\0\0\0\15\14\12\177\306v'" + "\377\327\177*\377\325~*\377)\37\22\343\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\31" + "\25\20\343\314\226O\377\337\253b\377\257z<\377\22\17\13\332\5\4\4\21\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\15U\261e\"\377\314{%\377\307u" + "$\377\307u$\377\312z%\377\307u$\377\306r\37\377\306n\37\377\312v#\377.!\25" + "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\231nN%\377\325" + "\242R\377\332\244W\377C3\36\377\11\10\10U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\34\25\23\16\377\331" + "\246\\\377\343\257d\377\340\251[\377\37\31\20\327\0\0\0\0\0\0\0\0\14\12\7" + "U\232P\25\377\305c\24\377\300a\25\377\34\24\11\377\4\3\3n\13\11\6\252u?\24" + "\377\270^\25\377\306h\25\377\313h\30\377\322z%\377\25\21\14\374\0\0\0\0\0" + "\0\0\0\12\11\7\241\313\2012\377\340\240M\377\341\251X\377\36\31\21\377\4" + "\4\4\34\0\0\0\0\0\0\0\0\10\7\5\276\245V\26\377\306h\25\377\304c\25\377\34" + "\23\11\252\0\0\0\0\0\0\0\0\15\13\10U\260[\27\377\320p\33\377\322y#\377\33" + "\26\16\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\323\225L\377\340\250W\377" + "\340\242Q\377\40\32\21\322\0\0\0\0\0\0\0\0\14\12\7q\260[\27\377\312k\27\377" + "\312_\27\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\240T\377\344\264i\377\343" + "\256b\377!\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\233P\377\342" + "\254_\377\340\247U\377\27\24\16\364\0\0\0\0\0\0\0\0\13\12\10\177\275h\34" + "\377\326\177+\377\335\224F\377\37\31\20\377\4\4\4\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\303q\40\377\321u\34\377" + "\312g\27\377\24\17\11\374\3\3\3\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\17\16\12\252\325\233P\377\342\254_\377\335\230F\377\34" + "\30\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\16\14\11\252\320\215=\377\341\242X\377\343\256b\377!\32" + "\22\377\4\4\4\34\0\0\0\0\0\0\0\0\12\10\7\306\266b\27\377\312g\27\377\306" + "h\25\377\34\23\11\252\0\0\0\0\0\0\0\0\13\12\6U\232P\25\377\312b\25\377\312" + "g\27\377\31\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\272d\27\377\312c\27\377\310i\25" + "\377\36\25\11\252\0\0\0\0\0\0\0\0\14\11\7U\232P\25\377\306h\25\377\304c\25" + "\377\34\24\11\377\4\4\3q\13\12\6\343\267d\32\377\324\177+\377\247u4\377\21" + "\17\14\327\5\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\340" + "\246S\377\337\241P\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\247W\26\377\306\\\25\377\304c\25\377" + "\304_\25\377\306\\\25\377\303c\26\377\300j\35\377\316\177+\377\331\215<\377" + "\337\222F\377\340\245Q\377\334\224?\377\324|'\377\31\23\14\327\0\0\0\0\0" + "\0\0\0\14\13\11t\304t%\377\332\2153\377\332\2137\377\332\216=\377\327\217" + ":\377\30\23\15\324\0\0\0\0\12\11\7\234\313\2012\377\335\226B\377\334\224" + "?\377\31\25\16\343\0\0\0\0\0\0\0\0\12\12\7\237\314\206;\377\341\240T\377" + "\341\251X\377$\35\23\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\314\2023\377" + "\334\216;\377\332\2137\377\25\22\14\371\0\0\0\0\0\0\0\0\13\12\10\216\316" + "\221C\377\342\254_\377\343\256b\377\40\32\21\377\4\4\4\34\0\0\0\0\0\0\0\0" + "\13\12\10\306\306u%\377\327}&\377\323z$\377\34\25\15\327\0\0\0\0\0\0\0\0" + "\15\13\10`\256[\27\377\312k\27\377\312g\27\377\26\21\11\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\13\12\6\252\260[\27\377\312g\27\377\313l\30\377\25\17\12\356\0" + "\0\0\0\0\0\0\0\13\12\10\216\316\221C\377\342\252[\377\340\240U\377\36\30" + "\21\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\321\225F\377\340\240M\377\336" + "\236K\377\37\31\20\324\0\0\0\0\0\0\0\0\14\13\11\177\306t#\377\327}&\377\323" + "z$\377\34\25\15\377\4\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\10\252" + "\303p\36\377\321n\36\377\317i\36\377\31\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\325\236P\377\342\254_\377\340\244U" + "\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\322\217A\377\340\250" + "W\377\340\245Q\377\31\25\16\350\0\0\0\0\0\0\0\0\12\12\11\231\320\223C\377" + "\340\246S\377\336\236K\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252" + "\323\225L\377\337\225F\377\333\222<\377\31\24\16\353\0\0\0\0\0\0\0\0\12\12" + "\11\226\314\206;\377\340\234S\377\340\245Q\377!\33\22\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\323\226F\377\342\252[\377\342\254_" + "\377!\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\226eJ&\377\306\221" + "M\377\316\235W\377\312\227O\377\305\215J\377\310\222K\377\264~9\377\25\23" + "\16\343\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5q+\34\16\377\273`" + "\26\377\265]\26\377b7\25\377D*\21\377M.\22\377\201H\26\377\256Y\25\377S/" + "\22\377\13\11\6\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\6\6\5\34\20\16\13\303lL#\377\322\215;\377\332\242Q\377\247v6\377\20\16" + "\13\335\5\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\340\250" + "W\377\337\232P\377\37\31\20\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6" + "\6\5""9\"\33\21\377\313z$\377\320|)\377mL\"\377\15\14\12\216\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\260[\27" + "\377\312]\25\377\304c\25\377\34\23\11\252\0\0\0\0\0\0\0\0\13\11\6U\204G\25" + "\377\303c\26\377g;\24\377\13\12\6\252\3\3\2\31\6\6\5n7#\20\377\306q\35\377" + "\324\2063\377)\40\24\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\25\23\16\327\331\243V\3771&\30\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\13\12\10R6+\33\377\310\207;\377\322\211;\377\317\2032\377\315\177,\377" + "\307u$\377\303o\34\377\273e\30\377]6\26\377\23\17\12\343\7\6\6\34\0\0\0\0" + "\0\0\0\0\12\11\7\252\303m\40\377\332\2125\377\340\236Q\377\337\255_\377\333" + "\247^\377\331\251^\377\332\253a\377\331\246\\\377\320\210;\377nD\33\377\23" + "\17\12\343\6\6\5\34\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\252=*\24\377\274j!\377" + "\320\2067\377\327\243R\377\331\246\\\377\330\247X\377\330\247Y\377\323\226" + "F\377\222^'\377\32\25\17\345\11\10\6\34\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252" + "3\40\16\377\227P\26\377\251[\26\377\255V\26\377\251X\26\377\255V\26\377\264" + "\\\25\377\302b\25\377\304_\25\377\300a\25\377\37\25\12\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\7\2529%\22\377\275k\"\377\324\225C\377\331\246\\\377\331" + "\246\\\377\332\253a\377\327\243R\377\315~0\377tH\35\377\24\20\13\343\6\6" + "\5\34\0\0\0\0\0\0\0\0\13\11\6D~D\25\377\277b\26\377\302b\25\377\300a\25\377" + "\300a\25\377\277b\26\377\261[\26\377\32\23\11\216\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\12\7\252:%\21\377\271k\36\377\320\2067\377\330\247X\377\332\253a\377" + "\331\246\\\377\325\224H\377\314\2023\377\321\215<\377\323\237L\377\36\31" + "\21\252\0\0\0\0\0\0\0\0\12\12\7\247\322\233M\377\344\262c\377\340\245Q\377" + "\335\245V\377\331\246\\\377\332\251]\377\331\246\\\377\326\234Q\377\316\207" + "3\377tH\35\377\24\20\13\343\6\6\5\34\0\0\0\0\0\0\0\0\15\12\6""9s>\24\377" + "\251[\26\377\245V\26\377\30\22\11\247\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\14\12\7Xu?\24\377\272d\27\377\277k\40\377#\33\20\220\0\0\0\0" + "\0\0\0\0\12\12\7\252\322\233M\377\344\262c\377\335\230F\377\30\23\15\377" + "\0\0\0\0\0\0\0\0\14\12\7\252:$\17\377\235O\26\377\227P\26\377:#\17\377\13" + "\11\6""9\0\0\0\0\0\0\0\0\14\12\7U\235Q\24\377\305c\24\377\300a\25\377\34" + "\24\11\252\0\0\0\0\0\0\0\0\13\11\6""9s>\24\377\275^\30\377\306u%\377\325" + "\235L\377\332\253a\377\331\251^\377\326\241U\377\325\235L\377\324\225C\377" + "\320\2067\377\315~0\377\217`(\377\34\32\23\345\10\10\7\34\0\0\0\0\0\0\0\0" + "\15\14\10U\215J\30\377\276^\27\377\267_\30\377\267_\30\377\273]\30\377\275" + "a\26\377\265]\26\377\261[\26\377\251X\26\377Y4\24\377\25\22\14\343\11\11" + "\10\34\0\0\0\0\0\0\0\0\0\0\0\0\22\21\15\265gJ(\377\317\222J\377\326\234Q" + "\377\322\220C\377\320\2127\377\317\2014\377\315\2050\377\315~0\377\227e*" + "\377\34\32\23\350\11\10\10\34\0\0\0\0\0\0\0\0\15\14\12n\272\177?\377\326" + "\234Q\377\325\236P\377\325\233P\377\326\234Q\377\326\231K\377\325\224H\377" + "\325\224H\377\323\226F\377\237o6\377\34\31\23\361\11\10\10\37\0\0\0\0\0\0" + "\0\0\0\0\0\0\22\21\15\265gJ(\377\320\234Q\377\326\234Q\377\320\2127\377\321" + "\211<\377\325\236P\377\325\233P\377\325\240T\377\327\240X\377\325\243T\377" + "\36\30\21\262\0\0\0\0\0\0\0\0\14\13\11]\262y5\377\325\236P\377\322\217A\377" + "\323\222>\377\325\224H\377\327\243R\377\325\236P\377\324\225C\377\321\215" + "<\377\231j1\377\34\31\23\353\11\11\10\37\0\0\0\0\0\0\0\0\0\0\0\0\22\17\13" + "\255B+\25\377\273e\40\377\317\2044\377\322\220C\377\325\224H\377\326\234" + "Q\377\330\247X\377\326\234Q\377\260\200A\377.'\33\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\17\16\12U\265o*\377\327\2104\377\325}(\377\323z$\377\324{%\377\322{" + "'\377\312z%\377\37\30\16\252\0\0\0\0\0\0\0\0\14\13\11X\244Y\35\377\313z$" + "\377\307u$\377\36\27\17\324\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\177\273\205" + ">\377\325\224H\377\320\2127\377\37\30\20\252\0\0\0\0\0\0\0\0\15\14\12U\254" + "h%\377\321\2066\377\316\2073\377\40\31\21\324\0\0\0\0\0\0\0\0\0\0\0\0\17" + "\15\12\177\265t.\377\323\217>\377\322\231G\377\35\30\20\262\0\0\0\0\0\0\0" + "\0\15\14\12[\262y5\377\325\232F\377\320\2067\377\37\31\20\322\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12}\263n*\377\322\2077\377\320\213A\377" + "\32\25\17\270\0\0\0\0\0\0\0\0\16\15\11U\263u,\377\331\245R\377\325\243T\377" + "\33\27\20\335\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\210\256g'\377\316\177+\377" + "\307u$\377\37\30\16\252\0\0\0\0\0\0\0\0\14\13\11X\244Y\35\377\312v#\377\304" + "r!\377\35\26\16\322\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11}\251_\36\377\312w%\377" + "\307w'\377\30\23\15\276\0\0\0\0\0\0\0\0\16\14\11U\252_\35\377\306q\35\377" + "\307t\"\377\314\200/\377\316\2073\377\314\2011\377\314\2011\377\320\2067" + "\377\323\225L\377\300\214I\377_J'\377\21\17\14U\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\16\14\11\306\323\226F\377\316\230Q\377\37\32\24\377\7\7\6""0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\342\252[\377\342\254" + "_\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\332\253" + "x<\377\333\232F\377)\37\24\377\4\4\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\14\252\333\263t\377\350\301\211\377" + "\350\307\207\377(!\27\377\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11L>2\37\377\24\22" + "\15\247\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10L:.\35\377\24\22\15\247\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\322\226G\377\337\223H\377\335\226B\377" + "\32\25\17\322\0\0\0\0\13\12\10w\323\237T\377\345\270r\377\346\272{\377\36" + "\32\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11]\211Z(\377\337\247^\377" + "\344\264o\377\247\205P\377\21\20\16\343\13\13\12\252\14\13\11\252\14\13\11" + "\252\14\13\11w\7\7\6""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\7\7\6>\25\22\14\343\235\\\34\377\313i\32\377\305j" + "\32\377R0\25\377\16\14\7\255\5\5\4\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\7\5\34\32\23\13\343gD\31\377\236`\35\3779)\26\377\15\14\12\361!\32\20\377" + "\222X\37\377B/\27\377\14\12\11\311\6\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9\36\26\13\377\17\14\10`\0\0\0" + "\0\0\0\0\0\12\12\7\202\276h\33\377\321v\36\377\323u\"\377\33\25\16\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\307z'\377\332" + "\2023\377\337\222F\377\36\30\21\377\0\0\0\0\0\0\0\0\0\0\0\0\27\26\22\213" + "\36\33\25\252\20\17\13\377Y;\32\377\313n\34\377\304q\37\377zQ!\377\272u+" + "\377\330\2013\377\270~9\377&\"\31\377\30\26\23\335!\36\30\252\17\17\14\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\30\26\23\216\40\37\31\252\25\24\20\306ZG-\377\337" + "\263n\377\342\254_\377\335\226B\377\217d,\377\26\25\21\343\34\33\25\252\35" + "\34\26\252\15\15\14*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\10\10\13\31\30\24\216'#\34\252\36\34\27\252\35\33" + "\26\252\35\33\26\252\35\33\26\252\35\33\26\252\35\33\24\252\27\25\20\252" + "\16\15\13\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\237\216V\37\377\320t" + "#\377\311w&\377\40\32\21\377\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252" + "\330\247a\377\347\270|\377\347\301\200\377\265\222\\\3774,!\377ZG-\377\311" + "\233X\377\337\255f\377\344\263s\377\346\267{\377\346\270w\377'\40\26\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\252\316\213=\377" + "\342\244[\377\344\256g\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\11" + "\11\10\2168.\37\377\336\264q\377\346\273w\377\336\264q\377\27\25\20\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17" + "\16\14\244O;\36\377\321\200*\377\323\177,\377\253u.\377\22\17\13\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10t!\34\20\377\241^\34\377\307k\32\377" + "A(\22\377\10\7\5\377\31\24\14\377\306q\35\377\322x!\377\331\2052\377\33\27" + "\20\377\0\0\0\0\0\0\0\0\7\7\6\27\"\34\23\306.$\31\377'\37\26\377)!\26\377" + ";.\34\3773(\32\377=/\34\377\264\205G\377\343\257d\377\342\257g\377\265\217" + "X\377\21\20\14\216\0\0\0\0\0\0\0\0\13\13\12\252\326\246a\377\345\263r\377" + "\344\271o\377\241yD\377\27\25\20\343\27\26\22\252\26\25\21\252\20\17\15\252" + "\13\13\10\223\10\10\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\265\217X\377\344\271{\377\332" + "\250a\377F6#\377\11\11\10q\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10UxW-\377\337\267" + "x\377\347\276\204\377\247\207P\377\30\26\23\343\23\22\20\252\23\22\20\306" + "_P.\377\342\301\201\377\344\273\201\377\272\224W\377\17\16\14\252\0\0\0\0" + "\0\0\0\0\12\12\11U\233q@\377\345\304\204\377\350\277\205\377\263\216Z\377" + "\33\31\24\343\22\22\17\252\23\22\20\306ZG-\377\336\257e\377\343\256b\377" + "\344\271o\377\34\31\23\377\0\0\0\0\0\0\0\0\7\7\6\27\"\34\23\3061#\26\377" + "'\35\22\343\14\13\11U\0\0\0\0\0\0\0\0\10\7\7\34!\32\20\3064'\27\377/#\26" + "\343\15\14\10U\0\0\0\0\0\0\0\0\10\10\7\34!\36\30\343\311\235d\377\346\272" + "{\377\265\211J\377\20\17\13\317\6\6\5\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\13\12\10\34\33\25\14\301\32\23\13\377\27\22\12\377\27\22" + "\12\377\30\22\13\377\30\22\13\377\32\24\13\377#\33\20\377*\37\23\361\21\16" + "\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\220" + "[C$\377\331\232H\377\323\226F\377E7\"\377\17\16\14U\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\13\13\13\12\216\30\26\23\377\247" + "\207P\377\341\254h\377\340\246S\377\301~6\377\20\16\13\252\0\0\0\0\0\0\0" + "\0\15\14\10U\271a\32\377\317p\34\377\314n\33\377G.\26\377\10\10\7\377\34" + "\26\15\377\306k\33\377\301o\36\377~N\37\377\307\213>\377\342\270o\377\33" + "\30\22\377\0\0\0\0\0\0\0\0\13\12\10\252\326\246a\377\346\273w\377\344\263" + "g\377\217f0\377\21\20\14\343\14\14\11\252\15\14\12\306.!\21\377\307p\34\377" + "\316o\33\377\314n\33\377\40\27\15\260\0\0\0\0\0\0\0\0\14\13\11\210\314\206" + ";\377\342\254_\377\344\265k\377\242}I\377\30\26\23\343\23\22\20\252\23\22" + "\20\306_P.\377\340\263m\377\337\255_\377\255u2\377\17\15\12\234\0\0\0\0\0" + "\0\0\0\14\13\7c\271a\32\377\320p\33\377\314n\33\377\26\22\13\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\17\15\252\333\263t\377\350\302\205\377\347\301\200\377(!\27\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\17\15\252\333\261p\377\346\273w\377\340\237S\377\30" + "\25\17\377\0\0\0\0\0\0\0\0\13\12\10\244\323\236R\377\345\270r\377\346\277" + "{\377\246\177M\377\26\25\21\343\26\25\21\252\24\23\15\252\16\15\13\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\303p\36\377\321j\36\377\316o\33" + "\377e?\32\377\20\16\13\343\27\25\20\252\35\33\26\252\15\15\14*\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252\330\247a\377\340\236W\377\330}-\377\30" + "\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\21\20\14\252\333\261p\377\350\303\211\377\347\275\200" + "\377\242}I\377\26\25\21\343\16\16\13\252\15\14\12\3062#\23\377\307p\34\377" + "\316o\33\377\314n\33\377\40\30\15\252\0\0\0\0\0\0\0\0\15\14\10]\302m!\377" + "\333\2136\377\340\236Q\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\276h\33\377\320" + "p\33\377\314n\33\377\40\30\15\252\0\0\0\0\0\0\0\0\15\14\10U\270`\31\377\317" + "p\34\377\314f\33\377\201N\34\377\37\32\20\377\177T\"\377\333\223F\377\255" + "z>\377\17\16\14\324\6\6\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252" + "\325\233P\377\335\220D\377\331\2024\377\37\31\20\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\275c\32\377\320" + "p\33\377\314n\33\377\233W\32\377H.\25\377\263g$\377\337\234L\377\330\252" + "a\377\206`/\377\256\177G\377\335\247Z\377\337\223H\377\336\236K\377\27\23" + "\16\374\0\0\0\0\0\0\0\0\13\12\10\252\326\246a\377\347\273|\377\346\277{\377" + "\344\266u\377\336\257e\377@2!\377\7\7\6\345\32\27\23\377\334\257i\377\344" + "\267q\377\344\274u\377\31\25\20\377\0\0\0\0\0\0\0\0\13\12\10\252\331\260" + "p\377\350\305\211\377\350\307\207\377%\37\26\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\15\14\12\252\306u%\377\327\177*\377\331\2024\377\25\23\16\377\0\0\0\0\0" + "\0\0\0\13\12\10\247\327\254h\377\350\277\205\377\347\276\204\377\246\177" + "M\377\27\25\20\343\22\21\17\252\21\20\14\306J4\33\377\314u!\377\323o\36\377" + "\255]\34\377\17\14\10\244\0\0\0\0\0\0\0\0\15\14\10X\271a\32\377\320p\33\377" + "\314n\33\377\23\20\12\377\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\276h\33\377" + "\324v#\377\330\2103\377\25\23\16\374\0\0\0\0\0\0\0\0\13\12\10\247\327\254" + "h\377\350\302\177\377\347\301\200\377\246\201M\377\27\25\20\343\23\22\20" + "\252\23\22\16\306Q;\"\377\325\220>\377\327\214<\377\245l(\377\15\14\12\247" + "\0\0\0\0\0\0\0\0\10\10\7Ue?\32\377\316r!\377\324y!\377\233\\$\377\27\25\20" + "\343\26\25\21\252\34\32\25\252\25\24\22\252\15\15\14\244\12\12\11U\6\6\6" + "\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\302" + "p\37\377\324w%\377\330\206-\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\17\15\252\331\253j\377\347\273|\377\344\265k\377'\40" + "\26\377\0\0\0\0\0\0\0\0\0\0\0\0\20\17\13\252\320\2067\377\337\234F\377\335" + "\224F\377\27\24\16\356\0\0\0\0\0\0\0\0\13\12\10\252\314\2107\377\337\234" + "F\377\336\236K\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\331\253" + "j\377\350\275\177\377\346\272{\377\31\26\20\377\0\0\0\0\0\0\0\0\12\12\11" + "\247\322\233M\377\342\254_\377\340\245Q\377\37\32\22\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\15\14\252\331\255h\377\350\277\205\377\347\303" + "\204\377(!\27\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\11\205I:" + "$\377\341\270x\377\347\301\200\377\344\264o\377\223f0\377\17\15\12\343\10" + "\7\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\306d;\27" + "\377\251]\32\377\234[\33\377\256`\33\377\264c\33\377\250a\33\377i>\30\377" + "\22\17\11\377\7\6\6""0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7" + "\7\7\34\17\17\14\343\220rC\377\333\261p\377\337\260f\377\231q>\377\21\20" + "\14\343\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252\325\233P\377" + "\337\222F\377\331\2012\377\33\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\14\12\11\303\241^\34\377\317r\40\377\301r$\377\27\24\20\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" + "\252\277i\34\377\317d\34\377\314n\33\377\32\24\13\314\0\0\0\0\0\0\0\0\6\5" + "\5\3\32\23\11\306\30\22\11\366\17\14\10\216\0\0\0\0\0\0\0\0\0\0\0\0\17\15" + "\12[\37\30\20\3643'\30\377\25\23\16[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11L=1\36\377\24\22\15\234\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\21\17\14\216\33\26\16\350\36\26\15\377\31\24\14\377" + "\26\22\13\356\25\20\12\377c:\26\377\313q\32\377\315o\34\377\203P\36\377\14" + "\13\11\216\0\0\0\0\0\0\0\0\13\12\10\252\324\240U\377\350\277\177\377\347" + "\303\204\377\304\233[\377Q;\"\377)\40\24\3776+\33\377\264\205G\377\330\220" + ";\377\320s!\377\201N\34\377\14\13\7\216\0\0\0\0\0\0\0\0\10\7\7""9H4\35\377" + "\327\233N\377\343\256b\377\317\236^\377U?\"\377$\35\23\3779+\32\377\275\202" + "B\377\333\225B\377\324y)\377\254i!\377\21\17\12\223\0\0\0\0\0\0\0\0\7\6\6" + """6:(\25\377\306q\35\377\316g\33\377\245W\30\377*\34\15\377\25\20\10\377" + "\33\24\12\377_<\26\377\312i\33\377\316d\35\377\314n\33\377#\30\14\252\0\0" + "\0\0\0\0\0\0\7\7\6""6F2\33\377\324\221A\377\343\256b\377\311\233X\377;,\34" + "\377\27\24\16\377\"\34\23\377\235h0\377\323~*\377\320s!\377\204R\35\377\15" + "\13\10\216\0\0\0\0\0\0\0\0\0\0\0\0\30\22\11\335l=\27\377\311p\32\377\317" + "p\34\377\314n\33\377\236[\31\377.\35\15\371\13\12\6""9\0\0\0\0\0\0\0\0\10" + "\10\7""9F2\33\377\324\216;\377\342\254_\377\317\236^\377U?\"\377)\40\24\377" + "9+\32\377\256|;\377\340\252]\377\345\270r\377\347\304\200\377\34\31\23\377" + "\0\0\0\0\0\0\0\0\12\12\11\247\327\251f\377\350\277\177\377\347\301\200\377" + "\304\232W\377M;\"\377)\37\24\3776+\33\377\250q1\377\324y)\377\316r!\377\204" + "R\35\377\14\13\11\202\0\0\0\0\0\0\0\0\14\13\7n\274b\31\377\316o\33\377\316" + "j\31\377\32\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\14\11\252\307u$\377\335\224>\377\343\256b\377\34\32\23\377\0\0\0\0\0\0\0" + "\0\12\12\11\247\324\241Y\377\340\246S\377\331\2012\377\40\30\17\377\5\5\4" + "\37\7\7\6\210A,\26\377\300j\35\377\313l\30\377rB\27\377\21\15\10\335\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7\213\271a\32\377\320p\33\377\320u\35\377\40\30" + "\15\252\0\0\0\0\0\0\0\0\17\15\10[\275c\32\377\327{*\377\342\254_\377\306" + "\230W\377Q:\"\377\260\205G\377\340\250_\377\305\212>\377A/\32\377\205Q\36" + "\377\320y%\377\324s%\377\230b#\377\14\13\11\216\0\0\0\0\0\0\0\0\12\11\7\223" + "\276k\31\377\316o\33\377\316j\31\377\236[\31\377*\34\15\377\25\17\10\377" + "\32\23\11\377rB\27\377\314q\31\377\320s!\377\255z>\377\20\17\15\226\0\0\0" + "\0\0\0\0\0\10\10\7GnW3\377\336\264q\377\340\246S\377\321\211<\377\205T\40" + "\377M2\30\377Y;\32\377\265m\40\377\322y#\377\324y)\377\253t4\377\17\16\14" + "\216\0\0\0\0\0\0\0\0\16\15\13\252\333\261p\377\347\273|\377\344\264o\377" + "\315\236Z\377O:\40\377&\35\23\3771#\26\377\247r.\377\331\222>\377\333\232" + "F\377\251u8\377\17\15\14\234\0\0\0\0\0\0\0\0\10\10\7GhP-\377\340\267w\377" + "\350\277\177\377\322\246a\377Q<\40\377'\36\22\3774(\31\377\257\200B\377\341" + "\255b\377\344\264i\377\342\257_\377\35\31\22\377\0\0\0\0\0\0\0\0\14\14\13" + "\252\320\2127\377\336\221?\377\334\213;\377\301y2\377D2\35\377&\34\23\377" + "0#\27\377\257p,\377\331\2166\377\331\220B\377\277\211B\377\23\20\14\252\0" + "\0\0\0\0\0\0\0\11\10\10JoR(\377\330\233K\377\342\254_\377\310\227Q\3779)" + "\32\377\33\27\20\377#\34\22\377)\40\24\377'\36\24\377\31\26\20\343\17\16" + "\12\216\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34!\30\16\343\207Q\34\377\316u\37" + "\377\322l!\377\320n\37\377\253\\\34\3771!\20\374\15\13\10D\0\0\0\0\0\0\0" + "\0\13\12\10\252\303l\36\377\324v#\377\331\2114\377*!\27\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\24\22\17\252\326\234Q\377\335\224>\377\326\177+\377\27\23\14\356" + "\0\0\0\0\0\0\0\0\12\12\7\237\304m\37\377\325w$\377\324{%\377\37\30\16\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\321\211<\377\344\254c\377\346\275w" + "\377\34\32\23\377\0\0\0\0\0\0\0\0\14\14\13\252\320\2067\377\332\2113\377" + "\326\177+\377#\33\20\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13" + "\252\307t\"\377\331\2040\377\340\246S\377\40\32\23\377\0\0\0\0\0\0\0\0\12" + "\12\7\"Q:\"\377\340\262i\377\342\254_\377\201\\(\377\11\11\10\252\6\6\6U" + "\6\6\5q#\33\20\377\314u!\377\320u\35\377nE\31\377\16\14\7l\0\0\0\0\0\0\0" + "\0\12\12\7\252\303p\36\377\323s\36\377\323s\36\377\36\27\15\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\16\14\11\252\304q\37\377\323x\40\377\326~)\377!\32\22\377" + "\0\0\0\0\0\0\0\0\11\10\6\34,!\23\324<*\27\377.#\25\377J5\37\377\234m5\377" + "\330\247a\377\344\263m\377\345\261n\377\343\270l\377\250{E\377\27\25\20\343" + "\11\10\10\34\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\206b3\377\337\246\\\377" + "\204d5\377\11\11\10\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15" + "\252\333\261p\377\350\277\205\377\347\303\204\377(!\27\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5-'\40\26\377\322\2011\377\254j#\377\24\21" + "\15\343\13\13\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\21\21\16\252\335\275\204\377\353\315\232\377\352\315\233\377*'\35\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\10\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\13" + "\252\320\215=\377\340\250W\377\344\256g\377\37\32\24\335\0\0\0\0\15\14\14" + "\202\332\271\177\377\352\312\223\377\350\306\213\377(!\31\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\260\214sG\377\346\312\223\377\350\312" + "\225\377\332\252e\377\310|+\377\306u%\377\306u%\377\304t%\377H4\33\377\14" + "\13\11\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10" + "\7U%\37\24\377\256n)\377\322{'\377\314x%\377\202W\37\377\17\15\12\276\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4q\34\32\23\377" + "\322\217A\377\334\243Q\377\331\246\\\377\336\255a\377\341\260b\377*%\31\377" + "\4\4\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\320\215=\377" + "\342\254_\377\344\267o\377(\"\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\21\20\16\252\333\261p\377\350\302\205\377\351\312\224\377\33" + "\30\24\377\0\0\0\0\0\0\0\0\20\17\15U\307\241f\377\334\246Y\377\323\217>\377" + "\331\232H\377\337\241P\377\340\251[\377\341\271r\377\345\274|\377\347\276" + "\204\377\347\310\217\377\343\303\214\377\343\304\212\377\341\303\210\377" + ",%\33\252\0\0\0\0\0\0\0\0\21\20\16U\310\245m\377\343\306\216\377\341\277" + "\204\377\343\303\206\377\347\307\210\377\347\305\204\377\347\302|\377\345" + "\277\202\377\341\303\210\377\341\303\210\377\341\277\204\3771*\36\306\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\21" + "\15i\301\207B\377\335\257f\377\336\272{\377\337\276\204\377\340\300\207\377" + "\337\276\204\377\336\272{\377\335\262n\377\332\254i\377.'\33\303\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\6\6\6\34\33\32\24\377\330\252a\377\341\262h\377\260\210" + "S\377\20\17\15\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\335\274\202" + "\377\353\315\232\377\352\315\233\377\350\314\225\377\344\307\217\377\253" + "\220`\377@9)\377\232~Q\377\343\275z\377\346\270w\377\343\253b\377\"\36\25" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\335\272" + "~\377\352\312\223\377\350\300\207\377,'\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\216" + "\31\30\24\377r_5\377\317\251f\377\343\273v\377\342\274{\377\262\224_\377" + "\23\22\20\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\30\26\23U\305\221T\377\343\273v\377\347\302|\377\317\255r\377=7&\377" + "\10\10\10\210\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11l-$\25\377\303t&\377\317z&" + "\377\213Z\40\377\15\14\10\252\0\0\0\0\12\12\11\306\320\214;\377\342\252[" + "\377\347\301\200\377(#\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\34\22\21\15\343\336\275\203\377\352\311" + "\217\377\345\277\202\377\"\36\27\314\0\0\0\0\0\0\0\0\13\13\12\252\323\236" + "R\377\342\252[\377\340\245Q\377\333\232F\377\320\2043\377\316\200-\377\314" + "z)\377\311x(\377\304t%\377oJ\36\377\24\22\15\343\10\10\7\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\6\34\34\32\25\377\336\272" + "{\377\345\304\204\377\265\220\\\377\20\17\15\324\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\6\6\6U\31\30\24\377\264\225e\377\347\315\232\377\350\314\225\377" + "\343\306\216\377\337\300\212\377\337\301\210\377\346\307\213\377\350\305" + "\215\377\323\260z\377@9)\377\10\10\7q\0\0\0\0\0\0\0\0\6\6\5\16!\37\30\343" + "\272\233k\377\350\314\225\377\351\315\230\377\343\305\214\377\335\275\204" + "\377\340\300\207\377\344\306\215\377\350\311\215\377\350\300\207\377\347" + "\305\204\377)#\32\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\21\20\16\213\323\262x\377\351\312\224\377\351\312\224\37780!\377\4\4" + "\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\13" + "\12\377\330\244Y\377\346\277{\377\343\303\206\377(#\33\343\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\343~iE\377\331\260p\377" + "\341\257h\377\337\237L\377\275|1\377+#\24\377\11\10\10""9\0\0\0\0\0\0\0\0" + "\12\12\11\205\302m!\377\327}&\377\324|'\377\220]!\377\35\30\20\377D5\35\377" + "\272{1\377\200_/\377\31\30\24\377\217wN\377\346\311\221\377!\36\30\377\0" + "\0\0\0\0\0\0\0\13\13\12\252\331\260p\377\344\266m\377\336\236K\377\324\206" + "3\377\314z)\377\306u%\377\310v%\377\320{'\377\324{%\377\326y'\377\331\205" + "2\377\30\25\17\364\0\0\0\0\0\0\0\0\13\13\12\252\332\271\177\377\353\313\224" + "\377\351\312\224\377\346\311\221\377\343\305\214\377\335\273\200\377\335" + "\270x\377\340\262i\377\340\244U\377\275\201:\377'\40\24\377\7\7\6U\0\0\0" + "\0\0\0\0\0\13\12\10}\302m!\377\327}&\377\325}(\377\35\30\20\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21" + "\21\16\252\335\274\202\377\353\311\230\377\350\311\215\377*$\33\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\21\21\16\252\333\263t\377\347\273|\377\344\267o\377\30" + "\26\21\377\0\0\0\0\0\0\0\0\13\13\12\252\332\271\177\377\350\305\211\377\343" + "\263h\377\333\233H\377\320\2043\377\314z)\377\312x'\377&\37\23\252\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327q&\377\325z*\377\327" + "\217:\377\331\246\\\377\336\272{\377\341\303\210\3774,!\306\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\21\20\16\252\323\226F\377\333\2148\377\325~*\377\31\25" + "\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\21\21\16\252\335\273\200\377\350\307\215\377\344\264o\377" + "\333\233H\377\317\200,\377\307w'\377\310v%\377\320{'\377\324{%\377\326}'" + "\377\324|'\377\"\32\17\265\0\0\0\0\0\0\0\0\13\12\12\241\327\254h\377\352" + "\311\217\377\352\316\227\377*'\35\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327}" + "&\377\324|'\377$\34\21\252\0\0\0\0\0\0\0\0\17\16\12U\302m!\377\327}&\377" + "\324|'\377\322\200)\377\323\2076\377\341\260b\377\347\305\204\37780!\377" + "\4\4\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\316\2073\377" + "\331\2052\377\325z*\377\31\25\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327}&\377\325z*\377C" + "3\34\377\6\6\5\377(\"\31\377\342\276\177\377\212nE\377\7\7\7\377\31\30\24" + "\377\335\263p\377\350\277\177\377\350\311\215\377\32\27\23\377\0\0\0\0\0" + "\0\0\0\13\13\12\252\326\250e\377\346\273w\377\344\274u\377\324\255i\377\226" + "vC\377fV/\377oZ2\377\271\221X\377\343\273v\377\347\303\204\377\350\311\215" + "\377\32\27\23\377\0\0\0\0\0\0\0\0\13\13\12\252\333\270\200\377\353\315\232" + "\377\352\316\227\377*$\33\377\0\0\0\0\0\0\0\0\0\0\0\0\17\17\14\252\325\236" + "P\377\344\266m\377\346\277{\377\33\27\22\377\0\0\0\0\0\0\0\0\13\13\12\252" + "\333\275\204\377\353\315\232\377\350\305\215\377\341\271r\377\327\233N\377" + "\316\2073\377\315~*\377\321\200*\377\324y)\377\265o$\377'\36\22\377\10\10" + "\7""9\0\0\0\0\0\0\0\0\12\12\11\210\302m!\377\327}&\377\324|'\377\30\24\15" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\252\322\222G\377\345\267n\377\347\305" + "\204\377\32\27\23\377\0\0\0\0\0\0\0\0\13\13\12\252\332\275\177\377\352\307" + "\217\377\347\305\204\377\341\260j\377\326\231K\377\320\2127\377\315\2050" + "\377\322\177-\377\326\2061\377\263w*\377%\36\22\377\7\7\6U\0\0\0\0\0\0\0" + "\0\0\0\0\0\27\24\16\343\241s2\377\336\247Y\377\343\272r\377\341\276\202\377" + "\337\306\210\377\343\306\216\377\340\304\215\377\335\277\206\377\241\202" + "V\377!\36\30\345\12\12\11*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\17\17\14\252\323\225L\377\344\266m\377\347\275\200\377,'\33\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\330\252a\377\342" + "\254_\377\340\245Q\377\37\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" + "\311x(\377\331\2052\377\330}-\377\31\25\16\324\0\0\0\0\0\0\0\0\13\12\10\220" + "\313\2024\377\340\246S\377\344\256g\377(\"\31\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\21\20\16\252\335\273\200\377\352\311\217\377\346\277{\377\34\31\23\364\0" + "\0\0\0\0\0\0\0\12\12\11\244\313z2\377\334\224?\377\331\2154\377\27\24\16" + "\377\0\0\0\0\0\0\0\0\16\15\13l\12\12\11\34\0\0\0\0\15\15\14\252\335\275\206" + "\377\353\315\232\377\352\316\227\377*%\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\13\13\12\377\336\275\203\377\350\303\203\377\340\242" + "Q\377$\35\23\377\4\4\4""6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\7\7\6\34\23\21\14\350]B\36\377\267p$\377\321z&\377\324x'\377\237" + "f\"\377\26\23\15\377\7\7\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\6\6\5\34\21\20\16\343\225zT\377\343\303\214\377\343\277\206\377\263\216" + "Z\377\21\20\16\343\5\5\4\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16" + "\14\252\314\2011\377\332\2153\377\325~*\377\31\25\16\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\7[D0\31\377\315\177,\377\334\231K\377" + "cN,\377\10\10\7q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\13\11\252\304n!\377\327}&\377\324|'\377\30\24\15\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\11\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\2\1\27\11\10\6\377\307t\"\377\327" + "}&\377\324\200-\377\33\30\20\317\0\0\0\0\0\0\0\0\13\13\12\252\333\270\200" + "\377\353\315\232\377\352\315\233\377:1#\377\5\5\4U\0\0\0\0\4\4\3\34\20\17" + "\13\343\314z)\377\327~(\377\322{'\377\40\31\17\252\0\0\0\0\0\0\0\0\15\15" + "\14z\320\250c\377\352\307\217\377\352\314\227\377?6&\377\5\5\4U\0\0\0\0\4" + "\4\3\34\22\21\15\327\314\177-\377\326}'\377\324y)\377\"\33\17\252\0\0\0\0" + "\0\0\0\0\15\14\12U\271p\"\377\327}&\377\324{%\377#\34\20\377\4\4\3U\0\0\0" + "\0\3\3\2\34\14\12\11\340\306u%\377\327}&\377\324|'\377\"\33\17\262\0\0\0" + "\0\0\0\0\0\16\15\13q\316\242^\377\350\307\215\377\352\317\233\377?5$\377" + "\4\4\3q\0\0\0\0\3\3\3\34\12\12\11\377\310v%\377\327}&\377\322{'\377\33\26" + "\16\343\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\6\15\13\10\335\307t\"\377\327}&\377" + "\324|'\377#\33\20\377\5\4\4""9\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\223\316\232" + "W\377\350\303\211\377\352\314\227\377?6&\377\5\5\4U\0\0\0\0\4\4\3\34\22\20" + "\15\343\336\275\203\377\353\315\230\377\352\315\233\377\33\30\24\377\0\0" + "\0\0\0\0\0\0\13\13\12\252\333\270\202\377\353\315\230\377\352\315\233\377" + ":1#\377\5\5\4U\0\0\0\0\4\4\3\34\16\14\11\343\307u$\377\327q&\377\322{'\377" + "\40\31\17\252\0\0\0\0\0\0\0\0\14\14\11f\302m!\377\327}&\377\324|'\377\33" + "\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\20\15\252\331" + "\260n\377\352\304\217\377\352\314\227\377\33\30\24\377\0\0\0\0\0\0\0\0\13" + "\12\12\252\314\206;\377\333\2106\377\325z*\377H2\33\377\10\10\7\377\31\26" + "\16\377\303t&\377\320{'\377\216[\37\377\20\16\11\301\4\4\3\21\0\0\0\0\0\0" + "\0\0\0\0\0\0\13\13\10\252\306u%\377\333\2058\377\335\230F\377\33\27\20\335" + "\0\0\0\0\0\0\0\0\15\14\12c\301q\"\377\337\234F\377\347\301\200\377(\"\31" + "\377\4\3\3q\21\20\14\343\320\210;\377-$\25\377\4\3\3q\12\11\7\317\304n!\377" + "\327}&\377\322\200)\377\40\31\17\252\0\0\0\0\0\0\0\0\14\13\11l\302m!\377" + "\327}&\377\324|'\377#\33\20\377\4\4\3U\0\0\0\0\3\3\2\34\14\13\11\343\307" + "u$\377\335\226B\377\345\277~\377\40\35\27\322\0\0\0\0\0\0\0\0\15\15\14z\314" + "\226O\377\337\237L\377\331\2154\377T9\35\377\11\10\6\252\5\5\4U\6\6\5q\33" + "\26\16\377\317\200,\377\337\223H\377\343\273v\377\"\36\27\317\0\0\0\0\0\0" + "\0\0\14\13\13\252\332\264w\377\345\270r\377\340\247U\3772(\31\377\5\5\4U" + "\0\0\0\0\4\4\3\34\16\14\11\343\313}*\377\331\2000\377\325\200-\377#\33\20" + "\255\0\0\0\0\0\0\0\0\14\14\13\202\321\243b\377\353\313\224\377\351\312\224" + "\377?6$\377\5\5\4U\0\0\0\0\4\4\3\34\17\17\14\343\321\211<\377\335\227D\377" + "\333\223>\377\27\24\16\356\0\0\0\0\0\0\0\0\12\12\11\226\304y)\377\331\200" + "0\377\327\205,\377(\37\23\377\5\5\5U\0\0\0\0\4\4\3\34\20\16\13\317\311x(" + "\377\331\2052\377\335\241L\3779,\34\252\0\0\0\0\0\0\0\0\17\16\14i\323\245" + "b\377\350\305\211\377\350\307\215\377:1#\377\4\4\3q\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\21\14\13" + "\11\343\307t\"\377\327}&\377\324|'\377#\33\20\377\4\4\3>\0\0\0\0\0\0\0\0" + "\0\0\0\0\14\13\11\252\310x)\377\337\237L\377\346\277{\377,%\33\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\22\21\17\252\320\214;\377\331\2052\377\325}(\377\33\27" + "\16\303\0\0\0\0\0\0\0\0\14\13\11l\302m!\377\327}&\377\324|'\377\31\25\16" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\333\263t\377\353\311\230\377\352" + "\314\227\377\33\30\24\377\0\0\0\0\0\0\0\0\12\12\11\252\306z)\377\327\177" + "*\377\325}(\377\33\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13" + "\11\252\311x(\377\340\234S\377\347\276\204\377(!\31\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\12\11U4*\35\377\310\216;\377\267w,\377H4\33\377'\36\22\3771%\26" + "\377\226c!\377\304t%\377M2\30\377\12\11\7\220\0\0\0\0\0\0\0\0\0\0\0\0\12" + "\12\11\252\304s#\377\327}&\377\324|'\377\31\25\16\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\14\13\11\252\304n!\377\326\177+\377\336\236K\377)\"\30\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4U\13\13\12\377\202e;\377\337" + "\260f\377\340\260e\377\261\211J\377\22\21\15\343\6\5\5\34\0\0\0\0\0\0\0\0" + "\0\0\0\0\24\23\17U\272x1\377\331\216>\377\331\2138\377\"\35\23\377\4\4\3" + "\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\335\274\202\377" + "\353\315\230\377\352\315\233\377*'\35\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\15\15\12\265\307w'\377\324y)\377\313y(\377#\35\21\252\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\17\252\336\272" + "{\377\352\311\217\377\350\305\207\377/(\34\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\325\240T\377\346\273w\377\347" + "\305\204\377#\36\26\306\0\0\0\0\16\15\13l\331\260p\377\350\301\211\377\347" + "\305\204\377!\34\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14" + "\14\13q\37\35\26\322(#\33\377)\"\30\377\35\30\20\377\40\32\21\377\222\\#" + "\377\326\2061\377\324\200-\377{Q$\377\17\15\12\216\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\7\7\6U\34\32\23\374\302\214G\377\324\177+\377\312v#\377" + "aB\36\377\17\16\12\317\6\6\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\6\6\5\10\17\15\14\343oV2\377\321\250f\377\260\210S\377UC,\377\243" + "\201P\377\335\272~\377SE,\377\7\7\6\252\5\5\5\10\0\0\0\0\11\11\10l\24\22" + "\15\252\15\14\12""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\17\15\252\331\260n\377\350\302\205\377\350\306\213" + "\377$!\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\17\14\252" + "\333\263t\377\350\301\211\377\350\307\207\377\37\32\24\377\0\0\0\0\0\0\0" + "\0\13\13\12\34""80!\343bL-\377hP-\377\303\232`\377\343\272r\377\342\275}" + "\377\317\255r\377\336\274{\377\347\276\204\377\331\274|\377\211mF\377cV6" + "\377N@+\377\25\24\20U\0\0\0\0\0\0\0\0\14\14\13\34""60#\343VH/\377J?+\377" + "\253\211T\377\345\277\202\377\346\277{\377\346\272{\377\312\244i\377aP2\377" + "K@,\377H='\377\26\25\21f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\13\13-7-\36\343ZG-\377N?)\377H='\377J?+\377H" + "='\377H='\377[J.\377N?)\377\26\24\21f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\260" + "\204j=\377\344\274}\377\322\254q\377*%\35\377\11\11\10>\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\21\20\16\252\335\272|\377\352\307\217\377\350\311\215\377" + "\350\311\215\377\335\275\206\3774.!\377\6\7\6\343\30\27\21\377\320\2043\377" + "\327\205,\377\324|'\377\30\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\21\20\14\252\333\261p\377\347\273|\377\344\266m\377(!\27\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\11\11\10J\21\17\14\343C3\34\377\242k+\377\310\216C\377\314\235[\377\261" + "\214V\377J?+\377\23\21\20\306\11\11\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\13\37""8.\37\343\300\235g\377\345" + "\302\200\377\341\274|\377\222pC\377\13\12\10\244\0\0\0\0\0\0\0\0\7\7\6\34" + "\"\33\21\377\276k!\377\322y#\377\222_#\377\20\16\13\273\0\0\0\0\0\0\0\0\11" + "\11\10\252\326\244]\377\350\302\177\377\347\303\204\377(\"\31\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\15\15\12\252\325\235T\377\340\246S\377\335\226B\377\27\24\16\366\0\0\0\0" + "\0\0\0\0\14\13\11q\302m!\377\324w%\377\322q#\377\250g!\3778*\27\377\33\27" + "\16\377&\37\23\377\225\\\36\377\317v\40\377\317q\36\377|K\33\377\15\13\10" + "\241\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\260" + "\202c;\377\345\277~\377\323\256t\377+%\34\377\11\11\10;\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\10\7UD:%\377\326\261w\377\347\304\210\377\317\253r\377" + "aP2\3776/#\377B;)\377\262\224_\377\344\275y\377\340\273{\377\222pC\377\14" + "\14\13\252\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11\34\20\17\15\223\35\34\26\335" + "0*\37\377F=)\377B9'\377F=)\377\253\214\\\377\340\252e\377\340\250W\377\340" + "\245Q\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\16\15\13""9dR3\377\336\272{\377\342\254_\377qR&\377\11\10\10\177\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6f\13" + "\12\6\252\13\12\10\252\14\13\11\252\17\15\12\252\17\15\12\252\17\16\12\252" + "\22\17\13\252\22\17\13\234\14\13\11\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\6\6\5A(\"\31\377\340\267w\377\345\303\210\377\253" + "\214\\\377\25\24\22\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13" + "\12\10f\203\\.\377\325\2218\377\326w+\377\322\200)\377\227^\40\377\27\25" + "\16\377\12\12\11U\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\277j\36\377\323s\36" + "\377\320r\37\377\215W\36\377$\37\23\377yZ*\377\331\250\\\377\315\243f\377" + "\204f;\377\325\254l\377\347\301\200\377#\36\26\377\0\0\0\0\0\0\0\0\13\13" + "\12\244\313\2012\377\327\177*\377\323u\"\377\246a\35\3776(\25\377\35\27\16" + "\377&\37\23\377xN\35\377\316v!\377\326\177+\377\340\233Q\377\27\25\20\377" + "\0\0\0\0\0\0\0\0\13\12\12\252\331\267t\377\352\311\217\377\350\306\213\377" + "\312\246m\377aN2\3774.!\377:2!\377\226`'\377\320y%\377\303p\36\377S5\30\377" + "\11\10\6q\0\0\0\0\0\0\0\0\15\14\10`\275h\34\377\322x!\377\326\204-\377\"" + "\35\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\21\20\14\252\331\254f\377\344\264i\377\344\265k\377(!" + "\27\377\0\0\0\0\0\0\0\0\0\0\0\0\21\17\14\252\330\253e\377\350\277\177\377" + "\347\305\204\377\30\26\21\377\0\0\0\0\0\0\0\0\13\13\12\247\321\222H\377\335" + "\227D\377\325~*\377\254j#\3779)\26\377*\40\23\377+!\24\374\22\17\13U\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\327q&\377\334\220?" + "\377\305\221T\377[G,\377K>*\377K@,\377\26\25\21c\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\16\15\13\252\304n!\377\322s\37\377\322s\37\377\26\23\13\343\0\0" + "\0\0\0\0\0\0\20\15\11q\30\25\17\252\21\17\14\252\22\17\15\252\23\21\14\216" + "\11\10\10\34\0\0\0\0\0\0\0\0\16\15\13\252\322\222G\377\334\216;\377\325}" + "(\377\250g!\3776(\25\377\35\27\16\377&\37\23\377wN\36\377\314t\37\377\322" + "w\37\377\322s\37\377\32\24\15\322\0\0\0\0\0\0\0\0\13\13\12\252\331\263x\377" + "\352\312\223\377\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377" + "\323s\36\377\322s\37\377$\31\15\252\0\0\0\0\0\0\0\0\16\14\11U\276i\35\377" + "\322k\37\377\320r\37\377\273|*\377\217o8\377\322\253m\377\345\273\200\377" + "\203c6\377\10\10\7\234\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" + "\302p\37\377\322k\37\377\322s\37\377\26\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\327}&\377" + "\332\215;\377'!\26\377\5\5\5\34\14\14\13\252\234~S\377\33\30\24\343\5\5\5" + "\27\16\15\13\306\333\261p\377\350\277\177\377\346\277{\377\31\26\20\371\0" + "\0\0\0\0\0\0\0\13\12\10\231\310x)\377\326\177+\377\325~*\377]B\40\377\13" + "\13\12\377\"\37\27\377\316\230Q\377\342\263o\377\347\275\200\377\350\300" + "\207\377\350\311\215\377\31\26\22\377\0\0\0\0\0\0\0\0\13\12\12\252\327\253" + "f\377\344\256i\377\336\236K\377\33\30\20\377\0\0\0\0\0\0\0\0\0\0\0\0\17\17" + "\14\252\333\261p\377\350\301\211\377\350\311\215\377\31\26\22\377\0\0\0\0" + "\0\0\0\0\13\12\12\252\327\254h\377\344\266m\377\335\233F\377\261r.\3777*" + "\30\377#\34\22\377)\37\22\377#\34\21\377\33\26\16\377\21\20\14\273\11\11" + "\10O\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\277j\36\377\323s\36\377\322s\37" + "\377!\31\16\377\0\0\0\0\0\0\0\0\0\0\0\0\25\24\20\252\335\264t\377\350\301" + "\211\377\350\311\215\377\31\26\22\377\0\0\0\0\0\0\0\0\13\13\12\252\324\240" + "U\377\340\234S\377\332\215;\377\257s,\3777*\30\377\37\31\20\377&\36\23\377" + "\177R\36\377\314t\37\377\303p\36\377R7\31\377\13\12\10\226\0\0\0\0\0\0\0" + "\0\0\0\0\0\11\11\10\34\17\16\14\216\34\31\23\335.(\35\377G<&\377B9'\377F" + "=)\377\301\237j\377\343\270l\377\335\231H\377\233b$\377\15\14\12\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\17\14\252\333\264p\377\350" + "\305\211\377\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\16\15\13\252\306u%\377\325|&\377\322y#\377\27\23\14\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\323s\36\377\320r\37\377\27" + "\23\14\317\0\0\0\0\0\0\0\0\16\15\13U\265\204D\377\344\271u\377\347\301\200" + "\3776.\37\377\5\5\4\10\0\0\0\0\0\0\0\0\25\24\20\262\327\240X\377\337\223" + "H\377\316\2073\377\27\24\16\252\0\0\0\0\0\0\0\0\14\13\11f\300o\37\377\322" + "l!\377\320r\37\377\26\22\13\377\0\0\0\0\12\12\11qO=&\377\21\20\14\306\0\0" + "\0\0\20\17\15\252\333\263t\377\347\273|\377\340\251[\377!\34\24\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\10U'!\30\377\331\246\\\377\333\214" + "8\377\322y#\377B,\25\377\7\7\6\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5J\23\22\14\377\267f\36\377\317i\36\377\322" + "o\37\377I3\30\377\10\10\7t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\6\6\6\34\17\15\14\343\220p=\377\335\264t\377\340\262q\377\230tA\377\22" + "\21\15\335\10\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14" + "\12\11\252\301o\36\377\322k\37\377\322s\37\377\26\23\13\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\343\244z?\377\341\271" + "r\377\300\231a\377\25\23\20\350\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\323s\36\377\322s\37\377\27\23\14" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\6\6\5""3\13\11\6U\14\12\7f\12\10\5\234\12\10\5\177\10\7\5\270" + "\33\26\14\377\306i\35\377\323z$\377\334\210=\377\31\26\20\377\0\0\0\0\0\0" + "\0\0\12\12\11\252\332\265{\377\352\312\223\377\350\305\215\377\36\33\25\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\277j\36\377\323s\36\377\322o\37\377" + "'\33\16\252\0\0\0\0\0\0\0\0\14\13\13\252\332\264w\377\352\304\217\377\350" + "\311\215\377\35\32\24\377\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6\34\33\26\16\234\31" + "\26\16\377\40\31\17\322\26\22\13\34\0\0\0\0\0\0\0\0\12\11\7\226\303p\36\377" + "\323s\36\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\252" + "\277j\36\377\323o\36\377\320r\37\377\31\24\14\314\0\0\0\0\0\0\0\0\14\13\13" + "\252\332\264w\377\352\312\223\377\350\311\215\377\216o?\377\16\14\11\343" + "\12\11\7\177\10\7\5\265#\31\16\377\307p\34\377\321v\36\377\321u\34\377\36" + "\26\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323s\36" + "\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\23\20\252" + "\334\262q\377\350\305\211\377\350\311\215\377\32\27\23\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\13\13\12\252\332\265{\377\352\311\217\377\347\305\204\377\30\26" + "\21\377\0\0\0\0\0\0\0\0\13\12\12\252\332\265{\377\352\311\217\377\347\305" + "\204\377\36\32\25\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323" + "s\36\377\322o\37\377'\33\16\252\0\0\0\0\0\0\0\0\15\14\10U\276i\35\377\325" + "w$\377\326\204-\377\40\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\21\20\16\252\335\272|\377\352\312\223\377\350\307\207\377\31\26" + "\22\374\0\0\0\0\0\0\0\0\13\12\10\177\300o\37\377\322k\37\377\320r\37\377" + "\241^\34\377A+\24\377\221U\32\377\317u\36\377zK\35\377\17\16\12\252\5\5\4" + "\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\304s#\377\337\222F\377\344" + "\267o\377\31\26\20\374\0\0\0\0\0\0\0\0\16\14\11U\276i\35\377\327}&\377\332" + "\215;\377\36\30\21\303\0\0\0\0\12\12\7\252\301o\36\377\24\21\13\374\0\0\0" + "\0\13\12\10U\274g\33\377\323s\36\377\321j\36\377'\33\16\252\0\0\0\0\0\0\0" + "\0\15\14\10U\276i\35\377\323s\36\377\322s\37\377\23\17\12\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\10\6\247\300o\37\377\332\2113\377\343\257d\377\33\30\22\377" + "\0\0\0\0\0\0\0\0\13\12\10\223\304j!\377\322l!\377\322s\37\377\36\27\15\377" + "\4\4\3\16\0\0\0\0\0\0\0\0\17\16\14\303\323\225L\377\345\270r\377\350\307" + "\207\377\34\31\23\377\0\0\0\0\0\0\0\0\13\12\10\247\313\2012\377\327\177*" + "\377\322y#\377\24\21\13\350\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\213\276i\35\377" + "\323o\36\377\321r\36\377\36\26\15\306\0\0\0\0\0\0\0\0\15\14\12\252\331\255" + "h\377\350\301\211\377\350\302\213\377\31\26\22\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\11\10\10\234\300o\37\377\322l!\377\322s\37\377\40\30\15\255\0\0\0\0\0" + "\0\0\0\15\14\10X\276i\35\377\323s\36\377\320r\37\377\23\17\12\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\7\7\6\34\33\26\16\306-$\25\3774+\35\364\16\15\13U\0\0\0" + "\0\0\0\0\0\15\15\14X\261\217Z\377\346\302\203\377\342\254_\377\211[$\377" + "\12\11\7\343\10\10\5\241\12\11\7\247\12\11\7\210\15\12\6U\7\6\6J\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323s\36" + "\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252" + "\320\215=\377\346\273w\377\350\311\215\377(\"\31\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\16\14\11\252\304m\37\377\322k\37\377\322s\37\377$\31\15\252\0\0\0\0" + "\0\0\0\0\12\11\7U\233[\34\377\320r\37\377\321j\36\377\36\26\15\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\26\25\21\260\336\272{\377\352\307\217\377\342\303\207" + "\377#\35\26\262\0\0\0\0\0\0\0\0\14\13\11i\276i\35\377\323s\36\377\320r\37" + "\377\27\23\14\322\0\0\0\0\0\0\0\0\17\14\10;\7\6\4\3\0\0\0\0\11\11\10\237" + "\314\206;\377\346\266w\377\350\306\213\377'!\30\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\12\12\11\"\17\16\12\3064(\25\377\245`\34\377\306q\35\377\271f" + "\34\377P5\31\377\23\21\14\343\12\11\7L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13" + "\12\10\252\303p\36\377\323s\36\377\322s\37\377\24\20\13\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\12\11\7\252\300o\37\377\327}&\377\340\237S\377)!\30\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6l\30\24\15\377\222X\37\377" + "\303\177&\377qM\"\377\17\16\14\322\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\14\13\34%\36\22\343\250c\37\377\316r!\3773\"\22\377\6\5\5G\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\335\272|\377\352\312\223\377" + "\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\21\17\12\343\306i\35\377\302m!\377>,\27\377\20\16\13U\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\21\14\216\326\253a\377\344\267" + "q\377\343\272l\3772(\31\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\13\11\306\326\236U\377\345\267n\377\344\265k\377\25\23\16\371" + "\2\2\1\24\10\10\7\265\322\234O\377\342\251_\377\340\233Q\377!\32\22\377\4" + "\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\3\3\2\34\13\12\10\377\321\212>\377\337\232H\377\335\244R\377" + "\33\27\20\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6O.&\31\377\305\227T\377" + "\336\241Y\377\321\200*\377\215[\40\377\17\15\12\332\5\5\5\13\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\213\277\203<\377\334" + "\250]\377\250{E\377\16\15\13\343\5\5\5U\11\11\10\252iN(\377\242t=\377XB%" + "\377\27\25\20\377\13\13\12\377N:#\377\320\226K\377=.\34\265\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330" + "\252a\377\346\273w\377\344\262q\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\327\247\\\377\345\263r\377\344\265k\377" + "\40\33\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\6\31\5\5\4\3064*\33\377" + "\334\251a\377\275\216L\377#\37\26\377\206`3\377\341\260j\377\214j5\377\6" + "\6\5\377\6\6\6""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\5\5\5\34\17\15\12\343\320\210;\377\332\2125\377\325z*\377+\37\22\377\5\5" + "\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\10""99/" + "\36\377\324\243]\377\340\235U\377|Z-\377\12\12\11\223\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\344\265k\377\340\245Q\377" + "\302\210=\377:.\35\377\14\14\13U\0\0\0\0\12\11\7\234\256[\27\377\312g\27" + "\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\17\15\12\252\325\233P\377\343\257d\377\343\253b\377#\35\24\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6U1!\22\377" + "\267l\"\377\321\200*\377\321\211<\377\272\206C\377_J'\377\26\24\17\345\10" + "\10\7i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\5\4\4\34\21\17\14\343\330\247Y\377\344\265k\377\337" + "\260f\377\"\34\23\270\0\0\0\0\0\0\0\0\14\13\11l\264j!\377\326}'\377\331\215" + "4\377*!\25\377\4\4\4U\0\0\0\0\0\0\0\0\13\12\10\306\323\225L\377\340\240M" + "\377\334\220?\377\"\33\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\275c\32\377\316f\31\377" + "\313d\30\377\36\25\13\260\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312g\27\377" + "\312f\25\377\33\24\12\377\4\4\3D\0\0\0\0\4\4\4\34\14\12\7\327\260[\27\377" + "\313h\30\377\312i\33\377\34\25\15\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\10\10""99/\36\377\325\247^\377\344\270s\377~\\/\377\11\11" + "\10\223\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\247\307\203:\377" + "\334\224?\377\333\223>\3771&\30\377\6\6\6U\0\0\0\0\5\5\5\34\17\16\14\343" + "\331\251^\377\344\267o\377\341\256f\377\37\31\22\361\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\5\34\17\15\12\343" + "\314\177-\377\333\2058\377\335\226B\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\11U-\"\25\377\311n\36\377" + "\300d\31\3779#\20\377\14\12\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\15\13\6O~D\25\377\277d\32\377\306u%\377\320\213A\377\325\233P\377" + "\326\241U\377\327\247\\\377\330\247Y\377\327\240X\3771&\30\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6L-$\30\371\317\244Z\377\344\267" + "o\377\217o8\377\15\14\12\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\15\14\10\216\266c\31\377\313l\30\377\312f\25\377pA\27\377\17" + "\15\10\343\6\6\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377" + "\312_\27\377\312g\27\377g@\32\377\24\22\15\377O=$\377\336\255a\377\343\263" + "h\377\340\254a\377\342\253c\377\340\260]\377$\35\23\317\0\0\0\0\0\0\0\0\14" + "\12\7q\260[\27\377\312_\27\377\312f\25\377\33\24\12\377\4\4\3J\0\0\0\0\4" + "\4\4\34\13\11\6\327\273e\30\377\330\206-\377\342\254_\377\27\25\20\361\0" + "\0\0\0\0\0\0\0\12\12\11\241\324\240U\377\342\254_\377\336\236K\3773'\30\377" + "\6\6\6U\0\0\0\0\4\4\3\34\13\12\6\327\260[\27\377\312f\25\377\277f\26\377" + "\26\21\11\252\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\314i\31\377\331\2052\377" + "#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\17\15\12\252\307t\"\377\324r#\377\332\2137\377!\33\22" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\240T\377\343\257d\377\340\245" + "Q\377\31\25\16\353\0\0\0\0\0\0\0\0\15\13\10l\270`\31\377\313`\30\377\312" + "_\27\377\33\24\12\377\4\4\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\12\11\7\252\273e\30\377\330\206-\377\340\247U\3776*\33\377\6" + "\6\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252" + "\253Y\26\377\312g\27\377\312f\25\377\35\25\12\252\0\0\0\0\13\11\6*\211M\30" + "\377\323\2108\377\327\247\\\377\330\246_\377\325\243T\377!\34\22\241\0\0" + "\0\0\0\0\0\0\13\12\10\202\270d\31\377\313d\30\377\312f\25\377\33\24\12\377" + "\4\4\3J\0\0\0\0\4\4\4\34\13\11\6\327\260[\27\377\312g\27\377\312_\27\377" + "\34\25\13\276\0\0\0\0\0\0\0\0\12\12\11\241\324\241Y\377\344\256i\377\337" + "\241P\377!\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247\253Y\26\377\312g\27\377\312f\25" + "\377\35\25\12\252\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312g\27\377\313l\30" + "\377D/\31\377\6\6\5\377\37\32\24\377\334\250]\377\334\261e\377nP)\377\14" + "\13\11\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253Y\26\377\312g\27" + "\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7\252\301o\36\377\333\2106\377\340\245Q\377\33" + "\30\20\377\0\0\0\0\7\7\7\34\25\24\20\265\12\12\11U\0\0\0\0\14\13\11\252\314" + "\2023\377\332\2153\377\323z$\377\40\27\15\273\0\0\0\0\0\0\0\0\15\13\10U\247" + "W\26\377\313d\30\377\320i\35\377\27\23\14\377\4\4\3\34\13\12\10\265\323\236" + "R\377\345\267n\377\344\267o\377\344\267q\377\344\265k\377\33\27\20\345\0" + "\0\0\0\0\0\0\0\12\12\11\226\300o\37\377\320p\33\377\313l\30\377\25\21\12" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\345\267n\377\344\265" + "k\377\31\25\20\353\0\0\0\0\0\0\0\0\13\12\10\216\302t!\377\321j\36\377\313" + "l\30\377\33\24\12\377\4\4\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377\312g\27\377\312f\25" + "\377*\34\15\377\6\5\5""0\0\0\0\0\6\6\6\34\25\23\16\377\335\257f\377\345\263" + "r\377\344\265k\377\30\24\17\366\0\0\0\0\0\0\0\0\14\13\11\177\276h\33\377" + "\316j\31\377\312g\27\377\33\24\12\377\4\4\3J\0\0\0\0\4\4\4\34\13\12\6\327" + "\260[\27\377\314i\31\377\317z&\377\34\26\17\356\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\5\34\17\15\12\343\303" + "o\34\377\314i\31\377\305d\26\377\26\21\11\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\345\270r\377\344\265k\377" + "\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252" + "\256[\27\377\312g\27\377\312f\25\377\24\20\11\374\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\11\7\252\253Y\26\377\312k\27\377\316o\33\377\26\21\13\374\0\0\0\0\0\0" + "\0\0\10\7\7-I;$\377\332\256i\377\344\262k\377YC$\377\7\7\6q\0\0\0\0\5\5\4" + "\34\24\22\15\377\307n\36\377\312i\33\377X6\27\377\12\11\7q\0\0\0\0\0\0\0" + "\0\15\13\6U\247W\26\377\312_\27\377\312Z\27\377\40\30\15\377\4\4\3\262\23" + "\20\14\356\324\243]\377B4\37\377\5\5\5\270\16\15\13\377\315\2050\377\324" + "r#\377\320u\35\377\35\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" + "UeJ&\377\275y1\377\271h\40\377\264b\31\377\264]\27\377\232R\27\377K,\22\377" + "\13\11\6\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\12\11\7\252\235O\26\377\312f\25\377\312f\25\377\26\21\11\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\340\210b5\377\331" + "\245R\377\325\2218\377\226\\#\377\23\20\14\255\5\5\5\10\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377\312g\27\377" + "\312f\25\377\24\20\11\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\7\7\6;+#\30\377\335\257f\377\337\262j\377\206b3\377\16\15\13\216" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247\253Y\26\377" + "\312g\27\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252.\35\15\377\214J\25\377\245" + "V\26\377\247W\26\377\245V\26\377\247W\26\377\271_\26\377\306a\27\377\316" + "o\33\377\335\222B\377\27\23\16\371\0\0\0\0\0\0\0\0\12\12\11\231\324\241Y" + "\377\345\267n\377\340\245Q\377\34\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10" + "\7\234\253Y\26\377\312g\27\377\312f\25\377\37\25\12\252\0\0\0\0\0\0\0\0\12" + "\12\11\247\324\240U\377\344\261i\377\336\236K\377\33\27\20\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12" + "\10\7\252\247W\26\377\312g\27\377\312f\25\377\24\20\11\356\0\0\0\0\0\0\0" + "\0\0\0\0\0\12\10\7\244\253Y\26\377\312g\27\377\313d\30\377\26\22\13\353\0" + "\0\0\0\0\0\0\0\12\12\11\247\326\244]\377\344\266m\377\337\232P\377\317x$" + "\377\275^\30\377\247W\26\377\247W\26\377\273`\26\377\306]\27\377\312]\25" + "\377\306`\25\377\32\23\11\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\247" + "\253Y\26\377\312g\27\377\312f\25\377\24\17\11\374\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\21\17\14\252\330\252a\377\345\267n\377\340\244U\377\35\30\20\377" + "\3\3\2\34\0\0\0\0\0\0\0\0\14\13\11\306\323\225L\377\335\227D\377\333\222" + "<\377\26\23\15\366\0\0\0\0\0\0\0\0\12\12\11\241\322\233M\377\337\223H\377" + "\325z*\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\247\253Y\26\377\312" + "g\27\377\312f\25\377\35\25\12\252\0\0\0\0\0\0\0\0\14\12\7U\246W\27\377\321" + "v\36\377\332\2137\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\15\12\252\327\237\\\377\342\251_\377\332\215;\377\"\32\17\276" + "\0\0\0\0\0\0\0\0\15\12\6U\247W\26\377\312g\27\377\306`\25\377\305`\26\377" + "\275a\26\377\306`\25\377\306`\25\377\31\23\12\377\4\4\3\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\262\\\27\377\322k\37\377\327\200," + "\377!\30\16\301\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312_\27\377\312g\27" + "\377\40\26\13\252\0\0\0\0\12\10\7\252\253Y\26\377\30\21\11\371\0\0\0\0\14" + "\12\7U\243R\26\377\312g\27\377\312f\25\377\35\25\12\252\0\0\0\0\0\0\0\0\14" + "\12\7U\246W\27\377\312g\27\377\312f\25\377\24\17\11\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\10\7\247\252Y\27\377\316j\31\377\320s!\377\34\25\15\317\0\0\0\0" + "\0\0\0\0\15\12\6U\247W\26\377\312_\27\377\312f\25\377\24\20\11\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\17\15\12\252\326\236U\377\345\267n\377\344\271o\377\30" + "\24\17\371\0\0\0\0\0\0\0\0\14\13\11l\260[\27\377\312_\27\377\312f\25\377" + "\22\17\11\377\2\2\1\10\0\0\0\0\0\0\0\0\10\7\5\270\253Y\26\377\312_\27\377" + "\312f\25\377\"\27\13\255\0\0\0\0\0\0\0\0\14\13\11\210\324\240U\377\344\264" + "i\377\341\245X\377\37\31\22\377\3\3\2\34\0\0\0\0\0\0\0\0\10\7\5\262\253Y" + "\26\377\312g\27\377\312f\25\377\36\25\13\252\0\0\0\0\0\0\0\0\14\12\7U\247" + "W\26\377\312g\27\377\312f\25\377\24\17\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6\34\36\33\25\356" + "\247o2\377\316n!\377\307f\30\377\257Z\26\377\245V\26\377\247W\26\377\247" + "W\26\377\241W\26\377T0\23\377\22\17\11\343\10\7\5\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\12\10\7\247\253Y\26\377\312g\27\377\312f\25\377\24\17\11\374" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\237L\377\345\264n\377\344" + "\266m\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253Y\26\377\312" + "g\27\377\312f\25\377\37\26\12\252\0\0\0\0\0\0\0\0\7\6\6\34""0\37\17\377\275" + "]\26\377\312f\25\377-\35\16\377\5\5\4q\0\0\0\0\5\5\4\34\26\24\17\377\334" + "\251a\377\342\262g\377\247v6\377\17\15\12\205\0\0\0\0\0\0\0\0\15\13\6U\247" + "W\26\377\312g\27\377\312f\25\377\23\17\10\327\0\0\0\0\13\11\6iyA\24\377\32" + "\22\11\276\0\0\0\0\11\11\10\247\320\226K\377\345\267n\377\344\265q\377%\35" + "\24\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5\332\247W" + "\26\377\312]\25\377\306h\25\377\27\22\12\377\3\3\2""3\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7\231\253Y\26\377\312_\27\377\312f\25\377\24\17" + "\11\377\2\2\1\21\0\0\0\0\0\0\0\0\10\7\5\265\270d\31\377\327w*\377\340\240" + "U\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6U\37\26" + "\14\377\246W\27\377\275a\26\377c<\26\377\17\15\10\252\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\27\15\13\10\343\266^\27\377\225" + "W\32\377\23\21\14\343\7\7\7\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252" + "\330\252a\377\345\263r\377\344\266m\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\11\10\6\202E*\22\377\303_\26\377#\30\14\377\5\5\4L\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34\33" + "\30\20\270\40\33\23\377'\35\24\324\15\14\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\15\13\10\252Q6\34\377\330\224C\377\337\241H\377\334" + "\223=\377uL\40\377\15\13\10\377,!\23\377\317{(\377\331\2102\377\332\2165" + "\377\234d'\377\22\17\13\343\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\15\10}" + "\23\16\12\252\16\13\7\252\12\10\7\252\13\11\6z\15\12\10U\10\7\5\231.!\25" + "\377\324\2123\377\335\227D\377\277\204>\377\23\21\14\260\0\0\0\0\0\0\0\0" + "\0\0\0\0\7\7\6L\32\26\17\361\275\201:\377\333\230H\377\331\232H\377\205W" + "&\377\17\15\12\335\6\6\5\34\0\0\0\0\0\0\0\0\17\14\10q\24\20\13\252\21\16" + "\12\216\7\6\6\34\0\0\0\0\0\0\0\0\23\20\14\252\310u#\377\324{%\377sJ\36\377" + "\11\10\6q\0\0\0\0\0\0\0\0\14\13\11\262hI%\377\316\223?\377\262y5\377:.\35" + "\377.$\31\377(\40\25\374\23\21\14U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\244\277\203<\377\337\241P\377" + "\335\227D\377.\"\25\377\4\4\3\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23" + "\20\14\255\320\2067\377\337\234F\377\330\240Q\377\25\23\16\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\6\5\5\31\21\16\12\343C0\34\377^C#\377\24\21\15\343" + "\6\6\5q\14\13\11\306C3\36\377U>\40\377\31\24\16\377\11\10\6R\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252\241W\26" + "\377\303Z\24\377\273[\24\377\23\16\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10w\24\20\13\252\21\16\12\234\12\10\7\34\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10z\22\17\13" + "\252\21\16\12\220\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" + "\235`$\377\323{&\377\307t\"\377\37\30\20\377\6\6\6\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\15\13\252\305n\40\377\321n\36\377\312g\27\377:$\17" + "\377\10\7\5q\0\0\0\0\0\0\0\0\12\10\5U\211D\22\377\271V\24\377\256X\23\377" + "\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252" + "\314\2011\377\334\220?\377\331\2052\377\32\24\15\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6L\27\23\14\364\271q$\377\317\201" + "4\377\255u2\377;.\34\377\22\17\15\306\11\11\10q\6\6\6\13\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\205\26\21\13\252\21\16\12\216\10" + "\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\312\2001\377\334\224?\377\333" + "\2148\377\26\23\15\377\0\0\0\0\0\0\0\0\14\12\11\252\310}%\377\332\2153\377" + "\334\223=\377\212V#\377\15\12\10\343\13\11\6\252\15\13\10\306=)\26\377\312" + "o\37\377\314i\31\377\310i\25\377\26\21\11\335\0\0\0\0\0\0\0\0\0\0\0\0\13" + "\11\6l\16\13\7\252\13\11\6\213\6\5\3\21\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6\205" + "\220K\23\377\271V\24\377\262V\23\377\33\22\10\252\0\0\0\0\0\0\0\0\13\11\6" + "U\206F\23\377\265X\24\377\264W\23\377\30\17\7\262\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\10\5c\245V\26\377\316o\33\377\325|&\377$\33\21\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11\205\247p0\377\336\246M\377\337\235" + "H\3776'\27\377\5\5\4%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252" + "\265]\26\377\316o\33\377\326\177+\377\24\20\13\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\11\10\10\252\313\2012\377\336\221?\377\334\223=\377!\32\20\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\14\12\7q\17\14\10\252\15\12\10z\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\12\10\7\252\310x)\377\334\216;\377\333\222<\377\33\25\16\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\15\13\10q\22\17\13\252\21\16\12\216\10\7\5\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\16\14\11q\24\17\13\252\21\16\12\231\12\10\7\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6U\35\25\12\377w>\24\377\231O\24\377(\31\13" + "\377\11\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\40\30\15" + "\332D/\31\377=+\30\377=.\34\377=/\34\377=/\34\377B2\35\377I7\40\377B0\35" + "\377\30\24\17U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6O\40\32\21\364" + "\307\2046\377\320\226K\377zW)\377\21\17\12\252\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34\40\27\13\3435!\16\377\"" + "\27\13\377\14\12\7\276\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" + "\7\4\252\222L\23\377\305c\24\377\314n\33\377;)\26\377\6\6\6\252\12\11\11" + "q\37\32\22\270\36\31\21\377\35\31\22\377\"\33\23\377%\34\22\335\15\13\10" + """9\0\0\0\0\0\0\0\0\15\12\6X\220K\23\377\271V\24\377\262Z\23\377\24\16\7" + "\324\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4}\235Q\24\377\324u!\377\334\224?\377\33" + "\25\16\332\0\0\0\0\0\0\0\0\14\12\11\177\300o\37\377\320p\33\377\312g\27\377" + "\26\20\11\314\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]\211D\22\377\271^\24\377\264" + "[\23\377\36\24\11\252\0\0\0\0\0\0\0\0\13\11\6U\214C\23\377\312j\25\377\326" + "}'\377\31\24\16\377\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\15\13\10\213\24\20\13" + "\252\23\17\12\216\10\7\5\34\0\0\0\0\0\0\0\0\12\11\5\216\231O\24\377\303Z" + "\24\377\316o\33\377\30\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\303" + "q\40\377\323s\36\377\313l\30\377\37\25\12\255\0\0\0\0\0\0\0\0\13\11\6U\214" + "F\23\377\271V\24\377\264W\23\377\30\17\7\265\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\256[\27\377\327{*\377\335" + "\226B\377\31\24\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\7\4\252\224M\23\377\265\\\24\377\264W\23\377\31\21\10\252" + "\0\0\0\0\0\0\0\0\"\30\15\252\241f&\377\333\232F\377\334\216;\377\325|&\377" + "\40\30\15\306\0\0\0\0\0\0\0\0\13\11\6U\214F\23\377\271V\24\377\262Z\23\377" + "\24\16\7\324\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\177\220N\23\377\271V\24\377\264" + "W\23\377\35\23\12\252\0\0\0\0\0\0\0\0\15\13\10t\302t!\377\321n\36\377\312" + "_\27\377\26\21\11\335\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5U\14\11\5\252\12\10" + "\5\202\6\5\3\10\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5n\220N\23\377\271V\24\377" + "\262V\23\377\33\22\10\252\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\271V\24\377" + "\310i\25\377\35\25\14\377\4\4\4\31\12\11\7\213\232d/\377\327\224F\377\306" + "\203-\377.\"\23\377\13\11\6X\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5w\220N\23\377" + "\271V\24\377\264W\23\377\25\17\10\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307w'\377\334\220?\377\335\233" + "F\377\33\25\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253" + "Y\26\377\303b\24\377\267Y\23\377\35\24\10\252\0\0\0\0\0\0\0\0\13\11\6U\213" + "F\24\377\312g\27\377\323v$\377\34\25\15\311\0\0\0\0\10\10\7""9vT'\377\327" + "\237V\377\333\225B\377\330\201-\377\323y\"\377\"\31\15\262\0\0\0\0\0\0\0" + "\0\13\12\6X\222L\23\377\271^\24\377\262Z\23\377\30\22\11\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\22\17\13\252\313z*\377\327~(\377\321j\36\377\40\26\15\270\0" + "\0\0\0\0\0\0\0\14\12\7U\217H\24\377\271^\24\377\262Z\23\377\24\16\7\322\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\4\252\224M\23\377\264W\23\377\262V\23\377\36\25\11\377\5\5\4" + "%\10\7\5\34\24\21\15\343\205Y&\377\327\2168\377\330\201-\377\321s\40\377" + "\32\23\13\322\0\0\0\0\0\0\0\0\13\11\6U\216J\23\377\271V\24\377\262Z\23\377" + "\24\16\7\322\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4z\217K\24\377\313l\30\377\330" + "\201-\377\36\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7n\20\15\11\252\15\12" + "\10z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6i\216J\23\377\271V\24\377\264" + "W\23\377\27\20\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17" + "\15\12\252\313z*\377\327~(\377\321v\36\377\30\21\13\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\252\224M\23\377\265\\\24\377\264W" + "\23\377\27\20\10\306\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6\213\237R\24\377\313d" + "\30\377\324y!\377\34\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11wQ;\"\377" + "\330\231G\377\255u2\377\25\22\16\377\12\12\11\364\13\12\10\377<#\17\377\255" + "U\24\377T1\21\377\15\12\6\252\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\202\222O\23" + "\377\301Y\24\377\313h\30\377xM\37\377\23\21\14\377uP$\377\333\232F\377\262" + "y5\377\24\21\15\377-!\22\377\270^\25\377\303Z\24\377\315j\32\377\36\26\15" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6R#\34\22\377\304r!\377\224P\31\377\40\26" + "\13\377\24\17\11\377\32\22\11\377X1\21\377\225N\24\377(\32\13\377\11\7\4" + "U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\177\214" + "F\23\377\265X\24\377\264W\23\377\22\15\7\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7]hE#\377\311\2030\377\302m!\377A*\24\377\14\12" + "\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\27\20\10\306\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\306\274" + "\205=\377\333\225B\377\302s%\377\21\17\12\364\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\10\5q\220N\23\377\271V\24\377\264W\23\377\22\15\7" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6" + "\4A5\37\14\377\242S\23\377\271^\24\377\202F\25\377\37\26\12\377\31\23\12" + "\306\26\21\11\366F(\17\377\251W\24\377\310i\25\377\324{%\377\34\25\15\335" + "\0\0\0\0\0\0\0\0\14\12\11\205\310\177)\377\322x!\377\312_\27\377\23\16\10" + "\356\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5n\220N\23\377\271V\24\377\262V\23\377" + "\34\23\11\252\0\0\0\0\0\0\0\0\14\12\11\205\302p\37\377\321n\36\377\312f\25" + "\377\25\17\10\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9\14\12\5X\12\10" + "\5U\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5}\222O\23\377\265X\24\377\264W\23\377" + "\31\21\10\303\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5w\220N\23\377\271^\24\377\310" + "i\25\377\27\22\12\335\0\0\0\0\0\0\0\0\13\11\10\231\310{)\377\324u!\377\312" + "g\27\377o?\24\377\33\24\12\377\24\20\11\366\26\21\11\371\34\24\11\306\36" + "\25\11\252\30\21\11\327\34\24\11\311\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\22\15\7\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\13\12\10q\230h/\377\326\2061\377\314i\31\377b6\23" + "\377\22\15\11\343\15\12\10\252\16\14\11\306<)\25\377\307p\34\377\312f\25" + "\377\312g\27\377\32\23\13\314\0\0\0\0\0\0\0\0\14\13\11t\273e\30\377\312]" + "\25\377\273[\24\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\222O\23" + "\377\265X\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\11\6U\213F\24" + "\377\312g\27\377\324{%\377\40\30\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\15\14\12\252\304r!\377\316j\31\377\304c\25\377\34\23\11\252" + "\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\265X\24\377\262V\23\377\244U\25\377" + "\212I\25\377\257]\24\377\262V\23\377.\34\13\377\6\5\3l\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\222L\23\377\275X\24\377\275X\24\377\34" + "\23\11\252\0\0\0\0\0\0\0\0\13\11\6U\211D\22\377\271V\24\377\262Z\23\377\33" + "\21\10\252\0\0\0\0\11\7\4\247\222O\23\377\24\16\7\374\0\0\0\0\13\11\6U\211" + "D\22\377\271^\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\11\6U\211" + "D\22\377\271V\24\377\264W\23\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\11\7" + "\4\252\222O\23\377\271^\24\377\267U\23\377\33\23\10\252\0\0\0\0\0\0\0\0\13" + "\11\6U\214I\23\377\265X\24\377\262Z\23\377\24\17\7\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\20\16\13\252\320\217;\377\337\234F\377\330\2071\377\34\26\15\322\0" + "\0\0\0\0\0\0\0\13\11\6U\214F\23\377\271^\24\377\262Z\23\377H'\15\377\12\10" + "\5\332\10\6\3\252\11\7\4\301'\30\12\377\240R\23\377\271^\24\377\220J\27\377" + "\20\15\11\252\0\0\0\0\0\0\0\0\12\11\7U\221e0\377\332\225C\377\322s\37\377" + "c9\23\377\12\10\5\343\10\6\3\252\11\7\4\276\36\24\11\377\236Q\23\377\271" + "^\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\271" + "V\24\377\264W\23\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\34\15\14\10\216" + "\33\24\12\252\35\25\12\301\30\21\11\374\26\21\11\350\26\21\11\377W1\22\377" + "\265X\24\377\262Z\23\377d6\21\377\13\12\6\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\22\15\7\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\320\2157\377\337\234F\377\331\2052\377" + "\27\23\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5z\220N\23\377\271V\24\377\264" + "W\23\377\36\24\11\260\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7U'\32\14\377\233P\24" + "\377c7\23\377\23\20\14\377\14\13\11\377\22\17\13\377wT&\377\321\211<\377" + "\212V#\377\22\17\13\262\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\202\220N\23\377\265" + "\\\24\377\262Z\23\377'\30\12\377\6\5\3\322\35\24\10\377\251W\24\377a5\22" + "\377\10\7\5\377\32\25\17\377\324\216;\377\335\227D\377\332\2165\377\"\31" + "\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4R\20\14\7\377\240R\23" + "\377\271V\24\377\271V\24\3774\35\13\377\7\6\4\252\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\5US.\20\377\265\\\24\377\262V\23\377W/\16\377\12\10" + "\5\340\10\6\3\252\11\7\4\276\35\24\10\377\303h\30\377\331\2102\377\335\233" + "F\377\36\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5U\32\22\11\377k" + ";\24\377\227P\26\377<\"\17\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\252\237R\24\377\312v#\377" + "B3\35\377\11\11\10`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\320\214" + ";\377\337\234F\377\327\205,\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\16\14\7\364\203C\24\377\260Y\23\377\21\14\6\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\16" + "\12U\253_\34\377\316{!\377\320{\37\377\317p\34\377\312k\27\377\277b\26\377" + "\252[\25\377\303k\26\377\321{\36\377\324\204%\377\326\206'\377\323\205(\377" + "\312y#\377\35\25\14\244\0\0\0\0\0\0\0\0\14\12\7R\250b\35\377\312y#\377\304" + "x\37\377\302s\37\377\276s\33\377\271e\32\377\270d\31\377\307k\32\377\320" + "{\37\377\250i%\377\31\25\16\343\11\10\10\34\0\0\0\0\0\0\0\0\10\10\7\34'\36" + "\22\371\267z*\377\323\205(\377\322\205+\377\241j)\377\17\15\12\335\5\4\4" + "\21\0\0\0\0\0\0\0\0\16\13\7q\224S\31\377\301l\30\377\264]\27\377\33\22\12" + "\231\0\0\0\0\0\0\0\0\14\11\7z\220N\23\377\264[\23\377S.\20\377\7\6\4\270" + "\0\0\0\0\0\0\0\0\4\4\3U\34\25\15\377\312y#\377\321\204*\377\203W$\377\12" + "\11\7\377\5\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7DV>\37\377\316\203+\377\326\202'\377L2" + "\31\377\7\6\6q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\25\21\14\377\312" + "y#\377\322\207%\377\235d&\377\22\17\13\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\22\17\11[\241X\30\377i@\34\377\13\12\10\252\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\7\7U(\34\21\377\256[\27\377*\33\15\255\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5t\205B\20\377\241U\21\377\241N\21\377" + "\31\20\10\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10w\252" + "c\35\377\313~$\377\307\177\"\377\33\24\14\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\15\13\10z\252c\35\377\314\177%\377\307w\"\377\33\24" + "\14\306\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\13\22\15\11\377\232O\23\377\256X\23" + "\377\\3\21\377\14\12\7\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\13\11\6\223\216J\23\377\253Z\22\377\237Q\22\377\21\14\6\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\7\5\216\205B\20\377\241U\21\377\241U\21\377\25\16\6\327" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\306\276k\31\377" + "\313h\30\377\304c\25\377\25\17\10\377\2\2\1\16\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\10\6%#\34\22\377\267p$\377\324\204%\377\262v)\377\33\27" + "\20\377\5\5\4\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\14\10i\216O\27\377\275a\26\377\240S\25\377\22\15\7\332\0\0\0" + "\0\0\0\0\0\0\0\0\0\12\10\7\306\304r!\377\326\201%\377\324\204%\377\33\25" + "\14\322\0\0\0\0\0\0\0\0\15\13\10t\300r\37\377\322}!\377\321{\36\377\313q" + "\32\377\261[\26\377\237R\24\377\240S\25\377\245U\24\377\250Y\23\377\243V" + "\22\377\241N\21\377\27\17\6\252\0\0\0\0\0\0\0\0\11\7\4""9c0\16\377\216I\21" + "\377\205B\20\377\23\15\6\276\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\207B\20\377" + "\241U\21\377\241U\21\377\31\20\6\252\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377" + "\241U\21\377\241U\21\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\260" + "\276k\31\377\324\177#\377\326\206'\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\302m!\377\325\204$\377\320z\35\377" + "\34\24\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\223" + "\210F\21\377\312b\25\377\323~\"\377\33\24\14\377\3\3\2\34\0\0\0\0\0\0\0\0" + "\12\10\7\303\264]\27\377\312f\25\377\312f\25\377\31\21\12\335\0\0\0\0\0\0" + "\0\0\15\13\10A\201F\26\377\254X\25\377\220N\23\377\26\17\7\260\0\0\0\0\0" + "\0\0\0\0\0\0\0\12\10\7\306\306|%\377\327\210*\377\326\206'\377\33\25\14\324" + "\0\0\0\0\0\0\0\0\14\12\7O\227X\32\377\306t\35\377\300m\33\377\31\22\12\247" + "\0\0\0\0\0\0\0\0\14\11\7Rw>\24\377\256Y\25\377\232O\23\377\26\17\7\265\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4D\24\16\7\371\216I\21\377\217" + "J\22\377-\32\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6U'\36\22\377\304y)\377\325\207" + "*\377sH\36\377\12\11\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\21\6\5\5U\5\5\4-\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\216\222O\23\377\314l\27\377" + "\324~!\377\36\26\15\377\3\3\3(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5}\205B\20\377\241U\21\377\241U\21\377" + "\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\210F\21\377\301a\24\377" + "\313l\30\377\36\25\13\301\0\0\0\0\0\0\0\0\15\12\6U\206F\23\377\253Z\22\377" + "\237Q\22\377\21\14\6\356\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\220\207B\20\377\241" + "U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\7\5U\205B\20\377\271" + "^\24\377\321{\36\377\27\22\14\377\3\3\2\34\0\0\0\0\5\5\4\34\22\17\13\343" + "\206H\25\377\236Q\23\377\217J\22\377\26\17\7\216\0\0\0\0\0\0\0\0\12\10\5" + "U\203A\20\377\243O\22\377\262Z\23\377\26\20\11\377\3\2\2\24\0\0\0\0\0\0\0" + "\0\11\7\6\260\220N\23\377\257X\22\377\243O\22\377\32\20\7\252\0\0\0\0\0\0" + "\0\0\12\10\5U\201@\20\377\241U\21\377\241N\21\377\23\15\6\345\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\234\220N\23\377" + "\312f\25\377\316o\33\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\205\207B\20\377\241U\21\377\241U\21" + "\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\377\254U\25\377\275\\\24" + "\377\254W\23\377\30\20\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21" + "\377\241U\21\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\207B\20" + "\377\241U\21\377\241U\21\377\32\20\7\252\0\0\0\0\0\0\0\0\13\11\6U\206F\23" + "\377\253Z\22\377\237N\22\377\27\17\6\252\0\0\0\0\0\0\0\0\11\7\4""9b1\15\377" + "\213G\20\377\205B\20\377\23\15\6\301\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\260\205" + "B\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201" + "@\20\377\245W\22\377\264[\23\377\24\17\11\377\0\0\0\0\5\5\4\21\32\25\17\343" + "~K\31\377\262_\25\377\216J\23\377.\34\13\377\12\10\5""9\0\0\0\0\0\0\0\0\12" + "\10\5U\203A\20\377\241U\21\377\241U\21\377\21\14\6\374\2\1\1\10\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307w\"\377\327" + "\210*\377\326\213)\377\34\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\7\5\252\207B\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0" + "\0\0\12\10\5U\203C\20\377\312f\25\377\323\177$\377\26\21\13\371\0\0\0\0\0" + "\0\0\0\20\16\13\311eC\34\377\277b\26\377\271^\24\377\254W\23\377\32\21\7" + "\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241U\21\377\37\24\10" + "\377\5\5\4f\0\0\0\0\5\4\4\34\20\15\11\377\244U\25\377\264[\23\377\245W\22" + "\377\32\21\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241U\21" + "\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\205\207B\20\377\241U\21\377\241U\21\377" + "\32\21\7\377\3\3\2\210\11\7\4\343\203C\24\377\305h\26\377\306h\25\377\267" + "]\23\377\254W\23\377\32\21\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241" + "U\21\377\241U\21\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\207" + "B\20\377\301a\24\377\321{\36\377\23\17\12\374\0\0\0\0\0\0\0\0\15\13\10A}" + "D\26\377\256V\25\377\222L\23\377\26\16\7\262\0\0\0\0\0\0\0\0\0\0\0\0\10\6" + "\5\220\207B\20\377\241U\21\377\241U\21\377\23\16\6\356\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\243W\24\377\264[\23\377\245W" + "\22\377\21\14\6\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7" + "\4\213\207B\20\377\241U\21\377\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\6\270\264]\27\377\323s\36\377\325\205&\377\34\24\15\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\230[\37\377\274i\37\377sB\26\377" + "[2\20\377T.\17\377t;\21\377v>\21\377\17\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\12\10\5t\222O\23\377\312g\27\377\321\200\40\377\310\177)\377\247" + "j(\377\305z*\377\322\202#\377\272j\33\377X3\23\377f7\21\377\235S\22\377\275" + "\\\24\377\321{\36\377\35\25\14\340\0\0\0\0\0\0\0\0\7\6\6\34)\37\22\353\240" + "T\27\377\252W\23\377-\32\12\377\5\5\4\252\4\4\4\10\4\4\3c\17\14\6\377\214" + "H\21\377\212G\21\377-\32\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\5\216\205B\20\377\241U\21\377\241U\21\377\23\15\6\345" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\240V\25\377" + "\271Z\24\377[2\20\377\7\6\4\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\226\205B\20\377\241U\21\377" + "\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\10\7nJ4\33\377\277g\30\377\260Y\23\377\"\26\11\377\6" + "\5\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\241\205B\20\377\241" + "U\21\377\241N\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5U{=\20\377\241U\21\377\241U\21\377\26\17" + "\7\377\2\2\1U\0\0\0\0\0\0\0\0\7\6\4\364\205B\20\377\247X\22\377\275\\\24" + "\377\33\23\12\303\0\0\0\0\0\0\0\0\14\12\7n\240S\25\377\261U\22\377\241N\21" + "\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\241\205B\20\377\241U\21\377" + "\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\13\11\6U\206F\23\377\253Z\22\377" + "\237N\22\377\17\13\6\371\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5Ub1\15\377\207H\20" + "\377\205B\20\377\23\15\6\213\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377\241U\21" + "\377\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\205B\20\377" + "\245W\22\377\262Z\23\377\30\21\11\324\0\0\0\0\0\0\0\0\15\13\10i\245V\26\377" + "\264[\23\377\237Q\22\377\23\16\6\377\2\2\1O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205" + "B\20\377\241U\21\377\241U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\7\6\6\34\30\23\15\343g;\24\377\235S\22\377\232N\21\377\226Q\23\377\232" + "O\23\377\236Q\23\377\242S\23\377\241U\21\377\237Q\22\377\243V\22\377\33\22" + "\10\252\0\0\0\0\0\0\0\0\13\11\6U\203C\20\377\245W\22\377\241U\21\377\17\13" + "\6\374\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U\21\377\241U\21" + "\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377\257X\22\377\277`\24" + "\377\31\22\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6" + "\252\224M\23\377\251R\22\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10" + "\5U\201@\20\377\241U\21\377\241U\21\377W/\16\377\27\21\10\377A\"\14\377\226" + "L\21\377\204D\21\377)\31\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\7\5\226\205B\20\377\241U\21\377\241N\21\377\27\17\6\252\0\0\0\0\0\0\0" + "\0\12\10\5U\201@\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\10\7" + "\5\231\205B\20\377\23\15\6\356\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241" + "U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241" + "U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U" + "\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241" + "U\21\377\241U\21\377\37\24\10\377\5\4\4U\0\0\0\0\5\4\4(\21\16\12\377\310" + "x#\377\317p\34\377\303b\24\377\35\24\10\252\0\0\0\0\0\0\0\0\12\10\5U\203" + "A\20\377\243V\22\377\237Q\22\377\226L\21\377\211F\20\377\207H\20\377\207" + "B\20\377\222K\21\377\237Q\22\377\203C\24\377*\37\21\377\12\11\7>\0\0\0\0" + "\0\0\0\0\5\5\4\10\32\25\17\343\211O\34\377\256X\23\377\236S\21\377\211F\20" + "\377\207H\20\377\207B\20\377\222K\21\377\237Q\22\377\241U\21\377\241U\21" + "\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\203C\20\377\243V\22\377\237Q\22" + "\377\21\14\6\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\2\1\1\10\7\6\4\371\211C\20\377\245P\22\377\232N\21\377\33\22\10" + "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U\21\377\241" + "U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307|$\377" + "\323}\40\377\310i\25\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\205" + "B\20\377\241U\21\377\241N\21\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\7\5zD&\15\377\226S\27\377\256k#\377\265p&\377\276u'\377\301r$\377" + "\217T\32\377\17\14\10\324\4\4\3\6\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5l\207B\20" + "\377\241U\21\377\241U\21\377}A\20\377Z/\15\377y<\20\377\244T\23\377\275a" + "\26\377\261h\40\377\302{'\377\324\206)\377\322|\37\377\310i\25\377\27\21" + "\10\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\2478\37\13\377n7\17\377v" + ">\21\377s:\20\377s:\20\377x?\21\377_.\16\377\21\15\6\343\7\6\4\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\16\14\7\343W+\16\377\232N\21\377\230M\21\377\213" + "G\20\377\207H\20\377\207B\20\377\222K\21\377\310i\25\377\323\177$\377\326" + "\206'\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U\32\20\7\377\203C\20" + "\377\221K\22\377N+\17\377\7\6\4\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\210\235Q\24\377\322\201" + "!\377\213Y$\377\12\11\7\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252" + "\304q\37\377\316r\31\377\275\\\24\377\22\15\7\364\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\5\4\4X\33\23\10\377\215I\22\377\241U\21\377\25\16\6\332\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\11\7c\13\10\6\252\12\10\5[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\13\12\10\34\40\27\15\343l9\23\377\231R\22\377\232N\21\377\222K\21" + "\377a/\16\377$\30\13\377l@\31\377\313o\36\377\317v\40\377\317v\40\377\275" + "n\40\377?)\24\377\17\14\10L\0\0\0\0\0\0\0\0\11\10\6\34&\33\17\3323!\22\377" + "0\40\21\377\203J\30\377\266a\25\377\260Y\23\377\252W\23\377\206H\25\377%" + "\31\16\377\17\15\10\220\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10\177\253" + "c\34\377\320{\37\377\313|\36\377h?\33\377\17\15\12\324\7\6\6\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\16\13\7\252\216J\23\377\241U\21\377\237Q\22\377\33\22\10\270" + "\0\0\0\0\0\0\0\0\6\5\3\34\33\21\10\343\\.\15\377o7\16\377\37\24\10\377\10" + "\6\3\306\11\7\4\252\12\10\5\343\26\20\11\377='\22\377k@\32\377lB\31\377\40" + "\26\13\377\11\7\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\2348$\23\377\277r\40\377\257" + "b\36\377)\33\20\377\13\11\6""9\0\0\0\0\0\0\0\0\0\0\0\0\25\17\12\343d8\25" + "\377\240S\25\377P,\21\377\16\14\7\276\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\15\12\6\34\35\24\12\324\25\17\12\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\11\7U'\30\12\255\20\14\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\24\23\15\6\255\25\16\6\377\25\17\6\327" + "\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\252\276" + "b\27\377\313l\30\377\312o\27\377\27\21\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\21\15\12\252\303p\36\377\323|\36\377\315j\32\377\37" + "\25\14\377\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\213,\31\11\377\207H\20\377h6\15" + "\377\17\13\6\371\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\4""9,\31\11\377\211I\20\377\217F\20\3771\31\10\377\10\6\3\270\10\6\3" + "U\10\6\3\216\27\20\6\377\202B\17\377\221M\20\377W,\14\377\12\10\5\216\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10\2445\37\16\377\226J\23\377" + "\232N\21\377\224L\21\377A!\12\377\12\10\5\270\6\5\5\34\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\13\11\6\216\257f\36\377\317{\40\377\320r\37\377\304r!\377" + "Y8\32\377\21\15\12\377\13\10\6\252\11\7\6\252\13\10\6\252\17\13\10\252\22" + "\15\11\216\10\6\5\34\0\0\0\0\0\0\0\0\12\10\5]f5\21\377\237Q\22\377\232N\21" + "\377H%\13\377\13\10\6\343\11\7\6\252\13\10\6\306=$\24\377\304k\33\377\314" + "r\33\377\266f\37\377\23\16\12\252\0\0\0\0\0\0\0\0\6\6\5\24\32\23\13\306\34" + "\24\13\377\26\20\11\377\27\20\10\377\33\22\10\377\30\20\7\377\30\20\7\377" + "J'\13\377\213D\20\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0" + "\7\6\4JW,\14\377\233O\22\377\227I\20\377C\"\12\377\11\7\4\306\11\7\4`\10" + "\6\5\237\33\21\10\377\211C\20\377\236P\21\377p8\17\377\12\10\5\247\0\0\0" + "\0\0\0\0\0\7\5\4UJ$\13\377\226S\21\377\221M\20\3777\35\12\377\10\6\3\306" + "\10\6\3X\7\6\4\231'\30\14\377\307p\34\377\322s\37\377\270l!\377\21\16\12" + "\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\213E\22" + "\377\250V\23\377\232N\21\377\21\14\6\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\7\6\4U@\40\13\377\242P\23\377\306`\25\377m?\32\377\17\13" + "\10\343\12\10\7\252\10\7\5\303\35\22\10\377\211C\20\377\232N\21\377r;\17" + "\377\13\12\6\244\0\0\0\0\0\0\0\0\11\7\6Ua2\20\377\237Q\22\377\230M\21\377" + "J$\13\377\12\10\5\306\7\6\4}\12\10\5\306=$\24\377\310i\35\377\321z\34\377" + "\264h\35\377\20\14\11\252\0\0\0\0\0\0\0\0\14\12\7\252\240S\25\377\267Y\23" + "\377\256X\23\377\34\23\11\273\0\0\0\0\0\0\0\0\16\12\7U\217K\24\377\303b\24" + "\377\275\\\24\377\25\17\10\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\7\6\4U\32\20\7\377o7\16\377\204C\17\377'\27\10\377\10\6\3q\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6U\40\26\15" + "\377\274p\37\377\301r\36\377^9\31\377\21\15\12\252\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4" + "\216\12\10\5\377\12\10\5\306\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\7\5UX0\23\377\314r\33\377\320v\37\377o>\32\377\13\10\6\343" + "\10\7\5\226\12\10\5t\12\10\5X\11\7\4U\6\5\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\12\10\5cr8\15\377\217F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\7\3\202v<\15\377\224L\21\377\226L\21\377\30\20\7\252\0\0\0" + "\0\0\0\0\0\11\7\4Ur8\15\377\221J\20\377\217F\20\3774\34\11\377\10\6\3\306" + "\10\6\3X\10\6\3\220\27\17\6\377\202B\17\377\227P\20\377o7\16\377\12\10\5" + "\220\0\0\0\0\0\0\0\0\6\5\3;;\40\12\377\235S\22\377\271Z\24\377a6\26\377\16" + "\12\7\343\15\12\6\252\15\12\6\377T)\15\377\224L\21\377\233R\22\377\207B\20" + "\377\16\12\5\237\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\221J\20\377" + "7\34\12\377\11\7\4\306\10\6\3]\10\6\3\223\31\20\6\377\202@\17\377\227P\20" + "\377o7\16\377\12\10\5\216\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\217" + "F\20\3774\34\11\377\10\6\3\306\10\6\3f\10\6\3\213\10\6\3\252\11\10\4q\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\10\5[r8\15\377\226L\21\377\226L\21\377\21\14\6\374" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U@" + "!\13\377\221M\20\377\217F\20\3778\35\11\377\10\6\3\306\10\6\3U\6\5\3w\16" + "\13\5\377\200B\17\377\227I\20\377\217L\20\377\24\15\5\252\0\0\0\0\0\0\0\0" + "\11\7\4Ur8\15\377\217F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\7\3\202r8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0" + "\0\0\11\7\4Ur8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0" + "\7\6\4GW,\14\377\236W\21\377\241U\21\377g5\24\377\17\13\10\343\12\10\7\252" + "\12\10\7\303!\24\12\377\211C\20\377\227I\20\377o7\16\377\12\10\5\216\0\0" + "\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20\377\222K\21\377\22\15\7\377\0\0\0\0" + "\0\0\0\0\7\6\6J\30\20\7\377\204C\17\377\221M\20\377\207H\20\377\16\12\5\252" + "\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\217F\20\377:\37\13\377\13\10" + "\6\343\13\11\6\252\13\10\6\252\12\7\5\252\11\10\4q\0\0\0\0\0\0\0\0\0\0\0" + "\0\13\11\6\241\257\\\30\377\313l\30\377\306e\27\377\31\22\12\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3\223r8\15\377\217F\20\377\217F\20" + "\377\24\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\252W\23\377\307j\30\377" + "\30\21\13\377\0\0\0\0\0\0\0\0\6\6\5\34\17\14\6\377\200B\17\377\221J\20\377" + "\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\6\5\3""99\37\12\377\221M\20\377" + "\217F\20\377Z,\15\377\23\15\6\377\12\10\5\377\15\12\6\377>!\13\377\207H\20" + "\377\227I\20\377l5\15\377\12\10\5\216\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217" + "F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U@!\13\377\221M\20\377\217" + "F\20\377C\"\12\377\16\12\5\3771\33\11\377\214H\21\377\240U\23\377\240U\23" + "\377n7\17\377\37\24\10\377\11\7\4""9\0\0\0\0\0\0\0\0\11\10\4Ur8\15\377\217" + "F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210v<\15" + "\377\232K\21\377\254W\23\377\30\21\11\314\0\0\0\0\0\0\0\0\10\7\5U_1\20\377" + "\241U\21\377\230M\21\377G\"\12\377\11\7\4\306\10\6\3X\10\6\3\216\27\17\6" + "\377\202B\17\377\227P\20\377o7\16\377\16\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\244v8\17\377\221J\20\377\217F\20\377\20\14" + "\5\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4UU+\14\377\227" + "P\20\377\217F\20\3777\35\12\377\10\6\3\306\10\6\3]\10\6\5\255-\33\16\377" + "\307p\34\377\322|\37\377\307w\"\377\23\17\12\335\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\15\13\10\252.\34\13\377\203A\20\377\221J\20\377\211C\20" + "\377F#\13\377\14\12\5\340\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5" + "\"%\31\16\377\265d\34\377\316q\37\377\317{\40\377\307w\"\377kC\34\377\34" + "\24\13\377\34\23\11\377T)\15\377\215K\20\377\221J\20\377\237R\24\377X5\31" + "\377\15\13\10c\0\0\0\0\0\0\0\0\15\12\6Ur<\21\377\224L\21\377\217F\20\377" + "\25\16\6\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252w=\16\377\221M\20\377\207" + "H\20\377\23\15\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7" + "\3\216r8\15\377\217F\20\377\217F\20\377\20\14\5\332\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6\252~>\17\377\227P\20\377p9\15\377\23\15" + "\6\377\10\6\3\220\10\6\3U\11\7\4q\10\6\3\247\10\6\3\252\10\6\3\252\11\10" + "\4q\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5[r8\15\377\221J\20\377\217F\20\377=\40" + "\12\377\11\10\4\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\7\317J$\13\377\213J\20\377O(\14\377\12\10\5\322\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\33\21\6\377\202B\17\377\217F\20\377\217" + "L\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\6\3UJ'\13\377\221M\20\377\217F\20\377)\27\10\377\7\6\4\255" + "\5\5\2U\6\5\3q\16\12\5\377\201A\16\377\221J\20\377\221J\20\377\30\20\7\252" + "\0\0\0\0\0\0\0\0\12\10\5Up9\15\377\221M\20\377\217F\20\3774\34\11\377\10" + "\6\3\306\10\6\3X\10\6\3\220\27\17\6\377\202B\17\377\227P\20\377o7\16\377" + "\12\10\5\220\0\0\0\0\0\0\0\0\6\5\3;?\"\12\377\221M\20\377\217F\20\3777\35" + "\12\377\10\6\3\306\10\6\3U\10\6\3\220\40\23\7\377\213J\20\377\233O\22\377" + "\207B\20\377\16\12\5\252\0\0\0\0\0\0\0\0\6\5\3""99\37\12\377\221M\20\377" + "\217F\20\3777\35\12\377\10\6\3\306\10\6\3X\10\6\3\220\25\17\6\377\202B\17" + "\377\217L\20\377\222K\21\377\30\17\7\270\0\0\0\0\0\0\0\0\7\6\4GB!\13\377" + "\224O\21\377\217F\20\377-\31\10\377\7\5\4\260\7\5\4U\10\6\3U\11\7\4U\10\6" + "\3R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8" + "\15\377\217F\20\377\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\7\6\4\34\12\10\5\202\23\15\6\252\35\23\10\255\30\20\7\324\33\22" + "\10\301\24\15\7\3667\35\12\377\213J\20\377\217F\20\377\217F\20\377\22\15" + "\5\252\0\0\0\0\0\0\0\0\11\7\4Us6\16\377\217F\20\377\217F\20\377\20\14\5\335" + "\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8\15\377\217F\20\377\217F\20\377\24\15" + "\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221J\20\377\221J\20\377\21\13\6\374" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252w=\16\377\221" + "J\20\377\217F\20\377\22\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20" + "\377\217F\20\377!\24\10\377\5\4\4\303\10\6\5\306.\32\11\377~>\17\377\204" + "C\17\377#\26\10\377\11\7\4]\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]r8\15\377\217" + "F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20" + "\377\217F\20\377\24\15\5\252\0\0\0\0\11\7\4}r8\15\377\25\15\6\322\0\0\0\0" + "\11\7\4Ur8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11" + "\7\4Ur8\15\377\217F\20\377\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\7\3\210r8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0" + "\0\6\5\3""99\37\12\377\221M\20\377\217F\20\377Z,\15\377\21\14\6\377\14\11" + "\5\377\24\17\11\377a3\24\377\251W\24\377\241U\21\377p6\17\377\12\10\5\216" + "\0\0\0\0\0\0\0\0\11\7\4Uy<\20\377\256X\23\377\260Y\23\377p;\21\377%\27\12" + "\377\32\20\7\377\31\22\10\377\30\17\7\377\27\20\10\377\22\15\11\306\12\11" + "\7c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\"\14\12\7\247\24\16\7\322\25" + "\17\6\377\32\21\7\377\30\20\7\377\32\21\7\377F#\13\377\216I\21\377\224L\21" + "\377\230M\21\377\30\17\7\252\0\0\0\0\0\0\0\0\15\12\6`\201A\22\377\252W\23" + "\377\252W\23\377\30\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2L\10\6\3U\10\6" + "\3U\10\6\3U\7\5\4U\6\5\3w\20\13\5\377\201A\16\377\227I\20\377v=\17\377\16" + "\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8\15\377\217F\20\377" + "\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7qmC\32\377" + "\270Z\25\377\224L\21\3774\34\11\377\10\6\3\306\10\6\3X\10\6\3\220\25\17\6" + "\377\202B\17\377\217L\20\377\217L\20\377\20\14\5\343\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\11\10\6\252C*\24\377\312|\37\377\320\200!\377\315j\32" + "\377h:\25\377\16\13\7\332\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4" + "\34\33\21\10\345f3\15\377\213D\20\377\217I\20\377\221J\20\377G%\14\377\32" + "\22\11\377P2\27\377\314z!\377\320s!\377\312h\31\377\225N\24\3774\36\13\377" + "\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\252U+\14\377\211I\20\377M'\14\377" + "\16\12\5\343\12\10\5\252\12\10\5\306.\32\11\377\211I\20\377s;\16\377\31\20" + "\6\350\10\6\3\37\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\12\10\5w\23\15\6\252\35" + "\23\10\255\32\20\7\322\33\22\10\273\21\14\6\366:\36\13\377\227M\22\377\300" + "a\25\377\300a\25\377\30\20\11\317\0\0\0\0\0\0\0\0\4\4\3\3\31\20\6\353s;\16" + "\377\217I\20\377\221M\20\377l5\15\377\25\16\6\377\7\6\4\244\12\7\5U\10\7" + "\5\223\11\7\4\210\10\6\5L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5" + """9:!\15\377\274k\33\377\300o\37\377U3\30\377\22\15\11\273\6\5\5\24\0\0\0" + "\0\0\0\0\0\13\11\6\234\213E\22\377\236S\21\377\224L\21\377\27\17\6\252\0" + "\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\23\15\6\377f3\15\377\200B\17\377Q)\14\377" + "\14\11\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\15\12\10Us<\30\377\242K\27\377y<\24\377\27\17\10\216\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\6\12\10\5\252]0\14\377{A\16" + "\377{<\16\377\16\12\5\343\3\3\2U\14\12\7\252\243S\30\377\307c\32\377\301" + "`\30\377)\32\16\343\6\6\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\3\3\2\34\13\10\6\252j2\15\377\201?\16\377\201?\16\377\35\22\10\343\6\5" + "\5\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10\210\220I\25\377\266" + "Y\25\377c7\23\377\16\13\7\273\4\4\3\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" + "\7\4q].\14\377\203B\16\377y>\16\377\20\13\5\252\0\0\0\0\0\0\0\0\0\0\0\0\7" + "\6\4\34\16\12\5\343d2\15\377n;\15\377g4\16\377y;\22\377\206E\25\377\40\25" + "\13\377\6\5\5\306\12\10\7\343.\34\15\377h3\17\377`.\15\377\16\12\5\213\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\12\10\7l?%\22\377\260X\27\377\240P\25\377\24\16\11\252\0\0" + "\0\0\0\0\0\0\10\6\5OU)\14\377\203A\20\377B\"\13\377\12\10\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\247" + "s8\20\377\245U\24\377pA\27\377\22\15\11\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\15\12\10\216\204D\25\377\242P\23\377\215F\22\377\21\14" + "\6\265\0\0\0\0\0\0\0\0\0\0\0\0\21\14\6\377g6\16\377\202B\17\377\37\24\10" + "\377\6\5\3q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\6\3\234#\26\10\377r:\15\377n;\15\377X-\13\377X*\13\377\\/\13\377h6" + "\15\377w:\16\377=\40\12\377\12\10\5\340\5\4\4\24\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\13\10\6Uq:\26\377\264Z\27\377\214E\21\377{?\16\377{<\16\377w8\16" + "\377x=\21\377\30\17\11\247\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\205\264" + "X\33\377\313k\36\377\307d\34\377\305h\34\377\277]\34\377\247N\30\377\204" + "D\25\377y>\22\377u<\22\377v9\21\377l2\17\377\21\14\6q\0\0\0\0\0\0\0\0\0\0" + "\0\0\16\12\5\343A!\12\377s;\16\377s;\16\377m4\16\377t9\21\377y;\22\377\213" + "D\24\377\232I\23\377s>\24\377!\27\14\377\11\10\6G\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\2\1\10\10\6\3\252]2\14" + "\377}@\16\377{<\16\377\16\12\5\237\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\340A!" + "\12\377s;\16\377s;\16\377m4\16\377w=\22\377\201B\24\377\224K\25\377\252T" + "\25\377\201C\26\377%\31\16\377\10\7\5""9\0\0\0\0\0\0\0\0\5\5\4\27\30\21\11" + "\377g6\22\377\204?\21\377x>\17\377b1\15\377Z-\13\377^-\15\377|<\21\377\254" + "Q\25\377\226N\31\377,\35\21\377\11\10\6[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\3f].\14\377}@\16\377y>\16\377\22\14\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\343@!\13\377\204B" + "\21\377\236O\25\377\227F\26\377\202C\25\377n5\17\377l5\15\377v<\15\377U+" + "\14\377\25\16\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\343A!\12\377" + "\203A\20\377\225H\24\377\205D\24\377o6\20\377n5\17\377\212H\23\377\243Q\24" + "\377p:\23\377\34\24\11\377\10\7\5""9\0\0\0\0\0\0\0\0\11\7\4[`0\15\377\204" + "F\17\377{<\16\377\16\12\5\241\0\0\0\0\0\0\0\0\15\12\6U\224I\27\377\312e\33" + "\377\201C\32\377\22\15\11\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\6\5\3""0\21\14\6\343l7\15\377p7\15\377#\26\10\377\11\7\4""9" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\26\15\377\211" + "D\26\377\232I\23\377-\32\12\377\10\6\5\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3DC\"\12" + "\377s8\20\377m4\16\377\20\13\5\223\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\5\4\4\13\26\21\13\343\201L\34\377\303_\34\377\272T\27\377y;\22" + "\377k3\16\377`.\15\377Z-\13\377X-\13\377)\30\10\377\14\12\5\260\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\6\3LX,\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\7\4U\\/\13\377}@\16\377{<\16\377\20\13\5\226\0\0\0\0\0\0" + "\0\0\10\6\3>X-\13\377}@\16\377{<\16\377r:\15\377]2\14\377X,\13\377\\/\13" + "\377h6\15\377w:\16\377U+\14\377\25\17\6\377\7\6\4""3\0\0\0\0\0\0\0\0\0\0" + "\0\0\14\12\5\335=\40\12\377x>\17\377{=\20\377m4\16\377`.\15\377f3\15\377" + "s;\16\377{A\16\377U+\14\377\31\20\6\377\7\6\4""3\0\0\0\0\0\0\0\0\10\6\3J" + "X-\13\377}@\16\377{<\16\377r:\15\377]2\14\377X-\13\377\\/\13\377h4\15\377" + "v<\15\377U+\14\377\25\17\6\377\7\5\4(\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}@" + "\16\377{<\16\377r:\15\377]2\14\377X-\13\377\\+\13\377]2\14\377]2\14\377\24" + "\15\5U\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}@\16\377y>\16\377\22\15\5\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12" + "\5\343;\37\12\377s>\16\377r:\15\377]2\14\377X,\13\377X,\13\377h6\15\377v" + "<\15\377{<\16\377{<\16\377\16\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}" + "B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}" + "B\16\377{A\16\377\16\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{" + "A\16\377\16\12\5\237\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\335F#\13\377\233J\24" + "\377\301Y\32\377\271[\34\377\254U\33\377\245P\30\377\233N\26\377\204B\21" + "\377Z,\15\377\25\17\6\377\7\5\4(\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}@\16\377" + "y>\16\377\23\15\6\260\0\0\0\0\0\0\0\0\0\0\0\0\11\6\4\205]2\14\377\203B\16" + "\377{A\16\377\16\13\5\226\0\0\0\0\0\0\0\0\10\6\3>X-\13\377}@\16\377{<\16" + "\377v8\17\377x=\21\377\210C\25\377v9\21\377`0\15\377\\/\13\377\22\14\5U\0" + "\0\0\0\0\0\0\0\11\7\4Oh3\17\377\214B\21\377\207B\20\377\21\14\6\306\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{A\16\377\16" + "\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377\207B\20\377\210C\21\377\26\16" + "\7\306\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3wX-\13\377}@\16\377{<\16\377\16\12\5" + "\237\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\322;\37\12\377s>\16\377v<\15\377h6\15" + "\377d2\15\377d2\15\377r:\15\377w?\16\377U+\14\377\25\17\6\377\7\5\4(\0\0" + "\0\0\0\0\0\0\10\6\3JX-\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\12\5\343;\37\12\377s>\16\377r:\15\377d2\15\377r8\15\377\205B\20\377" + "\240P\25\377\260S\25\377-\33\14\377\6\5\3\252\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3RX-\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\11\7" + "\4U\\/\13\377\203=\16\377~>\17\377\21\13\6\252\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\343A!\12\377s;\16\377s>\16\377]2\14\377X,\13\377\\/\13\377h6\15\377" + "w:\16\377U+\14\377\25\17\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\23\15\6\377T*\13\377s>\16" + "\377n;\15\377]2\14\377T,\13\377j6\17\377\260T\27\377\307d\34\377\274e\37" + "\377Z6\31\377\15\12\10\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\6\3\244H%\13\377\203B\16\377n6\15\377\14\11\5\340\3\3\2\21\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6U\36\24\15\377\276`\33\377" + "\307b\30\377yE\26\377\15\12\6\276\4\3\3\34\5\4\2i\33\21\6\377r8\15\377}@" + "\16\377-\32\12\377\10\7\5\231\0\0\0\0\0\0\0\0\0\0\0\0\12\7\5U`0\15\377}@" + "\16\377{<\16\377\20\13\5\303\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3n\\/\13\377\203" + "B\16\377{A\16\377\22\15\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3c]2\14\377}B\16\377s;\16\377h6\15\377" + "X-\13\377X,\13\377\\+\13\377\\+\13\377\\+\13\377]2\14\377]2\14\377\24\15" + "\5U\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}@\16\377{<\16\377s>\16\377].\14\377" + "\20\13\5\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4" + "\4\34\14\12\5\366h6\15\377s;\16\377'\27\10\377\10\6\3R\0\0\0\0\0\0\0\0\0" + "\0\0\0:\37\11\377r:\15\377w?\16\377{<\16\377{A\16\377\22\14\5\252\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5" + "\343;\37\12\377s>\16\377n;\15\377X,\13\377P*\13\377X,\13\377h6\15\377s;\16" + "\377{<\16\377{<\16\377\20\13\5\226\0\0\0\0\0\0\0\0\10\6\3AX,\13\377}@\16" + "\377{<\16\377r:\15\377]2\14\377X,\13\377\\/\13\377h6\15\377w:\16\377U+\14" + "\377\25\17\6\377\7\6\4""3\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\340?\40\12\377" + "s>\16\377r8\15\377]2\14\377X,\13\377X-\13\377n;\15\377w=\16\377U+\14\377" + "\31\20\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\335;\37\12\377s>\16" + "\377r8\15\377]2\14\377X,\13\377\\/\13\377h6\15\377s;\16\377{<\16\377y>\16" + "\377\20\13\5\247\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\332;\37\12\377s>\16\377" + "n;\15\377X,\13\377P*\13\377X,\13\377X-\13\377X,\13\377\20\13\5i\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377" + "\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\306]2\14\377}B\16\377{<\16\377" + "\14\12\5\252\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{A\16\377\22\14\5\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{A\16\377\16\12\5\226" + "\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{<\16\377\22\15\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\13\11\7\4\343d2\15\377{<\16\377{<\16" + "\377\14\12\5\252\0\0\0\0\0\0\0\0\10\6\3>X-\13\377}B\16\377{<\16\377\16\12" + "\5\306\0\0\0\0\0\0\0\0\10\6\3\252#\26\10\377s;\16\377p7\15\377!\25\10\377" + "\10\6\3%\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}B\16\377{A\16\377\16\12\5\226\0" + "\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{A\16\377\16\13\5\223\0\0\0\0\11" + "\7\4U\\/\13\377\24\15\5\252\0\0\0\0\10\6\3>X-\13\377}B\16\377{A\16\377\16" + "\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{<\16\377\22\14\5\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\16\12\5\237" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\322;\37\12\377s;\16\377v<\15\377h6\15\377" + "f3\15\377p5\15\377z?\17\377{:\16\377U+\14\377\25\17\6\377\7\5\4-\0\0\0\0" + "\0\0\0\0\10\6\3Uq7\20\377\304\\\27\377\303`\30\377\31\21\12\377\4\3\3O\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\2\2\34\12\10\5\343" + "\212G\25\377\261W\24\377\256V\25\377\30\20\11\252\0\0\0\0\0\0\0\0\15\12\10" + "U\216I\27\377\303`\30\377\302[\27\377\30\21\13\343\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" + "\5\226#\26\10\377P*\13\377T,\13\377X,\13\377P*\13\377X,\13\377a2\14\377v" + "<\15\377U+\14\377\25\17\6\377\10\6\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" + "\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\6\5\5\34\21\15\10\343D\"\13\377s;\16\377n;\15\377]2\14\377X,\13\377" + "\\/\13\377h6\15\377s;\16\377{<\16\377{A\16\377\22\14\5\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7\252\203E\30\377\277Z\26\377\210" + "G\23\377\17\13\6\343\4\3\3\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\7\6\4\37\20\13\5\343h4\15\377\203B\16\377b1\15\377\12\10\5\301\3\2\2" + "D\10\7\5\252yB\32\377\303`\30\377\234J\23\377\"\25\11\377\11\7\4U\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""3E#\12\377y>\16\377{<\16\377\20\13\5\343\4\3\3\34" + "\0\0\0\0\0\0\0\0\10\6\3\252\\/\13\377}@\16\377l7\15\377\16\12\5\244\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\7\5\4\306`0\15\377\206A\17\377\205B\20\377\17\13\6\252\0\0\0\0\0\0\0\0" + "\7\5\4UN'\13\377\202@\17\377\202@\17\377\206A\17\377\210C\21\377|>\21\377" + "r8\21\377q7\20\377v<\21\377k7\24\3770\35\17\377\14\12\7U\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252-\33\14\377\213F\24\377\203B\22\377k" + "5\16\377\23\15\6c\0\0\0\0\0\0\0\0\10\6\5U\\.\15\377\203=\16\377}@\16\377" + "\16\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0:\37\11\377n;\15\377s;\16\3778\35\11" + "\377\12\10\5\343\5\4\4\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\34\22\13\3241\34\20\377#\25\14\361\15" + "\12\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\216\24\16\5\252\20\14\5\244\10\6\3\34\0\0\0\0\0\0\0\0\30\20\11\216" + "\25\17\10\374\27\17\10\270\13\10\6\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\16\5\252\20\13\5\252" + "\12\10\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\31\24\15" + "\7\223\26\17\7\252\12\10\5\216\5\4\4\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12\5\234\16\12\5\345\30\17\11\377\40\24" + "\13\377\34\22\13\364\14\11\7l\0\0\0\0\0\0\0\0\12\10\5\216\23\15\10\353\30" + "\17\7\343\12\10\5;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]\27\17\10\252\34\22\11" + "\255\17\13\6\34\0\0\0\0\0\0\0\0\0\0\0\0\22\14\5\216\25\16\6\252\11\7\4\205" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\6\5qY,\16\377d3\25\377\15\12\10\343\6\5\5\34\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\10\21\14\6\216\32\20\7\252\22\14\5" + "\252\11\7\4\34\0\0\0\0\0\0\0\0\6\5\3U6\34\13\377\210B\23\377y;\22\377\17" + "\12\6\361\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""9\14\11\5\252\22\15\5\262\16\12\5\361\16\12\5\377" + "\16\12\5\374\20\13\5\303\20\13\5\252\10\6\3q\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\6\5\34\30\20\11\314\30\21\11\377\21\14\6\322\16\12" + "\5\252\20\13\5\252\21\13\6\366\33\21\12\366\16\12\7U\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\6\5\34\25\16\12\303\26\17\13\377\22\15\11\377\22\15\11\377" + "\26\17\11\377\23\15\10\377\21\14\6\377\21\13\6\377\17\13\6\377\21\14\6\377" + "\23\15\6\314\14\11\5\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6\3z\16\12\5" + "\252\22\15\5\260\16\12\5\353\17\13\6\377\17\13\6\377\23\14\6\314\23\15\6" + "\252\12\10\5\252\10\6\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252" + "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6\3}\16\12\5\252" + "\16\12\5\322\27\17\10\377\36\24\13\377\36\24\13\377\27\21\12\377\24\16\11" + "\364\20\14\11\252\11\10\6O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6A\17\13" + "\10\252\21\14\10\350\25\16\10\377\32\20\11\377\27\17\10\377\25\16\10\377" + "\17\13\6\377\26\17\7\262\13\11\6\252\12\10\7""9\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\216\24\15\5\252\20\13\5\252" + "\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4" + "\34\10\6\3\205\17\13\6\301\24\17\11\377\34\22\13\377\36\24\13\377\32\20\11" + "\377\16\12\5\356\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\5\4\2\34\10\6\3\216\22\14\7\317\26\17\11\377\34\22\13\377\33\22" + "\12\377\22\15\7\377\17\13\6\343\25\15\6\252\12\7\5\244\7\6\4""9\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\14\5\252\11\7\4\34\0\0" + "\0\0\0\0\0\0\12\10\7w\225@\32\377\203?\32\377\16\13\7\343\6\5\5\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12" + "\5\234\24\15\5\252\14\11\5\216\6\5\3\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\14\12\7\216\30\17\7\252\25\15\6\252\10\6\3L\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\11\7\6US+\20\377\260X\27\377\202>\25\377\20\13\7\252\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\34\15\12\10" + "\244\27\20\12\276\20\13\7\374\17\13\6\377\16\12\5\377\16\12\5\377\16\12\5" + "\377\20\13\5\350\16\12\5\252\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12" + "\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\210\20\14\5\252\20\13\5\252\22\14\5\252\20\13\5\322\16\12\5\377\16" + "\12\5\371\20\14\5\301\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\14\5\260\16\12\5\356\16\12\5" + "\366\20\14\5\303\22\15\5\252\20\13\5\252\11\7\4\226\7\5\4""6\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\16\12\5\216\20\14\5\252\20\13\5\252\22\14\5\252\20\13" + "\5\322\16\12\5\377\16\12\5\371\20\14\5\301\20\13\5\252\11\7\4\231\7\6\4""9" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\20\14\5\252\20\13\5\252\22\14" + "\5\252\20\13\5\322\16\12\5\374\14\11\5\377\20\13\5\377\24\15\5\311\13\11" + "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\213\24\15\5\252\20\13\5\252\11\7\4" + "\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\5\5\4\34\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\20\13" + "\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13\5\244\11\7\4\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\6\5\3\34\10\7\5\213\23\15\10\301\25\17\12\377\37\25\14" + "\377\40\25\15\377\37\24\14\377\27\21\12\377\22\14\7\324\12\10\5\237\7\6\4" + """9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11" + "\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\14\5\252" + "\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\210\20\14\5\252\20\13\5\252\22" + "\14\5\260\21\14\6\374\25\16\10\377\21\14\6\377\20\13\5\377\24\15\5\314\13" + "\11\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\16\6\252\22\14\5\252\11\10" + "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5" + "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252" + "\20\14\5\252\12\10\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\24\15" + "\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3}\16" + "\12\5\252\22\14\5\252\24\16\5\255\20\14\5\301\24\15\5\262\24\15\5\252\20" + "\13\5\252\11\7\4\231\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" + "\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3}\16\12" + "\5\252\22\15\5\252\24\16\5\252\22\14\5\252\15\12\6\343H&\23\377\271V\40\377" + "\220@\35\377\24\17\13\350\10\7\7\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25" + "\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" + "\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6" + "\3z\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\371\20\14\5\301" + "\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\7\4\244" + "\16\12\5\252\22\15\5\255\16\12\5\345\16\12\5\377\21\14\6\377\26\17\11\377" + "\24\16\11\374\25\17\12\260\13\11\6\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\4z\22\14\5\252\16\12\5\226\7\5\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\7""9" + "\30\20\13\255\32\22\11\276\15\12\6\216\5\4\4\13\0\0\0\0\0\0\0\0\10\7\3D\16" + "\12\5\252\20\13\5\252\11\7\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\216\24\16\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\16\12\5\216\24\16\5\252\20\13\5\252\11\10\4\34\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7" + "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" + "\22\15\5\252\20\14\5\252\22\15\5\255\16\12\5\343\16\12\5\377\16\12\5\374" + "\14\11\5\377\14\11\5\377\20\13\5\377\24\15\5\311\13\11\4\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\5\210\20\14\5\252\20\13\5\252\20\13\5\301\25\17\6\270\16" + "\12\5\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\6\3\2136\36\11\377k2\14\377N'\13\377\11\7\4\241\0\0\0\0\0\0\0\0\0\0\0" + "\0\24\15\5\216\22\14\5\322\20\13\5\252\20\13\5\252\20\13\5\252\11\7\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10""9\11\7" + "\6\237\10\6\5\237\12\10\7\202\12\10\7w\11\7\6\205\11\7\6\247\12\10\7\252" + "\13\11\10q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\34\10\6\3}\16\12\5\252\22\15\5\260\16\12" + "\5\356\16\12\5\377\20\13\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13" + "\5\244\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\210\20\14\5\252\20\13\5" + "\252\22\14\5\252\20\13\5\322\16\12\5\377\16\12\5\371\20\14\5\301\20\13\5" + "\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3" + "}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\371\20\13\5\301" + "\20\13\5\252\11\7\4\226\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34" + "\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\353\22\15" + "\5\255\20\13\5\252\20\14\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\353\16\12\5\377\16" + "\12\5\377\20\13\5\377\24\15\5\317\14\11\5\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\7\5\4U\6" + "\5\3U\5\4\4U\5\4\4i\11\10\4\361H%\13\377n6\15\377C\"\12\377\10\6\3\220\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\16\6\252\20\14\5\252\11\10\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11\7\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0" + "\0\0\0\0\0\0\0\0\0\0\0\7\5\2%\10\6\3\216\10\6\3\343\31\17\6\377K$\12\377" + "c3\14\377B!\11\377\10\6\3\202\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\213\25\15\6" + "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3O\16\12\5\252\22" + "\15\5\252\14\11\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6" + "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252" + "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\24\15\5U\13\10\4\34\0\0\0\0\0\0\0" + "\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\14\5\252\24\16\5\255\20\14\5\301\24" + "\15\5\262\24\15\5\252\20\13\5\252\11\7\4\241\7\6\4""9\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\6\3UT(\15\377\244I\27\377\270O\33\377\17\13\10\366\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\12\252\260" + "S%\377\304W!\377\300X\37\377\26\17\13\301\0\0\0\0\0\0\0\0\0\0\0\0\25\17\12" + "\237\32\21\13\377\30\21\13\335\12\10\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3;\14\11\5\252" + "\20\13\5\322\16\12\5\377\16\12\5\377\16\12\5\377\16\12\5\366\20\14\5\301" + "\20\13\5\252\11\7\4\231\6\5\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\10\6\3\177\16\12\5\252\22\15\5\260\16\12" + "\5\356\16\12\5\377\16\12\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13" + "\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\16\13\7\216\35\23\10\252\21\13\6\237\10\6\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12\5\226\24\15\5\252\14" + "\11\5\216\5\4\2\16\0\0\0\0\0\0\0\0\17\13\10\216\32\22\11\262\23\15\6\252" + "\10\6\3D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\14\5\216\20\13\5\356" + "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\20\13" + "\5\327\22\15\5\273\13\11\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\6\5\4" + "\2R\5\4\2U\5\4\2U\5\4\2U\5\4\2c\11\7\4\361H%\13\377p5\15\377M'\14\377\12" + "\10\5\252\0\0\0\0\0\0\0\0\0\0\0\0\23\15\10\270\24\16\11\377\20\13\7\377\16" + "\13\7\377\21\14\10\377\26\17\11\377\33\21\12\377\36\23\13\377\34\22\13\377" + "\25\17\12\377\17\14\10\306\11\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\6\5[\17\13\6\252\16\13\5\356\23\15\6\306\14\11\5\34\0\0\0" + "\0\0\0\0\0\6\5\3U6\35\11\377d0\15\377m4\16\377\17\13\6\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\23\15\6\220\16\12\5\377\20\13\5\262\10\6\3w\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7Xc,\24\377" + "\32\20\13\350\5\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9<" + "\34\13\377\236C\27\377X,\27\377\13\11\6\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" + "\7n~3\31\377\31\21\14\350\5\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\34\23\16\12\3434\35\21\377" + "\36\24\15\377\11\10\6R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252" + "\254Q1\377\325}^\377\271X:\377\27\20\16\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\34\20\13\5\364D" + "\"\11\377>!\11\377\11\10\4\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\10\7""0G!\22\377l/\27\377k0\26\377q3\30\377m2\30\377h-\25\377h" + "-\25\377q1\30\377s2\30\377\22\15\11\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\7\6\"\22\15\11\364B\37\17\377T%\21\377S$\20\377K\"\16\377" + "I#\16\377[)\20\377n/\23\377O(\20\377\30\20\11\377\10\6\5""9\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\16\5\364(\27\7\377*\27\7\377" + "6\34\11\377<\37\11\377$\26\7\377\14\11\5\364\6\5\3\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6UH\"\15\377~8\25\377\224" + "?\31\377\31\21\16\276\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\17\14\14\205\262V9\377\310Y7\377\302R/\377\36\24\21" + "\273\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4c\21\14" + "\6\377*\26\11\3771\31\11\3776\32\13\3774\32\13\377;\34\14\377R%\17\377o1" + "\22\377T'\21\377\31\21\12\377\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9&\26\7\377U'\14\377" + "|4\25\377\24\15\11\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\10\6\5\34\32\20\13\252\13\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\14\10\5w\24\16\11\252\14\11\7\216\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\7\6\34\33\21\14\252\13\11\10U\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\6\34\10\7\5U\10\6\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\31\21\20\241)\33\32\377(\32\27\353\16\14\13R\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3%\11\7\4\216\11\7\4\210\6\5\3\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\27\17\12\231\23\15\12\377\20\13\11\377\20\13\11\377\20" + "\13\11\377\20\13\11\377\20\13\11\377\22\15\11\377\30\20\13\314\20\13\11\37" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\216\22\14" + "\11\317\22\15\11\377\20\13\11\377\17\13\10\377\17\13\10\374\22\15\11\303" + "\22\14\11\252\13\10\6\247\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\216\16\12\5\252\15\12\6\252\15\11\6\252" + "\13\10\6\252\7\6\4\202\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\7\216\25\16\12\252\23\15\12" + "\252\16\13\11\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\10\16\31\21\20\216\33\22\20\301\32\22\17\252\17\13" + "\12\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\34\13" + "\10\6\252\16\12\7\350\17\12\10\377\17\12\10\377\17\12\10\377\17\12\10\374" + "\22\14\11\303\22\14\11\252\13\10\6\247\11\7\6""9\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\11\7\4[\20\13\7\252\24\15\11\252\15\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0", +}; + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/tools/Makefile.devel kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/tools/Makefile.devel --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/tools/Makefile.devel 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/tools/Makefile.devel 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,5 @@ +minicompress:minicompress.c + gcc -o minicompress -Wall minicompress.c + +clean: + rm -f *~ *.o minicompress diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/tools/minicompress.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/tools/minicompress.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/tools/minicompress.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/tools/minicompress.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,65 @@ +#include +#include + +#define THE_FILE "gfont.c" +#define THE_FONT the_font +#define THE_FONTS "the_font" + +#include THE_FILE + +int main (int argc, char **argv) { + int i = 1; + int size = 0; + unsigned char pc = the_font.pixel_data[0]; + int nbz = 0; + unsigned char *rle; + rle = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); + + while (i < the_font.width *the_font.height*the_font.bytes_per_pixel) { + unsigned char c = the_font.pixel_data[i]; + if (pc==0) { + nbz ++; + if (c==0) { + if (nbz == 0xff) { + rle [size++] = 0; + rle [size++] = nbz; + nbz = 0; + } + } + else { + rle [size++] = 0; + rle [size++] = nbz; + nbz = 0; + } + } + else { + rle [size++] = pc; + } + pc = c; + i++; + } + + printf ("/* RGBA C-Source image dump (with zRLE compression) */\n" + "static const struct {\n" + " unsigned int width;\n" + " unsigned int height;\n" + " unsigned int bytes_per_pixel;\n" + " unsigned int rle_size;\n" + " unsigned char rle_pixel [%i];\n", size); + printf ("} " THE_FONTS " = {\n" + "%i, %i, %i, %i, {\n", + the_font.width,the_font.height,the_font.bytes_per_pixel,size); + + printf ("%i",rle[0]); + for (i=1;i= 0.9.5.1 +BuildPrereq: xmms-devel, gtk+-devel + +%description +A great visual plugins for XMMS. + +%prep +%setup -q -n %{name}_%{version} + +%build +%configure --libdir=%{_xmmsoutputdir} +make + +%install +rm -rf %{buildroot} +%makeinstall libdir=%{buildroot}/%{_xmmsoutputdir} +strip %{buildroot}/%{_xmmsoutputdir}/*.so + +%clean +rm -rf %{buildroot} + +%files +%defattr(-,root,root) +%doc AUTHORS COPYING ChangeLog NEWS README doc +%{_xmmsoutputdir}/libgoom.* + +%changelog +* Sun Jan 6 2002 Matthias Saou +- Initial RPM release. + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,11 @@ +# the xmms plugin + +if HAVE_XMMS +xmms_lib_LTLIBRARIES = libxmmsgoom2.la +xmms_libdir = $(XMMS_VISUALIZATION_PLUGIN_DIR) +libxmmsgoom2_la_LIBADD = $(top_builddir)/src/libgoom2.la $(XMMS_LIBS) +libxmmsgoom2_la_SOURCES = xmms_goom.c +INCLUDES=-DDATADIR=\"@XMMS_DATA_DIR@\" @XMMS_CFLAGS@ -Wall -I../src/ +endif + +libxmmsgoom2_la_LDFLAGS = -module -avoid-version diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,130 @@ +#include +#include "goom_config.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +static void plug_init (void); +static void plug_cleanup (void); +static void plug_render_pcm (gint16 data[2][512]); + +static int fd_in, fd_out; +static pid_t goom_pid = -1; + +static VisPlugin plug_vp = { + NULL, + NULL, + 0, + "What A GOOM!! " VERSION, + 2, + 0, + plug_init,/* init */ + plug_cleanup,/* cleanup */ + NULL,/* about */ + NULL,/* configure */ + NULL,/* disable_plugin */ + NULL,/* playback_start */ + NULL,/* playback_stop */ + plug_render_pcm, /* render_pcm */ + NULL /* render_freq */ +}; + +VisPlugin * +get_vplugin_info (void) +{ + return &plug_vp; +} + +static void +plug_init (void) +{ + int fd[2]; + pid_t pid; + + /* create a pipe */ + if (pipe(fd) < 0) { + fprintf (stderr, "System Error\n"); + /* TODO: en gtk? */ + return; + } + fd_in = fd[0]; + fd_out = fd[1]; + + /* load an executable */ + pid = fork(); + + /* todo look at the result */ + if (pid == 0) { + dup2(fd_in, 0); + + execlp ("goom2", "goom2", NULL, 0); + fprintf (stderr, "Unable to load goom...\n"); /* TODO: Message en gtk + check the PATH */ + exit (1); + } + if (pid == -1) { + /* erreur system : TODO -> dialog en gtk */ + } + if (goom_pid != -1) + kill (goom_pid, SIGQUIT); + goom_pid = pid; +} + +static void sendIntToGoom(int i) { + write (fd_out, &i, sizeof(int)); +} + +static void +plug_cleanup (void) +{ + sendIntToGoom(2); + kill (goom_pid, SIGQUIT); + goom_pid = -1; +} + +static void +plug_render_pcm (gint16 data[2][512]) +{ + fd_set rfds; + struct timeval tv; + int retval; + + tv.tv_sec = 0; + tv.tv_usec = 10000; + + FD_ZERO(&rfds); + FD_SET(fd_out, &rfds); + retval = select(fd_out+1, NULL, &rfds, NULL, &tv); + if (retval) { + /* send sound datas to goom */ + { + sendIntToGoom(0); + write (fd_out, &data[0][0], 512*sizeof(gint16)*2); + fsync(fd_out); + } + + /* send song title to goom */ + { + static int spos = -1; + int pos = xmms_remote_get_playlist_pos(plug_vp.xmms_session); + char title[2048]; + if (spos != pos) { + sendIntToGoom(1); + strcpy(title, xmms_remote_get_playlist_title(plug_vp.xmms_session, pos)); + write (fd_out, &title[0], 2048); + spos = pos; + } + } + } + else { + usleep(100); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom_config.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom_config.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom_config.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom_config.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,12 @@ +#ifndef GOOM_CONFIG +#define GOOM_CONFIG + +#ifdef MID +#define GOOM_TEXTURE_WIDTH 256 +#define GOOM_TEXTURE_HEIGHT 256 +#else // MID +#define GOOM_TEXTURE_WIDTH 512 +#define GOOM_TEXTURE_HEIGHT 512 +#endif // MID + +#endif // GOOM_CONFIG diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom.patch kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom.patch --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/goom.patch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/goom.patch 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,26454 @@ +diff -Naur /home/d4rk/goom2k4-0/src/config_param.c /src/config_param.c +--- /home/d4rk/goom2k4-0/src/config_param.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/config_param.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,110 +0,0 @@ +-/*---------------------------------------------------------------------------*/ +-/* +-** config_param.c +-** Goom Project +-** +-** Created by Jean-Christophe Hoelt on Sat Jul 19 2003 +-** Copyright (c) 2003 iOS. All rights reserved. +-*/ +-/*---------------------------------------------------------------------------*/ +- +-#include "goom_config_param.h" +-#include +- +-/* TODO: Ajouter goom_ devant ces fonctions */ +- +-static void empty_fct(PluginParam *dummy) { +-} +- +-PluginParam goom_secure_param() { +- PluginParam p; +- p.changed = empty_fct; +- p.change_listener = empty_fct; +- p.user_data = 0; +- p.name = p.desc = 0; +- p.rw = 1; +- return p; +-} +- +-PluginParam goom_secure_f_param(char *name) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_FLOATVAL; +- FVAL(p) = 0.5f; +- FMIN(p) = 0.0f; +- FMAX(p) = 1.0f; +- FSTEP(p) = 0.01f; +- return p; +-} +- +-PluginParam goom_secure_f_feedback(char *name) { +- PluginParam p = secure_f_param(name); +- p.rw = 0; +- return p; +-} +- +-PluginParam goom_secure_s_param(char *name) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_STRVAL; +- SVAL(p) = 0; +- return p; +-} +- +-PluginParam goom_secure_b_param(char *name, int value) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_BOOLVAL; +- BVAL(p) = value; +- return p; +-} +- +-PluginParam goom_secure_i_param(char *name) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_INTVAL; +- IVAL(p) = 50; +- IMIN(p) = 0; +- IMAX(p) = 100; +- ISTEP(p) = 1; +- return p; +-} +- +-PluginParam goom_secure_i_feedback(char *name) { +- PluginParam p = secure_i_param(name); +- p.rw = 0; +- return p; +-} +- +-PluginParameters goom_plugin_parameters(const char *name, int nb) { +- PluginParameters p; +- p.name = (char *)name; +- p.desc = ""; +- p.nbParams = nb; +- p.params = (PluginParam**)malloc(nb*sizeof(PluginParam*)); +- return p; +-} +- +-/*---------------------------------------------------------------------------*/ +- +-void goom_set_str_param_value(PluginParam *p, const char *str) { +- int len = strlen(str); +- if (SVAL(*p)) +- SVAL(*p) = (char*)realloc(SVAL(*p), len+1); +- else +- SVAL(*p) = (char*)malloc(len+1); +- memcpy(SVAL(*p), str, len+1); +-} +- +-void goom_set_list_param_value(PluginParam *p, const char *str) { +- int len = strlen(str); +-#ifdef VERBOSE +- printf("%s: %d\n", str, len); +-#endif +- if (LVAL(*p)) +- LVAL(*p) = (char*)realloc(LVAL(*p), len+1); +- else +- LVAL(*p) = (char*)malloc(len+1); +- memcpy(LVAL(*p), str, len+1); +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/convolve_fx.c /src/convolve_fx.c +--- /home/d4rk/goom2k4-0/src/convolve_fx.c 2005-02-07 06:46:42.000000000 -0700 ++++ /src/convolve_fx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,335 +0,0 @@ +-#include "goom_fx.h" +-#include "goom_plugin_info.h" +-#include "goomsl.h" +-#include "goom_config.h" +-#include +-#include +-#include +-#include +- +-//#define CONV_MOTIF_W 32 +-//#define CONV_MOTIF_WMASK 0x1f +- +-#define CONV_MOTIF_W 128 +-#define CONV_MOTIF_WMASK 0x7f +- +-typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; +- +-#include "motif_goom1.h" +-#include "motif_goom2.h" +- +-#define NB_THETA 512 +- +-#define MAX 2.0f +- +-typedef struct _CONV_DATA{ +- PluginParam light; +- PluginParam factor_adj_p; +- PluginParam factor_p; +- PluginParameters params; +- +- GoomSL *script; +- +- /* rotozoom */ +- int theta; +- float ftheta; +- int h_sin[NB_THETA]; +- int h_cos[NB_THETA]; +- int h_height; +- float visibility; +- Motif conv_motif; +- int inverse_motif; +- +-} ConvData; +- +-/* init rotozoom tables */ +-static void compute_tables(VisualFX *_this, PluginInfo *info) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- double screen_coef; +- int i; +- double h; +- double radian; +- +- if (data->h_height == info->screen.height) return; +- +- screen_coef = 2.0 * 300.0 / (double)info->screen.height; +- data->h_height = info->screen.height; +- +- for ( i=0 ; ih_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); +- data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); +- } +-} +- +-static void set_motif(ConvData *data, Motif motif) +-{ +- int i,j; +- for (i=0;iconv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +-} +- +-static void convolve_init(VisualFX *_this, PluginInfo *info) { +- ConvData *data; +- data = (ConvData*)malloc(sizeof(ConvData)); +- _this->fx_data = (void*)data; +- +- data->light = secure_f_param("Screen Brightness"); +- data->light.param.fval.max = 300.0f; +- data->light.param.fval.step = 1.0f; +- data->light.param.fval.value = 100.0f; +- +- data->factor_adj_p = secure_f_param("Flash Intensity"); +- data->factor_adj_p.param.fval.max = 200.0f; +- data->factor_adj_p.param.fval.step = 1.0f; +- data->factor_adj_p.param.fval.value = 70.0f; +- +- data->factor_p = secure_f_feedback("Factor"); +- +- data->params = plugin_parameters ("Bright Flash", 5); +- data->params.params[0] = &data->light; +- data->params.params[1] = &data->factor_adj_p; +- data->params.params[2] = 0; +- data->params.params[3] = &data->factor_p; +- data->params.params[4] = 0; +- +- /* init rotozoom tables */ +- compute_tables(_this, info); +- data->theta = 0; +- data->ftheta = 0.0; +- data->visibility = 1.0; +- set_motif(data, CONV_MOTIF2); +- data->inverse_motif = 0; +- +- _this->params = &data->params; +-} +- +-static void convolve_free(VisualFX *_this) { +- free (_this->fx_data); +-} +- +-static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, +- PluginInfo *info, int iff) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- +- int x,y; +- int i = 0;//info->screen.height * info->screen.width - 1; +- +- const int c = data->h_cos [data->theta]; +- const int s = data->h_sin [data->theta]; +- +- const int xi = -(info->screen.width/2) * c; +- const int yi = (info->screen.width/2) * s; +- +- const int xj = -(info->screen.height/2) * s; +- const int yj = -(info->screen.height/2) * c; +- +- int xprime = xj; +- int yprime = yj; +- +- int ifftab[16]; +- if (data->inverse_motif) { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- else { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- +- for (y=info->screen.height;y--;) { +- int xtex,ytex; +- +- xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; +- xprime += s; +- +- ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; +- yprime += c; +- +-#ifdef HAVE_MMX +- __asm__ __volatile__ +- ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ +- "\n\t movd %[xtex], %%mm2" +- "\n\t movd %[ytex], %%mm3" +- "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ +- "\n\t movd %[c], %%mm4" +- "\n\t movd %[s], %%mm6" +- "\n\t pxor %%mm5, %%mm5" +- "\n\t psubd %%mm6, %%mm5" +- "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ +- "\n\t movd %[motif], %%mm6" /* mm6 = motif */ +- +- ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) +- , [c]"g"(c), [s]"g"(s) +- , [motif] "g"(&data->conv_motif[0][0])); +- +- for (x=info->screen.width;x--;) +- { +- __asm__ __volatile__ +- ( +- "\n\t movd %[src], %%mm0" /* mm0 = src */ +- "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ +- "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ +- "\n\t movq %%mm2, %%mm3" +- "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ +- "\n\t movd %%mm3, %%eax" /* eax = xtex' */ +- +- "\n\t psrlq $25, %%mm3" +- "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ +- +- "\n\t andl $127, %%eax" +- "\n\t andl $16256, %%ecx" +- +- "\n\t addl %%ecx, %%eax" +- "\n\t movd %%mm6, %%esi" /* esi = motif */ +- "\n\t xorl %%ecx, %%ecx" +- "\n\t movb (%%eax,%%esi), %%cl" +- +- "\n\t movl %[ifftab], %%eax" +- "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ +- "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ +- +- "\n\t punpcklwd %%mm1, %%mm1" +- "\n\t punpcklbw %%mm7, %%mm0" +- "\n\t punpckldq %%mm1, %%mm1" +- "\n\t psrlw $1, %%mm0" +- "\n\t psrlw $2, %%mm1" +- "\n\t pmullw %%mm1, %%mm0" +- "\n\t psrlw $5, %%mm0" +- "\n\t packuswb %%mm7, %%mm0" +- "\n\t movd %%mm0, %[dest]" +- : [dest] "=g" (dest[i].val) +- : [src] "g" (src[i].val) +- , [ifftab]"g"(&ifftab[0]) +- : "eax","ecx"); +- +- i++; +- } +-#else +- for (x=info->screen.width;x--;) { +- +- int iff2; +- unsigned int f0,f1,f2,f3; +- +- xtex += c; +- ytex -= s; +- +- iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; +- +-#define sat(a) ((a)>0xFF?0xFF:(a)) +- f0 = src[i].val; +- f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; +- f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; +- f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; +- dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +-/* +- f0 = (src[i].cop[0] * iff2) >> 8; +- f1 = (src[i].cop[1] * iff2) >> 8; +- f2 = (src[i].cop[2] * iff2) >> 8; +- f3 = (src[i].cop[3] * iff2) >> 8; +- +- dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; +- dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; +- dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; +- dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +-*/ +- i++; +- } +-#endif +- } +-#ifdef HAVE_MMX +- __asm__ __volatile__ ("\n\t emms"); +-#endif +- +- compute_tables(_this, info); +-} +- +- +-/*#include +- +-static uint64_t GetTick() +-{ +- uint64_t x; +- asm volatile ("RDTSC" : "=A" (x)); +- return x; +-}*/ +- +- +-static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { +- +- ConvData *data = (ConvData*)_this->fx_data; +- float ff; +- int iff; +- +- ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; +- iff = (unsigned int)(ff * 256); +- +- { +- double fcycle = (double)info->cycle; +- double rotate_param, rotate_coef; +- float INCREASE_RATE = 1.5; +- float DECAY_RATE = 0.955; +- if (FVAL(info->sound.last_goom_p) > 0.8) +- FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; +- FVAL(data->factor_p) *= DECAY_RATE; +- +- rotate_param = FVAL(info->sound.last_goom_p); +- if (rotate_param < 0.0) +- rotate_param = 0.0; +- rotate_param += FVAL(info->sound.goom_power_p); +- +- rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; +- data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); +- data->theta = ((unsigned int)data->ftheta) % NB_THETA; +- data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; +- if (data->visibility < 0.0) data->visibility = 0.0; +- data->factor_p.change_listener(&data->factor_p); +- } +- +- if (data->visibility < 0.01) { +- switch (goom_irand(info->gRandom, 300)) +- { +- case 1: +- set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; +- case 2: +- set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; +- } +- } +- +- if ((ff > 0.98f) && (ff < 1.02f)) +- memcpy(dest, src, info->screen.size * sizeof(Pixel)); +- else +- create_output_with_brightness(_this,src,dest,info,iff); +-/* +-// Benching suite... +- { +- uint64_t before, after; +- double timed; +- static double stimed = 10000.0; +- before = GetTick(); +- data->visibility = 1.0; +- create_output_with_brightness(_this,src,dest,info,iff); +- after = GetTick(); +- timed = (double)((after-before) / info->screen.size); +- if (timed < stimed) { +- stimed = timed; +- printf ("CLK = %3.0f CPP\n", stimed); +- } +- } +-*/ +-} +- +-VisualFX convolve_create(void) { +- VisualFX vfx = { +- init: convolve_init, +- free: convolve_free, +- apply: convolve_apply, +- fx_data: 0 +- }; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/convolve_fx.c.jc /src/convolve_fx.c.jc +--- /home/d4rk/goom2k4-0/src/convolve_fx.c.jc 2005-02-07 06:46:42.000000000 -0700 ++++ /src/convolve_fx.c.jc 1969-12-31 17:00:00.000000000 -0700 +@@ -1,333 +0,0 @@ +-#include "goom_fx.h" +-#include "goom_plugin_info.h" +-#include "goomsl.h" +-#include "goom_config.h" +-#include +-#include +-#include +-#include +- +-//#define CONV_MOTIF_W 32 +-//#define CONV_MOTIF_WMASK 0x1f +- +-#define CONV_MOTIF_W 128 +-#define CONV_MOTIF_WMASK 0x7f +- +-typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; +- +-#include "motif_goom1.h" +-#include "motif_goom2.h" +- +-#define NB_THETA 512 +- +-#define MAX 2.0f +- +-typedef struct _CONV_DATA{ +- PluginParam light; +- PluginParam factor_adj_p; +- PluginParam factor_p; +- PluginParameters params; +- +- GoomSL *script; +- +- /* rotozoom */ +- int theta; +- float ftheta; +- int h_sin[NB_THETA]; +- int h_cos[NB_THETA]; +- int h_height; +- float visibility; +- Motif conv_motif; +- int inverse_motif; +- +-} ConvData; +- +-/* init rotozoom tables */ +-static void compute_tables(VisualFX *_this, PluginInfo *info) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- double screen_coef; +- int i; +- double h; +- double radian; +- +- if (data->h_height == info->screen.height) return; +- +- screen_coef = 2.0 * 300.0 / (double)info->screen.height; +- data->h_height = info->screen.height; +- +- for ( i=0 ; ih_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); +- data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); +- } +-} +- +-static void set_motif(ConvData *data, Motif motif) +-{ +- int i,j; +- for (i=0;iconv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +-} +- +-static void convolve_init(VisualFX *_this, PluginInfo *info) { +- ConvData *data; +- data = (ConvData*)malloc(sizeof(ConvData)); +- _this->fx_data = (void*)data; +- +- data->light = secure_f_param("Screen Brightness"); +- data->light.param.fval.max = 300.0f; +- data->light.param.fval.step = 1.0f; +- data->light.param.fval.value = 100.0f; +- +- data->factor_adj_p = secure_f_param("Flash Intensity"); +- data->factor_adj_p.param.fval.max = 200.0f; +- data->factor_adj_p.param.fval.step = 1.0f; +- data->factor_adj_p.param.fval.value = 70.0f; +- +- data->factor_p = secure_f_feedback("Factor"); +- +- data->params = plugin_parameters ("Bright Flash", 5); +- data->params.params[0] = &data->light; +- data->params.params[1] = &data->factor_adj_p; +- data->params.params[2] = 0; +- data->params.params[3] = &data->factor_p; +- data->params.params[4] = 0; +- +- /* init rotozoom tables */ +- compute_tables(_this, info); +- data->theta = 0; +- data->ftheta = 0.0; +- data->visibility = 1.0; +- set_motif(data, CONV_MOTIF2); +- data->inverse_motif = 0; +- +- _this->params = &data->params; +-} +- +-static void convolve_free(VisualFX *_this) { +- free (_this->fx_data); +-} +- +-static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, +- PluginInfo *info, int iff) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- +- int x,y; +- int i = 0;//info->screen.height * info->screen.width - 1; +- +- const int c = data->h_cos [data->theta]; +- const int s = data->h_sin [data->theta]; +- +- const int xi = -(info->screen.width/2) * c; +- const int yi = (info->screen.width/2) * s; +- +- const int xj = -(info->screen.height/2) * s; +- const int yj = -(info->screen.height/2) * c; +- +- int xprime = xj; +- int yprime = yj; +- +- int ifftab[16]; +- if (data->inverse_motif) { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- else { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- +- for (y=info->screen.height;y--;) { +- int xtex,ytex; +- +- xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; +- xprime += s; +- +- ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; +- yprime += c; +- +-#ifdef HAVE_MMX +- __asm__ __volatile__ +- ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ +- "\n\t movd %[xtex], %%mm2" +- "\n\t movd %[ytex], %%mm3" +- "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ +- "\n\t movd %[c], %%mm4" +- "\n\t movd %[s], %%mm6" +- "\n\t pxor %%mm5, %%mm5" +- "\n\t psubd %%mm6, %%mm5" +- "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ +- "\n\t movd %[motif], %%mm6" /* mm6 = motif */ +- +- ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) +- , [c]"g"(c), [s]"g"(s) +- , [motif] "g"(&data->conv_motif[0][0])); +- +- for (x=info->screen.width;x--;) +- { +- __asm__ __volatile__ +- ( +- "\n\t movd %[src], %%mm0" /* mm0 = src */ +- "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ +- "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ +- "\n\t movq %%mm2, %%mm3" +- "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ +- "\n\t movd %%mm3, %%eax" /* eax = xtex' */ +- +- "\n\t psrlq $25, %%mm3" +- "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ +- +- "\n\t andl $127, %%eax" +- "\n\t andl $16256, %%ecx" +- +- "\n\t addl %%ecx, %%eax" +- "\n\t movd %%mm6, %%esi" /* esi = motif */ +- "\n\t xorl %%ecx, %%ecx" +- "\n\t movb (%%eax,%%esi), %%cl" +- +- "\n\t movl %[ifftab], %%eax" +- "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ +- "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ +- +- "\n\t punpcklwd %%mm1, %%mm1" +- "\n\t punpcklbw %%mm7, %%mm0" +- "\n\t punpckldq %%mm1, %%mm1" +- "\n\t psrlw $1, %%mm0" +- "\n\t psrlw $1, %%mm1" +- "\n\t pmullw %%mm1, %%mm0" +- "\n\t psrlw $6, %%mm0" +- "\n\t packuswb %%mm7, %%mm0" +- "\n\t movd %%mm0, %[dest]" +- : [dest] "=g" (dest[i].val) +- : [src] "g" (src[i].val) +- , [ifftab]"g"(&ifftab[0]) +- : "eax","ecx"); +- +- i++; +- } +-#else +- for (x=info->screen.width;x--;) { +- +- int iff2; +- unsigned int f0,f1,f2,f3; +- +- xtex += c; +- ytex -= s; +- +- iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; +- +-#define sat(a) ((a)>0xFF?0xFF:(a)) +- f0 = src[i].val; +- f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; +- f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; +- f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; +- dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +-/* +- f0 = (src[i].cop[0] * iff2) >> 8; +- f1 = (src[i].cop[1] * iff2) >> 8; +- f2 = (src[i].cop[2] * iff2) >> 8; +- f3 = (src[i].cop[3] * iff2) >> 8; +- +- dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; +- dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; +- dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; +- dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +-*/ +- i++; +- } +-#endif +- } +- __asm__ __volatile__ ("\n\t emms"); +- +- compute_tables(_this, info); +-} +- +-/* +-#include +- +-static uint64_t GetTick() +-{ +- uint64_t x; +- asm volatile ("RDTSC" : "=A" (x)); +- return x; +-} +-*/ +- +-static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { +- +- ConvData *data = (ConvData*)_this->fx_data; +- float ff; +- int iff; +- +- ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; +- iff = (unsigned int)(ff * 256); +- +- { +- double fcycle = (double)info->cycle; +- double rotate_param, rotate_coef; +- float INCREASE_RATE = 1.5; +- float DECAY_RATE = 0.955; +- if (FVAL(info->sound.last_goom_p) > 0.8) +- FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; +- FVAL(data->factor_p) *= DECAY_RATE; +- +- rotate_param = FVAL(info->sound.last_goom_p); +- if (rotate_param < 0.0) +- rotate_param = 0.0; +- rotate_param += FVAL(info->sound.goom_power_p); +- +- rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; +- data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); +- data->theta = ((unsigned int)data->ftheta) % NB_THETA; +- data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; +- if (data->visibility < 0.0) data->visibility = 0.0; +- data->factor_p.change_listener(&data->factor_p); +- } +- +- if (data->visibility < 0.01) { +- switch (goom_irand(info->gRandom, 300)) +- { +- case 1: +- set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; +- case 2: +- set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; +- } +- } +- +- if ((ff > 0.96f) && (ff < 1.04f)) +- memcpy(dest, src, info->screen.size * sizeof(Pixel)); +- else +- create_output_with_brightness(_this,src,dest,info,iff); +-/* +- Benching suite... +- { +- uint64_t before, after; +- double timed; +- static double stimed = 10000.0; +- before = GetTick(); +- data->visibility = 1.0; +- create_output_with_brightness(_this,src,dest,info,iff); +- after = GetTick(); +- timed = (double)((after-before) / info->screen.size); +- if (timed < stimed) { +- stimed = timed; +- printf ("CLK = %3.0f CPP\n", stimed); +- } +- } +-*/ +-} +- +-VisualFX convolve_create(void) { +- VisualFX vfx = { +- init: convolve_init, +- free: convolve_free, +- apply: convolve_apply, +- fx_data: 0 +- }; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/cpu_info.c /src/cpu_info.c +--- /home/d4rk/goom2k4-0/src/cpu_info.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/cpu_info.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,71 +0,0 @@ +-/* +- * cpu_info.c +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-#include "cpu_info.h" +- +-#ifdef CPU_X86 +-#include "mmx.h" +-#endif +- +-#ifdef CPU_POWERPC +-#include +-#include +-#endif +- +-static unsigned int CPU_FLAVOUR = 0; +-static unsigned int CPU_NUMBER = 1; +-static unsigned int CPU_DETECTED = 0; +- +-static void autoset_cpu_info (void) +-{ +- CPU_DETECTED = 1; +- +-#ifdef CPU_POWERPC +- int result; +- size_t size; +- +- result = 0; +- size = 4; +- if (sysctlbyname("hw.optional.altivec",&result,&size,NULL,NULL) == 0) +- { +- if (result != 0) CPU_FLAVOUR |= CPU_OPTION_ALTIVEC; +- } +- +- result = 0; +- size = 4; +- if (sysctlbyname("hw.optional.64bitops",&result,&size,NULL,NULL) == 0) +- { +- if (result != 0) CPU_FLAVOUR |= CPU_OPTION_64_BITS; +- } +- +- result = 0; +- size = 4; +- if (sysctlbyname("hw.ncpu",&result,&size,NULL,NULL) == 0) +- { +- if (result != 0) CPU_NUMBER = result; +- } +-#endif /* CPU_POWERPC */ +- +-#ifdef CPU_X86 +- if (mmx_supported()) CPU_FLAVOUR |= CPU_OPTION_MMX; +- if (xmmx_supported()) CPU_FLAVOUR |= CPU_OPTION_XMMX; +-#endif /* CPU_X86 */ +-} +- +-unsigned int cpu_flavour (void) +-{ +- if (CPU_DETECTED == 0) autoset_cpu_info(); +- return CPU_FLAVOUR; +-} +- +-unsigned int cpu_number (void) +-{ +- if (CPU_DETECTED == 0) autoset_cpu_info(); +- return CPU_NUMBER; +-} +diff -Naur /home/d4rk/goom2k4-0/src/cpu_info.h /src/cpu_info.h +--- /home/d4rk/goom2k4-0/src/cpu_info.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/cpu_info.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-#ifndef CPU_INFO_H +-#define CPU_INFO_H +- +-/* +- * cpu_info.h +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-#ifdef HAVE_MMX +-#ifndef CPU_X86 +-#define CPU_X86 +-#endif +-#endif +- +-/* Returns the CPU flavour described with the constants below */ +-unsigned int cpu_flavour (void); +- +-#define CPU_OPTION_ALTIVEC 0x1 +-#define CPU_OPTION_64_BITS 0x2 +-#define CPU_OPTION_MMX 0x4 +-#define CPU_OPTION_XMMX 0x8 +-#define CPU_OPTION_SSE 0x10 +-#define CPU_OPTION_SSE2 0x20 +-#define CPU_OPTION_3DNOW 0x40 +- +- +-/* Returns the CPU number */ +-unsigned int cpu_number (void); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/default_script.goom /src/default_script.goom +--- /home/d4rk/goom2k4-0/src/default_script.goom 2005-02-07 06:46:41.000000000 -0700 ++++ /src/default_script.goom 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-/* +- * specify here high-level properties of a flash. +- */ +- +-flash_occurs when (Sound.Goom_Detection > 50%) and (Sound.Sound_Speed > 14%); +- +-max_flash = 200%; +-slow_down_coef = 96%; +- +-/* +- * Here you have the fx's state machin behaviour. +- */ +- +-(locked) ? locked--; +- +-(not locked) and (flash_occurs) ? +-{ +- cur_power = Sound_Speed.Goom_Detection; +- start flashing_up; +-} +- +-(not locked) and (flashing_up) ? +-{ +- factor += cur_power * 2 * (speedvar / 4 + 0.95); +- if (factor > max_flash) factor = max_flash; +- +- (not flash_occurs) ? +- { +- locked = 200; +- stop flashing_up; +- } +-} +- +-factor *= slow_down_coef; +diff -Naur /home/d4rk/goom2k4-0/src/default_scripts.h /src/default_scripts.h +--- /home/d4rk/goom2k4-0/src/default_scripts.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/default_scripts.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,6 +0,0 @@ +-#ifndef _DEFAULT_SCRIPTS_H +-#define _DEFAULT_SCRIPTS_H +- +-#define GOOM_MAIN_SCRIPT "" +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/DOCODE.TXT /src/DOCODE.TXT +--- /home/d4rk/goom2k4-0/src/DOCODE.TXT 2005-02-07 06:46:41.000000000 -0700 ++++ /src/DOCODE.TXT 1969-12-31 17:00:00.000000000 -0700 +@@ -1,55 +0,0 @@ +-Les diffrentes donnes.. +------ +- +-typedef struct { +- int32 * buf; +- int32 width; +- int32 height; +- int32 size; +- +- int32 * realstart; +-} Surface; +------ +- +->> taille du buffer de zoom +-guint32 mmx_zoom_size; +------ +- +->> les buffers bruts contiennent les px et py de chaque point +->> => brutS[0] = px0, brutS[1] = py0, brutS[2] = px1, [...] +- +-signed int *brutS = 0, *freebrutS = 0; // source +-signed int *brutD = 0, *freebrutD = 0; // dest +-signed int *brutT = 0, *freebrutT = 0; // temp (en cours de gnration) +- +->> pointeur vers p1 +-guint32 *expix1 = 0; +->> pointeur vers p2 +-guint32 *expix2 = 0; +- +->> largeur d'une ligne = prevX +-guint32 zoom_width; +- +->> largeur et hauteur des differents buffers. +-int prevX=0,prevY=0; +------ +- +->> buffratio est un fixpoint : 16,16 +->> valeur normalement comprise entre 0 et 1, +->> soit 0<=buffratio<=BUFFPOINTMASK +- +-int buffratio = 0; +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +------ +- +-#define sqrtperte 16 +->> faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +->> faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +------ +- +-int precalCoef[16][16]; +diff -Naur /home/d4rk/goom2k4-0/src/drawmethods.c /src/drawmethods.c +--- /home/d4rk/goom2k4-0/src/drawmethods.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/drawmethods.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,203 +0,0 @@ +-#include "drawmethods.h" +- +-#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \ +-{\ +- int tra=0,i=0;\ +- unsigned char *bra = (unsigned char*)&(_backbuf);\ +- unsigned char *dra = (unsigned char*)&(_out);\ +- unsigned char *cra = (unsigned char*)&(_col);\ +- for (;i<4;i++) {\ +- tra = *cra;\ +- tra += *bra;\ +- if (tra>255) tra=255;\ +- *dra = tra;\ +- ++dra;++cra;++bra;\ +- }\ +-} +- +-#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col) +- +-void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +-{ +- int x, y, dx, dy, yy, xx; +- Pixel *p; +- +- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return; +- +- /* clip to top edge +- if ((y1 < 0) && (y2 < 0)) +- return; +- +- if (y1 < 0) { +- x1 += (y1 * (x1 - x2)) / (y2 - y1); +- y1 = 0; +- } +- if (y2 < 0) { +- x2 += (y2 * (x1 - x2)) / (y2 - y1); +- y2 = 0; +- } +- +- clip to bottom edge +- if ((y1 >= screeny) && (y2 >= screeny)) +- return; +- if (y1 >= screeny) { +- x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1); +- y1 = screeny - 1; +- } +- if (y2 >= screeny) { +- x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1); +- y2 = screeny - 1; +- } +- clip to left edge +- if ((x1 < 0) && (x2 < 0)) +- return; +- if (x1 < 0) { +- y1 += (x1 * (y1 - y2)) / (x2 - x1); +- x1 = 0; +- } +- if (x2 < 0) { +- y2 += (x2 * (y1 - y2)) / (x2 - x1); +- x2 = 0; +- } +- clip to right edge +- if ((x1 >= screenx) && (x2 >= screenx)) +- return; +- if (x1 >= screenx) { +- y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1); +- x1 = screenx - 1; +- } +- if (x2 >= screenx) { +- y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1); +- x2 = screenx - 1; +- } +- */ +- +- dx = x2 - x1; +- dy = y2 - y1; +- if (x1 > x2) { +- int tmp; +- +- tmp = x1; +- x1 = x2; +- x2 = tmp; +- tmp = y1; +- y1 = y2; +- y2 = tmp; +- dx = x2 - x1; +- dy = y2 - y1; +- } +- +- /* vertical line */ +- if (dx == 0) { +- if (y1 < y2) { +- p = &(data[(screenx * y1) + x1]); +- for (y = y1; y <= y2; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- else { +- p = &(data[(screenx * y2) + x1]); +- for (y = y2; y <= y1; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- return; +- } +- /* horizontal line */ +- if (dy == 0) { +- if (x1 < x2) { +- p = &(data[(screenx * y1) + x1]); +- for (x = x1; x <= x2; x++) { +- DRAWMETHOD; +- p++; +- } +- return; +- } +- else { +- p = &(data[(screenx * y1) + x2]); +- for (x = x2; x <= x1; x++) { +- DRAWMETHOD; +- p++; +- } +- return; +- } +- } +- /* 1 */ +- /* \ */ +- /* \ */ +- /* 2 */ +- if (y2 > y1) { +- /* steep */ +- if (dy > dx) { +- dx = ((dx << 16) / dy); +- x = x1 << 16; +- for (y = y1; y <= y2; y++) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p++; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- return; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- } +- } +- /* 2 */ +- /* / */ +- /* / */ +- /* 1 */ +- else { +- /* steep */ +- if (-dy > dx) { +- dx = ((dx << 16) / -dy); +- x = (x1 + 1) << 16; +- for (y = y1; y >= y2; y--) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p--; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- return; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- return; +- } +- } +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/drawmethods.h /src/drawmethods.h +--- /home/d4rk/goom2k4-0/src/drawmethods.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/drawmethods.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,9 +0,0 @@ +-#ifndef _DRAWMETHODS_H +-#define _DRAWMETHODS_H +- +-#include "goom_config.h" +-#include "goom_graphic.h" +- +-void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +- +-#endif /* _DRAWMETHODS_H */ +diff -Naur /home/d4rk/goom2k4-0/src/filters.c /src/filters.c +--- /home/d4rk/goom2k4-0/src/filters.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filters.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,767 +0,0 @@ +-// --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY --- +- +-/* filter.c version 0.7 +-* contient les filtres applicable a un buffer +-* creation : 01/10/2000 +-* -ajout de sinFilter() +-* -ajout de zoomFilter() +-* -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs +-* -optimisation de sinFilter (utilisant une table de sin) +-* -asm +-* -optimisation de la procedure de generation du buffer de transformation +-* la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] +-*/ +- +-/* #define _DEBUG_PIXEL */ +- +-#include +-#include +-#include +-#include +-#include +- +-#include "goom_filters.h" +-#include "goom_graphic.h" +-#include "goom_tools.h" +-#include "goom_plugin_info.h" +-#include "goom_fx.h" +-#include "v3d.h" +- +-/* TODO : MOVE THIS AWAY !!! */ +-/* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */ +-static inline void setPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color c) +-{ +- Pixel i; +- +- i.channels.b = c.b; +- i.channels.g = c.v; +- i.channels.r = c.r; +- *(buffer + (x + y * goomInfo->screen.width)) = i; +-} +- +-static inline void setPixelRGB_ (Pixel *buffer, Uint x, Color c) +-{ +- buffer[x].channels.r = c.r; +- buffer[x].channels.g = c.v; +- buffer[x].channels.b = c.b; +-} +- +-static inline void getPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color * c) +-{ +- Pixel i = *(buffer + (x + y * goomInfo->screen.width)); +- c->b = i.channels.b; +- c->v = i.channels.g; +- c->r = i.channels.r; +-} +- +-static inline void getPixelRGB_ (Pixel *buffer, Uint x, Color * c) +-{ +- Pixel i = *(buffer + x); +- c->b = i.channels.b; +- c->v = i.channels.g; +- c->r = i.channels.r; +-} +-/* END TODO */ +- +- +-/* DEPRECATED */ +-// retourne x>>s , en testant le signe de x +-//#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s))) +-//#define EFFECT_DISTORS 4 +-//#define EFFECT_DISTORS_SL 2 +-//#define INTERLACE_ADD 9 +-//#define INTERLACE_AND 0xf +-/* END DEPRECATED */ +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTNBF 16.0f +-#define BUFFPOINTMASK 0xffff +- +-#define sqrtperte 16 +-/* faire : a % sqrtperte <=> a & pertemask */ +-#define PERTEMASK 0xf +-/* faire : a / sqrtperte <=> a >> PERTEDEC */ +-#define PERTEDEC 4 +- +-/* pure c version of the zoom filter */ +-static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); +- +-/* simple wrapper to give it the same proto than the others */ +-void zoom_filter_c (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) { +- c_zoom(src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef); +-} +- +-static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); +- +- +-typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA { +- +- PluginParam enabled_bp; +- PluginParameters params; +- +- unsigned int *coeffs, *freecoeffs; +- +- signed int *brutS, *freebrutS; /* source */ +- signed int *brutD, *freebrutD; /* dest */ +- signed int *brutT, *freebrutT; /* temp (en cours de generation) */ +- +- guint32 zoom_width; +- +- unsigned int prevX, prevY; +- +- float general_speed; +- int reverse; /* reverse the speed */ +- char theMode; +- int waveEffect; +- int hypercosEffect; +- int vPlaneEffect; +- int hPlaneEffect; +- char noisify; +- int middleX, middleY; +- +- int mustInitBuffers; +- int interlace_start; +- +- /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ +- int buffratio; +- int *firedec; +- +- /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ +- int precalCoef[BUFFPOINTNB][BUFFPOINTNB]; +- +- /** calculatePXandPY statics */ +- int wave; +- int wavesp; +- +-} ZoomFilterFXWrapperData; +- +- +- +- +-static inline v2g zoomVector(ZoomFilterFXWrapperData *data, float X, float Y) +-{ +- v2g vecteur; +- float vx, vy; +- float sq_dist = X*X + Y*Y; +- +- /* sx = (X < 0.0f) ? -1.0f : 1.0f; +- sy = (Y < 0.0f) ? -1.0f : 1.0f; +- */ +- float coefVitesse = (1.0f+ data->general_speed) / 50.0f; +- +- // Effects +- +- /* Centralized FX */ +- +- switch (data->theMode) { +- case CRYSTAL_BALL_MODE: +- coefVitesse -= (sq_dist-0.3f)/15.0f; +- break; +- case AMULETTE_MODE: +- coefVitesse += sq_dist * 3.5f; +- break; +- case WAVE_MODE: +- coefVitesse += sin(sq_dist*20.0f) / 100.0f; +- break; +- case SCRUNCH_MODE: +- coefVitesse += sq_dist / 10.0f; +- break; +- //case HYPERCOS1_MODE: +- break; +- //case HYPERCOS2_MODE: +- break; +- //case YONLY_MODE: +- break; +- case SPEEDWAY_MODE: +- coefVitesse *= 4.0f * Y; +- break; +- default: +- break; +- } +- +- if (coefVitesse < -2.01f) +- coefVitesse = -2.01f; +- if (coefVitesse > 2.01f) +- coefVitesse = 2.01f; +- +- vx = coefVitesse * X; +- vy = coefVitesse * Y; +- +- /* Amulette 2 */ +- // vx = X * tan(dist); +- // vy = Y * tan(dist); +- +- /* Rotate */ +- //vx = (X+Y)*0.1; +- //vy = (Y-X)*0.1; +- +- +- // Effects adds-on +- +- /* Noise */ +- if (data->noisify) +- { +- vx += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; +- vy += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; +- } +- +- /* Hypercos */ +- if (data->hypercosEffect) +- { +- vx += sin(Y*10.0f)/120.0f; +- vy += sin(X*10.0f)/120.0f; +- } +- +- /* H Plane */ +- if (data->hPlaneEffect) vx += Y * 0.0025f * data->hPlaneEffect; +- +- /* V Plane */ +- if (data->vPlaneEffect) vy += X * 0.0025f * data->vPlaneEffect; +- +- /* TODO : Water Mode */ +- // if (data->waveEffect) +- +- vecteur.x = vx; +- vecteur.y = vy; +- +- return vecteur; +-} +- +- +-/* +- * Makes a stripe of a transform buffer (brutT) +- * +- * The transform is (in order) : +- * Translation (-data->middleX, -data->middleY) +- * Homothetie (Center : 0,0 Coeff : 2/data->prevX) +- */ +-static void makeZoomBufferStripe(ZoomFilterFXWrapperData * data, int INTERLACE_INCR) +-{ +- // Position of the pixel to compute in pixmap coordinates +- Uint x, y; +- // Where (verticaly) to stop generating the buffer stripe +- int maxEnd = (data->interlace_start + INTERLACE_INCR); +- // Ratio from pixmap to normalized coordinates +- float ratio = 2.0f/((float)data->prevX); +- // Ratio from normalized to virtual pixmap coordinates +- float inv_ratio = BUFFPOINTNBF/ratio; +- float min = ratio/BUFFPOINTNBF; +- // Y position of the pixel to compute in normalized coordinates +- float Y = ((float)(data->interlace_start - data->middleY)) * ratio; +- +- maxEnd = data->prevY; +- if (maxEnd > (data->interlace_start + INTERLACE_INCR)) +- maxEnd = (data->interlace_start + INTERLACE_INCR); +- +- for (y = data->interlace_start; (y < data->prevY) && ((signed int)yprevX * 2; +- float X = - ((float)data->middleX) * ratio; +- for (x = 0; x < data->prevX; x++) +- { +- v2g vector = zoomVector (data, X, Y); +- +- /* Finish and avoid null displacement */ +- if (fabs(vector.x) < min) vector.x = (vector.x < 0.0f) ? -min : min; +- if (fabs(vector.y) < min) vector.y = (vector.y < 0.0f) ? -min : min; +- +- data->brutT[premul_y_prevX] = ((int)((X-vector.x)*inv_ratio)+((int)(data->middleX*BUFFPOINTNB))); +- data->brutT[premul_y_prevX+1] = ((int)((Y-vector.y)*inv_ratio)+((int)(data->middleY*BUFFPOINTNB))); +- premul_y_prevX += 2; +- X += ratio; +- } +- Y += ratio; +- } +- data->interlace_start += INTERLACE_INCR; +- if (y >= data->prevY-1) data->interlace_start = -1; +-} +- +- +-/* +- * calculer px et py en fonction de x,y,middleX,middleY et theMode +- * px et py indique la nouvelle position (en sqrtperte ieme de pixel) +- * (valeur * 16) +- +- inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py) +- { +- if (data->theMode == WATER_MODE) { +- int yy; +- +- yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10; +- if (yy < 0) +- yy = 0; +- if (yy >= (signed int)goomInfo->screen.height) +- yy = goomInfo->screen.height - 1; +- +- *px = (x << 4) + data->firedec[yy] + (data->wave / 10); +- *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130); +- +- data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); +- if (data->wave < -10) +- data->wavesp += 2; +- if (data->wave > 10) +- data->wavesp -= 2; +- data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); +- if (data->wavesp > 100) +- data->wavesp = (data->wavesp * 9) / 10; +- } +- else { +- int dist = 0, vx9, vy9; +- int vx, vy; +- int ppx, ppy; +- int fvitesse = data->vitesse << 4; +- +- if (data->noisify) { +- x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); +- y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); +- } +- vx = (x - data->middleX) << 9; +- vy = (y - data->middleY) << 9; +- +- if (data->hPlaneEffect) +- vx += data->hPlaneEffect * (y - data->middleY); +- +- if (data->vPlaneEffect) +- vy += data->vPlaneEffect * (x - data->middleX); +- +- if (data->waveEffect) { +- fvitesse *= +- 1024 + +- ShiftRight (goomInfo->sintable +- [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6); +- fvitesse /= 1024; +- } +- +- if (data->hypercosEffect) { +- vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); +- vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); +- } +- +- vx9 = ShiftRight (vx, 9); +- vy9 = ShiftRight (vy, 9); +- dist = vx9 * vx9 + vy9 * vy9; +- +- switch (data->theMode) { +- case WAVE_MODE: +- fvitesse *= +- 1024 + +- ShiftRight (goomInfo->sintable +- [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6); +- fvitesse>>=10; +- break; +- case CRYSTAL_BALL_MODE: +- fvitesse += (dist >> (10-EFFECT_DISTORS_SL)); +- break; +- case AMULETTE_MODE: +- fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL)); +- break; +- case SCRUNCH_MODE: +- fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL)); +- break; +- case HYPERCOS1_MODE: +- vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); +- vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); +- break; +- case HYPERCOS2_MODE: +- vx = +- vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0); +- vy = +- vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0); +- fvitesse = 128 << 4; +- break; +- case YONLY_MODE: +- fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6); +- fvitesse >>= 10; +- break; +- case SPEEDWAY_MODE: +- fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL)); +- break; +- } +- +- if (fvitesse < -3024) +- fvitesse = -3024; +- +- if (vx < 0) // pb avec decalage sur nb negatif +- ppx = -(-(vx * fvitesse) >> 16); +- // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile) +- // * * * * * 9 = nb chiffre virgule de vx) +- else +- ppx = ((vx * fvitesse) >> 16); +- +- if (vy < 0) +- ppy = -(-(vy * fvitesse) >> 16); +- else +- ppy = ((vy * fvitesse) >> 16); +- +- *px = (data->middleX << 4) + ppx; +- *py = (data->middleY << 4) + ppy; +- } +- } +- */ +- +- +- +-static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, +- int buffratio, int precalCoef[16][16]) +-{ +- int myPos, myPos2; +- Color couleur; +- +- unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; +- +- int bufsize = prevX * prevY * 2; +- int bufwidth = prevX; +- +- expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; +- +- for (myPos = 0; myPos < bufsize; myPos += 2) { +- Color col1, col2, col3, col4; +- int c1, c2, c3, c4, px, py; +- int pos; +- int coeffs; +- +- int brutSmypos = brutS[myPos]; +- +- myPos2 = myPos + 1; +- +- px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- +- if ((py >= ay) || (px >= ax)) { +- pos = coeffs = 0; +- } else { +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- /* coef en modulo 15 */ +- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; +- } +- getPixelRGB_ (expix1, pos, &col1); +- getPixelRGB_ (expix1, pos + 1, &col2); +- getPixelRGB_ (expix1, pos + bufwidth, &col3); +- getPixelRGB_ (expix1, pos + bufwidth + 1, &col4); +- +- c1 = coeffs; +- c2 = (c1 >> 8) & 0xFF; +- c3 = (c1 >> 16) & 0xFF; +- c4 = (c1 >> 24) & 0xFF; +- c1 = c1 & 0xff; +- +- couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4; +- if (couleur.r > 5) +- couleur.r -= 5; +- couleur.r >>= 8; +- +- couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4; +- if (couleur.v > 5) +- couleur.v -= 5; +- couleur.v >>= 8; +- +- couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4; +- if (couleur.b > 5) +- couleur.b -= 5; +- couleur.b >>= 8; +- +- setPixelRGB_ (expix2, myPos >> 1, couleur); +- } +-} +- +-/** generate the water fx horizontal direction buffer */ +-static void generateTheWaterFXHorizontalDirectionBuffer(PluginInfo *goomInfo, ZoomFilterFXWrapperData *data) { +- +- int loopv; +- int decc = goom_irand(goomInfo->gRandom, 8) - 4; +- int spdc = goom_irand(goomInfo->gRandom, 8) - 4; +- int accel = goom_irand(goomInfo->gRandom, 8) - 4; +- +- for (loopv = data->prevY; loopv != 0;) { +- +- loopv--; +- data->firedec[loopv] = decc; +- decc += spdc / 10; +- spdc += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); +- +- if (decc > 4) +- spdc -= 1; +- if (decc < -4) +- spdc += 1; +- +- if (spdc > 30) +- spdc = spdc - goom_irand(goomInfo->gRandom, 3) + accel / 10; +- if (spdc < -30) +- spdc = spdc + goom_irand(goomInfo->gRandom, 3) + accel / 10; +- +- if (decc > 8 && spdc > 1) +- spdc -= goom_irand(goomInfo->gRandom, 3) - 2; +- +- if (decc < -8 && spdc < -1) +- spdc += goom_irand(goomInfo->gRandom, 3) + 2; +- +- if (decc > 8 || decc < -8) +- decc = decc * 8 / 9; +- +- accel += goom_irand(goomInfo->gRandom, 2) - goom_irand(goomInfo->gRandom, 2); +- if (accel > 20) +- accel -= 2; +- if (accel < -20) +- accel += 2; +- } +-} +- +- +- +-/** +-* Main work for the dynamic displacement map. +- * +- * Reads data from pix1, write to pix2. +- * +- * Useful datas for this FX are stored in ZoomFilterData. +- * +- * If you think that this is a strange function name, let me say that a long time ago, +- * there has been a slow version and a gray-level only one. Then came these function, +- * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image. +- * So that is why you have this name, for the nostalgy of the first days of goom +- * when it was just a tiny program writen in Turbo Pascal on my i486... +- */ +-void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult) +-{ +- Uint x, y; +- +- ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)goomInfo->zoomFilter_fx.fx_data; +- +- if (!BVAL(data->enabled_bp)) return; +- +- /** changement de taille **/ +- if ((data->prevX != resx) || (data->prevY != resy)) { +- data->prevX = resx; +- data->prevY = resy; +- +- if (data->brutS) free (data->freebrutS); +- data->brutS = 0; +- if (data->brutD) free (data->freebrutD); +- data->brutD = 0; +- if (data->brutT) free (data->freebrutT); +- data->brutT = 0; +- +- data->middleX = resx / 2; +- data->middleY = resy / 2; +- data->mustInitBuffers = 1; +- if (data->firedec) free (data->firedec); +- data->firedec = 0; +- } +- +- if (data->interlace_start != -2) +- zf = NULL; +- +- /** changement de config **/ +- if (zf) { +- data->reverse = zf->reverse; +- data->general_speed = (float)(zf->vitesse-128)/128.0f; +- if (data->reverse) data->general_speed = -data->general_speed; +- data->middleX = zf->middleX; +- data->middleY = zf->middleY; +- data->theMode = zf->mode; +- data->hPlaneEffect = zf->hPlaneEffect; +- data->vPlaneEffect = zf->vPlaneEffect; +- data->waveEffect = zf->waveEffect; +- data->hypercosEffect = zf->hypercosEffect; +- data->noisify = zf->noisify; +- data->interlace_start = 0; +- } +- +- +- if (data->mustInitBuffers) { +- +- data->mustInitBuffers = 0; +- data->freebrutS = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); +- data->brutS = (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128); +- +- data->freebrutD = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); +- data->brutD = (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128); +- +- data->freebrutT = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); +- data->brutT = (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128); +- +- data->buffratio = 0; +- +- data->firedec = (int *) malloc (data->prevY * sizeof (int)); +- generateTheWaterFXHorizontalDirectionBuffer(goomInfo, data); +- +- data->interlace_start = 0; +- makeZoomBufferStripe(data,resy); +- +- /* Copy the data from temp to dest and source */ +- memcpy(data->brutS,data->brutT,resx * resy * 2 * sizeof(int)); +- memcpy(data->brutD,data->brutT,resx * resy * 2 * sizeof(int)); +- } +- +- /* generation du buffer de trans */ +- if (data->interlace_start == -1) { +- +- /* sauvegarde de l'etat actuel dans la nouvelle source +- * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */ +- y = data->prevX * data->prevY * 2; +- for (x = 0; x < y; x += 2) { +- int brutSmypos = data->brutS[x]; +- int x2 = x + 1; +- +- data->brutS[x] = brutSmypos + (((data->brutD[x] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); +- brutSmypos = data->brutS[x2]; +- data->brutS[x2] = brutSmypos + (((data->brutD[x2] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); +- } +- data->buffratio = 0; +- } +- +- if (data->interlace_start == -1) { +- signed int * tmp; +- tmp = data->brutD; +- data->brutD=data->brutT; +- data->brutT=tmp; +- tmp = data->freebrutD; +- data->freebrutD=data->freebrutT; +- data->freebrutT=tmp; +- data->interlace_start = -2; +- } +- +- if (data->interlace_start>=0) +- { +- /* creation de la nouvelle destination */ +- makeZoomBufferStripe(data,resy/16); +- } +- +- if (switchIncr != 0) { +- data->buffratio += switchIncr; +- if (data->buffratio > BUFFPOINTMASK) +- data->buffratio = BUFFPOINTMASK; +- } +- +- if (switchMult != 1.0f) { +- data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) + +- (float) data->buffratio * switchMult); +- } +- +- data->zoom_width = data->prevX; +- +- goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2, +- data->brutS, data->brutD, data->buffratio, data->precalCoef); +-} +- +-static void generatePrecalCoef (int precalCoef[16][16]) +-{ +- int coefh, coefv; +- +- for (coefh = 0; coefh < 16; coefh++) { +- for (coefv = 0; coefv < 16; coefv++) { +- +- int i; +- int diffcoeffh; +- int diffcoeffv; +- +- diffcoeffh = sqrtperte - coefh; +- diffcoeffv = sqrtperte - coefv; +- +- if (!(coefh || coefv)) { +- i = 255; +- } +- else { +- int i1, i2, i3, i4; +- +- i1 = diffcoeffh * diffcoeffv; +- i2 = coefh * diffcoeffv; +- i3 = diffcoeffh * coefv; +- i4 = coefh * coefv; +- +- // TODO: faire mieux... +- if (i1) i1--; +- if (i2) i2--; +- if (i3) i3--; +- if (i4) i4--; +- +- i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24); +- } +- precalCoef[coefh][coefv] = i; +- } +- } +-} +- +-/* VisualFX Wrapper */ +- +-static void zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo *info) +-{ +- ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)malloc(sizeof(ZoomFilterFXWrapperData)); +- +- data->coeffs = 0; +- data->freecoeffs = 0; +- data->brutS = 0; +- data->freebrutS = 0; +- data->brutD = 0; +- data->freebrutD = 0; +- data->brutT = 0; +- data->freebrutT = 0; +- data->prevX = 0; +- data->prevY = 0; +- +- data->mustInitBuffers = 1; +- data->interlace_start = -2; +- +- data->general_speed = 0.0f; +- data->reverse = 0; +- data->theMode = AMULETTE_MODE; +- data->waveEffect = 0; +- data->hypercosEffect = 0; +- data->vPlaneEffect = 0; +- data->hPlaneEffect = 0; +- data->noisify = 2; +- +- /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ +- data->buffratio = 0; +- data->firedec = 0; +- +- data->wave = data->wavesp = 0; +- +- data->enabled_bp = secure_b_param("Enabled", 1); +- +- data->params = plugin_parameters ("Zoom Filter", 1); +- data->params.params[0] = &data->enabled_bp; +- +- _this->params = &data->params; +- _this->fx_data = (void*)data; +- +- /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ +- generatePrecalCoef(data->precalCoef); +-} +- +-static void zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this) +-{ +- free(_this->fx_data); +-} +- +-static void zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info) +-{ +-} +- +-VisualFX zoomFilterVisualFXWrapper_create(void) +-{ +- VisualFX fx; +- fx.init = zoomFilterVisualFXWrapper_init; +- fx.free = zoomFilterVisualFXWrapper_free; +- fx.apply = zoomFilterVisualFXWrapper_apply; +- return fx; +-} +- +- +-/* TODO : MOVE THIS AWAY */ +- +-void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, Uint cycle) +-{ +- Uint x = (Uint) ((int) (goomInfo->screen.width / 2) +- + (int) (t1 * cos ((float) cycle / t3))); +- Uint y = (Uint) ((int) (goomInfo->screen.height/2) +- + (int) (t2 * sin ((float) cycle / t4))); +- +- if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) && (y < goomInfo->screen.height - 2)) { +- setPixelRGB (goomInfo, pix1, x + 1, y, c); +- setPixelRGB (goomInfo, pix1, x, y + 1, c); +- setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE); +- setPixelRGB (goomInfo, pix1, x + 2, y + 1, c); +- setPixelRGB (goomInfo, pix1, x + 1, y + 2, c); +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/filters.c.rej /src/filters.c.rej +--- /home/d4rk/goom2k4-0/src/filters.c.rej 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filters.c.rej 1969-12-31 17:00:00.000000000 -0700 +@@ -1,31 +0,0 @@ +-*************** +-*** 427,439 **** +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- /* coef en modulo 15 */ +- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; +-- +-- if ((py >= (signed int)ay) || (px >= (signed int)ax)) { +-- pos = coeffs = 0; +-- } +- +- getPixelRGB_ (expix1, pos, &col1); +- getPixelRGB_ (expix1, pos + 1, &col2); +---- 427,441 ---- +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- +-+ +-+ if ((py >= ay) || (px >= ax)) { +-+ pos = coeffs = 0; +-+ } else { +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- /* coef en modulo 15 */ +- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; +-+ } +-+ +- +- getPixelRGB_ (expix1, pos, &col1); +- getPixelRGB_ (expix1, pos + 1, &col2); +diff -Naur /home/d4rk/goom2k4-0/src/filters_mmx.s /src/filters_mmx.s +--- /home/d4rk/goom2k4-0/src/filters_mmx.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filters_mmx.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,200 +0,0 @@ +-;// file : mmx_zoom.s +-;// author : JC Hoelt +-;// +-;// history +-;// 07/01/2001 : Changing FEMMS to EMMS : slower... but run on intel machines +-;// 03/01/2001 : WIDTH and HEIGHT are now variable +-;// 28/12/2000 : adding comments to the code, suppress some useless lines +-;// 27/12/2000 : reducing memory access... improving performance by 20% +-;// coefficients are now on 1 byte +-;// 22/12/2000 : Changing data structure +-;// 16/12/2000 : AT&T version +-;// 14/12/2000 : unrolling loop +-;// 12/12/2000 : 64 bits memory access +- +- +-.data +- +-chaine: +- .string "pos = %d\n\0" +- .long 0x0 +- +-thezero: +- .long 0x00000000 +- .long 0x00000000 +- +-.text +- +-.globl mmx_zoom ;// name of the function to call by C program +-/* .extern coeffs ;// the transformation buffer */ +-.extern expix1,expix2 ;// the source and destination buffer +-.extern mmx_zoom_size, zoom_width ;// size of the buffers +- +-.extern brutS,brutD,buffratio,precalCoef,prevX,prevY +- +-#define PERTEMASK 15 +-/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +-#define PERTEDEC 4 +- +-.align 16 +-mmx_zoom: +- +- pushl %ebp +- movl %esp,%ebp +- subl $12,%esp +- +- movl prevX,%eax +- decl %eax +- sarl $4,%eax +- movl %eax,-4(%ebp) +- +- movl prevY,%eax +- decl %eax +- sarl $4,%eax +- movl %eax,-8(%ebp) +- +-;// initialisation du mm7 zero +- movq (thezero), %mm7 +- +-movl mmx_zoom_size, %ecx +-decl %ecx +- +-.while: +- ;// esi <- nouvelle position +- movl brutS, %eax +- leal (%eax, %ecx, 8),%eax +- +- movl (%eax),%edx /* = brutS.px (brutSmypos) */ +- movl 4(%eax),%eax /* = brutS.py */ +- +- movl brutD,%ebx +- leal (%ebx, %ecx, 8),%ebx +- movl (%ebx),%esi +- subl %edx, %esi +- imull buffratio,%esi +- sarl $16,%esi +- addl %edx,%esi /* esi = px */ +- +- /* eax contient deja brutS.py = le nouveau brutSmypos*/ +- /* ebx pointe sur brutD[myPos] */ +- movl 4(%ebx),%edi +- subl %eax,%edi +- imull buffratio,%edi +- sarl $16,%edi +- addl %eax,%edi /* edi = py */ +- +-/* pushl %eax +- pushl %ebx*/ +-/* popl %ebx +- popl %eax*/ +- +- movl %esi,%eax +- andl $15,%eax /* eax = coefh */ +- movl %edi,%ebx +- andl $15,%ebx /* ebx = coefv */ +- +- leal 0(,%ebx,4),%ebx +- sall $6,%eax +- addl %ebx,%eax +- movl $precalCoef,%ebx +-/* movd (%eax,%ebx),%mm6*/ /* mm6 = coeffs */ +- +- cmpl -8(%ebp),%edi +- jge .then1 +- cmpl -4(%ebp),%esi +- jge .then1 +- +- sarl $4,%esi +- sarl $4,%edi +- imull zoom_width,%edi +- leal (%esi,%edi),%esi +- jmp .finsi1 +- +-.then1: +- movl $0,%esi +-.finsi1: +- +- /** apres ce calcul, %esi = pos, %mm6 = coeffs **/ +-/* pushl %esi +- pushl $chaine +- call printf +- addl $8,%esp*/ +- +- movl expix1,%eax +- +- ;// recuperation des deux premiers pixels dans mm0 et mm1 +-/* movq (%eax,%esi,4), %mm0 /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- movq %mm0, %mm1 /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- ;// depackage du premier pixel +- punpcklbw %mm7, %mm0 /* 00-b2-00-v2-00-r2-00-a2 */ +- +- movq %mm6, %mm5 /* ??-??-??-??-c4-c3-c2-c1 */ +- ;// depackage du 2ieme pixel +- punpckhbw %mm7, %mm1 /* 00-b1-00-v1-00-r1-00-a1 */ +- +- ;// extraction des coefficients... +- punpcklbw %mm5, %mm6 /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq %mm6, %mm4 /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq %mm6, %mm5 /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +- punpcklbw %mm5, %mm6 /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpckhbw %mm5, %mm4 /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +- movq %mm6, %mm3 /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpcklbw %mm7, %mm6 /* 00-c1-00-c1-00-c1-00-c1 */ +- punpckhbw %mm7, %mm3 /* 00-c2-00-c2-00-c2-00-c2 */ +- +- ;// multiplication des pixels par les coefficients +- pmullw %mm6, %mm0 /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- pmullw %mm3, %mm1 /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- paddw %mm1, %mm0 +- +- ;// ...extraction des 2 derniers coefficients +- movq %mm4, %mm5 /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- punpcklbw %mm7, %mm4 /* 00-c3-00-c3-00-c3-00-c3 */ +- punpckhbw %mm7, %mm5 /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* ajouter la longueur de ligne a esi */ +- addl prevX,%esi +- +- ;// recuperation des 2 derniers pixels +-/* movq (%eax,%esi,4), %mm1*/ +- movq %mm1, %mm2 +- +- ;// depackage des pixels +- punpcklbw %mm7, %mm1 +- punpckhbw %mm7, %mm2 +- +- ;// multiplication pas les coeffs +- pmullw %mm4, %mm1 +- pmullw %mm5, %mm2 +- +- ;// ajout des valeurs obtenues la valeur finale +- paddw %mm1, %mm0 +- paddw %mm2, %mm0 +- +- ;// division par 256 = 16+16+16+16, puis repackage du pixel final +- psrlw $8, %mm0 +- packuswb %mm7, %mm0 +- +- ;// passage au suivant +- +- ;// enregistrement du resultat +- movl expix2,%eax +-/* movd %mm0,(%eax,%ecx,4)*/ +- +- decl %ecx +- ;// test de fin du tantque +- cmpl $0, %ecx ;// 400x300 +- +- jz .fin_while +- jmp .while +- +-.fin_while: +- emms +- +- movl %ebp,%esp +- popl %ebp +- +- ret ;//The End +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/mmx.h /src/filter_test/mmx.h +--- /home/d4rk/goom2k4-0/src/filter_test/mmx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/mmx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,705 +0,0 @@ +-/* mmx.h +- +- MultiMedia eXtensions GCC interface library for IA32. +- +- To use this library, simply include this header file +- and compile with GCC. You MUST have inlining enabled +- in order for mmx_ok() to work; this can be done by +- simply using -O on the GCC command line. +- +- Compiling with -DMMX_TRACE will cause detailed trace +- output to be sent to stderr for each mmx operation. +- This adds lots of code, and obviously slows execution to +- a crawl, but can be very useful for debugging. +- +- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY +- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT +- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY +- AND FITNESS FOR ANY PARTICULAR PURPOSE. +- +- 1997-99 by H. Dietz and R. Fisher +- +- Notes: +- It appears that the latest gas has the pand problem fixed, therefore +- I'll undefine BROKEN_PAND by default. +-*/ +- +-#ifndef _MMX_H +-#define _MMX_H +- +-/* Warning: at this writing, the version of GAS packaged +- with most Linux distributions does not handle the +- parallel AND operation mnemonic correctly. If the +- symbol BROKEN_PAND is defined, a slower alternative +- coding will be used. If execution of mmxtest results +- in an illegal instruction fault, define this symbol. +-*/ +-#undef BROKEN_PAND +- +- +-/* The type of an value that fits in an MMX register +- (note that long long constant values MUST be suffixed +- by LL and unsigned long long values by ULL, lest +- they be truncated by the compiler) +-*/ +-typedef union { +- long long q; /* Quadword (64-bit) value */ +- unsigned long long uq; /* Unsigned Quadword */ +- int d[2]; /* 2 Doubleword (32-bit) values */ +- unsigned int ud[2]; /* 2 Unsigned Doubleword */ +- short w[4]; /* 4 Word (16-bit) values */ +- unsigned short uw[4]; /* 4 Unsigned Word */ +- char b[8]; /* 8 Byte (8-bit) values */ +- unsigned char ub[8]; /* 8 Unsigned Byte */ +- float s[2]; /* Single-precision (32-bit) value */ +-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +- +- +- +-/* Function to test if multimedia instructions are supported... +-*/ +-inline extern int +-mm_support(void) +-{ +- /* Returns 1 if MMX instructions are supported, +- 3 if Cyrix MMX and Extended MMX instructions are supported +- 5 if AMD MMX and 3DNow! instructions are supported +- 0 if hardware does not support any of these +- */ +- register int rval = 0; +- +- __asm__ __volatile__ ( +- /* See if CPUID instruction is supported ... */ +- /* ... Get copies of EFLAGS into eax and ecx */ +- "pushf\n\t" +- "popl %%eax\n\t" +- "movl %%eax, %%ecx\n\t" +- +- /* ... Toggle the ID bit in one copy and store */ +- /* to the EFLAGS reg */ +- "xorl $0x200000, %%eax\n\t" +- "push %%eax\n\t" +- "popf\n\t" +- +- /* ... Get the (hopefully modified) EFLAGS */ +- "pushf\n\t" +- "popl %%eax\n\t" +- +- /* ... Compare and test result */ +- "xorl %%eax, %%ecx\n\t" +- "testl $0x200000, %%ecx\n\t" +- "jz NotSupported1\n\t" /* CPUID not supported */ +- +- +- /* Get standard CPUID information, and +- go to a specific vendor section */ +- "movl $0, %%eax\n\t" +- "cpuid\n\t" +- +- /* Check for Intel */ +- "cmpl $0x756e6547, %%ebx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x49656e69, %%edx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x6c65746e, %%ecx\n" +- "jne TryAMD\n\t" +- "jmp Intel\n\t" +- +- /* Check for AMD */ +- "\nTryAMD:\n\t" +- "cmpl $0x68747541, %%ebx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x69746e65, %%edx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x444d4163, %%ecx\n" +- "jne TryCyrix\n\t" +- "jmp AMD\n\t" +- +- /* Check for Cyrix */ +- "\nTryCyrix:\n\t" +- "cmpl $0x69727943, %%ebx\n\t" +- "jne NotSupported2\n\t" +- "cmpl $0x736e4978, %%edx\n\t" +- "jne NotSupported3\n\t" +- "cmpl $0x64616574, %%ecx\n\t" +- "jne NotSupported4\n\t" +- /* Drop through to Cyrix... */ +- +- +- /* Cyrix Section */ +- /* See if extended CPUID level 80000001 is supported */ +- /* The value of CPUID/80000001 for the 6x86MX is undefined +- according to the Cyrix CPU Detection Guide (Preliminary +- Rev. 1.01 table 1), so we'll check the value of eax for +- CPUID/0 to see if standard CPUID level 2 is supported. +- According to the table, the only CPU which supports level +- 2 is also the only one which supports extended CPUID levels. +- */ +- "cmpl $0x2, %%eax\n\t" +- "jne MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported (in theory), so get extended +- features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%eax\n\t" /* Test for MMX */ +- "jz NotSupported5\n\t" /* MMX not supported */ +- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ +- "jnz EMMXSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "EMMXSupported:\n\t" +- "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* AMD Section */ +- "AMD:\n\t" +- +- /* See if extended CPUID is supported */ +- "movl $0x80000000, %%eax\n\t" +- "cpuid\n\t" +- "cmpl $0x80000000, %%eax\n\t" +- "jl MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported, so get extended features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported6\n\t" /* MMX not supported */ +- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ +- "jnz ThreeDNowSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "ThreeDNowSupported:\n\t" +- "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* Intel Section */ +- "Intel:\n\t" +- +- /* Check for MMX */ +- "MMXtest:\n\t" +- "movl $1, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported7\n\t" /* MMX Not supported */ +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\t" +- +- /* Nothing supported */ +- "\nNotSupported1:\n\t" +- "#movl $101, %0:\n\n\t" +- "\nNotSupported2:\n\t" +- "#movl $102, %0:\n\n\t" +- "\nNotSupported3:\n\t" +- "#movl $103, %0:\n\n\t" +- "\nNotSupported4:\n\t" +- "#movl $104, %0:\n\n\t" +- "\nNotSupported5:\n\t" +- "#movl $105, %0:\n\n\t" +- "\nNotSupported6:\n\t" +- "#movl $106, %0:\n\n\t" +- "\nNotSupported7:\n\t" +- "#movl $107, %0:\n\n\t" +- "movl $0, %0:\n\n\t" +- +- "Return:\n\t" +- : "=a" (rval) +- : /* no input */ +- : "eax", "ebx", "ecx", "edx" +- ); +- +- /* Return */ +- return(rval); +-} +- +-/* Function to test if mmx instructions are supported... +-*/ +-inline extern int +-mmx_ok(void) +-{ +- /* Returns 1 if MMX instructions are supported, 0 otherwise */ +- return ( mm_support() & 0x1 ); +-} +- +- +-/* Helper functions for the instruction macros that follow... +- (note that memory-to-register, m2r, instructions are nearly +- as efficient as register-to-register, r2r, instructions; +- however, memory-to-memory instructions are really simulated +- as a convenience, and are only 1/3 as efficient) +-*/ +-#ifdef MMX_TRACE +- +-/* Include the stuff for printing a trace to stderr... +-*/ +- +-#include +- +-#define mmx_i2r(op, imm, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace.uq = (imm); \ +- printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2r(op, mem, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mem); \ +- printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2m(op, reg, mem) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2r(op, regs, regd) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #regs ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2m(op, mems, memd) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mems); \ +- printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#else +- +-/* These macros are a lot simpler without the tracing... +-*/ +- +-#define mmx_i2r(op, imm, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm) ) +- +-#define mmx_m2r(op, mem, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)) +- +-#define mmx_r2m(op, reg, mem) \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ) +- +-#define mmx_r2r(op, regs, regd) \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd) +- +-#define mmx_m2m(op, mems, memd) \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)) +- +-#endif +- +- +-/* 1x64 MOVe Quadword +- (this is both a load and a store... +- in fact, it is the only way to store) +-*/ +-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +-#define movq(vars, vard) \ +- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 1x32 MOVe Doubleword +- (like movq, this is both load and store... +- but is most useful for moving things between +- mmx registers and ordinary registers) +-*/ +-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +-#define movd(vars, vard) \ +- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ +- "movd %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 2x32, 4x16, and 8x8 Parallel ADDs +-*/ +-#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +-#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +-#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) +- +-#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +-#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +-#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) +- +-#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +-#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +-#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +-*/ +-#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +-#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +-#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) +- +-#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +-#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +-#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +-*/ +-#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +-#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +-#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) +- +-#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +-#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +-#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel SUBs +-*/ +-#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +-#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +-#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) +- +-#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +-#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +-#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) +- +-#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +-#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +-#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +-*/ +-#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +-#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +-#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) +- +-#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +-#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +-#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +-*/ +-#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +-#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +-#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) +- +-#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +-#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +-#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) +- +- +-/* 4x16 Parallel MULs giving Low 4x16 portions of results +-*/ +-#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +-#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +-#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +-*/ +-#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +-#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +-#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) +- +- +-/* 4x16->2x32 Parallel Mul-ADD +- (muls like pmullw, then adds adjacent 16-bit fields +- in the multiply result to make the final 2x32 result) +-*/ +-#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +-#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +-#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) +- +- +-/* 1x64 bitwise AND +-*/ +-#ifdef BROKEN_PAND +-#define pand_m2r(var, reg) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, reg); \ +- mmx_m2r(pandn, var, reg); \ +- } +-#define pand_r2r(regs, regd) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, regd); \ +- mmx_r2r(pandn, regs, regd) \ +- } +-#define pand(vars, vard) \ +- { \ +- movq_m2r(vard, mm0); \ +- mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ +- mmx_m2r(pandn, vars, mm0); \ +- movq_r2m(mm0, vard); \ +- } +-#else +-#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +-#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +-#define pand(vars, vard) mmx_m2m(pand, vars, vard) +-#endif +- +- +-/* 1x64 bitwise AND with Not the destination +-*/ +-#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +-#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +-#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) +- +- +-/* 1x64 bitwise OR +-*/ +-#define por_m2r(var, reg) mmx_m2r(por, var, reg) +-#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +-#define por(vars, vard) mmx_m2m(por, vars, vard) +- +- +-/* 1x64 bitwise eXclusive OR +-*/ +-#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +-#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +-#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +-#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +-#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) +- +-#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +-#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +-#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) +- +-#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +-#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +-#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +-#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +-#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) +- +-#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +-#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +-#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) +- +-#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +-#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +-#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +-*/ +-#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +-#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +-#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +-#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) +- +-#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +-#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +-#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +-#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) +- +-#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +-#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +-#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +-#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +-*/ +-#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +-#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +-#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +-#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) +- +-#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +-#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +-#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +-#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) +- +-#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +-#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +-#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +-#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) +- +- +-/* 2x32 and 4x16 Parallel Shift Right Arithmetic +-*/ +-#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +-#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +-#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +-#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) +- +-#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +-#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +-#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +-#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) +- +- +-/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +-#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +-#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) +- +-#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +-#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +-#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) +- +- +-/* 4x16->8x8 PACK and Unsigned Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +-#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +-#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low +- (interleaves low half of dest with low half of source +- as padding in each result field) +-*/ +-#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +-#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +-#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) +- +-#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +-#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +-#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) +- +-#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +-#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +-#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High +- (interleaves high half of dest with high half of source +- as padding in each result field) +-*/ +-#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +-#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +-#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) +- +-#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +-#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +-#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) +- +-#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +-#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +-#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) +- +- +-/* Empty MMx State +- (used to clean-up when going from mmx to float use +- of the registers that are shared by both; note that +- there is no float-to-mmx operation needed, because +- only the float tag word info is corruptible) +-*/ +-#ifdef MMX_TRACE +- +-#define emms() \ +- { \ +- printf("emms()\n"); \ +- __asm__ __volatile__ ("emms"); \ +- } +- +-#else +- +-#define emms() __asm__ __volatile__ ("emms") +- +-#endif +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/px_py_calc.c /src/filter_test/px_py_calc.c +--- /home/d4rk/goom2k4-0/src/filter_test/px_py_calc.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/px_py_calc.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,94 +0,0 @@ +-#include "mmx.h" +- +-int testD [] = {0x1200, 0x2011, 0, 0x12, 0x5331, 0x8000}; +-int testS [] = {0x1205, 0x11, 0x4210, 0x412, 0x121, 0x1211}; +- +-int ratios [] = {0x8000, 0x4000, 0x1234, 0x6141, 0xffff, 0}; +- +-int main () { +- int nbERROR = 0; +- int i,j; +- volatile mmx_t ratiox; +- +- volatile mmx_t sortie; +- +- /* creation des variables de test */ +- volatile int buffratio = 0x8000; +- volatile int loop = 0; +- volatile int *buffS; +- volatile int *buffD; +- buffS = malloc (256); +- buffD = malloc (256); +- +- buffS = buffS + (unsigned)buffS % 64; +- buffD = buffD + (unsigned)buffD % 64; +- +- for (j=0;j<6;j++) +- for (i=0;i<3;i++) { +- +- buffratio = ratios[j]; +- +- buffS[0] = testS[i<<1]; +- buffS[1] = testS[(i<<1)+1]; +- +- buffD[0] = testD[i*2]; +- buffD[1] = testD[i*2+1]; +- +- /* code */ +- +- ratiox.d[0] = buffratio; +- ratiox.d[1] = buffratio; +- movq_m2r (ratiox, mm6); +- pslld_i2r (16,mm6); +- +- /* |0hhhhhhh|llllvvvv| +- x |00000000|bbbbbbbb| +- ================= +- |.bl.high|..bl.low| +- + |..bh.low|00000000| +- ================= +- result1 +- */ +- +- /* +- * pre : mm6 = [buffratio<<16|buffratio<<16] +- */ +- +- movq_m2r (buffS[loop],mm0); /* mm0 = S */ +- movq_m2r (buffD[loop],mm1); /* mm1 = D */ +- psubd_r2r (mm0,mm1); /* mm1 = D - S */ +- movq_r2r (mm1, mm2); /* mm2 = D - S */ +- +- pslld_i2r (16,mm1); +- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ +- pmullw_r2r (mm6, mm2); +- +- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ +- pslld_i2r (16,mm0); +- +- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ +- psrld_i2r (16, mm0); +- movq_r2m (mm0, sortie); +- +- /* +- * post : mm0 = S + ((D-S)*buffratio)>>16 +- * modified = mm0,mm1,mm2 +- */ +- +- if ( +- (buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16) != sortie.d[0]) +- | (buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16) != sortie.d[1])) +- { +- nbERROR++; +- printf ("\ns : (0x%08x,0x%08x)\n", buffS[0], buffS[1]); +- printf ("d : (0x%08x,0x%08x)\n", buffD[0], buffD[1]); +- printf ("ratio : (0x%08x,0x%08x)\n", buffratio, buffratio); +- +- printf ("en mmx : (0x%08x,0x%08x)\n", sortie.d[0], sortie.d[1]); +- printf ("en c : (0x%08x,0x%08x)\n", +- buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16), +- buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16)); +- } +- } +- printf ("%d errors\n",nbERROR); +-} +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx.c /src/filter_test/zoom_filter_mmx.c +--- /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/zoom_filter_mmx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,186 +0,0 @@ +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#define sqrtperte 16 +-// faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +-// faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +- +-//#define MMX_TRACE +-#include "mmx.h" +- +-void zoom_filter_mmx (int prevX, int prevY, +- unsigned int *expix1, unsigned int *expix2, +- int *lbruS, int *lbruD, int buffratio, +- int precalCoef[16][16]) +-{ +- int bufsize = prevX * prevY; /* taille du buffer */ +- volatile int loop; /* variable de boucle */ +- +- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ +- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ +- +- int pos; +- +- volatile mmx_t prevXY; +- volatile mmx_t ratiox; +- volatile mmx_t interpix; +- +- volatile mmx_t mask; /* masque des nombres a virgules */ +- mask.ud[0] = BUFFPOINTMASK; +- mask.ud[1] = BUFFPOINTMASK; +- +- prevXY.ud[0] = (prevX-1)<>16 format [X|Y] +- * modified = mm0,mm1,mm2 +- */ +- +- movq_m2r (brutS[loop],mm0); /* mm0 = S */ +- movq_m2r (brutD[loop],mm1); /* mm1 = D */ +- psubd_r2r (mm0,mm1); /* mm1 = D - S */ +- movq_r2r (mm1, mm2); /* mm2 = D - S */ +- +- pslld_i2r (16,mm1); +- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ +- pmullw_r2r (mm6, mm2); +- +- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ +- pslld_i2r (16,mm0); +- +- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ +- psrld_i2r (16, mm0); +- +- /* +- * pre : mm0 : position vector on screen +- * prevXY : coordinate of the lower-right point on screen +- * post : clipped mm0 +- * modified : mm0,mm1 +- */ +- movq_m2r (prevXY,mm1); +- pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : +- 1111 si prevXY > px +- 0000 si prevXY <= px +- (idem pour y) */ +- pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ +- +- +- /* +- * pre : mm0 : clipped position on screen +- * post : mm6 : coefs for this position +- * mm1 : X vector [0|X] +- * modif : eax,ebx +- */ +- __asm__ __volatile__ ( +- "movq %%mm0,%%mm1\n" +- "movd %%mm0,%%eax\n" +- "psrlq $32,%%mm1\n" +- "movd %%mm1,%%ebx\n" +- "and $15,%%eax\n" +- "and $15,%%ebx\n" +- "add %0,%%eax\n" +- "movd (%%eax,%%ebx,$16),%%mm6\n" +- ::"X"(precalCoef):"eax","ebx"); +- +- /* +- * pre : mm0 : Y pos [*|Y] +- * mm1 : X pos [*|X] +- * post : eax : absolute position of the source pixel. +- * modif : ebx +- */ +- psrld_i2r (PERTEDEC,mm0); +- psrld_i2r (PERTEDEC,mm1); +- __asm__ __volatile__ ( +- "movd %%mm1,%%eax\n" +-// "movl %1,%%ebx\n" +- "mull %1\n" +- "movd %%mm0,%%ebx\n" +- "addl %%ebx,%%eax\n" +- "movl %%eax,%0\n" +- :"=X"(pos):"X"(prevX):"eax","ebx" +- ); +- +- expix2[loop] = expix1[pos]; +- /* +- * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; +- * coef en modulo 15 * +- * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); +- */ +-// precal + eax + ebx * 16 +- +-// movd_m2r (precalCoef[interpix.d[0]][interpix.d[1]],mm6); +- +- /* recuperation des deux premiers pixels dans mm0 et mm1 */ +-// movq_m2r (/*expix1[pos]*/a, mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +-// movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* depackage du premier pixel */ +-// punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ +- +-// movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ +- /* depackage du 2ieme pixel */ +-// punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ +- +- /* extraction des coefficients... */ +-// punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +-// movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +-// movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +-// punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +-// punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +-// movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +-// punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ +-// punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +-// pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +-// pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +-// paddw_r2r (mm1, mm0); +- +- /* ...extraction des 2 derniers coefficients */ +-// movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +-// punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +-// punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* recuperation des 2 derniers pixels */ +-// movq_m2r (a/*expix1[pos+largeur]*/, mm1); +-// movq_r2r (mm1, mm2); +- +- /* depackage des pixels */ +-// punpcklbw_r2r (mm7, mm1); +-// punpckhbw_r2r (mm7, mm2); +- +- /* multiplication pas les coeffs */ +-// pmullw_r2r (mm4, mm1); +-// pmullw_r2r (mm5, mm2); +- +- /* ajout des valeurs obtenues la valeur finale */ +-// paddw_r2r (mm1, mm0); +-// paddw_r2r (mm2, mm0); +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +-// psrlw_i2r (8, mm0); +-// packuswb_r2r (mm7, mm0); +- +-// movd_r2m (mm0,expix2[loop]); +- +- // expix2[loop] = couleur; +- } +- emms(); /* __asm__ __volatile__ ("emms"); */ +-} +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c /src/filter_test/zoom_filter_mmx-v0.c +--- /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/zoom_filter_mmx-v0.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,202 +0,0 @@ +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#define sqrtperte 16 +-// faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +-// faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +- +-//#define MMX_TRACE +-#include "mmx.h" +- +-void zoom_filter_mmx (int prevX, int prevY, +- unsigned int *expix1, unsigned int *expix2, +- int *lbruS, int *lbruD, int buffratio, +- int precalCoef[16][16]) +-{ +- int bufsize = prevX * prevY; /* taille du buffer */ +- volatile int loop; /* variable de boucle */ +- +- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ +- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ +- +- volatile mmx_t prevXY; +- volatile mmx_t ratiox; +- volatile mmx_t interpix; +- +- volatile mmx_t mask; /* masque des nombres a virgules */ +- mask.ud[0] = BUFFPOINTMASK; +- mask.ud[1] = BUFFPOINTMASK; +- +- prevXY.ud[0] = (prevX-1)<>16 format [X|Y] +- * modified = mm0,mm1,mm2 +- */ +- +- __asm__ __volatile__ ( +- "movq %0,%%mm0\n" +- "movq %1,%%mm1\n" +- : :"X"(brutS[loop]),"X"(brutD[loop]) +- ); /* mm0 = S */ +- +- psubd_r2r (mm0,mm1); /* mm1 = D - S */ +- movq_r2r (mm1, mm2); /* mm2 = D - S */ +- +- pslld_i2r (16,mm1); +- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ +- pmullw_r2r (mm6, mm2); +- +- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ +- pslld_i2r (16,mm0); +- +- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ +- psrld_i2r (16, mm0); +- +- /* +- * pre : mm0 : position vector on screen +- * prevXY : coordinate of the lower-right point on screen +- * post : clipped mm0 +- * modified : mm0,mm1,mm2 +- */ +- movq_m2r (prevXY,mm1); +- pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : +- 1111 si prevXY > px +- 0000 si prevXY <= px +- (idem pour y) */ +- movq_r2r (mm1,mm2); +- punpckldq_r2r (mm1,mm1); +- punpckhdq_r2r (mm2,mm2); +- pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ +- pand_r2r (mm2, mm0); /* on met a zero la partie qui deborde */ +- +- /* +- * pre : mm0 : clipped position on screen +- * post : mm6 : coefs for this position +- * mm1 : X vector [0|X] +- * modif : eax,ebx +- */ +- __asm__ __volatile__ ( +- "movq %%mm0,%%mm1\n" +- "movd %%mm0,%%ebx\n" +- "psrlq $32,%%mm1\n" +- "movd %%mm1,%%eax\n" +- "andl $15,%%eax\n" +- "andl $15,%%ebx\n" +- +- "shll $2,%%eax\n" +- "shll $3,%%ebx\n" +- +- "addl %0,%%eax\n" +- +- "movd (%%eax,%%ebx,8),%%mm6\n" +- ::"X"(precalCoef):"eax","ebx"); +- +- /* +- * pre : mm0 : Y pos [*|Y] +- * mm1 : X pos [*|X] +- * post : eax : absolute position of the source pixel. +- * modif : ebx +- */ +- psrld_i2r (PERTEDEC,mm0); +- psrld_i2r (PERTEDEC,mm1); +- __asm__ __volatile__ ( +- "movd %%mm1,%%eax\n" +- "mull %1\n" +- "movd %%mm0,%%ebx\n" +- "addl %%ebx,%%eax\n" +- "movl %0,%%ebx\n" +- "movq (%%ebx,%%eax,4),%%mm0\n" +- "addl %1,%%eax\n" +- "movq (%%ebx,%%eax,4),%%mm2\n" +- +- : : "X"(expix1), "X"(prevX):"eax","ebx" +- ); +- +- /* +- * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; +- * coef en modulo 15 * +- * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); +- */ +- +- /* recuperation des deux premiers pixels dans mm0 et mm1 */ +-// movq_m2r (expix1[pos], mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* recuperation des 2 derniers pixels */ +-// movq_m2r (expix1[pos+prevX], mm2); +- +- /* depackage du premier pixel */ +- punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ +- +- movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ +- /* depackage du 2ieme pixel */ +- punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ +- +- /* extraction des coefficients... */ +- punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +- punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +- movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ +- punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +- pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- paddw_r2r (mm1, mm0); +- +- /* ...extraction des 2 derniers coefficients */ +- movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +- punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* recuperation des 2 derniers pixels */ +- movq_r2r (mm2, mm1); +- +- /* depackage des pixels */ +- punpcklbw_r2r (mm7, mm1); +- punpckhbw_r2r (mm7, mm2); +- +- /* multiplication pas les coeffs */ +- pmullw_r2r (mm4, mm1); +- pmullw_r2r (mm5, mm2); +- +- /* ajout des valeurs obtenues la valeur finale */ +- paddw_r2r (mm1, mm0); +- paddw_r2r (mm2, mm0); +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +- psrlw_i2r (8, mm0); +- packuswb_r2r (mm7, mm0); +- +- movd_r2m (mm0,expix2[loop]); +- +- // expix2[loop] = couleur; +- ++loop; +- } +- emms(); /* __asm__ __volatile__ ("emms"); */ +-} +diff -Naur /home/d4rk/goom2k4-0/src/flying_stars_fx.c /src/flying_stars_fx.c +--- /home/d4rk/goom2k4-0/src/flying_stars_fx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/flying_stars_fx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,314 +0,0 @@ +-#include "goom_fx.h" +-#include "goom_plugin_info.h" +-#include "goom_tools.h" +- +-#include "mathtools.h" +- +-/* TODO:-- FAIRE PROPREMENT... BOAH... */ +-#define NCOL 15 +- +-/*static const int colval[] = { +-0xfdf6f5, +-0xfae4e4, +-0xf7d1d1, +-0xf3b6b5, +-0xefa2a2, +-0xec9190, +-0xea8282, +-0xe87575, +-0xe46060, +-0xe14b4c, +-0xde3b3b, +-0xdc2d2f, +-0xd92726, +-0xd81619, +-0xd50c09, +-0 +-}; +-*/ +-static const int colval[] = { +- 0x1416181a, +- 0x1419181a, +- 0x141f181a, +- 0x1426181a, +- 0x142a181a, +- 0x142f181a, +- 0x1436181a, +- 0x142f1819, +- 0x14261615, +- 0x13201411, +- 0x111a100a, +- 0x0c180508, +- 0x08100304, +- 0x00050101, +- 0x0 +-}; +- +- +-/* The different modes of the visual FX. +- * Put this values on fx_mode */ +-#define FIREWORKS_FX 0 +-#define RAIN_FX 1 +-#define FOUNTAIN_FX 2 +-#define LAST_FX 3 +- +-typedef struct _FS_STAR { +- float x,y; +- float vx,vy; +- float ax,ay; +- float age,vage; +-} Star; +- +-typedef struct _FS_DATA{ +- +- int fx_mode; +- int nbStars; +- +- int maxStars; +- Star *stars; +- +- float min_age; +- float max_age; +- +- PluginParam min_age_p; +- PluginParam max_age_p; +- PluginParam nbStars_p; +- PluginParam nbStars_limit_p; +- PluginParam fx_mode_p; +- +- PluginParameters params; +-} FSData; +- +-static void fs_init(VisualFX *_this, PluginInfo *info) { +- +- FSData *data; +- data = (FSData*)malloc(sizeof(FSData)); +- +- data->fx_mode = FIREWORKS_FX; +- data->maxStars = 4096; +- data->stars = (Star*)malloc(data->maxStars * sizeof(Star)); +- data->nbStars = 0; +- +- data->max_age_p = secure_i_param ("Fireworks Smallest Bombs"); +- IVAL(data->max_age_p) = 80; +- IMIN(data->max_age_p) = 0; +- IMAX(data->max_age_p) = 100; +- ISTEP(data->max_age_p) = 1; +- +- data->min_age_p = secure_i_param ("Fireworks Largest Bombs"); +- IVAL(data->min_age_p) = 99; +- IMIN(data->min_age_p) = 0; +- IMAX(data->min_age_p) = 100; +- ISTEP(data->min_age_p) = 1; +- +- data->nbStars_limit_p = secure_i_param ("Max Number of Particules"); +- IVAL(data->nbStars_limit_p) = 512; +- IMIN(data->nbStars_limit_p) = 0; +- IMAX(data->nbStars_limit_p) = data->maxStars; +- ISTEP(data->nbStars_limit_p) = 64; +- +- data->fx_mode_p = secure_i_param ("FX Mode"); +- IVAL(data->fx_mode_p) = data->fx_mode; +- IMIN(data->fx_mode_p) = 1; +- IMAX(data->fx_mode_p) = 3; +- ISTEP(data->fx_mode_p) = 1; +- +- data->nbStars_p = secure_f_feedback ("Number of Particules (% of Max)"); +- +- data->params = plugin_parameters ("Particule System", 7); +- data->params.params[0] = &data->fx_mode_p; +- data->params.params[1] = &data->nbStars_limit_p; +- data->params.params[2] = 0; +- data->params.params[3] = &data->min_age_p; +- data->params.params[4] = &data->max_age_p; +- data->params.params[5] = 0; +- data->params.params[6] = &data->nbStars_p; +- +- _this->params = &data->params; +- _this->fx_data = (void*)data; +-} +- +-static void fs_free(VisualFX *_this) { +- free (_this->fx_data); +-} +- +- +-/** +- * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice. +- */ +-static void addABomb (FSData *fs, int mx, int my, float radius, float vage, float gravity, PluginInfo *info) { +- +- int i = fs->nbStars; +- float ro; +- int theta; +- +- if (fs->nbStars >= fs->maxStars) +- return; +- fs->nbStars++; +- +- fs->stars[i].x = mx; +- fs->stars[i].y = my; +- +- ro = radius * (float)goom_irand(info->gRandom,100) / 100.0f; +- ro *= (float)goom_irand(info->gRandom,100)/100.0f + 1.0f; +- theta = goom_irand(info->gRandom,256); +- +- fs->stars[i].vx = ro * cos256[theta]; +- fs->stars[i].vy = -0.2f + ro * sin256[theta]; +- +- fs->stars[i].ax = 0; +- fs->stars[i].ay = gravity; +- +- fs->stars[i].age = 0; +- if (vage < fs->min_age) +- vage=fs->min_age; +- fs->stars[i].vage = vage; +-} +- +- +-/** +- * Met a jour la position et vitesse d'une particule. +- */ +-static void updateStar (Star *s) { +- s->x+=s->vx; +- s->y+=s->vy; +- s->vx+=s->ax; +- s->vy+=s->ay; +- s->age+=s->vage; +-} +- +- +-/** +- * Ajoute de nouvelles particules au moment d'un evenement sonore. +- */ +-static void fs_sound_event_occured(VisualFX *_this, PluginInfo *info) { +- +- FSData *data = (FSData*)_this->fx_data; +- int i; +- +- int max = (int)((1.0f+info->sound.goomPower)*goom_irand(info->gRandom,150)) + 100; +- float radius = (1.0f+info->sound.goomPower) * (float)(goom_irand(info->gRandom,150)+50)/300; +- int mx; +- int my; +- float vage, gravity = 0.02f; +- +- switch (data->fx_mode) { +- case FIREWORKS_FX: +- { +- double dx,dy; +- do { +- mx = goom_irand(info->gRandom,info->screen.width); +- my = goom_irand(info->gRandom,info->screen.height); +- dx = (mx - info->screen.width/2); +- dy = (my - info->screen.height/2); +- } while (dx*dx + dy*dy < (info->screen.height/2)*(info->screen.height/2)); +- vage = data->max_age * (1.0f - info->sound.goomPower); +- } +- break; +- case RAIN_FX: +- mx = goom_irand(info->gRandom,info->screen.width); +- if (mx > info->screen.width/2) +- mx = info->screen.width; +- else +- mx = 0; +- my = -(info->screen.height/3)-goom_irand(info->gRandom,info->screen.width/3); +- radius *= 1.5; +- vage = 0.002f; +- break; +- case FOUNTAIN_FX: +- my = info->screen.height+2; +- vage = 0.001f; +- radius += 1.0f; +- mx = info->screen.width / 2; +- gravity = 0.04f; +- break; +- default: +- return; +- /* my = i R A N D (info->screen.height); vage = 0.01f; */ +- } +- +- radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */ +- max *= info->screen.height / 200.0f; +- +- if (info->sound.timeSinceLastBigGoom < 1) { +- radius *= 1.5; +- max *= 2; +- } +- for (i=0;ifx_data; +- +- /* Get the new parameters values */ +- data->min_age = 1.0f - (float)IVAL(data->min_age_p)/100.0f; +- data->max_age = 1.0f - (float)IVAL(data->max_age_p)/100.0f; +- FVAL(data->nbStars_p) = (float)data->nbStars / (float)data->maxStars; +- data->nbStars_p.change_listener(&data->nbStars_p); +- data->maxStars = IVAL(data->nbStars_limit_p); +- data->fx_mode = IVAL(data->fx_mode_p); +- +- /* look for events */ +- if (info->sound.timeSinceLastGoom < 1) { +- fs_sound_event_occured(_this, info); +- if (goom_irand(info->gRandom,20)==1) { +- IVAL(data->fx_mode_p) = goom_irand(info->gRandom,(LAST_FX*3)); +- data->fx_mode_p.change_listener(&data->fx_mode_p); +- } +- } +- +- /* update particules */ +- for (i=0;inbStars;++i) { +- updateStar(&data->stars[i]); +- +- /* dead particule */ +- if (data->stars[i].age>=NCOL) +- continue; +- +- /* choose the color of the particule */ +- col = colval[(int)data->stars[i].age]; +- +- /* draws the particule */ +- info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, +- (int)(data->stars[i].x-data->stars[i].vx*6), +- (int)(data->stars[i].y-data->stars[i].vy*6), +- col, +- (int)info->screen.width, (int)info->screen.height); +- info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, +- (int)(data->stars[i].x-data->stars[i].vx*2), +- (int)(data->stars[i].y-data->stars[i].vy*2), +- col, +- (int)info->screen.width, (int)info->screen.height); +- } +- +- /* look for dead particules */ +- for (i=0;inbStars;) { +- +- if ((data->stars[i].x > info->screen.width + 64) +- ||((data->stars[i].vy>=0)&&(data->stars[i].y - 16*data->stars[i].vy > info->screen.height)) +- ||(data->stars[i].x < -64) +- ||(data->stars[i].age>=NCOL)) { +- data->stars[i] = data->stars[data->nbStars-1]; +- data->nbStars--; +- } +- else ++i; +- } +-} +- +-VisualFX flying_star_create(void) { +- VisualFX vfx = { +- init: fs_init, +- free: fs_free, +- apply: fs_apply, +- fx_data: 0 +- }; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/gfontlib.c /src/gfontlib.c +--- /home/d4rk/goom2k4-0/src/gfontlib.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontlib.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,229 +0,0 @@ +-#include "goom_config.h" +-#include "gfontrle.h" +-#include "gfontlib.h" +-#include +-#include +- +-static Pixel ***font_chars; +-static int *font_width; +-static int *font_height; +-static Pixel ***small_font_chars; +-static int *small_font_width; +-static int *small_font_height; +- +-void gfont_load (void) { +- unsigned char *gfont; +- unsigned int i = 0, j = 0; +- unsigned int nba = 0; +- unsigned int current = 32; +- int *font_pos; +- /* decompress le rle */ +- +- +- +- gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); +- while (i>2)<<(ROUGE*8))| +- (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))| +- (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))| +- (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8)); +- } +- } +- } +- +- /* definir les lettres restantes */ +- +- for (i=0;i<256;i++) { +- if (font_chars[i]==0) { +- font_chars[i]=font_chars[42]; +- small_font_chars[i]=small_font_chars[42]; +- font_width[i]=font_width[42]; +- font_pos[i]=font_pos[42]; +- font_height[i]=font_height[42]; +- small_font_width[i]=small_font_width[42]; +- small_font_height[i]=small_font_height[42]; +- } +- } +- +- font_width [32] = (the_font.height / 2) - 1; +- small_font_width [32] = font_width [32]/2; +- font_chars [32] = 0; +- small_font_chars [32] = 0; +-} +- +-void goom_draw_text (Pixel * buf,int resolx,int resoly, +- int x, int y, +- const char *str, float charspace, int center) { +- float fx = (float) x; +- int fin = 0; +- +- Pixel ***cur_font_chars; +- int *cur_font_width; +- int *cur_font_height; +- +- if (resolx>320) +- { +- /* printf("use big\n"); */ +- cur_font_chars = font_chars; +- cur_font_width = font_width; +- cur_font_height = font_height; +- } +- else +- { +- /* printf ("use small\n"); */ +- cur_font_chars = small_font_chars; +- cur_font_width = small_font_width; +- cur_font_height = small_font_height; +- } +- +- if (cur_font_chars == NULL) +- return ; +- +- if (center) { +- unsigned char *tmp = (unsigned char*)str; +- float lg = -charspace; +- +- while (*tmp != '\0') +- lg += cur_font_width[*(tmp++)] + charspace; +- +- fx -= lg / 2; +- } +- +- while (!fin) { +- unsigned char c = *str; +- +- x = (int) fx; +- +- if (c == '\0') +- fin = 1; +- else if (cur_font_chars[c]==0) { +- fx += cur_font_width[c] + charspace; +- } +- else { +- int xx, yy; +- int xmin = x; +- int xmax = x + cur_font_width[c]; +- int ymin = y - cur_font_height[c]; +- int ymax = y; +- +- yy = ymin; +- +- if (xmin < 0) +- xmin = 0; +- +- if (xmin >= resolx - 1) +- return; +- +- if (xmax >= (int) resolx) +- xmax = resolx - 1; +- +- if (yy < 0) +- yy = 0; +- +- if (yy <= (int) resoly - 1) { +- if (ymax >= (int) resoly - 1) +- ymax = resoly - 1; +- +- for (; yy < ymax; yy++) +- for (xx = xmin; xx < xmax; xx++) +- { +- Pixel color = cur_font_chars[c][yy - ymin][xx - x]; +- Pixel transparency; +- transparency.val = color.val & A_CHANNEL; +- if (transparency.val) +- { +- if (transparency.val==A_CHANNEL) buf[yy * resolx + xx] = color; +- else +- { +- Pixel back = buf[yy * resolx + xx]; +- unsigned int a1 = color.channels.a; +- unsigned int a2 = 255 - a1; +- buf[yy * resolx + xx].channels.r = (unsigned char)((((unsigned int)color.channels.r * a1) + ((unsigned int)back.channels.r * a2)) >> 8); +- buf[yy * resolx + xx].channels.g = (unsigned char)((((unsigned int)color.channels.g * a1) + ((unsigned int)back.channels.g * a2)) >> 8); +- buf[yy * resolx + xx].channels.b = (unsigned char)((((unsigned int)color.channels.b * a1) + ((unsigned int)back.channels.b * a2)) >> 8); +- } +- } +- } +- } +- fx += cur_font_width[c] + charspace; +- } +- str++; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/gfontlib.h /src/gfontlib.h +--- /home/d4rk/goom2k4-0/src/gfontlib.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontlib.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,10 +0,0 @@ +-#ifndef _GFONTLIB_H +-#define _GFONTLIB_H +- +-#include "goom_graphic.h" +- +-void gfont_load (void); +-void goom_draw_text (Pixel * buf,int resolx,int resoly, int x, int y, +- const char *str, float chspace, int center); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/gfontrle.c /src/gfontrle.c +--- /home/d4rk/goom2k4-0/src/gfontrle.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontrle.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,2500 +0,0 @@ +-/* RGBA C-Source image dump (with zRLE compression) */ +- +-const struct { +- unsigned int width; +- unsigned int height; +- unsigned int bytes_per_pixel; +- unsigned int rle_size; +- unsigned char rle_pixel [49725]; +-} the_font = { +-1277, 21, 4, 49725, { +-121,17,164,255,121,17,164,255,121,17,164,255,121,17,164,255,0,8,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,28,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,121,17,164,255,121,17,164,255,0,56,121,17,164,0,1,121,17, +-164,255,121,17,164,255,13,4,17,0,1,13,4,17,0,1,13,4,17,0, +-1,16,5,22,0,13,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,25,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,33,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,1,13,4,17,0, +-1,13,4,17,0,1,16,5,22,0,61,16,5,22,0,1,14,4,19,0, +-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-25,8,6,3,57,10,8,5,85,9,7,4,76,0,12,8,6,3,54,9, +-8,4,96,9,7,4,85,0,12,8,6,3,57,9,8,4,96,9,7,4, +-85,0,24,8,6,3,57,11,8,4,85,9,7,4,79,0,12,8,6,3, +-51,10,8,5,85,8,6,3,85,0,40,8,6,3,57,11,8,4,85,8, +-6,3,85,0,32,8,6,3,57,10,8,5,85,9,7,4,85,0,28,5, +-4,2,14,8,6,3,85,9,7,4,85,0,24,8,6,3,74,9,7,4, +-113,8,6,3,167,8,6,3,139,9,7,4,85,5,4,2,14,0,36,8, +-6,3,57,9,8,4,110,9,7,4,85,0,24,5,4,2,20,9,7,4, +-85,9,8,4,85,0,16,9,8,4,57,9,8,4,85,6,5,3,48,0, +-255,0,29,5,4,2,17,8,6,3,85,9,7,4,82,0,20,5,4,2, +-3,8,6,3,85,9,7,4,93,8,6,3,153,8,6,3,161,8,6,3, +-110,9,8,4,85,8,6,3,85,6,5,3,31,0,32,5,4,2,3,8, +-6,3,85,10,8,5,85,10,7,5,85,0,36,5,4,2,57,8,6,3, +-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +-108,8,6,3,85,6,5,3,71,0,24,5,4,2,42,8,6,3,85,9, +-7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,108,8, +-6,3,85,6,5,3,71,0,48,5,4,2,3,8,6,3,85,9,8,4, +-85,9,7,4,74,0,16,8,6,3,42,9,7,4,85,8,6,3,85,9, +-7,4,85,8,6,3,125,8,6,3,170,7,6,4,170,9,7,4,170,12, +-9,7,170,19,14,10,170,19,13,10,142,8,6,5,28,0,16,5,4,2, +-51,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3, +-164,8,6,3,108,8,6,3,85,6,5,3,71,0,20,10,8,5,57,9, +-7,4,170,8,6,3,170,8,6,3,170,8,6,3,161,8,6,3,142,9, +-7,4,96,9,7,4,85,8,6,3,85,9,7,4,85,9,7,4,74,0, +-20,5,4,2,42,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3, +-170,8,6,3,164,8,6,3,108,8,6,3,85,6,5,3,76,0,24,8, +-6,5,82,10,8,7,133,12,9,7,170,15,11,8,170,15,11,8,170,15, +-11,8,170,13,10,8,170,10,8,7,161,10,8,7,85,6,5,5,28,0, +-96,8,6,3,74,9,8,4,85,8,6,3,57,0,68,7,6,4,28,9, +-7,4,85,9,7,4,85,5,4,2,17,0,40,5,4,2,42,8,6,3, +-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +-108,8,6,3,85,6,5,3,85,0,24,8,6,5,85,10,8,7,133,12, +-9,7,170,15,10,8,170,15,11,8,170,15,11,8,170,13,10,8,170,10, +-8,7,150,8,6,5,62,0,24,8,6,5,82,10,8,7,133,12,9,7, +-170,15,10,8,170,14,10,7,170,9,7,4,170,8,6,5,147,10,8,5, +-85,7,6,4,85,5,4,4,3,0,16,12,9,7,57,11,8,6,161,9, +-7,6,170,10,8,7,170,13,10,8,170,14,10,7,170,13,10,8,170,12, +-9,7,170,10,8,7,156,10,8,7,85,6,5,5,25,0,20,6,5,3, +-57,8,7,5,85,9,7,4,110,9,7,4,170,10,8,5,170,10,8,5, +-170,11,8,6,170,10,8,7,150,10,8,7,85,6,5,5,25,0,16,15, +-11,8,57,11,8,6,170,9,7,6,170,10,8,7,170,13,10,8,170,15, +-11,8,170,15,11,8,170,13,10,8,170,10,8,7,159,10,8,7,85,6, +-5,5,25,0,16,15,11,8,59,11,9,6,170,9,7,4,125,10,8,5, +-85,8,6,3,133,8,6,3,167,8,6,3,170,8,6,3,170,9,8,4, +-113,0,16,8,6,3,42,10,8,5,85,10,7,5,85,9,7,4,125,10, +-8,5,170,12,10,7,170,14,11,7,170,19,14,10,170,19,14,10,142,8, +-6,5,28,0,16,8,6,5,82,10,8,7,133,12,9,7,170,15,11,8, +-170,15,11,8,170,15,11,8,170,13,10,8,170,10,8,7,161,10,8,7, +-85,6,5,5,25,0,16,12,10,7,74,14,10,7,170,12,9,7,139,7, +-6,4,28,0,16,10,8,7,110,14,10,7,170,13,10,8,125,0,16,13, +-10,8,71,15,11,8,170,13,10,8,130,5,5,4,8,0,44,11,8,6, +-85,9,7,4,170,10,8,5,93,0,16,12,9,7,57,10,8,5,167,11, +-8,6,110,6,5,3,8,0,16,11,8,6,57,10,7,5,159,11,8,6, +-102,0,16,8,6,3,51,10,8,5,85,9,7,4,85,0,40,10,7,5, +-57,11,9,6,85,7,6,4,57,0,28,7,5,4,28,10,8,5,85,11, +-8,6,85,0,16,8,6,3,48,10,8,5,85,8,6,3,85,0,20,8, +-6,3,57,11,8,4,85,9,7,4,79,0,20,5,4,2,45,8,6,3, +-85,9,7,4,85,9,7,4,88,9,7,4,108,9,8,4,93,9,7,4, +-85,8,6,3,85,6,5,3,74,0,20,8,6,3,45,9,7,4,85,8, +-6,3,85,9,7,4,85,8,6,3,125,8,6,3,170,8,6,3,164,8, +-6,3,108,8,6,3,85,6,5,3,74,0,24,6,5,3,57,8,7,5, +-85,10,8,5,85,9,7,4,119,8,6,3,142,9,7,4,130,10,8,5, +-91,10,7,5,85,6,5,3,85,0,20,9,7,4,57,10,8,5,85,10, +-7,5,85,10,8,5,85,8,6,3,144,8,6,3,170,8,6,3,164,8, +-6,3,108,8,6,3,85,6,5,3,71,0,24,5,4,2,45,8,6,3, +-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,9,7,4, +-105,8,6,3,85,6,5,3,74,0,20,11,8,4,59,9,7,4,170,8, +-6,3,164,9,7,4,91,8,6,3,85,8,6,3,85,8,6,3,85,9, +-7,4,85,8,6,3,142,9,6,4,170,9,8,4,116,0,16,8,6,3, +-48,10,8,5,85,9,7,4,85,0,20,8,6,3,57,11,8,4,85,9, +-7,4,76,0,16,8,6,3,48,10,8,5,85,9,7,4,85,0,20,8, +-6,3,57,11,8,4,85,9,7,4,76,0,16,8,6,3,48,10,8,5, +-85,9,7,4,85,0,28,8,6,3,57,11,8,4,85,9,7,4,76,0, +-16,8,6,3,54,9,8,4,96,9,7,4,85,0,20,8,6,3,57,9, +-8,4,96,9,7,4,85,0,16,10,8,5,57,10,7,5,153,10,8,5, +-93,0,20,10,8,7,93,14,11,7,170,13,10,8,136,0,16,11,8,6, +-91,11,8,6,170,9,7,4,170,9,7,4,170,8,6,5,170,8,6,3, +-119,9,7,4,85,8,6,3,85,8,6,3,85,9,7,4,85,9,7,4, +-76,0,16,8,6,3,42,9,7,4,85,8,6,3,85,8,6,3,122,9, +-8,4,102,0,16,8,6,3,51,9,7,4,85,6,5,3,45,0,40,12, +-8,5,57,8,6,3,156,10,7,5,93,11,8,6,85,11,8,6,85,0, +-28,6,5,5,14,13,10,8,85,8,7,5,45,0,80,10,8,5,57,10, +-7,5,156,10,8,5,96,0,76,9,7,4,57,10,8,5,93,10,8,5, +-85,0,140,10,8,7,110,13,10,8,170,12,9,7,133,5,5,4,6,0, +-84,8,6,5,79,10,8,7,127,13,10,8,170,16,12,9,142,8,7,5, +-28,0,72,8,6,3,57,10,8,5,85,9,6,4,85,0,48,15,11,8, +-113,25,18,12,170,20,15,11,142,8,7,5,28,0,28,15,11,8,130,22, +-16,11,170,20,15,11,142,7,6,6,23,0,12,13,10,8,68,12,9,7, +-170,11,8,6,116,6,5,3,8,0,44,12,9,7,82,15,10,8,170,13, +-10,8,130,5,5,4,8,0,255,0,197,6,5,3,57,8,6,3,85,0, +-255,0,149,5,4,2,6,8,6,3,85,8,6,3,156,9,8,4,113,0, +-16,8,6,3,48,9,8,4,91,9,7,4,76,0,16,10,8,5,57,9, +-6,4,170,8,6,3,99,5,4,2,34,0,36,8,6,3,71,9,8,4, +-93,9,8,4,96,8,6,3,85,6,5,3,45,0,12,8,6,3,76,0, +-44,8,6,3,57,58,31,9,255,93,50,12,255,88,45,11,255,12,10,5, +-113,0,4,7,6,4,28,54,29,9,255,93,46,12,255,88,45,11,255,12, +-9,5,122,0,4,7,5,4,37,54,29,9,255,93,46,12,255,88,45,11, +-255,14,10,5,142,0,16,8,6,3,85,58,31,9,255,93,50,12,255,88, +-44,11,255,9,7,4,170,0,4,5,4,2,85,52,28,9,255,93,48,12, +-255,88,44,11,255,12,10,5,170,0,32,7,6,4,85,58,31,9,255,93, +-50,12,255,88,45,11,255,12,9,5,170,0,24,8,6,3,57,58,31,9, +-255,93,50,12,255,88,45,11,255,14,10,5,142,0,20,6,5,3,28,19, +-12,6,227,76,37,11,255,88,45,11,255,14,10,5,139,0,16,9,8,4, +-170,69,35,10,255,92,47,11,255,92,47,11,255,88,45,11,255,88,45,11, +-255,16,11,5,227,7,5,4,28,0,28,8,6,3,57,58,31,9,255,93, +-46,12,255,88,45,11,255,14,10,5,142,0,16,6,5,3,28,19,12,6, +-227,82,39,11,255,92,47,11,255,14,10,5,105,0,8,7,5,4,20,54, +-29,9,255,100,50,13,255,30,19,7,255,8,6,3,85,0,255,0,21,6, +-5,3,28,19,12,6,227,76,37,11,255,88,45,11,255,14,10,5,130,0, +-12,7,6,4,65,17,11,6,227,71,37,10,255,88,45,11,255,92,47,11, +-255,92,47,11,255,88,45,11,255,88,44,11,255,88,44,11,255,25,16,6, +-255,8,6,3,142,0,24,7,5,4,85,17,12,6,229,77,39,12,255,107, +-51,14,255,113,55,16,255,20,14,9,178,0,28,14,11,7,170,29,18,8, +-255,74,39,11,255,88,45,11,255,88,45,11,255,92,47,11,255,92,47,11, +-255,88,45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,5,4, +-23,0,12,9,7,4,170,26,17,6,255,74,39,11,255,88,45,11,255,88, +-45,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,44,11,255,41, +-24,8,255,12,9,5,227,6,5,3,28,0,36,6,5,3,85,16,11,5, +-227,71,37,10,255,88,45,11,255,88,44,11,255,12,10,5,113,0,8,8, +-6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,88,45,11,255,92, +-46,13,255,100,52,13,255,109,53,16,255,121,63,20,255,158,74,23,255,180, +-88,27,255,183,90,28,255,26,17,11,142,0,12,10,7,5,170,26,17,6, +-255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,255,92,47,11, +-255,88,45,11,255,88,45,11,255,41,24,8,255,12,9,5,227,6,5,3, +-28,0,8,7,6,4,8,61,32,10,255,102,51,13,255,92,46,13,255,92, +-46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,90,45,11,255,84, +-44,11,255,88,45,11,255,88,44,11,255,14,10,5,119,0,12,9,7,4, +-153,26,17,6,255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11, +-255,92,47,11,255,88,45,11,255,88,44,11,255,45,25,8,255,13,10,6, +-227,7,6,4,28,0,12,17,13,10,170,64,39,21,255,155,78,26,255,169, +-83,26,255,165,80,24,255,161,79,24,255,145,71,22,255,136,70,21,255,134, +-69,21,255,88,50,23,255,22,17,11,232,9,8,6,31,0,84,4,4,3, +-23,12,9,5,173,71,34,10,255,92,43,13,255,33,20,8,255,10,8,5, +-57,0,64,20,14,7,227,83,42,12,255,92,46,13,255,19,13,6,227,6, +-5,3,34,0,32,10,8,5,170,26,17,6,255,76,37,11,255,90,46,11, +-255,92,46,13,255,92,46,13,255,90,45,11,255,90,45,11,255,88,44,11, +-255,46,26,9,255,18,13,9,227,8,7,5,28,0,12,15,12,8,170,58, +-35,19,255,134,73,23,255,153,76,24,255,142,69,21,255,131,64,20,255,121, +-59,18,255,121,59,18,255,121,62,18,255,43,27,12,255,11,9,6,170,0, +-16,17,13,10,170,64,39,21,255,164,85,27,255,177,86,26,255,154,75,23, +-255,121,62,18,255,115,56,16,255,119,61,18,255,123,61,20,255,80,45,19, +-255,22,16,11,227,8,7,5,28,0,8,13,10,8,57,96,48,19,255,165, +-80,24,255,159,78,24,255,159,78,24,255,165,80,24,255,165,80,24,255,165, +-80,24,255,159,78,24,255,164,81,25,255,91,52,24,255,22,17,11,227,8, +-7,5,28,0,12,13,10,8,170,38,24,11,255,99,47,16,255,116,59,17, +-255,126,65,21,255,142,69,21,255,153,76,24,255,157,74,24,255,155,76,24, +-255,91,52,24,255,23,18,12,227,8,7,5,28,0,8,13,10,8,57,104, +-52,21,255,171,84,26,255,155,76,24,255,164,81,25,255,173,81,26,255,180, +-88,27,255,180,88,27,255,177,86,26,255,169,80,26,255,92,55,25,255,22, +-17,11,227,8,7,5,28,0,8,13,10,8,57,114,63,25,255,177,86,26, +-255,114,56,17,255,92,46,13,255,92,47,11,255,93,46,12,255,92,46,13, +-255,96,48,13,255,92,46,13,255,18,12,5,91,0,8,8,6,3,40,55, +-29,10,255,108,50,15,255,114,56,17,255,130,67,21,255,153,76,24,255,161, +-82,24,255,171,84,26,255,179,84,26,255,179,84,26,255,25,17,10,142,0, +-12,15,12,8,170,64,39,21,255,162,84,27,255,179,88,28,255,183,90,28, +-255,181,89,28,255,181,89,28,255,172,88,27,255,156,77,25,255,88,50,23, +-255,22,17,11,227,8,7,5,28,0,8,13,9,6,57,96,48,19,255,153, +-71,22,255,134,69,21,255,20,14,9,193,0,12,11,8,6,113,124,62,25, +-255,185,91,28,255,169,80,26,255,22,15,9,142,0,8,11,8,6,57,111, +-61,24,255,184,90,27,255,177,86,26,255,23,16,10,173,0,40,11,8,6, +-113,114,59,23,255,144,73,21,255,126,63,21,255,20,14,9,142,0,8,11, +-9,6,57,97,51,20,255,152,71,23,255,134,69,21,255,20,14,9,187,0, +-12,12,9,7,96,97,48,18,255,140,71,21,255,138,71,21,255,20,15,9, +-142,0,8,8,6,3,40,52,28,9,255,93,50,12,255,88,45,11,255,14, +-10,5,142,0,32,13,10,8,82,91,48,16,255,132,71,21,255,63,36,18, +-255,10,8,7,136,0,20,7,6,6,62,31,21,12,244,124,66,23,255,134, +-69,21,255,20,15,9,142,0,8,8,6,3,28,54,29,9,255,93,46,12, +-255,80,39,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +-50,12,255,88,44,11,255,14,10,5,116,0,12,9,7,4,153,26,17,6, +-255,74,39,11,255,88,45,11,255,88,45,11,255,88,45,11,255,88,45,11, +-255,88,44,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,4,4, +-17,0,8,8,6,3,34,54,29,9,255,92,43,11,255,88,44,11,255,88, +-45,11,255,92,43,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88, +-44,11,255,45,25,8,255,12,10,5,227,6,5,3,28,0,12,13,10,6, +-170,40,24,11,255,97,48,16,255,113,55,16,255,115,56,16,255,116,57,17, +-255,116,57,17,255,113,55,16,255,113,55,16,255,60,33,13,255,18,14,9, +-227,8,6,5,28,0,8,12,9,7,57,77,38,14,255,118,57,17,255,116, +-59,17,255,118,60,17,255,109,53,16,255,98,47,13,255,92,47,11,255,88, +-45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,6,5,3,28,0, +-12,10,8,5,170,28,18,7,255,76,37,11,255,90,45,11,255,92,46,13, +-255,94,45,13,255,94,45,13,255,92,46,13,255,92,46,13,255,46,26,9, +-255,13,10,6,227,6,5,5,28,0,8,7,6,4,8,61,32,10,255,100, +-50,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92, +-46,13,255,92,46,13,255,94,47,13,255,98,49,13,255,94,47,13,255,18, +-12,5,93,0,8,8,6,3,42,60,32,9,255,96,48,13,255,88,45,11, +-255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,50,12,255,88, +-44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,255,93,50,12, +-255,88,44,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +-50,12,255,88,44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9, +-255,93,50,12,255,88,44,11,255,14,10,5,142,0,20,8,6,3,57,58, +-31,9,255,93,50,12,255,88,44,11,255,12,10,5,113,0,8,7,6,4, +-28,54,29,9,255,93,50,12,255,88,45,11,255,14,10,5,142,0,12,8, +-7,3,57,60,31,9,255,96,48,13,255,92,46,13,255,14,10,5,127,0, +-8,10,8,5,57,82,42,15,255,135,66,20,255,121,60,20,255,20,15,9, +-176,0,12,11,9,6,108,107,56,22,255,172,84,25,255,158,74,23,255,22, +-15,9,142,0,8,11,8,6,54,98,51,19,255,142,72,21,255,136,70,21, +-255,138,71,21,255,121,59,18,255,100,52,13,255,90,46,11,255,88,44,11, +-255,88,44,11,255,88,44,11,255,88,45,11,255,12,10,5,113,0,8,8, +-6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,92,47,11,255,92, +-47,11,255,18,12,5,85,0,8,7,6,4,45,54,30,9,255,94,47,13, +-255,31,20,8,255,9,7,4,85,0,32,8,6,3,48,65,33,10,255,114, +-55,15,255,119,58,18,255,126,63,21,255,128,66,21,255,22,15,9,164,0, +-20,5,5,4,28,19,14,10,227,141,72,26,255,43,27,16,255,7,6,6, +-85,0,72,14,10,7,71,96,49,17,255,138,71,21,255,130,67,21,255,22, +-15,9,164,0,68,12,9,7,76,77,39,14,255,118,57,17,255,109,53,16, +-255,22,15,9,153,0,132,11,8,6,96,103,53,20,255,144,73,21,255,121, +-60,20,255,24,16,9,153,0,80,15,12,8,184,61,36,20,255,141,68,24, +-255,168,82,25,255,171,84,26,255,26,18,11,159,0,68,9,7,4,57,60, +-32,9,255,96,48,13,255,92,46,13,255,19,12,6,142,0,40,14,10,7, +-76,129,67,26,255,190,97,29,255,180,88,27,255,26,17,11,161,0,24,14, +-10,7,85,129,67,26,255,190,97,29,255,180,88,27,255,25,17,10,125,0, +-8,11,8,6,57,109,60,24,255,175,86,26,255,142,73,23,255,20,14,9, +-187,0,40,12,9,7,93,121,65,24,255,183,89,26,255,168,82,25,255,21, +-15,10,178,0,255,0,193,10,8,5,170,39,23,8,255,78,41,11,255,16, +-11,5,142,0,255,0,141,6,5,3,85,16,11,5,227,71,37,10,255,92, +-47,11,255,92,47,11,255,18,12,5,85,0,8,8,6,3,28,54,29,9, +-255,93,46,12,255,88,45,11,255,12,10,5,113,0,12,58,31,9,255,93, +-50,12,255,88,45,11,255,25,17,6,255,8,6,3,142,0,24,4,4,3, +-25,10,8,5,173,65,33,10,255,92,46,13,255,92,46,13,255,67,34,10, +-255,27,18,8,255,9,7,4,156,3,3,2,85,10,8,5,184,69,35,10, +-255,19,13,6,147,0,40,9,7,4,113,112,55,13,255,141,69,16,255,141, +-75,16,255,18,13,5,170,0,4,8,6,3,85,110,54,13,255,143,76,16, +-255,139,68,16,255,19,13,6,170,0,4,8,6,3,85,110,54,13,255,143, +-76,16,255,141,72,16,255,23,15,6,170,0,12,10,9,5,110,35,21,8, +-255,129,63,14,255,141,69,16,255,139,68,16,255,52,27,9,255,9,7,4, +-255,27,17,8,255,135,66,16,255,154,75,17,255,155,79,18,255,91,50,16, +-255,20,15,9,207,10,9,7,28,0,16,5,4,4,20,8,6,3,127,31, +-20,8,255,130,66,15,255,143,76,16,255,143,76,16,255,67,34,10,255,10, +-8,5,215,10,8,5,170,13,10,6,142,7,5,4,23,0,8,12,9,5, +-85,115,59,14,255,149,72,16,255,143,76,16,255,18,12,5,235,0,16,7, +-6,4,28,14,10,5,227,92,46,13,255,143,73,16,255,143,70,16,255,18, +-13,5,170,0,12,14,10,5,170,53,28,10,255,114,56,13,255,56,29,9, +-255,16,11,5,255,34,20,7,255,112,55,13,255,87,42,12,255,19,13,6, +-235,8,7,5,40,0,24,10,8,5,85,114,56,13,255,143,70,16,255,141, +-72,16,255,23,15,6,170,0,12,7,6,4,28,14,10,5,227,90,44,13, +-255,112,57,13,255,47,26,8,255,11,8,4,57,0,12,25,16,6,227,96, +-48,13,255,112,57,13,255,26,16,7,255,8,6,5,85,0,24,13,10,6, +-85,8,7,5,57,0,20,6,5,3,28,15,11,6,85,9,7,4,28,0, +-36,9,7,4,105,10,8,5,170,10,8,5,130,6,5,3,23,0,156,8, +-6,3,136,77,39,12,255,143,73,16,255,139,74,16,255,18,12,5,170,0, +-12,21,14,6,227,112,57,13,255,141,69,16,255,80,40,11,255,16,11,5, +-255,14,10,5,227,18,13,5,255,72,35,11,255,136,69,15,255,130,66,15, +-255,46,26,9,255,8,6,3,105,0,16,8,7,5,57,42,27,13,255,150, +-79,21,255,184,94,21,255,195,99,22,255,199,106,24,255,26,18,11,255,0, +-24,10,8,7,99,83,45,18,255,144,74,17,255,143,70,16,255,94,47,13, +-255,18,13,5,255,16,11,5,173,14,10,5,227,52,27,9,255,132,67,15, +-255,139,68,16,255,75,39,12,255,10,7,5,116,0,8,6,5,3,57,52, +-27,9,255,137,73,16,255,143,76,16,255,94,47,13,255,18,13,5,255,16, +-11,5,173,14,10,5,227,52,27,9,255,132,67,15,255,139,74,16,255,75, +-39,12,255,10,8,5,142,0,32,8,6,5,85,22,15,7,255,102,51,13, +-255,137,67,16,255,140,71,15,255,141,75,16,255,20,13,5,170,0,8,9, +-6,4,85,108,55,13,255,141,69,16,255,139,74,16,255,74,36,11,255,18, +-12,7,255,20,13,7,181,22,15,9,207,20,13,9,238,18,13,9,252,23, +-16,10,255,31,21,12,218,14,11,7,42,0,8,7,6,4,57,40,22,9, +-255,130,66,15,255,141,75,16,255,84,42,11,255,18,12,5,255,16,12,5, +-181,14,10,5,241,69,35,10,255,140,69,17,255,154,78,17,255,117,60,18, +-255,17,13,8,142,0,12,21,14,8,190,28,18,9,255,23,15,8,255,21, +-14,8,255,21,14,8,255,23,15,8,255,38,24,11,255,98,53,17,255,151, +-74,18,255,150,76,17,255,141,75,16,255,21,15,6,170,0,8,5,4,2, +-28,33,20,8,255,130,66,15,255,141,72,16,255,84,42,11,255,18,12,5, +-255,18,12,5,176,14,10,5,235,57,29,10,255,140,72,17,255,165,85,20, +-255,121,67,24,255,14,11,7,142,0,8,8,6,5,57,72,46,23,255,198, +-113,29,255,200,102,23,255,131,68,22,255,33,21,12,255,17,13,8,255,21, +-14,8,255,88,47,19,255,192,99,23,255,203,113,26,255,146,87,29,255,13, +-11,8,164,0,12,10,8,5,85,13,10,6,170,11,9,6,142,7,6,4, +-28,0,12,13,10,8,113,18,14,9,170,16,13,9,147,10,8,7,28,0, +-24,10,8,7,28,20,15,11,227,104,62,21,255,184,94,21,255,117,62,22, +-255,17,12,8,227,7,5,4,28,0,64,11,8,6,170,67,35,16,255,164, +-85,21,255,115,58,16,255,20,14,7,252,8,6,5,85,0,24,9,7,4, +-82,66,37,13,255,145,75,18,255,154,78,17,255,115,58,16,255,29,18,8, +-255,14,10,7,255,16,11,7,255,65,34,12,255,150,74,19,255,189,97,22, +-255,138,79,27,255,14,12,9,142,0,8,7,6,6,57,55,33,16,255,158, +-81,19,255,162,80,19,255,102,53,17,255,24,15,7,255,19,12,6,170,14, +-10,5,204,46,26,9,255,137,67,16,255,139,71,16,255,49,27,10,255,7, +-6,4,105,0,8,7,6,6,62,72,46,23,255,199,115,32,255,205,111,28, +-255,155,84,26,255,41,24,14,255,18,13,9,255,25,16,10,255,110,61,25, +-255,199,100,28,255,205,112,30,255,146,87,29,255,13,11,8,142,0,8,10, +-8,7,147,180,87,25,255,206,111,27,255,203,105,26,255,164,85,27,255,40, +-24,15,255,20,14,9,255,26,17,11,255,121,64,26,255,201,101,28,255,205, +-112,30,255,146,87,29,255,14,11,7,142,0,8,8,6,5,57,71,44,22, +-255,192,108,25,255,198,101,23,255,150,78,25,255,41,24,14,255,32,21,13, +-255,74,41,21,255,184,105,27,255,202,104,25,255,202,118,27,255,174,102,31, +-255,17,14,10,142,0,8,11,9,6,136,182,92,25,255,206,112,29,255,205, +-111,28,255,166,79,27,255,43,25,16,255,21,15,10,255,29,19,12,255,116, +-67,27,255,202,107,31,255,206,113,31,255,146,87,29,255,12,10,7,142,0, +-8,11,8,6,144,185,93,26,255,202,103,23,255,157,77,18,255,83,42,12, +-255,19,13,6,255,13,10,6,255,20,13,7,255,27,17,8,255,28,18,9, +-227,10,8,5,45,0,8,11,9,6,142,139,73,20,255,198,96,21,255,199, +-106,24,255,155,78,26,255,41,25,14,255,21,15,10,255,28,18,11,255,38, +-24,15,255,40,24,15,227,14,10,7,62,0,8,8,7,5,57,65,41,20, +-255,197,108,28,255,205,111,28,255,170,88,27,255,43,27,16,255,19,14,10, +-255,29,19,12,255,123,66,24,255,181,84,20,255,170,87,19,255,114,60,17, +-255,11,10,6,142,0,8,11,9,6,85,119,60,15,255,154,75,17,255,154, +-78,17,255,18,13,7,255,0,12,13,10,8,170,191,102,30,255,209,118,30, +-255,207,113,30,255,28,19,11,201,0,8,13,10,8,105,166,87,23,255,198, +-101,23,255,198,97,23,255,26,18,11,255,0,40,13,10,8,170,189,100,28, +-255,206,111,27,255,204,102,27,255,28,20,11,201,0,8,12,10,7,116,184, +-93,27,255,206,107,27,255,203,113,26,255,23,17,10,255,0,8,6,5,5, +-28,25,18,12,244,192,105,27,255,206,112,29,255,207,117,30,255,32,22,13, +-170,0,8,11,9,6,88,112,57,13,255,143,70,16,255,141,69,16,255,17, +-12,6,227,0,32,14,11,9,170,184,92,25,255,206,111,27,255,192,111,31, +-255,49,33,18,255,10,8,7,122,0,12,7,7,6,59,22,16,11,232,167, +-100,28,255,205,112,30,255,205,116,30,255,26,18,11,210,0,8,8,7,3, +-85,110,54,13,255,141,69,16,255,141,75,16,255,25,16,6,255,5,4,4, +-40,0,8,10,8,5,85,112,55,13,255,141,75,16,255,141,75,16,255,20, +-13,5,170,0,8,5,4,2,28,33,20,8,255,130,66,15,255,141,72,16, +-255,112,55,13,255,45,25,8,255,26,17,6,255,33,20,8,255,94,47,13, +-255,141,69,16,255,144,71,17,255,80,40,13,255,9,7,4,125,0,8,10, +-8,5,85,112,57,13,255,148,79,17,255,141,75,16,255,87,42,12,255,19, +-13,6,255,14,10,5,215,15,10,6,255,60,31,11,255,143,71,18,255,160, +-82,19,255,96,54,17,255,12,9,7,142,0,8,8,6,5,57,71,44,22, +-255,192,100,25,255,199,106,24,255,185,93,26,255,91,50,22,255,58,33,17, +-255,72,41,19,255,158,81,25,255,199,106,24,255,199,106,24,255,138,79,27, +-255,13,11,8,142,0,8,10,8,7,147,166,87,23,255,203,108,24,255,202, +-108,25,255,153,77,26,255,38,22,13,255,15,11,6,255,14,10,5,255,52, +-28,9,255,132,70,15,255,141,75,16,255,80,41,13,255,10,8,5,139,0, +-8,7,6,6,57,48,29,13,255,154,79,19,255,160,85,19,255,108,56,17, +-255,30,18,9,255,16,11,7,255,24,15,9,255,96,51,17,255,167,86,20, +-255,181,88,20,255,140,75,23,255,18,14,9,144,0,12,22,14,7,193,22, +-13,7,255,20,13,7,255,78,40,15,255,165,81,20,255,177,90,20,255,177, +-90,20,255,115,58,20,255,32,20,11,255,24,15,9,255,30,19,9,227,11, +-8,6,54,0,8,11,9,6,142,139,68,20,255,166,78,19,255,144,71,17, +-255,19,12,6,215,0,12,9,7,4,136,114,56,13,255,143,70,16,255,139, +-68,16,255,19,13,6,170,0,8,10,7,5,85,112,55,13,255,143,70,16, +-255,139,74,16,255,17,11,6,221,0,12,9,7,4,136,114,56,13,255,143, +-70,16,255,141,75,16,255,20,13,5,170,0,8,9,6,4,85,110,54,13, +-255,141,69,16,255,141,72,16,255,17,11,6,221,0,20,9,7,4,136,114, +-56,13,255,143,73,16,255,139,74,16,255,19,13,6,170,0,8,8,6,3, +-85,110,54,13,255,143,76,16,255,141,69,16,255,18,12,5,252,0,12,11, +-9,6,170,131,69,18,255,170,87,19,255,168,86,19,255,28,19,9,170,0, +-8,11,8,6,85,145,74,26,255,204,102,27,255,203,105,26,255,52,33,17, +-255,6,5,5,57,0,8,17,14,10,227,190,107,25,255,204,113,25,255,174, +-86,27,255,18,13,9,170,0,12,28,18,11,198,37,23,14,255,32,21,13, +-255,21,15,10,255,20,14,9,255,38,23,11,255,87,44,12,255,137,70,16, +-255,141,72,16,255,143,70,16,255,141,72,16,255,18,12,5,170,0,8,9, +-6,4,85,110,54,13,255,145,74,16,255,141,69,16,255,94,47,13,255,27, +-17,8,227,12,8,5,28,0,8,14,10,7,85,121,62,18,255,172,87,19, +-255,139,69,18,255,20,15,9,227,0,36,21,14,8,227,117,61,24,255,199, +-100,28,255,205,106,26,255,204,110,27,255,26,18,11,255,0,16,8,7,5, +-28,20,15,11,227,135,73,22,255,192,97,21,255,165,83,22,255,33,22,12, +-255,10,9,7,85,0,68,11,9,6,170,184,97,27,255,206,112,29,255,204, +-110,27,255,28,19,11,255,0,68,14,11,7,170,179,93,24,255,202,103,23, +-255,198,97,23,255,22,15,9,255,0,132,9,7,6,170,125,63,18,255,158, +-77,17,255,146,75,17,255,17,12,6,255,0,76,8,6,5,76,72,46,23, +-255,197,108,28,255,201,107,24,255,164,85,27,255,37,22,14,227,13,9,6, +-48,0,68,12,9,7,170,138,67,19,255,170,79,19,255,168,86,19,255,20, +-14,9,255,0,40,8,7,5,20,21,15,10,184,26,17,11,255,26,17,11, +-215,12,9,7,74,0,24,8,7,5,20,21,15,10,184,26,17,11,255,31, +-21,12,207,18,13,9,28,0,8,11,9,8,156,184,93,27,255,208,105,29, +-255,205,111,28,255,28,19,11,255,0,40,14,11,7,170,184,92,25,255,203, +-104,24,255,200,98,23,255,26,18,11,255,0,255,0,189,8,7,5,57,51, +-29,12,255,152,75,19,255,162,86,19,255,19,13,8,246,0,255,0,137,6, +-5,3,28,19,13,6,249,92,46,13,255,123,63,14,255,78,39,11,255,21, +-15,6,227,9,8,4,28,0,8,9,8,4,85,110,59,13,255,141,69,16, +-255,141,75,16,255,21,14,6,170,0,12,16,11,5,170,52,28,9,255,115, +-59,14,255,116,60,15,255,43,26,10,255,9,7,6,125,0,16,8,7,5, +-28,21,17,10,227,109,59,18,255,160,82,19,255,121,64,18,255,62,34,13, +-255,94,53,17,255,149,78,20,255,102,54,19,255,32,22,11,255,72,39,15, +-255,121,62,18,255,24,17,9,187,0,40,8,6,3,167,128,66,15,255,161, +-85,17,255,159,81,18,255,24,15,7,178,0,4,6,5,3,37,48,28,11, +-255,173,92,20,255,181,96,20,255,21,15,8,221,0,4,6,5,3,28,40, +-24,9,255,143,74,18,255,158,80,17,255,21,15,6,181,0,8,10,8,5, +-54,107,51,14,255,157,83,18,255,164,84,19,255,176,89,19,255,189,92,20, +-255,191,98,22,255,190,106,23,255,197,110,26,255,203,108,24,255,203,117,24, +-255,205,119,26,255,207,122,30,255,199,118,32,255,32,23,13,170,0,12,7, +-6,4,85,22,15,7,232,113,54,14,255,146,75,17,255,158,80,17,255,154, +-78,17,255,158,80,17,255,148,76,17,255,139,71,16,255,135,66,16,255,135, +-66,16,255,21,14,6,136,0,8,10,8,5,85,128,66,15,255,161,85,17, +-255,158,80,17,255,25,16,6,204,0,12,7,6,4,28,25,16,8,227,102, +-50,15,255,148,76,17,255,142,73,17,255,84,45,13,255,10,8,5,113,0, +-8,9,7,4,82,107,53,14,255,146,75,17,255,84,41,13,255,8,7,5, +-198,3,2,2,23,5,4,4,136,38,23,9,255,136,70,17,255,140,72,17, +-255,21,15,6,178,0,24,7,6,4,57,45,26,10,255,143,74,18,255,158, +-80,17,255,26,17,6,170,0,12,24,16,7,227,115,58,16,255,148,76,17, +-255,46,26,9,255,7,6,4,156,0,16,5,4,4,71,19,13,6,255,139, +-71,16,255,140,72,17,255,43,26,10,255,9,8,4,85,0,16,14,10,5, +-85,109,52,14,255,38,23,9,255,6,5,3,85,0,12,4,4,3,28,15, +-12,6,227,115,56,16,255,29,19,8,170,0,32,13,10,6,113,122,64,21, +-255,164,85,21,255,138,71,17,255,21,15,6,161,0,156,13,10,6,227,137, +-67,16,255,154,75,17,255,84,45,13,255,10,8,5,116,0,8,9,7,4, +-85,111,55,14,255,158,87,17,255,158,80,17,255,19,13,6,255,4,4,3, +-28,0,4,3,3,2,113,17,12,6,255,139,71,16,255,161,85,17,255,146, +-75,17,255,20,14,7,210,0,16,16,13,9,110,184,105,27,255,209,123,30, +-255,210,124,31,255,208,123,31,255,207,122,30,255,27,20,12,255,0,24,13, +-11,8,147,143,75,20,255,161,85,17,255,158,80,17,255,27,18,8,227,5, +-4,2,28,0,8,10,7,5,198,131,65,16,255,161,85,17,255,150,76,17, +-255,21,14,6,170,0,8,10,8,5,85,123,61,16,255,163,83,18,255,158, +-80,17,255,27,18,8,227,5,4,2,28,0,8,9,7,4,198,130,66,15, +-255,163,83,18,255,148,76,17,255,21,14,6,193,0,28,7,6,4,85,22, +-15,7,255,131,65,16,255,154,78,17,255,154,78,17,255,154,78,17,255,154, +-78,17,255,21,15,6,170,0,8,10,8,5,85,129,64,16,255,163,86,18, +-255,180,91,19,255,29,20,10,255,3,3,2,93,0,36,10,8,5,122,121, +-60,16,255,161,85,17,255,159,81,18,255,24,15,7,255,4,4,3,34,0, +-4,2,2,1,6,17,13,8,181,181,93,22,255,203,108,24,255,205,114,26, +-255,32,23,13,210,0,36,5,4,4,161,30,22,13,255,198,116,29,255,206, +-106,25,255,191,96,20,255,26,17,7,170,0,8,9,7,4,85,116,60,15, +-255,161,85,17,255,158,80,17,255,21,14,6,255,5,4,2,28,0,4,2, +-2,1,3,12,9,7,215,190,107,25,255,211,124,30,255,208,134,37,255,32, +-22,13,178,0,8,13,11,8,96,187,112,32,255,209,123,30,255,191,96,20, +-255,28,19,9,255,4,3,3,74,0,4,3,2,2,28,13,10,8,227,196, +-120,31,255,211,124,30,255,199,106,24,255,27,19,10,170,0,8,13,10,6, +-57,114,61,19,255,178,91,21,255,182,102,23,255,23,17,10,173,0,8,11, +-9,6,91,146,85,25,255,198,113,29,255,196,120,31,255,27,20,12,207,0, +-20,5,5,4,28,21,17,12,227,190,118,33,255,209,131,40,255,161,100,34, +-255,17,14,10,227,5,5,4,28,0,72,9,8,6,170,91,59,28,255,189, +-94,24,255,162,83,19,255,39,25,12,255,7,7,6,85,0,20,13,11,8, +-142,183,103,24,255,203,112,24,255,203,112,24,255,42,26,13,249,5,4,4, +-62,0,4,3,2,2,25,12,9,7,227,195,115,30,255,212,127,35,255,211, +-132,38,255,32,22,13,181,0,8,12,10,7,85,124,65,17,255,161,85,17, +-255,159,78,18,255,21,14,6,255,5,4,2,28,0,8,7,6,4,224,133, +-68,16,255,159,81,18,255,146,72,17,255,22,14,7,170,0,8,13,11,8, +-91,185,111,32,255,210,125,33,255,205,114,26,255,37,26,14,255,4,4,3, +-85,0,4,4,4,4,28,13,10,8,227,193,105,26,255,206,111,27,255,202, +-118,27,255,32,22,13,170,0,8,11,9,6,127,174,91,23,255,202,102,21, +-255,200,105,21,255,36,23,13,255,4,4,3,85,0,4,3,3,2,28,13, +-11,8,227,198,118,33,255,212,127,35,255,208,128,33,255,31,22,12,181,0, +-8,13,11,8,91,185,114,30,255,211,124,30,255,208,122,29,255,34,24,13, +-255,4,4,3,85,0,4,7,6,6,113,32,24,13,255,185,95,22,255,202, +-98,21,255,198,97,23,255,33,22,12,170,0,8,10,8,7,156,190,108,27, +-255,212,126,33,255,211,127,36,255,40,26,15,255,4,4,3,85,0,4,3, +-3,2,28,13,11,8,227,198,118,33,255,214,129,37,255,211,132,38,255,32, +-23,13,173,0,8,10,8,7,144,167,87,22,255,185,94,20,255,165,87,18, +-255,25,17,8,255,3,3,2,57,0,28,13,11,8,170,195,112,30,255,210, +-125,33,255,208,117,29,255,39,26,14,255,4,4,3,85,0,28,12,10,7, +-150,184,108,27,255,211,124,30,255,211,127,36,255,40,27,15,255,4,4,3, +-85,0,4,3,3,2,28,17,13,8,178,138,71,17,255,161,85,17,255,155, +-79,18,255,21,14,6,170,0,8,10,8,5,85,124,61,15,255,169,89,18, +-255,180,91,19,255,25,18,10,255,0,12,13,11,8,170,196,113,31,255,211, +-124,30,255,205,119,26,255,26,18,11,204,0,8,11,9,6,88,134,70,19, +-255,173,87,18,255,168,86,19,255,20,13,7,255,0,40,13,11,8,170,196, +-113,31,255,210,125,33,255,207,122,30,255,24,18,11,212,0,8,11,9,6, +-119,180,93,23,255,203,108,24,255,202,103,23,255,20,15,9,255,0,8,15, +-13,10,195,101,63,26,255,202,117,25,255,206,128,35,255,160,106,35,255,15, +-13,10,142,0,8,10,8,5,147,139,70,20,255,191,96,20,255,200,105,21, +-255,25,18,10,255,0,32,13,10,8,170,189,99,26,255,206,115,27,255,205, +-106,26,255,185,106,28,255,79,52,26,255,10,9,7,122,0,4,7,6,6, +-42,36,27,17,244,172,106,35,255,207,128,34,255,211,126,34,255,211,127,36, +-255,24,18,11,227,0,8,10,8,5,85,124,64,15,255,159,81,18,255,158, +-80,17,255,76,40,13,255,11,8,6,210,0,8,12,9,5,85,129,64,16, +-255,161,85,17,255,158,80,17,255,26,16,7,170,0,8,9,7,4,85,115, +-56,16,255,161,85,17,255,159,81,18,255,49,27,10,255,7,6,4,170,5, +-4,4,85,6,5,3,113,26,19,11,255,185,95,22,255,202,102,21,255,197, +-104,22,255,28,20,11,173,0,8,13,10,6,102,167,87,22,255,200,101,21, +-255,201,102,22,255,32,21,11,255,4,3,3,65,0,4,2,2,1,17,12, +-10,7,221,190,98,23,255,208,116,27,255,204,110,27,255,30,21,11,181,0, +-8,13,11,8,91,185,114,30,255,211,124,30,255,209,123,30,255,86,55,25, +-255,9,8,6,187,6,6,5,85,7,6,6,130,32,24,15,255,200,122,31, +-255,209,123,30,255,206,122,31,255,32,23,13,173,0,8,10,8,7,144,191, +-113,30,255,212,127,35,255,210,126,35,255,40,27,15,255,4,4,3,85,0, +-4,2,2,1,8,11,9,6,212,157,81,20,255,189,92,20,255,190,97,21, +-255,27,19,10,178,0,8,12,10,7,96,183,105,28,255,209,123,30,255,205, +-114,26,255,36,24,13,255,4,4,3,85,0,4,4,4,4,28,18,14,9, +-187,195,115,30,255,211,124,30,255,210,130,35,255,35,26,14,210,0,20,3, +-2,2,28,12,10,7,227,195,115,30,255,211,124,30,255,209,123,30,255,38, +-25,15,255,4,4,3,85,0,20,13,11,8,170,194,115,31,255,209,122,28, +-255,196,99,21,255,21,15,8,255,0,12,11,9,6,170,153,79,20,255,187, +-91,20,255,181,96,20,255,30,20,9,178,0,8,13,10,6,96,151,79,20, +-255,187,91,20,255,181,96,20,255,22,16,9,255,0,12,12,9,7,170,146, +-76,19,255,167,88,18,255,158,77,17,255,23,15,6,170,0,8,10,8,5, +-85,133,66,16,255,167,88,18,255,168,86,19,255,22,16,9,255,0,20,12, +-9,7,170,155,80,20,255,185,94,20,255,181,96,20,255,22,16,9,221,0, +-8,6,6,5,42,51,29,12,255,150,81,19,255,165,87,18,255,42,26,11, +-255,5,5,4,108,0,4,5,5,4,28,18,15,11,255,195,114,28,255,207, +-123,32,255,158,94,31,255,17,13,10,142,0,8,6,5,5,57,50,34,19, +-255,191,111,32,255,208,117,29,255,113,73,30,255,10,10,9,227,6,6,5, +-125,7,7,6,198,42,29,17,255,187,96,22,255,166,87,23,255,42,27,15, +-255,8,6,5,110,0,32,5,5,4,184,21,16,8,255,106,54,15,255,154, +-78,17,255,151,77,18,255,92,48,15,255,11,9,6,119,0,8,10,8,5, +-93,131,69,18,255,189,92,20,255,200,105,21,255,33,22,12,255,5,4,4, +-54,0,12,9,8,6,85,76,53,25,255,200,118,31,255,204,114,27,255,65, +-43,22,255,6,6,5,113,0,32,4,3,3,17,14,11,9,227,195,111,28, +-255,206,115,27,255,204,105,25,255,24,17,11,255,0,12,5,5,4,28,13, +-10,6,227,125,66,18,255,165,84,18,255,161,85,17,255,161,85,17,255,155, +-79,18,255,28,19,9,255,6,5,3,85,0,64,11,9,8,68,86,56,27, +-255,204,126,33,255,210,125,33,255,30,21,13,255,0,68,13,11,8,170,195, +-115,30,255,209,123,30,255,207,122,30,255,27,19,12,255,3,3,2,28,0, +-128,7,6,4,184,131,65,16,255,161,85,17,255,154,78,17,255,15,11,6, +-249,0,76,10,8,7,173,166,87,23,255,198,104,21,255,196,99,21,255,35, +-23,12,255,3,3,2,85,0,72,13,11,8,170,194,115,31,255,211,124,30, +-255,207,122,30,255,27,19,12,255,3,3,2,28,0,108,13,11,8,170,196, +-113,31,255,213,132,36,255,211,127,36,255,30,21,13,255,0,40,11,9,6, +-170,155,80,20,255,185,94,20,255,180,91,19,255,21,15,8,255,0,255,0, +-189,10,8,7,184,183,100,26,255,208,116,27,255,204,114,27,255,26,18,11, +-255,4,4,4,28,0,255,0,133,10,8,5,127,119,60,15,255,160,85,19, +-255,91,48,16,255,10,8,5,227,4,4,3,28,0,12,9,7,4,161,131, +-67,16,255,159,81,18,255,159,78,18,255,18,13,7,249,0,16,7,6,4, +-170,57,34,14,255,176,90,21,255,195,95,22,255,26,19,11,232,0,16,17, +-14,10,99,179,106,28,255,207,122,30,255,180,109,33,255,25,20,12,255,7, +-6,6,170,20,17,11,255,196,114,27,255,208,117,29,255,203,124,30,255,172, +-106,35,255,53,36,20,255,10,9,7,108,0,40,9,8,6,170,159,82,20, +-255,202,103,23,255,206,111,27,255,22,17,11,255,0,8,10,9,7,139,115, +-74,30,255,213,133,48,255,39,28,16,255,0,8,9,8,4,113,67,39,14, +-255,181,92,20,255,24,18,9,255,0,12,28,19,9,227,139,79,26,255,206, +-117,31,255,212,123,37,255,214,126,41,255,172,106,35,255,53,34,18,255,122, +-78,31,255,211,127,44,255,217,136,50,255,216,135,49,255,190,122,41,255,65, +-43,22,255,14,11,7,85,0,8,7,6,4,28,29,21,10,249,153,79,20, +-255,174,85,19,255,103,53,16,255,17,12,6,244,19,13,6,170,21,14,6, +-170,27,17,6,170,21,14,6,212,21,14,6,255,25,17,6,224,12,9,5, +-45,0,12,24,16,7,153,22,15,7,255,26,16,7,210,12,9,5,40,0, +-8,8,7,5,28,17,13,8,227,114,61,19,255,174,85,19,255,154,79,19, +-255,60,33,13,255,11,9,6,170,0,12,10,8,5,170,146,79,19,255,180, +-87,19,255,67,39,14,255,8,6,5,85,0,8,24,17,9,255,143,75,20, +-255,162,80,19,255,22,15,7,215,0,28,8,7,5,110,60,33,13,255,166, +-78,19,255,22,15,7,227,0,8,7,6,4,85,91,51,16,255,174,88,19, +-255,169,78,18,255,25,17,8,255,3,3,2,8,0,20,11,9,6,178,143, +-74,18,255,177,89,18,255,138,75,19,255,18,13,7,176,0,16,9,7,4, +-28,29,19,8,232,41,25,10,255,17,13,8,255,9,8,6,116,0,4,7, +-6,4,59,14,11,7,227,32,21,9,255,40,24,9,255,12,9,5,105,0, +-32,14,11,9,170,199,124,36,255,213,119,36,255,202,102,21,255,20,14,7, +-246,0,152,8,7,5,142,53,31,12,255,162,86,19,255,121,64,18,255,19, +-14,8,252,6,5,3,28,0,8,10,8,5,125,142,74,19,255,180,91,19, +-255,183,89,19,255,19,14,8,255,0,4,5,5,4,6,15,13,10,193,69, +-42,18,255,171,91,20,255,189,88,20,255,200,101,21,255,31,21,12,255,0, +-16,10,8,7,28,30,21,13,227,150,92,35,255,208,121,37,255,211,115,30, +-255,208,117,29,255,28,21,13,255,0,24,10,8,7,28,22,15,7,198,26, +-17,7,255,24,15,7,221,9,7,4,57,0,12,8,7,5,156,171,89,22, +-255,202,107,23,255,202,103,23,255,23,18,10,249,0,12,26,18,9,198,29, +-19,8,255,24,16,7,215,10,8,5,51,0,12,10,8,5,85,134,70,19, +-255,175,88,18,255,173,87,18,255,20,14,7,255,0,24,10,8,5,85,26, +-19,9,255,107,58,18,255,154,83,19,255,168,79,19,255,169,78,18,255,173, +-87,18,255,172,80,19,255,26,17,7,170,0,8,11,10,8,136,189,99,26, +-255,210,115,31,255,216,129,45,255,143,96,40,255,15,13,10,227,12,12,11, +-170,15,13,12,170,13,12,10,170,13,12,10,136,9,8,8,85,0,16,11, +-9,6,170,169,91,22,255,202,103,23,255,203,108,24,255,18,15,9,255,0, +-12,6,5,5,23,28,19,11,156,31,22,12,255,34,24,13,227,14,11,7, +-85,0,36,9,8,8,142,72,54,31,255,215,147,60,255,218,146,61,255,174, +-100,35,255,14,11,7,142,0,8,11,8,6,102,142,74,19,255,185,86,20, +-255,195,98,20,255,18,14,9,249,0,12,10,8,7,170,202,131,47,255,220, +-152,63,255,220,151,61,255,22,19,13,252,0,8,11,9,8,167,203,135,46, +-255,217,139,48,255,210,120,33,255,18,14,9,255,0,12,9,8,6,170,198, +-117,37,255,211,115,30,255,202,102,21,255,34,22,11,176,0,8,13,11,8, +-170,202,122,37,255,218,144,49,255,217,144,50,255,28,21,13,255,0,8,12, +-11,9,170,204,122,41,255,217,135,46,255,215,136,42,255,46,33,19,255,0, +-16,10,9,7,28,21,19,14,227,153,104,46,255,214,149,55,255,158,103,39, +-255,16,14,11,221,7,6,6,28,0,20,20,18,13,142,31,26,18,170,25, +-21,16,170,24,20,15,170,24,20,15,170,24,20,15,170,24,21,15,170,31, +-26,18,170,25,21,16,170,14,12,9,31,0,20,10,9,7,167,75,51,26, +-255,202,117,33,255,186,120,43,255,41,32,20,255,12,11,9,85,0,16,11, +-9,8,28,31,22,12,215,49,33,18,255,41,27,16,227,12,10,7,85,0, +-12,14,12,9,170,204,137,51,255,220,152,63,255,220,151,61,255,23,19,12, +-252,0,8,11,10,6,85,136,70,17,255,175,88,18,255,169,78,18,255,15, +-11,6,255,0,8,9,8,6,85,26,19,9,255,153,82,18,255,177,89,18, +-255,180,84,19,255,24,17,9,218,0,8,11,9,8,147,196,115,35,255,215, +-125,38,255,214,125,39,255,20,16,11,255,0,12,9,8,6,159,165,86,22, +-255,197,99,20,255,195,90,20,255,32,21,11,170,0,8,12,10,7,85,145, +-76,20,255,189,92,20,255,191,96,20,255,18,14,9,255,0,12,9,8,6, +-170,199,126,39,255,217,133,50,255,217,144,50,255,23,18,12,252,0,8,11, +-10,8,142,191,105,28,255,206,111,27,255,203,104,24,255,19,15,10,255,0, +-12,9,8,6,57,21,15,8,198,28,19,9,255,32,21,11,227,11,9,6, +-76,0,8,11,9,8,170,203,125,42,255,220,146,59,255,219,146,60,255,24, +-19,13,255,0,12,11,10,8,170,204,136,47,255,220,146,59,255,218,147,55, +-255,25,19,12,232,0,8,11,10,8,119,161,87,22,255,195,98,20,255,202, +-103,23,255,18,15,9,255,0,32,14,12,9,170,200,125,37,255,214,124,37, +-255,205,106,26,255,20,16,9,221,0,32,16,13,9,170,205,130,42,255,219, +-144,56,255,219,146,60,255,24,19,13,255,0,12,6,5,3,23,21,14,6, +-170,26,16,7,255,26,17,7,224,14,10,5,31,0,8,11,9,6,125,170, +-89,23,255,211,115,30,255,214,126,41,255,23,19,12,255,0,12,11,10,8, +-170,195,112,30,255,206,106,25,255,200,105,21,255,29,20,10,170,0,8,11, +-9,6,85,134,70,19,255,177,85,18,255,172,80,19,255,18,13,7,255,0, +-40,14,12,9,170,195,112,30,255,206,111,27,255,202,103,23,255,31,22,10, +-170,0,8,13,10,6,85,151,79,20,255,189,92,20,255,183,89,19,255,17, +-13,8,255,0,4,8,7,5,59,57,34,16,255,184,97,27,255,198,115,33, +-255,114,77,33,255,16,14,11,210,6,5,5,8,0,8,12,10,7,170,195, +-113,32,255,215,123,42,255,217,133,50,255,32,24,15,255,0,32,12,11,7, +-170,175,90,22,255,198,104,21,255,189,92,20,255,192,97,21,255,189,97,22, +-255,45,29,14,255,10,9,7,210,22,17,11,255,183,102,30,255,212,121,41, +-255,216,135,49,255,217,137,52,255,214,125,39,255,29,21,12,204,0,8,11, +-9,6,85,143,75,20,255,193,97,20,255,195,98,20,255,180,93,23,255,88, +-54,23,255,11,10,8,113,0,4,14,12,7,85,170,89,23,255,202,103,23, +-255,202,102,21,255,32,22,11,178,0,8,12,10,7,113,176,91,23,255,205, +-105,24,255,209,117,28,255,39,28,16,255,5,5,5,28,0,8,15,14,10, +-198,206,132,45,255,217,133,50,255,215,133,44,255,25,19,12,232,0,8,11, +-10,8,125,198,118,39,255,218,145,51,255,218,146,53,255,20,17,11,255,0, +-12,9,8,6,170,198,124,37,255,216,134,45,255,214,139,41,255,22,18,11, +-255,0,8,11,10,8,136,191,105,28,255,206,111,27,255,206,106,25,255,36, +-26,15,255,5,5,4,28,0,8,15,13,10,198,192,105,27,255,206,106,25, +-255,204,105,25,255,23,17,10,232,0,8,12,10,7,125,196,119,37,255,218, +-141,51,255,218,139,55,255,20,16,11,255,0,12,9,8,6,170,196,110,33, +-255,215,126,40,255,214,125,39,255,23,18,12,252,0,8,11,9,8,167,201, +-123,40,255,217,133,50,255,214,136,43,255,20,16,11,255,0,12,6,5,5, +-23,29,21,12,153,32,22,13,255,35,25,14,227,15,12,8,85,0,24,12, +-10,9,170,198,124,37,255,215,125,38,255,213,124,38,255,23,18,12,255,0, +-24,14,12,9,170,204,132,47,255,219,144,56,255,211,127,36,255,28,21,13, +-255,0,12,14,12,9,170,198,117,37,255,215,123,42,255,214,125,39,255,25, +-20,12,215,0,8,11,10,8,130,198,119,35,255,215,126,40,255,212,123,37, +-255,30,22,13,255,0,12,14,12,9,170,196,114,33,255,206,106,25,255,200, +-105,21,255,30,21,11,184,0,8,13,11,8,99,184,100,25,255,209,117,28, +-255,210,115,31,255,28,21,13,255,0,20,14,12,9,170,198,117,37,255,215, +-126,40,255,214,126,41,255,25,19,12,255,0,12,10,9,7,125,61,42,22, +-255,190,107,33,255,153,98,38,255,29,23,16,255,13,12,10,255,17,15,10, +-255,108,74,37,255,210,144,59,255,153,98,38,255,16,14,11,224,6,6,5, +-17,0,12,15,13,8,227,115,67,24,255,197,100,22,255,150,81,25,255,32, +-24,13,255,15,13,8,255,19,15,10,255,85,48,18,255,178,95,21,255,115, +-65,20,255,15,12,8,255,5,5,4,34,0,32,10,9,7,198,69,46,22, +-255,186,103,29,255,195,111,28,255,92,58,25,255,15,12,8,198,0,12,10, +-9,7,170,194,112,31,255,215,125,38,255,218,146,53,255,24,19,13,255,0, +-20,15,14,10,227,159,103,42,255,212,127,43,255,177,118,48,255,19,17,12, +-227,6,6,5,28,0,32,11,10,8,170,182,98,23,255,202,106,21,255,195, +-98,20,255,24,17,9,212,0,12,18,14,9,227,102,54,19,255,157,83,18, +-255,85,46,14,255,19,13,6,255,47,27,10,255,150,81,19,255,131,67,20, +-255,39,26,14,255,12,11,9,85,0,64,10,9,7,170,118,75,33,255,215, +-141,54,255,44,33,19,255,0,16,9,9,8,108,19,17,12,170,27,23,16, +-170,23,21,16,170,23,21,16,170,24,20,15,170,20,18,13,170,15,14,10, +-170,10,9,7,113,7,6,6,28,0,12,12,11,9,170,189,99,26,255,209, +-110,30,255,211,118,36,255,141,88,36,255,19,17,12,227,20,18,13,170,24, +-20,15,170,21,19,14,170,16,14,11,170,10,9,7,113,6,6,5,28,0, +-20,8,7,5,65,11,10,8,142,16,14,11,170,24,21,15,170,25,22,16, +-170,23,21,16,170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6, +-28,0,20,8,7,5,62,10,9,5,136,12,10,7,170,14,11,7,170,13, +-10,6,170,11,9,6,198,31,21,10,255,153,82,18,255,177,85,18,255,169, +-78,18,255,22,15,7,204,0,16,8,7,5,57,11,10,6,142,19,17,12, +-170,23,21,16,170,25,22,16,170,23,21,16,170,21,19,14,170,15,14,10, +-170,10,10,9,113,7,6,6,28,0,16,12,10,7,153,55,32,14,255,175, +-93,20,255,185,94,20,255,183,89,19,255,80,44,17,255,13,11,8,187,7, +-6,6,25,0,16,8,7,5,62,11,10,6,142,16,14,11,170,23,19,14, +-170,25,22,16,170,23,21,16,170,19,17,12,170,15,14,10,170,17,15,10, +-170,19,17,12,142,9,8,8,28,0,8,12,10,9,170,204,137,49,255,220, +-146,59,255,218,146,53,255,141,91,38,255,19,17,12,227,19,17,12,170,24, +-20,15,170,21,19,14,170,15,14,10,170,10,10,9,113,7,6,6,28,0, +-16,12,10,7,57,14,12,7,102,14,11,7,85,0,32,12,10,7,57,13, +-11,8,105,15,13,8,85,0,12,12,11,9,170,204,136,47,255,220,146,59, +-255,218,153,59,255,24,19,13,255,0,12,8,7,5,82,11,10,6,156,11, +-9,6,170,10,9,7,91,0,12,10,8,5,127,144,78,19,255,180,87,19, +-255,174,81,19,255,24,15,7,210,0,12,14,11,7,68,12,10,7,170,12, +-10,7,170,17,15,10,170,24,20,15,170,19,17,12,170,15,14,10,170,18, +-15,11,170,24,21,15,170,21,19,14,170,15,14,10,170,11,10,8,113,7, +-7,6,28,0,16,15,13,10,119,17,15,12,170,15,13,10,170,16,14,11, +-170,19,17,12,170,21,18,12,170,18,15,11,170,15,13,8,170,11,9,6, +-170,10,8,7,88,6,5,5,23,0,20,10,9,7,85,14,12,9,170,19, +-17,12,170,21,19,14,170,21,19,14,170,21,19,14,170,19,17,12,170,15, +-14,10,170,11,10,8,116,7,7,6,28,0,16,15,14,10,119,18,15,11, +-170,15,14,10,170,18,15,11,170,21,19,14,170,25,22,16,170,23,21,16, +-170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,28,0,20,10, +-9,7,85,14,12,9,170,19,17,12,170,20,18,13,170,20,18,13,170,23, +-19,14,170,19,17,12,170,15,14,10,170,17,14,10,170,19,17,12,142,10, +-9,7,28,0,12,15,13,10,113,18,15,11,170,15,14,10,170,18,15,11, +-170,21,19,14,170,25,22,16,170,23,21,16,170,20,18,13,170,16,14,11, +-170,11,10,8,113,7,7,6,28,0,20,7,7,6,82,11,10,6,142,16, +-13,9,170,19,17,12,170,21,19,14,170,24,21,15,170,25,22,16,170,25, +-22,16,170,15,13,10,170,12,11,9,57,0,16,15,13,10,170,97,65,34, +-255,209,132,42,255,214,136,43,255,214,127,43,255,159,103,42,255,21,19,14, +-227,11,10,8,28,0,12,16,14,11,113,21,19,14,170,18,15,11,153,11, +-10,8,28,0,16,15,14,10,125,21,19,14,170,19,17,12,142,10,9,7, +-28,0,12,15,14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0, +-16,15,13,10,125,21,19,14,170,19,17,12,142,10,9,7,28,0,12,15, +-14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,24,15,14,10, +-125,21,19,14,170,19,17,12,142,9,9,8,28,0,12,17,14,10,130,27, +-24,16,170,21,19,14,142,10,9,7,28,0,16,16,14,11,113,28,24,17, +-170,24,21,15,161,12,11,9,28,0,12,16,14,11,113,21,19,14,170,18, +-15,11,153,11,10,8,28,0,16,15,13,10,125,21,19,14,170,19,17,12, +-142,9,8,6,28,0,12,18,15,11,136,19,16,10,170,16,13,9,170,16, +-14,9,170,15,13,8,170,13,11,8,170,12,11,9,170,13,12,8,170,15, +-14,10,170,14,13,11,170,11,11,10,113,0,20,13,11,8,170,190,98,23, +-255,204,116,31,255,74,52,27,255,9,8,8,113,0,16,13,11,8,170,192, +-106,29,255,208,112,27,255,208,117,29,255,27,21,12,255,0,16,5,5,4, +-28,27,23,16,255,199,121,44,255,214,139,41,255,31,23,14,255,0,16,13, +-11,8,28,32,24,13,227,36,26,15,255,19,16,12,198,8,8,7,51,0, +-4,8,8,7,57,29,21,12,218,48,32,17,255,45,30,16,255,20,16,11, +-218,10,9,7,105,0,44,14,12,9,170,204,130,51,255,224,153,77,255,225, +-169,88,255,33,27,18,255,0,12,21,19,14,215,217,163,86,255,61,46,28, +-255,0,12,19,16,12,201,203,121,40,255,51,38,22,255,0,12,4,4,3, +-25,16,14,11,227,212,147,71,255,224,160,77,255,223,161,80,255,31,25,16, +-255,4,4,4,102,10,10,9,215,206,133,55,255,223,156,70,255,224,164,85, +-255,51,39,24,255,5,5,4,82,0,12,15,12,8,110,178,98,27,255,211, +-115,30,255,211,121,34,255,36,26,15,255,3,3,2,85,0,60,8,8,5, +-28,27,20,10,232,125,73,22,255,190,97,21,255,180,92,21,255,97,56,20, +-255,14,11,7,170,0,16,12,10,7,142,165,89,22,255,198,104,21,255,84, +-50,19,255,7,6,4,159,0,4,5,5,4,82,32,23,11,255,121,69,22, +-255,97,56,20,255,15,13,8,142,0,32,14,12,7,198,172,92,21,255,28, +-19,9,207,0,8,11,10,6,85,148,78,21,255,198,104,21,255,192,97,21, +-255,21,15,8,255,0,24,10,9,5,170,167,90,22,255,202,93,21,255,202, +-103,23,255,21,16,10,255,0,20,4,3,3,133,20,16,9,255,151,80,22, +-255,75,42,16,255,10,8,7,255,32,22,11,255,164,86,23,255,60,39,17, +-255,5,5,4,252,0,36,12,11,9,198,213,155,80,255,224,166,83,255,211, +-121,34,255,20,16,9,255,3,3,2,28,0,144,6,6,5,51,27,20,10, +-255,160,84,23,255,198,104,21,255,67,40,16,255,8,7,5,125,0,12,12, +-10,9,170,195,112,30,255,215,125,38,255,217,133,50,255,49,35,22,255,5, +-5,4,133,13,12,10,210,189,119,50,255,211,127,44,255,212,121,41,255,218, +-135,53,255,220,148,63,255,34,27,17,255,0,20,4,4,4,17,13,12,10, +-227,196,113,31,255,212,118,35,255,214,123,43,255,33,26,16,255,0,56,12, +-11,9,187,208,134,55,255,223,146,70,255,221,152,70,255,34,26,17,255,0, +-40,8,7,5,164,165,86,22,255,202,98,21,255,198,96,21,255,22,16,9, +-255,0,20,8,8,5,85,32,22,11,255,167,87,22,255,160,84,23,255,93, +-54,20,255,120,65,21,255,188,96,21,255,196,99,21,255,200,105,21,255,24, +-19,11,207,0,8,15,14,10,110,208,152,71,255,227,174,98,255,228,179,103, +-255,225,176,98,255,217,169,94,255,213,166,92,255,215,167,92,255,213,155,80, +-255,204,136,55,255,138,89,37,255,25,22,16,227,9,9,8,28,0,8,11, +-10,8,170,203,129,50,255,223,149,70,255,222,158,75,255,31,25,16,255,4, +-4,4,28,0,60,8,8,7,57,49,40,26,255,206,152,83,255,224,169,91, +-255,194,140,71,255,31,27,20,255,9,8,8,28,0,8,12,10,9,161,196, +-110,33,255,218,130,51,255,222,158,75,255,31,25,16,255,4,4,4,28,0, +-8,11,10,8,198,213,160,84,255,228,180,105,255,227,175,100,255,33,28,18, +-207,0,8,12,11,9,130,210,155,77,255,228,169,99,255,226,172,95,255,30, +-25,17,255,4,4,4,28,0,8,11,10,8,198,204,129,49,255,214,127,43, +-255,213,125,40,255,23,19,12,232,0,8,14,13,9,125,208,152,71,255,223, +-159,76,255,218,153,59,255,33,26,16,210,0,8,13,12,10,127,198,118,39, +-255,215,127,42,255,213,126,42,255,41,31,18,227,0,12,6,6,5,28,25, +-21,16,227,204,150,79,255,223,171,98,255,175,122,60,255,18,15,11,218,5, +-4,4,17,0,20,20,18,13,85,177,101,34,255,204,123,37,255,199,117,36, +-255,199,117,36,255,202,122,37,255,199,117,36,255,198,114,31,255,198,110,31, +-255,202,118,35,255,46,33,21,170,0,24,10,9,7,153,110,78,37,255,213, +-162,82,255,218,164,87,255,67,51,30,255,9,8,8,85,0,40,6,5,5, +-28,21,19,14,255,217,166,92,255,227,175,100,255,224,169,91,255,31,25,16, +-215,0,8,12,10,7,85,154,80,21,255,197,99,20,255,192,97,21,255,28, +-20,9,255,4,3,3,110,11,9,6,170,117,63,20,255,184,94,21,255,198, +-104,21,255,203,104,24,255,210,122,37,255,21,17,12,252,0,8,10,9,7, +-161,203,129,50,255,224,160,77,255,225,169,88,255,30,25,17,255,4,4,4, +-28,0,8,8,7,5,190,165,86,22,255,198,104,21,255,196,99,21,255,28, +-19,9,170,0,8,13,11,8,85,176,91,23,255,208,112,27,255,210,121,35, +-255,27,22,14,255,4,4,4,28,0,8,11,10,8,198,211,149,76,255,224, +-168,87,255,224,162,81,255,32,26,17,210,0,8,12,10,7,113,176,91,23, +-255,202,107,23,255,202,95,23,255,20,16,9,255,0,40,15,13,10,170,213, +-160,84,255,228,180,105,255,227,174,98,255,33,26,18,255,0,12,15,13,10, +-170,213,155,80,255,226,172,95,255,224,167,85,255,23,20,14,244,0,8,11, +-10,8,127,189,104,28,255,214,127,43,255,221,148,70,255,31,25,16,255,4, +-4,4,28,0,28,14,12,9,170,195,113,32,255,209,117,28,255,202,103,23, +-255,20,15,9,252,3,3,3,14,0,28,15,14,10,170,213,155,80,255,226, +-172,95,255,221,152,70,255,28,24,15,255,0,40,14,12,9,170,208,141,61, +-255,225,162,88,255,227,174,98,255,33,26,18,255,4,4,4,28,0,8,10, +-8,7,198,182,98,23,255,202,103,23,255,198,104,21,255,28,19,9,170,0, +-8,11,10,6,85,154,80,21,255,202,98,21,255,202,103,23,255,25,20,12, +-255,0,40,12,10,7,170,186,100,23,255,202,99,23,255,200,105,21,255,30, +-21,9,170,0,8,12,9,7,85,154,80,21,255,198,104,21,255,196,99,21, +-255,28,20,9,255,4,4,3,113,11,10,6,227,183,100,26,255,212,127,43, +-255,167,117,52,255,17,15,12,215,5,5,5,14,0,12,15,13,10,170,211, +-149,76,255,224,166,83,255,223,161,80,255,34,26,17,255,0,32,10,9,7, +-170,167,87,22,255,198,92,21,255,196,99,21,255,196,95,21,255,198,92,21, +-255,195,99,22,255,192,106,29,255,206,127,43,255,217,141,60,255,223,146,70, +-255,224,165,81,255,220,148,63,255,212,124,39,255,25,19,12,215,0,8,12, +-11,9,116,196,116,37,255,218,141,51,255,218,139,55,255,218,142,61,255,215, +-143,58,255,24,19,13,212,0,4,10,9,7,156,203,129,50,255,221,150,66, +-255,220,148,63,255,25,21,14,227,0,8,10,10,7,159,204,134,59,255,225, +-160,84,255,225,169,88,255,36,29,19,255,0,12,15,14,10,170,204,130,51, +-255,220,142,59,255,218,139,55,255,21,18,12,249,0,8,11,10,8,142,206, +-145,67,255,226,172,95,255,227,174,98,255,32,26,17,255,4,4,4,28,0, +-8,11,10,8,198,198,117,37,255,215,125,38,255,211,122,36,255,28,21,13, +-215,0,8,13,11,8,96,174,91,23,255,202,107,23,255,202,103,23,255,22, +-17,9,255,0,12,11,10,6,170,176,91,23,255,202,103,23,255,203,108,24, +-255,21,15,10,238,0,8,11,10,8,142,206,145,67,255,226,170,91,255,224, +-160,85,255,30,24,17,255,4,4,4,28,0,8,11,10,8,198,209,149,70, +-255,224,160,77,255,222,158,75,255,31,25,16,212,0,8,12,11,9,127,198, +-116,35,255,215,125,38,255,211,122,36,255,28,21,13,255,4,4,4,28,0, +-52,13,12,8,170,195,112,30,255,209,110,30,255,207,105,30,255,25,20,12, +-255,0,24,15,14,10,170,213,158,80,255,226,172,95,255,224,164,85,255,33, +-27,18,255,0,12,15,14,10,170,210,143,65,255,224,168,87,255,224,165,81, +-255,25,21,14,232,0,8,10,10,9,153,208,147,67,255,224,166,83,255,222, +-158,75,255,34,26,17,255,0,12,15,14,10,170,211,149,76,255,223,149,70, +-255,219,146,60,255,25,20,14,235,0,8,10,10,9,150,204,134,59,255,224, +-156,83,255,224,165,81,255,33,27,18,255,0,20,15,14,10,170,211,150,70, +-255,226,170,91,255,226,172,95,255,33,26,18,255,0,16,9,9,8,150,101, +-74,38,255,198,145,77,255,206,157,87,255,202,151,79,255,197,141,74,255,200, +-146,75,255,180,126,57,255,21,19,14,227,5,5,4,28,0,16,8,7,5, +-113,43,28,14,255,187,96,22,255,181,93,22,255,98,55,21,255,68,42,17, +-255,77,46,18,255,129,72,22,255,174,89,21,255,83,47,18,255,11,9,6, +-221,0,28,6,6,5,28,16,14,11,195,108,76,35,255,210,141,59,255,218, +-162,81,255,167,118,54,255,16,14,11,221,5,5,5,14,0,12,15,13,10, +-170,211,149,76,255,224,168,87,255,223,154,80,255,31,25,16,255,0,20,6, +-6,5,57,34,27,17,255,203,122,36,255,208,124,41,255,109,76,34,255,13, +-12,10,142,0,32,13,11,8,170,176,91,23,255,202,93,21,255,196,99,21, +-255,28,19,9,170,0,8,11,9,6,85,132,71,21,255,195,99,22,255,103, +-59,20,255,11,10,6,170,3,3,2,25,6,6,5,110,55,35,16,255,198, +-113,29,255,212,134,51,255,41,32,20,210,0,68,21,19,14,215,217,163,86, +-255,49,38,24,255,0,12,11,10,8,82,54,43,27,255,200,135,59,255,210, +-137,59,255,207,131,50,255,205,127,44,255,199,117,36,255,195,111,28,255,187, +-101,24,255,93,54,22,255,19,15,10,227,7,6,6,28,0,8,10,9,7, +-170,195,109,32,255,218,138,53,255,224,158,81,255,223,173,95,255,219,167,94, +-255,217,169,94,255,218,171,97,255,217,166,92,255,208,136,59,255,110,68,27, +-255,19,15,10,227,6,6,5,28,0,12,12,11,7,170,61,42,20,255,188, +-106,33,255,208,134,55,255,215,163,82,255,217,166,92,255,216,167,88,255,216, +-167,89,255,211,150,70,255,146,94,39,255,26,21,15,229,9,8,6,28,0, +-12,12,10,7,170,51,32,14,255,151,80,22,255,169,91,22,255,173,86,22, +-255,169,88,22,255,173,86,22,255,180,92,21,255,194,98,21,255,196,95,21, +-255,192,97,21,255,31,21,10,170,0,12,12,10,7,170,57,37,18,255,189, +-107,34,255,212,149,67,255,217,166,92,255,217,166,92,255,218,171,97,255,215, +-163,82,255,205,126,48,255,116,72,29,255,20,16,11,227,6,6,5,28,0, +-8,11,9,6,68,126,68,21,255,191,98,22,255,194,98,21,255,192,97,21, +-255,192,97,21,255,191,98,22,255,177,91,22,255,26,19,9,142,0,12,12, +-10,7,170,58,37,17,255,185,107,30,255,208,134,55,255,216,167,88,255,218, +-171,97,255,217,166,92,255,213,148,72,255,204,130,51,255,209,141,60,255,211, +-159,76,255,30,25,17,170,0,8,10,10,7,167,210,155,77,255,228,178,99, +-255,224,165,81,255,221,165,86,255,217,166,92,255,218,169,93,255,217,166,92, +-255,214,156,81,255,206,135,51,255,116,72,29,255,20,16,11,227,6,6,5, +-28,0,8,13,10,6,57,115,62,20,255,169,91,22,255,165,86,22,255,24, +-18,9,167,0,24,12,10,7,88,117,63,20,255,186,100,23,255,191,107,32, +-255,35,27,16,144,0,8,10,10,7,170,210,155,77,255,228,178,99,255,221, +-152,70,255,24,19,13,255,0,8,12,10,7,170,58,36,15,255,157,79,22, +-255,151,80,22,255,58,35,15,255,11,9,6,57,0,8,12,10,7,85,157, +-81,20,255,197,99,20,255,192,97,21,255,28,20,9,170,0,8,11,9,6, +-57,115,62,20,255,189,94,24,255,198,117,37,255,213,157,76,255,218,171,97, +-255,217,169,94,255,214,161,85,255,213,157,76,255,212,149,67,255,208,134,55, +-255,205,126,48,255,143,96,40,255,28,26,19,229,8,8,7,28,0,8,13, +-12,8,85,141,74,24,255,190,94,23,255,183,95,24,255,183,95,24,255,187, +-93,24,255,189,97,22,255,181,93,22,255,177,91,22,255,169,88,22,255,89, +-52,20,255,21,18,12,227,9,9,8,28,0,12,18,17,13,181,103,74,40, +-255,207,146,74,255,214,156,81,255,210,144,67,255,208,138,55,255,207,129,52, +-255,205,133,48,255,205,126,48,255,151,101,42,255,28,26,19,232,9,8,8, +-28,0,8,13,12,10,110,186,127,63,255,214,156,81,255,213,158,80,255,213, +-155,80,255,214,156,81,255,214,153,75,255,213,148,72,255,213,148,72,255,211, +-150,70,255,159,111,54,255,28,25,19,241,9,8,8,31,0,12,18,17,13, +-181,103,74,40,255,208,156,81,255,214,156,81,255,208,138,55,255,209,137,60, +-255,213,158,80,255,213,155,80,255,213,160,84,255,215,160,88,255,213,163,84, +-255,30,24,17,178,0,8,12,11,9,93,178,121,53,255,213,158,80,255,210, +-143,65,255,211,146,62,255,213,148,72,255,215,163,82,255,213,158,80,255,212, +-149,67,255,209,141,60,255,153,106,49,255,28,25,19,235,9,9,8,31,0, +-12,18,15,11,173,66,43,21,255,187,101,32,255,207,132,52,255,210,144,67, +-255,213,148,72,255,214,156,81,255,216,167,88,255,214,156,81,255,176,128,65, +-255,46,39,27,255,0,12,15,14,10,85,181,111,42,255,215,136,52,255,213, +-125,40,255,211,122,36,255,212,123,37,255,210,123,39,255,202,122,37,255,31, +-24,14,170,0,8,12,11,9,88,164,89,29,255,203,122,36,255,199,117,36, +-255,30,23,15,212,0,12,15,13,10,127,187,133,62,255,213,148,72,255,208, +-138,55,255,31,24,16,170,0,8,13,12,10,85,172,104,37,255,209,134,54, +-255,206,135,51,255,32,25,17,212,0,12,15,13,10,127,181,116,46,255,211, +-143,62,255,210,153,71,255,29,24,16,178,0,8,13,12,10,91,178,121,53, +-255,213,154,70,255,208,134,55,255,31,25,16,210,0,20,15,14,10,125,179, +-110,42,255,210,135,55,255,208,139,65,255,26,21,15,184,0,8,14,13,9, +-85,179,117,44,255,217,165,82,255,213,163,84,255,27,23,16,221,0,12,14, +-12,9,136,174,103,39,255,206,127,43,255,199,117,36,255,31,24,14,170,0, +-8,12,11,9,88,164,89,29,255,202,118,35,255,196,114,33,255,29,22,14, +-210,0,12,14,12,9,125,169,95,30,255,202,119,37,255,199,119,39,255,24, +-19,13,190,0,8,14,12,9,85,170,95,29,255,198,113,29,255,199,116,34, +-255,204,128,47,255,206,135,51,255,204,129,49,255,204,129,49,255,208,134,55, +-255,211,149,76,255,192,140,73,255,95,74,39,255,17,15,12,85,0,16,14, +-12,9,198,211,150,70,255,206,152,81,255,31,26,20,255,7,7,6,48,0, +-16,15,13,10,170,211,149,76,255,226,170,91,255,226,172,95,255,35,28,18, +-255,0,20,15,14,12,218,171,120,60,255,219,154,70,255,41,31,20,255,4, +-4,3,28,0,104,17,16,12,170,219,179,116,255,232,193,137,255,232,199,135, +-255,40,33,23,255,0,12,10,10,9,76,62,50,31,255,20,18,13,167,0, +-12,11,10,8,76,58,46,29,255,20,18,13,167,0,16,13,12,10,170,210, +-150,71,255,223,147,72,255,221,150,66,255,26,21,15,210,0,4,11,10,8, +-119,211,159,84,255,229,184,114,255,230,186,123,255,30,26,19,255,0,16,12, +-11,9,93,137,90,40,255,223,167,94,255,228,180,111,255,167,133,80,255,17, +-16,14,227,11,11,10,170,12,11,9,170,12,11,9,170,12,11,9,119,7, +-7,6,57,0,36,7,7,6,62,21,18,12,227,157,92,28,255,203,105,26, +-255,197,106,26,255,82,48,21,255,14,12,7,173,5,5,4,8,0,16,8, +-7,5,28,26,19,11,227,103,68,25,255,158,96,29,255,57,41,22,255,13, +-12,10,241,33,26,16,255,146,88,31,255,66,47,23,255,12,10,9,201,6, +-5,5,14,0,32,8,7,5,57,30,22,11,255,15,12,8,96,0,8,10, +-10,7,130,190,104,27,255,209,118,30,255,211,117,34,255,27,21,14,255,0, +-24,13,12,10,170,199,122,39,255,218,130,51,255,223,146,70,255,30,24,17, +-255,0,12,23,22,18,139,30,27,21,170,16,15,11,255,89,59,26,255,203, +-110,28,255,196,113,31,255,122,81,33,255,186,117,43,255,216,129,51,255,184, +-126,57,255,38,34,25,255,24,22,19,221,33,30,24,170,15,15,12,28,0, +-12,24,22,19,142,32,31,25,170,21,20,16,198,90,71,45,255,223,179,110, +-255,226,172,95,255,221,150,66,255,143,100,44,255,22,21,17,227,28,27,21, +-170,29,28,22,170,13,13,12,42,0,36,8,8,8,11,25,24,20,142,39, +-35,28,170,30,28,23,170,29,27,22,170,29,27,22,170,29,27,22,170,29, +-27,22,170,29,27,20,170,23,21,16,170,14,13,11,34,0,52,13,12,10, +-159,142,86,31,255,208,116,35,255,201,119,38,255,32,26,17,255,5,5,4, +-28,0,12,14,13,11,170,216,167,97,255,231,184,124,255,231,193,128,255,181, +-146,92,255,52,44,33,255,90,71,45,255,201,155,88,255,223,173,102,255,228, +-179,115,255,230,183,123,255,230,184,119,255,39,32,22,255,0,24,12,12,11, +-170,206,139,61,255,226,164,91,255,228,174,103,255,39,32,22,255,0,48,6, +-6,5,28,9,9,8,142,56,46,31,255,222,180,113,255,230,187,119,255,222, +-180,113,255,23,21,16,255,0,36,15,14,12,164,79,59,30,255,209,128,42, +-255,211,127,44,255,171,117,46,255,18,15,11,170,0,16,9,9,8,116,33, +-28,16,255,161,94,28,255,199,107,26,255,65,40,18,255,8,7,5,255,25, +-20,12,255,198,113,29,255,210,120,33,255,217,133,50,255,27,23,16,255,0, +-8,7,7,6,23,34,28,19,198,46,36,25,255,39,31,22,255,41,33,22, +-255,59,46,28,255,51,40,26,255,61,47,28,255,180,133,71,255,227,175,100, +-255,226,175,103,255,181,143,88,255,17,16,12,142,0,8,11,11,10,170,214, +-166,97,255,229,179,114,255,228,185,111,255,161,121,68,255,23,21,16,227,23, +-22,18,170,22,21,17,170,16,15,13,170,11,11,8,147,8,8,7,85,0, +-40,14,13,11,170,181,143,88,255,228,185,123,255,218,168,97,255,70,54,35, +-255,9,9,8,113,0,12,11,10,8,85,120,87,45,255,223,183,120,255,231, +-190,132,255,167,135,80,255,24,22,19,227,19,18,16,170,19,18,16,198,95, +-80,46,255,226,193,129,255,228,187,129,255,186,148,87,255,15,14,12,170,0, +-8,10,10,9,85,155,113,64,255,229,196,132,255,232,191,133,255,179,142,90, +-255,27,25,20,227,18,18,15,170,19,18,16,198,90,71,45,255,222,175,101, +-255,227,174,98,255,228,185,111,255,28,25,19,255,0,8,7,7,6,23,34, +-28,19,198,49,35,22,255,39,29,18,227,12,11,9,85,0,8,8,7,7, +-28,33,26,16,198,52,39,23,255,47,35,22,227,13,12,8,85,0,8,8, +-8,7,28,33,30,24,227,201,157,100,255,230,186,123,255,181,137,74,255,16, +-15,11,207,6,6,5,23,0,24,11,10,8,28,27,21,12,193,26,19,11, +-255,23,18,10,255,23,18,10,255,24,18,11,255,24,18,11,255,26,20,11, +-255,35,27,16,255,42,31,19,241,17,14,10,85,0,28,9,9,8,144,91, +-67,36,255,217,154,72,255,211,150,70,255,69,55,34,255,15,14,12,85,0, +-28,6,6,5,11,11,11,10,142,24,22,19,255,167,135,80,255,225,172,104, +-255,224,166,83,255,193,126,54,255,16,14,11,170,0,8,13,12,8,85,185, +-97,26,255,207,112,28,255,204,110,27,255,71,46,22,255,8,8,7,255,28, +-22,13,255,198,107,27,255,193,111,30,255,126,78,31,255,199,139,62,255,226, +-184,111,255,27,24,18,255,0,8,11,10,8,170,214,166,97,255,230,187,119, +-255,228,179,103,255,143,102,48,255,17,16,12,227,12,12,9,170,13,12,10, +-198,46,33,17,255,199,112,28,255,206,111,27,255,204,110,27,255,32,23,13, +-176,0,8,12,11,9,136,204,134,59,255,226,172,95,255,228,181,107,255,162, +-125,73,255,24,22,19,227,19,18,16,170,19,18,16,198,95,80,46,255,224, +-179,109,255,223,173,95,255,173,117,50,255,15,13,10,156,0,8,12,11,7, +-99,185,97,26,255,208,112,27,255,204,110,27,255,22,18,11,255,0,40,16, +-15,13,170,219,179,116,255,232,194,133,255,231,193,128,255,40,33,23,255,0, +-12,16,15,13,170,219,177,112,255,230,187,119,255,224,159,83,255,24,21,15, +-255,0,8,11,10,8,164,211,158,82,255,229,184,114,255,230,191,123,255,166, +-127,77,255,22,21,17,227,22,21,17,170,20,19,13,170,14,13,11,28,0, +-16,12,11,9,170,195,112,30,255,209,106,30,255,206,111,27,255,101,63,26, +-255,16,14,11,227,23,21,16,170,29,27,22,170,13,13,12,42,0,16,16, +-15,13,170,216,167,97,255,224,158,87,255,216,125,45,255,24,20,13,255,0, +-40,17,16,12,170,219,177,112,255,232,195,137,255,231,189,128,255,162,125,73, +-255,22,21,17,227,14,14,11,170,13,12,10,198,50,35,19,255,199,112,28, +-255,206,111,27,255,204,110,27,255,32,24,13,170,0,8,13,12,8,93,194, +-109,33,255,219,139,54,255,224,158,81,255,39,32,22,255,0,40,11,10,8, +-170,190,104,27,255,208,112,27,255,204,110,27,255,32,24,13,170,0,8,13, +-12,8,85,184,96,25,255,207,112,28,255,204,102,27,255,129,78,28,255,31, +-26,16,255,127,84,34,255,219,147,70,255,173,122,62,255,15,14,12,212,6, +-6,5,25,0,16,16,15,13,170,213,155,80,255,221,144,68,255,217,130,52, +-255,31,25,16,255,0,32,10,9,7,170,189,99,26,255,208,112,27,255,204, +-110,27,255,155,87,26,255,72,46,21,255,179,103,36,255,223,156,76,255,216, +-170,97,255,134,96,47,255,174,127,71,255,221,167,90,255,223,147,72,255,222, +-158,75,255,23,19,14,252,0,8,11,10,8,170,214,166,97,255,231,187,124, +-255,230,191,123,255,228,182,117,255,222,175,101,255,64,50,33,255,7,7,6, +-229,26,23,19,255,220,175,105,255,228,183,113,255,228,188,117,255,25,21,16, +-255,0,8,11,10,8,170,217,176,112,255,232,197,137,255,232,199,135,255,37, +-31,22,255,0,12,13,12,10,170,198,117,37,255,215,127,42,255,217,130,52, +-255,21,19,14,255,0,8,11,10,8,167,215,172,104,255,232,191,133,255,231, +-190,132,255,166,127,77,255,23,21,16,227,18,17,15,170,17,16,12,198,74, +-52,27,255,204,117,33,255,211,111,30,255,173,93,28,255,15,12,8,164,0, +-8,13,12,8,88,185,97,26,255,208,112,27,255,204,110,27,255,19,16,10, +-255,0,12,10,9,7,170,190,104,27,255,212,118,35,255,216,136,51,255,21, +-19,14,252,0,8,11,10,8,167,215,172,104,255,232,194,127,255,231,193,128, +-255,166,129,77,255,23,21,16,227,19,18,16,170,19,18,14,198,81,59,34, +-255,213,144,62,255,215,140,60,255,165,108,40,255,13,12,10,167,0,8,8, +-8,7,85,101,63,26,255,206,114,33,255,212,121,33,255,155,92,36,255,23, +-21,16,227,22,21,17,170,28,26,21,170,21,20,18,170,13,13,12,164,10, +-10,9,85,6,6,6,6,0,28,12,11,9,170,194,112,31,255,212,119,37, +-255,216,134,45,255,35,28,18,255,0,24,16,15,13,170,217,171,106,255,231, +-187,124,255,228,181,107,255,39,32,22,255,0,12,16,15,11,170,208,134,55, +-255,223,156,70,255,221,148,70,255,23,20,14,238,0,8,11,10,8,170,204, +-136,55,255,223,156,70,255,222,158,75,255,34,28,19,255,0,12,14,13,11, +-170,217,171,106,255,232,189,127,255,230,186,123,255,25,22,16,255,0,8,10, +-10,9,167,210,155,77,255,226,172,95,255,224,165,81,255,31,26,18,255,0, +-20,15,13,12,170,217,173,104,255,232,191,133,255,231,195,132,255,40,33,23, +-255,0,20,10,9,9,133,73,58,36,255,225,184,120,255,231,193,128,255,228, +-180,111,255,147,102,48,255,15,13,10,227,8,7,7,28,0,24,12,11,7, +-198,100,59,23,255,169,93,26,255,156,91,27,255,174,96,27,255,180,99,27, +-255,168,97,27,255,105,62,24,255,18,15,9,255,7,6,6,48,0,24,7, +-7,7,28,15,15,12,227,144,114,67,255,219,177,112,255,223,176,102,255,153, +-113,62,255,17,16,12,227,7,7,6,28,0,16,16,15,13,170,213,155,80, +-255,223,146,70,255,217,129,50,255,27,22,14,255,0,24,12,10,9,195,161, +-94,28,255,207,114,32,255,193,114,36,255,23,20,16,255,0,32,12,11,9, +-170,191,105,28,255,207,100,28,255,204,110,27,255,26,20,11,204,0,8,6, +-5,5,3,26,19,9,198,24,18,9,246,15,12,8,142,0,12,15,13,10, +-91,31,24,16,244,51,39,24,255,21,19,14,91,0,68,10,10,9,76,61, +-49,30,255,20,18,13,156,0,16,17,15,12,142,27,22,14,232,30,22,13, +-255,25,20,12,255,22,18,11,238,21,16,10,255,99,58,22,255,203,113,26, +-255,205,111,28,255,131,80,30,255,12,11,9,142,0,8,11,10,8,170,212, +-160,85,255,232,191,127,255,231,195,132,255,196,155,91,255,81,59,34,255,41, +-32,20,255,54,43,27,255,180,133,71,255,216,144,59,255,208,115,33,255,129, +-78,28,255,12,11,7,142,0,8,8,7,7,57,72,52,29,255,215,155,78, +-255,227,174,98,255,207,158,94,255,85,63,34,255,36,29,19,255,57,43,26, +-255,189,130,66,255,219,149,66,255,212,121,41,255,172,105,33,255,17,15,10, +-147,0,8,7,6,6,54,58,40,21,255,198,113,29,255,206,103,27,255,165, +-87,24,255,42,28,13,255,21,16,8,255,27,20,10,255,95,60,22,255,202, +-105,27,255,206,100,29,255,204,110,27,255,35,24,12,170,0,8,7,7,6, +-54,70,50,27,255,212,145,65,255,227,174,98,255,201,155,88,255,59,44,28, +-255,23,20,14,255,34,28,19,255,157,104,48,255,211,126,42,255,208,115,33, +-255,132,82,29,255,13,11,8,142,0,12,24,18,9,221,108,61,23,255,201, +-112,26,255,207,112,28,255,204,110,27,255,158,91,25,255,46,29,13,249,11, +-10,6,57,0,8,8,8,7,57,70,50,27,255,212,142,59,255,226,172,95, +-255,207,158,94,255,85,63,34,255,41,32,20,255,57,43,26,255,174,124,59, +-255,224,170,93,255,229,184,114,255,231,196,128,255,28,25,19,255,0,8,10, +-10,9,167,215,169,102,255,232,191,127,255,231,193,128,255,196,154,87,255,77, +-59,34,255,41,31,20,255,54,43,27,255,168,113,49,255,212,121,41,255,206, +-114,33,255,132,82,29,255,12,11,9,130,0,8,12,11,7,110,188,98,25, +-255,206,111,27,255,206,106,25,255,26,19,11,255,0,24,14,12,9,170,199, +-117,36,255,221,148,62,255,227,174,98,255,28,26,19,255,0,8,10,10,9, +-167,212,161,89,255,224,166,83,255,217,129,50,255,32,24,15,255,5,5,4, +-31,7,7,6,136,65,44,22,255,192,106,29,255,203,108,24,255,114,66,23, +-255,17,13,8,221,0,12,10,9,7,139,185,97,26,255,208,112,27,255,208, +-117,29,255,32,24,13,170,0,8,15,13,8,91,189,99,26,255,215,123,42, +-255,226,172,95,255,198,152,87,255,81,58,34,255,176,133,71,255,224,168,95, +-255,197,138,62,255,65,47,26,255,133,81,30,255,208,121,37,255,212,115,37, +-255,152,98,35,255,12,11,9,142,0,8,10,9,7,147,190,107,25,255,206, +-111,27,255,206,106,25,255,158,91,25,255,42,28,13,255,21,15,8,255,26, +-19,9,255,114,66,23,255,204,113,25,255,208,115,33,255,173,122,62,255,16, +-15,13,150,0,8,8,8,7,71,110,87,51,255,222,180,113,255,224,166,83, +-255,209,137,60,255,133,84,32,255,77,50,24,255,89,59,26,255,181,109,32, +-255,210,121,35,255,212,121,41,255,171,116,52,255,15,14,12,142,0,8,14, +-13,11,170,219,177,112,255,231,187,124,255,228,180,111,255,205,158,90,255,79, +-58,32,255,38,29,19,255,49,35,22,255,167,114,46,255,217,146,62,255,219, +-154,70,255,169,117,56,255,15,13,12,156,0,8,8,8,7,71,104,80,45, +-255,224,183,119,255,232,191,127,255,210,166,97,255,81,60,32,255,39,30,18, +-255,52,40,25,255,175,128,66,255,225,173,98,255,228,180,105,255,226,175,95, +-255,29,25,18,255,0,8,12,12,11,170,208,138,55,255,222,145,63,255,220, +-139,59,255,193,121,50,255,68,50,29,255,38,28,19,255,48,35,23,255,175, +-112,44,255,217,142,54,255,217,144,66,255,191,137,66,255,19,16,12,170,0, +-8,9,8,8,74,111,82,40,255,216,155,75,255,226,172,95,255,200,151,81, +-255,57,41,26,255,27,23,16,255,35,28,18,255,41,32,20,255,39,30,20, +-255,25,22,16,227,15,14,10,142,0,12,10,9,7,28,33,24,14,227,135, +-81,28,255,206,117,31,255,210,108,33,255,208,110,31,255,171,92,28,255,49, +-33,16,252,13,11,8,68,0,8,11,10,8,170,195,108,30,255,212,118,35, +-255,217,137,52,255,42,33,23,255,0,12,20,18,15,170,214,156,81,255,221, +-148,62,255,214,127,43,255,23,19,12,238,0,8,10,10,7,159,196,109,31, +-255,213,119,36,255,212,123,37,255,31,24,14,255,0,12,15,14,10,170,209, +-137,60,255,228,172,99,255,230,189,119,255,28,26,19,255,0,8,12,12,11, +-170,208,134,55,255,218,137,51,255,214,127,43,255,35,27,16,255,0,20,16, +-14,11,170,199,116,34,255,217,132,48,255,224,166,83,255,32,26,19,255,0, +-8,10,10,7,34,81,58,34,255,224,178,105,255,226,172,95,255,129,92,40, +-255,9,9,8,170,6,6,6,85,6,6,5,113,35,27,16,255,204,117,33, +-255,208,117,29,255,110,69,25,255,14,12,7,108,0,8,10,10,7,170,195, +-112,30,255,211,115,30,255,211,115,30,255,30,23,13,255,0,12,14,12,9, +-170,196,113,31,255,211,120,32,255,214,126,41,255,33,26,18,255,0,8,9, +-8,6,28,44,33,19,212,60,42,23,255,46,35,21,255,74,53,31,255,156, +-109,53,255,216,167,97,255,228,179,109,255,229,177,110,255,227,184,108,255,168, +-123,69,255,23,21,16,227,9,8,8,28,0,12,17,16,14,170,134,98,51, +-255,223,166,92,255,132,100,53,255,9,9,8,133,0,20,16,15,13,170,219, +-177,112,255,232,191,133,255,231,195,132,255,40,33,23,255,0,20,6,6,5, +-45,39,32,22,255,210,129,49,255,172,106,35,255,20,17,13,227,11,11,8, +-28,0,100,17,17,14,170,221,189,132,255,235,205,154,255,234,205,155,255,42, +-39,29,255,0,16,9,9,8,25,0,20,9,8,8,25,0,20,14,14,11, +-170,208,141,61,255,224,168,87,255,228,174,103,255,31,26,20,221,0,4,13, +-12,12,130,218,185,127,255,234,202,147,255,232,198,139,255,40,33,25,255,0, +-20,17,17,14,176,140,115,71,255,230,202,147,255,232,202,149,255,218,170,101, +-255,200,124,43,255,198,117,37,255,198,117,37,255,196,116,37,255,72,52,27, +-255,12,11,9,170,0,28,8,8,7,85,37,31,20,255,174,110,41,255,210, +-123,39,255,204,120,37,255,130,87,31,255,15,13,10,190,0,28,5,5,4, +-113,28,26,19,255,210,143,65,255,220,163,81,255,217,166,92,255,222,173,97, +-255,225,176,98,255,42,37,25,255,4,4,4,74,0,56,13,12,10,170,208, +-141,61,255,226,172,95,255,228,183,111,255,40,34,25,255,0,24,17,16,14, +-170,219,177,112,255,232,194,133,255,233,202,148,255,27,24,20,255,0,8,16, +-15,13,85,199,161,102,255,220,166,89,255,211,143,62,255,217,154,72,255,223, +-161,80,255,224,169,91,255,225,185,114,255,229,188,124,255,231,190,132,255,231, +-200,143,255,227,195,140,255,227,196,138,255,225,195,136,255,44,37,27,170,0, +-8,17,16,14,85,200,165,109,255,227,198,142,255,225,191,132,255,227,195,134, +-255,231,199,136,255,231,197,132,255,231,194,124,255,229,191,130,255,225,195,136, +-255,225,195,136,255,225,191,132,255,49,42,30,198,0,36,18,17,13,105,193, +-135,66,255,221,175,102,255,222,186,123,255,223,190,132,255,224,192,135,255,223, +-190,132,255,222,186,123,255,221,178,110,255,218,172,105,255,46,39,27,195,0, +-48,6,6,6,28,27,26,20,255,216,170,97,255,225,178,104,255,176,136,83, +-255,16,15,13,198,0,16,17,17,14,170,221,188,130,255,235,205,154,255,234, +-205,155,255,232,204,149,255,228,199,143,255,171,144,96,255,64,57,41,255,154, +-126,81,255,227,189,122,255,230,184,119,255,227,171,98,255,34,30,21,255,0, +-24,17,16,14,170,221,186,126,255,234,202,147,255,232,192,135,255,44,39,27, +-255,0,44,9,9,8,142,25,24,20,255,114,95,53,255,207,169,102,255,227, +-187,118,255,226,188,123,255,178,148,95,255,19,18,16,170,0,32,24,22,19, +-85,197,145,84,255,227,187,118,255,231,194,124,255,207,173,114,255,61,55,38, +-255,8,8,8,136,0,12,10,10,9,108,45,36,21,255,195,116,38,255,207, +-122,38,255,139,90,32,255,13,12,8,170,0,4,10,10,9,198,208,140,59, +-255,226,170,91,255,231,193,128,255,40,35,27,255,0,36,4,4,3,28,18, +-17,13,227,222,189,131,255,234,201,143,255,229,191,130,255,34,30,23,204,0, +-8,11,11,10,170,211,158,82,255,226,170,91,255,224,165,81,255,219,154,70, +-255,208,132,51,255,206,128,45,255,204,122,41,255,201,120,40,255,196,116,37, +-255,111,74,30,255,20,18,13,227,8,8,7,28,0,28,6,6,6,28,28, +-26,21,255,222,186,123,255,229,196,132,255,181,144,92,255,16,15,13,212,0, +-16,6,6,6,85,25,24,20,255,180,149,101,255,231,205,154,255,232,204,149, +-255,227,198,142,255,223,192,138,255,223,193,136,255,230,199,139,255,232,197,141, +-255,211,176,122,255,64,57,41,255,8,8,7,113,0,8,6,6,5,14,33, +-31,24,227,186,155,107,255,232,204,149,255,233,205,152,255,227,197,140,255,221, +-189,132,255,224,192,135,255,228,198,141,255,232,201,141,255,232,192,135,255,231, +-197,132,255,41,35,26,255,0,64,17,16,14,139,211,178,120,255,233,202,148, +-255,233,202,148,255,56,48,33,255,4,4,4,85,0,104,11,11,10,255,216, +-164,89,255,230,191,123,255,227,195,134,255,40,35,27,227,0,28,16,15,13, +-227,126,105,69,255,217,176,112,255,225,175,104,255,223,159,76,255,189,124,49, +-255,43,35,20,255,9,8,8,57,0,8,10,10,9,133,194,109,33,255,215, +-125,38,255,212,124,39,255,144,93,33,255,29,24,16,255,68,53,29,255,186, +-123,49,255,128,95,47,255,25,24,20,255,143,119,78,255,230,201,145,255,33, +-30,24,255,0,8,11,11,10,170,217,176,112,255,228,182,109,255,222,158,75, +-255,212,134,51,255,204,122,41,255,198,117,37,255,200,118,37,255,208,123,39, +-255,212,123,37,255,214,121,39,255,217,133,50,255,24,21,15,244,0,8,11, +-11,10,170,218,185,127,255,235,203,148,255,233,202,148,255,230,201,145,255,227, +-197,140,255,221,187,128,255,221,184,120,255,224,178,105,255,224,164,85,255,189, +-129,58,255,39,32,20,255,7,7,6,85,0,8,11,10,8,125,194,109,33, +-255,215,125,38,255,213,125,40,255,29,24,16,255,0,40,17,17,14,170,221, +-188,130,255,235,201,152,255,232,201,141,255,42,36,27,255,0,12,17,17,14, +-170,219,179,116,255,231,187,124,255,228,183,111,255,24,22,17,255,0,8,11, +-11,10,170,218,185,127,255,232,197,137,255,227,179,104,255,219,155,72,255,208, +-132,51,255,204,122,41,255,202,120,39,255,38,31,19,170,0,16,12,11,9, +-170,196,110,33,255,215,113,38,255,213,122,42,255,215,143,58,255,217,166,92, +-255,222,186,123,255,225,195,136,255,52,44,33,198,0,16,17,16,14,170,211, +-150,70,255,219,140,56,255,213,126,42,255,25,21,14,255,0,40,17,17,14, +-170,221,187,128,255,232,199,141,255,228,180,111,255,219,155,72,255,207,128,44, +-255,199,119,39,255,200,118,37,255,208,123,39,255,212,123,37,255,214,125,39, +-255,212,124,39,255,34,26,15,181,0,8,11,10,10,161,215,172,104,255,234, +-201,143,255,234,206,151,255,42,39,29,255,0,40,12,11,9,170,196,110,33, +-255,215,125,38,255,212,124,39,255,36,28,17,170,0,8,15,14,10,85,194, +-109,33,255,215,125,38,255,212,124,39,255,210,128,41,255,211,135,54,255,225, +-176,98,255,231,197,132,255,56,48,33,255,4,4,4,85,0,20,17,16,14, +-170,206,135,51,255,217,133,50,255,213,122,42,255,25,21,14,255,0,32,12, +-11,9,170,196,110,33,255,215,125,38,255,213,122,42,255,67,51,28,255,6, +-6,5,255,40,34,25,255,226,190,127,255,138,110,69,255,7,7,7,255,25, +-24,20,255,221,179,112,255,232,191,127,255,232,201,141,255,26,23,19,255,0, +-8,11,11,10,170,214,168,101,255,230,187,119,255,228,188,117,255,212,173,105, +-255,150,118,67,255,102,86,47,255,111,90,50,255,185,145,88,255,227,187,118, +-255,231,195,132,255,232,201,141,255,26,23,19,255,0,8,11,11,10,170,219, +-184,128,255,235,205,154,255,234,206,151,255,42,36,27,255,0,12,15,15,12, +-170,213,158,80,255,228,182,109,255,230,191,123,255,27,23,18,255,0,8,11, +-11,10,170,219,189,132,255,235,205,154,255,232,197,141,255,225,185,114,255,215, +-155,78,255,206,135,51,255,205,126,42,255,209,128,42,255,212,121,41,255,181, +-111,36,255,39,30,18,255,8,8,7,57,0,8,10,10,9,136,194,109,33, +-255,215,125,38,255,212,124,39,255,24,20,13,255,0,12,15,14,12,170,210, +-146,71,255,229,183,110,255,231,197,132,255,26,23,19,255,0,8,11,11,10, +-170,218,189,127,255,234,199,143,255,231,197,132,255,225,176,106,255,214,153,75, +-255,208,138,55,255,205,133,48,255,210,127,45,255,214,134,49,255,179,119,42, +-255,37,30,18,255,7,7,6,85,0,12,23,20,14,227,161,115,50,255,222, +-167,89,255,227,186,114,255,225,190,130,255,223,198,136,255,227,198,142,255,224, +-196,141,255,221,191,134,255,161,130,86,255,33,30,24,229,10,10,9,42,0, +-24,15,15,12,170,211,149,76,255,228,182,109,255,231,189,128,255,44,39,27, +-255,0,24,17,17,14,170,216,170,97,255,226,172,95,255,224,165,81,255,31, +-26,18,255,0,12,13,12,10,170,201,120,40,255,217,133,50,255,216,125,45, +-255,25,21,14,212,0,8,11,10,8,144,203,130,52,255,224,166,83,255,228, +-174,103,255,40,34,25,255,0,12,17,16,14,170,221,187,128,255,234,201,143, +-255,230,191,123,255,28,25,19,244,0,8,10,10,9,164,203,122,50,255,220, +-148,63,255,217,141,52,255,23,20,14,255,0,8,14,13,11,108,10,10,9, +-28,0,4,13,13,12,170,221,189,134,255,235,205,154,255,234,206,151,255,42, +-37,27,255,0,24,11,11,10,255,222,189,131,255,232,195,131,255,224,162,81, +-255,36,29,19,255,4,4,4,54,0,28,7,7,6,28,19,17,12,232,93, +-66,30,255,183,112,36,255,209,122,38,255,212,120,39,255,159,102,34,255,22, +-19,13,255,7,7,6,85,0,24,6,6,5,28,17,16,14,227,149,122,84, +-255,227,195,140,255,227,191,134,255,179,142,90,255,17,16,14,227,5,5,4, +-25,0,20,15,14,12,170,204,129,49,255,218,141,51,255,213,126,42,255,25, +-21,14,255,0,24,8,7,7,91,68,48,25,255,205,127,44,255,220,153,75, +-255,99,78,44,255,8,8,7,113,0,28,12,11,9,170,196,110,33,255,215, +-125,38,255,212,124,39,255,24,20,13,255,0,124,9,9,8,25,0,40,2, +-2,1,23,9,8,6,255,199,116,34,255,215,125,38,255,212,128,45,255,27, +-24,16,207,0,8,11,11,10,170,219,184,128,255,235,205,154,255,234,205,155, +-255,58,49,35,255,5,5,4,85,0,4,4,4,3,28,16,15,11,227,204, +-122,41,255,215,126,40,255,210,123,39,255,32,25,15,170,0,8,13,13,12, +-122,208,168,99,255,234,199,143,255,234,204,151,255,63,54,38,255,5,5,4, +-85,0,4,4,4,3,28,18,17,13,215,204,127,45,255,214,125,39,255,212, +-121,41,255,34,27,15,170,0,8,13,12,10,85,185,112,34,255,215,125,38, +-255,212,123,37,255,35,28,16,255,4,4,3,85,0,4,3,3,2,28,12, +-10,9,224,198,117,37,255,215,125,38,255,212,124,39,255,34,27,15,178,0, +-8,14,13,11,113,206,162,94,255,232,199,141,255,234,207,155,255,63,53,36, +-255,4,4,3,113,0,4,3,3,3,28,10,10,9,255,200,118,37,255,215, +-125,38,255,210,123,39,255,27,22,14,227,0,12,3,3,2,6,13,11,8, +-221,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,5,4,4, +-57,0,12,15,14,12,147,206,154,87,255,232,195,137,255,234,204,151,255,63, +-54,38,255,5,5,4,85,0,4,4,4,3,28,18,16,13,227,222,189,131, +-255,235,205,152,255,234,205,155,255,27,24,20,255,0,8,11,11,10,170,219, +-184,130,255,235,205,152,255,234,205,155,255,58,49,35,255,5,5,4,85,0, +-4,4,4,3,28,14,12,9,227,199,117,36,255,215,113,38,255,210,123,39, +-255,32,25,15,170,0,8,12,12,9,102,194,109,33,255,215,125,38,255,212, +-124,39,255,27,22,14,255,0,24,18,16,13,170,217,176,110,255,234,196,143, +-255,234,204,151,255,27,24,20,255,0,8,11,10,10,170,204,134,59,255,219, +-136,54,255,213,122,42,255,72,50,27,255,8,8,7,255,25,22,14,255,195, +-116,38,255,208,123,39,255,142,91,31,255,16,14,9,193,4,4,3,17,0, +-12,11,11,8,170,198,117,37,255,219,133,56,255,221,152,70,255,27,23,16, +-221,0,8,13,12,10,99,193,113,34,255,223,156,70,255,231,193,128,255,40, +-34,25,255,4,3,3,113,17,16,12,227,208,136,59,255,45,36,21,255,4, +-3,3,113,10,9,7,207,196,110,33,255,215,125,38,255,210,128,41,255,32, +-25,15,170,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,124,39, +-255,35,27,16,255,4,4,3,85,0,4,3,3,2,28,12,11,9,227,199, +-117,36,255,221,150,66,255,229,191,126,255,32,29,23,210,0,8,13,13,12, +-122,204,150,79,255,223,159,76,255,217,141,52,255,84,57,29,255,9,8,6, +-170,5,5,4,85,6,6,5,113,27,22,14,255,207,128,44,255,223,147,72, +-255,227,187,118,255,34,30,23,207,0,8,12,11,11,170,218,180,119,255,229, +-184,114,255,224,167,85,255,50,40,25,255,5,5,4,85,0,4,4,4,3, +-28,14,12,9,227,203,125,42,255,217,128,48,255,213,128,45,255,35,27,16, +-173,0,8,12,12,11,130,209,163,98,255,235,203,148,255,233,202,148,255,63, +-54,36,255,5,5,4,85,0,4,4,4,3,28,15,15,12,227,209,137,60, +-255,221,151,68,255,219,147,62,255,23,20,14,238,0,8,10,10,9,150,196, +-121,41,255,217,128,48,255,215,133,44,255,40,31,19,255,5,5,5,85,0, +-4,4,4,3,28,16,14,11,207,201,120,40,255,217,133,50,255,221,161,76, +-255,57,44,28,170,0,8,15,14,12,105,211,165,98,255,232,197,137,255,232, +-199,141,255,58,49,35,255,4,4,3,113,0,40,3,3,2,17,12,11,9, +-227,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,4,4,3, +-62,0,12,12,11,9,170,200,120,41,255,223,159,76,255,230,191,123,255,44, +-37,27,255,0,12,18,17,15,170,208,140,59,255,217,133,50,255,213,125,40, +-255,27,23,14,195,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212, +-124,39,255,25,21,14,255,0,12,17,16,14,170,219,179,116,255,235,201,152, +-255,234,204,151,255,27,24,20,255,0,8,10,10,9,170,198,122,41,255,215, +-127,42,255,213,125,40,255,27,22,14,255,0,20,12,11,9,170,201,120,40, +-255,224,156,83,255,231,190,132,255,40,33,25,255,0,12,10,10,9,85,52, +-42,29,255,200,142,59,255,183,119,44,255,72,52,27,255,39,30,18,255,49, +-37,22,255,150,99,33,255,196,116,37,255,77,50,24,255,10,9,7,144,0, +-12,10,10,9,170,196,115,35,255,215,125,38,255,212,124,39,255,25,21,14, +-255,0,12,12,11,9,170,196,110,33,255,214,127,43,255,222,158,75,255,41, +-34,24,255,0,24,5,5,4,85,11,11,10,255,130,101,59,255,223,176,102, +-255,224,176,101,255,177,137,74,255,18,17,13,227,6,5,5,28,0,12,20, +-19,15,85,186,120,49,255,217,142,62,255,217,139,56,255,34,29,19,255,4, +-4,3,17,0,20,17,17,14,170,221,188,130,255,235,205,152,255,234,205,155, +-255,42,39,29,255,0,24,13,13,10,181,199,119,39,255,212,121,41,255,203, +-121,40,255,35,29,17,170,0,100,20,18,15,170,222,186,123,255,234,201,143, +-255,232,197,135,255,47,40,28,255,0,64,14,13,11,170,213,160,84,255,230, +-187,119,255,231,197,132,255,35,30,22,198,0,4,14,13,11,108,217,176,112, +-255,232,193,137,255,231,197,132,255,33,28,22,255,0,24,12,12,11,113,31, +-29,22,210,40,35,27,255,41,34,24,255,29,24,16,255,32,26,17,255,146, +-92,35,255,214,134,49,255,212,128,45,255,123,81,36,255,15,13,10,142,0, +-20,7,7,6,85,28,26,19,252,194,140,71,255,212,127,43,255,202,118,35, +-255,97,66,30,255,15,14,10,207,6,6,5,25,0,24,6,6,5,8,15, +-13,12,227,111,86,50,255,209,168,102,255,176,136,83,255,85,67,44,255,163, +-129,80,255,221,186,126,255,83,69,44,255,7,7,6,170,5,5,5,8,0, +-4,9,9,8,108,20,18,13,170,13,12,10,51,0,36,16,15,13,170,217, +-176,110,255,232,194,133,255,232,198,139,255,36,33,25,255,0,24,15,15,12, +-170,219,179,116,255,232,193,137,255,232,199,135,255,31,26,20,255,0,8,11, +-11,10,28,56,48,33,227,98,76,45,255,104,80,45,255,195,154,96,255,227, +-186,114,255,226,189,125,255,207,173,114,255,222,188,123,255,231,190,132,255,217, +-188,124,255,137,109,70,255,99,86,54,255,78,64,43,255,21,20,16,85,0, +-8,12,12,11,28,54,48,35,227,86,72,47,255,74,63,43,255,171,137,84, +-255,229,191,130,255,230,191,123,255,230,186,123,255,202,164,105,255,97,80,50, +-255,75,64,44,255,72,61,39,255,22,21,17,102,0,36,12,11,11,45,55, +-45,30,227,90,71,45,255,78,63,41,255,72,61,39,255,74,63,43,255,72, +-61,39,255,72,61,39,255,91,74,46,255,78,63,41,255,22,20,17,102,0, +-48,12,12,11,176,132,106,61,255,228,188,125,255,210,172,113,255,42,37,29, +-255,9,9,8,62,0,16,17,16,14,170,221,186,124,255,234,199,143,255,232, +-201,141,255,232,201,141,255,221,189,134,255,52,46,33,255,6,7,6,227,24, +-23,17,255,208,132,51,255,215,133,44,255,212,124,39,255,24,20,13,255,0, +-24,17,16,12,170,219,177,112,255,231,187,124,255,228,182,109,255,40,33,23, +-255,0,36,9,9,8,74,17,15,12,227,67,51,28,255,162,107,43,255,200, +-142,67,255,204,157,91,255,177,140,86,255,74,63,43,255,19,17,16,198,9, +-9,8,28,0,32,14,14,11,31,56,46,31,227,192,157,103,255,229,194,128, +-255,225,188,124,255,146,112,67,255,11,10,8,164,0,8,7,7,6,28,34, +-27,17,255,190,107,33,255,210,121,35,255,146,95,35,255,16,14,11,187,0, +-8,9,9,8,170,214,164,93,255,232,194,127,255,231,195,132,255,40,34,25, +-255,0,40,13,13,10,170,213,157,84,255,224,166,83,255,221,150,66,255,23, +-20,14,246,0,8,12,11,9,113,194,109,33,255,212,119,37,255,210,113,35, +-255,168,103,33,255,56,42,23,255,27,23,14,255,38,31,19,255,149,92,30, +-255,207,118,32,255,207,113,30,255,124,75,27,255,13,11,8,161,0,28,12, +-12,11,176,130,99,59,255,229,191,126,255,211,174,116,255,43,37,28,255,9, +-9,8,59,0,16,8,8,7,85,68,58,37,255,214,177,119,255,231,196,136, +-255,207,171,114,255,97,80,50,255,54,47,35,255,66,59,41,255,178,148,95, +-255,228,189,121,255,224,187,123,255,146,112,67,255,12,12,11,170,0,12,10, +-10,9,28,16,15,13,147,29,28,22,221,48,42,31,255,70,61,41,255,66, +-57,39,255,70,61,41,255,171,140,92,255,224,170,101,255,224,168,87,255,224, +-165,81,255,39,32,22,255,0,64,14,13,11,57,100,82,51,255,222,186,123, +-255,226,172,95,255,113,82,38,255,9,8,8,127,0,32,11,9,6,102,11, +-10,6,170,11,10,8,170,12,11,9,170,15,13,10,170,15,13,10,170,15, +-14,10,170,18,15,11,170,18,15,11,156,12,11,9,28,0,28,6,6,5, +-65,40,34,25,255,224,183,119,255,229,195,136,255,171,140,92,255,21,20,18, +-142,0,24,11,10,8,102,131,92,46,255,213,145,56,255,214,119,43,255,210, +-128,41,255,151,94,32,255,23,21,14,255,10,10,9,85,0,12,10,9,7, +-170,191,106,30,255,211,115,30,255,208,114,31,255,141,87,30,255,36,31,19, +-255,121,90,42,255,217,168,92,255,205,163,102,255,132,102,59,255,213,172,108, +-255,231,193,128,255,35,30,22,255,0,8,11,11,10,164,203,129,50,255,215, +-127,42,255,211,117,34,255,166,97,29,255,54,40,21,255,29,23,14,255,38, +-31,19,255,120,78,29,255,206,118,33,255,214,127,43,255,224,155,81,255,23, +-21,16,255,0,8,11,10,10,170,217,183,116,255,234,201,143,255,232,198,139, +-255,202,166,109,255,97,78,50,255,52,46,33,255,58,50,33,255,150,96,39, +-255,208,121,37,255,195,112,30,255,83,53,24,255,9,8,6,113,0,8,13, +-12,8,96,189,104,28,255,210,120,33,255,214,132,45,255,34,29,19,255,0, +-40,17,16,12,170,217,172,102,255,228,180,105,255,228,181,107,255,40,33,23, +-255,0,12,17,15,12,170,216,171,101,255,232,191,127,255,231,197,132,255,24, +-22,17,255,0,8,11,11,10,167,209,146,72,255,221,151,68,255,213,126,42, +-255,172,106,35,255,57,41,22,255,42,32,19,255,43,33,20,252,18,15,11, +-85,0,16,11,10,8,170,193,111,30,255,215,113,38,255,220,144,63,255,197, +-145,84,255,91,71,44,255,75,62,42,255,75,64,44,255,22,21,17,99,0, +-16,14,13,11,170,196,110,33,255,210,115,31,255,210,115,31,255,22,19,11, +-227,0,8,16,13,9,113,24,21,15,170,17,15,12,170,18,15,13,170,19, +-17,12,142,9,8,8,28,0,8,14,13,11,170,210,146,71,255,220,142,59, +-255,213,125,40,255,168,103,33,255,54,40,21,255,29,23,14,255,38,31,19, +-255,119,78,30,255,204,116,31,255,210,119,31,255,210,115,31,255,26,20,13, +-210,0,8,11,11,10,170,217,179,120,255,234,202,147,255,232,201,141,255,40, +-35,25,255,0,40,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31, +-255,36,25,13,170,0,8,14,12,9,85,190,105,29,255,210,107,31,255,208, +-114,31,255,187,124,42,255,143,111,56,255,210,171,109,255,229,187,128,255,131, +-99,54,255,8,8,7,156,0,20,13,12,10,170,194,112,31,255,210,107,31, +-255,210,115,31,255,22,19,11,255,0,32,11,10,8,170,193,111,30,255,215, +-125,38,255,218,141,59,255,39,33,22,255,5,5,5,28,12,12,11,170,156, +-126,83,255,27,24,20,227,5,5,5,23,14,13,11,198,219,177,112,255,232, +-191,127,255,230,191,123,255,25,22,16,249,0,8,11,10,8,153,200,120,41, +-255,214,127,43,255,213,126,42,255,93,66,32,255,11,11,10,255,34,31,23, +-255,206,152,81,255,226,179,111,255,231,189,128,255,232,192,135,255,232,201,141, +-255,25,22,18,255,0,8,11,10,10,170,215,171,102,255,228,174,105,255,222, +-158,75,255,27,24,16,255,0,12,15,15,12,170,219,177,112,255,232,193,137, +-255,232,201,141,255,25,22,18,255,0,8,11,10,10,170,215,172,104,255,228, +-182,109,255,221,155,70,255,177,114,46,255,55,42,24,255,35,28,18,255,41, +-31,18,255,35,28,17,255,27,22,14,255,17,16,12,187,9,9,8,79,0, +-12,10,9,7,170,191,106,30,255,211,115,30,255,210,115,31,255,33,25,14, +-255,0,12,21,20,16,170,221,180,116,255,232,193,137,255,232,201,141,255,25, +-22,18,255,0,8,11,11,10,170,212,160,85,255,224,156,83,255,218,141,59, +-255,175,115,44,255,55,42,24,255,31,25,16,255,38,30,19,255,127,82,30, +-255,204,116,31,255,195,112,30,255,82,55,25,255,11,10,8,150,0,12,9, +-9,8,28,15,14,12,142,28,25,19,221,46,40,29,255,71,60,38,255,66, +-57,39,255,70,61,41,255,193,159,106,255,227,184,108,255,221,153,72,255,155, +-98,36,255,13,12,10,170,0,24,17,15,12,170,219,180,112,255,232,197,137, +-255,232,201,141,255,40,35,25,255,0,24,14,13,11,170,198,117,37,255,213, +-124,38,255,210,121,35,255,23,19,12,255,0,12,11,10,8,170,193,111,30, +-255,211,115,30,255,208,114,31,255,23,19,12,207,0,8,14,13,11,85,181, +-132,68,255,228,185,117,255,231,193,128,255,54,46,31,255,5,5,4,8,0, +-8,21,20,16,178,215,160,88,255,223,147,72,255,206,135,51,255,23,20,14, +-170,0,8,12,11,9,102,192,111,31,255,210,108,33,255,208,114,31,255,22, +-18,11,255,0,4,10,10,9,113,79,61,38,255,17,16,12,198,0,4,16, +-15,13,170,219,179,116,255,231,187,124,255,224,169,91,255,33,28,20,255,0, +-20,9,8,8,85,39,33,24,255,217,166,92,255,219,140,56,255,210,121,35, +-255,66,44,21,255,7,7,6,133,0,32,6,6,5,74,19,18,12,255,183, +-102,30,255,207,105,30,255,210,111,31,255,73,51,24,255,8,8,7,116,0, +-24,6,6,6,28,15,13,12,227,144,112,61,255,221,180,116,255,224,178,113, +-255,152,116,65,255,18,17,13,221,8,8,7,28,0,24,12,10,9,170,193, +-111,30,255,210,107,31,255,210,115,31,255,22,19,11,255,0,28,16,15,13, +-227,164,122,63,255,225,185,114,255,192,153,97,255,21,19,16,232,7,7,6, +-28,0,24,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,255,23, +-19,12,255,0,148,6,6,5,51,11,9,6,85,12,10,7,102,10,8,5, +-156,10,8,5,127,8,7,5,184,27,22,12,255,198,105,29,255,211,122,36, +-255,220,136,61,255,25,22,16,255,0,8,10,10,9,170,218,181,123,255,234, +-202,147,255,232,197,141,255,30,27,21,255,0,12,9,8,6,170,191,106,30, +-255,211,115,30,255,210,111,31,255,39,27,14,170,0,8,12,11,11,170,218, +-180,119,255,234,196,143,255,232,201,141,255,29,26,20,255,0,12,7,7,6, +-28,27,22,14,156,25,22,14,255,32,25,15,210,22,18,11,28,0,8,10, +-9,7,150,195,112,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0, +-12,9,9,8,170,191,106,30,255,211,111,30,255,208,114,31,255,25,20,12, +-204,0,8,12,11,11,170,218,180,119,255,234,202,147,255,232,201,141,255,142, +-111,63,255,14,12,9,227,10,9,7,127,8,7,5,181,35,25,14,255,199, +-112,28,255,209,118,30,255,209,117,28,255,30,22,13,255,0,16,9,8,6, +-167,191,106,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,16,21, +-19,16,170,220,178,113,255,232,197,137,255,232,201,141,255,26,23,19,255,0, +-12,11,11,10,170,218,181,123,255,234,201,143,255,231,197,132,255,24,22,17, +-255,0,8,11,10,10,170,218,181,123,255,234,201,143,255,231,197,132,255,30, +-26,21,255,0,12,9,8,6,167,191,106,30,255,211,115,30,255,210,111,31, +-255,39,27,14,170,0,8,13,12,8,85,190,105,29,255,213,119,36,255,214, +-132,45,255,32,26,17,255,0,24,17,16,14,170,221,186,124,255,234,202,147, +-255,232,199,135,255,25,22,18,252,0,8,11,10,8,127,192,111,31,255,210, +-107,31,255,208,114,31,255,161,94,28,255,65,43,20,255,145,85,26,255,207, +-117,30,255,122,75,29,255,15,14,10,170,5,5,4,8,0,16,11,10,8, +-170,196,115,35,255,223,146,70,255,228,183,111,255,25,22,16,252,0,8,14, +-12,9,85,190,105,29,255,215,125,38,255,218,141,59,255,30,24,17,195,0, +-4,10,10,7,170,193,111,30,255,20,17,11,252,0,4,11,10,8,85,188, +-103,27,255,211,115,30,255,209,106,30,255,39,27,14,170,0,8,13,12,8, +-85,190,105,29,255,211,115,30,255,210,115,31,255,19,15,10,255,0,12,9, +-8,6,167,192,111,31,255,218,137,51,255,227,175,100,255,27,24,18,255,0, +-8,11,10,8,147,196,106,33,255,210,108,33,255,210,115,31,255,30,23,13, +-255,4,4,3,14,0,8,15,14,12,195,211,149,76,255,229,184,114,255,232, +-199,135,255,28,25,19,255,0,8,11,10,8,167,203,129,50,255,215,127,42, +-255,210,121,35,255,20,17,11,232,0,12,9,8,6,139,190,105,29,255,211, +-111,30,255,209,114,30,255,30,22,13,198,0,8,13,12,10,170,217,173,104, +-255,232,193,137,255,232,194,139,255,25,22,18,255,0,12,9,8,8,156,192, +-111,31,255,210,108,33,255,210,115,31,255,32,24,13,173,0,8,13,12,8, +-88,190,105,29,255,211,115,30,255,208,114,31,255,19,15,10,255,0,12,7, +-7,6,28,27,22,14,198,45,36,21,255,52,43,29,244,14,13,11,85,0, +-8,13,13,12,88,177,143,90,255,230,194,131,255,226,172,95,255,137,91,36, +-255,10,9,7,227,8,8,5,161,10,9,7,167,10,9,7,136,13,10,6, +-85,7,6,6,74,0,24,9,8,6,167,191,106,30,255,211,115,30,255,210, +-115,31,255,19,15,10,252,0,16,12,11,9,170,208,141,61,255,230,187,119, +-255,232,201,141,255,40,34,25,255,0,12,14,12,9,170,196,109,31,255,210, +-107,31,255,210,115,31,255,36,25,13,170,0,8,10,9,7,85,155,91,28, +-255,208,114,31,255,209,106,30,255,30,22,13,255,0,12,22,21,17,176,222, +-186,123,255,234,199,143,255,226,195,135,255,35,29,22,178,0,8,12,11,9, +-105,190,105,29,255,211,115,30,255,208,114,31,255,23,19,12,210,0,8,15, +-12,8,59,7,6,4,3,0,4,9,9,8,159,204,134,59,255,230,182,119, +-255,232,198,139,255,39,33,24,255,0,16,10,10,9,34,15,14,10,198,52, +-40,21,255,165,96,28,255,198,113,29,255,185,102,28,255,80,53,25,255,19, +-17,12,227,10,9,7,76,0,16,11,10,8,170,195,112,30,255,211,115,30, +-255,210,115,31,255,20,16,11,255,0,12,10,9,7,170,192,111,31,255,215, +-125,38,255,224,159,83,255,41,33,24,255,0,24,7,7,6,108,24,20,13, +-255,146,88,31,255,195,127,38,255,113,77,34,255,15,14,12,210,7,7,6, +-28,0,16,12,12,11,28,37,30,18,227,168,99,31,255,206,114,33,255,51, +-34,18,255,6,5,5,71,0,20,17,16,14,170,221,186,124,255,234,202,147, +-255,232,201,141,255,40,35,25,255,0,24,17,15,10,227,198,105,29,255,194, +-109,33,255,62,44,23,255,16,14,11,85,0,100,19,17,12,142,214,171,97, +-255,228,183,113,255,227,186,108,255,50,40,25,227,0,64,12,11,9,198,214, +-158,85,255,229,183,110,255,228,181,107,255,21,19,14,249,2,2,1,20,8, +-8,7,181,210,156,79,255,226,169,95,255,224,155,81,255,33,26,18,255,4, +-4,4,28,0,40,3,3,2,28,11,10,8,255,209,138,62,255,223,154,72, +-255,221,164,82,255,27,23,16,249,0,16,7,7,6,79,46,38,25,255,197, +-151,84,255,222,161,89,255,209,128,42,255,141,91,32,255,15,13,10,218,5, +-5,5,11,0,28,15,13,10,139,191,131,60,255,220,168,93,255,168,123,69, +-255,14,13,11,227,5,5,5,85,9,9,8,170,105,78,40,255,162,116,61, +-255,88,66,37,255,23,21,16,255,11,11,10,255,78,58,35,255,208,150,75, +-255,61,46,28,181,0,36,15,13,10,170,216,170,97,255,230,187,119,255,228, +-178,113,255,34,28,19,255,0,24,15,13,10,170,215,167,92,255,229,179,114, +-255,228,181,107,255,32,27,19,255,0,16,6,6,6,25,5,5,4,198,52, +-42,27,255,220,169,97,255,189,142,76,255,35,31,22,255,134,96,51,255,225, +-176,106,255,140,106,53,255,6,6,5,255,6,6,6,51,0,28,5,5,5, +-28,15,13,10,227,208,136,59,255,218,138,53,255,213,122,42,255,43,31,18, +-255,5,5,4,85,0,136,9,8,8,57,57,47,30,255,212,163,93,255,224, +-157,85,255,124,90,45,255,10,10,9,147,0,20,15,13,10,170,216,170,97, +-255,228,181,107,255,224,165,81,255,194,136,61,255,58,46,29,255,12,12,11, +-85,0,4,10,9,7,156,174,91,23,255,202,103,23,255,202,102,21,255,20, +-16,9,255,0,24,15,13,10,170,213,155,80,255,227,175,100,255,227,171,98, +-255,35,29,20,255,0,32,7,7,6,85,49,33,18,255,183,108,34,255,209, +-128,42,255,209,137,60,255,186,134,67,255,95,74,39,255,22,20,15,229,8, +-8,7,105,0,44,5,4,4,28,17,15,12,227,216,167,89,255,228,181,107, +-255,223,176,102,255,34,28,19,184,0,8,12,11,9,108,180,106,33,255,214, +-125,39,255,217,141,52,255,42,33,21,255,4,4,4,85,0,8,11,10,8, +-198,211,149,76,255,224,160,77,255,220,144,63,255,34,27,17,255,0,40,12, +-10,7,170,189,99,26,255,206,102,25,255,203,100,24,255,30,21,11,176,0, +-8,12,10,7,85,167,87,22,255,202,103,23,255,202,102,21,255,27,20,10, +-255,4,4,3,68,0,4,4,4,4,28,12,10,7,215,176,91,23,255,203, +-104,24,255,202,105,27,255,28,21,13,249,0,24,9,8,8,57,57,47,30, +-255,213,167,94,255,228,184,115,255,126,92,47,255,9,9,8,147,0,20,13, +-12,10,167,199,131,58,255,220,148,63,255,219,147,62,255,49,38,24,255,6, +-6,6,85,0,4,5,5,5,28,15,14,12,227,217,169,94,255,228,183,111, +-255,225,174,102,255,31,25,18,241,0,36,5,5,5,28,15,13,10,227,204, +-127,45,255,219,133,56,255,221,150,66,255,35,28,18,255,0,68,10,9,9, +-85,45,34,21,255,201,110,30,255,192,100,25,255,57,35,16,255,12,10,7, +-85,0,24,13,11,6,79,126,68,21,255,191,100,26,255,198,117,37,255,208, +-139,65,255,213,155,80,255,214,161,85,255,215,167,92,255,216,167,89,255,215, +-160,88,255,49,38,24,170,0,24,7,7,6,76,45,36,24,249,207,164,90, +-255,228,183,111,255,143,111,56,255,13,12,10,170,0,28,13,12,8,142,182, +-99,25,255,203,108,24,255,202,102,21,255,112,65,23,255,15,13,8,227,6, +-6,5,45,0,16,10,8,7,170,171,89,22,255,202,95,23,255,202,103,23, +-255,103,64,26,255,20,18,13,255,79,61,36,255,222,173,97,255,227,179,104, +-255,224,172,97,255,226,171,99,255,224,176,93,255,36,29,19,207,0,8,12, +-10,7,113,176,91,23,255,202,95,23,255,202,102,21,255,27,20,10,255,4, +-4,3,74,0,4,4,4,4,28,11,9,6,215,187,101,24,255,216,134,45, +-255,226,172,95,255,23,21,16,241,0,8,10,10,9,161,212,160,85,255,226, +-172,95,255,222,158,75,255,51,39,24,255,6,6,6,85,0,4,4,4,3, +-28,11,10,6,215,176,91,23,255,202,102,21,255,191,102,22,255,22,17,9, +-170,0,8,12,10,7,85,167,87,22,255,204,105,25,255,217,133,50,255,35, +-28,18,255,0,40,15,13,10,170,199,116,34,255,212,114,35,255,218,139,55, +-255,33,27,18,255,0,12,15,13,10,170,213,160,84,255,227,175,100,255,224, +-165,81,255,25,21,14,235,0,8,13,11,8,108,184,96,25,255,203,96,24, +-255,202,95,23,255,27,20,10,255,4,4,3,71,0,28,10,9,7,170,187, +-101,24,255,216,134,45,255,224,167,85,255,54,42,27,255,6,6,6,85,0, +-28,10,9,7,170,171,89,22,255,202,103,23,255,202,102,21,255,29,21,10, +-170,0,4,11,9,6,42,137,77,24,255,211,136,56,255,215,167,92,255,216, +-166,95,255,213,163,84,255,33,28,18,161,0,8,11,10,8,130,184,100,25, +-255,203,100,24,255,202,102,21,255,27,20,10,255,4,4,3,74,0,4,4, +-4,4,28,11,9,6,215,176,91,23,255,202,103,23,255,202,95,23,255,28, +-21,11,190,0,8,10,10,9,161,212,161,89,255,228,174,105,255,223,161,80, +-255,33,28,18,255,0,40,10,9,7,167,171,89,22,255,202,103,23,255,202, +-102,21,255,29,21,10,170,0,8,12,10,7,85,167,87,22,255,202,103,23, +-255,203,108,24,255,68,47,25,255,6,6,5,255,31,26,20,255,220,168,93, +-255,220,177,101,255,110,80,41,255,12,11,9,150,0,16,10,9,7,170,171, +-89,22,255,202,103,23,255,202,102,21,255,20,16,9,255,0,32,10,9,7, +-170,193,111,30,255,219,136,54,255,224,165,81,255,27,24,16,255,0,4,7, +-7,7,28,21,20,16,181,10,10,9,85,0,4,12,11,9,170,204,130,51, +-255,218,141,51,255,211,122,36,255,32,23,13,187,0,8,13,11,8,85,167, +-87,22,255,203,100,24,255,208,105,29,255,23,19,12,255,4,4,3,28,11, +-10,8,181,211,158,82,255,229,183,110,255,228,183,111,255,228,183,113,255,228, +-181,107,255,27,23,16,229,0,8,10,10,9,150,192,111,31,255,208,112,27, +-255,203,108,24,255,21,17,10,255,0,12,15,13,10,170,216,170,97,255,229, +-183,110,255,228,181,107,255,25,21,16,235,0,8,11,10,8,142,194,116,33, +-255,209,106,30,255,203,108,24,255,27,20,10,255,4,4,3,74,0,36,10, +-8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,42,28,13,255,6, +-5,5,48,0,4,6,6,6,28,21,19,14,255,221,175,102,255,229,179,114, +-255,228,181,107,255,24,20,15,246,0,8,12,11,9,127,190,104,27,255,206, +-106,25,255,202,103,23,255,27,20,10,255,4,4,3,74,0,4,4,4,4, +-28,11,10,6,215,176,91,23,255,204,105,25,255,207,122,38,255,28,22,15, +-238,0,36,5,5,5,28,15,13,10,227,195,111,28,255,204,105,25,255,197, +-100,22,255,22,17,9,224,0,24,15,13,10,170,216,170,97,255,229,184,114, +-255,228,181,107,255,34,28,19,255,0,24,10,9,7,170,174,91,23,255,202, +-103,23,255,202,102,21,255,20,16,9,252,0,12,10,9,7,170,171,89,22, +-255,202,107,23,255,206,111,27,255,22,17,11,252,0,8,8,7,7,45,73, +-59,36,255,218,174,105,255,228,178,107,255,89,67,36,255,7,7,6,113,0, +-4,5,5,4,28,20,18,13,255,199,110,30,255,202,105,27,255,88,54,23, +-255,10,9,7,113,0,8,13,11,6,85,167,87,22,255,202,95,23,255,202, +-90,23,255,32,24,13,255,4,4,3,178,19,16,12,238,212,163,93,255,66, +-52,31,255,5,5,5,184,14,13,11,255,205,133,48,255,212,114,35,255,208, +-117,29,255,29,22,14,255,0,16,12,11,9,85,101,74,38,255,189,121,49, +-255,185,104,32,255,180,98,25,255,180,93,23,255,154,82,23,255,75,44,18, +-255,11,9,6,144,0,32,10,9,7,170,157,79,22,255,202,102,21,255,202, +-102,21,255,22,17,9,255,0,28,14,13,11,224,136,98,53,255,217,165,82, +-255,213,145,56,255,150,92,35,255,19,16,12,173,5,5,5,8,0,28,10, +-8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,20,16,9,252,0, +-28,7,7,6,59,43,35,24,255,221,175,102,255,223,178,106,255,134,98,51, +-255,14,13,11,142,0,24,10,9,7,167,171,89,22,255,202,103,23,255,202, +-102,21,255,20,16,9,255,0,144,12,10,7,170,46,29,13,255,140,74,21, +-255,165,86,22,255,167,87,22,255,165,86,22,255,167,87,22,255,185,95,22, +-255,198,97,23,255,206,111,27,255,221,146,66,255,23,19,14,249,0,8,10, +-10,9,153,212,161,89,255,229,183,110,255,224,165,81,255,28,23,15,255,0, +-12,10,8,7,156,171,89,22,255,202,103,23,255,202,102,21,255,31,21,10, +-170,0,8,10,10,9,167,212,160,85,255,228,177,105,255,222,158,75,255,27, +-23,16,255,0,40,10,8,7,170,167,87,22,255,202,103,23,255,202,102,21, +-255,20,16,9,238,0,12,10,8,7,164,171,89,22,255,202,103,23,255,203, +-100,24,255,22,18,11,235,0,8,10,10,9,167,214,164,93,255,228,182,109, +-255,223,154,80,255,207,120,36,255,189,94,24,255,167,87,22,255,167,87,22, +-255,187,96,22,255,198,93,23,255,202,93,21,255,198,96,21,255,26,19,9, +-227,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +-15,9,252,0,16,17,15,12,170,216,170,97,255,229,183,110,255,224,164,85, +-255,29,24,16,255,3,3,2,28,0,8,12,11,9,198,211,149,76,255,221, +-151,68,255,219,146,60,255,22,19,13,246,0,8,10,10,9,161,210,155,77, +-255,223,147,72,255,213,122,42,255,23,18,12,255,0,12,10,8,7,167,171, +-89,22,255,202,103,23,255,202,102,21,255,29,21,10,170,0,8,12,10,7, +-85,166,87,23,255,209,118,30,255,218,139,55,255,33,27,18,255,0,24,15, +-13,10,170,215,159,92,255,226,169,95,255,218,141,59,255,34,26,15,190,0, +-8,13,10,6,85,167,87,22,255,202,103,23,255,198,96,21,255,197,96,22, +-255,189,97,22,255,198,96,21,255,198,96,21,255,25,19,10,255,4,4,3, +-28,0,20,10,9,7,170,178,92,23,255,210,107,31,255,215,128,44,255,33, +-24,14,193,0,8,12,10,7,85,167,87,22,255,202,95,23,255,202,103,23, +-255,32,22,11,170,0,4,10,8,7,170,171,89,22,255,24,17,9,249,0, +-4,12,10,7,85,163,82,22,255,202,103,23,255,202,102,21,255,29,21,10, +-170,0,8,12,10,7,85,166,87,23,255,202,103,23,255,202,102,21,255,20, +-15,9,255,0,12,10,8,7,167,170,89,23,255,206,106,25,255,208,115,33, +-255,28,21,13,207,0,8,13,10,6,85,167,87,22,255,202,95,23,255,202, +-102,21,255,20,16,9,255,0,12,15,13,10,170,214,158,85,255,229,183,110, +-255,228,185,111,255,24,20,15,249,0,8,12,11,9,108,176,91,23,255,202, +-95,23,255,202,102,21,255,18,15,9,255,2,2,1,8,0,8,8,7,5, +-184,171,89,22,255,202,95,23,255,202,102,21,255,34,23,11,173,0,8,12, +-11,9,136,212,160,85,255,228,180,105,255,225,165,88,255,31,25,18,255,3, +-3,2,28,0,8,8,7,5,178,171,89,22,255,202,103,23,255,202,102,21, +-255,30,21,11,170,0,8,12,10,7,85,167,87,22,255,202,103,23,255,202, +-102,21,255,20,15,9,255,0,40,7,7,6,28,30,27,21,238,167,111,50, +-255,206,110,33,255,199,102,24,255,175,90,22,255,165,86,22,255,167,87,22, +-255,167,87,22,255,161,87,22,255,84,48,19,255,18,15,9,227,8,7,5, +-28,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +-15,9,252,0,16,15,13,10,170,211,159,76,255,229,180,110,255,228,182,109, +-255,34,28,19,255,0,12,10,9,7,170,171,89,22,255,202,103,23,255,202, +-102,21,255,31,22,10,170,0,8,7,6,6,28,48,31,15,255,189,93,22, +-255,202,102,21,255,45,29,14,255,5,5,4,113,0,4,5,5,4,28,22, +-20,15,255,220,169,97,255,226,178,103,255,167,118,54,255,15,13,10,133,0, +-8,13,11,6,85,167,87,22,255,202,103,23,255,202,102,21,255,19,15,8, +-215,0,4,11,9,6,105,121,65,20,255,26,18,9,190,0,4,9,9,8, +-167,208,150,75,255,229,183,110,255,228,181,113,255,37,29,20,255,0,24,8, +-8,5,218,167,87,22,255,202,93,21,255,198,104,21,255,23,18,10,255,3, +-3,2,51,0,20,10,9,7,153,171,89,22,255,202,95,23,255,202,102,21, +-255,20,15,9,255,2,2,1,17,0,8,8,7,5,181,184,100,25,255,215, +-119,42,255,224,160,85,255,34,28,19,255,0,20,9,8,6,85,31,22,12, +-255,166,87,23,255,189,97,22,255,99,60,22,255,15,13,8,170,0,28,4, +-3,3,23,13,11,8,227,182,94,23,255,149,87,26,255,19,17,12,227,7, +-7,7,23,0,16,15,13,10,170,216,170,97,255,229,179,114,255,228,182,109, +-255,34,28,19,255,0,20,9,8,6,130,69,42,18,255,195,95,22,255,35, +-24,12,255,5,5,4,76,0,104,10,9,7,28,27,24,16,184,32,27,19, +-255,39,29,20,212,13,12,10,85,0,60,13,11,8,170,81,54,28,255,216, +-148,67,255,223,161,72,255,220,147,61,255,117,76,32,255,13,11,8,255,44, +-33,19,255,207,123,40,255,217,136,50,255,218,142,53,255,156,100,39,255,18, +-15,11,227,10,8,7,28,0,12,15,13,8,125,19,14,10,170,14,11,7, +-170,10,8,7,170,11,9,6,122,13,10,8,85,8,7,5,153,46,33,21, +-255,212,138,51,255,221,151,68,255,191,132,62,255,19,17,12,176,0,12,7, +-7,6,76,26,22,15,241,189,129,58,255,219,152,72,255,217,154,72,255,133, +-87,38,255,15,13,10,221,6,6,5,28,0,8,15,12,8,113,20,16,11, +-170,17,14,10,142,7,6,6,28,0,8,19,16,12,170,200,117,35,255,212, +-123,37,255,115,74,30,255,9,8,6,113,0,8,12,11,9,178,104,73,37, +-255,206,147,63,255,178,121,53,255,58,46,29,255,46,36,25,255,40,32,21, +-252,19,17,12,85,0,36,12,10,9,164,191,131,60,255,223,161,80,255,221, +-151,68,255,46,34,21,255,4,4,3,3,0,20,19,16,12,173,208,134,55, +-255,223,156,70,255,216,160,81,255,21,19,14,255,0,16,6,5,5,25,17, +-14,10,227,67,48,28,255,94,67,35,255,20,17,13,227,6,6,5,113,12, +-11,9,198,67,51,30,255,85,62,32,255,25,20,14,255,9,8,6,82,0, +-32,10,8,5,170,161,87,22,255,195,90,20,255,187,91,20,255,19,14,8, +-255,0,28,15,12,8,119,20,16,11,170,17,14,10,156,10,8,7,28,0, +-64,15,12,8,122,18,15,11,170,17,14,10,144,10,8,7,28,0,16,13, +-12,10,170,157,96,36,255,211,123,38,255,199,116,34,255,31,24,16,255,6, +-6,6,28,0,20,16,13,11,170,197,110,32,255,209,110,30,255,202,103,23, +-255,58,36,15,255,8,7,5,113,0,8,10,8,5,85,137,68,18,255,185, +-86,20,255,174,88,19,255,18,13,7,255,0,24,12,10,9,170,204,129,49, +-255,220,144,63,255,217,133,50,255,26,20,13,255,0,28,7,6,6,76,23, +-19,12,244,185,113,36,255,207,129,52,255,173,117,50,255,59,46,28,255,18, +-15,13,198,9,9,8,113,6,6,6,11,0,24,15,12,8,133,22,17,11, +-170,17,14,10,142,8,7,5,28,0,12,9,8,6,170,202,128,49,255,220, +-148,63,255,219,140,56,255,22,19,13,255,0,8,12,10,9,170,200,125,37, +-255,218,141,51,255,220,147,61,255,138,86,35,255,13,10,8,227,11,9,6, +-170,13,11,8,198,61,41,22,255,202,111,31,255,204,105,25,255,200,105,21, +-255,22,17,9,221,0,12,11,9,6,108,14,11,7,170,11,9,6,139,6, +-5,3,17,0,12,9,7,6,133,144,75,19,255,185,86,20,255,178,86,19, +-255,27,18,8,170,0,8,11,9,6,85,134,70,19,255,181,88,20,255,180, +-87,19,255,24,15,7,178,0,12,10,8,5,99,165,86,22,255,206,111,27, +-255,213,124,38,255,36,27,17,255,0,24,10,10,9,133,167,112,48,255,222, +-166,77,255,223,157,72,255,54,39,23,255,5,5,4,37,0,20,13,11,8, +-170,181,93,22,255,206,111,27,255,214,127,43,255,20,16,11,255,0,12,9, +-8,8,170,203,129,50,255,222,145,63,255,220,147,61,255,33,26,16,255,0, +-12,12,10,7,113,15,12,8,170,13,10,8,122,0,16,10,8,7,170,200, +-120,41,255,220,142,59,255,219,146,60,255,27,21,14,255,0,12,13,11,8, +-113,18,15,11,170,17,14,10,142,8,7,5,28,0,12,14,12,9,113,20, +-15,11,170,17,14,10,153,10,8,7,28,0,16,9,8,6,85,29,21,10, +-255,119,62,20,255,153,79,20,255,40,25,11,255,9,8,6,85,0,20,10, +-8,7,28,32,24,13,218,68,47,25,255,61,43,24,255,61,46,28,255,61, +-47,28,255,61,47,28,255,66,50,29,255,73,55,32,255,66,48,29,255,24, +-20,15,85,0,20,7,6,6,79,32,26,17,244,199,132,54,255,208,150,75, +-255,122,87,41,255,17,15,10,170,0,32,10,9,7,28,32,23,11,227,53, +-33,14,255,34,23,11,255,12,10,7,190,6,5,5,28,0,20,9,7,4, +-170,146,76,19,255,197,99,20,255,204,110,27,255,59,41,22,255,6,6,6, +-170,10,9,9,113,31,26,18,184,30,25,17,255,29,25,18,255,34,27,19, +-255,37,28,18,221,13,11,8,57,0,8,13,10,6,88,144,75,19,255,185, +-86,20,255,178,90,19,255,20,14,7,212,0,12,9,7,4,125,157,81,20, +-255,212,117,33,255,220,148,63,255,27,21,14,218,0,8,12,10,9,127,192, +-111,31,255,208,112,27,255,202,103,23,255,22,16,9,204,0,12,10,8,5, +-93,137,68,18,255,185,94,20,255,180,91,19,255,30,20,9,170,0,8,11, +-9,6,85,140,67,19,255,202,106,21,255,214,125,39,255,25,20,14,255,0, +-12,6,6,5,28,13,11,8,139,20,16,11,170,19,15,10,142,8,7,5, +-28,0,8,10,9,5,142,153,79,20,255,195,90,20,255,206,111,27,255,24, +-20,13,255,0,12,12,10,9,170,195,113,32,255,211,115,30,255,203,108,24, +-255,31,21,10,173,0,8,11,9,6,85,140,70,19,255,185,86,20,255,180, +-87,19,255,24,15,7,181,0,32,9,8,6,170,174,91,23,255,215,123,42, +-255,221,150,66,255,25,20,14,255,0,32,9,7,4,170,148,77,19,255,181, +-92,20,255,180,87,19,255,25,17,8,170,0,8,34,24,13,170,161,102,38, +-255,219,154,70,255,220,142,59,255,213,124,38,255,32,24,13,198,0,8,11, +-9,6,85,140,70,19,255,185,86,20,255,178,90,19,255,20,14,7,212,0, +-12,8,7,5,127,144,78,19,255,185,86,20,255,180,87,19,255,29,19,10, +-170,0,8,13,11,8,116,194,116,33,255,209,110,30,255,202,95,23,255,22, +-17,9,221,0,12,10,8,5,85,12,9,5,170,10,8,5,130,6,5,3, +-8,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,27, +-18,8,170,0,8,11,8,6,85,137,68,18,255,185,86,20,255,200,105,21, +-255,29,21,12,255,4,4,4,25,10,9,7,139,154,100,47,255,215,148,70, +-255,198,131,45,255,46,34,19,255,11,9,6,88,0,12,10,8,5,119,144, +-78,19,255,185,86,20,255,180,87,19,255,21,15,8,210,0,32,13,11,8, +-170,199,119,39,255,220,144,63,255,221,155,70,255,27,21,14,255,0,20,10, +-9,7,170,171,89,22,255,195,98,20,255,183,89,19,255,29,20,8,170,0, +-8,11,9,6,85,139,70,20,255,202,103,23,255,211,118,36,255,28,21,13, +-201,0,4,8,8,7,57,118,84,39,255,215,159,86,255,219,149,66,255,216, +-129,45,255,211,121,34,255,34,25,13,178,0,8,11,10,6,88,146,76,19, +-255,185,94,20,255,178,90,19,255,24,18,9,255,0,12,18,15,11,170,203, +-122,42,255,215,126,40,255,209,106,30,255,32,22,13,184,0,8,12,10,7, +-85,143,72,20,255,185,94,20,255,178,90,19,255,20,14,7,210,0,40,9, +-7,4,170,148,77,19,255,180,87,19,255,178,86,19,255,30,21,9,255,5, +-5,4,37,8,7,5,28,20,17,13,227,133,89,38,255,215,142,56,255,216, +-129,45,255,209,115,32,255,26,19,11,210,0,8,11,9,6,85,142,74,19, +-255,185,86,20,255,178,90,19,255,20,14,7,210,0,12,9,7,4,122,143, +-75,20,255,203,108,24,255,216,129,45,255,30,23,15,255,0,12,12,10,7, +-110,16,13,9,170,13,10,8,122,0,16,9,8,6,105,142,74,19,255,185, +-86,20,255,180,87,19,255,23,16,8,255,0,24,15,13,10,170,203,122,42, +-255,215,126,40,255,209,118,30,255,24,17,11,255,0,24,9,8,4,170,148, +-77,19,255,181,92,20,255,180,87,19,255,23,16,8,198,0,12,9,7,6, +-139,159,82,20,255,203,100,24,255,212,121,33,255,28,21,13,255,0,12,12, +-11,9,119,81,59,34,255,216,153,71,255,173,117,50,255,21,18,14,255,10, +-10,9,244,11,10,8,255,60,35,15,255,173,85,20,255,84,49,17,255,13, +-10,6,170,0,12,10,8,5,130,146,79,19,255,193,89,20,255,203,104,24, +-255,120,77,31,255,19,17,12,255,117,80,36,255,219,154,70,255,178,121,53, +-255,20,17,13,255,45,33,18,255,184,94,21,255,195,90,20,255,205,106,26, +-255,30,22,13,255,0,12,7,7,6,82,35,28,18,255,196,114,33,255,148, +-80,25,255,32,22,11,255,20,15,9,255,26,18,9,255,88,49,17,255,149, +-78,20,255,40,26,11,255,9,7,4,85,0,28,9,7,4,127,140,70,19, +-255,181,88,20,255,180,87,19,255,18,13,7,235,0,24,10,9,7,93,104, +-69,35,255,201,131,48,255,194,109,33,255,65,42,20,255,12,10,7,170,0, +-36,9,7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,23,16,8, +-198,0,32,15,14,10,198,188,133,61,255,219,149,66,255,194,115,37,255,17, +-15,10,244,0,24,10,8,5,113,144,78,19,255,185,86,20,255,180,87,19, +-255,18,13,7,255,0,140,7,6,4,65,53,31,12,255,162,83,19,255,185, +-94,20,255,130,70,21,255,31,22,10,255,25,19,10,198,22,17,9,246,70, +-40,15,255,169,87,20,255,200,105,21,255,212,123,37,255,28,21,13,221,0, +-8,12,10,9,133,200,127,41,255,210,120,33,255,202,95,23,255,19,14,8, +-238,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,28, +-19,9,170,0,8,12,10,9,133,194,112,31,255,209,110,30,255,202,102,21, +-255,21,15,8,235,0,16,9,7,4,57,12,10,5,88,10,8,5,85,0, +-12,10,8,5,125,146,79,19,255,181,88,20,255,180,87,19,255,25,17,8, +-195,0,12,10,8,5,119,144,78,19,255,185,94,20,255,200,105,21,255,23, +-18,10,221,0,8,11,9,8,153,200,123,41,255,212,117,33,255,202,103,23, +-255,111,63,20,255,27,20,10,255,20,16,9,246,22,17,9,249,28,20,9, +-198,30,21,9,170,24,17,9,215,28,20,9,201,10,8,5,85,0,16,9, +-7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,18,13,7,255,0, +-16,11,10,8,113,152,104,47,255,214,134,49,255,204,105,25,255,98,54,19, +-255,18,13,9,227,13,10,8,170,14,12,9,198,60,41,21,255,199,112,28, +-255,202,102,21,255,202,103,23,255,26,19,11,204,0,8,12,11,9,116,187, +-101,24,255,202,93,21,255,187,91,20,255,18,13,7,255,0,12,9,7,4, +-170,146,79,19,255,181,88,20,255,178,90,19,255,27,17,8,170,0,8,11, +-9,6,85,139,70,20,255,202,103,23,255,212,123,37,255,32,24,15,255,0, +-24,13,12,10,170,196,114,33,255,206,106,25,255,196,99,21,255,28,19,9, +-170,0,8,11,8,6,85,137,68,18,255,181,88,20,255,178,86,19,255,164, +-85,21,255,138,73,21,255,175,93,20,255,178,86,19,255,46,28,11,255,6, +-5,3,108,0,20,9,7,4,170,146,76,19,255,189,88,20,255,189,88,20, +-255,28,19,9,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,178, +-90,19,255,27,17,8,170,0,4,9,7,4,167,146,79,19,255,20,14,7, +-252,0,4,11,9,6,85,137,68,18,255,185,94,20,255,178,90,19,255,27, +-17,8,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,180,87,19, +-255,18,13,7,255,0,12,9,7,4,170,146,79,19,255,185,94,20,255,183, +-85,19,255,27,19,8,170,0,8,11,9,6,85,140,73,19,255,181,88,20, +-255,178,90,19,255,20,15,7,255,0,12,16,14,11,170,208,143,59,255,223, +-156,70,255,216,135,49,255,28,22,13,210,0,8,11,9,6,85,140,70,19, +-255,185,94,20,255,178,90,19,255,72,39,13,255,10,8,5,218,8,6,3, +-170,9,7,4,193,39,24,10,255,160,82,19,255,185,94,20,255,144,74,23, +-255,16,13,9,170,0,8,10,9,7,85,145,101,48,255,218,149,67,255,210, +-115,31,255,99,57,19,255,10,8,5,227,8,6,3,170,9,7,4,190,30, +-20,9,255,158,81,19,255,185,94,20,255,178,90,19,255,27,17,8,170,0, +-8,11,8,6,85,137,68,18,255,185,86,20,255,180,87,19,255,18,13,7, +-255,0,44,9,9,8,28,13,12,8,142,27,20,10,170,29,21,10,193,24, +-17,9,252,22,17,9,232,22,17,9,255,87,49,18,255,181,88,20,255,178, +-90,19,255,100,54,17,255,11,10,6,150,0,16,9,7,4,170,146,79,19, +-255,181,88,20,255,180,87,19,255,18,13,7,255,0,16,15,13,10,170,208, +-141,55,255,223,156,70,255,217,133,50,255,23,19,12,255,0,12,10,8,5, +-122,144,78,19,255,185,86,20,255,180,87,19,255,30,20,9,176,0,12,12, +-10,7,85,39,26,12,255,155,80,20,255,99,55,19,255,19,16,12,255,12, +-11,9,255,18,15,11,255,119,84,38,255,209,137,60,255,138,86,35,255,18, +-15,11,178,0,12,10,8,5,130,144,78,19,255,181,92,20,255,178,90,19, +-255,39,24,10,255,6,5,3,210,29,20,8,255,169,87,20,255,97,53,18, +-255,8,7,5,255,26,21,15,255,212,142,59,255,221,151,68,255,218,142,53, +-255,34,25,15,255,0,20,5,5,4,82,16,12,7,255,160,82,19,255,185, +-86,20,255,185,86,20,255,52,29,11,255,7,6,4,170,0,20,8,7,5, +-85,83,46,16,255,181,92,20,255,178,86,19,255,87,47,14,255,10,8,5, +-224,8,6,3,170,9,7,4,190,29,20,8,255,195,104,24,255,217,136,50, +-255,221,155,70,255,30,23,15,255,0,16,8,7,5,85,26,18,9,255,107, +-59,20,255,151,80,22,255,60,34,15,255,11,9,6,170,0,36,8,7,5, +-170,159,82,20,255,202,118,35,255,66,51,29,255,9,9,8,96,0,16,15, +-13,10,170,208,140,59,255,223,156,70,255,215,133,44,255,27,20,12,255,0, +-20,14,12,7,244,131,67,20,255,176,89,19,255,17,12,6,255,0,184,17, +-14,10,85,171,95,28,255,206,123,33,255,208,123,31,255,207,112,28,255,202, +-107,23,255,191,98,22,255,170,91,21,255,195,107,22,255,209,123,30,255,212, +-132,37,255,214,134,39,255,211,133,40,255,202,121,35,255,29,21,12,164,0, +-8,12,10,7,82,168,98,29,255,202,121,35,255,196,120,31,255,194,115,31, +-255,190,115,27,255,185,101,26,255,184,100,25,255,199,107,26,255,208,123,31, +-255,168,105,37,255,25,21,14,227,9,8,8,28,0,8,8,8,7,28,39, +-30,18,249,183,122,42,255,211,133,40,255,210,133,43,255,161,106,41,255,15, +-13,10,221,5,4,4,17,0,8,14,11,7,113,148,83,25,255,193,108,24, +-255,180,93,23,255,27,18,10,153,0,8,12,9,7,122,144,78,19,255,180, +-91,19,255,83,46,16,255,7,6,4,184,0,8,4,4,3,85,28,21,13, +-255,202,121,35,255,209,132,42,255,131,87,36,255,10,9,7,255,5,5,5, +-28,0,40,10,9,7,68,86,62,31,255,206,131,43,255,214,130,39,255,76, +-50,25,255,7,6,6,113,0,16,5,5,4,28,21,17,12,255,202,121,35, +-255,210,135,37,255,157,100,38,255,18,15,11,150,0,16,18,15,9,91,161, +-88,24,255,105,64,28,255,11,10,8,170,0,12,8,7,7,85,40,28,17, +-255,174,91,23,255,42,27,13,173,0,32,10,8,5,116,133,66,16,255,161, +-85,17,255,161,78,17,255,25,16,8,221,0,24,15,12,8,119,170,99,29, +-255,203,126,36,255,199,127,34,255,27,20,12,210,0,60,13,11,8,122,170, +-99,29,255,204,127,37,255,199,119,34,255,27,20,12,198,0,12,4,4,3, +-11,18,13,9,255,154,79,19,255,174,88,19,255,92,51,17,255,12,10,7, +-198,0,24,11,9,6,147,142,74,19,255,171,90,18,255,159,81,18,255,17, +-12,6,255,0,12,8,7,5,142,133,66,16,255,161,85,17,255,161,85,17, +-255,21,14,6,215,0,24,10,9,7,198,190,107,25,255,203,104,24,255,196, +-99,21,255,21,15,8,255,2,2,1,14,0,20,9,8,6,37,35,28,18, +-255,183,112,36,255,212,132,37,255,178,118,41,255,27,23,16,255,5,5,4, +-198,0,32,15,12,8,105,142,79,23,255,189,97,22,255,160,83,21,255,18, +-13,7,218,0,12,10,8,7,198,196,114,33,255,214,129,37,255,212,132,37, +-255,27,21,12,210,0,8,13,11,8,116,192,114,31,255,210,125,33,255,209, +-123,30,255,203,113,26,255,177,91,22,255,159,82,20,255,160,83,21,255,165, +-85,20,255,168,89,19,255,163,86,18,255,161,78,17,255,23,15,6,170,0, +-8,9,7,4,57,99,48,14,255,142,73,17,255,133,66,16,255,19,13,6, +-190,0,12,7,6,4,164,135,66,16,255,161,85,17,255,161,85,17,255,25, +-16,6,170,0,8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17, +-255,19,13,6,227,0,12,10,8,5,176,190,107,25,255,212,127,35,255,214, +-134,39,255,30,21,13,255,0,24,12,10,7,170,194,109,33,255,213,132,36, +-255,208,122,29,255,28,20,11,255,0,24,9,7,4,147,136,70,17,255,202, +-98,21,255,211,126,34,255,27,20,12,255,3,3,2,28,0,8,10,8,7, +-195,180,93,23,255,202,102,21,255,202,102,21,255,25,17,10,221,0,8,13, +-11,8,65,129,70,22,255,172,88,21,255,144,78,19,255,22,15,7,176,0, +-12,10,8,7,198,198,124,37,255,215,136,42,255,214,134,39,255,27,21,12, +-212,0,8,12,10,7,79,151,88,26,255,198,116,29,255,192,109,27,255,25, +-18,10,167,0,8,12,9,7,82,119,62,20,255,174,89,21,255,154,79,19, +-255,22,15,7,181,0,20,5,5,4,68,20,14,7,249,142,73,17,255,143, +-74,18,255,45,26,10,255,10,8,5,85,0,76,7,6,6,85,39,30,18, +-255,196,121,41,255,213,135,42,255,115,72,30,255,10,9,7,170,0,40,5, +-5,4,17,6,5,5,85,5,5,4,45,0,28,9,7,4,142,146,79,19, +-255,204,108,23,255,212,126,33,255,30,22,13,255,3,3,3,40,0,36,10, +-8,5,125,133,66,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0, +-12,10,8,5,127,136,70,17,255,193,97,20,255,203,108,24,255,30,21,11, +-193,0,8,13,10,6,85,134,70,19,255,171,90,18,255,159,81,18,255,17, +-12,6,238,0,12,8,6,5,144,135,66,16,255,161,85,17,255,161,85,17, +-255,23,15,6,170,0,8,10,7,5,85,133,66,16,255,185,94,20,255,209, +-123,30,255,23,18,12,255,3,3,2,28,0,4,5,5,4,28,18,15,11, +-227,134,72,21,255,158,81,19,255,143,74,18,255,22,15,7,142,0,8,10, +-8,5,85,131,65,16,255,163,79,18,255,178,90,19,255,22,16,9,255,3, +-2,2,20,0,8,9,7,6,176,144,78,19,255,175,88,18,255,163,79,18, +-255,26,16,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +-78,17,255,19,13,6,229,0,32,8,7,5,156,144,78,19,255,202,102,21, +-255,206,111,27,255,27,20,12,255,0,32,10,8,5,133,135,66,16,255,161, +-85,17,255,161,85,17,255,19,13,6,227,0,12,8,7,5,255,172,85,21, +-255,189,92,20,255,172,87,19,255,24,16,7,170,0,8,10,8,5,85,129, +-64,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,12,10,8,5, +-127,135,66,16,255,161,85,17,255,161,85,17,255,26,16,7,170,0,8,11, +-9,6,85,134,70,19,255,171,90,18,255,159,78,18,255,23,15,6,170,0, +-8,9,7,4,57,98,49,13,255,139,71,16,255,133,66,16,255,19,13,6, +-193,0,12,7,6,4,176,133,66,16,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,8,10,8,5,85,129,64,16,255,165,87,18,255,180,91,19, +-255,20,15,9,255,0,4,5,5,4,17,26,21,15,227,126,75,25,255,178, +-95,21,255,142,74,19,255,46,28,11,255,10,8,5,57,0,8,10,8,5, +-85,131,65,16,255,161,85,17,255,161,85,17,255,17,12,6,252,2,1,1, +-8,0,28,13,11,8,170,199,119,34,255,215,136,42,255,214,139,41,255,28, +-20,13,255,0,20,8,7,5,170,135,66,16,255,161,85,17,255,161,85,17, +-255,23,15,6,170,0,8,10,8,5,85,131,67,16,255,202,102,21,255,211, +-127,36,255,22,17,11,249,0,8,16,14,11,201,101,67,28,255,191,98,22, +-255,185,94,20,255,172,87,19,255,26,17,7,170,0,8,10,8,5,85,129, +-64,16,255,161,85,17,255,161,85,17,255,31,20,8,255,5,5,4,102,0, +-4,5,4,4,28,16,13,9,255,164,85,21,255,180,91,19,255,165,87,18, +-255,26,17,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +-85,17,255,19,13,6,212,0,40,10,8,5,133,135,66,16,255,161,85,17, +-255,161,85,17,255,26,17,7,255,3,3,2,136,9,7,4,227,131,67,20, +-255,197,104,22,255,198,104,21,255,183,93,19,255,172,87,19,255,26,17,7, +-170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,19, +-13,6,212,0,12,10,8,5,127,135,66,16,255,193,97,20,255,209,123,30, +-255,19,15,10,252,0,8,13,11,8,65,125,68,22,255,174,86,21,255,146, +-76,19,255,22,14,7,178,0,12,8,6,5,144,135,66,16,255,161,85,17, +-255,161,85,17,255,19,14,6,238,0,24,13,11,8,170,163,87,20,255,180, +-91,19,255,165,87,18,255,17,12,6,255,0,24,9,7,4,139,135,66,16, +-255,161,85,17,255,161,85,17,255,15,11,6,246,0,12,9,7,6,184,180, +-93,23,255,211,115,30,255,213,133,38,255,28,20,13,255,0,16,12,11,9, +-170,152,91,31,255,188,105,31,255,115,66,22,255,91,50,16,255,84,46,15, +-255,116,59,17,255,118,62,17,255,15,11,6,221,0,16,10,8,5,116,146, +-79,19,255,202,103,23,255,209,128,32,255,200,127,41,255,167,106,40,255,197, +-122,42,255,210,130,35,255,186,106,27,255,88,51,19,255,102,55,17,255,157, +-83,18,255,189,92,20,255,209,123,30,255,29,21,12,224,0,8,7,6,6, +-28,41,31,18,235,160,84,23,255,170,87,19,255,45,26,10,255,5,5,4, +-170,4,4,4,8,4,4,3,99,15,12,6,255,140,72,17,255,138,71,17, +-255,45,26,10,255,10,8,5,85,0,24,8,7,5,142,133,66,16,255,161, +-85,17,255,161,85,17,255,19,13,6,229,0,24,13,11,8,170,160,86,21, +-255,185,90,20,255,91,50,16,255,7,6,4,255,0,40,8,7,5,150,133, +-66,16,255,161,85,17,255,161,85,17,255,15,11,6,246,0,32,8,8,7, +-110,74,52,27,255,191,103,24,255,176,89,19,255,34,22,9,255,6,5,3, +-57,0,20,8,6,5,161,133,66,16,255,161,85,17,255,161,78,17,255,15, +-11,6,252,0,140,12,10,5,85,123,61,16,255,161,85,17,255,161,85,17, +-255,22,15,7,255,2,2,1,85,0,8,7,6,4,244,133,66,16,255,167, +-88,18,255,189,92,20,255,27,19,10,195,0,8,12,10,7,110,160,83,21, +-255,177,85,18,255,161,78,17,255,15,11,6,252,0,12,7,6,4,161,133, +-66,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,8,11,9,6, +-85,134,70,19,255,171,90,18,255,159,78,18,255,15,11,6,249,0,12,10, +-8,5,85,98,49,13,255,135,72,16,255,133,66,16,255,19,13,6,139,0, +-8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,255,15,11,6, +-246,0,12,7,6,4,164,133,66,16,255,165,87,18,255,178,90,19,255,24, +-17,9,212,0,8,13,11,8,105,165,86,22,255,180,91,19,255,159,81,18, +-255,19,14,6,255,2,2,1,79,0,44,8,6,5,167,133,66,16,255,161, +-85,17,255,161,85,17,255,15,11,6,252,0,16,7,6,6,28,24,19,13, +-227,103,59,20,255,157,83,18,255,154,78,17,255,150,81,19,255,154,79,19, +-255,158,81,19,255,162,83,19,255,161,85,17,255,159,81,18,255,163,86,18, +-255,27,18,8,170,0,8,11,9,6,85,131,67,16,255,165,87,18,255,161, +-85,17,255,15,11,6,252,0,12,8,6,5,167,133,66,16,255,161,85,17, +-255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,131,65,16,255,175, +-88,18,255,191,96,20,255,25,18,10,255,0,24,11,9,6,170,148,77,19, +-255,169,82,18,255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,129, +-64,16,255,161,85,17,255,161,85,17,255,87,47,14,255,23,17,8,255,65, +-34,12,255,150,76,17,255,132,68,17,255,41,25,10,255,10,8,5,85,0, +-16,8,7,5,150,133,66,16,255,161,85,17,255,161,78,17,255,23,15,6, +-170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,4,8,7,5,153,133,66,16,255,19,13,6,238,0,4,10, +-8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0, +-8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,15,11,6, +-252,0,12,8,6,5,167,133,66,16,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17, +-255,31,20,8,255,5,4,4,85,0,4,5,4,4,40,17,14,10,255,200, +-120,35,255,207,112,28,255,195,98,20,255,29,20,8,170,0,8,10,8,5, +-85,131,65,16,255,163,86,18,255,159,81,18,255,150,76,17,255,137,70,16, +-255,135,72,16,255,135,66,16,255,146,75,17,255,159,81,18,255,131,67,20, +-255,42,31,17,255,10,9,7,62,0,8,5,5,4,8,26,21,15,227,137, +-79,28,255,174,88,19,255,158,83,17,255,137,70,16,255,135,72,16,255,135, +-66,16,255,146,75,17,255,159,81,18,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,8,10,8,5,85,131,67,16,255,163,86,18,255,159,81,18, +-255,17,12,6,255,0,68,2,1,1,8,7,6,4,249,137,67,16,255,165, +-80,18,255,154,78,17,255,27,18,8,170,0,16,8,6,5,167,133,66,16, +-255,161,85,17,255,161,85,17,255,15,11,6,252,0,16,13,11,8,170,199, +-124,36,255,211,125,32,255,200,105,21,255,18,13,7,255,0,12,7,6,4, +-164,133,66,16,255,161,85,17,255,161,78,17,255,19,13,6,227,0,16,8, +-7,5,122,68,38,13,255,150,83,23,255,174,107,35,255,181,112,38,255,190, +-117,39,255,193,114,36,255,143,84,26,255,15,12,8,212,4,4,3,6,0, +-12,10,8,5,108,135,66,16,255,161,85,17,255,161,85,17,255,125,65,16, +-255,90,47,13,255,121,60,16,255,164,84,19,255,189,97,22,255,177,104,32, +-255,194,123,39,255,212,134,41,255,210,124,31,255,200,105,21,255,23,17,8, +-218,0,16,10,8,5,167,56,31,11,255,110,55,15,255,118,62,17,255,115, +-58,16,255,115,58,16,255,120,63,17,255,95,46,14,255,17,13,6,227,7, +-6,4,28,0,16,14,12,7,227,87,43,14,255,154,78,17,255,152,77,17, +-255,139,71,16,255,135,72,16,255,135,66,16,255,146,75,17,255,200,105,21, +-255,211,127,36,255,214,134,39,255,23,18,12,255,0,12,7,6,4,85,26, +-16,7,255,131,67,16,255,145,75,18,255,78,43,15,255,7,6,4,255,0, +-40,10,8,5,136,157,81,20,255,210,129,33,255,139,89,36,255,10,9,7, +-198,0,16,13,11,8,170,196,113,31,255,206,114,25,255,189,92,20,255,18, +-13,7,244,0,16,5,4,4,88,27,19,8,255,141,73,18,255,161,85,17, +-255,21,14,6,218,0,112,12,9,7,99,11,8,6,170,10,8,5,91,0, +-60,11,10,8,28,32,23,13,227,108,57,19,255,153,82,18,255,154,78,17, +-255,146,75,17,255,97,47,14,255,36,24,11,255,108,64,25,255,203,111,30, +-255,207,118,32,255,207,118,32,255,189,110,32,255,63,41,20,255,15,12,8, +-76,0,8,9,8,6,28,38,27,15,218,51,33,18,255,48,32,17,255,131, +-74,24,255,182,97,21,255,176,89,19,255,170,87,19,255,134,72,21,255,37, +-25,14,255,15,13,8,144,7,7,6,28,0,12,11,9,8,127,171,99,28, +-255,208,123,31,255,203,124,30,255,104,63,27,255,15,13,10,212,7,6,6, +-28,0,12,14,11,7,170,142,74,19,255,161,85,17,255,159,81,18,255,27, +-18,8,184,0,8,6,5,3,28,27,17,8,227,92,46,13,255,111,55,14, +-255,31,20,8,255,8,6,3,198,9,7,4,170,10,8,5,227,22,16,9, +-255,61,39,18,255,107,64,26,255,108,66,25,255,32,22,11,255,9,7,6, +-170,0,44,10,9,7,156,56,36,19,255,191,114,32,255,175,98,30,255,41, +-27,16,255,11,9,6,57,0,12,21,15,10,227,100,56,21,255,160,83,21, +-255,80,44,17,255,14,12,7,190,7,6,6,28,0,16,13,10,6,28,29, +-20,10,212,21,15,10,144,0,20,12,9,7,85,39,24,10,173,16,12,7, +-85,0,32,6,5,3,20,19,13,6,173,21,14,6,255,21,15,6,215,10, +-8,5,85,0,24,15,12,8,170,190,98,23,255,203,108,24,255,202,111,23, +-255,23,17,10,255,0,60,17,13,10,170,195,112,30,255,211,124,30,255,205, +-106,26,255,31,21,12,255,0,12,8,6,5,139,44,25,9,255,135,72,16, +-255,104,54,13,255,15,11,6,249,7,6,4,28,0,24,7,6,4,57,44, +-25,9,255,137,73,16,255,143,70,16,255,49,25,8,255,8,6,3,184,8, +-6,3,85,8,6,3,142,23,16,6,255,130,66,15,255,145,77,16,255,87, +-44,12,255,10,8,5,142,0,20,11,9,8,164,53,31,14,255,150,74,19, +-255,154,78,17,255,148,76,17,255,65,33,10,255,10,8,5,184,6,5,5, +-28,0,16,11,9,6,142,175,102,30,255,207,123,32,255,208,114,31,255,196, +-114,33,255,89,56,26,255,17,13,10,255,11,8,6,170,9,7,6,170,11, +-8,6,170,15,11,8,170,18,13,9,142,8,6,5,28,0,8,10,8,5, +-93,102,53,17,255,159,81,18,255,154,78,17,255,72,37,11,255,11,8,6, +-227,9,7,6,170,11,8,6,198,61,36,20,255,196,107,27,255,204,114,27, +-255,182,102,31,255,19,14,10,170,0,8,6,6,5,20,26,19,11,198,28, +-20,11,255,22,16,9,255,23,16,8,255,27,18,8,255,24,16,7,255,24, +-16,7,255,74,39,11,255,139,68,16,255,143,70,16,255,143,70,16,255,20, +-13,5,170,0,8,7,6,4,74,87,44,12,255,155,79,18,255,151,73,16, +-255,67,34,10,255,9,7,4,198,9,7,4,96,8,6,5,159,27,17,8, +-255,137,67,16,255,158,80,17,255,112,56,15,255,10,8,5,167,0,8,7, +-5,4,85,74,36,11,255,150,83,17,255,145,77,16,255,55,29,10,255,8, +-6,3,198,8,6,3,88,7,6,4,153,39,24,12,255,199,112,28,255,210, +-115,31,255,184,108,33,255,17,14,10,198,0,24,11,9,6,170,139,69,18, +-255,168,86,19,255,154,78,17,255,17,12,6,235,0,24,7,6,4,85,64, +-32,11,255,162,80,19,255,198,96,21,255,109,63,26,255,15,11,8,227,10, +-8,7,170,8,7,5,195,29,18,8,255,137,67,16,255,154,78,17,255,114, +-59,15,255,11,10,6,164,0,8,9,7,6,85,97,50,16,255,159,81,18, +-255,152,77,17,255,74,36,11,255,10,8,5,198,7,6,4,125,10,8,5, +-198,61,36,20,255,200,105,29,255,209,122,28,255,180,104,29,255,16,12,9, +-170,0,8,12,10,7,170,160,83,21,255,183,89,19,255,174,88,19,255,28, +-19,9,187,0,8,14,10,7,85,143,75,20,255,195,98,20,255,189,92,20, +-255,21,15,8,224,0,24,7,6,4,85,26,16,7,255,111,55,14,255,132, +-67,15,255,39,23,8,255,8,6,3,113,0,68,9,7,6,85,32,22,13, +-255,188,112,31,255,193,114,30,255,94,57,25,255,17,13,10,170,0,44,9, +-7,4,142,10,8,5,255,10,8,5,198,6,5,3,28,0,24,8,7,5, +-85,88,48,19,255,204,114,27,255,208,118,31,255,111,62,26,255,11,8,6, +-227,8,7,5,150,10,8,5,116,10,8,5,88,9,7,4,85,6,5,3, +-74,0,16,10,8,5,99,114,56,13,255,143,70,16,255,143,70,16,255,18, +-12,5,215,0,12,8,7,3,130,118,60,13,255,148,76,17,255,150,76,17, +-255,24,16,7,170,0,8,9,7,4,85,114,56,13,255,145,74,16,255,143, +-70,16,255,52,28,9,255,8,6,3,198,8,6,3,88,8,6,3,144,23, +-15,6,255,130,66,15,255,151,80,16,255,111,55,14,255,10,8,5,144,0, +-8,6,5,3,59,59,32,10,255,157,83,18,255,185,90,20,255,97,54,22, +-255,14,10,7,227,13,10,6,170,13,10,6,255,84,41,13,255,148,76,17, +-255,155,82,18,255,135,66,16,255,14,10,5,159,0,8,9,7,4,85,114, +-56,13,255,145,77,16,255,145,74,16,255,55,28,10,255,9,7,4,198,8, +-6,3,93,8,6,3,147,25,16,6,255,130,64,15,255,151,80,16,255,111, +-55,14,255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,145,77,16, +-255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,102,8,6,3, +-139,8,6,3,170,9,8,4,113,0,12,10,8,5,91,114,56,13,255,150, +-76,17,255,150,76,17,255,17,12,6,252,0,32,7,6,4,85,64,33,11, +-255,145,77,16,255,143,70,16,255,56,29,9,255,8,6,3,198,8,6,3, +-85,6,5,3,119,14,11,5,255,128,66,15,255,151,73,16,255,143,76,16, +-255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +-70,16,255,18,12,5,215,0,12,8,7,3,130,114,56,13,255,143,70,16, +-255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143, +-70,16,255,143,70,16,255,20,13,5,170,0,8,7,6,4,71,87,44,12, +-255,158,87,17,255,161,85,17,255,103,53,20,255,15,11,8,227,10,8,7, +-170,10,8,7,195,33,20,10,255,137,67,16,255,151,73,16,255,111,55,14, +-255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,146, +-75,17,255,18,13,7,255,0,8,7,6,6,74,24,16,7,255,132,67,15, +-255,145,77,16,255,135,72,16,255,14,10,5,170,0,8,9,7,4,85,114, +-56,13,255,145,77,16,255,143,70,16,255,58,31,11,255,11,8,6,227,11, +-9,6,170,11,8,6,170,10,7,5,170,9,8,4,113,0,12,11,9,6, +-161,175,92,24,255,203,108,24,255,198,101,23,255,25,18,10,255,0,20,8, +-6,3,147,114,56,13,255,143,70,16,255,143,70,16,255,20,13,5,170,0, +-8,9,7,4,85,114,56,13,255,170,87,19,255,199,106,24,255,24,17,11, +-255,0,8,6,6,5,28,15,12,6,255,128,66,15,255,145,74,16,255,143, +-70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,77,16, +-255,143,70,16,255,90,44,13,255,19,13,6,255,10,8,5,255,13,10,6, +-255,62,33,11,255,135,72,16,255,151,73,16,255,108,53,13,255,10,8,5, +-142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18, +-12,5,215,0,40,7,6,4,85,64,33,11,255,145,77,16,255,143,70,16, +-255,67,34,10,255,14,10,5,255,49,27,9,255,140,72,17,255,160,85,19, +-255,160,85,19,255,110,55,15,255,31,20,8,255,9,7,4,57,0,8,9, +-8,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,12,5,215,0, +-12,8,7,3,136,118,60,13,255,154,75,17,255,172,87,19,255,24,17,9, +-204,0,8,8,7,5,85,95,49,16,255,161,85,17,255,152,77,17,255,71, +-34,10,255,9,7,4,198,8,6,3,88,8,6,3,142,23,15,6,255,130, +-66,15,255,151,80,16,255,111,55,14,255,14,10,5,170,0,24,9,7,4, +-164,118,56,15,255,145,74,16,255,143,70,16,255,16,12,5,224,0,24,9, +-7,4,85,85,43,12,255,151,80,16,255,143,70,16,255,55,29,10,255,8, +-6,3,198,8,6,3,93,8,6,5,173,45,27,14,255,199,112,28,255,210, +-124,31,255,199,119,34,255,19,15,10,221,0,20,13,11,8,170,46,28,11, +-255,131,65,16,255,145,74,16,255,137,67,16,255,70,35,11,255,12,10,5, +-224,7,6,4,28,0,16,8,6,5,34,37,25,14,255,181,100,28,255,206, +-113,31,255,207,123,32,255,199,119,34,255,107,67,28,255,28,20,11,255,28, +-19,9,255,84,41,13,255,141,75,16,255,145,74,16,255,159,82,20,255,88, +-53,25,255,13,11,8,99,0,8,13,10,6,85,114,60,17,255,148,76,17, +-255,143,70,16,255,21,14,6,255,0,12,10,8,5,170,119,61,14,255,145, +-77,16,255,135,72,16,255,19,13,6,170,0,24,8,7,3,142,114,56,13, +-255,143,70,16,255,143,70,16,255,16,12,5,218,0,24,11,8,6,170,126, +-62,15,255,151,80,16,255,112,57,13,255,19,13,6,255,8,6,3,144,8, +-6,3,85,9,7,4,113,8,6,3,167,8,6,3,170,8,6,3,170,9, +-8,4,113,0,12,10,8,5,91,114,56,13,255,145,74,16,255,143,70,16, +-255,61,32,10,255,9,8,4,170,0,32,12,10,7,207,74,36,11,255,139, +-74,16,255,79,40,12,255,10,8,5,210,0,16,9,7,4,85,27,17,6, +-255,130,66,15,255,143,70,16,255,143,76,16,255,16,12,5,221,0,140,8, +-6,3,85,74,39,11,255,145,77,16,255,143,70,16,255,41,23,8,255,7, +-6,4,173,5,5,2,85,6,5,3,113,14,10,5,255,129,65,14,255,145, +-74,16,255,145,74,16,255,24,16,7,170,0,8,10,8,5,85,112,57,13, +-255,145,77,16,255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3, +-88,8,6,3,144,23,15,6,255,130,66,15,255,151,80,16,255,111,55,14, +-255,10,8,5,144,0,8,6,5,3,59,63,34,10,255,145,77,16,255,143, +-70,16,255,55,29,10,255,8,6,3,198,8,6,3,85,8,6,3,144,32, +-19,7,255,139,74,16,255,155,79,18,255,135,66,16,255,14,10,5,170,0, +-8,6,5,3,57,57,31,10,255,145,77,16,255,143,70,16,255,55,29,10, +-255,8,6,3,198,8,6,3,88,8,6,3,144,21,15,6,255,130,66,15, +-255,143,76,16,255,146,75,17,255,24,15,7,184,0,8,7,6,4,71,66, +-33,11,255,148,79,17,255,143,70,16,255,45,25,8,255,7,5,4,176,7, +-5,4,85,8,6,3,85,9,7,4,85,8,6,3,82,0,28,8,7,3, +-136,114,56,13,255,143,70,16,255,143,70,16,255,16,12,5,221,0,20,7, +-6,4,28,10,8,5,130,19,13,6,170,29,19,8,173,24,16,7,212,27, +-18,8,193,20,13,7,246,55,29,10,255,139,74,16,255,143,70,16,255,143, +-70,16,255,18,13,5,170,0,8,9,7,4,85,115,54,14,255,143,70,16, +-255,143,70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143, +-70,16,255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13, +-255,145,74,16,255,145,74,16,255,17,11,6,252,0,24,10,8,5,170,119, +-61,14,255,145,74,16,255,143,70,16,255,18,13,5,170,0,8,9,7,4, +-85,114,56,13,255,143,70,16,255,143,70,16,255,33,20,8,255,5,4,4, +-195,8,6,5,198,46,26,9,255,126,62,15,255,132,67,15,255,35,22,8, +-255,9,7,4,93,0,12,10,8,5,93,114,56,13,255,143,70,16,255,143, +-70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16, +-255,143,70,16,255,20,13,5,170,0,4,9,7,4,125,114,56,13,255,21, +-13,6,210,0,4,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16, +-255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +-70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,70,16, +-255,143,70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145, +-77,16,255,143,70,16,255,90,44,13,255,17,12,6,255,12,9,5,255,20, +-15,9,255,97,51,20,255,169,87,20,255,161,85,17,255,112,54,15,255,10, +-8,5,142,0,8,9,7,4,85,121,60,16,255,174,88,19,255,176,89,19, +-255,112,59,17,255,37,23,10,255,26,16,7,255,25,18,8,255,24,15,7, +-255,23,16,8,255,18,13,9,198,10,9,7,99,0,16,9,8,6,34,12, +-10,7,167,20,14,7,210,21,15,6,255,26,17,7,255,24,16,7,255,26, +-17,7,255,70,35,11,255,142,73,17,255,148,76,17,255,152,77,17,255,24, +-15,7,170,0,8,13,10,6,96,129,65,18,255,170,87,19,255,170,87,19, +-255,24,16,9,255,0,48,5,4,2,76,8,6,3,85,8,6,3,85,8, +-6,3,85,7,5,4,85,6,5,3,119,16,11,5,255,129,65,14,255,151, +-73,16,255,118,61,15,255,14,10,5,170,0,16,8,7,3,136,114,56,13, +-255,143,70,16,255,143,70,16,255,16,12,5,221,0,16,10,8,7,113,109, +-67,26,255,184,90,21,255,148,76,17,255,52,28,9,255,8,6,3,198,8, +-6,3,88,8,6,3,144,21,15,6,255,130,66,15,255,143,76,16,255,143, +-76,16,255,16,12,5,227,0,20,9,8,6,170,67,42,20,255,202,124,31, +-255,208,128,33,255,205,106,26,255,104,58,21,255,14,11,7,218,6,5,5, +-28,0,16,7,6,4,28,27,17,8,229,102,51,13,255,139,68,16,255,143, +-73,16,255,145,74,16,255,71,37,12,255,26,18,9,255,80,50,23,255,204, +-122,33,255,208,115,33,255,202,104,25,255,149,78,20,255,52,30,11,255,10, +-8,5,85,0,12,14,10,5,170,85,43,12,255,137,73,16,255,77,39,12, +-255,14,10,5,227,10,8,5,170,10,8,5,198,46,26,9,255,137,73,16, +-255,115,59,14,255,25,16,6,232,8,6,3,31,0,12,6,5,3,28,10, +-8,5,119,19,13,6,170,29,19,8,173,26,16,7,210,27,18,8,187,17, +-12,6,246,58,30,11,255,151,77,18,255,192,97,21,255,192,97,21,255,24, +-16,9,207,0,8,4,4,3,3,25,16,6,235,115,59,14,255,143,73,16, +-255,145,77,16,255,108,53,13,255,21,14,6,255,7,6,4,164,10,7,5, +-85,8,7,5,147,9,7,4,136,8,6,5,76,0,20,8,6,5,57,58, +-33,13,255,188,107,27,255,192,111,31,255,85,51,24,255,18,13,9,187,6, +-5,5,20,0,8,11,9,6,156,139,69,18,255,158,83,17,255,148,76,17, +-255,23,15,6,170,0,12,9,7,4,85,19,13,6,255,102,51,13,255,128, +-66,15,255,81,41,12,255,12,9,5,142,0,108,13,10,8,85,115,60,24, +-255,162,75,23,255,121,60,20,255,23,15,8,142,0,60,3,3,2,6,10, +-8,5,170,93,48,12,255,123,65,14,255,123,60,14,255,14,10,5,227,3, +-3,2,85,12,10,7,170,163,83,24,255,199,99,26,255,193,96,24,255,41, +-26,14,227,6,6,5,45,0,24,3,3,2,28,11,8,6,170,106,50,13, +-255,129,63,14,255,129,63,14,255,29,18,8,227,6,5,5,31,0,20,13, +-10,8,136,144,73,21,255,182,89,21,255,99,55,19,255,14,11,7,187,4, +-4,3,3,0,16,9,7,4,113,93,46,12,255,131,66,14,255,121,62,14, +-255,16,11,5,170,0,12,7,6,4,28,14,10,5,227,100,50,13,255,110, +-59,13,255,103,52,14,255,121,59,18,255,134,69,21,255,32,21,11,255,6, +-5,5,198,10,8,7,227,46,28,13,255,104,51,15,255,96,46,13,255,14, +-10,5,139,0,44,10,8,7,108,63,37,18,255,176,88,23,255,160,80,21, +-255,20,14,9,170,0,8,8,6,5,79,85,41,12,255,131,65,16,255,66, +-34,11,255,10,8,5,170,0,144,9,7,4,167,115,56,16,255,165,85,20, +-255,112,65,23,255,18,13,9,142,0,60,13,10,8,142,132,68,21,255,162, +-80,19,255,141,70,18,255,17,12,6,181,0,12,17,12,6,255,103,54,14, +-255,130,66,15,255,31,20,8,255,6,5,3,113,0,32,8,6,3,156,35, +-22,8,255,114,58,13,255,110,59,13,255,88,45,11,255,88,42,11,255,92, +-47,11,255,104,54,13,255,119,58,14,255,61,32,10,255,10,8,5,224,5, +-4,4,20,0,16,11,8,6,85,113,58,22,255,180,90,23,255,140,69,17, +-255,123,63,14,255,123,60,14,255,119,56,14,255,120,61,17,255,24,15,9, +-167,0,16,12,10,7,133,180,88,27,255,203,107,30,255,199,100,28,255,197, +-104,28,255,191,93,28,255,167,78,24,255,132,68,21,255,121,62,18,255,117, +-60,18,255,118,57,17,255,108,50,15,255,17,12,6,113,0,12,14,10,5, +-227,65,33,10,255,115,59,14,255,115,59,14,255,109,52,14,255,116,57,17, +-255,121,59,18,255,139,68,20,255,154,73,19,255,115,62,20,255,33,23,12, +-255,9,8,6,71,0,36,2,2,1,8,8,6,3,170,93,50,12,255,125, +-64,14,255,123,60,14,255,14,10,5,159,0,12,14,10,5,224,65,33,10, +-255,115,59,14,255,115,59,14,255,109,52,14,255,119,61,18,255,129,66,20, +-255,148,75,21,255,170,84,21,255,129,67,22,255,37,25,14,255,8,7,5, +-57,0,8,5,5,4,23,24,17,9,255,103,54,18,255,132,63,17,255,120, +-62,15,255,98,49,13,255,90,45,11,255,94,45,13,255,124,60,17,255,172, +-81,21,255,150,78,25,255,44,29,17,255,9,8,6,91,0,24,8,7,3, +-102,93,46,12,255,125,64,14,255,121,62,14,255,18,12,5,170,0,28,12, +-10,5,227,64,33,11,255,132,66,17,255,158,79,21,255,151,70,22,255,130, +-67,21,255,110,53,15,255,108,53,13,255,118,60,13,255,85,43,12,255,21, +-14,6,255,7,6,4,57,0,12,14,10,5,227,65,33,10,255,131,65,16, +-255,149,72,20,255,133,68,20,255,111,54,16,255,110,53,15,255,138,72,19, +-255,163,81,20,255,112,58,19,255,28,20,9,255,8,7,5,57,0,8,9, +-7,4,91,96,48,13,255,132,70,15,255,123,60,14,255,14,10,5,161,0, +-8,13,10,6,85,148,73,23,255,202,101,27,255,129,67,26,255,18,13,9, +-142,0,28,6,5,3,48,17,12,6,227,108,55,13,255,112,55,13,255,35, +-22,8,255,9,7,4,57,0,64,32,22,13,255,137,68,22,255,154,73,19, +-255,45,26,10,255,8,6,5,144,0,44,8,6,3,68,67,34,10,255,115, +-56,16,255,109,52,14,255,16,11,5,147,0,24,5,4,4,11,22,17,11, +-227,129,76,28,255,195,95,28,255,186,84,23,255,121,59,18,255,107,51,14, +-255,96,46,13,255,90,45,11,255,88,45,11,255,41,24,8,255,12,10,5, +-176,0,12,8,6,3,76,88,44,11,255,125,66,14,255,123,60,14,255,18, +-12,5,170,0,12,9,7,4,85,92,47,11,255,125,64,14,255,123,60,14, +-255,16,11,5,150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123, +-60,14,255,114,58,13,255,93,50,12,255,88,44,11,255,92,47,11,255,104, +-54,13,255,119,58,14,255,85,43,12,255,21,15,6,255,7,6,4,51,0, +-12,12,10,5,221,61,32,10,255,120,62,15,255,123,61,16,255,109,52,14, +-255,96,46,13,255,102,51,13,255,115,59,14,255,123,65,14,255,85,43,12, +-255,25,16,6,255,7,6,4,51,0,8,8,6,3,74,88,45,11,255,125, +-64,14,255,123,60,14,255,114,58,13,255,93,50,12,255,88,45,11,255,92, +-47,11,255,104,52,13,255,118,60,13,255,85,43,12,255,21,15,6,255,7, +-5,4,40,0,8,8,6,3,74,88,45,11,255,125,64,14,255,123,60,14, +-255,114,58,13,255,93,50,12,255,88,45,11,255,92,43,11,255,93,50,12, +-255,93,50,12,255,20,13,5,85,0,8,8,6,3,65,88,45,11,255,125, +-64,14,255,121,62,14,255,18,13,5,170,0,36,12,10,5,227,59,31,10, +-255,115,62,14,255,114,58,13,255,93,50,12,255,88,44,11,255,88,44,11, +-255,104,54,13,255,118,60,13,255,123,60,14,255,123,60,14,255,14,10,5, +-150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18, +-12,5,170,0,12,9,7,4,85,92,47,11,255,125,66,14,255,123,65,14, +-255,14,10,5,150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123, +-65,14,255,14,10,5,159,0,12,14,10,5,221,70,35,11,255,155,74,20, +-255,193,89,26,255,185,91,28,255,172,85,27,255,165,80,24,255,155,78,22, +-255,132,66,17,255,90,44,13,255,21,15,6,255,7,5,4,40,0,8,8, +-6,3,74,88,45,11,255,125,64,14,255,121,62,14,255,19,13,6,176,0, +-12,9,6,4,133,93,50,12,255,131,66,14,255,123,65,14,255,14,11,5, +-150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,60,14,255,118, +-56,15,255,120,61,17,255,136,67,21,255,118,57,17,255,96,48,13,255,92, +-47,11,255,18,12,5,85,0,8,9,7,4,79,104,51,15,255,140,66,17, +-255,135,66,16,255,17,12,6,198,0,20,9,7,4,85,92,47,11,255,125, +-66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,65,88,45,11, +-255,135,66,16,255,136,67,17,255,22,14,7,198,0,12,8,6,3,119,88, +-45,11,255,125,64,14,255,123,60,14,255,14,10,5,159,0,12,12,10,5, +-210,59,31,10,255,115,62,14,255,118,60,13,255,104,54,13,255,100,50,13, +-255,100,50,13,255,114,58,13,255,119,63,14,255,85,43,12,255,21,15,6, +-255,7,5,4,40,0,8,8,6,3,74,88,45,11,255,125,66,14,255,123, +-60,14,255,18,12,5,170,0,44,12,10,5,227,59,31,10,255,115,62,14, +-255,114,58,13,255,100,50,13,255,114,56,13,255,133,66,16,255,160,80,21, +-255,176,83,21,255,45,27,12,255,6,5,3,170,0,12,8,6,3,82,88, +-45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,7,4, +-85,92,47,11,255,131,61,14,255,126,62,15,255,17,11,6,170,0,12,14, +-10,5,227,65,33,10,255,115,59,14,255,115,62,14,255,93,50,12,255,88, +-44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,255,21, +-15,6,255,7,6,4,57,0,24,9,7,4,85,92,47,11,255,125,66,14, +-255,123,60,14,255,18,12,5,170,0,24,5,5,4,28,19,13,6,255,84, +-42,11,255,115,62,14,255,110,59,13,255,93,50,12,255,84,44,11,255,106, +-54,15,255,176,84,23,255,199,100,28,255,188,101,31,255,90,54,25,255,13, +-10,8,142,0,24,8,6,3,164,72,37,11,255,131,66,14,255,110,54,13, +-255,12,9,5,224,3,3,2,17,0,24,7,6,6,85,30,20,13,255,190, +-96,27,255,199,98,24,255,121,69,22,255,13,10,6,190,4,3,3,28,5, +-4,2,105,27,17,6,255,114,56,13,255,125,64,14,255,45,26,10,255,8, +-7,5,153,0,12,10,7,5,85,96,48,13,255,125,64,14,255,123,60,14, +-255,16,11,5,195,0,12,8,6,3,110,92,47,11,255,131,66,14,255,123, +-65,14,255,18,13,5,170,0,24,9,7,4,85,92,47,11,255,125,66,14, +-255,123,60,14,255,18,12,5,170,0,24,8,7,3,99,93,50,12,255,125, +-66,14,255,115,59,14,255,104,54,13,255,88,45,11,255,88,44,11,255,92, +-43,11,255,92,43,11,255,92,43,11,255,93,50,12,255,93,50,12,255,20, +-13,5,85,0,8,8,6,3,65,88,45,11,255,125,64,14,255,123,60,14, +-255,115,62,14,255,93,46,12,255,16,11,5,127,0,28,5,4,4,28,12, +-10,5,246,104,54,13,255,115,59,14,255,39,23,8,255,8,6,3,82,0, +-12,58,31,9,255,114,58,13,255,119,63,14,255,123,60,14,255,123,65,14, +-255,18,12,5,170,0,144,14,10,5,227,59,31,10,255,115,62,14,255,110, +-59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,104,54,13,255,115, +-59,14,255,123,60,14,255,123,60,14,255,16,11,5,150,0,8,8,6,3, +-65,88,44,11,255,125,64,14,255,123,60,14,255,114,58,13,255,93,50,12, +-255,88,44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12, +-255,21,15,6,255,7,6,4,51,0,12,12,9,5,224,63,32,10,255,115, +-62,14,255,114,56,13,255,93,50,12,255,88,44,11,255,88,45,11,255,110, +-59,13,255,119,61,14,255,85,43,12,255,25,16,6,255,7,6,4,57,0, +-12,12,10,5,221,59,31,10,255,115,62,14,255,114,56,13,255,93,50,12, +-255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +-255,121,62,14,255,16,11,5,167,0,12,12,10,5,218,59,31,10,255,115, +-62,14,255,110,59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,88, +-45,11,255,88,44,11,255,16,11,5,105,0,24,9,7,4,85,92,47,11, +-255,125,66,14,255,123,60,14,255,18,12,5,170,0,48,7,5,4,198,93, +-50,12,255,125,66,14,255,123,60,14,255,12,10,5,170,0,8,8,6,3, +-65,88,45,11,255,125,66,14,255,123,65,14,255,18,12,5,170,0,12,9, +-7,4,85,92,47,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0, +-8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,13,5, +-170,0,20,3,3,2,11,9,7,4,227,100,50,13,255,123,60,14,255,123, +-60,14,255,12,10,5,170,0,8,8,6,3,62,88,45,11,255,125,66,14, +-255,123,60,14,255,14,10,5,198,0,8,8,6,3,170,35,22,8,255,115, +-59,14,255,112,55,13,255,33,21,8,255,8,6,3,37,0,8,8,6,3, +-74,88,45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8, +-6,3,65,88,45,11,255,125,66,14,255,123,65,14,255,14,11,5,147,0, +-4,9,7,4,85,92,47,11,255,20,13,5,170,0,4,8,6,3,62,88, +-45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3, +-65,88,45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9, +-7,4,85,92,47,11,255,125,66,14,255,123,60,14,255,14,10,5,159,0, +-12,12,10,5,210,59,31,10,255,115,59,14,255,118,60,13,255,104,54,13, +-255,102,51,13,255,112,53,13,255,122,63,15,255,123,58,14,255,85,43,12, +-255,21,15,6,255,7,5,4,45,0,8,8,6,3,85,113,55,16,255,196, +-92,23,255,195,96,24,255,25,17,10,255,4,3,3,79,0,64,3,2,2, +-28,10,8,5,227,138,71,21,255,177,87,20,255,174,86,21,255,24,16,9, +-170,0,8,13,10,8,85,142,73,23,255,195,96,24,255,194,91,23,255,24, +-17,11,227,0,44,12,9,5,150,35,22,8,255,80,42,11,255,84,44,11, +-255,88,44,11,255,80,42,11,255,88,44,11,255,97,50,12,255,118,60,13, +-255,85,43,12,255,21,15,6,255,8,6,3,57,0,16,9,7,4,85,92, +-47,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,16,6,5,5, +-28,17,13,8,227,68,34,11,255,115,59,14,255,110,59,13,255,93,50,12, +-255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +-255,123,65,14,255,18,12,5,170,0,24,12,9,7,170,131,69,24,255,191, +-90,22,255,136,71,19,255,15,11,6,227,4,3,3,17,0,24,7,6,4, +-31,16,11,5,227,104,52,13,255,131,66,14,255,98,49,13,255,10,8,5, +-193,3,2,2,68,8,7,5,170,121,66,26,255,195,96,24,255,156,74,19, +-255,34,21,9,255,9,7,4,85,0,12,8,6,3,51,69,35,10,255,121, +-62,14,255,123,60,14,255,16,11,5,227,4,3,3,28,0,8,8,6,3, +-170,92,47,11,255,125,64,14,255,108,55,13,255,14,10,5,164,0,40,7, +-5,4,198,96,48,13,255,134,65,15,255,133,66,16,255,15,11,6,170,0, +-8,7,5,4,85,78,39,11,255,130,64,15,255,130,64,15,255,134,65,15, +-255,136,67,17,255,124,62,17,255,114,56,17,255,113,55,16,255,118,60,17, +-255,107,55,20,255,48,29,15,255,12,10,7,85,0,20,9,8,6,170,45, +-27,12,255,139,70,20,255,131,66,18,255,107,53,14,255,19,13,6,99,0, +-8,8,6,5,85,92,46,13,255,131,61,14,255,125,64,14,255,14,10,5, +-170,0,12,58,31,9,255,110,59,13,255,115,59,14,255,56,29,9,255,10, +-8,5,227,5,4,4,23,0,108,10,8,7,28,28,18,11,212,49,28,16, +-255,35,21,12,241,13,10,6,85,0,68,14,10,5,142,20,14,5,170,16, +-12,5,164,8,6,3,28,0,8,24,16,9,142,21,15,8,252,23,15,8, +-184,11,8,6,34,0,36,14,10,5,142,20,14,5,170,16,11,5,170,10, +-8,5,28,0,24,7,6,4,25,20,13,7,147,22,15,7,170,10,8,5, +-142,5,4,4,3,0,24,14,10,5,142,20,13,5,170,16,11,5,170,9, +-7,4,28,0,16,7,5,4,28,14,10,5,156,14,10,5,229,24,15,9, +-255,32,20,11,255,28,18,11,244,12,9,7,108,0,8,10,8,5,142,19, +-13,8,235,24,15,7,227,10,8,5,59,0,48,10,8,5,93,23,15,8, +-170,28,18,9,173,15,11,6,28,0,12,18,12,5,142,21,14,6,170,9, +-7,4,133,0,148,8,6,5,113,89,44,14,255,100,51,21,255,13,10,8, +-227,6,5,5,28,0,60,6,5,5,8,17,12,6,142,26,16,7,170,18, +-12,5,170,9,7,4,28,0,8,6,5,3,85,54,28,11,255,136,66,19, +-255,121,59,18,255,15,10,6,241,0,40,8,6,3,57,12,9,5,170,18, +-13,5,178,14,10,5,241,14,10,5,255,14,10,5,252,16,11,5,195,16, +-11,5,170,8,6,3,113,0,24,8,6,5,28,24,16,9,204,24,17,9, +-255,17,12,6,210,14,10,5,170,16,11,5,170,17,11,6,246,27,17,10, +-246,14,10,7,85,0,16,8,6,5,28,21,14,10,195,22,15,11,255,18, +-13,9,255,18,13,9,255,22,15,9,255,19,13,8,255,17,12,6,255,17, +-11,6,255,15,11,6,255,17,12,6,255,19,13,6,204,12,9,5,28,0, +-12,5,4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5, +-235,15,11,6,255,15,11,6,255,19,12,6,204,19,13,6,170,10,8,5, +-170,8,6,5,57,0,48,14,10,5,142,21,13,6,170,16,11,5,170,9, +-7,4,28,0,12,5,4,2,25,8,6,3,125,14,10,5,170,14,10,5, +-210,23,15,8,255,30,20,11,255,30,20,11,255,23,17,10,255,20,14,9, +-244,16,12,9,170,9,8,6,79,0,16,9,7,6,65,15,11,8,170,17, +-12,8,232,21,14,8,255,26,16,9,255,23,15,8,255,21,14,8,255,15, +-11,6,255,22,15,7,178,11,9,6,170,10,8,7,57,0,32,12,10,5, +-142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,5,5,4,28,8, +-6,3,133,15,11,6,193,20,15,9,255,28,18,11,255,30,20,11,255,26, +-16,9,255,14,10,5,238,16,11,5,170,9,7,4,153,7,5,4,57,0, +-16,5,4,2,28,8,6,3,142,18,12,7,207,22,15,9,255,28,18,11, +-255,27,18,10,255,18,13,7,255,15,11,6,227,21,13,6,170,10,7,5, +-164,7,6,4,57,0,16,14,10,5,142,20,13,5,170,16,12,5,170,9, +-7,4,28,0,8,10,8,7,119,149,64,26,255,131,63,26,255,14,11,7, +-227,6,5,5,28,0,32,7,5,4,28,14,10,5,156,20,13,5,170,12, +-9,5,142,6,5,3,6,0,64,12,10,7,142,24,15,7,170,21,13,6, +-170,8,6,3,76,0,48,9,7,6,85,83,43,16,255,176,88,23,255,130, +-62,21,255,16,11,7,170,0,28,9,8,6,28,13,10,8,164,23,16,10, +-190,16,11,7,252,15,11,6,255,14,10,5,255,14,10,5,255,14,10,5, +-255,16,11,5,232,14,10,5,170,8,6,3,85,0,16,14,10,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,142,20,13,5, +-170,16,11,5,170,9,7,4,28,0,12,14,10,5,136,16,12,5,170,16, +-11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,249,16, +-12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,5,4, +-28,8,6,3,125,14,10,5,170,18,12,5,176,14,10,5,238,14,10,5, +-246,16,12,5,195,18,13,5,170,16,11,5,170,9,7,4,150,7,5,4, +-54,0,16,14,10,5,142,16,12,5,170,16,11,5,170,18,12,5,170,16, +-11,5,210,14,10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9, +-7,4,153,7,6,4,57,0,16,14,10,5,142,16,12,5,170,16,11,5, +-170,18,12,5,170,16,11,5,210,14,10,5,252,12,9,5,255,16,11,5, +-255,20,13,5,201,11,9,4,28,0,12,14,10,5,139,20,13,5,170,16, +-11,5,170,9,7,4,28,0,36,5,5,4,28,8,6,3,125,14,10,5, +-170,18,13,5,176,14,10,5,238,14,10,5,255,16,11,5,235,18,13,5, +-173,16,11,5,170,16,12,5,170,16,11,5,164,9,7,4,28,0,12,12, +-9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +-142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,12,6,5,3,28,8,7,5, +-139,19,13,8,193,21,15,10,255,31,21,12,255,32,21,13,255,31,20,12, +-255,23,17,10,255,18,12,7,212,10,8,5,159,7,6,4,57,0,16,14, +-10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +-142,21,13,6,170,16,12,5,170,9,7,4,28,0,12,14,10,5,136,16, +-12,5,170,16,11,5,170,18,12,5,176,17,12,6,252,21,14,8,255,17, +-12,6,255,16,11,5,255,20,13,5,204,11,9,4,28,0,12,14,10,5, +-142,21,14,6,170,18,12,5,170,9,8,4,28,0,24,14,10,5,142,20, +-13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +-170,16,12,5,170,10,8,5,28,0,16,12,9,5,142,20,13,5,170,16, +-11,5,170,9,7,4,28,0,12,5,5,4,28,8,6,3,125,14,10,5, +-170,18,12,5,170,20,14,5,173,16,12,5,193,20,13,5,178,20,13,5, +-170,16,11,5,170,9,7,4,153,7,6,4,57,0,16,14,10,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,44,5,5,4,28,8,6,3, +-125,14,10,5,170,18,13,5,170,20,14,5,170,18,12,5,170,13,10,6, +-227,72,38,19,255,185,86,32,255,144,64,29,255,20,15,11,232,8,7,7, +-28,0,12,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0, +-16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,5, +-4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,238,14, +-10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,7,4,153,7, +-5,4,57,0,32,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4, +-28,0,28,8,6,3,57,9,7,4,164,14,10,5,170,18,13,5,173,14, +-10,5,229,14,10,5,255,17,12,6,255,22,15,9,255,20,14,9,252,21, +-15,10,176,11,9,6,139,0,32,11,8,4,122,18,12,5,170,14,10,5, +-150,7,5,4,28,0,32,8,7,7,57,24,16,11,173,26,18,9,190,13, +-10,6,142,5,4,4,11,0,8,8,7,3,68,14,10,5,170,16,11,5, +-170,9,7,4,74,0,20,14,10,5,142,20,14,5,170,16,11,5,170,9, +-7,4,28,0,16,14,10,5,142,20,14,5,170,16,11,5,170,9,8,4, +-28,0,28,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +-28,14,10,5,142,18,13,5,170,16,12,5,170,18,13,5,173,14,10,5, +-227,14,10,5,255,14,10,5,252,12,9,5,255,12,9,5,255,16,11,5, +-255,20,13,5,201,11,9,4,28,0,12,12,10,5,136,16,12,5,170,16, +-11,5,170,16,11,5,193,21,15,6,184,14,10,5,31,0,32,8,6,3, +-139,54,30,9,255,107,50,12,255,78,39,11,255,9,7,4,161,0,12,20, +-13,5,142,18,12,5,210,16,11,5,170,16,11,5,170,16,11,5,170,9, +-7,4,28,0,64,13,10,8,57,9,7,6,159,8,6,5,159,10,8,7, +-130,10,8,7,119,9,7,6,133,9,7,6,167,10,8,7,170,11,9,8, +-113,0,44,5,4,2,28,8,6,3,125,14,10,5,170,18,13,5,176,14, +-10,5,238,14,10,5,255,16,11,5,235,18,13,5,173,16,11,5,170,16, +-12,5,170,16,11,5,164,9,7,4,28,0,12,14,10,5,136,16,12,5, +-170,16,11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5, +-249,16,12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5, +-5,4,28,8,6,3,125,14,10,5,170,18,13,5,176,14,10,5,238,14, +-10,5,255,14,10,5,249,16,11,5,193,16,11,5,170,9,7,4,150,7, +-5,4,57,0,16,5,5,4,28,8,6,3,125,14,10,5,170,18,13,5, +-176,14,10,5,238,14,10,5,255,14,10,5,235,18,13,5,173,16,11,5, +-170,16,12,5,170,16,11,5,170,9,7,4,28,0,12,5,5,4,28,8, +-6,3,125,14,10,5,170,18,13,5,176,14,10,5,235,14,10,5,255,14, +-10,5,255,16,11,5,255,20,13,5,207,12,9,5,34,0,28,14,10,5, +-142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,6,5,3,85,7, +-5,4,85,6,5,3,85,5,4,4,85,5,4,4,105,9,8,4,241,72, +-37,11,255,110,54,13,255,67,34,10,255,8,6,3,144,0,12,14,10,5, +-142,21,14,6,170,16,12,5,170,9,8,4,28,0,16,14,10,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +-170,16,11,5,170,9,7,4,28,0,12,7,5,2,37,8,6,3,142,8, +-6,3,227,25,15,6,255,75,36,10,255,99,51,12,255,66,33,9,255,8, +-6,3,130,0,12,14,10,5,139,21,13,6,170,16,11,5,170,9,7,4, +-28,0,12,8,6,3,79,14,10,5,170,18,13,5,170,12,9,5,142,0, +-16,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,12,12, +-9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,8,20,13,5, +-85,11,8,4,28,0,8,12,9,5,142,21,13,6,170,16,11,5,170,9, +-7,4,28,0,12,12,9,5,142,21,13,6,170,16,11,5,170,9,7,4, +-28,0,16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +-12,5,5,4,28,8,6,3,125,14,10,5,170,18,12,5,170,20,14,5, +-173,16,12,5,193,20,13,5,178,20,13,5,170,16,11,5,170,9,7,4, +-161,7,6,4,57,0,12,8,6,3,85,84,40,13,255,164,73,23,255,184, +-79,27,255,15,11,8,246,0,72,11,10,10,170,176,83,37,255,196,87,33, +-255,192,88,31,255,22,15,11,193,0,12,21,15,10,159,26,17,11,255,24, +-17,11,221,10,8,7,85,0,44,8,7,3,59,12,9,5,170,16,11,5, +-210,14,10,5,255,14,10,5,255,14,10,5,255,14,10,5,246,16,12,5, +-193,16,11,5,170,9,7,4,153,6,5,3,57,0,24,14,10,5,142,20, +-13,5,170,16,11,5,170,9,7,4,28,0,20,6,5,3,28,8,6,3, +-127,14,10,5,170,18,13,5,176,14,10,5,238,14,10,5,255,14,10,5, +-235,18,13,5,173,16,11,5,170,16,12,5,170,16,11,5,170,9,7,4, +-28,0,28,14,11,7,142,29,19,8,170,17,11,6,159,8,6,3,28,0, +-32,7,5,4,28,14,10,5,150,20,13,5,170,12,9,5,142,5,4,2, +-14,0,8,15,11,8,142,26,18,9,178,19,13,6,170,8,6,3,68,0, +-20,18,12,5,142,16,11,5,238,16,11,5,170,9,7,4,28,0,16,12, +-9,5,142,16,11,5,215,18,13,5,187,11,9,4,28,0,16,4,4,3, +-6,5,4,2,82,5,4,2,85,5,4,2,85,5,4,2,85,5,4,2, +-99,9,7,4,241,72,37,11,255,112,53,13,255,77,39,12,255,10,8,5, +-170,0,12,19,13,8,184,20,14,9,255,16,11,7,255,14,11,7,255,17, +-12,8,255,22,15,9,255,27,17,10,255,30,19,11,255,28,18,11,255,21, +-15,10,255,15,12,8,198,9,7,6,28,0,24,8,6,5,91,15,11,6, +-170,14,11,5,238,19,13,6,198,12,9,5,28,0,8,6,5,3,85,54, +-29,9,255,100,48,13,255,109,52,14,255,15,11,6,170,0,12,19,13,6, +-144,14,10,5,255,16,11,5,178,8,6,3,119,0,255,0,255,0,174,12, +-9,7,88,99,44,20,255,26,16,11,232,5,4,4,28,0,92,6,5,3, +-57,60,28,11,255,158,67,23,255,88,44,23,255,11,9,6,142,0,255,0, +-255,0,150,12,9,7,110,126,51,25,255,25,17,12,232,5,4,4,28,0, +-184,6,5,5,28,19,14,10,227,52,29,17,255,30,20,13,255,9,8,6, +-82,0,255,0,255,0,255,0,255,0,8,12,10,9,170,172,81,49,255,213, +-125,94,255,185,88,58,255,23,16,14,159,0,255,0,255,0,106,5,4,2, +-28,16,11,5,244,68,34,9,255,62,33,9,255,9,8,4,139,0,96,10, +-8,7,48,71,33,18,255,108,47,23,255,107,48,22,255,113,51,24,255,109, +-50,24,255,104,45,21,255,104,45,21,255,113,49,24,255,115,50,24,255,18, +-13,9,136,0,255,0,129,9,7,6,34,18,13,9,244,66,31,15,255,84, +-37,17,255,83,36,16,255,75,34,14,255,73,35,14,255,91,41,16,255,110, +-47,19,255,79,40,16,255,24,16,9,255,8,6,5,57,0,100,22,14,5, +-244,40,23,7,255,42,23,7,255,54,28,9,255,60,31,9,255,36,22,7, +-255,12,9,5,244,6,5,3,28,0,255,0,29,9,7,6,85,72,34,13, +-255,126,56,21,255,148,63,25,255,25,17,14,190,0,72,15,12,12,133,178, +-86,57,255,200,89,55,255,194,82,47,255,30,20,17,187,0,255,0,169,9, +-7,4,99,17,12,6,255,42,22,9,255,49,25,9,255,54,26,11,255,52, +-26,11,255,59,28,12,255,82,37,15,255,111,49,18,255,84,39,17,255,25, +-17,10,255,8,7,5,57,0,112,6,5,3,57,38,22,7,255,85,39,12, +-255,124,52,21,255,20,13,9,170,0,255,0,255,0,202,8,6,5,28,26, +-16,11,170,11,8,6,85,0,100,12,8,5,119,20,14,9,170,12,9,7, +-142,0,255,0,255,0,154,9,7,6,28,27,17,12,170,11,9,8,85,0, +-192,7,6,6,28,8,7,5,85,8,6,5,57,0,255,0,255,0,255,0, +-255,0,16,25,17,16,161,41,27,26,255,40,26,23,235,14,12,11,82,0, +-255,0,255,0,110,8,6,3,37,9,7,4,142,9,7,4,136,6,5,3, +-6,0,100,23,15,10,153,19,13,10,255,16,11,9,255,16,11,9,255,16, +-11,9,255,16,11,9,255,16,11,9,255,18,13,9,255,24,16,11,204,16, +-11,9,31,0,255,0,133,10,8,7,142,18,12,9,207,18,13,9,255,16, +-11,9,255,15,11,8,255,15,11,8,252,18,13,9,195,18,12,9,170,11, +-8,6,167,8,7,5,57,0,104,9,8,4,142,14,10,5,170,13,10,6, +-170,13,9,6,170,11,8,6,170,7,6,4,130,6,5,3,28,0,255,0, +-37,14,10,7,142,21,14,10,170,19,13,10,170,14,11,9,31,0,72,8, +-7,8,14,25,17,16,142,27,18,16,193,26,18,15,170,15,11,10,34,0, +-255,0,169,9,7,4,28,11,8,6,170,14,10,7,232,15,10,8,255,15, +-10,8,255,15,10,8,255,15,10,8,252,18,12,9,195,18,12,9,170,11, +-8,6,167,9,7,6,57,0,120,9,7,4,91,16,11,7,170,20,13,9, +-170,13,10,8,28,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-255,0,255,0,255}}; +- /* Created by MiniCompress.. an iOS RLE compressor. +- * Compress Rate : 46.36 % +- */ +diff -Naur /home/d4rk/goom2k4-0/src/gfontrle.h /src/gfontrle.h +--- /home/d4rk/goom2k4-0/src/gfontrle.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontrle.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,7 +0,0 @@ +-extern const struct { +- unsigned int width; +- unsigned int height; +- unsigned int bytes_per_pixel; +- unsigned int rle_size; +- unsigned char rle_pixel [49725]; +-} the_font ; +diff -Naur /home/d4rk/goom2k4-0/src/goom_config.h /src/goom_config.h +--- /home/d4rk/goom2k4-0/src/goom_config.h 2008-08-03 19:23:12.000000000 -0600 ++++ /src/goom_config.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,28 +0,0 @@ +-#if WORDS_BIGENDIAN +-#define COLOR_ARGB +-#else +-#define COLOR_BGRA +-#endif +- +-#if 1 +-/* ndef COLOR_BGRA */ +-/** position des composantes **/ +- #define BLEU 2 +- #define VERT 1 +- #define ROUGE 0 +- #define ALPHA 3 +-#else +- #define ROUGE 1 +- #define BLEU 3 +- #define VERT 2 +- #define ALPHA 0 +-#endif +- +-#ifndef guint32 +-#define guint8 unsigned char +-#define guin16 unsigned short +-#define guint32 unsigned int +-#define gint8 signed char +-#define gint16 signed short int +-#define gint32 signed int +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_config_param.h /src/goom_config_param.h +--- /home/d4rk/goom2k4-0/src/goom_config_param.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_config_param.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,115 +0,0 @@ +-#ifndef _CONFIG_PARAM_H +-#define _CONFIG_PARAM_H +- +-#include +- +-/** +- * File created on 2003-05-24 by Jeko. +- * (c)2003, JC Hoelt for iOS-software. +- * +- * LGPL Licence. +- */ +- +-typedef enum { +- PARAM_INTVAL, +- PARAM_FLOATVAL, +- PARAM_BOOLVAL, +- PARAM_STRVAL, +- PARAM_LISTVAL, +-} ParamType; +- +-struct IntVal { +- int value; +- int min; +- int max; +- int step; +-}; +-struct FloatVal { +- float value; +- float min; +- float max; +- float step; +-}; +-struct StrVal { +- char *value; +-}; +-struct ListVal { +- char *value; +- int nbChoices; +- char **choices; +-}; +-struct BoolVal { +- int value; +-}; +- +- +-typedef struct _PARAM { +- char *name; +- char *desc; +- char rw; +- ParamType type; +- union { +- struct IntVal ival; +- struct FloatVal fval; +- struct StrVal sval; +- struct ListVal slist; +- struct BoolVal bval; +- } param; +- +- /* used by the core to inform the GUI of a change */ +- void (*change_listener)(struct _PARAM *_this); +- +- /* used by the GUI to inform the core of a change */ +- void (*changed)(struct _PARAM *_this); +- +- void *user_data; /* can be used by the GUI */ +-} PluginParam; +- +-#define IVAL(p) ((p).param.ival.value) +-#define SVAL(p) ((p).param.sval.value) +-#define FVAL(p) ((p).param.fval.value) +-#define BVAL(p) ((p).param.bval.value) +-#define LVAL(p) ((p).param.slist.value) +- +-#define FMIN(p) ((p).param.fval.min) +-#define FMAX(p) ((p).param.fval.max) +-#define FSTEP(p) ((p).param.fval.step) +- +-#define IMIN(p) ((p).param.ival.min) +-#define IMAX(p) ((p).param.ival.max) +-#define ISTEP(p) ((p).param.ival.step) +- +-PluginParam goom_secure_param(void); +- +-PluginParam goom_secure_f_param(char *name); +-PluginParam goom_secure_i_param(char *name); +-PluginParam goom_secure_b_param(char *name, int value); +-PluginParam goom_secure_s_param(char *name); +- +-PluginParam goom_secure_f_feedback(char *name); +-PluginParam goom_secure_i_feedback(char *name); +- +-void goom_set_str_param_value(PluginParam *p, const char *str); +-void goom_set_list_param_value(PluginParam *p, const char *str); +- +-typedef struct _PARAMETERS { +- char *name; +- char *desc; +- int nbParams; +- PluginParam **params; +-} PluginParameters; +- +-PluginParameters goom_plugin_parameters(const char *name, int nb); +- +-#define secure_param goom_secure_param +-#define secure_f_param goom_secure_f_param +-#define secure_i_param goom_secure_i_param +-#define secure_b_param goom_secure_b_param +-#define secure_s_param goom_secure_s_param +-#define secure_f_feedback goom_secure_f_feedback +-#define secure_i_feedback goom_secure_i_feedback +-#define set_list_param_value goom_set_list_param_value +-#define set_str_param_value goom_set_str_param_value +-#define plugin_parameters goom_plugin_parameters +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_core.c /src/goom_core.c +--- /home/d4rk/goom2k4-0/src/goom_core.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_core.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,886 +0,0 @@ +-/** +-* file: goom_core.c +- * author: Jean-Christophe Hoelt (which is not so proud of it) +- * +- * Contains the core of goom's work. +- * +- * (c)2000-2003, by iOS-software. +- */ +- +-#include +-#include +-#include +-#include +-#include +- +-#include "goom.h" +-#include "goom_tools.h" +-#include "goom_filters.h" +-#include "lines.h" +-#include "ifs.h" +-#include "tentacle3d.h" +-#include "gfontlib.h" +- +-#include "sound_tester.h" +-#include "goom_plugin_info.h" +-#include "goom_fx.h" +-#include "goomsl.h" +- +-/* #define VERBOSE */ +- +-#define STOP_SPEED 128 +-/* TODO: put that as variable in PluginInfo */ +-#define TIME_BTW_CHG 300 +- +-static void choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, +- int *mode, float *amplitude, int far); +- +-static void update_message (PluginInfo *goomInfo, char *message); +- +-static void init_buffers(PluginInfo *goomInfo, int buffsize) +-{ +- goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); +- bzero (goomInfo->pixel, buffsize * sizeof (guint32) + 128); +- goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); +- bzero (goomInfo->back, buffsize * sizeof (guint32) + 128); +- goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128); +- bzero (goomInfo->conv, buffsize * sizeof (guint32) + 128); +- +- goomInfo->outputBuf = goomInfo->conv; +- +- goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128); +- goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128); +-} +- +-/************************** +-* INIT * +-**************************/ +-PluginInfo *goom_init (guint32 resx, guint32 resy) +-{ +- PluginInfo *goomInfo = (PluginInfo*)malloc(sizeof(PluginInfo)); +- +-#ifdef VERBOSE +- printf ("GOOM: init (%d, %d);\n", resx, resy); +-#endif +- +- plugin_info_init(goomInfo,4); +- +- goomInfo->star_fx = flying_star_create(); +- goomInfo->star_fx.init(&goomInfo->star_fx, goomInfo); +- +- goomInfo->zoomFilter_fx = zoomFilterVisualFXWrapper_create (); +- goomInfo->zoomFilter_fx.init(&goomInfo->zoomFilter_fx, goomInfo); +- +- goomInfo->tentacles_fx = tentacle_fx_create(); +- goomInfo->tentacles_fx.init(&goomInfo->tentacles_fx, goomInfo); +- +- goomInfo->convolve_fx = convolve_create(); +- goomInfo->convolve_fx.init(&goomInfo->convolve_fx, goomInfo); +- +- plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx); +- plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx); +- plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx); +- plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx); +- +- goomInfo->screen.width = resx; +- goomInfo->screen.height = resy; +- goomInfo->screen.size = resx * resy; +- +- init_buffers(goomInfo, goomInfo->screen.size); +- goomInfo->gRandom = goom_random_init((uintptr_t)goomInfo->pixel); +- +- goomInfo->cycle = 0; +- +- goomInfo->ifs_fx = ifs_visualfx_create(); +- goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); +- +- goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, +- GML_HLINE, goomInfo->screen.height, GML_BLACK, +- GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT); +- goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, +- GML_HLINE, 0, GML_BLACK, +- GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED); +- +- gfont_load (); +- +- /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */ +- +- return goomInfo; +-} +- +- +- +-void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy) +-{ +- free (goomInfo->pixel); +- free (goomInfo->back); +- free (goomInfo->conv); +- +- goomInfo->screen.width = resx; +- goomInfo->screen.height = resy; +- goomInfo->screen.size = resx * resy; +- +- init_buffers(goomInfo, goomInfo->screen.size); +- +- /* init_ifs (goomInfo, resx, goomInfo->screen.height); */ +- goomInfo->ifs_fx.free(&goomInfo->ifs_fx); +- goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); +- +- goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height); +- goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height); +-} +- +-int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer) +-{ +- goomInfo->outputBuf = (Pixel*)buffer; +- return 1; +-} +- +-/******************************************** +-* UPDATE * +-******************************************** +- +-* WARNING: this is a 600 lines function ! (21-11-2003) +-*/ +-guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], +- int forceMode, float fps, char *songTitle, char *message) +-{ +- Pixel *return_val; +- guint32 pointWidth; +- guint32 pointHeight; +- int i; +- float largfactor; /* elargissement de l'intervalle d'volution des points */ +- Pixel *tmp; +- +- ZoomFilterData *pzfd; +- +- /* test if the config has changed, update it if so */ +- pointWidth = (goomInfo->screen.width * 2) / 5; +- pointHeight = ((goomInfo->screen.height) * 2) / 5; +- +- /* ! etude du signal ... */ +- evaluate_sound (data, &(goomInfo->sound)); +- +- /* goom_execute_main_script(goomInfo); */ +- +- /* ! calcul du deplacement des petits points ... */ +- largfactor = goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f; +- +- if (largfactor > 1.5f) +- largfactor = 1.5f; +- +- goomInfo->update.decay_ifs--; +- if (goomInfo->update.decay_ifs > 0) +- goomInfo->update.ifs_incr += 2; +- if (goomInfo->update.decay_ifs == 0) +- goomInfo->update.ifs_incr = 0; +- +- if (goomInfo->update.recay_ifs) { +- goomInfo->update.ifs_incr -= 2; +- goomInfo->update.recay_ifs--; +- if ((goomInfo->update.recay_ifs == 0)&&(goomInfo->update.ifs_incr<=0)) +- goomInfo->update.ifs_incr = 1; +- } +- +- if (goomInfo->update.ifs_incr > 0) +- goomInfo->ifs_fx.apply(&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, goomInfo); +- +- if (goomInfo->curGState->drawPoints) { +- for (i = 1; i * 15 <= goomInfo->sound.speedvar*80.0f + 15; i++) { +- goomInfo->update.loopvar += goomInfo->sound.speedvar*50 + 1; +- +- pointFilter (goomInfo, goomInfo->p1, +- YELLOW, +- ((pointWidth - 6.0f) * largfactor + 5.0f), +- ((pointHeight - 6.0f) * largfactor + 5.0f), +- i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032); +- pointFilter (goomInfo, goomInfo->p1, ORANGE, +- ((pointWidth / 2) * largfactor) / i + 10.0f * i, +- ((pointHeight / 2) * largfactor) / i + 10.0f * i, +- 96.0f, i * 80.0f, goomInfo->update.loopvar / i); +- pointFilter (goomInfo, goomInfo->p1, VIOLET, +- ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, +- ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, +- i + 122.0f, 134.0f, goomInfo->update.loopvar / i); +- pointFilter (goomInfo, goomInfo->p1, BLACK, +- ((pointHeight / 3) * largfactor + 20.0f), +- ((pointHeight / 3) * largfactor + 20.0f), +- 58.0f, i * 66.0f, goomInfo->update.loopvar / i); +- pointFilter (goomInfo, goomInfo->p1, WHITE, +- (pointHeight * largfactor + 10.0f * i) / i, +- (pointHeight * largfactor + 10.0f * i) / i, +- 66.0f, 74.0f, goomInfo->update.loopvar + i * 500); +- } +- } +- +- /* par dfaut pas de changement de zoom */ +- pzfd = NULL; +- +- /* +- * Test forceMode +- */ +-#ifdef VERBOSE +- if (forceMode != 0) { +- printf ("forcemode = %d\n", forceMode); +- } +-#endif +- +- +- /* diminuer de 1 le temps de lockage */ +- /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ +- /* changement d'etat du plugin juste apres un autre changement d'etat. oki */ +- if (--goomInfo->update.lockvar < 0) +- goomInfo->update.lockvar = 0; +- +- /* on verifie qu'il ne se pas un truc interressant avec le son. */ +- if ((goomInfo->sound.timeSinceLastGoom == 0) +- || (forceMode > 0) +- || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) { +- +- /* changement eventuel de mode */ +- if (goom_irand(goomInfo->gRandom,16) == 0) +- switch (goom_irand(goomInfo->gRandom,34)) { +- case 0: +- case 10: +- goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); +- case 13: +- case 20: +- case 21: +- goomInfo->update.zoomFilterData.mode = WAVE_MODE; +- goomInfo->update.zoomFilterData.reverse = 0; +- goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,3) == 0); +- if (goom_irand(goomInfo->gRandom,2)) +- goomInfo->update.zoomFilterData.vitesse = (goomInfo->update.zoomFilterData.vitesse + 127) >> 1; +- break; +- case 1: +- case 11: +- goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 2: +- case 12: +- goomInfo->update.zoomFilterData.mode = AMULETTE_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 3: +- goomInfo->update.zoomFilterData.mode = WATER_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 4: +- case 14: +- goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 5: +- case 15: +- case 22: +- goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = (goom_irand(goomInfo->gRandom,3) == 0); +- break; +- case 6: +- case 16: +- goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 7: +- case 17: +- goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; +- goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,4) == 0); +- goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); +- break; +- case 8: +- case 18: +- case 19: +- goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 1; +- goomInfo->update.zoomFilterData.hypercosEffect = 1; +- break; +- case 29: +- case 30: +- goomInfo->update.zoomFilterData.mode = YONLY_MODE; +- break; +- case 31: +- case 32: +- case 33: +- goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE; +- break; +- default: +- goomInfo->update.zoomFilterData.mode = NORMAL_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- } +- } +- +- /* tout ceci ne sera fait qu'en cas de non-blocage */ +- if (goomInfo->update.lockvar == 0) { +- /* reperage de goom (acceleration forte de l'acceleration du volume) */ +- /* -> coup de boost de la vitesse si besoin.. */ +- if (goomInfo->sound.timeSinceLastGoom == 0) { +- +- int i; +- goomInfo->update.goomvar++; +- +- /* SELECTION OF THE GOOM STATE */ +- if ((!goomInfo->update.stateSelectionBlocker)&&(goom_irand(goomInfo->gRandom,3))) { +- goomInfo->update.stateSelectionRnd = goom_irand(goomInfo->gRandom,goomInfo->statesRangeMax); +- goomInfo->update.stateSelectionBlocker = 3; +- } +- else if (goomInfo->update.stateSelectionBlocker) goomInfo->update.stateSelectionBlocker--; +- +- for (i=0;istatesNumber;i++) +- if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin) +- && (goomInfo->update.stateSelectionRnd <= goomInfo->states[i].rangemax)) +- goomInfo->curGState = &(goomInfo->states[i]); +- +- if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr<=0)) { +- goomInfo->update.recay_ifs = 5; +- goomInfo->update.ifs_incr = 11; +- } +- +- if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr>0) && (goomInfo->update.decay_ifs<=0)) +- goomInfo->update.decay_ifs = 100; +- +- if (!goomInfo->curGState->drawScope) +- goomInfo->update.stop_lines = 0xf000 & 5; +- +- if (!goomInfo->curGState->drawScope) { +- goomInfo->update.stop_lines = 0; +- goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; +- } +- +- /* if (goomInfo->update.goomvar % 1 == 0) */ +- { +- guint32 vtmp; +- guint32 newvit; +- +- goomInfo->update.lockvar = 50; +- newvit = STOP_SPEED + 1 - ((float)3.5f * log10(goomInfo->sound.speedvar * 60 + 1)); +- /* retablir le zoom avant.. */ +- if ((goomInfo->update.zoomFilterData.reverse) && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) { +- goomInfo->update.zoomFilterData.reverse = 0; +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2; +- goomInfo->update.lockvar = 75; +- } +- if (goom_irand(goomInfo->gRandom,10) == 0) { +- goomInfo->update.zoomFilterData.reverse = 1; +- goomInfo->update.lockvar = 100; +- } +- +- if (goom_irand(goomInfo->gRandom,10) == 0) +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; +- if (goom_irand(goomInfo->gRandom,12) == 0) +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1; +- +- /* changement de milieu.. */ +- switch (goom_irand(goomInfo->gRandom,25)) { +- case 0: +- case 3: +- case 6: +- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height - 1; +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; +- break; +- case 1: +- case 4: +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width - 1; +- break; +- case 2: +- case 5: +- goomInfo->update.zoomFilterData.middleX = 1; +- break; +- default: +- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; +- } +- +- if ((goomInfo->update.zoomFilterData.mode == WATER_MODE) +- || (goomInfo->update.zoomFilterData.mode == YONLY_MODE) +- || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) { +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; +- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; +- } +- +- switch (vtmp = (goom_irand(goomInfo->gRandom,15))) { +- case 0: +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,3) +- - goom_irand(goomInfo->gRandom,3); +- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,3) +- - goom_irand(goomInfo->gRandom,3); +- break; +- case 3: +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,8) +- - goom_irand(goomInfo->gRandom,8); +- break; +- case 4: +- case 5: +- case 6: +- case 7: +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,5) +- - goom_irand(goomInfo->gRandom,5); +- goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.vPlaneEffect; +- break; +- case 8: +- goomInfo->update.zoomFilterData.hPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); +- goomInfo->update.zoomFilterData.vPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; +- break; +- case 9: +- goomInfo->update.zoomFilterData.vPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); +- goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; +- break; +- case 13: +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) +- - goom_irand(goomInfo->gRandom,10); +- break; +- case 14: +- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,10) +- - goom_irand(goomInfo->gRandom,10); +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) +- - goom_irand(goomInfo->gRandom,10); +- break; +- default: +- if (vtmp < 10) { +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- } +- } +- +- if (goom_irand(goomInfo->gRandom,5) != 0) +- goomInfo->update.zoomFilterData.noisify = 0; +- else { +- goomInfo->update.zoomFilterData.noisify = goom_irand(goomInfo->gRandom,2) + 1; +- goomInfo->update.lockvar *= 2; +- } +- +- if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) { +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- goomInfo->update.zoomFilterData.noisify = 0; +- } +- +- if ((goomInfo->update.zoomFilterData.middleX == 1) || (goomInfo->update.zoomFilterData.middleX == (signed int)goomInfo->screen.width - 1)) { +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- if (goom_irand(goomInfo->gRandom,2)) +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- } +- +- if ((signed int)newvit < goomInfo->update.zoomFilterData.vitesse) /* on accelere */ +- { +- pzfd = &goomInfo->update.zoomFilterData; +- if (((newvit < STOP_SPEED - 7) && +- (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) && +- (goomInfo->cycle % 3 == 0)) || (goom_irand(goomInfo->gRandom,40) == 0)) { +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - goom_irand(goomInfo->gRandom,2) +- + goom_irand(goomInfo->gRandom,2); +- goomInfo->update.zoomFilterData.reverse = !goomInfo->update.zoomFilterData.reverse; +- } +- else { +- goomInfo->update.zoomFilterData.vitesse = (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8; +- } +- goomInfo->update.lockvar += 50; +- } +- } +- +- if (goomInfo->update.lockvar > 150) { +- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; +- goomInfo->update.switchMult = 1.0f; +- } +- } +- /* mode mega-lent */ +- if (goom_irand(goomInfo->gRandom,700) == 0) { +- /* +- * printf ("coup du sort...\n") ; +- */ +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; +- goomInfo->update.zoomFilterData.pertedec = 8; +- goomInfo->update.zoomFilterData.sqrtperte = 16; +- goomInfo->update.goomvar = 1; +- goomInfo->update.lockvar += 50; +- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; +- goomInfo->update.switchMult = 1.0f; +- } +- } +- +- /* +- * gros frein si la musique est calme +- */ +- if ((goomInfo->sound.speedvar < 0.01f) +- && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4) +- && (goomInfo->cycle % 16 == 0)) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.vitesse += 3; +- goomInfo->update.zoomFilterData.pertedec = 8; +- goomInfo->update.zoomFilterData.sqrtperte = 16; +- goomInfo->update.goomvar = 0; +- } +- +- /* +- * baisser regulierement la vitesse... +- */ +- if ((goomInfo->cycle % 73 == 0) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.vitesse++; +- } +- +- /* +- * arreter de decrmenter au bout d'un certain temps +- */ +- if ((goomInfo->cycle % 101 == 0) && (goomInfo->update.zoomFilterData.pertedec == 7)) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.pertedec = 8; +- goomInfo->update.zoomFilterData.sqrtperte = 16; +- } +- +- /* +- * Permet de forcer un effet. +- */ +- if ((forceMode > 0) && (forceMode <= NB_FX)) { +- pzfd = &goomInfo->update.zoomFilterData; +- pzfd->mode = forceMode - 1; +- } +- +- if (forceMode == -1) { +- pzfd = NULL; +- } +- +- /* +- * Changement d'effet de zoom ! +- */ +- if (pzfd != NULL) { +- int dif; +- +- goomInfo->update.cyclesSinceLastChange = 0; +- +- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; +- +- dif = goomInfo->update.zoomFilterData.vitesse - goomInfo->update.previousZoomSpeed; +- if (dif < 0) +- dif = -dif; +- +- if (dif > 2) { +- goomInfo->update.switchIncr *= (dif + 2) / 2; +- } +- goomInfo->update.previousZoomSpeed = goomInfo->update.zoomFilterData.vitesse; +- goomInfo->update.switchMult = 1.0f; +- +- if (((goomInfo->sound.timeSinceLastGoom == 0) +- && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) { +- goomInfo->update.switchIncr = 0; +- goomInfo->update.switchMult = goomInfo->update.switchMultAmount; +- } +- } +- else { +- if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.cyclesSinceLastChange = 0; +- } +- else +- goomInfo->update.cyclesSinceLastChange++; +- } +- +-#ifdef VERBOSE +- if (pzfd) { +- printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); +- } +-#endif +- +- /* Zoom here ! */ +- zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, goomInfo->screen.width, goomInfo->screen.height, +- goomInfo->update.switchIncr, goomInfo->update.switchMult); +- +- /* +- * Affichage tentacule +- */ +- +- goomInfo->tentacles_fx.apply(&goomInfo->tentacles_fx, goomInfo->p1, goomInfo->p2, goomInfo); +- goomInfo->star_fx.apply (&goomInfo->star_fx,goomInfo->p2,goomInfo->p1,goomInfo); +- +- /* +- * Affichage de texte +- */ +- { +- /*char title[1024];*/ +- char text[64]; +- +- /* +- * Le message +- */ +- update_message (goomInfo, message); +- +- if (fps > 0) { +- sprintf (text, "%2.0f fps", fps); +- goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, +- 10, 24, text, 1, 0); +- } +- +- /* +- * Le titre +- */ +- if (songTitle != NULL) { +- strncpy (goomInfo->update.titleText, songTitle, 1023); +- goomInfo->update.titleText[1023]=0; +- goomInfo->update.timeOfTitleDisplay = 200; +- } +- +- if (goomInfo->update.timeOfTitleDisplay) { +- goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, +- goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, +- ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); +- goomInfo->update.timeOfTitleDisplay--; +- if (goomInfo->update.timeOfTitleDisplay < 4) +- goom_draw_text (goomInfo->p2,goomInfo->screen.width,goomInfo->screen.height, +- goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, +- ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); +- } +- } +- +- /* +- * Gestion du Scope +- */ +- +- /* +- * arret demande +- */ +- if ((goomInfo->update.stop_lines & 0xf000)||(!goomInfo->curGState->drawScope)) { +- float param1, param2, amplitude; +- int couleur; +- int mode; +- +- choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur, &mode, &litude,1); +- couleur = GML_BLACK; +- +- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur); +- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur); +- goomInfo->update.stop_lines &= 0x0fff; +- } +- +- /* +- * arret aleatore.. changement de mode de ligne.. +- */ +- if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) { +- goomInfo->update.lineMode--; +- if (goomInfo->update.lineMode == -1) +- goomInfo->update.lineMode = 0; +- } +- else +- if ((goomInfo->cycle%80==0)&&(goom_irand(goomInfo->gRandom,5)==0)&&goomInfo->update.lineMode) +- goomInfo->update.lineMode--; +- +- if ((goomInfo->cycle % 120 == 0) +- && (goom_irand(goomInfo->gRandom,4) == 0) +- && (goomInfo->curGState->drawScope)) { +- if (goomInfo->update.lineMode == 0) +- goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; +- else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) { +- float param1, param2, amplitude; +- int couleur1,couleur2; +- int mode; +- +- goomInfo->update.lineMode--; +- choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, +- &mode, &litude,goomInfo->update.stop_lines); +- +- couleur2 = 5-couleur1; +- if (goomInfo->update.stop_lines) { +- goomInfo->update.stop_lines--; +- if (goom_irand(goomInfo->gRandom,2)) +- couleur2=couleur1 = GML_BLACK; +- } +- +- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); +- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); +- } +- } +- +- /* +- * si on est dans un goom : afficher les lignes... +- */ +- if ((goomInfo->update.lineMode != 0) || (goomInfo->sound.timeSinceLastGoom < 5)) { +- goomInfo->gmline2->power = goomInfo->gmline1->power; +- +- goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2); +- goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2); +- +- if (((goomInfo->cycle % 121) == 9) && (goom_irand(goomInfo->gRandom,3) == 1) +- && ((goomInfo->update.lineMode == 0) || (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration))) { +- float param1, param2, amplitude; +- int couleur1,couleur2; +- int mode; +- +- choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, +- &mode, &litude, goomInfo->update.stop_lines); +- couleur2 = 5-couleur1; +- +- if (goomInfo->update.stop_lines) { +- goomInfo->update.stop_lines--; +- if (goom_irand(goomInfo->gRandom,2)) +- couleur2=couleur1 = GML_BLACK; +- } +- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); +- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); +- } +- } +- +- return_val = goomInfo->p1; +- tmp = goomInfo->p1; +- goomInfo->p1 = goomInfo->p2; +- goomInfo->p2 = tmp; +- +- /* affichage et swappage des buffers.. */ +- goomInfo->cycle++; +- +- goomInfo->convolve_fx.apply(&goomInfo->convolve_fx,return_val,goomInfo->outputBuf,goomInfo); +- +- return (guint32*)goomInfo->outputBuf; +-} +- +-/**************************************** +-* CLOSE * +-****************************************/ +-void goom_close (PluginInfo *goomInfo) +-{ +- if (goomInfo->pixel != NULL) +- free (goomInfo->pixel); +- if (goomInfo->back != NULL) +- free (goomInfo->back); +- if (goomInfo->conv != NULL) +- free (goomInfo->conv); +- +- goomInfo->pixel = goomInfo->back = NULL; +- goomInfo->conv = NULL; +- goom_random_free(goomInfo->gRandom); +- goom_lines_free (&goomInfo->gmline1); +- goom_lines_free (&goomInfo->gmline2); +- +- /* release_ifs (); */ +- goomInfo->ifs_fx.free(&goomInfo->ifs_fx); +- goomInfo->convolve_fx.free(&goomInfo->convolve_fx); +- goomInfo->star_fx.free(&goomInfo->star_fx); +- goomInfo->tentacles_fx.free(&goomInfo->tentacles_fx); +- goomInfo->zoomFilter_fx.free(&goomInfo->zoomFilter_fx); +- +- free(goomInfo); +-} +- +- +-/* *** */ +-void +-choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, int *mode, +- float *amplitude, int far) +-{ +- *mode = goom_irand(goomInfo->gRandom,3); +- *amplitude = 1.0f; +- switch (*mode) { +- case GML_CIRCLE: +- if (far) { +- *param1 = *param2 = 0.47f; +- *amplitude = 0.8f; +- break; +- } +- if (goom_irand(goomInfo->gRandom,3) == 0) { +- *param1 = *param2 = 0; +- *amplitude = 3.0f; +- } +- else if (goom_irand(goomInfo->gRandom,2)) { +- *param1 = 0.40f * goomInfo->screen.height; +- *param2 = 0.22f * goomInfo->screen.height; +- } +- else { +- *param1 = *param2 = goomInfo->screen.height * 0.35; +- } +- break; +- case GML_HLINE: +- if (goom_irand(goomInfo->gRandom,4) || far) { +- *param1 = goomInfo->screen.height / 7; +- *param2 = 6.0f * goomInfo->screen.height / 7.0f; +- } +- else { +- *param1 = *param2 = goomInfo->screen.height / 2.0f; +- *amplitude = 2.0f; +- } +- break; +- case GML_VLINE: +- if (goom_irand(goomInfo->gRandom,3) || far) { +- *param1 = goomInfo->screen.width / 7.0f; +- *param2 = 6.0f * goomInfo->screen.width / 7.0f; +- } +- else { +- *param1 = *param2 = goomInfo->screen.width / 2.0f; +- *amplitude = 1.5f; +- } +- break; +- } +- +- *couleur = goom_irand(goomInfo->gRandom,6); +-} +- +-#define ECART_VARIATION 1.5 +-#define POS_VARIATION 3.0 +-#define SCROLLING_SPEED 80 +- +-/* +- * Met a jour l'affichage du message defilant +- */ +-void update_message (PluginInfo *goomInfo, char *message) { +- +- int fin = 0; +- +- if (message) { +- int i=1,j=0; +- sprintf (goomInfo->update_message.message, message); +- for (j=0;goomInfo->update_message.message[j];j++) +- if (goomInfo->update_message.message[j]=='\n') +- i++; +- goomInfo->update_message.numberOfLinesInMessage = i; +- goomInfo->update_message.affiche = goomInfo->screen.height + goomInfo->update_message.numberOfLinesInMessage * 25 + 105; +- goomInfo->update_message.longueur = strlen(goomInfo->update_message.message); +- } +- if (goomInfo->update_message.affiche) { +- int i = 0; +- char *msg = malloc(goomInfo->update_message.longueur + 1); +- char *ptr = msg; +- int pos; +- float ecart; +- message = msg; +- sprintf (msg, goomInfo->update_message.message); +- +- while (!fin) { +- while (1) { +- if (*ptr == 0) { +- fin = 1; +- break; +- } +- if (*ptr == '\n') { +- *ptr = 0; +- break; +- } +- ++ptr; +- } +- pos = goomInfo->update_message.affiche - (goomInfo->update_message.numberOfLinesInMessage - i)*25; +- pos += POS_VARIATION * (cos((double)pos / 20.0)); +- pos -= SCROLLING_SPEED; +- ecart = (ECART_VARIATION * sin((double)pos / 20.0)); +- if ((fin) && (2 * pos < (int)goomInfo->screen.height)) +- pos = (int)goomInfo->screen.height / 2; +- pos += 7; +- +- goom_draw_text(goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, +- goomInfo->screen.width/2, pos, +- message, +- ecart, +- 1); +- message = ++ptr; +- i++; +- } +- goomInfo->update_message.affiche --; +- free (msg); +- } +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/goom_filters.h /src/goom_filters.h +--- /home/d4rk/goom2k4-0/src/goom_filters.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_filters.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,52 +0,0 @@ +-#ifndef FILTERS_H +-#define FILTERS_H +- +-#include "goom_config.h" +-#include "goom_typedefs.h" +-#include "goom_visual_fx.h" +-#include "goom_graphic.h" +- +-VisualFX zoomFilterVisualFXWrapper_create(void); +- +-struct _ZOOM_FILTER_DATA +-{ +- int vitesse; /* 128 = vitesse nule... * * 256 = en arriere +- * hyper vite.. * * 0 = en avant hype vite. */ +- unsigned char pertedec; +- unsigned char sqrtperte; +- int middleX, middleY; /* milieu de l'effet */ +- char reverse; /* inverse la vitesse */ +- char mode; /* type d'effet appliquer (cf les #define) */ +- /** @since June 2001 */ +- int hPlaneEffect; /* deviation horitontale */ +- int vPlaneEffect; /* deviation verticale */ +- /** @since April 2002 */ +- int waveEffect; /* applique une "surcouche" de wave effect */ +- int hypercosEffect; /* applique une "surcouche de hypercos effect */ +- +- char noisify; /* ajoute un bruit a la transformation */ +-}; +- +-#define NORMAL_MODE 0 +-#define WAVE_MODE 1 +-#define CRYSTAL_BALL_MODE 2 +-#define SCRUNCH_MODE 3 +-#define AMULETTE_MODE 4 +-#define WATER_MODE 5 +-#define HYPERCOS1_MODE 6 +-#define HYPERCOS2_MODE 7 +-#define YONLY_MODE 8 +-#define SPEEDWAY_MODE 9 +- +-void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, +- float t1, float t2, float t3, float t4, guint32 cycle); +- +-/* filtre de zoom : +- * le contenu de pix1 est copie dans pix2. +- * zf : si non NULL, configure l'effet. +- * resx,resy : taille des buffers. +- */ +-void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx, +- guint32 resy, int switchIncr, float switchMult); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_fx.h /src/goom_fx.h +--- /home/d4rk/goom2k4-0/src/goom_fx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_fx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,12 +0,0 @@ +-#ifndef _GOOM_FX_H +-#define _GOOM_FX_H +- +-#include "goom_visual_fx.h" +-#include "goom_plugin_info.h" +- +-VisualFX convolve_create (); +-VisualFX flying_star_create (void); +- +-void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_graphic.h /src/goom_graphic.h +--- /home/d4rk/goom2k4-0/src/goom_graphic.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_graphic.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,74 +0,0 @@ +-#ifndef GRAPHIC_H +-#define GRAPHIC_H +- +-typedef unsigned int Uint; +- +-typedef struct +-{ +- unsigned short r, v, b; +-} +-Color; +- +-extern const Color BLACK; +-extern const Color WHITE; +-extern const Color RED; +-extern const Color BLUE; +-extern const Color GREEN; +-extern const Color YELLOW; +-extern const Color ORANGE; +-extern const Color VIOLET; +- +- +-#ifdef COLOR_BGRA +- +-#define B_CHANNEL 0xFF000000 +-#define G_CHANNEL 0x00FF0000 +-#define R_CHANNEL 0x0000FF00 +-#define A_CHANNEL 0x000000FF +-#define B_OFFSET 24 +-#define G_OFFSET 16 +-#define R_OFFSET 8 +-#define A_OFFSET 0 +- +-typedef union _PIXEL { +- struct { +- unsigned char b; +- unsigned char g; +- unsigned char r; +- unsigned char a; +- } channels; +- unsigned int val; +- unsigned char cop[4]; +-} Pixel; +- +-#else +- +-#define A_CHANNEL 0xFF000000 +-#define R_CHANNEL 0x00FF0000 +-#define G_CHANNEL 0x0000FF00 +-#define B_CHANNEL 0x000000FF +-#define A_OFFSET 24 +-#define R_OFFSET 16 +-#define G_OFFSET 8 +-#define B_OFFSET 0 +- +-typedef union _PIXEL { +- struct { +- unsigned char a; +- unsigned char r; +- unsigned char g; +- unsigned char b; +- } channels; +- unsigned int val; +- unsigned char cop[4]; +-} Pixel; +- +-#endif /* COLOR_BGRA */ +- +-/* +-inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c); +-inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c); +-*/ +- +- +-#endif /* GRAPHIC_H */ +diff -Naur /home/d4rk/goom2k4-0/src/goom.h /src/goom.h +--- /home/d4rk/goom2k4-0/src/goom.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,30 +0,0 @@ +-#ifndef _GOOMCORE_H +-#define _GOOMCORE_H +- +-#include "goom_config.h" +-#include "goom_plugin_info.h" +-#include "goomsl.h" +- +-#define NB_FX 10 +- +-PluginInfo *goom_init (guint32 resx, guint32 resy); +-void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy); +- +-/* +- * forceMode == 0 : do nothing +- * forceMode == -1 : lock the FX +- * forceMode == 1..NB_FX : force a switch to FX n# forceMode +- * +- * songTitle = pointer to the title of the song... +- * - NULL if it is not the start of the song +- * - only have a value at the start of the song +- */ +-guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], int forceMode, float fps, +- char *songTitle, char *message); +- +-/* returns 0 if the buffer wasn't accepted */ +-int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer); +- +-void goom_close (PluginInfo *goomInfo); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_hash.c /src/goom_hash.c +--- /home/d4rk/goom2k4-0/src/goom_hash.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_hash.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,100 +0,0 @@ +-#include "goom_hash.h" +-#include +-#include +- +-static GoomHashEntry *entry_new(const char *key, HashValue value) { +- +- GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); +- +- entry->key = (char *)malloc(strlen(key)+1); +- strcpy(entry->key,key); +- entry->value = value; +- entry->lower = NULL; +- entry->upper = NULL; +- +- return entry; +-} +- +-static void entry_free(GoomHashEntry *entry) { +- if (entry!=NULL) { +- entry_free(entry->lower); +- entry_free(entry->upper); +- free(entry->key); +- free(entry); +- } +-} +- +-static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { +- int cmp = strcmp(key,entry->key); +- if (cmp==0) { +- entry->value = value; +- } +- else if (cmp > 0) { +- if (entry->upper == NULL) +- entry->upper = entry_new(key,value); +- else +- entry_put(entry->upper, key, value); +- } +- else { +- if (entry->lower == NULL) +- entry->lower = entry_new(key,value); +- else +- entry_put(entry->lower, key, value); +- } +-} +- +-static HashValue *entry_get(GoomHashEntry *entry, const char *key) { +- +- int cmp; +- if (entry==NULL) +- return NULL; +- cmp = strcmp(key,entry->key); +- if (cmp > 0) +- return entry_get(entry->upper, key); +- else if (cmp < 0) +- return entry_get(entry->lower, key); +- else +- return &(entry->value); +-} +- +-GoomHash *goom_hash_new(void) { +- GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); +- _this->root = NULL; +- return _this; +-} +- +-void goom_hash_free(GoomHash *_this) { +- entry_free(_this->root); +- free(_this); +-} +- +-void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { +- if (_this->root == NULL) +- _this->root = entry_new(key,value); +- else +- entry_put(_this->root,key,value); +-} +- +-HashValue *goom_hash_get(GoomHash *_this, const char *key) { +- return entry_get(_this->root,key); +-} +- +-void goom_hash_put_int(GoomHash *_this, const char *key, int i) { +- HashValue value; +- value.i = i; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_float(GoomHash *_this, const char *key, float f) { +- HashValue value; +- value.f = f; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { +- HashValue value; +- value.ptr = ptr; +- goom_hash_put(_this,key,value); +-} +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goom_hash.h /src/goom_hash.h +--- /home/d4rk/goom2k4-0/src/goom_hash.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_hash.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-#ifndef _GOOM_HASH_H +-#define _GOOM_HASH_H +- +-typedef struct GOOM_HASH_ENTRY GoomHashEntry; +-typedef struct GOOM_HASH GoomHash; +- +-typedef union { +- void *ptr; +- int i; +- float f; +-} HashValue; +- +-struct GOOM_HASH_ENTRY { +- char *key; +- HashValue value; +- GoomHashEntry *lower; +- GoomHashEntry *upper; +-}; +- +-struct GOOM_HASH { +- GoomHashEntry *root; +-}; +- +-GoomHash *goom_hash_new(void); +-void goom_hash_free(GoomHash *gh); +- +-void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +-HashValue *goom_hash_get(GoomHash *gh, const char *key); +- +-void goom_hash_put_int(GoomHash *_this, const char *key, int i); +-void goom_hash_put_float(GoomHash *_this, const char *key, float f); +-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr); +- +-#endif /* _GOOM_HASH_H */ +diff -Naur /home/d4rk/goom2k4-0/src/goom_plugin_info.h /src/goom_plugin_info.h +--- /home/d4rk/goom2k4-0/src/goom_plugin_info.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_plugin_info.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,176 +0,0 @@ +-#ifndef _PLUGIN_INFO_H +-#define _PLUGIN_INFO_H +- +-#include "goom_typedefs.h" +- +-#include "goom_config.h" +- +-#include "goom_graphic.h" +-#include "goom_config_param.h" +-#include "goom_visual_fx.h" +-#include "goom_filters.h" +-#include "goom_tools.h" +-#include "goomsl.h" +- +-typedef struct { +- char drawIFS; +- char drawPoints; +- char drawTentacle; +- +- char drawScope; +- int farScope; +- +- int rangemin; +- int rangemax; +-} GoomState; +- +-#define STATES_MAX_NB 128 +- +-/** +- * Gives informations about the sound. +- */ +-struct _SOUND_INFO { +- +- /* nota : a Goom is just a sound event... */ +- +- int timeSinceLastGoom; /* >= 0 */ +- float goomPower; /* power of the last Goom [0..1] */ +- +- int timeSinceLastBigGoom; /* >= 0 */ +- +- float volume; /* [0..1] */ +- short samples[2][512]; +- +- /* other "internal" datas for the sound_tester */ +- float goom_limit; /* auto-updated limit of goom_detection */ +- float bigGoomLimit; +- float accelvar; /* acceleration of the sound - [0..1] */ +- float speedvar; /* speed of the sound - [0..100] */ +- int allTimesMax; +- int totalgoom; /* number of goom since last reset +- * (a reset every 64 cycles) */ +- +- float prov_max; /* accel max since last reset */ +- +- int cycle; +- +- /* private */ +- PluginParam volume_p; +- PluginParam speed_p; +- PluginParam accel_p; +- PluginParam goom_limit_p; +- PluginParam goom_power_p; +- PluginParam last_goom_p; +- PluginParam last_biggoom_p; +- PluginParam biggoom_speed_limit_p; +- PluginParam biggoom_factor_p; +- +- PluginParameters params; /* contains the previously defined parameters. */ +-}; +- +- +-/** +- * Allows FXs to know the current state of the plugin. +- */ +-struct _PLUGIN_INFO { +- +- /* public datas */ +- +- int nbParams; +- PluginParameters *params; +- +- /* private datas */ +- +- struct _SIZE_TYPE { +- int width; +- int height; +- int size; /* == screen.height * screen.width. */ +- } screen; +- +- SoundInfo sound; +- +- int nbVisuals; +- VisualFX **visuals; /* pointers on all the visual fx */ +- +- /** The known FX */ +- VisualFX convolve_fx; +- VisualFX star_fx; +- VisualFX zoomFilter_fx; +- VisualFX tentacles_fx; +- VisualFX ifs_fx; +- +- /** image buffers */ +- guint32 *pixel; +- guint32 *back; +- Pixel *p1, *p2; +- Pixel *conv; +- Pixel *outputBuf; +- +- /** state of goom */ +- guint32 cycle; +- GoomState states[STATES_MAX_NB]; +- int statesNumber; +- int statesRangeMax; +- +- GoomState *curGState; +- +- /** effet de ligne.. */ +- GMLine *gmline1; +- GMLine *gmline2; +- +- /** sinus table */ +- int sintable[0x10000]; +- +- /* INTERNALS */ +- +- /** goom_update internals. +- * I took all static variables from goom_update and put them here.. for the moment. +- */ +- struct { +- int lockvar; /* pour empecher de nouveaux changements */ +- int goomvar; /* boucle des gooms */ +- int loopvar; /* mouvement des points */ +- int stop_lines; +- int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */ +- int decay_ifs; /* disparition de l'ifs */ +- int recay_ifs; /* dedisparition de l'ifs */ +- int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */ +- int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */ +- int lineMode; /* l'effet lineaire a dessiner */ +- float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */ +- int switchIncrAmount; /* 0x7f */ +- float switchMult; /* 1.0f */ +- int switchIncr; /* = SWITCHINCR; */ +- int stateSelectionRnd; +- int stateSelectionBlocker; +- int previousZoomSpeed; +- int timeOfTitleDisplay; +- char titleText[1024]; +- ZoomFilterData zoomFilterData; +- } update; +- +- struct { +- int numberOfLinesInMessage; +- char message[0x800]; +- int affiche; +- int longueur; +- } update_message; +- +- struct { +- void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +- void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +- } methods; +- +- GoomRandom *gRandom; +- +- GoomSL *scanner; +- GoomSL *main_scanner; +- const char *main_script_str; +-}; +- +-void plugin_info_init(PluginInfo *p, int nbVisual); +- +-/* i = [0..p->nbVisual-1] */ +-void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goomsl.c /src/goomsl.c +--- /home/d4rk/goom2k4-0/src/goomsl.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1509 +0,0 @@ +-#include +-#include +-#include +-#include +-#include "goomsl.h" +-#include "goomsl_private.h" +-#include "goomsl_yacc.h" +- +-/*#define TRACE_SCRIPT*/ +- +- /* {{{ definition of the instructions number */ +-#define INSTR_SETI_VAR_INTEGER 1 +-#define INSTR_SETI_VAR_VAR 2 +-#define INSTR_SETF_VAR_FLOAT 3 +-#define INSTR_SETF_VAR_VAR 4 +-#define INSTR_NOP 5 +-/* #define INSTR_JUMP 6 */ +-#define INSTR_SETP_VAR_PTR 7 +-#define INSTR_SETP_VAR_VAR 8 +-#define INSTR_SUBI_VAR_INTEGER 9 +-#define INSTR_SUBI_VAR_VAR 10 +-#define INSTR_SUBF_VAR_FLOAT 11 +-#define INSTR_SUBF_VAR_VAR 12 +-#define INSTR_ISLOWERF_VAR_VAR 13 +-#define INSTR_ISLOWERF_VAR_FLOAT 14 +-#define INSTR_ISLOWERI_VAR_VAR 15 +-#define INSTR_ISLOWERI_VAR_INTEGER 16 +-#define INSTR_ADDI_VAR_INTEGER 17 +-#define INSTR_ADDI_VAR_VAR 18 +-#define INSTR_ADDF_VAR_FLOAT 19 +-#define INSTR_ADDF_VAR_VAR 20 +-#define INSTR_MULI_VAR_INTEGER 21 +-#define INSTR_MULI_VAR_VAR 22 +-#define INSTR_MULF_VAR_FLOAT 23 +-#define INSTR_MULF_VAR_VAR 24 +-#define INSTR_DIVI_VAR_INTEGER 25 +-#define INSTR_DIVI_VAR_VAR 26 +-#define INSTR_DIVF_VAR_FLOAT 27 +-#define INSTR_DIVF_VAR_VAR 28 +-/* #define INSTR_JZERO 29 */ +-#define INSTR_ISEQUALP_VAR_VAR 30 +-#define INSTR_ISEQUALP_VAR_PTR 31 +-#define INSTR_ISEQUALI_VAR_VAR 32 +-#define INSTR_ISEQUALI_VAR_INTEGER 33 +-#define INSTR_ISEQUALF_VAR_VAR 34 +-#define INSTR_ISEQUALF_VAR_FLOAT 35 +-/* #define INSTR_CALL 36 */ +-/* #define INSTR_RET 37 */ +-/* #define INSTR_EXT_CALL 38 */ +-#define INSTR_NOT_VAR 39 +-/* #define INSTR_JNZERO 40 */ +-#define INSTR_SETS_VAR_VAR 41 +-#define INSTR_ISEQUALS_VAR_VAR 42 +-#define INSTR_ADDS_VAR_VAR 43 +-#define INSTR_SUBS_VAR_VAR 44 +-#define INSTR_MULS_VAR_VAR 45 +-#define INSTR_DIVS_VAR_VAR 46 +- +- /* }}} */ +-/* {{{ definition of the validation error types */ +-static const char *VALIDATE_OK = "ok"; +-#define VALIDATE_ERROR "error while validating " +-#define VALIDATE_TODO "todo" +-#define VALIDATE_SYNTHAX_ERROR "synthax error" +-#define VALIDATE_NO_SUCH_INT "no such integer variable" +-#define VALIDATE_NO_SUCH_VAR "no such variable" +-#define VALIDATE_NO_SUCH_DEST_VAR "no such destination variable" +-#define VALIDATE_NO_SUCH_SRC_VAR "no such src variable" +-/* }}} */ +- +- /***********************************/ +- /* PROTOTYPE OF INTERNAL FUNCTIONS */ +-/***********************************/ +- +-/* {{{ */ +-static void gsl_instr_free(Instruction *_this); +-static const char *gsl_instr_validate(Instruction *_this); +-static void gsl_instr_display(Instruction *_this); +- +-static InstructionFlow *iflow_new(void); +-static void iflow_add_instr(InstructionFlow *_this, Instruction *instr); +-static void iflow_clean(InstructionFlow *_this); +-static void iflow_free(InstructionFlow *_this); +-static void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl); +-/* }}} */ +- +- /************************************/ +- /* DEFINITION OF INTERNAL FUNCTIONS */ +-/************************************/ +- +-void iflow_free(InstructionFlow *_this) +-{ /* {{{ */ +- goom_hash_free(_this->labels); +- free(_this); /*TODO: finir cette fonction */ +-} /* }}} */ +- +-void iflow_clean(InstructionFlow *_this) +-{ /* {{{ */ +- /* TODO: clean chaque instruction du flot */ +- _this->number = 0; +- goom_hash_free(_this->labels); +- _this->labels = goom_hash_new(); +-} /* }}} */ +- +-InstructionFlow *iflow_new(void) +-{ /* {{{ */ +- InstructionFlow *_this = (InstructionFlow*)malloc(sizeof(InstructionFlow)); +- _this->number = 0; +- _this->tabsize = 6; +- _this->instr = (Instruction**)malloc(_this->tabsize * sizeof(Instruction*)); +- _this->labels = goom_hash_new(); +- +- return _this; +-} /* }}} */ +- +-void iflow_add_instr(InstructionFlow *_this, Instruction *instr) +-{ /* {{{ */ +- if (_this->number == _this->tabsize) { +- _this->tabsize *= 2; +- _this->instr = (Instruction**)realloc(_this->instr, _this->tabsize * sizeof(Instruction*)); +- } +- _this->instr[_this->number] = instr; +- instr->address = _this->number; +- _this->number++; +-} /* }}} */ +- +-void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns) +-{ /* {{{ */ +- if (_this->cur_param <= 0) { +- fprintf(stderr, "ERROR: Line %d, No more params to instructions\n", _this->line_number); +- exit(1); +- } +- _this->vnamespace[_this->cur_param-1] = ns; +-} /* }}} */ +- +-void gsl_instr_add_param(Instruction *instr, char *param, int type) +-{ /* {{{ */ +- int len; +- if (instr==NULL) +- return; +- if (instr->cur_param==0) +- return; +- --instr->cur_param; +- len = strlen(param); +- instr->params[instr->cur_param] = (char*)malloc(len+1); +- strcpy(instr->params[instr->cur_param], param); +- instr->types[instr->cur_param] = type; +- if (instr->cur_param == 0) { +- +- const char *result = gsl_instr_validate(instr); +- if (result != VALIDATE_OK) { +- printf("ERROR: Line %d: ", instr->parent->num_lines + 1); +- gsl_instr_display(instr); +- printf("... %s\n", result); +- instr->parent->compilationOK = 0; +- exit(1); +- } +- +-#if USE_JITC_X86 +- iflow_add_instr(instr->parent->iflow, instr); +-#else +- if (instr->id != INSTR_NOP) +- iflow_add_instr(instr->parent->iflow, instr); +- else +- gsl_instr_free(instr); +-#endif +- } +-} /* }}} */ +- +-Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number) +-{ /* {{{ */ +- Instruction *instr = (Instruction*)malloc(sizeof(Instruction)); +- instr->params = (char**)malloc(nb_param*sizeof(char*)); +- instr->vnamespace = (GoomHash**)malloc(nb_param*sizeof(GoomHash*)); +- instr->types = (int*)malloc(nb_param*sizeof(int)); +- instr->cur_param = instr->nb_param = nb_param; +- instr->parent = parent; +- instr->id = id; +- instr->name = name; +- instr->jump_label = NULL; +- instr->line_number = line_number; +- return instr; +-} /* }}} */ +- +-void gsl_instr_free(Instruction *_this) +-{ /* {{{ */ +- int i; +- free(_this->types); +- for (i=_this->cur_param; i<_this->nb_param; ++i) +- free(_this->params[i]); +- free(_this->params); +- free(_this); +-} /* }}} */ +- +-void gsl_instr_display(Instruction *_this) +-{ /* {{{ */ +- int i=_this->nb_param-1; +- printf("%s", _this->name); +- while(i>=_this->cur_param) { +- printf(" %s", _this->params[i]); +- --i; +- } +-} /* }}} */ +- +- /****************************************/ +- /* VALIDATION OF INSTRUCTION PARAMETERS */ +-/****************************************/ +- +-static const char *validate_v_v(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- HashValue *src = goom_hash_get(_this->vnamespace[0], _this->params[0]); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_DEST_VAR; +- } +- if (src == NULL) { +- return VALIDATE_NO_SUCH_SRC_VAR; +- } +- _this->data.udest.var = dest->ptr; +- _this->data.usrc.var = src->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate_v_i(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- _this->data.usrc.value_int = strtol(_this->params[0],NULL,0); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_INT; +- } +- _this->data.udest.var = dest->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate_v_p(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- _this->data.usrc.value_ptr = strtol(_this->params[0],NULL,0); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_INT; +- } +- _this->data.udest.var = dest->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate_v_f(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- _this->data.usrc.value_float = atof(_this->params[0]); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_VAR; +- } +- _this->data.udest.var = dest->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate(Instruction *_this, +- int vf_f_id, int vf_v_id, +- int vi_i_id, int vi_v_id, +- int vp_p_id, int vp_v_id, +- int vs_v_id) +-{ /* {{{ */ +- if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FLOAT)) { +- _this->id = vf_f_id; +- return validate_v_f(_this); +- } +- else if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FVAR)) { +- _this->id = vf_v_id; +- return validate_v_v(_this); +- } +- else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_INTEGER)) { +- _this->id = vi_i_id; +- return validate_v_i(_this); +- } +- else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_IVAR)) { +- _this->id = vi_v_id; +- return validate_v_v(_this); +- } +- else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PTR)) { +- if (vp_p_id == INSTR_NOP) return VALIDATE_ERROR; +- _this->id = vp_p_id; +- return validate_v_p(_this); +- } +- else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PVAR)) { +- _this->id = vp_v_id; +- if (vp_v_id == INSTR_NOP) return VALIDATE_ERROR; +- return validate_v_v(_this); +- } +- else if ((_this->types[1] < FIRST_RESERVED) && (_this->types[1] >= 0) && (_this->types[0] == _this->types[1])) { +- _this->id = vs_v_id; +- if (vs_v_id == INSTR_NOP) return "Impossible operation to perform between two structs"; +- return validate_v_v(_this); +- } +- return VALIDATE_ERROR; +-} /* }}} */ +- +-const char *gsl_instr_validate(Instruction *_this) +-{ /* {{{ */ +- if (_this->id != INSTR_EXT_CALL) { +- int i = _this->nb_param; +- while (i>0) +- { +- i--; +- if (_this->types[i] == TYPE_VAR) { +- int type = gsl_type_of_var(_this->vnamespace[i], _this->params[i]); +- +- if (type == INSTR_INT) +- _this->types[i] = TYPE_IVAR; +- else if (type == INSTR_FLOAT) +- _this->types[i] = TYPE_FVAR; +- else if (type == INSTR_PTR) +- _this->types[i] = TYPE_PVAR; +- else if ((type >= 0) && (type < FIRST_RESERVED)) +- _this->types[i] = type; +- else fprintf(stderr,"WARNING: Line %d, %s has no namespace\n", _this->line_number, _this->params[i]); +- } +- } +- } +- +- switch (_this->id) { +- +- /* set */ +- case INSTR_SET: +- return validate(_this, +- INSTR_SETF_VAR_FLOAT, INSTR_SETF_VAR_VAR, +- INSTR_SETI_VAR_INTEGER, INSTR_SETI_VAR_VAR, +- INSTR_SETP_VAR_PTR, INSTR_SETP_VAR_VAR, +- INSTR_SETS_VAR_VAR); +- +- /* extcall */ +- case INSTR_EXT_CALL: +- if (_this->types[0] == TYPE_VAR) { +- HashValue *fval = goom_hash_get(_this->parent->functions, _this->params[0]); +- if (fval) { +- _this->data.udest.external_function = (struct _ExternalFunctionStruct*)fval->ptr; +- return VALIDATE_OK; +- } +- } +- return VALIDATE_ERROR; +- +- /* call */ +- case INSTR_CALL: +- if (_this->types[0] == TYPE_LABEL) { +- _this->jump_label = _this->params[0]; +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* ret */ +- case INSTR_RET: +- return VALIDATE_OK; +- +- /* jump */ +- case INSTR_JUMP: +- +- if (_this->types[0] == TYPE_LABEL) { +- _this->jump_label = _this->params[0]; +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* jzero / jnzero */ +- case INSTR_JZERO: +- case INSTR_JNZERO: +- +- if (_this->types[0] == TYPE_LABEL) { +- _this->jump_label = _this->params[0]; +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* label */ +- case INSTR_LABEL: +- +- if (_this->types[0] == TYPE_LABEL) { +- _this->id = INSTR_NOP; +- _this->nop_label = _this->params[0]; +- goom_hash_put_int(_this->parent->iflow->labels, _this->params[0], _this->parent->iflow->number); +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* isequal */ +- case INSTR_ISEQUAL: +- return validate(_this, +- INSTR_ISEQUALF_VAR_FLOAT, INSTR_ISEQUALF_VAR_VAR, +- INSTR_ISEQUALI_VAR_INTEGER, INSTR_ISEQUALI_VAR_VAR, +- INSTR_ISEQUALP_VAR_PTR, INSTR_ISEQUALP_VAR_VAR, +- INSTR_ISEQUALS_VAR_VAR); +- +- /* not */ +- case INSTR_NOT: +- _this->id = INSTR_NOT_VAR; +- return VALIDATE_OK; +- +- /* islower */ +- case INSTR_ISLOWER: +- return validate(_this, +- INSTR_ISLOWERF_VAR_FLOAT, INSTR_ISLOWERF_VAR_VAR, +- INSTR_ISLOWERI_VAR_INTEGER, INSTR_ISLOWERI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, INSTR_NOP); +- +- /* add */ +- case INSTR_ADD: +- return validate(_this, +- INSTR_ADDF_VAR_FLOAT, INSTR_ADDF_VAR_VAR, +- INSTR_ADDI_VAR_INTEGER, INSTR_ADDI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, +- INSTR_ADDS_VAR_VAR); +- +- /* mul */ +- case INSTR_MUL: +- return validate(_this, +- INSTR_MULF_VAR_FLOAT, INSTR_MULF_VAR_VAR, +- INSTR_MULI_VAR_INTEGER, INSTR_MULI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, +- INSTR_MULS_VAR_VAR); +- +- /* sub */ +- case INSTR_SUB: +- return validate(_this, +- INSTR_SUBF_VAR_FLOAT, INSTR_SUBF_VAR_VAR, +- INSTR_SUBI_VAR_INTEGER, INSTR_SUBI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, +- INSTR_SUBS_VAR_VAR); +- +- /* div */ +- case INSTR_DIV: +- return validate(_this, +- INSTR_DIVF_VAR_FLOAT, INSTR_DIVF_VAR_VAR, +- INSTR_DIVI_VAR_INTEGER, INSTR_DIVI_VAR_VAR, +- INSTR_NOP,INSTR_NOP, +- INSTR_DIVS_VAR_VAR); +- +- default: +- return VALIDATE_TODO; +- } +- return VALIDATE_ERROR; +-} /* }}} */ +- +- /*************/ +- /* EXECUTION */ +-/*************/ +-void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl) +-{ /* {{{ */ +- int flag = 0; +- int ip = 0; +- FastInstruction *instr = _this->instr; +- int stack[0x10000]; +- int stack_pointer = 0; +- +- stack[stack_pointer++] = -1; +- +- /* Quelques Macro pour rendre le code plus lisible */ +-#define pSRC_VAR instr[ip].data.usrc.var +-#define SRC_VAR_INT *instr[ip].data.usrc.var_int +-#define SRC_VAR_FLOAT *instr[ip].data.usrc.var_float +-#define SRC_VAR_PTR *instr[ip].data.usrc.var_ptr +- +-#define pDEST_VAR instr[ip].data.udest.var +-#define DEST_VAR_INT *instr[ip].data.udest.var_int +-#define DEST_VAR_FLOAT *instr[ip].data.udest.var_float +-#define DEST_VAR_PTR *instr[ip].data.udest.var_ptr +- +-#define VALUE_INT instr[ip].data.usrc.value_int +-#define VALUE_FLOAT instr[ip].data.usrc.value_float +-#define VALUE_PTR instr[ip].data.usrc.value_ptr +- +-#define JUMP_OFFSET instr[ip].data.udest.jump_offset +- +-#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +-#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +-#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +-#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +-#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +-#define DEST_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +-#define SRC_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +-#define SRC_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +-#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size +- +- while (1) +- { +- int i; +-#ifdef TRACE_SCRIPT +- printf("execute "); gsl_instr_display(instr[ip].proto); printf("\n"); +-#endif +- switch (instr[ip].id) { +- +- /* SET.I */ +- case INSTR_SETI_VAR_INTEGER: +- DEST_VAR_INT = VALUE_INT; +- ++ip; break; +- +- case INSTR_SETI_VAR_VAR: +- DEST_VAR_INT = SRC_VAR_INT; +- ++ip; break; +- +- /* SET.F */ +- case INSTR_SETF_VAR_FLOAT: +- DEST_VAR_FLOAT = VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_SETF_VAR_VAR: +- DEST_VAR_FLOAT = SRC_VAR_FLOAT; +- ++ip; break; +- +- /* SET.P */ +- case INSTR_SETP_VAR_VAR: +- DEST_VAR_PTR = SRC_VAR_PTR; +- ++ip; break; +- +- case INSTR_SETP_VAR_PTR: +- DEST_VAR_PTR = VALUE_PTR; +- ++ip; break; +- +- /* JUMP */ +- case INSTR_JUMP: +- ip += JUMP_OFFSET; break; +- +- /* JZERO */ +- case INSTR_JZERO: +- ip += (flag ? 1 : JUMP_OFFSET); break; +- +- case INSTR_NOP: +- ++ip; break; +- +- /* ISEQUAL.P */ +- case INSTR_ISEQUALP_VAR_VAR: +- flag = (DEST_VAR_PTR == SRC_VAR_PTR); +- ++ip; break; +- +- case INSTR_ISEQUALP_VAR_PTR: +- flag = (DEST_VAR_PTR == VALUE_PTR); +- ++ip; break; +- +- /* ISEQUAL.I */ +- case INSTR_ISEQUALI_VAR_VAR: +- flag = (DEST_VAR_INT == SRC_VAR_INT); +- ++ip; break; +- +- case INSTR_ISEQUALI_VAR_INTEGER: +- flag = (DEST_VAR_INT == VALUE_INT); +- ++ip; break; +- +- /* ISEQUAL.F */ +- case INSTR_ISEQUALF_VAR_VAR: +- flag = (DEST_VAR_FLOAT == SRC_VAR_FLOAT); +- ++ip; break; +- +- case INSTR_ISEQUALF_VAR_FLOAT: +- flag = (DEST_VAR_FLOAT == VALUE_FLOAT); +- ++ip; break; +- +- /* ISLOWER.I */ +- case INSTR_ISLOWERI_VAR_VAR: +- flag = (DEST_VAR_INT < SRC_VAR_INT); +- ++ip; break; +- +- case INSTR_ISLOWERI_VAR_INTEGER: +- flag = (DEST_VAR_INT < VALUE_INT); +- ++ip; break; +- +- /* ISLOWER.F */ +- case INSTR_ISLOWERF_VAR_VAR: +- flag = (DEST_VAR_FLOAT < SRC_VAR_FLOAT); +- ++ip; break; +- +- case INSTR_ISLOWERF_VAR_FLOAT: +- flag = (DEST_VAR_FLOAT < VALUE_FLOAT); +- ++ip; break; +- +- /* ADD.I */ +- case INSTR_ADDI_VAR_VAR: +- DEST_VAR_INT += SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_ADDI_VAR_INTEGER: +- DEST_VAR_INT += VALUE_INT; +- ++ip; break; +- +- /* ADD.F */ +- case INSTR_ADDF_VAR_VAR: +- DEST_VAR_FLOAT += SRC_VAR_FLOAT; +- ++ip; break; +- +- case INSTR_ADDF_VAR_FLOAT: +- DEST_VAR_FLOAT += VALUE_FLOAT; +- ++ip; break; +- +- /* MUL.I */ +- case INSTR_MULI_VAR_VAR: +- DEST_VAR_INT *= SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_MULI_VAR_INTEGER: +- DEST_VAR_INT *= VALUE_INT; +- ++ip; break; +- +- /* MUL.F */ +- case INSTR_MULF_VAR_FLOAT: +- DEST_VAR_FLOAT *= VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_MULF_VAR_VAR: +- DEST_VAR_FLOAT *= SRC_VAR_FLOAT; +- ++ip; break; +- +- /* DIV.I */ +- case INSTR_DIVI_VAR_VAR: +- DEST_VAR_INT /= SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_DIVI_VAR_INTEGER: +- DEST_VAR_INT /= VALUE_INT; +- ++ip; break; +- +- /* DIV.F */ +- case INSTR_DIVF_VAR_FLOAT: +- DEST_VAR_FLOAT /= VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_DIVF_VAR_VAR: +- DEST_VAR_FLOAT /= SRC_VAR_FLOAT; +- ++ip; break; +- +- /* SUB.I */ +- case INSTR_SUBI_VAR_VAR: +- DEST_VAR_INT -= SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_SUBI_VAR_INTEGER: +- DEST_VAR_INT -= VALUE_INT; +- ++ip; break; +- +- /* SUB.F */ +- case INSTR_SUBF_VAR_FLOAT: +- DEST_VAR_FLOAT -= VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_SUBF_VAR_VAR: +- DEST_VAR_FLOAT -= SRC_VAR_FLOAT; +- ++ip; break; +- +- /* CALL */ +- case INSTR_CALL: +- stack[stack_pointer++] = ip + 1; +- ip += JUMP_OFFSET; break; +- +- /* RET */ +- case INSTR_RET: +- ip = stack[--stack_pointer]; +- if (ip<0) return; +- break; +- +- /* EXT_CALL */ +- case INSTR_EXT_CALL: +- instr[ip].data.udest.external_function->function(gsl, gsl->vars, instr[ip].data.udest.external_function->vars); +- ++ip; break; +- +- /* NOT */ +- case INSTR_NOT_VAR: +- flag = !flag; +- ++ip; break; +- +- /* JNZERO */ +- case INSTR_JNZERO: +- ip += (flag ? JUMP_OFFSET : 1); break; +- +- case INSTR_SETS_VAR_VAR: +- memcpy(pDEST_VAR, pSRC_VAR, DEST_STRUCT_SIZE); +- ++ip; break; +- +- case INSTR_ISEQUALS_VAR_VAR: +- break; +- +- case INSTR_ADDS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) += SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- case INSTR_SUBS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) -= SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) -= SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- case INSTR_MULS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) *= SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) *= SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- case INSTR_DIVS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) /= SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) /= SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- default: +- printf("NOT IMPLEMENTED : %d\n", instr[ip].id); +- ++ip; +- exit(1); +- } +- } +-} /* }}} */ +- +-int gsl_malloc(GoomSL *_this, int size) +-{ /* {{{ */ +- if (_this->nbPtr >= _this->ptrArraySize) { +- _this->ptrArraySize *= 2; +- _this->ptrArray = (void**)realloc(_this->ptrArray, sizeof(void*) * _this->ptrArraySize); +- } +- _this->ptrArray[_this->nbPtr] = malloc(size); +- return _this->nbPtr++; +-} /* }}} */ +- +-void *gsl_get_ptr(GoomSL *_this, int id) +-{ /* {{{ */ +- if ((id>=0)&&(id<_this->nbPtr)) +- return _this->ptrArray[id]; +- fprintf(stderr,"INVALID GET PTR 0x%08x\n", id); +- return NULL; +-} /* }}} */ +- +-void gsl_free_ptr(GoomSL *_this, int id) +-{ /* {{{ */ +- if ((id>=0)&&(id<_this->nbPtr)) { +- free(_this->ptrArray[id]); +- _this->ptrArray[id] = 0; +- } +-} /* }}} */ +- +-void gsl_enternamespace(const char *name) +-{ /* {{{ */ +- HashValue *val = goom_hash_get(currentGoomSL->functions, name); +- if (val) { +- ExternalFunctionStruct *function = (ExternalFunctionStruct*)val->ptr; +- currentGoomSL->currentNS++; +- currentGoomSL->namespaces[currentGoomSL->currentNS] = function->vars; +- } +- else { +- fprintf(stderr, "ERROR: Line %d, Could not find namespace: %s\n", currentGoomSL->num_lines, name); +- exit(1); +- } +-} /* }}} */ +- +-void gsl_reenternamespace(GoomHash *nsinfo) { +- currentGoomSL->currentNS++; +- currentGoomSL->namespaces[currentGoomSL->currentNS] = nsinfo; +-} +- +-GoomHash *gsl_leavenamespace(void) +-{ /* {{{ */ +- currentGoomSL->currentNS--; +- return currentGoomSL->namespaces[currentGoomSL->currentNS+1]; +-} /* }}} */ +- +-GoomHash *gsl_find_namespace(const char *name) +-{ /* {{{ */ +- int i; +- for (i=currentGoomSL->currentNS;i>=0;--i) { +- if (goom_hash_get(currentGoomSL->namespaces[i], name)) +- return currentGoomSL->namespaces[i]; +- } +- return NULL; +-} /* }}} */ +- +-void gsl_declare_task(const char *name) +-{ /* {{{ */ +- if (goom_hash_get(currentGoomSL->functions, name)) { +- return; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); +- gef->function = 0; +- gef->vars = goom_hash_new(); +- gef->is_extern = 0; +- goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); +- } +-} /* }}} */ +- +-void gsl_declare_external_task(const char *name) +-{ /* {{{ */ +- if (goom_hash_get(currentGoomSL->functions, name)) { +- fprintf(stderr, "ERROR: Line %d, Duplicate declaration of %s\n", currentGoomSL->num_lines, name); +- return; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); +- gef->function = 0; +- gef->vars = goom_hash_new(); +- gef->is_extern = 1; +- goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); +- } +-} /* }}} */ +- +-static void reset_scanner(GoomSL *gss) +-{ /* {{{ */ +- gss->num_lines = 0; +- gss->instr = NULL; +- iflow_clean(gss->iflow); +- +- /* reset variables */ +- goom_hash_free(gss->vars); +- gss->vars = goom_hash_new(); +- gss->currentNS = 0; +- gss->namespaces[0] = gss->vars; +- +- goom_hash_free(gss->structIDS); +- gss->structIDS = goom_hash_new(); +- +- while (gss->nbStructID > 0) { +- int i; +- gss->nbStructID--; +- for(i=0;igsl_struct[gss->nbStructID]->nbFields;++i) +- free(gss->gsl_struct[gss->nbStructID]->fields[i]); +- free(gss->gsl_struct[gss->nbStructID]); +- } +- +- gss->compilationOK = 1; +- +- goom_heap_delete(gss->data_heap); +- gss->data_heap = goom_heap_new(); +-} /* }}} */ +- +-static void calculate_labels(InstructionFlow *iflow) +-{ /* {{{ */ +- int i = 0; +- while (i < iflow->number) { +- Instruction *instr = iflow->instr[i]; +- if (instr->jump_label) { +- HashValue *label = goom_hash_get(iflow->labels,instr->jump_label); +- if (label) { +- instr->data.udest.jump_offset = -instr->address + label->i; +- } +- else { +- fprintf(stderr, "ERROR: Line %d, Could not find label %s\n", instr->line_number, instr->jump_label); +- instr->id = INSTR_NOP; +- instr->nop_label = 0; +- exit(1); +- } +- } +- ++i; +- } +-} /* }}} */ +- +-static int powerOfTwo(int i) +-{ +- int b; +- for (b=0;b<31;b++) +- if (i == (1<iflow->number; +- int i; +-#ifdef USE_JITC_X86 +- +- /* pour compatibilite avec les MACROS servant a execution */ +- int ip = 0; +- GoomSL *gsl = currentGoomSL; +- +- JitcX86Env *jitc; +- +- if (currentGoomSL->jitc != NULL) +- jitc_x86_delete(currentGoomSL->jitc); +- jitc = currentGoomSL->jitc = jitc_x86_env_new(0xffff); +- currentGoomSL->jitc_func = jitc_prepare_func(jitc); +- +-#if 0 +-#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +-#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +-#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +-#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +-#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +-#define DEST_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +-#define SRC_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +-#define SRC_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +-#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size +-#endif +- +- JITC_JUMP_LABEL(jitc, "__very_end__"); +- JITC_ADD_LABEL (jitc, "__very_start__"); +- +- for (i=0;iiflow->instr[i]; +- switch (instr->id) { +- case INSTR_SETI_VAR_INTEGER : +- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); +- break; +- case INSTR_SETI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- /* SET.F */ +- case INSTR_SETF_VAR_FLOAT : +- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_float, *(int*)(&instr->data.usrc.value_float)); +- break; +- case INSTR_SETF_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_float); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_float); +- break; +- case INSTR_NOP : +- if (instr->nop_label != 0) +- JITC_ADD_LABEL(jitc, instr->nop_label); +- break; +- case INSTR_JUMP : +- JITC_JUMP_LABEL(jitc,instr->jump_label); +- break; +- case INSTR_SETP_VAR_PTR : +- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_ptr, instr->data.usrc.value_ptr); +- break; +- case INSTR_SETP_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_ptr); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_ptr); +- break; +- case INSTR_SUBI_VAR_INTEGER : +- jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, -instr->data.usrc.value_int); +- break; +- case INSTR_SUBI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "sub eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_SUBF_VAR_FLOAT : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_SUBF_VAR_VAR : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISLOWERF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISLOWERF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISLOWERI_VAR_VAR: +- jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); +- jitc_add(jitc,"sub edx, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc,"shr edx, $d", 31); +- break; +- case INSTR_ISLOWERI_VAR_INTEGER: +- jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); +- jitc_add(jitc,"sub edx, $d", instr->data.usrc.value_int); +- jitc_add(jitc,"shr edx, $d", 31); +- break; +- case INSTR_ADDI_VAR_INTEGER: +- jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); +- break; +- case INSTR_ADDI_VAR_VAR: +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "add eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_ADDF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ADDF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_MULI_VAR_INTEGER: +- if (instr->data.usrc.value_int != 1) +- { +- int po2 = powerOfTwo(instr->data.usrc.value_int); +- if (po2) { +- /* performs (V / 2^n) by doing V >> n */ +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "sal eax, $d", po2); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- } +- else { +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "imul eax, $d", instr->data.usrc.value_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- } +- } +- break; +- case INSTR_MULI_VAR_VAR: +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "imul eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_MULF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_MULF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_DIVI_VAR_INTEGER: +- if ((instr->data.usrc.value_int != 1) && (instr->data.usrc.value_int != 0)) +- { +- int po2 = powerOfTwo(instr->data.usrc.value_int); +- if (po2) { +- /* performs (V / 2^n) by doing V >> n */ +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "sar eax, $d", po2); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- } +- else { +- /* performs (V/n) by doing (V*(32^2/n)) */ +- long coef; +- double dcoef = (double)4294967296.0 / (double)instr->data.usrc.value_int; +- if (dcoef < 0.0) dcoef = -dcoef; +- coef = (long)floor(dcoef); +- dcoef -= floor(dcoef); +- if (dcoef < 0.5) coef += 1; +- +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "mov edx, $d", coef); +- jitc_add(jitc, "imul edx"); +- if (instr->data.usrc.value_int < 0) +- jitc_add(jitc, "neg edx"); +- jitc_add(jitc, "mov [$d], edx", instr->data.udest.var_int); +- } +- } +- break; +- case INSTR_DIVI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "cdq"); /* sign extend eax into edx */ +- jitc_add(jitc, "idiv [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_DIVF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_DIVF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_JZERO: +- jitc_add(jitc, "cmp edx, $d", 0); +- jitc_add(jitc, "je $s", instr->jump_label); +- break; +- case INSTR_ISEQUALP_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_ptr); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALP_VAR_PTR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_ptr); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALI_VAR_INTEGER : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_int); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALF_VAR_VAR : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISEQUALF_VAR_FLOAT : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_CALL: +- jitc_add(jitc, "call $s", instr->jump_label); +- break; +- case INSTR_RET: +- jitc_add(jitc, "ret"); +- break; +- case INSTR_EXT_CALL: +- jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function->vars)); +- jitc_add(jitc, "push eax"); +- jitc_add(jitc, "mov edx, [$d]", &(currentGoomSL->vars)); +- jitc_add(jitc, "push edx"); +- jitc_add(jitc, "mov eax, [$d]", &(currentGoomSL)); +- jitc_add(jitc, "push eax"); +- +- jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function)); +- jitc_add(jitc, "mov eax, [eax]"); +- jitc_add(jitc, "call [eax]"); +- jitc_add(jitc, "add esp, $d", 12); +- break; +- case INSTR_NOT_VAR: +- jitc_add(jitc, "mov eax, edx"); +- jitc_add(jitc, "mov edx, $d", 1); +- jitc_add(jitc, "sub edx, eax"); +- break; +- case INSTR_JNZERO: +- jitc_add(jitc, "cmp edx, $d", 0); +- jitc_add(jitc, "jne $s", instr->jump_label); +- break; +- case INSTR_SETS_VAR_VAR: +- { +- int loop = DEST_STRUCT_SIZE / sizeof(int); +- int dst = (int)pDEST_VAR; +- int src = (int)pSRC_VAR; +- +- while (loop--) { +- jitc_add(jitc,"mov eax, [$d]", src); +- jitc_add(jitc,"mov [$d], eax", dst); +- src += 4; +- dst += 4; +- } +- } +- break; +- case INSTR_ISEQUALS_VAR_VAR: +- break; +- case INSTR_ADDS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { /* TODO interlace 2 */ +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "add eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- /* DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); */ +- /* TODO */ +- } +- ++i; +- } +- break; +- } +- case INSTR_SUBS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "sub eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- break; +- } +- case INSTR_MULS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "imul eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- break; +- } +- case INSTR_DIVS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "cdq"); +- jitc_add(jitc, "idiv [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- break; +- } +- } +- } +- +- JITC_ADD_LABEL (jitc, "__very_end__"); +- jitc_add(jitc, "call $s", "__very_start__"); +- jitc_add(jitc, "mov eax, $d", 0); +- jitc_validate_func(jitc); +-#else +- InstructionFlow *iflow = currentGoomSL->iflow; +- FastInstructionFlow *fastiflow = (FastInstructionFlow*)malloc(sizeof(FastInstructionFlow)); +- fastiflow->mallocedInstr = calloc(number*16, sizeof(FastInstruction)); +- /* fastiflow->instr = (FastInstruction*)(((int)fastiflow->mallocedInstr) + 16 - (((int)fastiflow->mallocedInstr)%16)); */ +- fastiflow->instr = (FastInstruction*)fastiflow->mallocedInstr; +- fastiflow->number = number; +- for(i=0;iinstr[i].id = iflow->instr[i]->id; +- fastiflow->instr[i].data = iflow->instr[i]->data; +- fastiflow->instr[i].proto = iflow->instr[i]; +- } +- currentGoomSL->fastiflow = fastiflow; +-#endif +-} /* }}} */ +- +-void yy_scan_string(const char *str); +-void yyparse(void); +- +-GoomHash *gsl_globals(GoomSL *_this) +-{ +- return _this->vars; +-} +- +- +-/** +- * Some native external functions +- */ +-static void ext_charAt(GoomSL *gsl, GoomHash *global, GoomHash *local) +-{ +- char *string = GSL_LOCAL_PTR(gsl, local, "value"); +- int index = GSL_LOCAL_INT(gsl, local, "index"); +- GSL_GLOBAL_INT(gsl, "charAt") = 0; +- if (string == NULL) { +- return; +- } +- if (index < strlen(string)) +- GSL_GLOBAL_INT(gsl, "charAt") = string[index]; +-} +- +-static void ext_i2f(GoomSL *gsl, GoomHash *global, GoomHash *local) +-{ +- int i = GSL_LOCAL_INT(gsl, local, "value"); +- GSL_GLOBAL_FLOAT(gsl, "i2f") = i; +-} +- +-static void ext_f2i(GoomSL *gsl, GoomHash *global, GoomHash *local) +-{ +- float f = GSL_LOCAL_FLOAT(gsl, local, "value"); +- GSL_GLOBAL_INT(gsl, "f2i") = f; +-} +- +-/** +- * +- */ +-void gsl_compile(GoomSL *_currentGoomSL, const char *script) +-{ /* {{{ */ +- char *script_and_externals; +- static const char *sBinds = +- "external : int\n" +- "external : int\n" +- "external : float\n"; +- +-#ifdef VERBOSE +- printf("\n=== Starting Compilation ===\n"); +-#endif +- +- script_and_externals = malloc(strlen(script) + strlen(sBinds) + 2); +- strcpy(script_and_externals, sBinds); +- strcat(script_and_externals, script); +- +- /* 0- reset */ +- currentGoomSL = _currentGoomSL; +- reset_scanner(currentGoomSL); +- +- /* 1- create the syntaxic tree */ +- yy_scan_string(script_and_externals); +- yyparse(); +- +- /* 2- generate code */ +- gsl_commit_compilation(); +- +- /* 3- resolve symbols */ +- calculate_labels(currentGoomSL->iflow); +- +- /* 4- optimize code */ +- gsl_create_fast_iflow(); +- +- /* 5- bind a few internal functions */ +- gsl_bind_function(currentGoomSL, "charAt", ext_charAt); +- gsl_bind_function(currentGoomSL, "f2i", ext_f2i); +- gsl_bind_function(currentGoomSL, "i2f", ext_i2f); +- free(script_and_externals); +- +-#ifdef VERBOSE +- printf("=== Compilation done. # of lines: %d. # of instr: %d ===\n", currentGoomSL->num_lines, currentGoomSL->iflow->number); +-#endif +-} /* }}} */ +- +-void gsl_execute(GoomSL *scanner) +-{ /* {{{ */ +- if (scanner->compilationOK) { +-#if USE_JITC_X86 +- scanner->jitc_func(); +-#else +- iflow_execute(scanner->fastiflow, scanner); +-#endif +- } +-} /* }}} */ +- +-GoomSL *gsl_new(void) +-{ /* {{{ */ +- GoomSL *gss = (GoomSL*)malloc(sizeof(GoomSL)); +- +- gss->iflow = iflow_new(); +- gss->vars = goom_hash_new(); +- gss->functions = goom_hash_new(); +- gss->nbStructID = 0; +- gss->structIDS = goom_hash_new(); +- gss->gsl_struct_size = 32; +- gss->gsl_struct = (GSL_Struct**)malloc(gss->gsl_struct_size * sizeof(GSL_Struct*)); +- gss->currentNS = 0; +- gss->namespaces[0] = gss->vars; +- gss->data_heap = goom_heap_new(); +- +- reset_scanner(gss); +- +- gss->compilationOK = 0; +- gss->nbPtr=0; +- gss->ptrArraySize=256; +- gss->ptrArray = (void**)malloc(gss->ptrArraySize * sizeof(void*)); +-#ifdef USE_JITC_X86 +- gss->jitc = NULL; +-#endif +- return gss; +-} /* }}} */ +- +-void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func) +-{ /* {{{ */ +- HashValue *val = goom_hash_get(gss->functions, fname); +- if (val) { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)val->ptr; +- gef->function = func; +- } +- else fprintf(stderr, "Unable to bind function %s\n", fname); +-} /* }}} */ +- +-int gsl_is_compiled(GoomSL *gss) +-{ /* {{{ */ +- return gss->compilationOK; +-} /* }}} */ +- +-void gsl_free(GoomSL *gss) +-{ /* {{{ */ +- iflow_free(gss->iflow); +- free(gss->vars); +- free(gss->functions); +- free(gss); +-} /* }}} */ +- +- +-static int gsl_nb_import; +-static char gsl_already_imported[256][256]; +- +-char *gsl_init_buffer(const char *fname) +-{ +- char *fbuffer; +- fbuffer = (char*)malloc(512); +- fbuffer[0]=0; +- gsl_nb_import = 0; +- if (fname) +- gsl_append_file_to_buffer(fname,&fbuffer); +- return fbuffer; +-} +- +-static char *gsl_read_file(const char *fname) +-{ +- FILE *f; +- char *buffer; +- int fsize; +- f = fopen(fname,"rt"); +- if (!f) { +- fprintf(stderr, "ERROR: Could not load file %s\n", fname); +- exit(1); +- } +- fseek(f,0,SEEK_END); +- fsize = ftell(f); +- rewind(f); +- buffer = (char*)malloc(fsize+512); +- fread(buffer,1,fsize,f); +- fclose(f); +- buffer[fsize]=0; +- return buffer; +-} +- +-void gsl_append_file_to_buffer(const char *fname, char **buffer) +-{ +- char *fbuffer; +- int size,fsize,i=0; +- char reset_msg[256]; +- +- /* look if the file have not been already imported */ +- for (i=0;iptr) +-#define GSL_LOCAL_INT(gsl,local,name) (*(int*)goom_hash_get(local,name)->ptr) +-#define GSL_LOCAL_FLOAT(gsl,local,name) (*(float*)goom_hash_get(local,name)->ptr) +- +-#define GSL_GLOBAL_PTR(gsl,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +-#define GSL_GLOBAL_INT(gsl,name) (*(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +-#define GSL_GLOBAL_FLOAT(gsl,name) (*(float*)goom_hash_get(gsl_globals(gsl),name)->ptr) +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_hash.c /src/goomsl_hash.c +--- /home/d4rk/goom2k4-0/src/goomsl_hash.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_hash.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,120 +0,0 @@ +-#include "goomsl_hash.h" +-#include +-#include +- +-static GoomHashEntry *entry_new(const char *key, HashValue value) { +- +- int len = strlen(key); +- GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); +- +- entry->key = (char *)malloc(len+1); +- memcpy(entry->key,key,len+1); +- entry->value = value; +- entry->lower = NULL; +- entry->upper = NULL; +- +- return entry; +-} +- +-static void entry_free(GoomHashEntry *entry) { +- if (entry!=NULL) { +- entry_free(entry->lower); +- entry_free(entry->upper); +- free(entry->key); +- free(entry); +- } +-} +- +-static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { +- int cmp = strcmp(key,entry->key); +- if (cmp==0) { +- entry->value = value; +- } +- else if (cmp > 0) { +- if (entry->upper == NULL) +- entry->upper = entry_new(key,value); +- else +- entry_put(entry->upper, key, value); +- } +- else { +- if (entry->lower == NULL) +- entry->lower = entry_new(key,value); +- else +- entry_put(entry->lower, key, value); +- } +-} +- +-static HashValue *entry_get(GoomHashEntry *entry, const char *key) { +- +- int cmp; +- if (entry==NULL) +- return NULL; +- cmp = strcmp(key,entry->key); +- if (cmp > 0) +- return entry_get(entry->upper, key); +- else if (cmp < 0) +- return entry_get(entry->lower, key); +- else +- return &(entry->value); +-} +- +-GoomHash *goom_hash_new() { +- GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); +- _this->root = NULL; +- _this->number_of_puts = 0; +- return _this; +-} +- +-void goom_hash_free(GoomHash *_this) { +- entry_free(_this->root); +- free(_this); +-} +- +-void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { +- _this->number_of_puts += 1; +- if (_this->root == NULL) +- _this->root = entry_new(key,value); +- else +- entry_put(_this->root,key,value); +-} +- +-HashValue *goom_hash_get(GoomHash *_this, const char *key) { +- if (_this == NULL) return NULL; +- return entry_get(_this->root,key); +-} +- +-void goom_hash_put_int(GoomHash *_this, const char *key, int i) { +- HashValue value; +- value.i = i; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_float(GoomHash *_this, const char *key, float f) { +- HashValue value; +- value.f = f; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { +- HashValue value; +- value.ptr = ptr; +- goom_hash_put(_this,key,value); +-} +- +-/* FOR EACH */ +- +-static void _goom_hash_for_each(GoomHash *_this, GoomHashEntry *entry, GH_Func func) +-{ +- if (entry == NULL) return; +- func(_this, entry->key, &(entry->value)); +- _goom_hash_for_each(_this, entry->lower, func); +- _goom_hash_for_each(_this, entry->upper, func); +-} +- +-void goom_hash_for_each(GoomHash *_this, GH_Func func) { +- _goom_hash_for_each(_this, _this->root, func); +-} +- +-int goom_hash_number_of_puts(GoomHash *_this) { +- return _this->number_of_puts; +-} +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_hash.h /src/goomsl_hash.h +--- /home/d4rk/goom2k4-0/src/goomsl_hash.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_hash.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,40 +0,0 @@ +-#ifndef _GOOMSL_HASH_H +-#define _GOOMSL_HASH_H +- +-typedef struct GOOM_HASH_ENTRY GoomHashEntry; +-typedef struct GOOM_HASH GoomHash; +- +-typedef union { +- void *ptr; +- int i; +- float f; +-} HashValue; +- +-struct GOOM_HASH_ENTRY { +- char *key; +- HashValue value; +- GoomHashEntry *lower; +- GoomHashEntry *upper; +-}; +- +-struct GOOM_HASH { +- GoomHashEntry *root; +- int number_of_puts; +-}; +- +-GoomHash *goom_hash_new(); +-void goom_hash_free(GoomHash *gh); +- +-void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +-HashValue *goom_hash_get(GoomHash *gh, const char *key); +- +-void goom_hash_put_int (GoomHash *_this, const char *key, int i); +-void goom_hash_put_float(GoomHash *_this, const char *key, float f); +-void goom_hash_put_ptr (GoomHash *_this, const char *key, void *ptr); +- +-typedef void (*GH_Func)(GoomHash *caller, const char *key, HashValue *value); +- +-void goom_hash_for_each(GoomHash *_this, GH_Func func); +-int goom_hash_number_of_puts(GoomHash *_this); +- +-#endif /* _GOOM_HASH_H */ +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_heap.c /src/goomsl_heap.c +--- /home/d4rk/goom2k4-0/src/goomsl_heap.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_heap.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,105 +0,0 @@ +-#include "goomsl_heap.h" +-#include +- +-struct _GOOM_HEAP { +- void **arrays; +- int number_of_arrays; +- int size_of_each_array; +- int consumed_in_last_array; +-}; +- +-/* Constructors / Destructor */ +-GoomHeap *goom_heap_new(void) +-{ +- return goom_heap_new_with_granularity(4096); +-} +- +-GoomHeap *goom_heap_new_with_granularity(int granularity) +-{ +- GoomHeap *_this; +- _this = (GoomHeap*)malloc(sizeof(GoomHeap)); +- _this->number_of_arrays = 0; +- _this->size_of_each_array = granularity; +- _this->consumed_in_last_array = 0; +- _this->arrays = (void**)malloc(sizeof(void*)); +- return _this; +-} +- +-void goom_heap_delete(GoomHeap *_this) +-{ +- int i; +- for (i=0;i<_this->number_of_arrays;++i) { +- free(_this->arrays[i]); +- } +- free(_this->arrays); +- free(_this); +-} +- +-static void align_it(GoomHeap *_this, int alignment) +-{ +- if ((alignment > 1) && (_this->number_of_arrays>0)) { +- void *last_array = _this->arrays[_this->number_of_arrays - 1]; +- int last_address = (int)last_array + _this->consumed_in_last_array; +- int decal = (last_address % alignment); +- if (decal != 0) { +- _this->consumed_in_last_array += alignment - decal; +- } +- } +-} +- +-void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, +- int alignment, int prefix_bytes) +-{ +- void *retval = NULL; +- +- /* d'abord on gere les problemes d'alignement */ +- _this->consumed_in_last_array += prefix_bytes; +- align_it(_this, alignment); +- +- /* ensuite on verifie que la quantite de memoire demandee tient dans le buffer */ +- if ((_this->consumed_in_last_array + nb_bytes >= _this->size_of_each_array) +- || (_this->number_of_arrays == 0)) { +- +- if (prefix_bytes + nb_bytes + alignment >= _this->size_of_each_array) { +- +- /* Si la zone demandee est plus grosse que la granularitee */ +- /* On alloue un buffer plus gros que les autres */ +- _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * (_this->number_of_arrays+2)); +- +- _this->number_of_arrays += 1; +- _this->consumed_in_last_array = prefix_bytes; +- +- _this->arrays[_this->number_of_arrays - 1] = malloc(prefix_bytes + nb_bytes + alignment); +- align_it(_this,alignment); +- retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); +- +- /* puis on repart sur un nouveau buffer vide */ +- _this->number_of_arrays += 1; +- _this->consumed_in_last_array = 0; +- _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); +- return retval; +- } +- else { +- _this->number_of_arrays += 1; +- _this->consumed_in_last_array = prefix_bytes; +- _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * _this->number_of_arrays); +- +- _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); +- align_it(_this,alignment); +- } +- } +- retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); +- _this->consumed_in_last_array += nb_bytes; +- return retval; +-} +- +-void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment) +-{ +- return goom_heap_malloc_with_alignment_prefixed(_this, nb_bytes, alignment, 0); +-} +- +-void *goom_heap_malloc(GoomHeap *_this, int nb_bytes) +-{ +- return goom_heap_malloc_with_alignment(_this,nb_bytes,1); +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_heap.h /src/goomsl_heap.h +--- /home/d4rk/goom2k4-0/src/goomsl_heap.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_heap.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,29 +0,0 @@ +-#ifndef GOOMSL_HEAP +-#define GOOMSL_HEAP +- +-/** +- * Resizable Array that guarranty that resizes don't change address of +- * the stored datas. +- * +- * This is implemented as an array of arrays... granularity is the size +- * of each arrays. +- */ +- +-typedef struct _GOOM_HEAP GoomHeap; +- +-/* Constructors / Destructor */ +-GoomHeap *goom_heap_new(void); +-GoomHeap *goom_heap_new_with_granularity(int granularity); +-void goom_heap_delete(GoomHeap *_this); +- +-/* This method behaves like malloc. */ +-void *goom_heap_malloc(GoomHeap *_this, int nb_bytes); +-/* This adds an alignment constraint. */ +-void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment); +- +-/* Returns a pointeur on the bytes... prefix is before */ +-void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, +- int alignment, int prefix_bytes); +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_lex.c /src/goomsl_lex.c +--- /home/d4rk/goom2k4-0/src/goomsl_lex.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_lex.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,2108 +0,0 @@ +-#line 2 "goomsl_lex.c" +- +-#line 4 "goomsl_lex.c" +- +-#define YY_INT_ALIGNED short int +- +-/* A lexical scanner generated by flex */ +- +-#define FLEX_SCANNER +-#define YY_FLEX_MAJOR_VERSION 2 +-#define YY_FLEX_MINOR_VERSION 5 +-#define YY_FLEX_SUBMINOR_VERSION 31 +-#if YY_FLEX_SUBMINOR_VERSION > 0 +-#define FLEX_BETA +-#endif +- +-/* First, we deal with platform-specific or compiler-specific issues. */ +- +-/* begin standard C headers. */ +-#include +-#include +-#include +-#include +- +-/* end standard C headers. */ +- +-/* flex integer type definitions */ +- +-#ifndef FLEXINT_H +-#define FLEXINT_H +- +-/* C99 systems have . Non-C99 systems may or may not. */ +- +-#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +-#include +-typedef int8_t flex_int8_t; +-typedef uint8_t flex_uint8_t; +-typedef int16_t flex_int16_t; +-typedef uint16_t flex_uint16_t; +-typedef int32_t flex_int32_t; +-typedef uint32_t flex_uint32_t; +-#else +-typedef signed char flex_int8_t; +-typedef short int flex_int16_t; +-typedef int flex_int32_t; +-typedef unsigned char flex_uint8_t; +-typedef unsigned short int flex_uint16_t; +-typedef unsigned int flex_uint32_t; +-#endif /* ! C99 */ +- +-/* Limits of integral types. */ +-#ifndef INT8_MIN +-#define INT8_MIN (-128) +-#endif +-#ifndef INT16_MIN +-#define INT16_MIN (-32767-1) +-#endif +-#ifndef INT32_MIN +-#define INT32_MIN (-2147483647-1) +-#endif +-#ifndef INT8_MAX +-#define INT8_MAX (127) +-#endif +-#ifndef INT16_MAX +-#define INT16_MAX (32767) +-#endif +-#ifndef INT32_MAX +-#define INT32_MAX (2147483647) +-#endif +-#ifndef UINT8_MAX +-#define UINT8_MAX (255U) +-#endif +-#ifndef UINT16_MAX +-#define UINT16_MAX (65535U) +-#endif +-#ifndef UINT32_MAX +-#define UINT32_MAX (4294967295U) +-#endif +- +-#endif /* ! FLEXINT_H */ +- +-#ifdef __cplusplus +- +-/* The "const" storage-class-modifier is valid. */ +-#define YY_USE_CONST +- +-#else /* ! __cplusplus */ +- +-#if __STDC__ +- +-#define YY_USE_CONST +- +-#endif /* __STDC__ */ +-#endif /* ! __cplusplus */ +- +-#ifdef YY_USE_CONST +-#define yyconst const +-#else +-#define yyconst +-#endif +- +-/* Returned upon end-of-file. */ +-#define YY_NULL 0 +- +-/* Promotes a possibly negative, possibly signed char to an unsigned +- * integer for use as an array index. If the signed char is negative, +- * we want to instead treat it as an 8-bit unsigned char, hence the +- * double cast. +- */ +-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +- +-/* Enter a start condition. This macro really ought to take a parameter, +- * but we do it the disgusting crufty way forced on us by the ()-less +- * definition of BEGIN. +- */ +-#define BEGIN (yy_start) = 1 + 2 * +- +-/* Translate the current start state into a value that can be later handed +- * to BEGIN to return to the state. The YYSTATE alias is for lex +- * compatibility. +- */ +-#define YY_START (((yy_start) - 1) / 2) +-#define YYSTATE YY_START +- +-/* Action number for EOF rule of a given start state. */ +-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +- +-/* Special action meaning "start processing a new file". */ +-#define YY_NEW_FILE yyrestart(yyin ) +- +-#define YY_END_OF_BUFFER_CHAR 0 +- +-/* Size of default input buffer. */ +-#ifndef YY_BUF_SIZE +-#define YY_BUF_SIZE 16384 +-#endif +- +-#ifndef YY_TYPEDEF_YY_BUFFER_STATE +-#define YY_TYPEDEF_YY_BUFFER_STATE +-typedef struct yy_buffer_state *YY_BUFFER_STATE; +-#endif +- +-extern int yyleng; +- +-extern FILE *yyin, *yyout; +- +-#define EOB_ACT_CONTINUE_SCAN 0 +-#define EOB_ACT_END_OF_FILE 1 +-#define EOB_ACT_LAST_MATCH 2 +- +- /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires +- * access to the local variable yy_act. Since yyless() is a macro, it would break +- * existing scanners that call yyless() from OUTSIDE yylex. +- * One obvious solution it to make yy_act a global. I tried that, and saw +- * a 5% performance hit in a non-yylineno scanner, because yy_act is +- * normally declared as a register variable-- so it is not worth it. +- */ +- #define YY_LESS_LINENO(n) \ +- do { \ +- int yyl;\ +- for ( yyl = n; yyl < yyleng; ++yyl )\ +- if ( yytext[yyl] == '\n' )\ +- --yylineno;\ +- }while(0) +- +-/* Return all but the first "n" matched characters back to the input stream. */ +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- *yy_cp = (yy_hold_char); \ +- YY_RESTORE_YY_MORE_OFFSET \ +- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ +- YY_DO_BEFORE_ACTION; /* set up yytext again */ \ +- } \ +- while ( 0 ) +- +-#define unput(c) yyunput( c, (yytext_ptr) ) +- +-/* The following is because we cannot portably get our hands on size_t +- * (without autoconf's help, which isn't available because we want +- * flex-generated scanners to compile on their own). +- */ +- +-#ifndef YY_TYPEDEF_YY_SIZE_T +-#define YY_TYPEDEF_YY_SIZE_T +-typedef unsigned int yy_size_t; +-#endif +- +-#ifndef YY_STRUCT_YY_BUFFER_STATE +-#define YY_STRUCT_YY_BUFFER_STATE +-struct yy_buffer_state +- { +- FILE *yy_input_file; +- +- char *yy_ch_buf; /* input buffer */ +- char *yy_buf_pos; /* current position in input buffer */ +- +- /* Size of input buffer in bytes, not including room for EOB +- * characters. +- */ +- yy_size_t yy_buf_size; +- +- /* Number of characters read into yy_ch_buf, not including EOB +- * characters. +- */ +- int yy_n_chars; +- +- /* Whether we "own" the buffer - i.e., we know we created it, +- * and can realloc() it to grow it, and should free() it to +- * delete it. +- */ +- int yy_is_our_buffer; +- +- /* Whether this is an "interactive" input source; if so, and +- * if we're using stdio for input, then we want to use getc() +- * instead of fread(), to make sure we stop fetching input after +- * each newline. +- */ +- int yy_is_interactive; +- +- /* Whether we're considered to be at the beginning of a line. +- * If so, '^' rules will be active on the next match, otherwise +- * not. +- */ +- int yy_at_bol; +- +- int yy_bs_lineno; /**< The line count. */ +- int yy_bs_column; /**< The column count. */ +- +- /* Whether to try to fill the input buffer when we reach the +- * end of it. +- */ +- int yy_fill_buffer; +- +- int yy_buffer_status; +- +-#define YY_BUFFER_NEW 0 +-#define YY_BUFFER_NORMAL 1 +- /* When an EOF's been seen but there's still some text to process +- * then we mark the buffer as YY_EOF_PENDING, to indicate that we +- * shouldn't try reading from the input source any more. We might +- * still have a bunch of tokens to match, though, because of +- * possible backing-up. +- * +- * When we actually see the EOF, we change the status to "new" +- * (via yyrestart()), so that the user can continue scanning by +- * just pointing yyin at a new input file. +- */ +-#define YY_BUFFER_EOF_PENDING 2 +- +- }; +-#endif /* !YY_STRUCT_YY_BUFFER_STATE */ +- +-/* Stack of input buffers. */ +-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +- +-/* We provide macros for accessing buffer states in case in the +- * future we want to put the buffer states in a more general +- * "scanner state". +- * +- * Returns the top of the stack, or NULL. +- */ +-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ +- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ +- : NULL) +- +-/* Same as previous macro, but useful when we know that the buffer stack is not +- * NULL or when we need an lvalue. For internal use only. +- */ +-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] +- +-/* yy_hold_char holds the character lost when yytext is formed. */ +-static char yy_hold_char; +-static int yy_n_chars; /* number of characters read into yy_ch_buf */ +-int yyleng; +- +-/* Points to current character in buffer. */ +-static char *yy_c_buf_p = (char *) 0; +-static int yy_init = 1; /* whether we need to initialize */ +-static int yy_start = 0; /* start state number */ +- +-/* Flag which is used to allow yywrap()'s to do buffer switches +- * instead of setting up a fresh yyin. A bit of a hack ... +- */ +-static int yy_did_buffer_switch_on_eof; +- +-void yyrestart (FILE *input_file ); +-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +-void yy_delete_buffer (YY_BUFFER_STATE b ); +-void yy_flush_buffer (YY_BUFFER_STATE b ); +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +-void yypop_buffer_state (void ); +- +-static void yyensure_buffer_stack (void ); +-static void yy_load_buffer_state (void ); +-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); +- +-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) +- +-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); +- +-void *yyalloc (yy_size_t ); +-void *yyrealloc (void *,yy_size_t ); +-void yyfree (void * ); +- +-#define yy_new_buffer yy_create_buffer +- +-#define yy_set_interactive(is_interactive) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){ \ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +- } +- +-#define yy_set_bol(at_bol) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){\ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ +- } +- +-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) +- +-/* Begin user sect3 */ +- +-typedef unsigned char YY_CHAR; +- +-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +- +-typedef int yy_state_type; +- +-#define YY_FLEX_LEX_COMPAT +-extern int yylineno; +- +-int yylineno = 1; +- +-extern char yytext[]; +- +-static yy_state_type yy_get_previous_state (void ); +-static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +-static int yy_get_next_buffer (void ); +-static void yy_fatal_error (yyconst char msg[] ); +- +-/* Done after the current pattern has been matched and before the +- * corresponding action - sets up yytext. +- */ +-#define YY_DO_BEFORE_ACTION \ +- (yytext_ptr) = yy_bp; \ +- yyleng = (size_t) (yy_cp - yy_bp); \ +- (yy_hold_char) = *yy_cp; \ +- *yy_cp = '\0'; \ +- if ( yyleng + (yy_more_offset) >= YYLMAX ) \ +- YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ +- yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \ +- yyleng += (yy_more_offset); \ +- (yy_prev_more_offset) = (yy_more_offset); \ +- (yy_more_offset) = 0; \ +- (yy_c_buf_p) = yy_cp; +- +-#define YY_NUM_RULES 49 +-#define YY_END_OF_BUFFER 50 +-/* This struct is not used in this scanner, +- but its presence is necessary. */ +-struct yy_trans_info +- { +- flex_int32_t yy_verify; +- flex_int32_t yy_nxt; +- }; +-static yyconst flex_int16_t yy_acclist[214] = +- { 0, +- 50, 48, 49, 47, 48, 49, 4, 49, 48, 49, +- 13, 48, 49, 10, 48, 49, 33, 48, 49, 48, +- 49, 48, 49, 48, 49, 48, 49, 48, 49, 34, +- 48, 49, 34, 48, 49, 48, 49, 48, 49, 33, +- 48, 49, 33, 48, 49, 33, 48, 49, 33, 48, +- 49, 33, 48, 49, 33, 48, 49, 33, 48, 49, +- 33, 48, 49, 33, 48, 49, 33, 48, 49, 47, +- 48, 49, 1, 4, 49, 48, 49, 7, 49, 6, +- 49, 7, 49, 7, 49, 1, 6, 49, 7, 49, +- 3, 49, 1, 3, 49, 17, 49, 49, 16, 17, +- +- 49, 17, 49, 47, 45, 10, 10, 10, 33, 40, +- 39, 41, 11, 12, 42, 38, 37, 34, 43, 46, +- 44, 33, 33, 28, 33, 33, 33, 33, 33, 30, +- 33, 33, 33, 33, 33, 33, 47, 1, 12, 5, +- 15, 14, 10, 10, 35, 37, 36, 33, 33, 33, +- 33, 33, 29, 33, 19, 33, 26, 33, 21, 33, +- 33, 33, 33, 2, 10, 10, 33, 33, 33, 33, +- 33, 33, 33, 31, 33, 33, 10, 10, 33, 33, +- 33, 32, 33, 18, 33, 33, 33, 27, 33, 10, +- 10, 33, 33, 33, 22, 33, 25, 33, 10, 9, +- +- 10, 10, 20, 33, 23, 33, 33, 10, 24, 33, +- 10, 8, 10 +- } ; +- +-static yyconst flex_int16_t yy_accept[152] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, +- 4, 7, 9, 11, 14, 17, 20, 22, 24, 26, +- 28, 30, 33, 36, 38, 40, 43, 46, 49, 52, +- 55, 58, 61, 64, 67, 70, 73, 76, 78, 80, +- 82, 84, 86, 89, 91, 93, 96, 98, 99, 102, +- 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, +- 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, +- 122, 123, 124, 126, 127, 128, 129, 130, 132, 133, +- 134, 135, 136, 137, 138, 139, 139, 140, 141, 141, +- 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, +- +- 151, 152, 153, 155, 157, 159, 161, 162, 163, 164, +- 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, +- 174, 176, 177, 178, 179, 180, 181, 182, 184, 186, +- 187, 188, 190, 191, 192, 193, 194, 195, 197, 199, +- 200, 202, 203, 205, 207, 208, 209, 211, 212, 214, +- 214 +- } ; +- +-static yyconst flex_int32_t yy_ec[256] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 4, 5, 6, 7, 1, 8, 9, 10, 1, +- 1, 11, 12, 1, 13, 14, 15, 16, 17, 17, +- 17, 17, 17, 17, 17, 17, 17, 1, 1, 18, +- 19, 20, 1, 9, 21, 21, 21, 21, 22, 23, +- 21, 21, 24, 21, 21, 25, 21, 26, 21, 21, +- 21, 27, 28, 29, 21, 21, 21, 21, 21, 21, +- 1, 30, 1, 1, 31, 1, 32, 33, 34, 35, +- +- 36, 37, 38, 39, 40, 21, 21, 41, 21, 42, +- 43, 44, 21, 45, 46, 47, 48, 21, 49, 50, +- 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1 +- } ; +- +-static yyconst flex_int32_t yy_meta[51] = +- { 0, +- 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 3, 1, 4, 4, 1, 1, 1, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, +- 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +- } ; +- +-static yyconst flex_int16_t yy_base[159] = +- { 0, +- 0, 49, 51, 54, 221, 57, 60, 64, 223, 225, +- 69, 225, 203, 225, 51, 0, 0, 202, 201, 200, +- 64, 68, 72, 72, 199, 174, 57, 166, 55, 173, +- 171, 166, 165, 166, 171, 99, 225, 93, 225, 225, +- 194, 107, 225, 193, 225, 225, 225, 225, 225, 71, +- 93, 225, 0, 183, 178, 0, 195, 225, 225, 225, +- 225, 225, 225, 225, 89, 107, 0, 225, 225, 225, +- 161, 169, 0, 155, 160, 157, 154, 151, 150, 151, +- 150, 146, 153, 123, 225, 177, 188, 225, 126, 187, +- 225, 225, 164, 159, 225, 100, 0, 146, 145, 149, +- +- 138, 151, 0, 0, 0, 0, 59, 146, 140, 177, +- 225, 157, 147, 141, 144, 130, 138, 126, 130, 137, +- 0, 134, 165, 143, 133, 112, 109, 0, 0, 102, +- 92, 0, 130, 112, 93, 98, 101, 0, 0, 125, +- 124, 94, 0, 0, 78, 59, 0, 61, 0, 225, +- 141, 145, 149, 151, 155, 51, 159, 163 +- } ; +- +-static yyconst flex_int16_t yy_def[159] = +- { 0, +- 150, 1, 151, 151, 151, 151, 152, 152, 150, 150, +- 150, 150, 150, 150, 153, 154, 155, 150, 150, 150, +- 150, 150, 150, 150, 150, 154, 154, 154, 154, 154, +- 154, 154, 154, 154, 154, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 153, 153, 153, 154, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 156, 150, 150, 150, +- 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +- 154, 154, 154, 150, 150, 150, 157, 150, 150, 157, +- 150, 150, 153, 153, 150, 150, 156, 154, 154, 154, +- +- 154, 154, 154, 154, 154, 154, 154, 154, 154, 157, +- 150, 153, 153, 154, 154, 154, 154, 154, 154, 154, +- 154, 154, 153, 153, 154, 154, 154, 154, 154, 154, +- 154, 154, 158, 153, 154, 154, 154, 154, 154, 158, +- 158, 153, 154, 154, 154, 153, 154, 153, 153, 0, +- 150, 150, 150, 150, 150, 150, 150, 150 +- } ; +- +-static yyconst flex_int16_t yy_nxt[276] = +- { 0, +- 10, 11, 12, 11, 13, 14, 15, 10, 16, 17, +- 18, 19, 20, 10, 21, 22, 23, 24, 10, 25, +- 16, 16, 16, 16, 16, 16, 16, 16, 16, 10, +- 16, 16, 26, 16, 27, 28, 29, 16, 16, 30, +- 16, 31, 16, 32, 16, 33, 34, 16, 35, 16, +- 36, 37, 36, 40, 97, 42, 43, 42, 42, 46, +- 42, 41, 48, 38, 41, 49, 48, 149, 44, 49, +- 51, 44, 51, 54, 61, 64, 91, 55, 62, 64, +- 148, 65, 63, 66, 66, 65, 75, 66, 66, 50, +- 68, 69, 72, 50, 51, 76, 51, 77, 119, 73, +- +- 84, 85, 84, 61, 96, 96, 120, 87, 89, 85, +- 89, 63, 92, 86, 64, 96, 96, 67, 147, 146, +- 65, 86, 66, 66, 84, 85, 84, 89, 85, 89, +- 141, 141, 145, 144, 143, 142, 141, 86, 139, 138, +- 86, 39, 39, 39, 39, 47, 47, 47, 47, 53, +- 137, 53, 53, 56, 56, 57, 136, 57, 57, 110, +- 110, 110, 110, 140, 135, 140, 140, 134, 133, 132, +- 131, 130, 129, 128, 127, 126, 125, 124, 123, 111, +- 122, 121, 118, 117, 116, 115, 114, 113, 112, 111, +- 111, 90, 109, 108, 107, 106, 105, 104, 103, 102, +- +- 101, 100, 99, 98, 95, 94, 93, 90, 88, 83, +- 82, 81, 80, 79, 78, 74, 71, 70, 60, 59, +- 58, 52, 150, 45, 9, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150 +- } ; +- +-static yyconst flex_int16_t yy_chk[276] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 2, 2, 2, 3, 156, 4, 4, 4, 6, 6, +- 6, 3, 7, 2, 4, 7, 8, 148, 4, 8, +- 11, 6, 11, 15, 21, 22, 50, 15, 21, 23, +- 146, 22, 21, 22, 22, 23, 29, 23, 23, 7, +- 24, 24, 27, 8, 51, 29, 51, 29, 107, 27, +- +- 36, 36, 36, 38, 65, 65, 107, 38, 42, 42, +- 42, 38, 50, 36, 66, 96, 96, 22, 145, 142, +- 66, 42, 66, 66, 84, 84, 84, 89, 89, 89, +- 141, 140, 137, 136, 135, 134, 133, 84, 131, 130, +- 89, 151, 151, 151, 151, 152, 152, 152, 152, 153, +- 127, 153, 153, 154, 154, 155, 126, 155, 155, 157, +- 157, 157, 157, 158, 125, 158, 158, 124, 123, 122, +- 120, 119, 118, 117, 116, 115, 114, 113, 112, 110, +- 109, 108, 102, 101, 100, 99, 98, 94, 93, 90, +- 87, 86, 83, 82, 81, 80, 79, 78, 77, 76, +- +- 75, 74, 72, 71, 57, 55, 54, 44, 41, 35, +- 34, 33, 32, 31, 30, 28, 26, 25, 20, 19, +- 18, 13, 9, 5, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150 +- } ; +- +-/* Table of booleans, true if rule could match eol. */ +-static yyconst flex_int32_t yy_rule_can_match_eol[50] = +- { 0, +-1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +- +-extern int yy_flex_debug; +-int yy_flex_debug = 0; +- +-static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; +-static char *yy_full_match; +-static int yy_lp; +-#define REJECT \ +-{ \ +-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ +-yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ +-++(yy_lp); \ +-goto find_rule; \ +-} +- +-static int yy_more_offset = 0; +-static int yy_prev_more_offset = 0; +-#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext )) +-#define YY_NEED_STRLEN +-#define YY_MORE_ADJ 0 +-#define YY_RESTORE_YY_MORE_OFFSET \ +- { \ +- (yy_more_offset) = (yy_prev_more_offset); \ +- yyleng -= (yy_more_offset); \ +- } +-#ifndef YYLMAX +-#define YYLMAX 8192 +-#endif +- +-char yytext[YYLMAX]; +-char *yytext_ptr; +-#line 1 "goomsl_lex.l" +-#line 2 "goomsl_lex.l" +- +-#include +-#include +-#include +-#include "goomsl.h" +-#include "goomsl_private.h" +-#include "goomsl_yacc.h" +-void yyerror(char *); +-void yyparse(void); +- +-GoomSL *currentGoomSL; +-static int string_size; +-static char string[1024]; +- +- +- +-#line 639 "goomsl_lex.c" +- +-#define INITIAL 0 +-#define C_COMMENT 1 +-#define LINE_COMMENT 2 +-#define STRING 3 +- +-/* Special case for "unistd.h", since it is non-ANSI. We include it way +- * down here because we want the user's section 1 to have been scanned first. +- * The user has a chance to override it with an option. +- */ +-#include +- +-#ifndef YY_EXTRA_TYPE +-#define YY_EXTRA_TYPE void * +-#endif +- +-/* Macros after this point can all be overridden by user definitions in +- * section 1. +- */ +- +-#ifndef YY_SKIP_YYWRAP +-#ifdef __cplusplus +-extern "C" int yywrap (void ); +-#else +-extern int yywrap (void ); +-#endif +-#endif +- +- static void yyunput (int c,char *buf_ptr ); +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char *,yyconst char *,int ); +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * ); +-#endif +- +-#ifndef YY_NO_INPUT +- +-#ifdef __cplusplus +-static int yyinput (void ); +-#else +-static int input (void ); +-#endif +- +-#endif +- +-/* Amount of stuff to slurp up with each read. */ +-#ifndef YY_READ_BUF_SIZE +-#define YY_READ_BUF_SIZE 8192 +-#endif +- +-/* Copy whatever the last rule matched to the standard output. */ +-#ifndef ECHO +-/* This used to be an fputs(), but since the string might contain NUL's, +- * we now use fwrite(). +- */ +-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +-#endif +- +-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, +- * is returned in "result". +- */ +-#ifndef YY_INPUT +-#define YY_INPUT(buf,result,max_size) \ +- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ +- { \ +- int c = '*'; \ +- size_t n; \ +- for ( n = 0; n < max_size && \ +- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ +- buf[n] = (char) c; \ +- if ( c == '\n' ) \ +- buf[n++] = (char) c; \ +- if ( c == EOF && ferror( yyin ) ) \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- result = n; \ +- } \ +- else \ +- { \ +- errno=0; \ +- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ +- { \ +- if( errno != EINTR) \ +- { \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- break; \ +- } \ +- errno=0; \ +- clearerr(yyin); \ +- } \ +- }\ +-\ +- +-#endif +- +-/* No semi-colon after return; correct usage is to write "yyterminate();" - +- * we don't want an extra ';' after the "return" because that will cause +- * some compilers to complain about unreachable statements. +- */ +-#ifndef yyterminate +-#define yyterminate() return YY_NULL +-#endif +- +-/* Number of entries by which start-condition stack grows. */ +-#ifndef YY_START_STACK_INCR +-#define YY_START_STACK_INCR 25 +-#endif +- +-/* Report a fatal error. */ +-#ifndef YY_FATAL_ERROR +-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +-#endif +- +-/* end tables serialization structures and prototypes */ +- +-/* Default declaration of generated scanner - a define so the user can +- * easily add parameters. +- */ +-#ifndef YY_DECL +-#define YY_DECL_IS_OURS 1 +- +-extern int yylex (void); +- +-#define YY_DECL int yylex (void) +-#endif /* !YY_DECL */ +- +-/* Code executed at the beginning of each rule, after yytext and yyleng +- * have been set up. +- */ +-#ifndef YY_USER_ACTION +-#define YY_USER_ACTION +-#endif +- +-/* Code executed at the end of each rule. */ +-#ifndef YY_BREAK +-#define YY_BREAK break; +-#endif +- +-#define YY_RULE_SETUP \ +- if ( yyleng > 0 ) \ +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ +- (yytext[yyleng - 1] == '\n'); \ +- YY_USER_ACTION +- +-/** The main scanner function which does all the work. +- */ +-YY_DECL +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp, *yy_bp; +- register int yy_act; +- +-#line 25 "goomsl_lex.l" +- +- +-#line 797 "goomsl_lex.c" +- +- if ( (yy_init) ) +- { +- (yy_init) = 0; +- +-#ifdef YY_USER_INIT +- YY_USER_INIT; +-#endif +- +- if ( ! (yy_state_buf) ) +- (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2 ); +- +- if ( ! (yy_start) ) +- (yy_start) = 1; /* first start state */ +- +- if ( ! yyin ) +- yyin = stdin; +- +- if ( ! yyout ) +- yyout = stdout; +- +- if ( ! YY_CURRENT_BUFFER ) { +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_load_buffer_state( ); +- } +- +- while ( 1 ) /* loops until end-of-file is reached */ +- { +- yy_cp = (yy_c_buf_p); +- +- /* Support of yytext. */ +- *yy_cp = (yy_hold_char); +- +- /* yy_bp points to the position in yy_ch_buf of the start of +- * the current run. +- */ +- yy_bp = yy_cp; +- +- yy_current_state = (yy_start); +- yy_current_state += YY_AT_BOL(); +- +- (yy_state_ptr) = (yy_state_buf); +- *(yy_state_ptr)++ = yy_current_state; +- +-yy_match: +- do +- { +- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 151 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- *(yy_state_ptr)++ = yy_current_state; +- ++yy_cp; +- } +- while ( yy_base[yy_current_state] != 225 ); +- +-yy_find_action: +- yy_current_state = *--(yy_state_ptr); +- (yy_lp) = yy_accept[yy_current_state]; +-find_rule: /* we branch to this label when backing up */ +- for ( ; ; ) /* until we find what rule we matched */ +- { +- if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) +- { +- yy_act = yy_acclist[(yy_lp)]; +- { +- (yy_full_match) = yy_cp; +- break; +- } +- } +- --yy_cp; +- yy_current_state = *--(yy_state_ptr); +- (yy_lp) = yy_accept[yy_current_state]; +- } +- +- YY_DO_BEFORE_ACTION; +- +- if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) +- { +- int yyl; +- for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl ) +- if ( yytext[yyl] == '\n' ) +- +- yylineno++; +-; +- } +- +-do_action: /* This label is used only to access EOF actions. */ +- +- switch ( yy_act ) +- { /* beginning of action switch */ +-case 1: +-/* rule 1 can match eol */ +-YY_RULE_SETUP +-#line 27 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } +- YY_BREAK +-case 2: +-/* rule 2 can match eol */ +-YY_RULE_SETUP +-#line 28 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } +- YY_BREAK +-case 3: +-/* rule 3 can match eol */ +-YY_RULE_SETUP +-#line 30 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } +- YY_BREAK +-case 4: +-/* rule 4 can match eol */ +-YY_RULE_SETUP +-#line 31 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } +- YY_BREAK +-case 5: +-YY_RULE_SETUP +-#line 33 "goomsl_lex.l" +-{ BEGIN INITIAL; } +- YY_BREAK +-case 6: +-/* rule 6 can match eol */ +-YY_RULE_SETUP +-#line 34 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; } +- YY_BREAK +-case 7: +-YY_RULE_SETUP +-#line 35 "goomsl_lex.l" +-{ /* eat up comment */ } +- YY_BREAK +-case 8: +-YY_RULE_SETUP +-#line 37 "goomsl_lex.l" +-{ currentGoomSL->num_lines = 0; } +- YY_BREAK +-case 9: +-YY_RULE_SETUP +-#line 38 "goomsl_lex.l" +-{ currentGoomSL->num_lines = 0; printf("%s\n", yytext); } +- YY_BREAK +-case 10: +-YY_RULE_SETUP +-#line 39 "goomsl_lex.l" +-{ /* ignore preprocessor lines */ } +- YY_BREAK +-case 11: +-YY_RULE_SETUP +-#line 41 "goomsl_lex.l" +-{ BEGIN C_COMMENT; } +- YY_BREAK +-case 12: +-YY_RULE_SETUP +-#line 42 "goomsl_lex.l" +-{ BEGIN LINE_COMMENT; } +- YY_BREAK +-case 13: +-YY_RULE_SETUP +-#line 43 "goomsl_lex.l" +-{ BEGIN STRING; string_size=0; } +- YY_BREAK +-case 14: +-YY_RULE_SETUP +-#line 45 "goomsl_lex.l" +-{ string[string_size++] = '\n'; } +- YY_BREAK +-case 15: +-YY_RULE_SETUP +-#line 46 "goomsl_lex.l" +-{ string[string_size++] = '\"'; } +- YY_BREAK +-case 16: +-YY_RULE_SETUP +-#line 47 "goomsl_lex.l" +-{ /* fin de la chaine: on cree le pointeur qui va bien */ +- unsigned int tmp; +- BEGIN INITIAL; +- string[string_size]=0; +- tmp = gsl_malloc(currentGoomSL, string_size+1); +- strcpy((char*)currentGoomSL->ptrArray[tmp],string); +- sprintf(yylval.strValue, "0x%08x", tmp); +- return LTYPE_PTR; +- } +- YY_BREAK +-case 17: +-YY_RULE_SETUP +-#line 56 "goomsl_lex.l" +-{ string[string_size++] = *yytext; } +- YY_BREAK +-case 18: +-YY_RULE_SETUP +-#line 58 "goomsl_lex.l" +-{ return FLOAT_TK; } +- YY_BREAK +-case 19: +-YY_RULE_SETUP +-#line 59 "goomsl_lex.l" +-{ return INT_TK; } +- YY_BREAK +-case 20: +-YY_RULE_SETUP +-#line 60 "goomsl_lex.l" +-{ return INT_TK; } +- YY_BREAK +-case 21: +-YY_RULE_SETUP +-#line 61 "goomsl_lex.l" +-{ return PTR_TK; } +- YY_BREAK +-case 22: +-YY_RULE_SETUP +-#line 62 "goomsl_lex.l" +-{ return PTR_TK; } +- YY_BREAK +-case 23: +-YY_RULE_SETUP +-#line 63 "goomsl_lex.l" +-{ return DECLARE; } +- YY_BREAK +-case 24: +-YY_RULE_SETUP +-#line 64 "goomsl_lex.l" +-{ return EXTERNAL; } +- YY_BREAK +-case 25: +-YY_RULE_SETUP +-#line 65 "goomsl_lex.l" +-{ return STRUCT; } +- YY_BREAK +-case 26: +-YY_RULE_SETUP +-#line 66 "goomsl_lex.l" +-{ return NOT; } +- YY_BREAK +-case 27: +-YY_RULE_SETUP +-#line 67 "goomsl_lex.l" +-{ return WHILE; } +- YY_BREAK +-case 28: +-YY_RULE_SETUP +-#line 68 "goomsl_lex.l" +-{ return DO; } +- YY_BREAK +-case 29: +-YY_RULE_SETUP +-#line 69 "goomsl_lex.l" +-{ return FOR; } +- YY_BREAK +-case 30: +-YY_RULE_SETUP +-#line 70 "goomsl_lex.l" +-{ return IN; } +- YY_BREAK +-case 31: +-YY_RULE_SETUP +-#line 71 "goomsl_lex.l" +-{ strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 32: +-YY_RULE_SETUP +-#line 72 "goomsl_lex.l" +-{ strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 33: +-YY_RULE_SETUP +-#line 73 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } +- YY_BREAK +-case 34: +-YY_RULE_SETUP +-#line 74 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 35: +-YY_RULE_SETUP +-#line 75 "goomsl_lex.l" +-{ sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } +- YY_BREAK +-case 36: +-YY_RULE_SETUP +-#line 76 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 37: +-YY_RULE_SETUP +-#line 77 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } +- YY_BREAK +-case 38: +-YY_RULE_SETUP +-#line 78 "goomsl_lex.l" +-{ sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } +- YY_BREAK +-case 39: +-YY_RULE_SETUP +-#line 79 "goomsl_lex.l" +-{ return PLUS_EQ; } +- YY_BREAK +-case 40: +-YY_RULE_SETUP +-#line 80 "goomsl_lex.l" +-{ return MUL_EQ; } +- YY_BREAK +-case 41: +-YY_RULE_SETUP +-#line 81 "goomsl_lex.l" +-{ return SUB_EQ; } +- YY_BREAK +-case 42: +-YY_RULE_SETUP +-#line 82 "goomsl_lex.l" +-{ return DIV_EQ; } +- YY_BREAK +-case 43: +-YY_RULE_SETUP +-#line 83 "goomsl_lex.l" +-{ return LOW_EQ; } +- YY_BREAK +-case 44: +-YY_RULE_SETUP +-#line 84 "goomsl_lex.l" +-{ return SUP_EQ; } +- YY_BREAK +-case 45: +-YY_RULE_SETUP +-#line 85 "goomsl_lex.l" +-{ return NOT_EQ; } +- YY_BREAK +-case 46: +-YY_RULE_SETUP +-#line 86 "goomsl_lex.l" +-{ return NOT_EQ; } +- YY_BREAK +-case 47: +-YY_RULE_SETUP +-#line 87 "goomsl_lex.l" +-/* eat up whitespace */ +- YY_BREAK +-case 48: +-YY_RULE_SETUP +-#line 88 "goomsl_lex.l" +-{ yylval.charValue = *yytext; return *yytext; } +- YY_BREAK +-case 49: +-YY_RULE_SETUP +-#line 90 "goomsl_lex.l" +-ECHO; +- YY_BREAK +-#line 1155 "goomsl_lex.c" +- case YY_STATE_EOF(INITIAL): +- case YY_STATE_EOF(C_COMMENT): +- case YY_STATE_EOF(LINE_COMMENT): +- case YY_STATE_EOF(STRING): +- yyterminate(); +- +- case YY_END_OF_BUFFER: +- { +- /* Amount of text matched not including the EOB char. */ +- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; +- +- /* Undo the effects of YY_DO_BEFORE_ACTION. */ +- *yy_cp = (yy_hold_char); +- YY_RESTORE_YY_MORE_OFFSET +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) +- { +- /* We're scanning a new file or input source. It's +- * possible that this happened because the user +- * just pointed yyin at a new source and called +- * yylex(). If so, then we have to assure +- * consistency between YY_CURRENT_BUFFER and our +- * globals. Here is the right place to do so, because +- * this is the first action (other than possibly a +- * back-up) that will match for the new input source. +- */ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; +- } +- +- /* Note that here we test for yy_c_buf_p "<=" to the position +- * of the first EOB in the buffer, since yy_c_buf_p will +- * already have been incremented past the NUL character +- * (since all states make transitions on EOB to the +- * end-of-buffer state). Contrast this with the test +- * in input(). +- */ +- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- { /* This was really a NUL. */ +- yy_state_type yy_next_state; +- +- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- /* Okay, we're now positioned to make the NUL +- * transition. We couldn't have +- * yy_get_previous_state() go ahead and do it +- * for us because it doesn't know how to deal +- * with the possibility of jamming (and we don't +- * want to build jamming into it because then it +- * will run more slowly). +- */ +- +- yy_next_state = yy_try_NUL_trans( yy_current_state ); +- +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- +- if ( yy_next_state ) +- { +- /* Consume the NUL. */ +- yy_cp = ++(yy_c_buf_p); +- yy_current_state = yy_next_state; +- goto yy_match; +- } +- +- else +- { +- yy_cp = (yy_c_buf_p); +- goto yy_find_action; +- } +- } +- +- else switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_END_OF_FILE: +- { +- (yy_did_buffer_switch_on_eof) = 0; +- +- if ( yywrap( ) ) +- { +- /* Note: because we've taken care in +- * yy_get_next_buffer() to have set up +- * yytext, we can now set up +- * yy_c_buf_p so that if some total +- * hoser (like flex itself) wants to +- * call the scanner after we return the +- * YY_NULL, it'll still work - another +- * YY_NULL will get returned. +- */ +- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; +- +- yy_act = YY_STATE_EOF(YY_START); +- goto do_action; +- } +- +- else +- { +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +- } +- break; +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = +- (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_match; +- +- case EOB_ACT_LAST_MATCH: +- (yy_c_buf_p) = +- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_find_action; +- } +- break; +- } +- +- default: +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--no action found" ); +- } /* end of action switch */ +- } /* end of scanning one token */ +-} /* end of yylex */ +- +-/* yy_get_next_buffer - try to read in a new buffer +- * +- * Returns a code representing an action: +- * EOB_ACT_LAST_MATCH - +- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position +- * EOB_ACT_END_OF_FILE - end of file +- */ +-static int yy_get_next_buffer (void) +-{ +- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; +- register char *source = (yytext_ptr); +- register int number_to_move, i; +- int ret_val; +- +- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--end of buffer missed" ); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) +- { /* Don't try to fill the buffer, so this is an EOF. */ +- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) +- { +- /* We matched a single character, the EOB, so +- * treat this as a final EOF. +- */ +- return EOB_ACT_END_OF_FILE; +- } +- +- else +- { +- /* We matched some text prior to the EOB, first +- * process it. +- */ +- return EOB_ACT_LAST_MATCH; +- } +- } +- +- /* Try to read more data. */ +- +- /* First move last chars to start of buffer. */ +- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; +- +- for ( i = 0; i < number_to_move; ++i ) +- *(dest++) = *(source++); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) +- /* don't do the read, it's not guaranteed to return an EOF, +- * just force an EOF +- */ +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; +- +- else +- { +- size_t num_to_read = +- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; +- +- while ( num_to_read <= 0 ) +- { /* Not enough room in the buffer - grow it. */ +- +- YY_FATAL_ERROR( +-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +- +- } +- +- if ( num_to_read > YY_READ_BUF_SIZE ) +- num_to_read = YY_READ_BUF_SIZE; +- +- /* Read in more data. */ +- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), +- (yy_n_chars), num_to_read ); +- +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- if ( (yy_n_chars) == 0 ) +- { +- if ( number_to_move == YY_MORE_ADJ ) +- { +- ret_val = EOB_ACT_END_OF_FILE; +- yyrestart(yyin ); +- } +- +- else +- { +- ret_val = EOB_ACT_LAST_MATCH; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = +- YY_BUFFER_EOF_PENDING; +- } +- } +- +- else +- ret_val = EOB_ACT_CONTINUE_SCAN; +- +- (yy_n_chars) += number_to_move; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; +- +- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; +- +- return ret_val; +-} +- +-/* yy_get_previous_state - get the state just before the EOB char was reached */ +- +- static yy_state_type yy_get_previous_state (void) +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp; +- +- yy_current_state = (yy_start); +- yy_current_state += YY_AT_BOL(); +- +- (yy_state_ptr) = (yy_state_buf); +- *(yy_state_ptr)++ = yy_current_state; +- +- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) +- { +- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 151 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- *(yy_state_ptr)++ = yy_current_state; +- } +- +- return yy_current_state; +-} +- +-/* yy_try_NUL_trans - try to make a transition on the NUL character +- * +- * synopsis +- * next_state = yy_try_NUL_trans( current_state ); +- */ +- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +-{ +- register int yy_is_jam; +- +- register YY_CHAR yy_c = 1; +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 151 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- yy_is_jam = (yy_current_state == 150); +- if ( ! yy_is_jam ) +- *(yy_state_ptr)++ = yy_current_state; +- +- return yy_is_jam ? 0 : yy_current_state; +-} +- +- static void yyunput (int c, register char * yy_bp ) +-{ +- register char *yy_cp; +- +- yy_cp = (yy_c_buf_p); +- +- /* undo effects of setting up yytext */ +- *yy_cp = (yy_hold_char); +- +- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) +- { /* need to shift things up to make room */ +- /* +2 for EOB chars. */ +- register int number_to_move = (yy_n_chars) + 2; +- register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ +- YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; +- register char *source = +- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; +- +- while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) +- *--dest = *--source; +- +- yy_cp += (int) (dest - source); +- yy_bp += (int) (dest - source); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; +- +- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) +- YY_FATAL_ERROR( "flex scanner push-back overflow" ); +- } +- +- *--yy_cp = (char) c; +- +- if ( c == '\n' ){ +- --yylineno; +- } +- +- (yytext_ptr) = yy_bp; +- (yy_hold_char) = *yy_cp; +- (yy_c_buf_p) = yy_cp; +-} +- +-#ifndef YY_NO_INPUT +-#ifdef __cplusplus +- static int yyinput (void) +-#else +- static int input (void) +-#endif +- +-{ +- int c; +- +- *(yy_c_buf_p) = (yy_hold_char); +- +- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) +- { +- /* yy_c_buf_p now points to the character we want to return. +- * If this occurs *before* the EOB characters, then it's a +- * valid NUL; if not, then we've hit the end of the buffer. +- */ +- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- /* This was really a NUL. */ +- *(yy_c_buf_p) = '\0'; +- +- else +- { /* need more input */ +- int offset = (yy_c_buf_p) - (yytext_ptr); +- ++(yy_c_buf_p); +- +- switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_LAST_MATCH: +- /* This happens because yy_g_n_b() +- * sees that we've accumulated a +- * token and flags that we need to +- * try matching the token before +- * proceeding. But for input(), +- * there's no matching to consider. +- * So convert the EOB_ACT_LAST_MATCH +- * to EOB_ACT_END_OF_FILE. +- */ +- +- /* Reset buffer status. */ +- yyrestart(yyin ); +- +- /*FALLTHROUGH*/ +- +- case EOB_ACT_END_OF_FILE: +- { +- if ( yywrap( ) ) +- return EOF; +- +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +-#ifdef __cplusplus +- return yyinput(); +-#else +- return input(); +-#endif +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = (yytext_ptr) + offset; +- break; +- } +- } +- } +- +- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ +- *(yy_c_buf_p) = '\0'; /* preserve yytext */ +- (yy_hold_char) = *++(yy_c_buf_p); +- +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); +- if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol ) +- +- yylineno++; +-; +- +- return c; +-} +-#endif /* ifndef YY_NO_INPUT */ +- +-/** Immediately switch to a different input stream. +- * @param input_file A readable stream. +- * +- * @note This function does not reset the start condition to @c INITIAL . +- */ +- void yyrestart (FILE * input_file ) +-{ +- +- if ( ! YY_CURRENT_BUFFER ){ +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_init_buffer(YY_CURRENT_BUFFER,input_file ); +- yy_load_buffer_state( ); +-} +- +-/** Switch to a different input buffer. +- * @param new_buffer The new input buffer. +- * +- */ +- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +-{ +- +- /* TODO. We should be able to replace this entire function body +- * with +- * yypop_buffer_state(); +- * yypush_buffer_state(new_buffer); +- */ +- yyensure_buffer_stack (); +- if ( YY_CURRENT_BUFFER == new_buffer ) +- return; +- +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- yy_load_buffer_state( ); +- +- /* We don't actually know whether we did this switch during +- * EOF (yywrap()) processing, but the only time this flag +- * is looked at is after yywrap() is called, so it's safe +- * to go ahead and always set it. +- */ +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-static void yy_load_buffer_state (void) +-{ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; +- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; +- (yy_hold_char) = *(yy_c_buf_p); +-} +- +-/** Allocate and initialize an input buffer state. +- * @param file A readable stream. +- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. +- * +- * @return the allocated buffer state. +- */ +- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +-{ +- YY_BUFFER_STATE b; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_buf_size = size; +- +- /* yy_ch_buf has to be 2 characters longer than the size given because +- * we need to put in 2 end-of-buffer characters. +- */ +- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); +- if ( ! b->yy_ch_buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_is_our_buffer = 1; +- +- yy_init_buffer(b,file ); +- +- return b; +-} +- +-/** Destroy the buffer. +- * @param b a buffer created with yy_create_buffer() +- * +- */ +- void yy_delete_buffer (YY_BUFFER_STATE b ) +-{ +- +- if ( ! b ) +- return; +- +- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ +- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; +- +- if ( b->yy_is_our_buffer ) +- yyfree((void *) b->yy_ch_buf ); +- +- yyfree((void *) b ); +-} +- +-#ifndef __cplusplus +-extern int isatty (int ); +-#endif /* __cplusplus */ +- +-/* Initializes or reinitializes a buffer. +- * This function is sometimes called more than once on the same buffer, +- * such as during a yyrestart() or at EOF. +- */ +- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) +- +-{ +- int oerrno = errno; +- +- yy_flush_buffer(b ); +- +- b->yy_input_file = file; +- b->yy_fill_buffer = 1; +- +- /* If b is the current buffer, then yy_init_buffer was _probably_ +- * called from yyrestart() or through yy_get_next_buffer. +- * In that case, we don't want to reset the lineno or column. +- */ +- if (b != YY_CURRENT_BUFFER){ +- b->yy_bs_lineno = 1; +- b->yy_bs_column = 0; +- } +- +- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +- +- errno = oerrno; +-} +- +-/** Discard all buffered characters. On the next scan, YY_INPUT will be called. +- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. +- * +- */ +- void yy_flush_buffer (YY_BUFFER_STATE b ) +-{ +- if ( ! b ) +- return; +- +- b->yy_n_chars = 0; +- +- /* We always need two end-of-buffer characters. The first causes +- * a transition to the end-of-buffer state. The second causes +- * a jam in that state. +- */ +- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; +- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; +- +- b->yy_buf_pos = &b->yy_ch_buf[0]; +- +- b->yy_at_bol = 1; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- if ( b == YY_CURRENT_BUFFER ) +- yy_load_buffer_state( ); +-} +- +-/** Pushes the new state onto the stack. The new state becomes +- * the current state. This function will allocate the stack +- * if necessary. +- * @param new_buffer The new state. +- * +- */ +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +-{ +- if (new_buffer == NULL) +- return; +- +- yyensure_buffer_stack(); +- +- /* This block is copied from yy_switch_to_buffer. */ +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- /* Only push if top exists. Otherwise, replace top. */ +- if (YY_CURRENT_BUFFER) +- (yy_buffer_stack_top)++; +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- +- /* copied from yy_switch_to_buffer. */ +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-/** Removes and deletes the top of the stack, if present. +- * The next element becomes the new top. +- * +- */ +-void yypop_buffer_state (void) +-{ +- if (!YY_CURRENT_BUFFER) +- return; +- +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- if ((yy_buffer_stack_top) > 0) +- --(yy_buffer_stack_top); +- +- if (YY_CURRENT_BUFFER) { +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +- } +-} +- +-/* Allocates the stack if it does not exist. +- * Guarantees space for at least one push. +- */ +-static void yyensure_buffer_stack (void) +-{ +- int num_to_alloc; +- +- if (!(yy_buffer_stack)) { +- +- /* First allocation is just for 2 elements, since we don't know if this +- * scanner will even need a stack. We use 2 instead of 1 to avoid an +- * immediate realloc on the next call. +- */ +- num_to_alloc = 1; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc +- (num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- +- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); +- +- (yy_buffer_stack_max) = num_to_alloc; +- (yy_buffer_stack_top) = 0; +- return; +- } +- +- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ +- +- /* Increase the buffer to prepare for a possible push. */ +- int grow_size = 8 /* arbitrary grow size */; +- +- num_to_alloc = (yy_buffer_stack_max) + grow_size; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc +- ((yy_buffer_stack), +- num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- +- /* zero only the new slots.*/ +- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); +- (yy_buffer_stack_max) = num_to_alloc; +- } +-} +- +-/** Setup the input buffer state to scan directly from a user-specified character buffer. +- * @param base the character buffer +- * @param size the size in bytes of the character buffer +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +-{ +- YY_BUFFER_STATE b; +- +- if ( size < 2 || +- base[size-2] != YY_END_OF_BUFFER_CHAR || +- base[size-1] != YY_END_OF_BUFFER_CHAR ) +- /* They forgot to leave room for the EOB's. */ +- return 0; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); +- +- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ +- b->yy_buf_pos = b->yy_ch_buf = base; +- b->yy_is_our_buffer = 0; +- b->yy_input_file = 0; +- b->yy_n_chars = b->yy_buf_size; +- b->yy_is_interactive = 0; +- b->yy_at_bol = 1; +- b->yy_fill_buffer = 0; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- yy_switch_to_buffer(b ); +- +- return b; +-} +- +-/** Setup the input buffer state to scan a string. The next call to yylex() will +- * scan from a @e copy of @a str. +- * @param str a NUL-terminated string to scan +- * +- * @return the newly allocated buffer state object. +- * @note If you want to scan bytes that may contain NUL values, then use +- * yy_scan_bytes() instead. +- */ +-YY_BUFFER_STATE yy_scan_string (yyconst char * str ) +-{ +- +- return yy_scan_bytes(str,strlen(str) ); +-} +- +-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will +- * scan from a @e copy of @a bytes. +- * @param bytes the byte buffer to scan +- * @param len the number of bytes in the buffer pointed to by @a bytes. +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len ) +-{ +- YY_BUFFER_STATE b; +- char *buf; +- yy_size_t n; +- int i; +- +- /* Get memory for full buffer, including space for trailing EOB's. */ +- n = len + 2; +- buf = (char *) yyalloc(n ); +- if ( ! buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); +- +- for ( i = 0; i < len; ++i ) +- buf[i] = bytes[i]; +- +- buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; +- +- b = yy_scan_buffer(buf,n ); +- if ( ! b ) +- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); +- +- /* It's okay to grow etc. this buffer, and we should throw it +- * away when we're done. +- */ +- b->yy_is_our_buffer = 1; +- +- return b; +-} +- +-#ifndef YY_EXIT_FAILURE +-#define YY_EXIT_FAILURE 2 +-#endif +- +-static void yy_fatal_error (yyconst char* msg ) +-{ +- (void) fprintf( stderr, "%s\n", msg ); +- exit( YY_EXIT_FAILURE ); +-} +- +-/* Redefine yyless() so it works in section 3 code. */ +- +-#undef yyless +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- yytext[yyleng] = (yy_hold_char); \ +- (yy_c_buf_p) = yytext + yyless_macro_arg; \ +- (yy_hold_char) = *(yy_c_buf_p); \ +- *(yy_c_buf_p) = '\0'; \ +- yyleng = yyless_macro_arg; \ +- } \ +- while ( 0 ) +- +-/* Accessor methods (get/set functions) to struct members. */ +- +-/** Get the current line number. +- * +- */ +-int yyget_lineno (void) +-{ +- +- return yylineno; +-} +- +-/** Get the input stream. +- * +- */ +-FILE *yyget_in (void) +-{ +- return yyin; +-} +- +-/** Get the output stream. +- * +- */ +-FILE *yyget_out (void) +-{ +- return yyout; +-} +- +-/** Get the length of the current token. +- * +- */ +-int yyget_leng (void) +-{ +- return yyleng; +-} +- +-/** Get the current token. +- * +- */ +- +-char *yyget_text (void) +-{ +- return yytext; +-} +- +-/** Set the current line number. +- * @param line_number +- * +- */ +-void yyset_lineno (int line_number ) +-{ +- +- yylineno = line_number; +-} +- +-/** Set the input stream. This does not discard the current +- * input buffer. +- * @param in_str A readable stream. +- * +- * @see yy_switch_to_buffer +- */ +-void yyset_in (FILE * in_str ) +-{ +- yyin = in_str ; +-} +- +-void yyset_out (FILE * out_str ) +-{ +- yyout = out_str ; +-} +- +-int yyget_debug (void) +-{ +- return yy_flex_debug; +-} +- +-void yyset_debug (int bdebug ) +-{ +- yy_flex_debug = bdebug ; +-} +- +-/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +-int yylex_destroy (void) +-{ +- +- /* Pop the buffer stack, destroying each element. */ +- while(YY_CURRENT_BUFFER){ +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- yypop_buffer_state(); +- } +- +- /* Destroy the stack itself. */ +- yyfree((yy_buffer_stack) ); +- (yy_buffer_stack) = NULL; +- +- yyfree ( (yy_state_buf) ); +- +- return 0; +-} +- +-/* +- * Internal utility routines. +- */ +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +-{ +- register int i; +- for ( i = 0; i < n; ++i ) +- s1[i] = s2[i]; +-} +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * s ) +-{ +- register int n; +- for ( n = 0; s[n]; ++n ) +- ; +- +- return n; +-} +-#endif +- +-void *yyalloc (yy_size_t size ) +-{ +- return (void *) malloc( size ); +-} +- +-void *yyrealloc (void * ptr, yy_size_t size ) +-{ +- /* The cast to (char *) in the following accommodates both +- * implementations that use char* generic pointers, and those +- * that use void* generic pointers. It works with the latter +- * because both ANSI C and C++ allow castless assignment from +- * any pointer type to void*, and deal with argument conversions +- * as though doing an assignment. +- */ +- return (void *) realloc( (char *) ptr, size ); +-} +- +-void yyfree (void * ptr ) +-{ +- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +-} +- +-#define YYTABLES_NAME "yytables" +- +-#undef YY_NEW_FILE +-#undef YY_FLUSH_BUFFER +-#undef yy_set_bol +-#undef yy_new_buffer +-#undef yy_set_interactive +-#undef YY_DO_BEFORE_ACTION +- +-#ifdef YY_DECL_IS_OURS +-#undef YY_DECL_IS_OURS +-#undef YY_DECL +-#endif +-#line 90 "goomsl_lex.l" +- +- +- +- +-int yywrap(void) { return 1; yyunput(0,0); } +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_lex.l /src/goomsl_lex.l +--- /home/d4rk/goom2k4-0/src/goomsl_lex.l 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_lex.l 1969-12-31 17:00:00.000000000 -0700 +@@ -1,94 +0,0 @@ +-%{ +- +-#include +-#include +-#include +-#include "goomsl.h" +-#include "goomsl_private.h" +-#include "goomsl_yacc.h" +-void yyerror(char *); +-void yyparse(void); +- +-GoomSL *currentGoomSL; +-static int string_size; +-static char string[1024]; +-%} +- +-DIGIT [0-9] +-XDIGIT [0-9a-f] +-ID [a-zA-Z_@&][a-zA-Z0-9_\.]* +- +-%S C_COMMENT +-%S LINE_COMMENT +-%S STRING +- +-%% +- +-^[ \t]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } +-^[ \t]*"//"[^\n]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } +- +-\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } +-\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } +- +-"*/" { BEGIN INITIAL; } +-\n { ++currentGoomSL->num_lines; } +-. { /* eat up comment */ } +- +-"#RST_LINE#" { currentGoomSL->num_lines = 0; } +-"#FILE ".*"#" { currentGoomSL->num_lines = 0; printf("%s\n", yytext); } +-"#"[^\n]* { /* ignore preprocessor lines */ } +- +-"/*" { BEGIN C_COMMENT; } +-"//" { BEGIN LINE_COMMENT; } +-\" { BEGIN STRING; string_size=0; } +- +-"\\n" { string[string_size++] = '\n'; } +-"\\\"" { string[string_size++] = '\"'; } +-\" { /* fin de la chaine: on cree le pointeur qui va bien */ +- unsigned int tmp; +- BEGIN INITIAL; +- string[string_size]=0; +- tmp = gsl_malloc(currentGoomSL, string_size+1); +- strcpy((char*)currentGoomSL->ptrArray[tmp],string); +- sprintf(yylval.strValue, "0x%08x", tmp); +- return LTYPE_PTR; +- } +-. { string[string_size++] = *yytext; } +- +-"float" { return FLOAT_TK; } +-"int" { return INT_TK; } +-"boolean" { return INT_TK; } +-"ptr" { return PTR_TK; } +-"string" { return PTR_TK; } +-"declare" { return DECLARE; } +-"external" { return EXTERNAL; } +-"struct" { return STRUCT; } +-"not" { return NOT; } +-"while" { return WHILE; } +-"do" { return DO; } +-"for" { return FOR; } +-"in" { return IN; } +-"true" { strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } +-"false" { strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } +-{ID} { strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } +-{DIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +-\'.\' { sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } +-"0x"{XDIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +-{DIGIT}+"."{DIGIT}* { strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } +-{DIGIT}+"%" { sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } +-"+=" { return PLUS_EQ; } +-"*=" { return MUL_EQ; } +-"-=" { return SUB_EQ; } +-"/=" { return DIV_EQ; } +-"<=" { return LOW_EQ; } +-">=" { return SUP_EQ; } +-"!=" { return NOT_EQ; } +-"<>" { return NOT_EQ; } +-[ \t]+ /* eat up whitespace */ +-. { yylval.charValue = *yytext; return *yytext; } +- +-%% +- +- +-int yywrap(void) { return 1; yyunput(0,0); } +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_private.h /src/goomsl_private.h +--- /home/d4rk/goom2k4-0/src/goomsl_private.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_private.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,251 +0,0 @@ +-#ifndef _GSL_PRIVATE_H +-#define _GSL_PRIVATE_H +- +-/* -- internal use -- */ +- +-#include "goomsl.h" +- +-#ifdef USE_JITC_X86 +-#include "jitc_x86.h" +-#endif +- +-#include "goomsl_heap.h" +- +-/* {{{ type of nodes */ +-#define EMPTY_NODE 0 +-#define CONST_INT_NODE 1 +-#define CONST_FLOAT_NODE 2 +-#define CONST_PTR_NODE 3 +-#define VAR_NODE 4 +-#define PARAM_NODE 5 +-#define READ_PARAM_NODE 6 +-#define OPR_NODE 7 +-/* }}} */ +-/* {{{ type of operations */ +-#define OPR_SET 1 +-#define OPR_IF 2 +-#define OPR_WHILE 3 +-#define OPR_BLOCK 4 +-#define OPR_ADD 5 +-#define OPR_MUL 6 +-#define OPR_EQU 7 +-#define OPR_NOT 8 +-#define OPR_LOW 9 +-#define OPR_DIV 10 +-#define OPR_SUB 11 +-#define OPR_FUNC_INTRO 12 +-#define OPR_FUNC_OUTRO 13 +-#define OPR_CALL 14 +-#define OPR_EXT_CALL 15 +-#define OPR_PLUS_EQ 16 +-#define OPR_SUB_EQ 17 +-#define OPR_MUL_EQ 18 +-#define OPR_DIV_EQ 19 +-#define OPR_CALL_EXPR 20 +-#define OPR_AFFECT_LIST 21 +-#define OPR_FOREACH 22 +-#define OPR_VAR_LIST 23 +- +-/* }}} */ +- +-typedef struct _ConstIntNodeType { /* {{{ */ +- int val; +-} ConstIntNodeType; /* }}} */ +-typedef struct _ConstFloatNodeType { /* {{{ */ +- float val; +-} ConstFloatNodeType; /* }}} */ +-typedef struct _ConstPtrNodeType { /* {{{ */ +- int id; +-} ConstPtrNodeType; /* }}} */ +-typedef struct _OprNodeType { /* {{{ */ +- int type; +- int nbOp; +- struct _NODE_TYPE *op[3]; /* maximal number of operand needed */ +- struct _NODE_TYPE *next; +-} OprNodeType; /* }}} */ +-typedef struct _NODE_TYPE { /* {{{ */ +- int type; +- char *str; +- GoomHash *vnamespace; +- int line_number; +- union { +- ConstIntNodeType constInt; +- ConstFloatNodeType constFloat; +- ConstPtrNodeType constPtr; +- OprNodeType opr; +- } unode; +-} NodeType; /* }}} */ +-typedef struct _INSTRUCTION_DATA { /* {{{ */ +- +- union { +- void *var; +- int *var_int; +- int *var_ptr; +- float *var_float; +- int jump_offset; +- struct _ExternalFunctionStruct *external_function; +- } udest; +- +- union { +- void *var; +- int *var_int; +- int *var_ptr; +- float *var_float; +- int value_int; +- int value_ptr; +- float value_float; +- } usrc; +-} InstructionData; +-/* }}} */ +-typedef struct _INSTRUCTION { /* {{{ */ +- +- int id; +- InstructionData data; +- GoomSL *parent; +- const char *name; /* name of the instruction */ +- +- char **params; /* parametres de l'instruction */ +- GoomHash **vnamespace; +- int *types; /* type des parametres de l'instruction */ +- int cur_param; +- int nb_param; +- +- int address; +- char *jump_label; +- char *nop_label; +- +- int line_number; +- +-} Instruction; +-/* }}} */ +-typedef struct _INSTRUCTION_FLOW { /* {{{ */ +- +- Instruction **instr; +- int number; +- int tabsize; +- GoomHash *labels; +-} InstructionFlow; +-/* }}} */ +-typedef struct _FAST_INSTRUCTION { /* {{{ */ +- int id; +- InstructionData data; +- Instruction *proto; +-} FastInstruction; +-/* }}} */ +-typedef struct _FastInstructionFlow { /* {{{ */ +- int number; +- FastInstruction *instr; +- void *mallocedInstr; +-} FastInstructionFlow; +-/* }}} */ +-typedef struct _ExternalFunctionStruct { /* {{{ */ +- GoomSL_ExternalFunction function; +- GoomHash *vars; +- int is_extern; +-} ExternalFunctionStruct; +-/* }}} */ +-typedef struct _Block { +- int data; +- int size; +-} Block; +-typedef struct _GSL_StructField { /* {{{ */ +- int type; +- char name[256]; +- int offsetInStruct; /* Where this field is stored... */ +-} GSL_StructField; +- /* }}} */ +-typedef struct _GSL_Struct { /* {{{ */ +- int nbFields; +- GSL_StructField *fields[64]; +- int size; +- Block iBlock[64]; +- Block fBlock[64]; +-} GSL_Struct; +- /* }}} */ +-struct _GoomSL { /* {{{ */ +- int num_lines; +- Instruction *instr; /* instruction en cours de construction */ +- +- InstructionFlow *iflow; /* flow d'instruction 'normal' */ +- FastInstructionFlow *fastiflow; /* flow d'instruction optimise */ +- +- GoomHash *vars; /* table de variables */ +- int currentNS; +- GoomHash *namespaces[16]; +- +- GoomHash *functions; /* table des fonctions externes */ +- +- GoomHeap *data_heap; /* GSL Heap-like memory space */ +- +- int nbStructID; +- GoomHash *structIDS; +- GSL_Struct **gsl_struct; +- int gsl_struct_size; +- +- int nbPtr; +- int ptrArraySize; +- void **ptrArray; +- +- int compilationOK; +-#ifdef USE_JITC_X86 +- JitcX86Env *jitc; +- JitcFunc jitc_func; +-#endif +-}; /* }}} */ +- +-extern GoomSL *currentGoomSL; +- +-Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number); +-void gsl_instr_add_param(Instruction *_this, char *param, int type); +-void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns); +- +-void gsl_declare_task(const char *name); +-void gsl_declare_external_task(const char *name); +- +-int gsl_type_of_var(GoomHash *namespace, const char *name); +- +-void gsl_enternamespace(const char *name); +-void gsl_reenternamespace(GoomHash *ns); +-GoomHash *gsl_leavenamespace(void); +-GoomHash *gsl_find_namespace(const char *name); +- +-void gsl_commit_compilation(void); +- +-/* #define TYPE_PARAM 1 */ +- +-#define FIRST_RESERVED 0x80000 +- +-#define TYPE_INTEGER 0x90001 +-#define TYPE_FLOAT 0x90002 +-#define TYPE_VAR 0x90003 +-#define TYPE_PTR 0x90004 +-#define TYPE_LABEL 0x90005 +- +-#define TYPE_OP_EQUAL 6 +-#define TYPE_IVAR 0xa0001 +-#define TYPE_FVAR 0xa0002 +-#define TYPE_PVAR 0xa0003 +-#define TYPE_SVAR 0xa0004 +- +-#define INSTR_JUMP 6 +-#define INSTR_JZERO 29 +-#define INSTR_CALL 36 +-#define INSTR_RET 37 +-#define INSTR_EXT_CALL 38 +-#define INSTR_JNZERO 40 +- +-#define INSTR_SET 0x80001 +-#define INSTR_INT 0x80002 +-#define INSTR_FLOAT 0x80003 +-#define INSTR_PTR 0x80004 +-#define INSTR_LABEL 0x80005 +-#define INSTR_ISLOWER 0x80006 +-#define INSTR_ADD 0x80007 +-#define INSTR_MUL 0x80008 +-#define INSTR_DIV 0x80009 +-#define INSTR_SUB 0x80010 +-#define INSTR_ISEQUAL 0x80011 +-#define INSTR_NOT 0x80012 +- +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.c /src/goomsl_yacc.c +--- /home/d4rk/goom2k4-0/src/goomsl_yacc.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_yacc.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,2997 +0,0 @@ +-/* A Bison parser, made by GNU Bison 1.875. */ +- +-/* Skeleton parser for Yacc-like parsing with Bison, +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. +- +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 59 Temple Place - Suite 330, +- Boston, MA 02111-1307, USA. */ +- +-/* As a special exception, when this file is copied by Bison into a +- Bison output file, you may use that output file without restriction. +- This special exception was added by the Free Software Foundation +- in version 1.24 of Bison. */ +- +-/* Written by Richard Stallman by simplifying the original so called +- ``semantic'' parser. */ +- +-/* All symbols defined below should begin with yy or YY, to avoid +- infringing on user name space. This should be done even for local +- variables, as they might otherwise be expanded by user macros. +- There are some unavoidable exceptions within include files to +- define necessary library symbols; they are noted "INFRINGES ON +- USER NAME SPACE" below. */ +- +-/* Identify Bison output. */ +-#define YYBISON 1 +- +-/* Skeleton name. */ +-#define YYSKELETON_NAME "yacc.c" +- +-/* Pure parsers. */ +-#define YYPURE 0 +- +-/* Using locations. */ +-#define YYLSP_NEEDED 0 +- +- +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- LTYPE_INTEGER = 258, +- LTYPE_FLOAT = 259, +- LTYPE_VAR = 260, +- LTYPE_PTR = 261, +- PTR_TK = 262, +- INT_TK = 263, +- FLOAT_TK = 264, +- DECLARE = 265, +- EXTERNAL = 266, +- WHILE = 267, +- DO = 268, +- NOT = 269, +- PLUS_EQ = 270, +- SUB_EQ = 271, +- DIV_EQ = 272, +- MUL_EQ = 273, +- SUP_EQ = 274, +- LOW_EQ = 275, +- NOT_EQ = 276, +- STRUCT = 277, +- FOR = 278, +- IN = 279 +- }; +-#endif +-#define LTYPE_INTEGER 258 +-#define LTYPE_FLOAT 259 +-#define LTYPE_VAR 260 +-#define LTYPE_PTR 261 +-#define PTR_TK 262 +-#define INT_TK 263 +-#define FLOAT_TK 264 +-#define DECLARE 265 +-#define EXTERNAL 266 +-#define WHILE 267 +-#define DO 268 +-#define NOT 269 +-#define PLUS_EQ 270 +-#define SUB_EQ 271 +-#define DIV_EQ 272 +-#define MUL_EQ 273 +-#define SUP_EQ 274 +-#define LOW_EQ 275 +-#define NOT_EQ 276 +-#define STRUCT 277 +-#define FOR 278 +-#define IN 279 +- +- +- +- +-/* Copy the first part of user declarations. */ +-#line 6 "goomsl_yacc.y" +- +- #include +- #include +- #include +- #include "goomsl.h" +- #include "goomsl_private.h" +- +-#define STRUCT_ALIGNMENT 16 +-/* #define VERBOSE */ +- +- int yylex(void); +- void yyerror(char *); +- extern GoomSL *currentGoomSL; +- +- static NodeType *nodeNew(const char *str, int type, int line_number); +- static NodeType *nodeClone(NodeType *node); +- static void nodeFreeInternals(NodeType *node); +- static void nodeFree(NodeType *node); +- +- static void commit_node(NodeType *node, int releaseIfTemp); +- static void precommit_node(NodeType *node); +- +- static NodeType *new_constInt(const char *str, int line_number); +- static NodeType *new_constFloat(const char *str, int line_number); +- static NodeType *new_constPtr(const char *str, int line_number); +- static NodeType *new_var(const char *str, int line_number); +- static NodeType *new_nop(const char *str); +- static NodeType *new_op(const char *str, int type, int nbOp); +- +- static int allocateLabel(); +- static int allocateTemp(); +- static void releaseTemp(int n); +- static void releaseAllTemps(); +- +- static int is_tmp_expr(NodeType *node) { +- if (node->str) { +- return (!strncmp(node->str,"_i_tmp_",7)) +- || (!strncmp(node->str,"_f_tmp_",7)) +- || (!strncmp(node->str,"_p_tmp",7)); +- } +- return 0; +- } +- /* pre: is_tmp_expr(node); */ +- static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } +- +- static int is_commutative_expr(int itype) +- { /* {{{ */ +- return (itype == INSTR_ADD) +- || (itype == INSTR_MUL) +- || (itype == INSTR_ISEQUAL); +- } /* }}} */ +- +- static void GSL_PUT_LABEL(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("label %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JUMP(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("jump %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- +- static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("%s %s\n", iname, name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JZERO(char *name,int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); +- } /* }}} */ +- static void GSL_PUT_JNZERO(char *name, int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); +- } /* }}} */ +- +- /* Structures Management */ +- +-#define ALIGN_ADDR(_addr,_align) {\ +- if (_align>1) {\ +- int _dec = (_addr%_align);\ +- if (_dec != 0) _addr += _align - _dec;\ +- }} +- +- /* */ +- void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) +- { +- int i; +- int consumed = 0; +- int iblk=0, fblk=0; +- +- s->iBlock[0].size = 0; +- s->iBlock[0].data = 0; +- s->fBlock[0].size = 0; +- s->fBlock[0].data = 0; +- +- /* Prepare sub-struct and calculate space needed for their storage */ +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type < FIRST_RESERVED) +- { +- int j=0; +- GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; +- consumed += sizeof(int); /* stocke le prefix */ +- ALIGN_ADDR(consumed, s_align); +- s->fields[i]->offsetInStruct = consumed; +- gsl_prepare_struct(substruct, s_align, i_align, f_align); +- for(j=0;substruct->iBlock[j].size>0;++j) { +- s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; +- s->iBlock[iblk].size = substruct->iBlock[j].size; +- iblk++; +- } +- for(j=0;substruct->fBlock[j].size>0;++j) { +- s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; +- s->fBlock[fblk].size = substruct->fBlock[j].size; +- fblk++; +- } +- consumed += substruct->size; +- } +- } +- +- /* Then prepare integers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_INT) +- { +- if (s->iBlock[iblk].size == 0) { +- s->iBlock[iblk].size = 1; +- s->iBlock[iblk].data = consumed; +- } else { +- s->iBlock[iblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- iblk++; +- s->iBlock[iblk].size = 0; +- s->iBlock[iblk].data = 0; +- +- /* Then prepare floats */ +- ALIGN_ADDR(consumed, f_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_FLOAT) +- { +- if (s->fBlock[fblk].size == 0) { +- s->fBlock[fblk].size = 1; +- s->fBlock[fblk].data = consumed; +- } else { +- s->fBlock[fblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- fblk++; +- s->fBlock[fblk].size = 0; +- s->fBlock[fblk].data = 0; +- +- /* Finally prepare pointers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_PTR) +- { +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- s->size = consumed; +- } +- +- /* Returns the ID of a struct from its name */ +- int gsl_get_struct_id(const char *name) /* {{{ */ +- { +- HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); +- if (ret != NULL) return ret->i; +- return -1; +- } /* }}} */ +- +- /* Adds the definition of a struct */ +- void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ +- { +- /* Prepare the struct: ie calculate internal storage format */ +- gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); +- +- /* If the struct does not already exists */ +- if (gsl_get_struct_id(name) < 0) +- { +- /* adds it */ +- int id = currentGoomSL->nbStructID++; +- goom_hash_put_int(currentGoomSL->structIDS, name, id); +- if (currentGoomSL->gsl_struct_size <= id) { +- currentGoomSL->gsl_struct_size *= 2; +- currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, +- sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); +- } +- currentGoomSL->gsl_struct[id] = gsl_struct; +- } +- } /* }}} */ +- +- /* Creates a field for a struct */ +- GSL_StructField *gsl_new_struct_field(const char *name, int type) +- { +- GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); +- strcpy(field->name, name); +- field->type = type; +- return field; +- } +- +- /* Create as field for a struct which will be a struct itself */ +- GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) +- { +- GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); +- if (field->type < 0) { +- fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", +- currentGoomSL->num_lines, type); +- exit(1); +- } +- return field; +- } +- +- /* Creates a Struct */ +- GSL_Struct *gsl_new_struct(GSL_StructField *field) +- { +- GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); +- s->nbFields = 1; +- s->fields[0] = field; +- return s; +- } +- +- /* Adds a field to a struct */ +- void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) +- { +- s->fields[s->nbFields++] = field; +- } +- +- int gsl_type_of_var(GoomHash *ns, const char *name) +- { +- char type_of[256]; +- HashValue *hv; +- sprintf(type_of, "__type_of_%s", name); +- hv = goom_hash_get(ns, type_of); +- if (hv != NULL) +- return hv->i; +- fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); +- return -1; +- } +- +- static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) +- { +- char type_of[256]; +- if (name[0] == '@') { ns = currentGoomSL->vars; } +- +- if (space == NULL) { +- switch (type) { +- case INSTR_INT: +- case INSTR_FLOAT: +- case INSTR_PTR: +- space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, +- sizeof(int), sizeof(int)); +- break; +- case -1: +- fprintf(stderr, "What the fuck!\n"); +- exit(1); +- default: /* On a un struct_id */ +- space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, +- currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); +- } +- } +- goom_hash_put_ptr(ns, name, (void*)space); +- sprintf(type_of, "__type_of_%s", name); +- goom_hash_put_int(ns, type_of, type); +- +- /* Ensuite le hack: on ajoute les champs en tant que variables. */ +- if (type < FIRST_RESERVED) +- { +- int i; +- GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; +- ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ +- for (i = 0; i < gsl_struct->nbFields; ++i) +- { +- char full_name[256]; +- char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; +- sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); +- gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); +- } +- } +- } +- +- /* Declare a variable which will be a struct */ +- static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) +- { +- int struct_id = gsl_get_struct_id(struct_name); +- gsl_declare_var(namespace, name, struct_id, NULL); +- } +- +- static void gsl_float_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); +- } +- static void gsl_int_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); +- } +- static void gsl_ptr_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); +- } +- static void gsl_struct_decl_global_from_id(const char *name, int id) +- { +- gsl_declare_var(currentGoomSL->vars, name, id, NULL); +- } +- +- /* FLOAT */ +- static void gsl_float_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); +- } +- /* INT */ +- static void gsl_int_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); +- } +- /* PTR */ +- static void gsl_ptr_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); +- } +- /* STRUCT */ +- static void gsl_struct_decl_local(const char *struct_name, const char *name) +- { +- gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); +- } +- +- +- static void commit_test2(NodeType *set,const char *type, int instr); +- static NodeType *new_call(const char *name, NodeType *affect_list); +- +- /* SETTER */ +- static NodeType *new_set(NodeType *lvalue, NodeType *expression) +- { /* {{{ */ +- NodeType *set = new_op("set", OPR_SET, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } /* }}} */ +- static void commit_set(NodeType *set) +- { /* {{{ */ +- commit_test2(set,"set",INSTR_SET); +- } /* }}} */ +- +- /* PLUS_EQ */ +- static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_plus_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* SUB_EQ */ +- static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_sub_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* MUL_EQ */ +- static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_mul_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* DIV_EQ */ +- static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_div_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* commodity method for add, mult, ... */ +- +- static void precommit_expr(NodeType *expr, const char *type, int instr_id) +- { /* {{{ */ +- NodeType *tmp, *tmpcpy; +- int toAdd; +- +- /* compute "left" and "right" */ +- switch (expr->unode.opr.nbOp) { +- case 2: +- precommit_node(expr->unode.opr.op[1]); +- case 1: +- precommit_node(expr->unode.opr.op[0]); +- } +- +- if (is_tmp_expr(expr->unode.opr.op[0])) { +- tmp = expr->unode.opr.op[0]; +- toAdd = 1; +- } +- else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { +- tmp = expr->unode.opr.op[1]; +- toAdd = 0; +- } +- else { +- char stmp[256]; +- /* declare a temporary variable to store the result */ +- if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else { +- int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- } +- tmp = new_var(stmp,expr->line_number); +- +- /* set the tmp to the value of "op1" */ +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,expr->unode.opr.op[0]),0); +- toAdd = 1; +- +- tmp = tmpcpy; +- } +- +- /* add op2 to tmp */ +-#ifdef VERBOSE +- if (expr->unode.opr.nbOp == 2) +- printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); +- else +- printf("%s %s\n", type, tmp->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(tmp,0); +- if (expr->unode.opr.nbOp == 2) { +- commit_node(expr->unode.opr.op[toAdd],1); +- } +- +- /* redefine the ADD node now as the computed variable */ +- nodeFreeInternals(expr); +- *expr = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static NodeType *new_expr1(const char *name, int id, NodeType *expr1) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 1); +- add->unode.opr.op[0] = expr1; +- return add; +- } /* }}} */ +- +- static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 2); +- add->unode.opr.op[0] = expr1; +- add->unode.opr.op[1] = expr2; +- return add; +- } /* }}} */ +- +- /* ADD */ +- static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("add", OPR_ADD, expr1, expr2); +- } +- static void precommit_add(NodeType *add) { +- precommit_expr(add,"add",INSTR_ADD); +- } /* }}} */ +- +- /* SUB */ +- static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("sub", OPR_SUB, expr1, expr2); +- } +- static void precommit_sub(NodeType *sub) { +- precommit_expr(sub,"sub",INSTR_SUB); +- } /* }}} */ +- +- /* NEG */ +- static NodeType *new_neg(NodeType *expr) { /* {{{ */ +- NodeType *zeroConst = NULL; +- if (expr->type == CONST_INT_NODE) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (expr->type == CONST_FLOAT_NODE) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (expr->type == CONST_PTR_NODE) { +- fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else { +- int type = gsl_type_of_var(expr->vnamespace, expr->str); +- if (type == INSTR_FLOAT) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (type == INSTR_PTR) { +- fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else if (type == INSTR_INT) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", +- expr->line_number, expr->str); +- exit(1); +- } +- } +- return new_expr2("sub", OPR_SUB, zeroConst, expr); +- } +- /* }}} */ +- +- /* MUL */ +- static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("mul", OPR_MUL, expr1, expr2); +- } +- static void precommit_mul(NodeType *mul) { +- precommit_expr(mul,"mul",INSTR_MUL); +- } /* }}} */ +- +- /* DIV */ +- static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("div", OPR_DIV, expr1, expr2); +- } +- static void precommit_div(NodeType *mul) { +- precommit_expr(mul,"div",INSTR_DIV); +- } /* }}} */ +- +- /* CALL EXPRESSION */ +- static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ +- NodeType *call = new_call(name,affect_list); +- NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); +- node->vnamespace = gsl_find_namespace(name); +- if (node->vnamespace == NULL) +- fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); +- return node; +- } +- static void precommit_call_expr(NodeType *call) { +- char stmp[256]; +- NodeType *tmp,*tmpcpy; +- int type = gsl_type_of_var(call->vnamespace, call->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- call->line_number, call->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- tmp = new_var(stmp,call->line_number); +- commit_node(call->unode.opr.op[0],0); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); +- +- nodeFreeInternals(call); +- *call = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static void commit_test2(NodeType *set,const char *type, int instr) +- { /* {{{ */ +- NodeType *tmp; +- char stmp[256]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- tmp = set->unode.opr.op[0]; +- +- stmp[0] = 0; +- if (set->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- if (stmp[0]) { +- NodeType *tmpcpy; +- tmp = new_var(stmp, set->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,set->unode.opr.op[0]),0); +- tmp = tmpcpy; +- } +- +-#ifdef VERBOSE +- printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); +- commit_node(tmp,instr!=INSTR_SET); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* NOT */ +- static NodeType *new_not(NodeType *expr1) { /* {{{ */ +- return new_expr1("not", OPR_NOT, expr1); +- } +- static void commit_not(NodeType *set) +- { +- commit_node(set->unode.opr.op[0],0); +-#ifdef VERBOSE +- printf("not\n"); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- } /* }}} */ +- +- /* EQU */ +- static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("isequal", OPR_EQU, expr1, expr2); +- } +- static void commit_equ(NodeType *mul) { +- commit_test2(mul,"isequal",INSTR_ISEQUAL); +- } /* }}} */ +- +- /* INF */ +- static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("islower", OPR_LOW, expr1, expr2); +- } +- static void commit_low(NodeType *mul) { +- commit_test2(mul,"islower",INSTR_ISLOWER); +- } /* }}} */ +- +- /* WHILE */ +- static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("while", OPR_WHILE, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- +- static void commit_while(NodeType *node) +- { +- int lbl = allocateLabel(); +- char start_while[1024], test_while[1024]; +- sprintf(start_while, "|start_while_%d|", lbl); +- sprintf(test_while, "|test_while_%d|", lbl); +- +- GSL_PUT_JUMP(test_while,node->line_number); +- GSL_PUT_LABEL(start_while,node->line_number); +- +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- +- GSL_PUT_LABEL(test_while,node->line_number); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JNZERO(start_while,node->line_number); +- } /* }}} */ +- +- /* FOR EACH */ +- static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("for", OPR_FOREACH, 3); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = var_list; +- node->unode.opr.op[2] = instr; +- node->line_number = currentGoomSL->num_lines; +- return node; +- } +- static void commit_foreach(NodeType *node) +- { +- NodeType *cur = node->unode.opr.op[1]; +- char tmp_func[256], tmp_loop[256]; +- int lbl = allocateLabel(); +- sprintf(tmp_func, "|foreach_func_%d|", lbl); +- sprintf(tmp_loop, "|foreach_loop_%d|", lbl); +- +- GSL_PUT_JUMP(tmp_loop, node->line_number); +- GSL_PUT_LABEL(tmp_func, node->line_number); +- +- precommit_node(node->unode.opr.op[2]); +- commit_node(node->unode.opr.op[2], 0); +- +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- +- GSL_PUT_LABEL(tmp_loop, node->line_number); +- +- while (cur != NULL) +- { +- NodeType *x, *var; +- +- /* 1: x=var */ +- x = nodeClone(node->unode.opr.op[0]); +- var = nodeClone(cur->unode.opr.op[0]); +- commit_node(new_set(x, var),0); +- +- /* 2: instr */ +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", tmp_func); +-#endif +- +- /* 3: var=x */ +- x = nodeClone(node->unode.opr.op[0]); +- var = cur->unode.opr.op[0]; +- commit_node(new_set(var, x),0); +- cur = cur->unode.opr.op[1]; +- } +- nodeFree(node->unode.opr.op[0]); +- } /* }}} */ +- +- /* IF */ +- static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("if", OPR_IF, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- static void commit_if(NodeType *node) { +- +- char slab[1024]; +- sprintf(slab, "|eif%d|", allocateLabel()); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JZERO(slab,node->line_number); +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- GSL_PUT_LABEL(slab,node->line_number); +- } /* }}} */ +- +- /* BLOCK */ +- static NodeType *new_block(NodeType *lastNode) { /* {{{ */ +- NodeType *blk = new_op("block", OPR_BLOCK, 2); +- blk->unode.opr.op[0] = new_nop("start_of_block"); +- blk->unode.opr.op[1] = lastNode; +- return blk; +- } +- static void commit_block(NodeType *node) { +- commit_node(node->unode.opr.op[0]->unode.opr.next,0); +- } /* }}} */ +- +- /* FUNCTION INTRO */ +- static NodeType *new_function_intro(const char *name) { /* {{{ */ +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- return new_op(stmp, OPR_FUNC_INTRO, 0); +- } +- static void commit_function_intro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("label %s\n", node->str); +-#endif +- } /* }}} */ +- +- /* FUNCTION OUTRO */ +- static NodeType *new_function_outro() { /* {{{ */ +- return new_op("ret", OPR_FUNC_OUTRO, 0); +- } +- static void commit_function_outro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- releaseAllTemps(); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- } /* }}} */ +- +- /* AFFECTATION LIST */ +- static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); +- node->unode.opr.op[0] = set; +- node->unode.opr.op[1] = next; +- return node; +- } +- static NodeType *new_affect_list_after(NodeType *affect_list) +- { +- NodeType *ret = NULL; +- NodeType *cur = affect_list; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- NodeType *next = cur->unode.opr.op[1]; +- NodeType *lvalue = set->unode.opr.op[0]; +- NodeType *expression = set->unode.opr.op[1]; +- if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { +- NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); +- ret = new_affec_list(nset, ret); +- } +- cur = next; +- } +- return ret; +- } +- static void commit_affect_list(NodeType *node) +- { +- NodeType *cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- cur = cur->unode.opr.op[1]; +- } +- cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- commit_node(set,0); +- cur = cur->unode.opr.op[1]; +- } +- } /* }}} */ +- +- /* VAR LIST */ +- static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = next; +- return node; +- } +- static void commit_var_list(NodeType *node) +- { +- } /* }}} */ +- +- /* FUNCTION CALL */ +- static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ +- HashValue *fval; +- fval = goom_hash_get(currentGoomSL->functions, name); +- if (!fval) { +- gsl_declare_task(name); +- fval = goom_hash_get(currentGoomSL->functions, name); +- } +- if (!fval) { +- fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); +- exit(1); +- return NULL; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; +- if (gef->is_extern) { +- NodeType *node = new_op(name, OPR_EXT_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- else { +- NodeType *node; +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- node = new_op(stmp, OPR_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- } +- } +- static void commit_ext_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +-#ifdef VERBOSE +- printf("extcall %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } +- static void commit_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } /* }}} */ +- +- /** **/ +- +- static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ +- static NodeType *lastNode = 0; +- static NodeType *gsl_append(NodeType *curNode) { +- if (curNode == 0) return 0; /* {{{ */ +- if (lastNode) +- lastNode->unode.opr.next = curNode; +- lastNode = curNode; +- while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; +- if (rootNode == 0) +- rootNode = curNode; +- return curNode; +- } /* }}} */ +- +-#if 1 +- int allocateTemp() { +- return allocateLabel(); +- } +- void releaseAllTemps() {} +- void releaseTemp(int n) {} +-#else +- static int nbTemp = 0; +- static int *tempArray = 0; +- static int tempArraySize = 0; +- int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ +- int i = 0; /* {{{ */ +- if (tempArray == 0) { +- tempArraySize = 256; +- tempArray = (int*)malloc(tempArraySize * sizeof(int)); +- } +- while (1) { +- int j; +- for (j=0;jtype == OPR_NODE) +- switch(node->unode.opr.type) { +- case OPR_ADD: precommit_add(node); break; +- case OPR_SUB: precommit_sub(node); break; +- case OPR_MUL: precommit_mul(node); break; +- case OPR_DIV: precommit_div(node); break; +- case OPR_CALL_EXPR: precommit_call_expr(node); break; +- } +- } /* }}} */ +- +- void commit_node(NodeType *node, int releaseIfTmp) +- { /* {{{ */ +- if (node == 0) return; +- +- switch(node->type) { +- case OPR_NODE: +- switch(node->unode.opr.type) { +- case OPR_SET: commit_set(node); break; +- case OPR_PLUS_EQ: commit_plus_eq(node); break; +- case OPR_SUB_EQ: commit_sub_eq(node); break; +- case OPR_MUL_EQ: commit_mul_eq(node); break; +- case OPR_DIV_EQ: commit_div_eq(node); break; +- case OPR_IF: commit_if(node); break; +- case OPR_WHILE: commit_while(node); break; +- case OPR_BLOCK: commit_block(node); break; +- case OPR_FUNC_INTRO: commit_function_intro(node); break; +- case OPR_FUNC_OUTRO: commit_function_outro(node); break; +- case OPR_CALL: commit_call(node); break; +- case OPR_EXT_CALL: commit_ext_call(node); break; +- case OPR_EQU: commit_equ(node); break; +- case OPR_LOW: commit_low(node); break; +- case OPR_NOT: commit_not(node); break; +- case OPR_AFFECT_LIST: commit_affect_list(node); break; +- case OPR_FOREACH: commit_foreach(node); break; +- case OPR_VAR_LIST: commit_var_list(node); break; +-#ifdef VERBOSE +- case EMPTY_NODE: printf("NOP\n"); break; +-#endif +- } +- +- commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ +- break; +- +- case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; +- case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; +- case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; +- case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; +- } +- if (releaseIfTmp && is_tmp_expr(node)) +- releaseTemp(get_tmp_id(node)); +- +- nodeFree(node); +- } /* }}} */ +- +- NodeType *nodeNew(const char *str, int type, int line_number) { +- NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ +- node->type = type; +- node->str = (char*)malloc(strlen(str)+1); +- node->vnamespace = NULL; +- node->line_number = line_number; +- strcpy(node->str, str); +- return node; +- } /* }}} */ +- static NodeType *nodeClone(NodeType *node) { +- NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ +- ret->vnamespace = node->vnamespace; +- ret->unode = node->unode; +- return ret; +- } /* }}} */ +- +- void nodeFreeInternals(NodeType *node) { +- free(node->str); /* {{{ */ +- } /* }}} */ +- +- void nodeFree(NodeType *node) { +- nodeFreeInternals(node); /* {{{ */ +- free(node); +- } /* }}} */ +- +- NodeType *new_constInt(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ +- node->unode.constInt.val = atoi(str); +- return node; +- } /* }}} */ +- +- NodeType *new_constPtr(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ +- node->unode.constPtr.id = strtol(str,NULL,0); +- return node; +- } /* }}} */ +- +- NodeType *new_constFloat(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ +- node->unode.constFloat.val = atof(str); +- return node; +- } /* }}} */ +- +- NodeType *new_var(const char *str, int line_number) { +- NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ +- node->vnamespace = gsl_find_namespace(str); +- if (node->vnamespace == 0) { +- fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); +- exit(1); +- } +- return node; +- } /* }}} */ +- +- NodeType *new_nop(const char *str) { +- NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ +- return node; +- } /* }}} */ +- +- NodeType *new_op(const char *str, int type, int nbOp) { +- int i; /* {{{ */ +- NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); +- node->unode.opr.next = 0; +- node->unode.opr.type = type; +- node->unode.opr.nbOp = nbOp; +- for (i=0;iunode.opr.op[i] = 0; +- return node; +- } /* }}} */ +- +- +- void gsl_declare_global_variable(int type, char *name) { +- switch(type){ +- case -1: break; +- case FLOAT_TK:gsl_float_decl_global(name);break; +- case INT_TK: gsl_int_decl_global(name);break; +- case PTR_TK: gsl_ptr_decl_global(name);break; +- default: +- { +- int id = type - 1000; +- gsl_struct_decl_global_from_id(name,id); +- } +- } +- } +- +- +- +-/* Enabling traces. */ +-#ifndef YYDEBUG +-# define YYDEBUG 0 +-#endif +- +-/* Enabling verbose error messages. */ +-#ifdef YYERROR_VERBOSE +-# undef YYERROR_VERBOSE +-# define YYERROR_VERBOSE 1 +-#else +-# define YYERROR_VERBOSE 0 +-#endif +- +-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +-#line 1199 "goomsl_yacc.y" +-typedef union YYSTYPE { +- int intValue; +- float floatValue; +- char charValue; +- char strValue[2048]; +- NodeType *nPtr; +- GoomHash *namespace; +- GSL_Struct *gsl_struct; +- GSL_StructField *gsl_struct_field; +- } YYSTYPE; +-/* Line 191 of yacc.c. */ +-#line 1327 "goomsl_yacc.c" +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +- +- +-/* Copy the second part of user declarations. */ +- +- +-/* Line 214 of yacc.c. */ +-#line 1339 "goomsl_yacc.c" +- +-#if ! defined (yyoverflow) || YYERROR_VERBOSE +- +-/* The parser invokes alloca or malloc; define the necessary symbols. */ +- +-# if YYSTACK_USE_ALLOCA +-# define YYSTACK_ALLOC alloca +-# else +-# ifndef YYSTACK_USE_ALLOCA +-# if defined (alloca) || defined (_ALLOCA_H) +-# define YYSTACK_ALLOC alloca +-# else +-# ifdef __GNUC__ +-# define YYSTACK_ALLOC __builtin_alloca +-# endif +-# endif +-# endif +-# endif +- +-# ifdef YYSTACK_ALLOC +- /* Pacify GCC's `empty if-body' warning. */ +-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +-# else +-# if defined (__STDC__) || defined (__cplusplus) +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# endif +-# define YYSTACK_ALLOC malloc +-# define YYSTACK_FREE free +-# endif +-#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ +- +- +-#if (! defined (yyoverflow) \ +- && (! defined (__cplusplus) \ +- || (YYSTYPE_IS_TRIVIAL))) +- +-/* A type that is properly aligned for any stack member. */ +-union yyalloc +-{ +- short yyss; +- YYSTYPE yyvs; +- }; +- +-/* The size of the maximum gap between one aligned stack and the next. */ +-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +- +-/* The size of an array large to enough to hold all stacks, each with +- N elements. */ +-# define YYSTACK_BYTES(N) \ +- ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ +- + YYSTACK_GAP_MAXIMUM) +- +-/* Copy COUNT objects from FROM to TO. The source and destination do +- not overlap. */ +-# ifndef YYCOPY +-# if 1 < __GNUC__ +-# define YYCOPY(To, From, Count) \ +- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +-# else +-# define YYCOPY(To, From, Count) \ +- do \ +- { \ +- register YYSIZE_T yyi; \ +- for (yyi = 0; yyi < (Count); yyi++) \ +- (To)[yyi] = (From)[yyi]; \ +- } \ +- while (0) +-# endif +-# endif +- +-/* Relocate STACK from its old location to the new one. The +- local variables YYSIZE and YYSTACKSIZE give the old and new number of +- elements in the stack, and YYPTR gives the new location of the +- stack. Advance YYPTR to a properly aligned location for the next +- stack. */ +-# define YYSTACK_RELOCATE(Stack) \ +- do \ +- { \ +- YYSIZE_T yynewbytes; \ +- YYCOPY (&yyptr->Stack, Stack, yysize); \ +- Stack = &yyptr->Stack; \ +- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ +- yyptr += yynewbytes / sizeof (*yyptr); \ +- } \ +- while (0) +- +-#endif +- +-#if defined (__STDC__) || defined (__cplusplus) +- typedef signed char yysigned_char; +-#else +- typedef short yysigned_char; +-#endif +- +-/* YYFINAL -- State number of the termination state. */ +-#define YYFINAL 3 +-/* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 229 +- +-/* YYNTOKENS -- Number of terminals. */ +-#define YYNTOKENS 42 +-/* YYNNTS -- Number of nonterminals. */ +-#define YYNNTS 30 +-/* YYNRULES -- Number of rules. */ +-#define YYNRULES 89 +-/* YYNRULES -- Number of states. */ +-#define YYNSTATES 217 +- +-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +-#define YYUNDEFTOK 2 +-#define YYMAXUTOK 279 +- +-#define YYTRANSLATE(YYX) \ +- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) +- +-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +-static const unsigned char yytranslate[] = +-{ +- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 35, 36, 32, 29, 34, 30, 2, 31, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 33, 2, +- 27, 26, 28, 37, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 40, 2, 41, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 38, 2, 39, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, +- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, +- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 +-}; +- +-#if YYDEBUG +-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +- YYRHS. */ +-static const unsigned short yyprhs[] = +-{ +- 0, 0, 3, 7, 10, 19, 30, 39, 50, 53, +- 56, 57, 65, 68, 73, 76, 79, 82, 85, 87, +- 89, 90, 93, 96, 99, 102, 104, 108, 111, 112, +- 116, 122, 130, 131, 132, 137, 142, 147, 152, 154, +- 157, 160, 163, 166, 169, 172, 179, 186, 193, 195, +- 199, 203, 207, 211, 218, 222, 224, 227, 231, 232, +- 234, 236, 240, 244, 248, 252, 255, 259, 261, 265, +- 269, 273, 277, 281, 285, 288, 290, 292, 294, 298, +- 304, 310, 318, 323, 330, 333, 335, 340, 344, 346 +-}; +- +-/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +-static const yysigned_char yyrhs[] = +-{ +- 43, 0, -1, 44, 55, 52, -1, 44, 59, -1, +- 44, 11, 27, 48, 28, 50, 25, 56, -1, 44, +- 11, 27, 48, 33, 51, 28, 50, 25, 56, -1, +- 44, 10, 27, 49, 28, 50, 25, 56, -1, 44, +- 10, 27, 49, 33, 51, 28, 50, 25, 56, -1, +- 44, 45, -1, 44, 25, -1, -1, 22, 27, 5, +- 33, 46, 28, 25, -1, 71, 47, -1, 46, 34, +- 71, 47, -1, 8, 5, -1, 9, 5, -1, 7, +- 5, -1, 5, 5, -1, 5, -1, 5, -1, -1, +- 33, 8, -1, 33, 9, -1, 33, 7, -1, 33, +- 5, -1, 58, -1, 58, 34, 51, -1, 52, 53, +- -1, -1, 54, 44, 55, -1, 27, 49, 28, 50, +- 25, -1, 27, 49, 33, 51, 28, 50, 25, -1, +- -1, -1, 9, 5, 26, 64, -1, 8, 5, 26, +- 64, -1, 7, 5, 26, 64, -1, 5, 5, 26, +- 64, -1, 58, -1, 9, 5, -1, 8, 5, -1, +- 7, 5, -1, 5, 5, -1, 62, 25, -1, 57, +- 25, -1, 35, 65, 36, 37, 71, 59, -1, 12, +- 65, 71, 13, 71, 59, -1, 38, 25, 63, 44, +- 39, 25, -1, 67, -1, 5, 15, 64, -1, 5, +- 16, 64, -1, 5, 18, 64, -1, 5, 17, 64, +- -1, 23, 5, 24, 60, 13, 59, -1, 35, 61, +- 36, -1, 5, -1, 5, 61, -1, 5, 26, 64, +- -1, -1, 5, -1, 66, -1, 64, 32, 64, -1, +- 64, 31, 64, -1, 64, 29, 64, -1, 64, 30, +- 64, -1, 30, 64, -1, 35, 64, 36, -1, 68, +- -1, 64, 26, 64, -1, 64, 27, 64, -1, 64, +- 28, 64, -1, 64, 19, 64, -1, 64, 20, 64, +- -1, 64, 21, 64, -1, 14, 65, -1, 4, -1, +- 3, -1, 6, -1, 49, 25, 56, -1, 49, 33, +- 69, 25, 56, -1, 40, 49, 41, 25, 56, -1, +- 40, 49, 33, 69, 41, 25, 56, -1, 40, 49, +- 56, 41, -1, 40, 49, 33, 69, 41, 56, -1, +- 70, 69, -1, 70, -1, 5, 26, 56, 64, -1, +- 33, 56, 64, -1, 25, -1, -1 +-}; +- +-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +-static const unsigned short yyrline[] = +-{ +- 0, 1236, 1236, 1238, 1239, 1240, 1241, 1242, 1243, 1244, +- 1245, 1250, 1253, 1254, 1257, 1258, 1259, 1260, 1265, 1267, +- 1270, 1271, 1272, 1273, 1274, 1277, 1278, 1283, 1284, 1287, +- 1289, 1291, 1294, 1296, 1300, 1301, 1302, 1303, 1304, 1307, +- 1308, 1309, 1310, 1315, 1316, 1317, 1318, 1319, 1320, 1321, +- 1322, 1323, 1324, 1325, 1328, 1330, 1331, 1334, 1336, 1339, +- 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1350, 1351, +- 1352, 1353, 1354, 1355, 1356, 1359, 1360, 1361, 1366, 1367, +- 1368, 1369, 1373, 1374, 1377, 1378, 1380, 1384, 1393, 1393 +-}; +-#endif +- +-#if YYDEBUG || YYERROR_VERBOSE +-/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +-static const char *const yytname[] = +-{ +- "$end", "error", "$undefined", "LTYPE_INTEGER", "LTYPE_FLOAT", +- "LTYPE_VAR", "LTYPE_PTR", "PTR_TK", "INT_TK", "FLOAT_TK", "DECLARE", +- "EXTERNAL", "WHILE", "DO", "NOT", "PLUS_EQ", "SUB_EQ", "DIV_EQ", +- "MUL_EQ", "SUP_EQ", "LOW_EQ", "NOT_EQ", "STRUCT", "FOR", "IN", "'\\n'", +- "'='", "'<'", "'>'", "'+'", "'-'", "'/'", "'*'", "':'", "','", "'('", +- "')'", "'?'", "'{'", "'}'", "'['", "']'", "$accept", "gsl", "gsl_code", +- "struct_declaration", "struct_members", "struct_member", +- "ext_task_name", "task_name", "return_type", "arglist", +- "gsl_def_functions", "function", "function_intro", "function_outro", +- "leave_namespace", "declaration", "empty_declaration", "instruction", +- "var_list", "var_list_content", "affectation", "start_block", +- "expression", "test", "constValue", "func_call", "func_call_expression", +- "affectation_list", "affectation_in_list", "opt_nl", 0 +-}; +-#endif +- +-# ifdef YYPRINT +-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +- token YYLEX-NUM. */ +-static const unsigned short yytoknum[] = +-{ +- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, +- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, +- 275, 276, 277, 278, 279, 10, 61, 60, 62, 43, +- 45, 47, 42, 58, 44, 40, 41, 63, 123, 125, +- 91, 93 +-}; +-# endif +- +-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +-static const unsigned char yyr1[] = +-{ +- 0, 42, 43, 44, 44, 44, 44, 44, 44, 44, +- 44, 45, 46, 46, 47, 47, 47, 47, 48, 49, +- 50, 50, 50, 50, 50, 51, 51, 52, 52, 53, +- 54, 54, 55, 56, 57, 57, 57, 57, 57, 58, +- 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, +- 59, 59, 59, 59, 60, 61, 61, 62, 63, 64, +- 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, +- 65, 65, 65, 65, 65, 66, 66, 66, 67, 67, +- 67, 67, 68, 68, 69, 69, 70, 70, 71, 71 +-}; +- +-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +-static const unsigned char yyr2[] = +-{ +- 0, 2, 3, 2, 8, 10, 8, 10, 2, 2, +- 0, 7, 2, 4, 2, 2, 2, 2, 1, 1, +- 0, 2, 2, 2, 2, 1, 3, 2, 0, 3, +- 5, 7, 0, 0, 4, 4, 4, 4, 1, 2, +- 2, 2, 2, 2, 2, 6, 6, 6, 1, 3, +- 3, 3, 3, 6, 3, 1, 2, 3, 0, 1, +- 1, 3, 3, 3, 3, 2, 3, 1, 3, 3, +- 3, 3, 3, 3, 2, 1, 1, 1, 3, 5, +- 5, 7, 4, 6, 2, 1, 4, 3, 1, 0 +-}; +- +-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state +- STATE-NUM when YYTABLE doesn't specify something else to do. Zero +- means the default is an error. */ +-static const unsigned char yydefact[] = +-{ +- 10, 0, 32, 1, 19, 0, 0, 0, 0, 0, +- 0, 0, 0, 9, 0, 0, 0, 8, 0, 28, +- 0, 38, 3, 0, 48, 42, 0, 0, 0, 0, +- 0, 41, 40, 39, 0, 0, 76, 75, 59, 77, +- 0, 0, 0, 0, 0, 89, 60, 67, 0, 0, +- 0, 58, 19, 0, 33, 0, 2, 44, 43, 0, +- 49, 50, 52, 51, 57, 0, 0, 0, 0, 18, +- 0, 74, 65, 0, 33, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, +- 10, 0, 0, 78, 0, 33, 0, 85, 0, 27, +- 10, 37, 36, 35, 34, 20, 0, 20, 0, 66, +- 0, 0, 71, 72, 73, 68, 69, 70, 63, 64, +- 62, 61, 89, 89, 0, 0, 89, 0, 0, 33, +- 33, 0, 33, 84, 0, 32, 0, 0, 0, 0, +- 0, 0, 0, 25, 0, 0, 0, 82, 0, 0, +- 0, 55, 0, 0, 0, 0, 0, 80, 0, 87, +- 79, 20, 0, 29, 24, 23, 21, 22, 33, 42, +- 41, 40, 39, 20, 0, 33, 20, 33, 46, 0, +- 89, 0, 0, 0, 0, 12, 56, 54, 53, 45, +- 47, 33, 86, 0, 0, 6, 0, 26, 4, 0, +- 83, 11, 0, 17, 16, 14, 15, 81, 30, 20, +- 33, 33, 13, 0, 7, 5, 31 +-}; +- +-/* YYDEFGOTO[NTERM-NUM]. */ +-static const short yydefgoto[] = +-{ +- -1, 1, 2, 17, 149, 185, 70, 18, 137, 142, +- 56, 99, 100, 19, 93, 20, 21, 22, 125, 152, +- 23, 90, 44, 45, 46, 24, 47, 96, 97, 86 +-}; +- +-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +- STATE-NUM. */ +-#define YYPACT_NINF -116 +-static const short yypact[] = +-{ +- -116, 40, 136, -116, 103, 39, 66, 68, 61, 65, +- 1, 77, 101, -116, 1, 84, 109, -116, 12, -116, +- 91, -116, -116, 97, -116, 98, 72, 72, 72, 72, +- 72, 99, 104, 113, 109, 130, -116, -116, -116, -116, +- 1, 72, 72, 109, 166, 115, -116, -116, 145, 131, +- 118, -116, -116, -24, -116, -3, 138, -116, -116, 72, +- 159, 159, 159, 159, 159, 72, 72, 72, 14, -116, +- 51, -116, 22, 102, 124, 72, 72, 72, 72, 72, +- 72, 72, 72, 72, 72, -116, 160, 139, 140, 141, +- -116, -3, 152, -116, 154, -116, 156, -3, 109, -116, +- -116, 159, 159, 159, 159, 150, 82, 150, 82, -116, +- -3, 158, 159, 159, 159, 159, 159, 159, 22, 22, +- -116, -116, 115, 115, 195, 188, 115, 88, 162, -116, +- -116, 72, -116, -116, 52, 136, 155, 177, 199, 200, +- 201, 202, 180, 175, 185, 183, 171, -116, 144, 18, +- 161, 195, 178, 144, 144, 190, 191, -116, 72, 159, +- -116, 150, 82, -116, -116, -116, -116, -116, -116, -116, +- -116, -116, -116, 150, 82, -116, 150, -116, -116, 192, +- 115, 208, 213, 214, 215, -116, -116, -116, -116, -116, +- -116, -116, 159, 196, 194, -116, 198, -116, -116, 203, +- -116, -116, 161, -116, -116, -116, -116, -116, -116, 150, +- -116, -116, -116, 204, -116, -116, -116 +-}; +- +-/* YYPGOTO[NTERM-NUM]. */ +-static const yysigned_char yypgoto[] = +-{ +- -116, -116, -68, -116, -116, 23, -116, -15, -104, -92, +- -116, -116, -116, 89, -74, -116, -88, -115, -116, 75, +- -116, -116, -16, -6, -116, -116, -116, -62, -116, -99 +-}; +- +-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +- positive, shift that token. If negative, reduce the rule which +- number is the opposite. If zero, do what YYDEFACT says. +- If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -1 +-static const unsigned char yytable[] = +-{ +- 111, 53, 94, 144, 36, 37, 38, 39, 50, 91, +- 60, 61, 62, 63, 64, 40, 145, 92, 143, 68, +- 143, 131, 127, 148, 150, 72, 73, 154, 74, 128, +- 95, 41, 135, 178, 71, 133, 42, 54, 188, 189, +- 3, 43, 105, 101, 31, 55, 179, 106, 146, 102, +- 103, 104, 180, 83, 84, 157, 158, 193, 160, 112, +- 113, 114, 115, 116, 117, 118, 119, 120, 121, 196, +- 194, 32, 199, 33, 143, 36, 37, 38, 39, 107, +- 161, 202, 197, 134, 108, 162, 143, 138, 34, 139, +- 140, 141, 35, 4, 195, 5, 6, 7, 8, 9, +- 10, 198, 41, 200, 48, 213, 49, 42, 25, 51, +- 11, 12, 43, 13, 52, 159, 57, 207, 26, 27, +- 28, 29, 58, 14, 59, 65, 15, 155, 16, 30, +- 66, 81, 82, 83, 84, 69, 214, 215, 109, 67, +- 85, 4, 192, 5, 6, 7, 8, 9, 10, 4, +- 87, 5, 6, 7, 89, 88, 10, 110, 11, 12, +- 164, 13, 165, 166, 167, 98, 181, 12, 182, 183, +- 184, 14, 123, 122, 15, 124, 16, 129, 126, 14, +- 130, 132, 15, 136, 16, 75, 76, 77, 81, 82, +- 83, 84, 78, 79, 80, 81, 82, 83, 84, 147, +- 151, 153, 168, 156, 169, 170, 171, 172, 173, 174, +- 175, 176, 177, 203, 187, 190, 191, 201, 204, 205, +- 206, 208, 209, 210, 163, 212, 186, 0, 211, 216 +-}; +- +-static const short yycheck[] = +-{ +- 74, 16, 5, 107, 3, 4, 5, 6, 14, 33, +- 26, 27, 28, 29, 30, 14, 108, 41, 106, 34, +- 108, 95, 90, 122, 123, 41, 42, 126, 43, 91, +- 33, 30, 100, 148, 40, 97, 35, 25, 153, 154, +- 0, 40, 28, 59, 5, 33, 28, 33, 110, 65, +- 66, 67, 34, 31, 32, 129, 130, 161, 132, 75, +- 76, 77, 78, 79, 80, 81, 82, 83, 84, 173, +- 162, 5, 176, 5, 162, 3, 4, 5, 6, 28, +- 28, 180, 174, 98, 33, 33, 174, 5, 27, 7, +- 8, 9, 27, 5, 168, 7, 8, 9, 10, 11, +- 12, 175, 30, 177, 27, 209, 5, 35, 5, 25, +- 22, 23, 40, 25, 5, 131, 25, 191, 15, 16, +- 17, 18, 25, 35, 26, 26, 38, 39, 40, 26, +- 26, 29, 30, 31, 32, 5, 210, 211, 36, 26, +- 25, 5, 158, 7, 8, 9, 10, 11, 12, 5, +- 5, 7, 8, 9, 36, 24, 12, 33, 22, 23, +- 5, 25, 7, 8, 9, 27, 5, 23, 7, 8, +- 9, 35, 33, 13, 38, 35, 40, 25, 37, 35, +- 26, 25, 38, 33, 40, 19, 20, 21, 29, 30, +- 31, 32, 26, 27, 28, 29, 30, 31, 32, 41, +- 5, 13, 25, 41, 5, 5, 5, 5, 28, 34, +- 25, 28, 41, 5, 36, 25, 25, 25, 5, 5, +- 5, 25, 28, 25, 135, 202, 151, -1, 25, 25 +-}; +- +-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +- symbol of state STATE-NUM. */ +-static const unsigned char yystos[] = +-{ +- 0, 43, 44, 0, 5, 7, 8, 9, 10, 11, +- 12, 22, 23, 25, 35, 38, 40, 45, 49, 55, +- 57, 58, 59, 62, 67, 5, 15, 16, 17, 18, +- 26, 5, 5, 5, 27, 27, 3, 4, 5, 6, +- 14, 30, 35, 40, 64, 65, 66, 68, 27, 5, +- 65, 25, 5, 49, 25, 33, 52, 25, 25, 26, +- 64, 64, 64, 64, 64, 26, 26, 26, 49, 5, +- 48, 65, 64, 64, 49, 19, 20, 21, 26, 27, +- 28, 29, 30, 31, 32, 25, 71, 5, 24, 36, +- 63, 33, 41, 56, 5, 33, 69, 70, 27, 53, +- 54, 64, 64, 64, 64, 28, 33, 28, 33, 36, +- 33, 56, 64, 64, 64, 64, 64, 64, 64, 64, +- 64, 64, 13, 33, 35, 60, 37, 44, 69, 25, +- 26, 56, 25, 69, 49, 44, 33, 50, 5, 7, +- 8, 9, 51, 58, 50, 51, 69, 41, 71, 46, +- 71, 5, 61, 13, 71, 39, 41, 56, 56, 64, +- 56, 28, 33, 55, 5, 7, 8, 9, 25, 5, +- 5, 5, 5, 28, 34, 25, 28, 41, 59, 28, +- 34, 5, 7, 8, 9, 47, 61, 36, 59, 59, +- 25, 25, 64, 50, 51, 56, 50, 51, 56, 50, +- 56, 25, 71, 5, 5, 5, 5, 56, 25, 28, +- 25, 25, 47, 50, 56, 56, 25 +-}; +- +-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +-# define YYSIZE_T __SIZE_TYPE__ +-#endif +-#if ! defined (YYSIZE_T) && defined (size_t) +-# define YYSIZE_T size_t +-#endif +-#if ! defined (YYSIZE_T) +-# if defined (__STDC__) || defined (__cplusplus) +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# endif +-#endif +-#if ! defined (YYSIZE_T) +-# define YYSIZE_T unsigned int +-#endif +- +-#define yyerrok (yyerrstatus = 0) +-#define yyclearin (yychar = YYEMPTY) +-#define YYEMPTY (-2) +-#define YYEOF 0 +- +-#define YYACCEPT goto yyacceptlab +-#define YYABORT goto yyabortlab +-#define YYERROR goto yyerrlab1 +- +- +-/* Like YYERROR except do call yyerror. This remains here temporarily +- to ease the transition to the new meaning of YYERROR, for GCC. +- Once GCC version 2 has supplanted version 1, this can go. */ +- +-#define YYFAIL goto yyerrlab +- +-#define YYRECOVERING() (!!yyerrstatus) +- +-#define YYBACKUP(Token, Value) \ +-do \ +- if (yychar == YYEMPTY && yylen == 1) \ +- { \ +- yychar = (Token); \ +- yylval = (Value); \ +- yytoken = YYTRANSLATE (yychar); \ +- YYPOPSTACK; \ +- goto yybackup; \ +- } \ +- else \ +- { \ +- yyerror ("syntax error: cannot back up");\ +- YYERROR; \ +- } \ +-while (0) +- +-#define YYTERROR 1 +-#define YYERRCODE 256 +- +-/* YYLLOC_DEFAULT -- Compute the default location (before the actions +- are run). */ +- +-#ifndef YYLLOC_DEFAULT +-# define YYLLOC_DEFAULT(Current, Rhs, N) \ +- Current.first_line = Rhs[1].first_line; \ +- Current.first_column = Rhs[1].first_column; \ +- Current.last_line = Rhs[N].last_line; \ +- Current.last_column = Rhs[N].last_column; +-#endif +- +-/* YYLEX -- calling `yylex' with the right arguments. */ +- +-#ifdef YYLEX_PARAM +-# define YYLEX yylex (YYLEX_PARAM) +-#else +-# define YYLEX yylex () +-#endif +- +-/* Enable debugging if requested. */ +-#if YYDEBUG +- +-# ifndef YYFPRINTF +-# include /* INFRINGES ON USER NAME SPACE */ +-# define YYFPRINTF fprintf +-# endif +- +-# define YYDPRINTF(Args) \ +-do { \ +- if (yydebug) \ +- YYFPRINTF Args; \ +-} while (0) +- +-# define YYDSYMPRINT(Args) \ +-do { \ +- if (yydebug) \ +- yysymprint Args; \ +-} while (0) +- +-# define YYDSYMPRINTF(Title, Token, Value, Location) \ +-do { \ +- if (yydebug) \ +- { \ +- YYFPRINTF (stderr, "%s ", Title); \ +- yysymprint (stderr, \ +- Token, Value); \ +- YYFPRINTF (stderr, "\n"); \ +- } \ +-} while (0) +- +-/*------------------------------------------------------------------. +-| yy_stack_print -- Print the state stack from its BOTTOM up to its | +-| TOP (cinluded). | +-`------------------------------------------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yy_stack_print (short *bottom, short *top) +-#else +-static void +-yy_stack_print (bottom, top) +- short *bottom; +- short *top; +-#endif +-{ +- YYFPRINTF (stderr, "Stack now"); +- for (/* Nothing. */; bottom <= top; ++bottom) +- YYFPRINTF (stderr, " %d", *bottom); +- YYFPRINTF (stderr, "\n"); +-} +- +-# define YY_STACK_PRINT(Bottom, Top) \ +-do { \ +- if (yydebug) \ +- yy_stack_print ((Bottom), (Top)); \ +-} while (0) +- +- +-/*------------------------------------------------. +-| Report that the YYRULE is going to be reduced. | +-`------------------------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yy_reduce_print (int yyrule) +-#else +-static void +-yy_reduce_print (yyrule) +- int yyrule; +-#endif +-{ +- int yyi; +- unsigned int yylineno = yyrline[yyrule]; +- YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", +- yyrule - 1, yylineno); +- /* Print the symbols being reduced, and their result. */ +- for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) +- YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); +- YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +-} +- +-# define YY_REDUCE_PRINT(Rule) \ +-do { \ +- if (yydebug) \ +- yy_reduce_print (Rule); \ +-} while (0) +- +-/* Nonzero means print parse trace. It is left uninitialized so that +- multiple parsers can coexist. */ +-int yydebug; +-#else /* !YYDEBUG */ +-# define YYDPRINTF(Args) +-# define YYDSYMPRINT(Args) +-# define YYDSYMPRINTF(Title, Token, Value, Location) +-# define YY_STACK_PRINT(Bottom, Top) +-# define YY_REDUCE_PRINT(Rule) +-#endif /* !YYDEBUG */ +- +- +-/* YYINITDEPTH -- initial size of the parser's stacks. */ +-#ifndef YYINITDEPTH +-# define YYINITDEPTH 200 +-#endif +- +-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only +- if the built-in stack extension method is used). +- +- Do not make this value too large; the results are undefined if +- SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) +- evaluated with infinite-precision integer arithmetic. */ +- +-#if YYMAXDEPTH == 0 +-# undef YYMAXDEPTH +-#endif +- +-#ifndef YYMAXDEPTH +-# define YYMAXDEPTH 10000 +-#endif +- +- +- +-#if YYERROR_VERBOSE +- +-# ifndef yystrlen +-# if defined (__GLIBC__) && defined (_STRING_H) +-# define yystrlen strlen +-# else +-/* Return the length of YYSTR. */ +-static YYSIZE_T +-# if defined (__STDC__) || defined (__cplusplus) +-yystrlen (const char *yystr) +-# else +-yystrlen (yystr) +- const char *yystr; +-# endif +-{ +- register const char *yys = yystr; +- +- while (*yys++ != '\0') +- continue; +- +- return yys - yystr - 1; +-} +-# endif +-# endif +- +-# ifndef yystpcpy +-# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +-# define yystpcpy stpcpy +-# else +-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in +- YYDEST. */ +-static char * +-# if defined (__STDC__) || defined (__cplusplus) +-yystpcpy (char *yydest, const char *yysrc) +-# else +-yystpcpy (yydest, yysrc) +- char *yydest; +- const char *yysrc; +-# endif +-{ +- register char *yyd = yydest; +- register const char *yys = yysrc; +- +- while ((*yyd++ = *yys++) != '\0') +- continue; +- +- return yyd - 1; +-} +-# endif +-# endif +- +-#endif /* !YYERROR_VERBOSE */ +- +- +- +-#if YYDEBUG +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yysymprint (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- /* Pacify ``unused variable'' warnings. */ +- (void) yyvaluep; +- +- if (yytype < YYNTOKENS) +- { +- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +-# ifdef YYPRINT +- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +-# endif +- } +- else +- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); +- +- switch (yytype) +- { +- default: +- break; +- } +- YYFPRINTF (yyoutput, ")"); +-} +- +-#endif /* ! YYDEBUG */ +-/*-----------------------------------------------. +-| Release the memory associated to this symbol. | +-`-----------------------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yydestruct (int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yydestruct (yytype, yyvaluep) +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- /* Pacify ``unused variable'' warnings. */ +- (void) yyvaluep; +- +- switch (yytype) +- { +- +- default: +- break; +- } +-} +- +- +-/* Prevent warnings from -Wmissing-prototypes. */ +- +-#ifdef YYPARSE_PARAM +-# if defined (__STDC__) || defined (__cplusplus) +-int yyparse (void *YYPARSE_PARAM); +-# else +-int yyparse (); +-# endif +-#else /* ! YYPARSE_PARAM */ +-#if defined (__STDC__) || defined (__cplusplus) +-int yyparse (void); +-#else +-int yyparse (); +-#endif +-#endif /* ! YYPARSE_PARAM */ +- +- +- +-/* The lookahead symbol. */ +-int yychar; +- +-/* The semantic value of the lookahead symbol. */ +-YYSTYPE yylval; +- +-/* Number of syntax errors so far. */ +-int yynerrs; +- +- +- +-/*----------. +-| yyparse. | +-`----------*/ +- +-#ifdef YYPARSE_PARAM +-# if defined (__STDC__) || defined (__cplusplus) +-int yyparse (void *YYPARSE_PARAM) +-# else +-int yyparse (YYPARSE_PARAM) +- void *YYPARSE_PARAM; +-# endif +-#else /* ! YYPARSE_PARAM */ +-#if defined (__STDC__) || defined (__cplusplus) +-int +-yyparse (void) +-#else +-int +-yyparse () +- +-#endif +-#endif +-{ +- +- register int yystate; +- register int yyn; +- int yyresult; +- /* Number of tokens to shift before error messages enabled. */ +- int yyerrstatus; +- /* Lookahead token as an internal (translated) token number. */ +- int yytoken = 0; +- +- /* Three stacks and their tools: +- `yyss': related to states, +- `yyvs': related to semantic values, +- `yyls': related to locations. +- +- Refer to the stacks thru separate pointers, to allow yyoverflow +- to reallocate them elsewhere. */ +- +- /* The state stack. */ +- short yyssa[YYINITDEPTH]; +- short *yyss = yyssa; +- register short *yyssp; +- +- /* The semantic value stack. */ +- YYSTYPE yyvsa[YYINITDEPTH]; +- YYSTYPE *yyvs = yyvsa; +- register YYSTYPE *yyvsp; +- +- +- +-#define YYPOPSTACK (yyvsp--, yyssp--) +- +- YYSIZE_T yystacksize = YYINITDEPTH; +- +- /* The variables used to return semantic value and location from the +- action routines. */ +- YYSTYPE yyval; +- +- +- /* When reducing, the number of symbols on the RHS of the reduced +- rule. */ +- int yylen; +- +- YYDPRINTF ((stderr, "Starting parse\n")); +- +- yystate = 0; +- yyerrstatus = 0; +- yynerrs = 0; +- yychar = YYEMPTY; /* Cause a token to be read. */ +- +- /* Initialize stack pointers. +- Waste one element of value and location stack +- so that they stay on the same level as the state stack. +- The wasted elements are never initialized. */ +- +- yyssp = yyss; +- yyvsp = yyvs; +- +- goto yysetstate; +- +-/*------------------------------------------------------------. +-| yynewstate -- Push a new state, which is found in yystate. | +-`------------------------------------------------------------*/ +- yynewstate: +- /* In all cases, when you get here, the value and location stacks +- have just been pushed. so pushing a state here evens the stacks. +- */ +- yyssp++; +- +- yysetstate: +- *yyssp = yystate; +- +- if (yyss + yystacksize - 1 <= yyssp) +- { +- /* Get the current used size of the three stacks, in elements. */ +- YYSIZE_T yysize = yyssp - yyss + 1; +- +-#ifdef yyoverflow +- { +- /* Give user a chance to reallocate the stack. Use copies of +- these so that the &'s don't force the real ones into +- memory. */ +- YYSTYPE *yyvs1 = yyvs; +- short *yyss1 = yyss; +- +- +- /* Each stack pointer address is followed by the size of the +- data in use in that stack, in bytes. This used to be a +- conditional around just the two extra args, but that might +- be undefined if yyoverflow is a macro. */ +- yyoverflow ("parser stack overflow", +- &yyss1, yysize * sizeof (*yyssp), +- &yyvs1, yysize * sizeof (*yyvsp), +- +- &yystacksize); +- +- yyss = yyss1; +- yyvs = yyvs1; +- } +-#else /* no yyoverflow */ +-# ifndef YYSTACK_RELOCATE +- goto yyoverflowlab; +-# else +- /* Extend the stack our own way. */ +- if (YYMAXDEPTH <= yystacksize) +- goto yyoverflowlab; +- yystacksize *= 2; +- if (YYMAXDEPTH < yystacksize) +- yystacksize = YYMAXDEPTH; +- +- { +- short *yyss1 = yyss; +- union yyalloc *yyptr = +- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); +- if (! yyptr) +- goto yyoverflowlab; +- YYSTACK_RELOCATE (yyss); +- YYSTACK_RELOCATE (yyvs); +- +-# undef YYSTACK_RELOCATE +- if (yyss1 != yyssa) +- YYSTACK_FREE (yyss1); +- } +-# endif +-#endif /* no yyoverflow */ +- +- yyssp = yyss + yysize - 1; +- yyvsp = yyvs + yysize - 1; +- +- +- YYDPRINTF ((stderr, "Stack size increased to %lu\n", +- (unsigned long int) yystacksize)); +- +- if (yyss + yystacksize - 1 <= yyssp) +- YYABORT; +- } +- +- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +- +- goto yybackup; +- +-/*-----------. +-| yybackup. | +-`-----------*/ +-yybackup: +- +-/* Do appropriate processing given the current state. */ +-/* Read a lookahead token if we need one and don't already have one. */ +-/* yyresume: */ +- +- /* First try to decide what to do without reference to lookahead token. */ +- +- yyn = yypact[yystate]; +- if (yyn == YYPACT_NINF) +- goto yydefault; +- +- /* Not known => get a lookahead token if don't already have one. */ +- +- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ +- if (yychar == YYEMPTY) +- { +- YYDPRINTF ((stderr, "Reading a token: ")); +- yychar = YYLEX; +- } +- +- if (yychar <= YYEOF) +- { +- yychar = yytoken = YYEOF; +- YYDPRINTF ((stderr, "Now at end of input.\n")); +- } +- else +- { +- yytoken = YYTRANSLATE (yychar); +- YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); +- } +- +- /* If the proper action on seeing token YYTOKEN is to reduce or to +- detect an error, take that action. */ +- yyn += yytoken; +- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) +- goto yydefault; +- yyn = yytable[yyn]; +- if (yyn <= 0) +- { +- if (yyn == 0 || yyn == YYTABLE_NINF) +- goto yyerrlab; +- yyn = -yyn; +- goto yyreduce; +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- /* Shift the lookahead token. */ +- YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); +- +- /* Discard the token being shifted unless it is eof. */ +- if (yychar != YYEOF) +- yychar = YYEMPTY; +- +- *++yyvsp = yylval; +- +- +- /* Count tokens shifted since error; after three, turn off error +- status. */ +- if (yyerrstatus) +- yyerrstatus--; +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-----------------------------------------------------------. +-| yydefault -- do the default action for the current state. | +-`-----------------------------------------------------------*/ +-yydefault: +- yyn = yydefact[yystate]; +- if (yyn == 0) +- goto yyerrlab; +- goto yyreduce; +- +- +-/*-----------------------------. +-| yyreduce -- Do a reduction. | +-`-----------------------------*/ +-yyreduce: +- /* yyn is the number of a rule to reduce with. */ +- yylen = yyr2[yyn]; +- +- /* If YYLEN is nonzero, implement the default value of the action: +- `$$ = $1'. +- +- Otherwise, the following line sets YYVAL to garbage. +- This behavior is undocumented and Bison +- users should not rely upon it. Assigning to YYVAL +- unconditionally makes the parser a bit smaller, and it avoids a +- GCC warning that YYVAL may be used uninitialized. */ +- yyval = yyvsp[1-yylen]; +- +- +- YY_REDUCE_PRINT (yyn); +- switch (yyn) +- { +- case 3: +-#line 1238 "goomsl_yacc.y" +- { gsl_append(yyvsp[0].nPtr); } +- break; +- +- case 4: +-#line 1239 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); } +- break; +- +- case 5: +-#line 1240 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); } +- break; +- +- case 6: +-#line 1241 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); } +- break; +- +- case 7: +-#line 1242 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); } +- break; +- +- case 11: +-#line 1250 "goomsl_yacc.y" +- { gsl_add_struct(yyvsp[-4].strValue, yyvsp[-2].gsl_struct); } +- break; +- +- case 12: +-#line 1253 "goomsl_yacc.y" +- { yyval.gsl_struct = gsl_new_struct(yyvsp[0].gsl_struct_field); } +- break; +- +- case 13: +-#line 1254 "goomsl_yacc.y" +- { yyval.gsl_struct = yyvsp[-3].gsl_struct; gsl_add_struct_field(yyvsp[-3].gsl_struct, yyvsp[0].gsl_struct_field); } +- break; +- +- case 14: +-#line 1257 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_INT); } +- break; +- +- case 15: +-#line 1258 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_FLOAT); } +- break; +- +- case 16: +-#line 1259 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_PTR); } +- break; +- +- case 17: +-#line 1260 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field_struct(yyvsp[0].strValue, yyvsp[-1].strValue); } +- break; +- +- case 18: +-#line 1265 "goomsl_yacc.y" +- { gsl_declare_external_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); } +- break; +- +- case 19: +-#line 1267 "goomsl_yacc.y" +- { gsl_declare_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); } +- break; +- +- case 20: +-#line 1270 "goomsl_yacc.y" +- { yyval.intValue=-1; } +- break; +- +- case 21: +-#line 1271 "goomsl_yacc.y" +- { yyval.intValue=INT_TK; } +- break; +- +- case 22: +-#line 1272 "goomsl_yacc.y" +- { yyval.intValue=FLOAT_TK; } +- break; +- +- case 23: +-#line 1273 "goomsl_yacc.y" +- { yyval.intValue=PTR_TK; } +- break; +- +- case 24: +-#line 1274 "goomsl_yacc.y" +- { yyval.intValue= 1000 + gsl_get_struct_id(yyvsp[0].strValue); } +- break; +- +- case 29: +-#line 1287 "goomsl_yacc.y" +- { gsl_leavenamespace(); } +- break; +- +- case 30: +-#line 1289 "goomsl_yacc.y" +- { gsl_append(new_function_intro(yyvsp[-3].strValue)); +- gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-3].strValue); } +- break; +- +- case 31: +-#line 1291 "goomsl_yacc.y" +- { gsl_append(new_function_intro(yyvsp[-5].strValue)); +- gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-5].strValue); } +- break; +- +- case 32: +-#line 1294 "goomsl_yacc.y" +- { gsl_append(new_function_outro()); } +- break; +- +- case 33: +-#line 1296 "goomsl_yacc.y" +- { yyval.namespace = gsl_leavenamespace(); } +- break; +- +- case 34: +-#line 1300 "goomsl_yacc.y" +- { gsl_float_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 35: +-#line 1301 "goomsl_yacc.y" +- { gsl_int_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 36: +-#line 1302 "goomsl_yacc.y" +- { gsl_ptr_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 37: +-#line 1303 "goomsl_yacc.y" +- { gsl_struct_decl_local(yyvsp[-3].strValue,yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 38: +-#line 1304 "goomsl_yacc.y" +- { yyval.nPtr = 0; } +- break; +- +- case 39: +-#line 1307 "goomsl_yacc.y" +- { gsl_float_decl_local(yyvsp[0].strValue); } +- break; +- +- case 40: +-#line 1308 "goomsl_yacc.y" +- { gsl_int_decl_local(yyvsp[0].strValue); } +- break; +- +- case 41: +-#line 1309 "goomsl_yacc.y" +- { gsl_ptr_decl_local(yyvsp[0].strValue); } +- break; +- +- case 42: +-#line 1310 "goomsl_yacc.y" +- { gsl_struct_decl_local(yyvsp[-1].strValue,yyvsp[0].strValue); } +- break; +- +- case 43: +-#line 1315 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 44: +-#line 1316 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 45: +-#line 1317 "goomsl_yacc.y" +- { yyval.nPtr = new_if(yyvsp[-4].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 46: +-#line 1318 "goomsl_yacc.y" +- { yyval.nPtr = new_while(yyvsp[-4].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 47: +-#line 1319 "goomsl_yacc.y" +- { lastNode = yyvsp[-3].nPtr->unode.opr.op[1]; yyval.nPtr=yyvsp[-3].nPtr; } +- break; +- +- case 48: +-#line 1320 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[0].nPtr; } +- break; +- +- case 49: +-#line 1321 "goomsl_yacc.y" +- { yyval.nPtr = new_plus_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 50: +-#line 1322 "goomsl_yacc.y" +- { yyval.nPtr = new_sub_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 51: +-#line 1323 "goomsl_yacc.y" +- { yyval.nPtr = new_mul_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 52: +-#line 1324 "goomsl_yacc.y" +- { yyval.nPtr = new_div_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 53: +-#line 1325 "goomsl_yacc.y" +- { yyval.nPtr = new_static_foreach(new_var(yyvsp[-4].strValue, currentGoomSL->num_lines), yyvsp[-2].nPtr, yyvsp[0].nPtr); } +- break; +- +- case 54: +-#line 1328 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 55: +-#line 1330 "goomsl_yacc.y" +- { yyval.nPtr = new_var_list(new_var(yyvsp[0].strValue,currentGoomSL->num_lines), NULL); } +- break; +- +- case 56: +-#line 1331 "goomsl_yacc.y" +- { yyval.nPtr = new_var_list(new_var(yyvsp[-1].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 57: +-#line 1334 "goomsl_yacc.y" +- { yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 58: +-#line 1336 "goomsl_yacc.y" +- { yyval.nPtr = new_block(lastNode); lastNode = yyval.nPtr->unode.opr.op[0]; } +- break; +- +- case 59: +-#line 1339 "goomsl_yacc.y" +- { yyval.nPtr = new_var(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 60: +-#line 1340 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[0].nPtr; } +- break; +- +- case 61: +-#line 1341 "goomsl_yacc.y" +- { yyval.nPtr = new_mul(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 62: +-#line 1342 "goomsl_yacc.y" +- { yyval.nPtr = new_div(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 63: +-#line 1343 "goomsl_yacc.y" +- { yyval.nPtr = new_add(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 64: +-#line 1344 "goomsl_yacc.y" +- { yyval.nPtr = new_sub(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 65: +-#line 1345 "goomsl_yacc.y" +- { yyval.nPtr = new_neg(yyvsp[0].nPtr); } +- break; +- +- case 66: +-#line 1346 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 67: +-#line 1347 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[0].nPtr; } +- break; +- +- case 68: +-#line 1350 "goomsl_yacc.y" +- { yyval.nPtr = new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 69: +-#line 1351 "goomsl_yacc.y" +- { yyval.nPtr = new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 70: +-#line 1352 "goomsl_yacc.y" +- { yyval.nPtr = new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr); } +- break; +- +- case 71: +-#line 1353 "goomsl_yacc.y" +- { yyval.nPtr = new_not(new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr)); } +- break; +- +- case 72: +-#line 1354 "goomsl_yacc.y" +- { yyval.nPtr = new_not(new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr)); } +- break; +- +- case 73: +-#line 1355 "goomsl_yacc.y" +- { yyval.nPtr = new_not(new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr)); } +- break; +- +- case 74: +-#line 1356 "goomsl_yacc.y" +- { yyval.nPtr = new_not(yyvsp[0].nPtr); } +- break; +- +- case 75: +-#line 1359 "goomsl_yacc.y" +- { yyval.nPtr = new_constFloat(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 76: +-#line 1360 "goomsl_yacc.y" +- { yyval.nPtr = new_constInt(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 77: +-#line 1361 "goomsl_yacc.y" +- { yyval.nPtr = new_constPtr(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 78: +-#line 1366 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-2].strValue,NULL); } +- break; +- +- case 79: +-#line 1367 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-4].strValue,yyvsp[-2].nPtr); } +- break; +- +- case 80: +-#line 1368 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-3].strValue,NULL); } +- break; +- +- case 81: +-#line 1369 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-5].strValue,yyvsp[-3].nPtr); } +- break; +- +- case 82: +-#line 1373 "goomsl_yacc.y" +- { yyval.nPtr = new_call_expr(yyvsp[-2].strValue,NULL); } +- break; +- +- case 83: +-#line 1374 "goomsl_yacc.y" +- { yyval.nPtr = new_call_expr(yyvsp[-4].strValue,yyvsp[-2].nPtr); } +- break; +- +- case 84: +-#line 1377 "goomsl_yacc.y" +- { yyval.nPtr = new_affec_list(yyvsp[-1].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 85: +-#line 1378 "goomsl_yacc.y" +- { yyval.nPtr = new_affec_list(yyvsp[0].nPtr,NULL); } +- break; +- +- case 86: +-#line 1380 "goomsl_yacc.y" +- { +- gsl_reenternamespace(yyvsp[-1].namespace); +- yyval.nPtr = new_set(new_var(yyvsp[-3].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); +- } +- break; +- +- case 87: +-#line 1384 "goomsl_yacc.y" +- { +- gsl_reenternamespace(yyvsp[-1].namespace); +- yyval.nPtr = new_set(new_var("&this", currentGoomSL->num_lines),yyvsp[0].nPtr); +- } +- break; +- +- +- } +- +-/* Line 999 of yacc.c. */ +-#line 2792 "goomsl_yacc.c" +- +- yyvsp -= yylen; +- yyssp -= yylen; +- +- +- YY_STACK_PRINT (yyss, yyssp); +- +- *++yyvsp = yyval; +- +- +- /* Now `shift' the result of the reduction. Determine what state +- that goes to, based on the state we popped back to and the rule +- number reduced by. */ +- +- yyn = yyr1[yyn]; +- +- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; +- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) +- yystate = yytable[yystate]; +- else +- yystate = yydefgoto[yyn - YYNTOKENS]; +- +- goto yynewstate; +- +- +-/*------------------------------------. +-| yyerrlab -- here on detecting error | +-`------------------------------------*/ +-yyerrlab: +- /* If not already recovering from an error, report this error. */ +- if (!yyerrstatus) +- { +- ++yynerrs; +-#if YYERROR_VERBOSE +- yyn = yypact[yystate]; +- +- if (YYPACT_NINF < yyn && yyn < YYLAST) +- { +- YYSIZE_T yysize = 0; +- int yytype = YYTRANSLATE (yychar); +- char *yymsg; +- int yyx, yycount; +- +- yycount = 0; +- /* Start YYX at -YYN if negative to avoid negative indexes in +- YYCHECK. */ +- for (yyx = yyn < 0 ? -yyn : 0; +- yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- yysize += yystrlen (yytname[yyx]) + 15, yycount++; +- yysize += yystrlen ("syntax error, unexpected ") + 1; +- yysize += yystrlen (yytname[yytype]); +- yymsg = (char *) YYSTACK_ALLOC (yysize); +- if (yymsg != 0) +- { +- char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); +- yyp = yystpcpy (yyp, yytname[yytype]); +- +- if (yycount < 5) +- { +- yycount = 0; +- for (yyx = yyn < 0 ? -yyn : 0; +- yyx < (int) (sizeof (yytname) / sizeof (char *)); +- yyx++) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- { +- const char *yyq = ! yycount ? ", expecting " : " or "; +- yyp = yystpcpy (yyp, yyq); +- yyp = yystpcpy (yyp, yytname[yyx]); +- yycount++; +- } +- } +- yyerror (yymsg); +- YYSTACK_FREE (yymsg); +- } +- else +- yyerror ("syntax error; also virtual memory exhausted"); +- } +- else +-#endif /* YYERROR_VERBOSE */ +- yyerror ("syntax error"); +- } +- +- +- +- if (yyerrstatus == 3) +- { +- /* If just tried and failed to reuse lookahead token after an +- error, discard it. */ +- +- /* Return failure if at end of input. */ +- if (yychar == YYEOF) +- { +- /* Pop the error token. */ +- YYPOPSTACK; +- /* Pop the rest of the stack. */ +- while (yyss < yyssp) +- { +- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); +- yydestruct (yystos[*yyssp], yyvsp); +- YYPOPSTACK; +- } +- YYABORT; +- } +- +- YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); +- yydestruct (yytoken, &yylval); +- yychar = YYEMPTY; +- +- } +- +- /* Else will try to reuse lookahead token after shifting the error +- token. */ +- goto yyerrlab1; +- +- +-/*----------------------------------------------------. +-| yyerrlab1 -- error raised explicitly by an action. | +-`----------------------------------------------------*/ +-yyerrlab1: +- yyerrstatus = 3; /* Each real token shifted decrements this. */ +- +- for (;;) +- { +- yyn = yypact[yystate]; +- if (yyn != YYPACT_NINF) +- { +- yyn += YYTERROR; +- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) +- { +- yyn = yytable[yyn]; +- if (0 < yyn) +- break; +- } +- } +- +- /* Pop the current state because it cannot handle the error token. */ +- if (yyssp == yyss) +- YYABORT; +- +- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); +- yydestruct (yystos[yystate], yyvsp); +- yyvsp--; +- yystate = *--yyssp; +- +- YY_STACK_PRINT (yyss, yyssp); +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- YYDPRINTF ((stderr, "Shifting error token, ")); +- +- *++yyvsp = yylval; +- +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-------------------------------------. +-| yyacceptlab -- YYACCEPT comes here. | +-`-------------------------------------*/ +-yyacceptlab: +- yyresult = 0; +- goto yyreturn; +- +-/*-----------------------------------. +-| yyabortlab -- YYABORT comes here. | +-`-----------------------------------*/ +-yyabortlab: +- yyresult = 1; +- goto yyreturn; +- +-#ifndef yyoverflow +-/*----------------------------------------------. +-| yyoverflowlab -- parser overflow comes here. | +-`----------------------------------------------*/ +-yyoverflowlab: +- yyerror ("parser stack overflow"); +- yyresult = 2; +- /* Fall through. */ +-#endif +- +-yyreturn: +-#ifndef yyoverflow +- if (yyss != yyssa) +- YYSTACK_FREE (yyss); +-#endif +- return yyresult; +-} +- +- +-#line 1396 "goomsl_yacc.y" +- +- +- +-void yyerror(char *str) +-{ /* {{{ */ +- fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); +- currentGoomSL->compilationOK = 0; +- exit(1); +-} /* }}} */ +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.h /src/goomsl_yacc.h +--- /home/d4rk/goom2k4-0/src/goomsl_yacc.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_yacc.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,104 +0,0 @@ +-/* A Bison parser, made by GNU Bison 1.875. */ +- +-/* Skeleton parser for Yacc-like parsing with Bison, +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. +- +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 59 Temple Place - Suite 330, +- Boston, MA 02111-1307, USA. */ +- +-/* As a special exception, when this file is copied by Bison into a +- Bison output file, you may use that output file without restriction. +- This special exception was added by the Free Software Foundation +- in version 1.24 of Bison. */ +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- LTYPE_INTEGER = 258, +- LTYPE_FLOAT = 259, +- LTYPE_VAR = 260, +- LTYPE_PTR = 261, +- PTR_TK = 262, +- INT_TK = 263, +- FLOAT_TK = 264, +- DECLARE = 265, +- EXTERNAL = 266, +- WHILE = 267, +- DO = 268, +- NOT = 269, +- PLUS_EQ = 270, +- SUB_EQ = 271, +- DIV_EQ = 272, +- MUL_EQ = 273, +- SUP_EQ = 274, +- LOW_EQ = 275, +- NOT_EQ = 276, +- STRUCT = 277, +- FOR = 278, +- IN = 279 +- }; +-#endif +-#define LTYPE_INTEGER 258 +-#define LTYPE_FLOAT 259 +-#define LTYPE_VAR 260 +-#define LTYPE_PTR 261 +-#define PTR_TK 262 +-#define INT_TK 263 +-#define FLOAT_TK 264 +-#define DECLARE 265 +-#define EXTERNAL 266 +-#define WHILE 267 +-#define DO 268 +-#define NOT 269 +-#define PLUS_EQ 270 +-#define SUB_EQ 271 +-#define DIV_EQ 272 +-#define MUL_EQ 273 +-#define SUP_EQ 274 +-#define LOW_EQ 275 +-#define NOT_EQ 276 +-#define STRUCT 277 +-#define FOR 278 +-#define IN 279 +- +- +- +- +-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +-#line 1199 "goomsl_yacc.y" +-typedef union YYSTYPE { +- int intValue; +- float floatValue; +- char charValue; +- char strValue[2048]; +- NodeType *nPtr; +- GoomHash *namespace; +- GSL_Struct *gsl_struct; +- GSL_StructField *gsl_struct_field; +- } YYSTYPE; +-/* Line 1240 of yacc.c. */ +-#line 95 "goomsl_yacc.h" +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +-extern YYSTYPE yylval; +- +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.y /src/goomsl_yacc.y +--- /home/d4rk/goom2k4-0/src/goomsl_yacc.y 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_yacc.y 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1405 +0,0 @@ +-/** +- * copyright 2004, Jean-Christophe Hoelt +- * +- * This program is released under the terms of the GNU Lesser General Public Licence. +- */ +-%{ +- #include +- #include +- #include +- #include "goomsl.h" +- #include "goomsl_private.h" +- +-#define STRUCT_ALIGNMENT 16 +-/* #define VERBOSE */ +- +- int yylex(void); +- void yyerror(char *); +- extern GoomSL *currentGoomSL; +- +- static NodeType *nodeNew(const char *str, int type, int line_number); +- static NodeType *nodeClone(NodeType *node); +- static void nodeFreeInternals(NodeType *node); +- static void nodeFree(NodeType *node); +- +- static void commit_node(NodeType *node, int releaseIfTemp); +- static void precommit_node(NodeType *node); +- +- static NodeType *new_constInt(const char *str, int line_number); +- static NodeType *new_constFloat(const char *str, int line_number); +- static NodeType *new_constPtr(const char *str, int line_number); +- static NodeType *new_var(const char *str, int line_number); +- static NodeType *new_nop(const char *str); +- static NodeType *new_op(const char *str, int type, int nbOp); +- +- static int allocateLabel(); +- static int allocateTemp(); +- static void releaseTemp(int n); +- static void releaseAllTemps(); +- +- static int is_tmp_expr(NodeType *node) { +- if (node->str) { +- return (!strncmp(node->str,"_i_tmp_",7)) +- || (!strncmp(node->str,"_f_tmp_",7)) +- || (!strncmp(node->str,"_p_tmp",7)); +- } +- return 0; +- } +- /* pre: is_tmp_expr(node); */ +- static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } +- +- static int is_commutative_expr(int itype) +- { /* {{{ */ +- return (itype == INSTR_ADD) +- || (itype == INSTR_MUL) +- || (itype == INSTR_ISEQUAL); +- } /* }}} */ +- +- static void GSL_PUT_LABEL(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("label %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JUMP(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("jump %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- +- static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("%s %s\n", iname, name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JZERO(char *name,int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); +- } /* }}} */ +- static void GSL_PUT_JNZERO(char *name, int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); +- } /* }}} */ +- +- /* Structures Management */ +- +-#define ALIGN_ADDR(_addr,_align) {\ +- if (_align>1) {\ +- int _dec = (_addr%_align);\ +- if (_dec != 0) _addr += _align - _dec;\ +- }} +- +- /* */ +- void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) +- { +- int i; +- int consumed = 0; +- int iblk=0, fblk=0; +- +- s->iBlock[0].size = 0; +- s->iBlock[0].data = 0; +- s->fBlock[0].size = 0; +- s->fBlock[0].data = 0; +- +- /* Prepare sub-struct and calculate space needed for their storage */ +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type < FIRST_RESERVED) +- { +- int j=0; +- GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; +- consumed += sizeof(int); /* stocke le prefix */ +- ALIGN_ADDR(consumed, s_align); +- s->fields[i]->offsetInStruct = consumed; +- gsl_prepare_struct(substruct, s_align, i_align, f_align); +- for(j=0;substruct->iBlock[j].size>0;++j) { +- s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; +- s->iBlock[iblk].size = substruct->iBlock[j].size; +- iblk++; +- } +- for(j=0;substruct->fBlock[j].size>0;++j) { +- s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; +- s->fBlock[fblk].size = substruct->fBlock[j].size; +- fblk++; +- } +- consumed += substruct->size; +- } +- } +- +- /* Then prepare integers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_INT) +- { +- if (s->iBlock[iblk].size == 0) { +- s->iBlock[iblk].size = 1; +- s->iBlock[iblk].data = consumed; +- } else { +- s->iBlock[iblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- iblk++; +- s->iBlock[iblk].size = 0; +- s->iBlock[iblk].data = 0; +- +- /* Then prepare floats */ +- ALIGN_ADDR(consumed, f_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_FLOAT) +- { +- if (s->fBlock[fblk].size == 0) { +- s->fBlock[fblk].size = 1; +- s->fBlock[fblk].data = consumed; +- } else { +- s->fBlock[fblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- fblk++; +- s->fBlock[fblk].size = 0; +- s->fBlock[fblk].data = 0; +- +- /* Finally prepare pointers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_PTR) +- { +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- s->size = consumed; +- } +- +- /* Returns the ID of a struct from its name */ +- int gsl_get_struct_id(const char *name) /* {{{ */ +- { +- HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); +- if (ret != NULL) return ret->i; +- return -1; +- } /* }}} */ +- +- /* Adds the definition of a struct */ +- void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ +- { +- /* Prepare the struct: ie calculate internal storage format */ +- gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); +- +- /* If the struct does not already exists */ +- if (gsl_get_struct_id(name) < 0) +- { +- /* adds it */ +- int id = currentGoomSL->nbStructID++; +- goom_hash_put_int(currentGoomSL->structIDS, name, id); +- if (currentGoomSL->gsl_struct_size <= id) { +- currentGoomSL->gsl_struct_size *= 2; +- currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, +- sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); +- } +- currentGoomSL->gsl_struct[id] = gsl_struct; +- } +- } /* }}} */ +- +- /* Creates a field for a struct */ +- GSL_StructField *gsl_new_struct_field(const char *name, int type) +- { +- GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); +- strcpy(field->name, name); +- field->type = type; +- return field; +- } +- +- /* Create as field for a struct which will be a struct itself */ +- GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) +- { +- GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); +- if (field->type < 0) { +- fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", +- currentGoomSL->num_lines, type); +- exit(1); +- } +- return field; +- } +- +- /* Creates a Struct */ +- GSL_Struct *gsl_new_struct(GSL_StructField *field) +- { +- GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); +- s->nbFields = 1; +- s->fields[0] = field; +- return s; +- } +- +- /* Adds a field to a struct */ +- void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) +- { +- s->fields[s->nbFields++] = field; +- } +- +- int gsl_type_of_var(GoomHash *ns, const char *name) +- { +- char type_of[256]; +- HashValue *hv; +- sprintf(type_of, "__type_of_%s", name); +- hv = goom_hash_get(ns, type_of); +- if (hv != NULL) +- return hv->i; +- fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); +- return -1; +- } +- +- static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) +- { +- char type_of[256]; +- if (name[0] == '@') { ns = currentGoomSL->vars; } +- +- if (space == NULL) { +- switch (type) { +- case INSTR_INT: +- case INSTR_FLOAT: +- case INSTR_PTR: +- space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, +- sizeof(int), sizeof(int)); +- break; +- case -1: +- fprintf(stderr, "What the fuck!\n"); +- exit(1); +- default: /* On a un struct_id */ +- space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, +- currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); +- } +- } +- goom_hash_put_ptr(ns, name, (void*)space); +- sprintf(type_of, "__type_of_%s", name); +- goom_hash_put_int(ns, type_of, type); +- +- /* Ensuite le hack: on ajoute les champs en tant que variables. */ +- if (type < FIRST_RESERVED) +- { +- int i; +- GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; +- ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ +- for (i = 0; i < gsl_struct->nbFields; ++i) +- { +- char full_name[256]; +- char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; +- sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); +- gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); +- } +- } +- } +- +- /* Declare a variable which will be a struct */ +- static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) +- { +- int struct_id = gsl_get_struct_id(struct_name); +- gsl_declare_var(namespace, name, struct_id, NULL); +- } +- +- static void gsl_float_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); +- } +- static void gsl_int_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); +- } +- static void gsl_ptr_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); +- } +- static void gsl_struct_decl_global_from_id(const char *name, int id) +- { +- gsl_declare_var(currentGoomSL->vars, name, id, NULL); +- } +- +- /* FLOAT */ +- static void gsl_float_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); +- } +- /* INT */ +- static void gsl_int_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); +- } +- /* PTR */ +- static void gsl_ptr_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); +- } +- /* STRUCT */ +- static void gsl_struct_decl_local(const char *struct_name, const char *name) +- { +- gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); +- } +- +- +- static void commit_test2(NodeType *set,const char *type, int instr); +- static NodeType *new_call(const char *name, NodeType *affect_list); +- +- /* SETTER */ +- static NodeType *new_set(NodeType *lvalue, NodeType *expression) +- { /* {{{ */ +- NodeType *set = new_op("set", OPR_SET, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } /* }}} */ +- static void commit_set(NodeType *set) +- { /* {{{ */ +- commit_test2(set,"set",INSTR_SET); +- } /* }}} */ +- +- /* PLUS_EQ */ +- static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_plus_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* SUB_EQ */ +- static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_sub_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* MUL_EQ */ +- static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_mul_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* DIV_EQ */ +- static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_div_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* commodity method for add, mult, ... */ +- +- static void precommit_expr(NodeType *expr, const char *type, int instr_id) +- { /* {{{ */ +- NodeType *tmp, *tmpcpy; +- int toAdd; +- +- /* compute "left" and "right" */ +- switch (expr->unode.opr.nbOp) { +- case 2: +- precommit_node(expr->unode.opr.op[1]); +- case 1: +- precommit_node(expr->unode.opr.op[0]); +- } +- +- if (is_tmp_expr(expr->unode.opr.op[0])) { +- tmp = expr->unode.opr.op[0]; +- toAdd = 1; +- } +- else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { +- tmp = expr->unode.opr.op[1]; +- toAdd = 0; +- } +- else { +- char stmp[256]; +- /* declare a temporary variable to store the result */ +- if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else { +- int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- } +- tmp = new_var(stmp,expr->line_number); +- +- /* set the tmp to the value of "op1" */ +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,expr->unode.opr.op[0]),0); +- toAdd = 1; +- +- tmp = tmpcpy; +- } +- +- /* add op2 to tmp */ +-#ifdef VERBOSE +- if (expr->unode.opr.nbOp == 2) +- printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); +- else +- printf("%s %s\n", type, tmp->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(tmp,0); +- if (expr->unode.opr.nbOp == 2) { +- commit_node(expr->unode.opr.op[toAdd],1); +- } +- +- /* redefine the ADD node now as the computed variable */ +- nodeFreeInternals(expr); +- *expr = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static NodeType *new_expr1(const char *name, int id, NodeType *expr1) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 1); +- add->unode.opr.op[0] = expr1; +- return add; +- } /* }}} */ +- +- static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 2); +- add->unode.opr.op[0] = expr1; +- add->unode.opr.op[1] = expr2; +- return add; +- } /* }}} */ +- +- /* ADD */ +- static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("add", OPR_ADD, expr1, expr2); +- } +- static void precommit_add(NodeType *add) { +- precommit_expr(add,"add",INSTR_ADD); +- } /* }}} */ +- +- /* SUB */ +- static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("sub", OPR_SUB, expr1, expr2); +- } +- static void precommit_sub(NodeType *sub) { +- precommit_expr(sub,"sub",INSTR_SUB); +- } /* }}} */ +- +- /* NEG */ +- static NodeType *new_neg(NodeType *expr) { /* {{{ */ +- NodeType *zeroConst = NULL; +- if (expr->type == CONST_INT_NODE) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (expr->type == CONST_FLOAT_NODE) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (expr->type == CONST_PTR_NODE) { +- fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else { +- int type = gsl_type_of_var(expr->vnamespace, expr->str); +- if (type == INSTR_FLOAT) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (type == INSTR_PTR) { +- fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else if (type == INSTR_INT) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", +- expr->line_number, expr->str); +- exit(1); +- } +- } +- return new_expr2("sub", OPR_SUB, zeroConst, expr); +- } +- /* }}} */ +- +- /* MUL */ +- static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("mul", OPR_MUL, expr1, expr2); +- } +- static void precommit_mul(NodeType *mul) { +- precommit_expr(mul,"mul",INSTR_MUL); +- } /* }}} */ +- +- /* DIV */ +- static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("div", OPR_DIV, expr1, expr2); +- } +- static void precommit_div(NodeType *mul) { +- precommit_expr(mul,"div",INSTR_DIV); +- } /* }}} */ +- +- /* CALL EXPRESSION */ +- static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ +- NodeType *call = new_call(name,affect_list); +- NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); +- node->vnamespace = gsl_find_namespace(name); +- if (node->vnamespace == NULL) +- fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); +- return node; +- } +- static void precommit_call_expr(NodeType *call) { +- char stmp[256]; +- NodeType *tmp,*tmpcpy; +- int type = gsl_type_of_var(call->vnamespace, call->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- call->line_number, call->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- tmp = new_var(stmp,call->line_number); +- commit_node(call->unode.opr.op[0],0); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); +- +- nodeFreeInternals(call); +- *call = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static void commit_test2(NodeType *set,const char *type, int instr) +- { /* {{{ */ +- NodeType *tmp; +- char stmp[256]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- tmp = set->unode.opr.op[0]; +- +- stmp[0] = 0; +- if (set->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- if (stmp[0]) { +- NodeType *tmpcpy; +- tmp = new_var(stmp, set->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,set->unode.opr.op[0]),0); +- tmp = tmpcpy; +- } +- +-#ifdef VERBOSE +- printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); +- commit_node(tmp,instr!=INSTR_SET); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* NOT */ +- static NodeType *new_not(NodeType *expr1) { /* {{{ */ +- return new_expr1("not", OPR_NOT, expr1); +- } +- static void commit_not(NodeType *set) +- { +- commit_node(set->unode.opr.op[0],0); +-#ifdef VERBOSE +- printf("not\n"); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- } /* }}} */ +- +- /* EQU */ +- static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("isequal", OPR_EQU, expr1, expr2); +- } +- static void commit_equ(NodeType *mul) { +- commit_test2(mul,"isequal",INSTR_ISEQUAL); +- } /* }}} */ +- +- /* INF */ +- static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("islower", OPR_LOW, expr1, expr2); +- } +- static void commit_low(NodeType *mul) { +- commit_test2(mul,"islower",INSTR_ISLOWER); +- } /* }}} */ +- +- /* WHILE */ +- static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("while", OPR_WHILE, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- +- static void commit_while(NodeType *node) +- { +- int lbl = allocateLabel(); +- char start_while[1024], test_while[1024]; +- sprintf(start_while, "|start_while_%d|", lbl); +- sprintf(test_while, "|test_while_%d|", lbl); +- +- GSL_PUT_JUMP(test_while,node->line_number); +- GSL_PUT_LABEL(start_while,node->line_number); +- +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- +- GSL_PUT_LABEL(test_while,node->line_number); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JNZERO(start_while,node->line_number); +- } /* }}} */ +- +- /* FOR EACH */ +- static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("for", OPR_FOREACH, 3); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = var_list; +- node->unode.opr.op[2] = instr; +- node->line_number = currentGoomSL->num_lines; +- return node; +- } +- static void commit_foreach(NodeType *node) +- { +- NodeType *cur = node->unode.opr.op[1]; +- char tmp_func[256], tmp_loop[256]; +- int lbl = allocateLabel(); +- sprintf(tmp_func, "|foreach_func_%d|", lbl); +- sprintf(tmp_loop, "|foreach_loop_%d|", lbl); +- +- GSL_PUT_JUMP(tmp_loop, node->line_number); +- GSL_PUT_LABEL(tmp_func, node->line_number); +- +- precommit_node(node->unode.opr.op[2]); +- commit_node(node->unode.opr.op[2], 0); +- +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- +- GSL_PUT_LABEL(tmp_loop, node->line_number); +- +- while (cur != NULL) +- { +- NodeType *x, *var; +- +- /* 1: x=var */ +- x = nodeClone(node->unode.opr.op[0]); +- var = nodeClone(cur->unode.opr.op[0]); +- commit_node(new_set(x, var),0); +- +- /* 2: instr */ +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", tmp_func); +-#endif +- +- /* 3: var=x */ +- x = nodeClone(node->unode.opr.op[0]); +- var = cur->unode.opr.op[0]; +- commit_node(new_set(var, x),0); +- cur = cur->unode.opr.op[1]; +- } +- nodeFree(node->unode.opr.op[0]); +- } /* }}} */ +- +- /* IF */ +- static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("if", OPR_IF, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- static void commit_if(NodeType *node) { +- +- char slab[1024]; +- sprintf(slab, "|eif%d|", allocateLabel()); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JZERO(slab,node->line_number); +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- GSL_PUT_LABEL(slab,node->line_number); +- } /* }}} */ +- +- /* BLOCK */ +- static NodeType *new_block(NodeType *lastNode) { /* {{{ */ +- NodeType *blk = new_op("block", OPR_BLOCK, 2); +- blk->unode.opr.op[0] = new_nop("start_of_block"); +- blk->unode.opr.op[1] = lastNode; +- return blk; +- } +- static void commit_block(NodeType *node) { +- commit_node(node->unode.opr.op[0]->unode.opr.next,0); +- } /* }}} */ +- +- /* FUNCTION INTRO */ +- static NodeType *new_function_intro(const char *name) { /* {{{ */ +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- return new_op(stmp, OPR_FUNC_INTRO, 0); +- } +- static void commit_function_intro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("label %s\n", node->str); +-#endif +- } /* }}} */ +- +- /* FUNCTION OUTRO */ +- static NodeType *new_function_outro() { /* {{{ */ +- return new_op("ret", OPR_FUNC_OUTRO, 0); +- } +- static void commit_function_outro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- releaseAllTemps(); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- } /* }}} */ +- +- /* AFFECTATION LIST */ +- static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); +- node->unode.opr.op[0] = set; +- node->unode.opr.op[1] = next; +- return node; +- } +- static NodeType *new_affect_list_after(NodeType *affect_list) +- { +- NodeType *ret = NULL; +- NodeType *cur = affect_list; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- NodeType *next = cur->unode.opr.op[1]; +- NodeType *lvalue = set->unode.opr.op[0]; +- NodeType *expression = set->unode.opr.op[1]; +- if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { +- NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); +- ret = new_affec_list(nset, ret); +- } +- cur = next; +- } +- return ret; +- } +- static void commit_affect_list(NodeType *node) +- { +- NodeType *cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- cur = cur->unode.opr.op[1]; +- } +- cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- commit_node(set,0); +- cur = cur->unode.opr.op[1]; +- } +- } /* }}} */ +- +- /* VAR LIST */ +- static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = next; +- return node; +- } +- static void commit_var_list(NodeType *node) +- { +- } /* }}} */ +- +- /* FUNCTION CALL */ +- static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ +- HashValue *fval; +- fval = goom_hash_get(currentGoomSL->functions, name); +- if (!fval) { +- gsl_declare_task(name); +- fval = goom_hash_get(currentGoomSL->functions, name); +- } +- if (!fval) { +- fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); +- exit(1); +- return NULL; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; +- if (gef->is_extern) { +- NodeType *node = new_op(name, OPR_EXT_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- else { +- NodeType *node; +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- node = new_op(stmp, OPR_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- } +- } +- static void commit_ext_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +-#ifdef VERBOSE +- printf("extcall %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } +- static void commit_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } /* }}} */ +- +- /** **/ +- +- static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ +- static NodeType *lastNode = 0; +- static NodeType *gsl_append(NodeType *curNode) { +- if (curNode == 0) return 0; /* {{{ */ +- if (lastNode) +- lastNode->unode.opr.next = curNode; +- lastNode = curNode; +- while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; +- if (rootNode == 0) +- rootNode = curNode; +- return curNode; +- } /* }}} */ +- +-#if 1 +- int allocateTemp() { +- return allocateLabel(); +- } +- void releaseAllTemps() {} +- void releaseTemp(int n) {} +-#else +- static int nbTemp = 0; +- static int *tempArray = 0; +- static int tempArraySize = 0; +- int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ +- int i = 0; /* {{{ */ +- if (tempArray == 0) { +- tempArraySize = 256; +- tempArray = (int*)malloc(tempArraySize * sizeof(int)); +- } +- while (1) { +- int j; +- for (j=0;jtype == OPR_NODE) +- switch(node->unode.opr.type) { +- case OPR_ADD: precommit_add(node); break; +- case OPR_SUB: precommit_sub(node); break; +- case OPR_MUL: precommit_mul(node); break; +- case OPR_DIV: precommit_div(node); break; +- case OPR_CALL_EXPR: precommit_call_expr(node); break; +- } +- } /* }}} */ +- +- void commit_node(NodeType *node, int releaseIfTmp) +- { /* {{{ */ +- if (node == 0) return; +- +- switch(node->type) { +- case OPR_NODE: +- switch(node->unode.opr.type) { +- case OPR_SET: commit_set(node); break; +- case OPR_PLUS_EQ: commit_plus_eq(node); break; +- case OPR_SUB_EQ: commit_sub_eq(node); break; +- case OPR_MUL_EQ: commit_mul_eq(node); break; +- case OPR_DIV_EQ: commit_div_eq(node); break; +- case OPR_IF: commit_if(node); break; +- case OPR_WHILE: commit_while(node); break; +- case OPR_BLOCK: commit_block(node); break; +- case OPR_FUNC_INTRO: commit_function_intro(node); break; +- case OPR_FUNC_OUTRO: commit_function_outro(node); break; +- case OPR_CALL: commit_call(node); break; +- case OPR_EXT_CALL: commit_ext_call(node); break; +- case OPR_EQU: commit_equ(node); break; +- case OPR_LOW: commit_low(node); break; +- case OPR_NOT: commit_not(node); break; +- case OPR_AFFECT_LIST: commit_affect_list(node); break; +- case OPR_FOREACH: commit_foreach(node); break; +- case OPR_VAR_LIST: commit_var_list(node); break; +-#ifdef VERBOSE +- case EMPTY_NODE: printf("NOP\n"); break; +-#endif +- } +- +- commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ +- break; +- +- case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; +- case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; +- case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; +- case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; +- } +- if (releaseIfTmp && is_tmp_expr(node)) +- releaseTemp(get_tmp_id(node)); +- +- nodeFree(node); +- } /* }}} */ +- +- NodeType *nodeNew(const char *str, int type, int line_number) { +- NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ +- node->type = type; +- node->str = (char*)malloc(strlen(str)+1); +- node->vnamespace = NULL; +- node->line_number = line_number; +- strcpy(node->str, str); +- return node; +- } /* }}} */ +- static NodeType *nodeClone(NodeType *node) { +- NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ +- ret->vnamespace = node->vnamespace; +- ret->unode = node->unode; +- return ret; +- } /* }}} */ +- +- void nodeFreeInternals(NodeType *node) { +- free(node->str); /* {{{ */ +- } /* }}} */ +- +- void nodeFree(NodeType *node) { +- nodeFreeInternals(node); /* {{{ */ +- free(node); +- } /* }}} */ +- +- NodeType *new_constInt(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ +- node->unode.constInt.val = atoi(str); +- return node; +- } /* }}} */ +- +- NodeType *new_constPtr(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ +- node->unode.constPtr.id = strtol(str,NULL,0); +- return node; +- } /* }}} */ +- +- NodeType *new_constFloat(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ +- node->unode.constFloat.val = atof(str); +- return node; +- } /* }}} */ +- +- NodeType *new_var(const char *str, int line_number) { +- NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ +- node->vnamespace = gsl_find_namespace(str); +- if (node->vnamespace == 0) { +- fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); +- exit(1); +- } +- return node; +- } /* }}} */ +- +- NodeType *new_nop(const char *str) { +- NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ +- return node; +- } /* }}} */ +- +- NodeType *new_op(const char *str, int type, int nbOp) { +- int i; /* {{{ */ +- NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); +- node->unode.opr.next = 0; +- node->unode.opr.type = type; +- node->unode.opr.nbOp = nbOp; +- for (i=0;iunode.opr.op[i] = 0; +- return node; +- } /* }}} */ +- +- +- void gsl_declare_global_variable(int type, char *name) { +- switch(type){ +- case -1: break; +- case FLOAT_TK:gsl_float_decl_global(name);break; +- case INT_TK: gsl_int_decl_global(name);break; +- case PTR_TK: gsl_ptr_decl_global(name);break; +- default: +- { +- int id = type - 1000; +- gsl_struct_decl_global_from_id(name,id); +- } +- } +- } +- +-%} +- +-%union { +- int intValue; +- float floatValue; +- char charValue; +- char strValue[2048]; +- NodeType *nPtr; +- GoomHash *namespace; +- GSL_Struct *gsl_struct; +- GSL_StructField *gsl_struct_field; +- }; +- +-%token LTYPE_INTEGER +-%token LTYPE_FLOAT +-%token LTYPE_VAR +-%token LTYPE_PTR +- +-%token PTR_TK INT_TK FLOAT_TK DECLARE EXTERNAL WHILE DO NOT PLUS_EQ SUB_EQ DIV_EQ MUL_EQ SUP_EQ LOW_EQ NOT_EQ STRUCT FOR IN +- +-%type return_type +-%type expression constValue instruction test func_call func_call_expression +-%type start_block affectation_list affectation_in_list affectation declaration +-%type var_list_content var_list +-%type task_name ext_task_name +-%type leave_namespace +-%type struct_members +-%type struct_member +-%left '\n' +-%left PLUS_EQ SUB_EQ MUL_EQ DIV_EQ +-%left NOT +-%left '=' '<' '>' +-%left '+' '-' +-%left '/' '*' +- +-%% +- +-/* -------------- Global architechture of a GSL program ------------*/ +- +-gsl: gsl_code function_outro gsl_def_functions ; +- +-gsl_code: gsl_code instruction { gsl_append($2); } +- | gsl_code EXTERNAL '<' ext_task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } +- | gsl_code EXTERNAL '<' ext_task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } +- | gsl_code DECLARE '<' task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } +- | gsl_code DECLARE '<' task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } +- | gsl_code struct_declaration +- | gsl_code '\n' +- | +- ; +- +-/* ------------- Declaration of a structure ------------ */ +- +-struct_declaration: STRUCT '<' LTYPE_VAR ':' struct_members '>' '\n' { gsl_add_struct($3, $5); } +- ; +- +-struct_members: opt_nl struct_member { $$ = gsl_new_struct($2); } +- | struct_members ',' opt_nl struct_member { $$ = $1; gsl_add_struct_field($1, $4); } +- ; +- +-struct_member: INT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_INT); } +- | FLOAT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_FLOAT); } +- | PTR_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_PTR); } +- | LTYPE_VAR LTYPE_VAR { $$ = gsl_new_struct_field_struct($2, $1); } +- ; +- +-/* ------------- Fonction declarations -------------- */ +- +-ext_task_name: LTYPE_VAR { gsl_declare_external_task($1); gsl_enternamespace($1); strcpy($$,$1); } +- ; +-task_name: LTYPE_VAR { gsl_declare_task($1); gsl_enternamespace($1); strcpy($$,$1); strcpy($$,$1); } +- ; +- +-return_type: { $$=-1; } +- | ':' INT_TK { $$=INT_TK; } +- | ':' FLOAT_TK { $$=FLOAT_TK; } +- | ':' PTR_TK { $$=PTR_TK; } +- | ':' LTYPE_VAR { $$= 1000 + gsl_get_struct_id($2); } +- ; +- +-arglist: empty_declaration +- | empty_declaration ',' arglist +- ; +- +-/* ------------- Fonction definition -------------- */ +- +-gsl_def_functions: gsl_def_functions function +- | +- ; +- +-function: function_intro gsl_code function_outro { gsl_leavenamespace(); } +- +-function_intro: '<' task_name '>' return_type '\n' { gsl_append(new_function_intro($2)); +- gsl_declare_global_variable($4,$2); } +- | '<' task_name ':' arglist '>' return_type '\n' { gsl_append(new_function_intro($2)); +- gsl_declare_global_variable($6,$2); } +- ; +-function_outro: { gsl_append(new_function_outro()); } ; +- +-leave_namespace: { $$ = gsl_leavenamespace(); }; +- +-/* ------------ Variable declaration ---------------- */ +- +-declaration: FLOAT_TK LTYPE_VAR '=' expression { gsl_float_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | INT_TK LTYPE_VAR '=' expression { gsl_int_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | PTR_TK LTYPE_VAR '=' expression { gsl_ptr_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | LTYPE_VAR LTYPE_VAR '=' expression { gsl_struct_decl_local($1,$2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | empty_declaration { $$ = 0; } +- ; +- +-empty_declaration: FLOAT_TK LTYPE_VAR { gsl_float_decl_local($2); } +- | INT_TK LTYPE_VAR { gsl_int_decl_local($2); } +- | PTR_TK LTYPE_VAR { gsl_ptr_decl_local($2); } +- | LTYPE_VAR LTYPE_VAR { gsl_struct_decl_local($1,$2); } +- ; +- +-/* -------------- Instructions and Expressions ------------------ */ +- +-instruction: affectation '\n' { $$ = $1; } +- | declaration '\n' { $$ = $1; } +- | '(' test ')' '?' opt_nl instruction { $$ = new_if($2,$6); } +- | WHILE test opt_nl DO opt_nl instruction { $$ = new_while($2,$6); } +- | '{' '\n' start_block gsl_code '}' '\n' { lastNode = $3->unode.opr.op[1]; $$=$3; } +- | func_call { $$ = $1; } +- | LTYPE_VAR PLUS_EQ expression { $$ = new_plus_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | LTYPE_VAR SUB_EQ expression { $$ = new_sub_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | LTYPE_VAR MUL_EQ expression { $$ = new_mul_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | LTYPE_VAR DIV_EQ expression { $$ = new_div_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | FOR LTYPE_VAR IN var_list DO instruction { $$ = new_static_foreach(new_var($2, currentGoomSL->num_lines), $4, $6); } +- ; +- +-var_list: '(' var_list_content ')' { $$ = $2; } +- ; +-var_list_content: LTYPE_VAR { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), NULL); } +- | LTYPE_VAR var_list_content { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), $2); } +- ; +- +-affectation: LTYPE_VAR '=' expression { $$ = new_set(new_var($1,currentGoomSL->num_lines),$3); } ; +- +-start_block: { $$ = new_block(lastNode); lastNode = $$->unode.opr.op[0]; } +- ; +- +-expression: LTYPE_VAR { $$ = new_var($1,currentGoomSL->num_lines); } +- | constValue { $$ = $1; } +- | expression '*' expression { $$ = new_mul($1,$3); } +- | expression '/' expression { $$ = new_div($1,$3); } +- | expression '+' expression { $$ = new_add($1,$3); } +- | expression '-' expression { $$ = new_sub($1,$3); } +- | '-' expression { $$ = new_neg($2); } +- | '(' expression ')' { $$ = $2; } +- | func_call_expression { $$ = $1; } +- ; +- +-test: expression '=' expression { $$ = new_equ($1,$3); } +- | expression '<' expression { $$ = new_low($1,$3); } +- | expression '>' expression { $$ = new_low($3,$1); } +- | expression SUP_EQ expression { $$ = new_not(new_low($1,$3)); } +- | expression LOW_EQ expression { $$ = new_not(new_low($3,$1)); } +- | expression NOT_EQ expression { $$ = new_not(new_equ($1,$3)); } +- | NOT test { $$ = new_not($2); } +- ; +- +-constValue: LTYPE_FLOAT { $$ = new_constFloat($1,currentGoomSL->num_lines); } +- | LTYPE_INTEGER { $$ = new_constInt($1,currentGoomSL->num_lines); } +- | LTYPE_PTR { $$ = new_constPtr($1,currentGoomSL->num_lines); } +- ; +- +-/* ---------------- Function Calls ------------------ */ +- +-func_call: task_name '\n' leave_namespace { $$ = new_call($1,NULL); } +- | task_name ':' affectation_list '\n' leave_namespace { $$ = new_call($1,$3); } +- | '[' task_name ']' '\n' leave_namespace { $$ = new_call($2,NULL); } +- | '[' task_name ':' affectation_list ']' '\n' leave_namespace { $$ = new_call($2,$4); } +- ; +- +-func_call_expression: +- '[' task_name leave_namespace ']' { $$ = new_call_expr($2,NULL); } +- | '[' task_name ':' affectation_list ']' leave_namespace { $$ = new_call_expr($2,$4); } +- ; +- +-affectation_list: affectation_in_list affectation_list { $$ = new_affec_list($1,$2); } +- | affectation_in_list { $$ = new_affec_list($1,NULL); } +- +-affectation_in_list: LTYPE_VAR '=' leave_namespace expression { +- gsl_reenternamespace($3); +- $$ = new_set(new_var($1,currentGoomSL->num_lines),$4); +- } +- | ':' leave_namespace expression { +- gsl_reenternamespace($2); +- $$ = new_set(new_var("&this", currentGoomSL->num_lines),$3); +- } +- ; +- +- +-/* ------------ Misc ---------- */ +- +-opt_nl: '\n' | ; +- +- +-%% +- +- +-void yyerror(char *str) +-{ /* {{{ */ +- fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); +- currentGoomSL->compilationOK = 0; +- exit(1); +-} /* }}} */ +- +diff -Naur /home/d4rk/goom2k4-0/src/goom_tools.c /src/goom_tools.c +--- /home/d4rk/goom2k4-0/src/goom_tools.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_tools.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,25 +0,0 @@ +-#include "goom_tools.h" +-#include +- +-GoomRandom *goom_random_init(int i) { +- GoomRandom *grandom = (GoomRandom*)malloc(sizeof(GoomRandom)); +- srand (i); +- grandom->pos = 1; +- goom_random_update_array(grandom, GOOM_NB_RAND); +- return grandom; +-} +- +-void goom_random_free(GoomRandom *grandom) { +- free(grandom); +-} +- +-void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange) { +- while (numberOfValuesToChange > 0) { +-#if RAND_MAX < 0x10000 +- grandom->array[grandom->pos++] = ((rand()<<16)+rand()) / 127; +-#else +- grandom->array[grandom->pos++] = rand() / 127; +-#endif +- numberOfValuesToChange--; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/goom_tools.h /src/goom_tools.h +--- /home/d4rk/goom2k4-0/src/goom_tools.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_tools.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,33 +0,0 @@ +-#ifndef _GOOMTOOLS_H +-#define _GOOMTOOLS_H +- +-/** +- * Random number generator wrapper for faster random number. +- */ +- +-#define GOOM_NB_RAND 0x10000 +- +-typedef struct _GOOM_RANDOM { +- int array[GOOM_NB_RAND]; +- unsigned short pos; +-} GoomRandom; +- +-GoomRandom *goom_random_init(int i); +-void goom_random_free(GoomRandom *grandom); +- +-inline static int goom_random(GoomRandom *grandom) { +- +- grandom->pos++; /* works because pos is an unsigned short */ +- return grandom->array[grandom->pos]; +-} +- +-inline static int goom_irand(GoomRandom *grandom, int i) { +- +- grandom->pos++; +- return grandom->array[grandom->pos] % i; +-} +- +-/* called to change the specified number of value in the array, so that the array does not remain the same*/ +-void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_typedefs.h /src/goom_typedefs.h +--- /home/d4rk/goom2k4-0/src/goom_typedefs.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_typedefs.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,11 +0,0 @@ +-#ifndef _GOOM_TYPEDEFS_H +-#define _GOOM_TYPEDEFS_H +- +-typedef struct _PLUGIN_INFO PluginInfo; +-typedef struct _SOUND_INFO SoundInfo; +-typedef struct _GMLINE GMLine; +-typedef struct _GMUNITPOINTER GMUnitPointer; +-typedef struct _ZOOM_FILTER_DATA ZoomFilterData; +-typedef struct _VISUAL_FX VisualFX; +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_visual_fx.h /src/goom_visual_fx.h +--- /home/d4rk/goom2k4-0/src/goom_visual_fx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_visual_fx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,26 +0,0 @@ +-#ifndef _VISUAL_FX_H +-#define _VISUAL_FX_H +- +-/** +- * File created on 2003-05-21 by Jeko. +- * (c)2003, JC Hoelt for iOS-software. +- * +- * LGPL Licence. +- * If you use this file on a visual program, +- * please make my name being visible on it. +- */ +- +-#include "goom_config_param.h" +-#include "goom_graphic.h" +-#include "goom_typedefs.h" +- +-struct _VISUAL_FX { +- void (*init) (struct _VISUAL_FX *_this, PluginInfo *info); +- void (*free) (struct _VISUAL_FX *_this); +- void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info); +- void *fx_data; +- +- PluginParameters *params; +-}; +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/graphic.c /src/graphic.c +--- /home/d4rk/goom2k4-0/src/graphic.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/graphic.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,10 +0,0 @@ +-#include "goom_graphic.h" +- +-const Color BLACK = { 0, 0, 0 }; +-const Color WHITE = { 0xff, 0xff, 0xff }; +-const Color RED = { 0xff, 0x05, 0x05 }; +-const Color GREEN = { 0x05, 0xff, 0x05 }; +-const Color BLUE = { 0x05, 0x05, 0xff }; +-const Color YELLOW = { 0xff, 0xff, 0x33 }; +-const Color ORANGE = { 0xff, 0xcc, 0x05 }; +-const Color VIOLET = { 0x55, 0x05, 0xff }; +diff -Naur /home/d4rk/goom2k4-0/src/ifs.c /src/ifs.c +--- /home/d4rk/goom2k4-0/src/ifs.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ifs.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,763 +0,0 @@ +-/* +- * ifs.c --- modified iterated functions system for goom. +- */ +- +-/*- +- * Copyright (c) 1997 by Massimino Pascal +- * +- * Permission to use, copy, modify, and distribute this software and its +- * documentation for any purpose and without fee is hereby granted, +- * provided that the above copyright notice appear in all copies and that +- * both that copyright notice and this permission notice appear in +- * supporting documentation. +- * +- * This file is provided AS IS with no warranties of any kind. The author +- * shall have no liability with respect to the infringement of copyrights, +- * trade secrets or any patents by this file or any part thereof. In no +- * event will the author be liable for any lost revenue or profits or +- * other special, indirect and consequential damages. +- * +- * If this mode is weird and you have an old MetroX server, it is buggy. +- * There is a free SuSE-enhanced MetroX X server that is fine. +- * +- * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." +- * +- * Revision History: +- * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). +- * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) +- * 01-Nov-2000: Allocation checks +- * 10-May-1997: jwz@jwz.org: turned into a standalone program. +- * Made it render into an offscreen bitmap and then copy +- * that onto the screen, to reduce flicker. +- */ +- +-/* #ifdef STANDALONE */ +- +-#include +-#include +-#include +- +-#include "goom_config.h" +- +-#ifdef HAVE_MMX +-#include "mmx.h" +-#endif +- +-#include "goom_graphic.h" +-#include "ifs.h" +-#include "goom_tools.h" +- +-typedef struct _ifsPoint +-{ +- gint32 x, y; +-} +-IFSPoint; +- +- +-#define MODE_ifs +- +-#define PROGCLASS "IFS" +- +-#define HACK_INIT init_ifs +-#define HACK_DRAW draw_ifs +- +-#define ifs_opts xlockmore_opts +- +-#define DEFAULTS "*delay: 20000 \n" \ +-"*ncolors: 100 \n" +- +-#define SMOOTH_COLORS +- +-#define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff)) +-#define NRAND(n) ((int) (LRAND() % (n))) +- +-#if RAND_MAX < 0x10000 +-#define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f) +-#else +-#define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */ +-#endif +- +-/*****************************************************/ +- +-typedef float DBL; +-typedef int F_PT; +- +-/* typedef float F_PT; */ +- +-/*****************************************************/ +- +-#define FIX 12 +-#define UNIT ( 1<c_x = Gauss_Rand (goomInfo, 0.0, .8, 4.0); +- Cur->c_y = Gauss_Rand (goomInfo, 0.0, .8, 4.0); +- Cur->r = Gauss_Rand (goomInfo, F->r_mean, F->dr_mean, 3.0); +- Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, F->dr2_mean, 2.0); +- Cur->A = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); +- Cur->A2 = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); +- Cur++; +- } +-} +- +-static void +-free_ifs_buffers (FRACTAL * Fractal) +-{ +- if (Fractal->Buffer1 != NULL) { +- (void) free ((void *) Fractal->Buffer1); +- Fractal->Buffer1 = (IFSPoint *) NULL; +- } +- if (Fractal->Buffer2 != NULL) { +- (void) free ((void *) Fractal->Buffer2); +- Fractal->Buffer2 = (IFSPoint *) NULL; +- } +-} +- +- +-static void +-free_ifs (FRACTAL * Fractal) +-{ +- free_ifs_buffers (Fractal); +-} +- +-/***************************************************************/ +- +-static void +-init_ifs (PluginInfo *goomInfo, IfsData *data) +-{ +- int i; +- FRACTAL *Fractal; +- int width = goomInfo->screen.width; +- int height = goomInfo->screen.height; +- +- if (data->Root == NULL) { +- data->Root = (FRACTAL *) malloc (sizeof (FRACTAL)); +- if (data->Root == NULL) +- return; +- data->Root->Buffer1 = (IFSPoint *) NULL; +- data->Root->Buffer2 = (IFSPoint *) NULL; +- } +- Fractal = data->Root; +- +- free_ifs_buffers (Fractal); +- +- i = (NRAND (4)) + 2; /* Number of centers */ +- switch (i) { +- case 3: +- Fractal->Depth = MAX_DEPTH_3; +- Fractal->r_mean = .6; +- Fractal->dr_mean = .4; +- Fractal->dr2_mean = .3; +- break; +- +- case 4: +- Fractal->Depth = MAX_DEPTH_4; +- Fractal->r_mean = .5; +- Fractal->dr_mean = .4; +- Fractal->dr2_mean = .3; +- break; +- +- case 5: +- Fractal->Depth = MAX_DEPTH_5; +- Fractal->r_mean = .5; +- Fractal->dr_mean = .4; +- Fractal->dr2_mean = .3; +- break; +- +- default: +- case 2: +- Fractal->Depth = MAX_DEPTH_2; +- Fractal->r_mean = .7; +- Fractal->dr_mean = .3; +- Fractal->dr2_mean = .4; +- break; +- } +- Fractal->Nb_Simi = i; +- Fractal->Max_Pt = Fractal->Nb_Simi - 1; +- for (i = 0; i <= Fractal->Depth + 2; ++i) +- Fractal->Max_Pt *= Fractal->Nb_Simi; +- +- if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt, +- sizeof (IFSPoint))) == NULL) { +- free_ifs (Fractal); +- return; +- } +- if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt, +- sizeof (IFSPoint))) == NULL) { +- free_ifs (Fractal); +- return; +- } +- +- Fractal->Speed = 6; +- Fractal->Width = width; /* modif by JeKo */ +- Fractal->Height = height; /* modif by JeKo */ +- Fractal->Cur_Pt = 0; +- Fractal->Count = 0; +- Fractal->Lx = (Fractal->Width - 1) / 2; +- Fractal->Ly = (Fractal->Height - 1) / 2; +- Fractal->Col = rand () % (width * height); /* modif by JeKo */ +- +- Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI); +-} +- +- +-/***************************************************************/ +- +-static inline void +-Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y) +-{ +- F_PT xx, yy; +- +- xo = xo - Simi->Cx; +- xo = (xo * Simi->R) >> FIX; /* / UNIT; */ +- yo = yo - Simi->Cy; +- yo = (yo * Simi->R) >> FIX; /* / UNIT; */ +- +- xx = xo - Simi->Cx; +- xx = (xx * Simi->R2) >> FIX; /* / UNIT; */ +- yy = -yo - Simi->Cy; +- yy = (yy * Simi->R2) >> FIX; /* / UNIT; */ +- +- *x = +- ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) +- >> FIX /* / UNIT */ ) + Simi->Cx; +- *y = +- ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) +- >> FIX /* / UNIT */ ) + Simi->Cy; +-} +- +-/***************************************************************/ +- +-static void +-Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData *data) +-{ +- F_PT x, y, i; +- SIMI *Cur; +- +- Cur = data->Cur_F->Components; +- for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) { +- Transform (Cur, xo, yo, &x, &y); +- +- data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX+1) /* /(UNIT*2) */ ); +- data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX+1) /* /(UNIT*2) */ ); +- data->Buf++; +- +- data->Cur_Pt++; +- +- if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) { +- F->Depth--; +- Trace (F, x, y, data); +- F->Depth++; +- } +- } +-} +- +-static void +-Draw_Fractal (IfsData *data) +-{ +- FRACTAL *F = data->Root; +- int i, j; +- F_PT x, y, xo, yo; +- SIMI *Cur, *Simi; +- +- for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { +- Cur->Cx = DBL_To_F_PT (Cur->c_x); +- Cur->Cy = DBL_To_F_PT (Cur->c_y); +- +- Cur->Ct = DBL_To_F_PT (cos (Cur->A)); +- Cur->St = DBL_To_F_PT (sin (Cur->A)); +- Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2)); +- Cur->St2 = DBL_To_F_PT (sin (Cur->A2)); +- +- Cur->R = DBL_To_F_PT (Cur->r); +- Cur->R2 = DBL_To_F_PT (Cur->r2); +- } +- +- +- data->Cur_Pt = 0; +- data->Cur_F = F; +- data->Buf = F->Buffer2; +- for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { +- xo = Cur->Cx; +- yo = Cur->Cy; +- for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) { +- if (Simi == Cur) +- continue; +- Transform (Simi, xo, yo, &x, &y); +- Trace (F, x, y, data); +- } +- } +- +- /* Erase previous */ +- +- F->Cur_Pt = data->Cur_Pt; +- data->Buf = F->Buffer1; +- F->Buffer1 = F->Buffer2; +- F->Buffer2 = data->Buf; +-} +- +- +-static IFSPoint * +-draw_ifs (PluginInfo *goomInfo, int *nbpt, IfsData *data) +-{ +- int i; +- DBL u, uu, v, vv, u0, u1, u2, u3; +- SIMI *S, *S1, *S2, *S3, *S4; +- FRACTAL *F; +- +- if (data->Root == NULL) +- return NULL; +- F = data->Root; +- if (F->Buffer1 == NULL) +- return NULL; +- +- u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; +- uu = u * u; +- v = 1.0 - u; +- vv = v * v; +- u0 = vv * v; +- u1 = 3.0 * vv * u; +- u2 = 3.0 * v * uu; +- u3 = u * uu; +- +- S = F->Components; +- S1 = S + F->Nb_Simi; +- S2 = S1 + F->Nb_Simi; +- S3 = S2 + F->Nb_Simi; +- S4 = S3 + F->Nb_Simi; +- +- for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { +- S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; +- S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; +- S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; +- S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; +- S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; +- S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; +- } +- +- Draw_Fractal (data); +- +- if (F->Count >= 1000 / F->Speed) { +- S = F->Components; +- S1 = S + F->Nb_Simi; +- S2 = S1 + F->Nb_Simi; +- S3 = S2 + F->Nb_Simi; +- S4 = S3 + F->Nb_Simi; +- +- for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { +- S2->c_x = 2.0 * S4->c_x - S3->c_x; +- S2->c_y = 2.0 * S4->c_y - S3->c_y; +- S2->r = 2.0 * S4->r - S3->r; +- S2->r2 = 2.0 * S4->r2 - S3->r2; +- S2->A = 2.0 * S4->A - S3->A; +- S2->A2 = 2.0 * S4->A2 - S3->A2; +- +- *S1 = *S4; +- } +- Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); +- +- Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); +- +- F->Count = 0; +- } +- else +- F->Count++; +- +- F->Col++; +- +- (*nbpt) = data->Cur_Pt; +- return F->Buffer2; +-} +- +- +-/***************************************************************/ +- +-static void release_ifs (IfsData *data) +-{ +- if (data->Root != NULL) { +- free_ifs (data->Root); +- (void) free ((void *) data->Root); +- data->Root = (FRACTAL *) NULL; +- } +-} +- +-#define RAND() goom_random(goomInfo->gRandom) +- +-static void ifs_update (PluginInfo *goomInfo, Pixel * data, Pixel * back, int increment, IfsData *fx_data) +-{ +- static int couleur = 0xc0c0c0c0; +- static int v[4] = { 2, 4, 3, 2 }; +- static int col[4] = { 2, 4, 3, 2 }; +- +-#define MOD_MER 0 +-#define MOD_FEU 1 +-#define MOD_MERVER 2 +- static int mode = MOD_MERVER; +- static int justChanged = 0; +- static int cycle = 0; +- int cycle10; +- +- int nbpt; +- IFSPoint *points; +- int i; +- +- int couleursl = couleur; +- int width = goomInfo->screen.width; +- int height = goomInfo->screen.height; +- +- cycle++; +- if (cycle >= 80) +- cycle = 0; +- +- if (cycle < 40) +- cycle10 = cycle / 10; +- else +- cycle10 = 7 - cycle / 10; +- +- { +- unsigned char *tmp = (unsigned char *) &couleursl; +- +- for (i = 0; i < 4; i++) { +- *tmp = (*tmp) >> cycle10; +- tmp++; +- } +- } +- +- points = draw_ifs (goomInfo, &nbpt, fx_data); +- nbpt--; +- +-#ifdef HAVE_MMX +- movd_m2r (couleursl, mm1); +- punpckldq_r2r (mm1, mm1); +- for (i = 0; i < nbpt; i += increment) { +- int x = points[i].x; +- int y = points[i].y; +- +- if ((x < width) && (y < height) && (x > 0) && (y > 0)) { +- int pos = x + (y * width); +- movd_m2r (back[pos], mm0); +- paddusb_r2r (mm1, mm0); +- movd_r2m (mm0, data[pos]); +- } +- } +- emms();/*__asm__ __volatile__ ("emms");*/ +-#else +- for (i = 0; i < nbpt; i += increment) { +- int x = (int) points[i].x & 0x7fffffff; +- int y = (int) points[i].y & 0x7fffffff; +- +- if ((x < width) && (y < height)) { +- int pos = x + (int) (y * width); +- int tra = 0, i = 0; +- unsigned char *bra = (unsigned char *) &back[pos]; +- unsigned char *dra = (unsigned char *) &data[pos]; +- unsigned char *cra = (unsigned char *) &couleursl; +- +- for (; i < 4; i++) { +- tra = *cra; +- tra += *bra; +- if (tra > 255) +- tra = 255; +- *dra = tra; +- ++dra; +- ++cra; +- ++bra; +- } +- } +- } +-#endif /*MMX*/ +- justChanged--; +- +- col[ALPHA] = couleur >> (ALPHA * 8) & 0xff; +- col[BLEU] = couleur >> (BLEU * 8) & 0xff; +- col[VERT] = couleur >> (VERT * 8) & 0xff; +- col[ROUGE] = couleur >> (ROUGE * 8) & 0xff; +- +- if (mode == MOD_MER) { +- col[BLEU] += v[BLEU]; +- if (col[BLEU] > 255) { +- col[BLEU] = 255; +- v[BLEU] = -(RAND() % 4) - 1; +- } +- if (col[BLEU] < 32) { +- col[BLEU] = 32; +- v[BLEU] = (RAND() % 4) + 1; +- } +- +- col[VERT] += v[VERT]; +- if (col[VERT] > 200) { +- col[VERT] = 200; +- v[VERT] = -(RAND() % 3) - 2; +- } +- if (col[VERT] > col[BLEU]) { +- col[VERT] = col[BLEU]; +- v[VERT] = v[BLEU]; +- } +- if (col[VERT] < 32) { +- col[VERT] = 32; +- v[VERT] = (RAND() % 3) + 2; +- } +- +- col[ROUGE] += v[ROUGE]; +- if (col[ROUGE] > 64) { +- col[ROUGE] = 64; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] < 0) { +- col[ROUGE] = 0; +- v[ROUGE] = (RAND () % 4) + 1; +- } +- +- col[ALPHA] += v[ALPHA]; +- if (col[ALPHA] > 0) { +- col[ALPHA] = 0; +- v[ALPHA] = -(RAND () % 4) - 1; +- } +- if (col[ALPHA] < 0) { +- col[ALPHA] = 0; +- v[ALPHA] = (RAND () % 4) + 1; +- } +- +- if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) +- && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) +- && (RAND () % 20 == 0)) && (justChanged < 0)) { +- mode = RAND () % 3 ? MOD_FEU : MOD_MERVER; +- justChanged = 250; +- } +- } +- else if (mode == MOD_MERVER) { +- col[BLEU] += v[BLEU]; +- if (col[BLEU] > 128) { +- col[BLEU] = 128; +- v[BLEU] = -(RAND () % 4) - 1; +- } +- if (col[BLEU] < 16) { +- col[BLEU] = 16; +- v[BLEU] = (RAND () % 4) + 1; +- } +- +- col[VERT] += v[VERT]; +- if (col[VERT] > 200) { +- col[VERT] = 200; +- v[VERT] = -(RAND () % 3) - 2; +- } +- if (col[VERT] > col[ALPHA]) { +- col[VERT] = col[ALPHA]; +- v[VERT] = v[ALPHA]; +- } +- if (col[VERT] < 32) { +- col[VERT] = 32; +- v[VERT] = (RAND () % 3) + 2; +- } +- +- col[ROUGE] += v[ROUGE]; +- if (col[ROUGE] > 128) { +- col[ROUGE] = 128; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] < 0) { +- col[ROUGE] = 0; +- v[ROUGE] = (RAND () % 4) + 1; +- } +- +- col[ALPHA] += v[ALPHA]; +- if (col[ALPHA] > 255) { +- col[ALPHA] = 255; +- v[ALPHA] = -(RAND () % 4) - 1; +- } +- if (col[ALPHA] < 0) { +- col[ALPHA] = 0; +- v[ALPHA] = (RAND () % 4) + 1; +- } +- +- if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) +- && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) +- && (RAND () % 20 == 0)) && (justChanged < 0)) { +- mode = RAND () % 3 ? MOD_FEU : MOD_MER; +- justChanged = 250; +- } +- } +- else if (mode == MOD_FEU) { +- +- col[BLEU] += v[BLEU]; +- if (col[BLEU] > 64) { +- col[BLEU] = 64; +- v[BLEU] = -(RAND () % 4) - 1; +- } +- if (col[BLEU] < 0) { +- col[BLEU] = 0; +- v[BLEU] = (RAND () % 4) + 1; +- } +- +- col[VERT] += v[VERT]; +- if (col[VERT] > 200) { +- col[VERT] = 200; +- v[VERT] = -(RAND () % 3) - 2; +- } +- if (col[VERT] > col[ROUGE] + 20) { +- col[VERT] = col[ROUGE] + 20; +- v[VERT] = -(RAND () % 3) - 2; +- v[ROUGE] = (RAND () % 4) + 1; +- v[BLEU] = (RAND () % 4) + 1; +- } +- if (col[VERT] < 0) { +- col[VERT] = 0; +- v[VERT] = (RAND () % 3) + 2; +- } +- +- col[ROUGE] += v[ROUGE]; +- if (col[ROUGE] > 255) { +- col[ROUGE] = 255; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] > col[VERT] + 40) { +- col[ROUGE] = col[VERT] + 40; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] < 0) { +- col[ROUGE] = 0; +- v[ROUGE] = (RAND () % 4) + 1; +- } +- +- col[ALPHA] += v[ALPHA]; +- if (col[ALPHA] > 0) { +- col[ALPHA] = 0; +- v[ALPHA] = -(RAND () % 4) - 1; +- } +- if (col[ALPHA] < 0) { +- col[ALPHA] = 0; +- v[ALPHA] = (RAND () % 4) + 1; +- } +- +- if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU]) +- && (col[BLEU] > 32) +- && (RAND () % 20 == 0)) && (justChanged < 0)) { +- mode = RAND () % 2 ? MOD_MER : MOD_MERVER; +- justChanged = 250; +- } +- } +- +- couleur = (col[ALPHA] << (ALPHA * 8)) +- | (col[BLEU] << (BLEU * 8)) +- | (col[VERT] << (VERT * 8)) +- | (col[ROUGE] << (ROUGE * 8)); +-} +- +-/** VISUAL_FX WRAPPER FOR IFS */ +- +-static void ifs_vfx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) { +- +- IfsData *data = (IfsData*)_this->fx_data; +- if (!data->initalized) { +- data->initalized = 1; +- init_ifs(goomInfo, data); +- } +- ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data); +- /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */ +-} +- +-static void ifs_vfx_init(VisualFX *_this, PluginInfo *info) { +- +- IfsData *data = (IfsData*)malloc(sizeof(IfsData)); +- data->Root = (FRACTAL*)NULL; +- data->initalized = 0; +- _this->fx_data = data; +-} +- +-static void ifs_vfx_free(VisualFX *_this) { +- IfsData *data = (IfsData*)_this->fx_data; +- release_ifs(data); +- free(data); +-} +- +-VisualFX ifs_visualfx_create(void) { +- VisualFX vfx; +- vfx.init = ifs_vfx_init; +- vfx.free = ifs_vfx_free; +- vfx.apply = ifs_vfx_apply; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/ifs.h /src/ifs.h +--- /home/d4rk/goom2k4-0/src/ifs.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ifs.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,27 +0,0 @@ +-/* +- * File created 11 april 2002 by JeKo +- */ +- +-#ifndef IFS_H +-#define IFS_H +- +-#include "goom_config.h" +-#include "goom_graphic.h" +-#include "goom_plugin_info.h" +-#include "goom_visual_fx.h" +- +-VisualFX ifs_visualfx_create(void); +- +-/* init ifs for a (width)x(height) output. * / +-void init_ifs (PluginInfo *goomInfo, int width, int height); +- +-/ * draw an ifs on the buffer (which size is width * height) +- increment means that we draw 1/increment of the ifs's points * / +-void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment); +- +-/ * free all ifs's data. * / +-void release_ifs (void); +-*/ +- +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/jitc_test.c /src/jitc_test.c +--- /home/d4rk/goom2k4-0/src/jitc_test.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/jitc_test.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,38 +0,0 @@ +-#include "jitc_x86.h" +-#include +- +-int main(int c, char **v) +-{ +- int i; +- int j; +- JitcX86Env *jitc = jitc_x86_env_new(0xffff); +- JitcFunc func = jitc_prepare_func(jitc); +- +- jitc_add(jitc, "mov edx, $d", 0xffffffff); +- jitc_add(jitc, "mov eax, $d", 40); +- jitc_add(jitc, "mov ebx, $d", 2); +- jitc_add(jitc, "idiv ebx"); +- jitc_add(jitc, "mov eax, [$d]", 0xdeadbeaf); +- +- jitc_add(jitc, "sal edx, $d", 7); +- jitc_add(jitc, "imul ecx"); +- jitc_add(jitc, "idiv ecx"); +- jitc_add(jitc, "imul $d[ecx]", 2); +- jitc_add(jitc, "imul ecx, [ecx]"); +- jitc_add(jitc, "mov ecx, $d", (char*)(&i)-12); +- jitc_add(jitc, "dec $d[ecx]", 2); +- jitc_add(jitc, "add ecx, $d", 12); +- jitc_add(jitc, "dec [ecx]"); +- jitc_add(jitc, "dec ecx"); +- +- JITC_FLD_pIMM32(jitc,&i); +- JITC_FSTP_pIMM32(jitc,&j); +- +- jitc_validate_func(jitc); +- func(); +- +- printf("i = 0x%08x\n", i); +- +- jitc_x86_delete(jitc); +- return 0; +-} +diff -Naur /home/d4rk/goom2k4-0/src/jitc_x86.c /src/jitc_x86.c +--- /home/d4rk/goom2k4-0/src/jitc_x86.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/jitc_x86.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,530 +0,0 @@ +-#include "jitc_x86.h" +- +-#include +-#include +-#include +- +-#define PARAM_INT 1 +-#define PARAM_FLOAT 2 +-#define PARAM_REG 3 +-#define PARAM_dispREG 4 +-#define PARAM_DISP32 5 +-#define PARAM_LABEL 6 +-#define PARAM_NONE 666 +- +-typedef struct { +- int id; +- int i; +- double f; +- int reg; +- int disp; +- char label[256]; +-} IParam; +- +-struct { +- char *name; +- int reg; +-} RegsName[] = { +- {"eax",EAX}, {"ebx",EBX}, {"ecx",ECX}, {"edx",EDX}, +- {"edi",EDI}, {"esi",ESI}, {"ebp",EBP}, {"esp",ESP}, +- {"st0",0}, {"st1",1}, {"st2",2}, {"st3",3}, +- {"st4",4}, {"st5",5}, {"st6",6}, {"st7",7}, +- {"mm0",0}, {"mm1",1}, {"mm2",2}, {"mm3",3}, +- {"mm4",4}, {"mm5",5}, {"mm6",6}, {"mm7",7}, {NULL,0} +-}; +- +-void modrm(JitcX86Env *jitc, int opcode, IParam *iparam) +-{ +- int dest = 0; +- int src = 1; +- int direction = 0x0; +- unsigned int byte = 666; +- unsigned int int32 = 0; +- unsigned int need32 = 0; +- +- if ((iparam[0].id == PARAM_REG) && (iparam[1].id != PARAM_REG)) { +- dest = 1; +- src = 0; +- direction = 0x02; +- } +- +- if (iparam[src].id != PARAM_REG) { +- fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); +- exit(1); +- } +- +- if (iparam[dest].id == PARAM_REG) { +- byte = ((int)JITC_MOD_REG_REG << 6) | (iparam[src].reg << 3) | (iparam[0].reg); +- } +- +- else if (iparam[dest].id == PARAM_dispREG) +- { +- if (iparam[dest].disp == 0) +- byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | (iparam[dest].reg); +- } +- +- else if (iparam[dest].id == PARAM_DISP32) +- { +- byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | JITC_RM_DISP32; +- need32 = 1; +- int32 = iparam[dest].disp; +- } +- +- if (byte == 666) { +- fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); +- exit(1); +- } +- else { +- if (opcode < 0x100) +- JITC_ADD_UCHAR(jitc, opcode + direction); +- else { +- JITC_ADD_UCHAR(jitc, (opcode>>8)&0xff); +- JITC_ADD_UCHAR(jitc, (opcode&0xff)/* + direction*/); +- } +- JITC_ADD_UCHAR(jitc, byte); +- if (need32) +- JITC_ADD_UINT(jitc, int32); +- } +-} +- +-static void imul_like_modrm_1param(JitcX86Env *jitc, int opcode, int digit, IParam *iparam) +-{ +- if (iparam[0].id == PARAM_REG) +- { +- JITC_ADD_UCHAR(jitc, opcode); +- JITC_MODRM(jitc, 0x03, digit, iparam[0].reg); +- return; +- } +- if (iparam[0].id == PARAM_dispREG) { +- JITC_ADD_UCHAR(jitc, opcode); +- if (iparam[0].disp == 0) +- { +- JITC_MODRM(jitc, 0x00, digit, iparam[0].reg); +- } +- else if ((iparam[0].disp & 0xff) == iparam[0].disp) +- { +- JITC_MODRM(jitc, 0x01, digit, iparam[0].reg); +- JITC_ADD_UCHAR(jitc, iparam[0].disp); +- } +- else +- { +- JITC_MODRM(jitc, 0x02, digit, iparam[0].reg); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- } +- return; +- } +- if (iparam[0].id == PARAM_DISP32) { +- JITC_ADD_UCHAR(jitc, opcode); +- JITC_MODRM(jitc, JITC_MOD_pREG_REG, digit, JITC_RM_DISP32); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- return; +- } +-} +- +-/* 1 byte encoded opcode including register... imm32 parameter */ +-#define INSTR_1bReg_IMM32(opcode,dest,src) { \ +- JITC_ADD_UCHAR(jitc, opcode + iparam[dest].reg); \ +- JITC_ADD_UINT (jitc, (int)iparam[src].i); } +- +-typedef struct { +- char *name; +- int opcode; +- int opcode_reg_int; +- int digit_reg_int; +- int opcode_eax_int; +-} AddLikeInstr; +- +-static AddLikeInstr addLike[] = { +- { "add", 0x01, 0x81, 0x00, 0x05 }, +- { "and", 0x21, 0x81, 0x04, 0x25 }, +- { "or", 0x0B, 0x81, 0x01, 0x0D }, +- { "cmp", 0x39, 0x81, 0x07, 0x3D }, +- { "imul", 0x0FAF, 0x69, 0x00, 0x10000 }, +- { "sub", 0x29, 0x81, 0x05, 0X2D }, +- { NULL, -1, -1, -1, -1 } +-}; +- +-int checkAddLike(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +-{ +- int i; +- for (i=0;addLike[i].name;++i) +- { +- if (strcmp(op,addLike[i].name) == 0) +- { +- if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { +- if ((iparam[0].reg == EAX) && (addLike[i].opcode_eax_int != 0x10000)) { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_eax_int); +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- else { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); +- JITC_MODRM(jitc, 0x03, addLike[i].digit_reg_int, iparam[0].reg); +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- } +- else if ((iparam[0].id == PARAM_dispREG) && (iparam[1].id == PARAM_INT)) { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); +- if ((iparam[0].disp & 0xff) == iparam[0].disp) +- { +- JITC_MODRM(jitc, 0x01, addLike[i].digit_reg_int, iparam[0].reg); +- JITC_ADD_UCHAR(jitc, iparam[0].disp); +- } +- else +- { +- JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, iparam[0].reg); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- } +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); +- JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, 0x05); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- else { +- modrm(jitc, addLike[i].opcode, iparam); +- return 1; +- } +- } +- } +- return 0; +-} +- +-/** +- * Check all kind of known instruction... perform special optimisations.. +- */ +-static void jitc_add_op(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +-{ +- /* MOV */ +- if (strcmp(op,"mov") == 0) +- { +- if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { +- INSTR_1bReg_IMM32(0xb8,0,1); +- } +- else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { +- JITC_ADD_UCHAR(jitc, 0xc7); +- JITC_MODRM(jitc, 0x00, 0x00, 0x05); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- JITC_ADD_UINT(jitc, iparam[1].i); +- } +- else +- modrm(jitc, 0x89, iparam); +- return; +- } +- +-#define IMUL_LIKE(_OP,_opcode,_digit)\ +- if (strcmp(op, _OP) == 0) { \ +- if (nbParams == 1) { \ +- imul_like_modrm_1param(jitc, _opcode, _digit, iparam); \ +- return; }} +- +-#define SHIFT_LIKE(_name,_op1,_op2,_digit) \ +- if (strcmp(op, _name) == 0) { \ +- if (iparam[1].id == PARAM_INT) { \ +- if (iparam[1].i == 1) \ +- imul_like_modrm_1param(jitc, _op1, _digit, iparam); \ +- else { \ +- imul_like_modrm_1param(jitc, _op2, _digit, iparam); \ +- JITC_ADD_UCHAR(jitc, iparam[1].i); \ +- } \ +- return; \ +- } \ +- } +- +-#define POP_LIKE(_OP,_opcode) \ +- if (strcmp(op, _OP) == 0) { \ +- if (iparam[0].id == PARAM_REG) { \ +- JITC_ADD_UCHAR(jitc, _opcode + iparam[0].reg); \ +- return; } } +- +- IMUL_LIKE("neg", 0xf7, 0x03); +- IMUL_LIKE("imul", 0xf7, 0x05); +- IMUL_LIKE("idiv", 0xf7, 0x07); +- +- POP_LIKE("pop", 0x58); +- POP_LIKE("push", 0x50); +- +- SHIFT_LIKE("sal", 0xd1, 0xc1, 0x04); +- SHIFT_LIKE("sar", 0xd1, 0xc1, 0x07); +- SHIFT_LIKE("shl", 0xd1, 0xc1, 0x04); +- SHIFT_LIKE("shr", 0xd1, 0xc1, 0x05); +- +- /* INC */ +- if (strcmp(op, "inc") == 0) { +- if (iparam[0].id == PARAM_REG) { +- JITC_ADD_UCHAR(jitc, 0x40 + iparam[0].reg); +- return; +- } +- imul_like_modrm_1param(jitc, 0xff, 0x00, iparam); +- return; +- } +- +- /* DEC */ +- if (strcmp(op, "dec") == 0) { +- if (iparam[0].id == PARAM_REG) { +- JITC_ADD_UCHAR(jitc, 0x48 + iparam[0].reg); +- return; +- } +- imul_like_modrm_1param(jitc, 0xff, 0x01, iparam); +- return; +- } +- +- if (strcmp(op, "call") == 0) +- { +- if (iparam[0].id == PARAM_LABEL) { +- jitc_add_used_label(jitc,iparam[0].label,jitc->used+1); +- JITC_CALL(jitc,0); +- return; +- } +- if (iparam[0].id == PARAM_INT) { +- JITC_CALL(jitc,iparam[0].i); +- return; +- } +- if (iparam[0].id == PARAM_dispREG) { +- JITC_ADD_UCHAR(jitc,0xff); +- JITC_ADD_UCHAR(jitc,0xd0+iparam[0].reg); +- return; +- } +- } +- +-#define MONOBYTE_INSTR(_OP,_opcode) \ +- if (strcmp(op, _OP) == 0) { \ +- JITC_ADD_UCHAR(jitc, _opcode); \ +- return; } +- +- MONOBYTE_INSTR("ret", 0xc3); +- MONOBYTE_INSTR("leave", 0xc9); +- MONOBYTE_INSTR("cdq", 0x99); +- +- /* JNE */ +- if (strcmp(op, "jne") == 0) { +- if (iparam[0].id == PARAM_LABEL) { +- JITC_JUMP_COND_LABEL(jitc,COND_NOT_EQUAL,iparam[0].label); +- return; +- } +- if (iparam[0].id == PARAM_INT) { +- JITC_JUMP_COND(jitc,COND_NOT_EQUAL,iparam[0].i); +- return; +- } +- } +- +- /* JE */ +- if (strcmp(op, "je") == 0) { +- if (iparam[0].id == PARAM_LABEL) { +- JITC_JUMP_COND_LABEL(jitc,COND_EQUAL,iparam[0].label); +- return; +- } +- if (iparam[0].id == PARAM_INT) { +- JITC_JUMP_COND(jitc,COND_EQUAL,iparam[0].i); +- return; +- } +- } +- +- /* ADD LIKE */ +- if (checkAddLike(jitc, op, iparam, nbParams)) return; +- +- /* BSWAP : 0F C8+rd */ +- +- fprintf(stderr, "JITC_x86: Invalid Operation '%s'\n", op); +- exit(1); +-} +- +-/** +- * Adds a new instruction to the just in time compiled function +- */ +-void jitc_add(JitcX86Env *jitc, const char *_instr, ...) +-{ +- char instr[256]; +- char *op; +- char *sparam[16]; int nbParam=0; int i; +- IParam iparam[16]; +- va_list ap; +- strcpy(instr,_instr); +- +-#ifdef DISPLAY_GENCODE +- printf("|"); +-#endif +- +- op = strtok(instr, " ,"); +- if (!op) return; +- +- /* decoupage en tokens */ +- while ((sparam[nbParam] = strtok(NULL, " ,")) != NULL) if (strlen(sparam[nbParam])>0) nbParam++; +- +- /* Reconnaissance des parametres */ +- va_start(ap, _instr); +- for (i=0;i 0) { +- if (strcmp(regname, RegsName[r].name) == 0) { +- iparam[i].id = PARAM_dispREG; +- iparam[i].reg = RegsName[r].reg; +- iparam[i].disp = va_arg(ap, int); +- } +- } +- if (sscanf(sparam[i], "[%3s]", regname) > 0) { +- if (strcmp(regname, RegsName[r].name) == 0) { +- iparam[i].id = PARAM_dispREG; +- iparam[i].reg = RegsName[r].reg; +- iparam[i].disp = 0; +- } +- } +- } +- } +- if (iparam[i].id == PARAM_NONE) { +- fprintf(stderr, "JITC_x86: Unrecognized parameter '%s'\n", sparam[i]); +- exit(1); +- } +- } +- va_end(ap); +- +- jitc_add_op(jitc, op, &(iparam[0]), nbParam); +-#ifdef DISPLAY_GENCODE +- printf(" ;;; %s", op); +- for (i=0;i_memory = (unsigned char*)malloc(memory_size); +- jitc->used = 0; +- jitc->memory = (unsigned char*)((int)jitc->_memory + (32-((int)jitc->_memory)%32)%32); +- +- jitc->nbUsedLabel = 0; +- jitc->nbKnownLabel = 0; +- +- jitc->usedLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); +- jitc->knownLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); +- +- return jitc; +-} +- +-void jitc_x86_delete(JitcX86Env *jitc) { +- +- free(jitc->usedLabel); +- free(jitc->knownLabel); +- free(jitc->_memory); +- free(jitc); +-} +- +-JitcFunc jitc_prepare_func(JitcX86Env *jitc) { +- +- JitcFunc ptr = 0; +- jitc->used = (32 - jitc->used%32)%32; +- ptr = (JitcFunc)&(jitc->memory[jitc->used]); +- +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +- printf("-- Function Intro --\n"); +- printf("------------------------------------------\n"); +-#endif +- +- /* save the state */ +- jitc_add(jitc,"push ebp"); +- jitc_add(jitc,"mov ebp, esp"); +- jitc_add(jitc,"sub esp, $d", 8); +- JITC_PUSH_ALL(jitc); +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +-#endif +- return ptr; +-} +- +-void jitc_validate_func(JitcX86Env *jitc) { +- +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +- printf("-- Function Outro --\n"); +- printf("------------------------------------------\n"); +-#endif +- /* restore the state */ +- JITC_POP_ALL(jitc); +- jitc_add(jitc, "leave"); +- jitc_add(jitc, "ret"); +- jitc_resolve_labels(jitc); +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +-#endif +-} +- +-void jitc_add_used_label(JitcX86Env *jitc, char *label, int where) { +- +- strncpy(jitc->usedLabel[jitc->nbUsedLabel].label, label, JITC_LABEL_SIZE); +- jitc->usedLabel[jitc->nbUsedLabel].address = where; +- jitc->nbUsedLabel++; +-} +- +-void jitc_add_known_label(JitcX86Env *jitc, char *label, int where) { +- +-#ifdef DISPLAY_GENCODE +- printf("%s:\n", label); +-#endif +- strncpy(jitc->knownLabel[jitc->nbKnownLabel].label, label, JITC_LABEL_SIZE); +- jitc->knownLabel[jitc->nbKnownLabel].address = where; +- jitc->nbKnownLabel++; +-} +- +-void jitc_resolve_labels(JitcX86Env *jitc) { +- +- int i,j; +- for (i=jitc->nbUsedLabel;i-->0;) { +- +- LabelAddr used = jitc->usedLabel[i]; +- for (j=jitc->nbKnownLabel;j-->0;) { +- +- LabelAddr known = jitc->knownLabel[j]; +- if (strcmp(known.label, used.label) == 0) { +- int *offset = (int*)&(jitc->memory[used.address]); +- *offset = known.address - used.address - 4; /* always using long offset */ +- break; +- } +- } +- } +- jitc->nbUsedLabel = jitc->nbKnownLabel = 0; +-} +diff -Naur /home/d4rk/goom2k4-0/src/jitc_x86.h /src/jitc_x86.h +--- /home/d4rk/goom2k4-0/src/jitc_x86.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/jitc_x86.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,214 +0,0 @@ +-/** +- * Copyright (c)2004 Jean-Christophe Hoelt +- */ +- +-#include +-#include +- +-#define JITC_MAXLABEL 1024 +-#define JITC_LABEL_SIZE 64 +- +-/** +- * low level macros +- */ +- +- /* {{{ Registres Generaux */ +-#define EAX 0 +-#define ECX 1 +-#define EDX 2 +-#define EBX 3 +-#define ESP 4 +-#define EBP 5 +-#define ESI 6 +-#define EDI 7 +- /* }}} */ +- /* {{{ Registres MMX */ +-#define MM0 0 +-#define MM1 1 +-#define MM2 2 +-#define MM3 3 +-#define MM4 4 +-#define MM5 5 +-#define MM6 6 +-#define MM7 7 +- /* }}} */ +- /* {{{ Registres SSE*/ +-#define XMM0 0 +-#define XMM1 1 +-#define XMM2 2 +-#define XMM3 3 +-#define XMM4 4 +-#define XMM5 5 +-#define XMM6 6 +-#define XMM7 7 +- /* }}} */ +- /* {{{ Alias aux registres */ +-#define R0 0 +-#define R1 1 +-#define R2 2 +-#define R3 3 +-#define R4 4 +-#define R5 5 +-#define R6 6 +-#define R7 7 +- /* }}} */ +- +- /* {{{ Conditions */ +-#define COND_OVERFLOW 0 +-#define COND_NO_OVERFLOW 1 +-#define COND_BELOW 2 +-#define COND_NOT_BELOW 3 +-#define COND_EQUAL 4 +-#define COND_ZERO 4 +-#define COND_NOT_EQUAL 5 +-#define COND_NOT_ZERO 5 +-#define COND_NOT_ABOVE 6 +-#define COND_ABOVE 7 +-#define COND_SIGN 8 +-#define COND_NOT_SIGN 9 +-#define COND_EVEN 10 +-#define COND_ODD 11 +-#define COND_LESS_THAN 12 +-#define COND_GREATER_EQUAL 13 +-#define COND_LESS_EQUAL 14 +-#define COND_GREATER_THAN 15 +- /* }}} */ +- +-typedef int (*JitcFunc)(void); +- +-typedef struct _LABEL_ADDR { +- char label[JITC_LABEL_SIZE]; +- int address; +-} LabelAddr; +- +-typedef struct _JITC_X86_ENV { +- unsigned char *_memory; +- unsigned char *memory; +- unsigned int used; +- +- int nbUsedLabel; +- int nbKnownLabel; +- LabelAddr *usedLabel; +- LabelAddr *knownLabel; +-} JitcX86Env; +- +-#define DISPLAY_GENCODE +-/*#define DISPLAY_GENCODE_HEXA*/ +- +-#ifdef DISPLAY_GENCODE_HEXA +- #define JITC_ADD_UCHAR(jitc,op) printf(" 0x%02x", op) && (jitc->memory[jitc->used++]=op) +-#else +- #define JITC_ADD_UCHAR(jitc,op) (jitc->memory[jitc->used++]=op) +-#endif +- +-#define JITC_ADD_USHORT(jitc,i) { JITC_ADD_UCHAR(jitc,i&0xff); JITC_ADD_UCHAR(jitc,(i>>8)&0xff); } +-#define JITC_ADD_UINT(jitc,i) { \ +- JITC_ADD_UCHAR(jitc,i&0xff); \ +- JITC_ADD_UCHAR(jitc,(i>>8)&0xff); \ +- JITC_ADD_UCHAR(jitc,(i>>16)&0xff); \ +- JITC_ADD_UCHAR(jitc,(i>>24)&0xff); \ +-} +-#define JITC_ADD_2UCHAR(jitc,op1,op2) {JITC_ADD_UCHAR(jitc,op1); JITC_ADD_UCHAR(jitc,op2);} +- +-#define JITC_MODRM(jitc,mod,reg,rm) { JITC_ADD_UCHAR(jitc,((int)mod<<6)|((int)reg<<3)|((int)rm)); } +- +-/* special values for R/M */ +-#define JITC_RM_DISP32 0x05 +- +-#define JITC_MOD_pREG_REG 0x00 +-#define JITC_MOD_disp8REG_REG 0x01 +-#define JITC_MOD_disp32REG_REG 0x02 +-#define JITC_MOD_REG_REG 0x03 +-/* cf 24319101 p.27 */ +- +-#define JITC_OP_REG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,0xc0+(src<<3)+dest); } +-#define JITC_OP_REG_pREG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(dest<<3)+src); } +-#define JITC_OP_pREG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(src<<3)+dest); } +- +-/** +- * "high" level macro +- */ +- +-#define JITC_LOAD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0xb8+reg); JITC_ADD_UINT(jitc,(int)(imm32)); } +-#define JITC_LOAD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x89,dest,src); } +- +-#define JITC_LOAD_REG_pREG(jitc,dest,src) { JITC_OP_REG_pREG(jitc,0x8b,dest,src); } +-#define JITC_LOAD_pREG_REG(jitc,dest,src) { JITC_OP_pREG_REG(jitc,0x89,dest,src); } +- +-#define JITC_DEC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x48+reg); } +-#define JITC_INC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x40+reg); } +- +-#define JITC_ADD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x01,dest,src); } +-#define JITC_ADD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0x81);\ +- JITC_ADD_UCHAR (jitc,0xc0+reg);\ +- JITC_ADD_UINT (jitc,(int)imm32); } +- +-#define JITC_AND_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x21,dest,src); } +-#define JITC_CMP_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x39,dest,src); } +-#define JITC_CMP_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81,0xf8+reg); \ +- JITC_ADD_UINT (jitc,(int)imm32); } +- +-#define JITC_IDIV_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xf8+reg); } +-#define JITC_IMUL_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xe8+reg); } +- +-/*#define JITC_SUB_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x29,dest,src); } +-#define JITC_SUB_EAX_IMM32(jitc,imm32) { JITC_ADD_UCHAR (jitc,0x2d); JITC_ADD_UINT(jitc,(int)imm32); } +-#define JITC_SUB_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81, 0xe8+reg);\ +- JITC_ADD_UINT (jitc,(int)imm32); }*/ +-#define JITC_SUB_REG_IMM8(jitc,reg,imm8) { JITC_ADD_2UCHAR (jitc,0x83, 0xe8+reg);\ +- JITC_ADD_UCHAR(jitc,imm8); } +- +-/* Floating points */ +- +-#define JITC_FLD_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ +- JITC_MODRM (jitc, 0x00, 0x00,JITC_RM_DISP32); \ +- JITC_ADD_UINT(jitc,(int)(address)); } +-#define JITC_FLD_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xD9, 0xC0+reg); } +- +-#define JITC_FST_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ +- JITC_MODRM (jitc, 0x00, 0x02,JITC_RM_DISP32); \ +- JITC_ADD_UINT(jitc,(int)(ADDRess)); } +-#define JITC_FST_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD0+reg); } +- +-#define JITC_FSTP_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ +- JITC_MODRM (jitc, 0x00, 0x03, JITC_RM_DISP32); \ +- JITC_ADD_UINT(jitc,(int)(address)); } +-#define JITC_FSTP_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD8+reg); } +- +-#define JITC_FADD +- +-/* Jumps */ +- +-#define JITC_ADD_LABEL(jitc,label) { jitc_add_known_label(jitc,label,jitc->used); } +- +-#define JITC_JUMP(jitc,offset) { JITC_ADD_UCHAR(jitc,0xe9); JITC_ADD_UINT(jitc,offset); } +-#define JITC_JUMP_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_JUMP(jitc,0); } +-#define JITC_JUMP_COND(jitc,cond,offset) { JITC_ADD_UCHAR(jitc,0x0f);\ +- JITC_ADD_UCHAR(jitc,0x80+cond);\ +- JITC_ADD_UINT(jitc,offset); } +-#define JITC_JUMP_COND_LABEL(jitc,cond,label) { jitc_add_used_label(jitc,label,jitc->used+2); JITC_JUMP_COND(jitc,cond,0); } +-#define JITC_CALL(jitc,function) { int __offset__ = (int)function - (int)(&jitc->memory[jitc->used+5]);\ +- JITC_ADD_UCHAR(jitc,0xe8); JITC_ADD_UINT(jitc,__offset__); } +-/*#define JITC_CALL_pREG(jitc,reg) { JITC_ADD_UCHAR(jitc,0xff); JITC_ADD_UCHAR(jitc,0xd0+reg); } +-#define JITC_CALL_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_CALL(jitc,0); }*/ +- +-/* save all registers (except EAX,ESP,EBP) */ +-#define JITC_PUSH_ALL(jitc) { jitc_add(jitc,"push ecx"); jitc_add(jitc,"push edx"); jitc_add(jitc,"push ebx"); \ +- jitc_add(jitc,"push esi"); jitc_add(jitc,"push edi"); } +- +-/* restore all registers (except EAX,ESP,EBP) */ +-#define JITC_POP_ALL(jitc) { jitc_add(jitc,"pop edi"); jitc_add(jitc,"pop esi"); jitc_add(jitc,"pop ebx"); \ +- jitc_add(jitc,"pop edx"); jitc_add(jitc,"pop ecx"); } +- +-/* public methods */ +-JitcX86Env *jitc_x86_env_new(int memory_size); +-JitcFunc jitc_prepare_func(JitcX86Env *jitc); +-void jitc_add(JitcX86Env *jitc, const char *instr, ...); +-void jitc_validate_func(JitcX86Env *jitc); +-void jitc_x86_delete(JitcX86Env *jitc); +- +- +-/* private methods */ +-void jitc_add_used_label(JitcX86Env *jitc, char *label, int where); +-void jitc_add_known_label(JitcX86Env *jitc, char *label, int where); +-void jitc_resolve_labels(JitcX86Env *jitc); +diff -Naur /home/d4rk/goom2k4-0/src/lines.c /src/lines.c +--- /home/d4rk/goom2k4-0/src/lines.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/lines.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,238 +0,0 @@ +-/* +- * lines.c +- */ +- +-#include "lines.h" +-#include +-#include +-#include +-#include "goom_tools.h" +-#include "drawmethods.h" +-#include "goom_plugin_info.h" +- +-static inline unsigned char lighten (unsigned char value, float power) +-{ +- int val = value; +- float t = (float) val * log10(power) / 2.0; +- +- if (t > 0) { +- val = (int) t; /* (32.0f * log (t)); */ +- if (val > 255) +- val = 255; +- if (val < 0) +- val = 0; +- return val; +- } +- else { +- return 0; +- } +-} +- +-static void lightencolor (guint32 *col, float power) +-{ +- unsigned char *color; +- +- color = (unsigned char *) col; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +-} +- +- +- +-static void +-genline (int id, float param, GMUnitPointer * l, int rx, int ry) +-{ +- int i; +- +- switch (id) { +- case GML_HLINE: +- for (i = 0; i < 512; i++) { +- l[i].x = ((float) i * rx) / 512.0f; +- l[i].y = param; +- l[i].angle = M_PI / 2.0f; +- } +- return; +- case GML_VLINE: +- for (i = 0; i < 512; i++) { +- l[i].y = ((float) i * ry) / 512.0f; +- l[i].x = param; +- l[i].angle = 0.0f; +- } +- return; +- case GML_CIRCLE: +- for (i = 0; i < 512; i++) { +- float cosa, sina; +- +- l[i].angle = 2.0f * M_PI * (float) i / 512.0f; +- cosa = param * cos (l[i].angle); +- sina = param * sin (l[i].angle); +- l[i].x = ((float) rx / 2.0f) + cosa; +- l[i].y = (float) ry / 2.0f + sina; +- } +- return; +- } +-} +- +-static guint32 getcouleur (int mode) +-{ +- switch (mode) { +- case GML_RED: +- return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8)); +- case GML_ORANGE_J: +- return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8)); +- case GML_ORANGE_V: +- return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8)); +- case GML_BLEUBLANC: +- return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8)); +- case GML_VERT: +- return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8)); +- case GML_BLEU: +- return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8)); +- case GML_BLACK: +- return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8)); +- } +- return 0; +-} +- +-void +-goom_lines_set_res (GMLine * gml, int rx, int ry) +-{ +- if (gml != NULL) { +- gml->screenX = rx; +- gml->screenY = ry; +- +- genline (gml->IDdest, gml->param, gml->points2, rx, ry); +- } +-} +- +- +-static void +-goom_lines_move (GMLine * l) +-{ +- int i; +- unsigned char *c1, *c2; +- +- for (i = 0; i < 512; i++) { +- l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f; +- l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f; +- l->points[i].angle = +- (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f; +- } +- +- c1 = (unsigned char *) &l->color; +- c2 = (unsigned char *) &l->color2; +- for (i = 0; i < 4; i++) { +- int cc1, cc2; +- +- cc1 = *c1; +- cc2 = *c2; +- *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6); +- ++c1; +- ++c2; +- } +- +- l->power += l->powinc; +- if (l->power < 1.1f) { +- l->power = 1.1f; +- l->powinc = (float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; +- } +- if (l->power > 17.5f) { +- l->power = 17.5f; +- l->powinc = -(float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; +- } +- +- l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f; +-} +- +-void +-goom_lines_switch_to (GMLine * gml, int IDdest, +- float param, float amplitude, int col) +-{ +- genline (IDdest, param, gml->points2, gml->screenX, gml->screenY); +- gml->IDdest = IDdest; +- gml->param = param; +- gml->amplitudeF = amplitude; +- gml->color2 = getcouleur (col); +-} +- +-GMLine * +-goom_lines_init (PluginInfo *goomInfo, int rx, int ry, +- int IDsrc, float paramS, int coulS, +- int IDdest, float paramD, int coulD) +-{ +- GMLine *l = (GMLine *) malloc (sizeof (GMLine)); +- +- l->goomInfo = goomInfo; +- +- l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); +- l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); +- l->nbPoints = 512; +- +- l->IDdest = IDdest; +- l->param = paramD; +- +- l->amplitude = l->amplitudeF = 1.0f; +- +- genline (IDsrc, paramS, l->points, rx, ry); +- genline (IDdest, paramD, l->points2, rx, ry); +- +- l->color = getcouleur (coulS); +- l->color2 = getcouleur (coulD); +- +- l->screenX = rx; +- l->screenY = ry; +- +- l->power = 0.0f; +- l->powinc = 0.01f; +- +- goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD); +- +- return l; +-} +- +-void +-goom_lines_free (GMLine ** l) +-{ +- free ((*l)->points); +- free (*l); +- l = NULL; +-} +- +-void goom_lines_draw (PluginInfo *plug, GMLine * line, gint16 data[512], Pixel *p) +-{ +- if (line != NULL) { +- int i, x1, y1; +- guint32 color = line->color; +- GMUnitPointer *pt = &(line->points[0]); +- +- float cosa = cos (pt->angle) / 1000.0f; +- float sina = sin (pt->angle) / 1000.0f; +- +- lightencolor (&color, line->power); +- +- x1 = (int) (pt->x + cosa * line->amplitude * data[0]); +- y1 = (int) (pt->y + sina * line->amplitude * data[0]); +- +- for (i = 1; i < 512; i++) { +- int x2, y2; +- GMUnitPointer *pt = &(line->points[i]); +- +- float cosa = cos (pt->angle) / 1000.0f; +- float sina = sin (pt->angle) / 1000.0f; +- +- x2 = (int) (pt->x + cosa * line->amplitude * data[i]); +- y2 = (int) (pt->y + sina * line->amplitude * data[i]); +- +- plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, line->screenY); +- +- x1 = x2; +- y1 = y2; +- } +- goom_lines_move (line); +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/lines.h /src/lines.h +--- /home/d4rk/goom2k4-0/src/lines.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/lines.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,81 +0,0 @@ +-#ifndef _LINES_H +-#define _LINES_H +- +-/* +- * lines.h +- * Goom +- * Copyright (c) 2000-2003 iOS-software. All rights reserved. +- */ +- +-#include "goom_typedefs.h" +-#include "goom_graphic.h" +-#include "goom_config.h" +- +-struct _GMUNITPOINTER +-{ +- float x; +- float y; +- float angle; +-}; +- +-/* tableau de points */ +-struct _GMLINE +-{ +- +- GMUnitPointer *points; +- GMUnitPointer *points2; +- int IDdest; +- float param; +- float amplitudeF; +- float amplitude; +- +- int nbPoints; +- guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */ +- guint32 color2; +- +- int screenX; +- int screenY; +- +- float power; +- float powinc; +- +- PluginInfo *goomInfo; +-}; +- +-/* les ID possibles */ +- +-#define GML_CIRCLE 0 +-/* (param = radius) */ +- +-#define GML_HLINE 1 +-/* (param = y) */ +- +-#define GML_VLINE 2 +-/* (param = x) */ +- +-/* les modes couleur possible (si tu mets un autre c'est noir) */ +- +-#define GML_BLEUBLANC 0 +-#define GML_RED 1 +-#define GML_ORANGE_V 2 +-#define GML_ORANGE_J 3 +-#define GML_VERT 4 +-#define GML_BLEU 5 +-#define GML_BLACK 6 +- +-/* construit un effet de line (une ligne horitontale pour commencer) */ +-GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry, +- int IDsrc, float paramS, int modeCoulSrc, +- int IDdest, float paramD, int modeCoulDest); +- +-void goom_lines_switch_to (GMLine * gml, int IDdest, float param, +- float amplitude, +- int modeCoul); +- +-void goom_lines_set_res (GMLine * gml, int rx, int ry); +- +-void goom_lines_free (GMLine ** gml); +- +-void goom_lines_draw (PluginInfo *plugInfo, GMLine * gml, gint16 data[512], Pixel *p); +- +-#endif /* _LINES_H */ +diff -Naur /home/d4rk/goom2k4-0/src/Makefile.am /src/Makefile.am +--- /home/d4rk/goom2k4-0/src/Makefile.am 2005-02-07 06:46:41.000000000 -0700 ++++ /src/Makefile.am 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-# libgoom2 +- +-if HAVE_MMX +-MMX_FILES=mmx.c xmmx.c +-else +-MMX_FILES= +-endif +- +-if HAVE_PPC +-PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s +-else +-PPC_FILES= +-endif +- +-goom2_lib_LTLIBRARIES = libgoom2.la +-goom2_libdir = $(libdir) +- +-goom2_library_includedir=$(includedir)/goom +-goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h +-libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*" +-libgoom2_la_SOURCES = \ +- goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \ +- goom_tools.c $(MMX_FILES) $(PPC_FILES) \ +- config_param.c convolve_fx.c filters.c \ +- flying_stars_fx.c gfontlib.c gfontrle.c \ +- goom_core.c graphic.c ifs.c lines.c \ +- mathtools.c sound_tester.c surf3d.c \ +- tentacle3d.c plugin_info.c \ +- v3d.c drawmethods.c \ +- cpu_info.c +- +-AM_YFLAGS=-d +- +-noinst_HEADERS = mmx.h +diff -Naur /home/d4rk/goom2k4-0/src/Makefile.in /src/Makefile.in +--- /home/d4rk/goom2k4-0/src/Makefile.in 2005-02-07 06:49:26.000000000 -0700 ++++ /src/Makefile.in 1969-12-31 17:00:00.000000000 -0700 +@@ -1,621 +0,0 @@ +-# Makefile.in generated by automake 1.9.4 from Makefile.am. +-# @configure_input@ +- +-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. +-# This Makefile.in is free software; the Free Software Foundation +-# gives unlimited permission to copy and/or distribute it, +-# with or without modifications, as long as this notice is preserved. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +-# PARTICULAR PURPOSE. +- +-@SET_MAKE@ +- +-# libgoom2 +- +- +-SOURCES = $(libgoom2_la_SOURCES) +- +-srcdir = @srcdir@ +-top_srcdir = @top_srcdir@ +-VPATH = @srcdir@ +-pkgdatadir = $(datadir)/@PACKAGE@ +-pkglibdir = $(libdir)/@PACKAGE@ +-pkgincludedir = $(includedir)/@PACKAGE@ +-top_builddir = .. +-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +-INSTALL = @INSTALL@ +-install_sh_DATA = $(install_sh) -c -m 644 +-install_sh_PROGRAM = $(install_sh) -c +-install_sh_SCRIPT = $(install_sh) -c +-INSTALL_HEADER = $(INSTALL_DATA) +-transform = $(program_transform_name) +-NORMAL_INSTALL = : +-PRE_INSTALL = : +-POST_INSTALL = : +-NORMAL_UNINSTALL = : +-PRE_UNINSTALL = : +-POST_UNINSTALL = : +-build_triplet = @build@ +-host_triplet = @host@ +-subdir = src +-DIST_COMMON = $(goom2_library_include_HEADERS) $(noinst_HEADERS) \ +- $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO goomsl_lex.c \ +- goomsl_yacc.c goomsl_yacc.h +-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-am__aclocal_m4_deps = $(top_srcdir)/m4/sdl.m4 $(top_srcdir)/m4/xmms.m4 \ +- $(top_srcdir)/configure.in +-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ +- $(ACLOCAL_M4) +-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +-CONFIG_CLEAN_FILES = +-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +-am__vpath_adj = case $$p in \ +- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ +- *) f=$$p;; \ +- esac; +-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +-am__installdirs = "$(DESTDIR)$(goom2_libdir)" \ +- "$(DESTDIR)$(goom2_library_includedir)" +-goom2_libLTLIBRARIES_INSTALL = $(INSTALL) +-LTLIBRARIES = $(goom2_lib_LTLIBRARIES) +-libgoom2_la_LIBADD = +-am__libgoom2_la_SOURCES_DIST = goomsl_yacc.y goomsl_lex.l goomsl.c \ +- goomsl_hash.c goomsl_heap.c goom_tools.c mmx.c xmmx.c \ +- ppc_zoom_ultimate.s ppc_drawings.s config_param.c \ +- convolve_fx.c filters.c flying_stars_fx.c gfontlib.c \ +- gfontrle.c goom_core.c graphic.c ifs.c lines.c mathtools.c \ +- sound_tester.c surf3d.c tentacle3d.c plugin_info.c v3d.c \ +- drawmethods.c cpu_info.c +-@HAVE_MMX_TRUE@am__objects_1 = mmx.lo xmmx.lo +-@HAVE_PPC_TRUE@am__objects_2 = ppc_zoom_ultimate.lo ppc_drawings.lo +-am_libgoom2_la_OBJECTS = goomsl_yacc.lo goomsl_lex.lo goomsl.lo \ +- goomsl_hash.lo goomsl_heap.lo goom_tools.lo $(am__objects_1) \ +- $(am__objects_2) config_param.lo convolve_fx.lo filters.lo \ +- flying_stars_fx.lo gfontlib.lo gfontrle.lo goom_core.lo \ +- graphic.lo ifs.lo lines.lo mathtools.lo sound_tester.lo \ +- surf3d.lo tentacle3d.lo plugin_info.lo v3d.lo drawmethods.lo \ +- cpu_info.lo +-libgoom2_la_OBJECTS = $(am_libgoom2_la_OBJECTS) +-DEFAULT_INCLUDES = -I. -I$(srcdir) +-depcomp = $(SHELL) $(top_srcdir)/depcomp +-am__depfiles_maybe = depfiles +-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ +- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ +- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ +- $(AM_CFLAGS) $(CFLAGS) +-CCLD = $(CC) +-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +- $(AM_LDFLAGS) $(LDFLAGS) -o $@ +-LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) +-LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +-CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS) +-LTCCASCOMPILE = $(LIBTOOL) --mode=compile $(CCAS) $(AM_CCASFLAGS) \ +- $(CCASFLAGS) +-YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) +-LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \ +- $(AM_YFLAGS) +-SOURCES = $(libgoom2_la_SOURCES) +-DIST_SOURCES = $(am__libgoom2_la_SOURCES_DIST) +-goom2_library_includeHEADERS_INSTALL = $(INSTALL_HEADER) +-HEADERS = $(goom2_library_include_HEADERS) $(noinst_HEADERS) +-ETAGS = etags +-CTAGS = ctags +-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +-ACLOCAL = @ACLOCAL@ +-AMDEP_FALSE = @AMDEP_FALSE@ +-AMDEP_TRUE = @AMDEP_TRUE@ +-AMTAR = @AMTAR@ +-AR = @AR@ +-AUTOCONF = @AUTOCONF@ +-AUTOHEADER = @AUTOHEADER@ +-AUTOMAKE = @AUTOMAKE@ +-AWK = @AWK@ +-CC = @CC@ +-CCAS = @CCAS@ +-CCASFLAGS = @CCASFLAGS@ +-CCDEPMODE = @CCDEPMODE@ +-CFLAGS = @CFLAGS@ +-CPP = @CPP@ +-CPPFLAGS = @CPPFLAGS@ +-CXX = @CXX@ +-CXXCPP = @CXXCPP@ +-CXXDEPMODE = @CXXDEPMODE@ +-CXXFLAGS = @CXXFLAGS@ +-CYGPATH_W = @CYGPATH_W@ +-DEFS = @DEFS@ +-DEPDIR = @DEPDIR@ +-ECHO = @ECHO@ +-ECHO_C = @ECHO_C@ +-ECHO_N = @ECHO_N@ +-ECHO_T = @ECHO_T@ +-EGREP = @EGREP@ +-EXEEXT = @EXEEXT@ +-F77 = @F77@ +-FFLAGS = @FFLAGS@ +-HAVE_MMX_FALSE = @HAVE_MMX_FALSE@ +-HAVE_MMX_TRUE = @HAVE_MMX_TRUE@ +-HAVE_PPC_FALSE = @HAVE_PPC_FALSE@ +-HAVE_PPC_TRUE = @HAVE_PPC_TRUE@ +-HAVE_SDL_FALSE = @HAVE_SDL_FALSE@ +-HAVE_SDL_TRUE = @HAVE_SDL_TRUE@ +-HAVE_XMMS_FALSE = @HAVE_XMMS_FALSE@ +-HAVE_XMMS_TRUE = @HAVE_XMMS_TRUE@ +-INSTALL_DATA = @INSTALL_DATA@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ +-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +-LDFLAGS = @LDFLAGS@ +-LEX = @LEX@ +-LEXLIB = @LEXLIB@ +-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +-LIBOBJS = @LIBOBJS@ +-LIBS = @LIBS@ +-LIBTOOL = @LIBTOOL@ +-LN_S = @LN_S@ +-LTLIBOBJS = @LTLIBOBJS@ +-MACFOLDER = @MACFOLDER@ +-MACTARGET_FALSE = @MACTARGET_FALSE@ +-MACTARGET_TRUE = @MACTARGET_TRUE@ +-MAKEINFO = @MAKEINFO@ +-OBJEXT = @OBJEXT@ +-PACKAGE = @PACKAGE@ +-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +-PACKAGE_NAME = @PACKAGE_NAME@ +-PACKAGE_STRING = @PACKAGE_STRING@ +-PACKAGE_TARNAME = @PACKAGE_TARNAME@ +-PACKAGE_VERSION = @PACKAGE_VERSION@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ +-PTHREAD_LIBS = @PTHREAD_LIBS@ +-RANLIB = @RANLIB@ +-SDL_CFLAGS = @SDL_CFLAGS@ +-SDL_CONFIG = @SDL_CONFIG@ +-SDL_LIBS = @SDL_LIBS@ +-SET_MAKE = @SET_MAKE@ +-SHELL = @SHELL@ +-STRIP = @STRIP@ +-VERSION = @VERSION@ +-XMMS_CFLAGS = @XMMS_CFLAGS@ +-XMMS_CONFIG = @XMMS_CONFIG@ +-XMMS_DATA_DIR = @XMMS_DATA_DIR@ +-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@ +-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@ +-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@ +-XMMS_LIBS = @XMMS_LIBS@ +-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@ +-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@ +-XMMS_VERSION = @XMMS_VERSION@ +-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@ +-YACC = @YACC@ +-ac_ct_AR = @ac_ct_AR@ +-ac_ct_CC = @ac_ct_CC@ +-ac_ct_CXX = @ac_ct_CXX@ +-ac_ct_F77 = @ac_ct_F77@ +-ac_ct_RANLIB = @ac_ct_RANLIB@ +-ac_ct_STRIP = @ac_ct_STRIP@ +-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +-am__include = @am__include@ +-am__leading_dot = @am__leading_dot@ +-am__quote = @am__quote@ +-am__tar = @am__tar@ +-am__untar = @am__untar@ +-bindir = @bindir@ +-build = @build@ +-build_alias = @build_alias@ +-build_cpu = @build_cpu@ +-build_os = @build_os@ +-build_vendor = @build_vendor@ +-datadir = @datadir@ +-exec_prefix = @exec_prefix@ +-host = @host@ +-host_alias = @host_alias@ +-host_cpu = @host_cpu@ +-host_os = @host_os@ +-host_vendor = @host_vendor@ +-includedir = @includedir@ +-infodir = @infodir@ +-install_sh = @install_sh@ +-libdir = @libdir@ +-libexecdir = @libexecdir@ +-localstatedir = @localstatedir@ +-mandir = @mandir@ +-mkdir_p = @mkdir_p@ +-oldincludedir = @oldincludedir@ +-prefix = @prefix@ +-program_transform_name = @program_transform_name@ +-sbindir = @sbindir@ +-sharedstatedir = @sharedstatedir@ +-sysconfdir = @sysconfdir@ +-target_alias = @target_alias@ +-@HAVE_MMX_FALSE@MMX_FILES = +-@HAVE_MMX_TRUE@MMX_FILES = mmx.c xmmx.c +-@HAVE_PPC_FALSE@PPC_FILES = +-@HAVE_PPC_TRUE@PPC_FILES = ppc_zoom_ultimate.s ppc_drawings.s +-goom2_lib_LTLIBRARIES = libgoom2.la +-goom2_libdir = $(libdir) +-goom2_library_includedir = $(includedir)/goom +-goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h +-libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*" +-libgoom2_la_SOURCES = \ +- goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \ +- goom_tools.c $(MMX_FILES) $(PPC_FILES) \ +- config_param.c convolve_fx.c filters.c \ +- flying_stars_fx.c gfontlib.c gfontrle.c \ +- goom_core.c graphic.c ifs.c lines.c \ +- mathtools.c sound_tester.c surf3d.c \ +- tentacle3d.c plugin_info.c \ +- v3d.c drawmethods.c \ +- cpu_info.c +- +-AM_YFLAGS = -d +-noinst_HEADERS = mmx.h +-all: all-am +- +-.SUFFIXES: +-.SUFFIXES: .c .l .lo .o .obj .s .y +-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) +- @for dep in $?; do \ +- case '$(am__configure_deps)' in \ +- *$$dep*) \ +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ +- && exit 0; \ +- exit 1;; \ +- esac; \ +- done; \ +- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ +- cd $(top_srcdir) && \ +- $(AUTOMAKE) --foreign src/Makefile +-.PRECIOUS: Makefile +-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +- @case '$?' in \ +- *config.status*) \ +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ +- *) \ +- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ +- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ +- esac; +- +-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +- +-$(top_srcdir)/configure: $(am__configure_deps) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +-$(ACLOCAL_M4): $(am__aclocal_m4_deps) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +-install-goom2_libLTLIBRARIES: $(goom2_lib_LTLIBRARIES) +- @$(NORMAL_INSTALL) +- test -z "$(goom2_libdir)" || $(mkdir_p) "$(DESTDIR)$(goom2_libdir)" +- @list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \ +- if test -f $$p; then \ +- f=$(am__strip_dir) \ +- echo " $(LIBTOOL) --mode=install $(goom2_libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(goom2_libdir)/$$f'"; \ +- $(LIBTOOL) --mode=install $(goom2_libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(goom2_libdir)/$$f"; \ +- else :; fi; \ +- done +- +-uninstall-goom2_libLTLIBRARIES: +- @$(NORMAL_UNINSTALL) +- @set -x; list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \ +- p=$(am__strip_dir) \ +- echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(goom2_libdir)/$$p'"; \ +- $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(goom2_libdir)/$$p"; \ +- done +- +-clean-goom2_libLTLIBRARIES: +- -test -z "$(goom2_lib_LTLIBRARIES)" || rm -f $(goom2_lib_LTLIBRARIES) +- @list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \ +- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ +- test "$$dir" != "$$p" || dir=.; \ +- echo "rm -f \"$${dir}/so_locations\""; \ +- rm -f "$${dir}/so_locations"; \ +- done +-goomsl_yacc.h: goomsl_yacc.c +- @if test ! -f $@; then \ +- rm -f goomsl_yacc.c; \ +- $(MAKE) goomsl_yacc.c; \ +- else :; fi +-libgoom2.la: $(libgoom2_la_OBJECTS) $(libgoom2_la_DEPENDENCIES) +- $(LINK) -rpath $(goom2_libdir) $(libgoom2_la_LDFLAGS) $(libgoom2_la_OBJECTS) $(libgoom2_la_LIBADD) $(LIBS) +- +-mostlyclean-compile: +- -rm -f *.$(OBJEXT) +- +-distclean-compile: +- -rm -f *.tab.c +- +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config_param.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convolve_fx.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu_info.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drawmethods.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filters.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flying_stars_fx.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfontlib.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfontrle.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goom_core.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goom_tools.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_hash.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_heap.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_lex.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_yacc.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphic.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ifs.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lines.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathtools.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmx.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_info.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound_tester.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/surf3d.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tentacle3d.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v3d.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmmx.Plo@am__quote@ +- +-.c.o: +-@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(COMPILE) -c $< +- +-.c.obj: +-@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +- +-.c.lo: +-@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +- +-.l.c: +- $(LEXCOMPILE) $< +- sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@ +- rm -f $(LEX_OUTPUT_ROOT).c +- +-.s.o: +- $(CCASCOMPILE) -c $< +- +-.s.obj: +- $(CCASCOMPILE) -c `$(CYGPATH_W) '$<'` +- +-.s.lo: +- $(LTCCASCOMPILE) -c -o $@ $< +- +-.y.c: +- $(YACCCOMPILE) $< +- if test -f y.tab.h; then \ +- to=`echo "$*_H" | sed \ +- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ +- -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \ +- sed -e "/^#/!b" -e "s/Y_TAB_H/$$to/g" -e "s|y\.tab\.h|$*.h|" \ +- y.tab.h >$*.ht; \ +- rm -f y.tab.h; \ +- if cmp -s $*.ht $*.h; then \ +- rm -f $*.ht ;\ +- else \ +- mv $*.ht $*.h; \ +- fi; \ +- fi +- if test -f y.output; then \ +- mv y.output $*.output; \ +- fi +- sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@ +- rm -f y.tab.c +- +-mostlyclean-libtool: +- -rm -f *.lo +- +-clean-libtool: +- -rm -rf .libs _libs +- +-distclean-libtool: +- -rm -f libtool +-uninstall-info-am: +-install-goom2_library_includeHEADERS: $(goom2_library_include_HEADERS) +- @$(NORMAL_INSTALL) +- test -z "$(goom2_library_includedir)" || $(mkdir_p) "$(DESTDIR)$(goom2_library_includedir)" +- @list='$(goom2_library_include_HEADERS)'; for p in $$list; do \ +- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ +- f=$(am__strip_dir) \ +- echo " $(goom2_library_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(goom2_library_includedir)/$$f'"; \ +- $(goom2_library_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(goom2_library_includedir)/$$f"; \ +- done +- +-uninstall-goom2_library_includeHEADERS: +- @$(NORMAL_UNINSTALL) +- @list='$(goom2_library_include_HEADERS)'; for p in $$list; do \ +- f=$(am__strip_dir) \ +- echo " rm -f '$(DESTDIR)$(goom2_library_includedir)/$$f'"; \ +- rm -f "$(DESTDIR)$(goom2_library_includedir)/$$f"; \ +- done +- +-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- mkid -fID $$unique +-tags: TAGS +- +-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- tags=; \ +- here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ +- test -n "$$unique" || unique=$$empty_fix; \ +- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +- $$tags $$unique; \ +- fi +-ctags: CTAGS +-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- tags=; \ +- here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- test -z "$(CTAGS_ARGS)$$tags$$unique" \ +- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ +- $$tags $$unique +- +-GTAGS: +- here=`$(am__cd) $(top_builddir) && pwd` \ +- && cd $(top_srcdir) \ +- && gtags -i $(GTAGS_ARGS) $$here +- +-distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +- +-distdir: $(DISTFILES) +- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ +- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ +- list='$(DISTFILES)'; for file in $$list; do \ +- case $$file in \ +- $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ +- $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ +- esac; \ +- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ +- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ +- if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +- dir="/$$dir"; \ +- $(mkdir_p) "$(distdir)$$dir"; \ +- else \ +- dir=''; \ +- fi; \ +- if test -d $$d/$$file; then \ +- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ +- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ +- fi; \ +- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ +- else \ +- test -f $(distdir)/$$file \ +- || cp -p $$d/$$file $(distdir)/$$file \ +- || exit 1; \ +- fi; \ +- done +-check-am: all-am +-check: check-am +-all-am: Makefile $(LTLIBRARIES) $(HEADERS) +-installdirs: +- for dir in "$(DESTDIR)$(goom2_libdir)" "$(DESTDIR)$(goom2_library_includedir)"; do \ +- test -z "$$dir" || $(mkdir_p) "$$dir"; \ +- done +-install: install-am +-install-exec: install-exec-am +-install-data: install-data-am +-uninstall: uninstall-am +- +-install-am: all-am +- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +- +-installcheck: installcheck-am +-install-strip: +- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +- `test -z '$(STRIP)' || \ +- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +-mostlyclean-generic: +- +-clean-generic: +- +-distclean-generic: +- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) +- +-maintainer-clean-generic: +- @echo "This command is intended for maintainers to use" +- @echo "it deletes files that may require special tools to rebuild." +- -rm -f goomsl_lex.c +- -rm -f goomsl_yacc.c +- -rm -f goomsl_yacc.h +-clean: clean-am +- +-clean-am: clean-generic clean-goom2_libLTLIBRARIES clean-libtool \ +- mostlyclean-am +- +-distclean: distclean-am +- -rm -rf ./$(DEPDIR) +- -rm -f Makefile +-distclean-am: clean-am distclean-compile distclean-generic \ +- distclean-libtool distclean-tags +- +-dvi: dvi-am +- +-dvi-am: +- +-html: html-am +- +-info: info-am +- +-info-am: +- +-install-data-am: install-goom2_libLTLIBRARIES \ +- install-goom2_library_includeHEADERS +- +-install-exec-am: +- +-install-info: install-info-am +- +-install-man: +- +-installcheck-am: +- +-maintainer-clean: maintainer-clean-am +- -rm -rf ./$(DEPDIR) +- -rm -f Makefile +-maintainer-clean-am: distclean-am maintainer-clean-generic +- +-mostlyclean: mostlyclean-am +- +-mostlyclean-am: mostlyclean-compile mostlyclean-generic \ +- mostlyclean-libtool +- +-pdf: pdf-am +- +-pdf-am: +- +-ps: ps-am +- +-ps-am: +- +-uninstall-am: uninstall-goom2_libLTLIBRARIES \ +- uninstall-goom2_library_includeHEADERS uninstall-info-am +- +-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ +- clean-goom2_libLTLIBRARIES clean-libtool ctags distclean \ +- distclean-compile distclean-generic distclean-libtool \ +- distclean-tags distdir dvi dvi-am html html-am info info-am \ +- install install-am install-data install-data-am install-exec \ +- install-exec-am install-goom2_libLTLIBRARIES \ +- install-goom2_library_includeHEADERS install-info \ +- install-info-am install-man install-strip installcheck \ +- installcheck-am installdirs maintainer-clean \ +- maintainer-clean-generic mostlyclean mostlyclean-compile \ +- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ +- tags uninstall uninstall-am uninstall-goom2_libLTLIBRARIES \ +- uninstall-goom2_library_includeHEADERS uninstall-info-am +- +-# Tell versions [3.59,3.63) of GNU make to not export all variables. +-# Otherwise a system limit (for SysV at least) may be exceeded. +-.NOEXPORT: +diff -Naur /home/d4rk/goom2k4-0/src/mathtools.c /src/mathtools.c +--- /home/d4rk/goom2k4-0/src/mathtools.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mathtools.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,84 +0,0 @@ +-/*---------------------------------------------------------------------------*/ +-/* +-** mathtools.c +-** Goom Project +-** +-** Created by Jeko on Sun Jul 20 2003 +- ** Copyright (c) 2003 iOS. All rights reserved. +-*/ +-/*---------------------------------------------------------------------------*/ +- +-#include "mathtools.h" +- +-float sin256[256] = { +- 0,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 +- ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 +- ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 +- ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 +- ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 +- ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 +- ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 +- ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 +- ,1,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 +- ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 +- ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 +- ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 +- ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 +- ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 +- ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 +- ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 +- ,1.22465e-16,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 +- ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 +- ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 +- ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 +- ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 +- ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 +- ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 +- ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 +- ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 +- ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 +- ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 +- ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 +- ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 +- ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 +- ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 +- ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 +- +-}; +- +-float cos256[256] = { +- 0,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 +- ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 +- ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 +- ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 +- ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 +- ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 +- ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 +- ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 +- ,6.12323e-17,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 +- ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 +- ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 +- ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 +- ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 +- ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 +- ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 +- ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 +- ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 +- ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 +- ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 +- ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 +- ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 +- ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 +- ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 +- ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 +- ,-1.83697e-16,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 +- ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 +- ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 +- ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 +- ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 +- ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 +- ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 +- ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 +- +-}; +- +diff -Naur /home/d4rk/goom2k4-0/src/mathtools.h /src/mathtools.h +--- /home/d4rk/goom2k4-0/src/mathtools.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mathtools.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,36 +0,0 @@ +-#ifndef MATHTOOLS_H +-#define MATHTOOLS_H +- +- +-#define _double2fixmagic (68719476736.0*1.5) +-/* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */ +-#define _shiftamt 16 +-/* 16.16 fixed point representation */ +- +-#if BigEndian_ +-#define iexp_ 0 +-#define iman_ 1 +-#else +-#define iexp_ 1 +-#define iman_ 0 +-#endif /* BigEndian_ */ +- +-/* TODO: this optimization is very efficient: put it again when all works +-#ifdef HAVE_MMX +-#define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;} +-#else*/ +-#define F2I(dbl,i) i=(int)dbl; +-/*#endif*/ +- +-#if 0 +-#define SINCOS(f,s,c) \ +- __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f)) +-#else +-#define SINCOS(f,s,c) {s=sin(f);c=cos(f);} +-#endif +- +-extern float sin256[256]; +-extern float cos256[256]; +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/mmx.c /src/mmx.c +--- /home/d4rk/goom2k4-0/src/mmx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mmx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,275 +0,0 @@ +-#ifdef HAVE_MMX +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#include "mmx.h" +-#include "goom_graphic.h" +- +-#define sqrtperte 16 +-// faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +-// faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +- +-int mmx_supported (void) { +- return (mm_support()&0x1); +-} +- +-void zoom_filter_mmx (int prevX, int prevY, +- Pixel *expix1, Pixel *expix2, +- int *brutS, int *brutD, int buffratio, +- int precalCoef[16][16]) +-{ +- unsigned int ax = (prevX-1)<> BUFFPOINTNB); +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB); +- +- if ((py>=ay) || (px>=ax)) { +- pos=coeffs=0; +- } +- else { +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- // coef en modulo 15 +- coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; +- } +- +- __asm__ __volatile__ ( +- "movd %2, %%mm6 \n\t" +- +- /* recuperation des deux premiers pixels dans mm0 et mm1 */ +- "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* depackage du premier pixel */ +- "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */ +- +- "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */ +- /* depackage du 2ieme pixel */ +- "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */ +- +- /* extraction des coefficients... */ +- "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +- "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +- "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- +- "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */ +- "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +- "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- "paddw %%mm1, %%mm0 \n\t" +- +- /* ...extraction des 2 derniers coefficients */ +- "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */ +- "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* ajouter la longueur de ligne a esi */ +- "addl 8(%%ebp),%1 \n\t" +- +- /* recuperation des 2 derniers pixels */ +- "movq (%3,%1,4), %%mm1 \n\t" +- "movq %%mm1, %%mm2 \n\t" +- +- /* depackage des pixels */ +- "punpcklbw %%mm7, %%mm1 \n\t" +- "punpckhbw %%mm7, %%mm2 \n\t" +- +- /* multiplication pas les coeffs */ +- "pmullw %%mm4, %%mm1 \n\t" +- "pmullw %%mm5, %%mm2 \n\t" +- +- /* ajout des valeurs obtenues la valeur finale */ +- "paddw %%mm1, %%mm0 \n\t" +- "paddw %%mm2, %%mm0 \n\t" +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +- "psrlw $8, %%mm0 \n\t" +- "packuswb %%mm7, %%mm0 \n\t" +- +- "movd %%mm0,%0 \n\t" +- :"=g"(expix2[loop]) +- :"r"(pos),"r"(coeffs),"r"(expix1) +- +- ); +- +- emms(); +- } +-} +- +-#define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \ +-{ \ +- movd_m2r(_backbuf, mm0); \ +- paddusb_m2r(_col, mm0); \ +- movd_r2m(mm0, _out); \ +-} +- +-#define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col) +- +-void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +-{ +- int x, y, dx, dy, yy, xx; +- Pixel *p; +- +- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) +- goto end_of_line; +- +- dx = x2 - x1; +- dy = y2 - y1; +- if (x1 >= x2) { +- int tmp; +- +- tmp = x1; +- x1 = x2; +- x2 = tmp; +- tmp = y1; +- y1 = y2; +- y2 = tmp; +- dx = x2 - x1; +- dy = y2 - y1; +- } +- +- /* vertical line */ +- if (dx == 0) { +- if (y1 < y2) { +- p = &(data[(screenx * y1) + x1]); +- for (y = y1; y <= y2; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- else { +- p = &(data[(screenx * y2) + x1]); +- for (y = y2; y <= y1; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- goto end_of_line; +- } +- /* horizontal line */ +- if (dy == 0) { +- if (x1 < x2) { +- p = &(data[(screenx * y1) + x1]); +- for (x = x1; x <= x2; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- else { +- p = &(data[(screenx * y1) + x2]); +- for (x = x2; x <= x1; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- } +- /* 1 */ +- /* \ */ +- /* \ */ +- /* 2 */ +- if (y2 > y1) { +- /* steep */ +- if (dy > dx) { +- dx = ((dx << 16) / dy); +- x = x1 << 16; +- for (y = y1; y <= y2; y++) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p++; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- } +- } +- /* 2 */ +- /* / */ +- /* / */ +- /* 1 */ +- else { +- /* steep */ +- if (-dy > dx) { +- dx = ((dx << 16) / -dy); +- x = (x1 + 1) << 16; +- for (y = y1; y >= y2; y--) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p--; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- goto end_of_line; +- } +- } +-end_of_line: +- emms(); +- /* __asm__ __volatile__ ("emms"); */ +-} +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/mmx.h /src/mmx.h +--- /home/d4rk/goom2k4-0/src/mmx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mmx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,729 +0,0 @@ +-/* mmx.h +- +- MultiMedia eXtensions GCC interface library for IA32. +- +- To use this library, simply include this header file +- and compile with GCC. You MUST have inlining enabled +- in order for mmx_ok() to work; this can be done by +- simply using -O on the GCC command line. +- +- Compiling with -DMMX_TRACE will cause detailed trace +- output to be sent to stderr for each mmx operation. +- This adds lots of code, and obviously slows execution to +- a crawl, but can be very useful for debugging. +- +- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY +- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT +- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY +- AND FITNESS FOR ANY PARTICULAR PURPOSE. +- +- 1997-99 by H. Dietz and R. Fisher +- +- Notes: +- It appears that the latest gas has the pand problem fixed, therefore +- I'll undefine BROKEN_PAND by default. +-*/ +- +-#ifndef _MMX_H +-#define _MMX_H +- +-#include "goom_graphic.h" +- +-/* Warning: at this writing, the version of GAS packaged +- with most Linux distributions does not handle the +- parallel AND operation mnemonic correctly. If the +- symbol BROKEN_PAND is defined, a slower alternative +- coding will be used. If execution of mmxtest results +- in an illegal instruction fault, define this symbol. +-*/ +-#undef BROKEN_PAND +- +- +-/* The type of an value that fits in an MMX register +- (note that long long constant values MUST be suffixed +- by LL and unsigned long long values by ULL, lest +- they be truncated by the compiler) +-*/ +-typedef union { +- long long q; /* Quadword (64-bit) value */ +- unsigned long long uq; /* Unsigned Quadword */ +- int d[2]; /* 2 Doubleword (32-bit) values */ +- unsigned int ud[2]; /* 2 Unsigned Doubleword */ +- short w[4]; /* 4 Word (16-bit) values */ +- unsigned short uw[4]; /* 4 Unsigned Word */ +- char b[8]; /* 8 Byte (8-bit) values */ +- unsigned char ub[8]; /* 8 Unsigned Byte */ +- float s[2]; /* Single-precision (32-bit) value */ +-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +- +- +- +-/* Function to test if multimedia instructions are supported... +-*/ +-static int +-mm_support(void) +-{ +- /* Returns 1 if MMX instructions are supported, +- 3 if Cyrix MMX and Extended MMX instructions are supported +- 5 if AMD MMX and 3DNow! instructions are supported +- 13 if AMD Extended MMX, &3dNow supported +- 0 if hardware does not support any of these +- */ +- register int rval = 0; +- +- __asm__ __volatile__ ( +- /* See if CPUID instruction is supported ... */ +- /* ... Get copies of EFLAGS into eax and ecx */ +- "pushl %%ebx\n\t" +- "pushf\n\t" +- "popl %%eax\n\t" +- "movl %%eax, %%ecx\n\t" +- +- /* ... Toggle the ID bit in one copy and store */ +- /* to the EFLAGS reg */ +- "xorl $0x200000, %%eax\n\t" +- "push %%eax\n\t" +- "popf\n\t" +- +- /* ... Get the (hopefully modified) EFLAGS */ +- "pushf\n\t" +- "popl %%eax\n\t" +- +- /* ... Compare and test result */ +- "xorl %%eax, %%ecx\n\t" +- "testl $0x200000, %%ecx\n\t" +- "jz NotSupported1\n\t" /* CPUID not supported */ +- +- +- /* Get standard CPUID information, and +- go to a specific vendor section */ +- "movl $0, %%eax\n\t" +- "cpuid\n\t" +- +- /* Check for Intel */ +- "cmpl $0x756e6547, %%ebx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x49656e69, %%edx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x6c65746e, %%ecx\n" +- "jne TryAMD\n\t" +- "jmp Intel\n\t" +- +- /* Check for AMD */ +- "\nTryAMD:\n\t" +- "cmpl $0x68747541, %%ebx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x69746e65, %%edx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x444d4163, %%ecx\n" +- "jne TryCyrix\n\t" +- "jmp AMD\n\t" +- +- /* Check for Cyrix */ +- "\nTryCyrix:\n\t" +- "cmpl $0x69727943, %%ebx\n\t" +- "jne NotSupported2\n\t" +- "cmpl $0x736e4978, %%edx\n\t" +- "jne NotSupported3\n\t" +- "cmpl $0x64616574, %%ecx\n\t" +- "jne NotSupported4\n\t" +- /* Drop through to Cyrix... */ +- +- +- /* Cyrix Section */ +- /* See if extended CPUID level 80000001 is supported */ +- /* The value of CPUID/80000001 for the 6x86MX is undefined +- according to the Cyrix CPU Detection Guide (Preliminary +- Rev. 1.01 table 1), so we'll check the value of eax for +- CPUID/0 to see if standard CPUID level 2 is supported. +- According to the table, the only CPU which supports level +- 2 is also the only one which supports extended CPUID levels. +- */ +- "cmpl $0x2, %%eax\n\t" +- "jne MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported (in theory), so get extended +- features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%eax\n\t" /* Test for MMX */ +- "jz NotSupported5\n\t" /* MMX not supported */ +- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ +- "jnz EMMXSupported\n\t" +- "movl $1, %0\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "EMMXSupported:\n\t" +- "movl $3, %0\n\n\t" /* EMMX and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* AMD Section */ +- "AMD:\n\t" +- +- /* See if extended CPUID is supported */ +- "movl $0x80000000, %%eax\n\t" +- "cpuid\n\t" +- "cmpl $0x80000000, %%eax\n\t" +- "jl MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported, so get extended features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported6\n\t" /* MMX not supported */ +- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ +- "jnz ThreeDNowSupported\n\t" +- "movl $1, %0\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "ThreeDNowSupported:\n\t" +- "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */ +- "jnz AMDXMMXSupported\n\t" +- "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- "AMDXMMXSupported:\n\t" +- "movl $13, %0\n\n\t" /* XMMX, 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* Intel Section */ +- "Intel:\n\t" +- +- /* Check for MMX */ +- "MMXtest:\n\t" +- "movl $1, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported7\n\t" /* MMX Not supported */ +- "movl $1, %0\n\n\t" /* MMX Supported */ +- "jmp Return\n\t" +- +- /* Nothing supported */ +- "\nNotSupported1:\n\t" +- "#movl $101, %0\n\n\t" +- "\nNotSupported2:\n\t" +- "#movl $102, %0\n\n\t" +- "\nNotSupported3:\n\t" +- "#movl $103, %0\n\n\t" +- "\nNotSupported4:\n\t" +- "#movl $104, %0\n\n\t" +- "\nNotSupported5:\n\t" +- "#movl $105, %0\n\n\t" +- "\nNotSupported6:\n\t" +- "#movl $106, %0\n\n\t" +- "\nNotSupported7:\n\t" +- "#movl $107, %0\n\n\t" +- "movl $0, %0\n\n\t" +- +- "Return:\n\t" +- "popl %%ebx\n\t" +- : "=X" (rval) +- : /* no input */ +- : "eax", "ecx", "edx" +- ); +- +- /* Return */ +- return(rval); +-} +- +-/* Function to test if mmx instructions are supported... +-*/ +-static inline int +-mmx_ok(void) +-{ +- /* Returns 1 if MMX instructions are supported, 0 otherwise */ +- return ( mm_support() & 0x1 ); +-} +- +-int mmx_supported (void); +-int xmmx_supported (void); +- +- +-/* MMX optimized implementations */ +-void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +-void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +-void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, +- int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +-void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, +- int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]); +- +- +-/* Helper functions for the instruction macros that follow... +- (note that memory-to-register, m2r, instructions are nearly +- as efficient as register-to-register, r2r, instructions; +- however, memory-to-memory instructions are really simulated +- as a convenience, and are only 1/3 as efficient) +-*/ +-#ifdef MMX_TRACE +- +-/* Include the stuff for printing a trace to stderr... +-*/ +- +-#include +- +-#define mmx_i2r(op, imm, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace.uq = (imm); \ +- printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2r(op, mem, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mem); \ +- printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "m" (mem)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2m(op, reg, mem) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=m" (mem) \ +- : /* nothing */ ); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2r(op, regs, regd) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #regs ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2m(op, mems, memd) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mems); \ +- printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=m" (memd) \ +- : "m" (mems)); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#else +- +-/* These macros are a lot simpler without the tracing... +-*/ +- +-#define mmx_i2r(op, imm, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm) ) +- +-#define mmx_m2r(op, mem, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "m" (mem)) +- +-#define mmx_r2m(op, reg, mem) \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=m" (mem) \ +- : /* nothing */ ) +- +-#define mmx_r2r(op, regs, regd) \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd) +- +-#define mmx_m2m(op, mems, memd) \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=m" (memd) \ +- : "m" (mems)) +- +-#endif +- +- +-/* 1x64 MOVe Quadword +- (this is both a load and a store... +- in fact, it is the only way to store) +-*/ +-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +-#define movq(vars, vard) \ +- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 1x32 MOVe Doubleword +- (like movq, this is both load and store... +- but is most useful for moving things between +- mmx registers and ordinary registers) +-*/ +-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +-#define movd(vars, vard) \ +- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ +- "movd %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 2x32, 4x16, and 8x8 Parallel ADDs +-*/ +-#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +-#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +-#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) +- +-#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +-#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +-#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) +- +-#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +-#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +-#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +-*/ +-#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +-#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +-#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) +- +-#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +-#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +-#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +-*/ +-#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +-#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +-#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) +- +-#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +-#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +-#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel SUBs +-*/ +-#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +-#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +-#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) +- +-#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +-#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +-#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) +- +-#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +-#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +-#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +-*/ +-#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +-#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +-#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) +- +-#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +-#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +-#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +-*/ +-#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +-#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +-#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) +- +-#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +-#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +-#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) +- +- +-/* 4x16 Parallel MULs giving Low 4x16 portions of results +-*/ +-#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +-#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +-#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +-*/ +-#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +-#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +-#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) +- +- +-/* 4x16->2x32 Parallel Mul-ADD +- (muls like pmullw, then adds adjacent 16-bit fields +- in the multiply result to make the final 2x32 result) +-*/ +-#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +-#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +-#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) +- +- +-/* 1x64 bitwise AND +-*/ +-#ifdef BROKEN_PAND +-#define pand_m2r(var, reg) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, reg); \ +- mmx_m2r(pandn, var, reg); \ +- } +-#define pand_r2r(regs, regd) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, regd); \ +- mmx_r2r(pandn, regs, regd) \ +- } +-#define pand(vars, vard) \ +- { \ +- movq_m2r(vard, mm0); \ +- mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ +- mmx_m2r(pandn, vars, mm0); \ +- movq_r2m(mm0, vard); \ +- } +-#else +-#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +-#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +-#define pand(vars, vard) mmx_m2m(pand, vars, vard) +-#endif +- +- +-/* 1x64 bitwise AND with Not the destination +-*/ +-#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +-#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +-#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) +- +- +-/* 1x64 bitwise OR +-*/ +-#define por_m2r(var, reg) mmx_m2r(por, var, reg) +-#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +-#define por(vars, vard) mmx_m2m(por, vars, vard) +- +- +-/* 1x64 bitwise eXclusive OR +-*/ +-#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +-#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +-#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +-#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +-#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) +- +-#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +-#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +-#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) +- +-#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +-#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +-#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +-#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +-#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) +- +-#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +-#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +-#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) +- +-#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +-#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +-#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +-*/ +-#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +-#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +-#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +-#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) +- +-#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +-#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +-#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +-#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) +- +-#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +-#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +-#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +-#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +-*/ +-#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +-#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +-#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +-#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) +- +-#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +-#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +-#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +-#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) +- +-#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +-#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +-#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +-#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) +- +- +-/* 2x32 and 4x16 Parallel Shift Right Arithmetic +-*/ +-#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +-#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +-#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +-#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) +- +-#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +-#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +-#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +-#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) +- +- +-/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +-#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +-#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) +- +-#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +-#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +-#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) +- +- +-/* 4x16->8x8 PACK and Unsigned Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +-#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +-#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low +- (interleaves low half of dest with low half of source +- as padding in each result field) +-*/ +-#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +-#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +-#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) +- +-#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +-#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +-#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) +- +-#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +-#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +-#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High +- (interleaves high half of dest with high half of source +- as padding in each result field) +-*/ +-#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +-#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +-#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) +- +-#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +-#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +-#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) +- +-#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +-#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +-#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) +- +- +-/* Empty MMx State +- (used to clean-up when going from mmx to float use +- of the registers that are shared by both; note that +- there is no float-to-mmx operation needed, because +- only the float tag word info is corruptible) +-*/ +-#ifdef MMX_TRACE +- +-#define emms() \ +- { \ +- printf("emms()\n"); \ +- __asm__ __volatile__ ("emms" \ +- "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \ +- } +- +-#else +- +-#define emms() __asm__ __volatile__ ("emms"::: \ +- "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)") +- +-#endif +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/motif_goom1.h /src/motif_goom1.h +--- /home/d4rk/goom2k4-0/src/motif_goom1.h 2005-02-07 06:46:42.000000000 -0700 ++++ /src/motif_goom1.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1026 +0,0 @@ +-static Motif CONV_MOTIF1 = { +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, +- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0, +- 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1, +- 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3, +- 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4, +- 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7, +- 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0, +- 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9, +- 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5, +- 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10, +- 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1, +- 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15, +- 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12, +- 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1, +- 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12, +- 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15, +- 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12, +- 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2, +- 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15, +- 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15, +- 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0, +- 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15, +- 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15, +- 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1, +- 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15, +- 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15, +- 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13, +- 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15, +- 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15, +- 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15, +- 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15, +- 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15, +- 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15, +- 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11, +- 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5, +- 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15, +- 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15, +- 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1, +- 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0, +- 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15, +- 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11, +- 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0, +- 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15, +- 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15, +- 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12, +- 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15, +- 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7, +- 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15, +- 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14, +- 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15, +- 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0, +- 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15, +- 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12, +- 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4, +- 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6, +- 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14, +- 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7, +- 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4, +- 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9, +- 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9, +- 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3, +- 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15, +- 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1, +- 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4, +- 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0, +- 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15, +- 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0, +- 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0, +- 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0, +- 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15, +- 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2, +- 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0, +- 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0, +- 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15, +- 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9, +- 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15, +- 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0, +- 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0, +- 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6, +- 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12, +- 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15, +- 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0, +- 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3, +- 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0, +- 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7, +- 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15, +- 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8, +- 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9, +- 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1, +- 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0, +- 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12, +- 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7, +- 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14, +- 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15, +- 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0, +- 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9, +- 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9, +- 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15, +- 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15, +- 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4, +- 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6, +- 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1, +- 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15, +- 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14, +- 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4, +- 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0, +- 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15, +- 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15, +- 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4, +- 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2, +- 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15, +- 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15, +- 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6, +- 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4, +- 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15, +- 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10, +- 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2, +- 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15, +- 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12, +- 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15, +- 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10, +- 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0, +- 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15, +- 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0, +- 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15, +- 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9, +- 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0, +- 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4, +- 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15, +- 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9, +- 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2, +- 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15, +- 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15, +- 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12, +- 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7, +- 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15, +- 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15, +- 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15, +- 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15, +- 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5, +- 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15, +- 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15, +- 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15, +- 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0, +- 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10, +- 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15, +- 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15, +- 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6, +- 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0, +- 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15, +- 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15, +- 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4, +- 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, +- 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2, +- 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1, +- 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1, +- 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3, +- 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15, +- 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10, +- 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11, +- 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4, +- 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8, +- 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0, +- 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0, +- 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15, +- 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0, +- 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5, +- 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12, +- 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4, +- 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1, +- 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14, +- 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0, +- 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4, +- 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7, +- 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4, +- 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0, +- 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15, +- 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5, +- 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2, +- 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4, +- 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7, +- 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3, +- 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9, +- 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0, +- 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15, +- 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0, +- 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3, +- 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10, +- 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 +- }; +diff -Naur /home/d4rk/goom2k4-0/src/motif_goom2.h /src/motif_goom2.h +--- /home/d4rk/goom2k4-0/src/motif_goom2.h 2005-02-07 06:46:42.000000000 -0700 ++++ /src/motif_goom2.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1026 +0,0 @@ +-static Motif CONV_MOTIF2 = { +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5, +- 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0, +- 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0, +- 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1, +- 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10, +- 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5, +- 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11, +- 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0, +- 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11, +- 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10, +- 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15, +- 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11, +- 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15, +- 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6, +- 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11, +- 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15, +- 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0, +- 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11, +- 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0, +- 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0, +- 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, +- 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11, +- 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9, +- 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, +- 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15, +- 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14, +- 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, +- 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15, +- 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13, +- 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15, +- 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15, +- 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15, +- 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15, +- 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15, +- 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15, +- 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12, +- 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15, +- 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15, +- 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3, +- 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6, +- 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15, +- 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11, +- 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0, +- 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0, +- 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0, +- 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0, +- 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0, +- 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0, +- 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0, +- 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2, +- 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3, +- 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15, +- 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12, +- 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15, +- 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15, +- 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15, +- 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15, +- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, +- 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15, +- 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15, +- 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15, +- 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, +- 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15, +- 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15, +- 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15, +- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, +- 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14, +- 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15, +- 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15, +- 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, +- 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13, +- 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15, +- 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15, +- 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0, +- 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11, +- 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15, +- 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15, +- 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0, +- 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8, +- 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15, +- 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15, +- 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1, +- 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0, +- 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4, +- 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8, +- 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15, +- 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0, +- 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0, +- 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1, +- 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0, +- 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15, +- 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0, +- 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0, +- 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0, +- 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0, +- 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15, +- 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0, +- 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0, +- 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0, +- 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0, +- 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15, +- 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10, +- 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0, +- 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0, +- 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15, +- 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15, +- 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13, +- 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9, +- 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15, +- 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8, +- 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5, +- 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15, +- 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13, +- 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15, +- 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12, +- 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11, +- 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15, +- 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0, +- 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5, +- 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12, +- 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15, +- 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0, +- 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9, +- 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1, +- 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13, +- 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12, +- 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4, +- 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4, +- 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15, +- 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1, +- 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1, +- 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15, +- 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15, +- 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13, +- 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1, +- 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4, +- 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15, +- 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15, +- 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5, +- 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1, +- 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11, +- 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15, +- 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13, +- 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4, +- 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4, +- 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15, +- 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13, +- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0, +- 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4, +- 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 +- }; +diff -Naur /home/d4rk/goom2k4-0/src/plugin_info.c /src/plugin_info.c +--- /home/d4rk/goom2k4-0/src/plugin_info.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/plugin_info.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,202 +0,0 @@ +-#include "goom_plugin_info.h" +-#include "goom_fx.h" +-#include "cpu_info.h" +-#include "default_scripts.h" +-#include "drawmethods.h" +-#include +-#include +- +- +-#ifdef CPU_POWERPC +-#include +-#include +-#include "ppc_zoom_ultimate.h" +-#include "ppc_drawings.h" +-#endif /* CPU_POWERPC */ +- +- +-#ifdef CPU_X86 +-#include "mmx.h" +-#endif /* CPU_X86 */ +- +- +- +-static void setOptimizedMethods(PluginInfo *p) { +- +- unsigned int cpuFlavour = cpu_flavour(); +- +- /* set default methods */ +- p->methods.draw_line = draw_line; +- p->methods.zoom_filter = zoom_filter_c; +-/* p->methods.create_output_with_brightness = create_output_with_brightness;*/ +- +-#ifdef CPU_X86 +- if (cpuFlavour & CPU_OPTION_XMMX) { +-#ifdef VERBOSE +- printf ("Extented MMX detected. Using the fastest methods !\n"); +-#endif +- p->methods.draw_line = draw_line_mmx; +- p->methods.zoom_filter = zoom_filter_xmmx; +- } +- else if (cpuFlavour & CPU_OPTION_MMX) { +-#ifdef VERBOSE +- printf ("MMX detected. Using fast methods !\n"); +-#endif +- p->methods.draw_line = draw_line_mmx; +- p->methods.zoom_filter = zoom_filter_mmx; +- } +-#ifdef VERBOSE +- else +- printf ("Too bad ! No SIMD optimization available for your CPU.\n"); +-#endif +-#endif /* CPU_X86 */ +- +-#ifdef CPU_POWERPC +- +- if ((cpuFlavour & CPU_OPTION_64_BITS) != 0) { +-/* p->methods.create_output_with_brightness = ppc_brightness_G5; */ +- p->methods.zoom_filter = ppc_zoom_generic; +- } +- else if ((cpuFlavour & CPU_OPTION_ALTIVEC) != 0) { +-/* p->methods.create_output_with_brightness = ppc_brightness_G4; */ +- p->methods.zoom_filter = ppc_zoom_G4; +- } +- else +- { +-/* p->methods.create_output_with_brightness = ppc_brightness_generic;*/ +- p->methods.zoom_filter = ppc_zoom_generic; +- } +-#endif /* CPU_POWERPC */ +- +-} +- +-void plugin_info_init(PluginInfo *pp, int nbVisuals) { +- +- PluginInfo p; +- int i; +- +- p.sound.speedvar = p.sound.accelvar = p.sound.totalgoom = 0; +- p.sound.prov_max = 0; +- p.sound.goom_limit = 1; +- p.sound.allTimesMax = 1; +- +- p.sound.volume_p = secure_f_feedback("Sound Volume"); +- p.sound.accel_p = secure_f_feedback("Sound Acceleration"); +- p.sound.speed_p = secure_f_feedback("Sound Speed"); +- p.sound.goom_limit_p = secure_f_feedback("Goom Limit"); +- p.sound.last_goom_p = secure_f_feedback("Goom Detection"); +- p.sound.last_biggoom_p = secure_f_feedback("Big Goom Detection"); +- p.sound.goom_power_p = secure_f_feedback("Goom Power"); +- +- p.sound.biggoom_speed_limit_p = secure_i_param("Big Goom Speed Limit"); +- IVAL(p.sound.biggoom_speed_limit_p) = 10; +- IMIN(p.sound.biggoom_speed_limit_p) = 0; +- IMAX(p.sound.biggoom_speed_limit_p) = 100; +- ISTEP(p.sound.biggoom_speed_limit_p) = 1; +- +- p.sound.biggoom_factor_p = secure_i_param("Big Goom Factor"); +- IVAL(p.sound.biggoom_factor_p) = 10; +- IMIN(p.sound.biggoom_factor_p) = 0; +- IMAX(p.sound.biggoom_factor_p) = 100; +- ISTEP(p.sound.biggoom_factor_p) = 1; +- +- p.sound.params = plugin_parameters ("Sound", 11); +- +- p.nbParams = 0; +- p.nbVisuals = nbVisuals; +- p.visuals = (VisualFX**)malloc(sizeof(VisualFX*)*nbVisuals); +- +- *pp = p; +- pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p; +- pp->sound.params.params[1] = &pp->sound.biggoom_factor_p; +- pp->sound.params.params[2] = 0; +- pp->sound.params.params[3] = &pp->sound.volume_p; +- pp->sound.params.params[4] = &pp->sound.accel_p; +- pp->sound.params.params[5] = &pp->sound.speed_p; +- pp->sound.params.params[6] = 0; +- pp->sound.params.params[7] = &pp->sound.goom_limit_p; +- pp->sound.params.params[8] = &pp->sound.goom_power_p; +- pp->sound.params.params[9] = &pp->sound.last_goom_p; +- pp->sound.params.params[10] = &pp->sound.last_biggoom_p; +- +- pp->statesNumber = 8; +- pp->statesRangeMax = 510; +- { +- GoomState states[8] = { +- {1,0,0,1,4, 0, 100}, +- {1,0,0,0,1, 101, 140}, +- {1,0,0,1,2, 141, 200}, +- {0,1,0,1,2, 201, 260}, +- {0,1,0,1,0, 261, 330}, +- {0,1,1,1,4, 331, 400}, +- {0,0,1,0,5, 401, 450}, +- {0,0,1,1,1, 451, 510}}; +- for (i=0;i<8;++i) +- pp->states[i] = states[i]; +- } +- pp->curGState = &(pp->states[6]); +- +- /* datas for the update loop */ +- pp->update.lockvar = 0; +- pp->update.goomvar = 0; +- pp->update.loopvar = 0; +- pp->update.stop_lines = 0; +- pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */ +- pp->update.decay_ifs = 0; /* disparition de l'ifs */ +- pp->update.recay_ifs = 0; /* dedisparition de l'ifs */ +- pp->update.cyclesSinceLastChange = 0; +- pp->update.drawLinesDuration = 80; +- pp->update.lineMode= pp->update.drawLinesDuration; +- +- pp->update.switchMultAmount = (29.0f/30.0f); +- pp->update.switchIncrAmount = 0x7f; +- pp->update.switchMult = 1.0f; +- pp->update.switchIncr = pp->update.switchIncrAmount; +- +- pp->update.stateSelectionRnd = 0; +- pp->update.stateSelectionBlocker = 0; +- pp->update.previousZoomSpeed = 128; +- pp->update.timeOfTitleDisplay = 0; +- +- pp->update_message.affiche = 0; +- +- { +- ZoomFilterData zfd = { +- 127, 8, 16, +- 1, 1, 0, NORMAL_MODE, +- 0, 0, 0, 0, 0 +- }; +- pp->update.zoomFilterData = zfd; +- } +- +- setOptimizedMethods(pp); +- +- pp->scanner = gsl_new(); +- pp->main_scanner = gsl_new(); +- pp->main_script_str = GOOM_MAIN_SCRIPT; +- +- for (i = 0; i < 0xffff; i++) { +- pp->sintable[i] = (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5); +- /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */ +- } +-} +- +-void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual) { +- p->visuals[i] = visual; +- if (i == p->nbVisuals-1) { +- ++i; +- p->nbParams = 1; +- while (i--) { +- if (p->visuals[i]->params) +- p->nbParams++; +- } +- p->params = (PluginParameters *)malloc(sizeof(PluginParameters)*p->nbParams); +- i = p->nbVisuals; +- p->nbParams = 1; +- p->params[0] = p->sound.params; +- while (i--) { +- if (p->visuals[i]->params) +- p->params[p->nbParams++] = *(p->visuals[i]->params); +- } +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/pngload.c /src/pngload.c +--- /home/d4rk/goom2k4-0/src/pngload.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/pngload.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,141 +0,0 @@ +-#include +- +-int +-loadpng (char *file_name, int *w, int *h, unsigned int ***buf) +-{ +- FILE *fp; +- png_uint_32 width, height; +- int bit_depth, +- +- color_type, interlace_type, compression_type, filter_type; +- int rowbytes; +- +- png_structp png_ptr; +- png_infop info_ptr; +- png_infop end_info; +- +- int x, y; +- unsigned int **row_pointers; +- +- /* OUVERTURE DU FICHIER */ +- +- fp = fopen (file_name, "rb"); +- +- if (!fp) { +- // fprintf (stderr, "Couldn't open file\n"); +- return 1; +- } +- +- /* CREATION DES STRUCTURES */ +- png_ptr = png_create_read_struct +- (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL); +- if (!png_ptr) { +- fprintf (stderr, "Memory error\n"); +- return 1; +- } +- +- info_ptr = png_create_info_struct (png_ptr); +- if (!info_ptr) { +- png_destroy_read_struct (&png_ptr, (png_infopp) NULL, (png_infopp) NULL); +- fprintf (stderr, "Read error 1\n"); +- return 1; +- } +- +- end_info = png_create_info_struct (png_ptr); +- if (!end_info) { +- png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL); +- fprintf (stderr, "Read error 2\n"); +- return 1; +- } +- +- /* CHARGEMENT DE L'IMAGE */ +- if (setjmp (png_ptr->jmpbuf)) { +- png_destroy_read_struct (&png_ptr, &info_ptr, &end_info); +- fclose (fp); +- fprintf (stderr, "Erreur de chargement\n"); +- return 1; +- } +- +- png_init_io (png_ptr, fp); +- png_set_read_status_fn (png_ptr, NULL); +- +- png_read_info (png_ptr, info_ptr); +- +- png_get_IHDR (png_ptr, info_ptr, &width, &height, +- &bit_depth, &color_type, &interlace_type, +- &compression_type, &filter_type); +-/* +- printf ("taille : %dx%d\n",width,height); +- printf ("depth : %d\n",bit_depth); +- printf ("color type : "); +- switch (color_type) { +- case PNG_COLOR_TYPE_GRAY: +- printf ("PNG_COLOR_TYPE_GRAY (bit depths 1, 2, 4, 8, 16)\n"); +- break; +- case PNG_COLOR_TYPE_GRAY_ALPHA: +- printf ("PNG_COLOR_TYPE_GRAY_ALPHA (bit depths 8, 16)\n"); +- break; +- case PNG_COLOR_TYPE_PALETTE: +- printf ("PNG_COLOR_TYPE_PALETTE (bit depths 1, 2, 4, 8)\n"); +- break; +- case PNG_COLOR_TYPE_RGB: +- printf ("PNG_COLOR_TYPE_RGB (bit_depths 8, 16)\n"); +- break; +- case PNG_COLOR_TYPE_RGB_ALPHA: +- printf ("PNG_COLOR_TYPE_RGB_ALPHA (bit_depths 8, 16)\n"); +- break; +- } +- */ +- // printf ("PNG_COLOR_MASK_ALPHA : %x\n", PNG_COLOR_MASK_ALPHA); +- // printf ("PNG_COLOR_MASK_COLOR : %x\n", PNG_COLOR_MASK_COLOR); +- // printf ("PNG_COLOR_MASK_PALETTE : %x\n", PNG_COLOR_MASK_PALETTE); +- +- if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8) +- png_set_palette_to_rgb (png_ptr); +- +- if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) +- png_set_gray_1_2_4_to_8 (png_ptr); +- else if (color_type == PNG_COLOR_TYPE_GRAY || +- color_type == PNG_COLOR_TYPE_GRAY_ALPHA) +- png_set_gray_to_rgb (png_ptr); +- +- if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) +- png_set_tRNS_to_alpha (png_ptr); +- +- png_read_update_info (png_ptr, info_ptr); +- +-// printf ("channels : %d\n", png_get_channels (png_ptr, info_ptr)); +- rowbytes = png_get_rowbytes (png_ptr, info_ptr); +-// printf ("rowbytes : %d\n", rowbytes); +- +- row_pointers = (unsigned int **) malloc (height * sizeof (unsigned int *)); +- +- for (y = 0; y < height; y++) +- row_pointers[y] = (unsigned int *) malloc (4 * width); +- png_read_image (png_ptr, (png_bytepp) row_pointers); +- +- // for (y=0;y unsigned int * frompixmap +-; r4 <=> unsigned int * topixmap +-; r5 <=> unsigned int sizeX (in pixels) +-; r6 <=> unsigned int sizeY (in pixels) +-; r7 <=> unsigned int * brutS +-; r8 <=> unsigned int * brutD +-; r9 <=> unsigned int buffratio +-; r10 <=> int [16][16] precalccoeffs +- +-; globals after init +-; r3 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r3) +-; r4 <=> topixmap - 1 byte needed for preincremental fetch (replaces r4) +-; r5 <=> ax = x max in 16th of pixels (replaces old r5) +-; r6 <=> ay = y max in 16th of pixels (replaces old r6) +-; r20 <=> row size in bytes +-; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +-; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +-; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) +- +-; ABI notes : +-; r1 is the Stack Pointer (SP) => Do not use +-; r13..r31 are non-volatiles => Do not use +- +-_ppc_zoom_generic: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r18,-56(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r5,r6 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r5,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r5,r5,1 +-subi r6,r6,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r4,r4,4 +-slwi r5,r5,4 +-slwi r6,r6,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-L1: +- +-; computes dynamically the position to fetch +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr6,0,r2,r5 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +-cmpl cr7,0,r29,r6 +-srawi r29,r29,4 ; pos computing +-bge- cr6,L4 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L4 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r3 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stwu r7,4(r4) ; Stores the computed pixel +-bdnz L1 ; Iterate again if needed +-b L3 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L4: +-stwu r18,4(r4) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L1 +- +- +-L3: +- +-; Restore saved registers and return +-lmw r18,-56(r1) +-blr +- +- +- +- +- +- +- +- +-_ppc_zoom_G4: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r17,-60(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r5,r6 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r5,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r5,r5,1 +-subi r6,r6,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r4,r4,4 +-slwi r5,r5,4 +-slwi r6,r6,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-;********************* +-lis r17,0x0F01 +- +-L100: +- +-; computes dynamically the position to fetch +-;mullw r8,r8,r29 +-;mullw r2,r2,r29 +-;add r2,r8,r2 +-;srawi r2,r2,17 +- +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-dst r30,r17,0 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-dst r31,r17,1 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr6,0,r2,r5 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +-cmpl cr7,0,r29,r6 +-srawi r29,r29,4 ; pos computing +-bge- cr6,L400 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L400 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r3 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-dst r2,r17,2 +-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stwu r7,4(r4) ; Stores the computed pixel +-bdnz L100 ; Iterate again if needed +-b L300 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L400: +-stwu r18,4(r4) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L100 +- +- +-L300: +- +-; Restore saved registers and return +-lmw r17,-60(r1) +-blr +diff -Naur /home/d4rk/goom2k4-0/src/powerpc/ppc_doubling.s /src/powerpc/ppc_doubling.s +--- /home/d4rk/goom2k4-0/src/powerpc/ppc_doubling.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/powerpc/ppc_doubling.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,50 +0,0 @@ +-.section regular,__TEXT +-.globl _ppc_doubling ; name of the function to call by C program +- +-; width (src width)->r3 +-; myx (src) ->r4 +-; myX (dest) ->r5 +-; myX2 (dest + 1 complete line)->r6 +-; heigth (src height)->r7 +-; inc (increment for next line in dest) ->r8 +- +-_ppc_doubling: +- +-mtspr ctr,r3 +- +-addi r4,r4,-4 +-addi r5,r5,-4 +-addi r6,r6,-4 +- +-1:;boucle: +- +-lwzu r10,4(r4) +-stwu r10,4(r5) +-stwu r10,4(r5) +-stwu r10,4(r6) +-stwu r10,4(r6) +- +-bdnz 1boucle +- +-subi r7,r7,1 +-add r5,r5,r8 +-cmpwi cr1,r7,0 +-add r6,r6,r8 +-mtspr ctr,r3 +-bgt cr1,1boucle +- +-blr +- +-;backup +- +-lwzu r10,4(r4) +-stwu r10,4(r5) +-stwu r10,4(r6) +-stwu r10,4(r5) +-stwu r10,4(r6) +- +-lwzu r10,4(r4) +-stwu r10,4(r5) +-stwu r10,4(r6) +-stwu r10,4(r5) +-stwu r10,4(r6) +diff -Naur /home/d4rk/goom2k4-0/src/ppc_drawings.h /src/ppc_drawings.h +--- /home/d4rk/goom2k4-0/src/ppc_drawings.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_drawings.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,18 +0,0 @@ +-/* +- * ppc_drawings.h +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-/* Generic PowerPC Code */ +-void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff); +- +-/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +-void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff); +- +-/* G5 Specific PowerPC Code (Possible use of Altivec) */ +-void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff); +- +diff -Naur /home/d4rk/goom2k4-0/src/ppc_drawings.s /src/ppc_drawings.s +--- /home/d4rk/goom2k4-0/src/ppc_drawings.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_drawings.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,381 +0,0 @@ +-; PowerPC optimized drawing methods for Goom +-; © 2003 Guillaume Borios +-; This Source Code is released under the terms of the General Public License +- +-; Change log : +-; 30 May 2003 : File creation +- +-; Section definition : We use a read only code section for the whole file +-.section __TEXT,__text,regular,pure_instructions +- +- +-; -------------------------------------------------------------------------------------- +-; Single 32b pixel drawing macros +-; Usage : +-; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4 +-; Only the work registers (WR) can be touched by the macros +-; +-; Available methods : +-; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW) +-; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST) +-; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing +-; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST) +-; DRAWMETHOD_B_OR_MACRO : Bitwise OR +-; DRAWMETHOD_BAND_MACRO : Bitwise AND +-; DRAWMETHOD_BXOR_MACRO : Bitwise XOR +-; DRAWMETHOD_BNOT_MACRO : Bitwise NOT +-; -------------------------------------------------------------------------------------- +- +-.macro DRAWMETHOD_OVRW_MACRO +- stw $2,0($1) ;; *$1 <- $2 +-.endmacro +- +-.macro DRAWMETHOD_B_OR_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- or $3,$3,$2 ;; $3 <- $3 | $2 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_BAND_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- and $3,$3,$2 ;; $3 <- $3 & $2 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_BXOR_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- xor $3,$3,$2 ;; $3 <- $3 ^ $2 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_BNOT_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- nand $3,$3,$3 ;; $3 <- ~$3 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_PLUS_MACRO +- lwz $4,0($0) ;; $4 <- *$0 +- andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 +- andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 +- add $3,$3,$5 ;; $3 <- $3 + $5 +- rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15) +- srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension) +- or $3,$3,$5 ;; $3 <- $3 | $5 +- lis $5,0xFF ;; $5 <- 0x00FF00FF +- addi $5,$5,0xFF +- and $4,$4,$5 ;; $4 <- $4 & $5 +- and $6,$2,$5 ;; $6 <- $2 & $5 +- add $4,$4,$6 ;; $4 <- $4 + $6 +- rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7) +- srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension) +- rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23) +- srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension) +- rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31] +- or $4,$4,$6 ;; $4 <- $4 | $6 +- rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23] +- stw $4,0($1) ;; *$1 <- $4 +-.endmacro +- +-.macro DRAWMETHOD_HALF_MACRO +- lwz $4,0($0) ;; $4 <- *$0 +- andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 +- andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 +- add $3,$3,$5 ;; $3 <- $3 + $5 +- lis $5,0xFF ;; $5 <- 0x00FF00FF +- addi $5,$5,0xFF +- and $4,$4,$5 ;; $4 <- $4 & $5 +- and $5,$2,$5 ;; $5 <- $2 & $5 +- add $4,$4,$5 ;; $4 <- $4 + $5 +- srwi $4,$4,1 ;; $4 <- $4 >> 1 +- rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22] +- stw $4,0($1) ;; *$1 <- $4 +-.endmacro +- +-.macro DRAWMETHOD_DFLT_MACRO +- DRAWMETHOD_PLUS_MACRO +-.endmacro +- +-; -------------------------------------------------------------------------------------- +- +- +- +-; ************************************************************************************** +-; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col); +-; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +-; ************************************************************************************** +-.globl _DRAWMETHOD_PLUS_2_PPC +-.align 3 +-_DRAWMETHOD_PLUS_2_PPC: +- DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9 +- blr ;; return +- +-.globl _DRAWMETHOD_PLUS_PPC +-.align 3 +-_DRAWMETHOD_PLUS_PPC: +- DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9 +- blr ;; return +- +- +-; ************************************************************************************** +-; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col); +-; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +-; ************************************************************************************** +-.globl _DRAWMETHOD_HALF_2_PPC +-.align 3 +-_DRAWMETHOD_HALF_2_PPC: +- DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8 +- blr ;; return +- +-.globl _DRAWMETHOD_HALF_PPC +-.align 3 +-_DRAWMETHOD_HALF_PPC: +- DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7 +- blr ;; return +- +- +-; ************************************************************************************** +-; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col, +-; unsigned int screenx, unsigned int screeny) +-; ************************************************************************************** +-.globl _DRAW_LINE_PPC +-.align 3 +-_DRAW_LINE_PPC: +- ;; NOT IMPLEMENTED YET +- blr ;; return +- +- +-; ************************************************************************************** +-; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff) +-; ************************************************************************************** +- +- +-.const +-.align 4 +-vectorZERO: +- .long 0,0,0,0 +- .long 0x10101000, 0x10101001, 0x10101002, 0x10101003 +- .long 0x10101004, 0x10101005, 0x10101006, 0x10101007 +- .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B +- .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F +- +- +-.section __TEXT,__text,regular,pure_instructions +- +-.globl _ppc_brightness_G4 +-.align 3 +-_ppc_brightness_G4: +- +- +-;; PowerPC Altivec code +- srwi r5,r5,2 +- mtctr r5 +- +-;;vrsave +- mfspr r11,256 +- lis r12,0xCFFC +- mtspr 256,r12 +- +- mflr r0 +- bcl 20,31,"L00000000001$pb" +-"L00000000001$pb": +- mflr r10 +- mtlr r0 +- +- addis r9,r10,ha16(vectorZERO-"L00000000001$pb") +- addi r9,r9,lo16(vectorZERO-"L00000000001$pb") +- +- vxor v0,v0,v0 ;; V0 = NULL vector +- +- addi r9,r9,16 +- lvx v10,0,r9 +- addi r9,r9,16 +- lvx v11,0,r9 +- addi r9,r9,16 +- lvx v12,0,r9 +- addi r9,r9,16 +- lvx v13,0,r9 +- +- addis r9,r10,ha16(vectortmpwork-"L00000000001$pb") +- addi r9,r9,lo16(vectortmpwork-"L00000000001$pb") +- stw r6,0(r9) +- li r6,8 +- stw r6,4(r9) +- lvx v9,0,r9 +- li r9,128 +- vspltw v8,v9,0 +- vspltw v9,v9,1 +- +-;; elt counter +- li r9,0 +- lis r7,0x0F01 +- b L7 +-.align 4 +-L7: +- lvx v1,r9,r3 +- +- vperm v4,v1,v0,v10 +- ;********************* +- add r10,r9,r3 +- ;********************* +- vperm v5,v1,v0,v11 +- vperm v6,v1,v0,v12 +- vperm v7,v1,v0,v13 +- +- vmulouh v4,v4,v8 +- ;********************* +- dst r10,r7,3 +- ;********************* +- vmulouh v5,v5,v8 +- vmulouh v6,v6,v8 +- vmulouh v7,v7,v8 +- vsrw v4,v4,v9 +- vsrw v5,v5,v9 +- vsrw v6,v6,v9 +- vsrw v7,v7,v9 +- +- vpkuwus v4,v4,v5 +- vpkuwus v6,v6,v7 +- vpkuhus v1,v4,v6 +- +- stvx v1,r9,r4 +- addi r9,r9,16 +- +- bdnz L7 +- +- mtspr 256,r11 +- blr +- +- +-.globl _ppc_brightness_G5 +-.align 3 +-_ppc_brightness_G5: +- +-;; PowerPC Altivec G5 code +- srwi r5,r5,2 +- mtctr r5 +- +-;;vrsave +- mfspr r11,256 +- lis r12,0xCFFC +- mtspr 256,r12 +- +- mflr r0 +- bcl 20,31,"L00000000002$pb" +-"L00000000002$pb": +- mflr r10 +- mtlr r0 +- +- addis r9,r10,ha16(vectorZERO-"L00000000002$pb") +- addi r9,r9,lo16(vectorZERO-"L00000000002$pb") +- +- vxor v0,v0,v0 ;; V0 = NULL vector +- +- addi r9,r9,16 +- lvx v10,0,r9 +- addi r9,r9,16 +- lvx v11,0,r9 +- addi r9,r9,16 +- lvx v12,0,r9 +- addi r9,r9,16 +- lvx v13,0,r9 +- +- addis r9,r10,ha16(vectortmpwork-"L00000000002$pb") +- addi r9,r9,lo16(vectortmpwork-"L00000000002$pb") +- stw r6,0(r9) +- li r6,8 +- stw r6,4(r9) +- lvx v9,0,r9 +- li r9,128 +- vspltw v8,v9,0 +- vspltw v9,v9,1 +- +-;; elt counter +- li r9,0 +- lis r7,0x0F01 +- b L6 +-.align 4 +-L6: +- lvx v1,r9,r3 +- +- vperm v4,v1,v0,v10 +- ;********************* +- add r10,r9,r3 +- ;********************* +- vperm v5,v1,v0,v11 +- vperm v6,v1,v0,v12 +- vperm v7,v1,v0,v13 +- +- vmulouh v4,v4,v8 +- vmulouh v5,v5,v8 +- vmulouh v6,v6,v8 +- vmulouh v7,v7,v8 +- vsrw v4,v4,v9 +- vsrw v5,v5,v9 +- vsrw v6,v6,v9 +- vsrw v7,v7,v9 +- +- vpkuwus v4,v4,v5 +- vpkuwus v6,v6,v7 +- vpkuhus v1,v4,v6 +- +- stvx v1,r9,r4 +- addi r9,r9,16 +- +- bdnz L6 +- +- mtspr 256,r11 +- blr +- +- +-.globl _ppc_brightness_generic +-.align 3 +-_ppc_brightness_generic: +- lis r12,0x00FF +- ori r12,r12,0x00FF +- subi r3,r3,4 +- subi r4,r4,4 +- mtctr r5 +- b L1 +-.align 4 +-L1: +- lwzu r7,4(r3) +- +- rlwinm r8,r7,16,24,31 +- rlwinm r9,r7,24,24,31 +- mullw r8,r8,r6 +- rlwinm r10,r7,0,24,31 +- mullw r9,r9,r6 +- srwi r8,r8,8 +- mullw r10,r10,r6 +- srwi r9,r9,8 +- +- rlwinm. r11,r8,0,0,23 +- beq L2 +- li r8,0xFF +-L2: +- srwi r10,r10,8 +- rlwinm. r11,r9,0,0,23 +- beq L3 +- li r9,0xFF +-L3: +- rlwinm r7,r8,16,8,15 +- rlwinm. r11,r10,0,0,23 +- beq L4 +- li r10,0xFF +-L4: +- rlwimi r7,r9,8,16,23 +- rlwimi r7,r10,0,24,31 +- +- stwu r7,4(r4) +- bdnz L1 +- +- blr +- +- +- +-.static_data +-.align 4 +-vectortmpwork: +- .long 0,0,0,0 +- +diff -Naur /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.h /src/ppc_zoom_ultimate.h +--- /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_zoom_ultimate.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,14 +0,0 @@ +-/* +- * ppc_zoom_ultimate.h +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-/* Generic PowerPC Code */ +-void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +- +-/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +-void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +\ No newline at end of file +diff -Naur /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.s /src/ppc_zoom_ultimate.s +--- /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_zoom_ultimate.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,323 +0,0 @@ +-; PowerPC optimized zoom for Goom +-; © 2001-2003 Guillaume Borios +-; This Source Code is released under the terms of the General Public License +- +-; Change log : +-; 21 Dec 2003 : Use of altivec is now determined with a parameter +- +-; Section definition : We use a read only section +-.text +- +-; name of the function to call by C program : ppc_zoom +-; We declare this label as a global to extend its scope outside this file +-.globl _ppc_zoom_generic +-.globl _ppc_zoom_G4 +- +-; Description : +-; This routine dynamically computes and applies a zoom filter +- +-; parameters : +-; r3 <=> unsigned int sizeX (in pixels) +-; r4 <=> unsigned int sizeY (in pixels) +-; r5 <=> unsigned int * frompixmap +-; r6 <=> unsigned int * topixmap +-; r7 <=> unsigned int * brutS +-; r8 <=> unsigned int * brutD +-; r9 <=> unsigned int buffratio +-; r10 <=> int [16][16] precalccoeffs +- +-; globals after init +-; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5) +-; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6) +-; r3 <=> ax = x max in 16th of pixels (replaces old r3) +-; r4 <=> ay = y max in 16th of pixels (replaces old r4) +-; r20 <=> row size in bytes +-; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +-; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +-; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) +- +-; ABI notes : +-; r1 is the Stack Pointer (SP) => Do not use +-; r13..r31 are non-volatiles => Do not use +- +-_ppc_zoom_generic: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r18,-56(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r3,r4 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r3,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r3,r3,1 +-subi r4,r4,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r6,r6,4 +-slwi r3,r3,4 +-slwi r4,r4,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-b L1 +-.align 5 +-L1: +- +-; computes dynamically the position to fetch +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr4,0,r2,r3 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +-cmpl cr7,0,r29,r4 +-srawi r29,r29,4 ; pos computing +-bge- cr4,L4 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L4 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r5 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stwu r7,4(r6) ; Stores the computed pixel +-bdnz L1 ; Iterate again if needed +-b L3 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L4: +-stwu r18,4(r6) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L1 +- +- +-L3: +- +-; Restore saved registers and return +-lmw r18,-56(r1) +-blr +- +- +- +- +- +- +- +- +-_ppc_zoom_G4: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r17,-60(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r3,r4 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r3,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r3,r3,1 +-subi r4,r4,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r6,r6,4 +-slwi r3,r3,4 +-slwi r4,r4,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-;********************* +-lis r17,0x0F01 +- +-b L100 +-.align 5 +-L100: +- +-addi r6,r6,4 +- +-; Optimization to ensure the destination buffer +-; won't be loaded into the data cache +-rlwinm. r0,r6,0,27,31 +-bne+ L500 +-dcbz 0,r6 +-;dcba 0,r6 +-L500: +- +-; computes dynamically the position to fetch +-;mullw r8,r8,r29 +-;mullw r2,r2,r29 +-;add r2,r8,r2 +-;srawi r2,r2,17 +- +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-dst r30,r17,0 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-dst r31,r17,1 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr4,0,r2,r3 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +-cmpl cr7,0,r29,r4 +-srawi r29,r29,4 ; pos computing +-bge- cr4,L400 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L400 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r5 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-dst r2,r17,2 +-rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00 +-;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00 +-;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00 +-;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00 +-;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stw r7,0(r6) ; Stores the computed pixel +-bdnz L100 ; Iterate again if needed +-b L300 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L400: +-stw r18,0(r6) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L100 +- +- +-L300: +- +-; Restore saved registers and return +-lmw r17,-60(r1) +-blr +diff -Naur /home/d4rk/goom2k4-0/src/sound_tester.c /src/sound_tester.c +--- /home/d4rk/goom2k4-0/src/sound_tester.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/sound_tester.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,138 +0,0 @@ +-#include "sound_tester.h" +- +-#include +-#include +- +-/* some constants */ +-#define BIG_GOOM_DURATION 100 +-#define BIG_GOOM_SPEED_LIMIT 0.1f +- +-#define ACCEL_MULT 0.95f +-#define SPEED_MULT 0.99f +- +- +-void evaluate_sound(gint16 data[2][512], SoundInfo *info) { +- +- int i; +- float difaccel; +- float prevspeed; +- +- /* find the max */ +- int incvar = 0; +- for (i = 0; i < 512; i+=2) { +- if (incvar < data[0][i]) +- incvar = data[0][i]; +- } +- +- if (incvar > info->allTimesMax) +- info->allTimesMax = incvar; +- +- /* volume sonore */ +- info->volume = (float)incvar / (float)info->allTimesMax; +- memcpy(info->samples[0],data[0],512*sizeof(short)); +- memcpy(info->samples[1],data[1],512*sizeof(short)); +- +- difaccel = info->accelvar; +- info->accelvar = info->volume; /* accel entre 0 et 1 */ +- +- /* transformations sur la vitesse du son */ +- if (info->speedvar > 1.0f) +- info->speedvar = 1.0f; +- +- if (info->speedvar < 0.1f) +- info->accelvar *= (1.0f - (float)info->speedvar); +- else if (info->speedvar < 0.3f) +- info->accelvar *= (0.9f - (float)(info->speedvar-0.1f)/2.0f); +- else +- info->accelvar *= (0.8f - (float)(info->speedvar-0.3f)/4.0f); +- +- /* adoucissement de l'acceleration */ +- info->accelvar *= ACCEL_MULT; +- if (info->accelvar < 0) +- info->accelvar = 0; +- +- difaccel = info->accelvar - difaccel; +- if (difaccel < 0) +- difaccel = - difaccel; +- +- /* mise a jour de la vitesse */ +- prevspeed = info->speedvar; +- info->speedvar = (info->speedvar + difaccel * 0.5f) / 2; +- info->speedvar *= SPEED_MULT; +- info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f; +- if (info->speedvar < 0) +- info->speedvar = 0; +- if (info->speedvar > 1) +- info->speedvar = 1; +- +- /* temps du goom */ +- info->timeSinceLastGoom++; +- info->timeSinceLastBigGoom++; +- info->cycle++; +- +- /* detection des nouveaux gooms */ +- if ((info->speedvar > (float)IVAL(info->biggoom_speed_limit_p)/100.0f) +- && (info->accelvar > info->bigGoomLimit) +- && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) { +- info->timeSinceLastBigGoom = 0; +- } +- +- if (info->accelvar > info->goom_limit) { +- /* TODO: tester && (info->timeSinceLastGoom > 20)) { */ +- info->totalgoom ++; +- info->timeSinceLastGoom = 0; +- info->goomPower = info->accelvar - info->goom_limit; +- } +- +- if (info->accelvar > info->prov_max) +- info->prov_max = info->accelvar; +- +- if (info->goom_limit>1) +- info->goom_limit=1; +- +- /* toute les 2 secondes : vrifier si le taux de goom est correct +- * et le modifier sinon.. */ +- if (info->cycle % 64 == 0) { +- if (info->speedvar<0.01f) +- info->goom_limit *= 0.91; +- if (info->totalgoom > 4) { +- info->goom_limit+=0.02; +- } +- if (info->totalgoom > 7) { +- info->goom_limit*=1.03f; +- info->goom_limit+=0.03; +- } +- if (info->totalgoom > 16) { +- info->goom_limit*=1.05f; +- info->goom_limit+=0.04; +- } +- if (info->totalgoom == 0) { +- info->goom_limit = info->prov_max - 0.02; +- } +- if ((info->totalgoom == 1) && (info->goom_limit > 0.02)) +- info->goom_limit-=0.01; +- info->totalgoom = 0; +- info->bigGoomLimit = info->goom_limit * (1.0f + (float)IVAL(info->biggoom_factor_p)/500.0f); +- info->prov_max = 0; +- } +- +- /* mise a jour des parametres pour la GUI */ +- FVAL(info->volume_p) = info->volume; +- info->volume_p.change_listener(&info->volume_p); +- FVAL(info->speed_p) = info->speedvar * 4; +- info->speed_p.change_listener(&info->speed_p); +- FVAL(info->accel_p) = info->accelvar; +- info->accel_p.change_listener(&info->accel_p); +- +- FVAL(info->goom_limit_p) = info->goom_limit; +- info->goom_limit_p.change_listener(&info->goom_limit_p); +- FVAL(info->goom_power_p) = info->goomPower; +- info->goom_power_p.change_listener(&info->goom_power_p); +- FVAL(info->last_goom_p) = 1.0-((float)info->timeSinceLastGoom/20.0f); +- info->last_goom_p.change_listener(&info->last_goom_p); +- FVAL(info->last_biggoom_p) = 1.0-((float)info->timeSinceLastBigGoom/40.0f); +- info->last_biggoom_p.change_listener(&info->last_biggoom_p); +- +- /* bigGoomLimit ==goomLimit*9/8+7 ? */ +- } +- +diff -Naur /home/d4rk/goom2k4-0/src/sound_tester.h /src/sound_tester.h +--- /home/d4rk/goom2k4-0/src/sound_tester.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/sound_tester.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,11 +0,0 @@ +-#ifndef _SOUND_TESTER_H +-#define _SOUND_TESTER_H +- +-#include "goom_plugin_info.h" +-#include "goom_config.h" +- +-/** change les donnees du SoundInfo */ +-void evaluate_sound(gint16 data[2][512], SoundInfo *sndInfo); +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/surf3d.c /src/surf3d.c +--- /home/d4rk/goom2k4-0/src/surf3d.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/surf3d.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,107 +0,0 @@ +-#include "surf3d.h" +-#include "goom_plugin_info.h" +-#include +-#include +-#include +- +-grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) { +- int x = defx; +- int y = defz; +- grid3d *g = malloc (sizeof(grid3d)); +- surf3d *s = &(g->surf); +- s->nbvertex = x*y; +- s->vertex = malloc (x*y*sizeof(v3d)); +- s->svertex = malloc (x*y*sizeof(v3d)); +- s->center = center; +- +- g->defx=defx; +- g->sizex=sizex; +- g->defz=defz; +- g->sizez=sizez; +- g->mode=0; +- +- while (y) { +- --y; +- x = defx; +- while (x) { +- --x; +- s->vertex[x+defx*y].x = (float)(x-defx/2)*sizex/defx; +- s->vertex[x+defx*y].y = 0; +- s->vertex[x+defx*y].z = (float)(y-defz/2)*sizez/defz; +- } +- } +- return g; +-} +- +-void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, +- int dist, Pixel *buf, Pixel *back, int W,int H) { +- +- int x; +- v2d v2,v2x; +- +- v2d *v2_array = malloc(g->surf.nbvertex * sizeof(v2d)); +- v3d_to_v2d(g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array); +- +- for (x=0;xdefx;x++) { +- int z; +- v2x = v2_array[x]; +- +- for (z=1;zdefz;z++) { +- v2 = v2_array[z*g->defx + x]; +- if (((v2.x != -666) || (v2.y!=-666)) +- && ((v2x.x != -666) || (v2x.y!=-666))) { +- plug->methods.draw_line (buf,v2x.x,v2x.y,v2.x,v2.y, colorlow, W, H); +- plug->methods.draw_line (back,v2x.x,v2x.y,v2.x,v2.y, color, W, H); +- } +- v2x = v2; +- } +- } +- +- free(v2_array); +-} +- +-void surf3d_rotate (surf3d *s, float angle) { +- int i; +- float cosa; +- float sina; +- SINCOS(angle,sina,cosa); +- for (i=0;inbvertex;i++) { +- Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); +- } +-} +- +-void surf3d_translate (surf3d *s) { +- int i; +- for (i=0;inbvertex;i++) { +- TRANSLATE_V3D(s->center,s->svertex[i]); +- } +-} +- +-void grid3d_update (grid3d *g, float angle, float *vals, float dist) { +- int i; +- float cosa; +- float sina; +- surf3d *s = &(g->surf); +- v3d cam = s->center; +- cam.z += dist; +- +- SINCOS((angle/4.3f),sina,cosa); +- cam.y += sina*2.0f; +- SINCOS(angle,sina,cosa); +- +- if (g->mode==0) { +- if (vals) +- for (i=0;idefx;i++) +- s->vertex[i].y = s->vertex[i].y*0.2 + vals[i]*0.8; +- +- for (i=g->defx;inbvertex;i++) { +- s->vertex[i].y *= 0.255f; +- s->vertex[i].y += (s->vertex[i-g->defx].y * 0.777f); +- } +- } +- +- for (i=0;inbvertex;i++) { +- Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); +- TRANSLATE_V3D(cam,s->svertex[i]); +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/surf3d.h /src/surf3d.h +--- /home/d4rk/goom2k4-0/src/surf3d.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/surf3d.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,38 +0,0 @@ +-#ifndef _SURF3D_H +-#define _SURF3D_H +- +-#include "v3d.h" +-#include "goom_graphic.h" +-#include "goom_typedefs.h" +- +-typedef struct { +- v3d *vertex; +- v3d *svertex; +- int nbvertex; +- +- v3d center; +-} surf3d; +- +-typedef struct { +- surf3d surf; +- +- int defx; +- int sizex; +- int defz; +- int sizez; +- int mode; +-} grid3d; +- +-/* hi-level */ +- +-/* works on grid3d */ +-grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center); +-void grid3d_update (grid3d *s, float angle, float *vals, float dist); +- +-/* low level */ +-void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H); +-void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H); +-void surf3d_rotate (surf3d *s, float angle); +-void surf3d_translate (surf3d *s); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/surf3d.s /src/surf3d.s +--- /home/d4rk/goom2k4-0/src/surf3d.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/surf3d.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,484 +0,0 @@ +- .file "surf3d.c" +- .version "01.01" +-gcc2_compiled.: +-.text +- .align 4 +-.globl grid3d_new +- .type grid3d_new,@function +-grid3d_new: +- pushl %ebp +- movl %esp,%ebp +- subl $44,%esp +- pushl %edi +- pushl %esi +- pushl %ebx +- movl 20(%ebp),%eax +- movl 12(%ebp),%esi +- movl %eax,-8(%ebp) +- addl $-12,%esp +- pushl $44 +- call malloc +- movl %esi,%edx +- imull -8(%ebp),%edx +- movl %eax,%edi +- movl %edx,-12(%ebp) +- leal (%edx,%edx,2),%ebx +- movl %edx,8(%edi) +- addl $-12,%esp +- sall $2,%ebx +- pushl %ebx +- call malloc +- addl $32,%esp +- movl %eax,(%edi) +- addl $-12,%esp +- pushl %ebx +- call malloc +- movl %eax,4(%edi) +- movl 24(%ebp),%eax +- movl %eax,12(%edi) +- movl 28(%ebp),%eax +- movl %eax,16(%edi) +- movl 32(%ebp),%eax +- movl %eax,20(%edi) +- movl 8(%ebp),%eax +- movl %eax,28(%edi) +- movl %esi,24(%edi) +- movl -8(%ebp),%edx +- movl 16(%ebp),%eax +- movl %edx,32(%edi) +- movl %eax,36(%edi) +- movl $0,40(%edi) +- testl %edx,%edx +- je .L480 +- movl %esi,%eax +- movl %esi,-28(%ebp) +- shrl $31,%eax +- addl %eax,%esi +- movl -8(%ebp),%eax +- shrl $31,%eax +- addl -8(%ebp),%eax +- movl -12(%ebp),%edx +- sarl $1,%eax +- movl %edx,-24(%ebp) +- negl -28(%ebp) +- movl %esi,-16(%ebp) +- movl %eax,-20(%ebp) +- .p2align 4,,7 +-.L481: +- movl -28(%ebp),%eax +- addl %eax,-24(%ebp) +- decl -8(%ebp) +- movl 12(%ebp),%esi +- testl %esi,%esi +- je .L479 +- movl -8(%ebp),%eax +- subl -20(%ebp),%eax +- movl %eax,-4(%ebp) +- fildl -4(%ebp) +- movl %esi,-4(%ebp) +- movl -24(%ebp),%edx +- leal (%edx,%esi),%eax +- movl -16(%ebp),%ebx +- fildl 16(%ebp) +- leal (%eax,%eax,2),%eax +- sarl $1,%ebx +- leal 0(,%eax,4),%ecx +- fmulp %st,%st(1) +- fildl 20(%ebp) +- fdivrp %st,%st(1) +- fildl 8(%ebp) +- fildl -4(%ebp) +- jmp .L484 +-.L487: +- fxch %st(2) +- .p2align 4,,7 +-.L484: +- decl %esi +- movl %esi,%eax +- movl (%edi),%edx +- subl %ebx,%eax +- movl %eax,-4(%ebp) +- fildl -4(%ebp) +- addl $-12,%ecx +- fmul %st(2),%st +- fdiv %st(1),%st +- fstps (%edx,%ecx) +- fxch %st(2) +- movl (%edi),%eax +- movl $0,4(%eax,%ecx) +- movl (%edi),%eax +- fsts 8(%eax,%ecx) +- testl %esi,%esi +- jne .L487 +- fstp %st(0) +- fstp %st(0) +- fstp %st(0) +-.L479: +- cmpl $0,-8(%ebp) +- jne .L481 +-.L480: +- leal -56(%ebp),%esp +- popl %ebx +- movl %edi,%eax +- popl %esi +- popl %edi +- leave +- ret +-.Lfe1: +- .size grid3d_new,.Lfe1-grid3d_new +-.section .rodata +- .align 8 +-.LC48: +- .long 0x0,0x3fe00000 +- .align 4 +-.LC49: +- .long 0x3f19999a +- .align 4 +-.LC50: +- .long 0x3ee3d70a +-.text +- .align 4 +-.globl grid3d_update +- .type grid3d_update,@function +-grid3d_update: +- pushl %ebp +- movl %esp,%ebp +- subl $32,%esp +- pushl %esi +- pushl %ebx +- flds 12(%ebp) +- movl 8(%ebp),%ebx +- movl 16(%ebp),%ecx +- fld %st(0) +-#APP +- fsin +-#NO_APP +- fstps -4(%ebp) +- flds -4(%ebp) +- fxch %st(1) +-#APP +- fcos +-#NO_APP +- fstps -4(%ebp) +- flds -4(%ebp) +- cmpl $0,40(%ebx) +- jne .L519 +- testl %ecx,%ecx +- je .L520 +- xorl %esi,%esi +- cmpl 24(%ebx),%esi +- jge .L520 +- fldl .LC48 +- xorl %edx,%edx +- .p2align 4,,7 +-.L524: +- movl (%ebx),%eax +- fld %st(0) +- fld %st(1) +- fxch %st(1) +- fmuls 4(%eax,%edx) +- fxch %st(1) +- fmuls (%ecx,%esi,4) +- faddp %st,%st(1) +- incl %esi +- fstps 4(%eax,%edx) +- addl $12,%edx +- cmpl 24(%ebx),%esi +- jl .L524 +- fstp %st(0) +-.L520: +- movl 24(%ebx),%esi +- cmpl 8(%ebx),%esi +- jge .L519 +- leal (%esi,%esi,2),%eax +- flds .LC49 +- flds .LC50 +- leal 0(,%eax,4),%ecx +- .p2align 4,,7 +-.L529: +- movl (%ebx),%eax +- flds 4(%eax,%ecx) +- fmul %st(2),%st +- fstps 4(%eax,%ecx) +- movl %esi,%eax +- subl 24(%ebx),%eax +- movl (%ebx),%edx +- leal (%eax,%eax,2),%eax +- flds 4(%edx,%eax,4) +- fmul %st(1),%st +- fadds 4(%edx,%ecx) +- incl %esi +- fstps 4(%edx,%ecx) +- addl $12,%ecx +- cmpl 8(%ebx),%esi +- jl .L529 +- fstp %st(0) +- fstp %st(0) +-.L519: +- xorl %esi,%esi +- cmpl 8(%ebx),%esi +- jge .L536 +- xorl %ecx,%ecx +- .p2align 4,,7 +-.L534: +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- fsubp %st,%st(1) +- movl 4(%ebx),%edx +- incl %esi +- fstps (%edx,%ecx) +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fxch %st(1) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- faddp %st,%st(1) +- movl 4(%ebx),%edx +- fstps 8(%edx,%ecx) +- movl (%ebx),%eax +- flds 4(%eax,%ecx) +- movl 4(%ebx),%edx +- fstps 4(%edx,%ecx) +- movl 4(%ebx),%eax +- flds (%eax,%ecx) +- fadds 12(%ebx) +- fstps (%eax,%ecx) +- movl 4(%ebx),%eax +- flds 4(%eax,%ecx) +- fadds 16(%ebx) +- fstps 4(%eax,%ecx) +- movl 4(%ebx),%eax +- flds 8(%eax,%ecx) +- fadds 20(%ebx) +- fstps 8(%eax,%ecx) +- addl $12,%ecx +- cmpl 8(%ebx),%esi +- jl .L534 +-.L536: +- fstp %st(0) +- fstp %st(0) +- popl %ebx +- popl %esi +- leave +- ret +-.Lfe2: +- .size grid3d_update,.Lfe2-grid3d_update +-.section .rodata +- .align 4 +-.LC51: +- .long 0x40000000 +- .align 8 +-.LC52: +- .long 0x0,0x42380000 +-.text +- .align 4 +-.globl surf3d_draw +- .type surf3d_draw,@function +-surf3d_draw: +- pushl %ebp +- movl %esp,%ebp +- subl $60,%esp +- pushl %edi +- pushl %esi +- pushl %ebx +- movl $0,-20(%ebp) +- movl -20(%ebp),%edx +- movl 8(%ebp),%eax +- cmpl 8(%eax),%edx +- jge .L493 +- fldl .LC52 +- flds .LC51 +- xorl %edi,%edi +- .p2align 4,,7 +-.L495: +- movl 8(%ebp),%eax +- movl 4(%eax),%eax +- movl %eax,-36(%ebp) +- fcoms 8(%eax,%edi) +- fnstsw %ax +- andb $69,%ah +- cmpb $1,%ah +- jne .L496 +- fildl 16(%ebp) +- movl -36(%ebp),%edx +- fld %st(0) +- fmuls (%edx,%edi) +- fdivs 8(%edx,%edi) +- fld %st(3) +- faddp %st,%st(1) +- fstpl -32(%ebp) +- movl -32(%ebp),%eax +- movl -28(%ebp),%edx +- movl %eax,-40(%ebp) +- sarl $16,-40(%ebp) +- movl -36(%ebp),%edx +- fmuls 4(%edx,%edi) +- fdivs 8(%edx,%edi) +- movl -40(%ebp),%ecx +- fld %st(2) +- faddp %st,%st(1) +- fstpl -32(%ebp) +- movl -32(%ebp),%eax +- movl -28(%ebp),%edx +- movl %eax,-44(%ebp) +- movl 28(%ebp),%eax +- sarl $1,%eax +- addl %eax,%ecx +- movl 32(%ebp),%eax +- sarl $16,-44(%ebp) +- sarl $1,%eax +- movl %ecx,%ebx +- subl -44(%ebp),%eax +- movl %eax,%esi +- cmpl 28(%ebp),%ebx +- jge .L496 +- testl %ecx,%ecx +- jl .L496 +- cmpl 32(%ebp),%esi +- jge .L496 +- testl %eax,%eax +- jge .L499 +-.L496: +- xorl %esi,%esi +- xorl %ebx,%ebx +-.L499: +- movl 20(%ebp),%eax +- movl %ebx,%edx +- leal (%eax,%edx,4),%edx +- movl 28(%ebp),%eax +- imull %esi,%eax +- leal (%edx,%eax,4),%eax +- testl %ebx,%ebx +- je .L494 +- testl %esi,%esi +- je .L494 +-#APP +- movd (%eax), %mm0 +- paddusb 12(%ebp), %mm0 +- movd %mm0, (%eax) +-#NO_APP +-.L494: +- incl -20(%ebp) +- addl $12,%edi +- movl -20(%ebp),%eax +- movl 8(%ebp),%edx +- cmpl 8(%edx),%eax +- jl .L495 +- fstp %st(0) +- fstp %st(0) +-.L493: +- popl %ebx +- popl %esi +- popl %edi +- leave +- ret +-.Lfe3: +- .size surf3d_draw,.Lfe3-surf3d_draw +- .align 4 +-.globl surf3d_rotate +- .type surf3d_rotate,@function +-surf3d_rotate: +- pushl %ebp +- movl %esp,%ebp +- subl $32,%esp +- pushl %esi +- pushl %ebx +- flds 12(%ebp) +- movl 8(%ebp),%ebx +- fld %st(0) +-#APP +- fsin +-#NO_APP +- fstps -4(%ebp) +- flds -4(%ebp) +- fxch %st(1) +-#APP +- fcos +-#NO_APP +- fstps -4(%ebp) +- xorl %esi,%esi +- flds -4(%ebp) +- cmpl 8(%ebx),%esi +- jge .L537 +- xorl %ecx,%ecx +- .p2align 4,,7 +-.L508: +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- fsubp %st,%st(1) +- movl 4(%ebx),%edx +- incl %esi +- fstps (%edx,%ecx) +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fxch %st(1) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- faddp %st,%st(1) +- movl 4(%ebx),%edx +- fstps 8(%edx,%ecx) +- movl (%ebx),%eax +- flds 4(%eax,%ecx) +- movl 4(%ebx),%edx +- fstps 4(%edx,%ecx) +- addl $12,%ecx +- cmpl 8(%ebx),%esi +- jl .L508 +-.L537: +- fstp %st(0) +- fstp %st(0) +- popl %ebx +- popl %esi +- leave +- ret +-.Lfe4: +- .size surf3d_rotate,.Lfe4-surf3d_rotate +- .align 4 +-.globl surf3d_translate +- .type surf3d_translate,@function +-surf3d_translate: +- pushl %ebp +- movl %esp,%ebp +- pushl %ebx +- movl 8(%ebp),%ecx +- xorl %ebx,%ebx +- cmpl 8(%ecx),%ebx +- jge .L512 +- xorl %edx,%edx +- .p2align 4,,7 +-.L514: +- movl 4(%ecx),%eax +- flds (%eax,%edx) +- fadds 12(%ecx) +- incl %ebx +- fstps (%eax,%edx) +- movl 4(%ecx),%eax +- flds 4(%eax,%edx) +- fadds 16(%ecx) +- fstps 4(%eax,%edx) +- movl 4(%ecx),%eax +- flds 8(%eax,%edx) +- fadds 20(%ecx) +- fstps 8(%eax,%edx) +- addl $12,%edx +- cmpl 8(%ecx),%ebx +- jl .L514 +-.L512: +- popl %ebx +- leave +- ret +-.Lfe5: +- .size surf3d_translate,.Lfe5-surf3d_translate +- .ident "GCC: (GNU) 2.95.3 19991030 (prerelease)" +diff -Naur /home/d4rk/goom2k4-0/src/tentacle3d.c /src/tentacle3d.c +--- /home/d4rk/goom2k4-0/src/tentacle3d.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/tentacle3d.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,290 +0,0 @@ +-#include +- +-#include "v3d.h" +-#include "surf3d.h" +-#include "goom_tools.h" +-#include "goom_config.h" +-#include "goom_plugin_info.h" +-#include "tentacle3d.h" +- +-#define D 256.0f +- +-#define nbgrid 6 +-#define definitionx 15 +-#define definitionz 45 +- +-typedef struct _TENTACLE_FX_DATA { +- PluginParam enabled_bp; +- PluginParameters params; +- +- float cycle; +- grid3d *grille[nbgrid]; +- float *vals; +- +-#define NB_TENTACLE_COLORS 4 +- int colors[NB_TENTACLE_COLORS]; +- +- int col; +- int dstcol; +- float lig; +- float ligs; +- +- /* statics from pretty_move */ +- float distt; +- float distt2; +- float rot; /* entre 0 et 2 * M_PI */ +- int happens; +- int rotation; +- int lock; +-} TentacleFXData; +- +-static void tentacle_new (TentacleFXData *data); +-static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, +- short[2][512], float, int drawit, TentacleFXData *data); +-static void tentacle_free (TentacleFXData *data); +- +-/* +- * VisualFX wrapper for the tentacles +- */ +- +-static void tentacle_fx_init(VisualFX *_this, PluginInfo *info) { +- +- TentacleFXData *data = (TentacleFXData*)malloc(sizeof(TentacleFXData)); +- +- data->enabled_bp = secure_b_param("Enabled", 1); +- data->params = plugin_parameters ("3D Tentacles", 1); +- data->params.params[0] = &data->enabled_bp; +- +- data->cycle = 0.0f; +- data->col = (0x28<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x5f<<(BLEU*8)); +- data->dstcol = 0; +- data->lig = 1.15f; +- data->ligs = 0.1f; +- +- data->distt = 10.0f; +- data->distt2 = 0.0f; +- data->rot = 0.0f; /* entre 0 et 2 * M_PI */ +- data->happens = 0; +- +- data->rotation = 0; +- data->lock = 0; +- data->colors[0] = (0x18<<(ROUGE*8))|(0x4c<<(VERT*8))|(0x2f<<(BLEU*8)); +- data->colors[1] = (0x48<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x6f<<(BLEU*8)); +- data->colors[2] = (0x58<<(ROUGE*8))|(0x3c<<(VERT*8))|(0x0f<<(BLEU*8)); +- data->colors[3] = (0x87<<(ROUGE*8))|(0x55<<(VERT*8))|(0x74<<(BLEU*8)); +- tentacle_new(data); +- +- _this->params = &data->params; +- _this->fx_data = (void*)data; +-} +- +-static void tentacle_fx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) +-{ +- TentacleFXData *data = (TentacleFXData*)_this->fx_data; +- if (BVAL(data->enabled_bp)) { +- tentacle_update(goomInfo, dest, src, goomInfo->screen.width, +- goomInfo->screen.height, goomInfo->sound.samples, +- (float)goomInfo->sound.accelvar, +- goomInfo->curGState->drawTentacle, data); +- } +-} +- +-static void tentacle_fx_free(VisualFX *_this) { +- tentacle_free((TentacleFXData*)_this->fx_data); +- free(_this->fx_data); +-} +- +-VisualFX tentacle_fx_create(void) { +- VisualFX fx; +- fx.init = tentacle_fx_init; +- fx.apply = tentacle_fx_apply; +- fx.free = tentacle_fx_free; +- return fx; +-} +- +-/* ----- */ +- +-static void tentacle_free (TentacleFXData *data) { +- /* TODO : un vrai FREE GRID!! */ +- free (data->vals); +-} +- +-static void tentacle_new (TentacleFXData *data) { +- int tmp; +- +- v3d center = {0,-17.0,0}; +- data->vals = (float*)malloc ((definitionx+20)*sizeof(float)); +- +- for (tmp=0;tmpgrille[tmp] = grid3d_new (x, definitionx, z, definitionz + rand() % 10, center); +- center.y += 8; +- } +-} +- +-static inline unsigned char lighten (unsigned char value, float power) +-{ +- int val = value; +- float t = (float) val * log10(power) / 2.0; +- +- if (t > 0) { +- val = (int) t; /* (32.0f * log (t)); */ +- if (val > 255) +- val = 255; +- if (val < 0) +- val = 0; +- return val; +- } +- else { +- return 0; +- } +-} +- +-static void lightencolor (int *col, float power) +-{ +- unsigned char *color; +- +- color = (unsigned char *) col; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +-} +- +-/* retourne x>>s , en testant le signe de x */ +-#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) +- +-static int evolutecolor (unsigned int src,unsigned int dest, +- unsigned int mask, unsigned int incr) { +- +- int color = src & (~mask); +- src &= mask; +- dest &= mask; +- +- if ((src!=mask) +- &&(srcdest) +- src -= incr; +- return (src&mask)|color; +-} +- +-static void pretty_move (PluginInfo *goomInfo, float cycle, float *dist, float *dist2, float *rotangle, TentacleFXData *fx_data) { +- +- float tmp; +- +- /* many magic numbers here... I don't really like that. */ +- if (fx_data->happens) +- fx_data->happens -= 1; +- else if (fx_data->lock == 0) { +- fx_data->happens = goom_irand(goomInfo->gRandom,200)?0:100+goom_irand(goomInfo->gRandom,60); +- fx_data->lock = fx_data->happens * 3 / 2; +- } +- else fx_data->lock --; +- +- tmp = fx_data->happens?8.0f:0; +- *dist2 = fx_data->distt2 = (tmp + 15.0f*fx_data->distt2)/16.0f; +- +- tmp = 30+D-90.0f*(1.0f+sin(cycle*19/20)); +- if (fx_data->happens) +- tmp *= 0.6f; +- +- *dist = fx_data->distt = (tmp + 3.0f*fx_data->distt)/4.0f; +- +- if (!fx_data->happens){ +- tmp = M_PI*sin(cycle)/32+3*M_PI/2; +- } +- else { +- fx_data->rotation = goom_irand(goomInfo->gRandom,500)?fx_data->rotation:goom_irand(goomInfo->gRandom,2); +- if (fx_data->rotation) +- cycle *= 2.0f*M_PI; +- else +- cycle *= -1.0f*M_PI; +- tmp = cycle - (M_PI*2.0) * floor(cycle/(M_PI*2.0)); +- } +- +- if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot+2.0*M_PI))) { +- fx_data->rot = (tmp + 15.0f*(fx_data->rot+2*M_PI)) / 16.0f; +- if (fx_data->rot>2.0*M_PI) +- fx_data->rot -= 2.0*M_PI; +- *rotangle = fx_data->rot; +- } +- else if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot-2.0*M_PI))) { +- fx_data->rot = (tmp + 15.0f*(fx_data->rot-2.0*M_PI)) / 16.0f; +- if (fx_data->rot<0.0f) +- fx_data->rot += 2.0*M_PI; +- *rotangle = fx_data->rot; +- } +- else +- *rotangle = fx_data->rot = (tmp + 15.0f*fx_data->rot) / 16.0f; +-} +- +-static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, +- short data[2][512], float rapport, int drawit, TentacleFXData *fx_data) { +- +- int tmp; +- int tmp2; +- +- int color; +- int colorlow; +- +- float dist,dist2,rotangle; +- +- if ((!drawit) && (fx_data->ligs>0.0f)) +- fx_data->ligs = -fx_data->ligs; +- +- fx_data->lig += fx_data->ligs; +- +- if (fx_data->lig > 1.01f) { +- if ((fx_data->lig>10.0f) | (fx_data->lig<1.1f)) fx_data->ligs = -fx_data->ligs; +- +- if ((fx_data->lig<6.3f)&&(goom_irand(goomInfo->gRandom,30)==0)) +- fx_data->dstcol=goom_irand(goomInfo->gRandom,NB_TENTACLE_COLORS); +- +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff,0x01); +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff00,0x0100); +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff0000,0x010000); +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff000000,0x01000000); +- +- color = fx_data->col; +- colorlow = fx_data->col; +- +- lightencolor(&color,fx_data->lig * 2.0f + 2.0f); +- lightencolor(&colorlow,(fx_data->lig/3.0f)+0.67f); +- +- rapport = 1.0f + 2.0f * (rapport - 1.0f); +- rapport *= 1.2f; +- if (rapport > 1.12f) +- rapport = 1.12f; +- +- pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); +- +- for (tmp=0;tmpgRandom,511)],10)) * rapport; +- fx_data->vals[tmp2] = val; +- } +- +- grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2); +- } +- fx_data->cycle+=0.01f; +- for (tmp=0;tmpgrille[tmp],color,colorlow,dist,buf,back,W,H); +- } +- else { +- fx_data->lig = 1.05f; +- if (fx_data->ligs < 0.0f) +- fx_data->ligs = -fx_data->ligs; +- pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); +- fx_data->cycle+=0.1f; +- if (fx_data->cycle > 1000) +- fx_data->cycle = 0; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/tentacle3d.h /src/tentacle3d.h +--- /home/d4rk/goom2k4-0/src/tentacle3d.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/tentacle3d.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,8 +0,0 @@ +-#ifndef _TENTACLE3D_H +-#define _TENTACLE3D_H +- +-#include "goom_visual_fx.h" +- +-VisualFX tentacle_fx_create(void); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/TODO /src/TODO +--- /home/d4rk/goom2k4-0/src/TODO 2005-02-07 06:46:41.000000000 -0700 ++++ /src/TODO 1969-12-31 17:00:00.000000000 -0700 +@@ -1,32 +0,0 @@ +-Idees: +- +-- Flash lights (Phosphor) +- --> --> --> +- <-- <-- <-- +- +-- Re-remplir RAND regulierement (1/tour) +- +-- Un effect qui affecte la displacement map: +- +-- Enregistrer l'etat de la config, s'en servir pour definir un etat de goom. +- +-- PluginParam de type Button, avec juste un listener en donnee. +- +-- PluginParam de type TextField. +- +-- Liste des modes possibles pour l'effet de BG. +- +-- Goom lui-meme : liste des effets actifs. +- mode automatique / manuel (plus de changement aleatoires) +- +-- Possibilite d'envoyer des commandes format text au Core. exemples : +-" BRIGHT_FLASH.SCREEN_BRIGHTNESS=200.0 +- if SOUND.GOOM_DETECTION > 0 +- 3D_TENTACLES.ENABLED = 1 +- endif +- CORE.MAIN_SCRIPT="..." +-" +- void goom_execute_script(const char *cmds); +- void goom_set_main_script(const char *script); /// peut retourner un message d'erreur ? +- char *goom_create_state_script(); /* retourne un script permettant de remettre goom dans l'etat actuel */ +- +diff -Naur /home/d4rk/goom2k4-0/src/v3d.c /src/v3d.c +--- /home/d4rk/goom2k4-0/src/v3d.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/v3d.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,15 +0,0 @@ +-#include "v3d.h" +- +-void v3d_to_v2d(v3d *v3, int nbvertex, int width, int height, float distance, v2d *v2) { +- int i; +- for (i=0;i 2) { +- int Xp, Yp; +- F2I((distance * v3[i].x / v3[i].z),Xp); +- F2I((distance * v3[i].y / v3[i].z),Yp); +- v2[i].x = Xp + (width>>1); +- v2[i].y = -Yp + (height>>1); +- } +- else v2[i].x=v2[i].y=-666; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/v3d.h /src/v3d.h +--- /home/d4rk/goom2k4-0/src/v3d.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/v3d.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,65 +0,0 @@ +-#ifndef _V3D_H +-#define _V3D_H +- +-#include +-#include +-#include +- +-#include "mathtools.h" +- +-typedef struct { +- float x,y,z; +-} v3d; +- +-typedef struct { +- int x,y; +-} v2d; +- +-typedef struct { +- double x,y; +-} v2g; +- +-/* +- * projete le vertex 3D sur le plan d'affichage +- * retourne (0,0) si le point ne doit pas etre affiche. +- * +- * bonne valeur pour distance : 256 +- */ +-#define V3D_TO_V2D(v3,v2,width,height,distance) \ +-{ \ +- int Xp, Yp; \ +- if (v3.z > 2) { \ +- F2I((distance * v3.x / v3.z),Xp) ; \ +- F2I((distance * v3.y / v3.z),Yp) ; \ +- v2.x = Xp + (width>>1); \ +- v2.y = -Yp + (height>>1); \ +- } \ +- else v2.x=v2.y=-666; \ +-} +- +-void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array); +- +-/* +- * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a)) +- * centerz = centre de rotation en z +- */ +-#define Y_ROTATE_V3D(vi,vf,sina,cosa)\ +-{\ +- vf.x = vi.x * cosa - vi.z * sina;\ +- vf.z = vi.x * sina + vi.z * cosa;\ +- vf.y = vi.y;\ +-} +- +-/* +- * translation +- */ +-#define TRANSLATE_V3D(vsrc,vdest)\ +-{\ +- vdest.x += vsrc.x;\ +- vdest.y += vsrc.y;\ +- vdest.z += vsrc.z;\ +-} +- +-#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;} +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/xmmx.c /src/xmmx.c +--- /home/d4rk/goom2k4-0/src/xmmx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/xmmx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,393 +0,0 @@ +- +-#ifdef HAVE_MMX +- +-/* a definir pour avoir exactement le meme resultat que la fonction C +- * (un chouillat plus lent).. mais la difference est assez peu notable. +- */ +-// #define STRICT_COMPAT +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#define sqrtperte 16 +-/* faire : a % sqrtperte <=> a & pertemask*/ +-#define PERTEMASK 0xf +-/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +-#define PERTEDEC 4 +- +- +-/*#define MMX_TRACE*/ +-#include "mmx.h" +-/*#include "xmmx.h"*/ +-#include "goom_graphic.h" +- +-int xmmx_supported (void) { +- return (mm_support()&0x8)>>3; +-} +- +-void zoom_filter_xmmx (int prevX, int prevY, +- Pixel *expix1, Pixel *expix2, +- int *lbruS, int *lbruD, int buffratio, +- int precalCoef[16][16]) +-{ +- int bufsize = prevX * prevY; /* taille du buffer */ +- volatile int loop; /* variable de boucle */ +- +- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ +- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ +- +- volatile mmx_t prevXY; +- volatile mmx_t ratiox; +- /* volatile mmx_t interpix; */ +- +- expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; +- +- prevXY.ud[0] = (prevX-1)<> 16 */ +- +- "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */ +- "#1 \n\t psrld $16, %%mm0" +- : +- : [brutS]"g"(brutS[loop]) +- , [brutD]"g"(brutD[loop]) +- ); /* mm0 = S */ +- +- /* +- * pre : mm0 : position vector on screen +- * prevXY : coordinate of the lower-right point on screen +- * post : clipped mm0 +- * modified : mm0,mm1,mm2 +- */ +- asm volatile +- ("#1 \n\t movq %[prevXY], %%mm1" +- "#1 \n\t pcmpgtd %%mm0, %%mm1" +- /* mm0 en X contient (idem pour Y) : +- * 1111 si prevXY > px +- * 0000 si prevXY <= px */ +-#ifdef STRICT_COMPAT +- "#1 \n\t movq %%mm1, %%mm2" +- "#1 \n\t punpckhdq %%mm2, %%mm2" +- "#1 \n\t punpckldq %%mm1, %%mm1" +- "#1 \n\t pand %%mm2, %%mm0" +-#endif +- +- "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */ +- ::[prevXY]"m"(prevXY)); +- +- /* Thread #2 +- * pre : mm0 : clipped position on screen +- * +- * post : mm3 : coefs for this position +- * mm1 : X vector [0|X] +- * +- * modif : eax,esi +- */ +- __asm__ __volatile__ ( +- "#2 \n\t movd %%mm0,%%esi" +- "#2 \n\t movq %%mm0,%%mm1" +- +- "#2 \n\t andl $15,%%esi" +- "#2 \n\t psrlq $32,%%mm1" +- +- "#2 \n\t shll $6,%%esi" +- "#2 \n\t movd %%mm1,%%eax" +- +- "#2 \n\t addl %[precalCoef],%%esi" +- "#2 \n\t andl $15,%%eax" +- +- "#2 \n\t movd (%%esi,%%eax,4),%%mm3" +- ::[precalCoef]"g"(precalCoef):"eax","esi"); +- +- /* +- * extraction des coefficients... (Thread #3) +- * +- * pre : coef dans mm3 +- * +- * post : coef extraits dans mm3 (c1 & c2) +- * et mm4 (c3 & c4) +- * +- * modif : mm5 +- */ +- +- /* (Thread #4) +- * pre : mm0 : Y pos [*|Y] +- * mm1 : X pos [*|X] +- * +- * post : mm0 : expix1[position] +- * mm2 : expix1[position+largeur] +- * +- * modif : eax, esi +- */ +- __asm__ __volatile__ ( +- "#2 \n\t psrld $4, %%mm0" +- "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */ +- +- "#4 \n\t movd %%mm1,%%eax" +- "#3 \n\t movq %%mm3,%%mm5" +- +- "#4 \n\t mull %[prevX]" +- "#4 \n\t movd %%mm0,%%esi" +- +- "#3 \n\t punpcklbw %%mm5, %%mm3" +- "#4 \n\t addl %%esi, %%eax" +- +- "#3 \n\t movq %%mm3, %%mm4" +- "#3 \n\t movq %%mm3, %%mm5" +- +- "#4 \n\t movl %[expix1], %%esi" +- "#3 \n\t punpcklbw %%mm5, %%mm3" +- +- "#4 \n\t movq (%%esi,%%eax,4),%%mm0" +- "#3 \n\t punpckhbw %%mm5, %%mm4" +- +- "#4 \n\t addl %[prevX],%%eax" +- "#4 \n\t movq (%%esi,%%eax,4),%%mm2" +- +- : +- : [expix1] "g"(expix1) +- , [prevX] "g"(prevX) +- :"eax","esi" +- ); +- +- /* +- * pre : mm0 : expix1[position] +- * mm2 : expix1[position+largeur] +- * mm3 & mm4 : coefs +- */ +- +- /* recopie des deux premiers pixels dans mm0 et mm1 */ +- movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* depackage du premier pixel */ +- punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ +- +- /* extraction des coefficients... */ +- +- movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- +- /*^en parrallele^*/ /* depackage du 2ieme pixel */ +- /*^*/ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ +- +- punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */ +- punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +- pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- paddw_r2r (mm1, mm0); +- +- /* ...extraction des 2 derniers coefficients */ +- movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +- punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* recuperation des 2 derniers pixels */ +- movq_r2r (mm2, mm1); +- +- /* depackage des pixels */ +- punpcklbw_r2r (mm7, mm1); +- punpckhbw_r2r (mm7, mm2); +- +- /* multiplication pas les coeffs */ +- pmullw_r2r (mm4, mm1); +- pmullw_r2r (mm5, mm2); +- +- /* ajout des valeurs obtenues la valeur finale */ +- paddw_r2r (mm1, mm0); +- paddw_r2r (mm2, mm0); +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +- psrlw_i2r (8, mm0); +- packuswb_r2r (mm7, mm0); +- +- movd_r2m (mm0,expix2[loop]); +- +- ++loop; +- } +- __asm__ __volatile__ ("femms\n"); +-} +- +-#define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \ +-{ \ +- movd_m2r(_backbuf, mm0); \ +- paddusb_m2r(_col, mm0); \ +- movd_r2m(mm0, _out); \ +-} +- +-#define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col) +- +-void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +-{ +- int x, y, dx, dy, yy, xx; +- Pixel *p; +- +- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) +- goto end_of_line; +- +- dx = x2 - x1; +- dy = y2 - y1; +- if (x1 >= x2) { +- int tmp; +- +- tmp = x1; +- x1 = x2; +- x2 = tmp; +- tmp = y1; +- y1 = y2; +- y2 = tmp; +- dx = x2 - x1; +- dy = y2 - y1; +- } +- +- /* vertical line */ +- if (dx == 0) { +- if (y1 < y2) { +- p = &(data[(screenx * y1) + x1]); +- for (y = y1; y <= y2; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- else { +- p = &(data[(screenx * y2) + x1]); +- for (y = y2; y <= y1; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- goto end_of_line; +- } +- /* horizontal line */ +- if (dy == 0) { +- if (x1 < x2) { +- p = &(data[(screenx * y1) + x1]); +- for (x = x1; x <= x2; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- else { +- p = &(data[(screenx * y1) + x2]); +- for (x = x2; x <= x1; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- } +- /* 1 */ +- /* \ */ +- /* \ */ +- /* 2 */ +- if (y2 > y1) { +- /* steep */ +- if (dy > dx) { +- dx = ((dx << 16) / dy); +- x = x1 << 16; +- for (y = y1; y <= y2; y++) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p++; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- } +- } +- /* 2 */ +- /* / */ +- /* / */ +- /* 1 */ +- else { +- /* steep */ +- if (-dy > dx) { +- dx = ((dx << 16) / -dy); +- x = (x1 + 1) << 16; +- for (y = y1; y >= y2; y--) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p--; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- goto end_of_line; +- } +- } +-end_of_line: +- __asm__ __volatile__ ("femms\n"); +-} +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/xmmx.h /src/xmmx.h +--- /home/d4rk/goom2k4-0/src/xmmx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/xmmx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,537 +0,0 @@ +-/* xmmx.h +- +- eXtended MultiMedia eXtensions GCC interface library for IA32. +- +- To use this library, simply include this header file +- and compile with GCC. You MUST have inlining enabled +- in order for xmmx_ok() to work; this can be done by +- simply using -O on the GCC command line. +- +- Compiling with -DXMMX_TRACE will cause detailed trace +- output to be sent to stderr for each mmx operation. +- This adds lots of code, and obviously slows execution to +- a crawl, but can be very useful for debugging. +- +- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY +- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT +- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY +- AND FITNESS FOR ANY PARTICULAR PURPOSE. +- +- 1999 by R. Fisher +- Based on libmmx, 1997-99 by H. Dietz and R. Fisher +- +- Notes: +- It appears that the latest gas has the pand problem fixed, therefore +- I'll undefine BROKEN_PAND by default. +-*/ +- +-#ifndef _XMMX_H +-#define _XMMX_H +- +- +-/* Warning: at this writing, the version of GAS packaged +- with most Linux distributions does not handle the +- parallel AND operation mnemonic correctly. If the +- symbol BROKEN_PAND is defined, a slower alternative +- coding will be used. If execution of mmxtest results +- in an illegal instruction fault, define this symbol. +-*/ +-#undef BROKEN_PAND +- +- +-/* The type of an value that fits in an (Extended) MMX register +- (note that long long constant values MUST be suffixed +- by LL and unsigned long long values by ULL, lest +- they be truncated by the compiler) +-*/ +-#ifndef _MMX_H +-typedef union { +- long long q; /* Quadword (64-bit) value */ +- unsigned long long uq; /* Unsigned Quadword */ +- int d[2]; /* 2 Doubleword (32-bit) values */ +- unsigned int ud[2]; /* 2 Unsigned Doubleword */ +- short w[4]; /* 4 Word (16-bit) values */ +- unsigned short uw[4]; /* 4 Unsigned Word */ +- char b[8]; /* 8 Byte (8-bit) values */ +- unsigned char ub[8]; /* 8 Unsigned Byte */ +- float s[2]; /* Single-precision (32-bit) value */ +-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +-#endif +- +- +- +-/* Function to test if multimedia instructions are supported... +-*/ +-static int +-mm_support(void) +-{ +- /* Returns 1 if MMX instructions are supported, +- 3 if Cyrix MMX and Extended MMX instructions are supported +- 5 if AMD MMX and 3DNow! instructions are supported +- 0 if hardware does not support any of these +- */ +- register int rval = 0; +- +- __asm__ __volatile__ ( +- /* See if CPUID instruction is supported ... */ +- /* ... Get copies of EFLAGS into eax and ecx */ +- "pushf\n\t" +- "popl %%eax\n\t" +- "movl %%eax, %%ecx\n\t" +- +- /* ... Toggle the ID bit in one copy and store */ +- /* to the EFLAGS reg */ +- "xorl $0x200000, %%eax\n\t" +- "push %%eax\n\t" +- "popf\n\t" +- +- /* ... Get the (hopefully modified) EFLAGS */ +- "pushf\n\t" +- "popl %%eax\n\t" +- +- /* ... Compare and test result */ +- "xorl %%eax, %%ecx\n\t" +- "testl $0x200000, %%ecx\n\t" +- "jz NotSupported1\n\t" /* CPUID not supported */ +- +- +- /* Get standard CPUID information, and +- go to a specific vendor section */ +- "movl $0, %%eax\n\t" +- "cpuid\n\t" +- +- /* Check for Intel */ +- "cmpl $0x756e6547, %%ebx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x49656e69, %%edx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x6c65746e, %%ecx\n" +- "jne TryAMD\n\t" +- "jmp Intel\n\t" +- +- /* Check for AMD */ +- "\nTryAMD:\n\t" +- "cmpl $0x68747541, %%ebx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x69746e65, %%edx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x444d4163, %%ecx\n" +- "jne TryCyrix\n\t" +- "jmp AMD\n\t" +- +- /* Check for Cyrix */ +- "\nTryCyrix:\n\t" +- "cmpl $0x69727943, %%ebx\n\t" +- "jne NotSupported2\n\t" +- "cmpl $0x736e4978, %%edx\n\t" +- "jne NotSupported3\n\t" +- "cmpl $0x64616574, %%ecx\n\t" +- "jne NotSupported4\n\t" +- /* Drop through to Cyrix... */ +- +- +- /* Cyrix Section */ +- /* See if extended CPUID level 80000001 is supported */ +- /* The value of CPUID/80000001 for the 6x86MX is undefined +- according to the Cyrix CPU Detection Guide (Preliminary +- Rev. 1.01 table 1), so we'll check the value of eax for +- CPUID/0 to see if standard CPUID level 2 is supported. +- According to the table, the only CPU which supports level +- 2 is also the only one which supports extended CPUID levels. +- */ +- "cmpl $0x2, %%eax\n\t" +- "jne MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported (in theory), so get extended +- features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%eax\n\t" /* Test for MMX */ +- "jz NotSupported5\n\t" /* MMX not supported */ +- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ +- "jnz EMMXSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "EMMXSupported:\n\t" +- "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* AMD Section */ +- "AMD:\n\t" +- +- /* See if extended CPUID is supported */ +- "movl $0x80000000, %%eax\n\t" +- "cpuid\n\t" +- "cmpl $0x80000000, %%eax\n\t" +- "jl MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported, so get extended features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported6\n\t" /* MMX not supported */ +- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ +- "jnz ThreeDNowSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "ThreeDNowSupported:\n\t" +- "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* Intel Section */ +- "Intel:\n\t" +- +- /* Check for MMX */ +- "MMXtest:\n\t" +- "movl $1, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported7\n\t" /* MMX Not supported */ +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\t" +- +- /* Nothing supported */ +- "\nNotSupported1:\n\t" +- "#movl $101, %0:\n\n\t" +- "\nNotSupported2:\n\t" +- "#movl $102, %0:\n\n\t" +- "\nNotSupported3:\n\t" +- "#movl $103, %0:\n\n\t" +- "\nNotSupported4:\n\t" +- "#movl $104, %0:\n\n\t" +- "\nNotSupported5:\n\t" +- "#movl $105, %0:\n\n\t" +- "\nNotSupported6:\n\t" +- "#movl $106, %0:\n\n\t" +- "\nNotSupported7:\n\t" +- "#movl $107, %0:\n\n\t" +- "movl $0, %0:\n\n\t" +- +- "Return:\n\t" +- : "=a" (rval) +- : /* no input */ +- : "eax", "ebx", "ecx", "edx" +- ); +- +- /* Return */ +- return(rval); +-} +- +-/* Function to test if mmx instructions are supported... +-*/ +-#ifndef _XMMX_H +-inline extern int +-mmx_ok(void) +-{ +- /* Returns 1 if MMX instructions are supported, 0 otherwise */ +- return ( mm_support() & 0x1 ); +-} +-#endif +- +-/* Function to test if xmmx instructions are supported... +-*/ +-inline extern int +-xmmx_ok(void) +-{ +- /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */ +- return ( (mm_support() & 0x2) >> 1 ); +-} +- +- +-/* Helper functions for the instruction macros that follow... +- (note that memory-to-register, m2r, instructions are nearly +- as efficient as register-to-register, r2r, instructions; +- however, memory-to-memory instructions are really simulated +- as a convenience, and are only 1/3 as efficient) +-*/ +-#ifdef XMMX_TRACE +- +-/* Include the stuff for printing a trace to stderr... +-*/ +- +-#include +- +-#define mmx_i2r(op, imm, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace.uq = (imm); \ +- fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2r(op, mem, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mem); \ +- fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2m(op, reg, mem) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (mem); \ +- fprintf(stderr, #mem "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ); \ +- mmx_trace = (mem); \ +- fprintf(stderr, #mem "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2r(op, regs, regd) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #regs ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #regd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #regd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2m(op, mems, memd) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mems); \ +- fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (memd); \ +- fprintf(stderr, #memd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)); \ +- mmx_trace = (memd); \ +- fprintf(stderr, #memd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#else +- +-/* These macros are a lot simpler without the tracing... +-*/ +- +-#define mmx_i2r(op, imm, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm) ) +- +-#define mmx_m2r(op, mem, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)) +- +-#define mmx_m2ir(op, mem, rs) \ +- __asm__ __volatile__ (#op " %0, %%" #rs \ +- : /* nothing */ \ +- : "X" (mem) ) +- +-#define mmx_r2m(op, reg, mem) \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ) +- +-#define mmx_r2r(op, regs, regd) \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd) +- +-#define mmx_r2ir(op, rs1, rs2) \ +- __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \ +- : /* nothing */ \ +- : /* nothing */ ) +- +-#define mmx_m2m(op, mems, memd) \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)) +- +-#endif +- +- +- +-/* 1x64 MOVe Quadword +- (this is both a load and a store... +- in fact, it is the only way to store) +-*/ +-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +-#define movq(vars, vard) \ +- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 1x32 MOVe Doubleword +- (like movq, this is both load and store... +- but is most useful for moving things between +- mmx registers and ordinary registers) +-*/ +-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +-#define movd(vars, vard) \ +- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ +- "movd %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +- +-/* 4x16 Parallel MAGnitude +-*/ +-#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg) +-#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd) +-#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard) +- +- +-/* 4x16 Parallel ADDs using Saturation arithmetic +- and Implied destination +-*/ +-#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs) +-#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2) +-#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard) +- +- +-/* 4x16 Parallel SUBs using Saturation arithmetic +- and Implied destination +-*/ +-#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs) +-#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2) +-#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +- Rounded with 1/2 bit 15. +-*/ +-#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg) +-#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd) +-#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +- Rounded with 1/2 bit 15, storing to Implied register +-*/ +-#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs) +-#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2) +-#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard) +- +- +-/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions +- of results Rounded with 1/2 bit 15, accumulating with Implied register +-*/ +-#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs) +-#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2) +-#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard) +- +- +-/* 8x8u Parallel AVErage +-*/ +-#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg) +-#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd) +-#define paveb(vars, vard) mmx_m2m(paveb, vars, vard) +- +- +-/* 8x8u Parallel DISTance and accumulate with +- unsigned saturation to Implied register +-*/ +-#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs) +-#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Zero +-*/ +-#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Not Zero +-*/ +-#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Less than Zero +-*/ +-#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Greater than or Equal to Zero +-*/ +-#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs) +- +- +-/* Fast Empty MMx State +- (used to clean-up when going from mmx to float use +- of the registers that are shared by both; note that +- there is no float-to-xmmx operation needed, because +- only the float tag word info is corruptible) +-*/ +-#ifdef XMMX_TRACE +- +-#define femms() \ +- { \ +- fprintf(stderr, "femms()\n"); \ +- __asm__ __volatile__ ("femms"); \ +- } +- +-#else +- +-#define femms() __asm__ __volatile__ ("femms") +- +-#endif +- +-#endif +- diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/Main.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/Main.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/Main.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/Main.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,309 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + + +/* + +Goom Visualization Interface for XBMC +- Team XBMC + +*/ + +#define __STDC_LIMIT_MACROS + +#include "../../addons/include/xbmc_vis_dll.h" +#include +#include +#include +#include +extern "C" { +#include "goom.h" +} +#include "goom_config.h" +#include + +extern int preset_index; +char g_visName[512]; +PluginInfo* g_goom = NULL; + +int g_tex_width = GOOM_TEXTURE_WIDTH; +int g_tex_height = GOOM_TEXTURE_HEIGHT; +int g_window_width = 512; +int g_window_height = 512; +int g_window_xpos = 0; +int g_window_ypos = 0; + +GLuint g_texid = 0; +unsigned char* g_goom_buffer = NULL; +short g_audio_data[2][512]; +std::string g_configFile; + +using namespace std; + +//-- Create ------------------------------------------------------------------- +// Called once when the visualisation is created by XBMC. Do any setup here. +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + VIS_PROPS* visprops = (VIS_PROPS*)props; + + strcpy(g_visName, visprops->name); + g_configFile = string(visprops->profile) + string("/goom.conf"); + std::string presetsDir = string(visprops->presets) + string("/resources"); + + /** Initialise Goom */ + if (g_goom) + { + goom_close( g_goom ); + g_goom = NULL; + } + + g_goom = goom_init(g_tex_width, g_tex_height); + if (!g_goom) + return ADDON_STATUS_UNKNOWN; + + g_goom_buffer = (unsigned char*)malloc(g_tex_width * g_tex_height * 4); + goom_set_screenbuffer( g_goom, g_goom_buffer ); + memset( g_audio_data, 0, sizeof(g_audio_data) ); + g_window_width = visprops->width; + g_window_height = visprops->height; + g_window_xpos = visprops->x; + g_window_ypos = visprops->y; + + return ADDON_STATUS_OK; +} + +//-- Destroy ------------------------------------------------------------------- +// Do everything before unload of this add-on +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Destroy() +{ + if ( g_goom ) + { + goom_close( g_goom ); + g_goom = NULL; + } + if ( g_goom_buffer ) + { + free( g_goom_buffer ); + g_goom_buffer = NULL; + } +} + +//-- Start -------------------------------------------------------------------- +// Called when a new soundtrack is played +//----------------------------------------------------------------------------- +extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName) +{ + if ( g_goom ) + { + goom_update( g_goom, g_audio_data, 0, 0, (char*)szSongName, (char*)"XBMC" ); + } +} + +//-- Stop --------------------------------------------------------------------- +// Called when the visualisation is closed by XBMC +//----------------------------------------------------------------------------- +extern "C" void ADDON_Stop() +{ + if (g_texid) + { + glDeleteTextures( 1, &g_texid ); + g_texid = 0; + } +} + +//-- Audiodata ---------------------------------------------------------------- +// Called by XBMC to pass new audio data to the vis +//----------------------------------------------------------------------------- +extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +{ + int copysize = iAudioDataLength < (int)sizeof( g_audio_data ) >> 1 ? iAudioDataLength : (int)sizeof( g_audio_data ) >> 1; + int ipos, i; + for(ipos = 0, i = 0; i < copysize; i += 2, ++ipos) + { + g_audio_data[0][ipos] = (int)(pAudioData[i ] * (INT16_MAX+.5f)); + g_audio_data[1][ipos] = (int)(pAudioData[i+1] * (INT16_MAX+.5f)); + } +} + + +//-- Render ------------------------------------------------------------------- +// Called once per frame. Do all rendering here. +//----------------------------------------------------------------------------- +extern "C" void Render() +{ + if ( g_goom ) + { + goom_set_screenbuffer( g_goom, g_goom_buffer ); + if (!g_texid) + { + // initialize the texture we'll be using + glGenTextures( 1, &g_texid ); + if (!g_texid) + return; + goom_update( g_goom, g_audio_data, 0, 0, NULL, (char*)"XBMC" ); + glEnable(GL_TEXTURE_2D); + glBindTexture( GL_TEXTURE_2D, g_texid ); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D( GL_TEXTURE_2D, 0, 4, g_tex_width, g_tex_height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, g_goom_buffer ); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + } + else + { + // update goom frame and copy to our texture + goom_update( g_goom, g_audio_data, 0, 0, NULL, (char*)"XBMC" ); + glEnable(GL_TEXTURE_2D); + glBindTexture( GL_TEXTURE_2D, g_texid ); + glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, g_tex_width, g_tex_height, + GL_RGBA, GL_UNSIGNED_BYTE, g_goom_buffer ); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + } + + glDisable(GL_BLEND); + glBegin( GL_QUADS ); + { + glColor3f( 1.0, 1.0, 1.0 ); + glTexCoord2f( 0.0, 0.0 ); + glVertex2f( g_window_xpos, g_window_ypos ); + + glTexCoord2f( 0.0, 1.0 ); + glVertex2f( g_window_xpos, g_window_ypos + g_window_height ); + + glTexCoord2f( 1.0, 1.0 ); + glVertex2f( g_window_xpos + g_window_width, g_window_ypos + g_window_height ); + + glTexCoord2f( 1.0, 0.0 ); + glVertex2f( g_window_xpos + g_window_width, g_window_ypos ); + } + glEnd(); + glDisable( GL_TEXTURE_2D ); + glEnable(GL_BLEND); + } +} + +//-- GetInfo ------------------------------------------------------------------ +// Tell XBMC our requirements +//----------------------------------------------------------------------------- +extern "C" void GetInfo(VIS_INFO* pInfo) +{ + pInfo->bWantsFreq = false; + pInfo->iSyncDelay = 0; +} + +//-- OnAction ----------------------------------------------------------------- +// Handle XBMC actions such as next preset, lock preset, album art changed etc +//----------------------------------------------------------------------------- +extern "C" bool OnAction(long flags, const void *param) +{ + bool ret = false; + return ret; +} + +//-- GetPresets --------------------------------------------------------------- +// Return a list of presets to XBMC for display +//----------------------------------------------------------------------------- +extern "C" unsigned int GetPresets(char ***presets) +{ + return 0; +} + +//-- GetPreset ---------------------------------------------------------------- +// Return the index of the current playing preset +//----------------------------------------------------------------------------- +extern "C" unsigned GetPreset() +{ + return 0; +} + +//-- IsLocked ----------------------------------------------------------------- +// Returns true if this add-on use settings +//----------------------------------------------------------------------------- +extern "C" bool IsLocked() +{ + return false; +} + +//-- GetSubModules ------------------------------------------------------------ +// Return any sub modules supported by this vis +//----------------------------------------------------------------------------- +extern "C" unsigned int GetSubModules(char ***names) +{ + return 0; // this vis supports 0 sub modules +} + +//-- HasSettings -------------------------------------------------------------- +// Returns true if this add-on use settings +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" bool ADDON_HasSettings() +{ + return false; +} + +//-- GetStatus --------------------------------------------------------------- +// Returns the current Status of this visualisation +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +//-- GetSettings -------------------------------------------------------------- +// Return the settings for XBMC to display +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +//-- FreeSettings -------------------------------------------------------------- +// Free the settings struct passed from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- + +extern "C" void ADDON_FreeSettings() +{ +} + +//-- SetSetting --------------------------------------------------------------- +// Set a specific Setting value (called from XBMC) +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_SetSetting(const char *strSetting, const void* value) +{ + return ADDON_STATUS_OK; +} + +//-- Announce ----------------------------------------------------------------- +// Receive announcements from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/Makefile.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,26 @@ +ARCH=@ARCH@ +INCLUDES=-I. -I.. -I../../linux -I../../ -Igoom2k4-0/src +OBJS=Main.o +SLIB=visualization.goom/Goom.vis +DEFINES+=-DHAS_GL +CXXFLAGS=-fPIC +DIRS=goom2k4-0 +DISTCLEAN_FILES=../../../addons/visualization.goom + +$(SLIB): $(OBJS) goom2k4-0/src/.libs/libgoom2.a +ifeq ($(findstring osx,$(ARCH)), osx) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -Wl,-alias_list,@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper_mach_alias \ + -bundle -undefined suppress -read_only_relocs suppress -o $(SLIB) \ + @abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o goom2k4-0/src/.libs/libgoom2.a $(OBJS) +else + $(CXX) $(LDFLAGS) -fPIC goom2k4-0/src/*.o -shared $(CXXFLAGS) -o $(SLIB) $(OBJS) \ + `cat ../../cores/DllLoader/exports/wrapper.def` \ + ../../cores/DllLoader/exports/wrapper.o +endif + @find visualization.goom -regextype posix-extended -type f -not -iregex ".*svn.*|.*\.so|.*\.dll|.*\.pyd|.*\.pvr|.*python/.*\.zlib|.*\.vis" -exec install -D -m 0644 "{}" ../../../addons/"{}" \; -printf " -- %-75.75f\r" + @find visualization.goom -type f -not -iregex ".*svn.*|.*win32(dx)?\.vis\.vis" -iregex ".*\.vis" -exec install -D "{}" ../../../addons/"{}" \; -printf " -- %-75.75f\r" + +goom2k4-0/src/.libs/libgoom2.a: + $(MAKE) -C goom2k4-0 + +include ../../../Makefile.include diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/visualization.goom/addon.xml kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/visualization.goom/addon.xml --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/visualization.goom/addon.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/visualization.goom/addon.xml 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,15 @@ + + + + + Goom 2k4 Visualization + The Goom 2k4 visualization supports effects like Tentacles, Flash, Stars, Fireworks, Waves, Blurs and Glows and includes a large number of trippy hypnotic effects that dance, swirl and pop with the music + linux + + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Goom/visualization.goom/icon.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Goom/visualization.goom/icon.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/MilkdropXBMC.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/MilkdropXBMC.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/MilkdropXBMC.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/MilkdropXBMC.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,359 @@ +/* + * Copyright (C) 2004-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "vis_milkdrop/Plugin.h" +#include "../../addons/include/xbmc_vis_dll.h" +#include "XmlDocument.h" +#include +#include + +CPlugin* g_plugin=NULL; +char g_visName[512]; + +#define PRESETS_DIR "zip://special%3A%2F%2Fxbmc%2Faddons%2Fvisualization.milkdrop%2Fpresets%2F" + +bool g_UserPackFolder; +std::string g_configFile; + +int lastPresetIndx =0; +char lastPresetDir[1024] = ""; +bool lastLockedStatus = false; + +// Sets a new preset file or directory and make it active. Also recovers last state of the preset if it is the same as last time +void SetPresetDir(const char *pack) +{ + int len = strlen(pack); + if (len >= 4 && strcmp(pack + len - 4, ".zip") == 0) + { + // Zip file + strcpy(g_plugin->m_szPresetDir, PRESETS_DIR); + strcat(g_plugin->m_szPresetDir, pack); + strcat(g_plugin->m_szPresetDir, "/"); + } + else if (len >= 4 && strcmp(pack + len - 4, ".rar") == 0) + { + // Rar file + strcpy(g_plugin->m_szPresetDir, PRESETS_DIR); + strcat(g_plugin->m_szPresetDir, pack); + strcat(g_plugin->m_szPresetDir, "/"); + } + else + { + // Normal folder + strcpy(g_plugin->m_szPresetDir, pack); + } + if (strcmp (g_plugin->m_szPresetDir, lastPresetDir) == 0) + { + // If we have a valid last preset state AND the preset file(dir) is the same as last time + g_plugin->UpdatePresetList(); + g_plugin->m_bHoldPreset = lastLockedStatus; + g_plugin->m_nCurrentPreset = lastPresetIndx; + strcpy(g_plugin->m_szCurrentPresetFile, g_plugin->m_szPresetDir); + strcat(g_plugin->m_szCurrentPresetFile, g_plugin->m_pPresetAddr[g_plugin->m_nCurrentPreset]); + g_plugin->LoadPreset(g_plugin->m_szCurrentPresetFile, g_plugin->m_fBlendTimeUser); + } + else + // If it is the first run or a newly chosen preset pack we choose a random preset as first + g_plugin->LoadRandomPreset(g_plugin->m_fBlendTimeUser); +} + +void Preinit() +{ + if(!g_plugin) + { + g_plugin = new CPlugin; + g_plugin->PluginPreInitialize(0, 0); + } +} + +extern "C" ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + VIS_PROPS* visprops = (VIS_PROPS*)props; + _mkdir(visprops->profile); + + Preinit(); + if(!g_plugin || !g_plugin->PluginInitialize((LPDIRECT3DDEVICE9)visprops->device, visprops->x, visprops->y, visprops->width, visprops->height, visprops->pixelRatio)) + return ADDON_STATUS_UNKNOWN; + + return ADDON_STATUS_NEED_SAVEDSETTINGS; // We need some settings to be saved later before we quit this plugin +} + +extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName) +{} + + +extern "C" void ADDON_Stop() +{ + if(g_plugin) + { + g_plugin->PluginQuit(); + delete g_plugin; + g_plugin = NULL; + } +} + +unsigned char waves[2][512]; + +//-- Audiodata ---------------------------------------------------------------- +// Called by XBMC to pass new audio data to the vis +//----------------------------------------------------------------------------- +extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +{ + int ipos=0; + while (ipos < 512) + { + for (int i=0; i < iAudioDataLength; i+=2) + { + waves[0][ipos] = char (pAudioData[i] * 255.0f); + waves[1][ipos] = char (pAudioData[i+1] * 255.0f); + ipos++; + if (ipos >= 512) break; + } + } +} + +extern "C" void Render() +{ + g_plugin->PluginRender(waves[0], waves[1]); + +} + +extern "C" void GetInfo(VIS_INFO* pInfo) +{ + pInfo->bWantsFreq = false; + pInfo->iSyncDelay = 0; +} + +//-- OnAction ----------------------------------------------------------------- +// Handle XBMC actions such as next preset, lock preset, album art changed etc +//----------------------------------------------------------------------------- +extern "C" bool OnAction(long flags, const void *param) +{ + bool ret = false; + if (flags == VIS_ACTION_NEXT_PRESET) + { + g_plugin->LoadNextPreset(g_plugin->m_fBlendTimeUser); + ret = true; + } + else if (flags == VIS_ACTION_PREV_PRESET) + { + g_plugin->LoadPreviousPreset(g_plugin->m_fBlendTimeUser); + ret = true; + } + else if (flags == VIS_ACTION_LOAD_PRESET && param) + { + g_plugin->m_nCurrentPreset = *(int *)param; + strcpy(g_plugin->m_szCurrentPresetFile, g_plugin->m_szPresetDir); // note: m_szPresetDir always ends with '\' + strcat(g_plugin->m_szCurrentPresetFile, g_plugin->m_pPresetAddr[g_plugin->m_nCurrentPreset]); + g_plugin->LoadPreset(g_plugin->m_szCurrentPresetFile, g_plugin->m_fBlendTimeUser); + ret = true; + } + else if (flags == VIS_ACTION_LOCK_PRESET) + { + g_plugin->m_bHoldPreset = !g_plugin->m_bHoldPreset; + ret = true; + } + else if (flags == VIS_ACTION_RANDOM_PRESET) + { + g_plugin->LoadRandomPreset(g_plugin->m_fBlendTimeUser); + ret = true; + } + return ret; +} + +void LoadSettings() +{} + +//-- GetPresets --------------------------------------------------------------- +// Return a list of presets to XBMC for display +//----------------------------------------------------------------------------- +extern "C" unsigned int GetPresets(char ***presets) +{ + if (!presets || !g_plugin) return 0; + *presets = g_plugin->m_pPresetAddr; + return g_plugin->m_nPresets; +} + +//-- GetPreset ---------------------------------------------------------------- +// Return the index of the current playing preset +//----------------------------------------------------------------------------- +extern "C" unsigned GetPreset() +{ + if (g_plugin) + return g_plugin->m_nCurrentPreset; + return 0; +} + +//-- IsLocked ----------------------------------------------------------------- +// Returns true if this add-on use settings +//----------------------------------------------------------------------------- +extern "C" bool IsLocked() +{ + if(g_plugin) + return g_plugin->m_bHoldPreset; + else + return false; +} + +//-- Destroy------------------------------------------------------------------- +// Do everything before unload of this add-on +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Destroy() +{ + ADDON_Stop(); +} + +//-- HasSettings -------------------------------------------------------------- +// Returns true if this add-on use settings +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" bool ADDON_HasSettings() +{ + return true; +} + +//-- GetStatus --------------------------------------------------------------- +// Returns the current Status of this visualisation +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +//-- GetSettings -------------------------------------------------------------- +// Return the settings for XBMC to display +//----------------------------------------------------------------------------- + +extern "C" unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +//-- FreeSettings -------------------------------------------------------------- +// Free the settings struct passed from XBMC +//----------------------------------------------------------------------------- + +extern "C" void ADDON_FreeSettings() +{ +} + +//-- UpdateSetting ------------------------------------------------------------ +// Handle setting change request from XBMC +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_SetSetting(const char* id, const void* value) +{ + if (!id || !value || !g_plugin) + return ADDON_STATUS_UNKNOWN; + + if (strcmp(id, "###GetSavedSettings") == 0) // We have some settings to be saved in the settings.xml file + { + if (strcmp((char*)value, "0") == 0) + { + strcpy((char*)id, "lastpresetfolder"); + strcpy((char*)value, g_plugin->m_szPresetDir); + } + if (strcmp((char*)value, "1") == 0) + { + strcpy((char*)id, "lastlockedstatus"); + strcpy((char*)value, (g_plugin->m_bHoldPreset ? "true" : "false")); + } + if (strcmp((char*)value, "2") == 0) + { + strcpy((char*)id, "lastpresetidx"); + sprintf ((char*)value, "%i", g_plugin->m_nCurrentPreset); + } + if (strcmp((char*)value, "3") == 0) + { + strcpy((char*)id, "###End"); + } + return ADDON_STATUS_OK; + } + // It is now time to set the settings got from xbmc + if (strcmp(id, "Use Preset") == 0) + OnAction(34, &value); + else if (strcmp(id, "Automatic Blend Time") == 0) + g_plugin->m_fBlendTimeAuto = (float)(*(int*)value + 1); + else if (strcmp(id, "Time Between Presets") == 0) + g_plugin->m_fTimeBetweenPresets = (float)(*(int*)value*5 + 5); + else if (strcmp(id, "Additional Random Time") == 0) + g_plugin->m_fTimeBetweenPresetsRand = (float)(*(int*)value*5 + 5); + else if (strcmp(id, "Enable Hard Cuts") == 0) + g_plugin->m_bHardCutsDisabled = *(bool*)value == false; + else if (strcmp(id, "Loudness Threshold For Hard Cuts") == 0) + g_plugin->m_fHardCutLoudnessThresh = (float)(*(int*)value)/5.0f + 1.25f; + else if (strcmp(id, "Average Time Between Hard Cuts") == 0) + g_plugin->m_fHardCutHalflife = (float)*(int*)value*5 + 5; + else if (strcmp(id, "Maximum Refresh Rate") == 0) + g_plugin->m_max_fps_fs = *(int*)value*5 + 20; + else if (strcmp(id, "Enable Stereo 3d") == 0) + g_plugin->m_bAlways3D = *(bool*)value; + else if (strcmp(id, "lastlockedstatus") == 0) + lastLockedStatus = *(bool*)value; + else if (strcmp(id, "lastpresetidx") == 0) + lastPresetIndx = *(int*)value; + else if (strcmp(id, "lastpresetfolder") == 0) + strcpy(lastPresetDir, (char*)value); + else if (strcmp(id, "Preset Shuffle Mode") == 0) + g_plugin->m_bSequentialPresetOrder = !*(bool*)value; + else if (strcmp(id, "Preset Pack") == 0) + { + if (*(int*)value == 0) + { + g_UserPackFolder = false;; + SetPresetDir ("WA51-presets(265).zip"); + } + else if (*(int*)value == 1) + { + g_UserPackFolder = false; + SetPresetDir ("Winamp-presets(436).zip"); + } + else if (*(int*)value == 2) + g_UserPackFolder = true; + } + else if (strcmp(id, "User Preset Folder") ==0 ) + { + if (g_UserPackFolder) SetPresetDir ((char*)value); + } + else + return ADDON_STATUS_UNKNOWN; + + return ADDON_STATUS_OK; +} + +//-- Announce ----------------------------------------------------------------- +// Receive announcements from XBMC +//----------------------------------------------------------------------------- + +extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} + +//-- GetSubModules ------------------------------------------------------------ +// Return any sub modules supported by this vis +//----------------------------------------------------------------------------- +extern "C" unsigned int GetSubModules(char ***names) +{ + return 0; // this vis supports 0 sub modules +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/Plugin.sln kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/Plugin.sln --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/Plugin.sln 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/Plugin.sln 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin", "Plugin.vcproj", "{5E479372-4F34-426D-AA1E-9879E94C105D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5E479372-4F34-426D-AA1E-9879E94C105D}.Debug|Win32.ActiveCfg = Debug|Win32 + {5E479372-4F34-426D-AA1E-9879E94C105D}.Debug|Win32.Build.0 = Debug|Win32 + {5E479372-4F34-426D-AA1E-9879E94C105D}.Release|Win32.ActiveCfg = Release|Win32 + {5E479372-4F34-426D-AA1E-9879E94C105D}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/Plugin.vcxproj kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/Plugin.vcxproj --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/Plugin.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/Plugin.vcxproj 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + visMilkdrop + {5E479372-4F34-426D-AA1E-9879E94C105D} + visMilkdrop + Win32Proj + + + + + DynamicLibrary + false + false + MultiByte + + + DynamicLibrary + true + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)libs\$(TargetName)\$(Configuration)\ + $(SolutionDir)objs\$(TargetName)\$(Configuration)\ + $(SolutionDir)libs\$(TargetName)\$(Configuration)\ + $(SolutionDir)objs\$(TargetName)\$(Configuration)\ + $(DXSDK_DIR)Include;$(IncludePath) + $(DXSDK_DIR)Lib\x86;$(LibraryPath) + $(DXSDK_DIR)Include;$(IncludePath) + $(DXSDK_DIR)Lib\x86;$(LibraryPath) + .vis + MilkDrop_win32dx + MilkDrop_win32dx + .vis + + + + _USRDLL;PLUGIN_EXPORTS;HAS_DX;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + AssemblyAndSourceCode + + + D3dx9.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(OutDir)Plugin.pdb + false + + + $(OutDir)Plugin.lib + + + copy "$(TargetPath)" "$(SolutionDir)..\..\addons\visualization.milkdrop\$(TargetFileName)" + + + + + true + _USRDLL;PLUGIN_EXPORTS;HAS_DX;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + Level3 + ProgramDatabase + + + D3dx9.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(TargetName).pdb + false + + + $(OutDir)Plugin.lib + + + copy "$(TargetPath)" "$(SolutionDir)..\..\addons\visualization.milkdrop\$(TargetFileName)" + + + + + + + + + + + + + + + + Disabled + + + Disabled + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/Plugin.vcxproj.filters kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/Plugin.vcxproj.filters --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/Plugin.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/Plugin.vcxproj.filters 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,112 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {04f02a49-1301-4632-98a8-87b9a07049f3} + + + {3077ef82-96dc-461c-aa69-faa5cb0b0bfe} + + + {786d27fa-7523-42e7-a465-a1fcf9186fc1} + + + + + Source Files + + + Source Files + + + Source Files\Milkdrop + + + Source Files\Milkdrop + + + Source Files\Milkdrop + + + Source Files\Milkdrop + + + Source Files\Framework + + + Source Files\Framework + + + Source Files\Framework + + + Source Files\Framework + + + Source Files\EvalLib + + + Source Files\EvalLib + + + Source Files\EvalLib + + + Source Files\EvalLib + + + Source Files\EvalLib + + + Source Files\EvalLib + + + Source Files\EvalLib + + + Source Files\EvalLib + + + + + Source Files + + + Source Files\Milkdrop + + + Source Files\Milkdrop + + + Source Files\Milkdrop + + + Source Files\Framework + + + Source Files\Framework + + + Source Files\Framework + + + Source Files\Framework + + + Source Files\EvalLib + + + Source Files\EvalLib + + + Source Files\EvalLib + + + Source Files\EvalLib + + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/defines.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/defines.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/defines.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/defines.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,207 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +#ifndef __NULLSOFT_DX8_PLUGIN_SHELL_DEFINES_H__ +#define __NULLSOFT_DX8_PLUGIN_SHELL_DEFINES_H__ 1 + +// APPNAME should be something like "MyPlugin 1.0". +// This is the name that will appear in Winamp's list of installed plugins. +// Try to include the version number with the name. +// Note: to change the name of the *file* (DLL) that the plugin is +// compiled to, go to Project Settings -> Link tab -> and change the +// 'output file name'. Don't forget to do it for both Debug AND +// Release builds! +#define SHORTNAME "MilkDrop" // used as window caption. avoid numbers or punctuation; when 'integrate with winamp' option is enabled, these characters don't always work with all skins. +#define LONGNAME "MilkDrop 1.04b" // appears at bottom of config panel + +// INT_VERSION is the major version #, multipled by 100 (ie. version 1.02 +// would be 102). If the app goes to read in the INI file and sees that +// the INI file is from an older version of your plugin, it will ignore +// their old settings and reset them to the defaults for the new version; +// but that only works if you keep this value up-to-date. ***To disable this +// behavior, just always leave this at 100. *** +#define INT_VERSION 104 +// INT_SUBVERSION is the minor version #, counting up from 0 as you do +// mini-releases. If the plugin goes to read the old INI file and sees that +// the major version # is the same but the minor version # is not, it will, +// again, ignore their old settings and reset them to the defaults for the +// new version. ***To disable this behavior, just always leave this at 0. *** +#define INT_SUBVERSION 1 + +// INIFILE is the name of the .INI file that will save the user's +// config panel settings. Do not include a path; just give the filename. +// The actual file will be stored in the WINAMP\PLUGINS directory. +#define INIFILE "milkdrop_config.ini" + +// DOCFILE is the name of the documentation file that you'll write +// for your users. Do not include a path; just give the filename. +// When a user clicks the 'View Docs' button on the config panel, +// the plugin will try to display this file, located in the +// WINAMP\PLUGINS directory. +// +// ***Note that the button will be invisible (on the config panel) +// at runtime if this string is empty.*** +#define DOCFILE "milkdrop.html" // set this to something like "myplugin.html" + +// PLUGIN_WEB_URL is the web address of the homepage for your plugin. +// It should be a well-formed URL (http://...). When a user clicks +// the 'View Webpage' button on the config panel, the plugin will +// launch their default browser to display this page. +// +// ***Note that the button will be invisible (on the config panel) +// at runtime if this string is empty.*** +#define PLUGIN_WEB_URL "http://www.nullsoft.com/free/milkdrop/" // set this to something like "http://www.myplugin.com/" + +// The following two strings - AUTHOR_NAME and COPYRIGHT - will be used +// in a little box in the config panel, to identify the author & copyright +// holder of the plugin. Keep them short so they fit in the box. +#define AUTHOR_NAME "Ryan Geiss" +#define COPYRIGHT "(c) 2001-2003 Nullsoft, Inc." + +// CLASSNAME is the name of the window class that the plugin will +// use. You don't want this to overlap with any other plugins +// or applications that are running, so change this to something +// that will probably be unique. For example, if your plugin was +// called Libido, then "LibidoClass" would probably be a safe bet. +#define CLASSNAME "MilkDrop" + +// Here you can give names to the buttons (~tabs) along the top +// of the config panel. Each button, when clicked, will bring +// up the corresponding 'property page' (embedded dialog), +// IDD_PROPPAGE_1 through IDD_PROPPAGE_8. If you want less than +// 8 buttons to show up, just leave their names as blank. For +// full instructions on how to add a new tab/page, see +// DOCUMENTATION.TXT. +#define CONFIG_PANEL_BUTTON_1 "common settings" // nPage==1 +#define CONFIG_PANEL_BUTTON_2 "customizations" // nPage==2 +#define CONFIG_PANEL_BUTTON_3 "more options" // nPage==3 +#define CONFIG_PANEL_BUTTON_4 "transitions" // nPage==4 +#define CONFIG_PANEL_BUTTON_5 "" // nPage==5 +#define CONFIG_PANEL_BUTTON_6 "" // nPage==6 +#define CONFIG_PANEL_BUTTON_7 "" // nPage==7 +#define CONFIG_PANEL_BUTTON_8 "" // nPage==8 + +// adjust the defaults for the 4 built-in fonts here. +// (note: if you want the font to be available on 98 + ME + 2k + XP, use one of the following...) +// arial +// courier 10-12-15 +// courier new +// comic san[s] ms +// lucida console +// ms sans serif +// ms serif +// small fonts +// symbol 8-10-12-14-18-24 +// tahoma +// times new roman +// verdana +// webdings +#define SIMPLE_FONT_DEFAULT_FACE "Courier" //"MS Sans Serif" - changed to Courier because menus + code FAR more legible! +#define SIMPLE_FONT_DEFAULT_SIZE 12 //16 +#define SIMPLE_FONT_DEFAULT_BOLD 0 +#define SIMPLE_FONT_DEFAULT_ITAL 0 +#define SIMPLE_FONT_DEFAULT_AA 0 +#define DECORATIVE_FONT_DEFAULT_FACE "Times New Roman" +#define DECORATIVE_FONT_DEFAULT_SIZE 24 +#define DECORATIVE_FONT_DEFAULT_BOLD 0 +#define DECORATIVE_FONT_DEFAULT_ITAL 1 +#define DECORATIVE_FONT_DEFAULT_AA 1 +#define HELPSCREEN_FONT_DEFAULT_FACE "MS Sans Serif" +#define HELPSCREEN_FONT_DEFAULT_SIZE 14 // NOTE: should fit on 640x480 screen! +#define HELPSCREEN_FONT_DEFAULT_BOLD 1 +#define HELPSCREEN_FONT_DEFAULT_ITAL 0 +#define HELPSCREEN_FONT_DEFAULT_AA 0 +#define PLAYLIST_FONT_DEFAULT_FACE "Arial" +#define PLAYLIST_FONT_DEFAULT_SIZE 16 +#define PLAYLIST_FONT_DEFAULT_BOLD 0 +#define PLAYLIST_FONT_DEFAULT_ITAL 0 +#define PLAYLIST_FONT_DEFAULT_AA 0 + +// automatically add extra fonts to the config panel +// by simply #defining them here, UP TO A MAX OF 5 EXTRA FONTS. +// access the font by calling GetFont(EXTRA_1) for extra font #1, +// GetExtraFont(EXTRA_2) for extra font #2, and so on. +#define NUM_EXTRA_FONTS 2 // <- don't exceed 5 here! +#define TOOLTIP_FONT EXTRA_1 +#define EXTRA_FONT_1_NAME "Tooltips" +#define EXTRA_FONT_1_DEFAULT_FACE "Arial" +#define EXTRA_FONT_1_DEFAULT_SIZE 14 +#define EXTRA_FONT_1_DEFAULT_BOLD 0 +#define EXTRA_FONT_1_DEFAULT_ITAL 0 +#define EXTRA_FONT_1_DEFAULT_AA 0 +#define SONGTITLE_FONT EXTRA_2 +#define EXTRA_FONT_2_NAME "Animated Songtitles" +#define EXTRA_FONT_2_DEFAULT_FACE "Times New Roman" +#define EXTRA_FONT_2_DEFAULT_SIZE 22 +#define EXTRA_FONT_2_DEFAULT_BOLD 0 +#define EXTRA_FONT_2_DEFAULT_ITAL 1 +#define EXTRA_FONT_2_DEFAULT_AA 1 + +#define WINDOWCAPTION SHORTNAME // the caption that will appear on the plugin window +#define DLLDESC LONGNAME // the desc. of this DLL, as it appears in Winamp's list of viz plugins +#define MODULEDESC LONGNAME // the desc. of this viz module within the DLL (..this framework is set up for just 1 module per DLL) + +// Finally, a few parameters that will control how things are done +// inside the plugin shell: +#define NUM_WAVEFORM_SAMPLES 480 // RANGE: 32-576. This is the # of samples of waveform data that you want. + // Note that if it is less than 576, then VMS will do its best + // to line up the waveforms from frame to frame for you, using + // the extra samples as 'squish' space. + // Note: the more 'slush' samples you leave, the better the alignment + // will be. 512 samples gives you decent alignment; 400 samples + // leaves room for fantastic alignment. + // Observe that if you specify a value here (say 400) and then only + // render a sub-portion of that in some cases (say, 200 samples), + // make sure you render the *middle* 200 samples (#100-300), because + // the alignment happens *mostly at the center*. +#define NUM_FREQUENCIES 512 // # of freq. samples you want *out* of the FFT, for 0-11kHz range. + // ** this must be a power of 2! + // ** the actual FFT will use twice this many frequencies ** + +#define TEXT_MARGIN 10 // the # of pixels of margin to leave between text and the edge of the screen +#define PLAYLIST_INNER_MARGIN 4 // the extra margin between the playlist box and the text inside + +#define PLAYLIST_COLOR_PLAYING_TRACK 0xFFCCFF00 // alpha|red|green|blue +#define PLAYLIST_COLOR_HILITE_TRACK 0xFFFF5050 +#define PLAYLIST_COLOR_BOTH 0xFFFFCC22 +#define PLAYLIST_COLOR_NORMAL 0xFFCCCCCC + +#define MENU_COLOR 0xFFCCCCCC +#define MENU_HILITE_COLOR 0xFFFF4400 +#define DIR_COLOR 0xFF88CCFF +#define TOOLTIP_COLOR 0xFFBBBBCC + +#define MAX_PRESETS_PER_PAGE 32 + +#define PRESS_F1_MSG "Press F1 for Help " // leave extra space @ end, so italicized fonts don't get clipped +#define PRESS_F1_DUR 3.0f // in seconds +#define PRESS_F1_EXP 10.0f // exponent for how quickly it accelerates to leave the screen. 1 = linear; >1 = stays & then dashes off @ end + + +#endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/dxcontext.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/dxcontext.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/dxcontext.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/dxcontext.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1451 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "DXContext.h" +#include "utility.h" +#include "shell_defines.h" +//#include "resource.h" +#include + +#define COMPILE_MULTIMON_STUBS 1 +//#include + +#define MY_EXT_WINDOW_STYLE (m_current_mode.m_skin ? 0 : ((m_current_mode.screenmode==DESKTOP) ? WS_EX_APPWINDOW : 0)) // note: changed from TOOLWINDOW to APPWINDOW b/c we wanted the plugin to appear in the taskbar. +#define MY_WINDOW_STYLE (m_current_mode.m_skin ? (WS_VISIBLE|WS_CHILDWINDOW|WS_OVERLAPPED|WS_CLIPCHILDREN|WS_CLIPSIBLINGS) : ((m_current_mode.screenmode==FAKE_FULLSCREEN || m_current_mode.screenmode==DESKTOP) ? WS_POPUP : WS_OVERLAPPEDWINDOW)) // note: WS_POPUP (by itself) removes all borders, captions, etc. + + + +//#include "vis.h" +//extern winampVisModule mod1; + +// note: the use of delayimp.lib, and the '/delayload' options below, +// will all ensure that the plugin DLL can still be loaded, even if +// DX8 is not installed. Without this delayed loading of the DX8 +// DLL's, **the plugin would not show up in the plug-ins list** on +// machines that do not have DX8 installed. Using delayed loading, +// we can at least let them try to configure or run the plugin, and +// then tell them that DX8 is missing. +//#pragma comment(lib,"delayimp.lib") +//#pragma comment(lib,"d3d8.lib") +//#pragma comment(linker,"/delayload:d3d8.dll") +//#ifdef _DEBUG +// #pragma comment(lib, "d3dx8d.lib") + //#pragma comment(linker,"/delayload:d3dx8d.dll") +//#else +// #pragma comment(lib, "d3dx8.lib") + //#pragma comment(linker,"/delayload:d3dx8.dll") +//#endif + +//DXContext::DXContext(HWND hWndWinamp,HINSTANCE hInstance,LPCSTR szClassName,LPCSTR szWindowCaption,WNDPROC pProc,LONG uWindowLong, int minimize_winamp, char* szIniFile) +DXContext::DXContext(LPDIRECT3DDEVICE9 device, char* szIniFile) +{ + m_szClassName[0] = 0; + m_szWindowCaption[0] = 0; + m_hwnd = NULL; + //m_lpD3D = NULL; + //HRESULT state = device->GetDirect3D(&m_lpD3D); + m_lpDevice = device; + m_hmod_d3d8 = NULL; + m_zFormat = D3DFMT_UNKNOWN; + for (int i=0; iCheckDeviceType(ordinal_adapter,D3DDEVTYPE_HAL,fmt,fmt,FALSE)) + return TRUE; + return FALSE; +#endif + return true; +} + +BOOL DXContext::TestDepth(int ordinal_adapter, D3DFORMAT fmt) +{ +#if 0 + if (D3D_OK!=m_lpD3D->CheckDeviceFormat(ordinal_adapter,D3DDEVTYPE_HAL,m_current_mode.display_mode.Format, + D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE,fmt)) + return FALSE; + if (D3D_OK!=m_lpD3D->CheckDepthStencilMatch(ordinal_adapter,D3DDEVTYPE_HAL, + m_current_mode.display_mode.Format,m_current_mode.display_mode.Format,fmt)) + return FALSE; + return TRUE; +#endif + return true; +} + +int DXContext::CheckAndCorrectFullscreenDispMode(int ordinal_adapter, D3DDISPLAYMODE *pdm) +{ +#if 0 + // given the user's choice of fullscreen display mode, + // go through all the display modes available to the currently-selected adapter + // and find the best match. + + // returns 1 if it altered pdm to the best match, + // or 0 if it was able to find a perfect match. + + // if it returns 1, you might want to notify the user. + + + #define MAX_DISPLAY_MODES 4096 + D3DDISPLAYMODE list[MAX_DISPLAY_MODES]; + int nCount = min(m_lpD3D->GetAdapterModeCount(ordinal_adapter), MAX_DISPLAY_MODES); + int nValid = 0; + for (int i=0; iEnumAdapterModes(ordinal_adapter, i, &list[nValid]) == D3D_OK) + nValid++; + + // do many passes through the set until we find a match, + // each time relaxing more constraints. + // outline of the passes: + + int bpp_desired = 0; + switch(pdm->Format) + { +// case D3DFMT_R8G8B8 : bpp_desired = 32; break; + case D3DFMT_A8R8G8B8: bpp_desired = 32; break; + case D3DFMT_X8R8G8B8: bpp_desired = 32; break; + case D3DFMT_R5G6B5 : bpp_desired = 16; break; + case D3DFMT_X1R5G5B5: bpp_desired = 16; break; + case D3DFMT_A1R5G5B5: bpp_desired = 16; break; + case D3DFMT_A4R4G4B4: bpp_desired = 16; break; +// case D3DFMT_R3G3B2 : bpp_desired = 8; break; +// case D3DFMT_A8R3G3B2: bpp_desired = 16; break; +// case D3DFMT_X4R4G4B4: bpp_desired = 16; break; + } + + // rep MATCH: + // 0. w,h,r,f + // 1. w,h,-,f + // 2. w,h,r,- pass: + // 3. w,h,-,- -on pass 0, for 'f', match exact format + // 4. 8,6,r,f -on pass 1, for 'f', just match # of bits per pixel + // 5. 8,6,-,f (more relaxed match) + // 6. 8,6,r,- + // 7. 8,6,-,- + // 8. -,-,r,f + // 9. -,-,-,f + // 10. -,-,r,- + // 11. -,-,-,- + int found = 0; + for (int rep=0; rep<12 && !found; rep++) + { + for (int pass=0; pass<2 && !found; pass++) + { + for (i=0; iWidth != list[i].Width) + bMatch = false; + if (pdm->Height != list[i].Height) + bMatch = false; + } + else if (rep < 8) + { + if (DEFAULT_FULLSCREEN_WIDTH != list[i].Width) + bMatch = false; + if (DEFAULT_FULLSCREEN_HEIGHT != list[i].Height) + bMatch = false; + } + + if (((rep/2)%2)==0) + { + if (pass==0 && pdm->Format != list[i].Format) + bMatch = false; + else if (pass==1 && bpp_desired != bpp_this_mode) + bMatch = false; + } + + if (((rep%2)==0) && pdm->RefreshRate != list[i].RefreshRate) + { + bMatch = false; + } + + if (bMatch) + { + memcpy(pdm, &list[i], sizeof(D3DDISPLAYMODE)); + found = 1; + if (rep != 0 || pass != 0) + { + return 1; + /* + MessageBox(m_hwnd, + "The fullscreen display mode selected from the config panel\r" + "was invalid, for some reason. For now, the closest match\r" + "(to the old selection) will be used.\r" + "\r" + "To fix this, please return to the config panel and select a new\r" + "fullscreen display mode.\r" + "\r" + "The plugin will now run using the best match...\r" + ,"WARNING", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + */ + } + } + } + } + } +#endif + return 0; +} + +BOOL CALLBACK MyMonitorEnumProc( + HMONITOR hMonitor, // handle to display monitor + HDC hdcMonitor, // handle to monitor DC + LPRECT lprcMonitor, // monitor intersection rectangle + LPARAM dwData // data +) +{ +#if 0 + RECT* p = (RECT*)dwData; + if (hMonitor) + { + MONITORINFO mi; + mi.cbSize = sizeof(mi); + if (GetMonitorInfo(hMonitor, &mi)) + { + p->top = min(p->top , mi.rcMonitor.top ); + p->left = min(p->left , mi.rcMonitor.left ); + p->right = max(p->right , mi.rcMonitor.right ); + p->bottom = max(p->bottom, mi.rcMonitor.bottom); + } + } +#endif + return TRUE; +} + + +int DXContext::GetWindowedModeAutoSize(int iteration) +{ +#if 0 + // note: requires 'm_monitor_rect' has been set! + + // generically determine size of window, for windowed mode: + int x = m_monitor_rect.right-m_monitor_rect.left; + int y = m_monitor_rect.bottom-m_monitor_rect.top; + + // if running in horz/vert-span multi-display mode, base the window size on + // an actual display size, not the giant double-sized monitor. Also, position + // the window on the same monitor that Winamp is on. + if (x >= y*2) + { + x /= 2; + + // move window to same display that Winamp is on: + WINDOWPLACEMENT wp; + wp.length = sizeof(wp); + if (GetWindowPlacement(m_hwnd_winamp, &wp)) + { + int winamp_center_x = (wp.rcNormalPosition.right + wp.rcNormalPosition.left)/2; + if (winamp_center_x > x) + { + m_monitor_rect.left += x; + m_monitor_rect.right += x; + } + } + } + else if (y > x*4/3) + { + y /= 2; + + // move window to same display that Winamp is on: + WINDOWPLACEMENT wp; + wp.length = sizeof(wp); + if (GetWindowPlacement(m_hwnd_winamp, &wp)) + { + int winamp_center_y = (wp.rcNormalPosition.top + wp.rcNormalPosition.bottom)/2; + if (winamp_center_y > y) + { + m_monitor_rect.top += y; + m_monitor_rect.bottom += y; + } + } + } + + int size = min(x, y); + size = (int)(size*DEFAULT_WINDOW_SIZE); + size = (size/64 - iteration)*64; + if (size < 64) + size = 64; + + return size; +#endif + return 0; +} + +void DXContext::WriteSafeWindowPos() +{ +#if 0 + if (m_current_mode.screenmode == WINDOWED) + { + WritePrivateProfileInt(64, "nMainWndTop", m_szIniFile, "settings"); + WritePrivateProfileInt(64, "nMainWndLeft", m_szIniFile, "settings"); + WritePrivateProfileInt(64+256, "nMainWndRight", m_szIniFile, "settings"); + WritePrivateProfileInt(64+256, "nMainWndBottom", m_szIniFile, "settings"); + WritePrivateProfileInt(64, "avs_wx",m_szIniFile,"settings"); + WritePrivateProfileInt(64, "avs_wy",m_szIniFile,"settings"); + WritePrivateProfileInt( 256, "avs_ww",m_szIniFile,"settings"); + WritePrivateProfileInt( 256, "avs_wh",m_szIniFile,"settings"); + } +#endif +} + +BOOL DXContext::Internal_Init(DXCONTEXT_PARAMS *pParams, BOOL bFirstInit) +{ + memcpy(&m_current_mode, pParams, sizeof(DXCONTEXT_PARAMS)); + memset(&myWindowState,0,sizeof(myWindowState)); + + // various checks + if (m_current_mode.screenmode != WINDOWED) + m_current_mode.m_skin = 0; + + // 1. destroy old window + if (m_hwnd) + { + m_ignore_wm_destroy = 1; +// DestroyWindow(m_hwnd); + m_ignore_wm_destroy = 0; + m_hwnd = NULL; + } + + // 2. CHECK TO MAKE SURE DIRECTX/DDRAW IS INSTALLED +/* + if (bFirstInit) + { + // Test for DirectX 8 + start it + // note: if you don't call LoadLibrary here, and you're on a system + // where DX8 is missing, Direct3DCreate8() might crash; so call it. + int d3d8_already_loaded = (GetModuleHandle("d3d8.dll") != NULL) ? 1 : 0; + if (!d3d8_already_loaded) + m_hmod_d3d8 = LoadLibrary("d3d8.dll"); + + if ( (!d3d8_already_loaded && !m_hmod_d3d8) || + !(m_lpD3D = Direct3DCreate8(D3D_SDK_VERSION)) + ) + { + MissingDirectX(NULL); + m_lastErr = DXC_ERR_CREATE3D; + return FALSE; + } + }*/ + + + // 3. get the smallest single rectangle that encloses ALL the monitors on the desktop: + // SetRect(&m_all_monitors_rect, 0, 0, 0, 0); + // EnumDisplayMonitors(NULL, NULL, MyMonitorEnumProc, (LPARAM)&m_all_monitors_rect); + + // 4. some DirectX- / DDraw-specific stuff. Also determine hPluginMonitor. + + m_lpDevice->GetDeviceCaps(&m_caps); + +#if 0 + HMONITOR hPluginMonitor = NULL; + { + D3DADAPTER_IDENTIFIER8 temp; + + // find the ordinal # of the adapter whose GUID matches what the user picked from the config panel. + // if no match found, use D3DADAPTER_DEFAULT. + m_ordinal_adapter = D3DADAPTER_DEFAULT; + int nAdapters = m_lpD3D->GetAdapterCount(); + { + for (int i=0; iGetAdapterIdentifier(i, D3DENUM_NO_WHQL_LEVEL, &temp) == D3D_OK) && + (memcmp(&temp.DeviceIdentifier, &m_current_mode.adapter_guid, sizeof(GUID))==0)) + { + m_ordinal_adapter = i; + break; + } + } + } + + if (m_lpD3D->GetAdapterIdentifier(m_ordinal_adapter, D3DENUM_NO_WHQL_LEVEL, &temp) == D3D_OK) + { + strcpy(m_szDriver, temp.Driver); + strcpy(m_szDesc, temp.Description); + } + + int caps_ok = 0; + int caps_tries = 0; + int changed_fs_disp_mode; + + // try to get the device caps for the adapter selected from the config panel. + // if GetDeviceCaps() fails, it's probably because the adapter has been + // removed from the system (or disabled), so we try again with other adapter(s). + do + { + changed_fs_disp_mode = 0; + + SetRect(&m_monitor_rect, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); + + // get bounding rect of the monitor attached to the adapter (to assist w/window positioning) + // note: in vert/horz span setups (psuedo-multimon), + // this will be 2048x768 or 1024x1536 or something like that. + hPluginMonitor = m_lpD3D->GetAdapterMonitor(m_ordinal_adapter); + /*if (hPluginMonitor) + { + MONITORINFO mi; + mi.cbSize = sizeof(mi); + if (GetMonitorInfo(hPluginMonitor, &mi)) + { + memcpy(&m_monitor_rect, &mi.rcMonitor, sizeof(RECT)); + memcpy(&m_monitor_work_rect, &mi.rcWork, sizeof(RECT)); + } + }*/ + + if (bFirstInit) + { + for (int i=0; iGetAdapterDisplayMode( i, &d3ddm ) ) ) + { + d3ddm.Format = D3DFMT_UNKNOWN; + //m_lastErr = DXC_ERR_GETFORMAT; + //MessageBox(m_hwnd, "DirectX initialization failed (GetAdapterDisplayMode)", "ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + //return FALSE; + } + m_orig_windowed_mode_format[i] = d3ddm.Format; + } + } + + // figure out pixel (color) format for back buffer: (m_current_mode.display_mode.Format) + if (m_current_mode.screenmode!=FULLSCREEN && m_ordinal_adapter < MAX_DXC_ADAPTERS) + m_current_mode.display_mode.Format = m_orig_windowed_mode_format[m_ordinal_adapter]; + // else + // for fullscreen, use what they gave us + + if (m_current_mode.display_mode.Format == D3DFMT_UNKNOWN || + !TestFormat(m_ordinal_adapter, m_current_mode.display_mode.Format)) + { + // if they try to run the plugin without ever running the config panel + // first (& pressing OK), then the fullscreen pixelformat hasn't been + // chosen... so we try all the possilibities until one works: + if (TestFormat(m_ordinal_adapter,D3DFMT_A8R8G8B8)) m_current_mode.display_mode.Format = D3DFMT_A8R8G8B8; + else if (TestFormat(m_ordinal_adapter,D3DFMT_X8R8G8B8)) m_current_mode.display_mode.Format = D3DFMT_X8R8G8B8; + else if (TestFormat(m_ordinal_adapter,D3DFMT_R8G8B8 )) m_current_mode.display_mode.Format = D3DFMT_R8G8B8 ; + else if (TestFormat(m_ordinal_adapter,D3DFMT_R5G6B5 )) m_current_mode.display_mode.Format = D3DFMT_R5G6B5 ; + else if (TestFormat(m_ordinal_adapter,D3DFMT_X1R5G5B5)) m_current_mode.display_mode.Format = D3DFMT_X1R5G5B5; + else if (TestFormat(m_ordinal_adapter,D3DFMT_A1R5G5B5)) m_current_mode.display_mode.Format = D3DFMT_A1R5G5B5; + else if (TestFormat(m_ordinal_adapter,D3DFMT_A4R4G4B4)) m_current_mode.display_mode.Format = D3DFMT_A4R4G4B4; + else if (TestFormat(m_ordinal_adapter,D3DFMT_X4R4G4B4)) m_current_mode.display_mode.Format = D3DFMT_X4R4G4B4; + } + + if (m_current_mode.display_mode.Format==D3DFMT_UNKNOWN) + { + m_lastErr = DXC_ERR_FORMAT; + MessageBox(m_hwnd, "DirectX initialization failed; unknown color format", "ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return FALSE; + } + + if (m_current_mode.screenmode == FULLSCREEN) + changed_fs_disp_mode = CheckAndCorrectFullscreenDispMode(m_ordinal_adapter, &m_current_mode.display_mode); + + // figure out pixel format of the z-buffer: (m_zFormat) + m_zFormat = D3DFMT_UNKNOWN; + if (TestDepth(m_ordinal_adapter,D3DFMT_D32 )) m_zFormat=D3DFMT_D32; + else if (TestDepth(m_ordinal_adapter,D3DFMT_D24S8 )) m_zFormat=D3DFMT_D24S8; + else if (TestDepth(m_ordinal_adapter,D3DFMT_D24X4S4 )) m_zFormat=D3DFMT_D24X4S4; + else if (TestDepth(m_ordinal_adapter,D3DFMT_D24X8 )) m_zFormat=D3DFMT_D24X8; + else if (TestDepth(m_ordinal_adapter,D3DFMT_D16 )) m_zFormat=D3DFMT_D16; + else if (TestDepth(m_ordinal_adapter,D3DFMT_D15S1 )) m_zFormat=D3DFMT_D15S1; + else if (TestDepth(m_ordinal_adapter,D3DFMT_D16_LOCKABLE)) m_zFormat=D3DFMT_D16_LOCKABLE; + + // get device caps: + memset(&m_caps, 0, sizeof(m_caps)); + if (FAILED(m_lpD3D->GetDeviceCaps(m_ordinal_adapter, D3DDEVTYPE_HAL, &m_caps))) + { + // that adapter was found in the system, but it might be disabled + // (i.e. 'extend my Windows desktop onto this monitor') is unchecked) + // so, try other adapters (try all sequentially). + + if (caps_tries < nAdapters) + { + // try again, this time using the default adapter: + m_ordinal_adapter = caps_tries; + caps_tries++; + } + else + { + m_lastErr = DXC_ERR_CAPSFAIL; + MessageBox(m_hwnd, + "DirectX initialization failed (GetDeviceCaps).\r" + "\r" + "This means that no valid 3D-accelerated display adapter could be found\r" + "on your computer." + "\r" + "If you know this is not the case, it is possible that your graphics\r" + "subsystem is temporarily unstable; please try rebooting your computer,\r" + "and then try to run the plugin again. Otherwise, please install a\r" + "3D-accelerated display adapter." + ,"ERROR",MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return FALSE; + } + } + else + { + caps_ok = 1; + } + } + while (!caps_ok); + + if (changed_fs_disp_mode) + { + MessageBox(m_hwnd, + "The fullscreen display mode selected from the config panel\r" + "was invalid, for some reason. For now, the closest match\r" + "(to the old selection) will be used.\r" + "\r" + "To fix this, please return to the config panel and select a new\r" + "fullscreen display mode.\r" + "\r" + "The plugin will now run using the best match...\r" + ,"WARNING", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + } + + switch(m_current_mode.display_mode.Format) + { + case D3DFMT_R8G8B8 : m_bpp = 32; break; + case D3DFMT_A8R8G8B8: m_bpp = 32; break; + case D3DFMT_X8R8G8B8: m_bpp = 32; break; + case D3DFMT_R5G6B5 : m_bpp = 16; break; + case D3DFMT_X1R5G5B5: m_bpp = 16; break; + case D3DFMT_A1R5G5B5: m_bpp = 16; break; + case D3DFMT_A8R3G3B2: m_bpp = 16; break; + case D3DFMT_A4R4G4B4: m_bpp = 16; break; + case D3DFMT_X4R4G4B4: m_bpp = 16; break; + case D3DFMT_R3G3B2 : m_bpp = 8; break; // misleading? implies a palette... + } + } +#endif + m_bpp = 32; + + // 5. set m_monitor_rect and m_monitor_work_rect. +/* if (hPluginMonitor) + { + MONITORINFO mi; + mi.cbSize = sizeof(mi); + if (GetMonitorInfo(hPluginMonitor, &mi)) + { + m_monitor_rect = mi.rcMonitor; + m_monitor_rect_orig = mi.rcMonitor; + m_monitor_work_rect = mi.rcWork; + m_monitor_work_rect_orig = mi.rcWork; + } + } +*/ + + // 6. embedded window stuff [where the plugin window is integrated w/winamp] +#if 0 + if (m_current_mode.m_skin) + { + // set up the window's position on screen + // note that we'd prefer to set the CLIENT size we want, but we can't, so we'll just do + // this here, and later, adjust the client rect size to what's left... + int size = GetWindowedModeAutoSize(0); // note: requires 'm_monitor_rect' has been set! + myWindowState.r.left = InternalGetPrivateProfileInt("settings","avs_wx",64,m_szIniFile); + myWindowState.r.top = InternalGetPrivateProfileInt("settings","avs_wy",64,m_szIniFile); + myWindowState.r.right = myWindowState.r.left + InternalGetPrivateProfileInt("settings","avs_ww",size+24,m_szIniFile); + myWindowState.r.bottom = myWindowState.r.top + InternalGetPrivateProfileInt("settings","avs_wh",size+40,m_szIniFile); + + // only works on winamp 2.90+! + int success = 0; + if (SendMessage(mod1.hwndParent,WM_WA_IPC,0,0) >= 0x2900) + { + myWindowState.flags |= EMBED_FLAGS_NOTRANSPARENCY; + HWND (*e)(embedWindowState *v); + *(void**)&e = (void *)SendMessage(mod1.hwndParent,WM_WA_IPC,(LPARAM)0,IPC_GET_EMBEDIF); + if (e) + { + m_current_mode.parent_window = e(&myWindowState); + if (m_current_mode.parent_window) + { + SetWindowText(m_current_mode.parent_window,m_szWindowCaption); + success = 1; + } + } + } + + if (!success) + m_current_mode.m_skin = 0; + } +#endif + // remember the client rect that was originally desired... +// RECT windowed_mode_desired_client_rect; +// windowed_mode_desired_client_rect.top = InternalGetPrivateProfileInt("settings","nMainWndTop",-1,m_szIniFile); +// windowed_mode_desired_client_rect.left = InternalGetPrivateProfileInt("settings","nMainWndLeft",-1,m_szIniFile); +// windowed_mode_desired_client_rect.right = InternalGetPrivateProfileInt("settings","nMainWndRight",-1,m_szIniFile); +// windowed_mode_desired_client_rect.bottom = InternalGetPrivateProfileInt("settings","nMainWndBottom",-1,m_szIniFile); + + // ...and in case windowed mode init fails severely, + // set it up to try next time for a simple 256x256 window. + // WriteSafeWindowPos(); + + // 7. create the window, if not already created +#if 0 + if (!m_hwnd) + { + m_hwnd = CreateWindowEx( + MY_EXT_WINDOW_STYLE, // extended style + m_szClassName, // class + m_szWindowCaption, // caption + MY_WINDOW_STYLE, // style + 0, // left + 0, // top + 256, // temporary width + 256, // temporary height + m_current_mode.parent_window, // parent window + NULL, // menu + m_hInstance, // instance + NULL + ); // parms + + if (!m_hwnd) + { + m_lastErr = DXC_ERR_CREATEWIN; + MessageBox(m_hwnd, "CreateWindow failed", "ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return FALSE; + } + + SetWindowLong(m_hwnd, GWL_USERDATA, m_uWindowLong); + + SendMessage(m_hwnd_winamp, WM_WA_IPC, (int)m_hwnd, IPC_SETVISWND); + + if (m_current_mode.m_skin) + ShowWindow(m_current_mode.parent_window,SW_SHOWNA); // showing the parent wnd will make it size the child, too + } +#endif + // 8. minimize winamp before creating devices & such, so there aren't + // any confusing window-focus issues +// MinimizeWinamp(hPluginMonitor); + + // 9. loop to try and create the window. + // if in windowed mode and not enough vidmem, it will try again w/smaller window + // (repeatedly, until window client size would be < 64) +#if 0 + int iteration = 0; + int device_ok = 0; + do + { + // set the window position + if (m_current_mode.screenmode==DESKTOP || + m_current_mode.screenmode==FAKE_FULLSCREEN) + { + int x = m_monitor_rect.right - m_monitor_rect.left; + int y = m_monitor_rect.bottom - m_monitor_rect.top; + + if (x >= y*2) + { + // (pseudo-multimon modes like 2048x768) + int mid = (m_monitor_rect.left + m_monitor_rect.right)/2; + if (m_current_mode.m_dualhead_horz==1) // show on left side + m_monitor_rect.right = mid; + else if (m_current_mode.m_dualhead_horz==2) // show on right side + m_monitor_rect.left = mid; + } + else if (y > x*4/3) + { + // (pseudo-multimon modes like 1024x1536) + int mid = (m_monitor_rect.top + m_monitor_rect.bottom)/2; + if (m_current_mode.m_dualhead_vert==1) // show on top half + m_monitor_rect.bottom = mid; + else if (m_current_mode.m_dualhead_vert==2) // show on bottom half + m_monitor_rect.top = mid; + } + + // recompute width & height (into x,y): + x = m_monitor_rect.right - m_monitor_rect.left; + y = m_monitor_rect.bottom - m_monitor_rect.top; + + m_client_width = x; + m_client_height = y; + m_window_width = x; + m_window_height = y; + + if (m_current_mode.screenmode == DESKTOP) + { + // note: we initially hide the window, and then + // only display it once the desktop is all nice & ready. + // see CPluginShell::DrawAndDisplay(). + SetWindowPos(m_hwnd,HWND_BOTTOM,m_monitor_rect.left,m_monitor_rect.top,m_window_width,m_window_height,SWP_HIDEWINDOW); + } + else // FAKE_FULLSCREEN + { + if (memcmp(&m_all_monitors_rect, &m_monitor_rect, sizeof(RECT))==0) + { + // there's only one display, and it's entirely covered + // by the plugin -> PUT THE PLUGIN ABOVE THE TASKBAR + // -> normally, if the user clicked another window, + // it would pop the taskbar to the top; but we don't + // have to worry about that here, since we're taking + // up the whole screen. + // -> don't worry about making the text, etc. avoid + // the taskbar in this case (see DrawAndDisplay()) + // -> DO worry about hiding the mouse cursor in this case + // (see WM_SETCURSOR handler) + + m_fake_fs_covers_all = 1; + //SetWindowPos(m_hwnd,HWND_TOPMOST,m_monitor_rect.left,m_monitor_rect.top,m_window_width,m_window_height,SWP_SHOWWINDOW); + } + else + { + // there is space to work outside of the plugin window. + // -> here we pretty much have to let the taskbar stay on + // top, because it really likes to be there; i.e., + // if you click any other window, it automatically + // pops up again. + // -> therefore, TRY TO KEEP THE WINDOW ON BOTTOM + // (below the taskbar). (see PushWindowToBack) + // -> don't worry about hiding the mouse cursor in this case + // (see WM_SETCURSOR handler) + // -> DO worry about making the text, etc. avoid + // the taskbar in this case (see DrawAndDisplay()) + + // (note that if taskbar is in the way, they can move it, + // since there are other monitors available) + + m_fake_fs_covers_all = 0; + //SetWindowPos(m_hwnd,HWND_TOP,m_monitor_rect.left,m_monitor_rect.top,m_window_width,m_window_height,SWP_SHOWWINDOW); + } + + SetWindowPos(m_hwnd,HWND_TOPMOST,m_monitor_rect.left,m_monitor_rect.top,m_window_width,m_window_height,SWP_SHOWWINDOW); + } + } + else if (m_current_mode.screenmode == FULLSCREEN) + { + int x = m_current_mode.display_mode.Width ; + int y = m_current_mode.display_mode.Height; + int cx = m_monitor_rect.right - m_monitor_rect.left; + int cy = m_monitor_rect.bottom - m_monitor_rect.top; + + // test #1 + if (x >= y*2 || y > x*4/3) // tackle problem of vert/horz spans + { + int ret = MessageBox(m_hwnd, + "You are trying to enter fullscreen mode while running\r" + "multiple displays in a vertical or horizontal span,\r" + "without using 'Fake Fullscreen Mode'. As a result,\r" + "--the image will be stretched over both displays.--\r" + "\r" + "If you would prefer the plugin to appear on only one display\r" + "(and still be free to operate on the other display),\r" + "please return to the config panel, enable 'Fake Fullscreen\r" + "Mode', click the 'DualHead' button to configure your DualHead\r" + "setup, and then try again.\r" + "\r" + "Hit OK to proceed, or Cancel to exit now." + ,"Tip", MB_OKCANCEL|MB_SETFOREGROUND|MB_TOPMOST); + if (ret==IDCANCEL) + { + m_lastErr = DXC_ERR_USER_CANCELED; + return FALSE; + } + } + + // test #2 + if ((cx >= cy*2 && x < y*2) || (cy > cx*4/3 && y <= x*4/3)) + { + int ret = MessageBox(m_hwnd, + "You are trying to enter fullscreen mode while running\r" + "multiple displays in a vertical or horizontal span,\r" + "but the display mode you are entering does not stretch\r" + "over both displays. As a result, --the image will only\r" + "appear on one display, and the other display will be disabled.--\r" + "\r" + "There are two alternatives:\r" + "\r" + "1. To make the fullscreen image appear on only ONE display\r" + "AND still be free to operate on the other display,\r" + "please return to the config panel and enable 'Fake Fullscreen Mode',\r" + "then click 'DualHead' to select which screen you'd like the\r" + "plugin to occupy. (--RECOMMENDED--)\r" + "\r" + "2. To make the fullscreen image stretch across BOTH displays,\r" + "return to the config panel and select a display mode that\r" + "spans both displays (such as 2048 x 768, or 1024 x 1536).\r" + "\r" + "Hit OK to continue, or Cancel to exit now." + + ,"Tip", MB_OKCANCEL|MB_SETFOREGROUND|MB_TOPMOST); + if (ret==IDCANCEL) + { + m_lastErr = DXC_ERR_USER_CANCELED; + return FALSE; + } + } + + m_client_width = x; + m_client_height = y; + m_window_width = x; + m_window_height = y; + SetWindowPos(m_hwnd,HWND_TOPMOST,m_monitor_rect.left,m_monitor_rect.top,m_window_width,m_window_height,SWP_SHOWWINDOW); + } + else // WINDOWED + { + RECT margin; + if (m_current_mode.m_skin) + { + RECT r1, r2; + GetWindowRect(GetParent(m_hwnd), &r1); + GetWindowRect( m_hwnd , &r2); + margin.left = r2.left - r1.left; + margin.right = r1.right - r2.right; + margin.top = r2.top - r1.top; + margin.bottom= r1.bottom - r2.bottom; + } + else + { + RECT r1; + SetRect(&r1, 0, 0, 256, 256); + AdjustWindowRect(&r1, MY_WINDOW_STYLE, 0); + margin.left = 0 - r1.left; + margin.right = r1.right - 256; + margin.top = 0 - r1.top; + margin.bottom= r1.bottom - 256; + } + + int autosize = 1; + + RECT r = windowed_mode_desired_client_rect; + if (iteration==0 && r.top != -1 && r.left != -1 && r.bottom != -1 && r.right != -1) + { + // use prev. window coordinates: + m_client_width = r.right - r.left; + m_client_height = r.bottom - r.top; + if (m_current_mode.m_skin) // check this here in case they got a non-aligned size by resizing when "integrated with winamp" was unchecked, then checked it & ran the plugin... + { + // STRANGE ALIGNMENTS FOR THE WINDOW FRAME: (required by winamp 2): + // the window frame's width must be divisible by 25, and height by 29. + if (SendMessage(mod1.hwndParent,WM_WA_IPC,0,0) < 0x4000) // ... winamp 5 doesn't have this prob. (test vs. 0x4000 because winamp5 betas have version tags like 0x4987) + { + m_client_width = ((m_client_width + margin.left + margin.right)/25)*25 - margin.left - margin.right; + m_client_height = ((m_client_height + margin.top + margin.bottom)/29)*29 - margin.top - margin.bottom; + } + } + + // transform screen-space CLIENT rect into screen-space WINDOW rect + r.top = windowed_mode_desired_client_rect.top - margin.top; + r.left = windowed_mode_desired_client_rect.left - margin.left; + r.right = r.left + margin.left + m_client_width + margin.right; + r.bottom = r.top + margin.top + m_client_height + margin.bottom; + + // make sure the window is entirely visible on the selected monitor; + // otherwise, autosize/place it. + // (note that this test is only appled 1) at startup, and 2) after a resize/max/restore. + // this test is not applied when merely moving the window.) + if (r.top >= m_monitor_work_rect.top && + r.left >= m_monitor_work_rect.left && + r.right <= m_monitor_work_rect.right && + r.bottom <= m_monitor_work_rect.bottom) + { + if (m_current_mode.m_skin) + { + m_window_width = m_client_width ; // m_window_width/height are for OUR borderless window, not the embedwnd parent frame. + m_window_height = m_client_height; + SetWindowPos(GetParent(m_hwnd),HWND_NOTOPMOST, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_SHOWWINDOW); + SetWindowPos( m_hwnd ,HWND_NOTOPMOST, windowed_mode_desired_client_rect.left, windowed_mode_desired_client_rect.top, m_client_width, m_client_height, SWP_SHOWWINDOW); + } + else + { + m_window_width = r.right - r.left; + m_window_height = r.bottom - r.top; + SetWindowPos(m_hwnd,HWND_NOTOPMOST,r.left,r.top,m_window_width,m_window_height,SWP_SHOWWINDOW); + } + + autosize = 0; + } + } + + if (autosize) + { + int size = GetWindowedModeAutoSize(iteration); // note: requires 'm_monitor_rect' has been set! + + m_client_width = size; + m_client_height = size; + + if (m_current_mode.m_skin) + { + // STRANGE ALIGNMENTS FOR THE WINDOW FRAME: (required by winamp 2): + // the window frame's width must be divisible by 25, and height by 29. + if (SendMessage(mod1.hwndParent,WM_WA_IPC,0,0) < 0x4000) // ... winamp 5 doesn't have this prob. (test vs. 0x4000 because winamp5 betas have version tags like 0x4987) + { + m_client_width = ((m_client_width + margin.left + margin.right)/25)*25 - margin.left - margin.right; + m_client_height = ((m_client_height + margin.top + margin.bottom)/29)*29 - margin.top - margin.bottom; + } + + m_window_width = m_client_width ; // m_window_width/height are for OUR [borderless] window, not the parent window (which is the embedwnd frame). + m_window_height = m_client_height; + SetWindowPos(GetParent(m_hwnd),HWND_NOTOPMOST, m_monitor_work_rect.left+32, m_monitor_work_rect.top+32, m_client_width + margin.left + margin.right, m_client_height + margin.top + margin.bottom, SWP_SHOWWINDOW); + SetWindowPos( m_hwnd ,HWND_NOTOPMOST, m_monitor_work_rect.left+32 + margin.left, m_monitor_work_rect.top+32 + margin.top, m_client_width, m_client_height, SWP_SHOWWINDOW); + } + else + { + SetRect(&r, 0, 0, size, size); + AdjustWindowRect(&r, MY_WINDOW_STYLE, 0); + + m_window_width = r.right - r.left; + m_window_height = r.bottom - r.top; + + SetWindowPos(m_hwnd,HWND_NOTOPMOST, m_monitor_work_rect.left+32, m_monitor_work_rect.top+32, m_window_width, m_window_height, SWP_SHOWWINDOW); + } + } + } + m_frame_delay = 1; // set this to 2 if you use triple buffering! + + { + m_current_mode.display_mode.Width = m_client_width; + m_current_mode.display_mode.Height = m_client_height; + + // set up m_d3dpp (presentation parameters): + ZeroMemory(&m_d3dpp,sizeof(m_d3dpp)); + m_d3dpp.Windowed = (m_current_mode.screenmode==FULLSCREEN) ? 0 : 1; + m_d3dpp.BackBufferFormat = m_current_mode.display_mode.Format; + m_d3dpp.BackBufferWidth = m_client_width; + m_d3dpp.BackBufferHeight = m_client_height; + m_d3dpp.BackBufferCount = m_current_mode.nbackbuf; + if (m_current_mode.screenmode==FULLSCREEN) + m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//D3DSWAPEFFECT_FLIP; + else // windowed or fake FS + m_d3dpp.SwapEffect = (m_current_mode.allow_page_tearing) ? D3DSWAPEFFECT_DISCARD : D3DSWAPEFFECT_COPY_VSYNC;//D3DSWAPEFFECT_DISCARD;//D3DSWAPEFFECT_FLIP; + // note: multisampling is only allowed if swapeffect is DISCARD! + m_d3dpp.MultiSampleType = (m_d3dpp.SwapEffect==D3DSWAPEFFECT_DISCARD) ? m_current_mode.multisamp : D3DMULTISAMPLE_NONE; + //m_d3dpp.hDeviceWindow = m_hwnd; + if (m_current_mode.screenmode==FULLSCREEN) + { + m_d3dpp.FullScreen_RefreshRateInHz = m_current_mode.display_mode.RefreshRate;//D3DPRESENT_RATE_DEFAULT; + m_d3dpp.FullScreen_PresentationInterval = m_current_mode.allow_page_tearing ? D3DPRESENT_INTERVAL_IMMEDIATE : D3DPRESENT_INTERVAL_ONE;//D3DPRESENT_INTERVAL_IMMEDIATE;//D3DPRESENT_INTERVAL_ONE; + } + if (m_zFormat != D3DFMT_UNKNOWN) + { + m_d3dpp.EnableAutoDepthStencil=TRUE; + m_d3dpp.AutoDepthStencilFormat=m_zFormat; + } + + // finally, create the device: + HRESULT hRes; + if(FAILED(hRes = m_lpD3D->CreateDevice( + m_ordinal_adapter, + D3DDEVTYPE_HAL, + m_hwnd, + (m_caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) ? D3DCREATE_MIXED_VERTEXPROCESSING : D3DCREATE_SOFTWARE_VERTEXPROCESSING, + &m_d3dpp, + &m_lpDevice ) ) ) + { + int code = LOWORD(hRes); + + char str[1024]; + if (code==2156) //D3DERR_NOTAVAILABLE + { + m_lastErr = DXC_ERR_CREATEDEV_NOT_AVAIL; + + char str[2048]; + sprintf(str, + "Unable to create a DirectX device. (D3DERR_NOTAVAILABLE)\r" + "\r" + "This could mean that you've chosen a combination of settings that is\r" + "not available on your video card. Try resetting the plugin to its\r" + "default settings (via the config panel's 'Default' button), and then\r" + "try running the plugin again.\r" + "\r" + "You might also want to close all other applications, to make sure they're\r" + "not interfering.\r" + "\r" + "If you have made any changes to your graphics subsystem since your\r" + "last reboot (such as updating video drivers, installing new software,\r" + "etc.), or have witnessed any strange behaviors, TRY REBOOTING first.\r" + "\r" + ); + if (m_current_mode.screenmode == FULLSCREEN) + strcat(str, + "NOTE: If you are trying to run the plugin on an older display adapter\r" + "(such as a Voodoo3 card), try going to the config panel (ALT+K)\r" + "and selecting a fullscreen display mode of a different color depth;\r" + "some of these older cards can only do 3D in particular color depths\r" + "(such as 16-bit color, for the Voodoo 3).\r" + ); + else + strcat(str, + "NOTE: If you are trying to run the plugin on an older display adapter\r" + "(such as a Voodoo3 card), try changing the color depth that Windows\r" + "is running in; some of these cards can only do 3D in particular color depths\r" + "(such as 16-bit color, for the Voodoo3).\r" + ); + + MessageBox(m_hwnd,str,"ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return FALSE; + } + else if (m_current_mode.screenmode==WINDOWED && m_client_width>64) + { + // DO NOTHING; try again w/smaller window + + } + else if (m_current_mode.screenmode != WINDOWED || m_client_width <= 64) + { + // usually, code==2154 here, which is D3DERR_OUTOFVIDEOMEMORY + m_lastErr = DXC_ERR_CREATEDEV_PROBABLY_OUTOFVIDEOMEMORY; + sprintf(str, + "DirectX initialization failed (CreateDevice; code %d)\r" + "\r" + "Often this means you don't have enough free video memory.\r" + ,LOWORD(hRes)); + + // NOTE: *A 'SUGGESTION' SCREEN SHOULD APPEAR NEXT, PROVIDED BY THE CALLER* + + MessageBox(m_hwnd, str, "ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return FALSE; + } + } + else + { + device_ok = 1; + } + } + + iteration++; + } + while (!device_ok); +#endif +m_bpp = 32; +m_client_width = 640; +m_client_height = 480; +m_window_width = 640; +m_window_height = 480; + // set initial viewport +// SetViewport(); + + // for desktop mode, push window to back again: +// if (m_current_mode.screenmode==DESKTOP) +// SetWindowPos(m_hwnd,HWND_BOTTOM,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); +// +// if (m_current_mode.m_skin) +// { +// SetFocus(m_current_mode.parent_window); +// //SetActiveWindow(m_current_mode.parent_window); +// //SetForegroundWindow(m_current_mode.parent_window); +// } + +// if (m_current_mode.screenmode == WINDOWED) +// SaveWindow(); + + // return success + m_ready = TRUE; + return TRUE; +} + +BOOL DXContext::StartOrRestartDevice(DXCONTEXT_PARAMS *pParams) +{ +#if 0 + // call this to [re]initialize the DirectX environment with new parameters. + // examples: startup; toggle windowed/fullscreen mode; change fullscreen resolution; + // and so on. + // be sure to clean up all your DirectX stuff first (textures, vertex buffers, + // D3DX allocations, etc.) and reallocate it afterwards! + + // note: for windowed mode, 'pParams->disp_mode' (w/h/r/f) is ignored. + + // destroy old window + if (m_hwnd) + { + SendMessage(m_hwnd_winamp, WM_WA_IPC, NULL, IPC_SETVISWND); + m_ignore_wm_destroy = 1; + DestroyWindow(m_hwnd); + m_ignore_wm_destroy = 0; + m_hwnd = NULL; + } + + if (myWindowState.me) + { + SetForegroundWindow(mod1.hwndParent); + DestroyWindow(myWindowState.me); + myWindowState.me = NULL; + } +#endif + if (!m_ready) + { + // first-time init: create a fresh new device + return Internal_Init(pParams, TRUE); + } + else + { + // re-init: preserve the DX8 object (m_lpD3D), + // but destroy and re-create the DX8 device (m_lpDevice). + m_ready = FALSE; + +// SafeRelease(m_lpDevice); + // but leave the D3D object! + + // RestoreWinamp(); + return Internal_Init(pParams, FALSE); + } +} + +BOOL DXContext::OnUserResizeWindow(RECT *new_window_rect, RECT *new_client_rect) +{ +#if 0 + // call this function on WM_EXITSIZEMOVE when running windowed. + // don't bother calling this when fullscreen. + // be sure to clean up all your DirectX stuff first (textures, vertex buffers, + // D3DX allocations, etc.) and reallocate it afterwards! + + if (!m_ready || (m_current_mode.screenmode != WINDOWED)) + return FALSE; + + if ((m_client_width == new_client_rect->right - new_client_rect->left) && + (m_client_height == new_client_rect->bottom - new_client_rect->top) && + (m_window_width == new_window_rect->right - new_window_rect->left) && + (m_window_height == new_window_rect->bottom - new_window_rect->top)) + { + return TRUE; + } + + m_ready = FALSE; + + m_window_width = new_window_rect->right - new_window_rect->left; + m_window_height = new_window_rect->bottom - new_window_rect->top; + m_client_width = new_client_rect->right - new_client_rect->left; + m_client_height = new_client_rect->bottom - new_client_rect->top; + + m_d3dpp.BackBufferWidth = m_client_width; + m_d3dpp.BackBufferHeight = m_client_height; + if (m_lpDevice->Reset( &m_d3dpp ) != D3D_OK) + { + WriteSafeWindowPos(); + + char str[1024]; + sprintf(str, + "Window resize failed.\r" + "\r" + "Often this means the application ran out of video memory;\r" + " perhaps you tried to make the window too large.\r" + ); + MessageBox(m_hwnd, str, "OUT OF VIDEO MEMORY", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + + m_lastErr = DXC_ERR_RESIZEFAILED; + return FALSE; + } + + SetViewport(); + m_ready = TRUE; +#endif + return TRUE; +} + +void DXContext::SetViewport() +{ + D3DVIEWPORT9 v; + v.X = 0; + v.Y = 0; + v.Width = m_client_width; + v.Height = m_client_height; + v.MinZ = 0.0f; + v.MaxZ = 1.0f; +// m_lpDevice->SetViewport(&v); +} + +void DXContext::MinimizeWinamp(HMONITOR hPluginMonitor) +{ +#if 0 + // minimize Winamp window + + HMONITOR hWinampMon = MonitorFromWindow(m_hwnd_winamp, MONITOR_DEFAULTTONEAREST); + HMONITOR hPluginMon = hPluginMonitor;//MonitorFromWindow(m_hwnd, MONITOR_DEFAULTTONEAREST);//m_lpD3D->GetAdapterMonitor(ordinal_adapter); + + if ((m_current_mode.screenmode == FULLSCREEN || m_current_mode.screenmode == FAKE_FULLSCREEN) && + (m_minimize_winamp) && + (hWinampMon && hPluginMon && hPluginMon==hWinampMon) && + (!m_winamp_minimized) + ) + { + // nitpicky check: if we're in fake fullscreen mode + // and are only going to display on half the screen, + // don't minimize Winamp. + if (m_current_mode.screenmode == FAKE_FULLSCREEN) + { + int x = m_monitor_rect.right - m_monitor_rect.left; + int y = m_monitor_rect.bottom - m_monitor_rect.top; + if ((x >= y*2 && m_current_mode.m_dualhead_horz != 0) || + (y > x*4/3 && m_current_mode.m_dualhead_vert != 0)) + { + return; + } + } + + ShowWindow(m_hwnd_winamp, SW_MINIMIZE); + // also restore the focus to the plugin window, since this will steal it: + SetFocus(m_hwnd); + SetActiveWindow(m_hwnd); + SetForegroundWindow(m_hwnd); + m_winamp_minimized = 1; + } +#endif +} + +void DXContext::RestoreWinamp() +{ +#if 0 + if (m_winamp_minimized) + { + ShowWindow(m_hwnd_winamp, SW_RESTORE); + m_winamp_minimized = 0; + } +#endif +} + +void DXContext::UpdateMonitorWorkRect() +{ +#if 0 + // get active monitor's bounding rectangle (to assist w/window positioning) + // note: in vert/horz span setups (psuedo-multimon), + // this will be 2048x768 or 1024x1536 or something like that. + + // calling this each frame allows you to detect when the taskbar + // moves around on the screen (from edge to edge), and rearrange + // the visual elements accordingly, so nothing is obscured. + + HMONITOR hMon = MonitorFromWindow(m_hwnd, MONITOR_DEFAULTTONEAREST);//m_lpD3D->GetAdapterMonitor(m_ordinal_adapter); + if (hMon) + { + MONITORINFO mi; + mi.cbSize = sizeof(mi); + if (GetMonitorInfo(hMon, &mi)) + { + m_monitor_work_rect = mi.rcWork; + m_monitor_work_rect_orig = mi.rcWork; + + // if the monitor rect we're using is the same as the + // whole area of the monitor, there's no need to update it... + //if (memcmp(&mi.rcMonitor, &m_monitor_rect, sizeof(RECT))==0) + // return; + + // otherwise, we're doing a half-screen special case + // and are running in some pseudo-multimon res like + // 2048x768 or 1024x1536, but only using half of it + // (i.e. fake fullscreen or desktop mode) + + // therefore... we need to update the work-area rectangle + // to reflect which half of the screen it's on. + + if (m_monitor_rect.left == mi.rcMonitor.left) + m_monitor_work_rect.left = mi.rcWork.left; + else + m_monitor_work_rect.left = m_monitor_rect.left + (mi.rcWork.left - mi.rcMonitor.left); + + if (m_monitor_rect.top == mi.rcMonitor.top) + m_monitor_work_rect.top = mi.rcWork.top; + else + m_monitor_work_rect.top = m_monitor_rect.top + (mi.rcWork.top - mi.rcMonitor.top); + + if (m_monitor_rect.right == mi.rcMonitor.right) + m_monitor_work_rect.right = mi.rcWork.right; + else + m_monitor_work_rect.right = m_monitor_rect.right; + + if (m_monitor_rect.bottom == mi.rcMonitor.bottom) + m_monitor_work_rect.bottom = mi.rcWork.bottom; + else + m_monitor_work_rect.bottom = m_monitor_rect.bottom; + } + } +#endif +} + +void DXContext::SaveWindow() +{ +#if 0 + if (m_current_mode.screenmode == WINDOWED) + { + RECT c; + GetClientRect( m_hwnd, &c ); + + // convert client rect from client coords to screen coords: + // (window rect is already in screen coords...) + POINT p; + p.x = c.left; + p.y = c.top; + if (ClientToScreen(m_hwnd, &p)) + { + c.left += p.x; + c.right += p.x; + c.top += p.y; + c.bottom += p.y; + } + + // save bounds for window CLIENT area, but in screen coords + WritePrivateProfileInt(c.top, "nMainWndTop", m_szIniFile, "settings"); + WritePrivateProfileInt(c.left, "nMainWndLeft", m_szIniFile, "settings"); + WritePrivateProfileInt(c.right, "nMainWndRight", m_szIniFile, "settings"); + WritePrivateProfileInt(c.bottom,"nMainWndBottom", m_szIniFile, "settings"); + + // also save bounds for embedwnd + if (m_current_mode.m_skin && myWindowState.me) + { + WritePrivateProfileInt(myWindowState.r.left,"avs_wx",m_szIniFile,"settings"); + WritePrivateProfileInt(myWindowState.r.top ,"avs_wy",m_szIniFile,"settings"); + WritePrivateProfileInt(myWindowState.r.right-myWindowState.r.left,"avs_ww",m_szIniFile,"settings"); + WritePrivateProfileInt(myWindowState.r.bottom-myWindowState.r.top,"avs_wh",m_szIniFile,"settings"); + } + else if (!m_current_mode.m_skin && m_hwnd) + { + RECT r; + GetWindowRect(m_hwnd, &r); + WritePrivateProfileInt(r.left,"avs_wx",m_szIniFile,"settings"); + WritePrivateProfileInt(r.top ,"avs_wy",m_szIniFile,"settings"); + WritePrivateProfileInt(r.right-r.left,"avs_ww",m_szIniFile,"settings"); + WritePrivateProfileInt(r.bottom-r.top,"avs_wh",m_szIniFile,"settings"); + } + } +#endif +} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/dxcontext.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/dxcontext.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/dxcontext.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/dxcontext.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,151 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef __NULLSOFT_DX8_PLUGIN_SHELL_DXCONTEXT_H__ +#define __NULLSOFT_DX8_PLUGIN_SHELL_DXCONTEXT_H__ 1 + +#include +//#include +#include "shell_defines.h" +//#include "defines.h" +#include +#include + +typedef struct +{ + eScrMode screenmode; // WINDOWED, FULLSCREEN, or FAKE FULLSCREEN + int nbackbuf; + int allow_page_tearing; + GUID adapter_guid; + D3DDISPLAYMODE display_mode; // ONLY VALID FOR FULLSCREEN MODE. + D3DMULTISAMPLE_TYPE multisamp; + HWND parent_window; + int m_dualhead_horz; // 0 = span both, 1 = left only, 2 = right only + int m_dualhead_vert; // 0 = span both, 1 = top only, 2 = bottom only + int m_skin; +} +DXCONTEXT_PARAMS; + +#define MAX_DXC_ADAPTERS 32 + +class DXContext +{ + public: + // PUBLIC FUNCTIONS + DXContext(LPDIRECT3DDEVICE9 device, char* szIniFile); +// DXContext(int hWndWinamp,HINSTANCE hInstance,LPCSTR szClassName,LPCSTR szWindowCaption,WNDPROC pProc,LONG uWindowLong, int minimize_winamp, char* szIniFile); + ~DXContext(); + BOOL StartOrRestartDevice(DXCONTEXT_PARAMS *pParams); // also serves as Init() function + BOOL OnUserResizeWindow(RECT *new_window_rect, RECT *new_client_rect); + inline HWND GetHwnd() { return m_hwnd; }; + inline int TempIgnoreDestroyMessages() { return m_ignore_wm_destroy; }; + void OnTrulyExiting() { m_truly_exiting = 1; } + void UpdateMonitorWorkRect(); + int GetBitDepth() { return m_bpp; }; + inline D3DFORMAT GetZFormat() { return m_zFormat; }; + char* GetDriver() { return m_szDriver; }; + char* GetDesc() { return m_szDesc; }; + void SaveWindow(); + + // PUBLIC DATA - DO NOT WRITE TO THESE FROM OUTSIDE THE CLASS + int m_ready; + HRESULT m_lastErr; + int m_window_width; + int m_window_height; + int m_client_width; + int m_client_height; + int m_fake_fs_covers_all; + int m_frame_delay; + RECT m_all_monitors_rect; // rect that encompasses all monitors that make up the desktop. The primary monitor's upper-left corner is (0,0). + RECT m_monitor_rect; // rect for monitor the plugin is running on; for pseudo-multimon modes like 2048x768, if user decides to only run on half the monitor, this rect reflects that as well. + RECT m_monitor_rect_orig; // same, but it's the original rect; does not account for pseudo-multimon modes like 2048x768 + RECT m_monitor_work_rect; // same, but excludes the taskbar area. + RECT m_monitor_work_rect_orig; // original work rect; does not account for pseudo-multimon modes like 2048x768 + DXCONTEXT_PARAMS m_current_mode; + LPDIRECT3DDEVICE9 m_lpDevice; + D3DPRESENT_PARAMETERS m_d3dpp; + //LPDIRECT3D9 m_lpD3D; + D3DCAPS9 m_caps; + + protected: + D3DMULTISAMPLE_TYPE m_multisamp; + D3DFORMAT m_zFormat; + D3DFORMAT m_orig_windowed_mode_format[MAX_DXC_ADAPTERS]; + HMODULE m_hmod_d3d8; + int m_ordinal_adapter; + HWND m_hwnd; + HWND m_hwnd_winamp; + LONG m_uWindowLong; + char m_szClassName[256]; + char m_szWindowCaption[512]; + char m_szIniFile[MAX_PATH]; + char m_szDriver[512]; + char m_szDesc[512]; + HINSTANCE m_hInstance; + int m_ignore_wm_destroy; + int m_minimize_winamp; + int m_winamp_minimized; + int m_truly_exiting; + int m_bpp; + + embedWindowState myWindowState; + + void WriteSafeWindowPos(); + int GetWindowedModeAutoSize(int iteration); + BOOL TestDepth(int ordinal_adapter, D3DFORMAT fmt); + BOOL TestFormat(int ordinal_adapter, D3DFORMAT fmt); + int CheckAndCorrectFullscreenDispMode(int ordinal_adapter, D3DDISPLAYMODE *pdm); + void SetViewport(); + void MinimizeWinamp(HMONITOR hPluginMonitor); + BOOL Internal_Init(DXCONTEXT_PARAMS *pParams, BOOL bFirstInit); + void Internal_CleanUp(); + void RestoreWinamp(); +}; + +#define DXC_ERR_REGWIN -2 +#define DXC_ERR_CREATEWIN -3 +#define DXC_ERR_CREATE3D -4 +#define DXC_ERR_GETFORMAT -5 +#define DXC_ERR_FORMAT -6 +#define DXC_ERR_CREATEDEV_PROBABLY_OUTOFVIDEOMEMORY -7 +#define DXC_ERR_RESIZEFAILED -8 +#define DXC_ERR_CAPSFAIL -9 +#define DXC_ERR_BAD_FS_DISPLAYMODE -10 +#define DXC_ERR_USER_CANCELED -11 +#define DXC_ERR_CREATEDEV_NOT_AVAIL -12 +#define DXC_ERR_CREATEDDRAW -13 + + + + + + + +#endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/CAL_TAB.C kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/CAL_TAB.C --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/CAL_TAB.C 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/CAL_TAB.C 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,601 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +//#include +#include +#include "Compiler.h" +#include "eval.h" + +#define VALUE 258 +#define IDENTIFIER 259 +#define FUNCTION1 260 +#define FUNCTION2 261 +#define FUNCTION3 262 +#define UMINUS 263 +#define UPLUS 264 +#define YYSTYPE int + +int yyerror(char *); +int yylex(char **exp); + +extern int result; + +typedef struct +{ + int timestamp; + int first_line; + int first_column; + int last_line; + int last_column; + char *text; +} yyltype; + +#define YYLTYPE yyltype + +#define YYFINAL 51 +#define YYFLAG -32768 +#define YYNTBASE 21 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 264 ? yytranslate[x] : 26) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 14, 9, 2, 18, + 19, 12, 10, 20, 11, 2, 13, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 17, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, + 6, 7, 15, 16 +}; + + +static const short yyr1[] = { 0, + 21, 21, 22, 23, 23, 23, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 25, 25, 25 +}; + +static const short yyr2[] = { 0, + 1, 3, 1, 1, 1, 3, 1, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 1, 4, 6, 8 +}; + +static const short yydefact[] = { 0, + 3, 4, 0, 0, 0, 0, 0, 0, 5, 7, + 1, 17, 0, 0, 0, 0, 4, 16, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 6, 14, 13, 11, 12, 8, 9, 10, 18, + 0, 0, 0, 0, 19, 0, 0, 20, 0, 0, + 0 +}; + +static const short yydefgoto[] = { 49, + 9, 10, 11, 12 +}; + +static const short yypact[] = { 19, +-32768, -11, -7, -5, -4, 38, 38, 38,-32768,-32768, + 136,-32768, 38, 38, 38, 38,-32768,-32768,-32768, 88, + 38, 38, 38, 38, 38, 38, 38, 136, 100, 49, + 62,-32768, 41, 54, -9, -9,-32768,-32768,-32768,-32768, + 38, 38, 112, 75,-32768, 38, 124,-32768, 12, 27, +-32768 +}; + +static const short yypgoto[] = {-32768, +-32768,-32768, -6,-32768 +}; + + +#define YYLAST 150 + + +static const short yytable[] = { 18, + 19, 20, 25, 26, 27, 13, 28, 29, 30, 31, + 14, 50, 15, 16, 33, 34, 35, 36, 37, 38, + 39, 1, 2, 3, 4, 5, 51, 0, 6, 7, + 0, 0, 0, 0, 43, 44, 8, 0, 0, 47, + 1, 17, 3, 4, 5, 0, 0, 6, 7, 22, + 23, 24, 25, 26, 27, 8, 21, 22, 23, 24, + 25, 26, 27, 23, 24, 25, 26, 27, 41, 21, + 22, 23, 24, 25, 26, 27, 0, 0, 0, 0, + 0, 42, 21, 22, 23, 24, 25, 26, 27, 0, + 0, 0, 0, 0, 46, 21, 22, 23, 24, 25, + 26, 27, 0, 0, 0, 0, 32, 21, 22, 23, + 24, 25, 26, 27, 0, 0, 0, 0, 40, 21, + 22, 23, 24, 25, 26, 27, 0, 0, 0, 0, + 45, 21, 22, 23, 24, 25, 26, 27, 0, 0, + 0, 0, 48, 21, 22, 23, 24, 25, 26, 27 +}; + +static const short yycheck[] = { 6, + 7, 8, 12, 13, 14, 17, 13, 14, 15, 16, + 18, 0, 18, 18, 21, 22, 23, 24, 25, 26, + 27, 3, 4, 5, 6, 7, 0, -1, 10, 11, + -1, -1, -1, -1, 41, 42, 18, -1, -1, 46, + 3, 4, 5, 6, 7, -1, -1, 10, 11, 9, + 10, 11, 12, 13, 14, 18, 8, 9, 10, 11, + 12, 13, 14, 10, 11, 12, 13, 14, 20, 8, + 9, 10, 11, 12, 13, 14, -1, -1, -1, -1, + -1, 20, 8, 9, 10, 11, 12, 13, 14, -1, + -1, -1, -1, -1, 20, 8, 9, 10, 11, 12, + 13, 14, -1, -1, -1, -1, 19, 8, 9, 10, + 11, 12, 13, 14, -1, -1, -1, -1, 19, 8, + 9, 10, 11, 12, 13, 14, -1, -1, -1, -1, + 19, 8, 9, 10, 11, 12, 13, 14, -1, -1, + -1, -1, 19, 8, 9, 10, 11, 12, 13, 14 +}; +#define YYPURE 1 + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT return(0) +#define YYABORT return(1) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYIMPURE +#define YYLEX yylex(&exp) +#endif + +#ifndef YYPURE +#define YYLEX yylex(&yylval)//, &yylloc) MY MODIF! +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYIMPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + + +int yynerrs; /* number of parse errors so far */ +#endif /* YYIMPURE */ + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#define YYINITDEPTH 5000 +#define YYMAXDEPTH 5000 + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +#define __yy_bcopy(from,to,count) memcpy(to,from,(count)>0?(count):0) + +//#ln 131 "bison.simple" +int yyparse(char *exp) +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + + int yystacksize = YYINITDEPTH; + +#ifndef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + + yylval = 0; + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. */ + + yyssp = yyss - 1; + yyvsp = yyvs; + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + + if (yystacksize >= YYMAXDEPTH) + { + yyerror("internal error: parser stack overflow"); + return 2; + } + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; + + + if (yyssp >= yyss + yystacksize - 1) YYABORT; + } + + +// yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +// yyStackSize = yyssp - (yyss - 1); + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + + } + else + { + yychar1 = YYTRANSLATE(yychar); + + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + + + switch (yyn) { + +case 1: +//#ln 32 "cal.y" +{ yyval = yyvsp[0]; result = yyvsp[0]; ; + break;} +case 2: +//#ln 34 "cal.y" +{ { + int i = (int)setVar((int)yyvsp[-2], 0); + int v = createCompiledValue(0, &(varTable[i].value)); + yyval = createCompiledFunction2(MATH_SIMPLE, FN_ASSIGN, v, (int)yyvsp[0]); + result = yyval; + } + ; + break;} +case 3: +//#ln 50 "cal.y" +{ yyval = yyvsp[0] ; + break;} +case 4: +//#ln 55 "cal.y" +{ yyval = getVar((int)yyvsp[0]);; + break;} +case 5: +//#ln 57 "cal.y" +{ yyval = yyvsp[0];; + break;} +case 6: +//#ln 59 "cal.y" +{ yyval = yyvsp[-1];; + break;} +case 7: +//#ln 64 "cal.y" +{ yyval = yyvsp[0]; ; + break;} +case 8: +//#ln 66 "cal.y" +{ yyval = createCompiledFunction2(MATH_SIMPLE, FN_MULTIPLY, yyvsp[-2], yyvsp[0]); + break;} +case 9: +//#ln 72 "cal.y" +{ yyval = createCompiledFunction2(MATH_SIMPLE, FN_DIVIDE, yyvsp[-2], yyvsp[0]); + break;} +case 10: +//#ln 78 "cal.y" +{ yyval = createCompiledFunction2(MATH_SIMPLE, FN_MODULO, yyvsp[-2], yyvsp[0]); + break;} +case 11: +//#ln 84 "cal.y" +{ yyval = createCompiledFunction2(MATH_SIMPLE, FN_ADD, yyvsp[-2], yyvsp[0]); + break;} +case 12: +//#ln 90 "cal.y" +{ yyval = createCompiledFunction2(MATH_SIMPLE, FN_SUB, yyvsp[-2], yyvsp[0]); + break;} +case 13: +//#ln 96 "cal.y" +{ yyval = createCompiledFunction2(MATH_SIMPLE, FN_AND, yyvsp[-2], yyvsp[0]); + break;} +case 14: +//#ln 102 "cal.y" +{ yyval = createCompiledFunction2(MATH_SIMPLE, FN_OR, yyvsp[-2], yyvsp[0]); + break;} +case 15: +//#ln 108 "cal.y" +{ yyval = createCompiledFunction1(MATH_SIMPLE, FN_UMINUS, yyvsp[0]); + break;} +case 16: +//#ln 114 "cal.y" +{ yyval = createCompiledFunction1(MATH_SIMPLE, FN_UPLUS, yyvsp[0]); + break;} +case 17: +//#ln 120 "cal.y" +{ yyval = yyvsp[0]; + break;} +case 18: +//#ln 125 "cal.y" +{ yyval = createCompiledFunction1(MATH_FN, (int)yyvsp[-3], yyvsp[-1]); + break;} +case 19: +//#ln 131 "cal.y" +{ yyval = createCompiledFunction2(MATH_FN, (int)yyvsp[-5], yyvsp[-3], yyvsp[-1]); + break;} +case 20: +//#ln 137 "cal.y" +{ yyval = createCompiledFunction3(MATH_FN, (int)yyvsp[-7], yyvsp[-5], yyvsp[-3], yyvsp[-1]); + break;} +} + /* the action file gets copied in in place of this dollarsign */ +//#ln 362 "bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; + + *++yyvsp = yyval; + + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; +#error this should not compile + msg = (char *) xmalloc(size + 15); + strcpy(msg, "syntax error"); + + if (count < 5) + { + count = 0; + for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("syntax error"); + } + +//yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) YYABORT; + + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; + + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + yystate = yyn; + goto yynewstate; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cal_tab.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cal_tab.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cal_tab.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cal_tab.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,42 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +#ifndef YYSTYPE +#define YYSTYPE int +#endif +#define VALUE 258 +#define IDENTIFIER 259 +#define FUNCTION1 260 +#define FUNCTION2 261 +#define FUNCTION3 262 +#define UMINUS 263 +#define UPLUS 264 + + +extern YYSTYPE yylval; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cal.y kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cal.y --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cal.y 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cal.y 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,155 @@ + + %{ + #define YYSTYPE double + #include + #include + #include "Compiler.h" + #include "eval.h" + + yyerror(char *); + yylex(); + + extern int yyStackSize; + extern double result; + + int regs[26]; + int base; + + %} + + %token VALUE IDENTIFIER FUNCTION1 FUNCTION2 FUNCTION3 + + %left '|' + %left '&' + %left '+' '-' + %left '*' '/' '%' + %left UMINUS /*supplies precedence for unary minus */ + %left UPLUS /*supplies precedence for unary plus */ + + %% /*beginning of rules section */ + + stat : math_expr + { $$ = $1; result = $1; } + | IDENTIFIER '=' math_expr + { if (parseType == PARSE_EVAL) + { + setVar((int)$1, $3); + $$ = $3; + result = $3; + } + else + { + double i = setVar((int)$1, 0); + double v = createCompiledValue(0, &(varTable[(int)i].value)); + $$ = createCompiledFunction2(MATH_SIMPLE, FN_ASSIGN, v, $3); + result = $$; + } + } + ; + + value : VALUE { $$ = $1 } + + + primary_expr + : IDENTIFIER + { $$ = getVar((int)$1);} + | value + { $$ = $1;} + | '(' math_expr ')' + { $$ = $2;} + ; + + math_expr + : primary_expr + { $$ = $1; } + | math_expr '*' math_expr + { if (parseType == PARSE_EVAL) + $$ = $1 * $3; + else + $$ = createCompiledFunction2(MATH_SIMPLE, FN_MULTIPLY, $1, $3); + } + | math_expr '/' math_expr + { if (parseType == PARSE_EVAL) + $$ = $1 / $3; + else + $$ = createCompiledFunction2(MATH_SIMPLE, FN_DIVIDE, $1, $3); + } + | math_expr '%' math_expr + { if (parseType == PARSE_EVAL) + $$ = (double)((int)$1 % (int)$3); + else + $$ = createCompiledFunction2(MATH_SIMPLE, FN_MODULO, $1, $3); + } + | math_expr '+' math_expr + { if (parseType == PARSE_EVAL) + $$ = $1 + $3; + else + $$ = createCompiledFunction2(MATH_SIMPLE, FN_ADD, $1, $3); + } + | math_expr '-' math_expr + { if (parseType == PARSE_EVAL) + $$ = $1 - $3; + else + $$ = createCompiledFunction2(MATH_SIMPLE, FN_SUB, $1, $3); + } + | math_expr '&' math_expr + { if (parseType == PARSE_EVAL) + $$ = (double)((int)$1 & (int)$3); + else + $$ = createCompiledFunction2(MATH_SIMPLE, FN_AND, $1, $3); + } + | math_expr '|' math_expr + { if (parseType == PARSE_EVAL) + $$ = (double)((int)$1 | (int)$3); + else + $$ = createCompiledFunction2(MATH_SIMPLE, FN_OR, $1, $3); + } + | '-' math_expr %prec UMINUS + { if (parseType == PARSE_EVAL) + $$ = -$2; + else + $$ = createCompiledFunction1(MATH_SIMPLE, FN_UMINUS, $2); + } + | '+' math_expr %prec UPLUS + { if (parseType == PARSE_EVAL) + $$ = +$2; + else + $$ = createCompiledFunction1(MATH_SIMPLE, FN_UPLUS, $2); + } + | fonction + { $$ = $1; } + ; + + fonction + : FUNCTION1 '(' math_expr ')' + { if (parseType == PARSE_EVAL) + $$ = calcFunction1((int)$1, $3); + else + $$ = createCompiledFunction1(MATH_FN, (int)$1, $3); + } + | FUNCTION2 '(' math_expr ',' math_expr ')' + { if (parseType == PARSE_EVAL) + $$ = calcFunction2((int)$1, $3, $5); + else + $$ = createCompiledFunction2(MATH_FN, (int)$1, $3, $5); + } + | FUNCTION3 '(' math_expr ',' math_expr ',' math_expr ')' + { if (parseType == PARSE_EVAL) + $$ = calcFunction3((int)$1, $3, $5, $7); + else + $$ = createCompiledFunction3(MATH_FN, (int)$1, $3, $5, $7); + } + ; + + + + %% + main() + { + return(yyparse()); + } + + yywrap() + { + return(1); + } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cfunc.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cfunc.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cfunc.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/cfunc.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,879 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +#include +//#include +#include +#include +#include "Compiler.h" +#include "eval.h" +#pragma warning(disable: 4312) + +static float g_cmpaddtab[2]={0.0,1.0}; +static double g_closefact = 0.00001, g_half=0.5; +extern double *nextBlock; + + +// FUNCTION CALL TEMPLATES - THESE ARE NEVER ACTUALLY CALLED, +// BUT COPIED AND MODIFIED. +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_simpleValue(void) +{ + __asm + { + mov eax, 0FFFFFFFFh; + ret + } +} +__declspec ( naked ) void _asm_simpleValue_end(void){} + + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_function3(void) +{ + __asm + { + mov ecx, 0FFFFFFFFh + call ecx + push eax + mov ecx, 0FFFFFFFFh + call ecx + push eax + mov ecx, 0FFFFFFFFh + call ecx + pop ebx + pop ecx + mov edx, 0FFFFFFFFh + jmp edx + } +} +__declspec ( naked ) void _asm_function3_end(void){} + + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_function2(void) +{ + __asm + { + mov ecx, 0FFFFFFFFh + call ecx + push eax + mov ecx, 0FFFFFFFFh + call ecx + pop ebx + mov ecx, 0FFFFFFFFh + jmp ecx + } +} +__declspec ( naked ) void _asm_function2_end(void){} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_function1(void) +{ + __asm + { + mov ecx, 0FFFFFFFFh + call ecx + mov ecx, 0FFFFFFFFh + jmp ecx + } +} +__declspec ( naked ) void _asm_function1_end(void){} + +// END FUNCTION CALL TEMPLATES + + + +// our registers +static int a,b; +static double *res; + + +#define isnonzero(x) (fabs(x) > g_closefact) + +//--------------------------------------------------------------------------------------------------------------- +static double _rand(double x) +{ + if (x < 1.0) x=1.0; + return (double)(rand()%(int)max(x,1.0)); +} + +//--------------------------------------------------------------------------------------------------------------- +static double _band(double var, double var2) +{ +return isnonzero(var) && isnonzero(var2) ? 1 : 0; +} + +//--------------------------------------------------------------------------------------------------------------- +static double _bor(double var, double var2) +{ +return isnonzero(var) || isnonzero(var2) ? 1 : 0; +} + +//--------------------------------------------------------------------------------------------------------------- +static double _sig(double x, double constraint) +{ +double t = (1+exp(-x*constraint)); +return isnonzero(t) ? 1.0/t : 0; +} + + + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_int(void) +{ + __asm mov dword ptr a, eax + + res = nextBlock++; + + _asm mov edx, DWORD PTR a + _asm fld QWORD PTR [edx] + _asm mov edx, DWORD PTR res + _asm fistp DWORD PTR [edx] + _asm fild DWORD PTR[edx] + _asm fstp QWORD PTR [edx] + _asm mov eax, res + _asm ret + +/* + MrC - The old version uses _ftol2_sse which stomps over our stack + *res = (double) ((int)(*((double*)a))); + __asm + { + mov eax, res + ret + } +*/ +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_asin(void) +{ + __asm mov dword ptr a, eax + + res = nextBlock++; + + *res = asin(*(double*)a); + __asm + { + mov eax, res + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_acos(void) +{ + __asm mov dword ptr a, eax + + res = nextBlock++; + + *res = acos(*(double*)a); + __asm + { + mov eax, res + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_atan(void) +{ + __asm mov dword ptr a, eax + + res = nextBlock++; + + *res = atan(*(double*)a); + __asm + { + mov eax, res + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_atan2(void) +{ + __asm + { + mov dword ptr a, eax + mov dword ptr b, ebx + } + + res = nextBlock++; + *res = atan2(*(double*)b, *(double*)a); + __asm + { + mov eax, res + ret + } +} + + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_sig(void) +{ + __asm + { + mov dword ptr a, eax + mov dword ptr b, ebx + } + res = nextBlock++; + *res = _sig(*(double*)b, *(double*)a); + __asm + { + mov eax, dword ptr res + ret + } +} +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_rand(void) +{ + __asm + { + mov dword ptr a, eax + } + + res = nextBlock++; + *res = _rand(*(double*)a); + + __asm + { + mov eax, res + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_band(void) +{ + __asm + { + mov dword ptr a, eax + mov dword ptr b, ebx + } + + res = nextBlock++; + *res = _band(*(double*)b, *(double*)a); + __asm + { + mov eax, res + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_bor(void) +{ + __asm + { + mov dword ptr a, eax + mov dword ptr b, ebx + } + + res = nextBlock++; + *res = _bor(*(double*)b, *(double*)a); + __asm + { + mov eax, res + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_pow(void) +{ + __asm + { + mov dword ptr a, eax + mov dword ptr b, ebx + } + + res = nextBlock++; + *res = pow(*(double*)b, *(double*)a); + __asm + { + mov eax, res + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_exp(void) +{ + __asm mov dword ptr a, eax + + res = nextBlock++; + + *res = exp(*(double*)a); + __asm + { + mov eax, res + ret + } +} + + + + + + + + + + +// these below are all asm, no loops, radness + + + + + + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_sin(void) +{ + __asm + { + fld qword ptr [eax] + mov eax, nextBlock + fsin + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_cos(void) +{ + __asm + { + fld qword ptr [eax] + mov eax, nextBlock + fcos + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_tan(void) +{ + __asm + { + fld qword ptr [eax] + mov eax, nextBlock + fsincos + fdiv + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_sqr(void) +{ + __asm + { + fld qword ptr [eax] + fld st(0) + mov eax, nextBlock + fmul + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_sqrt(void) +{ + __asm + { + fld qword ptr [eax] + mov eax, nextBlock + fabs + fsqrt + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_log(void) +{ + __asm + { + fld1 + fldl2e + fdiv + fld qword ptr [eax] + mov eax, nextBlock + fyl2x + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_log10(void) +{ + __asm + { + fld1 + fldl2t + fdiv + fld qword ptr [eax] + mov eax, nextBlock + fyl2x + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_abs(void) +{ + __asm + { + fld qword ptr [eax] + mov eax, nextBlock + fabs + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_assign(void) +{ + __asm + { + mov ecx, [eax] + mov edx, [eax+4] + mov [ebx], ecx + mov [ebx+4], edx + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_add(void) +{ + __asm + { + fld qword ptr [eax] + mov eax, nextBlock + fld qword ptr [ebx] + fadd + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_sub(void) +{ + __asm + { + fld qword ptr [ebx] + fld qword ptr [eax] + mov eax, nextBlock + fsub + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_mul(void) +{ + __asm + { + fld qword ptr [ebx] + fld qword ptr [eax] + mov eax, nextBlock + fmul + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_div(void) +{ + __asm + { + fld qword ptr [ebx] + fdiv qword ptr [eax] + mov eax, nextBlock + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_mod(void) +{ + __asm + { + fld qword ptr [ebx] + + fld qword ptr [eax] + fsub dword ptr [g_cmpaddtab+4] + fabs + fadd qword ptr [eax] + fadd dword ptr [g_cmpaddtab+4] + + fmul qword ptr [g_half] + + mov ebx, nextBlock + + fistp dword ptr [ebx] + fistp dword ptr [ebx+4] + mov eax, [ebx+4] + xor edx, edx + div dword ptr [ebx] + mov [ebx], edx + fild dword ptr [ebx] + fstp qword ptr [ebx] + mov eax, ebx + add ebx, 8 + mov nextBlock, ebx // eax is still good + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_or(void) +{ + __asm + { + fld qword ptr [ebx] + fld qword ptr [eax] + mov eax, nextBlock + fistp qword ptr [eax] + fistp qword ptr [eax+8] + mov ebx, [eax] + or [eax+4], ebx + mov ebx, [eax+8] + or [eax+12], ebx + fild qword ptr [eax] + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_and(void) +{ + __asm + { + fld qword ptr [ebx] + fld qword ptr [eax] + mov eax, nextBlock + fistp qword ptr [eax] + fistp qword ptr [eax+8] + mov ebx, [eax] + and [eax+4], ebx + mov ebx, [eax+8] + and [eax+12], ebx + fild qword ptr [eax] + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_uplus(void) +{ + __asm + { + mov ebx, nextBlock + mov ecx, [eax] + mov [ebx], ecx + mov ecx, [eax+4] + mov [ebx+4], ecx + mov eax, ebx + add ebx, 8 + mov nextBlock, ebx + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_uminus(void) +{ + __asm + { + mov ebx, nextBlock + mov ecx, [eax] + mov [ebx], ecx + mov ecx, [eax+4] + xor ecx, 0x80000000 + mov [ebx+4], ecx + mov eax, ebx + add ebx, 8 + mov nextBlock, ebx + ret + } +} + + + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_sign(void) +{ + __asm + { + fld qword ptr [eax] + fld st(0) + fabs + mov eax, nextBlock + fld qword ptr [g_closefact] + fadd + fdiv + fstp qword ptr [eax] + add eax, 8 + mov nextBlock, eax + sub eax, 8 + ret + } +} + + + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_bnot(void) +{ + __asm + { + mov ebx, nextBlock + fld qword ptr [g_closefact] + fld qword ptr [eax] + fabs + fcompp + fstsw ax + shr eax, 6 + and eax, (1<<2) + add eax, offset g_cmpaddtab + fld dword ptr [eax] + fstp qword ptr [ebx] + mov eax, ebx + add ebx, 8 + mov nextBlock, ebx + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_if(void) +{ + __asm + { + fld qword ptr [eax] + fld qword ptr [ebx] + fld qword ptr [g_closefact] + fld qword ptr [ecx] + fabs + fcompp + fstsw ax + mov ebx, nextBlock + fstp qword ptr [ebx] + fstp qword ptr [ebx+8] + shr eax, 5 + and eax, (1<<3) + add eax, ebx + fld qword ptr [eax] + fstp qword ptr [ebx] + mov eax, ebx + add ebx, 8 + mov nextBlock, ebx + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_equal(void) +{ + __asm + { + fld qword ptr [g_closefact] + fld qword ptr [eax] + fld qword ptr [ebx] + fsub + fabs + fcompp + fstsw ax + shr eax, 6 + and eax, (1<<2) + add eax, offset g_cmpaddtab + fld dword ptr [eax] + mov eax, nextBlock + fstp qword ptr [eax] + mov ebx, eax + add ebx, 8 + mov nextBlock, ebx + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_below(void) +{ + __asm + { + fld qword ptr [eax] + fld qword ptr [ebx] + mov ebx, nextBlock + fcompp + fstsw ax + shr eax, 6 + and eax, (1<<2) + add eax, offset g_cmpaddtab + fld dword ptr [eax] + fstp qword ptr [ebx] + mov eax, ebx + add ebx, 8 + mov nextBlock, ebx + ret + } +} + +//--------------------------------------------------------------------------------------------------------------- +__declspec ( naked ) void _asm_above(void) +{ + __asm + { + fld qword ptr [ebx] + fld qword ptr [eax] + mov ebx, nextBlock + fcompp + fstsw ax + shr eax, 6 + and eax, (1<<2) + add eax, offset g_cmpaddtab + fld dword ptr [eax] + fstp qword ptr [ebx] + mov eax, ebx + add ebx, 8 + mov nextBlock, ebx + ret + } +} + + +__declspec ( naked ) void _asm_min(void) +{ + __asm + { + fld qword ptr [eax] + fld qword ptr [ebx] + fld st(1) + mov eax, nextBlock + fld st(1) + add eax, 8 + fsub + mov nextBlock, eax + fabs // stack contains fabs(1-2),1,2 + fchs + sub eax, 8 + fadd + fadd + fld qword ptr [g_half] + fmul + fstp qword ptr [eax] + ret + } +} + +__declspec ( naked ) void _asm_max(void) +{ + __asm + { + fld qword ptr [eax] + fld qword ptr [ebx] + fld st(1) + mov eax, nextBlock + fld st(1) + add eax, 8 + fsub + mov nextBlock, eax + fabs // stack contains fabs(1-2),1,2 + sub eax, 8 + fadd + fadd + fld qword ptr [g_half] + fmul + fstp qword ptr [eax] + ret + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Compiler.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Compiler.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Compiler.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Compiler.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,424 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +#include +//#include +#include +#include +#include "Compiler.h" +#include "eval.h" + +#define LLB_DSIZE (65536-64) +typedef struct _llBlock { + struct _llBlock *next; + int sizeused; + char block[LLB_DSIZE]; +} llBlock; + +typedef struct _startPtr { + struct _startPtr *next; + void *startptr; +} startPtr; + +typedef struct { + llBlock *blocks; + startPtr *startpts; + } codeHandleType; + +static llBlock *blocks_head = NULL; + +double computTable[16384]; +double *nextBlock=computTable; + +extern CRITICAL_SECTION g_eval_cs; + +static void *newBlock(int size); +static void freeBlocks(llBlock *start); + + +void _asm_sin(void); +void _asm_cos(void); +void _asm_tan(void); +void _asm_int(void); +void _asm_asin(void); +void _asm_acos(void); +void _asm_atan(void); +void _asm_atan2(void); +void _asm_sqr(void); +void _asm_sqrt(void); +void _asm_pow(void); +void _asm_exp(void); +void _asm_log(void); +void _asm_log10(void); +void _asm_abs(void); +void _asm_min(void); +void _asm_max(void); +void _asm_sig(void); +void _asm_sign(void); +void _asm_rand(void); +void _asm_band(void); +void _asm_bor(void); +void _asm_bnot(void); +void _asm_if(void); +void _asm_equal(void); +void _asm_below(void); +void _asm_above(void); +void _asm_assign(void); +void _asm_add(void); +void _asm_sub(void); +void _asm_mul(void); +void _asm_div(void); +void _asm_mod(void); +void _asm_or(void); +void _asm_and(void); +void _asm_uplus(void); +void _asm_uminus(void); +void _asm_function3(void); +void _asm_function3_end(void); +void _asm_function2(void); +void _asm_function2_end(void); +void _asm_function1(void); +void _asm_function1_end(void); +void _asm_simpleValue(void); +void _asm_simpleValue_end(void); + +functionType fnTable[27] = {{ "sin", _asm_sin, 1 }, + { "cos", _asm_cos, 1 }, + { "tan", _asm_tan, 1 }, + { "int", _asm_int, 1 }, + { "asin", _asm_asin, 1 }, + { "acos", _asm_acos, 1 }, + { "atan", _asm_atan, 1 }, + { "atan2", _asm_atan2, 2 }, + { "sqr", _asm_sqr, 1 }, + { "sqrt", _asm_sqrt, 1 }, + { "pow", _asm_pow, 2 }, + { "exp", _asm_exp, 1 }, + { "log", _asm_log, 1 }, + { "log10", _asm_log10, 1 }, + { "abs", _asm_abs, 1 }, + { "min", _asm_min, 2 }, + { "max", _asm_max, 2 }, + { "sigmoid",_asm_sig, 2 } , + { "sign", _asm_sign, 1 } , + { "rand", _asm_rand, 1 } , + { "band", _asm_band, 2 } , + { "bor", _asm_bor, 2 } , + { "bnot", _asm_bnot, 1 } , + { "if", _asm_if, 3 }, + { "equal", _asm_equal, 2 }, + { "below", _asm_below, 2 }, + { "above", _asm_above, 2 }, + }; + + +//--------------------------------------------------------------------------------------------------------------- +void *realAddress(void *fn) +{ +#if defined(_DEBUG) + unsigned char *ptr = (char *)fn; + if(*ptr == 0xE9) + ptr += (*(int *)((ptr+1))+5); + return ptr; +#else + // Release Mode + return fn; +#endif +} + +//#define realAddress(a) a + +//--------------------------------------------------------------------------------------------------------------- +static void freeBlocks(llBlock *start) +{ + while (start) + { + llBlock *llB = start->next; + VirtualFree(start, 0, MEM_RELEASE); + start=llB; + } +} + +//--------------------------------------------------------------------------------------------------------------- +static void *newBlock(int size) +{ + llBlock *llb; + int alloc_size; + if (blocks_head && (LLB_DSIZE - blocks_head->sizeused) >= size) + { + void *t=blocks_head->block+blocks_head->sizeused; + blocks_head->sizeused+=size; + return t; + } + alloc_size=sizeof(llBlock); + if ((int)size > LLB_DSIZE) alloc_size += size - LLB_DSIZE; + llb = (llBlock *)VirtualAlloc(NULL, alloc_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); // grab bigger block if absolutely necessary (heh) + llb->sizeused=size; + llb->next = blocks_head; + blocks_head = llb; + return llb->block; +} + +//--------------------------------------------------------------------------------------------------------------- +static int *findFBlock(char *p) +{ + while (*(int *)p != 0xFFFFFFFF) p++; + return (int*)p; +} + + +//--------------------------------------------------------------------------------------------------------------- +int createCompiledValue(double value, double *addrValue) +{ + int size; + char *block; + double *dupValue; + int i =0; + char *p; + char txt[512]; + + //size=(int)_asm_simpleValue_end-(int)_asm_simpleValue; + size = 0x10; + block=(char *)newBlock(size); + + if (addrValue == NULL) + *(dupValue = (double *)newBlock(sizeof(double))) = value; + else + dupValue = addrValue; + + memcpy(block, realAddress(_asm_simpleValue), size); + + p = block; + while (*(int *)p != 0xFFFFFFFF) + { + txt[i++] = *p; + p++; + }; + txt[i] = 0; + + *findFBlock(block)=(int)dupValue; + + return ((int)(block)); + +} + +//--------------------------------------------------------------------------------------------------------------- +int getFunctionAddress(int fntype, int fn) +{ + switch (fntype) + { + case MATH_SIMPLE: + switch (fn) + { + case FN_ASSIGN: + return (int)realAddress(_asm_assign); + case FN_ADD: + return (int)realAddress(_asm_add); + case FN_SUB: + return (int)realAddress(_asm_sub); + case FN_MULTIPLY: + return (int)realAddress(_asm_mul); + case FN_DIVIDE: + return (int)realAddress(_asm_div); + case FN_MODULO: + return (int)realAddress(_asm_mod); + case FN_AND: + return (int)realAddress(_asm_and); + case FN_OR: + return (int)realAddress(_asm_or); + case FN_UPLUS: + return (int)realAddress(_asm_uplus); + case FN_UMINUS: + return (int)realAddress(_asm_uminus); + } + case MATH_FN: + return (int)realAddress(fnTable[fn].afunc); + } + return 0; +} + + +//--------------------------------------------------------------------------------------------------------------- +int createCompiledFunction3(int fntype, int fn, int code1, int code2, int code3) +{ + int *p; + int size; + char *block; + +// size=(int)_asm_function3_end-(int)_asm_function3; + size = 0x30; + block=(char *)newBlock(size); + + memcpy(block, realAddress(_asm_function3), size); + + p=findFBlock(block); *p++=code1; + p=findFBlock((char*)p); *p++=code2; + p=findFBlock((char*)p); *p++=code3; + p=findFBlock((char*)p); *p++=getFunctionAddress(fntype, fn); + + return ((int)(block)); +} + +//--------------------------------------------------------------------------------------------------------------- +int createCompiledFunction2(int fntype, int fn, int code1, int code2) +{ + int *p; + int size; + char *block; + +// size=(int)_asm_function2_end-(int)_asm_function2; + size = 0x20; + block=(char *)newBlock(size); + + memcpy(block, realAddress(_asm_function2), size); + + p=findFBlock(block); *p++=code1; + p=findFBlock((char*)p); *p++=code2; + p=findFBlock((char*)p); *p++=getFunctionAddress(fntype, fn); + + return ((int)(block)); +} + + +//--------------------------------------------------------------------------------------------------------------- +int createCompiledFunction1(int fntype, int fn, int code) +{ + int size; + int *p; + char *block; + +// size=(int)_asm_function1_end-(int)_asm_function1; + size = 0x20; + block=(char *)newBlock(size); + + memcpy(block, realAddress(_asm_function1), size); + + p=findFBlock(block); *p++=code; + p=findFBlock((char*)p); *p++=getFunctionAddress(fntype, fn); + + return ((int)(block)); +} + +//------------------------------------------------------------------------------ +int compileCode(char *expression) +{ + char expr[4096]; + codeHandleType *handle; + startPtr *scode=NULL; + blocks_head=0; + + if (!expression || !*expression) return 0; + if (!varTable) return 0; + + handle = (codeHandleType*)newBlock(sizeof(codeHandleType)); + + if (!handle) return 0; + + memset(handle,0,sizeof(codeHandleType)); + + while (*expression) + { + startPtr *tmp; + char *expr_ptr; + int l=4095; + colCount=0; + + // single out segment + while (*expression == ';' || *expression == ' ' || *expression == '\n' || + *expression == '\r' || *expression == '\t') expression++; + if (!*expression) break; + expr_ptr = expr; + while (l-->0) + { + int a=*expression; + if (a) expression++; + if (!a || a == ';') break; + if (a == '\n' || a=='\r' || a=='\t') a=' '; + *expr_ptr++ = a; + } + *expr_ptr = 0; + + // parse + tmp=(startPtr*) newBlock(sizeof(startPtr)); + if (!tmp) break; + tmp->startptr=compileExpression(expr); + if (!tmp->startptr) { scode=NULL; break; } + tmp->next=NULL; + if (!scode) scode=handle->startpts=tmp; + else + { + scode->next=tmp; + scode=tmp; + } + } + + // check to see if failed on the first startingCode + if (!scode) + { + freeBlocks(blocks_head); // free blocks + handle=NULL; // return NULL (after resetting blocks_head) + } + else handle->blocks = blocks_head; + + blocks_head=0; + + return (int)handle; +} + +//------------------------------------------------------------------------------ +void executeCode(int handle) +{ + codeHandleType *h = (codeHandleType *)handle; + startPtr *p; + if (!h) return; +// EnterCriticalSection(&g_eval_cs); + p=h->startpts; + while (p) + { + void *startPoint=p->startptr; + if (!startPoint) break; + p=p->next; + nextBlock=computTable; + __asm pusha // Lets cover our ass + __asm call startPoint + __asm popa + } +// LeaveCriticalSection(&g_eval_cs); +} + +//------------------------------------------------------------------------------ +void freeCode(int handle) +{ + codeHandleType *h = (codeHandleType *)handle; + if (h != NULL) + { + freeBlocks(h->blocks); + } +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Compiler.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Compiler.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Compiler.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Compiler.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,74 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +. +*/ +#ifndef __COMPILER_H +#define __COMPILER_H + +#define FN_ASSIGN 0 +#define FN_MULTIPLY 1 +#define FN_DIVIDE 2 +#define FN_MODULO 3 +#define FN_ADD 4 +#define FN_SUB 5 +#define FN_AND 6 +#define FN_OR 7 +#define FN_UMINUS 8 +#define FN_UPLUS 9 + +#define MATH_SIMPLE 0 +#define MATH_FN 1 + +#ifdef __cplusplus +extern "C" { +#endif + + +int compileCode(char *exp); +void executeCode(int handle); +void freeCode(int handle); + + + +typedef struct { + char *name; + void *afunc; + int nParams; + } functionType; +extern functionType fnTable[27]; + +int createCompiledValue(double value, double *addrValue); +int createCompiledFunction1(int fntype, int fn, int code); +int createCompiledFunction2(int fntype, int fn, int code1, int code2); +int createCompiledFunction3(int fntype, int fn, int code1, int code2, int code3); + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/eval.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/eval.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/eval.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/eval.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,238 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +#include +//#include +#include +#include +#include +#include +#include +#include "cal_tab.h" +#include "compiler.h" +#include "eval.h" + +#define INTCONST 1 +#define DBLCONST 2 +#define HEXCONST 3 +#define VARIABLE 4 +#define OTHER 5 + +#define strnicmp _strnicmp +#define strcmpi _strcmpi + +int yyparse(char *exp); +void llinit(void); +int gettoken(char *lltb, int lltbsiz); +char yytext[256]=""; +char expression[4096]=""; +char lastVar[256]=""; +int *errPtr; +int result; +int colCount=0; + +varType *varTable; + + +//------------------------------------------------------------------------------ +void *compileExpression(char *exp) +{ + int errv=0; + errPtr=&errv; + llinit(); + if (!yyparse(exp) && !*errPtr) + { + return (void*)result; + } + return 0; +} + +// NOTE: be sure to initialize & clean these up from your app! (InitializeCriticalSection(&g_eval_cs);) +CRITICAL_SECTION g_eval_cs; +BOOL g_eval_cs_valid; + +//------------------------------------------------------------------------------ +void resetVars(varType *vars) +{ + if (!g_eval_cs_valid) + { + g_eval_cs_valid = TRUE; +// InitializeCriticalSection(&g_eval_cs); + } + +// if (vars) EnterCriticalSection(&g_eval_cs); + varTable=vars; +// if (!vars) LeaveCriticalSection(&g_eval_cs); +} + +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +void setLastVar(void) +{ + gettoken(lastVar, sizeof lastVar); +} + +//------------------------------------------------------------------------------ +int setVar(int varNum, double value) +{ + int i=varNum; + if (varNum < 0) + for (i=0;i= '0' && a <= '9') v+=a-'0'; + else if (a >= 'A' && a <= 'F') v+=10+a-'A'; + else if (a >= 'a' && a <= 'f') v+=10+a-'a'; + else break; + v<<=4; + } + return createCompiledValue((double)v, NULL); + } + return 0; +} + +//------------------------------------------------------------------------------ +int objectId(int nParams) +{ + switch (nParams) + { + case 1: return FUNCTION1; + case 2: return FUNCTION2; + case 3: return FUNCTION3; + } + return IDENTIFIER; +} + +//------------------------------------------------------------------------------ +int lookup(int *typeOfObject) +{ + int i; + gettoken(yytext, sizeof yytext); + for (i=0;i +#include "lex.h" +extern char expression[4096]; +extern int pos; +lexgetc() +{ +char c = expression[pos]; +if (c) pos++; + return( c != 0 ? c : -1); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/LEX.H kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/LEX.H --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/LEX.H 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/LEX.H 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,53 @@ +/* + * Bob Denny 28-Aug-82 Remove reference to FILE *lexin to + * eliminate dependency on standard I/O library. Only + * lexgetc() used it, and it's there now. + * Add EOF definition for standalone uses. + * Corrected comment for llnxtmax. + * + * Scott Guthery 20-Nov-83 Adapt for IBM PC & DeSmet C. Removed + * equivalence of yylval and lexval since + * a multi-typed parser wants yylval to be + * typed to be the union of the types (YYSTYPE). + */ + +/* + * lex library header file -- accessed through + * #include + */ + +#include + +/* + * Description of scanning tables. The entries at the front of + * the struct must remain in place for the assembler routines to find. + */ +struct lextab { + int llendst; /* Last state number */ + char *lldefault; /* Default state table */ + char *llnext; /* Next state table */ + char *llcheck; /* Check table */ + int *llbase; /* Base table */ + int llnxtmax; /* Last in next table */ + int (*llmove)(); /* Move between states */ + char *llfinal; /* Final state descriptions */ + int (*llactr)(); /* Action routine */ + int *lllook; /* Look ahead vector if != NULL */ + char *llign; /* Ignore char vec if != NULL */ + char *llbrk; /* Break char vec if != NULL */ + char *llill; /* Illegal char vec if != NULL */ +}; + +#define NBPW 16 +#define LEXERR 256 +#define LEXSKIP (-1) +#define EOF (-1) +//#define NULL (0) +#define LEXECHO(fp) {lexecho((fp));} + +#define lextext llbuf +#define lexlast llend + +extern FILE *lexin; +extern llstin(); + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lexswi.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lexswi.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lexswi.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lexswi.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,23 @@ +/* + * lexswitch -- switch lex tables + */ + +/* + * Bob Denny 28-Aug-82 Remove reference to stdio.h + * Scott Guthery 20-Nov-83 Adapt for IBM PC & DeSmet C + */ + +#include "lex.h" + +extern struct lextab *_tabp; + +struct lextab * +lexswitch(lp) +struct lextab *lp; +{ + register struct lextab *olp; + + olp = _tabp; + _tabp = lp; + return(olp); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lextab.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lextab.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lextab.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lextab.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,260 @@ +/* + * Created by IBM PC LEX from file "scan.l" + * - for use with standard I/O + */ + +#include +#include "lex.h" +#define LL16BIT int + +int _lmovb(struct lextab *lp, int c, int st) +{ + int base; + + while ((base = lp->llbase[st]+c) > lp->llnxtmax || + (lp->llcheck[base] & 0377) != st) { + + if (st != lp->llendst) { + base = lp->lldefault[st] & 0377; + st = base; + } + else + return(-1); + } + return(lp->llnext[base]&0377); +} + +int lexval; +char lbuf[]; + +#define YYSTYPE int +#include "cal_tab.h" +int c; + +extern YYSTYPE yylval; +int translate(int type); +void count(void); +void setLastVar(void); +int lookup(int *typeOfObject); + + +#define INTCONST 1 +#define DBLCONST 2 +#define HEXCONST 3 +#define VARIABLE 4 +#define OTHER 5 + +int _Alextab(__na__) +{ + if (__na__ >= 0 && __na__ <= 19) count(); + switch (__na__) + { + case 0: yylval = translate(HEXCONST); return VALUE; + case 1: yylval = translate(INTCONST); return VALUE; + case 2: yylval = translate(INTCONST); return VALUE; + case 3: yylval = translate(DBLCONST); return VALUE; + case 4: + case 5: setLastVar(); yylval = lookup(&__na__); return __na__; + case 6: return '+'; + case 7: return '-'; + case 8: return '*'; + case 9: return '/'; + case 10: return '%'; + case 11: return '&'; + case 12: return '|'; + case 13: return '('; + case 14: return ')'; + case 15: return '='; + case 16: return ','; + case 17: return ';'; + } + return (LEXSKIP); +} + + +char _Flextab[] = + { + 1, 18, 17, 16, 15, 14, 13, 12, + 11, 10, 9, 8, 7, 6, 4, 5, + 5, 4, 4, 3, 3, 3, 3, 4, + 0, 4, 5, 0, 5, 4, 1, 3, + 0, 2, -1, 1, -1, + }; + + +char _Nlextab[] = + { + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 1, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 1, 36, 36, 36, 36, 9, 8, 36, + 6, 5, 11, 13, 3, 12, 19, 10, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 36, 2, 36, 4, 36, 36, + 36, 29, 29, 29, 29, 29, 29, 18, + 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 36, 36, 36, 36, 18, + 36, 29, 29, 29, 29, 29, 23, 18, + 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 14, 18, + 18, 18, 18, 36, 7, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 36, + 36, 36, 36, 36, 36, 36, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 36, 36, 36, 36, 17, 36, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 36, 36, 36, 36, 36, 36, + 36, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 36, 36, 36, 36, 16, + 36, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 36, + 20, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 36, 36, 36, 36, 36, + 36, 36, 25, 25, 25, 25, 25, 25, + 36, 24, 36, 36, 36, 36, 36, 36, + 20, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 25, 25, 25, 25, 25, 25, + 36, 24, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 36, 36, 36, 36, + 36, 36, 36, 28, 28, 28, 28, 28, + 28, 36, 27, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 28, 28, 28, 28, 28, + 28, 31, 27, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 36, 36, 36, + 36, 36, 36, 36, 34, 34, 34, 33, + 34, 34, 36, 32, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 34, 34, 34, 33, + 34, 34, 36, 32, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 36, 36, + 36, 36, 36, 36, 36, 34, 34, 34, + 34, 34, 34, 36, 32, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 34, 34, 34, + 34, 34, 34, 36, 32, + }; + +char _Clextab[] = + { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 0, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 0, -1, -1, -1, -1, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -1, 0, -1, -1, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -1, -1, -1, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, 0, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, -1, + -1, -1, -1, -1, -1, -1, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + -1, -1, -1, -1, 14, -1, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, -1, -1, -1, -1, -1, -1, + -1, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, -1, -1, -1, -1, 15, + -1, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, -1, + 19, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, -1, -1, -1, -1, -1, + -1, -1, 23, 23, 23, 23, 23, 23, + -1, 23, -1, -1, -1, -1, -1, -1, + 19, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 23, 23, 23, 23, 23, 23, + -1, 23, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, -1, -1, -1, -1, + -1, -1, -1, 26, 26, 26, 26, 26, + 26, -1, 26, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 26, 26, 26, 26, 26, + 26, 30, 26, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, -1, -1, -1, + -1, -1, -1, -1, 30, 30, 30, 30, + 30, 30, -1, 30, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 30, 30, 30, 30, + 30, 30, -1, 30, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, -1, -1, + -1, -1, -1, -1, -1, 33, 33, 33, + 33, 33, 33, -1, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 33, 33, 33, + 33, 33, 33, -1, 33, + }; + +char _Dlextab[] = + { + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 15, 14, 14, 36, 36, 20, 19, 14, + 14, 23, 15, 15, 26, 23, 36, 19, + 36, 36, 33, 30, + }; + +int _Blextab[] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 77, 152, + 0, 0, 0, 227, 237, 0, 0, 249, + 0, 0, 306, 0, 0, 0, 363, 0, + 0, 420, 0, 0, 0, + }; + +struct lextab lextab = { + 36, + _Dlextab, + _Nlextab, + _Clextab, + _Blextab, + 524, + _lmovb, + _Flextab, + _Alextab, + + NULL, + 0, + 0, + 0, + }; + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/LLSAVE.C kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/LLSAVE.C --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/LLSAVE.C 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/LLSAVE.C 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,6 @@ +/* + * This is linked from lexlib to resolve a global in yylex which + * will be undefined if the user grammar has not defined any rules + * with right-context (look-ahead) + */ +char *llsave[1]; /* Look ahead buffer */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lmovb.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lmovb.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lmovb.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Lmovb.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,29 @@ +/* + * Bob Denny 28-Aug-82 Remove reference to stdio.h + * Scott Guthery 20-Nov-83 Adapt for IBM PC & DeSmet C + */ + +#include "lex.h" + +_lmovb(lp, c, st) +register int c, st; +register struct lextab *lp; +{ + int base; + + while ((base = lp->llbase[st]+c) > lp->llnxtmax || + (lp->llcheck[base] & 0377) != st) { + + if (st != lp->llendst) { +/* + * This miscompiled on Decus C many years ago: + * st = lp->lldefault[st] & 0377; + */ + base = lp->lldefault[st] & 0377; + st = base; + } + else + return(-1); + } + return(lp->llnext[base]&0377); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/makel.bat kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/makel.bat --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/makel.bat 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/makel.bat 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ +lex -i scan.l diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/makey.bat kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/makey.bat --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/makey.bat 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/makey.bat 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2 @@ +bison -d cal.y + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/readme.txt kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/readme.txt --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/readme.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/readme.txt 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,112 @@ + + Expression evaluation library v1.0 - by lone + -------------------------------------------- + + + How to use + ~~~~~~~~~~ + + + resetVars + ----------- + + void resetVars(void); + + Resets the variables table. It is necessary to call it prior to evaluate your first + expression or variables contents may be random instead of zero + + + evaluate + ---------- + + double evaluate(char *expression, int *col); + + Evaluates an expression and returns the result. + If a syntax error was encountered during the parsing of the expression, then col will + be non-null and col-1 will be the index of the char which triggered the error. + + + Limitations + ~~~~~~~~~~~ + + you can set only up to 1024 variables. + only decimal and hexadecimal bases available + operators are limited to : + + - / * % & | + functions are limited to : + sin, cos, tan, + asin, acos, atan, + atan2, sqr, sqrt, + pow, exp, log, log10 + + + Some examples + ~~~~~~~~~~~~~ + + - assignments : + + pi=3.1415927 + a=atan2(cos(pi/4),2) + + - direct evaluations : + + cos(pi/4) + sin(45) + + - base notations : + + 3bh (this is 0x3B) + 17d (this is 17) + 17dh (this is 0x17D) + + + Adding new functions + ~~~~~~~~~~~~~~~~~~~~ + + The file EVAL.C contains the functions table (fnTable). Just add an entry with the name, + the number of parameters, and a pointer to the function body. Implement the body and + you're done. If your function ahs more than 2 parameters, you'll need to extend the grammar + description file (CAL.Y) to add the FUNCTION3 (and eventually subsequent) token(s) and + parsing informations. + + SCAN.L & CAL.Y + ~~~~~~~~~~~~~~ + + SCAN.L contains description for the lexical analyzer generator (LEX). Use makel.bat to rebuild + LEXTAB.C + CAL.Y contains the LALR formal grammar description for the parser generator (BISON). Use makey.bat + to rebuild CAL_TAB.C + + + Compiling + ~~~~~~~~~ + + Just include all source files to your project, and include EVAL.H into your main source code. + +License +------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Scan.l kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Scan.l --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Scan.l 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Scan.l 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,54 @@ +%{ +#define YYSTYPE double +#include "cal_tab.h" +int c; + +extern YYSTYPE yylval; +double translate(int type); +void count(void); +void setLastVar(void); +int lookup(int *typeOfObject); +struct lextab *lexswitch(struct lextab *lp); + + +#define INTCONST 1 +#define DBLCONST 2 +#define HEXCONST 3 +#define VARIABLE 4 +#define OTHER 5 + +%} + +digit = [0-9]; +letter = [a-zA-Z_]; +hex = [a-fA-F0-9]; +/* -- */ +space = [\40]; +/*number = (digit* | "-" digit*);*/ +number = digit*; +exp = [Ee] number; +doubl = number "." (digit* | digit* exp); + +%% +hex hex* [hH] { count(); yylval = translate(HEXCONST); return VALUE; } +digit* { count(); yylval = translate(INTCONST); return VALUE; } +digit digit* [Dd] { count(); yylval = translate(INTCONST); return VALUE; } +doubl { count(); yylval = translate(DBLCONST); return VALUE; } +letter* { count(); { int typeOfObject; setLastVar(); yylval = lookup(&typeOfObject); return typeOfObject; }} +letter (letter|digit)* { count(); { int typeOfObject; setLastVar(); yylval = lookup(&typeOfObject); return typeOfObject; }} +'+' { count(); return '+'; } +'-' { count(); return '-'; } +'*' { count(); return '*'; } +'/' { count(); return '/'; } +'%' { count(); return '%'; } +'&' { count(); return '&'; } +'|' { count(); return '|'; } +'(' { count(); return '('; } +')' { count(); return ')'; } +'=' { count(); return '='; } +',' { count(); return ','; } +';' { count(); return ';'; } +[ \t\v\f] { count(); } +. { count(); } + +%% diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Yylex.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Yylex.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Yylex.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/evallib/Yylex.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,172 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +#include "lex.h" + +#define ERROR 256 /* yacc's value */ + +static int llset(void); +static int llinp(char **exp); +static int lexgetc(char **exp) +{ + char c= **exp; + if (c) (*exp)++; + return( c != 0 ? c : -1); +} +static int tst__b(register int c, char tab[]) +{ + return (tab[(c >> 3) & 037] & (1 << (c & 07)) ); +} + +static char *llsave[16]; /* Look ahead buffer */ +static char llbuf[100]; /* work buffer */ +static char *llp1 = &llbuf[0]; /* pointer to next avail. in token */ +static char *llp2 = &llbuf[0]; /* pointer to end of lookahead */ +static char *llend = &llbuf[0]; /* pointer to end of token */ +static char *llebuf = &llbuf[sizeof llbuf]; +static int lleof; +static int yyline = 0; +extern struct lextab lextab; + +int gettoken(char *lltb, int lltbsiz) +{ + register char *lp, *tp, *ep; + + tp = lltb; + ep = tp+lltbsiz-1; + for (lp = llbuf; lp < llend && tp < ep;) + *tp++ = *lp++; + *tp = 0; + return(tp-lltb); +} + + +int yylex(char **exp) +{ + register int c, st; + int final, l, llk, i; + register struct lextab *lp; + char *cp; + + while (1) + { + llk = 0; + if (llset()) return(0); + st = 0; + final = -1; + lp = &lextab; + + do { + if (lp->lllook && (l = lp->lllook[st])) { + for (c=0; cllfinal[st]) != -1) { + final = i; + llend = llp1; + } + if ((c = llinp(exp)) < 0) + break; + if ((cp = lp->llbrk) && llk==0 && tst__b(c, cp)) { + llp1--; + break; + } + } while ((st = (*lp->llmove)(lp, c, st)) != -1); + + + if (llp2 < llp1) + llp2 = llp1; + if (final == -1) { + llend = llp1; + if (st == 0 && c < 0) + return(0); + if ((cp = lp->llill) && tst__b(c, cp)) { + continue; + } + return(ERROR); + } + if (c = (final >> 11) & 037) + llend = llsave[c-1]; + if ((c = (*lp->llactr)(final&03777)) >= 0) + return(c); + } +} + +void llinit(viud) +{ + llp1 = llp2 = llend = llbuf; + llebuf = llbuf + sizeof(llbuf); + lleof = yyline = 0; +} + + +static int llinp(char **exp) +{ + register c; + register struct lextab *lp; + register char *cp; + + lp = &lextab; + cp = lp->llign; /* Ignore class */ + for (;;) { + /* + * Get the next character from the save buffer (if possible) + * If the save buffer's empty, then return EOF or the next + * input character. Ignore the character if it's in the + * ignore class. + */ + c = (llp1 < llp2) ? *llp1 & 0377 : (lleof) ? EOF : lexgetc(exp); + if (c >= 0) { /* Got a character? */ + if (cp && tst__b(c, cp)) + continue; /* Ignore it */ + if (llp1 >= llebuf) { /* No, is there room? */ + return -1; + } + *llp1++ = c; /* Store in token buff */ + } else + lleof = 1; /* Set EOF signal */ + return(c); + } +} + +static int llset(void) +/* + * Return TRUE if EOF and nothing was moved in the look-ahead buffer + */ +{ + register char *lp1, *lp2; + + for (lp1 = llbuf, lp2 = llend; lp2 < llp2;) + *lp1++ = *lp2++; + llend = llp1 = llbuf; + llp2 = lp1; + return(lleof && lp1 == llbuf); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/fft.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/fft.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/fft.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/fft.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,319 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "fft.h" + +#define PI 3.141592653589793238462643383279502884197169399f + +#define SafeDeleteArray(x) { if (x) { delete [] x; x = 0; } } + + +/*****************************************************************************/ + +FFT::FFT() +{ + NFREQ = 0; + + envelope = 0; + equalize = 0; + bitrevtable = 0; + cossintable = 0; + temp1 = 0; + temp2 = 0; +} + +/*****************************************************************************/ + +FFT::~FFT() +{ + CleanUp(); +} + +/*****************************************************************************/ + +void FFT::Init(int samples_in, int samples_out, int bEqualize, float envelope_power) +{ + // samples_in: # of waveform samples you'll feed into the FFT + // samples_out: # of frequency samples you want out; MUST BE A POWER OF 2. + + CleanUp(); + + m_samples_in = samples_in; + NFREQ = samples_out*2; + + InitBitRevTable(); + InitCosSinTable(); + if (envelope_power > 0) + InitEnvelopeTable(envelope_power); + if (bEqualize) + InitEqualizeTable(); + temp1 = new float[NFREQ]; + temp2 = new float[NFREQ]; +} + +/*****************************************************************************/ + +void FFT::CleanUp() +{ + SafeDeleteArray(envelope); + SafeDeleteArray(equalize); + SafeDeleteArray(bitrevtable); + SafeDeleteArray(cossintable); + SafeDeleteArray(temp1); + SafeDeleteArray(temp2); +} + +/*****************************************************************************/ + +void FFT::InitEqualizeTable() +{ + int i; + float scaling = -0.02f; + float inv_half_nfreq = 1.0f/(float)(NFREQ/2); + + equalize = new float[NFREQ/2]; + + for (i=0; i i) + { + temp = bitrevtable[i]; + bitrevtable[i] = bitrevtable[j]; + bitrevtable[j] = temp; + } + + m = NFREQ >> 1; + + while (m >= 1 && j >= m) + { + j -= m; + m >>= 1; + } + + j += m; + } +} + +/*****************************************************************************/ + +void FFT::InitCosSinTable() +{ + + int i,dftsize,tabsize; + float theta; + + dftsize = 2; + tabsize = 0; + while (dftsize <= NFREQ) + { + tabsize++; + dftsize <<= 1; + } + + cossintable = new float[tabsize][2]; + + dftsize = 2; + i = 0; + while (dftsize <= NFREQ) + { + theta = (float)(-2.0f*PI/(float)dftsize); + cossintable[i][0] = (float)cosf(theta); + cossintable[i][1] = (float)sinf(theta); + i++; + dftsize <<= 1; + } +} + +/*****************************************************************************/ + +void FFT::time_to_frequency_domain(float *in_wavedata, float *out_spectraldata) +{ + // Converts time-domain samples from in_wavedata[] + // into frequency-domain samples in out_spectraldata[]. + // The array lengths are the two parameters to Init(). + + // The last sample of the output data will represent the frequency + // that is 1/4th of the input sampling rate. For example, + // if the input wave data is sampled at 44,100 Hz, then the last + // sample of the spectral data output will represent the frequency + // 11,025 Hz. The first sample will be 0 Hz; the frequencies of + // the rest of the samples vary linearly in between. + // Note that since human hearing is limited to the range 200 - 20,000 + // Hz. 200 is a low bass hum; 20,000 is an ear-piercing high shriek. + // Each time the frequency doubles, that sounds like going up an octave. + // That means that the difference between 200 and 300 Hz is FAR more + // than the difference between 5000 and 5100, for example! + // So, when trying to analyze bass, you'll want to look at (probably) + // the 200-800 Hz range; whereas for treble, you'll want the 1,400 - + // 11,025 Hz range. + // If you want to get 3 bands, try it this way: + // a) 11,025 / 200 = 55.125 + // b) to get the number of octaves between 200 and 11,025 Hz, solve for n: + // 2^n = 55.125 + // n = log 55.125 / log 2 + // n = 5.785 + // c) so each band should represent 5.785/3 = 1.928 octaves; the ranges are: + // 1) 200 - 200*2^1.928 or 200 - 761 Hz + // 2) 200*2^1.928 - 200*2^(1.928*2) or 761 - 2897 Hz + // 3) 200*2^(1.928*2) - 200*2^(1.928*3) or 2897 - 11025 Hz + + // A simple sine-wave-based envelope is convolved with the waveform + // data before doing the FFT, to emeliorate the bad frequency response + // of a square (i.e. nonexistent) filter. + + // You might want to slightly damp (blur) the input if your signal isn't + // of a very high quality, to reduce high-frequency noise that would + // otherwise show up in the output. + + int j, m, i, dftsize, hdftsize, t; + float wr, wi, wpi, wpr, wtemp, tempr, tempi; + + if (!bitrevtable) return; + //if (!envelope) return; + //if (!equalize) return; + if (!temp1) return; + if (!temp2) return; + if (!cossintable) return; + + // 1. set up input to the fft + if (envelope) + { + for (i=0; i> 1; + + for (m = 0; m < hdftsize; m+=1) + { + for (i = m; i < NFREQ; i+=dftsize) + { + j = i + hdftsize; + tempr = wr*real[j] - wi*imag[j]; + tempi = wr*imag[j] + wi*real[j]; + real[j] = real[i] - tempr; + imag[j] = imag[i] - tempi; + real[i] += tempr; + imag[i] += tempi; + } + + wr = (wtemp=wr)*wpr - wi*wpi; + wi = wi*wpr + wtemp*wpi; + } + + dftsize <<= 1; + t++; + } + + // 3. take the magnitude & equalize it (on a log10 scale) for output + if (equalize) + for (i=0; i +#include +//#include +//#include +#include +#include +//#include + + + +#define D3DCOLOR_RGBA_01(r,g,b,a) D3DCOLOR_RGBA(((int)(r*255)),((int)(g*255)),((int)(b*255)),((int)(a*255))) +#define FRAND ((rand() % 7381)/7380.0f) +//#define D3D_OVERLOADS + +#define VERT_CLIP 0.75f // warning: top/bottom can get clipped if you go < 0.65! + +//extern CPlugin* g_plugin; // declared in main.cpp +//extern bool g_bDebugOutput; // declared in support.cpp + +int g_title_font_sizes[] = +{ + // NOTE: DO NOT EXCEED 64 FONTS HERE. + 6, 8, 10, 12, 14, 16, + 20, 26, 32, 38, 44, 50, 56, + 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, + 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, + 480, 512 /**/ +}; + +//#define COMPILE_MULTIMON_STUBS 1 +//#include + +// This function evaluates whether the floating-point +// control Word is set to single precision/round to nearest/ +// exceptions disabled. If not, the +// function changes the control Word to set them and returns +// TRUE, putting the old control Word value in the passback +// location pointed to by pwOldCW. +BOOL MungeFPCW( WORD *pwOldCW ) +{ + BOOL ret = FALSE; + WORD wTemp, wSave; + + __asm fstcw wSave + if (wSave & 0x300 || // Not single mode + 0x3f != (wSave & 0x3f) || // Exceptions enabled + wSave & 0xC00) // Not round to nearest mode + { + __asm + { + mov ax, wSave + and ax, not 300h ;; single mode + or ax, 3fh ;; disable all exceptions + and ax, not 0xC00 ;; round to nearest mode + mov wTemp, ax + fldcw wTemp + } + ret = TRUE; + } + if (pwOldCW) *pwOldCW = wSave; + return ret; +} + + +void RestoreFPCW(WORD wSave) +{ + __asm fldcw wSave +} + +int GetNumToSpawn(float fTime, float fDeltaT, float fRate, float fRegularity, int iNumSpawnedSoFar) +{ + // PARAMETERS + // ------------ + // fTime: sum of all fDeltaT's so far (excluding this one) + // fDeltaT: time window for this frame + // fRate: avg. rate (spawns per second) of generation + // fRegularity: regularity of generation + // 0.0: totally chaotic + // 0.2: getting chaotic / very jittered + // 0.4: nicely jittered + // 0.6: slightly jittered + // 0.8: almost perfectly regular + // 1.0: perfectly regular + // iNumSpawnedSoFar: the total number of spawnings so far + // + // RETURN VALUE + // ------------ + // The number to spawn for this frame (add this to your net count!). + // + // COMMENTS + // ------------ + // The spawn values returned will, over time, match + // (within 1%) the theoretical totals expected based on the + // amount of time passed and the average generation rate. + // + // UNRESOLVED ISSUES + // ----------------- + // actual results of mixed gen. (0 < reg < 1) are about 1% too low + // in the long run (vs. analytical expectations). Decided not + // to bother fixing it since it's only 1% (and VERY consistent). + + + float fNumToSpawnReg; + float fNumToSpawnIrreg; + float fNumToSpawn; + + // compute # spawned based on regular generation + fNumToSpawnReg = ((fTime + fDeltaT) * fRate) - iNumSpawnedSoFar; + + // compute # spawned based on irregular (random) generation + if (fDeltaT <= 1.0f / fRate) + { + // case 1: avg. less than 1 spawn per frame + if ((rand() % 16384)/16384.0f < fDeltaT * fRate) + fNumToSpawnIrreg = 1.0f; + else + fNumToSpawnIrreg = 0.0f; + } + else + { + // case 2: avg. more than 1 spawn per frame + fNumToSpawnIrreg = fDeltaT * fRate; + fNumToSpawnIrreg *= 2.0f*(rand() % 16384)/16384.0f; + } + + // get linear combo. of regular & irregular + fNumToSpawn = fNumToSpawnReg*fRegularity + fNumToSpawnIrreg*(1.0f - fRegularity); + + // round to nearest integer for result + return (int)(fNumToSpawn + 0.49f); +} + + +/* +char szHelp[] = +{ + // note: this is a string-of-null-terminated-strings; the whole thing ends with a double null termination. + // each substring will be drawn on its own line, and the strings are drawn in BOTTOM-UP order.. + // (this is just an effort to keep the file size low) + "ESC: exit\0" + + " \0" + "F9: toggle stereo 3D mode\0" + "F8: change directory/drive\0" + "F7: refresh milk_msg.ini\0" + "F6: show preset rating\0" + "F5: show fps\0" + "F4: show preset name\0" + "F2,F3: show song title,length\0" + "F1: show help\0" + + " \0" + "N: show per-frame variable moNitor\0" + "S: save preset\0" + "M: (preset editing) menu\0" + + " \0" + "scroll lock: locks current preset\0" + "+/-: rate current preset\0" + "L: load specific preset\0" + "R: toggle random(/sequential) preset order\0" + "H: instant Hard cut (to next preset)\0" + "spacebar: transition to next preset\0" + + " \0" + "left/right arrows: seek 5 sec. [+SHIFT=seek 30]\0" + "up/down arrows: adjust volume\0" + "P: playlist\0" + "U: toggle shuffle\0" + "z/x/c/v/b: prev/play/pause/stop/next\0" + + " \0" + "Y/K: enter custom message/sprite mode [see docs!]\0" + "##: show custom message/sprite (##=00-99)\0" + "T: launch song title animation\0" + + "\0\0" +}; +*/ + + +bool CPlugin::OnResizeTextWindow() +{ + /* + if (!m_hTextWnd) + return false; + + RECT rect; + GetClientRect(m_hTextWnd, &rect); + + if (rect.right - rect.left != m_nTextWndWidth || + rect.bottom - rect.top != m_nTextWndHeight) + { + m_nTextWndWidth = rect.right - rect.left; + m_nTextWndHeight = rect.bottom - rect.top; + + // first, resize fonts if necessary + //if (!InitFont()) + //return false; + + // then resize the memory bitmap used for double buffering + if (m_memDC) + { + SelectObject(m_memDC, m_oldBM); // delete our doublebuffer + DeleteObject(m_memDC); + DeleteObject(m_memBM); + m_memDC = NULL; + m_memBM = NULL; + m_oldBM = NULL; + } + + HDC hdc = GetDC(m_hTextWnd); + if (!hdc) return false; + + m_memDC = CreateCompatibleDC(hdc); + m_memBM = CreateCompatibleBitmap(hdc, rect.right - rect.left, rect.bottom - rect.top); + m_oldBM = (HBITMAP)SelectObject(m_memDC,m_memBM); + + ReleaseDC(m_hTextWnd, hdc); + + // save new window pos + WriteRealtimeConfig(); + }*/ + + return true; +} + + +void CPlugin::ClearGraphicsWindow() +{ + // clear the window contents, to avoid a 1-pixel-thick border of noise that sometimes sticks around + /* + RECT rect; + GetClientRect(GetPluginWindow(), &rect); + + HDC hdc = GetDC(GetPluginWindow()); + FillRect(hdc, &rect, m_hBlackBrush); + ReleaseDC(GetPluginWindow(), hdc); + */ +} + +/* +bool CPlugin::OnResizeGraphicsWindow() +{ + // NO LONGER NEEDED, SINCE PLUGIN SHELL CREATES A NEW DIRECTX + // OBJECT WHENEVER WINDOW IS RESIZED. +} +*/ + +bool CPlugin::RenderStringToTitleTexture() // m_szSongMessage +{ +#if 0 + if (!m_lpDDSTitle) // this *can* be NULL, if not much video mem! + return false; + + if (m_supertext.szText[0]==0) + return false; + + LPDIRECT3DDEVICE8 lpDevice = GetDevice(); + if (!lpDevice) + return false; + + char szTextToDraw[512]; + sprintf(szTextToDraw, " %s ", m_supertext.szText); //add a space @ end for italicized fonts; and at start, too, because it's centered! + + // Remember the original backbuffer and zbuffer + LPDIRECT3DSURFACE8 pBackBuffer, pZBuffer; + lpDevice->GetRenderTarget( &pBackBuffer ); +// lpDevice->GetDepthStencilSurface( &pZBuffer ); + + // set render target to m_lpDDSTitle + { + lpDevice->SetTexture(0, NULL); + + IDirect3DSurface8* pNewTarget = NULL; + if (m_lpDDSTitle->GetSurfaceLevel(0, &pNewTarget) != D3D_OK) + { + SafeRelease(pBackBuffer); +// SafeRelease(pZBuffer); + return false; + } + lpDevice->SetRenderTarget(pNewTarget, NULL); + pNewTarget->Release(); + + lpDevice->SetTexture(0, NULL); + } + + // clear the texture to black + { + lpDevice->SetVertexShader( WFVERTEX_FORMAT ); + lpDevice->SetTexture(0, NULL); + + lpDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); + + // set up a quad + WFVERTEX verts[4]; + for (int i=0; i<4; i++) + { + verts[i].x = (i%2==0) ? -1 : 1; + verts[i].y = (i/2==0) ? -1 : 1; + verts[i].z = 0; + verts[i].Diffuse = 0xFF000000; + } + + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, verts, sizeof(WFVERTEX)); + } + + /*// 1. clip title if too many chars + if (m_supertext.bIsSongTitle) + { + // truncate song title if too long; don't clip custom messages, though! + int clip_chars = 32; + int user_title_size = GetFontHeight(SONGTITLE_FONT); + + #define MIN_CHARS 8 // max clip_chars *for BIG FONTS* + #define MAX_CHARS 64 // max clip chars *for tiny fonts* + float t = (user_title_size-10)/(float)(128-10); + t = min(1,max(0,t)); + clip_chars = (int)(MAX_CHARS - (MAX_CHARS-MIN_CHARS)*t); + + if ((int)strlen(szTextToDraw) > clip_chars+3) + lstrcpy(&szTextToDraw[clip_chars], "..."); + }*/ + + bool ret = true; + + // use 2 lines; must leave room for bottom of 'g' characters and such! + RECT rect; + rect.left = 0; + rect.right = m_nTitleTexSizeX; + rect.top = m_nTitleTexSizeY* 1/21; // otherwise, top of '%' could be cut off (1/21 seems safe) + rect.bottom = m_nTitleTexSizeY*17/21; // otherwise, bottom of 'g' could be cut off (18/21 seems safe, but we want some leeway) + + if (!m_supertext.bIsSongTitle) + { + // custom msg -> pick font to use that will best fill the texture + + HFONT gdi_font = NULL; + LPD3DXFONT d3dx_font = NULL; + + int lo = 0; + int hi = sizeof(g_title_font_sizes)/sizeof(int) - 1; + + // limit the size of the font used: + + //int user_title_size = GetFontHeight(SONGTITLE_FONT); + //while (g_title_font_sizes[hi] > user_title_size*2 && hi>4) + // hi--; + + RECT temp; + while (1)//(lo < hi-1) + { + int mid = (lo+hi)/2; + + // create new gdi font at 'mid' size: + gdi_font = CreateFont(g_title_font_sizes[mid], 0, 0, 0, m_supertext.bBold ? 900 : 400, m_supertext.bItal, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, m_fontinfo[SONGTITLE_FONT].bAntiAliased ? ANTIALIASED_QUALITY : DEFAULT_QUALITY, DEFAULT_PITCH, m_supertext.nFontFace); + if (gdi_font) + { + // create new d3dx font at 'mid' size: + if (D3DXCreateFont(lpDevice, gdi_font, &d3dx_font) == D3D_OK) + { + if (lo == hi-1) + break; // DONE; but the 'lo'-size font is ready for use! + + // compute size of text if drawn w/font of THIS size: + temp = rect; + int h = d3dx_font->DrawText(szTextToDraw, -1, &temp, DT_SINGLELINE | DT_CALCRECT | DT_NOPREFIX, 0xFFFFFFFF); + + // adjust & prepare to reiterate: + if (temp.right >= rect.right || h > rect.bottom-rect.top) + hi = mid; + else + lo = mid; + + SafeRelease(d3dx_font); + } + + DeleteObject(gdi_font); gdi_font=NULL; + } + } + + if (gdi_font && d3dx_font) + { + // do actual drawing + set m_supertext.nFontSizeUsed; use 'lo' size + int h = d3dx_font->DrawText(szTextToDraw, -1, &temp, DT_SINGLELINE | DT_CALCRECT | DT_NOPREFIX | DT_CENTER, 0xFFFFFFFF); + temp.left = 0; + temp.right = m_nTitleTexSizeX; // now allow text to go all the way over, since we're actually drawing! + temp.top = m_nTitleTexSizeY/2 - h/2; + temp.bottom = m_nTitleTexSizeY/2 + h/2; + m_supertext.nFontSizeUsed = d3dx_font->DrawText(szTextToDraw, -1, &temp, DT_SINGLELINE | DT_NOPREFIX | DT_CENTER, 0xFFFFFFFF); + + ret = true; + } + else + { + ret = false; + } + + // clean up font: + SafeRelease(d3dx_font); + if (gdi_font) DeleteObject(gdi_font); gdi_font=NULL; + } + else // song title + { + RECT temp = rect; + + // do actual drawing + set m_supertext.nFontSizeUsed; use 'lo' size + int h = m_d3dx_title_font_doublesize->DrawText(szTextToDraw, -1, &temp, DT_SINGLELINE | DT_CALCRECT | DT_NOPREFIX | DT_CENTER | DT_END_ELLIPSIS, 0xFFFFFFFF); + temp.left = 0; + temp.right = m_nTitleTexSizeX; // now allow text to go all the way over, since we're actually drawing! + temp.top = m_nTitleTexSizeY/2 - h/2; + temp.bottom = m_nTitleTexSizeY/2 + h/2; + m_supertext.nFontSizeUsed = m_d3dx_title_font_doublesize->DrawText(szTextToDraw, -1, &temp, DT_SINGLELINE | DT_NOPREFIX | DT_CENTER | DT_END_ELLIPSIS, 0xFFFFFFFF); + } + + // Change the rendertarget back to the original setup + lpDevice->SetTexture(0, NULL); + lpDevice->SetRenderTarget( pBackBuffer, NULL ); + SafeRelease(pBackBuffer); + SafeRelease(pZBuffer); + + return ret; +#endif + return false; +} + +void CPlugin::LoadPerFrameEvallibVars(CState* pState) +{ + // load the 'var_pf_*' variables in this CState object with the correct values. + // for vars that affect pixel motion, that means evaluating them at time==-1, + // (i.e. no blending w/blendto value); the blending of the file dx/dy + // will be done *after* execution of the per-vertex code. + // for vars that do NOT affect pixel motion, evaluate them at the current time, + // so that if they're blending, both states see the blended value. + + // 1. vars that affect pixel motion: (eval at time==-1) + *pState->var_pf_zoom = (double)pState->m_fZoom.eval(-1);//GetTime()); + *pState->var_pf_zoomexp = (double)pState->m_fZoomExponent.eval(-1);//GetTime()); + *pState->var_pf_rot = (double)pState->m_fRot.eval(-1);//GetTime()); + *pState->var_pf_warp = (double)pState->m_fWarpAmount.eval(-1);//GetTime()); + *pState->var_pf_cx = (double)pState->m_fRotCX.eval(-1);//GetTime()); + *pState->var_pf_cy = (double)pState->m_fRotCY.eval(-1);//GetTime()); + *pState->var_pf_dx = (double)pState->m_fXPush.eval(-1);//GetTime()); + *pState->var_pf_dy = (double)pState->m_fYPush.eval(-1);//GetTime()); + *pState->var_pf_sx = (double)pState->m_fStretchX.eval(-1);//GetTime()); + *pState->var_pf_sy = (double)pState->m_fStretchY.eval(-1);//GetTime()); + // read-only: + *pState->var_pf_time = (double)(GetTime() - m_fStartTime); + *pState->var_pf_fps = (double)GetFps(); + *pState->var_pf_bass = (double)mysound.imm_rel[0]; + *pState->var_pf_mid = (double)mysound.imm_rel[1]; + *pState->var_pf_treb = (double)mysound.imm_rel[2]; + *pState->var_pf_bass_att = (double)mysound.avg_rel[0]; + *pState->var_pf_mid_att = (double)mysound.avg_rel[1]; + *pState->var_pf_treb_att = (double)mysound.avg_rel[2]; + *pState->var_pf_frame = (double)GetFrame(); + //*pState->var_pf_monitor = 0; -leave this as it was set in the per-frame INIT code! + *pState->var_pf_q1 = pState->q_values_after_init_code[0];//0.0f; + *pState->var_pf_q2 = pState->q_values_after_init_code[1];//0.0f; + *pState->var_pf_q3 = pState->q_values_after_init_code[2];//0.0f; + *pState->var_pf_q4 = pState->q_values_after_init_code[3];//0.0f; + *pState->var_pf_q5 = pState->q_values_after_init_code[4];//0.0f; + *pState->var_pf_q6 = pState->q_values_after_init_code[5];//0.0f; + *pState->var_pf_q7 = pState->q_values_after_init_code[6];//0.0f; + *pState->var_pf_q8 = pState->q_values_after_init_code[7];//0.0f; + *pState->var_pf_monitor = pState->monitor_after_init_code; + *pState->var_pf_progress = (GetTime() - m_fPresetStartTime) / (m_fNextPresetTime - m_fPresetStartTime); + + // 2. vars that do NOT affect pixel motion: (eval at time==now) + *pState->var_pf_decay = (double)pState->m_fDecay.eval(GetTime()); + *pState->var_pf_wave_a = (double)pState->m_fWaveAlpha.eval(GetTime()); + *pState->var_pf_wave_r = (double)pState->m_fWaveR.eval(GetTime()); + *pState->var_pf_wave_g = (double)pState->m_fWaveG.eval(GetTime()); + *pState->var_pf_wave_b = (double)pState->m_fWaveB.eval(GetTime()); + *pState->var_pf_wave_x = (double)pState->m_fWaveX.eval(GetTime()); + *pState->var_pf_wave_y = (double)pState->m_fWaveY.eval(GetTime()); + *pState->var_pf_wave_mystery= (double)pState->m_fWaveParam.eval(GetTime()); + *pState->var_pf_wave_mode = (double)pState->m_nWaveMode; //?!?! -why won't it work if set to pState->m_nWaveMode??? + *pState->var_pf_ob_size = (double)pState->m_fOuterBorderSize.eval(GetTime()); + *pState->var_pf_ob_r = (double)pState->m_fOuterBorderR.eval(GetTime()); + *pState->var_pf_ob_g = (double)pState->m_fOuterBorderG.eval(GetTime()); + *pState->var_pf_ob_b = (double)pState->m_fOuterBorderB.eval(GetTime()); + *pState->var_pf_ob_a = (double)pState->m_fOuterBorderA.eval(GetTime()); + *pState->var_pf_ib_size = (double)pState->m_fInnerBorderSize.eval(GetTime()); + *pState->var_pf_ib_r = (double)pState->m_fInnerBorderR.eval(GetTime()); + *pState->var_pf_ib_g = (double)pState->m_fInnerBorderG.eval(GetTime()); + *pState->var_pf_ib_b = (double)pState->m_fInnerBorderB.eval(GetTime()); + *pState->var_pf_ib_a = (double)pState->m_fInnerBorderA.eval(GetTime()); + *pState->var_pf_mv_x = (double)pState->m_fMvX.eval(GetTime()); + *pState->var_pf_mv_y = (double)pState->m_fMvY.eval(GetTime()); + *pState->var_pf_mv_dx = (double)pState->m_fMvDX.eval(GetTime()); + *pState->var_pf_mv_dy = (double)pState->m_fMvDY.eval(GetTime()); + *pState->var_pf_mv_l = (double)pState->m_fMvL.eval(GetTime()); + *pState->var_pf_mv_r = (double)pState->m_fMvR.eval(GetTime()); + *pState->var_pf_mv_g = (double)pState->m_fMvG.eval(GetTime()); + *pState->var_pf_mv_b = (double)pState->m_fMvB.eval(GetTime()); + *pState->var_pf_mv_a = (double)pState->m_fMvA.eval(GetTime()); + *pState->var_pf_echo_zoom = (double)pState->m_fVideoEchoZoom.eval(GetTime()); + *pState->var_pf_echo_alpha = (double)pState->m_fVideoEchoAlpha.eval(GetTime()); + *pState->var_pf_echo_orient = (double)pState->m_nVideoEchoOrientation; + // new in v1.04: + *pState->var_pf_wave_usedots = (double)pState->m_bWaveDots; + *pState->var_pf_wave_thick = (double)pState->m_bWaveThick; + *pState->var_pf_wave_additive = (double)pState->m_bAdditiveWaves; + *pState->var_pf_wave_brighten = (double)pState->m_bMaximizeWaveColor; + *pState->var_pf_darken_center = (double)pState->m_bDarkenCenter; + *pState->var_pf_gamma = (double)pState->m_fGammaAdj.eval(GetTime()); + *pState->var_pf_wrap = (double)pState->m_bTexWrap; + *pState->var_pf_invert = (double)pState->m_bInvert; + *pState->var_pf_brighten = (double)pState->m_bBrighten; + *pState->var_pf_darken = (double)pState->m_bDarken; + *pState->var_pf_solarize = (double)pState->m_bSolarize; + *pState->var_pf_meshx = (double)m_nGridX; + *pState->var_pf_meshy = (double)m_nGridY; +} + +void CPlugin::RunPerFrameEquations() +{ + // run per-frame calculations + + int num_reps = (m_pState->m_bBlending) ? 2 : 1; + for (int rep=0; repvar_pv_time = *pState->var_pf_time; + *pState->var_pv_fps = *pState->var_pf_fps; + *pState->var_pv_frame = *pState->var_pf_frame; + *pState->var_pv_progress = *pState->var_pf_progress; + *pState->var_pv_bass = *pState->var_pf_bass; + *pState->var_pv_mid = *pState->var_pf_mid; + *pState->var_pv_treb = *pState->var_pf_treb; + *pState->var_pv_bass_att = *pState->var_pf_bass_att; + *pState->var_pv_mid_att = *pState->var_pf_mid_att; + *pState->var_pv_treb_att = *pState->var_pf_treb_att; + *pState->var_pv_meshx = (double)m_nGridX; + *pState->var_pv_meshy = (double)m_nGridY; + //*pState->var_pv_monitor = *pState->var_pf_monitor; + + // execute once-per-frame expressions: +#ifndef _NO_EXPR_ + if (pState->m_pf_codehandle) + { + resetVars(pState->m_pf_vars); + if (pState->m_pf_codehandle) + { + executeCode(pState->m_pf_codehandle); + } + resetVars(NULL); + } +#endif + + // save some things for next frame: + pState->monitor_after_init_code = *pState->var_pf_monitor; + + // save some things for per-vertex code: + *pState->var_pv_q1 = *pState->var_pf_q1; + *pState->var_pv_q2 = *pState->var_pf_q2; + *pState->var_pv_q3 = *pState->var_pf_q3; + *pState->var_pv_q4 = *pState->var_pf_q4; + *pState->var_pv_q5 = *pState->var_pf_q5; + *pState->var_pv_q6 = *pState->var_pf_q6; + *pState->var_pv_q7 = *pState->var_pf_q7; + *pState->var_pv_q8 = *pState->var_pf_q8; + + // (a few range checks:) + *pState->var_pf_gamma = max(0 , min( 8, *pState->var_pf_gamma )); + *pState->var_pf_echo_zoom = max(0.001, min( 1000, *pState->var_pf_echo_zoom)); + + if (m_pState->m_bRedBlueStereo || m_bAlways3D) + { + // override wave colors + *pState->var_pf_wave_r = 0.35f*(*pState->var_pf_wave_r) + 0.65f; + *pState->var_pf_wave_g = 0.35f*(*pState->var_pf_wave_g) + 0.65f; + *pState->var_pf_wave_b = 0.35f*(*pState->var_pf_wave_b) + 0.65f; + } + } + + if (m_pState->m_bBlending) + { + // For all variables that do NOT affect pixel motion, blend them NOW, + // so later the user can just access m_pState->m_pf_whatever. + double mix = (double)CosineInterp(m_pState->m_fBlendProgress); + double mix2 = 1.0 - mix; + *m_pState->var_pf_decay = mix*(*m_pState->var_pf_decay ) + mix2*(*m_pOldState->var_pf_decay ); + *m_pState->var_pf_wave_a = mix*(*m_pState->var_pf_wave_a ) + mix2*(*m_pOldState->var_pf_wave_a ); + *m_pState->var_pf_wave_r = mix*(*m_pState->var_pf_wave_r ) + mix2*(*m_pOldState->var_pf_wave_r ); + *m_pState->var_pf_wave_g = mix*(*m_pState->var_pf_wave_g ) + mix2*(*m_pOldState->var_pf_wave_g ); + *m_pState->var_pf_wave_b = mix*(*m_pState->var_pf_wave_b ) + mix2*(*m_pOldState->var_pf_wave_b ); + *m_pState->var_pf_wave_x = mix*(*m_pState->var_pf_wave_x ) + mix2*(*m_pOldState->var_pf_wave_x ); + *m_pState->var_pf_wave_y = mix*(*m_pState->var_pf_wave_y ) + mix2*(*m_pOldState->var_pf_wave_y ); + *m_pState->var_pf_wave_mystery = mix*(*m_pState->var_pf_wave_mystery) + mix2*(*m_pOldState->var_pf_wave_mystery); + // wave_mode: exempt (integer) + *m_pState->var_pf_ob_size = mix*(*m_pState->var_pf_ob_size ) + mix2*(*m_pOldState->var_pf_ob_size ); + *m_pState->var_pf_ob_r = mix*(*m_pState->var_pf_ob_r ) + mix2*(*m_pOldState->var_pf_ob_r ); + *m_pState->var_pf_ob_g = mix*(*m_pState->var_pf_ob_g ) + mix2*(*m_pOldState->var_pf_ob_g ); + *m_pState->var_pf_ob_b = mix*(*m_pState->var_pf_ob_b ) + mix2*(*m_pOldState->var_pf_ob_b ); + *m_pState->var_pf_ob_a = mix*(*m_pState->var_pf_ob_a ) + mix2*(*m_pOldState->var_pf_ob_a ); + *m_pState->var_pf_ib_size = mix*(*m_pState->var_pf_ib_size ) + mix2*(*m_pOldState->var_pf_ib_size ); + *m_pState->var_pf_ib_r = mix*(*m_pState->var_pf_ib_r ) + mix2*(*m_pOldState->var_pf_ib_r ); + *m_pState->var_pf_ib_g = mix*(*m_pState->var_pf_ib_g ) + mix2*(*m_pOldState->var_pf_ib_g ); + *m_pState->var_pf_ib_b = mix*(*m_pState->var_pf_ib_b ) + mix2*(*m_pOldState->var_pf_ib_b ); + *m_pState->var_pf_ib_a = mix*(*m_pState->var_pf_ib_a ) + mix2*(*m_pOldState->var_pf_ib_a ); + *m_pState->var_pf_mv_x = mix*(*m_pState->var_pf_mv_x ) + mix2*(*m_pOldState->var_pf_mv_x ); + *m_pState->var_pf_mv_y = mix*(*m_pState->var_pf_mv_y ) + mix2*(*m_pOldState->var_pf_mv_y ); + *m_pState->var_pf_mv_dx = mix*(*m_pState->var_pf_mv_dx ) + mix2*(*m_pOldState->var_pf_mv_dx ); + *m_pState->var_pf_mv_dy = mix*(*m_pState->var_pf_mv_dy ) + mix2*(*m_pOldState->var_pf_mv_dy ); + *m_pState->var_pf_mv_l = mix*(*m_pState->var_pf_mv_l ) + mix2*(*m_pOldState->var_pf_mv_l ); + *m_pState->var_pf_mv_r = mix*(*m_pState->var_pf_mv_r ) + mix2*(*m_pOldState->var_pf_mv_r ); + *m_pState->var_pf_mv_g = mix*(*m_pState->var_pf_mv_g ) + mix2*(*m_pOldState->var_pf_mv_g ); + *m_pState->var_pf_mv_b = mix*(*m_pState->var_pf_mv_b ) + mix2*(*m_pOldState->var_pf_mv_b ); + *m_pState->var_pf_mv_a = mix*(*m_pState->var_pf_mv_a ) + mix2*(*m_pOldState->var_pf_mv_a ); + *m_pState->var_pf_echo_zoom = mix*(*m_pState->var_pf_echo_zoom ) + mix2*(*m_pOldState->var_pf_echo_zoom ); + *m_pState->var_pf_echo_alpha = mix*(*m_pState->var_pf_echo_alpha ) + mix2*(*m_pOldState->var_pf_echo_alpha ); + *m_pState->var_pf_echo_orient = (mix < 0.5f) ? *m_pOldState->var_pf_echo_orient : *m_pState->var_pf_echo_orient; + // added in v1.04: + *m_pState->var_pf_wave_usedots = (mix < 0.5f) ? *m_pOldState->var_pf_wave_usedots : *m_pState->var_pf_wave_usedots ; + *m_pState->var_pf_wave_thick = (mix < 0.5f) ? *m_pOldState->var_pf_wave_thick : *m_pState->var_pf_wave_thick ; + *m_pState->var_pf_wave_additive= (mix < 0.5f) ? *m_pOldState->var_pf_wave_additive : *m_pState->var_pf_wave_additive; + *m_pState->var_pf_wave_brighten= (mix < 0.5f) ? *m_pOldState->var_pf_wave_brighten : *m_pState->var_pf_wave_brighten; + *m_pState->var_pf_darken_center= (mix < 0.5f) ? *m_pOldState->var_pf_darken_center : *m_pState->var_pf_darken_center; + *m_pState->var_pf_gamma = mix*(*m_pState->var_pf_gamma ) + mix2*(*m_pOldState->var_pf_gamma ); + *m_pState->var_pf_wrap = (mix < 0.5f) ? *m_pOldState->var_pf_wrap : *m_pState->var_pf_wrap ; + *m_pState->var_pf_invert = (mix < 0.5f) ? *m_pOldState->var_pf_invert : *m_pState->var_pf_invert ; + *m_pState->var_pf_brighten = (mix < 0.5f) ? *m_pOldState->var_pf_brighten : *m_pState->var_pf_brighten ; + *m_pState->var_pf_darken = (mix < 0.5f) ? *m_pOldState->var_pf_darken : *m_pState->var_pf_darken ; + *m_pState->var_pf_solarize = (mix < 0.5f) ? *m_pOldState->var_pf_solarize : *m_pState->var_pf_solarize ; + } +} + +void CPlugin::RenderFrame(int bRedraw) +{ + int i; + + float fDeltaT = 1.0f/GetFps(); + + // update time + /* + float fDeltaT = (GetFrame()==0) ? 1.0f/30.0f : GetTime() - m_prev_time; + DWORD dwTime = GetTickCount(); + float fDeltaT = (dwTime - m_dwPrevTickCount)*0.001f; + if (GetFrame() > 64) + { + fDeltaT = (fDeltaT)*0.2f + 0.8f*(1.0f/m_fps); + if (fDeltaT > 2.0f/m_fps) + { + char buf[64]; + sprintf(buf, "fixing time gap of %5.3f seconds", fDeltaT); + dumpmsg(buf); + + fDeltaT = 1.0f/m_fps; + } + } + m_dwPrevTickCount = dwTime; + GetTime() += fDeltaT; + */ + + if (GetFrame()==0) + { + m_fStartTime = GetTime(); + m_fPresetStartTime = GetTime(); + } + + if (m_fNextPresetTime < 0) + { + float dt = m_fTimeBetweenPresetsRand * (rand()%1000)*0.001f; + m_fNextPresetTime = GetTime() + m_fBlendTimeAuto + m_fTimeBetweenPresets + dt; + } + + /* + if (m_bPresetLockedByUser || m_bPresetLockedByCode) + { + // if the user has the preset LOCKED, or if they're in the middle of + // saving it, then keep extending the time at which the auto-switch will occur + // (by the length of this frame). + + m_fPresetStartTime += fDeltaT; + m_fNextPresetTime += fDeltaT; + }*/ + + // update fps + /* + if (GetFrame() < 4) + { + m_fps = 0.0f; + } + else if (GetFrame() <= 64) + { + m_fps = GetFrame() / (float)(GetTime() - m_fTimeHistory[0]); + } + else + { + m_fps = 64.0f / (float)(GetTime() - m_fTimeHistory[m_nTimeHistoryPos]); + } + m_fTimeHistory[m_nTimeHistoryPos] = GetTime(); + m_nTimeHistoryPos = (m_nTimeHistoryPos + 1) % 64; + */ + + // limit fps, if necessary + /* + if (m_nFpsLimit > 0 && (GetFrame() % 64) == 0 && GetFrame() > 64) + { + float spf_now = 1.0f / m_fps; + float spf_desired = 1.0f / (float)m_nFpsLimit; + + float new_sleep = m_fFPSLimitSleep + (spf_desired - spf_now)*1000.0f; + + if (GetFrame() <= 128) + m_fFPSLimitSleep = new_sleep; + else + m_fFPSLimitSleep = m_fFPSLimitSleep*0.8f + 0.2f*new_sleep; + + if (m_fFPSLimitSleep < 0) m_fFPSLimitSleep = 0; + if (m_fFPSLimitSleep > 100) m_fFPSLimitSleep = 100; + + //sprintf(m_szUserMessage, "sleep=%f", m_fFPSLimitSleep); + //m_fShowUserMessageUntilThisTime = GetTime() + 3.0f; + } + + static float deficit; + if (GetFrame()==0) deficit = 0; + float ideal_sleep = (m_fFPSLimitSleep + deficit); + int actual_sleep = (int)ideal_sleep; + if (actual_sleep > 0) + Sleep(actual_sleep); + deficit = ideal_sleep - actual_sleep; + if (deficit < 0) deficit = 0; // just in case + if (deficit > 1) deficit = 1; // just in case + */ + + // randomly change the preset, if it's time + if (m_fNextPresetTime < GetTime()) + { + LoadRandomPreset(m_fBlendTimeAuto); + } +/* + // randomly spawn Song Title, if time + if (m_fTimeBetweenRandomSongTitles > 0 && + !m_supertext.bRedrawSuperText && + GetTime() >= m_supertext.fStartTime + m_supertext.fDuration + 1.0f/GetFps()) + { + int n = GetNumToSpawn(GetTime(), fDeltaT, 1.0f/m_fTimeBetweenRandomSongTitles, 0.5f, m_nSongTitlesSpawned); + if (n > 0) + { + LaunchSongTitleAnim(); + m_nSongTitlesSpawned += n; + } + } + + // randomly spawn Custom Message, if time + if (m_fTimeBetweenRandomCustomMsgs > 0 && + !m_supertext.bRedrawSuperText && + GetTime() >= m_supertext.fStartTime + m_supertext.fDuration + 1.0f/GetFps()) + { + int n = GetNumToSpawn(GetTime(), fDeltaT, 1.0f/m_fTimeBetweenRandomCustomMsgs, 0.5f, m_nCustMsgsSpawned); + if (n > 0) + { + LaunchCustomMessage(-1); + m_nCustMsgsSpawned += n; + } + } +*/ + // update m_fBlendProgress; + if (m_pState->m_bBlending) + { + m_pState->m_fBlendProgress = (GetTime() - m_pState->m_fBlendStartTime) / m_pState->m_fBlendDuration; + if (m_pState->m_fBlendProgress > 1.0f) + { + m_pState->m_bBlending = false; + } + } + + // handle hard cuts here (just after new sound analysis) + static float m_fHardCutThresh; + if (GetFrame() == 0) + m_fHardCutThresh = m_fHardCutLoudnessThresh*2.0f; + if (GetFps() > 1.0f && !m_bHardCutsDisabled && !m_bPresetLockedByUser && !m_bPresetLockedByCode) + { + if (mysound.imm_rel[0] + mysound.imm_rel[1] + mysound.imm_rel[2] > m_fHardCutThresh*3.0f) + { + LoadRandomPreset(0.0f); + m_fHardCutThresh *= 2.0f; + } + else + { + float halflife_modified = m_fHardCutHalflife*0.5f; + //thresh = (thresh - 1.5f)*0.99f + 1.5f; + float k = -0.69315f / halflife_modified; + float single_frame_multiplier = powf(2.7183f, k / GetFps()); + m_fHardCutThresh = (m_fHardCutThresh - m_fHardCutLoudnessThresh)*single_frame_multiplier + m_fHardCutLoudnessThresh; + } + } + + // smooth & scale the audio data, according to m_state, for display purposes + float scale = m_pState->m_fWaveScale.eval(GetTime()) / 128.0f; + mysound.fWave[0][0] *= scale; + mysound.fWave[1][0] *= scale; + float mix2 = m_pState->m_fWaveSmoothing.eval(GetTime()); + float mix1 = scale*(1.0f - mix2); + for (i=1; i<576; i++) + { + mysound.fWave[0][i] = mysound.fWave[0][i]*mix1 + mysound.fWave[0][i-1]*mix2; + mysound.fWave[1][i] = mysound.fWave[1][i]*mix1 + mysound.fWave[1][i-1]*mix2; + } + + RunPerFrameEquations(); + + // restore any lost surfaces + //m_lpDD->RestoreAllSurfaces(); + + LPDIRECT3DDEVICE9 lpDevice = GetDevice(); + if (!lpDevice) + return; + + // Remember the original backbuffer and zbuffer + LPDIRECT3DSURFACE9 pBackBuffer, pZBuffer; + lpDevice->GetRenderTarget(0, &pBackBuffer ); + lpDevice->GetDepthStencilSurface( &pZBuffer ); + + D3DSURFACE_DESC desc; + pBackBuffer->GetDesc(&desc); + + m_backBufferWidth = desc.Width; + m_backBufferHeight = desc.Height; + + // set up render state + { + DWORD texaddr = (*m_pState->var_pf_wrap) ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP; + lpDevice->SetRenderState(D3DRS_WRAP0, 0); + lpDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, texaddr); + lpDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, texaddr); + lpDevice->SetSamplerState(0, D3DSAMP_ADDRESSW, texaddr); + + lpDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD ); + lpDevice->SetRenderState( D3DRS_SPECULARENABLE, FALSE ); + lpDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + lpDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + lpDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE ); + lpDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); + lpDevice->SetRenderState( D3DRS_COLORVERTEX, TRUE ); + lpDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + lpDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); + lpDevice->SetRenderState( D3DRS_AMBIENT, 0xFFFFFFFF ); //? +// lpDevice->SetRenderState( D3DRS_CLIPPING, TRUE ); + + // set min/mag/mip filtering modes; use anisotropy if available. + if (m_bAnisotropicFiltering && (GetCaps()->TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)) + lpDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC); +// else if (GetCaps()->TextureFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR) + else + lpDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); +// else +// SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT); + + if (m_bAnisotropicFiltering && (GetCaps()->TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)) + lpDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC); + else +// else if (GetCaps()->TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR) + lpDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + // else +// SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); + + lpDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR ); + + // note: this texture stage state setup works for 0 or 1 texture. + // if you set a texture, it will be modulated with the current diffuse color. + // if you don't set a texture, it will just use the current diffuse color. + lpDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + lpDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); + lpDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE); + lpDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); + lpDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + + if (GetCaps()->RasterCaps & D3DPRASTERCAPS_DITHER) + lpDevice->SetRenderState(D3DRS_DITHERENABLE, FALSE); + /* WISO: if (GetCaps()->RasterCaps & D3DPRASTERCAPS_ANTIALIASEDGES) + lpDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);*/ + + // NOTE: don't forget to call SetTexture and SetVertexShader before drawing! + // Examples: + // SPRITEVERTEX verts[4]; // has texcoords + // lpDevice->SetTexture(0, m_sprite_tex); + // lpDevice->SetVertexShader( SPRITEVERTEX_FORMAT ); + // + // WFVERTEX verts[4]; // no texcoords + // lpDevice->SetTexture(0, NULL); + // lpDevice->SetVertexShader( WFVERTEX_FORMAT ); + } + + // render string to m_lpDDSTitle, if necessary + if (m_supertext.bRedrawSuperText) + { + if (!RenderStringToTitleTexture()) + m_supertext.fStartTime = -1.0f; + m_supertext.bRedrawSuperText = false; + } + + // set up to render [from NULL] to VS0 (for motion vectors). + { + lpDevice->SetTexture(0, NULL); + + IDirect3DSurface9* pNewTarget = NULL; + if (m_lpVS[0]->GetSurfaceLevel(0, &pNewTarget) != D3D_OK) + return; + lpDevice->SetRenderTarget(0, pNewTarget); + pNewTarget->Release(); + lpDevice->SetDepthStencilSurface( NULL ); + + lpDevice->SetTexture(0, NULL); + } + + // draw motion vectors to VS0 + DrawMotionVectors(); + + // set up to render [from VS0] to VS1. + { + lpDevice->SetTexture(0, NULL); + + IDirect3DSurface9* pNewTarget = NULL; + if (m_lpVS[1]->GetSurfaceLevel(0, &pNewTarget) != D3D_OK) + return; + lpDevice->SetRenderTarget(0, pNewTarget); + lpDevice->SetDepthStencilSurface( NULL ); + pNewTarget->Release(); + } + + // do the warping for this frame + if (GetCaps()->RasterCaps & D3DPRASTERCAPS_DITHER) + lpDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE); + /* WISO: if (GetCaps()->RasterCaps & D3DPRASTERCAPS_ANTIALIASEDGES) + lpDevice->SetRenderState(D3DRS_EDGEANTIALIAS, FALSE);*/ + WarpedBlitFromVS0ToVS1(); + if (GetCaps()->RasterCaps & D3DPRASTERCAPS_DITHER) + lpDevice->SetRenderState(D3DRS_DITHERENABLE, FALSE); + /*if (GetCaps()->RasterCaps & D3DPRASTERCAPS_ANTIALIASEDGES) + lpDevice->SetRenderState(D3DRS_EDGEANTIALIAS, TRUE);*/ + + // draw audio data + DrawCustomShapes(); // draw these first; better for feedback if the waves draw *over* them. + DrawCustomWaves(); + DrawWave(mysound.fWave[0], mysound.fWave[1]); + DrawSprites(); + + // if song title animation just ended, render it into the VS: + if (m_supertext.fStartTime >= 0 && + GetTime() >= m_supertext.fStartTime + m_supertext.fDuration && + !m_supertext.bRedrawSuperText) + { + m_supertext.fStartTime = -1.0f; // 'off' state + ShowSongTitleAnim(m_nTexSize, m_nTexSize, 1.0f); + } + + // Change the rendertarget back to the original setup + lpDevice->SetTexture(0, NULL); + // WISO: lpDevice->SetRenderTarget( pBackBuffer, pZBuffer ); + lpDevice->SetRenderTarget(0, pBackBuffer); + lpDevice->SetDepthStencilSurface( pZBuffer ); + + SafeRelease(pBackBuffer); + SafeRelease(pZBuffer); + + /* WISO: if (GetCaps()->RasterCaps & D3DPRASTERCAPS_ANTIALIASEDGES) + lpDevice->SetRenderState(D3DRS_EDGEANTIALIAS, FALSE);*/ + + // show it to user + ShowToUser(bRedraw); + + + // finally, render song title animation to back buffer + if (m_supertext.fStartTime >= 0 && + GetTime() < m_supertext.fStartTime + m_supertext.fDuration && + !m_supertext.bRedrawSuperText) + { + float fProgress = (GetTime() - m_supertext.fStartTime) / m_supertext.fDuration; + ShowSongTitleAnim(GetWidth(), GetHeight(), fProgress); + } + + DrawUserSprites(); + + // flip buffers + IDirect3DTexture9* pTemp = m_lpVS[0]; + m_lpVS[0] = m_lpVS[1]; + m_lpVS[1] = pTemp; + + /* WISO: if (GetCaps()->RasterCaps & D3DPRASTERCAPS_ANTIALIASEDGES) + lpDevice->SetRenderState(D3DRS_EDGEANTIALIAS, FALSE);*/ + if (GetCaps()->RasterCaps & D3DPRASTERCAPS_DITHER) + lpDevice->SetRenderState(D3DRS_DITHERENABLE, FALSE); +} + + +void CPlugin::DrawMotionVectors() +{ + // FLEXIBLE MOTION VECTOR FIELD + if ((float)*m_pState->var_pf_mv_a >= 0.001f) + { + //------------------------------------------------------- + LPDIRECT3DDEVICE9 lpDevice = GetDevice(); + if (!lpDevice) + return; + + lpDevice->SetTexture(0, NULL); + lpDevice->SetFVF(WFVERTEX_FORMAT); + //------------------------------------------------------- + + int x,y; + + int nX = (int)(*m_pState->var_pf_mv_x);// + 0.999f); + int nY = (int)(*m_pState->var_pf_mv_y);// + 0.999f); + float dx = (float)*m_pState->var_pf_mv_x - nX; + float dy = (float)*m_pState->var_pf_mv_y - nY; + if (nX > 64) { nX = 64; dx = 0; } + if (nY > 48) { nY = 48; dy = 0; } + + if (nX > 0 && nY > 0) + { + /* + float dx2 = m_fMotionVectorsTempDx;//(*m_pState->var_pf_mv_dx) * 0.05f*GetTime(); // 0..1 range + float dy2 = m_fMotionVectorsTempDy;//(*m_pState->var_pf_mv_dy) * 0.05f*GetTime(); // 0..1 range + if (GetFps() > 2.0f && GetFps() < 300.0f) + { + dx2 += (float)(*m_pState->var_pf_mv_dx) * 0.05f / GetFps(); + dy2 += (float)(*m_pState->var_pf_mv_dy) * 0.05f / GetFps(); + } + if (dx2 > 1.0f) dx2 -= (int)dx2; + if (dy2 > 1.0f) dy2 -= (int)dy2; + if (dx2 < 0.0f) dx2 = 1.0f - (-dx2 - (int)(-dx2)); + if (dy2 < 0.0f) dy2 = 1.0f - (-dy2 - (int)(-dy2)); + // hack: when there is only 1 motion vector on the screem, to keep it in + // the center, we gradually migrate it toward 0.5. + dx2 = dx2*0.995f + 0.5f*0.005f; + dy2 = dy2*0.995f + 0.5f*0.005f; + // safety catch + if (dx2 < 0 || dx2 > 1 || dy2 < 0 || dy2 > 1) + { + dx2 = 0.5f; + dy2 = 0.5f; + } + m_fMotionVectorsTempDx = dx2; + m_fMotionVectorsTempDy = dy2;*/ + float dx2 = (float)(*m_pState->var_pf_mv_dx); + float dy2 = (float)(*m_pState->var_pf_mv_dy); + + float len_mult = (float)*m_pState->var_pf_mv_l; + if (dx < 0) dx = 0; + if (dy < 0) dy = 0; + if (dx > 1) dx = 1; + if (dy > 1) dy = 1; + //dx = dx * 1.0f/(float)nX; + //dy = dy * 1.0f/(float)nY; + float inv_texsize = 1.0f/(float)m_nTexSize; + float min_len = 1.0f*inv_texsize; + + + WFVERTEX v[(64+1)*2]; + ZeroMemory(v, sizeof(WFVERTEX)*(64+1)*2); + v[0].Diffuse = D3DCOLOR_RGBA_01((float)*m_pState->var_pf_mv_r,(float)*m_pState->var_pf_mv_g,(float)*m_pState->var_pf_mv_b,(float)*m_pState->var_pf_mv_a); + for (x=1; x<(nX+1)*2; x++) + v[x].Diffuse = v[0].Diffuse; + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + + for (y=0; y 0.0001f && fy < 0.9999f) + { + int n = 0; + for (x=0; x 0.0001f && fx < 0.9999f) + { + float fx2, fy2; + ReversePropagatePoint(fx, fy, &fx2, &fy2); // NOTE: THIS IS REALLY A REVERSE-PROPAGATION + //fx2 = fx*2 - fx2; + //fy2 = fy*2 - fy2; + //fx2 = fx + 1.0f/(float)m_nTexSize; + //fy2 = 1-(fy + 1.0f/(float)m_nTexSize); + + // enforce minimum trail lengths: + { + float dx = (fx2 - fx); + float dy = (fy2 - fy); + dx *= len_mult; + dy *= len_mult; + float len = sqrtf(dx*dx + dy*dy); + + if (len > min_len) + { + + } + else if (len > 0.00000001f) + { + len = min_len/len; + dx *= len; + dy *= len; + } + else + { + dx = min_len; + dy = min_len; + } + + fx2 = fx + dx; + fy2 = fy + dy; + } + /**/ + + v[n].x = fx * 2.0f - 1.0f; + v[n].y = fy * 2.0f - 1.0f; + v[n+1].x = fx2 * 2.0f - 1.0f; + v[n+1].y = fy2 * 2.0f - 1.0f; + + // actually, project it in the reverse direction + //v[n+1].x = v[n].x*2.0f - v[n+1].x;// + dx*2; + //v[n+1].y = v[n].y*2.0f - v[n+1].y;// + dy*2; + //v[n].x += dx*2; + //v[n].y += dy*2; + + n += 2; + } + } + + // draw it + if (n != 0) + lpDevice->DrawPrimitiveUP(D3DPT_LINELIST, n/2, v, sizeof(WFVERTEX)); + } + } + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + } + } +} + +/* +void CPlugin::UpdateSongInfo() +{ + if (m_bShowSongTitle || m_bSongTitleAnims) + { + char szOldSongMessage[512]; + strcpy(szOldSongMessage, m_szSongMessage); + + if (::GetWindowText(m_hWndParent, m_szSongMessage, sizeof(m_szSongMessage))) + { + // remove ' - Winamp' at end + if (strlen(m_szSongMessage) > 9) + { + int check_pos = strlen(m_szSongMessage) - 9; + if (strcmp(" - Winamp", (char *)(m_szSongMessage + check_pos)) == 0) + m_szSongMessage[check_pos] = 0; + } + + // remove ' - Winamp [Paused]' at end + if (strlen(m_szSongMessage) > 18) + { + int check_pos = strlen(m_szSongMessage) - 18; + if (strcmp(" - Winamp [Paused]", (char *)(m_szSongMessage + check_pos)) == 0) + m_szSongMessage[check_pos] = 0; + } + + // remove song # and period from beginning + char *p = m_szSongMessage; + while (*p >= '0' && *p <= '9') p++; + if (*p == '.' && *(p+1) == ' ') + { + p += 2; + int pos = 0; + while (*p != 0) + { + m_szSongMessage[pos++] = *p; + p++; + } + m_szSongMessage[pos++] = 0; + } + + // fix &'s for display + /* + { + int pos = 0; + int len = strlen(m_szSongMessage); + while (m_szSongMessage[pos]) + { + if (m_szSongMessage[pos] == '&') + { + for (int x=len; x>=pos; x--) + m_szSongMessage[x+1] = m_szSongMessage[x]; + len++; + pos++; + } + pos++; + } + }*/ +/* + if (m_bSongTitleAnims && + ((strcmp(szOldSongMessage, m_szSongMessage) != 0) || (GetFrame()==0))) + { + // launch song title animation + LaunchSongTitleAnim(); + + /* + m_supertext.bRedrawSuperText = true; + m_supertext.bIsSongTitle = true; + strcpy(m_supertext.szText, m_szSongMessage); + strcpy(m_supertext.nFontFace, m_szTitleFontFace); + m_supertext.fFontSize = (float)m_nTitleFontSize; + m_supertext.bBold = m_bTitleFontBold; + m_supertext.bItal = m_bTitleFontItalic; + m_supertext.fX = 0.5f; + m_supertext.fY = 0.5f; + m_supertext.fGrowth = 1.0f; + m_supertext.fDuration = m_fSongTitleAnimDuration; + m_supertext.nColorR = 255; + m_supertext.nColorG = 255; + m_supertext.nColorB = 255; + + m_supertext.fStartTime = GetTime(); + */ +/* } + } + else + { + sprintf(m_szSongMessage, ""); + } + } + + m_nTrackPlaying = SendMessage(m_hWndParent,WM_USER, 0, 125); + + // append song time + if (m_bShowSongTime && m_nSongPosMS >= 0) + { + float time_s = m_nSongPosMS*0.001f; + + int minutes = (int)(time_s/60); + time_s -= minutes*60; + int seconds = (int)time_s; + time_s -= seconds; + int dsec = (int)(time_s*100); + + sprintf(m_szSongTime, "%d:%02d.%02d", minutes, seconds, dsec); + } + + // append song length + if (m_bShowSongLen && m_nSongLenMS > 0) + { + int len_s = m_nSongLenMS/1000; + int minutes = len_s/60; + int seconds = len_s - minutes*60; + + char buf[512]; + sprintf(buf, " / %d:%02d", minutes, seconds); + strcat(m_szSongTime, buf); + } +} +*/ + +bool CPlugin::ReversePropagatePoint(float fx, float fy, float *fx2, float *fy2) +{ + //float fy = y/(float)nMotionVectorsY; + int y0 = (int)(fy*m_nGridY); + float dy = fy*m_nGridY - y0; + + //float fx = x/(float)nMotionVectorsX; + int x0 = (int)(fx*m_nGridX); + float dx = fx*m_nGridX - x0; + + int x1 = x0 + 1; + int y1 = y0 + 1; + + if (x0 < 0) return false; + if (y0 < 0) return false; + //if (x1 < 0) return false; + //if (y1 < 0) return false; + //if (x0 > m_nGridX) return false; + //if (y0 > m_nGridY) return false; + if (x1 > m_nGridX) return false; + if (y1 > m_nGridY) return false; + + float tu, tv; + tu = m_verts[y0*(m_nGridX+1)+x0].tu * (1-dx)*(1-dy); + tv = m_verts[y0*(m_nGridX+1)+x0].tv * (1-dx)*(1-dy); + tu += m_verts[y0*(m_nGridX+1)+x1].tu * (dx)*(1-dy); + tv += m_verts[y0*(m_nGridX+1)+x1].tv * (dx)*(1-dy); + tu += m_verts[y1*(m_nGridX+1)+x0].tu * (1-dx)*(dy); + tv += m_verts[y1*(m_nGridX+1)+x0].tv * (1-dx)*(dy); + tu += m_verts[y1*(m_nGridX+1)+x1].tu * (dx)*(dy); + tv += m_verts[y1*(m_nGridX+1)+x1].tv * (dx)*(dy); + + *fx2 = tu; + *fy2 = 1.0f - tv; + return true; + +} + + +void CPlugin::WarpedBlitFromVS0ToVS1() +{ + MungeFPCW(NULL); // puts us in single-precision mode & disables exceptions + + LPDIRECT3DDEVICE9 lpDevice = GetDevice(); + if (!lpDevice) + return; + + lpDevice->SetTexture(0, m_lpVS[0]); + lpDevice->SetFVF( SPRITEVERTEX_FORMAT ); + + // warp stuff + float fWarpTime = GetTime() * m_pState->m_fWarpAnimSpeed; + float fWarpScale = m_pState->m_fWarpScale.eval(GetTime()); + float fWarpScaleInv = 1.0f; + if(fWarpScale != 0.0f) + fWarpScaleInv = 1.0f / fWarpScale; + float f[4]; + f[0] = 11.68f + 4.0f*cosf(fWarpTime*1.413f + 10); + f[1] = 8.77f + 3.0f*cosf(fWarpTime*1.113f + 7); + f[2] = 10.54f + 3.0f*cosf(fWarpTime*1.233f + 3); + f[3] = 11.49f + 4.0f*cosf(fWarpTime*0.933f + 5); + + int num_reps = (m_pState->m_bBlending) ? 2 : 1; + float fCosineBlend = 0.50f*(m_pState->m_fBlendProgress) + 0.50f*CosineInterp(m_pState->m_fBlendProgress); + float fCosineBlend2 = 0.40f*(m_pState->m_fBlendProgress) + 0.60f*CosineInterp(m_pState->m_fBlendProgress); + + // decay + float fDecay = (float)(*m_pState->var_pf_decay); + + // texel alignment + float texel_offset = 0.5f / (float)m_nTexSize; + + //if (m_pState->m_bBlending) + // fDecay = fDecay*(fCosineBlend) + (1.0f-fCosineBlend)*((float)(*m_pOldState->var_pf_decay)); + + if (m_bAutoGamma && GetFrame()==0) + { + if (strstr(GetDriverDescription(), "nvidia") || + strstr(GetDriverDescription(), "nVidia") || + strstr(GetDriverDescription(), "NVidia") || + strstr(GetDriverDescription(), "NVIDIA")) + m_n16BitGamma = 2; + else if (strstr(GetDriverDescription(), "ATI RAGE MOBILITY M")) + m_n16BitGamma = 2; + else + m_n16BitGamma = 0; + } + + if (m_n16BitGamma > 0 && + (GetBackBufFormat()==D3DFMT_R5G6B5 || GetBackBufFormat()==D3DFMT_X1R5G5B5 || GetBackBufFormat()==D3DFMT_A1R5G5B5 || GetBackBufFormat()==D3DFMT_A4R4G4B4) && + fDecay < 0.9999f) + { + fDecay = min(fDecay, (32.0f - m_n16BitGamma)/32.0f); + } + + D3DCOLOR cDecay = D3DCOLOR_RGBA_01(fDecay,fDecay,fDecay,1); + + + for (int rep=0; repm_pv_vars); + + // cache the doubles as floats so that computations are a bit faster + float fZoom = (float)(*pState->var_pf_zoom); + float fZoomExp = (float)(*pState->var_pf_zoomexp); + float fRot = (float)(*pState->var_pf_rot); + float fWarp = (float)(*pState->var_pf_warp); + float fCX = (float)(*pState->var_pf_cx); + float fCY = (float)(*pState->var_pf_cy); + float fDX = (float)(*pState->var_pf_dx); + float fDY = (float)(*pState->var_pf_dy); + float fSX = (float)(*pState->var_pf_sx); + float fSY = (float)(*pState->var_pf_sy); + + int n = 0; + + for (int y=0; y<=m_nGridY; y++) + { + for (int x=0; x<=m_nGridX; x++) + { + // Note: x, y, z are now set at init. time - no need to mess with them! + //m_verts[n].x = i/(float)m_nGridX*2.0f - 1.0f; + //m_verts[n].y = j/(float)m_nGridY*2.0f - 1.0f; + //m_verts[n].z = 0.0f; + + if (pState->m_pp_codehandle) + { + // restore all the variables to their original states, + // run the user-defined equations, + // then move the results into local vars for computation as floats + + *pState->var_pv_x = (double)(m_verts[n].x*0.5f + 0.5f); + *pState->var_pv_y = (double)(m_verts[n].y*-0.5f + 0.5f); + *pState->var_pv_rad = (double)m_vertinfo[n].rad; + *pState->var_pv_ang = (double)m_vertinfo[n].ang; + *pState->var_pv_zoom = *pState->var_pf_zoom; + *pState->var_pv_zoomexp = *pState->var_pf_zoomexp; + *pState->var_pv_rot = *pState->var_pf_rot; + *pState->var_pv_warp = *pState->var_pf_warp; + *pState->var_pv_cx = *pState->var_pf_cx; + *pState->var_pv_cy = *pState->var_pf_cy; + *pState->var_pv_dx = *pState->var_pf_dx; + *pState->var_pv_dy = *pState->var_pf_dy; + *pState->var_pv_sx = *pState->var_pf_sx; + *pState->var_pv_sy = *pState->var_pf_sy; + /* + *pState->var_pv_q1 = *pState->var_pf_q1; + *pState->var_pv_q2 = *pState->var_pf_q2; + *pState->var_pv_q3 = *pState->var_pf_q3; + *pState->var_pv_q4 = *pState->var_pf_q4; + *pState->var_pv_q5 = *pState->var_pf_q5; + *pState->var_pv_q6 = *pState->var_pf_q6; + *pState->var_pv_q7 = *pState->var_pf_q7; + *pState->var_pv_q8 = *pState->var_pf_q8; + */ + //*pState->var_pv_time = *pState->var_pv_time; // (these are all now initialized + //*pState->var_pv_bass = *pState->var_pv_bass; // just once per frame) + //*pState->var_pv_mid = *pState->var_pv_mid; + //*pState->var_pv_treb = *pState->var_pv_treb; + //*pState->var_pv_bass_att = *pState->var_pv_bass_att; + //*pState->var_pv_mid_att = *pState->var_pv_mid_att; + //*pState->var_pv_treb_att = *pState->var_pv_treb_att; + +#ifndef _NO_EXPR_ + executeCode(pState->m_pp_codehandle); +#endif + + fZoom = (float)(*pState->var_pv_zoom); + fZoomExp = (float)(*pState->var_pv_zoomexp); + fRot = (float)(*pState->var_pv_rot); + fWarp = (float)(*pState->var_pv_warp); + fCX = (float)(*pState->var_pv_cx); + fCY = (float)(*pState->var_pv_cy); + fDX = (float)(*pState->var_pv_dx); + fDY = (float)(*pState->var_pv_dy); + fSX = (float)(*pState->var_pv_sx); + fSY = (float)(*pState->var_pv_sy); + } + + float fZoom2 = powf(fZoom, powf(fZoomExp, m_vertinfo[n].rad*2.0f - 1.0f)); + + // initial texcoords, w/built-in zoom factor + float fZoom2Inv = 1.0f/fZoom2; + float u = m_verts[n].x*0.5f*fZoom2Inv + 0.5f; + float v = -m_verts[n].y*0.5f*fZoom2Inv + 0.5f; + + // stretch on X, Y: + u = (u - fCX)/fSX + fCX; + v = (v - fCY)/fSY + fCY; + + // warping: + //if (fWarp > 0.001f || fWarp < -0.001f) + //{ + u += fWarp*0.0035f*sinf(fWarpTime*0.333f + fWarpScaleInv*(m_verts[n].x*f[0] - m_verts[n].y*f[3])); + v += fWarp*0.0035f*cosf(fWarpTime*0.375f - fWarpScaleInv*(m_verts[n].x*f[2] + m_verts[n].y*f[1])); + u += fWarp*0.0035f*cosf(fWarpTime*0.753f - fWarpScaleInv*(m_verts[n].x*f[1] - m_verts[n].y*f[2])); + v += fWarp*0.0035f*sinf(fWarpTime*0.825f + fWarpScaleInv*(m_verts[n].x*f[0] + m_verts[n].y*f[3])); + //} + + // rotation: + float u2 = u - fCX; + float v2 = v - fCY; + + float cos_rot = cosf(fRot); + float sin_rot = sinf(fRot); + u = u2*cos_rot - v2*sin_rot + fCX; + v = u2*sin_rot + v2*cos_rot + fCY; + + // translation: + u -= fDX - texel_offset; + v -= fDY - texel_offset; + + if (rep==0) + { + //m_verts[n].Diffuse = cDecay; // see below + m_verts[n].tu = u; + m_verts[n].tv = v; + } + else + { + float mix2 = m_vertinfo[n].a*m_pState->m_fBlendProgress + m_vertinfo[n].c;//fCosineBlend2; + mix2 = max(0,min(1,mix2)); + m_verts[n].tu = m_verts[n].tu*(mix2) + u*(1-mix2); + m_verts[n].tv = m_verts[n].tv*(mix2) + v*(1-mix2); + } + + /* + if (rep==num_reps-1) + { + m_verts[n].tu += 0.25f*(FRAND*2-1)/(float)m_nTexSize; + m_verts[n].tv += 0.25f*(FRAND*2-1)/(float)m_nTexSize; + } + */ + + n++; + } + } + + /* + pState->q_values_after_init_code[0] = *pState->var_pv_q1; + pState->q_values_after_init_code[1] = *pState->var_pv_q2; + pState->q_values_after_init_code[2] = *pState->var_pv_q3; + pState->q_values_after_init_code[3] = *pState->var_pv_q4; + pState->q_values_after_init_code[4] = *pState->var_pv_q5; + pState->q_values_after_init_code[5] = *pState->var_pv_q6; + pState->q_values_after_init_code[6] = *pState->var_pv_q7; + pState->q_values_after_init_code[7] = *pState->var_pv_q8; + */ + + resetVars(NULL); + } + + + + // hurl the triangle strips at the video card + + int poly; + + for (poly=0; polyDrawPrimitiveUP(D3DPT_TRIANGLESTRIP, m_nGridX, (void*)m_verts_temp, sizeof(SPRITEVERTEX)); + } +} + +void CPlugin::DrawCustomShapes() +{ + LPDIRECT3DDEVICE9 lpDevice = GetDevice(); + if (!lpDevice) + return; + + //lpDevice->SetTexture(0, m_lpVS[0]);//NULL); + //lpDevice->SetVertexShader( SPRITEVERTEX_FORMAT ); + + int num_reps = (m_pState->m_bBlending) ? 2 : 1; + for (int rep=0; repm_fBlendProgress : (1-m_pState->m_fBlendProgress); + + for (int i=0; im_shape[i].enabled) + { + /* + int bAdditive = 0; + int nSides = 3;//3 + ((int)GetTime() % 8); + int bThickOutline = 0; + float x = 0.5f + 0.1f*cosf(GetTime()*0.8f+1); + float y = 0.5f + 0.1f*sinf(GetTime()*0.8f+1); + float rad = 0.15f + 0.07f*sinf(GetTime()*1.1f+3); + float ang = GetTime()*1.5f; + + // inside colors + float r = 1; + float g = 0; + float b = 0; + float a = 0.4f;//0.1f + 0.1f*sinf(GetTime()*0.31f); + + // outside colors + float r2 = 0; + float g2 = 1; + float b2 = 0; + float a2 = 0; + + // border colors + float border_r = 1; + float border_g = 1; + float border_b = 1; + float border_a = 0.5f; + */ + + // 1. execute per-frame code + LoadCustomShapePerFrameEvallibVars(pState, i); + + #ifndef _NO_EXPR_ + if (pState->m_shape[i].m_pf_codehandle) + { + resetVars(pState->m_shape[i].m_pf_vars); + executeCode(pState->m_shape[i].m_pf_codehandle); + resetVars(NULL); + } + #endif + + // save changes to t1-t8 this frame + /* + pState->m_shape[i].t_values_after_init_code[0] = *pState->m_shape[i].var_pf_t1; + pState->m_shape[i].t_values_after_init_code[1] = *pState->m_shape[i].var_pf_t2; + pState->m_shape[i].t_values_after_init_code[2] = *pState->m_shape[i].var_pf_t3; + pState->m_shape[i].t_values_after_init_code[3] = *pState->m_shape[i].var_pf_t4; + pState->m_shape[i].t_values_after_init_code[4] = *pState->m_shape[i].var_pf_t5; + pState->m_shape[i].t_values_after_init_code[5] = *pState->m_shape[i].var_pf_t6; + pState->m_shape[i].t_values_after_init_code[6] = *pState->m_shape[i].var_pf_t7; + pState->m_shape[i].t_values_after_init_code[7] = *pState->m_shape[i].var_pf_t8; + */ + + int sides = (int)(*pState->m_shape[i].var_pf_sides); + if (sides<3) sides=3; + if (sides>100) sides=100; + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, ((int)(*pState->m_shape[i].var_pf_additive) != 0) ? D3DBLEND_ONE : D3DBLEND_INVSRCALPHA); + + SPRITEVERTEX v[512]; // for textured shapes (has texcoords) + WFVERTEX v2[512]; // for untextured shapes + borders + + v[0].x = (float)(*pState->m_shape[i].var_pf_x* 2-1);// * ASPECT; + v[0].y = (float)(*pState->m_shape[i].var_pf_y*-2+1); + v[0].z = 0; + v[0].tu = 0.5f; + v[0].tv = 0.5f; + v[0].Diffuse = + ((((int)(*pState->m_shape[i].var_pf_a * 255 * alpha_mult)) & 0xFF) << 24) | + ((((int)(*pState->m_shape[i].var_pf_r * 255)) & 0xFF) << 16) | + ((((int)(*pState->m_shape[i].var_pf_g * 255)) & 0xFF) << 8) | + ((((int)(*pState->m_shape[i].var_pf_b * 255)) & 0xFF) ); + v[1].Diffuse = + ((((int)(*pState->m_shape[i].var_pf_a2 * 255 * alpha_mult)) & 0xFF) << 24) | + ((((int)(*pState->m_shape[i].var_pf_r2 * 255)) & 0xFF) << 16) | + ((((int)(*pState->m_shape[i].var_pf_g2 * 255)) & 0xFF) << 8) | + ((((int)(*pState->m_shape[i].var_pf_b2 * 255)) & 0xFF) ); + + for (int j=1; jm_shape[i].var_pf_rad*cosf(t*3.1415927f*2 + (float)*pState->m_shape[i].var_pf_ang + 3.1415927f*0.25f)*ASPECT; // DON'T TOUCH! + v[j].y = v[0].y + (float)*pState->m_shape[i].var_pf_rad*sinf(t*3.1415927f*2 + (float)*pState->m_shape[i].var_pf_ang + 3.1415927f*0.25f); // DON'T TOUCH! + v[j].z = 0; + v[j].tu = 0.5f + 0.5f*cosf(t*3.1415927f*2 + (float)*pState->m_shape[i].var_pf_tex_ang + 3.1415927f*0.25f)/((float)*pState->m_shape[i].var_pf_tex_zoom) * ASPECT; // DON'T TOUCH! + v[j].tv = 0.5f + 0.5f*sinf(t*3.1415927f*2 + (float)*pState->m_shape[i].var_pf_tex_ang + 3.1415927f*0.25f)/((float)*pState->m_shape[i].var_pf_tex_zoom); // DON'T TOUCH! + v[j].Diffuse = v[1].Diffuse; + } + v[sides+1] = v[1]; + + if ((int)(*pState->m_shape[i].var_pf_textured) != 0) + { + // draw textured version + lpDevice->SetTexture(0, m_lpVS[0]); + lpDevice->SetFVF( SPRITEVERTEX_FORMAT ); + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, sides, (void*)v, sizeof(SPRITEVERTEX)); + } + else + { + // no texture + for (int j=0; j < sides+2; j++) + { + v2[j].x = v[j].x; + v2[j].y = v[j].y; + v2[j].z = v[j].z; + v2[j].Diffuse = v[j].Diffuse; + } + lpDevice->SetTexture(0, NULL); + lpDevice->SetFVF( WFVERTEX_FORMAT ); + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, sides, (void*)v2, sizeof(WFVERTEX)); + } + + + // DRAW BORDER + if (*pState->m_shape[i].var_pf_border_a > 0) + { + lpDevice->SetTexture(0, NULL); + lpDevice->SetFVF( WFVERTEX_FORMAT ); + + v2[0].Diffuse = + ((((int)(*pState->m_shape[i].var_pf_border_a * 255 * alpha_mult)) & 0xFF) << 24) | + ((((int)(*pState->m_shape[i].var_pf_border_r * 255)) & 0xFF) << 16) | + ((((int)(*pState->m_shape[i].var_pf_border_g * 255)) & 0xFF) << 8) | + ((((int)(*pState->m_shape[i].var_pf_border_b * 255)) & 0xFF) ); + for (int j=0; jm_shape[i].var_pf_thick) != 0) ? 4 : 1; + float x_inc = 2.0f / (float)m_nTexSize; + for (int it=0; itDrawPrimitiveUP(D3DPT_LINESTRIP, sides, (void*)&v2[1], sizeof(WFVERTEX)); + } + + lpDevice->SetTexture(0, m_lpVS[0]); + lpDevice->SetFVF( SPRITEVERTEX_FORMAT ); + } + } + } + } + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); +} + +void CPlugin::LoadCustomShapePerFrameEvallibVars(CState* pState, int i) +{ + *pState->m_shape[i].var_pf_time = (double)(GetTime() - m_fStartTime); + *pState->m_shape[i].var_pf_frame = (double)GetFrame(); + *pState->m_shape[i].var_pf_fps = (double)GetFps(); + *pState->m_shape[i].var_pf_progress = (GetTime() - m_fPresetStartTime) / (m_fNextPresetTime - m_fPresetStartTime); + *pState->m_shape[i].var_pf_bass = (double)mysound.imm_rel[0]; + *pState->m_shape[i].var_pf_mid = (double)mysound.imm_rel[1]; + *pState->m_shape[i].var_pf_treb = (double)mysound.imm_rel[2]; + *pState->m_shape[i].var_pf_bass_att = (double)mysound.avg_rel[0]; + *pState->m_shape[i].var_pf_mid_att = (double)mysound.avg_rel[1]; + *pState->m_shape[i].var_pf_treb_att = (double)mysound.avg_rel[2]; + *pState->m_shape[i].var_pf_q1 = *pState->var_pf_q1;//pState->q_values_after_init_code[0];//0.0f; + *pState->m_shape[i].var_pf_q2 = *pState->var_pf_q2;//pState->q_values_after_init_code[1];//0.0f; + *pState->m_shape[i].var_pf_q3 = *pState->var_pf_q3;//pState->q_values_after_init_code[2];//0.0f; + *pState->m_shape[i].var_pf_q4 = *pState->var_pf_q4;//pState->q_values_after_init_code[3];//0.0f; + *pState->m_shape[i].var_pf_q5 = *pState->var_pf_q5;//pState->q_values_after_init_code[4];//0.0f; + *pState->m_shape[i].var_pf_q6 = *pState->var_pf_q6;//pState->q_values_after_init_code[5];//0.0f; + *pState->m_shape[i].var_pf_q7 = *pState->var_pf_q7;//pState->q_values_after_init_code[6];//0.0f; + *pState->m_shape[i].var_pf_q8 = *pState->var_pf_q8;//pState->q_values_after_init_code[7];//0.0f; + *pState->m_shape[i].var_pf_t1 = pState->m_shape[i].t_values_after_init_code[0];//0.0f; + *pState->m_shape[i].var_pf_t2 = pState->m_shape[i].t_values_after_init_code[1];//0.0f; + *pState->m_shape[i].var_pf_t3 = pState->m_shape[i].t_values_after_init_code[2];//0.0f; + *pState->m_shape[i].var_pf_t4 = pState->m_shape[i].t_values_after_init_code[3];//0.0f; + *pState->m_shape[i].var_pf_t5 = pState->m_shape[i].t_values_after_init_code[4];//0.0f; + *pState->m_shape[i].var_pf_t6 = pState->m_shape[i].t_values_after_init_code[5];//0.0f; + *pState->m_shape[i].var_pf_t7 = pState->m_shape[i].t_values_after_init_code[6];//0.0f; + *pState->m_shape[i].var_pf_t8 = pState->m_shape[i].t_values_after_init_code[7];//0.0f; + *pState->m_shape[i].var_pf_x = pState->m_shape[i].x; + *pState->m_shape[i].var_pf_y = pState->m_shape[i].y; + *pState->m_shape[i].var_pf_rad = pState->m_shape[i].rad; + *pState->m_shape[i].var_pf_ang = pState->m_shape[i].ang; + *pState->m_shape[i].var_pf_tex_zoom = pState->m_shape[i].tex_zoom; + *pState->m_shape[i].var_pf_tex_ang = pState->m_shape[i].tex_ang; + *pState->m_shape[i].var_pf_sides = pState->m_shape[i].sides; + *pState->m_shape[i].var_pf_additive = pState->m_shape[i].additive; + *pState->m_shape[i].var_pf_textured = pState->m_shape[i].textured; + *pState->m_shape[i].var_pf_thick = pState->m_shape[i].thickOutline; + *pState->m_shape[i].var_pf_r = pState->m_shape[i].r; + *pState->m_shape[i].var_pf_g = pState->m_shape[i].g; + *pState->m_shape[i].var_pf_b = pState->m_shape[i].b; + *pState->m_shape[i].var_pf_a = pState->m_shape[i].a; + *pState->m_shape[i].var_pf_r2 = pState->m_shape[i].r2; + *pState->m_shape[i].var_pf_g2 = pState->m_shape[i].g2; + *pState->m_shape[i].var_pf_b2 = pState->m_shape[i].b2; + *pState->m_shape[i].var_pf_a2 = pState->m_shape[i].a2; + *pState->m_shape[i].var_pf_border_r = pState->m_shape[i].border_r; + *pState->m_shape[i].var_pf_border_g = pState->m_shape[i].border_g; + *pState->m_shape[i].var_pf_border_b = pState->m_shape[i].border_b; + *pState->m_shape[i].var_pf_border_a = pState->m_shape[i].border_a; +} + +void CPlugin::LoadCustomWavePerFrameEvallibVars(CState* pState, int i) +{ + *pState->m_wave[i].var_pf_time = (double)(GetTime() - m_fStartTime); + *pState->m_wave[i].var_pf_frame = (double)GetFrame(); + *pState->m_wave[i].var_pf_fps = (double)GetFps(); + *pState->m_wave[i].var_pf_progress = (GetTime() - m_fPresetStartTime) / (m_fNextPresetTime - m_fPresetStartTime); + *pState->m_wave[i].var_pf_bass = (double)mysound.imm_rel[0]; + *pState->m_wave[i].var_pf_mid = (double)mysound.imm_rel[1]; + *pState->m_wave[i].var_pf_treb = (double)mysound.imm_rel[2]; + *pState->m_wave[i].var_pf_bass_att = (double)mysound.avg_rel[0]; + *pState->m_wave[i].var_pf_mid_att = (double)mysound.avg_rel[1]; + *pState->m_wave[i].var_pf_treb_att = (double)mysound.avg_rel[2]; + *pState->m_wave[i].var_pf_q1 = *pState->var_pf_q1;//pState->q_values_after_init_code[0];//0.0f; + *pState->m_wave[i].var_pf_q2 = *pState->var_pf_q2;//pState->q_values_after_init_code[1];//0.0f; + *pState->m_wave[i].var_pf_q3 = *pState->var_pf_q3;//pState->q_values_after_init_code[2];//0.0f; + *pState->m_wave[i].var_pf_q4 = *pState->var_pf_q4;//pState->q_values_after_init_code[3];//0.0f; + *pState->m_wave[i].var_pf_q5 = *pState->var_pf_q5;//pState->q_values_after_init_code[4];//0.0f; + *pState->m_wave[i].var_pf_q6 = *pState->var_pf_q6;//pState->q_values_after_init_code[5];//0.0f; + *pState->m_wave[i].var_pf_q7 = *pState->var_pf_q7;//pState->q_values_after_init_code[6];//0.0f; + *pState->m_wave[i].var_pf_q8 = *pState->var_pf_q8;//pState->q_values_after_init_code[7];//0.0f; + *pState->m_wave[i].var_pf_t1 = pState->m_wave[i].t_values_after_init_code[0];//0.0f; + *pState->m_wave[i].var_pf_t2 = pState->m_wave[i].t_values_after_init_code[1];//0.0f; + *pState->m_wave[i].var_pf_t3 = pState->m_wave[i].t_values_after_init_code[2];//0.0f; + *pState->m_wave[i].var_pf_t4 = pState->m_wave[i].t_values_after_init_code[3];//0.0f; + *pState->m_wave[i].var_pf_t5 = pState->m_wave[i].t_values_after_init_code[4];//0.0f; + *pState->m_wave[i].var_pf_t6 = pState->m_wave[i].t_values_after_init_code[5];//0.0f; + *pState->m_wave[i].var_pf_t7 = pState->m_wave[i].t_values_after_init_code[6];//0.0f; + *pState->m_wave[i].var_pf_t8 = pState->m_wave[i].t_values_after_init_code[7];//0.0f; + *pState->m_wave[i].var_pf_r = pState->m_wave[i].r; + *pState->m_wave[i].var_pf_g = pState->m_wave[i].g; + *pState->m_wave[i].var_pf_b = pState->m_wave[i].b; + *pState->m_wave[i].var_pf_a = pState->m_wave[i].a; +} + +void CPlugin::DrawCustomWaves() +{ + LPDIRECT3DDEVICE9 lpDevice = GetDevice(); + if (!lpDevice) + return; + + lpDevice->SetTexture(0, NULL); + lpDevice->SetFVF( WFVERTEX_FORMAT ); + + // note: read in all sound data from CPluginShell's m_sound + int num_reps = (m_pState->m_bBlending) ? 2 : 1; + for (int rep=0; repm_fBlendProgress : (1-m_pState->m_fBlendProgress); + + for (int i=0; im_wave[i].enabled) + { + int nSamples = pState->m_wave[i].samples; + int max_samples = pState->m_wave[i].bSpectrum ? 512 : NUM_WAVEFORM_SAMPLES; + if (nSamples > max_samples) + nSamples = max_samples; + nSamples -= pState->m_wave[i].sep; + + if ((nSamples >= 2) || (pState->m_wave[i].bUseDots && nSamples >= 1)) + { + int j; + float tempdata[2][512]; + float mult = ((pState->m_wave[i].bSpectrum) ? 0.15f : 0.004f) * pState->m_wave[i].scaling * pState->m_fWaveScale.eval(-1); + float *pdata1 = (pState->m_wave[i].bSpectrum) ? m_sound.fSpectrum[0] : m_sound.fWaveform[0]; + float *pdata2 = (pState->m_wave[i].bSpectrum) ? m_sound.fSpectrum[1] : m_sound.fWaveform[1]; + + // initialize tempdata[2][512] + int j0 = (pState->m_wave[i].bSpectrum) ? 0 : (max_samples - nSamples)/2/**(1-pState->m_wave[i].bSpectrum)*/ - pState->m_wave[i].sep/2; + int j1 = (pState->m_wave[i].bSpectrum) ? 0 : (max_samples - nSamples)/2/**(1-pState->m_wave[i].bSpectrum)*/ + pState->m_wave[i].sep/2; + float t = (pState->m_wave[i].bSpectrum) ? (max_samples - pState->m_wave[i].sep)/(float)nSamples : 1; + float mix1 = powf(pState->m_wave[i].smoothing*0.98f, 0.5f); // lower exponent -> more default smoothing + float mix2 = 1-mix1; + // SMOOTHING: + tempdata[0][0] = pdata1[j0]; + tempdata[1][0] = pdata2[j1]; + for (j=1; j=0; j--) + { + tempdata[0][j] = tempdata[0][j]*mix2 + tempdata[0][j+1]*mix1; + tempdata[1][j] = tempdata[1][j]*mix2 + tempdata[1][j+1]*mix1; + } + // finally, scale to final size: + for (j=0; jm_wave[i].var_pp_time = *pState->m_wave[i].var_pf_time; + *pState->m_wave[i].var_pp_fps = *pState->m_wave[i].var_pf_fps; + *pState->m_wave[i].var_pp_frame = *pState->m_wave[i].var_pf_frame; + *pState->m_wave[i].var_pp_progress = *pState->m_wave[i].var_pf_progress; + *pState->m_wave[i].var_pp_bass = *pState->m_wave[i].var_pf_bass; + *pState->m_wave[i].var_pp_mid = *pState->m_wave[i].var_pf_mid; + *pState->m_wave[i].var_pp_treb = *pState->m_wave[i].var_pf_treb; + *pState->m_wave[i].var_pp_bass_att = *pState->m_wave[i].var_pf_bass_att; + *pState->m_wave[i].var_pp_mid_att = *pState->m_wave[i].var_pf_mid_att; + *pState->m_wave[i].var_pp_treb_att = *pState->m_wave[i].var_pf_treb_att; + + executeCode(pState->m_wave[i].m_pf_codehandle); + + *pState->m_wave[i].var_pp_q1 = *pState->m_wave[i].var_pf_q1; + *pState->m_wave[i].var_pp_q2 = *pState->m_wave[i].var_pf_q2; + *pState->m_wave[i].var_pp_q3 = *pState->m_wave[i].var_pf_q3; + *pState->m_wave[i].var_pp_q4 = *pState->m_wave[i].var_pf_q4; + *pState->m_wave[i].var_pp_q5 = *pState->m_wave[i].var_pf_q5; + *pState->m_wave[i].var_pp_q6 = *pState->m_wave[i].var_pf_q6; + *pState->m_wave[i].var_pp_q7 = *pState->m_wave[i].var_pf_q7; + *pState->m_wave[i].var_pp_q8 = *pState->m_wave[i].var_pf_q8; + *pState->m_wave[i].var_pp_t1 = *pState->m_wave[i].var_pf_t1; + *pState->m_wave[i].var_pp_t2 = *pState->m_wave[i].var_pf_t2; + *pState->m_wave[i].var_pp_t3 = *pState->m_wave[i].var_pf_t3; + *pState->m_wave[i].var_pp_t4 = *pState->m_wave[i].var_pf_t4; + *pState->m_wave[i].var_pp_t5 = *pState->m_wave[i].var_pf_t5; + *pState->m_wave[i].var_pp_t6 = *pState->m_wave[i].var_pf_t6; + *pState->m_wave[i].var_pp_t7 = *pState->m_wave[i].var_pf_t7; + *pState->m_wave[i].var_pp_t8 = *pState->m_wave[i].var_pf_t8; + + // 2. for each point, execute per-point code + + #ifndef _NO_EXPR_ + resetVars(pState->m_wave[i].m_pp_vars); + #endif + + // to do: + // -add any of the m_wave[i].xxx menu-accessible vars to the code? + WFVERTEX v[512]; + float j_mult = 1.0f/(float)(nSamples-1); + for (j=0; jm_wave[i].var_pp_sample = t; + *pState->m_wave[i].var_pp_value1 = value1; + *pState->m_wave[i].var_pp_value2 = value2; + *pState->m_wave[i].var_pp_x = 0.5f + value1; + *pState->m_wave[i].var_pp_y = 0.5f + value2; + *pState->m_wave[i].var_pp_r = *pState->m_wave[i].var_pf_r; + *pState->m_wave[i].var_pp_g = *pState->m_wave[i].var_pf_g; + *pState->m_wave[i].var_pp_b = *pState->m_wave[i].var_pf_b; + *pState->m_wave[i].var_pp_a = *pState->m_wave[i].var_pf_a; + + #ifndef _NO_EXPR_ + executeCode(pState->m_wave[i].m_pp_codehandle); + #endif + + v[j].x = (float)(*pState->m_wave[i].var_pp_x* 2-1);//*ASPECT; + v[j].y = (float)(*pState->m_wave[i].var_pp_y*-2+1); + v[j].z = 0; + v[j].Diffuse = + ((((int)(*pState->m_wave[i].var_pp_a * 255 * alpha_mult)) & 0xFF) << 24) | + ((((int)(*pState->m_wave[i].var_pp_r * 255)) & 0xFF) << 16) | + ((((int)(*pState->m_wave[i].var_pp_g * 255)) & 0xFF) << 8) | + ((((int)(*pState->m_wave[i].var_pp_b * 255)) & 0xFF) ); + } + + #ifndef _NO_EXPR_ + resetVars(NULL); + #endif + + // save changes to t1-t8 this frame + /* + pState->m_wave[i].t_values_after_init_code[0] = *pState->m_wave[i].var_pp_t1; + pState->m_wave[i].t_values_after_init_code[1] = *pState->m_wave[i].var_pp_t2; + pState->m_wave[i].t_values_after_init_code[2] = *pState->m_wave[i].var_pp_t3; + pState->m_wave[i].t_values_after_init_code[3] = *pState->m_wave[i].var_pp_t4; + pState->m_wave[i].t_values_after_init_code[4] = *pState->m_wave[i].var_pp_t5; + pState->m_wave[i].t_values_after_init_code[5] = *pState->m_wave[i].var_pp_t6; + pState->m_wave[i].t_values_after_init_code[6] = *pState->m_wave[i].var_pp_t7; + pState->m_wave[i].t_values_after_init_code[7] = *pState->m_wave[i].var_pp_t8; + */ + + // 3. draw it + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, pState->m_wave[i].bAdditive ? D3DBLEND_ONE : D3DBLEND_INVSRCALPHA); + + float ptsize = ((m_nTexSize >= 1024) ? 2.0f : 1.0f) + (pState->m_wave[i].bDrawThick ? 1.0f : 0.0f); + if (pState->m_wave[i].bUseDots) + lpDevice->SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&ptsize) ); + + int its = (pState->m_wave[i].bDrawThick && !pState->m_wave[i].bUseDots) ? 4 : 1; + float x_inc = 2.0f / (float)m_nTexSize; + for (int it=0; itDrawPrimitiveUP(pState->m_wave[i].bUseDots ? D3DPT_POINTLIST : D3DPT_LINESTRIP, nSamples - (pState->m_wave[i].bUseDots ? 0 : 1), (void*)v, sizeof(WFVERTEX)); + } + + ptsize = 1.0f; + if (pState->m_wave[i].bUseDots) + lpDevice->SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&ptsize) ); + } + } + } + } + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); +} + +void CPlugin::DrawWave(float *fL, float *fR) +{ + //return; + + LPDIRECT3DDEVICE9 lpDevice = GetDevice(); + if (!lpDevice) + return; + + lpDevice->SetTexture(0, NULL); + lpDevice->SetFVF( WFVERTEX_FORMAT ); + + int i; + WFVERTEX v1[576+1], v2[576+1]; + + /* + m_lpD3DDev->lpDevice->SetRenderState(D3DRENDERSTATE_SHADEMODE, D3DSHADE_GOURAUD); //D3DSHADE_FLAT + m_lpD3DDev->lpDevice->SetRenderState(D3DRENDERSTATE_SPECULARENABLE, FALSE); + m_lpD3DDev->lpDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE); + if (m_D3DDevDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_DITHER) + m_lpD3DDev->lpDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, TRUE); + m_lpD3DDev->lpDevice->SetRenderState(D3DRENDERSTATE_ZENABLE, D3DZB_FALSE); + m_lpD3DDev->lpDevice->SetRenderState(D3DRENDERSTATE_LIGHTING, FALSE); + m_lpD3DDev->lpDevice->SetRenderState(D3DRENDERSTATE_COLORVERTEX, TRUE); + m_lpD3DDev->lpDevice->SetRenderState(D3DRENDERSTATE_FILLMODE, D3DFILL_WIREFRAME); // vs. SOLID + m_lpD3DDev->lpDevice->SetRenderState(D3DRENDERSTATE_AMBIENT, D3DCOLOR_RGBA_01(1,1,1,1)); + + hr = m_lpD3DDev->SetTexture(0, NULL); + if (hr != D3D_OK) + { + //dumpmsg("Draw(): ERROR: SetTexture"); + //IdentifyD3DError(hr); + } + */ + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, (*m_pState->var_pf_wave_additive) ? D3DBLEND_ONE : D3DBLEND_INVSRCALPHA); + + //float cr = m_pState->m_waveR.eval(GetTime()); + //float cg = m_pState->m_waveG.eval(GetTime()); + //float cb = m_pState->m_waveB.eval(GetTime()); + float cr = (float)(*m_pState->var_pf_wave_r); + float cg = (float)(*m_pState->var_pf_wave_g); + float cb = (float)(*m_pState->var_pf_wave_b); + float cx = (float)(*m_pState->var_pf_wave_x); + float cy = (float)(*m_pState->var_pf_wave_y); // note: it was backwards (top==1) in the original milkdrop, so we keep it that way! + float fWaveParam = (float)(*m_pState->var_pf_wave_mystery); + + /*if (m_pState->m_bBlending) + { + cr = cr*(m_pState->m_fBlendProgress) + (1.0f-m_pState->m_fBlendProgress)*((float)(*m_pOldState->var_pf_wave_r)); + cg = cg*(m_pState->m_fBlendProgress) + (1.0f-m_pState->m_fBlendProgress)*((float)(*m_pOldState->var_pf_wave_g)); + cb = cb*(m_pState->m_fBlendProgress) + (1.0f-m_pState->m_fBlendProgress)*((float)(*m_pOldState->var_pf_wave_b)); + cx = cx*(m_pState->m_fBlendProgress) + (1.0f-m_pState->m_fBlendProgress)*((float)(*m_pOldState->var_pf_wave_x)); + cy = cy*(m_pState->m_fBlendProgress) + (1.0f-m_pState->m_fBlendProgress)*((float)(*m_pOldState->var_pf_wave_y)); + fWaveParam = fWaveParam*(m_pState->m_fBlendProgress) + (1.0f-m_pState->m_fBlendProgress)*((float)(*m_pOldState->var_pf_wave_mystery)); + }*/ + + if (cr < 0) cr = 0; + if (cg < 0) cg = 0; + if (cb < 0) cb = 0; + if (cr > 1) cr = 1; + if (cg > 1) cg = 1; + if (cb > 1) cb = 1; + + // maximize color: + if (*m_pState->var_pf_wave_brighten) + { + float fMaximizeWaveColorAmount = 1.0f; + float max = cr; + if (max < cg) max = cg; + if (max < cb) max = cb; + if (max > 0.01f) + { + cr = cr/max*fMaximizeWaveColorAmount + cr*(1.0f - fMaximizeWaveColorAmount); + cg = cg/max*fMaximizeWaveColorAmount + cg*(1.0f - fMaximizeWaveColorAmount); + cb = cb/max*fMaximizeWaveColorAmount + cb*(1.0f - fMaximizeWaveColorAmount); + } + } + + float fWavePosX = cx*2.0f - 1.0f; // go from 0..1 user-range to -1..1 D3D range + float fWavePosY = cy*2.0f - 1.0f; + + float bass_rel = mysound.imm[0]; + float mid_rel = mysound.imm[1]; + float treble_rel = mysound.imm[2]; + + int sample_offset = 0; + int new_wavemode = (int)(*m_pState->var_pf_wave_mode) % NUM_WAVES; // since it can be changed from per-frame code! + + int its = (m_pState->m_bBlending && (new_wavemode != m_pState->m_nOldWaveMode)) ? 2 : 1; + int nVerts1 = 0; + int nVerts2 = 0; + int nBreak1 = -1; + int nBreak2 = -1; + float alpha1, alpha2; + + for (int it=0; itm_nOldWaveMode; + int nVerts = NUM_WAVEFORM_SAMPLES; // allowed to peek ahead 64 (i.e. left is [i], right is [i+64]) + int nBreak = -1; + + WFVERTEX *v = (it==0) ? v1 : v2; + ZeroMemory(v, sizeof(WFVERTEX)*nVerts); + + float alpha = (float)(*m_pState->var_pf_wave_a);//m_pState->m_fWaveAlpha.eval(GetTime()); + + switch(wave) + { + case 0: + // circular wave + + nVerts /= 2; + sample_offset = (NUM_WAVEFORM_SAMPLES-nVerts)/2;//mysound.GoGoAlignatron(nVerts * 12/10); // only call this once nVerts is final! + + if (m_pState->m_bModWaveAlphaByVolume) + alpha *= ((mysound.imm_rel[0] + mysound.imm_rel[1] + mysound.imm_rel[2])*0.333f - m_pState->m_fModWaveAlphaStart.eval(GetTime()))/(m_pState->m_fModWaveAlphaEnd.eval(GetTime()) - m_pState->m_fModWaveAlphaStart.eval(GetTime())); + if (alpha < 0) alpha = 0; + if (alpha > 1) alpha = 1; + //color = D3DCOLOR_RGBA_01(cr, cg, cb, alpha); + + { + float inv_nverts_minus_one = 1.0f/(float)(nVerts-1); + + for (i=0; im_bBlending) + { + nVerts++; + memcpy(&v[nVerts-1], &v[0], sizeof(WFVERTEX)); + } + + break; + + case 1: + // x-y osc. that goes around in a spiral, in time + + alpha *= 1.25f; + if (m_pState->m_bModWaveAlphaByVolume) + alpha *= ((mysound.imm_rel[0] + mysound.imm_rel[1] + mysound.imm_rel[2])*0.333f - m_pState->m_fModWaveAlphaStart.eval(GetTime()))/(m_pState->m_fModWaveAlphaEnd.eval(GetTime()) - m_pState->m_fModWaveAlphaStart.eval(GetTime())); + if (alpha < 0) alpha = 0; + if (alpha > 1) alpha = 1; + //color = D3DCOLOR_RGBA_01(cr, cg, cb, alpha); + + nVerts /= 2; + + for (i=0; im_bModWaveAlphaByVolume) + alpha *= ((mysound.imm_rel[0] + mysound.imm_rel[1] + mysound.imm_rel[2])*0.333f - m_pState->m_fModWaveAlphaStart.eval(GetTime()))/(m_pState->m_fModWaveAlphaEnd.eval(GetTime()) - m_pState->m_fModWaveAlphaStart.eval(GetTime())); + if (alpha < 0) alpha = 0; + if (alpha > 1) alpha = 1; + //color = D3DCOLOR_RGBA_01(cr, cg, cb, alpha); + + for (i=0; im_bModWaveAlphaByVolume) + alpha *= ((mysound.imm_rel[0] + mysound.imm_rel[1] + mysound.imm_rel[2])*0.333f - m_pState->m_fModWaveAlphaStart.eval(GetTime()))/(m_pState->m_fModWaveAlphaEnd.eval(GetTime()) - m_pState->m_fModWaveAlphaStart.eval(GetTime())); + if (alpha < 0) alpha = 0; + if (alpha > 1) alpha = 1; + //color = D3DCOLOR_RGBA_01(cr, cg, cb, alpha); + + for (i=0; i m_nTexSize/3) + nVerts = m_nTexSize/3; + + sample_offset = (NUM_WAVEFORM_SAMPLES-nVerts)/2;//mysound.GoGoAlignatron(nVerts + 25); // only call this once nVerts is final! + + /* + if (treble_rel > treb_thresh_for_wave6) + { + //alpha = 1.0f; + treb_thresh_for_wave6 = treble_rel * 1.025f; + } + else + { + alpha *= 0.2f; + treb_thresh_for_wave6 *= 0.996f; // fixme: make this fps-independent + } + */ + + if (m_pState->m_bModWaveAlphaByVolume) + alpha *= ((mysound.imm_rel[0] + mysound.imm_rel[1] + mysound.imm_rel[2])*0.333f - m_pState->m_fModWaveAlphaStart.eval(GetTime()))/(m_pState->m_fModWaveAlphaEnd.eval(GetTime()) - m_pState->m_fModWaveAlphaStart.eval(GetTime())); + if (alpha < 0) alpha = 0; + if (alpha > 1) alpha = 1; + //color = D3DCOLOR_RGBA_01(cr, cg, cb, alpha); + + { + float w1 = 0.45f + 0.5f*(fWaveParam*0.5f + 0.5f); // 0.1 - 0.9 + float w2 = 1.0f - w1; + + float inv_nverts = 1.0f/(float)(nVerts); + + for (i=0; i1) + { + v[i].x = v[i].x*w2 + w1*(v[i-1].x*2.0f - v[i-2].x); + v[i].y = v[i].y*w2 + w1*(v[i-1].y*2.0f - v[i-2].y); + } + } + + /* + // center on Y + float avg_y = 0; + for (i=0; im_bModWaveAlphaByVolume) + alpha *= ((mysound.imm_rel[0] + mysound.imm_rel[1] + mysound.imm_rel[2])*0.333f - m_pState->m_fModWaveAlphaStart.eval(GetTime()))/(m_pState->m_fModWaveAlphaEnd.eval(GetTime()) - m_pState->m_fModWaveAlphaStart.eval(GetTime())); + if (alpha < 0) alpha = 0; + if (alpha > 1) alpha = 1; + //color = D3DCOLOR_RGBA_01(cr, cg, cb, alpha); + + { + float cos_rot = cosf(GetTime()*0.3f); + float sin_rot = sinf(GetTime()*0.3f); + + for (i=0; i m_nTexSize/3) + nVerts = m_nTexSize/3; + + if (wave==8) + nVerts = 256; + else + sample_offset = (NUM_WAVEFORM_SAMPLES-nVerts)/2;//mysound.GoGoAlignatron(nVerts); // only call this once nVerts is final! + + if (m_pState->m_bModWaveAlphaByVolume) + alpha *= ((mysound.imm_rel[0] + mysound.imm_rel[1] + mysound.imm_rel[2])*0.333f - m_pState->m_fModWaveAlphaStart.eval(GetTime()))/(m_pState->m_fModWaveAlphaEnd.eval(GetTime()) - m_pState->m_fModWaveAlphaStart.eval(GetTime())); + if (alpha < 0) alpha = 0; + if (alpha > 1) alpha = 1; + //color = D3DCOLOR_RGBA_01(cr, cg, cb, alpha); + + { + float ang = 1.57f*fWaveParam; // from -PI/2 to PI/2 + float dx = cosf(ang); + float dy = sinf(ang); + + float edge_x[2], edge_y[2]; + + //edge_x[0] = fWavePosX - dx*3.0f; + //edge_y[0] = fWavePosY - dy*3.0f; + //edge_x[1] = fWavePosX + dx*3.0f; + //edge_y[1] = fWavePosY + dy*3.0f; + edge_x[0] = fWavePosX*cosf(ang + 1.57f) - dx*3.0f; + edge_y[0] = fWavePosX*sinf(ang + 1.57f) - dy*3.0f; + edge_x[1] = fWavePosX*cosf(ang + 1.57f) + dx*3.0f; + edge_y[1] = fWavePosX*sinf(ang + 1.57f) + dy*3.0f; + + + for (i=0; i<2; i++) // for each point defining the line + { + // clip the point against 4 edges of screen + // be a bit lenient (use +/-1.1 instead of +/-1.0) + // so the dual-wave doesn't end too soon, after the channels are moved apart + for (int j=0; j<4; j++) + { + float t; + bool bClip = false; + + switch(j) + { + case 0: + if (edge_x[i] > 1.1f) + { + t = (1.1f - edge_x[1-i]) / (edge_x[i] - edge_x[1-i]); + bClip = true; + } + break; + case 1: + if (edge_x[i] < -1.1f) + { + t = (-1.1f - edge_x[1-i]) / (edge_x[i] - edge_x[1-i]); + bClip = true; + } + break; + case 2: + if (edge_y[i] > 1.1f) + { + t = (1.1f - edge_y[1-i]) / (edge_y[i] - edge_y[1-i]); + bClip = true; + } + break; + case 3: + if (edge_y[i] < -1.1f) + { + t = (-1.1f - edge_y[1-i]) / (edge_y[i] - edge_y[1-i]); + bClip = true; + } + break; + } + + if (bClip) + { + float dx = edge_x[i] - edge_x[1-i]; + float dy = edge_y[i] - edge_y[1-i]; + edge_x[i] = edge_x[1-i] + dx*t; + edge_y[i] = edge_y[1-i] + dy*t; + } + } + } + + dx = (edge_x[1] - edge_x[0]) / (float)nVerts; + dy = (edge_y[1] - edge_y[0]) / (float)nVerts; + float ang2 = atan2f(dy,dx); + float perp_dx = cosf(ang2 + 1.57f); + float perp_dy = sinf(ang2 + 1.57f); + + if (wave == 6) + for (i=0; ivar_pf_wave_usedots) ? D3DPT_POINTLIST : D3DPT_LINESTRIP; + //m_lpD3DDev->DrawPrimitive(primtype, D3DFVF_LVERTEX, (LPVOID)v, nVerts, NULL); + + for (i=0; im_fBlendProgress); + float mix2 = 1.0f - mix; + + // blend 2 waveforms + if (nVerts2 > 0) + { + // note: this won't yet handle the case where (nBreak1 > 0 && nBreak2 > 0) + // in this case, code must break wave into THREE segments + float m = (nVerts2-1)/(float)nVerts1; + float x,y; + for (int i=0; i 0) + { + alpha1 = alpha1*(mix) + alpha2*(1.0f-mix); + } + + // apply color & alpha + // ALSO reverse all y values, to stay consistent with the pre-VMS milkdrop, + // which DIDN'T: + v1[0].Diffuse = D3DCOLOR_RGBA_01(cr, cg, cb, alpha1); + for (i=0; ivar_pf_wave_usedots) ? D3DPT_POINTLIST : D3DPT_LINESTRIP; + float x_inc = 2.0f / (float)m_nTexSize; + int drawing_its = ((*m_pState->var_pf_wave_thick || *m_pState->var_pf_wave_usedots) && (m_nTexSize >= 512)) ? 4 : 1; + + for (int it=0; itDrawPrimitive(primtype, D3DFVF_LVERTEX, (LPVOID)v1, nVerts1, NULL); + if (*m_pState->var_pf_wave_usedots) + lpDevice->DrawPrimitiveUP(D3DPT_POINTLIST, nVerts1, (void*)v1, sizeof(WFVERTEX)); + else + lpDevice->DrawPrimitiveUP(D3DPT_LINESTRIP, nVerts1-1, (void*)v1, sizeof(WFVERTEX)); + } + else + { + //m_lpD3DDev->DrawPrimitive(primtype, D3DFVF_LVERTEX, (LPVOID)v1, nBreak1, NULL); + //m_lpD3DDev->DrawPrimitive(primtype, D3DFVF_LVERTEX, (LPVOID)&v1[nBreak1], nVerts1-nBreak1, NULL); + if (*m_pState->var_pf_wave_usedots) + { + lpDevice->DrawPrimitiveUP(D3DPT_POINTLIST, nBreak1, (void*)v1, sizeof(WFVERTEX)); + lpDevice->DrawPrimitiveUP(D3DPT_POINTLIST, nVerts1-nBreak1, (void*)&v1[nBreak1], sizeof(WFVERTEX)); + } + else + { + lpDevice->DrawPrimitiveUP(D3DPT_LINESTRIP, nBreak1-1, (void*)v1, sizeof(WFVERTEX)); + lpDevice->DrawPrimitiveUP(D3DPT_LINESTRIP, nVerts1-nBreak1-1, (void*)&v1[nBreak1], sizeof(WFVERTEX)); + } + } + } + } + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); +} + + + +void CPlugin::DrawSprites() +{ + LPDIRECT3DDEVICE9 lpDevice = GetDevice(); + if (!lpDevice) + return; + + lpDevice->SetTexture(0, NULL); + lpDevice->SetFVF( WFVERTEX_FORMAT ); + + if (*m_pState->var_pf_darken_center) + { + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);//SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + + WFVERTEX v3[6]; + ZeroMemory(v3, sizeof(WFVERTEX)*6); + + // colors: + v3[0].Diffuse = D3DCOLOR_RGBA_01(0, 0, 0, 3.0f/32.0f); + v3[1].Diffuse = D3DCOLOR_RGBA_01(0, 0, 0, 0.0f/32.0f); + v3[2].Diffuse = v3[1].Diffuse; + v3[3].Diffuse = v3[1].Diffuse; + v3[4].Diffuse = v3[1].Diffuse; + v3[5].Diffuse = v3[1].Diffuse; + + // positioning: + float fHalfSize = 0.05f; + v3[0].x = 0.0f; + v3[1].x = 0.0f - fHalfSize*ASPECT; + v3[2].x = 0.0f; + v3[3].x = 0.0f + fHalfSize*ASPECT; + v3[4].x = 0.0f; + v3[5].x = v3[1].x; + v3[0].y = 0.0f; + v3[1].y = 0.0f; + v3[2].y = 0.0f - fHalfSize; + v3[3].y = 0.0f; + v3[4].y = 0.0f + fHalfSize; + v3[5].y = v3[1].y; + //v3[0].tu = 0; v3[1].tu = 1; v3[2].tu = 0; v3[3].tu = 1; + //v3[0].tv = 1; v3[1].tv = 1; v3[2].tv = 0; v3[3].tv = 0; + + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 4, (LPVOID)v3, sizeof(WFVERTEX)); + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + } + + + // do borders + { + float fOuterBorderSize = (float)*m_pState->var_pf_ob_size; + float fInnerBorderSize = (float)*m_pState->var_pf_ib_size; + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + + for (int it=0; it<2; it++) + { + WFVERTEX v3[4]; + ZeroMemory(v3, sizeof(WFVERTEX)*4); + + // colors: + float r = (it==0) ? (float)*m_pState->var_pf_ob_r : (float)*m_pState->var_pf_ib_r; + float g = (it==0) ? (float)*m_pState->var_pf_ob_g : (float)*m_pState->var_pf_ib_g; + float b = (it==0) ? (float)*m_pState->var_pf_ob_b : (float)*m_pState->var_pf_ib_b; + float a = (it==0) ? (float)*m_pState->var_pf_ob_a : (float)*m_pState->var_pf_ib_a; + if (a > 0.001f) + { + v3[0].Diffuse = D3DCOLOR_RGBA_01(r,g,b,a); + v3[1].Diffuse = v3[0].Diffuse; + v3[2].Diffuse = v3[0].Diffuse; + v3[3].Diffuse = v3[0].Diffuse; + + // positioning: + float fInnerRad = (it==0) ? 1.0f - fOuterBorderSize : 1.0f - fOuterBorderSize - fInnerBorderSize; + float fOuterRad = (it==0) ? 1.0f : 1.0f - fOuterBorderSize; + v3[0].x = fInnerRad; + v3[1].x = fOuterRad; + v3[2].x = fOuterRad; + v3[3].x = fInnerRad; + v3[0].y = fInnerRad; + v3[1].y = fOuterRad; + v3[2].y = -fOuterRad; + v3[3].y = -fInnerRad; + + for (int rot=0; rot<4; rot++) + { + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, (LPVOID)v3, sizeof(WFVERTEX)); + + // rotate by 90 degrees + for (int v=0; v<4; v++) + { + float t = 1.570796327f; + float x = v3[v].x; + float y = v3[v].y; + v3[v].x = x*cosf(t) - y*sinf(t); + v3[v].y = x*sinf(t) + y*cosf(t); + } + } + } + } + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + } +} + +/* +bool CPlugin::SetMilkdropRenderTarget(LPDIRECTDRAWSURFACE7 lpSurf, int w, int h, char *szErrorMsg) +{ + HRESULT hr = m_lpD3DDev->SetRenderTarget(lpSurf, 0); + if (hr != D3D_OK) + { + //if (szErrorMsg && szErrorMsg[0]) dumpmsg(szErrorMsg); + //IdentifyD3DError(hr); + return false; + } + + //DDSURFACEDESC2 ddsd; + //ddsd.dwSize = sizeof(ddsd); + //lpSurf->GetSurfaceDesc(&ddsd); + + D3DVIEWPORT7 viewData; + ZeroMemory(&viewData, sizeof(D3DVIEWPORT7)); + viewData.dwWidth = w; // not: in windowed mode, when lpSurf is the back buffer, chances are good that w,h are smaller than the full surface size (since real size is fullscreen, but we're only using a portion of it as big as the window). + viewData.dwHeight = h; + hr = m_lpD3DDev->SetViewport(&viewData); + + return true; +} +*/ + +void CPlugin::DrawUserSprites() // from system memory, to back buffer. +{ +#if 0 + + LPDIRECT3DDEVICE8 lpDevice = GetDevice(); + if (!lpDevice) + return; + + lpDevice->SetTexture(0, NULL); + lpDevice->SetVertexShader( SPRITEVERTEX_FORMAT ); + + lpDevice->SetRenderState(D3DRS_WRAP0, 0); + SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); + SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); + SetTextureStageState(0, D3DTSS_ADDRESSW, D3DTADDRESS_WRAP); + + // reset these to the standard safe mode: + SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); + SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE); + SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); + SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + + /* + lpDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); //D3DSHADE_GOURAUD + lpDevice->SetRenderState(D3DRS_SPECULARENABLE, FALSE); + lpDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + if (m_D3DDevDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_DITHER) + lpDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + lpDevice->SetRenderState(D3DRS_LIGHTING, FALSE); + lpDevice->SetRenderState(D3DRS_COLORVERTEX, TRUE); + lpDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); // vs. wireframe + lpDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_RGBA_01(1,1,1,1)); + SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTFG_LINEAR ); + SetTextureStageState(0, D3DTSS_MINFILTER, D3DTFN_LINEAR ); + SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTFP_LINEAR ); + */ + + for (int iSlot=0; iSlot < NUM_TEX; iSlot++) + { + if (m_texmgr.m_tex[iSlot].pSurface) + { + int k; + + // set values of input variables: + *(m_texmgr.m_tex[iSlot].var_time) = (double)(GetTime() - m_texmgr.m_tex[iSlot].fStartTime); + *(m_texmgr.m_tex[iSlot].var_frame) = (double)(GetFrame() - m_texmgr.m_tex[iSlot].nStartFrame); + *(m_texmgr.m_tex[iSlot].var_fps) = (double)GetFps(); + *(m_texmgr.m_tex[iSlot].var_progress) = (double)m_pState->m_fBlendProgress; + *(m_texmgr.m_tex[iSlot].var_bass) = (double)mysound.imm_rel[0]; + *(m_texmgr.m_tex[iSlot].var_mid) = (double)mysound.imm_rel[1]; + *(m_texmgr.m_tex[iSlot].var_treb) = (double)mysound.imm_rel[2]; + *(m_texmgr.m_tex[iSlot].var_bass_att) = (double)mysound.avg_rel[0]; + *(m_texmgr.m_tex[iSlot].var_mid_att) = (double)mysound.avg_rel[1]; + *(m_texmgr.m_tex[iSlot].var_treb_att) = (double)mysound.avg_rel[2]; + + // evaluate expressions + #ifndef _NO_EXPR_ + if (m_texmgr.m_tex[iSlot].m_codehandle) + { + resetVars(m_texmgr.m_tex[iSlot].m_vars); + executeCode(m_texmgr.m_tex[iSlot].m_codehandle); + resetVars(NULL); + } + #endif + + bool bKillSprite = (*m_texmgr.m_tex[iSlot].var_done != 0.0); + bool bBurnIn = (*m_texmgr.m_tex[iSlot].var_burn != 0.0); + + // Remember the original backbuffer and zbuffer + LPDIRECT3DSURFACE8 pBackBuffer, pZBuffer; + lpDevice->GetRenderTarget( &pBackBuffer ); + lpDevice->GetDepthStencilSurface( &pZBuffer ); + + if (/*bKillSprite &&*/ bBurnIn) + { + // set up to render [from NULL] to VS1 (for burn-in). + + lpDevice->SetTexture(0, NULL); + + IDirect3DSurface8* pNewTarget = NULL; + if (m_lpVS[1]->GetSurfaceLevel(0, &pNewTarget) != D3D_OK) + return; + lpDevice->SetRenderTarget(pNewTarget, NULL); + pNewTarget->Release(); + + lpDevice->SetTexture(0, NULL); + } + + // finally, use the results to draw the sprite. + if (lpDevice->SetTexture(0, m_texmgr.m_tex[iSlot].pSurface) != D3D_OK) + return; + + SPRITEVERTEX v3[4]; + ZeroMemory(v3, sizeof(SPRITEVERTEX)*4); + + /* + int dest_w, dest_h; + { + LPDIRECT3DSURFACE8 pRT; + lpDevice->GetRenderTarget( &pRT ); + + D3DSURFACE_DESC desc; + pRT->GetDesc(&desc); + dest_w = desc.Width; + dest_h = desc.Height; + pRT->Release(); + }*/ + + float x = min(1000.0f, max(-1000.0f, (float)(*m_texmgr.m_tex[iSlot].var_x) * 2.0f - 1.0f )); + float y = min(1000.0f, max(-1000.0f, (float)(*m_texmgr.m_tex[iSlot].var_y) * 2.0f - 1.0f )); + float sx = min(1000.0f, max(-1000.0f, (float)(*m_texmgr.m_tex[iSlot].var_sx) )); + float sy = min(1000.0f, max(-1000.0f, (float)(*m_texmgr.m_tex[iSlot].var_sy) )); + float rot = (float)(*m_texmgr.m_tex[iSlot].var_rot); + int flipx = (*m_texmgr.m_tex[iSlot].var_flipx == 0.0) ? 0 : 1; + int flipy = (*m_texmgr.m_tex[iSlot].var_flipy == 0.0) ? 0 : 1; + float repeatx = min(100.0f, max(0.01f, (float)(*m_texmgr.m_tex[iSlot].var_repeatx) )); + float repeaty = min(100.0f, max(0.01f, (float)(*m_texmgr.m_tex[iSlot].var_repeaty) )); + + int blendmode = min(4, max(0, ((int)(*m_texmgr.m_tex[iSlot].var_blendmode)))); + float r = min(1.0f, max(0.0f, ((float)(*m_texmgr.m_tex[iSlot].var_r)))); + float g = min(1.0f, max(0.0f, ((float)(*m_texmgr.m_tex[iSlot].var_g)))); + float b = min(1.0f, max(0.0f, ((float)(*m_texmgr.m_tex[iSlot].var_b)))); + float a = min(1.0f, max(0.0f, ((float)(*m_texmgr.m_tex[iSlot].var_a)))); + + // set x,y coords + v3[0+flipx].x = -sx; + v3[1-flipx].x = sx; + v3[2+flipx].x = -sx; + v3[3-flipx].x = sx; + v3[0+flipy*2].y = -sy; + v3[1+flipy*2].y = -sy; + v3[2-flipy*2].y = sy; + v3[3-flipy*2].y = sy; + + // first aspect ratio: adjust for non-1:1 images + { + float aspect = m_texmgr.m_tex[iSlot].img_h / (float)m_texmgr.m_tex[iSlot].img_w; + + if (aspect < 1) + for (k=0; k<4; k++) v3[k].y *= aspect; // wide image + else + for (k=0; k<4; k++) v3[k].x /= aspect; // tall image + } + + // 2D rotation + { + float cos_rot = cosf(rot); + float sin_rot = sinf(rot); + for (k=0; k<4; k++) + { + float x2 = v3[k].x*cos_rot - v3[k].y*sin_rot; + float y2 = v3[k].x*sin_rot + v3[k].y*cos_rot; + v3[k].x = x2; + v3[k].y = y2; + } + } + + // translation + for (k=0; k<4; k++) + { + v3[k].x += x; + v3[k].y += y; + } + + // second aspect ratio: normalize to width of screen + { + float aspect = GetWidth() / (float)(GetHeight()); + + if (aspect > 1) + for (k=0; k<4; k++) v3[k].y *= aspect; + else + for (k=0; k<4; k++) v3[k].x /= aspect; + } + + // third aspect ratio: adjust for burn-in + if (bKillSprite && bBurnIn) // final render-to-VS1 + { + float aspect = GetWidth()/(float)(GetHeight()*4.0f/3.0f); + if (aspect < 1.0f) + for (k=0; k<4; k++) v3[k].x *= aspect; + else + for (k=0; k<4; k++) v3[k].y /= aspect; + } + + // finally, flip 'y' for annoying DirectX + //for (k=0; k<4; k++) v3[k].y *= -1.0f; + + // set u,v coords + { + float dtu = 0.5f;// / (float)m_texmgr.m_tex[iSlot].tex_w; + float dtv = 0.5f;// / (float)m_texmgr.m_tex[iSlot].tex_h; + v3[0].tu = -dtu; + v3[1].tu = dtu;///*m_texmgr.m_tex[iSlot].img_w / (float)m_texmgr.m_tex[iSlot].tex_w*/ - dtu; + v3[2].tu = -dtu; + v3[3].tu = dtu;///*m_texmgr.m_tex[iSlot].img_w / (float)m_texmgr.m_tex[iSlot].tex_w*/ - dtu; + v3[0].tv = -dtv; + v3[1].tv = -dtv; + v3[2].tv = dtv;///*m_texmgr.m_tex[iSlot].img_h / (float)m_texmgr.m_tex[iSlot].tex_h*/ - dtv; + v3[3].tv = dtv;///*m_texmgr.m_tex[iSlot].img_h / (float)m_texmgr.m_tex[iSlot].tex_h*/ - dtv; + + // repeat on x,y + for (k=0; k<4; k++) + { + v3[k].tu = (v3[k].tu - 0.0f)*repeatx + 0.5f; + v3[k].tv = (v3[k].tv - 0.0f)*repeaty + 0.5f; + } + } + + // blendmodes src alpha: dest alpha: + // 0 blend r,g,b=modulate a=opacity SRCALPHA INVSRCALPHA + // 1 decal r,g,b=modulate a=modulate D3DBLEND_ONE D3DBLEND_ZERO + // 2 additive r,g,b=modulate a=modulate D3DBLEND_ONE D3DBLEND_ONE + // 3 srccolor r,g,b=no effect a=no effect SRCCOLOR INVSRCCOLOR + // 4 colorkey r,g,b=modulate a=no effect + switch(blendmode) + { + case 0: + default: + // alpha blend + + /* + Q. I am rendering with alpha blending and setting the alpha + of the diffuse vertex component to determine the opacity. + It works when there is no texture set, but as soon as I set + a texture the alpha that I set is no longer applied. Why? + + The problem originates in the texture blending stages, rather + than in the subsequent alpha blending. Alpha can come from + several possible sources. If this has not been specified, + then the alpha will be taken from the texture, if one is selected. + If no texture is selected, then the default will use the alpha + channel of the diffuse vertex component. + + Explicitly specifying the diffuse vertex component as the source + for alpha will insure that the alpha is drawn from the alpha value + you set, whether a texture is selected or not: + + pDevice->SetTextureStageState(D3DTSS_ALPHAOP,D3DTOP_SELECTARG1); + pDevice->SetTextureStageState(D3DTSS_ALPHAARG1,D3DTA_DIFFUSE); + + If you later need to use the texture alpha as the source, set + D3DTSS_ALPHAARG1 to D3DTA_TEXTURE. + */ + + SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + for (k=0; k<4; k++) v3[k].Diffuse = D3DCOLOR_RGBA_01(r,g,b,a); + break; + case 1: + // decal + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + //lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + //lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); + for (k=0; k<4; k++) v3[k].Diffuse = D3DCOLOR_RGBA_01(r*a,g*a,b*a,1); + break; + case 2: + // additive + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + for (k=0; k<4; k++) v3[k].Diffuse = D3DCOLOR_RGBA_01(r*a,g*a,b*a,1); + break; + case 3: + // srccolor + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR); + for (k=0; k<4; k++) v3[k].Diffuse = D3DCOLOR_RGBA_01(1,1,1,1); + break; + case 4: + // color keyed texture: use the alpha value in the texture to + // determine which texels get drawn. + /*lpDevice->SetRenderState(D3DRS_ALPHAREF, 0); + lpDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_NOTEQUAL); + lpDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); + */ + + SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); + SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE); + SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); + SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); + SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + + // also, smoothly blend this in-between texels: + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + for (k=0; k<4; k++) v3[k].Diffuse = D3DCOLOR_RGBA_01(r,g,b,a); + break; + } + + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (LPVOID)v3, sizeof(SPRITEVERTEX)); + + if (/*bKillSprite &&*/ bBurnIn) // final render-to-VS1 + { + // Change the rendertarget back to the original setup + lpDevice->SetTexture(0, NULL); + lpDevice->SetRenderTarget( pBackBuffer, pZBuffer ); + lpDevice->SetTexture(0, m_texmgr.m_tex[iSlot].pSurface); + + // undo aspect ratio changes (that were used to fit it to VS1): + { + float aspect = GetWidth()/(float)(GetHeight()*4.0f/3.0f); + if (aspect < 1.0f) + for (k=0; k<4; k++) v3[k].x /= aspect; + else + for (k=0; k<4; k++) v3[k].y *= aspect; + } + + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (LPVOID)v3, sizeof(SPRITEVERTEX)); + } + + SafeRelease(pBackBuffer); + SafeRelease(pZBuffer); + + if (bKillSprite) + { + KillSprite(iSlot); + } + + SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); + SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + } + } + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + + // reset these to the standard safe mode: + SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); + SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE); + SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); + SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); +#endif +} + +void CPlugin::ShowToUser(int bRedraw) +{ + LPDIRECT3DDEVICE9 lpDevice = GetDevice(); + if (!lpDevice) + return; + + lpDevice->SetTexture(0, m_lpVS[1]); + lpDevice->SetFVF( SPRITEVERTEX_FORMAT ); + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + + float fZoom = 1.0f; + SPRITEVERTEX v3[4]; + ZeroMemory(v3, sizeof(SPRITEVERTEX)*4); + + D3DRECT rect; + rect.x1 = m_posX; + rect.x2 = m_posX + GetWidth(); + rect.y1 = m_posY; + rect.y2 = m_posY + GetHeight(); + + // WISO: lpDevice->SetScissors(1, false, &rect); + + + // extend the poly we draw by 1 pixel around the viewable image area, + // in case the video card wraps u/v coords with a +0.5-texel offset + // (otherwise, a 1-pixel-wide line of the image would wrap at the top and left edges). + +/* + float fOnePlusInvWidth = 1.0f + 1.0f/(float)GetWidth(); + float fOnePlusInvHeight = 1.0f + 1.0f/(float)GetHeight(); + + v3[0].x = -fOnePlusInvWidth; + v3[1].x = fOnePlusInvWidth; + v3[2].x = -fOnePlusInvWidth; + v3[3].x = fOnePlusInvWidth; + v3[0].y = fOnePlusInvHeight; + v3[1].y = fOnePlusInvHeight; + v3[2].y = -fOnePlusInvHeight; + v3[3].y = -fOnePlusInvHeight; +*/ + + v3[0].x = ((m_posX / (float)m_backBufferWidth) * 2.0f) - 1.0f; + v3[1].x = (((m_posX + GetWidth()) / (float)m_backBufferWidth) * 2.0f) - 1.0f; + v3[2].x = v3[0].x; + v3[3].x = v3[1].x; + v3[0].y = (((m_posY + GetHeight()) / (float)m_backBufferHeight) * 2.0f) - 1.0f; + v3[1].y = v3[0].y; + v3[2].y = ((m_posY / (float)m_backBufferHeight) * 2.0f) - 1.0f; + v3[3].y = v3[2].y; + + + + float aspect = (float)GetWidth() / (GetHeight() / ASPECT); // normal aspect in 1:1 pixels + aspect *= m_pixelRatio; // adjust for non-square TV pixels + float x_aspect_mult = 1.0f; + float y_aspect_mult = 1.0f; + + if (aspect>1) + y_aspect_mult = aspect; + else + x_aspect_mult = 1.0f/aspect; + + for (int n=0; n<4; n++) + { + v3[n].x *= x_aspect_mult; + v3[n].y *= y_aspect_mult; + } + + float xRange = v3[1].x - v3[0].x; + float yRange = v3[0].y - v3[2].y; + + + if (m_pState->m_bRedBlueStereo || m_bAlways3D) + { + // red/blue stereo 3D + // NOTE: video echo is not yet supported. + // NOTE: gamma IS now supported (As of v1.04), but it's really slow. + // -no biggie though; 3d effect dies w/high gamma, so it won't get used beyond 2.0X. + + float fGammaAdj = (float)*m_pState->var_pf_gamma;//m_pState->m_fGammaAdj.eval(GetTime()); + int gamma_passes = (int)(fGammaAdj + 0.999f); + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + + for (int pass=0; pass 1) m_verts[n].tu = 1; + } + else + { + //float du = fabsf((m_verts[n].x*0.5f + 0.5f) - m_verts[n].tu); + //float dv = fabsf(0.5f - (m_verts[n].y*0.5f) - m_verts[n].tv); + //float mag_motion = sqrtf(du*du+dv*dv); + //m_verts[n].tu = (m_verts[n].x*0.5f + 0.5f) - mag_motion*0.3f; + m_verts[n].tu = m_verts[n].x + 1.0f - m_verts[n].tu; + //if (m_verts[n].tu < 0) m_verts[n].tu = 0; + //if (m_verts[n].tu > 1) m_verts[n].tu = 1; + } + + n++; + } + } + + if (rep==0) + m_verts_temp[0].Diffuse = D3DCOLOR_RGBA_01(m_cRightEye3DColor[0]*colormult,m_cRightEye3DColor[1]*colormult,m_cRightEye3DColor[2]*colormult,1); // should be the color of right lens (~red) + else + m_verts_temp[0].Diffuse = D3DCOLOR_RGBA_01(m_cLeftEye3DColor[0]*colormult,m_cLeftEye3DColor[1]*colormult,m_cLeftEye3DColor[2]*colormult,1); // should be the color of left lens (~blue) + + for (int poly=1; polyDrawPrimitiveUP(D3DPT_TRIANGLESTRIP, m_nGridX, (void*)m_verts_temp, sizeof(SPRITEVERTEX)); + } + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + } + } + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + + } + else // regular display (non-stereo) + + { + float shade[4][3] = { + { 1.0f, 1.0f, 1.0f }, + { 1.0f, 1.0f, 1.0f }, + { 1.0f, 1.0f, 1.0f }, + { 1.0f, 1.0f, 1.0f } }; // for each vertex, then each comp. + + float fShaderAmount = m_pState->m_fShader.eval(GetTime()); + + if (fShaderAmount > 0.001f) + { + for (int i=0; i<4; i++) + { + shade[i][0] = 0.6f + 0.3f*sinf(GetTime()*30.0f*0.0143f + 3 + i*21 + m_fRandStart[3]); + shade[i][1] = 0.6f + 0.3f*sinf(GetTime()*30.0f*0.0107f + 1 + i*13 + m_fRandStart[1]); + shade[i][2] = 0.6f + 0.3f*sinf(GetTime()*30.0f*0.0129f + 6 + i*9 + m_fRandStart[2]); + float max = ((shade[i][0] > shade[i][1]) ? shade[i][0] : shade[i][1]); + if (shade[i][2] > max) max = shade[i][2]; + for (int k=0; k<3; k++) + { + shade[i][k] /= max; + shade[i][k] = 0.5f + 0.5f*shade[i][k]; + } + for (int k=0; k<3; k++) + { + shade[i][k] = shade[i][k]*(fShaderAmount) + 1.0f*(1.0f - fShaderAmount); + } + v3[i].Diffuse = D3DCOLOR_RGBA_01(shade[i][0],shade[i][1],shade[i][2],1); + } + } + + float fVideoEchoZoom = (float)(*m_pState->var_pf_echo_zoom);//m_pState->m_fVideoEchoZoom.eval(GetTime()); + float fVideoEchoAlpha = (float)(*m_pState->var_pf_echo_alpha);//m_pState->m_fVideoEchoAlpha.eval(GetTime()); + int nVideoEchoOrientation = (int) (*m_pState->var_pf_echo_orient) % 4;//m_pState->m_nVideoEchoOrientation; + float fGammaAdj = (float)(*m_pState->var_pf_gamma);//m_pState->m_fGammaAdj.eval(GetTime()); + + if (m_pState->m_bBlending && + m_pState->m_fVideoEchoAlpha.eval(GetTime()) > 0.01f && + m_pState->m_fVideoEchoAlphaOld > 0.01f && + m_pState->m_nVideoEchoOrientation != m_pState->m_nVideoEchoOrientationOld) + { + if (m_pState->m_fBlendProgress < 0.5f) + { + nVideoEchoOrientation = m_pState->m_nVideoEchoOrientationOld; + fVideoEchoAlpha *= 1.0f - 2.0f*CosineInterp(m_pState->m_fBlendProgress); + } + else + { + fVideoEchoAlpha *= 2.0f*CosineInterp(m_pState->m_fBlendProgress) - 1.0f; + } + } + + if (fVideoEchoAlpha > 0.001f) + { + // video echo + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); + + for (int i=0; i<2; i++) + { + fZoom = (i==0) ? 1.0f : fVideoEchoZoom; + + float temp_lo = (0.5f - 0.5f/fZoom) + 0.5f / m_nTexSize; + float temp_hi = (0.5f + 0.5f/fZoom) + 0.5f / m_nTexSize; + + v3[0].tu = temp_lo; + v3[0].tv = temp_hi; + v3[1].tu = temp_hi; + v3[1].tv = temp_hi; + v3[2].tu = temp_lo; + v3[2].tv = temp_lo; + v3[3].tu = temp_hi; + v3[3].tv = temp_lo; + + // flipping + if (i==1) + { + for (int j=0; j<4; j++) + { + if (nVideoEchoOrientation % 2) + v3[j].tu = 1.0f - v3[j].tu; + if (nVideoEchoOrientation >= 2) + v3[j].tv = 1.0f - v3[j].tv; + } + } + + float mix = (i==1) ? fVideoEchoAlpha : 1.0f - fVideoEchoAlpha; + for (int k=0; k<4; k++) + v3[k].Diffuse = D3DCOLOR_RGBA_01(mix*shade[k][0],mix*shade[k][1],mix*shade[k][2],1); + + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + + if (i==0) + { + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + } + + if (fGammaAdj > 0.001f) + { + // draw layer 'i' a 2nd (or 3rd, or 4th...) time, additively + int nRedraws = (int)(fGammaAdj - 0.0001f); + float gamma; + + for (int nRedraw=0; nRedraw < nRedraws; nRedraw++) + { + if (nRedraw == nRedraws-1) + gamma = fGammaAdj - (int)(fGammaAdj - 0.0001f); + else + gamma = 1.0f; + + for (int k=0; k<4; k++) + v3[k].Diffuse = D3DCOLOR_RGBA_01(gamma*mix*shade[k][0],gamma*mix*shade[k][1],gamma*mix*shade[k][2],1); + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + } + } + } + } + else + { + // no video echo + v3[0].tu = 0.5f / m_nTexSize; v3[1].tu = 1; v3[2].tu = 0.5f / m_nTexSize; v3[3].tu = 1; + v3[0].tv = 1; v3[1].tv = 1; v3[2].tv = 0.5f / m_nTexSize; v3[3].tv = 0.5f / m_nTexSize; + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); + + // draw it iteratively, solid the first time, and additively after that + int nPasses = (int)(fGammaAdj - 0.001f) + 1; + float gamma; + + for (int nPass=0; nPass < nPasses; nPass++) + { + if (nPass == nPasses - 1) + gamma = fGammaAdj - (float)nPass; + else + gamma = 1.0f; + + for (int k=0; k<4; k++) + v3[k].Diffuse = D3DCOLOR_RGBA_01(gamma*shade[k][0],gamma*shade[k][1],gamma*shade[k][2],1); + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + + if (nPass==0) + { + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + } + } + } +/* + SPRITEVERTEX v3[4]; + ZeroMemory(v3, sizeof(SPRITEVERTEX)*4); + float fOnePlusInvWidth = 1.0f + 1.0f/(float)GetWidth(); + float fOnePlusInvHeight = 1.0f + 1.0f/(float)GetHeight(); + v3[0].x = -fOnePlusInvWidth; + v3[1].x = fOnePlusInvWidth; + v3[2].x = -fOnePlusInvWidth; + v3[3].x = fOnePlusInvWidth; + v3[0].y = fOnePlusInvHeight; + v3[1].y = fOnePlusInvHeight; + v3[2].y = -fOnePlusInvHeight; + v3[3].y = -fOnePlusInvHeight; +*/ + for (int i=0; i<4; i++) v3[i].Diffuse = D3DCOLOR_RGBA_01(1,1,1,1); + + if (*m_pState->var_pf_brighten && + (GetCaps()->SrcBlendCaps & D3DPBLENDCAPS_INVDESTCOLOR ) && + (GetCaps()->DestBlendCaps & D3DPBLENDCAPS_DESTCOLOR) + ) + { + // square root filter + + //lpDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE); //? + //lpDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); //? + + lpDevice->SetTexture(0, NULL); + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + + // first, a perfect invert + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + + // then modulate by self (square it) + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTCOLOR); + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + + // then another perfect invert + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + } + + if (*m_pState->var_pf_darken && + (GetCaps()->DestBlendCaps & D3DPBLENDCAPS_DESTCOLOR) + ) + { + // squaring filter + + //lpDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE); //? + //lpDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); //? + + lpDevice->SetTexture(0, NULL); + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTCOLOR); + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + + //lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR); + //lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + //lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + + } + + if (*m_pState->var_pf_solarize && + (GetCaps()->SrcBlendCaps & D3DPBLENDCAPS_DESTCOLOR ) && + (GetCaps()->DestBlendCaps & D3DPBLENDCAPS_INVDESTCOLOR) + ) + { + //lpDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE); //? + //lpDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); //? + + lpDevice->SetTexture(0, NULL); + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVDESTCOLOR); + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + } + + if (*m_pState->var_pf_invert && + (GetCaps()->SrcBlendCaps & D3DPBLENDCAPS_INVDESTCOLOR ) + ) + { + //lpDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE); //? + //lpDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); //? + + lpDevice->SetTexture(0, NULL); + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); + + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (void*)v3, sizeof(SPRITEVERTEX)); + } + + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + } +} + + +void CPlugin::ShowSongTitleAnim(int w, int h, float fProgress) +{ +#if 0 + int i,x,y; + + if (!m_lpDDSTitle) // this *can* be NULL, if not much video mem! + return; + + LPDIRECT3DDEVICE8 lpDevice = GetDevice(); + if (!lpDevice) + return; + + lpDevice->SetTexture(0, m_lpDDSTitle); + lpDevice->SetVertexShader( SPRITEVERTEX_FORMAT ); + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + + SPRITEVERTEX v3[128]; + ZeroMemory(v3, sizeof(SPRITEVERTEX)*128); + + if (m_supertext.bIsSongTitle) + { + // positioning: + float fSizeX = 50.0f / (float)m_supertext.nFontSizeUsed * powf(1.5f, m_supertext.fFontSize - 2.0f); + float fSizeY = fSizeX * m_nTitleTexSizeY/(float)m_nTitleTexSizeX;// * m_nWidth/(float)m_nHeight; + + if (fSizeX > 0.88f) + { + fSizeY *= 0.88f/fSizeX; + fSizeX = 0.88f; + } + + //fixme + if (fProgress < 1.0f)//(w!=h) // regular render-to-backbuffer + { + float aspect = w/(float)(h*4.0f/3.0f); + fSizeY *= aspect; + } + else // final render-to-VS0 + { + float aspect = GetWidth()/(float)(GetHeight()*4.0f/3.0f); + if (aspect < 1.0f) + { + fSizeX *= aspect; + fSizeY *= aspect; + } + } + + //if (fSizeX > 0.92f) fSizeX = 0.92f; + //if (fSizeY > 0.92f) fSizeY = 0.92f; + i = 0; + float vert_clip = VERT_CLIP;//1.0f;//0.45f; // warning: visible clipping has been observed at 0.4! + for (y=0; y<8; y++) + { + for (x=0; x<16; x++) + { + v3[i].tu = x/15.0f; + v3[i].tv = (y/7.0f - 0.5f)*vert_clip + 0.5f; + v3[i].x = (v3[i].tu*2.0f - 1.0f)*fSizeX; + v3[i].y = (v3[i].tv*2.0f - 1.0f)*fSizeY; + i++; + } + } + + // warping + float ramped_progress = max(0.0f, 1-fProgress*1.5f); + float t2 = powf(ramped_progress, 1.8f)*1.3f; + for (y=0; y<8; y++) + { + for (x=0; x<16; x++) + { + i = y*16+x; + v3[i].x += t2*0.070f*sinf(GetTime()*0.31f + v3[i].x*0.39f - v3[i].y*1.94f); + v3[i].x += t2*0.044f*sinf(GetTime()*0.81f - v3[i].x*1.91f + v3[i].y*0.27f); + v3[i].x += t2*0.061f*sinf(GetTime()*1.31f + v3[i].x*0.61f + v3[i].y*0.74f); + v3[i].y += t2*0.061f*sinf(GetTime()*0.37f + v3[i].x*1.83f + v3[i].y*0.69f); + v3[i].y += t2*0.070f*sinf(GetTime()*0.67f + v3[i].x*0.42f - v3[i].y*1.39f); + v3[i].y += t2*0.087f*sinf(GetTime()*1.07f + v3[i].x*3.55f + v3[i].y*0.89f); + } + } + + // scale down over time + float scale = 1.01f/(powf(fProgress, 0.21f) + 0.01f); + for (i=0; i<128; i++) + { + v3[i].x *= scale; + v3[i].y *= scale; + } + } + else + { + // positioning: + float fSizeX = (float)m_nTexSize/1024.0f * 100.0f / (float)m_supertext.nFontSizeUsed * powf(1.033f, m_supertext.fFontSize - 50.0f); + float fSizeY = fSizeX * m_nTitleTexSizeY/(float)m_nTitleTexSizeX; + + //fixme + if (fProgress < 1.0f)//w!=h) // regular render-to-backbuffer + { + float aspect = w/(float)(h*4.0f/3.0f); + fSizeY *= aspect; + } + else // final render-to-VS0 + { + float aspect = GetWidth()/(float)(GetHeight()*4.0f/3.0f); + if (aspect < 1.0f) + { + fSizeX *= aspect; + fSizeY *= aspect; + } + } + + //if (fSize > 0.92f) fSize = 0.92f; + i = 0; + float vert_clip = VERT_CLIP;//0.67f; // warning: visible clipping has been observed at 0.5 (for very short strings) and even 0.6 (for wingdings)! + for (y=0; y<8; y++) + { + for (x=0; x<16; x++) + { + v3[i].tu = x/15.0f; + v3[i].tv = (y/7.0f - 0.5f)*vert_clip + 0.5f; + v3[i].x = (v3[i].tu*2.0f - 1.0f)*fSizeX; + v3[i].y = (v3[i].tv*2.0f - 1.0f)*fSizeY; + i++; + } + } + + // apply 'growth' factor and move to user-specified (x,y) + //if (fabsf(m_supertext.fGrowth-1.0f) > 0.001f) + { + float t = (1.0f)*(1-fProgress) + (fProgress)*(m_supertext.fGrowth); + float dx = (m_supertext.fX*2-1); + float dy = (m_supertext.fY*2-1); + if (w!=h) // regular render-to-backbuffer + { + float aspect = w/(float)(h*4.0f/3.0f); + if (aspect < 1) + dx /= aspect; + else + dy *= aspect; + } + + for (i=0; i<128; i++) + { + // note: (x,y) are in (-1,1) range, but m_supertext.f{X|Y} are in (0..1) range + v3[i].x = (v3[i].x)*t + dx; + v3[i].y = (v3[i].y)*t + dy; + } + } + } + + WORD indices[7*15*6]; + i = 0; + for (y=0; y<7; y++) + { + for (x=0; x<15; x++) + { + indices[i++] = y*16 + x; + indices[i++] = y*16 + x + 1; + indices[i++] = y*16 + x + 16; + indices[i++] = y*16 + x + 1; + indices[i++] = y*16 + x + 16; + indices[i++] = y*16 + x + 17; + } + } + + // final flip on y + //for (i=0; i<128; i++) + // v3[i].y *= -1.0f; + for (i=0; i<128; i++) + v3[i].y /= ASPECT; + + for (int it=0; it<2; it++) + { + // colors + { + float t; + + if (m_supertext.bIsSongTitle) + t = powf(fProgress, 0.3f)*1.0f; + else + t = CosineInterp(min(1.0f, (fProgress/m_supertext.fFadeTime))); + + if (it==0) + v3[0].Diffuse = D3DCOLOR_RGBA_01(t,t,t,t); + else + v3[0].Diffuse = D3DCOLOR_RGBA_01(t*m_supertext.nColorR/255.0f,t*m_supertext.nColorG/255.0f,t*m_supertext.nColorB/255.0f,t); + + for (i=1; i<128; i++) + v3[i].Diffuse = v3[0].Diffuse; + } + + // nudge down & right for shadow, up & left for solid text + float offset_x = 0, offset_y = 0; + switch(it) + { + case 0: + offset_x = 2.0f/(float)m_nTitleTexSizeX; + offset_y = 2.0f/(float)m_nTitleTexSizeY; + break; + case 1: + offset_x = -4.0f/(float)m_nTitleTexSizeX; + offset_y = -4.0f/(float)m_nTitleTexSizeY; + break; + } + + for (i=0; i<128; i++) + { + v3[i].x += offset_x; + v3[i].y += offset_y; + } + + if (it == 0) + { + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);//SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR); + } + else + { + lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);//SRCALPHA); + lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + } + + lpDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 128, 15*7*6/3, indices, D3DFMT_INDEX16, v3, sizeof(SPRITEVERTEX)); + } + + lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); +#endif +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/plugin.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/plugin.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/plugin.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/plugin.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,5781 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +/* +Order of Function Calls +----------------------- + The only code that will be called by the plugin framework are the + 12 virtual functions in plugin.h. But in what order are they called? + A breakdown follows. A function name in { } means that it is only + called under certain conditions. + + Order of function calls... + + When the PLUGIN launches + ------------------------ + INITIALIZATION + OverrideDefaults + MyPreInitialize + MyReadConfig + << DirectX gets initialized at this point >> + AllocateMyNonDx8Stuff + AllocateMyDX8Stuff + RUNNING + +--> { CleanUpMyDX8Stuff + AllocateMyDX8Stuff } // called together when user resizes window or toggles fullscreen<->windowed. + | MyRenderFn + | MyRenderUI + | { MyWindowProc } // called, between frames, on mouse/keyboard/system events. 100% threadsafe. + +----<< repeat >> + CLEANUP + CleanUpMyDX8Stuff + CleanUpMyNonDx8Stuff + << DirectX gets uninitialized at this point >> + + When the CONFIG PANEL launches + ------------------------------ + INITIALIZATION + OverrideDefaults + MyPreInitialize + MyReadConfig + << DirectX gets initialized at this point >> + RUNNING + { MyConfigTabProc } // called on startup & on keyboard events + CLEANUP + [ MyWriteConfig ] // only called if user clicked 'OK' to exit + << DirectX gets uninitialized at this point >> +*/ + +/* + NOTES + ----- + + To do + ----- + -VMS VERSION: + -based on vms 1.05, but the 'fix slow text' option has been added. + that includes m_lpDDSText, CTextManager (m_text), changes to + DrawDarkTranslucentBox, the replacement of all DrawText calls + (now routed through m_text), and adding the 'fix slow text' cb + to the config panel. + + -KILLED FEATURES: + -vj mode + + -NEW FEATURES FOR 1.04: + -added the following variables for per-frame scripting: (all booleans, except 'gamma') + wave_usedots, wave_thick, wave_additive, wave_brighten + gamma, darken_center, wrap, invert, brighten, darken, solarize + (also, note that echo_zoom, echo_alpha, and echo_orient were already in there, + but weren't covered in the documentation!) + d -fixed: spectrum w/512 samples + 256 separation -> infinite spike + d -reverted dumb changes to aspect ratio stuff + d -reverted wave_y fix; now it's backwards, just like it's always been + (i.e. for wave's y position, 0=bottom and 1=top, which is opposite + to the convention in the rest of milkdrop. decided to keep the + 'bug' so presets don't need modified.) + d -fixed: Krash: Inconsistency bug - pressing Escape while in the code windows + for custom waves completely takes you out of the editing menus, + rather than back to the custom wave menu + d -when editing code: fix display of '&' character + d -internal texture size now has a little more bias toward a finer texture, + based on the window size, when set to 'Auto'. (Before, for example, + to reach 1024x1024, the window had to be 768x768 or greater; now, it + only has to be 640x640 (25% of the way there). I adjusted it because + before, at in-between resolutions like 767x767, it looked very grainy; + now it will always look nice and crisp, at any window size, but still + won't cause too much aliasing (due to downsampling for display). + d -fixed: rova: + When creating presets have commented code // in the per_pixel section when cause error in preset. + Example nothing in per_frame and just comments in the per_pixel. EXamples on repuest I have a few. + d -added kill keys: + -CTRL+K kills all running sprites + -CTRL+T kills current song title anim + -CTRL+Y kills current custom message + d -notice to sprite users: + -in milk_img.ini, color key can't be a range anymore; it's + now limited to just a single color. 'colorkey_lo' and + 'colorkey_hi' have been replaced with just one setting, + 'colorkey'. + d -song titles + custom messages are working again + ? -fixed?: crashes on window resize [out of mem] + -Rova: BTW the same bug as krash with the window resizing. + -NOT due to the 'integrate w/winamp' option. + -> might be fixed now (had forgotten to release m_lpDDSText) + + d -added checkbox to config screen to automatically turn SCROLL LOCK on @ startup + d -added alphanumeric seeking to the playlist; while playlist is up, + you can now press A-Z and 0-9 to seek to the next song in the playlist + that starts with that character. + d - + d - + d - + d - + d - + ? - + ? - + ? - + d - + d - + d - + d - + d - + + -now when playlist is up, SHIFT+A-Z seeks upward (while lowercase/regular a-z seeks downward). + -custom shapes: + -OH MY GOD + -increased max. # of custom shapes (and waves) from 3 to 4 + -added 'texture' option, which allows you to use the last frame as a texture on the shape + -added "tex_ang" and "tex_zoom" params to control the texture coords + -each frame, custom shapes now draw BEFORE regular waveform + custom waves + -added init + per-frame vars: "texture", "additive", "thick", "tex_ang", "tex_zoom" + -fixed valid characters for filenames when importing/exporting custom shapes/waves; + also, it now gives error messages on error in import/export. + -cranked max. meshsize up to 96x72 + -Krash, Rova: now the 'q' variables, as modified by the preset per-frame equations, are again + readable by the custom waves + custom shapes. Sorry about that. Should be the end of the + 'q' confusion. + -added 'meshx' and 'meshy' [read-only] variables to the preset init, per-frame, and per-pixel + equations (...and inc'd the size of the global variable pool by 2). + -removed t1-t8 vars for Custom Shapes; they were unnecessary (since there's no per-point code there). + -protected custom waves from trying to draw when # of sample minus the separation is < 2 + (or 1 if drawing with dots) + -fixed some [minor] preset-blending bugs in the custom wave code + -created a visual map for the flow of values for the q1-q8 and t1-t8 variables: + q_and_t_vars.gif (or something). + -fixed clipping of onscreen text in low-video-memory situations. Now, if there isn't enough + video memory to create an offscreen texture that is at least 75% of the size of the + screen (or to create at least a 256x256 one), it won't bother using one, and will instead draw text directly to the screen. + Otherwise, if the texture is from 75%-99% of the screen size, text will now at least + appear in the correct position on the screen so that it will be visible; this will mean + that the right- and bottom-aligned text will no longer be fully right/bottom-aligned + to the edge of the screen. + -fixed blurry text + -VJ mode is partially restored; the rest will come with beta 7 or the final release. At the time of beta 6, VJ mode still has some glitches in it, but I'm working on them. Most notably, it doesn't resize the text image when you resize the window; that's next on my list. + + -now sprites can burn-in on any frame, not just on the last frame. + set 'burn' to one (in the sprite code) on any frame to make it burn in. + this will break some older sprites, but it's super easy to fix, and + I think it's worth it. =) thanks to papaw00dy for the suggestion! + -fixed the asymptotic-value bug with custom waves using spectral data & having < 512 samples (thanks to telek's example!) + -fixed motion vectors' reversed Y positioning. + -fixed truncation ("...") of long custom messages + -fixed that pesky bug w/the last line of code on a page + -fixed the x-positioning of custom waves & shapes. Before, if you were + saving some coordinates from the preset's per-frame equations (say in q1 and q2) + and then you set "x = q1; y = q2;" in a custom shape's per-frame code + (or in a custom wave's per-point code), the x position wouldn't really be + in the right place, because of aspect ratio multiplications. Before, you had + to actually write "x = (q1-0.5)*0.75 + 0.5; y = q2;" to get it to line up; + now it's fixed, though, and you can just write "x = q1; y = q2;". + -fixed some bugs where the plugin start up, in windowed mode, on the wrong window + (and hence run super slow). + -fixed some bugs w/a munged window frame when the "integrate with winamp" option + was checked. + + -preset ratings are no longer read in all at once; instead, they are scanned in + 1 per frame until they're all in. This fixes the long pauses when you switch + to a directory that has many hundreds of presets. If you want to switch + back to the old way (read them all in at once), there is an option for it + in the config panel. + -cranked max. mesh size up to 128x96 + -fixed bug in custom shape per-frame code, where t1-t8 vars were not + resetting, at the beginning of each frame, to the values that they had + @ the end of the custom shape init code's execution. + - + - + - + + + beta 2 thread: http://forums.winamp.com/showthread.php?threadid=142635 + beta 3 thread: http://forums.winamp.com/showthread.php?threadid=142760 + beta 4 thread: http://forums.winamp.com/showthread.php?threadid=143500 + beta 6 thread: http://forums.winamp.com/showthread.php?threadid=143974 + (+read about beat det: http://forums.winamp.com/showthread.php?threadid=102205) + +@ -code editing: when cursor is on 1st posn. in line, wrong line is highlighted!? + -requests: + -random sprites (...they can just write a prog for this, tho) + -Text-entry mode. + -Like your favorite online game, hit T or something to enter 'text entry' mode. Type a message, then either hit ESC to clear and cancel text-entry mode, or ENTER to display the text on top of the vis. Easier for custom messages than editing the INI file (and probably stopping or minimizing milkdrop to do it) and reloading. + -OR SKIP IT; EASY TO JUST EDIT, RELOAD, AND HIT 00. + -add 'AA' parameter to custom message text file? + -when mem is low, fonts get kicked out -> white boxes + -probably happening b/c ID3DXFont can't create a + temp surface to use to draw text, since all the + video memory is gobbled up. +* -add to installer: q_and_t_vars.gif +* -presets: + 1. pick final set + a. OK-do a pass weeding out slow presets (crank mesh size up) + b. OK-do 2nd pass; rate them & delete crappies + c. OK-merge w/set from 1.03; check for dupes; delete more suckies + 2. OK-check for cpu-guzzlers + 3. OK-check for big ones (>= 8kb) + 4. check for ultra-spastic-when-audio-quiet ones + 5. update all ratings + 6. zip 'em up for safekeeping +* -docs: + -link to milkdrop.co.uk + -preset authoring: + -there are 11 variable pools: + preset: + a) preset init & per-frame code + b) preset per-pixel code + custom wave 1: + c) init & per-frame code + d) per-point code + custom wave 2: + e) init & per-frame code + f) per-point code + custom wave 3: + g) init & per-frame code + h) per-point code + i) custom shape 1: init & per-frame code + j) custom shape 2: init & per-frame code + k) custom shape 3: init & per-frame code + + -all of these have predefined variables, the values of many of which + trickle down from init code, to per-frame code, to per-pixel code, + when the same variable is defined for each of these. + -however, variables that you define ("my_var = 5;") do NOT trickle down. + To allow you to pass custom values from, say, your per-frame code + to your per-pixel code, the variables q1 through q8 were created. + For custom waves and custom shapes, t1 through t8 work similarly. + -q1-q8: + -purpose: to allow [custom] values to carry from {the preset init + and/or per-frame equations}, TO: {the per-pixel equations}, + {custom waves}, and {custom shapes}. + -are first set in preset init code. + -are reset, at the beginning of each frame, to the values that + they had at the end of the preset init code. + -can be modified in per-frame code... + -changes WILL be passed on to the per-pixel code + -changes WILL pass on to the q1-q8 vars in the custom waves + & custom shapes code + -changes will NOT pass on to the next frame, though; + use your own (custom) variables for that. + -can be modified in per-pixel code... + -changes will pass on to the next *pixel*, but no further + -changes will NOT pass on to the q1-q8 vars in the custom + waves or custom shapes code. + -changes will NOT pass on to the next frame, after the + last pixel, though. + -CUSTOM SHAPES: q1-q8... + -are readable in both the custom shape init & per-frame code + -start with the same values as q1-q8 had at the end of the *preset* + per-frame code, this frame + -can be modified in the init code, but only for a one-time + pass-on to the per-frame code. For all subsequent frames + (after the first), the per-frame code will get the q1-q8 + values as described above. + -can be modified in the custom shape per-frame code, but only + as temporary variables; the changes will not pass on anywhere. + -CUSTOM WAVES: q1-q8... + -are readable in the custom wave init, per-frame, and per-point code + -start with the same values as q1-q8 had at the end of the *preset* + per-frame code, this frame + -can be modified in the init code, but only for a one-time + pass-on to the per-frame code. For all subsequent frames + (after the first), the per-frame code will get the q1-q8 + values as described above. + -can be modified in the custom wave per-frame code; changes will + pass on to the per-point code, but that's it. + -can be modified in the per-point code, and the modified values + will pass on from point to point, but won't carry beyond that. + -CUSTOM WAVES: t1-t8... + -allow you to generate & save values in the custom wave init code, + that can pass on to the per-frame and, more sigificantly, + per-point code (since it's in a different variable pool). + -... + + + + !-whatever the values of q1-q8 were at the end of the per-frame and per-pixel + code, these are copied to the q1-q8 variables in the custom wave & custom + shape code, for that frame. However, those values are separate. + For example, if you modify q1-q8 in the custom wave #1 code, those changes + will not be visible anywhere else; if you modify q1-q8 in the custom shape + #2 code, same thing. However, if you modify q1-q8 in the per-frame custom + wave code, those modified values WILL be visible to the per-point custom + wave code, and can be modified within it; but after the last point, + the values q1-q8 will be discarded; on the next frame, in custom wave #1 + per-frame code, the values will be freshly copied from the values of the + main q1-q8 after the preset's per-frame and per-point code have both been + executed. + -monitor: + -can be read/written in preset init code & preset per-frame code. + -not accessible from per-pixel code. + -if you write it on one frame, then that value persists to the next frame. + -t1-t8: + - + - + - + -regular docs: + -put in the stuff recommended by VMS (vidcap, etc.) + -add to troubleshooting: + 1) desktop mode icons not appearing? or + onscreen text looking like colored boxes? + -> try freeing up some video memory. lower your res; drop to 16 bit; + etc. TURN OFF AUTO SONGTITLES. + 1) slow desktop/fullscr mode? -> try disabling auto songtitles + desktop icons. + also try reducing texsize to 256x256, since that eats memory that the text surface could claim. + 2) + 3) + * -presets: + -add new + -fix 3d presets (bring gammas back down to ~1.0) + -check old ones, make sure they're ok + -"Rovastar - Bytes" + -check wave_y + * -document custom waves & shapes + * -slow text is mostly fixed... =( + -desktop icons + playlist both have begin/end around them now, but in desktop mode, + if you bring up playlist or Load menu, fps drops in half; press Esc, and fps doesn't go back up. + - + - + - + -DONE / v1.04: + -updated to VMS 1.05 + -[list benefits...] + - + - + -3d mode: + a) SWAPPED DEFAULT L/R LENS COLORS! All images on the web are left=red, right=blue! + b) fixed image display when viewing a 3D preset in a non-4:3 aspect ratio window + c) gamma now works for 3d presets! (note: you might have to update your old presets. + if they were 3D presets, the gamma was ignored and 1.0 was used; now, + if gamma was >1.0 in the old preset, it will probably appear extremely bright.) + d) added SHIFT+F9 and CTRL+C9 to inc/dec stereo separation + e) added default stereo separation to config panel + -cranked up the max. mesh size (was 48x36, now 64x48) and the default mesh size + (was 24x18, now 32x24) + -fixed aspect ratio for final display + -auto-texsize is now computed slightly differently; for vertically or horizontally-stretched + windows, the texsize is now biased more toward the larger dimension (vs. just the + average). + -added anisotropic filtering (for machines that support it) + -fixed bug where the values of many variables in the preset init code were not set prior + to execution of the init code (e.g. time, bass, etc. were all broken!) + -added various preset blend effects. In addition to the old uniform fade, there is + now a directional wipe, radial wipe, and plasma fade. + -FIXED SLOW TEXT for DX8 (at least, on the geforce 4). + Not using DT_RIGHT or DT_BOTTOM was the key. + + + -why does text kill it in desktop mode? + -text is SLOOW + -to do: add (and use) song title font + tooltip font + -re-test: menus, text, boxes, etc. + -re-test: TIME + -testing: + -make sure sound works perfectly. (had to repro old pre-vms sound analysis!) + -autogamma: currently assumes/requires that GetFrame() resets to 0 on a mode change + (i.e. windowed -> fullscreen)... is that the case? + -restore motion vectors + - + - + -restore lost surfaces + -test bRedraw flag (desktop mode/paused) + -search for //? in milkdropfs.cpp and fix things + + problem: no good soln for VJ mode + problem: D3DX won't give you solid background for your text. + soln: (for later-) create wrapper fn that draws w/solid bkg. + + SOLN?: use D3DX to draw all text (plugin.cpp stuff AND playlist); + then, for VJ mode, create a 2nd DxContext + w/its own window + windowproc + fonts. (YUCK) + 1) config panel: test, and add WM_HELP's (copy from tooltips) + 2) keyboard input: test; and... + -need to reset UI_MODE when playlist is turned on, and + -need to reset m_show_playlist when UI_MODE is changed. (?) + -(otherwise they can both show @ same time and will fight + for keys and draw over each other) + 3) comment out most of D3D stuff in milkdropfs.cpp, and then + get it running w/o any milkdrop, but with text, etc. + 4) sound + + Issues / To Do Later + -------------------- + 1) sprites: color keying stuff probably won't work any more... + 2) scroll lock: pull code from Monkey + 3) m_nGridY should not always be m_nGridX*3/4! + 4) get solid backgrounds for menus, waitstring code, etc. + (make a wrapper function!) + + 99) at end: update help screen + + Things that will be different + ----------------------------- + 1) font sizes are no longer relative to size of window; they are absolute. + 2) 'don't clear screen at startup' option is gone + 3) 'always on top' option is gone + 4) text will not be black-on-white when an inverted-color preset is showing + + -VJ mode: + -notes + 1. (remember window size/pos, and save it from session to session? nah.) + 2. (kiv: scroll lock) + 3. (VJ window + desktop mode:) + -ok w/o VJ mode + -w/VJ mode, regardless of 'fix slow text' option, probs w/focus; + click on vj window, and plugin window flashes to top of Z order! + -goes away if you comment out 1st call to PushWindowToJustBeforeDesktop()... + -when you disable PushWindowToJustBeforeDesktop: + -..and click on EITHER window, milkdrop jumps in front of the taskbar. + -..and click on a non-MD window, nothing happens. + d-FIXED somehow, magically, while fixing bugs w/true fullscreen mode! + 4. (VJ window + true fullscreen mode:) + d-make sure VJ window gets placed on the right monitor, at startup, + and respects taskbar posn. + d-bug - start in windowed mode, then dbl-clk to go [true] fullscreen + on 2nd monitor, all with VJ mode on, and it excepts somewhere + in m_text.DrawNow() in a call to DrawPrimitive()! + FIXED - had to check m_vjd3d8_device->TestCooperativeLevel + each frame, and destroy/reinit if device needed reset. + d-can't resize VJ window when grfx window is running true fullscreen! + -FIXED, by dropping the Sleep(30)/return when m_lost_focus + was true, and by not consuming WM_NCACTIVATE in true fullscreen + mode when m_hTextWnd was present, since DX8 doesn't do its + auto-minimize thing in that case. + + + +*/ + +#include "plugin.h" +#include "utility.h" +#include "support.h" +//#include "resource.h" +#include "defines.h" +#include "shell_defines.h" +#include +#include +#include // for time() +//#include // for sliders +#include +//#include "../XmlDocument.h" + +#define FRAND ((rand() % 7381)/7380.0f) +#define strnicmp _strnicmp +#define strcmpi _strcmpi + +//extern CSoundData* pg_sound; // declared in main.cpp +extern CPlugin* g_plugin; // declared in MilkDropXBMC.cpp +extern char g_visName[]; // declared in MilkDropXBMC.cpp + +// from support.cpp: +extern bool g_bDebugOutput; +extern bool g_bDumpFileCleared; + +// these callback functions are called by menu.cpp whenever the user finishes editing an eval_ expression. +void OnUserEditedPerFrame(LPARAM param1, LPARAM param2) +{ + g_plugin->m_pState->RecompileExpressions(RECOMPILE_PRESET_CODE, 0); +} +void OnUserEditedPerPixel(LPARAM param1, LPARAM param2) +{ + g_plugin->m_pState->RecompileExpressions(RECOMPILE_PRESET_CODE, 0); +} +void OnUserEditedPresetInit(LPARAM param1, LPARAM param2) +{ + g_plugin->m_pState->RecompileExpressions(RECOMPILE_PRESET_CODE, 1); +} +void OnUserEditedWavecode(LPARAM param1, LPARAM param2) +{ + g_plugin->m_pState->RecompileExpressions(RECOMPILE_WAVE_CODE, 0); +} +void OnUserEditedWavecodeInit(LPARAM param1, LPARAM param2) +{ + g_plugin->m_pState->RecompileExpressions(RECOMPILE_WAVE_CODE, 1); +} +void OnUserEditedShapecode(LPARAM param1, LPARAM param2) +{ + g_plugin->m_pState->RecompileExpressions(RECOMPILE_SHAPE_CODE, 0); +} +void OnUserEditedShapecodeInit(LPARAM param1, LPARAM param2) +{ + g_plugin->m_pState->RecompileExpressions(RECOMPILE_SHAPE_CODE, 1); +} + +// Modify the help screen text here. +// Watch the # of lines, though; if there are too many, they will get cut off; +// and watch the length of the lines, since there is no wordwrap. +// A good guideline: your entire help screen should be visible when fullscreen +// @ 640x480 and using the default help screen font. +char g_szHelp[] = +{ + "ESC: exit help/menus/fullscreen\r" // part of framework + "ALT+D: toggle desktop mode\r" // part of framework + "ALT+ENTER: toggle fullscreen\r" // part of framework + "\r" + "SCROLL LOCK: [un]lock current preset\r" + "L: load specific preset\r" + "R: toggle random/sequential preset order\r" + "H: instant Hard cut (to next preset)\r" + "spacebar: transition to next preset\r" + "+/-: rate current preset\r" + "\r" + "F1: toggle help display\r" // part of framework + "F2: toggle song display\r" // <- specific to this example plugin + "F3: toggle song display\r" // <- specific to this example plugin + "F4: toggle preset name display\r" + "F5: toggle fps display\r" // <- specific to this example plugin + "F6: toggle preset rating display\r" + "F7: reload milk_msg.ini\r" + "F8: change directory/drive\r" + "F9: toggle stereo 3D mode\r" + " + ctrl/shift = inc/dec depth\r" + "\r" + "PLAYBACK:\r" // part of framework + " ZXCVB: prev play pause stop next\r" // part of framework + " P: show/hide playlist\r" // part of framework + " U: toggle shuffle\r" // part of framework + " up/down arrows: adjust vol.\r" // part of framework + " left/right arrows: seek 5 sec.\r" // part of framework + " +SHIFT: seek 30 sec.\r" // part of framework + "\r" + "PRESET EDITING AND SAVING\r" + " M: show/hide preset-editing Menu\r" + " S: save new preset\r" + " N: show per-frame variable moNitor\r" + "\r" + "SPRITES, CUSTOM MESSAGES...\r" + " T: launch song title animation\r" + " Y: enter custom message mode\r" + " K: enter sprite mode\r" + " SHIFT + K: enter sprite kill mode\r" + " ** see milkdrop.html for the rest! **" +}; + +#define IPC_CB_VISRANDOM 628 // param is status of random + +//---------------------------------------------------------------------- + +void CPlugin::OverrideDefaults() +{ + // Here, you have the option of overriding the "default defaults" + // for the stuff on tab 1 of the config panel, replacing them + // with custom defaults for your plugin. + // To override any of the defaults, just uncomment the line + // and change the value. + // DO NOT modify these values from any function but this one! + + // This example plugin only changes the default width/height + // for fullscreen mode; the "default defaults" are just + // 640 x 480. + // If your plugin is very dependent on smooth animation and you + // wanted it plugin to have the 'save cpu' option OFF by default, + // for example, you could set 'm_save_cpu' to 0 here. + + // m_start_fullscreen = 0; // 0 or 1 + // m_start_desktop = 0; // 0 or 1 + // m_fake_fullscreen_mode = 0; // 0 or 1 + m_max_fps_fs = 60; // 1-120, or 0 for 'unlimited' + m_max_fps_dm = 60; // 1-120, or 0 for 'unlimited' + m_max_fps_w = 60; // 1-120, or 0 for 'unlimited' + // m_show_press_f1_msg = 1; // 0 or 1 + m_allow_page_tearing_w = 0; // 0 or 1 + // m_allow_page_tearing_fs = 0; // 0 or 1 + // m_allow_page_tearing_dm = 1; // 0 or 1 + // m_minimize_winamp = 1; // 0 or 1 + // m_desktop_textlabel_boxes = 1; // 0 or 1 + // m_save_cpu = 0; // 0 or 1 + + // strcpy(m_fontinfo[0].szFace, "Trebuchet MS"); // system font + // m_fontinfo[0].nSize = 18; + // m_fontinfo[0].bBold = 0; + // m_fontinfo[0].bItalic = 0; + // strcpy(m_fontinfo[1].szFace, "Times New Roman"); // decorative font + // m_fontinfo[1].nSize = 24; + // m_fontinfo[1].bBold = 0; + // m_fontinfo[1].bItalic = 1; + + m_disp_mode_fs.Width = 1024; // normally 640 + m_disp_mode_fs.Height = 768; // normally 480 + m_disp_mode_fs.Format = D3DFMT_X8R8G8B8; // use either D3DFMT_X8R8G8B8 or D3DFMT_R5G6B5. The former will match to any 32-bit color format available, and the latter will match to any 16-bit color available, if that exact format can't be found. + // m_disp_mode_fs.RefreshRate = 60; +} + +//---------------------------------------------------------------------- + +void CPlugin::MyPreInitialize() +{ + // Initialize EVERY data member you've added to CPlugin here; + // these will be the default values. + // If you want to initialize any of your variables with random values + // (using rand()), be sure to seed the random number generator first! + // (If you want to change the default values for settings that are part of + // the plugin shell (framework), do so from OverrideDefaults() above.) + + // seed the system's random number generator w/the current system time: + srand((unsigned)time(NULL)); + + // CONFIG PANEL SETTINGS THAT WE'VE ADDED (TAB #2) + m_bFirstRun = true; + m_fBlendTimeUser = 1.1f; + m_fBlendTimeAuto = 8.0f; + m_fTimeBetweenPresets = 8.0f; + m_fTimeBetweenPresetsRand = 5.0f; + m_bSequentialPresetOrder = false; + m_bHoldPreset = false; + m_bHardCutsDisabled = false; + m_fHardCutLoudnessThresh = 2.5f; + m_fHardCutHalflife = 60.0f; + //m_nWidth = 1024; + //m_nHeight = 768; + //m_nDispBits = 16; + m_nTexSize = 1024; // -1 means "auto" + m_nGridX = 32; + m_nGridY = 24; + + m_bShowPressF1ForHelp = true; + //strcpy(m_szMonitorName, "[don't use multimon]"); + m_bShowMenuToolTips = true; // NOTE: THIS IS CURRENTLY HARDWIRED TO TRUE - NO OPTION TO CHANGE + m_n16BitGamma = 2; + m_bAutoGamma = true; + //m_nFpsLimit = -1; + m_cLeftEye3DColor[0] = 255; + m_cLeftEye3DColor[1] = 0; + m_cLeftEye3DColor[2] = 0; + m_cRightEye3DColor[0] = 0; + m_cRightEye3DColor[1] = 255; + m_cRightEye3DColor[2] = 255; + m_bEnableRating = false; + m_bInstaScan = false; + m_bSongTitleAnims = true; + m_fSongTitleAnimDuration = 1.7f; + m_fTimeBetweenRandomSongTitles = -1.0f; + m_fTimeBetweenRandomCustomMsgs = -1.0f; + m_nSongTitlesSpawned = 0; + m_nCustMsgsSpawned = 0; + + m_bAlways3D = false; + m_fStereoSep = 1.0f; + //m_bAlwaysOnTop = false; + //m_bFixSlowText = true; + m_bWarningsDisabled = false; + m_bWarningsDisabled2 = false; + m_bAnisotropicFiltering = true; + m_bPresetLockOnAtStartup = false; + +// m_gdi_title_font_doublesize = NULL; +// m_d3dx_title_font_doublesize = NULL; + + // RUNTIME SETTINGS THAT WE'VE ADDED + m_prev_time = GetTime() - 0.0333f; // note: this will be updated each frame, at bottom of MyRenderFn. + m_bTexSizeWasAuto = false; + //m_bPresetLockedByUser = false; NOW SET IN DERIVED SETTINGS + m_bPresetLockedByCode = false; + m_fStartTime = 0.0f; + m_fPresetStartTime = 0.0f; + m_fNextPresetTime = -1.0f; // negative value means no time set (...it will be auto-set on first call to UpdateTime) + m_pState = &m_state_DO_NOT_USE[0]; + m_pOldState = &m_state_DO_NOT_USE[1]; + m_UI_mode = UI_REGULAR; + //m_nTrackPlaying = 0; + //m_nSongPosMS = 0; + //m_nSongLenMS = 0; + m_bUserPagedUp = false; + m_bUserPagedDown = false; + m_fMotionVectorsTempDx = 0.0f; + m_fMotionVectorsTempDy = 0.0f; + + m_waitstring.bActive = false; + m_waitstring.bOvertypeMode = false; + m_waitstring.szClipboard[0] = 0; + + m_nPresets = 0; + m_nDirs = 0; + m_nPresetListCurPos = 0; + m_nCurrentPreset = 0; + m_szCurrentPresetFile[0] = 0; + m_pPresetAddr = NULL; + m_pfPresetRating = NULL; + m_szpresets = new char[16384]; + m_nSizeOfPresetList = 16384; + m_szPresetDir[0] = 0; // will be set @ end of this function + m_nRatingReadProgress = -1; + + myfft.Init(576, MY_FFT_SAMPLES, -1); + memset(&mysound, 0, sizeof(mysound)); + + //m_nTextHeightPixels = -1; + //m_nTextHeightPixels_Fancy = -1; + m_bShowFPS = false; + m_bShowRating = false; + m_bShowPresetInfo = false; + m_bShowDebugInfo = false; + m_bShowSongTitle = false; + m_bShowSongTime = false; + m_bShowSongLen = false; + m_fShowUserMessageUntilThisTime = -1.0f; + m_fShowRatingUntilThisTime = -1.0f; + m_szUserMessage[0] = 0; + m_szDebugMessage[0] = 0; + m_szSongTitle[0] = 0; + m_szSongTitlePrev[0] = 0; + + m_lpVS[0] = NULL; + m_lpVS[1] = NULL; + m_pZBuffer = NULL; +// m_lpDDSTitle = NULL; + m_nTitleTexSizeX = 0; + m_nTitleTexSizeY = 0; + m_verts = NULL; + m_verts_temp = NULL; + m_vertinfo = NULL; + m_indices = NULL; + + m_bMMX = false; + m_bHasFocus = true; + m_bHadFocus = false; + m_bOrigScrollLockState = false;//GetKeyState(VK_SCROLL) & 1; + // m_bMilkdropScrollLockState is derived at end of MyReadConfig() + + m_nNumericInputMode = NUMERIC_INPUT_MODE_CUST_MSG; + m_nNumericInputNum = 0; + m_nNumericInputDigits = 0; + //td_custom_msg_font m_CustomMessageFont[MAX_CUSTOM_MESSAGE_FONTS]; + //td_custom_msg m_CustomMessage[MAX_CUSTOM_MESSAGES]; + + //texmgr m_texmgr; // for user sprites + + m_supertext.bRedrawSuperText = false; + m_supertext.fStartTime = -1.0f; + + // --------------------other init-------------------- + + g_bDebugOutput = false; + g_bDumpFileCleared = false; + + strcpy(m_szWinampPluginsPath, GetConfigIniFile()); + char *p = strrchr(m_szWinampPluginsPath, '/'); + if (p) *(p+1) = 0; + strcpy(m_szPresetDir, m_szWinampPluginsPath); + strcpy(m_szMsgIniFile, m_szWinampPluginsPath); + strcpy(m_szImgIniFile, m_szWinampPluginsPath); + strcat(m_szPresetDir, "milkdrop/"); + strcat(m_szMsgIniFile, MSG_INIFILE); + strcat(m_szImgIniFile, IMG_INIFILE); + + /* + char buf[MAX_PATH]; + sprintf(buf, "Program version is %3.2f%c", INT_VERSION*0.01f, (INT_SUBVERSION==0) ? (' ') : ('a'+INT_SUBVERSION-1)); + dumpmsg(buf); + sprintf(buf, "Config.ini file is %s", GetConfigIniFile()); + dumpmsg(buf); + sprintf(buf, "Preset directory is %s", m_szPresetDir); + dumpmsg(buf); + sprintf(buf, "Winamp window handle is %08x", GetWinampWindow()); + dumpmsg(buf); + sprintf(buf, "MMX %s detected.", m_bMMX ? "successfully " : "was NOT "); + dumpmsg(buf); + //sprintf(buf, "SSE %s detected.", m_bSSE ? "successfully " : "was NOT "); + //dumpmsg(buf); + */ +} + +//---------------------------------------------------------------------- + +extern void LoadSettings(); + +void CPlugin::MyReadConfig() +{ +/* + + + // Read the user's settings from the .INI file. + // If you've added any controls to the config panel, read their value in + // from the .INI file here. + + // use this function declared in to read a value of this type: + // ----------------- ----------- ---------------------------- + // InternalGetPrivateProfileInt Win32 API int + // GetPrivateProfileBool utility.h bool + // GetPrivateProfileBOOL utility.h BOOL + // InternalGetPrivateProfileFloat utility.h float + // InternalGetPrivateProfileString Win32 API string + + //ex: m_fog_enabled = InternalGetPrivateProfileInt("settings","fog_enabled" ,m_fog_enabled ,GetConfigIniFile()); + + int n=0; + char *pIni = GetConfigIniFile(); + + m_bFirstRun = !GetPrivateProfileBool("settings","bConfigured" ,false,pIni); + m_bEnableRating = GetPrivateProfileBool("settings","bEnableRating",m_bEnableRating,pIni); + m_bInstaScan = GetPrivateProfileBool("settings","bInstaScan",m_bInstaScan,pIni); + m_bHardCutsDisabled = GetPrivateProfileBool("settings","bHardCutsDisabled",m_bHardCutsDisabled,pIni); + g_bDebugOutput = GetPrivateProfileBool("settings","bDebugOutput",g_bDebugOutput,pIni); + //m_bShowSongInfo = GetPrivateProfileBool("settings","bShowSongInfo",m_bShowSongInfo,pIni); + //m_bShowPresetInfo=GetPrivateProfileBool("settings","bShowPresetInfo",m_bShowPresetInfo,pIni); + m_bShowPressF1ForHelp = GetPrivateProfileBool("settings","bShowPressF1ForHelp",m_bShowPressF1ForHelp,pIni); + //m_bShowMenuToolTips = GetPrivateProfileBool("settings","bShowMenuToolTips",m_bShowMenuToolTips,pIni); + m_bSongTitleAnims = GetPrivateProfileBool("settings","bSongTitleAnims",m_bSongTitleAnims,pIni); + + m_bShowFPS = GetPrivateProfileBool("settings","bShowFPS", m_bShowFPS ,pIni); + m_bShowRating = GetPrivateProfileBool("settings","bShowRating", m_bShowRating ,pIni); + m_bShowPresetInfo = GetPrivateProfileBool("settings","bShowPresetInfo",m_bShowPresetInfo ,pIni); + //m_bShowDebugInfo = GetPrivateProfileBool("settings","bShowDebugInfo", m_bShowDebugInfo ,pIni); + m_bShowSongTitle = GetPrivateProfileBool("settings","bShowSongTitle", m_bShowSongTitle ,pIni); + m_bShowSongTime = GetPrivateProfileBool("settings","bShowSongTime", m_bShowSongTime ,pIni); + m_bShowSongLen = GetPrivateProfileBool("settings","bShowSongLen", m_bShowSongLen ,pIni); + + //m_bFixPinkBug = GetPrivateProfileBool("settings","bFixPinkBug",m_bFixPinkBug,pIni); + int nTemp = GetPrivateProfileBool("settings","bFixPinkBug",-1,pIni); + if (nTemp == 0) + m_n16BitGamma = 0; + else if (nTemp == 1) + m_n16BitGamma = 2; + m_n16BitGamma = InternalGetPrivateProfileInt("settings","n16BitGamma",m_n16BitGamma,pIni); + m_bAutoGamma = GetPrivateProfileBool("settings","bAutoGamma",m_bAutoGamma,pIni); + m_bAlways3D = GetPrivateProfileBool("settings","bAlways3D",m_bAlways3D,pIni); + m_fStereoSep = InternalGetPrivateProfileFloat("settings","fStereoSep",m_fStereoSep,pIni); + //m_bFixSlowText = GetPrivateProfileBool("settings","bFixSlowText",m_bFixSlowText,pIni); + //m_bAlwaysOnTop = GetPrivateProfileBool("settings","bAlwaysOnTop",m_bAlwaysOnTop,pIni); + m_bWarningsDisabled = GetPrivateProfileBool("settings","bWarningsDisabled",m_bWarningsDisabled,pIni); + m_bWarningsDisabled2 = GetPrivateProfileBool("settings","bWarningsDisabled2",m_bWarningsDisabled2,pIni); + m_bAnisotropicFiltering = GetPrivateProfileBool("settings","bAnisotropicFiltering",m_bAnisotropicFiltering,pIni); + m_bPresetLockOnAtStartup = GetPrivateProfileBool("settings","bPresetLockOnAtStartup",m_bPresetLockOnAtStartup,pIni); + + m_cLeftEye3DColor[0] = InternalGetPrivateProfileInt("settings","nLeftEye3DColorR",m_cLeftEye3DColor[0],pIni); + m_cLeftEye3DColor[1] = InternalGetPrivateProfileInt("settings","nLeftEye3DColorG",m_cLeftEye3DColor[1],pIni); + m_cLeftEye3DColor[2] = InternalGetPrivateProfileInt("settings","nLeftEye3DColorB",m_cLeftEye3DColor[2],pIni); + m_cRightEye3DColor[0] = InternalGetPrivateProfileInt("settings","nRightEye3DColorR",m_cRightEye3DColor[0],pIni); + m_cRightEye3DColor[1] = InternalGetPrivateProfileInt("settings","nRightEye3DColorG",m_cRightEye3DColor[1],pIni); + m_cRightEye3DColor[2] = InternalGetPrivateProfileInt("settings","nRightEye3DColorB",m_cRightEye3DColor[2],pIni); + + m_nTexSize = InternalGetPrivateProfileInt("settings","nTexSize" ,m_nTexSize ,pIni); + m_bTexSizeWasAuto = (m_nTexSize == -1); + m_nGridX = InternalGetPrivateProfileInt("settings","nMeshSize" ,m_nGridX ,pIni); + m_nGridY = m_nGridX*3/4; + + m_fBlendTimeUser = InternalGetPrivateProfileFloat("settings","fBlendTimeUser" ,m_fBlendTimeUser ,pIni); + m_fBlendTimeAuto = InternalGetPrivateProfileFloat("settings","fBlendTimeAuto" ,m_fBlendTimeAuto ,pIni); + m_fTimeBetweenPresets = InternalGetPrivateProfileFloat("settings","fTimeBetweenPresets" ,m_fTimeBetweenPresets ,pIni); + m_fTimeBetweenPresetsRand = InternalGetPrivateProfileFloat("settings","fTimeBetweenPresetsRand",m_fTimeBetweenPresetsRand,pIni); + m_fHardCutLoudnessThresh = InternalGetPrivateProfileFloat("settings","fHardCutLoudnessThresh" ,m_fHardCutLoudnessThresh ,pIni); + m_fHardCutHalflife = InternalGetPrivateProfileFloat("settings","fHardCutHalflife" ,m_fHardCutHalflife ,pIni); + m_fSongTitleAnimDuration = InternalGetPrivateProfileFloat("settings","fSongTitleAnimDuration" ,m_fSongTitleAnimDuration ,pIni); + m_fTimeBetweenRandomSongTitles = InternalGetPrivateProfileFloat("settings","fTimeBetweenRandomSongTitles" ,m_fTimeBetweenRandomSongTitles,pIni); + m_fTimeBetweenRandomCustomMsgs = InternalGetPrivateProfileFloat("settings","fTimeBetweenRandomCustomMsgs" ,m_fTimeBetweenRandomCustomMsgs,pIni); + + // -------- + + InternalGetPrivateProfileString("settings","szPresetDir",m_szPresetDir,m_szPresetDir,sizeof(m_szPresetDir),pIni); + + ReadCustomMessages(); + + // bounds-checking: + if (m_nGridX > MAX_GRID_X) + m_nGridX = MAX_GRID_X; + if (m_nGridY > MAX_GRID_Y) + m_nGridY = MAX_GRID_Y; + if (m_fTimeBetweenPresetsRand < 0) + m_fTimeBetweenPresetsRand = 0; + if (m_fTimeBetweenPresets < 0.1f) + m_fTimeBetweenPresets = 0.1f; + + // DERIVED SETTINGS + m_bPresetLockedByUser = m_bPresetLockOnAtStartup; + m_bMilkdropScrollLockState = m_bPresetLockOnAtStartup; +*/ + + m_bPresetLockedByUser = false; + + //------------------------------------------------------------------------- + // XML version + + LoadSettings(); +} + +//---------------------------------------------------------------------- + +void CPlugin::MyWriteConfig() +{ +/* + + // Write the user's settings to the .INI file. + // This gets called only when the user runs the config panel and hits OK. + // If you've added any controls to the config panel, write their value out + // to the .INI file here. + + // use this function declared in to write a value of this type: + // ----------------- ----------- ---------------------------- + // WritePrivateProfileInt Win32 API int + // WritePrivateProfileInt utility.h bool + // WritePrivateProfileInt utility.h BOOL + // WritePrivateProfileFloat utility.h float + // WritePrivateProfileString Win32 API string + + // ex: WritePrivateProfileInt(m_fog_enabled ,"fog_enabled" ,GetConfigIniFile(),"settings"); + + char *pIni = GetConfigIniFile(); + + // constants: + WritePrivateProfileString("settings","bConfigured","1",pIni); + + //note: m_szPresetDir is not written here; it is written manually, whenever it changes. + + char szSectionName[] = "settings"; + + WritePrivateProfileInt(m_bSongTitleAnims, "bSongTitleAnims", pIni, "settings"); + WritePrivateProfileInt(m_bHardCutsDisabled, "bHardCutsDisabled", pIni, "settings"); + WritePrivateProfileInt(m_bEnableRating, "bEnableRating", pIni, "settings"); + WritePrivateProfileInt(m_bInstaScan, "bInstaScan", pIni, "settings"); + WritePrivateProfileInt(g_bDebugOutput, "bDebugOutput", pIni, "settings"); + + //itePrivateProfileInt(m_bShowPresetInfo, "bShowPresetInfo", pIni, "settings"); + //itePrivateProfileInt(m_bShowSongInfo, "bShowSongInfo", pIni, "settings"); + //itePrivateProfileInt(m_bFixPinkBug, "bFixPinkBug", pIni, "settings"); + + WritePrivateProfileInt(m_bShowPressF1ForHelp, "bShowPressF1ForHelp", pIni, "settings"); + //itePrivateProfileInt(m_bShowMenuToolTips, "bShowMenuToolTips", pIni, "settings"); + WritePrivateProfileInt(m_n16BitGamma, "n16BitGamma", pIni, "settings"); + WritePrivateProfileInt(m_bAutoGamma, "bAutoGamma", pIni, "settings"); + + WritePrivateProfileInt(m_bAlways3D, "bAlways3D", pIni, "settings"); + WritePrivateProfileFloat(m_fStereoSep, "fStereoSep", pIni, "settings"); + //WritePrivateProfileInt(m_bFixSlowText, "bFixSlowText", pIni, "settings"); + //itePrivateProfileInt(m_bAlwaysOnTop, "bAlwaysOnTop", pIni, "settings"); + WritePrivateProfileInt(m_bWarningsDisabled, "bWarningsDisabled", pIni, "settings"); + WritePrivateProfileInt(m_bWarningsDisabled2, "bWarningsDisabled2", pIni, "settings"); + WritePrivateProfileInt(m_bAnisotropicFiltering, "bAnisotropicFiltering",pIni, "settings"); + WritePrivateProfileInt(m_bPresetLockOnAtStartup,"bPresetLockOnAtStartup",pIni,"settings"); + + WritePrivateProfileInt(m_cLeftEye3DColor[0], "nLeftEye3DColorR", pIni, "settings"); + WritePrivateProfileInt(m_cLeftEye3DColor[1], "nLeftEye3DColorG", pIni, "settings"); + WritePrivateProfileInt(m_cLeftEye3DColor[2], "nLeftEye3DColorB", pIni, "settings"); + WritePrivateProfileInt(m_cRightEye3DColor[0], "nRightEye3DColorR", pIni, "settings"); + WritePrivateProfileInt(m_cRightEye3DColor[1], "nRightEye3DColorG", pIni, "settings"); + WritePrivateProfileInt(m_cRightEye3DColor[2], "nRightEye3DColorB", pIni, "settings"); + + WritePrivateProfileInt(m_nTexSize, "nTexSize", pIni, "settings"); + WritePrivateProfileInt(m_nGridX, "nMeshSize", pIni, "settings"); + + WritePrivateProfileFloat(m_fBlendTimeAuto, "fBlendTimeAuto", pIni, "settings"); + WritePrivateProfileFloat(m_fBlendTimeUser, "fBlendTimeUser", pIni, "settings"); + WritePrivateProfileFloat(m_fTimeBetweenPresets, "fTimeBetweenPresets", pIni, "settings"); + WritePrivateProfileFloat(m_fTimeBetweenPresetsRand, "fTimeBetweenPresetsRand", pIni, "settings"); + WritePrivateProfileFloat(m_fHardCutLoudnessThresh, "fHardCutLoudnessThresh", pIni, "settings"); + WritePrivateProfileFloat(m_fHardCutHalflife, "fHardCutHalflife", pIni, "settings"); + WritePrivateProfileFloat(m_fSongTitleAnimDuration, "fSongTitleAnimDuration", pIni, "settings"); + WritePrivateProfileFloat(m_fTimeBetweenRandomSongTitles,"fTimeBetweenRandomSongTitles",pIni, "settings"); + WritePrivateProfileFloat(m_fTimeBetweenRandomCustomMsgs,"fTimeBetweenRandomCustomMsgs",pIni, "settings"); +*/ +} + +//---------------------------------------------------------------------- + +int CPlugin::AllocateMyNonDx8Stuff() +{ + // This gets called only once, when your plugin is actually launched. + // If only the config panel is launched, this does NOT get called. + // (whereas MyPreInitialize() still does). + // If anything fails here, return FALSE to safely exit the plugin, + // but only after displaying a messagebox giving the user some information + // about what went wrong. + + /* + if (!m_hBlackBrush) + m_hBlackBrush = CreateSolidBrush(RGB(0,0,0)); + */ + + BuildMenus(); + + m_bMMX = CheckForMMX(); + //m_bSSE = CheckForSSE(); + + m_pState->Default(); + m_pOldState->Default(); + + // JM + if (m_bHoldPreset && m_nPresets >= 0) + { + printf("Preset is held, loading preset %i", m_nCurrentPreset); + if (m_nCurrentPreset > 0) + { + m_nCurrentPreset--; + LoadNextPreset(0.0f); + } + else + { + m_nCurrentPreset++; + LoadPreviousPreset(0.0f); + } + } + else + { + printf("Preset is not held, loading a random preset. Current is %i", m_nCurrentPreset); + LoadRandomPreset(0.0f); + } + // JM + return true; +} + +//---------------------------------------------------------------------- + +void CPlugin::CleanUpMyNonDx8Stuff() +{ + // This gets called only once, when your plugin exits. + // Be sure to clean up any objects here that were + // created/initialized in AllocateMyNonDx8Stuff. + + //sound.Finish(); + + if (m_pPresetAddr) + { + delete m_pPresetAddr; + m_pPresetAddr = NULL; + } + + if (m_pfPresetRating) + { + delete m_pfPresetRating; + m_pfPresetRating = NULL; + } + + if (m_szpresets) + { + delete m_szpresets; + m_szpresets = NULL; + } + + // NOTE: DO NOT DELETE m_gdi_titlefont_doublesize HERE!!! + +/* + m_menuPreset .Finish(); + m_menuWave .Finish(); + m_menuAugment .Finish(); + m_menuCustomWave.Finish(); + m_menuCustomShape.Finish(); + m_menuMotion .Finish(); + m_menuPost .Finish(); + for (int i=0; i= 11.0f) // ..don't jump to 2048x2048 quite as readily + bias = 0.5f; + int nExp = (int)(fExp + bias); + m_nTexSize = (int)powf(2.0f, (float)nExp); + } +*/ + + // clip texsize by max. from caps + if (m_nTexSize > GetCaps()->MaxTextureWidth && GetCaps()->MaxTextureWidth>0) + m_nTexSize = GetCaps()->MaxTextureWidth; + if (m_nTexSize > GetCaps()->MaxTextureHeight && GetCaps()->MaxTextureHeight>0) + m_nTexSize = GetCaps()->MaxTextureHeight; + + // reallocate + bool bSuccess = false; + int nOrigTexSize = m_nTexSize; + + do + { + SafeRelease(m_lpVS[0]); + SafeRelease(m_lpVS[1]); + SafeRelease(m_pZBuffer); + + LPDIRECT3DSURFACE9 pBackBuffer, tmpSurface; + D3DSURFACE_DESC tmpDesc; + D3DVIEWPORT9 pVP; + + GetDevice()->GetRenderTarget(0, &pBackBuffer ); + GetDevice()->GetDepthStencilSurface(&tmpSurface); + tmpSurface->GetDesc(&tmpDesc); + SafeRelease(tmpSurface); + GetDevice()->GetViewport(&pVP); + + UINT uiwidth=(pVP.Width>m_nTexSize) ? pVP.Width:m_nTexSize; + UINT uiheight=(pVP.Height>m_nTexSize) ? pVP.Height:m_nTexSize; + + printf("CreateDepthStencilSurface with %u x %u", uiwidth, uiheight); + if(GetDevice()->CreateDepthStencilSurface(uiwidth, uiheight, tmpDesc.Format, D3DMULTISAMPLE_NONE, 0, TRUE, &m_pZBuffer, NULL) != D3D_OK) + printf("Can't create DepthStencilSurface"); + + // create VS1 and VS2 + bSuccess = (GetDevice()->CreateTexture(m_nTexSize, m_nTexSize, 1, D3DUSAGE_RENDERTARGET, GetBackBufFormat(), D3DPOOL_DEFAULT, &m_lpVS[0], NULL) == D3D_OK); + if (bSuccess) + { + IDirect3DSurface9* pNewTarget = NULL; + if (m_lpVS[0]->GetSurfaceLevel(0, &pNewTarget) == D3D_OK) + { + GetDevice()->SetRenderTarget(0, pNewTarget); + GetDevice()->Clear(0, 0, D3DCLEAR_TARGET, 0x00000000, 1.0f, 0); + pNewTarget->Release(); + } + + bSuccess = (GetDevice()->CreateTexture(m_nTexSize, m_nTexSize, 1, D3DUSAGE_RENDERTARGET, GetBackBufFormat(), D3DPOOL_DEFAULT, &m_lpVS[1], NULL) == D3D_OK); + if (bSuccess) + { + if (m_lpVS[1]->GetSurfaceLevel(0, &pNewTarget) == D3D_OK) + { + GetDevice()->SetRenderTarget(0, pNewTarget); + GetDevice()->Clear(0, 0, D3DCLEAR_TARGET, 0x00000000, 1.0f, 0); + pNewTarget->Release(); + } + } + else + printf("failed to create texture %d x %d", m_nTexSize, m_nTexSize); + } + else + printf("failed to create texture %d x %d", m_nTexSize, m_nTexSize); + + GetDevice()->SetRenderTarget(0, pBackBuffer); + SafeRelease(pBackBuffer); + + + if (!bSuccess && m_bTexSizeWasAuto) + m_nTexSize /= 2; + } + while (!bSuccess && m_nTexSize >= 256 && m_bTexSizeWasAuto); + + if (!bSuccess) + { + char buf[2048]; + if (m_bTexSizeWasAuto || m_nTexSize==256) + sprintf(buf, "couldn't create offscreen surfaces! (probably not enough video memory left)\rtry selecting a smaller video mode or changing the color depth."); + else + sprintf(buf, "couldn't create offscreen surfaces! (probably not enough video memory left)\r\r\rRECOMMENDATION: SET THE TEXTURE SIZE BACK TO 'AUTO' AND TRY AGAIN"); + dumpmsg(buf); +// MessageBox(GetPluginWindow(), buf, "MILKDROP ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST ); + return false; + } + printf("Textures created!"); + + if (m_nTexSize != nOrigTexSize) + { + char buf[2048]; + sprintf(buf, "Init: -WARNING-: low memory; ideal auto texture size would be %d, but it had to be lowered to %d!", nOrigTexSize, m_nTexSize); + dumpmsg(buf); + if (!m_bWarningsDisabled) + { + sprintf(buf, "WARNING: low video memory; auto texture had to be reduced\rfrom %dx%d to %dx%d.\r\rThe image may look chunky or blocky.\r", nOrigTexSize, nOrigTexSize, m_nTexSize, m_nTexSize); + if (GetScreenMode() != FULLSCREEN) + { + switch(GetBackBufFormat()) + { +// case D3DFMT_R8G8B8 : + case D3DFMT_A8R8G8B8: + case D3DFMT_X8R8G8B8: + strcat(buf, "\rRECOMMENDATION: **reduce your Windows color depth to 16 bits**\rto free up some video memory, or lower your screen resolution.\r"); + break; + default: + strcat(buf, "\rRECOMMENDATION: lower your screen resolution, to free up some video memory.\r"); + break; + } + } + dumpmsg(buf); +// MessageBox(GetPluginWindow(), buf, "WARNING", MB_OK|MB_SETFOREGROUND|MB_TOPMOST ); + } + } + } + + // ----------------- + + /*if (m_bFixSlowText && !m_bSeparateTextWindow) + { + if (D3DXCreateTexture(GetDevice(), GetWidth(), GetHeight(), 1, D3DUSAGE_RENDERTARGET, GetBackBufFormat(), D3DPOOL_DEFAULT, &m_lpDDSText) != D3D_OK) + { + char buf[2048]; + dumpmsg("Init: -WARNING-:"); + sprintf(buf, "WARNING: Not enough video memory to make a dedicated text surface; \rtext will still be drawn directly to the back buffer.\r\rTo avoid seeing this error again, uncheck the 'fix slow text' option."); + dumpmsg(buf); + if (!m_bWarningsDisabled) + MessageBox(GetPluginWindow(), buf, "WARNING", MB_OK|MB_SETFOREGROUND|MB_TOPMOST ); + m_lpDDSText = NULL; + } + }*/ + + // ----------------- + +#if 0 + // reallocate the texture for font titles + custom msgs (m_lpDDSTitle) + { + m_nTitleTexSizeX = m_nTexSize; + m_nTitleTexSizeY = m_nTexSize/2; + + //dumpmsg("Init: [re]allocating title surface"); + + // [DEPRECATED as of transition to dx8:] + // We could just create one title surface, but this is a problem because many + // systems can only call DrawText on DDSCAPS_OFFSCREENPLAIN surfaces, and can NOT + // draw text on a DDSCAPS_TEXTURE surface (it comes out garbled). + // So, we create one of each; we draw the text to the DDSCAPS_OFFSCREENPLAIN surface + // (m_lpDDSTitle[1]), then we blit that (once) to the DDSCAPS_TEXTURE surface + // (m_lpDDSTitle[0]), which can then be drawn onto the screen on polys. + + int square = 0; + HRESULT hr; + + do + { + hr = D3DXCreateTexture(GetDevice(), m_nTitleTexSizeX, m_nTitleTexSizeY, 1, D3DUSAGE_RENDERTARGET, GetBackBufFormat(), D3DPOOL_DEFAULT, &m_lpDDSTitle); + if (hr != D3D_OK) + { + if (square==0) + { + square = 1; + m_nTitleTexSizeY *= 2; + } + else + { + m_nTitleTexSizeX /= 2; + m_nTitleTexSizeY /= 2; + } + } + } + while (hr != D3D_OK && m_nTitleTexSizeX > 16); + + if (hr != D3D_OK) + { + //dumpmsg("Init: -WARNING-: Title texture could not be created!"); + m_lpDDSTitle = NULL; + //SafeRelease(m_lpDDSTitle); + //return true; + } + else + { + //sprintf(buf, "Init: title texture size is %dx%d (ideal size was %dx%d)", m_nTitleTexSizeX, m_nTitleTexSizeY, m_nTexSize, m_nTexSize/4); + //dumpmsg(buf); + m_supertext.bRedrawSuperText = true; + } + } +#endif + // ----------------- + +#if 0 + // create 'm_gdi_title_font_doublesize' + int songtitle_font_size = m_fontinfo[SONGTITLE_FONT].nSize * m_nTitleTexSizeX/256; + if (songtitle_font_size<6) songtitle_font_size=6; + if (!(m_gdi_title_font_doublesize = CreateFont(songtitle_font_size, 0, 0, 0, m_fontinfo[SONGTITLE_FONT].bBold ? 900 : 400, m_fontinfo[SONGTITLE_FONT].bItalic, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, m_fontinfo[SONGTITLE_FONT].bAntiAliased ? ANTIALIASED_QUALITY : DEFAULT_QUALITY, DEFAULT_PITCH, m_fontinfo[SONGTITLE_FONT].szFace))) + { + MessageBox(NULL, "Error creating double-sized GDI title font", "ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return false; + } + + if (D3DXCreateFont(GetDevice(), m_gdi_title_font_doublesize, &m_d3dx_title_font_doublesize) != D3D_OK) + { + MessageBox(GetPluginWindow(), "Error creating double-sized d3dx title font", "ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return false; + } +#endif + // ----------------- + +// m_texmgr.Init(GetDevice()); + + //dumpmsg("Init: mesh allocation"); + m_verts = new SPRITEVERTEX[(m_nGridX+1)*(m_nGridY+1)]; + m_verts_temp = new SPRITEVERTEX[(m_nGridX+2)]; + m_vertinfo = new td_vertinfo[(m_nGridX+1)*(m_nGridY+1)]; + m_indices = new WORD[(m_nGridX+2)*(m_nGridY*2)]; + if (!m_verts || !m_vertinfo) + { + sprintf(buf, "couldn't allocate mesh - out of memory"); + dumpmsg(buf); +// MessageBox(GetPluginWindow(), buf, "MILKDROP ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST ); + return false; + } + + int nVert = 0; + for (int y=0; y<=m_nGridY; y++) + { + for (int x=0; x<=m_nGridX; x++) + { + // precompute x,y,z + m_verts[nVert].x = x/(float)m_nGridX*2.0f - 1.0f; + m_verts[nVert].y = y/(float)m_nGridY*2.0f - 1.0f; + m_verts[nVert].z = 0.0f; + + // precompute rad, ang, being conscious of aspect ratio + m_vertinfo[nVert].rad = sqrtf(m_verts[nVert].x*m_verts[nVert].x + m_verts[nVert].y*m_verts[nVert].y*ASPECT*ASPECT); + if (y==m_nGridY/2 && x==m_nGridX/2) + m_vertinfo[nVert].ang = 0.0f; + else + m_vertinfo[nVert].ang = atan2f(m_verts[nVert].y*ASPECT, m_verts[nVert].x); + m_vertinfo[nVert].a = 1; + m_vertinfo[nVert].c = 0; + + nVert++; + } + } + + int xref, yref; + nVert = 0; + for (int quadrant=0; quadrant<4; quadrant++) + { + for (int slice=0; slice < m_nGridY/2; slice++) + { + for (int i=0; i < m_nGridX + 2; i++) + { + // quadrants: 2 3 + // 0 1 + + xref = i/2; + yref = (i%2) + slice; + + if (quadrant & 1) + xref = m_nGridX - xref; + + if (quadrant & 2) + yref = m_nGridY - yref; + + m_indices[nVert++] = xref + (yref)*(m_nGridX+1); + } + } + } + + return true; +} + +//---------------------------------------------------------------------- + +void CPlugin::CleanUpMyDX8Stuff(int final_cleanup) +{ + // Clean up all your DX8 and D3DX textures, fonts, buffers, etc. here. + // EVERYTHING CREATED IN ALLOCATEMYDX8STUFF() SHOULD BE CLEANED UP HERE. + // The input parameter, 'final_cleanup', will be 0 if this is + // a routine cleanup (part of a window resize or switch between + // fullscr/windowed modes), or 1 if this is the final cleanup + // and the plugin is exiting. Note that even if it is a routine + // cleanup, *you still have to release ALL your DirectX stuff, + // because the DirectX device is being destroyed and recreated!* + // Also set all the pointers back to NULL; + // this is important because if we go to reallocate the DX8 + // stuff later, and something fails, then CleanUp will get called, + // but it will then be trying to clean up invalid pointers.) + // The SafeRelease() and SafeDelete() macros make your code prettier; + // they are defined here in utility.h as follows: + // #define SafeRelease(x) if (x) {x->Release(); x=NULL;} + // #define SafeDelete(x) if (x) {delete x; x=NULL;} + // IMPORTANT: + // This function ISN'T only called when the plugin exits! + // It is also called whenever the user toggles between fullscreen and + // windowed modes, or resizes the window. Basically, on these events, + // the base class calls CleanUpMyDX8Stuff before Reset()ing the DirectX + // device, and then calls AllocateMyDX8Stuff afterwards. + + + // NOTE: not necessary; shell does this for us. + /*if (GetDevice()) + { + GetDevice()->SetTexture(0, NULL); + GetDevice()->SetTexture(1, NULL); + }*/ + + // 2. release stuff + SafeRelease(m_lpVS[0]); + SafeRelease(m_lpVS[1]); + SafeRelease(m_pZBuffer); +// SafeRelease(m_lpDDSTitle); +// SafeRelease(m_d3dx_title_font_doublesize); + + // NOTE: THIS CODE IS IN THE RIGHT PLACE. +/* if (m_gdi_title_font_doublesize) + { + DeleteObject(m_gdi_title_font_doublesize); + m_gdi_title_font_doublesize = NULL; + } +*/ +// m_texmgr.Finish(); + + if (m_verts != NULL) + { + delete m_verts; + m_verts = NULL; + } + + if (m_verts_temp != NULL) + { + delete m_verts_temp; + m_verts_temp = NULL; + } + + if (m_vertinfo != NULL) + { + delete m_vertinfo; + m_vertinfo = NULL; + } + + if (m_indices != NULL) + { + delete m_indices; + m_indices = NULL; + } +} + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- + +void CPlugin::MyRenderFn(int redraw) +{ + LPDIRECT3DSURFACE9 tmpSurface; + GetDevice()->GetDepthStencilSurface(&tmpSurface); + GetDevice()->SetDepthStencilSurface(m_pZBuffer); + + // Render a frame of animation here. + // This function is called each frame just AFTER BeginScene(). + // For timing information, call 'GetTime()' and 'GetFps()'. + // The usual formula is like this (but doesn't have to be): + // 1. take care of timing/other paperwork/etc. for new frame + // 2. clear the background + // 3. get ready for 3D drawing + // 4. draw your 3D stuff + // 5. call PrepareFor2DDrawing() + // 6. draw your 2D stuff (overtop of your 3D scene) + // If the 'redraw' flag is 1, you should try to redraw + // the last frame; GetTime, GetFps, and GetFrame should + // all return the same values as they did on the last + // call to MyRenderFn(). Otherwise, the redraw flag will + // be zero, and you can draw a new frame. The flag is + // used to force the desktop to repaint itself when + // running in desktop mode and Winamp is paused or stopped. + + // 1. take care of timing/other paperwork/etc. for new frame + { + float dt = GetTime() - m_prev_time; + m_prev_time = GetTime(); // note: m_prev_time is not for general use! + if (m_bPresetLockedByUser || m_bPresetLockedByCode) + { + m_fPresetStartTime += dt; + m_fNextPresetTime += dt; + } + + UpdatePresetRatings(); // read in a few each frame, til they're all in + } + + // 2. check for lost or gained kb focus: + // (note: can't use wm_setfocus or wm_killfocus because they don't work w/embedwnd) +/* + if (GetFrame()==0) + { + SetScrollLock(m_bPresetLockOnAtStartup); + } + else + { + m_bHadFocus = m_bHasFocus; + if (GetParent(GetPluginWindow()) == GetWinampWindow()) + m_bHasFocus = (GetFocus() == GetPluginWindow()); + else + m_bHasFocus = (GetFocus() == GetParent(GetPluginWindow())) || + (GetFocus() == GetPluginWindow()); + + if (m_hTextWnd && GetFocus()==m_hTextWnd) + m_bHasFocus = 1; + + if (GetFocus()==NULL) + m_bHasFocus = 0; + ; + //HWND t1 = GetFocus(); + //HWND t2 = GetPluginWindow(); + //HWND t3 = GetParent(t2); + + if (m_bHadFocus==1 && m_bHasFocus==0) + { + m_bMilkdropScrollLockState = GetKeyState(VK_SCROLL) & 1; + SetScrollLock(m_bOrigScrollLockState); + } + else if (m_bHadFocus==0 && m_bHasFocus==1) + { + m_bOrigScrollLockState = GetKeyState(VK_SCROLL) & 1; + SetScrollLock(m_bMilkdropScrollLockState); + } + } + + GetWinampSongTitle(GetWinampWindow(), m_szSongTitle, sizeof(m_szSongTitle)-1); + if (strcmp(m_szSongTitle, m_szSongTitlePrev)) + { + strcpy(m_szSongTitlePrev, m_szSongTitle); + if (m_bSongTitleAnims) + LaunchSongTitleAnim(); + } +*/ + // 2. Clear the background: + //DWORD clear_color = (m_fog_enabled) ? FOG_COLOR : 0xFF000000; + //GetDevice()->Clear(0, 0, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, clear_color, 1.0f, 0); + + // 5. switch to 2D drawing mode. 2D coord system: + // +--------+ Y=-1 + // | | + // | screen | Z=0: front of scene + // | | Z=1: back of scene + // +--------+ Y=1 + // X=-1 X=1 + PrepareFor2DDrawing(GetDevice()); + + DoCustomSoundAnalysis(); // emulates old pre-vms milkdrop sound analysis + + RenderFrame(redraw); // see milkdropfs.cpp + + /* + for (int i=0; i<10; i++) + { + RECT r; + r.top = GetHeight()*i/10; + r.left = 0; + r.right = GetWidth(); + r.bottom = r.top + GetFontHeight(DECORATIVE_FONT); + char buf[256]; + switch(i) + { + case 0: strcpy(buf, "this is a test"); break; + case 1: strcpy(buf, "argh"); break; + case 2: strcpy(buf, "!!"); break; + case 3: strcpy(buf, "TESTING FONTS"); break; + case 4: strcpy(buf, "rancid bear grease"); break; + case 5: strcpy(buf, "whoppers and ding dongs"); break; + case 6: strcpy(buf, "billy & joey"); break; + case 7: strcpy(buf, "."); break; + case 8: strcpy(buf, "---"); break; + case 9: strcpy(buf, "test"); break; + } + int t = (int)( 54 + 18*sin(i/10.0f*53.7f + 1) - 28*sin(i/10.0f*39.4f + 3) ); + if (((GetFrame() + i*107) % t) < t*8/9) + m_text.QueueText(GetFont(DECORATIVE_FONT), buf, r, 0, 0xFFFF00FF); + } + /**/ + GetDevice()->SetDepthStencilSurface(tmpSurface); + SafeRelease(tmpSurface); +} + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- + +void CPlugin::DrawTooltip(char* str, int xR, int yB) +{ +#if 0 + /* + // draws a string in the lower-right corner of the screen. + // note: ID3DXFont handles DT_RIGHT and DT_BOTTOM *very poorly*. + // it is best to calculate the size of the text first, + // then place it in the right spot. + // note: use DT_WORDBREAK instead of DT_WORD_ELLIPSES, otherwise certain fonts' + // calcrect (for the dark box) will be wrong. + + RECT r, r2; + SetRect(&r, 0, 0, xR-TEXT_MARGIN*2, 2048); + m_text.DrawText(GetFont(TOOLTIP_FONT), str, -1, &r, DT_NOPREFIX | /*DT_SINGLELINE |*/ DT_WORDBREAK | DT_CALCRECT, 0xFFFFFFFF); + r2.bottom = yB - TEXT_MARGIN; + r2.right = xR - TEXT_MARGIN; + r2.left = r2.right - (r.right-r.left); + r2.top = r2.bottom - (r.bottom-r.top); + //m_text.DrawText(GetFont(TOOLTIP_FONT), str, -1, &r2, DT_NOPREFIX | /*DT_SINGLELINE |*/ DT_WORD_ELLIPSIS, 0xFF000000); + RECT r3 = r2; r3.left -= 4; r3.top -= 2; r3.right += 2; r3.bottom += 2; + DrawDarkTranslucentBox(&r3); + m_text.DrawText(GetFont(TOOLTIP_FONT), str, -1, &r2, DT_NOPREFIX | /*DT_SINGLELINE |*/ DT_WORDBREAK , 0xFFFFFFFF); +#endif +} + +#define MTO_UPPER_RIGHT 0 +#define MTO_UPPER_LEFT 1 +#define MTO_LOWER_RIGHT 2 +#define MTO_LOWER_LEFT 3 + +#define SelectFont(n) { \ + pFont = GetFont(n); \ + h = GetFontHeight(n); \ +} +#define MyTextOut(str, corner) { \ + SetRect(&r, 0, 0, xR-xL, 2048); \ + m_text.DrawText(pFont, str, -1, &r, DT_NOPREFIX | DT_SINGLELINE | DT_WORD_ELLIPSIS | DT_CALCRECT, 0xFFFFFFFF); \ + int w = r.right - r.left; \ + if (corner == MTO_UPPER_LEFT ) SetRect(&r, xL, *upper_left_corner_y, xL+w, *upper_left_corner_y + h); \ + else if (corner == MTO_UPPER_RIGHT) SetRect(&r, xR-w, *upper_right_corner_y, xR, *upper_right_corner_y + h); \ + else if (corner == MTO_LOWER_LEFT ) SetRect(&r, xL, *lower_left_corner_y - h, xL+w, *lower_left_corner_y); \ + else if (corner == MTO_LOWER_RIGHT) SetRect(&r, xR-w, *lower_right_corner_y - h, xR, *lower_right_corner_y); \ + m_text.DrawText(pFont, str, -1, &r, DT_NOPREFIX | DT_SINGLELINE | DT_WORD_ELLIPSIS, 0xFFFFFFFF); \ + if (corner == MTO_UPPER_LEFT ) *upper_left_corner_y += h; \ + else if (corner == MTO_UPPER_RIGHT) *upper_right_corner_y += h; \ + else if (corner == MTO_LOWER_LEFT ) *lower_left_corner_y -= h; \ + else if (corner == MTO_LOWER_RIGHT) *lower_right_corner_y -= h; \ +} + +void CPlugin::MyRenderUI( + int *upper_left_corner_y, // increment me! + int *upper_right_corner_y, // increment me! + int *lower_left_corner_y, // decrement me! + int *lower_right_corner_y, // decrement me! + int xL, + int xR + ) +{ + +#if 0 + // draw text messages directly to the back buffer. + // when you draw text into one of the four corners, + // draw the text at the current 'y' value for that corner + // (one of the first 4 params to this function), + // and then adjust that y value so that the next time + // text is drawn in that corner, it gets drawn above/below + // the previous text (instead of overtop of it). + // when drawing into the upper or lower LEFT corners, + // left-align your text to 'xL'. + // when drawing into the upper or lower RIGHT corners, + // right-align your text to 'xR'. + + // note: try to keep the bounding rectangles on the text small; + // the smaller the area that has to be locked (to draw the text), + // the faster it will be. (on some cards, drawing text is + // ferociously slow, so even if it works okay on yours, it might + // not work on another video card.) + // note: if you want some text to be on the screen often, and the text + // won't be changing every frame, please consider the poor folks + // whose video cards hate that; in that case you should probably + // draw the text just once, to a texture, and then display the + // texture each frame. This is how the help screen is done; see + // pluginshell.cpp for example code. + + RECT r; + char buf[512]; + LPD3DXFONT pFont = GetFont(DECORATIVE_FONT); + int h = GetFontHeight(DECORATIVE_FONT); + + if (!pFont) + return; + + if (!GetFont(DECORATIVE_FONT)) + return; + + // 1. render text in upper-right corner + { + // a) preset name + if (m_bShowPresetInfo) + { + SelectFont(DECORATIVE_FONT); + sprintf(buf, "%s ", m_pState->m_szDesc); + MyTextOut(buf, MTO_UPPER_RIGHT); + } + + // b) preset rating + if (m_bShowRating || GetTime() < m_fShowRatingUntilThisTime) + { + // see also: SetCurrentPresetRating() in milkdrop.cpp + SelectFont(DECORATIVE_FONT); + sprintf(buf, " Rating: %d ", (int)m_pState->m_fRating); + if (!m_bEnableRating) + strcat(buf, "[disabled] "); + MyTextOut(buf, MTO_UPPER_RIGHT); + } + + // c) fps display + if (m_bShowFPS) + { + SelectFont(DECORATIVE_FONT); + sprintf(buf, "fps: %4.2f ", GetFps()); // leave extra space @ end, so italicized fonts don't get clipped + MyTextOut(buf, MTO_UPPER_RIGHT); + } + + // d) custom timed message: + if (!m_bWarningsDisabled2 && GetTime() < m_fShowUserMessageUntilThisTime) + { + SelectFont(SIMPLE_FONT); + sprintf(buf, "%s ", m_szUserMessage); + MyTextOut(buf, MTO_UPPER_RIGHT); + } + + // e) debug information + if (m_bShowDebugInfo) + { + SelectFont(SIMPLE_FONT); + sprintf(buf, " pf monitor: %6.4f ", (float)(*m_pState->var_pf_monitor)); + MyTextOut(buf, MTO_UPPER_RIGHT); + } + } + + // 2. render text in lower-right corner + { + // waitstring tooltip: + if (m_waitstring.bActive && m_bShowMenuToolTips && m_waitstring.szToolTip[0]) + { + DrawTooltip(m_waitstring.szToolTip, xR, *lower_right_corner_y); + } + } + + // 3. render text in lower-left corner + { + char buf2[512]; + char buf3[512+1]; // add two extra spaces to end, so italicized fonts don't get clipped + + // render song title in lower-left corner: + if (m_bShowSongTitle) + { + SelectFont(DECORATIVE_FONT); + GetWinampSongTitle(GetWinampWindow(), buf, sizeof(buf)); // defined in utility.h/cpp + sprintf(buf3, "%s ", buf); + MyTextOut(buf3, MTO_LOWER_LEFT); + } + + // render song time & len above that: + if (m_bShowSongTime || m_bShowSongLen) + { + GetWinampSongPosAsText(GetWinampWindow(), buf); // defined in utility.h/cpp + GetWinampSongLenAsText(GetWinampWindow(), buf2); // defined in utility.h/cpp + if (m_bShowSongTime && m_bShowSongLen) + sprintf(buf3, "%s / %s ", buf, buf2); + else if (m_bShowSongTime) + strcpy(buf3, buf); + else + strcpy(buf3, buf2); + + SelectFont(DECORATIVE_FONT); + MyTextOut(buf3, MTO_LOWER_LEFT); + } + } + + // 4. render text in upper-left corner + { + char buf[8192*3]; // leave extra space for &->&&, and [,[,& insertion + + SelectFont(SIMPLE_FONT); + + // stuff for loading presets, menus, etc: + + if (m_waitstring.bActive) + { + // 1. draw the prompt string + MyTextOut(m_waitstring.szPrompt, MTO_UPPER_LEFT); + + // 2. reformat the waitstring text for display + int bBrackets = m_waitstring.nSelAnchorPos != -1 && m_waitstring.nSelAnchorPos != m_waitstring.nCursorPos; + int bCursorBlink = bBrackets ? 0 : ((int)(GetTime()*3.0f) % 2); + strcpy(buf, m_waitstring.szText); + + int temp_cursor_pos = m_waitstring.nCursorPos; + int temp_anchor_pos = m_waitstring.nSelAnchorPos; + + // replace &'s in the code with '&&' so they actually show up + { + char buf2[sizeof(buf)]; + int len = strlen(buf), y=0; + for (int x=0; x<=len; x++) + { + buf2[y++] = buf[x]; + if (buf[x]=='&' && (x != m_waitstring.nCursorPos || !bCursorBlink)) + { + buf2[y++] = '&'; + if (x temp_anchor_pos) ? temp_cursor_pos - 1 : temp_anchor_pos - 1; + int len = strlen(buf); + int i; + + for (i=len; i>end; i--) + buf[i+1] = buf[i]; + buf[end+1] = ']'; + len++; + + for (i=len; i>=start; i--) + buf[i+1] = buf[i]; + buf[start] = '['; + len++; + } + else + { + // underline the current cursor position by inserting an '&' + if (temp_cursor_pos == (int)strlen(buf)) + { + if (bCursorBlink) + strcat(buf, "_"); + else + strcat(buf, " "); + } + else if (bCursorBlink) + { + for (int i=strlen(buf); i>=temp_cursor_pos; i--) + buf[i+1] = buf[i]; + buf[temp_cursor_pos] = '&'; + } + } + + RECT rect; + SetRect(&rect, xL, *upper_left_corner_y, xR, *lower_left_corner_y); + rect.top += PLAYLIST_INNER_MARGIN; + rect.left += PLAYLIST_INNER_MARGIN; + rect.right -= PLAYLIST_INNER_MARGIN; + rect.bottom -= PLAYLIST_INNER_MARGIN; + + // then draw the edit string + if (m_waitstring.bDisplayAsCode) + { + char buf2[8192]; + int top_of_page_pos = 0; + + // compute top_of_page_pos so that the line the cursor is on will show. + // also compute dims of the black rectangle while we're at it. + { + int start = 0; + int pos = 0; + int ypixels = 0; + int page = 1; + int exit_on_next_page = 0; + + RECT box = rect; + box.right = box.left; + box.bottom = box.top; + + while (buf[pos] != 0) // for each line of text... (note that it might wrap) + { + start = pos; + while (buf[pos] != LINEFEED_CONTROL_CHAR && buf[pos] != 0) + pos++; + + char ch = buf[pos]; + buf[pos] = 0; + sprintf(buf2, " %s ", &buf[start]); + RECT r2 = rect; + r2.bottom = 4096; + m_text.DrawText(GetFont(SIMPLE_FONT), buf2, -1, &r2, DT_CALCRECT | DT_WORDBREAK, 0xFFFFFFFF); + int h = r2.bottom-r2.top; + ypixels += h; + buf[pos] = ch; + + if (start > m_waitstring.nCursorPos) // make sure 'box' gets updated for each line on this page + exit_on_next_page = 1; + + if (ypixels > rect.bottom-rect.top) // this line belongs on the next page + { + if (exit_on_next_page) + { + buf[start] = 0; // so text stops where the box stops, when we draw the text + break; + } + + ypixels = h; + top_of_page_pos = start; + page++; + + box = rect; + box.right = box.left; + box.bottom = box.top; + } + box.bottom += h; + box.right = max(box.right, box.left + r2.right-r2.left); + + if (buf[pos]==0) + break; + pos++; + } + + // use r2 to draw a dark box: + box.top -= PLAYLIST_INNER_MARGIN; + box.left -= PLAYLIST_INNER_MARGIN; + box.right += PLAYLIST_INNER_MARGIN; + box.bottom += PLAYLIST_INNER_MARGIN; + DrawDarkTranslucentBox(&box); + *upper_left_corner_y += box.bottom - box.top + PLAYLIST_INNER_MARGIN*3; + + sprintf(m_waitstring.szToolTip, " Page %d ", page); + } + + // display multiline (replace all character 13's with a CR) + { + int start = top_of_page_pos; + int pos = top_of_page_pos; + + while (buf[pos] != 0) + { + while (buf[pos] != LINEFEED_CONTROL_CHAR && buf[pos] != 0) + pos++; + + char ch = buf[pos]; + buf[pos] = 0; + sprintf(buf2, " %s ", &buf[start]); + DWORD color = MENU_COLOR; + if (m_waitstring.nCursorPos >= start && m_waitstring.nCursorPos <= pos) + color = MENU_HILITE_COLOR; + rect.top += m_text.DrawText(GetFont(SIMPLE_FONT), buf2, -1, &rect, DT_WORDBREAK, color); + buf[pos] = ch; + + if (rect.top > rect.bottom) + break; + + if (buf[pos] != 0) pos++; + start = pos; + } + } + // note: *upper_left_corner_y is updated above, when the dark box is drawn. + } + else + { + // display on one line + char buf2[8192]; + sprintf(buf2, " %s ", buf); + RECT box = rect; + box.bottom = 4096; + m_text.DrawText(GetFont(SIMPLE_FONT), buf2, -1, &box, DT_WORDBREAK | DT_CALCRECT, MENU_COLOR ); + + // use r2 to draw a dark box: + box.top -= PLAYLIST_INNER_MARGIN; + box.left -= PLAYLIST_INNER_MARGIN; + box.right += PLAYLIST_INNER_MARGIN; + box.bottom += PLAYLIST_INNER_MARGIN; + DrawDarkTranslucentBox(&box); + *upper_left_corner_y += box.bottom - box.top + PLAYLIST_INNER_MARGIN*3; + + m_text.DrawText(GetFont(SIMPLE_FONT), buf2, -1, &rect, DT_WORDBREAK, MENU_COLOR ); + } + } + else if (m_UI_mode == UI_MENU) + { + assert(m_pCurMenu); + SetRect(&r, xL, *upper_left_corner_y, xR, *lower_left_corner_y); + + RECT darkbox; + m_pCurMenu->DrawMenu(r, xR, *lower_right_corner_y, 1, &darkbox); + *upper_left_corner_y += darkbox.bottom - darkbox.top + PLAYLIST_INNER_MARGIN*3; + + darkbox.right += PLAYLIST_INNER_MARGIN*2; + darkbox.bottom += PLAYLIST_INNER_MARGIN*2; + DrawDarkTranslucentBox(&darkbox); + + r.top += PLAYLIST_INNER_MARGIN; + r.left += PLAYLIST_INNER_MARGIN; + r.right += PLAYLIST_INNER_MARGIN; + r.bottom += PLAYLIST_INNER_MARGIN; + m_pCurMenu->DrawMenu(r, xR, *lower_right_corner_y); + } + else if (m_UI_mode == UI_LOAD_DEL) + { + RECT rect; + SetRect(&rect, xL, *upper_left_corner_y, xR, *lower_left_corner_y); + rect.top += m_text.DrawText(GetFont(SIMPLE_FONT), "Are you SURE you want to delete this preset? [y/N]", -1, &rect, DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOPREFIX, MENU_COLOR); + sprintf(buf, "(preset to delete: %s)", m_pPresetAddr[m_nPresetListCurPos]); + rect.top += m_text.DrawText(GetFont(SIMPLE_FONT), buf, -1, &rect, DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOPREFIX, MENU_COLOR); + *upper_left_corner_y = rect.top; + } + else if (m_UI_mode == UI_SAVE_OVERWRITE) + { + RECT rect; + SetRect(&rect, xL, *upper_left_corner_y, xR, *lower_left_corner_y); + rect.top += m_text.DrawText(GetFont(SIMPLE_FONT), "This file already exists. Overwrite it? [y/N]", -1, &rect, DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOPREFIX, MENU_COLOR); + sprintf(buf, "(file in question: %s.milk)", m_waitstring.szText); + rect.top += m_text.DrawText(GetFont(SIMPLE_FONT), buf, -1, &rect, DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOPREFIX, MENU_COLOR); + *upper_left_corner_y = rect.top; + } + else if (m_UI_mode == UI_LOAD) + { + if (m_nPresets == 0) + { + // note: this error message is repeated in milkdrop.cpp in LoadRandomPreset() + sprintf(m_szUserMessage, "ERROR: No preset files found in %s*.milk", m_szPresetDir); + m_fShowUserMessageUntilThisTime = GetTime() + 6.0f; + m_UI_mode = UI_REGULAR; + } + else + { + MyTextOut("Load which preset? (arrow keys to scroll; Esc/close, Enter/select, INS/rename; DEL/delete)", MTO_UPPER_LEFT); + + RECT rect; + SetRect(&rect, xL, *upper_left_corner_y, xR, *lower_left_corner_y); + rect.top += PLAYLIST_INNER_MARGIN; + rect.left += PLAYLIST_INNER_MARGIN; + rect.right -= PLAYLIST_INNER_MARGIN; + rect.bottom -= PLAYLIST_INNER_MARGIN; + + int lines_available = (rect.bottom - rect.top - PLAYLIST_INNER_MARGIN*2) / GetFontHeight(SIMPLE_FONT); + + if (lines_available < 1) + { + // force it + rect.bottom = rect.top + GetFontHeight(SIMPLE_FONT) + 1; + lines_available = 1; + } + if (lines_available > MAX_PRESETS_PER_PAGE) + lines_available = MAX_PRESETS_PER_PAGE; + + if (m_bUserPagedDown) + { + m_nPresetListCurPos += lines_available; + if (m_nPresetListCurPos >= m_nPresets) + m_nPresetListCurPos = m_nPresets - 1; + + // remember this preset's name so the next time they hit 'L' it jumps straight to it + //strcpy(m_szLastPresetSelected, m_pPresetAddr[m_nPresetListCurPos]); + + m_bUserPagedDown = false; + } + + if (m_bUserPagedUp) + { + m_nPresetListCurPos -= lines_available; + if (m_nPresetListCurPos < 0) + m_nPresetListCurPos = 0; + + // remember this preset's name so the next time they hit 'L' it jumps straight to it + //strcpy(m_szLastPresetSelected, m_pPresetAddr[m_nPresetListCurPos]); + + m_bUserPagedUp = false; + } + + int i; + int first_line = m_nPresetListCurPos - (m_nPresetListCurPos % lines_available); + int last_line = first_line + lines_available; + char str[512], str2[512]; + + if (last_line > m_nPresets) + last_line = m_nPresets; + + // tooltip: + if (m_bShowMenuToolTips) + { + char buf[256]; + sprintf(buf, " (page %d of %d) ", m_nPresetListCurPos/lines_available+1, (m_nPresets+lines_available-1)/lines_available); + DrawTooltip(buf, xR, *lower_right_corner_y); + } + + RECT orig_rect = rect; + + RECT box; + box.top = rect.top; + box.left = rect.left; + box.right = rect.left; + box.bottom = rect.top; + + for (int pass=0; pass<2; pass++) + { + //if (pass==1) + // GetFont(SIMPLE_FONT)->Begin(); + + rect = orig_rect; + for (i=first_line; im_szDesc, str)==0) + bIsRunning = true; + } + + if (bIsRunning && m_bPresetLockedByUser) + strcat(str2, " "); + + DWORD color = bIsDir ? DIR_COLOR : PLAYLIST_COLOR_NORMAL; + if (bIsRunning) + color = bIsSelected ? PLAYLIST_COLOR_BOTH : PLAYLIST_COLOR_PLAYING_TRACK; + else if (bIsSelected) + color = PLAYLIST_COLOR_HILITE_TRACK; + + RECT r2 = rect; + rect.top += m_text.DrawText(GetFont(SIMPLE_FONT), str2, -1, &r2, DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOPREFIX | (pass==0 ? DT_CALCRECT : 0), color); + + if (pass==0) // calculating dark box + { + box.right = max(box.right, box.left + r2.right-r2.left); + box.bottom += r2.bottom-r2.top; + } + } + + //if (pass==1) + // GetFont(SIMPLE_FONT)->End(); + + if (pass==0) // calculating dark box + { + box.top -= PLAYLIST_INNER_MARGIN; + box.left -= PLAYLIST_INNER_MARGIN; + box.right += PLAYLIST_INNER_MARGIN; + box.bottom += PLAYLIST_INNER_MARGIN; + DrawDarkTranslucentBox(&box); + *upper_left_corner_y = box.bottom + PLAYLIST_INNER_MARGIN; + } + } + } + } + } + +#endif +} + +//---------------------------------------------------------------------- + +LRESULT CPlugin::MyWindowProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam) +{ +#if 0 + // You can handle Windows messages here while the plugin is running, + // such as mouse events (WM_MOUSEMOVE/WM_LBUTTONDOWN), keypresses + // (WK_KEYDOWN/WM_CHAR), and so on. + // This function is threadsafe (thanks to Winamp's architecture), + // so you don't have to worry about using semaphores or critical + // sections to read/write your class member variables. + // If you don't handle a message, let it continue on the usual path + // (to Winamp) by returning DefWindowProc(hWnd,uMsg,wParam,lParam). + // If you do handle a message, prevent it from being handled again + // (by Winamp) by returning 0. + + // IMPORTANT: For the WM_KEYDOWN, WM_KEYUP, and WM_CHAR messages, + // you must return 0 if you process the message (key), + // and 1 if you do not. DO NOT call DefWindowProc() + // for these particular messages! + + SHORT mask = 1 << (sizeof(SHORT)*8 - 1); + bool bShiftHeldDown = (GetKeyState(VK_SHIFT) & mask) != 0; + bool bCtrlHeldDown = (GetKeyState(VK_CONTROL) & mask) != 0; + + switch (uMsg) + { + + case WM_COMMAND: + { + switch (LOWORD(wParam)) { + case ID_VIS_NEXT: + LoadNextPreset(m_fBlendTimeUser); + return 0; + case ID_VIS_PREV: + LoadPreviousPreset(m_fBlendTimeUser); + return 0; + case ID_VIS_RANDOM: { + USHORT v = HIWORD(wParam) ? 1 : 0; + if (wParam >> 16 == 0xFFFF) { + SendMessage(GetWinampWindow(),WM_WA_IPC,!m_bHoldPreset,IPC_CB_VISRANDOM); + break; + } + if (!v) { + m_bHoldPreset = 1; + m_bSequentialPresetOrder = 1; + } else { + m_bHoldPreset = 0; + m_bSequentialPresetOrder = 0; + } + if (v) LoadRandomPreset(m_fBlendTimeUser); + sprintf(m_szUserMessage, "random presets %s", v ? "on" : "off"); + m_fShowUserMessageUntilThisTime = GetTime() + 4.0f; + return 0; + } + case ID_VIS_FS: + if (GetFrame() > 0) ToggleFullScreen(); + return 0; + case ID_VIS_CFG: + ToggleHelp(); + return 0; + case ID_VIS_MENU: + POINT pt; + GetCursorPos(&pt); + SendMessage(hWnd, WM_CONTEXTMENU, (int)hWnd, (pt.y << 16) | pt.x); + return 0; + } + } + + /* + case WM_SETFOCUS: + m_bOrigScrollLockState = GetKeyState(VK_SCROLL) & 1; + SetScrollLock(m_bMilkdropScrollLockState); + return DefWindowProc(hWnd, uMsg, wParam, lParam); + + case WM_KILLFOCUS: + m_bMilkdropScrollLockState = GetKeyState(VK_SCROLL) & 1; + SetScrollLock(m_bOrigScrollLockState); + return DefWindowProc(hWnd, uMsg, wParam, lParam); + */ + + case WM_CHAR: // plain & simple alphanumeric keys + if (m_waitstring.bActive) // if user is in the middle of editing a string + { + if (wParam >= ' ' && wParam <= 'z') + { + int len = strlen(m_waitstring.szText); + + if (m_waitstring.bFilterBadChars && + (wParam == '\"' || + wParam == '\\' || + wParam == '/' || + wParam == ':' || + wParam == '*' || + wParam == '?' || + wParam == '|' || + wParam == '<' || + wParam == '>' || + wParam == '&')) // NOTE: '&' is legal in filenames, but we try to avoid it since during GDI display it acts as a control code (it will not show up, but instead, underline the character following it). + { + // illegal char + strcpy(m_szUserMessage, "(illegal character)"); + m_fShowUserMessageUntilThisTime = GetTime() + 2.5f; + } + else if (len+1 >= m_waitstring.nMaxLen) + { + // m_waitstring.szText has reached its limit + strcpy(m_szUserMessage, "(string too long)"); + m_fShowUserMessageUntilThisTime = GetTime() + 2.5f; + } + else + { + m_fShowUserMessageUntilThisTime = GetTime(); // if there was an error message already, clear it + + char buf[16]; + sprintf(buf, "%c", wParam); + + if (m_waitstring.nSelAnchorPos != -1) + WaitString_NukeSelection(); + + if (m_waitstring.bOvertypeMode) + { + // overtype mode + if (m_waitstring.nCursorPos == len) + strcat(m_waitstring.szText, buf); + else + m_waitstring.szText[m_waitstring.nCursorPos] = buf[0]; + m_waitstring.nCursorPos++; + } + else + { + // insert mode: + for (int i=len; i>=m_waitstring.nCursorPos; i--) + m_waitstring.szText[i+1] = m_waitstring.szText[i]; + m_waitstring.szText[m_waitstring.nCursorPos] = buf[0]; + m_waitstring.nCursorPos++; + } + } + } + return 0; // we processed (or absorbed) the key + } + else if (m_UI_mode == UI_LOAD_DEL) // waiting to confirm file delete + { + if (wParam == 'y' || wParam == 'Y') + { + // first add pathname to filename + char szDelFile[512]; + sprintf(szDelFile, "%s%s", GetPresetDir(), m_pPresetAddr[m_nPresetListCurPos]); + + DeletePresetFile(szDelFile); + } + + m_UI_mode = UI_LOAD; + + return 0; // we processed (or absorbed) the key + } + else if (m_UI_mode == UI_SAVE_OVERWRITE) // waiting to confirm overwrite file on save + { + if (wParam == 'y' || wParam == 'Y') + { + // first add pathname + extension to filename + char szNewFile[512]; + sprintf(szNewFile, "%s%s.milk", GetPresetDir(), m_waitstring.szText); + + SavePresetAs(szNewFile); + + // exit waitstring mode + m_UI_mode = UI_REGULAR; + m_waitstring.bActive = false; + m_bPresetLockedByCode = false; + } + else if ((wParam >= ' ' && wParam <= 'z') || wParam == 27) // 27 is the ESCAPE key + { + // go back to SAVE AS mode + m_UI_mode = UI_SAVEAS; + m_waitstring.bActive = true; + } + + return 0; // we processed (or absorbed) the key + } + else // normal handling of a simple key (all non-virtual-key hotkeys end up here) + { + if (HandleRegularKey(wParam)==0) + return 0; + } + return 1; // end case WM_CHAR + + case WM_KEYDOWN: // virtual-key codes + // Note that some keys will never reach this point, since they are + // intercepted by the plugin shell (see PluginShellWindowProc(), + // at the end of pluginshell.cpp for which ones). + // For a complete list of virtual-key codes, look up the keyphrase + // "virtual-key codes [win32]" in the msdn help. + switch(wParam) + { + case VK_F2: m_bShowSongTitle = !m_bShowSongTitle; return 0; // we processed (or absorbed) the key + case VK_F3: + if (m_bShowSongTime && m_bShowSongLen) + { + m_bShowSongTime = false; + m_bShowSongLen = false; + } + else if (m_bShowSongTime && !m_bShowSongLen) + { + m_bShowSongLen = true; + } + else + { + m_bShowSongTime = true; + m_bShowSongLen = false; + } + return 0; // we processed (or absorbed) the key + case VK_F4: m_bShowPresetInfo = !m_bShowPresetInfo; return 0; // we processed (or absorbed) the key + case VK_F5: m_bShowFPS = !m_bShowFPS; return 0; // we processed (or absorbed) the key + case VK_F6: m_bShowRating = !m_bShowRating; return 0; // we processed (or absorbed) the key + case VK_F7: + if (m_nNumericInputMode == NUMERIC_INPUT_MODE_CUST_MSG) + ReadCustomMessages(); // re-read custom messages + return 0; // we processed (or absorbed) the key + case VK_F8: + { + m_UI_mode = UI_CHANGEDIR; + + // enter WaitString mode + m_waitstring.bActive = true; + m_waitstring.bFilterBadChars = false; + m_waitstring.bDisplayAsCode = false; + m_waitstring.nSelAnchorPos = -1; + m_waitstring.nMaxLen = min(sizeof(m_waitstring.szText)-1, MAX_PATH - 1); + strcpy(m_waitstring.szText, GetPresetDir()); + { + // for subtle beauty - remove the trailing '\' from the directory name (if it's not just "x:\") + int len = strlen(m_waitstring.szText); + if (len > 3 && m_waitstring.szText[len-1] == '\\') + m_waitstring.szText[len-1] = 0; + } + strcpy(m_waitstring.szPrompt, "Directory to jump to:"); + m_waitstring.szToolTip[0] = 0; + m_waitstring.nCursorPos = strlen(m_waitstring.szText); // set the starting edit position + } + return 0; // we processed (or absorbed) the key + case VK_F9: + if (bShiftHeldDown) + m_fStereoSep /= 1.08f; + else if (bCtrlHeldDown) + m_fStereoSep *= 1.08f; + else + m_pState->m_bRedBlueStereo = !m_pState->m_bRedBlueStereo; + if (m_fStereoSep < 0.1f) m_fStereoSep = 0.1f; + if (m_fStereoSep > 10) m_fStereoSep = 10; + return FALSE; + case VK_SCROLL: + //BYTE keys[256]; + //GetKeyboardState(keys); + //m_bPresetLockedByUser = (keys[VK_SCROLL] & 1) ? true : false; + m_bPresetLockedByUser = GetKeyState(VK_SCROLL) & 1; + return 0; // we processed (or absorbed) the key + //case VK_F6: break; + //case VK_F7: conflict + //case VK_F8: break; + //case VK_F9: conflict + } + + // next handle the waitstring case (for string-editing), + // then the menu navigation case, + // then handle normal case (handle the message normally or pass on to winamp) + + // case 1: waitstring mode + if (m_waitstring.bActive) + { + // handle arrow keys, home, end, etc. + + SHORT mask = 1 << (sizeof(SHORT)*8 - 1); // we want the highest-order bit + bool bShiftHeldDown = (GetKeyState(VK_SHIFT) & mask) != 0; + bool bCtrlHeldDown = (GetKeyState(VK_CONTROL) & mask) != 0; + + if (wParam == VK_LEFT || wParam == VK_RIGHT || + wParam == VK_HOME || wParam == VK_END || + wParam == VK_UP || wParam == VK_DOWN) + { + if (bShiftHeldDown) + { + if (m_waitstring.nSelAnchorPos == -1) + m_waitstring.nSelAnchorPos = m_waitstring.nCursorPos; + } + else + { + m_waitstring.nSelAnchorPos = -1; + } + } + + if (bCtrlHeldDown) // copy/cut/paste + { + switch(wParam) + { + case 'c': + case 'C': + case VK_INSERT: + WaitString_Copy(); + return 0; // we processed (or absorbed) the key + case 'x': + case 'X': + WaitString_Cut(); + return 0; // we processed (or absorbed) the key + case 'v': + case 'V': + WaitString_Paste(); + return 0; // we processed (or absorbed) the key + case VK_LEFT: WaitString_SeekLeftWord(); return 0; // we processed (or absorbed) the key + case VK_RIGHT: WaitString_SeekRightWord(); return 0; // we processed (or absorbed) the key + case VK_HOME: m_waitstring.nCursorPos = 0; return 0; // we processed (or absorbed) the key + case VK_END: m_waitstring.nCursorPos = strlen(m_waitstring.szText); return 0; // we processed (or absorbed) the key + case VK_RETURN: + if (m_waitstring.bDisplayAsCode) + { + // CTRL+ENTER accepts the string -> finished editing + //assert(m_pCurMenu); + m_pCurMenu->OnWaitStringAccept(m_waitstring.szText); + // OnWaitStringAccept calls the callback function. See the + // calls to CMenu::AddItem from milkdrop.cpp to find the + // callback functions for different "waitstrings". + m_waitstring.bActive = false; + m_UI_mode = UI_MENU; + } + return 0; // we processed (or absorbed) the key + } + } + else // waitstring mode key pressed, and ctrl NOT held down + { + switch(wParam) + { + case VK_INSERT: + m_waitstring.bOvertypeMode = !m_waitstring.bOvertypeMode; + return 0; // we processed (or absorbed) the key + + case VK_LEFT: + if (m_waitstring.nCursorPos > 0) + m_waitstring.nCursorPos--; + return 0; // we processed (or absorbed) the key + + case VK_RIGHT: + if (m_waitstring.nCursorPos < (int)strlen(m_waitstring.szText)) + m_waitstring.nCursorPos++; + return 0; // we processed (or absorbed) the key + + case VK_HOME: + m_waitstring.nCursorPos -= WaitString_GetCursorColumn(); + return 0; // we processed (or absorbed) the key + + case VK_END: + m_waitstring.nCursorPos += WaitString_GetLineLength() - WaitString_GetCursorColumn(); + return 0; // we processed (or absorbed) the key + + case VK_UP: + WaitString_SeekUpOneLine(); + return 0; // we processed (or absorbed) the key + + case VK_DOWN: + WaitString_SeekDownOneLine(); + return 0; // we processed (or absorbed) the key + + case VK_BACK: + if (m_waitstring.nSelAnchorPos != -1) + { + WaitString_NukeSelection(); + } + else if (m_waitstring.nCursorPos > 0) + { + int len = strlen(m_waitstring.szText); + for (int i=m_waitstring.nCursorPos-1; iGetCurItem()->m_lParam; + int ret; + switch(m_UI_mode) + { + case UI_IMPORT_WAVE : ret = m_pState->m_wave[i].Import("custom wave", m_waitstring.szText, 0); break; + case UI_EXPORT_WAVE : ret = m_pState->m_wave[i].Export("custom wave", m_waitstring.szText, 0); break; + case UI_IMPORT_SHAPE: ret = m_pState->m_shape[i].Import("custom shape", m_waitstring.szText, 0); break; + case UI_EXPORT_SHAPE: ret = m_pState->m_shape[i].Export("custom shape", m_waitstring.szText, 0); break; + } + + if (bImport) + m_pState->RecompileExpressions(1); + + m_fShowUserMessageUntilThisTime = GetTime() - 1.0f; // if there was an error message already, clear it + if (!ret) + { + if (m_UI_mode==UI_IMPORT_WAVE || m_UI_mode==UI_IMPORT_SHAPE) + strcpy(m_szUserMessage, "(error importing - bad filename, or file does not exist)"); + else + strcpy(m_szUserMessage, "(error exporting - bad filename, or file can not be overwritten)"); + m_fShowUserMessageUntilThisTime = GetTime() + 2.5f; + } + + m_waitstring.bActive = false; + m_UI_mode = UI_MENU; + m_bPresetLockedByCode = false; + } + else if (m_UI_mode == UI_SAVEAS) + { + // first add pathname + extension to filename + char szNewFile[512]; + sprintf(szNewFile, "%s%s.milk", GetPresetDir(), m_waitstring.szText); + + if (GetFileAttributes(szNewFile) != -1) // check if file already exists + { + // file already exists -> overwrite it? + m_waitstring.bActive = false; + m_UI_mode = UI_SAVE_OVERWRITE; + } + else + { + SavePresetAs(szNewFile); + + // exit waitstring mode + m_UI_mode = UI_REGULAR; + m_waitstring.bActive = false; + m_bPresetLockedByCode = false; + } + } + else if (m_UI_mode == UI_EDIT_MENU_STRING) + { + if (m_waitstring.bDisplayAsCode) + { + if (m_waitstring.nSelAnchorPos != -1) + WaitString_NukeSelection(); + + int len = strlen(m_waitstring.szText); + if (len + 1 < m_waitstring.nMaxLen) + { + // insert a linefeed. Use CTRL+return to accept changes in this case. + for (int pos=len+1; pos > m_waitstring.nCursorPos; pos--) + m_waitstring.szText[pos] = m_waitstring.szText[pos - 1]; + m_waitstring.szText[m_waitstring.nCursorPos++] = LINEFEED_CONTROL_CHAR; + + m_fShowUserMessageUntilThisTime = GetTime() - 1.0f; // if there was an error message already, clear it + } + else + { + // m_waitstring.szText has reached its limit + strcpy(m_szUserMessage, "(string too long)"); + m_fShowUserMessageUntilThisTime = GetTime() + 2.5f; + } + } + else + { + // finished editing + //assert(m_pCurMenu); + m_pCurMenu->OnWaitStringAccept(m_waitstring.szText); + // OnWaitStringAccept calls the callback function. See the + // calls to CMenu::AddItem from milkdrop.cpp to find the + // callback functions for different "waitstrings". + m_waitstring.bActive = false; + m_UI_mode = UI_MENU; + } + } + else if (m_UI_mode == UI_CHANGEDIR) + { + m_fShowUserMessageUntilThisTime = GetTime(); // if there was an error message already, clear it + + // change dir + char szOldDir[512]; + char szNewDir[512]; + strcpy(szOldDir, GetPresetDir()); + strcpy(szNewDir, m_waitstring.szText); + + int len = strlen(szNewDir); + if (len > 0 && szNewDir[len-1] != '\\') + strcat(szNewDir, "\\"); + + strcpy(GetPresetDir(), szNewDir); + UpdatePresetList(); + if (m_nPresets == 0) + { + // new dir. was invalid -> allow them to try again + strcpy(GetPresetDir(), szOldDir); + UpdatePresetList(); + + // give them a warning + strcpy(m_szUserMessage, "(invalid path)"); + m_fShowUserMessageUntilThisTime = GetTime() + 3.5f; + } + else + { + // success + strcpy(GetPresetDir(), szNewDir); + + // save new path to registry + WritePrivateProfileString("settings","szPresetDir",GetPresetDir(),GetConfigIniFile()); + + // set current preset index to -1 because current preset is no longer in the list + m_nCurrentPreset = -1; + + // go to file load menu + m_waitstring.bActive = false; + m_UI_mode = UI_LOAD; + } + } + return 0; // we processed (or absorbed) the key + + case VK_ESCAPE: + if (m_UI_mode == UI_LOAD_RENAME) + { + m_waitstring.bActive = false; + m_UI_mode = UI_LOAD; + } + else if ( + m_UI_mode == UI_SAVEAS || + m_UI_mode == UI_SAVE_OVERWRITE || + m_UI_mode == UI_EXPORT_SHAPE || + m_UI_mode == UI_IMPORT_SHAPE || + m_UI_mode == UI_EXPORT_WAVE || + m_UI_mode == UI_IMPORT_WAVE) + { + m_bPresetLockedByCode = false; + m_waitstring.bActive = false; + m_UI_mode = UI_REGULAR; + } + else if (m_UI_mode == UI_EDIT_MENU_STRING) + { + m_waitstring.bActive = false; + if (m_waitstring.bDisplayAsCode) // if were editing code... + m_UI_mode = UI_MENU; // return to menu + else + m_UI_mode = UI_REGULAR; // otherwise don't (we might have been editing a filename, for example) + } + else /*if (m_UI_mode == UI_EDIT_MENU_STRING || m_UI_mode == UI_CHANGEDIR || 1)*/ + { + m_waitstring.bActive = false; + m_UI_mode = UI_REGULAR; + } + return 0; // we processed (or absorbed) the key + } + } + + // don't let keys go anywhere else + return 0; // we processed (or absorbed) the key + } + + // case 2: menu is up & gets the keyboard input + if (m_UI_mode == UI_MENU) + { + //assert(m_pCurMenu); + if (m_pCurMenu->HandleKeydown(hWnd, uMsg, wParam, lParam) == 0) + return 0; // we processed (or absorbed) the key + } + + // case 3: handle non-character keys (virtual keys) and return 0. + // if we don't handle them, return 1, and the shell will + // (passing some to the shell's key bindings, some to Winamp, + // and some to DefWindowProc) + // note: regular hotkeys should be handled in HandleRegularKey. + switch(wParam) + { + case VK_LEFT: + case VK_RIGHT: + if (m_UI_mode == UI_LOAD) + { + // it's annoying when the music skips if you hit the left arrow from the Load menu, so instead, we exit the menu + if (wParam == VK_LEFT) m_UI_mode = UI_REGULAR; + return 0; // we processed (or absorbed) the key + } + break; + + case VK_ESCAPE: + if (m_UI_mode == UI_LOAD || + m_UI_mode == UI_MENU) + { + m_UI_mode = UI_REGULAR; + return 0; // we processed (or absorbed) the key + } + else if (m_UI_mode == UI_LOAD_DEL) + { + m_UI_mode = UI_LOAD; + return 0; // we processed (or absorbed) the key + } + else if (m_UI_mode == UI_SAVE_OVERWRITE) + { + m_UI_mode = UI_SAVEAS; + // return to waitstring mode, leaving all the parameters as they were before: + m_waitstring.bActive = true; + return 0; // we processed (or absorbed) the key + } + /*else if (hwnd == GetPluginWindow()) // (don't close on ESC for text window) + { + dumpmsg("User pressed ESCAPE"); + //m_bExiting = true; + PostMessage(hwnd, WM_CLOSE, 0, 0); + return 0; // we processed (or absorbed) the key + }*/ + break; + + case VK_UP: + if (m_UI_mode == UI_LOAD) + { + if (m_nPresetListCurPos > 0) + m_nPresetListCurPos--; + return 0; // we processed (or absorbed) the key + + // remember this preset's name so the next time they hit 'L' it jumps straight to it + //strcpy(m_szLastPresetSelected, m_pPresetAddr[m_nPresetListCurPos]); + } + break; + + case VK_DOWN: + if (m_UI_mode == UI_LOAD) + { + if (m_nPresetListCurPos < m_nPresets - 1) + m_nPresetListCurPos++; + return 0; // we processed (or absorbed) the key + + // remember this preset's name so the next time they hit 'L' it jumps straight to it + //strcpy(m_szLastPresetSelected, m_pPresetAddr[m_nPresetListCurPos]); + } + break; + + case VK_SPACE: + if (!m_bPresetLockedByCode) + { + LoadRandomPreset(m_fBlendTimeUser); + return 0; // we processed (or absorbed) the key + } + break; + + case VK_PRIOR: + if (m_UI_mode == UI_LOAD) + { + m_bUserPagedUp = true; + return 0; // we processed (or absorbed) the key + } + break; + case VK_NEXT: + if (m_UI_mode == UI_LOAD) + { + m_bUserPagedDown = true; + return 0; // we processed (or absorbed) the key + } + break; + case VK_HOME: + if (m_UI_mode == UI_LOAD) + { + m_nPresetListCurPos = 0; + return 0; // we processed (or absorbed) the key + } + break; + case VK_END: + if (m_UI_mode == UI_LOAD) + { + m_nPresetListCurPos = m_nPresets - 1; + return 0; // we processed (or absorbed) the key + } + break; + + case VK_DELETE: + if (m_UI_mode == UI_LOAD) + { + if (m_pPresetAddr[m_nPresetListCurPos][0] != '*') // can't delete directories + m_UI_mode = UI_LOAD_DEL; + return 0; // we processed (or absorbed) the key + } + else //if (m_nNumericInputDigits == 0) + { + if (m_nNumericInputMode == NUMERIC_INPUT_MODE_CUST_MSG) + { + m_nNumericInputDigits = 0; + m_nNumericInputNum = 0; + + // stop display of text message. + m_supertext.fStartTime = -1.0f; + return 0; // we processed (or absorbed) the key + } + else if (m_nNumericInputMode == NUMERIC_INPUT_MODE_SPRITE) + { + // kill newest sprite (regular DELETE key) + // oldest sprite (SHIFT + DELETE), + // or all sprites (CTRL + SHIFT + DELETE). + + m_nNumericInputDigits = 0; + m_nNumericInputNum = 0; + + SHORT mask = 1 << (sizeof(SHORT)*8 - 1); // we want the highest-order bit + bool bShiftHeldDown = (GetKeyState(VK_SHIFT) & mask) != 0; + bool bCtrlHeldDown = (GetKeyState(VK_CONTROL) & mask) != 0; + + if (bShiftHeldDown && bCtrlHeldDown) + { + for (int x=0; x frame) || + (bShiftHeldDown && m_texmgr.m_tex[x].nStartFrame < frame)) + { + newest = x; + frame = m_texmgr.m_tex[x].nStartFrame; + } + } + } + + if (newest != -1) + m_texmgr.KillTex(newest); + } + return 0; // we processed (or absorbed) the key + } + } + break; + + case VK_INSERT: // RENAME + if (m_UI_mode == UI_LOAD) + { + if (m_pPresetAddr[m_nPresetListCurPos][0] != '*') // can't rename directories + { + // go into RENAME mode + m_UI_mode = UI_LOAD_RENAME; + m_waitstring.bActive = true; + m_waitstring.bFilterBadChars = true; + m_waitstring.bDisplayAsCode = false; + m_waitstring.nSelAnchorPos = -1; + m_waitstring.nMaxLen = min(sizeof(m_waitstring.szText)-1, MAX_PATH - strlen(GetPresetDir()) - 6); // 6 for the extension + null char. We set this because win32 LoadFile, MoveFile, etc. barf if the path+filename+ext are > MAX_PATH chars. + + // initial string is the filename, minus the extension + strcpy(m_waitstring.szText, m_pPresetAddr[m_nPresetListCurPos]); + RemoveExtension(m_waitstring.szText); + + // set the prompt & 'tooltip' + sprintf(m_waitstring.szPrompt, "Enter the new name for \"%s\":", m_waitstring.szText); + m_waitstring.szToolTip[0] = 0; + + // set the starting edit position + m_waitstring.nCursorPos = strlen(m_waitstring.szText); + } + return 0; // we processed (or absorbed) the key + } + break; + + case VK_RETURN: + + if (m_UI_mode == UI_LOAD) + { + if (m_pPresetAddr[m_nPresetListCurPos][0] == '*') + { + // CHANGE DIRECTORY + char *p = GetPresetDir(); + + if (strcmp(m_pPresetAddr[m_nPresetListCurPos], "*..") == 0) + { + // back up one dir + char *p2 = strrchr(p, '\\'); + if (p2) + { + *p2 = 0; + p2 = strrchr(p, '\\'); + if (p2) *(p2+1) = 0; + } + } + else + { + // open subdir + strcat(p, &m_pPresetAddr[m_nPresetListCurPos][1]); + strcat(p, "\\"); + } + + WritePrivateProfileString("settings","szPresetDir",GetPresetDir(),GetConfigIniFile()); + + UpdatePresetList(); + + // set current preset index to -1 because current preset is no longer in the list + m_nCurrentPreset = -1; + } + else + { + // LOAD NEW PRESET + m_nCurrentPreset = m_nPresetListCurPos; + + // first take the filename and prepend the path. (already has extension) + char s[MAX_PATH]; + strcpy(s, GetPresetDir()); // note: m_szPresetDir always ends with '\' + strcat(s, m_pPresetAddr[m_nCurrentPreset]); + + // now load (and blend to) the new preset + LoadPreset(s, m_fBlendTimeUser); + } + return 0; // we processed (or absorbed) the key + } + break; + + case VK_BACK: + // pass on to parent + //PostMessage(m_hWndParent,message,wParam,lParam); + m_nNumericInputDigits = 0; + m_nNumericInputNum = 0; + return 0; + + case 'T': + if (bCtrlHeldDown) + { + // stop display of custom message or song title. + m_supertext.fStartTime = -1.0f; + return 0; + } + break; + case 'K': + if (bCtrlHeldDown) // kill all sprites + { + for (int x=0; x= 'A' && wParam <= 'Z') || (wParam >= 'a' && wParam <= 'z'))) + { + SeekToPreset((char)wParam); + return 0; // we processed (or absorbed) the key + } + else switch(wParam) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + int digit = wParam - '0'; + m_nNumericInputNum = (m_nNumericInputNum*10) + digit; + m_nNumericInputDigits++; + + if (m_nNumericInputDigits >= 2) + { + if (m_nNumericInputMode == NUMERIC_INPUT_MODE_CUST_MSG) + LaunchCustomMessage(m_nNumericInputNum); + else if (m_nNumericInputMode == NUMERIC_INPUT_MODE_SPRITE) + LaunchSprite(m_nNumericInputNum, -1); + else if (m_nNumericInputMode == NUMERIC_INPUT_MODE_SPRITE_KILL) + { + for (int x=0; xm_fVideoEchoZoom /= 1.05f; + return 0; // we processed (or absorbed) the key + case 'Q': + m_pState->m_fVideoEchoZoom *= 1.05f; + return 0; // we processed (or absorbed) the key + case 'w': + m_pState->m_nWaveMode++; + if (m_pState->m_nWaveMode >= NUM_WAVES) m_pState->m_nWaveMode = 0; + return 0; // we processed (or absorbed) the key + case 'W': + m_pState->m_nWaveMode--; + if (m_pState->m_nWaveMode < 0) m_pState->m_nWaveMode = NUM_WAVES - 1; + return 0; // we processed (or absorbed) the key + case 'e': + m_pState->m_fWaveAlpha -= 0.1f; + if (m_pState->m_fWaveAlpha.eval(-1) < 0.0f) m_pState->m_fWaveAlpha = 0.0f; + return 0; // we processed (or absorbed) the key + case 'E': + m_pState->m_fWaveAlpha += 0.1f; + //if (m_pState->m_fWaveAlpha.eval(-1) > 1.0f) m_pState->m_fWaveAlpha = 1.0f; + return 0; // we processed (or absorbed) the key + + case 'I': m_pState->m_fZoom -= 0.01f; return 0; // we processed (or absorbed) the key + case 'i': m_pState->m_fZoom += 0.01f; return 0; // we processed (or absorbed) the key + + case 'n': + case 'N': + m_bShowDebugInfo = !m_bShowDebugInfo; + return 0; // we processed (or absorbed) the key + + case 'r': + case 'R': + m_bHoldPreset = 0; + m_bSequentialPresetOrder = !m_bSequentialPresetOrder; + sprintf(m_szUserMessage, "preset order is now %s", (m_bSequentialPresetOrder) ? "SEQUENTIAL" : "RANDOM"); + m_fShowUserMessageUntilThisTime = GetTime() + 4.0f; + SendMessage(GetWinampWindow(),WM_WA_IPC,!m_bHoldPreset,IPC_CB_VISRANDOM); + return 0; // we processed (or absorbed) the key + + case 'x': + case 'X': + m_bHoldPreset = !m_bHoldPreset; + m_fShowUserMessageUntilThisTime = GetTime() + 4.0f; + if (m_bHoldPreset) + strcpy(m_szUserMessage, "locking preset"); + else + strcpy(m_szUserMessage, "unlocking preset"); + SendMessage(GetWinampWindow(),WM_WA_IPC,!m_bHoldPreset,IPC_CB_VISRANDOM); + return 0; + + case 'u': + case 'U': + if (SendMessage(GetWinampWindow(),WM_USER,0,250)) + sprintf(m_szUserMessage, "shuffle is now OFF"); // shuffle was on + else + sprintf(m_szUserMessage, "shuffle is now ON"); // shuffle was off + + m_fShowUserMessageUntilThisTime = GetTime() + 4.0f; + + // toggle shuffle + PostMessage(GetWinampWindow(),WM_COMMAND,40023,0); + + return 0; // we processed (or absorbed) the key + + + /* + case 'u': m_pState->m_fWarpScale /= 1.1f; break; + case 'U': m_pState->m_fWarpScale *= 1.1f; break; + case 'i': m_pState->m_fWarpAnimSpeed /= 1.1f; break; + case 'I': m_pState->m_fWarpAnimSpeed *= 1.1f; break; + */ + case 't': + case 'T': + LaunchSongTitleAnim(); + return 0; // we processed (or absorbed) the key + case 'o': m_pState->m_fWarpAmount /= 1.1f; return 0; // we processed (or absorbed) the key + case 'O': m_pState->m_fWarpAmount *= 1.1f; return 0; // we processed (or absorbed) the key + + // row 2 keys + case 'a': + m_pState->m_fVideoEchoAlpha -= 0.1f; + if (m_pState->m_fVideoEchoAlpha.eval(-1) < 0) m_pState->m_fVideoEchoAlpha = 0; + return 0; // we processed (or absorbed) the key + case 'A': + m_pState->m_fVideoEchoAlpha += 0.1f; + if (m_pState->m_fVideoEchoAlpha.eval(-1) > 1.0f) m_pState->m_fVideoEchoAlpha = 1.0f; + return 0; // we processed (or absorbed) the key + case 'd': + m_pState->m_fDecay += 0.01f; + if (m_pState->m_fDecay.eval(-1) > 1.0f) m_pState->m_fDecay = 1.0f; + return 0; // we processed (or absorbed) the key + case 'D': + m_pState->m_fDecay -= 0.01f; + if (m_pState->m_fDecay.eval(-1) < 0.9f) m_pState->m_fDecay = 0.9f; + return 0; // we processed (or absorbed) the key + case 'h': + case 'H': + // instant hard cut + LoadRandomPreset(0.0f); + m_fHardCutThresh *= 2.0f; + return 0; // we processed (or absorbed) the key + case 'f': + case 'F': + m_pState->m_nVideoEchoOrientation = (m_pState->m_nVideoEchoOrientation + 1) % 4; + return 0; // we processed (or absorbed) the key + case 'g': + m_pState->m_fGammaAdj -= 0.1f; + if (m_pState->m_fGammaAdj.eval(-1) < 0.0f) m_pState->m_fGammaAdj = 0.0f; + return 0; // we processed (or absorbed) the key + case 'G': + m_pState->m_fGammaAdj += 0.1f; + //if (m_pState->m_fGammaAdj > 1.0f) m_pState->m_fGammaAdj = 1.0f; + return 0; // we processed (or absorbed) the key + case 'j': + m_pState->m_fWaveScale *= 0.9f; + return 0; // we processed (or absorbed) the key + case 'J': + m_pState->m_fWaveScale /= 0.9f; + return 0; // we processed (or absorbed) the key + + case 'y': + case 'Y': + m_nNumericInputMode = NUMERIC_INPUT_MODE_CUST_MSG; + m_nNumericInputNum = 0; + m_nNumericInputDigits = 0; + return 0; // we processed (or absorbed) the key + case 'k': + case 'K': + { + SHORT mask = 1 << (sizeof(SHORT)*8 - 1); // we want the highest-order bit + bool bShiftHeldDown = (GetKeyState(VK_SHIFT) & mask) != 0; + + if (bShiftHeldDown) + m_nNumericInputMode = NUMERIC_INPUT_MODE_SPRITE_KILL; + else + m_nNumericInputMode = NUMERIC_INPUT_MODE_SPRITE; + m_nNumericInputNum = 0; + m_nNumericInputDigits = 0; + } + return 0; // we processed (or absorbed) the key + + // row 3/misc. keys + + case '[': + m_pState->m_fXPush -= 0.005f; + return 0; // we processed (or absorbed) the key + case ']': + m_pState->m_fXPush += 0.005f; + return 0; // we processed (or absorbed) the key + case '{': + m_pState->m_fYPush -= 0.005f; + return 0; // we processed (or absorbed) the key + case '}': + m_pState->m_fYPush += 0.005f; + return 0; // we processed (or absorbed) the key + case '<': + m_pState->m_fRot += 0.02f; + return 0; // we processed (or absorbed) the key + case '>': + m_pState->m_fRot -= 0.02f; + return 0; // we processed (or absorbed) the key + + case 's': // SAVE PRESET + case 'S': + if (m_UI_mode == UI_REGULAR) + { + m_bPresetLockedByCode = true; + m_UI_mode = UI_SAVEAS; + + // enter WaitString mode + m_waitstring.bActive = true; + m_waitstring.bFilterBadChars = true; + m_waitstring.bDisplayAsCode = false; + m_waitstring.nSelAnchorPos = -1; + m_waitstring.nMaxLen = min(sizeof(m_waitstring.szText)-1, MAX_PATH - strlen(GetPresetDir()) - 6); // 6 for the extension + null char. We set this because win32 LoadFile, MoveFile, etc. barf if the path+filename+ext are > MAX_PATH chars. + strcpy(m_waitstring.szText, m_pState->m_szDesc); // initial string is the filename, minus the extension + strcpy(m_waitstring.szPrompt, "Save as:"); + m_waitstring.szToolTip[0] = 0; + m_waitstring.nCursorPos = strlen(m_waitstring.szText); // set the starting edit position + return 0; + } + break; + + case 'l': // LOAD PRESET + case 'L': + if (m_UI_mode == UI_LOAD) + { + m_UI_mode = UI_REGULAR; + return 0; // we processed (or absorbed) the key + + } + else if ( + m_UI_mode == UI_REGULAR || + m_UI_mode == UI_MENU) + { + m_UI_mode = UI_LOAD; + m_bUserPagedUp = false; + m_bUserPagedDown = false; + return 0; // we processed (or absorbed) the key + + } + break; + + case 'm': + case 'M': + + if (m_UI_mode == UI_MENU) + m_UI_mode = UI_REGULAR; + else if (m_UI_mode == UI_REGULAR || m_UI_mode == UI_LOAD) + m_UI_mode = UI_MENU; + + return 0; // we processed (or absorbed) the key + + case '-': + SetCurrentPresetRating(m_pState->m_fRating - 1.0f); + return 0; // we processed (or absorbed) the key + case '+': + SetCurrentPresetRating(m_pState->m_fRating + 1.0f); + return 0; // we processed (or absorbed) the key + + } +#endif + return 1; +} + +//---------------------------------------------------------------------- + +void CPlugin::RefreshTab2(HWND hwnd) +{ +/* + ShowWindow(GetDlgItem(hwnd, IDC_BRIGHT_SLIDER), !m_bAutoGamma); + ShowWindow(GetDlgItem(hwnd, IDC_T1), !m_bAutoGamma); + ShowWindow(GetDlgItem(hwnd, IDC_T2), !m_bAutoGamma); + ShowWindow(GetDlgItem(hwnd, IDC_T3), !m_bAutoGamma); + ShowWindow(GetDlgItem(hwnd, IDC_T4), !m_bAutoGamma); + ShowWindow(GetDlgItem(hwnd, IDC_T5), !m_bAutoGamma); + + EnableWindow(GetDlgItem(hwnd, IDC_CB_INSTASCAN), m_bEnableRating); +*/ +} +/* +int CALLBACK MyEnumFontsProc( + CONST LOGFONT *lplf, // logical-font data + CONST TEXTMETRIC *lptm, // physical-font data + DWORD dwType, // font type + LPARAM lpData // application-defined data +) +{ + SendMessage( GetDlgItem( (HWND)lpData, IDC_FONT3), CB_ADDSTRING, 0, (LPARAM)(lplf->lfFaceName)); + return 1; +} +*/ + +/* +void DoColors(HWND hwnd, int *r, int *g, int *b) +{ + static COLORREF acrCustClr[16]; + + CHOOSECOLOR cc; + ZeroMemory(&cc, sizeof(CHOOSECOLOR)); + cc.lStructSize = sizeof(CHOOSECOLOR); + cc.hwndOwner = hwnd;//NULL;//hSaverMainWindow; + cc.Flags = CC_RGBINIT | CC_FULLOPEN; + cc.rgbResult = RGB(*r,*g,*b); + cc.lpCustColors = (LPDWORD)acrCustClr; + if (ChooseColor(&cc)) + { + *r = GetRValue(cc.rgbResult); + *g = GetGValue(cc.rgbResult); + *b = GetBValue(cc.rgbResult); + } +} +*/ +//---------------------------------------------------------------------- + +BOOL CPlugin::MyConfigTabProc(int nPage, HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) +{ +#if 0 + + // This is the only function you need to worry about for programming + // tabs 2 through 8 on the config panel. (Tab 1 contains settings + // that are common to all plugins, and the code is located in pluginshell.cpp). + // By default, only tab 2 is enabled; to enable tabes 3+, see + // 'Enabling Additional Tabs (pages) on the Config Panel' in DOCUMENTATION.TXT. + // You should always return 0 for this function. + // Note that you don't generally have to use critical sections or semaphores + // here; Winamp controls the plugin's message queue, and only gives it message + // in between frames. + // + // Incoming parameters: + // 'nPage' indicates which tab (aka 'property page') is currently showing: 2 through 5. + // 'hwnd' is the window handle of the property page (which is a dialog of its own, + // embedded in the config dialog). + // 'msg' is the windows message being sent. The main ones are: + // + // 1) WM_INITDIALOG: This means the page is being initialized, because the + // user clicked on it. When you get this message, you should initialize + // all the controls on the page, and set them to reflect the settings + // that are stored in member variables. + // + // 2) WM_DESTROY: This is sent when a tab disappears, either because another + // tab is about to be displayed, or because the user clicked OK or Cancel. + // In any case, you should read the current settings of all the controls + // on the page, and store them in member variables. (If the user clicked + // CANCEL, these values will not get saved to disk, but for simplicity, + // we always poll the controls here.) + // + // 3) WM_HELP: This is sent when the user clicks the '?' icon (in the + // titlebar of the config panel) and then clicks on a control. When you + // get this message, you should display a MessageBox telling the user + // a little bit about that control/setting. + // + // 4) WM_COMMAND: Advanced. This notifies you when the user clicks on a + // control. Use this if you need to do certain things when the user + // changes a setting. (For example, one control might only be enabled + // when a certain checkbox is enabled; you would use EnableWindow() for + // this.) + // + // For complete details on adding your own controls to one of the pages, please see + // 'Adding Controls to the Config Panel' in DOCUMENTATION.TXT. + + int t; + float val; + + if (nPage == 2) + { + switch(msg) + { + case WM_INITDIALOG: // initialize controls here + { + //-------------- texture size combo box --------------------- + char buf[2048]; + + for (int i=0; i<4; i++) + { + int size = (int)pow(2, i+8); + sprintf(buf, " %4d x %4d ", size, size); + int nPos = SendMessage( GetDlgItem( hwnd, IDC_TEXSIZECOMBO ), CB_ADDSTRING, 0, (LPARAM)buf); + SendMessage( GetDlgItem( hwnd, IDC_TEXSIZECOMBO ), CB_SETITEMDATA, nPos, size); + } + + // throw the "Auto" option in there + int nPos = SendMessage( GetDlgItem( hwnd, IDC_TEXSIZECOMBO ), CB_ADDSTRING, 0, (LPARAM)" Auto "); + SendMessage( GetDlgItem( hwnd, IDC_TEXSIZECOMBO ), CB_SETITEMDATA, nPos, -1); + + for (i=0; i<4+1; i++) + { + int size = SendMessage( GetDlgItem( hwnd, IDC_TEXSIZECOMBO ), CB_GETITEMDATA, i, 0); + if (size == m_nTexSize) + { + SendMessage( GetDlgItem( hwnd, IDC_TEXSIZECOMBO ), CB_SETCURSEL, i, 0); + } + } + + //-------------- mesh size combo box --------------------- + HWND meshcombo = GetDlgItem( hwnd, IDC_MESHSIZECOMBO ); + nPos = SendMessage(meshcombo , CB_ADDSTRING, 0, (LPARAM)" 8 x 6 FAST "); + SendMessage( meshcombo, CB_SETITEMDATA, nPos, 8); + nPos = SendMessage( meshcombo, CB_ADDSTRING, 0, (LPARAM)" 16 x 12 fast "); + SendMessage( meshcombo, CB_SETITEMDATA, nPos, 16); + nPos = SendMessage( meshcombo, CB_ADDSTRING, 0, (LPARAM)" 24 x 18 "); + SendMessage( meshcombo, CB_SETITEMDATA, nPos, 24); + nPos = SendMessage( meshcombo, CB_ADDSTRING, 0, (LPARAM)" 32 x 24 (default)"); + SendMessage( meshcombo, CB_SETITEMDATA, nPos, 32); + nPos = SendMessage( meshcombo, CB_ADDSTRING, 0, (LPARAM)" 40 x 30 "); + SendMessage( meshcombo, CB_SETITEMDATA, nPos, 40); + nPos = SendMessage( meshcombo, CB_ADDSTRING, 0, (LPARAM)" 48 x 36 slow "); + SendMessage( meshcombo, CB_SETITEMDATA, nPos, 48); + nPos = SendMessage( meshcombo, CB_ADDSTRING, 0, (LPARAM)" 64 x 48 SLOW "); + SendMessage( meshcombo, CB_SETITEMDATA, nPos, 64); + nPos = SendMessage( meshcombo, CB_ADDSTRING, 0, (LPARAM)" 80 x 60 SLOW "); + SendMessage( meshcombo, CB_SETITEMDATA, nPos, 80); + nPos = SendMessage( meshcombo, CB_ADDSTRING, 0, (LPARAM)" 96 x 72 SLOW "); + SendMessage( meshcombo, CB_SETITEMDATA, nPos, 96); + nPos = SendMessage( meshcombo, CB_ADDSTRING, 0, (LPARAM)"128 x 96 SLOW "); + SendMessage( meshcombo, CB_SETITEMDATA, nPos, 128); + // note: if you expand max. size, be sure to also raise MAX_GRID_X and MAX_GRID_Y + // in md_defines.h! + + int nCount = SendMessage( GetDlgItem( hwnd, IDC_MESHSIZECOMBO ), CB_GETCOUNT, 0, 0); + for (i=0; iiCtrlId), ctrl_name, sizeof(ctrl_name)-1); + RemoveSingleAmpersands(ctrl_name); + buf[0] = 0; + + strcpy(title, ctrl_name); + + switch(ph->iCtrlId) + { + case IDC_TEXSIZECOMBO: + case IDC_TEXSIZECOMBO_CAPTION: + strcpy(title, "Texture Size"); + strcpy(buf, + "This sets the size of the image that milkdrop uses, internally,\r" + "to drive the visuals. The bigger the value here, the crisper\r" + "the image you see. It's highly recommended that you set this\r" + "to 'auto', which will determine the ideal image (texture) size\r" + "automatically. However, if you experience visual problems (such\r" + "as black streaks or missing chunks in the image) due to low\r" + "video memory, you might want to set this to a low value (like\r" + "256x256 or 512x512)." + ); + break; + + case IDC_MESHSIZECOMBO: + case IDC_MESHSIZECOMBO_CAPTION: + strcpy(title, "Mesh Size"); + strcpy(buf, + "MilkDrop uses a mesh of polygons to warp the image each frame.\r" + "This setting determines how finely subdivided that mesh is.\r" + "A larger mesh size will mean finer resolution 'movement' in the\r" + "image; basically, it will look better. Watch out, though - \r" + "only crank this way up if you have a fast CPU." + ); + break; + + case IDC_CB_ALWAYS3D: + strcpy(buf, + "Enable this to force all presets to be displayed in 3D mode.\r" + "(Note that you need glasses with differently-colored lenses\r" + " to see the effect.)" + ); + break; + case IDC_CB_INSTASCAN: + strcpy(title, "Scan presets instantly"); + strcpy(buf, + "Check this to scan all preset ratings instantly, at startup or when\r" + "the directory changes. Normally, they are scanned in the background,\r" + "one per frame, until all of them are read in. If you'd like to read\r" + "them all in instantly, to alleviate those few seconds of disk grinding,\r" + "check this box; but be warned that it will create a short pause at\r" + "startup or when you change directories.\r" + "\r" + "NOTE: this only applies if the preset rating system is enabled." + ); + break; + case IDC_CB_NORATING: + strcpy(title, "Disable preset rating"); + strcpy(buf, + "Check this to turn off the preset rating system. This means that\r" + "at startup, or whenever you change the preset directory, there is\r" + "less likely to be a slowdown (usually a few seconds of disk activity)\r" + "while milkdrop scans all the presets to extract their ratings (if\r" + "instant scanning is off); or a short pause while it does this (if\r" + "instant scanning is on)." + ); + break; + case IDC_CB_NOWARN: + strcpy(buf, + "Check this to disable warning messageboxes at startup." + ); + break; + case IDC_CB_NOWARN2: + strcpy(buf, + "Check this to disable any & all warning messages that appear in the\r" + "upper-right corner of the screen." + ); + break; + case IDC_CB_ANISO: + strcpy(title, "Use anisotropic filtering"); + strcpy(buf, + "Check this to try to use an advanced form \r" + "of interpolation whenwarping the image each frame." + ); + break; + case IDC_CB_SCROLLON: + strcpy(title, "Start with preset lock ON"); + strcpy(buf, + "Check this to make MilkDrop automatically start in 'preset lock' mode,\r" + "meaning that the preset will not change until the user changes it\r" + "manually (either by pressing SPACE, hitting H for a hard cut, or by\r" + "selecting a new preset from the 'L'oad menu).\r" + "\r" + "Use the SCROLL LOCK key while MilkDrop is running to toggle the preset\r" + "lock on or off. When the SCROLL LOCK light is on, that means that the\r" + "preset lock is also on, and vice versa." + ); + break; + + case IDC_BRIGHT_SLIDER: + case IDC_BRIGHT_SLIDER_BOX: + case IDC_T1: + case IDC_T2: + case IDC_T3: + case IDC_T4: + case IDC_T5: + strcpy(buf, + "The brightness slider lets you control the overall brightness\r" + "of the image. If the image is continually washed out to bright\r" + "purple or white, you'll want to crank this down to (probably) zero.\r" + "If the image is chronically dark, crank this up.\r" + "\r" + "Note that the slider is not visible when the nearby 'guess'\r" + "checkbox is checked. Uncheck it to manually set the brightness.\r" + "\r" + "Also note that this brightness adjustment is only a concern in\r" + "16-bit color modes. (32-bit doesn't have this problem.) So,\r" + "if you're running Windows in 16-bit color, this slider will affect\r" + "windowed, desktop, and 'fake' fullscreen modes. And if you've\r" + "selected a 16-bit fullscreen display mode, it will affect that\r" + "too." + ); + break; + + case IDC_CB_AUTOGAMMA: + strcpy(buf, + "Check this option to ask milkdrop to make an educated guess\r" + "for the 'brightness control for 16-bit color' setting, based\r" + "on the vendor of your video card. This usually gets it, but\r" + "not always.\r" + "\r" + "The slider is only visible when this option is unchecked.\r" + "\r" + "See the help for the slider for more information." + ); + break; + + case ID_SPRITE: + strcpy(buf, + "Click this button to edit milk_img.ini, the file that defines\r" + "all of the custom sprites you can invoke for display while\r" + "milkdrop is running. A sprite is an image that you can fade\r" + "in or our, move around, and so on." + ); + break; + case ID_MSG: + strcpy(buf, + "Click this button to edit milk_msg.ini, the file that you can\r" + "configure to set up custom overlaid text messages that you can\r" + "display while milkdrop is running." + ); + break; + } + + if (buf[0]) + MessageBox(hwnd, buf, title, MB_OK|MB_SETFOREGROUND|MB_TOPMOST|MB_TASKMODAL); + } + break; // case WM_HELP + } + } + else if (nPage==3) + { + switch(msg) + { + case WM_INITDIALOG: + { + char buf[2048]; + + sprintf(buf, " %3.2f", m_fStereoSep); + SetWindowText( GetDlgItem( hwnd, IDC_3DSEP ), buf ); + + sprintf(buf, " %2.1f", m_fSongTitleAnimDuration); + SetWindowText( GetDlgItem( hwnd, IDC_SONGTITLEANIM_DURATION ), buf ); + sprintf(buf, " %2.1f", m_fTimeBetweenRandomSongTitles); + SetWindowText( GetDlgItem( hwnd, IDC_RAND_TITLE ), buf ); + sprintf(buf, " %2.1f", m_fTimeBetweenRandomCustomMsgs); + SetWindowText( GetDlgItem( hwnd, IDC_RAND_MSG ), buf ); + + CheckDlgButton(hwnd, IDC_CB_TITLE_ANIMS, m_bSongTitleAnims); + } + break; + case WM_COMMAND: + if (LOWORD(wParam)==IDLEFT) + DoColors(hwnd, &m_cLeftEye3DColor[0], &m_cLeftEye3DColor[1], &m_cLeftEye3DColor[2]); + if (LOWORD(wParam)==IDRIGHT) + DoColors(hwnd, &m_cRightEye3DColor[0], &m_cRightEye3DColor[1], &m_cRightEye3DColor[2]); + break; + case WM_DESTROY: + { + char buf[2048]; + + GetWindowText( GetDlgItem( hwnd, IDC_3DSEP ), buf, sizeof(buf)); + if (sscanf(buf, "%f", &val) == 1) + m_fStereoSep = val; + + GetWindowText( GetDlgItem( hwnd, IDC_SONGTITLEANIM_DURATION ), buf, sizeof(buf)); + if (sscanf(buf, "%f", &val) == 1) + m_fSongTitleAnimDuration = val; + GetWindowText( GetDlgItem( hwnd, IDC_RAND_TITLE ), buf, sizeof(buf)); + if (sscanf(buf, "%f", &val) == 1) + m_fTimeBetweenRandomSongTitles = val; + GetWindowText( GetDlgItem( hwnd, IDC_RAND_MSG ), buf, sizeof(buf)); + if (sscanf(buf, "%f", &val) == 1) + m_fTimeBetweenRandomCustomMsgs = val; + + m_bSongTitleAnims = DlgItemIsChecked(hwnd, IDC_CB_TITLE_ANIMS); + } + break; + case WM_HELP: // give help box for controls here + if (lParam) + { + HELPINFO *ph = (HELPINFO*)lParam; + char title[256], buf[2048], ctrl_name[256]; + GetWindowText(GetDlgItem(hwnd, ph->iCtrlId), ctrl_name, sizeof(ctrl_name)-1); + RemoveSingleAmpersands(ctrl_name); + buf[0] = 0; + + strcpy(title, ctrl_name); + + switch(ph->iCtrlId) + { + case IDLEFT: + sprintf(buf, + "Click this button to tell milkdrop the color of the %s-eye lens\r" + "of your colored 3D glasses. If the color selected here doesn't match\r" + "the color of the lens, you won't be able to perceive depth when\r" + "running presets in 3D.", "left" + ); + break; + + case IDRIGHT: + sprintf(buf, + "Click this button to tell milkdrop the color of the %s-eye lens\r" + "of your colored 3D glasses. If the color selected here doesn't match\r" + "the color of the lens, you won't be able to perceive depth when\r" + "running presets in 3D.", "right" + ); + break; + + case IDC_3DSEP: + case IDC_3DSEP_LABEL: + GetWindowText(GetDlgItem(hwnd, IDC_3DSEP_LABEL), title, sizeof(title)-1); + strcpy(buf, + "Change this value to adjust the degree of depth perceived when\r" + "running milkdrop presets in 3D mode. 1.0 is the default; higher\r" + "values will exaggerate the perception of depth , but go too far\r" + "and the illusion of depth will be shattered. Values between 0\r" + "and 1 will decrease the depth perception. The ideal value depends\r" + "on the distance between you and your display (be it a monitor or\r" + "a projector screen) and the size of the display.\r" + "\r" + "The value of 1.0 is normalized to work well for most desktop\r" + "displays; if you're projecting milkdrop onto a wall or screen\r" + "for a crowd, you should DEFINITELY experiment with this value.\r" + "\r" + "Note that you can also change this value while milkdrop is running;\r" + "hit F1 (at runtime) for help on which keys will accomplish this." + ); + break; + + case IDC_SONGTITLEANIM_DURATION: + case IDC_SONGTITLEANIM_DURATION_LABEL: + GetWindowText(GetDlgItem(hwnd, IDC_SONGTITLEANIM_DURATION_LABEL), title, sizeof(title)-1); + strcpy(buf, + "The duration, in seconds, of song title animations." + ); + break; + + case IDC_RAND_TITLE: + case IDC_RAND_TITLE_LABEL: + GetWindowText(GetDlgItem(hwnd, IDC_RAND_TITLE_LABEL), title, sizeof(title)-1); + strcpy(buf, + "The mean (average) time, in seconds, between randomly-launched\r" + "song title animations. Set to a negative value to disable random\r" + "launching." + ); + break; + + case IDC_RAND_MSG: + case IDC_RAND_MSG_LABEL: + GetWindowText(GetDlgItem(hwnd, IDC_RAND_MSG_LABEL), title, sizeof(title)-1); + strcpy(buf, + "The mean (average) time, in seconds, between randomly-launched\r" + "custom messages (from milk_msg.ini). Set to a negative value\r" + "to disable random launching." + ); + break; + + case IDC_CB_TITLE_ANIMS: + strcpy(buf, + "Check this to automatically launch song title animations whenever\r" + "the track changes." + ); + break; + } + + if (buf[0]) + MessageBox(hwnd, buf, title, MB_OK|MB_SETFOREGROUND|MB_TOPMOST|MB_TASKMODAL); + } + break; // case WM_HELP + } + } + else if (nPage==4) + { + switch(msg) + { + case WM_INITDIALOG: + { + char buf[2048]; + + // soft cuts + sprintf(buf, " %2.1f", m_fTimeBetweenPresets); + SetWindowText( GetDlgItem( hwnd, IDC_BETWEEN_TIME ), buf ); + sprintf(buf, " %2.1f", m_fTimeBetweenPresetsRand); + SetWindowText( GetDlgItem( hwnd, IDC_BETWEEN_TIME_RANDOM ), buf ); + sprintf(buf, " %2.1f", m_fBlendTimeUser); + SetWindowText( GetDlgItem( hwnd, IDC_BLEND_USER ), buf ); + sprintf(buf, " %2.1f", m_fBlendTimeAuto); + SetWindowText( GetDlgItem( hwnd, IDC_BLEND_AUTO ), buf ); + + // hard cuts + sprintf(buf, " %2.1f", m_fHardCutHalflife); + SetWindowText( GetDlgItem( hwnd, IDC_HARDCUT_BETWEEN_TIME ), buf ); + + int n = (int)((m_fHardCutLoudnessThresh - 1.25f) * 10.0f); + if (n<0) n = 0; + if (n>20) n = 20; + SendMessage( GetDlgItem( hwnd, IDC_HARDCUT_LOUDNESS), TBM_SETRANGEMIN, FALSE, (LPARAM)(0) ); + SendMessage( GetDlgItem( hwnd, IDC_HARDCUT_LOUDNESS), TBM_SETRANGEMAX, FALSE, (LPARAM)(20) ); + SendMessage( GetDlgItem( hwnd, IDC_HARDCUT_LOUDNESS), TBM_SETPOS, TRUE, (LPARAM)(n) ); + + CheckDlgButton(hwnd, IDC_CB_HARDCUTS, m_bHardCutsDisabled); + } + break; + case WM_DESTROY: + { + char buf[2048]; + + // soft cuts + GetWindowText( GetDlgItem( hwnd, IDC_BETWEEN_TIME ), buf, sizeof(buf)); + if (sscanf(buf, "%f", &val) == 1) + m_fTimeBetweenPresets = val; + GetWindowText( GetDlgItem( hwnd, IDC_BETWEEN_TIME_RANDOM ), buf, sizeof(buf)); + if (sscanf(buf, "%f", &val) == 1) + m_fTimeBetweenPresetsRand = val; + GetWindowText( GetDlgItem( hwnd, IDC_BLEND_AUTO ), buf, sizeof(buf)); + if (sscanf(buf, "%f", &val) == 1) + m_fBlendTimeAuto = val; + GetWindowText( GetDlgItem( hwnd, IDC_BLEND_USER ), buf, sizeof(buf)); + if (sscanf(buf, "%f", &val) == 1) + m_fBlendTimeUser = val; + + // hard cuts + GetWindowText( GetDlgItem( hwnd, IDC_HARDCUT_BETWEEN_TIME ), buf, sizeof(buf)); + if (sscanf(buf, "%f", &val) == 1) + m_fHardCutHalflife = val; + + t = SendMessage( GetDlgItem( hwnd, IDC_HARDCUT_LOUDNESS ), TBM_GETPOS, 0, 0); + if (t != CB_ERR) m_fHardCutLoudnessThresh = 1.25f + t/10.0f; + + m_bHardCutsDisabled = DlgItemIsChecked(hwnd, IDC_CB_HARDCUTS); + } + break; + case WM_HELP: + if (lParam) + { + HELPINFO *ph = (HELPINFO*)lParam; + char title[256], buf[2048], ctrl_name[256]; + GetWindowText(GetDlgItem(hwnd, ph->iCtrlId), ctrl_name, sizeof(ctrl_name)-1); + RemoveSingleAmpersands(ctrl_name); + buf[0] = 0; + + strcpy(title, ctrl_name); + + switch(ph->iCtrlId) + { + case IDC_BETWEEN_TIME: + case IDC_BETWEEN_TIME_LABEL: + GetWindowText(GetDlgItem(hwnd, IDC_BETWEEN_TIME_LABEL), title, sizeof(title)-1); + strcpy(buf, + "The minimum amount of time that elapses between preset changes\r" + "(excluding hard cuts, which take priority). The old preset will\r" + "begin to blend or fade into a new preset after this amount of time,\r" + "plus some random amount of time as specified below in the\r" + "'additional random time' box. Add these two values together to\r" + "get the maximum amount of time that will elapse between preset\r" + "changes." + ); + break; + + case IDC_BETWEEN_TIME_RANDOM: + case IDC_BETWEEN_TIME_RANDOM_LABEL: + GetWindowText(GetDlgItem(hwnd, IDC_BETWEEN_TIME_RANDOM_LABEL), title, sizeof(title)-1); + strcpy(buf, + "The additional random maximum # of seconds between preset fades\r" + "(aka preset changes) (aka soft cuts)." + ); + break; + + case IDC_BLEND_AUTO: + case IDC_BLEND_AUTO_LABEL: + GetWindowText(GetDlgItem(hwnd, IDC_BLEND_AUTO_LABEL), title, sizeof(title)-1); + strcpy(buf, + "The duration, in seconds, of a soft cut (a normal fade from one preset\r" + "to another) that is initiated because some amount of time has passed.\r" + "A value less than 1 will make for a very quick transition, while a value\r" + "around 3 or 4 will allow you to see some interesting behavior during\r" + "the blend." + ); + break; + + case IDC_BLEND_USER: + case IDC_BLEND_USER_LABEL: + GetWindowText(GetDlgItem(hwnd, IDC_BLEND_USER_LABEL), title, sizeof(title)-1); + strcpy(buf, + "The duration, in seconds, of a soft cut (a normal fade from one preset\r" + "to another) that is initiated by you, when you press the 'H' key (for\r" + "a Hard cut). A value less than 1 will make for a very quick transition,\r" + "while a value around 3 or 4 will allow you to see some interesting behavior\r" + "during the blend." + ); + break; + + case IDC_HARDCUT_BETWEEN_TIME: + case IDC_HARDCUT_BETWEEN_TIME_LABEL: + GetWindowText(GetDlgItem(hwnd, IDC_HARDCUT_BETWEEN_TIME_LABEL), title, sizeof(title)-1); + strcpy(buf, + "The amount of time, in seconds, between hard cuts. Hard cuts are\r" + "set off by loud beats in the music, with (ideally) about this much\r" + "time in between them." + ); + break; + + case IDC_HARDCUT_LOUDNESS: + case IDC_HARDCUT_LOUDNESS_LABEL: + case IDC_HARDCUT_LOUDNESS_MIN: + case IDC_HARDCUT_LOUDNESS_MAX: + GetWindowText(GetDlgItem(hwnd, IDC_HARDCUT_LOUDNESS_LABEL), title, sizeof(title)-1); + strcpy(buf, + "Use this slider to adjust the sensitivity of the beat detection\r" + "algorithm used to detect the beats that cause hard cuts. A value\r" + "close to 'min' will cause the algorithm to be very sensitive (so\r" + "even small beats will trigger it); a value close to 'max' will\r" + "cause only the largest beats to trigger it." + ); + break; + + case IDC_CB_HARDCUTS: + strcpy(buf, + "Check this to disable hard cuts; a loud beat\r" + "will never cause the preset to change." + ); + break; + + } + + if (buf[0]) + MessageBox(hwnd, buf, title, MB_OK|MB_SETFOREGROUND|MB_TOPMOST|MB_TASKMODAL); + } + break; + } + } +#endif 0 + + return false; +} + +//---------------------------------------------------------------------- + +void CPlugin::Randomize() +{ + srand((int)(GetTime()*100)); + //m_fAnimTime = (rand() % 51234L)*0.01f; + m_fRandStart[0] = (rand() % 64841L)*0.01f; + m_fRandStart[1] = (rand() % 53751L)*0.01f; + m_fRandStart[2] = (rand() % 42661L)*0.01f; + m_fRandStart[3] = (rand() % 31571L)*0.01f; + + //CState temp; + //temp.Randomize(rand() % NUM_MODES); + //m_pState->StartBlend(&temp, m_fAnimTime, m_fBlendTimeUser); +} + +//---------------------------------------------------------------------- + +void CPlugin::BuildMenus() +{ +#if 0 + char buf[1024]; + + m_pCurMenu = &m_menuPreset;//&m_menuMain; + + m_menuPreset .Init("--edit current preset"); + m_menuMotion .Init("--MOTION"); + m_menuCustomShape.Init("--drawing: custom shapes"); + m_menuCustomWave .Init("--drawing: custom waves"); + m_menuWave .Init("--drawing: simple waveform"); + m_menuAugment .Init("--drawing: borders, motion vectors"); + m_menuPost .Init("--post-processing, misc."); + for (int i=0; im_szPerFrameInit, MENUITEMTYPE_STRING, + "read-only: zoom, rot, warp, cx, cy, dx, dy, sx, sy; decay, gamma;\r" + " echo_zoom, echo_scale, echo_orient;\r" + " ib_{size|r|g|b|a}, ob_{size|r|g|b|a}, mv_{x|y|dx|dy|l|r|g|b|a};\r" + " wave_{r|g|b|a|x|y|mode|mystery|usedots|thick|additive|brighten};\r" + " darken_center, wrap; invert, brighten, darken, solarize\r" + " time, fps, frame, progress; {bass|mid|treb}[_att]\r" + "write: q1-q8, monitor" + , 256, 0, &OnUserEditedPresetInit); + m_menuPreset.AddItem("[ edit per_frame equations ]", &m_pState->m_szPerFrameExpr, MENUITEMTYPE_STRING, + "read-only: time, fps, frame, progress; {bass|mid|treb}[_att]\r" + "read/write: zoom, rot, warp, cx, cy, dx, dy, sx, sy; q1-q8; monitor\r" + " mv_{x|y|dx|dy|l|r|g|b|a}, ib_{size|r|g|b|a}, ob_{size|r|g|b|a};\r" + " wave_{r|g|b|a|x|y|mode|mystery|usedots|thick|additive|brighten};\r" + " darken_center, wrap; invert, brighten, darken, solarize\r" + " decay, gamma, echo_zoom, echo_alpha, echo_orient" + , 256, 0, &OnUserEditedPerFrame); + m_menuPreset.AddItem("[ edit per_pixel equations ]", &m_pState->m_szPerPixelExpr, MENUITEMTYPE_STRING, + "read-only: x, y, rad, ang; time, fps, frame, progress; {bass|mid|treb}[_att]\r" + "read/write: dx, dy, zoom, rot, warp, cx, cy, sx, sy, q1-q8" + , 256, 0, &OnUserEditedPerPixel); + + + //------------------------------------------- + + // menu items + m_menuWave.AddItem("wave type", &m_pState->m_nWaveMode, MENUITEMTYPE_INT, "each value represents a different way of drawing the waveform", 0, NUM_WAVES-1); + m_menuWave.AddItem("size", &m_pState->m_fWaveScale, MENUITEMTYPE_LOGBLENDABLE, "relative size of the waveform"); + m_menuWave.AddItem("smoothing", &m_pState->m_fWaveSmoothing,MENUITEMTYPE_BLENDABLE, "controls the smoothness of the waveform; 0=natural sound data (no smoothing), 0.9=max. smoothing", 0.0f, 0.9f); + m_menuWave.AddItem("mystery parameter", &m_pState->m_fWaveParam, MENUITEMTYPE_BLENDABLE, "what this one does is a secret (actually, its effect depends on the 'wave type'", -1.0f, 1.0f); + m_menuWave.AddItem("position (X)", &m_pState->m_fWaveX, MENUITEMTYPE_BLENDABLE, "position of the waveform: 0 = far left edge of screen, 0.5 = center, 1 = far right", 0, 1); + m_menuWave.AddItem("position (Y)", &m_pState->m_fWaveY, MENUITEMTYPE_BLENDABLE, "position of the waveform: 0 = very bottom of screen, 0.5 = center, 1 = top", 0, 1); + m_menuWave.AddItem("color (red)", &m_pState->m_fWaveR, MENUITEMTYPE_BLENDABLE, "amount of red color in the wave (0..1)", 0, 1); + m_menuWave.AddItem("color (green)", &m_pState->m_fWaveG, MENUITEMTYPE_BLENDABLE, "amount of green color in the wave (0..1)", 0, 1); + m_menuWave.AddItem("color (blue)", &m_pState->m_fWaveB, MENUITEMTYPE_BLENDABLE, "amount of blue color in the wave (0..1)", 0, 1); + m_menuWave.AddItem("opacity", &m_pState->m_fWaveAlpha, MENUITEMTYPE_LOGBLENDABLE, "opacity of the waveform; lower numbers = more transparent", 0.001f, 100.0f); + m_menuWave.AddItem("use dots", &m_pState->m_bWaveDots, MENUITEMTYPE_BOOL, "if true, the waveform is drawn as dots (instead of lines)"); + m_menuWave.AddItem("draw thick", &m_pState->m_bWaveThick, MENUITEMTYPE_BOOL, "if true, the waveform's lines (or dots) are drawn with double thickness"); + m_menuWave.AddItem("modulate opacity by volume", &m_pState->m_bModWaveAlphaByVolume, MENUITEMTYPE_BOOL, "if true, the waveform opacity is affected by the music's volume"); + m_menuWave.AddItem("modulation: transparent volume", &m_pState->m_fModWaveAlphaStart, MENUITEMTYPE_BLENDABLE, "when the relative volume hits this level, the wave becomes transparent. 1 = normal loudness, 0.5 = extremely quiet, 1.5 = extremely loud", 0.0f, 2.0f); + m_menuWave.AddItem("modulation: opaque volume", &m_pState->m_fModWaveAlphaEnd, MENUITEMTYPE_BLENDABLE, "when the relative volume hits this level, the wave becomes opaque. 1 = normal loudness, 0.5 = extremely quiet, 1.5 = extremely loud", 0.0f, 2.0f); + m_menuWave.AddItem("additive drawing", &m_pState->m_bAdditiveWaves, MENUITEMTYPE_BOOL, "if true, the wave is drawn additively, saturating the image at white"); + m_menuWave.AddItem("color brightening", &m_pState->m_bMaximizeWaveColor, MENUITEMTYPE_BOOL, "if true, the red, green, and blue color components will be scaled up until at least one of them reaches 1.0"); + + m_menuAugment.AddItem("outer border thickness" ,&m_pState->m_fOuterBorderSize, MENUITEMTYPE_BLENDABLE, "thickness of the outer border drawn at the edges of the screen", 0, 0.5f); + m_menuAugment.AddItem(" color (red)" ,&m_pState->m_fOuterBorderR , MENUITEMTYPE_BLENDABLE, "amount of red color in the outer border", 0, 1); + m_menuAugment.AddItem(" color (green)" ,&m_pState->m_fOuterBorderG , MENUITEMTYPE_BLENDABLE, "amount of green color in the outer border", 0, 1); + m_menuAugment.AddItem(" color (blue)" ,&m_pState->m_fOuterBorderB , MENUITEMTYPE_BLENDABLE, "amount of blue color in the outer border", 0, 1); + m_menuAugment.AddItem(" opacity" ,&m_pState->m_fOuterBorderA , MENUITEMTYPE_BLENDABLE, "opacity of the outer border (0=transparent, 1=opaque)", 0, 1); + m_menuAugment.AddItem("inner border thickness" ,&m_pState->m_fInnerBorderSize, MENUITEMTYPE_BLENDABLE, "thickness of the inner border drawn at the edges of the screen", 0, 0.5f); + m_menuAugment.AddItem(" color (red)" ,&m_pState->m_fInnerBorderR , MENUITEMTYPE_BLENDABLE, "amount of red color in the inner border", 0, 1); + m_menuAugment.AddItem(" color (green)" ,&m_pState->m_fInnerBorderG , MENUITEMTYPE_BLENDABLE, "amount of green color in the inner border", 0, 1); + m_menuAugment.AddItem(" color (blue)" ,&m_pState->m_fInnerBorderB , MENUITEMTYPE_BLENDABLE, "amount of blue color in the inner border", 0, 1); + m_menuAugment.AddItem(" opacity" ,&m_pState->m_fInnerBorderA , MENUITEMTYPE_BLENDABLE, "opacity of the inner border (0=transparent, 1=opaque)", 0, 1); + m_menuAugment.AddItem("motion vector opacity" ,&m_pState->m_fMvA , MENUITEMTYPE_BLENDABLE, "opacity of the motion vectors (0=transparent, 1=opaque)", 0, 1); + m_menuAugment.AddItem(" num. mot. vectors (X)" ,&m_pState->m_fMvX , MENUITEMTYPE_BLENDABLE, "the number of motion vectors on the x-axis", 0, 64); + m_menuAugment.AddItem(" num. mot. vectors (Y)" ,&m_pState->m_fMvY , MENUITEMTYPE_BLENDABLE, "the number of motion vectors on the y-axis", 0, 48); + m_menuAugment.AddItem(" offset (X)" ,&m_pState->m_fMvDX , MENUITEMTYPE_BLENDABLE, "horizontal placement offset of the motion vectors", -1, 1); + m_menuAugment.AddItem(" offset (Y)" ,&m_pState->m_fMvDY , MENUITEMTYPE_BLENDABLE, "vertical placement offset of the motion vectors", -1, 1); + m_menuAugment.AddItem(" trail length" ,&m_pState->m_fMvL , MENUITEMTYPE_BLENDABLE, "the length of the motion vectors (1=normal)", 0, 5); + m_menuAugment.AddItem(" color (red)" ,&m_pState->m_fMvR , MENUITEMTYPE_BLENDABLE, "amount of red color in the motion vectors", 0, 1); + m_menuAugment.AddItem(" color (green)" ,&m_pState->m_fMvG , MENUITEMTYPE_BLENDABLE, "amount of green color in the motion vectors", 0, 1); + m_menuAugment.AddItem(" color (blue)" ,&m_pState->m_fMvB , MENUITEMTYPE_BLENDABLE, "amount of blue color in the motion vectors", 0, 1); + + m_menuMotion.AddItem("zoom amount", &m_pState->m_fZoom, MENUITEMTYPE_LOGBLENDABLE, "controls inward/outward motion. 0.9=zoom out, 1.0=no zoom, 1.1=zoom in"); + m_menuMotion.AddItem(" zoom exponent", &m_pState->m_fZoomExponent, MENUITEMTYPE_LOGBLENDABLE, "controls the curvature of the zoom; 1=normal"); + m_menuMotion.AddItem("warp amount", &m_pState->m_fWarpAmount, MENUITEMTYPE_LOGBLENDABLE, "controls the magnitude of the warping; 0=none, 1=normal, 2=major warping..."); + m_menuMotion.AddItem(" warp scale", &m_pState->m_fWarpScale, MENUITEMTYPE_LOGBLENDABLE, "controls the wavelength of the warp; 1=normal, less=turbulent, more=smoother"); + m_menuMotion.AddItem(" warp speed", &m_pState->m_fWarpAnimSpeed,MENUITEMTYPE_LOGFLOAT, "controls the speed of the warp; 1=normal, less=slower, more=faster"); + m_menuMotion.AddItem("rotation amount", &m_pState->m_fRot, MENUITEMTYPE_BLENDABLE, "controls the amount of rotation. 0=none, 0.1=slightly right, -0.1=slightly clockwise, 0.1=CCW", -1.00f, 1.00f); + m_menuMotion.AddItem(" rot., center of (X)",&m_pState->m_fRotCX, MENUITEMTYPE_BLENDABLE, "controls where the center of rotation is, horizontally. 0=left, 0.5=center, 1=right", -1.0f, 2.0f); + m_menuMotion.AddItem(" rot., center of (Y)",&m_pState->m_fRotCY, MENUITEMTYPE_BLENDABLE, "controls where the center of rotation is, vertically. 0=top, 0.5=center, 1=bottom", -1.0f, 2.0f); + m_menuMotion.AddItem("translation (X)", &m_pState->m_fXPush, MENUITEMTYPE_BLENDABLE, "controls amount of constant horizontal motion; -0.01 = slight shift right, 0=none, 0.01 = to left", -1.0f, 1.0f); + m_menuMotion.AddItem("translation (Y)", &m_pState->m_fYPush, MENUITEMTYPE_BLENDABLE, "controls amount of constant vertical motion; -0.01 = slight shift downward, 0=none, 0.01 = upward", -1.0f, 1.0f); + m_menuMotion.AddItem("scaling (X)", &m_pState->m_fStretchX, MENUITEMTYPE_LOGBLENDABLE, "controls amount of constant horizontal stretching; 0.99=shrink, 1=normal, 1.01=stretch"); + m_menuMotion.AddItem("scaling (Y)", &m_pState->m_fStretchY, MENUITEMTYPE_LOGBLENDABLE, "controls amount of constant vertical stretching; 0.99=shrink, 1=normal, 1.01=stretch"); + + m_menuPost.AddItem("sustain level", &m_pState->m_fDecay, MENUITEMTYPE_BLENDABLE, "controls the eventual fade to black; 1=no fade, 0.9=strong fade; 0.98=recommended.", 0.50f, 1.0f); + m_menuPost.AddItem("darken center", &m_pState->m_bDarkenCenter, MENUITEMTYPE_BOOL, "when ON, help keeps the image from getting too bright by continually dimming the center point"); + m_menuPost.AddItem("gamma adjustment", &m_pState->m_fGammaAdj, MENUITEMTYPE_BLENDABLE, "controls brightness; 1=normal, 2=double, 3=triple, etc.", 1.0f, 8.0f); + m_menuPost.AddItem("hue shader", &m_pState->m_fShader, MENUITEMTYPE_BLENDABLE, "adds subtle color variations to the image. 0=off, 1=fully on", 0.0f, 1.0f); + m_menuPost.AddItem("video echo: alpha", &m_pState->m_fVideoEchoAlpha, MENUITEMTYPE_BLENDABLE, "controls the opacity of the second graphics layer; 0=transparent (off), 0.5=half-mix, 1=opaque", 0.0f, 1.0f); + m_menuPost.AddItem(" video echo: zoom", &m_pState->m_fVideoEchoZoom, MENUITEMTYPE_LOGBLENDABLE, "controls the size of the second graphics layer"); + m_menuPost.AddItem(" video echo: orientation",&m_pState->m_nVideoEchoOrientation, MENUITEMTYPE_INT, "selects an orientation for the second graphics layer. 0=normal, 1=flip on x, 2=flip on y, 3=flip on both", 0.0f, 3.0f); + m_menuPost.AddItem("texture wrap", &m_pState->m_bTexWrap, MENUITEMTYPE_BOOL, "sets whether or not screen elements can drift off of one side and onto the other"); + m_menuPost.AddItem("stereo 3D", &m_pState->m_bRedBlueStereo, MENUITEMTYPE_BOOL, "displays the image in stereo 3D; you need 3D glasses (with red and blue lenses) for this."); + m_menuPost.AddItem("filter: invert", &m_pState->m_bInvert, MENUITEMTYPE_BOOL, "inverts the colors in the image"); + m_menuPost.AddItem("filter: brighten", &m_pState->m_bBrighten, MENUITEMTYPE_BOOL, "brightens the darker parts of the image (nonlinear; square root filter)"); + m_menuPost.AddItem("filter: darken", &m_pState->m_bDarken, MENUITEMTYPE_BOOL, "darkens the brighter parts of the image (nonlinear; squaring filter)"); + m_menuPost.AddItem("filter: solarize", &m_pState->m_bSolarize, MENUITEMTYPE_BOOL, "emphasizes mid-range colors"); + + for (i=0; im_wave[i].enabled, MENUITEMTYPE_BOOL, "enables or disables this custom waveform/spectrum"); // bool + m_menuWavecode[i].AddItem("number of samples" ,&m_pState->m_wave[i].samples, MENUITEMTYPE_INT, "the number of samples (points) that makes up the waveform", 2, 512); // 0-512 + m_menuWavecode[i].AddItem("L/R separation" ,&m_pState->m_wave[i].sep, MENUITEMTYPE_INT, "the offset between the left & right channels; useful for doing phase plots. Keep low (<32) when using w/spectrum.", 0, 256); // 0-512 + m_menuWavecode[i].AddItem("scaling" ,&m_pState->m_wave[i].scaling, MENUITEMTYPE_LOGFLOAT, "the size of the wave (1=normal)"); + m_menuWavecode[i].AddItem("smoothing" ,&m_pState->m_wave[i].smoothing, MENUITEMTYPE_FLOAT, "0=the raw wave; 1=a highly damped (smoothed) wave", 0, 1); + m_menuWavecode[i].AddItem("color (red)" ,&m_pState->m_wave[i].r, MENUITEMTYPE_FLOAT, "amount of red color in the wave (0..1)", 0, 1); + m_menuWavecode[i].AddItem("color (green)" ,&m_pState->m_wave[i].g, MENUITEMTYPE_FLOAT, "amount of green color in the wave (0..1)", 0, 1); + m_menuWavecode[i].AddItem("color (blue)" ,&m_pState->m_wave[i].b, MENUITEMTYPE_FLOAT, "amount of blue color in the wave (0..1)", 0, 1); + m_menuWavecode[i].AddItem("opacity" ,&m_pState->m_wave[i].a, MENUITEMTYPE_FLOAT, "opacity of the waveform; 0=transparent, 1=opaque", 0, 1); + m_menuWavecode[i].AddItem("use spectrum" ,&m_pState->m_wave[i].bSpectrum, MENUITEMTYPE_BOOL, "if ON, the data in value1 and value2 will constitute a frequency spectrum (instead of waveform values)"); // 0-5 [0=wave left, 1=wave center, 2=wave right; 3=spectrum left, 4=spec center, 5=spec right] + m_menuWavecode[i].AddItem("use dots" ,&m_pState->m_wave[i].bUseDots, MENUITEMTYPE_BOOL, "if ON, the samples will be drawn with dots, instead of connected lines"); // bool + m_menuWavecode[i].AddItem("draw thick" ,&m_pState->m_wave[i].bDrawThick, MENUITEMTYPE_BOOL, "if ON, the samples will be overdrawn 4X to make them thicker, bolder, and more visible"); // bool + m_menuWavecode[i].AddItem("additive drawing" ,&m_pState->m_wave[i].bAdditive, MENUITEMTYPE_BOOL, "if ON, the samples will add color to sature the image toward white; otherwise, they replace what's there."); // bool + m_menuWavecode[i].AddItem("--export to file" ,(void*)UI_EXPORT_WAVE, MENUITEMTYPE_UIMODE, "export the settings for this custom waveform to a file on disk", 0, 0, NULL, UI_EXPORT_WAVE, i); + m_menuWavecode[i].AddItem("--import from file" ,(void*)UI_IMPORT_WAVE, MENUITEMTYPE_UIMODE, "import settings for a custom waveform from a file on disk" , 0, 0, NULL, UI_IMPORT_WAVE, i); + m_menuWavecode[i].AddItem("[ edit initialization code ]",&m_pState->m_wave[i].m_szInit, MENUITEMTYPE_STRING, "IN: time, frame, fps, progress; q1-q8 (from preset init) / OUT: t1-t8", 256, 0, &OnUserEditedWavecodeInit); + m_menuWavecode[i].AddItem("[ edit per-frame code ]",&m_pState->m_wave[i].m_szPerFrame, MENUITEMTYPE_STRING, "IN: time, frame, fps, progress; q1-q8, t1-t8; r,g,b,a; {bass|mid|treb}[_att] / OUT: r,g,b,a; t1-t8", 256, 0, &OnUserEditedWavecode); + m_menuWavecode[i].AddItem("[ edit per-point code ]",&m_pState->m_wave[i].m_szPerPoint, MENUITEMTYPE_STRING, "IN: sample [0..1]; value1 [left ch], value2 [right ch], plus all vars for per-frame code / OUT: x,y; r,g,b,a; t1-t8", 256, 0, &OnUserEditedWavecode); + } + + for (i=0; im_shape[i].enabled, MENUITEMTYPE_BOOL, "enables or disables this shape"); // bool + m_menuShapecode[i].AddItem("number of sides" ,&m_pState->m_shape[i].sides, MENUITEMTYPE_INT, "the default number of sides that make up the polygonal shape", 3, 100); + m_menuShapecode[i].AddItem("draw thick" ,&m_pState->m_shape[i].thickOutline,MENUITEMTYPE_BOOL, "if ON, the border will be overdrawn 4X to make it thicker, bolder, and more visible"); // bool + m_menuShapecode[i].AddItem("additive drawing" ,&m_pState->m_shape[i].additive, MENUITEMTYPE_BOOL, "if ON, the shape will add color to sature the image toward white; otherwise, it will replace what's there."); // bool + m_menuShapecode[i].AddItem("x position" ,&m_pState->m_shape[i].x, MENUITEMTYPE_FLOAT, "default x position of the shape (0..1; 0=left side, 1=right side)", 0, 1); + m_menuShapecode[i].AddItem("y position" ,&m_pState->m_shape[i].y, MENUITEMTYPE_FLOAT, "default y position of the shape (0..1; 0=bottom, 1=top of screen)", 0, 1); + m_menuShapecode[i].AddItem("radius" ,&m_pState->m_shape[i].rad, MENUITEMTYPE_LOGFLOAT, "default radius of the shape (0+)"); + m_menuShapecode[i].AddItem("angle" ,&m_pState->m_shape[i].ang, MENUITEMTYPE_FLOAT, "default rotation angle of the shape (0...3.14*2)", 0, 3.1415927f*2.0f); + m_menuShapecode[i].AddItem("textured" ,&m_pState->m_shape[i].textured, MENUITEMTYPE_BOOL, "if ON, the shape will be textured with the image from the previous frame"); // bool + m_menuShapecode[i].AddItem("texture zoom" ,&m_pState->m_shape[i].tex_zoom, MENUITEMTYPE_LOGFLOAT, "the portion of the previous frame's image to use with the shape"); // bool + m_menuShapecode[i].AddItem("texture angle" ,&m_pState->m_shape[i].tex_ang, MENUITEMTYPE_FLOAT , "the angle at which to rotate the previous frame's image before applying it to the shape", 0, 3.1415927f*2.0f); // bool + m_menuShapecode[i].AddItem("inner color (red)" ,&m_pState->m_shape[i].r, MENUITEMTYPE_FLOAT, "default amount of red color toward the center of the shape (0..1)", 0, 1); + m_menuShapecode[i].AddItem("inner color (green)" ,&m_pState->m_shape[i].g, MENUITEMTYPE_FLOAT, "default amount of green color toward the center of the shape (0..1)", 0, 1); + m_menuShapecode[i].AddItem("inner color (blue)" ,&m_pState->m_shape[i].b, MENUITEMTYPE_FLOAT, "default amount of blue color toward the center of the shape (0..1)", 0, 1); + m_menuShapecode[i].AddItem("inner opacity" ,&m_pState->m_shape[i].a, MENUITEMTYPE_FLOAT, "default opacity of the center of the shape; 0=transparent, 1=opaque", 0, 1); + m_menuShapecode[i].AddItem("outer color (red)" ,&m_pState->m_shape[i].r2, MENUITEMTYPE_FLOAT, "default amount of red color toward the outer edge of the shape (0..1)", 0, 1); + m_menuShapecode[i].AddItem("outer color (green)" ,&m_pState->m_shape[i].g2, MENUITEMTYPE_FLOAT, "default amount of green color toward the outer edge of the shape (0..1)", 0, 1); + m_menuShapecode[i].AddItem("outer color (blue)" ,&m_pState->m_shape[i].b2, MENUITEMTYPE_FLOAT, "default amount of blue color toward the outer edge of the shape (0..1)", 0, 1); + m_menuShapecode[i].AddItem("outer opacity" ,&m_pState->m_shape[i].a2, MENUITEMTYPE_FLOAT, "default opacity of the outer edge of the shape; 0=transparent, 1=opaque", 0, 1); + m_menuShapecode[i].AddItem("border color (red)" ,&m_pState->m_shape[i].border_r, MENUITEMTYPE_FLOAT, "default amount of red color in the shape's border (0..1)", 0, 1); + m_menuShapecode[i].AddItem("border color (green)",&m_pState->m_shape[i].border_g, MENUITEMTYPE_FLOAT, "default amount of green color in the shape's border (0..1)", 0, 1); + m_menuShapecode[i].AddItem("border color (blue)" ,&m_pState->m_shape[i].border_b, MENUITEMTYPE_FLOAT, "default amount of blue color in the shape's border (0..1)", 0, 1); + m_menuShapecode[i].AddItem("border opacity" ,&m_pState->m_shape[i].border_a, MENUITEMTYPE_FLOAT, "default opacity of the shape's border; 0=transparent, 1=opaque", 0, 1); + m_menuShapecode[i].AddItem("--export to file" ,NULL, MENUITEMTYPE_UIMODE, "export the settings for this custom shape to a file on disk", 0, 0, NULL, UI_EXPORT_SHAPE, i); + m_menuShapecode[i].AddItem("--import from file" ,NULL, MENUITEMTYPE_UIMODE, "import settings for a custom shape from a file on disk" , 0, 0, NULL, UI_IMPORT_SHAPE, i); + m_menuShapecode[i].AddItem("[ edit initialization code ]",&m_pState->m_shape[i].m_szInit, MENUITEMTYPE_STRING, "IN: time, frame, fps, progress; q1-q8 (from preset init); x,y,rad,ang; r,g,b,a; r2,g2,b2,a2; border_{r|g|b|a}; sides, thick, additive, textured\rOUT: t1-t8; x,y,rad,ang; r,g,b,a; r2,g2,b2,a2; border_{r|g|b|a}; sides, thick, additive, textured", 256, 0, &OnUserEditedShapecodeInit); + m_menuShapecode[i].AddItem("[ edit per-frame code ]",&m_pState->m_shape[i].m_szPerFrame, MENUITEMTYPE_STRING, "IN: time, frame, fps, progress; q1-q8 (from preset init); x,y,rad,ang; r,g,b,a; r2,g2,b2,a2; border_{r|g|b|a}; sides, thick, additive, textured\rOUT: t1-t8; x,y,rad,ang; r,g,b,a; r2,g2,b2,a2; border_{r|g|b|a}; sides, thick, additive, textured", 256, 0, &OnUserEditedShapecode); + //m_menuShapecode[i].AddItem("[ edit per-point code ]",&m_pState->m_shape[i].m_szPerPoint, MENUITEMTYPE_STRING, "IN: sample [0..1]; value1 [left ch], value2 [right ch], plus all vars for per-frame code / OUT: x,y; r,g,b,a; t1-t8", 256, 0, &OnUserEditedWavecode); + } +#endif 0 +} + +void CPlugin::WriteRealtimeConfig() +{ +#if 0 + /*if (m_bSeparateTextWindow && m_hTextWnd) + { + RECT rect; + if (GetWindowRect(m_hTextWnd, &rect)) + { + WritePrivateProfileInt(rect.left, "nTextWndLeft", GetConfigIniFile(), "settings"); + WritePrivateProfileInt(rect.top, "nTextWndTop", GetConfigIniFile(), "settings"); + WritePrivateProfileInt(rect.right, "nTextWndRight", GetConfigIniFile(), "settings"); + WritePrivateProfileInt(rect.bottom, "nTextWndBottom", GetConfigIniFile(), "settings"); + } + }*/ + + WritePrivateProfileInt(m_bShowFPS , "bShowFPS", GetConfigIniFile(), "settings"); + WritePrivateProfileInt(m_bShowRating , "bShowRating", GetConfigIniFile(), "settings"); + WritePrivateProfileInt(m_bShowPresetInfo , "bShowPresetInfo", GetConfigIniFile(), "settings"); + //WritePrivateProfileInt(m_bShowDebugInfo , "bShowDebugInfo", GetConfigIniFile(), "settings"); + WritePrivateProfileInt(m_bShowSongTitle , "bShowSongTitle", GetConfigIniFile(), "settings"); + WritePrivateProfileInt(m_bShowSongTime , "bShowSongTime", GetConfigIniFile(), "settings"); + WritePrivateProfileInt(m_bShowSongLen , "bShowSongLen", GetConfigIniFile(), "settings"); +#endif +} + +void CPlugin::dumpmsg(char *s) +{ + printf(s); +} + +void CPlugin::LoadPreviousPreset(float fBlendTime) +{ + // make sure file list is ok + if (m_nPresets - m_nDirs == 0) + { + UpdatePresetList(); + if (m_nPresets - m_nDirs == 0) + { + // note: this error message is repeated in milkdropfs.cpp in DrawText() + sprintf(m_szUserMessage, "ERROR: No preset files found in %s*.milk", m_szPresetDir); + m_fShowUserMessageUntilThisTime = GetTime() + 6.0f; + return; + } + } + + m_nCurrentPreset--; + if (m_nCurrentPreset < m_nDirs || m_nCurrentPreset >= m_nPresets) + m_nCurrentPreset = m_nPresets-1; + + strcpy(m_szCurrentPresetFile, m_szPresetDir); // note: m_szPresetDir always ends with '\' + strcat(m_szCurrentPresetFile, m_pPresetAddr[m_nCurrentPreset]); + + LoadPreset(m_szCurrentPresetFile, fBlendTime); +} + +void CPlugin::LoadNextPreset(float fBlendTime) +{ + // make sure file list is ok + if (m_nPresets - m_nDirs == 0) + { + UpdatePresetList(); + if (m_nPresets - m_nDirs == 0) + { + // note: this error message is repeated in milkdropfs.cpp in DrawText() + sprintf(m_szUserMessage, "ERROR: No preset files found in %s*.milk", m_szPresetDir); + m_fShowUserMessageUntilThisTime = GetTime() + 6.0f; + return; + } + } + + m_nCurrentPreset++; + if (m_nCurrentPreset < m_nDirs || m_nCurrentPreset >= m_nPresets) + m_nCurrentPreset = m_nDirs; + + strcpy(m_szCurrentPresetFile, m_szPresetDir); // note: m_szPresetDir always ends with '\' + strcat(m_szCurrentPresetFile, m_pPresetAddr[m_nCurrentPreset]); + + LoadPreset(m_szCurrentPresetFile, fBlendTime); +} + +void CPlugin::LoadRandomPreset(float fBlendTime) +{ + if (m_bHoldPreset) return; + // make sure file list is ok + if (m_nPresets - m_nDirs == 0) + { + UpdatePresetList(); + if (m_nPresets - m_nDirs == 0) + { + // note: this error message is repeated in milkdropfs.cpp in DrawText() + sprintf(m_szUserMessage, "ERROR: No preset files found in %s*.milk", m_szPresetDir); + m_fShowUserMessageUntilThisTime = GetTime() + 6.0f; + return; + } + } + + // --TEMPORARY-- + // this comes in handy if you want to mass-modify a batch of presets; + // just automatically tweak values in Import, then they immediately get exported to a .MILK in a new dir. + /* + for (int i=0; i= m_nPresets) + m_nCurrentPreset = m_nDirs; + } + else + { + // pick a random file + if (!m_bEnableRating || (m_pfPresetRating[m_nPresets - 1] < 0.1f) || (m_nRatingReadProgress < m_nPresets)) + { + m_nCurrentPreset = m_nDirs + (rand() % (m_nPresets - m_nDirs)); + } + else + { + float cdf_pos = (rand() % 14345)/14345.0f*m_pfPresetRating[m_nPresets - 1]; + + /* + char buf[512]; + sprintf(buf, "max = %f, rand = %f, \tvalues: ", m_pfPresetRating[m_nPresets - 1], cdf_pos); + for (int i=m_nDirs; i cdf_pos) + hi = mid; + else + lo = mid; + } + m_nCurrentPreset = hi; + } + } + } + + // m_pPresetAddr[m_nCurrentPreset] points to the preset file to load (w/o the path); + // first prepend the path, then load section [preset00] within that file + strcpy(m_szCurrentPresetFile, m_szPresetDir); // note: m_szPresetDir always ends with '\' + strcat(m_szCurrentPresetFile, m_pPresetAddr[m_nCurrentPreset]); + + LoadPreset(m_szCurrentPresetFile, fBlendTime); +} + +void CPlugin::RandomizeBlendPattern() +{ + if (!m_vertinfo) + return; + + int mixtype = rand()%4; + + if (mixtype==0) + { + // constant, uniform blend + int nVert = 0; + for (int y=0; y<=m_nGridY; y++) + { + for (int x=0; x<=m_nGridX; x++) + { + m_vertinfo[nVert].a = 1; + m_vertinfo[nVert].c = 0; + nVert++; + } + } + } + else if (mixtype==1) + { + // directional wipe + float ang = FRAND*6.28f; + float vx = cosf(ang); + float vy = sinf(ang); + float band = 0.1f + 0.2f*FRAND; // 0.2 is good + float inv_band = 1.0f/band; + + int nVert = 0; + for (int y=0; y<=m_nGridY; y++) + { + float fy = y/(float)m_nGridY; + for (int x=0; x<=m_nGridX; x++) + { + float fx = x/(float)m_nGridX; + + // at t==0, mix rangse from -10..0 + // at t==1, mix ranges from 1..11 + + float t = (fx-0.5f)*vx + (fy-0.5f)*vy + 0.5f; + t = (t-0.5f)/sqrtf(2.0f) + 0.5f; + + m_vertinfo[nVert].a = inv_band * (1 + band); + m_vertinfo[nVert].c = -inv_band + inv_band*t;//(x/(float)m_nGridX - 0.5f)/band; + nVert++; + } + } + } + else if (mixtype==2) + { + // plasma transition + float band = 0.02f + 0.18f*FRAND; + float inv_band = 1.0f/band; + + // first generate plasma array of height values + m_vertinfo[ 0].c = FRAND; + m_vertinfo[ m_nGridX].c = FRAND; + m_vertinfo[m_nGridY*(m_nGridX+1) ].c = FRAND; + m_vertinfo[m_nGridY*(m_nGridX+1) + m_nGridX].c = FRAND; + GenPlasma(0, m_nGridX, 0, m_nGridY, 0.25f); + + // then find min,max so we can normalize to [0..1] range and then to the proper 'constant offset' range. + float minc = m_vertinfo[0].c; + float maxc = m_vertinfo[0].c; + int x,y,nVert; + + nVert = 0; + for (y=0; y<=m_nGridY; y++) + { + for (x=0; x<=m_nGridX; x++) + { + if (minc > m_vertinfo[nVert].c) + minc = m_vertinfo[nVert].c; + if (maxc < m_vertinfo[nVert].c) + maxc = m_vertinfo[nVert].c; + nVert++; + } + } + + float mult = 1.0f/(maxc-minc); + nVert = 0; + for (y=0; y<=m_nGridY; y++) + { + for (x=0; x<=m_nGridX; x++) + { + float t = (m_vertinfo[nVert].c - minc)*mult; + m_vertinfo[nVert].a = inv_band * (1 + band); + m_vertinfo[nVert].c = -inv_band + inv_band*t; + nVert++; + } + } + } + else if (mixtype==3) + { + // radial blend + float band = 0.02f + 0.14f*FRAND + 0.34f*FRAND; + float inv_band = 1.0f/band; + float dir = (rand()%2)*2 - 1; + + int nVert = 0; + for (int y=0; y<=m_nGridY; y++) + { + float dy = y/(float)m_nGridY - 0.5f; + for (int x=0; x<=m_nGridX; x++) + { + float dx = x/(float)m_nGridX - 0.5f; + float t = sqrtf(dx*dx + dy*dy)*1.41421f; + if (dir==-1) + t = 1-t; + + m_vertinfo[nVert].a = inv_band * (1 + band); + m_vertinfo[nVert].c = -inv_band + inv_band*t; + nVert++; + } + } + } +} + +void CPlugin::GenPlasma(int x0, int x1, int y0, int y1, float dt) +{ + int midx = (x0+x1)/2; + int midy = (y0+y1)/2; + float t00 = m_vertinfo[y0*(m_nGridX+1) + x0].c; + float t01 = m_vertinfo[y0*(m_nGridX+1) + x1].c; + float t10 = m_vertinfo[y1*(m_nGridX+1) + x0].c; + float t11 = m_vertinfo[y1*(m_nGridX+1) + x1].c; + + if (y1-y0 >= 2) + { + if (x0==0) + m_vertinfo[midy*(m_nGridX+1) + x0].c = 0.5f*(t00 + t10) + (FRAND*2-1)*dt; + m_vertinfo[midy*(m_nGridX+1) + x1].c = 0.5f*(t01 + t11) + (FRAND*2-1)*dt; + } + if (x1-x0 >= 2) + { + if (y0==0) + m_vertinfo[y0*(m_nGridX+1) + midx].c = 0.5f*(t00 + t01) + (FRAND*2-1)*dt; + m_vertinfo[y1*(m_nGridX+1) + midx].c = 0.5f*(t10 + t11) + (FRAND*2-1)*dt; + } + + if (y1-y0 >= 2 && x1-x0 >= 2) + { + // do midpoint & recurse: + t00 = m_vertinfo[midy*(m_nGridX+1) + x0].c; + t01 = m_vertinfo[midy*(m_nGridX+1) + x1].c; + t10 = m_vertinfo[y0*(m_nGridX+1) + midx].c; + t11 = m_vertinfo[y1*(m_nGridX+1) + midx].c; + m_vertinfo[midy*(m_nGridX+1) + midx].c = 0.25f*(t10 + t11 + t00 + t01) + (FRAND*2-1)*dt; + + GenPlasma(x0, midx, y0, midy, dt*0.5f); + GenPlasma(midx, x1, y0, midy, dt*0.5f); + GenPlasma(x0, midx, midy, y1, dt*0.5f); + GenPlasma(midx, x1, midy, y1, dt*0.5f); + } +} + +void CPlugin::LoadPreset(char *szPresetFilename, float fBlendTime) +{ + OutputDebugString("Milkdrop: Loading preset "); + OutputDebugString(szPresetFilename); + OutputDebugString("\n"); + + + if (szPresetFilename != m_szCurrentPresetFile) + strcpy(m_szCurrentPresetFile, szPresetFilename); + + CState *temp = m_pState; + m_pState = m_pOldState; + m_pOldState = temp; + + m_pState->Import("preset00", m_szCurrentPresetFile); + + RandomizeBlendPattern(); + + if (fBlendTime >= 0.001f) + m_pState->StartBlendFrom(m_pOldState, GetTime(), fBlendTime); + + m_fPresetStartTime = GetTime(); + m_fNextPresetTime = -1.0f; // flags UpdateTime() to recompute this + +} + +void CPlugin::SeekToPreset(char cStartChar) +{ + if (cStartChar >= 'a' && cStartChar <= 'z') + cStartChar -= 'a' - 'A'; + + for (int i = m_nDirs; i < m_nPresets; i++) + { + char ch = m_pPresetAddr[i][0]; + if (ch >= 'a' && ch <= 'z') + ch -= 'a' - 'A'; + if (ch == cStartChar) + { + m_nPresetListCurPos = i; + return; + } + } +} + + +void CPlugin::UpdatePresetList() +{ + struct _finddata_t c_file; + long hFile; + //HANDLE hFindFile; + + char szMask[512]; + char szPath[512]; + char szLastPresetSelected[512]; + + if (m_nPresetListCurPos >= m_nDirs && m_nPresetListCurPos < m_nPresets) + strcpy(szLastPresetSelected, m_pPresetAddr[m_nPresetListCurPos]); + else + strcpy(szLastPresetSelected, ""); + + // make sure the path exists; if not, go to winamp plugins dir +/* + if (GetFileAttributes(m_szPresetDir) == -1) + { + strcpy(m_szPresetDir, m_szWinampPluginsPath); + if (GetFileAttributes(m_szPresetDir) == -1) + { + strcpy(m_szPresetDir, "c:\\"); + } + } +*/ + strcpy(szPath, m_szPresetDir); + int len = strlen(szPath); + if (len>0 && szPath[len-1] != '/') + { + strcat(szPath, "/"); + } + strcpy(szMask, szPath); + strcat(szMask, "*.*"); + + + WIN32_FIND_DATA ffd; + ZeroMemory(&ffd, sizeof(ffd)); + + m_nRatingReadProgress = 0; + + for (int i=0; i<2; i++) // usually RETURNs at end of first loop + { + m_nPresets = 0; + m_nDirs = 0; + + // find first .MILK file + if( (hFile = _findfirst(szMask, &c_file )) != -1L ) // note: returns filename -without- path + //if( (hFindFile = FindFirstFile(szMask, &ffd )) != INVALID_HANDLE_VALUE ) // note: returns filename -without- path + { + char *p = m_szpresets; + int bytes_left = m_nSizeOfPresetList - 1; // save space for extra null-termination of last string + + /* + len = strlen(ffd.cFileName); + bytes_left -= len+1; + strcpy(p, ffd.cFileName); + p += len+1; + m_nPresets++; + */ + //dumpmsg(ffd.cFileName); + + // find the rest + //while (_findnext( hFile, &c_file ) == 0) + + do + { + bool bSkip = false; + + char szFilename[512]; + strcpy(szFilename, c_file.name); + + /*if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + // skip "." directory + if (strcmp(ffd.cFileName, ".")==0)// || strlen(ffd.cFileName) < 1) + bSkip = true; + else + sprintf(szFilename, "*%s", ffd.cFileName); + } + else*/ + { + // skip normal files not ending in ".milk" + int len = strlen(c_file.name); + if (len < 5 || strcmpi(c_file.name + len - 5, ".milk") != 0) + bSkip = true; + } + + if (!bSkip) + { + //dumpmsg(szFilename); + len = strlen(szFilename); + bytes_left -= len+1; + + m_nPresets++; + /*if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + m_nDirs++;*/ + + if (bytes_left >= 0) + { + strcpy(p, szFilename); + p += len+1; + } + } + } + while(_findnext(hFile,&c_file) == 0); + + _findclose( hFile ); + + if (bytes_left >= 0) + { + // success! double-null-terminate the last string. + *p = 0; + + // also fill each slot of m_pPresetAddr with the address of each string + // but do it in ALPHABETICAL ORDER + if (m_pPresetAddr) delete m_pPresetAddr; + m_pPresetAddr = new CHARPTR[m_nPresets]; + + //the unsorted version: + p = m_szpresets; + for (int k=0; k reallocating list..."); + int new_size = (-bytes_left + m_nSizeOfPresetList)*11/10; // overallocate a bit + delete m_szpresets; + m_szpresets = new char[new_size]; + m_nSizeOfPresetList = new_size; + } + } + } + + // should never get here + sprintf(m_szUserMessage, "Unfathomable error getting preset file list!"); + m_fShowUserMessageUntilThisTime = GetTime() + 6.0f; + + m_nPresets = 0; + m_nDirs = 0; +} + + +void CPlugin::MergeSortPresets(int left, int right) +{ + // note: left..right range is inclusive + int nItems = right-left+1; + + if (nItems > 2) + { + // recurse to sort 2 halves (but don't actually recurse on a half if it only has 1 element) + int mid = (left+right)/2; + /*if (mid != left) */ MergeSortPresets(left, mid); + /*if (mid+1 != right)*/ MergeSortPresets(mid+1, right); + + // then merge results + int a = left; + int b = mid + 1; + while (a <= mid && b <= right) + { + bool bSwap; + + // merge the sorted arrays; give preference to strings that start with a '*' character + int nSpecial = 0; + if (m_pPresetAddr[a][0] == '*') nSpecial++; + if (m_pPresetAddr[b][0] == '*') nSpecial++; + + if (nSpecial == 1) + { + bSwap = (m_pPresetAddr[b][0] == '*'); + } + else + { + bSwap = (mystrcmpi(m_pPresetAddr[a], m_pPresetAddr[b]) > 0); + } + + if (bSwap) + { + CHARPTR temp = m_pPresetAddr[b]; + for (int k=b; k>a; k--) + m_pPresetAddr[k] = m_pPresetAddr[k-1]; + m_pPresetAddr[a] = temp; + mid++; + b++; + } + a++; + } + } + else if (nItems == 2) + { + // sort 2 items; give preference to 'special' strings that start with a '*' character + int nSpecial = 0; + if (m_pPresetAddr[left][0] == '*') nSpecial++; + if (m_pPresetAddr[right][0] == '*') nSpecial++; + + if (nSpecial == 1) + { + if (m_pPresetAddr[right][0] == '*') + { + CHARPTR temp = m_pPresetAddr[left]; + m_pPresetAddr[left] = m_pPresetAddr[right]; + m_pPresetAddr[right] = temp; + } + } + else if (mystrcmpi(m_pPresetAddr[left], m_pPresetAddr[right]) > 0) + { + CHARPTR temp = m_pPresetAddr[left]; + m_pPresetAddr[left] = m_pPresetAddr[right]; + m_pPresetAddr[right] = temp; + } + } +} + + +void CPlugin::WaitString_NukeSelection() +{ + if (m_waitstring.bActive && + m_waitstring.nSelAnchorPos != -1) + { + // nuke selection. note: start & end are INCLUSIVE. + int start = (m_waitstring.nCursorPos < m_waitstring.nSelAnchorPos) ? m_waitstring.nCursorPos : m_waitstring.nSelAnchorPos; + int end = (m_waitstring.nCursorPos > m_waitstring.nSelAnchorPos) ? m_waitstring.nCursorPos - 1 : m_waitstring.nSelAnchorPos - 1; + int len = strlen(m_waitstring.szText); + int how_far_to_shift = end - start + 1; + int num_chars_to_shift = len - end; // includes NULL char + + for (int i=0; i m_waitstring.nSelAnchorPos) ? m_waitstring.nCursorPos - 1 : m_waitstring.nSelAnchorPos - 1; + int chars_to_copy = end - start + 1; + + for (int i=0; i= m_waitstring.nMaxLen) + { + chars_to_insert = m_waitstring.nMaxLen - len - 1; + + // inform user + strcpy(m_szUserMessage, "(string too long)"); + m_fShowUserMessageUntilThisTime = GetTime() + 2.5f; + } + else + { + m_fShowUserMessageUntilThisTime = GetTime(); // if there was an error message already, clear it + } + + for (i=len; i >= m_waitstring.nCursorPos; i--) + m_waitstring.szText[i + chars_to_insert] = m_waitstring.szText[i]; + for (i=0; i < chars_to_insert; i++) + m_waitstring.szText[i + m_waitstring.nCursorPos] = m_waitstring.szClipboard[i]; + m_waitstring.nCursorPos += chars_to_insert; + } +} + +void CPlugin::WaitString_SeekLeftWord() +{ + // move to beginning of prior word + + while (m_waitstring.nCursorPos > 0 && + !IsAlphanumericChar(m_waitstring.szText[m_waitstring.nCursorPos-1])) + { + m_waitstring.nCursorPos--; + } + + while (m_waitstring.nCursorPos > 0 && + IsAlphanumericChar(m_waitstring.szText[m_waitstring.nCursorPos-1])) + { + m_waitstring.nCursorPos--; + } +} + +void CPlugin::WaitString_SeekRightWord() +{ + // move to beginning of next word + + //testing lotsa stuff + + int len = strlen(m_waitstring.szText); + + while (m_waitstring.nCursorPos < len && + IsAlphanumericChar(m_waitstring.szText[m_waitstring.nCursorPos])) + { + m_waitstring.nCursorPos++; + } + + while (m_waitstring.nCursorPos < len && + !IsAlphanumericChar(m_waitstring.szText[m_waitstring.nCursorPos])) + { + m_waitstring.nCursorPos++; + } +} + +int CPlugin::WaitString_GetCursorColumn() +{ + if (m_waitstring.bDisplayAsCode) + { + int column = 0; + while (m_waitstring.nCursorPos - column - 1 >= 0 && + m_waitstring.szText[m_waitstring.nCursorPos - column - 1] != LINEFEED_CONTROL_CHAR) + { + column++; + } + return column; + } + else + { + return m_waitstring.nCursorPos; + } +} + +int CPlugin::WaitString_GetLineLength() +{ + int line_start = m_waitstring.nCursorPos - WaitString_GetCursorColumn(); + int line_length = 0; + + while (m_waitstring.szText[line_start + line_length] != 0 && + m_waitstring.szText[line_start + line_length] != LINEFEED_CONTROL_CHAR) + { + line_length++; + } + + return line_length; +} + +void CPlugin::WaitString_SeekUpOneLine() +{ + int column = g_plugin->WaitString_GetCursorColumn(); + + if (column != m_waitstring.nCursorPos) + { + // seek to very end of previous line (cursor will be at the semicolon) + m_waitstring.nCursorPos -= column + 1; + + int new_column = g_plugin->WaitString_GetCursorColumn(); + + if (new_column > column) + m_waitstring.nCursorPos -= (new_column - column); + } +} + +void CPlugin::WaitString_SeekDownOneLine() +{ + int column = g_plugin->WaitString_GetCursorColumn(); + int newpos = m_waitstring.nCursorPos; + + while (m_waitstring.szText[newpos] != 0 && m_waitstring.szText[newpos] != LINEFEED_CONTROL_CHAR) + newpos++; + + if (m_waitstring.szText[newpos] != 0) + { + m_waitstring.nCursorPos = newpos + 1; + + while ( column > 0 && + m_waitstring.szText[m_waitstring.nCursorPos] != LINEFEED_CONTROL_CHAR && + m_waitstring.szText[m_waitstring.nCursorPos] != 0) + { + m_waitstring.nCursorPos++; + column--; + } + } +} + + +void CPlugin::SavePresetAs(char *szNewFile) +{ + // overwrites the file if it was already there, + // so you should check if the file exists first & prompt user to overwrite, + // before calling this function + + if (!m_pState->Export("preset00", szNewFile)) + { + // error + strcpy(m_szUserMessage, "ERROR: unable to save the file"); + m_fShowUserMessageUntilThisTime = GetTime() + 6.0f; + } + else + { + // pop up confirmation + strcpy(m_szUserMessage, "[save successful]"); + m_fShowUserMessageUntilThisTime = GetTime() + 4.0f; + + // update m_pState->m_szDesc with the new name + strcpy(m_pState->m_szDesc, m_waitstring.szText); + + // refresh file listing + UpdatePresetList(); + } +} + +void CPlugin::DeletePresetFile(char *szDelFile) +{ + // NOTE: this function additionally assumes that m_nPresetListCurPos indicates + // the slot that the to-be-deleted preset occupies! + + // delete file + if (!DeleteFile(szDelFile)) + { + // error + strcpy(m_szUserMessage, "ERROR: unable to delete delete the file"); + m_fShowUserMessageUntilThisTime = GetTime() + 6.0f; + } + else + { + // pop up confirmation + sprintf(m_szUserMessage, "[preset \"%s\" deleted]", m_pPresetAddr[m_nPresetListCurPos]); + m_fShowUserMessageUntilThisTime = GetTime() + 4.0f; + + // refresh file listing & re-select the next file after the one deleted + + if (m_nPresetListCurPos < m_nPresets - 1) + m_nPresetListCurPos++; + else if (m_nPresetListCurPos > 0) + m_nPresetListCurPos--; + else + m_nPresetListCurPos = 0; + + UpdatePresetList(); + } +} + +void CPlugin::RenamePresetFile(char *szOldFile, char *szNewFile) +{ + // NOTE: this function additionally assumes that m_nPresetListCurPos indicates + // the slot that the to-be-renamed preset occupies! + + if (GetFileAttributes(szNewFile) != -1) // check if file already exists + { + // error + strcpy(m_szUserMessage, "ERROR: a file already exists with that filename"); + m_fShowUserMessageUntilThisTime = GetTime() + 6.0f; + + // (user remains in UI_LOAD_RENAME mode to try another filename) + } + else + { + // rename + if (!MoveFile(szOldFile, szNewFile)) + { + // error + strcpy(m_szUserMessage, "ERROR: unable to rename the file"); + m_fShowUserMessageUntilThisTime = GetTime() + 6.0f; + } + else + { + // pop up confirmation + strcpy(m_szUserMessage, "[rename successful]"); + m_fShowUserMessageUntilThisTime = GetTime() + 4.0f; + + // if this preset was the active one, update m_pState->m_szDesc with the new name + char buf[512]; + sprintf(buf, "%s.milk", m_pState->m_szDesc); + if (strcmp(m_pPresetAddr[m_nPresetListCurPos], buf) == 0) + { + strcpy(m_pState->m_szDesc, m_waitstring.szText); + } + + // refresh file listing & do a trick to make it re-select the renamed file + strcpy(m_pPresetAddr[m_nPresetListCurPos], m_waitstring.szText); + strcat(m_pPresetAddr[m_nPresetListCurPos], ".milk"); + UpdatePresetList(); + } + + // exit waitstring mode (return to load menu) + m_UI_mode = UI_LOAD; + m_waitstring.bActive = false; + } +} + + +void CPlugin::UpdatePresetRatings() +{ + if (!m_bEnableRating) + return; + + if (m_nRatingReadProgress==-1 || m_nRatingReadProgress==m_nPresets) + return; + + int k; + + // read in ratings for each preset: + //if (m_pfPresetRating) delete m_pfPresetRating; + //m_pfPresetRating = new float[m_nPresets]; + if (m_pfPresetRating == NULL) + m_pfPresetRating = new float[m_nPresets]; + + if (m_nRatingReadProgress==0 && m_nDirs>0) + { + for (k=0; k 5) f = 5; + + if (k==0) + m_pfPresetRating[k] = f; + else + m_pfPresetRating[k] = m_pfPresetRating[k-1] + f; + + m_nRatingReadProgress++; + } +} + + +void CPlugin::SetCurrentPresetRating(float fNewRating) +{ + if (!m_bEnableRating) + return; + + if (fNewRating < 0) fNewRating = 0; + if (fNewRating > 5) fNewRating = 5; + float change = (fNewRating - m_pState->m_fRating); + + // update the file on disk: + //char szPresetFileNoPath[512]; + //char szPresetFileWithPath[512]; + //sprintf(szPresetFileNoPath, "%s.milk", m_pState->m_szDesc); + //sprintf(szPresetFileWithPath, "%s%s.milk", GetPresetDir(), m_pState->m_szDesc); + WritePrivateProfileFloat(fNewRating, "fRating", m_szCurrentPresetFile, "preset00"); + + // update the copy of the preset in memory + m_pState->m_fRating = fNewRating; + + // update the cumulative internal listing: + if (m_nCurrentPreset != -1 && m_nRatingReadProgress >= m_nCurrentPreset) // (can be -1 if dir. changed but no new preset was loaded yet) + for (int i=m_nCurrentPreset; im_nCurrentPreset is out of range! + -soln: when adjusting rating: + 1. file to modify is m_szCurrentPresetFile + 2. only update CDF if m_nCurrentPreset is not -1 + -> set m_nCurrentPreset to -1 whenever dir. changes + -> set m_szCurrentPresetFile whenever you load a preset + */ + + // show a message + if (!m_bShowRating) + { + // see also: DrawText() in milkdropfs.cpp + m_fShowRatingUntilThisTime = GetTime() + 2.0f; + } +} + + + +void CPlugin::ReadCustomMessages() +{ +#if 0 + + int n; + + // First, clear all old data + for (n=0; n 99) + nMsgNum = 99; + + if (nMsgNum < 0) + { + int count=0; + // choose randomly + for (nMsgNum=0; nMsgNum<100; nMsgNum++) + if (m_CustomMessage[nMsgNum].szText[0]) + count++; + + int sel = (rand()%count)+1; + count = 0; + for (nMsgNum=0; nMsgNum<100; nMsgNum++) + { + if (m_CustomMessage[nMsgNum].szText[0]) + count++; + if (count==sel) + break; + } + } + + + if (nMsgNum < 0 || + nMsgNum >= MAX_CUSTOM_MESSAGES || + m_CustomMessage[nMsgNum].szText[0]==0) + { + return; + } + + int fontID = m_CustomMessage[nMsgNum].nFont; + + m_supertext.bRedrawSuperText = true; + m_supertext.bIsSongTitle = false; + strcpy(m_supertext.szText, m_CustomMessage[nMsgNum].szText); + + // regular properties: + m_supertext.fFontSize = m_CustomMessage[nMsgNum].fSize; + m_supertext.fX = m_CustomMessage[nMsgNum].x + m_CustomMessage[nMsgNum].randx * ((rand()%1037)/1037.0f*2.0f - 1.0f); + m_supertext.fY = m_CustomMessage[nMsgNum].y + m_CustomMessage[nMsgNum].randy * ((rand()%1037)/1037.0f*2.0f - 1.0f); + m_supertext.fGrowth = m_CustomMessage[nMsgNum].growth; + m_supertext.fDuration = m_CustomMessage[nMsgNum].fTime; + m_supertext.fFadeTime = m_CustomMessage[nMsgNum].fFade; + + // overrideables: + if (m_CustomMessage[nMsgNum].bOverrideFace) + strcpy(m_supertext.nFontFace, m_CustomMessage[nMsgNum].szFace); + else + strcpy(m_supertext.nFontFace, m_CustomMessageFont[fontID].szFace); + m_supertext.bItal = (m_CustomMessage[nMsgNum].bOverrideItal) ? (m_CustomMessage[nMsgNum].bItal != 0) : (m_CustomMessageFont[fontID].bItal != 0); + m_supertext.bBold = (m_CustomMessage[nMsgNum].bOverrideBold) ? (m_CustomMessage[nMsgNum].bBold != 0) : (m_CustomMessageFont[fontID].bBold != 0); + m_supertext.nColorR = (m_CustomMessage[nMsgNum].bOverrideColorR) ? m_CustomMessage[nMsgNum].nColorR : m_CustomMessageFont[fontID].nColorR; + m_supertext.nColorG = (m_CustomMessage[nMsgNum].bOverrideColorG) ? m_CustomMessage[nMsgNum].nColorG : m_CustomMessageFont[fontID].nColorG; + m_supertext.nColorB = (m_CustomMessage[nMsgNum].bOverrideColorB) ? m_CustomMessage[nMsgNum].nColorB : m_CustomMessageFont[fontID].nColorB; + + // randomize color + m_supertext.nColorR += (int)(m_CustomMessage[nMsgNum].nRandR * ((rand()%1037)/1037.0f*2.0f - 1.0f)); + m_supertext.nColorG += (int)(m_CustomMessage[nMsgNum].nRandG * ((rand()%1037)/1037.0f*2.0f - 1.0f)); + m_supertext.nColorB += (int)(m_CustomMessage[nMsgNum].nRandB * ((rand()%1037)/1037.0f*2.0f - 1.0f)); + if (m_supertext.nColorR < 0) m_supertext.nColorR = 0; + if (m_supertext.nColorG < 0) m_supertext.nColorG = 0; + if (m_supertext.nColorB < 0) m_supertext.nColorB = 0; + if (m_supertext.nColorR > 255) m_supertext.nColorR = 255; + if (m_supertext.nColorG > 255) m_supertext.nColorG = 255; + if (m_supertext.nColorB > 255) m_supertext.nColorB = 255; + + // fix &'s for display: + /* + { + int pos = 0; + int len = strlen(m_supertext.szText); + while (m_supertext.szText[pos] && pos<255) + { + if (m_supertext.szText[pos] == '&') + { + for (int x=len; x>=pos; x--) + m_supertext.szText[x+1] = m_supertext.szText[x]; + len++; + pos++; + } + pos++; + } + }*/ + + m_supertext.fStartTime = GetTime(); +} + +void CPlugin::LaunchSongTitleAnim() +{ + m_supertext.bRedrawSuperText = true; + m_supertext.bIsSongTitle = true; + strcpy(m_supertext.szText, m_szSongTitle); + strcpy(m_supertext.nFontFace, m_fontinfo[SONGTITLE_FONT].szFace); + m_supertext.fFontSize = (float)m_fontinfo[SONGTITLE_FONT].nSize; + m_supertext.bBold = m_fontinfo[SONGTITLE_FONT].bBold; + m_supertext.bItal = m_fontinfo[SONGTITLE_FONT].bItalic; + m_supertext.fX = 0.5f; + m_supertext.fY = 0.5f; + m_supertext.fGrowth = 1.0f; + m_supertext.fDuration = m_fSongTitleAnimDuration; + m_supertext.nColorR = 255; + m_supertext.nColorG = 255; + m_supertext.nColorB = 255; + + m_supertext.fStartTime = GetTime(); +} + +bool CPlugin::LaunchSprite(int nSpriteNum, int nSlot) +{ +#if 0 + char initcode[8192], code[8192], img[512], section[64]; + char szTemp[8192]; + + initcode[0] = 0; + code[0] = 0; + img[0] = 0; + sprintf(section, "img%02d", nSpriteNum); + + // 1. read in image filename + InternalGetPrivateProfileString(section, "img", "", img, sizeof(img)-1, m_szImgIniFile); + if (img[0] == 0) + { + sprintf(m_szUserMessage, "sprite #%d error: couldn't find 'img=' setting, or sprite is not defined", nSpriteNum); + m_fShowUserMessageUntilThisTime = GetTime() + 7.0f; + return false; + } + + if (img[1] != ':' || img[2] != '\\') + { + // it's not in the form "x:\blah\billy.jpg" so prepend plugin dir path. + char temp[512]; + strcpy(temp, img); + sprintf(img, "%s%s", m_szWinampPluginsPath, temp); + } + + // 2. get color key + //unsigned int ck_lo = (unsigned int)InternalGetPrivateProfileInt(section, "colorkey_lo", 0x00000000, m_szImgIniFile); + //unsigned int ck_hi = (unsigned int)InternalGetPrivateProfileInt(section, "colorkey_hi", 0x00202020, m_szImgIniFile); + // FIRST try 'colorkey_lo' (for backwards compatibility) and then try 'colorkey' + unsigned int ck = (unsigned int)InternalGetPrivateProfileInt(section, "colorkey_lo", 0x00000000, m_szImgIniFile); + ck = (unsigned int)InternalGetPrivateProfileInt(section, "colorkey", ck, m_szImgIniFile); + + // 3. read in init code & per-frame code + for (int n=0; n<2; n++) + { + char *pStr = (n==0) ? initcode : code; + char szLineName[32]; + int len; + + int line = 1; + int char_pos = 0; + bool bDone = false; + + while (!bDone) + { + if (n==0) + sprintf(szLineName, "init_%d", line); + else + sprintf(szLineName, "code_%d", line); + + + InternalGetPrivateProfileString(section, szLineName, "~!@#$", szTemp, 8192, m_szImgIniFile); // fixme + len = strlen(szTemp); + + if ((strcmp(szTemp, "~!@#$")==0) || // if the key was missing, + (len >= 8191-char_pos-1)) // or if we're out of space + { + bDone = true; + } + else + { + sprintf(&pStr[char_pos], "%s%c", szTemp, LINEFEED_CONTROL_CHAR); + } + + char_pos += len + 1; + line++; + } + pStr[char_pos++] = 0; // null-terminate + } + + if (nSlot == -1) + { + // find first empty slot; if none, chuck the oldest sprite & take its slot. + int oldest_index = 0; + int oldest_frame = m_texmgr.m_tex[0].nStartFrame; + for (int x=0; x mysound.avg[i]) + rate = 0.2f; + else + rate = 0.5f; + rate = AdjustRateToFPS(rate, 30.0f, GetFps()); + mysound.avg[i] = mysound.avg[i]*rate + mysound.imm[i]*(1-rate); + + if (GetFrame() < 50) + rate = 0.9f; + else + rate = 0.992f; + rate = AdjustRateToFPS(rate, 30.0f, GetFps()); + mysound.long_avg[i] = mysound.long_avg[i]*rate + mysound.imm[i]*(1-rate); + + + // also get bass/mid/treble levels *relative to the past* + if (fabsf(mysound.long_avg[i]) < 0.001f) + mysound.imm_rel[i] = 1.0f; + else + mysound.imm_rel[i] = mysound.imm[i] / mysound.long_avg[i]; + + if (fabsf(mysound.long_avg[i]) < 0.001f) + mysound.avg_rel[i] = 1.0f; + else + mysound.avg_rel[i] = mysound.avg[i] / mysound.long_avg[i]; + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/plugin.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/plugin.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/plugin.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/plugin.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,451 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef __NULLSOFT_DX8_EXAMPLE_PLUGIN_H__ +#define __NULLSOFT_DX8_EXAMPLE_PLUGIN_H__ 1 + +#include "pluginshell.h" +#include "md_defines.h" +//#include "menu.h" +#include "support.h" +//#include "texmgr.h" +#include "state.h" + +typedef enum { UI_REGULAR, UI_MENU, UI_LOAD, UI_LOAD_DEL, UI_LOAD_RENAME, UI_SAVEAS, UI_SAVE_OVERWRITE, UI_EDIT_MENU_STRING, UI_CHANGEDIR, UI_IMPORT_WAVE, UI_EXPORT_WAVE, UI_IMPORT_SHAPE, UI_EXPORT_SHAPE } ui_mode; +typedef struct { float rad; float ang; float a; float c; } td_vertinfo; // blending: mix = max(0,min(1,a*t + c)); +typedef char* CHARPTR; +LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + +#define MY_FFT_SAMPLES 512 // for old [pre-vms] milkdrop sound analysis +typedef struct +{ + float imm[3]; // bass, mids, treble (absolute) + float imm_rel[3]; // bass, mids, treble (relative to song; 1=avg, 0.9~below, 1.1~above) + float avg[3]; // bass, mids, treble (absolute) + float avg_rel[3]; // bass, mids, treble (relative to song; 1=avg, 0.9~below, 1.1~above) + float long_avg[3]; // bass, mids, treble (absolute) + float fWave[2][576]; + float fSpecLeft[MY_FFT_SAMPLES]; +} td_mysounddata; + +typedef struct +{ + int bActive; + int bFilterBadChars; // if true, it will filter out any characters that don't belong in a filename, plus the & symbol (because it doesn't display properly with DrawText) + int bDisplayAsCode; // if true, semicolons will be followed by a newline, for display + int nMaxLen; // can't be more than 511 + int nCursorPos; + int nSelAnchorPos; // -1 if no selection made + int bOvertypeMode; + char szText[8192]; + char szPrompt[512]; + char szToolTip[512]; + char szClipboard[8192]; +} td_waitstr; + +typedef struct +{ + int bBold; + int bItal; + char szFace[128]; + int nColorR; // 0..255 + int nColorG; // 0..255 + int nColorB; // 0..255 +} +td_custom_msg_font; + +typedef struct +{ + char szFace[256]; + int nSize; + int bBold; + int bItalic; +} td_titlefontinfo; + +typedef struct +{ + int nFont; + float fSize; // 0..100 + float x; + float y; + float randx; + float randy; + float growth; + float fTime; // total time to display the message, in seconds + float fFade; // % (0..1) of the time that is spent fading in + + // overrides + int bOverrideBold; + int bOverrideItal; + int bOverrideFace; + int bOverrideColorR; + int bOverrideColorG; + int bOverrideColorB; + int nColorR; // 0..255 + int nColorG; // 0..255 + int nColorB; // 0..255 + int nRandR; + int nRandG; + int nRandB; + int bBold; + int bItal; + char szFace[128]; + + char szText[256]; +} +td_custom_msg; + +typedef struct +{ + int bRedrawSuperText; // true if it needs redraw + int bIsSongTitle; // false for custom message, true for song title + char szText[256]; + char nFontFace[128]; + int bBold; + int bItal; + float fX; + float fY; + float fFontSize; // [0..100] for custom messages, [0..4] for song titles + float fGrowth; // applies to custom messages only + int nFontSizeUsed; // height IN PIXELS + float fStartTime; + float fDuration; + float fFadeTime; // applies to custom messages only; song title fade times are handled specially + int nColorR; + int nColorG; + int nColorB; +} +td_supertext; + +class CPlugin : public CPluginShell +{ +public: + + //====[ 1. members added to create this specific example plugin: ]================================================ + + /// CONFIG PANEL SETTINGS THAT WE'VE ADDED (TAB #2) + bool m_bFirstRun; + float m_fBlendTimeAuto; // blend time when preset auto-switches + float m_fBlendTimeUser; // blend time when user loads a new preset + float m_fTimeBetweenPresets; // <- this is in addition to m_fBlendTimeAuto + float m_fTimeBetweenPresetsRand; // <- this is in addition to m_fTimeBetweenPresets + bool m_bSequentialPresetOrder; + bool m_bHoldPreset; + bool m_bHardCutsDisabled; + float m_fHardCutLoudnessThresh; + float m_fHardCutHalflife; + float m_fHardCutThresh; + //int m_nWidth; + //int m_nHeight; + //int m_nDispBits; + int m_nTexSize; + int m_nGridX; + int m_nGridY; + + bool m_bShowPressF1ForHelp; + //char m_szMonitorName[256]; + bool m_bShowMenuToolTips; + int m_n16BitGamma; + bool m_bAutoGamma; + //int m_nFpsLimit; + int m_cLeftEye3DColor[3]; + int m_cRightEye3DColor[3]; + bool m_bEnableRating; + bool m_bInstaScan; + bool m_bSongTitleAnims; + float m_fSongTitleAnimDuration; + float m_fTimeBetweenRandomSongTitles; + float m_fTimeBetweenRandomCustomMsgs; + int m_nSongTitlesSpawned; + int m_nCustMsgsSpawned; + + bool m_bAlways3D; + float m_fStereoSep; + //bool m_bAlwaysOnTop; + //bool m_bFixSlowText; + bool m_bWarningsDisabled; // messageboxes + bool m_bWarningsDisabled2; // warnings/errors in upper-right corner (m_szUserMessage) + bool m_bAnisotropicFiltering; + bool m_bPresetLockOnAtStartup; + + /* + char m_szFontFace[NUM_FONTS][128]; + int m_nFontSize[NUM_FONTS]; + bool m_bFontBold[NUM_FONTS]; + bool m_bFontItalic[NUM_FONTS]; + char m_szTitleFontFace[128]; + int m_nTitleFontSize; // percentage of screen width (0..100) + bool m_bTitleFontBold; + bool m_bTitleFontItalic; + */ +// HFONT m_gdi_title_font_doublesize; +// LPD3DXFONT m_d3dx_title_font_doublesize; + + // RUNTIME SETTINGS THAT WE'VE ADDED + float m_prev_time; + bool m_bTexSizeWasAuto; + bool m_bPresetLockedByUser; + bool m_bPresetLockedByCode; + float m_fAnimTime; + float m_fStartTime; + float m_fPresetStartTime; + float m_fNextPresetTime; + CState *m_pState; // points to current CState + CState *m_pOldState; // points to previous CState + CState m_state_DO_NOT_USE[2]; // do not use; use pState and pOldState instead. + ui_mode m_UI_mode; // can be UI_REGULAR, UI_LOAD, UI_SAVEHOW, or UI_SAVEAS + //td_playlist_entry *m_szPlaylist; // array of 128-char strings + //int m_nPlaylistCurPos; + //int m_nPlaylistLength; + //int m_nTrackPlaying; + //int m_nSongPosMS; + //int m_nSongLenMS; + bool m_bUserPagedUp; + bool m_bUserPagedDown; + float m_fMotionVectorsTempDx; + float m_fMotionVectorsTempDy; + + td_waitstr m_waitstring; + void WaitString_NukeSelection(); + void WaitString_Cut(); + void WaitString_Copy(); + void WaitString_Paste(); + void WaitString_SeekLeftWord(); + void WaitString_SeekRightWord(); + int WaitString_GetCursorColumn(); + int WaitString_GetLineLength(); + void WaitString_SeekUpOneLine(); + void WaitString_SeekDownOneLine(); + + int m_nPresets; // the # of entries in the file listing. Includes directories and then files, sorted alphabetically. + int m_nDirs; // the # of presets that are actually directories. Always between 0 and m_nPresets. + int m_nPresetListCurPos;// Index (in m_pPresetAddr[]) of the currently-HIGHLIGHTED preset (the user must press Enter on it to select it). + int m_nCurrentPreset; // Index (in m_pPresetAddr[]) of the currently-RUNNING preset. + // Note that this is NOT the same as the currently-highlighted preset! (that's m_nPresetListCurPos) + // Be careful - this can be -1 if the user changed dir. & a new preset hasn't been loaded yet. + char m_szCurrentPresetFile[512]; // this is always valid (unless no presets were found) + CHARPTR *m_pPresetAddr; // slot n of this array is a pointer to the nth string in m_szpresets. (optimization; allows for constant-time access.) Each entry is just a filename + extension (with no path - the path is m_szPresetDir for all of them). + float *m_pfPresetRating; // not-cumulative version + char *m_szpresets; // 1 giant dynamically-allocated string; actually a string-of-strings, containing 'm_nPresets' null-terminated strings one after another; and the last string is followed with two NULL characters instead of just one. + int m_nSizeOfPresetList; // the # of bytes currently allocated for 'm_szpresets' + int m_nRatingReadProgress; // equals 'm_nPresets' if all ratings are read in & ready to go; -1 if uninitialized; otherwise, it's still reading them in, and range is: [0 .. m_nPresets-1] + + FFT myfft; + td_mysounddata mysound; + + // stuff for displaying text to user: + //int m_nTextHeightPixels; // this is for the menu/detail font; NOT the "fancy font" + //int m_nTextHeightPixels_Fancy; + bool m_bShowFPS; + bool m_bShowRating; + bool m_bShowPresetInfo; + bool m_bShowDebugInfo; + bool m_bShowSongTitle; + bool m_bShowSongTime; + bool m_bShowSongLen; + float m_fShowUserMessageUntilThisTime; + float m_fShowRatingUntilThisTime; + char m_szUserMessage[512]; + char m_szDebugMessage[512]; + char m_szSongTitle [512]; + char m_szSongTitlePrev[512]; + //HFONT m_hfont[3]; // 0=fancy font (for song titles, preset name) + // 1=legible font (the main font) + // 2=tooltip font (for tooltips in the menu system) + //HFONT m_htitlefont[NUM_TITLE_FONTS]; // ~25 different sizes + // stuff for menu system: +/* CMilkMenu *m_pCurMenu; // should always be valid! + CMilkMenu m_menuPreset; + CMilkMenu m_menuWave; + CMilkMenu m_menuAugment; + CMilkMenu m_menuCustomWave; + CMilkMenu m_menuCustomShape; + CMilkMenu m_menuMotion; + CMilkMenu m_menuPost; + CMilkMenu m_menuWavecode[MAX_CUSTOM_WAVES]; + CMilkMenu m_menuShapecode[MAX_CUSTOM_SHAPES]; +*/ + char m_szWinampPluginsPath[MAX_PATH]; // ends in a backslash + char m_szMsgIniFile[MAX_PATH]; + char m_szImgIniFile[MAX_PATH]; + char m_szPresetDir[MAX_PATH]; + float m_fRandStart[4]; + + // DIRECTX 8: + IDirect3DTexture9 *m_lpVS[2]; + IDirect3DSurface9 *m_pZBuffer; +// IDirect3DTexture8 *m_lpDDSTitle; // CAREFUL: MIGHT BE NULL (if not enough mem)! + int m_nTitleTexSizeX, m_nTitleTexSizeY; + SPRITEVERTEX *m_verts; + SPRITEVERTEX *m_verts_temp; + td_vertinfo *m_vertinfo; + WORD *m_indices; + + bool m_bMMX; + //bool m_bSSE; + bool m_bHasFocus; + bool m_bHadFocus; + bool m_bOrigScrollLockState; + bool m_bMilkdropScrollLockState; // saved when focus is lost; restored when focus is regained + + int m_nNumericInputMode; // NUMERIC_INPUT_MODE_CUST_MSG, NUMERIC_INPUT_MODE_SPRITE + int m_nNumericInputNum; + int m_nNumericInputDigits; + td_custom_msg_font m_CustomMessageFont[MAX_CUSTOM_MESSAGE_FONTS]; + td_custom_msg m_CustomMessage[MAX_CUSTOM_MESSAGES]; + +// texmgr m_texmgr; // for user sprites + + td_supertext m_supertext; // **contains info about current Song Title or Custom Message.** + + IDirect3DTexture9 *m_tracer_tex; + + //====[ 2. methods added: ]===================================================================================== + + void RefreshTab2(HWND hwnd); + void RenderFrame(int bRedraw); + void AlignWave(int nSamples); + + void DrawTooltip(char* str, int xR, int yB); + void RandomizeBlendPattern(); + void GenPlasma(int x0, int x1, int y0, int y1, float dt); + void LoadPerFrameEvallibVars(CState* pState); + void LoadCustomWavePerFrameEvallibVars(CState* pState, int i); + void LoadCustomShapePerFrameEvallibVars(CState* pState, int i); + void WriteRealtimeConfig(); // called on Finish() + void dumpmsg(char *s); + void Randomize(); + void LoadRandomPreset(float fBlendTime); + void LoadNextPreset(float fBlendTime); + void LoadPreviousPreset(float fBlendTime); + void LoadPreset(char *szPresetFilename, float fBlendTime); + void UpdatePresetList(); + void UpdatePresetRatings(); + //char* GetConfigIniFile() { return m_szConfigIniFile; }; + char* GetMsgIniFile() { return m_szMsgIniFile; }; + char* GetPresetDir() { return m_szPresetDir; }; + void SavePresetAs(char *szNewFile); // overwrites the file if it was already there. + void DeletePresetFile(char *szDelFile); + void RenamePresetFile(char *szOldFile, char *szNewFile); + void SetCurrentPresetRating(float fNewRating); + void SeekToPreset(char cStartChar); + bool ReversePropagatePoint(float fx, float fy, float *fx2, float *fy2); + int HandleRegularKey(WPARAM wParam); + bool OnResizeGraphicsWindow(); + bool OnResizeTextWindow(); + //bool InitFont(); + //void ToggleControlWindow(); // for Desktop Mode only + //void DrawUI(); + void ClearGraphicsWindow(); // for windowed mode only + //bool Update_Overlay(); + //void UpdatePlaylist(); + void LaunchCustomMessage(int nMsgNum); + void ReadCustomMessages(); + void LaunchSongTitleAnim(); + + bool RenderStringToTitleTexture(); + void ShowSongTitleAnim(/*IDirect3DTexture8* lpRenderTarget,*/ int w, int h, float fProgress); + void DrawWave(float *fL, float *fR); + void DrawCustomWaves(); + void DrawCustomShapes(); + void DrawSprites(); + void WarpedBlitFromVS0ToVS1(); + void RunPerFrameEquations(); + void ShowToUser(int bRedraw); + void DrawUserSprites(); + void MergeSortPresets(int left, int right); + void BuildMenus(); + //void ResetWindowSizeOnDisk(); + bool LaunchSprite(int nSpriteNum, int nSlot); + void KillSprite(int iSlot); + void DoCustomSoundAnalysis(); + void DrawMotionVectors(); + + //====[ 3. virtual functions: ]=========================================================================== + + virtual void OverrideDefaults(); + virtual void MyPreInitialize(); + virtual void MyReadConfig(); + virtual void MyWriteConfig(); + virtual int AllocateMyNonDx8Stuff(); + virtual void CleanUpMyNonDx8Stuff(); + virtual int AllocateMyDX8Stuff(); + virtual void CleanUpMyDX8Stuff(int final_cleanup); + virtual void MyRenderFn(int redraw); + virtual void MyRenderUI(int *upper_left_corner_y, int *upper_right_corner_y, int *lower_left_corner_y, int *lower_right_corner_y, int xL, int xR); + virtual LRESULT MyWindowProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam); + virtual BOOL MyConfigTabProc(int nPage, HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + + //====[ 4. methods from base class: ]=========================================================================== + /* + // 'GET' METHODS + // ------------------------------------------------------------ + int GetFrame(); // returns current frame # (starts at zero) + float GetTime(); // returns current animation time (in seconds) (starts at zero) (updated once per frame) + float GetFps(); // returns current estimate of framerate (frames per second) + eScrMode GetScreenMode(); // returns WINDOWED, FULLSCREEN, FAKE_FULLSCREEN, or NOT_YET_KNOWN (if called before or during OverrideDefaults()). + HWND GetWinampWindow(); // returns handle to Winamp main window + HINSTANCE GetInstance(); // returns handle to the plugin DLL module; used for things like loading resources (dialogs, bitmaps, icons...) that are built into the plugin. + char* GetPluginsDirPath(); // usually returns 'c:\\program files\\winamp\\plugins\\' + char* GetConfigIniFile(); // usually returns 'c:\\program files\\winamp\\plugins\\something.ini' - filename is determined from identifiers in 'defines.h' + + // GET METHODS THAT ONLY WORK ONCE DIRECTX IS READY + // ------------------------------------------------------------ + // The following 'Get' methods are only available after DirectX has been initialized. + // If you call these from OverrideDefaults, MyPreInitialize, or MyReadConfig, + // they will fail and return NULL (zero). + // ------------------------------------------------------------ + HWND GetPluginWindow(); // returns handle to the plugin window. NOT persistent; can change. + int GetWidth(); // returns width of plugin window interior, in pixels. + int GetHeight(); // returns height of plugin window interior, in pixels. + D3DFORMAT GetBackBufFormat(); // returns the pixelformat of the back buffer (probably D3DFMT_R8G8B8, D3DFMT_A8R8G8B8, D3DFMT_X8R8G8B8, D3DFMT_R5G6B5, D3DFMT_X1R5G5B5, D3DFMT_A1R5G5B5, D3DFMT_A4R4G4B4, D3DFMT_R3G3B2, D3DFMT_A8R3G3B2, D3DFMT_X4R4G4B4, or D3DFMT_UNKNOWN) + D3DFORMAT GetBackBufZFormat(); // returns the pixelformat of the back buffer's Z buffer (probably D3DFMT_D16_LOCKABLE, D3DFMT_D32, D3DFMT_D15S1, D3DFMT_D24S8, D3DFMT_D16, D3DFMT_D24X8, D3DFMT_D24X4S4, or D3DFMT_UNKNOWN) + D3DCAPS8* GetCaps(); // returns a pointer to the D3DCAPS8 structer for the device. NOT persistent; can change. + LPDIRECT3DDEVICE8 GetDevice(); // returns a pointer to the DirectX 8 Device. NOT persistent; can change. + + // FONTS & TEXT + // ------------------------------------------------------------ + LPD3DXFONT GetFont(eFontIndex idx); // returns a handle to a D3DX font you can use to draw text on the screen + int GetFontHeight(eFontIndex idx); // returns the height of the font, in pixels + + // MISC + // ------------------------------------------------------------ + td_soundinfo m_sound; // a structure always containing the most recent sound analysis information; defined in pluginshell.h. + void SuggestHowToFreeSomeMem(); // gives the user a 'smart' messagebox that suggests how they can free up some video memory. + */ + //===================================================================================================================== + +}; + + + + + +#endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/pluginshell.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/pluginshell.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/pluginshell.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/pluginshell.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,3543 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +/* + TO DO + ----- + + -to do/v1.06: + -FFT: high freq. data kinda sucks because of the 8-bit samples we get in; + look for justin to put 16-bit vis data into wa5. + -make an 'advanced view' button on config panel; hide complicated stuff + til they click that. + -put an asterisk(*) next to the 'max framerate' values that + are ideal (given the current windows display mode or selected FS dispmode). + -or add checkbox: "smart sync" + -> matches FPS limit to nearest integer divisor of refresh rate. + -debug.txt/logging support! + -audio: make it a DSP plugin? then we could get the complete, continuous waveform + and overlap our waveform windows, so we'd never miss a brief high note. + -bugs: + -vms plugins sometimes freeze after a several-minute pause; I've seen it + with most of them. hard to repro, though. + -running FS on monitor 2, hit ALT-TAB -> minimizes!!! + -but only if you let go of TAB first. Let go of ALT first and it's fine! + -> means it's related to the keyup... + -fix delayloadhelper leak; one for each launch to config panel/plugin. + -also, delayload(d3d8.dll) still leaks, if plugin has error initializing and + quits by returning false from PluginInitialize(). + -add config panel option to ignore fake-fullscreen tips + -"tip" boxes in dxcontext.cpp + -"notice" box on WM_ACTIVATEAPP? + -desktop mode: + -icon context menus: 'send to', 'cut', and 'copy' links do nothing. + -http://netez.com/2xExplorer/shellFAQ/bas_context.html + -create a 2nd texture to render all icon text labels into + (they're the sole reason that desktop mode is slow) + -in UpdateIconBitmaps, don't read the whole bitmap and THEN + realize it's a dupe; try to compare icon filename+index or somethign? + -DRAG AND DROP. COMPLICATED; MANY DETAILS. + -http://netez.com/2xExplorer/shellFAQ/adv_drag.html + -http://www.codeproject.com/shell/explorerdragdrop.asp + -hmm... you can't drag icons between the 2 desktops (ugh) + -multiple delete/open/props/etc + -delete + enter + arrow keys. + -try to solve mysteries w/ShellExecuteEx() and desktop *shortcuts* (*.lnk). + -(notice that when icons are selected, they get modulated by the + highlight color, when they should be blended 50% with that color.) + + --------------------------- + final touches: + -Tests: + -make sure desktop still functions/responds properly when winamp paused + -desktop mode + multimon: + -try desktop mode on all monitors + -try moving taskbar around; make sure icons are in the + right place, that context menus (general & for + specific icons) pop up in the right place, and that + text-off-left-edge is ok. + -try setting the 2 monitors to different/same resolutions + -check tab order of config panel controls! + -Clean All + -build in release mode to include in the ZIP + -leave only one file open in workspace: README.TXT. + -TEMPORARILY "ATTRIB -R" ALL FILES BEFORE ZIPPING THEM! + + --------------------------- + KEEP IN VIEW: + -EMBEDWND: + -kiv: on resize of embedwnd, it's out of our control; winamp + resizes the child every time the mouse position changes, + and we have to cleanup & reallocate everything, b/c we + can't tell when the resize begins & ends. + [justin said he'd fix in wa5, though] + -kiv: with embedded windows of any type (plugin, playlist, etc.) + you can't place the winamp main wnd over them. + -kiv: tiny bug (IGNORE): when switching between embedwnd & + no-embedding, the window gets scooted a tiny tiny bit. + -kiv: fake fullscreen mode w/multiple monitors: there is no way + to keep the taskbar from popping up [potentially overtop of + the plugin] when you click on something besides the plugin. + To get around this, use true fullscreen mode. + -kiv: max_fps implementation assumptions: + -that most computers support high-precision timer + -that no computers [regularly] sleep for more than 1-2 ms + when you call Sleep(1) after timeBeginPeriod(1). + -reminder: if vms_desktop.dll's interface needs changed, + it will have to be renamed! (version # upgrades are ok + as long as it won't break on an old version; if the + new functionality is essential, rename the DLL.) + + --------------------------- + REMEMBER: + -GF2MX + GF4 have icon scooting probs in desktop mode + (when taskbar is on upper or left edge of screen) + -Radeon is the one w/super slow text probs @ 1280x1024. + (it goes unstable after you show playlist AND helpscr; -> ~1 fps) + -Mark's win98 machine has hidden cursor (in all modes), + but no one else seems to have this problem. + -links: + -win2k-only-style desktop mode: (uses VirtualAllocEx, vs. DLL Injection) + http://www.digiwar.com/scripts/renderpage.php?section=2&subsection=2 + -http://www.experts-exchange.com/Programming/Programming_Platforms/Win_Prog/Q_20096218.html +*/ + +//#include +#include +#include "pluginshell.h" +#include "utility.h" +#include "defines.h" +#include "shell_defines.h" +//#include "resource.h" +//#include "vis.h" +#include +#include +#include +//#include +//#pragma comment(lib,"winmm.lib") // for timeGetTime + +// STATE VALUES & VERTEX FORMATS FOR HELP SCREEN TEXTURE: +#define TEXT_SURFACE_NOT_READY 0 +#define TEXT_SURFACE_REQUESTED 1 +#define TEXT_SURFACE_READY 2 +#define TEXT_SURFACE_ERROR 3 +typedef struct _HELPVERTEX +{ + float x, y; // screen position + float z; // Z-buffer depth + DWORD Diffuse; // diffuse color. also acts as filler; aligns struct to 16 bytes (good for random access/indexed prims) + float tu, tv; // texture coordinates for texture #0 +} HELPVERTEX, *LPHELPVERTEX; +#define HELP_VERTEX_FORMAT (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1) +typedef struct _SIMPLEVERTEX +{ + float x, y; // screen position + float z; // Z-buffer depth + DWORD Diffuse; // diffuse color. also acts as filler; aligns struct to 16 bytes (good for random access/indexed prims) +} SIMPLEVERTEX, *LPSIMPLEVERTEX; +#define SIMPLE_VERTEX_FORMAT (D3DFVF_XYZ | D3DFVF_DIFFUSE) + +extern char g_szHelp[]; +//extern winampVisModule mod1; + +// resides in vms_desktop.dll/lib: +void getItemData(int x); + + +CPluginShell::CPluginShell() +{ + // this should remain empty! +} + +CPluginShell::~CPluginShell() +{ + // this should remain empty! +} + +eScrMode CPluginShell::GetScreenMode() { return m_screenmode; }; +int CPluginShell::GetFrame() { return m_frame; }; +float CPluginShell::GetTime() { return m_time; }; +float CPluginShell::GetFps() { return m_fps; }; +HWND CPluginShell::GetPluginWindow() { if (m_lpDX) return m_lpDX->GetHwnd(); else return NULL; }; +int CPluginShell::GetWidth() { if (m_lpDX) return m_lpDX->m_client_width; else return 0; }; +int CPluginShell::GetHeight() { if (m_lpDX) return m_lpDX->m_client_height; else return 0; }; +HWND CPluginShell::GetWinampWindow() { return m_hWndWinamp; }; +HINSTANCE CPluginShell::GetInstance() { return m_hInstance; }; +char* CPluginShell::GetPluginsDirPath() { return m_szPluginsDirPath; }; +char* CPluginShell::GetConfigIniFile() { return m_szConfigIniFile; }; +//int CPluginShell::GetFontHeight(eFontIndex idx) { if (idx >= 0 && idx < NUM_BASIC_FONTS + NUM_EXTRA_FONTS) return m_fontinfo[idx].nSize; else return 0; }; +int CPluginShell::GetBitDepth() { return m_lpDX->GetBitDepth(); }; +LPDIRECT3DDEVICE9 CPluginShell::GetDevice() { if (m_lpDX) return m_lpDX->m_lpDevice; else return NULL; }; +D3DCAPS9* CPluginShell::GetCaps() { if (m_lpDX) return &(m_lpDX->m_caps); else return NULL; }; +D3DFORMAT CPluginShell::GetBackBufFormat() { if (m_lpDX) return m_lpDX->m_current_mode.display_mode.Format; else return D3DFMT_UNKNOWN; }; +D3DFORMAT CPluginShell::GetBackBufZFormat() { if (m_lpDX) return m_lpDX->GetZFormat(); else return D3DFMT_UNKNOWN; }; +//LPD3DXFONT CPluginShell::GetFont(eFontIndex idx) { if (idx >= 0 && idx < NUM_BASIC_FONTS + NUM_EXTRA_FONTS) return m_d3dx_font[idx]; else return NULL; }; +char* CPluginShell::GetDriverFilename() { if (m_lpDX) return m_lpDX->GetDriver(); else return NULL; }; +char* CPluginShell::GetDriverDescription() { if (m_lpDX) return m_lpDX->GetDesc(); else return NULL; }; + + +int CPluginShell::InitNonDx8Stuff() +{ +// timeBeginPeriod(1); + m_fftobj.Init(512, NUM_FREQUENCIES); + if (!InitGDIStuff()) return false; + return AllocateMyNonDx8Stuff(); +} + +void CPluginShell::CleanUpNonDx8Stuff() +{ +// timeEndPeriod(1); + CleanUpMyNonDx8Stuff(); + CleanUpGDIStuff(); + m_fftobj.CleanUp(); +} + +int CPluginShell::InitGDIStuff() +{ +#if 0 + // note: messagebox parent window should be NULL here, because lpDX is still NULL! + + for (int i=0; iGetAdapterCount(); + for (int i=0; iGetAdapterIdentifier(i, D3DENUM_NO_WHQL_LEVEL, &temp) == D3D_OK) && + (memcmp(&temp.DeviceIdentifier, &m_adapter_guid_windowed, sizeof(GUID))==0)) + { + ordinal_adapter = i; + break; + } + } + + // Get current display mode for windowed-mode adapter: + D3DDISPLAYMODE dm; + if (D3D_OK != m_vjd3d8->GetAdapterDisplayMode(ordinal_adapter, &dm)) + { + MessageBox(NULL,"VJ mode init error: error determining color format\rfor currently-selected Windowed Mode display adapter.","MILKDROP ERROR",MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return false; + } + + // And get the upper-left corner of the monitor for it: + HMONITOR hMon = m_vjd3d8->GetAdapterMonitor(ordinal_adapter); + if (hMon) + { + MONITORINFO mi; + mi.cbSize = sizeof(mi); + if (GetMonitorInfo(hMon, &mi)) + { + upper_left_corner.x = mi.rcWork.left; + upper_left_corner.y = mi.rcWork.top; + } + } + + // CREATE THE WINDOW + + RECT rect; + if (pClientRect) + { + rect = *pClientRect; + AdjustWindowRect(&rect, dwStyle, 0); // convert client->wnd + } + else + { + SetRect(&rect, 0, 0, 384, 384); + AdjustWindowRect(&rect, dwStyle, 0); // convert client->wnd + + rect.right -= rect.left; + rect.left = 0; + rect.bottom -= rect.top; + rect.top = 0; + + rect.top += upper_left_corner.y+32; + rect.left += upper_left_corner.x+32; + rect.right += upper_left_corner.x+32; + rect.bottom += upper_left_corner.y+32; + } + + WNDCLASS wc; + memset(&wc,0,sizeof(wc)); + wc.lpfnWndProc = VJModeWndProc; // our window procedure + wc.hInstance = GetInstance(); // hInstance of DLL + wc.hIcon = LoadIcon( GetInstance(), MAKEINTRESOURCE(IDI_PLUGIN_ICON) ); + wc.lpszClassName = TEXT_WINDOW_CLASSNAME; // our window class name + wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; // CS_DBLCLKS lets the window receive WM_LBUTTONDBLCLK, for toggling fullscreen mode... + wc.cbClsExtra = 0; + wc.cbWndExtra = sizeof(DWORD); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); + wc.lpszMenuName = NULL; + + if (!RegisterClass(&wc)) + { + MessageBox(NULL,"Error registering window class for text window","MILKDROP ERROR",MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return false; + } + m_bTextWindowClassRegistered = true; + + //DWORD nThreadID; + //CreateThread(NULL, 0, TextWindowThread, &rect, 0, &nThreadID); + + // Create the text window + m_hTextWnd = CreateWindowEx( + 0, + TEXT_WINDOW_CLASSNAME, // our window class name + TEXT_WINDOW_CLASSNAME, // use description for a window title + dwStyle, + rect.left, rect.top, // screen position (read from config) + rect.right - rect.left, rect.bottom - rect.top, // width & height of window (need to adjust client area later) + NULL, // parent window (winamp main window) + NULL, // no menu + GetInstance(), // hInstance of DLL + NULL + ); // no window creation data + + if (!m_hTextWnd) + { + MessageBox(NULL,"Error creating VJ window","MILKDROP ERROR",MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return false; + } + + SetWindowLong(m_hTextWnd, GWL_USERDATA, (LONG)this); + + GetClientRect(m_hTextWnd, &rect); + m_nTextWndWidth = rect.right-rect.left; + m_nTextWndHeight = rect.bottom-rect.top; + + + // Create the device + D3DPRESENT_PARAMETERS pres_param; + pres_param.BackBufferCount = 1; + pres_param.BackBufferFormat = dm.Format; + pres_param.BackBufferWidth = rect.right - rect.left; + pres_param.BackBufferHeight = rect.bottom - rect.top; + pres_param.hDeviceWindow = m_hTextWnd; + pres_param.AutoDepthStencilFormat = D3DFMT_D16; + pres_param.EnableAutoDepthStencil = FALSE; + pres_param.SwapEffect = D3DSWAPEFFECT_DISCARD; + pres_param.MultiSampleType = D3DMULTISAMPLE_NONE; + pres_param.Flags = 0; + pres_param.FullScreen_RefreshRateInHz = 0; + pres_param.FullScreen_PresentationInterval = 0; + pres_param.Windowed = TRUE; + + HRESULT hr; + if (D3D_OK != (hr = m_vjd3d8->CreateDevice(ordinal_adapter,//D3DADAPTER_DEFAULT, + D3DDEVTYPE_HAL, + m_hTextWnd, + D3DCREATE_SOFTWARE_VERTEXPROCESSING, + &pres_param, + &m_vjd3d8_device))) + { + m_vjd3d8_device = NULL; + MessageBox(m_lpDX->GetHwnd(),"Error creating D3D device for VJ mode","MILKDROP ERROR",MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return false; + } + + if (!AllocateFonts(m_vjd3d8_device)) + return false; + + if (m_fix_slow_text) // note that when not doing vj mode, m_lpDDSText is allocated in AllocateDX8Stuff + AllocateTextSurface(); + + m_text.Finish(); + m_text.Init(m_vjd3d8_device, m_lpDDSText, 0); + } +#endif + return true; +} + +void CPluginShell::CleanUpVJStuff() +{ +#if 0 + // ALWAYS set the textures to NULL before releasing textures, + // otherwise they might still have a hanging reference! + if (m_lpDX && m_lpDX->m_lpDevice) + { + m_lpDX->m_lpDevice->SetTexture(0, NULL); + m_lpDX->m_lpDevice->SetTexture(1, NULL); + } + + if (m_vjd3d8_device) + { + m_vjd3d8_device->SetTexture(0, NULL); + m_vjd3d8_device->SetTexture(1, NULL); + } + + // clean up VJ mode + { + if (m_vjd3d8_device) + { + CleanUpFonts(); + SafeRelease(m_lpDDSText); + } + + SafeRelease(m_vjd3d8_device); + SafeRelease(m_vjd3d8); + + if (m_hTextWnd) + { + //dumpmsg("Finish: destroying text window"); + DestroyWindow(m_hTextWnd); + m_hTextWnd = NULL; + //dumpmsg("Finish: text window destroyed"); + } + + if (m_bTextWindowClassRegistered) + { + //dumpmsg("Finish: unregistering text window class"); + UnregisterClass(TEXT_WINDOW_CLASSNAME,GetInstance()); // unregister window class + m_bTextWindowClassRegistered = false; + //dumpmsg("Finish: text window class unregistered"); + } + } +#endif +} + +int CPluginShell::AllocateFonts(IDirect3DDevice9* pDevice) +{ +#if 0 + // Create D3DX system font: + for (int i=0; iGetHwnd() : NULL, "Error creating D3DX fonts", "ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return false; + } + + // get actual font heights + for (i=0; iDrawText("M", -1, &r, DT_CALCRECT, 0xFFFFFFFF); + if (h>0) m_fontinfo[i].nSize = h; + } +#endif + return true; +} + +void CPluginShell::CleanUpFonts() +{ +#if 0 + for (int i=0; iGetLevelDesc(0, &desc)) + { + if ((desc.Width < 256 && w >= 256) || + (desc.Height < 256 && h >= 256) || + (desc.Width /(float)w < 0.74f) || + (desc.Height/(float)h < 0.74f) + ) + { + m_lpDDSText->Release(); + m_lpDDSText = NULL; + } + } + } +#endif +} + +int CPluginShell::AllocateDX8Stuff() +{ +// if (m_screenmode == DESKTOP) +// if (!InitDesktopMode()) +// return false; + + if (!m_vjd3d8_device) // otherwise it's done in InitVJStuff, and tied to the vj text wnd device + if (!AllocateFonts(GetDevice())) + return false; + + if (!AllocateMyDX8Stuff()) + return false; + + // OFFSCREEN TEXT SETUP: + if (m_fix_slow_text && !m_vjd3d8_device) // otherwise it's allocated in InitVJStuff + AllocateTextSurface(); + + if (!m_vjd3d8_device) // otherwise it's initialized in InitVJStuff + { +// m_text.Finish(); +// m_text.Init(GetDevice(), m_lpDDSText, 1); + } + + // invalidate various 'caches' here: + m_playlist_top_idx = -1; // invalidating playlist cache forces recompute of playlist width + //m_icon_list.clear(); // clear desktop mode icon list, so it has to read the bitmaps back in + + return true; +} + +void CPluginShell::CleanUpDX8Stuff(int final_cleanup) +{ + // ALWAYS set the textures to NULL before releasing textures, + // otherwise they might still have a hanging reference! + if (m_lpDX && m_lpDX->m_lpDevice) + { + m_lpDX->m_lpDevice->SetTexture(0, NULL); + m_lpDX->m_lpDevice->SetTexture(1, NULL); + } + + if (m_vjd3d8_device) + { + m_vjd3d8_device->SetTexture(0, NULL); + m_vjd3d8_device->SetTexture(1, NULL); + } + + //----------------------// + +// m_text.Finish(); + +// if (!m_vjd3d8_device) // otherwise it happens in CleanUpVJStuff() +// SafeRelease(m_lpDDSText); + + CleanUpMyDX8Stuff(final_cleanup); + + if (!m_vjd3d8_device) // otherwise it happens in CleanUpVJStuff() + CleanUpFonts(); + +// if (m_screenmode == DESKTOP) +// CleanUpDesktopMode(); +} + +void CPluginShell::OnUserResizeTextWindow() +{ +#if 0 + // Update window properties + RECT w, c; + GetWindowRect( m_hTextWnd, &w ); + GetClientRect( m_hTextWnd, &c ); + + WINDOWPLACEMENT wp; + ZeroMemory(&wp, sizeof(wp)); + wp.length = sizeof(wp); + GetWindowPlacement(m_hTextWnd, &wp); + + // convert client rect from client coords to screen coords: + // (window rect is already in screen coords...) + POINT p; + p.x = c.left; + p.y = c.top; + if (ClientToScreen(m_hTextWnd, &p)) + { + c.left += p.x; + c.right += p.x; + c.top += p.y; + c.bottom += p.y; + } + + if(wp.showCmd != SW_SHOWMINIMIZED) + { + if (m_nTextWndWidth != c.right-c.left || + m_nTextWndHeight != c.bottom-c.top) + { + CleanUpVJStuff(); + if (!InitVJStuff(&c)) + { + SuggestHowToFreeSomeMem(); + m_lpDX->m_ready = false; // flag to exit + return; + } + } + + // save the new window position: + //if (wp.showCmd==SW_SHOWNORMAL) + // SaveTextWindowPos(); + } +#endif +} + +void CPluginShell::OnUserResizeWindow() +{ +#if 0 + // Update window properties + RECT w, c; + GetWindowRect( m_lpDX->GetHwnd(), &w ); + GetClientRect( m_lpDX->GetHwnd(), &c ); + + WINDOWPLACEMENT wp; + ZeroMemory(&wp, sizeof(wp)); + wp.length = sizeof(wp); + GetWindowPlacement(m_lpDX->GetHwnd(), &wp); + + // convert client rect from client coords to screen coords: + // (window rect is already in screen coords...) + POINT p; + p.x = c.left; + p.y = c.top; + if (ClientToScreen(m_lpDX->GetHwnd(), &p)) + { + c.left += p.x; + c.right += p.x; + c.top += p.y; + c.bottom += p.y; + } + + if(wp.showCmd != SW_SHOWMINIMIZED) + { + if (m_lpDX->m_client_width != c.right-c.left || + m_lpDX->m_client_height != c.bottom-c.top) + { + CleanUpDX8Stuff(0); + if (!m_lpDX->OnUserResizeWindow(&w, &c)) + { + // note: a basic warning messagebox will have already been given. + // now suggest specific advice on how to regain more video memory: + SuggestHowToFreeSomeMem(); + return; + } + if (!AllocateDX8Stuff()) + { + m_lpDX->m_ready = false; // flag to exit + return; + } + } + + // save the new window position: + if (wp.showCmd==SW_SHOWNORMAL) + m_lpDX->SaveWindow(); + } +#endif +} + +void CPluginShell::StuffParams(DXCONTEXT_PARAMS *pParams) +{ + pParams->screenmode = m_screenmode; + pParams->display_mode = m_disp_mode_fs; + pParams->nbackbuf = 1; + pParams->m_dualhead_horz = m_dualhead_horz; + pParams->m_dualhead_vert = m_dualhead_vert; + pParams->m_skin = (m_screenmode==WINDOWED) ? m_skin : 0; + switch(m_screenmode) + { + case WINDOWED: + pParams->allow_page_tearing = m_allow_page_tearing_w; + pParams->adapter_guid = m_adapter_guid_windowed; + pParams->multisamp = m_multisample_windowed; + break; + case FULLSCREEN: + case FAKE_FULLSCREEN: + pParams->allow_page_tearing = m_allow_page_tearing_fs; + pParams->adapter_guid = m_adapter_guid_fullscreen; + pParams->multisamp = m_multisample_fullscreen; + break; + case DESKTOP: + pParams->allow_page_tearing = m_allow_page_tearing_dm; + pParams->adapter_guid = m_adapter_guid_desktop; + pParams->multisamp = m_multisample_desktop; + break; + } + pParams->parent_window = (m_screenmode==DESKTOP) ? m_hWndDesktopListView : NULL; +} + +void CPluginShell::ToggleDesktop() +{ + CleanUpDX8Stuff(0); + + switch(m_screenmode) + { + case WINDOWED: + case FULLSCREEN: + case FAKE_FULLSCREEN: + m_screenmode = DESKTOP; + break; + case DESKTOP: + m_screenmode = WINDOWED; + break; + } + + DXCONTEXT_PARAMS params; + StuffParams(¶ms); + + if (!m_lpDX->StartOrRestartDevice(¶ms)) + { + // note: a basic warning messagebox will have already been given. + if (m_lpDX->m_lastErr == DXC_ERR_CREATEDEV_PROBABLY_OUTOFVIDEOMEMORY) + SuggestHowToFreeSomeMem(); + return; + } + + if (!AllocateDX8Stuff()) + { + m_lpDX->m_ready = false; // flag to exit + return; + } + +// SetForegroundWindow(m_lpDX->GetHwnd()); +// SetActiveWindow(m_lpDX->GetHwnd()); +// SetFocus(m_lpDX->GetHwnd()); +} + +#define IPC_IS_PLAYING_VIDEO 501 // from wa_ipc.h +#define IPC_SET_VIS_FS_FLAG 631 // a vis should send this message with 1/as param to notify winamp that it has gone to or has come back from fullscreen mode + +void CPluginShell::ToggleFullScreen() +{ +#if 0 + CleanUpDX8Stuff(0); + + switch(m_screenmode) + { + case DESKTOP: + case WINDOWED: + m_screenmode = m_fake_fullscreen_mode ? FAKE_FULLSCREEN : FULLSCREEN; + if (m_screenmode == FULLSCREEN && SendMessage(GetWinampWindow(),WM_WA_IPC,0,IPC_IS_PLAYING_VIDEO)>1) + { + m_screenmode=FAKE_FULLSCREEN; + } + SendMessage(GetWinampWindow(),WM_WA_IPC,1,IPC_SET_VIS_FS_FLAG); + break; + case FULLSCREEN: + case FAKE_FULLSCREEN: + m_screenmode = WINDOWED; + SendMessage(GetWinampWindow(),WM_WA_IPC,0,IPC_SET_VIS_FS_FLAG); + break; + } + + DXCONTEXT_PARAMS params; + StuffParams(¶ms); + + if (!m_lpDX->StartOrRestartDevice(¶ms)) + { + // note: a basic warning messagebox will have already been given. + if (m_lpDX->m_lastErr == DXC_ERR_CREATEDEV_PROBABLY_OUTOFVIDEOMEMORY) + SuggestHowToFreeSomeMem(); + return; + } + + if (!AllocateDX8Stuff()) + { + m_lpDX->m_ready = false; // flag to exit + return; + } + + SetForegroundWindow(m_lpDX->GetHwnd()); + SetActiveWindow(m_lpDX->GetHwnd()); + SetFocus(m_lpDX->GetHwnd()); +#endif +} + +void CPluginShell::ToggleHelp() +{ + m_show_help = 1-m_show_help; +// int ret = CheckMenuItem( m_context_menu, ID_SHOWHELP, MF_BYCOMMAND | (m_show_help ? MF_CHECKED : MF_UNCHECKED) ); +} + +void CPluginShell::TogglePlaylist() +{ + m_show_playlist = 1-m_show_playlist; + m_playlist_top_idx = -1; // <- invalidates playlist cache +// int ret = CheckMenuItem( m_context_menu, ID_SHOWPLAYLIST, MF_BYCOMMAND | (m_show_playlist ? MF_CHECKED : MF_UNCHECKED) ); +} + +int CPluginShell::InitDirectX() +{ + +// m_lpDX = new DXContext(m_hWndWinamp,m_hInstance,CLASSNAME,WINDOWCAPTION,CPluginShell::WindowProc,(LONG)this, m_minimize_winamp, m_szConfigIniFile); + m_lpDX = new DXContext(m_device, m_szConfigIniFile); + if (!m_lpDX) + { +// MessageBox(NULL, "Unable to initialize DXContext;\rprobably out of memory.", "ERROR", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); + return FALSE; + } + + if (m_lpDX->m_lastErr != S_OK) + { + // warning messagebox will have already been given + delete m_lpDX; + return FALSE; + } + + // initialize graphics + DXCONTEXT_PARAMS params; + StuffParams(¶ms); + + if (!m_lpDX->StartOrRestartDevice(¶ms)) + { + // note: a basic warning messagebox will have already been given. + + if (m_lpDX->m_lastErr == DXC_ERR_CREATEDEV_PROBABLY_OUTOFVIDEOMEMORY) + { + // suggest specific advice on how to regain more video memory: + SuggestHowToFreeSomeMem(); + } + + delete m_lpDX; + m_lpDX = NULL; + return FALSE; + } + + return TRUE; +} + +void CPluginShell::CleanUpDirectX() +{ + SafeDelete(m_lpDX); +} + +int CPluginShell::PluginPreInitialize(HWND hWinampWnd, HINSTANCE hWinampInstance) +{ + + // PROTECTED CONFIG PANEL SETTINGS (also see 'private' settings, below) + m_start_fullscreen = 0; + m_start_desktop = 0; + m_fake_fullscreen_mode = 0; + m_max_fps_fs = 30; + m_max_fps_dm = 30; + m_max_fps_w = 30; + m_show_press_f1_msg = 1; + m_allow_page_tearing_w = 1; + m_allow_page_tearing_fs = 0; + m_allow_page_tearing_dm = 0; + m_minimize_winamp = 1; + m_desktop_show_icons = 1; + m_desktop_textlabel_boxes = 1; + m_desktop_manual_icon_scoot = 0; + m_desktop_555_fix = 2; + m_dualhead_horz = 2; + m_dualhead_vert = 1; + m_save_cpu = 1; + m_skin = 1; + m_fix_slow_text = 1; + + // initialize font settings: + strcpy(m_fontinfo[SIMPLE_FONT ].szFace, SIMPLE_FONT_DEFAULT_FACE ); + m_fontinfo[SIMPLE_FONT ].nSize = SIMPLE_FONT_DEFAULT_SIZE ; + m_fontinfo[SIMPLE_FONT ].bBold = SIMPLE_FONT_DEFAULT_BOLD ; + m_fontinfo[SIMPLE_FONT ].bItalic = SIMPLE_FONT_DEFAULT_ITAL ; + m_fontinfo[SIMPLE_FONT ].bAntiAliased = SIMPLE_FONT_DEFAULT_AA ; + strcpy(m_fontinfo[DECORATIVE_FONT].szFace, DECORATIVE_FONT_DEFAULT_FACE); + m_fontinfo[DECORATIVE_FONT].nSize = DECORATIVE_FONT_DEFAULT_SIZE; + m_fontinfo[DECORATIVE_FONT].bBold = DECORATIVE_FONT_DEFAULT_BOLD; + m_fontinfo[DECORATIVE_FONT].bItalic = DECORATIVE_FONT_DEFAULT_ITAL; + m_fontinfo[DECORATIVE_FONT].bAntiAliased = DECORATIVE_FONT_DEFAULT_AA ; + strcpy(m_fontinfo[HELPSCREEN_FONT].szFace, HELPSCREEN_FONT_DEFAULT_FACE); + m_fontinfo[HELPSCREEN_FONT].nSize = HELPSCREEN_FONT_DEFAULT_SIZE; + m_fontinfo[HELPSCREEN_FONT].bBold = HELPSCREEN_FONT_DEFAULT_BOLD; + m_fontinfo[HELPSCREEN_FONT].bItalic = HELPSCREEN_FONT_DEFAULT_ITAL; + m_fontinfo[HELPSCREEN_FONT].bAntiAliased = HELPSCREEN_FONT_DEFAULT_AA ; + strcpy(m_fontinfo[PLAYLIST_FONT ].szFace, PLAYLIST_FONT_DEFAULT_FACE); + m_fontinfo[PLAYLIST_FONT ].nSize = PLAYLIST_FONT_DEFAULT_SIZE; + m_fontinfo[PLAYLIST_FONT ].bBold = PLAYLIST_FONT_DEFAULT_BOLD; + m_fontinfo[PLAYLIST_FONT ].bItalic = PLAYLIST_FONT_DEFAULT_ITAL; + m_fontinfo[PLAYLIST_FONT ].bAntiAliased = PLAYLIST_FONT_DEFAULT_AA ; + + #if (NUM_EXTRA_FONTS >= 1) + strcpy(m_fontinfo[NUM_BASIC_FONTS + 0].szFace, EXTRA_FONT_1_DEFAULT_FACE); + m_fontinfo[NUM_BASIC_FONTS + 0].nSize = EXTRA_FONT_1_DEFAULT_SIZE; + m_fontinfo[NUM_BASIC_FONTS + 0].bBold = EXTRA_FONT_1_DEFAULT_BOLD; + m_fontinfo[NUM_BASIC_FONTS + 0].bItalic = EXTRA_FONT_1_DEFAULT_ITAL; + m_fontinfo[NUM_BASIC_FONTS + 0].bAntiAliased = EXTRA_FONT_1_DEFAULT_AA; + #endif + #if (NUM_EXTRA_FONTS >= 2) + strcpy(m_fontinfo[NUM_BASIC_FONTS + 1].szFace, EXTRA_FONT_2_DEFAULT_FACE); + m_fontinfo[NUM_BASIC_FONTS + 1].nSize = EXTRA_FONT_2_DEFAULT_SIZE; + m_fontinfo[NUM_BASIC_FONTS + 1].bBold = EXTRA_FONT_2_DEFAULT_BOLD; + m_fontinfo[NUM_BASIC_FONTS + 1].bItalic = EXTRA_FONT_2_DEFAULT_ITAL; + m_fontinfo[NUM_BASIC_FONTS + 1].bAntiAliased = EXTRA_FONT_2_DEFAULT_AA; + #endif + #if (NUM_EXTRA_FONTS >= 3) + strcpy(m_fontinfo[NUM_BASIC_FONTS + 2].szFace, EXTRA_FONT_3_DEFAULT_FACE); + m_fontinfo[NUM_BASIC_FONTS + 2].nSize = EXTRA_FONT_3_DEFAULT_SIZE; + m_fontinfo[NUM_BASIC_FONTS + 2].bBold = EXTRA_FONT_3_DEFAULT_BOLD; + m_fontinfo[NUM_BASIC_FONTS + 2].bItalic = EXTRA_FONT_3_DEFAULT_ITAL; + m_fontinfo[NUM_BASIC_FONTS + 2].bAntiAliased = EXTRA_FONT_3_DEFAULT_AA; + #endif + #if (NUM_EXTRA_FONTS >= 4) + strcpy(m_fontinfo[NUM_BASIC_FONTS + 3].szFace, EXTRA_FONT_4_DEFAULT_FACE); + m_fontinfo[NUM_BASIC_FONTS + 3].nSize = EXTRA_FONT_4_DEFAULT_SIZE; + m_fontinfo[NUM_BASIC_FONTS + 3].bBold = EXTRA_FONT_4_DEFAULT_BOLD; + m_fontinfo[NUM_BASIC_FONTS + 3].bItalic = EXTRA_FONT_4_DEFAULT_ITAL; + m_fontinfo[NUM_BASIC_FONTS + 3].bAntiAliased = EXTRA_FONT_4_DEFAULT_AA; + #endif + #if (NUM_EXTRA_FONTS >= 5) + strcpy(m_fontinfo[NUM_BASIC_FONTS + 4].szFace, EXTRA_FONT_5_DEFAULT_FACE); + m_fontinfo[NUM_BASIC_FONTS + 4].nSize = EXTRA_FONT_5_DEFAULT_SIZE; + m_fontinfo[NUM_BASIC_FONTS + 4].bBold = EXTRA_FONT_5_DEFAULT_BOLD; + m_fontinfo[NUM_BASIC_FONTS + 4].bItalic = EXTRA_FONT_5_DEFAULT_ITAL; + m_fontinfo[NUM_BASIC_FONTS + 4].bAntiAliased = EXTRA_FONT_5_DEFAULT_AA; + #endif + + m_disp_mode_fs.Width = DEFAULT_FULLSCREEN_WIDTH; + m_disp_mode_fs.Height = DEFAULT_FULLSCREEN_HEIGHT; + m_disp_mode_fs.Format = D3DFMT_UNKNOWN; + m_disp_mode_fs.RefreshRate = 60; + + // PROTECTED STRUCTURES/POINTERS +// for (int i=0; i= m_szPluginsDirPath && *p != '\\') p--; +// if (++p >= m_szPluginsDirPath) *p = 0; + sprintf(m_szPluginsDirPath, "special://xbmc/addons/"); +// sprintf(m_szPluginsDirPath, "d:\\"); + } + sprintf(m_szConfigIniFile, "%s%s", m_szPluginsDirPath, INIFILE); + + // PRIVATE CONFIG PANEL SETTINGS + m_multisample_fullscreen = D3DMULTISAMPLE_NONE; + m_multisample_desktop = D3DMULTISAMPLE_NONE; + m_multisample_windowed = D3DMULTISAMPLE_NONE; + ZeroMemory(&m_adapter_guid_fullscreen, sizeof(GUID)); + ZeroMemory(&m_adapter_guid_desktop , sizeof(GUID)); + ZeroMemory(&m_adapter_guid_windowed , sizeof(GUID)); + + // PRIVATE RUNTIME SETTINGS + m_lost_focus = 0; + m_hidden = 0; + m_resizing = 0; + m_show_help = 0; + m_show_playlist = 0; + m_playlist_pos = 0; + m_playlist_pageups = 0; + m_playlist_top_idx = -1; + m_playlist_btm_idx = -1; + // m_playlist_width_pixels will be considered invalid whenever 'm_playlist_top_idx' is -1. + // m_playlist[256][256] will be considered invalid whenever 'm_playlist_top_idx' is -1. + m_exiting = 0; + m_upper_left_corner_y = 0; + m_lower_left_corner_y = 0; + m_upper_right_corner_y = 0; + m_lower_right_corner_y = 0; + m_left_edge = 0; + m_right_edge = 0; + m_force_accept_WM_WINDOWPOSCHANGING = 0; + + // PRIVATE - GDI STUFF + m_main_menu = NULL; + m_context_menu = NULL; +// for (i=0; i1) +// { + // m_screenmode=FAKE_FULLSCREEN; + // } + } + // else if (m_start_desktop) + // m_screenmode = DESKTOP; + // else + // m_screenmode = WINDOWED; + + MyPreInitialize(); + MyReadConfig(); + + //----- + + return TRUE; +} + +int CPluginShell::PluginInitialize(LPDIRECT3DDEVICE9 device, int iPosX, int iPosY, int iWidth, int iHeight, float pixelRatio) +{ + // note: initialize GDI before DirectX. Also separate them because + // when we change windowed<->fullscreen, or lose the device and restore it, + // we don't want to mess with any (persistent) GDI stuff. + m_device = device; + if (!InitDirectX()) return FALSE; // gives its own error messages + m_lpDX->m_client_width = iWidth; + m_lpDX->m_client_height = iHeight; + m_posX = iPosX; + m_posY = iPosY; + m_pixelRatio = pixelRatio; + + if (!InitNonDx8Stuff()) return FALSE; // gives its own error messages + if (!InitVJStuff()) return FALSE; + if (!AllocateDX8Stuff()) return FALSE; // gives its own error messages + + return TRUE; +} + +void CPluginShell::PluginQuit() +{ + CleanUpDX8Stuff(1); + CleanUpVJStuff(); + CleanUpNonDx8Stuff(); + CleanUpDirectX(); + CleanUpMyDX8Stuff(1); + +// SetFocus(m_hWndWinamp); +// SetActiveWindow(m_hWndWinamp); +// SetForegroundWindow(m_hWndWinamp); +} + +void CPluginShell::ReadConfig() +{ +#if 0 + int old_ver = InternalGetPrivateProfileInt("settings","version" ,-1,m_szConfigIniFile); + int old_subver = InternalGetPrivateProfileInt("settings","subversion",-1,m_szConfigIniFile); + + // nuke old settings from prev. version: + if (old_ver < INT_VERSION) + return; + else if (old_subver < INT_SUBVERSION) + return; + + //D3DMULTISAMPLE_TYPE m_multisample_fullscreen; + //D3DMULTISAMPLE_TYPE m_multisample_desktop; + //D3DMULTISAMPLE_TYPE m_multisample_windowed; + m_multisample_fullscreen = (D3DMULTISAMPLE_TYPE)InternalGetPrivateProfileInt("settings","multisample_fullscreen",m_multisample_fullscreen,m_szConfigIniFile); + m_multisample_desktop = (D3DMULTISAMPLE_TYPE)InternalGetPrivateProfileInt("settings","multisample_desktop",m_multisample_desktop,m_szConfigIniFile); + m_multisample_windowed = (D3DMULTISAMPLE_TYPE)InternalGetPrivateProfileInt("settings","multisample_windowed" ,m_multisample_windowed ,m_szConfigIniFile); + + //GUID m_adapter_guid_fullscreen + //GUID m_adapter_guid_desktop + //GUID m_adapter_guid_windowed + char str[256]; + InternalGetPrivateProfileString("settings","adapter_guid_fullscreen","",str,sizeof(str)-1,m_szConfigIniFile); + TextToGuid(str, &m_adapter_guid_fullscreen); + InternalGetPrivateProfileString("settings","adapter_guid_desktop","",str,sizeof(str)-1,m_szConfigIniFile); + TextToGuid(str, &m_adapter_guid_desktop); + InternalGetPrivateProfileString("settings","adapter_guid_windowed","",str,sizeof(str)-1,m_szConfigIniFile); + TextToGuid(str, &m_adapter_guid_windowed); + + /* + // FONTS + #define READ_FONT(n) { \ + InternalGetPrivateProfileString("settings","szFontFace"#n,m_fontinfo[n].szFace,m_fontinfo[n].szFace,sizeof(m_fontinfo[n].szFace), m_szConfigIniFile); \ + m_fontinfo[n].nSize = InternalGetPrivateProfileInt("settings","nFontSize"#n ,m_fontinfo[n].nSize ,m_szConfigIniFile); \ + m_fontinfo[n].bBold = InternalGetPrivateProfileInt("settings","bFontBold"#n ,m_fontinfo[n].bBold ,m_szConfigIniFile); \ + m_fontinfo[n].bItalic = InternalGetPrivateProfileInt("settings","bFontItalic"#n,m_fontinfo[n].bItalic,m_szConfigIniFile); \ + m_fontinfo[n].bAntiAliased = InternalGetPrivateProfileInt("settings","bFontAA"#n,m_fontinfo[n].bItalic,m_szConfigIniFile); \ + } + READ_FONT(0); + READ_FONT(1); + READ_FONT(2); + READ_FONT(3); + #if (NUM_EXTRA_FONTS >= 1) + READ_FONT(4); + #endif + #if (NUM_EXTRA_FONTS >= 2) + READ_FONT(5); + #endif + #if (NUM_EXTRA_FONTS >= 3) + READ_FONT(6); + #endif + #if (NUM_EXTRA_FONTS >= 4) + READ_FONT(7); + #endif + #if (NUM_EXTRA_FONTS >= 5) + READ_FONT(8); + #endif +*/ + m_start_fullscreen = InternalGetPrivateProfileInt("settings","start_fullscreen",m_start_fullscreen,m_szConfigIniFile); + m_start_desktop = InternalGetPrivateProfileInt("settings","start_desktop" ,m_start_desktop ,m_szConfigIniFile); + m_fake_fullscreen_mode = InternalGetPrivateProfileInt("settings","fake_fullscreen_mode",m_fake_fullscreen_mode,m_szConfigIniFile); + m_max_fps_fs = InternalGetPrivateProfileInt("settings","max_fps_fs",m_max_fps_fs,m_szConfigIniFile); + m_max_fps_dm = InternalGetPrivateProfileInt("settings","max_fps_dm",m_max_fps_dm,m_szConfigIniFile); + m_max_fps_w = InternalGetPrivateProfileInt("settings","max_fps_w" ,m_max_fps_w ,m_szConfigIniFile); + m_show_press_f1_msg = InternalGetPrivateProfileInt("settings","show_press_f1_msg",m_show_press_f1_msg,m_szConfigIniFile); + m_allow_page_tearing_w = InternalGetPrivateProfileInt("settings","allow_page_tearing_w",m_allow_page_tearing_w,m_szConfigIniFile); + m_allow_page_tearing_fs= InternalGetPrivateProfileInt("settings","allow_page_tearing_fs",m_allow_page_tearing_fs,m_szConfigIniFile); + m_allow_page_tearing_dm= InternalGetPrivateProfileInt("settings","allow_page_tearing_dm",m_allow_page_tearing_dm,m_szConfigIniFile); + m_minimize_winamp = InternalGetPrivateProfileInt("settings","minimize_winamp",m_minimize_winamp,m_szConfigIniFile); + m_desktop_show_icons = InternalGetPrivateProfileInt("settings","desktop_show_icons",m_desktop_show_icons,m_szConfigIniFile); + m_desktop_textlabel_boxes = InternalGetPrivateProfileInt("settings","desktop_textlabel_boxes",m_desktop_textlabel_boxes,m_szConfigIniFile); + m_desktop_manual_icon_scoot = InternalGetPrivateProfileInt("settings","desktop_manual_icon_scoot",m_desktop_manual_icon_scoot,m_szConfigIniFile); + m_desktop_555_fix = InternalGetPrivateProfileInt("settings","desktop_555_fix",m_desktop_555_fix,m_szConfigIniFile); + m_dualhead_horz = InternalGetPrivateProfileInt("settings","dualhead_horz",m_dualhead_horz,m_szConfigIniFile); + m_dualhead_vert = InternalGetPrivateProfileInt("settings","dualhead_vert",m_dualhead_vert,m_szConfigIniFile); + m_save_cpu = InternalGetPrivateProfileInt("settings","save_cpu",m_save_cpu,m_szConfigIniFile); + m_skin = InternalGetPrivateProfileInt("settings","skin",m_skin,m_szConfigIniFile); + m_fix_slow_text = InternalGetPrivateProfileInt("settings","fix_slow_text",m_fix_slow_text,m_szConfigIniFile); + m_vj_mode = GetPrivateProfileBool("settings","vj_mode",m_vj_mode,m_szConfigIniFile); + + //D3DDISPLAYMODE m_fs_disp_mode + m_disp_mode_fs.Width = InternalGetPrivateProfileInt("settings","disp_mode_fs_w",m_disp_mode_fs.Width ,m_szConfigIniFile); + m_disp_mode_fs.Height = InternalGetPrivateProfileInt("settings","disp_mode_fs_h",m_disp_mode_fs.Height ,m_szConfigIniFile); + m_disp_mode_fs.RefreshRate = InternalGetPrivateProfileInt("settings","disp_mode_fs_r",m_disp_mode_fs.RefreshRate,m_szConfigIniFile); + m_disp_mode_fs.Format = (D3DFORMAT)InternalGetPrivateProfileInt("settings","disp_mode_fs_f",m_disp_mode_fs.Format ,m_szConfigIniFile); + + // note: we don't call MyReadConfig() yet, because we + // want to completely finish CPluginShell's preinit (and ReadConfig) + // before calling CPlugin's preinit and ReadConfig. + +#endif +} + +void CPluginShell::WriteConfig() +{ +#if 0 + //D3DMULTISAMPLE_TYPE m_multisample_fullscreen; + //D3DMULTISAMPLE_TYPE m_multisample_desktop; + //D3DMULTISAMPLE_TYPE m_multisample_windowed; + WritePrivateProfileInt((int)m_multisample_fullscreen,"multisample_fullscreen",m_szConfigIniFile,"settings"); + WritePrivateProfileInt((int)m_multisample_desktop ,"multisample_desktop" ,m_szConfigIniFile,"settings"); + WritePrivateProfileInt((int)m_multisample_windowed ,"multisample_windowed" ,m_szConfigIniFile,"settings"); + + //GUID m_adapter_guid_fullscreen + //GUID m_adapter_guid_desktop + //GUID m_adapter_guid_windowed + char str[256]; + GuidToText(&m_adapter_guid_fullscreen, str, sizeof(str)); + WritePrivateProfileString("settings","adapter_guid_fullscreen",str,m_szConfigIniFile); + GuidToText(&m_adapter_guid_desktop, str, sizeof(str)); + WritePrivateProfileString("settings","adapter_guid_desktop",str,m_szConfigIniFile); + GuidToText(&m_adapter_guid_windowed, str, sizeof(str)); + WritePrivateProfileString("settings","adapter_guid_windowed" ,str,m_szConfigIniFile); + + // FONTS + #define WRITE_FONT(n) { \ + WritePrivateProfileString("settings","szFontFace"#n,m_fontinfo[n].szFace,m_szConfigIniFile); \ + WritePrivateProfileInt(m_fontinfo[n].bBold, "bFontBold"#n, m_szConfigIniFile, "settings"); \ + WritePrivateProfileInt(m_fontinfo[n].bItalic,"bFontItalic"#n, m_szConfigIniFile, "settings"); \ + WritePrivateProfileInt(m_fontinfo[n].nSize, "nFontSize"#n, m_szConfigIniFile, "settings"); \ + WritePrivateProfileInt(m_fontinfo[n].bAntiAliased, "bFontAA"#n,m_szConfigIniFile, "settings"); \ + } + WRITE_FONT(0); + WRITE_FONT(1); + WRITE_FONT(2); + WRITE_FONT(3); + #if (NUM_EXTRA_FONTS >= 1) + WRITE_FONT(4); + #endif + #if (NUM_EXTRA_FONTS >= 2) + WRITE_FONT(5); + #endif + #if (NUM_EXTRA_FONTS >= 3) + WRITE_FONT(6); + #endif + #if (NUM_EXTRA_FONTS >= 4) + WRITE_FONT(7); + #endif + #if (NUM_EXTRA_FONTS >= 5) + WRITE_FONT(8); + #endif + + WritePrivateProfileInt(m_start_fullscreen,"start_fullscreen",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_start_desktop ,"start_desktop" ,m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_fake_fullscreen_mode,"fake_fullscreen_mode",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_max_fps_fs,"max_fps_fs",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_max_fps_dm,"max_fps_dm",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_max_fps_w ,"max_fps_w" ,m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_show_press_f1_msg,"show_press_f1_msg",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_allow_page_tearing_w,"allow_page_tearing_w",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_allow_page_tearing_fs,"allow_page_tearing_fs",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_allow_page_tearing_dm,"allow_page_tearing_dm",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_minimize_winamp,"minimize_winamp",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_desktop_show_icons,"desktop_show_icons",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_desktop_textlabel_boxes,"desktop_textlabel_boxes",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_desktop_manual_icon_scoot,"desktop_manual_icon_scoot",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_desktop_555_fix,"desktop_555_fix",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_dualhead_horz,"dualhead_horz",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_dualhead_vert,"dualhead_vert",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_save_cpu,"save_cpu",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_skin,"skin",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_fix_slow_text,"fix_slow_text",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_vj_mode,"vj_mode",m_szConfigIniFile,"settings"); + + //D3DDISPLAYMODE m_fs_disp_mode + WritePrivateProfileInt(m_disp_mode_fs.Width ,"disp_mode_fs_w",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_disp_mode_fs.Height ,"disp_mode_fs_h",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_disp_mode_fs.RefreshRate,"disp_mode_fs_r",m_szConfigIniFile,"settings"); + WritePrivateProfileInt(m_disp_mode_fs.Format ,"disp_mode_fs_f",m_szConfigIniFile,"settings"); + + WritePrivateProfileInt(INT_VERSION ,"version" ,m_szConfigIniFile,"settings"); + WritePrivateProfileInt(INT_SUBVERSION ,"subversion" ,m_szConfigIniFile,"settings"); + + // finally, save the plugin's unique settings: + MyWriteConfig(); + +#endif +} + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- + +int CPluginShell::PluginRender(unsigned char *pWaveL, unsigned char *pWaveR)//, unsigned char *pSpecL, unsigned char *pSpecR) +{ + // return FALSE here to tell Winamp to terminate the plugin + + if (!m_lpDX || !m_lpDX->m_ready) + { + // note: 'm_ready' will go false when a device reset fatally fails + // (for example, when user resizes window, or toggles fullscreen.) + m_exiting = 1; + return false; // EXIT THE PLUGIN + } + +// if (m_hTextWnd) +// m_lost_focus = ((GetFocus() != GetPluginWindow()) && (GetFocus() != m_hTextWnd)); +// else +// m_lost_focus = (GetFocus() != GetPluginWindow()); + +// if ((m_screenmode==WINDOWED && m_hidden) || +// //(m_screenmode==FULLSCREEN && m_lost_focus) || +// (m_screenmode==WINDOWED && m_resizing) +// ) +// { +// Sleep(30); +// return true; +// } + + // test for lost device + // (this happens when device is fullscreen & user alt-tabs away, + // or when monitor power-saving kicks in) + //HRESULT hr = m_lpDX->m_lpDevice->TestCooperativeLevel(); + //if (hr == D3DERR_DEVICENOTRESET) + //{ + // // device WAS lost, and is now ready to be reset (and come back online): + // CleanUpDX8Stuff(0); + // if (m_lpDX->m_lpDevice->Reset(&m_lpDX->m_d3dpp) != D3D_OK) + // { + // // note: a basic warning messagebox will have already been given. + // // now suggest specific advice on how to regain more video memory: + // if (m_lpDX->m_lastErr == DXC_ERR_CREATEDEV_PROBABLY_OUTOFVIDEOMEMORY) + // SuggestHowToFreeSomeMem(); + // return false; // EXIT THE PLUGIN + // } + // if (!AllocateDX8Stuff()) + // return false; // EXIT THE PLUGIN + //} + //else if (hr != D3D_OK) + //{ + // // device is lost, and not yet ready to come back; sleep. + // Sleep(30); + // return true; + //} + +// if (m_vjd3d8_device) +// { +// HRESULT hr = m_vjd3d8_device->TestCooperativeLevel(); +// if (hr == D3DERR_DEVICENOTRESET) +// { +// RECT c; +// GetClientRect(m_hTextWnd, &c); +// +// POINT p; +// p.x = c.left; +// p.y = c.top; +// if (ClientToScreen(m_hTextWnd, &p)) +// { +// c.left += p.x; +// c.right += p.x; +// c.top += p.y; +// c.bottom += p.y; +// } +// +// CleanUpVJStuff(); +// if (!InitVJStuff(&c)) +// return false; // EXIT THE PLUGIN +// } +// } +// +// if (m_screenmode==DESKTOP) +// { +// PushWindowToJustBeforeDesktop(GetPluginWindow()); +// } + + DoTime(); + AnalyzeNewSound(pWaveL, pWaveR); + AlignWaves(); + + DrawAndDisplay(0); + + EnforceMaxFPS(); + + m_frame++; + + return true; +} + +void CPluginShell::PushWindowToJustBeforeDesktop(HWND h) +{ +#if 0 + // if our window isn't already at the bottom of the Z order, + // freshly send it to HWND_BOTTOM. + + // this usually gives us the Program Manager window: + HWND hWndBottom = GetWindow(h, GW_HWNDLAST); + + // then, bottommost 'normal' window is usually the one just in front of it: + if (hWndBottom == m_hWndProgMan) + hWndBottom = GetWindow(hWndBottom, GW_HWNDPREV); + + if (hWndBottom != h) + { + m_force_accept_WM_WINDOWPOSCHANGING = 1; + SetWindowPos(h, HWND_BOTTOM, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE); + m_force_accept_WM_WINDOWPOSCHANGING = 0; + } +#endif +} + +void CPluginShell::DrawAndDisplay(int redraw) +{ + int cx = m_vjd3d8_device ? m_nTextWndWidth : m_lpDX->m_client_width; + int cy = m_vjd3d8_device ? m_nTextWndHeight : m_lpDX->m_client_height; +/* + + if (m_lpDDSText) + { + D3DSURFACE_DESC desc; + if (D3D_OK == m_lpDDSText->GetLevelDesc(0, &desc)) + { + cx = min(cx, desc.Width); + cy = min(cy, desc.Height); + } + } +*/ + m_upper_left_corner_y = TEXT_MARGIN; + m_upper_right_corner_y = TEXT_MARGIN; + m_lower_left_corner_y = cy - TEXT_MARGIN; + m_lower_right_corner_y = cy - TEXT_MARGIN; + m_left_edge = TEXT_MARGIN; + m_right_edge = cx - TEXT_MARGIN; + + /* + if (m_screenmode == DESKTOP || m_screenmode == FAKE_FULLSCREEN) + { + // check if taskbar is above plugin window; + // if so, scoot text & icons out of the way. + // [...should always be true for Desktop Mode, + // but it's like this for code simplicity.] + int taskbar_is_above_plugin_window = 1; + HWND h = FindWindow("Shell_TrayWnd", NULL); + while (h) //(..shouldn't be very many windows to iterate through here) + { + h = GetWindow(h, GW_HWNDPREV); + if (h == GetPluginWindow()) + { + taskbar_is_above_plugin_window = 0; + break; + } + } + + if (taskbar_is_above_plugin_window) + { + // respect the taskbar area; make sure the text, desktop icons, etc. + // don't appear underneath it. + //m_upper_left_corner_y += m_lpDX->m_monitor_work_rect.top - m_lpDX->m_monitor_rect.top; + //m_upper_right_corner_y += m_lpDX->m_monitor_work_rect.top - m_lpDX->m_monitor_rect.top; + //m_lower_left_corner_y -= m_lpDX->m_monitor_rect.bottom - m_lpDX->m_monitor_work_rect.bottom; + //m_lower_right_corner_y -= m_lpDX->m_monitor_rect.bottom - m_lpDX->m_monitor_work_rect.bottom; + //m_left_edge += m_lpDX->m_monitor_work_rect.left - m_lpDX->m_monitor_rect.left; + //m_right_edge -= m_lpDX->m_monitor_rect.right - m_lpDX->m_monitor_work_rect.right; + m_lpDX->UpdateMonitorWorkRect(); + m_upper_left_corner_y = max(m_upper_left_corner_y , m_lpDX->m_monitor_work_rect.top - m_lpDX->m_monitor_rect.top + TEXT_MARGIN); + m_upper_right_corner_y = max(m_upper_right_corner_y, m_lpDX->m_monitor_work_rect.top - m_lpDX->m_monitor_rect.top + TEXT_MARGIN); + m_lower_left_corner_y = min(m_lower_left_corner_y , m_lpDX->m_client_height - (m_lpDX->m_monitor_rect.bottom - m_lpDX->m_monitor_work_rect.bottom) - TEXT_MARGIN); + m_lower_right_corner_y = min(m_lower_right_corner_y, m_lpDX->m_client_height - (m_lpDX->m_monitor_rect.bottom - m_lpDX->m_monitor_work_rect.bottom) - TEXT_MARGIN); + m_left_edge = max(m_left_edge , m_lpDX->m_monitor_work_rect.left - m_lpDX->m_monitor_rect.left + TEXT_MARGIN ); + m_right_edge = min(m_right_edge, m_lpDX->m_client_width - (m_lpDX->m_monitor_rect.right - m_lpDX->m_monitor_work_rect.right) + TEXT_MARGIN); + } + } +*/ + //if (D3D_OK==m_lpDX->m_lpDevice->BeginScene()) + { + MyRenderFn(redraw); + + //PrepareFor2DDrawing_B(GetDevice(), GetWidth(), GetHeight()); + + //RenderDesktop(); + //RenderBuiltInTextMsgs(); + //MyRenderUI(&m_upper_left_corner_y, &m_upper_right_corner_y, &m_lower_left_corner_y, &m_lower_right_corner_y, m_left_edge, m_right_edge); + //RenderPlaylist(); + +// if (!m_vjd3d8_device) +// { +// D3DXMATRIX Ortho2D; +// D3DXMatrixOrthoLH(&Ortho2D, 2.0f, -2.0f, 0.0f, 1.0f); +// m_lpDX->m_lpDevice->SetTransform(D3DTS_PROJECTION, &Ortho2D); +// +// m_text.DrawNow(); +// } + + // m_lpDX->m_lpDevice->EndScene(); + } +/* + // VJ Mode: + if (m_vjd3d8_device && !m_hidden_textwnd && D3D_OK==m_vjd3d8_device->BeginScene()) + { + if (!m_lpDDSText) + m_vjd3d8_device->Clear(0, 0, D3DCLEAR_TARGET, 0xFF000000, 1.0f, 0); + PrepareFor2DDrawing_B(m_vjd3d8_device, m_nTextWndWidth, m_nTextWndHeight); + + D3DXMATRIX Ortho2D; + D3DXMatrixOrthoLH(&Ortho2D, 2.0f, -2.0f, 0.0f, 1.0f); + m_vjd3d8_device->SetTransform(D3DTS_PROJECTION, &Ortho2D); + + m_text.DrawNow(); + + m_vjd3d8_device->EndScene(); + } + + if (m_screenmode == DESKTOP) + { + // window is hidden after creation, until 1st frame is ready to go; + // now that it's ready, we show it. + // see dxcontext::Internal_Init()'s call to SetWindowPos() for the DESKTOP case. + if (!IsWindowVisible(GetPluginWindow())) + ShowWindow(GetPluginWindow(), SW_SHOWNORMAL); + } + + m_lpDX->m_lpDevice->Present(NULL,NULL,NULL,NULL); + if (m_vjd3d8_device && !m_hidden_textwnd) + m_vjd3d8_device->Present(NULL,NULL,NULL,NULL); +*/ +} + +void CPluginShell::EnforceMaxFPS() +{ + int max_fps; + switch(m_screenmode) + { + case WINDOWED: max_fps = m_max_fps_w; break; + case FULLSCREEN: max_fps = m_max_fps_fs; break; + case FAKE_FULLSCREEN: max_fps = m_max_fps_fs; break; + case DESKTOP: max_fps = m_max_fps_dm; break; + } + + if (max_fps <= 0) + return; + + float fps_lo = (float)max_fps; + float fps_hi = (float)max_fps; + + if (m_save_cpu) + { + // Find the optimal lo/hi bounds for the fps + // that will result in a maximum difference, + // in the time for a single frame, of 0.002 seconds - + // the assumed granularity for Sleep(1) - + + // Using this range of acceptable fps + // will allow us to do (sloppy) fps limiting + // using only Sleep(1), and never the + // second half of it: Sleep(0) in a tight loop, + // which sucks up the CPU (whereas Sleep(1) + // leaves it idle). + + // The original equation: + // 1/(max_fps*t1) = 1/(max*fps/t1) - 0.002 + // where: + // t1 > 0 + // max_fps*t1 is the upper range for fps + // max_fps/t1 is the lower range for fps + + float a = 1; + float b = -0.002f * max_fps; + float c = -1.0f; + float det = b*b - 4*a*c; + if (det>0) + { + float t1 = (-b + sqrtf(det)) / (2*a); + //float t2 = (-b - sqrtf(det)) / (2*a); + + if (t1 > 1.0f) + { + fps_lo = max_fps / t1; + fps_hi = max_fps * t1; + // verify: now [1.0f/fps_lo - 1.0f/fps_hi] should equal 0.002 seconds. + // note: allowing tolerance to go beyond these values for + // fps_lo and fps_hi would gain nothing. + } + } + } + + if (m_high_perf_timer_freq.QuadPart > 0) + { + LARGE_INTEGER t; + QueryPerformanceCounter(&t); + + if (m_prev_end_of_frame.QuadPart != 0) + { + int ticks_to_wait_lo = (int)((float)m_high_perf_timer_freq.QuadPart / (float)fps_hi); + int ticks_to_wait_hi = (int)((float)m_high_perf_timer_freq.QuadPart / (float)fps_lo); + int done = 0; + do + { + QueryPerformanceCounter(&t); + + int ticks_passed = (int)(t.QuadPart - m_prev_end_of_frame.QuadPart); + //int ticks_left = ticks_to_wait - ticks_passed; + + if (t.QuadPart < m_prev_end_of_frame.QuadPart) // time wrap + done = 1; + if (ticks_passed >= ticks_to_wait_lo) + done = 1; + + if (!done) + { + // if > 0.01s left, do Sleep(1), which will actually sleep some + // steady amount of up to 2 ms (depending on the OS), + // and do so in a nice way (cpu meter drops; laptop battery spared). + // otherwise, do a few Sleep(0)'s, which just give up the timeslice, + // but don't really save cpu or battery, but do pass a tiny + // amount of time. + + //if (ticks_left > (int)m_high_perf_timer_freq.QuadPart/500) + if (ticks_to_wait_hi - ticks_passed > (int)m_high_perf_timer_freq.QuadPart/100) + Sleep(5); + else if (ticks_to_wait_hi - ticks_passed > (int)m_high_perf_timer_freq.QuadPart/1000) + Sleep(1); + else + for (int i=0; i<10; i++) + Sleep(0); // causes thread to give up its timeslice + } + } + while (!done); + } + + m_prev_end_of_frame = t; + } + else + { + Sleep(1000/max_fps); + } +} + +void CPluginShell::DoTime() +{ + if (m_frame==0) + { + m_fps = 30; + m_time = 0; + m_time_hist_pos = 0; + } + + double new_raw_time; + float elapsed; + + if (m_high_perf_timer_freq.QuadPart != 0) + { + // get high-precision time + // precision: usually from 1..6 us (MICROseconds), depending on the cpu speed. + // (higher cpu speeds tend to have better precision here) + LARGE_INTEGER t; + if (!QueryPerformanceCounter(&t)) + { + m_high_perf_timer_freq.QuadPart = 0; // something went wrong (exception thrown) -> revert to crappy timer + } + else + { + new_raw_time = (double)t.QuadPart; + elapsed = (float) ((new_raw_time - m_last_raw_time)/(double)m_high_perf_timer_freq.QuadPart); + } + } + + if (m_high_perf_timer_freq.QuadPart == 0) + { + // get low-precision time + // precision: usually 1 ms (MILLIsecond) for win98, and 10 ms for win2k. + new_raw_time = (double)(GetTickCount()*0.001); + elapsed = (float)(new_raw_time - m_last_raw_time); + } + + m_last_raw_time = new_raw_time; + int slots_to_look_back = (m_high_perf_timer_freq.QuadPart==0) ? TIME_HIST_SLOTS : TIME_HIST_SLOTS/2; + + m_time += 1.0f/m_fps; + + // timekeeping goals: + // 1. keep 'm_time' increasing SMOOTHLY: (smooth animation depends on it) + // m_time += 1.0f/m_fps; // where m_fps is a bit damped + // 2. keep m_time_hist[] 100% accurate (except for filtering out pauses), + // so that when we look take the difference between two entries, + // we get the real amount of time that passed between those 2 frames. + // m_time_hist[i] = m_last_raw_time + elapsed_corrected; + + if (m_frame > TIME_HIST_SLOTS) + { + if (m_fps < 60.0f) + slots_to_look_back = (int)(slots_to_look_back*(0.1f + 0.9f*(m_fps/60.0f))); + + if (elapsed > 5.0f/m_fps || elapsed > 1.0f || elapsed < 0) + elapsed = 1.0f / 30.0f; + + float old_hist_time = m_time_hist[(m_time_hist_pos - slots_to_look_back + TIME_HIST_SLOTS) % TIME_HIST_SLOTS]; + float new_hist_time = m_time_hist[(m_time_hist_pos - 1 + TIME_HIST_SLOTS) % TIME_HIST_SLOTS] + + elapsed; + + m_time_hist[m_time_hist_pos] = new_hist_time; + m_time_hist_pos = (m_time_hist_pos+1) % TIME_HIST_SLOTS; + + float new_fps = slots_to_look_back / (float)(new_hist_time - old_hist_time); + float damping = (m_high_perf_timer_freq.QuadPart==0) ? 0.93f : 0.87f; + + // damp heavily, so that crappy timer precision doesn't make animation jerky + if (fabsf(m_fps - new_fps) > 3.0f) + m_fps = new_fps; + else + m_fps = damping*m_fps + (1-damping)*new_fps; + } + else + { + float damping = (m_high_perf_timer_freq.QuadPart==0) ? 0.8f : 0.6f; + + if (m_frame < 2) + elapsed = 1.0f / 30.0f; + else if (elapsed > 1.0f || elapsed < 0) + elapsed = 1.0f / m_fps; + + float old_hist_time = m_time_hist[0]; + float new_hist_time = m_time_hist[(m_time_hist_pos - 1 + TIME_HIST_SLOTS) % TIME_HIST_SLOTS] + + elapsed; + + m_time_hist[m_time_hist_pos] = new_hist_time; + m_time_hist_pos = (m_time_hist_pos+1) % TIME_HIST_SLOTS; + + if (m_frame > 0) + { + float new_fps = (m_frame) / (new_hist_time - old_hist_time); + m_fps = damping*m_fps + (1-damping)*new_fps; + } + } + + // Synchronize the audio and video by telling Winamp how many milliseconds we want the audio data, + // before it's actually audible. If we set this to the amount of time it takes to display 1 frame + // (1/fps), the video and audio should be perfectly synchronized. +// if (m_fps < 2.0f) +// mod1.latencyMs = 500; +// else if (m_fps > 125.0f) +// mod1.latencyMs = 8; +// else +// mod1.latencyMs = (int)(1000.0f/m_fps*m_lpDX->m_frame_delay + 0.5f); +} + +void CPluginShell::AnalyzeNewSound(unsigned char *pWaveL, unsigned char *pWaveR) +{ + // we get 512 samples in from XBMC. + // the output of the fft has 'num_frequencies' samples, + // and represents the frequency range 0 hz - 22,050 hz. + // usually, plugins only use half of this output (the range 0 hz - 11,025 hz), + // since >10 khz doesn't usually contribute much. + + int i; + + float temp_wave[2][512]; + + int old_i = 0; + for (i=0; i<512; i++) + { + m_sound.fWaveform[0][i] = (float)((pWaveL[i] ^ 128) - 128); + m_sound.fWaveform[1][i] = (float)((pWaveR[i] ^ 128) - 128); + + // simulating single frequencies from 200 to 11,025 Hz: + //float freq = 1.0f + 11050*(GetFrame() % 100)*0.01f; + //m_sound.fWaveform[0][i] = 10*sinf(i*freq*6.28f/44100.0f); + + // damp the input into the FFT a bit, to reduce high-frequency noise: + temp_wave[0][i] = 0.5f*(m_sound.fWaveform[0][i] + m_sound.fWaveform[0][old_i]); + temp_wave[1][i] = 0.5f*(m_sound.fWaveform[1][i] + m_sound.fWaveform[1][old_i]); + old_i = i; + } + + m_fftobj.time_to_frequency_domain(temp_wave[0], m_sound.fSpectrum[0]); + m_fftobj.time_to_frequency_domain(temp_wave[1], m_sound.fSpectrum[1]); + + // sum (left channel) spectrum up into 3 bands + // [note: the new ranges do it so that the 3 bands are equally spaced, pitch-wise] + float min_freq = 200.0f; + float max_freq = 11025.0f; + float net_octaves = (logf(max_freq/min_freq) / logf(2.0f)); // 5.7846348455575205777914165223593 + float octaves_per_band = net_octaves / 3.0f; // 1.9282116151858401925971388407864 + float mult = powf(2.0f, octaves_per_band); // each band's highest freq. divided by its lowest freq.; 3.805831305510122517035102576162 + // [to verify: min_freq * mult * mult * mult should equal max_freq.] + for (int ch=0; ch<2; ch++) + { + for (int i=0; i<3; i++) + { + // old guesswork code for this: + // float exp = 2.1f; + // int start = (int)(NUM_FREQUENCIES*0.5f*powf(i/3.0f, exp)); + // int end = (int)(NUM_FREQUENCIES*0.5f*powf((i+1)/3.0f, exp)); + // results: + // old range: new range (ideal): + // bass: 0-1097 200-761 + // mids: 1097-4705 761-2897 + // treb: 4705-11025 2897-11025 + int start = (int)(NUM_FREQUENCIES * min_freq*powf(mult, i )/11025.0f); + int end = (int)(NUM_FREQUENCIES * min_freq*powf(mult, i+1)/11025.0f); + if (start < 0) start = 0; + if (end > NUM_FREQUENCIES) end = NUM_FREQUENCIES; + + m_sound.imm[ch][i] = 0; + for (int j=start; j= 10) + { + sum[0] += m_sound.imm[0]; + sum[1] += m_sound.imm[1]; + sum[2] += m_sound.imm[2]; + count++; + } + } + }*/ + + // multiply by long-term, empirically-determined inverse averages: + // (for a trial of 244 songs, 10 seconds each, somewhere in the 2nd or 3rd minute, + // the average levels were: 0.326781557 0.38087377 0.199888934 + for (int ch=0; ch<2; ch++) + { + m_sound.imm[ch][0] /= 0.326781557f;//0.270f; + m_sound.imm[ch][1] /= 0.380873770f;//0.343f; + m_sound.imm[ch][2] /= 0.199888934f;//0.295f; + } + + // do temporal blending to create attenuated and super-attenuated versions + for (int ch=0; ch<2; ch++) + { + for (i=0; i<3; i++) + { + // m_sound.avg[i] + { + float avg_mix; + if (m_sound.imm[ch][i] > m_sound.avg[ch][i]) + avg_mix = AdjustRateToFPS(0.2f, 14.0f, m_fps); + else + avg_mix = AdjustRateToFPS(0.5f, 14.0f, m_fps); + m_sound.avg[ch][i] = m_sound.avg[ch][i]*avg_mix + m_sound.imm[ch][i]*(1-avg_mix); + } + + // m_sound.med_avg[i] + // m_sound.long_avg[i] + { + float med_mix = 0.91f;//0.800f + 0.11f*powf(t, 0.4f); // primarily used for velocity_damping + float long_mix = 0.96f;//0.800f + 0.16f*powf(t, 0.2f); // primarily used for smoke plumes + med_mix = AdjustRateToFPS( med_mix, 14.0f, m_fps); + long_mix = AdjustRateToFPS(long_mix, 14.0f, m_fps); + m_sound.med_avg[ch][i] = m_sound.med_avg[ch][i]*(med_mix ) + m_sound.imm[ch][i]*(1-med_mix ); + m_sound.long_avg[ch][i] = m_sound.long_avg[ch][i]*(long_mix) + m_sound.imm[ch][i]*(1-long_mix); + } + } + } +} + +void CPluginShell::PrepareFor2DDrawing_B(IDirect3DDevice9 *pDevice, int w, int h) +{ + // New 2D drawing area will have x,y coords in the range <-1,-1> .. <1,1> + // +--------+ Y=-1 + // | | + // | screen | Z=0: front of scene + // | | Z=1: back of scene + // +--------+ Y=1 + // X=-1 X=1 + // NOTE: After calling this, be sure to then call (at least): + // 1. SetVertexShader() + // 2. SetTexture(), if you need it + // before rendering primitives! + // Also, be sure your sprites have a z coordinate of 0. + + pDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + pDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE ); + pDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL ); + pDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD ); + pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + pDevice->SetRenderState( D3DRS_FOGENABLE, FALSE ); + pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); +// pDevice->SetRenderState( D3DRS_CLIPPING, TRUE ); + pDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); + pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); + pDevice->SetRenderState( D3DRS_LOCALVIEWER, FALSE ); + pDevice->SetRenderState( D3DRS_COLORVERTEX, TRUE ); + + pDevice->SetTexture(0, NULL); + pDevice->SetTexture(1, NULL); + pDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);//D3DTEXF_LINEAR); + pDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_POINT);//D3DTEXF_LINEAR); + pDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); + pDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); + pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT ); + pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + + pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); + pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); + + // set up for 2D drawing: + { + D3DXMATRIX Ortho2D; + D3DXMATRIX Identity; + + D3DXMatrixOrthoLH(&Ortho2D, w, h, 0.0f, 1.0f); + D3DXMatrixIdentity(&Identity); + + pDevice->SetTransform(D3DTS_PROJECTION, &Ortho2D); + pDevice->SetTransform(D3DTS_WORLD, &Identity); + pDevice->SetTransform(D3DTS_VIEW, &Identity); + } +} + +void CPluginShell::DrawDarkTranslucentBox(RECT* pr) +{ + // 'pr' is the rectangle that some text will occupy; + // a black box will be drawn around it, plus a bit of extra margin space. +#if 0 + m_text.DrawDarkBox(pr); + + if (m_vjd3d8_device) + return; + + LPDIRECT3DDEVICE8 lpDevice = GetDevice(); + int w = m_lpDX->m_client_width; + int h = m_lpDX->m_client_height; + + lpDevice->SetVertexShader( SIMPLE_VERTEX_FORMAT ); + lpDevice->SetTexture(0, NULL); + + lpDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); + lpDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + lpDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + + SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); + SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); + SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); + + // set up a quad + SIMPLEVERTEX verts[4]; + for (int i=0; i<4; i++) + { + verts[i].x = (i%2==0) ? (float)(-w/2 + pr->left ) : + (float)(-w/2 + pr->right ); + verts[i].y = (i/2==0) ? (float)-(-h/2 + pr->bottom) : + (float)-(-h/2 + pr->top ); + verts[i].z = 0; + verts[i].Diffuse = 0xFF000000;// (m_screenmode==DESKTOP) ? 0xE0000000 : 0xD0000000; + } + + lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, verts, sizeof(SIMPLEVERTEX)); + + // undo unusual state changes: + lpDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); + lpDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); +#endif +} + +void CPluginShell::RenderBuiltInTextMsgs() +{ +#if 0 + int _show_press_f1_NOW = (m_show_press_f1_msg && m_time < PRESS_F1_DUR); + + { + RECT r; + + if (m_show_help) + { + int y = m_upper_left_corner_y; + + SetRect(&r, 0, 0, GetWidth(), GetHeight()); + m_text.DrawText(m_d3dx_font[HELPSCREEN_FONT], g_szHelp, -1, &r, DT_CALCRECT, 0xFFFFFFFF); + + r.top += m_upper_left_corner_y; + r.left += m_left_edge; + r.right += m_left_edge + PLAYLIST_INNER_MARGIN*2; + r.bottom += m_upper_left_corner_y + PLAYLIST_INNER_MARGIN*2; + DrawDarkTranslucentBox(&r); + + r.top += PLAYLIST_INNER_MARGIN; + r.left += PLAYLIST_INNER_MARGIN; + r.right -= PLAYLIST_INNER_MARGIN; + r.bottom -= PLAYLIST_INNER_MARGIN; + m_text.DrawText(m_d3dx_font[HELPSCREEN_FONT], g_szHelp, -1, &r, 0, 0xFFFFFFFF); + + m_upper_left_corner_y += r.bottom-r.top + PLAYLIST_INNER_MARGIN*3; + } + + // render 'Press F1 for Help' message in lower-right corner: + if (_show_press_f1_NOW) + { + int dx = (int)(160.0f * powf(m_time/(float)(PRESS_F1_DUR), (float)(PRESS_F1_EXP))); + SetRect(&r, m_left_edge, m_lower_right_corner_y - GetFontHeight(DECORATIVE_FONT), m_right_edge + dx, m_lower_right_corner_y); + m_lower_right_corner_y -= m_text.DrawText(m_d3dx_font[DECORATIVE_FONT], PRESS_F1_MSG, &r, DT_RIGHT, 0xFFFFFFFF); + } + } +#endif +} + +void CPluginShell::RenderPlaylist() +{ +#if 0 + // draw playlist: + if (m_show_playlist) + { + RECT r; + int nSongs = SendMessage(m_hWndWinamp,WM_USER, 0, 124); + int now_playing = SendMessage(m_hWndWinamp,WM_USER, 0, 125); + + if (nSongs <= 0) + { + m_show_playlist = 0; + } + else + { + int playlist_vert_pixels = m_lower_left_corner_y - m_upper_left_corner_y; + int disp_lines = min(MAX_SONGS_PER_PAGE, (playlist_vert_pixels - PLAYLIST_INNER_MARGIN*2) / GetFontHeight(PLAYLIST_FONT)); + int total_pages = (nSongs) / disp_lines; + + if (disp_lines<=0) + return; + + // apply PgUp/PgDn keypresses since last time + m_playlist_pos -= m_playlist_pageups * disp_lines; + m_playlist_pageups = 0; + + if (m_playlist_pos < 0) + m_playlist_pos = 0; + if (m_playlist_pos >= nSongs) + m_playlist_pos = nSongs-1; + + // NOTE: 'dwFlags' is used for both DDRAW and DX8 + DWORD dwFlags = DT_NOPREFIX | DT_SINGLELINE | DT_WORD_ELLIPSIS; + DWORD color; + + int cur_page = (m_playlist_pos) / disp_lines; + int cur_line = (m_playlist_pos + disp_lines - 1) % disp_lines; + int new_top_idx = cur_page * disp_lines; + int new_btm_idx = new_top_idx + disp_lines; + char buf[1024]; + + // ask winamp for the song names, but DO IT BEFORE getting the DC, + // otherwise vaio will crash (~DDRAW port). + if (m_playlist_top_idx != new_top_idx || + m_playlist_btm_idx != new_btm_idx) + { + for (int i=0; im_client_width - TEXT_MARGIN*2 - PLAYLIST_INNER_MARGIN*2); + + for (int i=0; i0) + m_playlist_width_pixels = max(m_playlist_width_pixels, w); + } + else + { + m_playlist[i][0] = 0; + } + } + + if (m_playlist_width_pixels == 0 || + m_playlist_width_pixels > max_w) + m_playlist_width_pixels = max_w; + } + + int start = max(0, (cur_page )*disp_lines); + int end = min(nSongs, (cur_page+1)*disp_lines); + + // draw dark box around where the playlist will go: + + RECT r; + r.top = m_upper_left_corner_y; + r.left = m_left_edge; + r.right = m_left_edge + m_playlist_width_pixels + PLAYLIST_INNER_MARGIN*2; + r.bottom = m_upper_left_corner_y + (end-start)*GetFontHeight(PLAYLIST_FONT) + PLAYLIST_INNER_MARGIN*2; + DrawDarkTranslucentBox(&r); + + //m_d3dx_font[PLAYLIST_FONT]->Begin(); + + // draw playlist text + int y = m_upper_left_corner_y + PLAYLIST_INNER_MARGIN; + for (int i=start; iGetBitDepth() == 8) + color = (i==m_playlist_pos) ? + (i==now_playing ? 0xFFFFFFFF : 0xFFFFFFFF) : + (i==now_playing ? 0xFFFFFFFF : 0xFF707070); + else + color = (i==m_playlist_pos) ? + (i==now_playing ? PLAYLIST_COLOR_BOTH : PLAYLIST_COLOR_HILITE_TRACK) : + (i==now_playing ? PLAYLIST_COLOR_PLAYING_TRACK : PLAYLIST_COLOR_NORMAL); + + y += m_text.DrawText(GetFont(PLAYLIST_FONT), m_playlist[i-start], -1, &r, dwFlags, color); + } + + //m_d3dx_font[PLAYLIST_FONT]->End(); + } + } +#endif +} + +void CPluginShell::SuggestHowToFreeSomeMem() +{ +#if 0 + // This function is called when the plugin runs out of video memory; + // it lets you show a messagebox to the user so you can (intelligently) + // suggest how to free up some video memory, based on what settings + // they've chosen. + + char str[1024]; + + if (m_lpDX->m_current_mode.multisamp != D3DMULTISAMPLE_NONE) + { + if (m_lpDX->m_current_mode.screenmode == WINDOWED) + sprintf(str, + "To free up some memory, please RESTART WINAMP, then return\r" + " to the plugin's config panel and try setting your\r" + " WINDOWED MODE MULTISAMPLING back to 'NONE.'\r" + "\r" + "Then try running the plugin again." + ); + else if (m_lpDX->m_current_mode.screenmode == FAKE_FULLSCREEN) + sprintf(str, + "To free up some memory, please RESTART WINAMP, then return\r" + " to the plugin's config panel and try setting your\r" + " FAKE FULLSCREEN MODE MULTISAMPLING back to 'NONE.'\r" + "\r" + "Then try running the plugin again." + ); + else + sprintf(str, + "To free up some memory, please RESTART WINAMP, then return\r" + " to the plugin's config panel and try setting your\r" + " FULLSCREEN MODE MULTISAMPLING back to 'NONE.'\r" + "\r" + "Then try running the plugin again." + ); + } + else + if (m_lpDX->m_current_mode.screenmode == FULLSCREEN) // true fullscreen + sprintf(str, + "To free up some video memory, try the following:\r" + "\r" + "1. Try closing all other applications that might be using video memory, especially:\r" + "\r" + " * WINDOWS MEDIA PLAYER\r" + " * any video conferencing software, such as NETMEETING\r" + " * any DVD playback, TV tuner, or TV capture software\r" + " * any video editing software\r" + " * any software that uses Overlays, such as Drempels Desktop\r" + " * any audio dictation software, such as Dragon NaturallySpeaking\r" + " * any other 3D programs currently running\r" + "\r" + "2. Also try returning to the config panel (ALT+K) and selecting a display mode\r" + " that uses less video memory. 16-bit display modes use half as much memory\r" + " as 32-bit display modes, and lower-resolution display modes (such as 640 x 480)\r" + " use proportionally less video memory.\r" + "\r" + "After making these changes, please RESTART WINAMP before trying to run\r" + "the plugin again.\r" + ); + else // windowed, desktop mode, or fake fullscreen + sprintf(str, + "To free up some video memory, try the following:\r" + "\r" + "1. Try closing all other applications that might be using video memory, especially:\r" + "\r" + " * WINDOWS MEDIA PLAYER\r" + " * any video conferencing software, such as NETMEETING\r" + " * any DVD playback, TV tuner, or TV capture software\r" + " * any video editing software\r" + " * any software that uses Overlays, such as Drempels Desktop\r" + " * any audio dictation software, such as Dragon NaturallySpeaking\r" + " * any other 3D programs currently running\r" + "\r" + "2. Also try changing your Windows display mode to a lesser bit depth\r" + " (i.e. 16-bit color), or a smaller resolution.\r" + "\r" + "After making these changes, please RESTART WINAMP before trying to run\r" + "the plugin again.\r" + ); + + MessageBox(m_lpDX->GetHwnd(), str, "SUGGESTION", MB_OK|MB_SETFOREGROUND|MB_TOPMOST); +#endif +} + +LRESULT CALLBACK CPluginShell::WindowProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam) +{ +#if 0 + CPluginShell* p = (CPluginShell*)GetWindowLong(hWnd,GWL_USERDATA); + if (p) + return p->PluginShellWindowProc(hWnd, uMsg, wParam, lParam); + else + return DefWindowProc(hWnd, uMsg, wParam, lParam); +#endif + return 0; +} + + +LRESULT CPluginShell::PluginShellWindowProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam) +{ +#if 0 + SHORT mask = 1 << (sizeof(SHORT)*8 - 1); + //bool bShiftHeldDown = (GetKeyState(VK_SHIFT) & mask) != 0; + bool bCtrlHeldDown = (GetKeyState(VK_CONTROL) & mask) != 0; + //bool bAltHeldDown: most keys come in under WM_SYSKEYDOWN when ALT is depressed. + + int i; + + #ifdef _DEBUG + if (uMsg != WM_MOUSEMOVE && + uMsg != WM_NCHITTEST && + uMsg != WM_SETCURSOR && + uMsg != WM_COPYDATA && + uMsg != WM_USER) + { + char caption[256] = "WndProc: frame 0, "; + if (m_frame > 0) + { + float time = m_time; + int hours = (int)(time/3600); + time -= hours*3600; + int minutes = (int)(time/60); + time -= minutes*60; + int seconds = (int)time; + time -= seconds; + int dsec = (int)(time*100); + sprintf(caption, "WndProc: frame %d, t=%dh:%02dm:%02d.%02ds, ", m_frame, hours, minutes, seconds, dsec); + } + OutputDebugMessage(caption, hWnd, uMsg, wParam, lParam); + } + #endif + + switch (uMsg) + { + + case WM_USER: + if (m_screenmode == DESKTOP) + { + // this function resides in vms_desktop.dll; + // its response will come later, via the WM_COPYDATA + // message (See below). + getItemData(wParam); + return 0; + } + break; + + case WM_COPYDATA: + if (m_screenmode == DESKTOP) + { + // this message is vms_desktop.dll's response to + // our call to getItemData(). + PCOPYDATASTRUCT c = (PCOPYDATASTRUCT)lParam; + if (c && (c->cbData % sizeof(icon_t) == 0)) + { + icon_t *pNewIcons = (icon_t*)c->lpData; + + EnterCriticalSection(&m_desktop_cs); + + if (m_desktop_icon_state == 1 && (c->dwData & 0x80000000) ) // if doing a total refresh... + { + // ...we build the list from zero + int len = c->dwData & 0xFFFF; + for (int i=0; idwData & 0x80000000) ) + { + // otherwise, we alter existing things in the list: + std::list::iterator p; + int start = c->dwData & 0xFFFF; + int len = c->dwData >> 16; + + int i = 0; + for (p = m_icon_list.begin(); p != m_icon_list.end() && ix = pNewIcons[i-start].x; + p->y = pNewIcons[i-start].y; + memcpy(p->name, pNewIcons[i-start].name, sizeof(p->name)); + memcpy(p->pidl, pNewIcons[i-start].pidl, sizeof(p->pidl)); + i++; + } + + m_desktop_icon_state = 2; + m_desktop_icon_update_frame = GetFrame(); + } + + LeaveCriticalSection(&m_desktop_cs); + } + + return 0; + } + break; + + case WM_ERASEBKGND: + // Repaint window when song is paused and image needs to be repainted: + if (SendMessage(m_hWndWinamp,WM_USER,0,104)!=1 && m_lpDX && m_lpDX->m_lpDevice) // WM_USER/104 return codes: 1=playing, 3=paused, other=stopped + { + m_lpDX->m_lpDevice->Present(NULL,NULL,NULL,NULL); + return 0; + } + break; + + case WM_WINDOWPOSCHANGING: + if ( + m_screenmode == DESKTOP + && (!m_force_accept_WM_WINDOWPOSCHANGING) + && m_lpDX && m_lpDX->m_ready + ) + { + // unless we requested it ourselves or it's init time, + // prevent the fake desktop window from moving around + // in the Z order! (i.e., keep it on the bottom) + + // without this code, when you click on the 'real' desktop + // in a multimon setup, any windows that are overtop of the + // 'fake' desktop will flash, since they'll be covered + // up by the fake desktop window (but then shown again on + // the next frame, when we detect that the fake desktop + // window isn't on bottom & send it back to the bottom). + + LPWINDOWPOS pwp = (LPWINDOWPOS)lParam; + if (pwp) + pwp->flags |= SWP_NOOWNERZORDER | SWP_NOZORDER; + } + if (m_screenmode==WINDOWED && m_lpDX && m_lpDX->m_ready && m_lpDX->m_current_mode.m_skin) + m_lpDX->SaveWindow(); + break; + + case WM_NCACTIVATE: + // *Very Important Handler!* + // -Without this code, the app would not work properly when running in true + // fullscreen mode on multiple monitors; it would auto-minimize whenever the + // user clicked on a window in another display. + if (wParam == 0 && + m_screenmode == FULLSCREEN && + m_frame > 0 && + !m_exiting && + m_lpDX && + m_lpDX->m_ready + && m_lpDX->m_lpD3D && + m_lpDX->m_lpD3D->GetAdapterCount() > 1 && + m_hTextWnd==NULL // important!; if text window exists on diff. monitor, DX8 knows there are multiple monitors, and we don't need to worry about the app auto-minimizing when somebody clicks on another monitor; but if there is no 2nd device (~text window), it does its auto-minimize thing. + ) + { + return 0; + } + break; + + case WM_DESTROY: + // note: don't post quit message here if the window is being destroyed + // and re-created on a switch between windowed & FAKE fullscreen modes. + if (!m_lpDX->TempIgnoreDestroyMessages()) + { + // this is a final exit, and not just destroy-then-recreate-the-window. + // so, flag DXContext so it knows that someone else + // will take care of destroying the window! + m_lpDX->OnTrulyExiting(); + PostQuitMessage(0); + } + return FALSE; + break; + + case WM_SIZE: + // clear or set activity flag to reflect focus + if (m_lpDX && m_lpDX->m_ready && m_screenmode==WINDOWED && !m_resizing) + { + m_hidden = (SIZE_MAXHIDE==wParam || SIZE_MINIMIZED==wParam) ? TRUE : FALSE; + + if (SIZE_MAXIMIZED==wParam || SIZE_RESTORED==wParam) // the window has been maximized or restored + OnUserResizeWindow(); + } + break; + + case WM_ENTERSIZEMOVE: + m_resizing = 1; + break; + + case WM_EXITSIZEMOVE: + if( m_lpDX && m_lpDX->m_ready && m_screenmode==WINDOWED ) + OnUserResizeWindow(); + m_resizing = 0; + break; + + case WM_GETMINMAXINFO: + { + // don't let the window get too small + MINMAXINFO* p = (MINMAXINFO*)lParam; + if (p->ptMinTrackSize.x < 64) + p->ptMinTrackSize.x = 64; + p->ptMinTrackSize.y = p->ptMinTrackSize.x*3/4; + } + return 0; + + case WM_MOUSEMOVE: + if (m_screenmode==DESKTOP && (m_desktop_dragging==1 || m_desktop_box==1)) + { + m_desktop_drag_curpos.x = LOWORD(lParam); + m_desktop_drag_curpos.y = HIWORD(lParam); + if (m_desktop_box==1) + { + // update selection based on box coords + RECT box, temp; + box.left = min(m_desktop_drag_curpos.x, m_desktop_drag_startpos.x); + box.right = max(m_desktop_drag_curpos.x, m_desktop_drag_startpos.x); + box.top = min(m_desktop_drag_curpos.y, m_desktop_drag_startpos.y); + box.bottom = max(m_desktop_drag_curpos.y, m_desktop_drag_startpos.y); + + std::list::iterator p; + for (p = m_icon_list.begin(); p != m_icon_list.end(); p++) + { + p->selected = 0; + + if (IntersectRect(&temp, &box, &p->label_rect)) + p->selected = 1; + else if (IntersectRect(&temp, &box, &p->icon_rect)) + p->selected = 1; + } + } + + // repaint window manually, if winamp is paused + if (SendMessage(m_hWndWinamp,WM_USER,0,104) != 1) + { + PushWindowToJustBeforeDesktop(GetPluginWindow()); + DrawAndDisplay(1); + } + + //return 0; + } + break; + + case WM_LBUTTONUP: + if (m_screenmode==DESKTOP) + { + if (m_desktop_dragging) + { + m_desktop_dragging = 0; + + // move selected item(s) to new cursor position + int dx = LOWORD(lParam) - m_desktop_drag_startpos.x; + int dy = HIWORD(lParam) - m_desktop_drag_startpos.y; + + if (dx!=0 || dy!=0) + { + int idx=0; + std::list::iterator p; + for (p = m_icon_list.begin(); p != m_icon_list.end(); p++) + { + if (p->selected) + { + SendMessage(m_hWndDesktopListView, LVM_SETITEMPOSITION, idx, MAKELPARAM(p->x + dx, p->y + dy)); + p->x += dx; + p->y += dy; + } + idx++; + } + } + + // repaint window manually, if winamp is paused + if (SendMessage(m_hWndWinamp,WM_USER,0,104) != 1) + { + PushWindowToJustBeforeDesktop(GetPluginWindow()); + DrawAndDisplay(1); + } + } + + if (m_desktop_box) + { + m_desktop_box = 0; + + // repaint window manually, if winamp is paused + if (SendMessage(m_hWndWinamp,WM_USER,0,104) != 1) + { + PushWindowToJustBeforeDesktop(GetPluginWindow()); + DrawAndDisplay(1); + } + } + + //return 0; + } + break; + + + case WM_USER+1666: + if (wParam == 1 && lParam == 15) + { + if (m_screenmode == FULLSCREEN || m_screenmode == FAKE_FULLSCREEN) + ToggleFullScreen(); + } + return 0; + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + // Toggle between Fullscreen and Windowed modes on double-click + // note: this requires the 'CS_DBLCLKS' windowclass style! + if (m_screenmode != DESKTOP) + { + SetFocus(hWnd); + if (uMsg==WM_LBUTTONDBLCLK && m_frame>0) + { + ToggleFullScreen(); + return 0; + } + } + else + { + POINT pt; + pt.x = LOWORD(lParam); + pt.y = HIWORD(lParam); + + int done = 0; + + for (int pass=0; pass<2 && !done; pass++) + { + std::list::iterator p; + for (p = m_icon_list.begin(); p != m_icon_list.end(); p++) + { + RECT *pr = (pass==0) ? &p->icon_rect : &p->label_rect; + int bottom_extend = (pass==0) ? 3 : 0; // accepts clicks in the 3-pixel gap between the icon and the text label. + if (pt.x >= pr->left && + pt.x <= pr->right && + pt.y >= pr->top && + pt.y <= pr->bottom + bottom_extend) + { + switch(uMsg) + { + case WM_RBUTTONUP: + //pt.x += m_lpDX->m_monitor_rect.left; + //pt.y += m_lpDX->m_monitor_rect.top; + DoExplorerMenu(GetPluginWindow(), (LPITEMIDLIST)p->pidl, pt); + break; + case WM_LBUTTONDBLCLK: + { + char buf[MAX_PATH]; + sprintf(buf, "%s\\%s", m_szDesktopFolder, p->name); + ExecutePidl((LPITEMIDLIST)p->pidl, buf, m_szDesktopFolder, GetPluginWindow()); + } + break; + case WM_LBUTTONDOWN: + m_desktop_dragging = 1; + memcpy(m_desktop_drag_pidl, p->pidl, sizeof(m_desktop_drag_pidl)); + m_desktop_drag_startpos.x = LOWORD(lParam); + m_desktop_drag_startpos.y = HIWORD(lParam); + m_desktop_drag_curpos.x = LOWORD(lParam); + m_desktop_drag_curpos.y = HIWORD(lParam); + if (!(wParam & MK_CONTROL)) // if CTRL not held down + { + if (!p->selected) + { + DeselectDesktop(); + p->selected = 1; + } + } + else + { + p->selected = 1-p->selected; + } + break; + case WM_RBUTTONDOWN: + DeselectDesktop(); + p->selected = 1; + break; + } + + done = 1; + break; + } + } + } + + if (!done) + { + // deselect all, unless they're CTRL+clicking and missed an icon. + if (uMsg!=WM_LBUTTONDOWN || !(wParam & MK_CONTROL)) + DeselectDesktop(); + + if (uMsg==WM_RBUTTONUP)// || uMsg==WM_RBUTTONDOWN) + { + // note: can't use GetMenu and TrackPopupMenu here because the hwnd param to TrackPopupMenu must belong to current application. + + // (before sending coords to desktop window, xform them into its client coords:) + POINT pt; + pt.x = LOWORD(lParam); + pt.y = HIWORD(lParam); + ScreenToClient(m_hWndDesktopListView, &pt); + lParam = MAKELPARAM(pt.x + m_lpDX->m_monitor_rect.left, pt.y + m_lpDX->m_monitor_rect.top); + + PostMessage(m_hWndDesktopListView, uMsg, wParam, lParam); + //PostMessage(m_hWndDesktopListView, WM_CONTEXTMENU, (WPARAM)m_hWndDesktopListView, lParam); + } + else if (uMsg==WM_LBUTTONDOWN) + { + m_desktop_box = 1; + m_desktop_drag_startpos.x = LOWORD(lParam); + m_desktop_drag_startpos.y = HIWORD(lParam); + m_desktop_drag_curpos.x = LOWORD(lParam); + m_desktop_drag_curpos.y = HIWORD(lParam); + } + } + + // repaint window manually, if winamp is paused + if (SendMessage(m_hWndWinamp,WM_USER,0,104) != 1) + { + PushWindowToJustBeforeDesktop(GetPluginWindow()); + DrawAndDisplay(1); + } + + //return 0; + } + break; + + /* + case WM_SETFOCUS: + // note: this msg never comes in when embedwnd is used, but that's ok, because that's only + // in Windowed mode, and m_lost_focus only makes us sleep when fullscreen. + m_lost_focus = 0; + break; + + case WM_KILLFOCUS: + // note: this msg never comes in when embedwnd is used, but that's ok, because that's only + // in Windowed mode, and m_lost_focus only makes us sleep when fullscreen. + m_lost_focus = 1; + break; + */ + + case WM_SETCURSOR: + if ( + (m_screenmode == FULLSCREEN) || + (m_screenmode == FAKE_FULLSCREEN && m_lpDX && m_lpDX->m_fake_fs_covers_all) + ) + { + // hide the cursor + SetCursor(NULL); + return TRUE; // prevent Windows from setting cursor to window class cursor + } + break; + + case WM_NCHITTEST: + // Prevent the user from selecting the menu in fullscreen mode + if (m_screenmode != WINDOWED) + return HTCLIENT; + break; + + case WM_SYSCOMMAND: + // Prevent *moving/sizing* and *entering standby mode* when in fullscreen mode + switch( wParam ) + { + case SC_MOVE: + case SC_SIZE: + case SC_MAXIMIZE: + case SC_KEYMENU: + if (m_screenmode != WINDOWED) + return 1; + break; + case SC_MONITORPOWER: + if (m_screenmode == FULLSCREEN || m_screenmode == FAKE_FULLSCREEN) + return 1; + break; + } + break; + + case WM_CONTEXTMENU: + // launch popup context menu. see handler for WM_COMMAND also. + if (m_screenmode == DESKTOP) + { + // note: execution should never reach this point, + // because we don't pass WM_RBUTTONUP to DefWindowProc + // when in desktop mode! + return 0; + } + else if (m_screenmode == WINDOWED) // context menus only allowed in ~windowed modes + { + TrackPopupMenuEx( m_context_menu, TPM_VERTICAL, LOWORD(lParam), HIWORD(lParam), hWnd, NULL ); + return 0; + } + break; + + case WM_COMMAND: + // handle clicks on items on context menu. + if (m_screenmode == WINDOWED) + { + switch( LOWORD(wParam) ) + { + case ID_QUIT: + m_exiting = 1; + PostMessage(hWnd, WM_CLOSE, 0, 0); + return 0; + case ID_GO_FS: + if (m_frame > 0) + ToggleFullScreen(); + return 0; + case ID_DESKTOP_MODE: + if (m_frame > 0) + ToggleDesktop(); + return 0; + case ID_SHOWHELP: + ToggleHelp(); + return 0; + case ID_SHOWPLAYLIST: + TogglePlaylist(); + return 0; + } + // then allow the plugin to override any command: + if (MyWindowProc(hWnd, uMsg, wParam, lParam) == 0) + return 0; + } + break; + + /* + KEY HANDLING: the basic idea: + -in all cases, handle or capture: + -ZXCVBRS, zxcvbrs + -also make sure it's case-insensitive! (lowercase come through only as WM_CHAR; uppercase come in as both) + -(ALT+ENTER) + -(F1, ESC, UP, DN, Left, Right, SHIFT+l/r) + -(P for playlist) + -when playlist showing: steal J, HOME, END, PGUP, PGDN, UP, DOWN, ESC + -(BLOCK J, L) + -when integrated with winamp (using embedwnd), also handle these keys: + -j, l, L, CTRL+L [windowed mode only!] + -CTRL+P, CTRL+D + -CTRL+TAB + -ALT-E + -ALT+F (main menu) + -ALT+3 (id3) + */ + + case WM_SYSKEYDOWN: + if (wParam==VK_RETURN && m_frame > 0) + { + ToggleFullScreen(); + return 0; + } + // if in embedded mode (using winamp skin), pass ALT+ keys on to winamp + // ex: ALT+E, ALT+F, ALT+3... + if (m_screenmode==WINDOWED && m_lpDX->m_current_mode.m_skin) + return PostMessage(m_hWndWinamp, uMsg, wParam, lParam); // force-pass to winamp; required for embedwnd + break; + + case WM_SYSKEYUP: + if (m_screenmode==WINDOWED && m_lpDX->m_current_mode.m_skin) + return PostMessage(m_hWndWinamp, uMsg, wParam, lParam); // force-pass to winamp; required for embedwnd + break; + + case WM_SYSCHAR: + if ((wParam=='d' || wParam=='D') && m_frame > 0) + { + ToggleDesktop(); + return 0; + } + break; + + case WM_CHAR: + // if playlist is showing, steal p/j keys from the plugin: + if (m_show_playlist) + { + switch(wParam) + { + /* + case 'p': + case 'P': + TogglePlaylist(); + return 0;*/ + case 'j': + case 'J': + m_playlist_pos = SendMessage(m_hWndWinamp,WM_USER, 0, 125); + return 0; + default: + { + int nSongs = SendMessage(m_hWndWinamp,WM_USER, 0, 124); + int found = 0; + int orig_pos = m_playlist_pos; + int inc = (wParam>='A' && wParam<='Z') ? -1 : 1; + while (1) + { + if (inc==1 && m_playlist_pos >= nSongs-1) + break; + if (inc==-1 && m_playlist_pos <= 0) + break; + + m_playlist_pos += inc; + + char buf[32]; + strncpy(buf, (char*)SendMessage(m_hWndWinamp, WM_USER, m_playlist_pos, 212), 31); + buf[31] = 0; + + // remove song # and period from beginning + char *p = buf; + while (*p >= '0' && *p <= '9') p++; + if (*p == '.' && *(p+1) == ' ') + { + p += 2; + int pos = 0; + while (*p != 0) + { + buf[pos++] = *p; + p++; + } + buf[pos++] = 0; + } + + int wParam2 = (wParam>='A' && wParam<='Z') ? (wParam + 'a'-'A') : (wParam + 'A'-'a'); + if (buf[0]==wParam || buf[0]==wParam2) + { + found = 1; + break; + } + } + + if (!found) + m_playlist_pos = orig_pos; + } + return 0; + } + } + + // then allow the plugin to override any keys: + if (MyWindowProc(hWnd, uMsg, wParam, lParam) == 0) + return 0; + + // finally, default key actions: + switch(wParam) + { + // WINAMP PLAYBACK CONTROL KEYS: + case 'z': + case 'Z': + PostMessage(m_hWndWinamp,WM_COMMAND,40044,0); + return 0; + case 'x': + case 'X': + PostMessage(m_hWndWinamp,WM_COMMAND,40045,0); + return 0; + case 'c': + case 'C': + PostMessage(m_hWndWinamp,WM_COMMAND,40046,0); + return 0; + case 'v': + case 'V': + PostMessage(m_hWndWinamp,WM_COMMAND,40047,0); + return 0; + case 'b': + case 'B': + PostMessage(m_hWndWinamp,WM_COMMAND,40048,0); + return 0; + case 's': + case 'S': + //if (SendMessage(m_hWndWinamp,WM_USER,0,250)) + // sprintf(m_szUserMessage, "shuffle is now OFF"); // shuffle was on + //else + // sprintf(m_szUserMessage, "shuffle is now ON"); // shuffle was off + + // toggle shuffle + PostMessage(m_hWndWinamp,WM_COMMAND,40023,0); + return 0; + case 'r': + case 'R': + // toggle repeat + PostMessage(m_hWndWinamp,WM_COMMAND,40022,0); + return 0; + case 'p': + case 'P': + TogglePlaylist(); + return 0; + case 'l': + // note that this is actually correct; when you hit 'l' from the + // MAIN winamp window, you get an "open files" dialog; when you hit + // 'l' from the playlist editor, you get an "add files to playlist" dialog. + // (that sends IDC_PLAYLIST_ADDMP3==1032 to the playlist, which we can't + // do from here.) + PostMessage(m_hWndWinamp,WM_COMMAND,40029,0); + return 0; + case 'L': + PostMessage(m_hWndWinamp,WM_COMMAND,40187,0); + return 0; + case 'j': + PostMessage(m_hWndWinamp,WM_COMMAND,40194,0); + return 0; + } + + return 0;//DefWindowProc(hWnd,uMsg,wParam,lParam); + break; // end case WM_CHAR + + case WM_KEYUP: + + // allow the plugin to override any keys: + if (MyWindowProc(hWnd, uMsg, wParam, lParam) == 0) + return 0; + + /* + switch(wParam) + { + case VK_SOMETHING: + ... + break; + } + */ + + return 0; + break; + + case WM_KEYDOWN: + if (m_show_playlist) + { + switch(wParam) + { + case VK_ESCAPE: + m_show_playlist = 0; + return 0; + + case VK_UP: + { + int nRepeat = lParam & 0xFFFF; + if (GetKeyState(VK_SHIFT) & mask) + m_playlist_pos -= 10*nRepeat; + else + m_playlist_pos -= nRepeat; + } + return 0; + + case VK_DOWN: + { + int nRepeat = lParam & 0xFFFF; + if (GetKeyState(VK_SHIFT) & mask) + m_playlist_pos += 10*nRepeat; + else + m_playlist_pos += nRepeat; + } + return 0; + + case VK_HOME: + m_playlist_pos = 0; + return 0; + + case VK_END: + m_playlist_pos = SendMessage(m_hWndWinamp,WM_USER, 0, 124) - 1; + return 0; + + case VK_PRIOR: + if (GetKeyState(VK_SHIFT) & mask) + m_playlist_pageups += 10; + else + m_playlist_pageups++; + return 0; + + case VK_NEXT: + if (GetKeyState(VK_SHIFT) & mask) + m_playlist_pageups -= 10; + else + m_playlist_pageups--; + return 0; + + case VK_RETURN: + SendMessage(m_hWndWinamp,WM_USER, m_playlist_pos, 121); // set sel + SendMessage(m_hWndWinamp,WM_COMMAND, 40045, 0); // play it + return 0; + } + } + + // allow the plugin to override any keys: + if (MyWindowProc(hWnd, uMsg, wParam, lParam) == 0) + return 0; + + switch(wParam) + { + case VK_F1: + m_show_press_f1_msg = 0; + ToggleHelp(); + return 0; + + case VK_ESCAPE: + if (m_show_help) + ToggleHelp(); + else + { + if (m_screenmode == FAKE_FULLSCREEN || m_screenmode == FULLSCREEN) + { + ToggleFullScreen(); + } + else if (m_screenmode == DESKTOP) + { + ToggleDesktop(); + } + // exit the program on escape + //m_exiting = 1; + //PostMessage(hWnd, WM_CLOSE, 0, 0); + } + return 0; + + case VK_UP: + // increase volume + { + int nRepeat = lParam & 0xFFFF; + for (i=0; im_current_mode.m_skin) + { + if ( bCtrlHeldDown && ((wParam >= 'A' && wParam <= 'Z') || wParam==VK_TAB) ) + { + PostMessage(m_hWndWinamp, uMsg, wParam, lParam); + return 0; + } + } + return 0; + } + + return 0; + break; + } + + return MyWindowProc(hWnd, uMsg, wParam, lParam);//DefWindowProc(hWnd, uMsg, wParam, lParam); + //return 0L; +#endif + return 0; +} + +LRESULT CALLBACK CPluginShell::DesktopWndProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam) +{ +#if 0 + CPluginShell* p = (CPluginShell*)GetWindowLong(hWnd,GWL_USERDATA); + if (p) + return p->PluginShellDesktopWndProc(hWnd, uMsg, wParam, lParam); + else + return DefWindowProc(hWnd, uMsg, wParam, lParam); +#endif + return 0; +} + +LRESULT CPluginShell::PluginShellDesktopWndProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam) +{ +#if 0 + //#ifdef _DEBUG + // OutputDebugMessage("kbfocus", hWnd, uMsg, wParam, lParam); + //#endif + + switch (uMsg) + { + case WM_KEYDOWN: + case WM_KEYUP: + case WM_CHAR: + case WM_SYSCHAR: + case WM_SYSKEYDOWN: + case WM_SYSKEYUP: + //PostMessage(GetPluginWindow(), uMsg, wParam, lParam); + PluginShellWindowProc(GetPluginWindow(), uMsg, wParam, lParam); + return 0; + break; + } + + return DefWindowProc(hWnd, uMsg, wParam, lParam); +#endif + return 0; +} + +void CPluginShell::AlignWaves() +{ + // align waves, using recursive (mipmap-style) least-error matching + // note: NUM_WAVEFORM_SAMPLES must be between 32 and 512. + + int align_offset[2] = { 0, 0 }; + +#if (NUM_WAVEFORM_SAMPLES < 512) // [don't let this code bloat our DLL size if it's not going to be used] + + int nSamples = NUM_WAVEFORM_SAMPLES; + + #define MAX_OCTAVES 10 + + int octaves = floorf(logf(512-nSamples)/logf(2.0f)); + if (octaves < 4) + return; + if (octaves > MAX_OCTAVES) + octaves = MAX_OCTAVES; + + for (int ch=0; ch<2; ch++) + { + // only worry about matching the lower 'nSamples' samples + float temp_new[MAX_OCTAVES][512]; + float temp_old[MAX_OCTAVES][512]; + static float temp_weight[MAX_OCTAVES][512]; + static int first_nonzero_weight[MAX_OCTAVES]; + static int last_nonzero_weight[MAX_OCTAVES]; + int spls[MAX_OCTAVES]; + int space[MAX_OCTAVES]; + + memcpy(temp_new[0], m_sound.fWaveform[ch], sizeof(float)*512); + memcpy(temp_old[0], &m_oldwave[ch][m_prev_align_offset[ch]], sizeof(float)*nSamples); + spls[0] = 512; + space[0] = 512 - nSamples; + + // potential optimization: could reuse (instead of recompute) mip levels for m_oldwave[2][]? + for (int octave=1; octave1) temp_weight[octave][n] = 1; + if (temp_weight[octave][n]<0) temp_weight[octave][n] = 0; + } + + int n = 0; + while (temp_weight[octave][n] == 0 && n < compare_samples) + n++; + first_nonzero_weight[octave] = n; + + n = compare_samples-1; + while (temp_weight[octave][n] == 0 && n >= 0) + n--; + last_nonzero_weight[octave] = n; + } + } + + int n1 = 0; + int n2 = space[octaves-1]; + for (int octave = octaves-1; octave>=0; octave--) + { + // for example: + // space[octave] == 4 + // spls[octave] == 36 + // (so we test 32 samples, w/4 offsets) + int compare_samples = spls[octave]-space[octave]; + + int lowest_err_offset = -1; + float lowest_err_amount = 0; + for (int n=n1; n0) + err_sum += x; + else + err_sum -= x; + } + + if (lowest_err_offset == -1 || err_sum < lowest_err_amount) + { + lowest_err_offset = n; + lowest_err_amount = err_sum; + } + } + + // now use 'lowest_err_offset' to guide bounds of search in next octave: + // space[octave] == 8 + // spls[octave] == 72 + // -say 'lowest_err_offset' was 2 + // -that corresponds to samples 4 & 5 of the next octave + // -also, expand about this by 2 samples? YES. + // (so we'd test 64 samples, w/8->4 offsets) + if (octave > 0) + { + n1 = lowest_err_offset*2 -1; + n2 = lowest_err_offset*2+2+1; + if (n1 < 0) n1=0; + if (n2 > space[octave-1]) n2 = space[octave-1]; + } + else + align_offset[ch] = lowest_err_offset; + } + } +#endif + memcpy(m_oldwave[0], m_sound.fWaveform[0], sizeof(float)*512); + memcpy(m_oldwave[1], m_sound.fWaveform[1], sizeof(float)*512); + m_prev_align_offset[0] = align_offset[0]; + m_prev_align_offset[1] = align_offset[1]; + + // finally, apply the results: modify m_sound.fWaveform[2][0..512] + // by scooting the aligned samples so that they start at m_sound.fWaveform[2][0]. + for (int ch=0; ch<2; ch++) + if (align_offset[ch]>0) + { + for (int i=0; iPluginShellVJModeWndProc(hWnd, uMsg, wParam, lParam); + else + return DefWindowProc(hWnd, uMsg, wParam, lParam); +#endif + return 0; +} + +LRESULT CPluginShell::PluginShellVJModeWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ +#if 0 + #ifdef _DEBUG + if (message != WM_MOUSEMOVE && + message != WM_NCHITTEST && + message != WM_SETCURSOR && + message != WM_COPYDATA && + message != WM_USER) + { + char caption[256] = "VJWndProc: frame 0, "; + if (m_frame > 0) + { + float time = m_time; + int hours = (int)(time/3600); + time -= hours*3600; + int minutes = (int)(time/60); + time -= minutes*60; + int seconds = (int)time; + time -= seconds; + int dsec = (int)(time*100); + sprintf(caption, "VJWndProc: frame %d, t=%dh:%02dm:%02d.%02ds, ", m_frame, hours, minutes, seconds, dsec); + } + OutputDebugMessage(caption, hwnd, message, wParam, lParam); + } + #endif + + switch(message) + { + case WM_KEYDOWN: + case WM_KEYUP: + case WM_CHAR: + case WM_SYSKEYDOWN: + case WM_SYSKEYUP: + case WM_SYSCHAR: + // pass keystrokes on to plugin! + return PluginShellWindowProc(GetPluginWindow(),message,wParam,lParam); + + case WM_ERASEBKGND: + // Repaint window when song is paused and image needs to be repainted: + if (SendMessage(m_hWndWinamp,WM_USER,0,104)!=1 && m_vjd3d8_device) // WM_USER/104 return codes: 1=playing, 3=paused, other=stopped + { + m_vjd3d8_device->Present(NULL,NULL,NULL,NULL); + return 0; + } + break; + + /* + case WM_WINDOWPOSCHANGING: + if (m_screenmode == DESKTOP) + { + LPWINDOWPOS pwp = (LPWINDOWPOS)lParam; + if (pwp) + pwp->flags |= SWP_NOOWNERZORDER | SWP_NOZORDER; + } + break; + + case WM_ACTIVATEAPP: + // *Very Important Handler!* + // -Without this code, the app would not work properly when running in true + // fullscreen mode on multiple monitors; it would auto-minimize whenever the + // user clicked on a window in another display. + if (wParam == 1 && + m_screenmode == DESKTOP && + m_frame > 0 && + !m_exiting + ) + { + return 0; + } + break; + + /* + case WM_NCACTIVATE: + // *Very Important Handler!* + // -Without this code, the app would not work properly when running in true + // fullscreen mode on multiple monitors; it would auto-minimize whenever the + // user clicked on a window in another display. + // (NOTE: main window also handles this message this way) + if (wParam == 0 && + m_screenmode == FULLSCREEN && + m_frame > 0 && + !m_exiting && + m_lpDX && + m_lpDX->m_ready + && m_lpDX->m_lpD3D && + m_lpDX->m_lpD3D->GetAdapterCount() > 1 + ) + { + return 0; + } + break; + */ + + /* + case WM_ACTIVATEAPP: + if (wParam == 1 && + m_screenmode == DESKTOP && + m_frame > 0 && + !m_exiting && + m_vjd3d8_device + ) + { + return 0; + } + break; + */ + + /* + case WM_WINDOWPOSCHANGING: + if ( + m_screenmode == DESKTOP + && (!m_force_accept_WM_WINDOWPOSCHANGING) + && m_lpDX && m_lpDX->m_ready + ) + { + // unless we requested it ourselves or it's init time, + // prevent the fake desktop window from moving around + // in the Z order! (i.e., keep it on the bottom) + + // without this code, when you click on the 'real' desktop + // in a multimon setup, any windows that are overtop of the + // 'fake' desktop will flash, since they'll be covered + // up by the fake desktop window (but then shown again on + // the next frame, when we detect that the fake desktop + // window isn't on bottom & send it back to the bottom). + + LPWINDOWPOS pwp = (LPWINDOWPOS)lParam; + if (pwp) + pwp->flags |= SWP_NOOWNERZORDER | SWP_NOZORDER; + } + break; + */ + + case WM_CLOSE: + // if they close the VJ window (by some means other than ESC key), + // this will make the graphics window close, too. + m_exiting = 1; + if (GetPluginWindow()) + PostMessage(GetPluginWindow(), WM_CLOSE, 0, 0); + break; + + case WM_GETMINMAXINFO: + { + // don't let the window get too small + MINMAXINFO* p = (MINMAXINFO*)lParam; + if (p->ptMinTrackSize.x < 64) + p->ptMinTrackSize.x = 64; + p->ptMinTrackSize.y = p->ptMinTrackSize.x*3/4; + } + return 0; + + case WM_SIZE: + // clear or set activity flag to reflect focus + if (m_vjd3d8_device && !m_resizing_textwnd) + { + m_hidden_textwnd = (SIZE_MAXHIDE==wParam || SIZE_MINIMIZED==wParam) ? TRUE : FALSE; + + if (SIZE_MAXIMIZED==wParam || SIZE_RESTORED==wParam) // the window has been maximized or restored + OnUserResizeTextWindow(); + } + break; + + case WM_ENTERSIZEMOVE: + m_resizing_textwnd = 1; + break; + + case WM_EXITSIZEMOVE: + if( m_vjd3d8_device ) + OnUserResizeTextWindow(); + m_resizing_textwnd = 0; + break; + } + + return DefWindowProc(hwnd, message, wParam, lParam); +#endif + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/pluginshell.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/pluginshell.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/pluginshell.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/pluginshell.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,397 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef __NULLSOFT_DX8_PLUGIN_SHELL_H__ +#define __NULLSOFT_DX8_PLUGIN_SHELL_H__ 1 + +#include "shell_defines.h" +#include "dxcontext.h" +#include "fft.h" +#include "defines.h" +//#include "textmgr.h" + +//#include "icon_t.h" +//#include +//using std::list; + +//extern "C" void SetTextureStageState( int x, DWORD dwY, DWORD dwZ); +//extern "C" void d3dSetSamplerState( int x, DWORD dwY, DWORD dwZ); +//extern "C" void d3dSetRenderState(DWORD dwY, DWORD dwZ); + +#define TIME_HIST_SLOTS 128 // # of slots used if fps > 60. half this many if fps==30. +#define MAX_SONGS_PER_PAGE 40 + +typedef struct +{ + char szFace[256]; + int nSize; // size requested @ font creation time + int bBold; + int bItalic; + int bAntiAliased; +} td_fontinfo; + +typedef struct +{ + float imm[2][3]; // bass, mids, treble, no damping, for each channel (long-term average is 1) + float avg[2][3]; // bass, mids, treble, some damping, for each channel (long-term average is 1) + float med_avg[2][3]; // bass, mids, treble, more damping, for each channel (long-term average is 1) + float long_avg[2][3]; // bass, mids, treble, heavy damping, for each channel (long-term average is 1) + float infinite_avg[2][3]; // bass, mids, treble: winamp's average output levels. (1) + float fWaveform[2][576]; // Not all 576 are valid! - only NUM_WAVEFORM_SAMPLES samples are valid for each channel (note: NUM_WAVEFORM_SAMPLES is declared in shell_defines.h) + float fSpectrum[2][NUM_FREQUENCIES]; // NUM_FREQUENCIES samples for each channel (note: NUM_FREQUENCIES is declared in shell_defines.h) +} td_soundinfo; // ...range is 0 Hz to 22050 Hz, evenly spaced. + +class CPluginShell +{ +protected: + + // GET METHODS + // ------------------------------------------------------------ +public: + int GetFrame(); // returns current frame # (starts at zero) + float GetTime(); // returns current animation time (in seconds) (starts at zero) (updated once per frame) + float GetFps(); // returns current estimate of framerate (frames per second) +protected: + eScrMode GetScreenMode(); // returns WINDOWED, FULLSCREEN, FAKE_FULLSCREEN, DESKTOP, or NOT_YET_KNOWN (if called before or during OverrideDefaults()). + HWND GetWinampWindow(); // returns handle to Winamp main window + HINSTANCE GetInstance(); // returns handle to the plugin DLL module; used for things like loading resources (dialogs, bitmaps, icons...) that are built into the plugin. + char* GetPluginsDirPath(); // usually returns 'c:\\program files\\winamp\\plugins\\' + char* GetConfigIniFile(); // usually returns 'c:\\program files\\winamp\\plugins\\something.ini' - filename is determined from identifiers in 'defines.h' + + // GET METHODS THAT ONLY WORK ONCE DIRECTX IS READY + // ------------------------------------------------------------ + // The following 'Get' methods are only available after DirectX has been initialized. + // If you call these from OverrideDefaults, MyPreInitialize, or MyReadConfig, + // they will return NULL (zero). + // ------------------------------------------------------------ + HWND GetPluginWindow(); // returns handle to the plugin window. NOT persistent; can change! + int GetWidth(); // returns width of plugin window interior, in pixels. + int GetHeight(); // returns height of plugin window interior, in pixels. + int GetBitDepth(); // returns 8, 16, 24 (rare), or 32 + LPDIRECT3DDEVICE9 GetDevice(); // returns a pointer to the DirectX 8 Device. NOT persistent; can change! + D3DCAPS9* GetCaps(); // returns a pointer to the D3DCAPS8 structer for the device. NOT persistent; can change. + D3DFORMAT GetBackBufFormat(); // returns the pixelformat of the back buffer (probably D3DFMT_R8G8B8, D3DFMT_A8R8G8B8, D3DFMT_X8R8G8B8, D3DFMT_R5G6B5, D3DFMT_X1R5G5B5, D3DFMT_A1R5G5B5, D3DFMT_A4R4G4B4, D3DFMT_R3G3B2, D3DFMT_A8R3G3B2, D3DFMT_X4R4G4B4, or D3DFMT_UNKNOWN) + D3DFORMAT GetBackBufZFormat(); // returns the pixelformat of the back buffer's Z buffer (probably D3DFMT_D16_LOCKABLE, D3DFMT_D32, D3DFMT_D15S1, D3DFMT_D24S8, D3DFMT_D16, D3DFMT_D24X8, D3DFMT_D24X4S4, or D3DFMT_UNKNOWN) + char* GetDriverFilename(); // returns a text string with the filename of the current display adapter driver, such as "nv4_disp.dll" + char* GetDriverDescription(); // returns a text string describing the current display adapter, such as "NVIDIA GeForce4 Ti 4200" + + // FONTS & TEXT + // ------------------------------------------------------------ +public: +// LPD3DXFONT GetFont(eFontIndex idx); // returns a D3DX font handle for drawing text; see shell_defines.h for the definition of the 'eFontIndex' enum. +// int GetFontHeight(eFontIndex idx); // returns the height of the font, in pixels; see shell_defines.h for the definition of the 'eFontIndex' enum. +// CTextManager m_text; +protected: + + // MISC + // ------------------------------------------------------------ + td_soundinfo m_sound; // a structure always containing the most recent sound analysis information; defined in pluginshell.h. + void SuggestHowToFreeSomeMem(); // gives the user a 'smart' messagebox that suggests how they can free up some video memory. + + // CONFIG PANEL SETTINGS + // ------------------------------------------------------------ + // *** only read/write these values during CPlugin::OverrideDefaults! *** + int m_start_fullscreen; // 0 or 1 + int m_start_desktop; // 0 or 1 + int m_fake_fullscreen_mode; // 0 or 1 + // JM HACK +public: + int m_max_fps_fs; // 1-120, or 0 for 'unlimited' +protected: + // JM HACK + int m_max_fps_dm; // 1-120, or 0 for 'unlimited' + int m_max_fps_w; // 1-120, or 0 for 'unlimited' + int m_show_press_f1_msg; // 0 or 1 + int m_allow_page_tearing_w; // 0 or 1 + int m_allow_page_tearing_fs; // 0 or 1 + int m_allow_page_tearing_dm; // 0 or 1 + int m_minimize_winamp; // 0 or 1 + int m_desktop_show_icons; // 0 or 1 + int m_desktop_textlabel_boxes; // 0 or 1 + int m_desktop_manual_icon_scoot; // 0 or 1 + int m_desktop_555_fix; // 0 = 555, 1 = 565, 2 = 888 + int m_dualhead_horz; // 0 = both, 1 = left, 2 = right + int m_dualhead_vert; // 0 = both, 1 = top, 2 = bottom + int m_save_cpu; // 0 or 1 + int m_skin; // 0 or 1 + int m_fix_slow_text; // 0 or 1 + td_fontinfo m_fontinfo[NUM_BASIC_FONTS + NUM_EXTRA_FONTS]; + D3DDISPLAYMODE m_disp_mode_fs; // a D3DDISPLAYMODE struct that specifies the width, height, refresh rate, and color format to use when the plugin goes fullscreen. + int m_posX; + int m_posY; + int m_backBufferWidth; + int m_backBufferHeight; + float m_pixelRatio; + + // PURE VIRTUAL FUNCTIONS (...must be implemented by derived classes) + // ------------------------------------------------------------ + virtual void OverrideDefaults() {}; + virtual void MyPreInitialize() {}; + virtual void MyReadConfig() {}; + virtual void MyWriteConfig() {}; + virtual int AllocateMyNonDx8Stuff() { return 0; }; + virtual void CleanUpMyNonDx8Stuff() {}; + virtual int AllocateMyDX8Stuff() { return 0; }; + virtual void CleanUpMyDX8Stuff(int final_cleanup) {}; + virtual void MyRenderFn(int redraw) {}; + virtual void MyRenderUI(int *upper_left_corner_y, int *upper_right_corner_y, int *lower_left_corner_y, int *lower_right_corner_y, int xL, int xR) {}; + virtual LRESULT MyWindowProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam) { return 0; }; + virtual BOOL MyConfigTabProc(int nPage, HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { return true;}; + +//===================================================================================================================== +private: + + // GENERAL PRIVATE STUFF + eScrMode m_screenmode; // // WINDOWED, FULLSCREEN, or FAKE_FULLSCREEN (i.e. running in a full-screen-sized window) + int m_frame; // current frame #, starting at zero + float m_time; // current animation time in seconds; starts at zero. + float m_fps; // current estimate of frames per second + HWND m_hWndWinamp; // handle to Winamp window + HINSTANCE m_hInstance; // handle to application instance + DXContext* m_lpDX; // pointer to DXContext object + char m_szPluginsDirPath[MAX_PATH]; // usually 'c:\\program files\\winamp\\plugins\\' + char m_szConfigIniFile[MAX_PATH]; // usually 'c:\\program files\\winamp\\plugins\\something.ini' - filename is determined from identifiers in 'defines.h' + LPDIRECT3DDEVICE9 m_device; + // FONTS + IDirect3DTexture9* m_lpDDSText; +// LPD3DXFONT m_d3dx_font[NUM_BASIC_FONTS + NUM_EXTRA_FONTS]; +// LPD3DXFONT m_d3dx_desktop_font; +// HFONT m_font[NUM_BASIC_FONTS + NUM_EXTRA_FONTS]; +// HFONT m_font_desktop; + + // PRIVATE CONFIG PANEL SETTINGS + D3DMULTISAMPLE_TYPE m_multisample_fullscreen; + D3DMULTISAMPLE_TYPE m_multisample_desktop; + D3DMULTISAMPLE_TYPE m_multisample_windowed; + GUID m_adapter_guid_fullscreen; + GUID m_adapter_guid_desktop; +public: + GUID m_adapter_guid_windowed; +private: + + // PRIVATE RUNTIME SETTINGS + int m_lost_focus; // ~mostly for fullscreen mode + int m_hidden; // ~mostly for windowed mode + int m_resizing; // ~mostly for windowed mode + int m_show_help; + int m_show_playlist; + int m_playlist_pos; // current selection on (plugin's) playlist menu + int m_playlist_pageups; // can be + or - + int m_playlist_top_idx; // used to track when our little playlist cache (m_playlist) needs updated. + int m_playlist_btm_idx; // used to track when our little playlist cache (m_playlist) needs updated. + int m_playlist_width_pixels; // considered invalid whenever 'm_playlist_top_idx' is -1. + char m_playlist[MAX_SONGS_PER_PAGE][256]; // considered invalid whenever 'm_playlist_top_idx' is -1. + int m_exiting; + int m_upper_left_corner_y; + int m_lower_left_corner_y; + int m_upper_right_corner_y; + int m_lower_right_corner_y; + int m_left_edge; + int m_right_edge; + int m_force_accept_WM_WINDOWPOSCHANGING; + + // PRIVATE - GDI STUFF + HMENU m_main_menu; + HMENU m_context_menu; + + // PRIVATE - DESKTOP MODE STUFF +// list m_icon_list; + IDirect3DTexture9* m_desktop_icons_texture[MAX_ICON_TEXTURES]; + HWND m_hWndProgMan; + HWND m_hWndDesktop; + HWND m_hWndDesktopListView; + char m_szDesktopFolder[MAX_PATH]; // *without* the final backslash + int m_desktop_icon_size; + int m_desktop_dragging; // '1' when user is dragging icons around + int m_desktop_box; // '1' when user is drawing a box + BYTE m_desktop_drag_pidl[1024]; // cast this to ITEMIDLIST + POINT m_desktop_drag_startpos; // applies to dragging or box-drawing + POINT m_desktop_drag_curpos; // applies to dragging or box-drawing + int m_desktop_wc_registered; + DWORD m_desktop_bk_color; + DWORD m_desktop_text_color; + DWORD m_desktop_sel_color; + DWORD m_desktop_sel_text_color; + int m_desktop_icon_state; // 0=uninit, 1=total refresh in progress, 2=ready, 3=update in progress + int m_desktop_icon_count; + int m_desktop_icon_update_frame; +// CRITICAL_SECTION m_desktop_cs; + int m_desktop_icons_disabled; + int m_vms_desktop_loaded; + int m_desktop_hook_set; + + // PRIVATE - MORE TIMEKEEPING + double m_last_raw_time; + float m_time_hist[TIME_HIST_SLOTS]; // cumulative + int m_time_hist_pos; + LARGE_INTEGER m_high_perf_timer_freq; // 0 if high-precision timer not available + LARGE_INTEGER m_prev_end_of_frame; + + // PRIVATE AUDIO PROCESSING DATA + FFT m_fftobj; + float m_oldwave[2][576]; // for wave alignment + int m_prev_align_offset[2]; // for wave alignment + int m_align_weights_ready; + +public: + CPluginShell(); + ~CPluginShell(); + + // called by vis.cpp, on behalf of Winamp: + int PluginPreInitialize(HWND hWinampWnd, HINSTANCE hWinampInstance); + int PluginInitialize(LPDIRECT3DDEVICE9 device, int iPosX, int iPosY, int iWidth, int iHeight, float pixelRatio); + int PluginRender(unsigned char *pWaveL, unsigned char *pWaveR); + void PluginQuit(); + int AllocateDX8Stuff(); + void CleanUpDX8Stuff(int final_cleanup); + + void ToggleHelp(); + void TogglePlaylist(); + + // config panel / windows messaging processes: + static LRESULT CALLBACK WindowProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam); + static LRESULT CALLBACK DesktopWndProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam); + static LRESULT CALLBACK VJModeWndProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam); + static BOOL CALLBACK ConfigDialogProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + static BOOL CALLBACK TabCtrlProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + static BOOL CALLBACK FontDialogProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + static BOOL CALLBACK DesktopOptionsDialogProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + static BOOL CALLBACK DualheadDialogProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + +private: + void PushWindowToJustBeforeDesktop(HWND h); + void DrawAndDisplay(int redraw); + void ReadConfig(); + void WriteConfig(); + void DoTime(); + void AnalyzeNewSound(unsigned char *pWaveL, unsigned char *pWaveR); + void AlignWaves(); + int InitDirectX(); + void CleanUpDirectX(); + int InitGDIStuff(); + void CleanUpGDIStuff(); + int InitNonDx8Stuff(); + void CleanUpNonDx8Stuff(); + int InitVJStuff(RECT* pClientRect=NULL); + void CleanUpVJStuff(); + int AllocateFonts(IDirect3DDevice9 *pDevice); + void CleanUpFonts(); + void AllocateTextSurface(); + void ToggleDesktop(); + void OnUserResizeWindow(); + void OnUserResizeTextWindow(); + void PrepareFor2DDrawing_B(IDirect3DDevice9 *pDevice, int w, int h); + void RenderBuiltInTextMsgs(); +public: + void ToggleFullScreen(); + void DrawDarkTranslucentBox(RECT* pr); +private: + void RenderPlaylist(); + void StuffParams(DXCONTEXT_PARAMS *pParams); + void EnforceMaxFPS(); + + // DESKTOP MODE FUNCTIONS (found in desktop_mode.cpp) + int InitDesktopMode(); + void CleanUpDesktopMode(); + int CreateDesktopIconTexture(IDirect3DTexture9** ppTex); + void DeselectDesktop(); + void UpdateDesktopBitmaps(); + int StuffIconBitmaps(int iStartIconIdx, int iTexNum, int *show_msgs); + void RenderDesktop(); + + // SEPARATE TEXT WINDOW (FOR VJ MODE) + int m_vj_mode; + int m_hidden_textwnd; + int m_resizing_textwnd; + protected: + HWND m_hTextWnd; + private: + int m_nTextWndWidth; + int m_nTextWndHeight; + bool m_bTextWindowClassRegistered; + LPDIRECT3D9 m_vjd3d8; + LPDIRECT3DDEVICE9 m_vjd3d8_device; + //HDC m_memDC; // memory device context + //HBITMAP m_memBM, m_oldBM; + //HBRUSH m_hBlackBrush; + + // WINDOWPROC FUNCTIONS + LRESULT PluginShellWindowProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam); // in windowproc.cpp + LRESULT PluginShellDesktopWndProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam); + LRESULT PluginShellVJModeWndProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam); + + // CONFIG PANEL FUNCTIONS: + BOOL PluginShellConfigDialogProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + BOOL PluginShellConfigTab1Proc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + BOOL PluginShellFontDialogProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + BOOL PluginShellDesktopOptionsDialogProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + BOOL PluginShellDualheadDialogProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); + bool InitConfig(HWND hDialogWnd); + void EndConfig(); + void UpdateAdapters(int screenmode); + void UpdateFSAdapterDispModes(); // (fullscreen only) + void UpdateDispModeMultiSampling(int screenmode); + void UpdateMaxFps(int screenmode); + int GetCurrentlySelectedAdapter(int screenmode); + void SaveDisplayMode(); + void SaveMultiSamp(int screenmode); + void SaveAdapter(int screenmode); + void SaveMaxFps(int screenmode); + void OnTabChanged(int nNewTab); + LPDIRECT3DDEVICE9 GetTextDevice() { return (m_vjd3d8_device) ? m_vjd3d8_device : m_lpDX->m_lpDevice; } +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + +#endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/shell_defines.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/shell_defines.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/shell_defines.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/shell_defines.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,106 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef __NULLSOFT_DX8_PLUGIN_SHELL_SHELL_DEFINES_H__ +#define __NULLSOFT_DX8_PLUGIN_SHELL_SHELL_DEFINES_H__ 1 + +#include +//#include + +#define DEFAULT_FULLSCREEN_WIDTH 640 +#define DEFAULT_FULLSCREEN_HEIGHT 480 +#define MAX_ICON_TEXTURES 8 +#define ICON_TEXTURE_SIZE 256 +#define DEFAULT_WINDOW_SIZE 0.625f // as a portion of the width or height of the screen (whichever is smaller) +#define DESKTOP_MODE_KEYBOARD_INPUT_WINDOW_CLASSNAME "DESKTOP MODE KEYBOARD INPUT WINDOW" +#define BGR2RGB(x) (((x>>16)&0xFF) | (x & 0xFF00) | ((x<<16)&0xFF0000)) + +#define NUM_BASIC_FONTS 4 +#define SYS_FONT 0 +#define DEC_FONT 1 +#define HELP_FONT 2 +#define DESK_FONT 3 +#define MAX_EXTRA_FONTS 5 +typedef enum +{ + SIMPLE_FONT = 0, // aka 'system' font; should be legible + DECORATIVE_FONT = 1, + HELPSCREEN_FONT = 2, + PLAYLIST_FONT = 3, + EXTRA_1 = 4, + EXTRA_2 = 5, + EXTRA_3 = 6, + EXTRA_4 = 7, + EXTRA_5 = 8 +} +eFontIndex; + +// for m_screenmode: +typedef enum +{ + NOT_YET_KNOWN = -1, + FULLSCREEN = 0, + WINDOWED = 1, + FAKE_FULLSCREEN = 2, + DESKTOP = 3 // doesn't use overlays! =) +} +eScrMode; + +// embedding stuff +#define WM_WA_IPC WM_USER +#define IPC_GET_EMBEDIF 505 // pass an embedWindowState; returns an HWND embedWindow(embedWindowState *); if the data is NULL, otherwise returns the HWND directly +#define EMBED_FLAGS_NORESIZE 1 // set this bit in embedWindowState.flags to keep window from being resizable +#define EMBED_FLAGS_NOTRANSPARENCY 2 // set this bit in embedWindowState.flags to make gen_ff turn transparency off for this wnd +#define IPC_SETVISWND 611 +#define ID_VIS_NEXT 40382 +#define ID_VIS_PREV 40383 +#define ID_VIS_RANDOM 40384 +#define ID_VIS_FS 40389 +#define ID_VIS_CFG 40390 +#define ID_VIS_MENU 40391 + +typedef struct +{ + HWND me; //hwnd of the window + int flags; + RECT r; + void *user_ptr; // for application use + int extra_data[64]; // for internal winamp use +} +embedWindowState; + + + + + + + + +#endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/state.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/state.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/state.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/state.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1797 @@ + +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "state.h" +#include "support.h" +#include "evallib/compiler.h" +#include "plugin.h" +#include "utility.h" + +//#include +//#include +#include +#include + +extern CPlugin* g_plugin; // declared in main.cpp + + + +CState::CState() +{ + //Default(); + + // this is the list of variables that can be used for a PER-FRAME calculation; + // it is a SUBSET of the per-vertex calculation variable list. + m_pf_codehandle = NULL; + m_pp_codehandle = NULL; + for (int i=0; i"); + //strcpy(m_szSection, "n/a"); + + m_fRating = 3.0f; + m_bBlending = false; + + m_fGammaAdj = 2.0f; // 1.0 = reg; +2.0 = double, +3.0 = triple... + m_fVideoEchoZoom = 2.0f; + m_fVideoEchoAlpha = 0.0f; + m_nVideoEchoOrientation = 0; // 0-3 + + m_fDecay = 0.98f; // 1.0 = none, 0.95 = heavy decay + + m_nWaveMode = 0; + m_nOldWaveMode = -1; + m_bAdditiveWaves = false; + m_fWaveAlpha = 0.8f; + m_fWaveScale = 1.0f; + m_fWaveSmoothing = 0.75f; // 0 = no smoothing, 0.9 = HEAVY smoothing + m_bWaveDots = false; + m_bWaveThick = false; + m_fWaveParam = 0.0f; + m_bModWaveAlphaByVolume = false; + m_fModWaveAlphaStart = 0.75f; // when relative volume hits this level, alpha -> 0 + m_fModWaveAlphaEnd = 0.95f; // when relative volume hits this level, alpha -> 1 + + m_fWarpAnimSpeed = 1.0f; // additional timescaling for warp animation + m_fWarpScale = 1.0f; + m_fZoomExponent = 1.0f; + m_fShader = 0.0f; + m_bMaximizeWaveColor = true; + m_bTexWrap = true; + m_bDarkenCenter = false; + m_bRedBlueStereo = false; + m_fMvX = 12.0f; + m_fMvY = 9.0f; + m_fMvDX = 0.0f; + m_fMvDY = 0.0f; + m_fMvL = 0.9f; + m_fMvR = 1.0f; + m_fMvG = 1.0f; + m_fMvB = 1.0f; + m_fMvA = 1.0f; + m_bBrighten = false; + m_bDarken = false; + m_bSolarize = false; + m_bInvert = false; + + // DON'T FORGET TO ADD NEW VARIABLES TO BLEND FUNCTION, IMPORT, and EXPORT AS WELL!!!!!!!! + // ALSO BE SURE TO REGISTER THEM ON THE MAIN MENU (SEE MILKDROP.CPP) + + // time-varying variables: base, var, varFreq1, varFreq2 + m_fZoom = 1.0f; + m_fRot = 0.0f; + m_fRotCX = 0.5f; + m_fRotCY = 0.5f; + m_fXPush = 0.0f; + m_fYPush = 0.0f; + m_fWarpAmount = 1.0f; + m_fStretchX = 1.0f; + m_fStretchY = 1.0f; + m_fWaveR = 1.0f; + m_fWaveG = 1.0f; + m_fWaveB = 1.0f; + m_fWaveX = 0.5f; + m_fWaveY = 0.5f; + m_fOuterBorderSize = 0.01f; + m_fOuterBorderR = 0.0f; + m_fOuterBorderG = 0.0f; + m_fOuterBorderB = 0.0f; + m_fOuterBorderA = 0.0f; + m_fInnerBorderSize = 0.01f; + m_fInnerBorderR = 0.25f; + m_fInnerBorderG = 0.25f; + m_fInnerBorderB = 0.25f; + m_fInnerBorderA = 0.0f; + + for (int i=0; im_fVideoEchoAlphaOld = s_from->m_fVideoEchoAlpha.eval(-1); + s_to->m_nVideoEchoOrientationOld = s_from->m_nVideoEchoOrientation; + s_to->m_nOldWaveMode = s_from->m_nWaveMode; + + /* + s_to->m_fVideoEchoAlphaOld = s_from->m_fVideoEchoAlpha.eval(-1); + s_to->m_nVideoEchoOrientationOld = s_from->m_nVideoEchoOrientation; + + s_to->m_nOldWaveMode = s_from->m_nWaveMode; + s_to->m_nWaveMode = s_from->m_nWaveMode; + s_to->m_bAdditiveWaves = s_from->m_bAdditiveWaves; + s_to->m_nVideoEchoOrientation = s_from->m_nVideoEchoOrientation; + s_to->m_fWarpAnimSpeed = s_from->m_fWarpAnimSpeed; // would req. 10 phase-matches to blend this one!!! + s_to->m_bWaveDots = s_from->m_bWaveDots; + s_to->m_bWaveThick = s_from->m_bWaveThick; + s_to->m_bModWaveAlphaByVolume = s_from->m_bModWaveAlphaByVolume; + s_to->m_bMaximizeWaveColor = s_from->m_bMaximizeWaveColor; + s_to->m_bTexWrap = s_from->m_bTexWrap; + s_to->m_bDarkenCenter = s_from->m_bDarkenCenter; + s_to->m_bRedBlueStereo = s_from->m_bRedBlueStereo; + s_to->m_bBrighten = s_from->m_bBrighten; + s_to->m_bDarken = s_from->m_bDarken; + s_to->m_bSolarize = s_from->m_bSolarize; + s_to->m_bInvert = s_from->m_bInvert; + s_to->m_fRating = s_from->m_fRating; + */ + + // expr. eval. also copies over immediately (replaces prev.) + m_bBlending = true; + m_fBlendStartTime = fAnimTime; + m_fBlendDuration = fTimespan; + + /* + //for (int e=0; em_szPerFrameExpr); + strcpy(s_to->m_szPerFrameExpr, szTemp); + + strcpy(szTemp, m_szPerPixelExpr); + strcpy(m_szPerPixelExpr, s_to->m_szPerPixelExpr); + strcpy(s_to->m_szPerPixelExpr, szTemp); + + strcpy(szTemp, m_szPerFrameInit); + strcpy(m_szPerFrameInit, s_to->m_szPerFrameInit); + strcpy(s_to->m_szPerFrameInit, szTemp); + } + RecompileExpressions(); + s_to->RecompileExpressions(); + + strcpy(m_szDesc, s_to->m_szDesc); + //strcpy(m_szSection, s_to->m_szSection); + */ + + // CBlendableFloats & SuperValues blend over time + m_fGammaAdj .StartBlendFrom(&s_from->m_fGammaAdj , fAnimTime, fTimespan); + m_fVideoEchoZoom .StartBlendFrom(&s_from->m_fVideoEchoZoom , fAnimTime, fTimespan); + m_fVideoEchoAlpha.StartBlendFrom(&s_from->m_fVideoEchoAlpha, fAnimTime, fTimespan); + m_fDecay .StartBlendFrom(&s_from->m_fDecay , fAnimTime, fTimespan); + m_fWaveAlpha .StartBlendFrom(&s_from->m_fWaveAlpha , fAnimTime, fTimespan); + m_fWaveScale .StartBlendFrom(&s_from->m_fWaveScale , fAnimTime, fTimespan); + m_fWaveSmoothing .StartBlendFrom(&s_from->m_fWaveSmoothing , fAnimTime, fTimespan); + m_fWaveParam .StartBlendFrom(&s_from->m_fWaveParam , fAnimTime, fTimespan); + m_fWarpScale .StartBlendFrom(&s_from->m_fWarpScale , fAnimTime, fTimespan); + m_fZoomExponent .StartBlendFrom(&s_from->m_fZoomExponent , fAnimTime, fTimespan); + m_fShader .StartBlendFrom(&s_from->m_fShader , fAnimTime, fTimespan); + m_fModWaveAlphaStart.StartBlendFrom(&s_from->m_fModWaveAlphaStart, fAnimTime, fTimespan); + m_fModWaveAlphaEnd .StartBlendFrom(&s_from->m_fModWaveAlphaEnd, fAnimTime, fTimespan); + + m_fZoom .StartBlendFrom(&s_from->m_fZoom , fAnimTime, fTimespan); + m_fRot .StartBlendFrom(&s_from->m_fRot , fAnimTime, fTimespan); + m_fRotCX .StartBlendFrom(&s_from->m_fRotCX , fAnimTime, fTimespan); + m_fRotCY .StartBlendFrom(&s_from->m_fRotCY , fAnimTime, fTimespan); + m_fXPush .StartBlendFrom(&s_from->m_fXPush , fAnimTime, fTimespan); + m_fYPush .StartBlendFrom(&s_from->m_fYPush , fAnimTime, fTimespan); + m_fWarpAmount.StartBlendFrom(&s_from->m_fWarpAmount,fAnimTime, fTimespan); + m_fStretchX .StartBlendFrom(&s_from->m_fStretchX , fAnimTime, fTimespan); + m_fStretchY .StartBlendFrom(&s_from->m_fStretchY , fAnimTime, fTimespan); + m_fWaveR .StartBlendFrom(&s_from->m_fWaveR , fAnimTime, fTimespan); + m_fWaveG .StartBlendFrom(&s_from->m_fWaveG , fAnimTime, fTimespan); + m_fWaveB .StartBlendFrom(&s_from->m_fWaveB , fAnimTime, fTimespan); + m_fWaveX .StartBlendFrom(&s_from->m_fWaveX , fAnimTime, fTimespan); + m_fWaveY .StartBlendFrom(&s_from->m_fWaveY , fAnimTime, fTimespan); + m_fOuterBorderSize .StartBlendFrom(&s_from->m_fOuterBorderSize , fAnimTime, fTimespan); + m_fOuterBorderR .StartBlendFrom(&s_from->m_fOuterBorderR , fAnimTime, fTimespan); + m_fOuterBorderG .StartBlendFrom(&s_from->m_fOuterBorderG , fAnimTime, fTimespan); + m_fOuterBorderB .StartBlendFrom(&s_from->m_fOuterBorderB , fAnimTime, fTimespan); + m_fOuterBorderA .StartBlendFrom(&s_from->m_fOuterBorderA , fAnimTime, fTimespan); + m_fInnerBorderSize .StartBlendFrom(&s_from->m_fInnerBorderSize , fAnimTime, fTimespan); + m_fInnerBorderR .StartBlendFrom(&s_from->m_fInnerBorderR , fAnimTime, fTimespan); + m_fInnerBorderG .StartBlendFrom(&s_from->m_fInnerBorderG , fAnimTime, fTimespan); + m_fInnerBorderB .StartBlendFrom(&s_from->m_fInnerBorderB , fAnimTime, fTimespan); + m_fInnerBorderA .StartBlendFrom(&s_from->m_fInnerBorderA , fAnimTime, fTimespan); + m_fMvX .StartBlendFrom(&s_from->m_fMvX , fAnimTime, fTimespan); + m_fMvY .StartBlendFrom(&s_from->m_fMvY , fAnimTime, fTimespan); + m_fMvDX .StartBlendFrom(&s_from->m_fMvDX , fAnimTime, fTimespan); + m_fMvDY .StartBlendFrom(&s_from->m_fMvDY , fAnimTime, fTimespan); + m_fMvL .StartBlendFrom(&s_from->m_fMvL , fAnimTime, fTimespan); + m_fMvR .StartBlendFrom(&s_from->m_fMvR , fAnimTime, fTimespan); + m_fMvG .StartBlendFrom(&s_from->m_fMvG , fAnimTime, fTimespan); + m_fMvB .StartBlendFrom(&s_from->m_fMvB , fAnimTime, fTimespan); + m_fMvA .StartBlendFrom(&s_from->m_fMvA , fAnimTime, fTimespan); + + // if motion vectors were transparent before, don't morph the # in X and Y - just + // start in the right place, and fade them in. + bool bOldStateTransparent = (s_from->m_fMvA.eval(-1) < 0.001f); + bool bNewStateTransparent = (s_to->m_fMvA.eval(-1) < 0.001f); + if (!bOldStateTransparent && bNewStateTransparent) + { + s_from->m_fMvX = s_to->m_fMvX.eval(fAnimTime); + s_from->m_fMvY = s_to->m_fMvY.eval(fAnimTime); + s_from->m_fMvDX = s_to->m_fMvDX.eval(fAnimTime); + s_from->m_fMvDY = s_to->m_fMvDY.eval(fAnimTime); + s_from->m_fMvL = s_to->m_fMvL.eval(fAnimTime); + s_from->m_fMvR = s_to->m_fMvR.eval(fAnimTime); + s_from->m_fMvG = s_to->m_fMvG.eval(fAnimTime); + s_from->m_fMvB = s_to->m_fMvB.eval(fAnimTime); + } + if (bNewStateTransparent && !bOldStateTransparent) + { + s_to->m_fMvX = s_from->m_fMvX.eval(fAnimTime); + s_to->m_fMvY = s_from->m_fMvY.eval(fAnimTime); + s_to->m_fMvDX = s_from->m_fMvDX.eval(fAnimTime); + s_to->m_fMvDY = s_from->m_fMvDY.eval(fAnimTime); + s_to->m_fMvL = s_from->m_fMvL.eval(fAnimTime); + s_to->m_fMvR = s_from->m_fMvR.eval(fAnimTime); + s_to->m_fMvG = s_from->m_fMvG.eval(fAnimTime); + s_to->m_fMvB = s_from->m_fMvB.eval(fAnimTime); + } + +} + +void WriteCode(FILE* fOut, int i, char* pStr, char* prefix) +{ + char szLineName[32]; + int line = 1; + int start_pos = 0; + int char_pos = 0; + + while (pStr[start_pos] != 0) + { + while ( pStr[char_pos] != 0 && + pStr[char_pos] != LINEFEED_CONTROL_CHAR) + char_pos++; + + sprintf(szLineName, "%s%d", prefix, line); + + char ch = pStr[char_pos]; + pStr[char_pos] = 0; + //if (!WritePrivateProfileString(szSectionName,szLineName,&pStr[start_pos],szIniFile)) return false; + fprintf(fOut, "%s=%s\n", szLineName, &pStr[start_pos]); + pStr[char_pos] = ch; + + if (pStr[char_pos] != 0) char_pos++; + start_pos = char_pos; + line++; + } +} + +bool CState::Export(char *szSectionName, char *szIniFile) +{ + FILE *fOut = fopen(szIniFile, "w"); + if (!fOut) return false; + + fprintf(fOut, "[%s]\n", szSectionName); + + fprintf(fOut, "%s=%f\n", "fRating", m_fRating); + fprintf(fOut, "%s=%f\n", "fGammaAdj", m_fGammaAdj.eval(-1)); + fprintf(fOut, "%s=%f\n", "fDecay", m_fDecay.eval(-1)); + fprintf(fOut, "%s=%f\n", "fVideoEchoZoom", m_fVideoEchoZoom.eval(-1)); + fprintf(fOut, "%s=%f\n", "fVideoEchoAlpha", m_fVideoEchoAlpha.eval(-1)); + fprintf(fOut, "%s=%d\n", "nVideoEchoOrientation", m_nVideoEchoOrientation); + + fprintf(fOut, "%s=%d\n", "nWaveMode", m_nWaveMode); + fprintf(fOut, "%s=%d\n", "bAdditiveWaves", m_bAdditiveWaves); + fprintf(fOut, "%s=%d\n", "bWaveDots", m_bWaveDots); + fprintf(fOut, "%s=%d\n", "bWaveThick", m_bWaveThick); + fprintf(fOut, "%s=%d\n", "bModWaveAlphaByVolume", m_bModWaveAlphaByVolume); + fprintf(fOut, "%s=%d\n", "bMaximizeWaveColor", m_bMaximizeWaveColor); + fprintf(fOut, "%s=%d\n", "bTexWrap", m_bTexWrap ); + fprintf(fOut, "%s=%d\n", "bDarkenCenter", m_bDarkenCenter ); + fprintf(fOut, "%s=%d\n", "bRedBlueStereo", m_bRedBlueStereo ); + fprintf(fOut, "%s=%d\n", "bBrighten", m_bBrighten ); + fprintf(fOut, "%s=%d\n", "bDarken", m_bDarken ); + fprintf(fOut, "%s=%d\n", "bSolarize", m_bSolarize ); + fprintf(fOut, "%s=%d\n", "bInvert", m_bInvert ); + + fprintf(fOut, "%s=%f\n", "fWaveAlpha", m_fWaveAlpha.eval(-1)); + fprintf(fOut, "%s=%f\n", "fWaveScale", m_fWaveScale.eval(-1)); + fprintf(fOut, "%s=%f\n", "fWaveSmoothing", m_fWaveSmoothing.eval(-1)); + fprintf(fOut, "%s=%f\n", "fWaveParam", m_fWaveParam.eval(-1)); + fprintf(fOut, "%s=%f\n", "fModWaveAlphaStart", m_fModWaveAlphaStart.eval(-1)); + fprintf(fOut, "%s=%f\n", "fModWaveAlphaEnd", m_fModWaveAlphaEnd.eval(-1)); + fprintf(fOut, "%s=%f\n", "fWarpAnimSpeed", m_fWarpAnimSpeed); + fprintf(fOut, "%s=%f\n", "fWarpScale", m_fWarpScale.eval(-1)); + fprintf(fOut, "%s=%f\n", "fZoomExponent", m_fZoomExponent.eval(-1)); + fprintf(fOut, "%s=%f\n", "fShader", m_fShader.eval(-1)); + + fprintf(fOut, "%s=%f\n", "zoom", m_fZoom .eval(-1)); + fprintf(fOut, "%s=%f\n", "rot", m_fRot .eval(-1)); + fprintf(fOut, "%s=%f\n", "cx", m_fRotCX .eval(-1)); + fprintf(fOut, "%s=%f\n", "cy", m_fRotCY .eval(-1)); + fprintf(fOut, "%s=%f\n", "dx", m_fXPush .eval(-1)); + fprintf(fOut, "%s=%f\n", "dy", m_fYPush .eval(-1)); + fprintf(fOut, "%s=%f\n", "warp", m_fWarpAmount.eval(-1)); + fprintf(fOut, "%s=%f\n", "sx", m_fStretchX .eval(-1)); + fprintf(fOut, "%s=%f\n", "sy", m_fStretchY .eval(-1)); + fprintf(fOut, "%s=%f\n", "wave_r", m_fWaveR .eval(-1)); + fprintf(fOut, "%s=%f\n", "wave_g", m_fWaveG .eval(-1)); + fprintf(fOut, "%s=%f\n", "wave_b", m_fWaveB .eval(-1)); + fprintf(fOut, "%s=%f\n", "wave_x", m_fWaveX .eval(-1)); + fprintf(fOut, "%s=%f\n", "wave_y", m_fWaveY .eval(-1)); + + fprintf(fOut, "%s=%f\n", "ob_size", m_fOuterBorderSize.eval(-1)); + fprintf(fOut, "%s=%f\n", "ob_r", m_fOuterBorderR.eval(-1)); + fprintf(fOut, "%s=%f\n", "ob_g", m_fOuterBorderG.eval(-1)); + fprintf(fOut, "%s=%f\n", "ob_b", m_fOuterBorderB.eval(-1)); + fprintf(fOut, "%s=%f\n", "ob_a", m_fOuterBorderA.eval(-1)); + fprintf(fOut, "%s=%f\n", "ib_size", m_fInnerBorderSize.eval(-1)); + fprintf(fOut, "%s=%f\n", "ib_r", m_fInnerBorderR.eval(-1)); + fprintf(fOut, "%s=%f\n", "ib_g", m_fInnerBorderG.eval(-1)); + fprintf(fOut, "%s=%f\n", "ib_b", m_fInnerBorderB.eval(-1)); + fprintf(fOut, "%s=%f\n", "ib_a", m_fInnerBorderA.eval(-1)); + fprintf(fOut, "%s=%f\n", "nMotionVectorsX", m_fMvX.eval(-1)); + fprintf(fOut, "%s=%f\n", "nMotionVectorsY", m_fMvY.eval(-1)); + fprintf(fOut, "%s=%f\n", "mv_dx", m_fMvDX.eval(-1)); + fprintf(fOut, "%s=%f\n", "mv_dy", m_fMvDY.eval(-1)); + fprintf(fOut, "%s=%f\n", "mv_l", m_fMvL.eval(-1)); + fprintf(fOut, "%s=%f\n", "mv_r", m_fMvR.eval(-1)); + fprintf(fOut, "%s=%f\n", "mv_g", m_fMvG.eval(-1)); + fprintf(fOut, "%s=%f\n", "mv_b", m_fMvB.eval(-1)); + fprintf(fOut, "%s=%f\n", "mv_a", m_fMvA.eval(-1)); + + int i=0; + + for (i=0; i= 8191-char_pos-1)) // or if we're out of space + { + bDone = true; + } + else + { + sprintf(&pStr[char_pos], "%s%c", szLine, LINEFEED_CONTROL_CHAR); + } + + char_pos += len + 1; + line++; + } + pStr[char_pos++] = 0; // null-terminate + + // read in & compile arbitrary expressions + /* + int n2 = 3 + MAX_CUSTOM_WAVES*3 + MAX_CUSTOM_SHAPES*2; + for (int n=0; n= 8191-char_pos-1)) // or if we're out of space + { + bDone = true; + } + else + { + sprintf(&pStr[char_pos], "%s%c", szLine, LINEFEED_CONTROL_CHAR); + } + + char_pos += len + 1; + line++; + } + pStr[char_pos++] = 0; // null-terminate + } + */ +} + +int CWave::Import(char* szSectionName, char *szIniFile, int i) +{ +// if (GetFileAttributes(szIniFile)==0xFFFFFFFF) +// return 0; + + char buf[64]; + sprintf(buf, "wavecode_%d_%s", i, "enabled" ); enabled = InternalGetPrivateProfileInt (szSectionName, buf, enabled , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "samples" ); samples = InternalGetPrivateProfileInt (szSectionName, buf, samples , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "sep" ); sep = InternalGetPrivateProfileInt (szSectionName, buf, sep , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "bSpectrum" ); bSpectrum = InternalGetPrivateProfileInt (szSectionName, buf, bSpectrum , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "bUseDots" ); bUseDots = InternalGetPrivateProfileInt (szSectionName, buf, bUseDots , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "bDrawThick"); bDrawThick = InternalGetPrivateProfileInt (szSectionName, buf, bDrawThick, szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "bAdditive" ); bAdditive = InternalGetPrivateProfileInt (szSectionName, buf, bAdditive , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "scaling" ); scaling = InternalGetPrivateProfileFloat(szSectionName, buf, scaling , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "smoothing" ); smoothing = InternalGetPrivateProfileFloat(szSectionName, buf, smoothing , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "r" ); r = InternalGetPrivateProfileFloat(szSectionName, buf, r , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "g" ); g = InternalGetPrivateProfileFloat(szSectionName, buf, g , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "b" ); b = InternalGetPrivateProfileFloat(szSectionName, buf, b , szIniFile); + sprintf(buf, "wavecode_%d_%s", i, "a" ); a = InternalGetPrivateProfileFloat(szSectionName, buf, a , szIniFile); + + // READ THE CODE IN + char prefix[64]; + sprintf(prefix, "wave_%d_init", i); ReadCode(szSectionName, szIniFile, m_szInit, prefix); + sprintf(prefix, "wave_%d_per_frame", i); ReadCode(szSectionName, szIniFile, m_szPerFrame, prefix); + sprintf(prefix, "wave_%d_per_point", i); ReadCode(szSectionName, szIniFile, m_szPerPoint, prefix); + + return 1; +} + +int CShape::Import(char* szSectionName, char *szIniFile, int i) +{ +// if (GetFileAttributes(szIniFile)==0xFFFFFFFF) +// return 0; + + char buf[64]; + sprintf(buf, "shapecode_%d_%s", i, "enabled" ); enabled = InternalGetPrivateProfileInt (szSectionName, buf, enabled , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "sides" ); sides = InternalGetPrivateProfileInt (szSectionName, buf, sides , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "additive" ); additive = InternalGetPrivateProfileInt (szSectionName, buf, additive , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "thickOutline"); thickOutline = InternalGetPrivateProfileInt (szSectionName, buf, thickOutline, szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "textured" ); textured = InternalGetPrivateProfileInt (szSectionName, buf, textured , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "x" ); x = InternalGetPrivateProfileFloat(szSectionName, buf, x , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "y" ); y = InternalGetPrivateProfileFloat(szSectionName, buf, y , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "rad" ); rad = InternalGetPrivateProfileFloat(szSectionName, buf, rad , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "ang" ); ang = InternalGetPrivateProfileFloat(szSectionName, buf, ang , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "tex_ang" ); tex_ang = InternalGetPrivateProfileFloat(szSectionName, buf, tex_ang , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "tex_zoom" ); tex_zoom = InternalGetPrivateProfileFloat(szSectionName, buf, tex_zoom , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "r" ); r = InternalGetPrivateProfileFloat(szSectionName, buf, r , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "g" ); g = InternalGetPrivateProfileFloat(szSectionName, buf, g , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "b" ); b = InternalGetPrivateProfileFloat(szSectionName, buf, b , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "a" ); a = InternalGetPrivateProfileFloat(szSectionName, buf, a , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "r2" ); r2 = InternalGetPrivateProfileFloat(szSectionName, buf, r2 , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "g2" ); g2 = InternalGetPrivateProfileFloat(szSectionName, buf, g2 , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "b2" ); b2 = InternalGetPrivateProfileFloat(szSectionName, buf, b2 , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "a2" ); a2 = InternalGetPrivateProfileFloat(szSectionName, buf, a2 , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "border_r" ); border_r = InternalGetPrivateProfileFloat(szSectionName, buf, border_r , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "border_g" ); border_g = InternalGetPrivateProfileFloat(szSectionName, buf, border_g , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "border_b" ); border_b = InternalGetPrivateProfileFloat(szSectionName, buf, border_b , szIniFile); + sprintf(buf, "shapecode_%d_%s", i, "border_a" ); border_a = InternalGetPrivateProfileFloat(szSectionName, buf, border_a , szIniFile); + + // READ THE CODE IN + char prefix[64]; + sprintf(prefix, "shape_%d_init", i); ReadCode(szSectionName, szIniFile, m_szInit, prefix); + sprintf(prefix, "shape_%d_per_frame", i); ReadCode(szSectionName, szIniFile, m_szPerFrame, prefix); + + return 1; +} + +void CState::Import(char *szSectionName, char *szIniFile) +{ + + Default(); + + //strcpy(m_szSection, szSectionName); + //InternalGetPrivateProfileString(szSectionName, "szDesc", "", m_szDesc, sizeof(m_szDesc), szIniFile); + + // extract a description of the preset from the filename + { + // copy get the filename (without the path) + char *p = strrchr(szIniFile, '/'); + if (p==NULL) p = szIniFile; + strcpy(m_szDesc, p+1); + + // next remove the extension + RemoveExtension(m_szDesc); + } + + m_fRating = InternalGetPrivateProfileFloat(szSectionName,"fRating",m_fRating,szIniFile); + m_fDecay = InternalGetPrivateProfileFloat(szSectionName,"fDecay",m_fDecay.eval(-1),szIniFile); + m_fGammaAdj = InternalGetPrivateProfileFloat(szSectionName,"fGammaAdj" ,m_fGammaAdj.eval(-1),szIniFile); + m_fVideoEchoZoom = InternalGetPrivateProfileFloat(szSectionName,"fVideoEchoZoom",m_fVideoEchoZoom.eval(-1),szIniFile); + m_fVideoEchoAlpha = InternalGetPrivateProfileFloat(szSectionName,"fVideoEchoAlpha",m_fVideoEchoAlpha.eval(-1),szIniFile); + m_nVideoEchoOrientation = InternalGetPrivateProfileInt (szSectionName,"nVideoEchoOrientation",m_nVideoEchoOrientation,szIniFile); + + m_nWaveMode = InternalGetPrivateProfileInt (szSectionName,"nWaveMode",m_nWaveMode,szIniFile); + m_bAdditiveWaves = (InternalGetPrivateProfileInt (szSectionName,"bAdditiveWaves",m_bAdditiveWaves,szIniFile) != 0); + m_bWaveDots = (InternalGetPrivateProfileInt (szSectionName,"bWaveDots",m_bWaveDots,szIniFile) != 0); + m_bWaveThick = (InternalGetPrivateProfileInt (szSectionName,"bWaveThick",m_bWaveThick,szIniFile) != 0); + m_bModWaveAlphaByVolume = (InternalGetPrivateProfileInt (szSectionName,"bModWaveAlphaByVolume",m_bModWaveAlphaByVolume,szIniFile) != 0); + m_bMaximizeWaveColor = (InternalGetPrivateProfileInt (szSectionName,"bMaximizeWaveColor" ,m_bMaximizeWaveColor,szIniFile) != 0); + m_bTexWrap = (InternalGetPrivateProfileInt (szSectionName,"bTexWrap", m_bTexWrap,szIniFile) != 0); + m_bDarkenCenter = (InternalGetPrivateProfileInt (szSectionName,"bDarkenCenter", m_bDarkenCenter,szIniFile) != 0); + m_bRedBlueStereo = (InternalGetPrivateProfileInt (szSectionName,"bRedBlueStereo", m_bRedBlueStereo,szIniFile) != 0); + m_bBrighten = (InternalGetPrivateProfileInt (szSectionName,"bBrighten",m_bBrighten ,szIniFile) != 0); + m_bDarken = (InternalGetPrivateProfileInt (szSectionName,"bDarken" ,m_bDarken ,szIniFile) != 0); + m_bSolarize = (InternalGetPrivateProfileInt (szSectionName,"bSolarize",m_bSolarize ,szIniFile) != 0); + m_bInvert = (InternalGetPrivateProfileInt (szSectionName,"bInvert" ,m_bInvert ,szIniFile) != 0); + + m_fWaveAlpha = InternalGetPrivateProfileFloat(szSectionName,"fWaveAlpha",m_fWaveAlpha.eval(-1),szIniFile); + m_fWaveScale = InternalGetPrivateProfileFloat(szSectionName,"fWaveScale",m_fWaveScale.eval(-1),szIniFile); + m_fWaveSmoothing = InternalGetPrivateProfileFloat(szSectionName,"fWaveSmoothing",m_fWaveSmoothing.eval(-1),szIniFile); + m_fWaveParam = InternalGetPrivateProfileFloat(szSectionName,"fWaveParam",m_fWaveParam.eval(-1),szIniFile); + m_fModWaveAlphaStart = InternalGetPrivateProfileFloat(szSectionName,"fModWaveAlphaStart",m_fModWaveAlphaStart.eval(-1),szIniFile); + m_fModWaveAlphaEnd = InternalGetPrivateProfileFloat(szSectionName,"fModWaveAlphaEnd",m_fModWaveAlphaEnd.eval(-1),szIniFile); + m_fWarpAnimSpeed = InternalGetPrivateProfileFloat(szSectionName,"fWarpAnimSpeed",m_fWarpAnimSpeed,szIniFile); + m_fWarpScale = InternalGetPrivateProfileFloat(szSectionName,"fWarpScale",m_fWarpScale.eval(-1),szIniFile); + m_fZoomExponent = InternalGetPrivateProfileFloat(szSectionName,"fZoomExponent",m_fZoomExponent.eval(-1),szIniFile); + m_fShader = InternalGetPrivateProfileFloat(szSectionName,"fShader",m_fShader.eval(-1),szIniFile); + + m_fZoom = InternalGetPrivateProfileFloat(szSectionName,"zoom",m_fZoom.eval(-1),szIniFile); + m_fRot = InternalGetPrivateProfileFloat(szSectionName,"rot",m_fRot.eval(-1),szIniFile); + m_fRotCX = InternalGetPrivateProfileFloat(szSectionName,"cx",m_fRotCX.eval(-1),szIniFile); + m_fRotCY = InternalGetPrivateProfileFloat(szSectionName,"cy",m_fRotCY.eval(-1),szIniFile); + m_fXPush = InternalGetPrivateProfileFloat(szSectionName,"dx",m_fXPush.eval(-1),szIniFile); + m_fYPush = InternalGetPrivateProfileFloat(szSectionName,"dy",m_fYPush.eval(-1),szIniFile); + m_fWarpAmount = InternalGetPrivateProfileFloat(szSectionName,"warp",m_fWarpAmount.eval(-1),szIniFile); + m_fStretchX = InternalGetPrivateProfileFloat(szSectionName,"sx",m_fStretchX.eval(-1),szIniFile); + m_fStretchY = InternalGetPrivateProfileFloat(szSectionName,"sy",m_fStretchY.eval(-1),szIniFile); + m_fWaveR = InternalGetPrivateProfileFloat(szSectionName,"wave_r",m_fRot.eval(-1),szIniFile); + m_fWaveG = InternalGetPrivateProfileFloat(szSectionName,"wave_g",m_fRot.eval(-1),szIniFile); + m_fWaveB = InternalGetPrivateProfileFloat(szSectionName,"wave_b",m_fRot.eval(-1),szIniFile); + m_fWaveX = InternalGetPrivateProfileFloat(szSectionName,"wave_x",m_fRot.eval(-1),szIniFile); + m_fWaveY = InternalGetPrivateProfileFloat(szSectionName,"wave_y",m_fRot.eval(-1),szIniFile); + + m_fOuterBorderSize = InternalGetPrivateProfileFloat(szSectionName,"ob_size",m_fOuterBorderSize.eval(-1),szIniFile); + m_fOuterBorderR = InternalGetPrivateProfileFloat(szSectionName,"ob_r", m_fOuterBorderR.eval(-1),szIniFile); + m_fOuterBorderG = InternalGetPrivateProfileFloat(szSectionName,"ob_g", m_fOuterBorderG.eval(-1),szIniFile); + m_fOuterBorderB = InternalGetPrivateProfileFloat(szSectionName,"ob_b", m_fOuterBorderB.eval(-1),szIniFile); + m_fOuterBorderA = InternalGetPrivateProfileFloat(szSectionName,"ob_a", m_fOuterBorderA.eval(-1),szIniFile); + m_fInnerBorderSize = InternalGetPrivateProfileFloat(szSectionName,"ib_size",m_fInnerBorderSize.eval(-1),szIniFile); + m_fInnerBorderR = InternalGetPrivateProfileFloat(szSectionName,"ib_r", m_fInnerBorderR.eval(-1),szIniFile); + m_fInnerBorderG = InternalGetPrivateProfileFloat(szSectionName,"ib_g", m_fInnerBorderG.eval(-1),szIniFile); + m_fInnerBorderB = InternalGetPrivateProfileFloat(szSectionName,"ib_b", m_fInnerBorderB.eval(-1),szIniFile); + m_fInnerBorderA = InternalGetPrivateProfileFloat(szSectionName,"ib_a", m_fInnerBorderA.eval(-1),szIniFile); + m_fMvX = InternalGetPrivateProfileFloat(szSectionName,"nMotionVectorsX", m_fMvX.eval(-1),szIniFile); + m_fMvY = InternalGetPrivateProfileFloat(szSectionName,"nMotionVectorsY", m_fMvY.eval(-1),szIniFile); + m_fMvDX = InternalGetPrivateProfileFloat(szSectionName,"mv_dx", m_fMvDX.eval(-1),szIniFile); + m_fMvDY = InternalGetPrivateProfileFloat(szSectionName,"mv_dy", m_fMvDY.eval(-1),szIniFile); + m_fMvL = InternalGetPrivateProfileFloat(szSectionName,"mv_l", m_fMvL.eval(-1),szIniFile); + m_fMvR = InternalGetPrivateProfileFloat(szSectionName,"mv_r", m_fMvR.eval(-1),szIniFile); + m_fMvG = InternalGetPrivateProfileFloat(szSectionName,"mv_g", m_fMvG.eval(-1),szIniFile); + m_fMvB = InternalGetPrivateProfileFloat(szSectionName,"mv_b", m_fMvB.eval(-1),szIniFile); + m_fMvA = (InternalGetPrivateProfileInt (szSectionName,"bMotionVectorsOn",false,szIniFile) == 0) ? 0.0f : 1.0f; // for backwards compatibility + m_fMvA = InternalGetPrivateProfileFloat(szSectionName,"mv_a", m_fMvA.eval(-1),szIniFile); + + for (int i=0; i= 8191-char_pos-1)) // or if we're out of space + { + bDone = true; + } + else + { + sprintf(&pStr[char_pos], "%s%c", szLine, LINEFEED_CONTROL_CHAR); + } + + char_pos += len + 1; + line++; + } + pStr[char_pos++] = 0; // null-terminate + } + */ + + RecompileExpressions(); +} + +void CState::FreeVarsAndCode() +{ + // free the compiled expressions + if (m_pf_codehandle) + { + freeCode(m_pf_codehandle); + m_pf_codehandle = NULL; + } + if (m_pp_codehandle) + { + freeCode(m_pp_codehandle); + m_pp_codehandle = NULL; + } + + for (int i=0; i= sizeof(src). + + int i2 = 0; + int len = strlen(src); + int bComment = false; + for (int i=0; im_fShowUserMessageUntilThisTime = g_plugin->GetTime(); + + char buf[8192*3]; + + if (flags & RECOMPILE_PRESET_CODE) + { + resetVars(m_pf_vars); + + // 1. compile AND EXECUTE preset init code + StripLinefeedCharsAndComments(m_szPerFrameInit, buf); + if (buf[0] && bReInit) + { + int pf_codehandle_init; + + if ( ! (pf_codehandle_init = compileCode(buf))) + { + sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in 'per_frame_init' code", m_szDesc); + g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f; + + q_values_after_init_code[0] = 0; + q_values_after_init_code[1] = 0; + q_values_after_init_code[2] = 0; + q_values_after_init_code[3] = 0; + q_values_after_init_code[4] = 0; + q_values_after_init_code[5] = 0; + q_values_after_init_code[6] = 0; + q_values_after_init_code[7] = 0; + monitor_after_init_code = 0; + } + else + { + // now execute the code, save the values of q1..q8, and clean up the code! + + g_plugin->LoadPerFrameEvallibVars(g_plugin->m_pState); + + executeCode(pf_codehandle_init); + + q_values_after_init_code[0] = *var_pf_q1; + q_values_after_init_code[1] = *var_pf_q2; + q_values_after_init_code[2] = *var_pf_q3; + q_values_after_init_code[3] = *var_pf_q4; + q_values_after_init_code[4] = *var_pf_q5; + q_values_after_init_code[5] = *var_pf_q6; + q_values_after_init_code[6] = *var_pf_q7; + q_values_after_init_code[7] = *var_pf_q8; + monitor_after_init_code = *var_pf_monitor; + + freeCode(pf_codehandle_init); + pf_codehandle_init = NULL; + } + } + + // 2. compile preset per-frame code + StripLinefeedCharsAndComments(m_szPerFrameExpr, buf); + if (buf[0]) + { + if ( ! (m_pf_codehandle = compileCode(buf))) + { + sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in 'per_frame' code", m_szDesc); + g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f; + } + } + + resetVars(NULL); + resetVars(m_pv_vars); + + // 3. compile preset per-pixel code + StripLinefeedCharsAndComments(m_szPerPixelExpr, buf); + if (buf[0]) + { + if ( ! (m_pp_codehandle = compileCode(buf))) + { + sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in 'per_pixel' code", m_szDesc); + g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f; + } + } + + resetVars(NULL); + } + + if (flags & RECOMPILE_WAVE_CODE) + { + for (int i=0; im_szUserMessage, "warning: preset \"%s\": error in wave %d init code", m_szDesc, i); + g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f; + + *m_wave[i].var_pf_q1 = q_values_after_init_code[0]; + *m_wave[i].var_pf_q2 = q_values_after_init_code[1]; + *m_wave[i].var_pf_q3 = q_values_after_init_code[2]; + *m_wave[i].var_pf_q4 = q_values_after_init_code[3]; + *m_wave[i].var_pf_q5 = q_values_after_init_code[4]; + *m_wave[i].var_pf_q6 = q_values_after_init_code[5]; + *m_wave[i].var_pf_q7 = q_values_after_init_code[6]; + *m_wave[i].var_pf_q8 = q_values_after_init_code[7]; + m_wave[i].t_values_after_init_code[0] = 0; + m_wave[i].t_values_after_init_code[1] = 0; + m_wave[i].t_values_after_init_code[2] = 0; + m_wave[i].t_values_after_init_code[3] = 0; + m_wave[i].t_values_after_init_code[4] = 0; + m_wave[i].t_values_after_init_code[5] = 0; + m_wave[i].t_values_after_init_code[6] = 0; + m_wave[i].t_values_after_init_code[7] = 0; + } + else + { + // now execute the code, save the values of q1..q8, and clean up the code! + + g_plugin->LoadCustomWavePerFrameEvallibVars(g_plugin->m_pState, i); + + executeCode(codehandle_temp); + + m_wave[i].t_values_after_init_code[0] = *m_wave[i].var_pf_t1; + m_wave[i].t_values_after_init_code[1] = *m_wave[i].var_pf_t2; + m_wave[i].t_values_after_init_code[2] = *m_wave[i].var_pf_t3; + m_wave[i].t_values_after_init_code[3] = *m_wave[i].var_pf_t4; + m_wave[i].t_values_after_init_code[4] = *m_wave[i].var_pf_t5; + m_wave[i].t_values_after_init_code[5] = *m_wave[i].var_pf_t6; + m_wave[i].t_values_after_init_code[6] = *m_wave[i].var_pf_t7; + m_wave[i].t_values_after_init_code[7] = *m_wave[i].var_pf_t8; + + freeCode(codehandle_temp); + codehandle_temp = NULL; + } + } + resetVars(NULL); + } + + // 2. compile custom waveform per-frame code + StripLinefeedCharsAndComments(m_wave[i].m_szPerFrame, buf); + if (buf[0]) + { + resetVars(m_wave[i].m_pf_vars); + if ( ! (m_wave[i].m_pf_codehandle = compileCode(buf))) + { + sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in wave %d per-frame code", m_szDesc, i); + g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f; + } + resetVars(NULL); + } + + // 3. compile custom waveform per-point code + StripLinefeedCharsAndComments(m_wave[i].m_szPerPoint, buf); + if (buf[0]) + { + resetVars(m_wave[i].m_pp_vars); + if ( ! (m_wave[i].m_pp_codehandle = compileCode(buf))) + { + sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in wave %d per-point code", m_szDesc, i); + g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f; + } + resetVars(NULL); + } + } + } + + if (flags & RECOMPILE_SHAPE_CODE) + { + for (int i=0; im_szUserMessage, "warning: preset \"%s\": error in shape %d init code", m_szDesc, i); + g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f; + + *m_shape[i].var_pf_q1 = q_values_after_init_code[0]; + *m_shape[i].var_pf_q2 = q_values_after_init_code[1]; + *m_shape[i].var_pf_q3 = q_values_after_init_code[2]; + *m_shape[i].var_pf_q4 = q_values_after_init_code[3]; + *m_shape[i].var_pf_q5 = q_values_after_init_code[4]; + *m_shape[i].var_pf_q6 = q_values_after_init_code[5]; + *m_shape[i].var_pf_q7 = q_values_after_init_code[6]; + *m_shape[i].var_pf_q8 = q_values_after_init_code[7]; + m_shape[i].t_values_after_init_code[0] = 0; + m_shape[i].t_values_after_init_code[1] = 0; + m_shape[i].t_values_after_init_code[2] = 0; + m_shape[i].t_values_after_init_code[3] = 0; + m_shape[i].t_values_after_init_code[4] = 0; + m_shape[i].t_values_after_init_code[5] = 0; + m_shape[i].t_values_after_init_code[6] = 0; + m_shape[i].t_values_after_init_code[7] = 0; + } + else + { + // now execute the code, save the values of q1..q8, and clean up the code! + + g_plugin->LoadCustomShapePerFrameEvallibVars(g_plugin->m_pState, i); + + executeCode(codehandle_temp); + + m_shape[i].t_values_after_init_code[0] = *m_shape[i].var_pf_t1; + m_shape[i].t_values_after_init_code[1] = *m_shape[i].var_pf_t2; + m_shape[i].t_values_after_init_code[2] = *m_shape[i].var_pf_t3; + m_shape[i].t_values_after_init_code[3] = *m_shape[i].var_pf_t4; + m_shape[i].t_values_after_init_code[4] = *m_shape[i].var_pf_t5; + m_shape[i].t_values_after_init_code[5] = *m_shape[i].var_pf_t6; + m_shape[i].t_values_after_init_code[6] = *m_shape[i].var_pf_t7; + m_shape[i].t_values_after_init_code[7] = *m_shape[i].var_pf_t8; + + freeCode(codehandle_temp); + codehandle_temp = NULL; + } + } + #endif + resetVars(NULL); + } + + // 2. compile custom shape per-frame code + StripLinefeedCharsAndComments(m_shape[i].m_szPerFrame, buf); + if (buf[0]) + { + resetVars(m_shape[i].m_pf_vars); + #ifndef _NO_EXPR_ + if ( ! (m_shape[i].m_pf_codehandle = compileCode(buf))) + { + sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in shape %d per-frame code", m_szDesc, i); + g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f; + } + #endif + resetVars(NULL); + } + + /* + // 3. compile custom shape per-point code + StripLinefeedCharsAndComments(m_shape[i].m_szPerPoint, buf); + if (buf[0]) + { + resetVars(m_shape[i].m_pp_vars); + #ifndef _NO_EXPR_ + if ( ! (m_shape[i].m_pp_codehandle = compileCode(buf))) + { + sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in shape %d per-point code", m_szDesc, i); + g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f; + } + #endif + resetVars(NULL); + } + */ + } + } + } + #endif +} + + + + + + + + + + + +CBlendableFloat::CBlendableFloat() +{ + m_bBlending = false; +} + +CBlendableFloat::~CBlendableFloat() +{ +} + +//-------------------------------------------------------------------------------- + +float CBlendableFloat::eval(float fTime) +{ + if (fTime < 0) + { + return val; + } + + if (m_bBlending && (fTime > m_fBlendStartTime + m_fBlendDuration) || (fTime < m_fBlendStartTime)) + { + m_bBlending = false; + } + + if (!m_bBlending) + { + return val; + } + else + { + float mix = (fTime - m_fBlendStartTime) / m_fBlendDuration; + return (m_fBlendFrom*(1.0f - mix) + val*mix); + } +} + +//-------------------------------------------------------------------------------- + +void CBlendableFloat::StartBlendFrom(CBlendableFloat *f_from, float fAnimTime, float fDuration) +{ + if (fDuration < 0.001f) + return; + + m_fBlendFrom = f_from->eval(fAnimTime); + m_bBlending = true; + m_fBlendStartTime = fAnimTime; + m_fBlendDuration = fDuration; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/state.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/state.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/state.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/state.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,408 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +#ifndef _MILKDROP_STATE_ +#define _MILKDROP_STATE_ 1 + + +#include +#include +#include + +#include "evallib/eval.h" +#include "md_defines.h" + +// flags for CState::RecompileExpressions(): +#define RECOMPILE_PRESET_CODE 1 +#define RECOMPILE_WAVE_CODE 2 +#define RECOMPILE_SHAPE_CODE 4 + +class CBlendableFloat +{ +public: + CBlendableFloat(); + ~CBlendableFloat(); + + float operator = (float f) { + val = f; + m_bBlending = false; + return val; + }; + float operator *= (float f) { + val *= f; + m_bBlending = false; + return val; + }; + float operator /= (float f) { + val /= f; + m_bBlending = false; + return val; + }; + float operator -= (float f) { + val -= f; + m_bBlending = false; + return val; + }; + float operator += (float f) { + val += f; + m_bBlending = false; + return val; + }; + + float eval(float fTime); // call this from animation code. if fTime < 0, it will return unblended 'val'. + void StartBlendFrom(CBlendableFloat *f_from, float fAnimTime, float fDuration); + +protected: + float val; + bool m_bBlending; + float m_fBlendStartTime; + float m_fBlendDuration; + float m_fBlendFrom; +}; + +class CShape +{ +public: + int Import(char* szSection, char* szFile, int i); + int Export(char* szSection, char* szFile, int i, FILE* fOut=NULL); + + int enabled; + int sides; + int additive; + int thickOutline; + int textured; + float x,y,rad,ang; + float r,g,b,a; + float r2,g2,b2,a2; + float border_r,border_g,border_b,border_a; + float tex_ang, tex_zoom; + + char m_szInit[8192]; // note: only executed once -> don't need to save codehandle + char m_szPerFrame[8192]; + //char m_szPerPoint[8192]; + int m_pf_codehandle; + //int m_pp_codehandle; + + // for per-frame expression evaluation: + varType m_pf_vars[EVAL_MAX_VARS]; + double *var_pf_time, *var_pf_fps; + double *var_pf_frame; + double *var_pf_progress; + double *var_pf_q1, *var_pf_q2, *var_pf_q3, *var_pf_q4, *var_pf_q5, *var_pf_q6, *var_pf_q7, *var_pf_q8; + double *var_pf_t1, *var_pf_t2, *var_pf_t3, *var_pf_t4, *var_pf_t5, *var_pf_t6, *var_pf_t7, *var_pf_t8; + double *var_pf_bass, *var_pf_mid, *var_pf_treb, *var_pf_bass_att, *var_pf_mid_att, *var_pf_treb_att; + double *var_pf_r, *var_pf_g, *var_pf_b, *var_pf_a; + double *var_pf_r2, *var_pf_g2, *var_pf_b2, *var_pf_a2; + double *var_pf_border_r, *var_pf_border_g, *var_pf_border_b, *var_pf_border_a; + double *var_pf_x, *var_pf_y, *var_pf_rad, *var_pf_ang; + double *var_pf_sides, *var_pf_textured, *var_pf_additive, *var_pf_thick; + double *var_pf_tex_zoom, *var_pf_tex_ang; + + // for per-point expression evaluation: + /* + varType m_pp_vars[EVAL_MAX_VARS]; + double *var_pp_time, *var_pp_fps; + double *var_pp_frame; + double *var_pp_progress; + double *var_pp_q1, *var_pp_q2, *var_pp_q3, *var_pp_q4, *var_pp_q5, *var_pp_q6, *var_pp_q7, *var_pp_q8; + double *var_pp_t1, *var_pp_t2, *var_pp_t3, *var_pp_t4, *var_pp_t5, *var_pp_t6, *var_pp_t7, *var_pp_t8; + double *var_pp_bass, *var_pp_mid, *var_pp_treb, *var_pp_bass_att, *var_pp_mid_att, *var_pp_treb_att; + double *var_pp_r, *var_pp_g, *var_pp_b, *var_pp_a; + double *var_pp_r2, *var_pp_g2, *var_pp_b2, *var_pp_a2; + double *var_pp_border_r, *var_pp_border_g, *var_pp_border_b, *var_pp_border_a; + double *var_pp_x, *var_pp_y, *var_pp_rad, *var_pp_ang, *var_pp_sides; + */ + + double t_values_after_init_code[8]; + +}; + +class CWave +{ +public: + int Import(char* szSection, char *szFile, int i); + int Export(char* szSection, char* szFile, int i, FILE* fOut=NULL); + + int enabled; + int samples; + int sep; + float scaling; + float smoothing; + float x,y,r,g,b,a; + int bSpectrum; + int bUseDots; + int bDrawThick; + int bAdditive; + + char m_szInit[8192]; // note: only executed once -> don't need to save codehandle + char m_szPerFrame[8192]; + char m_szPerPoint[8192]; + int m_pf_codehandle; + int m_pp_codehandle; + + // for per-frame expression evaluation: + varType m_pf_vars[EVAL_MAX_VARS]; + double *var_pf_time, *var_pf_fps; + double *var_pf_frame; + double *var_pf_progress; + double *var_pf_q1, *var_pf_q2, *var_pf_q3, *var_pf_q4, *var_pf_q5, *var_pf_q6, *var_pf_q7, *var_pf_q8; + double *var_pf_t1, *var_pf_t2, *var_pf_t3, *var_pf_t4, *var_pf_t5, *var_pf_t6, *var_pf_t7, *var_pf_t8; + double *var_pf_bass, *var_pf_mid, *var_pf_treb, *var_pf_bass_att, *var_pf_mid_att, *var_pf_treb_att; + double *var_pf_r, *var_pf_g, *var_pf_b, *var_pf_a; + + // for per-point expression evaluation: + varType m_pp_vars[EVAL_MAX_VARS]; + double *var_pp_time, *var_pp_fps; + double *var_pp_frame; + double *var_pp_progress; + double *var_pp_q1, *var_pp_q2, *var_pp_q3, *var_pp_q4, *var_pp_q5, *var_pp_q6, *var_pp_q7, *var_pp_q8; + double *var_pp_t1, *var_pp_t2, *var_pp_t3, *var_pp_t4, *var_pp_t5, *var_pp_t6, *var_pp_t7, *var_pp_t8; + double *var_pp_bass, *var_pp_mid, *var_pp_treb, *var_pp_bass_att, *var_pp_mid_att, *var_pp_treb_att; + double *var_pp_sample, *var_pp_value1, *var_pp_value2; + double *var_pp_x, *var_pp_y, *var_pp_r, *var_pp_g, *var_pp_b, *var_pp_a; + + double t_values_after_init_code[8]; + +}; + +typedef struct +{ + int type; + int in_var; + int out_var; + float constant; + float min; + float max; + float in_scale; + float amp; // for sine functions + float freq; // for sine functions + float freq2; // for sine functions + float phase; // for sine functions + float phase2; // for sine functions +} td_modifier; + + +//#define MAX_EVALS 8 + + +class CState +{ +public: + CState(); + ~CState(); + + void Default(); + void Randomize(int nMode); + void StartBlendFrom(CState *s_from, float fAnimTime, float fTimespan); + void Import(char *szSectionName, char *szIniFile); + bool Export(char *szSectionName, char *szIniFile); + void RecompileExpressions(int flags=0xFFFFFFFF, int bReInit=1); + + char m_szDesc[512]; // this is just the filename, without a path or extension. + //char m_szSection[256]; + + float m_fRating; // 0..5 + // post-processing: + CBlendableFloat m_fGammaAdj; // +0 -> +1.0 (double), +2.0 (triple)... + CBlendableFloat m_fVideoEchoZoom; + CBlendableFloat m_fVideoEchoAlpha; + float m_fVideoEchoAlphaOld; + int m_nVideoEchoOrientation; + int m_nVideoEchoOrientationOld; + + // fps-dependant: + CBlendableFloat m_fDecay; // 1.0 = none, 0.95 = heavy decay + + // other: + int m_nWaveMode; + int m_nOldWaveMode; + bool m_bAdditiveWaves; + CBlendableFloat m_fWaveAlpha; + CBlendableFloat m_fWaveScale; + CBlendableFloat m_fWaveSmoothing; + bool m_bWaveDots; + bool m_bWaveThick; + CBlendableFloat m_fWaveParam; // -1..1; 0 is normal + bool m_bModWaveAlphaByVolume; + CBlendableFloat m_fModWaveAlphaStart; // when relative volume hits this level, alpha -> 0 + CBlendableFloat m_fModWaveAlphaEnd; // when relative volume hits this level, alpha -> 1 + float m_fWarpAnimSpeed; // 1.0 = normal, 2.0 = double, 0.5 = half, etc. + CBlendableFloat m_fWarpScale; + CBlendableFloat m_fZoomExponent; + CBlendableFloat m_fShader; // 0 = no color shader, 1 = full color shader + bool m_bMaximizeWaveColor; + bool m_bTexWrap; + bool m_bDarkenCenter; + bool m_bRedBlueStereo; + bool m_bBrighten; + bool m_bDarken; + bool m_bSolarize; + bool m_bInvert; + /* + bool m_bPlates; + int m_nPlates; + CBlendableFloat m_fPlateAlpha; // 0 = off, 0.1 = barely visible, 1.0 = solid + CBlendableFloat m_fPlateR; + CBlendableFloat m_fPlateG; + CBlendableFloat m_fPlateB; + CBlendableFloat m_fPlateWidth; // 1.0=normal, 2.0=double, etc. + CBlendableFloat m_fPlateLength; // 1.0=normal, 2.0=double, etc. + float m_fPlateSpeed; // 1.0=normal, 2.0=double, etc. + bool m_bPlatesAdditive; + */ + + // map controls: + CBlendableFloat m_fZoom; + CBlendableFloat m_fRot; + CBlendableFloat m_fRotCX; + CBlendableFloat m_fRotCY; + CBlendableFloat m_fXPush; + CBlendableFloat m_fYPush; + CBlendableFloat m_fWarpAmount; + CBlendableFloat m_fStretchX; + CBlendableFloat m_fStretchY; + CBlendableFloat m_fWaveR; + CBlendableFloat m_fWaveG; + CBlendableFloat m_fWaveB; + CBlendableFloat m_fWaveX; + CBlendableFloat m_fWaveY; + CBlendableFloat m_fOuterBorderSize; + CBlendableFloat m_fOuterBorderR; + CBlendableFloat m_fOuterBorderG; + CBlendableFloat m_fOuterBorderB; + CBlendableFloat m_fOuterBorderA; + CBlendableFloat m_fInnerBorderSize; + CBlendableFloat m_fInnerBorderR; + CBlendableFloat m_fInnerBorderG; + CBlendableFloat m_fInnerBorderB; + CBlendableFloat m_fInnerBorderA; + CBlendableFloat m_fMvX; + CBlendableFloat m_fMvY; + CBlendableFloat m_fMvDX; + CBlendableFloat m_fMvDY; + CBlendableFloat m_fMvL; + CBlendableFloat m_fMvR; + CBlendableFloat m_fMvG; + CBlendableFloat m_fMvB; + CBlendableFloat m_fMvA; + + CShape m_shape[MAX_CUSTOM_SHAPES]; + CWave m_wave[MAX_CUSTOM_WAVES]; + + //COscillator m_waveR; + //COscillator m_waveG; + //COscillator m_waveB; + //COscillator m_wavePosX; // 0 = centered + //COscillator m_wavePosY; // 0 = centered + + // for arbitrary function evaluation: + int m_pf_codehandle; + int m_pp_codehandle; + char m_szPerFrameInit[8192]; + char m_szPerFrameExpr[8192]; + //char m_szPerPixelInit[8192]; + char m_szPerPixelExpr[8192]; + void FreeVarsAndCode(); + void RegisterBuiltInVariables(int flags); + void StripLinefeedCharsAndComments(char *src, char *dest); + + bool m_bBlending; + float m_fBlendStartTime; + float m_fBlendDuration; + float m_fBlendProgress; // 0..1; updated every frame based on StartTime and Duration. + + // for once-per-frame expression evaluation: + varType m_pf_vars[EVAL_MAX_VARS]; + double *var_pf_zoom, *var_pf_zoomexp, *var_pf_rot, *var_pf_warp, *var_pf_cx, *var_pf_cy, *var_pf_dx, *var_pf_dy, *var_pf_sx, *var_pf_sy; + double *var_pf_time, *var_pf_fps; + double *var_pf_bass, *var_pf_mid, *var_pf_treb, *var_pf_bass_att, *var_pf_mid_att, *var_pf_treb_att; + double *var_pf_wave_a, *var_pf_wave_r, *var_pf_wave_g, *var_pf_wave_b, *var_pf_wave_x, *var_pf_wave_y, *var_pf_wave_mystery, *var_pf_wave_mode; + double *var_pf_decay; + double *var_pf_frame; + double *var_pf_q1, *var_pf_q2, *var_pf_q3, *var_pf_q4, *var_pf_q5, *var_pf_q6, *var_pf_q7, *var_pf_q8; + double *var_pf_progress; + double *var_pf_ob_size, *var_pf_ob_r, *var_pf_ob_g, *var_pf_ob_b, *var_pf_ob_a; + double *var_pf_ib_size, *var_pf_ib_r, *var_pf_ib_g, *var_pf_ib_b, *var_pf_ib_a; + double *var_pf_mv_x; + double *var_pf_mv_y; + double *var_pf_mv_dx; + double *var_pf_mv_dy; + double *var_pf_mv_l; + double *var_pf_mv_r; + double *var_pf_mv_g; + double *var_pf_mv_b; + double *var_pf_mv_a; + double *var_pf_monitor; + double *var_pf_echo_zoom, *var_pf_echo_alpha, *var_pf_echo_orient; + // new in v1.04: + double *var_pf_wave_usedots, *var_pf_wave_thick, *var_pf_wave_additive, *var_pf_wave_brighten; + double *var_pf_darken_center, *var_pf_gamma, *var_pf_wrap; + double *var_pf_invert, *var_pf_brighten, *var_pf_darken, *var_pf_solarize; + double *var_pf_meshx, *var_pf_meshy; + // NOTE: IF YOU ADD NEW VARIABLES, BE SURE TO INCREASE THE VALUE OF + // 'EVAL_MAX_VARS' IN EVAL.H. OTHERWISE, SOME PRESETS MIGHT BREAK. + + + // for per-vertex expression evaluation: + varType m_pv_vars[EVAL_MAX_VARS]; + double *var_pv_zoom, *var_pv_zoomexp, *var_pv_rot, *var_pv_warp, *var_pv_cx, *var_pv_cy, *var_pv_dx, *var_pv_dy, *var_pv_sx, *var_pv_sy; + double *var_pv_time, *var_pv_fps; + double *var_pv_bass, *var_pv_mid, *var_pv_treb, *var_pv_bass_att, *var_pv_mid_att, *var_pv_treb_att; + double *var_pv_x, *var_pv_y, *var_pv_rad, *var_pv_ang; + double *var_pv_frame; + double *var_pv_q1, *var_pv_q2, *var_pv_q3, *var_pv_q4, *var_pv_q5, *var_pv_q6, *var_pv_q7, *var_pv_q8; + double *var_pv_progress; + double *var_pv_meshx, *var_pv_meshy; + + double q_values_after_init_code[8]; + double monitor_after_init_code; +}; + + + + + + + + + + + + + + + + + + + + + + +#endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/support.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/support.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/support.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/support.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,509 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + +#include "support.h" +#include "utility.h" +#include "md_defines.h" +#include +#include +#include + +bool g_bDebugOutput = false; +bool g_bDumpFileCleared = false; + +//--------------------------------------------------- +void PrepareFor3DDrawing( + IDirect3DDevice9 *pDevice, + int viewport_width, + int viewport_height, + float fov_in_degrees, + float near_clip, + float far_clip, + D3DXVECTOR3* pvEye, + D3DXVECTOR3* pvLookat, + D3DXVECTOR3* pvUp + ) +{ +#if 0 + + // This function sets up DirectX up for 3D rendering. + // Only call it once per frame, as it is VERY slow. + // INPUTS: + // pDevice a pointer to the D3D device + // viewport_width the width of the client area of the window + // viewport_height the height of the client area of the window + // fov_in_degrees the field of view, in degrees + // near_clip the distance to the near clip plane; should be > 0! + // far_clip the distance to the far clip plane + // eye the eyepoint coordinates, in world space + // lookat the point toward which the eye is looking, in world space + // up a vector indicating which dir. is up; usually <0,1,0> + // + // What this function does NOT do: + // 1. set the current texture (SetTexture) + // 2. set up the texture stages for texturing (SetTextureStageState) + // 3. set the current vertex format (SetVertexShader) + // 4. set up the world matrix (SetTransform(D3DTS_WORLD, &my_world_matrix)) + + + // set up render state to some nice defaults: + { + // some defaults + d3dSetRenderState( D3DRS_ZENABLE, TRUE ); + d3dSetRenderState( D3DRS_ZWRITEENABLE, TRUE ); + d3dSetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL ); + d3dSetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); +// d3dSetRenderState( D3DRS_CLIPPING, TRUE ); + d3dSetRenderState( D3DRS_LIGHTING, FALSE ); + d3dSetRenderState( D3DRS_COLORVERTEX, TRUE ); + d3dSetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD ); + d3dSetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + d3dSetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); + + // turn fog off + d3dSetRenderState( D3DRS_FOGENABLE, FALSE ); + d3dSetRenderState( D3DRS_RANGEFOGENABLE, FALSE ); + + // turn on high-quality bilinear interpolations + pDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); + pDevice->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); + pDevice->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); + pDevice->SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR); + pDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); + pDevice->SetTextureStageState(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); + } + + // set up view & projection matrices (but not the world matrix!) + { + // if the window is not square, instead of distorting the scene, + // clip it so that the longer dimension of the window has the + // regular FOV, and the shorter dimension has a reduced FOV. + float fov_x = fov_in_degrees * 3.1415927f/180.0f; + float fov_y = fov_in_degrees * 3.1415927f/180.0f; + float aspect = (float)viewport_height / (float)viewport_width; + if (aspect < 1) + fov_y *= aspect; + else + fov_x /= aspect; + + if (near_clip < 0.1f) + near_clip = 0.1f; + if (far_clip < near_clip + 1.0f) + far_clip = near_clip + 1.0f; + + D3DXMATRIX proj; + MakeProjectionMatrix(&proj, near_clip, far_clip, fov_x, fov_y); + pDevice->SetTransform(D3DTS_PROJECTION, &proj); + + D3DXMATRIX view; + D3DXMatrixLookAtLH(&view, pvEye, pvLookat, pvUp); + pDevice->SetTransform(D3DTS_VIEW, &view); + + // Optimization note: "You can minimize the number of required calculations + // by concatenating your world and view matrices into a world-view matrix + // that you set as the world matrix, and then setting the view matrix + // to the identity." + //D3DXMatrixMultiply(&world, &world, &view); + //D3DXMatrixIdentity(&view); + } +#endif +} + +void PrepareFor2DDrawing(IDirect3DDevice9 *pDevice) +{ + // New 2D drawing area will have x,y coords in the range <-1,-1> .. <1,1> + // +--------+ Y=-1 + // | | + // | screen | Z=0: front of scene + // | | Z=1: back of scene + // +--------+ Y=1 + // X=-1 X=1 + // NOTE: After calling this, be sure to then call (at least): + // 1. SetVertexShader() + // 2. SetTexture(), if you need it + // before rendering primitives! + // Also, be sure your sprites have a z coordinate of 0. + pDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); + pDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE ); + pDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL ); + pDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_FLAT ); + pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + pDevice->SetRenderState( D3DRS_FOGENABLE, FALSE ); + pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); +// d3dSetRenderState( D3DRS_CLIPPING, TRUE ); + pDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); + pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); + pDevice->SetRenderState( D3DRS_LOCALVIEWER, FALSE ); + + pDevice->SetTexture(0, NULL); + pDevice->SetTexture(1, NULL); +// SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT);//D3DTEXF_LINEAR); +// SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_POINT);//D3DTEXF_LINEAR); + pDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + pDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + pDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); + pDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); + pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT ); + pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + + pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); + pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); + + // set up for 2D drawing: + { + D3DXMATRIX Ortho2D; + D3DXMATRIX Identity; + + D3DXMatrixOrthoLH(&Ortho2D, 2.0f, -2.0f, 0.0f, 1.0f); + D3DXMatrixIdentity(&Identity); + + pDevice->SetTransform(D3DTS_PROJECTION, &Ortho2D); + pDevice->SetTransform(D3DTS_WORLD, &Identity); + pDevice->SetTransform(D3DTS_VIEW, &Identity); + } +} + +//--------------------------------------------------- + +void MakeWorldMatrix( D3DXMATRIX* pOut, + float xpos, float ypos, float zpos, + float sx, float sy, float sz, + float pitch, float yaw, float roll) +{ +#if 0 + /* + * The m_xPos, m_yPos, m_zPos variables contain the model's + * location in world coordinates. + * The m_fPitch, m_fYaw, and m_fRoll variables are floats that + * contain the model's orientation in terms of pitch, yaw, and roll + * angles, in radians. + */ + + D3DXMATRIX MatTemp; + D3DXMatrixIdentity(pOut); + + // 1. first, rotation + if (pitch || yaw || roll) + { + D3DXMATRIX MatRot; + D3DXMatrixIdentity(&MatRot); + + D3DXMatrixRotationX(&MatTemp, pitch); // Pitch + D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp); + D3DXMatrixRotationY(&MatTemp, yaw); // Yaw + D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp); + D3DXMatrixRotationZ(&MatTemp, roll); // Roll + D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp); + + D3DXMatrixMultiply(pOut, pOut, &MatRot); + } + + // 2. then, scaling + D3DXMatrixScaling(&MatTemp, sx, sy, sz); + D3DXMatrixMultiply(pOut, pOut, &MatTemp); + + // 3. last, translation to final world pos. + D3DXMatrixTranslation(&MatTemp, xpos, ypos, zpos); + D3DXMatrixMultiply(pOut, pOut, &MatTemp); +#endif +} + +void MakeProjectionMatrix( D3DXMATRIX* pOut, + const float near_plane, // Distance to near clipping plane + const float far_plane, // Distance to far clipping plane + const float fov_horiz, // Horizontal field of view angle, in radians + const float fov_vert) // Vertical field of view angle, in radians +{ + float w = (float)1/tanf(fov_horiz*0.5f); // 1/tan(x) == cot(x) + float h = (float)1/tanf(fov_vert*0.5f); // 1/tan(x) == cot(x) + float Q = far_plane/(far_plane - near_plane); + + ZeroMemory(pOut, sizeof(D3DXMATRIX)); + pOut->_11 = w; + pOut->_22 = h; + pOut->_33 = Q; + pOut->_43 = -Q*near_plane; + pOut->_34 = 1; +} + +//--------------------------------------------------- + +void GetWinampSongTitle(HWND hWndWinamp, char *szSongTitle, int nSize) +{ + szSongTitle[0] = 0; +#if 0 + if (::GetWindowText(hWndWinamp, szSongTitle, nSize)) + { + // remove ' - Winamp' if found at end + if (strlen(szSongTitle) > 9) + { + int check_pos = strlen(szSongTitle) - 9; + if (strcmp(" - Winamp", (char *)(szSongTitle + check_pos)) == 0) + szSongTitle[check_pos] = 0; + } + + // remove ' - Winamp [Paused]' if found at end + if (strlen(szSongTitle) > 18) + { + int check_pos = strlen(szSongTitle) - 18; + if (strcmp(" - Winamp [Paused]", (char *)(szSongTitle + check_pos)) == 0) + szSongTitle[check_pos] = 0; + } + + // remove song # and period from beginning + char *p = szSongTitle; + while (*p >= '0' && *p <= '9') p++; + if (*p == '.' && *(p+1) == ' ') + { + p += 2; + int pos = 0; + while (*p != 0) + { + szSongTitle[pos++] = *p; + p++; + } + szSongTitle[pos++] = 0; + } + + // fix &'s for display + // note: this is not necessary if you use the DT_NOPREFIX flag with text drawing functions! + /* + { + int pos = 0; + int len = strlen(szSongTitle); + while (szSongTitle[pos]) + { + if (szSongTitle[pos] == '&') + { + for (int x=len; x>=pos; x--) + szSongTitle[x+1] = szSongTitle[x]; + len++; + pos++; + } + pos++; + } + }*/ + } +#endif +} + +void GetWinampSongPosAsText(HWND hWndWinamp, char *szSongPos) +{ + // note: size(szSongPos[]) must be at least 64. + + szSongPos[0] = 0; + +#if 0 + int nSongPosMS = SendMessage(hWndWinamp,WM_USER,0,105); + if (nSongPosMS > 0) + { + float time_s = nSongPosMS*0.001f; + int minutes = (int)(time_s/60); + time_s -= minutes*60; + int seconds = (int)time_s; + time_s -= seconds; + int dsec = (int)(time_s*100); + sprintf(szSongPos, "%d:%02d.%02d", minutes, seconds, dsec); + } + +#endif +} + +void GetWinampSongLenAsText(HWND hWndWinamp, char *szSongLen) +{ + // note: size(szSongLen[]) must be at least 64. + szSongLen[0] = 0; +#if 0 + int nSongLenMS = SendMessage(hWndWinamp,WM_USER,1,105)*1000; + if (nSongLenMS > 0) + { + int len_s = nSongLenMS/1000; + int minutes = len_s/60; + int seconds = len_s - minutes*60; + sprintf(szSongLen, "%d:%02d", minutes, seconds); + } +#endif +} + +float GetWinampSongPos(HWND hWndWinamp) +{ + // returns answer in seconds +// return (float)SendMessage(hWndWinamp,WM_USER,0,105)*0.001f; + return 0; +} + +float GetWinampSongLen(HWND hWndWinamp) +{ + // returns answer in seconds +// return (float)SendMessage(hWndWinamp,WM_USER,1,105); + return 0; +} + +/* +void g_dumpmsg(char *s) +{ + if (g_bDebugOutput) + { + if (!g_bDumpFileCleared) + { + g_bDumpFileCleared = true; + FILE *infile = fopen(DEBUGFILE, "w"); + if (infile) + { + fprintf(infile, DEBUGFILEHEADER); + fclose(infile); + } + } + + FILE *infile2; + infile2 = fopen(DEBUGFILE, "a"); + if (infile2) + { + fprintf(infile2, "%s\n", s); + OutputDebugString(s); + OutputDebugString("\n"); + fclose(infile2); + } + } +} + +void ClipWindowToScreen(RECT *rect) +{ + int screen_width = GetSystemMetrics(SM_CXSCREEN); + int screen_height = GetSystemMetrics(SM_CYSCREEN); + + // make sure it's not too small + if (rect->right - rect->left < 64) + rect->right = rect->left + 64; + if (rect->bottom - rect->top < 64) + rect->bottom = rect->top + 64; + + // make sure it's not too big + if (rect->right - rect->left > screen_width) + rect->right = rect->left + screen_width; + if (rect->bottom - rect->top > screen_height) + rect->bottom = rect->top + screen_height; + + // clip vs. screen edges + if (rect->top < 0) + { + rect->bottom -= rect->top; + rect->top = 0; + } + + if (rect->top > screen_height - 64) + { + rect->bottom += (screen_height - 64) - rect->top; + rect->top = screen_height - 64; + } + + if (rect->right < 64) + { + rect->left -= rect->right - 64; + rect->right = 64; + } + + if (rect->left > screen_width - 64) + { + rect->right += (screen_width - 64) - rect->left; + rect->left = screen_width - 64; + } +} +*/ + +const unsigned char LC2UC[256] = { + 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, + 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,255, + 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, + 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64, + 97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, + 113,114,115,116,117,118,119,120,121,122,91,92,93,94,95,96, + 97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, + 113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128, + 129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144, + 145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160, + 161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, + 177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192, + 193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208, + 209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224, + 225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240, + 241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, +}; + +int mystrcmpi(char *s1, char *s2) +{ + // returns 1 if s1 comes before s2 + // returns 0 if equal + // returns -1 if s1 comes after s2 + // treats all characters/symbols by their ASCII values, + // except that it DOES ignore case. + + int i=0; + + while (LC2UC[s1[i]] == LC2UC[s2[i]] && s1[i] != 0) + i++; + + //FIX THIS! + + if (s1[i]==0 && s2[i]==0) + return 0; + else if (s1[i]==0) + return -1; + else if (s2[i]==0) + return 1; + else + return (LC2UC[s1[i]] < LC2UC[s2[i]]) ? -1 : 1; +} + +void SetScrollLock(bool bNewState) +{ +#if 0 + if (bNewState != (bool)(GetKeyState(VK_SCROLL) & 1)) + { + // Simulate a key press + keybd_event( VK_SCROLL, + 0x45, + KEYEVENTF_EXTENDEDKEY | 0, + 0 ); + + // Simulate a key release + keybd_event( VK_SCROLL, + 0x45, + KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, + 0); + } +#endif +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/support.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/support.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/support.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/support.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,111 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef __NULLSOFT_DX8_EXAMPLE_PLUGIN_SUPPORT_H__ +#define __NULLSOFT_DX8_EXAMPLE_PLUGIN_SUPPORT_H__ 1 +#include +//#include +#include + +//extern "C" void SetTextureStageState( int x, DWORD dwY, DWORD dwZ); +//extern "C" void d3dSetSamplerState( int x, DWORD dwY, DWORD dwZ); +//extern "C" void d3dSetRenderState(DWORD dwY, DWORD dwZ); + +void MakeWorldMatrix( D3DXMATRIX* pOut, + float xpos, float ypos, float zpos, + float sx, float sy, float sz, + float pitch, float yaw, float roll); +void MakeProjectionMatrix( D3DXMATRIX* pOut, + const float near_plane, // Distance to near clipping plane + const float far_plane, // Distance to far clipping plane + const float fov_horiz, // Horizontal field of view angle, in radians + const float fov_vert); // Vertical field of view angle, in radians +void PrepareFor3DDrawing( + IDirect3DDevice9 *pDevice, + int viewport_width, + int viewport_height, + float fov_in_degrees, + float near_clip, + float far_clip, + D3DXVECTOR3* pvEye, + D3DXVECTOR3* pvLookat, + D3DXVECTOR3* pvUp + ); +void PrepareFor2DDrawing(IDirect3DDevice9 *pDevice); + +// Define vertex formats you'll be using here: +typedef struct _MYVERTEX +{ + float x, y; // screen position + float z; // Z-buffer depth + DWORD Diffuse; // diffuse color + float tu1, tv1; // texture coordinates for texture #0 + float tu2, tv2; // texture coordinates for texture #1 + // note: even though tu2/tv2 aren't used when multitexturing is off, + // they are still useful for padding the structure to 32 bytes, + // which is good for random (indexed) access. +} MYVERTEX, *LPMYVERTEX; + +typedef struct _WFVERTEX +{ + float x, y, z; + DWORD Diffuse; // diffuse color. also acts as filler; aligns struct to 16 bytes (good for random access/indexed prims) +} WFVERTEX, *LPWFVERTEX; + +typedef struct _SPRITEVERTEX +{ + float x, y; // screen position + float z; // Z-buffer depth + DWORD Diffuse; // diffuse color. also acts as filler; aligns struct to 16 bytes (good for random access/indexed prims) + float tu, tv; // texture coordinates for texture #0 +} SPRITEVERTEX, *LPSPRITEVERTEX; + +// Also prepare vertex format descriptors for each +// of the 3 kinds of vertices we'll be using: +#define MYVERTEX_FORMAT (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX2) +#define WFVERTEX_FORMAT (D3DFVF_XYZ | D3DFVF_DIFFUSE ) +#define SPRITEVERTEX_FORMAT (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1) + +#define IsAlphabetChar(x) ((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z')) +#define IsAlphanumericChar(x) ((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z') || (x >= '0' && x <= '9') || x == '.') + +void GetWinampSongTitle(HWND hWndWinamp, char *szSongTitle, int nSize); +void GetWinampSongPosAsText(HWND hWndWinamp, char *szSongPos); +void GetWinampSongLenAsText(HWND hWndWinamp, char *szSongLen); +float GetWinampSongPos(HWND hWndWinamp); // returns answer in seconds +float GetWinampSongLen(HWND hWndWinamp); // returns answer in seconds + +//void g_dumpmsg(char *s); +//void ClipWindowToScreen(RECT *rect); +int mystrcmpi(char *s1, char *s2); +void SetScrollLock(bool bNewState); + + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/utility.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/utility.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/utility.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/utility.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1762 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "utility.h" +#include +#include +#include +//#include +#include + +float PowCosineInterp(float x, float pow) +{ + // input (x) & output should be in range 0..1. + // pow > 0: tends to push things toward 0 and 1 + // pow < 0: tends to push things toward 0.5. + + if (x<0) + return 0; + if (x>1) + return 1; + + int bneg = (pow < 0) ? 1 : 0; + if (bneg) + pow = -pow; + + if (pow>1000) pow=1000; + + int its = (int)pow; + for (int i=0; i0)&&(size>4)) + { + fread(&chr,sizeof(char),1,Fh); + fsize--; + + if((chr==0x0a)||(chr==0x0d)) + { + if(strcount) + { + while (ReturnBuffer[-1]==32) + { + ReturnBuffer--; + size++; + } + + ReturnBuffer[0] = 0; + ReturnBuffer++; + size--; + } + break; + } + else + { + if (chr==0x09) chr=32; + ReturnBuffer[0] = chr; + ReturnBuffer++; + size--; + strcount++; + } + } + } + } + + while (ReturnBuffer[-1]==32) + { + ReturnBuffer--; + size++; + } + + ReturnBuffer[0] = 0; + ReturnBuffer[1] = 0; +} + +int InternalGetPrivateProfileSection(char *Group,char *ReturnBuffer,int size,char *filename) +{ + FILE* Fh; + int fsize; + char chr; + int count; + int strcount; + char tmpbuf[256]; + + count = 0; + + Fh = fopen(filename,"rb"); + if(Fh==0) return(0); + + fseek(Fh, 0, SEEK_END); + fsize = ftell(Fh); + fseek(Fh,0, SEEK_SET); + + while((fsize>0)&&(size>4)) + { + fread(&chr,sizeof(char),1,Fh); + fsize--; + + if(chr=='[') + { + strcount = 0; + + while((fsize>0)&&(size>4)) + { + fread(&chr,sizeof(char),1,Fh); + fsize--; + + if(chr==']') + { + if(strcount) + { + tmpbuf[strcount] = 0; + + // string found, check against 'group' + + if(stricmp(Group,tmpbuf)==0) + { + // got it! + + InternalGetPrivateProfileSectionData(Fh,fsize,ReturnBuffer,size); + fclose(Fh); + return(0); + } + } + break; + } + else + { + tmpbuf[strcount] = chr; + strcount++; + } + } + } + } + + ReturnBuffer[0] = 0; + ReturnBuffer[1] = 0; + + fclose(Fh); + return(0); +} + +bool validIniFile = false; +char* iniFile = NULL; +char currIniFilename[MAX_PATH]; +char currIniSection[256]; +int iniFileSize = 0; + + +int InternalGetPrivateProfileString(char *szSectionName, char *szKeyName, char *szDefault, char *buffer, int size, char *szIniFile) +{ + bool newFile = false; + + if (stricmp(currIniFilename, szIniFile)) + { + // Load new ini file + newFile = true; + + FILE* handle; + + handle = fopen(szIniFile, "rb"); + if (handle == 0) + { + validIniFile = false; + GetFromSectionCache(szKeyName, szDefault, buffer, size); + return (strlen(buffer)); + } + + fseek(Fh, 0, SEEK_END); + iniFileSize = ftell(Fh); + fseek(Fh,0, SEEK_SET); + + iniFile = new char[iniFileSize]; + fread(iniFile, iniFileSize, 1, handle); + fclose(iniFile); + } + + if (newFile || stricmp(currIniSection, szSectionName)) + { + + } + + + +/* + + if (stricmp(INIfsp, szIniFile)!=0 || stricmp(INIsection, szSectionName)!=0) + { + InternalGetPrivateProfileSection(szSectionName, INITempBuffer, INITEMPBUFFERSIZE, szIniFile); + strcpy(INIfsp, szIniFile); + strcpy(INIsection, szSectionName); + } + + GetFromINIArray(INITempBuffer, szKeyName, szDefault, buffer, size); + return(strlen(buffer)); +*/ +} + +#endif + +#define SECTION_CACHE_SIZE (1024 * 40) +bool validIni = false; +char currIniFilename[MAX_PATH]; +char currIniSection[256]; +char sectionCache[SECTION_CACHE_SIZE]; + + +void GetFromCache(char *cache, char *key, char *szDefault, char *buffer, int buffersize) +{ + char *p; + + memcpy(buffer, szDefault, buffersize); // Copy default + + if (!validIni) + return; + + int keyLength = strlen(key); + + while (cache[0] != 0 || cache[1] != 0) + { + if (strnicmp(key, cache, keyLength)==0) + { + if (cache[keyLength] == '=') + { + p = strchr(cache, '='); + if (p) + { + p++; + while(*p==32) + p++; + + memcpy(buffer, p, buffersize); + return; + } + } + } + cache += strlen(cache)+1; + } + +} + +void InternalGetPrivateProfileSection(char *szSectionName, char *buffer, int size, char *szIniFile) +{ + FILE* handle; + int fileSize; + char tempSectionName[256]; + int strIndex; + char* fileData; + char* filePtr; + char c; + + validIni = false; + + handle = fopen(szIniFile, "rb"); + + if (handle == 0) + { + return; + } + + fseek(handle, 0, SEEK_END); + fileSize = ftell(handle); + fseek(handle,0, SEEK_SET); + fileData = new char[fileSize]; + fread(fileData, fileSize, 1, handle); + fclose(handle); + + filePtr = fileData; + + while (fileSize > 0) + { + c = *filePtr++; + fileSize--; + + if (c == '[') + { + // Start of section name + strIndex = 0; + + while (fileSize > 0) + { + c = *filePtr++; + fileSize--; + + if (c == ']') + { + // End of section name, check if its the one we want + tempSectionName[strIndex] = 0; + + if (stricmp(szSectionName, tempSectionName) == 0) + { + while (fileSize > 0) + { + c = *filePtr++; + fileSize--; + + if ((c > ' ') && (c <='z')) + { + if (c == '[') + break; // end of section + + strIndex = 0; + + buffer[0] = c; + buffer++; + size--; + strIndex++; + + if (size == 0) + { + OutputDebugString("Section cache size too small.\n"); + delete[] fileData; + return; + } + + while (fileSize > 0) + { + c = *filePtr++; + fileSize--; + + if ((c == 0x0a) || (c == 0x0d)) + { + if (strIndex) + { + while (buffer[-1] == 32) + { + buffer--; + size++; + } + + buffer[0] = 0; + buffer++; + size--; + } + break; + } + else + { +// if (c == 0x09) +// c = 32; + if (c != 0x09 && c != 32) + { + buffer[0] = c; + buffer++; + size--; + strIndex++; + + if (size == 0) + { + OutputDebugString("Section cache size too small.\n"); + delete[] fileData; + return; + } + } + } + } + } + } + + while (buffer[-1] == 32) + { + buffer--; + size++; + } + + buffer[0] = 0; + buffer[1] = 0; + + delete[] fileData; + validIni = true; + return; + } + break; + } + else + { + tempSectionName[strIndex] = c; + strIndex++; + } + } + } + } + + delete[] fileData; + +} + +int InternalGetPrivateProfileString(char *szSectionName, char *szKeyName, char *szDefault, char *buffer, int size, char *szIniFile) +{ + if (stricmp(currIniFilename, szIniFile) || stricmp(currIniSection, szSectionName)) + { + InternalGetPrivateProfileSection(szSectionName, sectionCache, SECTION_CACHE_SIZE, szIniFile); + + strcpy(currIniFilename, szIniFile); + strcpy(currIniSection, szSectionName); + } + + GetFromCache(sectionCache, szKeyName, szDefault, buffer, size); + + return (strlen(buffer)); +} + +int InternalGetPrivateProfileInt(char *szSectionName, char *szKeyName, int iDefault, char *szIniFile) +{ + char string[64]; + char szDefault[64]; + int ret = iDefault; + + sprintf(szDefault, "%d", iDefault); + if (InternalGetPrivateProfileString(szSectionName, szKeyName, szDefault, string, 64, szIniFile) > 0) + { + sscanf(string, "%d", &ret); + } + + return ret; +} + +float InternalGetPrivateProfileFloat(char *szSectionName, char *szKeyName, float fDefault, char *szIniFile) +{ + char string[64]; + char szDefault[64]; + float ret = fDefault; + + sprintf(szDefault, "%f", fDefault); + + if (InternalGetPrivateProfileString(szSectionName, szKeyName, szDefault, string, 64, szIniFile) > 0) + { + sscanf(string, "%f", &ret); + } + + return ret; +} + +bool WritePrivateProfileFloat(float f, char *szKeyName, char *szIniFile, char *szSectionName) +{ +// char szValue[32]; +// sprintf(szValue, "%f", f); +// return (WritePrivateProfileString(szSectionName, szKeyName, szValue, szIniFile) != 0); + return true; +} + +bool WritePrivateProfileInt(int d, char *szKeyName, char *szIniFile, char *szSectionName) +{ +// char szValue[32]; +// sprintf(szValue, "%d", d); +// return (WritePrivateProfileString(szSectionName, szKeyName, szValue, szIniFile) != 0); + return true; + +} + +void SetScrollLock(int bNewState) +{ +/* + if (bNewState != (GetKeyState(VK_SCROLL) & 1)) + { + // Simulate a key press + keybd_event( VK_SCROLL, + 0x45, + KEYEVENTF_EXTENDEDKEY | 0, + 0 ); + + // Simulate a key release + keybd_event( VK_SCROLL, + 0x45, + KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, + 0); + } +*/ +} + +void RemoveExtension(char *str) +{ + char *p = strrchr(str, '.'); + if (p) *p = 0; +} + +void RemoveSingleAmpersands(char *str) +{ + int len = strlen(str); + int deleted = 0; + + for (int i=0; i 0) + str[i-deleted] = str[i]; + } + str[len-deleted] = 0; +} + +void TextToGuid(char *str, GUID *pGUID) +{ + if (!str) return; + if (!pGUID) return; + + DWORD d[11]; + + sscanf(str, "%u %u %u %u %u %u %u %u %u %u %u", + &d[0], &d[1], &d[2], &d[3], &d[4], &d[5], &d[6], &d[7], &d[8], &d[9], &d[10]); + + pGUID->Data1 = (DWORD)d[0]; + pGUID->Data2 = (WORD)d[1]; + pGUID->Data3 = (WORD)d[2]; + pGUID->Data4[0] = (BYTE)d[3]; + pGUID->Data4[1] = (BYTE)d[4]; + pGUID->Data4[2] = (BYTE)d[5]; + pGUID->Data4[3] = (BYTE)d[6]; + pGUID->Data4[4] = (BYTE)d[7]; + pGUID->Data4[5] = (BYTE)d[8]; + pGUID->Data4[6] = (BYTE)d[9]; + pGUID->Data4[7] = (BYTE)d[10]; +} + +void GuidToText(GUID *pGUID, char *str, int nStrLen) +{ + // note: nStrLen should be set to sizeof(str). + if (!str) return; + if (!nStrLen) return; + str[0] = 0; + if (!pGUID) return; + + DWORD d[11]; + d[0] = (DWORD)pGUID->Data1; + d[1] = (DWORD)pGUID->Data2; + d[2] = (DWORD)pGUID->Data3; + d[3] = (DWORD)pGUID->Data4[0]; + d[4] = (DWORD)pGUID->Data4[1]; + d[5] = (DWORD)pGUID->Data4[2]; + d[6] = (DWORD)pGUID->Data4[3]; + d[7] = (DWORD)pGUID->Data4[4]; + d[8] = (DWORD)pGUID->Data4[5]; + d[9] = (DWORD)pGUID->Data4[6]; + d[10] = (DWORD)pGUID->Data4[7]; + + sprintf(str, "%u %u %u %u %u %u %u %u %u %u %u", + d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10]); +} + +/* +int GetPentiumTimeRaw(unsigned __int64 *cpu_timestamp) +{ + // returns 0 on failure, 1 on success + // warning: watch out for wraparound! + + // note: it's probably better to use QueryPerformanceFrequency + // and QueryPerformanceCounter()! + + // get high-precision time: + __try + { + unsigned __int64 *dest = (unsigned __int64 *)cpu_timestamp; + __asm + { + _emit 0xf // these two bytes form the 'rdtsc' asm instruction, + _emit 0x31 // available on Pentium I and later. + mov esi, dest + mov [esi ], eax // lower 32 bits of tsc + mov [esi+4], edx // upper 32 bits of tsc + } + return 1; + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + return 0; + } + + return 0; +} + +double GetPentiumTimeAsDouble(unsigned __int64 frequency) +{ + // returns < 0 on failure; otherwise, returns current cpu time, in seconds. + // warning: watch out for wraparound! + + // note: it's probably better to use QueryPerformanceFrequency + // and QueryPerformanceCounter()! + + if (frequency==0) + return -1.0; + + // get high-precision time: + __try + { + unsigned __int64 high_perf_time; + unsigned __int64 *dest = &high_perf_time; + __asm + { + _emit 0xf // these two bytes form the 'rdtsc' asm instruction, + _emit 0x31 // available on Pentium I and later. + mov esi, dest + mov [esi ], eax // lower 32 bits of tsc + mov [esi+4], edx // upper 32 bits of tsc + } + __int64 time_s = (__int64)(high_perf_time / frequency); // unsigned->sign conversion should be safe here + __int64 time_fract = (__int64)(high_perf_time % frequency); // unsigned->sign conversion should be safe here + // note: here, we wrap the timer more frequently (once per week) + // than it otherwise would (VERY RARELY - once every 585 years on + // a 1 GHz), to alleviate floating-point precision errors that start + // to occur when you get to very high counter values. + double ret = (time_s % (60*60*24*7)) + (double)time_fract/(double)((__int64)frequency); + return ret; + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + return -1.0; + } + + return -1.0; +} +*/ + +#ifdef _DEBUG + void OutputDebugMessage(char *szStartText, HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) + { + // note: this function does NOT log WM_MOUSEMOVE, WM_NCHITTEST, or WM_SETCURSOR + // messages, since they are so frequent. + // note: these identifiers were pulled from winuser.h + + //if (msg == WM_MOUSEMOVE || msg == WM_NCHITTEST || msg == WM_SETCURSOR) + // return; + + #ifdef _DEBUG + char buf[64]; + int matched = 1; + + sprintf(buf, "WM_"); + + switch(msg) + { + case 0x0001: strcat(buf, "CREATE"); break; + case 0x0002: strcat(buf, "DESTROY"); break; + case 0x0003: strcat(buf, "MOVE"); break; + case 0x0005: strcat(buf, "SIZE"); break; + case 0x0006: strcat(buf, "ACTIVATE"); break; + case 0x0007: strcat(buf, "SETFOCUS"); break; + case 0x0008: strcat(buf, "KILLFOCUS"); break; + case 0x000A: strcat(buf, "ENABLE"); break; + case 0x000B: strcat(buf, "SETREDRAW"); break; + case 0x000C: strcat(buf, "SETTEXT"); break; + case 0x000D: strcat(buf, "GETTEXT"); break; + case 0x000E: strcat(buf, "GETTEXTLENGTH"); break; + case 0x000F: strcat(buf, "PAINT"); break; + case 0x0010: strcat(buf, "CLOSE"); break; + case 0x0011: strcat(buf, "QUERYENDSESSION"); break; + case 0x0012: strcat(buf, "QUIT"); break; + case 0x0013: strcat(buf, "QUERYOPEN"); break; + case 0x0014: strcat(buf, "ERASEBKGND"); break; + case 0x0015: strcat(buf, "SYSCOLORCHANGE"); break; + case 0x0016: strcat(buf, "ENDSESSION"); break; + case 0x0018: strcat(buf, "SHOWWINDOW"); break; + case 0x001A: strcat(buf, "WININICHANGE"); break; + case 0x001B: strcat(buf, "DEVMODECHANGE"); break; + case 0x001C: strcat(buf, "ACTIVATEAPP"); break; + case 0x001D: strcat(buf, "FONTCHANGE"); break; + case 0x001E: strcat(buf, "TIMECHANGE"); break; + case 0x001F: strcat(buf, "CANCELMODE"); break; + case 0x0020: strcat(buf, "SETCURSOR"); break; + case 0x0021: strcat(buf, "MOUSEACTIVATE"); break; + case 0x0022: strcat(buf, "CHILDACTIVATE"); break; + case 0x0023: strcat(buf, "QUEUESYNC"); break; + case 0x0024: strcat(buf, "GETMINMAXINFO"); break; + case 0x0026: strcat(buf, "PAINTICON"); break; + case 0x0027: strcat(buf, "ICONERASEBKGND"); break; + case 0x0028: strcat(buf, "NEXTDLGCTL"); break; + case 0x002A: strcat(buf, "SPOOLERSTATUS"); break; + case 0x002B: strcat(buf, "DRAWITEM"); break; + case 0x002C: strcat(buf, "MEASUREITEM"); break; + case 0x002D: strcat(buf, "DELETEITEM"); break; + case 0x002E: strcat(buf, "VKEYTOITEM"); break; + case 0x002F: strcat(buf, "CHARTOITEM"); break; + case 0x0030: strcat(buf, "SETFONT"); break; + case 0x0031: strcat(buf, "GETFONT"); break; + case 0x0032: strcat(buf, "SETHOTKEY"); break; + case 0x0033: strcat(buf, "GETHOTKEY"); break; + case 0x0037: strcat(buf, "QUERYDRAGICON"); break; + case 0x0039: strcat(buf, "COMPAREITEM"); break; + case 0x0041: strcat(buf, "COMPACTING"); break; + case 0x0044: strcat(buf, "COMMNOTIFY"); break; + case 0x0046: strcat(buf, "WINDOWPOSCHANGING"); break; + case 0x0047: strcat(buf, "WINDOWPOSCHANGED"); break; + case 0x0048: strcat(buf, "POWER"); break; + case 0x004A: strcat(buf, "COPYDATA"); break; + case 0x004B: strcat(buf, "CANCELJOURNAL"); break; + + #if(WINVER >= 0x0400) + case 0x004E: strcat(buf, "NOTIFY"); break; + case 0x0050: strcat(buf, "INPUTLANGCHANGEREQUEST"); break; + case 0x0051: strcat(buf, "INPUTLANGCHANGE"); break; + case 0x0052: strcat(buf, "TCARD"); break; + case 0x0053: strcat(buf, "HELP"); break; + case 0x0054: strcat(buf, "USERCHANGED"); break; + case 0x0055: strcat(buf, "NOTIFYFORMAT"); break; + case 0x007B: strcat(buf, "CONTEXTMENU"); break; + case 0x007C: strcat(buf, "STYLECHANGING"); break; + case 0x007D: strcat(buf, "STYLECHANGED"); break; + case 0x007E: strcat(buf, "DISPLAYCHANGE"); break; + case 0x007F: strcat(buf, "GETICON"); break; + case 0x0080: strcat(buf, "SETICON"); break; + #endif + + case 0x0081: strcat(buf, "NCCREATE"); break; + case 0x0082: strcat(buf, "NCDESTROY"); break; + case 0x0083: strcat(buf, "NCCALCSIZE"); break; + case 0x0084: strcat(buf, "NCHITTEST"); break; + case 0x0085: strcat(buf, "NCPAINT"); break; + case 0x0086: strcat(buf, "NCACTIVATE"); break; + case 0x0087: strcat(buf, "GETDLGCODE"); break; + case 0x0088: strcat(buf, "SYNCPAINT"); break; + case 0x00A0: strcat(buf, "NCMOUSEMOVE"); break; + case 0x00A1: strcat(buf, "NCLBUTTONDOWN"); break; + case 0x00A2: strcat(buf, "NCLBUTTONUP"); break; + case 0x00A3: strcat(buf, "NCLBUTTONDBLCLK"); break; + case 0x00A4: strcat(buf, "NCRBUTTONDOWN"); break; + case 0x00A5: strcat(buf, "NCRBUTTONUP"); break; + case 0x00A6: strcat(buf, "NCRBUTTONDBLCLK"); break; + case 0x00A7: strcat(buf, "NCMBUTTONDOWN"); break; + case 0x00A8: strcat(buf, "NCMBUTTONUP"); break; + case 0x00A9: strcat(buf, "NCMBUTTONDBLCLK"); break; + case 0x0100: strcat(buf, "KEYDOWN"); break; + case 0x0101: strcat(buf, "KEYUP"); break; + case 0x0102: strcat(buf, "CHAR"); break; + case 0x0103: strcat(buf, "DEADCHAR"); break; + case 0x0104: strcat(buf, "SYSKEYDOWN"); break; + case 0x0105: strcat(buf, "SYSKEYUP"); break; + case 0x0106: strcat(buf, "SYSCHAR"); break; + case 0x0107: strcat(buf, "SYSDEADCHAR"); break; + case 0x0108: strcat(buf, "KEYLAST"); break; + + #if(WINVER >= 0x0400) + case 0x010D: strcat(buf, "IME_STARTCOMPOSITION"); break; + case 0x010E: strcat(buf, "IME_ENDCOMPOSITION"); break; + case 0x010F: strcat(buf, "IME_COMPOSITION"); break; + //case 0x010F: strcat(buf, "IME_KEYLAST"); break; + #endif + + case 0x0110: strcat(buf, "INITDIALOG"); break; + case 0x0111: strcat(buf, "COMMAND"); break; + case 0x0112: strcat(buf, "SYSCOMMAND"); break; + case 0x0113: strcat(buf, "TIMER"); break; + case 0x0114: strcat(buf, "HSCROLL"); break; + case 0x0115: strcat(buf, "VSCROLL"); break; + case 0x0116: strcat(buf, "INITMENU"); break; + case 0x0117: strcat(buf, "INITMENUPOPUP"); break; + case 0x011F: strcat(buf, "MENUSELECT"); break; + case 0x0120: strcat(buf, "MENUCHAR"); break; + case 0x0121: strcat(buf, "ENTERIDLE"); break; + #if(WINVER >= 0x0500) + case 0x0122: strcat(buf, "MENURBUTTONUP"); break; + case 0x0123: strcat(buf, "MENUDRAG"); break; + case 0x0124: strcat(buf, "MENUGETOBJECT"); break; + case 0x0125: strcat(buf, "UNINITMENUPOPUP"); break; + case 0x0126: strcat(buf, "MENUCOMMAND"); break; + #endif + + case 0x0132: strcat(buf, "CTLCOLORMSGBOX"); break; + case 0x0133: strcat(buf, "CTLCOLOREDIT"); break; + case 0x0134: strcat(buf, "CTLCOLORLISTBOX"); break; + case 0x0135: strcat(buf, "CTLCOLORBTN"); break; + case 0x0136: strcat(buf, "CTLCOLORDLG"); break; + case 0x0137: strcat(buf, "CTLCOLORSCROLLBAR"); break; + case 0x0138: strcat(buf, "CTLCOLORSTATIC"); break; + + //case 0x0200: strcat(buf, "MOUSEFIRST"); break; + case 0x0200: strcat(buf, "MOUSEMOVE"); break; + case 0x0201: strcat(buf, "LBUTTONDOWN"); break; + case 0x0202: strcat(buf, "LBUTTONUP"); break; + case 0x0203: strcat(buf, "LBUTTONDBLCLK"); break; + case 0x0204: strcat(buf, "RBUTTONDOWN"); break; + case 0x0205: strcat(buf, "RBUTTONUP"); break; + case 0x0206: strcat(buf, "RBUTTONDBLCLK"); break; + case 0x0207: strcat(buf, "MBUTTONDOWN"); break; + case 0x0208: strcat(buf, "MBUTTONUP"); break; + case 0x0209: strcat(buf, "MBUTTONDBLCLK"); break; + + #if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) + case 0x020A: strcat(buf, "MOUSEWHEEL"); break; + //case 0x020A: strcat(buf, "MOUSELAST"); break; + #else + //case 0x0209: strcat(buf, "MOUSELAST"); break; + #endif + + case 0x0210: strcat(buf, "PARENTNOTIFY"); break; + case 0x0211: strcat(buf, "ENTERMENULOOP"); break; + case 0x0212: strcat(buf, "EXITMENULOOP"); break; + + #if(WINVER >= 0x0400) + case 0x0213: strcat(buf, "NEXTMENU"); break; + case 0x0214: strcat(buf, "SIZING"); break; + case 0x0215: strcat(buf, "CAPTURECHANGED"); break; + case 0x0216: strcat(buf, "MOVING"); break; + case 0x0218: strcat(buf, "POWERBROADCAST"); break; + case 0x0219: strcat(buf, "DEVICECHANGE"); break; + #endif + + /* + case 0x0220: strcat(buf, "MDICREATE"); break; + case 0x0221: strcat(buf, "MDIDESTROY"); break; + case 0x0222: strcat(buf, "MDIACTIVATE"); break; + case 0x0223: strcat(buf, "MDIRESTORE"); break; + case 0x0224: strcat(buf, "MDINEXT"); break; + case 0x0225: strcat(buf, "MDIMAXIMIZE"); break; + case 0x0226: strcat(buf, "MDITILE"); break; + case 0x0227: strcat(buf, "MDICASCADE"); break; + case 0x0228: strcat(buf, "MDIICONARRANGE"); break; + case 0x0229: strcat(buf, "MDIGETACTIVE"); break; + */ + + case 0x0230: strcat(buf, "MDISETMENU"); break; + case 0x0231: strcat(buf, "ENTERSIZEMOVE"); break; + case 0x0232: strcat(buf, "EXITSIZEMOVE"); break; + case 0x0233: strcat(buf, "DROPFILES"); break; + case 0x0234: strcat(buf, "MDIREFRESHMENU"); break; + + + /* + #if(WINVER >= 0x0400) + case 0x0281: strcat(buf, "IME_SETCONTEXT"); break; + case 0x0282: strcat(buf, "IME_NOTIFY"); break; + case 0x0283: strcat(buf, "IME_CONTROL"); break; + case 0x0284: strcat(buf, "IME_COMPOSITIONFULL"); break; + case 0x0285: strcat(buf, "IME_SELECT"); break; + case 0x0286: strcat(buf, "IME_CHAR"); break; + #endif + #if(WINVER >= 0x0500) + case 0x0288: strcat(buf, "IME_REQUEST"); break; + #endif + #if(WINVER >= 0x0400) + case 0x0290: strcat(buf, "IME_KEYDOWN"); break; + case 0x0291: strcat(buf, "IME_KEYUP"); break; + #endif + */ + + #if(_WIN32_WINNT >= 0x0400) + case 0x02A1: strcat(buf, "MOUSEHOVER"); break; + case 0x02A3: strcat(buf, "MOUSELEAVE"); break; + #endif + + case 0x0300: strcat(buf, "CUT"); break; + case 0x0301: strcat(buf, "COPY"); break; + case 0x0302: strcat(buf, "PASTE"); break; + case 0x0303: strcat(buf, "CLEAR"); break; + case 0x0304: strcat(buf, "UNDO"); break; + case 0x0305: strcat(buf, "RENDERFORMAT"); break; + case 0x0306: strcat(buf, "RENDERALLFORMATS"); break; + case 0x0307: strcat(buf, "DESTROYCLIPBOARD"); break; + case 0x0308: strcat(buf, "DRAWCLIPBOARD"); break; + case 0x0309: strcat(buf, "PAINTCLIPBOARD"); break; + case 0x030A: strcat(buf, "VSCROLLCLIPBOARD"); break; + case 0x030B: strcat(buf, "SIZECLIPBOARD"); break; + case 0x030C: strcat(buf, "ASKCBFORMATNAME"); break; + case 0x030D: strcat(buf, "CHANGECBCHAIN"); break; + case 0x030E: strcat(buf, "HSCROLLCLIPBOARD"); break; + case 0x030F: strcat(buf, "QUERYNEWPALETTE"); break; + case 0x0310: strcat(buf, "PALETTEISCHANGING"); break; + case 0x0311: strcat(buf, "PALETTECHANGED"); break; + case 0x0312: strcat(buf, "HOTKEY"); break; + + #if(WINVER >= 0x0400) + case 0x0317: strcat(buf, "PRINT"); break; + case 0x0318: strcat(buf, "PRINTCLIENT"); break; + + case 0x0358: strcat(buf, "HANDHELDFIRST"); break; + case 0x035F: strcat(buf, "HANDHELDLAST"); break; + + case 0x0360: strcat(buf, "AFXFIRST"); break; + case 0x037F: strcat(buf, "AFXLAST"); break; + #endif + + case 0x0380: strcat(buf, "PENWINFIRST"); break; + case 0x038F: strcat(buf, "PENWINLAST"); break; + + default: + sprintf(buf, "unknown"); + matched = 0; + break; + } + + int n = strlen(buf); + int desired_len = 24; + int spaces_to_append = desired_len-n; + if (spaces_to_append>0) + { + for (int i=0; i PROMPT TO GO TO WEB. + int ret = MessageBox(hwnd, + #ifndef D3D_SDK_VERSION + --- error; you need to #include --- + #endif + #if (D3D_SDK_VERSION==120) + // plugin was *built* using the DirectX 8.0 sdk, therefore, + // the dx8.0 runtime is missing or corrupt + "Failed to initialize DirectX 8.0 or later; it is either missing or corrupt.\r" + "DirectX 8.0 or later must be installed before you can run this plugin!\r" + "\r" + "Would you like to be taken to http://www.microsoft.com/windows/directx,\r" + "where you can download the latest version of DirectX?\r" + "\r" + "Please click YES to open this page in your default web browser,\r" + "or NO to simply return to Winamp." + #else + // plugin was *built* using some other version of the DirectX8 sdk, such as + // 8.1b; therefore, we don't know exactly what version to tell them they need + // to install; so we ask them to go get the *latest* version. + "Failed to initialize DirectX; it is either missing or corrupt.\r" + "The latest version of DirectX must be installed before you can run this plugin!\r" + "\r" + "Would you like to be taken to http://www.microsoft.com/windows/directx,\r" + "where you can download the latest version of DirectX?\r" + "\r" + "Please click YES to open this page in your default web browser,\r" + "or NO to simply return to Winamp." + #endif + ,"DirectX Missing or Corrupt",MB_YESNO|MB_SETFOREGROUND|MB_TOPMOST|MB_TASKMODAL); + + if (ret==IDYES) + DownloadDirectX(hwnd); +*/ +} + +bool CheckForMMX() +{ + DWORD bMMX = 0; + DWORD *pbMMX = &bMMX; + __try { + __asm { + mov eax, 1 + cpuid + mov edi, pbMMX + mov dword ptr [edi], edx + } + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + bMMX = 0; + } + + if (bMMX & 0x00800000) // check bit 23 + return true; + + return false; +} + +bool CheckForSSE() +{ + /* + The SSE instruction set was introduced with the Pentium III and features: + * Additional MMX instructions such as min/max + * Prefetch and write-through instructions for optimizing data movement + from and to the L2/L3 caches and main memory + * 8 New 128 bit XMM registers (xmm0..xmm7) and corresponding 32 bit floating point + (single precision) instructions + */ + + DWORD bSSE = 0; + DWORD *pbSSE = &bSSE; + __try { + __asm + { + mov eax, 1 + cpuid + mov edi, pbSSE + mov dword ptr [edi], edx + } + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + bSSE = 0; + } + + if (bSSE & 0x02000000) // check bit 25 + return true; + + return false; +} + +void memset_MMX(void *pDest, unsigned char value, int nBytes) +{ + // NOTE #1: YOU MUST MAKE SURE MMX IS SUPPORTED BEFORE CALLING THIS ROUTINE + // NOTE #2: YOU MUST ENSURE THAT THE POINTERS ARE ALIGNED TO 8-BYTE BOUNDARIES + + int offset = ((unsigned long)pDest) % 8; + + if (nBytes < 32) + { + memset(pDest, value, nBytes); + } + else + { + if (offset != 0) + { + int prebytes = 8-offset; + memset(pDest, value, prebytes); + pDest = (void*)((unsigned long)pDest + prebytes); + nBytes -= prebytes; + } + + int nLoops = nBytes/64; + unsigned __int64 value8x = value; + value8x = value8x | (value8x<<8); + value8x = value8x | (value8x<<16); + value8x = value8x | (value8x<<32); + + if (nLoops > 0) + __asm + { + mov ecx, nLoops + mov edi, pDest + + movq mm0, qword ptr value8x + movq mm1, qword ptr value8x + movq mm2, qword ptr value8x + movq mm3, qword ptr value8x + movq mm4, qword ptr value8x + movq mm5, qword ptr value8x + movq mm6, qword ptr value8x + movq mm7, qword ptr value8x + + ALIGN 16 + MMX_memset_loop: + + MOVQ [edi], mm0 + MOVQ [edi+8], mm1 + MOVQ [edi+16], mm2 + MOVQ [edi+24], mm3 + MOVQ [edi+32], mm4 + MOVQ [edi+40], mm5 + MOVQ [edi+48], mm6 + MOVQ [edi+56], mm7 + + ADD edi, 64 + + dec ecx + jnz MMX_memset_loop + + EMMS + } + + int nBytesDone = nLoops*64; + int nBytesLeft = nBytes - nBytesDone; + if (nBytesLeft > 0) + memset((unsigned char *)pDest + nBytesDone, value, nBytesLeft); + } +} + +void memcpy_MMX(void *pDest, void *pSrc, int nBytes) +{ + // NOTE #1: YOU MUST MAKE SURE MMX IS SUPPORTED BEFORE CALLING THIS ROUTINE + // NOTE #2: YOU MUST ENSURE THAT THE POINTERS ARE ALIGNED TO 8-BYTE BOUNDARIES + + int offset = ((unsigned long)pSrc) % 8; + int offset2 = ((unsigned long)pDest) % 8; + + if (offset != offset2 || nBytes < 32) + { + // don't use MMX, since data is not aligned + memcpy(pDest, pSrc, nBytes); + } + else + { + if (offset != 0) + { + int prebytes = 8-offset; + memcpy(pDest, pSrc, prebytes); + pSrc = (void*)((unsigned long)pSrc + prebytes); + pDest = (void*)((unsigned long)pDest + prebytes); + nBytes -= prebytes; + //assert((((unsigned long)pSrc) % 8)==0); + //assert((((unsigned long)pDest) % 8)==0); + } + + int nLoops = nBytes/64; + + if (nLoops > 0) + __asm + { + mov ecx, nLoops + mov eax, pSrc + mov edi, pDest + + ALIGN 16 + MMX_memcpy_loop: + + MOVQ mm0, [eax] + MOVQ mm1, [eax+8] + MOVQ mm2, [eax+16] + MOVQ mm3, [eax+24] + MOVQ mm4, [eax+32] + MOVQ mm5, [eax+40] + MOVQ mm6, [eax+48] + MOVQ mm7, [eax+56] + + MOVQ [edi], mm0 + MOVQ [edi+8], mm1 + MOVQ [edi+16], mm2 + MOVQ [edi+24], mm3 + MOVQ [edi+32], mm4 + MOVQ [edi+40], mm5 + MOVQ [edi+48], mm6 + MOVQ [edi+56], mm7 + + ADD eax, 64 + ADD edi, 64 + + dec ecx + jnz MMX_memcpy_loop + + EMMS + } + + int nBytesDone = nLoops*64; + int nBytesLeft = nBytes - nBytesDone; + if (nBytesLeft > 0) + { + memcpy((unsigned char *)pDest + nBytesDone, (unsigned char *)pSrc + nBytesDone, nBytesLeft); + } + } +} + +void GetDesktopFolder(char *szDesktopFolder) // should be MAX_PATH len. +{ + // returns the path to the desktop folder, WITHOUT a trailing backslash. + + szDesktopFolder[0] = 0; +/* + ITEMIDLIST pidl; + ZeroMemory(&pidl, sizeof(pidl)); + if (!SHGetPathFromIDList(&pidl, szDesktopFolder)) + szDesktopFolder[0] = 0; +*/ +} +/* +void ExecutePidl(LPITEMIDLIST pidl, char *szPathAndFile, char *szWorkingDirectory, HWND hWnd) +{ + + // This function was based on code by Jeff Prosise. + + // Note: for some reason, ShellExecuteEx fails when executing + // *shortcuts* (.lnk files) from the desktop, using their PIDLs. + // So, if that fails, we try again w/the plain old text filename + // (szPathAndFile). + + char szVerb[] = "open"; + char szFilename2[MAX_PATH]; + + sprintf(szFilename2, "%s.lnk", szPathAndFile); + + // -without the "no-verb" pass, + // certain icons still don't work (like shortcuts + // to IE, VTune...) + // -without the "context menu" pass, + // certain others STILL don't work (Netscape...) + // -without the 'ntry' pass, shortcuts (to folders/files) + // don't work + for (int verb_pass=0; verb_pass<2; verb_pass++) + { + for (int ntry=0; ntry<3; ntry++) + { + for (int context_pass=0; context_pass<2; context_pass++) + { + SHELLEXECUTEINFO sei = { sizeof(sei) }; + sei.hwnd = hWnd; + sei.fMask = SEE_MASK_FLAG_NO_UI; + if (context_pass==1) + sei.fMask |= SEE_MASK_INVOKEIDLIST; + sei.lpVerb = (verb_pass) ? NULL : szVerb; + sei.lpDirectory = szWorkingDirectory; + sei.nShow = SW_SHOWNORMAL; + + if (ntry==0) + { + // this case works for most non-shortcuts + sei.fMask |= SEE_MASK_IDLIST; + sei.lpIDList = pidl; + } + else if (ntry==1) + { + // this case is required for *shortcuts to folders* to work + sei.lpFile = szPathAndFile; + } + else if (ntry==2) + { + // this case is required for *shortcuts to files* to work + sei.lpFile = szFilename2; + } + + if (ShellExecuteEx(&sei)) + return; + } + } + } + +} +*/ + +//WNDPROC g_pOldWndProc; +//LPCONTEXTMENU2 g_pIContext2or3; + +LRESULT CALLBACK HookWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) +{ +#if 0 + //UINT uItem; + //TCHAR szBuf[MAX_PATH]; + + switch (msg) + { + case WM_DRAWITEM: + case WM_MEASUREITEM: + if(wp) break; // not menu related + case WM_INITMENUPOPUP: + g_pIContext2or3->HandleMenuMsg(msg, wp, lp); + return (msg==WM_INITMENUPOPUP ? 0 : TRUE); // handled + + /*case WM_MENUSELECT: + // if this is a shell item, get its descriptive text + uItem = (UINT) LOWORD(wp); + if(0 == (MF_POPUP & HIWORD(wp)) && uItem >= 1 && uItem <= 0x7fff) + { + g_pIContext2or3->GetCommandString(uItem-1, GCS_HELPTEXT, + NULL, szBuf, sizeof(szBuf)/sizeof(szBuf[0]) ); + + // set the status bar text + ((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->SetMessageText(szBuf); + return 0; + } + break;*/ + + default: + break; + } + + // for all untreated messages, call the original wndproc + return ::CallWindowProc(g_pOldWndProc, hWnd, msg, wp, lp); +#endif + return 0; +} + +#if 0 +BOOL DoExplorerMenu (HWND hwnd, LPITEMIDLIST pidlMain, POINT point) +{ + LPMALLOC pMalloc; + LPSHELLFOLDER psfFolder, psfNextFolder; + LPITEMIDLIST pidlItem, pidlNextItem, *ppidl; + LPCONTEXTMENU pContextMenu; + CMINVOKECOMMANDINFO ici; + UINT nCount, nCmd; + BOOL bResult; + HMENU hMenu; + + // + // Get pointers to the shell's IMalloc interface and the desktop's + // IShellFolder interface. + // + bResult = FALSE; + + if (!SUCCEEDED (SHGetMalloc (&pMalloc))) + return bResult; + + if (!SUCCEEDED (SHGetDesktopFolder (&psfFolder))) { + pMalloc->Release(); + return bResult; + } + + if (nCount = GetItemCount (pidlMain)) // nCount must be > 0 + { + // + // Initialize psfFolder with a pointer to the IShellFolder + // interface of the folder that contains the item whose context + // menu we're after, and initialize pidlItem with a pointer to + // the item's item ID. If nCount > 1, this requires us to walk + // the list of item IDs stored in pidlMain and bind to each + // subfolder referenced in the list. + // + pidlItem = pidlMain; + + while (--nCount) { + // + // Create a 1-item item ID list for the next item in pidlMain. + // + pidlNextItem = DuplicateItem (pMalloc, pidlItem); + if (pidlNextItem == NULL) { + psfFolder->Release(); + pMalloc->Release(); + return bResult; + } + + // + // Bind to the folder specified in the new item ID list. + // + if (!SUCCEEDED (psfFolder->BindToObject(pidlNextItem, NULL, IID_IShellFolder, (void**)&psfNextFolder))) // modified by RG + { + pMalloc->Free(pidlNextItem); + psfFolder->Release(); + pMalloc->Release(); + return bResult; + } + + // + // Release the IShellFolder pointer to the parent folder + // and set psfFolder equal to the IShellFolder pointer for + // the current folder. + // + psfFolder->Release(); + psfFolder = psfNextFolder; + + // + // Release the storage for the 1-item item ID list we created + // just a moment ago and initialize pidlItem so that it points + // to the next item in pidlMain. + // + pMalloc->Free(pidlNextItem); + pidlItem = GetNextItem (pidlItem); + } + + // + // Get a pointer to the item's IContextMenu interface and call + // IContextMenu::QueryContextMenu to initialize a context menu. + // + ppidl = &pidlItem; + if (SUCCEEDED (psfFolder->GetUIObjectOf(hwnd, 1, (LPCITEMIDLIST*)ppidl, IID_IContextMenu, NULL, (void**)&pContextMenu))) // modified by RG + { + // try to see if we can upgrade to an IContextMenu3 + // or IContextMenu2 interface pointer: + int level = 1; + void *pCM = NULL; + if (pContextMenu->QueryInterface(IID_IContextMenu3, &pCM) == NOERROR) + { + pContextMenu->Release(); + pContextMenu = (LPCONTEXTMENU)pCM; + level = 3; + } + else if (pContextMenu->QueryInterface(IID_IContextMenu2, &pCM) == NOERROR) + { + pContextMenu->Release(); + pContextMenu = (LPCONTEXTMENU)pCM; + level = 2; + } + + hMenu = CreatePopupMenu (); + if (SUCCEEDED (pContextMenu->QueryContextMenu(hMenu, 0, 1, 0x7FFF, CMF_EXPLORE))) + { + ClientToScreen (hwnd, &point); + + // install the subclassing "hook", for versions 2 or 3 + if (level >= 2) + { + g_pOldWndProc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (DWORD)HookWndProc); + g_pIContext2or3 = (LPCONTEXTMENU2)pContextMenu; // cast ok for ICMv3 + } + else + { + g_pOldWndProc = NULL; + g_pIContext2or3 = NULL; + } + + // + // Display the context menu. + // + nCmd = TrackPopupMenu (hMenu, TPM_LEFTALIGN | + TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD, + point.x, point.y, 0, hwnd, NULL); + + // restore old wndProc + if (g_pOldWndProc) + { + SetWindowLong(hwnd, GWL_WNDPROC, (DWORD)g_pOldWndProc); + } + + // + // If a command was selected from the menu, execute it. + // + if (nCmd >= 1 && nCmd <= 0x7fff) + { + ZeroMemory(&ici, sizeof(ici)); + ici.cbSize = sizeof (CMINVOKECOMMANDINFO); + //ici.fMask = 0; + ici.hwnd = hwnd; + ici.lpVerb = MAKEINTRESOURCE (nCmd - 1); + //ici.lpParameters = NULL; + //ici.lpDirectory = NULL; + ici.nShow = SW_SHOWNORMAL; + //ici.dwHotKey = 0; + //ici.hIcon = NULL; + + if (SUCCEEDED ( pContextMenu->InvokeCommand (&ici))) + bResult = TRUE; + } + /*else if (nCmd) + { + PostMessage(hwnd, WM_COMMAND, nCmd, NULL); // our command + }*/ + + } + DestroyMenu (hMenu); + pContextMenu->Release(); + } + } + + // + // Clean up and return. + // + psfFolder->Release(); + pMalloc->Release(); + + return bResult; + return true; +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Note: a special thanks goes out to Jeff Prosise for writing & publishing +// the following code! +// +// FUNCTION: GetItemCount +// +// DESCRIPTION: Computes the number of item IDs in an item ID list. +// +// INPUT: pidl = Pointer to an item ID list. +// +// RETURNS: Number of item IDs in the list. +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +UINT GetItemCount (LPITEMIDLIST pidl) +{ + USHORT nLen; + UINT nCount; + + nCount = 0; + while ((nLen = pidl->mkid.cb) != 0) { + pidl = GetNextItem (pidl); + nCount++; + } + return nCount; +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Note: a special thanks goes out to Jeff Prosise for writing & publishing +// the following code! +// +// FUNCTION: GetNextItem +// +// DESCRIPTION: Finds the next item in an item ID list. +// +// INPUT: pidl = Pointer to an item ID list. +// +// RETURNS: Pointer to the next item. +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +LPITEMIDLIST GetNextItem (LPITEMIDLIST pidl) +{ + USHORT nLen; + + if ((nLen = pidl->mkid.cb) == 0) + return NULL; + + return (LPITEMIDLIST) (((LPBYTE) pidl) + nLen); +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Note: a special thanks goes out to Jeff Prosise for writing & publishing +// the following code! +// +// FUNCTION: DuplicateItem +// +// DESCRIPTION: Makes a copy of the next item in an item ID list. +// +// INPUT: pMalloc = Pointer to an IMalloc interface. +// pidl = Pointer to an item ID list. +// +// RETURNS: Pointer to an ITEMIDLIST containing the copied item ID. +// +// NOTES: It is the caller's responsibility to free the memory +// allocated by this function when the item ID is no longer +// needed. Example: +// +// pidlItem = DuplicateItem (pMalloc, pidl); +// . +// . +// . +// pMalloc->lpVtbl->Free (pMalloc, pidlItem); +// +// Failure to free the ITEMIDLIST will result in memory +// leaks. +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +LPITEMIDLIST DuplicateItem (LPMALLOC pMalloc, LPITEMIDLIST pidl) +{ + USHORT nLen; + LPITEMIDLIST pidlNew; + + nLen = pidl->mkid.cb; + if (nLen == 0) + return NULL; + + pidlNew = (LPITEMIDLIST) pMalloc->Alloc ( + nLen + sizeof (USHORT)); + if (pidlNew == NULL) + return NULL; + + CopyMemory (pidlNew, pidl, nLen); + *((USHORT*) (((LPBYTE) pidlNew) + nLen)) = 0; + + return pidlNew; +} + +//---------------------------------------------------------------------- +// A special thanks goes out to Jeroen-bart Engelen (Yeep) for providing +// his source code for getting the position & label information for all +// the icons on the desktop, as found below. See his article at +// http://www.digiwar.com/scripts/renderpage.php?section=2&subsection=2 +//---------------------------------------------------------------------- + +void FindDesktopWindows(HWND *desktop_progman, HWND *desktopview_wnd, HWND *listview_wnd) +{ + *desktop_progman = NULL; + *desktopview_wnd = NULL; + *listview_wnd = NULL; + + *desktop_progman = FindWindow(NULL, ("Program Manager")); + if(*desktop_progman == NULL) + { + //MessageBox(NULL, "Unable to get the handle to the Program Manager.", "Fatal error", MB_OK|MB_ICONERROR); + return; + } + + *desktopview_wnd = FindWindowEx(*desktop_progman, NULL, "SHELLDLL_DefView", NULL); + if(*desktopview_wnd == NULL) + { + //MessageBox(NULL, "Unable to get the handle to the desktopview.", "Fatal error", MB_OK|MB_ICONERROR); + return; + } + + // Thanks ef_ef_ef@yahoo.com for pointing out this works in NT 4 and not the way I did it originally. + *listview_wnd = FindWindowEx(*desktopview_wnd, NULL, "SysListView32", NULL); + if(*listview_wnd == NULL) + { + //MessageBox(NULL, "Unable to get the handle to the folderview.", "Fatal error", MB_OK|MB_ICONERROR); + return; + } +} + +//---------------------------------------------------------------------- + +/* +int DetectWin2kOrLater() +{ +// returns 0 for win95, NT, 98, me, or error +// returns 1 for win2k, xp... + +OSVERSIONINFO osvi = { sizeof(osvi) }; +if (GetVersionEx(&osvi)) +{ +// Win95 Win98 WinNT 3.51 WinNT 4.0 Win 2000 WinXP +//dwPlatformID 1 1 2 2 2 2 +//dwMajorVersion 4 4 3 4 5 5 +//dwMinorVersion 0 10 51 0 0 1 + +if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 5) +return 1; +else +return 0; +} + +// error +return 0; +} +*/ + +//---------------------------------------------------------------------- + +int GetDesktopIconSize() +{ + int ret = 32; + + // reads the key: HKEY_CURRENT_USER\Control Panel, Desktop\WindowMetrics\Shell Icon Size + unsigned char buf[64]; + unsigned long len = sizeof(buf); + DWORD type; + HKEY key; + + if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\Desktop\\WindowMetrics", 0, KEY_READ, &key)) + { + if (ERROR_SUCCESS == RegQueryValueEx(key, "Shell Icon Size", NULL, &type, (unsigned char*)buf, &len) && + type == REG_SZ) + { + int x = atoi((char*)buf); + if (x>0 && x<=128) + ret = x; + } + + RegCloseKey(key); + } + + return ret; +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/utility.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/utility.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/vis_milkdrop/utility.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/vis_milkdrop/utility.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,95 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef __NULLSOFT_DX8_PLUGIN_SHELL_UTILITY_H__ +#define __NULLSOFT_DX8_PLUGIN_SHELL_UTILITY_H__ 1 + +#include +//#include + +#define SafeRelease(x) { if (x) {x->Release(); x=NULL;} } +#define SafeDelete(x) { if (x) {delete x; x=NULL;} } +#define IsNullGuid(lpGUID) ( ((int*)lpGUID)[0]==0 && ((int*)lpGUID)[1]==0 && ((int*)lpGUID)[2]==0 && ((int*)lpGUID)[3]==0 ) +#define DlgItemIsChecked(hDlg, nIDDlgItem) ((SendDlgItemMessage(hDlg, nIDDlgItem, BM_GETCHECK, (WPARAM) 0, (LPARAM) 0) == BST_CHECKED) ? true : false) +#define CosineInterp(x) (0.5f - 0.5f*cosf((x) * 3.1415926535898f)) +#define InvCosineInterp(x) (acosf(1.0f - 2.0f*(x))/3.1415926535898f) +float PowCosineInterp(float x, float pow); +float AdjustRateToFPS(float per_frame_decay_rate_at_fps1, float fps1, float actual_fps); + +//int InternalGetPrivateProfileInt - part of Win32 API +#define GetPrivateProfileBool(w,x,y,z) ((bool)(InternalGetPrivateProfileInt(w,x,y,z) != 0)) +#define GetPrivateProfileBOOL(w,x,y,z) ((BOOL)(InternalGetPrivateProfileInt(w,x,y,z) != 0)) +int InternalGetPrivateProfileString(char *szSectionName, char *szKeyName, char *szDefault, char *buffer, int size, char *szIniFile); +int InternalGetPrivateProfileInt(char *szSectionName, char *szKeyName, int iDefault, char *szIniFile); +float InternalGetPrivateProfileFloat(char *szSectionName, char *szKeyName, float fDefault, char *szIniFile); +bool WritePrivateProfileInt(int d, char *szKeyName, char *szIniFile, char *szSectionName); +bool WritePrivateProfileFloat(float f, char *szKeyName, char *szIniFile, char *szSectionName); + +void SetScrollLock(int bNewState); +void RemoveExtension(char *str); +void RemoveSingleAmpersands(char *str); +void TextToGuid(char *str, GUID *pGUID); +void GuidToText(GUID *pGUID, char *str, int nStrLen); +//int GetPentiumTimeRaw(unsigned __int64 *cpu_timestamp); +//double GetPentiumTimeAsDouble(unsigned __int64 frequency); +#ifdef _DEBUG + void OutputDebugMessage(char *szStartText, HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); // only available in RELEASE builds! +#endif +void MissingDirectX(HWND hwnd); +bool CheckForMMX(); +bool CheckForSSE(); +void memcpy_MMX(void *pDest, void *pSrc, int nBytes); // CALL CheckForMMX() FIRST!!! +void memset_MMX(void *pDest, unsigned char value, int nBytes); // CALL CheckForMMX() FIRST!!! +void GetDesktopFolder(char *szDesktopFolder); // should be MAX_PATH len. + + + +//#include "icon_t.h" +//#include +#include +/* +BOOL DoExplorerMenu (HWND hwnd, LPCTSTR pszPath, POINT point); +BOOL DoExplorerMenu (HWND hwnd, LPITEMIDLIST pidl, POINT point); +UINT GetItemCount (LPITEMIDLIST pidl); +LPITEMIDLIST GetNextItem (LPITEMIDLIST pidl); +LPITEMIDLIST DuplicateItem (LPMALLOC pMalloc, LPITEMIDLIST pidl); +void FindDesktopWindows(HWND *desktop_progman, HWND *desktopview_wnd, HWND *listview_wnd); +void ExecutePidl(LPITEMIDLIST pidl, char *szPathAndFile, char *szWorkingDirectory, HWND hWnd); +//int DetectWin2kOrLater(); +int GetDesktopIconSize(); +*/ + + + + + + + +#endif \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/XmlDocument.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/XmlDocument.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/XmlDocument.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/XmlDocument.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2004-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// XmlDocument.cpp: implementation of the CXmlDocument class. +// +////////////////////////////////////////////////////////////////////// +#include "XmlDocument.h" +#include + +#define strnicmp _strnicmp +#define strcmpi _strcmpi + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CXmlDocument::CXmlDocument() +{ + m_doc = 0; + m_size = 0; + m_nodes = 0; + + m_szTag[0] = 0; + m_szText[0] = 0; +} + +void CXmlDocument::Create(char* szString) +{ + m_size = strlen(szString); + m_doc = new char[m_size+1]; + memcpy(m_doc, szString, m_size+1); +} + +CXmlDocument::~CXmlDocument() +{ + if(m_doc) { + delete[] m_doc; + m_doc = NULL; + } +} + + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_load_doc +// Opens an XML document and loads it into memory. +// +int CXmlDocument::Load(char* szFile) +{ + FILE* hFile; + + hFile = fopen(szFile,"rb"); + if (hFile==NULL) + { + return -1; + } + + fseek(hFile,0,SEEK_END); + m_size = ftell(hFile); + + fseek(hFile,0,SEEK_SET); + + m_doc = new char[m_size]; + if (!m_doc) + { + m_size = 0; + fclose(hFile); + return -2; + } + + if (fread(m_doc, m_size, 1, hFile)<=0) + { + delete[] m_doc; + m_doc = 0; + m_size = 0; + fclose(hFile); + return -3; + } + + fclose(hFile); + return 0; +} + + + + + + + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_close_doc +// Closes XML document freeing up resources. +// +void CXmlDocument::Close() +{ + if (m_doc!=NULL) + { + delete[] m_doc; + m_doc =0; + } + + m_size =0; + m_nodes = 0; + m_szTag[0] = 0; + m_szText[0] = 0; +} + + + + +int CXmlDocument::GetNodeCount(char* szTag) +{ + m_nodes = 0; + + char* szCurrentTag; + XmlNode node; + + node = GetNextNode(XML_ROOT_NODE); + while (node>0) + { + szCurrentTag = GetNodeTag(node); + if ( !strcmpi(szCurrentTag,szTag) ) + m_nodes++; + + node = GetNextNode(node); + } + + return m_nodes; +} + + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_next_tag +// Moves the current position to the next tag. +// +XmlNode CXmlDocument::GetNextNode(XmlNode node) +{ + int openBracket = -1; + int closeBracket = -1; + int i; + char c; + + for (i=node; i') + { + closeBracket=i; + break; + } + } + } + + if ((openBracket>=0) && (closeBracket>=0)) + { + return openBracket+1; + } + + return 0; +} + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_get_tag_name +// Gets the tag name at the current position (max 32 chars!). +// +char* CXmlDocument::GetNodeTag(XmlNode node) +{ + int i; + char c; + + for (i=node; i') ) + { + memcpy(m_szTag,&m_doc[node],i-node); + m_szTag[i-node]=0; + return m_szTag; + } + } + + return 0; +} + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_get_child_tag +// Gets the position of the child tag. +// +XmlNode CXmlDocument::GetChildNode(XmlNode node, char* szTag) +{ + char szCurrentTag[32]; + char* szChildTag; + + // get parent node tag + strcpy(szCurrentTag,GetNodeTag(node)); + + // get child node + node = GetNextNode(node); + while (node>0) + { + // get child node tag + szChildTag = GetNodeTag(node); + + // does the child's tag match the one we're looking for + if ( !strcmpi(szChildTag,szTag) ) + return node; + + // is this actually the parent's closing tag? + else if ( !strcmpi(&szChildTag[1],szCurrentTag) ) + return 0; + + node = GetNextNode(node); + } + + return 0; +} + + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_get_tag_text +// Gets the text of a given tag (max limit 128 chars!!). +// +char* CXmlDocument::GetNodeText(XmlNode node) +{ + int i,text=0; + int opens=1; + int elements=0; + char c; + for (i=node;i<(m_size-1);i++) + { + c = m_doc[i]; + + switch (c) + { + case '<': + opens++; + if (m_doc[i+1]!='/') + elements++; + else + elements--; + break; + case '>' : + opens--; + break; + case ' ' : + case '\n': + case '\r': + case '\t': + break; + default: + if ((opens==0) && (elements==0)) + text = i; + break; + } + + if (text) + break; + } + + if (!text) + return 0; + + for (i=text;i0) + { + szCurrentTag = GetNodeTag(node); + if ( !strcmpi(szCurrentTag,szTag) ) + pFunc(szTag,node); + + node = GetNextNode(node); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/XmlDocument.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/XmlDocument.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Milkdrop/XmlDocument.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Milkdrop/XmlDocument.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,127 @@ +#if !defined(AFX_XMLDOCUMENT_H__D68461F7_E0CE_4FA0_B1C9_0541610164E9__INCLUDED_) +#define AFX_XMLDOCUMENT_H__D68461F7_E0CE_4FA0_B1C9_0541610164E9__INCLUDED_ + +/* + * Copyright (C) 2004-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// XmlDocument.h: interface for the CXmlDocument class. +// +////////////////////////////////////////////////////////////////////// + +#pragma once + +//#include +#include +#include + +#define XML_ROOT_NODE 0 +#define XML_MAX_TAGNAME_SIZE 32 +#define XML_MAX_INNERTEXT_SIZE 1024 + +typedef int XmlNode; +typedef void (*XmlNodeCallback) (char* szTag, XmlNode node); + + + +class CXmlDocument +{ +public: + CXmlDocument(); + virtual ~CXmlDocument(); + + void Create(char* szString); + int Load(char* szFile); + void Close(); + + int GetNodeCount(char* tag); + + void EnumerateNodes(char* szTag, XmlNodeCallback pFunc); + + XmlNode GetChildNode(XmlNode node, char* szTag); + XmlNode GetNextNode(XmlNode node); + char* GetNodeText(XmlNode node); + char* GetNodeTag(XmlNode node); + +private: + + char* m_doc; + int m_size; + int m_nodes; + char m_szTag[XML_MAX_TAGNAME_SIZE]; + char m_szText[XML_MAX_INNERTEXT_SIZE]; +}; + +class WriteXML +{ +public: + WriteXML() { m_file = NULL; m_rootTag = NULL; }; + ~WriteXML() { Close(); }; + + bool Open(const char *szFile, const char *szOpeningTag) + { + remove(szFile); + if (!szFile || !szOpeningTag) return false; + m_file = fopen(szFile, "w"); + if (!m_file) return false; + m_rootTag = new char[strlen(szOpeningTag) + 1]; + strcpy(m_rootTag, szOpeningTag); + fprintf(m_file, "<%s>\n", m_rootTag); + return true; + }; + void Close() + { + if (m_file) + { + if (m_rootTag) + fprintf(m_file, "\n", m_rootTag); + fclose(m_file); + } + delete[] m_rootTag; + m_rootTag = NULL; + m_file = NULL; + }; + void WriteTag(const char *szTag, const char *data) + { + if (!m_file || !szTag || !data) return; + fprintf(m_file, "\t<%s>%s\n", szTag, data, szTag); + }; + void WriteTag(const char *szTag, int data, const char *format = "%i") + { + char temp[10]; + sprintf(temp, format, data); + WriteTag(szTag, temp); + }; + void WriteTag(const char *szTag, float data) + { + if (!m_file || !szTag) return; + fprintf(m_file, "\t<%s>%f\n", szTag, data, szTag); + }; + void WriteTag(const char *szTag, bool data) + { + if (!m_file || !szTag) return; + fprintf(m_file, "\t<%s>%s\n", szTag, data ? "true" : "false", szTag); + }; + +private: + char *m_rootTag; + FILE *m_file; +}; + +#endif // !defined(AFX_XMLDOCUMENT_H__D68461F7_E0CE_4FA0_B1C9_0541610164E9__INCLUDED_) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/OpenGLSpectrum/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/OpenGLSpectrum/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/OpenGLSpectrum/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/OpenGLSpectrum/Makefile.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,35 @@ +ARCH=@ARCH@ +CXXFLAGS=-fPIC +ifeq (@USE_ANDROID@,1) +SLIB = @abs_top_srcdir@/system/libvisopengl_spectrum.so +else +SLIB = @abs_top_srcdir@/addons/visualization.glspectrum/opengl_spectrum.vis +endif +OBJS = opengl_spectrum.o + +ifeq (@USE_OPENGLES@,1) + DEFINES += -DHAS_GLES=2 + INCLUDES+= -I@abs_top_srcdir@/xbmc/visualizations/EGLHelpers + OBJS += @abs_top_srcdir@/xbmc/visualizations/EGLHelpers/eglhelpers.a + ifeq ($(findstring osx,$(ARCH)), osx) + LDFLAGS += -framework OpenGLES + else + LDFLAGS += -lGLESv2 + endif +else + DEFINES += -DHAS_GL + ifeq ($(findstring osx,$(ARCH)), osx) + LDFLAGS += -framework OpenGL + else + LDFLAGS += -lGL + endif +endif + +$(SLIB): $(OBJS) +ifeq ($(findstring osx,$(ARCH)), osx) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -bundle -o $(SLIB) $(OBJS) +else + $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -o $(SLIB) $(OBJS) +endif + +include @abs_top_srcdir@/Makefile.include diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/OpenGLSpectrum/opengl_spectrum.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/OpenGLSpectrum/opengl_spectrum.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/OpenGLSpectrum/opengl_spectrum.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/OpenGLSpectrum/opengl_spectrum.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,656 @@ +/* XMMS - Cross-platform multimedia player + * Copyright (C) 1998-2000 Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * Wed May 24 10:49:37 CDT 2000 + * Fixes to threading/context creation for the nVidia X4 drivers by + * Christian Zander + */ + +/* + * Ported to XBMC by d4rk + * Also added 'hSpeed' to animate transition between bar heights + * + * Ported to GLES 2.0 by Gimli + */ + +#define __STDC_LIMIT_MACROS + +#include "addons/include/xbmc_vis_dll.h" +#include +#include +#include +#include + +#if defined(HAS_GLES) +#include "VisGUIShader.h" + +#ifndef M_PI +#define M_PI 3.141592654f +#endif +#define DEG2RAD(d) ( (d) * M_PI/180.0f ) + +//OpenGL wrapper - allows us to use same code of functions draw_bars and render +#define GL_PROJECTION MM_PROJECTION +#define GL_MODELVIEW MM_MODELVIEW + +#define glPushMatrix() vis_shader->PushMatrix() +#define glPopMatrix() vis_shader->PopMatrix() +#define glTranslatef(x,y,z) vis_shader->Translatef(x,y,z) +#define glRotatef(a,x,y,z) vis_shader->Rotatef(DEG2RAD(a),x,y,z) +#define glPolygonMode(a,b) ; +#define glBegin(a) vis_shader->Enable() +#define glEnd() vis_shader->Disable() +#define glMatrixMode(a) vis_shader->MatrixMode(a) +#define glLoadIdentity() vis_shader->LoadIdentity() +#define glFrustum(a,b,c,d,e,f) vis_shader->Frustum(a,b,c,d,e,f) + +static GLenum g_mode = GL_TRIANGLES; +static const char *frag = "precision mediump float; \n" + "varying lowp vec4 m_colour; \n" + "void main () \n" + "{ \n" + " gl_FragColor = m_colour; \n" + "}\n"; + +static const char *vert = "attribute vec4 m_attrpos;\n" + "attribute vec4 m_attrcol;\n" + "attribute vec4 m_attrcord0;\n" + "attribute vec4 m_attrcord1;\n" + "varying vec4 m_cord0;\n" + "varying vec4 m_cord1;\n" + "varying lowp vec4 m_colour;\n" + "uniform mat4 m_proj;\n" + "uniform mat4 m_model;\n" + "void main ()\n" + "{\n" + " mat4 mvp = m_proj * m_model;\n" + " gl_Position = mvp * m_attrpos;\n" + " m_colour = m_attrcol;\n" + " m_cord0 = m_attrcord0;\n" + " m_cord1 = m_attrcord1;\n" + "}\n"; + +static CVisGUIShader *vis_shader = NULL; + +#elif defined(HAS_GL) +#include +static GLenum g_mode = GL_FILL; + +#endif + +#define NUM_BANDS 16 + +static GLfloat x_angle = 20.0, x_speed = 0.0; +static GLfloat y_angle = 45.0, y_speed = 0.5; +static GLfloat z_angle = 0.0, z_speed = 0.0; +static GLfloat heights[16][16], cHeights[16][16], scale; +static GLfloat hSpeed = 0.05; + +#if defined(HAS_GL) +static void draw_rectangle(GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2) +{ + if(y1 == y2) + { + glVertex3f(x1, y1, z1); + glVertex3f(x2, y1, z1); + glVertex3f(x2, y2, z2); + + glVertex3f(x2, y2, z2); + glVertex3f(x1, y2, z2); + glVertex3f(x1, y1, z1); + } + else + { + glVertex3f(x1, y1, z1); + glVertex3f(x2, y1, z2); + glVertex3f(x2, y2, z2); + + glVertex3f(x2, y2, z2); + glVertex3f(x1, y2, z1); + glVertex3f(x1, y1, z1); + } +} + +static void draw_bar(GLfloat x_offset, GLfloat z_offset, GLfloat height, GLfloat red, GLfloat green, GLfloat blue, int index) +{ + GLfloat width = 0.1; + + if (g_mode == GL_POINT) + glColor3f(0.2, 1.0, 0.2); + + if (g_mode != GL_POINT) + { + glColor3f(red,green,blue); + draw_rectangle(x_offset, height, z_offset, x_offset + width, height, z_offset + 0.1); + } + draw_rectangle(x_offset, 0, z_offset, x_offset + width, 0, z_offset + 0.1); + + if (g_mode != GL_POINT) + { + glColor3f(0.5 * red, 0.5 * green, 0.5 * blue); + draw_rectangle(x_offset, 0.0, z_offset + 0.1, x_offset + width, height, z_offset + 0.1); + } + draw_rectangle(x_offset, 0.0, z_offset, x_offset + width, height, z_offset ); + + if (g_mode != GL_POINT) + { + glColor3f(0.25 * red, 0.25 * green, 0.25 * blue); + draw_rectangle(x_offset, 0.0, z_offset , x_offset, height, z_offset + 0.1); + } + draw_rectangle(x_offset + width, 0.0, z_offset , x_offset + width, height, z_offset + 0.1); +} + +#elif defined(HAS_GLES) + +static GLfloat *m_col; +static GLfloat *m_ver; +static GLushort *m_idx; + +static void draw_bar(GLfloat x_offset, GLfloat z_offset, GLfloat height, GLfloat red, GLfloat green, GLfloat blue, int index) +{ + if (!m_col || !m_ver || !m_idx) + return; + + // avoid zero sized bars, which results in overlapping triangles of same depth and display artefacts + height = std::max(height, 1e-3f); + GLfloat *ver = m_ver + 3 * 8 * index; + // just need to update the height vertex, all else is the same + for (int i=0; i<8; i++) + { + ver[1] = (((i+0)>>2)&1) * height; + ver += 3; + } + // on last index, draw the object + if (index == 16*16-1) + { + GLint posLoc = vis_shader->GetPosLoc(); + GLint colLoc = vis_shader->GetColLoc(); + + glVertexAttribPointer(colLoc, 3, GL_FLOAT, 0, 0, m_col); + glVertexAttribPointer(posLoc, 3, GL_FLOAT, 0, 0, m_ver); + + glEnableVertexAttribArray(posLoc); + glEnableVertexAttribArray(colLoc); + + glDrawElements(g_mode, 16*16*36, GL_UNSIGNED_SHORT, m_idx); + + glDisableVertexAttribArray(posLoc); + glDisableVertexAttribArray(colLoc); + } +} + +static void init_bars(void) +{ + if (!m_col || !m_ver || !m_idx) + return; + + GLfloat x_offset, z_offset, r_base, b_base; + for(int y = 0; y < 16; y++) + { + z_offset = -1.6 + ((15 - y) * 0.2); + + b_base = y * (1.0 / 15); + r_base = 1.0 - b_base; + + for(int x = 0; x < 16; x++) + { + x_offset = -1.6 + ((float)x * 0.2); + + GLfloat red = r_base - (float(x) * (r_base / 15.0)); + GLfloat green = (float)x * (1.0 / 15); + GLfloat blue = b_base; + int index = 16*y+x; + GLfloat *col = m_col + 3 * 8 * index; + for (int i=0; i<8; i++) + { + float scale = 0.1f * i; + *col++ = red * scale; + *col++ = green * scale; + *col++ = blue * scale; + } + GLfloat *ver = m_ver + 3 * 8 * index; + for (int i=0; i<8; i++) + { + *ver++ = x_offset + (((i+1)>>1)&1) * 0.1f; + *ver++ = 0; // height - filled in later + *ver++ = z_offset + (((i+0)>>1)&1) * 0.1f; + } + GLushort *idx = m_idx + 36 * index; + GLushort startidx = 8 * index; + // Bottom + *idx++ = startidx + 0; *idx++ = startidx + 1; *idx++ = startidx + 2; + *idx++ = startidx + 0; *idx++ = startidx + 2; *idx++ = startidx + 3; + // Left + *idx++ = startidx + 0; *idx++ = startidx + 4; *idx++ = startidx + 7; + *idx++ = startidx + 0; *idx++ = startidx + 7; *idx++ = startidx + 3; + // Back + *idx++ = startidx + 3; *idx++ = startidx + 7; *idx++ = startidx + 6; + *idx++ = startidx + 3; *idx++ = startidx + 6; *idx++ = startidx + 2; + // Right + *idx++ = startidx + 1; *idx++ = startidx + 5; *idx++ = startidx + 6; + *idx++ = startidx + 1; *idx++ = startidx + 6; *idx++ = startidx + 2; + // Front + *idx++ = startidx + 0; *idx++ = startidx + 4; *idx++ = startidx + 5; + *idx++ = startidx + 0; *idx++ = startidx + 5; *idx++ = startidx + 1; + // Top + *idx++ = startidx + 4; *idx++ = startidx + 5; *idx++ = startidx + 6; + *idx++ = startidx + 4; *idx++ = startidx + 6; *idx++ = startidx + 7; + } + } +} +#endif + +static void draw_bars(void) +{ + int x,y; + GLfloat x_offset, z_offset, r_base, b_base; + + glClear(GL_DEPTH_BUFFER_BIT); + glPushMatrix(); + glTranslatef(0.0,-0.5,-5.0); + glRotatef(x_angle,1.0,0.0,0.0); + glRotatef(y_angle,0.0,1.0,0.0); + glRotatef(z_angle,0.0,0.0,1.0); + + glPolygonMode(GL_FRONT_AND_BACK, g_mode); + glBegin(GL_TRIANGLES); + + for(y = 0; y < 16; y++) + { + z_offset = -1.6 + ((15 - y) * 0.2); + + b_base = y * (1.0 / 15); + r_base = 1.0 - b_base; + + for(x = 0; x < 16; x++) + { + x_offset = -1.6 + ((float)x * 0.2); + if (::fabs(cHeights[y][x]-heights[y][x])>hSpeed) + { + if (cHeights[y][x]CompileAndLink()) + { + delete vis_shader; + return ADDON_STATUS_UNKNOWN; + } + m_col = (GLfloat *)malloc(16*16*3*8 * sizeof(GLfloat *)); + m_ver = (GLfloat *)malloc(16*16*3*8 * sizeof(GLfloat *)); + m_idx = (GLushort *)malloc(16*16*36 * sizeof(GLushort *)); + init_bars(); +#endif + + scale = 1.0 / log(256.0); + + return ADDON_STATUS_NEED_SETTINGS; +} + +//-- Render ------------------------------------------------------------------- +// Called once per frame. Do all rendering here. +//----------------------------------------------------------------------------- +extern "C" void Render() +{ + glDisable(GL_BLEND); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glFrustum(-1, 1, -1, 1, 1.5, 10); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + glPolygonMode(GL_FRONT, GL_FILL); + //glPolygonMode(GL_BACK, GL_FILL); + x_angle += x_speed; + if(x_angle >= 360.0) + x_angle -= 360.0; + + y_angle += y_speed; + if(y_angle >= 360.0) + y_angle -= 360.0; + + z_angle += z_speed; + if(z_angle >= 360.0) + z_angle -= 360.0; + + draw_bars(); + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); +} + +extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName) +{ + int x, y; + + for(x = 0; x < 16; x++) + { + for(y = 0; y < 16; y++) + { + cHeights[y][x] = 0.0; + } + } + + x_speed = 0.0; + y_speed = 0.5; + z_speed = 0.0; + x_angle = 20.0; + y_angle = 45.0; + z_angle = 0.0; +} + +extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +{ + int i,c; + int y=0; + GLfloat val; + + int xscale[] = {0, 1, 2, 3, 5, 7, 10, 14, 20, 28, 40, 54, 74, 101, 137, 187, 255}; + + for(y = 15; y > 0; y--) + { + for(i = 0; i < 16; i++) + { + heights[y][i] = heights[y - 1][i]; + } + } + + for(i = 0; i < NUM_BANDS; i++) + { + for(c = xscale[i], y = 0; c < xscale[i + 1]; c++) + { + if (c y) + y = (int)(pAudioData[c] * (INT16_MAX)); + } + else + continue; + } + y >>= 7; + if(y > 0) + val = (logf(y) * scale); + else + val = 0; + heights[0][i] = val; + } +} + + +//-- GetInfo ------------------------------------------------------------------ +// Tell XBMC our requirements +//----------------------------------------------------------------------------- +extern "C" void GetInfo(VIS_INFO* pInfo) +{ + pInfo->bWantsFreq = false; + pInfo->iSyncDelay = 0; +} + + +//-- GetSubModules ------------------------------------------------------------ +// Return any sub modules supported by this vis +//----------------------------------------------------------------------------- +extern "C" unsigned int GetSubModules(char ***names) +{ + return 0; // this vis supports 0 sub modules +} + +//-- OnAction ----------------------------------------------------------------- +// Handle XBMC actions such as next preset, lock preset, album art changed etc +//----------------------------------------------------------------------------- +extern "C" bool OnAction(long flags, const void *param) +{ + bool ret = false; + return ret; +} + +//-- GetPresets --------------------------------------------------------------- +// Return a list of presets to XBMC for display +//----------------------------------------------------------------------------- +extern "C" unsigned int GetPresets(char ***presets) +{ + return 0; +} + +//-- GetPreset ---------------------------------------------------------------- +// Return the index of the current playing preset +//----------------------------------------------------------------------------- +extern "C" unsigned GetPreset() +{ + return 0; +} + +//-- IsLocked ----------------------------------------------------------------- +// Returns true if this add-on use settings +//----------------------------------------------------------------------------- +extern "C" bool IsLocked() +{ + return false; +} + +//-- Stop --------------------------------------------------------------------- +// This dll must cease all runtime activities +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Stop() +{ +} + +//-- Destroy ------------------------------------------------------------------ +// Do everything before unload of this add-on +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Destroy() +{ +#if defined(HAS_GLES) + if(vis_shader) + { + vis_shader->Free(); + delete vis_shader; + } + free(m_col); + free(m_ver); + free(m_idx); + m_col = NULL; + m_ver = NULL; + m_idx = NULL; +#endif +} + +//-- HasSettings -------------------------------------------------------------- +// Returns true if this add-on use settings +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" bool ADDON_HasSettings() +{ + return true; +} + +//-- GetStatus --------------------------------------------------------------- +// Returns the current Status of this visualisation +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +//-- GetSettings -------------------------------------------------------------- +// Return the settings for XBMC to display +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +//-- FreeSettings -------------------------------------------------------------- +// Free the settings struct passed from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- + +extern "C" void ADDON_FreeSettings() +{ +} + +//-- SetSetting --------------------------------------------------------------- +// Set a specific Setting value (called from XBMC) +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_SetSetting(const char *strSetting, const void* value) +{ + if (!strSetting || !value) + return ADDON_STATUS_UNKNOWN; + + if (strcmp(strSetting, "bar_height")==0) + { + switch (*(int*) value) + { + case 1://standard + scale = 1.f / log(256.f); + break; + + case 2://big + scale = 2.f / log(256.f); + break; + + case 3://real big + scale = 3.f / log(256.f); + break; + + case 4://unused + scale = 0.33f / log(256.f); + break; + + case 0://small + default: + scale = 0.5f / log(256.f); + break; + } + return ADDON_STATUS_OK; + } + else if (strcmp(strSetting, "speed")==0) + { + switch (*(int*) value) + { + case 1: + hSpeed = 0.025f; + break; + + case 2: + hSpeed = 0.0125f; + break; + + case 3: + hSpeed = 0.1f; + break; + + case 4: + hSpeed = 0.2f; + break; + + case 0: + default: + hSpeed = 0.05f; + break; + } + return ADDON_STATUS_OK; + } + else if (strcmp(strSetting, "mode")==0) + { +#if defined(HAS_GL) + switch (*(int*) value) + { + case 1: + g_mode = GL_LINE; + break; + + case 2: + g_mode = GL_POINT; + break; + + case 0: + default: + g_mode = GL_FILL; + break; + } +#else + switch (*(int*) value) + { + case 1: + g_mode = GL_LINE_LOOP; + break; + + case 2: + g_mode = GL_LINES; //no points on gles! + break; + + case 0: + default: + g_mode = GL_TRIANGLES; + break; + } + +#endif + + return ADDON_STATUS_OK; + } + + return ADDON_STATUS_UNKNOWN; +} + +//-- Announce ----------------------------------------------------------------- +// Receive announcements from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/OpenGLSpectrum/opengl_spectrum.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/OpenGLSpectrum/opengl_spectrum.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/OpenGLSpectrum/opengl_spectrum.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/OpenGLSpectrum/opengl_spectrum.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,13 @@ +#ifndef OPENGL_SPECTRUM_H + +extern void oglspectrum_configure(void); +extern void oglspectrum_read_config(void); + +typedef struct +{ + gboolean tdfx_mode; +} OGLSpectrumConfig; + +extern OGLSpectrumConfig oglspectrum_cfg; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/aswrappedcall.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/aswrappedcall.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/aswrappedcall.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/aswrappedcall.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,866 @@ +#ifndef ASWRAPPEDCALL_H +#define ASWRAPPEDCALL_H + +// Generate the wrappers by calling the macros in global scope. +// Then register the wrapper function with the script engine using the asCALL_GENERIC +// calling convention. The wrapper can handle both global functions and class methods. +// +// Example: +// +// asDECLARE_FUNCTION_WRAPPER(MyGenericWrapper, MyRealFunction); +// asDECLARE_FUNCTION_WRAPPERPR(MyGenericOverloadedWrapper, MyOverloadedFunction, (int), void); +// asDECLARE_METHOD_WRAPPER(MyGenericMethodWrapper, MyClass, Method); +// asDECLARE_METHOD_WRAPPERPR(MyGenericOverloadedMethodWrapper, MyClass, Method, (int) const, void); +// +// This file was generated to accept functions with a maximum of 10 parameters. + +#include // placement new +#include + +#define asDECLARE_FUNCTION_WRAPPER(wrapper_name,func) \ + static void wrapper_name(asIScriptGeneric *gen)\ + { \ + asCallWrappedFunc(&func,gen);\ + } + +#define asDECLARE_FUNCTION_WRAPPERPR(wrapper_name,func,params,rettype) \ + static void wrapper_name(asIScriptGeneric *gen)\ + { \ + asCallWrappedFunc((rettype (*)params)(&func),gen);\ + } + +#define asDECLARE_METHOD_WRAPPER(wrapper_name,cl,func) \ + static void wrapper_name(asIScriptGeneric *gen)\ + { \ + asCallWrappedFunc(&cl::func,gen);\ + } + +#define asDECLARE_METHOD_WRAPPERPR(wrapper_name,cl,func,params,rettype) \ + static void wrapper_name(asIScriptGeneric *gen)\ + { \ + asCallWrappedFunc((rettype (cl::*)params)(&cl::func),gen);\ + } + +// A helper class to accept reference parameters +template +class as_wrapNative_helper +{ +public: + X d; + as_wrapNative_helper(X d_) : d(d_) {} +}; + +// 0 parameter(s) + +static void asWrapNative_p0_void(void (*func)(),asIScriptGeneric *) +{ + func( ); +} + +inline void asCallWrappedFunc(void (*func)(),asIScriptGeneric *gen) +{ + asWrapNative_p0_void(func,gen); +} + +template +static void asWrapNative_p0(R (*func)(),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( )); +} + +template +inline void asCallWrappedFunc(R (*func)(),asIScriptGeneric *gen) +{ + asWrapNative_p0(func,gen); +} + +template +static void asWrapNative_p0_void_this(void (C::*func)(),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(),asIScriptGeneric *gen) +{ + asWrapNative_p0_void_this(func,gen); +} + +template +static void asWrapNative_p0_this(R (C::*func)(),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(),asIScriptGeneric *gen) +{ + asWrapNative_p0_this(func,gen); +} + +template +static void asWrapNative_p0_void_this_const(void (C::*func)() const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ); +} + +template +inline void asCallWrappedFunc(void (C::*func)() const,asIScriptGeneric *gen) +{ + asWrapNative_p0_void_this_const(func,gen); +} + +template +static void asWrapNative_p0_this_const(R (C::*func)() const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( )); +} + +template +inline void asCallWrappedFunc(R (C::*func)() const,asIScriptGeneric *gen) +{ + asWrapNative_p0_this_const(func,gen); +} + +// 1 parameter(s) + +template +static void asWrapNative_p1_void(void (*func)(T1),asIScriptGeneric *gen) +{ + func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d ); +} + +template +inline void asCallWrappedFunc(void (*func)(T1),asIScriptGeneric *gen) +{ + asWrapNative_p1_void(func,gen); +} + +template +static void asWrapNative_p1(R (*func)(T1),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d )); +} + +template +inline void asCallWrappedFunc(R (*func)(T1),asIScriptGeneric *gen) +{ + asWrapNative_p1(func,gen); +} + +template +static void asWrapNative_p1_void_this(void (C::*func)(T1),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1),asIScriptGeneric *gen) +{ + asWrapNative_p1_void_this(func,gen); +} + +template +static void asWrapNative_p1_this(R (C::*func)(T1),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1),asIScriptGeneric *gen) +{ + asWrapNative_p1_this(func,gen); +} + +template +static void asWrapNative_p1_void_this_const(void (C::*func)(T1) const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1) const,asIScriptGeneric *gen) +{ + asWrapNative_p1_void_this_const(func,gen); +} + +template +static void asWrapNative_p1_this_const(R (C::*func)(T1) const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1) const,asIScriptGeneric *gen) +{ + asWrapNative_p1_this_const(func,gen); +} + +// 2 parameter(s) + +template +static void asWrapNative_p2_void(void (*func)(T1,T2),asIScriptGeneric *gen) +{ + func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d ); +} + +template +inline void asCallWrappedFunc(void (*func)(T1,T2),asIScriptGeneric *gen) +{ + asWrapNative_p2_void(func,gen); +} + +template +static void asWrapNative_p2(R (*func)(T1,T2),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d )); +} + +template +inline void asCallWrappedFunc(R (*func)(T1,T2),asIScriptGeneric *gen) +{ + asWrapNative_p2(func,gen); +} + +template +static void asWrapNative_p2_void_this(void (C::*func)(T1,T2),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2),asIScriptGeneric *gen) +{ + asWrapNative_p2_void_this(func,gen); +} + +template +static void asWrapNative_p2_this(R (C::*func)(T1,T2),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2),asIScriptGeneric *gen) +{ + asWrapNative_p2_this(func,gen); +} + +template +static void asWrapNative_p2_void_this_const(void (C::*func)(T1,T2) const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2) const,asIScriptGeneric *gen) +{ + asWrapNative_p2_void_this_const(func,gen); +} + +template +static void asWrapNative_p2_this_const(R (C::*func)(T1,T2) const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2) const,asIScriptGeneric *gen) +{ + asWrapNative_p2_this_const(func,gen); +} + +// 3 parameter(s) + +template +static void asWrapNative_p3_void(void (*func)(T1,T2,T3),asIScriptGeneric *gen) +{ + func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d ); +} + +template +inline void asCallWrappedFunc(void (*func)(T1,T2,T3),asIScriptGeneric *gen) +{ + asWrapNative_p3_void(func,gen); +} + +template +static void asWrapNative_p3(R (*func)(T1,T2,T3),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d )); +} + +template +inline void asCallWrappedFunc(R (*func)(T1,T2,T3),asIScriptGeneric *gen) +{ + asWrapNative_p3(func,gen); +} + +template +static void asWrapNative_p3_void_this(void (C::*func)(T1,T2,T3),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3),asIScriptGeneric *gen) +{ + asWrapNative_p3_void_this(func,gen); +} + +template +static void asWrapNative_p3_this(R (C::*func)(T1,T2,T3),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3),asIScriptGeneric *gen) +{ + asWrapNative_p3_this(func,gen); +} + +template +static void asWrapNative_p3_void_this_const(void (C::*func)(T1,T2,T3) const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3) const,asIScriptGeneric *gen) +{ + asWrapNative_p3_void_this_const(func,gen); +} + +template +static void asWrapNative_p3_this_const(R (C::*func)(T1,T2,T3) const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3) const,asIScriptGeneric *gen) +{ + asWrapNative_p3_this_const(func,gen); +} + +// 4 parameter(s) + +template +static void asWrapNative_p4_void(void (*func)(T1,T2,T3,T4),asIScriptGeneric *gen) +{ + func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d ); +} + +template +inline void asCallWrappedFunc(void (*func)(T1,T2,T3,T4),asIScriptGeneric *gen) +{ + asWrapNative_p4_void(func,gen); +} + +template +static void asWrapNative_p4(R (*func)(T1,T2,T3,T4),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d )); +} + +template +inline void asCallWrappedFunc(R (*func)(T1,T2,T3,T4),asIScriptGeneric *gen) +{ + asWrapNative_p4(func,gen); +} + +template +static void asWrapNative_p4_void_this(void (C::*func)(T1,T2,T3,T4),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4),asIScriptGeneric *gen) +{ + asWrapNative_p4_void_this(func,gen); +} + +template +static void asWrapNative_p4_this(R (C::*func)(T1,T2,T3,T4),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4),asIScriptGeneric *gen) +{ + asWrapNative_p4_this(func,gen); +} + +template +static void asWrapNative_p4_void_this_const(void (C::*func)(T1,T2,T3,T4) const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4) const,asIScriptGeneric *gen) +{ + asWrapNative_p4_void_this_const(func,gen); +} + +template +static void asWrapNative_p4_this_const(R (C::*func)(T1,T2,T3,T4) const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4) const,asIScriptGeneric *gen) +{ + asWrapNative_p4_this_const(func,gen); +} + +// 5 parameter(s) + +template +static void asWrapNative_p5_void(void (*func)(T1,T2,T3,T4,T5),asIScriptGeneric *gen) +{ + func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d ); +} + +template +inline void asCallWrappedFunc(void (*func)(T1,T2,T3,T4,T5),asIScriptGeneric *gen) +{ + asWrapNative_p5_void(func,gen); +} + +template +static void asWrapNative_p5(R (*func)(T1,T2,T3,T4,T5),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d )); +} + +template +inline void asCallWrappedFunc(R (*func)(T1,T2,T3,T4,T5),asIScriptGeneric *gen) +{ + asWrapNative_p5(func,gen); +} + +template +static void asWrapNative_p5_void_this(void (C::*func)(T1,T2,T3,T4,T5),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5),asIScriptGeneric *gen) +{ + asWrapNative_p5_void_this(func,gen); +} + +template +static void asWrapNative_p5_this(R (C::*func)(T1,T2,T3,T4,T5),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5),asIScriptGeneric *gen) +{ + asWrapNative_p5_this(func,gen); +} + +template +static void asWrapNative_p5_void_this_const(void (C::*func)(T1,T2,T3,T4,T5) const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5) const,asIScriptGeneric *gen) +{ + asWrapNative_p5_void_this_const(func,gen); +} + +template +static void asWrapNative_p5_this_const(R (C::*func)(T1,T2,T3,T4,T5) const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5) const,asIScriptGeneric *gen) +{ + asWrapNative_p5_this_const(func,gen); +} + +// 6 parameter(s) + +template +static void asWrapNative_p6_void(void (*func)(T1,T2,T3,T4,T5,T6),asIScriptGeneric *gen) +{ + func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d ); +} + +template +inline void asCallWrappedFunc(void (*func)(T1,T2,T3,T4,T5,T6),asIScriptGeneric *gen) +{ + asWrapNative_p6_void(func,gen); +} + +template +static void asWrapNative_p6(R (*func)(T1,T2,T3,T4,T5,T6),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d )); +} + +template +inline void asCallWrappedFunc(R (*func)(T1,T2,T3,T4,T5,T6),asIScriptGeneric *gen) +{ + asWrapNative_p6(func,gen); +} + +template +static void asWrapNative_p6_void_this(void (C::*func)(T1,T2,T3,T4,T5,T6),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5,T6),asIScriptGeneric *gen) +{ + asWrapNative_p6_void_this(func,gen); +} + +template +static void asWrapNative_p6_this(R (C::*func)(T1,T2,T3,T4,T5,T6),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5,T6),asIScriptGeneric *gen) +{ + asWrapNative_p6_this(func,gen); +} + +template +static void asWrapNative_p6_void_this_const(void (C::*func)(T1,T2,T3,T4,T5,T6) const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5,T6) const,asIScriptGeneric *gen) +{ + asWrapNative_p6_void_this_const(func,gen); +} + +template +static void asWrapNative_p6_this_const(R (C::*func)(T1,T2,T3,T4,T5,T6) const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5,T6) const,asIScriptGeneric *gen) +{ + asWrapNative_p6_this_const(func,gen); +} + +// 7 parameter(s) + +template +static void asWrapNative_p7_void(void (*func)(T1,T2,T3,T4,T5,T6,T7),asIScriptGeneric *gen) +{ + func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d ); +} + +template +inline void asCallWrappedFunc(void (*func)(T1,T2,T3,T4,T5,T6,T7),asIScriptGeneric *gen) +{ + asWrapNative_p7_void(func,gen); +} + +template +static void asWrapNative_p7(R (*func)(T1,T2,T3,T4,T5,T6,T7),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d )); +} + +template +inline void asCallWrappedFunc(R (*func)(T1,T2,T3,T4,T5,T6,T7),asIScriptGeneric *gen) +{ + asWrapNative_p7(func,gen); +} + +template +static void asWrapNative_p7_void_this(void (C::*func)(T1,T2,T3,T4,T5,T6,T7),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5,T6,T7),asIScriptGeneric *gen) +{ + asWrapNative_p7_void_this(func,gen); +} + +template +static void asWrapNative_p7_this(R (C::*func)(T1,T2,T3,T4,T5,T6,T7),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5,T6,T7),asIScriptGeneric *gen) +{ + asWrapNative_p7_this(func,gen); +} + +template +static void asWrapNative_p7_void_this_const(void (C::*func)(T1,T2,T3,T4,T5,T6,T7) const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5,T6,T7) const,asIScriptGeneric *gen) +{ + asWrapNative_p7_void_this_const(func,gen); +} + +template +static void asWrapNative_p7_this_const(R (C::*func)(T1,T2,T3,T4,T5,T6,T7) const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5,T6,T7) const,asIScriptGeneric *gen) +{ + asWrapNative_p7_this_const(func,gen); +} + +// 8 parameter(s) + +template +static void asWrapNative_p8_void(void (*func)(T1,T2,T3,T4,T5,T6,T7,T8),asIScriptGeneric *gen) +{ + func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d ); +} + +template +inline void asCallWrappedFunc(void (*func)(T1,T2,T3,T4,T5,T6,T7,T8),asIScriptGeneric *gen) +{ + asWrapNative_p8_void(func,gen); +} + +template +static void asWrapNative_p8(R (*func)(T1,T2,T3,T4,T5,T6,T7,T8),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d )); +} + +template +inline void asCallWrappedFunc(R (*func)(T1,T2,T3,T4,T5,T6,T7,T8),asIScriptGeneric *gen) +{ + asWrapNative_p8(func,gen); +} + +template +static void asWrapNative_p8_void_this(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8),asIScriptGeneric *gen) +{ + asWrapNative_p8_void_this(func,gen); +} + +template +static void asWrapNative_p8_this(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8),asIScriptGeneric *gen) +{ + asWrapNative_p8_this(func,gen); +} + +template +static void asWrapNative_p8_void_this_const(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8) const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8) const,asIScriptGeneric *gen) +{ + asWrapNative_p8_void_this_const(func,gen); +} + +template +static void asWrapNative_p8_this_const(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8) const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8) const,asIScriptGeneric *gen) +{ + asWrapNative_p8_this_const(func,gen); +} + +// 9 parameter(s) + +template +static void asWrapNative_p9_void(void (*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9),asIScriptGeneric *gen) +{ + func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d ); +} + +template +inline void asCallWrappedFunc(void (*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9),asIScriptGeneric *gen) +{ + asWrapNative_p9_void(func,gen); +} + +template +static void asWrapNative_p9(R (*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d )); +} + +template +inline void asCallWrappedFunc(R (*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9),asIScriptGeneric *gen) +{ + asWrapNative_p9(func,gen); +} + +template +static void asWrapNative_p9_void_this(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9),asIScriptGeneric *gen) +{ + asWrapNative_p9_void_this(func,gen); +} + +template +static void asWrapNative_p9_this(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9),asIScriptGeneric *gen) +{ + asWrapNative_p9_this(func,gen); +} + +template +static void asWrapNative_p9_void_this_const(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9) const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9) const,asIScriptGeneric *gen) +{ + asWrapNative_p9_void_this_const(func,gen); +} + +template +static void asWrapNative_p9_this_const(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9) const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9) const,asIScriptGeneric *gen) +{ + asWrapNative_p9_this_const(func,gen); +} + +// 10 parameter(s) + +template +static void asWrapNative_p10_void(void (*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10),asIScriptGeneric *gen) +{ + func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(9))->d ); +} + +template +inline void asCallWrappedFunc(void (*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10),asIScriptGeneric *gen) +{ + asWrapNative_p10_void(func,gen); +} + +template +static void asWrapNative_p10(R (*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( func( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(9))->d )); +} + +template +inline void asCallWrappedFunc(R (*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10),asIScriptGeneric *gen) +{ + asWrapNative_p10(func,gen); +} + +template +static void asWrapNative_p10_void_this(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10),asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(9))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10),asIScriptGeneric *gen) +{ + asWrapNative_p10_void_this(func,gen); +} + +template +static void asWrapNative_p10_this(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10),asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(9))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10),asIScriptGeneric *gen) +{ + asWrapNative_p10_this(func,gen); +} + +template +static void asWrapNative_p10_void_this_const(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10) const,asIScriptGeneric *gen) +{ + ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(9))->d ); +} + +template +inline void asCallWrappedFunc(void (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10) const,asIScriptGeneric *gen) +{ + asWrapNative_p10_void_this_const(func,gen); +} + +template +static void asWrapNative_p10_this_const(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10) const,asIScriptGeneric *gen) +{ + new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ((*((C*)gen->GetObject())).*func)( ((as_wrapNative_helper *)gen->GetAddressOfArg(0))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(1))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(2))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(3))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(4))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(5))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(6))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(7))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(8))->d, ((as_wrapNative_helper *)gen->GetAddressOfArg(9))->d )); +} + +template +inline void asCallWrappedFunc(R (C::*func)(T1,T2,T3,T4,T5,T6,T7,T8,T9,T10) const,asIScriptGeneric *gen) +{ + asWrapNative_p10_this_const(func,gen); +} + +#endif // ASWRAPPEDCALL_H + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generateheader.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generateheader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generateheader.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generateheader.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,190 @@ +// +// This generator creates a header file that implements automatic +// wrapper functions for the generic calling convention. +// +// Originally implmented by George Yohng from 4Front Technologies in 2009-03-11 +// + +#include + +// Generate templates for up to this number of function parameters +const int MAXPARAM = 10; + + +int main() +{ + printf("#ifndef ASWRAPPEDCALL_H\n" + "#define ASWRAPPEDCALL_H\n\n"); + + // Add some instructions on how to use this + printf("// Generate the wrappers by calling the macros in global scope. \n"); + printf("// Then register the wrapper function with the script engine using the asCALL_GENERIC \n"); + printf("// calling convention. The wrapper can handle both global functions and class methods.\n"); + printf("//\n"); + printf("// Example:\n"); + printf("//\n"); + printf("// asDECLARE_FUNCTION_WRAPPER(MyGenericWrapper, MyRealFunction);\n"); + printf("// asDECLARE_FUNCTION_WRAPPERPR(MyGenericOverloadedWrapper, MyOverloadedFunction, (int), void);\n"); + printf("// asDECLARE_METHOD_WRAPPER(MyGenericMethodWrapper, MyClass, Method);\n"); + printf("// asDECLARE_METHOD_WRAPPERPR(MyGenericOverloadedMethodWrapper, MyClass, Method, (int) const, void);\n"); + printf("//\n"); + printf("// This file was generated to accept functions with a maximum of %d parameters.\n\n", MAXPARAM); + + // Include files + printf("#include // placement new\n"); + printf("#include \n\n"); + + // This is the macro that should be used to implement the wrappers + printf("#define asDECLARE_FUNCTION_WRAPPER(wrapper_name,func) \\\n" + " static void wrapper_name(asIScriptGeneric *gen)\\\n" + " { \\\n" + " asCallWrappedFunc(&func,gen);\\\n" + " }\n\n" ); + printf("#define asDECLARE_FUNCTION_WRAPPERPR(wrapper_name,func,params,rettype) \\\n" + " static void wrapper_name(asIScriptGeneric *gen)\\\n" + " { \\\n" + " asCallWrappedFunc((rettype (*)params)(&func),gen);\\\n" + " }\n\n" ); + printf("#define asDECLARE_METHOD_WRAPPER(wrapper_name,cl,func) \\\n" + " static void wrapper_name(asIScriptGeneric *gen)\\\n" + " { \\\n" + " asCallWrappedFunc(&cl::func,gen);\\\n" + " }\n\n" ); + printf("#define asDECLARE_METHOD_WRAPPERPR(wrapper_name,cl,func,params,rettype) \\\n" + " static void wrapper_name(asIScriptGeneric *gen)\\\n" + " { \\\n" + " asCallWrappedFunc((rettype (cl::*)params)(&cl::func),gen);\\\n" + " }\n\n" ); + + printf("// A helper class to accept reference parameters\n"); + printf("template\n" + "class as_wrapNative_helper\n" + "{\n" + "public:\n" + " X d;\n" + " as_wrapNative_helper(X d_) : d(d_) {}\n" + "};\n\n"); + + // Iterate over the number of parameters + for(int t = 0; t <= MAXPARAM; t++) + { + printf("// %d parameter(s)\n\n", t); + + // Iterate over the different function forms + for(int d = 0; d < 6; d++) + { + int k; + + // Different forms of the function + static const char *start[]= + {"template<", // global function with no return type + "template0) || (d>0) ) + { + printf("%s",start[d]); + + for(int k=0;k0))?",":"",k+1); + + printf(">\n"); + } + + printf("static void asWrapNative_p%d%s(",t,signature[d]); + printf("%s (%s*func)(" ,(d&1)?"R":"void", (d>1)?"C::":""); + for(k=0;k0)||(d>0))?"gen":""); + printf("{\n"); + printf(" %s%s(",(d&1)?"new(gen->GetAddressOfReturnLocation()) as_wrapNative_helper( ":"", + + (d>1)?"((*((C*)gen->GetObject())).*func)":"func"); + + for( k = 0; k < t; k++ ) + printf("%s ((as_wrapNative_helper *)gen->GetAddressOfArg(%d))->d",k?",":"",k+1,k); + + printf(" )%s;\n" + "}\n\n",(d&1)?")":""); + + //---------- + // Generate the function that calls the templated wrapper function. + // This is overloads for the asCallWrappedFunc functions + + // Build the template declaration + if( (t>0) || (d>0) ) + { + printf("%s",start[d]); + + for(int k=0;k0))?",":"", k+1); + + printf(">\n"); + } + + printf("inline void asCallWrappedFunc(%s (%s*func)(", (d&1)?"R":"void", (d>1)?"C::":""); + + for( k =0; k < t; k++ ) + printf("%sT%d",k?",":"",k+1); + + printf(")%s,asIScriptGeneric *gen)\n" + "{\n" + " asWrapNative_p%d%s",constness[d],t,signature[d]); + + if( (t>0) || (d>0) ) + { + printf("%s",start2[d]); + + for( int k = 0; k < t; k++ ) + printf("%sT%d",(k||(d>0))?",":"",k+1); + + printf(">"); + } + printf("(func,gen);\n" + "}\n\n"); + } + + } + + printf("#endif // ASWRAPPEDCALL_H\n\n"); + + return 0; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.dsp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.dsp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.dsp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.dsp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,100 @@ +# Microsoft Developer Studio Project File - Name="generator" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=generator - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "generator.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "generator.mak" CFG="generator - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "generator - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "generator - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "generator - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "generator - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "generator - Win32 Release" +# Name "generator - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\generateheader.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.dsw kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.dsw --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.dsw 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.dsw 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "generator"=.\generator.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.sln kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.sln --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.sln 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.sln 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,23 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generator", "generator.vcproj", "{C2DC249D-8D7E-4D1B-8616-4532EFFD9E2A}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {C2DC249D-8D7E-4D1B-8616-4532EFFD9E2A}.Debug.ActiveCfg = Debug|Win32 + {C2DC249D-8D7E-4D1B-8616-4532EFFD9E2A}.Debug.Build.0 = Debug|Win32 + {C2DC249D-8D7E-4D1B-8616-4532EFFD9E2A}.Release.ActiveCfg = Release|Win32 + {C2DC249D-8D7E-4D1B-8616-4532EFFD9E2A}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.vcproj kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.vcproj --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/autowrapper/generator/generator.vcproj 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/angelscript_c.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/angelscript_c.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/angelscript_c.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/angelscript_c.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,578 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// angelscript_c.h +// +// The script engine interface for the C language. +// +// The idea is that the library should be compiled with a C++ compiler with the AS_C_INTERFACE +// preprocessor word defined. The C application will then be able to link with the library and +// use this header file to interact with it. +// +// Note: This header file is not yet complete. I'd appreciate any help with completing it. +// + +#ifndef ANGELSCRIPT_C_H +#define ANGELSCRIPT_C_H + +#define ANGELSCRIPT_VERSION 21800 +#define ANGELSCRIPT_VERSION_STRING "2.18.0" + +#ifdef AS_USE_NAMESPACE + #define BEGIN_AS_NAMESPACE namespace AngelScript { + #define END_AS_NAMESPACE } +#else + #define BEGIN_AS_NAMESPACE + #define END_AS_NAMESPACE +#endif + +BEGIN_AS_NAMESPACE + +typedef enum { asTRUE = 1, asFALSE = 0 } asBOOL; +typedef unsigned char asBYTE; +typedef unsigned short asWORD; +typedef unsigned int asUINT; +typedef size_t asPWORD; +#ifdef __LP64__ + typedef unsigned int asDWORD; + typedef unsigned long asQWORD; + typedef long asINT64; +#else + typedef unsigned long asDWORD; + #if defined(__GNUC__) || defined(__MWERKS__) + typedef unsigned long long asQWORD; + typedef long long asINT64; + #else + typedef unsigned __int64 asQWORD; + typedef __int64 asINT64; + #endif +#endif + +// Enumerations and constants + +// Engine properties +typedef enum +{ + asEP_ALLOW_UNSAFE_REFERENCES = 1, + asEP_OPTIMIZE_BYTECODE = 2, + asEP_COPY_SCRIPT_SECTIONS = 3, + asEP_MAX_STACK_SIZE = 4, + asEP_USE_CHARACTER_LITERALS = 5, + asEP_ALLOW_MULTILINE_STRINGS = 6, + asEP_ALLOW_IMPLICIT_HANDLE_TYPES = 7, + asEP_BUILD_WITHOUT_LINE_CUES = 8, + asEP_INIT_GLOBAL_VARS_AFTER_BUILD = 9, + asEP_REQUIRE_ENUM_SCOPE = 10, + asEP_SCRIPT_SCANNER = 11, + asEP_INCLUDE_JIT_INSTRUCTIONS = 12, + asEP_STRING_ENCODING = 13 +} asEEngineProp; + +// Calling conventions +typedef enum +{ + asCALL_CDECL = 0, + asCALL_STDCALL = 1, + asCALL_THISCALL = 2, + asCALL_CDECL_OBJLAST = 3, + asCALL_CDECL_OBJFIRST = 4, + asCALL_GENERIC = 5 +} asECallConvTypes; + +// Object type flags +typedef enum +{ + asOBJ_REF = 0x01, + asOBJ_VALUE = 0x02, + asOBJ_GC = 0x04, + asOBJ_POD = 0x08, + asOBJ_NOHANDLE = 0x10, + asOBJ_SCOPED = 0x20, + asOBJ_APP_CLASS = 0x100, + asOBJ_APP_CLASS_CONSTRUCTOR = 0x200, + asOBJ_APP_CLASS_DESTRUCTOR = 0x400, + asOBJ_APP_CLASS_ASSIGNMENT = 0x800, + asOBJ_APP_CLASS_C = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR), + asOBJ_APP_CLASS_CD = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_DESTRUCTOR), + asOBJ_APP_CLASS_CA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), + asOBJ_APP_CLASS_CDA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_DESTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), + asOBJ_APP_CLASS_D = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_DESTRUCTOR), + asOBJ_APP_CLASS_A = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_ASSIGNMENT), + asOBJ_APP_CLASS_DA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_DESTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), + asOBJ_APP_PRIMITIVE = 0x1000, + asOBJ_APP_FLOAT = 0x2000, + asOBJ_MASK_VALID_FLAGS = 0x3F3F, + asOBJ_SCRIPT_OBJECT = 0x10000 +} asEObjTypeFlags; + +// Behaviours +typedef enum +{ + // Value object memory management + asBEHAVE_CONSTRUCT, + asBEHAVE_DESTRUCT, + + // Reference object memory management + asBEHAVE_FACTORY, + asBEHAVE_ADDREF, + asBEHAVE_RELEASE, + + // Object operators + asBEHAVE_VALUE_CAST, + asBEHAVE_IMPLICIT_VALUE_CAST, + asBEHAVE_REF_CAST, + asBEHAVE_IMPLICIT_REF_CAST, + asBEHAVE_INDEX, + asBEHAVE_TEMPLATE_CALLBACK, + + // Garbage collection behaviours + asBEHAVE_FIRST_GC, + asBEHAVE_GETREFCOUNT = asBEHAVE_FIRST_GC, + asBEHAVE_SETGCFLAG, + asBEHAVE_GETGCFLAG, + asBEHAVE_ENUMREFS, + asBEHAVE_RELEASEREFS, + asBEHAVE_LAST_GC = asBEHAVE_RELEASEREFS +} asEBehaviours; + +// Return codes +typedef enum +{ + asSUCCESS = 0, + asERROR = -1, + asCONTEXT_ACTIVE = -2, + asCONTEXT_NOT_FINISHED = -3, + asCONTEXT_NOT_PREPARED = -4, + asINVALID_ARG = -5, + asNO_FUNCTION = -6, + asNOT_SUPPORTED = -7, + asINVALID_NAME = -8, + asNAME_TAKEN = -9, + asINVALID_DECLARATION = -10, + asINVALID_OBJECT = -11, + asINVALID_TYPE = -12, + asALREADY_REGISTERED = -13, + asMULTIPLE_FUNCTIONS = -14, + asNO_MODULE = -15, + asNO_GLOBAL_VAR = -16, + asINVALID_CONFIGURATION = -17, + asINVALID_INTERFACE = -18, + asCANT_BIND_ALL_FUNCTIONS = -19, + asLOWER_ARRAY_DIMENSION_NOT_REGISTERED = -20, + asWRONG_CONFIG_GROUP = -21, + asCONFIG_GROUP_IS_IN_USE = -22, + asILLEGAL_BEHAVIOUR_FOR_TYPE = -23, + asWRONG_CALLING_CONV = -24, + asMODULE_IS_IN_USE = -25, + asBUILD_IN_PROGRESS = -26, + asINIT_GLOBAL_VARS_FAILED = -27 +} asERetCodes; + +// Context states +typedef enum +{ + asEXECUTION_FINISHED = 0, + asEXECUTION_SUSPENDED = 1, + asEXECUTION_ABORTED = 2, + asEXECUTION_EXCEPTION = 3, + asEXECUTION_PREPARED = 4, + asEXECUTION_UNINITIALIZED = 5, + asEXECUTION_ACTIVE = 6, + asEXECUTION_ERROR = 7 +} asEContextState; + +// ExecuteString flags +typedef enum +{ + asEXECSTRING_ONLY_PREPARE = 1, + asEXECSTRING_USE_MY_CONTEXT = 2 +} asEExecStrFlags; + +// Message types +typedef enum +{ + asMSGTYPE_ERROR = 0, + asMSGTYPE_WARNING = 1, + asMSGTYPE_INFORMATION = 2 +} asEMsgType; + +// Garbage collector flags +typedef enum +{ + asGC_FULL_CYCLE = 1, + asGC_ONE_STEP = 2, + asGC_DESTROY_GARBAGE = 4, + asGC_DETECT_GARBAGE = 8 +} asEGCFlags; + +// Prepare flags +const int asPREPARE_PREVIOUS = -1; + +// Config groups +const char * const asALL_MODULES = (const char * const)-1; + +// Type id flags +typedef enum +{ + asTYPEID_VOID = 0, + asTYPEID_BOOL = 1, + asTYPEID_INT8 = 2, + asTYPEID_INT16 = 3, + asTYPEID_INT32 = 4, + asTYPEID_INT64 = 5, + asTYPEID_UINT8 = 6, + asTYPEID_UINT16 = 7, + asTYPEID_UINT32 = 8, + asTYPEID_UINT64 = 9, + asTYPEID_FLOAT = 10, + asTYPEID_DOUBLE = 11, + asTYPEID_OBJHANDLE = 0x40000000, + asTYPEID_HANDLETOCONST = 0x20000000, + asTYPEID_MASK_OBJECT = 0x1C000000, + asTYPEID_APPOBJECT = 0x04000000, + asTYPEID_SCRIPTOBJECT = 0x0C000000, + asTYPEID_SCRIPTARRAY = 0x10000000, + asTYPEID_MASK_SEQNBR = 0x03FFFFFF +} asETypeIdFlags; + +// GetModule flags +typedef enum +{ + asGM_ONLY_IF_EXISTS = 0, + asGM_CREATE_IF_NOT_EXISTS = 1, + asGM_ALWAYS_CREATE = 2 +} asEGMFlags; + +typedef struct +{ + const char *section; + int row; + int col; + asEMsgType type; + const char *message; +} asSMessageInfo; + +typedef struct asIScriptEngine asIScriptEngine; +typedef struct asIScriptModule asIScriptModule; +typedef struct asIScriptContext asIScriptContext; +typedef struct asIScriptGeneric asIScriptGeneric; +typedef struct asIScriptObject asIScriptObject; +typedef struct asIScriptArray asIScriptArray; +typedef struct asIObjectType asIObjectType; +typedef struct asIScriptFunction asIScriptFunction; +typedef struct asIBinaryStream asIBinaryStream; + +typedef void (*asBINARYREADFUNC_t)(void *ptr, asUINT size, void *param); +typedef void (*asBINARYWRITEFUNC_t)(const void *ptr, asUINT size, void *param); +typedef void *(*asALLOCFUNC_t)(size_t); +typedef void (*asFREEFUNC_t)(void *); +typedef void (*asFUNCTION_t)(); + +// API functions + +// ANGELSCRIPT_EXPORT is defined when compiling the dll or lib +// ANGELSCRIPT_DLL_LIBRARY_IMPORT is defined when dynamically linking to the +// dll through the link lib automatically generated by MSVC++ +// ANGELSCRIPT_DLL_MANUAL_IMPORT is defined when manually loading the dll +// Don't define anything when linking statically to the lib + +#ifdef WIN32 + #ifdef ANGELSCRIPT_EXPORT + #define AS_API __declspec(dllexport) + #elif defined ANGELSCRIPT_DLL_LIBRARY_IMPORT + #define AS_API __declspec(dllimport) + #else // statically linked library + #define AS_API + #endif +#else + #define AS_API +#endif + +#ifndef ANGELSCRIPT_DLL_MANUAL_IMPORT +#ifdef __cplusplus +extern "C" +{ +#endif + // Engine + AS_API asIScriptEngine * asCreateScriptEngine(asDWORD version); + AS_API const char * asGetLibraryVersion(); + AS_API const char * asGetLibraryOptions(); + + // Context + AS_API asIScriptContext * asGetActiveContext(); + + // Thread support + AS_API int asThreadCleanup(); + + // Memory management + AS_API int asSetGlobalMemoryFunctions(asALLOCFUNC_t allocFunc, asFREEFUNC_t freeFunc); + AS_API int asResetGlobalMemoryFunctions(); + + AS_API int asEngine_AddRef(asIScriptEngine *e); + AS_API int asEngine_Release(asIScriptEngine *e); + AS_API int asEngine_SetEngineProperty(asIScriptEngine *e, asEEngineProp property, asPWORD value); + AS_API asPWORD asEngine_GetEngineProperty(asIScriptEngine *e, asEEngineProp property); + AS_API int asEngine_SetMessageCallback(asIScriptEngine *e, asFUNCTION_t callback, void *obj, asDWORD callConv); + AS_API int asEngine_ClearMessageCallback(asIScriptEngine *e); + AS_API int asEngine_WriteMessage(asIScriptEngine *e, const char *section, int row, int col, asEMsgType type, const char *message); + AS_API int asEngine_RegisterObjectType(asIScriptEngine *e, const char *name, int byteSize, asDWORD flags); + AS_API int asEngine_RegisterObjectProperty(asIScriptEngine *e, const char *obj, const char *declaration, int byteOffset); + AS_API int asEngine_RegisterObjectMethod(asIScriptEngine *e, const char *obj, const char *declaration, asFUNCTION_t funcPointer, asDWORD callConv); + AS_API int asEngine_RegisterObjectBehaviour(asIScriptEngine *e, const char *datatype, asEBehaviours behaviour, const char *declaration, asFUNCTION_t funcPointer, asDWORD callConv); + AS_API int asEngine_RegisterGlobalProperty(asIScriptEngine *e, const char *declaration, void *pointer); + AS_API int asEngine_GetGlobalPropertyCount(asIScriptEngine *e); + AS_API int asEngine_GetGlobalPropertyByIndex(asIScriptEngine *e, asUINT index, const char **name, int *typeId, asBOOL *isConst, const char **configGroup, void **pointer); + AS_API int asEngine_RegisterGlobalFunction(asIScriptEngine *e, const char *declaration, asFUNCTION_t funcPointer, asDWORD callConv); + AS_API int asEngine_GetGlobalFunctionCount(asIScriptEngine *e); + AS_API int asEngine_GetGlobalFunctionIdByIndex(asIScriptEngine *e, asUINT index); + AS_API int asEngine_RegisterInterface(asIScriptEngine *e, const char *name); + AS_API int asEngine_RegisterInterfaceMethod(asIScriptEngine *e, const char *intf, const char *declaration); + AS_API int asEngine_RegisterStringFactory(asIScriptEngine *e, const char *datatype, asFUNCTION_t factoryFunc, asDWORD callConv); + AS_API int asEngine_GetStringFactoryReturnTypeId(asIScriptEngine *e); + AS_API int asEngine_RegisterEnum(asIScriptEngine *e, const char *type); + AS_API int asEngine_RegisterEnumValue(asIScriptEngine *e, const char *type, const char *name, int value); + AS_API int asEngine_GetEnumCount(asIScriptEngine *e); + AS_API const char * asEngine_GetEnumByIndex(asIScriptEngine *e, asUINT index, int *enumTypeId, const char **configGroup); + AS_API int asEngine_GetEnumValueCount(asIScriptEngine *e, int enumTypeId); + AS_API const char * asEngine_GetEnumValueByIndex(asIScriptEngine *e, int enumTypeId, asUINT index, int *outValue); + AS_API int asEngine_RegisterTypedef(asIScriptEngine *e, const char *type, const char *decl); + AS_API int asEngine_GetTypedefCount(asIScriptEngine *e); + AS_API const char * asEngine_GetTypedefByIndex(asIScriptEngine *e, asUINT index, int *typeId, const char **configGroup); + AS_API int asEngine_BeginConfigGroup(asIScriptEngine *e, const char *groupName); + AS_API int asEngine_EndConfigGroup(asIScriptEngine *e); + AS_API int asEngine_RemoveConfigGroup(asIScriptEngine *e, const char *groupName); + AS_API int asEngine_SetConfigGroupModuleAccess(asIScriptEngine *e, const char *groupName, const char *module, asBOOL hasAccess); + AS_API asIScriptModule * asEngine_GetModule(asIScriptEngine *e, const char *module, asEGMFlags flag); + AS_API int asEngine_DiscardModule(asIScriptEngine *e, const char *module); + AS_API asIScriptFunction *asEngine_GetFunctionDescriptorById(asIScriptEngine *e, int funcId); + AS_API int asEngine_GetTypeIdByDecl(asIScriptEngine *e, const char *decl); + AS_API const char * asEngine_GetTypeDeclaration(asIScriptEngine *e, int typeId); + AS_API int asEngine_GetSizeOfPrimitiveType(asIScriptEngine *e, int typeId); + AS_API asIObjectType * asEngine_GetObjectTypeById(asIScriptEngine *e, int typeId); + AS_API asIObjectType * asEngine_GetObjectTypeByIndex(asIScriptEngine *e, asUINT index); + AS_API int asEngine_GetObjectTypeCount(asIScriptEngine *e); + AS_API asIScriptContext * asEngine_CreateContext(asIScriptEngine *e); + AS_API void * asEngine_CreateScriptObject(asIScriptEngine *e, int typeId); + AS_API void * asEngine_CreateScriptObjectCopy(asIScriptEngine *e, void *obj, int typeId); + AS_API void asEngine_CopyScriptObject(asIScriptEngine *e, void *dstObj, void *srcObj, int typeId); + AS_API void asEngine_ReleaseScriptObject(asIScriptEngine *e, void *obj, int typeId); + AS_API void asEngine_AddRefScriptObject(asIScriptEngine *e, void *obj, int typeId); + AS_API asBOOL asEngine_IsHandleCompatibleWithObject(asIScriptEngine *e, void *obj, int objTypeId, int handleTypeId); + AS_API int asEngine_ExecuteString(asIScriptEngine *e, const char *module, const char *script, asIScriptContext **ctx, asDWORD flags); + AS_API int asEngine_GarbageCollect(asIScriptEngine *e, asDWORD flags); + AS_API void asEngine_GetGCStatistics(asIScriptEngine *e, asUINT *currentSize, asUINT *totalDestroyed, asUINT *totalDetected); + AS_API void asEngine_NotifyGarbageCollectorOfNewObject(asIScriptEngine *e, void *obj, int typeId); + AS_API void asEngine_GCEnumCallback(asIScriptEngine *e, void *obj); + AS_API void * asEngine_SetUserData(asIScriptEngine *e, void *data); + AS_API void * asEngine_GetUserData(asIScriptEngine *e); + + AS_API asIScriptEngine *asModule_GetEngine(asIScriptModule *m); + AS_API void asModule_SetName(asIScriptModule *m, const char *name); + AS_API const char *asModule_GetName(asIScriptModule *m); + AS_API int asModule_AddScriptSection(asIScriptModule *m, const char *name, const char *code, size_t codeLength, int lineOffset); + AS_API int asModule_Build(asIScriptModule *m); + AS_API int asModule_GetFunctionCount(asIScriptModule *m); + AS_API int asModule_GetFunctionIdByIndex(asIScriptModule *m, int index); + AS_API int asModule_GetFunctionIdByName(asIScriptModule *m, const char *name); + AS_API int asModule_GetFunctionIdByDecl(asIScriptModule *m, const char *decl); + AS_API asIScriptFunction *asModule_GetFunctionDescriptorByIndex(asIScriptModule *m, int index); + AS_API asIScriptFunction *asModule_GetFunctionDescriptorById(asIScriptModule *m, int funcId); + AS_API int asModule_ResetGlobalVars(asIScriptModule *m); + AS_API int asModule_GetGlobalVarCount(asIScriptModule *m); + AS_API int asModule_GetGlobalVarIndexByName(asIScriptModule *m, const char *name); + AS_API int asModule_GetGlobalVarIndexByDecl(asIScriptModule *m, const char *decl); + AS_API const char *asModule_GetGlobalVarDeclaration(asIScriptModule *m, int index); + AS_API const char *asModule_GetGlobalVarName(asIScriptModule *m, int index); + AS_API int asModule_GetGlobalVarTypeId(asIScriptModule *m, int index, asBOOL *isConst); + AS_API void *asModule_GetAddressOfGlobalVar(asIScriptModule *m, int index); + AS_API int asModule_GetObjectTypeCount(asIScriptModule *m); + AS_API asIObjectType *asModule_GetObjectTypeByIndex(asIScriptModule *m, asUINT index); + AS_API int asModule_GetTypeIdByDecl(asIScriptModule *m, const char *decl); + AS_API int asModule_GetEnumCount(asIScriptModule *m); + AS_API const char * asModule_GetEnumByIndex(asIScriptModule *m, asUINT index, int *enumTypeId); + AS_API int asModule_GetEnumValueCount(asIScriptModule *m, int enumTypeId); + AS_API const char * asModule_GetEnumValueByIndex(asIScriptModule *m, int enumTypeId, asUINT index, int *outValue); + AS_API int asModule_GetTypedefCount(asIScriptModule *m); + AS_API const char * asModule_GetTypedefByIndex(asIScriptModule *m, asUINT index, int *typeId); + AS_API int asModule_GetImportedFunctionCount(asIScriptModule *m); + AS_API int asModule_GetImportedFunctionIndexByDecl(asIScriptModule *m, const char *decl); + AS_API const char *asModule_GetImportedFunctionDeclaration(asIScriptModule *m, int importIndex); + AS_API const char *asModule_GetImportedFunctionSourceModule(asIScriptModule *m, int importIndex); + AS_API int asModule_BindImportedFunction(asIScriptModule *m, int importIndex, int funcId); + AS_API int asModule_UnbindImportedFunction(asIScriptModule *m, int importIndex); + AS_API int asModule_BindAllImportedFunctions(asIScriptModule *m); + AS_API int asModule_UnbindAllImportedFunctions(asIScriptModule *m); + AS_API int asModule_SaveByteCode(asIScriptModule *m, asIBinaryStream *out); + AS_API int asModule_LoadByteCode(asIScriptModule *m, asIBinaryStream *in); + + AS_API int asContext_AddRef(asIScriptContext *c); + AS_API int asContext_Release(asIScriptContext *c); + AS_API asIScriptEngine *asContext_GetEngine(asIScriptContext *c); + AS_API int asContext_GetState(asIScriptContext *c); + AS_API int asContext_Prepare(asIScriptContext *c, int funcID); + AS_API int asContext_SetArgByte(asIScriptContext *c, asUINT arg, asBYTE value); + AS_API int asContext_SetArgWord(asIScriptContext *c, asUINT arg, asWORD value); + AS_API int asContext_SetArgDWord(asIScriptContext *c, asUINT arg, asDWORD value); + AS_API int asContext_SetArgQWord(asIScriptContext *c, asUINT arg, asQWORD value); + AS_API int asContext_SetArgFloat(asIScriptContext *c, asUINT arg, float value); + AS_API int asContext_SetArgDouble(asIScriptContext *c, asUINT arg, double value); + AS_API int asContext_SetArgAddress(asIScriptContext *c, asUINT arg, void *addr); + AS_API int asContext_SetArgObject(asIScriptContext *c, asUINT arg, void *obj); + AS_API void * asContext_GetAddressOfArg(asIScriptContext *c, asUINT arg); + AS_API int asContext_SetObject(asIScriptContext *c, void *obj); + AS_API asBYTE asContext_GetReturnByte(asIScriptContext *c); + AS_API asWORD asContext_GetReturnWord(asIScriptContext *c); + AS_API asDWORD asContext_GetReturnDWord(asIScriptContext *c); + AS_API asQWORD asContext_GetReturnQWord(asIScriptContext *c); + AS_API float asContext_GetReturnFloat(asIScriptContext *c); + AS_API double asContext_GetReturnDouble(asIScriptContext *c); + AS_API void * asContext_GetReturnAddress(asIScriptContext *c); + AS_API void * asContext_GetReturnObject(asIScriptContext *c); + AS_API void * asContext_GetAddressOfReturnValue(asIScriptContext *c); + AS_API int asContext_Execute(asIScriptContext *c); + AS_API int asContext_Abort(asIScriptContext *c); + AS_API int asContext_Suspend(asIScriptContext *c); + AS_API int asContext_GetCurrentLineNumber(asIScriptContext *c, int *column); + AS_API int asContext_GetCurrentFunction(asIScriptContext *c); + AS_API int asContext_SetException(asIScriptContext *c, const char *string); + AS_API int asContext_GetExceptionLineNumber(asIScriptContext *c, int *column); + AS_API int asContext_GetExceptionFunction(asIScriptContext *c); + AS_API const char * asContext_GetExceptionString(asIScriptContext *c); + AS_API int asContext_SetLineCallback(asIScriptContext *c, asFUNCTION_t callback, void *obj, int callConv); + AS_API void asContext_ClearLineCallback(asIScriptContext *c); + AS_API int asContext_SetExceptionCallback(asIScriptContext *c, asFUNCTION_t callback, void *obj, int callConv); + AS_API void asContext_ClearExceptionCallback(asIScriptContext *c); + AS_API int asContext_GetCallstackSize(asIScriptContext *c); + AS_API int asContext_GetCallstackFunction(asIScriptContext *c, int index); + AS_API int asContext_GetCallstackLineNumber(asIScriptContext *c, int index, int *column); + AS_API int asContext_GetVarCount(asIScriptContext *c, int stackLevel); + AS_API const char * asContext_GetVarName(asIScriptContext *c, int varIndex, int stackLevel); + AS_API const char * asContext_GetVarDeclaration(asIScriptContext *c, int varIndex, int stackLevel); + AS_API int asContext_GetVarTypeId(asIScriptContext *c, int varIndex, int stackLevel); + AS_API void * asContext_GetAddressOfVar(asIScriptContext *c, int varIndex, int stackLevel); + AS_API int asContext_GetThisTypeId(asIScriptContext *c, int stackLevel); + AS_API void * asContext_GetThisPointer(asIScriptContext *c, int stackLevel); + AS_API void * asContext_SetUserData(asIScriptContext *c, void *data); + AS_API void * asContext_GetUserData(asIScriptContext *c); + + AS_API asIScriptEngine *asGeneric_GetEngine(asIScriptGeneric *g); + AS_API int asGeneric_GetFunctionId(asIScriptGeneric *g); + AS_API void * asGeneric_GetObject(asIScriptGeneric *g); + AS_API int asGeneric_GetObjectTypeId(asIScriptGeneric *g); + AS_API int asGeneric_GetArgCount(asIScriptGeneric *g); + AS_API asBYTE asGeneric_GetArgByte(asIScriptGeneric *g, asUINT arg); + AS_API asWORD asGeneric_GetArgWord(asIScriptGeneric *g, asUINT arg); + AS_API asDWORD asGeneric_GetArgDWord(asIScriptGeneric *g, asUINT arg); + AS_API asQWORD asGeneric_GetArgQWord(asIScriptGeneric *g, asUINT arg); + AS_API float asGeneric_GetArgFloat(asIScriptGeneric *g, asUINT arg); + AS_API double asGeneric_GetArgDouble(asIScriptGeneric *g, asUINT arg); + AS_API void * asGeneric_GetArgAddress(asIScriptGeneric *g, asUINT arg); + AS_API void * asGeneric_GetArgObject(asIScriptGeneric *g, asUINT arg); + AS_API void * asGeneric_GetAddressOfArg(asIScriptGeneric *g, asUINT arg); + AS_API int asGeneric_GetArgTypeId(asIScriptGeneric *g, asUINT arg); + AS_API int asGeneric_SetReturnByte(asIScriptGeneric *g, asBYTE val); + AS_API int asGeneric_SetReturnWord(asIScriptGeneric *g, asWORD val); + AS_API int asGeneric_SetReturnDWord(asIScriptGeneric *g, asDWORD val); + AS_API int asGeneric_SetReturnQWord(asIScriptGeneric *g, asQWORD val); + AS_API int asGeneric_SetReturnFloat(asIScriptGeneric *g, float val); + AS_API int asGeneric_SetReturnDouble(asIScriptGeneric *g, double val); + AS_API int asGeneric_SetReturnAddress(asIScriptGeneric *g, void *addr); + AS_API int asGeneric_SetReturnObject(asIScriptGeneric *g, void *obj); + AS_API void * asGeneric_GetAddressOfReturnLocation(asIScriptGeneric *g); + AS_API int asGeneric_GetReturnTypeId(asIScriptGeneric *g); + + AS_API asIScriptEngine *asObject_GetEngine(asIScriptObject *s); + AS_API int asObject_AddRef(asIScriptObject *s); + AS_API int asObject_Release(asIScriptObject *s); + AS_API int asObject_GetTypeId(asIScriptObject *s); + AS_API asIObjectType * asObject_GetObjectType(asIScriptObject *s); + AS_API int asObject_GetPropertyCount(asIScriptObject *s); + AS_API int asObject_GetPropertyTypeId(asIScriptObject *s, asUINT prop); + AS_API const char * asObject_GetPropertyName(asIScriptObject *s, asUINT prop); + AS_API void * asObject_GetPropertyPointer(asIScriptObject *s, asUINT prop); + AS_API int asObject_CopyFrom(asIScriptObject *s, asIScriptObject *other); + + AS_API asIScriptEngine *asArray_GetEngine(asIScriptArray *a); + AS_API int asArray_AddRef(asIScriptArray *a); + AS_API int asArray_Release(asIScriptArray *a); + AS_API int asArray_GetArrayTypeId(asIScriptArray *a); + AS_API int asArray_GetElementTypeId(asIScriptArray *a); + AS_API asUINT asArray_GetElementCount(asIScriptArray *a); + AS_API void * asArray_GetElementPointer(asIScriptArray *a, asUINT index); + AS_API void asArray_Resize(asIScriptArray *a, asUINT size); + AS_API int asArray_CopyFrom(asIScriptArray *a, asIScriptArray *other); + + AS_API asIScriptEngine *asObjectType_GetEngine(const asIObjectType *o); + AS_API int asObjectType_AddRef(asIObjectType *o); + AS_API int asObjectType_Release(asIObjectType *o); + AS_API const char *asObjectType_GetName(const asIObjectType *o); + AS_API asIObjectType *asObjectType_GetBaseType(const asIObjectType *o); + AS_API asDWORD asObjectType_GetFlags(const asIObjectType *o); + AS_API asUINT asObjectType_GetSize(const asIObjectType *o); + AS_API int asObjectType_GetTypeId(const asIObjectType *o); + AS_API int asObjectType_GetSubTypeId(const asIObjectType *o); + AS_API int asObjectType_GetBehaviourCount(const asIObjectType *o); + AS_API int asObjectType_GetBehaviourByIndex(const asIObjectType *o, asUINT index, asEBehaviours *outBehaviour); + AS_API int asObjectType_GetInterfaceCount(const asIObjectType *o); + AS_API asIObjectType *asObjectType_GetInterface(const asIObjectType *o, asUINT index); + AS_API int asObjectType_GetFactoryCount(const asIObjectType *o); + AS_API int asObjectType_GetFactoryIdByIndex(const asIObjectType *o, int index); + AS_API int asObjectType_GetFactoryIdByDecl(const asIObjectType *o, const char *decl); + AS_API int asObjectType_GetMethodCount(const asIObjectType *o); + AS_API int asObjectType_GetMethodIdByIndex(const asIObjectType *o, int index); + AS_API int asObjectType_GetMethodIdByName(const asIObjectType *o, const char *name); + AS_API int asObjectType_GetMethodIdByDecl(const asIObjectType *o, const char *decl); + AS_API asIScriptFunction *asObjectType_GetMethodDescriptorByIndex(const asIObjectType *o, int index); + AS_API int asObjectType_GetPropertyCount(const asIObjectType *o); + AS_API int asObjectType_GetPropertyTypeId(const asIObjectType *o, asUINT prop); + AS_API const char *asObjectType_GetPropertyName(const asIObjectType *o, asUINT prop); + AS_API int asObjectType_GetPropertyOffset(const asIObjectType *o, asUINT prop); + + AS_API asIScriptEngine *asScriptFunction_GetEngine(const asIScriptFunction *f); + AS_API const char *asScriptFunction_GetModuleName(const asIScriptFunction *f); + AS_API asIObjectType *asScriptFunction_GetObjectType(const asIScriptFunction *f); + AS_API const char *asScriptFunction_GetObjectName(const asIScriptFunction *f); + AS_API const char *asScriptFunction_GetName(const asIScriptFunction *f); + AS_API const char *asScriptFunction_GetDeclaration(const asIScriptFunction *f, bool includeObjectName); + AS_API asBOOL asScriptFunction_IsClassMethod(const asIScriptFunction *f); + AS_API asBOOL asScriptFunction_IsInterfaceMethod(const asIScriptFunction *f); + AS_API int asScriptFunction_GetParamCount(const asIScriptFunction *f); + AS_API int asScriptFunction_GetParamTypeId(const asIScriptFunction *f, int index); + AS_API int asScriptFunction_GetReturnTypeId(const asIScriptFunction *f); +#ifdef __cplusplus +} +#endif +#endif // ANGELSCRIPT_DLL_MANUAL_IMPORT + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/as_c.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/as_c.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/as_c.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/as_c.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,302 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_c.cpp +// +// A C interface to the library +// + +// Include the C++ interface header so we can call the proper methods +#include "../../angelscript/include/angelscript.h" + +BEGIN_AS_NAMESPACE + +typedef void (*asBINARYREADFUNC_t)(void *ptr, asUINT size, void *param); +typedef void (*asBINARYWRITEFUNC_t)(const void *ptr, asUINT size, void *param); + +typedef enum { asTRUE = 1, asFALSE = 0 } asBOOL; + +class asCBinaryStreamC : public asIBinaryStream +{ +public: + asCBinaryStreamC(asBINARYWRITEFUNC_t write, asBINARYREADFUNC_t read, void *param) {this->write = write; this->read = read; this->param = param;} + + void Write(const void *ptr, asUINT size) { write(ptr, size, param); } + void Read(void *ptr, asUINT size) { read(ptr, size, param); } + + asBINARYREADFUNC_t read; + asBINARYWRITEFUNC_t write; + void *param; +}; + +extern "C" +{ + +// Implement a global wrapper function for each of the library's interface methods +AS_API int asEngine_AddRef(asIScriptEngine *e) { return e->AddRef(); } +AS_API int asEngine_Release(asIScriptEngine *e) { return e->Release(); } +AS_API int asEngine_SetEngineProperty(asIScriptEngine *e, asEEngineProp property, asPWORD value) { return e->SetEngineProperty(property, value); } +AS_API asPWORD asEngine_GetEngineProperty(asIScriptEngine *e, asEEngineProp property) { return e->GetEngineProperty(property); } +AS_API int asEngine_SetMessageCallback(asIScriptEngine *e, asFUNCTION_t callback, void *obj, asDWORD callConv) { return e->SetMessageCallback(asFUNCTION(callback), obj, callConv); } +AS_API int asEngine_ClearMessageCallback(asIScriptEngine *e) { return e->ClearMessageCallback(); } +AS_API int asEngine_WriteMessage(asIScriptEngine *e, const char *section, int row, int col, asEMsgType type, const char *message) { return e->WriteMessage(section, row, col, type, message); } +AS_API int asEngine_RegisterObjectType(asIScriptEngine *e, const char *name, int byteSize, asDWORD flags) { return e->RegisterObjectType(name, byteSize, flags); } +AS_API int asEngine_RegisterObjectProperty(asIScriptEngine *e, const char *obj, const char *declaration, int byteOffset) { return e->RegisterObjectProperty(obj, declaration, byteOffset); } +AS_API int asEngine_RegisterObjectMethod(asIScriptEngine *e, const char *obj, const char *declaration, asFUNCTION_t funcPointer, asDWORD callConv) { return e->RegisterObjectMethod(obj, declaration, asFUNCTION(funcPointer), callConv); } +AS_API int asEngine_RegisterObjectBehaviour(asIScriptEngine *e, const char *datatype, asEBehaviours behaviour, const char *declaration, asFUNCTION_t funcPointer, asDWORD callConv) { return e->RegisterObjectBehaviour(datatype, behaviour, declaration, asFUNCTION(funcPointer), callConv); } +AS_API int asEngine_RegisterGlobalProperty(asIScriptEngine *e, const char *declaration, void *pointer) { return e->RegisterGlobalProperty(declaration, pointer); } +AS_API int asEngine_GetGlobalPropertyCount(asIScriptEngine *e) { return e->GetGlobalPropertyCount(); } +AS_API int asEngine_GetGlobalPropertyByIndex(asIScriptEngine *e, asUINT index, const char **name, int *typeId, asBOOL *isConst, const char **configGroup, void **pointer) { bool _isConst; int r = e->GetGlobalPropertyByIndex(index, name, typeId, &_isConst, configGroup, pointer); if( isConst ) *isConst = (_isConst ? asTRUE : asFALSE); return r; } +AS_API int asEngine_RegisterGlobalFunction(asIScriptEngine *e, const char *declaration, asFUNCTION_t funcPointer, asDWORD callConv) { return e->RegisterGlobalFunction(declaration, asFUNCTION(funcPointer), callConv); } +AS_API int asEngine_GetGlobalFunctionCount(asIScriptEngine *e) { return e->GetGlobalFunctionCount(); } +AS_API int asEngine_GetGlobalFunctionIdByIndex(asIScriptEngine *e, asUINT index) { return e->GetGlobalFunctionIdByIndex(index); } +AS_API int asEngine_RegisterInterface(asIScriptEngine *e, const char *name) { return e->RegisterInterface(name); } +AS_API int asEngine_RegisterInterfaceMethod(asIScriptEngine *e, const char *intf, const char *declaration) { return e->RegisterInterfaceMethod(intf, declaration); } +AS_API int asEngine_RegisterEnum(asIScriptEngine *e, const char *type) { return e->RegisterEnum(type); } +AS_API int asEngine_RegisterEnumValue(asIScriptEngine *e, const char *type, const char *name, int value) { return e->RegisterEnumValue(type,name,value); } +AS_API int asEngine_GetEnumCount(asIScriptEngine *e) { return e->GetEnumCount(); } +AS_API const char * asEngine_GetEnumByIndex(asIScriptEngine *e, asUINT index, int *enumTypeId, const char **configGroup) { return e->GetEnumByIndex(index, enumTypeId, configGroup); } +AS_API int asEngine_GetEnumValueCount(asIScriptEngine *e, int enumTypeId) { return e->GetEnumValueCount(enumTypeId); } +AS_API const char * asEngine_GetEnumValueByIndex(asIScriptEngine *e, int enumTypeId, asUINT index, int *outValue) { return e->GetEnumValueByIndex(enumTypeId, index, outValue); } +AS_API int asEngine_RegisterStringFactory(asIScriptEngine *e, const char *datatype, asFUNCTION_t factoryFunc, asDWORD callConv) { return e->RegisterStringFactory(datatype, asFUNCTION(factoryFunc), callConv); } +AS_API int asEngine_GetStringFactoryReturnTypeId(asIScriptEngine *e) { return e->GetStringFactoryReturnTypeId(); } +AS_API int asEngine_RegisterTypedef(asIScriptEngine *e, const char *type, const char *decl) { return e->RegisterTypedef(type,decl); } +AS_API int asEngine_GetTypedefCount(asIScriptEngine *e) { return e->GetTypedefCount(); } +AS_API const char * asEngine_GetTypedefByIndex(asIScriptEngine *e, asUINT index, int *typeId, const char **configGroup) { return e->GetTypedefByIndex(index, typeId, configGroup); } +AS_API int asEngine_BeginConfigGroup(asIScriptEngine *e, const char *groupName) { return e->BeginConfigGroup(groupName); } +AS_API int asEngine_EndConfigGroup(asIScriptEngine *e) { return e->EndConfigGroup(); } +AS_API int asEngine_RemoveConfigGroup(asIScriptEngine *e, const char *groupName) { return e->RemoveConfigGroup(groupName); } +AS_API int asEngine_SetConfigGroupModuleAccess(asIScriptEngine *e, const char *groupName, const char *module, asBOOL haveAccess) { return e->SetConfigGroupModuleAccess(groupName, module, haveAccess ? true : false); } +AS_API asIScriptModule * asEngine_GetModule(asIScriptEngine *e, const char *module, asEGMFlags flag) { return e->GetModule(module, flag); } +AS_API int asEngine_DiscardModule(asIScriptEngine *e, const char *module) { return e->DiscardModule(module); } +AS_API asIScriptFunction *asEngine_GetFunctionDescriptorById(asIScriptEngine *e, int funcId) { return e->GetFunctionDescriptorById(funcId); } +AS_API int asEngine_GetTypeIdByDecl(asIScriptEngine *e, const char *decl) { return e->GetTypeIdByDecl(decl); } +AS_API const char * asEngine_GetTypeDeclaration(asIScriptEngine *e, int typeId) { return e->GetTypeDeclaration(typeId); } +AS_API int asEngine_GetSizeOfPrimitiveType(asIScriptEngine *e, int typeId) { return e->GetSizeOfPrimitiveType(typeId); } +AS_API asIObjectType * asEngine_GetObjectTypeById(asIScriptEngine *e, int typeId) { return e->GetObjectTypeById(typeId); } +AS_API asIObjectType * asEngine_GetObjectTypeByIndex(asIScriptEngine *e, asUINT index) { return e->GetObjectTypeByIndex(index); } +AS_API int asEngine_GetObjectTypeCount(asIScriptEngine *e) { return e->GetObjectTypeCount(); } +AS_API asIScriptContext * asEngine_CreateContext(asIScriptEngine *e) { return e->CreateContext(); } +AS_API void * asEngine_CreateScriptObject(asIScriptEngine *e, int typeId) { return e->CreateScriptObject(typeId); } +AS_API void * asEngine_CreateScriptObjectCopy(asIScriptEngine *e, void *obj, int typeId) { return e->CreateScriptObjectCopy(obj, typeId); } +AS_API void asEngine_CopyScriptObject(asIScriptEngine *e, void *dstObj, void *srcObj, int typeId) { e->CopyScriptObject(dstObj, srcObj, typeId); } +AS_API void asEngine_ReleaseScriptObject(asIScriptEngine *e, void *obj, int typeId) { e->ReleaseScriptObject(obj, typeId); } +AS_API void asEngine_AddRefScriptObject(asIScriptEngine *e, void *obj, int typeId) { e->AddRefScriptObject(obj, typeId); } +AS_API asBOOL asEngine_IsHandleCompatibleWithObject(asIScriptEngine *e, void *obj, int objTypeId, int handleTypeId) { return e->IsHandleCompatibleWithObject(obj, objTypeId, handleTypeId) ? asTRUE : asFALSE; } +AS_API int asEngine_ExecuteString(asIScriptEngine *e, const char *module, const char *script, asIScriptContext **ctx, asDWORD flags) { return e->ExecuteString(module, script, ctx, flags); } +AS_API int asEngine_GarbageCollect(asIScriptEngine *e, asDWORD flags) { return e->GarbageCollect(flags); } +AS_API void asEngine_GetGCStatistics(asIScriptEngine *e, asUINT *currentSize, asUINT *totalDestroyed, asUINT *totalDetected) { e->GetGCStatistics(currentSize, totalDestroyed, totalDetected); } +AS_API void asEngine_NotifyGarbageCollectorOfNewObject(asIScriptEngine *e, void *obj, int typeId) { e->NotifyGarbageCollectorOfNewObject(obj, typeId); } +AS_API void asEngine_GCEnumCallback(asIScriptEngine *e, void *obj) { e->GCEnumCallback(obj); } +AS_API void * asEngine_SetUserData(asIScriptEngine *e, void *data) { return e->SetUserData(data); } +AS_API void * asEngine_GetUserData(asIScriptEngine *e) { return e->GetUserData(); } + +AS_API asIScriptEngine *asModule_GetEngine(asIScriptModule *m) { return m->GetEngine(); } +AS_API void asModule_SetName(asIScriptModule *m, const char *name) { m->SetName(name); } +AS_API const char *asModule_GetName(asIScriptModule *m) { return m->GetName(); } +AS_API int asModule_AddScriptSection(asIScriptModule *m, const char *name, const char *code, size_t codeLength, int lineOffset) { return m->AddScriptSection(name, code, codeLength, lineOffset); } +AS_API int asModule_Build(asIScriptModule *m) { return m->Build(); } +AS_API int asModule_GetFunctionCount(asIScriptModule *m) { return m->GetFunctionCount(); } +AS_API int asModule_GetFunctionIdByIndex(asIScriptModule *m, int index) { return m->GetFunctionIdByIndex(index); } +AS_API int asModule_GetFunctionIdByName(asIScriptModule *m, const char *name) { return m->GetFunctionIdByName(name); } +AS_API int asModule_GetFunctionIdByDecl(asIScriptModule *m, const char *decl) { return m->GetFunctionIdByDecl(decl); } +AS_API asIScriptFunction *asModule_GetFunctionDescriptorByIndex(asIScriptModule *m, int index) { return m->GetFunctionDescriptorByIndex(index); } +AS_API asIScriptFunction *asModule_GetFunctionDescriptorById(asIScriptModule *m, int funcId) { return m->GetFunctionDescriptorById(funcId); } +AS_API int asModule_ResetGlobalVars(asIScriptModule *m) { return m->ResetGlobalVars(); } +AS_API int asModule_GetGlobalVarCount(asIScriptModule *m) { return m->GetGlobalVarCount(); } +AS_API int asModule_GetGlobalVarIndexByName(asIScriptModule *m, const char *name) { return m->GetGlobalVarIndexByName(name); } +AS_API int asModule_GetGlobalVarIndexByDecl(asIScriptModule *m, const char *decl) { return m->GetGlobalVarIndexByDecl(decl); } +AS_API const char *asModule_GetGlobalVarDeclaration(asIScriptModule *m, int index) { return m->GetGlobalVarDeclaration(index); } +AS_API const char *asModule_GetGlobalVarName(asIScriptModule *m, int index) { return m->GetGlobalVarName(index); } +AS_API int asModule_GetGlobalVarTypeId(asIScriptModule *m, int index, asBOOL *isConst) { bool _isConst; int r = m->GetGlobalVarTypeId(index, &_isConst); if( isConst ) *isConst = (_isConst ? asTRUE : asFALSE); return r; } +AS_API void *asModule_GetAddressOfGlobalVar(asIScriptModule *m, int index) { return m->GetAddressOfGlobalVar(index); } +AS_API int asModule_GetObjectTypeCount(asIScriptModule *m) { return m->GetObjectTypeCount(); } +AS_API asIObjectType *asModule_GetObjectTypeByIndex(asIScriptModule *m, asUINT index) { return m->GetObjectTypeByIndex(index); } +AS_API int asModule_GetTypeIdByDecl(asIScriptModule *m, const char *decl) { return m->GetTypeIdByDecl(decl); } +AS_API int asModule_GetEnumCount(asIScriptModule *m) { return m->GetEnumCount(); } +AS_API const char * asModule_GetEnumByIndex(asIScriptModule *m, asUINT index, int *enumTypeId) { return m->GetEnumByIndex(index, enumTypeId); } +AS_API int asModule_GetEnumValueCount(asIScriptModule *m, int enumTypeId) { return m->GetEnumValueCount(enumTypeId); } +AS_API const char * asModule_GetEnumValueByIndex(asIScriptModule *m, int enumTypeId, asUINT index, int *outValue) { return m->GetEnumValueByIndex(enumTypeId, index, outValue); } +AS_API int asModule_GetTypedefCount(asIScriptModule *m) { return m->GetTypedefCount(); } +AS_API const char * asModule_GetTypedefByIndex(asIScriptModule *m, asUINT index, int *typeId) { return m->GetTypedefByIndex(index, typeId); } +AS_API int asModule_GetImportedFunctionCount(asIScriptModule *m) { return m->GetImportedFunctionCount(); } +AS_API int asModule_GetImportedFunctionIndexByDecl(asIScriptModule *m, const char *decl) { return m->GetImportedFunctionIndexByDecl(decl); } +AS_API const char *asModule_GetImportedFunctionDeclaration(asIScriptModule *m, int importIndex) { return m->GetImportedFunctionDeclaration(importIndex); } +AS_API const char *asModule_GetImportedFunctionSourceModule(asIScriptModule *m, int importIndex) { return m->GetImportedFunctionSourceModule(importIndex); } +AS_API int asModule_BindImportedFunction(asIScriptModule *m, int importIndex, int funcId) { return m->BindImportedFunction(importIndex, funcId); } +AS_API int asModule_UnbindImportedFunction(asIScriptModule *m, int importIndex) { return m->UnbindImportedFunction(importIndex); } +AS_API int asModule_BindAllImportedFunctions(asIScriptModule *m) { return m->BindAllImportedFunctions(); } +AS_API int asModule_UnbindAllImportedFunctions(asIScriptModule *m) { return m->UnbindAllImportedFunctions(); } +AS_API int asModule_SaveByteCode(asIScriptModule *m, asIBinaryStream *out) { return m->SaveByteCode(out); } +AS_API int asModule_LoadByteCode(asIScriptModule *m, asIBinaryStream *in) { return m->LoadByteCode(in); } + +AS_API int asContext_AddRef(asIScriptContext *c) { return c->AddRef(); } +AS_API int asContext_Release(asIScriptContext *c) { return c->Release(); } +AS_API asIScriptEngine *asContext_GetEngine(asIScriptContext *c) { return c->GetEngine(); } +AS_API int asContext_GetState(asIScriptContext *c) { return c->GetState(); } +AS_API int asContext_Prepare(asIScriptContext *c, int funcID) { return c->Prepare(funcID); } +AS_API int asContext_SetArgByte(asIScriptContext *c, asUINT arg, asBYTE value) { return c->SetArgByte(arg, value); } +AS_API int asContext_SetArgWord(asIScriptContext *c, asUINT arg, asWORD value) { return c->SetArgWord(arg, value); } +AS_API int asContext_SetArgDWord(asIScriptContext *c, asUINT arg, asDWORD value) { return c->SetArgDWord(arg, value); } +AS_API int asContext_SetArgQWord(asIScriptContext *c, asUINT arg, asQWORD value) { return c->SetArgQWord(arg, value); } +AS_API int asContext_SetArgFloat(asIScriptContext *c, asUINT arg, float value) { return c->SetArgFloat(arg, value); } +AS_API int asContext_SetArgDouble(asIScriptContext *c, asUINT arg, double value) { return c->SetArgDouble(arg, value); } +AS_API int asContext_SetArgAddress(asIScriptContext *c, asUINT arg, void *addr) { return c->SetArgAddress(arg, addr); } +AS_API int asContext_SetArgObject(asIScriptContext *c, asUINT arg, void *obj) { return c->SetArgObject(arg, obj); } +AS_API void * asContext_GetAddressOfArg(asIScriptContext *c, asUINT arg) { return c->GetAddressOfArg(arg); } +AS_API int asContext_SetObject(asIScriptContext *c, void *obj) { return c->SetObject(obj); } +AS_API asBYTE asContext_GetReturnByte(asIScriptContext *c) { return c->GetReturnByte(); } +AS_API asWORD asContext_GetReturnWord(asIScriptContext *c) { return c->GetReturnWord(); } +AS_API asDWORD asContext_GetReturnDWord(asIScriptContext *c) { return c->GetReturnDWord(); } +AS_API asQWORD asContext_GetReturnQWord(asIScriptContext *c) { return c->GetReturnQWord(); } +AS_API float asContext_GetReturnFloat(asIScriptContext *c) { return c->GetReturnFloat(); } +AS_API double asContext_GetReturnDouble(asIScriptContext *c) { return c->GetReturnDouble(); } +AS_API void * asContext_GetReturnAddress(asIScriptContext *c) { return c->GetReturnAddress(); } +AS_API void * asContext_GetReturnObject(asIScriptContext *c) { return c->GetReturnObject(); } +AS_API void * asContext_GetAddressOfReturnValue(asIScriptContext *c) { return c->GetAddressOfReturnValue(); } +AS_API int asContext_Execute(asIScriptContext *c) { return c->Execute(); } +AS_API int asContext_Abort(asIScriptContext *c) { return c->Abort(); } +AS_API int asContext_Suspend(asIScriptContext *c) { return c->Suspend(); } +AS_API int asContext_GetCurrentLineNumber(asIScriptContext *c, int *column) { return c->GetCurrentLineNumber(column); } +AS_API int asContext_GetCurrentFunction(asIScriptContext *c) { return c->GetCurrentFunction(); } +AS_API int asContext_SetException(asIScriptContext *c, const char *string) { return c->SetException(string); } +AS_API int asContext_GetExceptionLineNumber(asIScriptContext *c, int *column) { return c->GetExceptionLineNumber(column); } +AS_API int asContext_GetExceptionFunction(asIScriptContext *c) { return c->GetExceptionFunction(); } +AS_API const char * asContext_GetExceptionString(asIScriptContext *c) { return c->GetExceptionString(); } +AS_API int asContext_SetLineCallback(asIScriptContext *c, asFUNCTION_t callback, void *obj, int callConv) { return c->SetLineCallback(asFUNCTION(callback), obj, callConv); } +AS_API void asContext_ClearLineCallback(asIScriptContext *c) { c->ClearLineCallback(); } +AS_API int asContext_SetExceptionCallback(asIScriptContext *c, asFUNCTION_t callback, void *obj, int callConv) { return c->SetExceptionCallback(asFUNCTION(callback), obj, callConv); } +AS_API void asContext_ClearExceptionCallback(asIScriptContext *c) { c->ClearExceptionCallback(); } +AS_API int asContext_GetCallstackSize(asIScriptContext *c) { return c->GetCallstackSize(); } +AS_API int asContext_GetCallstackFunction(asIScriptContext *c, int index) { return c->GetCallstackFunction(index); } +AS_API int asContext_GetCallstackLineNumber(asIScriptContext *c, int index, int *column) { return c->GetCallstackLineNumber(index, column); } +AS_API int asContext_GetVarCount(asIScriptContext *c, int stackLevel) { return c->GetVarCount(stackLevel); } +AS_API const char * asContext_GetVarName(asIScriptContext *c, int varIndex, int stackLevel) { return c->GetVarName(varIndex, stackLevel); } +AS_API const char * asContext_GetVarDeclaration(asIScriptContext *c, int varIndex, int stackLevel) { return c->GetVarDeclaration(varIndex, stackLevel); } +AS_API int asContext_GetVarTypeId(asIScriptContext *c, int varIndex, int stackLevel) { return c->GetVarTypeId(varIndex, stackLevel); } +AS_API void * asContext_GetAddressOfVar(asIScriptContext *c, int varIndex, int stackLevel) { return c->GetAddressOfVar(varIndex, stackLevel); } +AS_API int asContext_GetThisTypeId(asIScriptContext *c, int stackLevel) { return c->GetThisTypeId(stackLevel); } +AS_API void * asContext_GetThisPointer(asIScriptContext *c, int stackLevel) { return c->GetThisPointer(stackLevel); } +AS_API void * asContext_SetUserData(asIScriptContext *c, void *data) { return c->SetUserData(data); } +AS_API void * asContext_GetUserData(asIScriptContext *c) { return c->GetUserData(); } + +AS_API asIScriptEngine *asGeneric_GetEngine(asIScriptGeneric *g) { return g->GetEngine(); } +AS_API int asGeneric_GetFunctionId(asIScriptGeneric *g) { return g->GetFunctionId(); } +AS_API void * asGeneric_GetObject(asIScriptGeneric *g) { return g->GetObject(); } +AS_API int asGeneric_GetObjectTypeId(asIScriptGeneric *g) { return g->GetObjectTypeId(); } +AS_API int asGeneric_GetArgCount(asIScriptGeneric *g) { return g->GetArgCount(); } +AS_API asBYTE asGeneric_GetArgByte(asIScriptGeneric *g, asUINT arg) { return g->GetArgByte(arg); } +AS_API asWORD asGeneric_GetArgWord(asIScriptGeneric *g, asUINT arg) { return g->GetArgWord(arg); } +AS_API asDWORD asGeneric_GetArgDWord(asIScriptGeneric *g, asUINT arg) { return g->GetArgDWord(arg); } +AS_API asQWORD asGeneric_GetArgQWord(asIScriptGeneric *g, asUINT arg) { return g->GetArgQWord(arg); } +AS_API float asGeneric_GetArgFloat(asIScriptGeneric *g, asUINT arg) { return g->GetArgFloat(arg); } +AS_API double asGeneric_GetArgDouble(asIScriptGeneric *g, asUINT arg) { return g->GetArgDouble(arg); } +AS_API void * asGeneric_GetArgAddress(asIScriptGeneric *g, asUINT arg) { return g->GetArgAddress(arg); } +AS_API void * asGeneric_GetArgObject(asIScriptGeneric *g, asUINT arg) { return g->GetArgObject(arg); } +AS_API void * asGeneric_GetAddressOfArg(asIScriptGeneric *g, asUINT arg) { return g->GetAddressOfArg(arg); } +AS_API int asGeneric_GetArgTypeId(asIScriptGeneric *g, asUINT arg) { return g->GetArgTypeId(arg); } +AS_API int asGeneric_SetReturnByte(asIScriptGeneric *g, asBYTE val) { return g->SetReturnByte(val); } +AS_API int asGeneric_SetReturnWord(asIScriptGeneric *g, asWORD val) { return g->SetReturnWord(val); } +AS_API int asGeneric_SetReturnDWord(asIScriptGeneric *g, asDWORD val) { return g->SetReturnDWord(val); } +AS_API int asGeneric_SetReturnQWord(asIScriptGeneric *g, asQWORD val) { return g->SetReturnQWord(val); } +AS_API int asGeneric_SetReturnFloat(asIScriptGeneric *g, float val) { return g->SetReturnFloat(val); } +AS_API int asGeneric_SetReturnDouble(asIScriptGeneric *g, double val) { return g->SetReturnDouble(val); } +AS_API int asGeneric_SetReturnAddress(asIScriptGeneric *g, void *addr) { return g->SetReturnAddress(addr); } +AS_API int asGeneric_SetReturnObject(asIScriptGeneric *g, void *obj) { return g->SetReturnObject(obj); } +AS_API void * asGeneric_GetAddressOfReturnLocation(asIScriptGeneric *g) { return g->GetAddressOfReturnLocation(); } +AS_API int asGeneric_GetReturnTypeId(asIScriptGeneric *g) { return g->GetReturnTypeId(); } + +AS_API asIScriptEngine *asObject_GetEngine(asIScriptObject *s) { return s->GetEngine(); } +AS_API int asObject_AddRef(asIScriptObject *s) { return s->AddRef(); } +AS_API int asObject_Release(asIScriptObject *s) { return s->Release(); } +AS_API int asObject_GetTypeId(asIScriptObject *s) { return s->GetTypeId(); } +AS_API asIObjectType * asObject_GetObjectType(asIScriptObject *s) { return s->GetObjectType(); } +AS_API int asObject_GetPropertyCount(asIScriptObject *s) { return s->GetPropertyCount(); } +AS_API int asObject_GetPropertyTypeId(asIScriptObject *s, asUINT prop) { return s->GetPropertyTypeId(prop); } +AS_API const char * asObject_GetPropertyName(asIScriptObject *s, asUINT prop) { return s->GetPropertyName(prop); } +AS_API void * asObject_GetAddressOfProperty(asIScriptObject *s, asUINT prop) { return s->GetAddressOfProperty(prop); } +AS_API int asObject_CopyFrom(asIScriptObject *s, asIScriptObject *other) { return s->CopyFrom(other); } + +AS_API asIScriptEngine *asArray_GetEngine(asIScriptArray *a) { return a->GetEngine(); } +AS_API int asArray_AddRef(asIScriptArray *a) { return a->AddRef(); } +AS_API int asArray_Release(asIScriptArray *a) { return a->Release(); } +AS_API int asArray_GetArrayTypeId(asIScriptArray *a) { return a->GetArrayTypeId(); } +AS_API int asArray_GetElementTypeId(asIScriptArray *a) { return a->GetElementTypeId(); } +AS_API asUINT asArray_GetElementCount(asIScriptArray *a) { return a->GetElementCount(); } +AS_API void * asArray_GetElementPointer(asIScriptArray *a, asUINT index) { return a->GetElementPointer(index); } +AS_API void asArray_Resize(asIScriptArray *a, asUINT size) { a->Resize(size); } +AS_API int asArray_CopyFrom(asIScriptArray *a, asIScriptArray *other) { return a->CopyFrom(other); } + +AS_API asIScriptEngine *asObjectType_GetEngine(const asIObjectType *o) { return o->GetEngine(); } +AS_API int asObjectType_AddRef(asIObjectType *o) { return o->AddRef(); } +AS_API int asObjectType_Release(asIObjectType *o) { return o->Release(); } +AS_API const char *asObjectType_GetName(const asIObjectType *o) { return o->GetName(); } +AS_API asIObjectType *asObjectType_GetBaseType(const asIObjectType *o) { return o->GetBaseType(); } +AS_API asDWORD asObjectType_GetFlags(const asIObjectType *o) { return o->GetFlags(); } +AS_API asUINT asObjectType_GetSize(const asIObjectType *o) { return o->GetSize(); } +AS_API int asObjectType_GetTypeId(const asIObjectType *o) { return o->GetTypeId(); } +AS_API int asObjectType_GetSubTypeId(const asIObjectType *o) { return o->GetSubTypeId(); } +AS_API int asObjectType_GetBehaviourCount(const asIObjectType *o) { return o->GetBehaviourCount(); } +AS_API int asObjectType_GetBehaviourByIndex(const asIObjectType *o, asUINT index, asEBehaviours *outBehaviour) { return o->GetBehaviourByIndex(index, outBehaviour); } +AS_API int asObjectType_GetInterfaceCount(const asIObjectType *o) { return o->GetInterfaceCount(); } +AS_API asIObjectType *asObjectType_GetInterface(const asIObjectType *o, asUINT index) { return o->GetInterface(index); } +AS_API int asObjectType_GetFactoryCount(const asIObjectType *o) { return o->GetFactoryCount(); } +AS_API int asObjectType_GetFactoryIdByIndex(const asIObjectType *o, int index) { return o->GetFactoryIdByIndex(index); } +AS_API int asObjectType_GetFactoryIdByDecl(const asIObjectType *o, const char *decl) { return o->GetFactoryIdByDecl(decl); } +AS_API int asObjectType_GetMethodCount(const asIObjectType *o) { return o->GetMethodCount(); } +AS_API int asObjectType_GetMethodIdByIndex(const asIObjectType *o, int index) { return o->GetMethodIdByIndex(index); } +AS_API int asObjectType_GetMethodIdByName(const asIObjectType *o, const char *name) { return o->GetMethodIdByName(name); } +AS_API int asObjectType_GetMethodIdByDecl(const asIObjectType *o, const char *decl) { return o->GetMethodIdByDecl(decl); } +AS_API asIScriptFunction *asObjectType_GetMethodDescriptorByIndex(const asIObjectType *o, int index) { return o->GetMethodDescriptorByIndex(index); } +AS_API int asObjectType_GetPropertyCount(const asIObjectType *o) { return o->GetPropertyCount(); } +AS_API int asObjectType_GetPropertyTypeId(const asIObjectType *o, asUINT prop) { return o->GetPropertyTypeId(prop); } +AS_API const char *asObjectType_GetPropertyName(const asIObjectType *o, asUINT prop) { return o->GetPropertyName(prop); } +AS_API int asObjectType_GetPropertyOffset(const asIObjectType *o, asUINT prop) { return o->GetPropertyOffset(prop); } + +AS_API asIScriptEngine *asScriptFunction_GetEngine(const asIScriptFunction *f) { return f->GetEngine(); } +AS_API const char *asScriptFunction_GetModuleName(const asIScriptFunction *f) { return f->GetModuleName(); } +AS_API asIObjectType *asScriptFunction_GetObjectType(const asIScriptFunction *f) { return f->GetObjectType(); } +AS_API const char *asScriptFunction_GetObjectName(const asIScriptFunction *f) { return f->GetObjectName(); } +AS_API const char *asScriptFunction_GetName(const asIScriptFunction *f) { return f->GetName(); } +AS_API const char *asScriptFunction_GetDeclaration(const asIScriptFunction *f, bool includeObjectName) { return f->GetDeclaration(includeObjectName); } +AS_API bool asScriptFunction_IsClassMethod(const asIScriptFunction *f) { return f->IsClassMethod(); } +AS_API bool asScriptFunction_IsInterfaceMethod(const asIScriptFunction *f) { return f->IsInterfaceMethod(); } +AS_API int asScriptFunction_GetParamCount(const asIScriptFunction *f) { return f->GetParamCount(); } +AS_API int asScriptFunction_GetParamTypeId(const asIScriptFunction *f, int index) { return f->GetParamTypeId(index); } +AS_API int asScriptFunction_GetReturnTypeId(const asIScriptFunction *f) { return f->GetReturnTypeId(); } + +} + +END_AS_NAMESPACE + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/dllmain.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/dllmain.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/dllmain.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/dllmain.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,25 @@ + +// +// dllmain.cpp +// +// This is the entry point for the windows dll +// + +#include +#include "angelscript_c.h" + +BOOL APIENTRY DllMain( HANDLE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/projects/msvc6/msvc6.dsp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/projects/msvc6/msvc6.dsp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/projects/msvc6/msvc6.dsp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/projects/msvc6/msvc6.dsp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,115 @@ +# Microsoft Developer Studio Project File - Name="msvc6" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=msvc6 - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "msvc6.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "msvc6.mak" CFG="msvc6 - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "msvc6 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "msvc6 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "msvc6 - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MSVC6_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MSVC6_EXPORTS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../../angelscript/lib/angelscript.lib /nologo /dll /machine:I386 /include:"_asCreateScriptEngine" /include:"_asEngine_AddRef" /out:"Release/angelscript_c.dll" + +!ELSEIF "$(CFG)" == "msvc6 - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MSVC6_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MSVC6_EXPORTS" /D "ANGELSCRIPT_EXPORT" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../../angelscript/lib/angelscriptd.lib /nologo /dll /debug /machine:I386 /include:"_asCreateScriptEngine" /include:"_asEngine_AddRef" /out:"Debug/angelscript_c.dll" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "msvc6 - Win32 Release" +# Name "msvc6 - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\as_c.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\dllmain.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\angelscript_c.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/projects/msvc6/msvc6.dsw kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/projects/msvc6/msvc6.dsw --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/projects/msvc6/msvc6.dsw 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/clib/projects/msvc6/msvc6.dsw 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "msvc6"=".\msvc6.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/contextmgr/contextmgr.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/contextmgr/contextmgr.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/contextmgr/contextmgr.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/contextmgr/contextmgr.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,308 @@ +#include +#include + +#include "contextmgr.h" + +using namespace std; + +// TODO: Should have a pool of free asIScriptContext so that new contexts +// won't be allocated every time. The application must not keep +// its own references, instead it must tell the context manager +// that it is using the context. Otherwise the context manager may +// think it can reuse the context too early. + +// TODO: Need to have a callback for when scripts finishes, so that the +// application can receive return values. + +BEGIN_AS_NAMESPACE + +struct SContextInfo +{ + asUINT sleepUntil; + vector coRoutines; + asUINT currentCoRoutine; +}; + +static CContextMgr *g_ctxMgr = 0; +static void ScriptSleep(asUINT milliSeconds) +{ + // Get a pointer to the context that is currently being executed + asIScriptContext *ctx = asGetActiveContext(); + if( ctx && g_ctxMgr ) + { + // Suspend its execution. The VM will continue until the current + // statement is finished and then return from the Execute() method + ctx->Suspend(); + + // Tell the context manager when the context is to continue execution + g_ctxMgr->SetSleeping(ctx, milliSeconds); + } +} + +static void ScriptYield() +{ + // Get a pointer to the context that is currently being executed + asIScriptContext *ctx = asGetActiveContext(); + if( ctx && g_ctxMgr ) + { + // Let the context manager know that it should run the next co-routine + g_ctxMgr->NextCoRoutine(); + + // The current context must be suspended so that VM will return from + // the Execute() method where the context manager will continue. + ctx->Suspend(); + } +} + +void ScriptCreateCoRoutine(string &func, CScriptAny *arg) +{ + asIScriptContext *ctx = asGetActiveContext(); + if( ctx && g_ctxMgr ) + { + asIScriptEngine *engine = ctx->GetEngine(); + string mod = engine->GetFunctionDescriptorById(ctx->GetCurrentFunction())->GetModuleName(); + + // We need to find the function that will be created as the co-routine + string decl = "void " + func + "(any @)"; + int funcId = engine->GetModule(mod.c_str())->GetFunctionIdByDecl(decl.c_str()); + if( funcId < 0 ) + { + // No function could be found, raise an exception + ctx->SetException(("Function '" + decl + "' doesn't exist").c_str()); + return; + } + + // Create a new context for the co-routine + asIScriptContext *coctx = g_ctxMgr->AddContextForCoRoutine(ctx, funcId); + + // Pass the argument to the context + coctx->SetArgObject(0, arg); + } +} + +CContextMgr::CContextMgr() +{ + getTimeFunc = 0; + currentThread = 0; +} + +CContextMgr::~CContextMgr() +{ + asUINT n; + + // Free the memory + for( n = 0; n < threads.size(); n++ ) + { + if( threads[n] ) + { + for( asUINT c = 0; c < threads[n]->coRoutines.size(); c++ ) + { + if( threads[n]->coRoutines[c] ) + threads[n]->coRoutines[c]->Release(); + } + + delete threads[n]; + } + } + + for( n = 0; n < freeThreads.size(); n++ ) + { + if( freeThreads[n] ) + { + assert( freeThreads[n]->coRoutines.size() == 0 ); + + delete freeThreads[n]; + } + } +} + +void CContextMgr::ExecuteScripts() +{ + g_ctxMgr = this; + + // TODO: Should have a time out. And if not all scripts executed before the + // time out, the next time the function is called the loop should continue + // where it left off. + + // TODO: We should have a per thread time out as well. When this is used, the yield + // call should resume the next coroutine immediately if there is still time + + // Check if the system time is higher than the time set for the contexts + asUINT time = getTimeFunc ? getTimeFunc() : asUINT(-1); + for( currentThread = 0; currentThread < threads.size(); currentThread++ ) + { + if( threads[currentThread]->sleepUntil < time ) + { + // TODO: Only allow each thread to execute for a while + + int currentCoRoutine = threads[currentThread]->currentCoRoutine; + int r = threads[currentThread]->coRoutines[currentCoRoutine]->Execute(); + if( r != asEXECUTION_SUSPENDED ) + { + // The context has terminated execution (for one reason or other) + threads[currentThread]->coRoutines[currentCoRoutine]->Release(); + threads[currentThread]->coRoutines[currentCoRoutine] = 0; + + threads[currentThread]->coRoutines.erase(threads[currentThread]->coRoutines.begin() + threads[currentThread]->currentCoRoutine); + if( threads[currentThread]->currentCoRoutine >= threads[currentThread]->coRoutines.size() ) + threads[currentThread]->currentCoRoutine = 0; + + // If this was the last co-routine terminate the thread + if( threads[currentThread]->coRoutines.size() == 0 ) + { + freeThreads.push_back(threads[currentThread]); + threads.erase(threads.begin() + currentThread); + currentThread--; + } + } + } + } + + g_ctxMgr = 0; +} + +void CContextMgr::NextCoRoutine() +{ + threads[currentThread]->currentCoRoutine++; + if( threads[currentThread]->currentCoRoutine >= threads[currentThread]->coRoutines.size() ) + threads[currentThread]->currentCoRoutine = 0; +} + +void CContextMgr::AbortAll() +{ + // Abort all contexts and release them. The script engine will make + // sure that all resources held by the scripts are properly released. + + for( asUINT n = 0; n < threads.size(); n++ ) + { + for( asUINT c = 0; c < threads[n]->coRoutines.size(); c++ ) + { + if( threads[n]->coRoutines[c] ) + { + threads[n]->coRoutines[c]->Abort(); + threads[n]->coRoutines[c]->Release(); + threads[n]->coRoutines[c] = 0; + } + } + threads[n]->coRoutines.resize(0); + + freeThreads.push_back(threads[n]); + } + + threads.resize(0); + + currentThread = 0; +} + +asIScriptContext *CContextMgr::AddContext(asIScriptEngine *engine, int funcId) +{ + // Create the new context + asIScriptContext *ctx = engine->CreateContext(); + if( ctx == 0 ) + return 0; + + // Prepare it to execute the function + int r = ctx->Prepare(funcId); + if( r < 0 ) + { + ctx->Release(); + return 0; + } + + // Add the context to the list for execution + SContextInfo *info = 0; + if( freeThreads.size() > 0 ) + { + info = *freeThreads.rbegin(); + freeThreads.pop_back(); + } + else + { + info = new SContextInfo; + } + + info->coRoutines.push_back(ctx); + info->currentCoRoutine = 0; + info->sleepUntil = 0; + threads.push_back(info); + + return ctx; +} + +asIScriptContext *CContextMgr::AddContextForCoRoutine(asIScriptContext *currCtx, int funcId) +{ + asIScriptEngine *engine = currCtx->GetEngine(); + asIScriptContext *coctx = engine->CreateContext(); + if( coctx == 0 ) + { + return 0; + } + + // Prepare the context + int r = coctx->Prepare(funcId); + if( r < 0 ) + { + // Couldn't prepare the context + coctx->Release(); + return 0; + } + + // Find the current context thread info + // TODO: Start with the current thread so that we can find the group faster + for( asUINT n = 0; n < threads.size(); n++ ) + { + if( threads[n]->coRoutines[threads[n]->currentCoRoutine] == currCtx ) + { + // Add the coRoutine to the list + threads[n]->coRoutines.push_back(coctx); + } + } + + return coctx; +} + +void CContextMgr::SetSleeping(asIScriptContext *ctx, asUINT milliSeconds) +{ + assert( getTimeFunc != 0 ); + + // Find the context and update the timeStamp + // for when the context is to be continued + + // TODO: Start with the current thread + + for( asUINT n = 0; n < threads.size(); n++ ) + { + if( threads[n]->coRoutines[threads[n]->currentCoRoutine] == ctx ) + { + threads[n]->sleepUntil = (getTimeFunc ? getTimeFunc() : 0) + milliSeconds; + } + } +} + +void CContextMgr::RegisterThreadSupport(asIScriptEngine *engine) +{ + int r; + + // Must set the get time callback function for this to work + assert( getTimeFunc != 0 ); + + // Register the sleep function + r = engine->RegisterGlobalFunction("void sleep(uint)", asFUNCTION(ScriptSleep), asCALL_CDECL); assert( r >= 0 ); + + // TODO: Add support for spawning new threads, waiting for signals, etc +} + +void CContextMgr::RegisterCoRoutineSupport(asIScriptEngine *engine) +{ + int r; + + r = engine->RegisterGlobalFunction("void yield()", asFUNCTION(ScriptYield), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("void createCoRoutine(const string &in, any @+)", asFUNCTION(ScriptCreateCoRoutine), asCALL_CDECL); assert( r >= 0 ); +} + +void CContextMgr::SetGetTimeCallback(TIMEFUNC_t func) +{ + getTimeFunc = func; +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/contextmgr/contextmgr.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/contextmgr/contextmgr.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/contextmgr/contextmgr.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/contextmgr/contextmgr.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,81 @@ +#ifndef CONTEXTMGR_H +#define CONTEXTMGR_H + +// The context manager simplifies the management of multiple concurrent scripts + +// More than one context manager can be used, if you wish to control different +// groups of scripts separately, e.g. game object scripts, and GUI scripts. + +// OBSERVATION: This class is currently not thread safe. + +#include +#include + +BEGIN_AS_NAMESPACE + +class CScriptAny; + +// The internal structure for holding contexts +struct SContextInfo; + +// The signature of the get time callback function +typedef asUINT (*TIMEFUNC_t)(); + +class CContextMgr +{ +public: + CContextMgr(); + ~CContextMgr(); + + // Set the function that the manager will use to obtain the time in milliseconds + void SetGetTimeCallback(TIMEFUNC_t func); + + // Registers the script function + // + // void sleep(uint milliseconds) + // + // The application must set the get time callback for this to work + void RegisterThreadSupport(asIScriptEngine *engine); + + // Registers the script functions + // + // void createCoRoutine(const string &in functionName, any @arg) + // void yield() + void RegisterCoRoutineSupport(asIScriptEngine *engine); + + // Create a new context, prepare it with the function id, then return + // it so that the application can pass the argument values. The context + // will be released by the manager after the execution has completed. + asIScriptContext *AddContext(asIScriptEngine *engine, int funcId); + + // Create a new context, prepare it with the function id, then return + // it so that the application can pass the argument values. The context + // will be added as a co-routine in the same thread as the currCtx. + asIScriptContext *AddContextForCoRoutine(asIScriptContext *currCtx, int funcId); + + // Execute each script that is not currently sleeping. The function returns after + // each script has been executed once. The application should call this function + // for each iteration of the message pump, or game loop, or whatever. + void ExecuteScripts(); + + // Put a script to sleep for a while + void SetSleeping(asIScriptContext *ctx, asUINT milliSeconds); + + // Switch the execution to the next co-routine in the group. + // Returns true if the switch was successful. + void NextCoRoutine(); + + // Abort all scripts + void AbortAll(); + +protected: + std::vector threads; + std::vector freeThreads; + asUINT currentThread; + TIMEFUNC_t getTimeFunc; +}; + + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptany/scriptany.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptany/scriptany.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptany/scriptany.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptany/scriptany.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,464 @@ +#include "scriptany.h" +#include +#include +#include + +BEGIN_AS_NAMESPACE + +// We'll use the generic interface for the factories as we need the engine pointer +static void ScriptAnyFactory_Generic(asIScriptGeneric *gen) +{ + asIScriptEngine *engine = gen->GetEngine(); + + *(CScriptAny**)gen->GetAddressOfReturnLocation() = new CScriptAny(engine); +} + +static void ScriptAnyFactory2_Generic(asIScriptGeneric *gen) +{ + asIScriptEngine *engine = gen->GetEngine(); + void *ref = (void*)gen->GetArgAddress(0); + int refType = gen->GetArgTypeId(0); + + *(CScriptAny**)gen->GetAddressOfReturnLocation() = new CScriptAny(ref,refType,engine); +} + +static CScriptAny &ScriptAnyAssignment(CScriptAny *other, CScriptAny *self) +{ + return *self = *other; +} + +static void ScriptAnyAssignment_Generic(asIScriptGeneric *gen) +{ + CScriptAny *other = (CScriptAny*)gen->GetArgObject(0); + CScriptAny *self = (CScriptAny*)gen->GetObject(); + + *self = *other; + + gen->SetReturnObject(self); +} + +static void ScriptAny_Store_Generic(asIScriptGeneric *gen) +{ + void *ref = (void*)gen->GetArgAddress(0); + int refTypeId = gen->GetArgTypeId(0); + CScriptAny *self = (CScriptAny*)gen->GetObject(); + + self->Store(ref, refTypeId); +} + +static void ScriptAny_StoreInt_Generic(asIScriptGeneric *gen) +{ + asINT64 *ref = (asINT64*)gen->GetArgAddress(0); + CScriptAny *self = (CScriptAny*)gen->GetObject(); + + self->Store(*ref); +} + +static void ScriptAny_StoreFlt_Generic(asIScriptGeneric *gen) +{ + double *ref = (double*)gen->GetArgAddress(0); + CScriptAny *self = (CScriptAny*)gen->GetObject(); + + self->Store(*ref); +} + +static void ScriptAny_Retrieve_Generic(asIScriptGeneric *gen) +{ + void *ref = (void*)gen->GetArgAddress(0); + int refTypeId = gen->GetArgTypeId(0); + CScriptAny *self = (CScriptAny*)gen->GetObject(); + + *(bool*)gen->GetAddressOfReturnLocation() = self->Retrieve(ref, refTypeId); +} + +static void ScriptAny_RetrieveInt_Generic(asIScriptGeneric *gen) +{ + asINT64 *ref = (asINT64*)gen->GetArgAddress(0); + CScriptAny *self = (CScriptAny*)gen->GetObject(); + + *(bool*)gen->GetAddressOfReturnLocation() = self->Retrieve(*ref); +} + +static void ScriptAny_RetrieveFlt_Generic(asIScriptGeneric *gen) +{ + double *ref = (double*)gen->GetArgAddress(0); + CScriptAny *self = (CScriptAny*)gen->GetObject(); + + *(bool*)gen->GetAddressOfReturnLocation() = self->Retrieve(*ref); +} + +static void ScriptAny_AddRef_Generic(asIScriptGeneric *gen) +{ + CScriptAny *self = (CScriptAny*)gen->GetObject(); + self->AddRef(); +} + +static void ScriptAny_Release_Generic(asIScriptGeneric *gen) +{ + CScriptAny *self = (CScriptAny*)gen->GetObject(); + self->Release(); +} + +static void ScriptAny_GetRefCount_Generic(asIScriptGeneric *gen) +{ + CScriptAny *self = (CScriptAny*)gen->GetObject(); + *(int*)gen->GetAddressOfReturnLocation() = self->GetRefCount(); +} + +static void ScriptAny_SetFlag_Generic(asIScriptGeneric *gen) +{ + CScriptAny *self = (CScriptAny*)gen->GetObject(); + self->SetFlag(); +} + +static void ScriptAny_GetFlag_Generic(asIScriptGeneric *gen) +{ + CScriptAny *self = (CScriptAny*)gen->GetObject(); + *(bool*)gen->GetAddressOfReturnLocation() = self->GetFlag(); +} + +static void ScriptAny_EnumReferences_Generic(asIScriptGeneric *gen) +{ + CScriptAny *self = (CScriptAny*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->EnumReferences(engine); +} + +static void ScriptAny_ReleaseAllHandles_Generic(asIScriptGeneric *gen) +{ + CScriptAny *self = (CScriptAny*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->ReleaseAllHandles(engine); +} + +void RegisterScriptAny(asIScriptEngine *engine) +{ + if( strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") ) + RegisterScriptAny_Generic(engine); + else + RegisterScriptAny_Native(engine); +} + +void RegisterScriptAny_Native(asIScriptEngine *engine) +{ + int r; + r = engine->RegisterObjectType("any", sizeof(CScriptAny), asOBJ_REF | asOBJ_GC); assert( r >= 0 ); + + // We'll use the generic interface for the constructor as we need the engine pointer + r = engine->RegisterObjectBehaviour("any", asBEHAVE_FACTORY, "any@ f()", asFUNCTION(ScriptAnyFactory_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_FACTORY, "any@ f(?&in)", asFUNCTION(ScriptAnyFactory2_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectBehaviour("any", asBEHAVE_ADDREF, "void f()", asMETHOD(CScriptAny,AddRef), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_RELEASE, "void f()", asMETHOD(CScriptAny,Release), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "any &opAssign(any&in)", asFUNCTION(ScriptAnyAssignment), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "void store(?&in)", asMETHODPR(CScriptAny,Store,(void*,int),void), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "void store(int64&in)", asMETHODPR(CScriptAny,Store,(asINT64&),void), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "void store(double&in)", asMETHODPR(CScriptAny,Store,(double&),void), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "bool retrieve(?&out)", asMETHODPR(CScriptAny,Retrieve,(void*,int) const,bool), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "bool retrieve(int64&out)", asMETHODPR(CScriptAny,Retrieve,(asINT64&) const,bool), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "bool retrieve(double&out)", asMETHODPR(CScriptAny,Retrieve,(double&) const,bool), asCALL_THISCALL); assert( r >= 0 ); + + // Register GC behaviours + r = engine->RegisterObjectBehaviour("any", asBEHAVE_GETREFCOUNT, "int f()", asMETHOD(CScriptAny,GetRefCount), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_SETGCFLAG, "void f()", asMETHOD(CScriptAny,SetFlag), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_GETGCFLAG, "bool f()", asMETHOD(CScriptAny,GetFlag), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_ENUMREFS, "void f(int&in)", asMETHOD(CScriptAny,EnumReferences), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_RELEASEREFS, "void f(int&in)", asMETHOD(CScriptAny,ReleaseAllHandles), asCALL_THISCALL); assert( r >= 0 ); +} + +void RegisterScriptAny_Generic(asIScriptEngine *engine) +{ + int r; + r = engine->RegisterObjectType("any", sizeof(CScriptAny), asOBJ_REF | asOBJ_GC); assert( r >= 0 ); + + // We'll use the generic interface for the constructor as we need the engine pointer + r = engine->RegisterObjectBehaviour("any", asBEHAVE_FACTORY, "any@ f()", asFUNCTION(ScriptAnyFactory_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_FACTORY, "any@ f(?&in)", asFUNCTION(ScriptAnyFactory2_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectBehaviour("any", asBEHAVE_ADDREF, "void f()", asFUNCTION(ScriptAny_AddRef_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_RELEASE, "void f()", asFUNCTION(ScriptAny_Release_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "any &opAssign(any&in)", asFUNCTION(ScriptAnyAssignment_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "void store(?&in)", asFUNCTION(ScriptAny_Store_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "void store(int64&in)", asFUNCTION(ScriptAny_StoreInt_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "void store(double&in)", asFUNCTION(ScriptAny_StoreFlt_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "bool retrieve(?&out) const", asFUNCTION(ScriptAny_Retrieve_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "bool retrieve(int64&out) const", asFUNCTION(ScriptAny_RetrieveInt_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("any", "bool retrieve(double&out) const", asFUNCTION(ScriptAny_RetrieveFlt_Generic), asCALL_GENERIC); assert( r >= 0 ); + + // Register GC behaviours + r = engine->RegisterObjectBehaviour("any", asBEHAVE_GETREFCOUNT, "int f()", asFUNCTION(ScriptAny_GetRefCount_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_SETGCFLAG, "void f()", asFUNCTION(ScriptAny_SetFlag_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_GETGCFLAG, "bool f()", asFUNCTION(ScriptAny_GetFlag_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_ENUMREFS, "void f(int&in)", asFUNCTION(ScriptAny_EnumReferences_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("any", asBEHAVE_RELEASEREFS, "void f(int&in)", asFUNCTION(ScriptAny_ReleaseAllHandles_Generic), asCALL_GENERIC); assert( r >= 0 ); +} + + +CScriptAny &CScriptAny::operator=(const CScriptAny &other) +{ + // Hold on to the object type reference so it isn't destroyed too early + if( other.value.valueObj && (other.value.typeId & asTYPEID_MASK_OBJECT) ) + { + asIObjectType *ot = engine->GetObjectTypeById(other.value.typeId); + if( ot ) + ot->AddRef(); + } + + FreeObject(); + + value.typeId = other.value.typeId; + if( value.typeId & asTYPEID_OBJHANDLE ) + { + // For handles, copy the pointer and increment the reference count + value.valueObj = other.value.valueObj; + engine->AddRefScriptObject(value.valueObj, value.typeId); + } + else if( value.typeId & asTYPEID_MASK_OBJECT ) + { + // Create a copy of the object + value.valueObj = engine->CreateScriptObjectCopy(other.value.valueObj, value.typeId); + } + else + { + // Primitives can be copied directly + value.valueInt = other.value.valueInt; + } + + return *this; +} + +int CScriptAny::CopyFrom(const CScriptAny *other) +{ + if( other == 0 ) return asINVALID_ARG; + + *this = *(CScriptAny*)other; + + return 0; +} + +CScriptAny::CScriptAny(asIScriptEngine *engine) +{ + this->engine = engine; + refCount = 1; + + value.typeId = 0; + value.valueInt = 0; + + // Notify the garbage collector of this object + engine->NotifyGarbageCollectorOfNewObject(this, engine->GetTypeIdByDecl("any")); +} + +CScriptAny::CScriptAny(void *ref, int refTypeId, asIScriptEngine *engine) +{ + this->engine = engine; + refCount = 1; + + value.typeId = 0; + value.valueInt = 0; + + // Notify the garbage collector of this object + engine->NotifyGarbageCollectorOfNewObject(this, engine->GetTypeIdByDecl("any")); + + Store(ref, refTypeId); +} + +CScriptAny::~CScriptAny() +{ + FreeObject(); +} + +void CScriptAny::Store(void *ref, int refTypeId) +{ + // Hold on to the object type reference so it isn't destroyed too early + if( *(void**)ref && (refTypeId & asTYPEID_MASK_OBJECT) ) + { + asIObjectType *ot = engine->GetObjectTypeById(refTypeId); + if( ot ) + ot->AddRef(); + } + + FreeObject(); + + value.typeId = refTypeId; + if( value.typeId & asTYPEID_OBJHANDLE ) + { + // We're receiving a reference to the handle, so we need to dereference it + value.valueObj = *(void**)ref; + engine->AddRefScriptObject(value.valueObj, value.typeId); + } + else if( value.typeId & asTYPEID_MASK_OBJECT ) + { + // Create a copy of the object + value.valueObj = engine->CreateScriptObjectCopy(ref, value.typeId); + } + else + { + // Primitives can be copied directly + value.valueInt = 0; + + // Copy the primitive value + // We receive a pointer to the value. + int size = engine->GetSizeOfPrimitiveType(value.typeId); + memcpy(&value.valueInt, ref, size); + } +} + +void CScriptAny::Store(double &ref) +{ + Store(&ref, asTYPEID_DOUBLE); +} + +void CScriptAny::Store(asINT64 &ref) +{ + Store(&ref, asTYPEID_INT64); +} + + +bool CScriptAny::Retrieve(void *ref, int refTypeId) const +{ + if( refTypeId & asTYPEID_OBJHANDLE ) + { + // Is the handle type compatible with the stored value? + + // A handle can be retrieved if the stored type is a handle of same or compatible type + // or if the stored type is an object that implements the interface that the handle refer to. + if( (value.typeId & asTYPEID_MASK_OBJECT) && + engine->IsHandleCompatibleWithObject(value.valueObj, value.typeId, refTypeId) ) + { + engine->AddRefScriptObject(value.valueObj, value.typeId); + *(void**)ref = value.valueObj; + + return true; + } + } + else if( refTypeId & asTYPEID_MASK_OBJECT ) + { + // Is the object type compatible with the stored value? + + // Copy the object into the given reference + if( value.typeId == refTypeId ) + { + engine->CopyScriptObject(ref, value.valueObj, value.typeId); + + return true; + } + } + else + { + // Is the primitive type compatible with the stored value? + + if( value.typeId == refTypeId ) + { + int size = engine->GetSizeOfPrimitiveType(refTypeId); + memcpy(ref, &value.valueInt, size); + return true; + } + + // We know all numbers are stored as either int64 or double, since we register overloaded functions for those + if( value.typeId == asTYPEID_INT64 && refTypeId == asTYPEID_DOUBLE ) + { + *(double*)ref = double(value.valueInt); + return true; + } + else if( value.typeId == asTYPEID_DOUBLE && refTypeId == asTYPEID_INT64 ) + { + *(asINT64*)ref = asINT64(value.valueFlt); + return true; + } + } + + return false; +} + +bool CScriptAny::Retrieve(asINT64 &value) const +{ + return Retrieve(&value, asTYPEID_INT64); +} + +bool CScriptAny::Retrieve(double &value) const +{ + return Retrieve(&value, asTYPEID_DOUBLE); +} + +int CScriptAny::GetTypeId() const +{ + return value.typeId; +} + +void CScriptAny::FreeObject() +{ + // If it is a handle or a ref counted object, call release + if( value.typeId & asTYPEID_MASK_OBJECT ) + { + // Let the engine release the object + engine->ReleaseScriptObject(value.valueObj, value.typeId); + + // Release the object type info + asIObjectType *ot = engine->GetObjectTypeById(value.typeId); + if( ot ) + ot->Release(); + + value.valueObj = 0; + value.typeId = 0; + } + + // For primitives, there's nothing to do +} + + +void CScriptAny::EnumReferences(asIScriptEngine *engine) +{ + // If we're holding a reference, we'll notify the garbage collector of it + if( value.valueObj && (value.typeId & asTYPEID_MASK_OBJECT) ) + { + engine->GCEnumCallback(value.valueObj); + + // The object type itself is also garbage collected + asIObjectType *ot = engine->GetObjectTypeById(value.typeId); + if( ot ) + engine->GCEnumCallback(ot); + } +} + +void CScriptAny::ReleaseAllHandles(asIScriptEngine * /*engine*/) +{ + FreeObject(); +} + +int CScriptAny::AddRef() +{ + // Increase counter and clear flag set by GC + refCount = (refCount & 0x7FFFFFFF) + 1; + return refCount; +} + +int CScriptAny::Release() +{ + // Now do the actual releasing (clearing the flag set by GC) + refCount = (refCount & 0x7FFFFFFF) - 1; + if( refCount == 0 ) + { + delete this; + return 0; + } + + return refCount; +} + +int CScriptAny::GetRefCount() +{ + return refCount & 0x7FFFFFFF; +} + +void CScriptAny::SetFlag() +{ + refCount |= 0x80000000; +} + +bool CScriptAny::GetFlag() +{ + return (refCount & 0x80000000) ? true : false; +} + + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptany/scriptany.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptany/scriptany.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptany/scriptany.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptany/scriptany.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,71 @@ +#ifndef SCRIPTANY_H +#define SCRIPTANY_H + +#include + +BEGIN_AS_NAMESPACE + +class CScriptAny +{ +public: + // Constructors + CScriptAny(asIScriptEngine *engine); + CScriptAny(void *ref, int refTypeId, asIScriptEngine *engine); + + // Memory management + int AddRef(); + int Release(); + + // Copy the stored value from another any object + CScriptAny &operator=(const CScriptAny&); + int CopyFrom(const CScriptAny *other); + + // Store the value, either as variable type, integer number, or real number + void Store(void *ref, int refTypeId); + void Store(asINT64 &value); + void Store(double &value); + + // Retrieve the stored value, either as variable type, integer number, or real number + bool Retrieve(void *ref, int refTypeId) const; + bool Retrieve(asINT64 &value) const; + bool Retrieve(double &value) const; + + // Get the type id of the stored value + int GetTypeId() const; + + // GC methods + int GetRefCount(); + void SetFlag(); + bool GetFlag(); + void EnumReferences(asIScriptEngine *engine); + void ReleaseAllHandles(asIScriptEngine *engine); + +protected: + virtual ~CScriptAny(); + void FreeObject(); + + int refCount; + asIScriptEngine *engine; + + // The structure for holding the values + struct valueStruct + { + union + { + asINT64 valueInt; + double valueFlt; + void *valueObj; + }; + int typeId; + }; + + valueStruct value; +}; + +void RegisterScriptAny(asIScriptEngine *engine); +void RegisterScriptAny_Native(asIScriptEngine *engine); +void RegisterScriptAny_Generic(asIScriptEngine *engine); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptarray/scriptarray.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptarray/scriptarray.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptarray/scriptarray.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptarray/scriptarray.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,642 @@ +#include +#include +#include +#include + +#include "scriptarray.h" + +BEGIN_AS_NAMESPACE + +struct SArrayBuffer +{ + asDWORD numElements; + asBYTE data[1]; +}; + +static CScriptArray* ScriptArrayFactory2(asIObjectType *ot, asUINT length) +{ + CScriptArray *a = new CScriptArray(length, ot); + + // It's possible the constructor raised a script exception, in which case we + // need to free the memory and return null instead, else we get a memory leak. + asIScriptContext *ctx = asGetActiveContext(); + if( ctx && ctx->GetState() == asEXECUTION_EXCEPTION ) + { + delete a; + return 0; + } + + return a; +} + +static CScriptArray* ScriptArrayFactory(asIObjectType *ot) +{ + return ScriptArrayFactory2(ot, 0); +} + +// This optional callback is called when the template type is first used by the compiler. +// It allows the application to validate if the template can be instanciated for the requested +// subtype at compile time, instead of at runtime. +static bool ScriptArrayTemplateCallback(asIObjectType *ot) +{ + // Make sure the subtype can be instanciated with a default factory/constructor, + // otherwise we won't be able to instanciate the elements + int typeId = ot->GetSubTypeId(); + if( (typeId & asTYPEID_MASK_OBJECT) && !(typeId & asTYPEID_OBJHANDLE) ) + { + asIObjectType *subtype = ot->GetEngine()->GetObjectTypeById(typeId); + asDWORD flags = subtype->GetFlags(); + if( (flags & asOBJ_VALUE) && !(flags & asOBJ_POD) ) + { + // Verify that there is a default constructor + for( int n = 0; n < subtype->GetBehaviourCount(); n++ ) + { + asEBehaviours beh; + int funcId = subtype->GetBehaviourByIndex(n, &beh); + if( beh != asBEHAVE_CONSTRUCT ) continue; + + asIScriptFunction *func = ot->GetEngine()->GetFunctionDescriptorById(funcId); + if( func->GetParamCount() == 0 ) + { + // Found the default constructor + return true; + } + } + + // There is no default constructor + return false; + } + else if( (flags & asOBJ_REF) ) + { + // Verify that there is a default factory + for( int n = 0; n < subtype->GetFactoryCount(); n++ ) + { + int funcId = subtype->GetFactoryIdByIndex(n); + asIScriptFunction *func = ot->GetEngine()->GetFunctionDescriptorById(funcId); + if( func->GetParamCount() == 0 ) + { + // Found the default factory + return true; + } + } + + // No default factory + return false; + } + } + + // The type is ok + return true; +} + +// Registers the template array type +void RegisterScriptArray(asIScriptEngine *engine) +{ + if( strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") == 0 ) + RegisterScriptArray_Native(engine); + else + RegisterScriptArray_Generic(engine); +} + +void RegisterScriptArray_Native(asIScriptEngine *engine) +{ + int r; + + // Register the array type as a template + r = engine->RegisterObjectType("array", 0, asOBJ_REF | asOBJ_GC | asOBJ_TEMPLATE); assert( r >= 0 ); + + // Register a callback for validating the subtype before it is used + r = engine->RegisterObjectBehaviour("array", asBEHAVE_TEMPLATE_CALLBACK, "bool f(int&in)", asFUNCTION(ScriptArrayTemplateCallback), asCALL_CDECL); assert( r >= 0 ); + + // Templates receive the object type as the first parameter. To the script writer this is hidden + r = engine->RegisterObjectBehaviour("array", asBEHAVE_FACTORY, "array@ f(int&in)", asFUNCTIONPR(ScriptArrayFactory, (asIObjectType*), CScriptArray*), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_FACTORY, "array@ f(int&in, uint)", asFUNCTIONPR(ScriptArrayFactory2, (asIObjectType*, asUINT), CScriptArray*), asCALL_CDECL); assert( r >= 0 ); + + // The memory management methods + r = engine->RegisterObjectBehaviour("array", asBEHAVE_ADDREF, "void f()", asMETHOD(CScriptArray,AddRef), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_RELEASE, "void f()", asMETHOD(CScriptArray,Release), asCALL_THISCALL); assert( r >= 0 ); + + // The index operator returns the template subtype + r = engine->RegisterObjectBehaviour("array", asBEHAVE_INDEX, "T &f(uint)", asMETHOD(CScriptArray, At), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_INDEX, "const T &f(uint) const", asMETHOD(CScriptArray, At), asCALL_THISCALL); assert( r >= 0 ); + + // The assignment operator + r = engine->RegisterObjectMethod("array", "array &opAssign(const array&in)", asMETHOD(CScriptArray, operator=), asCALL_THISCALL); assert( r >= 0 ); + + // Other methods + r = engine->RegisterObjectMethod("array", "uint length() const", asMETHOD(CScriptArray, GetSize), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("array", "void resize(uint)", asMETHOD(CScriptArray, Resize), asCALL_THISCALL); assert( r >= 0 ); + + // Register GC behaviours in case the array needs to be garbage collected + r = engine->RegisterObjectBehaviour("array", asBEHAVE_GETREFCOUNT, "int f()", asMETHOD(CScriptArray, GetRefCount), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_SETGCFLAG, "void f()", asMETHOD(CScriptArray, SetFlag), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_GETGCFLAG, "bool f()", asMETHOD(CScriptArray, GetFlag), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_ENUMREFS, "void f(int&in)", asMETHOD(CScriptArray, EnumReferences), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_RELEASEREFS, "void f(int&in)", asMETHOD(CScriptArray, ReleaseAllHandles), asCALL_THISCALL); assert( r >= 0 ); +} + +CScriptArray &CScriptArray::operator=(const CScriptArray &other) +{ + // Only perform the copy if the array types are the same + if( &other != this && + other.GetArrayObjectType() == GetArrayObjectType() ) + { + if( buffer ) + { + DeleteBuffer(buffer); + buffer = 0; + } + + // Copy all elements from the other array + CreateBuffer(&buffer, other.buffer->numElements); + CopyBuffer(buffer, other.buffer); + } + + return *this; +} + +CScriptArray::CScriptArray(asUINT length, asIObjectType *ot) +{ + refCount = 1; + gcFlag = false; + objType = ot; + objType->AddRef(); + buffer = 0; + + // Determine element size + // TODO: Should probably store the template sub type id as well + int typeId = objType->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + elementSize = sizeof(asPWORD); + } + else + { + elementSize = objType->GetEngine()->GetSizeOfPrimitiveType(typeId); + } + + isArrayOfHandles = typeId & asTYPEID_OBJHANDLE ? true : false; + + // Make sure the array size isn't too large for us to handle + if( !CheckMaxSize(length) ) + { + // Don't continue with the initialization + return; + } + + CreateBuffer(&buffer, length); + + // Notify the GC of the successful creation + if( objType->GetFlags() & asOBJ_GC ) + objType->GetEngine()->NotifyGarbageCollectorOfNewObject(this, objType->GetTypeId()); +} + +CScriptArray::~CScriptArray() +{ + if( buffer ) + { + DeleteBuffer(buffer); + buffer = 0; + } + if( objType ) objType->Release(); +} + +asUINT CScriptArray::GetSize() +{ + return buffer->numElements; +} + +void CScriptArray::Resize(asUINT numElements) +{ + // Don't do anything if the size is already correct + if( numElements == buffer->numElements ) + return; + + // Make sure the array size isn't too large for us to handle + if( !CheckMaxSize(numElements) ) + { + // Don't resize the array + return; + } + + SArrayBuffer *newBuffer; + int typeId = objType->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + // Allocate memory for the buffer + newBuffer = (SArrayBuffer*)new asBYTE[sizeof(SArrayBuffer)-1+sizeof(void*)*numElements]; + newBuffer->numElements = numElements; + + // Copy the elements from the old buffer + int c = numElements > buffer->numElements ? buffer->numElements : numElements; + asDWORD **d = (asDWORD**)newBuffer->data; + asDWORD **s = (asDWORD**)buffer->data; + for( int n = 0; n < c; n++ ) + d[n] = s[n]; + + if( numElements > buffer->numElements ) + { + Construct(newBuffer, buffer->numElements, numElements); + } + else if( numElements < buffer->numElements ) + { + Destruct(buffer, numElements, buffer->numElements); + } + } + else + { + // Allocate memory for the buffer + newBuffer = (SArrayBuffer*)new asBYTE[sizeof(SArrayBuffer)-1+elementSize*numElements]; + newBuffer->numElements = numElements; + + int c = numElements > buffer->numElements ? buffer->numElements : numElements; + memcpy(newBuffer->data, buffer->data, c*elementSize); + } + + // Release the old buffer + delete[] (asBYTE*)buffer; + + buffer = newBuffer; +} + +// internal +bool CScriptArray::CheckMaxSize(asUINT numElements) +{ + // This code makes sure the size of the buffer that is allocated + // for the array doesn't overflow and becomes smaller than requested + + asUINT maxSize = 0xFFFFFFFFul - sizeof(SArrayBuffer) + 1; + if( objType->GetSubTypeId() & asTYPEID_MASK_OBJECT ) + { + maxSize /= sizeof(void*); + } + else + { + maxSize /= elementSize; + } + + if( numElements > maxSize ) + { + asIScriptContext *ctx = asGetActiveContext(); + if( ctx ) + { + // Set a script exception + ctx->SetException("Too large array size"); + } + + return false; + } + + // OK + return true; +} + +asIObjectType *CScriptArray::GetArrayObjectType() const +{ + return objType; +} + +int CScriptArray::GetArrayTypeId() const +{ + return objType->GetTypeId(); +} + +int CScriptArray::GetElementTypeId() const +{ + return objType->GetSubTypeId(); +} + +// Return a pointer to the array element. Returns 0 if the index is out of bounds +void *CScriptArray::At(asUINT index) +{ + if( index >= buffer->numElements ) + { + // If this is called from a script we raise a script exception + asIScriptContext *ctx = asGetActiveContext(); + if( ctx ) + ctx->SetException("Index out of bounds"); + return 0; + } + else + { + int typeId = objType->GetSubTypeId(); + if( (typeId & asTYPEID_MASK_OBJECT) && !isArrayOfHandles ) + return (void*)((size_t*)buffer->data)[index]; + else + return buffer->data + elementSize*index; + } +} + +// internal +void CScriptArray::CreateBuffer(SArrayBuffer **buf, asUINT numElements) +{ + int typeId = objType->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + *buf = (SArrayBuffer*)new asBYTE[sizeof(SArrayBuffer)-1+sizeof(void*)*numElements]; + (*buf)->numElements = numElements; + } + else + { + *buf = (SArrayBuffer*)new asBYTE[sizeof(SArrayBuffer)-1+elementSize*numElements]; + (*buf)->numElements = numElements; + } + + Construct(*buf, 0, numElements); +} + +// internal +void CScriptArray::DeleteBuffer(SArrayBuffer *buf) +{ + Destruct(buf, 0, buf->numElements); + + // Free the buffer + delete[] (asBYTE*)buf; +} + +// internal +void CScriptArray::Construct(SArrayBuffer *buf, asUINT start, asUINT end) +{ + int typeId = objType->GetSubTypeId(); + if( isArrayOfHandles ) + { + // Set all object handles to null + asDWORD *d = (asDWORD*)(buf->data + start * sizeof(void*)); + memset(d, 0, (end-start)*sizeof(void*)); + } + else if( typeId & asTYPEID_MASK_OBJECT ) + { + asDWORD **max = (asDWORD**)(buf->data + end * sizeof(void*)); + asDWORD **d = (asDWORD**)(buf->data + start * sizeof(void*)); + + asIScriptEngine *engine = objType->GetEngine(); + + for( ; d < max; d++ ) + *d = (asDWORD*)engine->CreateScriptObject(typeId); + } +} + +// internal +void CScriptArray::Destruct(SArrayBuffer *buf, asUINT start, asUINT end) +{ + int typeId = objType->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + asIScriptEngine *engine = objType->GetEngine(); + + asDWORD **max = (asDWORD**)(buf->data + end * sizeof(void*)); + asDWORD **d = (asDWORD**)(buf->data + start * sizeof(void*)); + + for( ; d < max; d++ ) + { + if( *d ) + engine->ReleaseScriptObject(*d, typeId); + } + } +} + +// internal +void CScriptArray::CopyBuffer(SArrayBuffer *dst, SArrayBuffer *src) +{ + asIScriptEngine *engine = objType->GetEngine(); + if( isArrayOfHandles ) + { + // Copy the references and increase the reference counters + if( dst->numElements > 0 && src->numElements > 0 ) + { + int typeId = objType->GetSubTypeId(); + int count = dst->numElements > src->numElements ? src->numElements : dst->numElements; + + asDWORD **max = (asDWORD**)(dst->data + count * sizeof(void*)); + asDWORD **d = (asDWORD**)dst->data; + asDWORD **s = (asDWORD**)src->data; + + for( ; d < max; d++, s++ ) + { + *d = *s; + if( *d ) + engine->AddRefScriptObject(*d, typeId); + } + } + } + else + { + int typeId = objType->GetSubTypeId(); + + if( dst->numElements > 0 && src->numElements > 0 ) + { + int count = dst->numElements > src->numElements ? src->numElements : dst->numElements; + if( typeId & asTYPEID_MASK_OBJECT ) + { + // Call the assignment operator on all of the objects + asDWORD **max = (asDWORD**)(dst->data + count * sizeof(void*)); + asDWORD **d = (asDWORD**)dst->data; + asDWORD **s = (asDWORD**)src->data; + + for( ; d < max; d++, s++ ) + engine->CopyScriptObject(*d, *s, typeId); + } + else + { + // Primitives are copied byte for byte + memcpy(dst->data, src->data, count*elementSize); + } + } + } +} + +// GC behaviour +void CScriptArray::EnumReferences(asIScriptEngine *engine) +{ + // If the array is holding handles, then we need to notify the GC of them + int typeId = objType->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + void **d = (void**)buffer->data; + for( asUINT n = 0; n < buffer->numElements; n++ ) + { + if( d[n] ) + engine->GCEnumCallback(d[n]); + } + } +} + +// GC behaviour +void CScriptArray::ReleaseAllHandles(asIScriptEngine *engine) +{ + int subTypeId = objType->GetSubTypeId(); + asIObjectType *subType = engine->GetObjectTypeById(subTypeId); + if( subType && subType->GetFlags() & asOBJ_GC ) + { + void **d = (void**)buffer->data; + for( asUINT n = 0; n < buffer->numElements; n++ ) + { + if( d[n] ) + { + engine->ReleaseScriptObject(d[n], subTypeId); + d[n] = 0; + } + } + } +} + +void CScriptArray::AddRef() +{ + // Clear the GC flag then increase the counter + gcFlag = false; + refCount++; +} + +void CScriptArray::Release() +{ + // Now do the actual releasing (clearing the flag set by GC) + gcFlag = false; + if( --refCount == 0 ) + { + delete this; + } +} + +// GC behaviour +int CScriptArray::GetRefCount() +{ + return refCount; +} + +// GC behaviour +void CScriptArray::SetFlag() +{ + gcFlag = true; +} + +// GC behaviour +bool CScriptArray::GetFlag() +{ + return gcFlag; +} + +//-------------------------------------------- +// Generic calling conventions + +static void ScriptArrayFactory_Generic(asIScriptGeneric *gen) +{ + asIObjectType *ot = *(asIObjectType**)gen->GetAddressOfArg(0); + + *(CScriptArray**)gen->GetAddressOfReturnLocation() = ScriptArrayFactory(ot); +} + +static void ScriptArrayFactory2_Generic(asIScriptGeneric *gen) +{ + asIObjectType *ot = *(asIObjectType**)gen->GetAddressOfArg(0); + asUINT length = gen->GetArgDWord(1); + + *(CScriptArray**)gen->GetAddressOfReturnLocation() = ScriptArrayFactory2(ot, length); +} + +static void ScriptArrayTemplateCallback_Generic(asIScriptGeneric *gen) +{ + asIObjectType *ot = *(asIObjectType**)gen->GetAddressOfArg(0); + *(bool*)gen->GetAddressOfReturnLocation() = ScriptArrayTemplateCallback(ot); +} + +static void ScriptArrayAssignment_Generic(asIScriptGeneric *gen) +{ + CScriptArray *other = (CScriptArray*)gen->GetArgObject(0); + CScriptArray *self = (CScriptArray*)gen->GetObject(); + + *self = *other; + + gen->SetReturnObject(self); +} + +static void ScriptArrayAt_Generic(asIScriptGeneric *gen) +{ + asUINT index = gen->GetArgDWord(0); + CScriptArray *self = (CScriptArray*)gen->GetObject(); + + gen->SetReturnAddress(self->At(index)); +} + +static void ScriptArrayLength_Generic(asIScriptGeneric *gen) +{ + CScriptArray *self = (CScriptArray*)gen->GetObject(); + + gen->SetReturnDWord(self->GetSize()); +} + +static void ScriptArrayResize_Generic(asIScriptGeneric *gen) +{ + asUINT size = gen->GetArgDWord(0); + CScriptArray *self = (CScriptArray*)gen->GetObject(); + + self->Resize(size); +} + +static void ScriptArrayAddRef_Generic(asIScriptGeneric *gen) +{ + CScriptArray *self = (CScriptArray*)gen->GetObject(); + self->AddRef(); +} + +static void ScriptArrayRelease_Generic(asIScriptGeneric *gen) +{ + CScriptArray *self = (CScriptArray*)gen->GetObject(); + self->Release(); +} + +static void ScriptArrayGetRefCount_Generic(asIScriptGeneric *gen) +{ + CScriptArray *self = (CScriptArray*)gen->GetObject(); + *(int*)gen->GetAddressOfReturnLocation() = self->GetRefCount(); +} + +static void ScriptArraySetFlag_Generic(asIScriptGeneric *gen) +{ + CScriptArray *self = (CScriptArray*)gen->GetObject(); + self->SetFlag(); +} + +static void ScriptArrayGetFlag_Generic(asIScriptGeneric *gen) +{ + CScriptArray *self = (CScriptArray*)gen->GetObject(); + *(bool*)gen->GetAddressOfReturnLocation() = self->GetFlag(); +} + +static void ScriptArrayEnumReferences_Generic(asIScriptGeneric *gen) +{ + CScriptArray *self = (CScriptArray*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->EnumReferences(engine); +} + +static void ScriptArrayReleaseAllHandles_Generic(asIScriptGeneric *gen) +{ + CScriptArray *self = (CScriptArray*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->ReleaseAllHandles(engine); +} + +void RegisterScriptArray_Generic(asIScriptEngine *engine) +{ + int r; + + r = engine->RegisterObjectType("array", 0, asOBJ_REF | asOBJ_GC | asOBJ_TEMPLATE); assert( r >= 0 ); + + r = engine->RegisterObjectBehaviour("array", asBEHAVE_FACTORY, "array@ f(int&in)", asFUNCTION(ScriptArrayFactory_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_TEMPLATE_CALLBACK, "bool f(int&in)", asFUNCTION(ScriptArrayTemplateCallback_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_FACTORY, "array@ f(int&in, uint)", asFUNCTION(ScriptArrayFactory2_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_ADDREF, "void f()", asFUNCTION(ScriptArrayAddRef_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_RELEASE, "void f()", asFUNCTION(ScriptArrayRelease_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_INDEX, "T &f(uint)", asFUNCTION(ScriptArrayAt_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_INDEX, "const T &f(uint) const", asFUNCTION(ScriptArrayAt_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("array", "array &opAssign(const array&in)", asFUNCTION(ScriptArrayAssignment_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("array", "uint length() const", asFUNCTION(ScriptArrayLength_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("array", "void resize(uint)", asFUNCTION(ScriptArrayResize_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_GETREFCOUNT, "int f()", asFUNCTION(ScriptArrayGetRefCount_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_SETGCFLAG, "void f()", asFUNCTION(ScriptArraySetFlag_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_GETGCFLAG, "bool f()", asFUNCTION(ScriptArrayGetFlag_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_ENUMREFS, "void f(int&in)", asFUNCTION(ScriptArrayEnumReferences_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("array", asBEHAVE_RELEASEREFS, "void f(int&in)", asFUNCTION(ScriptArrayReleaseAllHandles_Generic), asCALL_GENERIC); assert( r >= 0 ); +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptarray/scriptarray.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptarray/scriptarray.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptarray/scriptarray.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptarray/scriptarray.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,65 @@ +#ifndef SCRIPTARRAY_H +#define SCRIPTARRAY_H + +#include + +BEGIN_AS_NAMESPACE + +struct SArrayBuffer; + +class CScriptArray +{ +public: + CScriptArray(asUINT length, asIObjectType *ot); + virtual ~CScriptArray(); + + void AddRef(); + void Release(); + + // Type information + asIObjectType *GetArrayObjectType() const; + int GetArrayTypeId() const; + int GetElementTypeId() const; + + void Resize(asUINT numElements); + asUINT GetSize(); + + // Get a pointer to an element. Returns 0 if out of bounds + void *At(asUINT index); + + CScriptArray &operator=(const CScriptArray&); + + // TODO: Add methods Sort, Reverse, Find, PopLast, PushLast, InsertAt, RemoveAt, etc + + // GC methods + int GetRefCount(); + void SetFlag(); + bool GetFlag(); + void EnumReferences(asIScriptEngine *engine); + void ReleaseAllHandles(asIScriptEngine *engine); + +protected: + int refCount; + bool gcFlag; + asIObjectType *objType; + SArrayBuffer *buffer; + bool isArrayOfHandles; + int elementSize; + + bool CheckMaxSize(asUINT numElements); + + void CreateBuffer(SArrayBuffer **buf, asUINT numElements); + void DeleteBuffer(SArrayBuffer *buf); + void CopyBuffer(SArrayBuffer *dst, SArrayBuffer *src); + + void Construct(SArrayBuffer *buf, asUINT start, asUINT end); + void Destruct(SArrayBuffer *buf, asUINT start, asUINT end); +}; + +void RegisterScriptArray(asIScriptEngine *engine); +void RegisterScriptArray_Native(asIScriptEngine *engine); +void RegisterScriptArray_Generic(asIScriptEngine *engine); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptbuilder/scriptbuilder.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptbuilder/scriptbuilder.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptbuilder/scriptbuilder.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptbuilder/scriptbuilder.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,689 @@ +#include "scriptbuilder.h" +#include +using namespace std; + +#include +#if defined(_MSC_VER) && !defined(_WIN32_WCE) +#include +#endif +#ifdef _WIN32_WCE +#include // For GetModuleFileName +#endif + + +BEGIN_AS_NAMESPACE + +// Helper functions +static const char *GetCurrentDir(char *buf, size_t size); + +CScriptBuilder::CScriptBuilder() +{ + engine = 0; + module = 0; + + includeCallback = 0; + callbackParam = 0; +} + +void CScriptBuilder::SetIncludeCallback(INCLUDECALLBACK_t callback, void *userParam) +{ + includeCallback = callback; + callbackParam = userParam; +} + +int CScriptBuilder::StartNewModule(asIScriptEngine *engine, const char *moduleName) +{ + this->engine = engine; + module = engine->GetModule(moduleName, asGM_ALWAYS_CREATE); + if( module == 0 ) + return -1; + + ClearAll(); + + return 0; +} + +int CScriptBuilder::AddSectionFromFile(const char *filename) +{ + if( IncludeIfNotAlreadyIncluded(filename) ) + { + int r = LoadScriptSection(filename); + if( r < 0 ) + return r; + } + + return 0; +} + +int CScriptBuilder::AddSectionFromMemory(const char *scriptCode, const char *sectionName) +{ + if( IncludeIfNotAlreadyIncluded(sectionName) ) + { + int r = ProcessScriptSection(scriptCode, sectionName); + if( r < 0 ) + return r; + } + + return 0; +} + +int CScriptBuilder::BuildModule() +{ + return Build(); +} + +void CScriptBuilder::DefineWord(const char *word) +{ + string sword = word; + if( definedWords.find(sword) == definedWords.end() ) + { + definedWords.insert(sword); + } +} + +void CScriptBuilder::ClearAll() +{ + includedScripts.clear(); + +#if AS_PROCESS_METADATA == 1 + foundDeclarations.clear(); + typeMetadataMap.clear(); + funcMetadataMap.clear(); + varMetadataMap.clear(); +#endif +} + +bool CScriptBuilder::IncludeIfNotAlreadyIncluded(const char *filename) +{ + string scriptFile = filename; + if( includedScripts.find(scriptFile) != includedScripts.end() ) + { + // Already included + return false; + } + + // Add the file to the set of included sections + includedScripts.insert(scriptFile); + + return true; +} + +int CScriptBuilder::LoadScriptSection(const char *filename) +{ + // TODO: The file name stored in the set should be the fully resolved name because + // it is possible to name the same file in multiple ways using relative paths. + + // Open the script file + string scriptFile = filename; +#if _MSC_VER >= 1500 + FILE *f = 0; + fopen_s(&f, scriptFile.c_str(), "rb"); +#else + FILE *f = fopen(scriptFile.c_str(), "rb"); +#endif + if( f == 0 ) + { + // Write a message to the engine's message callback + char buf[256]; + string msg = "Failed to open script file in path: '" + string(GetCurrentDir(buf, 256)) + "'"; + engine->WriteMessage(filename, 0, 0, asMSGTYPE_ERROR, msg.c_str()); + return -1; + } + + // Determine size of the file + fseek(f, 0, SEEK_END); + int len = ftell(f); + fseek(f, 0, SEEK_SET); + + // On Win32 it is possible to do the following instead + // int len = _filelength(_fileno(f)); + + // Read the entire file + string code; + code.resize(len); + size_t c = fread(&code[0], len, 1, f); + + fclose(f); + + if( c == 0 ) + { + // Write a message to the engine's message callback + char buf[256]; + string msg = "Failed to load script file in path: '" + string(GetCurrentDir(buf, 256)) + "'"; + engine->WriteMessage(filename, 0, 0, asMSGTYPE_ERROR, msg.c_str()); + return -1; + } + + return ProcessScriptSection(code.c_str(), filename); +} + +int CScriptBuilder::ProcessScriptSection(const char *script, const char *sectionname) +{ + vector includes; + + // Perform a superficial parsing of the script first to store the metadata + modifiedScript = script; + + // First perform the checks for #if directives to exclude code that shouldn't be compiled + int pos = 0; + int nested = 0; + while( pos < (int)modifiedScript.size() ) + { + int len; + asETokenClass t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + if( t == asTC_UNKNOWN && modifiedScript[pos] == '#' ) + { + int start = pos++; + + // Is this an #if directive? + asETokenClass t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + + string token; + token.assign(&modifiedScript[pos], len); + + pos += len; + + if( token == "if" ) + { + t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + if( t == asTC_WHITESPACE ) + { + pos += len; + t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + } + + if( t == asTC_IDENTIFIER ) + { + string word; + word.assign(&modifiedScript[pos], len); + + // Overwrite the #if directive with space characters to avoid compiler error + pos += len; + OverwriteCode(start, pos-start); + + // Has this identifier been defined by the application or not? + if( definedWords.find(word) == definedWords.end() ) + { + // Exclude all the code until and including the #endif + pos = ExcludeCode(pos); + } + else + { + nested++; + } + } + } + else if( token == "endif" ) + { + // Only remove the #endif if there was a matching #if + if( nested > 0 ) + { + OverwriteCode(start, pos-start); + nested--; + } + } + } + else + pos += len; + } + +#if AS_PROCESS_METADATA == 1 + // Preallocate memory + string metadata, declaration; + metadata.reserve(500); + declaration.reserve(100); +#endif + + // Then check for meta data and #include directives + pos = 0; + while( pos < (int)modifiedScript.size() ) + { + int len; + asETokenClass t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + if( t == asTC_COMMENT || t == asTC_WHITESPACE ) + { + pos += len; + continue; + } + +#if AS_PROCESS_METADATA == 1 + // Is this the start of metadata? + if( modifiedScript[pos] == '[' ) + { + // Get the metadata string + pos = ExtractMetadataString(pos, metadata); + + // Determine what this metadata is for + int type; + pos = ExtractDeclaration(pos, declaration, type); + + // Store away the declaration in a map for lookup after the build has completed + if( type > 0 ) + { + SMetadataDecl decl(metadata, declaration, type); + foundDeclarations.push_back(decl); + } + } + else +#endif + // Is this a preprocessor directive? + if( modifiedScript[pos] == '#' ) + { + int start = pos++; + + asETokenClass t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + if( t == asTC_IDENTIFIER ) + { + string token; + token.assign(&modifiedScript[pos], len); + if( token == "include" ) + { + pos += len; + t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + if( t == asTC_WHITESPACE ) + { + pos += len; + t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + } + + if( t == asTC_VALUE && len > 2 && modifiedScript[pos] == '"' ) + { + // Get the include file + string includefile; + includefile.assign(&modifiedScript[pos+1], len-2); + pos += len; + + // Store it for later processing + includes.push_back(includefile); + + // Overwrite the include directive with space characters to avoid compiler error + OverwriteCode(start, pos-start); + } + } + } + } + // Don't search for metadata/includes within statement blocks or between tokens in statements + else + pos = SkipStatement(pos); + } + + // Build the actual script + engine->SetEngineProperty(asEP_COPY_SCRIPT_SECTIONS, true); + module->AddScriptSection(sectionname, modifiedScript.c_str(), modifiedScript.size()); + + if( includes.size() > 0 ) + { + // If the callback has been set, then call it for each included file + if( includeCallback ) + { + for( int n = 0; n < (int)includes.size(); n++ ) + { + int r = includeCallback(includes[n].c_str(), sectionname, this, callbackParam); + if( r < 0 ) + return r; + } + } + else + { + // By default we try to load the included file from the relative directory of the current file + + // Determine the path of the current script so that we can resolve relative paths for includes + string path = sectionname; + size_t posOfSlash = path.find_last_of("/\\"); + if( posOfSlash != string::npos ) + path.resize(posOfSlash+1); + else + path = ""; + + // Load the included scripts + for( int n = 0; n < (int)includes.size(); n++ ) + { + // If the include is a relative path, then prepend the path of the originating script + if( includes[n].find_first_of("/\\") != 0 && + includes[n].find_first_of(":") == string::npos ) + { + includes[n] = path + includes[n]; + } + + // Include the script section + int r = AddSectionFromFile(includes[n].c_str()); + if( r < 0 ) + return r; + } + } + } + + return 0; +} + +int CScriptBuilder::Build() +{ + int r = module->Build(); + if( r < 0 ) + return r; + +#if AS_PROCESS_METADATA == 1 + // After the script has been built, the metadata strings should be + // stored for later lookup by function id, type id, and variable index + for( int n = 0; n < (int)foundDeclarations.size(); n++ ) + { + SMetadataDecl *decl = &foundDeclarations[n]; + if( decl->type == 1 ) + { + // Find the type id + int typeId = module->GetTypeIdByDecl(decl->declaration.c_str()); + if( typeId >= 0 ) + typeMetadataMap.insert(map::value_type(typeId, decl->metadata)); + } + else if( decl->type == 2 ) + { + // Find the function id + int funcId = module->GetFunctionIdByDecl(decl->declaration.c_str()); + if( funcId >= 0 ) + funcMetadataMap.insert(map::value_type(funcId, decl->metadata)); + } + else if( decl->type == 3 ) + { + // Find the global variable index + int varIdx = module->GetGlobalVarIndexByDecl(decl->declaration.c_str()); + if( varIdx >= 0 ) + varMetadataMap.insert(map::value_type(varIdx, decl->metadata)); + } + } +#endif + + return 0; +} + +int CScriptBuilder::SkipStatement(int pos) +{ + int len; + + // Skip until ; or { whichever comes first + while( pos < (int)modifiedScript.length() && modifiedScript[pos] != ';' && modifiedScript[pos] != '{' ) + { + engine->ParseToken(&modifiedScript[pos], 0, &len); + pos += len; + } + + // Skip entire statement block + if( pos < (int)modifiedScript.length() && modifiedScript[pos] == '{' ) + { + pos += 1; + + // Find the end of the statement block + int level = 1; + while( level > 0 && pos < (int)modifiedScript.size() ) + { + asETokenClass t = engine->ParseToken(&modifiedScript[pos], 0, &len); + if( t == asTC_KEYWORD ) + { + if( modifiedScript[pos] == '{' ) + level++; + else if( modifiedScript[pos] == '}' ) + level--; + } + + pos += len; + } + } + else + pos += 1; + + return pos; +} + +// Overwrite all code with blanks until the matching #endif +int CScriptBuilder::ExcludeCode(int pos) +{ + int len; + int nested = 0; + while( pos < (int)modifiedScript.size() ) + { + asETokenClass t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + if( modifiedScript[pos] == '#' ) + { + modifiedScript[pos] = ' '; + pos++; + + // Is it an #if or #endif directive? + t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + string token; + token.assign(&modifiedScript[pos], len); + OverwriteCode(pos, len); + + if( token == "if" ) + { + nested++; + } + else if( token == "endif" ) + { + if( nested-- == 0 ) + { + pos += len; + break; + } + } + } + else if( modifiedScript[pos] != '\n' ) + { + OverwriteCode(pos, len); + } + pos += len; + } + + return pos; +} + +// Overwrite all characters except line breaks with blanks +void CScriptBuilder::OverwriteCode(int start, int len) +{ + char *code = &modifiedScript[start]; + for( int n = 0; n < len; n++ ) + { + if( *code != '\n' ) + *code = ' '; + code++; + } +} + +#if AS_PROCESS_METADATA == 1 +int CScriptBuilder::ExtractMetadataString(int pos, string &metadata) +{ + metadata = ""; + + // Overwrite the metadata with space characters to allow compilation + modifiedScript[pos] = ' '; + + // Skip opening brackets + pos += 1; + + int level = 1; + int len; + while( level > 0 && pos < (int)modifiedScript.size() ) + { + asETokenClass t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + if( t == asTC_KEYWORD ) + { + if( modifiedScript[pos] == '[' ) + level++; + else if( modifiedScript[pos] == ']' ) + level--; + } + + // Copy the metadata to our buffer + if( level > 0 ) + metadata.append(&modifiedScript[pos], len); + + // Overwrite the metadata with space characters to allow compilation + if( t != asTC_WHITESPACE ) + OverwriteCode(pos, len); + + pos += len; + } + + return pos; +} + +int CScriptBuilder::ExtractDeclaration(int pos, string &declaration, int &type) +{ + declaration = ""; + type = 0; + + int start = pos; + + std::string token; + int len = 0; + asETokenClass t = asTC_WHITESPACE; + + // Skip white spaces and comments + do + { + pos += len; + t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + } while ( t == asTC_WHITESPACE || t == asTC_COMMENT ); + + // We're expecting, either a class, interface, function, or variable declaration + if( t == asTC_KEYWORD || t == asTC_IDENTIFIER ) + { + token.assign(&modifiedScript[pos], len); + if( token == "interface" || token == "class" ) + { + // Skip white spaces and comments + do + { + pos += len; + t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + } while ( t == asTC_WHITESPACE || t == asTC_COMMENT ); + + if( t == asTC_IDENTIFIER ) + { + type = 1; + declaration.assign(&modifiedScript[pos], len); + pos += len; + return pos; + } + } + else + { + // For function declarations, store everything up to the start of the statement block + + // For variable declaration store everything up until the first parenthesis, assignment, or end statement. + + // We'll only know if the declaration is a variable or function declaration when we see the statement block, or absense of a statement block. + int varLength = 0; + declaration.append(&modifiedScript[pos], len); + pos += len; + for(; pos < (int)modifiedScript.size();) + { + t = engine->ParseToken(&modifiedScript[pos], modifiedScript.size() - pos, &len); + if( t == asTC_KEYWORD ) + { + token.assign(&modifiedScript[pos], len); + if( token == "{" ) + { + // We've found the end of a function signature + type = 2; + return pos; + } + if( token == "=" || token == ";" ) + { + // We've found the end of a variable declaration. + if( varLength != 0 ) + declaration.resize(varLength); + type = 3; + return pos; + } + else if( token == "(" && varLength == 0 ) + { + // This is the first parenthesis we encounter. If the parenthesis isn't followed + // by a statement block, then this is a variable declaration, in which case we + // should only store the type and name of the variable, not the initialization parameters. + varLength = (int)declaration.size(); + } + } + + declaration.append(&modifiedScript[pos], len); + pos += len; + } + } + } + + return start; +} + +const char *CScriptBuilder::GetMetadataStringForType(int typeId) +{ + map::iterator it = typeMetadataMap.find(typeId); + if( it != typeMetadataMap.end() ) + return it->second.c_str(); + + return ""; +} + +const char *CScriptBuilder::GetMetadataStringForFunc(int funcId) +{ + map::iterator it = funcMetadataMap.find(funcId); + if( it != funcMetadataMap.end() ) + return it->second.c_str(); + + return ""; +} + +const char *CScriptBuilder::GetMetadataStringForVar(int varIdx) +{ + map::iterator it = varMetadataMap.find(varIdx); + if( it != varMetadataMap.end() ) + return it->second.c_str(); + + return ""; +} +#endif + +static const char *GetCurrentDir(char *buf, size_t size) +{ +#ifdef _MSC_VER +#ifdef _WIN32_WCE + static TCHAR apppath[MAX_PATH] = TEXT(""); + if (!apppath[0]) + { + GetModuleFileName(NULL, apppath, MAX_PATH); + + + int appLen = _tcslen(apppath); + + // Look for the last backslash in the path, which would be the end + // of the path itself and the start of the filename. We only want + // the path part of the exe's full-path filename + // Safety is that we make sure not to walk off the front of the + // array (in case the path is nothing more than a filename) + while (appLen > 1) + { + if (apppath[appLen-1] == TEXT('\\')) + break; + appLen--; + } + + // Terminate the string after the trailing backslash + apppath[appLen] = TEXT('\0'); + } +#ifdef _UNICODE + wcstombs(buf, apppath, min(size, wcslen(apppath)*sizeof(wchar_t))); +#else + memcpy(buf, apppath, min(size, strlen(apppath))); +#endif + + return buf; +#else + return _getcwd(buf, (int)size); +#endif +#elif defined(__APPLE__) + return getcwd(buf, size); +#else + return ""; +#endif +} + +END_AS_NAMESPACE + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptbuilder/scriptbuilder.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptbuilder/scriptbuilder.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptbuilder/scriptbuilder.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptbuilder/scriptbuilder.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,135 @@ +#ifndef SCRIPTBUILDER_H +#define SCRIPTBUILDER_H + +//--------------------------- +// Compilation settings +// + +// Set this flag to turn on/off metadata processing +// 0 = off +// 1 = on +#ifndef AS_PROCESS_METADATA +#define AS_PROCESS_METADATA 1 +#endif + +// TODO: Implement flags for turning on/off include directives and conditional programming + + + +//--------------------------- +// Declaration +// + +#include + +#if defined(_MSC_VER) && _MSC_VER <= 1200 +// disable the annoying warnings on MSVC 6 +#pragma warning (disable:4786) +#endif + +#include +#include +#include +#include + +BEGIN_AS_NAMESPACE + +// TODO: Need a callback routine for resolving include directives +// When the builder encounters an include directive, it should call the callback with the current section name and the include directive. +// The application should respond by calling AddScriptFromFile or AddScriptFromMemory (or give an error if the include is invalid). +// The AddScriptFromFile/Memory should put the scripts on the queue to be built + +// TODO: Should process metadata for class/interface members as well + +class CScriptBuilder; + +// This callback will be called for each #include directive encountered by the +// builder. The callback should call the AddSectionFromFile or AddSectionFromMemory +// to add the included section to the script. If the include cannot be resolved +// then the function should return a negative value to abort the compilation. +typedef int (*INCLUDECALLBACK_t)(const char *include, const char *from, CScriptBuilder *builder, void *userParam); + +// Helper class for loading and pre-processing script files to +// support include directives and metadata declarations +class CScriptBuilder +{ +public: + CScriptBuilder(); + + // Start a new module + int StartNewModule(asIScriptEngine *engine, const char *moduleName); + + // Load a script section from a file on disk + int AddSectionFromFile(const char *filename); + + // Load a script section from memory + int AddSectionFromMemory(const char *scriptCode, + const char *sectionName = ""); + + // Build the added script sections + int BuildModule(); + + // Register the callback for resolving include directive + void SetIncludeCallback(INCLUDECALLBACK_t callback, void *userParam); + + // Add a pre-processor define for conditional compilation + void DefineWord(const char *word); + +#if AS_PROCESS_METADATA == 1 + // Get metadata declared for class types and interfaces + const char *GetMetadataStringForType(int typeId); + + // Get metadata declared for functions + const char *GetMetadataStringForFunc(int funcId); + + // Get metadata declared for global variables + const char *GetMetadataStringForVar(int varIdx); +#endif + +protected: + void ClearAll(); + int Build(); + int ProcessScriptSection(const char *script, const char *sectionname); + int LoadScriptSection(const char *filename); + bool IncludeIfNotAlreadyIncluded(const char *filename); + + int SkipStatement(int pos); + + int ExcludeCode(int start); + void OverwriteCode(int start, int len); + + asIScriptEngine *engine; + asIScriptModule *module; + std::string modifiedScript; + + INCLUDECALLBACK_t includeCallback; + void *callbackParam; + +#if AS_PROCESS_METADATA == 1 + int ExtractMetadataString(int pos, std::string &outMetadata); + int ExtractDeclaration(int pos, std::string &outDeclaration, int &outType); + + // Temporary structure for storing metadata and declaration + struct SMetadataDecl + { + SMetadataDecl(std::string m, std::string d, int t) : metadata(m), declaration(d), type(t) {} + std::string metadata; + std::string declaration; + int type; + }; + + std::vector foundDeclarations; + + std::map typeMetadataMap; + std::map funcMetadataMap; + std::map varMetadataMap; +#endif + + std::set includedScripts; + + std::set definedWords; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptdictionary/scriptdictionary.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptdictionary/scriptdictionary.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptdictionary/scriptdictionary.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptdictionary/scriptdictionary.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,467 @@ +#include +#include +#include "scriptdictionary.h" + +BEGIN_AS_NAMESPACE + +using namespace std; + +//-------------------------------------------------------------------------- +// CScriptDictionary implementation + +CScriptDictionary::CScriptDictionary(asIScriptEngine *engine) +{ + // We start with one reference + refCount = 1; + + // Keep a reference to the engine for as long as we live + // We don't increment the reference counter, because the + // engine will hold a pointer to the object. + this->engine = engine; + + // Notify the garbage collector of this object + // TODO: The type id should be cached + engine->NotifyGarbageCollectorOfNewObject(this, engine->GetTypeIdByDecl("dictionary")); +} + +CScriptDictionary::~CScriptDictionary() +{ + // Delete all keys and values + DeleteAll(); +} + +void CScriptDictionary::AddRef() +{ + // We need to clear the GC flag + refCount = (refCount & 0x7FFFFFFF) + 1; +} + +void CScriptDictionary::Release() +{ + // We need to clear the GC flag + refCount = (refCount & 0x7FFFFFFF) - 1; + if( refCount == 0 ) + delete this; +} + +int CScriptDictionary::GetRefCount() +{ + return refCount & 0x7FFFFFFF; +} + +void CScriptDictionary::SetGCFlag() +{ + refCount |= 0x80000000; +} + +bool CScriptDictionary::GetGCFlag() +{ + return (refCount & 0x80000000) ? true : false; +} + +void CScriptDictionary::EnumReferences(asIScriptEngine *engine) +{ + // Call the gc enum callback for each of the objects + map::iterator it; + for( it = dict.begin(); it != dict.end(); it++ ) + { + if( it->second.typeId & asTYPEID_MASK_OBJECT ) + engine->GCEnumCallback(it->second.valueObj); + } +} + +void CScriptDictionary::ReleaseAllReferences(asIScriptEngine * /*engine*/) +{ + // We're being told to release all references in + // order to break circular references for dead objects + DeleteAll(); +} + +CScriptDictionary &CScriptDictionary::operator =(const CScriptDictionary & /*other*/) +{ + // Do nothing + // TODO: Should do a shallow copy of the dictionary + + return *this; +} + +void CScriptDictionary::Set(const string &key, void *value, int typeId) +{ + valueStruct valStruct = {{0},0}; + valStruct.typeId = typeId; + if( typeId & asTYPEID_OBJHANDLE ) + { + // We're receiving a reference to the handle, so we need to dereference it + valStruct.valueObj = *(void**)value; + engine->AddRefScriptObject(valStruct.valueObj, typeId); + } + else if( typeId & asTYPEID_MASK_OBJECT ) + { + // Create a copy of the object + valStruct.valueObj = engine->CreateScriptObjectCopy(value, typeId); + } + else + { + // Copy the primitive value + // We receive a pointer to the value. + int size = engine->GetSizeOfPrimitiveType(typeId); + memcpy(&valStruct.valueInt, value, size); + } + + map::iterator it; + it = dict.find(key); + if( it != dict.end() ) + { + FreeValue(it->second); + + // Insert the new value + it->second = valStruct; + } + else + { + dict.insert(map::value_type(key, valStruct)); + } +} + +// This overloaded method is implemented so that all integer and +// unsigned integers types will be stored in the dictionary as int64 +// through implicit conversions. This simplifies the management of the +// numeric types when the script retrieves the stored value using a +// different type. +void CScriptDictionary::Set(const string &key, asINT64 &value) +{ + Set(key, &value, asTYPEID_INT64); +} + +// This overloaded method is implemented so that all floating point types +// will be stored in the dictionary as double through implicit conversions. +// This simplifies the management of the numeric types when the script +// retrieves the stored value using a different type. +void CScriptDictionary::Set(const string &key, double &value) +{ + Set(key, &value, asTYPEID_DOUBLE); +} + +// Returns true if the value was successfully retrieved +bool CScriptDictionary::Get(const string &key, void *value, int typeId) const +{ + map::const_iterator it; + it = dict.find(key); + if( it != dict.end() ) + { + // Return the value + if( typeId & asTYPEID_OBJHANDLE ) + { + // A handle can be retrieved if the stored type is a handle of same or compatible type + // or if the stored type is an object that implements the interface that the handle refer to. + if( (it->second.typeId & asTYPEID_MASK_OBJECT) && + engine->IsHandleCompatibleWithObject(it->second.valueObj, it->second.typeId, typeId) ) + { + engine->AddRefScriptObject(it->second.valueObj, it->second.typeId); + *(void**)value = it->second.valueObj; + + return true; + } + } + else if( typeId & asTYPEID_MASK_OBJECT ) + { + // Verify that the copy can be made + bool isCompatible = false; + if( it->second.typeId == typeId ) + isCompatible = true; + + // Copy the object into the given reference + if( isCompatible ) + { + engine->CopyScriptObject(value, it->second.valueObj, typeId); + + return true; + } + } + else + { + if( it->second.typeId == typeId ) + { + int size = engine->GetSizeOfPrimitiveType(typeId); + memcpy(value, &it->second.valueInt, size); + return true; + } + + // We know all numbers are stored as either int64 or double, since we register overloaded functions for those + if( it->second.typeId == asTYPEID_INT64 && typeId == asTYPEID_DOUBLE ) + { + *(double*)value = double(it->second.valueInt); + return true; + } + else if( it->second.typeId == asTYPEID_DOUBLE && typeId == asTYPEID_INT64 ) + { + *(asINT64*)value = asINT64(it->second.valueFlt); + return true; + } + } + } + + // AngelScript has already initialized the value with a default value, + // so we don't have to do anything if we don't find the element, or if + // the element is incompatible with the requested type. + + return false; +} + +bool CScriptDictionary::Get(const string &key, asINT64 &value) const +{ + return Get(key, &value, asTYPEID_INT64); +} + +bool CScriptDictionary::Get(const string &key, double &value) const +{ + return Get(key, &value, asTYPEID_DOUBLE); +} + +bool CScriptDictionary::Exists(const string &key) const +{ + map::const_iterator it; + it = dict.find(key); + if( it != dict.end() ) + { + return true; + } + + return false; +} + +void CScriptDictionary::Delete(const string &key) +{ + map::iterator it; + it = dict.find(key); + if( it != dict.end() ) + { + FreeValue(it->second); + + dict.erase(it); + } +} + +void CScriptDictionary::DeleteAll() +{ + map::iterator it; + for( it = dict.begin(); it != dict.end(); it++ ) + { + FreeValue(it->second); + } + + dict.clear(); +} + +void CScriptDictionary::FreeValue(valueStruct &value) +{ + // If it is a handle or a ref counted object, call release + if( value.typeId & asTYPEID_MASK_OBJECT ) + { + // Let the engine release the object + engine->ReleaseScriptObject(value.valueObj, value.typeId); + value.valueObj = 0; + value.typeId = 0; + } + + // For primitives, there's nothing to do +} + +//-------------------------------------------------------------------------- +// Generic wrappers + +void ScriptDictionaryFactory_Generic(asIScriptGeneric *gen) +{ + *(CScriptDictionary**)gen->GetAddressOfReturnLocation() = new CScriptDictionary(gen->GetEngine()); +} + +void ScriptDictionaryAddRef_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + dict->AddRef(); +} + +void ScriptDictionaryRelease_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + dict->Release(); +} + +void ScriptDictionarySet_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + string *key = *(string**)gen->GetAddressOfArg(0); + void *ref = *(void**)gen->GetAddressOfArg(1); + int typeId = gen->GetArgTypeId(1); + dict->Set(*key, ref, typeId); +} + +void ScriptDictionarySetInt_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + string *key = *(string**)gen->GetAddressOfArg(0); + void *ref = *(void**)gen->GetAddressOfArg(1); + dict->Set(*key, *(asINT64*)ref); +} + +void ScriptDictionarySetFlt_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + string *key = *(string**)gen->GetAddressOfArg(0); + void *ref = *(void**)gen->GetAddressOfArg(1); + dict->Set(*key, *(double*)ref); +} + +void ScriptDictionaryGet_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + string *key = *(string**)gen->GetAddressOfArg(0); + void *ref = *(void**)gen->GetAddressOfArg(1); + int typeId = gen->GetArgTypeId(1); + *(bool*)gen->GetAddressOfReturnLocation() = dict->Get(*key, ref, typeId); +} + +void ScriptDictionaryGetInt_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + string *key = *(string**)gen->GetAddressOfArg(0); + void *ref = *(void**)gen->GetAddressOfArg(1); + *(bool*)gen->GetAddressOfReturnLocation() = dict->Get(*key, *(asINT64*)ref); +} + +void ScriptDictionaryGetFlt_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + string *key = *(string**)gen->GetAddressOfArg(0); + void *ref = *(void**)gen->GetAddressOfArg(1); + *(bool*)gen->GetAddressOfReturnLocation() = dict->Get(*key, *(double*)ref); +} + +void ScriptDictionaryExists_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + string *key = *(string**)gen->GetAddressOfArg(0); + bool ret = dict->Exists(*key); + *(bool*)gen->GetAddressOfReturnLocation() = ret; +} + +void ScriptDictionaryDelete_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + string *key = *(string**)gen->GetAddressOfArg(0); + dict->Delete(*key); +} + +void ScriptDictionaryDeleteAll_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *dict = (CScriptDictionary*)gen->GetObject(); + dict->DeleteAll(); +} + +static void ScriptDictionaryGetRefCount_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *self = (CScriptDictionary*)gen->GetObject(); + *(int*)gen->GetAddressOfReturnLocation() = self->GetRefCount(); +} + +static void ScriptDictionarySetGCFlag_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *self = (CScriptDictionary*)gen->GetObject(); + self->SetGCFlag(); +} + +static void ScriptDictionaryGetGCFlag_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *self = (CScriptDictionary*)gen->GetObject(); + *(bool*)gen->GetAddressOfReturnLocation() = self->GetGCFlag(); +} + +static void ScriptDictionaryEnumReferences_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *self = (CScriptDictionary*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->EnumReferences(engine); +} + +static void ScriptDictionaryReleaseAllReferences_Generic(asIScriptGeneric *gen) +{ + CScriptDictionary *self = (CScriptDictionary*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->ReleaseAllReferences(engine); +} + +//-------------------------------------------------------------------------- +// Register the type + +void RegisterScriptDictionary(asIScriptEngine *engine) +{ + if( strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") ) + RegisterScriptDictionary_Generic(engine); + else + RegisterScriptDictionary_Native(engine); +} + +void RegisterScriptDictionary_Native(asIScriptEngine *engine) +{ + int r; + + r = engine->RegisterObjectType("dictionary", sizeof(CScriptDictionary), asOBJ_REF | asOBJ_GC); assert( r >= 0 ); + // Use the generic interface to construct the object since we need the engine pointer, we could also have retrieved the engine pointer from the active context + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_FACTORY, "dictionary@ f()", asFUNCTION(ScriptDictionaryFactory_Generic), asCALL_GENERIC); assert( r>= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_ADDREF, "void f()", asMETHOD(CScriptDictionary,AddRef), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_RELEASE, "void f()", asMETHOD(CScriptDictionary,Release), asCALL_THISCALL); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("dictionary", "void set(const string &in, ?&in)", asMETHODPR(CScriptDictionary,Set,(const string&,void*,int),void), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("dictionary", "bool get(const string &in, ?&out) const", asMETHODPR(CScriptDictionary,Get,(const string&,void*,int) const,bool), asCALL_THISCALL); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("dictionary", "void set(const string &in, int64&in)", asMETHODPR(CScriptDictionary,Set,(const string&,asINT64&),void), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("dictionary", "bool get(const string &in, int64&out) const", asMETHODPR(CScriptDictionary,Get,(const string&,asINT64&) const,bool), asCALL_THISCALL); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("dictionary", "void set(const string &in, double&in)", asMETHODPR(CScriptDictionary,Set,(const string&,double&),void), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("dictionary", "bool get(const string &in, double&out) const", asMETHODPR(CScriptDictionary,Get,(const string&,double&) const,bool), asCALL_THISCALL); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("dictionary", "bool exists(const string &in) const", asMETHOD(CScriptDictionary,Exists), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("dictionary", "void delete(const string &in)", asMETHOD(CScriptDictionary,Delete), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("dictionary", "void deleteAll()", asMETHOD(CScriptDictionary,DeleteAll), asCALL_THISCALL); assert( r >= 0 ); + + // Register GC behaviours + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_GETREFCOUNT, "int f()", asMETHOD(CScriptDictionary,GetRefCount), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_SETGCFLAG, "void f()", asMETHOD(CScriptDictionary,SetGCFlag), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_GETGCFLAG, "bool f()", asMETHOD(CScriptDictionary,GetGCFlag), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_ENUMREFS, "void f(int&in)", asMETHOD(CScriptDictionary,EnumReferences), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_RELEASEREFS, "void f(int&in)", asMETHOD(CScriptDictionary,ReleaseAllReferences), asCALL_THISCALL); assert( r >= 0 ); +} + +void RegisterScriptDictionary_Generic(asIScriptEngine *engine) +{ + int r; + + r = engine->RegisterObjectType("dictionary", sizeof(CScriptDictionary), asOBJ_REF | asOBJ_GC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_FACTORY, "dictionary@ f()", asFUNCTION(ScriptDictionaryFactory_Generic), asCALL_GENERIC); assert( r>= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_ADDREF, "void f()", asFUNCTION(ScriptDictionaryAddRef_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_RELEASE, "void f()", asFUNCTION(ScriptDictionaryRelease_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("dictionary", "void set(const string &in, ?&in)", asFUNCTION(ScriptDictionarySet_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("dictionary", "bool get(const string &in, ?&out) const", asFUNCTION(ScriptDictionaryGet_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("dictionary", "void set(const string &in, int64&in)", asFUNCTION(ScriptDictionarySetInt_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("dictionary", "bool get(const string &in, int64&out) const", asFUNCTION(ScriptDictionaryGetInt_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("dictionary", "void set(const string &in, double&in)", asFUNCTION(ScriptDictionarySetFlt_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("dictionary", "bool get(const string &in, double&out) const", asFUNCTION(ScriptDictionaryGetFlt_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("dictionary", "bool exists(const string &in) const", asFUNCTION(ScriptDictionaryExists_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("dictionary", "void delete(const string &in)", asFUNCTION(ScriptDictionaryDelete_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("dictionary", "void deleteAll()", asFUNCTION(ScriptDictionaryDeleteAll_Generic), asCALL_GENERIC); assert( r >= 0 ); + + // Register GC behaviours + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_GETREFCOUNT, "int f()", asFUNCTION(ScriptDictionaryGetRefCount_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_SETGCFLAG, "void f()", asFUNCTION(ScriptDictionarySetGCFlag_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_GETGCFLAG, "bool f()", asFUNCTION(ScriptDictionaryGetGCFlag_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_ENUMREFS, "void f(int&in)", asFUNCTION(ScriptDictionaryEnumReferences_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("dictionary", asBEHAVE_RELEASEREFS, "void f(int&in)", asFUNCTION(ScriptDictionaryReleaseAllReferences_Generic), asCALL_GENERIC); assert( r >= 0 ); +} + +END_AS_NAMESPACE + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptdictionary/scriptdictionary.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptdictionary/scriptdictionary.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptdictionary/scriptdictionary.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptdictionary/scriptdictionary.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,98 @@ +#ifndef SCRIPTDICTIONARY_H +#define SCRIPTDICTIONARY_H + +// The dictionary class relies on the script string object, thus the script +// string type must be registered with the engine before registering the +// dictionary type + +#include +#include + +#ifdef _MSC_VER +// Turn off annoying warnings about truncated symbol names +#pragma warning (disable:4786) +#endif + +#include + +BEGIN_AS_NAMESPACE + +class CScriptDictionary +{ +public: + // Memory management + CScriptDictionary(asIScriptEngine *engine); + void AddRef(); + void Release(); + + // Sets/Gets a variable type value for a key + void Set(const std::string &key, void *value, int typeId); + bool Get(const std::string &key, void *value, int typeId) const; + + // Sets/Gets an integer number value for a key + void Set(const std::string &key, asINT64 &value); + bool Get(const std::string &key, asINT64 &value) const; + + // Sets/Gets a real number value for a key + void Set(const std::string &key, double &value); + bool Get(const std::string &key, double &value) const; + + // Returns true if the key is set + bool Exists(const std::string &key) const; + + // Deletes the key + void Delete(const std::string &key); + + // Deletes all keys + void DeleteAll(); + + // Garbage collections behaviours + int GetRefCount(); + void SetGCFlag(); + bool GetGCFlag(); + void EnumReferences(asIScriptEngine *engine); + void ReleaseAllReferences(asIScriptEngine *engine); + +protected: + // The structure for holding the values + struct valueStruct + { + union + { + asINT64 valueInt; + double valueFlt; + void *valueObj; + }; + int typeId; + }; + + // We don't want anyone to call the destructor directly, it should be called through the Release method + virtual ~CScriptDictionary(); + + // Don't allow assignment + CScriptDictionary &operator =(const CScriptDictionary &other); + + // Helper methods + void FreeValue(valueStruct &value); + + // Our properties + asIScriptEngine *engine; + int refCount; + std::map dict; +}; + +// This function will determine the configuration of the engine +// and use one of the two functions below to register the dictionary object +void RegisterScriptDictionary(asIScriptEngine *engine); + +// Call this function to register the math functions +// using native calling conventions +void RegisterScriptDictionary_Native(asIScriptEngine *engine); + +// Use this one instead if native calling conventions +// are not supported on the target platform +void RegisterScriptDictionary_Generic(asIScriptEngine *engine); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptfile/scriptfile.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptfile/scriptfile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptfile/scriptfile.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptfile/scriptfile.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,369 @@ +#include "scriptfile.h" +#include +#include +#include +#include +#include + +#ifdef _WIN32_WCE +#include // For GetModuleFileName +#ifdef GetObject +#undef GetObject +#endif +#endif + +using namespace std; + +BEGIN_AS_NAMESPACE + +CScriptFile *ScriptFile_Factory() +{ + return new CScriptFile(); +} + +void ScriptFile_Factory_Generic(asIScriptGeneric *gen) +{ + *(CScriptFile**)gen->GetAddressOfReturnLocation() = ScriptFile_Factory(); +} + +void ScriptFile_AddRef_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + file->AddRef(); +} + +void ScriptFile_Release_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + file->Release(); +} + +void ScriptFile_Open_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + std::string *f = (std::string*)gen->GetArgAddress(0); + std::string *m = (std::string*)gen->GetArgAddress(1); + int r = file->Open(*f, *m); + gen->SetReturnDWord(r); +} + +void ScriptFile_Close_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + int r = file->Close(); + gen->SetReturnDWord(r); +} + +void ScriptFile_GetSize_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + int r = file->GetSize(); + gen->SetReturnDWord(r); +} + +void ScriptFile_ReadString_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + int len = gen->GetArgDWord(0); + std::string *str = (std::string*)gen->GetArgAddress(1); + len = file->ReadString(len, *str); + gen->SetReturnDWord(len); +} + +void ScriptFile_ReadLine_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + std::string *str = (std::string*)gen->GetArgAddress(0); + int len = file->ReadLine(*str); + gen->SetReturnDWord(len); +} + +void ScriptFile_WriteString_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + std::string *str = (std::string*)gen->GetArgAddress(0); + gen->SetReturnDWord(file->WriteString(*str)); +} + +void ScriptFile_IsEOF_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + bool r = file->IsEOF(); + gen->SetReturnByte(r); +} + +void ScriptFile_GetPos_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + gen->SetReturnDWord(file->GetPos()); +} + +void ScriptFile_SetPos_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + int pos = (int)gen->GetArgDWord(0); + gen->SetReturnDWord(file->SetPos(pos)); +} + +void ScriptFile_MovePos_Generic(asIScriptGeneric *gen) +{ + CScriptFile *file = (CScriptFile*)gen->GetObject(); + int delta = (int)gen->GetArgDWord(0); + gen->SetReturnDWord(file->MovePos(delta)); +} + +void RegisterScriptFile_Native(asIScriptEngine *engine) +{ + int r; + + r = engine->RegisterObjectType("file", 0, asOBJ_REF); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("file", asBEHAVE_FACTORY, "file @f()", asFUNCTION(ScriptFile_Factory), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("file", asBEHAVE_ADDREF, "void f()", asMETHOD(CScriptFile,AddRef), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("file", asBEHAVE_RELEASE, "void f()", asMETHOD(CScriptFile,Release), asCALL_THISCALL); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("file", "int open(const string &in, const string &in)", asMETHOD(CScriptFile,Open), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int close()", asMETHOD(CScriptFile,Close), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int getSize() const", asMETHOD(CScriptFile,GetSize), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "bool isEndOfFile() const", asMETHOD(CScriptFile,IsEOF), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int readString(uint, string &out)", asMETHOD(CScriptFile,ReadString), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int readLine(string &out)", asMETHOD(CScriptFile,ReadLine), asCALL_THISCALL); assert( r >= 0 ); +#if AS_WRITE_OPS == 1 + r = engine->RegisterObjectMethod("file", "int writeString(const string &in)", asMETHOD(CScriptFile,WriteString), asCALL_THISCALL); assert( r >= 0 ); +#endif + r = engine->RegisterObjectMethod("file", "int getPos() const", asMETHOD(CScriptFile,GetPos), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int setPos(int)", asMETHOD(CScriptFile,SetPos), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int movePos(int)", asMETHOD(CScriptFile,MovePos), asCALL_THISCALL); assert( r >= 0 ); +} + +void RegisterScriptFile_Generic(asIScriptEngine *engine) +{ + int r; + + r = engine->RegisterObjectType("file", 0, asOBJ_REF); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("file", asBEHAVE_FACTORY, "file @f()", asFUNCTION(ScriptFile_Factory_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("file", asBEHAVE_ADDREF, "void f()", asFUNCTION(ScriptFile_AddRef_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("file", asBEHAVE_RELEASE, "void f()", asFUNCTION(ScriptFile_Release_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("file", "int open(const string &in, const string &in)", asFUNCTION(ScriptFile_Open_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int close()", asFUNCTION(ScriptFile_Close_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int getSize() const", asFUNCTION(ScriptFile_GetSize_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "bool isEndOfFile() const", asFUNCTION(ScriptFile_IsEOF_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int readString(uint, string &out)", asFUNCTION(ScriptFile_ReadString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int readLine(string &out)", asFUNCTION(ScriptFile_ReadLine_Generic), asCALL_GENERIC); assert( r >= 0 ); +#if AS_WRITE_OPS == 1 + r = engine->RegisterObjectMethod("file", "int writeString(const string &in)", asFUNCTION(ScriptFile_WriteString_Generic), asCALL_GENERIC); assert( r >= 0 ); +#endif + r = engine->RegisterObjectMethod("file", "int getPos() const", asFUNCTION(ScriptFile_GetPos_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int setPos(int)", asFUNCTION(ScriptFile_SetPos_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("file", "int movePos(int)", asFUNCTION(ScriptFile_MovePos_Generic), asCALL_GENERIC); assert( r >= 0 ); +} + +void RegisterScriptFile(asIScriptEngine *engine) +{ + if( strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") ) + RegisterScriptFile_Generic(engine); + else + RegisterScriptFile_Native(engine); +} + +CScriptFile::CScriptFile() +{ + refCount = 1; + file = 0; +} + +CScriptFile::~CScriptFile() +{ + Close(); +} + +void CScriptFile::AddRef() +{ + ++refCount; +} + +void CScriptFile::Release() +{ + if( --refCount == 0 ) + delete this; +} + +int CScriptFile::Open(const std::string &filename, const std::string &mode) +{ + // Close the previously opened file handle + if( file ) + Close(); + + std::string myFilename = filename; + + // Validate the mode + string m; +#if AS_WRITE_OPS == 1 + if( mode != "r" && mode != "w" && mode != "a" ) +#else + if( mode != "r" ) +#endif + return -1; + else + m = mode; + +#ifdef _WIN32_WCE + // no relative pathing on CE + char buf[MAX_PATH]; + static TCHAR apppath[MAX_PATH] = TEXT(""); + if (!apppath[0]) + { + GetModuleFileName(NULL, apppath, MAX_PATH); + + int appLen = _tcslen(apppath); + while (appLen > 1) + { + if (apppath[appLen-1] == TEXT('\\')) + break; + appLen--; + } + + // Terminate the string after the trailing backslash + apppath[appLen] = TEXT('\0'); + } +#ifdef _UNICODE + wcstombs(buf, apppath, wcslen(apppath)+1); +#else + memcpy(buf, apppath, strlen(apppath)); +#endif + myFilename = buf + myFilename; +#endif + + + // By default windows translates "\r\n" to "\n", but we want to read the file as-is. + m += "b"; + + // Open the file + file = fopen(myFilename.c_str(), m.c_str()); + if( file == 0 ) + return -1; + + return 0; +} + +int CScriptFile::Close() +{ + if( file == 0 ) + return -1; + + fclose(file); + file = 0; + + return 0; +} + +int CScriptFile::GetSize() const +{ + if( file == 0 ) + return -1; + + int pos = ftell(file); + fseek(file, 0, SEEK_END); + int size = ftell(file); + fseek(file, pos, SEEK_SET); + + return size; +} + +int CScriptFile::GetPos() const +{ + if( file == 0 ) + return -1; + + return ftell(file); +} + +int CScriptFile::SetPos(int pos) +{ + if( file == 0 ) + return -1; + + int r = fseek(file, pos, SEEK_SET); + + // Return -1 on error + return r ? -1 : 0; +} + +int CScriptFile::MovePos(int delta) +{ + if( file == 0 ) + return -1; + + int r = fseek(file, delta, SEEK_CUR); + + // Return -1 on error + return r ? -1 : 0; +} + +int CScriptFile::ReadString(unsigned int length, std::string &str) +{ + if( file == 0 ) + return 0; + + // Read the string + str.resize(length); + int size = (int)fread(&str[0], 1, length, file); + str.resize(size); + + return size; +} + +int CScriptFile::ReadLine(std::string &str) +{ + if( file == 0 ) + return 0; + + // Read until the first new-line character + str = ""; + char buf[256]; + + do + { + // Get the current position so we can determine how many characters were read + int start = ftell(file); + + // Set the last byte to something different that 0, so that we can check if the buffer was filled up + buf[255] = 1; + + // Read the line (or first 255 characters, which ever comes first) + fgets(buf, 256, file); + + // Get the position after the read + int end = ftell(file); + + // Add the read characters to the output buffer + str.append(buf, end-start); + } + while( !feof(file) && buf[255] == 0 && buf[254] != '\n' ); + + return int(str.size()); +} + +#if AS_WRITE_OPS == 1 +int CScriptFile::WriteString(const std::string &str) +{ + if( file == 0 ) + return -1; + + // Write the entire string + size_t r = fwrite(&str[0], 1, str.length(), file); + + return int(r); +} +#endif + +bool CScriptFile::IsEOF() const +{ + if( file == 0 ) + return true; + + return feof(file) ? true : false; +} + + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptfile/scriptfile.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptfile/scriptfile.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptfile/scriptfile.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptfile/scriptfile.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,89 @@ +// +// CScriptFile +// +// This class encapsulates a FILE pointer in a reference counted class for +// use within AngelScript. +// +// It requires the CScriptString add-on to work. +// + +#ifndef SCRIPTFILE_H +#define SCRIPTFILE_H + +//--------------------------- +// Compilation settings +// + +// Set this flag to turn on/off write support +// 0 = off +// 1 = on + +#ifndef AS_WRITE_OPS +#define AS_WRITE_OPS 1 +#endif + + + + +//--------------------------- +// Declaration +// + +#include +#include + +BEGIN_AS_NAMESPACE + +class CScriptString; + +class CScriptFile +{ +public: + CScriptFile(); + + void AddRef(); + void Release(); + + // TODO: Implement the "r+", "w+" and "a+" modes + // mode = "r" -> open the file for reading + // "w" -> open the file for writing (overwrites existing file) + // "a" -> open the file for appending + int Open(const std::string &filename, const std::string &mode); + int Close(); + int GetSize() const; + bool IsEOF() const; + + // Reading + int ReadString(unsigned int length, std::string &str); + int ReadLine(std::string &str); + + // Writing + int WriteString(const std::string &str); + + // Cursor + int GetPos() const; + int SetPos(int pos); + int MovePos(int delta); + +protected: + ~CScriptFile(); + + int refCount; + FILE *file; +}; + +// This function will determine the configuration of the engine +// and use one of the two functions below to register the file type +void RegisterScriptFile(asIScriptEngine *engine); + +// Call this function to register the file type +// using native calling conventions +void RegisterScriptFile_Native(asIScriptEngine *engine); + +// Use this one instead if native calling conventions +// are not supported on the target platform +void RegisterScriptFile_Generic(asIScriptEngine *engine); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scripthelper/scripthelper.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scripthelper/scripthelper.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scripthelper/scripthelper.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scripthelper/scripthelper.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,161 @@ +#include +#include "scripthelper.h" +#include + +using namespace std; + +BEGIN_AS_NAMESPACE + +int CompareRelation(asIScriptEngine *engine, void *lobj, void *robj, int typeId, int &result) +{ + // TODO: If a lot of script objects are going to be compared, e.g. when sorting an array, + // then the method id and context should be cached between calls. + + int retval = -1; + int funcId = 0; + + asIObjectType *ot = engine->GetObjectTypeById(typeId); + if( ot ) + { + // Check if the object type has a compatible opCmp method + for( int n = 0; n < ot->GetMethodCount(); n++ ) + { + asIScriptFunction *func = ot->GetMethodDescriptorByIndex(n); + if( strcmp(func->GetName(), "opCmp") == 0 && + func->GetReturnTypeId() == asTYPEID_INT32 && + func->GetParamCount() == 1 ) + { + asDWORD flags; + int paramTypeId = func->GetParamTypeId(0, &flags); + + // The parameter must be an input reference of the same type + if( flags != asTM_INREF || typeId != paramTypeId ) + break; + + // Found the method + funcId = ot->GetMethodIdByIndex(n); + break; + } + } + } + + if( funcId ) + { + // Call the method + asIScriptContext *ctx = engine->CreateContext(); + ctx->Prepare(funcId); + ctx->SetObject(lobj); + ctx->SetArgAddress(0, robj); + int r = ctx->Execute(); + if( r == asEXECUTION_FINISHED ) + { + result = (int)ctx->GetReturnDWord(); + + // The comparison was successful + retval = 0; + } + ctx->Release(); + } + + return retval; +} + +int CompareEquality(asIScriptEngine *engine, void *lobj, void *robj, int typeId, bool &result) +{ + // TODO: If a lot of script objects are going to be compared, e.g. when searching for an + // entry in a set, then the method id and context should be cached between calls. + + int retval = -1; + int funcId = 0; + + asIObjectType *ot = engine->GetObjectTypeById(typeId); + if( ot ) + { + // Check if the object type has a compatible opEquals method + for( int n = 0; n < ot->GetMethodCount(); n++ ) + { + asIScriptFunction *func = ot->GetMethodDescriptorByIndex(n); + if( strcmp(func->GetName(), "opEquals") == 0 && + func->GetReturnTypeId() == asTYPEID_BOOL && + func->GetParamCount() == 1 ) + { + asDWORD flags; + int paramTypeId = func->GetParamTypeId(0, &flags); + + // The parameter must be an input reference of the same type + if( flags != asTM_INREF || typeId != paramTypeId ) + break; + + // Found the method + funcId = ot->GetMethodIdByIndex(n); + break; + } + } + } + + if( funcId ) + { + // Call the method + asIScriptContext *ctx = engine->CreateContext(); + ctx->Prepare(funcId); + ctx->SetObject(lobj); + ctx->SetArgAddress(0, robj); + int r = ctx->Execute(); + if( r == asEXECUTION_FINISHED ) + { + result = ctx->GetReturnByte() ? true : false; + + // The comparison was successful + retval = 0; + } + ctx->Release(); + } + else + { + // If the opEquals method doesn't exist, then we try with opCmp instead + int relation; + retval = CompareRelation(engine, lobj, robj, typeId, relation); + if( retval >= 0 ) + result = relation == 0 ? true : false; + } + + return retval; +} + +int ExecuteString(asIScriptEngine *engine, const char *code, asIScriptModule *mod, asIScriptContext *ctx) +{ + // Wrap the code in a function so that it can be compiled and executed + string funcCode = "void ExecuteString() {\n"; + funcCode += code; + funcCode += "\n;}"; + + // If no module was provided, get a dummy from the engine + asIScriptModule *execMod = mod ? mod : engine->GetModule("ExecuteString", asGM_ALWAYS_CREATE); + + // Compile the function that can be executed + asIScriptFunction *func = 0; + int r = execMod->CompileFunction("ExecuteString", funcCode.c_str(), -1, 0, &func); + if( r < 0 ) + return r; + + // If no context was provided, request a new one from the engine + asIScriptContext *execCtx = ctx ? ctx : engine->CreateContext(); + r = execCtx->Prepare(func->GetId()); + if( r < 0 ) + { + func->Release(); + if( !ctx ) execCtx->Release(); + return r; + } + + // Execute the function + r = execCtx->Execute(); + + // Clean up + func->Release(); + if( !ctx ) execCtx->Release(); + + return r; +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scripthelper/scripthelper.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scripthelper/scripthelper.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scripthelper/scripthelper.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scripthelper/scripthelper.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,21 @@ +#ifndef SCRIPTHELPER_H +#define SCRIPTHELPER_H + +#include + +BEGIN_AS_NAMESPACE + +// Compare relation between two objects of the same type +int CompareRelation(asIScriptEngine *engine, void *lobj, void *robj, int typeId, int &result); + +// Compare equality between two objects of the same type +int CompareEquality(asIScriptEngine *engine, void *lobj, void *robj, int typeId, bool &result); + +// Compile and execute simple statements +// The module is optional. If given the statements can access the entities compiled in the module. +// The caller can optionally provide its own context, for example if a context should be reused. +int ExecuteString(asIScriptEngine *engine, const char *code, asIScriptModule *mod = 0, asIScriptContext *ctx = 0); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath/scriptmath.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath/scriptmath.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath/scriptmath.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath/scriptmath.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,235 @@ +#include +#include +#include +#include "scriptmath.h" + +BEGIN_AS_NAMESPACE + +// Determine whether the float version should be registered, or the double version +#ifndef AS_USE_FLOAT +#if !defined(_WIN32_WCE) // WinCE doesn't have the float versions of the math functions +#define AS_USE_FLOAT 1 +#endif +#endif + +// The modf function doesn't seem very intuitive, so I'm writing this +// function that simply returns the fractional part of the float value +#if AS_USE_FLOAT +float fractionf(float v) +{ + float intPart; + return modff(v, &intPart); +} +#else +double fraction(double v) +{ + double intPart; + return modf(v, &intPart); +} +#endif + +void RegisterScriptMath_Native(asIScriptEngine *engine) +{ + int r; + +#if AS_USE_FLOAT + // Trigonometric functions + r = engine->RegisterGlobalFunction("float cos(float)", asFUNCTIONPR(cosf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float sin(float)", asFUNCTIONPR(sinf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float tan(float)", asFUNCTIONPR(tanf, (float), float), asCALL_CDECL); assert( r >= 0 ); + + r = engine->RegisterGlobalFunction("float acos(float)", asFUNCTIONPR(acosf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float asin(float)", asFUNCTIONPR(asinf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float atan(float)", asFUNCTIONPR(atanf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float atan2(float,float)", asFUNCTIONPR(atan2f, (float, float), float), asCALL_CDECL); assert( r >= 0 ); + + // Hyberbolic functions + r = engine->RegisterGlobalFunction("float cosh(float)", asFUNCTIONPR(coshf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float sinh(float)", asFUNCTIONPR(sinhf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float tanh(float)", asFUNCTIONPR(tanhf, (float), float), asCALL_CDECL); assert( r >= 0 ); + + // Exponential and logarithmic functions + r = engine->RegisterGlobalFunction("float log(float)", asFUNCTIONPR(logf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float log10(float)", asFUNCTIONPR(log10f, (float), float), asCALL_CDECL); assert( r >= 0 ); + + // Power functions + r = engine->RegisterGlobalFunction("float pow(float, float)", asFUNCTIONPR(powf, (float, float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float sqrt(float)", asFUNCTIONPR(sqrtf, (float), float), asCALL_CDECL); assert( r >= 0 ); + + // Nearest integer, absolute value, and remainder functions + r = engine->RegisterGlobalFunction("float ceil(float)", asFUNCTIONPR(ceilf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float abs(float)", asFUNCTIONPR(fabsf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float floor(float)", asFUNCTIONPR(floorf, (float), float), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float fraction(float)", asFUNCTIONPR(fractionf, (float), float), asCALL_CDECL); assert( r >= 0 ); + + // Don't register modf because AngelScript already supports the % operator +#else + // double versions of the same + r = engine->RegisterGlobalFunction("double cos(double)", asFUNCTIONPR(cos, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double sin(double)", asFUNCTIONPR(sin, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double tan(double)", asFUNCTIONPR(tan, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double acos(double)", asFUNCTIONPR(acos, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double asin(double)", asFUNCTIONPR(asin, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double atan(double)", asFUNCTIONPR(atan, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double atan2(double,double)", asFUNCTIONPR(atan2, (double, double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double cosh(double)", asFUNCTIONPR(cosh, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double sinh(double)", asFUNCTIONPR(sinh, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double tanh(double)", asFUNCTIONPR(tanh, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double log(double)", asFUNCTIONPR(log, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double log10(double)", asFUNCTIONPR(log10, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double pow(double, double)", asFUNCTIONPR(pow, (double, double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double sqrt(double)", asFUNCTIONPR(sqrt, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double ceil(double)", asFUNCTIONPR(ceil, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double abs(double)", asFUNCTIONPR(fabs, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double floor(double)", asFUNCTIONPR(floor, (double), double), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double fraction(double)", asFUNCTIONPR(fraction, (double), double), asCALL_CDECL); assert( r >= 0 ); +#endif +} + +#if AS_USE_FLOAT +// This macro creates simple generic wrappers for functions of type 'float func(float)' +#define GENERICff(x) \ +void x##_generic(asIScriptGeneric *gen) \ +{ \ + float f = *(float*)gen->GetAddressOfArg(0); \ + *(float*)gen->GetAddressOfReturnLocation() = x(f); \ +} + +GENERICff(cosf) +GENERICff(sinf) +GENERICff(tanf) +GENERICff(acosf) +GENERICff(asinf) +GENERICff(atanf) +GENERICff(coshf) +GENERICff(sinhf) +GENERICff(tanhf) +GENERICff(logf) +GENERICff(log10f) +GENERICff(sqrtf) +GENERICff(ceilf) +GENERICff(fabsf) +GENERICff(floorf) +GENERICff(fractionf) + +void powf_generic(asIScriptGeneric *gen) +{ + float f1 = *(float*)gen->GetAddressOfArg(0); + float f2 = *(float*)gen->GetAddressOfArg(1); + *(float*)gen->GetAddressOfReturnLocation() = powf(f1, f2); +} +void atan2f_generic(asIScriptGeneric *gen) +{ + float f1 = *(float*)gen->GetAddressOfArg(0); + float f2 = *(float*)gen->GetAddressOfArg(1); + *(float*)gen->GetAddressOfReturnLocation() = atan2f(f1, f2); +} + +#else +// This macro creates simple generic wrappers for functions of type 'double func(double)' +#define GENERICdd(x) \ +void x##_generic(asIScriptGeneric *gen) \ +{ \ + double f = *(double*)gen->GetAddressOfArg(0); \ + *(double*)gen->GetAddressOfReturnLocation() = x(f); \ +} + +GENERICdd(cos) +GENERICdd(sin) +GENERICdd(tan) +GENERICdd(acos) +GENERICdd(asin) +GENERICdd(atan) +GENERICdd(cosh) +GENERICdd(sinh) +GENERICdd(tanh) +GENERICdd(log) +GENERICdd(log10) +GENERICdd(sqrt) +GENERICdd(ceil) +GENERICdd(fabs) +GENERICdd(floor) +GENERICdd(fraction) + +void pow_generic(asIScriptGeneric *gen) +{ + double f1 = *(double*)gen->GetAddressOfArg(0); + double f2 = *(double*)gen->GetAddressOfArg(1); + *(double*)gen->GetAddressOfReturnLocation() = pow(f1, f2); +} +void atan2_generic(asIScriptGeneric *gen) +{ + double f1 = *(double*)gen->GetAddressOfArg(0); + double f2 = *(double*)gen->GetAddressOfArg(1); + *(double*)gen->GetAddressOfReturnLocation() = atan2(f1, f2); +} +#endif +void RegisterScriptMath_Generic(asIScriptEngine *engine) +{ + int r; + +#if AS_USE_FLOAT + // Trigonometric functions + r = engine->RegisterGlobalFunction("float cos(float)", asFUNCTION(cosf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float sin(float)", asFUNCTION(sinf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float tan(float)", asFUNCTION(tanf_generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterGlobalFunction("float acos(float)", asFUNCTION(acosf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float asin(float)", asFUNCTION(asinf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float atan(float)", asFUNCTION(atanf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float atan2(float,float)", asFUNCTION(atan2f_generic), asCALL_GENERIC); assert( r >= 0 ); + + // Hyberbolic functions + r = engine->RegisterGlobalFunction("float cosh(float)", asFUNCTION(coshf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float sinh(float)", asFUNCTION(sinhf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float tanh(float)", asFUNCTION(tanhf_generic), asCALL_GENERIC); assert( r >= 0 ); + + // Exponential and logarithmic functions + r = engine->RegisterGlobalFunction("float log(float)", asFUNCTION(logf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float log10(float)", asFUNCTION(log10f_generic), asCALL_GENERIC); assert( r >= 0 ); + + // Power functions + r = engine->RegisterGlobalFunction("float pow(float, float)", asFUNCTION(powf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float sqrt(float)", asFUNCTION(sqrtf_generic), asCALL_GENERIC); assert( r >= 0 ); + + // Nearest integer, absolute value, and remainder functions + r = engine->RegisterGlobalFunction("float ceil(float)", asFUNCTION(ceilf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float abs(float)", asFUNCTION(fabsf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float floor(float)", asFUNCTION(floorf_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("float fraction(float)", asFUNCTION(fractionf_generic), asCALL_GENERIC); assert( r >= 0 ); + + // Don't register modf because AngelScript already supports the % operator +#else + // double versions of the same + r = engine->RegisterGlobalFunction("double cos(double)", asFUNCTION(cos_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double sin(double)", asFUNCTION(sin_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double tan(double)", asFUNCTION(tan_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double acos(double)", asFUNCTION(acos_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double asin(double)", asFUNCTION(asin_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double atan(double)", asFUNCTION(atan_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double atan2(double,double)", asFUNCTION(atan2_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double cosh(double)", asFUNCTION(cosh_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double sinh(double)", asFUNCTION(sinh_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double tanh(double)", asFUNCTION(tanh_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double log(double)", asFUNCTION(log_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double log10(double)", asFUNCTION(log10_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double pow(double, double)", asFUNCTION(pow_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double sqrt(double)", asFUNCTION(sqrt_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double ceil(double)", asFUNCTION(ceil_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double abs(double)", asFUNCTION(fabs_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double floor(double)", asFUNCTION(floor_generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("double fraction(double)", asFUNCTION(fraction_generic), asCALL_GENERIC); assert( r >= 0 ); +#endif +} + +void RegisterScriptMath(asIScriptEngine *engine) +{ + if( strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") ) + RegisterScriptMath_Generic(engine); + else + RegisterScriptMath_Native(engine); +} + +END_AS_NAMESPACE + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath/scriptmath.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath/scriptmath.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath/scriptmath.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath/scriptmath.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,22 @@ +#ifndef SCRIPTMATH_H +#define SCRIPTMATH_H + +#include + +BEGIN_AS_NAMESPACE + +// This function will determine the configuration of the engine +// and use one of the two functions below to register the math functions +void RegisterScriptMath(asIScriptEngine *engine); + +// Call this function to register the math functions +// using native calling conventions +void RegisterScriptMath_Native(asIScriptEngine *engine); + +// Use this one instead if native calling conventions +// are not supported on the target platform +void RegisterScriptMath_Generic(asIScriptEngine *engine); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath3d/scriptmath3d.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath3d/scriptmath3d.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath3d/scriptmath3d.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath3d/scriptmath3d.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,331 @@ +#include +#include // strstr +#include // new() +#include +#include "scriptmath3d.h" + +BEGIN_AS_NAMESPACE + +Vector3::Vector3() +{ + x = 0; + y = 0; + z = 0; +} + +Vector3::Vector3(const Vector3 &other) +{ + x = other.x; + y = other.y; + z = other.z; +} + +Vector3::Vector3(float _x, float _y, float _z) +{ + x = _x; + y = _y; + z = _z; +} + +bool operator==(const Vector3 &a, const Vector3 &b) +{ + return (a.x == b.x) && (a.y == b.y) && (a.z == b.z); +} + +bool operator!=(const Vector3 &a, const Vector3 &b) +{ + return !(a == b); +} + +Vector3 &Vector3::operator=(const Vector3 &other) +{ + x = other.x; + y = other.y; + z = other.z; + return *this; +} + +Vector3 &Vector3::operator+=(const Vector3 &other) +{ + x += other.x; + y += other.y; + z += other.z; + return *this; +} + +Vector3 &Vector3::operator-=(const Vector3 &other) +{ + x -= other.x; + y -= other.y; + z -= other.z; + return *this; +} + +Vector3 &Vector3::operator*=(float s) +{ + x *= s; + y *= s; + z *= s; + return *this; +} + +Vector3 &Vector3::operator/=(float s) +{ + x /= s; + y /= s; + z /= s; + return *this; +} + +float Vector3::length() const +{ + return sqrtf(x*x + y*y + z*z); +} + +Vector3 operator+(const Vector3 &a, const Vector3 &b) +{ + // Return a new object as a script handle + Vector3 res(a.x + b.x, a.y + b.y, a.z + b.z); + return res; +} + +Vector3 operator-(const Vector3 &a, const Vector3 &b) +{ + // Return a new object as a script handle + Vector3 res(a.x - b.x, a.y - b.y, a.z - b.z); + return res; +} + +Vector3 operator*(float s, const Vector3 &v) +{ + // Return a new object as a script handle + Vector3 res(v.x * s, v.y * s, v.z * s); + return res; +} + +Vector3 operator*(const Vector3 &v, float s) +{ + // Return a new object as a script handle + Vector3 res(v.x * s, v.y * s, v.z * s); + return res; +} + +Vector3 operator/(const Vector3 &v, float s) +{ + // Return a new object as a script handle + Vector3 res(v.x / s, v.y / s, v.z / s); + return res; +} + +//----------------------- +// AngelScript functions +//----------------------- + +static void Vector3DefaultConstructor(Vector3 *self) +{ + new(self) Vector3(); +} + +static void Vector3CopyConstructor(const Vector3 &other, Vector3 *self) +{ + new(self) Vector3(other); +} + +static void Vector3InitConstructor(float x, float y, float z, Vector3 *self) +{ + new(self) Vector3(x,y,z); +} + +//----------------------- +// Generic calling convention +//----------------------- + +static void Vector3DefaultConstructor_Generic(asIScriptGeneric *gen) +{ + Vector3 *self = (Vector3*)gen->GetObject(); + new(self) Vector3(); +} + +static void Vector3CopyConstructor_Generic(asIScriptGeneric *gen) +{ + Vector3 *other = (Vector3*)gen->GetArgObject(0); + Vector3 *self = (Vector3*)gen->GetObject(); + Vector3CopyConstructor(*other, self); +} + +static void Vector3InitConstructor_Generic(asIScriptGeneric *gen) +{ + float x = gen->GetArgFloat(0); + float y = gen->GetArgFloat(1); + float z = gen->GetArgFloat(2); + Vector3 *self = (Vector3*)gen->GetObject(); + Vector3InitConstructor(x,y,z,self); +} + +static void Vector3Equal_Generic(asIScriptGeneric *gen) +{ + Vector3 *a = (Vector3*)gen->GetObject(); + Vector3 *b = (Vector3*)gen->GetArgAddress(0); + bool r = *a == *b; + *(bool*)gen->GetAddressOfReturnLocation() = r; +} + +static void Vector3Length_Generic(asIScriptGeneric *gen) +{ + Vector3 *s = (Vector3*)gen->GetObject(); + gen->SetReturnFloat(s->length()); +} + +static void Vector3AddAssign_Generic(asIScriptGeneric *gen) +{ + Vector3 *a = (Vector3*)gen->GetArgAddress(0); + Vector3 *thisPointer = (Vector3*)gen->GetObject(); + *thisPointer += *a; + gen->SetReturnAddress(thisPointer); +} + +static void Vector3SubAssign_Generic(asIScriptGeneric *gen) +{ + Vector3 *a = (Vector3*)gen->GetArgAddress(0); + Vector3 *thisPointer = (Vector3*)gen->GetObject(); + *thisPointer -= *a; + gen->SetReturnAddress(thisPointer); +} + +static void Vector3MulAssign_Generic(asIScriptGeneric *gen) +{ + float s = gen->GetArgFloat(0); + Vector3 *thisPointer = (Vector3*)gen->GetObject(); + *thisPointer *= s; + gen->SetReturnAddress(thisPointer); +} + +static void Vector3DivAssign_Generic(asIScriptGeneric *gen) +{ + float s = gen->GetArgFloat(0); + Vector3 *thisPointer = (Vector3*)gen->GetObject(); + *thisPointer /= s; + gen->SetReturnAddress(thisPointer); +} + +static void Vector3Add_Generic(asIScriptGeneric *gen) +{ + Vector3 *a = (Vector3*)gen->GetObject(); + Vector3 *b = (Vector3*)gen->GetArgAddress(0); + Vector3 res = *a + *b; + gen->SetReturnObject(&res); +} + +static void Vector3Sub_Generic(asIScriptGeneric *gen) +{ + Vector3 *a = (Vector3*)gen->GetObject(); + Vector3 *b = (Vector3*)gen->GetArgAddress(0); + Vector3 res = *a - *b; + gen->SetReturnObject(&res); +} + +static void Vector3FloatMulVector3_Generic(asIScriptGeneric *gen) +{ + float s = gen->GetArgFloat(0); + Vector3 *v = (Vector3*)gen->GetObject(); + Vector3 res = s * *v; + gen->SetReturnObject(&res); +} + +static void Vector3Vector3MulFloat_Generic(asIScriptGeneric *gen) +{ + Vector3 *v = (Vector3*)gen->GetObject(); + float s = gen->GetArgFloat(0); + Vector3 res = *v * s; + gen->SetReturnObject(&res); +} + +static void Vector3Vector3DivFloat_Generic(asIScriptGeneric *gen) +{ + Vector3 *v = (Vector3*)gen->GetObject(); + float s = gen->GetArgFloat(0); + Vector3 res = *v / s; + gen->SetReturnObject(&res); +} + +//-------------------------------- +// Registration +//------------------------------------- + +void RegisterScriptMath3D_Native(asIScriptEngine *engine) +{ + int r; + + // Register the type + r = engine->RegisterObjectType("vector3", sizeof(Vector3), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA); assert( r >= 0 ); + + // Register the object properties + r = engine->RegisterObjectProperty("vector3", "float x", offsetof(Vector3, x)); assert( r >= 0 ); + r = engine->RegisterObjectProperty("vector3", "float y", offsetof(Vector3, y)); assert( r >= 0 ); + r = engine->RegisterObjectProperty("vector3", "float z", offsetof(Vector3, z)); assert( r >= 0 ); + + // Register the constructors + r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(Vector3DefaultConstructor), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f(const vector3 &in)", asFUNCTION(Vector3CopyConstructor), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f(float, float, float)", asFUNCTION(Vector3InitConstructor), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + + // Register the operator overloads + r = engine->RegisterObjectMethod("vector3", "vector3 &opAddAssign(const vector3 &in)", asMETHODPR(Vector3, operator+=, (const Vector3 &), Vector3&), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 &opSubAssign(const vector3 &in)", asMETHODPR(Vector3, operator-=, (const Vector3 &), Vector3&), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 &opMulAssign(float)", asMETHODPR(Vector3, operator*=, (float), Vector3&), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 &opDivAssign(float)", asMETHODPR(Vector3, operator/=, (float), Vector3&), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "bool opEquals(const vector3 &in) const", asFUNCTIONPR(operator==, (const Vector3&, const Vector3&), bool), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 opAdd(const vector3 &in) const", asFUNCTIONPR(operator+, (const Vector3&, const Vector3&), Vector3), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 opSub(const vector3 &in) const", asFUNCTIONPR(operator-, (const Vector3&, const Vector3&), Vector3), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 opMul(float) const", asFUNCTIONPR(operator*, (const Vector3&, float), Vector3), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 opMul_r(float) const", asFUNCTIONPR(operator*, (float, const Vector3&), Vector3), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 opDiv(float) const", asFUNCTIONPR(operator/, (const Vector3&, float), Vector3), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + + // Register the object methods + r = engine->RegisterObjectMethod("vector3", "float length() const", asMETHOD(Vector3,length), asCALL_THISCALL); assert( r >= 0 ); +} + +void RegisterScriptMath3D_Generic(asIScriptEngine *engine) +{ + int r; + + // Register the type + r = engine->RegisterObjectType("vector3", sizeof(Vector3), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA); assert( r >= 0 ); + + // Register the object properties + r = engine->RegisterObjectProperty("vector3", "float x", offsetof(Vector3, x)); assert( r >= 0 ); + r = engine->RegisterObjectProperty("vector3", "float y", offsetof(Vector3, y)); assert( r >= 0 ); + r = engine->RegisterObjectProperty("vector3", "float z", offsetof(Vector3, z)); assert( r >= 0 ); + + // Register the constructors + r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(Vector3DefaultConstructor_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f(const vector3 &in)", asFUNCTION(Vector3CopyConstructor_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f(float, float, float)", asFUNCTION(Vector3InitConstructor_Generic), asCALL_GENERIC); assert( r >= 0 ); + + // Register the operator overloads + r = engine->RegisterObjectMethod("vector3", "vector3 &opAddAssign(const vector3 &in)", asFUNCTION(Vector3AddAssign_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 &opSubAssign(const vector3 &in)", asFUNCTION(Vector3SubAssign_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 &opMulAssign(float)", asFUNCTION(Vector3MulAssign_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 &opDivAssign(float)", asFUNCTION(Vector3DivAssign_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "bool opEquals(const vector3 &in) const", asFUNCTION(Vector3Equal_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 opAdd(const vector3 &in) const", asFUNCTION(Vector3Add_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 opSub(const vector3 &in) const", asFUNCTION(Vector3Sub_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 opMul_r(float) const", asFUNCTION(Vector3FloatMulVector3_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 opMul(float) const", asFUNCTION(Vector3Vector3MulFloat_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("vector3", "vector3 opDiv(float) const", asFUNCTION(Vector3Vector3DivFloat_Generic), asCALL_GENERIC); assert( r >= 0 ); + + // Register the object methods + r = engine->RegisterObjectMethod("vector3", "float length() const", asFUNCTION(Vector3Length_Generic), asCALL_GENERIC); assert( r >= 0 ); +} + +void RegisterScriptMath3D(asIScriptEngine *engine) +{ + if( strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") ) + RegisterScriptMath3D_Generic(engine); + else + RegisterScriptMath3D_Native(engine); +} + +END_AS_NAMESPACE + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath3d/scriptmath3d.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath3d/scriptmath3d.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath3d/scriptmath3d.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath3d/scriptmath3d.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,52 @@ +#ifndef SCRIPTMATH3D_H +#define SCRIPTMATH3D_H + +#include + +BEGIN_AS_NAMESPACE + +// This is not a complete 3D math library. It's only meant as a sample +// for registering value types. The application developers will most +// likely want to register their own math library instead. + +struct Vector3 +{ + Vector3(); + Vector3(const Vector3 &other); + Vector3(float x, float y, float z); + + Vector3 &operator=(const Vector3 &other); + Vector3 &operator+=(const Vector3 &other); + Vector3 &operator-=(const Vector3 &other); + Vector3 &operator*=(float scalar); + Vector3 &operator/=(float scalar); + + float length() const; + + friend bool operator==(const Vector3 &a, const Vector3 &b); + friend bool operator!=(const Vector3 &a, const Vector3 &b); + friend Vector3 operator+(const Vector3 &a, const Vector3 &b); + friend Vector3 operator-(const Vector3 &a, const Vector3 &b); + friend Vector3 operator*(float s, const Vector3 &v); + friend Vector3 operator*(const Vector3 &v, float s); + friend Vector3 operator/(const Vector3 &v, float s); + + float x; + float y; + float z; +}; + +// This function will determine the configuration of the engine +// and use one of the two functions below to register the string type +void RegisterScriptMath3D(asIScriptEngine *engine); + +// Call this function to register the math functions using native calling conventions +void RegisterScriptMath3D_Native(asIScriptEngine *engine); + +// Use this one instead if native calling conventions +// are not supported on the target platform +void RegisterScriptMath3D_Generic(asIScriptEngine *engine); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstdstring/scriptstdstring.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstdstring/scriptstdstring.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstdstring/scriptstdstring.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstdstring/scriptstdstring.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,483 @@ +#include +#include +#include "scriptstdstring.h" +#include // strstr + +using namespace std; + +BEGIN_AS_NAMESPACE + +static void StringFactoryGeneric(asIScriptGeneric *gen) { + asUINT length = gen->GetArgDWord(0); + const char *s = (const char*)gen->GetArgAddress(1); + string str(s, length); + gen->SetReturnObject(&str); +} + +static void ConstructStringGeneric(asIScriptGeneric * gen) { + new (gen->GetObject()) string(); +} + +static void DestructStringGeneric(asIScriptGeneric * gen) { + string * ptr = static_cast(gen->GetObject()); + ptr->~string(); +} + +static void AssignStringGeneric(asIScriptGeneric *gen) { + string * a = static_cast(gen->GetArgObject(0)); + string * self = static_cast(gen->GetObject()); + *self = *a; + gen->SetReturnAddress(self); +} + +static void AddAssignStringGeneric(asIScriptGeneric *gen) { + string * a = static_cast(gen->GetArgObject(0)); + string * self = static_cast(gen->GetObject()); + *self += *a; + gen->SetReturnAddress(self); +} + +static void StringEqualGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetArgAddress(0)); + string * b = static_cast(gen->GetArgAddress(1)); + *(bool*)gen->GetAddressOfReturnLocation() = (*a == *b); +} + +static void StringEqualsGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetObject()); + string * b = static_cast(gen->GetArgAddress(0)); + *(bool*)gen->GetAddressOfReturnLocation() = (*a == *b); +} + +static void StringCmpGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetObject()); + string * b = static_cast(gen->GetArgAddress(0)); + + int cmp = 0; + if( *a < *b ) cmp = -1; + else if( *a > *b ) cmp = 1; + + *(int*)gen->GetAddressOfReturnLocation() = cmp; +} + +static void StringNotEqualGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetArgAddress(0)); + string * b = static_cast(gen->GetArgAddress(1)); + *(bool*)gen->GetAddressOfReturnLocation() = (*a != *b); +} + +static void StringLEqualGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetArgAddress(0)); + string * b = static_cast(gen->GetArgAddress(1)); + *(bool*)gen->GetAddressOfReturnLocation() = (*a <= *b); +} + +static void StringGEqualGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetArgAddress(0)); + string * b = static_cast(gen->GetArgAddress(1)); + *(bool*)gen->GetAddressOfReturnLocation() = (*a >= *b); +} + +static void StringLessThanGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetArgAddress(0)); + string * b = static_cast(gen->GetArgAddress(1)); + *(bool*)gen->GetAddressOfReturnLocation() = (*a < *b); +} + +static void StringGreaterThanGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetArgAddress(0)); + string * b = static_cast(gen->GetArgAddress(1)); + *(bool*)gen->GetAddressOfReturnLocation() = (*a > *b); +} + +static void StringAddGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetObject()); + string * b = static_cast(gen->GetArgAddress(0)); + string ret_val = *a + *b; + gen->SetReturnObject(&ret_val); +} + +static void StringLengthGeneric(asIScriptGeneric * gen) { + string * self = static_cast(gen->GetObject()); + *static_cast(gen->GetAddressOfReturnLocation()) = self->length(); +} + +static void StringResizeGeneric(asIScriptGeneric * gen) { + string * self = static_cast(gen->GetObject()); + self->resize(*static_cast(gen->GetAddressOfArg(0))); +} + +static void StringCharAtGeneric(asIScriptGeneric * gen) { + unsigned int index = gen->GetArgDWord(0); + string * self = static_cast(gen->GetObject()); + + if (index >= self->size()) { + // Set a script exception + asIScriptContext *ctx = asGetActiveContext(); + ctx->SetException("Out of range"); + + gen->SetReturnAddress(0); + } else { + gen->SetReturnAddress(&(self->operator [](index))); + } +} + +void AssignInt2StringGeneric(asIScriptGeneric *gen) +{ + int *a = static_cast(gen->GetAddressOfArg(0)); + string *self = static_cast(gen->GetObject()); + std::stringstream sstr; + sstr << *a; + *self = sstr.str(); + gen->SetReturnAddress(self); +} + +void AssignUInt2StringGeneric(asIScriptGeneric *gen) +{ + unsigned int *a = static_cast(gen->GetAddressOfArg(0)); + string *self = static_cast(gen->GetObject()); + std::stringstream sstr; + sstr << *a; + *self = sstr.str(); + gen->SetReturnAddress(self); +} + +void AssignDouble2StringGeneric(asIScriptGeneric *gen) +{ + double *a = static_cast(gen->GetAddressOfArg(0)); + string *self = static_cast(gen->GetObject()); + std::stringstream sstr; + sstr << *a; + *self = sstr.str(); + gen->SetReturnAddress(self); +} + +void AddAssignDouble2StringGeneric(asIScriptGeneric * gen) { + double * a = static_cast(gen->GetAddressOfArg(0)); + string * self = static_cast(gen->GetObject()); + std::stringstream sstr; + sstr << *a; + *self += sstr.str(); + gen->SetReturnAddress(self); +} + +void AddAssignInt2StringGeneric(asIScriptGeneric * gen) { + int * a = static_cast(gen->GetAddressOfArg(0)); + string * self = static_cast(gen->GetObject()); + std::stringstream sstr; + sstr << *a; + *self += sstr.str(); + gen->SetReturnAddress(self); +} + +void AddAssignUInt2StringGeneric(asIScriptGeneric * gen) { + unsigned int * a = static_cast(gen->GetAddressOfArg(0)); + string * self = static_cast(gen->GetObject()); + std::stringstream sstr; + sstr << *a; + *self += sstr.str(); + gen->SetReturnAddress(self); +} + +void AddString2DoubleGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetObject()); + double * b = static_cast(gen->GetAddressOfArg(0)); + std::stringstream sstr; + sstr << *a << *b; + std::string ret_val = sstr.str(); + gen->SetReturnObject(&ret_val); +} + +void AddString2IntGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetObject()); + int * b = static_cast(gen->GetAddressOfArg(0)); + std::stringstream sstr; + sstr << *a << *b; + std::string ret_val = sstr.str(); + gen->SetReturnObject(&ret_val); +} + +void AddString2UIntGeneric(asIScriptGeneric * gen) { + string * a = static_cast(gen->GetObject()); + unsigned int * b = static_cast(gen->GetAddressOfArg(0)); + std::stringstream sstr; + sstr << *a << *b; + std::string ret_val = sstr.str(); + gen->SetReturnObject(&ret_val); +} + +void AddDouble2StringGeneric(asIScriptGeneric * gen) { + double* a = static_cast(gen->GetAddressOfArg(0)); + string * b = static_cast(gen->GetObject()); + std::stringstream sstr; + sstr << *a << *b; + std::string ret_val = sstr.str(); + gen->SetReturnObject(&ret_val); +} + +void AddInt2StringGeneric(asIScriptGeneric * gen) { + int* a = static_cast(gen->GetAddressOfArg(0)); + string * b = static_cast(gen->GetObject()); + std::stringstream sstr; + sstr << *a << *b; + std::string ret_val = sstr.str(); + gen->SetReturnObject(&ret_val); +} + +void AddUInt2StringGeneric(asIScriptGeneric * gen) { + unsigned int* a = static_cast(gen->GetAddressOfArg(0)); + string * b = static_cast(gen->GetObject()); + std::stringstream sstr; + sstr << *a << *b; + std::string ret_val = sstr.str(); + gen->SetReturnObject(&ret_val); +} + + +void RegisterStdString_Generic(asIScriptEngine *engine) { + int r; + + // Register the string type + r = engine->RegisterObjectType("string", sizeof(string), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); assert( r >= 0 ); + + // Register the string factory + r = engine->RegisterStringFactory("string", asFUNCTION(StringFactoryGeneric), asCALL_GENERIC); assert( r >= 0 ); + + // Register the object operator overloads + r = engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructStringGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(DestructStringGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asFUNCTION(AssignStringGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(const string &in)", asFUNCTION(AddAssignStringGeneric), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "bool opEquals(const string &in) const", asFUNCTION(StringEqualsGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "int opCmp(const string &in) const", asFUNCTION(StringCmpGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd(const string &in) const", asFUNCTION(StringAddGeneric), asCALL_GENERIC); assert( r >= 0 ); + + // Register the object methods + if (sizeof(size_t) == 4) { + r = engine->RegisterObjectMethod("string", "uint length() const", asFUNCTION(StringLengthGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "void resize(uint)", asFUNCTION(StringResizeGeneric), asCALL_GENERIC); assert( r >= 0 ); + } else { + r = engine->RegisterObjectMethod("string", "uint64 length() const", asFUNCTION(StringLengthGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "void resize(uint64)", asFUNCTION(StringResizeGeneric), asCALL_GENERIC); assert( r >= 0 ); + } + + // Register the index operator, both as a mutator and as an inspector + r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "uint8 &f(uint)", asFUNCTION(StringCharAtGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "const uint8 &f(uint) const", asFUNCTION(StringCharAtGeneric), asCALL_GENERIC); assert( r >= 0 ); + + // Automatic conversion from values + r = engine->RegisterObjectMethod("string", "string &opAssign(double)", asFUNCTION(AssignDouble2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(double)", asFUNCTION(AddAssignDouble2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd(double) const", asFUNCTION(AddString2DoubleGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd_r(double) const", asFUNCTION(AddDouble2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "string &opAssign(int)", asFUNCTION(AssignInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(int)", asFUNCTION(AddAssignInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd(int) const", asFUNCTION(AddString2IntGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd_r(int) const", asFUNCTION(AddInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "string &opAssign(uint)", asFUNCTION(AssignUInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(uint)", asFUNCTION(AddAssignUInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd(uint) const", asFUNCTION(AddString2UIntGeneric), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd_r(uint) const", asFUNCTION(AddUInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); +} + +static string StringFactory(asUINT length, const char *s) +{ + return string(s, length); +} + +static void ConstructString(string *thisPointer) +{ + new(thisPointer) string(); +} + +static void DestructString(string *thisPointer) +{ + thisPointer->~string(); +} + +static string &AssignUIntToString(unsigned int i, string &dest) +{ + ostringstream stream; + stream << i; + dest = stream.str(); + return dest; +} + +static string &AddAssignUIntToString(unsigned int i, string &dest) +{ + ostringstream stream; + stream << i; + dest += stream.str(); + return dest; +} + +static string AddStringUInt(string &str, unsigned int i) +{ + ostringstream stream; + stream << i; + str += stream.str(); + return str; +} + +static string AddIntString(int i, string &str) +{ + ostringstream stream; + stream << i; + return stream.str() + str; +} + +static string &AssignIntToString(int i, string &dest) +{ + ostringstream stream; + stream << i; + dest = stream.str(); + return dest; +} + +static string &AddAssignIntToString(int i, string &dest) +{ + ostringstream stream; + stream << i; + dest += stream.str(); + return dest; +} + +static string AddStringInt(string &str, int i) +{ + ostringstream stream; + stream << i; + str += stream.str(); + return str; +} + +static string AddUIntString(unsigned int i, string &str) +{ + ostringstream stream; + stream << i; + return stream.str() + str; +} + +static string &AssignDoubleToString(double f, string &dest) +{ + ostringstream stream; + stream << f; + dest = stream.str(); + return dest; +} + +static string &AddAssignDoubleToString(double f, string &dest) +{ + ostringstream stream; + stream << f; + dest += stream.str(); + return dest; +} + +static string AddStringDouble(string &str, double f) +{ + ostringstream stream; + stream << f; + str += stream.str(); + return str; +} + +static string AddDoubleString(double f, string &str) +{ + ostringstream stream; + stream << f; + return stream.str() + str; +} + +static char *StringCharAt(unsigned int i, string &str) +{ + if( i >= str.size() ) + { + // Set a script exception + asIScriptContext *ctx = asGetActiveContext(); + ctx->SetException("Out of range"); + + // Return a null pointer + return 0; + } + + return &str[i]; +} + +static int StringCmp(const string &a, const string &b) +{ + int cmp = 0; + if( a < b ) cmp = -1; + else if( a > b ) cmp = 1; + return cmp; +} + +void RegisterStdString_Native(asIScriptEngine *engine) +{ + int r; + + // Register the string type + r = engine->RegisterObjectType("string", sizeof(string), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); assert( r >= 0 ); + + // Register the string factory + r = engine->RegisterStringFactory("string", asFUNCTION(StringFactory), asCALL_CDECL); assert( r >= 0 ); + + // Register the object operator overloads + r = engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(DestructString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asMETHODPR(string, operator =, (const string&), string&), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(const string &in)", asMETHODPR(string, operator+=, (const string&), string&), asCALL_THISCALL); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "bool opEquals(const string &in) const", asFUNCTIONPR(operator ==, (const string &, const string &), bool), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "int opCmp(const string &in) const", asFUNCTION(StringCmp), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd(const string &in) const", asFUNCTIONPR(operator +, (const string &, const string &), string), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + + // Register the object methods + if( sizeof(size_t) == 4 ) + { + r = engine->RegisterObjectMethod("string", "uint length() const", asMETHOD(string,size), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "void resize(uint)", asMETHODPR(string,resize,(size_t),void), asCALL_THISCALL); assert( r >= 0 ); + } + else + { + r = engine->RegisterObjectMethod("string", "uint64 length() const", asMETHOD(string,size), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "void resize(uint64)", asMETHODPR(string,resize,(size_t),void), asCALL_THISCALL); assert( r >= 0 ); + } + + // Register the index operator, both as a mutator and as an inspector + // Note that we don't register the operator[] directory, as it doesn't do bounds checking + r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "uint8 &f(uint)", asFUNCTION(StringCharAt), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "const uint8 &f(uint) const", asFUNCTION(StringCharAt), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + + // Automatic conversion from values + r = engine->RegisterObjectMethod("string", "string &opAssign(double)", asFUNCTION(AssignDoubleToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(double)", asFUNCTION(AddAssignDoubleToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd(double) const", asFUNCTION(AddStringDouble), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd_r(double) const", asFUNCTION(AddDoubleString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "string &opAssign(int)", asFUNCTION(AssignIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(int)", asFUNCTION(AddAssignIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd(int) const", asFUNCTION(AddStringInt), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd_r(int) const", asFUNCTION(AddIntString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "string &opAssign(uint)", asFUNCTION(AssignUIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(uint)", asFUNCTION(AddAssignUIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd(uint) const", asFUNCTION(AddStringUInt), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string opAdd_r(uint) const", asFUNCTION(AddUIntString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); +} + +void RegisterStdString(asIScriptEngine * engine) +{ + if (strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY")) + RegisterStdString_Generic(engine); + else + RegisterStdString_Native(engine); +} + +END_AS_NAMESPACE + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstdstring/scriptstdstring.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstdstring/scriptstdstring.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstdstring/scriptstdstring.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstdstring/scriptstdstring.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,23 @@ +// +// Script std::string +// +// This function registers the std::string type with AngelScript to be used as the default string type. +// +// The string type is registered as a value type, thus may have performance issues if a lot of +// string operations are performed in the script. However, for relatively few operations, this should +// not cause any problem for most applications. +// + +#ifndef SCRIPTSTDSTRING_H +#define SCRIPTSTDSTRING_H + +#include +#include + +BEGIN_AS_NAMESPACE + +void RegisterStdString(asIScriptEngine *engine); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,705 @@ +#include +#include // strstr +#include // sprintf +#include "scriptstring.h" +using namespace std; + +BEGIN_AS_NAMESPACE + +//-------------- +// constructors +//-------------- + +CScriptString::CScriptString() +{ + // Count the first reference + refCount = 1; +} + +CScriptString::CScriptString(const char *s, unsigned int len) +{ + refCount = 1; + buffer.assign(s, len); +} + +CScriptString::CScriptString(const string &s) +{ + refCount = 1; + buffer = s; +} + +CScriptString::CScriptString(const CScriptString &s) +{ + refCount = 1; + buffer = s.buffer; +} + +CScriptString::~CScriptString() +{ + assert( refCount == 0 ); +} + +//-------------------- +// reference counting +//-------------------- + +void CScriptString::AddRef() +{ + refCount++; +} + +static void StringAddRef_Generic(asIScriptGeneric *gen) +{ + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + thisPointer->AddRef(); +} + +void CScriptString::Release() +{ + if( --refCount == 0 ) + delete this; +} + +static void StringRelease_Generic(asIScriptGeneric *gen) +{ + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + thisPointer->Release(); +} + +//----------------- +// string = string +//----------------- + +CScriptString &CScriptString::operator=(const CScriptString &other) +{ + // Copy only the buffer, not the reference counter + buffer = other.buffer; + + // Return a reference to this object + return *this; +} + +static void AssignString_Generic(asIScriptGeneric *gen) +{ + CScriptString *a = (CScriptString*)gen->GetArgAddress(0); + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + *thisPointer = *a; + gen->SetReturnAddress(thisPointer); +} + +//------------------ +// string += string +//------------------ + +CScriptString &CScriptString::operator+=(const CScriptString &other) +{ + buffer += other.buffer; + return *this; +} + +static void AddAssignString_Generic(asIScriptGeneric *gen) +{ + CScriptString *a = (CScriptString*)gen->GetArgAddress(0); + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + *thisPointer += *a; + gen->SetReturnAddress(thisPointer); +} + +//----------------- +// string opCmp string +//----------------- + +static int StringCmp(const string &a, const string &b) +{ + int cmp = 0; + if( a < b ) cmp = -1; + else if( a > b ) cmp = 1; + return cmp; +} + +static void StringCmp_Generic(asIScriptGeneric * gen) +{ + string * a = static_cast(gen->GetObject()); + string * b = static_cast(gen->GetArgAddress(0)); + + int cmp = 0; + if( *a < *b ) cmp = -1; + else if( *a > *b ) cmp = 1; + + *(int*)gen->GetAddressOfReturnLocation() = cmp; +} + +//----------------- +// string + string +//----------------- + +CScriptString *operator+(const CScriptString &a, const CScriptString &b) +{ + // Return a new object as a script handle + CScriptString *str = new CScriptString(); + + // Avoid unnecessary memory copying by first reserving the full memory buffer, then concatenating + str->buffer.reserve(a.buffer.length() + b.buffer.length()); + str->buffer += a.buffer; + str->buffer += b.buffer; + + return str; +} + +static void ConcatenateStrings_Generic(asIScriptGeneric *gen) +{ + CScriptString *a = (CScriptString*)gen->GetObject(); + CScriptString *b = (CScriptString*)gen->GetArgAddress(0); + CScriptString *out = *a + *b; + gen->SetReturnAddress(out); +} + +//---------------- +// string = value +//---------------- + +static CScriptString &AssignUIntToString(unsigned int i, CScriptString &dest) +{ + char buf[100]; + sprintf(buf, "%u", i); + dest.buffer = buf; + return dest; +} + +static void AssignUIntToString_Generic(asIScriptGeneric *gen) +{ + unsigned int i = gen->GetArgDWord(0); + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + AssignUIntToString(i, *thisPointer); + gen->SetReturnAddress(thisPointer); +} + +static CScriptString &AssignIntToString(int i, CScriptString &dest) +{ + char buf[100]; + sprintf(buf, "%d", i); + dest.buffer = buf; + return dest; +} + +static void AssignIntToString_Generic(asIScriptGeneric *gen) +{ + int i = gen->GetArgDWord(0); + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + AssignIntToString(i, *thisPointer); + gen->SetReturnAddress(thisPointer); +} + +static CScriptString &AssignFloatToString(float f, CScriptString &dest) +{ + char buf[100]; + sprintf(buf, "%g", f); + dest.buffer = buf; + return dest; +} + +static void AssignFloatToString_Generic(asIScriptGeneric *gen) +{ + float f = gen->GetArgFloat(0); + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + AssignFloatToString(f, *thisPointer); + gen->SetReturnAddress(thisPointer); +} + +static CScriptString &AssignDoubleToString(double f, CScriptString &dest) +{ + char buf[100]; + sprintf(buf, "%g", f); + dest.buffer = buf; + return dest; +} + +static void AssignDoubleToString_Generic(asIScriptGeneric *gen) +{ + double f = gen->GetArgDouble(0); + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + AssignDoubleToString(f, *thisPointer); + gen->SetReturnAddress(thisPointer); +} + +//----------------- +// string += value +//----------------- + +static CScriptString &AddAssignUIntToString(unsigned int i, CScriptString &dest) +{ + char buf[100]; + sprintf(buf, "%u", i); + dest.buffer += buf; + return dest; +} + +static void AddAssignUIntToString_Generic(asIScriptGeneric *gen) +{ + unsigned int i = gen->GetArgDWord(0); + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + AddAssignUIntToString(i, *thisPointer); + gen->SetReturnAddress(thisPointer); +} + +static CScriptString &AddAssignIntToString(int i, CScriptString &dest) +{ + char buf[100]; + sprintf(buf, "%d", i); + dest.buffer += buf; + return dest; +} + +static void AddAssignIntToString_Generic(asIScriptGeneric *gen) +{ + int i = gen->GetArgDWord(0); + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + AddAssignIntToString(i, *thisPointer); + gen->SetReturnAddress(thisPointer); +} + +static CScriptString &AddAssignFloatToString(float f, CScriptString &dest) +{ + char buf[100]; + sprintf(buf, "%g", f); + dest.buffer += buf; + return dest; +} + +static void AddAssignFloatToString_Generic(asIScriptGeneric *gen) +{ + float f = gen->GetArgFloat(0); + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + AddAssignFloatToString(f, *thisPointer); + gen->SetReturnAddress(thisPointer); +} + +static CScriptString &AddAssignDoubleToString(double f, CScriptString &dest) +{ + char buf[100]; + sprintf(buf, "%g", f); + dest.buffer += buf; + return dest; +} + +static void AddAssignDoubleToString_Generic(asIScriptGeneric *gen) +{ + double f = gen->GetArgDouble(0); + CScriptString *thisPointer = (CScriptString*)gen->GetObject(); + AddAssignDoubleToString(f, *thisPointer); + gen->SetReturnAddress(thisPointer); +} + +//---------------- +// string + value +//---------------- + +static CScriptString *AddStringUInt(const CScriptString &str, unsigned int i) +{ + char buf[100]; + sprintf(buf, "%u", i); + return new CScriptString(str.buffer + buf); +} + +static void AddStringUInt_Generic(asIScriptGeneric *gen) +{ + CScriptString *str = (CScriptString*)gen->GetObject(); + unsigned int i = gen->GetArgDWord(0); + CScriptString *out = AddStringUInt(*str, i); + gen->SetReturnAddress(out); +} + +static CScriptString *AddStringInt(const CScriptString &str, int i) +{ + char buf[100]; + sprintf(buf, "%d", i); + return new CScriptString(str.buffer + buf); +} + +static void AddStringInt_Generic(asIScriptGeneric *gen) +{ + CScriptString *str = (CScriptString*)gen->GetObject(); + int i = gen->GetArgDWord(0); + CScriptString *out = AddStringInt(*str, i); + gen->SetReturnAddress(out); +} + +static CScriptString *AddStringFloat(const CScriptString &str, float f) +{ + char buf[100]; + sprintf(buf, "%g", f); + return new CScriptString(str.buffer + buf); +} + +static void AddStringFloat_Generic(asIScriptGeneric *gen) +{ + CScriptString *str = (CScriptString*)gen->GetObject(); + float f = gen->GetArgFloat(0); + CScriptString *out = AddStringFloat(*str, f); + gen->SetReturnAddress(out); +} + +static CScriptString *AddStringDouble(const CScriptString &str, double f) +{ + char buf[100]; + sprintf(buf, "%g", f); + return new CScriptString(str.buffer + buf); +} + +static void AddStringDouble_Generic(asIScriptGeneric *gen) +{ + CScriptString *str = (CScriptString*)gen->GetObject(); + double f = gen->GetArgDouble(0); + CScriptString *out = AddStringDouble(*str, f); + gen->SetReturnAddress(out); +} + +//---------------- +// value + string +//---------------- + +static CScriptString *AddIntString(int i, const CScriptString &str) +{ + char buf[100]; + sprintf(buf, "%d", i); + return new CScriptString(buf + str.buffer); +} + +static void AddIntString_Generic(asIScriptGeneric *gen) +{ + int i = gen->GetArgDWord(0); + CScriptString *str = (CScriptString*)gen->GetObject(); + CScriptString *out = AddIntString(i, *str); + gen->SetReturnAddress(out); +} + +static CScriptString *AddUIntString(unsigned int i, const CScriptString &str) +{ + char buf[100]; + sprintf(buf, "%u", i); + return new CScriptString(buf + str.buffer); +} + +static void AddUIntString_Generic(asIScriptGeneric *gen) +{ + unsigned int i = gen->GetArgDWord(0); + CScriptString *str = (CScriptString*)gen->GetObject(); + CScriptString *out = AddUIntString(i, *str); + gen->SetReturnAddress(out); +} + +static CScriptString *AddFloatString(float f, const CScriptString &str) +{ + char buf[100]; + sprintf(buf, "%g", f); + return new CScriptString(buf + str.buffer); +} + +static void AddFloatString_Generic(asIScriptGeneric *gen) +{ + float f = gen->GetArgFloat(0); + CScriptString *str = (CScriptString*)gen->GetObject(); + CScriptString *out = AddFloatString(f, *str); + gen->SetReturnAddress(out); +} + +static CScriptString *AddDoubleString(double f, const CScriptString &str) +{ + char buf[100]; + sprintf(buf, "%g", f); + return new CScriptString(buf + str.buffer); +} + +static void AddDoubleString_Generic(asIScriptGeneric *gen) +{ + double f = gen->GetArgDouble(0); + CScriptString *str = (CScriptString*)gen->GetObject(); + CScriptString *out = AddDoubleString(f, *str); + gen->SetReturnAddress(out); +} + +//---------- +// string[] +//---------- + +static char *StringCharAt(unsigned int i, CScriptString &str) +{ + if( i >= str.buffer.size() ) + { + // Set a script exception + asIScriptContext *ctx = asGetActiveContext(); + ctx->SetException("Out of range"); + + // Return a null pointer + return 0; + } + + return &str.buffer[i]; +} + +static void StringCharAt_Generic(asIScriptGeneric *gen) +{ + unsigned int i = gen->GetArgDWord(0); + CScriptString *str = (CScriptString*)gen->GetObject(); + char *ch = StringCharAt(i, *str); + gen->SetReturnAddress(ch); +} + +//----------------------- +// AngelScript functions +//----------------------- + +// This is the string factory that creates new strings for the script based on string literals +static CScriptString *StringFactory(asUINT length, const char *s) +{ + return new CScriptString(s, length); +} + +static void StringFactory_Generic(asIScriptGeneric *gen) +{ + asUINT length = gen->GetArgDWord(0); + const char *s = (const char*)gen->GetArgAddress(1); + CScriptString *str = StringFactory(length, s); + gen->SetReturnAddress(str); +} + +// This is the default string factory, that is responsible for creating empty string objects, e.g. when a variable is declared +static CScriptString *StringDefaultFactory() +{ + // Allocate and initialize with the default constructor + return new CScriptString(); +} + +static CScriptString *StringCopyFactory(const CScriptString &other) +{ + // Allocate and initialize with the copy constructor + return new CScriptString(other); +} + +static void StringDefaultFactory_Generic(asIScriptGeneric *gen) +{ + *(CScriptString**)gen->GetAddressOfReturnLocation() = StringDefaultFactory(); +} + +static void StringCopyFactory_Generic(asIScriptGeneric *gen) +{ + CScriptString *other = (CScriptString *)gen->GetArgObject(0); + *(CScriptString**)gen->GetAddressOfReturnLocation() = StringCopyFactory(*other); +} + +static void StringEqual_Generic(asIScriptGeneric *gen) +{ + string *a = (string*)gen->GetArgAddress(0); + string *b = (string*)gen->GetArgAddress(1); + bool r = *a == *b; + *(bool*)gen->GetAddressOfReturnLocation() = r; +} + +static void StringEquals_Generic(asIScriptGeneric * gen) +{ + string * a = static_cast(gen->GetObject()); + string * b = static_cast(gen->GetArgAddress(0)); + *(bool*)gen->GetAddressOfReturnLocation() = (*a == *b); +} + +static void StringNotEqual_Generic(asIScriptGeneric *gen) +{ + string *a = (string*)gen->GetArgAddress(0); + string *b = (string*)gen->GetArgAddress(1); + bool r = *a != *b; + *(bool*)gen->GetAddressOfReturnLocation() = r; +} + +static void StringLesserOrEqual_Generic(asIScriptGeneric *gen) +{ + string *a = (string*)gen->GetArgAddress(0); + string *b = (string*)gen->GetArgAddress(1); + bool r = *a <= *b; + *(bool*)gen->GetAddressOfReturnLocation() = r; +} + +static void StringGreaterOrEqual_Generic(asIScriptGeneric *gen) +{ + string *a = (string*)gen->GetArgAddress(0); + string *b = (string*)gen->GetArgAddress(1); + bool r = *a >= *b; + *(bool*)gen->GetAddressOfReturnLocation() = r; +} + +static void StringLesser_Generic(asIScriptGeneric *gen) +{ + string *a = (string*)gen->GetArgAddress(0); + string *b = (string*)gen->GetArgAddress(1); + bool r = *a < *b; + *(bool*)gen->GetAddressOfReturnLocation() = r; +} + +static void StringGreater_Generic(asIScriptGeneric *gen) +{ + string *a = (string*)gen->GetArgAddress(0); + string *b = (string*)gen->GetArgAddress(1); + bool r = *a > *b; + *(bool*)gen->GetAddressOfReturnLocation() = r; +} + +static void StringLength_Generic(asIScriptGeneric *gen) +{ + string *s = (string*)gen->GetObject(); + size_t l = s->size(); + if( sizeof(size_t) == 4 ) + gen->SetReturnDWord((asUINT)l); + else + gen->SetReturnQWord((asQWORD)l); +} + +static void StringResize_Generic(asIScriptGeneric *gen) +{ + string *s = (string*)gen->GetObject(); + size_t v = *(size_t*)gen->GetAddressOfArg(0); + s->resize(v); +} + +// This is where we register the string type +void RegisterScriptString_Native(asIScriptEngine *engine) +{ + int r; + + // Register the type + r = engine->RegisterObjectType("string", 0, asOBJ_REF); assert( r >= 0 ); + + // Register the object operator overloads + // Note: We don't have to register the destructor, since the object uses reference counting + r = engine->RegisterObjectBehaviour("string", asBEHAVE_FACTORY, "string @f()", asFUNCTION(StringDefaultFactory), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_FACTORY, "string @f(const string &in)", asFUNCTION(StringCopyFactory), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_ADDREF, "void f()", asMETHOD(CScriptString,AddRef), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_RELEASE, "void f()", asMETHOD(CScriptString,Release), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asMETHODPR(CScriptString, operator =, (const CScriptString&), CScriptString&), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(const string &in)", asMETHODPR(CScriptString, operator+=, (const CScriptString&), CScriptString&), asCALL_THISCALL); assert( r >= 0 ); + + // Register the factory to return a handle to a new string + // Note: We must register the string factory after the basic behaviours, + // otherwise the library will not allow the use of object handles for this type + r = engine->RegisterStringFactory("string@", asFUNCTION(StringFactory), asCALL_CDECL); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "bool opEquals(const string &in) const", asFUNCTIONPR(operator ==, (const string &, const string &), bool), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "int opCmp(const string &in) const", asFUNCTION(StringCmp), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd(const string &in) const", asFUNCTIONPR(operator +, (const CScriptString &, const CScriptString &), CScriptString*), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + + // Register the index operator, both as a mutator and as an inspector + r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "uint8 &f(uint)", asFUNCTION(StringCharAt), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "const uint8 &f(uint) const", asFUNCTION(StringCharAt), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + + // Register the object methods + if( sizeof(size_t) == 4 ) + { + r = engine->RegisterObjectMethod("string", "uint length() const", asMETHOD(string,size), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "void resize(uint)", asMETHODPR(string,resize,(size_t),void), asCALL_THISCALL); assert( r >= 0 ); + } + else + { + r = engine->RegisterObjectMethod("string", "uint64 length() const", asMETHOD(string,size), asCALL_THISCALL); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "void resize(uint64)", asMETHODPR(string,resize,(size_t),void), asCALL_THISCALL); assert( r >= 0 ); + } + + // TODO: Add factory string(const string &in str, int repeatCount) + + // TODO: Add explicit type conversion via constructor and value cast + + // TODO: Add parseInt and parseDouble. Two versions, one without parameter, one with an outparm that returns the number of characters parsed. + + // Automatic conversion from values + r = engine->RegisterObjectMethod("string", "string &opAssign(double)", asFUNCTION(AssignDoubleToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(double)", asFUNCTION(AddAssignDoubleToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd(double) const", asFUNCTION(AddStringDouble), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd_r(double) const", asFUNCTION(AddDoubleString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "string &opAssign(float)", asFUNCTION(AssignFloatToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(float)", asFUNCTION(AddAssignFloatToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd(float) const", asFUNCTION(AddStringFloat), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd_r(float) const", asFUNCTION(AddFloatString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "string &opAssign(int)", asFUNCTION(AssignIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(int)", asFUNCTION(AddAssignIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd(int) const", asFUNCTION(AddStringInt), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd_r(int) const", asFUNCTION(AddIntString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "string &opAssign(uint)", asFUNCTION(AssignUIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(uint)", asFUNCTION(AddAssignUIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd(uint) const", asFUNCTION(AddStringUInt), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd_r(uint) const", asFUNCTION(AddUIntString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); +} + +void RegisterScriptString_Generic(asIScriptEngine *engine) +{ + int r; + + // Register the type + r = engine->RegisterObjectType("string", 0, asOBJ_REF); assert( r >= 0 ); + + // Register the object operator overloads + // Note: We don't have to register the destructor, since the object uses reference counting + r = engine->RegisterObjectBehaviour("string", asBEHAVE_FACTORY, "string @f()", asFUNCTION(StringDefaultFactory_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_FACTORY, "string @f(const string &in)", asFUNCTION(StringCopyFactory_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_ADDREF, "void f()", asFUNCTION(StringAddRef_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_RELEASE, "void f()", asFUNCTION(StringRelease_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asFUNCTION(AssignString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(const string &in)", asFUNCTION(AddAssignString_Generic), asCALL_GENERIC); assert( r >= 0 ); + + // Register the factory to return a handle to a new string + // Note: We must register the string factory after the basic behaviours, + // otherwise the library will not allow the use of object handles for this type + r = engine->RegisterStringFactory("string@", asFUNCTION(StringFactory_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "bool opEquals(const string &in) const", asFUNCTION(StringEquals_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "int opCmp(const string &in) const", asFUNCTION(StringCmp_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd(const string &in) const", asFUNCTION(ConcatenateStrings_Generic), asCALL_GENERIC); assert( r >= 0 ); + + // Register the index operator, both as a mutator and as an inspector + r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "uint8 &f(uint)", asFUNCTION(StringCharAt_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "const uint8 &f(uint) const", asFUNCTION(StringCharAt_Generic), asCALL_GENERIC); assert( r >= 0 ); + + // Register the object methods + if( sizeof(size_t) == 4 ) + { + r = engine->RegisterObjectMethod("string", "uint length() const", asFUNCTION(StringLength_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "void resize(uint)", asFUNCTION(StringResize_Generic), asCALL_GENERIC); assert( r >= 0 ); + } + else + { + r = engine->RegisterObjectMethod("string", "uint64 length() const", asFUNCTION(StringLength_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "void resize(uint64)", asFUNCTION(StringResize_Generic), asCALL_GENERIC); assert( r >= 0 ); + } + + // Automatic conversion from values + r = engine->RegisterObjectMethod("string", "string &opAssign(double)", asFUNCTION(AssignDoubleToString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(double)", asFUNCTION(AddAssignDoubleToString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd(double) const", asFUNCTION(AddStringDouble_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd_r(double) const", asFUNCTION(AddDoubleString_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "string &opAssign(float)", asFUNCTION(AssignFloatToString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(float)", asFUNCTION(AddAssignFloatToString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd(float) const", asFUNCTION(AddStringFloat_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd_r(float) const", asFUNCTION(AddFloatString_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "string &opAssign(int)", asFUNCTION(AssignIntToString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(int)", asFUNCTION(AddAssignIntToString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd(int) const", asFUNCTION(AddStringInt_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd_r(int) const", asFUNCTION(AddIntString_Generic), asCALL_GENERIC); assert( r >= 0 ); + + r = engine->RegisterObjectMethod("string", "string &opAssign(uint)", asFUNCTION(AssignUIntToString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string &opAddAssign(uint)", asFUNCTION(AddAssignUIntToString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd(uint) const", asFUNCTION(AddStringUInt_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterObjectMethod("string", "string@ opAdd_r(uint) const", asFUNCTION(AddUIntString_Generic), asCALL_GENERIC); assert( r >= 0 ); +} + +void RegisterScriptString(asIScriptEngine *engine) +{ + if( strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") ) + RegisterScriptString_Generic(engine); + else + RegisterScriptString_Native(engine); +} + +END_AS_NAMESPACE + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,64 @@ +// +// CScriptString +// +// This class is used to pass strings between the application and the script engine. +// It is basically a container for the normal std::string, with the addition of a +// reference counter so that the script can use object handles to hold the type. +// +// Because the class is reference counted it cannot be stored locally in the +// application functions, nor be received or returned by value. Instead it should +// be manipulated through pointers or references. +// +// Note, because the internal buffer is placed at the beginning of the class +// structure it is infact possible to receive this type as a reference or pointer +// to a normal std::string where the reference counter doesn't have to be manipulated. +// + +#ifndef SCRIPTSTRING_H +#define SCRIPTSTRING_H + +#include +#include + +BEGIN_AS_NAMESPACE + +class CScriptString +{ +public: + CScriptString(); + CScriptString(const CScriptString &other); + CScriptString(const char *s, unsigned int len); + CScriptString(const std::string &s); + + void AddRef(); + void Release(); + + CScriptString &operator=(const CScriptString &other); + CScriptString &operator+=(const CScriptString &other); + friend CScriptString *operator+(const CScriptString &a, const CScriptString &b); + + std::string buffer; + +protected: + ~CScriptString(); + int refCount; +}; + +// This function will determine the configuration of the engine +// and use one of the two functions below to register the string type +void RegisterScriptString(asIScriptEngine *engine); + +// Call this function to register the string type +// using native calling conventions +void RegisterScriptString_Native(asIScriptEngine *engine); + +// Use this one instead if native calling conventions +// are not supported on the target platform +void RegisterScriptString_Generic(asIScriptEngine *engine); + +// This function will register utility functions for the script string +void RegisterScriptStringUtils(asIScriptEngine *engine); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring_utils.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring_utils.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring_utils.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring_utils.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,369 @@ +#include +#include "scriptstring.h" +#include // strstr + + + +// This function returns a string containing the substring of the input string +// determined by the starting index and count of characters. +// +// AngelScript signature: +// string@ substring(const string &in str, int start, int count) +void StringSubString_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + int start = *(int*)gen->GetAddressOfArg(1); + int count = *(int*)gen->GetAddressOfArg(2); + + // Create the substring + CScriptString *sub = new CScriptString(); + sub->buffer = str->buffer.substr(start,count); + + // Return the substring + *(CScriptString**)gen->GetAddressOfReturnLocation() = sub; +} + + + +// This function returns the index of the first position where the substring +// exists in the input string. If the substring doesn't exist in the input +// string -1 is returned. +// +// AngelScript signature: +// int findFirst(const string &in str, const string &in sub, int start) +void StringFindFirst_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *sub = *(CScriptString**)gen->GetAddressOfArg(1); + int start = *(int*)gen->GetAddressOfArg(2); + + // Find the substring + int loc = (int)str->buffer.find(sub->buffer, start); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} +// TODO: Angelscript should permit default parameters +void StringFindFirst0_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *sub = *(CScriptString**)gen->GetAddressOfArg(1); + + // Find the substring + int loc = (int)str->buffer.find(sub->buffer); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} + + + +// This function returns the index of the last position where the substring +// exists in the input string. If the substring doesn't exist in the input +// string -1 is returned. +// +// AngelScript signature: +// int findLast(const string &in str, const string &in sub, int start) +void StringFindLast_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *sub = *(CScriptString**)gen->GetAddressOfArg(1); + int start = *(int*)gen->GetAddressOfArg(2); + + // Find the substring + int loc = (int)str->buffer.rfind(sub->buffer, start); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} +void StringFindLast0_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *sub = *(CScriptString**)gen->GetAddressOfArg(1); + + // Find the substring + int loc = (int)str->buffer.rfind(sub->buffer); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} + + + +// This function returns the index of the first character that is in +// the specified set of characters. If no such character is found -1 is +// returned. +// +// AngelScript signature: +// int findFirstOf(const string &in str, const string &in chars, int start) +void StringFindFirstOf_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *chars = *(CScriptString**)gen->GetAddressOfArg(1); + int start = *(int*)gen->GetAddressOfArg(2); + + // Find the substring + int loc = (int)str->buffer.find_first_of(chars->buffer, start); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} +void StringFindFirstOf0_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *chars = *(CScriptString**)gen->GetAddressOfArg(1); + + // Find the substring + int loc = (int)str->buffer.find_first_of(chars->buffer); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} + + +// This function returns the index of the first character that is not in +// the specified set of characters. If no such character is found -1 is +// returned. +// +// AngelScript signature: +// int findFirstNotOf(const string &in str, const string &in chars, int start) +void StringFindFirstNotOf_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *chars = *(CScriptString**)gen->GetAddressOfArg(1); + int start = *(int*)gen->GetAddressOfArg(2); + + // Find the substring + int loc = (int)str->buffer.find_first_not_of(chars->buffer, start); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} +void StringFindFirstNotOf0_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *chars = *(CScriptString**)gen->GetAddressOfArg(1); + + // Find the substring + int loc = (int)str->buffer.find_first_not_of(chars->buffer); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} + + + +// This function returns the index of the last character that is in +// the specified set of characters. If no such character is found -1 is +// returned. +// +// AngelScript signature: +// int findLastOf(const string &in str, const string &in chars, int start) +void StringFindLastOf_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *chars = *(CScriptString**)gen->GetAddressOfArg(1); + int start = *(int*)gen->GetAddressOfArg(2); + + // Find the substring + int loc = (int)str->buffer.find_last_of(chars->buffer, start); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} +void StringFindLastOf0_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *chars = *(CScriptString**)gen->GetAddressOfArg(1); + + // Find the substring + int loc = (int)str->buffer.find_last_of(chars->buffer); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} + + + +// This function returns the index of the last character that is not in +// the specified set of characters. If no such character is found -1 is +// returned. +// +// AngelScript signature: +// int findLastNotOf(const string &in str, const string &in chars, int start) +void StringFindLastNotOf_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *chars = *(CScriptString**)gen->GetAddressOfArg(1); + int start = *(int*)gen->GetAddressOfArg(2); + + // Find the substring + int loc = (int)str->buffer.find_last_not_of(chars->buffer, start); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} +void StringFindLastNotOf0_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *chars = *(CScriptString**)gen->GetAddressOfArg(1); + + // Find the substring + int loc = (int)str->buffer.find_last_not_of(chars->buffer); + + // Return the result + *(int*)gen->GetAddressOfReturnLocation() = loc; +} + + + +// This function takes an input string and splits it into parts by looking +// for a specified delimiter. Example: +// +// string str = "A|B||D"; +// string@[]@ array = split(str, "|"); +// +// The resulting array has the following elements: +// +// {"A", "B", "", "D"} +// +// AngelScript signature: +// string@[]@ split(const string &in str, const string &in delim) +void StringSplit_Generic(asIScriptGeneric *gen) +{ + // Obtain a pointer to the engine + asIScriptContext *ctx = asGetActiveContext(); + asIScriptEngine *engine = ctx->GetEngine(); + + // TODO: This should only be done once + int stringArrayType = engine->GetTypeIdByDecl("string@[]"); + + // Create the array object + asIScriptArray *array = (asIScriptArray*)engine->CreateScriptObject(stringArrayType); + + // Get the arguments + CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); + CScriptString *delim = *(CScriptString**)gen->GetAddressOfArg(1); + + // Find the existence of the delimiter in the input string + int pos = 0, prev = 0, count = 0; + while( (pos = (int)str->buffer.find(delim->buffer, prev)) != (int)std::string::npos ) + { + // Add the part to the array + CScriptString *part = new CScriptString(); + part->buffer.assign(&str->buffer[prev], pos-prev); + array->Resize(array->GetElementCount()+1); + *(CScriptString**)array->GetElementPointer(count) = part; + + // Find the next part + count++; + prev = pos + (int)delim->buffer.length(); + } + + // Add the remaining part + CScriptString *part = new CScriptString(); + part->buffer.assign(&str->buffer[prev]); + array->Resize(array->GetElementCount()+1); + *(CScriptString**)array->GetElementPointer(count) = part; + + // Return the array by handle + *(asIScriptArray**)gen->GetAddressOfReturnLocation() = array; +} + + + +// This function takes as input an array of string handles as well as a +// delimiter and concatenates the array elements into one delimited string. +// Example: +// +// string@[] array = {"A", "B", "", "D"}; +// string str = join(array, "|"); +// +// The resulting string is: +// +// "A|B||D" +// +// AngelScript signature: +// string@ join(const string@[] &in array, const string &in delim) +void StringJoin_Generic(asIScriptGeneric *gen) +{ + // Get the arguments + asIScriptArray *array = *(asIScriptArray**)gen->GetAddressOfArg(0); + CScriptString *delim = *(CScriptString**)gen->GetAddressOfArg(1); + + // Create the new string + CScriptString *str = new CScriptString(); + int n; + for( n = 0; n < (int)array->GetElementCount() - 1; n++ ) + { + CScriptString *part = *(CScriptString**)array->GetElementPointer(n); + str->buffer += part->buffer; + str->buffer += delim->buffer; + } + + // Add the last part + CScriptString *part = *(CScriptString**)array->GetElementPointer(n); + str->buffer += part->buffer; + + // Return the string + *(CScriptString**)gen->GetAddressOfReturnLocation() = str; +} + + + +// TODO: Implement the following functions +// +// int64 parseInt(const string &in str, int &out bytesParsed); +// double parseDouble(const string &in str, int &out bytesParsed); +// string @ formatString(int64, const string &in format); // should use sprintf to format the string +// string @ formatDouble(double, const string &in format); +// +// int16 byteStringToInt16(const string &in str, int start); +// int32 byteStringToInt32(const string &in str, int start); +// int64 byteStringtoInt64(const string &in str, int start); +// float byteStringToFloat(const string &in str, int start); +// double byteStringToDouble(const string &in str, int start); +// string @ int16ToByteString(int16); +// string @ int32ToByteString(int32); +// string @ int64ToByteString(int64); +// string @ floatToByteString(float); +// string @ doubleToByteString(double); + + + + +// This is where the utility functions are registered. +// The string type must have been registered first. +void RegisterScriptStringUtils(asIScriptEngine *engine) +{ + int r; + + r = engine->RegisterGlobalFunction("string@ substring(const string &in, int, int)", asFUNCTION(StringSubString_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findFirst(const string &in, const string &in)", asFUNCTION(StringFindFirst0_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findFirst(const string &in, const string &in, int)", asFUNCTION(StringFindFirst_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findLast(const string &in, const string &in)", asFUNCTION(StringFindLast0_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findLast(const string &in, const string &in, int)", asFUNCTION(StringFindLast_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findFirstOf(const string &in, const string &in)", asFUNCTION(StringFindFirstOf0_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findFirstOf(const string &in, const string &in, int)", asFUNCTION(StringFindFirstOf_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findFirstNotOf(const string &in, const string &in)", asFUNCTION(StringFindFirstNotOf0_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findFirstNotOf(const string &in, const string &in, int)", asFUNCTION(StringFindFirstNotOf_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findLastOf(const string &in, const string &in)", asFUNCTION(StringFindLastOf0_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findLastOf(const string &in, const string &in, int)", asFUNCTION(StringFindLastOf_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findLastNotOf(const string &in, const string &in)", asFUNCTION(StringFindLastNotOf0_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("int findLastNotOf(const string &in, const string &in, int)", asFUNCTION(StringFindLastNotOf_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("string@[]@ split(const string &in, const string &in)", asFUNCTION(StringSplit_Generic), asCALL_GENERIC); assert(r >= 0); + r = engine->RegisterGlobalFunction("string@ join(const string@[] &in, const string &in)", asFUNCTION(StringJoin_Generic), asCALL_GENERIC); assert(r >= 0); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/include/angelscript.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/include/angelscript.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/include/angelscript.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/include/angelscript.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1611 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// angelscript.h +// +// The script engine interface +// + + +#ifndef ANGELSCRIPT_H +#define ANGELSCRIPT_H + +#include + +#ifdef AS_USE_NAMESPACE + #define BEGIN_AS_NAMESPACE namespace AngelScript { + #define END_AS_NAMESPACE } +#else + #define BEGIN_AS_NAMESPACE + #define END_AS_NAMESPACE +#endif + +BEGIN_AS_NAMESPACE + +// AngelScript version + +#define ANGELSCRIPT_VERSION 21800 +#define ANGELSCRIPT_VERSION_STRING "2.18.0" + +// Data types + +class asIScriptEngine; +class asIScriptModule; +class asIScriptContext; +class asIScriptGeneric; +class asIScriptObject; +class asIScriptArray; +class asIObjectType; +class asIScriptFunction; +class asIBinaryStream; +class asIJITCompiler; + +// Enumerations and constants + +// Engine properties +enum asEEngineProp +{ + asEP_ALLOW_UNSAFE_REFERENCES = 1, + asEP_OPTIMIZE_BYTECODE = 2, + asEP_COPY_SCRIPT_SECTIONS = 3, + asEP_MAX_STACK_SIZE = 4, + asEP_USE_CHARACTER_LITERALS = 5, + asEP_ALLOW_MULTILINE_STRINGS = 6, + asEP_ALLOW_IMPLICIT_HANDLE_TYPES = 7, + asEP_BUILD_WITHOUT_LINE_CUES = 8, + asEP_INIT_GLOBAL_VARS_AFTER_BUILD = 9, + asEP_REQUIRE_ENUM_SCOPE = 10, + asEP_SCRIPT_SCANNER = 11, + asEP_INCLUDE_JIT_INSTRUCTIONS = 12, + asEP_STRING_ENCODING = 13 +}; + +// Calling conventions +enum asECallConvTypes +{ + asCALL_CDECL = 0, + asCALL_STDCALL = 1, + asCALL_THISCALL = 2, + asCALL_CDECL_OBJLAST = 3, + asCALL_CDECL_OBJFIRST = 4, + asCALL_GENERIC = 5 +}; + +// Object type flags +enum asEObjTypeFlags +{ + asOBJ_REF = 0x01, + asOBJ_VALUE = 0x02, + asOBJ_GC = 0x04, + asOBJ_POD = 0x08, + asOBJ_NOHANDLE = 0x10, + asOBJ_SCOPED = 0x20, + asOBJ_TEMPLATE = 0x40, + asOBJ_APP_CLASS = 0x100, + asOBJ_APP_CLASS_CONSTRUCTOR = 0x200, + asOBJ_APP_CLASS_DESTRUCTOR = 0x400, + asOBJ_APP_CLASS_ASSIGNMENT = 0x800, + asOBJ_APP_CLASS_C = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR), + asOBJ_APP_CLASS_CD = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_DESTRUCTOR), + asOBJ_APP_CLASS_CA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), + asOBJ_APP_CLASS_CDA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_DESTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), + asOBJ_APP_CLASS_D = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_DESTRUCTOR), + asOBJ_APP_CLASS_A = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_ASSIGNMENT), + asOBJ_APP_CLASS_DA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_DESTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), + asOBJ_APP_PRIMITIVE = 0x1000, + asOBJ_APP_FLOAT = 0x2000, + asOBJ_MASK_VALID_FLAGS = 0x3F7F, + asOBJ_SCRIPT_OBJECT = 0x10000 +}; + +// Behaviours +enum asEBehaviours +{ + // Value object memory management + asBEHAVE_CONSTRUCT, + asBEHAVE_DESTRUCT, + + // Reference object memory management + asBEHAVE_FACTORY, + asBEHAVE_ADDREF, + asBEHAVE_RELEASE, + + // Object operators + asBEHAVE_VALUE_CAST, + asBEHAVE_IMPLICIT_VALUE_CAST, + asBEHAVE_REF_CAST, + asBEHAVE_IMPLICIT_REF_CAST, + asBEHAVE_INDEX, + asBEHAVE_TEMPLATE_CALLBACK, + + // Garbage collection behaviours + asBEHAVE_FIRST_GC, + asBEHAVE_GETREFCOUNT = asBEHAVE_FIRST_GC, + asBEHAVE_SETGCFLAG, + asBEHAVE_GETGCFLAG, + asBEHAVE_ENUMREFS, + asBEHAVE_RELEASEREFS, + asBEHAVE_LAST_GC = asBEHAVE_RELEASEREFS, + + asBEHAVE_MAX +}; + +// Return codes +enum asERetCodes +{ + asSUCCESS = 0, + asERROR = -1, + asCONTEXT_ACTIVE = -2, + asCONTEXT_NOT_FINISHED = -3, + asCONTEXT_NOT_PREPARED = -4, + asINVALID_ARG = -5, + asNO_FUNCTION = -6, + asNOT_SUPPORTED = -7, + asINVALID_NAME = -8, + asNAME_TAKEN = -9, + asINVALID_DECLARATION = -10, + asINVALID_OBJECT = -11, + asINVALID_TYPE = -12, + asALREADY_REGISTERED = -13, + asMULTIPLE_FUNCTIONS = -14, + asNO_MODULE = -15, + asNO_GLOBAL_VAR = -16, + asINVALID_CONFIGURATION = -17, + asINVALID_INTERFACE = -18, + asCANT_BIND_ALL_FUNCTIONS = -19, + asLOWER_ARRAY_DIMENSION_NOT_REGISTERED = -20, + asWRONG_CONFIG_GROUP = -21, + asCONFIG_GROUP_IS_IN_USE = -22, + asILLEGAL_BEHAVIOUR_FOR_TYPE = -23, + asWRONG_CALLING_CONV = -24, + asBUILD_IN_PROGRESS = -25, + asINIT_GLOBAL_VARS_FAILED = -26 +}; + +// Context states +enum asEContextState +{ + asEXECUTION_FINISHED = 0, + asEXECUTION_SUSPENDED = 1, + asEXECUTION_ABORTED = 2, + asEXECUTION_EXCEPTION = 3, + asEXECUTION_PREPARED = 4, + asEXECUTION_UNINITIALIZED = 5, + asEXECUTION_ACTIVE = 6, + asEXECUTION_ERROR = 7 +}; + +#ifdef AS_DEPRECATED +// Deprecated since 2.18.0, 2009-12-08 +// ExecuteString flags +enum asEExecStrFlags +{ + asEXECSTRING_ONLY_PREPARE = 1, + asEXECSTRING_USE_MY_CONTEXT = 2 +}; +#endif + +// Message types +enum asEMsgType +{ + asMSGTYPE_ERROR = 0, + asMSGTYPE_WARNING = 1, + asMSGTYPE_INFORMATION = 2 +}; + +// Garbage collector flags +enum asEGCFlags +{ + asGC_FULL_CYCLE = 1, + asGC_ONE_STEP = 2, + asGC_DESTROY_GARBAGE = 4, + asGC_DETECT_GARBAGE = 8 +}; + +// Token classes +enum asETokenClass +{ + asTC_UNKNOWN = 0, + asTC_KEYWORD = 1, + asTC_VALUE = 2, + asTC_IDENTIFIER = 3, + asTC_COMMENT = 4, + asTC_WHITESPACE = 5 +}; + +// Prepare flags +const int asPREPARE_PREVIOUS = -1; + +// Config groups +const char * const asALL_MODULES = (const char * const)-1; + +// Type id flags +enum asETypeIdFlags +{ + asTYPEID_VOID = 0, + asTYPEID_BOOL = 1, + asTYPEID_INT8 = 2, + asTYPEID_INT16 = 3, + asTYPEID_INT32 = 4, + asTYPEID_INT64 = 5, + asTYPEID_UINT8 = 6, + asTYPEID_UINT16 = 7, + asTYPEID_UINT32 = 8, + asTYPEID_UINT64 = 9, + asTYPEID_FLOAT = 10, + asTYPEID_DOUBLE = 11, + asTYPEID_OBJHANDLE = 0x40000000, + asTYPEID_HANDLETOCONST = 0x20000000, + asTYPEID_MASK_OBJECT = 0x1C000000, + asTYPEID_APPOBJECT = 0x04000000, + asTYPEID_SCRIPTOBJECT = 0x08000000, + asTYPEID_SCRIPTARRAY = 0x10000000, + asTYPEID_MASK_SEQNBR = 0x03FFFFFF +}; + +// Type modifiers +enum asETypeModifiers +{ + asTM_NONE = 0, + asTM_INREF = 1, + asTM_OUTREF = 2, + asTM_INOUTREF = 3 +}; + +// GetModule flags +enum asEGMFlags +{ + asGM_ONLY_IF_EXISTS = 0, + asGM_CREATE_IF_NOT_EXISTS = 1, + asGM_ALWAYS_CREATE = 2 +}; + +// Compile flags +enum asECompileFlags +{ + asCOMP_ADD_TO_MODULE = 1 +}; + +// +// asBYTE = 8 bits +// asWORD = 16 bits +// asDWORD = 32 bits +// asQWORD = 64 bits +// asPWORD = size of pointer +// +typedef unsigned char asBYTE; +typedef unsigned short asWORD; +typedef unsigned int asUINT; +typedef size_t asPWORD; +#ifdef __LP64__ + typedef unsigned int asDWORD; + typedef unsigned long asQWORD; + typedef long asINT64; +#else + typedef unsigned long asDWORD; + #if defined(__GNUC__) || defined(__MWERKS__) + typedef unsigned long long asQWORD; + typedef long long asINT64; + #else + typedef unsigned __int64 asQWORD; + typedef __int64 asINT64; + #endif +#endif + +typedef void (*asFUNCTION_t)(); +typedef void (*asGENFUNC_t)(asIScriptGeneric *); +typedef void *(*asALLOCFUNC_t)(size_t); +typedef void (*asFREEFUNC_t)(void *); + +#define asFUNCTION(f) asFunctionPtr(f) +#if defined(_MSC_VER) && _MSC_VER <= 1200 +// MSVC 6 has a bug that prevents it from properly compiling using the correct asFUNCTIONPR with operator > +// so we need to use ordinary C style cast instead of static_cast. The drawback is that the compiler can't +// check that the cast is really valid. +#define asFUNCTIONPR(f,p,r) asFunctionPtr((void (*)())((r (*)p)(f))) +#else +#define asFUNCTIONPR(f,p,r) asFunctionPtr((void (*)())(static_cast(f))) +#endif + +#ifndef AS_NO_CLASS_METHODS + +class asCUnknownClass; +typedef void (asCUnknownClass::*asMETHOD_t)(); + +struct asSFuncPtr +{ + union + { + // The largest known method point is 20 bytes (MSVC 64bit), + // but with 8byte alignment this becomes 24 bytes. So we need + // to be able to store at least that much. + char dummy[25]; + struct {asMETHOD_t mthd; char dummy[25-sizeof(asMETHOD_t)];} m; + struct {asFUNCTION_t func; char dummy[25-sizeof(asFUNCTION_t)];} f; + } ptr; + asBYTE flag; // 1 = generic, 2 = global func, 3 = method +}; + +#define asMETHOD(c,m) asSMethodPtr::Convert((void (c::*)())(&c::m)) +#define asMETHODPR(c,m,p,r) asSMethodPtr::Convert(static_cast(&c::m)) + +#else // Class methods are disabled + +struct asSFuncPtr +{ + union + { + char dummy[25]; // largest known class method pointer + struct {asFUNCTION_t func; char dummy[25-sizeof(asFUNCTION_t)];} f; + } ptr; + asBYTE flag; // 1 = generic, 2 = global func +}; + +#endif + +struct asSMessageInfo +{ + const char *section; + int row; + int col; + asEMsgType type; + const char *message; +}; + + +// API functions + +// ANGELSCRIPT_EXPORT is defined when compiling the dll or lib +// ANGELSCRIPT_DLL_LIBRARY_IMPORT is defined when dynamically linking to the +// dll through the link lib automatically generated by MSVC++ +// ANGELSCRIPT_DLL_MANUAL_IMPORT is defined when manually loading the dll +// Don't define anything when linking statically to the lib + +#ifdef WIN32 + #ifdef ANGELSCRIPT_EXPORT + #define AS_API __declspec(dllexport) + #elif defined ANGELSCRIPT_DLL_LIBRARY_IMPORT + #define AS_API __declspec(dllimport) + #else // statically linked library + #define AS_API + #endif +#else + #define AS_API +#endif + +#ifndef ANGELSCRIPT_DLL_MANUAL_IMPORT +extern "C" +{ + // Engine + AS_API asIScriptEngine * asCreateScriptEngine(asDWORD version); + AS_API const char * asGetLibraryVersion(); + AS_API const char * asGetLibraryOptions(); + + // Context + AS_API asIScriptContext * asGetActiveContext(); + + // Thread support + AS_API int asThreadCleanup(); + + // Memory management + AS_API int asSetGlobalMemoryFunctions(asALLOCFUNC_t allocFunc, asFREEFUNC_t freeFunc); + AS_API int asResetGlobalMemoryFunctions(); +} +#endif // ANGELSCRIPT_DLL_MANUAL_IMPORT + +// Interface declarations + +class asIScriptEngine +{ +public: + // Memory management + virtual int AddRef() = 0; + virtual int Release() = 0; + + // Engine properties + virtual int SetEngineProperty(asEEngineProp property, asPWORD value) = 0; + virtual asPWORD GetEngineProperty(asEEngineProp property) = 0; + + // Compiler messages + virtual int SetMessageCallback(const asSFuncPtr &callback, void *obj, asDWORD callConv) = 0; + virtual int ClearMessageCallback() = 0; + virtual int WriteMessage(const char *section, int row, int col, asEMsgType type, const char *message) = 0; + + // JIT Compiler + virtual int SetJITCompiler(asIJITCompiler *compiler) = 0; + virtual asIJITCompiler *GetJITCompiler() = 0; + + // Global functions + virtual int RegisterGlobalFunction(const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv) = 0; + virtual int GetGlobalFunctionCount() = 0; + virtual int GetGlobalFunctionIdByIndex(asUINT index) = 0; + + // Global properties + virtual int RegisterGlobalProperty(const char *declaration, void *pointer) = 0; + virtual int GetGlobalPropertyCount() = 0; + virtual int GetGlobalPropertyByIndex(asUINT index, const char **name, int *typeId = 0, bool *isConst = 0, const char **configGroup = 0, void **pointer = 0) = 0; + + // Object types + virtual int RegisterObjectType(const char *obj, int byteSize, asDWORD flags) = 0; + virtual int RegisterObjectProperty(const char *obj, const char *declaration, int byteOffset) = 0; + virtual int RegisterObjectMethod(const char *obj, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv) = 0; + virtual int RegisterObjectBehaviour(const char *obj, asEBehaviours behaviour, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv) = 0; + virtual int RegisterInterface(const char *name) = 0; + virtual int RegisterInterfaceMethod(const char *intf, const char *declaration) = 0; + virtual int GetObjectTypeCount() = 0; + virtual asIObjectType *GetObjectTypeByIndex(asUINT index) = 0; + + // String factory + virtual int RegisterStringFactory(const char *datatype, const asSFuncPtr &factoryFunc, asDWORD callConv) = 0; + virtual int GetStringFactoryReturnTypeId() = 0; + + // Enums + virtual int RegisterEnum(const char *type) = 0; + virtual int RegisterEnumValue(const char *type, const char *name, int value) = 0; + virtual int GetEnumCount() = 0; + virtual const char *GetEnumByIndex(asUINT index, int *enumTypeId, const char **configGroup = 0) = 0; + virtual int GetEnumValueCount(int enumTypeId) = 0; + virtual const char *GetEnumValueByIndex(int enumTypeId, asUINT index, int *outValue) = 0; + + // Typedefs + virtual int RegisterTypedef(const char *type, const char *decl) = 0; + virtual int GetTypedefCount() = 0; + virtual const char *GetTypedefByIndex(asUINT index, int *typeId, const char **configGroup = 0) = 0; + + // Configuration groups + virtual int BeginConfigGroup(const char *groupName) = 0; + virtual int EndConfigGroup() = 0; + virtual int RemoveConfigGroup(const char *groupName) = 0; + virtual int SetConfigGroupModuleAccess(const char *groupName, const char *module, bool hasAccess) = 0; + + // Script modules + virtual asIScriptModule *GetModule(const char *module, asEGMFlags flag = asGM_ONLY_IF_EXISTS) = 0; + virtual int DiscardModule(const char *module) = 0; + + // Script functions + virtual asIScriptFunction *GetFunctionDescriptorById(int funcId) = 0; + + // Type identification + virtual asIObjectType *GetObjectTypeById(int typeId) = 0; + virtual int GetTypeIdByDecl(const char *decl) = 0; + virtual const char *GetTypeDeclaration(int typeId) = 0; + virtual int GetSizeOfPrimitiveType(int typeId) = 0; + + // Script execution + virtual asIScriptContext *CreateContext() = 0; + virtual void *CreateScriptObject(int typeId) = 0; + virtual void *CreateScriptObjectCopy(void *obj, int typeId) = 0; + virtual void CopyScriptObject(void *dstObj, void *srcObj, int typeId) = 0; + virtual void ReleaseScriptObject(void *obj, int typeId) = 0; + virtual void AddRefScriptObject(void *obj, int typeId) = 0; + virtual bool IsHandleCompatibleWithObject(void *obj, int objTypeId, int handleTypeId) = 0; + + // String interpretation + virtual asETokenClass ParseToken(const char *string, size_t stringLength = 0, int *tokenLength = 0) = 0; + + // Garbage collection + virtual int GarbageCollect(asDWORD flags = asGC_FULL_CYCLE) = 0; + virtual void GetGCStatistics(asUINT *currentSize, asUINT *totalDestroyed = 0, asUINT *totalDetected = 0) = 0; + virtual void NotifyGarbageCollectorOfNewObject(void *obj, int typeId) = 0; + virtual void GCEnumCallback(void *reference) = 0; + + // User data + virtual void *SetUserData(void *data) = 0; + virtual void *GetUserData() = 0; + +#ifdef AS_DEPRECATED + // deprecated since 2009-12-08, 2.18.0 + virtual int ExecuteString(const char *module, const char *script, asIScriptContext **ctx = 0, asDWORD flags = 0) = 0; +#endif + +protected: + virtual ~asIScriptEngine() {} +}; + +class asIScriptModule +{ +public: + virtual asIScriptEngine *GetEngine() = 0; + virtual void SetName(const char *name) = 0; + virtual const char *GetName() = 0; + + // Compilation + virtual int AddScriptSection(const char *name, const char *code, size_t codeLength = 0, int lineOffset = 0) = 0; + virtual int Build() = 0; + virtual int CompileFunction(const char *sectionName, const char *code, int lineOffset, asDWORD compileFlags, asIScriptFunction **outFunc) = 0; + virtual int CompileGlobalVar(const char *sectionName, const char *code, int lineOffset) = 0; + + // Functions + virtual int GetFunctionCount() = 0; + virtual int GetFunctionIdByIndex(int index) = 0; + virtual int GetFunctionIdByName(const char *name) = 0; + virtual int GetFunctionIdByDecl(const char *decl) = 0; + virtual asIScriptFunction *GetFunctionDescriptorByIndex(int index) = 0; + virtual asIScriptFunction *GetFunctionDescriptorById(int funcId) = 0; + virtual int RemoveFunction(int funcId) = 0; + + // Global variables + virtual int ResetGlobalVars() = 0; + virtual int GetGlobalVarCount() = 0; + virtual int GetGlobalVarIndexByName(const char *name) = 0; + virtual int GetGlobalVarIndexByDecl(const char *decl) = 0; + virtual const char *GetGlobalVarDeclaration(int index) = 0; + virtual const char *GetGlobalVarName(int index) = 0; + virtual int GetGlobalVarTypeId(int index, bool *isConst = 0) = 0; + virtual void *GetAddressOfGlobalVar(int index) = 0; + virtual int RemoveGlobalVar(int index) = 0; + + // Type identification + virtual int GetObjectTypeCount() = 0; + virtual asIObjectType *GetObjectTypeByIndex(asUINT index) = 0; + virtual int GetTypeIdByDecl(const char *decl) = 0; + + // Enums + virtual int GetEnumCount() = 0; + virtual const char *GetEnumByIndex(asUINT index, int *enumTypeId) = 0; + virtual int GetEnumValueCount(int enumTypeId) = 0; + virtual const char *GetEnumValueByIndex(int enumTypeId, asUINT index, int *outValue) = 0; + + // Typedefs + virtual int GetTypedefCount() = 0; + virtual const char *GetTypedefByIndex(asUINT index, int *typeId) = 0; + + // Dynamic binding between modules + virtual int GetImportedFunctionCount() = 0; + virtual int GetImportedFunctionIndexByDecl(const char *decl) = 0; + virtual const char *GetImportedFunctionDeclaration(int importIndex) = 0; + virtual const char *GetImportedFunctionSourceModule(int importIndex) = 0; + virtual int BindImportedFunction(int importIndex, int funcId) = 0; + virtual int UnbindImportedFunction(int importIndex) = 0; + virtual int BindAllImportedFunctions() = 0; + virtual int UnbindAllImportedFunctions() = 0; + + // Bytecode saving and loading + virtual int SaveByteCode(asIBinaryStream *out) = 0; + virtual int LoadByteCode(asIBinaryStream *in) = 0; + +protected: + virtual ~asIScriptModule() {} +}; + +class asIScriptContext +{ +public: + // Memory management + virtual int AddRef() = 0; + virtual int Release() = 0; + + // Miscellaneous + virtual asIScriptEngine *GetEngine() = 0; + + // Execution + virtual int Prepare(int funcId) = 0; + virtual int Unprepare() = 0; + virtual int SetObject(void *obj) = 0; + virtual int Execute() = 0; + virtual int Abort() = 0; + virtual int Suspend() = 0; + virtual asEContextState GetState() = 0; + + // Arguments + virtual int SetArgByte(asUINT arg, asBYTE value) = 0; + virtual int SetArgWord(asUINT arg, asWORD value) = 0; + virtual int SetArgDWord(asUINT arg, asDWORD value) = 0; + virtual int SetArgQWord(asUINT arg, asQWORD value) = 0; + virtual int SetArgFloat(asUINT arg, float value) = 0; + virtual int SetArgDouble(asUINT arg, double value) = 0; + virtual int SetArgAddress(asUINT arg, void *addr) = 0; + virtual int SetArgObject(asUINT arg, void *obj) = 0; + virtual void *GetAddressOfArg(asUINT arg) = 0; + + // Return value + virtual asBYTE GetReturnByte() = 0; + virtual asWORD GetReturnWord() = 0; + virtual asDWORD GetReturnDWord() = 0; + virtual asQWORD GetReturnQWord() = 0; + virtual float GetReturnFloat() = 0; + virtual double GetReturnDouble() = 0; + virtual void *GetReturnAddress() = 0; + virtual void *GetReturnObject() = 0; + virtual void *GetAddressOfReturnValue() = 0; + + // Exception handling + virtual int SetException(const char *string) = 0; + virtual int GetExceptionLineNumber(int *column = 0) = 0; + virtual int GetExceptionFunction() = 0; + virtual const char *GetExceptionString() = 0; + virtual int SetExceptionCallback(asSFuncPtr callback, void *obj, int callConv) = 0; + virtual void ClearExceptionCallback() = 0; + + // Debugging + virtual int SetLineCallback(asSFuncPtr callback, void *obj, int callConv) = 0; + virtual void ClearLineCallback() = 0; + virtual int GetCurrentLineNumber(int *column = 0) = 0; + virtual int GetCurrentFunction() = 0; + virtual int GetCallstackSize() = 0; + virtual int GetCallstackFunction(int index) = 0; + virtual int GetCallstackLineNumber(int index, int *column = 0) = 0; + virtual int GetVarCount(int stackLevel = -1) = 0; + virtual const char *GetVarName(int varIndex, int stackLevel = -1) = 0; + virtual const char *GetVarDeclaration(int varIndex, int stackLevel = -1) = 0; + virtual int GetVarTypeId(int varIndex, int stackLevel = -1) = 0; + virtual void *GetAddressOfVar(int varIndex, int stackLevel = -1) = 0; + virtual int GetThisTypeId(int stackLevel = -1) = 0; + virtual void *GetThisPointer(int stackLevel = -1) = 0; + + // User data + virtual void *SetUserData(void *data) = 0; + virtual void *GetUserData() = 0; + +protected: + virtual ~asIScriptContext() {} +}; + +class asIScriptGeneric +{ +public: + // Miscellaneous + virtual asIScriptEngine *GetEngine() = 0; + virtual int GetFunctionId() = 0; + + // Object + virtual void *GetObject() = 0; + virtual int GetObjectTypeId() = 0; + + // Arguments + virtual int GetArgCount() = 0; + virtual int GetArgTypeId(asUINT arg) = 0; + virtual asBYTE GetArgByte(asUINT arg) = 0; + virtual asWORD GetArgWord(asUINT arg) = 0; + virtual asDWORD GetArgDWord(asUINT arg) = 0; + virtual asQWORD GetArgQWord(asUINT arg) = 0; + virtual float GetArgFloat(asUINT arg) = 0; + virtual double GetArgDouble(asUINT arg) = 0; + virtual void *GetArgAddress(asUINT arg) = 0; + virtual void *GetArgObject(asUINT arg) = 0; + virtual void *GetAddressOfArg(asUINT arg) = 0; + + // Return value + virtual int GetReturnTypeId() = 0; + virtual int SetReturnByte(asBYTE val) = 0; + virtual int SetReturnWord(asWORD val) = 0; + virtual int SetReturnDWord(asDWORD val) = 0; + virtual int SetReturnQWord(asQWORD val) = 0; + virtual int SetReturnFloat(float val) = 0; + virtual int SetReturnDouble(double val) = 0; + virtual int SetReturnAddress(void *addr) = 0; + virtual int SetReturnObject(void *obj) = 0; + virtual void *GetAddressOfReturnLocation() = 0; + +protected: + virtual ~asIScriptGeneric() {} +}; + +class asIScriptObject +{ +public: + // Memory management + virtual int AddRef() = 0; + virtual int Release() = 0; + + // Type info + virtual int GetTypeId() const = 0; + virtual asIObjectType *GetObjectType() const = 0; + + // Class properties + virtual int GetPropertyCount() const = 0; + virtual int GetPropertyTypeId(asUINT prop) const = 0; + virtual const char *GetPropertyName(asUINT prop) const = 0; + virtual void *GetAddressOfProperty(asUINT prop) = 0; + + virtual asIScriptEngine *GetEngine() const = 0; + virtual int CopyFrom(asIScriptObject *other) = 0; + +protected: + virtual ~asIScriptObject() {} +}; + +class asIScriptArray +{ +public: + virtual asIScriptEngine *GetEngine() const = 0; + + // Memory management + virtual int AddRef() = 0; + virtual int Release() = 0; + + // Array type + virtual int GetArrayTypeId() = 0; + + // Elements + virtual int GetElementTypeId() = 0; + virtual asUINT GetElementCount() = 0; + virtual void * GetElementPointer(asUINT index) = 0; + virtual void Resize(asUINT size) = 0; + virtual int CopyFrom(asIScriptArray *other) = 0; + +protected: + virtual ~asIScriptArray() {} +}; + +class asIObjectType +{ +public: + virtual asIScriptEngine *GetEngine() const = 0; + virtual const char *GetConfigGroup() const = 0; + + // Memory management + virtual int AddRef() = 0; + virtual int Release() = 0; + + // Type info + virtual const char *GetName() const = 0; + virtual asIObjectType *GetBaseType() const = 0; + virtual asDWORD GetFlags() const = 0; + virtual asUINT GetSize() const = 0; + virtual int GetTypeId() const = 0; + virtual int GetSubTypeId() const = 0; + + // Interfaces + virtual int GetInterfaceCount() const = 0; + virtual asIObjectType *GetInterface(asUINT index) const = 0; + + // Factories + virtual int GetFactoryCount() const = 0; + virtual int GetFactoryIdByIndex(int index) const = 0; + virtual int GetFactoryIdByDecl(const char *decl) const = 0; + + // Methods + virtual int GetMethodCount() const = 0; + virtual int GetMethodIdByIndex(int index) const = 0; + virtual int GetMethodIdByName(const char *name) const = 0; + virtual int GetMethodIdByDecl(const char *decl) const = 0; + virtual asIScriptFunction *GetMethodDescriptorByIndex(int index) const = 0; + + // Properties + virtual int GetPropertyCount() const = 0; + virtual int GetPropertyTypeId(asUINT prop) const = 0; + virtual const char *GetPropertyName(asUINT prop) const = 0; + virtual int GetPropertyOffset(asUINT prop) const = 0; + + // Behaviours + virtual int GetBehaviourCount() const = 0; + virtual int GetBehaviourByIndex(asUINT index, asEBehaviours *outBehaviour) const = 0; + +protected: + virtual ~asIObjectType() {} +}; + +class asIScriptFunction +{ +public: + virtual asIScriptEngine *GetEngine() const = 0; + + // Memory management + virtual int AddRef() = 0; + virtual int Release() = 0; + + virtual int GetId() const = 0; + virtual const char *GetModuleName() const = 0; + virtual const char *GetScriptSectionName() const = 0; + virtual const char *GetConfigGroup() const = 0; + virtual asIObjectType *GetObjectType() const = 0; + virtual const char *GetObjectName() const = 0; + virtual const char *GetName() const = 0; + virtual const char *GetDeclaration(bool includeObjectName = true) const = 0; + virtual bool IsClassMethod() const = 0; + virtual bool IsInterfaceMethod() const = 0; + virtual bool IsReadOnly() const = 0; + + virtual int GetParamCount() const = 0; + virtual int GetParamTypeId(int index, asDWORD *flags = 0) const = 0; + virtual int GetReturnTypeId() const = 0; + + // For JIT compilation + virtual asDWORD *GetByteCode(asUINT *length = 0) = 0; + +protected: + virtual ~asIScriptFunction() {}; +}; + +class asIBinaryStream +{ +public: + virtual void Read(void *ptr, asUINT size) = 0; + virtual void Write(const void *ptr, asUINT size) = 0; + +public: + virtual ~asIBinaryStream() {} +}; + +//----------------------------------------------------------------- +// Function pointers + +// Use our own memset() and memcpy() implementations for better portability +inline void asMemClear(void *_p, int size) +{ + char *p = (char *)_p; + const char *e = p + size; + for( ; p < e; p++ ) + *p = 0; +} + +inline void asMemCopy(void *_d, const void *_s, int size) +{ + char *d = (char *)_d; + const char *s = (const char *)_s; + const char *e = s + size; + for( ; s < e; d++, s++ ) + *d = *s; +} + +// Template function to capture all global functions, +// except the ones using the generic calling convention +template +inline asSFuncPtr asFunctionPtr(T func) +{ + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + p.ptr.f.func = (asFUNCTION_t)(size_t)func; + + // Mark this as a global function + p.flag = 2; + + return p; +} + +// Specialization for functions using the generic calling convention +template<> +inline asSFuncPtr asFunctionPtr(asGENFUNC_t func) +{ + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + p.ptr.f.func = (asFUNCTION_t)func; + + // Mark this as a generic function + p.flag = 1; + + return p; +} + +#ifndef AS_NO_CLASS_METHODS + +// Method pointers + +// Declare a dummy class so that we can determine the size of a simple method pointer +class asCSimpleDummy {}; +typedef void (asCSimpleDummy::*asSIMPLEMETHOD_t)(); +const int SINGLE_PTR_SIZE = sizeof(asSIMPLEMETHOD_t); + +// Define template +template +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + // This version of the function should never be executed, nor compiled, + // as it would mean that the size of the method pointer cannot be determined. + + int ERROR_UnsupportedMethodPtr[N-100]; + return 0; + } +}; + +// Template specialization +template <> +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + + asMemCopy(&p, &Mthd, SINGLE_PTR_SIZE); + + // Mark this as a class method + p.flag = 3; + + return p; + } +}; + +#if defined(_MSC_VER) && !defined(__MWERKS__) + +// MSVC and Intel uses different sizes for different class method pointers +template <> +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + + asMemCopy(&p, &Mthd, SINGLE_PTR_SIZE+sizeof(int)); + + // Mark this as a class method + p.flag = 3; + + return p; + } +}; + +template <> +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + // This is where a class with virtual inheritance falls, or + // on 64bit platforms with 8byte data alignments. + + // Method pointers for virtual inheritance is not supported, + // as it requires the location of the vbase table, which is + // only available to the C++ compiler, but not in the method + // pointer. + + // You can get around this by forward declaring the class and + // storing the sizeof its method pointer in a constant. Example: + + // class ClassWithVirtualInheritance; + // const int ClassWithVirtualInheritance_workaround = sizeof(void ClassWithVirtualInheritance::*()); + + // This will force the compiler to use the unknown type + // for the class, which falls under the next case + + // TODO: We need to try to identify if this is really a method pointer + // with virtual inheritance, or just a method pointer for multiple + // inheritance with pad bytes to produce a 16byte structure. + + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + + asMemCopy(&p, &Mthd, SINGLE_PTR_SIZE+2*sizeof(int)); + + // Mark this as a class method + p.flag = 3; + + return p; + } +}; + +template <> +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + + asMemCopy(&p, &Mthd, SINGLE_PTR_SIZE+3*sizeof(int)); + + // Mark this as a class method + p.flag = 3; + + return p; + } +}; + +template <> +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + // On 64bit platforms with 8byte data alignment + // the unknown class method pointers will come here. + + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + + asMemCopy(&p, &Mthd, SINGLE_PTR_SIZE+4*sizeof(int)); + + // Mark this as a class method + p.flag = 3; + + return p; + } +}; + +#endif + +#endif // AS_NO_CLASS_METHODS + +//---------------------------------------------------------------- +// JIT compiler + +struct asSVMRegisters +{ + asDWORD *programPointer; // points to current bytecode instruction + asDWORD *stackFramePointer; // function stack frame + asDWORD *stackPointer; // top of stack (grows downward) + void **globalVarPointers; // global variable pointers + asQWORD valueRegister; // temp register for primitives + void *objectRegister; // temp register for objects and handles + asIObjectType *objectType; // type of object held in object register + bool doProcessSuspend; // whether or not the JIT should break out when it encounters a suspend instruction +}; + +typedef void (*asJITFunction)(asSVMRegisters *registers, asDWORD entryId); + +class asIJITCompiler +{ +public: + virtual int CompileFunction(asIScriptFunction *function, asJITFunction *output) = 0; + virtual void ReleaseJITFunction(asJITFunction func) = 0; +public: + virtual ~asIJITCompiler() {} +}; + +// Byte code instructions +enum asEBCInstr +{ + asBC_POP = 0, + asBC_PUSH = 1, + asBC_PshC4 = 2, + asBC_PshV4 = 3, + asBC_PSF = 4, + asBC_SWAP4 = 5, + asBC_NOT = 6, + asBC_PshG4 = 7, + asBC_LdGRdR4 = 8, + asBC_CALL = 9, + asBC_RET = 10, + asBC_JMP = 11, + asBC_JZ = 12, + asBC_JNZ = 13, + asBC_JS = 14, + asBC_JNS = 15, + asBC_JP = 16, + asBC_JNP = 17, + asBC_TZ = 18, + asBC_TNZ = 19, + asBC_TS = 20, + asBC_TNS = 21, + asBC_TP = 22, + asBC_TNP = 23, + asBC_NEGi = 24, + asBC_NEGf = 25, + asBC_NEGd = 26, + asBC_INCi16 = 27, + asBC_INCi8 = 28, + asBC_DECi16 = 29, + asBC_DECi8 = 30, + asBC_INCi = 31, + asBC_DECi = 32, + asBC_INCf = 33, + asBC_DECf = 34, + asBC_INCd = 35, + asBC_DECd = 36, + asBC_IncVi = 37, + asBC_DecVi = 38, + asBC_BNOT = 39, + asBC_BAND = 40, + asBC_BOR = 41, + asBC_BXOR = 42, + asBC_BSLL = 43, + asBC_BSRL = 44, + asBC_BSRA = 45, + asBC_COPY = 46, + asBC_PshC8 = 47, + asBC_RDS8 = 48, + asBC_SWAP8 = 49, + asBC_CMPd = 50, + asBC_CMPu = 51, + asBC_CMPf = 52, + asBC_CMPi = 53, + asBC_CMPIi = 54, + asBC_CMPIf = 55, + asBC_CMPIu = 56, + asBC_JMPP = 57, + asBC_PopRPtr = 58, + asBC_PshRPtr = 59, + asBC_STR = 60, + asBC_CALLSYS = 61, + asBC_CALLBND = 62, + asBC_SUSPEND = 63, + asBC_ALLOC = 64, + asBC_FREE = 65, + asBC_LOADOBJ = 66, + asBC_STOREOBJ = 67, + asBC_GETOBJ = 68, + asBC_REFCPY = 69, + asBC_CHKREF = 70, + asBC_GETOBJREF = 71, + asBC_GETREF = 72, + asBC_SWAP48 = 73, + asBC_SWAP84 = 74, + asBC_OBJTYPE = 75, + asBC_TYPEID = 76, + asBC_SetV4 = 77, + asBC_SetV8 = 78, + asBC_ADDSi = 79, + asBC_CpyVtoV4 = 80, + asBC_CpyVtoV8 = 81, + asBC_CpyVtoR4 = 82, + asBC_CpyVtoR8 = 83, + asBC_CpyVtoG4 = 84, + asBC_CpyRtoV4 = 85, + asBC_CpyRtoV8 = 86, + asBC_CpyGtoV4 = 87, + asBC_WRTV1 = 88, + asBC_WRTV2 = 89, + asBC_WRTV4 = 90, + asBC_WRTV8 = 91, + asBC_RDR1 = 92, + asBC_RDR2 = 93, + asBC_RDR4 = 94, + asBC_RDR8 = 95, + asBC_LDG = 96, + asBC_LDV = 97, + asBC_PGA = 98, + asBC_RDS4 = 99, + asBC_VAR = 100, + asBC_iTOf = 101, + asBC_fTOi = 102, + asBC_uTOf = 103, + asBC_fTOu = 104, + asBC_sbTOi = 105, + asBC_swTOi = 106, + asBC_ubTOi = 107, + asBC_uwTOi = 108, + asBC_dTOi = 109, + asBC_dTOu = 110, + asBC_dTOf = 111, + asBC_iTOd = 112, + asBC_uTOd = 113, + asBC_fTOd = 114, + asBC_ADDi = 115, + asBC_SUBi = 116, + asBC_MULi = 117, + asBC_DIVi = 118, + asBC_MODi = 119, + asBC_ADDf = 120, + asBC_SUBf = 121, + asBC_MULf = 122, + asBC_DIVf = 123, + asBC_MODf = 124, + asBC_ADDd = 125, + asBC_SUBd = 126, + asBC_MULd = 127, + asBC_DIVd = 128, + asBC_MODd = 129, + asBC_ADDIi = 130, + asBC_SUBIi = 131, + asBC_MULIi = 132, + asBC_ADDIf = 133, + asBC_SUBIf = 134, + asBC_MULIf = 135, + asBC_SetG4 = 136, + asBC_ChkRefS = 137, + asBC_ChkNullV = 138, + asBC_CALLINTF = 139, + asBC_iTOb = 140, + asBC_iTOw = 141, + asBC_SetV1 = 142, + asBC_SetV2 = 143, + asBC_Cast = 144, + asBC_i64TOi = 145, + asBC_uTOi64 = 146, + asBC_iTOi64 = 147, + asBC_fTOi64 = 148, + asBC_dTOi64 = 149, + asBC_fTOu64 = 150, + asBC_dTOu64 = 151, + asBC_i64TOf = 152, + asBC_u64TOf = 153, + asBC_i64TOd = 154, + asBC_u64TOd = 155, + asBC_NEGi64 = 156, + asBC_INCi64 = 157, + asBC_DECi64 = 158, + asBC_BNOT64 = 159, + asBC_ADDi64 = 160, + asBC_SUBi64 = 161, + asBC_MULi64 = 162, + asBC_DIVi64 = 163, + asBC_MODi64 = 164, + asBC_BAND64 = 165, + asBC_BOR64 = 166, + asBC_BXOR64 = 167, + asBC_BSLL64 = 168, + asBC_BSRL64 = 169, + asBC_BSRA64 = 170, + asBC_CMPi64 = 171, + asBC_CMPu64 = 172, + asBC_ChkNullS = 173, + asBC_ClrHi = 174, + asBC_JitEntry = 175, + + asBC_MAXBYTECODE = 176, + + // Temporary tokens. Can't be output to the final program + asBC_PSP = 253, + asBC_LINE = 254, + asBC_LABEL = 255 +}; + +// Instruction types +enum asEBCType +{ + asBCTYPE_INFO = 0, + asBCTYPE_NO_ARG = 1, + asBCTYPE_W_ARG = 2, + asBCTYPE_wW_ARG = 3, + asBCTYPE_DW_ARG = 4, + asBCTYPE_rW_DW_ARG = 5, + asBCTYPE_QW_ARG = 6, + asBCTYPE_DW_DW_ARG = 7, + asBCTYPE_wW_rW_rW_ARG = 8, + asBCTYPE_wW_QW_ARG = 9, + asBCTYPE_wW_rW_ARG = 10, + asBCTYPE_rW_ARG = 11, + asBCTYPE_wW_DW_ARG = 12, + asBCTYPE_wW_rW_DW_ARG = 13, + asBCTYPE_rW_rW_ARG = 14, + asBCTYPE_W_rW_ARG = 15, + asBCTYPE_wW_W_ARG = 16, + asBCTYPE_W_DW_ARG = 17, + asBCTYPE_QW_DW_ARG = 18 +}; + +// Instruction type sizes +const int asBCTypeSize[19] = +{ + 0, // asBCTYPE_INFO + 1, // asBCTYPE_NO_ARG + 1, // asBCTYPE_W_ARG + 1, // asBCTYPE_wW_ARG + 2, // asBCTYPE_DW_ARG + 2, // asBCTYPE_rW_DW_ARG + 3, // asBCTYPE_QW_ARG + 3, // asBCTYPE_DW_DW_ARG + 2, // asBCTYPE_wW_rW_rW_ARG + 3, // asBCTYPE_wW_QW_ARG + 2, // asBCTYPE_wW_rW_ARG + 1, // asBCTYPE_rW_ARG + 2, // asBCTYPE_wW_DW_ARG + 3, // asBCTYPE_wW_rW_DW_ARG + 2, // asBCTYPE_rW_rW_ARG + 2, // asBCTYPE_W_rW_ARG + 2, // asBCTYPE_wW_W_ARG + 2, // asBCTYPE_W_DW_ARG + 4 // asBCTYPE_QW_DW_ARG +}; + +// Instruction info +struct asSBCInfo +{ + asEBCInstr bc; + asEBCType type; + int stackInc; + const char *name; +}; + +#ifndef AS_64BIT_PTR + #define asBCTYPE_PTR_ARG asBCTYPE_DW_ARG + #define asBCTYPE_PTR_DW_ARG asBCTYPE_DW_DW_ARG + #ifndef AS_PTR_SIZE + #define AS_PTR_SIZE 1 + #endif +#else + #define asBCTYPE_PTR_ARG asBCTYPE_QW_ARG + #define asBCTYPE_PTR_DW_ARG asBCTYPE_QW_DW_ARG + #ifndef AS_PTR_SIZE + #define AS_PTR_SIZE 2 + #endif +#endif + +#define asBCINFO(b,t,s) {asBC_##b, asBCTYPE_##t, s, #b} +#define asBCINFO_DUMMY(b) {asEBCInstr(b), asBCTYPE_INFO, 0, "BC_" #b} + +const asSBCInfo asBCInfo[256] = +{ + asBCINFO(POP, W_ARG, 0xFFFF), + asBCINFO(PUSH, W_ARG, 0xFFFF), + asBCINFO(PshC4, DW_ARG, 1), + asBCINFO(PshV4, rW_ARG, 1), + asBCINFO(PSF, rW_ARG, AS_PTR_SIZE), + asBCINFO(SWAP4, NO_ARG, 0), + asBCINFO(NOT, rW_ARG, 0), + asBCINFO(PshG4, W_ARG, 1), + asBCINFO(LdGRdR4, wW_W_ARG, 0), + asBCINFO(CALL, DW_ARG, 0xFFFF), + asBCINFO(RET, W_ARG, 0xFFFF), + asBCINFO(JMP, DW_ARG, 0), + asBCINFO(JZ, DW_ARG, 0), + asBCINFO(JNZ, DW_ARG, 0), + asBCINFO(JS, DW_ARG, 0), + asBCINFO(JNS, DW_ARG, 0), + asBCINFO(JP, DW_ARG, 0), + asBCINFO(JNP, DW_ARG, 0), + asBCINFO(TZ, NO_ARG, 0), + asBCINFO(TNZ, NO_ARG, 0), + asBCINFO(TS, NO_ARG, 0), + asBCINFO(TNS, NO_ARG, 0), + asBCINFO(TP, NO_ARG, 0), + asBCINFO(TNP, NO_ARG, 0), + asBCINFO(NEGi, rW_ARG, 0), + asBCINFO(NEGf, rW_ARG, 0), + asBCINFO(NEGd, rW_ARG, 0), + asBCINFO(INCi16, NO_ARG, 0), + asBCINFO(INCi8, NO_ARG, 0), + asBCINFO(DECi16, NO_ARG, 0), + asBCINFO(DECi8, NO_ARG, 0), + asBCINFO(INCi, NO_ARG, 0), + asBCINFO(DECi, NO_ARG, 0), + asBCINFO(INCf, NO_ARG, 0), + asBCINFO(DECf, NO_ARG, 0), + asBCINFO(INCd, NO_ARG, 0), + asBCINFO(DECd, NO_ARG, 0), + asBCINFO(IncVi, rW_ARG, 0), + asBCINFO(DecVi, rW_ARG, 0), + asBCINFO(BNOT, rW_ARG, 0), + asBCINFO(BAND, wW_rW_rW_ARG, 0), + asBCINFO(BOR, wW_rW_rW_ARG, 0), + asBCINFO(BXOR, wW_rW_rW_ARG, 0), + asBCINFO(BSLL, wW_rW_rW_ARG, 0), + asBCINFO(BSRL, wW_rW_rW_ARG, 0), + asBCINFO(BSRA, wW_rW_rW_ARG, 0), + asBCINFO(COPY, W_ARG, -AS_PTR_SIZE), + asBCINFO(PshC8, QW_ARG, 2), + asBCINFO(RDS8, NO_ARG, 2-AS_PTR_SIZE), + asBCINFO(SWAP8, NO_ARG, 0), + asBCINFO(CMPd, rW_rW_ARG, 0), + asBCINFO(CMPu, rW_rW_ARG, 0), + asBCINFO(CMPf, rW_rW_ARG, 0), + asBCINFO(CMPi, rW_rW_ARG, 0), + asBCINFO(CMPIi, rW_DW_ARG, 0), + asBCINFO(CMPIf, rW_DW_ARG, 0), + asBCINFO(CMPIu, rW_DW_ARG, 0), + asBCINFO(JMPP, rW_ARG, 0), + asBCINFO(PopRPtr, NO_ARG, -AS_PTR_SIZE), + asBCINFO(PshRPtr, NO_ARG, AS_PTR_SIZE), + asBCINFO(STR, W_ARG, 1+AS_PTR_SIZE), + asBCINFO(CALLSYS, DW_ARG, 0xFFFF), + asBCINFO(CALLBND, DW_ARG, 0xFFFF), + asBCINFO(SUSPEND, NO_ARG, 0), + asBCINFO(ALLOC, PTR_DW_ARG, 0xFFFF), + asBCINFO(FREE, PTR_ARG, -AS_PTR_SIZE), + asBCINFO(LOADOBJ, rW_ARG, 0), + asBCINFO(STOREOBJ, wW_ARG, 0), + asBCINFO(GETOBJ, W_ARG, 0), + asBCINFO(REFCPY, PTR_ARG, -AS_PTR_SIZE), + asBCINFO(CHKREF, NO_ARG, 0), + asBCINFO(GETOBJREF, W_ARG, 0), + asBCINFO(GETREF, W_ARG, 0), + asBCINFO(SWAP48, NO_ARG, 0), + asBCINFO(SWAP84, NO_ARG, 0), + asBCINFO(OBJTYPE, PTR_ARG, AS_PTR_SIZE), + asBCINFO(TYPEID, DW_ARG, 1), + asBCINFO(SetV4, wW_DW_ARG, 0), + asBCINFO(SetV8, wW_QW_ARG, 0), + asBCINFO(ADDSi, DW_ARG, 0), + asBCINFO(CpyVtoV4, wW_rW_ARG, 0), + asBCINFO(CpyVtoV8, wW_rW_ARG, 0), + asBCINFO(CpyVtoR4, rW_ARG, 0), + asBCINFO(CpyVtoR8, rW_ARG, 0), + asBCINFO(CpyVtoG4, W_rW_ARG, 0), + asBCINFO(CpyRtoV4, wW_ARG, 0), + asBCINFO(CpyRtoV8, wW_ARG, 0), + asBCINFO(CpyGtoV4, wW_W_ARG, 0), + asBCINFO(WRTV1, rW_ARG, 0), + asBCINFO(WRTV2, rW_ARG, 0), + asBCINFO(WRTV4, rW_ARG, 0), + asBCINFO(WRTV8, rW_ARG, 0), + asBCINFO(RDR1, wW_ARG, 0), + asBCINFO(RDR2, wW_ARG, 0), + asBCINFO(RDR4, wW_ARG, 0), + asBCINFO(RDR8, wW_ARG, 0), + asBCINFO(LDG, W_ARG, 0), + asBCINFO(LDV, rW_ARG, 0), + asBCINFO(PGA, W_ARG, AS_PTR_SIZE), + asBCINFO(RDS4, NO_ARG, 1-AS_PTR_SIZE), + asBCINFO(VAR, rW_ARG, AS_PTR_SIZE), + asBCINFO(iTOf, rW_ARG, 0), + asBCINFO(fTOi, rW_ARG, 0), + asBCINFO(uTOf, rW_ARG, 0), + asBCINFO(fTOu, rW_ARG, 0), + asBCINFO(sbTOi, rW_ARG, 0), + asBCINFO(swTOi, rW_ARG, 0), + asBCINFO(ubTOi, rW_ARG, 0), + asBCINFO(uwTOi, rW_ARG, 0), + asBCINFO(dTOi, wW_rW_ARG, 0), + asBCINFO(dTOu, wW_rW_ARG, 0), + asBCINFO(dTOf, wW_rW_ARG, 0), + asBCINFO(iTOd, wW_rW_ARG, 0), + asBCINFO(uTOd, wW_rW_ARG, 0), + asBCINFO(fTOd, wW_rW_ARG, 0), + asBCINFO(ADDi, wW_rW_rW_ARG, 0), + asBCINFO(SUBi, wW_rW_rW_ARG, 0), + asBCINFO(MULi, wW_rW_rW_ARG, 0), + asBCINFO(DIVi, wW_rW_rW_ARG, 0), + asBCINFO(MODi, wW_rW_rW_ARG, 0), + asBCINFO(ADDf, wW_rW_rW_ARG, 0), + asBCINFO(SUBf, wW_rW_rW_ARG, 0), + asBCINFO(MULf, wW_rW_rW_ARG, 0), + asBCINFO(DIVf, wW_rW_rW_ARG, 0), + asBCINFO(MODf, wW_rW_rW_ARG, 0), + asBCINFO(ADDd, wW_rW_rW_ARG, 0), + asBCINFO(SUBd, wW_rW_rW_ARG, 0), + asBCINFO(MULd, wW_rW_rW_ARG, 0), + asBCINFO(DIVd, wW_rW_rW_ARG, 0), + asBCINFO(MODd, wW_rW_rW_ARG, 0), + asBCINFO(ADDIi, wW_rW_DW_ARG, 0), + asBCINFO(SUBIi, wW_rW_DW_ARG, 0), + asBCINFO(MULIi, wW_rW_DW_ARG, 0), + asBCINFO(ADDIf, wW_rW_DW_ARG, 0), + asBCINFO(SUBIf, wW_rW_DW_ARG, 0), + asBCINFO(MULIf, wW_rW_DW_ARG, 0), + asBCINFO(SetG4, W_DW_ARG, 0), + asBCINFO(ChkRefS, NO_ARG, 0), + asBCINFO(ChkNullV, rW_ARG, 0), + asBCINFO(CALLINTF, DW_ARG, 0xFFFF), + asBCINFO(iTOb, rW_ARG, 0), + asBCINFO(iTOw, rW_ARG, 0), + asBCINFO(SetV1, wW_DW_ARG, 0), + asBCINFO(SetV2, wW_DW_ARG, 0), + asBCINFO(Cast, DW_ARG, -AS_PTR_SIZE), + asBCINFO(i64TOi, wW_rW_ARG, 0), + asBCINFO(uTOi64, wW_rW_ARG, 0), + asBCINFO(iTOi64, wW_rW_ARG, 0), + asBCINFO(fTOi64, wW_rW_ARG, 0), + asBCINFO(dTOi64, rW_ARG, 0), + asBCINFO(fTOu64, wW_rW_ARG, 0), + asBCINFO(dTOu64, rW_ARG, 0), + asBCINFO(i64TOf, wW_rW_ARG, 0), + asBCINFO(u64TOf, wW_rW_ARG, 0), + asBCINFO(i64TOd, rW_ARG, 0), + asBCINFO(u64TOd, rW_ARG, 0), + asBCINFO(NEGi64, rW_ARG, 0), + asBCINFO(INCi64, NO_ARG, 0), + asBCINFO(DECi64, NO_ARG, 0), + asBCINFO(BNOT64, rW_ARG, 0), + asBCINFO(ADDi64, wW_rW_rW_ARG, 0), + asBCINFO(SUBi64, wW_rW_rW_ARG, 0), + asBCINFO(MULi64, wW_rW_rW_ARG, 0), + asBCINFO(DIVi64, wW_rW_rW_ARG, 0), + asBCINFO(MODi64, wW_rW_rW_ARG, 0), + asBCINFO(BAND64, wW_rW_rW_ARG, 0), + asBCINFO(BOR64, wW_rW_rW_ARG, 0), + asBCINFO(BXOR64, wW_rW_rW_ARG, 0), + asBCINFO(BSLL64, wW_rW_rW_ARG, 0), + asBCINFO(BSRL64, wW_rW_rW_ARG, 0), + asBCINFO(BSRA64, wW_rW_rW_ARG, 0), + asBCINFO(CMPi64, rW_rW_ARG, 0), + asBCINFO(CMPu64, rW_rW_ARG, 0), + asBCINFO(ChkNullS, W_ARG, 0), + asBCINFO(ClrHi, NO_ARG, 0), + asBCINFO(JitEntry, W_ARG, 0), + + asBCINFO_DUMMY(176), + asBCINFO_DUMMY(177), + asBCINFO_DUMMY(178), + asBCINFO_DUMMY(179), + asBCINFO_DUMMY(180), + asBCINFO_DUMMY(181), + asBCINFO_DUMMY(182), + asBCINFO_DUMMY(183), + asBCINFO_DUMMY(184), + asBCINFO_DUMMY(185), + asBCINFO_DUMMY(186), + asBCINFO_DUMMY(187), + asBCINFO_DUMMY(188), + asBCINFO_DUMMY(189), + asBCINFO_DUMMY(190), + asBCINFO_DUMMY(191), + asBCINFO_DUMMY(192), + asBCINFO_DUMMY(193), + asBCINFO_DUMMY(194), + asBCINFO_DUMMY(195), + asBCINFO_DUMMY(196), + asBCINFO_DUMMY(197), + asBCINFO_DUMMY(198), + asBCINFO_DUMMY(199), + asBCINFO_DUMMY(200), + asBCINFO_DUMMY(201), + asBCINFO_DUMMY(202), + asBCINFO_DUMMY(203), + asBCINFO_DUMMY(204), + asBCINFO_DUMMY(205), + asBCINFO_DUMMY(206), + asBCINFO_DUMMY(207), + asBCINFO_DUMMY(208), + asBCINFO_DUMMY(209), + asBCINFO_DUMMY(210), + asBCINFO_DUMMY(211), + asBCINFO_DUMMY(212), + asBCINFO_DUMMY(213), + asBCINFO_DUMMY(214), + asBCINFO_DUMMY(215), + asBCINFO_DUMMY(216), + asBCINFO_DUMMY(217), + asBCINFO_DUMMY(218), + asBCINFO_DUMMY(219), + asBCINFO_DUMMY(220), + asBCINFO_DUMMY(221), + asBCINFO_DUMMY(222), + asBCINFO_DUMMY(223), + asBCINFO_DUMMY(224), + asBCINFO_DUMMY(225), + asBCINFO_DUMMY(226), + asBCINFO_DUMMY(227), + asBCINFO_DUMMY(228), + asBCINFO_DUMMY(229), + asBCINFO_DUMMY(230), + asBCINFO_DUMMY(231), + asBCINFO_DUMMY(232), + asBCINFO_DUMMY(233), + asBCINFO_DUMMY(234), + asBCINFO_DUMMY(235), + asBCINFO_DUMMY(236), + asBCINFO_DUMMY(237), + asBCINFO_DUMMY(238), + asBCINFO_DUMMY(239), + asBCINFO_DUMMY(240), + asBCINFO_DUMMY(241), + asBCINFO_DUMMY(242), + asBCINFO_DUMMY(243), + asBCINFO_DUMMY(244), + asBCINFO_DUMMY(245), + asBCINFO_DUMMY(246), + asBCINFO_DUMMY(247), + asBCINFO_DUMMY(248), + asBCINFO_DUMMY(249), + asBCINFO_DUMMY(250), + asBCINFO_DUMMY(251), + asBCINFO_DUMMY(252), + + asBCINFO(PSP, W_ARG, AS_PTR_SIZE), + asBCINFO(LINE, INFO, 0xFFFF), + asBCINFO(LABEL, INFO, 0xFFFF) +}; + +// Macros to access bytecode instruction arguments +#define asBC_DWORDARG(x) (asDWORD(*(x+1))) +#define asBC_INTARG(x) (int(*(x+1))) +#define asBC_QWORDARG(x) (*(asQWORD*)(x+1)) +#define asBC_FLOATARG(x) (*(float*)(x+1)) +#define asBC_PTRARG(x) (asPTRWORD(*(x+1))) +#define asBC_WORDARG0(x) (*(((asWORD*)x)+1)) +#define asBC_WORDARG1(x) (*(((asWORD*)x)+2)) +#define asBC_SWORDARG0(x) (*(((short*)x)+1)) +#define asBC_SWORDARG1(x) (*(((short*)x)+2)) +#define asBC_SWORDARG2(x) (*(((short*)x)+3)) + + +END_AS_NAMESPACE + +#endif Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/lib/angelscript.lib and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/lib/angelscript.lib differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/lib/delete.me kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/lib/delete.me --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/lib/delete.me 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/lib/delete.me 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1 @@ +This file is only here to guarantee that unpackers don't skip creating the /lib directory. \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/android/Android.mk kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/android/Android.mk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/android/Android.mk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/android/Android.mk 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,7 @@ +commonSources:= as_callfunc_armasm.S as_arrayobject.cpp as_atomic.cpp as_builder.cpp as_bytecode.cpp as_callfunc.cpp as_callfunc_arm.cpp as_callfunc_mips.cpp as_callfunc_ppc.cpp as_callfunc_ppc_64.cpp as_callfunc_sh4.cpp as_callfunc_x86.cpp as_callfunc_x64_gcc.cpp as_compiler.cpp as_context.cpp as_configgroup.cpp as_datatype.cpp as_generic.cpp as_gc.cpp as_globalproperty.cpp as_memory.cpp as_module.cpp as_objecttype.cpp as_outputbuffer.cpp as_parser.cpp as_restore.cpp as_scriptcode.cpp as_scriptengine.cpp as_scriptfunction.cpp as_scriptnode.cpp as_scriptobject.cpp as_string.cpp as_string_util.cpp as_thread.cpp as_tokenizer.cpp as_typeinfo.cpp as_variablescope.cpp +LOCAL_PATH:= $(call my-dir)/../../source +include $(CLEAR_VARS) +LOCAL_SRC_FILES:= $(commonSources) +LOCAL_MODULE:= libangelscript +include $(BUILD_STATIC_LIBRARY) + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/codeblocks/angelscript.cbp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/codeblocks/angelscript.cbp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/codeblocks/angelscript.cbp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/codeblocks/angelscript.cbp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,110 @@ + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dev-cpp/AngelScript.dev kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dev-cpp/AngelScript.dev --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dev-cpp/AngelScript.dev 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dev-cpp/AngelScript.dev 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,769 @@ +[Project] +FileName=AngelScript.dev +Name=AngelScript +UnitCount=68 +Type=2 +Ver=1 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=1 +Icon= +ExeOutput=..\..\lib +ObjectOutput=obj +OverrideOutput=0 +OverrideOutputName=AngelScript.a +HostApplication= +Folders= +CommandLine= +UseCustomMakefile=0 +CustomMakefile= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=0 +CompilerSettings=0000000000000001000000 + +[Unit1] +FileName=..\..\include\angelscript.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=..\..\source\as_variablescope.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=..\..\source\as_arrayobject.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=..\..\source\as_arrayobject.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=..\..\source\as_builder.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=..\..\source\as_builder.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=..\..\source\as_bytecode.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=..\..\source\as_bytecode.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit9] +FileName=..\..\source\as_bytecodedef.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit10] +FileName=..\..\source\as_callfunc.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit11] +FileName=..\..\source\as_callfunc_x86.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit12] +FileName=..\..\source\as_compiler.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit13] +FileName=..\..\source\as_compiler.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit14] +FileName=..\..\source\as_config.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit15] +FileName=..\..\source\as_context.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit16] +FileName=..\..\source\as_context.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit17] +FileName=..\..\source\as_datatype.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit18] +FileName=..\..\source\as_datatype.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit19] +FileName=..\..\source\as_debug.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit20] +FileName=..\..\source\as_map.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit21] +FileName=..\..\source\as_memory.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit22] +FileName=..\..\source\as_module.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit23] +FileName=..\..\source\as_module.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit24] +FileName=..\..\source\as_objecttype.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit25] +FileName=..\..\source\as_objecttype.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit26] +FileName=..\..\source\as_outputbuffer.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit27] +FileName=..\..\source\as_outputbuffer.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit28] +FileName=..\..\source\as_parser.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit29] +FileName=..\..\source\as_parser.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit30] +FileName=..\..\source\as_property.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit31] +FileName=..\..\source\as_restore.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit32] +FileName=..\..\source\as_restore.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit33] +FileName=..\..\source\as_scriptcode.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit34] +FileName=..\..\source\as_scriptcode.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit35] +FileName=..\..\source\as_scriptengine.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit36] +FileName=..\..\source\as_scriptengine.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit37] +FileName=..\..\source\as_scriptfunction.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit38] +FileName=..\..\source\as_scriptfunction.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit39] +FileName=..\..\source\as_scriptnode.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit40] +FileName=..\..\source\as_scriptnode.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit41] +FileName=..\..\source\as_string.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit42] +FileName=..\..\source\as_string.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit43] +FileName=..\..\source\as_string_util.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit44] +FileName=..\..\source\as_string_util.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit45] +FileName=..\..\source\as_structs.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit46] +FileName=..\..\source\as_texts.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit47] +FileName=..\..\source\as_thread.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit48] +FileName=..\..\source\as_thread.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit49] +FileName=..\..\source\as_tokendef.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit50] +FileName=..\..\source\as_tokenizer.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit51] +FileName=..\..\source\as_tokenizer.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit52] +FileName=..\..\source\as_typeinfo.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit53] +FileName=..\..\source\as_typeinfo.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit54] +FileName=..\..\source\as_types.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit55] +FileName=..\..\source\as_variablescope.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit56] +FileName=..\..\source\as_array.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit57] +FileName=..\..\source\as_callfunc_sh4.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit58] +FileName=..\..\source\as_generic.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit59] +FileName=..\..\source\as_generic.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit60] +FileName=..\..\source\as_callfunc.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[VersionInfo] +Major=0 +Minor=1 +Release=1 +Build=1 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 + +[Unit61] +FileName=..\..\source\as_scriptobject.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit62] +FileName=..\..\source\as_scriptobject.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit63] +FileName=..\..\source\as_gcobject.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit64] +FileName=..\..\source\as_gcobject.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit65] +FileName=..\..\source\as_anyobject.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit66] +FileName=..\..\source\as_anyobject.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit67] +FileName=..\..\source\as_configgroup.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit68] +FileName=..\..\source\as_configgroup.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit69] +FileName=..\..\source\as_configgroup.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit70] +FileName=..\..\source\as_configgroup.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit71] +FileName=..\..\source\as_configgroup.h +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit72] +FileName=..\..\source\as_configgroup.cpp +CompileCpp=1 +Folder=AngelScript +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dev-cpp/Makefile.win kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dev-cpp/Makefile.win --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dev-cpp/Makefile.win 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dev-cpp/Makefile.win 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,114 @@ +# Project: AngelScript +# Makefile created by Dev-C++ 4.9.9.1 + +CPP = g++.exe -D__DEBUG__ +CC = gcc.exe -D__DEBUG__ +WINDRES = windres.exe +RES = +OBJ = obj/as_arrayobject.o obj/as_builder.o obj/as_bytecode.o obj/as_callfunc_x86.o obj/as_compiler.o obj/as_context.o obj/as_datatype.o obj/as_module.o obj/as_objecttype.o obj/as_outputbuffer.o obj/as_parser.o obj/as_restore.o obj/as_scriptcode.o obj/as_scriptengine.o obj/as_scriptfunction.o obj/as_scriptnode.o obj/as_string.o obj/as_string_util.o obj/as_thread.o obj/as_tokenizer.o obj/as_typeinfo.o obj/as_variablescope.o obj/as_callfunc_sh4.o obj/as_generic.o obj/as_callfunc.o obj/as_scriptstruct.o obj/as_gcobject.o obj/as_anyobject.o obj/as_configgroup.o $(RES) +LINKOBJ = obj/as_arrayobject.o obj/as_builder.o obj/as_bytecode.o obj/as_callfunc_x86.o obj/as_compiler.o obj/as_context.o obj/as_datatype.o obj/as_module.o obj/as_objecttype.o obj/as_outputbuffer.o obj/as_parser.o obj/as_restore.o obj/as_scriptcode.o obj/as_scriptengine.o obj/as_scriptfunction.o obj/as_scriptnode.o obj/as_string.o obj/as_string_util.o obj/as_thread.o obj/as_tokenizer.o obj/as_typeinfo.o obj/as_variablescope.o obj/as_callfunc_sh4.o obj/as_generic.o obj/as_callfunc.o obj/as_scriptstruct.o obj/as_gcobject.o obj/as_anyobject.o obj/as_configgroup.o $(RES) +LIBS = -L"C:/Dev-Cpp/lib" -g3 +INCS = -I"C:/Dev-Cpp/include" +CXXINCS = -I"C:/Dev-Cpp/include/c++/3.3.1" -I"C:/Dev-Cpp/include/c++/3.3.1/mingw32" -I"C:/Dev-Cpp/include/c++/3.3.1/backward" -I"C:/Dev-Cpp/lib/gcc-lib/mingw32/3.3.1/include" -I"C:/Dev-Cpp/include" +BIN = ../../lib/AngelScript.a +CXXFLAGS = $(CXXINCS) -g3 +CFLAGS = $(INCS) -g3 + +.PHONY: all all-before all-after clean clean-custom + +all: all-before ../../lib/AngelScript.a all-after + + +clean: clean-custom + rm -f $(OBJ) $(BIN) + +$(BIN): $(LINKOBJ) + ar r $(BIN) $(LINKOBJ) + ranlib $(BIN) + +obj/as_arrayobject.o: ../../source/as_arrayobject.cpp + $(CPP) -c ../../source/as_arrayobject.cpp -o obj/as_arrayobject.o $(CXXFLAGS) + +obj/as_builder.o: ../../source/as_builder.cpp + $(CPP) -c ../../source/as_builder.cpp -o obj/as_builder.o $(CXXFLAGS) + +obj/as_bytecode.o: ../../source/as_bytecode.cpp + $(CPP) -c ../../source/as_bytecode.cpp -o obj/as_bytecode.o $(CXXFLAGS) + +obj/as_callfunc_x86.o: ../../source/as_callfunc_x86.cpp + $(CPP) -c ../../source/as_callfunc_x86.cpp -o obj/as_callfunc_x86.o $(CXXFLAGS) + +obj/as_compiler.o: ../../source/as_compiler.cpp + $(CPP) -c ../../source/as_compiler.cpp -o obj/as_compiler.o $(CXXFLAGS) + +obj/as_context.o: ../../source/as_context.cpp + $(CPP) -c ../../source/as_context.cpp -o obj/as_context.o $(CXXFLAGS) + +obj/as_datatype.o: ../../source/as_datatype.cpp + $(CPP) -c ../../source/as_datatype.cpp -o obj/as_datatype.o $(CXXFLAGS) + +obj/as_module.o: ../../source/as_module.cpp + $(CPP) -c ../../source/as_module.cpp -o obj/as_module.o $(CXXFLAGS) + +obj/as_objecttype.o: ../../source/as_objecttype.cpp + $(CPP) -c ../../source/as_objecttype.cpp -o obj/as_objecttype.o $(CXXFLAGS) + +obj/as_outputbuffer.o: ../../source/as_outputbuffer.cpp + $(CPP) -c ../../source/as_outputbuffer.cpp -o obj/as_outputbuffer.o $(CXXFLAGS) + +obj/as_parser.o: ../../source/as_parser.cpp + $(CPP) -c ../../source/as_parser.cpp -o obj/as_parser.o $(CXXFLAGS) + +obj/as_restore.o: ../../source/as_restore.cpp + $(CPP) -c ../../source/as_restore.cpp -o obj/as_restore.o $(CXXFLAGS) + +obj/as_scriptcode.o: ../../source/as_scriptcode.cpp + $(CPP) -c ../../source/as_scriptcode.cpp -o obj/as_scriptcode.o $(CXXFLAGS) + +obj/as_scriptengine.o: ../../source/as_scriptengine.cpp + $(CPP) -c ../../source/as_scriptengine.cpp -o obj/as_scriptengine.o $(CXXFLAGS) + +obj/as_scriptfunction.o: ../../source/as_scriptfunction.cpp + $(CPP) -c ../../source/as_scriptfunction.cpp -o obj/as_scriptfunction.o $(CXXFLAGS) + +obj/as_scriptnode.o: ../../source/as_scriptnode.cpp + $(CPP) -c ../../source/as_scriptnode.cpp -o obj/as_scriptnode.o $(CXXFLAGS) + +obj/as_string.o: ../../source/as_string.cpp + $(CPP) -c ../../source/as_string.cpp -o obj/as_string.o $(CXXFLAGS) + +obj/as_string_util.o: ../../source/as_string_util.cpp + $(CPP) -c ../../source/as_string_util.cpp -o obj/as_string_util.o $(CXXFLAGS) + +obj/as_thread.o: ../../source/as_thread.cpp + $(CPP) -c ../../source/as_thread.cpp -o obj/as_thread.o $(CXXFLAGS) + +obj/as_tokenizer.o: ../../source/as_tokenizer.cpp + $(CPP) -c ../../source/as_tokenizer.cpp -o obj/as_tokenizer.o $(CXXFLAGS) + +obj/as_typeinfo.o: ../../source/as_typeinfo.cpp + $(CPP) -c ../../source/as_typeinfo.cpp -o obj/as_typeinfo.o $(CXXFLAGS) + +obj/as_variablescope.o: ../../source/as_variablescope.cpp + $(CPP) -c ../../source/as_variablescope.cpp -o obj/as_variablescope.o $(CXXFLAGS) + +obj/as_callfunc_sh4.o: ../../source/as_callfunc_sh4.cpp + $(CPP) -c ../../source/as_callfunc_sh4.cpp -o obj/as_callfunc_sh4.o $(CXXFLAGS) + +obj/as_generic.o: ../../source/as_generic.cpp + $(CPP) -c ../../source/as_generic.cpp -o obj/as_generic.o $(CXXFLAGS) + +obj/as_callfunc.o: ../../source/as_callfunc.cpp + $(CPP) -c ../../source/as_callfunc.cpp -o obj/as_callfunc.o $(CXXFLAGS) + +obj/as_scriptstruct.o: ../../source/as_scriptstruct.cpp + $(CPP) -c ../../source/as_scriptstruct.cpp -o obj/as_scriptstruct.o $(CXXFLAGS) + +obj/as_gcobject.o: ../../source/as_gcobject.cpp + $(CPP) -c ../../source/as_gcobject.cpp -o obj/as_gcobject.o $(CXXFLAGS) + +obj/as_anyobject.o: ../../source/as_anyobject.cpp + $(CPP) -c ../../source/as_anyobject.cpp -o obj/as_anyobject.o $(CXXFLAGS) + +obj/as_configgroup.o: ../../source/as_configgroup.cpp + $(CPP) -c ../../source/as_configgroup.cpp -o obj/as_configgroup.o $(CXXFLAGS) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/Makefile kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/Makefile --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/Makefile 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,22 @@ +# +# GNU make Makefile for Angelscript +# + +TARGET = libangelscript.a + +CC_FILES := $(shell ls -1 as_*.cpp) +OBJS = $(patsubst %.cpp, %.o, $(CC_FILES)) + +all: ../include/memory.h defaultall + +../include/memory.h: + echo "#include " >> ../include/memory.h + +include $(KOS_BASE)/addons/Makefile.prefab + +KOS_CFLAGS += -Dmemory=string -D__dreamcast__ -I../include -I. + +clean: + rm -f *~ *.o *.a + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/obj/delete.me kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/obj/delete.me --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/obj/delete.me 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/obj/delete.me 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2 @@ +This file is here just in case your unarchiver does not extract empty directories. +Feel free to remove it. \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/readme.txt kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/readme.txt --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/readme.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/dreamcast/readme.txt 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,22 @@ +Author of sh4 specifics +----------------------- +Fredrik Ehnbom - original version in May, 2004 +Fredrik Ehnbom - updated version for 2.0.0wip2 in Jan, 2005 + +Howto use +----------------------- +This assumes a working kallistios installation. It was developed with +kallistios 1.3.x subversion revision 183 and sh-elf-gcc 3.4.3. Though, +it does not really rely on anything kallistios specific, so it should +be possible to get it up and running on other sh4-based architectures. + +AngelScript uses memory.h which does not seem to be provided with kos. +Don't worry though, the makefile creates one for you ;) + +To build the library, just go to angelscript/source and type + +make -f ../projects/dreamcast/Makefile + +or wherever you put the makefile shipped with this textdocument. +The library will be in $KOS_BASE/addons/lib/dreamcast/ together with +all the other kos addon libraries. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/makefile kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/makefile --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/makefile 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,144 @@ +# Angelscript makefile for linux (based on MingW makefile) +# Type 'make' then 'make install' to complete the installation of the library + +# For 'make install' to work, set LOCAL according to your system configuration +LOCAL = /usr/local + +# If you want to build a shared library, then run make with SHARED=1 and VERSION=version +ifdef SHARED + LIB = libangelscript-$(VERSION).so + DEVLIB = libangelscript.so +else + LIB = libangelscript.a +endif +INC = angelscript.h + +SRCDIR = ../../source +INCDIR = ../../include +ifeq ($(TARGETPLATFORM), iphone) + IPHONEBIN = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin + OBJDIR = obj-iphone + LIBDIR = ../../lib-iphone + CXX = $(IPHONEBIN)/arm-apple-darwin9-g++-4.0.1 + CXXFLAGS = -g -Wall -fPIC -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk +else ifeq ($(TARGETPLATFORM), android) + ANDROIDNDKROOT = /cygdrive/c/android/android-ndk-1.6_r1 + ANDROIDBIN = $(ANDROIDNDKROOT)/build/prebuilt/windows/arm-eabi-4.2.1/bin + SYSROOT = $(ANDROIDNDKROOT)/build/platforms/android-4/arch-arm + OBJDIR = obj-android + LIBDIR = ../../lib-android + CXX = $(ANDROIDBIN)/arm-eabi-gcc + CXXFLAGS = -g -Wall -I$(SYSROOT)/usr/include \ + -Wall \ + -DANDROID \ + -fno-exceptions \ + -march=armv6 -mthumb-interwork \ + -mfloat-abi=softfp -fno-rtti +else + OBJDIR = obj + LIBDIR = ../../lib + CXX = gcc + # On i686 architecture you may need to add -march=i686 if you get + # an undefined symbol for __sync_sub_and_fetch_4 in as_atomic.cpp. + CXXFLAGS = -g -Wall -fPIC +endif + +DELETER = rm -f +COPIER = cp -a + +SRCNAMES = \ + as_arrayobject.cpp \ + as_atomic.cpp \ + as_builder.cpp \ + as_bytecode.cpp \ + as_callfunc.cpp \ + as_callfunc_arm.cpp \ + as_callfunc_mips.cpp \ + as_callfunc_ppc.cpp \ + as_callfunc_ppc_64.cpp \ + as_callfunc_sh4.cpp \ + as_callfunc_x86.cpp \ + as_callfunc_x64_gcc.cpp \ + as_compiler.cpp \ + as_context.cpp \ + as_configgroup.cpp \ + as_datatype.cpp \ + as_generic.cpp \ + as_gc.cpp \ + as_globalproperty.cpp \ + as_memory.cpp \ + as_module.cpp \ + as_objecttype.cpp \ + as_outputbuffer.cpp \ + as_parser.cpp \ + as_restore.cpp \ + as_scriptcode.cpp \ + as_scriptengine.cpp \ + as_scriptfunction.cpp \ + as_scriptnode.cpp \ + as_scriptobject.cpp \ + as_string.cpp \ + as_string_util.cpp \ + as_thread.cpp \ + as_tokenizer.cpp \ + as_typeinfo.cpp \ + as_variablescope.cpp \ + +OBJ = $(addprefix $(OBJDIR)/, $(notdir $(SRCNAMES:.cpp=.o))) +BIN = $(LIBDIR)/$(LIB) + +ifeq ($(TARGETPLATFORM), iphone) + OBJ += $(OBJDIR)/as_callfunc_arm_xcode.o +else ifeq ($(TARGETPLATFORM), android) + OBJ += $(OBJDIR)/as_callfunc_arm_gcc.o +endif + +all: $(BIN) + +$(BIN): $(OBJDIR) $(LIBDIR) $(OBJ) +ifdef SHARED + $(CXX) -shared -Wl,-soname,$(LIB) -o $(BIN) $(OBJ) + ( cd $(LIBDIR); ln -s $(LIB) $(DEVLIB) ) +else + ar r $(BIN) $(OBJ) + ranlib $(BIN) +endif + @echo ------------------------------------------------------------------- + @echo Done. As root, type 'make install' to install the library. + +$(OBJDIR): + mkdir $(OBJDIR) + +$(LIBDIR): + mkdir $(LIBDIR) + +$(OBJDIR)/%.o: $(SRCDIR)/%.cpp + $(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/%.o: $(SRCDIR)/%.S + $(CXX) $(CXXFLAGS) -o $@ -c $< + +$(OBJDIR)/%.o: $(SRCDIR)/%.s + $(CXX) $(CXXFLAGS) -o $@ -c $< + + +clean: + $(DELETER) $(OBJ) $(BIN) $(LIBDIR)/$(DEVLIB) + +install: $(BIN) + @echo Installing to: $(LOCAL)/lib and $(LOCAL)/include... + @echo ------------------------------------------------------------------- +ifdef SHARED + $(COPIER) $(LIBDIR)/$(DEVLIB) $(LOCAL)/lib +endif + $(COPIER) $(BIN) $(LOCAL)/lib + $(COPIER) $(INCDIR)/$(INC) $(LOCAL)/include + @echo ------------------------------------------------------------------- + @echo Angelscript library installed. Enjoy! + +uninstall: + $(DELETER) $(LOCAL)/include/$(INC) $(LOCAL)/lib/$(LIB) $(LOCAL)/lib/$(DEVLIB) + @echo ------------------------------------------------------------------- + @echo Angelscript library uninstalled. + +.PHONY: all clean install uninstall diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/obj/delete.me kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/obj/delete.me --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/obj/delete.me 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/obj/delete.me 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2 @@ +This file is here just in case your unarchiver does not extract empty directories. +Feel free to remove it. \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/readme.txt kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/readme.txt --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/readme.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/gnuc/readme.txt 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,20 @@ +To compile the library, just type in the command line: + +make + +In order to install the library you might have to adopt the makefile to +match your system configuration. By default the library will be installed +to "/usr/local/..." (lib/ and include/). To change that, edit the makefile +variable $LOCAL. + +In order to install the library, switch to root: + +su +make install +exit + +You can uninstall the library, too: + +su +make uninstall +exit diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/makefile kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/makefile --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/makefile 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,78 @@ +# Angelscript MingW makefile +# Type 'make' then 'make install' to complete the installation of the library + +CXX = g++ +CXXFLAGS = -ggdb +SRCDIR = ../../source +OBJDIR = obj +SRCNAMES = \ + as_arrayobject.cpp \ + as_atomic.cpp \ + as_builder.cpp \ + as_bytecode.cpp \ + as_callfunc.cpp \ + as_callfunc_mips.cpp \ + as_callfunc_ppc_64.cpp \ + as_callfunc_ppc.cpp \ + as_callfunc_sh4.cpp \ + as_callfunc_x86.cpp \ + as_compiler.cpp \ + as_configgroup.cpp \ + as_context.cpp \ + as_datatype.cpp \ + as_generic.cpp \ + as_gc.cpp \ + as_globalproperty.cpp \ + as_memory.cpp \ + as_module.cpp \ + as_objecttype.cpp \ + as_outputbuffer.cpp \ + as_parser.cpp \ + as_restore.cpp \ + as_scriptcode.cpp \ + as_scriptengine.cpp \ + as_scriptfunction.cpp \ + as_scriptnode.cpp \ + as_scriptobject.cpp \ + as_string.cpp \ + as_string_util.cpp \ + as_thread.cpp \ + as_tokenizer.cpp \ + as_typeinfo.cpp \ + as_variablescope.cpp \ + +OBJ = $(addprefix $(OBJDIR)/, $(notdir $(SRCNAMES:.cpp=.o))) +BIN = ../../lib/libangelscript.a +OBJ_D = $(subst /,\,$(OBJ)) +BIN_D = $(subst /,\,$(BIN)) +DELETER = del /f +COPIER = copy /y +INCLUDEFILES_D = ..\..\include\angelscript.h +UNINSTALLFILES_D = $(MINGDIR)\lib\libangelscript.a $(MINGDIR)\include\angelscript.h + +all: $(BIN) + +$(BIN): $(OBJ) + ar rcs $(BIN) $(OBJ) + @echo ------------------------------------------------------------------- + @echo Done. Now type 'make install' to install the library on your MinGW. + +$(OBJDIR)/%.o: $(SRCDIR)/%.cpp + $(CXX) $(CXXFLAGS) -o $@ -c $< + + +clean: + $(DELETER) $(OBJ_D) $(BIN_D) + +install: $(BIN) + $(COPIER) $(BIN_D) $(MINGDIR)\lib + $(COPIER) $(INCLUDEFILES_D) $(MINGDIR)\include + @echo ------------------------------------------------------------------- + @echo Angelscript library installed. Enjoy! + +uninstall: + $(DELETER) $(UNINSTALLFILES_D) + @echo ------------------------------------------------------------------- + @echo Angelscript library uninstalled. + +.PHONY: all clean install uninstall diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/obj/delete.me kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/obj/delete.me --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/obj/delete.me 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/obj/delete.me 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2 @@ +This file is here just in case your unarchiver does not extract empty directories. +Feel free to remove it. \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/readme.txt kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/readme.txt --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/readme.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/mingw/readme.txt 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,9 @@ +If you haven't done that already set up an environment variable named MINGDIR +pointing the the directory where your MinGW is, e.g. "C:\MINGW" + +To compile the library, just type in the command line: + +make +make install + +Sent in by Jakub "krajzega" Wasilewski \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc6/angelscript.dsw kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc6/angelscript.dsw --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc6/angelscript.dsw 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc6/angelscript.dsw 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "angelscript lib"=.\lib\angelscript.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc6/lib/angelscript.dsp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc6/lib/angelscript.dsp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc6/lib/angelscript.dsp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc6/lib/angelscript.dsp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,417 @@ +# Microsoft Developer Studio Project File - Name="angelscript lib" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=angelscript lib - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "angelscript.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "angelscript.mak" CFG="angelscript lib - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "angelscript lib - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "angelscript lib - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE "angelscript lib - Win32 Debug with stats" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "angelscript lib - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /MT /W3 /O2 /Oy- /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "ANGELSCRIPT_EXPORT" /YX /FD /opt:nowin98 /c +# ADD BASE RSC /l 0x416 /d "NDEBUG" +# ADD RSC /l 0x416 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\..\..\lib\angelscript.lib" + +!ELSEIF "$(CFG)" == "angelscript lib - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "ANGELSCRIPT_EXPORT" /YX /FD /opt:nowin98 /GZ /c +# ADD BASE RSC /l 0x416 /d "_DEBUG" +# ADD RSC /l 0x416 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\..\..\lib\angelscriptd.lib" + +!ELSEIF "$(CFG)" == "angelscript lib - Win32 Debug with stats" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "angelscript_lib___Win32_Debug_with_stats" +# PROP BASE Intermediate_Dir "angelscript_lib___Win32_Debug_with_stats" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_with_stats" +# PROP Intermediate_Dir "Debug_with_stats" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "AS_DEBUG" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "ANGELSCRIPT_EXPORT" /YX /FD /opt:nowin98 /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "AS_USE_NAMESPACE" /D "AS_DEBUG" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "ANGELSCRIPT_EXPORT" /YX /FD /opt:nowin98 /GZ /c +# ADD BASE RSC /l 0x416 /d "_DEBUG" +# ADD RSC /l 0x416 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\lib\angelscript.lib" +# ADD LIB32 /nologo /out:"..\..\..\lib\angelscriptd.lib" + +!ENDIF + +# Begin Target + +# Name "angelscript lib - Win32 Release" +# Name "angelscript lib - Win32 Debug" +# Name "angelscript lib - Win32 Debug with stats" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\..\source\as_arrayobject.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_atomic.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_builder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_bytecode.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_callfunc.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_callfunc_arm.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_callfunc_mips.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_callfunc_ppc.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_callfunc_ppc_64.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_callfunc_sh4.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_callfunc_x64_gcc.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_callfunc_x86.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_callfunc_xenon.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_compiler.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_configgroup.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_context.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_datatype.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_gc.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_generic.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_globalproperty.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_memory.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_module.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_objecttype.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_outputbuffer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_parser.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_restore.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_scriptcode.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_scriptengine.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_scriptfunction.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_scriptnode.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_scriptobject.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_string.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_string_util.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_thread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_tokenizer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_typeinfo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_variablescope.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\..\source\as_array.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_arrayobject.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_atomic.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_builder.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_bytecode.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_callfunc.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_compiler.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_config.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_configgroup.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_context.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_criticalsection.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_datatype.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_debug.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_gc.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_generic.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_map.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_memory.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_module.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_objecttype.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_outputbuffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_parser.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_property.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_restore.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_scriptcode.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_scriptengine.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_scriptfunction.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_scriptnode.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_scriptobject.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_string.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_string_util.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_texts.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_thread.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_tokendef.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_tokenizer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_typeinfo.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\as_variablescope.h +# End Source File +# End Group +# Begin Group "Interface" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\include\angelscript.h +# End Source File +# End Group +# End Target +# End Project diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc7/msvc7.sln kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc7/msvc7.sln --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc7/msvc7.sln 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc7/msvc7.sln 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msvc7", "msvc7.vcproj", "{42D445F6-0462-4870-87CD-01E964EA8B97}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {42D445F6-0462-4870-87CD-01E964EA8B97}.Debug.ActiveCfg = Debug|Win32 + {42D445F6-0462-4870-87CD-01E964EA8B97}.Debug.Build.0 = Debug|Win32 + {42D445F6-0462-4870-87CD-01E964EA8B97}.Release.ActiveCfg = Release|Win32 + {42D445F6-0462-4870-87CD-01E964EA8B97}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc7/msvc7.vcproj kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc7/msvc7.vcproj --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc7/msvc7.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc7/msvc7.vcproj 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc8/angelscript.sln kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc8/angelscript.sln --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc8/angelscript.sln 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc8/angelscript.sln 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual C++ Express 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "angelscript", "angelscript.vcproj", "{39E6AF97-6BA3-4A72-8C61-BCEBF214EBFD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {39E6AF97-6BA3-4A72-8C61-BCEBF214EBFD}.Debug|Win32.ActiveCfg = Debug|Win32 + {39E6AF97-6BA3-4A72-8C61-BCEBF214EBFD}.Debug|Win32.Build.0 = Debug|Win32 + {39E6AF97-6BA3-4A72-8C61-BCEBF214EBFD}.Release|Win32.ActiveCfg = Release|Win32 + {39E6AF97-6BA3-4A72-8C61-BCEBF214EBFD}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc8/angelscript.vcproj kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc8/angelscript.vcproj --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc8/angelscript.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc8/angelscript.vcproj 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,429 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc9/angelscript.sln kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc9/angelscript.sln --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc9/angelscript.sln 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc9/angelscript.sln 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "angelscript", "angelscript.vcproj", "{39E6AF97-6BA3-4A72-8C61-BCEBF214EBFD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {39E6AF97-6BA3-4A72-8C61-BCEBF214EBFD}.Debug|Win32.ActiveCfg = Debug|Win32 + {39E6AF97-6BA3-4A72-8C61-BCEBF214EBFD}.Debug|Win32.Build.0 = Debug|Win32 + {39E6AF97-6BA3-4A72-8C61-BCEBF214EBFD}.Release|Win32.ActiveCfg = Release|Win32 + {39E6AF97-6BA3-4A72-8C61-BCEBF214EBFD}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc9/angelscript.vcproj kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc9/angelscript.vcproj --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc9/angelscript.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/msvc9/angelscript.vcproj 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,437 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/trolltechqt/angelscript.pro kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/trolltechqt/angelscript.pro --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/trolltechqt/angelscript.pro 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/trolltechqt/angelscript.pro 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,106 @@ +TEMPLATE = lib + +DEPENDPATH += ../../source ../../include +INCLUDEPATH += ../../include + +CONFIG -= debug debug_and_release release app_bundle qt dll + +CONFIG += staticlib release + +DEFINES += _CRT_SECURE_NO_WARNINGS + +DESTDIR = ../../lib + +win32: LIBS += -lwinmm + +HEADERS += ../../include/angelscript.h \ + ../../source/as_array.h \ + ../../source/as_arrayobject.h \ + ../../source/as_builder.h \ + ../../source/as_bytecode.h \ + ../../source/as_bytecodedef.h \ + ../../source/as_callfunc.h \ + ../../source/as_compiler.h \ + ../../source/as_config.h \ + ../../source/as_configgroup.h \ + ../../source/as_context.h \ + ../../source/as_datatype.h \ + ../../source/as_debug.h \ + ../../source/as_generic.h \ + ../../source/as_map.h \ + ../../source/as_memory.h \ + ../../source/as_module.h \ + ../../source/as_objecttype.h \ + ../../source/as_outputbuffer.h \ + ../../source/as_parser.h \ + ../../source/as_property.h \ + ../../source/as_restore.h \ + ../../source/as_scriptcode.h \ + ../../source/as_scriptengine.h \ + ../../source/as_scriptfunction.h \ + ../../source/as_scriptnode.h \ + ../../source/as_scriptobject.h \ + ../../source/as_string.h \ + ../../source/as_string_util.h \ + ../../source/as_texts.h \ + ../../source/as_thread.h \ + ../../source/as_tokendef.h \ + ../../source/as_tokenizer.h \ + ../../source/as_typeinfo.h \ + ../../source/as_variablescope.h + +SOURCES += ../../source/as_arrayobject.cpp \ + ../../source/as_atomic.cpp \ + ../../source/as_builder.cpp \ + ../../source/as_bytecode.cpp \ + ../../source/as_callfunc.cpp \ + ../../source/as_callfunc_mips.cpp \ + ../../source/as_callfunc_sh4.cpp \ + ../../source/as_callfunc_x86.cpp \ + ../../source/as_compiler.cpp \ + ../../source/as_configgroup.cpp \ + ../../source/as_context.cpp \ + ../../source/as_datatype.cpp \ + ../../source/as_gc.cpp \ + ../../source/as_generic.cpp \ + ../../source/as_globalproperty.cpp \ + ../../source/as_memory.cpp \ + ../../source/as_module.cpp \ + ../../source/as_objecttype.cpp \ + ../../source/as_outputbuffer.cpp \ + ../../source/as_parser.cpp \ + ../../source/as_restore.cpp \ + ../../source/as_scriptcode.cpp \ + ../../source/as_scriptengine.cpp \ + ../../source/as_scriptfunction.cpp \ + ../../source/as_scriptnode.cpp \ + ../../source/as_scriptobject.cpp \ + ../../source/as_string.cpp \ + ../../source/as_string_util.cpp \ + ../../source/as_thread.cpp \ + ../../source/as_tokenizer.cpp \ + ../../source/as_typeinfo.cpp \ + ../../source/as_variablescope.cpp + +HEADERS += ../../../add_on/scriptany/scriptany.h \ + ../../../add_on/scriptdictionary/scriptdictionary.h \ + ../../../add_on/scriptmath/scriptmath.h \ + ../../../add_on/scriptmath3d/scriptmath3d.h \ + ../../../add_on/scriptstring/scriptstring.h \ + ../../../add_on/scriptbuilder/scriptbuilder.h + +SOURCES += ../../../add_on/scriptany/scriptany.cpp \ + ../../../add_on/scriptdictionary/scriptdictionary.cpp \ + ../../../add_on/scriptmath/scriptmath.cpp \ + ../../../add_on/scriptmath3d/scriptmath3d.cpp \ + ../../../add_on/scriptstring/scriptstring.cpp \ + ../../../add_on/scriptstring/scriptstring_utils.cpp \ + ../../../add_on/scriptbuilder/scriptbuilder.cpp + +OBJECTS_DIR = tmp +MOC_DIR = tmp +UI_DIR = tmp +RCC_DIR = tmp + +# QMAKE_CXXFLAGS_RELEASE += /MP + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/xcode/angelscript.xcodeproj/project.pbxproj kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/xcode/angelscript.xcodeproj/project.pbxproj --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/xcode/angelscript.xcodeproj/project.pbxproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/projects/xcode/angelscript.xcodeproj/project.pbxproj 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,500 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 7518827E0EB93E5000190D34 /* as_atomic.h in Headers */ = {isa = PBXBuildFile; fileRef = 7518827C0EB93E5000190D34 /* as_atomic.h */; }; + 7518827F0EB93E5000190D34 /* as_gc.h in Headers */ = {isa = PBXBuildFile; fileRef = 7518827D0EB93E5000190D34 /* as_gc.h */; }; + 751882840EB93E8F00190D34 /* as_atomic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 751882800EB93E8F00190D34 /* as_atomic.cpp */; }; + 751882850EB93E8F00190D34 /* as_callfunc_x64_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 751882810EB93E8F00190D34 /* as_callfunc_x64_gcc.cpp */; }; + 751882860EB93E8F00190D34 /* as_callfunc_xenon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 751882820EB93E8F00190D34 /* as_callfunc_xenon.cpp */; }; + 751882870EB93E8F00190D34 /* as_gc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 751882830EB93E8F00190D34 /* as_gc.cpp */; }; + 7526F5C20BEE46B100BAE32D /* as_memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7526F5C00BEE46B100BAE32D /* as_memory.cpp */; }; + 7526F5C30BEE46B100BAE32D /* as_memory.h in Headers */ = {isa = PBXBuildFile; fileRef = 7526F5C10BEE46B100BAE32D /* as_memory.h */; }; + 75D1515C0C0FAFFC00EBF441 /* as_callfunc_ppc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358570A2DC0A1008FE303 /* as_callfunc_ppc.cpp */; }; + 75DA88200C1C30CF00A15034 /* as_callfunc_ppc_64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 75DA881F0C1C30CF00A15034 /* as_callfunc_ppc_64.cpp */; }; + 9B2358CF0A2DC68D008FE303 /* angelscript.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358910A2DC0B4008FE303 /* angelscript.h */; }; + 9B2358D10A2DC68D008FE303 /* as_array.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358060A2DC076008FE303 /* as_array.h */; }; + 9B2358D20A2DC68D008FE303 /* as_arrayobject.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358070A2DC076008FE303 /* as_arrayobject.h */; }; + 9B2358D30A2DC68D008FE303 /* as_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358080A2DC076008FE303 /* as_builder.h */; }; + 9B2358D40A2DC68D008FE303 /* as_bytecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358090A2DC076008FE303 /* as_bytecode.h */; }; + 9B2358D60A2DC68D008FE303 /* as_callfunc.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23580B0A2DC076008FE303 /* as_callfunc.h */; }; + 9B2358D70A2DC68D008FE303 /* as_compiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23580C0A2DC076008FE303 /* as_compiler.h */; }; + 9B2358D80A2DC68D008FE303 /* as_config.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23580D0A2DC076008FE303 /* as_config.h */; }; + 9B2358D90A2DC68D008FE303 /* as_configgroup.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23580E0A2DC076008FE303 /* as_configgroup.h */; }; + 9B2358DA0A2DC68D008FE303 /* as_context.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23580F0A2DC076008FE303 /* as_context.h */; }; + 9B2358DB0A2DC68D008FE303 /* as_datatype.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358100A2DC076008FE303 /* as_datatype.h */; }; + 9B2358DC0A2DC68D008FE303 /* as_debug.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358110A2DC076008FE303 /* as_debug.h */; }; + 9B2358DE0A2DC68D008FE303 /* as_generic.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358130A2DC076008FE303 /* as_generic.h */; }; + 9B2358DF0A2DC68D008FE303 /* as_map.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358140A2DC076008FE303 /* as_map.h */; }; + 9B2358E00A2DC68D008FE303 /* as_module.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358150A2DC076008FE303 /* as_module.h */; }; + 9B2358E10A2DC68D008FE303 /* as_objecttype.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358160A2DC076008FE303 /* as_objecttype.h */; }; + 9B2358E20A2DC68D008FE303 /* as_outputbuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358170A2DC076008FE303 /* as_outputbuffer.h */; }; + 9B2358E30A2DC68D008FE303 /* as_parser.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358180A2DC076008FE303 /* as_parser.h */; }; + 9B2358E40A2DC68D008FE303 /* as_property.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358190A2DC076008FE303 /* as_property.h */; }; + 9B2358E50A2DC68D008FE303 /* as_restore.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23581A0A2DC076008FE303 /* as_restore.h */; }; + 9B2358E60A2DC68D008FE303 /* as_scriptcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23581B0A2DC076008FE303 /* as_scriptcode.h */; }; + 9B2358E70A2DC68D008FE303 /* as_scriptengine.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23581C0A2DC076008FE303 /* as_scriptengine.h */; }; + 9B2358E80A2DC68D008FE303 /* as_scriptfunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23581D0A2DC076008FE303 /* as_scriptfunction.h */; }; + 9B2358E90A2DC68D008FE303 /* as_scriptnode.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23581E0A2DC076008FE303 /* as_scriptnode.h */; }; + 9B2358EA0A2DC68D008FE303 /* as_scriptobject.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B23581F0A2DC076008FE303 /* as_scriptobject.h */; }; + 9B2358EB0A2DC68D008FE303 /* as_string_util.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358200A2DC076008FE303 /* as_string_util.h */; }; + 9B2358EC0A2DC68D008FE303 /* as_string.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358210A2DC076008FE303 /* as_string.h */; }; + 9B2358ED0A2DC68D008FE303 /* as_texts.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358220A2DC076008FE303 /* as_texts.h */; }; + 9B2358EE0A2DC68D008FE303 /* as_thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358230A2DC076008FE303 /* as_thread.h */; }; + 9B2358EF0A2DC68D008FE303 /* as_tokendef.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358240A2DC076008FE303 /* as_tokendef.h */; }; + 9B2358F00A2DC68D008FE303 /* as_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358250A2DC076008FE303 /* as_tokenizer.h */; }; + 9B2358F10A2DC68D008FE303 /* as_typeinfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358260A2DC076008FE303 /* as_typeinfo.h */; }; + 9B2358F20A2DC68D008FE303 /* as_variablescope.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B2358270A2DC076008FE303 /* as_variablescope.h */; }; + 9B2358F60A2DC696008FE303 /* as_arrayobject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358520A2DC0A1008FE303 /* as_arrayobject.cpp */; }; + 9B2358F70A2DC696008FE303 /* as_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358530A2DC0A1008FE303 /* as_builder.cpp */; }; + 9B2358F80A2DC696008FE303 /* as_bytecode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358540A2DC0A1008FE303 /* as_bytecode.cpp */; }; + 9B2358FA0A2DC696008FE303 /* as_callfunc_mips.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358560A2DC0A1008FE303 /* as_callfunc_mips.cpp */; }; + 9B2358FC0A2DC696008FE303 /* as_callfunc_sh4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358580A2DC0A1008FE303 /* as_callfunc_sh4.cpp */; }; + 9B2358FD0A2DC696008FE303 /* as_callfunc_x86.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358590A2DC0A1008FE303 /* as_callfunc_x86.cpp */; }; + 9B2358FE0A2DC696008FE303 /* as_callfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23585A0A2DC0A1008FE303 /* as_callfunc.cpp */; }; + 9B2358FF0A2DC696008FE303 /* as_compiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23585B0A2DC0A1008FE303 /* as_compiler.cpp */; }; + 9B2359000A2DC696008FE303 /* as_configgroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23585C0A2DC0A1008FE303 /* as_configgroup.cpp */; }; + 9B2359010A2DC696008FE303 /* as_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23585D0A2DC0A1008FE303 /* as_context.cpp */; }; + 9B2359020A2DC696008FE303 /* as_datatype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23585E0A2DC0A1008FE303 /* as_datatype.cpp */; }; + 9B2359040A2DC696008FE303 /* as_generic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358600A2DC0A1008FE303 /* as_generic.cpp */; }; + 9B2359050A2DC696008FE303 /* as_module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358610A2DC0A1008FE303 /* as_module.cpp */; }; + 9B2359060A2DC696008FE303 /* as_objecttype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358620A2DC0A1008FE303 /* as_objecttype.cpp */; }; + 9B2359070A2DC696008FE303 /* as_outputbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358630A2DC0A1008FE303 /* as_outputbuffer.cpp */; }; + 9B2359080A2DC696008FE303 /* as_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358640A2DC0A1008FE303 /* as_parser.cpp */; }; + 9B2359090A2DC696008FE303 /* as_restore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358650A2DC0A1008FE303 /* as_restore.cpp */; }; + 9B23590A0A2DC696008FE303 /* as_scriptcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358660A2DC0A1008FE303 /* as_scriptcode.cpp */; }; + 9B23590B0A2DC696008FE303 /* as_scriptengine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358670A2DC0A1008FE303 /* as_scriptengine.cpp */; }; + 9B23590C0A2DC696008FE303 /* as_scriptfunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358680A2DC0A1008FE303 /* as_scriptfunction.cpp */; }; + 9B23590D0A2DC696008FE303 /* as_scriptnode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358690A2DC0A1008FE303 /* as_scriptnode.cpp */; }; + 9B23590E0A2DC696008FE303 /* as_scriptobject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23586A0A2DC0A1008FE303 /* as_scriptobject.cpp */; }; + 9B23590F0A2DC696008FE303 /* as_variablescope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2358700A2DC0A1008FE303 /* as_variablescope.cpp */; }; + 9B2359100A2DC696008FE303 /* as_string_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23586B0A2DC0A1008FE303 /* as_string_util.cpp */; }; + 9B2359110A2DC696008FE303 /* as_string.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23586C0A2DC0A1008FE303 /* as_string.cpp */; }; + 9B2359120A2DC696008FE303 /* as_thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23586D0A2DC0A1008FE303 /* as_thread.cpp */; }; + 9B2359130A2DC696008FE303 /* as_tokenizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23586E0A2DC0A1008FE303 /* as_tokenizer.cpp */; }; + 9B2359140A2DC696008FE303 /* as_typeinfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B23586F0A2DC0A1008FE303 /* as_typeinfo.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 7518827C0EB93E5000190D34 /* as_atomic.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = as_atomic.h; sourceTree = ""; }; + 7518827D0EB93E5000190D34 /* as_gc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = as_gc.h; sourceTree = ""; }; + 751882800EB93E8F00190D34 /* as_atomic.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = as_atomic.cpp; path = ../../source/as_atomic.cpp; sourceTree = SOURCE_ROOT; }; + 751882810EB93E8F00190D34 /* as_callfunc_x64_gcc.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = as_callfunc_x64_gcc.cpp; path = ../../source/as_callfunc_x64_gcc.cpp; sourceTree = SOURCE_ROOT; }; + 751882820EB93E8F00190D34 /* as_callfunc_xenon.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = as_callfunc_xenon.cpp; path = ../../source/as_callfunc_xenon.cpp; sourceTree = SOURCE_ROOT; }; + 751882830EB93E8F00190D34 /* as_gc.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = as_gc.cpp; path = ../../source/as_gc.cpp; sourceTree = SOURCE_ROOT; }; + 7526F5C00BEE46B100BAE32D /* as_memory.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = as_memory.cpp; path = ../../source/as_memory.cpp; sourceTree = SOURCE_ROOT; }; + 7526F5C10BEE46B100BAE32D /* as_memory.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = as_memory.h; sourceTree = ""; }; + 75DA881F0C1C30CF00A15034 /* as_callfunc_ppc_64.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = as_callfunc_ppc_64.cpp; path = ../../source/as_callfunc_ppc_64.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358060A2DC076008FE303 /* as_array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_array.h; path = ../../source/as_array.h; sourceTree = SOURCE_ROOT; }; + 9B2358070A2DC076008FE303 /* as_arrayobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_arrayobject.h; path = ../../source/as_arrayobject.h; sourceTree = SOURCE_ROOT; }; + 9B2358080A2DC076008FE303 /* as_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_builder.h; path = ../../source/as_builder.h; sourceTree = SOURCE_ROOT; }; + 9B2358090A2DC076008FE303 /* as_bytecode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_bytecode.h; path = ../../source/as_bytecode.h; sourceTree = SOURCE_ROOT; }; + 9B23580B0A2DC076008FE303 /* as_callfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_callfunc.h; path = ../../source/as_callfunc.h; sourceTree = SOURCE_ROOT; }; + 9B23580C0A2DC076008FE303 /* as_compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_compiler.h; path = ../../source/as_compiler.h; sourceTree = SOURCE_ROOT; }; + 9B23580D0A2DC076008FE303 /* as_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_config.h; path = ../../source/as_config.h; sourceTree = SOURCE_ROOT; }; + 9B23580E0A2DC076008FE303 /* as_configgroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_configgroup.h; path = ../../source/as_configgroup.h; sourceTree = SOURCE_ROOT; }; + 9B23580F0A2DC076008FE303 /* as_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_context.h; path = ../../source/as_context.h; sourceTree = SOURCE_ROOT; }; + 9B2358100A2DC076008FE303 /* as_datatype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_datatype.h; path = ../../source/as_datatype.h; sourceTree = SOURCE_ROOT; }; + 9B2358110A2DC076008FE303 /* as_debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_debug.h; path = ../../source/as_debug.h; sourceTree = SOURCE_ROOT; }; + 9B2358130A2DC076008FE303 /* as_generic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_generic.h; path = ../../source/as_generic.h; sourceTree = SOURCE_ROOT; }; + 9B2358140A2DC076008FE303 /* as_map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_map.h; path = ../../source/as_map.h; sourceTree = SOURCE_ROOT; }; + 9B2358150A2DC076008FE303 /* as_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_module.h; path = ../../source/as_module.h; sourceTree = SOURCE_ROOT; }; + 9B2358160A2DC076008FE303 /* as_objecttype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_objecttype.h; path = ../../source/as_objecttype.h; sourceTree = SOURCE_ROOT; }; + 9B2358170A2DC076008FE303 /* as_outputbuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_outputbuffer.h; path = ../../source/as_outputbuffer.h; sourceTree = SOURCE_ROOT; }; + 9B2358180A2DC076008FE303 /* as_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_parser.h; path = ../../source/as_parser.h; sourceTree = SOURCE_ROOT; }; + 9B2358190A2DC076008FE303 /* as_property.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_property.h; path = ../../source/as_property.h; sourceTree = SOURCE_ROOT; }; + 9B23581A0A2DC076008FE303 /* as_restore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_restore.h; path = ../../source/as_restore.h; sourceTree = SOURCE_ROOT; }; + 9B23581B0A2DC076008FE303 /* as_scriptcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_scriptcode.h; path = ../../source/as_scriptcode.h; sourceTree = SOURCE_ROOT; }; + 9B23581C0A2DC076008FE303 /* as_scriptengine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_scriptengine.h; path = ../../source/as_scriptengine.h; sourceTree = SOURCE_ROOT; }; + 9B23581D0A2DC076008FE303 /* as_scriptfunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_scriptfunction.h; path = ../../source/as_scriptfunction.h; sourceTree = SOURCE_ROOT; }; + 9B23581E0A2DC076008FE303 /* as_scriptnode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_scriptnode.h; path = ../../source/as_scriptnode.h; sourceTree = SOURCE_ROOT; }; + 9B23581F0A2DC076008FE303 /* as_scriptobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_scriptobject.h; path = ../../source/as_scriptobject.h; sourceTree = SOURCE_ROOT; }; + 9B2358200A2DC076008FE303 /* as_string_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_string_util.h; path = ../../source/as_string_util.h; sourceTree = SOURCE_ROOT; }; + 9B2358210A2DC076008FE303 /* as_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_string.h; path = ../../source/as_string.h; sourceTree = SOURCE_ROOT; }; + 9B2358220A2DC076008FE303 /* as_texts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_texts.h; path = ../../source/as_texts.h; sourceTree = SOURCE_ROOT; }; + 9B2358230A2DC076008FE303 /* as_thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_thread.h; path = ../../source/as_thread.h; sourceTree = SOURCE_ROOT; }; + 9B2358240A2DC076008FE303 /* as_tokendef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_tokendef.h; path = ../../source/as_tokendef.h; sourceTree = SOURCE_ROOT; }; + 9B2358250A2DC076008FE303 /* as_tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_tokenizer.h; path = ../../source/as_tokenizer.h; sourceTree = SOURCE_ROOT; }; + 9B2358260A2DC076008FE303 /* as_typeinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_typeinfo.h; path = ../../source/as_typeinfo.h; sourceTree = SOURCE_ROOT; }; + 9B2358270A2DC076008FE303 /* as_variablescope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = as_variablescope.h; path = ../../source/as_variablescope.h; sourceTree = SOURCE_ROOT; }; + 9B2358520A2DC0A1008FE303 /* as_arrayobject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_arrayobject.cpp; path = ../../source/as_arrayobject.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358530A2DC0A1008FE303 /* as_builder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_builder.cpp; path = ../../source/as_builder.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358540A2DC0A1008FE303 /* as_bytecode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_bytecode.cpp; path = ../../source/as_bytecode.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358560A2DC0A1008FE303 /* as_callfunc_mips.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_callfunc_mips.cpp; path = ../../source/as_callfunc_mips.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358570A2DC0A1008FE303 /* as_callfunc_ppc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_callfunc_ppc.cpp; path = ../../source/as_callfunc_ppc.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358580A2DC0A1008FE303 /* as_callfunc_sh4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_callfunc_sh4.cpp; path = ../../source/as_callfunc_sh4.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358590A2DC0A1008FE303 /* as_callfunc_x86.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_callfunc_x86.cpp; path = ../../source/as_callfunc_x86.cpp; sourceTree = SOURCE_ROOT; }; + 9B23585A0A2DC0A1008FE303 /* as_callfunc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_callfunc.cpp; path = ../../source/as_callfunc.cpp; sourceTree = SOURCE_ROOT; }; + 9B23585B0A2DC0A1008FE303 /* as_compiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_compiler.cpp; path = ../../source/as_compiler.cpp; sourceTree = SOURCE_ROOT; }; + 9B23585C0A2DC0A1008FE303 /* as_configgroup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_configgroup.cpp; path = ../../source/as_configgroup.cpp; sourceTree = SOURCE_ROOT; }; + 9B23585D0A2DC0A1008FE303 /* as_context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_context.cpp; path = ../../source/as_context.cpp; sourceTree = SOURCE_ROOT; }; + 9B23585E0A2DC0A1008FE303 /* as_datatype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_datatype.cpp; path = ../../source/as_datatype.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358600A2DC0A1008FE303 /* as_generic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_generic.cpp; path = ../../source/as_generic.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358610A2DC0A1008FE303 /* as_module.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_module.cpp; path = ../../source/as_module.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358620A2DC0A1008FE303 /* as_objecttype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_objecttype.cpp; path = ../../source/as_objecttype.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358630A2DC0A1008FE303 /* as_outputbuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_outputbuffer.cpp; path = ../../source/as_outputbuffer.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358640A2DC0A1008FE303 /* as_parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_parser.cpp; path = ../../source/as_parser.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358650A2DC0A1008FE303 /* as_restore.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_restore.cpp; path = ../../source/as_restore.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358660A2DC0A1008FE303 /* as_scriptcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_scriptcode.cpp; path = ../../source/as_scriptcode.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358670A2DC0A1008FE303 /* as_scriptengine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_scriptengine.cpp; path = ../../source/as_scriptengine.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358680A2DC0A1008FE303 /* as_scriptfunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_scriptfunction.cpp; path = ../../source/as_scriptfunction.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358690A2DC0A1008FE303 /* as_scriptnode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_scriptnode.cpp; path = ../../source/as_scriptnode.cpp; sourceTree = SOURCE_ROOT; }; + 9B23586A0A2DC0A1008FE303 /* as_scriptobject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_scriptobject.cpp; path = ../../source/as_scriptobject.cpp; sourceTree = SOURCE_ROOT; }; + 9B23586B0A2DC0A1008FE303 /* as_string_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_string_util.cpp; path = ../../source/as_string_util.cpp; sourceTree = SOURCE_ROOT; }; + 9B23586C0A2DC0A1008FE303 /* as_string.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_string.cpp; path = ../../source/as_string.cpp; sourceTree = SOURCE_ROOT; }; + 9B23586D0A2DC0A1008FE303 /* as_thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_thread.cpp; path = ../../source/as_thread.cpp; sourceTree = SOURCE_ROOT; }; + 9B23586E0A2DC0A1008FE303 /* as_tokenizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_tokenizer.cpp; path = ../../source/as_tokenizer.cpp; sourceTree = SOURCE_ROOT; }; + 9B23586F0A2DC0A1008FE303 /* as_typeinfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_typeinfo.cpp; path = ../../source/as_typeinfo.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358700A2DC0A1008FE303 /* as_variablescope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = as_variablescope.cpp; path = ../../source/as_variablescope.cpp; sourceTree = SOURCE_ROOT; }; + 9B2358910A2DC0B4008FE303 /* angelscript.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = angelscript.h; path = ../../include/angelscript.h; sourceTree = SOURCE_ROOT; }; + 9B2358C50A2DC63E008FE303 /* libas.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libas.a; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 9B2358C30A2DC63E008FE303 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DDFF38A45A11DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 9B2358C50A2DC63E008FE303 /* libas.a */, + ); + name = Products; + sourceTree = ""; + }; + 0867D691FE84028FC02AAC07 /* angelscript */ = { + isa = PBXGroup; + children = ( + 08FB77ACFE841707C02AAC07 /* Source */, + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, + 034768DDFF38A45A11DB9C8B /* Products */, + ); + name = angelscript; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 08FB77ACFE841707C02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 751882800EB93E8F00190D34 /* as_atomic.cpp */, + 751882810EB93E8F00190D34 /* as_callfunc_x64_gcc.cpp */, + 751882820EB93E8F00190D34 /* as_callfunc_xenon.cpp */, + 751882830EB93E8F00190D34 /* as_gc.cpp */, + 9B5AC0F10A2C6F990089909E /* include */, + 7526F5C00BEE46B100BAE32D /* as_memory.cpp */, + 9B2358520A2DC0A1008FE303 /* as_arrayobject.cpp */, + 9B2358530A2DC0A1008FE303 /* as_builder.cpp */, + 9B2358540A2DC0A1008FE303 /* as_bytecode.cpp */, + 9B2358560A2DC0A1008FE303 /* as_callfunc_mips.cpp */, + 9B2358570A2DC0A1008FE303 /* as_callfunc_ppc.cpp */, + 75DA881F0C1C30CF00A15034 /* as_callfunc_ppc_64.cpp */, + 9B2358580A2DC0A1008FE303 /* as_callfunc_sh4.cpp */, + 9B2358590A2DC0A1008FE303 /* as_callfunc_x86.cpp */, + 9B23585A0A2DC0A1008FE303 /* as_callfunc.cpp */, + 9B23585B0A2DC0A1008FE303 /* as_compiler.cpp */, + 9B23585C0A2DC0A1008FE303 /* as_configgroup.cpp */, + 9B23585D0A2DC0A1008FE303 /* as_context.cpp */, + 9B23585E0A2DC0A1008FE303 /* as_datatype.cpp */, + 9B2358600A2DC0A1008FE303 /* as_generic.cpp */, + 9B2358610A2DC0A1008FE303 /* as_module.cpp */, + 9B2358620A2DC0A1008FE303 /* as_objecttype.cpp */, + 9B2358630A2DC0A1008FE303 /* as_outputbuffer.cpp */, + 9B2358640A2DC0A1008FE303 /* as_parser.cpp */, + 9B2358650A2DC0A1008FE303 /* as_restore.cpp */, + 9B2358660A2DC0A1008FE303 /* as_scriptcode.cpp */, + 9B2358670A2DC0A1008FE303 /* as_scriptengine.cpp */, + 9B2358680A2DC0A1008FE303 /* as_scriptfunction.cpp */, + 9B2358690A2DC0A1008FE303 /* as_scriptnode.cpp */, + 9B23586A0A2DC0A1008FE303 /* as_scriptobject.cpp */, + 9B2358700A2DC0A1008FE303 /* as_variablescope.cpp */, + 9B23586B0A2DC0A1008FE303 /* as_string_util.cpp */, + 9B23586C0A2DC0A1008FE303 /* as_string.cpp */, + 9B23586D0A2DC0A1008FE303 /* as_thread.cpp */, + 9B23586E0A2DC0A1008FE303 /* as_tokenizer.cpp */, + 9B23586F0A2DC0A1008FE303 /* as_typeinfo.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 9B5AC0F10A2C6F990089909E /* include */ = { + isa = PBXGroup; + children = ( + 7518827C0EB93E5000190D34 /* as_atomic.h */, + 7518827D0EB93E5000190D34 /* as_gc.h */, + 7526F5C10BEE46B100BAE32D /* as_memory.h */, + 9B2358910A2DC0B4008FE303 /* angelscript.h */, + 9B2358060A2DC076008FE303 /* as_array.h */, + 9B2358070A2DC076008FE303 /* as_arrayobject.h */, + 9B2358080A2DC076008FE303 /* as_builder.h */, + 9B2358090A2DC076008FE303 /* as_bytecode.h */, + 9B23580B0A2DC076008FE303 /* as_callfunc.h */, + 9B23580C0A2DC076008FE303 /* as_compiler.h */, + 9B23580D0A2DC076008FE303 /* as_config.h */, + 9B23580E0A2DC076008FE303 /* as_configgroup.h */, + 9B23580F0A2DC076008FE303 /* as_context.h */, + 9B2358100A2DC076008FE303 /* as_datatype.h */, + 9B2358110A2DC076008FE303 /* as_debug.h */, + 9B2358130A2DC076008FE303 /* as_generic.h */, + 9B2358140A2DC076008FE303 /* as_map.h */, + 9B2358150A2DC076008FE303 /* as_module.h */, + 9B2358160A2DC076008FE303 /* as_objecttype.h */, + 9B2358170A2DC076008FE303 /* as_outputbuffer.h */, + 9B2358180A2DC076008FE303 /* as_parser.h */, + 9B2358190A2DC076008FE303 /* as_property.h */, + 9B23581A0A2DC076008FE303 /* as_restore.h */, + 9B23581B0A2DC076008FE303 /* as_scriptcode.h */, + 9B23581C0A2DC076008FE303 /* as_scriptengine.h */, + 9B23581D0A2DC076008FE303 /* as_scriptfunction.h */, + 9B23581E0A2DC076008FE303 /* as_scriptnode.h */, + 9B23581F0A2DC076008FE303 /* as_scriptobject.h */, + 9B2358200A2DC076008FE303 /* as_string_util.h */, + 9B2358210A2DC076008FE303 /* as_string.h */, + 9B2358220A2DC076008FE303 /* as_texts.h */, + 9B2358230A2DC076008FE303 /* as_thread.h */, + 9B2358240A2DC076008FE303 /* as_tokendef.h */, + 9B2358250A2DC076008FE303 /* as_tokenizer.h */, + 9B2358260A2DC076008FE303 /* as_typeinfo.h */, + 9B2358270A2DC076008FE303 /* as_variablescope.h */, + ); + name = include; + path = ../../source; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 9B2358C10A2DC63E008FE303 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9B2358CF0A2DC68D008FE303 /* angelscript.h in Headers */, + 9B2358D10A2DC68D008FE303 /* as_array.h in Headers */, + 9B2358D20A2DC68D008FE303 /* as_arrayobject.h in Headers */, + 9B2358D30A2DC68D008FE303 /* as_builder.h in Headers */, + 9B2358D40A2DC68D008FE303 /* as_bytecode.h in Headers */, + 9B2358D60A2DC68D008FE303 /* as_callfunc.h in Headers */, + 9B2358D70A2DC68D008FE303 /* as_compiler.h in Headers */, + 9B2358D80A2DC68D008FE303 /* as_config.h in Headers */, + 9B2358D90A2DC68D008FE303 /* as_configgroup.h in Headers */, + 9B2358DA0A2DC68D008FE303 /* as_context.h in Headers */, + 9B2358DB0A2DC68D008FE303 /* as_datatype.h in Headers */, + 9B2358DC0A2DC68D008FE303 /* as_debug.h in Headers */, + 9B2358DE0A2DC68D008FE303 /* as_generic.h in Headers */, + 9B2358DF0A2DC68D008FE303 /* as_map.h in Headers */, + 9B2358E00A2DC68D008FE303 /* as_module.h in Headers */, + 9B2358E10A2DC68D008FE303 /* as_objecttype.h in Headers */, + 9B2358E20A2DC68D008FE303 /* as_outputbuffer.h in Headers */, + 9B2358E30A2DC68D008FE303 /* as_parser.h in Headers */, + 9B2358E40A2DC68D008FE303 /* as_property.h in Headers */, + 9B2358E50A2DC68D008FE303 /* as_restore.h in Headers */, + 9B2358E60A2DC68D008FE303 /* as_scriptcode.h in Headers */, + 9B2358E70A2DC68D008FE303 /* as_scriptengine.h in Headers */, + 9B2358E80A2DC68D008FE303 /* as_scriptfunction.h in Headers */, + 9B2358E90A2DC68D008FE303 /* as_scriptnode.h in Headers */, + 9B2358EA0A2DC68D008FE303 /* as_scriptobject.h in Headers */, + 9B2358EB0A2DC68D008FE303 /* as_string_util.h in Headers */, + 9B2358EC0A2DC68D008FE303 /* as_string.h in Headers */, + 9B2358ED0A2DC68D008FE303 /* as_texts.h in Headers */, + 9B2358EE0A2DC68D008FE303 /* as_thread.h in Headers */, + 9B2358EF0A2DC68D008FE303 /* as_tokendef.h in Headers */, + 9B2358F00A2DC68D008FE303 /* as_tokenizer.h in Headers */, + 9B2358F10A2DC68D008FE303 /* as_typeinfo.h in Headers */, + 9B2358F20A2DC68D008FE303 /* as_variablescope.h in Headers */, + 7526F5C30BEE46B100BAE32D /* as_memory.h in Headers */, + 7518827E0EB93E5000190D34 /* as_atomic.h in Headers */, + 7518827F0EB93E5000190D34 /* as_gc.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 9B2358C40A2DC63E008FE303 /* as */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9B2358C60A2DC661008FE303 /* Build configuration list for PBXNativeTarget "as" */; + buildPhases = ( + 9B2358C10A2DC63E008FE303 /* Headers */, + 9B2358C20A2DC63E008FE303 /* Sources */, + 9B2358C30A2DC63E008FE303 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = as; + productName = as; + productReference = 9B2358C50A2DC63E008FE303 /* libas.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "angelscript" */; + hasScannedForEncodings = 1; + mainGroup = 0867D691FE84028FC02AAC07 /* angelscript */; + productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; + projectDirPath = ""; + targets = ( + 9B2358C40A2DC63E008FE303 /* as */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 9B2358C20A2DC63E008FE303 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9B2358F60A2DC696008FE303 /* as_arrayobject.cpp in Sources */, + 9B2358F70A2DC696008FE303 /* as_builder.cpp in Sources */, + 9B2358F80A2DC696008FE303 /* as_bytecode.cpp in Sources */, + 9B2358FA0A2DC696008FE303 /* as_callfunc_mips.cpp in Sources */, + 9B2358FC0A2DC696008FE303 /* as_callfunc_sh4.cpp in Sources */, + 9B2358FD0A2DC696008FE303 /* as_callfunc_x86.cpp in Sources */, + 9B2358FE0A2DC696008FE303 /* as_callfunc.cpp in Sources */, + 9B2358FF0A2DC696008FE303 /* as_compiler.cpp in Sources */, + 9B2359000A2DC696008FE303 /* as_configgroup.cpp in Sources */, + 9B2359010A2DC696008FE303 /* as_context.cpp in Sources */, + 9B2359020A2DC696008FE303 /* as_datatype.cpp in Sources */, + 9B2359040A2DC696008FE303 /* as_generic.cpp in Sources */, + 9B2359050A2DC696008FE303 /* as_module.cpp in Sources */, + 9B2359060A2DC696008FE303 /* as_objecttype.cpp in Sources */, + 9B2359070A2DC696008FE303 /* as_outputbuffer.cpp in Sources */, + 9B2359080A2DC696008FE303 /* as_parser.cpp in Sources */, + 9B2359090A2DC696008FE303 /* as_restore.cpp in Sources */, + 9B23590A0A2DC696008FE303 /* as_scriptcode.cpp in Sources */, + 9B23590B0A2DC696008FE303 /* as_scriptengine.cpp in Sources */, + 9B23590C0A2DC696008FE303 /* as_scriptfunction.cpp in Sources */, + 9B23590D0A2DC696008FE303 /* as_scriptnode.cpp in Sources */, + 9B23590E0A2DC696008FE303 /* as_scriptobject.cpp in Sources */, + 9B23590F0A2DC696008FE303 /* as_variablescope.cpp in Sources */, + 9B2359100A2DC696008FE303 /* as_string_util.cpp in Sources */, + 9B2359110A2DC696008FE303 /* as_string.cpp in Sources */, + 9B2359120A2DC696008FE303 /* as_thread.cpp in Sources */, + 9B2359130A2DC696008FE303 /* as_tokenizer.cpp in Sources */, + 9B2359140A2DC696008FE303 /* as_typeinfo.cpp in Sources */, + 7526F5C20BEE46B100BAE32D /* as_memory.cpp in Sources */, + 75D1515C0C0FAFFC00EBF441 /* as_callfunc_ppc.cpp in Sources */, + 75DA88200C1C30CF00A15034 /* as_callfunc_ppc_64.cpp in Sources */, + 751882840EB93E8F00190D34 /* as_atomic.cpp in Sources */, + 751882850EB93E8F00190D34 /* as_callfunc_x64_gcc.cpp in Sources */, + 751882860EB93E8F00190D34 /* as_callfunc_xenon.cpp in Sources */, + 751882870EB93E8F00190D34 /* as_gc.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 4FADC24708B4156D00ABE55E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + GCC_DEBUGGING_SYMBOLS = full; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = YES; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + USER_HEADER_SEARCH_PATHS = /usr/include/; + }; + name = Debug; + }; + 4FADC24808B4156D00ABE55E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = YES; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + USER_HEADER_SEARCH_PATHS = /usr/include/; + }; + name = Release; + }; + 9B2358C70A2DC661008FE303 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + INSTALL_PATH = /usr/local/lib; + PREBINDING = YES; + PRODUCT_NAME = as; + SYMROOT = ../../lib/build; + ZERO_LINK = YES; + }; + name = Debug; + }; + 9B2358C80A2DC661008FE303 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$BUILD_DIR/$(CONFIGURATION)"; + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = as; + ZERO_LINK = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "angelscript" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FADC24708B4156D00ABE55E /* Debug */, + 4FADC24808B4156D00ABE55E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 9B2358C60A2DC661008FE303 /* Build configuration list for PBXNativeTarget "as" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9B2358C70A2DC661008FE303 /* Debug */, + 9B2358C80A2DC661008FE303 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_array.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_array.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_array.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_array.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,365 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + +#ifndef AS_ARRAY_H +#define AS_ARRAY_H + +#if !defined(AS_NO_MEMORY_H) +#include +#endif +#include // some compilers declare memcpy() here + +#ifdef _MSC_VER +#pragma warning(disable:4345) // warning about a change in how the code is handled in this version +#endif + +BEGIN_AS_NAMESPACE + +template class asCArray +{ +public: + asCArray(); + asCArray(const asCArray &); + asCArray(int reserve); + ~asCArray(); + + void Allocate(size_t numElements, bool keepData); + size_t GetCapacity() const; + + void PushLast(const T &element); + T PopLast(); + + void SetLength(size_t numElements); + size_t GetLength() const; + + void Copy(const T*, size_t count); + asCArray &operator =(const asCArray &); + + const T &operator [](size_t index) const; + T &operator [](size_t index); + T *AddressOf(); + + void Concatenate(const asCArray &); + void Concatenate(T*, unsigned int count); + + bool Exists(const T &element); + int IndexOf(const T &element); + void RemoveIndex(size_t index); // Removes the entry without reordering the array + void RemoveValue(const T &element); + + bool operator==(const asCArray &) const; + bool operator!=(const asCArray &) const; + +protected: + T *array; + size_t length; + size_t maxLength; + char buf[8]; +}; + +// Implementation + +template +T *asCArray::AddressOf() +{ + return array; +} + +template +asCArray::asCArray(void) +{ + array = 0; + length = 0; + maxLength = 0; +} + +template +asCArray::asCArray(const asCArray ©) +{ + array = 0; + length = 0; + maxLength = 0; + + *this = copy; +} + +template +asCArray::asCArray(int reserve) +{ + array = 0; + length = 0; + maxLength = 0; + + Allocate(reserve, false); +} + +template +asCArray::~asCArray(void) +{ + // Allocating a zero length array will free all memory + Allocate(0,0); +} + +template +size_t asCArray::GetLength() const +{ + return length; +} + +template +const T &asCArray::operator [](size_t index) const +{ + asASSERT(index < length); + + return array[index]; +} + +template +T &asCArray::operator [](size_t index) +{ + asASSERT(index < length); + + return array[index]; +} + +template +void asCArray::PushLast(const T &element) +{ + if( length == maxLength ) + { + if( maxLength == 0 ) + Allocate(1, false); + else + Allocate(2*maxLength, true); + } + + array[length++] = element; +} + +template +T asCArray::PopLast() +{ + asASSERT(length > 0); + + return array[--length]; +} + +template +void asCArray::Allocate(size_t numElements, bool keepData) +{ + // We have 4 situations + // 1. The previous array is 8 bytes or smaller and the new array is also 8 bytes or smaller + // 2. The previous array is 8 bytes or smaller and the new array is larger than 8 bytes + // 3. The previous array is larger than 8 bytes and the new array is 8 bytes or smaller + // 4. The previous array is larger than 8 bytes and the new array is also larger than 8 bytes + + T *tmp = 0; + if( numElements ) + { + if( sizeof(T)*numElements <= 8 ) + // Use the internal buffer + tmp = (T*)buf; + else + // Allocate the array and construct each of the elements + tmp = asNEWARRAY(T,numElements); + + if( array == tmp ) + { + // Construct only the newly allocated elements + for( size_t n = length; n < numElements; n++ ) + new (&tmp[n]) T(); + } + else + { + // Construct all elements + for( size_t n = 0; n < numElements; n++ ) + new (&tmp[n]) T(); + } + } + + if( array ) + { + size_t oldLength = length; + + if( array == tmp ) + { + if( keepData ) + { + if( length > numElements ) + length = numElements; + } + else + length = 0; + + // Call the destructor for elements that are no longer used + for( size_t n = length; n < oldLength; n++ ) + array[n].~T(); + } + else + { + if( keepData ) + { + if( length > numElements ) + length = numElements; + + for( size_t n = 0; n < length; n++ ) + tmp[n] = array[n]; + } + else + length = 0; + + // Call the destructor for all elements + for( size_t n = 0; n < oldLength; n++ ) + array[n].~T(); + + if( array != (T*)buf ) + asDELETEARRAY(array); + } + } + + array = tmp; + maxLength = numElements; +} + +template +size_t asCArray::GetCapacity() const +{ + return maxLength; +} + +template +void asCArray::SetLength(size_t numElements) +{ + if( numElements > maxLength ) + Allocate(numElements, true); + + length = numElements; +} + +template +void asCArray::Copy(const T *data, size_t count) +{ + if( maxLength < count ) + Allocate(count, false); + + for( size_t n = 0; n < count; n++ ) + array[n] = data[n]; + + length = count; +} + +template +asCArray &asCArray::operator =(const asCArray ©) +{ + Copy(copy.array, copy.length); + + return *this; +} + +template +bool asCArray::operator ==(const asCArray &other) const +{ + if( length != other.length ) return false; + + for( asUINT n = 0; n < length; n++ ) + if( array[n] != other.array[n] ) + return false; + + return true; +} + +template +bool asCArray::operator !=(const asCArray &other) const +{ + return !(*this == other); +} + +template +void asCArray::Concatenate(const asCArray &other) +{ + if( maxLength < length + other.length ) + Allocate(length + other.length, true); + + for( size_t n = 0; n < other.length; n++ ) + array[length+n] = other.array[n]; + + length += other.length; +} + +template +void asCArray::Concatenate(T* array, unsigned int count) +{ + for( unsigned int c = 0; c < count; c++ ) + PushLast(array[c]); +} + +template +bool asCArray::Exists(const T &e) +{ + return IndexOf(e) == -1 ? false : true; +} + +template +int asCArray::IndexOf(const T &e) +{ + for( size_t n = 0; n < length; n++ ) + if( array[n] == e ) return (int)n; + + return -1; +} + +template +void asCArray::RemoveIndex(size_t index) +{ + if( index < length ) + { + for( size_t n = index; n < length-1; n++ ) + array[n] = array[n+1]; + + PopLast(); + } +} + +template +void asCArray::RemoveValue(const T &e) +{ + for( size_t n = 0; n < length; n++ ) + { + if( array[n] == e ) + { + RemoveIndex(n); + break; + } + } +} + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_arrayobject.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_arrayobject.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_arrayobject.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_arrayobject.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,628 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +#include +#include + +#include "as_config.h" +#include "as_arrayobject.h" +#include "as_texts.h" + +BEGIN_AS_NAMESPACE + +struct sArrayBuffer +{ + asDWORD numElements; + asBYTE data[1]; +}; + +static asCArrayObject* ArrayObjectFactory2(asIObjectType *ot, asUINT length) +{ + asCArrayObject *a = asNEW(asCArrayObject)(length, ot); + + // It's possible the constructor raised a script exception, in which case we + // need to free the memory and return null instead, else we get a memory leak. + asIScriptContext *ctx = asGetActiveContext(); + if( ctx && ctx->GetState() == asEXECUTION_EXCEPTION ) + { + asDELETE(a, asCArrayObject); + return 0; + } + + return a; +} + +asCArrayObject* ArrayObjectFactory(asIObjectType *ot) +{ + return ArrayObjectFactory2(ot, 0); +} + +#ifndef AS_MAX_PORTABILITY + +static asCArrayObject &ArrayObjectAssignment(asCArrayObject *other, asCArrayObject *self) +{ + return *self = *other; +} + +static void *ArrayObjectAt(asUINT index, asCArrayObject *self) +{ + return self->at(index); +} + +static asUINT ArrayObjectLength(asCArrayObject *self) +{ + return self->GetElementCount(); +} +static void ArrayObjectResize(asUINT size, asCArrayObject *self) +{ + self->Resize(size); +} + +#else + +static void ArrayObjectFactory_Generic(asIScriptGeneric *gen) +{ + asIObjectType *ot = *(asIObjectType**)gen->GetAddressOfArg(0); + + *(asCArrayObject**)gen->GetAddressOfReturnLocation() = ArrayObjectFactory(ot); +} + +static void ArrayObjectFactory2_Generic(asIScriptGeneric *gen) +{ + asIObjectType *ot = *(asIObjectType**)gen->GetAddressOfArg(0); + asUINT length = gen->GetArgDWord(1); + + *(asCArrayObject**)gen->GetAddressOfReturnLocation() = ArrayObjectFactory2(ot, length); +} + +static void ArrayObjectAssignment_Generic(asIScriptGeneric *gen) +{ + asCArrayObject *other = (asCArrayObject*)gen->GetArgObject(0); + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + + *self = *other; + + gen->SetReturnObject(self); +} + +static void ArrayObjectAt_Generic(asIScriptGeneric *gen) +{ + asUINT index = gen->GetArgDWord(0); + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + + gen->SetReturnAddress(self->at(index)); +} + +static void ArrayObjectLength_Generic(asIScriptGeneric *gen) +{ + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + + gen->SetReturnDWord(self->GetElementCount()); +} + +static void ArrayObjectResize_Generic(asIScriptGeneric *gen) +{ + asUINT size = gen->GetArgDWord(0); + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + + self->Resize(size); +} + +static void ArrayObject_AddRef_Generic(asIScriptGeneric *gen) +{ + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + self->AddRef(); +} + +static void ArrayObject_Release_Generic(asIScriptGeneric *gen) +{ + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + self->Release(); +} + +static void ArrayObject_GetRefCount_Generic(asIScriptGeneric *gen) +{ + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + *(int*)gen->GetAddressOfReturnLocation() = self->GetRefCount(); +} + +static void ArrayObject_SetFlag_Generic(asIScriptGeneric *gen) +{ + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + self->SetFlag(); +} + +static void ArrayObject_GetFlag_Generic(asIScriptGeneric *gen) +{ + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + *(bool*)gen->GetAddressOfReturnLocation() = self->GetFlag(); +} + +static void ArrayObject_EnumReferences_Generic(asIScriptGeneric *gen) +{ + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->EnumReferences(engine); +} + +static void ArrayObject_ReleaseAllHandles_Generic(asIScriptGeneric *gen) +{ + asCArrayObject *self = (asCArrayObject*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->ReleaseAllHandles(engine); +} + +#endif + +void RegisterArrayObject(asIScriptEngine *engine) +{ + int r; + + r = engine->RegisterObjectType("_builtin_array_", sizeof(asCArrayObject), asOBJ_REF | asOBJ_GC | asOBJ_TEMPLATE); asASSERT( r >= 0 ); +#ifndef AS_MAX_PORTABILITY + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_FACTORY, "_builtin_array_@ f(int&in)", asFUNCTIONPR(ArrayObjectFactory, (asIObjectType*), asCArrayObject*), asCALL_CDECL); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_FACTORY, "_builtin_array_@ f(int&in, uint)", asFUNCTIONPR(ArrayObjectFactory2, (asIObjectType*, asUINT), asCArrayObject*), asCALL_CDECL); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_ADDREF, "void f()", asMETHOD(asCArrayObject,AddRef), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_RELEASE, "void f()", asMETHOD(asCArrayObject,Release), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterObjectMethod("_builtin_array_", "_builtin_array_ &opAssign(const _builtin_array_&in)", asFUNCTION(ArrayObjectAssignment), asCALL_CDECL_OBJLAST); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_INDEX, "T &f(uint)", asFUNCTION(ArrayObjectAt), asCALL_CDECL_OBJLAST); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_INDEX, "const T &f(uint) const", asFUNCTION(ArrayObjectAt), asCALL_CDECL_OBJLAST); asASSERT( r >= 0 ); + r = engine->RegisterObjectMethod("_builtin_array_", "uint length() const", asFUNCTION(ArrayObjectLength), asCALL_CDECL_OBJLAST); asASSERT( r >= 0 ); + r = engine->RegisterObjectMethod("_builtin_array_", "void resize(uint)", asFUNCTION(ArrayObjectResize), asCALL_CDECL_OBJLAST); asASSERT( r >= 0 ); + + // Register GC behaviours + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_GETREFCOUNT, "int f()", asMETHOD(asCArrayObject,GetRefCount), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_SETGCFLAG, "void f()", asMETHOD(asCArrayObject,SetFlag), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_GETGCFLAG, "bool f()", asMETHOD(asCArrayObject,GetFlag), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_ENUMREFS, "void f(int&in)", asMETHOD(asCArrayObject,EnumReferences), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_RELEASEREFS, "void f(int&in)", asMETHOD(asCArrayObject,ReleaseAllHandles), asCALL_THISCALL); asASSERT( r >= 0 ); +#else + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_FACTORY, "_builtin_array_@ f(int&in)", asFUNCTION(ArrayObjectFactory_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_FACTORY, "_builtin_array_@ f(int&in, uint)", asFUNCTION(ArrayObjectFactory2_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_ADDREF, "void f()", asFUNCTION(ArrayObject_AddRef_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_RELEASE, "void f()", asFUNCTION(ArrayObject_Release_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectMethod("_builtin_array_", "_builtin_array_ &opAssign(const _builtin_array_&in)", asFUNCTION(ArrayObjectAssignment_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_INDEX, "T &f(uint)", asFUNCTION(ArrayObjectAt_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_INDEX, "const T &f(uint) const", asFUNCTION(ArrayObjectAt_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectMethod("_builtin_array_", "uint length() const", asFUNCTION(ArrayObjectLength_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectMethod("_builtin_array_", "void resize(uint)", asFUNCTION(ArrayObjectResize_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + + // Register GC behaviours + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_GETREFCOUNT, "int f()", asFUNCTION(ArrayObject_GetRefCount_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_SETGCFLAG, "void f()", asFUNCTION(ArrayObject_SetFlag_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_GETGCFLAG, "bool f()", asFUNCTION(ArrayObject_GetFlag_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_ENUMREFS, "void f(int&in)", asFUNCTION(ArrayObject_EnumReferences_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterObjectBehaviour("_builtin_array_", asBEHAVE_RELEASEREFS, "void f(int&in)", asFUNCTION(ArrayObject_ReleaseAllHandles_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); +#endif +} + +asCArrayObject &asCArrayObject::operator=(asCArrayObject &other) +{ + if( &other != this ) + { + if( buffer ) + { + DeleteBuffer(buffer); + buffer = 0; + } + + // Copy all elements from the other array + CreateBuffer(&buffer, other.buffer->numElements); + CopyBuffer(buffer, other.buffer); + } + + return *this; +} + +int asCArrayObject::CopyFrom(asIScriptArray *other) +{ + if( other == 0 ) return asINVALID_ARG; + + // Verify that the types are equal + if( GetArrayTypeId() != other->GetArrayTypeId() ) + return asINVALID_TYPE; + + *this = *(asCArrayObject*)other; + + return 0; +} + +asCArrayObject::asCArrayObject(asUINT length, asIObjectType *ot) +{ + refCount.set(1); + gcFlag = false; + objType = ot; + objType->AddRef(); + buffer = 0; + + // Determine element size + int typeId = objType->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + elementSize = sizeof(asPWORD); + } + else + { + elementSize = objType->GetEngine()->GetSizeOfPrimitiveType(typeId); + } + + isArrayOfHandles = typeId & asTYPEID_OBJHANDLE ? true : false; + + // Make sure the array size isn't too large for us to handle + if( !CheckMaxSize(length) ) + { + // Don't continue with the initialization + return; + } + + CreateBuffer(&buffer, length); + + // Notify the GC of the successful creation + if( objType->GetFlags() & asOBJ_GC ) + objType->GetEngine()->NotifyGarbageCollectorOfNewObject(this, objType->GetTypeId()); +} + +asCArrayObject::~asCArrayObject() +{ + if( buffer ) + { + DeleteBuffer(buffer); + buffer = 0; + } + if( objType ) objType->Release(); +} + +asIScriptEngine *asCArrayObject::GetEngine() const +{ + return objType->GetEngine(); +} + +asUINT asCArrayObject::GetElementCount() +{ + return buffer->numElements; +} + +void asCArrayObject::Resize(asUINT numElements) +{ + // Don't do anything if the size is already correct + if( numElements == buffer->numElements ) + return; + + // Make sure the array size isn't too large for us to handle + if( !CheckMaxSize(numElements) ) + { + // Don't resize the array + return; + } + + sArrayBuffer *newBuffer; + int typeId = objType->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + // Allocate memory for the buffer + newBuffer = (sArrayBuffer*)asNEWARRAY(asBYTE, sizeof(sArrayBuffer)-1+sizeof(void*)*numElements); + newBuffer->numElements = numElements; + + // Copy the elements from the old buffer + int c = numElements > buffer->numElements ? buffer->numElements : numElements; + asDWORD **d = (asDWORD**)newBuffer->data; + asDWORD **s = (asDWORD**)buffer->data; + for( int n = 0; n < c; n++ ) + d[n] = s[n]; + + if( numElements > buffer->numElements ) + { + Construct(newBuffer, buffer->numElements, numElements); + } + else if( numElements < buffer->numElements ) + { + Destruct(buffer, numElements, buffer->numElements); + } + } + else + { + // Allocate memory for the buffer + newBuffer = (sArrayBuffer*)asNEWARRAY(asBYTE, sizeof(sArrayBuffer)-1+elementSize*numElements); + newBuffer->numElements = numElements; + + int c = numElements > buffer->numElements ? buffer->numElements : numElements; + memcpy(newBuffer->data, buffer->data, c*elementSize); + } + + // Release the old buffer + userFree(buffer); + + buffer = newBuffer; +} + +// internal +bool asCArrayObject::CheckMaxSize(asUINT numElements) +{ + // This code makes sure the size of the buffer that is allocated + // for the array doesn't overflow and becomes smaller than requested + + asUINT maxSize = 0xFFFFFFFFul - sizeof(sArrayBuffer) + 1; + if( objType->GetSubTypeId() & asTYPEID_MASK_OBJECT ) + { + maxSize /= sizeof(void*); + } + else + { + maxSize /= elementSize; + } + + if( numElements > maxSize ) + { + asIScriptContext *ctx = asGetActiveContext(); + if( ctx ) + { + // Set a script exception + ctx->SetException("Too large array size"); + } + + return false; + } + + // OK + return true; +} + +int asCArrayObject::GetArrayTypeId() +{ + return objType->GetTypeId(); +} + +int asCArrayObject::GetElementTypeId() +{ + return objType->GetSubTypeId(); +} + +void *asCArrayObject::GetElementPointer(asUINT index) +{ + if( index >= buffer->numElements ) return 0; + + int typeId = objType->GetSubTypeId(); + if( (typeId & asTYPEID_MASK_OBJECT) && !isArrayOfHandles ) + return (void*)((size_t*)buffer->data)[index]; + else + return buffer->data + elementSize*index; +} + +void *asCArrayObject::at(asUINT index) +{ + if( index >= buffer->numElements ) + { + asIScriptContext *ctx = asGetActiveContext(); + if( ctx ) + ctx->SetException(TXT_OUT_OF_BOUNDS); + return 0; + } + else + { + int typeId = objType->GetSubTypeId(); + if( (typeId & asTYPEID_MASK_OBJECT) && !isArrayOfHandles ) + return (void*)((size_t*)buffer->data)[index]; + else + return buffer->data + elementSize*index; + } +} + +void asCArrayObject::CreateBuffer(sArrayBuffer **buf, asUINT numElements) +{ + int typeId = objType->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + *buf = (sArrayBuffer*)asNEWARRAY(asBYTE, sizeof(sArrayBuffer)-1+sizeof(void*)*numElements); + (*buf)->numElements = numElements; + } + else + { + *buf = (sArrayBuffer*)asNEWARRAY(asBYTE, sizeof(sArrayBuffer)-1+elementSize*numElements); + (*buf)->numElements = numElements; + } + + Construct(*buf, 0, numElements); +} + +void asCArrayObject::DeleteBuffer(sArrayBuffer *buf) +{ + Destruct(buf, 0, buf->numElements); + + // Free the buffer + asDELETEARRAY(buf); +} + +void asCArrayObject::Construct(sArrayBuffer *buf, asUINT start, asUINT end) +{ + int typeId = objType->GetSubTypeId(); + if( isArrayOfHandles ) + { + // Set all object handles to null + asDWORD *d = (asDWORD*)(buf->data + start * sizeof(void*)); + memset(d, 0, (end-start)*sizeof(void*)); + } + else if( typeId & asTYPEID_MASK_OBJECT ) + { + asDWORD **max = (asDWORD**)(buf->data + end * sizeof(void*)); + asDWORD **d = (asDWORD**)(buf->data + start * sizeof(void*)); + + asIScriptEngine *engine = objType->GetEngine(); + + for( ; d < max; d++ ) + *d = (asDWORD*)engine->CreateScriptObject(typeId); + } +} + +void asCArrayObject::Destruct(sArrayBuffer *buf, asUINT start, asUINT end) +{ + int typeId = objType->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + asIScriptEngine *engine = objType->GetEngine(); + + asDWORD **max = (asDWORD**)(buf->data + end * sizeof(void*)); + asDWORD **d = (asDWORD**)(buf->data + start * sizeof(void*)); + + for( ; d < max; d++ ) + { + if( *d ) + engine->ReleaseScriptObject(*d, typeId); + } + } +} + + +void asCArrayObject::CopyBuffer(sArrayBuffer *dst, sArrayBuffer *src) +{ + asIScriptEngine *engine = objType->GetEngine(); + if( isArrayOfHandles ) + { + // Copy the references and increase the reference counters + if( dst->numElements > 0 && src->numElements > 0 ) + { + int typeId = objType->GetSubTypeId(); + int count = dst->numElements > src->numElements ? src->numElements : dst->numElements; + + asDWORD **max = (asDWORD**)(dst->data + count * sizeof(void*)); + asDWORD **d = (asDWORD**)dst->data; + asDWORD **s = (asDWORD**)src->data; + + for( ; d < max; d++, s++ ) + { + *d = *s; + if( *d ) + engine->AddRefScriptObject(*d, typeId); + } + } + } + else + { + int typeId = objType->GetSubTypeId(); + + if( dst->numElements > 0 && src->numElements > 0 ) + { + int count = dst->numElements > src->numElements ? src->numElements : dst->numElements; + if( typeId & asTYPEID_MASK_OBJECT ) + { + // Call the assignment operator on all of the objects + asDWORD **max = (asDWORD**)(dst->data + count * sizeof(void*)); + asDWORD **d = (asDWORD**)dst->data; + asDWORD **s = (asDWORD**)src->data; + + for( ; d < max; d++, s++ ) + engine->CopyScriptObject(*d, *s, typeId); + } + else + { + // Primitives are copied byte for byte + memcpy(dst->data, src->data, count*elementSize); + } + } + } +} + +void asCArrayObject::Destruct() +{ + // Call destructor and free the memory + asDELETE(this, asCArrayObject); +} + +void asCArrayObject::EnumReferences(asIScriptEngine *engine) +{ + // If the array is holding handles, then we need to notify the GC of them + int typeId = objType->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + void **d = (void**)buffer->data; + for( asUINT n = 0; n < buffer->numElements; n++ ) + { + if( d[n] ) + engine->GCEnumCallback(d[n]); + } + } +} + +void asCArrayObject::ReleaseAllHandles(asIScriptEngine *engine) +{ + int subTypeId = objType->GetSubTypeId(); + asIObjectType *subType = engine->GetObjectTypeById(subTypeId); + if( subType && subType->GetFlags() & asOBJ_GC ) + { + void **d = (void**)buffer->data; + for( asUINT n = 0; n < buffer->numElements; n++ ) + { + if( d[n] ) + { + engine->ReleaseScriptObject(d[n], subTypeId); + d[n] = 0; + } + } + } +} + + +int asCArrayObject::AddRef() +{ + // Clear the GC flag then increase the counter + gcFlag = false; + return refCount.atomicInc(); +} + +int asCArrayObject::Release() +{ + // Now do the actual releasing (clearing the flag set by GC) + gcFlag = false; + int r = refCount.atomicDec(); + if( r == 0 ) + { + Destruct(); + return 0; + } + + return r; +} + +int asCArrayObject::GetRefCount() +{ + return refCount.get(); +} + +void asCArrayObject::SetFlag() +{ + gcFlag = true; +} + +bool asCArrayObject::GetFlag() +{ + return gcFlag; +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_arrayobject.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_arrayobject.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_arrayobject.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_arrayobject.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,104 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + + +// +// as_arrayobject.h +// +// A class for storing arrays of any object type in the scripts +// + + + +#ifndef AS_ARRAYOBJECT_H +#define AS_ARRAYOBJECT_H + +#include "as_config.h" +#include "as_atomic.h" + +BEGIN_AS_NAMESPACE + +struct sArrayBuffer; + +class asCArrayObject : public asIScriptArray +{ +public: + asCArrayObject(asUINT length, asIObjectType *ot); + virtual ~asCArrayObject(); + + asIScriptEngine *GetEngine() const; + + int AddRef(); + int Release(); + + int GetArrayTypeId(); + int GetElementTypeId(); + + void Resize(asUINT numElements); + asUINT GetElementCount(); + void *GetElementPointer(asUINT index); + void *at(asUINT index); + asCArrayObject &operator=(asCArrayObject&); + + int CopyFrom(asIScriptArray *other); + + // GC methods + void Destruct(); + int GetRefCount(); + void SetFlag(); + bool GetFlag(); + void EnumReferences(asIScriptEngine *engine); + void ReleaseAllHandles(asIScriptEngine *engine); + +protected: + asCAtomic refCount; + bool gcFlag; + asIObjectType *objType; + sArrayBuffer *buffer; + bool isArrayOfHandles; + int elementSize; + + bool CheckMaxSize(asUINT numElements); + + void CreateBuffer(sArrayBuffer **buf, asUINT numElements); + void DeleteBuffer(sArrayBuffer *buf); + void CopyBuffer(sArrayBuffer *dst, sArrayBuffer *src); + + void Construct(sArrayBuffer *buf, asUINT start, asUINT end); + void Destruct(sArrayBuffer *buf, asUINT start, asUINT end); +}; + +void RegisterArrayObject(asIScriptEngine *engine); +asCArrayObject *ArrayObjectFactory(asIObjectType *ot); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_atomic.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_atomic.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_atomic.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_atomic.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,158 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + +// +// as_gc.cpp +// +// The implementation of the garbage collector +// + +#include "as_atomic.h" +#include "threads/Atomics.h" + +BEGIN_AS_NAMESPACE + +asCAtomic::asCAtomic() +{ + value = 0; +} + +asDWORD asCAtomic::get() const +{ + return value; +} + +void asCAtomic::set(asDWORD val) +{ + value = val; +} + +// +// The following code implements the atomicInc and atomicDec on different platforms +// +#ifdef AS_NO_THREADS + +asDWORD asCAtomic::atomicInc() +{ + return ++value; +} + +asDWORD asCAtomic::atomicDec() +{ + return --value; +} + +#elif defined(AS_NO_ATOMIC) + +asDWORD asCAtomic::atomicInc() +{ + asDWORD v; + ENTERCRITICALSECTION(cs); + v = ++value; + LEAVECRITICALSECTION(cs); + return v; +} + +asDWORD asCAtomic::atomicDec() +{ + asDWORD v; + ENTERCRITICALSECTION(cs); + v = --value; + LEAVECRITICALSECTION(cs); + return v; +} + +#elif defined(AS_WIN) + +END_AS_NAMESPACE +#define WIN32_MEAN_AND_LEAN +#include +BEGIN_AS_NAMESPACE + +asDWORD asCAtomic::atomicInc() +{ + return AtomicIncrement((LONG*)&value); +} + +asDWORD asCAtomic::atomicDec() +{ + asASSERT(value > 0); + return AtomicDecrement((LONG*)&value); +} + +#elif defined(AS_LINUX) || defined(AS_BSD) + +// +// atomic_inc_and_test() and atomic_dec_and_test() from asm/atomic.h is not meant +// to be used outside the Linux kernel. Instead we should use the GNUC provided +// __sync_add_and_fetch() and __sync_sub_and_fetch() functions. +// +// Reference: http://golubenco.org/blog/atomic-operations/ +// +// These are only available in GCC 4.1 and above, so for older versions we +// use the critical sections, though it is a lot slower. +// + +asDWORD asCAtomic::atomicInc() +{ + return __sync_add_and_fetch(&value, 1); +} + +asDWORD asCAtomic::atomicDec() +{ + return __sync_sub_and_fetch(&value, 1); +} + +#elif defined(AS_MAC) + +END_AS_NAMESPACE +#include +BEGIN_AS_NAMESPACE + +asDWORD asCAtomic::atomicInc() +{ + return OSAtomicIncrement32((int32_t*)&value); +} + +asDWORD asCAtomic::atomicDec() +{ + return OSAtomicDecrement32((int32_t*)&value); +} + +#else + +// If we get here, then the configuration in as_config.h +// is wrong for the compiler/platform combination. +int ERROR_PleaseFixTheConfig[-1]; + +#endif + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_atomic.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_atomic.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_atomic.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_atomic.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,74 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_atomic.h +// +// The asCAtomic class provides methods for performing threadsafe +// operations on a single dword, e.g. reference counting and +// bitfields. +// + + + +#ifndef AS_ATOMIC_H +#define AS_ATOMIC_H + +#include "as_config.h" +#include "as_criticalsection.h" + +BEGIN_AS_NAMESPACE + +class asCAtomic +{ +public: + asCAtomic(); + + asDWORD get() const; + void set(asDWORD val); + + // Increase and return new value + asDWORD atomicInc(); + + // Decrease and return new value + asDWORD atomicDec(); + +protected: + asDWORD value; + +#if !defined(AS_NO_THREADS) && defined(AS_NO_ATOMIC) + DECLARECRITICALSECTION(cs); +#endif +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_builder.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_builder.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_builder.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_builder.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2818 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_builder.cpp +// +// This is the class that manages the compilation of the scripts +// + + +#include "as_config.h" +#include "as_builder.h" +#include "as_parser.h" +#include "as_compiler.h" +#include "as_tokendef.h" +#include "as_string_util.h" +#include "as_outputbuffer.h" +#include "as_texts.h" +#include "as_scriptobject.h" + +BEGIN_AS_NAMESPACE + +asCBuilder::asCBuilder(asCScriptEngine *engine, asCModule *module) +{ + this->engine = engine; + this->module = module; +} + +asCBuilder::~asCBuilder() +{ + asUINT n; + + // Free all functions + for( n = 0; n < functions.GetLength(); n++ ) + { + if( functions[n] ) + { + if( functions[n]->node ) + { + functions[n]->node->Destroy(engine); + } + + asDELETE(functions[n],sFunctionDescription); + } + + functions[n] = 0; + } + + // Free all global variables + for( n = 0; n < globVariables.GetLength(); n++ ) + { + if( globVariables[n] ) + { + if( globVariables[n]->nextNode ) + { + globVariables[n]->nextNode->Destroy(engine); + } + + asDELETE(globVariables[n],sGlobalVariableDescription); + globVariables[n] = 0; + } + } + + // Free all the loaded files + for( n = 0; n < scripts.GetLength(); n++ ) + { + if( scripts[n] ) + { + asDELETE(scripts[n],asCScriptCode); + } + + scripts[n] = 0; + } + + // Free all class declarations + for( n = 0; n < classDeclarations.GetLength(); n++ ) + { + if( classDeclarations[n] ) + { + if( classDeclarations[n]->node ) + { + classDeclarations[n]->node->Destroy(engine); + } + + asDELETE(classDeclarations[n],sClassDeclaration); + classDeclarations[n] = 0; + } + } + + for( n = 0; n < interfaceDeclarations.GetLength(); n++ ) + { + if( interfaceDeclarations[n] ) + { + if( interfaceDeclarations[n]->node ) + { + interfaceDeclarations[n]->node->Destroy(engine); + } + + asDELETE(interfaceDeclarations[n],sClassDeclaration); + interfaceDeclarations[n] = 0; + } + } + + for( n = 0; n < namedTypeDeclarations.GetLength(); n++ ) + { + if( namedTypeDeclarations[n] ) + { + if( namedTypeDeclarations[n]->node ) + { + namedTypeDeclarations[n]->node->Destroy(engine); + } + + asDELETE(namedTypeDeclarations[n],sClassDeclaration); + namedTypeDeclarations[n] = 0; + } + } +} + +int asCBuilder::AddCode(const char *name, const char *code, int codeLength, int lineOffset, int sectionIdx, bool makeCopy) +{ + asCScriptCode *script = asNEW(asCScriptCode); + script->SetCode(name, code, codeLength, makeCopy); + script->lineOffset = lineOffset; + script->idx = sectionIdx; + scripts.PushLast(script); + + return 0; +} + +int asCBuilder::Build() +{ + numErrors = 0; + numWarnings = 0; + preMessage.isSet = false; + + ParseScripts(); + CompileClasses(); + CompileGlobalVariables(); + CompileFunctions(); + + if( numErrors > 0 ) + return asERROR; + + return asSUCCESS; +} + +#ifdef AS_DEPRECATED +// Deprecated since 2009-12-08, 2.18.0 +int asCBuilder::BuildString(const char *string, asCContext *ctx) +{ + asCScriptFunction *execFunc = 0; + int r = CompileFunction(TXT_EXECUTESTRING, string, -1, 0, &execFunc); + if( r >= 0 ) + { + ctx->SetExecuteStringFunction(execFunc); + } + + return r; +} +#endif + +int asCBuilder::CompileGlobalVar(const char *sectionName, const char *code, int lineOffset) +{ + numErrors = 0; + numWarnings = 0; + preMessage.isSet = false; + + // Add the string to the script code + asCScriptCode *script = asNEW(asCScriptCode); + script->SetCode(sectionName, code, true); + script->lineOffset = lineOffset; + scripts.PushLast(script); + + // Parse the string + asCParser parser(this); + if( parser.ParseScript(scripts[0]) < 0 ) + return asERROR; + + asCScriptNode *node = parser.GetScriptNode(); + + // Make sure there is nothing else than the global variable in the script code + if( node == 0 || + node->firstChild == 0 || + node->firstChild != node->lastChild || + node->firstChild->nodeType != snGlobalVar ) + { + WriteError(script->name.AddressOf(), TXT_ONLY_ONE_VARIABLE_ALLOWED, 0, 0); + return asERROR; + } + + node = node->firstChild; + node->DisconnectParent(); + RegisterGlobalVar(node, script); + + CompileGlobalVariables(); + + if( numErrors > 0 ) + { + // Remove the variable from the module, if it was registered + if( globVariables.GetLength() > 0 ) + { + module->RemoveGlobalVar(module->GetGlobalVarCount()-1); + } + + return asERROR; + } + + return 0; +} + +int asCBuilder::CompileFunction(const char *sectionName, const char *code, int lineOffset, asDWORD compileFlags, asCScriptFunction **outFunc) +{ + asASSERT(outFunc != 0); + + numErrors = 0; + numWarnings = 0; + preMessage.isSet = false; + + // Add the string to the script code + asCScriptCode *script = asNEW(asCScriptCode); + script->SetCode(sectionName, code, true); + script->lineOffset = lineOffset; + scripts.PushLast(script); + + // Parse the string + asCParser parser(this); + if( parser.ParseScript(scripts[0]) < 0 ) + return asERROR; + + asCScriptNode *node = parser.GetScriptNode(); + + // Make sure there is nothing else than the function in the script code + if( node == 0 || + node->firstChild == 0 || + node->firstChild != node->lastChild || + node->firstChild->nodeType != snFunction ) + { + WriteError(script->name.AddressOf(), TXT_ONLY_ONE_FUNCTION_ALLOWED, 0, 0); + return asERROR; + } + + // Find the function node + node = node->firstChild; + + // Create the function + bool isConstructor, isDestructor; + asCScriptFunction *func = asNEW(asCScriptFunction)(engine,module,asFUNC_SCRIPT); + GetParsedFunctionDetails(node, scripts[0], 0, func->name, func->returnType, func->parameterTypes, func->inOutFlags, func->isReadOnly, isConstructor, isDestructor); + func->id = engine->GetNextScriptFunctionId(); + func->scriptSectionIdx = engine->GetScriptSectionNameIndex(sectionName ? sectionName : ""); + + // Tell the engine that the function exists already so the compiler can access it + if( compileFlags & asCOMP_ADD_TO_MODULE ) + { + int r = CheckNameConflict(func->name.AddressOf(), node, scripts[0]); + if( r < 0 ) + { + func->Release(); + return asERROR; + } + + module->globalFunctions.PushLast(func); + func->AddRef(); + module->AddScriptFunction(func); + } + else + engine->SetScriptFunction(func); + + // Fill in the function info for the builder too + node->DisconnectParent(); + sFunctionDescription *funcDesc = asNEW(sFunctionDescription); + functions.PushLast(funcDesc); + funcDesc->script = scripts[0]; + funcDesc->node = node; + funcDesc->name = func->name; + funcDesc->funcId = func->id; + + asCCompiler compiler(engine); + if( compiler.CompileFunction(this, functions[0]->script, functions[0]->node, func) >= 0 ) + { + // Return the function + *outFunc = func; + } + else + { + // If the function was added to the module then remove it again + if( compileFlags & asCOMP_ADD_TO_MODULE ) + { + module->globalFunctions.RemoveValue(func); + module->scriptFunctions.RemoveValue(func); + func->Release(); + func->Release(); + } + + // Clear the global variables to avoid releasing them + // TODO: This shouldn't be necessary + func->globalVarPointers.SetLength(0); + func->Release(); + + return asERROR; + } + + return asSUCCESS; +} + +void asCBuilder::ParseScripts() +{ + asCArray parsers((int)scripts.GetLength()); + + // Parse all the files as if they were one + asUINT n = 0; + for( n = 0; n < scripts.GetLength(); n++ ) + { + asCParser *parser = asNEW(asCParser)(this); + parsers.PushLast(parser); + + // Parse the script file + parser->ParseScript(scripts[n]); + } + + if( numErrors == 0 ) + { + // Find all type declarations + for( n = 0; n < scripts.GetLength(); n++ ) + { + asCScriptNode *node = parsers[n]->GetScriptNode(); + + // Find structure definitions first + node = node->firstChild; + while( node ) + { + asCScriptNode *next = node->next; + if( node->nodeType == snClass ) + { + node->DisconnectParent(); + RegisterClass(node, scripts[n]); + } + else if( node->nodeType == snInterface ) + { + node->DisconnectParent(); + RegisterInterface(node, scripts[n]); + } + // Handle enumeration + else if( node->nodeType == snEnum ) + { + node->DisconnectParent(); + RegisterEnum(node, scripts[n]); + } + // Handle typedef + else if( node->nodeType == snTypedef ) + { + node->DisconnectParent(); + RegisterTypedef(node, scripts[n]); + } + + node = next; + } + } + + // Register script methods found in the interfaces + for( n = 0; n < interfaceDeclarations.GetLength(); n++ ) + { + sClassDeclaration *decl = interfaceDeclarations[n]; + + asCScriptNode *node = decl->node->firstChild->next; + while( node ) + { + asCScriptNode *next = node->next; + if( node->nodeType == snFunction ) + { + node->DisconnectParent(); + RegisterScriptFunction(engine->GetNextScriptFunctionId(), node, decl->script, decl->objType, true); + } + + node = next; + } + } + + // Now the interfaces have been completely established, now we need to determine if + // the same interface has already been registered before, and if so reuse the interface id. + module->ResolveInterfaceIds(); + + // Register script methods found in the structures + for( n = 0; n < classDeclarations.GetLength(); n++ ) + { + sClassDeclaration *decl = classDeclarations[n]; + + asCScriptNode *node = decl->node->firstChild->next; + + // Skip list of classes and interfaces + while( node && node->nodeType == snIdentifier ) + node = node->next; + + while( node ) + { + asCScriptNode *next = node->next; + if( node->nodeType == snFunction ) + { + node->DisconnectParent(); + RegisterScriptFunction(engine->GetNextScriptFunctionId(), node, decl->script, decl->objType); + } + + node = next; + } + + // Make sure the default factory & constructor exists for classes + if( decl->objType->beh.construct == engine->scriptTypeBehaviours.beh.construct ) + { + AddDefaultConstructor(decl->objType, decl->script); + } + } + + // Find other global nodes + for( n = 0; n < scripts.GetLength(); n++ ) + { + // Find other global nodes + asCScriptNode *node = parsers[n]->GetScriptNode(); + node = node->firstChild; + while( node ) + { + asCScriptNode *next = node->next; + node->DisconnectParent(); + + if( node->nodeType == snFunction ) + { + RegisterScriptFunction(engine->GetNextScriptFunctionId(), node, scripts[n], 0, false, true); + } + else if( node->nodeType == snGlobalVar ) + { + RegisterGlobalVar(node, scripts[n]); + } + else if( node->nodeType == snImport ) + { + RegisterImportedFunction(module->GetNextImportedFunctionId(), node, scripts[n]); + } + else + { + // Unused script node + int r, c; + scripts[n]->ConvertPosToRowCol(node->tokenPos, &r, &c); + + WriteWarning(scripts[n]->name.AddressOf(), TXT_UNUSED_SCRIPT_NODE, r, c); + + node->Destroy(engine); + } + + node = next; + } + } + } + + for( n = 0; n < parsers.GetLength(); n++ ) + { + asDELETE(parsers[n],asCParser); + } +} + +void asCBuilder::CompileFunctions() +{ + // Compile each function + for( asUINT n = 0; n < functions.GetLength(); n++ ) + { + if( functions[n] == 0 ) continue; + + asCCompiler compiler(engine); + asCScriptFunction *func = engine->scriptFunctions[functions[n]->funcId]; + + if( functions[n]->node ) + { + int r, c; + functions[n]->script->ConvertPosToRowCol(functions[n]->node->tokenPos, &r, &c); + + asCString str = func->GetDeclarationStr(); + str.Format(TXT_COMPILING_s, str.AddressOf()); + WriteInfo(functions[n]->script->name.AddressOf(), str.AddressOf(), r, c, true); + + compiler.CompileFunction(this, functions[n]->script, functions[n]->node, func); + + preMessage.isSet = false; + } + else + { + // This is the default constructor, that is generated + // automatically if not implemented by the user. + asASSERT( functions[n]->name == functions[n]->objType->name ); + compiler.CompileDefaultConstructor(this, functions[n]->script, func); + } + } +} + +int asCBuilder::ParseDataType(const char *datatype, asCDataType *result) +{ + numErrors = 0; + numWarnings = 0; + preMessage.isSet = false; + + asCScriptCode source; + source.SetCode("", datatype, true); + + asCParser parser(this); + int r = parser.ParseDataType(&source); + if( r < 0 ) + return asINVALID_TYPE; + + // Get data type and property name + asCScriptNode *dataType = parser.GetScriptNode()->firstChild; + + *result = CreateDataTypeFromNode(dataType, &source, true); + + if( numErrors > 0 ) + return asINVALID_TYPE; + + return asSUCCESS; +} + +int asCBuilder::ParseTemplateDecl(const char *decl, asCString *name, asCString *subtypeName) +{ + numErrors = 0; + numWarnings = 0; + preMessage.isSet = false; + + asCScriptCode source; + source.SetCode("", decl, true); + + asCParser parser(this); + int r = parser.ParseTemplateDecl(&source); + if( r < 0 ) + return asINVALID_TYPE; + + // Get the template name and subtype name + asCScriptNode *node = parser.GetScriptNode()->firstChild; + + name->Assign(&decl[node->tokenPos], node->tokenLength); + node = node->next; + subtypeName->Assign(&decl[node->tokenPos], node->tokenLength); + + // TODO: template: check for name conflicts + + if( numErrors > 0 ) + return asINVALID_DECLARATION; + + return asSUCCESS; +} + +int asCBuilder::VerifyProperty(asCDataType *dt, const char *decl, asCString &name, asCDataType &type) +{ + numErrors = 0; + numWarnings = 0; + preMessage.isSet = false; + + if( dt ) + { + // Verify that the object type exist + if( dt->GetObjectType() == 0 ) + return asINVALID_OBJECT; + } + + // Check property declaration and type + asCScriptCode source; + source.SetCode(TXT_PROPERTY, decl, true); + + asCParser parser(this); + int r = parser.ParsePropertyDeclaration(&source); + if( r < 0 ) + return asINVALID_DECLARATION; + + // Get data type and property name + asCScriptNode *dataType = parser.GetScriptNode()->firstChild; + + asCScriptNode *nameNode = dataType->next; + + type = CreateDataTypeFromNode(dataType, &source); + name.Assign(&decl[nameNode->tokenPos], nameNode->tokenLength); + + // Verify property name + if( dt ) + { + if( CheckNameConflictMember(*dt, name.AddressOf(), nameNode, &source) < 0 ) + return asNAME_TAKEN; + } + else + { + if( CheckNameConflict(name.AddressOf(), nameNode, &source) < 0 ) + return asNAME_TAKEN; + } + + if( numErrors > 0 ) + return asINVALID_DECLARATION; + + return asSUCCESS; +} + +asCObjectProperty *asCBuilder::GetObjectProperty(asCDataType &obj, const char *prop) +{ + asASSERT(obj.GetObjectType() != 0); + + // TODO: Only search in config groups to which the module has access + // TODO: optimize: Improve linear search + asCArray &props = obj.GetObjectType()->properties; + for( asUINT n = 0; n < props.GetLength(); n++ ) + if( props[n]->name == prop ) + return props[n]; + + return 0; +} + +asCGlobalProperty *asCBuilder::GetGlobalProperty(const char *prop, bool *isCompiled, bool *isPureConstant, asQWORD *constantValue) +{ + asUINT n; + + if( isCompiled ) *isCompiled = true; + if( isPureConstant ) *isPureConstant = false; + + // TODO: optimize: Improve linear search + // Check application registered properties + asCArray *props = &(engine->registeredGlobalProps); + for( n = 0; n < props->GetLength(); ++n ) + if( (*props)[n] && (*props)[n]->name == prop ) + { + if( module ) + { + // Find the config group for the global property + asCConfigGroup *group = engine->FindConfigGroupForGlobalVar((*props)[n]->id); + if( !group || group->HasModuleAccess(module->name.AddressOf()) ) + return (*props)[n]; + } + else + { + // We're not compiling a module right now, so it must be a registered global property + return (*props)[n]; + } + } + + // TODO: optimize: Improve linear search + // Check properties being compiled now + asCArray *gvars = &globVariables; + for( n = 0; n < gvars->GetLength(); ++n ) + { + if( (*gvars)[n] && (*gvars)[n]->name == prop ) + { + if( isCompiled ) *isCompiled = (*gvars)[n]->isCompiled; + + if( isPureConstant ) *isPureConstant = (*gvars)[n]->isPureConstant; + if( constantValue ) *constantValue = (*gvars)[n]->constantValue; + + return (*gvars)[n]->property; + } + } + + // TODO: optimize: Improve linear search + // Check previously compiled global variables + if( module ) + { + props = &module->scriptGlobals; + for( n = 0; n < props->GetLength(); ++n ) + if( (*props)[n]->name == prop ) + return (*props)[n]; + } + + return 0; +} + +int asCBuilder::ParseFunctionDeclaration(asCObjectType *objType, const char *decl, asCScriptFunction *func, bool isSystemFunction, asCArray *paramAutoHandles, bool *returnAutoHandle) +{ + numErrors = 0; + numWarnings = 0; + preMessage.isSet = false; + + asCScriptCode source; + source.SetCode(TXT_SYSTEM_FUNCTION, decl, true); + + asCParser parser(this); + int r = parser.ParseFunctionDefinition(&source); + if( r < 0 ) + return asINVALID_DECLARATION; + + asCScriptNode *node = parser.GetScriptNode(); + + // Find name + asCScriptNode *n = node->firstChild->next->next; + func->name.Assign(&source.code[n->tokenPos], n->tokenLength); + + // Initialize a script function object for registration + bool autoHandle; + + // Scoped reference types are allowed to use handle when returned from application functions + func->returnType = CreateDataTypeFromNode(node->firstChild, &source, true, objType); + func->returnType = ModifyDataTypeFromNode(func->returnType, node->firstChild->next, &source, 0, &autoHandle); + if( autoHandle && (!func->returnType.IsObjectHandle() || func->returnType.IsReference()) ) + return asINVALID_DECLARATION; + if( returnAutoHandle ) *returnAutoHandle = autoHandle; + + // Reference types cannot be returned by value from system functions + if( isSystemFunction && + (func->returnType.GetObjectType() && + (func->returnType.GetObjectType()->flags & asOBJ_REF)) && + !(func->returnType.IsReference() || + func->returnType.IsObjectHandle()) ) + return asINVALID_DECLARATION; + + // Count number of parameters + int paramCount = 0; + n = n->next->firstChild; + while( n ) + { + paramCount++; + n = n->next->next; + if( n && n->nodeType == snIdentifier ) + n = n->next; + } + + // Preallocate memory + func->parameterTypes.Allocate(paramCount, false); + func->inOutFlags.Allocate(paramCount, false); + if( paramAutoHandles ) paramAutoHandles->Allocate(paramCount, false); + + n = node->firstChild->next->next->next->firstChild; + while( n ) + { + asETypeModifiers inOutFlags; + asCDataType type = CreateDataTypeFromNode(n, &source, false, objType); + type = ModifyDataTypeFromNode(type, n->next, &source, &inOutFlags, &autoHandle); + + // Reference types cannot be passed by value to system functions + if( isSystemFunction && + (type.GetObjectType() && + (type.GetObjectType()->flags & asOBJ_REF)) && + !(type.IsReference() || + type.IsObjectHandle()) ) + return asINVALID_DECLARATION; + + // Store the parameter type + func->parameterTypes.PushLast(type); + func->inOutFlags.PushLast(inOutFlags); + + // Don't permit void parameters + if( type.GetTokenType() == ttVoid ) + return asINVALID_DECLARATION; + + if( autoHandle && (!type.IsObjectHandle() || type.IsReference()) ) + return asINVALID_DECLARATION; + + if( paramAutoHandles ) paramAutoHandles->PushLast(autoHandle); + + // Make sure that var type parameters are references + if( type.GetTokenType() == ttQuestion && + !type.IsReference() ) + return asINVALID_DECLARATION; + + // Move to next parameter + n = n->next->next; + if( n && n->nodeType == snIdentifier ) + n = n->next; + } + + // Set the read-only flag if const is declared after parameter list + if( node->lastChild->nodeType == snUndefined && node->lastChild->tokenType == ttConst ) + func->isReadOnly = true; + else + func->isReadOnly = false; + + if( numErrors > 0 || numWarnings > 0 ) + return asINVALID_DECLARATION; + + return 0; +} + +int asCBuilder::ParseVariableDeclaration(const char *decl, asCObjectProperty *var) +{ + numErrors = 0; + numWarnings = 0; + preMessage.isSet = false; + + asCScriptCode source; + source.SetCode(TXT_VARIABLE_DECL, decl, true); + + asCParser parser(this); + + int r = parser.ParsePropertyDeclaration(&source); + if( r < 0 ) + return asINVALID_DECLARATION; + + asCScriptNode *node = parser.GetScriptNode(); + + // Find name + asCScriptNode *n = node->firstChild->next; + var->name.Assign(&source.code[n->tokenPos], n->tokenLength); + + // Initialize a script variable object for registration + var->type = CreateDataTypeFromNode(node->firstChild, &source); + + if( numErrors > 0 || numWarnings > 0 ) + return asINVALID_DECLARATION; + + return 0; +} + +int asCBuilder::CheckNameConflictMember(asCDataType &dt, const char *name, asCScriptNode *node, asCScriptCode *code) +{ + // It's not necessary to check against object types + + // Check against other members + asCObjectType *t = dt.GetObjectType(); + + // TODO: optimize: Improve linear search + asCArray &props = t->properties; + for( asUINT n = 0; n < props.GetLength(); n++ ) + { + if( props[n]->name == name ) + { + if( code ) + { + int r, c; + code->ConvertPosToRowCol(node->tokenPos, &r, &c); + + asCString str; + str.Format(TXT_NAME_CONFLICT_s_OBJ_PROPERTY, name); + WriteError(code->name.AddressOf(), str.AddressOf(), r, c); + } + + return -1; + } + } + + // TODO: Property names must be checked against method names + + return 0; +} + +int asCBuilder::CheckNameConflict(const char *name, asCScriptNode *node, asCScriptCode *code) +{ + // TODO: Must verify object types in all config groups, whether the module has access or not + // Check against object types + if( engine->GetObjectType(name) != 0 ) + { + if( code ) + { + int r, c; + code->ConvertPosToRowCol(node->tokenPos, &r, &c); + + asCString str; + str.Format(TXT_NAME_CONFLICT_s_EXTENDED_TYPE, name); + WriteError(code->name.AddressOf(), str.AddressOf(), r, c); + } + + return -1; + } + + // TODO: Must verify global properties in all config groups, whether the module has access or not + // Check against global properties + asCGlobalProperty *prop = GetGlobalProperty(name, 0, 0, 0); + if( prop ) + { + if( code ) + { + int r, c; + code->ConvertPosToRowCol(node->tokenPos, &r, &c); + + asCString str; + str.Format(TXT_NAME_CONFLICT_s_GLOBAL_PROPERTY, name); + + WriteError(code->name.AddressOf(), str.AddressOf(), r, c); + } + + return -1; + } + + // TODO: Property names must be checked against function names + + // Check against class types + asUINT n; + for( n = 0; n < classDeclarations.GetLength(); n++ ) + { + if( classDeclarations[n]->name == name ) + { + if( code ) + { + int r, c; + code->ConvertPosToRowCol(node->tokenPos, &r, &c); + + asCString str; + str.Format(TXT_NAME_CONFLICT_s_STRUCT, name); + + WriteError(code->name.AddressOf(), str.AddressOf(), r, c); + } + + return -1; + } + } + + // Check against named types + for( n = 0; n < namedTypeDeclarations.GetLength(); n++ ) + { + if( namedTypeDeclarations[n]->name == name ) + { + if( code ) + { + int r, c; + code->ConvertPosToRowCol(node->tokenPos, &r, &c); + + asCString str; + + str.Format(TXT_NAME_CONFLICT_s_IS_NAMED_TYPE, name); + + WriteError(code->name.AddressOf(), str.AddressOf(), r, c); + } + + return -1; + } + } + + return 0; +} + + +int asCBuilder::RegisterGlobalVar(asCScriptNode *node, asCScriptCode *file) +{ + // What data type is it? + asCDataType type = CreateDataTypeFromNode(node->firstChild, file); + + if( !type.CanBeInstanciated() ) + { + asCString str; + // TODO: Change to "'type' cannot be declared as variable" + str.Format(TXT_DATA_TYPE_CANT_BE_s, type.Format().AddressOf()); + + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + + WriteError(file->name.AddressOf(), str.AddressOf(), r, c); + } + + asCScriptNode *n = node->firstChild->next; + + while( n ) + { + // Verify that the name isn't taken + asCString name(&file->code[n->tokenPos], n->tokenLength); + CheckNameConflict(name.AddressOf(), n, file); + + // Register the global variable + sGlobalVariableDescription *gvar = asNEW(sGlobalVariableDescription); + globVariables.PushLast(gvar); + + gvar->script = file; + gvar->name = name; + gvar->isCompiled = false; + gvar->datatype = type; + gvar->isEnumValue = false; + + // TODO: Give error message if wrong + asASSERT(!gvar->datatype.IsReference()); + + gvar->idNode = n; + gvar->nextNode = 0; + if( n->next && + (n->next->nodeType == snAssignment || + n->next->nodeType == snArgList || + n->next->nodeType == snInitList ) ) + { + gvar->nextNode = n->next; + n->next->DisconnectParent(); + } + + gvar->property = module->AllocateGlobalProperty(name.AddressOf(), gvar->datatype); + gvar->index = gvar->property->id; + + n = n->next; + } + + node->Destroy(engine); + + return 0; +} + +int asCBuilder::RegisterClass(asCScriptNode *node, asCScriptCode *file) +{ + asCScriptNode *n = node->firstChild; + asCString name(&file->code[n->tokenPos], n->tokenLength); + + int r, c; + file->ConvertPosToRowCol(n->tokenPos, &r, &c); + + CheckNameConflict(name.AddressOf(), n, file); + + sClassDeclaration *decl = asNEW(sClassDeclaration); + classDeclarations.PushLast(decl); + decl->name = name; + decl->script = file; + decl->validState = 0; + decl->node = node; + + asCObjectType *st = asNEW(asCObjectType)(engine); + st->flags = asOBJ_REF | asOBJ_SCRIPT_OBJECT; + + if( node->tokenType == ttHandle ) + st->flags |= asOBJ_IMPLICIT_HANDLE; + + st->size = sizeof(asCScriptObject); + st->name = name; + module->classTypes.PushLast(st); + engine->classTypes.PushLast(st); + st->AddRef(); + decl->objType = st; + + // Add script classes to the GC + engine->gc.AddScriptObjectToGC(st, &engine->objectTypeBehaviours); + + // Use the default script class behaviours + st->beh = engine->scriptTypeBehaviours.beh; + + // TODO: Move this to asCObjectType so that the asCRestore can reuse it + engine->scriptFunctions[st->beh.addref]->AddRef(); + engine->scriptFunctions[st->beh.release]->AddRef(); + engine->scriptFunctions[st->beh.gcEnumReferences]->AddRef(); + engine->scriptFunctions[st->beh.gcGetFlag]->AddRef(); + engine->scriptFunctions[st->beh.gcGetRefCount]->AddRef(); + engine->scriptFunctions[st->beh.gcReleaseAllReferences]->AddRef(); + engine->scriptFunctions[st->beh.gcSetFlag]->AddRef(); + engine->scriptFunctions[st->beh.copy]->AddRef(); + engine->scriptFunctions[st->beh.factory]->AddRef(); + engine->scriptFunctions[st->beh.construct]->AddRef(); + for( asUINT i = 1; i < st->beh.operators.GetLength(); i += 2 ) + engine->scriptFunctions[st->beh.operators[i]]->AddRef(); + + + return 0; +} + +int asCBuilder::RegisterInterface(asCScriptNode *node, asCScriptCode *file) +{ + asCScriptNode *n = node->firstChild; + asCString name(&file->code[n->tokenPos], n->tokenLength); + + int r, c; + file->ConvertPosToRowCol(n->tokenPos, &r, &c); + + CheckNameConflict(name.AddressOf(), n, file); + + sClassDeclaration *decl = asNEW(sClassDeclaration); + interfaceDeclarations.PushLast(decl); + decl->name = name; + decl->script = file; + decl->validState = 0; + decl->node = node; + + // Register the object type for the interface + asCObjectType *st = asNEW(asCObjectType)(engine); + st->flags = asOBJ_REF | asOBJ_SCRIPT_OBJECT; + st->size = 0; // Cannot be instanciated + st->name = name; + module->classTypes.PushLast(st); + engine->classTypes.PushLast(st); + st->AddRef(); + decl->objType = st; + + // Use the default script class behaviours + st->beh.construct = 0; + st->beh.addref = engine->scriptTypeBehaviours.beh.addref; + engine->scriptFunctions[st->beh.addref]->AddRef(); + st->beh.release = engine->scriptTypeBehaviours.beh.release; + engine->scriptFunctions[st->beh.release]->AddRef(); + st->beh.copy = 0; + + return 0; +} + + +void asCBuilder::CompileGlobalVariables() +{ + asUINT n; + + bool compileSucceeded = true; + + // Store state of compilation (errors, warning, output) + int currNumErrors = numErrors; + int currNumWarnings = numWarnings; + + // Backup the original message stream + bool msgCallback = engine->msgCallback; + asSSystemFunctionInterface msgCallbackFunc = engine->msgCallbackFunc; + void *msgCallbackObj = engine->msgCallbackObj; + + // Set the new temporary message stream + asCOutputBuffer outBuffer; + engine->SetMessageCallback(asMETHOD(asCOutputBuffer, Callback), &outBuffer, asCALL_THISCALL); + + asCOutputBuffer finalOutput; + asCScriptFunction func(engine, module, -1); + + asCArray initOrder; + + // We first try to compile all the primitive global variables, and only after that + // compile the non-primitive global variables. This permits the constructors + // for the complex types to use the already initialized variables of primitive + // type. Note, we currently don't know which global variables are used in the + // constructors, so we cannot guarantee that variables of complex types are + // initialized in the correct order, so we won't reorder those. + bool compilingPrimitives = true; + + // Compile each global variable + while( compileSucceeded ) + { + compileSucceeded = false; + + int accumErrors = 0; + int accumWarnings = 0; + + // Restore state of compilation + finalOutput.Clear(); + for( asUINT n = 0; n < globVariables.GetLength(); n++ ) + { + asCByteCode init(engine); + numWarnings = 0; + numErrors = 0; + outBuffer.Clear(); + func.globalVarPointers.SetLength(0); + + sGlobalVariableDescription *gvar = globVariables[n]; + if( gvar->isCompiled ) + continue; + + // Skip this for now if we're not compiling complex types yet + if( compilingPrimitives && !gvar->datatype.IsPrimitive() ) + continue; + + if( gvar->nextNode ) + { + int r, c; + gvar->script->ConvertPosToRowCol(gvar->nextNode->tokenPos, &r, &c); + asCString str = gvar->datatype.Format(); + str += " " + gvar->name; + str.Format(TXT_COMPILING_s, str.AddressOf()); + WriteInfo(gvar->script->name.AddressOf(), str.AddressOf(), r, c, true); + } + + if( gvar->isEnumValue ) + { + int r; + if( gvar->nextNode ) + { + asCCompiler comp(engine); + + // Temporarily switch the type of the variable to int so it can be compiled properly + asCDataType saveType; + saveType = gvar->datatype; + gvar->datatype = asCDataType::CreatePrimitive(ttInt, true); + r = comp.CompileGlobalVariable(this, gvar->script, gvar->nextNode, gvar, &func); + gvar->datatype = saveType; + } + else + { + r = 0; + + // When there is no assignment the value is the last + 1 + int enumVal = 0; + if( n > 0 ) + { + sGlobalVariableDescription *gvar2 = globVariables[n-1]; + if( gvar2->datatype == gvar->datatype ) + { + // The integer value is stored in the lower bytes + enumVal = (*(int*)&gvar2->constantValue) + 1; + + if( !gvar2->isCompiled ) + { + // TODO: Need to get the correct script position + int row, col; + gvar->script->ConvertPosToRowCol(0, &row, &col); + + asCString str = gvar->datatype.Format(); + str += " " + gvar->name; + str.Format(TXT_COMPILING_s, str.AddressOf()); + WriteInfo(gvar->script->name.AddressOf(), str.AddressOf(), row, col, true); + + str.Format(TXT_UNINITIALIZED_GLOBAL_VAR_s, gvar2->name.AddressOf()); + WriteError(gvar->script->name.AddressOf(), str.AddressOf(), row, col); + r = -1; + } + } + } + + // The integer value is stored in the lower bytes + *(int*)&gvar->constantValue = enumVal; + } + + if( r >= 0 ) + { + // Set the value as compiled + gvar->isCompiled = true; + compileSucceeded = true; + } + } + else + { + // Compile the global variable + asCCompiler comp(engine); + int r = comp.CompileGlobalVariable(this, gvar->script, gvar->nextNode, gvar, &func); + if( r >= 0 ) + { + // Compilation succeeded + gvar->isCompiled = true; + compileSucceeded = true; + + init.AddCode(&comp.byteCode); + } + } + + if( gvar->isCompiled ) + { + // Add warnings for this constant to the total build + if( numWarnings ) + { + currNumWarnings += numWarnings; + if( msgCallback ) + outBuffer.SendToCallback(engine, &msgCallbackFunc, msgCallbackObj); + } + + // Determine order of variable initializations + if( gvar->property && !gvar->isEnumValue ) + initOrder.PushLast(gvar->property); + + if( init.GetSize() > 0 ) + { + // Create the init function for this variable + asCScriptFunction *initFunc = asNEW(asCScriptFunction)(engine,module,asFUNC_SCRIPT); + initFunc->id = engine->GetNextScriptFunctionId(); + engine->SetScriptFunction(initFunc); + + // Finalize the init function for this variable + init.Ret(0); + init.Finalize(); + initFunc->byteCode.SetLength(init.GetSize()); + init.Output(initFunc->byteCode.AddressOf()); + initFunc->stackNeeded = init.largestStackUsed; + initFunc->returnType = asCDataType::CreatePrimitive(ttVoid, false); + initFunc->globalVarPointers = func.globalVarPointers; + initFunc->AddReferences(); + + // The function's refCount was already initialized to 1 + gvar->property->initFunc = initFunc; + } + } + else + { + // Add output to final output + finalOutput.Append(outBuffer); + accumErrors += numErrors; + accumWarnings += numWarnings; + } + + preMessage.isSet = false; + } + + if( !compileSucceeded ) + { + if( compilingPrimitives ) + { + // No more primitives could be compiled, so + // switch to compiling the complex variables + compilingPrimitives = false; + compileSucceeded = true; + } + else + { + // No more variables can be compiled + // Add errors and warnings to total build + currNumWarnings += accumWarnings; + currNumErrors += accumErrors; + if( msgCallback ) + finalOutput.SendToCallback(engine, &msgCallbackFunc, msgCallbackObj); + } + } + } + + // Restore states + engine->msgCallback = msgCallback; + engine->msgCallbackFunc = msgCallbackFunc; + engine->msgCallbackObj = msgCallbackObj; + + numWarnings = currNumWarnings; + numErrors = currNumErrors; + + // Set the correct order of initialization + if( numErrors == 0 ) + { + // If the length of the arrays are not the same, then this is the compilation + // of a single variable, in which case the initialization order of the previous + // variables must be preserved. + if( module->scriptGlobals.GetLength() == initOrder.GetLength() ) + module->scriptGlobals = initOrder; + } + + // Convert all variables compiled for the enums to true enum values + for( n = 0; n < globVariables.GetLength(); n++ ) + { + asCObjectType *objectType; + sGlobalVariableDescription *gvar = globVariables[n]; + if( !gvar->isEnumValue ) + continue; + + objectType = gvar->datatype.GetObjectType(); + asASSERT(NULL != objectType); + + asSEnumValue *e = asNEW(asSEnumValue); + e->name = gvar->name; + e->value = *(int*)&gvar->constantValue; + + objectType->enumValues.PushLast(e); + + // Destroy the gvar property + if( gvar->nextNode ) + gvar->nextNode->Destroy(engine); + if( gvar->property ) + asDELETE(gvar->property, asCGlobalProperty); + + asDELETE(gvar, sGlobalVariableDescription); + globVariables[n] = 0; + } + + // Clear the local function's global var pointers. Otherwise it will try to release them + // TODO: This shouldn't be necessary. Find a better way to do it + func.globalVarPointers.SetLength(0); +} + +void asCBuilder::CompileClasses() +{ + asUINT n; + asCArray toValidate((int)classDeclarations.GetLength()); + + // Determine class inheritances and interfaces + for( n = 0; n < classDeclarations.GetLength(); n++ ) + { + sClassDeclaration *decl = classDeclarations[n]; + asCScriptCode *file = decl->script; + + // Find the base class that this class inherits from + bool multipleInheritance = false; + asCScriptNode *node = decl->node->firstChild->next; + while( node && node->nodeType == snIdentifier ) + { + // Get the interface name from the node + asCString name(&file->code[node->tokenPos], node->tokenLength); + + // Find the object type for the interface + asCObjectType *objType = GetObjectType(name.AddressOf()); + + if( objType == 0 ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + asCString str; + str.Format(TXT_IDENTIFIER_s_NOT_DATA_TYPE, name.AddressOf()); + WriteError(file->name.AddressOf(), str.AddressOf(), r, c); + } + else if( !(objType->flags & asOBJ_SCRIPT_OBJECT) ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + asCString str; + str.Format(TXT_CANNOT_INHERIT_FROM_s, objType->name.AddressOf()); + WriteError(file->name.AddressOf(), str.AddressOf(), r, c); + } + else if( objType->size != 0 ) + { + // The class inherits from another script class + if( decl->objType->derivedFrom != 0 ) + { + if( !multipleInheritance ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + WriteError(file->name.AddressOf(), TXT_CANNOT_INHERIT_FROM_MULTIPLE_CLASSES, r, c); + multipleInheritance = true; + } + } + else + { + // Make sure none of the base classes inherit from this one + asCObjectType *base = objType; + bool error = false; + while( base != 0 ) + { + if( base == decl->objType ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + WriteError(file->name.AddressOf(), TXT_CANNOT_INHERIT_FROM_SELF, r, c); + error = true; + break; + } + + base = base->derivedFrom; + } + + if( !error ) + { + decl->objType->derivedFrom = objType; + objType->AddRef(); + } + } + } + else + { + // The class implements an interface + if( decl->objType->Implements(objType) ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + asCString msg; + msg.Format(TXT_INTERFACE_s_ALREADY_IMPLEMENTED, objType->GetName()); + WriteWarning(file->name.AddressOf(), msg.AddressOf(), r, c); + } + else + { + decl->objType->interfaces.PushLast(objType); + + // Make sure all the methods of the interface are implemented + for( asUINT i = 0; i < objType->methods.GetLength(); i++ ) + { + if( !DoesMethodExist(decl->objType, objType->methods[i]) ) + { + int r, c; + file->ConvertPosToRowCol(decl->node->tokenPos, &r, &c); + asCString str; + str.Format(TXT_MISSING_IMPLEMENTATION_OF_s, + engine->GetFunctionDeclaration(objType->methods[i]).AddressOf()); + WriteError(file->name.AddressOf(), str.AddressOf(), r, c); + } + } + } + } + + node = node->next; + } + } + + // Order class declarations so that base classes are compiled before derived classes. + // This will allow the derived classes to copy properties and methods in the next step. + for( n = 0; n < classDeclarations.GetLength(); n++ ) + { + sClassDeclaration *decl = classDeclarations[n]; + asCObjectType *derived = decl->objType; + asCObjectType *base = derived->derivedFrom; + + if( base == 0 ) continue; + + // If the base class is found after the derived class, then move the derived class to the end of the list + for( asUINT m = n+1; m < classDeclarations.GetLength(); m++ ) + { + sClassDeclaration *declBase = classDeclarations[m]; + if( base == declBase->objType ) + { + classDeclarations.RemoveIndex(n); + classDeclarations.PushLast(decl); + + // Decrease index so that we don't skip an entry + n--; + break; + } + } + } + + // Go through each of the classes and register the object type descriptions + for( n = 0; n < classDeclarations.GetLength(); n++ ) + { + sClassDeclaration *decl = classDeclarations[n]; + + // Add all properties and methods from the base class + if( decl->objType->derivedFrom ) + { + asCObjectType *baseType = decl->objType->derivedFrom; + + // The derived class inherits all interfaces from the base class + for( unsigned int n = 0; n < baseType->interfaces.GetLength(); n++ ) + { + if( !decl->objType->Implements(baseType->interfaces[n]) ) + { + decl->objType->interfaces.PushLast(baseType->interfaces[n]); + } + else + { + // Warn if derived class already implements the interface + int r, c; + decl->script->ConvertPosToRowCol(decl->node->tokenPos, &r, &c); + asCString msg; + msg.Format(TXT_INTERFACE_s_ALREADY_IMPLEMENTED, baseType->interfaces[n]->GetName()); + WriteWarning(decl->script->name.AddressOf(), msg.AddressOf(), r, c); + } + } + + // TODO: Need to check for name conflict with new class methods + + // Copy properties from base class to derived class + for( asUINT p = 0; p < baseType->properties.GetLength(); p++ ) + { + asCObjectProperty *prop = AddPropertyToClass(decl, baseType->properties[p]->name, baseType->properties[p]->type); + + // The properties must maintain the same offset + asASSERT(prop->byteOffset == baseType->properties[p]->byteOffset); UNUSED_VAR(prop); + } + + // Copy methods from base class to derived class + for( asUINT m = 0; m < baseType->methods.GetLength(); m++ ) + { + // If the derived class implements the same method, then don't add the base class' method + asCScriptFunction *baseFunc = GetFunctionDescription(baseType->methods[m]); + asCScriptFunction *derivedFunc = 0; + bool found = false; + for( asUINT d = 0; d < decl->objType->methods.GetLength(); d++ ) + { + derivedFunc = GetFunctionDescription(decl->objType->methods[d]); + if( derivedFunc->IsSignatureEqual(baseFunc) ) + { + // Move the function from the methods array to the virtualFunctionTable + decl->objType->methods.RemoveIndex(d); + decl->objType->virtualFunctionTable.PushLast(derivedFunc); + found = true; + break; + } + } + + if( !found ) + { + // Push the base class function on the virtual function table + decl->objType->virtualFunctionTable.PushLast(baseType->virtualFunctionTable[m]); + baseType->virtualFunctionTable[m]->AddRef(); + } + + decl->objType->methods.PushLast(baseType->methods[m]); + engine->scriptFunctions[baseType->methods[m]]->AddRef(); + } + } + + // Move this class' methods into the virtual function table + for( asUINT m = 0; m < decl->objType->methods.GetLength(); m++ ) + { + asCScriptFunction *func = GetFunctionDescription(decl->objType->methods[m]); + if( func->funcType != asFUNC_VIRTUAL ) + { + // Move the reference from the method list to the virtual function list + decl->objType->methods.RemoveIndex(m); + decl->objType->virtualFunctionTable.PushLast(func); + + // Substitute the function description in the method list for a virtual method + // Make sure the methods are in the same order as the virtual function table + decl->objType->methods.PushLast(CreateVirtualFunction(func, (int)decl->objType->virtualFunctionTable.GetLength() - 1)); + m--; + } + } + + // Enumerate each of the declared properties + asCScriptNode *node = decl->node->firstChild->next; + + // Skip list of classes and interfaces + while( node && node->nodeType == snIdentifier ) + node = node->next; + + while( node ) + { + if( node->nodeType == snDeclaration ) + { + asCScriptCode *file = decl->script; + asCDataType dt = CreateDataTypeFromNode(node->firstChild, file); + asCString name(&file->code[node->lastChild->tokenPos], node->lastChild->tokenLength); + + if( dt.IsReadOnly() ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + + WriteError(file->name.AddressOf(), TXT_PROPERTY_CANT_BE_CONST, r, c); + } + + asCDataType st; + st.SetObjectType(decl->objType); + CheckNameConflictMember(st, name.AddressOf(), node->lastChild, file); + + AddPropertyToClass(decl, name, dt, file, node); + } + else + asASSERT(false); + + node = node->next; + } + + toValidate.PushLast(decl); + } + + // Verify that the declared structures are valid, e.g. that the structure + // doesn't contain a member of its own type directly or indirectly + while( toValidate.GetLength() > 0 ) + { + asUINT numClasses = (asUINT)toValidate.GetLength(); + + asCArray toValidateNext((int)toValidate.GetLength()); + while( toValidate.GetLength() > 0 ) + { + sClassDeclaration *decl = toValidate[toValidate.GetLength()-1]; + int validState = 1; + for( asUINT n = 0; n < decl->objType->properties.GetLength(); n++ ) + { + // A valid structure is one that uses only primitives or other valid objects + asCObjectProperty *prop = decl->objType->properties[n]; + asCDataType dt = prop->type; + + if( dt.IsTemplate() ) + { + asCDataType sub = dt; + while( sub.IsTemplate() && !sub.IsObjectHandle() ) + sub = sub.GetSubType(); + + dt = sub; + } + + if( dt.IsObject() && !dt.IsObjectHandle() ) + { + // Find the class declaration + sClassDeclaration *pdecl = 0; + for( asUINT p = 0; p < classDeclarations.GetLength(); p++ ) + { + if( classDeclarations[p]->objType == dt.GetObjectType() ) + { + pdecl = classDeclarations[p]; + break; + } + } + + if( pdecl ) + { + if( pdecl->objType == decl->objType ) + { + int r, c; + decl->script->ConvertPosToRowCol(decl->node->tokenPos, &r, &c); + WriteError(decl->script->name.AddressOf(), TXT_ILLEGAL_MEMBER_TYPE, r, c); + validState = 2; + break; + } + else if( pdecl->validState != 1 ) + { + validState = pdecl->validState; + break; + } + } + } + } + + if( validState == 1 ) + { + decl->validState = 1; + toValidate.PopLast(); + } + else if( validState == 2 ) + { + decl->validState = 2; + toValidate.PopLast(); + } + else + { + toValidateNext.PushLast(toValidate.PopLast()); + } + } + + toValidate = toValidateNext; + toValidateNext.SetLength(0); + + if( numClasses == toValidate.GetLength() ) + { + int r, c; + toValidate[0]->script->ConvertPosToRowCol(toValidate[0]->node->tokenPos, &r, &c); + WriteError(toValidate[0]->script->name.AddressOf(), TXT_ILLEGAL_MEMBER_TYPE, r, c); + break; + } + } + + if( numErrors > 0 ) return; + + // TODO: The declarations form a graph, all circles in + // the graph must be flagged as potential circles + + // Verify potential circular references + for( n = 0; n < classDeclarations.GetLength(); n++ ) + { + sClassDeclaration *decl = classDeclarations[n]; + asCObjectType *ot = decl->objType; + + // Is there some path in which this structure is involved in circular references? + for( asUINT p = 0; p < ot->properties.GetLength(); p++ ) + { + asCDataType dt = ot->properties[p]->type; + if( dt.IsObject() ) + { + if( dt.IsObjectHandle() ) + { + // TODO: Can this handle really generate a circular reference? + // Only if the handle is of a type that can reference this type, either directly or indirectly + + ot->flags |= asOBJ_GC; + } + else if( dt.GetObjectType()->flags & asOBJ_GC ) + { + // TODO: Just because the member type is a potential circle doesn't mean that this one is + // Only if the object is of a type that can reference this type, either directly or indirectly + + ot->flags |= asOBJ_GC; + } + + if( dt.IsArrayType() ) + { + asCDataType sub = dt.GetSubType(); + while( sub.IsObject() ) + { + if( sub.IsObjectHandle() || (sub.GetObjectType()->flags & asOBJ_GC) ) + { + decl->objType->flags |= asOBJ_GC; + + // Make sure the array object is also marked as potential circle + sub = dt; + while( sub.IsTemplate() ) + { + sub.GetObjectType()->flags |= asOBJ_GC; + sub = sub.GetSubType(); + } + + break; + } + + if( sub.IsTemplate() ) + sub = sub.GetSubType(); + else + break; + } + } + } + } + } +} + +int asCBuilder::CreateVirtualFunction(asCScriptFunction *func, int idx) +{ + asCScriptFunction *vf = asNEW(asCScriptFunction)(engine, module, asFUNC_VIRTUAL); + + vf->funcType = asFUNC_VIRTUAL; + vf->name = func->name; + vf->returnType = func->returnType; + vf->parameterTypes = func->parameterTypes; + vf->inOutFlags = func->inOutFlags; + vf->id = engine->GetNextScriptFunctionId(); + vf->scriptSectionIdx = func->scriptSectionIdx; + vf->isReadOnly = func->isReadOnly; + vf->objectType = func->objectType; + vf->signatureId = func->signatureId; + vf->vfTableIdx = idx; + + module->AddScriptFunction(vf); + + // Add a dummy to the builder so that it doesn't mix up function ids + functions.PushLast(0); + + return vf->id; +} + +asCObjectProperty *asCBuilder::AddPropertyToClass(sClassDeclaration *decl, const asCString &name, const asCDataType &dt, asCScriptCode *file, asCScriptNode *node) +{ + // Store the properties in the object type descriptor + asCObjectProperty *prop = asNEW(asCObjectProperty); + prop->name = name; + prop->type = dt; + + int propSize; + if( dt.IsObject() ) + { + propSize = dt.GetSizeOnStackDWords()*4; + if( !dt.IsObjectHandle() ) + { + if( !dt.CanBeInstanciated() ) + { + asASSERT( file && node ); + + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + asCString str; + str.Format(TXT_DATA_TYPE_CANT_BE_s, dt.Format().AddressOf()); + WriteError(file->name.AddressOf(), str.AddressOf(), r, c); + } + prop->type.MakeReference(true); + } + } + else + { + propSize = dt.GetSizeInMemoryBytes(); + if( propSize == 0 && file && node ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + asCString str; + str.Format(TXT_DATA_TYPE_CANT_BE_s, dt.Format().AddressOf()); + WriteError(file->name.AddressOf(), str.AddressOf(), r, c); + } + } + + // Add extra bytes so that the property will be properly aligned + if( propSize == 2 && (decl->objType->size & 1) ) decl->objType->size += 1; + if( propSize > 2 && (decl->objType->size & 3) ) decl->objType->size += 4 - (decl->objType->size & 3); + + prop->byteOffset = decl->objType->size; + decl->objType->size += propSize; + + decl->objType->properties.PushLast(prop); + + // Make sure the struct holds a reference to the config group where the object is registered + asCConfigGroup *group = engine->FindConfigGroupForObjectType(prop->type.GetObjectType()); + if( group != 0 ) group->AddRef(); + + return prop; +} + +bool asCBuilder::DoesMethodExist(asCObjectType *objType, int methodId) +{ + asCScriptFunction *method = GetFunctionDescription(methodId); + + for( asUINT n = 0; n < objType->methods.GetLength(); n++ ) + { + asCScriptFunction *m = GetFunctionDescription(objType->methods[n]); + + if( m->name != method->name ) continue; + if( m->returnType != method->returnType ) continue; + if( m->isReadOnly != method->isReadOnly ) continue; + if( m->parameterTypes != method->parameterTypes ) continue; + if( m->inOutFlags != method->inOutFlags ) continue; + + return true; + } + + return false; +} + +void asCBuilder::AddDefaultConstructor(asCObjectType *objType, asCScriptCode *file) +{ + int funcId = engine->GetNextScriptFunctionId(); + + asCDataType returnType = asCDataType::CreatePrimitive(ttVoid, false); + asCArray parameterTypes; + asCArray inOutFlags; + + // Add the script function + module->AddScriptFunction(file->idx, funcId, objType->name.AddressOf(), returnType, parameterTypes.AddressOf(), inOutFlags.AddressOf(), (asUINT)parameterTypes.GetLength(), false, objType); + + // Set it as default constructor + if( objType->beh.construct ) + engine->scriptFunctions[objType->beh.construct]->Release(); + objType->beh.construct = funcId; + objType->beh.constructors[0] = funcId; + engine->scriptFunctions[funcId]->AddRef(); + + // The bytecode for the default constructor will be generated + // only after the potential inheritance has been established + sFunctionDescription *func = asNEW(sFunctionDescription); + functions.PushLast(func); + + func->script = file; + func->node = 0; + func->name = objType->name; + func->objType = objType; + func->funcId = funcId; + + // Add a default factory as well + funcId = engine->GetNextScriptFunctionId(); + if( objType->beh.factory ) + engine->scriptFunctions[objType->beh.factory]->Release(); + objType->beh.factory = funcId; + objType->beh.factories[0] = funcId; + returnType = asCDataType::CreateObjectHandle(objType, false); + module->AddScriptFunction(file->idx, funcId, objType->name.AddressOf(), returnType, parameterTypes.AddressOf(), inOutFlags.AddressOf(), (asUINT)parameterTypes.GetLength(), false); + functions.PushLast(0); + asCCompiler compiler(engine); + compiler.CompileFactory(this, file, engine->scriptFunctions[funcId]); + engine->scriptFunctions[funcId]->AddRef(); +} + +int asCBuilder::RegisterEnum(asCScriptNode *node, asCScriptCode *file) +{ + // Grab the name of the enumeration + asCScriptNode *tmp = node->firstChild; + asASSERT(snDataType == tmp->nodeType); + + asCString name; + asASSERT(snIdentifier == tmp->firstChild->nodeType); + name.Assign(&file->code[tmp->firstChild->tokenPos], tmp->firstChild->tokenLength); + + // Check the name and add the enum + int r = CheckNameConflict(name.AddressOf(), tmp->firstChild, file); + if( asSUCCESS == r ) + { + asCObjectType *st; + asCDataType dataType; + + st = asNEW(asCObjectType)(engine); + dataType.CreatePrimitive(ttInt, false); + + st->flags = asOBJ_ENUM; + st->size = dataType.GetSizeInMemoryBytes(); + st->name = name; + + module->enumTypes.PushLast(st); + st->AddRef(); + engine->classTypes.PushLast(st); + + // Store the location of this declaration for reference in name collisions + sClassDeclaration *decl = asNEW(sClassDeclaration); + decl->name = name; + decl->script = file; + decl->validState = 0; + decl->node = NULL; + decl->objType = st; + namedTypeDeclarations.PushLast(decl); + + asCDataType type = CreateDataTypeFromNode(tmp, file); + asASSERT(!type.IsReference()); + + tmp = tmp->next; + + while( tmp ) + { + asASSERT(snIdentifier == tmp->nodeType); + + asCString name(&file->code[tmp->tokenPos], tmp->tokenLength); + + // TODO: Should only have to check for conflicts within the enum type + // Check for name conflict errors + r = CheckNameConflict(name.AddressOf(), tmp, file); + if(asSUCCESS != r) + { + continue; + } + + // check for assignment + asCScriptNode *asnNode = tmp->next; + if( asnNode && snAssignment == asnNode->nodeType ) + asnNode->DisconnectParent(); + else + asnNode = 0; + + // Create the global variable description so the enum value can be evaluated + sGlobalVariableDescription *gvar = asNEW(sGlobalVariableDescription); + globVariables.PushLast(gvar); + + gvar->script = file; + gvar->idNode = 0; + gvar->nextNode = asnNode; + gvar->name = name; + gvar->datatype = type; + // No need to allocate space on the global memory stack since the values are stored in the asCObjectType + gvar->index = 0; + gvar->isCompiled = false; + gvar->isPureConstant = true; + gvar->isEnumValue = true; + gvar->constantValue = 0xdeadbeef; + + // Allocate dummy property so we can compile the value. + // This will be removed later on so we don't add it to the engine. + gvar->property = asNEW(asCGlobalProperty); + gvar->property->name = name; + gvar->property->type = gvar->datatype; + gvar->property->id = 0; + + tmp = tmp->next; + } + } + + node->Destroy(engine); + + return r; +} + +int asCBuilder::RegisterTypedef(asCScriptNode *node, asCScriptCode *file) +{ + // Get the native data type + asCScriptNode *tmp = node->firstChild; + asASSERT(NULL != tmp && snDataType == tmp->nodeType); + asCDataType dataType; + dataType.CreatePrimitive(tmp->tokenType, false); + dataType.SetTokenType(tmp->tokenType); + tmp = tmp->next; + + // Grab the name of the typedef + asASSERT(NULL != tmp && NULL == tmp->next); + asCString name; + name.Assign(&file->code[tmp->tokenPos], tmp->tokenLength); + + // If the name is not already in use add it + int r = CheckNameConflict(name.AddressOf(), tmp, file); + if( asSUCCESS == r ) + { + // Create the new type + asCObjectType *st = asNEW(asCObjectType)(engine); + + st->flags = asOBJ_TYPEDEF; + st->size = dataType.GetSizeInMemoryBytes(); + st->name = name; + st->templateSubType = dataType; + + st->AddRef(); + + module->typeDefs.PushLast(st); + engine->classTypes.PushLast(st); + + // Store the location of this declaration for reference in name collisions + sClassDeclaration *decl = asNEW(sClassDeclaration); + decl->name = name; + decl->script = file; + decl->validState = 0; + decl->node = NULL; + decl->objType = st; + namedTypeDeclarations.PushLast(decl); + } + + node->Destroy(engine); + + if( r < 0 ) + { + engine->ConfigError(r); + } + + return 0; +} + +void asCBuilder::GetParsedFunctionDetails(asCScriptNode *node, asCScriptCode *file, asCObjectType *objType, asCString &name, asCDataType &returnType, asCArray ¶meterTypes, asCArray &inOutFlags, bool &isConstMethod, bool &isConstructor, bool &isDestructor) +{ + // Find the name + isConstructor = false; + isDestructor = false; + asCScriptNode *n = 0; + if( node->firstChild->nodeType == snDataType ) + n = node->firstChild->next->next; + else + { + // If the first node is a ~ token, then we know it is a destructor + if( node->firstChild->tokenType == ttBitNot ) + { + n = node->firstChild->next; + isDestructor = true; + } + else + { + n = node->firstChild; + isConstructor = true; + } + } + name.Assign(&file->code[n->tokenPos], n->tokenLength); + + // Initialize a script function object for registration + if( !isConstructor && !isDestructor ) + { + returnType = CreateDataTypeFromNode(node->firstChild, file); + returnType = ModifyDataTypeFromNode(returnType, node->firstChild->next, file, 0, 0); + } + else + returnType = asCDataType::CreatePrimitive(ttVoid, false); + + // Is this a const method? + if( objType && n->next->next && n->next->next->tokenType == ttConst ) + isConstMethod = true; + else + isConstMethod = false; + + // Count the number of parameters + int count = 0; + asCScriptNode *c = n->next->firstChild; + while( c ) + { + count++; + c = c->next->next; + if( c && c->nodeType == snIdentifier ) + c = c->next; + } + + // Get the parameter types + parameterTypes.Allocate(count, false); + inOutFlags.Allocate(count, false); + n = n->next->firstChild; + while( n ) + { + asETypeModifiers inOutFlag; + asCDataType type = CreateDataTypeFromNode(n, file); + type = ModifyDataTypeFromNode(type, n->next, file, &inOutFlag, 0); + + // Store the parameter type + parameterTypes.PushLast(type); + inOutFlags.PushLast(inOutFlag); + + // Move to next parameter + n = n->next->next; + if( n && n->nodeType == snIdentifier ) + n = n->next; + } +} + + +int asCBuilder::RegisterScriptFunction(int funcID, asCScriptNode *node, asCScriptCode *file, asCObjectType *objType, bool isInterface, bool isGlobalFunction) +{ + asCString name; + asCDataType returnType; + asCArray parameterTypes; + asCArray inOutFlags; + bool isConstMethod; + bool isConstructor; + bool isDestructor; + + GetParsedFunctionDetails(node, file, objType, name, returnType, parameterTypes, inOutFlags, isConstMethod, isConstructor, isDestructor); + + // Check for name conflicts + if( !isConstructor && !isDestructor ) + { + asCDataType dt = asCDataType::CreateObject(objType, false); + if( objType ) + CheckNameConflictMember(dt, name.AddressOf(), node, file); + else + CheckNameConflict(name.AddressOf(), node, file); + } + else + { + // Verify that the name of the constructor/destructor is the same as the class + if( name != objType->name ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + WriteError(file->name.AddressOf(), TXT_CONSTRUCTOR_NAME_ERROR, r, c); + } + + if( isDestructor ) + name = "~" + name; + } + + if( !isInterface ) + { + sFunctionDescription *func = asNEW(sFunctionDescription); + functions.PushLast(func); + + func->script = file; + func->node = node; + func->name = name; + func->objType = objType; + func->funcId = funcID; + } + + // Destructors may not have any parameters + if( isDestructor && parameterTypes.GetLength() > 0 ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + + WriteError(file->name.AddressOf(), TXT_DESTRUCTOR_MAY_NOT_HAVE_PARM, r, c); + } + + // TODO: Much of this can probably be reduced by using the IsSignatureEqual method + // Check that the same function hasn't been registered already + asCArray funcs; + GetFunctionDescriptions(name.AddressOf(), funcs); + if( funcs.GetLength() ) + { + for( asUINT n = 0; n < funcs.GetLength(); ++n ) + { + asCScriptFunction *func = GetFunctionDescription(funcs[n]); + + if( parameterTypes.GetLength() == func->parameterTypes.GetLength() ) + { + bool match = true; + if( func->objectType != objType ) + { + match = false; + break; + } + + for( asUINT p = 0; p < parameterTypes.GetLength(); ++p ) + { + if( parameterTypes[p] != func->parameterTypes[p] ) + { + match = false; + break; + } + } + + if( match ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + + WriteError(file->name.AddressOf(), TXT_FUNCTION_ALREADY_EXIST, r, c); + break; + } + } + } + } + + // Register the function + module->AddScriptFunction(file->idx, funcID, name.AddressOf(), returnType, parameterTypes.AddressOf(), inOutFlags.AddressOf(), (asUINT)parameterTypes.GetLength(), isInterface, objType, isConstMethod, isGlobalFunction); + + if( objType ) + { + engine->scriptFunctions[funcID]->AddRef(); + if( isConstructor ) + { + int factoryId = engine->GetNextScriptFunctionId(); + if( parameterTypes.GetLength() == 0 ) + { + // Overload the default constructor + engine->scriptFunctions[objType->beh.construct]->Release(); + objType->beh.construct = funcID; + objType->beh.constructors[0] = funcID; + + // Register the default factory as well + engine->scriptFunctions[objType->beh.factory]->Release(); + objType->beh.factory = factoryId; + objType->beh.factories[0] = factoryId; + } + else + { + objType->beh.constructors.PushLast(funcID); + + // Register the factory as well + objType->beh.factories.PushLast(factoryId); + } + + asCDataType dt = asCDataType::CreateObjectHandle(objType, false); + module->AddScriptFunction(file->idx, factoryId, name.AddressOf(), dt, parameterTypes.AddressOf(), inOutFlags.AddressOf(), (asUINT)parameterTypes.GetLength(), false); + + // Add a dummy function to the module so that it doesn't mix up the fund Ids + functions.PushLast(0); + + // Compile the factory immediately + asCCompiler compiler(engine); + compiler.CompileFactory(this, file, engine->scriptFunctions[factoryId]); + engine->scriptFunctions[factoryId]->AddRef(); + } + else if( isDestructor ) + objType->beh.destruct = funcID; + else + objType->methods.PushLast(funcID); + } + + // We need to delete the node already if this is an interface method + if( isInterface && node ) + { + node->Destroy(engine); + } + + return 0; +} + +int asCBuilder::RegisterImportedFunction(int importID, asCScriptNode *node, asCScriptCode *file) +{ + // Find name + asCScriptNode *f = node->firstChild; + asCScriptNode *n = f->firstChild->next->next; + + // Check for name conflicts + asCString name(&file->code[n->tokenPos], n->tokenLength); + CheckNameConflict(name.AddressOf(), n, file); + + // Initialize a script function object for registration + asCDataType returnType; + returnType = CreateDataTypeFromNode(f->firstChild, file); + returnType = ModifyDataTypeFromNode(returnType, f->firstChild->next, file, 0, 0); + + // Count the parameters + int count = 0; + asCScriptNode *c = n->next->firstChild; + while( c ) + { + count++; + c = c->next->next; + if( c && c->nodeType == snIdentifier ) + c = c->next; + } + + asCArray parameterTypes(count); + asCArray inOutFlags(count); + n = n->next->firstChild; + while( n ) + { + asETypeModifiers inOutFlag; + asCDataType type = CreateDataTypeFromNode(n, file); + type = ModifyDataTypeFromNode(type, n->next, file, &inOutFlag, 0); + + // Store the parameter type + n = n->next->next; + parameterTypes.PushLast(type); + inOutFlags.PushLast(inOutFlag); + + // Move to next parameter + if( n && n->nodeType == snIdentifier ) + n = n->next; + } + + // Check that the same function hasn't been registered already + asCArray funcs; + GetFunctionDescriptions(name.AddressOf(), funcs); + if( funcs.GetLength() ) + { + for( asUINT n = 0; n < funcs.GetLength(); ++n ) + { + asCScriptFunction *func = GetFunctionDescription(funcs[n]); + + // TODO: Isn't the name guaranteed to be equal, because of GetFunctionDescriptions()? + if( name == func->name && + parameterTypes.GetLength() == func->parameterTypes.GetLength() ) + { + bool match = true; + for( asUINT p = 0; p < parameterTypes.GetLength(); ++p ) + { + if( parameterTypes[p] != func->parameterTypes[p] ) + { + match = false; + break; + } + } + + if( match ) + { + int r, c; + file->ConvertPosToRowCol(node->tokenPos, &r, &c); + + WriteError(file->name.AddressOf(), TXT_FUNCTION_ALREADY_EXIST, r, c); + break; + } + } + } + } + + // Read the module name as well + n = node->firstChild->next; + asCString moduleName; + moduleName.Assign(&file->code[n->tokenPos+1], n->tokenLength-2); + + node->Destroy(engine); + + // Register the function + module->AddImportedFunction(importID, name.AddressOf(), returnType, parameterTypes.AddressOf(), inOutFlags.AddressOf(), (asUINT)parameterTypes.GetLength(), moduleName); + + return 0; +} + + +asCScriptFunction *asCBuilder::GetFunctionDescription(int id) +{ + // TODO: This should be improved + // Get the description from the engine + if( (id & 0xFFFF0000) == 0 ) + return engine->scriptFunctions[id]; + else + return engine->importedFunctions[id & 0xFFFF]->importedFunctionSignature; +} + +void asCBuilder::GetFunctionDescriptions(const char *name, asCArray &funcs) +{ + asUINT n; + // TODO: optimize: Improve linear search + for( n = 0; n < module->scriptFunctions.GetLength(); n++ ) + { + if( module->scriptFunctions[n]->name == name && + module->scriptFunctions[n]->objectType == 0 ) + funcs.PushLast(module->scriptFunctions[n]->id); + } + + // TODO: optimize: Improve linear search + for( n = 0; n < module->bindInformations.GetLength(); n++ ) + { + if( module->bindInformations[n]->importedFunctionSignature->name == name ) + funcs.PushLast(module->bindInformations[n]->importedFunctionSignature->id); + } + + // TODO: optimize: Improve linear search + // TODO: optimize: Use the registeredGlobalFunctions array instead + for( n = 0; n < engine->scriptFunctions.GetLength(); n++ ) + { + if( engine->scriptFunctions[n] && + engine->scriptFunctions[n]->funcType == asFUNC_SYSTEM && + engine->scriptFunctions[n]->objectType == 0 && + engine->scriptFunctions[n]->name == name ) + { + // Find the config group for the global function + asCConfigGroup *group = engine->FindConfigGroupForFunction(engine->scriptFunctions[n]->id); + if( !group || group->HasModuleAccess(module->name.AddressOf()) ) + funcs.PushLast(engine->scriptFunctions[n]->id); + } + } +} + +void asCBuilder::GetObjectMethodDescriptions(const char *name, asCObjectType *objectType, asCArray &methods, bool objIsConst, const asCString &scope) +{ + if( scope != "" ) + { + // Find the base class with the specified scope + while( objectType && objectType->name != scope ) + objectType = objectType->derivedFrom; + + // If the scope is not any of the base classes, then return no methods + if( objectType == 0 ) + return; + } + + // TODO: optimize: Improve linear search + if( objIsConst ) + { + // Only add const methods to the list + for( asUINT n = 0; n < objectType->methods.GetLength(); n++ ) + { + if( engine->scriptFunctions[objectType->methods[n]]->name == name && + engine->scriptFunctions[objectType->methods[n]]->isReadOnly ) + { + // When the scope is defined the returned methods should be the true methods, not the virtual method stubs + if( scope == "" ) + methods.PushLast(engine->scriptFunctions[objectType->methods[n]]->id); + else + { + asCScriptFunction *virtFunc = engine->scriptFunctions[objectType->methods[n]]; + asCScriptFunction *realFunc = objectType->virtualFunctionTable[virtFunc->vfTableIdx]; + methods.PushLast(realFunc->id); + } + } + } + } + else + { + // TODO: Prefer non-const over const + for( asUINT n = 0; n < objectType->methods.GetLength(); n++ ) + { + if( engine->scriptFunctions[objectType->methods[n]]->name == name ) + { + // When the scope is defined the returned methods should be the true methods, not the virtual method stubs + if( scope == "" ) + methods.PushLast(engine->scriptFunctions[objectType->methods[n]]->id); + else + { + asCScriptFunction *virtFunc = engine->scriptFunctions[objectType->methods[n]]; + asCScriptFunction *realFunc = objectType->virtualFunctionTable[virtFunc->vfTableIdx]; + methods.PushLast(realFunc->id); + } + } + } + } +} + +void asCBuilder::WriteInfo(const char *scriptname, const char *message, int r, int c, bool pre) +{ + // Need to store the pre message in a structure + if( pre ) + { + preMessage.isSet = true; + preMessage.c = c; + preMessage.r = r; + preMessage.message = message; + } + else + { + preMessage.isSet = false; + engine->WriteMessage(scriptname, r, c, asMSGTYPE_INFORMATION, message); + } +} + +void asCBuilder::WriteError(const char *scriptname, const char *message, int r, int c) +{ + numErrors++; + + // Need to pass the preMessage first + if( preMessage.isSet ) + WriteInfo(scriptname, preMessage.message.AddressOf(), preMessage.r, preMessage.c, false); + + engine->WriteMessage(scriptname, r, c, asMSGTYPE_ERROR, message); +} + +void asCBuilder::WriteWarning(const char *scriptname, const char *message, int r, int c) +{ + numWarnings++; + + // Need to pass the preMessage first + if( preMessage.isSet ) + WriteInfo(scriptname, preMessage.message.AddressOf(), preMessage.r, preMessage.c, false); + + engine->WriteMessage(scriptname, r, c, asMSGTYPE_WARNING, message); +} + + +asCDataType asCBuilder::CreateDataTypeFromNode(asCScriptNode *node, asCScriptCode *file, bool acceptHandleForScope, asCObjectType *templateType) +{ + asASSERT(node->nodeType == snDataType); + + asCDataType dt; + + asCScriptNode *n = node->firstChild; + + bool isConst = false; + bool isImplicitHandle = false; + if( n->tokenType == ttConst ) + { + isConst = true; + n = n->next; + } + + if( n->tokenType == ttIdentifier ) + { + asCString str; + str.Assign(&file->code[n->tokenPos], n->tokenLength); + + asCObjectType *ot = 0; + + // If this is for a template type, then we must first determine if the + // identifier matches any of the template subtypes + // TODO: template: it should be possible to have more than one subtypes + if( templateType && (templateType->flags & asOBJ_TEMPLATE) && str == templateType->templateSubType.GetObjectType()->name ) + ot = templateType->templateSubType.GetObjectType(); + + if( ot == 0 ) + ot = GetObjectType(str.AddressOf()); + + if( ot == 0 ) + { + asCString msg; + msg.Format(TXT_IDENTIFIER_s_NOT_DATA_TYPE, (const char *)str.AddressOf()); + + int r, c; + file->ConvertPosToRowCol(n->tokenPos, &r, &c); + + WriteError(file->name.AddressOf(), msg.AddressOf(), r, c); + + dt.SetTokenType(ttInt); + } + else + { + if( ot->flags & asOBJ_IMPLICIT_HANDLE ) + isImplicitHandle = true; + + // Find the config group for the object type + asCConfigGroup *group = engine->FindConfigGroupForObjectType(ot); + if( !module || !group || group->HasModuleAccess(module->name.AddressOf()) ) + { + if(asOBJ_TYPEDEF == (ot->flags & asOBJ_TYPEDEF)) + { + // TODO: typedef: A typedef should be considered different from the original type (though with implicit conversions between the two) + // Create primitive data type based on object flags + dt = ot->templateSubType; + dt.MakeReadOnly(isConst); + } + else + { + if( ot->flags & asOBJ_TEMPLATE ) + { + n = n->next; + + // Check if the subtype is a type or the template's subtype + // if it is the template's subtype then this is the actual template type, + // orderwise it is a template instance. + asCDataType subType = CreateDataTypeFromNode(n, file, false, ot); + if( subType.GetObjectType() != ot->templateSubType.GetObjectType() ) + { + // This is a template instance + // Need to find the correct object type + asCObjectType *otInstance = engine->GetTemplateInstanceType(ot, subType); + + if( !otInstance ) + { + asCString msg; + msg.Format(TXT_CANNOT_INSTANCIATE_TEMPLATE_s_WITH_s, ot->name.AddressOf(), subType.Format().AddressOf()); + int r, c; + file->ConvertPosToRowCol(n->tokenPos, &r, &c); + WriteError(file->name.AddressOf(), msg.AddressOf(), r, c); + } + + ot = otInstance; + } + } + + // Create object data type + if( ot ) + dt = asCDataType::CreateObject(ot, isConst); + else + dt = asCDataType::CreatePrimitive(ttInt, isConst); + } + } + else + { + asCString msg; + msg.Format(TXT_TYPE_s_NOT_AVAILABLE_FOR_MODULE, (const char *)str.AddressOf()); + + int r, c; + file->ConvertPosToRowCol(n->tokenPos, &r, &c); + + WriteError(file->name.AddressOf(), msg.AddressOf(), r, c); + + dt.SetTokenType(ttInt); + } + } + } + else + { + // Create primitive data type + dt = asCDataType::CreatePrimitive(n->tokenType, isConst); + } + + // Determine array dimensions and object handles + n = n->next; + while( n && (n->tokenType == ttOpenBracket || n->tokenType == ttHandle) ) + { + if( n->tokenType == ttOpenBracket ) + { + // Make sure the sub type can be instanciated + if( !dt.CanBeInstanciated() ) + { + int r, c; + file->ConvertPosToRowCol(n->tokenPos, &r, &c); + + asCString str; + // TODO: Change to "Array sub type cannot be 'type'" + str.Format(TXT_DATA_TYPE_CANT_BE_s, dt.Format().AddressOf()); + + WriteError(file->name.AddressOf(), str.AddressOf(), r, c); + } + + // Make the type an array (or multidimensional array) + if( dt.MakeArray(engine) < 0 ) + { + int r, c; + file->ConvertPosToRowCol(n->tokenPos, &r, &c); + WriteError(file->name.AddressOf(), TXT_TOO_MANY_ARRAY_DIMENSIONS, r, c); + break; + } + } + else + { + // Make the type a handle + if( dt.MakeHandle(true, acceptHandleForScope) < 0 ) + { + int r, c; + file->ConvertPosToRowCol(n->tokenPos, &r, &c); + WriteError(file->name.AddressOf(), TXT_OBJECT_HANDLE_NOT_SUPPORTED, r, c); + break; + } + } + n = n->next; + } + + if( isImplicitHandle ) + { + // Make the type a handle + if( dt.MakeHandle(true, acceptHandleForScope) < 0 ) + { + int r, c; + file->ConvertPosToRowCol(n->tokenPos, &r, &c); + WriteError(file->name.AddressOf(), TXT_OBJECT_HANDLE_NOT_SUPPORTED, r, c); + } + } + + return dt; +} + +asCDataType asCBuilder::ModifyDataTypeFromNode(const asCDataType &type, asCScriptNode *node, asCScriptCode *file, asETypeModifiers *inOutFlags, bool *autoHandle) +{ + asCDataType dt = type; + + if( inOutFlags ) *inOutFlags = asTM_NONE; + + // Is the argument sent by reference? + asCScriptNode *n = node->firstChild; + if( n && n->tokenType == ttAmp ) + { + dt.MakeReference(true); + n = n->next; + + if( n ) + { + if( inOutFlags ) + { + if( n->tokenType == ttIn ) + *inOutFlags = asTM_INREF; + else if( n->tokenType == ttOut ) + *inOutFlags = asTM_OUTREF; + else if( n->tokenType == ttInOut ) + *inOutFlags = asTM_INOUTREF; + else + asASSERT(false); + } + + n = n->next; + } + else + { + if( inOutFlags ) + *inOutFlags = asTM_INOUTREF; // ttInOut + } + + if( !engine->ep.allowUnsafeReferences && + inOutFlags && *inOutFlags == asTM_INOUTREF ) + { + // Verify that the base type support &inout parameter types + if( !dt.IsObject() || dt.IsObjectHandle() || !dt.GetObjectType()->beh.addref || !dt.GetObjectType()->beh.release ) + { + int r, c; + file->ConvertPosToRowCol(node->firstChild->tokenPos, &r, &c); + WriteError(file->name.AddressOf(), TXT_ONLY_OBJECTS_MAY_USE_REF_INOUT, r, c); + } + } + } + + if( autoHandle ) *autoHandle = false; + + if( n && n->tokenType == ttPlus ) + { + if( autoHandle ) *autoHandle = true; + } + + return dt; +} + +asCObjectType *asCBuilder::GetObjectType(const char *type) +{ + // TODO: Only search in config groups to which the module has access + asCObjectType *ot = engine->GetObjectType(type); + if( !ot && module ) + ot = module->GetObjectType(type); + + return ot; +} + +int asCBuilder::GetEnumValueFromObjectType(asCObjectType *objType, const char *name, asCDataType &outDt, asDWORD &outValue) +{ + if( !objType || !(objType->flags & asOBJ_ENUM) ) + return 0; + + for( asUINT n = 0; n < objType->enumValues.GetLength(); ++n ) + { + if( objType->enumValues[n]->name == name ) + { + outDt = asCDataType::CreateObject(objType, true); + outValue = objType->enumValues[n]->value; + return 1; + } + } + + return 0; +} + +int asCBuilder::GetEnumValue(const char *name, asCDataType &outDt, asDWORD &outValue) +{ + bool found = false; + + // Search all available enum types + asUINT t; + for( t = 0; t < engine->objectTypes.GetLength(); t++ ) + { + asCObjectType *ot = engine->objectTypes[t]; + if( GetEnumValueFromObjectType( ot, name, outDt, outValue ) ) + { + if( !found ) + { + found = true; + } + else + { + // Found more than one value in different enum types + return 2; + } + } + } + + for( t = 0; t < module->enumTypes.GetLength(); t++ ) + { + asCObjectType *ot = module->enumTypes[t]; + if( GetEnumValueFromObjectType( ot, name, outDt, outValue ) ) + { + if( !found ) + { + found = true; + } + else + { + // Found more than one value in different enum types + return 2; + } + } + } + + if( found ) + return 1; + + // Didn't find any value + return 0; +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_builder.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_builder.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_builder.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_builder.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,185 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_builder.h +// +// This is the class that manages the compilation of the scripts +// + + +#ifndef AS_BUILDER_H +#define AS_BUILDER_H + +#include "as_config.h" +#include "as_scriptengine.h" +#include "as_module.h" +#include "as_array.h" +#include "as_scriptcode.h" +#include "as_scriptnode.h" +#include "as_datatype.h" +#include "as_property.h" + +BEGIN_AS_NAMESPACE + +struct sFunctionDescription +{ + asCScriptCode *script; + asCScriptNode *node; + asCString name; + asCObjectType *objType; + int funcId; +}; + +struct sGlobalVariableDescription +{ + asCScriptCode *script; + asCScriptNode *idNode; + asCScriptNode *nextNode; + asCString name; + asCGlobalProperty *property; + asCDataType datatype; + int index; + bool isCompiled; + bool isPureConstant; + bool isEnumValue; + asQWORD constantValue; +}; + +struct sClassDeclaration +{ + asCScriptCode *script; + asCScriptNode *node; + asCString name; + int validState; + asCObjectType *objType; +}; + +class asCCompiler; + +class asCBuilder +{ +public: + asCBuilder(asCScriptEngine *engine, asCModule *module); + ~asCBuilder(); + + int VerifyProperty(asCDataType *dt, const char *decl, asCString &outName, asCDataType &outType); + + int ParseDataType(const char *datatype, asCDataType *result); + int ParseTemplateDecl(const char *decl, asCString *name, asCString *subtypeName); + + int ParseFunctionDeclaration(asCObjectType *type, const char *decl, asCScriptFunction *func, bool isSystemFunction, asCArray *paramAutoHandles = 0, bool *returnAutoHandle = 0); + int ParseVariableDeclaration(const char *decl, asCObjectProperty *var); + + int AddCode(const char *name, const char *code, int codeLength, int lineOffset, int sectionIdx, bool makeCopy); + int Build(); + +#ifdef AS_DEPRECATED +// Deprecated since 2009-12-08, 2.18.0 + int BuildString(const char *string, asCContext *ctx); +#endif + int CompileFunction(const char *sectionName, const char *code, int lineOffset, asDWORD compileFlags, asCScriptFunction **outFunc); + int CompileGlobalVar(const char *sectionName, const char *code, int lineOffset); + + void WriteInfo(const char *scriptname, const char *msg, int r, int c, bool preMessage); + void WriteError(const char *scriptname, const char *msg, int r, int c); + void WriteWarning(const char *scriptname, const char *msg, int r, int c); + + int CheckNameConflict(const char *name, asCScriptNode *node, asCScriptCode *code); + int CheckNameConflictMember(asCDataType &dt, const char *name, asCScriptNode *node, asCScriptCode *code); + +protected: + friend class asCCompiler; + friend class asCModule; + friend class asCParser; + + asCObjectProperty *GetObjectProperty(asCDataType &obj, const char *prop); + asCGlobalProperty *GetGlobalProperty(const char *prop, bool *isCompiled, bool *isPureConstant, asQWORD *constantValue); + + asCScriptFunction *GetFunctionDescription(int funcID); + void GetFunctionDescriptions(const char *name, asCArray &funcs); + void GetObjectMethodDescriptions(const char *name, asCObjectType *objectType, asCArray &methods, bool objIsConst, const asCString &scope = ""); + + int RegisterScriptFunction(int funcID, asCScriptNode *node, asCScriptCode *file, asCObjectType *object = 0, bool isInterface = false, bool isGlobalFunction = false); + int RegisterImportedFunction(int funcID, asCScriptNode *node, asCScriptCode *file); + int RegisterGlobalVar(asCScriptNode *node, asCScriptCode *file); + int RegisterClass(asCScriptNode *node, asCScriptCode *file); + int RegisterInterface(asCScriptNode *node, asCScriptCode *file); + int RegisterEnum(asCScriptNode *node, asCScriptCode *file); + int RegisterTypedef(asCScriptNode *node, asCScriptCode *file); + void CompileClasses(); + + void GetParsedFunctionDetails(asCScriptNode *node, asCScriptCode *file, asCObjectType *objType, asCString &name, asCDataType &returnType, asCArray ¶meterTypes, asCArray &inOutFlags, bool &isConstMethod, bool &isConstructor, bool &isDestructor); + + bool DoesMethodExist(asCObjectType *objType, int methodId); + + void AddDefaultConstructor(asCObjectType *objType, asCScriptCode *file); + asCObjectProperty *AddPropertyToClass(sClassDeclaration *c, const asCString &name, const asCDataType &type, asCScriptCode *file = 0, asCScriptNode *node = 0); + + int CreateVirtualFunction(asCScriptFunction *func, int idx); + + asCObjectType *GetObjectType(const char *type); + + int GetEnumValueFromObjectType(asCObjectType *objType, const char *name, asCDataType &outDt, asDWORD &outValue); + int GetEnumValue(const char *name, asCDataType &outDt, asDWORD &outValue); + + void ParseScripts(); + void CompileFunctions(); + void CompileGlobalVariables(); + + struct preMessage_t + { + bool isSet; + asCString message; + int r; + int c; + } preMessage; + + int numErrors; + int numWarnings; + + asCArray scripts; + asCArray functions; + asCArray globVariables; + asCArray classDeclarations; + asCArray interfaceDeclarations; + asCArray namedTypeDeclarations; + + asCScriptEngine *engine; + asCModule *module; + + asCDataType CreateDataTypeFromNode(asCScriptNode *node, asCScriptCode *file, bool acceptHandleForScope = false, asCObjectType *templateType = 0); + asCDataType ModifyDataTypeFromNode(const asCDataType &type, asCScriptNode *node, asCScriptCode *file, asETypeModifiers *inOutFlag, bool *autoHandle); +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_bytecode.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_bytecode.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_bytecode.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_bytecode.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2224 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_bytecode.cpp +// +// A class for constructing the final byte code +// + +#include // fopen(), fprintf(), fclose() + +#include "as_config.h" +#include "as_bytecode.h" +#include "as_debug.h" // mkdir() +#include "as_array.h" +#include "as_string.h" +#include "as_scriptengine.h" + +BEGIN_AS_NAMESPACE + +asCByteCode::asCByteCode(asCScriptEngine *engine) +{ + first = 0; + last = 0; + largestStackUsed = -1; + + this->engine = engine; +} + +asCByteCode::~asCByteCode() +{ + ClearAll(); +} + +void asCByteCode::Finalize() +{ + // verify the bytecode + PostProcess(); + + // Optimize the code (optionally) + if( engine->ep.optimizeByteCode ) + Optimize(); + + // Resolve jumps + ResolveJumpAddresses(); + + // Build line numbers buffer + ExtractLineNumbers(); +} + +void asCByteCode::ClearAll() +{ + cByteInstruction *del = first; + + while( del ) + { + first = del->next; + engine->memoryMgr.FreeByteInstruction(del); + del = first; + } + + first = 0; + last = 0; + + lineNumbers.SetLength(0); + + largestStackUsed = -1; + + temporaryVariables.SetLength(0); +} + +void asCByteCode::InsertIfNotExists(asCArray &vars, int var) +{ + if( !vars.Exists(var) ) + vars.PushLast(var); +} + +void asCByteCode::GetVarsUsed(asCArray &vars) +{ + cByteInstruction *curr = first; + while( curr ) + { + if( asBCInfo[curr->op].type == asBCTYPE_wW_rW_rW_ARG ) + { + InsertIfNotExists(vars, curr->wArg[0]); + InsertIfNotExists(vars, curr->wArg[1]); + InsertIfNotExists(vars, curr->wArg[2]); + } + else if( asBCInfo[curr->op].type == asBCTYPE_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_W_ARG || + asBCInfo[curr->op].type == asBCTYPE_rW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_QW_ARG ) + { + InsertIfNotExists(vars, curr->wArg[0]); + } + else if( asBCInfo[curr->op].type == asBCTYPE_wW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_rW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_rW_DW_ARG ) + { + InsertIfNotExists(vars, curr->wArg[0]); + InsertIfNotExists(vars, curr->wArg[1]); + } + else if( asBCInfo[curr->op].type == asBCTYPE_W_rW_ARG ) + { + InsertIfNotExists(vars, curr->wArg[1]); + } + + curr = curr->next; + } +} + +bool asCByteCode::IsVarUsed(int offset) +{ + cByteInstruction *curr = first; + while( curr ) + { + // Verify all ops that use variables + if( asBCInfo[curr->op].type == asBCTYPE_wW_rW_rW_ARG ) + { + if( curr->wArg[0] == offset || curr->wArg[1] == offset || curr->wArg[2] == offset ) + return true; + } + else if( asBCInfo[curr->op].type == asBCTYPE_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_W_ARG || + asBCInfo[curr->op].type == asBCTYPE_rW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_QW_ARG ) + { + if( curr->wArg[0] == offset ) + return true; + } + else if( asBCInfo[curr->op].type == asBCTYPE_wW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_rW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_rW_DW_ARG ) + { + if( curr->wArg[0] == offset || curr->wArg[1] == offset ) + return true; + } + else if( asBCInfo[curr->op].type == asBCTYPE_W_rW_ARG ) + { + if( curr->wArg[1] == offset ) + return true; + } + + curr = curr->next; + } + + return false; +} + +void asCByteCode::ExchangeVar(int oldOffset, int newOffset) +{ + cByteInstruction *curr = first; + while( curr ) + { + // Verify all ops that use variables + if( asBCInfo[curr->op].type == asBCTYPE_wW_rW_rW_ARG ) + { + if( curr->wArg[0] == oldOffset ) + curr->wArg[0] = (short)newOffset; + if( curr->wArg[1] == oldOffset ) + curr->wArg[1] = (short)newOffset; + if( curr->wArg[2] == oldOffset ) + curr->wArg[2] = (short)newOffset; + } + else if( asBCInfo[curr->op].type == asBCTYPE_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_W_ARG || + asBCInfo[curr->op].type == asBCTYPE_rW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_QW_ARG ) + { + if( curr->wArg[0] == oldOffset ) + curr->wArg[0] = (short)newOffset; + } + else if( asBCInfo[curr->op].type == asBCTYPE_wW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_rW_rW_ARG ) + { + if( curr->wArg[0] == oldOffset ) + curr->wArg[0] = (short)newOffset; + if( curr->wArg[1] == oldOffset ) + curr->wArg[1] = (short)newOffset; + } + else if( asBCInfo[curr->op].type == asBCTYPE_W_rW_ARG ) + { + if( curr->wArg[1] == oldOffset ) + curr->wArg[1] = (short)newOffset; + } + + curr = curr->next; + } +} + +void asCByteCode::AddPath(asCArray &paths, cByteInstruction *instr, int stackSize) +{ + if( instr->marked ) + { + // Verify the size of the stack + asASSERT(instr->stackSize == stackSize); + } + else + { + // Add the destination to the code paths + instr->marked = true; + instr->stackSize = stackSize; + paths.PushLast(instr); + } +} + +bool asCByteCode::IsCombination(cByteInstruction *curr, asEBCInstr bc1, asEBCInstr bc2) +{ + if( curr->op == bc1 && curr->next && curr->next->op == bc2 ) + return true; + + return false; +} + +bool asCByteCode::IsCombination(cByteInstruction *curr, asEBCInstr bc1, asEBCInstr bc2, asEBCInstr bc3) +{ + if( curr->op == bc1 && + curr->next && curr->next->op == bc2 && + curr->next->next && curr->next->next->op == bc3 ) + return true; + + return false; +} + +cByteInstruction *asCByteCode::ChangeFirstDeleteNext(cByteInstruction *curr, asEBCInstr bc) +{ + curr->op = bc; + + if( curr->next ) DeleteInstruction(curr->next); + + // Continue optimization with the instruction before the altered one + if( curr->prev ) + return curr->prev; + else + return curr; +} + +cByteInstruction *asCByteCode::DeleteFirstChangeNext(cByteInstruction *curr, asEBCInstr bc) +{ + asASSERT( curr->next ); + + cByteInstruction *instr = curr->next; + instr->op = bc; + + DeleteInstruction(curr); + + // Continue optimization with the instruction before the altered one + if( instr->prev ) + return instr->prev; + else + return instr; +} + +void asCByteCode::InsertBefore(cByteInstruction *before, cByteInstruction *instr) +{ + asASSERT(instr->next == 0); + asASSERT(instr->prev == 0); + + if( before->prev ) before->prev->next = instr; + instr->prev = before->prev; + before->prev = instr; + instr->next = before; + + if( first == before ) first = instr; +} + +void asCByteCode::RemoveInstruction(cByteInstruction *instr) +{ + if( instr == first ) first = first->next; + if( instr == last ) last = last->prev; + + if( instr->prev ) instr->prev->next = instr->next; + if( instr->next ) instr->next->prev = instr->prev; + + instr->next = 0; + instr->prev = 0; +} + +bool asCByteCode::CanBeSwapped(cByteInstruction *curr) +{ + if( !curr || !curr->next || !curr->next->next ) return false; + if( curr->next->next->op != asBC_SWAP4 ) return false; + + cByteInstruction *next = curr->next; + + if( curr->op != asBC_PshC4 && + curr->op != asBC_PshV4 && + curr->op != asBC_PSF ) + return false; + + if( next->op != asBC_PshC4 && + next->op != asBC_PshV4 && + next->op != asBC_PSF ) + return false; + + return true; +} + +cByteInstruction *asCByteCode::GoBack(cByteInstruction *curr) +{ + // Go back 2 instructions + if( !curr ) return 0; + if( curr->prev ) curr = curr->prev; + if( curr->prev ) curr = curr->prev; + return curr; +} + +bool asCByteCode::PostponeInitOfTemp(cByteInstruction *curr, cByteInstruction **next) +{ + if( curr->op != asBC_SetV4 || !IsTemporary(curr->wArg[0]) ) return false; + + // Move the initialization to just before it's use. + // Don't move it beyond any labels or jumps. + cByteInstruction *use = curr->next; + while( use ) + { + if( IsTempVarReadByInstr(use, curr->wArg[0]) ) + break; + + if( IsTempVarOverwrittenByInstr(use, curr->wArg[0]) ) + return false; + + if( IsInstrJmpOrLabel(use) ) + return false; + + use = use->next; + } + + if( use && use->prev != curr ) + { + *next = curr->next; + + // Move the instruction + RemoveInstruction(curr); + InsertBefore(use, curr); + + // Try a RemoveUnusedValue to see if it can be combined with the other + cByteInstruction *temp; + if( RemoveUnusedValue(curr, &temp) ) + { + *next = GoBack(*next); + return true; + } + + // Return the instructions to its original position as it wasn't useful + RemoveInstruction(curr); + InsertBefore(*next, curr); + } + + return false; +} + +bool asCByteCode::RemoveUnusedValue(cByteInstruction *curr, cByteInstruction **next) +{ + // TODO: global: The global var address should be stored in the instruction directly + // The value isn't used for anything + if( (asBCInfo[curr->op].type == asBCTYPE_wW_rW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_rW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_QW_ARG) && + IsTemporary(curr->wArg[0]) && + !IsTempVarRead(curr, curr->wArg[0]) ) + { + if( curr->op == asBC_LdGRdR4 && IsTempRegUsed(curr) ) + { + curr->op = asBC_LDG; + curr->wArg[0] = curr->wArg[1]; + *next = GoBack(curr); + return true; + } + + *next = GoBack(DeleteInstruction(curr)); + return true; + } + + // TODO: There should be one for doubles as well + // The value is immediately used and then never again + if( curr->op == asBC_SetV4 && + curr->next && + (curr->next->op == asBC_CMPi || + curr->next->op == asBC_CMPf || + curr->next->op == asBC_CMPu) && + curr->wArg[0] == curr->next->wArg[1] && + (IsTemporary(curr->wArg[0]) && // The variable is temporary and never used again + !IsTempVarRead(curr->next, curr->wArg[0])) ) + { + if( curr->next->op == asBC_CMPi ) curr->next->op = asBC_CMPIi; + else if( curr->next->op == asBC_CMPf ) curr->next->op = asBC_CMPIf; + else if( curr->next->op == asBC_CMPu ) curr->next->op = asBC_CMPIu; + curr->next->size = asBCTypeSize[asBCInfo[asBC_CMPIi].type]; + curr->next->arg = curr->arg; + *next = GoBack(DeleteInstruction(curr)); + return true; + } + + // The value is immediately used and then never again + if( curr->op == asBC_SetV4 && + curr->next && + (curr->next->op == asBC_ADDi || + curr->next->op == asBC_SUBi || + curr->next->op == asBC_MULi || + curr->next->op == asBC_ADDf || + curr->next->op == asBC_SUBf || + curr->next->op == asBC_MULf) && + curr->wArg[0] == curr->next->wArg[2] && + (curr->next->wArg[0] == curr->wArg[0] || // The variable is overwritten + (IsTemporary(curr->wArg[0]) && // The variable is temporary and never used again + !IsTempVarRead(curr->next, curr->wArg[0]))) ) + { + if( curr->next->op == asBC_ADDi ) curr->next->op = asBC_ADDIi; + else if( curr->next->op == asBC_SUBi ) curr->next->op = asBC_SUBIi; + else if( curr->next->op == asBC_MULi ) curr->next->op = asBC_MULIi; + else if( curr->next->op == asBC_ADDf ) curr->next->op = asBC_ADDIf; + else if( curr->next->op == asBC_SUBf ) curr->next->op = asBC_SUBIf; + else if( curr->next->op == asBC_MULf ) curr->next->op = asBC_MULIf; + curr->next->size = asBCTypeSize[asBCInfo[asBC_ADDIi].type]; + curr->next->arg = curr->arg; + *next = GoBack(DeleteInstruction(curr)); + return true; + } + + if( curr->op == asBC_SetV4 && + curr->next && + (curr->next->op == asBC_ADDi || + curr->next->op == asBC_MULi || + curr->next->op == asBC_ADDf || + curr->next->op == asBC_MULf) && + curr->wArg[0] == curr->next->wArg[1] && + (curr->next->wArg[0] == curr->wArg[0] || // The variable is overwritten + (IsTemporary(curr->wArg[0]) && // The variable is temporary and never used again + !IsTempVarRead(curr->next, curr->wArg[0]))) ) + { + if( curr->next->op == asBC_ADDi ) curr->next->op = asBC_ADDIi; + else if( curr->next->op == asBC_MULi ) curr->next->op = asBC_MULIi; + else if( curr->next->op == asBC_ADDf ) curr->next->op = asBC_ADDIf; + else if( curr->next->op == asBC_MULf ) curr->next->op = asBC_MULIf; + curr->next->size = asBCTypeSize[asBCInfo[asBC_ADDIi].type]; + curr->next->arg = curr->arg; + + // The order of the operands are changed + curr->next->wArg[1] = curr->next->wArg[2]; + + *next = GoBack(DeleteInstruction(curr)); + return true; + } + + // The values is immediately moved to another variable and then not used again + if( (asBCInfo[curr->op].type == asBCTYPE_wW_rW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_rW_DW_ARG) && + curr->next && curr->next->op == asBC_CpyVtoV4 && + curr->wArg[0] == curr->next->wArg[1] && + IsTemporary(curr->wArg[0]) && + !IsTempVarRead(curr->next, curr->wArg[0]) ) + { + curr->wArg[0] = curr->next->wArg[0]; + DeleteInstruction(curr->next); + *next = GoBack(curr); + return true; + } + + // The constant value is immediately moved to another variable and then not used again + if( curr->op == asBC_SetV4 && curr->next && curr->next->op == asBC_CpyVtoV4 && + curr->wArg[0] == curr->next->wArg[1] && + IsTemporary(curr->wArg[0]) && + !IsTempVarRead(curr->next, curr->wArg[0]) ) + { + curr->wArg[0] = curr->next->wArg[0]; + DeleteInstruction(curr->next); + *next = GoBack(curr); + return true; + } + + // The register is copied to a temp variable and then back to the register again without being used afterwards + if( curr->op == asBC_CpyRtoV4 && curr->next && curr->next->op == asBC_CpyVtoR4 && + curr->wArg[0] == curr->next->wArg[0] && + IsTemporary(curr->wArg[0]) && + !IsTempVarRead(curr->next, curr->wArg[0]) ) + { + // Delete both instructions + DeleteInstruction(curr->next); + *next = GoBack(DeleteInstruction(curr)); + return true; + } + + // The global value is copied to a temp and then immediately pushed on the stack + if( curr->op == asBC_CpyGtoV4 && curr->next && curr->next->op == asBC_PshV4 && + curr->wArg[0] == curr->next->wArg[0] && + IsTemporary(curr->wArg[0]) && + !IsTempVarRead(curr->next, curr->wArg[0]) ) + { + curr->op = asBC_PshG4; + curr->size = asBCTypeSize[asBCInfo[asBC_PshG4].type]; + curr->stackInc = asBCInfo[asBC_PshG4].stackInc; + curr->wArg[0] = curr->wArg[1]; + DeleteInstruction(curr->next); + *next = GoBack(curr); + return true; + } + + // The constant is copied to a temp and then immediately pushed on the stack + if( curr->op == asBC_SetV4 && curr->next && curr->next->op == asBC_PshV4 && + curr->wArg[0] == curr->next->wArg[0] && + IsTemporary(curr->wArg[0]) && + !IsTempVarRead(curr->next, curr->wArg[0]) ) + { + curr->op = asBC_PshC4; + curr->stackInc = asBCInfo[asBC_PshC4].stackInc; + DeleteInstruction(curr->next); + *next = GoBack(curr); + return true; + } + + // The constant is copied to a global variable and then never used again + if( curr->op == asBC_SetV4 && curr->next && curr->next->op == asBC_CpyVtoG4 && + curr->wArg[0] == curr->next->wArg[1] && + IsTemporary(curr->wArg[0]) && + !IsTempVarRead(curr->next, curr->wArg[0]) ) + { + curr->op = asBC_SetG4; + curr->size = asBCTypeSize[asBCInfo[asBC_SetG4].type]; + curr->wArg[0] = curr->next->wArg[0]; + DeleteInstruction(curr->next); + *next = GoBack(curr); + return true; + } + + return false; +} + +bool asCByteCode::IsTemporary(short offset) +{ + for( asUINT n = 0; n < temporaryVariables.GetLength(); n++ ) + if( temporaryVariables[n] == offset ) + return true; + + return false; +} + +int asCByteCode::Optimize() +{ + // TODO: optimize: The optimizer should be able to inline function calls. + // If the called function has only a few instructions, the function call should be inlined. + // This is especially useful with the factory stubs used for template types and script classes. + + // TODO: optimize: Optimize the release of script objects. Most of the time the instructions PSV and FREE are used for this. + // Need a bytecode BC_FreeV that can free the object stored in a variable directly + + // TODO: optimize: Need a bytecode BC_AddRef so that BC_CALLSYS doesn't have to be used for this trivial call + + // TODO: global: The global var address should be stored in the instruction directly + + cByteInstruction *instr = first; + while( instr ) + { + cByteInstruction *curr = instr; + instr = instr->next; + + // Remove or combine instructions + if( RemoveUnusedValue(curr, &instr) ) continue; + + // Postpone initializations so that they may be combined in the second pass + if( PostponeInitOfTemp(curr, &instr) ) continue; + + // XXX x, YYY y, SWAP4 -> YYY y, XXX x + if( CanBeSwapped(curr) ) + { + // Delete SWAP4 + DeleteInstruction(instr->next); + + // Swap instructions + RemoveInstruction(instr); + InsertBefore(curr, instr); + + instr = GoBack(instr); + } + // SWAP4, OP -> OP + else if( IsCombination(curr, asBC_SWAP4, asBC_ADDi) || + IsCombination(curr, asBC_SWAP4, asBC_MULi) || + IsCombination(curr, asBC_SWAP4, asBC_ADDf) || + IsCombination(curr, asBC_SWAP4, asBC_MULf) ) + instr = GoBack(DeleteInstruction(curr)); + // PSF x, RDS4 -> PshV4 x + else if( IsCombination(curr, asBC_PSF, asBC_RDS4) ) + instr = GoBack(ChangeFirstDeleteNext(curr, asBC_PshV4)); + // RDS4, POP x -> POP x + else if( IsCombination(curr, asBC_RDS4, asBC_POP) && instr->wArg[0] > 0 ) + instr = GoBack(DeleteInstruction(curr)); + // LDG x, WRTV4 y -> CpyVtoG4 y, x + else if( IsCombination(curr, asBC_LDG, asBC_WRTV4) && !IsTempRegUsed(instr) ) + { + curr->op = asBC_CpyVtoG4; + curr->size = asBCTypeSize[asBCInfo[asBC_CpyVtoG4].type]; + curr->wArg[1] = instr->wArg[0]; + + DeleteInstruction(instr); + instr = GoBack(curr); + } + // LDG x, RDR4 y -> CpyGtoV4 y, x + else if( IsCombination(curr, asBC_LDG, asBC_RDR4) ) + { + if( !IsTempRegUsed(instr) ) + curr->op = asBC_CpyGtoV4; + else + curr->op = asBC_LdGRdR4; + curr->size = asBCTypeSize[asBCInfo[asBC_CpyGtoV4].type]; + curr->wArg[1] = curr->wArg[0]; + curr->wArg[0] = instr->wArg[0]; + + DeleteInstruction(instr); + instr = GoBack(curr); + } + // LDV x, INCi -> IncVi x + else if( IsCombination(curr, asBC_LDV, asBC_INCi) && !IsTempRegUsed(instr) ) + { + curr->op = asBC_IncVi; + + DeleteInstruction(instr); + instr = GoBack(curr); + } + // LDV x, DECi -> DecVi x + else if( IsCombination(curr, asBC_LDV, asBC_DECi) && !IsTempRegUsed(instr) ) + { + curr->op = asBC_DecVi; + + DeleteInstruction(instr); + instr = GoBack(curr); + } + // POP a, RET b -> RET b + else if( IsCombination(curr, asBC_POP, asBC_RET) ) + { + // We don't combine the POP+RET because RET first restores + // the previous stack pointer and then pops the arguments + + // Delete POP + instr = GoBack(DeleteInstruction(curr)); + } + // Delete JitEntry if the JIT instructions are not supposed to be included + else if( curr->op == asBC_JitEntry && !engine->ep.includeJitInstructions ) + { + instr = GoBack(DeleteInstruction(curr)); + } + // SUSPEND, JitEntry, SUSPEND -> SUSPEND + // LINE, JitEntry, LINE -> LINE + else if( (IsCombination(curr, asBC_SUSPEND, asBC_JitEntry) && IsCombination(instr, asBC_JitEntry, asBC_SUSPEND)) || + (IsCombination(curr, asBC_LINE, asBC_JitEntry) && IsCombination(instr, asBC_JitEntry, asBC_LINE)) ) + { + // Delete the two first instructions + DeleteInstruction(instr); + instr = GoBack(DeleteInstruction(curr)); + } + // SUSPEND, SUSPEND -> SUSPEND + // LINE, LINE -> LINE + else if( IsCombination(curr, asBC_SUSPEND, asBC_SUSPEND) || + IsCombination(curr, asBC_LINE, asBC_LINE) ) + { + // Delete the first instruction + instr = GoBack(DeleteInstruction(curr)); + } + // PUSH a, PUSH b -> PUSH a+b + else if( IsCombination(curr, asBC_PUSH, asBC_PUSH) ) + { + // Combine the two PUSH + instr->wArg[0] = curr->wArg[0] + instr->wArg[0]; + // Delete current + DeleteInstruction(curr); + // Continue with the instruction before the one removed + instr = GoBack(instr); + } + // PshC4 a, GETREF 0 -> PSF a + else if( IsCombination(curr, asBC_PshC4, asBC_GETREF) && instr->wArg[0] == 0 ) + { + // Convert PshC4 a, to PSF a + curr->wArg[0] = (short)*ARG_DW(curr->arg); + curr->size = asBCTypeSize[asBCInfo[asBC_PSF].type]; + curr->op = asBC_PSF; + DeleteInstruction(instr); + instr = GoBack(curr); + } + // YYY y, POP x -> POP x-1 + else if( (IsCombination(curr, asBC_PshV4, asBC_POP) || + IsCombination(curr, asBC_PshC4, asBC_POP)) && instr->wArg[0] > 0 ) + { + DeleteInstruction(curr); + instr->wArg[0]--; + instr = GoBack(instr); + } + // PshRPtr, POP x -> POP x - 1 + else if( (IsCombination(curr, asBC_PshRPtr, asBC_POP) || + IsCombination(curr, asBC_PSF , asBC_POP) || + IsCombination(curr, asBC_VAR , asBC_POP)) + && instr->wArg[0] > (AS_PTR_SIZE-1) ) + { + DeleteInstruction(curr); + instr->wArg[0] -= AS_PTR_SIZE; + instr = GoBack(instr); + } + // RDS8, POP 2 -> POP x-1 + else if( IsCombination(curr, asBC_RDS8, asBC_POP) && instr->wArg[0] > 1 ) + { + DeleteInstruction(curr); + instr->wArg[0] -= 2-AS_PTR_SIZE; // Transform the pop to remove the address instead of the 8 byte word + instr = GoBack(instr); + } + // PshC8 y, POP x -> POP x-2 + else if( IsCombination(curr, asBC_PshC8, asBC_POP) && instr->wArg[0] > 1 ) + { + DeleteInstruction(curr); + instr->wArg[0] -= 2; + instr = GoBack(instr); + } + // POP 0 -> remove + // PUSH 0 -> remove + else if( (curr->op == asBC_POP || curr->op == asBC_PUSH ) && curr->wArg[0] == 0 ) + instr = GoBack(DeleteInstruction(curr)); +// Begin PATTERN + // T**; J** +x -> J** +x + else if( IsCombination(curr, asBC_TZ , asBC_JZ ) || + IsCombination(curr, asBC_TNZ, asBC_JNZ) ) + instr = GoBack(DeleteFirstChangeNext(curr, asBC_JNZ)); + else if( IsCombination(curr, asBC_TNZ, asBC_JZ ) || + IsCombination(curr, asBC_TZ , asBC_JNZ) ) + instr = GoBack(DeleteFirstChangeNext(curr, asBC_JZ)); + else if( IsCombination(curr, asBC_TS , asBC_JZ ) || + IsCombination(curr, asBC_TNS, asBC_JNZ) ) + instr = GoBack(DeleteFirstChangeNext(curr, asBC_JNS)); + else if( IsCombination(curr, asBC_TNS, asBC_JZ ) || + IsCombination(curr, asBC_TS , asBC_JNZ) ) + instr = GoBack(DeleteFirstChangeNext(curr, asBC_JS)); + else if( IsCombination(curr, asBC_TP , asBC_JZ ) || + IsCombination(curr, asBC_TNP, asBC_JNZ) ) + instr = GoBack(DeleteFirstChangeNext(curr, asBC_JNP)); + else if( IsCombination(curr, asBC_TNP, asBC_JZ ) || + IsCombination(curr, asBC_TP , asBC_JNZ) ) + instr = GoBack(DeleteFirstChangeNext(curr, asBC_JP)); +// End PATTERN + // JMP +0 -> remove + else if( IsCombination(curr, asBC_JMP, asBC_LABEL) && *(int*)&curr->arg == instr->wArg[0] ) + instr = GoBack(DeleteInstruction(curr)); + // PSF, ChkRefS, RDS4 -> PshV4, CHKREF + else if( IsCombination(curr, asBC_PSF, asBC_ChkRefS) && + IsCombination(instr, asBC_ChkRefS, asBC_RDS4) ) + { + asASSERT( AS_PTR_SIZE == 1 ); + + // TODO: Pointer size + curr->op = asBC_PshV4; + instr->op = asBC_CHKREF; + DeleteInstruction(instr->next); + instr = GoBack(curr); + } + // PSF, ChkRefS, POP -> ChkNullV + else if( (IsCombination(curr, asBC_PSF, asBC_ChkRefS) && + IsCombination(instr, asBC_ChkRefS, asBC_POP) && + instr->next->wArg[0] >= AS_PTR_SIZE) ) + { + curr->op = asBC_ChkNullV; + curr->stackInc = 0; + // Decrease the number of DWORDs popped + instr->next->wArg[0] -= AS_PTR_SIZE; + // Delete the ChkRefS instruction + DeleteInstruction(instr); + instr = GoBack(curr); + } + // PshV4, CHKREF, POP -> ChkNullV + else if( (IsCombination(curr, asBC_PshV4, asBC_ChkRefS) && + IsCombination(instr, asBC_CHKREF, asBC_POP) && + instr->next->wArg[0] > 0) ) + { + asASSERT( AS_PTR_SIZE == 1 ); + + // TODO: Pointer size + curr->op = asBC_ChkNullV; + curr->stackInc = 0; + DeleteInstruction(instr->next); + DeleteInstruction(instr); + instr = GoBack(curr); + } + } + + return 0; +} + +bool asCByteCode::IsTempVarReadByInstr(cByteInstruction *curr, int offset) +{ + // Which instructions read from variables? + if( asBCInfo[curr->op].type == asBCTYPE_wW_rW_rW_ARG && + (curr->wArg[1] == offset || curr->wArg[2] == offset) ) + return true; + else if( (asBCInfo[curr->op].type == asBCTYPE_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_rW_DW_ARG) && + curr->wArg[0] == offset ) + return true; + else if( (asBCInfo[curr->op].type == asBCTYPE_wW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_rW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_W_rW_ARG) && + curr->wArg[1] == offset ) + return true; + else if( asBCInfo[curr->op].type == asBCTYPE_rW_rW_ARG && + ((signed)curr->wArg[0] == offset || (signed)curr->wArg[1] == offset) ) + return true; + + return false; +} + +bool asCByteCode::IsInstrJmpOrLabel(cByteInstruction *curr) +{ + if( curr->op == asBC_JS || + curr->op == asBC_JNS || + curr->op == asBC_JP || + curr->op == asBC_JNP || + curr->op == asBC_JMPP || + curr->op == asBC_JMP || + curr->op == asBC_JZ || + curr->op == asBC_JNZ || + curr->op == asBC_LABEL ) + return true; + + return false; +} + +bool asCByteCode::IsTempVarOverwrittenByInstr(cByteInstruction *curr, int offset) +{ + // Which instructions overwrite the variable or discard it? + if( curr->op == asBC_RET || + curr->op == asBC_SUSPEND ) + return true; + else if( (asBCInfo[curr->op].type == asBCTYPE_wW_rW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_rW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_rW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_W_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_DW_ARG || + asBCInfo[curr->op].type == asBCTYPE_wW_QW_ARG) && + curr->wArg[0] == offset ) + return true; + + return false; +} + +bool asCByteCode::IsTempVarRead(cByteInstruction *curr, int offset) +{ + asCArray openPaths; + asCArray closedPaths; + + // We're not interested in the first instruction, since it is the one that sets the variable + openPaths.PushLast(curr->next); + + while( openPaths.GetLength() ) + { + curr = openPaths.PopLast(); + + // Add the instruction to the closed paths so that we don't verify it again + closedPaths.PushLast(curr); + + while( curr ) + { + if( IsTempVarReadByInstr(curr, offset) ) return true; + + if( IsTempVarOverwrittenByInstr(curr, offset) ) break; + + // In case of jumps, we must follow the each of the paths + if( curr->op == asBC_JMP ) + { + int label = *((int*)ARG_DW(curr->arg)); + int r = FindLabel(label, curr, &curr, 0); asASSERT( r == 0 ); UNUSED_VAR(r); + + if( !closedPaths.Exists(curr) && + !openPaths.Exists(curr) ) + openPaths.PushLast(curr); + + break; + } + else if( curr->op == asBC_JZ || curr->op == asBC_JNZ || + curr->op == asBC_JS || curr->op == asBC_JNS || + curr->op == asBC_JP || curr->op == asBC_JNP ) + { + cByteInstruction *dest = 0; + int label = *((int*)ARG_DW(curr->arg)); + int r = FindLabel(label, curr, &dest, 0); asASSERT( r == 0 ); UNUSED_VAR(r); + + if( !closedPaths.Exists(dest) && + !openPaths.Exists(dest) ) + openPaths.PushLast(dest); + } + // We cannot optimize over BC_JMPP + else if( curr->op == asBC_JMPP ) return true; + + curr = curr->next; + } + } + + return false; +} + +bool asCByteCode::IsTempRegUsed(cByteInstruction *curr) +{ + // We're not interested in the first instruction, since it is the one that sets the register + while( curr->next ) + { + curr = curr->next; + + // Which instructions read from the register? + if( curr->op == asBC_INCi || + curr->op == asBC_INCi16 || + curr->op == asBC_INCi8 || + curr->op == asBC_INCf || + curr->op == asBC_INCd || + curr->op == asBC_DECi || + curr->op == asBC_DECi16 || + curr->op == asBC_DECi8 || + curr->op == asBC_DECf || + curr->op == asBC_DECd || + curr->op == asBC_WRTV1 || + curr->op == asBC_WRTV2 || + curr->op == asBC_WRTV4 || + curr->op == asBC_WRTV8 || + curr->op == asBC_RDR1 || + curr->op == asBC_RDR2 || + curr->op == asBC_RDR4 || + curr->op == asBC_RDR8 || + curr->op == asBC_PshRPtr || + curr->op == asBC_CpyRtoV4 || + curr->op == asBC_CpyRtoV8 || + curr->op == asBC_TZ || + curr->op == asBC_TNZ || + curr->op == asBC_TS || + curr->op == asBC_TNS || + curr->op == asBC_TP || + curr->op == asBC_TNP || + curr->op == asBC_JZ || + curr->op == asBC_JNZ || + curr->op == asBC_JS || + curr->op == asBC_JNS || + curr->op == asBC_JP || + curr->op == asBC_JNP ) + return true; + + // Which instructions overwrite the register or discard the value? + if( curr->op == asBC_CALL || + curr->op == asBC_PopRPtr || + curr->op == asBC_CALLSYS || + curr->op == asBC_CALLBND || + curr->op == asBC_SUSPEND || + curr->op == asBC_ALLOC || + curr->op == asBC_FREE || + curr->op == asBC_CpyVtoR4 || + curr->op == asBC_LdGRdR4 || + curr->op == asBC_LDG || + curr->op == asBC_LDV || + curr->op == asBC_TZ || + curr->op == asBC_TNZ || + curr->op == asBC_TS || + curr->op == asBC_TNS || + curr->op == asBC_TP || + curr->op == asBC_TNP || + curr->op == asBC_JS || + curr->op == asBC_JNS || + curr->op == asBC_JP || + curr->op == asBC_JNP || + curr->op == asBC_JMPP || + curr->op == asBC_JMP || + curr->op == asBC_JZ || + curr->op == asBC_JNZ || + curr->op == asBC_CMPi || + curr->op == asBC_CMPu || + curr->op == asBC_CMPf || + curr->op == asBC_CMPd || + curr->op == asBC_CMPIi || + curr->op == asBC_CMPIu || + curr->op == asBC_CMPIf || + curr->op == asBC_LABEL ) + return false; + } + + return false; +} + +void asCByteCode::ExtractLineNumbers() +{ + int lastLinePos = -1; + int pos = 0; + cByteInstruction *instr = first; + while( instr ) + { + cByteInstruction *curr = instr; + instr = instr->next; + + if( curr->op == asBC_LINE ) + { + if( lastLinePos == pos ) + { + lineNumbers.PopLast(); + lineNumbers.PopLast(); + } + + lastLinePos = pos; + lineNumbers.PushLast(pos); + lineNumbers.PushLast(*(int*)ARG_DW(curr->arg)); + + if( !engine->ep.buildWithoutLineCues ) + { + // Transform BC_LINE into BC_SUSPEND + curr->op = asBC_SUSPEND; + curr->size = asBCTypeSize[asBCInfo[asBC_SUSPEND].type]; + pos += curr->size; + } + else + { + // Delete the instruction + DeleteInstruction(curr); + } + } + else + pos += curr->size; + } +} + +int asCByteCode::GetSize() +{ + int size = 0; + cByteInstruction *instr = first; + while( instr ) + { + size += instr->GetSize(); + + instr = instr->next; + } + + return size; +} + +void asCByteCode::AddCode(asCByteCode *bc) +{ + if( bc->first ) + { + if( first == 0 ) + { + first = bc->first; + last = bc->last; + bc->first = 0; + bc->last = 0; + } + else + { + last->next = bc->first; + bc->first->prev = last; + last = bc->last; + bc->first = 0; + bc->last = 0; + } + } +} + +int asCByteCode::AddInstruction() +{ + cByteInstruction *instr = new(engine->memoryMgr.AllocByteInstruction()) cByteInstruction(); + if( first == 0 ) + { + first = last = instr; + } + else + { + last->AddAfter(instr); + last = instr; + } + + return 0; +} + +int asCByteCode::AddInstructionFirst() +{ + cByteInstruction *instr = new(engine->memoryMgr.AllocByteInstruction()) cByteInstruction(); + if( first == 0 ) + { + first = last = instr; + } + else + { + first->AddBefore(instr); + first = instr; + } + + return 0; +} + +void asCByteCode::Call(asEBCInstr instr, int funcID, int pop) +{ + if( AddInstruction() < 0 ) + return; + + asASSERT(asBCInfo[instr].type == asBCTYPE_DW_ARG); + + last->op = instr; + last->size = asBCTypeSize[asBCInfo[instr].type]; + last->stackInc = -pop; // BC_CALL and BC_CALLBND doesn't pop the argument but when the callee returns the arguments are already popped + *((int*)ARG_DW(last->arg)) = funcID; + + // Add in a JitEntry instruction after function calls so that JIT's can resume execution + // TODO: Should this be done by the compiler? + InstrWORD(asBC_JitEntry, 0); +} + +void asCByteCode::Alloc(asEBCInstr instr, void *objID, int funcID, int pop) +{ + if( AddInstruction() < 0 ) + return; + + last->op = instr; + last->size = asBCTypeSize[asBCInfo[instr].type]; + last->stackInc = -pop; // BC_ALLOC + + asASSERT(asBCInfo[instr].type == asBCTYPE_PTR_DW_ARG); + *ARG_PTR(last->arg) = (asPTRWORD)(size_t)objID; + *((int*)(ARG_DW(last->arg)+AS_PTR_SIZE)) = funcID; + + // Add in a JitEntry instruction after function calls so that JIT's can resume execution + // TODO: Should this be done by the compiler? + InstrWORD(asBC_JitEntry, 0); +} + +void asCByteCode::Ret(int pop) +{ + if( AddInstruction() < 0 ) + return; + + asASSERT(asBCInfo[asBC_RET].type == asBCTYPE_W_ARG); + + last->op = asBC_RET; + last->size = asBCTypeSize[asBCInfo[asBC_RET].type]; + last->stackInc = 0; // The instruction pops the argument, but it doesn't affect current function + last->wArg[0] = (short)pop; +} + +void asCByteCode::JmpP(int var, asDWORD max) +{ + if( AddInstruction() < 0 ) + return; + + asASSERT(asBCInfo[asBC_JMPP].type == asBCTYPE_rW_ARG); + + last->op = asBC_JMPP; + last->size = asBCTypeSize[asBCInfo[asBC_JMPP].type]; + last->stackInc = asBCInfo[asBC_JMPP].stackInc; + last->wArg[0] = (short)var; + + // Store the largest jump that is made for PostProcess() + *ARG_DW(last->arg) = max; +} + +void asCByteCode::Label(short label) +{ + if( AddInstruction() < 0 ) + return; + + last->op = asBC_LABEL; + last->size = 0; + last->stackInc = 0; + last->wArg[0] = label; +} + +void asCByteCode::Line(int line, int column) +{ + if( AddInstruction() < 0 ) + return; + + last->op = asBC_LINE; + // If the build is without line cues these instructions will be removed + // otherwise they will be transformed into SUSPEND instructions. + if( engine->ep.buildWithoutLineCues ) + last->size = 0; + else + last->size = asBCTypeSize[asBCInfo[asBC_SUSPEND].type]; + last->stackInc = 0; + *((int*)ARG_DW(last->arg)) = (line & 0xFFFFF)|((column & 0xFFF)<<20); + + // Add a JitEntry after the line instruction to allow the JIT function to resume after a suspend + // TODO: Should this be added by the compiler? + InstrWORD(asBC_JitEntry, 0); +} + +int asCByteCode::FindLabel(int label, cByteInstruction *from, cByteInstruction **dest, int *positionDelta) +{ + // Search forward + int labelPos = -from->GetSize(); + + cByteInstruction *labelInstr = from; + while( labelInstr ) + { + labelPos += labelInstr->GetSize(); + labelInstr = labelInstr->next; + + if( labelInstr && labelInstr->op == asBC_LABEL ) + { + if( labelInstr->wArg[0] == label ) + break; + } + } + + if( labelInstr == 0 ) + { + // Search backwards + labelPos = -from->GetSize(); + + labelInstr = from; + while( labelInstr ) + { + labelInstr = labelInstr->prev; + if( labelInstr ) + { + labelPos -= labelInstr->GetSize(); + + if( labelInstr->op == asBC_LABEL ) + { + if( labelInstr->wArg[0] == label ) + break; + } + } + } + } + + if( labelInstr != 0 ) + { + if( dest ) *dest = labelInstr; + if( positionDelta ) *positionDelta = labelPos; + return 0; + } + + return -1; +} + +int asCByteCode::ResolveJumpAddresses() +{ + int pos = 0; + cByteInstruction *instr = first; + while( instr ) + { + // The program pointer is updated as the instruction is read + pos += instr->GetSize(); + + if( instr->op == asBC_JMP || + instr->op == asBC_JZ || instr->op == asBC_JNZ || + instr->op == asBC_JS || instr->op == asBC_JNS || + instr->op == asBC_JP || instr->op == asBC_JNP ) + { + int label = *((int*) ARG_DW(instr->arg)); + int labelPosOffset; + int r = FindLabel(label, instr, 0, &labelPosOffset); + if( r == 0 ) + *((int*) ARG_DW(instr->arg)) = labelPosOffset; + else + return -1; + } + + instr = instr->next; + } + + return 0; +} + + +cByteInstruction *asCByteCode::DeleteInstruction(cByteInstruction *instr) +{ + if( instr == 0 ) return 0; + + cByteInstruction *ret = instr->prev ? instr->prev : instr->next; + + RemoveInstruction(instr); + + engine->memoryMgr.FreeByteInstruction(instr); + + return ret; +} + +void asCByteCode::Output(asDWORD *array) +{ + // TODO: Receive a script function pointer + + // TODO: When arguments in a byte instruction are too large put them in the constant memory instead + // 4 byte arguments may remain in the instruction code for now. But move + // the 8 byte arguments to the constant memory + // Pointers will also be moved to the pointer array + + asDWORD *ap = array; + + cByteInstruction *instr = first; + while( instr ) + { + if( instr->GetSize() > 0 ) + { + *(asBYTE*)ap = asBYTE(instr->op); + *(((asBYTE*)ap)+1) = 0; // Second byte is always zero + switch( asBCInfo[instr->op].type ) + { + case asBCTYPE_NO_ARG: + *(((asWORD*)ap)+1) = 0; // Clear upper bytes + break; + case asBCTYPE_wW_rW_rW_ARG: + *(((asWORD*)ap)+1) = instr->wArg[0]; + *(((asWORD*)ap)+2) = instr->wArg[1]; + *(((asWORD*)ap)+3) = instr->wArg[2]; + break; + case asBCTYPE_wW_DW_ARG: + case asBCTYPE_rW_DW_ARG: + case asBCTYPE_W_DW_ARG: + *(((asWORD*)ap)+1) = instr->wArg[0]; + *(ap+1) = *(asDWORD*)&instr->arg; + break; + case asBCTYPE_wW_rW_DW_ARG: + *(((asWORD*)ap)+1) = instr->wArg[0]; + *(((asWORD*)ap)+2) = instr->wArg[1]; + *(ap+2) = *(asDWORD*)&instr->arg; + break; + case asBCTYPE_wW_QW_ARG: + *(((asWORD*)ap)+1) = instr->wArg[0]; + *(asQWORD*)(ap+1) = asQWORD(instr->arg); + break; + case asBCTYPE_W_ARG: + case asBCTYPE_rW_ARG: + case asBCTYPE_wW_ARG: + *(((asWORD*)ap)+1) = instr->wArg[0]; + break; + case asBCTYPE_wW_rW_ARG: + case asBCTYPE_rW_rW_ARG: + case asBCTYPE_W_rW_ARG: + case asBCTYPE_wW_W_ARG: + *(((asWORD *)ap)+1) = instr->wArg[0]; + *(((asWORD *)ap)+2) = instr->wArg[1]; + break; + case asBCTYPE_QW_DW_ARG: + case asBCTYPE_DW_DW_ARG: + case asBCTYPE_QW_ARG: + case asBCTYPE_DW_ARG: + *(((asWORD*)ap)+1) = 0; // Clear upper bytes + memcpy(ap+1, &instr->arg, instr->GetSize()*4-4); + break; + default: + // How did we get here? + asASSERT(false); + break; + } + } + + ap += instr->GetSize(); + instr = instr->next; + } +} + +void asCByteCode::PostProcess() +{ + if( first == 0 ) return; + + // This function will do the following + // - Verify if there is any code that never gets executed and remove it + // - Calculate the stack size at the position of each byte code + // - Calculate the largest stack needed + + largestStackUsed = 0; + + cByteInstruction *instr = first; + while( instr ) + { + instr->marked = false; + instr->stackSize = -1; + instr = instr->next; + } + + // Add the first instruction to the list of unchecked code paths + asCArray paths; + AddPath(paths, first, 0); + + // Go through each of the code paths + for( asUINT p = 0; p < paths.GetLength(); ++p ) + { + instr = paths[p]; + int stackSize = instr->stackSize; + + while( instr ) + { + instr->marked = true; + instr->stackSize = stackSize; + stackSize += instr->stackInc; + if( stackSize > largestStackUsed ) + largestStackUsed = stackSize; + + // PSP -> PSF + if( instr->op == asBC_PSP ) + { + instr->op = asBC_PSF; + instr->wArg[0] = instr->wArg[0] + (short)instr->stackSize; + } + + if( instr->op == asBC_JMP ) + { + // Find the label that we should jump to + int label = *((int*) ARG_DW(instr->arg)); + cByteInstruction *dest = 0; + int r = FindLabel(label, instr, &dest, 0); asASSERT( r == 0 ); UNUSED_VAR(r); + + AddPath(paths, dest, stackSize); + break; + } + else if( instr->op == asBC_JZ || instr->op == asBC_JNZ || + instr->op == asBC_JS || instr->op == asBC_JNS || + instr->op == asBC_JP || instr->op == asBC_JNP ) + { + // Find the label that is being jumped to + int label = *((int*) ARG_DW(instr->arg)); + cByteInstruction *dest = 0; + int r = FindLabel(label, instr, &dest, 0); asASSERT( r == 0 ); UNUSED_VAR(r); + + AddPath(paths, dest, stackSize); + + // Add both paths to the code paths + AddPath(paths, instr->next, stackSize); + + break; + } + else if( instr->op == asBC_JMPP ) + { + // I need to know the largest value possible + asDWORD max = *ARG_DW(instr->arg); + + // Add all destinations to the code paths + cByteInstruction *dest = instr->next; + for( asDWORD n = 0; n <= max && dest != 0; ++n ) + { + AddPath(paths, dest, stackSize); + dest = dest->next; + } + + break; + } + else + { + instr = instr->next; + if( instr == 0 || instr->marked ) + break; + } + } + } + + // Are there any instructions that didn't get visited? + instr = first; + while( instr ) + { + if( instr->marked == false ) + { + // TODO: Give warning of unvisited code + + // Remove it + cByteInstruction *curr = instr; + instr = instr->next; + DeleteInstruction(curr); + } + else + instr = instr->next; + } +} + +#ifdef AS_DEBUG +void asCByteCode::DebugOutput(const char *name, asCScriptEngine *engine) +{ + _mkdir("AS_DEBUG"); + + asCString str = "AS_DEBUG/"; + str += name; + +#if _MSC_VER >= 1500 + FILE *file; + fopen_s(&file, str.AddressOf(), "w"); +#else + FILE *file = fopen(str.AddressOf(), "w"); +#endif + + fprintf(file, "Temps: "); + for( asUINT n = 0; n < temporaryVariables.GetLength(); n++ ) + { + fprintf(file, "%d", temporaryVariables[n]); + if( n < temporaryVariables.GetLength()-1 ) + fprintf(file, ", "); + } + fprintf(file, "\n\n"); + + int pos = 0; + asUINT lineIndex = 0; + cByteInstruction *instr = first; + while( instr ) + { + if( lineIndex < lineNumbers.GetLength() && lineNumbers[lineIndex] == pos ) + { + asDWORD line = lineNumbers[lineIndex+1]; + fprintf(file, "- %d,%d -\n", (int)(line&0xFFFFF), (int)(line>>20)); + lineIndex += 2; + } + + fprintf(file, "%5d ", pos); + pos += instr->GetSize(); + + fprintf(file, "%3d %c ", instr->stackSize, instr->marked ? '*' : ' '); + + switch( asBCInfo[instr->op].type ) + { + case asBCTYPE_W_ARG: + if( instr->op == asBC_STR ) + { + int id = instr->wArg[0]; + const asCString &str = engine->GetConstantString(id); + fprintf(file, " %-8s %d (l:%ld s:\"%.10s\")\n", asBCInfo[instr->op].name, instr->wArg[0], (long int)str.GetLength(), str.AddressOf()); + } + else + fprintf(file, " %-8s %d\n", asBCInfo[instr->op].name, instr->wArg[0]); + break; + + case asBCTYPE_wW_ARG: + case asBCTYPE_rW_ARG: + fprintf(file, " %-8s v%d\n", asBCInfo[instr->op].name, instr->wArg[0]); + break; + + case asBCTYPE_wW_rW_ARG: + case asBCTYPE_rW_rW_ARG: + fprintf(file, " %-8s v%d, v%d\n", asBCInfo[instr->op].name, instr->wArg[0], instr->wArg[1]); + break; + + case asBCTYPE_W_rW_ARG: + fprintf(file, " %-8s %d, v%d\n", asBCInfo[instr->op].name, instr->wArg[0], instr->wArg[1]); + break; + + case asBCTYPE_wW_W_ARG: + fprintf(file, " %-8s v%d, %d\n", asBCInfo[instr->op].name, instr->wArg[0], instr->wArg[1]); + break; + + case asBCTYPE_wW_rW_DW_ARG: + switch( instr->op ) + { + case asBC_ADDIf: + case asBC_SUBIf: + case asBC_MULIf: + fprintf(file, " %-8s v%d, v%d, %f\n", asBCInfo[instr->op].name, instr->wArg[0], instr->wArg[1], *((float*) ARG_DW(instr->arg))); + break; + default: + fprintf(file, " %-8s v%d, v%d, %d\n", asBCInfo[instr->op].name, instr->wArg[0], instr->wArg[1], *((int*) ARG_DW(instr->arg))); + break; + } + break; + + case asBCTYPE_DW_ARG: + switch( instr->op ) + { + case asBC_OBJTYPE: + fprintf(file, " %-8s 0x%x\n", asBCInfo[instr->op].name, (asUINT)*ARG_DW(instr->arg)); + break; + + case asBC_PshC4: + case asBC_Cast: + fprintf(file, " %-8s 0x%x (i:%d, f:%g)\n", asBCInfo[instr->op].name, (asUINT)*ARG_DW(instr->arg), *((int*) ARG_DW(instr->arg)), *((float*) ARG_DW(instr->arg))); + break; + + case asBC_TYPEID: + fprintf(file, " %-8s 0x%x '%s'\n", asBCInfo[instr->op].name, (asUINT)*ARG_DW(instr->arg), engine->GetTypeDeclaration((int)*ARG_DW(instr->arg))); + break; + + case asBC_CALL: + case asBC_CALLSYS: + case asBC_CALLBND: + case asBC_CALLINTF: + { + int funcID = *(int*)ARG_DW(instr->arg); + asCString decl = engine->GetFunctionDeclaration(funcID); + + fprintf(file, " %-8s %d (%s)\n", asBCInfo[instr->op].name, *((int*) ARG_DW(instr->arg)), decl.AddressOf()); + } + break; + + case asBC_FREE: + case asBC_REFCPY: + fprintf(file, " %-8s 0x%x\n", asBCInfo[instr->op].name, *((int*) ARG_DW(instr->arg))); + break; + + case asBC_JMP: + case asBC_JZ: + case asBC_JS: + case asBC_JP: + case asBC_JNZ: + case asBC_JNS: + case asBC_JNP: + fprintf(file, " %-8s %+d (d:%d)\n", asBCInfo[instr->op].name, *((int*) ARG_DW(instr->arg)), pos+*((int*) ARG_DW(instr->arg))); + break; + + default: + fprintf(file, " %-8s %d\n", asBCInfo[instr->op].name, *((int*) ARG_DW(instr->arg))); + break; + } + break; + + case asBCTYPE_QW_ARG: +#ifdef __GNUC__ +#ifdef _LP64 + fprintf(file, " %-8s 0x%lx (i:%ld, f:%g)\n", asBCInfo[instr->op].name, *ARG_QW(instr->arg), *((asINT64*) ARG_QW(instr->arg)), *((double*) ARG_QW(instr->arg))); +#else + fprintf(file, " %-8s 0x%llx (i:%lld, f:%g)\n", asBCInfo[instr->op].name, *ARG_QW(instr->arg), *((asINT64*) ARG_QW(instr->arg)), *((double*) ARG_QW(instr->arg))); +#endif +#else + fprintf(file, " %-8s 0x%I64x (i:%I64d, f:%g)\n", asBCInfo[instr->op].name, *ARG_QW(instr->arg), *((asINT64*) ARG_QW(instr->arg)), *((double*) ARG_QW(instr->arg))); +#endif + break; + + case asBCTYPE_wW_QW_ARG: +#ifdef __GNUC__ +#ifdef _LP64 + fprintf(file, " %-8s v%d, 0x%lx (i:%ld, f:%g)\n", asBCInfo[instr->op].name, instr->wArg[0], *ARG_QW(instr->arg), *((asINT64*) ARG_QW(instr->arg)), *((double*) ARG_QW(instr->arg))); +#else + fprintf(file, " %-8s v%d, 0x%llx (i:%lld, f:%g)\n", asBCInfo[instr->op].name, instr->wArg[0], *ARG_QW(instr->arg), *((asINT64*) ARG_QW(instr->arg)), *((double*) ARG_QW(instr->arg))); +#endif +#else + fprintf(file, " %-8s v%d, 0x%I64x (i:%I64d, f:%g)\n", asBCInfo[instr->op].name, instr->wArg[0], *ARG_QW(instr->arg), *((asINT64*) ARG_QW(instr->arg)), *((double*) ARG_QW(instr->arg))); +#endif + break; + + case asBCTYPE_DW_DW_ARG: + if( instr->op == asBC_ALLOC ) + { + asCObjectType *ot = *(asCObjectType**)ARG_DW(instr->arg); + fprintf(file, " %-8s 0x%x, %d (type:%s)\n", asBCInfo[instr->op].name, *(int*)ARG_DW(instr->arg), *(int*)(ARG_DW(instr->arg)+1), ot->GetName()); + } + else + fprintf(file, " %-8s %u, %d\n", asBCInfo[instr->op].name, *(int*)ARG_DW(instr->arg), *(int*)(ARG_DW(instr->arg)+1)); + break; + + case asBCTYPE_QW_DW_ARG: + if( instr->op == asBC_ALLOC ) + { + asCObjectType *ot = *(asCObjectType**)ARG_QW(instr->arg); +#ifdef __GNUC__ +#ifdef AS_64BIT_PTR + fprintf(file, " %-8s 0x%lx, %d (type:%s)\n", asBCInfo[instr->op].name, *(asINT64*)ARG_QW(instr->arg), *(int*)(ARG_DW(instr->arg)+2), ot->GetName()); +#else + fprintf(file, " %-8s 0x%llx, %d (type:%s)\n", asBCInfo[instr->op].name, *(asINT64*)ARG_QW(instr->arg), *(int*)(ARG_DW(instr->arg)+2), ot->GetName()); +#endif +#else + fprintf(file, " %-8s 0x%I64x, %d (type:%s)\n", asBCInfo[instr->op].name, *(asINT64*)ARG_QW(instr->arg), *(int*)(ARG_DW(instr->arg)+2), ot->GetName()); +#endif + } + else +#ifdef __GNUC__ +#ifdef AS_64BIT_PTR + fprintf(file, " %-8s %lu, %d\n", asBCInfo[instr->op].name, *(asINT64*)ARG_QW(instr->arg), *(int*)(ARG_DW(instr->arg)+2)); +#else + fprintf(file, " %-8s %llu, %d\n", asBCInfo[instr->op].name, *(asINT64*)ARG_QW(instr->arg), *(int*)(ARG_DW(instr->arg)+2)); +#endif +#else + fprintf(file, " %-8s %I64u, %d\n", asBCInfo[instr->op].name, *(asINT64*)ARG_QW(instr->arg), *(int*)(ARG_DW(instr->arg)+2)); +#endif + break; + + case asBCTYPE_INFO: + if( instr->op == asBC_LABEL ) + fprintf(file, "%d:\n", instr->wArg[0]); + else + fprintf(file, " %s\n", asBCInfo[instr->op].name); + break; + + case asBCTYPE_rW_DW_ARG: + case asBCTYPE_wW_DW_ARG: + if( instr->op == asBC_SetV1 ) + fprintf(file, " %-8s v%d, 0x%x\n", asBCInfo[instr->op].name, instr->wArg[0], *(asBYTE*)ARG_DW(instr->arg)); + else if( instr->op == asBC_SetV2 ) + fprintf(file, " %-8s v%d, 0x%x\n", asBCInfo[instr->op].name, instr->wArg[0], *(asWORD*)ARG_DW(instr->arg)); + else if( instr->op == asBC_SetV4 ) + fprintf(file, " %-8s v%d, 0x%x (i:%d, f:%g)\n", asBCInfo[instr->op].name, instr->wArg[0], (asUINT)*ARG_DW(instr->arg), *((int*) ARG_DW(instr->arg)), *((float*) ARG_DW(instr->arg))); + else if( instr->op == asBC_CMPIf ) + fprintf(file, " %-8s v%d, %f\n", asBCInfo[instr->op].name, instr->wArg[0], *(float*)ARG_DW(instr->arg)); + else + fprintf(file, " %-8s v%d, %d\n", asBCInfo[instr->op].name, instr->wArg[0], (asUINT)*ARG_DW(instr->arg)); + break; + + case asBCTYPE_W_DW_ARG: + // TODO: global: The global var address should be stored in the instruction directly + if( instr->op == asBC_SetG4 ) + fprintf(file, " %-8s %d, 0x%x (i:%d, f:%g)\n", asBCInfo[instr->op].name, instr->wArg[0], (asUINT)*ARG_DW(instr->arg), *((int*) ARG_DW(instr->arg)), *((float*) ARG_DW(instr->arg))); + break; + + case asBCTYPE_wW_rW_rW_ARG: + fprintf(file, " %-8s v%d, v%d, v%d\n", asBCInfo[instr->op].name, instr->wArg[0], instr->wArg[1], instr->wArg[2]); + break; + + case asBCTYPE_NO_ARG: + fprintf(file, " %s\n", asBCInfo[instr->op].name); + break; + + default: + asASSERT(false); + } + + instr = instr->next; + } + + fclose(file); +} +#endif + +//============================================================================= + +// Decrease stack with "numDwords" +int asCByteCode::Pop(int numDwords) +{ + asASSERT(asBCInfo[asBC_POP].type == asBCTYPE_W_ARG); + + if( AddInstruction() < 0 ) + return 0; + + last->op = asBC_POP; + last->wArg[0] = (short)numDwords; + last->size = asBCTypeSize[asBCInfo[asBC_POP].type]; + last->stackInc = -numDwords; + + return last->stackInc; +} + +// Increase stack with "numDwords" +int asCByteCode::Push(int numDwords) +{ + asASSERT(asBCInfo[asBC_PUSH].type == asBCTYPE_W_ARG); + + if( AddInstruction() < 0 ) + return 0; + + last->op = asBC_PUSH; + last->wArg[0] = (short)numDwords; + last->size = asBCTypeSize[asBCInfo[asBC_PUSH].type]; + last->stackInc = numDwords; + + return last->stackInc; +} + + +int asCByteCode::InsertFirstInstrDWORD(asEBCInstr bc, asDWORD param) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_DW_ARG); + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstructionFirst() < 0 ) + return 0; + + first->op = bc; + *ARG_DW(first->arg) = param; + first->size = asBCTypeSize[asBCInfo[bc].type]; + first->stackInc = asBCInfo[bc].stackInc; + + return first->stackInc; +} + +int asCByteCode::InsertFirstInstrQWORD(asEBCInstr bc, asQWORD param) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_QW_ARG); + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstructionFirst() < 0 ) + return 0; + + first->op = bc; + *ARG_QW(first->arg) = param; + first->size = asBCTypeSize[asBCInfo[bc].type]; + first->stackInc = asBCInfo[bc].stackInc; + + return first->stackInc; +} + +int asCByteCode::Instr(asEBCInstr bc) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_NO_ARG); + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrW_W_W(asEBCInstr bc, int a, int b, int c) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_wW_rW_rW_ARG); + asASSERT(asBCInfo[bc].stackInc == 0); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = (short)a; + last->wArg[1] = (short)b; + last->wArg[2] = (short)c; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrW_W(asEBCInstr bc, int a, int b) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_wW_rW_ARG || + asBCInfo[bc].type == asBCTYPE_rW_rW_ARG); + asASSERT(asBCInfo[bc].stackInc == 0); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = (short)a; + last->wArg[1] = (short)b; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrW_DW(asEBCInstr bc, asWORD a, asDWORD b) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_wW_DW_ARG || + asBCInfo[bc].type == asBCTYPE_rW_DW_ARG); + asASSERT(asBCInfo[bc].stackInc == 0); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = a; + *((int*) ARG_DW(last->arg)) = b; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrSHORT_B(asEBCInstr bc, short a, asBYTE b) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_wW_DW_ARG || + asBCInfo[bc].type == asBCTYPE_rW_DW_ARG); + asASSERT(asBCInfo[bc].stackInc == 0); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = a; + + // We'll have to be careful to store the byte correctly, independent of endianess. + // Some optimizing compilers may change the order of operations, so we make sure + // the value is not overwritten even if that happens. + asBYTE *argPtr = (asBYTE*)ARG_DW(last->arg); + argPtr[0] = b; // The value is always stored in the lower byte + argPtr[1] = 0; // and clear the rest of the DWORD + argPtr[2] = 0; + argPtr[3] = 0; + + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrSHORT_W(asEBCInstr bc, short a, asWORD b) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_wW_DW_ARG || + asBCInfo[bc].type == asBCTYPE_rW_DW_ARG); + asASSERT(asBCInfo[bc].stackInc == 0); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = a; + + // We'll have to be careful to store the word correctly, independent of endianess. + // Some optimizing compilers may change the order of operations, so we make sure + // the value is not overwritten even if that happens. + asWORD *argPtr = (asWORD*)ARG_DW(last->arg); + argPtr[0] = b; // The value is always stored in the lower word + argPtr[1] = 0; // and clear the rest of the DWORD + + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrSHORT_DW(asEBCInstr bc, short a, asDWORD b) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_wW_DW_ARG || + asBCInfo[bc].type == asBCTYPE_rW_DW_ARG); + asASSERT(asBCInfo[bc].stackInc == 0); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = a; + *((int*) ARG_DW(last->arg)) = b; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrW_QW(asEBCInstr bc, asWORD a, asQWORD b) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_wW_QW_ARG); + asASSERT(asBCInfo[bc].stackInc == 0); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = a; + *ARG_QW(last->arg) = b; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrSHORT_QW(asEBCInstr bc, short a, asQWORD b) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_wW_QW_ARG); + asASSERT(asBCInfo[bc].stackInc == 0); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = a; + *ARG_QW(last->arg) = b; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrW_FLOAT(asEBCInstr bc, asWORD a, float b) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_wW_DW_ARG); + asASSERT(asBCInfo[bc].stackInc == 0); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = a; + *((float*) ARG_DW(last->arg)) = b; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrSHORT(asEBCInstr bc, short param) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_rW_ARG || + asBCInfo[bc].type == asBCTYPE_wW_ARG || + asBCInfo[bc].type == asBCTYPE_W_ARG); + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = param; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrINT(asEBCInstr bc, int param) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_DW_ARG); + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + *((int*) ARG_DW(last->arg)) = param; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrDWORD(asEBCInstr bc, asDWORD param) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_DW_ARG); + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + *ARG_DW(last->arg) = param; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrPTR(asEBCInstr bc, void *param) +{ + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + asASSERT(asBCInfo[bc].type == asBCTYPE_PTR_ARG); + *ARG_PTR(last->arg) = (asPTRWORD)(size_t)param; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrQWORD(asEBCInstr bc, asQWORD param) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_QW_ARG); + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + *ARG_QW(last->arg) = param; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrWORD(asEBCInstr bc, asWORD param) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_W_ARG || + asBCInfo[bc].type == asBCTYPE_rW_ARG || + asBCInfo[bc].type == asBCTYPE_wW_ARG); + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + last->wArg[0] = param; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrFLOAT(asEBCInstr bc, float param) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_DW_ARG); + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + *((float*) ARG_DW(last->arg)) = param; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::InstrDOUBLE(asEBCInstr bc, double param) +{ + asASSERT(asBCInfo[bc].type == asBCTYPE_QW_ARG); + asASSERT(asBCInfo[bc].stackInc != 0xFFFF); + + if( AddInstruction() < 0 ) + return 0; + + last->op = bc; + *((double*) ARG_QW(last->arg)) = param; + last->size = asBCTypeSize[asBCInfo[bc].type]; + last->stackInc = asBCInfo[bc].stackInc; + + return last->stackInc; +} + +int asCByteCode::GetLastInstr() +{ + if( last == 0 ) return -1; + + return last->op; +} + +int asCByteCode::RemoveLastInstr() +{ + if( last == 0 ) return -1; + + if( first == last ) + { + engine->memoryMgr.FreeByteInstruction(last); + first = 0; + last = 0; + } + else + { + cByteInstruction *bc = last; + last = bc->prev; + + bc->Remove(); + engine->memoryMgr.FreeByteInstruction(bc); + } + + return 0; +} + +asDWORD asCByteCode::GetLastInstrValueDW() +{ + if( last == 0 ) return 0; + + return *ARG_DW(last->arg); +} + +void asCByteCode::DefineTemporaryVariable(int varOffset) +{ + temporaryVariables.PushLast(varOffset); +} + +//=================================================================== + +cByteInstruction::cByteInstruction() +{ + next = 0; + prev = 0; + + op = asBC_LABEL; + + arg = 0; + wArg[0] = 0; + wArg[1] = 0; + wArg[2] = 0; + size = 0; + stackInc = 0; + marked = false; + stackSize = 0; +} + +void cByteInstruction::AddAfter(cByteInstruction *nextCode) +{ + if( next ) + next->prev = nextCode; + + nextCode->next = next; + nextCode->prev = this; + next = nextCode; +} + +void cByteInstruction::AddBefore(cByteInstruction *prevCode) +{ + if( prev ) + prev->next = prevCode; + + prevCode->prev = prev; + prevCode->next = this; + prev = prevCode; +} + +int cByteInstruction::GetSize() +{ + return size; +} + +int cByteInstruction::GetStackIncrease() +{ + return stackInc; +} + +void cByteInstruction::Remove() +{ + if( prev ) prev->next = next; + if( next ) next->prev = prev; + prev = 0; + next = 0; +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_bytecode.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_bytecode.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_bytecode.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_bytecode.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,187 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_bytecode.h +// +// A class for constructing the final byte code +// + + + +#ifndef AS_BYTECODE_H +#define AS_BYTECODE_H + +#include "as_config.h" +#include "as_array.h" + +BEGIN_AS_NAMESPACE + +#define BYTECODE_SIZE 4 +#define MAX_DATA_SIZE 8 +#define MAX_INSTR_SIZE (BYTECODE_SIZE+MAX_DATA_SIZE) + +class asCScriptEngine; +class cByteInstruction; + +class asCByteCode +{ +public: + asCByteCode(asCScriptEngine *engine); + ~asCByteCode(); + + void ClearAll(); + + int GetSize(); + + void Finalize(); + + int Optimize(); + void ExtractLineNumbers(); + int ResolveJumpAddresses(); + int FindLabel(int label, cByteInstruction *from, cByteInstruction **dest, int *positionDelta); + + void AddPath(asCArray &paths, cByteInstruction *instr, int stackSize); + + void Output(asDWORD *array); + void AddCode(asCByteCode *bc); + + void PostProcess(); + +#ifdef AS_DEBUG + void DebugOutput(const char *name, asCScriptEngine *engine); +#endif + + int GetLastInstr(); + int RemoveLastInstr(); + asDWORD GetLastInstrValueDW(); + + void InsertIfNotExists(asCArray &vars, int var); + void GetVarsUsed(asCArray &vars); + bool IsVarUsed(int offset); + void ExchangeVar(int oldOffset, int newOffset); + + void Label(short label); + void Line(int line, int column); + void Call(asEBCInstr bc, int funcID, int pop); + void Alloc(asEBCInstr bc, void *objID, int funcID, int pop); + void Ret(int pop); + void JmpP(int var, asDWORD max); + + int InsertFirstInstrDWORD(asEBCInstr bc, asDWORD param); + int InsertFirstInstrQWORD(asEBCInstr bc, asQWORD param); + int Instr(asEBCInstr bc); + int InstrQWORD(asEBCInstr bc, asQWORD param); + int InstrDOUBLE(asEBCInstr bc, double param); + int InstrPTR(asEBCInstr bc, void *param); + int InstrDWORD(asEBCInstr bc, asDWORD param); + int InstrWORD(asEBCInstr bc, asWORD param); + int InstrSHORT(asEBCInstr bc, short param); + int InstrFLOAT(asEBCInstr bc, float param); + int InstrINT(asEBCInstr bc, int param); + int InstrW_W_W(asEBCInstr bc, int a, int b, int c); + int InstrSHORT_B(asEBCInstr bc, short a, asBYTE b); + int InstrSHORT_W(asEBCInstr bc, short a, asWORD b); + int InstrSHORT_DW(asEBCInstr bc, short a, asDWORD b); + int InstrSHORT_QW(asEBCInstr bc, short a, asQWORD b); + int InstrW_DW(asEBCInstr bc, asWORD a, asDWORD b); + int InstrW_QW(asEBCInstr bc, asWORD a, asQWORD b); + int InstrW_FLOAT(asEBCInstr bc, asWORD a, float b); + int InstrW_W(asEBCInstr bc, int w, int b); + + int Pop (int numDwords); + int Push(int numDwords); + + asCArray lineNumbers; + int largestStackUsed; + + void DefineTemporaryVariable(int varOffset); + +protected: + // Helpers for Optimize + bool CanBeSwapped(cByteInstruction *curr); + bool IsCombination(cByteInstruction *curr, asEBCInstr bc1, asEBCInstr bc2); + bool IsCombination(cByteInstruction *curr, asEBCInstr bc1, asEBCInstr bc2, asEBCInstr bc3); + cByteInstruction *ChangeFirstDeleteNext(cByteInstruction *curr, asEBCInstr bc); + cByteInstruction *DeleteFirstChangeNext(cByteInstruction *curr, asEBCInstr bc); + cByteInstruction *DeleteInstruction(cByteInstruction *instr); + void RemoveInstruction(cByteInstruction *instr); + cByteInstruction *GoBack(cByteInstruction *curr); + void InsertBefore(cByteInstruction *before, cByteInstruction *instr); + bool RemoveUnusedValue(cByteInstruction *curr, cByteInstruction **next); + bool IsTemporary(short offset); + bool IsTempRegUsed(cByteInstruction *curr); + bool IsTempVarRead(cByteInstruction *curr, int offset); + bool PostponeInitOfTemp(cByteInstruction *curr, cByteInstruction **next); + bool IsTempVarReadByInstr(cByteInstruction *curr, int var); + bool IsTempVarOverwrittenByInstr(cByteInstruction *curr, int var); + bool IsInstrJmpOrLabel(cByteInstruction *curr); + + int AddInstruction(); + int AddInstructionFirst(); + + cByteInstruction *first; + cByteInstruction *last; + + asCArray temporaryVariables; + + asCScriptEngine *engine; +}; + +class cByteInstruction +{ +public: + cByteInstruction(); + + void AddAfter(cByteInstruction *nextCode); + void AddBefore(cByteInstruction *nextCode); + void Remove(); + + int GetSize(); + int GetStackIncrease(); + + cByteInstruction *next; + cByteInstruction *prev; + + asEBCInstr op; + asQWORD arg; + short wArg[3]; + int size; + int stackInc; + + // Testing + bool marked; + int stackSize; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,344 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_callfunc_arm.cpp +// +// These functions handle the actual calling of system functions on the arm platform +// +// Written by Fredrik Ehnbom in June 2009, based on as_callfunc_x86.cpp + + +#include "as_config.h" + +#ifndef AS_MAX_PORTABILITY +#ifdef AS_ARM + +#include "as_callfunc.h" +#include "as_scriptengine.h" +#include "as_texts.h" +#include "as_tokendef.h" + +BEGIN_AS_NAMESPACE + +extern "C" asQWORD armFunc(const asDWORD *, int, size_t); +extern "C" asQWORD armFuncR0(const asDWORD *, int, size_t, asDWORD r0); +extern "C" asQWORD armFuncR0R1(const asDWORD *, int, size_t, asDWORD r0, asDWORD r1); +extern "C" asQWORD armFuncObjLast(const asDWORD *, int, size_t, asDWORD obj); +extern "C" asQWORD armFuncR0ObjLast(const asDWORD *, int, size_t, asDWORD r0, asDWORD obj); + +// TODO: CallSystemFunction should be split in two layers. The top layer +// implements the parts that are common to all system functions, +// e.g. the check for generic calling convention, the extraction of the +// object pointer, the processing of auto handles, and the pop size. +// Remember that the proper handling of auto handles is implemented in +// as_callfunc_x64_gcc.cpp as that code can handle both 32bit and 64bit pointers. +// +// The lower layer implemented in CallNativeSystemFunction will then +// be responsible for just transforming the parameters to the native +// calling convention. +// +// This should be done for all supported platforms. +int CallSystemFunction(int id, asCContext *context, void *objectPointer) +{ + asCScriptEngine *engine = context->engine; + asCScriptFunction *descr = engine->scriptFunctions[id]; + asSSystemFunctionInterface *sysFunc = descr->sysFuncIntf; + int callConv = sysFunc->callConv; + if( callConv == ICC_GENERIC_FUNC || callConv == ICC_GENERIC_METHOD ) + return context->CallGeneric(id, objectPointer); + + asQWORD retQW = 0; + void *func = (void*)sysFunc->func; + int paramSize = sysFunc->paramSize; + asDWORD *args = context->regs.stackPointer; + void *retPointer = 0; + void *obj = 0; + asDWORD *vftable; + int popSize = paramSize; + + context->regs.objectType = descr->returnType.GetObjectType(); + if( descr->returnType.IsObject() && !descr->returnType.IsReference() && !descr->returnType.IsObjectHandle() ) + { + // Allocate the memory for the object + retPointer = engine->CallAlloc(descr->returnType.GetObjectType()); + + if( sysFunc->hostReturnInMemory ) + { + // The return is made in memory + callConv++; + } + } + + if( callConv >= ICC_THISCALL ) + { + if( objectPointer ) + { + obj = objectPointer; + } + else + { + // The object pointer should be popped from the context stack + popSize++; + + // Check for null pointer + obj = (void*)*(size_t*)(args); + if( obj == 0 ) + { + context->SetInternalException(TXT_NULL_POINTER_ACCESS); + if( retPointer ) + engine->CallFree(retPointer); + return 0; + } + + // Add the base offset for multiple inheritance +#ifdef __GNUC__ + // On GNUC + ARM the lsb of the offset is used to indicate a virtual function + // and the whole offset is thus shifted one bit left to keep the original + // offset resolution + obj = (void*)(size_t(obj) + (sysFunc->baseOffset>>1)); +#else + obj = (void*)(size_t(obj) + sysFunc->baseOffset); +#endif + + // Skip the object pointer + args++; + } + } + + asDWORD paramBuffer[64]; + if( sysFunc->takesObjByVal ) + { + paramSize = 0; + int spos = 0; + int dpos = 1; + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + { +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK ) + { + paramBuffer[dpos++] = args[spos++]; + paramSize++; + } + else +#endif + { + // Copy the object's memory to the buffer + memcpy(¶mBuffer[dpos], *(void**)(args+spos), descr->parameterTypes[n].GetSizeInMemoryBytes()); + + // Delete the original memory + engine->CallFree(*(char**)(args+spos)); + spos++; + dpos += descr->parameterTypes[n].GetSizeInMemoryDWords(); + paramSize += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } + else + { + // Copy the value directly + paramBuffer[dpos++] = args[spos++]; + if( descr->parameterTypes[n].GetSizeOnStackDWords() > 1 ) + paramBuffer[dpos++] = args[spos++]; + paramSize += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + // Keep a free location at the beginning + args = ¶mBuffer[1]; + } + + context->isCallingSystemFunction = true; + + switch( callConv ) + { + case ICC_CDECL_RETURNINMEM: // fall through + case ICC_STDCALL_RETURNINMEM: + retQW = armFuncR0(args, paramSize<<2, (asDWORD)func, (asDWORD) retPointer); + break; + case ICC_CDECL: // fall through + case ICC_STDCALL: + retQW = armFunc(args, paramSize<<2, (asDWORD)func); + break; + case ICC_THISCALL: // fall through + case ICC_CDECL_OBJFIRST: + retQW = armFuncR0(args, paramSize<<2, (asDWORD)func, (asDWORD) obj); + break; + case ICC_THISCALL_RETURNINMEM: +#ifndef __GNUC__ + retQW = armFuncR0R1(args, paramSize<<2, (asDWORD)func, (asDWORD) obj, (asDWORD) retPointer); + break; +#endif + case ICC_CDECL_OBJFIRST_RETURNINMEM: + retQW = armFuncR0R1(args, paramSize<<2, (asDWORD)func, (asDWORD) retPointer, (asDWORD) obj); + break; + case ICC_VIRTUAL_THISCALL: + // Get virtual function table from the object pointer + vftable = *(asDWORD**)obj; + retQW = armFuncR0(args, paramSize<<2, vftable[asDWORD(func)>>2], (asDWORD) obj); + break; + case ICC_VIRTUAL_THISCALL_RETURNINMEM: + // Get virtual function table from the object pointer + vftable = *(asDWORD**)obj; +#ifndef __GNUC__ + retQW = armFuncR0R1(args, (paramSize+1)<<2, vftable[asDWORD(func)>>2], (asDWORD) retPointer, (asDWORD) obj); +#else + retQW = armFuncR0R1(args, (paramSize+1)<<2, vftable[asDWORD(func)>>2], (asDWORD) obj, (asDWORD) retPointer); +#endif + break; + case ICC_CDECL_OBJLAST: + retQW = armFuncObjLast(args, paramSize<<2, (asDWORD)func, (asDWORD) obj); + break; + case ICC_CDECL_OBJLAST_RETURNINMEM: + retQW = armFuncR0ObjLast(args, paramSize<<2, (asDWORD)func, (asDWORD) retPointer, (asDWORD) obj); + break; + default: + context->SetInternalException(TXT_INVALID_CALLING_CONVENTION); + } + context->isCallingSystemFunction = false; +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( sysFunc->takesObjByVal ) + { + // Need to free the complex objects passed by value + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + args++; + + int spos = 0; + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && + !descr->parameterTypes[n].IsReference() && + !descr->parameterTypes[n].IsObjectHandle() + ) + { + if (descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK) + { + void *obj = (void*)args[spos++]; + + // Running the destructor here results in the destructor being + // run twice as it has already been called in the native function. + // TODO: Should this be an ifdef or removed completely? +// asSTypeBehaviour *beh = &descr->parameterTypes[n].GetObjectType()->beh; +// if( beh->destruct ) +// engine->CallObjectMethod(obj, beh->destruct); + + engine->CallFree(obj); + } + else + { + // The original data was already freed earlier + spos += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } + else + { + spos += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + } +#endif + + // Store the returned value in our stack + if( descr->returnType.IsObject() && !descr->returnType.IsReference() ) + { + if( descr->returnType.IsObjectHandle() ) + { + context->regs.objectRegister = (void*)(size_t)retQW; + + if( sysFunc->returnAutoHandle && context->regs.objectRegister ) + engine->CallObjectMethod(context->regs.objectRegister, descr->returnType.GetObjectType()->beh.addref); + } + else + { + if( !sysFunc->hostReturnInMemory ) + { + // Copy the returned value to the pointer sent by the script engine + if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)retPointer = (asDWORD)retQW; + else + *(asQWORD*)retPointer = retQW; + } + + // Store the object in the register + context->regs.objectRegister = retPointer; + } + } + else + { + // Store value in valueRegister + if( sysFunc->hostReturnFloat ) + { + if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)&context->regs.valueRegister = (asDWORD) retQW; + else + context->regs.valueRegister = retQW; + } + else if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)&context->regs.valueRegister = (asDWORD)retQW; + else + context->regs.valueRegister = retQW; + } + + if( sysFunc->hasAutoHandles ) + { + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + args++; + + int spos = 0; + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( sysFunc->paramAutoHandles[n] && args[spos] ) + { + // Call the release method on the type + engine->CallObjectMethod((void*)*(size_t*)&args[spos], descr->parameterTypes[n].GetObjectType()->beh.release); + args[spos] = 0; + } + + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + spos++; + else + spos += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + + return popSize; +} + +END_AS_NAMESPACE + +#endif // AS_ARM +#endif // AS_MAX_PORTABILITY + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_gcc.S kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_gcc.S --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_gcc.S 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_gcc.S 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,235 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// Assembly routines for the ARM call convention +// Written by Fredrik Ehnbom in June 2009 + +// Adapted to GNUC by darktemplar216 in September 2009 + +#if defined(__arm__) || defined(__ARM__) + +.global armFunc +.global armFuncR0 +.global armFuncR0R1 +.global armFuncObjLast +.global armFuncR0ObjLast + +armFunc: + stmdb sp!, {r4-r8, lr} + mov r6, r0 // arg table + movs r7, r1 // arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 // function address + mov r8, #0 + + beq nomoreargs + + // Load the first 4 arguments into r0-r3 + cmp r7, #4 + ldrge r0, [r6],#4 + cmp r7, #2*4 + ldrge r1, [r6],#4 + cmp r7, #3*4 + ldrge r2, [r6],#4 + cmp r7, #4*4 + ldrge r3, [r6],#4 + ble nomoreargs + + // Load the rest of the arguments onto the stack + sub r7, r7, #4*4 // skip the 4 registers already loaded into r0-r3 + sub sp, sp, r7 + mov r8, r7 +stackargsloop: + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne stackargsloop +nomoreargs: + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + ldmia sp!, {r4-r8, pc} + +armFuncObjLast: + stmdb sp!, {r4-r8, lr} + mov r6, r0 // arg table + movs r7, r1 // arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 // function address + mov r8, #0 + + mov r0, r3 // objlast. might get overwritten + str r3, [sp, #-4]! // objlast again. + + beq nomoreargsarmFuncObjLast + + // Load the first 4 arguments into r0-r3 + cmp r7, #4 + ldrge r0, [r6],#4 + cmp r7, #2*4 + ldrge r1, [r6],#4 + ldrlt r1, [sp] + cmp r7, #3*4 + ldrge r2, [r6],#4 + ldrlt r2, [sp] + cmp r7, #4*4 + ldrge r3, [r6],#4 + ldrlt r3, [sp] + ble nomoreargsarmFuncObjLast + + // Load the rest of the arguments onto the stack + sub r7, r7, #4*4 // skip the 4 registers already loaded into r0-r3 + sub sp, sp, r7 + mov r8, r7 +stackargslooparmFuncObjLast: + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne stackargslooparmFuncObjLast +nomoreargsarmFuncObjLast: + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + add sp, sp, #4 + ldmia sp!, {r4-r8, pc} + +armFuncR0ObjLast: + stmdb sp!, {r4-r8, lr} + ldr r7, [sp,#6*4] + str r7, [sp,#-4]! + + mov r6, r0 // arg table + movs r7, r1 // arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 // function address + mov r8, #0 + + mov r0, r3 // r0 explicitly set + ldr r1, [sp] // objlast. might get overwritten + + beq nomoreargsarmFuncR0ObjLast + + // Load the first 3 arguments into r1-r3 + cmp r7, #1*4 + ldrge r1, [r6],#4 + cmp r7, #2*4 + ldrge r2, [r6],#4 + ldrlt r2, [sp] + cmp r7, #3*4 + ldrge r3, [r6],#4 + ldrlt r3, [sp] + ble nomoreargsarmFuncR0ObjLast + + // Load the rest of the arguments onto the stack + sub r7, r7, #3*4 // skip the 3 registers already loaded into r1-r3 + sub sp, sp, r7 + mov r8, r7 +stackargslooparmFuncR0ObjLast: + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne stackargslooparmFuncR0ObjLast +nomoreargsarmFuncR0ObjLast: + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + add sp, sp, #4 + ldmia sp!, {r4-r8, pc} + + +armFuncR0: + stmdb sp!, {r4-r8, lr} + mov r6, r0 // arg table + movs r7, r1 // arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 // function address + mov r8, #0 + + mov r0, r3 // r0 explicitly set + + beq nomoreargsarmFuncR0 + + // Load the first 3 arguments into r1-r3 + cmp r7, #1*4 + ldrge r1, [r6],#4 + cmp r7, #2*4 + ldrge r2, [r6],#4 + cmp r7, #3*4 + ldrge r3, [r6],#4 + ble nomoreargsarmFuncR0 + + // Load the rest of the arguments onto the stack + sub r7, r7, #3*4 // skip the 3 registers already loaded into r1-r3 + sub sp, sp, r7 + mov r8, r7 +stackargslooparmFuncR0: + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne stackargslooparmFuncR0 +nomoreargsarmFuncR0: + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + ldmia sp!, {r4-r8, pc} + + +armFuncR0R1: + stmdb sp!, {r4-r8, lr} + mov r6, r0 // arg table + movs r7, r1 // arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 // function address + mov r8, #0 + + mov r0, r3 // r0 explicitly set + ldr r1, [sp, #6*4] // r1 explicitly set too + + beq nomoreargsarmFuncR0R1 + + // Load the first 2 arguments into r2-r3 + cmp r7, #1*4 + ldrge r2, [r6],#4 + cmp r7, #2*4 + ldrge r3, [r6],#4 + ble nomoreargsarmFuncR0R1 + + // Load the rest of the arguments onto the stack + sub r7, r7, #2*4 // skip the 2 registers already loaded into r2-r3 + sub sp, sp, r7 + mov r8, r7 +stackargslooparmFuncR0R1: + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne stackargslooparmFuncR0R1 +nomoreargsarmFuncR0R1: + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + ldmia sp!, {r4-r8, pc} + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_msvc.asm kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_msvc.asm --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_msvc.asm 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_msvc.asm 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,242 @@ +; +; AngelCode Scripting Library +; Copyright (c) 2003-2009 Andreas Jonsson +; +; 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. +; +; The original version of this library can be located at: +; http://www.angelcode.com/angelscript/ +; +; Andreas Jonsson +; andreas@angelcode.com +; + + +; Assembly routines for the ARM call convention +; Written by Fredrik Ehnbom in June 2009 + +; MSVC currently doesn't support inline assembly for the ARM platform +; so this separate file is needed. + + + AREA |.rdata|, DATA, READONLY + EXPORT |armFunc| + EXPORT armFuncR0 + EXPORT armFuncR0R1 + EXPORT armFuncObjLast + EXPORT armFuncR0ObjLast + + + AREA |.text|, CODE, ARM + +|armFunc| PROC + stmdb sp!, {r4-r8, lr} + mov r6, r0 ; arg table + movs r7, r1 ; arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 ; function address + mov r8, #0 + + beq |nomoreargs| + + ; Load the first 4 arguments into r0-r3 + cmp r7, #4 + ldrge r0, [r6],#4 + cmp r7, #2*4 + ldrge r1, [r6],#4 + cmp r7, #3*4 + ldrge r2, [r6],#4 + cmp r7, #4*4 + ldrge r3, [r6],#4 + ble |nomoreargs| + + ; Load the rest of the arguments onto the stack + sub r7, r7, #4*4 ; skip the 4 registers already loaded into r0-r3 + sub sp, sp, r7 + mov r8, r7 +|stackargsloop| + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne |stackargsloop| +|nomoreargs| + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + ldmia sp!, {r4-r8, pc} + ENDP + +armFuncObjLast PROC + stmdb sp!, {r4-r8, lr} + mov r6, r0 ; arg table + movs r7, r1 ; arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 ; function address + mov r8, #0 + + mov r0, r3 ; objlast. might get overwritten + str r3, [sp, #-4]! ; objlast again. + + beq |nomoreargs@armFuncObjLast| + + ; Load the first 4 arguments into r0-r3 + cmp r7, #4 + ldrge r0, [r6],#4 + cmp r7, #2*4 + ldrge r1, [r6],#4 + ldrlt r1, [sp] + cmp r7, #3*4 + ldrge r2, [r6],#4 + ldrlt r2, [sp] + cmp r7, #4*4 + ldrge r3, [r6],#4 + ldrlt r3, [sp] + ble |nomoreargs@armFuncObjLast| + + ; Load the rest of the arguments onto the stack + sub r7, r7, #4*4 ; skip the 4 registers already loaded into r0-r3 + sub sp, sp, r7 + mov r8, r7 +|stackargsloop@armFuncObjLast| + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne |stackargsloop@armFuncObjLast| +|nomoreargs@armFuncObjLast| + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + add sp, sp, #4 + ldmia sp!, {r4-r8, pc} + ENDP + +armFuncR0ObjLast PROC + stmdb sp!, {r4-r8, lr} + ldr r7, [sp,#6*4] + str r7, [sp,#-4]! + + mov r6, r0 ; arg table + movs r7, r1 ; arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 ; function address + mov r8, #0 + + mov r0, r3 ; r0 explicitly set + ldr r1, [sp] ; objlast. might get overwritten + + beq |nomoreargs@armFuncR0ObjLast| + + ; Load the first 3 arguments into r1-r3 + cmp r7, #1*4 + ldrge r1, [r6],#4 + cmp r7, #2*4 + ldrge r2, [r6],#4 + ldrlt r2, [sp] + cmp r7, #3*4 + ldrge r3, [r6],#4 + ldrlt r3, [sp] + ble |nomoreargs@armFuncR0ObjLast| + + ; Load the rest of the arguments onto the stack + sub r7, r7, #3*4 ; skip the 3 registers already loaded into r1-r3 + sub sp, sp, r7 + mov r8, r7 +|stackargsloop@armFuncR0ObjLast| + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne |stackargsloop@armFuncR0ObjLast| +|nomoreargs@armFuncR0ObjLast| + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + add sp, sp, #4 + ldmia sp!, {r4-r8, pc} + ENDP + +armFuncR0 PROC + stmdb sp!, {r4-r8, lr} + mov r6, r0 ; arg table + movs r7, r1 ; arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 ; function address + mov r8, #0 + + mov r0, r3 ; r0 explicitly set + + beq |nomoreargs@armFuncR0| + + ; Load the first 3 arguments into r1-r3 + cmp r7, #1*4 + ldrge r1, [r6],#4 + cmp r7, #2*4 + ldrge r2, [r6],#4 + cmp r7, #3*4 + ldrge r3, [r6],#4 + ble |nomoreargs@armFuncR0| + + ; Load the rest of the arguments onto the stack + sub r7, r7, #3*4 ; skip the 3 registers already loaded into r1-r3 + sub sp, sp, r7 + mov r8, r7 +|stackargsloop@armFuncR0| + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne |stackargsloop@armFuncR0| +|nomoreargs@armFuncR0| + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + ldmia sp!, {r4-r8, pc} + ENDP + +armFuncR0R1 PROC + stmdb sp!, {r4-r8, lr} + mov r6, r0 ; arg table + movs r7, r1 ; arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 ; function address + mov r8, #0 + + mov r0, r3 ; r0 explicitly set + ldr r1, [sp, #6*4] ; r1 explicitly set too + + beq |nomoreargs@armFuncR0R1| + + ; Load the first 2 arguments into r2-r3 + cmp r7, #1*4 + ldrge r2, [r6],#4 + cmp r7, #2*4 + ldrge r3, [r6],#4 + ble |nomoreargs@armFuncR0R1| + + ; Load the rest of the arguments onto the stack + sub r7, r7, #2*4 ; skip the 2 registers already loaded into r2-r3 + sub sp, sp, r7 + mov r8, r7 +|stackargsloop@armFuncR0R1| + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne |stackargsloop@armFuncR0R1| +|nomoreargs@armFuncR0R1| + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + ldmia sp!, {r4-r8, pc} + ENDP + + END diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_xcode.s kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_xcode.s --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_xcode.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_arm_xcode.s 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,237 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// Assembly routines for the ARM call convention +// Written by Fredrik Ehnbom in June 2009 + +// Adapted to GNUC by darktemplar216 in September 2009 +// Small fixed to work under XCode GCC by Gilad Novik in October 2009 + +#if defined(__arm__) || defined(__ARM__) + +.align 2 +.globl _armFunc +.globl _armFuncR0 +.globl _armFuncR0R1 +.globl _armFuncObjLast +.globl _armFuncR0ObjLast + +_armFunc: + stmdb sp!, {r4-r8, lr} + mov r6, r0 // arg table + movs r7, r1 // arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 // function address + mov r8, #0 + + beq nomoreargs + + // Load the first 4 arguments into r0-r3 + cmp r7, #4 + ldrge r0, [r6],#4 + cmp r7, #2*4 + ldrge r1, [r6],#4 + cmp r7, #3*4 + ldrge r2, [r6],#4 + cmp r7, #4*4 + ldrge r3, [r6],#4 + ble nomoreargs + + // Load the rest of the arguments onto the stack + sub r7, r7, #4*4 // skip the 4 registers already loaded into r0-r3 + sub sp, sp, r7 + mov r8, r7 +stackargsloop: + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne stackargsloop +nomoreargs: + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + ldmia sp!, {r4-r8, pc} + +_armFuncObjLast: + stmdb sp!, {r4-r8, lr} + mov r6, r0 // arg table + movs r7, r1 // arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 // function address + mov r8, #0 + + mov r0, r3 // objlast. might get overwritten + str r3, [sp, #-4]! // objlast again. + + beq nomoreargsarmFuncObjLast + + // Load the first 4 arguments into r0-r3 + cmp r7, #4 + ldrge r0, [r6],#4 + cmp r7, #2*4 + ldrge r1, [r6],#4 + ldrlt r1, [sp] + cmp r7, #3*4 + ldrge r2, [r6],#4 + ldrlt r2, [sp] + cmp r7, #4*4 + ldrge r3, [r6],#4 + ldrlt r3, [sp] + ble nomoreargsarmFuncObjLast + + // Load the rest of the arguments onto the stack + sub r7, r7, #4*4 // skip the 4 registers already loaded into r0-r3 + sub sp, sp, r7 + mov r8, r7 +stackargslooparmFuncObjLast: + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne stackargslooparmFuncObjLast +nomoreargsarmFuncObjLast: + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + add sp, sp, #4 + ldmia sp!, {r4-r8, pc} + +_armFuncR0ObjLast: + stmdb sp!, {r4-r8, lr} + ldr r7, [sp,#6*4] + str r7, [sp,#-4]! + + mov r6, r0 // arg table + movs r7, r1 // arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 // function address + mov r8, #0 + + mov r0, r3 // r0 explicitly set + ldr r1, [sp] // objlast. might get overwritten + + beq nomoreargsarmFuncR0ObjLast + + // Load the first 3 arguments into r1-r3 + cmp r7, #1*4 + ldrge r1, [r6],#4 + cmp r7, #2*4 + ldrge r2, [r6],#4 + ldrlt r2, [sp] + cmp r7, #3*4 + ldrge r3, [r6],#4 + ldrlt r3, [sp] + ble nomoreargsarmFuncR0ObjLast + + // Load the rest of the arguments onto the stack + sub r7, r7, #3*4 // skip the 3 registers already loaded into r1-r3 + sub sp, sp, r7 + mov r8, r7 +stackargslooparmFuncR0ObjLast: + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne stackargslooparmFuncR0ObjLast +nomoreargsarmFuncR0ObjLast: + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + add sp, sp, #4 + ldmia sp!, {r4-r8, pc} + + +_armFuncR0: + stmdb sp!, {r4-r8, lr} + mov r6, r0 // arg table + movs r7, r1 // arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 // function address + mov r8, #0 + + mov r0, r3 // r0 explicitly set + + beq nomoreargsarmFuncR0 + + // Load the first 3 arguments into r1-r3 + cmp r7, #1*4 + ldrge r1, [r6],#4 + cmp r7, #2*4 + ldrge r2, [r6],#4 + cmp r7, #3*4 + ldrge r3, [r6],#4 + ble nomoreargsarmFuncR0 + + // Load the rest of the arguments onto the stack + sub r7, r7, #3*4 // skip the 3 registers already loaded into r1-r3 + sub sp, sp, r7 + mov r8, r7 +stackargslooparmFuncR0: + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne stackargslooparmFuncR0 +nomoreargsarmFuncR0: + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + ldmia sp!, {r4-r8, pc} + + +_armFuncR0R1: + stmdb sp!, {r4-r8, lr} + mov r6, r0 // arg table + movs r7, r1 // arg size (also set the condition code flags so that we detect if there are no arguments) + mov r4, r2 // function address + mov r8, #0 + + mov r0, r3 // r0 explicitly set + ldr r1, [sp, #6*4] // r1 explicitly set too + + beq nomoreargsarmFuncR0R1 + + // Load the first 2 arguments into r2-r3 + cmp r7, #1*4 + ldrge r2, [r6],#4 + cmp r7, #2*4 + ldrge r3, [r6],#4 + ble nomoreargsarmFuncR0R1 + + // Load the rest of the arguments onto the stack + sub r7, r7, #2*4 // skip the 2 registers already loaded into r2-r3 + sub sp, sp, r7 + mov r8, r7 +stackargslooparmFuncR0R1: + ldr r5, [r6], #4 + str r5, [sp], #4 + subs r7, r7, #4 + bne stackargslooparmFuncR0R1 +nomoreargsarmFuncR0R1: + sub sp, sp, r8 + blx r4 + add sp, sp, r8 + ldmia sp!, {r4-r8, pc} + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,342 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_callfunc.cpp +// +// These functions handle the actual calling of system functions +// + + + +#include "as_config.h" +#include "as_callfunc.h" +#include "as_scriptengine.h" +#include "as_texts.h" + +BEGIN_AS_NAMESPACE + +int DetectCallingConvention(bool isMethod, const asSFuncPtr &ptr, int callConv, asSSystemFunctionInterface *internal) +{ + memset(internal, 0, sizeof(asSSystemFunctionInterface)); + + internal->func = (size_t)ptr.ptr.f.func; + + // Was a compatible calling convention specified? + if( internal->func ) + { + if( ptr.flag == 1 && callConv != asCALL_GENERIC ) + return asWRONG_CALLING_CONV; + else if( ptr.flag == 2 && (callConv == asCALL_GENERIC || callConv == asCALL_THISCALL) ) + return asWRONG_CALLING_CONV; + else if( ptr.flag == 3 && callConv != asCALL_THISCALL ) + return asWRONG_CALLING_CONV; + } + + asDWORD base = callConv; + if( !isMethod ) + { + if( base == asCALL_CDECL ) + internal->callConv = ICC_CDECL; + else if( base == asCALL_STDCALL ) + internal->callConv = ICC_STDCALL; + else if( base == asCALL_GENERIC ) + internal->callConv = ICC_GENERIC_FUNC; + else + return asNOT_SUPPORTED; + } + else + { +#ifndef AS_NO_CLASS_METHODS + if( base == asCALL_THISCALL ) + { + internal->callConv = ICC_THISCALL; +#ifdef GNU_STYLE_VIRTUAL_METHOD + if( (size_t(ptr.ptr.f.func) & 1) ) + internal->callConv = ICC_VIRTUAL_THISCALL; +#endif + internal->baseOffset = ( int )MULTI_BASE_OFFSET(ptr); +#if defined(AS_ARM) && defined(__GNUC__) + // As the least significant bit in func is used to switch to THUMB mode + // on ARM processors, the LSB in the __delta variable is used instead of + // the one in __pfn on ARM processors. + if( (size_t(internal->baseOffset) & 1) ) + internal->callConv = ICC_VIRTUAL_THISCALL; +#endif + +#ifdef HAVE_VIRTUAL_BASE_OFFSET + // We don't support virtual inheritance + if( VIRTUAL_BASE_OFFSET(ptr) != 0 ) + return asNOT_SUPPORTED; +#endif + } + else +#endif + if( base == asCALL_CDECL_OBJLAST ) + internal->callConv = ICC_CDECL_OBJLAST; + else if( base == asCALL_CDECL_OBJFIRST ) + internal->callConv = ICC_CDECL_OBJFIRST; + else if( base == asCALL_GENERIC ) + internal->callConv = ICC_GENERIC_METHOD; + else + return asNOT_SUPPORTED; + } + + return 0; +} + +// This function should prepare system functions so that it will be faster to call them +int PrepareSystemFunctionGeneric(asCScriptFunction *func, asSSystemFunctionInterface *internal, asCScriptEngine * /*engine*/) +{ + asASSERT(internal->callConv == ICC_GENERIC_METHOD || internal->callConv == ICC_GENERIC_FUNC); + + // Calculate the size needed for the parameters + internal->paramSize = func->GetSpaceNeededForArguments(); + + return 0; +} + +// This function should prepare system functions so that it will be faster to call them +int PrepareSystemFunction(asCScriptFunction *func, asSSystemFunctionInterface *internal, asCScriptEngine *engine) +{ +#ifdef AS_MAX_PORTABILITY + // This should never happen, as when AS_MAX_PORTABILITY is on, all functions + // are asCALL_GENERIC, which are prepared by PrepareSystemFunctionGeneric + asASSERT(false); +#endif + + // References are always returned as primitive data + if( func->returnType.IsReference() || func->returnType.IsObjectHandle() ) + { + internal->hostReturnInMemory = false; + internal->hostReturnSize = sizeof(void*)/4; + internal->hostReturnFloat = false; + } + // Registered types have special flags that determine how they are returned + else if( func->returnType.IsObject() ) + { + asDWORD objType = func->returnType.GetObjectType()->flags; + + // Only value types can be returned by value + asASSERT( objType & asOBJ_VALUE ); + + if( !(objType & (asOBJ_APP_CLASS | asOBJ_APP_PRIMITIVE | asOBJ_APP_FLOAT)) ) + { + // If the return is by value then we need to know the true type + engine->WriteMessage("", 0, 0, asMSGTYPE_INFORMATION, func->GetDeclarationStr().AddressOf()); + + asCString str; + str.Format(TXT_CANNOT_RET_TYPE_s_BY_VAL, func->returnType.GetObjectType()->name.AddressOf()); + engine->WriteMessage("", 0, 0, asMSGTYPE_ERROR, str.AddressOf()); + engine->ConfigError(asINVALID_CONFIGURATION); + } + else if( objType & asOBJ_APP_CLASS ) + { + internal->hostReturnFloat = false; + if( objType & COMPLEX_MASK ) + { + internal->hostReturnInMemory = true; + internal->hostReturnSize = sizeof(void*)/4; + } + else + { +#ifdef HAS_128_BIT_PRIMITIVES + if( func->returnType.GetSizeInMemoryDWords() > 4 ) +#else + if( func->returnType.GetSizeInMemoryDWords() > 2 ) +#endif + { + internal->hostReturnInMemory = true; + internal->hostReturnSize = sizeof(void*)/4; + } + else + { + internal->hostReturnInMemory = false; + internal->hostReturnSize = func->returnType.GetSizeInMemoryDWords(); + } + +#ifdef THISCALL_RETURN_SIMPLE_IN_MEMORY + if((internal->callConv == ICC_THISCALL || + internal->callConv == ICC_VIRTUAL_THISCALL) && + func->returnType.GetSizeInMemoryDWords() >= THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE) + { + internal->hostReturnInMemory = true; + internal->hostReturnSize = sizeof(void*)/4; + } +#endif +#ifdef CDECL_RETURN_SIMPLE_IN_MEMORY + if((internal->callConv == ICC_CDECL || + internal->callConv == ICC_CDECL_OBJLAST || + internal->callConv == ICC_CDECL_OBJFIRST) && + func->returnType.GetSizeInMemoryDWords() >= CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE) + { + internal->hostReturnInMemory = true; + internal->hostReturnSize = sizeof(void*)/4; + } +#endif +#ifdef STDCALL_RETURN_SIMPLE_IN_MEMORY + if( internal->callConv == ICC_STDCALL && + func->returnType.GetSizeInMemoryDWords() >= STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE) + { + internal->hostReturnInMemory = true; + internal->hostReturnSize = sizeof(void*)/4; + } +#endif + } + } + else if( objType & asOBJ_APP_PRIMITIVE ) + { + internal->hostReturnInMemory = false; + internal->hostReturnSize = func->returnType.GetSizeInMemoryDWords(); + internal->hostReturnFloat = false; + } + else if( objType & asOBJ_APP_FLOAT ) + { + internal->hostReturnInMemory = false; + internal->hostReturnSize = func->returnType.GetSizeInMemoryDWords(); + internal->hostReturnFloat = true; + } + } + // Primitive types can easily be determined +#ifdef HAS_128_BIT_PRIMITIVES + else if( func->returnType.GetSizeInMemoryDWords() > 4 ) + { + // Shouldn't be possible to get here + asASSERT(false); + } + else if( func->returnType.GetSizeInMemoryDWords() == 4 ) + { + internal->hostReturnInMemory = false; + internal->hostReturnSize = 4; + internal->hostReturnFloat = false; + } +#else + else if( func->returnType.GetSizeInMemoryDWords() > 2 ) + { + // Shouldn't be possible to get here + asASSERT(false); + } +#endif + else if( func->returnType.GetSizeInMemoryDWords() == 2 ) + { + internal->hostReturnInMemory = false; + internal->hostReturnSize = 2; + internal->hostReturnFloat = func->returnType.IsEqualExceptConst(asCDataType::CreatePrimitive(ttDouble, true)); + } + else if( func->returnType.GetSizeInMemoryDWords() == 1 ) + { + internal->hostReturnInMemory = false; + internal->hostReturnSize = 1; + internal->hostReturnFloat = func->returnType.IsEqualExceptConst(asCDataType::CreatePrimitive(ttFloat, true)); + } + else + { + internal->hostReturnInMemory = false; + internal->hostReturnSize = 0; + internal->hostReturnFloat = false; + } + + // Calculate the size needed for the parameters + internal->paramSize = func->GetSpaceNeededForArguments(); + + // Verify if the function takes any objects by value + asUINT n; + internal->takesObjByVal = false; + for( n = 0; n < func->parameterTypes.GetLength(); n++ ) + { + if( func->parameterTypes[n].IsObject() && !func->parameterTypes[n].IsObjectHandle() && !func->parameterTypes[n].IsReference() ) + { + internal->takesObjByVal = true; + + // Can't pass objects by value unless the application type is informed + if( !(func->parameterTypes[n].GetObjectType()->flags & (asOBJ_APP_CLASS | asOBJ_APP_PRIMITIVE | asOBJ_APP_FLOAT)) ) + { + engine->WriteMessage("", 0, 0, asMSGTYPE_INFORMATION, func->GetDeclarationStr().AddressOf()); + + asCString str; + str.Format(TXT_CANNOT_PASS_TYPE_s_BY_VAL, func->parameterTypes[n].GetObjectType()->name.AddressOf()); + engine->WriteMessage("", 0, 0, asMSGTYPE_ERROR, str.AddressOf()); + engine->ConfigError(asINVALID_CONFIGURATION); + } + + +#ifdef SPLIT_OBJS_BY_MEMBER_TYPES + // It's not safe to pass objects by value because different registers + // will be used depending on the memory layout of the object +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( !(func->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK) ) +#endif + { + engine->WriteMessage("", 0, 0, asMSGTYPE_INFORMATION, func->GetDeclarationStr().AddressOf()); + + asCString str; + str.Format(TXT_DONT_SUPPORT_TYPE_s_BY_VAL, func->parameterTypes[n].GetObjectType()->name.AddressOf()); + engine->WriteMessage("", 0, 0, asMSGTYPE_ERROR, str.AddressOf()); + engine->ConfigError(asINVALID_CONFIGURATION); + } +#endif + break; + } + } + + // Verify if the function has any registered autohandles + internal->hasAutoHandles = false; + for( n = 0; n < internal->paramAutoHandles.GetLength(); n++ ) + { + if( internal->paramAutoHandles[n] ) + { + internal->hasAutoHandles = true; + break; + } + } + + return 0; +} + +#ifdef AS_MAX_PORTABILITY + +int CallSystemFunction(int id, asCContext *context, void *objectPointer) +{ + asCScriptEngine *engine = context->engine; + asSSystemFunctionInterface *sysFunc = engine->scriptFunctions[id]->sysFuncIntf; + int callConv = sysFunc->callConv; + if( callConv == ICC_GENERIC_FUNC || callConv == ICC_GENERIC_METHOD ) + return context->CallGeneric(id, objectPointer); + + context->SetInternalException(TXT_INVALID_CALLING_CONVENTION); + + return 0; +} + +#endif // AS_MAX_PORTABILITY + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,122 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_callfunc.h +// +// These functions handle the actual calling of system functions +// + + +#ifndef AS_CALLFUNC_H +#define AS_CALLFUNC_H + +#include "as_array.h" + +BEGIN_AS_NAMESPACE + +class asCContext; +class asCScriptEngine; +class asCScriptFunction; +struct asSSystemFunctionInterface; + +int DetectCallingConvention(bool isMethod, const asSFuncPtr &ptr, int callConv, asSSystemFunctionInterface *internal); + +int PrepareSystemFunctionGeneric(asCScriptFunction *func, asSSystemFunctionInterface *internal, asCScriptEngine *engine); + +int PrepareSystemFunction(asCScriptFunction *func, asSSystemFunctionInterface *internal, asCScriptEngine *engine); + +int CallSystemFunction(int id, asCContext *context, void *objectPointer); + +enum internalCallConv +{ + ICC_GENERIC_FUNC, + ICC_GENERIC_FUNC_RETURNINMEM, // never used + ICC_CDECL, + ICC_CDECL_RETURNINMEM, + ICC_STDCALL, + ICC_STDCALL_RETURNINMEM, + ICC_THISCALL, + ICC_THISCALL_RETURNINMEM, + ICC_VIRTUAL_THISCALL, + ICC_VIRTUAL_THISCALL_RETURNINMEM, + ICC_CDECL_OBJLAST, + ICC_CDECL_OBJLAST_RETURNINMEM, + ICC_CDECL_OBJFIRST, + ICC_CDECL_OBJFIRST_RETURNINMEM, + ICC_GENERIC_METHOD, + ICC_GENERIC_METHOD_RETURNINMEM // never used +}; + +struct asSSystemFunctionInterface +{ + size_t func; + int baseOffset; + internalCallConv callConv; + int scriptReturnSize; + bool hostReturnInMemory; + bool hostReturnFloat; + int hostReturnSize; + int paramSize; + bool takesObjByVal; + asCArray paramAutoHandles; + bool returnAutoHandle; + bool hasAutoHandles; + + asSSystemFunctionInterface() {} + + asSSystemFunctionInterface(const asSSystemFunctionInterface &in) + { + *this = in; + } + + asSSystemFunctionInterface &operator=(const asSSystemFunctionInterface &in) + { + func = in.func; + baseOffset = in.baseOffset; + callConv = in.callConv; + scriptReturnSize = in.scriptReturnSize; + hostReturnInMemory = in.hostReturnInMemory; + hostReturnFloat = in.hostReturnFloat; + hostReturnSize = in.hostReturnSize; + paramSize = in.paramSize; + takesObjByVal = in.takesObjByVal; + paramAutoHandles = in.paramAutoHandles; + returnAutoHandle = in.returnAutoHandle; + hasAutoHandles = in.hasAutoHandles; + return *this; + } +}; + +END_AS_NAMESPACE + +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_mips.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_mips.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_mips.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_mips.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,564 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_callfunc_mips.cpp +// +// These functions handle the actual calling of system functions +// +// This version is MIPS specific and was originally written +// by Manu Evans in April, 2006 +// + + +#include "as_config.h" + +#ifndef MAX_PORTABILITY +#ifdef AS_MIPS + +#include "as_callfunc.h" +#include "as_scriptengine.h" +#include "as_texts.h" +#include "as_tokendef.h" + +#include +#include +#include + +BEGIN_AS_NAMESPACE + +#define AS_MIPS_MAX_ARGS 32 +#define AS_NUM_REG_FLOATS 8 +#define AS_NUM_REG_INTS 8 + +// The array used to send values to the correct places. +// first 0-8 regular values to load into the a0-a3, t0-t3 registers +// then 0-8 float values to load into the f12-f19 registers +// then (AS_MIPS_MAX_ARGS - 16) values to load onto the stack +// the +1 is for when CallThis (object methods) is used +// extra +1 when returning in memory +extern "C" { +static asDWORD mipsArgs[AS_MIPS_MAX_ARGS + 1 + 1]; +} + +// Loads all data into the correct places and calls the function. +// intArgSize is the size in bytes for how much data to put in int registers +// floatArgSize is the size in bytes for how much data to put in float registers +// stackArgSize is the size in bytes for how much data to put on the callstack +extern "C" asQWORD mipsFunc(int intArgSize, int floatArgSize, int stackArgSize, asDWORD func); + +// puts the arguments in the correct place in the mipsArgs-array. See comments above. +// This could be done better. +inline void splitArgs(const asDWORD *args, int argNum, int &numRegIntArgs, int &numRegFloatArgs, int &numRestArgs, int hostFlags) +{ + int i; + + int argBit = 1; + for (i = 0; i < argNum; i++) + { + if (hostFlags & argBit) + { + if (numRegFloatArgs < AS_NUM_REG_FLOATS) + { + // put in float register + mipsArgs[AS_NUM_REG_INTS + numRegFloatArgs] = args[i]; + numRegFloatArgs++; + } + else + { + // put in stack + mipsArgs[AS_NUM_REG_INTS + AS_NUM_REG_FLOATS + numRestArgs] = args[i]; + numRestArgs++; + } + } + else + { + if (numRegIntArgs < AS_NUM_REG_INTS) + { + // put in int register + mipsArgs[numRegIntArgs] = args[i]; + numRegIntArgs++; + } + else + { + // put in stack + mipsArgs[AS_NUM_REG_INTS + AS_NUM_REG_FLOATS + numRestArgs] = args[i]; + numRestArgs++; + } + } + argBit <<= 1; + } +} + +asQWORD CallCDeclFunction(const asDWORD *args, int argSize, asDWORD func, int flags) +{ + int argNum = argSize >> 2; + + int intArgs = 0; + int floatArgs = 0; + int restArgs = 0; + + // put the arguments in the correct places in the mipsArgs array + if(argNum > 0) + splitArgs(args, argNum, intArgs, floatArgs, restArgs, flags); + + return mipsFunc(intArgs << 2, floatArgs << 2, restArgs << 2, func); +} + +// This function is identical to CallCDeclFunction, with the only difference that +// the value in the first parameter is the object +asQWORD CallThisCallFunction(const void *obj, const asDWORD *args, int argSize, asDWORD func, int flags) +{ + int argNum = argSize >> 2; + + int intArgs = 1; + int floatArgs = 0; + int restArgs = 0; + + mipsArgs[0] = (asDWORD) obj; + + // put the arguments in the correct places in the mipsArgs array + if (argNum > 0) + splitArgs(args, argNum, intArgs, floatArgs, restArgs, flags); + + return mipsFunc(intArgs << 2, floatArgs << 2, restArgs << 2, func); +} + +// This function is identical to CallCDeclFunction, with the only difference that +// the value in the last parameter is the object +asQWORD CallThisCallFunction_objLast(const void *obj, const asDWORD *args, int argSize, asDWORD func, int flags) +{ + int argNum = argSize >> 2; + + int intArgs = 0; + int floatArgs = 0; + int restArgs = 0; + + // put the arguments in the correct places in the mipsArgs array + if(argNum > 0) + splitArgs(args, argNum, intArgs, floatArgs, restArgs, flags); + + if(intArgs < AS_NUM_REG_INTS) + { + mipsArgs[intArgs] = (asDWORD) obj; + intArgs++; + } + else + { + mipsArgs[AS_NUM_REG_INTS + AS_NUM_REG_FLOATS + restArgs] = (asDWORD) obj; + restArgs++; + } + + return mipsFunc(intArgs << 2, floatArgs << 2, restArgs << 2, func); +} + +asDWORD GetReturnedFloat() +{ + asDWORD f; + + asm("swc1 $f0, %0\n" : "=m"(f)); + + return f; +} + +/* +asDWORD GetReturnedFloat(); + +asm( +" .align 4\n" +" .global GetReturnedFloat\n" +"GetReturnedFloat:\n" +" .set noreorder\n" +" .set nomacro\n" +" j $ra\n" +" mfc1 $v0, $f0\n" +" .set macro\n" +" .set reorder\n" +" .end Func\n" +*/ + + +// sizeof(double) == 4 with sh-elf-gcc (3.4.0) -m4 +// so this isn't really used... +asQWORD GetReturnedDouble() +{ + asQWORD d; + + printf("Broken!!!"); +/* + asm("sw $v0, %0\n" : "=m"(d)); +*/ + return d; +} + +int CallSystemFunction(int id, asCContext *context, void *objectPointer) +{ + asCScriptEngine *engine = context->engine; + asSSystemFunctionInterface *sysFunc = engine->scriptFunctions[id]->sysFuncIntf; + int callConv = sysFunc->callConv; + if( callConv == ICC_GENERIC_FUNC || callConv == ICC_GENERIC_METHOD ) + return context->CallGeneric(id, objectPointer); + + asQWORD retQW = 0; + + asCScriptFunction *descr = engine->scriptFunctions[id]; + + void *func = (void*)sysFunc->func; + int paramSize = sysFunc->paramSize; + asDWORD *args = context->regs.stackPointer; + void *retPointer = 0; + void *obj = 0; + asDWORD *vftable; + int popSize = paramSize; + + context->regs.objectType = descr->returnType.GetObjectType(); + if( descr->returnType.IsObject() && !descr->returnType.IsReference() && !descr->returnType.IsObjectHandle() ) + { + // Allocate the memory for the object + retPointer = engine->CallAlloc(descr->returnType.GetObjectType()); + mipsArgs[AS_MIPS_MAX_ARGS+1] = (asDWORD) retPointer; + + if( sysFunc->hostReturnInMemory ) + { + // The return is made in memory + callConv++; + } + } + + if( callConv >= ICC_THISCALL ) + { + if( objectPointer ) + { + obj = objectPointer; + } + else + { + // The object pointer should be popped from the context stack + popSize++; + + // Check for null pointer + obj = (void*)*(args + paramSize); + if( obj == 0 ) + { + context->SetInternalException(TXT_NULL_POINTER_ACCESS); + if( retPointer ) + engine->CallFree(retPointer); + return 0; + } + + // Add the base offset for multiple inheritance + obj = (void*)(int(obj) + sysFunc->baseOffset); + } + } + asASSERT(descr->parameterTypes.GetLength() <= AS_MIPS_MAX_ARGS); + + // mark all float arguments + int argBit = 1; + int hostFlags = 0; + int intArgs = 0; + for( size_t a = 0; a < descr->parameterTypes.GetLength(); a++ ) + { + if (descr->parameterTypes[a].IsFloatType()) + hostFlags |= argBit; + else + intArgs++; + argBit <<= 1; + } + + asDWORD paramBuffer[64]; + if( sysFunc->takesObjByVal ) + { + paramSize = 0; + int spos = 0; + int dpos = 1; + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + { +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK ) + { + paramBuffer[dpos++] = args[spos++]; + paramSize++; + } + else +#endif + { + // Copy the object's memory to the buffer + memcpy(¶mBuffer[dpos], *(void**)(args+spos), descr->parameterTypes[n].GetSizeInMemoryBytes()); + // Delete the original memory + engine->CallFree(*(char**)(args+spos)); + spos++; + dpos += descr->parameterTypes[n].GetSizeInMemoryDWords(); + paramSize += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } + else + { + // Copy the value directly + paramBuffer[dpos++] = args[spos++]; + if( descr->parameterTypes[n].GetSizeOnStackDWords() > 1 ) + paramBuffer[dpos++] = args[spos++]; + paramSize += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + // Keep a free location at the beginning + args = ¶mBuffer[1]; + } + + context->isCallingSystemFunction = true; + switch( callConv ) + { + case ICC_CDECL: + case ICC_CDECL_RETURNINMEM: + case ICC_STDCALL: + case ICC_STDCALL_RETURNINMEM: + retQW = CallCDeclFunction(args, paramSize<<2, (asDWORD)func, hostFlags); + break; + case ICC_THISCALL: + case ICC_THISCALL_RETURNINMEM: + retQW = CallThisCallFunction(obj, args, paramSize<<2, (asDWORD)func, hostFlags); + break; + case ICC_VIRTUAL_THISCALL: + case ICC_VIRTUAL_THISCALL_RETURNINMEM: + // Get virtual function table from the object pointer + vftable = *(asDWORD**)obj; + retQW = CallThisCallFunction(obj, args, paramSize<<2, vftable[asDWORD(func)>>2], hostFlags); + break; + case ICC_CDECL_OBJLAST: + case ICC_CDECL_OBJLAST_RETURNINMEM: + retQW = CallThisCallFunction_objLast(obj, args, paramSize<<2, (asDWORD)func, hostFlags); + break; + case ICC_CDECL_OBJFIRST: + case ICC_CDECL_OBJFIRST_RETURNINMEM: + retQW = CallThisCallFunction(obj, args, paramSize<<2, (asDWORD)func, hostFlags); + break; + default: + context->SetInternalException(TXT_INVALID_CALLING_CONVENTION); + } + context->isCallingSystemFunction = false; + +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( sysFunc->takesObjByVal ) + { + // Need to free the complex objects passed by value + args = context->regs.stackPointer; + if( callConv >= (int)ICC_THISCALL && !objectPointer ) + args++; + + int spos = 0; + for( size_t n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && + !descr->parameterTypes[n].IsReference() && + (descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK) ) + { + void *obj = (void*)args[spos++]; + asSTypeBehaviour *beh = &descr->parameterTypes[n].GetObjectType()->beh; + if( beh->destruct ) + engine->CallObjectMethod(obj, beh->destruct); + + engine->CallFree(obj); + } + else + spos += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } +#endif + + // Store the returned value in our stack + if( descr->returnType.IsObject() && !descr->returnType.IsReference() ) + { + if( descr->returnType.IsObjectHandle() ) + { + context->regs.objectRegister = (void*)(asDWORD)retQW; + + if( sysFunc->returnAutoHandle && context->regs.objectRegister ) + engine->CallObjectMethod(context->regs.objectRegister, descr->returnType.GetObjectType()->beh.addref); + } + else + { + if( !sysFunc->hostReturnInMemory ) + { + // Copy the returned value to the pointer sent by the script engine + if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)retPointer = (asDWORD)retQW; + else + *(asQWORD*)retPointer = retQW; + } + + // Store the object in the register + context->regs.objectRegister = retPointer; + } + } + else + { + // Store value in valueRegister + if( sysFunc->hostReturnFloat ) + { + if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)&context->regs.valueRegister = GetReturnedFloat(); + else + context->regs.valueRegister = GetReturnedDouble(); + } + else if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)&context->regs.valueRegister = (asDWORD)retQW; + else + context->regs.valueRegister = retQW; + } + + if( sysFunc->hasAutoHandles ) + { + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + args++; + + int spos = 0; + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( sysFunc->paramAutoHandles[n] && args[spos] ) + { + // Call the release method on the type + engine->CallObjectMethod((void*)args[spos], descr->parameterTypes[n].GetObjectType()->beh.release); + args[spos] = 0; + } + + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + spos++; + else + spos += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + + return popSize; +} + +asm( +" .text\n" +//" .align 2\n" +" .global mipsFunc\n" +" .ent mipsFunc\n" +"mipsFunc:\n" +//" .frame $fp,64,$31 # vars= 0, regs= 0/0, args= 0, gp= 0\n" +//" .mask 0x00000000,0\n" +//" .fmask 0x00000000,0\n" +" .set noreorder\n" +" .set nomacro\n" +// align the stack frame to 8 bytes +" addiu $12, $6, 7\n" +" li $13, -8\n" // 0xfffffffffffffffc +" and $12, $12, $13\n" // t4 holds the size of the argument block +// and add 8 bytes for the return pointer and s0 backup +" addiu $13, $12, 8\n" // t5 holds the total size of the stack frame (including return pointer) +// save the s0 register (so we can use it to remember where our return pointer is lives) +" sw $16, -4($sp)\n" // store the s0 register (so we can use it to remember how big our stack frame is) +// push the stack +" subu $sp, $sp, $13\n" +// find the return address, place in s0 +" addu $16, $sp, $12\n" +// store the return pointer +" sw $31, 0($16)\n" + +// backup our function params +" addiu $2, $7, 0\n" +" addiu $3, $6, 0\n" + +// get global mipsArgs[] array pointer +//" lui $15, %hi(mipsArgs)\n" +//" addiu $15, $15, %lo(mipsArgs)\n" +// we'll use the macro instead because SN Systems doesnt like %hi/%lo +".set macro\n" +" la $15, mipsArgs\n" +".set nomacro\n" +// load register params +" lw $4, 0($15)\n" +" lw $5, 4($15)\n" +" lw $6, 8($15)\n" +" lw $7, 12($15)\n" +" lw $8, 16($15)\n" +" lw $9, 20($15)\n" +" lw $10, 24($15)\n" +" lw $11, 28($15)\n" + +// load float params +" lwc1 $f12, 32($15)\n" +" lwc1 $f13, 36($15)\n" +" lwc1 $f14, 40($15)\n" +" lwc1 $f15, 44($15)\n" +" lwc1 $f16, 48($15)\n" +" lwc1 $f17, 52($15)\n" +" lwc1 $f18, 56($15)\n" +" lwc1 $f19, 60($15)\n" + +// skip stack paramaters if there are none +" beq $3, $0, andCall\n" + +// push stack paramaters +" addiu $15, $15, 64\n" +"pushArgs:\n" +" addiu $3, -4\n" +// load from $15 + stack bytes ($3) +" addu $14, $15, $3\n" +" lw $14, 0($14)\n" +// store to $sp + stack bytes ($3) +" addu $13, $sp, $3\n" +" sw $14, 0($13)\n" +// if there are more, loop... +" bne $3, $0, pushArgs\n" +" nop\n" + +// and call the function +"andCall:\n" +" jal $2\n" +" nop\n" + +// restore the return pointer +" lw $31, 0($16)\n" +// pop the stack pointer (remembering the return pointer was 8 bytes below the top) +" addiu $sp, $16, 8\n" +// and return from the function +" jr $31\n" +// restore the s0 register (in the branch delay slot) +" lw $16, -4($sp)\n" +" .set macro\n" +" .set reorder\n" +" .end mipsFunc\n" +" .size mipsFunc, .-mipsFunc\n" +); + +END_AS_NAMESPACE + +#endif // AS_MIPS +#endif // AS_MAX_PORTABILITY + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_ppc_64.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_ppc_64.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_ppc_64.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_ppc_64.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,999 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_callfunc_ppc_64.cpp +// +// These functions handle the actual calling of system functions +// +// This version is 64 bit PPC specific +// + +#include "as_config.h" + +#ifndef AS_MAX_PORTABILITY +#ifdef AS_PPC_64 + +#include "as_callfunc.h" +#include "as_scriptengine.h" +#include "as_texts.h" +#include "as_tokendef.h" + +#include +#include + +BEGIN_AS_NAMESPACE + +// This part was written and tested by Jeff Slutter +// from Reactor Zero, Abril, 2007, for PlayStation 3, which +// is a PowerPC 64bit based architecture. Even though it is +// 64bit it seems the pointer size is still 32bit. + +// It still remains to be seen how well this code works +// on other PPC platforms, such as XBox 360, GameCube. + +#define AS_PPC_MAX_ARGS 32 + +// The array used to send values to the correct places. +// Contains a byte of argTypes to indicate the register type to load +// or zero if end of arguments +// The +1 is for when CallThis (object methods) is used +// Extra +1 when returning in memory +// Extra +1 in ppcArgsType to ensure zero end-of-args marker + +// TODO: multithread: The global variables must be removed to make the code thread safe + +extern "C" +{ + enum argTypes { ppcENDARG = 0, ppcINTARG = 1, ppcFLOATARG = 2, ppcDOUBLEARG = 3, ppcLONGARG = 4 }; + static asBYTE ppcArgsType[AS_PPC_MAX_ARGS + 1 + 1 + 1]; + static asDWORD ppcArgs[2*AS_PPC_MAX_ARGS + 1 + 1]; +} + +// NOTE: these values are for PowerPC 64 bit. I'm sure things are different for PowerPC 32bit, but I don't have one. +// I'm pretty sure that PPC 32bit sets up a stack frame slightly different (only 24 bytes for linkage area for instance) +#define PPC_LINKAGE_SIZE (0x30) // how big the PPC linkage area is in a stack frame +#define PPC_NUM_REGSTORE (10) // how many registers of the PPC we need to store/restore for ppcFunc64() +#define PPC_REGSTORE_SIZE (8*PPC_NUM_REGSTORE) // how many bytes are required for register store/restore +#define EXTRA_STACK_SIZE (PPC_LINKAGE_SIZE + PPC_REGSTORE_SIZE) // memory required, not including parameters, for the stack frame +#define PPC_STACK_SIZE(numParams) ( -(( ( (((numParams)<8)?8:(numParams))<<3) + EXTRA_STACK_SIZE + 15 ) & ~15) ) // calculates the total stack size needed for ppcFunc64, must pad to 16bytes + +// This is PowerPC 64 bit specific +// Loads all data into the correct places and calls the function. +// ppcArgsType is an array containing a byte type (enum argTypes) for each argument. +// StackArgSizeInBytes is the size in bytes of the stack frame (takes into account linkage area, etc. must be multiple of 16) +extern "C" asQWORD ppcFunc64(const asDWORD* argsPtr, int StackArgSizeInBytes, asDWORD func); +asm("" + ".text\n" + ".align 4\n" + ".p2align 4,,15\n" + ".globl .ppcFunc64\n" + ".ppcFunc64:\n" + + // function prolog + "std %r22, -0x08(%r1)\n" // we need a register other than r0, to store the old stack pointer + "mr %r22, %r1\n" // store the old stack pointer, for now (to make storing registers easier) + "stdux %r1, %r1, %r4\n" // atomically store and update the stack pointer for the new stack frame (in case of a signal/interrupt) + "mflr %r0\n" // get the caller's LR register + "std %r0, 0x10(%r22)\n" // store the caller's LR register + "std %r23, -0x10(%r22)\n" // + "std %r24, -0x18(%r22)\n" // + "std %r25, -0x20(%r22)\n" // + "std %r26, -0x28(%r22)\n" // + "std %r27, -0x30(%r22)\n" // + "std %r28, -0x38(%r22)\n" // + "std %r29, -0x40(%r22)\n" // + "std %r30, -0x48(%r22)\n" // + "std %r31, -0x50(%r22)\n" // + "std %r3, 0x30(%r22)\n" // save our parameters + "std %r4, 0x38(%r22)\n" // + "std %r5, 0x40(%r22)\n" // + "mr %r31, %r1\n" // functions tend to store the stack pointer here too + + // initial registers for the function + "mr %r29, %r3\n" // (r29) args list + "lwz %r27, 0(%r5)\n" // load the function pointer to call. func actually holds the pointer to our function + "addi %r26, %r1, 0x30\n" // setup the pointer to the parameter area to the function we're going to call + "sub %r0,%r0,%r0\n" // zero out r0 + "mr %r23,%r0\n" // zero out r23, which holds the number of used GPR registers + "mr %r22,%r0\n" // zero our r22, which holds the number of used float registers + + // load the global ppcArgsType which holds the types of arguments for each argument + "lis %r25, ppcArgsType@ha\n" // load the upper 16 bits of the address to r25 + "addi %r25, %r25, ppcArgsType@l\n" // load the lower 16 bits of the address to r25 + "subi %r25, %r25, 1\n" // since we increment r25 on its use, we'll pre-decrement it + + // loop through the arguments + "ppcNextArg:\n" + "addi %r25, %r25, 1\n" // increment r25, our arg type pointer + // switch based on the current argument type (0:end, 1:int, 2:float 3:double) + "lbz %r24, 0(%r25)\n" // load the current argument type (it's a byte) + "mulli %r24, %r24, 4\n" // our jump table has 4 bytes per case (1 instruction) + "lis %r30, ppcTypeSwitch@ha\n" // load the address of the jump table for the switch + "addi %r30, %r30, ppcTypeSwitch@l\n" + "add %r0, %r30, %r24\n" // offset by our argument type + "mtctr %r0\n" // load the jump address into CTR + "bctr\n" // jump into the jump table/switch + "nop\n" + // the jump table/switch based on the current argument type + "ppcTypeSwitch:\n" + "b ppcArgsEnd\n" + "b ppcArgIsInteger\n" + "b ppcArgIsFloat\n" + "b ppcArgIsDouble\n" + "b ppcArgIsLong\n" + + // when we get here we have finished processing all the arguments + // everything is ready to go to call the function + "ppcArgsEnd:\n" + "mtctr %r27\n" // the function pointer is stored in r27, load that into CTR + "bctrl\n" // call the function. We have to do it this way so that the LR gets the proper + "nop\n" // return value (the next instruction below). So we have to branch from CTR instead of LR. + // when we get here, the function has returned, this is the function epilog + "ld %r11,0x00(%r1)\n" // load in the caller's stack pointer + "ld %r0,0x10(%r11)\n" // load in the caller's LR + "mtlr %r0\n" // restore the caller's LR + "ld %r22, -0x08(%r11)\n" // load registers + "ld %r23, -0x10(%r11)\n" // + "ld %r24, -0x18(%r11)\n" // + "ld %r25, -0x20(%r11)\n" // + "ld %r26, -0x28(%r11)\n" // + "ld %r27, -0x30(%r11)\n" // + "ld %r28, -0x38(%r11)\n" // + "ld %r29, -0x40(%r11)\n" // + "ld %r30, -0x48(%r11)\n" // + "ld %r31, -0x50(%r11)\n" // + "mr %r1, %r11\n" // restore the caller's SP + "blr\n" // return back to the caller + "nop\n" + // Integer argument (GPR register) + "ppcArgIsInteger:\n" + "lis %r30,ppcLoadIntReg@ha\n" // load the address to the jump table for integer registers + "addi %r30, %r30, ppcLoadIntReg@l\n" + "mulli %r0, %r23, 8\n" // each item in the jump table is 2 instructions (8 bytes) + "add %r0, %r0, %r30\n" // calculate ppcLoadIntReg[numUsedGPRRegs] + "lwz %r30,0(%r29)\n" // load the next argument from the argument list into r30 + "cmpwi %r23, 8\n" // we can only load GPR3 through GPR10 (8 registers) + "bgt ppcLoadIntRegUpd\n" // if we're beyond 8 GPR registers, we're in the stack, go there + "mtctr %r0\n" // load the address of our ppcLoadIntReg jump table (we're below 8 GPR registers) + "bctr\n" // load the argument into a GPR register + "nop\n" + // jump table for GPR registers, for the first 8 GPR arguments + "ppcLoadIntReg:\n" + "mr %r3,%r30\n" // arg0 (to r3) + "b ppcLoadIntRegUpd\n" + "mr %r4,%r30\n" // arg1 (to r4) + "b ppcLoadIntRegUpd\n" + "mr %r5,%r30\n" // arg2 (to r5) + "b ppcLoadIntRegUpd\n" + "mr %r6,%r30\n" // arg3 (to r6) + "b ppcLoadIntRegUpd\n" + "mr %r7,%r30\n" // arg4 (to r7) + "b ppcLoadIntRegUpd\n" + "mr %r8,%r30\n" // arg5 (to r8) + "b ppcLoadIntRegUpd\n" + "mr %r9,%r30\n" // arg6 (to r9) + "b ppcLoadIntRegUpd\n" + "mr %r10,%r30\n" // arg7 (to r10) + "b ppcLoadIntRegUpd\n" + + // all GPR arguments still go on the stack + "ppcLoadIntRegUpd:\n" + "std %r30,0(%r26)\n" // store the argument into the next slot on the stack's argument list + "addi %r23, %r23, 1\n" // count a used GPR register + "addi %r29, %r29, 4\n" // move to the next argument on the list + "addi %r26, %r26, 8\n" // adjust our argument stack pointer for the next + "b ppcNextArg\n" // next argument + + // single Float argument + "ppcArgIsFloat:\n" + "lis %r30,ppcLoadFloatReg@ha\n" // get the base address of the float register jump table + "addi %r30, %r30, ppcLoadFloatReg@l\n" + "mulli %r0, %r22 ,8\n" // each jump table entry is 8 bytes + "add %r0, %r0, %r30\n" // calculate the offset to ppcLoadFloatReg[numUsedFloatReg] + "lfs 0, 0(%r29)\n" // load the next argument as a float into f0 + "cmpwi %r22, 13\n" // can't load more than 13 float/double registers + "bgt ppcLoadFloatRegUpd\n" // if we're beyond 13 registers, just fall to inserting into the stack + "mtctr %r0\n" // jump into the float jump table + "bctr\n" + "nop\n" + // jump table for float registers, for the first 13 float arguments + "ppcLoadFloatReg:\n" + "fmr 1,0\n" // arg0 (f1) + "b ppcLoadFloatRegUpd\n" + "fmr 2,0\n" // arg1 (f2) + "b ppcLoadFloatRegUpd\n" + "fmr 3,0\n" // arg2 (f3) + "b ppcLoadFloatRegUpd\n" + "fmr 4,0\n" // arg3 (f4) + "b ppcLoadFloatRegUpd\n" + "fmr 5,0\n" // arg4 (f5) + "b ppcLoadFloatRegUpd\n" + "fmr 6,0\n" // arg5 (f6) + "b ppcLoadFloatRegUpd\n" + "fmr 7,0\n" // arg6 (f7) + "b ppcLoadFloatRegUpd\n" + "fmr 8,0\n" // arg7 (f8) + "b ppcLoadFloatRegUpd\n" + "fmr 9,0\n" // arg8 (f9) + "b ppcLoadFloatRegUpd\n" + "fmr 10,0\n" // arg9 (f10) + "b ppcLoadFloatRegUpd\n" + "fmr 11,0\n" // arg10 (f11) + "b ppcLoadFloatRegUpd\n" + "fmr 12,0\n" // arg11 (f12) + "b ppcLoadFloatRegUpd\n" + "fmr 13,0\n" // arg12 (f13) + "b ppcLoadFloatRegUpd\n" + "nop\n" + // all float arguments still go on the stack + "ppcLoadFloatRegUpd:\n" + "stfs 0, 0x04(%r26)\n" // store, as a single float, f0 (current argument) on to the stack argument list + "addi %r23, %r23, 1\n" // a float register eats up a GPR register + "addi %r22, %r22, 1\n" // ...and, of course, a float register + "addi %r29, %r29, 4\n" // move to the next argument in the list + "addi %r26, %r26, 8\n" // move to the next stack slot + "b ppcNextArg\n" // on to the next argument + "nop\n" + // double Float argument + "ppcArgIsDouble:\n" + "lis %r30, ppcLoadDoubleReg@ha\n" // load the base address of the jump table for double registers + "addi %r30, %r30, ppcLoadDoubleReg@l\n" + "mulli %r0, %r22, 8\n" // each slot of the jump table is 8 bytes + "add %r0, %r0, %r30\n" // calculate ppcLoadDoubleReg[numUsedFloatReg] + "lfd 0, 0(%r29)\n" // load the next argument, as a double float, into f0 + "cmpwi %r22,13\n" // the first 13 floats must go into float registers also + "bgt ppcLoadDoubleRegUpd\n" // if we're beyond 13, then just put on to the stack + "mtctr %r0\n" // we're under 13, first load our register + "bctr\n" // jump into the jump table + "nop\n" + // jump table for float registers, for the first 13 float arguments + "ppcLoadDoubleReg:\n" + "fmr 1,0\n" // arg0 (f1) + "b ppcLoadDoubleRegUpd\n" + "fmr 2,0\n" // arg1 (f2) + "b ppcLoadDoubleRegUpd\n" + "fmr 3,0\n" // arg2 (f3) + "b ppcLoadDoubleRegUpd\n" + "fmr 4,0\n" // arg3 (f4) + "b ppcLoadDoubleRegUpd\n" + "fmr 5,0\n" // arg4 (f5) + "b ppcLoadDoubleRegUpd\n" + "fmr 6,0\n" // arg5 (f6) + "b ppcLoadDoubleRegUpd\n" + "fmr 7,0\n" // arg6 (f7) + "b ppcLoadDoubleRegUpd\n" + "fmr 8,0\n" // arg7 (f8) + "b ppcLoadDoubleRegUpd\n" + "fmr 9,0\n" // arg8 (f9) + "b ppcLoadDoubleRegUpd\n" + "fmr 10,0\n" // arg9 (f10) + "b ppcLoadDoubleRegUpd\n" + "fmr 11,0\n" // arg10 (f11) + "b ppcLoadDoubleRegUpd\n" + "fmr 12,0\n" // arg11 (f12) + "b ppcLoadDoubleRegUpd\n" + "fmr 13,0\n" // arg12 (f13) + "b ppcLoadDoubleRegUpd\n" + "nop\n" + // all float arguments still go on the stack + "ppcLoadDoubleRegUpd:\n" + "stfd 0,0(%r26)\n" // store f0, as a double, into the argument list on the stack + "addi %r23, %r23, 1\n" // a double float eats up one GPR + "addi %r22, %r22, 1\n" // ...and, of course, a float + "addi %r29, %r29, 8\n" // increment to our next argument we need to process (8 bytes for the 64bit float) + "addi %r26, %r26, 8\n" // increment to the next slot on the argument list on the stack (8 bytes) + "b ppcNextArg\n" // on to the next argument + "nop\n" + + // Long (64 bit int) argument + "ppcArgIsLong:\n" + "lis %r30,ppcLoadLongReg@ha\n" // load the address to the jump table for integer64 + "addi %r30, %r30, ppcLoadLongReg@l\n" + "mulli %r0, %r23, 8\n" // each item in the jump table is 2 instructions (8 bytes) + "add %r0, %r0, %r30\n" // calculate ppcLoadLongReg[numUsedGPRRegs] + "ld %r30,0(%r29)\n" // load the next argument from the argument list into r30 + "cmpwi %r23, 8\n" // we can only load GPR3 through GPR10 (8 registers) + "bgt ppcLoadLongRegUpd\n" // if we're beyond 8 GPR registers, we're in the stack, go there + "mtctr %r0\n" // load the address of our ppcLoadLongReg jump table (we're below 8 GPR registers) + "bctr\n" // load the argument into a GPR register + "nop\n" + // jump table for GPR registers, for the first 8 GPR arguments + "ppcLoadLongReg:\n" + "mr %r3,%r30\n" // arg0 (to r3) + "b ppcLoadLongRegUpd\n" + "mr %r4,%r30\n" // arg1 (to r4) + "b ppcLoadLongRegUpd\n" + "mr %r5,%r30\n" // arg2 (to r5) + "b ppcLoadLongRegUpd\n" + "mr %r6,%r30\n" // arg3 (to r6) + "b ppcLoadLongRegUpd\n" + "mr %r7,%r30\n" // arg4 (to r7) + "b ppcLoadLongRegUpd\n" + "mr %r8,%r30\n" // arg5 (to r8) + "b ppcLoadLongRegUpd\n" + "mr %r9,%r30\n" // arg6 (to r9) + "b ppcLoadLongRegUpd\n" + "mr %r10,%r30\n" // arg7 (to r10) + "b ppcLoadLongRegUpd\n" + + // all GPR arguments still go on the stack + "ppcLoadLongRegUpd:\n" + "std %r30,0(%r26)\n" // store the argument into the next slot on the stack's argument list + "addi %r23, %r23, 1\n" // count a used GPR register + "addi %r29, %r29, 8\n" // move to the next argument on the list + "addi %r26, %r26, 8\n" // adjust our argument stack pointer for the next + "b ppcNextArg\n" // next argument +); + +static asDWORD GetReturnedFloat(void) +{ + asDWORD f; + asm(" stfs 1, %0\n" : "=m"(f)); + return f; +} + +static asQWORD GetReturnedDouble(void) +{ + asQWORD f; + asm(" stfd 1, %0\n" : "=m"(f)); + return f; +} + +// puts the arguments in the correct place in the stack array. See comments above. +static void stackArgs( const asDWORD *args, const asBYTE *argsType, int &numIntArgs, int &numFloatArgs, int &numDoubleArgs, int &numLongArgs ) +{ + // initialize our offset based on any already placed arguments + int i; + int argWordPos = numIntArgs + numFloatArgs + (numDoubleArgs*2) + (numLongArgs*2); + int typeOffset = numIntArgs + numFloatArgs + numDoubleArgs + numLongArgs; + + int typeIndex; + for( i = 0, typeIndex = 0; ; i++, typeIndex++ ) + { + // store the type + ppcArgsType[typeOffset++] = argsType[typeIndex]; + if( argsType[typeIndex] == ppcENDARG ) + break; + + switch( argsType[typeIndex] ) + { + case ppcFLOATARG: + { + // stow float + ppcArgs[argWordPos] = args[i]; // it's just a bit copy + numFloatArgs++; + argWordPos++; //add one word + } + break; + + case ppcDOUBLEARG: + { + // stow double + memcpy( &ppcArgs[argWordPos], &args[i], sizeof(double) ); // we have to do this because of alignment + numDoubleArgs++; + argWordPos+=2; //add two words + i++;//doubles take up 2 argument slots + } + break; + + case ppcINTARG: + { + // stow register + ppcArgs[argWordPos] = args[i]; + numIntArgs++; + argWordPos++; + } + break; + + case ppcLONGARG: + { + // stow long + memcpy( &ppcArgs[argWordPos], &args[i], 8 ); // for alignment purposes, we use memcpy + numLongArgs++; + argWordPos += 2; // add two words + i++; // longs take up 2 argument slots + } + break; + } + } + + // close off the argument list (if we have max args we won't close it off until here) + ppcArgsType[typeOffset] = ppcENDARG; +} + +static asQWORD CallCDeclFunction(const asDWORD* pArgs, const asBYTE *pArgsType, int argSize, asDWORD func, void *retInMemory) +{ + int baseArgCount = 0; + if( retInMemory ) + { + // the first argument is the 'return in memory' pointer + ppcArgs[0] = (asDWORD)retInMemory; + ppcArgsType[0] = ppcINTARG; + ppcArgsType[1] = ppcENDARG; + baseArgCount = 1; + } + + // put the arguments in the correct places in the ppcArgs array + int numTotalArgs = baseArgCount; + if( argSize > 0 ) + { + int intArgs = baseArgCount, floatArgs = 0, doubleArgs = 0, longArgs = 0; + stackArgs( pArgs, pArgsType, intArgs, floatArgs, doubleArgs, longArgs ); + numTotalArgs = intArgs + floatArgs + doubleArgs + longArgs; + } + else + { + // no arguments, cap the type list + ppcArgsType[baseArgCount] = ppcENDARG; + } + + // call the function with the arguments + return ppcFunc64( ppcArgs, PPC_STACK_SIZE(numTotalArgs), func ); +} + +// This function is identical to CallCDeclFunction, with the only difference that +// the value in the first parameter is the object (unless we are returning in memory) +static asQWORD CallThisCallFunction(const void *obj, const asDWORD* pArgs, const asBYTE *pArgsType, int argSize, asDWORD func, void *retInMemory ) +{ + int baseArgCount = 0; + if( retInMemory ) + { + // the first argument is the 'return in memory' pointer + ppcArgs[0] = (asDWORD)retInMemory; + ppcArgsType[0] = ppcINTARG; + ppcArgsType[1] = ppcENDARG; + baseArgCount = 1; + } + + // the first argument is the 'this' of the object + ppcArgs[baseArgCount] = (asDWORD)obj; + ppcArgsType[baseArgCount++] = ppcINTARG; + ppcArgsType[baseArgCount] = ppcENDARG; + + // put the arguments in the correct places in the ppcArgs array + int numTotalArgs = baseArgCount; + if( argSize > 0 ) + { + int intArgs = baseArgCount, floatArgs = 0, doubleArgs = 0, longArgs = 0; + stackArgs( pArgs, pArgsType, intArgs, floatArgs, doubleArgs, longArgs ); + numTotalArgs = intArgs + floatArgs + doubleArgs + longArgs; + } + + // call the function with the arguments + return ppcFunc64( ppcArgs, PPC_STACK_SIZE(numTotalArgs), func); +} + +// This function is identical to CallCDeclFunction, with the only difference that +// the value in the last parameter is the object +// NOTE: on PPC the order for the args is reversed +static asQWORD CallThisCallFunction_objLast(const void *obj, const asDWORD* pArgs, const asBYTE *pArgsType, int argSize, asDWORD func, void *retInMemory) +{ + UNUSED_VAR(argSize); + int baseArgCount = 0; + if( retInMemory ) + { + // the first argument is the 'return in memory' pointer + ppcArgs[0] = (asDWORD)retInMemory; + ppcArgsType[0] = ppcINTARG; + ppcArgsType[1] = ppcENDARG; + baseArgCount = 1; + } + + // stack any of the arguments + int intArgs = baseArgCount, floatArgs = 0, doubleArgs = 0, longArgs = 0; + stackArgs( pArgs, pArgsType, intArgs, floatArgs, doubleArgs, longArgs ); + int numTotalArgs = intArgs + floatArgs + doubleArgs; + + // can we fit the object in at the end? + if( numTotalArgs < AS_PPC_MAX_ARGS ) + { + // put the object pointer at the end + int argPos = intArgs + floatArgs + (doubleArgs * 2) + (longArgs *2); + ppcArgs[argPos] = (asDWORD)obj; + ppcArgsType[numTotalArgs++] = ppcINTARG; + ppcArgsType[numTotalArgs] = ppcENDARG; + } + + // call the function with the arguments + return ppcFunc64( ppcArgs, PPC_STACK_SIZE(numTotalArgs), func ); +} + +// returns true if the given parameter is a 'variable argument' +inline bool IsVariableArgument( asCDataType type ) +{ + return (type.GetTokenType() == ttQuestion) ? true : false; +} + +int CallSystemFunction(int id, asCContext *context, void *objectPointer) +{ + // use a working array of types, we'll configure the final one in stackArgs + asBYTE argsType[AS_PPC_MAX_ARGS + 1 + 1 + 1]; + memset( argsType, 0, sizeof(argsType)); + + asCScriptEngine *engine = context->engine; + asCScriptFunction *descr = engine->scriptFunctions[id]; + asSSystemFunctionInterface *sysFunc = descr->sysFuncIntf; + + int callConv = sysFunc->callConv; + if( callConv == ICC_GENERIC_FUNC || callConv == ICC_GENERIC_METHOD ) + { + // we're only handling native calls, handle generic calls in here + return context->CallGeneric( id, objectPointer); + } + + asQWORD retQW = 0; + void *func = (void*)sysFunc->func; + int paramSize = sysFunc->paramSize; + int popSize = paramSize; + asDWORD *args = context->regs.stackPointer; + void *obj = NULL; + asDWORD *vftable = NULL; + void *retObjPointer = NULL; // for system functions that return AngelScript objects + void *retInMemPointer = NULL; // for host functions that need to return data in memory instead of by register + int a; + + // convert the parameters that are < 4 bytes from little endian to big endian + int argDwordOffset = 0; + int totalArgumentCount = 0; + + // if this is a THISCALL function and no object pointer was given, then the + // first argument on the stack is the object pointer -- we MUST skip it for doing + // the endian flipping. + if( ( callConv >= ICC_THISCALL ) && (objectPointer == NULL) ) + { + ++argDwordOffset; + } + + for( a = 0; a < (int)descr->parameterTypes.GetLength(); ++a ) + { + // get the size for the parameter + int numBytes = descr->parameterTypes[a].GetSizeInMemoryBytes(); + ++totalArgumentCount; + + // is this a variable argument? + // for variable arguments, the typeID will always follow...but we know it is 4 bytes + // so we can skip that parameter automatically. + bool isVarArg = IsVariableArgument( descr->parameterTypes[a] ); + if( isVarArg ) + { + ++totalArgumentCount; + } + + if( numBytes >= 4 || descr->parameterTypes[a].IsReference() || descr->parameterTypes[a].IsObjectHandle() ) + { + // DWORD or larger parameter --- no flipping needed + argDwordOffset += descr->parameterTypes[a].GetSizeOnStackDWords(); + } + else + { + // flip + assert( numBytes == 1 || numBytes == 2 ); + switch( numBytes ) + { + case 1: + { + volatile asBYTE *bPtr = (asBYTE*)ARG_DW(args[argDwordOffset]); + asBYTE t = bPtr[0]; + bPtr[0] = bPtr[3]; + bPtr[3] = t; + t = bPtr[1]; + bPtr[1] = bPtr[2]; + bPtr[2] = t; + } + break; + case 2: + { + volatile asWORD *wPtr = (asWORD*)ARG_DW(args[argDwordOffset]); + asWORD t = wPtr[0]; + wPtr[0] = wPtr[1]; + wPtr[1] = t; + } + break; + } + ++argDwordOffset; + } + + if( isVarArg ) + { + // skip the implicit typeID + ++argDwordOffset; + } + } + + // Objects returned to AngelScript must be via an object pointer. This goes for + // ALL objects, including those of simple, complex, primitive or float. Whether + // the host system (PPC in this case) returns the 'object' as a pointer depends on the type of object. + context->regs.objectType = descr->returnType.GetObjectType(); + if( descr->returnType.IsObject() && !descr->returnType.IsReference() && !descr->returnType.IsObjectHandle() ) + { + // Allocate the memory for the object + retObjPointer = engine->CallAlloc( descr->returnType.GetObjectType() ); + + if( sysFunc->hostReturnInMemory ) + { + // The return is made in memory on the host system + callConv++; + retInMemPointer = retObjPointer; + } + } + + // make sure that host functions that will be returning in memory have a memory pointer + assert( sysFunc->hostReturnInMemory==false || retInMemPointer!=NULL ); + + if( callConv >= ICC_THISCALL ) + { + if( objectPointer ) + { + obj = objectPointer; + } + else + { + // The object pointer should be popped from the context stack + popSize++; + + // Check for null pointer + obj = (void*)*(args); + if( obj == NULL ) + { + context->SetInternalException(TXT_NULL_POINTER_ACCESS); + if( retObjPointer ) + { + engine->CallFree(retObjPointer); + } + return 0; + } + + // Add the base offset for multiple inheritance + obj = (void*)(int(obj) + sysFunc->baseOffset); + + // Skip the object pointer + args++; + } + } + assert( totalArgumentCount <= AS_PPC_MAX_ARGS ); + + // mark all float/double/int arguments + int argIndex = 0; + for( a = 0; a < (int)descr->parameterTypes.GetLength(); ++a, ++argIndex ) + { + // get the base type + argsType[argIndex] = ppcINTARG; + if( descr->parameterTypes[a].IsFloatType() && !descr->parameterTypes[a].IsReference() ) + { + argsType[argIndex] = ppcFLOATARG; + } + if( descr->parameterTypes[a].IsDoubleType() && !descr->parameterTypes[a].IsReference() ) + { + argsType[argIndex] = ppcDOUBLEARG; + } + if( descr->parameterTypes[a].GetSizeOnStackDWords() == 2 && !descr->parameterTypes[a].IsDoubleType() && !descr->parameterTypes[a].IsReference() ) + { + argsType[argIndex] = ppcLONGARG; + } + + // if it is a variable argument, account for the typeID + if( IsVariableArgument(descr->parameterTypes[a]) ) + { + // implicitly add another parameter (AFTER the parameter above), for the TypeID + argsType[++argIndex] = ppcINTARG; + } + } + assert( argIndex == totalArgumentCount ); + + asDWORD paramBuffer[64]; + if( sysFunc->takesObjByVal ) + { + paramSize = 0; + int spos = 0; + int dpos = 1; + + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + { + #ifdef COMPLEX_OBJS_PASSED_BY_REF + if( descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK ) + { + paramBuffer[dpos++] = args[spos++]; + ++paramSize; + } + else + #endif + { + // NOTE: we may have to do endian flipping here + + // Copy the object's memory to the buffer + memcpy( ¶mBuffer[dpos], *(void**)(args+spos), descr->parameterTypes[n].GetSizeInMemoryBytes() ); + + // Delete the original memory + engine->CallFree( *(char**)(args+spos) ); + spos++; + dpos += descr->parameterTypes[n].GetSizeInMemoryDWords(); + paramSize += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } + else + { + // Copy the value directly + paramBuffer[dpos++] = args[spos++]; + if( descr->parameterTypes[n].GetSizeOnStackDWords() > 1 ) + { + paramBuffer[dpos++] = args[spos++]; + } + paramSize += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + + // if this was a variable argument parameter, then account for the implicit typeID + if( IsVariableArgument( descr->parameterTypes[n] ) ) + { + // the TypeID is just a DWORD + paramBuffer[dpos++] = args[spos++]; + ++paramSize; + } + } + + // Keep a free location at the beginning + args = ¶mBuffer[1]; + } + + // one last verification to make sure things are how we expect + assert( (retInMemPointer!=NULL && sysFunc->hostReturnInMemory) || (retInMemPointer==NULL && !sysFunc->hostReturnInMemory) ); + context->isCallingSystemFunction = true; + switch( callConv ) + { + case ICC_CDECL: + case ICC_CDECL_RETURNINMEM: + case ICC_STDCALL: + case ICC_STDCALL_RETURNINMEM: + retQW = CallCDeclFunction( args, argsType, paramSize, (asDWORD)func, retInMemPointer ); + break; + case ICC_THISCALL: + case ICC_THISCALL_RETURNINMEM: + retQW = CallThisCallFunction(obj, args, argsType, paramSize, (asDWORD)func, retInMemPointer ); + break; + case ICC_VIRTUAL_THISCALL: + case ICC_VIRTUAL_THISCALL_RETURNINMEM: + // Get virtual function table from the object pointer + vftable = *(asDWORD**)obj; + retQW = CallThisCallFunction( obj, args, argsType, paramSize, vftable[asDWORD(func)>>2], retInMemPointer ); + break; + case ICC_CDECL_OBJLAST: + case ICC_CDECL_OBJLAST_RETURNINMEM: + retQW = CallThisCallFunction_objLast( obj, args, argsType, paramSize, (asDWORD)func, retInMemPointer ); + break; + case ICC_CDECL_OBJFIRST: + case ICC_CDECL_OBJFIRST_RETURNINMEM: + retQW = CallThisCallFunction( obj, args, argsType, paramSize, (asDWORD)func, retInMemPointer ); + break; + default: + context->SetInternalException(TXT_INVALID_CALLING_CONVENTION); + } + context->isCallingSystemFunction = false; + +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( sysFunc->takesObjByVal ) + { + // Need to free the complex objects passed by value + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + args++; + + int spos = 0; + for( int n = 0; n < (int)descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && + !descr->parameterTypes[n].IsReference() && + (descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK) ) + { + void *obj = (void*)args[spos++]; + asSTypeBehaviour *beh = &descr->parameterTypes[n].GetObjectType()->beh; + if( beh->destruct ) + { + engine->CallObjectMethod(obj, beh->destruct); + } + + engine->CallFree(obj); + } + else + { + spos += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + + if( IsVariableArgument(descr->parameterTypes[n]) ) + { + // account for the implicit TypeID + ++spos; + } + } + } +#endif + + // Store the returned value in our stack + if( descr->returnType.IsObject() && !descr->returnType.IsReference() ) + { + if( descr->returnType.IsObjectHandle() ) + { + // returning an object handle + context->regs.objectRegister = (void*)(asDWORD)retQW; + + if( sysFunc->returnAutoHandle && context->regs.objectRegister ) + { + engine->CallObjectMethod(context->regs.objectRegister, descr->returnType.GetObjectType()->beh.addref); + } + } + else + { + // returning an object + if( !sysFunc->hostReturnInMemory ) + { + // In this case, AngelScript wants an object pointer back, but the host system + // didn't use 'return in memory', so its results were passed back by the return register. + // We have have to take the results of the return register and store them IN the pointer for the object. + // The data for the object could fit into a register; we need to copy that data to the object pointer's + // memory. + assert( retInMemPointer == NULL ); + assert( retObjPointer != NULL ); + + // Copy the returned value to the pointer sent by the script engine + if( sysFunc->hostReturnSize == 1 ) + { + *(asDWORD*)retObjPointer = (asDWORD)retQW; + } + else + { + *(asQWORD*)retObjPointer = retQW; + } + } + else + { + // In this case, AngelScript wants an object pointer back, and the host system + // used 'return in memory'. So its results were already passed back in memory, and + // stored in the object pointer. + assert( retInMemPointer != NULL ); + assert( retObjPointer != NULL ); + } + + // store the return results into the object register + context->regs.objectRegister = retObjPointer; + } + } + else + { + // Store value in returnVal register + if( sysFunc->hostReturnFloat ) + { + // floating pointer primitives + if( sysFunc->hostReturnSize == 1 ) + { + // single float + *(asDWORD*)&context->regs.valueRegister = GetReturnedFloat(); + } + else + { + // double float + context->regs.valueRegister = GetReturnedDouble(); + } + } + else if( sysFunc->hostReturnSize == 1 ) + { + // <=32 bit primitives + + // due to endian issues we need to handle return values, that are + // less than a DWORD (32 bits) in size, special + int numBytes = descr->returnType.GetSizeInMemoryBytes(); + if( descr->returnType.IsReference() ) numBytes = 4; + switch( numBytes ) + { + case 1: + { + // 8 bits + asBYTE *val = (asBYTE*)ARG_DW(context->regs.valueRegister); + val[0] = (asBYTE)retQW; + val[1] = 0; + val[2] = 0; + val[3] = 0; + val[4] = 0; + val[5] = 0; + val[6] = 0; + val[7] = 0; + } + break; + case 2: + { + // 16 bits + asWORD *val = (asWORD*)ARG_DW(context->regs.valueRegister); + val[0] = (asWORD)retQW; + val[1] = 0; + val[2] = 0; + val[3] = 0; + } + break; + default: + { + // 32 bits + asDWORD *val = (asDWORD*)ARG_DW(context->regs.valueRegister); + val[0] = (asDWORD)retQW; + val[1] = 0; + } + break; + } + } + else + { + // 64 bit primitive + context->regs.valueRegister = retQW; + } + } + + if( sysFunc->hasAutoHandles ) + { + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + { + args++; + } + + int spos = 0; + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( sysFunc->paramAutoHandles[n] && args[spos] ) + { + // Call the release method on the type + engine->CallObjectMethod((void*)args[spos], descr->parameterTypes[n].GetObjectType()->beh.release); + args[spos] = 0; + } + + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + { + spos++; + } + else + { + spos += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + + if( IsVariableArgument( descr->parameterTypes[n] ) ) + { + // account for the implicit TypeID + ++spos; + } + } + } + + return popSize; +} + +END_AS_NAMESPACE + +#endif // AS_PPC_64 +#endif // AS_MAX_PORTABILITY + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_ppc.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_ppc.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_ppc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_ppc.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,913 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_callfunc_ppc.cpp +// +// These functions handle the actual calling of system functions +// +// This version is PPC specific +// + +#include + +#include "as_config.h" + +#ifndef AS_MAX_PORTABILITY +#ifdef AS_PPC + +#include "as_callfunc.h" +#include "as_scriptengine.h" +#include "as_texts.h" +#include "as_tokendef.h" + +#include + +BEGIN_AS_NAMESPACE + +// This part was originally written by Pecan Heber, June 2006, for +// use on MacOS X with 32bit PPC processor. He based the code on the +// code in as_callfunc_sh4.cpp + +#define AS_PPC_MAX_ARGS 32 + +// The array used to send values to the correct places. +// Contains a byte of argTypes to indicate the register tYpe to load +// or zero if end of arguments +// The +1 is for when CallThis (object methods) is used +// Extra +1 when returning in memory +// Extra +1 in ppcArgsType to ensure zero end-of-args marker + +// TODO: multithread: We need to remove these global variables for thread-safety + +enum argTypes { ppcENDARG, ppcINTARG, ppcFLOATARG, ppcDOUBLEARG }; +static asDWORD ppcArgs[2*AS_PPC_MAX_ARGS + 1 + 1]; + +// Using extern "C" because we use this symbol name in the assembly code +extern "C" +{ + static asBYTE ppcArgsType[2*AS_PPC_MAX_ARGS + 1 + 1 + 1]; +} + +// NOTE: these values are for PowerPC 32 bit. +#define PPC_LINKAGE_SIZE (24) // how big the PPC linkage area is in a stack frame +#define PPC_NUM_REGSTORE (9) // how many registers of the PPC we need to store/restore for ppcFunc() +#define PPC_REGSTORE_SIZE (4*PPC_NUM_REGSTORE) // how many bytes are required for register store/restore +#define EXTRA_STACK_SIZE (PPC_LINKAGE_SIZE + PPC_REGSTORE_SIZE) // memory required, not including parameters, for the stack frame +#define PPC_STACK_SIZE(numParams) (-( ( ((((numParams)<8)?8:(numParams))<<2) + EXTRA_STACK_SIZE + 15 ) & ~15 )) // calculates the total stack size needed for ppcFunc64, must pad to 16bytes + +// Loads all data into the correct places and calls the function. +// ppcArgsType is an array containing a byte type (enum argTypes) for each argument. +// stackArgSize is the size in bytes for how much data to put on the stack frame +extern "C" asQWORD ppcFunc(const asDWORD* argsPtr, int StackArgSize, asDWORD func); + +asm(" .text\n" + " .align 2\n" // align the code to 1 << 2 = 4 bytes + " .globl _ppcFunc\n" + "_ppcFunc:\n" + + // We're receiving the following parameters + + // r3 : argsPtr + // r4 : StackArgSize + // r5 : func + + // The following registers are used through out the function + + // r31 : the address of the label address, as reference for all other labels + // r30 : temporary variable + // r29 : arg list pointer + // r28 : number of FPR registers used by the parameters + // r27 : the function pointer that will be called + // r26 : the location of the parameters for the call + // r25 : arg type list pointer + // r24 : temporary variable + // r23 : number of GPR registers used by the parameters + // r1 : this is stack pointer + // r0 : temporary variable + // f0 : temporary variable + + // We need to store some of the registers for restoral before returning to caller + + // lr - always stored in 8(r1) - this is the return address + // cr - not required to be stored, but if it is, its place is in 4(r1) - this is the condition register + // r1 - always stored in 0(r1) - this is the stack pointer + // r11 + // r13 to r31 + // f14 to f31 + + // Store register values and setup our stack frame + " mflr r0 \n" // move the return address into r0 + " stw r0, 8(r1) \n" // Store the return address on the stack + " stmw r23, -36(r1) \n" // Store registers r23 to r31 on the stack + " stwux r1, r1, r4 \n" // Increase the stack with the needed space and store the original value in the destination + + // Obtain an address that we'll use as our position of reference when obtaining addresses of other labels + " bl address \n" + "address: \n" + " mflr r31 \n" + + // initial registers for the function + " mr r29, r3 \n" // (r29) args list + " mr r27, r5 \n" // load the function pointer to call. func actually holds the pointer to our function + " addi r26, r1, 24 \n" // setup the pointer to the parameter area to the function we're going to call + " sub r0, r0, r0 \n" // zero out r0 + " mr r23, r0 \n" // zero out r23, which holds the number of used GPR registers + " mr r28, r0 \n" // zero our r22, which holds the number of used float registers + + // load the global ppcArgsType which holds the types of arguments for each argument + " addis r25, r31, ha16(_ppcArgsType - address) \n" // load the upper 16 bits of the address to r25 + " la r25, lo16(_ppcArgsType - address)(r25) \n" // load the lower 16 bits of the address to r25 + " subi r25, r25, 1 \n" // since we increment r25 on its use, we'll pre-decrement it + + // loop through the arguments + "ppcNextArg: \n" + " addi r25, r25, 1 \n" // increment r25, our arg type pointer + // switch based on the current argument type (0:end, 1:int, 2:float 3:double) + " lbz r24, 0(r25) \n" // load the current argument type (it's a byte) + " mulli r24, r24, 4 \n" // our jump table has 4 bytes per case (1 instruction) + " addis r30, r31, ha16(ppcTypeSwitch - address) \n" // load the address of the jump table for the switch + " la r30, lo16(ppcTypeSwitch - address)(r30) \n" + + " add r0, r30, r24 \n" // offset by our argument type + " mtctr r0 \n" // load the jump address into CTR + " bctr \n" // jump into the jump table/switch + " nop \n" + + // the jump table/switch based on the current argument type + "ppcTypeSwitch: \n" + " b ppcArgsEnd \n" + " b ppcArgIsInteger \n" + " b ppcArgIsFloat \n" + " b ppcArgIsDouble \n" + + // when we get here we have finished processing all the arguments + // everything is ready to go to call the function + "ppcArgsEnd: \n" + " mtctr r27 \n" // the function pointer is stored in r27, load that into CTR + " bctrl \n" // call the function. We have to do it this way so that the LR gets the proper + " nop \n" // return value (the next instruction below). So we have to branch from CTR instead of LR. + + // Restore registers and caller's stack frame, then return to caller + " lwz r1, 0(r1) \n" // restore the caller's stack pointer + " lwz r0, 8(r1) \n" // load in the caller's LR + " mtlr r0 \n" // restore the caller's LR + " lmw r23, -36(r1) \n" // restore registers r23 to r31 from the stack + " blr \n" // return back to the caller + " nop \n" + + // Integer argument (GPR register) + "ppcArgIsInteger: \n" + " addis r30, r31, ha16(ppcLoadIntReg - address) \n" // load the address to the jump table for integer registers + " la r30, lo16(ppcLoadIntReg - address)(r30) \n" + " mulli r0, r23, 8 \n" // each item in the jump table is 2 instructions (8 bytes) + " add r0, r0, r30 \n" // calculate ppcLoadIntReg[numUsedGPRRegs] + " lwz r30, 0(r29) \n" // load the next argument from the argument list into r30 + " cmpwi r23, 8 \n" // we can only load GPR3 through GPR10 (8 registers) + " bgt ppcLoadIntRegUpd \n" // if we're beyond 8 GPR registers, we're in the stack, go there + " mtctr r0 \n" // load the address of our ppcLoadIntReg jump table (we're below 8 GPR registers) + " bctr \n" // load the argument into a GPR register + " nop \n" + // jump table for GPR registers, for the first 8 GPR arguments + "ppcLoadIntReg: \n" + " mr r3, r30 \n" // arg0 (to r3) + " b ppcLoadIntRegUpd \n" + " mr r4, r30 \n" // arg1 (to r4) + " b ppcLoadIntRegUpd \n" + " mr r5, r30 \n" // arg2 (to r5) + " b ppcLoadIntRegUpd \n" + " mr r6, r30 \n" // arg3 (to r6) + " b ppcLoadIntRegUpd \n" + " mr r7, r30 \n" // arg4 (to r7) + " b ppcLoadIntRegUpd \n" + " mr r8, r30 \n" // arg5 (to r8) + " b ppcLoadIntRegUpd \n" + " mr r9, r30 \n" // arg6 (to r9) + " b ppcLoadIntRegUpd \n" + " mr r10, r30 \n" // arg7 (to r10) + " b ppcLoadIntRegUpd \n" + // all GPR arguments still go on the stack + "ppcLoadIntRegUpd: \n" + " stw r30, 0(r26) \n" // store the argument into the next slot on the stack's argument list + " addi r23, r23, 1 \n" // count a used GPR register + " addi r29, r29, 4 \n" // move to the next argument on the list + " addi r26, r26, 4 \n" // adjust our argument stack pointer for the next + " b ppcNextArg \n" // next argument + + // single Float argument + "ppcArgIsFloat:\n" + " addis r30, r31, ha16(ppcLoadFloatReg - address) \n" // get the base address of the float register jump table + " la r30, lo16(ppcLoadFloatReg - address)(r30) \n" + " mulli r0, r28, 8 \n" // each jump table entry is 8 bytes + " add r0, r0, r30 \n" // calculate the offset to ppcLoadFloatReg[numUsedFloatReg] + " lfs f0, 0(r29) \n" // load the next argument as a float into f0 + " cmpwi r28, 13 \n" // can't load more than 13 float/double registers + " bgt ppcLoadFloatRegUpd \n" // if we're beyond 13 registers, just fall to inserting into the stack + " mtctr r0 \n" // jump into the float jump table + " bctr \n" + " nop \n" + // jump table for float registers, for the first 13 float arguments + "ppcLoadFloatReg: \n" + " fmr f1, f0 \n" // arg0 (f1) + " b ppcLoadFloatRegUpd \n" + " fmr f2, f0 \n" // arg1 (f2) + " b ppcLoadFloatRegUpd \n" + " fmr f3, f0 \n" // arg2 (f3) + " b ppcLoadFloatRegUpd \n" + " fmr f4, f0 \n" // arg3 (f4) + " b ppcLoadFloatRegUpd \n" + " fmr f5, f0 \n" // arg4 (f5) + " b ppcLoadFloatRegUpd \n" + " fmr f6, f0 \n" // arg5 (f6) + " b ppcLoadFloatRegUpd \n" + " fmr f7, f0 \n" // arg6 (f7) + " b ppcLoadFloatRegUpd \n" + " fmr f8, f0 \n" // arg7 (f8) + " b ppcLoadFloatRegUpd \n" + " fmr f9, f0 \n" // arg8 (f9) + " b ppcLoadFloatRegUpd \n" + " fmr f10, f0 \n" // arg9 (f10) + " b ppcLoadFloatRegUpd \n" + " fmr f11, f0 \n" // arg10 (f11) + " b ppcLoadFloatRegUpd \n" + " fmr f12, f0 \n" // arg11 (f12) + " b ppcLoadFloatRegUpd \n" + " fmr f13, f0 \n" // arg12 (f13) + " b ppcLoadFloatRegUpd \n" + " nop \n" + // all float arguments still go on the stack + "ppcLoadFloatRegUpd: \n" + " stfs f0, 0(r26) \n" // store, as a single float, f0 (current argument) on to the stack argument list + " addi r23, r23, 1 \n" // a float register eats up a GPR register + " addi r28, r28, 1 \n" // ...and, of course, a float register + " addi r29, r29, 4 \n" // move to the next argument in the list + " addi r26, r26, 4 \n" // move to the next stack slot + " b ppcNextArg \n" // on to the next argument + " nop \n" + + // double Float argument + "ppcArgIsDouble: \n" + " addis r30, r31, ha16(ppcLoadDoubleReg - address) \n" // load the base address of the jump table for double registers + " la r30, lo16(ppcLoadDoubleReg - address)(r30) \n" + " mulli r0, r28, 8 \n" // each slot of the jump table is 8 bytes + " add r0, r0, r30 \n" // calculate ppcLoadDoubleReg[numUsedFloatReg] + " lfd f0, 0(r29) \n" // load the next argument, as a double float, into f0 + " cmpwi r28, 13 \n" // the first 13 floats must go into float registers also + " bgt ppcLoadDoubleRegUpd \n" // if we're beyond 13, then just put on to the stack + " mtctr r0 \n" // we're under 13, first load our register + " bctr \n" // jump into the jump table + " nop \n" + // jump table for float registers, for the first 13 float arguments + "ppcLoadDoubleReg: \n" + " fmr f1, f0 \n" // arg0 (f1) + " b ppcLoadDoubleRegUpd \n" + " fmr f2, f0 \n" // arg1 (f2) + " b ppcLoadDoubleRegUpd \n" + " fmr f3, f0 \n" // arg2 (f3) + " b ppcLoadDoubleRegUpd \n" + " fmr f4, f0 \n" // arg3 (f4) + " b ppcLoadDoubleRegUpd \n" + " fmr f5, f0 \n" // arg4 (f5) + " b ppcLoadDoubleRegUpd \n" + " fmr f6, f0 \n" // arg5 (f6) + " b ppcLoadDoubleRegUpd \n" + " fmr f7, f0 \n" // arg6 (f7) + " b ppcLoadDoubleRegUpd \n" + " fmr f8, f0 \n" // arg7 (f8) + " b ppcLoadDoubleRegUpd \n" + " fmr f9, f0 \n" // arg8 (f9) + " b ppcLoadDoubleRegUpd \n" + " fmr f10, f0 \n" // arg9 (f10) + " b ppcLoadDoubleRegUpd \n" + " fmr f11, f0 \n" // arg10 (f11) + " b ppcLoadDoubleRegUpd \n" + " fmr f12, f0 \n" // arg11 (f12) + " b ppcLoadDoubleRegUpd \n" + " fmr f13, f0 \n" // arg12 (f13) + " b ppcLoadDoubleRegUpd \n" + " nop \n" + // all float arguments still go on the stack + "ppcLoadDoubleRegUpd: \n" + " stfd f0, 0(r26) \n" // store f0, as a double, into the argument list on the stack + " addi r23, r23, 2 \n" // a double float eats up two GPRs + " addi r28, r28, 1 \n" // ...and, of course, a float + " addi r29, r29, 8 \n" // increment to our next argument we need to process (8 bytes for the 64bit float) + " addi r26, r26, 8 \n" // increment to the next slot on the argument list on the stack (8 bytes) + " b ppcNextArg \n" // on to the next argument + " nop \n" +); + +asDWORD GetReturnedFloat() +{ + asDWORD f; + asm(" stfs f1, %0\n" : "=m"(f)); + return f; +} + +asQWORD GetReturnedDouble() +{ + asQWORD f; + asm(" stfd f1, %0\n" : "=m"(f)); + return f; +} + +// puts the arguments in the correct place in the stack array. See comments above. +void stackArgs(const asDWORD *args, const asBYTE *argsType, int& numIntArgs, int& numFloatArgs, int& numDoubleArgs) +{ + int i; + int argWordPos = numIntArgs + numFloatArgs + (numDoubleArgs*2); + int typeOffset = numIntArgs + numFloatArgs + numDoubleArgs; + + int typeIndex; + for( i = 0, typeIndex = 0; ; i++, typeIndex++ ) + { + // store the type + ppcArgsType[typeOffset++] = argsType[typeIndex]; + if( argsType[typeIndex] == ppcENDARG ) + break; + + switch( argsType[typeIndex] ) + { + case ppcFLOATARG: + // stow float + ppcArgs[argWordPos] = args[i]; // it's just a bit copy + numFloatArgs++; + argWordPos++; //add one word + break; + + case ppcDOUBLEARG: + // stow double + memcpy( &ppcArgs[argWordPos], &args[i], sizeof(double) ); // we have to do this because of alignment + numDoubleArgs++; + argWordPos+=2; //add two words + i++;//doubles take up 2 argument slots + break; + + case ppcINTARG: + // stow register + ppcArgs[argWordPos] = args[i]; + numIntArgs++; + argWordPos++; + break; + } + } + + // close off the argument list (if we have max args we won't close it off until here) + ppcArgsType[typeOffset] = ppcENDARG; +} + +static asQWORD CallCDeclFunction(const asDWORD* pArgs, const asBYTE *pArgsType, int argSize, asDWORD func, void *retInMemory) +{ + int baseArgCount = 0; + if( retInMemory ) + { + // the first argument is the 'return in memory' pointer + ppcArgs[0] = (asDWORD)retInMemory; + ppcArgsType[0] = ppcINTARG; + ppcArgsType[1] = ppcENDARG; + baseArgCount = 1; + } + + // put the arguments in the correct places in the ppcArgs array + int numTotalArgs = baseArgCount; + if( argSize > 0 ) + { + int intArgs = baseArgCount, floatArgs = 0, doubleArgs = 0; + stackArgs( pArgs, pArgsType, intArgs, floatArgs, doubleArgs ); + numTotalArgs = intArgs + floatArgs + 2*doubleArgs; // doubles occupy two slots + } + else + { + // no arguments, cap the type list + ppcArgsType[baseArgCount] = ppcENDARG; + } + + // call the function with the arguments + return ppcFunc( ppcArgs, PPC_STACK_SIZE(numTotalArgs), func ); +} + +// This function is identical to CallCDeclFunction, with the only difference that +// the value in the first parameter is the object (unless we are returning in memory) +static asQWORD CallThisCallFunction(const void *obj, const asDWORD* pArgs, const asBYTE *pArgsType, int argSize, asDWORD func, void *retInMemory ) +{ + int baseArgCount = 0; + if( retInMemory ) + { + // the first argument is the 'return in memory' pointer + ppcArgs[0] = (asDWORD)retInMemory; + ppcArgsType[0] = ppcINTARG; + ppcArgsType[1] = ppcENDARG; + baseArgCount = 1; + } + + // the first argument is the 'this' of the object + ppcArgs[baseArgCount] = (asDWORD)obj; + ppcArgsType[baseArgCount++] = ppcINTARG; + ppcArgsType[baseArgCount] = ppcENDARG; + + // put the arguments in the correct places in the ppcArgs array + int numTotalArgs = baseArgCount; + if( argSize > 0 ) + { + int intArgs = baseArgCount, floatArgs = 0, doubleArgs = 0; + stackArgs( pArgs, pArgsType, intArgs, floatArgs, doubleArgs ); + numTotalArgs = intArgs + floatArgs + 2*doubleArgs; // doubles occupy two slots + } + + // call the function with the arguments + return ppcFunc( ppcArgs, PPC_STACK_SIZE(numTotalArgs), func); +} + +// This function is identical to CallCDeclFunction, with the only difference that +// the value in the last parameter is the object +// NOTE: on PPC the order for the args is reversed +static asQWORD CallThisCallFunction_objLast(const void *obj, const asDWORD* pArgs, const asBYTE *pArgsType, int argSize, asDWORD func, void *retInMemory) +{ + UNUSED_VAR(argSize); + int baseArgCount = 0; + if( retInMemory ) + { + // the first argument is the 'return in memory' pointer + ppcArgs[0] = (asDWORD)retInMemory; + ppcArgsType[0] = ppcINTARG; + ppcArgsType[1] = ppcENDARG; + baseArgCount = 1; + } + + // stack any of the arguments + int intArgs = baseArgCount, floatArgs = 0, doubleArgs = 0; + stackArgs( pArgs, pArgsType, intArgs, floatArgs, doubleArgs ); + int numTotalArgs = intArgs + floatArgs + doubleArgs; + + // can we fit the object in at the end? + if( numTotalArgs < AS_PPC_MAX_ARGS ) + { + // put the object pointer at the end + int argPos = intArgs + floatArgs + (doubleArgs * 2); + ppcArgs[argPos] = (asDWORD)obj; + ppcArgsType[numTotalArgs++] = ppcINTARG; + ppcArgsType[numTotalArgs] = ppcENDARG; + } + + // call the function with the arguments + return ppcFunc( ppcArgs, PPC_STACK_SIZE(numTotalArgs), func ); +} + +int CallSystemFunction(int id, asCContext *context, void *objectPointer) +{ + // use a working array of types, we'll configure the final one in stackArgs + asBYTE argsType[2*AS_PPC_MAX_ARGS + 1 + 1 + 1]; + memset( argsType, 0, sizeof(argsType)); + + asCScriptEngine *engine = context->engine; + asCScriptFunction *descr = engine->scriptFunctions[id]; + asSSystemFunctionInterface *sysFunc = descr->sysFuncIntf; + + int callConv = sysFunc->callConv; + if( callConv == ICC_GENERIC_FUNC || callConv == ICC_GENERIC_METHOD ) + { + // we're only handling native calls, handle generic calls in here + return context->CallGeneric( id, objectPointer); + } + + asQWORD retQW = 0; + void *func = (void*)sysFunc->func; + int paramSize = sysFunc->paramSize; + int popSize = paramSize; + asDWORD *args = context->regs.stackPointer; + void *obj = NULL; + asDWORD *vftable = NULL; + void *retObjPointer = NULL; // for system functions that return AngelScript objects + void *retInMemPointer = NULL; // for host functions that need to return data in memory instead of by register + int a, s; + + // convert the parameters that are < 4 bytes from little endian to big endian + int argDwordOffset = 0; + + // if this is a THISCALL function and no object pointer was given, then the + // first argument on the stack is the object pointer -- we MUST skip it for doing + // the endian flipping. + if( ( callConv >= ICC_THISCALL ) && (objectPointer == NULL) ) + { + ++argDwordOffset; + } + + for( a = 0; a < (int)descr->parameterTypes.GetLength(); a++ ) + { + int numBytes = descr->parameterTypes[a].GetSizeInMemoryBytes(); + if( numBytes >= 4 || descr->parameterTypes[a].IsReference() || descr->parameterTypes[a].IsObjectHandle() ) + { + argDwordOffset += descr->parameterTypes[a].GetSizeOnStackDWords(); + continue; + } + + // flip + asASSERT( numBytes == 1 || numBytes == 2 ); + switch( numBytes ) + { + case 1: + { + volatile asBYTE *bPtr = (asBYTE*)ARG_DW(args[argDwordOffset]); + asBYTE t = bPtr[0]; + bPtr[0] = bPtr[3]; + bPtr[3] = t; + t = bPtr[1]; + bPtr[1] = bPtr[2]; + bPtr[2] = t; + } + break; + case 2: + { + volatile asWORD *wPtr = (asWORD*)ARG_DW(args[argDwordOffset]); + asWORD t = wPtr[0]; + wPtr[0] = wPtr[1]; + wPtr[1] = t; + } + break; + } + argDwordOffset++; + } + + // Objects returned to AngelScript must be via an object pointer. This goes for + // ALL objects, including those of simple, complex, primitive or float. Whether + // the host system (PPC in this case) returns the 'object' as a pointer depends on the type of object. + context->regs.objectType = descr->returnType.GetObjectType(); + if( descr->returnType.IsObject() && !descr->returnType.IsReference() && !descr->returnType.IsObjectHandle() ) + { + // Allocate the memory for the object + retObjPointer = engine->CallAlloc( descr->returnType.GetObjectType() ); + + if( sysFunc->hostReturnInMemory ) + { + // The return is made in memory on the host system + callConv++; + retInMemPointer = retObjPointer; + } + } + + // make sure that host functions that will be returning in memory have a memory pointer + asASSERT( sysFunc->hostReturnInMemory==false || retInMemPointer!=NULL ); + + if( callConv >= ICC_THISCALL ) + { + if( objectPointer ) + { + obj = objectPointer; + } + else + { + // The object pointer should be popped from the context stack + popSize++; + + // Check for null pointer + obj = (void*)*(args); + if( obj == NULL ) + { + context->SetInternalException(TXT_NULL_POINTER_ACCESS); + if( retObjPointer ) + { + engine->CallFree(retObjPointer); + } + return 0; + } + + // Add the base offset for multiple inheritance + obj = (void*)(int(obj) + sysFunc->baseOffset); + + // Skip the object pointer + args++; + } + } + asASSERT( descr->parameterTypes.GetLength() <= AS_PPC_MAX_ARGS ); + + // mark all float/double/int arguments + for( s = 0, a = 0; s < (int)descr->parameterTypes.GetLength(); s++, a++ ) + { + if( descr->parameterTypes[s].IsFloatType() && !descr->parameterTypes[s].IsReference() ) + { + argsType[a] = ppcFLOATARG; + } + else if( descr->parameterTypes[s].IsDoubleType() && !descr->parameterTypes[s].IsReference() ) + { + argsType[a] = ppcDOUBLEARG; + } + else + { + argsType[a] = ppcINTARG; + if( descr->parameterTypes[s].GetSizeOnStackDWords() == 2 ) + { + // Add an extra integer argument for the extra size + a++; + argsType[a] = ppcINTARG; + } + } + } + + asDWORD paramBuffer[64]; + if( sysFunc->takesObjByVal ) + { + paramSize = 0; + int spos = 0; + int dpos = 1; + + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + { +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK ) + { + paramBuffer[dpos++] = args[spos++]; + paramSize++; + } + else +#endif + { + // NOTE: we may have to do endian flipping here + + // Copy the object's memory to the buffer + memcpy( ¶mBuffer[dpos], *(void**)(args+spos), descr->parameterTypes[n].GetSizeInMemoryBytes() ); + + // Delete the original memory + engine->CallFree(*(char**)(args+spos) ); + spos++; + dpos += descr->parameterTypes[n].GetSizeInMemoryDWords(); + paramSize += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } + else + { + // Copy the value directly + paramBuffer[dpos++] = args[spos++]; + if( descr->parameterTypes[n].GetSizeOnStackDWords() > 1 ) + { + paramBuffer[dpos++] = args[spos++]; + } + paramSize += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + + // Keep a free location at the beginning + args = ¶mBuffer[1]; + } + + // one last verification to make sure things are how we expect + asASSERT( (retInMemPointer!=NULL && sysFunc->hostReturnInMemory) || (retInMemPointer==NULL && !sysFunc->hostReturnInMemory) ); + context->isCallingSystemFunction = true; + switch( callConv ) + { + case ICC_CDECL: + case ICC_CDECL_RETURNINMEM: + case ICC_STDCALL: + case ICC_STDCALL_RETURNINMEM: + retQW = CallCDeclFunction( args, argsType, paramSize, (asDWORD)func, retInMemPointer ); + break; + case ICC_THISCALL: + case ICC_THISCALL_RETURNINMEM: + retQW = CallThisCallFunction(obj, args, argsType, paramSize, (asDWORD)func, retInMemPointer ); + break; + case ICC_VIRTUAL_THISCALL: + case ICC_VIRTUAL_THISCALL_RETURNINMEM: + // Get virtual function table from the object pointer + vftable = *(asDWORD**)obj; + retQW = CallThisCallFunction( obj, args, argsType, paramSize, vftable[asDWORD(func)>>2], retInMemPointer ); + break; + case ICC_CDECL_OBJLAST: + case ICC_CDECL_OBJLAST_RETURNINMEM: + retQW = CallThisCallFunction_objLast( obj, args, argsType, paramSize, (asDWORD)func, retInMemPointer ); + break; + case ICC_CDECL_OBJFIRST: + case ICC_CDECL_OBJFIRST_RETURNINMEM: + retQW = CallThisCallFunction( obj, args, argsType, paramSize, (asDWORD)func, retInMemPointer ); + break; + default: + context->SetInternalException(TXT_INVALID_CALLING_CONVENTION); + } + context->isCallingSystemFunction = false; + +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( sysFunc->takesObjByVal ) + { + // Need to free the complex objects passed by value + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + args++; + + int spos = 0; + for( int n = 0; n < (int)descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && + !descr->parameterTypes[n].IsReference() && + (descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK) ) + { + void *obj = (void*)args[spos++]; + asSTypeBehaviour *beh = &descr->parameterTypes[n].GetObjectType()->beh; + if( beh->destruct ) + { + engine->CallObjectMethod(obj, beh->destruct); + } + + engine->CallFree(obj); + } + else + { + spos += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + } +#endif + + // Store the returned value in our stack + if( descr->returnType.IsObject() && !descr->returnType.IsReference() ) + { + if( descr->returnType.IsObjectHandle() ) + { + // Since we're treating the system function as if it is returning a QWORD we are + // actually receiving the value in the high DWORD of retQW. + retQW >>= 32; + + // returning an object handle + context->regs.objectRegister = (void*)(asDWORD)retQW; + + if( sysFunc->returnAutoHandle && context->regs.objectRegister ) + { + engine->CallObjectMethod(context->regs.objectRegister, descr->returnType.GetObjectType()->beh.addref); + } + } + else + { + // returning an object + if( !sysFunc->hostReturnInMemory ) + { + // In this case, AngelScript wants an object pointer back, but the host system + // didn't use 'return in memory', so its results were passed back by the return register. + // We have have to take the results of the return register and store them IN the pointer for the object. + // The data for the object could fit into a register; we need to copy that data to the object pointer's + // memory. + asASSERT( retInMemPointer == NULL ); + asASSERT( retObjPointer != NULL ); + + // Copy the returned value to the pointer sent by the script engine + if( sysFunc->hostReturnSize == 1 ) + { + // Since we're treating the system function as if it is returning a QWORD we are + // actually receiving the value in the high DWORD of retQW. + retQW >>= 32; + + *(asDWORD*)retObjPointer = (asDWORD)retQW; + } + else + { + *(asQWORD*)retObjPointer = retQW; + } + } + else + { + // In this case, AngelScript wants an object pointer back, and the host system + // used 'return in memory'. So its results were already passed back in memory, and + // stored in the object pointer. + asASSERT( retInMemPointer != NULL ); + asASSERT( retObjPointer != NULL ); + } + + // store the return results into the object register + context->regs.objectRegister = retObjPointer; + } + } + else + { + // Store value in valueRegister + if( sysFunc->hostReturnFloat ) + { + // floating pointer primitives + if( sysFunc->hostReturnSize == 1 ) + { + // single float + *(asDWORD*)&context->regs.valueRegister = GetReturnedFloat(); + } + else + { + // double float + context->regs.valueRegister = GetReturnedDouble(); + } + } + else if( sysFunc->hostReturnSize == 1 ) + { + // <= 32 bit primitives + + // Since we're treating the system function as if it is returning a QWORD we are + // actually receiving the value in the high DWORD of retQW. + retQW >>= 32; + + // due to endian issues we need to handle return values, that are + // less than a DWORD (32 bits) in size, special + int numBytes = descr->returnType.GetSizeInMemoryBytes(); + if( descr->returnType.IsReference() ) numBytes = 4; + switch( numBytes ) + { + case 1: + { + // 8 bits + asBYTE *val = (asBYTE*)ARG_DW(context->regs.valueRegister); + val[0] = (asBYTE)retQW; + val[1] = 0; + val[2] = 0; + val[3] = 0; + val[4] = 0; + val[5] = 0; + val[6] = 0; + val[7] = 0; + } + break; + case 2: + { + // 16 bits + asWORD *val = (asWORD*)ARG_DW(context->regs.valueRegister); + val[0] = (asWORD)retQW; + val[1] = 0; + val[2] = 0; + val[3] = 0; + } + break; + default: + { + // 32 bits + asDWORD *val = (asDWORD*)ARG_DW(context->regs.valueRegister); + val[0] = (asDWORD)retQW; + val[1] = 0; + } + break; + } + } + else + { + // 64 bit primitive + context->regs.valueRegister = retQW; + } + } + + if( sysFunc->hasAutoHandles ) + { + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + { + args++; + } + + int spos = 0; + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( sysFunc->paramAutoHandles[n] && args[spos] ) + { + // Call the release method on the type + engine->CallObjectMethod((void*)args[spos], descr->parameterTypes[n].GetObjectType()->beh.release); + args[spos] = 0; + } + + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + { + spos++; + } + else + { + spos += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + } + + return popSize; +} + +END_AS_NAMESPACE + +#endif // AS_PPC +#endif // AS_MAX_PORTABILITY + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_sh4.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_sh4.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_sh4.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_sh4.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,517 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_callfunc_sh4.cpp +// +// These functions handle the actual calling of system functions +// +// This version is SH4 specific and was originally written +// by Fredrik Ehnbom in May, 2004 +// Later updated for angelscript 2.0.0 by Fredrik Ehnbom in Jan, 2005 + +// References: +// * http://www.renesas.com/avs/resource/japan/eng/pdf/mpumcu/e602156_sh4.pdf +// * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcechp40/html/_callsh4_SH_4_Calling_Standard.asp + + +#include "as_config.h" + +#ifndef MAX_PORTABILITY +#ifdef AS_SH4 + +#include "as_callfunc.h" +#include "as_scriptengine.h" +#include "as_texts.h" +#include "as_tokendef.h" + +#include +#include + +BEGIN_AS_NAMESPACE + +#define AS_SH4_MAX_ARGS 32 +// The array used to send values to the correct places. +// first 0-4 regular values to load into the r4-r7 registers +// then 0-8 float values to load into the fr4-fr11 registers +// then (AS_SH4_MAX_ARGS - 12) values to load onto the stack +// the +1 is for when CallThis (object methods) is used +// extra +1 when returning in memory +extern "C" { +static asDWORD sh4Args[AS_SH4_MAX_ARGS + 1 + 1]; +} + +// Loads all data into the correct places and calls the function. +// intArgSize is the size in bytes for how much data to put in int registers +// floatArgSize is the size in bytes for how much data to put in float registers +// stackArgSize is the size in bytes for how much data to put on the callstack +extern "C" asQWORD sh4Func(int intArgSize, int floatArgSize, int stackArgSize, asDWORD func); + +asm("" +" .align 4\n" +" .global _sh4Func\n" +"_sh4Func:\n" +" mov.l r14,@-r15\n" +" mov.l r13,@-r15\n" +" mov.l r12,@-r15\n" +" sts.l pr,@-r15\n" // must be saved since we call a subroutine +" mov r7, r14\n" // func +" mov r6, r13\n" // stackArgSize +" mov.l r5,@-r15\n" // floatArgSize +" mov.l sh4Args,r0\n" +" pref @r0\n" +" mov r4, r1\n" // intArgsize +" mov #33*4,r2\n" +" extu.b r2,r2\n" // make unsigned (33*4 = 132 => 128) +" mov.l @(r0,r2), r2\n" // r2 has adress for when returning in memory +"_sh4f_intarguments:\n" // copy all the int arguments to the respective registers +" mov #4*2*2,r3\n" // calculate how many bytes to skip +" sub r1,r3\n" +" braf r3\n" +" add #-4,r1\n" // we are indexing the array backwards, so subtract one (delayed slot) +" mov.l @(r0,r1),r7\n" // 4 arguments +" add #-4,r1\n" +" mov.l @(r0,r1),r6\n" // 3 arguments +" add #-4,r1\n" +" mov.l @(r0,r1),r5\n" // 2 arguments +" add #-4,r1\n" +" mov.l @(r0,r1),r4\n" // 1 argument +" nop\n" +"_sh4f_floatarguments:\n" // copy all the float arguments to the respective registers +" add #4*4, r0\n" +" mov.l @r15+,r1\n" // floatArgSize +" mov #8*2*2,r3\n" // calculate how many bytes to skip +" sub r1,r3\n" +" braf r3\n" +" add #-4,r1\n" // we are indexing the array backwards, so subtract one (delayed slot) +" fmov.s @(r0,r1),fr11\n" // 8 arguments +" add #-4,r1\n" +" fmov.s @(r0,r1),fr10\n" // 7 arguments +" add #-4,r1\n" +" fmov.s @(r0,r1),fr9\n" // 6 arguments +" add #-4,r1\n" +" fmov.s @(r0,r1),fr8\n" // 5 arguments +" add #-4,r1\n" +" fmov.s @(r0,r1),fr7\n" // 4 arguments +" add #-4,r1\n" +" fmov.s @(r0,r1),fr6\n" // 3 arguments +" add #-4,r1\n" +" fmov.s @(r0,r1),fr5\n" // 2 arguments +" add #-4,r1\n" +" fmov.s @(r0,r1),fr4\n" // 1 argument +" nop\n" +"_sh4f_stackarguments:\n" // copy all the stack argument onto the stack +" add #8*4, r0\n" +" mov r0, r1\n" +" mov #0, r0\n" // init position counter (also used as a 0-check on the line after) +" cmp/eq r0, r13\n" +" bt _sh4f_functioncall\n" // no arguments to push onto the stack +" mov r13, r3\n" // stackArgSize +" sub r3,r15\n" // "allocate" space on the stack +" shlr2 r3\n" // make into a counter +"_sh4f_stackloop:\n" +" mov.l @r1+, r12\n" +" mov.l r12, @(r0, r15)\n" +" add #4, r0\n" +" dt r3\n" +" bf _sh4f_stackloop\n" +"_sh4f_functioncall:\n" +" jsr @r14\n" // no arguments +" nop\n" +" add r13, r15\n" // restore stack position +" lds.l @r15+,pr\n" +" mov.l @r15+, r12\n" +" mov.l @r15+, r13\n" +" rts\n" +" mov.l @r15+, r14\n" // delayed slot +"\n" +" .align 4\n" +"sh4Args:\n" +" .long _sh4Args\n" +); + +// puts the arguments in the correct place in the sh4Args-array. See comments above. +// This could be done better. +inline void splitArgs(const asDWORD *args, int argNum, int &numRegIntArgs, int &numRegFloatArgs, int &numRestArgs, int hostFlags) { + int i; + + int argBit = 1; + for (i = 0; i < argNum; i++) { + if (hostFlags & argBit) { + if (numRegFloatArgs < 12 - 4) { + // put in float register + sh4Args[4 + numRegFloatArgs] = args[i]; + numRegFloatArgs++; + } else { + // put in stack + sh4Args[4 + 8 + numRestArgs] = args[i]; + numRestArgs++; + } + } else { + if (numRegIntArgs < 8 - 4) { + // put in int register + sh4Args[numRegIntArgs] = args[i]; + numRegIntArgs++; + } else { + // put in stack + sh4Args[4 + 8 + numRestArgs] = args[i]; + numRestArgs++; + } + } + argBit <<= 1; + } +} +asQWORD CallCDeclFunction(const asDWORD *args, int argSize, asDWORD func, int flags) +{ + int argNum = argSize >> 2; + + int intArgs = 0; + int floatArgs = 0; + int restArgs = 0; + + // put the arguments in the correct places in the sh4Args array + if (argNum > 0) + splitArgs(args, argNum, intArgs, floatArgs, restArgs, flags); + + return sh4Func(intArgs << 2, floatArgs << 2, restArgs << 2, func); +} + +// This function is identical to CallCDeclFunction, with the only difference that +// the value in the first parameter is the object +asQWORD CallThisCallFunction(const void *obj, const asDWORD *args, int argSize, asDWORD func, int flags) +{ + int argNum = argSize >> 2; + + int intArgs = 1; + int floatArgs = 0; + int restArgs = 0; + + sh4Args[0] = (asDWORD) obj; + + // put the arguments in the correct places in the sh4Args array + if (argNum >= 1) + splitArgs(args, argNum, intArgs, floatArgs, restArgs, flags); + + return sh4Func(intArgs << 2, floatArgs << 2, restArgs << 2, func); +} +// This function is identical to CallCDeclFunction, with the only difference that +// the value in the last parameter is the object +asQWORD CallThisCallFunction_objLast(const void *obj, const asDWORD *args, int argSize, asDWORD func, int flags) +{ + int argNum = argSize >> 2; + + int intArgs = 0; + int floatArgs = 0; + int restArgs = 0; + + + // put the arguments in the correct places in the sh4Args array + if (argNum >= 1) + splitArgs(args, argNum, intArgs, floatArgs, restArgs, flags); + + if (intArgs < 4) { + sh4Args[intArgs] = (asDWORD) obj; + intArgs++; + } else { + sh4Args[4 + 8 + restArgs] = (asDWORD) obj; + restArgs++; + } + + + return sh4Func(intArgs << 2, floatArgs << 2, restArgs << 2, func); +} + +asDWORD GetReturnedFloat() +{ + asDWORD f; + + asm("fmov.s fr0, %0\n" : "=m"(f)); + + return f; +} + +// sizeof(double) == 4 with sh-elf-gcc (3.4.0) -m4 +// so this isn't really used... +asQWORD GetReturnedDouble() +{ + asQWORD d; + + asm("fmov dr0, %0\n" : "=m"(d)); + + return d; +} + +int CallSystemFunction(int id, asCContext *context, void *objectPointer) +{ + asCScriptEngine *engine = context->engine; + asSSystemFunctionInterface *sysFunc = engine->scriptFunctions[id]->sysFuncIntf; + int callConv = sysFunc->callConv; + if( callConv == ICC_GENERIC_FUNC || callConv == ICC_GENERIC_METHOD ) + return context->CallGeneric(id, objectPointer); + + asQWORD retQW = 0; + + asCScriptFunction *descr = engine->scriptFunctions[id]; + + void *func = (void*)sysFunc->func; + int paramSize = sysFunc->paramSize; + asDWORD *args = context->regs.stackPointer; + void *retPointer = 0; + void *obj = 0; + asDWORD *vftable; + int popSize = paramSize; + + context->regs.objectType = descr->returnType.GetObjectType(); + if( descr->returnType.IsObject() && !descr->returnType.IsReference() && !descr->returnType.IsObjectHandle() ) + { + // Allocate the memory for the object + retPointer = engine->CallAlloc(descr->returnType.GetObjectType()); + sh4Args[AS_SH4_MAX_ARGS+1] = (asDWORD) retPointer; + + if( sysFunc->hostReturnInMemory ) + { + // The return is made in memory + callConv++; + } + } + + if( callConv >= ICC_THISCALL ) + { + if( objectPointer ) + { + obj = objectPointer; + } + else + { + // The object pointer should be popped from the context stack + popSize++; + + // Check for null pointer + obj = (void*)*(args + paramSize); + if( obj == 0 ) + { + context->SetInternalException(TXT_NULL_POINTER_ACCESS); + if( retPointer ) + engine->CallFree(retPointer); + return 0; + } + + // Add the base offset for multiple inheritance + obj = (void*)(int(obj) + sysFunc->baseOffset); + } + } + asASSERT(descr->parameterTypes.GetLength() <= 32); + + // mark all float arguments + int argBit = 1; + int hostFlags = 0; + int intArgs = 0; + for( int a = 0; a < descr->parameterTypes.GetLength(); a++ ) { + if (descr->parameterTypes[a].IsFloatType()) { + hostFlags |= argBit; + } else intArgs++; + argBit <<= 1; + } + + asDWORD paramBuffer[64]; + if( sysFunc->takesObjByVal ) + { + paramSize = 0; + int spos = 0; + int dpos = 1; + for( int n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + { +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK ) + { + paramBuffer[dpos++] = args[spos++]; + paramSize++; + } + else +#endif + { + // Copy the object's memory to the buffer + memcpy(¶mBuffer[dpos], *(void**)(args+spos), descr->parameterTypes[n].GetSizeInMemoryBytes()); + // Delete the original memory + engine->CallFree(*(char**)(args+spos)); + spos++; + dpos += descr->parameterTypes[n].GetSizeInMemoryDWords(); + paramSize += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } + else + { + // Copy the value directly + paramBuffer[dpos++] = args[spos++]; + if( descr->parameterTypes[n].GetSizeOnStackDWords() > 1 ) + paramBuffer[dpos++] = args[spos++]; + paramSize += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + // Keep a free location at the beginning + args = ¶mBuffer[1]; + } + + context->isCallingSystemFunction = true; + switch( callConv ) + { + case ICC_CDECL: + case ICC_CDECL_RETURNINMEM: + case ICC_STDCALL: + case ICC_STDCALL_RETURNINMEM: + retQW = CallCDeclFunction(args, paramSize<<2, (asDWORD)func, hostFlags); + break; + case ICC_THISCALL: + case ICC_THISCALL_RETURNINMEM: + retQW = CallThisCallFunction(obj, args, paramSize<<2, (asDWORD)func, hostFlags); + break; + case ICC_VIRTUAL_THISCALL: + case ICC_VIRTUAL_THISCALL_RETURNINMEM: + // Get virtual function table from the object pointer + vftable = *(asDWORD**)obj; + retQW = CallThisCallFunction(obj, args, paramSize<<2, vftable[asDWORD(func)>>2], hostFlags); + break; + case ICC_CDECL_OBJLAST: + case ICC_CDECL_OBJLAST_RETURNINMEM: + retQW = CallThisCallFunction_objLast(obj, args, paramSize<<2, (asDWORD)func, hostFlags); + break; + case ICC_CDECL_OBJFIRST: + case ICC_CDECL_OBJFIRST_RETURNINMEM: + retQW = CallThisCallFunction(obj, args, paramSize<<2, (asDWORD)func, hostFlags); + break; + default: + context->SetInternalException(TXT_INVALID_CALLING_CONVENTION); + } + context->isCallingSystemFunction = false; + +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( sysFunc->takesObjByVal ) + { + // Need to free the complex objects passed by value + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + args++; + + int spos = 0; + for( int n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && + !descr->parameterTypes[n].IsReference() && + (descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK) ) + { + void *obj = (void*)args[spos++]; + asSTypeBehaviour *beh = &descr->parameterTypes[n].GetObjectType()->beh; + if( beh->destruct ) + engine->CallObjectMethod(obj, beh->destruct); + + engine->CallFree(obj); + } + else + spos += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } +#endif + + // Store the returned value in our stack + if( descr->returnType.IsObject() && !descr->returnType.IsReference() ) + { + if( descr->returnType.IsObjectHandle() ) + { + context->regs.objectRegister = (void*)(asDWORD)retQW; + + if( sysFunc->returnAutoHandle && context->regs.objectRegister ) + engine->CallObjectMethod(context->regs.objectRegister, descr->returnType.GetObjectType()->beh.addref); + } + else + { + if( !sysFunc->hostReturnInMemory ) + { + // Copy the returned value to the pointer sent by the script engine + if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)retPointer = (asDWORD)retQW; + else + *(asQWORD*)retPointer = retQW; + } + + // Store the object in the register + context->regs.objectRegister = retPointer; + } + } + else + { + // Store value in valueRegister + if( sysFunc->hostReturnFloat ) + { + if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)&context->regs.valueRegister = GetReturnedFloat(); + else + context->regs.valueRegister = GetReturnedDouble(); + } + else if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)&context->regs.valueRegister = (asDWORD)retQW; + else + context->regs.valueRegister = retQW; + } + + if( sysFunc->hasAutoHandles ) + { + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + args++; + + int spos = 0; + for( int n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( sysFunc->paramAutoHandles[n] && args[spos] ) + { + // Call the release method on the type + engine->CallObjectMethod((void*)args[spos], descr->parameterTypes[n].GetObjectType()->beh.release); + args[spos] = 0; + } + + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + spos++; + else + spos += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + + return popSize; +} + +END_AS_NAMESPACE + +#endif // AS_SH4 +#endif // AS_MAX_PORTABILITY + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_x64_gcc.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_x64_gcc.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_x64_gcc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_x64_gcc.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,593 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + +/* + * Implements the AMD64 calling convention for gcc-based 64bit Unices + * + * Author: Ionut "gargltk" Leonte + * + * Initial author: niteice + */ + +#include "as_config.h" + +#ifndef AS_MAX_PORTABILITY +#ifdef AS_X64_GCC + +#include "as_scriptengine.h" +#include "as_texts.h" + +BEGIN_AS_NAMESPACE + +enum argTypes { x64ENDARG = 0, x64INTARG = 1, x64FLOATARG = 2, x64DOUBLEARG = 3, x64VARIABLE = 4 }; +typedef asQWORD ( *funcptr_t )( void ); + +#define X64_MAX_ARGS 32 +#define MAX_CALL_INT_REGISTERS 6 +#define MAX_CALL_SSE_REGISTERS 8 +#define CALLSTACK_MULTIPLIER 2 +#define X64_CALLSTACK_SIZE ( X64_MAX_ARGS + MAX_CALL_SSE_REGISTERS + 3 ) + +#define PUSH_LONG( val ) \ + __asm__ __volatile__ ( \ + "mov %0, %%rax\r\n" \ + "push %%rax" \ + : \ + : "m" ( val ) \ + ) + +#define POP_LONG( reg ) \ + __asm__ __volatile__ ( \ + "popq %rax\r\n" \ + "movq %rax, " reg \ + ) + + +#define ASM_GET_REG( name, dest ) \ + __asm__ __volatile__ ( \ + "mov %" name ", %0\r\n" \ + : \ + : "m" ( dest ) \ + ) + +static asDWORD GetReturnedFloat() +{ + float retval = 0.0f; + asDWORD ret = 0; + + __asm__ __volatile__ ( + "lea %0, %%rax\r\n" + "movss %%xmm0, (%%rax)" + : /* no output */ + : "m" (retval) + : "%rax" + ); + + /* We need to avoid implicit conversions from float to unsigned - we need + a bit-wise-correct-and-complete copy of the value */ + memcpy( &ret, &retval, sizeof( ret ) ); + + return ( asDWORD )ret; +} + +static asQWORD GetReturnedDouble() +{ + double retval = 0.0f; + asQWORD ret = 0; + + __asm__ __volatile__ ( + "lea %0, %%rax\r\n" + "movlpd %%xmm0, (%%rax)" + : /* no optput */ + : "m" (retval) + : "%rax" + ); + /* We need to avoid implicit conversions from double to unsigned long long - we need + a bit-wise-correct-and-complete copy of the value */ + memcpy( &ret, &retval, sizeof( ret ) ); + + return ret; +} + +static asQWORD X64_CallFunction( const asDWORD* pArgs, const asBYTE *pArgsType, void *func ) +{ + asQWORD retval = 0; + asQWORD ( *call )() = (asQWORD (*)())func; + int i = 0; + + /* push the stack parameters */ + for ( i = MAX_CALL_INT_REGISTERS + MAX_CALL_SSE_REGISTERS; pArgsType[i] != x64ENDARG && ( i < X64_MAX_ARGS + MAX_CALL_SSE_REGISTERS + 3 ); i++ ) { + PUSH_LONG( pArgs[i * CALLSTACK_MULTIPLIER] ); + } + + /* push integer parameters */ + for ( i = 0; i < MAX_CALL_INT_REGISTERS; i++ ) { + PUSH_LONG( pArgs[i * CALLSTACK_MULTIPLIER] ); + } + + /* push floating point parameters */ + for ( i = MAX_CALL_INT_REGISTERS; i < MAX_CALL_INT_REGISTERS + MAX_CALL_SSE_REGISTERS; i++ ) { + PUSH_LONG( pArgs[i * CALLSTACK_MULTIPLIER] ); + } + + /* now pop the registers in reverse order and make the call */ + POP_LONG( "%xmm7" ); + POP_LONG( "%xmm6" ); + POP_LONG( "%xmm5" ); + POP_LONG( "%xmm4" ); + POP_LONG( "%xmm3" ); + POP_LONG( "%xmm2" ); + POP_LONG( "%xmm1" ); + POP_LONG( "%xmm0" ); + + POP_LONG( "%r9" ); + POP_LONG( "%r8" ); + POP_LONG( "%rcx" ); + POP_LONG( "%rdx" ); + POP_LONG( "%rsi" ); + POP_LONG( "%rdi" ); + + // call the function with the arguments + retval = call(); + return retval; +} + +// returns true if the given parameter is a 'variable argument' +inline bool IsVariableArgument( asCDataType type ) +{ + return ( type.GetTokenType() == ttQuestion ) ? true : false; +} + +int CallSystemFunction( int id, asCContext *context, void *objectPointer ) +{ + asCScriptEngine *engine = context->engine; + asCScriptFunction *descr = engine->scriptFunctions[id]; + asSSystemFunctionInterface *sysFunc = engine->scriptFunctions[id]->sysFuncIntf; + int callConv = sysFunc->callConv; + + asQWORD retQW = 0; + asQWORD retQW2 = 0; + void *func = ( void * )sysFunc->func; + int paramSize = sysFunc->paramSize; + asDWORD *args = context->regs.stackPointer; + asDWORD *stack_pointer = context->regs.stackPointer; + void *retPointer = 0; + void *obj = 0; + funcptr_t *vftable = NULL; + int popSize = paramSize; + int totalArgumentCount = 0; + int n = 0; + int base_n = 0; + int a = 0; + int param_pre = 0; + int param_post = 0; + int argIndex = 0; + int argumentCount = 0; + + asDWORD tempBuff[CALLSTACK_MULTIPLIER * X64_CALLSTACK_SIZE] = { 0 }; + asBYTE tempType[X64_CALLSTACK_SIZE] = { 0 }; + + asDWORD paramBuffer[CALLSTACK_MULTIPLIER * X64_CALLSTACK_SIZE] = { 0 }; + asBYTE argsType[X64_CALLSTACK_SIZE] = { 0 }; + + asBYTE argsSet[X64_CALLSTACK_SIZE] = { 0 }; + + if( callConv == ICC_GENERIC_FUNC || callConv == ICC_GENERIC_METHOD ) { + return context->CallGeneric( id, objectPointer ); + } + + context->regs.objectType = descr->returnType.GetObjectType(); + if( descr->returnType.IsObject() && !descr->returnType.IsReference() && !descr->returnType.IsObjectHandle() ) { + // Allocate the memory for the object + retPointer = engine->CallAlloc( descr->returnType.GetObjectType() ); + + if( sysFunc->hostReturnInMemory ) { + // The return is made in memory + callConv++; + } + } + + argumentCount = ( int )descr->parameterTypes.GetLength(); + assert( argumentCount <= X64_MAX_ARGS ); + + // TODO: optimize: argsType should be computed in PrepareSystemFunction + for( a = 0; a < argumentCount; ++a, ++argIndex ) { + // get the base type + argsType[argIndex] = x64INTARG; + if ( descr->parameterTypes[a].IsFloatType() && !descr->parameterTypes[a].IsReference() ) { + argsType[argIndex] = x64FLOATARG; + } + if ( descr->parameterTypes[a].IsDoubleType() && !descr->parameterTypes[a].IsReference() ) { + argsType[argIndex] = x64DOUBLEARG; + } + if ( descr->parameterTypes[a].GetSizeOnStackDWords() == 2 && !descr->parameterTypes[a].IsDoubleType() && !descr->parameterTypes[a].IsReference() ) { + argsType[argIndex] = x64INTARG; + } + + if ( IsVariableArgument( descr->parameterTypes[a] ) ) { + argsType[argIndex] = x64VARIABLE; + } + } + assert( argIndex == argumentCount ); + + for ( a = 0; a < argumentCount && totalArgumentCount <= X64_MAX_ARGS; a++ ) { + switch ( argsType[a] ) { + case x64ENDARG: + case x64INTARG: + case x64FLOATARG: + case x64DOUBLEARG: { + if ( totalArgumentCount < X64_MAX_ARGS ) + tempType[totalArgumentCount++] = argsType[a]; + break; + } + case x64VARIABLE: { + if ( totalArgumentCount < X64_MAX_ARGS ) + tempType[totalArgumentCount++] = x64VARIABLE; + if ( totalArgumentCount < X64_MAX_ARGS ) + tempType[totalArgumentCount++] = x64INTARG; + break; + } + } + } + assert( totalArgumentCount <= X64_MAX_ARGS ); + if ( totalArgumentCount > argumentCount ) { + memcpy( argsType, tempType, totalArgumentCount ); + } + memset( tempType, 0, sizeof( tempType ) ); + + // TODO: This should be checked in PrepareSystemFunction +#ifndef COMPLEX_OBJS_PASSED_BY_REF + if( sysFunc->takesObjByVal ) { + /* I currently know of no way we can predict register usage for passing complex + objects by value when the compiler does not pass them by reference instead. I + will quote the example from the AMD64 ABI to demonstrate this: + + (http://www.x86-64.org/documentation/abi.pdf - page 22) + + ------------------------------ BEGIN EXAMPLE ------------------------------- + + Let us consider the following C code: + + typedef struct { + int a, b; + double d; + } structparm; + + structparm s; + int e, f, g, h, i, j, k; + long double ld; + double m, n; + + extern void func (int e, int f, + structparm s, int g, int h, + long double ld, double m, + double n, int i, int j, int k); + + func (e, f, s, g, h, ld, m, n, i, j, k); + + Register allocation for the call: + --------------------------+--------------------------+------------------- + General Purpose Registers | Floating Point Registers | Stack Frame Offset + --------------------------+--------------------------+------------------- + %rdi: e | %xmm0: s.d | 0: ld + %rsi: f | %xmm1: m | 16: j + %rdx: s.a,s.b | %xmm2: n | 24: k + %rcx: g | | + %r8: h | | + %r9: i | | + --------------------------+--------------------------+------------------- + */ + + context->SetInternalException( TXT_INVALID_CALLING_CONVENTION ); + if( retPointer ) { + engine->CallFree( retPointer ); + } + return 0; + } +#endif + + obj = objectPointer; + if ( !obj && callConv >= ICC_THISCALL ) { + // The object pointer should be popped from the context stack + popSize += AS_PTR_SIZE; + + // Check for null pointer + obj = ( void * )( *( ( asQWORD * )( args ) ) ); + stack_pointer += AS_PTR_SIZE; + if( !obj ) { + context->SetInternalException( TXT_NULL_POINTER_ACCESS ); + if( retPointer ) { + engine->CallFree( retPointer ); + } + return 0; + } + + // Add the base offset for multiple inheritance + obj = ( void * )( ( asQWORD )obj + sysFunc->baseOffset ); + } + + if ( obj && ( callConv == ICC_VIRTUAL_THISCALL || callConv == ICC_VIRTUAL_THISCALL_RETURNINMEM ) ) { + vftable = *( ( funcptr_t ** )obj ); + func = ( void * )vftable[( asQWORD )func >> 3]; + } + + switch ( callConv ) { + case ICC_CDECL_RETURNINMEM: + case ICC_STDCALL_RETURNINMEM: { + if ( totalArgumentCount ) { + memmove( argsType + 1, argsType, totalArgumentCount ); + } + memcpy( paramBuffer, &retPointer, sizeof( retPointer ) ); + argsType[0] = x64INTARG; + base_n = 1; + + param_pre = 1; + + break; + } + case ICC_THISCALL: + case ICC_VIRTUAL_THISCALL: + case ICC_CDECL_OBJFIRST: { + if ( totalArgumentCount ) { + memmove( argsType + 1, argsType, totalArgumentCount ); + } + memcpy( paramBuffer, &obj, sizeof( obj ) ); + argsType[0] = x64INTARG; + + param_pre = 1; + + break; + } + case ICC_THISCALL_RETURNINMEM: + case ICC_VIRTUAL_THISCALL_RETURNINMEM: + case ICC_CDECL_OBJFIRST_RETURNINMEM: { + if ( totalArgumentCount ) { + memmove( argsType + 2, argsType, totalArgumentCount ); + } + memcpy( paramBuffer, &retPointer, sizeof( retPointer ) ); + memcpy( paramBuffer + CALLSTACK_MULTIPLIER, &obj, sizeof( &obj ) ); + argsType[0] = x64INTARG; + argsType[1] = x64INTARG; + + param_pre = 2; + + break; + } + case ICC_CDECL_OBJLAST: { + memcpy( paramBuffer + totalArgumentCount * CALLSTACK_MULTIPLIER, &obj, sizeof( obj ) ); + argsType[totalArgumentCount] = x64INTARG; + + param_post = 1; + + break; + } + case ICC_CDECL_OBJLAST_RETURNINMEM: { + if ( totalArgumentCount ) { + memmove( argsType + 1, argsType, totalArgumentCount ); + } + memcpy( paramBuffer, &retPointer, sizeof( retPointer ) ); + argsType[0] = x64INTARG; + memcpy( paramBuffer + ( totalArgumentCount + 1 ) * CALLSTACK_MULTIPLIER, &obj, sizeof( obj ) ); + argsType[totalArgumentCount + 1] = x64INTARG; + + param_pre = 1; + param_post = 1; + + break; + } + default: { + base_n = 0; + break; + } + } + + int adjust = 0; + for( n = 0; n < ( int )( param_pre + totalArgumentCount + param_post ); n++ ) { + int copy_count = 0; + if ( n >= param_pre && n < ( int )( param_pre + totalArgumentCount ) ) { + copy_count = descr->parameterTypes[n - param_pre - adjust].GetSizeOnStackDWords(); + + if ( argsType[n] == x64VARIABLE ) { + adjust += 1; + argsType[n] = x64INTARG; + n += 1; + } + } + if ( copy_count > CALLSTACK_MULTIPLIER ) { + if ( copy_count > CALLSTACK_MULTIPLIER + 1 ) { + context->SetInternalException( TXT_INVALID_CALLING_CONVENTION ); + return 0; + } + + memcpy( paramBuffer + ( n - 1 ) * CALLSTACK_MULTIPLIER, stack_pointer, AS_PTR_SIZE * sizeof( asDWORD ) ); + stack_pointer += AS_PTR_SIZE; + memcpy( paramBuffer + n * CALLSTACK_MULTIPLIER, stack_pointer, sizeof( asDWORD ) ); + stack_pointer += 1; + } else { + if ( copy_count ) { + memcpy( paramBuffer + n * CALLSTACK_MULTIPLIER, stack_pointer, copy_count * sizeof( asDWORD ) ); + stack_pointer += copy_count; + } + } + } + + /* + * Q: WTF is going on here !? + * + * A: The idea is to pre-arange the parameters so that X64_CallFunction() can do + * it's little magic which must work regardless of how the compiler decides to + * allocate registers. Basically: + * - the first MAX_CALL_INT_REGISTERS entries in tempBuff and tempType will + * contain the values/types of the x64INTARG parameters - that is the ones who + * go into the registers. If the function has less then MAX_CALL_INT_REGISTERS + * integer parameters then the last entries will be set to 0 + * - the next MAX_CALL_SSE_REGISTERS entries will contain the float/double arguments + * that go into the floating point registers. If the function has less than + * MAX_CALL_SSE_REGISTERS floating point parameters then the last entries will + * be set to 0 + * - index MAX_CALL_INT_REGISTERS + MAX_CALL_SSE_REGISTERS marks the start of the + * parameters which will get passed on the stack. These are added to the array + * in reverse order so that X64_CallFunction() can simply push them to the stack + * without the need to perform further tests + */ + int used_int_regs = 0; + int used_sse_regs = 0; + int idx = 0; + base_n = 0; + for ( n = 0; ( n < X64_CALLSTACK_SIZE ) && ( used_int_regs < MAX_CALL_INT_REGISTERS ); n++ ) { + if ( argsType[n] == x64INTARG ) { + idx = base_n; + argsSet[n] = 1; + tempType[idx] = argsType[n]; + memcpy( tempBuff + idx * CALLSTACK_MULTIPLIER, paramBuffer + n * CALLSTACK_MULTIPLIER, CALLSTACK_MULTIPLIER * sizeof( asDWORD ) ); + base_n++; + used_int_regs++; + } + } + base_n = 0; + for ( n = 0; ( n < X64_CALLSTACK_SIZE ) && ( used_sse_regs < MAX_CALL_SSE_REGISTERS ); n++ ) { + if ( argsType[n] == x64FLOATARG || argsType[n] == x64DOUBLEARG ) { + idx = MAX_CALL_INT_REGISTERS + base_n; + argsSet[n] = 1; + tempType[idx] = argsType[n]; + memcpy( tempBuff + idx * CALLSTACK_MULTIPLIER, paramBuffer + n * CALLSTACK_MULTIPLIER, CALLSTACK_MULTIPLIER * sizeof( asDWORD ) ); + base_n++; + used_sse_regs++; + } + } + base_n = 0; + for ( n = X64_CALLSTACK_SIZE - 1; n >= 0; n-- ) { + if ( argsType[n] != x64ENDARG && !argsSet[n] ) { + idx = MAX_CALL_INT_REGISTERS + MAX_CALL_SSE_REGISTERS + base_n; + argsSet[n] = 1; + tempType[idx] = argsType[n]; + memcpy( tempBuff + idx * CALLSTACK_MULTIPLIER, paramBuffer + n * CALLSTACK_MULTIPLIER, CALLSTACK_MULTIPLIER * sizeof( asDWORD ) ); + base_n++; + } + } + + context->isCallingSystemFunction = true; + retQW = X64_CallFunction( tempBuff, tempType, ( asDWORD * )func ); + ASM_GET_REG( "%rdx", retQW2 ); + context->isCallingSystemFunction = false; + +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( sysFunc->takesObjByVal ) { + // Need to free the complex objects passed by value + stack_pointer = context->regs.stackPointer; + if ( !objectPointer && callConv >= ICC_THISCALL ) { + stack_pointer += AS_PTR_SIZE; + } + for( n = 0; n < ( int )descr->parameterTypes.GetLength(); n++ ) { + if ( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsReference() && ( descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK ) ) { + obj = ( void * )( *( asQWORD * )stack_pointer ); + asSTypeBehaviour *beh = &descr->parameterTypes[n].GetObjectType()->beh; + if( beh->destruct ) { + engine->CallObjectMethod(obj, beh->destruct); + } + + engine->CallFree(obj); + } + + stack_pointer += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } +#endif + + // Store the returned value in our stack + if( descr->returnType.IsObject() && !descr->returnType.IsReference() ) { + if( descr->returnType.IsObjectHandle() ) { + context->regs.objectRegister = ( void * )( size_t )retQW; + + if( sysFunc->returnAutoHandle && context->regs.objectRegister ) { + engine->CallObjectMethod( context->regs.objectRegister, descr->returnType.GetObjectType()->beh.addref ); + } + } else { + if ( !sysFunc->hostReturnInMemory ) { + if ( sysFunc->hostReturnSize == 1 ) { + *( asDWORD * )retPointer = ( asDWORD )retQW; + } else if ( sysFunc->hostReturnSize == 2 ) { + *( asQWORD * )retPointer = retQW; + } else if ( sysFunc->hostReturnSize == 3 ) { + *( asQWORD * )retPointer = retQW; + *( ( ( asDWORD * )retPointer ) + 2 ) = ( asDWORD )retQW2; + } else { + *( asQWORD * )retPointer = retQW; + *( ( ( asQWORD * )retPointer ) + 1 ) = retQW2; + } + } + + // Store the object in the register + context->regs.objectRegister = retPointer; + } + } else { + // Store value in valueRegister + if( sysFunc->hostReturnFloat ) { + if( sysFunc->hostReturnSize == 1 ) { + *(asDWORD*)&context->regs.valueRegister = GetReturnedFloat(); + } else { + context->regs.valueRegister = GetReturnedDouble(); + } + } else if ( sysFunc->hostReturnSize == 1 ) { + *( asDWORD * )&context->regs.valueRegister = ( asDWORD )retQW; + } else { + context->regs.valueRegister = retQW; + } + } + + if( sysFunc->hasAutoHandles ) { + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) { + args += AS_PTR_SIZE; + } + + int spos = 0; + for( n = 0; n < ( int )descr->parameterTypes.GetLength(); n++ ) { + if( sysFunc->paramAutoHandles[n] && (*(size_t*)&args[spos] != 0) ) { + // Call the release method on the type + engine->CallObjectMethod( ( void * )*( size_t * )&args[spos], descr->parameterTypes[n].GetObjectType()->beh.release ); + args[spos] = 0; + } + + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) { + spos += AS_PTR_SIZE; + } else { + spos += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + } + + return popSize; +} + +END_AS_NAMESPACE + +#endif // AS_X64_GCC +#endif // AS_MAX_PORTABILITY diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_x86.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_x86.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_x86.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_x86.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1255 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_callfunc_x86.cpp +// +// These functions handle the actual calling of system functions +// + + + +#include "as_config.h" + +#ifndef AS_MAX_PORTABILITY +#ifdef AS_X86 + +#include "as_callfunc.h" +#include "as_scriptengine.h" +#include "as_texts.h" +#include "as_tokendef.h" + +BEGIN_AS_NAMESPACE + +typedef asQWORD (*t_CallCDeclQW)(const asDWORD *, int, size_t); +typedef asQWORD (*t_CallCDeclQWObj)(void *obj, const asDWORD *, int, size_t); +typedef asDWORD (*t_CallCDeclRetByRef)(const asDWORD *, int, size_t, void *); +typedef asDWORD (*t_CallCDeclObjRetByRef)(void *obj, const asDWORD *, int, size_t, void *); +typedef asQWORD (*t_CallSTDCallQW)(const asDWORD *, int, size_t); +typedef asQWORD (*t_CallThisCallQW)(const void *, const asDWORD *, int, size_t); +typedef asDWORD (*t_CallThisCallRetByRef)(const void *, const asDWORD *, int, size_t, void *); + +// Prototypes +void CallCDeclFunction(const asDWORD *args, int paramSize, size_t func); +void CallCDeclFunctionObjLast(const void *obj, const asDWORD *args, int paramSize, size_t func); +void CallCDeclFunctionObjFirst(const void *obj, const asDWORD *args, int paramSize, size_t func); +void CallCDeclFunctionRetByRef_impl(const asDWORD *args, int paramSize, size_t func, void *retPtr); +void CallCDeclFunctionRetByRefObjLast_impl(const void *obj, const asDWORD *args, int paramSize, size_t func, void *retPtr); +void CallCDeclFunctionRetByRefObjFirst_impl(const void *obj, const asDWORD *args, int paramSize, size_t func, void *retPtr); +void CallSTDCallFunction(const asDWORD *args, int paramSize, size_t func); +void CallThisCallFunction(const void *obj, const asDWORD *args, int paramSize, size_t func); +void CallThisCallFunctionRetByRef_impl(const void *, const asDWORD *, int, size_t, void *retPtr); + +// Initialize function pointers +const t_CallCDeclQW CallCDeclFunctionQWord = (t_CallCDeclQW)CallCDeclFunction; +const t_CallCDeclQWObj CallCDeclFunctionQWordObjLast = (t_CallCDeclQWObj)CallCDeclFunctionObjLast; +const t_CallCDeclQWObj CallCDeclFunctionQWordObjFirst = (t_CallCDeclQWObj)CallCDeclFunctionObjFirst; +const t_CallCDeclRetByRef CallCDeclFunctionRetByRef = (t_CallCDeclRetByRef)CallCDeclFunctionRetByRef_impl; +const t_CallCDeclObjRetByRef CallCDeclFunctionRetByRefObjLast = (t_CallCDeclObjRetByRef)CallCDeclFunctionRetByRefObjLast_impl; +const t_CallCDeclObjRetByRef CallCDeclFunctionRetByRefObjFirst = (t_CallCDeclObjRetByRef)CallCDeclFunctionRetByRefObjFirst_impl; +const t_CallSTDCallQW CallSTDCallFunctionQWord = (t_CallSTDCallQW)CallSTDCallFunction; +const t_CallThisCallQW CallThisCallFunctionQWord = (t_CallThisCallQW)CallThisCallFunction; +const t_CallThisCallRetByRef CallThisCallFunctionRetByRef = (t_CallThisCallRetByRef)CallThisCallFunctionRetByRef_impl; + +asDWORD GetReturnedFloat(); +asQWORD GetReturnedDouble(); + +int CallSystemFunction(int id, asCContext *context, void *objectPointer) +{ + asCScriptEngine *engine = context->engine; + asCScriptFunction *descr = engine->scriptFunctions[id]; + asSSystemFunctionInterface *sysFunc = descr->sysFuncIntf; + int callConv = sysFunc->callConv; + if( callConv == ICC_GENERIC_FUNC || callConv == ICC_GENERIC_METHOD ) + return context->CallGeneric(id, objectPointer); + + asQWORD retQW = 0; + void *func = (void*)sysFunc->func; + int paramSize = sysFunc->paramSize; + asDWORD *args = context->regs.stackPointer; + void *retPointer = 0; + void *obj = 0; + asDWORD *vftable; + int popSize = paramSize; + + context->regs.objectType = descr->returnType.GetObjectType(); + if( descr->returnType.IsObject() && !descr->returnType.IsReference() && !descr->returnType.IsObjectHandle() ) + { + // Allocate the memory for the object + retPointer = engine->CallAlloc(descr->returnType.GetObjectType()); + + if( sysFunc->hostReturnInMemory ) + { + // The return is made in memory + callConv++; + } + } + + if( callConv >= ICC_THISCALL ) + { + if( objectPointer ) + { + obj = objectPointer; + } + else + { + // The object pointer should be popped from the context stack + popSize++; + + // Check for null pointer + obj = (void*)*(size_t*)(args); + if( obj == 0 ) + { + context->SetInternalException(TXT_NULL_POINTER_ACCESS); + if( retPointer ) + engine->CallFree(retPointer); + return 0; + } + + // Add the base offset for multiple inheritance + obj = (void*)(size_t(obj) + sysFunc->baseOffset); + + // Skip the object pointer + args++; + } + } + + asDWORD paramBuffer[64]; + if( sysFunc->takesObjByVal ) + { + paramSize = 0; + int spos = 0; + int dpos = 1; + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + { +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK ) + { + paramBuffer[dpos++] = args[spos++]; + paramSize++; + } + else +#endif + { + // Copy the object's memory to the buffer + memcpy(¶mBuffer[dpos], *(void**)(args+spos), descr->parameterTypes[n].GetSizeInMemoryBytes()); + + // Delete the original memory + engine->CallFree(*(char**)(args+spos)); + spos++; + dpos += descr->parameterTypes[n].GetSizeInMemoryDWords(); + paramSize += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } + else + { + // Copy the value directly + paramBuffer[dpos++] = args[spos++]; + if( descr->parameterTypes[n].GetSizeOnStackDWords() > 1 ) + paramBuffer[dpos++] = args[spos++]; + paramSize += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + // Keep a free location at the beginning + args = ¶mBuffer[1]; + } + + context->isCallingSystemFunction = true; + switch( callConv ) + { + case ICC_CDECL: + retQW = CallCDeclFunctionQWord(args, paramSize<<2, (size_t)func); + break; + + case ICC_CDECL_RETURNINMEM: + retQW = CallCDeclFunctionRetByRef(args, paramSize<<2, (size_t)func, retPointer); + break; + + case ICC_STDCALL: + retQW = CallSTDCallFunctionQWord(args, paramSize<<2, (size_t)func); + break; + + case ICC_STDCALL_RETURNINMEM: + // Push the return pointer on the stack + paramSize++; + args--; + *(size_t*)args = (size_t)retPointer; + + retQW = CallSTDCallFunctionQWord(args, paramSize<<2, (size_t)func); + break; + + case ICC_THISCALL: + retQW = CallThisCallFunctionQWord(obj, args, paramSize<<2, (size_t)func); + break; + + case ICC_THISCALL_RETURNINMEM: + retQW = CallThisCallFunctionRetByRef(obj, args, paramSize<<2, (size_t)func, retPointer); + break; + + case ICC_VIRTUAL_THISCALL: + // Get virtual function table from the object pointer + vftable = *(asDWORD**)obj; + + retQW = CallThisCallFunctionQWord(obj, args, paramSize<<2, vftable[size_t(func)>>2]); + break; + + case ICC_VIRTUAL_THISCALL_RETURNINMEM: + // Get virtual function table from the object pointer + vftable = *(asDWORD**)obj; + + retQW = CallThisCallFunctionRetByRef(obj, args, paramSize<<2, vftable[size_t(func)>>2], retPointer); + break; + + case ICC_CDECL_OBJLAST: + retQW = CallCDeclFunctionQWordObjLast(obj, args, paramSize<<2, (size_t)func); + break; + + case ICC_CDECL_OBJLAST_RETURNINMEM: + // Call the system object method as a cdecl with the obj ref as the last parameter + retQW = CallCDeclFunctionRetByRefObjLast(obj, args, paramSize<<2, (size_t)func, retPointer); + break; + + case ICC_CDECL_OBJFIRST: + // Call the system object method as a cdecl with the obj ref as the first parameter + retQW = CallCDeclFunctionQWordObjFirst(obj, args, paramSize<<2, (size_t)func); + break; + + case ICC_CDECL_OBJFIRST_RETURNINMEM: + // Call the system object method as a cdecl with the obj ref as the first parameter + retQW = CallCDeclFunctionRetByRefObjFirst(obj, args, paramSize<<2, (size_t)func, retPointer); + break; + + default: + context->SetInternalException(TXT_INVALID_CALLING_CONVENTION); + } + context->isCallingSystemFunction = false; + +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( sysFunc->takesObjByVal ) + { + // Need to free the complex objects passed by value + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + args++; + + int spos = 0; + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsObject() && + !descr->parameterTypes[n].IsReference() && + (descr->parameterTypes[n].GetObjectType()->flags & COMPLEX_MASK) ) + { + void *obj = (void*)args[spos++]; + asSTypeBehaviour *beh = &descr->parameterTypes[n].GetObjectType()->beh; + if( beh->destruct ) + engine->CallObjectMethod(obj, beh->destruct); + + engine->CallFree(obj); + } + else + spos += descr->parameterTypes[n].GetSizeInMemoryDWords(); + } + } +#endif + + // Store the returned value in our stack + if( descr->returnType.IsObject() && !descr->returnType.IsReference() ) + { + if( descr->returnType.IsObjectHandle() ) + { + context->regs.objectRegister = (void*)(size_t)retQW; + + if( sysFunc->returnAutoHandle && context->regs.objectRegister ) + engine->CallObjectMethod(context->regs.objectRegister, descr->returnType.GetObjectType()->beh.addref); + } + else + { + if( !sysFunc->hostReturnInMemory ) + { + // Copy the returned value to the pointer sent by the script engine + if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)retPointer = (asDWORD)retQW; + else + *(asQWORD*)retPointer = retQW; + } + + // Store the object in the register + context->regs.objectRegister = retPointer; + } + } + else + { + // Store value in value register + if( sysFunc->hostReturnFloat ) + { + if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)&context->regs.valueRegister = GetReturnedFloat(); + else + context->regs.valueRegister = GetReturnedDouble(); + } + else if( sysFunc->hostReturnSize == 1 ) + *(asDWORD*)&context->regs.valueRegister = (asDWORD)retQW; + else + context->regs.valueRegister = retQW; + } + + if( sysFunc->hasAutoHandles ) + { + args = context->regs.stackPointer; + if( callConv >= ICC_THISCALL && !objectPointer ) + args++; + + int spos = 0; + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( sysFunc->paramAutoHandles[n] && args[spos] ) + { + // Call the release method on the type + engine->CallObjectMethod((void*)*(size_t*)&args[spos], descr->parameterTypes[n].GetObjectType()->beh.release); + args[spos] = 0; + } + + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() && !descr->parameterTypes[n].IsReference() ) + spos++; + else + spos += descr->parameterTypes[n].GetSizeOnStackDWords(); + } + } + + return popSize; +} + +// On GCC we need to prevent the compiler from inlining these assembler routines when +// optimizing for speed (-O3), as the loop labels get duplicated which cause compile errors. + +#ifdef __GNUC__ + #define NOINLINE __attribute ((__noinline__)) +#else + #define NOINLINE +#endif + + +void NOINLINE CallCDeclFunction(const asDWORD *args, int paramSize, size_t func) +{ +#if defined ASM_INTEL + + // Copy the data to the real stack. If we fail to do + // this we may run into trouble in case of exceptions. + __asm + { + // We must save registers that are used + push ecx + + // Clear the FPU stack, in case the called function doesn't do it by itself + fninit + + // Copy arguments from script + // stack to application stack + mov ecx, paramSize + mov eax, args + add eax, ecx + cmp ecx, 0 + je endcopy +copyloop: + sub eax, 4 + push dword ptr [eax] + sub ecx, 4 + jne copyloop +endcopy: + + // Call function + call [func] + + // Pop arguments from stack + add esp, paramSize + + // Restore registers + pop ecx + + // return value in EAX or EAX:EDX + } + +#elif defined ASM_AT_N_T + + UNUSED_VAR(args); + UNUSED_VAR(paramSize); + UNUSED_VAR(func); + + asm("pushl %ecx \n" + "fninit \n" + + // Need to align the stack pointer so that it is aligned to 16 bytes when making the function call. + // It is assumed that when entering this function, the stack pointer is already aligned, so we need + // to calculate how much we will put on the stack during this call. + "movl 12(%ebp), %eax \n" // paramSize + "addl $4, %eax \n" // counting esp that we will push on the stack + "movl %esp, %ecx \n" + "subl %eax, %ecx \n" + "andl $15, %ecx \n" + "movl %esp, %eax \n" + "subl %ecx, %esp \n" + "pushl %eax \n" // Store the original stack pointer + + "movl 12(%ebp), %ecx \n" // paramSize + "movl 8(%ebp), %eax \n" // args + "addl %ecx, %eax \n" // push arguments on the stack + "cmp $0, %ecx \n" + "je endcopy \n" + "copyloop: \n" + "subl $4, %eax \n" + "pushl (%eax) \n" + "subl $4, %ecx \n" + "jne copyloop \n" + "endcopy: \n" + "call *16(%ebp) \n" + "addl 12(%ebp), %esp \n" // pop arguments + + // Pop the alignment bytes + "popl %esp \n" + + "popl %ecx \n"); + +#endif +} + +void NOINLINE CallCDeclFunctionObjLast(const void *obj, const asDWORD *args, int paramSize, size_t func) +{ +#if defined ASM_INTEL + + // Copy the data to the real stack. If we fail to do + // this we may run into trouble in case of exceptions. + __asm + { + // We must save registers that are used + push ecx + + // Clear the FPU stack, in case the called function doesn't do it by itself + fninit + + // Push the object pointer as the last argument to the function + push obj + + // Copy arguments from script + // stack to application stack + mov ecx, paramSize + mov eax, args + add eax, ecx + cmp ecx, 0 + je endcopy +copyloop: + sub eax, 4 + push dword ptr [eax] + sub ecx, 4 + jne copyloop +endcopy: + + // Call function + call [func] + + // Pop arguments from stack + add esp, paramSize + add esp, 4 + + // Restore registers + pop ecx + + // return value in EAX or EAX:EDX + } + +#elif defined ASM_AT_N_T + + UNUSED_VAR(obj); + UNUSED_VAR(args); + UNUSED_VAR(paramSize); + UNUSED_VAR(func); + + asm("pushl %ecx \n" + "fninit \n" + + // Need to align the stack pointer so that it is aligned to 16 bytes when making the function call. + // It is assumed that when entering this function, the stack pointer is already aligned, so we need + // to calculate how much we will put on the stack during this call. + "movl 16(%ebp), %eax \n" // paramSize + "addl $8, %eax \n" // counting esp that we will push on the stack + "movl %esp, %ecx \n" + "subl %eax, %ecx \n" + "andl $15, %ecx \n" + "movl %esp, %eax \n" + "subl %ecx, %esp \n" + "pushl %eax \n" // Store the original stack pointer + + "pushl 8(%ebp) \n" + "movl 16(%ebp), %ecx \n" // paramSize + "movl 12(%ebp), %eax \n" // args + "addl %ecx, %eax \n" // push arguments on the stack + "cmp $0, %ecx \n" + "je endcopy8 \n" + "copyloop8: \n" + "subl $4, %eax \n" + "pushl (%eax) \n" + "subl $4, %ecx \n" + "jne copyloop8 \n" + "endcopy8: \n" + "call *20(%ebp) \n" + "addl 16(%ebp), %esp \n" // pop arguments + "addl $4, %esp \n" + + // Pop the alignment bytes + "popl %esp \n" + + "popl %ecx \n"); + +#endif +} + +void NOINLINE CallCDeclFunctionObjFirst(const void *obj, const asDWORD *args, int paramSize, size_t func) +{ +#if defined ASM_INTEL + + // Copy the data to the real stack. If we fail to do + // this we may run into trouble in case of exceptions. + __asm + { + // We must save registers that are used + push ecx + + // Clear the FPU stack, in case the called function doesn't do it by itself + fninit + + // Copy arguments from script + // stack to application stack + mov ecx, paramSize + mov eax, args + add eax, ecx + cmp ecx, 0 + je endcopy +copyloop: + sub eax, 4 + push dword ptr [eax] + sub ecx, 4 + jne copyloop +endcopy: + + // push object as first parameter + push obj + + // Call function + call [func] + + // Pop arguments from stack + add esp, paramSize + add esp, 4 + + // Restore registers + pop ecx + + // return value in EAX or EAX:EDX + } + +#elif defined ASM_AT_N_T + + UNUSED_VAR(obj); + UNUSED_VAR(args); + UNUSED_VAR(paramSize); + UNUSED_VAR(func); + + asm("pushl %ecx \n" + "fninit \n" + + // Need to align the stack pointer so that it is aligned to 16 bytes when making the function call. + // It is assumed that when entering this function, the stack pointer is already aligned, so we need + // to calculate how much we will put on the stack during this call. + "movl 16(%ebp), %eax \n" // paramSize + "addl $8, %eax \n" // counting esp that we will push on the stack + "movl %esp, %ecx \n" + "subl %eax, %ecx \n" + "andl $15, %ecx \n" + "movl %esp, %eax \n" + "subl %ecx, %esp \n" + "pushl %eax \n" // Store the original stack pointer + + "movl 16(%ebp), %ecx \n" // paramSize + "movl 12(%ebp), %eax \n" // args + "addl %ecx, %eax \n" // push arguments on the stack + "cmp $0, %ecx \n" + "je endcopy6 \n" + "copyloop6: \n" + "subl $4, %eax \n" + "pushl (%eax) \n" + "subl $4, %ecx \n" + "jne copyloop6 \n" + "endcopy6: \n" + "pushl 8(%ebp) \n" // push obj + "call *20(%ebp) \n" + "addl 16(%ebp), %esp \n" // pop arguments + "addl $4, %esp \n" + + // Pop the alignment bytes + "popl %esp \n" + + "popl %ecx \n"); + +#endif +} + +void NOINLINE CallCDeclFunctionRetByRefObjFirst_impl(const void *obj, const asDWORD *args, int paramSize, size_t func, void *retPtr) +{ +#if defined ASM_INTEL + + // Copy the data to the real stack. If we fail to do + // this we may run into trouble in case of exceptions. + __asm + { + // We must save registers that are used + push ecx + + // Clear the FPU stack, in case the called function doesn't do it by itself + fninit + + // Copy arguments from script + // stack to application stack + mov ecx, paramSize + mov eax, args + add eax, ecx + cmp ecx, 0 + je endcopy +copyloop: + sub eax, 4 + push dword ptr [eax] + sub ecx, 4 + jne copyloop +endcopy: + + // Push the object pointer + push obj + + // Push the return pointer + push retPtr; + + // Call function + call [func] + + // Pop arguments from stack + add esp, paramSize + +#ifndef CALLEE_POPS_HIDDEN_RETURN_POINTER + // Pop the return pointer + add esp, 8 +#else + add esp, 4 +#endif + // Restore registers + pop ecx + + // return value in EAX or EAX:EDX + } + +#elif defined ASM_AT_N_T + + UNUSED_VAR(obj); + UNUSED_VAR(args); + UNUSED_VAR(paramSize); + UNUSED_VAR(func); + UNUSED_VAR(retPtr); + + asm("pushl %ecx \n" + "fninit \n" + + // Need to align the stack pointer so that it is aligned to 16 bytes when making the function call. + // It is assumed that when entering this function, the stack pointer is already aligned, so we need + // to calculate how much we will put on the stack during this call. + "movl 16(%ebp), %eax \n" // paramSize + "addl $12, %eax \n" // counting esp that we will push on the stack + "movl %esp, %ecx \n" + "subl %eax, %ecx \n" + "andl $15, %ecx \n" + "movl %esp, %eax \n" + "subl %ecx, %esp \n" + "pushl %eax \n" // Store the original stack pointer + + "movl 16(%ebp), %ecx \n" // paramSize + "movl 12(%ebp), %eax \n" // args + "addl %ecx, %eax \n" // push arguments on the stack + "cmp $0, %ecx \n" + "je endcopy5 \n" + "copyloop5: \n" + "subl $4, %eax \n" + "pushl (%eax) \n" + "subl $4, %ecx \n" + "jne copyloop5 \n" + "endcopy5: \n" + "pushl 8(%ebp) \n" // push object first + "pushl 24(%ebp) \n" // retPtr + "call *20(%ebp) \n" // func + "addl 16(%ebp), %esp \n" // pop arguments +#ifndef CALLEE_POPS_HIDDEN_RETURN_POINTER + "addl $8, %esp \n" // Pop the return pointer and object pointer +#else + "addl $4, %esp \n" // Pop the object pointer +#endif + // Pop the alignment bytes + "popl %esp \n" + + "popl %ecx \n"); + +#endif +} + +void NOINLINE CallCDeclFunctionRetByRef_impl(const asDWORD *args, int paramSize, size_t func, void *retPtr) +{ +#if defined ASM_INTEL + + // Copy the data to the real stack. If we fail to do + // this we may run into trouble in case of exceptions. + __asm + { + // We must save registers that are used + push ecx + + // Clear the FPU stack, in case the called function doesn't do it by itself + fninit + + // Copy arguments from script + // stack to application stack + mov ecx, paramSize + mov eax, args + add eax, ecx + cmp ecx, 0 + je endcopy +copyloop: + sub eax, 4 + push dword ptr [eax] + sub ecx, 4 + jne copyloop +endcopy: + + // Push the return pointer + push retPtr; + + // Call function + call [func] + + // Pop arguments from stack + add esp, paramSize + +#ifndef CALLEE_POPS_HIDDEN_RETURN_POINTER + // Pop the return pointer + add esp, 4 +#endif + // Restore registers + pop ecx + + // return value in EAX or EAX:EDX + } + +#elif defined ASM_AT_N_T + + UNUSED_VAR(args); + UNUSED_VAR(paramSize); + UNUSED_VAR(func); + UNUSED_VAR(retPtr); + + asm("pushl %ecx \n" + "fninit \n" + + // Need to align the stack pointer so that it is aligned to 16 bytes when making the function call. + // It is assumed that when entering this function, the stack pointer is already aligned, so we need + // to calculate how much we will put on the stack during this call. + "movl 12(%ebp), %eax \n" // paramSize + "addl $8, %eax \n" // counting esp that we will push on the stack + "movl %esp, %ecx \n" + "subl %eax, %ecx \n" + "andl $15, %ecx \n" + "movl %esp, %eax \n" + "subl %ecx, %esp \n" + "pushl %eax \n" // Store the original stack pointer + + "movl 12(%ebp), %ecx \n" // paramSize + "movl 8(%ebp), %eax \n" // args + "addl %ecx, %eax \n" // push arguments on the stack + "cmp $0, %ecx \n" + "je endcopy7 \n" + "copyloop7: \n" + "subl $4, %eax \n" + "pushl (%eax) \n" + "subl $4, %ecx \n" + "jne copyloop7 \n" + "endcopy7: \n" + "pushl 20(%ebp) \n" // retPtr + "call *16(%ebp) \n" // func + "addl 12(%ebp), %esp \n" // pop arguments +#ifndef CALLEE_POPS_HIDDEN_RETURN_POINTER + "addl $4, %esp \n" // Pop the return pointer +#endif + // Pop the alignment bytes + "popl %esp \n" + + "popl %ecx \n"); + +#endif +} + +void NOINLINE CallCDeclFunctionRetByRefObjLast_impl(const void *obj, const asDWORD *args, int paramSize, size_t func, void *retPtr) +{ +#if defined ASM_INTEL + + // Copy the data to the real stack. If we fail to do + // this we may run into trouble in case of exceptions. + __asm + { + // We must save registers that are used + push ecx + + // Clear the FPU stack, in case the called function doesn't do it by itself + fninit + + push obj + + // Copy arguments from script + // stack to application stack + mov ecx, paramSize + mov eax, args + add eax, ecx + cmp ecx, 0 + je endcopy +copyloop: + sub eax, 4 + push dword ptr [eax] + sub ecx, 4 + jne copyloop +endcopy: + + // Push the return pointer + push retPtr; + + // Call function + call [func] + + // Pop arguments from stack + add esp, paramSize + add esp, 4 + +#ifndef CALLEE_POPS_HIDDEN_RETURN_POINTER + // Pop the return pointer + add esp, 4 +#endif + // Restore registers + pop ecx + + // return value in EAX or EAX:EDX + } + +#elif defined ASM_AT_N_T + + UNUSED_VAR(obj); + UNUSED_VAR(args); + UNUSED_VAR(paramSize); + UNUSED_VAR(func); + UNUSED_VAR(retPtr); + + asm("pushl %ecx \n" + "fninit \n" + + // Need to align the stack pointer so that it is aligned to 16 bytes when making the function call. + // It is assumed that when entering this function, the stack pointer is already aligned, so we need + // to calculate how much we will put on the stack during this call. + "movl 16(%ebp), %eax \n" // paramSize + "addl $12, %eax \n" // counting esp that we will push on the stack + "movl %esp, %ecx \n" + "subl %eax, %ecx \n" + "andl $15, %ecx \n" + "movl %esp, %eax \n" + "subl %ecx, %esp \n" + "pushl %eax \n" // Store the original stack pointer + + "pushl 8(%ebp) \n" + "movl 16(%ebp), %ecx \n" // paramSize + "movl 12(%ebp), %eax \n" // args + "addl %ecx, %eax \n" // push arguments on the stack + "cmp $0, %ecx \n" + "je endcopy4 \n" + "copyloop4: \n" + "subl $4, %eax \n" + "pushl (%eax) \n" + "subl $4, %ecx \n" + "jne copyloop4 \n" + "endcopy4: \n" + "pushl 24(%ebp) \n" // retPtr + "call *20(%ebp) \n" // func + "addl 16(%ebp), %esp \n" // pop arguments +#ifndef CALLEE_POPS_HIDDEN_RETURN_POINTER + "addl $8, %esp \n" // Pop the return pointer +#else + "addl $4, %esp \n" // Pop the return pointer +#endif + // Pop the alignment bytes + "popl %esp \n" + + "popl %ecx \n"); + +#endif +} + +void NOINLINE CallSTDCallFunction(const asDWORD *args, int paramSize, size_t func) +{ +#if defined ASM_INTEL + + // Copy the data to the real stack. If we fail to do + // this we may run into trouble in case of exceptions. + __asm + { + // We must save registers that are used + push ecx + + // Clear the FPU stack, in case the called function doesn't do it by itself + fninit + + // Copy arguments from script + // stack to application stack + mov ecx, paramSize + mov eax, args + add eax, ecx + cmp ecx, 0 + je endcopy +copyloop: + sub eax, 4 + push dword ptr [eax] + sub ecx, 4 + jne copyloop +endcopy: + + // Call function + call [func] + + // The callee already removed parameters from the stack + + // Restore registers + pop ecx + + // return value in EAX or EAX:EDX + } + +#elif defined ASM_AT_N_T + + UNUSED_VAR(args); + UNUSED_VAR(paramSize); + UNUSED_VAR(func); + + asm("pushl %ecx \n" + "fninit \n" + + // Need to align the stack pointer so that it is aligned to 16 bytes when making the function call. + // It is assumed that when entering this function, the stack pointer is already aligned, so we need + // to calculate how much we will put on the stack during this call. + "movl 12(%ebp), %eax \n" // paramSize + "addl $4, %eax \n" // counting esp that we will push on the stack + "movl %esp, %ecx \n" + "subl %eax, %ecx \n" + "andl $15, %ecx \n" + "movl %esp, %eax \n" + "subl %ecx, %esp \n" + "pushl %eax \n" // Store the original stack pointer + + "movl 12(%ebp), %ecx \n" // paramSize + "movl 8(%ebp), %eax \n" // args + "addl %ecx, %eax \n" // push arguments on the stack + "cmp $0, %ecx \n" + "je endcopy2 \n" + "copyloop2: \n" + "subl $4, %eax \n" + "pushl (%eax) \n" + "subl $4, %ecx \n" + "jne copyloop2 \n" + "endcopy2: \n" + "call *16(%ebp) \n" // callee pops the arguments + + // Pop the alignment bytes + "popl %esp \n" + + "popl %ecx \n"); + +#endif +} + + +void NOINLINE CallThisCallFunction(const void *obj, const asDWORD *args, int paramSize, size_t func) +{ +#if defined ASM_INTEL + + // Copy the data to the real stack. If we fail to do + // this we may run into trouble in case of exceptions. + __asm + { + // We must save registers that are used + push ecx + + // Clear the FPU stack, in case the called function doesn't do it by itself + fninit + + // Copy arguments from script + // stack to application stack + mov ecx, paramSize + mov eax, args + add eax, ecx + cmp ecx, 0 + je endcopy +copyloop: + sub eax, 4 + push dword ptr [eax] + sub ecx, 4 + jne copyloop +endcopy: + +#ifdef THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK + // Push the object pointer on the stack + push obj +#else + // Move object pointer to ECX + mov ecx, obj +#endif + + // Call function + call [func] + +#ifndef THISCALL_CALLEE_POPS_ARGUMENTS + // Pop arguments + add esp, paramSize +#ifdef THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK + // Pop object pointer + add esp, 4 +#endif +#endif + + // Restore registers + pop ecx + + // Return value in EAX or EAX:EDX + } + +#elif defined ASM_AT_N_T + + UNUSED_VAR(obj); + UNUSED_VAR(args); + UNUSED_VAR(paramSize); + UNUSED_VAR(func); + + asm("pushl %ecx \n" + "fninit \n" + + // Need to align the stack pointer so that it is aligned to 16 bytes when making the function call. + // It is assumed that when entering this function, the stack pointer is already aligned, so we need + // to calculate how much we will put on the stack during this call. + "movl 16(%ebp), %eax \n" // paramSize + "addl $8, %eax \n" // counting esp that we will push on the stack + "movl %esp, %ecx \n" + "subl %eax, %ecx \n" + "andl $15, %ecx \n" + "movl %esp, %eax \n" + "subl %ecx, %esp \n" + "pushl %eax \n" // Store the original stack pointer + + "movl 16(%ebp), %ecx \n" // paramSize + "movl 12(%ebp), %eax \n" // args + "addl %ecx, %eax \n" // push all arguments on the stack + "cmp $0, %ecx \n" + "je endcopy1 \n" + "copyloop1: \n" + "subl $4, %eax \n" + "pushl (%eax) \n" + "subl $4, %ecx \n" + "jne copyloop1 \n" + "endcopy1: \n" + "movl 8(%ebp), %ecx \n" // move obj into ECX + "pushl 8(%ebp) \n" // push obj on the stack + "call *20(%ebp) \n" + "addl 16(%ebp), %esp \n" // pop arguments + "addl $4, %esp \n" // pop obj + + // Pop the alignment bytes + "popl %esp \n" + + "popl %ecx \n"); + +#endif +} + +void NOINLINE CallThisCallFunctionRetByRef_impl(const void *obj, const asDWORD *args, int paramSize, size_t func, void *retPtr) +{ +#if defined ASM_INTEL + + // Copy the data to the real stack. If we fail to do + // this we may run into trouble in case of exceptions. + __asm + { + // We must save registers that are used + push ecx + + // Clear the FPU stack, in case the called function doesn't do it by itself + fninit + + // Copy arguments from script + // stack to application stack + mov ecx, paramSize + mov eax, args + add eax, ecx + cmp ecx, 0 + je endcopy +copyloop: + sub eax, 4 + push dword ptr [eax] + sub ecx, 4 + jne copyloop +endcopy: + +#ifdef THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK + // Push the object pointer on the stack + push obj +#else + // Move object pointer to ECX + mov ecx, obj +#endif + + // Push the return pointer + push retPtr + + // Call function + call [func] + +#ifndef THISCALL_CALLEE_POPS_ARGUMENTS + // Pop arguments + add esp, paramSize +#ifdef THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK + // Pop object pointer + add esp, 4 +#endif +#endif + + // Restore registers + pop ecx + + // Return value in EAX or EAX:EDX + } + +#elif defined ASM_AT_N_T + + UNUSED_VAR(obj); + UNUSED_VAR(args); + UNUSED_VAR(paramSize); + UNUSED_VAR(func); + UNUSED_VAR(retPtr); + + asm("pushl %ecx \n" + "fninit \n" + + // Need to align the stack pointer so that it is aligned to 16 bytes when making the function call. + // It is assumed that when entering this function, the stack pointer is already aligned, so we need + // to calculate how much we will put on the stack during this call. + "movl 16(%ebp), %eax \n" // paramSize + "addl $12, %eax \n" // counting esp that we will push on the stack + "movl %esp, %ecx \n" + "subl %eax, %ecx \n" + "andl $15, %ecx \n" + "movl %esp, %eax \n" + "subl %ecx, %esp \n" + "pushl %eax \n" // Store the original stack pointer + + "movl 16(%ebp), %ecx \n" // paramSize + "movl 12(%ebp), %eax \n" // args + "addl %ecx, %eax \n" // push all arguments to the stack + "cmp $0, %ecx \n" + "je endcopy3 \n" + "copyloop3: \n" + "subl $4, %eax \n" + "pushl (%eax) \n" + "subl $4, %ecx \n" + "jne copyloop3 \n" + "endcopy3: \n" + "movl 8(%ebp), %ecx \n" // move obj into ECX + "pushl 8(%ebp) \n" // push obj on the stack + "pushl 24(%ebp) \n" // push retPtr on the stack + "call *20(%ebp) \n" + "addl 16(%ebp), %esp \n" // pop arguments + "addl $4, %esp \n" // pop the object pointer + // the return pointer was popped by the callee + // Pop the alignment bytes + "popl %esp \n" + + "popl %ecx \n"); + +#endif +} + +asDWORD GetReturnedFloat() +{ + asDWORD f; + +#if defined ASM_INTEL + + // Get the float value from ST0 + __asm fstp dword ptr [f] + +#elif defined ASM_AT_N_T + + asm("fstps %0 \n" : "=m" (f)); + +#endif + + return f; +} + +asQWORD GetReturnedDouble() +{ + asQWORD d; + +#if defined ASM_INTEL + + // Get the double value from ST0 + __asm fstp qword ptr [d] + +#elif defined ASM_AT_N_T + + asm("fstpl %0 \n" : "=m" (d)); + +#endif + + return d; +} + +END_AS_NAMESPACE + +#endif // AS_X86 +#endif // AS_MAX_PORTABILITY + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_xenon.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_xenon.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_xenon.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_callfunc_xenon.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,826 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_callfunc_xenon.cpp +// +// These functions handle the actual calling of system functions +// +// This version is Xenon specific +// Modified from as_callfunc_ppc.cpp by Laszlo Perneky Februar 2007 + +#include "as_config.h" + +#ifndef AS_MAX_PORTABILITY +#ifdef AS_XENON + +#include "as_callfunc.h" +#include "as_scriptengine.h" +#include "as_texts.h" +#include "as_tokendef.h" + +#include +#include + +BEGIN_AS_NAMESPACE + +#define AS_PPC_MAX_ARGS 32 +#define AS_MAX_REG_FLOATS 13 +#define AS_MAX_REG_INTS 8 +#define AS_PPC_THISCALL_REG 1 +#define AS_PPC_RETURNINMEM_REG 1 +#define AS_PPC_ENDOFARGS 1 + +// The array used to send values to the correct places. +// Contains a byte of argTypes to indicate the register type to load, or zero if end of arguments + +extern "C" { + enum argTypes + { + ppcENDARG = 0, + ppcINTARG, + ppcFLOATARG, + ppcDOUBLEARG + }; + static asBYTE ppcArgsType[AS_PPC_MAX_ARGS + AS_PPC_RETURNINMEM_REG + AS_PPC_THISCALL_REG + AS_PPC_ENDOFARGS]; + static asDWORD ppcArgs[AS_PPC_MAX_ARGS + AS_PPC_RETURNINMEM_REG + AS_PPC_THISCALL_REG]; +} + +// Loads all data into the correct places and calls the function. +// ppcArgsType is an array containing a byte type (enum argTypes) for each argument. +// iStackArgSize is the size in bytes for how much data to put on the stack frame +//-------------------------------------------------------------------- +asQWORD __declspec( naked ) ppcFunc(const asDWORD* pArgs, int iStackArgSize, asDWORD dwFunc) +{ + __asm + { +////////////////////////////////////////////////////////////////////////// +// Prepare args +////////////////////////////////////////////////////////////////////////// +_ppcFunc: + // setup stack + // Read link register + mflr r12 + // Stack the link register + stw r12, -8(r1) + // Move stack pointer + stwu r1, -70h(r1) + + mr r29, r3 //pArgs + mr r30, r4 //iStackArgSize + mr r27, r5 //dwFunc + + // Clear some registers + sub r0, r0, r0 + // Counting of used/assigned GPR's + mr r23, r0 + // Counting of used/assigned Float Registers + mr r22, r0 + + // Fetch argument types array address + lau r25, ppcArgsType + lal r25, r25, ppcArgsType + + // Fetch arguments array address + lau r26, ppcArgs + lal r26, r26, ppcArgs + + // Begin loading and stacking registers + subi r25, r25, 1 + +////////////////////////////////////////////////////////////////////////// +// Fetch the next argument +////////////////////////////////////////////////////////////////////////// +ppcNextArg: + // Increment rArgTypePtr + addi r25, r25, 1 + // Get data type + lbz r24, 0(r25) + + // r24 holds the data type + cmplwi cr6, r24, 0 + beq cr6, ppcArgsEnd + cmplwi cr6, r24, 1 + beq cr6, ppcArgIsInteger + cmplwi cr6, r24, 2 + beq cr6, ppcArgIsFloat + cmplwi cr6, r24, 3 + beq cr6, ppcArgIsDouble + +////////////////////////////////////////////////////////////////////////// +// Load and stack integer arguments +////////////////////////////////////////////////////////////////////////// +ppcArgIsInteger: + // Get the arg from the stack + lwz r11, 0(r26) + + // r23 holds the integer arg count so far + cmplwi cr6, r23, 0 + beq cr6, ppcLoadIntReg0 + cmplwi cr6, r23, 1 + beq cr6, ppcLoadIntReg1 + cmplwi cr6, r23, 2 + beq cr6, ppcLoadIntReg2 + cmplwi cr6, r23, 3 + beq cr6, ppcLoadIntReg3 + cmplwi cr6, r23, 4 + beq cr6, ppcLoadIntReg4 + cmplwi cr6, r23, 5 + beq cr6, ppcLoadIntReg5 + cmplwi cr6, r23, 6 + beq cr6, ppcLoadIntReg6 + cmplwi cr6, r23, 7 + beq cr6, ppcLoadIntReg7 + + // no more than 8 parameters + b ppcLoadIntRegUpd + + ppcLoadIntReg0: + mr r3, r11 + b ppcLoadIntRegUpd + ppcLoadIntReg1: + mr r4, r11 + b ppcLoadIntRegUpd + ppcLoadIntReg2: + mr r5, r11 + b ppcLoadIntRegUpd + ppcLoadIntReg3: + mr r6, r11 + b ppcLoadIntRegUpd + ppcLoadIntReg4: + mr r7, r11 + b ppcLoadIntRegUpd + ppcLoadIntReg5: + mr r8, r11 + b ppcLoadIntRegUpd + ppcLoadIntReg6: + mr r9, r11 + b ppcLoadIntRegUpd + ppcLoadIntReg7: + mr r10, r11 + b ppcLoadIntRegUpd + + ppcLoadIntRegUpd: + // Increment used int register count + addi r23, r23, 1 + // Increment rArgsPtr + addi r29, r29, 4 + // Increment rStackPtr + addi r26, r26, 4 + b ppcNextArg + +////////////////////////////////////////////////////////////////////////// +// Load and stack float arguments +////////////////////////////////////////////////////////////////////////// +ppcArgIsFloat: + // Get the arg from the stack + lfs fr15, 0(r26) + + // r22 holds the float arg count so far + cmplwi cr6, r23, 0 + beq cr6, ppcLoadFloatReg0 + cmplwi cr6, r23, 1 + beq cr6, ppcLoadFloatReg1 + cmplwi cr6, r23, 2 + beq cr6, ppcLoadFloatReg2 + cmplwi cr6, r23, 3 + beq cr6, ppcLoadFloatReg3 + cmplwi cr6, r23, 4 + beq cr6, ppcLoadFloatReg4 + cmplwi cr6, r23, 5 + beq cr6, ppcLoadFloatReg5 + cmplwi cr6, r23, 6 + beq cr6, ppcLoadFloatReg6 + cmplwi cr6, r23, 7 + beq cr6, ppcLoadFloatReg7 + cmplwi cr6, r23, 8 + beq cr6, ppcLoadFloatReg8 + cmplwi cr6, r23, 9 + beq cr6, ppcLoadFloatReg9 + cmplwi cr6, r23, 10 + beq cr6, ppcLoadFloatReg10 + cmplwi cr6, r23, 11 + beq cr6, ppcLoadFloatReg11 + cmplwi cr6, r23, 12 + beq cr6, ppcLoadFloatReg12 + cmplwi cr6, r23, 13 + beq cr6, ppcLoadFloatReg13 + cmplwi cr6, r23, 14 + beq cr6, ppcLoadFloatReg14 + + // no more than 14 parameters + b ppcLoadFloatRegUpd + + ppcLoadFloatReg0: + fmr fr0, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg1: + fmr fr1, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg2: + fmr fr2, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg3: + fmr fr3, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg4: + fmr fr4, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg5: + fmr fr5, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg6: + fmr fr6, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg7: + fmr fr7, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg8: + fmr fr8, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg9: + fmr fr9, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg10: + fmr fr10, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg11: + fmr fr11, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg12: + fmr fr12, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg13: + fmr fr13, fr15 + b ppcLoadFloatRegUpd + ppcLoadFloatReg14: + fmr fr14, fr15 + b ppcLoadFloatRegUpd + + ppcLoadFloatRegUpd: + // Increment used float register count + addi r22, r22, 1 + // Increment used int register count - a float reg eats up a GPR + addi r23, r23, 1 + // Increment rArgsPtr + addi r29, r29, 4 + // Increment rStackPtr + addi r26, r26, 4 + b ppcNextArg + +////////////////////////////////////////////////////////////////////////// +// Load and stack double float arguments +////////////////////////////////////////////////////////////////////////// +ppcArgIsDouble: + // Get the arg from the stack + lfs fr15, 0(r26) + + // r22 holds the float arg count so far + cmplwi cr6, r23, 0 + beq cr6, ppcLoadDoubleReg0 + cmplwi cr6, r23, 1 + beq cr6, ppcLoadDoubleReg1 + cmplwi cr6, r23, 2 + beq cr6, ppcLoadDoubleReg2 + cmplwi cr6, r23, 3 + beq cr6, ppcLoadDoubleReg3 + cmplwi cr6, r23, 4 + beq cr6, ppcLoadDoubleReg4 + cmplwi cr6, r23, 5 + beq cr6, ppcLoadDoubleReg5 + cmplwi cr6, r23, 6 + beq cr6, ppcLoadDoubleReg6 + cmplwi cr6, r23, 7 + beq cr6, ppcLoadDoubleReg7 + cmplwi cr6, r23, 8 + beq cr6, ppcLoadDoubleReg8 + cmplwi cr6, r23, 9 + beq cr6, ppcLoadDoubleReg9 + cmplwi cr6, r23, 10 + beq cr6, ppcLoadDoubleReg10 + cmplwi cr6, r23, 11 + beq cr6, ppcLoadDoubleReg11 + cmplwi cr6, r23, 12 + beq cr6, ppcLoadDoubleReg12 + cmplwi cr6, r23, 13 + beq cr6, ppcLoadDoubleReg13 + cmplwi cr6, r23, 14 + beq cr6, ppcLoadDoubleReg14 + + ppcLoadDoubleReg0: + fmr fr0, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg1: + fmr fr1, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg2: + fmr fr2, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg3: + fmr fr3, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg4: + fmr fr4, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg5: + fmr fr5, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg6: + fmr fr6, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg7: + fmr fr7, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg8: + fmr fr8, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg9: + fmr fr9, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg10: + fmr fr10, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg11: + fmr fr11, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg12: + fmr fr12, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg13: + fmr fr13, fr15 + b ppcLoadDoubleRegUpd + ppcLoadDoubleReg14: + fmr fr14, fr15 + b ppcLoadDoubleRegUpd + + ppcLoadDoubleRegUpd: + // Increment used float register count + addi r22, r22, 1 + // Increment used int register count + addi r23, r23, 1 + // Increment rArgsPtr + addi r29, r29, 4 + // Increment rStackPtr + addi r26, r26, 4 + b ppcNextArg + +////////////////////////////////////////////////////////////////////////// +// Finished +////////////////////////////////////////////////////////////////////////// +ppcArgsEnd: + // Call the function + mtctr r27 + bctrl + + // Function returned + + // Restore callers stack + addi r1, r1, 70h + // Fetch return link to caller + lwz r12, -8(r1) + mtlr r12 + + blr + } +} + +// Puts the arguments in the correct place in the stack array. +//------------------------------------------------------------------- +void stackArgs(const asDWORD *pArgs, int& iNumIntArgs, int& iNumFloatArgs, int& iNumDoubleArgs) +{ + int iArgWordPos = iNumIntArgs + iNumFloatArgs + iNumDoubleArgs; + + for(int iArg = 0; iArg < AS_PPC_MAX_ARGS; iArg++) + { + if ( ppcArgsType[iArg] == ppcENDARG ) + break; + + if( ppcArgsType[iArg] == ppcFLOATARG ) + { + // stow float + ((float*)ppcArgs)[iArgWordPos] = ((float*)(pArgs))[iArg]; + iNumFloatArgs++; + iArgWordPos++; //add one word + } + if ( ppcArgsType[iArg] == ppcDOUBLEARG ) + { + // stow double + ((double*)ppcArgs)[iArgWordPos] = ((double*)(pArgs))[iArg]; + iNumDoubleArgs++; + iArgWordPos++; //add two words + } + + if( ppcArgsType[iArg] == ppcINTARG ) + { + // stow register + ((int*)ppcArgs)[iArgWordPos] = ((int*)(pArgs))[iArg]; + iNumIntArgs++; + iArgWordPos++; + } + } +} + +// Prepare the arg list for a CDecl funtion and then call it +//-------------------------------------------------------------------- +asQWORD CallCDeclFunction(const asDWORD* pArgs, int iArgSize, asDWORD dwFunc) +{ + int iIntArgs = 0; + int iFloatArgs = 0; + int iDoubleArgs = 0; + + // Put the arguments in the correct places in the ppcArgs array + if ( iArgSize > 0 ) + stackArgs( pArgs, iIntArgs, iFloatArgs, iDoubleArgs ); + + return ppcFunc( ppcArgs, iArgSize, dwFunc); +} + +// This function is identical to CallCDeclFunction, with the only difference that +// the value in the first parameter is the object +//-------------------------------------------------------------------- +asQWORD CallThisCallFunction(const void* pObj, const asDWORD* pArgs, int iArgSize, asDWORD dwFunc ) +{ + int iIntArgs = 0; + int iFloatArgs = 0; + int iDoubleArgs = 0; + + // Put the arguments in the correct places in the ppcArgs array /the this ptr is already in pArgs/ + if ( iArgSize > 0 ) + stackArgs( pArgs, iIntArgs, iFloatArgs, iDoubleArgs ); + + return ppcFunc( ppcArgs, iArgSize, dwFunc); +} + +// This function is identical to CallCDeclFunction, with the only difference that +// the value in the last parameter is the object +//-------------------------------------------------------------------- +asQWORD CallThisCallFunction_objLast(const void* pObj, const asDWORD* pArgs, int iArgSize, asDWORD dwFunc) +{ + int iIntArgs = 0; + int iFloatArgs = 0; + int iDoubleArgs = 0; + + // Put the arguments in the correct places in the ppcArgs array /the this ptr is already in pArgs/ + if ( iArgSize > 0 ) + stackArgs( pArgs, iIntArgs, iFloatArgs, iDoubleArgs ); + + int iNumArgs = iIntArgs + iFloatArgs + iDoubleArgs; + if ( iNumArgs < AS_PPC_MAX_ARGS ) + { + ppcArgs[iNumArgs] = (asDWORD)pObj; + ppcArgsType[iNumArgs] = ppcINTARG; + } + + return ppcFunc( ppcArgs, iArgSize + sizeof(pObj), dwFunc ); +} + +//-------------------------------------------------------------------- +asDWORD GetReturnedFloat() +{ + asDWORD f; + + __asm + { + stfs fr0, f + } + + return f; +} + + +asQWORD GetReturnedDouble() +//-------------------------------------------------------------------- +{ + asQWORD f; + + __asm + { + stfd fr0, f + } + + return f; +} + +int CallSystemFunction(int iId, asCContext* pContext, void* pObjectPointer) +//-------------------------------------------------------------------- +{ + memset( ppcArgsType, 0, sizeof(ppcArgsType)); + + asCScriptEngine* pEngine = pContext->engine; + asCScriptFunction* pDescr = pEngine->scriptFunctions[iId]; + asSSystemFunctionInterface* pSysFunc = pDescr->sysFuncIntf; + + int iCallConv = pSysFunc->callConv; + if ( iCallConv == ICC_GENERIC_FUNC + || iCallConv == ICC_GENERIC_METHOD ) + return pContext->CallGeneric( iId, pObjectPointer ); + + asQWORD dwRetQW = 0; + + void* pFunc = (void*)pSysFunc->func; + int iParamSize = pSysFunc->paramSize; + asDWORD* pArgs = pContext->regs.stackPointer; + void* pRetPointer = 0; + void* pObj = 0; + int iPopSize = iParamSize; + asDWORD* pVftable; + + // We generate the parameter list to this, so it fits to teh callingconvention + asDWORD fixedArgs[ AS_PPC_MAX_ARGS + AS_PPC_RETURNINMEM_REG + AS_PPC_THISCALL_REG ]; + memset(fixedArgs, 0, sizeof(fixedArgs)); + int iArgsPtr = 0; + + pContext->regs.objectType = pDescr->returnType.GetObjectType(); + + // If the function returns an object in memory, we allocate the memory and put the ptr to the front (will go to r3) + if ( pDescr->returnType.IsObject() && !pDescr->returnType.IsReference() && !pDescr->returnType.IsObjectHandle() ) + { + pRetPointer = pEngine->CallAlloc(pDescr->returnType.GetObjectType()); + + if( pSysFunc->hostReturnInMemory ) + iCallConv++; + + fixedArgs [ iArgsPtr ] = (asDWORD)pRetPointer; + ppcArgsType[ iArgsPtr ] = ppcINTARG; + iArgsPtr++; + } + + // Find out if we have an object + if ( iCallConv >= ICC_THISCALL ) + { + if ( pObjectPointer ) + { + pObj = pObjectPointer; + } + else + { + // The object pointer should be popped from the context stack + iPopSize++; + + pObj = (void*)*(pArgs); + pArgs++; + + // Check for null pointer + if ( pObj == 0 ) + { + pContext->SetInternalException(TXT_NULL_POINTER_ACCESS); + if( pRetPointer ) + pEngine->CallFree(pRetPointer); + return 0; + } + + // Add the base offset for multiple inheritance + pObj = (void*)(int(pObj) + pSysFunc->baseOffset); + } + } + + // If we have an object and it's not objectlast, then we put it az the first arg + if ( pObj + && iCallConv != ICC_CDECL_OBJLAST + && iCallConv != ICC_CDECL_OBJLAST_RETURNINMEM ) + { + fixedArgs [ iArgsPtr ] = (asDWORD)pObj; + ppcArgsType[ iArgsPtr ] = ppcINTARG; + iArgsPtr++; + } + + asASSERT(pDescr->parameterTypes.GetLength() <= AS_PPC_MAX_ARGS); + + // Parameter calculation magic + asDWORD paramBuffer[64]; + if ( pSysFunc->takesObjByVal ) + { + iParamSize = 0; + int iSpos = 0; + int iDpos = 1; + + for ( asUINT uParam = 0; uParam < pDescr->parameterTypes.GetLength(); uParam++ ) + { + // Parameter object by value + if ( pDescr->parameterTypes[uParam].IsObject() + && !pDescr->parameterTypes[uParam].IsObjectHandle() + && !pDescr->parameterTypes[uParam].IsReference() ) + { +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( pDescr->parameterTypes[uParam].GetObjectType()->flags & COMPLEX_MASK ) + { + paramBuffer[dpos++] = args[spos++]; + paramSize++; + } + else +#endif + { + // Copy the object's memory to the buffer + memcpy( ¶mBuffer[iDpos], *(void**)(pArgs + iSpos), pDescr->parameterTypes[uParam].GetSizeInMemoryBytes() ); + // Delete the original memory + pEngine->CallFree(*(char**)(pArgs + iSpos) ); + pArgs[uParam] = (asDWORD)¶mBuffer[iDpos]; + iSpos++; + iDpos += pDescr->parameterTypes[uParam].GetSizeInMemoryDWords(); + iParamSize += pDescr->parameterTypes[uParam].GetSizeInMemoryDWords(); + } + } + else + { + // Copy the value directly + paramBuffer[iDpos++] = pArgs[iSpos++]; + if( pDescr->parameterTypes[uParam].GetSizeOnStackDWords() > 1 ) + paramBuffer[iDpos++] = pArgs[iSpos++]; + iParamSize += pDescr->parameterTypes[uParam].GetSizeOnStackDWords(); + } + } + } + + // Copy the parameter types for the ppcFunc. Also copy the params for the fixed xenon args buffer /containing this and return ptr/ + for( int iParam = 0; iParam < (int)pDescr->parameterTypes.GetLength(); iParam++, iArgsPtr++ ) + { + ppcArgsType[iArgsPtr] = ppcINTARG; + if (pDescr->parameterTypes[iParam].IsFloatType()) + ppcArgsType[iArgsPtr] = ppcFLOATARG; + else if (pDescr->parameterTypes[iParam].IsDoubleType()) + ppcArgsType[iArgsPtr] = ppcDOUBLEARG; + + fixedArgs[iArgsPtr] = pArgs[iParam]; + + // If the arg is bool, then endian swap it /it would not neccessary if the AS_BIG_ENDIAN would swap the bool from 0x01000000 to 0x00000010/ + if ( pDescr->parameterTypes[iParam].GetTokenType() == ttBool ) + ((asBYTE*)(&fixedArgs[iArgsPtr]))[3] = ((asBYTE*)(&fixedArgs[iArgsPtr]))[0]; + } + + + pContext->isCallingSystemFunction = true; + switch ( iCallConv ) + { + case ICC_CDECL: + case ICC_CDECL_RETURNINMEM: + case ICC_STDCALL: + case ICC_STDCALL_RETURNINMEM: + dwRetQW = CallCDeclFunction( fixedArgs, iArgsPtr, (asDWORD)pFunc ); + break; + case ICC_THISCALL: + case ICC_THISCALL_RETURNINMEM: + dwRetQW = CallThisCallFunction( pObj, fixedArgs, iArgsPtr, (asDWORD)pFunc ); + break; + case ICC_VIRTUAL_THISCALL: + case ICC_VIRTUAL_THISCALL_RETURNINMEM: + // Get virtual function table from the object pointer + pVftable = *(asDWORD**)pObj; + dwRetQW = CallThisCallFunction( pObj, fixedArgs, iArgsPtr, pVftable[asDWORD(pFunc)>>2] ); + break; + case ICC_CDECL_OBJLAST: + case ICC_CDECL_OBJLAST_RETURNINMEM: + dwRetQW = CallThisCallFunction_objLast( pObj, fixedArgs, iArgsPtr, (asDWORD)pFunc ); + break; + case ICC_CDECL_OBJFIRST: + case ICC_CDECL_OBJFIRST_RETURNINMEM: + dwRetQW = CallThisCallFunction( pObj, fixedArgs, iArgsPtr, (asDWORD)pFunc ); + break; + default: + pContext->SetInternalException( TXT_INVALID_CALLING_CONVENTION ); + } + pContext->isCallingSystemFunction = false; + +#ifdef COMPLEX_OBJS_PASSED_BY_REF + if( pSysFunc->takesObjByVal ) + { + // Need to free the complex objects passed by value + pArgs = pContext->regs.stackPointer; + if ( iCallConv >= ICC_THISCALL + && !pObjectPointer ) + pArgs++; + + int iSpos = 0; + for( int iParam = 0; iParam < (int)descr->parameterTypes.GetLength(); iParam++ ) + { + if ( pDescr->parameterTypes[iParam].IsObject() + && !pDescr->parameterTypes[iParam].IsReference() + && (pDescr->parameterTypes[iParam].GetObjectType()->flags & COMPLEX_MASK) ) + { + void *pObj = (void*)pArgs[iSpos++]; + asSTypeBehaviour *pBeh = &pDescr->parameterTypes[iParam].GetObjectType()->beh; + if( pBeh->destruct ) + pEngine->CallObjectMethod(pObj, pBeh->destruct); + + pEngine->CallFree(pObj); + } + else + iSpos += pDescr->parameterTypes[iParam].GetSizeInMemoryDWords(); + } + } +#endif + + // Store the returned value in our stack + if ( pDescr->returnType.IsObject() + && !pDescr->returnType.IsReference() ) + { + if ( pDescr->returnType.IsObjectHandle() ) + { + pContext->regs.objectRegister = (void*)(asDWORD)dwRetQW; + + if ( pSysFunc->returnAutoHandle + && pContext->regs.objectRegister ) + pEngine->CallObjectMethod( pContext->regs.objectRegister, pDescr->returnType.GetObjectType()->beh.addref ); + } + else + { + if ( !pSysFunc->hostReturnInMemory ) + { + // Copy the returned value to the pointer sent by the script engine + if ( pSysFunc->hostReturnSize == 1 ) + *(asDWORD*)pRetPointer = (asDWORD)dwRetQW; + else + *(asQWORD*)pRetPointer = dwRetQW; + } + + // Store the object in the register + pContext->regs.objectRegister = pRetPointer; + } + } + else + { + // If the retval is bool, then endian swap it /it would not neccessary if the AS_BIG_ENDIAN would swap the bool from 0x01000000 to 0x00000010/ + if ( pDescr->returnType.GetTokenType() == ttBool ) + { + ((asBYTE*)(&dwRetQW))[4] = ((asBYTE*)(&dwRetQW))[7]; + ((asBYTE*)(&dwRetQW))[7] = 0; + } + + // Store value in returnVal register + if ( pSysFunc->hostReturnFloat ) + { + if ( pSysFunc->hostReturnSize == 1 ) + *(asDWORD*)&pContext->regs.valueRegister = GetReturnedFloat(); + else + pContext->regs.valueRegister = GetReturnedDouble(); + } + else if ( pSysFunc->hostReturnSize == 1 ) + *(asDWORD*)&pContext->regs.valueRegister = (asDWORD)dwRetQW; + else + pContext->regs.valueRegister = dwRetQW; + } + + if( pSysFunc->hasAutoHandles ) + { + pArgs = pContext->regs.stackPointer; + if ( iCallConv >= ICC_THISCALL + && !pObjectPointer ) + pArgs++; + + int iSpos = 0; + for ( asUINT uParam = 0; uParam < pDescr->parameterTypes.GetLength(); uParam++ ) + { + if ( pSysFunc->paramAutoHandles[uParam] + && pArgs[iSpos] ) + { + // Call the release method on the type + pEngine->CallObjectMethod( (void*)pArgs[iSpos], pDescr->parameterTypes[uParam].GetObjectType()->beh.release ); + pArgs[iSpos] = 0; + } + + if ( pDescr->parameterTypes[uParam].IsObject() + && !pDescr->parameterTypes[uParam].IsObjectHandle() + && !pDescr->parameterTypes[uParam].IsReference() ) + iSpos++; + else + iSpos += pDescr->parameterTypes[uParam].GetSizeOnStackDWords(); + } + } + + return iPopSize; +} + +END_AS_NAMESPACE + +#endif // AS_XENON +#endif // AS_MAX_PORTABILITY + +//------------------------------------------------------------------ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_compiler.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_compiler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_compiler.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_compiler.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,9536 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_compiler.cpp +// +// The class that does the actual compilation of the functions +// + +#include // fmodf() + +#include "as_config.h" +#include "as_compiler.h" +#include "as_tokendef.h" +#include "as_tokenizer.h" +#include "as_string_util.h" +#include "as_texts.h" +#include "as_parser.h" + +BEGIN_AS_NAMESPACE + +asCCompiler::asCCompiler(asCScriptEngine *engine) : byteCode(engine) +{ + builder = 0; + script = 0; + + variables = 0; + isProcessingDeferredParams = false; + noCodeOutput = 0; +} + +asCCompiler::~asCCompiler() +{ + while( variables ) + { + asCVariableScope *var = variables; + variables = variables->parent; + + asDELETE(var,asCVariableScope); + } +} + +void asCCompiler::Reset(asCBuilder *builder, asCScriptCode *script, asCScriptFunction *outFunc) +{ + this->builder = builder; + this->engine = builder->engine; + this->script = script; + this->outFunc = outFunc; + + hasCompileErrors = false; + + m_isConstructor = false; + m_isConstructorCalled = false; + + nextLabel = 0; + breakLabels.SetLength(0); + continueLabels.SetLength(0); + + byteCode.ClearAll(); + objVariableTypes.SetLength(0); + objVariablePos.SetLength(0); + + globalExpression = false; +} + +int asCCompiler::CompileDefaultConstructor(asCBuilder *builder, asCScriptCode *script, asCScriptFunction *outFunc) +{ + Reset(builder, script, outFunc); + + // If the class is derived from another, then the base class' default constructor must be called + if( outFunc->objectType->derivedFrom ) + { + // Call the base class' default constructor + byteCode.InstrSHORT(asBC_PSF, 0); + byteCode.Instr(asBC_RDSPTR); + byteCode.Call(asBC_CALL, outFunc->objectType->derivedFrom->beh.construct, AS_PTR_SIZE); + } + + // Pop the object pointer from the stack + byteCode.Ret(AS_PTR_SIZE); + + byteCode.Finalize(); + + // Copy byte code to the function + outFunc->byteCode.SetLength(byteCode.GetSize()); + byteCode.Output(outFunc->byteCode.AddressOf()); + outFunc->AddReferences(); + outFunc->stackNeeded = byteCode.largestStackUsed; + outFunc->lineNumbers = byteCode.lineNumbers; + outFunc->objVariablePos = objVariablePos; + outFunc->objVariableTypes = objVariableTypes; + +#ifdef AS_DEBUG + // DEBUG: output byte code + byteCode.DebugOutput(("__" + outFunc->objectType->name + "_" + outFunc->name + "__dc.txt").AddressOf(), engine); +#endif + + return 0; +} + +int asCCompiler::CompileFactory(asCBuilder *builder, asCScriptCode *script, asCScriptFunction *outFunc) +{ + Reset(builder, script, outFunc); + + unsigned int n; + + // Find the corresponding constructor + asCDataType dt = asCDataType::CreateObject(outFunc->returnType.GetObjectType(), false); + int constructor = 0; + for( n = 0; n < dt.GetBehaviour()->factories.GetLength(); n++ ) + { + if( dt.GetBehaviour()->factories[n] == outFunc->id ) + { + constructor = dt.GetBehaviour()->constructors[n]; + break; + } + } + + // Allocate the class and instanciate it with the constructor + int varOffset = AllocateVariable(dt, true); + + byteCode.Push(AS_PTR_SIZE); + byteCode.InstrSHORT(asBC_PSF, (short)varOffset); + + // Copy all arguments to the top of the stack + int argDwords = (int)outFunc->GetSpaceNeededForArguments(); + for( int a = argDwords-1; a >= 0; a-- ) + byteCode.InstrSHORT(asBC_PshV4, short(-a)); + + byteCode.Alloc(asBC_ALLOC, dt.GetObjectType(), constructor, argDwords + AS_PTR_SIZE); + + // Return a handle to the newly created object + byteCode.InstrSHORT(asBC_LOADOBJ, (short)varOffset); + + byteCode.Pop(AS_PTR_SIZE); + byteCode.Ret(argDwords); + + byteCode.Finalize(); + + // Store the instantiated object as variable so it will be cleaned up on exception + objVariableTypes.PushLast(variableAllocations[0].GetObjectType()); + objVariablePos.PushLast(GetVariableOffset(0)); + + // Copy byte code to the function + outFunc->byteCode.SetLength(byteCode.GetSize()); + byteCode.Output(outFunc->byteCode.AddressOf()); + outFunc->AddReferences(); + outFunc->stackNeeded = byteCode.largestStackUsed; + outFunc->lineNumbers = byteCode.lineNumbers; + outFunc->objVariablePos = objVariablePos; + outFunc->objVariableTypes = objVariableTypes; + + // Tell the virtual machine not to clean up parameters on exception + outFunc->dontCleanUpOnException = true; + +/* +#ifdef AS_DEBUG + // DEBUG: output byte code + asCString args; + args.Format("%d", outFunc->parameterTypes.GetLength()); + byteCode.DebugOutput(("__" + outFunc->name + "__factory" + args + ".txt").AddressOf(), engine); +#endif +*/ + return 0; +} + +int asCCompiler::CompileTemplateFactoryStub(asCBuilder *builder, int trueFactoryId, asCObjectType *objType, asCScriptFunction *outFunc) +{ + Reset(builder, 0, outFunc); + + asCScriptFunction *descr = builder->GetFunctionDescription(trueFactoryId); + + byteCode.InstrPTR(asBC_OBJTYPE, objType); + byteCode.Call(asBC_CALLSYS, trueFactoryId, descr->GetSpaceNeededForArguments()); + byteCode.Ret(outFunc->GetSpaceNeededForArguments()); + + byteCode.Finalize(); + + // Copy byte code to the function + outFunc->byteCode.SetLength(byteCode.GetSize()); + byteCode.Output(outFunc->byteCode.AddressOf()); + outFunc->AddReferences(); + outFunc->stackNeeded = byteCode.largestStackUsed; + outFunc->lineNumbers = byteCode.lineNumbers; + outFunc->objVariablePos = objVariablePos; + outFunc->objVariableTypes = objVariableTypes; + + // Tell the virtual machine not to clean up the object on exception + outFunc->dontCleanUpOnException = true; + + return 0; +} + +int asCCompiler::CompileFunction(asCBuilder *builder, asCScriptCode *script, asCScriptNode *func, asCScriptFunction *outFunc) +{ + Reset(builder, script, outFunc); + int buildErrors = builder->numErrors; + + int stackPos = 0; + if( outFunc->objectType ) + stackPos = -AS_PTR_SIZE; // The first parameter is the pointer to the object + + // Reserve a label for the cleanup code + nextLabel++; + + // Add the first variable scope, which the parameters and + // variables declared in the outermost statement block is + // part of. + AddVariableScope(); + + //---------------------------------------------- + // Examine return type + bool isDestructor = false; + asCDataType returnType; + if( func->firstChild->nodeType == snDataType ) + { + returnType = builder->CreateDataTypeFromNode(func->firstChild, script); + returnType = builder->ModifyDataTypeFromNode(returnType, func->firstChild->next, script, 0, 0); + + // Make sure the return type is instanciable or is void + if( !returnType.CanBeInstanciated() && + returnType != asCDataType::CreatePrimitive(ttVoid, false) ) + { + asCString str; + str.Format(TXT_DATA_TYPE_CANT_BE_s, returnType.Format().AddressOf()); + Error(str.AddressOf(), func->firstChild); + } + + // TODO: Add support for returning references + // The script language doesn't support returning references yet + if( returnType.IsReference() ) + { + Error(TXT_SCRIPT_FUNCTIONS_DOESNT_SUPPORT_RETURN_REF, func->firstChild); + } + } + else + { + returnType = asCDataType::CreatePrimitive(ttVoid, false); + if( func->firstChild->tokenType == ttBitNot ) + isDestructor = true; + else + m_isConstructor = true; + } + + //---------------------------------------------- + // Declare parameters + // Find first parameter + asCScriptNode *node = func->firstChild; + while( node && node->nodeType != snParameterList ) + node = node->next; + + // Register parameters from last to first, otherwise they will be destroyed in the wrong order + asCVariableScope vs(0); + + if( node ) node = node->firstChild; + while( node ) + { + // Get the parameter type + asCDataType type = builder->CreateDataTypeFromNode(node, script); + + asETypeModifiers inoutFlag = asTM_NONE; + type = builder->ModifyDataTypeFromNode(type, node->next, script, &inoutFlag, 0); + + // Is the data type allowed? + if( (type.IsReference() && inoutFlag != asTM_INOUTREF && !type.CanBeInstanciated()) || + (!type.IsReference() && !type.CanBeInstanciated()) ) + { + asCString str; + str.Format(TXT_PARAMETER_CANT_BE_s, type.Format().AddressOf()); + Error(str.AddressOf(), node); + } + + // If the parameter has a name then declare it as variable + node = node->next->next; + if( node && node->nodeType == snIdentifier ) + { + asCString name(&script->code[node->tokenPos], node->tokenLength); + + if( vs.DeclareVariable(name.AddressOf(), type, stackPos) < 0 ) + Error(TXT_PARAMETER_ALREADY_DECLARED, node); + + outFunc->AddVariable(name, type, stackPos); + + node = node->next; + } + else + vs.DeclareVariable("", type, stackPos); + + // Move to next parameter + stackPos -= type.GetSizeOnStackDWords(); + } + + int n; + for( n = (int)vs.variables.GetLength() - 1; n >= 0; n-- ) + { + variables->DeclareVariable(vs.variables[n]->name.AddressOf(), vs.variables[n]->type, vs.variables[n]->stackOffset); + } + + // Is the return type allowed? + if( (returnType.GetSizeOnStackDWords() == 0 && returnType != asCDataType::CreatePrimitive(ttVoid, false)) || + (returnType.IsReference() && !returnType.CanBeInstanciated()) ) + { + asCString str; + str.Format(TXT_RETURN_CANT_BE_s, returnType.Format().AddressOf()); + Error(str.AddressOf(), node); + } + + variables->DeclareVariable("return", returnType, stackPos); + + //-------------------------------------------- + // Compile the statement block + + // We need to parse the statement block now + + // TODO: memory: We can parse the statement block one statement at a time, thus save even more memory + asCParser parser(builder); + int r = parser.ParseStatementBlock(script, func->lastChild); + if( r < 0 ) return -1; + asCScriptNode *block = parser.GetScriptNode(); + + bool hasReturn; + asCByteCode bc(engine); + LineInstr(&bc, func->lastChild->tokenPos); + CompileStatementBlock(block, false, &hasReturn, &bc); + LineInstr(&bc, func->lastChild->tokenPos + func->lastChild->tokenLength); + + // Make sure there is a return in all paths (if not return type is void) + if( returnType != asCDataType::CreatePrimitive(ttVoid, false) ) + { + if( hasReturn == false ) + Error(TXT_NOT_ALL_PATHS_RETURN, func->lastChild); + } + + //------------------------------------------------ + // Concatenate the bytecode + + // Insert a JitEntry at the start of the function for JIT compilers + byteCode.InstrWORD(asBC_JitEntry, 0); + + // Count total variable size + int varSize = GetVariableOffset((int)variableAllocations.GetLength()) - 1; + byteCode.Push(varSize); + + if( outFunc->objectType ) + { + // Call the base class' default constructor unless called manually in the code + if( m_isConstructor && !m_isConstructorCalled && outFunc->objectType->derivedFrom ) + { + byteCode.InstrSHORT(asBC_PSF, 0); + byteCode.Instr(asBC_RDSPTR); + byteCode.Call(asBC_CALL, outFunc->objectType->derivedFrom->beh.construct, AS_PTR_SIZE); + } + + // Increase the reference for the object pointer, so that it is guaranteed to live during the entire call + // TODO: optimize: This is probably not necessary for constructors as no outside reference to the object is created yet + byteCode.InstrSHORT(asBC_PSF, 0); + byteCode.Instr(asBC_RDSPTR); + byteCode.Call(asBC_CALLSYS, outFunc->objectType->beh.addref, AS_PTR_SIZE); + } + + // Add the code for the statement block + byteCode.AddCode(&bc); + + // Deallocate all local variables + for( n = (int)variables->variables.GetLength() - 1; n >= 0; n-- ) + { + sVariable *v = variables->variables[n]; + if( v->stackOffset > 0 ) + { + // Call variables destructors + if( v->name != "return" && v->name != "return address" ) + CallDestructor(v->type, v->stackOffset, &byteCode); + + DeallocateVariable(v->stackOffset); + } + } + + // This is the label that return statements jump to + // in order to exit the function + byteCode.Label(0); + + // Release the object pointer again + if( outFunc->objectType ) + { + byteCode.InstrSHORT(asBC_PSF, 0); + byteCode.InstrPTR(asBC_FREE, outFunc->objectType); + } + + // Call destructors for function parameters + for( n = (int)variables->variables.GetLength() - 1; n >= 0; n-- ) + { + sVariable *v = variables->variables[n]; + if( v->stackOffset <= 0 ) + { + // Call variable destructors here, for variables not yet destroyed + if( v->name != "return" && v->name != "return address" ) + CallDestructor(v->type, v->stackOffset, &byteCode); + } + + // Do not deallocate parameters + } + + // If there are compile errors, there is no reason to build the final code + if( hasCompileErrors || builder->numErrors != buildErrors ) + { + // Clear the accessed global properties, so they are not prematurely released + outFunc->globalVarPointers.SetLength(0); + return -1; + } + + // At this point there should be no variables allocated + asASSERT(variableAllocations.GetLength() == freeVariables.GetLength()); + + // Remove the variable scope + RemoveVariableScope(); + + byteCode.Pop(varSize); + + byteCode.Ret(-stackPos); + + // Tell the bytecode which variables are temporary + for( n = 0; n < (signed)variableIsTemporary.GetLength(); n++ ) + { + if( variableIsTemporary[n] ) + byteCode.DefineTemporaryVariable(GetVariableOffset(n)); + } + + // Finalize the bytecode + byteCode.Finalize(); + + // Compile the list of object variables for the exception handler + for( n = 0; n < (int)variableAllocations.GetLength(); n++ ) + { + if( variableAllocations[n].IsObject() && !variableAllocations[n].IsReference() ) + { + objVariableTypes.PushLast(variableAllocations[n].GetObjectType()); + objVariablePos.PushLast(GetVariableOffset(n)); + } + } + + if( hasCompileErrors || builder->numErrors != buildErrors ) + { + // Clear the accessed global properties, so they are not prematurely released + outFunc->globalVarPointers.SetLength(0); + return -1; + } + + // Copy byte code to the function + outFunc->byteCode.SetLength(byteCode.GetSize()); + byteCode.Output(outFunc->byteCode.AddressOf()); + outFunc->AddReferences(); + outFunc->stackNeeded = byteCode.largestStackUsed; + outFunc->lineNumbers = byteCode.lineNumbers; + outFunc->objVariablePos = objVariablePos; + outFunc->objVariableTypes = objVariableTypes; + +#ifdef AS_DEBUG +// // DEBUG: output byte code +// if( outFunc->objectType ) +// byteCode.DebugOutput(("__" + outFunc->objectType->name + "_" + outFunc->name + ".txt").AddressOf(), engine); +// else +// byteCode.DebugOutput(("__" + outFunc->name + ".txt").AddressOf(), engine); +#endif + + return 0; +} + + + + + +int asCCompiler::CallDefaultConstructor(asCDataType &type, int offset, asCByteCode *bc, asCScriptNode *node, bool isGlobalVar) +{ + // Call constructor for the data type + if( type.IsObject() && !type.IsObjectHandle() ) + { + if( type.GetObjectType()->flags & asOBJ_REF ) + { + asSExprContext ctx(engine); + + int func = 0; + asSTypeBehaviour *beh = type.GetBehaviour(); + if( beh ) func = beh->factory; + + if( func > 0 ) + { + if( !isGlobalVar ) + { + // Call factory and store the handle in the given variable + PerformFunctionCall(func, &ctx, false, 0, type.GetObjectType(), true, offset); + + // Pop the reference left by the function call + ctx.bc.Pop(AS_PTR_SIZE); + } + else + { + // Call factory + PerformFunctionCall(func, &ctx, false, 0, type.GetObjectType()); + + // Store the returned handle in the global variable + ctx.bc.Instr(asBC_RDSPTR); + // TODO: global: The global var address should be stored in the instruction directly + ctx.bc.InstrWORD(asBC_PGA, (asWORD)outFunc->GetGlobalVarPtrIndex(offset)); + ctx.bc.InstrPTR(asBC_REFCPY, type.GetObjectType()); + ctx.bc.Pop(AS_PTR_SIZE); + ReleaseTemporaryVariable(ctx.type.stackOffset, &ctx.bc); + } + + bc->AddCode(&ctx.bc); + } + else + { + asCString str; + str.Format(TXT_NO_DEFAULT_CONSTRUCTOR_FOR_s, type.GetObjectType()->GetName()); + Error(str.AddressOf(), node); + //Class has no default constructor. + return -1; + } + } + else + { + if( isGlobalVar ) + // TODO: global: The global var address should be stored in the instruction directly + bc->InstrWORD(asBC_PGA, (asWORD)outFunc->GetGlobalVarPtrIndex(offset)); + else + bc->InstrSHORT(asBC_PSF, (short)offset); + + asSTypeBehaviour *beh = type.GetBehaviour(); + + int func = 0; + if( beh ) func = beh->construct; + + // TODO: Should give error if the value type doesn't have a default constructor and isn't a POD type + + bc->Alloc(asBC_ALLOC, type.GetObjectType(), func, AS_PTR_SIZE); + } + } + return 0; +} + +void asCCompiler::CallDestructor(asCDataType &type, int offset, asCByteCode *bc) +{ + if( !type.IsReference() ) + { + // Call destructor for the data type + if( type.IsObject() ) + { + // Free the memory + bc->InstrSHORT(asBC_PSF, (short)offset); + bc->InstrPTR(asBC_FREE, type.GetObjectType()); + } + } +} + +void asCCompiler::LineInstr(asCByteCode *bc, size_t pos) +{ + int r, c; + script->ConvertPosToRowCol(pos, &r, &c); + bc->Line(r, c); +} + +void asCCompiler::CompileStatementBlock(asCScriptNode *block, bool ownVariableScope, bool *hasReturn, asCByteCode *bc) +{ + *hasReturn = false; + bool isFinished = false; + bool hasWarned = false; + + if( ownVariableScope ) + AddVariableScope(); + + asCScriptNode *node = block->firstChild; + while( node ) + { + if( !hasWarned && (*hasReturn || isFinished) ) + { + hasWarned = true; + Warning(TXT_UNREACHABLE_CODE, node); + } + + if( node->nodeType == snBreak || node->nodeType == snContinue ) + isFinished = true; + + asCByteCode statement(engine); + if( node->nodeType == snDeclaration ) + CompileDeclaration(node, &statement); + else + CompileStatement(node, hasReturn, &statement); + + LineInstr(bc, node->tokenPos); + bc->AddCode(&statement); + + if( !hasCompileErrors ) + asASSERT( tempVariables.GetLength() == 0 ); + + node = node->next; + } + + if( ownVariableScope ) + { + + // Deallocate variables in this block, in reverse order + for( int n = (int)variables->variables.GetLength() - 1; n >= 0; n-- ) + { + sVariable *v = variables->variables[n]; + + // Call variable destructors here, for variables not yet destroyed + // If the block is terminated with a break, continue, or + // return the variables are already destroyed + if( !isFinished && !*hasReturn ) + CallDestructor(v->type, v->stackOffset, bc); + + // Don't deallocate function parameters + if( v->stackOffset > 0 ) + DeallocateVariable(v->stackOffset); + } + + RemoveVariableScope(); + } +} + +int asCCompiler::CompileGlobalVariable(asCBuilder *builder, asCScriptCode *script, asCScriptNode *node, sGlobalVariableDescription *gvar, asCScriptFunction *outFunc) +{ + Reset(builder, script, outFunc); + globalExpression = true; + + // Add a variable scope (even though variables can't be declared) + AddVariableScope(); + + asSExprContext ctx(engine); + + gvar->isPureConstant = false; + + // Parse the initialization nodes + asCParser parser(builder); + if( node ) + { + int r = parser.ParseGlobalVarInit(script, node); + if( r < 0 ) + return r; + + node = parser.GetScriptNode(); + } + + // Compile the expression + if( node && node->nodeType == snArgList ) + { + // Make sure that it is a registered type, and that it isn't a pointer + if( gvar->datatype.GetObjectType() == 0 || gvar->datatype.IsObjectHandle() ) + { + Error(TXT_MUST_BE_OBJECT, node); + } + else + { + // Compile the arguments + asCArray args; + if( CompileArgumentList(node, args) >= 0 ) + { + // Find all constructors + asCArray funcs; + asSTypeBehaviour *beh = gvar->datatype.GetBehaviour(); + if( beh ) + { + if( gvar->datatype.GetObjectType()->flags & asOBJ_REF ) + funcs = beh->factories; + else + funcs = beh->constructors; + } + + asCString str = gvar->datatype.Format(); + MatchFunctions(funcs, args, node, str.AddressOf()); + + if( funcs.GetLength() == 1 ) + { + if( gvar->datatype.GetObjectType()->flags & asOBJ_REF ) + { + MakeFunctionCall(&ctx, funcs[0], 0, args, node); + + // Store the returned handle in the global variable + ctx.bc.Instr(asBC_RDSPTR); + // TODO: global: The global var address should be stored in the instruction directly + ctx.bc.InstrWORD(asBC_PGA, (asWORD)outFunc->GetGlobalVarPtrIndex(gvar->index)); + ctx.bc.InstrPTR(asBC_REFCPY, gvar->datatype.GetObjectType()); + ctx.bc.Pop(AS_PTR_SIZE); + ReleaseTemporaryVariable(ctx.type.stackOffset, &ctx.bc); + } + else + { + // TODO: This reference is open while evaluating the arguments. We must fix this + // TODO: global: The global var address should be stored in the instruction directly + ctx.bc.InstrWORD(asBC_PGA, (asWORD)outFunc->GetGlobalVarPtrIndex(gvar->index)); + + PrepareFunctionCall(funcs[0], &ctx.bc, args); + MoveArgsToStack(funcs[0], &ctx.bc, args, false); + + PerformFunctionCall(funcs[0], &ctx, true, &args, gvar->datatype.GetObjectType()); + } + } + } + + // Cleanup + for( asUINT n = 0; n < args.GetLength(); n++ ) + if( args[n] ) + { + asDELETE(args[n],asSExprContext); + } + } + } + else if( node && node->nodeType == snInitList ) + { + asCTypeInfo ti; + ti.Set(gvar->datatype); + ti.isVariable = false; + ti.isTemporary = false; + ti.stackOffset = (short)gvar->index; + + CompileInitList(&ti, node, &ctx.bc); + + node = node->next; + } + else + { + // Call constructor for all data types + if( gvar->datatype.IsObject() && !gvar->datatype.IsObjectHandle() ) + { + CallDefaultConstructor(gvar->datatype, gvar->index, &ctx.bc, gvar->idNode, true); + } + + if( node ) + { + asSExprContext expr(engine); + int r = CompileAssignment(node, &expr); if( r < 0 ) return r; + + if( gvar->datatype.IsPrimitive() ) + { + if( gvar->datatype.IsReadOnly() && expr.type.isConstant ) + { + ImplicitConversion(&expr, gvar->datatype, node, asIC_IMPLICIT_CONV); + + gvar->isPureConstant = true; + gvar->constantValue = expr.type.qwordValue; + } + + asSExprContext lctx(engine); + lctx.type.Set(gvar->datatype); + lctx.type.dataType.MakeReference(true); + lctx.type.dataType.MakeReadOnly(false); + + // If it is an enum value that is being compiled, then + // we skip this, as the bytecode won't be used anyway + // TODO: global: The global var address should be stored in the instruction directly + if( !gvar->isEnumValue ) + lctx.bc.InstrWORD(asBC_LDG, (asWORD)outFunc->GetGlobalVarPtrIndex(gvar->index)); + + DoAssignment(&ctx, &lctx, &expr, node, node, ttAssignment, node); + } + else + { + asSExprContext lexpr(engine); + lexpr.type.Set(gvar->datatype); + lexpr.type.dataType.MakeReference(true); + lexpr.type.dataType.MakeReadOnly(false); + lexpr.type.stackOffset = -1; + + if( gvar->datatype.IsObjectHandle() ) + lexpr.type.isExplicitHandle = true; + + // TODO: global: The global var address should be stored in the instruction directly + lexpr.bc.InstrWORD(asBC_PGA, (asWORD)outFunc->GetGlobalVarPtrIndex(gvar->index)); + + // If left expression resolves into a registered type + // check if the assignment operator is overloaded, and check + // the type of the right hand expression. If none is found + // the default action is a direct copy if it is the same type + // and a simple assignment. + bool assigned = false; + if( lexpr.type.dataType.IsObject() && !lexpr.type.isExplicitHandle ) + { + assigned = CompileOverloadedDualOperator(node, &lexpr, &expr, &ctx); + if( assigned ) + { + // Pop the resulting value + ctx.bc.Pop(ctx.type.dataType.GetSizeOnStackDWords()); + + // Release the argument + ProcessDeferredParams(&ctx); + } + } + + if( !assigned ) + { + PrepareForAssignment(&lexpr.type.dataType, &expr, node); + + // If the expression is constant and the variable also is constant + // then mark the variable as pure constant. This will allow the compiler + // to optimize expressions with this variable. + if( gvar->datatype.IsReadOnly() && expr.type.isConstant ) + { + gvar->isPureConstant = true; + gvar->constantValue = expr.type.qwordValue; + } + + // Add expression code to bytecode + MergeExprContexts(&ctx, &expr); + + // Add byte code for storing value of expression in variable + // TODO: global: The global var address should be stored in the instruction directly + ctx.bc.InstrWORD(asBC_PGA, (asWORD)outFunc->GetGlobalVarPtrIndex(gvar->index)); + + PerformAssignment(&lexpr.type, &expr.type, &ctx.bc, node); + + // Release temporary variables used by expression + ReleaseTemporaryVariable(expr.type, &ctx.bc); + + ctx.bc.Pop(expr.type.dataType.GetSizeOnStackDWords()); + } + } + } + } + + // Concatenate the bytecode + int varSize = GetVariableOffset((int)variableAllocations.GetLength()) - 1; + + // We need to push zeroes on the stack to guarantee + // that temporary object handles are clear + int n; + for( n = 0; n < varSize; n++ ) + byteCode.InstrINT(asBC_PshC4, 0); + + byteCode.AddCode(&ctx.bc); + + // Deallocate variables in this block, in reverse order + for( n = (int)variables->variables.GetLength() - 1; n >= 0; --n ) + { + sVariable *v = variables->variables[n]; + + // Call variable destructors here, for variables not yet destroyed + CallDestructor(v->type, v->stackOffset, &byteCode); + + DeallocateVariable(v->stackOffset); + } + + if( hasCompileErrors ) return -1; + + // At this point there should be no variables allocated + asASSERT(variableAllocations.GetLength() == freeVariables.GetLength()); + + // Remove the variable scope again + RemoveVariableScope(); + + if( varSize ) + byteCode.Pop(varSize); + + return 0; +} + +void asCCompiler::PrepareArgument(asCDataType *paramType, asSExprContext *ctx, asCScriptNode *node, bool isFunction, int refType, asCArray *reservedVars) +{ + asCDataType param = *paramType; + if( paramType->GetTokenType() == ttQuestion ) + { + // Since the function is expecting a var type ?, then we don't want to convert the argument to anything else + param = ctx->type.dataType; + param.MakeHandle(ctx->type.isExplicitHandle); + param.MakeReference(paramType->IsReference()); + param.MakeReadOnly(paramType->IsReadOnly()); + } + else + param = *paramType; + + asCDataType dt = param; + + // Need to protect arguments by reference + if( isFunction && dt.IsReference() ) + { + if( paramType->GetTokenType() == ttQuestion ) + { + asCByteCode tmpBC(engine); + + // Place the type id on the stack as a hidden parameter + tmpBC.InstrDWORD(asBC_TYPEID, engine->GetTypeIdFromDataType(param)); + + // Insert the code before the expression code + tmpBC.AddCode(&ctx->bc); + ctx->bc.AddCode(&tmpBC); + } + + // Allocate a temporary variable of the same type as the argument + dt.MakeReference(false); + dt.MakeReadOnly(false); + + int offset; + if( refType == 1 ) // &in + { + ProcessPropertyGetAccessor(ctx, node); + + // If the reference is const, then it is not necessary to make a copy if the value already is a variable + // Even if the same variable is passed in another argument as non-const then there is no problem + if( dt.IsPrimitive() || dt.IsNullHandle() ) + { + IsVariableInitialized(&ctx->type, node); + + if( ctx->type.dataType.IsReference() ) ConvertToVariable(ctx); + ImplicitConversion(ctx, dt, node, asIC_IMPLICIT_CONV, true, reservedVars); + + if( !(param.IsReadOnly() && ctx->type.isVariable) ) + ConvertToTempVariable(ctx); + + PushVariableOnStack(ctx, true); + ctx->type.dataType.MakeReadOnly(param.IsReadOnly()); + } + else + { + IsVariableInitialized(&ctx->type, node); + + ImplicitConversion(ctx, param, node, asIC_IMPLICIT_CONV, true, reservedVars); + + if( !ctx->type.dataType.IsEqualExceptRef(param) ) + { + asCString str; + str.Format(TXT_CANT_IMPLICITLY_CONVERT_s_TO_s, ctx->type.dataType.Format().AddressOf(), param.Format().AddressOf()); + Error(str.AddressOf(), node); + + ctx->type.Set(param); + } + + // If the argument already is a temporary + // variable we don't need to allocate another + + // If the parameter is read-only and the object already is a local + // variable then it is not necessary to make a copy either + if( !ctx->type.isTemporary && !(param.IsReadOnly() && ctx->type.isVariable)) + { + // Make sure the variable is not used in the expression + asCArray vars; + ctx->bc.GetVarsUsed(vars); + if( reservedVars ) vars.Concatenate(*reservedVars); + offset = AllocateVariableNotIn(dt, true, &vars); + + // Allocate and construct the temporary object + asCByteCode tmpBC(engine); + CallDefaultConstructor(dt, offset, &tmpBC, node); + + // Insert the code before the expression code + tmpBC.AddCode(&ctx->bc); + ctx->bc.AddCode(&tmpBC); + + // Assign the evaluated expression to the temporary variable + PrepareForAssignment(&dt, ctx, node); + + dt.MakeReference(true); + asCTypeInfo type; + type.Set(dt); + type.isTemporary = true; + type.stackOffset = (short)offset; + + if( dt.IsObjectHandle() ) + type.isExplicitHandle = true; + + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + + PerformAssignment(&type, &ctx->type, &ctx->bc, node); + + ctx->bc.Pop(ctx->type.dataType.GetSizeOnStackDWords()); + + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + + ctx->type = type; + + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + if( dt.IsObject() && !dt.IsObjectHandle() ) + ctx->bc.Instr(asBC_RDSPTR); + + if( paramType->IsReadOnly() ) + ctx->type.dataType.MakeReadOnly(true); + } + } + } + else if( refType == 2 ) // &out + { + // Make sure the variable is not used in the expression + asCArray vars; + ctx->bc.GetVarsUsed(vars); + if( reservedVars ) vars.Concatenate(*reservedVars); + offset = AllocateVariableNotIn(dt, true, &vars); + + if( dt.IsPrimitive() ) + { + ctx->type.SetVariable(dt, offset, true); + PushVariableOnStack(ctx, true); + } + else + { + // Allocate and construct the temporary object + asCByteCode tmpBC(engine); + CallDefaultConstructor(dt, offset, &tmpBC, node); + + // Insert the code before the expression code + tmpBC.AddCode(&ctx->bc); + ctx->bc.AddCode(&tmpBC); + + dt.MakeReference((!dt.IsObject() || dt.IsObjectHandle())); + asCTypeInfo type; + type.Set(dt); + type.isTemporary = true; + type.stackOffset = (short)offset; + + ctx->type = type; + + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + if( dt.IsObject() && !dt.IsObjectHandle() ) + ctx->bc.Instr(asBC_RDSPTR); + } + + // After the function returns the temporary variable will + // be assigned to the expression, if it is a valid lvalue + } + else if( refType == asTM_INOUTREF ) + { + // Literal constants cannot be passed to inout ref arguments + if( !ctx->type.isVariable && ctx->type.isConstant ) + { + Error(TXT_NOT_VALID_REFERENCE, node); + } + + // Only objects that support object handles + // can be guaranteed to be safe. Local variables are + // already safe, so there is no need to add an extra + // references + if( !engine->ep.allowUnsafeReferences && + !ctx->type.isVariable && + ctx->type.dataType.IsObject() && + !ctx->type.dataType.IsObjectHandle() && + ctx->type.dataType.GetBehaviour()->addref && + ctx->type.dataType.GetBehaviour()->release ) + { + // Store a handle to the object as local variable + asSExprContext tmp(engine); + asCDataType dt = ctx->type.dataType; + dt.MakeHandle(true); + dt.MakeReference(false); + + asCArray vars; + ctx->bc.GetVarsUsed(vars); + if( reservedVars ) vars.Concatenate(*reservedVars); + offset = AllocateVariableNotIn(dt, true, &vars); + + // Copy the handle + if( !ctx->type.dataType.IsObjectHandle() && ctx->type.dataType.IsReference() ) + ctx->bc.Instr(asBC_RDSPTR); + ctx->bc.InstrWORD(asBC_PSF, (asWORD)offset); + ctx->bc.InstrPTR(asBC_REFCPY, ctx->type.dataType.GetObjectType()); + ctx->bc.Pop(AS_PTR_SIZE); + ctx->bc.InstrWORD(asBC_PSF, (asWORD)offset); + + dt.MakeHandle(false); + dt.MakeReference(true); + + // Release previous temporary variable stored in the context (if any) + if( ctx->type.isTemporary ) + { + ReleaseTemporaryVariable(ctx->type.stackOffset, &ctx->bc); + } + + ctx->type.SetVariable(dt, offset, true); + } + + // Make sure the reference to the value is on the stack + if( ctx->type.dataType.IsObject() && ctx->type.dataType.IsReference() ) + Dereference(ctx, true); + else if( ctx->type.isVariable ) + ctx->bc.InstrSHORT(asBC_PSF, ctx->type.stackOffset); + else if( ctx->type.dataType.IsPrimitive() ) + ctx->bc.Instr(asBC_PshRPtr); + } + } + else + { + ProcessPropertyGetAccessor(ctx, node); + + if( dt.IsPrimitive() ) + { + IsVariableInitialized(&ctx->type, node); + + if( ctx->type.dataType.IsReference() ) ConvertToVariable(ctx); + + // Implicitly convert primitives to the parameter type + ImplicitConversion(ctx, dt, node, asIC_IMPLICIT_CONV, true, reservedVars); + + if( ctx->type.isVariable ) + { + PushVariableOnStack(ctx, dt.IsReference()); + } + else if( ctx->type.isConstant ) + { + ConvertToVariable(ctx); + PushVariableOnStack(ctx, dt.IsReference()); + } + } + else + { + IsVariableInitialized(&ctx->type, node); + + // Implicitly convert primitives to the parameter type + ImplicitConversion(ctx, dt, node, asIC_IMPLICIT_CONV, true, reservedVars); + + // Was the conversion successful? + if( !ctx->type.dataType.IsEqualExceptRef(dt) ) + { + asCString str; + str.Format(TXT_CANT_IMPLICITLY_CONVERT_s_TO_s, ctx->type.dataType.Format().AddressOf(), dt.Format().AddressOf()); + Error(str.AddressOf(), node); + + ctx->type.Set(dt); + } + + if( dt.IsObjectHandle() ) + ctx->type.isExplicitHandle = true; + + if( dt.IsObject() ) + { + if( !dt.IsReference() ) + { + // Objects passed by value must be placed in temporary variables + // so that they are guaranteed to not be referenced anywhere else + PrepareTemporaryObject(node, ctx, reservedVars); + + // The implicit conversion shouldn't convert the object to + // non-reference yet. It will be dereferenced just before the call. + // Otherwise the object might be missed by the exception handler. + dt.MakeReference(true); + } + else + { + // An object passed by reference should place the pointer to + // the object on the stack. + dt.MakeReference(false); + } + } + } + } + + // Don't put any pointer on the stack yet + if( param.IsReference() || param.IsObject() ) + { + // &inout parameter may leave the reference on the stack already + if( refType != 3 ) + { + ctx->bc.Pop(AS_PTR_SIZE); + ctx->bc.InstrSHORT(asBC_VAR, ctx->type.stackOffset); + } + + ProcessDeferredParams(ctx); + } +} + +void asCCompiler::PrepareFunctionCall(int funcID, asCByteCode *bc, asCArray &args) +{ + // When a match has been found, compile the final byte code using correct parameter types + asCScriptFunction *descr = builder->GetFunctionDescription(funcID); + + // Add code for arguments + asSExprContext e(engine); + int n; + for( n = (int)args.GetLength()-1; n >= 0; n-- ) + { + // Make sure PrepareArgument doesn't use any variable that is already + // being used by any of the following argument expressions + asCArray reservedVars; + for( int m = n-1; m >= 0; m-- ) + args[m]->bc.GetVarsUsed(reservedVars); + + PrepareArgument2(&e, args[n], &descr->parameterTypes[n], true, descr->inOutFlags[n], &reservedVars); + } + + bc->AddCode(&e.bc); +} + +void asCCompiler::MoveArgsToStack(int funcID, asCByteCode *bc, asCArray &args, bool addOneToOffset) +{ + asCScriptFunction *descr = builder->GetFunctionDescription(funcID); + + int offset = 0; + if( addOneToOffset ) + offset += AS_PTR_SIZE; + + // Move the objects that are sent by value to the stack just before the call + for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) + { + if( descr->parameterTypes[n].IsReference() ) + { + if( descr->parameterTypes[n].IsObject() && !descr->parameterTypes[n].IsObjectHandle() ) + { + if( descr->inOutFlags[n] != asTM_INOUTREF ) + bc->InstrWORD(asBC_GETOBJREF, (asWORD)offset); + if( args[n]->type.dataType.IsObjectHandle() ) + bc->InstrWORD(asBC_ChkNullS, (asWORD)offset); + } + else if( descr->inOutFlags[n] != asTM_INOUTREF ) + { + if( descr->parameterTypes[n].GetTokenType() == ttQuestion && + args[n]->type.dataType.IsObject() && !args[n]->type.dataType.IsObjectHandle() ) + { + // Send the object as a reference to the object, + // and not to the variable holding the object + bc->InstrWORD(asBC_GETOBJREF, (asWORD)offset); + } + else + bc->InstrWORD(asBC_GETREF, (asWORD)offset); + } + } + else if( descr->parameterTypes[n].IsObject() ) + { + bc->InstrWORD(asBC_GETOBJ, (asWORD)offset); + + // The temporary variable must not be freed as it will no longer hold an object + DeallocateVariable(args[n]->type.stackOffset); + args[n]->type.isTemporary = false; + } + + offset += descr->parameterTypes[n].GetSizeOnStackDWords(); + } +} + +int asCCompiler::CompileArgumentList(asCScriptNode *node, asCArray &args) +{ + asASSERT(node->nodeType == snArgList); + + // Count arguments + asCScriptNode *arg = node->firstChild; + int argCount = 0; + while( arg ) + { + argCount++; + arg = arg->next; + } + + // Prepare the arrays + args.SetLength(argCount); + int n; + for( n = 0; n < argCount; n++ ) + args[n] = 0; + + n = argCount-1; + + // Compile the arguments in reverse order (as they will be pushed on the stack) + bool anyErrors = false; + arg = node->lastChild; + while( arg ) + { + asSExprContext expr(engine); + int r = CompileAssignment(arg, &expr); + if( r < 0 ) anyErrors = true; + + args[n] = asNEW(asSExprContext)(engine); + MergeExprContexts(args[n], &expr); + args[n]->type = expr.type; + args[n]->property_get = expr.property_get; + args[n]->property_set = expr.property_set; + args[n]->property_const = expr.property_const; + args[n]->property_handle = expr.property_handle; + args[n]->exprNode = arg; + + n--; + arg = arg->prev; + } + + return anyErrors ? -1 : 0; +} + +void asCCompiler::MatchFunctions(asCArray &funcs, asCArray &args, asCScriptNode *node, const char *name, asCObjectType *objectType, bool isConstMethod, bool silent, bool allowObjectConstruct, const asCString &scope) +{ + asCArray origFuncs = funcs; // Keep the original list for error message + + asUINT n; + if( funcs.GetLength() > 0 ) + { + // Check the number of parameters in the found functions + for( n = 0; n < funcs.GetLength(); ++n ) + { + asCScriptFunction *desc = builder->GetFunctionDescription(funcs[n]); + + if( desc->parameterTypes.GetLength() != args.GetLength() ) + { + // remove it from the list + if( n == funcs.GetLength()-1 ) + funcs.PopLast(); + else + funcs[n] = funcs.PopLast(); + n--; + } + } + + // Match functions with the parameters, and discard those that do not match + asCArray matchingFuncs = funcs; + + for( n = 0; n < args.GetLength(); ++n ) + { + asCArray tempFuncs; + MatchArgument(funcs, tempFuncs, &args[n]->type, n, allowObjectConstruct); + + // Intersect the found functions with the list of matching functions + for( asUINT f = 0; f < matchingFuncs.GetLength(); f++ ) + { + asUINT c; + for( c = 0; c < tempFuncs.GetLength(); c++ ) + { + if( matchingFuncs[f] == tempFuncs[c] ) + break; + } + + // Was the function a match? + if( c == tempFuncs.GetLength() ) + { + // No, remove it from the list + if( f == matchingFuncs.GetLength()-1 ) + matchingFuncs.PopLast(); + else + matchingFuncs[f] = matchingFuncs.PopLast(); + f--; + } + } + } + + funcs = matchingFuncs; + } + + if( !isConstMethod ) + FilterConst(funcs); + + if( funcs.GetLength() != 1 && !silent ) + { + // Build a readable string of the function with parameter types + asCString str; + if( scope != "" ) + { + if( scope == "::" ) + str = scope; + else + str = scope + "::"; + } + str += name; + str += "("; + if( args.GetLength() ) + str += args[0]->type.dataType.Format(); + for( n = 1; n < args.GetLength(); n++ ) + str += ", " + args[n]->type.dataType.Format(); + str += ")"; + + if( isConstMethod ) + str += " const"; + + if( objectType && scope == "" ) + str = objectType->name + "::" + str; + + if( funcs.GetLength() == 0 ) + { + str.Format(TXT_NO_MATCHING_SIGNATURES_TO_s, str.AddressOf()); + Error(str.AddressOf(), node); + + // Print the list of candidates + if( origFuncs.GetLength() > 0 ) + { + int r, c; + script->ConvertPosToRowCol(node->tokenPos, &r, &c); + builder->WriteInfo(script->name.AddressOf(), TXT_CANDIDATES_ARE, r, c, false); + PrintMatchingFuncs(origFuncs, node); + } + } + else + { + str.Format(TXT_MULTIPLE_MATCHING_SIGNATURES_TO_s, str.AddressOf()); + Error(str.AddressOf(), node); + + PrintMatchingFuncs(funcs, node); + } + } +} + +void asCCompiler::CompileDeclaration(asCScriptNode *decl, asCByteCode *bc) +{ + // Get the data type + asCDataType type = builder->CreateDataTypeFromNode(decl->firstChild, script); + + // Declare all variables in this declaration + asCScriptNode *node = decl->firstChild->next; + while( node ) + { + // Is the type allowed? + if( !type.CanBeInstanciated() ) + { + asCString str; + // TODO: Change to "'type' cannot be declared as variable" + str.Format(TXT_DATA_TYPE_CANT_BE_s, type.Format().AddressOf()); + Error(str.AddressOf(), node); + + // Use int instead to avoid further problems + type = asCDataType::CreatePrimitive(ttInt, false); + } + + // Get the name of the identifier + asCString name(&script->code[node->tokenPos], node->tokenLength); + + // Verify that the name isn't used by a dynamic data type + if( engine->GetObjectType(name.AddressOf()) != 0 ) + { + asCString str; + str.Format(TXT_ILLEGAL_VARIABLE_NAME_s, name.AddressOf()); + Error(str.AddressOf(), node); + } + + int offset = AllocateVariable(type, false); + if( variables->DeclareVariable(name.AddressOf(), type, offset) < 0 ) + { + asCString str; + str.Format(TXT_s_ALREADY_DECLARED, name.AddressOf()); + Error(str.AddressOf(), node); + } + + outFunc->AddVariable(name, type, offset); + + // Keep the node for the variable decl + asCScriptNode *varNode = node; + + node = node->next; + if( node && node->nodeType == snArgList ) + { + // Make sure that it is a registered type, and that is isn't a pointer + if( type.GetObjectType() == 0 || type.IsObjectHandle() ) + { + Error(TXT_MUST_BE_OBJECT, node); + } + else + { + // Compile the arguments + asCArray args; + + if( CompileArgumentList(node, args) >= 0 ) + { + // Find all constructors + asCArray funcs; + asSTypeBehaviour *beh = type.GetBehaviour(); + if( beh ) + { + if( type.GetObjectType()->flags & asOBJ_REF ) + funcs = beh->factories; + else + funcs = beh->constructors; + } + + asCString str = type.Format(); + MatchFunctions(funcs, args, node, str.AddressOf()); + + if( funcs.GetLength() == 1 ) + { + sVariable *v = variables->GetVariable(name.AddressOf()); + asSExprContext ctx(engine); + if( v->type.GetObjectType()->flags & asOBJ_REF ) + { + MakeFunctionCall(&ctx, funcs[0], 0, args, node, true, v->stackOffset); + + // Pop the reference left by the function call + ctx.bc.Pop(AS_PTR_SIZE); + } + else + { + ctx.bc.InstrSHORT(asBC_VAR, (short)v->stackOffset); + + PrepareFunctionCall(funcs[0], &ctx.bc, args); + MoveArgsToStack(funcs[0], &ctx.bc, args, false); + + int offset = 0; + asCScriptFunction *descr = builder->GetFunctionDescription(funcs[0]); + for( asUINT n = 0; n < args.GetLength(); n++ ) + offset += descr->parameterTypes[n].GetSizeOnStackDWords(); + + ctx.bc.InstrWORD(asBC_GETREF, (asWORD)offset); + + PerformFunctionCall(funcs[0], &ctx, true, &args, type.GetObjectType()); + } + bc->AddCode(&ctx.bc); + } + } + + // Cleanup + for( asUINT n = 0; n < args.GetLength(); n++ ) + if( args[n] ) + { + asDELETE(args[n],asSExprContext); + } + } + + node = node->next; + } + else if( node && node->nodeType == snInitList ) + { + sVariable *v = variables->GetVariable(name.AddressOf()); + + asCTypeInfo ti; + ti.Set(type); + ti.isVariable = true; + ti.isTemporary = false; + ti.stackOffset = (short)v->stackOffset; + + CompileInitList(&ti, node, bc); + + node = node->next; + } + else + { + asSExprContext ctx(engine); + + // Call the default constructor here + CallDefaultConstructor(type, offset, &ctx.bc, varNode); + + // Is the variable initialized? + if( node && node->nodeType == snAssignment ) + { + // Compile the expression + asSExprContext expr(engine); + int r = CompileAssignment(node, &expr); + if( r >= 0 ) + { + if( type.IsPrimitive() ) + { + if( type.IsReadOnly() && expr.type.isConstant ) + { + ImplicitConversion(&expr, type, node, asIC_IMPLICIT_CONV); + + sVariable *v = variables->GetVariable(name.AddressOf()); + v->isPureConstant = true; + v->constantValue = expr.type.qwordValue; + } + + asSExprContext lctx(engine); + lctx.type.SetVariable(type, offset, false); + lctx.type.dataType.MakeReadOnly(false); + + DoAssignment(&ctx, &lctx, &expr, node, node, ttAssignment, node); + } + else + { + // TODO: We can use a copy constructor here + + asSExprContext lexpr(engine); + lexpr.type.Set(type); + lexpr.type.dataType.MakeReference(true); + // Allow initialization of constant variables + lexpr.type.dataType.MakeReadOnly(false); + + if( type.IsObjectHandle() ) + lexpr.type.isExplicitHandle = true; + + sVariable *v = variables->GetVariable(name.AddressOf()); + lexpr.bc.InstrSHORT(asBC_PSF, (short)v->stackOffset); + lexpr.type.stackOffset = (short)v->stackOffset; + + + // If left expression resolves into a registered type + // check if the assignment operator is overloaded, and check + // the type of the right hand expression. If none is found + // the default action is a direct copy if it is the same type + // and a simple assignment. + bool assigned = false; + if( lexpr.type.dataType.IsObject() && !lexpr.type.isExplicitHandle ) + { + assigned = CompileOverloadedDualOperator(node, &lexpr, &expr, &ctx); + if( assigned ) + { + // Pop the resulting value + ctx.bc.Pop(ctx.type.dataType.GetSizeOnStackDWords()); + + // Release the argument + ProcessDeferredParams(&ctx); + } + } + + if( !assigned ) + { + PrepareForAssignment(&lexpr.type.dataType, &expr, node); + + // If the expression is constant and the variable also is constant + // then mark the variable as pure constant. This will allow the compiler + // to optimize expressions with this variable. + if( v->type.IsReadOnly() && expr.type.isConstant ) + { + v->isPureConstant = true; + v->constantValue = expr.type.qwordValue; + } + + // Add expression code to bytecode + MergeExprContexts(&ctx, &expr); + + // Add byte code for storing value of expression in variable + ctx.bc.AddCode(&lexpr.bc); + lexpr.type.stackOffset = (short)v->stackOffset; + + PerformAssignment(&lexpr.type, &expr.type, &ctx.bc, node->prev); + + // Release temporary variables used by expression + ReleaseTemporaryVariable(expr.type, &ctx.bc); + + ctx.bc.Pop(expr.type.dataType.GetSizeOnStackDWords()); + + ProcessDeferredParams(&ctx); + } + } + } + + node = node->next; + } + + bc->AddCode(&ctx.bc); + + // TODO: Can't this leave deferred output params without being compiled? + } + } +} + +void asCCompiler::CompileInitList(asCTypeInfo *var, asCScriptNode *node, asCByteCode *bc) +{ + if( var->dataType.IsArrayType() && !var->dataType.IsObjectHandle() ) + { + // Count the number of elements and initialize the array with the correct size + int countElements = 0; + asCScriptNode *el = node->firstChild; + while( el ) + { + countElements++; + el = el->next; + } + + // Construct the array with the size elements + + // Find the constructor that takes an uint + asCArray funcs; + if( var->dataType.GetObjectType()->flags & asOBJ_REF ) + funcs = var->dataType.GetBehaviour()->factories; + else + funcs = var->dataType.GetBehaviour()->constructors; + + asCArray args; + asSExprContext arg1(engine); + arg1.bc.InstrDWORD(asBC_PshC4, countElements); + arg1.type.Set(asCDataType::CreatePrimitive(ttUInt, false)); + args.PushLast(&arg1); + + asCString str = var->dataType.Format(); + MatchFunctions(funcs, args, node, str.AddressOf()); + + if( funcs.GetLength() == 1 ) + { + asSExprContext ctx(engine); + + if( var->dataType.GetObjectType()->flags & asOBJ_REF ) + { + PrepareFunctionCall(funcs[0], &ctx.bc, args); + MoveArgsToStack(funcs[0], &ctx.bc, args, false); + + if( var->isVariable ) + { + // Call factory and store the handle in the given variable + PerformFunctionCall(funcs[0], &ctx, false, &args, 0, true, var->stackOffset); + ctx.bc.Pop(AS_PTR_SIZE); + } + else + { + PerformFunctionCall(funcs[0], &ctx, false, &args); + + // Store the returned handle in the global variable + ctx.bc.Instr(asBC_RDSPTR); + // TODO: global: The global var address should be stored in the instruction directly + ctx.bc.InstrWORD(asBC_PGA, (asWORD)outFunc->GetGlobalVarPtrIndex(var->stackOffset)); + ctx.bc.InstrPTR(asBC_REFCPY, var->dataType.GetObjectType()); + ctx.bc.Pop(AS_PTR_SIZE); + ReleaseTemporaryVariable(ctx.type.stackOffset, &ctx.bc); + } + } + else + { + if( var->isVariable ) + ctx.bc.InstrSHORT(asBC_PSF, var->stackOffset); + else + // TODO: global: The global var address should be stored in the instruction directly + ctx.bc.InstrWORD(asBC_PGA, (asWORD)outFunc->GetGlobalVarPtrIndex(var->stackOffset)); + + PrepareFunctionCall(funcs[0], &ctx.bc, args); + MoveArgsToStack(funcs[0], &ctx.bc, args, false); + + PerformFunctionCall(funcs[0], &ctx, true, &args, var->dataType.GetObjectType()); + } + + bc->AddCode(&ctx.bc); + } + else + return; + + // Find the indexing operator that is not read-only that will be used for all elements + asCDataType retType; + retType = var->dataType.GetSubType(); + retType.MakeReference(true); + retType.MakeReadOnly(false); + int funcId = 0; + asSTypeBehaviour *beh = var->dataType.GetBehaviour(); + for( asUINT n = 0; n < beh->operators.GetLength(); n += 2 ) + { + if( asBEHAVE_INDEX == beh->operators[n] ) + { + asCScriptFunction *desc = builder->GetFunctionDescription(beh->operators[n+1]); + if( !desc->isReadOnly && + desc->parameterTypes.GetLength() == 1 && + (desc->parameterTypes[0] == asCDataType::CreatePrimitive(ttUInt, false) || + desc->parameterTypes[0] == asCDataType::CreatePrimitive(ttInt, false)) && + desc->returnType == retType ) + { + funcId = beh->operators[n+1]; + break; + } + } + } + + if( funcId == 0 ) + { + Error(TXT_NO_APPROPRIATE_INDEX_OPERATOR, node); + return; + } + + asUINT index = 0; + el = node->firstChild; + while( el ) + { + if( el->nodeType == snAssignment || el->nodeType == snInitList ) + { + asSExprContext lctx(engine); + asSExprContext rctx(engine); + + if( el->nodeType == snAssignment ) + { + // Compile the assignment expression + CompileAssignment(el, &rctx); + } + else if( el->nodeType == snInitList ) + { + int offset = AllocateVariable(var->dataType.GetSubType(), true); + + rctx.type.Set(var->dataType.GetSubType()); + rctx.type.isVariable = true; + rctx.type.isTemporary = true; + rctx.type.stackOffset = (short)offset; + + CompileInitList(&rctx.type, el, &rctx.bc); + + // Put the object on the stack + rctx.bc.InstrSHORT(asBC_PSF, rctx.type.stackOffset); + + // It is a reference that we place on the stack + rctx.type.dataType.MakeReference(true); + } + + // Compile the lvalue + lctx.bc.InstrDWORD(asBC_PshC4, index); + if( var->isVariable ) + lctx.bc.InstrSHORT(asBC_PSF, var->stackOffset); + else + // TODO: global: The global var address should be stored in the instruction directly + lctx.bc.InstrWORD(asBC_PGA, (asWORD)outFunc->GetGlobalVarPtrIndex(var->stackOffset)); + lctx.bc.Instr(asBC_RDSPTR); + lctx.bc.Call(asBC_CALLSYS, funcId, 1+AS_PTR_SIZE); + + if( !var->dataType.GetSubType().IsPrimitive() ) + lctx.bc.Instr(asBC_PshRPtr); + + lctx.type.Set(var->dataType.GetSubType()); + + if( !lctx.type.dataType.IsObject() || lctx.type.dataType.IsObjectHandle() ) + lctx.type.dataType.MakeReference(true); + + // If the element type is handles, then we're expected to do handle assignments + if( lctx.type.dataType.IsObjectHandle() ) + lctx.type.isExplicitHandle = true; + + asSExprContext ctx(engine); + DoAssignment(&ctx, &lctx, &rctx, el, el, ttAssignment, el); + + if( !lctx.type.dataType.IsPrimitive() ) + ctx.bc.Pop(AS_PTR_SIZE); + + // Release temporary variables used by expression + ReleaseTemporaryVariable(ctx.type, &ctx.bc); + + ProcessDeferredParams(&ctx); + + bc->AddCode(&ctx.bc); + } + + el = el->next; + index++; + } + } + else + { + asCString str; + str.Format(TXT_INIT_LIST_CANNOT_BE_USED_WITH_s, var->dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + } +} + +void asCCompiler::CompileStatement(asCScriptNode *statement, bool *hasReturn, asCByteCode *bc) +{ + *hasReturn = false; + + if( statement->nodeType == snStatementBlock ) + CompileStatementBlock(statement, true, hasReturn, bc); + else if( statement->nodeType == snIf ) + CompileIfStatement(statement, hasReturn, bc); + else if( statement->nodeType == snFor ) + CompileForStatement(statement, bc); + else if( statement->nodeType == snWhile ) + CompileWhileStatement(statement, bc); + else if( statement->nodeType == snDoWhile ) + CompileDoWhileStatement(statement, bc); + else if( statement->nodeType == snExpressionStatement ) + CompileExpressionStatement(statement, bc); + else if( statement->nodeType == snBreak ) + CompileBreakStatement(statement, bc); + else if( statement->nodeType == snContinue ) + CompileContinueStatement(statement, bc); + else if( statement->nodeType == snSwitch ) + CompileSwitchStatement(statement, hasReturn, bc); + else if( statement->nodeType == snReturn ) + { + CompileReturnStatement(statement, bc); + *hasReturn = true; + } +} + +void asCCompiler::CompileSwitchStatement(asCScriptNode *snode, bool *, asCByteCode *bc) +{ + // TODO: inheritance: Must guarantee that all options in the switch case call a constructor, or that none call it. + + // Reserve label for break statements + int breakLabel = nextLabel++; + breakLabels.PushLast(breakLabel); + + // Add a variable scope that will be used by CompileBreak + // to know where to stop deallocating variables + AddVariableScope(true, false); + + //--------------------------- + // Compile the switch expression + //------------------------------- + + // Compile the switch expression + asSExprContext expr(engine); + CompileAssignment(snode->firstChild, &expr); + + // Verify that the expression is a primitive type + if( !expr.type.dataType.IsIntegerType() && !expr.type.dataType.IsUnsignedType() && !expr.type.dataType.IsEnumType() ) + { + Error(TXT_SWITCH_MUST_BE_INTEGRAL, snode->firstChild); + return; + } + + // TODO: Need to support 64bit + // Convert the expression to a 32bit variable + asCDataType to; + if( expr.type.dataType.IsIntegerType() || expr.type.dataType.IsEnumType() ) + to.SetTokenType(ttInt); + else if( expr.type.dataType.IsUnsignedType() ) + to.SetTokenType(ttUInt); + ImplicitConversion(&expr, to, snode->firstChild, asIC_IMPLICIT_CONV, true); + + ConvertToVariable(&expr); + int offset = expr.type.stackOffset; + + //------------------------------- + // Determine case values and labels + //-------------------------------- + + // Remember the first label so that we can later pass the + // correct label to each CompileCase() + int firstCaseLabel = nextLabel; + int defaultLabel = 0; + + asCArray caseValues; + asCArray caseLabels; + + // Compile all case comparisons and make them jump to the right label + asCScriptNode *cnode = snode->firstChild->next; + while( cnode ) + { + // Each case should have a constant expression + if( cnode->firstChild && cnode->firstChild->nodeType == snExpression ) + { + // Compile expression + asSExprContext c(engine); + CompileExpression(cnode->firstChild, &c); + + // Verify that the result is a constant + if( !c.type.isConstant ) + Error(TXT_SWITCH_CASE_MUST_BE_CONSTANT, cnode->firstChild); + + // Verify that the result is an integral number + if( !c.type.dataType.IsIntegerType() && !c.type.dataType.IsUnsignedType() && !c.type.dataType.IsEnumType() ) + Error(TXT_SWITCH_MUST_BE_INTEGRAL, cnode->firstChild); + + ImplicitConversion(&c, to, cnode->firstChild, asIC_IMPLICIT_CONV, true); + + // Has this case been declared already? + if( caseValues.IndexOf(c.type.intValue) >= 0 ) + { + Error(TXT_DUPLICATE_SWITCH_CASE, cnode->firstChild); + } + + // TODO: Optimize: We can insert the numbers sorted already + + // Store constant for later use + caseValues.PushLast(c.type.intValue); + + // Reserve label for this case + caseLabels.PushLast(nextLabel++); + } + else + { + // Is default the last case? + if( cnode->next ) + { + Error(TXT_DEFAULT_MUST_BE_LAST, cnode); + break; + } + + // Reserve label for this case + defaultLabel = nextLabel++; + } + + cnode = cnode->next; + } + + // check for empty switch + if (caseValues.GetLength() == 0) + { + Error(TXT_EMPTY_SWITCH, snode); + return; + } + + if( defaultLabel == 0 ) + defaultLabel = breakLabel; + + //--------------------------------- + // Output the optimized case comparisons + // with jumps to the case code + //------------------------------------ + + // Sort the case values by increasing value. Do the sort together with the labels + // A simple bubble sort is sufficient since we don't expect a huge number of values + for( asUINT fwd = 1; fwd < caseValues.GetLength(); fwd++ ) + { + for( int bck = fwd - 1; bck >= 0; bck-- ) + { + int bckp = bck + 1; + if( caseValues[bck] > caseValues[bckp] ) + { + // Swap the values in both arrays + int swap = caseValues[bckp]; + caseValues[bckp] = caseValues[bck]; + caseValues[bck] = swap; + + swap = caseLabels[bckp]; + caseLabels[bckp] = caseLabels[bck]; + caseLabels[bck] = swap; + } + else + break; + } + } + + // Find ranges of consecutive numbers + asCArray ranges; + ranges.PushLast(0); + asUINT n; + for( n = 1; n < caseValues.GetLength(); ++n ) + { + // We can join numbers that are less than 5 numbers + // apart since the output code will still be smaller + if( caseValues[n] > caseValues[n-1] + 5 ) + ranges.PushLast(n); + } + + // If the value is larger than the largest case value, jump to default + int tmpOffset = AllocateVariable(asCDataType::CreatePrimitive(ttInt, false), true); + expr.bc.InstrSHORT_DW(asBC_SetV4, (short)tmpOffset, caseValues[caseValues.GetLength()-1]); + expr.bc.InstrW_W(asBC_CMPi, offset, tmpOffset); + expr.bc.InstrDWORD(asBC_JP, defaultLabel); + ReleaseTemporaryVariable(tmpOffset, &expr.bc); + + // TODO: optimize: We could possibly optimize this even more by doing a + // binary search instead of a linear search through the ranges + + // For each range + int range; + for( range = 0; range < (int)ranges.GetLength(); range++ ) + { + // Find the largest value in this range + int maxRange = caseValues[ranges[range]]; + int index = ranges[range]; + for( ; (index < (int)caseValues.GetLength()) && (caseValues[index] <= maxRange + 5); index++ ) + maxRange = caseValues[index]; + + // If there are only 2 numbers then it is better to compare them directly + if( index - ranges[range] > 2 ) + { + // If the value is smaller than the smallest case value in the range, jump to default + tmpOffset = AllocateVariable(asCDataType::CreatePrimitive(ttInt, false), true); + expr.bc.InstrSHORT_DW(asBC_SetV4, (short)tmpOffset, caseValues[ranges[range]]); + expr.bc.InstrW_W(asBC_CMPi, offset, tmpOffset); + expr.bc.InstrDWORD(asBC_JS, defaultLabel); + ReleaseTemporaryVariable(tmpOffset, &expr.bc); + + int nextRangeLabel = nextLabel++; + // If this is the last range we don't have to make this test + if( range < (int)ranges.GetLength() - 1 ) + { + // If the value is larger than the largest case value in the range, jump to the next range + tmpOffset = AllocateVariable(asCDataType::CreatePrimitive(ttInt, false), true); + expr.bc.InstrSHORT_DW(asBC_SetV4, (short)tmpOffset, maxRange); + expr.bc.InstrW_W(asBC_CMPi, offset, tmpOffset); + expr.bc.InstrDWORD(asBC_JP, nextRangeLabel); + ReleaseTemporaryVariable(tmpOffset, &expr.bc); + } + + // Jump forward according to the value + tmpOffset = AllocateVariable(asCDataType::CreatePrimitive(ttInt, false), true); + expr.bc.InstrSHORT_DW(asBC_SetV4, (short)tmpOffset, caseValues[ranges[range]]); + expr.bc.InstrW_W_W(asBC_SUBi, tmpOffset, offset, tmpOffset); + ReleaseTemporaryVariable(tmpOffset, &expr.bc); + expr.bc.JmpP(tmpOffset, maxRange - caseValues[ranges[range]]); + + // Add the list of jumps to the correct labels (any holes, jump to default) + index = ranges[range]; + for( int n = caseValues[index]; n <= maxRange; n++ ) + { + if( caseValues[index] == n ) + expr.bc.InstrINT(asBC_JMP, caseLabels[index++]); + else + expr.bc.InstrINT(asBC_JMP, defaultLabel); + } + + expr.bc.Label((short)nextRangeLabel); + } + else + { + // Simply make a comparison with each value + int n; + for( n = ranges[range]; n < index; ++n ) + { + tmpOffset = AllocateVariable(asCDataType::CreatePrimitive(ttInt, false), true); + expr.bc.InstrSHORT_DW(asBC_SetV4, (short)tmpOffset, caseValues[n]); + expr.bc.InstrW_W(asBC_CMPi, offset, tmpOffset); + expr.bc.InstrDWORD(asBC_JZ, caseLabels[n]); + ReleaseTemporaryVariable(tmpOffset, &expr.bc); + } + } + } + + // Catch any value that falls trough + expr.bc.InstrINT(asBC_JMP, defaultLabel); + + // Release the temporary variable previously stored + ReleaseTemporaryVariable(expr.type, &expr.bc); + + //---------------------------------- + // Output case implementations + //---------------------------------- + + // Compile case implementations, each one with the label before it + cnode = snode->firstChild->next; + while( cnode ) + { + // Each case should have a constant expression + if( cnode->firstChild && cnode->firstChild->nodeType == snExpression ) + { + expr.bc.Label((short)firstCaseLabel++); + + CompileCase(cnode->firstChild->next, &expr.bc); + } + else + { + expr.bc.Label((short)defaultLabel); + + // Is default the last case? + if( cnode->next ) + { + // We've already reported this error + break; + } + + CompileCase(cnode->firstChild, &expr.bc); + } + + cnode = cnode->next; + } + + //-------------------------------- + + bc->AddCode(&expr.bc); + + // Add break label + bc->Label((short)breakLabel); + + breakLabels.PopLast(); + RemoveVariableScope(); +} + +void asCCompiler::CompileCase(asCScriptNode *node, asCByteCode *bc) +{ + bool isFinished = false; + bool hasReturn = false; + while( node ) + { + if( hasReturn || isFinished ) + { + Warning(TXT_UNREACHABLE_CODE, node); + break; + } + + if( node->nodeType == snBreak || node->nodeType == snContinue ) + isFinished = true; + + asCByteCode statement(engine); + CompileStatement(node, &hasReturn, &statement); + + LineInstr(bc, node->tokenPos); + bc->AddCode(&statement); + + if( !hasCompileErrors ) + asASSERT( tempVariables.GetLength() == 0 ); + + node = node->next; + } +} + +void asCCompiler::CompileIfStatement(asCScriptNode *inode, bool *hasReturn, asCByteCode *bc) +{ + // We will use one label for the if statement + // and possibly another for the else statement + int afterLabel = nextLabel++; + + // Compile the expression + asSExprContext expr(engine); + CompileAssignment(inode->firstChild, &expr); + if( !expr.type.dataType.IsEqualExceptRefAndConst(asCDataType::CreatePrimitive(ttBool, true)) ) + { + Error(TXT_EXPR_MUST_BE_BOOL, inode->firstChild); + expr.type.SetConstantDW(asCDataType::CreatePrimitive(ttBool, true), 1); + } + + if( expr.type.dataType.IsReference() ) ConvertToVariable(&expr); + ProcessDeferredParams(&expr); + + if( !expr.type.isConstant ) + { + ProcessPropertyGetAccessor(&expr, inode); + + ConvertToVariable(&expr); + + // Add byte code from the expression + bc->AddCode(&expr.bc); + + // Add a test + bc->InstrSHORT(asBC_CpyVtoR4, expr.type.stackOffset); + bc->Instr(asBC_ClrHi); + bc->InstrDWORD(asBC_JZ, afterLabel); + ReleaseTemporaryVariable(expr.type, bc); + } + else if( expr.type.dwordValue == 0 ) + { + // Jump to the else case + bc->InstrINT(asBC_JMP, afterLabel); + + // TODO: Should we warn? + } + + // Compile the if statement + bool origIsConstructorCalled = m_isConstructorCalled; + + bool hasReturn1; + asCByteCode ifBC(engine); + CompileStatement(inode->firstChild->next, &hasReturn1, &ifBC); + + // Add the byte code + LineInstr(bc, inode->firstChild->next->tokenPos); + bc->AddCode(&ifBC); + + if( inode->firstChild->next->nodeType == snExpressionStatement && inode->firstChild->next->firstChild == 0 ) + { + // Don't allow if( expr ); + Error(TXT_IF_WITH_EMPTY_STATEMENT, inode->firstChild->next); + } + + // If one of the statements call the constructor, the other must as well + // otherwise it is possible the constructor is never called + bool constructorCall1 = false; + bool constructorCall2 = false; + if( !origIsConstructorCalled && m_isConstructorCalled ) + constructorCall1 = true; + + // Do we have an else statement? + if( inode->firstChild->next != inode->lastChild ) + { + // Reset the constructor called flag so the else statement can call the constructor too + m_isConstructorCalled = origIsConstructorCalled; + + int afterElse = 0; + if( !hasReturn1 ) + { + afterElse = nextLabel++; + + // Add jump to after the else statement + bc->InstrINT(asBC_JMP, afterElse); + } + + // Add label for the else statement + bc->Label((short)afterLabel); + + bool hasReturn2; + asCByteCode elseBC(engine); + CompileStatement(inode->lastChild, &hasReturn2, &elseBC); + + // Add byte code for the else statement + LineInstr(bc, inode->lastChild->tokenPos); + bc->AddCode(&elseBC); + + if( inode->lastChild->nodeType == snExpressionStatement && inode->lastChild->firstChild == 0 ) + { + // Don't allow if( expr ) {} else; + Error(TXT_ELSE_WITH_EMPTY_STATEMENT, inode->lastChild); + } + + if( !hasReturn1 ) + { + // Add label for the end of else statement + bc->Label((short)afterElse); + } + + // The if statement only has return if both alternatives have + *hasReturn = hasReturn1 && hasReturn2; + + if( !origIsConstructorCalled && m_isConstructorCalled ) + constructorCall2 = true; + } + else + { + // Add label for the end of if statement + bc->Label((short)afterLabel); + *hasReturn = false; + } + + // Make sure both or neither conditions call a constructor + if( (constructorCall1 && !constructorCall2) || + (constructorCall2 && !constructorCall1) ) + { + Error(TXT_BOTH_CONDITIONS_MUST_CALL_CONSTRUCTOR, inode); + } + + m_isConstructorCalled = origIsConstructorCalled || constructorCall1 || constructorCall2; +} + +void asCCompiler::CompileForStatement(asCScriptNode *fnode, asCByteCode *bc) +{ + // Add a variable scope that will be used by CompileBreak/Continue to know where to stop deallocating variables + AddVariableScope(true, true); + + // We will use three labels for the for loop + int beforeLabel = nextLabel++; + int afterLabel = nextLabel++; + int continueLabel = nextLabel++; + + continueLabels.PushLast(continueLabel); + breakLabels.PushLast(afterLabel); + + //--------------------------------------- + // Compile the initialization statement + asCByteCode initBC(engine); + if( fnode->firstChild->nodeType == snDeclaration ) + CompileDeclaration(fnode->firstChild, &initBC); + else + CompileExpressionStatement(fnode->firstChild, &initBC); + + //----------------------------------- + // Compile the condition statement + asSExprContext expr(engine); + asCScriptNode *second = fnode->firstChild->next; + if( second->firstChild ) + { + int r = CompileAssignment(second->firstChild, &expr); + if( r >= 0 ) + { + if( !expr.type.dataType.IsEqualExceptRefAndConst(asCDataType::CreatePrimitive(ttBool, true)) ) + Error(TXT_EXPR_MUST_BE_BOOL, second); + else + { + if( expr.type.dataType.IsReference() ) ConvertToVariable(&expr); + ProcessDeferredParams(&expr); + + // If expression is false exit the loop + ConvertToVariable(&expr); + expr.bc.InstrSHORT(asBC_CpyVtoR4, expr.type.stackOffset); + expr.bc.Instr(asBC_ClrHi); + expr.bc.InstrDWORD(asBC_JZ, afterLabel); + ReleaseTemporaryVariable(expr.type, &expr.bc); + } + } + } + + //--------------------------- + // Compile the increment statement + asCByteCode nextBC(engine); + asCScriptNode *third = second->next; + if( third->nodeType == snExpressionStatement ) + CompileExpressionStatement(third, &nextBC); + + //------------------------------ + // Compile loop statement + bool hasReturn; + asCByteCode forBC(engine); + CompileStatement(fnode->lastChild, &hasReturn, &forBC); + + //------------------------------- + // Join the code pieces + bc->AddCode(&initBC); + bc->Label((short)beforeLabel); + + // Add a suspend bytecode inside the loop to guarantee + // that the application can suspend the execution + bc->Instr(asBC_SUSPEND); + bc->InstrWORD(asBC_JitEntry, 0); + + + bc->AddCode(&expr.bc); + LineInstr(bc, fnode->lastChild->tokenPos); + bc->AddCode(&forBC); + bc->Label((short)continueLabel); + bc->AddCode(&nextBC); + bc->InstrINT(asBC_JMP, beforeLabel); + bc->Label((short)afterLabel); + + continueLabels.PopLast(); + breakLabels.PopLast(); + + // Deallocate variables in this block, in reverse order + for( int n = (int)variables->variables.GetLength() - 1; n >= 0; n-- ) + { + sVariable *v = variables->variables[n]; + + // Call variable destructors here, for variables not yet destroyed + CallDestructor(v->type, v->stackOffset, bc); + + // Don't deallocate function parameters + if( v->stackOffset > 0 ) + DeallocateVariable(v->stackOffset); + } + + RemoveVariableScope(); +} + +void asCCompiler::CompileWhileStatement(asCScriptNode *wnode, asCByteCode *bc) +{ + // Add a variable scope that will be used by CompileBreak/Continue to know where to stop deallocating variables + AddVariableScope(true, true); + + // We will use two labels for the while loop + int beforeLabel = nextLabel++; + int afterLabel = nextLabel++; + + continueLabels.PushLast(beforeLabel); + breakLabels.PushLast(afterLabel); + + // Add label before the expression + bc->Label((short)beforeLabel); + + // Compile expression + asSExprContext expr(engine); + CompileAssignment(wnode->firstChild, &expr); + if( !expr.type.dataType.IsEqualExceptRefAndConst(asCDataType::CreatePrimitive(ttBool, true)) ) + Error(TXT_EXPR_MUST_BE_BOOL, wnode->firstChild); + + if( expr.type.dataType.IsReference() ) ConvertToVariable(&expr); + ProcessDeferredParams(&expr); + + // Add byte code for the expression + ConvertToVariable(&expr); + bc->AddCode(&expr.bc); + + // Jump to end of statement if expression is false + bc->InstrSHORT(asBC_CpyVtoR4, expr.type.stackOffset); + bc->Instr(asBC_ClrHi); + bc->InstrDWORD(asBC_JZ, afterLabel); + ReleaseTemporaryVariable(expr.type, bc); + + // Add a suspend bytecode inside the loop to guarantee + // that the application can suspend the execution + bc->Instr(asBC_SUSPEND); + bc->InstrWORD(asBC_JitEntry, 0); + + // Compile statement + bool hasReturn; + asCByteCode whileBC(engine); + CompileStatement(wnode->lastChild, &hasReturn, &whileBC); + + // Add byte code for the statement + LineInstr(bc, wnode->lastChild->tokenPos); + bc->AddCode(&whileBC); + + // Jump to the expression + bc->InstrINT(asBC_JMP, beforeLabel); + + // Add label after the statement + bc->Label((short)afterLabel); + + continueLabels.PopLast(); + breakLabels.PopLast(); + + RemoveVariableScope(); +} + +void asCCompiler::CompileDoWhileStatement(asCScriptNode *wnode, asCByteCode *bc) +{ + // Add a variable scope that will be used by CompileBreak/Continue to know where to stop deallocating variables + AddVariableScope(true, true); + + // We will use two labels for the while loop + int beforeLabel = nextLabel++; + int beforeTest = nextLabel++; + int afterLabel = nextLabel++; + + continueLabels.PushLast(beforeTest); + breakLabels.PushLast(afterLabel); + + // Add label before the statement + bc->Label((short)beforeLabel); + + // Compile statement + bool hasReturn; + asCByteCode whileBC(engine); + CompileStatement(wnode->firstChild, &hasReturn, &whileBC); + + // Add byte code for the statement + LineInstr(bc, wnode->firstChild->tokenPos); + bc->AddCode(&whileBC); + + // Add label before the expression + bc->Label((short)beforeTest); + + // Add a suspend bytecode inside the loop to guarantee + // that the application can suspend the execution + bc->Instr(asBC_SUSPEND); + bc->InstrWORD(asBC_JitEntry, 0); + + // Add a line instruction + LineInstr(bc, wnode->lastChild->tokenPos); + + // Compile expression + asSExprContext expr(engine); + CompileAssignment(wnode->lastChild, &expr); + if( !expr.type.dataType.IsEqualExceptRefAndConst(asCDataType::CreatePrimitive(ttBool, true)) ) + Error(TXT_EXPR_MUST_BE_BOOL, wnode->firstChild); + + if( expr.type.dataType.IsReference() ) ConvertToVariable(&expr); + ProcessDeferredParams(&expr); + + // Add byte code for the expression + ConvertToVariable(&expr); + bc->AddCode(&expr.bc); + + // Jump to next iteration if expression is true + bc->InstrSHORT(asBC_CpyVtoR4, expr.type.stackOffset); + bc->Instr(asBC_ClrHi); + bc->InstrDWORD(asBC_JNZ, beforeLabel); + ReleaseTemporaryVariable(expr.type, bc); + + // Add label after the statement + bc->Label((short)afterLabel); + + continueLabels.PopLast(); + breakLabels.PopLast(); + + RemoveVariableScope(); +} + +void asCCompiler::CompileBreakStatement(asCScriptNode *node, asCByteCode *bc) +{ + if( breakLabels.GetLength() == 0 ) + { + Error(TXT_INVALID_BREAK, node); + return; + } + + // Add destructor calls for all variables that will go out of scope + asCVariableScope *vs = variables; + while( !vs->isBreakScope ) + { + for( int n = (int)vs->variables.GetLength() - 1; n >= 0; n-- ) + CallDestructor(vs->variables[n]->type, vs->variables[n]->stackOffset, bc); + + vs = vs->parent; + } + + bc->InstrINT(asBC_JMP, breakLabels[breakLabels.GetLength()-1]); +} + +void asCCompiler::CompileContinueStatement(asCScriptNode *node, asCByteCode *bc) +{ + if( continueLabels.GetLength() == 0 ) + { + Error(TXT_INVALID_CONTINUE, node); + return; + } + + // Add destructor calls for all variables that will go out of scope + asCVariableScope *vs = variables; + while( !vs->isContinueScope ) + { + for( int n = (int)vs->variables.GetLength() - 1; n >= 0; n-- ) + CallDestructor(vs->variables[n]->type, vs->variables[n]->stackOffset, bc); + + vs = vs->parent; + } + + bc->InstrINT(asBC_JMP, continueLabels[continueLabels.GetLength()-1]); +} + +void asCCompiler::CompileExpressionStatement(asCScriptNode *enode, asCByteCode *bc) +{ + if( enode->firstChild ) + { + // Compile the expression + asSExprContext expr(engine); + CompileAssignment(enode->firstChild, &expr); + + // Pop the value from the stack + if( !expr.type.dataType.IsPrimitive() ) + expr.bc.Pop(expr.type.dataType.GetSizeOnStackDWords()); + + // Release temporary variables used by expression + ReleaseTemporaryVariable(expr.type, &expr.bc); + + ProcessDeferredParams(&expr); + + bc->AddCode(&expr.bc); + } +} + +void asCCompiler::PrepareTemporaryObject(asCScriptNode *node, asSExprContext *ctx, asCArray *reservedVars) +{ + // If the object already is stored in temporary variable then nothing needs to be done + if( ctx->type.isTemporary ) return; + + // Allocate temporary variable + asCDataType dt = ctx->type.dataType; + dt.MakeReference(false); + dt.MakeReadOnly(false); + + int offset = AllocateVariableNotIn(dt, true, reservedVars); + + // Allocate and construct the temporary object + CallDefaultConstructor(dt, offset, &ctx->bc, node); + + // Assign the object to the temporary variable + asCTypeInfo lvalue; + dt.MakeReference(true); + lvalue.Set(dt); + lvalue.isTemporary = true; + lvalue.stackOffset = (short)offset; + lvalue.isVariable = true; + lvalue.isExplicitHandle = ctx->type.isExplicitHandle; + + PrepareForAssignment(&lvalue.dataType, ctx, node); + + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + PerformAssignment(&lvalue, &ctx->type, &ctx->bc, node); + + // Pop the original reference + ctx->bc.Pop(AS_PTR_SIZE); + + // Push the reference to the temporary variable on the stack + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + lvalue.dataType.MakeReference(true); + + ctx->type = lvalue; +} + +void asCCompiler::CompileReturnStatement(asCScriptNode *rnode, asCByteCode *bc) +{ + // Get return type and location + sVariable *v = variables->GetVariable("return"); + if( v->type.GetSizeOnStackDWords() > 0 ) + { + // Is there an expression? + if( rnode->firstChild ) + { + // Compile the expression + asSExprContext expr(engine); + int r = CompileAssignment(rnode->firstChild, &expr); + if( r >= 0 ) + { + // Prepare the value for assignment + IsVariableInitialized(&expr.type, rnode->firstChild); + + if( v->type.IsPrimitive() ) + { + if( expr.type.dataType.IsReference() ) ConvertToVariable(&expr); + + // Implicitly convert the value to the return type + ImplicitConversion(&expr, v->type, rnode->firstChild, asIC_IMPLICIT_CONV); + + // Verify that the conversion was successful + if( expr.type.dataType != v->type ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, expr.type.dataType.Format().AddressOf(), v->type.Format().AddressOf()); + Error(str.AddressOf(), rnode); + r = -1; + } + else + { + ConvertToVariable(&expr); + ReleaseTemporaryVariable(expr.type, &expr.bc); + + // Load the variable in the register + if( v->type.GetSizeOnStackDWords() == 1 ) + expr.bc.InstrSHORT(asBC_CpyVtoR4, expr.type.stackOffset); + else + expr.bc.InstrSHORT(asBC_CpyVtoR8, expr.type.stackOffset); + } + } + else if( v->type.IsObject() ) + { + PrepareArgument(&v->type, &expr, rnode->firstChild); + + // Pop the reference to the temporary variable again + expr.bc.Pop(AS_PTR_SIZE); + + // Load the object pointer into the object register + // LOADOBJ also clears the address in the variable + expr.bc.InstrSHORT(asBC_LOADOBJ, expr.type.stackOffset); + + // LOADOBJ cleared the address in the variable so the object will not be freed + // here, but the temporary variable must still be freed + + // TODO: optimize: Since there is nothing in the variable anymore, + // there is no need to call asBC_FREE on it. + } + + // Release temporary variables used by expression + ReleaseTemporaryVariable(expr.type, &expr.bc); + + bc->AddCode(&expr.bc); + } + } + else + Error(TXT_MUST_RETURN_VALUE, rnode); + } + else + if( rnode->firstChild ) + Error(TXT_CANT_RETURN_VALUE, rnode); + + // Call destructor on all variables except for the function parameters + asCVariableScope *vs = variables; + while( vs ) + { + for( int n = (int)vs->variables.GetLength() - 1; n >= 0; n-- ) + if( vs->variables[n]->stackOffset > 0 ) + CallDestructor(vs->variables[n]->type, vs->variables[n]->stackOffset, bc); + + vs = vs->parent; + } + + // Jump to the end of the function + bc->InstrINT(asBC_JMP, 0); +} + +void asCCompiler::AddVariableScope(bool isBreakScope, bool isContinueScope) +{ + variables = asNEW(asCVariableScope)(variables); + variables->isBreakScope = isBreakScope; + variables->isContinueScope = isContinueScope; +} + +void asCCompiler::RemoveVariableScope() +{ + if( variables ) + { + asCVariableScope *var = variables; + variables = variables->parent; + asDELETE(var,asCVariableScope); + } +} + +void asCCompiler::Error(const char *msg, asCScriptNode *node) +{ + asCString str; + + int r, c; + script->ConvertPosToRowCol(node->tokenPos, &r, &c); + + builder->WriteError(script->name.AddressOf(), msg, r, c); + + hasCompileErrors = true; +} + +void asCCompiler::Warning(const char *msg, asCScriptNode *node) +{ + asCString str; + + int r, c; + script->ConvertPosToRowCol(node->tokenPos, &r, &c); + + builder->WriteWarning(script->name.AddressOf(), msg, r, c); +} + +void asCCompiler::PrintMatchingFuncs(asCArray &funcs, asCScriptNode *node) +{ + int r, c; + script->ConvertPosToRowCol(node->tokenPos, &r, &c); + + for( unsigned int n = 0; n < funcs.GetLength(); n++ ) + { + asIScriptFunction *func = engine->scriptFunctions[funcs[n]]; + + builder->WriteInfo(script->name.AddressOf(), func->GetDeclaration(true), r, c, false); + } +} + +int asCCompiler::AllocateVariable(const asCDataType &type, bool isTemporary) +{ + return AllocateVariableNotIn(type, isTemporary, 0); +} + +int asCCompiler::AllocateVariableNotIn(const asCDataType &type, bool isTemporary, asCArray *vars) +{ + asCDataType t(type); + + if( t.IsPrimitive() && t.GetSizeOnStackDWords() == 1 ) + t.SetTokenType(ttInt); + + if( t.IsPrimitive() && t.GetSizeOnStackDWords() == 2 ) + t.SetTokenType(ttDouble); + + // Find a free location with the same type + for( asUINT n = 0; n < freeVariables.GetLength(); n++ ) + { + int slot = freeVariables[n]; + if( variableAllocations[slot].IsEqualExceptConst(t) && variableIsTemporary[slot] == isTemporary ) + { + // We can't return by slot, must count variable sizes + int offset = GetVariableOffset(slot); + + // Verify that it is not in the list of used variables + bool isUsed = false; + if( vars ) + { + for( asUINT m = 0; m < vars->GetLength(); m++ ) + { + if( offset == (*vars)[m] ) + { + isUsed = true; + break; + } + } + } + + if( !isUsed ) + { + if( n != freeVariables.GetLength() - 1 ) + freeVariables[n] = freeVariables.PopLast(); + else + freeVariables.PopLast(); + + if( isTemporary ) + tempVariables.PushLast(offset); + + return offset; + } + } + } + + variableAllocations.PushLast(t); + variableIsTemporary.PushLast(isTemporary); + + int offset = GetVariableOffset((int)variableAllocations.GetLength()-1); + + if( isTemporary ) + tempVariables.PushLast(offset); + + return offset; +} + +int asCCompiler::GetVariableOffset(int varIndex) +{ + // Return offset to the last dword on the stack + int varOffset = 1; + for( int n = 0; n < varIndex; n++ ) + varOffset += variableAllocations[n].GetSizeOnStackDWords(); + + if( varIndex < (int)variableAllocations.GetLength() ) + { + int size = variableAllocations[varIndex].GetSizeOnStackDWords(); + if( size > 1 ) + varOffset += size-1; + } + + return varOffset; +} + +int asCCompiler::GetVariableSlot(int offset) +{ + int varOffset = 1; + for( asUINT n = 0; n < variableAllocations.GetLength(); n++ ) + { + varOffset += -1 + variableAllocations[n].GetSizeOnStackDWords(); + if( varOffset == offset ) + { + return n; + } + varOffset++; + } + + return -1; +} + +void asCCompiler::DeallocateVariable(int offset) +{ + // Remove temporary variable + int n; + for( n = 0; n < (int)tempVariables.GetLength(); n++ ) + { + if( offset == tempVariables[n] ) + { + if( n == (int)tempVariables.GetLength()-1 ) + tempVariables.PopLast(); + else + tempVariables[n] = tempVariables.PopLast(); + break; + } + } + + n = GetVariableSlot(offset); + if( n != -1 ) + { + freeVariables.PushLast(n); + return; + } + + // We might get here if the variable was implicitly declared + // because it was use before a formal declaration, in this case + // the offset is 0x7FFF + + asASSERT(offset == 0x7FFF); +} + +void asCCompiler::ReleaseTemporaryVariable(asCTypeInfo &t, asCByteCode *bc) +{ + if( t.isTemporary ) + { + if( bc ) + { + // We need to call the destructor on the true variable type + int n = GetVariableSlot(t.stackOffset); + asCDataType dt = variableAllocations[n]; + + // Call destructor + CallDestructor(dt, t.stackOffset, bc); + } + + DeallocateVariable(t.stackOffset); + t.isTemporary = false; + } +} + +void asCCompiler::ReleaseTemporaryVariable(int offset, asCByteCode *bc) +{ + if( bc ) + { + // We need to call the destructor on the true variable type + int n = GetVariableSlot(offset); + asCDataType dt = variableAllocations[n]; + + // Call destructor + CallDestructor(dt, offset, bc); + } + + DeallocateVariable(offset); +} + +void asCCompiler::Dereference(asSExprContext *ctx, bool generateCode) +{ + if( ctx->type.dataType.IsReference() ) + { + if( ctx->type.dataType.IsObject() ) + { + ctx->type.dataType.MakeReference(false); + if( generateCode ) + { + ctx->bc.Instr(asBC_CHKREF); + ctx->bc.Instr(asBC_RDSPTR); + } + } + else + { + // This should never happen as primitives are treated differently + asASSERT(false); + } + } +} + + +bool asCCompiler::IsVariableInitialized(asCTypeInfo *type, asCScriptNode *node) +{ + // Temporary variables are assumed to be initialized + if( type->isTemporary ) return true; + + // Verify that it is a variable + if( !type->isVariable ) return true; + + // Find the variable + sVariable *v = variables->GetVariableByOffset(type->stackOffset); + + // The variable isn't found if it is a constant, in which case it is guaranteed to be initialized + if( v == 0 ) return true; + + if( v->isInitialized ) return true; + + // Complex types don't need this test + if( v->type.IsObject() ) return true; + + // Mark as initialized so that the user will not be bothered again + v->isInitialized = true; + + // Write warning + asCString str; + str.Format(TXT_s_NOT_INITIALIZED, (const char *)v->name.AddressOf()); + Warning(str.AddressOf(), node); + + return false; +} + +void asCCompiler::PrepareOperand(asSExprContext *ctx, asCScriptNode *node) +{ + // Check if the variable is initialized (if it indeed is a variable) + IsVariableInitialized(&ctx->type, node); + + asCDataType to = ctx->type.dataType; + to.MakeReference(false); + + ImplicitConversion(ctx, to, node, asIC_IMPLICIT_CONV); + + ProcessDeferredParams(ctx); +} + +void asCCompiler::PrepareForAssignment(asCDataType *lvalue, asSExprContext *rctx, asCScriptNode *node, asSExprContext *lvalueExpr) +{ + ProcessPropertyGetAccessor(rctx, node); + + // Make sure the rvalue is initialized if it is a variable + IsVariableInitialized(&rctx->type, node); + + if( lvalue->IsPrimitive() ) + { + if( rctx->type.dataType.IsPrimitive() ) + { + if( rctx->type.dataType.IsReference() ) + { + // Cannot do implicit conversion of references so we first convert the reference to a variable + ConvertToVariableNotIn(rctx, lvalueExpr); + } + } + + // Implicitly convert the value to the right type + asCArray usedVars; + if( lvalueExpr ) lvalueExpr->bc.GetVarsUsed(usedVars); + ImplicitConversion(rctx, *lvalue, node, asIC_IMPLICIT_CONV, true, &usedVars); + + // Check data type + if( !lvalue->IsEqualExceptRefAndConst(rctx->type.dataType) ) + { + asCString str; + str.Format(TXT_CANT_IMPLICITLY_CONVERT_s_TO_s, rctx->type.dataType.Format().AddressOf(), lvalue->Format().AddressOf()); + Error(str.AddressOf(), node); + + rctx->type.SetDummy(); + } + + // Make sure the rvalue is a variable + if( !rctx->type.isVariable ) + ConvertToVariableNotIn(rctx, lvalueExpr); + } + else + { + asCDataType to = *lvalue; + to.MakeReference(false); + + // TODO: ImplicitConversion should know to do this by itself + // First convert to a handle which will to a reference cast + if( !lvalue->IsObjectHandle() && + (lvalue->GetObjectType()->flags & asOBJ_SCRIPT_OBJECT) ) + to.MakeHandle(true); + + // Don't allow the implicit conversion to create an object + ImplicitConversion(rctx, to, node, asIC_IMPLICIT_CONV, true, 0, false); + + if( !lvalue->IsObjectHandle() && + (lvalue->GetObjectType()->flags & asOBJ_SCRIPT_OBJECT) ) + { + // Then convert to a reference, which will validate the handle + to.MakeHandle(false); + ImplicitConversion(rctx, to, node, asIC_IMPLICIT_CONV, true, 0, false); + } + + // Check data type + if( !lvalue->IsEqualExceptRefAndConst(rctx->type.dataType) ) + { + asCString str; + str.Format(TXT_CANT_IMPLICITLY_CONVERT_s_TO_s, rctx->type.dataType.Format().AddressOf(), lvalue->Format().AddressOf()); + Error(str.AddressOf(), node); + } + else + { + // If the assignment will be made with the copy behaviour then the rvalue must not be a reference + if( lvalue->IsObject() ) + asASSERT(!rctx->type.dataType.IsReference()); + } + } +} + +bool asCCompiler::IsLValue(asCTypeInfo &type) +{ + if( type.dataType.IsReadOnly() ) return false; + if( !type.dataType.IsObject() && !type.isVariable && !type.dataType.IsReference() ) return false; + if( type.isTemporary ) return false; + return true; +} + +void asCCompiler::PerformAssignment(asCTypeInfo *lvalue, asCTypeInfo *rvalue, asCByteCode *bc, asCScriptNode *node) +{ + if( lvalue->dataType.IsReadOnly() ) + Error(TXT_REF_IS_READ_ONLY, node); + + if( lvalue->dataType.IsPrimitive() ) + { + if( lvalue->isVariable ) + { + // Copy the value between the variables directly + if( lvalue->dataType.GetSizeInMemoryDWords() == 1 ) + bc->InstrW_W(asBC_CpyVtoV4, lvalue->stackOffset, rvalue->stackOffset); + else + bc->InstrW_W(asBC_CpyVtoV8, lvalue->stackOffset, rvalue->stackOffset); + + // Mark variable as initialized + sVariable *v = variables->GetVariableByOffset(lvalue->stackOffset); + if( v ) v->isInitialized = true; + } + else if( lvalue->dataType.IsReference() ) + { + // Copy the value of the variable to the reference in the register + int s = lvalue->dataType.GetSizeInMemoryBytes(); + if( s == 1 ) + bc->InstrSHORT(asBC_WRTV1, rvalue->stackOffset); + else if( s == 2 ) + bc->InstrSHORT(asBC_WRTV2, rvalue->stackOffset); + else if( s == 4 ) + bc->InstrSHORT(asBC_WRTV4, rvalue->stackOffset); + else if( s == 8 ) + bc->InstrSHORT(asBC_WRTV8, rvalue->stackOffset); + } + else + { + Error(TXT_NOT_VALID_LVALUE, node); + return; + } + } + else if( !lvalue->isExplicitHandle ) + { + // TODO: Call the assignment operator, or do a BC_COPY if none exist + + asSExprContext ctx(engine); + ctx.type = *lvalue; + Dereference(&ctx, true); + *lvalue = ctx.type; + bc->AddCode(&ctx.bc); + + // TODO: Can't this leave deferred output params unhandled? + + // TODO: Should find the opAssign method that implements the default copy behaviour. + // The beh->copy member will be removed. + asSTypeBehaviour *beh = lvalue->dataType.GetBehaviour(); + if( beh->copy ) + { + // Call the copy operator + bc->Call(asBC_CALLSYS, (asDWORD)beh->copy, 2*AS_PTR_SIZE); + bc->Instr(asBC_PshRPtr); + } + else + { + // Default copy operator + if( lvalue->dataType.GetSizeInMemoryDWords() == 0 || + !(lvalue->dataType.GetObjectType()->flags & asOBJ_POD) ) + { + Error(TXT_NO_DEFAULT_COPY_OP, node); + } + + // Copy larger data types from a reference + bc->InstrWORD(asBC_COPY, (asWORD)lvalue->dataType.GetSizeInMemoryDWords()); + } + } + else + { + // TODO: The object handle can be stored in a variable as well + if( !lvalue->dataType.IsReference() ) + { + Error(TXT_NOT_VALID_REFERENCE, node); + return; + } + + // TODO: Convert to register based + bc->InstrPTR(asBC_REFCPY, lvalue->dataType.GetObjectType()); + + // Mark variable as initialized + if( variables ) + { + sVariable *v = variables->GetVariableByOffset(lvalue->stackOffset); + if( v ) v->isInitialized = true; + } + } +} + +bool asCCompiler::CompileRefCast(asSExprContext *ctx, const asCDataType &to, bool isExplicit, asCScriptNode *node, bool generateCode) +{ + bool conversionDone = false; + + asCArray ops; + asUINT n; + + if( ctx->type.dataType.GetObjectType()->flags & asOBJ_SCRIPT_OBJECT ) + { + // We need it to be a reference + if( !ctx->type.dataType.IsReference() ) + { + asCDataType to = ctx->type.dataType; + to.MakeReference(true); + ImplicitConversion(ctx, to, 0, isExplicit ? asIC_EXPLICIT_REF_CAST : asIC_IMPLICIT_CONV, generateCode); + } + + if( isExplicit ) + { + // Allow dynamic cast between object handles (only for script objects). + // At run time this may result in a null handle, + // which when used will throw an exception + conversionDone = true; + if( generateCode ) + { + ctx->bc.InstrDWORD(asBC_Cast, engine->GetTypeIdFromDataType(to)); + + // Allocate a temporary variable for the returned object + int returnOffset = AllocateVariable(to, true); + + // Move the pointer from the object register to the temporary variable + ctx->bc.InstrSHORT(asBC_STOREOBJ, (short)returnOffset); + + ctx->bc.InstrSHORT(asBC_PSF, (short)returnOffset); + + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + + ctx->type.SetVariable(to, returnOffset, true); + ctx->type.dataType.MakeReference(true); + } + else + { + ctx->type.dataType = to; + ctx->type.dataType.MakeReference(true); + } + } + else + { + if( ctx->type.dataType.GetObjectType()->DerivesFrom(to.GetObjectType()) ) + { + conversionDone = true; + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + } + } + else + { + // Find a suitable registered behaviour + asSTypeBehaviour *beh = &ctx->type.dataType.GetObjectType()->beh; + for( n = 0; n < beh->operators.GetLength(); n+= 2 ) + { + if( (isExplicit && asBEHAVE_REF_CAST == beh->operators[n]) || + asBEHAVE_IMPLICIT_REF_CAST == beh->operators[n] ) + { + int funcId = beh->operators[n+1]; + + // Is the operator for the output type? + asCScriptFunction *func = engine->scriptFunctions[funcId]; + if( func->returnType.GetObjectType() != to.GetObjectType() ) + continue; + + ops.PushLast(funcId); + } + } + + // Should only have one behaviour for each output type + if( ops.GetLength() == 1 ) + { + if( generateCode ) + { + // Merge the bytecode so that it forms obj.castBehave() + asCTypeInfo objType = ctx->type; + asCArray args; + MakeFunctionCall(ctx, ops[0], objType.dataType.GetObjectType(), args, node); + + // Since we're receiving a handle, we can release the original variable + ReleaseTemporaryVariable(objType, &ctx->bc); + } + else + { + asCScriptFunction *func = engine->scriptFunctions[ops[0]]; + ctx->type.Set(func->returnType); + } + } + else if( ops.GetLength() > 1 ) + { + // It shouldn't be possible to have more than one, should it? + asASSERT( false ); + } + } + + return conversionDone; +} + + +// TODO: Re-think the implementation for implicit conversions +// It's currently inefficient and may at times generate unneeded copies of objects +// There are also too many different code paths to test, each working slightly differently +// +// Reference and handle-of should be treated last +// +// - The following conversion categories needs to be implemented in separate functions +// - primitive to primitive +// - primitive to value type +// - primitive to reference type +// - value type to value type +// - value type to primitive +// - value type to reference type +// - reference type to reference type +// - reference type to primitive +// - reference type to value type +// +// Explicit conversion and implicit conversion should use the same functions, only with a flag to enable/disable conversions +// +// If the conversion fails, the type in the asSExprContext must not be modified. This +// causes problems where the conversion is partially done and the compiler continues with +// another option. + +void asCCompiler::ImplicitConvPrimitiveToPrimitive(asSExprContext *ctx, const asCDataType &to, asCScriptNode *node, EImplicitConv convType, bool generateCode, asCArray *reservedVars) +{ + // Start by implicitly converting constant values + if( ctx->type.isConstant ) + ImplicitConversionConstant(ctx, to, node, convType); + + if( to == ctx->type.dataType ) + return; + + // After the constant value has been converted we have the following possibilities + + // Allow implicit conversion between numbers + if( generateCode ) + { + // Convert smaller types to 32bit first + int s = ctx->type.dataType.GetSizeInMemoryBytes(); + if( s < 4 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + if( ctx->type.dataType.IsIntegerType() ) + { + if( s == 1 ) + ctx->bc.InstrSHORT(asBC_sbTOi, ctx->type.stackOffset); + else if( s == 2 ) + ctx->bc.InstrSHORT(asBC_swTOi, ctx->type.stackOffset); + ctx->type.dataType.SetTokenType(ttInt); + } + else if( ctx->type.dataType.IsUnsignedType() ) + { + if( s == 1 ) + ctx->bc.InstrSHORT(asBC_ubTOi, ctx->type.stackOffset); + else if( s == 2 ) + ctx->bc.InstrSHORT(asBC_uwTOi, ctx->type.stackOffset); + ctx->type.dataType.SetTokenType(ttUInt); + } + } + + if( (to.IsIntegerType() && to.GetSizeInMemoryDWords() == 1) || + (to.IsEnumType() && convType == asIC_EXPLICIT_VAL_CAST) ) + { + if( ctx->type.dataType.IsIntegerType() || + ctx->type.dataType.IsUnsignedType() || + ctx->type.dataType.IsEnumType() ) + { + if( ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + else + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_i64TOi, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + } + else if( ctx->type.dataType.IsFloatType() ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ctx->bc.InstrSHORT(asBC_fTOi, ctx->type.stackOffset); + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + else if( ctx->type.dataType.IsDoubleType() ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_dTOi, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + + // Convert to smaller integer if necessary + int s = to.GetSizeInMemoryBytes(); + if( s < 4 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + if( s == 1 ) + ctx->bc.InstrSHORT(asBC_iTOb, ctx->type.stackOffset); + else if( s == 2 ) + ctx->bc.InstrSHORT(asBC_iTOw, ctx->type.stackOffset); + } + } + if( to.IsIntegerType() && to.GetSizeInMemoryDWords() == 2 ) + { + if( ctx->type.dataType.IsIntegerType() || + ctx->type.dataType.IsUnsignedType() || + ctx->type.dataType.IsEnumType() ) + { + if( ctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + else + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + if( ctx->type.dataType.IsUnsignedType() ) + ctx->bc.InstrW_W(asBC_uTOi64, offset, ctx->type.stackOffset); + else + ctx->bc.InstrW_W(asBC_iTOi64, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + } + else if( ctx->type.dataType.IsFloatType() ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_fTOi64, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + else if( ctx->type.dataType.IsDoubleType() ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ctx->bc.InstrSHORT(asBC_dTOi64, ctx->type.stackOffset); + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + } + else if( to.IsUnsignedType() && to.GetSizeInMemoryDWords() == 1 ) + { + if( ctx->type.dataType.IsIntegerType() || + ctx->type.dataType.IsUnsignedType() || + ctx->type.dataType.IsEnumType() ) + { + if( ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + else + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_i64TOi, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + } + else if( ctx->type.dataType.IsFloatType() ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ctx->bc.InstrSHORT(asBC_fTOu, ctx->type.stackOffset); + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + else if( ctx->type.dataType.IsDoubleType() ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_dTOu, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + + // Convert to smaller integer if necessary + int s = to.GetSizeInMemoryBytes(); + if( s < 4 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + if( s == 1 ) + ctx->bc.InstrSHORT(asBC_iTOb, ctx->type.stackOffset); + else if( s == 2 ) + ctx->bc.InstrSHORT(asBC_iTOw, ctx->type.stackOffset); + } + } + if( to.IsUnsignedType() && to.GetSizeInMemoryDWords() == 2 ) + { + if( ctx->type.dataType.IsIntegerType() || + ctx->type.dataType.IsUnsignedType() || + ctx->type.dataType.IsEnumType() ) + { + if( ctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + else + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + if( ctx->type.dataType.IsUnsignedType() ) + ctx->bc.InstrW_W(asBC_uTOi64, offset, ctx->type.stackOffset); + else + ctx->bc.InstrW_W(asBC_iTOi64, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + } + else if( ctx->type.dataType.IsFloatType() ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_fTOu64, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + else if( ctx->type.dataType.IsDoubleType() ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ctx->bc.InstrSHORT(asBC_dTOu64, ctx->type.stackOffset); + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + } + else if( to.IsFloatType() ) + { + if( (ctx->type.dataType.IsIntegerType() || ctx->type.dataType.IsEnumType()) && ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ctx->bc.InstrSHORT(asBC_iTOf, ctx->type.stackOffset); + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + else if( ctx->type.dataType.IsIntegerType() && ctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_i64TOf, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + else if( ctx->type.dataType.IsUnsignedType() && ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ctx->bc.InstrSHORT(asBC_uTOf, ctx->type.stackOffset); + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + else if( ctx->type.dataType.IsUnsignedType() && ctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_u64TOf, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + else if( ctx->type.dataType.IsDoubleType() ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_dTOf, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + } + else if( to.IsDoubleType() ) + { + if( (ctx->type.dataType.IsIntegerType() || ctx->type.dataType.IsEnumType()) && ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_iTOd, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + else if( ctx->type.dataType.IsIntegerType() && ctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ctx->bc.InstrSHORT(asBC_i64TOd, ctx->type.stackOffset); + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + else if( ctx->type.dataType.IsUnsignedType() && ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_uTOd, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + else if( ctx->type.dataType.IsUnsignedType() && ctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ctx->bc.InstrSHORT(asBC_u64TOd, ctx->type.stackOffset); + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + else if( ctx->type.dataType.IsFloatType() ) + { + ConvertToTempVariableNotIn(ctx, reservedVars); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + int offset = AllocateVariableNotIn(to, true, reservedVars); + ctx->bc.InstrW_W(asBC_fTOd, offset, ctx->type.stackOffset); + ctx->type.SetVariable(to, offset, true); + } + } + } + else + { + if( (to.IsIntegerType() || to.IsUnsignedType() || + to.IsFloatType() || to.IsDoubleType() || + (to.IsEnumType() && convType == asIC_EXPLICIT_VAL_CAST)) && + (ctx->type.dataType.IsIntegerType() || ctx->type.dataType.IsUnsignedType() || + ctx->type.dataType.IsFloatType() || ctx->type.dataType.IsDoubleType() || + ctx->type.dataType.IsEnumType()) ) + { + ctx->type.dataType.SetTokenType(to.GetTokenType()); + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + } + + // Primitive types on the stack, can be const or non-const + ctx->type.dataType.MakeReadOnly(to.IsReadOnly()); +} + +void asCCompiler::ImplicitConversion(asSExprContext *ctx, const asCDataType &to, asCScriptNode *node, EImplicitConv convType, bool generateCode, asCArray *reservedVars, bool allowObjectConstruct) +{ + // No conversion from void to any other type + if( ctx->type.dataType.GetTokenType() == ttVoid ) + return; + + // Do we want a var type? + if( to.GetTokenType() == ttQuestion ) + { + // Any type can be converted to a var type, but only when not generating code + asASSERT( !generateCode ); + + ctx->type.dataType = to; + + return; + } + // Do we want a primitive? + else if( to.IsPrimitive() ) + { + if( !ctx->type.dataType.IsPrimitive() ) + ImplicitConvObjectToPrimitive(ctx, to, node, convType, generateCode, reservedVars); + else + ImplicitConvPrimitiveToPrimitive(ctx, to, node, convType, generateCode, reservedVars); + } + else // The target is a complex type + { + if( ctx->type.dataType.IsPrimitive() ) + ImplicitConvPrimitiveToObject(ctx, to, node, convType, generateCode, reservedVars, allowObjectConstruct); + else + ImplicitConvObjectToObject(ctx, to, node, convType, generateCode, reservedVars, allowObjectConstruct); + } +} + +void asCCompiler::ImplicitConvObjectToPrimitive(asSExprContext *ctx, const asCDataType &to, asCScriptNode *node, EImplicitConv convType, bool generateCode, asCArray *reservedVars) +{ + if( ctx->type.isExplicitHandle ) + { + // An explicit handle cannot be converted to a primitive + if( convType != asIC_IMPLICIT_CONV && node ) + { + asCString str; + str.Format(TXT_CANT_IMPLICITLY_CONVERT_s_TO_s, ctx->type.dataType.Format().AddressOf(), to.Format().AddressOf()); + Error(str.AddressOf(), node); + } + return; + } + + // TODO: Must use the const cast behaviour if the object is read-only + + // Find matching value cast behaviours + // Here we're only interested in those that convert the type to a primitive type + asCArray funcs; + asSTypeBehaviour *beh = ctx->type.dataType.GetBehaviour(); + if( beh ) + { + if( convType == asIC_EXPLICIT_VAL_CAST ) + { + for( unsigned int n = 0; n < beh->operators.GetLength(); n += 2 ) + { + // accept both implicit and explicit cast + if( (beh->operators[n] == asBEHAVE_VALUE_CAST || + beh->operators[n] == asBEHAVE_IMPLICIT_VALUE_CAST) && + builder->GetFunctionDescription(beh->operators[n+1])->returnType.IsPrimitive() ) + funcs.PushLast(beh->operators[n+1]); + } + } + else + { + for( unsigned int n = 0; n < beh->operators.GetLength(); n += 2 ) + { + // accept only implicit cast + if( beh->operators[n] == asBEHAVE_IMPLICIT_VALUE_CAST && + builder->GetFunctionDescription(beh->operators[n+1])->returnType.IsPrimitive() ) + funcs.PushLast(beh->operators[n+1]); + } + } + } + + // This matrix describes the priorities of the types to search for, for each target type + // The first column is the target type, the priorities goes from left to right + eTokenType matchMtx[10][10] = + { + {ttDouble, ttFloat, ttInt64, ttUInt64, ttInt, ttUInt, ttInt16, ttUInt16, ttInt8, ttUInt8}, + {ttFloat, ttDouble, ttInt64, ttUInt64, ttInt, ttUInt, ttInt16, ttUInt16, ttInt8, ttUInt8}, + {ttInt64, ttUInt64, ttInt, ttUInt, ttInt16, ttUInt16, ttInt8, ttUInt8, ttDouble, ttFloat}, + {ttUInt64, ttInt64, ttUInt, ttInt, ttUInt16, ttInt16, ttUInt8, ttInt8, ttDouble, ttFloat}, + {ttInt, ttUInt, ttInt64, ttUInt64, ttInt16, ttUInt16, ttInt8, ttUInt8, ttDouble, ttFloat}, + {ttUInt, ttInt, ttUInt64, ttInt64, ttUInt16, ttInt16, ttUInt8, ttInt8, ttDouble, ttFloat}, + {ttInt16, ttUInt16, ttInt, ttUInt, ttInt64, ttUInt64, ttInt8, ttUInt8, ttDouble, ttFloat}, + {ttUInt16, ttInt16, ttUInt, ttInt, ttUInt64, ttInt64, ttUInt8, ttInt8, ttDouble, ttFloat}, + {ttInt8, ttUInt8, ttInt16, ttUInt16, ttInt, ttUInt, ttInt64, ttUInt64, ttDouble, ttFloat}, + {ttUInt8, ttInt8, ttUInt16, ttInt16, ttUInt, ttInt, ttUInt64, ttInt64, ttDouble, ttFloat}, + }; + + // Which row to use? + eTokenType *row = 0; + for( unsigned int type = 0; type < 10; type++ ) + { + if( to.GetTokenType() == matchMtx[type][0] ) + { + row = &matchMtx[type][0]; + break; + } + } + + // Find the best matching cast operator + int funcId = 0; + if( row ) + { + asCDataType target(to); + + // Priority goes from left to right in the matrix + for( unsigned int attempt = 0; attempt < 10 && funcId == 0; attempt++ ) + { + target.SetTokenType(row[attempt]); + for( unsigned int n = 0; n < funcs.GetLength(); n++ ) + { + asCScriptFunction *descr = builder->GetFunctionDescription(funcs[n]); + if( descr->returnType.IsEqualExceptConst(target) ) + { + funcId = funcs[n]; + break; + } + } + } + } + + // Did we find a suitable function? + if( funcId != 0 ) + { + asCScriptFunction *descr = builder->GetFunctionDescription(funcId); + if( generateCode ) + { + asCTypeInfo objType = ctx->type; + + Dereference(ctx, true); + + PerformFunctionCall(funcId, ctx); + + ReleaseTemporaryVariable(objType, &ctx->bc); + } + else + ctx->type.Set(descr->returnType); + + // Allow one more implicit conversion to another primitive type + ImplicitConversion(ctx, to, node, convType, generateCode, reservedVars, false); + } + else + { + if( convType != asIC_IMPLICIT_CONV && node ) + { + asCString str; + str.Format(TXT_CANT_IMPLICITLY_CONVERT_s_TO_s, ctx->type.dataType.Format().AddressOf(), to.Format().AddressOf()); + Error(str.AddressOf(), node); + } + } +} + +void asCCompiler::ImplicitConvObjectToObject(asSExprContext *ctx, const asCDataType &to, asCScriptNode *node, EImplicitConv convType, bool generateCode, asCArray *reservedVars, bool allowObjectConstruct) +{ + // Convert null to any object type handle, but not to a non-handle type + if( ctx->type.IsNullConstant() ) + { + if( to.IsObjectHandle() ) + ctx->type.dataType = to; + + return; + } + + // First attempt to convert the base type without instanciating another instance + if( to.GetObjectType() != ctx->type.dataType.GetObjectType() ) + { + // If the to type is an interface and the from type implements it, then we can convert it immediately + if( ctx->type.dataType.GetObjectType()->Implements(to.GetObjectType()) ) + { + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + + // If the to type is a class and the from type derives from it, then we can convert it immediately + if( ctx->type.dataType.GetObjectType()->DerivesFrom(to.GetObjectType()) ) + { + ctx->type.dataType.SetObjectType(to.GetObjectType()); + } + + // If the types are not equal yet, then we may still be able to find a reference cast + if( ctx->type.dataType.GetObjectType() != to.GetObjectType() ) + { + // A ref cast must not remove the constness + bool isConst = false; + if( (ctx->type.dataType.IsObjectHandle() && ctx->type.dataType.IsHandleToConst()) || + (!ctx->type.dataType.IsObjectHandle() && ctx->type.dataType.IsReadOnly()) ) + isConst = true; + + // We may still be able to find an implicit ref cast behaviour + CompileRefCast(ctx, to, convType == asIC_EXPLICIT_REF_CAST, node, generateCode); + + ctx->type.dataType.MakeHandleToConst(isConst); + } + } + + // If the base type is still different, and we are allowed to instance + // another object then we can try an implicit value cast + if( to.GetObjectType() != ctx->type.dataType.GetObjectType() && allowObjectConstruct ) + { + // TODO: Implement support for implicit constructor/factory + + asCArray funcs; + asSTypeBehaviour *beh = ctx->type.dataType.GetBehaviour(); + if( beh ) + { + if( convType == asIC_EXPLICIT_VAL_CAST ) + { + for( unsigned int n = 0; n < beh->operators.GetLength(); n += 2 ) + { + // accept both implicit and explicit cast + if( (beh->operators[n] == asBEHAVE_VALUE_CAST || + beh->operators[n] == asBEHAVE_IMPLICIT_VALUE_CAST) && + builder->GetFunctionDescription(beh->operators[n+1])->returnType.GetObjectType() == to.GetObjectType() ) + funcs.PushLast(beh->operators[n+1]); + } + } + else + { + for( unsigned int n = 0; n < beh->operators.GetLength(); n += 2 ) + { + // accept only implicit cast + if( beh->operators[n] == asBEHAVE_IMPLICIT_VALUE_CAST && + builder->GetFunctionDescription(beh->operators[n+1])->returnType.GetObjectType() == to.GetObjectType() ) + funcs.PushLast(beh->operators[n+1]); + } + } + } + + // TODO: If there are multiple valid value casts, then we must choose the most appropriate one + asASSERT( funcs.GetLength() <= 1 ); + + if( funcs.GetLength() == 1 ) + { + asCScriptFunction *f = builder->GetFunctionDescription(funcs[0]); + if( generateCode ) + { + asCTypeInfo objType = ctx->type; + Dereference(ctx, true); + PerformFunctionCall(funcs[0], ctx); + ReleaseTemporaryVariable(objType, &ctx->bc); + } + else + ctx->type.Set(f->returnType); + } + } + + // If we still haven't converted the base type to the correct type, then there is no need to continue + if( to.GetObjectType() != ctx->type.dataType.GetObjectType() ) + return; + + + // TODO: The below code can probably be improved even further. It should first convert the type to + // object handle or non-object handle, and only after that convert to reference or non-reference + + if( to.IsObjectHandle() ) + { + // An object type can be directly converted to a handle of the same type + if( ctx->type.dataType.SupportHandles() ) + { + ctx->type.dataType.MakeHandle(true); + } + + if( ctx->type.dataType.IsObjectHandle() ) + ctx->type.dataType.MakeReadOnly(to.IsReadOnly()); + + if( to.IsHandleToConst() && ctx->type.dataType.IsObjectHandle() ) + ctx->type.dataType.MakeHandleToConst(true); + } + + if( !to.IsReference() ) + { + if( ctx->type.dataType.IsReference() ) + { + Dereference(ctx, generateCode); + + // TODO: Can't this leave unhandled deferred output params? + } + + if( to.IsObjectHandle() ) + { + // TODO: If the type is handle, then we can't use IsReadOnly to determine the constness of the basetype + + // If the rvalue is a handle to a const object, then + // the lvalue must also be a handle to a const object + if( ctx->type.dataType.IsReadOnly() && !to.IsReadOnly() ) + { + if( convType != asIC_IMPLICIT_CONV ) + { + asASSERT(node); + asCString str; + str.Format(TXT_CANT_IMPLICITLY_CONVERT_s_TO_s, ctx->type.dataType.Format().AddressOf(), to.Format().AddressOf()); + Error(str.AddressOf(), node); + } + } + } + else + { + if( ctx->type.dataType.IsObjectHandle() && !ctx->type.isExplicitHandle ) + { + if( generateCode ) + ctx->bc.Instr(asBC_CHKREF); + + ctx->type.dataType.MakeHandle(false); + } + + // A const object can be converted to a non-const object through a copy + if( ctx->type.dataType.IsReadOnly() && !to.IsReadOnly() && + allowObjectConstruct ) + { + // Does the object type allow a copy to be made? + if( ctx->type.dataType.CanBeCopied() ) + { + if( generateCode ) + { + // Make a temporary object with the copy + PrepareTemporaryObject(node, ctx, reservedVars); + } + else + ctx->type.dataType.MakeReadOnly(false); + } + } + + // A non-const object can be converted to a const object directly + if( !ctx->type.dataType.IsReadOnly() && to.IsReadOnly() ) + { + ctx->type.dataType.MakeReadOnly(true); + } + } + } + else // to.IsReference() + { + if( ctx->type.dataType.IsReference() ) + { + // A reference to a handle can be converted to a reference to an object + // by first reading the address, then verifying that it is not null, then putting the address back on the stack + if( !to.IsObjectHandle() && ctx->type.dataType.IsObjectHandle() && !ctx->type.isExplicitHandle ) + { + ctx->type.dataType.MakeHandle(false); + if( generateCode ) + ctx->bc.Instr(asBC_ChkRefS); + } + + // A reference to a non-const can be converted to a reference to a const + if( to.IsReadOnly() ) + ctx->type.dataType.MakeReadOnly(true); + else if( ctx->type.dataType.IsReadOnly() ) + { + // A reference to a const can be converted to a reference to a + // non-const by copying the object to a temporary variable + ctx->type.dataType.MakeReadOnly(false); + + if( generateCode ) + { + // Allocate a temporary variable + asSExprContext lctx(engine); + asCDataType dt = ctx->type.dataType; + dt.MakeReference(false); + int offset = AllocateVariableNotIn(dt, true, reservedVars); + lctx.type = ctx->type; + lctx.type.isTemporary = true; + lctx.type.stackOffset = (short)offset; + + CallDefaultConstructor(lctx.type.dataType, offset, &lctx.bc, node); + + // Build the right hand expression + asSExprContext rctx(engine); + rctx.type = ctx->type; + rctx.bc.AddCode(&lctx.bc); + rctx.bc.AddCode(&ctx->bc); + + // Build the left hand expression + lctx.bc.InstrSHORT(asBC_PSF, (short)offset); + + // DoAssignment doesn't allow assignment to temporary variable, + // so we temporarily set the type as non-temporary. + lctx.type.isTemporary = false; + + DoAssignment(ctx, &lctx, &rctx, node, node, ttAssignment, node); + + // If the original const object was a temporary variable, then + // that needs to be released now + ProcessDeferredParams(ctx); + + ctx->type = lctx.type; + ctx->type.isTemporary = true; + } + } + } + else + { + if( generateCode ) + { + asCTypeInfo type; + type.Set(ctx->type.dataType); + + // Allocate a temporary variable + int offset = AllocateVariableNotIn(type.dataType, true, reservedVars); + type.isTemporary = true; + type.stackOffset = (short)offset; + if( type.dataType.IsObjectHandle() ) + type.isExplicitHandle = true; + + CallDefaultConstructor(type.dataType, offset, &ctx->bc, node); + type.dataType.MakeReference(true); + + PrepareForAssignment(&type.dataType, ctx, node); + + ctx->bc.InstrSHORT(asBC_PSF, type.stackOffset); + + // If the input type is read-only we'll need to temporarily + // remove this constness, otherwise the assignment will fail + bool typeIsReadOnly = type.dataType.IsReadOnly(); + type.dataType.MakeReadOnly(false); + PerformAssignment(&type, &ctx->type, &ctx->bc, node); + type.dataType.MakeReadOnly(typeIsReadOnly); + + ctx->bc.Pop(ctx->type.dataType.GetSizeOnStackDWords()); + + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + + ctx->bc.InstrSHORT(asBC_PSF, type.stackOffset); + + ctx->type = type; + } + + // A non-reference can be converted to a reference, + // by putting the value in a temporary variable + ctx->type.dataType.MakeReference(true); + + // Since it is a new temporary variable it doesn't have to be const + ctx->type.dataType.MakeReadOnly(to.IsReadOnly()); + } + } +} + +void asCCompiler::ImplicitConvPrimitiveToObject(asSExprContext * /*ctx*/, const asCDataType & /*to*/, asCScriptNode * /*node*/, EImplicitConv /*isExplicit*/, bool /*generateCode*/, asCArray * /*reservedVars*/, bool /*allowObjectConstruct*/) +{ +/* + + if( allowObjectConstruct ) + { + // Check for the existance of any implicit constructor/factory + // behaviours to construct the desired object from the primitive + + // TODO: Implement implicit constructor/factory + + asCArray funcs; + asSTypeBehaviour *beh = to.GetBehaviour(); + if( beh ) + { + // TODO: Add implicit conversion to object types via contructor/factory + + // Find the implicit constructor calls + for( int n = 0; n < beh->operators.GetLength(); n += 2 ) + if( beh->operators[n] == asBEHAVE_IMPLICIT_CONSTRUCT || + beh->operators[n] == asBEHAVE_IMPLICIT_FACTORY ) + funcs.PushLast(beh->operators[n+1]); + } + + // Compile the arguments + asCArray args; + asCArray temporaryVariables; + + args.PushLast(ctx); + + MatchFunctions(funcs, args, node, to.GetObjectType()->name.AddressOf(), NULL, false, true, false); + + // Verify that we found 1 matching function + if( funcs.GetLength() == 1 ) + { + asCTypeInfo tempObj; + tempObj.dataType = to; + tempObj.dataType.MakeReference(true); + tempObj.isTemporary = true; + tempObj.isVariable = true; + + if( generateCode ) + { + tempObj.stackOffset = (short)AllocateVariable(to, true); + + asSExprContext tmp(engine); + + if( tempObj.dataType.GetObjectType()->flags & asOBJ_REF ) + { + PrepareFunctionCall(funcs[0], &tmp.bc, args); + MoveArgsToStack(funcs[0], &tmp.bc, args, false); + + // Call factory and store handle in the variable + PerformFunctionCall(funcs[0], &tmp, false, &args, 0, true, tempObj.stackOffset); + + tmp.type = tempObj; + } + else + { + // Push the address of the object on the stack + tmp.bc.InstrSHORT(asBC_VAR, tempObj.stackOffset); + + PrepareFunctionCall(funcs[0], &tmp.bc, args); + MoveArgsToStack(funcs[0], &tmp.bc, args, false); + + int offset = 0; + for( asUINT n = 0; n < args.GetLength(); n++ ) + offset += args[n]->type.dataType.GetSizeOnStackDWords(); + + tmp.bc.InstrWORD(asBC_GETREF, (asWORD)offset); + + PerformFunctionCall(funcs[0], &tmp, true, &args, tempObj.dataType.GetObjectType()); + + // The constructor doesn't return anything, + // so we have to manually inform the type of + // the return value + tmp.type = tempObj; + + // Push the address of the object on the stack again + tmp.bc.InstrSHORT(asBC_PSF, tempObj.stackOffset); + } + + // Copy the newly generated code to the input context + // ctx is already empty, since it was merged as part of argument expression + asASSERT(ctx->bc.GetLastInstr() == -1); + MergeExprContexts(ctx, &tmp); + } + + ctx->type = tempObj; + } + } +*/ +} + +void asCCompiler::ImplicitConversionConstant(asSExprContext *from, const asCDataType &to, asCScriptNode *node, EImplicitConv convType) +{ + asASSERT(from->type.isConstant); + + // TODO: node should be the node of the value that is + // converted (not the operator that provokes the implicit + // conversion) + + // If the base type is correct there is no more to do + if( to.IsEqualExceptRefAndConst(from->type.dataType) ) return; + + // References cannot be constants + if( from->type.dataType.IsReference() ) return; + + // Arrays can't be constants + if( to.IsArrayType() ) return; + + if( (to.IsIntegerType() && to.GetSizeInMemoryDWords() == 1) || + (to.IsEnumType() && convType == asIC_EXPLICIT_VAL_CAST) ) + { + if( from->type.dataType.IsFloatType() || + from->type.dataType.IsDoubleType() || + from->type.dataType.IsUnsignedType() || + from->type.dataType.IsIntegerType() || + from->type.dataType.IsEnumType() ) + { + // Transform the value + // Float constants can be implicitly converted to int + if( from->type.dataType.IsFloatType() ) + { + float fc = from->type.floatValue; + int ic = int(fc); + + if( float(ic) != fc ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.intValue = ic; + } + // Double constants can be implicitly converted to int + else if( from->type.dataType.IsDoubleType() ) + { + double fc = from->type.doubleValue; + int ic = int(fc); + + if( double(ic) != fc ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.intValue = ic; + } + else if( from->type.dataType.IsUnsignedType() && from->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + // Verify that it is possible to convert to signed without getting negative + if( from->type.intValue < 0 ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_CHANGE_SIGN, node); + } + + // Convert to 32bit + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + from->type.intValue = from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + from->type.intValue = from->type.wordValue; + } + else if( from->type.dataType.IsUnsignedType() && from->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + // Convert to 32bit + from->type.intValue = int(from->type.qwordValue); + } + else if( from->type.dataType.IsIntegerType() && + from->type.dataType.GetSizeInMemoryBytes() < 4 ) + { + // Convert to 32bit + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + from->type.intValue = (signed char)from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + from->type.intValue = (short)from->type.wordValue; + } + else if( from->type.dataType.IsEnumType() ) + { + // Enum type is already an integer type + } + + // Set the resulting type + if( to.IsEnumType() ) + from->type.dataType = to; + else + from->type.dataType = asCDataType::CreatePrimitive(ttInt, true); + } + + // Check if a downsize is necessary + if( to.IsIntegerType() && + from->type.dataType.IsIntegerType() && + from->type.dataType.GetSizeInMemoryBytes() > to.GetSizeInMemoryBytes() ) + { + // Verify if it is possible + if( to.GetSizeInMemoryBytes() == 1 ) + { + if( char(from->type.intValue) != from->type.intValue ) + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_VALUE_TOO_LARGE_FOR_TYPE, node); + + from->type.byteValue = char(from->type.intValue); + } + else if( to.GetSizeInMemoryBytes() == 2 ) + { + if( short(from->type.intValue) != from->type.intValue ) + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_VALUE_TOO_LARGE_FOR_TYPE, node); + + from->type.wordValue = short(from->type.intValue); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + } + } + else if( to.IsIntegerType() && to.GetSizeInMemoryDWords() == 2 ) + { + // Float constants can be implicitly converted to int + if( from->type.dataType.IsFloatType() ) + { + float fc = from->type.floatValue; + asINT64 ic = asINT64(fc); + + if( float(ic) != fc ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType = asCDataType::CreatePrimitive(ttInt64, true); + from->type.qwordValue = ic; + } + // Double constants can be implicitly converted to int + else if( from->type.dataType.IsDoubleType() ) + { + double fc = from->type.doubleValue; + asINT64 ic = asINT64(fc); + + if( double(ic) != fc ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType = asCDataType::CreatePrimitive(ttInt64, true); + from->type.qwordValue = ic; + } + else if( from->type.dataType.IsUnsignedType() ) + { + // Convert to 64bit + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + from->type.qwordValue = from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + from->type.qwordValue = from->type.wordValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 4 ) + from->type.qwordValue = from->type.dwordValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 8 ) + { + if( asINT64(from->type.qwordValue) < 0 ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_CHANGE_SIGN, node); + } + } + + from->type.dataType = asCDataType::CreatePrimitive(ttInt64, true); + } + else if( from->type.dataType.IsEnumType() ) + { + from->type.qwordValue = from->type.intValue; + from->type.dataType = asCDataType::CreatePrimitive(ttInt64, true); + } + else if( from->type.dataType.IsIntegerType() ) + { + // Convert to 64bit + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + from->type.qwordValue = (signed char)from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + from->type.qwordValue = (short)from->type.wordValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 4 ) + from->type.qwordValue = from->type.intValue; + + from->type.dataType = asCDataType::CreatePrimitive(ttInt64, true); + } + } + else if( to.IsUnsignedType() && to.GetSizeInMemoryDWords() == 1 ) + { + if( from->type.dataType.IsFloatType() ) + { + float fc = from->type.floatValue; + int uic = int(fc); + + if( float(uic) != fc ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + else if( uic < 0 ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_CHANGE_SIGN, node); + } + + from->type.dataType = asCDataType::CreatePrimitive(ttInt, true); + from->type.intValue = uic; + + // Try once more, in case of a smaller type + ImplicitConversionConstant(from, to, node, convType); + } + else if( from->type.dataType.IsDoubleType() ) + { + double fc = from->type.doubleValue; + int uic = int(fc); + + if( double(uic) != fc ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType = asCDataType::CreatePrimitive(ttInt, true); + from->type.intValue = uic; + + // Try once more, in case of a smaller type + ImplicitConversionConstant(from, to, node, convType); + } + else if( from->type.dataType.IsEnumType() ) + { + from->type.dataType = asCDataType::CreatePrimitive(ttUInt, true); + + // Try once more, in case of a smaller type + ImplicitConversionConstant(from, to, node, convType); + } + else if( from->type.dataType.IsIntegerType() ) + { + // Verify that it is possible to convert to unsigned without loosing negative + if( from->type.intValue < 0 ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_CHANGE_SIGN, node); + } + + // Convert to 32bit + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + from->type.intValue = (signed char)from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + from->type.intValue = (short)from->type.wordValue; + + from->type.dataType = asCDataType::CreatePrimitive(ttUInt, true); + + // Try once more, in case of a smaller type + ImplicitConversionConstant(from, to, node, convType); + } + else if( from->type.dataType.IsUnsignedType() && + from->type.dataType.GetSizeInMemoryBytes() < 4 ) + { + // Convert to 32bit + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + from->type.dwordValue = from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + from->type.dwordValue = from->type.wordValue; + + from->type.dataType = asCDataType::CreatePrimitive(ttUInt, true); + + // Try once more, in case of a smaller type + ImplicitConversionConstant(from, to, node, convType); + } + else if( from->type.dataType.IsUnsignedType() && + from->type.dataType.GetSizeInMemoryBytes() > to.GetSizeInMemoryBytes() ) + { + // Verify if it is possible + if( to.GetSizeInMemoryBytes() == 1 ) + { + if( asBYTE(from->type.dwordValue) != from->type.dwordValue ) + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_VALUE_TOO_LARGE_FOR_TYPE, node); + + from->type.byteValue = asBYTE(from->type.dwordValue); + } + else if( to.GetSizeInMemoryBytes() == 2 ) + { + if( asWORD(from->type.dwordValue) != from->type.dwordValue ) + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_VALUE_TOO_LARGE_FOR_TYPE, node); + + from->type.wordValue = asWORD(from->type.dwordValue); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + } + } + else if( to.IsUnsignedType() && to.GetSizeInMemoryDWords() == 2 ) + { + if( from->type.dataType.IsFloatType() ) + { + float fc = from->type.floatValue; + // Convert first to int64 then to uint64 to avoid negative float becoming 0 on gnuc base compilers + asQWORD uic = asQWORD(asINT64(fc)); + + // TODO: MSVC6 doesn't permit UINT64 to double + if( float((signed)uic) != fc ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType = asCDataType::CreatePrimitive(ttUInt64, true); + from->type.qwordValue = uic; + } + else if( from->type.dataType.IsDoubleType() ) + { + double fc = from->type.doubleValue; + // Convert first to int64 then to uint64 to avoid negative float becoming 0 on gnuc base compilers + asQWORD uic = asQWORD(asINT64(fc)); + + // TODO: MSVC6 doesn't permit UINT64 to double + if( double((signed)uic) != fc ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType = asCDataType::CreatePrimitive(ttUInt64, true); + from->type.qwordValue = uic; + } + else if( from->type.dataType.IsEnumType() ) + { + from->type.qwordValue = (asINT64)from->type.intValue; + from->type.dataType = asCDataType::CreatePrimitive(ttUInt64, true); + } + else if( from->type.dataType.IsIntegerType() && from->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + // Convert to 64bit + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + from->type.qwordValue = (asINT64)(signed char)from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + from->type.qwordValue = (asINT64)(short)from->type.wordValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 4 ) + from->type.qwordValue = (asINT64)from->type.intValue; + + // Verify that it is possible to convert to unsigned without loosing negative + if( asINT64(from->type.qwordValue) < 0 ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_CHANGE_SIGN, node); + } + + from->type.dataType = asCDataType::CreatePrimitive(ttUInt64, true); + } + else if( from->type.dataType.IsIntegerType() && from->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + // Verify that it is possible to convert to unsigned without loosing negative + if( asINT64(from->type.qwordValue) < 0 ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_CHANGE_SIGN, node); + } + + from->type.dataType = asCDataType::CreatePrimitive(ttUInt64, true); + } + else if( from->type.dataType.IsUnsignedType() ) + { + // Convert to 64bit + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + from->type.qwordValue = from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + from->type.qwordValue = from->type.wordValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 4 ) + from->type.qwordValue = from->type.dwordValue; + + from->type.dataType = asCDataType::CreatePrimitive(ttUInt64, true); + } + } + else if( to.IsFloatType() ) + { + if( from->type.dataType.IsDoubleType() ) + { + double ic = from->type.doubleValue; + float fc = float(ic); + + if( double(fc) != ic ) + { + asCString str; + str.Format(TXT_POSSIBLE_LOSS_OF_PRECISION); + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(str.AddressOf(), node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.floatValue = fc; + } + else if( from->type.dataType.IsEnumType() ) + { + float fc = float(from->type.intValue); + + if( int(fc) != from->type.intValue ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.floatValue = fc; + } + else if( from->type.dataType.IsIntegerType() && from->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + // Must properly convert value in case the from value is smaller + int ic; + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + ic = (signed char)from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + ic = (short)from->type.wordValue; + else + ic = from->type.intValue; + float fc = float(ic); + + if( int(fc) != ic ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.floatValue = fc; + } + else if( from->type.dataType.IsIntegerType() && from->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + float fc = float(asINT64(from->type.qwordValue)); + if( asINT64(fc) != asINT64(from->type.qwordValue) ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.floatValue = fc; + } + else if( from->type.dataType.IsUnsignedType() && from->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + // Must properly convert value in case the from value is smaller + unsigned int uic; + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + uic = from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + uic = from->type.wordValue; + else + uic = from->type.dwordValue; + float fc = float(uic); + + if( (unsigned int)(fc) != uic ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.floatValue = fc; + } + else if( from->type.dataType.IsUnsignedType() && from->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + // TODO: MSVC6 doesn't permit UINT64 to double + float fc = float((signed)from->type.qwordValue); + + if( asQWORD(fc) != from->type.qwordValue ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.floatValue = fc; + } + } + else if( to.IsDoubleType() ) + { + if( from->type.dataType.IsFloatType() ) + { + float ic = from->type.floatValue; + double fc = double(ic); + + // Don't check for float->double + // if( float(fc) != ic ) + // { + // acCString str; + // str.Format(TXT_NOT_EXACT_g_g_g, ic, fc, float(fc)); + // if( !isExplicit ) Warning(str, node); + // } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.doubleValue = fc; + } + else if( from->type.dataType.IsEnumType() ) + { + double fc = double(from->type.intValue); + + if( int(fc) != from->type.intValue ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.doubleValue = fc; + } + else if( from->type.dataType.IsIntegerType() && from->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + // Must properly convert value in case the from value is smaller + int ic; + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + ic = (signed char)from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + ic = (short)from->type.wordValue; + else + ic = from->type.intValue; + double fc = double(ic); + + if( int(fc) != ic ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.doubleValue = fc; + } + else if( from->type.dataType.IsIntegerType() && from->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + double fc = double(asINT64(from->type.qwordValue)); + + if( asINT64(fc) != asINT64(from->type.qwordValue) ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.doubleValue = fc; + } + else if( from->type.dataType.IsUnsignedType() && from->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + // Must properly convert value in case the from value is smaller + unsigned int uic; + if( from->type.dataType.GetSizeInMemoryBytes() == 1 ) + uic = from->type.byteValue; + else if( from->type.dataType.GetSizeInMemoryBytes() == 2 ) + uic = from->type.wordValue; + else + uic = from->type.dwordValue; + double fc = double(uic); + + if( (unsigned int)(fc) != uic ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.doubleValue = fc; + } + else if( from->type.dataType.IsUnsignedType() && from->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + // TODO: MSVC6 doesn't permit UINT64 to double + double fc = double((signed)from->type.qwordValue); + + if( asQWORD(fc) != from->type.qwordValue ) + { + if( convType != asIC_EXPLICIT_VAL_CAST && node ) Warning(TXT_NOT_EXACT, node); + } + + from->type.dataType.SetTokenType(to.GetTokenType()); + from->type.doubleValue = fc; + } + } +} + +int asCCompiler::DoAssignment(asSExprContext *ctx, asSExprContext *lctx, asSExprContext *rctx, asCScriptNode *lexpr, asCScriptNode *rexpr, int op, asCScriptNode *opNode) +{ + // Implicit handle types should always be treated as handles in assignments + if (lctx->type.dataType.GetObjectType() && (lctx->type.dataType.GetObjectType()->flags & asOBJ_IMPLICIT_HANDLE) ) + { + lctx->type.dataType.MakeHandle(true); + lctx->type.isExplicitHandle = true; + } + + // If the left hand expression is a property accessor, then that should be used + // to do the assignment instead of the ordinary operator. The exception is when + // the property accessor is for a handle property, and the operation is a value + // assignment. + if( (lctx->property_get || lctx->property_set) && + !(lctx->type.dataType.IsObjectHandle() && !lctx->type.isExplicitHandle) ) + { + if( op != ttAssignment ) + { + // TODO: getset: We may actually be able to support this, if we can + // guarantee that the object reference will stay valid + // between the calls to the get and set accessors. + + // Compound assignments are not allowed for properties + Error(TXT_COMPOUND_ASGN_WITH_PROP, opNode); + return -1; + } + + MergeExprContexts(ctx, lctx); + ctx->type = lctx->type; + ctx->property_get = lctx->property_get; + ctx->property_set = lctx->property_set; + ctx->property_const = lctx->property_const; + ctx->property_handle = lctx->property_handle; + + return ProcessPropertySetAccessor(ctx, rctx, opNode); + } + + if( lctx->type.dataType.IsPrimitive() ) + { + if( op != ttAssignment ) + { + // Compute the operator before the assignment + asCTypeInfo lvalue = lctx->type; + + if( lctx->type.isTemporary && !lctx->type.isVariable ) + { + // The temporary variable must not be freed until the + // assignment has been performed. lvalue still holds + // the information about the temporary variable + lctx->type.isTemporary = false; + } + + asSExprContext o(engine); + CompileOperator(opNode, lctx, rctx, &o); + MergeExprContexts(rctx, &o); + rctx->type = o.type; + + // Convert the rvalue to the right type and validate it + PrepareForAssignment(&lvalue.dataType, rctx, rexpr); + + MergeExprContexts(ctx, rctx); + lctx->type = lvalue; + + // The lvalue continues the same, either it was a variable, or a reference in the register + } + else + { + // Convert the rvalue to the right type and validate it + PrepareForAssignment(&lctx->type.dataType, rctx, rexpr, lctx); + + MergeExprContexts(ctx, rctx); + MergeExprContexts(ctx, lctx); + } + + ReleaseTemporaryVariable(rctx->type, &ctx->bc); + + PerformAssignment(&lctx->type, &rctx->type, &ctx->bc, opNode); + + ctx->type = lctx->type; + } + else if( lctx->type.isExplicitHandle ) + { + // Verify that the left hand value isn't a temporary variable + if( lctx->type.isTemporary ) + { + Error(TXT_REF_IS_TEMP, lexpr); + return -1; + } + + // Object handles don't have any compound assignment operators + if( op != ttAssignment ) + { + asCString str; + str.Format(TXT_ILLEGAL_OPERATION_ON_s, lctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), lexpr); + return -1; + } + + asCDataType dt = lctx->type.dataType; + dt.MakeReference(false); + + PrepareArgument(&dt, rctx, rexpr, true, 1); + if( !dt.IsEqualExceptRefAndConst(rctx->type.dataType) ) + { + asCString str; + str.Format(TXT_CANT_IMPLICITLY_CONVERT_s_TO_s, rctx->type.dataType.Format().AddressOf(), lctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), rexpr); + return -1; + } + + MergeExprContexts(ctx, rctx); + MergeExprContexts(ctx, lctx); + + ctx->bc.InstrWORD(asBC_GETOBJREF, AS_PTR_SIZE); + + PerformAssignment(&lctx->type, &rctx->type, &ctx->bc, opNode); + + ReleaseTemporaryVariable(rctx->type, &ctx->bc); + + ctx->type = rctx->type; + } + else // if( lctx->type.dataType.IsObject() ) + { + // Verify that the left hand value isn't a temporary variable + if( lctx->type.isTemporary ) + { + Error(TXT_REF_IS_TEMP, lexpr); + return -1; + } + + if( lctx->type.dataType.IsObjectHandle() && !lctx->type.isExplicitHandle ) + { + // Convert the handle to a object reference + asCDataType to; + to = lctx->type.dataType; + to.MakeHandle(false); + ImplicitConversion(lctx, to, lexpr, asIC_IMPLICIT_CONV); + } + + // Check for overloaded assignment operator + if( CompileOverloadedDualOperator(opNode, lctx, rctx, ctx) ) + { + // An overloaded assignment operator was found (or a compilation error occured) + return 0; + } + + // No registered operator was found. In case the operation is a direct + // assignment and the rvalue is the same type as the lvalue, then we can + // still use the byte-for-byte copy to do the assignment + + if( op != ttAssignment ) + { + asCString str; + str.Format(TXT_ILLEGAL_OPERATION_ON_s, lctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), lexpr); + return -1; + } + + // Implicitly convert the rvalue to the type of the lvalue + asCDataType dt = lctx->type.dataType; + PrepareArgument(&dt, rctx, rexpr, true, 1); + if( !dt.IsEqualExceptRefAndConst(rctx->type.dataType) ) + { + asCString str; + str.Format(TXT_CANT_IMPLICITLY_CONVERT_s_TO_s, rctx->type.dataType.Format().AddressOf(), lctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), rexpr); + return -1; + } + + MergeExprContexts(ctx, rctx); + MergeExprContexts(ctx, lctx); + + ctx->bc.InstrWORD(asBC_GETOBJREF, AS_PTR_SIZE); + + PerformAssignment(&lctx->type, &rctx->type, &ctx->bc, opNode); + + ReleaseTemporaryVariable(rctx->type, &ctx->bc); + + ctx->type = lctx->type; + } + + return 0; +} + +int asCCompiler::CompileAssignment(asCScriptNode *expr, asSExprContext *ctx) +{ + asCScriptNode *lexpr = expr->firstChild; + if( lexpr->next ) + { + if( globalExpression ) + { + Error(TXT_ASSIGN_IN_GLOBAL_EXPR, expr); + ctx->type.SetDummy(); + return -1; + } + + // Compile the two expression terms + asSExprContext lctx(engine), rctx(engine); + int rr = CompileAssignment(lexpr->next->next, &rctx); + int lr = CompileCondition(lexpr, &lctx); + + if( lr >= 0 && rr >= 0 ) + return DoAssignment(ctx, &lctx, &rctx, lexpr, lexpr->next->next, lexpr->next->tokenType, lexpr->next); + + // Since the operands failed, the assignment was not computed + ctx->type.SetDummy(); + return -1; + } + + return CompileCondition(lexpr, ctx); +} + +int asCCompiler::CompileCondition(asCScriptNode *expr, asSExprContext *ctx) +{ + asCTypeInfo ctype; + + // Compile the conditional expression + asCScriptNode *cexpr = expr->firstChild; + if( cexpr->next ) + { + //------------------------------- + // Compile the condition + asSExprContext e(engine); + int r = CompileExpression(cexpr, &e); + if( r < 0 ) + e.type.SetConstantB(asCDataType::CreatePrimitive(ttBool, true), true); + if( r >= 0 && !e.type.dataType.IsEqualExceptRefAndConst(asCDataType::CreatePrimitive(ttBool, true)) ) + { + Error(TXT_EXPR_MUST_BE_BOOL, cexpr); + e.type.SetConstantB(asCDataType::CreatePrimitive(ttBool, true), true); + } + ctype = e.type; + + ProcessPropertyGetAccessor(&e, cexpr); + + if( e.type.dataType.IsReference() ) ConvertToVariable(&e); + ProcessDeferredParams(&e); + + //------------------------------- + // Compile the left expression + asSExprContext le(engine); + int lr = CompileAssignment(cexpr->next, &le); + + //------------------------------- + // Compile the right expression + asSExprContext re(engine); + int rr = CompileAssignment(cexpr->next->next, &re); + + if( lr >= 0 && rr >= 0 ) + { + ProcessPropertyGetAccessor(&le, cexpr->next); + ProcessPropertyGetAccessor(&re, cexpr->next->next); + + bool isExplicitHandle = le.type.isExplicitHandle || re.type.isExplicitHandle; + + // Allow a 0 in the first case to be implicitly converted to the second type + if( le.type.isConstant && le.type.intValue == 0 && le.type.dataType.IsUnsignedType() ) + { + asCDataType to = re.type.dataType; + to.MakeReference(false); + to.MakeReadOnly(true); + ImplicitConversionConstant(&le, to, cexpr->next, asIC_IMPLICIT_CONV); + } + + //--------------------------------- + // Output the byte code + int afterLabel = nextLabel++; + int elseLabel = nextLabel++; + + // If left expression is void, then we don't need to store the result + if( le.type.dataType.IsEqualExceptConst(asCDataType::CreatePrimitive(ttVoid, false)) ) + { + // Put the code for the condition expression on the output + MergeExprContexts(ctx, &e); + + // Added the branch decision + ctx->type = e.type; + ConvertToVariable(ctx); + ctx->bc.InstrSHORT(asBC_CpyVtoR4, ctx->type.stackOffset); + ctx->bc.Instr(asBC_ClrHi); + ctx->bc.InstrDWORD(asBC_JZ, elseLabel); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + + // Add the left expression + MergeExprContexts(ctx, &le); + ctx->bc.InstrINT(asBC_JMP, afterLabel); + + // Add the right expression + ctx->bc.Label((short)elseLabel); + MergeExprContexts(ctx, &re); + ctx->bc.Label((short)afterLabel); + + // Make sure both expressions have the same type + if( le.type.dataType != re.type.dataType ) + Error(TXT_BOTH_MUST_BE_SAME, expr); + + // Set the type of the result + ctx->type = le.type; + } + else + { + // Allocate temporary variable and copy the result to that one + asCTypeInfo temp; + temp = le.type; + temp.dataType.MakeReference(false); + temp.dataType.MakeReadOnly(false); + // Make sure the variable isn't used in the initial expression + asCArray vars; + e.bc.GetVarsUsed(vars); + int offset = AllocateVariableNotIn(temp.dataType, true, &vars); + temp.SetVariable(temp.dataType, offset, true); + + CallDefaultConstructor(temp.dataType, offset, &ctx->bc, expr); + + // Put the code for the condition expression on the output + MergeExprContexts(ctx, &e); + + // Added the branch decision + ctx->type = e.type; + ConvertToVariable(ctx); + ctx->bc.InstrSHORT(asBC_CpyVtoR4, ctx->type.stackOffset); + ctx->bc.Instr(asBC_ClrHi); + ctx->bc.InstrDWORD(asBC_JZ, elseLabel); + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + + // Assign the result of the left expression to the temporary variable + asCTypeInfo rtemp; + rtemp = temp; + if( rtemp.dataType.IsObjectHandle() ) + rtemp.isExplicitHandle = true; + + PrepareForAssignment(&rtemp.dataType, &le, cexpr->next); + MergeExprContexts(ctx, &le); + + if( !rtemp.dataType.IsPrimitive() ) + { + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + rtemp.dataType.MakeReference(true); + } + PerformAssignment(&rtemp, &le.type, &ctx->bc, cexpr->next); + if( !rtemp.dataType.IsPrimitive() ) + ctx->bc.Pop(le.type.dataType.GetSizeOnStackDWords()); // Pop the original value + + // Release the old temporary variable + ReleaseTemporaryVariable(le.type, &ctx->bc); + + ctx->bc.InstrINT(asBC_JMP, afterLabel); + + // Start of the right expression + ctx->bc.Label((short)elseLabel); + + // Copy the result to the same temporary variable + PrepareForAssignment(&rtemp.dataType, &re, cexpr->next); + MergeExprContexts(ctx, &re); + + if( !rtemp.dataType.IsPrimitive() ) + { + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + rtemp.dataType.MakeReference(true); + } + PerformAssignment(&rtemp, &re.type, &ctx->bc, cexpr->next); + if( !rtemp.dataType.IsPrimitive() ) + ctx->bc.Pop(le.type.dataType.GetSizeOnStackDWords()); // Pop the original value + + // Release the old temporary variable + ReleaseTemporaryVariable(re.type, &ctx->bc); + + ctx->bc.Label((short)afterLabel); + + // Make sure both expressions have the same type + if( le.type.dataType != re.type.dataType ) + Error(TXT_BOTH_MUST_BE_SAME, expr); + + // Set the temporary variable as output + ctx->type = rtemp; + ctx->type.isExplicitHandle = isExplicitHandle; + + if( !ctx->type.dataType.IsPrimitive() ) + { + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + ctx->type.dataType.MakeReference(true); + } + + // Make sure the output isn't marked as being a literal constant + ctx->type.isConstant = false; + } + } + else + { + ctx->type.SetDummy(); + return -1; + } + } + else + return CompileExpression(cexpr, ctx); + + return 0; +} + +int asCCompiler::CompileExpression(asCScriptNode *expr, asSExprContext *ctx) +{ + asASSERT(expr->nodeType == snExpression); + + // Count the nodes + int count = 0; + asCScriptNode *node = expr->firstChild; + while( node ) + { + count++; + node = node->next; + } + + // Convert to polish post fix, i.e: a+b => ab+ + asCArray stack(count); + asCArray stack2(count); + asCArray postfix(count); + + node = expr->firstChild; + while( node ) + { + int precedence = GetPrecedence(node); + + while( stack.GetLength() > 0 && + precedence <= GetPrecedence(stack[stack.GetLength()-1]) ) + stack2.PushLast(stack.PopLast()); + + stack.PushLast(node); + + node = node->next; + } + + while( stack.GetLength() > 0 ) + stack2.PushLast(stack.PopLast()); + + // We need to swap operands so that the left + // operand is always computed before the right + SwapPostFixOperands(stack2, postfix); + + // Compile the postfix formatted expression + return CompilePostFixExpression(&postfix, ctx); +} + +void asCCompiler::SwapPostFixOperands(asCArray &postfix, asCArray &target) +{ + if( postfix.GetLength() == 0 ) return; + + asCScriptNode *node = postfix.PopLast(); + if( node->nodeType == snExprTerm ) + { + target.PushLast(node); + return; + } + + SwapPostFixOperands(postfix, target); + SwapPostFixOperands(postfix, target); + + target.PushLast(node); +} + +int asCCompiler::CompilePostFixExpression(asCArray *postfix, asSExprContext *ctx) +{ + // Shouldn't send any byte code + asASSERT(ctx->bc.GetLastInstr() == -1); + + // Pop the last node + asCScriptNode *node = postfix->PopLast(); + ctx->exprNode = node; + + // If term, compile the term + if( node->nodeType == snExprTerm ) + return CompileExpressionTerm(node, ctx); + + // Compile the two expression terms + asSExprContext r(engine), l(engine); + + int ret; + ret = CompilePostFixExpression(postfix, &l); if( ret < 0 ) return ret; + ret = CompilePostFixExpression(postfix, &r); if( ret < 0 ) return ret; + + // Compile the operation + return CompileOperator(node, &l, &r, ctx); +} + +int asCCompiler::CompileExpressionTerm(asCScriptNode *node, asSExprContext *ctx) +{ + // Shouldn't send any byte code + asASSERT(ctx->bc.GetLastInstr() == -1); + + // Set the type as a dummy by default, in case of any compiler errors + ctx->type.SetDummy(); + + // Compile the value node + asCScriptNode *vnode = node->firstChild; + while( vnode->nodeType != snExprValue ) + vnode = vnode->next; + + asSExprContext v(engine); + int r = CompileExpressionValue(vnode, &v); if( r < 0 ) return r; + + // Compile post fix operators + asCScriptNode *pnode = vnode->next; + while( pnode ) + { + r = CompileExpressionPostOp(pnode, &v); if( r < 0 ) return r; + pnode = pnode->next; + } + + // Compile pre fix operators + pnode = vnode->prev; + while( pnode ) + { + r = CompileExpressionPreOp(pnode, &v); if( r < 0 ) return r; + pnode = pnode->prev; + } + + // Return the byte code and final type description + MergeExprContexts(ctx, &v); + + ctx->type = v.type; + ctx->property_get = v.property_get; + ctx->property_set = v.property_set; + ctx->property_const = v.property_const; + ctx->property_handle = v.property_handle; + + return 0; +} + +int asCCompiler::CompileExpressionValue(asCScriptNode *node, asSExprContext *ctx) +{ + // Shouldn't receive any byte code + asASSERT(ctx->bc.GetLastInstr() == -1); + + asCScriptNode *vnode = node->firstChild; + if( vnode->nodeType == snVariableAccess ) + { + // Determine the scope resolution of the variable + asCString scope = GetScopeFromNode(vnode); + + // Determine the name of the variable + vnode = vnode->lastChild; + asASSERT(vnode->nodeType == snIdentifier ); + asCString name(&script->code[vnode->tokenPos], vnode->tokenLength); + + sVariable *v = 0; + if( scope == "" ) + v = variables->GetVariable(name.AddressOf()); + if( v == 0 ) + { + // It is not a local variable or parameter + bool found = false; + + // Is it a class member? + if( outFunc && outFunc->objectType && scope == "" ) + { + if( name == THIS_TOKEN ) + { + asCDataType dt = asCDataType::CreateObject(outFunc->objectType, outFunc->isReadOnly); + + // The object pointer is located at stack position 0 + ctx->bc.InstrSHORT(asBC_PSF, 0); + ctx->type.SetVariable(dt, 0, false); + ctx->type.dataType.MakeReference(true); + + found = true; + } + + if( !found ) + { + // See if there are any matching property accessors + asSExprContext access(engine); + access.type.Set(asCDataType::CreateObject(outFunc->objectType, outFunc->isReadOnly)); + int r = FindPropertyAccessor(name, &access, node); + if( r < 0 ) return -1; + if( access.property_get || access.property_set ) + { + // Prepare the bytecode for the member access + ctx->bc.InstrSHORT(asBC_PSF, 0); + ctx->type.SetVariable(asCDataType::CreateObject(outFunc->objectType, outFunc->isReadOnly), 0, false); + ctx->type = access.type; + ctx->property_get = access.property_get; + ctx->property_set = access.property_set; + ctx->property_const = access.property_const; + ctx->property_handle = access.property_handle; + + found = true; + } + } + + if( !found ) + { + asCDataType dt = asCDataType::CreateObject(outFunc->objectType, false); + asCObjectProperty *prop = builder->GetObjectProperty(dt, name.AddressOf()); + if( prop ) + { + // The object pointer is located at stack position 0 + ctx->bc.InstrSHORT(asBC_PSF, 0); + ctx->type.SetVariable(dt, 0, false); + ctx->type.dataType.MakeReference(true); + + Dereference(ctx, true); + + // TODO: This is the same as what is in CompileExpressionPostOp + // Put the offset on the stack + ctx->bc.InstrINT(asBC_ADDSi, prop->byteOffset); + + if( prop->type.IsReference() ) + ctx->bc.Instr(asBC_RDSPTR); + + // Reference to primitive must be stored in the temp register + if( prop->type.IsPrimitive() ) + { + // The ADD offset command should store the reference in the register directly + ctx->bc.Instr(asBC_PopRPtr); + } + + // Set the new type (keeping info about temp variable) + ctx->type.dataType = prop->type; + ctx->type.dataType.MakeReference(true); + ctx->type.isVariable = false; + + if( ctx->type.dataType.IsObject() && !ctx->type.dataType.IsObjectHandle() ) + { + // Objects that are members are not references + ctx->type.dataType.MakeReference(false); + } + + // If the object reference is const, the property will also be const + ctx->type.dataType.MakeReadOnly(outFunc->isReadOnly); + + found = true; + } + } + } + + // Is it a global property? + if( !found && (scope == "" || scope == "::") ) + { + bool isCompiled = true; + bool isPureConstant = false; + asQWORD constantValue; + asCGlobalProperty *prop = builder->GetGlobalProperty(name.AddressOf(), &isCompiled, &isPureConstant, &constantValue); + if( prop ) + { + found = true; + + // Verify that the global property has been compiled already + if( isCompiled ) + { + if( ctx->type.dataType.GetObjectType() && (ctx->type.dataType.GetObjectType()->flags & asOBJ_IMPLICIT_HANDLE) ) + { + ctx->type.dataType.MakeHandle(true); + ctx->type.isExplicitHandle = true; + } + + // If the global property is a pure constant + // we can allow the compiler to optimize it. Pure + // constants are global constant variables that were + // initialized by literal constants. + if( isPureConstant ) + ctx->type.SetConstantQW(prop->type, constantValue); + else + { + ctx->type.Set(prop->type); + ctx->type.dataType.MakeReference(true); + + // Push the address of the variable on the stack + // TODO: global: The global var address should be stored in the instruction directly + if( ctx->type.dataType.IsPrimitive() ) + ctx->bc.InstrWORD(asBC_LDG, (asWORD)outFunc->GetGlobalVarPtrIndex(prop->id)); + else + // TODO: global: The global var address should be stored in the instruction directly + ctx->bc.InstrWORD(asBC_PGA, (asWORD)outFunc->GetGlobalVarPtrIndex(prop->id)); + } + } + else + { + asCString str; + str.Format(TXT_UNINITIALIZED_GLOBAL_VAR_s, prop->name.AddressOf()); + Error(str.AddressOf(), vnode); + return -1; + } + } + } + + if( !found ) + { + asCObjectType *scopeType = 0; + if( scope != "" ) + { + // resolve the type before the scope + scopeType = builder->GetObjectType( scope.AddressOf() ); + } + + // Is it an enum value? + asDWORD value = 0; + asCDataType dt; + if( scopeType && builder->GetEnumValueFromObjectType(scopeType, name.AddressOf(), dt, value) ) + { + // scoped enum value found + found = true; + } + else if( scope == "" && !engine->ep.requireEnumScope ) + { + // look for the enum value with no namespace + int e = builder->GetEnumValue(name.AddressOf(), dt, value); + if( e ) + { + found = true; + if( e == 2 ) + { + Error(TXT_FOUND_MULTIPLE_ENUM_VALUES, vnode); + } + } + } + + if( found ) + { + // an enum value was resolved + ctx->type.SetConstantDW(dt, value); + } + } + + if( !found ) + { + // Prepend the scope to the name for the error message + if( scope != "" && scope != "::" ) + scope += "::"; + scope += name; + + asCString str; + str.Format(TXT_s_NOT_DECLARED, scope.AddressOf()); + Error(str.AddressOf(), vnode); + + // Give dummy value + ctx->type.SetDummy(); + + // Declare the variable now so that it will not be reported again + variables->DeclareVariable(name.AddressOf(), asCDataType::CreatePrimitive(ttInt, false), 0x7FFF); + + // Mark the variable as initialized so that the user will not be bother by it again + sVariable *v = variables->GetVariable(name.AddressOf()); + asASSERT(v); + if( v ) v->isInitialized = true; + + return -1; + } + } + else + { + // It is a variable or parameter + + if( v->isPureConstant ) + ctx->type.SetConstantQW(v->type, v->constantValue); + else + { + if( v->type.IsPrimitive() ) + { + if( v->type.IsReference() ) + { + // Copy the reference into the register +#if AS_PTR_SIZE == 1 + ctx->bc.InstrSHORT(asBC_CpyVtoR4, (short)v->stackOffset); +#else + ctx->bc.InstrSHORT(asBC_CpyVtoR8, (short)v->stackOffset); +#endif + ctx->type.Set(v->type); + } + else + ctx->type.SetVariable(v->type, v->stackOffset, false); + } + else + { + ctx->bc.InstrSHORT(asBC_PSF, (short)v->stackOffset); + ctx->type.SetVariable(v->type, v->stackOffset, false); + ctx->type.dataType.MakeReference(true); + + // Implicitly dereference handle parameters sent by reference + if( v->type.IsReference() && (!v->type.IsObject() || v->type.IsObjectHandle()) ) + ctx->bc.Instr(asBC_RDSPTR); + } + } + } + } + else if( vnode->nodeType == snConstant ) + { + if( vnode->tokenType == ttIntConstant ) + { + asCString value(&script->code[vnode->tokenPos], vnode->tokenLength); + + asQWORD val = asStringScanUInt64(value.AddressOf(), 10, 0); + + // Do we need 64 bits? + if( val>>32 ) + ctx->type.SetConstantQW(asCDataType::CreatePrimitive(ttUInt64, true), val); + else + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttUInt, true), asDWORD(val)); + } + else if( vnode->tokenType == ttBitsConstant ) + { + asCString value(&script->code[vnode->tokenPos+2], vnode->tokenLength-2); + + // TODO: Check for overflow + asQWORD val = asStringScanUInt64(value.AddressOf(), 16, 0); + + // Do we need 64 bits? + if( val>>32 ) + ctx->type.SetConstantQW(asCDataType::CreatePrimitive(ttUInt64, true), val); + else + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttUInt, true), asDWORD(val)); + } + else if( vnode->tokenType == ttFloatConstant ) + { + asCString value(&script->code[vnode->tokenPos], vnode->tokenLength); + + // TODO: Check for overflow + + size_t numScanned; + float v = float(asStringScanDouble(value.AddressOf(), &numScanned)); + ctx->type.SetConstantF(asCDataType::CreatePrimitive(ttFloat, true), v); + asASSERT(numScanned == vnode->tokenLength - 1); + } + else if( vnode->tokenType == ttDoubleConstant ) + { + asCString value(&script->code[vnode->tokenPos], vnode->tokenLength); + + // TODO: Check for overflow + + size_t numScanned; + double v = asStringScanDouble(value.AddressOf(), &numScanned); + ctx->type.SetConstantD(asCDataType::CreatePrimitive(ttDouble, true), v); + asASSERT(numScanned == vnode->tokenLength); + } + else if( vnode->tokenType == ttTrue || + vnode->tokenType == ttFalse ) + { +#if AS_SIZEOF_BOOL == 1 + ctx->type.SetConstantB(asCDataType::CreatePrimitive(ttBool, true), vnode->tokenType == ttTrue ? VALUE_OF_BOOLEAN_TRUE : 0); +#else + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttBool, true), vnode->tokenType == ttTrue ? VALUE_OF_BOOLEAN_TRUE : 0); +#endif + } + else if( vnode->tokenType == ttStringConstant || + vnode->tokenType == ttMultilineStringConstant || + vnode->tokenType == ttHeredocStringConstant ) + { + asCString str; + asCScriptNode *snode = vnode->firstChild; + if( script->code[snode->tokenPos] == '\'' && engine->ep.useCharacterLiterals ) + { + // Treat the single quoted string as a single character literal + str.Assign(&script->code[snode->tokenPos+1], snode->tokenLength-2); + + asDWORD val = 0; + if( str.GetLength() && (unsigned char)str[0] > 127 && engine->ep.scanner == 1 ) + { + // This is the start of a UTF8 encoded character. We need to decode it + val = asStringDecodeUTF8(str.AddressOf(), 0); + if( val == (asDWORD)-1 ) + Error(TXT_INVALID_CHAR_LITERAL, vnode); + } + else + { + val = ProcessStringConstant(str, snode); + if( val == (asDWORD)-1 ) + Error(TXT_INVALID_CHAR_LITERAL, vnode); + } + + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttUInt, true), val); + } + else + { + // Process the string constants + while( snode ) + { + asCString cat; + if( snode->tokenType == ttStringConstant ) + { + cat.Assign(&script->code[snode->tokenPos+1], snode->tokenLength-2); + ProcessStringConstant(cat, snode); + } + else if( snode->tokenType == ttMultilineStringConstant ) + { + if( !engine->ep.allowMultilineStrings ) + Error(TXT_MULTILINE_STRINGS_NOT_ALLOWED, snode); + + cat.Assign(&script->code[snode->tokenPos+1], snode->tokenLength-2); + ProcessStringConstant(cat, snode); + } + else if( snode->tokenType == ttHeredocStringConstant ) + { + cat.Assign(&script->code[snode->tokenPos+3], snode->tokenLength-6); + ProcessHeredocStringConstant(cat, snode); + } + + str += cat; + + snode = snode->next; + } + + // Call the string factory function to create a string object + asCScriptFunction *descr = engine->stringFactory; + if( descr == 0 ) + { + // Error + Error(TXT_STRINGS_NOT_RECOGNIZED, vnode); + + // Give dummy value + ctx->type.SetDummy(); + return -1; + } + else + { + // Register the constant string with the engine + int id = engine->AddConstantString(str.AddressOf(), str.GetLength()); + ctx->bc.InstrWORD(asBC_STR, (asWORD)id); + PerformFunctionCall(descr->id, ctx); + } + } + } + else if( vnode->tokenType == ttNull ) + { +#ifndef AS_64BIT_PTR + ctx->bc.InstrDWORD(asBC_PshC4, 0); +#else + ctx->bc.InstrQWORD(asBC_PshC8, 0); +#endif + ctx->type.SetNullConstant(); + } + else + asASSERT(false); + } + else if( vnode->nodeType == snFunctionCall ) + { + bool found = false; + + // Determine the scope resolution + asCString scope = GetScopeFromNode(vnode); + + if( outFunc && outFunc->objectType && scope != "::" ) + { + // Check if a class method is being called + asCScriptNode *nm = vnode->lastChild->prev; + asCString name; + name.Assign(&script->code[nm->tokenPos], nm->tokenLength); + + asCArray funcs; + + // If we're compiling a constructor and the name of the function called + // is 'super' then the base class' constructor is being called. + // super cannot be called from another scope, i.e. must not be prefixed + if( m_isConstructor && name == SUPER_TOKEN && nm->prev == 0 ) + { + // Actually it is the base class' constructor that is being called, + // but as we won't use the actual function ids here we can take the + // object's own constructors and avoid the need to check if the + // object actually derives from any other class + funcs = outFunc->objectType->beh.constructors; + + // Must not allow calling constructors multiple times + if( continueLabels.GetLength() > 0 ) + { + // If a continue label is set we are in a loop + Error(TXT_CANNOT_CALL_CONSTRUCTOR_IN_LOOPS, vnode); + } + else if( breakLabels.GetLength() > 0 ) + { + // TODO: inheritance: Should eventually allow constructors in switch statements + // If a break label is set we are either in a loop or a switch statements + Error(TXT_CANNOT_CALL_CONSTRUCTOR_IN_SWITCH, vnode); + } + else if( m_isConstructorCalled ) + { + Error(TXT_CANNOT_CALL_CONSTRUCTOR_TWICE, vnode); + } + m_isConstructorCalled = true; + } + else + builder->GetObjectMethodDescriptions(name.AddressOf(), outFunc->objectType, funcs, false); + + if( funcs.GetLength() ) + { + asCDataType dt = asCDataType::CreateObject(outFunc->objectType, false); + + // The object pointer is located at stack position 0 + ctx->bc.InstrSHORT(asBC_PSF, 0); + ctx->type.SetVariable(dt, 0, false); + ctx->type.dataType.MakeReference(true); + + // TODO: optimize: This adds a CHKREF. Is that really necessary? + Dereference(ctx, true); + + CompileFunctionCall(vnode, ctx, outFunc->objectType, false, scope); + found = true; + } + } + + if( !found ) + CompileFunctionCall(vnode, ctx, 0, false, scope); + } + else if( vnode->nodeType == snConstructCall ) + { + CompileConstructCall(vnode, ctx); + } + else if( vnode->nodeType == snAssignment ) + { + asSExprContext e(engine); + CompileAssignment(vnode, &e); + MergeExprContexts(ctx, &e); + ctx->type = e.type; + } + else if( vnode->nodeType == snCast ) + { + // Implement the cast operator + CompileConversion(vnode, ctx); + } + else + asASSERT(false); + + return 0; +} + +asCString asCCompiler::GetScopeFromNode(asCScriptNode *node) +{ + asCString scope; + asCScriptNode *sn = node->firstChild; + if( sn->tokenType == ttScope ) + { + // Global scope + scope = "::"; + sn = sn->next; + } + else if( sn->next && sn->next->tokenType == ttScope ) + { + scope.Assign(&script->code[sn->tokenPos], sn->tokenLength); + sn = sn->next->next; + } + + if( scope != "" ) + { + // We don't support multiple levels of scope yet + if( sn->next && sn->next->tokenType == ttScope ) + { + Error(TXT_INVALID_SCOPE, sn->next); + } + } + + return scope; +} + +asUINT asCCompiler::ProcessStringConstant(asCString &cstr, asCScriptNode *node, bool processEscapeSequences) +{ + int charLiteral = -1; + + // Process escape sequences + asCArray str((int)cstr.GetLength()); + + for( asUINT n = 0; n < cstr.GetLength(); n++ ) + { +#ifdef AS_DOUBLEBYTE_CHARSET + // Double-byte charset is only allowed for ASCII and not UTF16 encoded strings + if( (cstr[n] & 0x80) && engine->ep.scanner == 0 && engine->ep.stringEncoding != 1 ) + { + // This is the lead character of a double byte character + // include the trail character without checking it's value. + str.PushLast(cstr[n]); + n++; + str.PushLast(cstr[n]); + continue; + } +#endif + + asUINT val; + + if( processEscapeSequences && cstr[n] == '\\' ) + { + ++n; + if( n == cstr.GetLength() ) + { + if( charLiteral == -1 ) charLiteral = 0; + return charLiteral; + } + + // TODO: Consider deprecating use of hexadecimal escape sequences, + // as they do not guarantee proper unicode sequences + if( cstr[n] == 'x' || cstr[n] == 'X' ) + { + ++n; + if( n == cstr.GetLength() ) break; + + val = 0; + int c = engine->ep.stringEncoding == 1 ? 4 : 2; + for( ; c > 0 && n < cstr.GetLength(); c--, n++ ) + { + if( cstr[n] >= '0' && cstr[n] <= '9' ) + val = val*16 + cstr[n] - '0'; + else if( cstr[n] >= 'a' && cstr[n] <= 'f' ) + val = val*16 + cstr[n] - 'a' + 10; + else if( cstr[n] >= 'A' && cstr[n] <= 'F' ) + val = val*16 + cstr[n] - 'A' + 10; + else + break; + } + + // Rewind one, since the loop will increment it again + n--; + + // Hexadecimal escape sequences produce exact value, even if it is not proper unicode chars + if( engine->ep.stringEncoding == 0 ) + { + str.PushLast(val); + } + else + { +#ifndef AS_BIG_ENDIAN + str.PushLast(val); + str.PushLast(val>>8); +#else + str.PushLast(val>>8); + str.PushLast(val); +#endif + } + if( charLiteral == -1 ) charLiteral = val; + continue; + } + else if( cstr[n] == 'u' || cstr[n] == 'U' ) + { + // \u expects 4 hex digits + // \U expects 8 hex digits + bool expect2 = cstr[n] == 'u'; + int c = expect2 ? 4 : 8; + + val = 0; + + for( ; c > 0; c-- ) + { + ++n; + if( n == cstr.GetLength() ) break; + + if( cstr[n] >= '0' && cstr[n] <= '9' ) + val = val*16 + cstr[n] - '0'; + else if( cstr[n] >= 'a' && cstr[n] <= 'f' ) + val = val*16 + cstr[n] - 'a' + 10; + else if( cstr[n] >= 'A' && cstr[n] <= 'F' ) + val = val*16 + cstr[n] - 'A' + 10; + else + break; + } + + if( c != 0 ) + { + // Give warning about invalid code point + // TODO: Need code position for warning + asCString msg; + msg.Format(TXT_INVALID_UNICODE_FORMAT_EXPECTED_d, expect2 ? 4 : 8); + Warning(msg.AddressOf(), node); + continue; + } + } + else + { + if( cstr[n] == '"' ) + val = '"'; + else if( cstr[n] == '\'' ) + val = '\''; + else if( cstr[n] == 'n' ) + val = '\n'; + else if( cstr[n] == 'r' ) + val = '\r'; + else if( cstr[n] == 't' ) + val = '\t'; + else if( cstr[n] == '0' ) + val = '\0'; + else if( cstr[n] == '\\' ) + val = '\\'; + else + { + // Invalid escape sequence + Warning(TXT_INVALID_ESCAPE_SEQUENCE, node); + continue; + } + } + } + else + { + if( engine->ep.scanner == 1 && (cstr[n] & 0x80) ) + { + unsigned int len; + val = asStringDecodeUTF8(&cstr[n], &len); + if( val == 0xFFFFFFFF || len < 0 ) + { + // Incorrect UTF8 encoding. Use only the first byte + // TODO: Need code position for warning + Warning(TXT_INVALID_UNICODE_SEQUENCE_IN_SRC, node); + val = (unsigned char)cstr[n]; + } + else + n += len-1; + } + else + val = (unsigned char)cstr[n]; + } + + // Add the character to the final string + char encodedValue[5]; + int len; + if( engine->ep.stringEncoding == 0 ) + { + len = asStringEncodeUTF8(val, encodedValue); + } + else + { + len = asStringEncodeUTF16(val, encodedValue); + } + + if( len < 0 ) + { + // Give warning about invalid code point + // TODO: Need code position for warning + Warning(TXT_INVALID_UNICODE_VALUE, node); + } + else + { + // Add the encoded value to the final string + str.Concatenate(encodedValue, len); + if( charLiteral == -1 ) charLiteral = val; + } + } + + cstr.Assign(str.AddressOf(), str.GetLength()); + return charLiteral; +} + +void asCCompiler::ProcessHeredocStringConstant(asCString &str, asCScriptNode *node) +{ + // Remove first line if it only contains whitespace + asUINT start; + for( start = 0; start < str.GetLength(); start++ ) + { + if( str[start] == '\n' ) + { + // Remove the linebreak as well + start++; + break; + } + + if( str[start] != ' ' && + str[start] != '\t' && + str[start] != '\r' ) + { + // Don't remove anything + start = 0; + break; + } + } + + // Remove last line break and the line after that if it only contains whitespaces + int end; + for( end = (int)str.GetLength() - 1; end >= 0; end-- ) + { + if( str[end] == '\n' ) + break; + + if( str[end] != ' ' && + str[end] != '\t' && + str[end] != '\r' ) + { + // Don't remove anything + end = (int)str.GetLength(); + break; + } + } + + if( end < 0 ) end = 0; + + asCString tmp; + tmp.Assign(&str[start], end-start); + + ProcessStringConstant(tmp, node, false); + + str = tmp; +} + +void asCCompiler::CompileConversion(asCScriptNode *node, asSExprContext *ctx) +{ + asSExprContext expr(engine); + asCDataType to; + bool anyErrors = false; + EImplicitConv convType; + if( node->nodeType == snConstructCall ) + { + convType = asIC_EXPLICIT_VAL_CAST; + + // Verify that there is only one argument + if( node->lastChild->firstChild == 0 || + node->lastChild->firstChild != node->lastChild->lastChild ) + { + Error(TXT_ONLY_ONE_ARGUMENT_IN_CAST, node->lastChild); + expr.type.SetDummy(); + anyErrors = true; + } + else + { + // Compile the expression + int r = CompileAssignment(node->lastChild->firstChild, &expr); + if( r < 0 ) + anyErrors = true; + } + + // Determine the requested type + to = builder->CreateDataTypeFromNode(node->firstChild, script); + to.MakeReadOnly(true); // Default to const + asASSERT(to.IsPrimitive()); + } + else + { + convType = asIC_EXPLICIT_REF_CAST; + + // Compile the expression + int r = CompileAssignment(node->lastChild, &expr); + if( r < 0 ) + anyErrors = true; + else + { + // Determine the requested type + to = builder->CreateDataTypeFromNode(node->firstChild, script); + to = builder->ModifyDataTypeFromNode(to, node->firstChild->next, script, 0, 0); + + // If the type support object handles, then use it + if( to.SupportHandles() ) + { + to.MakeHandle(true); + } + else if( !to.IsObjectHandle() ) + { + // The cast operator can only be used for reference casts + Error(TXT_ILLEGAL_TARGET_TYPE_FOR_REF_CAST, node->firstChild); + anyErrors = true; + } + } + } + + if( anyErrors ) + { + // Assume that the error can be fixed and allow the compilation to continue + ctx->type.SetConstantDW(to, 0); + return; + } + + // We don't want a reference + if( expr.type.dataType.IsReference() ) + { + if( expr.type.dataType.IsObject() ) + Dereference(&expr, true); + else + ConvertToVariable(&expr); + } + + ImplicitConversion(&expr, to, node, convType); + + IsVariableInitialized(&expr.type, node); + + // If no type conversion is really tried ignore it + if( to == expr.type.dataType ) + { + // This will keep information about constant type + MergeExprContexts(ctx, &expr); + ctx->type = expr.type; + return; + } + + if( to.IsEqualExceptConst(expr.type.dataType) && to.IsPrimitive() ) + { + MergeExprContexts(ctx, &expr); + ctx->type = expr.type; + ctx->type.dataType.MakeReadOnly(true); + return; + } + + // The implicit conversion already does most of the conversions permitted, + // here we'll only treat those conversions that require an explicit cast. + + bool conversionOK = false; + if( !expr.type.isConstant ) + { + if( !expr.type.dataType.IsObject() ) + ConvertToTempVariable(&expr); + + if( to.IsObjectHandle() && + expr.type.dataType.IsObjectHandle() && + !(!to.IsHandleToConst() && expr.type.dataType.IsHandleToConst()) ) + { + conversionOK = CompileRefCast(&expr, to, true, node); + + MergeExprContexts(ctx, &expr); + ctx->type = expr.type; + } + } + + if( conversionOK ) + return; + + // Conversion not available + ctx->type.SetDummy(); + + asCString strTo, strFrom; + + strTo = to.Format(); + strFrom = expr.type.dataType.Format(); + + asCString msg; + msg.Format(TXT_NO_CONVERSION_s_TO_s, strFrom.AddressOf(), strTo.AddressOf()); + + Error(msg.AddressOf(), node); +} + +void asCCompiler::AfterFunctionCall(int funcID, asCArray &args, asSExprContext *ctx, bool deferAll) +{ + asCScriptFunction *descr = builder->GetFunctionDescription(funcID); + + // Parameters that are sent by reference should be assigned + // to the evaluated expression if it is an lvalue + + // Evaluate the arguments from last to first + int n = (int)descr->parameterTypes.GetLength() - 1; + for( ; n >= 0; n-- ) + { + if( (descr->parameterTypes[n].IsReference() && (descr->inOutFlags[n] & asTM_OUTREF)) || + (descr->parameterTypes[n].IsObject() && deferAll) ) + { + asASSERT( !(descr->parameterTypes[n].IsReference() && (descr->inOutFlags[n] == asTM_OUTREF)) || args[n]->origExpr ); + + // For &inout, only store the argument if it is for a temporary variable + if( engine->ep.allowUnsafeReferences || + descr->inOutFlags[n] != asTM_INOUTREF || args[n]->type.isTemporary ) + { + // Store the argument for later processing + asSDeferredParam outParam; + outParam.argNode = args[n]->exprNode; + outParam.argType = args[n]->type; + outParam.argInOutFlags = descr->inOutFlags[n]; + outParam.origExpr = args[n]->origExpr; + + ctx->deferredParams.PushLast(outParam); + } + } + else + { + // Release the temporary variable now + ReleaseTemporaryVariable(args[n]->type, &ctx->bc); + } + } +} + +void asCCompiler::ProcessDeferredParams(asSExprContext *ctx) +{ + if( isProcessingDeferredParams ) return; + + isProcessingDeferredParams = true; + + for( asUINT n = 0; n < ctx->deferredParams.GetLength(); n++ ) + { + asSDeferredParam outParam = ctx->deferredParams[n]; + if( outParam.argInOutFlags < asTM_OUTREF ) // &in, or not reference + { + // Just release the variable + ReleaseTemporaryVariable(outParam.argType, &ctx->bc); + } + else if( outParam.argInOutFlags == asTM_OUTREF ) + { + asSExprContext *expr = outParam.origExpr; + + if( outParam.argType.dataType.IsObjectHandle() ) + { + // Implicitly convert the value to a handle + if( expr->type.dataType.IsObjectHandle() ) + expr->type.isExplicitHandle = true; + } + + // Verify that the expression result in a lvalue, or a property accessor + if( IsLValue(expr->type) || expr->property_get || expr->property_set ) + { + asSExprContext rctx(engine); + rctx.type = outParam.argType; + if( rctx.type.dataType.IsPrimitive() ) + rctx.type.dataType.MakeReference(false); + else + { + rctx.bc.InstrSHORT(asBC_PSF, outParam.argType.stackOffset); + rctx.type.dataType.MakeReference(true); + if( expr->type.isExplicitHandle ) + rctx.type.isExplicitHandle = true; + } + + asSExprContext o(engine); + DoAssignment(&o, expr, &rctx, outParam.argNode, outParam.argNode, ttAssignment, outParam.argNode); + + if( !o.type.dataType.IsPrimitive() ) o.bc.Pop(AS_PTR_SIZE); + + MergeExprContexts(ctx, &o); + } + else + { + // We must still evaluate the expression + MergeExprContexts(ctx, expr); + if( !expr->type.isConstant ) + ctx->bc.Pop(expr->type.dataType.GetSizeOnStackDWords()); + + // Give a warning + Warning(TXT_ARG_NOT_LVALUE, outParam.argNode); + + ReleaseTemporaryVariable(outParam.argType, &ctx->bc); + } + + ReleaseTemporaryVariable(expr->type, &ctx->bc); + + // Delete the original expression context + asDELETE(expr,asSExprContext); + } + else // &inout + { + if( outParam.argType.isTemporary ) + ReleaseTemporaryVariable(outParam.argType, &ctx->bc); + else if( !outParam.argType.isVariable ) + { + if( outParam.argType.dataType.IsObject() && + outParam.argType.dataType.GetBehaviour()->addref && + outParam.argType.dataType.GetBehaviour()->release ) + { + // Release the object handle that was taken to guarantee the reference + ReleaseTemporaryVariable(outParam.argType, &ctx->bc); + } + } + } + } + + ctx->deferredParams.SetLength(0); + isProcessingDeferredParams = false; +} + + +void asCCompiler::CompileConstructCall(asCScriptNode *node, asSExprContext *ctx) +{ + // The first node is a datatype node + asCString name; + asCTypeInfo tempObj; + asCArray funcs; + + // It is possible that the name is really a constructor + asCDataType dt; + dt = builder->CreateDataTypeFromNode(node->firstChild, script); + if( dt.IsPrimitive() ) + { + // This is a cast to a primitive type + CompileConversion(node, ctx); + return; + } + + if( globalExpression ) + { + Error(TXT_FUNCTION_IN_GLOBAL_EXPR, node); + + // Output dummy code + ctx->type.SetDummy(); + return; + } + + // Compile the arguments + asCArray args; + asCArray temporaryVariables; + if( CompileArgumentList(node->lastChild, args) >= 0 ) + { + // Check for a value cast behaviour + if( args.GetLength() == 1 && args[0]->type.dataType.GetObjectType() ) + { + asSExprContext conv(engine); + conv.type = args[0]->type; + ImplicitConversion(&conv, dt, node->lastChild, asIC_EXPLICIT_VAL_CAST, false); + + if( conv.type.dataType.IsEqualExceptRef(dt) ) + { + ImplicitConversion(args[0], dt, node->lastChild, asIC_EXPLICIT_VAL_CAST); + + ctx->bc.AddCode(&args[0]->bc); + ctx->type = args[0]->type; + + asDELETE(args[0],asSExprContext); + + return; + } + } + + // Check for possible constructor/factory + name = dt.Format(); + + asSTypeBehaviour *beh = dt.GetBehaviour(); + + if( !(dt.GetObjectType()->flags & asOBJ_REF) ) + { + funcs = beh->constructors; + + // Value types and script types are allocated through the constructor + tempObj.dataType = dt; + tempObj.stackOffset = (short)AllocateVariable(dt, true); + tempObj.dataType.MakeReference(true); + tempObj.isTemporary = true; + tempObj.isVariable = true; + + // Push the address of the object on the stack + ctx->bc.InstrSHORT(asBC_VAR, tempObj.stackOffset); + } + else + { + funcs = beh->factories; + } + + // Special case: Allow calling func(void) with a void expression. + if( args.GetLength() == 1 && args[0]->type.dataType == asCDataType::CreatePrimitive(ttVoid, false) ) + { + // Evaluate the expression before the function call + MergeExprContexts(ctx, args[0]); + asDELETE(args[0],asSExprContext); + args.SetLength(0); + } + + // Special case: If this is an object constructor and there are no arguments use the default constructor. + // If none has been registered, just allocate the variable and push it on the stack. + if( args.GetLength() == 0 ) + { + asSTypeBehaviour *beh = tempObj.dataType.GetBehaviour(); + if( beh && beh->construct == 0 && !(dt.GetObjectType()->flags & asOBJ_REF) ) + { + // Call the default constructor + ctx->type = tempObj; + + asASSERT(ctx->bc.GetLastInstr() == asBC_VAR); + ctx->bc.RemoveLastInstr(); + + CallDefaultConstructor(tempObj.dataType, tempObj.stackOffset, &ctx->bc, node); + + // Push the reference on the stack + ctx->bc.InstrSHORT(asBC_PSF, tempObj.stackOffset); + return; + } + } + + MatchFunctions(funcs, args, node, name.AddressOf(), NULL, false); + + if( funcs.GetLength() != 1 ) + { + // The error was reported by MatchFunctions() + + // Dummy value + ctx->type.SetDummy(); + } + else + { + asCByteCode objBC(engine); + + PrepareFunctionCall(funcs[0], &ctx->bc, args); + + MoveArgsToStack(funcs[0], &ctx->bc, args, false); + + if( !(dt.GetObjectType()->flags & asOBJ_REF) ) + { + int offset = 0; + asCScriptFunction *descr = builder->GetFunctionDescription(funcs[0]); + for( asUINT n = 0; n < args.GetLength(); n++ ) + offset += descr->parameterTypes[n].GetSizeOnStackDWords(); + + ctx->bc.InstrWORD(asBC_GETREF, (asWORD)offset); + + PerformFunctionCall(funcs[0], ctx, true, &args, tempObj.dataType.GetObjectType()); + + // The constructor doesn't return anything, + // so we have to manually inform the type of + // the return value + ctx->type = tempObj; + + // Push the address of the object on the stack again + ctx->bc.InstrSHORT(asBC_PSF, tempObj.stackOffset); + } + else + { + // Call the factory to create the reference type + PerformFunctionCall(funcs[0], ctx, false, &args); + } + } + } + else + { + // Failed to compile the argument list, set the result to the dummy type + ctx->type.SetDummy(); + } + + // Cleanup + for( asUINT n = 0; n < args.GetLength(); n++ ) + if( args[n] ) + { + asDELETE(args[n],asSExprContext); + } +} + + +void asCCompiler::CompileFunctionCall(asCScriptNode *node, asSExprContext *ctx, asCObjectType *objectType, bool objIsConst, const asCString &scope) +{ + asCString name; + asCTypeInfo tempObj; + asCArray funcs; + + asCScriptNode *nm = node->lastChild->prev; + name.Assign(&script->code[nm->tokenPos], nm->tokenLength); + + if( objectType ) + { + // If we're compiling a constructor and the name of the function is super then + // the constructor of the base class is being called. + // super cannot be prefixed with a scope operator + if( m_isConstructor && name == SUPER_TOKEN && nm->prev == 0 ) + { + // If the class is not derived from anyone else, calling super should give an error + if( objectType->derivedFrom ) + funcs = objectType->derivedFrom->beh.constructors; + } + else + builder->GetObjectMethodDescriptions(name.AddressOf(), objectType, funcs, objIsConst, scope); + } + else + builder->GetFunctionDescriptions(name.AddressOf(), funcs); + + if( globalExpression ) + { + Error(TXT_FUNCTION_IN_GLOBAL_EXPR, node); + + // Output dummy code + ctx->type.SetDummy(); + return; + } + + // Compile the arguments + asCArray args; + asCArray temporaryVariables; + + if( CompileArgumentList(node->lastChild, args) >= 0 ) + { + // Special case: Allow calling func(void) with a void expression. + if( args.GetLength() == 1 && args[0]->type.dataType == asCDataType::CreatePrimitive(ttVoid, false) ) + { + // Evaluate the expression before the function call + MergeExprContexts(ctx, args[0]); + asDELETE(args[0],asSExprContext); + args.SetLength(0); + } + + MatchFunctions(funcs, args, node, name.AddressOf(), objectType, objIsConst, false, true, scope); + + if( funcs.GetLength() != 1 ) + { + // The error was reported by MatchFunctions() + + // Dummy value + ctx->type.SetDummy(); + } + else + { + MakeFunctionCall(ctx, funcs[0], objectType, args, node); + } + } + else + { + // Failed to compile the argument list, set the dummy type and continue compilation + ctx->type.SetDummy(); + } + + // Cleanup + for( asUINT n = 0; n < args.GetLength(); n++ ) + if( args[n] ) + { + asDELETE(args[n],asSExprContext); + } +} + +int asCCompiler::CompileExpressionPreOp(asCScriptNode *node, asSExprContext *ctx) +{ + int op = node->tokenType; + + IsVariableInitialized(&ctx->type, node); + + if( op == ttHandle ) + { + // Verify that the type allow its handle to be taken + if( ctx->type.isExplicitHandle || !ctx->type.dataType.IsObject() || !ctx->type.dataType.GetObjectType()->beh.addref || !ctx->type.dataType.GetObjectType()->beh.release ) + { + Error(TXT_OBJECT_HANDLE_NOT_SUPPORTED, node); + return -1; + } + + // Objects that are not local variables are not references + if( !ctx->type.dataType.IsReference() && !(ctx->type.dataType.IsObject() && !ctx->type.isVariable) ) + { + Error(TXT_NOT_VALID_REFERENCE, node); + return -1; + } + + // If this is really an object then the handle created is a const handle + bool makeConst = !ctx->type.dataType.IsObjectHandle(); + + // Mark the type as an object handle + ctx->type.dataType.MakeHandle(true); + ctx->type.isExplicitHandle = true; + if( makeConst ) + ctx->type.dataType.MakeReadOnly(true); + } + else if( (op == ttMinus || op == ttBitNot) && ctx->type.dataType.IsObject() ) + { + // Look for the opNeg or opCom methods + const char *opName = 0; + switch( op ) + { + case ttMinus: opName = "opNeg"; break; + case ttBitNot: opName = "opCom"; break; + } + + if( opName ) + { + ProcessPropertyGetAccessor(ctx, node); + + // Is it a const value? + bool isConst = false; + if( ctx->type.dataType.IsObjectHandle() ) + isConst = ctx->type.dataType.IsHandleToConst(); + else + isConst = ctx->type.dataType.IsReadOnly(); + + // TODO: If the value isn't const, then first try to find the non const method, and if not found try to find the const method + + // Find the correct method + asCArray funcs; + asCObjectType *ot = ctx->type.dataType.GetObjectType(); + for( asUINT n = 0; n < ot->methods.GetLength(); n++ ) + { + asCScriptFunction *func = engine->scriptFunctions[ot->methods[n]]; + if( func->name == opName && + func->parameterTypes.GetLength() == 0 && + (!isConst || func->isReadOnly) ) + { + funcs.PushLast(func->id); + } + } + + // Did we find the method? + if( funcs.GetLength() == 1 ) + { + asCTypeInfo objType = ctx->type; + asCArray args; + MakeFunctionCall(ctx, funcs[0], objType.dataType.GetObjectType(), args, node); + ReleaseTemporaryVariable(objType, &ctx->bc); + return 0; + } + else if( funcs.GetLength() == 0 ) + { + asCString str; + str = asCString(opName) + "()"; + if( isConst ) + str += " const"; + str.Format(TXT_FUNCTION_s_NOT_FOUND, str.AddressOf()); + Error(str.AddressOf(), node); + ctx->type.SetDummy(); + return -1; + } + else if( funcs.GetLength() > 1 ) + { + Error(TXT_MORE_THAN_ONE_MATCHING_OP, node); + PrintMatchingFuncs(funcs, node); + + ctx->type.SetDummy(); + return -1; + } + } + } + else if( op == ttPlus || op == ttMinus ) + { + ProcessPropertyGetAccessor(ctx, node); + + asCDataType to = ctx->type.dataType; + + // TODO: The case -2147483648 gives an unecessary warning of changed sign for implicit conversion + + if( ctx->type.dataType.IsUnsignedType() || ctx->type.dataType.IsEnumType() ) + { + if( ctx->type.dataType.GetSizeInMemoryBytes() == 1 ) + to = asCDataType::CreatePrimitive(ttInt8, false); + else if( ctx->type.dataType.GetSizeInMemoryBytes() == 2 ) + to = asCDataType::CreatePrimitive(ttInt16, false); + else if( ctx->type.dataType.GetSizeInMemoryBytes() == 4 ) + to = asCDataType::CreatePrimitive(ttInt, false); + else if( ctx->type.dataType.GetSizeInMemoryBytes() == 8 ) + to = asCDataType::CreatePrimitive(ttInt64, false); + else + { + Error(TXT_INVALID_TYPE, node); + return -1; + } + } + + if( ctx->type.dataType.IsReference() ) ConvertToVariable(ctx); + ImplicitConversion(ctx, to, node, asIC_IMPLICIT_CONV); + + if( !ctx->type.isConstant ) + { + ConvertToTempVariable(ctx); + + if( op == ttMinus ) + { + if( ctx->type.dataType.IsIntegerType() && ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + ctx->bc.InstrSHORT(asBC_NEGi, ctx->type.stackOffset); + else if( ctx->type.dataType.IsIntegerType() && ctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + ctx->bc.InstrSHORT(asBC_NEGi64, ctx->type.stackOffset); + else if( ctx->type.dataType.IsFloatType() ) + ctx->bc.InstrSHORT(asBC_NEGf, ctx->type.stackOffset); + else if( ctx->type.dataType.IsDoubleType() ) + ctx->bc.InstrSHORT(asBC_NEGd, ctx->type.stackOffset); + else + { + Error(TXT_ILLEGAL_OPERATION, node); + return -1; + } + + return 0; + } + } + else + { + if( op == ttMinus ) + { + if( ctx->type.dataType.IsIntegerType() && ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + ctx->type.intValue = -ctx->type.intValue; + else if( ctx->type.dataType.IsIntegerType() && ctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + ctx->type.qwordValue = -(asINT64)ctx->type.qwordValue; + else if( ctx->type.dataType.IsFloatType() ) + ctx->type.floatValue = -ctx->type.floatValue; + else if( ctx->type.dataType.IsDoubleType() ) + ctx->type.doubleValue = -ctx->type.doubleValue; + else + { + Error(TXT_ILLEGAL_OPERATION, node); + return -1; + } + + return 0; + } + } + + if( op == ttPlus ) + { + if( !ctx->type.dataType.IsIntegerType() && + !ctx->type.dataType.IsFloatType() && + !ctx->type.dataType.IsDoubleType() ) + { + Error(TXT_ILLEGAL_OPERATION, node); + return -1; + } + } + } + else if( op == ttNot ) + { + if( ctx->type.dataType.IsEqualExceptRefAndConst(asCDataType::CreatePrimitive(ttBool, true)) ) + { + if( ctx->type.isConstant ) + { + ctx->type.dwordValue = (ctx->type.dwordValue == 0 ? VALUE_OF_BOOLEAN_TRUE : 0); + return 0; + } + + ProcessPropertyGetAccessor(ctx, node); + + ConvertToTempVariable(ctx); + + ctx->bc.InstrSHORT(asBC_NOT, ctx->type.stackOffset); + } + else + { + Error(TXT_ILLEGAL_OPERATION, node); + return -1; + } + } + else if( op == ttBitNot ) + { + ProcessPropertyGetAccessor(ctx, node); + + asCDataType to = ctx->type.dataType; + + if( ctx->type.dataType.IsIntegerType() || ctx->type.dataType.IsEnumType() ) + { + if( ctx->type.dataType.GetSizeInMemoryBytes() == 1 ) + to = asCDataType::CreatePrimitive(ttUInt8, false); + else if( ctx->type.dataType.GetSizeInMemoryBytes() == 2 ) + to = asCDataType::CreatePrimitive(ttUInt16, false); + else if( ctx->type.dataType.GetSizeInMemoryBytes() == 4 ) + to = asCDataType::CreatePrimitive(ttUInt, false); + else if( ctx->type.dataType.GetSizeInMemoryBytes() == 8 ) + to = asCDataType::CreatePrimitive(ttUInt64, false); + else + { + Error(TXT_INVALID_TYPE, node); + return -1; + } + } + + if( ctx->type.dataType.IsReference() ) ConvertToVariable(ctx); + ImplicitConversion(ctx, to, node, asIC_IMPLICIT_CONV); + + if( ctx->type.dataType.IsUnsignedType() ) + { + if( ctx->type.isConstant ) + { + ctx->type.qwordValue = ~ctx->type.qwordValue; + return 0; + } + + ConvertToTempVariable(ctx); + if( ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + ctx->bc.InstrSHORT(asBC_BNOT, ctx->type.stackOffset); + else + ctx->bc.InstrSHORT(asBC_BNOT64, ctx->type.stackOffset); + } + else + { + Error(TXT_ILLEGAL_OPERATION, node); + return -1; + } + } + else if( op == ttInc || op == ttDec ) + { + // Need a reference to the primitive that will be updated + // The result of this expression is the same reference as before + if( globalExpression ) + { + Error(TXT_INC_OP_IN_GLOBAL_EXPR, node); + return -1; + } + + // Make sure the reference isn't a temporary variable + if( ctx->type.isTemporary ) + { + Error(TXT_REF_IS_TEMP, node); + return -1; + } + if( ctx->type.dataType.IsReadOnly() ) + { + Error(TXT_REF_IS_READ_ONLY, node); + return -1; + } + + if( ctx->type.isVariable ) + ConvertToReference(ctx); + else if( !ctx->type.dataType.IsReference() ) + { + Error(TXT_NOT_VALID_REFERENCE, node); + return -1; + } + + if( ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttInt64, false)) || + ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttUInt64, false)) ) + { + if( op == ttInc ) + ctx->bc.Instr(asBC_INCi64); + else + ctx->bc.Instr(asBC_DECi64); + } + else if( ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttInt, false)) || + ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttUInt, false)) ) + { + if( op == ttInc ) + ctx->bc.Instr(asBC_INCi); + else + ctx->bc.Instr(asBC_DECi); + } + else if( ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttInt16, false)) || + ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttUInt16, false)) ) + { + if( op == ttInc ) + ctx->bc.Instr(asBC_INCi16); + else + ctx->bc.Instr(asBC_DECi16); + } + else if( ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttInt8, false)) || + ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttUInt8, false)) ) + { + if( op == ttInc ) + ctx->bc.Instr(asBC_INCi8); + else + ctx->bc.Instr(asBC_DECi8); + } + else if( ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttFloat, false)) ) + { + if( op == ttInc ) + ctx->bc.Instr(asBC_INCf); + else + ctx->bc.Instr(asBC_DECf); + } + else if( ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttDouble, false)) ) + { + if( op == ttInc ) + ctx->bc.Instr(asBC_INCd); + else + ctx->bc.Instr(asBC_DECd); + } + else + { + Error(TXT_ILLEGAL_OPERATION, node); + return -1; + } + } + else + { + // Unknown operator + asASSERT(false); + return -1; + } + + return 0; +} + +void asCCompiler::ConvertToReference(asSExprContext *ctx) +{ + if( ctx->type.isVariable ) + { + ctx->bc.InstrSHORT(asBC_LDV, ctx->type.stackOffset); + ctx->type.dataType.MakeReference(true); + ctx->type.Set(ctx->type.dataType); + } +} + +int asCCompiler::FindPropertyAccessor(const asCString &name, asSExprContext *ctx, asCScriptNode *node) +{ + if( !ctx->type.dataType.IsObject() ) + return 0; + + // Check if the object as any methods with the property name prefixed by get_ or set_ + int getId = 0, setId = 0; + asCString getName = "get_" + name; + asCString setName = "set_" + name; + asCArray multipleGetFuncs, multipleSetFuncs; + asCObjectType *ot = ctx->type.dataType.GetObjectType(); + for( asUINT n = 0; n < ot->methods.GetLength(); n++ ) + { + asCScriptFunction *f = engine->scriptFunctions[ot->methods[n]]; + if( f->name == getName && f->parameterTypes.GetLength() == 0 ) + { + if( getId == 0 ) + getId = ot->methods[n]; + else + { + if( multipleGetFuncs.GetLength() == 0 ) + multipleGetFuncs.PushLast(getId); + + multipleGetFuncs.PushLast(ot->methods[n]); + } + } + // TODO: getset: If the parameter is a reference, it must not be an out reference. Should we allow inout ref? + if( f->name == setName && f->parameterTypes.GetLength() == 1 ) + { + if( setId == 0 ) + setId = ot->methods[n]; + else + { + if( multipleSetFuncs.GetLength() == 0 ) + multipleSetFuncs.PushLast(setId); + + multipleSetFuncs.PushLast(ot->methods[n]); + } + } + } + + // Check for multiple matches + if( multipleGetFuncs.GetLength() > 0 ) + { + asCString str; + str.Format(TXT_MULTIPLE_PROP_GET_ACCESSOR_FOR_s, name.AddressOf()); + Error(str.AddressOf(), node); + + PrintMatchingFuncs(multipleGetFuncs, node); + + return -1; + } + + if( multipleSetFuncs.GetLength() > 0 ) + { + asCString str; + str.Format(TXT_MULTIPLE_PROP_SET_ACCESSOR_FOR_s, name.AddressOf()); + Error(str.AddressOf(), node); + + PrintMatchingFuncs(multipleSetFuncs, node); + + return -1; + } + + // Check for type compatibility between get and set accessor + if( getId && setId ) + { + asCScriptFunction *getFunc = engine->scriptFunctions[getId]; + asCScriptFunction *setFunc = engine->scriptFunctions[setId]; + + if( !getFunc->returnType.IsEqualExceptRefAndConst(setFunc->parameterTypes[0]) ) + { + asCString str; + str.Format(TXT_GET_SET_ACCESSOR_TYPE_MISMATCH_FOR_s, name.AddressOf()); + Error(str.AddressOf(), node); + + asCArray funcs; + funcs.PushLast(getId); + funcs.PushLast(setId); + + PrintMatchingFuncs(funcs, node); + + return -1; + } + } + + if( getId || setId ) + { + // Property accessors were found, but we don't know which is to be used yet, so + // we just prepare the bytecode for the method call, and then store the function ids + // so that the right one can be used when we get there. + ctx->property_get = getId; + ctx->property_set = setId; + + // If the object is read-only then we need to remember + if( (!ctx->type.dataType.IsObjectHandle() && ctx->type.dataType.IsReadOnly()) || + (ctx->type.dataType.IsObjectHandle() && ctx->type.dataType.IsHandleToConst()) ) + ctx->property_const = true; + else + ctx->property_const = false; + + // If the object is a handle then we need to remember that + ctx->property_handle = ctx->type.dataType.IsObjectHandle(); + + asCDataType dt; + if( getId ) + dt = engine->scriptFunctions[getId]->returnType; + else + dt = engine->scriptFunctions[setId]->parameterTypes[0]; + + // Just change the type, the context must still maintain information + // about previous variable offset and the indicator of temporary variable. + int offset = ctx->type.stackOffset; + bool isTemp = ctx->type.isTemporary; + ctx->type.Set(dt); + ctx->type.stackOffset = offset; + ctx->type.isTemporary = isTemp; + + return 1; + } + + // No accessor was found + return 0; +} + +int asCCompiler::ProcessPropertySetAccessor(asSExprContext *ctx, asSExprContext *arg, asCScriptNode *node) +{ + // TODO: A lot of this code is similar to ProcessPropertyGetAccessor. Can we unify them? + + if( !ctx->property_set ) + { + Error(TXT_PROPERTY_HAS_NO_SET_ACCESSOR, node); + return -1; + } + + // Setup the context with the original type so the method call gets built correctly + asCTypeInfo objType = ctx->type; + asCScriptFunction *func = engine->scriptFunctions[ctx->property_set]; + ctx->type.dataType = asCDataType::CreateObject(func->objectType, ctx->property_const); + if( ctx->property_handle ) + ctx->type.dataType.MakeHandle(true); + ctx->type.dataType.MakeReference(true); + + // Don't allow the call if the object is read-only and the property accessor is not const + // TODO: This can probably be moved into MakeFunctionCall + if( ctx->property_const && !func->isReadOnly ) + { + Error(TXT_NON_CONST_METHOD_ON_CONST_OBJ, node); + asCArray funcs; + funcs.PushLast(ctx->property_set); + PrintMatchingFuncs(funcs, node); + } + + // Call the accessor + asCArray args; + args.PushLast(arg); + MakeFunctionCall(ctx, ctx->property_set, func->objectType, args, node); + + // TODO: This is from CompileExpressionPostOp, can we unify the code? + if( objType.isTemporary && + ctx->type.dataType.IsReference() && + !ctx->type.isVariable ) // If the resulting type is a variable, then the reference is not a member + { + // Remember the original object's variable, so that it can be released + // later on when the reference to its member goes out of scope + ctx->type.isTemporary = true; + ctx->type.stackOffset = objType.stackOffset; + } + else + { + // As the method didn't return a reference to a member + // we can safely release the original object now + ReleaseTemporaryVariable(objType, &ctx->bc); + } + + ctx->property_get = 0; + ctx->property_set = 0; + + return 0; +} + +void asCCompiler::ProcessPropertyGetAccessor(asSExprContext *ctx, asCScriptNode *node) +{ + // If no property accessor has been prepared then don't do anything + if( !ctx->property_get && !ctx->property_set ) + return; + + if( !ctx->property_get ) + { + // Raise error on missing accessor + Error(TXT_PROPERTY_HAS_NO_GET_ACCESSOR, node); + ctx->type.SetDummy(); + return; + } + + // Setup the context with the original type so the method call gets built correctly + asCTypeInfo objType = ctx->type; + asCScriptFunction *func = engine->scriptFunctions[ctx->property_get]; + ctx->type.dataType = asCDataType::CreateObject(func->objectType, ctx->property_const); + if( ctx->property_handle ) ctx->type.dataType.MakeHandle(true); + ctx->type.dataType.MakeReference(true); + + // Don't allow the call if the object is read-only and the property accessor is not const + if( ctx->property_const && !func->isReadOnly ) + { + Error(TXT_NON_CONST_METHOD_ON_CONST_OBJ, node); + asCArray funcs; + funcs.PushLast(ctx->property_get); + PrintMatchingFuncs(funcs, node); + } + + // Call the accessor + asCArray args; + MakeFunctionCall(ctx, ctx->property_get, func->objectType, args, node); + + // TODO: This is from CompileExpressionPostOp, can we unify the code? + if( objType.isTemporary && + ctx->type.dataType.IsReference() && + !ctx->type.isVariable ) // If the resulting type is a variable, then the reference is not a member + { + // Remember the original object's variable, so that it can be released + // later on when the reference to its member goes out of scope + ctx->type.isTemporary = true; + ctx->type.stackOffset = objType.stackOffset; + } + else + { + // As the method didn't return a reference to a member + // we can safely release the original object now + ReleaseTemporaryVariable(objType, &ctx->bc); + } + + ctx->property_get = 0; + ctx->property_set = 0; +} + +int asCCompiler::CompileExpressionPostOp(asCScriptNode *node, asSExprContext *ctx) +{ + int op = node->tokenType; + + // Check if the variable is initialized (if it indeed is a variable) + IsVariableInitialized(&ctx->type, node); + + if( op == ttInc || op == ttDec ) + { + if( globalExpression ) + { + Error(TXT_INC_OP_IN_GLOBAL_EXPR, node); + return -1; + } + + // Make sure the reference isn't a temporary variable + if( ctx->type.isTemporary ) + { + Error(TXT_REF_IS_TEMP, node); + return -1; + } + if( ctx->type.dataType.IsReadOnly() ) + { + Error(TXT_REF_IS_READ_ONLY, node); + return -1; + } + + if( ctx->type.isVariable ) + ConvertToReference(ctx); + else if( !ctx->type.dataType.IsReference() ) + { + Error(TXT_NOT_VALID_REFERENCE, node); + return -1; + } + + // Copy the value to a temp before changing it + ConvertToTempVariable(ctx); + + // Increment the value pointed to by the reference still in the register + asEBCInstr iInc = asBC_INCi, iDec = asBC_DECi; + if( ctx->type.dataType.IsDoubleType() ) + { + iInc = asBC_INCd; + iDec = asBC_DECd; + } + else if( ctx->type.dataType.IsFloatType() ) + { + iInc = asBC_INCf; + iDec = asBC_DECf; + } + else if( ctx->type.dataType.IsIntegerType() || ctx->type.dataType.IsUnsignedType() ) + { + if( ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttInt16, false)) || + ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttUInt16, false)) ) + { + iInc = asBC_INCi16; + iDec = asBC_DECi16; + } + else if( ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttInt8, false)) || + ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttUInt8, false)) ) + { + iInc = asBC_INCi8; + iDec = asBC_DECi8; + } + else if( ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttInt64, false)) || + ctx->type.dataType.IsEqualExceptRef(asCDataType::CreatePrimitive(ttUInt64, false)) ) + { + iInc = asBC_INCi64; + iDec = asBC_DECi64; + } + } + else + { + Error(TXT_ILLEGAL_OPERATION, node); + return -1; + } + + if( op == ttInc ) ctx->bc.Instr(iInc); else ctx->bc.Instr(iDec); + } + else if( op == ttDot ) + { + if( node->firstChild->nodeType == snIdentifier ) + { + ProcessPropertyGetAccessor(ctx, node); + + // Get the property name + asCString name(&script->code[node->firstChild->tokenPos], node->firstChild->tokenLength); + + // We need to look for get/set property accessors. + // If found, the context stores information on the get/set accessors + // until it is known which is to be used. + int r = FindPropertyAccessor(name, ctx, node); + if( r != 0 ) + return r; + + if( !ctx->type.dataType.IsPrimitive() ) + Dereference(ctx, true); + + if( ctx->type.dataType.IsObjectHandle() ) + { + // Convert the handle to a normal object + asCDataType dt = ctx->type.dataType; + dt.MakeHandle(false); + + ImplicitConversion(ctx, dt, node, asIC_IMPLICIT_CONV); + } + + // Find the property offset and type + if( ctx->type.dataType.IsObject() ) + { + bool isConst = ctx->type.dataType.IsReadOnly(); + + asCObjectProperty *prop = builder->GetObjectProperty(ctx->type.dataType, name.AddressOf()); + if( prop ) + { + // Put the offset on the stack + ctx->bc.InstrINT(asBC_ADDSi, prop->byteOffset); + + if( prop->type.IsReference() ) + ctx->bc.Instr(asBC_RDSPTR); + + // Reference to primitive must be stored in the temp register + if( prop->type.IsPrimitive() ) + { + // The ADD offset command should store the reference in the register directly + ctx->bc.Instr(asBC_PopRPtr); + } + + // Set the new type (keeping info about temp variable) + ctx->type.dataType = prop->type; + ctx->type.dataType.MakeReference(true); + ctx->type.isVariable = false; + + if( ctx->type.dataType.IsObject() && !ctx->type.dataType.IsObjectHandle() ) + { + // Objects that are members are not references + ctx->type.dataType.MakeReference(false); + } + + ctx->type.dataType.MakeReadOnly(isConst ? true : prop->type.IsReadOnly()); + } + else + { + asCString str; + str.Format(TXT_s_NOT_MEMBER_OF_s, name.AddressOf(), ctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + return -1; + } + } + else + { + asCString str; + str.Format(TXT_s_NOT_MEMBER_OF_s, name.AddressOf(), ctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + return -1; + } + } + else + { + if( globalExpression ) + { + Error(TXT_METHOD_IN_GLOBAL_EXPR, node); + return -1; + } + + // Make sure it is an object we are accessing + if( !ctx->type.dataType.IsObject() ) + { + asCString str; + str.Format(TXT_ILLEGAL_OPERATION_ON_s, ctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + return -1; + } + + // Process the get property accessor + ProcessPropertyGetAccessor(ctx, node); + + bool isConst = false; + if( ctx->type.dataType.IsObjectHandle() ) + isConst = ctx->type.dataType.IsHandleToConst(); + else + isConst = ctx->type.dataType.IsReadOnly(); + + asCObjectType *trueObj = ctx->type.dataType.GetObjectType(); + + asCTypeInfo objType = ctx->type; + + // Compile function call + CompileFunctionCall(node->firstChild, ctx, trueObj, isConst); + + // If the method returned a reference, then we can't release the original + // object yet, because the reference may be to a member of it + if( objType.isTemporary && + (ctx->type.dataType.IsReference() || (ctx->type.dataType.IsObject() && !ctx->type.dataType.IsObjectHandle())) && + !ctx->type.isVariable ) // If the resulting type is a variable, then the reference is not a member + { + // Remember the original object's variable, so that it can be released + // later on when the reference to its member goes out of scope + ctx->type.isTemporary = true; + ctx->type.stackOffset = objType.stackOffset; + } + else + { + // As the method didn't return a reference to a member + // we can safely release the original object now + ReleaseTemporaryVariable(objType, &ctx->bc); + } + } + } + else if( op == ttOpenBracket ) + { + if( !ctx->type.dataType.IsObject() ) + { + asCString str; + str.Format(TXT_OBJECT_DOESNT_SUPPORT_INDEX_OP, ctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + return -1; + } + + ProcessPropertyGetAccessor(ctx, node); + + Dereference(ctx, true); + bool isConst = ctx->type.dataType.IsReadOnly(); + + if( ctx->type.dataType.IsObjectHandle() ) + { + // Convert the handle to a normal object + asCDataType dt = ctx->type.dataType; + dt.MakeHandle(false); + + ImplicitConversion(ctx, dt, node, asIC_IMPLICIT_CONV); + } + + // Compile the expression + asSExprContext expr(engine); + CompileAssignment(node->firstChild, &expr); + + asCTypeInfo objType = ctx->type; + asSTypeBehaviour *beh = ctx->type.dataType.GetBehaviour(); + if( beh == 0 ) + { + asCString str; + str.Format(TXT_OBJECT_DOESNT_SUPPORT_INDEX_OP, ctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + return -1; + } + else + { + // Now find a matching function for the object type and indexing type + asCArray ops; + asUINT n; + if( isConst ) + { + // Only list const behaviours + for( n = 0; n < beh->operators.GetLength(); n += 2 ) + { + if( asBEHAVE_INDEX == beh->operators[n] && engine->scriptFunctions[beh->operators[n+1]]->isReadOnly ) + ops.PushLast(beh->operators[n+1]); + } + } + else + { + // TODO: Prefer non-const over const + for( n = 0; n < beh->operators.GetLength(); n += 2 ) + { + if( asBEHAVE_INDEX == beh->operators[n] ) + ops.PushLast(beh->operators[n+1]); + } + } + + asCArray ops1; + MatchArgument(ops, ops1, &expr.type, 0); + + if( !isConst ) + FilterConst(ops1); + + // Did we find a suitable function? + if( ops1.GetLength() == 1 ) + { + asCScriptFunction *descr = engine->scriptFunctions[ops1[0]]; + + // Store the code for the object + asCByteCode objBC(engine); + objBC.AddCode(&ctx->bc); + + // Add code for arguments + + PrepareArgument(&descr->parameterTypes[0], &expr, node->firstChild, true, descr->inOutFlags[0]); + MergeExprContexts(ctx, &expr); + + if( descr->parameterTypes[0].IsReference() ) + { + if( descr->parameterTypes[0].IsObject() && !descr->parameterTypes[0].IsObjectHandle() ) + ctx->bc.InstrWORD(asBC_GETOBJREF, 0); + else + ctx->bc.InstrWORD(asBC_GETREF, 0); + } + else if( descr->parameterTypes[0].IsObject() ) + { + ctx->bc.InstrWORD(asBC_GETOBJ, 0); + + // The temporary variable must not be freed as it will no longer hold an object + DeallocateVariable(expr.type.stackOffset); + expr.type.isTemporary = false; + } + + // Add the code for the object again + ctx->bc.AddCode(&objBC); + + asCArray args; + args.PushLast(&expr); + PerformFunctionCall(descr->id, ctx, false, &args); + } + else if( ops.GetLength() > 1 ) + { + Error(TXT_MORE_THAN_ONE_MATCHING_OP, node); + PrintMatchingFuncs(ops, node); + + return -1; + } + else + { + asCString str; + str.Format(TXT_NO_MATCHING_OP_FOUND_FOR_TYPE_s, expr.type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + return -1; + } + } + + // If the method returned a reference, then we can't release the original + // object yet, because the reference may be to a member of it + if( objType.isTemporary && + (ctx->type.dataType.IsReference() || (ctx->type.dataType.IsObject() && !ctx->type.dataType.IsObjectHandle())) && + !ctx->type.isVariable ) // If the resulting type is a variable, then the reference is not to a member + { + // Remember the object's variable, so that it can be released + // later on when the reference to its member goes out of scope + ctx->type.isTemporary = true; + ctx->type.stackOffset = objType.stackOffset; + } + else + { + // As the index operator didn't return a reference to a + // member we can release the original object now + ReleaseTemporaryVariable(objType, &ctx->bc); + } + } + + return 0; +} + +int asCCompiler::GetPrecedence(asCScriptNode *op) +{ + // x * y, x / y, x % y + // x + y, x - y + // x <= y, x < y, x >= y, x > y + // x = =y, x != y, x xor y, x is y, x !is y + // x and y + // x or y + + // The following are not used in this function, + // but should have lower precedence than the above + // x ? y : z + // x = y + + // The expression term have the highest precedence + if( op->nodeType == snExprTerm ) + return 1; + + // Evaluate operators by token + int tokenType = op->tokenType; + if( tokenType == ttStar || tokenType == ttSlash || tokenType == ttPercent ) + return 0; + + if( tokenType == ttPlus || tokenType == ttMinus ) + return -1; + + if( tokenType == ttBitShiftLeft || + tokenType == ttBitShiftRight || + tokenType == ttBitShiftRightArith ) + return -2; + + if( tokenType == ttAmp ) + return -3; + + if( tokenType == ttBitXor ) + return -4; + + if( tokenType == ttBitOr ) + return -5; + + if( tokenType == ttLessThanOrEqual || + tokenType == ttLessThan || + tokenType == ttGreaterThanOrEqual || + tokenType == ttGreaterThan ) + return -6; + + if( tokenType == ttEqual || tokenType == ttNotEqual || tokenType == ttXor || tokenType == ttIs || tokenType == ttNotIs ) + return -7; + + if( tokenType == ttAnd ) + return -8; + + if( tokenType == ttOr ) + return -9; + + // Unknown operator + asASSERT(false); + + return 0; +} + +int asCCompiler::MatchArgument(asCArray &funcs, asCArray &matches, const asCTypeInfo *argType, int paramNum, bool allowObjectConstruct) +{ + bool isExactMatch = false; + bool isMatchExceptConst = false; + bool isMatchWithBaseType = false; + bool isMatchExceptSign = false; + bool isMatchNotVarType = false; + + asUINT n; + + matches.SetLength(0); + + for( n = 0; n < funcs.GetLength(); n++ ) + { + asCScriptFunction *desc = builder->GetFunctionDescription(funcs[n]); + + // Does the function have arguments enough? + if( (int)desc->parameterTypes.GetLength() <= paramNum ) + continue; + + // Can we make the match by implicit conversion? + asSExprContext ti(engine); + ti.type = *argType; + if( argType->dataType.IsPrimitive() ) ti.type.dataType.MakeReference(false); + ImplicitConversion(&ti, desc->parameterTypes[paramNum], 0, asIC_IMPLICIT_CONV, false, 0, allowObjectConstruct); + if( desc->parameterTypes[paramNum].IsEqualExceptRef(ti.type.dataType) ) + { + // Is it an exact match? + if( argType->dataType.IsEqualExceptRef(ti.type.dataType) ) + { + if( !isExactMatch ) matches.SetLength(0); + + isExactMatch = true; + + matches.PushLast(funcs[n]); + continue; + } + + if( !isExactMatch ) + { + // Is it a match except const? + if( argType->dataType.IsEqualExceptRefAndConst(ti.type.dataType) ) + { + if( !isMatchExceptConst ) matches.SetLength(0); + + isMatchExceptConst = true; + + matches.PushLast(funcs[n]); + continue; + } + + if( !isMatchExceptConst ) + { + // Is it a size promotion, e.g. int8 -> int? + if( argType->dataType.IsSamePrimitiveBaseType(ti.type.dataType) ) + { + if( !isMatchWithBaseType ) matches.SetLength(0); + + isMatchWithBaseType = true; + + matches.PushLast(funcs[n]); + continue; + } + + if( !isMatchWithBaseType ) + { + // Conversion between signed and unsigned integer is better than between integer and float + + // Is it a match except for sign? + if( (argType->dataType.IsIntegerType() && ti.type.dataType.IsUnsignedType()) || + (argType->dataType.IsUnsignedType() && ti.type.dataType.IsIntegerType()) ) + { + if( !isMatchExceptSign ) matches.SetLength(0); + + isMatchExceptSign = true; + + matches.PushLast(funcs[n]); + continue; + } + + if( !isMatchExceptSign ) + { + // If there was any match without a var type it has higher priority + if( desc->parameterTypes[paramNum].GetTokenType() != ttQuestion ) + { + if( !isMatchNotVarType ) matches.SetLength(0); + + isMatchNotVarType = true; + + matches.PushLast(funcs[n]); + continue; + } + + // Implicit conversion to ?& has the smallest priority + if( !isMatchNotVarType ) + matches.PushLast(funcs[n]); + } + } + } + } + } + } + + return (int)matches.GetLength(); +} + +void asCCompiler::PrepareArgument2(asSExprContext *ctx, asSExprContext *arg, asCDataType *paramType, bool isFunction, int refType, asCArray *reservedVars) +{ + asSExprContext e(engine); + + // Reference parameters whose value won't be used don't evaluate the expression + if( !paramType->IsReference() || (refType & 1) ) + { + MergeExprContexts(&e, arg); + } + else + { + // Store the original bytecode so that it can be reused when processing the deferred output parameter + asSExprContext *orig = asNEW(asSExprContext)(engine); + MergeExprContexts(orig, arg); + orig->exprNode = arg->exprNode; + orig->type = arg->type; + orig->property_get = arg->property_get; + orig->property_set = arg->property_set; + orig->property_const = arg->property_const; + orig->property_handle = arg->property_handle; + + arg->origExpr = orig; + } + + e.type = arg->type; + e.property_get = arg->property_get; + e.property_set = arg->property_set; + e.property_const = arg->property_const; + e.property_handle = arg->property_handle; + PrepareArgument(paramType, &e, arg->exprNode, isFunction, refType, reservedVars); + arg->type = e.type; + ctx->bc.AddCode(&e.bc); +} + +bool asCCompiler::CompileOverloadedDualOperator(asCScriptNode *node, asSExprContext *lctx, asSExprContext *rctx, asSExprContext *ctx) +{ + // What type of operator is it? + int token = node->tokenType; + if( token == ttUnrecognizedToken ) + { + // This happens when the compiler is inferring an assignment + // operation from another action, for example in preparing a value + // as a function argument + token = ttAssignment; + } + + // boolean operators are not overloadable + if( token == ttAnd || + token == ttOr || + token == ttXor ) + return false; + + // Dual operators can also be implemented as class methods + if( token == ttEqual || + token == ttNotEqual ) + { + // TODO: Should evaluate which of the two have the best match. If both have equal match, the first version should be used + // Find the matching opEquals method + int r = CompileOverloadedDualOperator2(node, "opEquals", lctx, rctx, ctx, true, asCDataType::CreatePrimitive(ttBool, false)); + if( r == 0 ) + { + // Try again by switching the order of the operands + r = CompileOverloadedDualOperator2(node, "opEquals", rctx, lctx, ctx, true, asCDataType::CreatePrimitive(ttBool, false)); + } + + if( r == 1 ) + { + if( token == ttNotEqual ) + ctx->bc.InstrSHORT(asBC_NOT, ctx->type.stackOffset); + + // Success, don't continue + return true; + } + else if( r < 0 ) + { + // Compiler error, don't continue + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttBool, true), true); + return true; + } + } + + if( token == ttEqual || + token == ttNotEqual || + token == ttLessThan || + token == ttLessThanOrEqual || + token == ttGreaterThan || + token == ttGreaterThanOrEqual ) + { + bool swappedOrder = false; + + // TODO: Should evaluate which of the two have the best match. If both have equal match, the first version should be used + // Find the matching opCmp method + int r = CompileOverloadedDualOperator2(node, "opCmp", lctx, rctx, ctx, true, asCDataType::CreatePrimitive(ttInt, false)); + if( r == 0 ) + { + // Try again by switching the order of the operands + swappedOrder = true; + r = CompileOverloadedDualOperator2(node, "opCmp", rctx, lctx, ctx, true, asCDataType::CreatePrimitive(ttInt, false)); + } + + if( r == 1 ) + { + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + + int a = AllocateVariable(asCDataType::CreatePrimitive(ttBool, false), true); + + ctx->bc.InstrW_DW(asBC_CMPIi, ctx->type.stackOffset, 0); + + if( token == ttEqual ) + ctx->bc.Instr(asBC_TZ); + else if( token == ttNotEqual ) + ctx->bc.Instr(asBC_TNZ); + else if( (token == ttLessThan && !swappedOrder) || + (token == ttGreaterThan && swappedOrder) ) + ctx->bc.Instr(asBC_TS); + else if( (token == ttLessThanOrEqual && !swappedOrder) || + (token == ttGreaterThanOrEqual && swappedOrder) ) + ctx->bc.Instr(asBC_TNP); + else if( (token == ttGreaterThan && !swappedOrder) || + (token == ttLessThan && swappedOrder) ) + ctx->bc.Instr(asBC_TP); + else if( (token == ttGreaterThanOrEqual && !swappedOrder) || + (token == ttLessThanOrEqual && swappedOrder) ) + ctx->bc.Instr(asBC_TNS); + + ctx->bc.InstrSHORT(asBC_CpyRtoV4, (short)a); + + ctx->type.SetVariable(asCDataType::CreatePrimitive(ttBool, false), a, true); + + // Success, don't continue + return true; + } + else if( r < 0 ) + { + // Compiler error, don't continue + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttBool, true), true); + return true; + } + } + + // The rest of the operators are not commutative, and doesn't require specific return type + const char *op = 0, *op_r = 0; + switch( token ) + { + case ttPlus: op = "opAdd"; op_r = "opAdd_r"; break; + case ttMinus: op = "opSub"; op_r = "opSub_r"; break; + case ttStar: op = "opMul"; op_r = "opMul_r"; break; + case ttSlash: op = "opDiv"; op_r = "opDiv_r"; break; + case ttPercent: op = "opMod"; op_r = "opMod_r"; break; + case ttBitOr: op = "opOr"; op_r = "opOr_r"; break; + case ttAmp: op = "opAnd"; op_r = "opAnd_r"; break; + case ttBitXor: op = "opXor"; op_r = "opXor_r"; break; + case ttBitShiftLeft: op = "opShl"; op_r = "opShl_r"; break; + case ttBitShiftRight: op = "opShr"; op_r = "opShr_r"; break; + case ttBitShiftRightArith: op = "opUShr"; op_r = "opUShr_r"; break; + } + + // TODO: Might be interesting to support a concatenation operator, e.g. ~ + + if( op && op_r ) + { + // TODO: Should evaluate which of the two have the best match. If both have equal match, the first version should be used + // Find the matching operator method + int r = CompileOverloadedDualOperator2(node, op, lctx, rctx, ctx); + if( r == 0 ) + { + // Try again by switching the order of the operands, and using the reversed operator + r = CompileOverloadedDualOperator2(node, op_r, rctx, lctx, ctx); + } + + if( r == 1 ) + { + // Success, don't continue + return true; + } + else if( r < 0 ) + { + // Compiler error, don't continue + ctx->type.SetDummy(); + return true; + } + } + + // Assignment operators + op = 0; + switch( token ) + { + case ttAssignment: op = "opAssign"; break; + case ttAddAssign: op = "opAddAssign"; break; + case ttSubAssign: op = "opSubAssign"; break; + case ttMulAssign: op = "opMulAssign"; break; + case ttDivAssign: op = "opDivAssign"; break; + case ttModAssign: op = "opModAssign"; break; + case ttOrAssign: op = "opOrAssign"; break; + case ttAndAssign: op = "opAndAssign"; break; + case ttXorAssign: op = "opXorAssign"; break; + case ttShiftLeftAssign: op = "opShlAssign"; break; + case ttShiftRightLAssign: op = "opShrAssign"; break; + case ttShiftRightAAssign: op = "opUShrAssign"; break; + } + + if( op ) + { + // TODO: Shouldn't accept const lvalue with the assignment operators + + // Find the matching operator method + int r = CompileOverloadedDualOperator2(node, op, lctx, rctx, ctx); + if( r == 1 ) + { + // Success, don't continue + return true; + } + else if( r < 0 ) + { + // Compiler error, don't continue + ctx->type.SetDummy(); + return true; + } + } + + // No suitable operator was found + return false; +} + +// Returns negative on compile error +// zero on no matching operator +// one on matching operator +int asCCompiler::CompileOverloadedDualOperator2(asCScriptNode *node, const char *methodName, asSExprContext *lctx, asSExprContext *rctx, asSExprContext *ctx, bool specificReturn, const asCDataType &returnType) +{ + // Find the matching method + if( lctx->type.dataType.IsObject() && !lctx->type.isExplicitHandle ) + { + // Is the left value a const? + bool isConst = false; + if( lctx->type.dataType.IsObjectHandle() ) + isConst = lctx->type.dataType.IsHandleToConst(); + else + isConst = lctx->type.dataType.IsReadOnly(); + + asCArray funcs; + asCObjectType *ot = lctx->type.dataType.GetObjectType(); + for( asUINT n = 0; n < ot->methods.GetLength(); n++ ) + { + asCScriptFunction *func = engine->scriptFunctions[ot->methods[n]]; + if( func->name == methodName && + (!specificReturn || func->returnType == returnType) && + func->parameterTypes.GetLength() == 1 && + (!isConst || func->isReadOnly) ) + { + // Make sure the method is accessible by the module + asCConfigGroup *group = engine->FindConfigGroupForFunction(func->id); + if( !group || group->HasModuleAccess(builder->module->name.AddressOf()) ) + funcs.PushLast(func->id); + } + } + + // Which is the best matching function? + asCArray ops; + MatchArgument(funcs, ops, &rctx->type, 0); + + // Did we find an operator? + if( ops.GetLength() == 1 ) + { + // Process the lctx expression as get accessor + ProcessPropertyGetAccessor(lctx, node); + + // Merge the bytecode so that it forms lvalue.methodName(rvalue) + asCTypeInfo objType = lctx->type; + asCArray args; + args.PushLast(rctx); + MergeExprContexts(ctx, lctx); + ctx->type = lctx->type; + MakeFunctionCall(ctx, ops[0], objType.dataType.GetObjectType(), args, node); + + // TODO: Can we do this here? + ReleaseTemporaryVariable(objType, &ctx->bc); + + // Found matching operator + return 1; + } + else if( ops.GetLength() > 1 ) + { + Error(TXT_MORE_THAN_ONE_MATCHING_OP, node); + PrintMatchingFuncs(ops, node); + + ctx->type.SetDummy(); + + // Compiler error + return -1; + } + } + + // No matching operator + return 0; +} + +void asCCompiler::MakeFunctionCall(asSExprContext *ctx, int funcId, asCObjectType *objectType, asCArray &args, asCScriptNode *node, bool useVariable, int stackOffset) +{ + if( objectType ) + { + Dereference(ctx, true); + + // Warn if the method is non-const and the object is temporary + // since the changes will be lost when the object is destroyed. + // If the object is accessed through a handle, then it is assumed + // the object is not temporary, even though the handle is. + if( ctx->type.isTemporary && + !ctx->type.dataType.IsObjectHandle() && + !engine->scriptFunctions[funcId]->isReadOnly ) + { + Warning(TXT_CALLING_NONCONST_METHOD_ON_TEMP, node); + } + } + + asCByteCode objBC(engine); + objBC.AddCode(&ctx->bc); + + PrepareFunctionCall(funcId, &ctx->bc, args); + + // Verify if any of the args variable offsets are used in the other code. + // If they are exchange the offset for a new one + asUINT n; + for( n = 0; n < args.GetLength(); n++ ) + { + if( args[n]->type.isTemporary && objBC.IsVarUsed(args[n]->type.stackOffset) ) + { + // Release the current temporary variable + ReleaseTemporaryVariable(args[n]->type, 0); + + asCArray usedVars; + objBC.GetVarsUsed(usedVars); + ctx->bc.GetVarsUsed(usedVars); + + asCDataType dt = args[n]->type.dataType; + dt.MakeReference(false); + int newOffset = AllocateVariableNotIn(dt, true, &usedVars); + + ctx->bc.ExchangeVar(args[n]->type.stackOffset, newOffset); + args[n]->type.stackOffset = (short)newOffset; + args[n]->type.isTemporary = true; + args[n]->type.isVariable = true; + } + } + + ctx->bc.AddCode(&objBC); + + MoveArgsToStack(funcId, &ctx->bc, args, objectType ? true : false); + + PerformFunctionCall(funcId, ctx, false, &args, 0, useVariable, stackOffset); +} + +int asCCompiler::CompileOperator(asCScriptNode *node, asSExprContext *lctx, asSExprContext *rctx, asSExprContext *ctx) +{ + IsVariableInitialized(&lctx->type, node); + IsVariableInitialized(&rctx->type, node); + + if( lctx->type.isExplicitHandle || rctx->type.isExplicitHandle || + node->tokenType == ttIs || node->tokenType == ttNotIs ) + { + CompileOperatorOnHandles(node, lctx, rctx, ctx); + return 0; + } + else + { + // Compile an overloaded operator for the two operands + if( CompileOverloadedDualOperator(node, lctx, rctx, ctx) ) + return 0; + + // If both operands are objects, then we shouldn't continue + if( lctx->type.dataType.IsObject() && rctx->type.dataType.IsObject() ) + { + asCString str; + str.Format(TXT_NO_MATCHING_OP_FOUND_FOR_TYPES_s_AND_s, lctx->type.dataType.Format().AddressOf(), rctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + ctx->type.SetDummy(); + return -1; + } + + // Make sure we have two variables or constants + if( lctx->type.dataType.IsReference() ) ConvertToVariableNotIn(lctx, rctx); + if( rctx->type.dataType.IsReference() ) ConvertToVariableNotIn(rctx, lctx); + + // Process the property get accessors (if any) + ProcessPropertyGetAccessor(lctx, node); + ProcessPropertyGetAccessor(rctx, node); + + // Make sure lctx doesn't end up with a variable used in rctx + if( lctx->type.isTemporary && rctx->bc.IsVarUsed(lctx->type.stackOffset) ) + { + asCArray vars; + rctx->bc.GetVarsUsed(vars); + int offset = AllocateVariable(lctx->type.dataType, true); + rctx->bc.ExchangeVar(lctx->type.stackOffset, offset); + ReleaseTemporaryVariable(offset, 0); + } + + // Math operators + // + - * / % += -= *= /= %= + int op = node->tokenType; + if( op == ttPlus || op == ttAddAssign || + op == ttMinus || op == ttSubAssign || + op == ttStar || op == ttMulAssign || + op == ttSlash || op == ttDivAssign || + op == ttPercent || op == ttModAssign ) + { + CompileMathOperator(node, lctx, rctx, ctx); + return 0; + } + + // Bitwise operators + // << >> >>> & | ^ <<= >>= >>>= &= |= ^= + if( op == ttAmp || op == ttAndAssign || + op == ttBitOr || op == ttOrAssign || + op == ttBitXor || op == ttXorAssign || + op == ttBitShiftLeft || op == ttShiftLeftAssign || + op == ttBitShiftRight || op == ttShiftRightLAssign || + op == ttBitShiftRightArith || op == ttShiftRightAAssign ) + { + CompileBitwiseOperator(node, lctx, rctx, ctx); + return 0; + } + + // Comparison operators + // == != < > <= >= + if( op == ttEqual || op == ttNotEqual || + op == ttLessThan || op == ttLessThanOrEqual || + op == ttGreaterThan || op == ttGreaterThanOrEqual ) + { + CompileComparisonOperator(node, lctx, rctx, ctx); + return 0; + } + + // Boolean operators + // && || ^^ + if( op == ttAnd || op == ttOr || op == ttXor ) + { + CompileBooleanOperator(node, lctx, rctx, ctx); + return 0; + } + } + + asASSERT(false); + return -1; +} + +void asCCompiler::ConvertToTempVariableNotIn(asSExprContext *ctx, asSExprContext *exclude) +{ + asCArray excludeVars; + if( exclude ) exclude->bc.GetVarsUsed(excludeVars); + ConvertToTempVariableNotIn(ctx, &excludeVars); +} + +void asCCompiler::ConvertToTempVariableNotIn(asSExprContext *ctx, asCArray *reservedVars) +{ + ConvertToVariableNotIn(ctx, reservedVars); + if( !ctx->type.isTemporary ) + { + if( ctx->type.dataType.IsPrimitive() ) + { + int offset = AllocateVariableNotIn(ctx->type.dataType, true, reservedVars); + if( ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + ctx->bc.InstrW_W(asBC_CpyVtoV4, offset, ctx->type.stackOffset); + else + ctx->bc.InstrW_W(asBC_CpyVtoV8, offset, ctx->type.stackOffset); + ctx->type.SetVariable(ctx->type.dataType, offset, true); + } + else if( ctx->type.dataType.IsObjectHandle() ) + { + asASSERT(false); + } + else // ctx->type.dataType.IsObject() + { + // Make sure the variable is not used in the expression + asCArray vars; + ctx->bc.GetVarsUsed(vars); + int offset = AllocateVariableNotIn(ctx->type.dataType, true, &vars); + + // Allocate and construct the temporary object + asCByteCode tmpBC(engine); + CallDefaultConstructor(ctx->type.dataType, offset, &tmpBC, ctx->exprNode); + + // Insert the code before the expression code + tmpBC.AddCode(&ctx->bc); + ctx->bc.AddCode(&tmpBC); + + // Assign the evaluated expression to the temporary variable + PrepareForAssignment(&ctx->type.dataType, ctx, 0); + + asCTypeInfo type; + type.SetVariable(ctx->type.dataType, offset, true); + + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + + PerformAssignment(&type, &ctx->type, &ctx->bc, 0); + + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + + ctx->type = type; + } + } +} + +void asCCompiler::ConvertToTempVariable(asSExprContext *ctx) +{ + ConvertToVariable(ctx); + if( !ctx->type.isTemporary ) + { + if( ctx->type.dataType.IsPrimitive() ) + { + int offset = AllocateVariable(ctx->type.dataType, true); + if( ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + ctx->bc.InstrW_W(asBC_CpyVtoV4, offset, ctx->type.stackOffset); + else + ctx->bc.InstrW_W(asBC_CpyVtoV8, offset, ctx->type.stackOffset); + ctx->type.SetVariable(ctx->type.dataType, offset, true); + } + else if( ctx->type.dataType.IsObjectHandle() ) + { + asASSERT(false); + } + else // ctx->type.dataType.IsObject() + { + // Make sure the variable is not used in the expression + asCArray vars; + ctx->bc.GetVarsUsed(vars); + int offset = AllocateVariableNotIn(ctx->type.dataType, true, &vars); + + // Allocate and construct the temporary object + asCByteCode tmpBC(engine); + CallDefaultConstructor(ctx->type.dataType, offset, &tmpBC, ctx->exprNode); + + // Insert the code before the expression code + tmpBC.AddCode(&ctx->bc); + ctx->bc.AddCode(&tmpBC); + + // Assign the evaluated expression to the temporary variable + PrepareForAssignment(&ctx->type.dataType, ctx, 0); + + asCTypeInfo type; + type.SetVariable(ctx->type.dataType, offset, true); + + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + + PerformAssignment(&type, &ctx->type, &ctx->bc, 0); + + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + + ctx->type = type; + } + } +} + +void asCCompiler::ConvertToVariable(asSExprContext *ctx) +{ + ConvertToVariableNotIn(ctx, (asCArray*)0); +} + +void asCCompiler::ConvertToVariableNotIn(asSExprContext *ctx, asCArray *reservedVars) +{ + if( !ctx->type.isVariable ) + { + asCArray excludeVars; + if( reservedVars ) excludeVars.Concatenate(*reservedVars); + int offset; + if( ctx->type.dataType.IsObjectHandle() ) + { + offset = AllocateVariableNotIn(ctx->type.dataType, true, &excludeVars); + if( ctx->type.IsNullConstant() ) + { + // TODO: Adapt pointer size + ctx->bc.InstrSHORT_DW(asBC_SetV4, (short)offset, 0); + } + else + { + // Copy the object handle to a variable + ctx->bc.InstrSHORT(asBC_PSF, (short)offset); + ctx->bc.InstrPTR(asBC_REFCPY, ctx->type.dataType.GetObjectType()); + ctx->bc.Pop(AS_PTR_SIZE); + } + + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + ctx->type.SetVariable(ctx->type.dataType, offset, true); + } + else if( ctx->type.dataType.IsPrimitive() ) + { + if( ctx->type.isConstant ) + { + offset = AllocateVariableNotIn(ctx->type.dataType, true, &excludeVars); + if( ctx->type.dataType.GetSizeInMemoryBytes() == 1 ) + ctx->bc.InstrSHORT_B(asBC_SetV1, (short)offset, ctx->type.byteValue); + else if( ctx->type.dataType.GetSizeInMemoryBytes() == 2 ) + ctx->bc.InstrSHORT_W(asBC_SetV2, (short)offset, ctx->type.wordValue); + else if( ctx->type.dataType.GetSizeInMemoryBytes() == 4 ) + ctx->bc.InstrSHORT_DW(asBC_SetV4, (short)offset, ctx->type.dwordValue); + else + ctx->bc.InstrSHORT_QW(asBC_SetV8, (short)offset, ctx->type.qwordValue); + + ctx->type.SetVariable(ctx->type.dataType, offset, true); + return; + } + else + { + asASSERT(ctx->type.dataType.IsPrimitive()); + asASSERT(ctx->type.dataType.IsReference()); + + ctx->type.dataType.MakeReference(false); + offset = AllocateVariableNotIn(ctx->type.dataType, true, &excludeVars); + + // Read the value from the address in the register directly into the variable + if( ctx->type.dataType.GetSizeInMemoryBytes() == 1 ) + ctx->bc.InstrSHORT(asBC_RDR1, (short)offset); + else if( ctx->type.dataType.GetSizeInMemoryBytes() == 2 ) + ctx->bc.InstrSHORT(asBC_RDR2, (short)offset); + else if( ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + ctx->bc.InstrSHORT(asBC_RDR4, (short)offset); + else + ctx->bc.InstrSHORT(asBC_RDR8, (short)offset); + } + + ReleaseTemporaryVariable(ctx->type, &ctx->bc); + ctx->type.SetVariable(ctx->type.dataType, offset, true); + } + } +} + +void asCCompiler::ConvertToVariableNotIn(asSExprContext *ctx, asSExprContext *exclude) +{ + asCArray excludeVars; + if( exclude ) exclude->bc.GetVarsUsed(excludeVars); + ConvertToVariableNotIn(ctx, &excludeVars); +} + + +void asCCompiler::CompileMathOperator(asCScriptNode *node, asSExprContext *lctx, asSExprContext *rctx, asSExprContext *ctx) +{ + // TODO: If a constant is only using 32bits, then a 32bit operation is preferred + + // Implicitly convert the operands to a number type + asCDataType to; + if( lctx->type.dataType.IsDoubleType() || rctx->type.dataType.IsDoubleType() ) + to.SetTokenType(ttDouble); + else if( lctx->type.dataType.IsFloatType() || rctx->type.dataType.IsFloatType() ) + to.SetTokenType(ttFloat); + else if( lctx->type.dataType.GetSizeInMemoryDWords() == 2 || rctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + if( lctx->type.dataType.IsIntegerType() || rctx->type.dataType.IsIntegerType() ) + to.SetTokenType(ttInt64); + else if( lctx->type.dataType.IsUnsignedType() || rctx->type.dataType.IsUnsignedType() ) + to.SetTokenType(ttUInt64); + } + else + { + if( lctx->type.dataType.IsIntegerType() || rctx->type.dataType.IsIntegerType() || + lctx->type.dataType.IsEnumType() || rctx->type.dataType.IsEnumType() ) + to.SetTokenType(ttInt); + else if( lctx->type.dataType.IsUnsignedType() || rctx->type.dataType.IsUnsignedType() ) + to.SetTokenType(ttUInt); + } + + // If doing an operation with double constant and float variable, the constant should be converted to float + if( (lctx->type.isConstant && lctx->type.dataType.IsDoubleType() && !rctx->type.isConstant && rctx->type.dataType.IsFloatType()) || + (rctx->type.isConstant && rctx->type.dataType.IsDoubleType() && !lctx->type.isConstant && lctx->type.dataType.IsFloatType()) ) + to.SetTokenType(ttFloat); + + // Do the actual conversion + asCArray reservedVars; + rctx->bc.GetVarsUsed(reservedVars); + lctx->bc.GetVarsUsed(reservedVars); + ImplicitConversion(lctx, to, node, asIC_IMPLICIT_CONV, true, &reservedVars); + ImplicitConversion(rctx, to, node, asIC_IMPLICIT_CONV, true, &reservedVars); + + // Verify that the conversion was successful + if( !lctx->type.dataType.IsIntegerType() && + !lctx->type.dataType.IsUnsignedType() && + !lctx->type.dataType.IsFloatType() && + !lctx->type.dataType.IsDoubleType() ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_MATH_TYPE, lctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + + ctx->type.SetDummy(); + return; + } + + if( !rctx->type.dataType.IsIntegerType() && + !rctx->type.dataType.IsUnsignedType() && + !rctx->type.dataType.IsFloatType() && + !rctx->type.dataType.IsDoubleType() ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_MATH_TYPE, rctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + + ctx->type.SetDummy(); + return; + } + + bool isConstant = lctx->type.isConstant && rctx->type.isConstant; + + // Verify if we are dividing with a constant zero + int op = node->tokenType; + if( rctx->type.isConstant && rctx->type.qwordValue == 0 && + (op == ttSlash || op == ttDivAssign || + op == ttPercent || op == ttModAssign) ) + { + Error(TXT_DIVIDE_BY_ZERO, node); + } + + if( !isConstant ) + { + ConvertToVariableNotIn(lctx, rctx); + ConvertToVariableNotIn(rctx, lctx); + ReleaseTemporaryVariable(lctx->type, &lctx->bc); + ReleaseTemporaryVariable(rctx->type, &rctx->bc); + + if( op == ttAddAssign || op == ttSubAssign || + op == ttMulAssign || op == ttDivAssign || + op == ttModAssign ) + { + // Merge the operands in the different order so that they are evaluated correctly + MergeExprContexts(ctx, rctx); + MergeExprContexts(ctx, lctx); + } + else + { + MergeExprContexts(ctx, lctx); + MergeExprContexts(ctx, rctx); + } + + asEBCInstr instruction = asBC_ADDi; + if( lctx->type.dataType.IsIntegerType() || + lctx->type.dataType.IsUnsignedType() ) + { + if( lctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + if( op == ttPlus || op == ttAddAssign ) + instruction = asBC_ADDi; + else if( op == ttMinus || op == ttSubAssign ) + instruction = asBC_SUBi; + else if( op == ttStar || op == ttMulAssign ) + instruction = asBC_MULi; + else if( op == ttSlash || op == ttDivAssign ) + instruction = asBC_DIVi; + else if( op == ttPercent || op == ttModAssign ) + instruction = asBC_MODi; + } + else + { + if( op == ttPlus || op == ttAddAssign ) + instruction = asBC_ADDi64; + else if( op == ttMinus || op == ttSubAssign ) + instruction = asBC_SUBi64; + else if( op == ttStar || op == ttMulAssign ) + instruction = asBC_MULi64; + else if( op == ttSlash || op == ttDivAssign ) + instruction = asBC_DIVi64; + else if( op == ttPercent || op == ttModAssign ) + instruction = asBC_MODi64; + } + } + else if( lctx->type.dataType.IsFloatType() ) + { + if( op == ttPlus || op == ttAddAssign ) + instruction = asBC_ADDf; + else if( op == ttMinus || op == ttSubAssign ) + instruction = asBC_SUBf; + else if( op == ttStar || op == ttMulAssign ) + instruction = asBC_MULf; + else if( op == ttSlash || op == ttDivAssign ) + instruction = asBC_DIVf; + else if( op == ttPercent || op == ttModAssign ) + instruction = asBC_MODf; + } + else if( lctx->type.dataType.IsDoubleType() ) + { + if( op == ttPlus || op == ttAddAssign ) + instruction = asBC_ADDd; + else if( op == ttMinus || op == ttSubAssign ) + instruction = asBC_SUBd; + else if( op == ttStar || op == ttMulAssign ) + instruction = asBC_MULd; + else if( op == ttSlash || op == ttDivAssign ) + instruction = asBC_DIVd; + else if( op == ttPercent || op == ttModAssign ) + instruction = asBC_MODd; + } + else + { + // Shouldn't be possible + asASSERT(false); + } + + // Do the operation + int a = AllocateVariable(lctx->type.dataType, true); + int b = lctx->type.stackOffset; + int c = rctx->type.stackOffset; + + ctx->bc.InstrW_W_W(instruction, a, b, c); + + ctx->type.SetVariable(lctx->type.dataType, a, true); + } + else + { + // Both values are constants + if( lctx->type.dataType.IsIntegerType() || + lctx->type.dataType.IsUnsignedType() ) + { + if( lctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + int v = 0; + if( op == ttPlus ) + v = lctx->type.intValue + rctx->type.intValue; + else if( op == ttMinus ) + v = lctx->type.intValue - rctx->type.intValue; + else if( op == ttStar ) + v = lctx->type.intValue * rctx->type.intValue; + else if( op == ttSlash ) + { + if( rctx->type.intValue == 0 ) + v = 0; + else + v = lctx->type.intValue / rctx->type.intValue; + } + else if( op == ttPercent ) + { + if( rctx->type.intValue == 0 ) + v = 0; + else + v = lctx->type.intValue % rctx->type.intValue; + } + + ctx->type.SetConstantDW(lctx->type.dataType, v); + + // If the right value is greater than the left value in a minus operation, then we need to convert the type to int + if( lctx->type.dataType.GetTokenType() == ttUInt && op == ttMinus && lctx->type.intValue < rctx->type.intValue ) + ctx->type.dataType.SetTokenType(ttInt); + } + else + { + asQWORD v = 0; + if( op == ttPlus ) + v = lctx->type.qwordValue + rctx->type.qwordValue; + else if( op == ttMinus ) + v = lctx->type.qwordValue - rctx->type.qwordValue; + else if( op == ttStar ) + v = lctx->type.qwordValue * rctx->type.qwordValue; + else if( op == ttSlash ) + { + if( rctx->type.qwordValue == 0 ) + v = 0; + else + v = lctx->type.qwordValue / rctx->type.qwordValue; + } + else if( op == ttPercent ) + { + if( rctx->type.qwordValue == 0 ) + v = 0; + else + v = lctx->type.qwordValue % rctx->type.qwordValue; + } + + ctx->type.SetConstantQW(lctx->type.dataType, v); + + // If the right value is greater than the left value in a minus operation, then we need to convert the type to int + if( lctx->type.dataType.GetTokenType() == ttUInt64 && op == ttMinus && lctx->type.qwordValue < rctx->type.qwordValue ) + ctx->type.dataType.SetTokenType(ttInt64); + } + } + else if( lctx->type.dataType.IsFloatType() ) + { + float v = 0.0f; + if( op == ttPlus ) + v = lctx->type.floatValue + rctx->type.floatValue; + else if( op == ttMinus ) + v = lctx->type.floatValue - rctx->type.floatValue; + else if( op == ttStar ) + v = lctx->type.floatValue * rctx->type.floatValue; + else if( op == ttSlash ) + { + if( rctx->type.floatValue == 0 ) + v = 0; + else + v = lctx->type.floatValue / rctx->type.floatValue; + } + else if( op == ttPercent ) + { + if( rctx->type.floatValue == 0 ) + v = 0; + else + v = fmodf(lctx->type.floatValue, rctx->type.floatValue); + } + + ctx->type.SetConstantF(lctx->type.dataType, v); + } + else if( lctx->type.dataType.IsDoubleType() ) + { + double v = 0.0; + if( op == ttPlus ) + v = lctx->type.doubleValue + rctx->type.doubleValue; + else if( op == ttMinus ) + v = lctx->type.doubleValue - rctx->type.doubleValue; + else if( op == ttStar ) + v = lctx->type.doubleValue * rctx->type.doubleValue; + else if( op == ttSlash ) + { + if( rctx->type.doubleValue == 0 ) + v = 0; + else + v = lctx->type.doubleValue / rctx->type.doubleValue; + } + else if( op == ttPercent ) + { + if( rctx->type.doubleValue == 0 ) + v = 0; + else + v = fmod(lctx->type.doubleValue, rctx->type.doubleValue); + } + + ctx->type.SetConstantD(lctx->type.dataType, v); + } + else + { + // Shouldn't be possible + asASSERT(false); + } + } +} + +void asCCompiler::CompileBitwiseOperator(asCScriptNode *node, asSExprContext *lctx, asSExprContext *rctx, asSExprContext *ctx) +{ + // TODO: If a constant is only using 32bits, then a 32bit operation is preferred + + int op = node->tokenType; + if( op == ttAmp || op == ttAndAssign || + op == ttBitOr || op == ttOrAssign || + op == ttBitXor || op == ttXorAssign ) + { + // Convert left hand operand to integer if it's not already one + asCDataType to; + if( lctx->type.dataType.GetSizeInMemoryDWords() == 2 || + rctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + to.SetTokenType(ttUInt64); + else + to.SetTokenType(ttUInt); + + // Do the actual conversion + asCArray reservedVars; + rctx->bc.GetVarsUsed(reservedVars); + ImplicitConversion(lctx, to, node, asIC_IMPLICIT_CONV, true, &reservedVars); + + // Verify that the conversion was successful + if( !lctx->type.dataType.IsUnsignedType() ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, lctx->type.dataType.Format().AddressOf(), to.Format().AddressOf()); + Error(str.AddressOf(), node); + } + + // Convert right hand operand to same type as left hand operand + asCArray vars; + lctx->bc.GetVarsUsed(vars); + ImplicitConversion(rctx, lctx->type.dataType, node, asIC_IMPLICIT_CONV, true, &vars); + if( !rctx->type.dataType.IsEqualExceptRef(lctx->type.dataType) ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, rctx->type.dataType.Format().AddressOf(), lctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + } + + bool isConstant = lctx->type.isConstant && rctx->type.isConstant; + + if( !isConstant ) + { + ConvertToVariableNotIn(lctx, rctx); + ConvertToVariableNotIn(rctx, lctx); + ReleaseTemporaryVariable(lctx->type, &lctx->bc); + ReleaseTemporaryVariable(rctx->type, &rctx->bc); + + if( op == ttAndAssign || op == ttOrAssign || op == ttXorAssign ) + { + // Compound assignments execute the right hand value first + MergeExprContexts(ctx, rctx); + MergeExprContexts(ctx, lctx); + } + else + { + MergeExprContexts(ctx, lctx); + MergeExprContexts(ctx, rctx); + } + + asEBCInstr instruction = asBC_BAND; + if( lctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + if( op == ttAmp || op == ttAndAssign ) + instruction = asBC_BAND; + else if( op == ttBitOr || op == ttOrAssign ) + instruction = asBC_BOR; + else if( op == ttBitXor || op == ttXorAssign ) + instruction = asBC_BXOR; + } + else + { + if( op == ttAmp || op == ttAndAssign ) + instruction = asBC_BAND64; + else if( op == ttBitOr || op == ttOrAssign ) + instruction = asBC_BOR64; + else if( op == ttBitXor || op == ttXorAssign ) + instruction = asBC_BXOR64; + } + + // Do the operation + int a = AllocateVariable(lctx->type.dataType, true); + int b = lctx->type.stackOffset; + int c = rctx->type.stackOffset; + + ctx->bc.InstrW_W_W(instruction, a, b, c); + + ctx->type.SetVariable(lctx->type.dataType, a, true); + } + else + { + if( lctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + asQWORD v = 0; + if( op == ttAmp ) + v = lctx->type.qwordValue & rctx->type.qwordValue; + else if( op == ttBitOr ) + v = lctx->type.qwordValue | rctx->type.qwordValue; + else if( op == ttBitXor ) + v = lctx->type.qwordValue ^ rctx->type.qwordValue; + + // Remember the result + ctx->type.SetConstantQW(lctx->type.dataType, v); + } + else + { + asDWORD v = 0; + if( op == ttAmp ) + v = lctx->type.dwordValue & rctx->type.dwordValue; + else if( op == ttBitOr ) + v = lctx->type.dwordValue | rctx->type.dwordValue; + else if( op == ttBitXor ) + v = lctx->type.dwordValue ^ rctx->type.dwordValue; + + // Remember the result + ctx->type.SetConstantDW(lctx->type.dataType, v); + } + } + } + else if( op == ttBitShiftLeft || op == ttShiftLeftAssign || + op == ttBitShiftRight || op == ttShiftRightLAssign || + op == ttBitShiftRightArith || op == ttShiftRightAAssign ) + { + // Don't permit object to primitive conversion, since we don't know which integer type is the correct one + if( lctx->type.dataType.IsObject() ) + { + asCString str; + str.Format(TXT_ILLEGAL_OPERATION_ON_s, lctx->type.dataType.Format().AddressOf()); + Error(str.AddressOf(), node); + + // Set an integer value and allow the compiler to continue + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttInt, true), 0); + return; + } + + // Convert left hand operand to integer if it's not already one + asCDataType to = lctx->type.dataType; + if( lctx->type.dataType.IsUnsignedType() && + lctx->type.dataType.GetSizeInMemoryBytes() < 4 ) + { + to = asCDataType::CreatePrimitive(ttUInt, false); + } + else if( !lctx->type.dataType.IsUnsignedType() ) + { + asCDataType to; + if( lctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + to.SetTokenType(ttInt64); + else + to.SetTokenType(ttInt); + } + + // Do the actual conversion + asCArray reservedVars; + rctx->bc.GetVarsUsed(reservedVars); + ImplicitConversion(lctx, to, node, asIC_IMPLICIT_CONV, true, &reservedVars); + + // Verify that the conversion was successful + if( lctx->type.dataType != to ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, lctx->type.dataType.Format().AddressOf(), to.Format().AddressOf()); + Error(str.AddressOf(), node); + } + + // Right operand must be 32bit uint + asCArray vars; + lctx->bc.GetVarsUsed(vars); + ImplicitConversion(rctx, asCDataType::CreatePrimitive(ttUInt, true), node, asIC_IMPLICIT_CONV, true, &vars); + if( !rctx->type.dataType.IsUnsignedType() ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, rctx->type.dataType.Format().AddressOf(), "uint"); + Error(str.AddressOf(), node); + } + + bool isConstant = lctx->type.isConstant && rctx->type.isConstant; + + if( !isConstant ) + { + ConvertToVariableNotIn(lctx, rctx); + ConvertToVariableNotIn(rctx, lctx); + ReleaseTemporaryVariable(lctx->type, &lctx->bc); + ReleaseTemporaryVariable(rctx->type, &rctx->bc); + + if( op == ttShiftLeftAssign || op == ttShiftRightLAssign || op == ttShiftRightAAssign ) + { + // Compound assignments execute the right hand value first + MergeExprContexts(ctx, rctx); + MergeExprContexts(ctx, lctx); + } + else + { + MergeExprContexts(ctx, lctx); + MergeExprContexts(ctx, rctx); + } + + asEBCInstr instruction = asBC_BSLL; + if( lctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + if( op == ttBitShiftLeft || op == ttShiftLeftAssign ) + instruction = asBC_BSLL; + else if( op == ttBitShiftRight || op == ttShiftRightLAssign ) + instruction = asBC_BSRL; + else if( op == ttBitShiftRightArith || op == ttShiftRightAAssign ) + instruction = asBC_BSRA; + } + else + { + if( op == ttBitShiftLeft || op == ttShiftLeftAssign ) + instruction = asBC_BSLL64; + else if( op == ttBitShiftRight || op == ttShiftRightLAssign ) + instruction = asBC_BSRL64; + else if( op == ttBitShiftRightArith || op == ttShiftRightAAssign ) + instruction = asBC_BSRA64; + } + + // Do the operation + int a = AllocateVariable(lctx->type.dataType, true); + int b = lctx->type.stackOffset; + int c = rctx->type.stackOffset; + + ctx->bc.InstrW_W_W(instruction, a, b, c); + + ctx->type.SetVariable(lctx->type.dataType, a, true); + } + else + { + if( lctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + asDWORD v = 0; + if( op == ttBitShiftLeft ) + v = lctx->type.dwordValue << rctx->type.dwordValue; + else if( op == ttBitShiftRight ) + v = lctx->type.dwordValue >> rctx->type.dwordValue; + else if( op == ttBitShiftRightArith ) + v = lctx->type.intValue >> rctx->type.dwordValue; + + ctx->type.SetConstantDW(lctx->type.dataType, v); + } + else + { + asQWORD v = 0; + if( op == ttBitShiftLeft ) + v = lctx->type.qwordValue << rctx->type.dwordValue; + else if( op == ttBitShiftRight ) + v = lctx->type.qwordValue >> rctx->type.dwordValue; + else if( op == ttBitShiftRightArith ) + v = asINT64(lctx->type.qwordValue) >> rctx->type.dwordValue; + + ctx->type.SetConstantQW(lctx->type.dataType, v); + } + } + } +} + +void asCCompiler::CompileComparisonOperator(asCScriptNode *node, asSExprContext *lctx, asSExprContext *rctx, asSExprContext *ctx) +{ + // Both operands must be of the same type + + // Implicitly convert the operands to a number type + asCDataType to; + if( lctx->type.dataType.IsDoubleType() || rctx->type.dataType.IsDoubleType() ) + to.SetTokenType(ttDouble); + else if( lctx->type.dataType.IsFloatType() || rctx->type.dataType.IsFloatType() ) + to.SetTokenType(ttFloat); + else if( lctx->type.dataType.GetSizeInMemoryDWords() == 2 || rctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + if( lctx->type.dataType.IsIntegerType() || rctx->type.dataType.IsIntegerType() ) + to.SetTokenType(ttInt64); + else if( lctx->type.dataType.IsUnsignedType() || rctx->type.dataType.IsUnsignedType() ) + to.SetTokenType(ttUInt64); + } + else + { + if( lctx->type.dataType.IsIntegerType() || rctx->type.dataType.IsIntegerType() || + lctx->type.dataType.IsEnumType() || rctx->type.dataType.IsEnumType() ) + to.SetTokenType(ttInt); + else if( lctx->type.dataType.IsUnsignedType() || rctx->type.dataType.IsUnsignedType() ) + to.SetTokenType(ttUInt); + else if( lctx->type.dataType.IsBooleanType() || rctx->type.dataType.IsBooleanType() ) + to.SetTokenType(ttBool); + } + + // If doing an operation with double constant and float variable, the constant should be converted to float + if( (lctx->type.isConstant && lctx->type.dataType.IsDoubleType() && !rctx->type.isConstant && rctx->type.dataType.IsFloatType()) || + (rctx->type.isConstant && rctx->type.dataType.IsDoubleType() && !lctx->type.isConstant && lctx->type.dataType.IsFloatType()) ) + to.SetTokenType(ttFloat); + + // Is it an operation on signed values? + bool signMismatch = false; + if( !lctx->type.dataType.IsUnsignedType() || !rctx->type.dataType.IsUnsignedType() ) + { + if( lctx->type.dataType.GetTokenType() == ttUInt64 ) + { + if( !lctx->type.isConstant ) + signMismatch = true; + else if( lctx->type.qwordValue & (I64(1)<<63) ) + signMismatch = true; + } + if( lctx->type.dataType.GetTokenType() == ttUInt ) + { + if( !lctx->type.isConstant ) + signMismatch = true; + else if( lctx->type.dwordValue & (1<<31) ) + signMismatch = true; + } + if( rctx->type.dataType.GetTokenType() == ttUInt64 ) + { + if( !rctx->type.isConstant ) + signMismatch = true; + else if( rctx->type.qwordValue & (I64(1)<<63) ) + signMismatch = true; + } + if( rctx->type.dataType.GetTokenType() == ttUInt ) + { + if( !rctx->type.isConstant ) + signMismatch = true; + else if( rctx->type.dwordValue & (1<<31) ) + signMismatch = true; + } + } + + // Check for signed/unsigned mismatch + if( signMismatch ) + Warning(TXT_SIGNED_UNSIGNED_MISMATCH, node); + + // Do the actual conversion + asCArray reservedVars; + rctx->bc.GetVarsUsed(reservedVars); + ImplicitConversion(lctx, to, node, asIC_IMPLICIT_CONV, true, &reservedVars); + ImplicitConversion(rctx, to, node, asIC_IMPLICIT_CONV); + + // Verify that the conversion was successful + bool ok = true; + if( !lctx->type.dataType.IsEqualExceptConst(to) ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, lctx->type.dataType.Format().AddressOf(), to.Format().AddressOf()); + Error(str.AddressOf(), node); + ok = false; + } + + if( !rctx->type.dataType.IsEqualExceptConst(to) ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, rctx->type.dataType.Format().AddressOf(), to.Format().AddressOf()); + Error(str.AddressOf(), node); + ok = false; + } + + if( !ok ) + { + // It wasn't possible to get two valid operands, so we just return + // a boolean result and let the compiler continue. + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttBool, true), true); + return; + } + + bool isConstant = lctx->type.isConstant && rctx->type.isConstant; + int op = node->tokenType; + + if( !isConstant ) + { + if( to.IsBooleanType() ) + { + int op = node->tokenType; + if( op == ttEqual || op == ttNotEqual ) + { + // Must convert to temporary variable, because we are changing the value before comparison + ConvertToTempVariableNotIn(lctx, rctx); + ConvertToTempVariableNotIn(rctx, lctx); + ReleaseTemporaryVariable(lctx->type, &lctx->bc); + ReleaseTemporaryVariable(rctx->type, &rctx->bc); + + // Make sure they are equal if not false + lctx->bc.InstrWORD(asBC_NOT, lctx->type.stackOffset); + rctx->bc.InstrWORD(asBC_NOT, rctx->type.stackOffset); + + MergeExprContexts(ctx, lctx); + MergeExprContexts(ctx, rctx); + + int a = AllocateVariable(asCDataType::CreatePrimitive(ttBool, true), true); + int b = lctx->type.stackOffset; + int c = rctx->type.stackOffset; + + if( op == ttEqual ) + { + ctx->bc.InstrW_W(asBC_CMPi,b,c); + ctx->bc.Instr(asBC_TZ); + ctx->bc.InstrSHORT(asBC_CpyRtoV4, (short)a); + } + else if( op == ttNotEqual ) + { + ctx->bc.InstrW_W(asBC_CMPi,b,c); + ctx->bc.Instr(asBC_TNZ); + ctx->bc.InstrSHORT(asBC_CpyRtoV4, (short)a); + } + + ctx->type.SetVariable(asCDataType::CreatePrimitive(ttBool, true), a, true); + } + else + { + // TODO: Use TXT_ILLEGAL_OPERATION_ON + Error(TXT_ILLEGAL_OPERATION, node); + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttBool, true), 0); + } + } + else + { + ConvertToVariableNotIn(lctx, rctx); + ConvertToVariableNotIn(rctx, lctx); + ReleaseTemporaryVariable(lctx->type, &lctx->bc); + ReleaseTemporaryVariable(rctx->type, &rctx->bc); + + MergeExprContexts(ctx, lctx); + MergeExprContexts(ctx, rctx); + + asEBCInstr iCmp = asBC_CMPi, iT = asBC_TZ; + + if( lctx->type.dataType.IsIntegerType() && lctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + iCmp = asBC_CMPi; + else if( lctx->type.dataType.IsUnsignedType() && lctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + iCmp = asBC_CMPu; + else if( lctx->type.dataType.IsIntegerType() && lctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + iCmp = asBC_CMPi64; + else if( lctx->type.dataType.IsUnsignedType() && lctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + iCmp = asBC_CMPu64; + else if( lctx->type.dataType.IsFloatType() ) + iCmp = asBC_CMPf; + else if( lctx->type.dataType.IsDoubleType() ) + iCmp = asBC_CMPd; + else + asASSERT(false); + + if( op == ttEqual ) + iT = asBC_TZ; + else if( op == ttNotEqual ) + iT = asBC_TNZ; + else if( op == ttLessThan ) + iT = asBC_TS; + else if( op == ttLessThanOrEqual ) + iT = asBC_TNP; + else if( op == ttGreaterThan ) + iT = asBC_TP; + else if( op == ttGreaterThanOrEqual ) + iT = asBC_TNS; + + int a = AllocateVariable(asCDataType::CreatePrimitive(ttBool, true), true); + int b = lctx->type.stackOffset; + int c = rctx->type.stackOffset; + + ctx->bc.InstrW_W(iCmp, b, c); + ctx->bc.Instr(iT); + ctx->bc.InstrSHORT(asBC_CpyRtoV4, (short)a); + + ctx->type.SetVariable(asCDataType::CreatePrimitive(ttBool, true), a, true); + } + } + else + { + if( to.IsBooleanType() ) + { + int op = node->tokenType; + if( op == ttEqual || op == ttNotEqual ) + { + // Make sure they are equal if not false + if( lctx->type.dwordValue != 0 ) lctx->type.dwordValue = VALUE_OF_BOOLEAN_TRUE; + if( rctx->type.dwordValue != 0 ) rctx->type.dwordValue = VALUE_OF_BOOLEAN_TRUE; + + asDWORD v = 0; + if( op == ttEqual ) + { + v = lctx->type.intValue - rctx->type.intValue; + if( v == 0 ) v = VALUE_OF_BOOLEAN_TRUE; else v = 0; + } + else if( op == ttNotEqual ) + { + v = lctx->type.intValue - rctx->type.intValue; + if( v != 0 ) v = VALUE_OF_BOOLEAN_TRUE; else v = 0; + } + + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttBool, true), v); + } + else + { + // TODO: Use TXT_ILLEGAL_OPERATION_ON + Error(TXT_ILLEGAL_OPERATION, node); + } + } + else + { + int i = 0; + if( lctx->type.dataType.IsIntegerType() && lctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + int v = lctx->type.intValue - rctx->type.intValue; + if( v < 0 ) i = -1; + if( v > 0 ) i = 1; + } + else if( lctx->type.dataType.IsUnsignedType() && lctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + { + asDWORD v1 = lctx->type.dwordValue; + asDWORD v2 = rctx->type.dwordValue; + if( v1 < v2 ) i = -1; + if( v1 > v2 ) i = 1; + } + else if( lctx->type.dataType.IsIntegerType() && lctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + asINT64 v = asINT64(lctx->type.qwordValue) - asINT64(rctx->type.qwordValue); + if( v < 0 ) i = -1; + if( v > 0 ) i = 1; + } + else if( lctx->type.dataType.IsUnsignedType() && lctx->type.dataType.GetSizeInMemoryDWords() == 2 ) + { + asQWORD v1 = lctx->type.qwordValue; + asQWORD v2 = rctx->type.qwordValue; + if( v1 < v2 ) i = -1; + if( v1 > v2 ) i = 1; + } + else if( lctx->type.dataType.IsFloatType() ) + { + float v = lctx->type.floatValue - rctx->type.floatValue; + if( v < 0 ) i = -1; + if( v > 0 ) i = 1; + } + else if( lctx->type.dataType.IsDoubleType() ) + { + double v = lctx->type.doubleValue - rctx->type.doubleValue; + if( v < 0 ) i = -1; + if( v > 0 ) i = 1; + } + + + if( op == ttEqual ) + i = (i == 0 ? VALUE_OF_BOOLEAN_TRUE : 0); + else if( op == ttNotEqual ) + i = (i != 0 ? VALUE_OF_BOOLEAN_TRUE : 0); + else if( op == ttLessThan ) + i = (i < 0 ? VALUE_OF_BOOLEAN_TRUE : 0); + else if( op == ttLessThanOrEqual ) + i = (i <= 0 ? VALUE_OF_BOOLEAN_TRUE : 0); + else if( op == ttGreaterThan ) + i = (i > 0 ? VALUE_OF_BOOLEAN_TRUE : 0); + else if( op == ttGreaterThanOrEqual ) + i = (i >= 0 ? VALUE_OF_BOOLEAN_TRUE : 0); + + ctx->type.SetConstantDW(asCDataType::CreatePrimitive(ttBool, true), i); + } + } +} + +void asCCompiler::PushVariableOnStack(asSExprContext *ctx, bool asReference) +{ + // Put the result on the stack + ctx->bc.InstrSHORT(asBC_PSF, ctx->type.stackOffset); + if( asReference ) + ctx->type.dataType.MakeReference(true); + else + { + if( ctx->type.dataType.GetSizeInMemoryDWords() == 1 ) + ctx->bc.Instr(asBC_RDS4); + else + ctx->bc.Instr(asBC_RDS8); + } +} + +void asCCompiler::CompileBooleanOperator(asCScriptNode *node, asSExprContext *lctx, asSExprContext *rctx, asSExprContext *ctx) +{ + // Both operands must be booleans + asCDataType to; + to.SetTokenType(ttBool); + + // Do the actual conversion + asCArray reservedVars; + rctx->bc.GetVarsUsed(reservedVars); + lctx->bc.GetVarsUsed(reservedVars); + ImplicitConversion(lctx, to, node, asIC_IMPLICIT_CONV, true, &reservedVars); + ImplicitConversion(rctx, to, node, asIC_IMPLICIT_CONV, true, &reservedVars); + + // Verify that the conversion was successful + if( !lctx->type.dataType.IsBooleanType() ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, lctx->type.dataType.Format().AddressOf(), "bool"); + Error(str.AddressOf(), node); + // Force the conversion to allow compilation to proceed + lctx->type.SetConstantB(asCDataType::CreatePrimitive(ttBool, true), true); + } + + if( !rctx->type.dataType.IsBooleanType() ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, rctx->type.dataType.Format().AddressOf(), "bool"); + Error(str.AddressOf(), node); + // Force the conversion to allow compilation to proceed + rctx->type.SetConstantB(asCDataType::CreatePrimitive(ttBool, true), true); + } + + bool isConstant = lctx->type.isConstant && rctx->type.isConstant; + + ctx->type.Set(asCDataType::CreatePrimitive(ttBool, true)); + + // What kind of operator is it? + int op = node->tokenType; + if( op == ttXor ) + { + if( !isConstant ) + { + // Must convert to temporary variable, because we are changing the value before comparison + ConvertToTempVariableNotIn(lctx, rctx); + ConvertToTempVariableNotIn(rctx, lctx); + ReleaseTemporaryVariable(lctx->type, &lctx->bc); + ReleaseTemporaryVariable(rctx->type, &rctx->bc); + + // Make sure they are equal if not false + lctx->bc.InstrWORD(asBC_NOT, lctx->type.stackOffset); + rctx->bc.InstrWORD(asBC_NOT, rctx->type.stackOffset); + + MergeExprContexts(ctx, lctx); + MergeExprContexts(ctx, rctx); + + int a = AllocateVariable(ctx->type.dataType, true); + int b = lctx->type.stackOffset; + int c = rctx->type.stackOffset; + + ctx->bc.InstrW_W_W(asBC_BXOR,a,b,c); + + ctx->type.SetVariable(asCDataType::CreatePrimitive(ttBool, true), a, true); + } + else + { + // Make sure they are equal if not false +#if AS_SIZEOF_BOOL == 1 + if( lctx->type.byteValue != 0 ) lctx->type.byteValue = VALUE_OF_BOOLEAN_TRUE; + if( rctx->type.byteValue != 0 ) rctx->type.byteValue = VALUE_OF_BOOLEAN_TRUE; + + asBYTE v = 0; + v = lctx->type.byteValue - rctx->type.byteValue; + if( v != 0 ) v = VALUE_OF_BOOLEAN_TRUE; else v = 0; + + ctx->type.isConstant = true; + ctx->type.byteValue = v; +#else + if( lctx->type.dwordValue != 0 ) lctx->type.dwordValue = VALUE_OF_BOOLEAN_TRUE; + if( rctx->type.dwordValue != 0 ) rctx->type.dwordValue = VALUE_OF_BOOLEAN_TRUE; + + asDWORD v = 0; + v = lctx->type.intValue - rctx->type.intValue; + if( v != 0 ) v = VALUE_OF_BOOLEAN_TRUE; else v = 0; + + ctx->type.isConstant = true; + ctx->type.dwordValue = v; +#endif + } + } + else if( op == ttAnd || + op == ttOr ) + { + if( !isConstant ) + { + // If or-operator and first value is 1 the second value shouldn't be calculated + // if and-operator and first value is 0 the second value shouldn't be calculated + ConvertToVariable(lctx); + ReleaseTemporaryVariable(lctx->type, &lctx->bc); + MergeExprContexts(ctx, lctx); + + int offset = AllocateVariable(asCDataType::CreatePrimitive(ttBool, false), true); + + int label1 = nextLabel++; + int label2 = nextLabel++; + if( op == ttAnd ) + { + ctx->bc.InstrSHORT(asBC_CpyVtoR4, lctx->type.stackOffset); + ctx->bc.Instr(asBC_ClrHi); + ctx->bc.InstrDWORD(asBC_JNZ, label1); + ctx->bc.InstrW_DW(asBC_SetV4, (asWORD)offset, 0); + ctx->bc.InstrINT(asBC_JMP, label2); + } + else if( op == ttOr ) + { + ctx->bc.InstrSHORT(asBC_CpyVtoR4, lctx->type.stackOffset); + ctx->bc.Instr(asBC_ClrHi); + ctx->bc.InstrDWORD(asBC_JZ, label1); +#if AS_SIZEOF_BOOL == 1 + ctx->bc.InstrSHORT_B(asBC_SetV1, (short)offset, VALUE_OF_BOOLEAN_TRUE); +#else + ctx->bc.InstrSHORT_DW(asBC_SetV4, (short)offset, VALUE_OF_BOOLEAN_TRUE); +#endif + ctx->bc.InstrINT(asBC_JMP, label2); + } + + ctx->bc.Label((short)label1); + ConvertToVariable(rctx); + ReleaseTemporaryVariable(rctx->type, &rctx->bc); + rctx->bc.InstrW_W(asBC_CpyVtoV4, offset, rctx->type.stackOffset); + MergeExprContexts(ctx, rctx); + ctx->bc.Label((short)label2); + + ctx->type.SetVariable(asCDataType::CreatePrimitive(ttBool, false), offset, true); + } + else + { +#if AS_SIZEOF_BOOL == 1 + asBYTE v = 0; + if( op == ttAnd ) + v = lctx->type.byteValue && rctx->type.byteValue; + else if( op == ttOr ) + v = lctx->type.byteValue || rctx->type.byteValue; + + // Remember the result + ctx->type.isConstant = true; + ctx->type.byteValue = v; +#else + asDWORD v = 0; + if( op == ttAnd ) + v = lctx->type.dwordValue && rctx->type.dwordValue; + else if( op == ttOr ) + v = lctx->type.dwordValue || rctx->type.dwordValue; + + // Remember the result + ctx->type.isConstant = true; + ctx->type.dwordValue = v; +#endif + } + } +} + +void asCCompiler::CompileOperatorOnHandles(asCScriptNode *node, asSExprContext *lctx, asSExprContext *rctx, asSExprContext *ctx) +{ + // Process the property accessor as get + ProcessPropertyGetAccessor(lctx, node); + ProcessPropertyGetAccessor(rctx, node); + + // Make sure lctx doesn't end up with a variable used in rctx + if( lctx->type.isTemporary && rctx->bc.IsVarUsed(lctx->type.stackOffset) ) + { + asCArray vars; + rctx->bc.GetVarsUsed(vars); + int offset = AllocateVariable(lctx->type.dataType, true); + rctx->bc.ExchangeVar(lctx->type.stackOffset, offset); + ReleaseTemporaryVariable(offset, 0); + } + + // Warn if not both operands are explicit handles + if( (node->tokenType == ttEqual || node->tokenType == ttNotEqual) && + ((!lctx->type.isExplicitHandle && !(lctx->type.dataType.GetObjectType() && (lctx->type.dataType.GetObjectType()->flags & asOBJ_IMPLICIT_HANDLE))) || + (!rctx->type.isExplicitHandle && !(rctx->type.dataType.GetObjectType() && (rctx->type.dataType.GetObjectType()->flags & asOBJ_IMPLICIT_HANDLE)))) ) + { + Warning(TXT_HANDLE_COMPARISON, node); + } + + // Implicitly convert null to the other type + asCDataType to; + if( lctx->type.IsNullConstant() ) + to = rctx->type.dataType; + else if( rctx->type.IsNullConstant() ) + to = lctx->type.dataType; + else + { + // TODO: Use the common base type + to = lctx->type.dataType; + } + + // Need to pop the value if it is a null constant + if( lctx->type.IsNullConstant() ) + lctx->bc.Pop(AS_PTR_SIZE); + if( rctx->type.IsNullConstant() ) + rctx->bc.Pop(AS_PTR_SIZE); + + // Convert both sides to explicit handles + to.MakeHandle(true); + to.MakeReference(false); + + // Do the conversion + ImplicitConversion(lctx, to, node, asIC_IMPLICIT_CONV); + ImplicitConversion(rctx, to, node, asIC_IMPLICIT_CONV); + + // Both operands must be of the same type + + // Verify that the conversion was successful + if( !lctx->type.dataType.IsEqualExceptConst(to) ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, lctx->type.dataType.Format().AddressOf(), to.Format().AddressOf()); + Error(str.AddressOf(), node); + } + + if( !rctx->type.dataType.IsEqualExceptConst(to) ) + { + asCString str; + str.Format(TXT_NO_CONVERSION_s_TO_s, rctx->type.dataType.Format().AddressOf(), to.Format().AddressOf()); + Error(str.AddressOf(), node); + } + + ctx->type.Set(asCDataType::CreatePrimitive(ttBool, true)); + + int op = node->tokenType; + if( op == ttEqual || op == ttNotEqual || op == ttIs || op == ttNotIs ) + { + // If the object handle already is in a variable we must manually pop it from the stack + if( lctx->type.isVariable ) + lctx->bc.Pop(AS_PTR_SIZE); + if( rctx->type.isVariable ) + rctx->bc.Pop(AS_PTR_SIZE); + + // TODO: optimize: Treat the object handles as two integers, i.e. don't do REFCPY + ConvertToVariableNotIn(lctx, rctx); + ConvertToVariable(rctx); + + MergeExprContexts(ctx, lctx); + MergeExprContexts(ctx, rctx); + + int a = AllocateVariable(ctx->type.dataType, true); + int b = lctx->type.stackOffset; + int c = rctx->type.stackOffset; + + if( op == ttEqual || op == ttIs ) + { +#ifdef AS_64BIT_PTR + // TODO: Optimize: Use a 64bit integer comparison instead of double + ctx->bc.InstrW_W(asBC_CMPd, b, c); +#else + ctx->bc.InstrW_W(asBC_CMPi, b, c); +#endif + ctx->bc.Instr(asBC_TZ); + ctx->bc.InstrSHORT(asBC_CpyRtoV4, (short)a); + } + else if( op == ttNotEqual || op == ttNotIs ) + { +#ifdef AS_64BIT_PTR + // TODO: Optimize: Use a 64bit integer comparison instead of double + ctx->bc.InstrW_W(asBC_CMPd, b, c); +#else + ctx->bc.InstrW_W(asBC_CMPi, b, c); +#endif + ctx->bc.Instr(asBC_TNZ); + ctx->bc.InstrSHORT(asBC_CpyRtoV4, (short)a); + } + + ctx->type.SetVariable(asCDataType::CreatePrimitive(ttBool, true), a, true); + + ReleaseTemporaryVariable(lctx->type, &ctx->bc); + ReleaseTemporaryVariable(rctx->type, &ctx->bc); + } + else + { + // TODO: Use TXT_ILLEGAL_OPERATION_ON + Error(TXT_ILLEGAL_OPERATION, node); + } +} + + +void asCCompiler::PerformFunctionCall(int funcId, asSExprContext *ctx, bool isConstructor, asCArray *args, asCObjectType *objType, bool useVariable, int varOffset) +{ + asCScriptFunction *descr = builder->GetFunctionDescription(funcId); + + int argSize = descr->GetSpaceNeededForArguments(); + + ctx->type.Set(descr->returnType); + + if( isConstructor ) + { + // TODO: When value types are allocated on the stack, this won't be needed anymore + // as the constructor will be called just like any other function + asASSERT(useVariable == false); + + ctx->bc.Alloc(asBC_ALLOC, objType, descr->id, argSize+AS_PTR_SIZE); + + // The instruction has already moved the returned object to the variable + ctx->type.Set(asCDataType::CreatePrimitive(ttVoid, false)); + + // Clean up arguments + if( args ) + AfterFunctionCall(funcId, *args, ctx, false); + + ProcessDeferredParams(ctx); + + return; + } + else if( descr->funcType == asFUNC_IMPORTED ) + ctx->bc.Call(asBC_CALLBND , descr->id, argSize + (descr->objectType ? AS_PTR_SIZE : 0)); + // TODO: Maybe we need two different byte codes + else if( descr->funcType == asFUNC_INTERFACE || descr->funcType == asFUNC_VIRTUAL ) + ctx->bc.Call(asBC_CALLINTF, descr->id, argSize + (descr->objectType ? AS_PTR_SIZE : 0)); + else if( descr->funcType == asFUNC_SCRIPT ) + ctx->bc.Call(asBC_CALL , descr->id, argSize + (descr->objectType ? AS_PTR_SIZE : 0)); + else // if( descr->funcType == asFUNC_SYSTEM ) + ctx->bc.Call(asBC_CALLSYS , descr->id, argSize + (descr->objectType ? AS_PTR_SIZE : 0)); + + if( ctx->type.dataType.IsObject() && !descr->returnType.IsReference() ) + { + int returnOffset = 0; + + if( useVariable ) + { + // Use the given variable + returnOffset = varOffset; + ctx->type.SetVariable(descr->returnType, returnOffset, false); + } + else + { + // Allocate a temporary variable for the returned object + returnOffset = AllocateVariable(descr->returnType, true); + ctx->type.SetVariable(descr->returnType, returnOffset, true); + } + + ctx->type.dataType.MakeReference(true); + + // Move the pointer from the object register to the temporary variable + ctx->bc.InstrSHORT(asBC_STOREOBJ, (short)returnOffset); + + // Clean up arguments + if( args ) + AfterFunctionCall(funcId, *args, ctx, false); + + ProcessDeferredParams(ctx); + + ctx->bc.InstrSHORT(asBC_PSF, (short)returnOffset); + } + else if( descr->returnType.IsReference() ) + { + asASSERT(useVariable == false); + + // We cannot clean up the arguments yet, because the + // reference might be pointing to one of them. + + // Clean up arguments + if( args ) + AfterFunctionCall(funcId, *args, ctx, true); + + // Do not process the output parameters yet, because it + // might invalidate the returned reference + + if( descr->returnType.IsPrimitive() ) + ctx->type.Set(descr->returnType); + else + { + ctx->bc.Instr(asBC_PshRPtr); + if( descr->returnType.IsObject() && !descr->returnType.IsObjectHandle() ) + { + // We are getting the pointer to the object + // not a pointer to a object variable + ctx->type.dataType.MakeReference(false); + } + } + } + else + { + asASSERT(useVariable == false); + + if( descr->returnType.GetSizeInMemoryBytes() ) + { + int offset = AllocateVariable(descr->returnType, true); + + ctx->type.SetVariable(descr->returnType, offset, true); + + // Move the value from the return register to the variable + if( descr->returnType.GetSizeOnStackDWords() == 1 ) + ctx->bc.InstrSHORT(asBC_CpyRtoV4, (short)offset); + else if( descr->returnType.GetSizeOnStackDWords() == 2 ) + ctx->bc.InstrSHORT(asBC_CpyRtoV8, (short)offset); + } + else + ctx->type.Set(descr->returnType); + + // Clean up arguments + if( args ) + AfterFunctionCall(funcId, *args, ctx, false); + + ProcessDeferredParams(ctx); + } +} + + +void asCCompiler::MergeExprContexts(asSExprContext *before, asSExprContext *after) +{ + before->bc.AddCode(&after->bc); + + for( asUINT n = 0; n < after->deferredParams.GetLength(); n++ ) + before->deferredParams.PushLast(after->deferredParams[n]); + + after->deferredParams.SetLength(0); + + asASSERT( after->origExpr == 0 ); +} + +void asCCompiler::FilterConst(asCArray &funcs) +{ + if( funcs.GetLength() == 0 ) return; + + // This is only done for object methods + asCScriptFunction *desc = builder->GetFunctionDescription(funcs[0]); + if( desc->objectType == 0 ) return; + + // Check if there are any non-const matches + asUINT n; + bool foundNonConst = false; + for( n = 0; n < funcs.GetLength(); n++ ) + { + desc = builder->GetFunctionDescription(funcs[n]); + if( !desc->isReadOnly ) + { + foundNonConst = true; + break; + } + } + + if( foundNonConst ) + { + // Remove all const methods + for( n = 0; n < funcs.GetLength(); n++ ) + { + desc = builder->GetFunctionDescription(funcs[n]); + if( desc->isReadOnly ) + { + if( n == funcs.GetLength() - 1 ) + funcs.PopLast(); + else + funcs[n] = funcs.PopLast(); + + n--; + } + } + } +} + +END_AS_NAMESPACE + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_compiler.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_compiler.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_compiler.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_compiler.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,244 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_compiler.h +// +// The class that does the actual compilation of the functions +// + + + +#ifndef AS_COMPILER_H +#define AS_COMPILER_H + +#include "as_config.h" +#include "as_builder.h" +#include "as_scriptfunction.h" +#include "as_variablescope.h" +#include "as_bytecode.h" +#include "as_array.h" +#include "as_datatype.h" +#include "as_typeinfo.h" + +BEGIN_AS_NAMESPACE + +struct asSExprContext; + +struct asSDeferredParam +{ + asSDeferredParam() {argNode = 0; origExpr = 0;} + + asCScriptNode *argNode; + asCTypeInfo argType; + int argInOutFlags; + asSExprContext *origExpr; +}; + +struct asSExprContext +{ + asSExprContext(asCScriptEngine *engine) : bc(engine) {exprNode = 0; origExpr = 0; property_get = 0; property_set = 0; } + + asCByteCode bc; + asCTypeInfo type; + int property_get; + int property_set; + bool property_const; // If the object that is being accessed through property accessor is read-only + bool property_handle; // If the property accessor is called on an object stored in a handle + asCArray deferredParams; + asCScriptNode *exprNode; + asSExprContext *origExpr; +}; + +enum EImplicitConv +{ + asIC_IMPLICIT_CONV, + asIC_EXPLICIT_REF_CAST, + asIC_EXPLICIT_VAL_CAST +}; + +class asCCompiler +{ +public: + asCCompiler(asCScriptEngine *engine); + ~asCCompiler(); + + int CompileFunction(asCBuilder *builder, asCScriptCode *script, asCScriptNode *func, asCScriptFunction *outFunc); + int CompileDefaultConstructor(asCBuilder *builder, asCScriptCode *script, asCScriptFunction *outFunc); + int CompileFactory(asCBuilder *builder, asCScriptCode *script, asCScriptFunction *outFunc); + int CompileTemplateFactoryStub(asCBuilder *builder, int trueFactoryId, asCObjectType *objType, asCScriptFunction *outFunc); + int CompileGlobalVariable(asCBuilder *builder, asCScriptCode *script, asCScriptNode *expr, sGlobalVariableDescription *gvar, asCScriptFunction *outFunc); + + asCByteCode byteCode; + asCArray objVariableTypes; + asCArray objVariablePos; + +protected: + friend class asCBuilder; + + void Reset(asCBuilder *builder, asCScriptCode *script, asCScriptFunction *outFunc); + + // Statements + void CompileStatementBlock(asCScriptNode *block, bool ownVariableScope, bool *hasReturn, asCByteCode *bc); + void CompileDeclaration(asCScriptNode *decl, asCByteCode *bc); + void CompileStatement(asCScriptNode *statement, bool *hasReturn, asCByteCode *bc); + void CompileIfStatement(asCScriptNode *node, bool *hasReturn, asCByteCode *bc); + void CompileSwitchStatement(asCScriptNode *node, bool *hasReturn, asCByteCode *bc); + void CompileCase(asCScriptNode *node, asCByteCode *bc); + void CompileForStatement(asCScriptNode *node, asCByteCode *bc); + void CompileWhileStatement(asCScriptNode *node, asCByteCode *bc); + void CompileDoWhileStatement(asCScriptNode *node, asCByteCode *bc); + void CompileBreakStatement(asCScriptNode *node, asCByteCode *bc); + void CompileContinueStatement(asCScriptNode *node, asCByteCode *bc); + void CompileReturnStatement(asCScriptNode *node, asCByteCode *bc); + void CompileExpressionStatement(asCScriptNode *node, asCByteCode *bc); + + // Expressions + int CompileAssignment(asCScriptNode *expr, asSExprContext *out); + int CompileCondition(asCScriptNode *expr, asSExprContext *out); + int CompileExpression(asCScriptNode *expr, asSExprContext *out); + int CompilePostFixExpression(asCArray *postfix, asSExprContext *out); + int CompileExpressionTerm(asCScriptNode *node, asSExprContext *out); + int CompileExpressionPreOp(asCScriptNode *node, asSExprContext *out); + int CompileExpressionPostOp(asCScriptNode *node, asSExprContext *out); + int CompileExpressionValue(asCScriptNode *node, asSExprContext *out); + void CompileFunctionCall(asCScriptNode *node, asSExprContext *out, asCObjectType *objectType, bool objIsConst, const asCString &scope = ""); + void CompileConstructCall(asCScriptNode *node, asSExprContext *out); + void CompileConversion(asCScriptNode *node, asSExprContext *out); + int CompileOperator(asCScriptNode *node, asSExprContext *l, asSExprContext *r, asSExprContext *out); + void CompileOperatorOnHandles(asCScriptNode *node, asSExprContext *l, asSExprContext *r, asSExprContext *out); + void CompileMathOperator(asCScriptNode *node, asSExprContext *l, asSExprContext *r, asSExprContext *out); + void CompileBitwiseOperator(asCScriptNode *node, asSExprContext *l, asSExprContext *r, asSExprContext *out); + void CompileComparisonOperator(asCScriptNode *node, asSExprContext *l, asSExprContext *r, asSExprContext *out); + void CompileBooleanOperator(asCScriptNode *node, asSExprContext *l, asSExprContext *r, asSExprContext *out); + bool CompileOverloadedDualOperator(asCScriptNode *node, asSExprContext *l, asSExprContext *r, asSExprContext *out); + int CompileOverloadedDualOperator2(asCScriptNode *node, const char *methodName, asSExprContext *l, asSExprContext *r, asSExprContext *out, bool specificReturn = false, const asCDataType &returnType = asCDataType::CreatePrimitive(ttVoid, false)); + + void CompileInitList(asCTypeInfo *var, asCScriptNode *node, asCByteCode *bc); + + int CallDefaultConstructor(asCDataType &type, int offset, asCByteCode *bc, asCScriptNode *node, bool isGlobalVar = false); + void CallDestructor(asCDataType &type, int offset, asCByteCode *bc); + int CompileArgumentList(asCScriptNode *node, asCArray &args); + void MatchFunctions(asCArray &funcs, asCArray &args, asCScriptNode *node, const char *name, asCObjectType *objectType = NULL, bool isConstMethod = false, bool silent = false, bool allowObjectConstruct = true, const asCString &scope = ""); + + // Helper functions + void ProcessPropertyGetAccessor(asSExprContext *ctx, asCScriptNode *node); + int ProcessPropertySetAccessor(asSExprContext *ctx, asSExprContext *arg, asCScriptNode *node); + int FindPropertyAccessor(const asCString &name, asSExprContext *ctx, asCScriptNode *node); + void SwapPostFixOperands(asCArray &postfix, asCArray &target); + void PrepareTemporaryObject(asCScriptNode *node, asSExprContext *ctx, asCArray *reservedVars); + void PrepareOperand(asSExprContext *ctx, asCScriptNode *node); + void PrepareForAssignment(asCDataType *lvalue, asSExprContext *rvalue, asCScriptNode *node, asSExprContext *lvalueExpr = 0); + void PerformAssignment(asCTypeInfo *lvalue, asCTypeInfo *rvalue, asCByteCode *bc, asCScriptNode *node); + bool IsVariableInitialized(asCTypeInfo *type, asCScriptNode *node); + void Dereference(asSExprContext *ctx, bool generateCode); + bool CompileRefCast(asSExprContext *ctx, const asCDataType &to, bool isExplicit, asCScriptNode *node, bool generateCode = true); + int MatchArgument(asCArray &funcs, asCArray &matches, const asCTypeInfo *argType, int paramNum, bool allowObjectConstruct = true); + void PerformFunctionCall(int funcId, asSExprContext *out, bool isConstructor = false, asCArray *args = 0, asCObjectType *objTypeForConstruct = 0, bool useVariable = false, int varOffset = 0); + void MoveArgsToStack(int funcId, asCByteCode *bc, asCArray &args, bool addOneToOffset); + void MakeFunctionCall(asSExprContext *ctx, int funcId, asCObjectType *objectType, asCArray &args, asCScriptNode *node, bool useVariable = false, int stackOffset = 0); + void PrepareFunctionCall(int funcId, asCByteCode *bc, asCArray &args); + void AfterFunctionCall(int funcId, asCArray &args, asSExprContext *ctx, bool deferAll); + void ProcessDeferredParams(asSExprContext *ctx); + void PrepareArgument(asCDataType *paramType, asSExprContext *ctx, asCScriptNode *node, bool isFunction = false, int refType = 0, asCArray *reservedVars = 0); + void PrepareArgument2(asSExprContext *ctx, asSExprContext *arg, asCDataType *paramType, bool isFunction = false, int refType = 0, asCArray *reservedVars = 0); + bool IsLValue(asCTypeInfo &type); + int DoAssignment(asSExprContext *out, asSExprContext *lctx, asSExprContext *rctx, asCScriptNode *lexpr, asCScriptNode *rexpr, int op, asCScriptNode *opNode); + void MergeExprContexts(asSExprContext *before, asSExprContext *after); + void FilterConst(asCArray &funcs); + void ConvertToVariable(asSExprContext *ctx); + void ConvertToVariableNotIn(asSExprContext *ctx, asSExprContext *exclude); + void ConvertToVariableNotIn(asSExprContext *ctx, asCArray *reservedVars); + void ConvertToTempVariable(asSExprContext *ctx); + void ConvertToTempVariableNotIn(asSExprContext *ctx, asSExprContext *exclude); + void ConvertToTempVariableNotIn(asSExprContext *ctx, asCArray *reservedVars); + void ConvertToReference(asSExprContext *ctx); + void PushVariableOnStack(asSExprContext *ctx, bool asReference); + asCString GetScopeFromNode(asCScriptNode *node); + + void ImplicitConversion(asSExprContext *ctx, const asCDataType &to, asCScriptNode *node, EImplicitConv convType, bool generateCode = true, asCArray *reservedVars = 0, bool allowObjectConstruct = true); + void ImplicitConvPrimitiveToPrimitive(asSExprContext *ctx, const asCDataType &to, asCScriptNode *node, EImplicitConv convType, bool generateCode = true, asCArray *reservedVars = 0); + void ImplicitConvObjectToPrimitive(asSExprContext *ctx, const asCDataType &to, asCScriptNode *node, EImplicitConv convType, bool generateCode = true, asCArray *reservedVars = 0); + void ImplicitConvPrimitiveToObject(asSExprContext *ctx, const asCDataType &to, asCScriptNode *node, EImplicitConv convType, bool generateCode = true, asCArray *reservedVars = 0, bool allowObjectConstruct = true); + void ImplicitConvObjectToObject(asSExprContext *ctx, const asCDataType &to, asCScriptNode *node, EImplicitConv convType, bool generateCode = true, asCArray *reservedVars = 0, bool allowObjectConstruct = true); + void ImplicitConversionConstant(asSExprContext *ctx, const asCDataType &to, asCScriptNode *node, EImplicitConv convType); + + void LineInstr(asCByteCode *bc, size_t pos); + + asUINT ProcessStringConstant(asCString &str, asCScriptNode *node, bool processEscapeSequences = true); + void ProcessHeredocStringConstant(asCString &str, asCScriptNode *node); + int GetPrecedence(asCScriptNode *op); + + void Error(const char *msg, asCScriptNode *node); + void Warning(const char *msg, asCScriptNode *node); + void PrintMatchingFuncs(asCArray &funcs, asCScriptNode *node); + + + void AddVariableScope(bool isBreakScope = false, bool isContinueScope = false); + void RemoveVariableScope(); + + bool hasCompileErrors; + + int nextLabel; + + asCVariableScope *variables; + asCBuilder *builder; + asCScriptEngine *engine; + asCScriptCode *script; + asCScriptFunction *outFunc; + + bool m_isConstructor; + bool m_isConstructorCalled; + + asCArray breakLabels; + asCArray continueLabels; + + int AllocateVariable(const asCDataType &type, bool isTemporary); + int AllocateVariableNotIn(const asCDataType &type, bool isTemporary, asCArray *vars); + int GetVariableOffset(int varIndex); + int GetVariableSlot(int varOffset); + void DeallocateVariable(int pos); + void ReleaseTemporaryVariable(asCTypeInfo &t, asCByteCode *bc); + void ReleaseTemporaryVariable(int offset, asCByteCode *bc); + + asCArray variableAllocations; + asCArray variableIsTemporary; + asCArray freeVariables; + asCArray tempVariables; + + bool globalExpression; + bool isProcessingDeferredParams; + int noCodeOutput; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_configgroup.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_configgroup.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_configgroup.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_configgroup.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,232 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_configgroup.cpp +// +// This class holds configuration groups for the engine +// + + + +#include "as_config.h" +#include "as_configgroup.h" +#include "as_scriptengine.h" + +BEGIN_AS_NAMESPACE + +asCConfigGroup::asCConfigGroup() +{ + refCount = 0; + defaultAccess = true; +} + +asCConfigGroup::~asCConfigGroup() +{ +} + +int asCConfigGroup::AddRef() +{ + refCount++; + return refCount; +} + +int asCConfigGroup::Release() +{ + // Don't delete the object here, the engine will delete the object when ready + refCount--; + return refCount; +} + +asCObjectType *asCConfigGroup::FindType(const char *obj) +{ + for( asUINT n = 0; n < objTypes.GetLength(); n++ ) + if( objTypes[n]->name == obj ) + return objTypes[n]; + + return 0; +} + +void asCConfigGroup::RefConfigGroup(asCConfigGroup *group) +{ + if( group == this || group == 0 ) return; + + // Verify if the group is already referenced + for( asUINT n = 0; n < referencedConfigGroups.GetLength(); n++ ) + if( referencedConfigGroups[n] == group ) + return; + + referencedConfigGroups.PushLast(group); + group->AddRef(); +} + +bool asCConfigGroup::HasLiveObjects() +{ + for( asUINT n = 0; n < objTypes.GetLength(); n++ ) + if( objTypes[n]->GetRefCount() != 0 ) + return true; + + return false; +} + +void asCConfigGroup::RemoveConfiguration(asCScriptEngine *engine) +{ + asASSERT( refCount == 0 ); + + asUINT n; + + // Remove global variables + for( n = 0; n < globalProps.GetLength(); n++ ) + { + int index = engine->registeredGlobalProps.IndexOf(globalProps[n]); + if( index >= 0 ) + { + globalProps[n]->Release(); + + // TODO: global: Should compact the registeredGlobalProps array + engine->registeredGlobalProps[index] = 0; + } + } + + // Remove global functions + for( n = 0; n < scriptFunctions.GetLength(); n++ ) + { + scriptFunctions[n]->Release(); + engine->registeredGlobalFuncs.RemoveValue(scriptFunctions[n]); + if( engine->stringFactory == scriptFunctions[n] ) + engine->stringFactory = 0; + } + scriptFunctions.SetLength(0); + + // Remove behaviours and members of object types + for( n = 0; n < objTypes.GetLength(); n++ ) + { + asCObjectType *obj = objTypes[n]; + + obj->ReleaseAllFunctions(); + } + + + // Remove object types + for( n = 0; n < objTypes.GetLength(); n++ ) + { + asCObjectType *t = objTypes[n]; + int idx = engine->objectTypes.IndexOf(t); + if( idx >= 0 ) + { +#ifdef AS_DEBUG + ValidateNoUsage(engine, t); +#endif + + engine->objectTypes.RemoveIndex(idx); + + if( t->flags & asOBJ_TYPEDEF ) + engine->registeredTypeDefs.RemoveValue(t); + else if( t->flags & asOBJ_ENUM ) + engine->registeredEnums.RemoveValue(t); + else + engine->registeredObjTypes.RemoveValue(t); + + asDELETE(t, asCObjectType); + } + } + + // Release other config groups + for( n = 0; n < referencedConfigGroups.GetLength(); n++ ) + referencedConfigGroups[n]->refCount--; + referencedConfigGroups.SetLength(0); +} + +#ifdef AS_DEBUG +void asCConfigGroup::ValidateNoUsage(asCScriptEngine *engine, asCObjectType *type) +{ + for( asUINT n = 0; n < engine->scriptFunctions.GetLength(); n++ ) + { + asCScriptFunction *func = engine->scriptFunctions[n]; + if( func == 0 ) continue; + + // Ignore factory and members + if( func->name == "_beh_2_" || func->objectType == type ) + continue; + + asASSERT( func->returnType.GetObjectType() != type ); + + for( asUINT p = 0; p < func->parameterTypes.GetLength(); p++ ) + { + asASSERT(func->parameterTypes[p].GetObjectType() != type); + } + } + + // TODO: Check also usage of the type in global variables + + // TODO: Check also usage of the type in local variables in script functions + + // TODO: Check also usage of the type as members of classes + + // TODO: Check also usage of the type as sub types in other types +} +#endif + +int asCConfigGroup::SetModuleAccess(const char *module, bool hasAccess) +{ + if( module == asALL_MODULES ) + { + // Set default module access + defaultAccess = hasAccess; + } + else + { + asCString mod(module ? module : ""); + asSMapNode *cursor = 0; + if( moduleAccess.MoveTo(&cursor, mod) ) + { + moduleAccess.GetValue(cursor) = hasAccess; + } + else + { + moduleAccess.Insert(mod, hasAccess); + } + } + + return 0; +} + +bool asCConfigGroup::HasModuleAccess(const char *module) +{ + asCString mod(module ? module : ""); + asSMapNode *cursor = 0; + if( moduleAccess.MoveTo(&cursor, mod) ) + return moduleAccess.GetValue(cursor); + + return defaultAccess; +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_configgroup.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_configgroup.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_configgroup.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_configgroup.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,89 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_configgroup.h +// +// This class holds configuration groups for the engine +// + + + +#ifndef AS_CONFIGGROUP_H +#define AS_CONFIGGROUP_H + +#include "as_config.h" +#include "as_string.h" +#include "as_array.h" +#include "as_objecttype.h" +#include "as_map.h" + +BEGIN_AS_NAMESPACE + +class asCConfigGroup +{ +public: + asCConfigGroup(); + ~asCConfigGroup(); + + // Memory management + int AddRef(); + int Release(); + + asCObjectType *FindType(const char *obj); + void RefConfigGroup(asCConfigGroup *group); + + bool HasLiveObjects(); + void RemoveConfiguration(asCScriptEngine *engine); + + int SetModuleAccess(const char *module, bool hasAccess); + bool HasModuleAccess(const char *module); + +#ifdef AS_DEBUG + void ValidateNoUsage(asCScriptEngine *engine, asCObjectType *type); +#endif + + asCString groupName; + int refCount; + + asCArray objTypes; + asCArray scriptFunctions; + asCArray globalProps; + asCArray referencedConfigGroups; + + // Module access + bool defaultAccess; + asCMap moduleAccess; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_config.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_config.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_config.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_config.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,731 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_config.h +// +// this file is used for configuring the compilation of the library +// + +#ifndef AS_CONFIG_H +#define AS_CONFIG_H + + + +// +// Features +//----------------------------------------- + +// AS_NO_THREADS +// Turns off support for multithreading. By turning off +// this when it's not needed a bit of performance is gained. + +// AS_WINDOWS_THREADS +// If the library should be compiled using windows threads. + +// AS_POSIX_THREADS +// If the library should be compiled using posix threads. + +// AS_NO_ATOMIC +// If the compiler/platform doesn't support atomic instructions +// then this should be defined to use critical sections instead. + +// AS_DEBUG +// This flag can be defined to make the library write some extra output when +// compiling and executing scripts. + +// AS_DEPRECATED +// If this flag is defined then some backwards compatibility is maintained. +// There is no guarantee for how well deprecated functionality will work though +// so it is best to exchange it for the new functionality as soon as possible. + +// AS_NO_CLASS_METHODS +// Disables the possibility to add class methods. Can increase the +// portability of the library. + +// AS_MAX_PORTABILITY +// Disables all platform specific code. Only the asCALL_GENERIC calling +// convention will be available in with this flag set. + +// AS_DOUBLEBYTE_CHARSET +// When this flag is defined, the parser will treat all characters in strings +// that are greater than 127 as lead characters and automatically include the +// next character in the script without checking its value. This should be +// compatible with common encoding schemes, e.g. Big5. Shift-JIS is not compatible +// though as it encodes some single byte characters above 127. +// +// If support for international text is desired, it is recommended that UTF-8 +// is used as this is supported natively by the compiler without the use for this +// preprocessor flag. + + + + +// +// Library usage +//------------------------------------------ + +// ANGELSCRIPT_EXPORT +// This flag should be defined when compiling the library as a lib or dll. + +// ANGELSCRIPT_DLL_LIBRARY_IMPORT +// This flag should be defined when using AngelScript as a dll with automatic +// library import. + +// ANGELSCRIPT_DLL_MANUAL_IMPORT +// This flag should be defined when using AngelScript as a dll with manual +// loading of the library. + + + + +// +// Compiler differences +//----------------------------------------- + +// asVSNPRINTF(a,b,c,d) +// Some compilers use different names for this function. You must +// define this macro to map to the proper function. + +// ASM_AT_N_T or ASM_INTEL +// You should choose what inline assembly syntax to use when compiling. + +// VALUE_OF_BOOLEAN_TRUE +// This flag allows to customize the exact value of boolean true. + +// AS_SIZEOF_BOOL +// On some target platforms the sizeof(bool) is 4, but on most it is 1. + +// STDCALL +// This is used to declare a function to use the stdcall calling convention. + +// AS_USE_NAMESPACE +// Adds the AngelScript namespace on the declarations. + +// AS_NO_MEMORY_H +// Some compilers don't come with the memory.h header file. + + + +// +// How to identify different compilers +//----------------------------------------- + +// MS Visual C++ +// _MSC_VER is defined +// __MWERKS__ is not defined + +// Metrowerks +// _MSC_VER is defined +// __MWERKS__ is defined + +// GNU C based compilers +// __GNUC__ is defined + + + +// +// CPU differences +//--------------------------------------- + +// AS_ALIGN +// Some CPUs require that data words are aligned in some way. This macro +// should be defined if the words should be aligned to boundaries of the same +// size as the word, i.e. +// 1 byte on 1 byte boundaries +// 2 bytes on 2 byte boundaries +// 4 bytes on 4 byte boundaries +// 8 bytes on 4 byte boundaries (no it's not a typo) + +// AS_USE_DOUBLE_AS_FLOAT +// If there is no 64 bit floating point type, then this constant can be defined +// to treat double like normal floats. + +// AS_X86 +// Use assembler code for the x86 CPU family + +// AS_SH4 +// Use assembler code for the SH4 CPU family + +// AS_MIPS +// Use assembler code for the MIPS CPU family + +// AS_PPC +// Use assembler code for the 32bit PowerPC CPU family + +// AS_PPC_64 +// Use assembler code for the 64bit PowerPC CPU family + +// AS_XENON +// Use assembler code for the Xenon (XBOX360) CPU family + +// AS_ARM +// Use assembler code for the ARM CPU family + +// AS_64BIT_PTR +// Define this to make the engine store all pointers in 64bit words. + +// AS_BIG_ENDIAN +// Define this for CPUs that use big endian memory layout, e.g. PPC + + + +// +// Target systems +//-------------------------------- +// This group shows a few of the flags used to identify different target systems. +// Sometimes there are differences on different target systems, while both CPU and +// compiler is the same for both, when this is so these flags are used to produce the +// right code. + +// AS_WIN - Microsoft Windows +// AS_LINUX - Linux +// AS_MAC - Apple Macintosh +// AS_BSD - FreeBSD +// AS_XBOX - Microsoft XBox +// AS_XBOX360 - Microsoft XBox 360 +// AS_PSP - Sony Playstation Portable +// AS_PS2 - Sony Playstation 2 +// AS_PS3 - Sony Playstation 3 +// AS_DC - Sega Dreamcast +// AS_GC - Nintendo GameCube +// AS_WII - Nintendo Wii +// AS_IPHONE - Apple IPhone +// AS_ANDROID - Android + + + + +// +// Calling conventions +//----------------------------------------- + +// GNU_STYLE_VIRTUAL_METHOD +// This constant should be defined if method pointers store index for virtual +// functions in the same location as the function pointer. In such cases the method +// is identified as virtual if the least significant bit is set. + +// MULTI_BASE_OFFSET(x) +// This macro is used to retrieve the offset added to the object pointer in order to +// implicitly cast the object to the base object. x is the method pointer received by +// the register function. + +// HAVE_VIRTUAL_BASE_OFFSET +// Define this constant if the compiler stores the virtual base offset in the method +// pointers. If it is not stored in the pointers then AngelScript have no way of +// identifying a method as coming from a class with virtual inheritance. + +// VIRTUAL_BASE_OFFSET(x) +// This macro is used to retrieve the offset added to the object pointer in order to +// find the virtual base object. x is the method pointer received by the register +// function; + +// COMPLEX_MASK +// This constant shows what attributes determines if an object is returned in memory +// or in the registers as normal structures + +// THISCALL_RETURN_SIMPLE_IN_MEMORY +// CDECL_RETURN_SIMPLE_IN_MEMORY +// STDCALL_RETURN_SIMPLE_IN_MEMORY +// When these constants are defined then the corresponding calling convention always +// return classes/structs in memory regardless of size or complexity. + +// THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE +// STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE +// CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE +// Specifies the minimum size in dwords a class/struct needs to be to be passed in memory + + +// CALLEE_POPS_HIDDEN_RETURN_POINTER +// This constant should be defined if the callee pops the hidden return pointer, +// used when returning an object in memory. + +// THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK +// With this constant defined AngelScript will pass the object pointer on the stack + +// THISCALL_CALLEE_POPS_ARGUMENTS +// If the callee pops arguments for class methods then define this constant + +// COMPLEX_OBJS_PASSED_BY_REF +// Some compilers always pass certain objects by reference. GNUC for example does +// this if the the class has a defined destructor. + +// HAS_128_BIT_PRIMITIVES +// 64bit processors often support 128bit primitives. These may require special +// treatment when passed in function arguments or returned by functions. + +// SPLIT_OBJS_BY_MEMBER_TYPES +// On some platforms objects with primitive members are split over different +// register types when passed by value to functions. + + + + + +// +// Detect compiler +//------------------------------------------------ + +#define VALUE_OF_BOOLEAN_TRUE 1 +#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0 +#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0 +#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0 + +// Microsoft Visual C++ +#if defined(_MSC_VER) && !defined(__MWERKS__) + #define MULTI_BASE_OFFSET(x) (*((asDWORD*)(&x)+1)) + #define HAVE_VIRTUAL_BASE_OFFSET + #define VIRTUAL_BASE_OFFSET(x) (*((asDWORD*)(&x)+3)) + #define THISCALL_RETURN_SIMPLE_IN_MEMORY + #define THISCALL_PASS_OBJECT_POINTER_IN_ECX + #if _MSC_VER < 1500 // MSVC++ 9 (aka MSVC++ .NET 2008) + #define asVSNPRINTF(a, b, c, d) _vsnprintf(a, b, c, d) + #else + #define asVSNPRINTF(a, b, c, d) vsnprintf_s(a, b, _TRUNCATE, c, d) + #endif + #define THISCALL_CALLEE_POPS_ARGUMENTS + #define STDCALL __stdcall + #define AS_SIZEOF_BOOL 1 + #define AS_WINDOWS_THREADS + + #define ASM_INTEL // Intel style for inline assembly on microsoft compilers + + #if defined(WIN32) + #define AS_WIN + #endif + + #if _XBOX_VER >= 200 + // 360 uses a Xenon processor (which is a modified 64bit PPC) + #define AS_XBOX360 + #define AS_XENON + #define AS_BIG_ENDIAN + #else + // Support native calling conventions on x86, but not 64bit yet + #if defined(_XBOX) || (defined(_M_IX86) && !defined(__LP64__)) + #define AS_X86 + #endif + #endif + + #if _MSC_VER <= 1200 // MSVC++ 6 + #define I64(x) x##l + #else + #define I64(x) x##ll + #endif + + #ifdef _ARM_ + #define AS_ALIGN + #define AS_ARM + #define CDECL_RETURN_SIMPLE_IN_MEMORY + #define STDCALL_RETURN_SIMPLE_IN_MEMORY + #define COMPLEX_OBJS_PASSED_BY_REF + #define COMPLEX_MASK asOBJ_APP_CLASS_ASSIGNMENT + #else + #define COMPLEX_MASK (asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT) + #endif + + #define UNREACHABLE_RETURN +#endif + +// Metrowerks CodeWarrior (experimental, let me know if something isn't working) +#if defined(__MWERKS__) && !defined(EPPC) // JWC -- If Wii DO NOT use this even when using Metrowerks Compiler. Even though they are called Freescale... + #define MULTI_BASE_OFFSET(x) (*((asDWORD*)(&x)+1)) + #define HAVE_VIRTUAL_BASE_OFFSET + #define VIRTUAL_BASE_OFFSET(x) (*((asDWORD*)(&x)+3)) + #define THISCALL_RETURN_SIMPLE_IN_MEMORY + #define THISCALL_PASS_OBJECT_POINTER_IN_ECX + #define asVSNPRINTF(a, b, c, d) _vsnprintf(a, b, c, d) + #define THISCALL_CALLEE_POPS_ARGUMENTS + #define COMPLEX_MASK (asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT) + #define AS_SIZEOF_BOOL 1 + #define AS_WINDOWS_THREADS + #define STDCALL __stdcall + + // Support native calling conventions on x86, but not 64bit yet + #if defined(_M_IX86) && !defined(__LP64__) + #define AS_X86 + #define ASM_INTEL // Intel style for inline assembly + #endif + + #if _MSC_VER <= 1200 // MSVC++ 6 + #define I64(x) x##l + #else + #define I64(x) x##ll + #endif + + #define UNREACHABLE_RETURN +#endif + +// SN Systems ProDG (also experimental, let me know if something isn't working) +#if defined(__SNC__) || defined(SNSYS) + #define GNU_STYLE_VIRTUAL_METHOD + #define MULTI_BASE_OFFSET(x) (*((asDWORD*)(&x)+1)) + #define CALLEE_POPS_HIDDEN_RETURN_POINTER + #define COMPLEX_OBJS_PASSED_BY_REF + #define ASM_AT_N_T // AT&T style inline assembly + #define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR) + #define AS_SIZEOF_BOOL 1 + #define asVSNPRINTF(a, b, c, d) vsnprintf(a, b, c, d) + + // SN doesnt seem to like STDCALL. + // Maybe it can work with some fiddling, but I can't imagine linking to + // any STDCALL functions with a console anyway... + #define STDCALL + + // Linux specific + #ifdef __linux__ + #define THISCALL_RETURN_SIMPLE_IN_MEMORY + #define CDECL_RETURN_SIMPLE_IN_MEMORY + #define STDCALL_RETURN_SIMPLE_IN_MEMORY + #endif + + // Support native calling conventions on x86, but not 64bit yet + #if defined(i386) && !defined(__LP64__) + #define AS_X86 + #endif + + #define I64(x) x##ll + + #define UNREACHABLE_RETURN +#endif + +// GNU C (and MinGW on Windows) +#if (defined(__GNUC__) && !defined(__SNC__)) || defined(EPPC) // JWC -- use this instead for Wii + #define GNU_STYLE_VIRTUAL_METHOD +#if !defined( __amd64__ ) + #define MULTI_BASE_OFFSET(x) (*((asDWORD*)(&x)+1)) +#else + #define MULTI_BASE_OFFSET(x) (*((asQWORD*)(&x)+1)) +#endif + #define asVSNPRINTF(a, b, c, d) vsnprintf(a, b, c, d) + #define CALLEE_POPS_HIDDEN_RETURN_POINTER + #define COMPLEX_OBJS_PASSED_BY_REF + #define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR) + #define AS_NO_MEMORY_H + #define AS_SIZEOF_BOOL 1 + #define STDCALL __attribute__((stdcall)) + #define ASM_AT_N_T + + // MacOSX and IPhone + #ifdef __APPLE__ + + // Is this a Mac or an IPhone? + #ifdef TARGET_OS_IPHONE + #define AS_IPHONE + #else + #define AS_MAC + #endif + + // The sizeof bool is different depending on the target CPU + #undef AS_SIZEOF_BOOL + #if defined(__ppc__) + #define AS_SIZEOF_BOOL 4 + // STDCALL is not available on PPC + #undef STDCALL + #define STDCALL + #else + #define AS_SIZEOF_BOOL 1 + #endif + + #if defined(i386) && !defined(__LP64__) + // Support native calling conventions on Mac OS X + Intel 32bit CPU + #define AS_X86 + #elif (defined(__ppc__) || defined(__PPC__)) && !defined(__LP64__) + // Support native calling conventions on Mac OS X + PPC 32bit CPU + #define AS_PPC + #define THISCALL_RETURN_SIMPLE_IN_MEMORY + #define CDECL_RETURN_SIMPLE_IN_MEMORY + #define STDCALL_RETURN_SIMPLE_IN_MEMORY + #elif (defined(__ppc__) || defined(__PPC__)) && defined(__LP64__) + #define AS_PPC_64 + #elif (defined(_ARM_) || defined(__arm__)) + // The IPhone use an ARM processor + #define AS_ARM + #define AS_IPHONE + #define AS_ALIGN + #define CDECL_RETURN_SIMPLE_IN_MEMORY + #define STDCALL_RETURN_SIMPLE_IN_MEMORY + #define THISCALL_RETURN_SIMPLE_IN_MEMORY + + #undef THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE + #undef CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE + #undef STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE + + #define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2 + #define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2 + #define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2 + #define COMPLEX_OBJS_PASSED_BY_REF + #undef COMPLEX_MASK + #define COMPLEX_MASK asOBJ_APP_CLASS_DESTRUCTOR + #else + // Unknown CPU type + #define AS_MAX_PORTABILITY + #endif + #define AS_POSIX_THREADS + + // Windows + #elif defined(WIN32) + // On Windows the simple classes are returned in the EAX:EDX registers + //#define THISCALL_RETURN_SIMPLE_IN_MEMORY + //#define CDECL_RETURN_SIMPLE_IN_MEMORY + //#define STDCALL_RETURN_SIMPLE_IN_MEMORY + + #if defined(i386) && !defined(__LP64__) + // Support native calling conventions on Intel 32bit CPU + #define AS_X86 + #else + // No support for native calling conventions yet + #define AS_MAX_PORTABILITY + // STDCALL is not available on 64bit Linux + #undef STDCALL + #define STDCALL + #endif + #define AS_WIN + #define AS_WINDOWS_THREADS + + // Linux + #elif defined(__linux__) + #if defined(i386) && !defined(__LP64__) + #define THISCALL_RETURN_SIMPLE_IN_MEMORY + #define CDECL_RETURN_SIMPLE_IN_MEMORY + #define STDCALL_RETURN_SIMPLE_IN_MEMORY + + // Support native calling conventions on Intel 32bit CPU + #define AS_X86 + #else + #define AS_X64_GCC + #define HAS_128_BIT_PRIMITIVES + #define SPLIT_OBJS_BY_MEMBER_TYPES + // STDCALL is not available on 64bit Linux + #undef STDCALL + #define STDCALL + #endif + #define AS_LINUX + #define AS_POSIX_THREADS + + #if !( ( (__GNUC__ == 4) && (__GNUC_MINOR__ >= 1) || __GNUC__ > 4) ) + // Only with GCC 4.1 was the atomic instructions available + #define AS_NO_ATOMIC + #endif + + // Free BSD + #elif __FreeBSD__ + #define AS_BSD + #if defined(i386) && !defined(__LP64__) + #define AS_X86 + #else + #define AS_MAX_PORTABILITY + #endif + #define AS_POSIX_THREADS + #if !( ( (__GNUC__ == 4) && (__GNUC_MINOR__ >= 1) || __GNUC__ > 4) ) + // Only with GCC 4.1 was the atomic instructions available + #define AS_NO_ATOMIC + #endif + + // PSP and PS2 + #elif defined(__PSP__) || defined(__psp__) || defined(_EE_) || defined(_PSP) || defined(_PS2) + // Support native calling conventions on MIPS architecture + #if (defined(_MIPS_ARCH) || defined(_mips) || defined(__MIPSEL__)) && !defined(__LP64__) + #define AS_MIPS + #else + #define AS_MAX_PORTABILITY + #endif + + // PS3 + #elif (defined(__PPC__) || defined(__ppc__)) && defined(__PPU__) + // Support native calling conventions on PS3 + #define AS_PS3 + #define AS_PPC_64 + #define SPLIT_OBJS_BY_MEMBER_TYPES + #define THISCALL_RETURN_SIMPLE_IN_MEMORY + #define CDECL_RETURN_SIMPLE_IN_MEMORY + #define STDCALL_RETURN_SIMPLE_IN_MEMORY + // PS3 doesn't have STDCALL + #undef STDCALL + #define STDCALL + + // Dreamcast + #elif __SH4_SINGLE_ONLY__ + // Support native calling conventions on Dreamcast + #define AS_DC + #define AS_SH4 + + // Wii JWC - Close to PS3 just no PPC_64 and AS_PS3 + #elif defined(EPPC) + #define AS_WII + #define THISCALL_RETURN_SIMPLE_IN_MEMORY + #define CDECL_RETURN_SIMPLE_IN_MEMORY + #define STDCALL_RETURN_SIMPLE_IN_MEMORY + #undef STDCALL + #define STDCALL + + // Android + #elif defined(ANDROID) + #define AS_ANDROID + #define AS_NO_ATOMIC + + #define CDECL_RETURN_SIMPLE_IN_MEMORY + #define STDCALL_RETURN_SIMPLE_IN_MEMORY + #define THISCALL_RETURN_SIMPLE_IN_MEMORY + + #undef THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE + #undef CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE + #undef STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE + + #define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2 + #define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2 + #define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2 + + #if (defined(_ARM_) || defined(__arm__)) + #define AS_ARM + #define AS_ALIGN + #endif + #endif + + #define I64(x) x##ll + + #define UNREACHABLE_RETURN +#endif + + +// +// Detect target hardware +//------------------------------------------------ + +// X86, Intel, AMD, etc, i.e. most PCs +#if defined(__i386__) || defined(_M_IX86) + // Nothing special here +#endif + +// MIPS architecture (generally PS2 and PSP consoles, potentially supports N64 as well) +#if defined(_MIPS_ARCH) || defined(_mips) || defined(__MIPSEL__) || defined(__PSP__) || defined(__psp__) || defined(_EE_) || defined(_PSP) || defined(_PS2) + #define AS_ALIGN // align datastructures + #define AS_USE_DOUBLE_AS_FLOAT // use 32bit floats instead of doubles +#endif + +// PowerPC, e.g. Mac, GameCube, PS3, XBox 360, Wii +#if defined(__PPC__) || defined(__ppc__) || defined(_PPC_) || defined(EPPC) + #define AS_BIG_ENDIAN + + // Gamecube + #if defined(_GC) + #define AS_ALIGN + #define AS_USE_DOUBLE_AS_FLOAT + #endif + // XBox 360 + #if (_XBOX_VER >= 200 ) + #define AS_ALIGN + #endif + // PS3 + #if defined(__PPU__) + #define AS_ALIGN + #endif + // Wii + #if defined(EPPC) + #define AS_ALIGN + #endif +#endif + +// Dreamcast console +#ifdef __SH4_SINGLE_ONLY__ + #define AS_ALIGN // align datastructures + #define AS_USE_DOUBLE_AS_FLOAT // use 32bit floats instead of doubles +#endif + +// Is the target a 64bit system? +#if defined(__LP64__) || defined(__amd64__) || defined(_M_X64) + #ifndef AS_64BIT_PTR + #define AS_64BIT_PTR + #endif +#endif + +// If there are no current support for native calling +// conventions, then compile with AS_MAX_PORTABILITY +#if (!defined(AS_X86) && !defined(AS_SH4) && !defined(AS_MIPS) && !defined(AS_PPC) && !defined(AS_PPC_64) && !defined(AS_XENON) && !defined(AS_X64_GCC) && !defined(AS_ARM)) + #ifndef AS_MAX_PORTABILITY + #define AS_MAX_PORTABILITY + #endif +#endif + +// If the form of threads to use hasn't been chosen +// then the library will be compiled without support +// for multithreading +#if !defined(AS_POSIX_THREADS) && !defined(AS_WINDOWS_THREADS) + #define AS_NO_THREADS +#endif + + +// The assert macro +#include +#define asASSERT(x) assert(x) + + + +// +// Internal defines (do not change these) +//---------------------------------------------------------------- + +#ifdef AS_ALIGN + #define ALIGN(b) (((b)+3)&(~3)) +#else + #define ALIGN(b) (b) +#endif + +#define ARG_W(b) ((asWORD*)&b) +#define ARG_DW(b) ((asDWORD*)&b) +#define ARG_QW(b) ((asQWORD*)&b) +#define BCARG_W(b) ((asWORD*)&(b)[1]) +#define BCARG_DW(b) ((asDWORD*)&(b)[1]) +#define BCARG_QW(b) ((asQWORD*)&(b)[1]) + +#ifdef AS_64BIT_PTR + #define AS_PTR_SIZE 2 + #define asPTRWORD asQWORD + #define asBC_RDSPTR asBC_RDS8 +#else + #define AS_PTR_SIZE 1 + #define asPTRWORD asDWORD + #define asBC_RDSPTR asBC_RDS4 +#endif +#define ARG_PTR(b) ((asPTRWORD*)&b) +#define BCARG_PTR(b) ((asPTRWORD*)&(b)[1]) + +// This macro is used to avoid warnings about unused variables. +// Usually where the variables are only used in debug mode. +#define UNUSED_VAR(x) (x)=(x) + +#include "../include/angelscript.h" +#include "as_memory.h" + +#ifdef AS_USE_NAMESPACE +using namespace AngelScript; +#endif + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_context.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_context.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_context.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_context.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,3828 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_context.cpp +// +// This class handles the execution of the byte code +// + +#include // fmodf() + +#include "as_config.h" +#include "as_context.h" +#include "as_scriptengine.h" +#include "as_tokendef.h" +#include "as_texts.h" +#include "as_callfunc.h" +#include "as_generic.h" +#include "as_debug.h" // mkdir() +#include "as_bytecode.h" +#include "as_scriptobject.h" + +#ifdef _MSC_VER +#pragma warning(disable:4702) // unreachable code +#endif + +BEGIN_AS_NAMESPACE + +// We need at least 2 DWORDs reserved for exception handling +// We need at least 1 DWORD reserved for calling system functions +const int RESERVE_STACK = 2*AS_PTR_SIZE; + +// For each script function call we push 5 DWORDs on the call stack +const int CALLSTACK_FRAME_SIZE = 5; + + +#ifdef AS_DEBUG +// Instruction statistics +int instrCount[256]; + +int instrCount2[256][256]; +int lastBC; + +class asCDebugStats +{ +public: + asCDebugStats() + { + memset(instrCount, 0, sizeof(instrCount)); + } + + ~asCDebugStats() + { +/* + // This code writes out some statistics for the VM. + // It's useful for determining what needs to be optimized. + + _mkdir("AS_DEBUG"); + FILE *f = fopen("AS_DEBUG/total.txt", "at"); + if( f ) + { + // Output instruction statistics + fprintf(f, "\nTotal count\n"); + int n; + for( n = 0; n < BC_MAXBYTECODE; n++ ) + { + if( bcName[n].name && instrCount[n] > 0 ) + fprintf(f, "%-10.10s : %.0f\n", bcName[n].name, instrCount[n]); + } + + fprintf(f, "\nNever executed\n"); + for( n = 0; n < BC_MAXBYTECODE; n++ ) + { + if( bcName[n].name && instrCount[n] == 0 ) + fprintf(f, "%-10.10s\n", bcName[n].name); + } + + fclose(f); + } +*/ + } + + double instrCount[256]; +} stats; +#endif + +AS_API asIScriptContext *asGetActiveContext() +{ + asASSERT(threadManager); + asCThreadLocalData *tld = threadManager->GetLocalData(); + if( tld->activeContexts.GetLength() == 0 ) + return 0; + return tld->activeContexts[tld->activeContexts.GetLength()-1]; +} + +void asPushActiveContext(asIScriptContext *ctx) +{ + asASSERT(threadManager); + asCThreadLocalData *tld = threadManager->GetLocalData(); + tld->activeContexts.PushLast(ctx); +} + +void asPopActiveContext(asIScriptContext *ctx) +{ + asASSERT(threadManager); + asCThreadLocalData *tld = threadManager->GetLocalData(); + + asASSERT(tld->activeContexts.GetLength() > 0); + asASSERT(tld->activeContexts[tld->activeContexts.GetLength()-1] == ctx); + UNUSED_VAR(ctx); + + tld->activeContexts.PopLast(); +} + +asCContext::asCContext(asCScriptEngine *engine, bool holdRef) +{ +#ifdef AS_DEBUG + memset(instrCount, 0, sizeof(instrCount)); + + memset(instrCount2, 0, sizeof(instrCount2)); + + lastBC = 255; +#endif + + holdEngineRef = holdRef; + if( holdRef ) + engine->AddRef(); + this->engine = engine; + + status = asEXECUTION_UNINITIALIZED; + stackBlockSize = 0; + refCount.set(1); + inExceptionHandler = false; + isStackMemoryNotAllocated = false; + +#ifdef AS_DEPRECATED +// Deprecated since 2009-12-08, 2.18.0 + stringFunction = 0; +#endif + currentFunction = 0; + regs.objectRegister = 0; + initialFunction = 0; + + lineCallback = false; + exceptionCallback = false; + + regs.doProcessSuspend = false; + doSuspend = false; + + userData = 0; +} + +asCContext::~asCContext() +{ + DetachEngine(); +} + +int asCContext::AddRef() +{ + return refCount.atomicInc(); +} + +int asCContext::Release() +{ + int r = refCount.atomicDec(); + + if( r == 0 ) + { + asDELETE(this,asCContext); + return 0; + } + + return r; +} + +void asCContext::DetachEngine() +{ + if( engine == 0 ) return; + + // Abort any execution + Abort(); + + // Free all resources + Unprepare(); + + // Clear engine pointer + if( holdEngineRef ) + engine->Release(); + engine = 0; +} + +asIScriptEngine *asCContext::GetEngine() +{ + return engine; +} + +void *asCContext::SetUserData(void *data) +{ + void *oldData = userData; + userData = data; + return oldData; +} + +void *asCContext::GetUserData() +{ + return userData; +} + +int asCContext::Prepare(int funcID) +{ + if( status == asEXECUTION_ACTIVE || status == asEXECUTION_SUSPENDED ) + return asCONTEXT_ACTIVE; + + // Clean the stack if not done before + if( status != asEXECUTION_FINISHED && status != asEXECUTION_UNINITIALIZED ) + CleanStack(); + + // Release the returned object (if any) + CleanReturnObject(); + + if( funcID == -1 ) + { + // Use the previously prepared function + if( initialFunction == 0 ) + return asNO_FUNCTION; + + currentFunction = initialFunction; + } + else if( initialFunction && initialFunction->id == funcID ) + { + currentFunction = initialFunction; + } + else + { + // Check engine pointer + asASSERT( engine ); + + if( initialFunction ) + initialFunction->Release(); + + initialFunction = engine->GetScriptFunction(funcID); + if( initialFunction == 0 ) + return asNO_FUNCTION; + + initialFunction->AddRef(); + currentFunction = initialFunction; + regs.globalVarPointers = currentFunction->globalVarPointers.AddressOf(); + + // Determine the minimum stack size needed + // TODO: optimize: GetSpaceNeededForArguments() should be precomputed + int stackSize = currentFunction->GetSpaceNeededForArguments() + currentFunction->stackNeeded + RESERVE_STACK; + + stackSize = stackSize > engine->initialContextStackSize ? stackSize : engine->initialContextStackSize; + + if( stackSize > stackBlockSize ) + { + for( asUINT n = 0; n < stackBlocks.GetLength(); n++ ) + if( stackBlocks[n] ) + { + asDELETEARRAY(stackBlocks[n]); + } + stackBlocks.SetLength(0); + + stackBlockSize = stackSize; + + asDWORD *stack = asNEWARRAY(asDWORD,stackBlockSize); + stackBlocks.PushLast(stack); + } + + // Reserve space for the arguments and return value + returnValueSize = currentFunction->GetSpaceNeededForReturnValue(); + + // TODO: optimize: GetSpaceNeededForArguments() should be precomputed + argumentsSize = currentFunction->GetSpaceNeededForArguments() + (currentFunction->objectType ? AS_PTR_SIZE : 0); + } + + // Reset state + // Most of the time the previous state will be asEXECUTION_FINISHED, in which case the values are already initialized + if( status != asEXECUTION_FINISHED ) + { + exceptionLine = -1; + exceptionFunction = 0; + isCallingSystemFunction = false; + doAbort = false; + doSuspend = false; + regs.doProcessSuspend = lineCallback; + externalSuspendRequest = false; + stackIndex = 0; + } + status = asEXECUTION_PREPARED; + + // Reserve space for the arguments and return value + regs.stackFramePointer = stackBlocks[0] + stackBlockSize - argumentsSize; + regs.stackPointer = regs.stackFramePointer; + + // Set arguments to 0 + memset(regs.stackPointer, 0, 4*argumentsSize); + + if( currentFunction->funcType == asFUNC_SCRIPT ) + { + regs.programPointer = currentFunction->byteCode.AddressOf(); + + // Set all object variables to 0 + for( asUINT n = 0; n < currentFunction->objVariablePos.GetLength(); n++ ) + { + int pos = currentFunction->objVariablePos[n]; + *(size_t*)®s.stackFramePointer[-pos] = 0; + } + } + else + regs.programPointer = 0; + + return asSUCCESS; +} + +// Free all resources +int asCContext::Unprepare() +{ + if( status == asEXECUTION_ACTIVE || status == asEXECUTION_SUSPENDED ) + return asCONTEXT_ACTIVE; + + // Only clean the stack if the context was prepared but not executed + if( status != asEXECUTION_UNINITIALIZED ) + CleanStack(); + + // Release the returned object (if any) + CleanReturnObject(); + + // Release the initial function + if( initialFunction ) + initialFunction->Release(); + + // Clear function pointers + initialFunction = 0; + currentFunction = 0; + exceptionFunction = 0; + regs.programPointer = 0; + + // Reset status + status = asEXECUTION_UNINITIALIZED; + + // Deallocate the stack blocks + for( asUINT n = 0; n < stackBlocks.GetLength(); n++ ) + { + if( stackBlocks[n] ) + { + asDELETEARRAY(stackBlocks[n]); + } + } + stackBlocks.SetLength(0); + stackBlockSize = 0; + regs.stackFramePointer = 0; + regs.stackPointer = 0; + stackIndex = 0; + +#ifdef AS_DEPRECATED +// Deprecated since 2009-12-08, 2.18.0 + // Deallocate string function + if( stringFunction ) + { + stringFunction->Release(); + stringFunction = 0; + } +#endif + + return 0; +} + +#ifdef AS_DEPRECATED +// Deprecated since 2009-12-08, 2.18.0 +int asCContext::SetExecuteStringFunction(asCScriptFunction *func) +{ + if( stringFunction ) + stringFunction->Release(); + + // The new function already has the refCount set to 1 + stringFunction = func; + + return 0; +} +#endif + +asBYTE asCContext::GetReturnByte() +{ + if( status != asEXECUTION_FINISHED ) return 0; + + asCDataType *dt = &initialFunction->returnType; + + if( dt->IsObject() || dt->IsReference() ) return 0; + + return *(asBYTE*)®s.valueRegister; +} + +asWORD asCContext::GetReturnWord() +{ + if( status != asEXECUTION_FINISHED ) return 0; + + asCDataType *dt = &initialFunction->returnType; + + if( dt->IsObject() || dt->IsReference() ) return 0; + + return *(asWORD*)®s.valueRegister; +} + +asDWORD asCContext::GetReturnDWord() +{ + if( status != asEXECUTION_FINISHED ) return 0; + + asCDataType *dt = &initialFunction->returnType; + + if( dt->IsObject() || dt->IsReference() ) return 0; + + return *(asDWORD*)®s.valueRegister; +} + +asQWORD asCContext::GetReturnQWord() +{ + if( status != asEXECUTION_FINISHED ) return 0; + + asCDataType *dt = &initialFunction->returnType; + + if( dt->IsObject() || dt->IsReference() ) return 0; + + return regs.valueRegister; +} + +float asCContext::GetReturnFloat() +{ + if( status != asEXECUTION_FINISHED ) return 0; + + asCDataType *dt = &initialFunction->returnType; + + if( dt->IsObject() || dt->IsReference() ) return 0; + + return *(float*)®s.valueRegister; +} + +double asCContext::GetReturnDouble() +{ + if( status != asEXECUTION_FINISHED ) return 0; + + asCDataType *dt = &initialFunction->returnType; + + if( dt->IsObject() || dt->IsReference() ) return 0; + + return *(double*)®s.valueRegister; +} + +void *asCContext::GetReturnAddress() +{ + if( status != asEXECUTION_FINISHED ) return 0; + + asCDataType *dt = &initialFunction->returnType; + + if( dt->IsReference() ) + return *(void**)®s.valueRegister; + else if( dt->IsObject() ) + return regs.objectRegister; + + return 0; +} + +void *asCContext::GetReturnObject() +{ + if( status != asEXECUTION_FINISHED ) return 0; + + asCDataType *dt = &initialFunction->returnType; + + if( !dt->IsObject() ) return 0; + + if( dt->IsReference() ) + return *(void**)(size_t)regs.valueRegister; + else + return regs.objectRegister; +} + +void *asCContext::GetAddressOfReturnValue() +{ + if( status != asEXECUTION_FINISHED ) return 0; + + asCDataType *dt = &initialFunction->returnType; + + // An object is stored in the objectRegister + if( !dt->IsReference() && dt->IsObject() ) + { + // Need to dereference objects + if( !dt->IsObjectHandle() ) + return *(void**)®s.objectRegister; + return ®s.objectRegister; + } + + // Primitives and references are stored in valueRegister + return ®s.valueRegister; +} + +int asCContext::SetObject(void *obj) +{ + if( status != asEXECUTION_PREPARED ) + return asCONTEXT_NOT_PREPARED; + + if( !initialFunction->objectType ) + { + status = asEXECUTION_ERROR; + return asERROR; + } + + *(size_t*)®s.stackFramePointer[0] = (size_t)obj; + + return 0; +} + +int asCContext::SetArgByte(asUINT arg, asBYTE value) +{ + if( status != asEXECUTION_PREPARED ) + return asCONTEXT_NOT_PREPARED; + + if( arg >= (unsigned)initialFunction->parameterTypes.GetLength() ) + { + status = asEXECUTION_ERROR; + return asINVALID_ARG; + } + + // Verify the type of the argument + asCDataType *dt = &initialFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + if( dt->GetSizeInMemoryBytes() != 1 ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + // Determine the position of the argument + int offset = 0; + if( initialFunction->objectType ) + offset += AS_PTR_SIZE; + for( asUINT n = 0; n < arg; n++ ) + offset += initialFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Set the value + *(asBYTE*)®s.stackFramePointer[offset] = value; + + return 0; +} + +int asCContext::SetArgWord(asUINT arg, asWORD value) +{ + if( status != asEXECUTION_PREPARED ) + return asCONTEXT_NOT_PREPARED; + + if( arg >= (unsigned)initialFunction->parameterTypes.GetLength() ) + { + status = asEXECUTION_ERROR; + return asINVALID_ARG; + } + + // Verify the type of the argument + asCDataType *dt = &initialFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + if( dt->GetSizeInMemoryBytes() != 2 ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + // Determine the position of the argument + int offset = 0; + if( initialFunction->objectType ) + offset += AS_PTR_SIZE; + for( asUINT n = 0; n < arg; n++ ) + offset += initialFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Set the value + *(asWORD*)®s.stackFramePointer[offset] = value; + + return 0; +} + +int asCContext::SetArgDWord(asUINT arg, asDWORD value) +{ + if( status != asEXECUTION_PREPARED ) + return asCONTEXT_NOT_PREPARED; + + if( arg >= (unsigned)initialFunction->parameterTypes.GetLength() ) + { + status = asEXECUTION_ERROR; + return asINVALID_ARG; + } + + // Verify the type of the argument + asCDataType *dt = &initialFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + if( dt->GetSizeInMemoryBytes() != 4 ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + // Determine the position of the argument + int offset = 0; + if( initialFunction->objectType ) + offset += AS_PTR_SIZE; + for( asUINT n = 0; n < arg; n++ ) + offset += initialFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Set the value + *(asDWORD*)®s.stackFramePointer[offset] = value; + + return 0; +} + +int asCContext::SetArgQWord(asUINT arg, asQWORD value) +{ + if( status != asEXECUTION_PREPARED ) + return asCONTEXT_NOT_PREPARED; + + if( arg >= (unsigned)initialFunction->parameterTypes.GetLength() ) + { + status = asEXECUTION_ERROR; + return asINVALID_ARG; + } + + // Verify the type of the argument + asCDataType *dt = &initialFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + if( dt->GetSizeOnStackDWords() != 2 ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + // Determine the position of the argument + int offset = 0; + if( initialFunction->objectType ) + offset += AS_PTR_SIZE; + for( asUINT n = 0; n < arg; n++ ) + offset += initialFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Set the value + *(asQWORD*)(®s.stackFramePointer[offset]) = value; + + return 0; +} + +int asCContext::SetArgFloat(asUINT arg, float value) +{ + if( status != asEXECUTION_PREPARED ) + return asCONTEXT_NOT_PREPARED; + + if( arg >= (unsigned)initialFunction->parameterTypes.GetLength() ) + { + status = asEXECUTION_ERROR; + return asINVALID_ARG; + } + + // Verify the type of the argument + asCDataType *dt = &initialFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + if( dt->GetSizeOnStackDWords() != 1 ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + // Determine the position of the argument + int offset = 0; + if( initialFunction->objectType ) + offset += AS_PTR_SIZE; + for( asUINT n = 0; n < arg; n++ ) + offset += initialFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Set the value + *(float*)(®s.stackFramePointer[offset]) = value; + + return 0; +} + +int asCContext::SetArgDouble(asUINT arg, double value) +{ + if( status != asEXECUTION_PREPARED ) + return asCONTEXT_NOT_PREPARED; + + if( arg >= (unsigned)initialFunction->parameterTypes.GetLength() ) + { + status = asEXECUTION_ERROR; + return asINVALID_ARG; + } + + // Verify the type of the argument + asCDataType *dt = &initialFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + if( dt->GetSizeOnStackDWords() != 2 ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + // Determine the position of the argument + int offset = 0; + if( initialFunction->objectType ) + offset += AS_PTR_SIZE; + for( asUINT n = 0; n < arg; n++ ) + offset += initialFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Set the value + *(double*)(®s.stackFramePointer[offset]) = value; + + return 0; +} + +int asCContext::SetArgAddress(asUINT arg, void *value) +{ + if( status != asEXECUTION_PREPARED ) + return asCONTEXT_NOT_PREPARED; + + if( arg >= (unsigned)initialFunction->parameterTypes.GetLength() ) + { + status = asEXECUTION_ERROR; + return asINVALID_ARG; + } + + // Verify the type of the argument + asCDataType *dt = &initialFunction->parameterTypes[arg]; + if( !dt->IsReference() && !dt->IsObjectHandle() ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + // Determine the position of the argument + int offset = 0; + if( initialFunction->objectType ) + offset += AS_PTR_SIZE; + + for( asUINT n = 0; n < arg; n++ ) + offset += initialFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Set the value + *(size_t*)(®s.stackFramePointer[offset]) = (size_t)value; + + return 0; +} + +int asCContext::SetArgObject(asUINT arg, void *obj) +{ + if( status != asEXECUTION_PREPARED ) + return asCONTEXT_NOT_PREPARED; + + if( arg >= (unsigned)initialFunction->parameterTypes.GetLength() ) + { + status = asEXECUTION_ERROR; + return asINVALID_ARG; + } + + // Verify the type of the argument + asCDataType *dt = &initialFunction->parameterTypes[arg]; + if( !dt->IsObject() ) + { + status = asEXECUTION_ERROR; + return asINVALID_TYPE; + } + + // If the object should be sent by value we must make a copy of it + if( !dt->IsReference() ) + { + if( dt->IsObjectHandle() ) + { + // Increase the reference counter + asSTypeBehaviour *beh = &dt->GetObjectType()->beh; + if( obj && beh->addref ) + engine->CallObjectMethod(obj, beh->addref); + } + else + { + obj = engine->CreateScriptObjectCopy(obj, engine->GetTypeIdFromDataType(*dt)); + } + } + + // Determine the position of the argument + int offset = 0; + if( initialFunction->objectType ) + offset += AS_PTR_SIZE; + for( asUINT n = 0; n < arg; n++ ) + offset += initialFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Set the value + *(size_t*)(®s.stackFramePointer[offset]) = (size_t)obj; + + return 0; +} + + +// TODO: Instead of GetAddressOfArg, maybe we need a SetArgValue(int arg, void *value, bool takeOwnership) instead. + +// interface +void *asCContext::GetAddressOfArg(asUINT arg) +{ + if( status != asEXECUTION_PREPARED ) + return 0; + + if( arg >= (unsigned)initialFunction->parameterTypes.GetLength() ) + return 0; + + // Determine the position of the argument + int offset = 0; + if( initialFunction->objectType ) + offset += AS_PTR_SIZE; + for( asUINT n = 0; n < arg; n++ ) + offset += initialFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // We should return the address of the location where the argument value will be placed + + // All registered types are always sent by reference, even if + // the function is declared to receive the argument by value. + return ®s.stackFramePointer[offset]; +} + + +int asCContext::Abort() +{ + // TODO: multithread: Make thread safe + + if( engine == 0 ) return asERROR; + + if( status == asEXECUTION_SUSPENDED ) + status = asEXECUTION_ABORTED; + + doSuspend = true; + regs.doProcessSuspend = true; + externalSuspendRequest = true; + doAbort = true; + + return 0; +} + +// interface +int asCContext::Suspend() +{ + // This function just sets some internal flags and is safe + // to call from a secondary thread, even if the library has + // been built without multi-thread support. + + if( engine == 0 ) return asERROR; + + doSuspend = true; + externalSuspendRequest = true; + regs.doProcessSuspend = true; + + return 0; +} + +// interface +int asCContext::Execute() +{ + asASSERT( engine != 0 ); + + if( status != asEXECUTION_SUSPENDED && status != asEXECUTION_PREPARED ) + return asERROR; + + status = asEXECUTION_ACTIVE; + + asPushActiveContext((asIScriptContext *)this); + + if( regs.programPointer == 0 ) + { + if( currentFunction->funcType == asFUNC_VIRTUAL || + currentFunction->funcType == asFUNC_INTERFACE ) + { + // The currentFunction is a virtual method + + // Determine the true function from the object + asCScriptObject *obj = *(asCScriptObject**)(size_t*)regs.stackFramePointer; + if( obj == 0 ) + { + SetInternalException(TXT_NULL_POINTER_ACCESS); + } + else + { + asCObjectType *objType = obj->objType; + asCScriptFunction *realFunc = 0; + + if( currentFunction->funcType == asFUNC_VIRTUAL ) + { + if( objType->virtualFunctionTable.GetLength() > (asUINT)currentFunction->vfTableIdx ) + { + realFunc = objType->virtualFunctionTable[currentFunction->vfTableIdx]; + } + } + else + { + // Search the object type for a function that matches the interface function + for( asUINT n = 0; n < objType->methods.GetLength(); n++ ) + { + asCScriptFunction *f2 = engine->scriptFunctions[objType->methods[n]]; + if( f2->signatureId == currentFunction->signatureId ) + { + if( f2->funcType == asFUNC_VIRTUAL ) + realFunc = objType->virtualFunctionTable[f2->vfTableIdx]; + else + realFunc = f2; + break; + } + } + } + + if( realFunc ) + { + if( realFunc->signatureId != currentFunction->signatureId ) + { + SetInternalException(TXT_NULL_POINTER_ACCESS); + } + else + { + currentFunction = realFunc; + regs.programPointer = currentFunction->byteCode.AddressOf(); + regs.globalVarPointers = currentFunction->globalVarPointers.AddressOf(); + + // Set the local objects to 0 + for( asUINT n = 0; n < currentFunction->objVariablePos.GetLength(); n++ ) + { + int pos = currentFunction->objVariablePos[n]; + *(size_t*)®s.stackFramePointer[-pos] = 0; + } + } + } + } + } + else if( currentFunction->funcType == asFUNC_SYSTEM ) + { + // The current function is an application registered function + + // Call the function directly + CallSystemFunction(currentFunction->id, this, 0); + + // Was the call successful? + if( status == asEXECUTION_ACTIVE ) + { + status = asEXECUTION_FINISHED; + } + } + else + { + // This shouldn't happen + asASSERT(false); + } + } + + while( status == asEXECUTION_ACTIVE ) + ExecuteNext(); + + doSuspend = false; + regs.doProcessSuspend = lineCallback; + + asPopActiveContext((asIScriptContext *)this); + + +#ifdef AS_DEBUG +/* + // Output instruction statistics + // This is useful for determining what needs to be optimized. + + _mkdir("AS_DEBUG"); + FILE *f = fopen("AS_DEBUG/stats.txt", "at"); + fprintf(f, "\n"); + asQWORD total = 0; + int n; + for( n = 0; n < 256; n++ ) + { + if( bcName[n].name && instrCount[n] ) + fprintf(f, "%-10.10s : %d\n", bcName[n].name, instrCount[n]); + + total += instrCount[n]; + } + + fprintf(f, "\ntotal : %I64d\n", total); + + fprintf(f, "\n"); + for( n = 0; n < 256; n++ ) + { + if( bcName[n].name ) + { + for( int m = 0; m < 256; m++ ) + { + if( instrCount2[n][m] ) + fprintf(f, "%-10.10s, %-10.10s : %d\n", bcName[n].name, bcName[m].name, instrCount2[n][m]); + } + } + } + fclose(f); +*/ +#endif + + if( status == asEXECUTION_FINISHED ) + { + regs.objectType = initialFunction->returnType.GetObjectType(); + return asEXECUTION_FINISHED; + } + + if( status == asEXECUTION_SUSPENDED ) + return asEXECUTION_SUSPENDED; + + if( doAbort ) + { + doAbort = false; + + status = asEXECUTION_ABORTED; + return asEXECUTION_ABORTED; + } + + if( status == asEXECUTION_EXCEPTION ) + return asEXECUTION_EXCEPTION; + + return asERROR; +} + +void asCContext::PushCallState() +{ + callStack.SetLength(callStack.GetLength() + CALLSTACK_FRAME_SIZE); + + // Separating the loads and stores limits data cache trash, and with a smart compiler + // could turn into SIMD style loading/storing if available. + // The compiler can't do this itself due to potential pointer aliasing between the pointers, + // ie writing to tmp could overwrite the data contained in registers.stackFramePointer for example + // for all the compiler knows. So introducing the local variable s, which is never referred to by + // its address we avoid this issue. + + size_t s[5]; + s[0] = (size_t)regs.stackFramePointer; + s[1] = (size_t)currentFunction; + s[2] = (size_t)regs.programPointer; + s[3] = (size_t)regs.stackPointer; + s[4] = stackIndex; + + size_t *tmp = callStack.AddressOf() + callStack.GetLength() - CALLSTACK_FRAME_SIZE; + tmp[0] = s[0]; + tmp[1] = s[1]; + tmp[2] = s[2]; + tmp[3] = s[3]; + tmp[4] = s[4]; +} + +void asCContext::PopCallState() +{ + // See comments in PushCallState about pointer aliasing and data cache trashing + size_t *tmp = callStack.AddressOf() + callStack.GetLength() - CALLSTACK_FRAME_SIZE; + size_t s[5]; + s[0] = tmp[0]; + s[1] = tmp[1]; + s[2] = tmp[2]; + s[3] = tmp[3]; + s[4] = tmp[4]; + + regs.stackFramePointer = (asDWORD*)s[0]; + currentFunction = (asCScriptFunction*)s[1]; + regs.programPointer = (asDWORD*)s[2]; + regs.stackPointer = (asDWORD*)s[3]; + stackIndex = (int)s[4]; + + regs.globalVarPointers = currentFunction->globalVarPointers.AddressOf(); + + callStack.SetLength(callStack.GetLength() - CALLSTACK_FRAME_SIZE); +} + +int asCContext::GetCallstackSize() +{ + return (int)callStack.GetLength() / CALLSTACK_FRAME_SIZE; +} + +int asCContext::GetCallstackFunction(int index) +{ + if( index < 0 || index >= GetCallstackSize() ) return asINVALID_ARG; + + size_t *s = callStack.AddressOf() + index*CALLSTACK_FRAME_SIZE; + asCScriptFunction *func = (asCScriptFunction*)s[1]; + + return func->id; +} + +int asCContext::GetCallstackLineNumber(int index, int *column) +{ + if( index < 0 || index >= GetCallstackSize() ) return asINVALID_ARG; + + size_t *s = callStack.AddressOf() + index*CALLSTACK_FRAME_SIZE; + asCScriptFunction *func = (asCScriptFunction*)s[1]; + asDWORD *bytePos = (asDWORD*)s[2]; + + asDWORD line = func->GetLineNumber(int(bytePos - func->byteCode.AddressOf())); + if( column ) *column = (line >> 20); + + return (line & 0xFFFFF); +} + +void asCContext::CallScriptFunction(asCScriptFunction *func) +{ + // Push the framepointer, function id and programCounter on the stack + PushCallState(); + + currentFunction = func; + + regs.globalVarPointers = currentFunction->globalVarPointers.AddressOf(); + regs.programPointer = currentFunction->byteCode.AddressOf(); + + // Verify if there is enough room in the stack block. Allocate new block if not + if( regs.stackPointer - (func->stackNeeded + RESERVE_STACK) < stackBlocks[stackIndex] ) + { + asDWORD *oldStackPointer = regs.stackPointer; + + // The size of each stack block is determined by the following formula: + // size = stackBlockSize << index + + while( regs.stackPointer - (func->stackNeeded + RESERVE_STACK) < stackBlocks[stackIndex] ) + { + // Make sure we don't allocate more space than allowed + if( engine->ep.maximumContextStackSize ) + { + // This test will only stop growth once it has already crossed the limit + if( stackBlockSize * ((1 << (stackIndex+1)) - 1) > engine->ep.maximumContextStackSize ) + { + isStackMemoryNotAllocated = true; + + // Set the stackFramePointer, even though the stackPointer wasn't updated + regs.stackFramePointer = regs.stackPointer; + + // TODO: Make sure the exception handler doesn't try to free objects that have not been initialized + SetInternalException(TXT_STACK_OVERFLOW); + return; + } + } + + stackIndex++; + if( (int)stackBlocks.GetLength() == stackIndex ) + { + asDWORD *stack = asNEWARRAY(asDWORD,(stackBlockSize << stackIndex)); + stackBlocks.PushLast(stack); + } + + regs.stackPointer = stackBlocks[stackIndex] + (stackBlockSize<GetSpaceNeededForArguments(); + } + + // Copy the function arguments to the new stack space + memcpy(regs.stackPointer, oldStackPointer, sizeof(asDWORD)*func->GetSpaceNeededForArguments()); + } + + // Update framepointer and programCounter + regs.stackFramePointer = regs.stackPointer; + + // Set all object variables to 0 + for( asUINT n = 0; n < currentFunction->objVariablePos.GetLength(); n++ ) + { + int pos = currentFunction->objVariablePos[n]; + *(size_t*)®s.stackFramePointer[-pos] = 0; + } +} + +void asCContext::CallInterfaceMethod(asCScriptFunction *func) +{ + // Resolve the interface method using the current script type + asCScriptObject *obj = *(asCScriptObject**)(size_t*)regs.stackPointer; + if( obj == 0 ) + { + SetInternalException(TXT_NULL_POINTER_ACCESS); + return; + } + + asCObjectType *objType = obj->objType; + + // TODO: optimize: The object type should have a list of only those methods that + // implement interface methods. This list should be ordered by + // the signatureId so that a binary search can be made, instead + // of a linear search. + // + // When this is done, we must also make sure the signatureId of a + // function never changes, e.g. when if the signature functions are + // released. + + // Search the object type for a function that matches the interface function + asCScriptFunction *realFunc = 0; + if( func->funcType == asFUNC_INTERFACE ) + { + for( asUINT n = 0; n < objType->methods.GetLength(); n++ ) + { + asCScriptFunction *f2 = engine->scriptFunctions[objType->methods[n]]; + if( f2->signatureId == func->signatureId ) + { + if( f2->funcType == asFUNC_VIRTUAL ) + realFunc = objType->virtualFunctionTable[f2->vfTableIdx]; + else + realFunc = f2; + break; + } + } + + if( realFunc == 0 ) + { + SetInternalException(TXT_NULL_POINTER_ACCESS); + return; + } + } + else /* if( func->funcType == asFUNC_VIRTUAL ) */ + { + realFunc = objType->virtualFunctionTable[func->vfTableIdx]; + } + + // Then call the true script function + CallScriptFunction(realFunc); +} + +void asCContext::ExecuteNext() +{ + asDWORD *l_bc = regs.programPointer; + asDWORD *l_sp = regs.stackPointer; + asDWORD *l_fp = regs.stackFramePointer; + + for(;;) + { + +#ifdef AS_DEBUG + ++stats.instrCount[*(asBYTE*)l_bc]; + + ++instrCount[*(asBYTE*)l_bc]; + + ++instrCount2[lastBC][*(asBYTE*)l_bc]; + lastBC = *(asBYTE*)l_bc; + + // Used to verify that the size of the instructions are correct + asDWORD *old = l_bc; +#endif + + + // Remember to keep the cases in order and without + // gaps, because that will make the switch faster. + // It will be faster since only one lookup will be + // made to find the correct jump destination. If not + // in order, the switch will make two lookups. + switch( *(asBYTE*)l_bc ) + { +//-------------- +// memory access functions + + // Decrease the stack pointer with n dwords (stack grows downward) + case asBC_POP: + l_sp += asBC_WORDARG0(l_bc); + l_bc++; + break; + + // Increase the stack pointer with n dwords + case asBC_PUSH: + l_sp -= asBC_WORDARG0(l_bc); + l_bc++; + break; + + // Push a dword value on the stack + case asBC_PshC4: + --l_sp; + *l_sp = asBC_DWORDARG(l_bc); + l_bc += 2; + break; + + // Push the dword value of a variable on the stack + case asBC_PshV4: + --l_sp; + *l_sp = *(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + // Push the address of a variable on the stack + case asBC_PSF: + l_sp -= AS_PTR_SIZE; + *(asPTRWORD*)l_sp = (asPTRWORD)size_t(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + // Swap the top 2 dwords on the stack + case asBC_SWAP4: + { + asDWORD d = (asDWORD)*l_sp; + *l_sp = *(l_sp+1); + *(asDWORD*)(l_sp+1) = d; + l_bc++; + } + break; + + // Do a boolean not operation, modifying the value of the variable + case asBC_NOT: +#if AS_SIZEOF_BOOL == 1 + { + // Set the value to true if it is equal to 0 + + // We need to use volatile here to tell the compiler it cannot + // change the order of read and write operations on the pointer. + + volatile asBYTE *ptr = (asBYTE*)(l_fp - asBC_SWORDARG0(l_bc)); + asBYTE val = (ptr[0] == 0) ? VALUE_OF_BOOLEAN_TRUE : 0; + ptr[0] = val; // The result is stored in the lower byte + ptr[1] = 0; // Make sure the rest of the DWORD is 0 + ptr[2] = 0; + ptr[3] = 0; + } +#else + *(l_fp - asBC_SWORDARG0(l_bc)) = (*(l_fp - asBC_SWORDARG0(l_bc)) == 0 ? VALUE_OF_BOOLEAN_TRUE : 0); +#endif + l_bc++; + break; + + // Push the dword value of a global variable on the stack + case asBC_PshG4: + --l_sp; + // TODO: global: The global var address should be stored in the instruction directly + *l_sp = *(asDWORD*)regs.globalVarPointers[asBC_WORDARG0(l_bc)]; + l_bc++; + break; + + // Load the address of a global variable in the register, then + // copy the value of the global variable into a local variable + case asBC_LdGRdR4: + // TODO: global: The global var address should be stored in the instruction directly + *(void**)®s.valueRegister = regs.globalVarPointers[asBC_WORDARG1(l_bc)]; + *(l_fp - asBC_SWORDARG0(l_bc)) = **(asDWORD**)®s.valueRegister; + l_bc += 2; + break; + +//---------------- +// path control instructions + + // Begin execution of a script function + case asBC_CALL: + { + int i = asBC_INTARG(l_bc); + l_bc += 2; + + asASSERT( i >= 0 ); + asASSERT( (i & FUNC_IMPORTED) == 0 ); + + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + CallScriptFunction(engine->scriptFunctions[i]); + + // Extract the values from the context again + l_bc = regs.programPointer; + l_sp = regs.stackPointer; + l_fp = regs.stackFramePointer; + + // If status isn't active anymore then we must stop + if( status != asEXECUTION_ACTIVE ) + return; + } + break; + + // Return to the caller, and remove the arguments from the stack + case asBC_RET: + { + if( callStack.GetLength() == 0 ) + { + status = asEXECUTION_FINISHED; + return; + } + + asWORD w = asBC_WORDARG0(l_bc); + + // Read the old framepointer, functionid, and programCounter from the call stack + PopCallState(); + + // Extract the values from the context again + l_bc = regs.programPointer; + l_sp = regs.stackPointer; + l_fp = regs.stackFramePointer; + + // Pop arguments from stack + l_sp += w; + } + break; + + // Jump to a relative position + case asBC_JMP: + l_bc += 2 + asBC_INTARG(l_bc); + break; + +//---------------- +// Conditional jumps + + // Jump to a relative position if the value in the register is 0 + case asBC_JZ: + if( *(int*)®s.valueRegister == 0 ) + l_bc += asBC_INTARG(l_bc) + 2; + else + l_bc += 2; + break; + + // Jump to a relative position if the value in the register is not 0 + case asBC_JNZ: + if( *(int*)®s.valueRegister != 0 ) + l_bc += asBC_INTARG(l_bc) + 2; + else + l_bc += 2; + break; + + // Jump to a relative position if the value in the register is negative + case asBC_JS: + if( *(int*)®s.valueRegister < 0 ) + l_bc += asBC_INTARG(l_bc) + 2; + else + l_bc += 2; + break; + + // Jump to a relative position if the value in the register it not negative + case asBC_JNS: + if( *(int*)®s.valueRegister >= 0 ) + l_bc += asBC_INTARG(l_bc) + 2; + else + l_bc += 2; + break; + + // Jump to a relative position if the value in the register is greater than 0 + case asBC_JP: + if( *(int*)®s.valueRegister > 0 ) + l_bc += asBC_INTARG(l_bc) + 2; + else + l_bc += 2; + break; + + // Jump to a relative position if the value in the register is not greater than 0 + case asBC_JNP: + if( *(int*)®s.valueRegister <= 0 ) + l_bc += asBC_INTARG(l_bc) + 2; + else + l_bc += 2; + break; +//-------------------- +// test instructions + + // If the value in the register is 0, then set the register to 1, else to 0 + case asBC_TZ: +#if AS_SIZEOF_BOOL == 1 + { + // Set the value to true if it is equal to 0 + + // We need to use volatile here to tell the compiler it cannot + // change the order of read and write operations on valueRegister. + + volatile int *regPtr = (int*)®s.valueRegister; + volatile asBYTE *regBptr = (asBYTE*)®s.valueRegister; + asBYTE val = (regPtr[0] == 0) ? VALUE_OF_BOOLEAN_TRUE : 0; + regBptr[0] = val; // The result is stored in the lower byte + regBptr[1] = 0; // Make sure the rest of the register is 0 + regBptr[2] = 0; + regBptr[3] = 0; + regBptr[4] = 0; + regBptr[5] = 0; + regBptr[6] = 0; + regBptr[7] = 0; + } +#else + *(int*)®s.valueRegister = (*(int*)®s.valueRegister == 0 ? VALUE_OF_BOOLEAN_TRUE : 0); +#endif + l_bc++; + break; + + // If the value in the register is not 0, then set the register to 1, else to 0 + case asBC_TNZ: +#if AS_SIZEOF_BOOL == 1 + { + // Set the value to true if it is not equal to 0 + + // We need to use volatile here to tell the compiler it cannot + // change the order of read and write operations on valueRegister. + + volatile int *regPtr = (int*)®s.valueRegister; + volatile asBYTE *regBptr = (asBYTE*)®s.valueRegister; + asBYTE val = (regPtr[0] == 0) ? 0 : VALUE_OF_BOOLEAN_TRUE; + regBptr[0] = val; // The result is stored in the lower byte + regBptr[1] = 0; // Make sure the rest of the register is 0 + regBptr[2] = 0; + regBptr[3] = 0; + regBptr[4] = 0; + regBptr[5] = 0; + regBptr[6] = 0; + regBptr[7] = 0; + } +#else + *(int*)®s.valueRegister = (*(int*)®s.valueRegister == 0 ? 0 : VALUE_OF_BOOLEAN_TRUE); +#endif + l_bc++; + break; + + // If the value in the register is negative, then set the register to 1, else to 0 + case asBC_TS: +#if AS_SIZEOF_BOOL == 1 + { + // Set the value to true if it is less than 0 + + // We need to use volatile here to tell the compiler it cannot + // change the order of read and write operations on valueRegister. + + volatile int *regPtr = (int*)®s.valueRegister; + volatile asBYTE *regBptr = (asBYTE*)®s.valueRegister; + asBYTE val = (regPtr[0] < 0) ? VALUE_OF_BOOLEAN_TRUE : 0; + regBptr[0] = val; // The result is stored in the lower byte + regBptr[1] = 0; // Make sure the rest of the register is 0 + regBptr[2] = 0; + regBptr[3] = 0; + regBptr[4] = 0; + regBptr[5] = 0; + regBptr[6] = 0; + regBptr[7] = 0; + } +#else + *(int*)®s.valueRegister = (*(int*)®s.valueRegister < 0 ? VALUE_OF_BOOLEAN_TRUE : 0); +#endif + l_bc++; + break; + + // If the value in the register is not negative, then set the register to 1, else to 0 + case asBC_TNS: +#if AS_SIZEOF_BOOL == 1 + { + // Set the value to true if it is not less than 0 + + // We need to use volatile here to tell the compiler it cannot + // change the order of read and write operations on valueRegister. + + volatile int *regPtr = (int*)®s.valueRegister; + volatile asBYTE *regBptr = (asBYTE*)®s.valueRegister; + asBYTE val = (regPtr[0] >= 0) ? VALUE_OF_BOOLEAN_TRUE : 0; + regBptr[0] = val; // The result is stored in the lower byte + regBptr[1] = 0; // Make sure the rest of the register is 0 + regBptr[2] = 0; + regBptr[3] = 0; + regBptr[4] = 0; + regBptr[5] = 0; + regBptr[6] = 0; + regBptr[7] = 0; + } +#else + *(int*)®s.valueRegister = (*(int*)®s.valueRegister < 0 ? 0 : VALUE_OF_BOOLEAN_TRUE); +#endif + l_bc++; + break; + + // If the value in the register is greater than 0, then set the register to 1, else to 0 + case asBC_TP: +#if AS_SIZEOF_BOOL == 1 + { + // Set the value to true if it is greater than 0 + + // We need to use volatile here to tell the compiler it cannot + // change the order of read and write operations on valueRegister. + + volatile int *regPtr = (int*)®s.valueRegister; + volatile asBYTE *regBptr = (asBYTE*)®s.valueRegister; + asBYTE val = (regPtr[0] > 0) ? VALUE_OF_BOOLEAN_TRUE : 0; + regBptr[0] = val; // The result is stored in the lower byte + regBptr[1] = 0; // Make sure the rest of the register is 0 + regBptr[2] = 0; + regBptr[3] = 0; + regBptr[4] = 0; + regBptr[5] = 0; + regBptr[6] = 0; + regBptr[7] = 0; + } +#else + *(int*)®s.valueRegister = (*(int*)®s.valueRegister > 0 ? VALUE_OF_BOOLEAN_TRUE : 0); +#endif + l_bc++; + break; + + // If the value in the register is not greater than 0, then set the register to 1, else to 0 + case asBC_TNP: +#if AS_SIZEOF_BOOL == 1 + { + // Set the value to true if it is not greater than 0 + + // We need to use volatile here to tell the compiler it cannot + // change the order of read and write operations on valueRegister. + + volatile int *regPtr = (int*)®s.valueRegister; + volatile asBYTE *regBptr = (asBYTE*)®s.valueRegister; + asBYTE val = (regPtr[0] <= 0) ? VALUE_OF_BOOLEAN_TRUE : 0; + regBptr[0] = val; // The result is stored in the lower byte + regBptr[1] = 0; // Make sure the rest of the register is 0 + regBptr[2] = 0; + regBptr[3] = 0; + regBptr[4] = 0; + regBptr[5] = 0; + regBptr[6] = 0; + regBptr[7] = 0; + } +#else + *(int*)®s.valueRegister = (*(int*)®s.valueRegister > 0 ? 0 : VALUE_OF_BOOLEAN_TRUE); +#endif + l_bc++; + break; + +//-------------------- +// negate value + + // Negate the integer value in the variable + case asBC_NEGi: + *(l_fp - asBC_SWORDARG0(l_bc)) = asDWORD(-int(*(l_fp - asBC_SWORDARG0(l_bc)))); + l_bc++; + break; + + // Negate the float value in the variable + case asBC_NEGf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = -*(float*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + // Negate the double value in the variable + case asBC_NEGd: + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = -*(double*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + +//------------------------- +// Increment value pointed to by address in register + + // Increment the short value pointed to by the register + case asBC_INCi16: + (**(short**)®s.valueRegister)++; + l_bc++; + break; + + // Increment the byte value pointed to by the register + case asBC_INCi8: + (**(char**)®s.valueRegister)++; + l_bc++; + break; + + // Decrement the short value pointed to by the register + case asBC_DECi16: + (**(short**)®s.valueRegister)--; + l_bc++; + break; + + // Decrement the byte value pointed to by the register + case asBC_DECi8: + (**(char**)®s.valueRegister)--; + l_bc++; + break; + + // Increment the integer value pointed to by the register + case asBC_INCi: + ++(**(int**)®s.valueRegister); + l_bc++; + break; + + // Decrement the integer value pointed to by the register + case asBC_DECi: + --(**(int**)®s.valueRegister); + l_bc++; + break; + + // Increment the float value pointed to by the register + case asBC_INCf: + ++(**(float**)®s.valueRegister); + l_bc++; + break; + + // Decrement the float value pointed to by the register + case asBC_DECf: + --(**(float**)®s.valueRegister); + l_bc++; + break; + + // Increment the double value pointed to by the register + case asBC_INCd: + ++(**(double**)®s.valueRegister); + l_bc++; + break; + + // Decrement the double value pointed to by the register + case asBC_DECd: + --(**(double**)®s.valueRegister); + l_bc++; + break; + + // Increment the local integer variable + case asBC_IncVi: + (*(int*)(l_fp - asBC_SWORDARG0(l_bc)))++; + l_bc++; + break; + + // Decrement the local integer variable + case asBC_DecVi: + (*(int*)(l_fp - asBC_SWORDARG0(l_bc)))--; + l_bc++; + break; + +//-------------------- +// bits instructions + + // Do a bitwise not on the value in the variable + case asBC_BNOT: + *(l_fp - asBC_SWORDARG0(l_bc)) = ~*(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + // Do a bitwise and of two variables and store the result in a third variable + case asBC_BAND: + *(l_fp - asBC_SWORDARG0(l_bc)) = *(l_fp - asBC_SWORDARG1(l_bc)) & *(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + // Do a bitwise or of two variables and store the result in a third variable + case asBC_BOR: + *(l_fp - asBC_SWORDARG0(l_bc)) = *(l_fp - asBC_SWORDARG1(l_bc)) | *(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + // Do a bitwise xor of two variables and store the result in a third variable + case asBC_BXOR: + *(l_fp - asBC_SWORDARG0(l_bc)) = *(l_fp - asBC_SWORDARG1(l_bc)) ^ *(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + // Do a logical shift left of two variables and store the result in a third variable + case asBC_BSLL: + *(l_fp - asBC_SWORDARG0(l_bc)) = *(l_fp - asBC_SWORDARG1(l_bc)) << *(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + // Do a logical shift right of two variables and store the result in a third variable + case asBC_BSRL: + *(l_fp - asBC_SWORDARG0(l_bc)) = *(l_fp - asBC_SWORDARG1(l_bc)) >> *(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + // Do an arithmetic shift right of two variables and store the result in a third variable + case asBC_BSRA: + *(l_fp - asBC_SWORDARG0(l_bc)) = int(*(l_fp - asBC_SWORDARG1(l_bc))) >> *(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_COPY: + { + void *d = (void*)*(size_t*)l_sp; l_sp += AS_PTR_SIZE; + void *s = (void*)*(size_t*)l_sp; + if( s == 0 || d == 0 ) + { + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // Raise exception + SetInternalException(TXT_NULL_POINTER_ACCESS); + return; + } + memcpy(d, s, asBC_WORDARG0(l_bc)*4); + + // replace the pointer on the stack with the lvalue + *(size_t**)l_sp = (size_t*)d; + } + l_bc++; + break; + + case asBC_PshC8: + l_sp -= 2; + *(asQWORD*)l_sp = asBC_QWORDARG(l_bc); + l_bc += 3; + break; + + case asBC_RDS8: +#ifndef AS_64BIT_PTR + *(asQWORD*)(l_sp-1) = *(asQWORD*)*(size_t*)l_sp; + --l_sp; +#else + *(asQWORD*)l_sp = *(asQWORD*)*(size_t*)l_sp; +#endif + l_bc++; + break; + + case asBC_SWAP8: + { + asQWORD q = *(asQWORD*)l_sp; + *(asQWORD*)l_sp = *(asQWORD*)(l_sp+2); + *(asQWORD*)(l_sp+2) = q; + l_bc++; + } + break; + + //---------------------------- + // Comparisons + case asBC_CMPd: + { + double dbl = *(double*)(l_fp - asBC_SWORDARG0(l_bc)) - *(double*)(l_fp - asBC_SWORDARG1(l_bc)); + if( dbl == 0 ) *(int*)®s.valueRegister = 0; + else if( dbl < 0 ) *(int*)®s.valueRegister = -1; + else *(int*)®s.valueRegister = 1; + l_bc += 2; + } + break; + + case asBC_CMPu: + { + asDWORD d = *(asDWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + asDWORD d2 = *(asDWORD*)(l_fp - asBC_SWORDARG1(l_bc)); + if( d == d2 ) *(int*)®s.valueRegister = 0; + else if( d < d2 ) *(int*)®s.valueRegister = -1; + else *(int*)®s.valueRegister = 1; + l_bc += 2; + } + break; + + case asBC_CMPf: + { + float f = *(float*)(l_fp - asBC_SWORDARG0(l_bc)) - *(float*)(l_fp - asBC_SWORDARG1(l_bc)); + if( f == 0 ) *(int*)®s.valueRegister = 0; + else if( f < 0 ) *(int*)®s.valueRegister = -1; + else *(int*)®s.valueRegister = 1; + l_bc += 2; + } + break; + + case asBC_CMPi: + { + int i = *(int*)(l_fp - asBC_SWORDARG0(l_bc)) - *(int*)(l_fp - asBC_SWORDARG1(l_bc)); + if( i == 0 ) *(int*)®s.valueRegister = 0; + else if( i < 0 ) *(int*)®s.valueRegister = -1; + else *(int*)®s.valueRegister = 1; + l_bc += 2; + } + break; + + //---------------------------- + // Comparisons with constant value + case asBC_CMPIi: + { + int i = *(int*)(l_fp - asBC_SWORDARG0(l_bc)) - asBC_INTARG(l_bc); + if( i == 0 ) *(int*)®s.valueRegister = 0; + else if( i < 0 ) *(int*)®s.valueRegister = -1; + else *(int*)®s.valueRegister = 1; + l_bc += 2; + } + break; + + case asBC_CMPIf: + { + float f = *(float*)(l_fp - asBC_SWORDARG0(l_bc)) - asBC_FLOATARG(l_bc); + if( f == 0 ) *(int*)®s.valueRegister = 0; + else if( f < 0 ) *(int*)®s.valueRegister = -1; + else *(int*)®s.valueRegister = 1; + l_bc += 2; + } + break; + + case asBC_CMPIu: + { + asDWORD d1 = *(asDWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + asDWORD d2 = asBC_DWORDARG(l_bc); + if( d1 == d2 ) *(int*)®s.valueRegister = 0; + else if( d1 < d2 ) *(int*)®s.valueRegister = -1; + else *(int*)®s.valueRegister = 1; + l_bc += 2; + } + break; + + case asBC_JMPP: + l_bc += 1 + (*(int*)(l_fp - asBC_SWORDARG0(l_bc)))*2; + break; + + case asBC_PopRPtr: + *(asPTRWORD*)®s.valueRegister = *(asPTRWORD*)l_sp; + l_sp += AS_PTR_SIZE; + l_bc++; + break; + + case asBC_PshRPtr: + l_sp -= AS_PTR_SIZE; + *(asPTRWORD*)l_sp = *(asPTRWORD*)®s.valueRegister; + l_bc++; + break; + + case asBC_STR: + { + // Get the string id from the argument + asWORD w = asBC_WORDARG0(l_bc); + // Push the string pointer on the stack + const asCString &b = engine->GetConstantString(w); + l_sp -= AS_PTR_SIZE; + *(asPTRWORD*)l_sp = (asPTRWORD)(size_t)b.AddressOf(); + // Push the string length on the stack + --l_sp; + *l_sp = (asDWORD)b.GetLength(); + l_bc++; + } + break; + + case asBC_CALLSYS: + { + // Get function ID from the argument + int i = asBC_INTARG(l_bc); + + // Need to move the values back to the context as the called functions + // may use the debug interface to inspect the registers + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + l_sp += CallSystemFunction(i, this, 0); + + // Update the program position after the call so that line number is correct + l_bc += 2; + + if( regs.doProcessSuspend ) + { + // Should the execution be suspended? + if( doSuspend ) + { + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + status = asEXECUTION_SUSPENDED; + return; + } + // An exception might have been raised + if( status != asEXECUTION_ACTIVE ) + { + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + return; + } + } + } + break; + + case asBC_CALLBND: + { + // Get the function ID from the stack + int i = asBC_INTARG(l_bc); + l_bc += 2; + + asASSERT( i >= 0 ); + asASSERT( i & FUNC_IMPORTED ); + + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + int funcID = engine->importedFunctions[i&0xFFFF]->boundFunctionId; + if( funcID == -1 ) + { + SetInternalException(TXT_UNBOUND_FUNCTION); + return; + } + else + { + asCScriptFunction *func = engine->GetScriptFunction(funcID); + + CallScriptFunction(func); + } + + // Extract the values from the context again + l_bc = regs.programPointer; + l_sp = regs.stackPointer; + l_fp = regs.stackFramePointer; + + // If status isn't active anymore then we must stop + if( status != asEXECUTION_ACTIVE ) + return; + } + break; + + case asBC_SUSPEND: + if( regs.doProcessSuspend ) + { + if( lineCallback ) + { + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + CallLineCallback(); + } + if( doSuspend ) + { + l_bc++; + + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + status = asEXECUTION_SUSPENDED; + return; + } + } + + l_bc++; + break; + + case asBC_ALLOC: + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(l_bc); + int func = asBC_INTARG(l_bc+AS_PTR_SIZE); + + if( objType->flags & asOBJ_SCRIPT_OBJECT ) + { + // Pre-allocate the memory + asDWORD *mem = (asDWORD*)engine->CallAlloc(objType); + + // Pre-initialize the memory by calling the constructor for asCScriptObject + ScriptObject_Construct(objType, (asCScriptObject*)mem); + + // Call the constructor to initalize the memory + asCScriptFunction *f = engine->scriptFunctions[func]; + + asDWORD **a = (asDWORD**)*(size_t*)(l_sp + f->GetSpaceNeededForArguments()); + if( a ) *a = mem; + + // Push the object pointer on the stack + l_sp -= AS_PTR_SIZE; + *(size_t*)l_sp = (size_t)mem; + + l_bc += 2+AS_PTR_SIZE; + + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + CallScriptFunction(f); + + // Extract the values from the context again + l_bc = regs.programPointer; + l_sp = regs.stackPointer; + l_fp = regs.stackFramePointer; + + // If status isn't active anymore then we must stop + if( status != asEXECUTION_ACTIVE ) + return; + } + else + { + // Pre-allocate the memory + asDWORD *mem = (asDWORD*)engine->CallAlloc(objType); + + if( func ) + { + // Need to move the values back to the context as the called functions + // may use the debug interface to inspect the registers + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + l_sp += CallSystemFunction(func, this, mem); + } + + // Pop the variable address from the stack + asDWORD **a = (asDWORD**)*(size_t*)l_sp; + l_sp += AS_PTR_SIZE; + if( a ) *a = mem; + + l_bc += 2+AS_PTR_SIZE; + + if( regs.doProcessSuspend ) + { + // Should the execution be suspended? + if( doSuspend ) + { + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + status = asEXECUTION_SUSPENDED; + return; + } + // An exception might have been raised + if( status != asEXECUTION_ACTIVE ) + { + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + engine->CallFree(mem); + *a = 0; + + return; + } + } + } + } + break; + + case asBC_FREE: + { + asDWORD **a = (asDWORD**)*(size_t*)l_sp; + l_sp += AS_PTR_SIZE; + if( a && *a ) + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(l_bc); + asSTypeBehaviour *beh = &objType->beh; + + // Need to move the values back to the context as the called functions + // may use the debug interface to inspect the registers + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + if( beh->release ) + { + engine->CallObjectMethod(*a, beh->release); + } + else + { + if( beh->destruct ) + { + engine->CallObjectMethod(*a, beh->destruct); + } + + engine->CallFree(*a); + } + + // Clear the variable + *a = 0; + } + } + l_bc += 1+AS_PTR_SIZE; + break; + + case asBC_LOADOBJ: + { + // Move the object pointer from the object variable into the object register + void **a = (void**)(l_fp - asBC_SWORDARG0(l_bc)); + regs.objectType = 0; + regs.objectRegister = *a; + *a = 0; + } + l_bc++; + break; + + case asBC_STOREOBJ: + // Move the object pointer from the object register to the object variable + *(size_t*)(l_fp - asBC_SWORDARG0(l_bc)) = size_t(regs.objectRegister); + regs.objectRegister = 0; + l_bc++; + break; + + case asBC_GETOBJ: + { + // Read variable index from location on stack + size_t *a = (size_t*)(l_sp + asBC_WORDARG0(l_bc)); + asDWORD offset = *(asDWORD*)a; + // Move pointer from variable to the same location on the stack + size_t *v = (size_t*)(l_fp - offset); + *a = *v; + // Clear variable + *v = 0; + } + l_bc++; + break; + + case asBC_REFCPY: + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(l_bc); + asSTypeBehaviour *beh = &objType->beh; + + // Pop address of destination pointer from the stack + void **d = (void**)*(size_t*)l_sp; + l_sp += AS_PTR_SIZE; + + // Read wanted pointer from the stack + void *s = (void*)*(size_t*)l_sp; + + // Need to move the values back to the context as the called functions + // may use the debug interface to inspect the registers + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // Release previous object held by destination pointer + if( *d != 0 ) + engine->CallObjectMethod(*d, beh->release); + // Increase ref counter of wanted object + if( s != 0 ) + engine->CallObjectMethod(s, beh->addref); + + // Set the new object in the destination + *d = s; + } + l_bc += 1+AS_PTR_SIZE; + break; + + case asBC_CHKREF: + { + // Verify if the pointer on the stack is null + // This is used when validating a pointer that an operator will work on + size_t a = *(size_t*)l_sp; + if( a == 0 ) + { + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + SetInternalException(TXT_NULL_POINTER_ACCESS); + return; + } + } + l_bc++; + break; + + case asBC_GETOBJREF: + { + // Get the location on the stack where the reference will be placed + size_t *a = (size_t*)(l_sp + asBC_WORDARG0(l_bc)); + + // Replace the variable index with the object handle held in the variable + *(size_t**)a = *(size_t**)(l_fp - *a); + } + l_bc++; + break; + + case asBC_GETREF: + { + // Get the location on the stack where the reference will be placed + size_t *a = (size_t*)(l_sp + asBC_WORDARG0(l_bc)); + + // Replace the variable index with the address of the variable + *(size_t**)a = (size_t*)(l_fp - (int)*a); + } + l_bc++; + break; + + case asBC_SWAP48: + { + asDWORD d = *(asDWORD*)l_sp; + asQWORD q = *(asQWORD*)(l_sp+1); + *(asQWORD*)l_sp = q; + *(asDWORD*)(l_sp+2) = d; + l_bc++; + } + break; + + case asBC_SWAP84: + { + asQWORD q = *(asQWORD*)l_sp; + asDWORD d = *(asDWORD*)(l_sp+2); + *(asDWORD*)l_sp = d; + *(asQWORD*)(l_sp+1) = q; + l_bc++; + } + break; + + case asBC_OBJTYPE: + l_sp -= AS_PTR_SIZE; + *(asPTRWORD*)l_sp = asBC_PTRARG(l_bc); + l_bc += 1+AS_PTR_SIZE; + break; + + case asBC_TYPEID: + // Equivalent to PshC4, but kept as separate instruction for bytecode serialization + --l_sp; + *l_sp = asBC_DWORDARG(l_bc); + l_bc += 2; + break; + + case asBC_SetV4: + *(l_fp - asBC_SWORDARG0(l_bc)) = asBC_DWORDARG(l_bc); + l_bc += 2; + break; + + case asBC_SetV8: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = asBC_QWORDARG(l_bc); + l_bc += 3; + break; + + case asBC_ADDSi: + *(size_t*)l_sp = size_t(asPTRWORD(*(size_t*)l_sp) + asBC_INTARG(l_bc)); + l_bc += 2; + break; + + case asBC_CpyVtoV4: + *(l_fp - asBC_SWORDARG0(l_bc)) = *(l_fp - asBC_SWORDARG1(l_bc)); + l_bc += 2; + break; + + case asBC_CpyVtoV8: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)); + l_bc += 2; + break; + + case asBC_CpyVtoR4: + *(asDWORD*)®s.valueRegister = *(asDWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_CpyVtoR8: + *(asQWORD*)®s.valueRegister = *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_CpyVtoG4: + // TODO: global: The global var address should be stored in the instruction directly + *(asDWORD*)regs.globalVarPointers[asBC_WORDARG0(l_bc)] = *(asDWORD*)(l_fp - asBC_SWORDARG1(l_bc)); + l_bc += 2; + break; + + case asBC_CpyRtoV4: + *(asDWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asDWORD*)®s.valueRegister; + l_bc++; + break; + + case asBC_CpyRtoV8: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = regs.valueRegister; + l_bc++; + break; + + case asBC_CpyGtoV4: + // TODO: global: The global var address should be stored in the instruction directly + *(asDWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asDWORD*)regs.globalVarPointers[asBC_WORDARG1(l_bc)]; + l_bc += 2; + break; + + case asBC_WRTV1: + // The pointer in the register points to a byte, and *(l_fp - offset) too + **(asBYTE**)®s.valueRegister = *(asBYTE*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_WRTV2: + // The pointer in the register points to a word, and *(l_fp - offset) too + **(asWORD**)®s.valueRegister = *(asWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_WRTV4: + **(asDWORD**)®s.valueRegister = *(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_WRTV8: + **(asQWORD**)®s.valueRegister = *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_RDR1: + { + // The pointer in the register points to a byte, and *(l_fp - offset) will also point to a byte + asBYTE *bPtr = (asBYTE*)(l_fp - asBC_SWORDARG0(l_bc)); + bPtr[0] = **(asBYTE**)®s.valueRegister; // read the byte + bPtr[1] = 0; // 0 the rest of the DWORD + bPtr[2] = 0; + bPtr[3] = 0; + } + l_bc++; + break; + + case asBC_RDR2: + { + // The pointer in the register points to a word, and *(l_fp - offset) will also point to a word + asWORD *wPtr = (asWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + wPtr[0] = **(asWORD**)®s.valueRegister; // read the word + wPtr[1] = 0; // 0 the rest of the DWORD + } + l_bc++; + break; + + case asBC_RDR4: + *(asDWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = **(asDWORD**)®s.valueRegister; + l_bc++; + break; + + case asBC_RDR8: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = **(asQWORD**)®s.valueRegister; + l_bc++; + break; + + case asBC_LDG: + // TODO: global: The global var address should be stored in the instruction directly + *(asDWORD**)®s.valueRegister = (asDWORD*)regs.globalVarPointers[asBC_WORDARG0(l_bc)]; + l_bc++; + break; + + case asBC_LDV: + *(asDWORD**)®s.valueRegister = (l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_PGA: + l_sp -= AS_PTR_SIZE; + // TODO: global: The global var address should be stored in the instruction directly + *(asPTRWORD*)l_sp = (asPTRWORD)(size_t)regs.globalVarPointers[asBC_WORDARG0(l_bc)]; + l_bc++; + break; + + case asBC_RDS4: +#ifndef AS_64BIT_PTR + *l_sp = *(asDWORD*)*(size_t*)l_sp; +#else + { + asDWORD d = *(asDWORD*)*(size_t*)l_sp; + l_sp++; + *l_sp = d; + } +#endif + l_bc++; + break; + + case asBC_VAR: + l_sp -= AS_PTR_SIZE; + *(size_t*)l_sp = (size_t)asBC_SWORDARG0(l_bc); + l_bc++; + break; + + //---------------------------- + // Type conversions + case asBC_iTOf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = float(*(int*)(l_fp - asBC_SWORDARG0(l_bc))); + l_bc++; + break; + + case asBC_fTOi: + *(l_fp - asBC_SWORDARG0(l_bc)) = int(*(float*)(l_fp - asBC_SWORDARG0(l_bc))); + l_bc++; + break; + + case asBC_uTOf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = float(*(l_fp - asBC_SWORDARG0(l_bc))); + l_bc++; + break; + + case asBC_fTOu: + // We must cast to int first, because on some compilers the cast of a negative float value to uint result in 0 + *(l_fp - asBC_SWORDARG0(l_bc)) = asUINT(int(*(float*)(l_fp - asBC_SWORDARG0(l_bc)))); + l_bc++; + break; + + case asBC_sbTOi: + // *(l_fp - offset) points to a char, and will point to an int afterwards + *(l_fp - asBC_SWORDARG0(l_bc)) = *(signed char*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_swTOi: + // *(l_fp - offset) points to a short, and will point to an int afterwards + *(l_fp - asBC_SWORDARG0(l_bc)) = *(short*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_ubTOi: + // (l_fp - offset) points to a byte, and will point to an int afterwards + *(l_fp - asBC_SWORDARG0(l_bc)) = *(asBYTE*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_uwTOi: + // *(l_fp - offset) points to a word, and will point to an int afterwards + *(l_fp - asBC_SWORDARG0(l_bc)) = *(asWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_dTOi: + *(l_fp - asBC_SWORDARG0(l_bc)) = int(*(double*)(l_fp - asBC_SWORDARG1(l_bc))); + l_bc += 2; + break; + + case asBC_dTOu: + // We must cast to int first, because on some compilers the cast of a negative float value to uint result in 0 + *(l_fp - asBC_SWORDARG0(l_bc)) = asUINT(int(*(double*)(l_fp - asBC_SWORDARG1(l_bc)))); + l_bc += 2; + break; + + case asBC_dTOf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = float(*(double*)(l_fp - asBC_SWORDARG1(l_bc))); + l_bc += 2; + break; + + case asBC_iTOd: + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = double(*(int*)(l_fp - asBC_SWORDARG1(l_bc))); + l_bc += 2; + break; + + case asBC_uTOd: + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = double(*(asUINT*)(l_fp - asBC_SWORDARG1(l_bc))); + l_bc += 2; + break; + + case asBC_fTOd: + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = double(*(float*)(l_fp - asBC_SWORDARG1(l_bc))); + l_bc += 2; + break; + + //------------------------------ + // Math operations + case asBC_ADDi: + *(int*)(l_fp - asBC_SWORDARG0(l_bc)) = *(int*)(l_fp - asBC_SWORDARG1(l_bc)) + *(int*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_SUBi: + *(int*)(l_fp - asBC_SWORDARG0(l_bc)) = *(int*)(l_fp - asBC_SWORDARG1(l_bc)) - *(int*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_MULi: + *(int*)(l_fp - asBC_SWORDARG0(l_bc)) = *(int*)(l_fp - asBC_SWORDARG1(l_bc)) * *(int*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_DIVi: + { + int divider = *(int*)(l_fp - asBC_SWORDARG2(l_bc)); + if( divider == 0 ) + { + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // Raise exception + SetInternalException(TXT_DIVIDE_BY_ZERO); + return; + } + *(int*)(l_fp - asBC_SWORDARG0(l_bc)) = *(int*)(l_fp - asBC_SWORDARG1(l_bc)) / divider; + } + l_bc += 2; + break; + + case asBC_MODi: + { + int divider = *(int*)(l_fp - asBC_SWORDARG2(l_bc)); + if( divider == 0 ) + { + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // Raise exception + SetInternalException(TXT_DIVIDE_BY_ZERO); + return; + } + *(int*)(l_fp - asBC_SWORDARG0(l_bc)) = *(int*)(l_fp - asBC_SWORDARG1(l_bc)) % divider; + } + l_bc += 2; + break; + + case asBC_ADDf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = *(float*)(l_fp - asBC_SWORDARG1(l_bc)) + *(float*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_SUBf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = *(float*)(l_fp - asBC_SWORDARG1(l_bc)) - *(float*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_MULf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = *(float*)(l_fp - asBC_SWORDARG1(l_bc)) * *(float*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_DIVf: + { + float divider = *(float*)(l_fp - asBC_SWORDARG2(l_bc)); + if( divider == 0 ) + { + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // Raise exception + SetInternalException(TXT_DIVIDE_BY_ZERO); + return; + } + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = *(float*)(l_fp - asBC_SWORDARG1(l_bc)) / divider; + } + l_bc += 2; + break; + + case asBC_MODf: + { + float divider = *(float*)(l_fp - asBC_SWORDARG2(l_bc)); + if( divider == 0 ) + { + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // Raise exception + SetInternalException(TXT_DIVIDE_BY_ZERO); + return; + } + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = fmodf(*(float*)(l_fp - asBC_SWORDARG1(l_bc)), divider); + } + l_bc += 2; + break; + + case asBC_ADDd: + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = *(double*)(l_fp - asBC_SWORDARG1(l_bc)) + *(double*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_SUBd: + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = *(double*)(l_fp - asBC_SWORDARG1(l_bc)) - *(double*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_MULd: + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = *(double*)(l_fp - asBC_SWORDARG1(l_bc)) * *(double*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_DIVd: + { + double divider = *(double*)(l_fp - asBC_SWORDARG2(l_bc)); + if( divider == 0 ) + { + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // Raise exception + SetInternalException(TXT_DIVIDE_BY_ZERO); + return; + } + + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = *(double*)(l_fp - asBC_SWORDARG1(l_bc)) / divider; + l_bc += 2; + } + break; + + case asBC_MODd: + { + double divider = *(double*)(l_fp - asBC_SWORDARG2(l_bc)); + if( divider == 0 ) + { + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // Raise exception + SetInternalException(TXT_DIVIDE_BY_ZERO); + return; + } + + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = fmod(*(double*)(l_fp - asBC_SWORDARG1(l_bc)), divider); + l_bc += 2; + } + break; + + //------------------------------ + // Math operations with constant value + case asBC_ADDIi: + *(int*)(l_fp - asBC_SWORDARG0(l_bc)) = *(int*)(l_fp - asBC_SWORDARG1(l_bc)) + asBC_INTARG(l_bc+1); + l_bc += 3; + break; + + case asBC_SUBIi: + *(int*)(l_fp - asBC_SWORDARG0(l_bc)) = *(int*)(l_fp - asBC_SWORDARG1(l_bc)) - asBC_INTARG(l_bc+1); + l_bc += 3; + break; + + case asBC_MULIi: + *(int*)(l_fp - asBC_SWORDARG0(l_bc)) = *(int*)(l_fp - asBC_SWORDARG1(l_bc)) * asBC_INTARG(l_bc+1); + l_bc += 3; + break; + + case asBC_ADDIf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = *(float*)(l_fp - asBC_SWORDARG1(l_bc)) + asBC_FLOATARG(l_bc+1); + l_bc += 3; + break; + + case asBC_SUBIf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = *(float*)(l_fp - asBC_SWORDARG1(l_bc)) - asBC_FLOATARG(l_bc+1); + l_bc += 3; + break; + + case asBC_MULIf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = *(float*)(l_fp - asBC_SWORDARG1(l_bc)) * asBC_FLOATARG(l_bc+1); + l_bc += 3; + break; + + //----------------------------------- + case asBC_SetG4: + // TODO: global: The global var address should be stored in the instruction directly + *(asDWORD*)regs.globalVarPointers[asBC_WORDARG0(l_bc)] = asBC_DWORDARG(l_bc); + l_bc += 2; + break; + + case asBC_ChkRefS: + { + // Verify if the pointer on the stack refers to a non-null value + // This is used to validate a reference to a handle + asDWORD *a = (asDWORD*)*(size_t*)l_sp; + if( *a == 0 ) + { + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + SetInternalException(TXT_NULL_POINTER_ACCESS); + return; + } + } + l_bc++; + break; + + case asBC_ChkNullV: + { + // Verify if variable (on the stack) is not null + asDWORD *a = *(asDWORD**)(l_fp - asBC_SWORDARG0(l_bc)); + if( a == 0 ) + { + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + SetInternalException(TXT_NULL_POINTER_ACCESS); + return; + } + } + l_bc++; + break; + + case asBC_CALLINTF: + { + int i = asBC_INTARG(l_bc); + l_bc += 2; + + asASSERT( i >= 0 ); + asASSERT( (i & FUNC_IMPORTED) == 0 ); + + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + CallInterfaceMethod(engine->GetScriptFunction(i)); + + // Extract the values from the context again + l_bc = regs.programPointer; + l_sp = regs.stackPointer; + l_fp = regs.stackFramePointer; + + // If status isn't active anymore then we must stop + if( status != asEXECUTION_ACTIVE ) + return; + } + break; + + case asBC_iTOb: + { + // *(l_fp - offset) points to an int, and will point to a byte afterwards + + // We need to use volatile here to tell the compiler not to rearrange + // read and write operations during optimizations. + volatile asDWORD val = *(l_fp - asBC_SWORDARG0(l_bc)); + volatile asBYTE *bPtr = (asBYTE*)(l_fp - asBC_SWORDARG0(l_bc)); + bPtr[0] = (asBYTE)val; // write the byte + bPtr[1] = 0; // 0 the rest of the DWORD + bPtr[2] = 0; + bPtr[3] = 0; + } + l_bc++; + break; + + case asBC_iTOw: + { + // *(l_fp - offset) points to an int, and will point to word afterwards + + // We need to use volatile here to tell the compiler not to rearrange + // read and write operations during optimizations. + volatile asDWORD val = *(l_fp - asBC_SWORDARG0(l_bc)); + volatile asWORD *wPtr = (asWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + wPtr[0] = (asWORD)val; // write the word + wPtr[1] = 0; // 0 the rest of the DWORD + } + l_bc++; + break; + + case asBC_SetV1: + // TODO: This is exactly the same as SetV4. This is a left over from the time + // when the bytecode instructions were more tightly packed. It can now + // be removed. When removing it, make sure the value is correctly converted + // on big-endian CPUs. + + // The byte is already stored correctly in the argument + *(l_fp - asBC_SWORDARG0(l_bc)) = asBC_DWORDARG(l_bc); + l_bc += 2; + break; + + case asBC_SetV2: + // TODO: This is exactly the same as SetV4. This is a left over from the time + // when the bytecode instructions were more tightly packed. It can now + // be removed. When removing it, make sure the value is correctly converted + // on big-endian CPUs. + + // The word is already stored correctly in the argument + *(l_fp - asBC_SWORDARG0(l_bc)) = asBC_DWORDARG(l_bc); + l_bc += 2; + break; + + case asBC_Cast: + // Cast the handle at the top of the stack to the type in the argument + { + asDWORD **a = (asDWORD**)*(size_t*)l_sp; + if( a && *a ) + { + asDWORD typeId = asBC_DWORDARG(l_bc); + + asCScriptObject *obj = (asCScriptObject *)* a; + asCObjectType *objType = obj->objType; + asCObjectType *to = engine->GetObjectTypeFromTypeId(typeId); + + // This instruction can only be used with script classes and interfaces + asASSERT( objType->flags & asOBJ_SCRIPT_OBJECT ); + asASSERT( to->flags & asOBJ_SCRIPT_OBJECT ); + + if( objType->Implements(to) || objType->DerivesFrom(to) ) + { + regs.objectType = 0; + regs.objectRegister = obj; + obj->AddRef(); + } + else + { + // The object register should already be null, so there + // is no need to clear it if the cast is unsuccessful + asASSERT( regs.objectRegister == 0 ); + } + } + l_sp += AS_PTR_SIZE; + } + l_bc += 2; + break; + + case asBC_i64TOi: + *(l_fp - asBC_SWORDARG0(l_bc)) = int(*(asINT64*)(l_fp - asBC_SWORDARG1(l_bc))); + l_bc += 2; + break; + + case asBC_uTOi64: + *(asINT64*)(l_fp - asBC_SWORDARG0(l_bc)) = asINT64(*(asUINT*)(l_fp - asBC_SWORDARG1(l_bc))); + l_bc += 2; + break; + + case asBC_iTOi64: + *(asINT64*)(l_fp - asBC_SWORDARG0(l_bc)) = asINT64(*(int*)(l_fp - asBC_SWORDARG1(l_bc))); + l_bc += 2; + break; + + case asBC_fTOi64: + *(asINT64*)(l_fp - asBC_SWORDARG0(l_bc)) = asINT64(*(float*)(l_fp - asBC_SWORDARG1(l_bc))); + l_bc += 2; + break; + + case asBC_dTOi64: + *(asINT64*)(l_fp - asBC_SWORDARG0(l_bc)) = asINT64(*(double*)(l_fp - asBC_SWORDARG0(l_bc))); + l_bc++; + break; + + case asBC_fTOu64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = asQWORD(asINT64(*(float*)(l_fp - asBC_SWORDARG1(l_bc)))); + l_bc += 2; + break; + + case asBC_dTOu64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = asQWORD(asINT64(*(double*)(l_fp - asBC_SWORDARG0(l_bc)))); + l_bc++; + break; + + case asBC_i64TOf: + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = float(*(asINT64*)(l_fp - asBC_SWORDARG1(l_bc))); + l_bc += 2; + break; + + case asBC_u64TOf: +#if _MSC_VER <= 1200 // MSVC6 + { + // MSVC6 doesn't permit UINT64 to double + asINT64 v = *(asINT64*)(l_fp - asBC_SWORDARG1(l_bc)); + if( v < 0 ) + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = 18446744073709551615.0f+float(v); + else + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = float(v); + } +#else + *(float*)(l_fp - asBC_SWORDARG0(l_bc)) = float(*(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc))); +#endif + l_bc += 2; + break; + + case asBC_i64TOd: + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = double(*(asINT64*)(l_fp - asBC_SWORDARG0(l_bc))); + l_bc++; + break; + + case asBC_u64TOd: +#if _MSC_VER <= 1200 // MSVC6 + { + // MSVC6 doesn't permit UINT64 to double + asINT64 v = *(asINT64*)(l_fp - asBC_SWORDARG0(l_bc)); + if( v < 0 ) + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = 18446744073709551615.0+double(v); + else + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = double(v); + } +#else + *(double*)(l_fp - asBC_SWORDARG0(l_bc)) = double(*(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc))); +#endif + l_bc++; + break; + + case asBC_NEGi64: + *(asINT64*)(l_fp - asBC_SWORDARG0(l_bc)) = -*(asINT64*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_INCi64: + ++(**(asQWORD**)®s.valueRegister); + l_bc++; + break; + + case asBC_DECi64: + --(**(asQWORD**)®s.valueRegister); + l_bc++; + break; + + case asBC_BNOT64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = ~*(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + l_bc++; + break; + + case asBC_ADDi64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)) + *(asQWORD*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_SUBi64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)) - *(asQWORD*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_MULi64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)) * *(asQWORD*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_DIVi64: + { + asQWORD divider = *(asQWORD*)(l_fp - asBC_SWORDARG2(l_bc)); + if( divider == 0 ) + { + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // Raise exception + SetInternalException(TXT_DIVIDE_BY_ZERO); + return; + } + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)) / divider; + } + l_bc += 2; + break; + + case asBC_MODi64: + { + asQWORD divider = *(asQWORD*)(l_fp - asBC_SWORDARG2(l_bc)); + if( divider == 0 ) + { + // Need to move the values back to the context + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // Raise exception + SetInternalException(TXT_DIVIDE_BY_ZERO); + return; + } + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)) % divider; + } + l_bc += 2; + break; + + case asBC_BAND64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)) & *(asQWORD*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_BOR64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)) | *(asQWORD*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_BXOR64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)) ^ *(asQWORD*)(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_BSLL64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)) << *(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_BSRL64: + *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)) >> *(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_BSRA64: + *(asINT64*)(l_fp - asBC_SWORDARG0(l_bc)) = *(asINT64*)(l_fp - asBC_SWORDARG1(l_bc)) >> *(l_fp - asBC_SWORDARG2(l_bc)); + l_bc += 2; + break; + + case asBC_CMPi64: + { + asINT64 i = *(asINT64*)(l_fp - asBC_SWORDARG0(l_bc)) - *(asINT64*)(l_fp - asBC_SWORDARG1(l_bc)); + if( i == 0 ) *(int*)®s.valueRegister = 0; + else if( i < 0 ) *(int*)®s.valueRegister = -1; + else *(int*)®s.valueRegister = 1; + l_bc += 2; + } + break; + + case asBC_CMPu64: + { + asQWORD d = *(asQWORD*)(l_fp - asBC_SWORDARG0(l_bc)); + asQWORD d2 = *(asQWORD*)(l_fp - asBC_SWORDARG1(l_bc)); + if( d == d2 ) *(int*)®s.valueRegister = 0; + else if( d < d2 ) *(int*)®s.valueRegister = -1; + else *(int*)®s.valueRegister = 1; + l_bc += 2; + } + break; + + case asBC_ChkNullS: + { + // Verify if the pointer on the stack is null + // This is used for example when validating handles passed as function arguments + size_t a = *(size_t*)(l_sp + asBC_WORDARG0(l_bc)); + if( a == 0 ) + { + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + SetInternalException(TXT_NULL_POINTER_ACCESS); + return; + } + } + l_bc++; + break; + + case asBC_ClrHi: +#if AS_SIZEOF_BOOL == 1 + { + // Clear the upper bytes, so that trash data don't interfere with boolean operations + + // We need to use volatile here to tell the compiler it cannot + // change the order of read and write operations on the pointer. + + volatile asBYTE *ptr = (asBYTE*)®s.valueRegister; + ptr[1] = 0; // The boolean value is stored in the lower byte, so we clear the rest + ptr[2] = 0; + ptr[3] = 0; + } +#else + // We don't have anything to do here +#endif + l_bc++; + break; + + case asBC_JitEntry: + { + if( currentFunction->jitFunction ) + { + unsigned int jitOffset = asBC_WORDARG0(l_bc); + + if( jitOffset ) + { + // Resume JIT operation + regs.programPointer = l_bc; + regs.stackPointer = l_sp; + regs.stackFramePointer = l_fp; + + // TODO: JIT: We should return from this function if the jitFunction tells us to + (currentFunction->jitFunction)(®s, jitOffset-1); + + l_bc = regs.programPointer; + l_sp = regs.stackPointer; + l_fp = regs.stackFramePointer; + break; + } + } + + // Not a JIT resume point, treat as nop + l_bc++; + } + break; + + // Don't let the optimizer optimize for size, + // since it requires extra conditions and jumps + case 176: l_bc = (asDWORD*)176; break; + case 177: l_bc = (asDWORD*)177; break; + case 178: l_bc = (asDWORD*)178; break; + case 179: l_bc = (asDWORD*)179; break; + case 180: l_bc = (asDWORD*)180; break; + case 181: l_bc = (asDWORD*)181; break; + case 182: l_bc = (asDWORD*)182; break; + case 183: l_bc = (asDWORD*)183; break; + case 184: l_bc = (asDWORD*)184; break; + case 185: l_bc = (asDWORD*)185; break; + case 186: l_bc = (asDWORD*)186; break; + case 187: l_bc = (asDWORD*)187; break; + case 188: l_bc = (asDWORD*)188; break; + case 189: l_bc = (asDWORD*)189; break; + case 190: l_bc = (asDWORD*)190; break; + case 191: l_bc = (asDWORD*)191; break; + case 192: l_bc = (asDWORD*)192; break; + case 193: l_bc = (asDWORD*)193; break; + case 194: l_bc = (asDWORD*)194; break; + case 195: l_bc = (asDWORD*)195; break; + case 196: l_bc = (asDWORD*)196; break; + case 197: l_bc = (asDWORD*)197; break; + case 198: l_bc = (asDWORD*)198; break; + case 199: l_bc = (asDWORD*)199; break; + case 200: l_bc = (asDWORD*)200; break; + case 201: l_bc = (asDWORD*)201; break; + case 202: l_bc = (asDWORD*)202; break; + case 203: l_bc = (asDWORD*)203; break; + case 204: l_bc = (asDWORD*)204; break; + case 205: l_bc = (asDWORD*)205; break; + case 206: l_bc = (asDWORD*)206; break; + case 207: l_bc = (asDWORD*)207; break; + case 208: l_bc = (asDWORD*)208; break; + case 209: l_bc = (asDWORD*)209; break; + case 210: l_bc = (asDWORD*)210; break; + case 211: l_bc = (asDWORD*)211; break; + case 212: l_bc = (asDWORD*)212; break; + case 213: l_bc = (asDWORD*)213; break; + case 214: l_bc = (asDWORD*)214; break; + case 215: l_bc = (asDWORD*)215; break; + case 216: l_bc = (asDWORD*)216; break; + case 217: l_bc = (asDWORD*)217; break; + case 218: l_bc = (asDWORD*)218; break; + case 219: l_bc = (asDWORD*)219; break; + case 220: l_bc = (asDWORD*)220; break; + case 221: l_bc = (asDWORD*)221; break; + case 222: l_bc = (asDWORD*)222; break; + case 223: l_bc = (asDWORD*)223; break; + case 224: l_bc = (asDWORD*)224; break; + case 225: l_bc = (asDWORD*)225; break; + case 226: l_bc = (asDWORD*)226; break; + case 227: l_bc = (asDWORD*)227; break; + case 228: l_bc = (asDWORD*)228; break; + case 229: l_bc = (asDWORD*)229; break; + case 230: l_bc = (asDWORD*)230; break; + case 231: l_bc = (asDWORD*)231; break; + case 232: l_bc = (asDWORD*)232; break; + case 233: l_bc = (asDWORD*)233; break; + case 234: l_bc = (asDWORD*)234; break; + case 235: l_bc = (asDWORD*)235; break; + case 236: l_bc = (asDWORD*)236; break; + case 237: l_bc = (asDWORD*)237; break; + case 238: l_bc = (asDWORD*)238; break; + case 239: l_bc = (asDWORD*)239; break; + case 240: l_bc = (asDWORD*)240; break; + case 241: l_bc = (asDWORD*)241; break; + case 242: l_bc = (asDWORD*)242; break; + case 243: l_bc = (asDWORD*)243; break; + case 244: l_bc = (asDWORD*)244; break; + case 245: l_bc = (asDWORD*)245; break; + case 246: l_bc = (asDWORD*)246; break; + case 247: l_bc = (asDWORD*)247; break; + case 248: l_bc = (asDWORD*)248; break; + case 249: l_bc = (asDWORD*)249; break; + case 250: l_bc = (asDWORD*)250; break; + case 251: l_bc = (asDWORD*)251; break; + case 252: l_bc = (asDWORD*)252; break; + case 253: l_bc = (asDWORD*)253; break; + case 254: l_bc = (asDWORD*)254; break; + case 255: l_bc = (asDWORD*)255; break; + +#ifdef AS_DEBUG + default: + asASSERT(false); +#endif +/* + default: + // This Microsoft specific code allows the + // compiler to optimize the switch case as + // it will know that the code will never + // reach this point + __assume(0); +*/ } + +#ifdef AS_DEBUG + asDWORD instr = *(asBYTE*)old; + if( instr != asBC_JMP && instr != asBC_JMPP && (instr < asBC_JZ || instr > asBC_JNP) && + instr != asBC_CALL && instr != asBC_CALLBND && instr != asBC_CALLINTF && instr != asBC_RET && instr != asBC_ALLOC ) + { + asASSERT( (l_bc - old) == asBCTypeSize[asBCInfo[instr].type] ); + } +#endif + } + + SetInternalException(TXT_UNRECOGNIZED_BYTE_CODE); +} + +int asCContext::SetException(const char *descr) +{ + // Only allow this if we're executing a CALL byte code + if( !isCallingSystemFunction ) return asERROR; + + SetInternalException(descr); + + return 0; +} + +void asCContext::SetInternalException(const char *descr) +{ + if( inExceptionHandler ) + { + asASSERT(false); // Shouldn't happen + return; // but if it does, at least this will not crash the application + } + + status = asEXECUTION_EXCEPTION; + regs.doProcessSuspend = true; + + exceptionString = descr; + exceptionFunction = currentFunction->id; + exceptionLine = currentFunction->GetLineNumber(int(regs.programPointer - currentFunction->byteCode.AddressOf())); + exceptionColumn = exceptionLine >> 20; + exceptionLine &= 0xFFFFF; + + if( exceptionCallback ) + CallExceptionCallback(); +} + +void asCContext::CleanReturnObject() +{ + if( regs.objectRegister == 0 ) return; + + asASSERT( regs.objectType != 0 ); + + if( regs.objectType ) + { + // Call the destructor on the object + asSTypeBehaviour *beh = &((asCObjectType*)regs.objectType)->beh; + if( beh->release ) + { + engine->CallObjectMethod(regs.objectRegister, beh->release); + regs.objectRegister = 0; + + // The release method is responsible for freeing the memory + } + else + { + if( beh->destruct ) + engine->CallObjectMethod(regs.objectRegister, beh->destruct); + + // Free the memory + engine->CallFree(regs.objectRegister); + regs.objectRegister = 0; + } + } +} + +void asCContext::CleanStack() +{ + inExceptionHandler = true; + + // Run the clean up code for each of the functions called + CleanStackFrame(); + + while( callStack.GetLength() > 0 ) + { + PopCallState(); + + CleanStackFrame(); + } + inExceptionHandler = false; +} + +void asCContext::CleanStackFrame() +{ + // Clean object variables + if( !isStackMemoryNotAllocated ) + { + for( asUINT n = 0; n < currentFunction->objVariablePos.GetLength(); n++ ) + { + int pos = currentFunction->objVariablePos[n]; + if( *(size_t*)®s.stackFramePointer[-pos] ) + { + // Call the object's destructor + asSTypeBehaviour *beh = ¤tFunction->objVariableTypes[n]->beh; + if( beh->release ) + { + engine->CallObjectMethod((void*)*(size_t*)®s.stackFramePointer[-pos], beh->release); + *(size_t*)®s.stackFramePointer[-pos] = 0; + } + else + { + if( beh->destruct ) + engine->CallObjectMethod((void*)*(size_t*)®s.stackFramePointer[-pos], beh->destruct); + + // Free the memory + engine->CallFree((void*)*(size_t*)®s.stackFramePointer[-pos]); + *(size_t*)®s.stackFramePointer[-pos] = 0; + } + } + } + } + else + isStackMemoryNotAllocated = false; + + // Functions that do not own the object and parameters shouldn't do any clean up + if( currentFunction->dontCleanUpOnException ) + return; + + // Clean object and parameters + int offset = 0; + if( currentFunction->objectType ) + { + offset += AS_PTR_SIZE; + + // If the object is a script declared object, then we must release it + // as the compiler adds a reference at the entry of the function + asSTypeBehaviour *beh = ¤tFunction->objectType->beh; + if( beh->release && *(size_t*)®s.stackFramePointer[0] != 0 ) + { + engine->CallObjectMethod((void*)*(size_t*)®s.stackFramePointer[0], beh->release); + *(size_t*)®s.stackFramePointer[0] = 0; + } + } + for( asUINT n = 0; n < currentFunction->parameterTypes.GetLength(); n++ ) + { + if( currentFunction->parameterTypes[n].IsObject() && !currentFunction->parameterTypes[n].IsReference() ) + { + if( *(size_t*)®s.stackFramePointer[offset] ) + { + // Call the object's destructor + asSTypeBehaviour *beh = currentFunction->parameterTypes[n].GetBehaviour(); + if( beh->release ) + { + engine->CallObjectMethod((void*)*(size_t*)®s.stackFramePointer[offset], beh->release); + *(size_t*)®s.stackFramePointer[offset] = 0; + } + else + { + if( beh->destruct ) + engine->CallObjectMethod((void*)*(size_t*)®s.stackFramePointer[offset], beh->destruct); + + // Free the memory + engine->CallFree((void*)*(size_t*)®s.stackFramePointer[offset]); + *(size_t*)®s.stackFramePointer[offset] = 0; + } + } + } + + offset += currentFunction->parameterTypes[n].GetSizeOnStackDWords(); + } +} + +int asCContext::GetExceptionLineNumber(int *column) +{ + if( GetState() != asEXECUTION_EXCEPTION ) return asERROR; + + if( column ) *column = exceptionColumn; + + return exceptionLine; +} + +int asCContext::GetExceptionFunction() +{ + if( GetState() != asEXECUTION_EXCEPTION ) return asERROR; + + return exceptionFunction; +} + +int asCContext::GetCurrentFunction() +{ + if( status == asEXECUTION_SUSPENDED || status == asEXECUTION_ACTIVE ) + return currentFunction->id; + + return -1; +} + +int asCContext::GetCurrentLineNumber(int *column) +{ + if( status == asEXECUTION_SUSPENDED || status == asEXECUTION_ACTIVE ) + { + asDWORD line = currentFunction->GetLineNumber(int(regs.programPointer - currentFunction->byteCode.AddressOf())); + if( column ) *column = line >> 20; + + return line & 0xFFFFF; + } + + return -1; +} + +const char *asCContext::GetExceptionString() +{ + if( GetState() != asEXECUTION_EXCEPTION ) return 0; + + return exceptionString.AddressOf(); +} + +asEContextState asCContext::GetState() +{ + return status; +} + +int asCContext::SetLineCallback(asSFuncPtr callback, void *obj, int callConv) +{ + lineCallback = true; + regs.doProcessSuspend = true; + lineCallbackObj = obj; + bool isObj = false; + if( (unsigned)callConv == asCALL_GENERIC ) + { + lineCallback = false; + regs.doProcessSuspend = doSuspend; + return asNOT_SUPPORTED; + } + if( (unsigned)callConv >= asCALL_THISCALL ) + { + isObj = true; + if( obj == 0 ) + { + lineCallback = false; + regs.doProcessSuspend = doSuspend; + return asINVALID_ARG; + } + } + + int r = DetectCallingConvention(isObj, callback, callConv, &lineCallbackFunc); + if( r < 0 ) lineCallback = false; + + regs.doProcessSuspend = doSuspend || lineCallback; + + return r; +} + +void asCContext::CallLineCallback() +{ + if( lineCallbackFunc.callConv < ICC_THISCALL ) + engine->CallGlobalFunction(this, lineCallbackObj, &lineCallbackFunc, 0); + else + engine->CallObjectMethod(lineCallbackObj, this, &lineCallbackFunc, 0); +} + +int asCContext::SetExceptionCallback(asSFuncPtr callback, void *obj, int callConv) +{ + exceptionCallback = true; + exceptionCallbackObj = obj; + bool isObj = false; + if( (unsigned)callConv == asCALL_GENERIC ) + return asNOT_SUPPORTED; + if( (unsigned)callConv >= asCALL_THISCALL ) + { + isObj = true; + if( obj == 0 ) + { + exceptionCallback = false; + return asINVALID_ARG; + } + } + int r = DetectCallingConvention(isObj, callback, callConv, &exceptionCallbackFunc); + if( r < 0 ) exceptionCallback = false; + return r; +} + +void asCContext::CallExceptionCallback() +{ + if( exceptionCallbackFunc.callConv < ICC_THISCALL ) + engine->CallGlobalFunction(this, exceptionCallbackObj, &exceptionCallbackFunc, 0); + else + engine->CallObjectMethod(exceptionCallbackObj, this, &exceptionCallbackFunc, 0); +} + +void asCContext::ClearLineCallback() +{ + lineCallback = false; + regs.doProcessSuspend = doSuspend; +} + +void asCContext::ClearExceptionCallback() +{ + exceptionCallback = false; +} + +int asCContext::CallGeneric(int id, void *objectPointer) +{ + asCScriptFunction *sysFunction = engine->scriptFunctions[id]; + asSSystemFunctionInterface *sysFunc = sysFunction->sysFuncIntf; + void (*func)(asIScriptGeneric*) = (void (*)(asIScriptGeneric*))sysFunc->func; + int popSize = sysFunc->paramSize; + asDWORD *args = regs.stackPointer; + + // Verify the object pointer if it is a class method + void *currentObject = 0; + if( sysFunc->callConv == ICC_GENERIC_METHOD ) + { + if( objectPointer ) + { + currentObject = objectPointer; + + // Don't increase the reference of this pointer + // since it will not have been constructed yet + } + else + { + // The object pointer should be popped from the context stack + popSize += AS_PTR_SIZE; + + // Check for null pointer + currentObject = (void*)*(size_t*)(args); + if( currentObject == 0 ) + { + SetInternalException(TXT_NULL_POINTER_ACCESS); + return 0; + } + + // Add the base offset for multiple inheritance + currentObject = (void*)(size_t(currentObject) + sysFunc->baseOffset); + + // Skip object pointer + args += AS_PTR_SIZE; + } + } + + asCGeneric gen(engine, sysFunction, currentObject, args); + + isCallingSystemFunction = true; + func(&gen); + isCallingSystemFunction = false; + + regs.valueRegister = gen.returnVal; + regs.objectRegister = gen.objectRegister; + regs.objectType = sysFunction->returnType.GetObjectType(); + + // Clean up function parameters + int offset = 0; + for( asUINT n = 0; n < sysFunction->parameterTypes.GetLength(); n++ ) + { + if( sysFunction->parameterTypes[n].IsObject() && !sysFunction->parameterTypes[n].IsReference() ) + { + void *obj = *(void**)&args[offset]; + if( obj ) + { + // Release the object + asSTypeBehaviour *beh = &sysFunction->parameterTypes[n].GetObjectType()->beh; + if( beh->release ) + engine->CallObjectMethod(obj, beh->release); + else + { + // Call the destructor then free the memory + if( beh->destruct ) + engine->CallObjectMethod(obj, beh->destruct); + + engine->CallFree(obj); + } + } + } + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + } + + // Return how much should be popped from the stack + return popSize; +} + +int asCContext::GetVarCount(int stackLevel) +{ + if( stackLevel < -1 || stackLevel >= GetCallstackSize() ) return asINVALID_ARG; + + asCScriptFunction *func; + if( stackLevel == -1 ) + func = currentFunction; + else + { + size_t *s = callStack.AddressOf() + stackLevel*CALLSTACK_FRAME_SIZE; + func = (asCScriptFunction*)s[1]; + } + + if( func == 0 ) + return asERROR; + + return (int)func->variables.GetLength(); +} + +const char *asCContext::GetVarName(int varIndex, int stackLevel) +{ + if( stackLevel < -1 || stackLevel >= GetCallstackSize() ) return 0; + + asCScriptFunction *func; + if( stackLevel == -1 ) + func = currentFunction; + else + { + size_t *s = callStack.AddressOf() + stackLevel*CALLSTACK_FRAME_SIZE; + func = (asCScriptFunction*)s[1]; + } + + if( func == 0 ) + return 0; + + if( varIndex < 0 || varIndex >= (signed)func->variables.GetLength() ) + return 0; + + return func->variables[varIndex]->name.AddressOf(); +} + +const char *asCContext::GetVarDeclaration(int varIndex, int stackLevel) +{ + if( stackLevel < -1 || stackLevel >= GetCallstackSize() ) return 0; + + asCScriptFunction *func; + if( stackLevel == -1 ) + func = currentFunction; + else + { + size_t *s = callStack.AddressOf() + stackLevel*CALLSTACK_FRAME_SIZE; + func = (asCScriptFunction*)s[1]; + } + + if( func == 0 ) + return 0; + + if( varIndex < 0 || varIndex >= (signed)func->variables.GetLength() ) + return 0; + + asASSERT(threadManager); + asCString *tempString = &threadManager->GetLocalData()->string; + *tempString = func->variables[varIndex]->type.Format(); + *tempString += " " + func->variables[varIndex]->name; + + return tempString->AddressOf(); +} + +int asCContext::GetVarTypeId(int varIndex, int stackLevel) +{ + if( stackLevel < -1 || stackLevel >= GetCallstackSize() ) return asINVALID_ARG; + + asCScriptFunction *func; + if( stackLevel == -1 ) + func = currentFunction; + else + { + size_t *s = callStack.AddressOf() + stackLevel*CALLSTACK_FRAME_SIZE; + func = (asCScriptFunction*)s[1]; + } + + if( func == 0 ) + return asINVALID_ARG; + + if( varIndex < 0 || varIndex >= (signed)func->variables.GetLength() ) + return asINVALID_ARG; + + return engine->GetTypeIdFromDataType(func->variables[varIndex]->type); +} + +void *asCContext::GetAddressOfVar(int varIndex, int stackLevel) +{ + if( stackLevel < -1 || stackLevel >= GetCallstackSize() ) return 0; + + asCScriptFunction *func; + asDWORD *sf; + if( stackLevel == -1 ) + { + func = currentFunction; + sf = regs.stackFramePointer; + } + else + { + size_t *s = callStack.AddressOf() + stackLevel*CALLSTACK_FRAME_SIZE; + func = (asCScriptFunction*)s[1]; + sf = (asDWORD*)s[0]; + } + + if( func == 0 ) + return 0; + + if( varIndex < 0 || varIndex >= (signed)func->variables.GetLength() ) + return 0; + + // For object variables it's necessary to dereference the pointer to get the address of the value + if( func->variables[varIndex]->type.IsObject() && !func->variables[varIndex]->type.IsObjectHandle() ) + return *(void**)(sf - func->variables[varIndex]->stackOffset); + + return sf - func->variables[varIndex]->stackOffset; +} + +// returns the typeId of the 'this' object at the given call stack level (-1 for current) +// returns 0 if the function call at the given stack level is not a method +int asCContext::GetThisTypeId(int stackLevel) +{ + if( stackLevel < -1 || stackLevel >= GetCallstackSize() ) + return 0; + + asCScriptFunction *func = 0; + if( stackLevel == -1 ) + { + func = currentFunction; + } + else + { + size_t *s = callStack.AddressOf() + stackLevel*CALLSTACK_FRAME_SIZE; + func = (asCScriptFunction*)s[1]; + } + + if( func == 0 ) + return 0; + + if( func->objectType == 0 ) + return 0; // not in a method + + // create a datatype + asCDataType dt = asCDataType::CreateObject( func->objectType, false); + + // return a typeId from the data type + return engine->GetTypeIdFromDataType( dt ); +} + +// returns the 'this' object pointer at the given call stack level (-1 for current) +// returns 0 if the function call at the given stack level is not a method +void *asCContext::GetThisPointer(int stackLevel) +{ + if( stackLevel < -1 || stackLevel >= GetCallstackSize() ) + return 0; + + asCScriptFunction *func; + asDWORD *sf; + if( stackLevel == -1 ) + { + func = currentFunction; + sf = regs.stackFramePointer; + } + else + { + size_t *s = callStack.AddressOf() + stackLevel*CALLSTACK_FRAME_SIZE; + func = (asCScriptFunction*)s[1]; + sf = (asDWORD*)s[0]; + } + + if( func == 0 ) + return 0; + + if( func->objectType == 0 ) + return 0; // not in a method + + void *thisPointer = (void*)*(size_t*)(sf); + if( thisPointer == 0 ) + { + return 0; + } + + // NOTE: this returns the pointer to the 'this' while the GetVarPointer functions return + // a pointer to a pointer. I can't imagine someone would want to change the 'this' + return thisPointer; +} + +END_AS_NAMESPACE + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_context.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_context.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_context.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_context.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,210 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_context.h +// +// This class handles the execution of the byte code +// + + +#ifndef AS_CONTEXT_H +#define AS_CONTEXT_H + +#include "as_config.h" +#include "as_atomic.h" +#include "as_array.h" +#include "as_string.h" +#include "as_objecttype.h" +#include "as_callfunc.h" + +BEGIN_AS_NAMESPACE + +class asCScriptFunction; +class asCScriptEngine; + +// TODO: The context should be renamed to something that better describes it, e.g. asIVirtualMachine, asIExecuter, asIProcessor, asIScriptThread, or something like that + +class asCContext : public asIScriptContext +{ +public: + // From asIScriptContext + int AddRef(); + int Release(); + + asIScriptEngine *GetEngine(); + + asEContextState GetState(); + + int Prepare(int functionID); + int Unprepare(); + + int SetArgByte(asUINT arg, asBYTE value); + int SetArgWord(asUINT arg, asWORD value); + int SetArgDWord(asUINT arg, asDWORD value); + int SetArgQWord(asUINT arg, asQWORD value); + int SetArgFloat(asUINT arg, float value); + int SetArgDouble(asUINT arg, double value); + int SetArgAddress(asUINT arg, void *addr); + int SetArgObject(asUINT arg, void *obj); + void *GetAddressOfArg(asUINT arg); + + int SetObject(void *obj); + + asBYTE GetReturnByte(); + asWORD GetReturnWord(); + asDWORD GetReturnDWord(); + asQWORD GetReturnQWord(); + float GetReturnFloat(); + double GetReturnDouble(); + void *GetReturnAddress(); + void *GetReturnObject(); + void *GetAddressOfReturnValue(); + + int Execute(); + int Abort(); + int Suspend(); + + int GetCurrentLineNumber(int *column); + int GetCurrentFunction(); + + int SetException(const char *descr); + int GetExceptionLineNumber(int *column); + int GetExceptionFunction(); + const char *GetExceptionString(); + + int SetLineCallback(asSFuncPtr callback, void *obj, int callConv); + void ClearLineCallback(); + int SetExceptionCallback(asSFuncPtr callback, void *obj, int callConv); + void ClearExceptionCallback(); + + int GetCallstackSize(); + int GetCallstackFunction(int index); + int GetCallstackLineNumber(int index, int *column); + + int GetVarCount(int stackLevel); + const char *GetVarName(int varIndex, int stackLevel); + const char *GetVarDeclaration(int varIndex, int stackLevel); + int GetVarTypeId(int varIndex, int stackLevel); + void *GetAddressOfVar(int varIndex, int stackLevel); + int GetThisTypeId(int stackLevel); + void *GetThisPointer(int stackLevel); + + void *SetUserData(void *data); + void *GetUserData(); + +public: + // Internal public functions + asCContext(asCScriptEngine *engine, bool holdRef); + virtual ~asCContext(); + +#ifdef AS_DEPRECATED +// Deprecated since 2009-12-08, 2.18.0 + int SetExecuteStringFunction(asCScriptFunction *func); +#endif + +//protected: + friend class asCScriptEngine; + + void CallLineCallback(); + void CallExceptionCallback(); + + int CallGeneric(int funcID, void *objectPointer); + + void DetachEngine(); + + void ExecuteNext(); + void CleanStack(); + void CleanStackFrame(); + void CleanReturnObject(); + + void PushCallState(); + void PopCallState(); + void CallScriptFunction(asCScriptFunction *func); + void CallInterfaceMethod(asCScriptFunction *func); + + void SetInternalException(const char *descr); + + // Must be protected for multiple accesses + asCAtomic refCount; + + bool holdEngineRef; + asCScriptEngine *engine; + + asEContextState status; + bool doSuspend; + bool doAbort; + bool externalSuspendRequest; + bool isCallingSystemFunction; + + asCScriptFunction *currentFunction; + bool isStackMemoryNotAllocated; + + asCArray callStack; + asCArray stackBlocks; + int stackBlockSize; + int stackIndex; + + bool inExceptionHandler; + asCString exceptionString; + int exceptionFunction; + int exceptionLine; + int exceptionColumn; + + int returnValueSize; + int argumentsSize; + +#ifdef AS_DEPRECATED +// Deprecated since 2009-12-08, 2.18.0 + // String function + asCScriptFunction *stringFunction; +#endif + + asCScriptFunction *initialFunction; + + // callbacks + bool lineCallback; + asSSystemFunctionInterface lineCallbackFunc; + void *lineCallbackObj; + + bool exceptionCallback; + asSSystemFunctionInterface exceptionCallbackFunc; + void *exceptionCallbackObj; + + void *userData; + + // Registers available to JIT compiler functions + asSVMRegisters regs; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_criticalsection.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_criticalsection.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_criticalsection.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_criticalsection.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,107 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2008 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + + +// +// as_criticalsection.h +// +// Classes for multi threading support +// + +#ifndef AS_CRITICALSECTION_H +#define AS_CRITICALSECTION_H + +#include "as_config.h" + +BEGIN_AS_NAMESPACE + +#ifdef AS_NO_THREADS + +#define DECLARECRITICALSECTION(x) +#define ENTERCRITICALSECTION(x) +#define LEAVECRITICALSECTION(x) + +#else + +#define DECLARECRITICALSECTION(x) asCThreadCriticalSection x +#define ENTERCRITICALSECTION(x) x.Enter() +#define LEAVECRITICALSECTION(x) x.Leave() + +#ifdef AS_POSIX_THREADS + +END_AS_NAMESPACE +#include +BEGIN_AS_NAMESPACE + +class asCThreadCriticalSection +{ +public: + asCThreadCriticalSection(); + ~asCThreadCriticalSection(); + + void Enter(); + void Leave(); + +protected: + pthread_mutex_t criticalSection; +}; + +#elif defined(AS_WINDOWS_THREADS) + +END_AS_NAMESPACE +#define WIN32_LEAN_AND_MEAN +#include +BEGIN_AS_NAMESPACE + +// Undefine macros that cause problems in our code +#undef GetObject + +class asCThreadCriticalSection +{ +public: + asCThreadCriticalSection(); + ~asCThreadCriticalSection(); + + void Enter(); + void Leave(); + +protected: + CRITICAL_SECTION criticalSection; +}; + +#endif + +#endif + +END_AS_NAMESPACE + +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_datatype.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_datatype.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_datatype.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_datatype.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,566 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_datatype.cpp +// +// This class describes the datatype for expressions during compilation +// + +#include "as_config.h" +#include "as_datatype.h" +#include "as_tokendef.h" +#include "as_objecttype.h" +#include "as_scriptengine.h" +#include "as_arrayobject.h" +#include "as_tokenizer.h" + +BEGIN_AS_NAMESPACE + +asCDataType::asCDataType() +{ + tokenType = ttUnrecognizedToken; + objectType = 0; + isReference = false; + isReadOnly = false; + isObjectHandle = false; + isConstHandle = false; +} + +asCDataType::asCDataType(const asCDataType &dt) +{ + tokenType = dt.tokenType; + objectType = dt.objectType; + isReference = dt.isReference; + isReadOnly = dt.isReadOnly; + isObjectHandle = dt.isObjectHandle; + isConstHandle = dt.isConstHandle; +} + +asCDataType::~asCDataType() +{ +} + +asCDataType asCDataType::CreateObject(asCObjectType *ot, bool isConst) +{ + asCDataType dt; + + dt.tokenType = ttIdentifier; + dt.objectType = ot; + dt.isReadOnly = isConst; + + return dt; +} + +asCDataType asCDataType::CreateObjectHandle(asCObjectType *ot, bool isConst) +{ + asCDataType dt; + + dt.tokenType = ttIdentifier; + dt.objectType = ot; + dt.isObjectHandle = true; + dt.isConstHandle = isConst; + + return dt; +} + +asCDataType asCDataType::CreatePrimitive(eTokenType tt, bool isConst) +{ + asCDataType dt; + + dt.tokenType = tt; + dt.isReadOnly = isConst; + + return dt; +} + +asCDataType asCDataType::CreateDefaultArray(asCScriptEngine *engine) +{ + asCDataType dt; + + // _builtin_array_ represents the default array + dt.objectType = engine->defaultArrayObjectType; + dt.tokenType = ttIdentifier; + + return dt; +} + +asCDataType asCDataType::CreateNullHandle() +{ + asCDataType dt; + + dt.tokenType = ttUnrecognizedToken; + dt.isReadOnly = true; + dt.isObjectHandle = true; + dt.isConstHandle = true; + + return dt; +} + +bool asCDataType::IsNullHandle() const +{ + if( tokenType == ttUnrecognizedToken && + objectType == 0 && + isObjectHandle ) + return true; + + return false; +} + +asCString asCDataType::Format() const +{ + if( IsNullHandle() ) + return ""; + + asCString str; + + if( isReadOnly ) + str = "const "; + + if( tokenType != ttIdentifier ) + { + str += asGetTokenDefinition(tokenType); + } + else if( IsArrayType() ) + { + str += objectType->templateSubType.Format(); + str += "[]"; + } + else if( objectType ) + { + str += objectType->name; + if( objectType->flags & asOBJ_TEMPLATE ) + { + str += "<"; + str += objectType->templateSubType.Format(); + str += ">"; + } + } + else + { + str = ""; + } + + if( isObjectHandle ) + { + str += "@"; + if( isConstHandle ) + str += "const"; + } + + if( isReference ) + str += "&"; + + return str; +} + + +asCDataType &asCDataType::operator =(const asCDataType &dt) +{ + tokenType = dt.tokenType; + isReference = dt.isReference; + objectType = dt.objectType; + isReadOnly = dt.isReadOnly; + isObjectHandle = dt.isObjectHandle; + isConstHandle = dt.isConstHandle; + + return (asCDataType &)*this; +} + +int asCDataType::MakeHandle(bool b, bool acceptHandleForScope) +{ + if( !b ) + { + isObjectHandle = b; + isConstHandle = false; + } + else if( b && !isObjectHandle ) + { + // Only reference types are allowed to be handles, + // but not nohandle reference types, and not scoped references (except when returned from registered function) + if( !objectType || + !((objectType->flags & asOBJ_REF) || (objectType->flags & asOBJ_TEMPLATE_SUBTYPE)) || + (objectType->flags & asOBJ_NOHANDLE) || + ((objectType->flags & asOBJ_SCOPED) && !acceptHandleForScope) ) + return -1; + + isObjectHandle = b; + isConstHandle = false; + } + + return 0; +} + +int asCDataType::MakeArray(asCScriptEngine *engine) +{ + bool tmpIsReadOnly = isReadOnly; + isReadOnly = false; + asCObjectType *at = engine->GetTemplateInstanceType(engine->defaultArrayObjectType, *this); + isReadOnly = tmpIsReadOnly; + + isObjectHandle = false; + isConstHandle = false; + + objectType = at; + tokenType = ttIdentifier; + + return 0; +} + +int asCDataType::MakeReference(bool b) +{ + isReference = b; + + return 0; +} + +int asCDataType::MakeReadOnly(bool b) +{ + if( isObjectHandle ) + { + isConstHandle = b; + return 0; + } + + isReadOnly = b; + return 0; +} + +int asCDataType::MakeHandleToConst(bool b) +{ + if( !isObjectHandle ) return -1; + + isReadOnly = b; + return 0; +} + +bool asCDataType::SupportHandles() const +{ + if( objectType && + (objectType->flags & asOBJ_REF) && + !(objectType->flags & asOBJ_NOHANDLE) && + !isObjectHandle ) + return true; + + return false; +} + +bool asCDataType::CanBeInstanciated() const +{ + if( GetSizeOnStackDWords() == 0 || + (IsObject() && + (objectType->flags & asOBJ_REF) && // It's a ref type and + ((objectType->flags & asOBJ_NOHANDLE) || // the ref type doesn't support handles or + (!IsObjectHandle() && // it's not a handle and + objectType->beh.factories.GetLength() == 0))) ) // the ref type cannot be instanciated + return false; + + return true; +} + +bool asCDataType::CanBeCopied() const +{ + // All primitives can be copied + if( IsPrimitive() ) return true; + + // Plain-old-data structures can always be copied + if( objectType->flags & asOBJ_POD ) return true; + + // It must be possible to instanciate the type + if( !CanBeInstanciated() ) return false; + + // It must have a default constructor or factory + if( objectType->beh.construct == 0 && + objectType->beh.factory == 0 ) return false; + + // It must be possible to copy the type + if( objectType->beh.copy == 0 ) return false; + + return true; +} + +bool asCDataType::IsReadOnly() const +{ + if( isObjectHandle ) + return isConstHandle; + + return isReadOnly; +} + +bool asCDataType::IsHandleToConst() const +{ + if( !isObjectHandle ) return false; + return isReadOnly; +} + +bool asCDataType::IsArrayType() const +{ + return objectType ? (objectType->name == objectType->engine->defaultArrayObjectType->name) : false; +} + +bool asCDataType::IsTemplate() const +{ + if( objectType && (objectType->flags & asOBJ_TEMPLATE) ) + return true; + + return false; +} + +bool asCDataType::IsScriptObject() const +{ + if( objectType && (objectType->flags & asOBJ_SCRIPT_OBJECT) ) + return true; + + return false; +} + +asCDataType asCDataType::GetSubType() const +{ + asASSERT(objectType); + return objectType->templateSubType; +} + + +bool asCDataType::operator !=(const asCDataType &dt) const +{ + return !(*this == dt); +} + +bool asCDataType::operator ==(const asCDataType &dt) const +{ + if( !IsEqualExceptRefAndConst(dt) ) return false; + if( isReference != dt.isReference ) return false; + if( isReadOnly != dt.isReadOnly ) return false; + if( isConstHandle != dt.isConstHandle ) return false; + + return true; +} + +bool asCDataType::IsEqualExceptRef(const asCDataType &dt) const +{ + if( !IsEqualExceptRefAndConst(dt) ) return false; + if( isReadOnly != dt.isReadOnly ) return false; + if( isConstHandle != dt.isConstHandle ) return false; + + return true; +} + +bool asCDataType::IsEqualExceptRefAndConst(const asCDataType &dt) const +{ + // Check base type + if( tokenType != dt.tokenType ) return false; + if( objectType != dt.objectType ) return false; + if( isObjectHandle != dt.isObjectHandle ) return false; + if( isObjectHandle ) + if( isReadOnly != dt.isReadOnly ) return false; + + return true; +} + +bool asCDataType::IsEqualExceptConst(const asCDataType &dt) const +{ + if( !IsEqualExceptRefAndConst(dt) ) return false; + if( isReference != dt.isReference ) return false; + + return true; +} + +bool asCDataType::IsEqualExceptInterfaceType(const asCDataType &dt) const +{ + if( tokenType != dt.tokenType ) return false; + if( isReference != dt.isReference ) return false; + if( isObjectHandle != dt.isObjectHandle ) return false; + if( isReadOnly != dt.isReadOnly ) return false; + if( isConstHandle != dt.isConstHandle ) return false; + + if( objectType != dt.objectType ) + { + if( !objectType || !dt.objectType ) return false; + if( !objectType->IsInterface() || !dt.objectType->IsInterface() ) return false; + } + + return true; +} + +bool asCDataType::IsPrimitive() const +{ + // Enumerations are primitives + if( IsEnumType() ) + return true; + + // A registered object is never a primitive neither is a pointer, nor an array + if( objectType ) + return false; + + // Null handle doesn't have an objectType, but it is not a primitive + if( tokenType == ttUnrecognizedToken ) + return false; + + return true; +} + +bool asCDataType::IsSamePrimitiveBaseType(const asCDataType &dt) const +{ + if( !IsPrimitive() || !dt.IsPrimitive() ) return false; + + if( IsIntegerType() && dt.IsIntegerType() ) return true; + if( IsUnsignedType() && dt.IsUnsignedType() ) return true; + if( IsFloatType() && dt.IsFloatType() ) return true; + if( IsDoubleType() && dt.IsDoubleType() ) return true; + if( IsBooleanType() && dt.IsBooleanType() ) return true; + if( IsFloatType() && dt.IsDoubleType() ) return true; + if( IsDoubleType() && dt.IsFloatType() ) return true; + + return false; +} + +bool asCDataType::IsIntegerType() const +{ + if( tokenType == ttInt || + tokenType == ttInt8 || + tokenType == ttInt16 || + tokenType == ttInt64 ) + return true; + + return false; +} + +bool asCDataType::IsUnsignedType() const +{ + if( tokenType == ttUInt || + tokenType == ttUInt8 || + tokenType == ttUInt16 || + tokenType == ttUInt64 ) + return true; + + return false; +} + +bool asCDataType::IsFloatType() const +{ + if( tokenType == ttFloat ) + return true; + + return false; +} + +bool asCDataType::IsDoubleType() const +{ + if( tokenType == ttDouble ) + return true; + + return false; +} + +bool asCDataType::IsBooleanType() const +{ + if( tokenType == ttBool ) + return true; + + return false; +} + +bool asCDataType::IsObject() const +{ + // Enumerations are not objects, even though they are described with an objectType. + if( IsEnumType() ) + return false; + + if( objectType ) return true; + + return false; +} + +int asCDataType::GetSizeInMemoryBytes() const +{ + if( objectType != 0 ) + return objectType->size; + + if( tokenType == ttVoid ) + return 0; + + if( tokenType == ttInt8 || + tokenType == ttUInt8 ) + return 1; + + if( tokenType == ttInt16 || + tokenType == ttUInt16 ) + return 2; + + if( tokenType == ttDouble || + tokenType == ttInt64 || + tokenType == ttUInt64 ) + return 8; + + if( tokenType == ttBool ) + return AS_SIZEOF_BOOL; + + // null handle + if( tokenType == ttUnrecognizedToken ) + return 4*AS_PTR_SIZE; + + return 4; +} + +int asCDataType::GetSizeInMemoryDWords() const +{ + int s = GetSizeInMemoryBytes(); + if( s == 0 ) return 0; + if( s <= 4 ) return 1; + + return s/4; +} + +int asCDataType::GetSizeOnStackDWords() const +{ + int size = tokenType == ttQuestion ? 1 : 0; + + if( isReference ) return AS_PTR_SIZE + size; + if( objectType ) return AS_PTR_SIZE + size; + + return GetSizeInMemoryDWords() + size; +} + +asSTypeBehaviour *asCDataType::GetBehaviour() const +{ + return objectType ? &objectType->beh : 0; +} + +bool asCDataType::IsEnumType() const +{ + if( objectType && (objectType->flags & asOBJ_ENUM) ) + return true; + + return false; +} + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_datatype.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_datatype.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_datatype.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_datatype.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,135 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_datatype.h +// +// This class describes the datatype for expressions during compilation +// + + + +#ifndef AS_DATATYPE_H +#define AS_DATATYPE_H + +#include "as_tokendef.h" +#include "as_string.h" + +BEGIN_AS_NAMESPACE + +struct asSTypeBehaviour; +class asCScriptEngine; +class asCObjectType; + +class asCDataType +{ +public: + asCDataType(); + asCDataType(const asCDataType &); + ~asCDataType(); + + asCString Format() const; + + static asCDataType CreatePrimitive(eTokenType tt, bool isConst); + static asCDataType CreateObject(asCObjectType *ot, bool isConst); + static asCDataType CreateObjectHandle(asCObjectType *ot, bool isConst); + static asCDataType CreateDefaultArray(asCScriptEngine *engine); + static asCDataType CreateNullHandle(); + + int MakeHandle(bool b, bool acceptHandleForScope = false); + int MakeArray(asCScriptEngine *engine); + int MakeReference(bool b); + int MakeReadOnly(bool b); + int MakeHandleToConst(bool b); + + bool IsTemplate() const; + bool IsScriptObject() const; + bool IsPrimitive() const; + bool IsObject() const; + bool IsReference() const {return isReference;} + bool IsReadOnly() const; + bool IsIntegerType() const; + bool IsUnsignedType() const; + bool IsFloatType() const; + bool IsDoubleType() const; + bool IsBooleanType() const; + bool IsObjectHandle() const {return isObjectHandle;} + bool IsHandleToConst() const; + bool IsArrayType() const; + bool IsEnumType() const; + + bool IsSamePrimitiveBaseType(const asCDataType &dt) const; + bool IsEqualExceptRef(const asCDataType &) const; + bool IsEqualExceptRefAndConst(const asCDataType &) const; + bool IsEqualExceptConst(const asCDataType &) const; + bool IsEqualExceptInterfaceType(const asCDataType &dt) const; + bool IsNullHandle() const; + + bool SupportHandles() const; + bool CanBeInstanciated() const; + bool CanBeCopied() const; + + bool operator ==(const asCDataType &) const; + bool operator !=(const asCDataType &) const; + + asCDataType GetSubType() const; + eTokenType GetTokenType() const {return tokenType;} + asCObjectType *GetObjectType() const {return objectType;} + + int GetSizeOnStackDWords() const; + int GetSizeInMemoryBytes() const; + int GetSizeInMemoryDWords() const; + + void SetTokenType(eTokenType tt) {tokenType = tt;} + void SetObjectType(asCObjectType *obj) {objectType = obj;} + + asCDataType &operator =(const asCDataType &); + + asSTypeBehaviour *GetBehaviour() const; + +protected: + // Base object type + eTokenType tokenType; + + // Behaviour type + asCObjectType *objectType; + + // Top level + bool isReference:1; + bool isReadOnly:1; + bool isObjectHandle:1; + bool isConstHandle:1; + char dummy:4; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_debug.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_debug.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_debug.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_debug.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,59 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2007 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_debug.h +// + +#ifndef AS_DEBUG_H +#define AS_DEBUG_H + +#ifndef AS_WII +// The Wii SDK doesn't have these, we'll survive without AS_DEBUG + +#ifndef _WIN32_WCE +// Neither does WinCE + + +#if defined(__GNUC__) +// Define mkdir for GNUC +#include +#include +#define _mkdir(dirname) mkdir(dirname, S_IRWXU) +#else +#include +#endif +#endif +#endif + +#endif + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_gc.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_gc.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_gc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_gc.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,536 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_gc.cpp +// +// The implementation of the garbage collector +// + + +#include + +#include "as_gc.h" +#include "as_scriptengine.h" +#include "as_scriptobject.h" + +BEGIN_AS_NAMESPACE + +asCGarbageCollector::asCGarbageCollector() +{ + engine = 0; + detectState = clearCounters_init; + destroyState = destroyGarbage_init; + numDestroyed = 0; + numDetected = 0; +} + +void asCGarbageCollector::AddScriptObjectToGC(void *obj, asCObjectType *objType) +{ + engine->CallObjectMethod(obj, objType->beh.addref); + asSObjTypePair ot = {obj, objType}; + + // Add the data to the gcObjects array in a critical section as + // another thread might be calling this method at the same time + ENTERCRITICALSECTION(gcCritical); + gcObjects.PushLast(ot); + LEAVECRITICALSECTION(gcCritical); +} + +int asCGarbageCollector::GarbageCollect(asDWORD flags) +{ + // The application is responsible for making sure + // the gc is only executed by one thread at a time. + + bool doDetect = (flags & asGC_DETECT_GARBAGE) || !(flags & asGC_DESTROY_GARBAGE); + bool doDestroy = (flags & asGC_DESTROY_GARBAGE) || !(flags & asGC_DETECT_GARBAGE); + + if( flags & asGC_FULL_CYCLE ) + { + // Reset the state + if( doDetect ) + detectState = clearCounters_init; + if( doDestroy ) + destroyState = destroyGarbage_init; + + int r = 1; + unsigned int count = (unsigned int)gcObjects.GetLength(); + for(;;) + { + // Detect all garbage with cyclic references + if( doDetect ) + while( (r = IdentifyGarbageWithCyclicRefs()) == 1 ); + + // Now destroy all known garbage + if( doDestroy ) + while( (r = DestroyGarbage()) == 1 ); + + // Run another iteration if any garbage was destroyed + if( count != gcObjects.GetLength() ) + count = (unsigned int)gcObjects.GetLength(); + else + break; + } + + // Take the opportunity to clear unused types as well + engine->ClearUnusedTypes(); + + return 0; + } + else + { + // Destroy the garbage that we know of + if( doDestroy ) + DestroyGarbage(); + + // Run another incremental step of the identification of cyclic references + if( doDetect ) + IdentifyGarbageWithCyclicRefs(); + } + + // Return 1 to indicate that the cycle wasn't finished + return 1; +} + +void asCGarbageCollector::GetStatistics(asUINT *currentSize, asUINT *totalDestroyed, asUINT *totalDetected) +{ + // It's not necessary to protect this access, as + // it doesn't matter if another thread is currently + // appending a new object. + if( currentSize ) + *currentSize = (asUINT)gcObjects.GetLength(); + + if( totalDestroyed ) + *totalDestroyed = numDestroyed; + + if( totalDetected ) + *totalDetected = numDetected; +} + +void asCGarbageCollector::ClearMap() +{ + // Decrease reference counter for all objects removed from the map + asSMapNode *cursor = 0; + gcMap.MoveFirst(&cursor); + while( cursor ) + { + void *obj = gcMap.GetKey(cursor); + asSIntTypePair it = gcMap.GetValue(cursor); + + engine->CallObjectMethod(obj, it.type->beh.release); + + gcMap.MoveNext(&cursor, cursor); + } + + gcMap.EraseAll(); +} + +asCGarbageCollector::asSObjTypePair asCGarbageCollector::GetObjectAtIdx(int idx) +{ + // We need to protect this access with a critical section as + // another thread might be appending an object at the same time + ENTERCRITICALSECTION(gcCritical); + asSObjTypePair gcObj = gcObjects[idx]; + LEAVECRITICALSECTION(gcCritical); + + return gcObj; +} + +void asCGarbageCollector::RemoveObjectAtIdx(int idx) +{ + // We need to protect this update with a critical section as + // another thread might be appending an object at the same time + ENTERCRITICALSECTION(gcCritical); + if( idx == (int)gcObjects.GetLength() - 1) + gcObjects.PopLast(); + else + gcObjects[idx] = gcObjects.PopLast(); + LEAVECRITICALSECTION(gcCritical); +} + +int asCGarbageCollector::DestroyGarbage() +{ + for(;;) + { + switch( destroyState ) + { + case destroyGarbage_init: + { + // If there are no objects to be freed then don't start + if( gcObjects.GetLength() == 0 ) + return 0; + + destroyIdx = (asUINT)-1; + destroyState = destroyGarbage_loop; + } + break; + + case destroyGarbage_loop: + case destroyGarbage_haveMore: + { + // If the refCount has reached 1, then only the GC still holds a + // reference to the object, thus we don't need to worry about the + // application touching the objects during collection. + + // Destroy all objects that have refCount == 1. If any objects are + // destroyed, go over the list again, because it may have made more + // objects reach refCount == 1. + while( ++destroyIdx < gcObjects.GetLength() ) + { + asSObjTypePair gcObj = GetObjectAtIdx(destroyIdx); + if( engine->CallObjectMethodRetInt(gcObj.obj, gcObj.type->beh.gcGetRefCount) == 1 ) + { + // Release the object immediately + + // Make sure the refCount is really 0, because the + // destructor may have increased the refCount again. + bool addRef = false; + if( gcObj.type->flags & asOBJ_SCRIPT_OBJECT ) + { + // Script objects may actually be resurrected in the destructor + int refCount = ((asCScriptObject*)gcObj.obj)->Release(); + if( refCount > 0 ) addRef = true; + } + else + engine->CallObjectMethod(gcObj.obj, gcObj.type->beh.release); + + // Was the object really destroyed? + if( !addRef ) + { + numDestroyed++; + RemoveObjectAtIdx(destroyIdx); + destroyIdx--; + } + else + { + // Since the object was resurrected in the + // destructor, we must add our reference again + engine->CallObjectMethod(gcObj.obj, gcObj.type->beh.addref); + } + + destroyState = destroyGarbage_haveMore; + + // Allow the application to work a little + return 1; + } + } + + // Only move to the next step if no garbage was detected in this step + if( destroyState == destroyGarbage_haveMore ) + destroyState = destroyGarbage_init; + else + return 0; + } + break; + } + } + + // Shouldn't reach this point + UNREACHABLE_RETURN; +} + +int asCGarbageCollector::IdentifyGarbageWithCyclicRefs() +{ + for(;;) + { + switch( detectState ) + { + case clearCounters_init: + { + ClearMap(); + detectState = clearCounters_loop; + detectIdx = 0; + } + break; + + case clearCounters_loop: + { + // Build a map of objects that will be checked, the map will + // hold the object pointer as key, and the gcCount and the + // object's type as value. As objects are added to the map the + // gcFlag must be set in the objects, so we can be verify if + // the object is accessed during the GC cycle. + + // If an object is removed from the gcObjects list during the + // iteration of this step, it is possible that an object won't + // be used during the analyzing for cyclic references. This + // isn't a problem, as the next time the GC cycle starts the + // object will be verified. + while( detectIdx < gcObjects.GetLength() ) + { + // Add the gc count for this object + asSObjTypePair gcObj = GetObjectAtIdx(detectIdx); + int refCount = engine->CallObjectMethodRetInt(gcObj.obj, gcObj.type->beh.gcGetRefCount); + if( refCount > 1 ) + { + asSIntTypePair it = {refCount-1, gcObj.type}; + gcMap.Insert(gcObj.obj, it); + + // Increment the object's reference counter when putting it in the map + engine->CallObjectMethod(gcObj.obj, gcObj.type->beh.addref); + + // Mark the object so that we can + // see if it has changed since read + engine->CallObjectMethod(gcObj.obj, gcObj.type->beh.gcSetFlag); + + detectIdx++; + + // Let the application work a little + return 1; + } + else + detectIdx++; + } + + detectState = countReferences_init; + } + break; + + case countReferences_init: + { + detectIdx = (asUINT)-1; + gcMap.MoveFirst(&gcMapCursor); + detectState = countReferences_loop; + } + break; + + case countReferences_loop: + { + // Call EnumReferences on all objects in the map to count the number + // of references reachable from between objects in the map. If all + // references for an object in the map is reachable from other objects + // in the map, then we know that no outside references are held for + // this object, thus it is a potential dead object in a circular reference. + + // If the gcFlag is cleared for an object we consider the object alive + // and referenced from outside the GC, thus we don't enumerate its references. + + // Any new objects created after this step in the GC cycle won't be + // in the map, and is thus automatically considered alive. + while( gcMapCursor ) + { + void *obj = gcMap.GetKey(gcMapCursor); + asCObjectType *type = gcMap.GetValue(gcMapCursor).type; + gcMap.MoveNext(&gcMapCursor, gcMapCursor); + + if( engine->CallObjectMethodRetBool(obj, type->beh.gcGetFlag) ) + { + engine->CallObjectMethod(obj, engine, type->beh.gcEnumReferences); + + // Allow the application to work a little + return 1; + } + } + + detectState = detectGarbage_init; + } + break; + + case detectGarbage_init: + { + detectIdx = (asUINT)-1; + gcMap.MoveFirst(&gcMapCursor); + liveObjects.SetLength(0); + detectState = detectGarbage_loop1; + } + break; + + case detectGarbage_loop1: + { + // All objects that are known not to be dead must be removed from the map, + // along with all objects they reference. What remains in the map after + // this pass is sure to be dead objects in circular references. + + // An object is considered alive if its gcFlag is cleared, or all the + // references were not found in the map. + + // Add all alive objects from the map to the liveObjects array + while( gcMapCursor ) + { + asSMapNode *cursor = gcMapCursor; + gcMap.MoveNext(&gcMapCursor, gcMapCursor); + + void *obj = gcMap.GetKey(cursor); + asSIntTypePair it = gcMap.GetValue(cursor); + + bool gcFlag = engine->CallObjectMethodRetBool(obj, it.type->beh.gcGetFlag); + if( !gcFlag || it.i > 0 ) + { + liveObjects.PushLast(obj); + + // Allow the application to work a little + return 1; + } + } + + detectState = detectGarbage_loop2; + } + break; + + case detectGarbage_loop2: + { + // In this step we are actually removing the alive objects from the map. + // As the object is removed, all the objects it references are added to the + // liveObjects list, by calling EnumReferences. Only objects still in the map + // will be added to the liveObjects list. + while( liveObjects.GetLength() ) + { + void *gcObj = liveObjects.PopLast(); + asCObjectType *type = 0; + + // Remove the object from the map to mark it as alive + asSMapNode *cursor = 0; + if( gcMap.MoveTo(&cursor, gcObj) ) + { + type = gcMap.GetValue(cursor).type; + gcMap.Erase(cursor); + + // We need to decrease the reference count again as we remove the object from the map + engine->CallObjectMethod(gcObj, type->beh.release); + + // Enumerate all the object's references so that they too can be marked as alive + engine->CallObjectMethod(gcObj, engine, type->beh.gcEnumReferences); + } + + // Allow the application to work a little + return 1; + } + + detectState = verifyUnmarked; + } + break; + + case verifyUnmarked: + { + // In this step we must make sure that none of the objects still in the map + // has been touched by the application. If they have then we must run the + // detectGarbage loop once more. + gcMap.MoveFirst(&gcMapCursor); + while( gcMapCursor ) + { + void *gcObj = gcMap.GetKey(gcMapCursor); + asCObjectType *type = gcMap.GetValue(gcMapCursor).type; + + bool gcFlag = engine->CallObjectMethodRetBool(gcObj, type->beh.gcGetFlag); + if( !gcFlag ) + { + // The unmarked object was touched, rerun the detectGarbage loop + detectState = detectGarbage_init; + return 1; + } + + gcMap.MoveNext(&gcMapCursor, gcMapCursor); + } + + // No unmarked object was touched, we can now be sure + // that objects that have gcCount == 0 really is garbage + detectState = breakCircles_init; + } + break; + + case breakCircles_init: + { + detectIdx = (asUINT)-1; + gcMap.MoveFirst(&gcMapCursor); + detectState = breakCircles_loop; + } + break; + + case breakCircles_loop: + case breakCircles_haveGarbage: + { + // All objects in the map are now known to be dead objects + // kept alive through circular references. To be able to free + // these objects we need to force the breaking of the circle + // by having the objects release their references. + while( gcMapCursor ) + { + numDetected++; + void *gcObj = gcMap.GetKey(gcMapCursor); + asCObjectType *type = gcMap.GetValue(gcMapCursor).type; + engine->CallObjectMethod(gcObj, engine, type->beh.gcReleaseAllReferences); + + gcMap.MoveNext(&gcMapCursor, gcMapCursor); + + detectState = breakCircles_haveGarbage; + + // Allow the application to work a little + return 1; + } + + // If no garbage was detected we can finish now + if( detectState != breakCircles_haveGarbage ) + { + // Restart the GC + detectState = clearCounters_init; + return 0; + } + else + { + // Restart the GC + detectState = clearCounters_init; + return 1; + } + } + break; + } // switch + } + + // Shouldn't reach this point + UNREACHABLE_RETURN; +} + +void asCGarbageCollector::GCEnumCallback(void *reference) +{ + if( detectState == countReferences_loop ) + { + // Find the reference in the map + asSMapNode *cursor = 0; + if( gcMap.MoveTo(&cursor, reference) ) + { + // Decrease the counter in the map for the reference + gcMap.GetValue(cursor).i--; + } + } + else if( detectState == detectGarbage_loop2 ) + { + // Find the reference in the map + asSMapNode *cursor = 0; + if( gcMap.MoveTo(&cursor, reference) ) + { + // Add the object to the list of objects to mark as alive + liveObjects.PushLast(reference); + } + } +} + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_gc.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_gc.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_gc.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_gc.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,122 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_gc.h +// +// The garbage collector is used to resolve cyclic references +// + + + +#ifndef AS_GC_H +#define AS_GC_H + +#include "as_config.h" +#include "as_array.h" +#include "as_map.h" +#include "as_thread.h" + +BEGIN_AS_NAMESPACE + +class asCScriptEngine; +class asCObjectType; + +class asCGarbageCollector +{ +public: + asCGarbageCollector(); + + int GarbageCollect(asDWORD flags); + void GetStatistics(asUINT *currentSize, asUINT *totalDestroyed, asUINT *totalDetected); + void GCEnumCallback(void *reference); + void AddScriptObjectToGC(void *obj, asCObjectType *objType); + + asCScriptEngine *engine; + +protected: + struct asSObjTypePair {void *obj; asCObjectType *type;}; + struct asSIntTypePair {int i; asCObjectType *type;}; + + enum egcDestroyState + { + destroyGarbage_init = 0, + destroyGarbage_loop, + destroyGarbage_haveMore + }; + + enum egcDetectState + { + clearCounters_init = 0, + clearCounters_loop, + countReferences_init, + countReferences_loop, + detectGarbage_init, + detectGarbage_loop1, + detectGarbage_loop2, + verifyUnmarked, + breakCircles_init, + breakCircles_loop, + breakCircles_haveGarbage + }; + + int DestroyGarbage(); + int IdentifyGarbageWithCyclicRefs(); + void ClearMap(); + asSObjTypePair GetObjectAtIdx(int idx); + void RemoveObjectAtIdx(int idx); + + // Holds all the objects known by the garbage collector + asCArray gcObjects; + + // This array temporarily holds references to objects known to be live objects + asCArray liveObjects; + + // This map holds objects currently being searched for cyclic references, it also holds a + // counter that gives the number of references to the object that the GC can't reach + asCMap gcMap; + + // State variables + egcDestroyState destroyState; + asUINT destroyIdx; + asUINT numDestroyed; + egcDetectState detectState; + asUINT detectIdx; + asUINT numDetected; + asSMapNode *gcMapCursor; + + // Critical section for multithreaded access + DECLARECRITICALSECTION(gcCritical); +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_generic.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_generic.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_generic.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_generic.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,507 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_generic.cpp +// +// This class handles the call to a function registered with asCALL_GENERIC +// + +#include "as_generic.h" +#include "as_scriptfunction.h" +#include "as_objecttype.h" +#include "as_scriptengine.h" + +BEGIN_AS_NAMESPACE + +// TODO: optimize: The access to the arguments should be optimized so that code +// doesn't have to count the position of the argument with every call + +// internal +asCGeneric::asCGeneric(asCScriptEngine *engine, asCScriptFunction *sysFunction, void *currentObject, asDWORD *stackPointer) +{ + this->engine = engine; + this->sysFunction = sysFunction; + this->currentObject = currentObject; + this->stackPointer = stackPointer; + + objectRegister = 0; + returnVal = 0; +} + +// internal +asCGeneric::~asCGeneric() +{ +} + +// interface +asIScriptEngine *asCGeneric::GetEngine() +{ + return (asIScriptEngine*)engine; +} + +// interface +int asCGeneric::GetFunctionId() +{ + return sysFunction->id; +} + +// interface +void *asCGeneric::GetObject() +{ + return currentObject; +} + +// interface +int asCGeneric::GetObjectTypeId() +{ + asCDataType dt = asCDataType::CreateObject(sysFunction->objectType, false); + return engine->GetTypeIdFromDataType(dt); +} + +// interface +int asCGeneric::GetArgCount() +{ + return (int)sysFunction->parameterTypes.GetLength(); +} + +// interface +asBYTE asCGeneric::GetArgByte(asUINT arg) +{ + if( arg >= (unsigned)sysFunction->parameterTypes.GetLength() ) + return 0; + + // Verify that the type is correct + asCDataType *dt = &sysFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + return 0; + + if( dt->GetSizeInMemoryBytes() != 1 ) + return 0; + + // Determine the position of the argument + int offset = 0; + for( asUINT n = 0; n < arg; n++ ) + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Get the value + return *(asBYTE*)&stackPointer[offset]; +} + +// interface +asWORD asCGeneric::GetArgWord(asUINT arg) +{ + if( arg >= (unsigned)sysFunction->parameterTypes.GetLength() ) + return 0; + + // Verify that the type is correct + asCDataType *dt = &sysFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + return 0; + + if( dt->GetSizeInMemoryBytes() != 2 ) + return 0; + + // Determine the position of the argument + int offset = 0; + for( asUINT n = 0; n < arg; n++ ) + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Get the value + return *(asWORD*)&stackPointer[offset]; +} + +// interface +asDWORD asCGeneric::GetArgDWord(asUINT arg) +{ + if( arg >= (unsigned)sysFunction->parameterTypes.GetLength() ) + return 0; + + // Verify that the type is correct + asCDataType *dt = &sysFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + return 0; + + if( dt->GetSizeInMemoryBytes() != 4 ) + return 0; + + // Determine the position of the argument + int offset = 0; + for( asUINT n = 0; n < arg; n++ ) + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Get the value + return *(asDWORD*)&stackPointer[offset]; +} + +// interface +asQWORD asCGeneric::GetArgQWord(asUINT arg) +{ + if( arg >= (unsigned)sysFunction->parameterTypes.GetLength() ) + return 0; + + // Verify that the type is correct + asCDataType *dt = &sysFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + return 0; + + if( dt->GetSizeInMemoryBytes() != 8 ) + return 0; + + // Determine the position of the argument + int offset = 0; + for( asUINT n = 0; n < arg; n++ ) + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Get the value + return *(asQWORD*)(&stackPointer[offset]); +} + +// interface +float asCGeneric::GetArgFloat(asUINT arg) +{ + if( arg >= (unsigned)sysFunction->parameterTypes.GetLength() ) + return 0; + + // Verify that the type is correct + asCDataType *dt = &sysFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + return 0; + + if( dt->GetSizeInMemoryBytes() != 4 ) + return 0; + + // Determine the position of the argument + int offset = 0; + for( asUINT n = 0; n < arg; n++ ) + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Get the value + return *(float*)(&stackPointer[offset]); +} + +// interface +double asCGeneric::GetArgDouble(asUINT arg) +{ + if( arg >= (unsigned)sysFunction->parameterTypes.GetLength() ) + return 0; + + // Verify that the type is correct + asCDataType *dt = &sysFunction->parameterTypes[arg]; + if( dt->IsObject() || dt->IsReference() ) + return 0; + + if( dt->GetSizeInMemoryBytes() != 8 ) + return 0; + + // Determine the position of the argument + int offset = 0; + for( asUINT n = 0; n < arg; n++ ) + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Get the value + return *(double*)(&stackPointer[offset]); +} + +// interface +void *asCGeneric::GetArgAddress(asUINT arg) +{ + if( arg >= (unsigned)sysFunction->parameterTypes.GetLength() ) + return 0; + + // Verify that the type is correct + asCDataType *dt = &sysFunction->parameterTypes[arg]; + if( !dt->IsReference() && !dt->IsObjectHandle() ) + return 0; + + // Determine the position of the argument + int offset = 0; + for( asUINT n = 0; n < arg; n++ ) + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Get the value + return (void*)*(size_t*)(&stackPointer[offset]); +} + +// interface +void *asCGeneric::GetArgObject(asUINT arg) +{ + if( arg >= (unsigned)sysFunction->parameterTypes.GetLength() ) + return 0; + + // Verify that the type is correct + asCDataType *dt = &sysFunction->parameterTypes[arg]; + if( !dt->IsObject() ) + return 0; + + // Determine the position of the argument + int offset = 0; + for( asUINT n = 0; n < arg; n++ ) + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Get the value + return *(void**)(&stackPointer[offset]); +} + +// interface +void *asCGeneric::GetAddressOfArg(asUINT arg) +{ + if( arg >= (unsigned)sysFunction->parameterTypes.GetLength() ) + return 0; + + // Determine the position of the argument + int offset = 0; + for( asUINT n = 0; n < arg; n++ ) + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // For object variables it's necessary to dereference the pointer to get the address of the value + if( !sysFunction->parameterTypes[arg].IsReference() && + sysFunction->parameterTypes[arg].IsObject() && + !sysFunction->parameterTypes[arg].IsObjectHandle() ) + return *(void**)&stackPointer[offset]; + + // Get the address of the value + return &stackPointer[offset]; +} + +// interface +int asCGeneric::GetArgTypeId(asUINT arg) +{ + if( arg >= (unsigned)sysFunction->parameterTypes.GetLength() ) + return 0; + + asCDataType *dt = &sysFunction->parameterTypes[arg]; + if( dt->GetTokenType() != ttQuestion ) + return engine->GetTypeIdFromDataType(*dt); + else + { + int offset = 0; + for( asUINT n = 0; n < arg; n++ ) + offset += sysFunction->parameterTypes[n].GetSizeOnStackDWords(); + + // Skip the actual value to get to the type id + offset += AS_PTR_SIZE; + + // Get the value + return stackPointer[offset]; + } +} + +// interface +int asCGeneric::SetReturnByte(asBYTE val) +{ + // Verify the type of the return value + if( sysFunction->returnType.IsObject() || sysFunction->returnType.IsReference() ) + return asINVALID_TYPE; + + if( sysFunction->returnType.GetSizeInMemoryBytes() != 1 ) + return asINVALID_TYPE; + + // Store the value + *(asBYTE*)&returnVal = val; + + return 0; +} + +// interface +int asCGeneric::SetReturnWord(asWORD val) +{ + // Verify the type of the return value + if( sysFunction->returnType.IsObject() || sysFunction->returnType.IsReference() ) + return asINVALID_TYPE; + + if( sysFunction->returnType.GetSizeInMemoryBytes() != 2 ) + return asINVALID_TYPE; + + // Store the value + *(asWORD*)&returnVal = val; + + return 0; +} + +// interface +int asCGeneric::SetReturnDWord(asDWORD val) +{ + // Verify the type of the return value + if( sysFunction->returnType.IsObject() || sysFunction->returnType.IsReference() ) + return asINVALID_TYPE; + + if( sysFunction->returnType.GetSizeInMemoryBytes() != 4 ) + return asINVALID_TYPE; + + // Store the value + *(asDWORD*)&returnVal = val; + + return 0; +} + +// interface +int asCGeneric::SetReturnQWord(asQWORD val) +{ + // Verify the type of the return value + if( sysFunction->returnType.IsObject() || sysFunction->returnType.IsReference() ) + return asINVALID_TYPE; + + if( sysFunction->returnType.GetSizeOnStackDWords() != 2 ) + return asINVALID_TYPE; + + // Store the value + returnVal = val; + + return 0; +} + +// interface +int asCGeneric::SetReturnFloat(float val) +{ + // Verify the type of the return value + if( sysFunction->returnType.IsObject() || sysFunction->returnType.IsReference() ) + return asINVALID_TYPE; + + if( sysFunction->returnType.GetSizeOnStackDWords() != 1 ) + return asINVALID_TYPE; + + // Store the value + *(float*)&returnVal = val; + + return 0; +} + +// interface +int asCGeneric::SetReturnDouble(double val) +{ + // Verify the type of the return value + if( sysFunction->returnType.IsObject() || sysFunction->returnType.IsReference() ) + return asINVALID_TYPE; + + if( sysFunction->returnType.GetSizeOnStackDWords() != 2 ) + return asINVALID_TYPE; + + // Store the value + *(double*)&returnVal = val; + + return 0; +} + +// interface +int asCGeneric::SetReturnAddress(void *val) +{ + // Verify the type of the return value + if( sysFunction->returnType.IsReference() ) + { + // Store the value + *(void**)&returnVal = val; + return 0; + } + else if( sysFunction->returnType.IsObjectHandle() ) + { + // Store the handle without increasing reference + objectRegister = val; + return 0; + } + + return asINVALID_TYPE; +} + +// interface +int asCGeneric::SetReturnObject(void *obj) +{ + asCDataType *dt = &sysFunction->returnType; + if( !dt->IsObject() ) + return asINVALID_TYPE; + + if( dt->IsReference() ) + { + *(void**)&returnVal = obj; + return 0; + } + + if( dt->IsObjectHandle() ) + { + // Increase the reference counter + asSTypeBehaviour *beh = &dt->GetObjectType()->beh; + if( obj && beh->addref ) + engine->CallObjectMethod(obj, beh->addref); + } + else + { + obj = engine->CreateScriptObjectCopy(obj, engine->GetTypeIdFromDataType(*dt)); + } + + objectRegister = obj; + + return 0; +} + +// internal +void *asCGeneric::GetReturnPointer() +{ + asCDataType &dt = sysFunction->returnType; + + if( dt.IsObject() && !dt.IsReference() ) + return &objectRegister; + + return &returnVal; +} + +// interface +void *asCGeneric::GetAddressOfReturnLocation() +{ + asCDataType &dt = sysFunction->returnType; + + if( dt.IsObject() && !dt.IsReference() ) + { + if( dt.GetObjectType()->flags & asOBJ_VALUE ) + { + // Allocate the necessary memory for this object, + // but do not initialize it, as the caller will do that. + objectRegister = engine->CallAlloc(dt.GetObjectType()); + + // TODO: How will we know if the initialization was successful? + + return objectRegister; + } + + // Reference types store the handle in the objectReference + return &objectRegister; + } + + // Primitive types and references are stored in the returnVal property + return &returnVal; +} + +// interface +int asCGeneric::GetReturnTypeId() +{ + return sysFunction->GetReturnTypeId(); +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_generic.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_generic.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_generic.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_generic.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,107 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_generic.h +// +// This class handles the call to a function registered with asCALL_GENERIC +// + + +#ifndef AS_GENERIC_H +#define AS_GENERIC_H + +#include "as_config.h" + +BEGIN_AS_NAMESPACE + +class asCScriptEngine; +class asCScriptFunction; + +class asCGeneric : public asIScriptGeneric +{ +public: +//------------------------------ +// asIScriptGeneric +//------------------------------ + // Miscellaneous + asIScriptEngine *GetEngine(); + int GetFunctionId(); + + // Object + void *GetObject(); + int GetObjectTypeId(); + + // Arguments + int GetArgCount(); + int GetArgTypeId(asUINT arg); + asBYTE GetArgByte(asUINT arg); + asWORD GetArgWord(asUINT arg); + asDWORD GetArgDWord(asUINT arg); + asQWORD GetArgQWord(asUINT arg); + float GetArgFloat(asUINT arg); + double GetArgDouble(asUINT arg); + void *GetArgAddress(asUINT arg); + void *GetArgObject(asUINT arg); + void *GetAddressOfArg(asUINT arg); + + // Return value + int GetReturnTypeId(); + int SetReturnByte(asBYTE val); + int SetReturnWord(asWORD val); + int SetReturnDWord(asDWORD val); + int SetReturnQWord(asQWORD val); + int SetReturnFloat(float val); + int SetReturnDouble(double val); + int SetReturnAddress(void *addr); + int SetReturnObject(void *obj); + void *GetAddressOfReturnLocation(); + +//------------------------ +// internal +//------------------------- + asCGeneric(asCScriptEngine *engine, asCScriptFunction *sysFunction, void *currentObject, asDWORD *stackPointer); + virtual ~asCGeneric(); + + void *GetReturnPointer(); + + asCScriptEngine *engine; + asCScriptFunction *sysFunction; + void *currentObject; + asDWORD *stackPointer; + void *objectRegister; + + asQWORD returnVal; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_globalproperty.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_globalproperty.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_globalproperty.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_globalproperty.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,107 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + + + +#include "as_config.h" +#include "as_property.h" + +BEGIN_AS_NAMESPACE + +asCGlobalProperty::asCGlobalProperty() +{ + memory = 0; + memoryAllocated = false; + realAddress = 0; + initFunc = 0; + + refCount.set(1); +} + +asCGlobalProperty::~asCGlobalProperty() +{ + if( memoryAllocated ) { asDELETEARRAY(memory); } + if( initFunc ) + initFunc->Release(); +} + +void asCGlobalProperty::AddRef() +{ + refCount.atomicInc(); +} + +void asCGlobalProperty::Release() +{ + // The property doesn't delete itself. The + // engine will do that at a later time + if( refCount.atomicDec() == 1 && initFunc ) + { + // Since the initFunc holds a reference to the property, + // we'll release it when we reach refCount 1. This will + // break the circle and allow the engine to free the property + // without the need for a GC run. + initFunc->Release(); + initFunc = 0; + } +} + +void *asCGlobalProperty::GetAddressOfValue() +{ + return (memoryAllocated || realAddress) ? memory : &storage; +} + +// The global property structure is responsible for allocating the storage +// method for script declared variables. Each allocation is independent of +// other global properties, so that variables can be added and removed at +// any time. +void asCGlobalProperty::AllocateMemory() +{ + if( type.GetSizeOnStackDWords() > 2 ) + { + memory = asNEWARRAY(asDWORD, type.GetSizeOnStackDWords()); + memoryAllocated = true; + } +} + +void asCGlobalProperty::SetRegisteredAddress(void *p) +{ + realAddress = p; + if( type.IsObject() && !type.IsReference() && !type.IsObjectHandle() ) + { + // The global property is a pointer to a pointer + memory = &realAddress; + } + else + memory = p; +} + + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_map.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_map.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_map.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_map.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,744 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2007 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_map.h +// +// This class is used for mapping a value to another +// + + +#ifndef AS_MAP_H +#define AS_MAP_H + +template struct asSMapNode; + +template class asCMap +{ +public: + asCMap(); + ~asCMap(); + + int Insert(const KEY &key, const VAL &value); + int GetCount(); + + const KEY &GetKey(const asSMapNode *cursor) const; + const VAL &GetValue(const asSMapNode *cursor) const; + VAL &GetValue(asSMapNode *cursor); + + void Erase(asSMapNode *cursor); + void EraseAll(); + + // Returns true as long as cursor is valid + + bool MoveTo(asSMapNode **out, const KEY &key); + bool MoveFirst(asSMapNode **out); + bool MoveLast(asSMapNode **out); + bool MoveNext(asSMapNode **out, asSMapNode *cursor); + bool MovePrev(asSMapNode **out, asSMapNode *cursor); + + // For debugging only + + int CheckIntegrity(asSMapNode *node); + +protected: + void BalanceInsert(asSMapNode *node); + void BalanceErase(asSMapNode *child, asSMapNode *parent); + + int EraseAll(asSMapNode *node); + int RotateLeft(asSMapNode *node); + int RotateRight(asSMapNode *node); + + asSMapNode *root; + asSMapNode dummy; + + int count; +}; + +//--------------------------------------------------------------------------- +// Implementation + +// Properties of a Red-Black Tree +// +// 1. The root is always black +// 2. All single paths from the root to leafs +// contain the same amount of black nodes +// 3. No red node can have a red node as parent + +#define ISRED(x) ((x != 0) && (x)->isRed) +#define ISBLACK(x) (!ISRED(x)) + +template struct asSMapNode +{ + asSMapNode() {parent = 0; left = 0; right = 0; isRed = true;} + + asSMapNode *parent; + asSMapNode *left; + asSMapNode *right; + bool isRed; + + KEY key; + VAL value; +}; + +template +asCMap::asCMap() +{ + root = 0; + count = 0; +} + +template +asCMap::~asCMap() +{ + EraseAll(); +} + +template +void asCMap::EraseAll() +{ + EraseAll(root); + root = 0; +} + +template +int asCMap::EraseAll(asSMapNode *p) +{ + if( p == 0 ) return -1; + + EraseAll( p->left ); + EraseAll( p->right ); + + typedef asSMapNode node_t; + asDELETE(p,node_t); + + count--; + + return 0; +} + +template +int asCMap::GetCount() +{ + return count; +} + +template +int asCMap::Insert(const KEY &key, const VAL &value) +{ + typedef asSMapNode node_t; + asSMapNode *nnode = asNEW(node_t); + nnode->key = key; + nnode->value = value; + + // Insert the node + if( root == 0 ) + root = nnode; + else + { + asSMapNode *p = root; + for(;;) + { + if( nnode->key < p->key ) + { + if( p->left == 0 ) + { + nnode->parent = p; + p->left = nnode; + break; + } + else + p = p->left; + } + else + { + if( p->right == 0 ) + { + nnode->parent = p; + p->right = nnode; + break; + } + else + p = p->right; + } + } + } + + BalanceInsert(nnode); + + count++; + + return 0; +} + +template +void asCMap::BalanceInsert(asSMapNode *node) +{ + // The node, that is red, can't have a red parent + while( node != root && node->parent->isRed ) + { + // Check color of uncle + if( node->parent == node->parent->parent->left ) + { + asSMapNode *uncle = node->parent->parent->right; + if( ISRED(uncle) ) + { + // B + // R R + // N + + // Change color on parent, uncle, and grand parent + node->parent->isRed = false; + uncle->isRed = false; + node->parent->parent->isRed = true; + + // Continue balancing from grand parent + node = node->parent->parent; + } + else + { + // B + // R B + // N + + if( node == node->parent->right ) + { + // Make the node a left child + node = node->parent; + RotateLeft(node); + } + + // Change color on parent and grand parent + // Then rotate grand parent to the right + node->parent->isRed = false; + node->parent->parent->isRed = true; + RotateRight(node->parent->parent); + } + } + else + { + asSMapNode *uncle = node->parent->parent->left; + if( ISRED(uncle) ) + { + // B + // R R + // N + + // Change color on parent, uncle, and grand parent + // Continue balancing from grand parent + node->parent->isRed = false; + uncle->isRed = false; + node = node->parent->parent; + node->isRed = true; + } + else + { + // B + // B R + // N + + if( node == node->parent->left ) + { + // Make the node a right child + node = node->parent; + RotateRight(node); + } + + // Change color on parent and grand parent + // Then rotate grand parent to the right + node->parent->isRed = false; + node->parent->parent->isRed = true; + RotateLeft(node->parent->parent); + } + } + } + + root->isRed = false; +} + +// For debugging purposes only +template +int asCMap::CheckIntegrity(asSMapNode *node) +{ + if( node == 0 ) + { + if( root == 0 ) + return 0; + else if( ISRED(root) ) + return -1; + else + node = root; + } + + int left = 0, right = 0; + if( node->left ) + left = CheckIntegrity(node->left); + if( node->right ) + right = CheckIntegrity(node->right); + + if( left != right || left == -1 ) + return -1; + + if( ISBLACK(node) ) + return left+1; + + return left; +} + +// Returns true if successful +template +bool asCMap::MoveTo(asSMapNode **out, const KEY &key) +{ + asSMapNode *p = root; + while( p ) + { + if( key < p->key ) + p = p->left; + else if( key == p->key ) + { + *out = p; + return true; + } + else + p = p->right; + } + + *out = 0; + return false; +} + +template +void asCMap::Erase(asSMapNode *cursor) +{ + if( cursor == 0 ) return; + + asSMapNode *node = cursor; + + //--------------------------------------------------- + // Choose the node that will replace the erased one + asSMapNode *remove; + if( node->left == 0 || node->right == 0 ) + remove = node; + else + { + remove = node->right; + while( remove->left ) remove = remove->left; + } + + //-------------------------------------------------- + // Remove the node + asSMapNode *child; + if( remove->left ) + child = remove->left; + else + child = remove->right; + + if( child ) child->parent = remove->parent; + if( remove->parent ) + { + if( remove == remove->parent->left ) + remove->parent->left = child; + else + remove->parent->right = child; + } + else + root = child; + + // If we remove a black node we must make sure the tree is balanced + if( ISBLACK(remove) ) + BalanceErase(child, remove->parent); + + //---------------------------------------- + // Replace the erased node with the removed one + if( remove != node ) + { + if( node->parent ) + { + if( node->parent->left == node ) + node->parent->left = remove; + else + node->parent->right = remove; + } + else + root = remove; + + remove->isRed = node->isRed; + remove->parent = node->parent; + + remove->left = node->left; + if( remove->left ) remove->left->parent = remove; + remove->right = node->right; + if( remove->right ) remove->right->parent = remove; + } + + typedef asSMapNode node_t; + asDELETE(node,node_t); + + count--; +} + +// Call method only if removed node was black +// child is the child of the removed node +template +void asCMap::BalanceErase(asSMapNode *child, asSMapNode *parent) +{ + // If child is red + // Color child black + // Terminate + + // These tests assume brother is to the right. + + // 1. Brother is red + // Color parent red and brother black + // Rotate parent left + // Transforms to 2b + // 2a. Parent and brother is black, brother's children are black + // Color brother red + // Continue test with parent as child + // 2b. Parent is red, brother is black, brother's children are black + // Color parent black and brother red + // Terminate + // 3. Brother is black, and brother's left is red and brother's right is black + // Color brother red and brother's left black + // Rotate brother to right + // Transforms to 4. + // 4. Brother is black, brother's right is red + // Color brother's right black + // Color brother to color of parent + // Color parent black + // Rotate parent left + // Terminate + + while( child != root && ISBLACK(child) ) + { + if( child == parent->left ) + { + asSMapNode *brother = parent->right; + + // Case 1 + if( ISRED(brother) ) + { + brother->isRed = false; + parent->isRed = true; + RotateLeft(parent); + brother = parent->right; + } + + // Case 2 + if( brother == 0 ) break; + if( ISBLACK(brother->left) && ISBLACK(brother->right) ) + { + // Case 2b + if( ISRED(parent) ) + { + parent->isRed = false; + brother->isRed = true; + break; + } + + brother->isRed = true; + child = parent; + parent = child->parent; + } + else + { + // Case 3 + if( ISBLACK(brother->right) ) + { + brother->left->isRed = false; + brother->isRed = true; + RotateRight(brother); + brother = parent->right; + } + + // Case 4 + brother->isRed = parent->isRed; + parent->isRed = false; + brother->right->isRed = false; + RotateLeft(parent); + break; + } + } + else + { + asSMapNode *brother = parent->left; + + // Case 1 + if( ISRED(brother) ) + { + brother->isRed = false; + parent->isRed = true; + RotateRight(parent); + brother = parent->left; + } + + // Case 2 + if( brother == 0 ) break; + if( ISBLACK(brother->left) && ISBLACK(brother->right) ) + { + // Case 2b + if( ISRED(parent) ) + { + parent->isRed = false; + brother->isRed = true; + break; + } + + brother->isRed = true; + child = parent; + parent = child->parent; + } + else + { + // Case 3 + if( ISBLACK(brother->left) ) + { + brother->right->isRed = false; + brother->isRed = true; + RotateLeft(brother); + brother = parent->left; + } + + // Case 4 + brother->isRed = parent->isRed; + parent->isRed = false; + brother->left->isRed = false; + RotateRight(parent); + break; + } + } + } + + if( child ) + child->isRed = false; +} + +template +int asCMap::RotateRight(asSMapNode *node) +{ + // P L // + // / \ / \ // + // L R => Ll P // + // / \ / \ // + // Ll Lr Lr R // + + if( node->left == 0 ) return -1; + + asSMapNode *left = node->left; + + // Update parent + if( node->parent ) + { + asSMapNode *parent = node->parent; + if( parent->left == node ) + parent->left = left; + else + parent->right = left; + + left->parent = parent; + } + else + { + root = left; + left->parent = 0; + } + + // Move left's right child to node's left child + node->left = left->right; + if( node->left ) node->left->parent = node; + + // Put node as left's right child + left->right = node; + node->parent = left; + + return 0; +} + +template +int asCMap::RotateLeft(asSMapNode *node) +{ + // P R // + // / \ / \ // + // L R => P Rr // + // / \ / \ // + // Rl Rr L Rl // + + if( node->right == 0 ) return -1; + + asSMapNode *right = node->right; + + // Update parent + if( node->parent ) + { + asSMapNode *parent = node->parent; + if( parent->right == node ) + parent->right = right; + else + parent->left = right; + + right->parent = parent; + } + else + { + root = right; + right->parent = 0; + } + + // Move right's left child to node's right child + node->right = right->left; + if( node->right ) node->right->parent = node; + + // Put node as right's left child + right->left = node; + node->parent = right; + + return 0; +} + +template +const VAL &asCMap::GetValue(const asSMapNode *cursor) const +{ + if( cursor == 0 ) + return dummy.value; + + return cursor->value; +} + +template +VAL &asCMap::GetValue(asSMapNode *cursor) +{ + if( cursor == 0 ) + return dummy.value; + + return cursor->value; +} + +template +const KEY &asCMap::GetKey(const asSMapNode *cursor) const +{ + if( cursor == 0 ) + return dummy.key; + + return cursor->key; +} + +template +bool asCMap::MoveFirst(asSMapNode **out) +{ + *out = root; + if( root == 0 ) return false; + + while( (*out)->left ) + *out = (*out)->left; + + return true; +} + +template +bool asCMap::MoveLast(asSMapNode **out) +{ + *out = root; + if( root == 0 ) return false; + + while( (*out)->right ) + *out = (*out)->right; + + return true; +} + +template +bool asCMap::MoveNext(asSMapNode **out, asSMapNode *cursor) +{ + if( cursor == 0 ) + { + *out = 0; + return false; + } + + if( cursor->right == 0 ) + { + // Move upwards until we find a parent node to the right + while( cursor->parent && cursor->parent->right == cursor ) + cursor = cursor->parent; + + cursor = cursor->parent; + *out = cursor; + if( cursor == 0 ) + return false; + + return true; + } + + cursor = cursor->right; + while( cursor->left ) + cursor = cursor->left; + + *out = cursor; + return true; +} + +template +bool asCMap::MovePrev(asSMapNode **out, asSMapNode *cursor) +{ + if( cursor == 0 ) + { + *out = 0; + return false; + } + + if( cursor->left == 0 ) + { + // Move upwards until we find a parent node to the left + while( cursor->parent && cursor->parent->left == cursor ) + cursor = cursor->parent; + + cursor = cursor->parent; + + *out = cursor; + if( cursor == 0 ) + return false; + + return true; + } + + cursor = cursor->left; + while( cursor->right ) + cursor = cursor->right; + + *out = cursor; + return true; +} + + + + +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_memory.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_memory.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_memory.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_memory.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,163 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_memory.cpp +// +// Overload the default memory management functions so that we +// can let the application decide how to do it. +// + +#include + +#include "as_config.h" +#include "as_memory.h" +#include "as_scriptnode.h" +#include "as_bytecode.h" + +BEGIN_AS_NAMESPACE + +// By default we'll use the standard memory management functions +asALLOCFUNC_t userAlloc = malloc; +asFREEFUNC_t userFree = free; + +extern "C" +{ + +int asSetGlobalMemoryFunctions(asALLOCFUNC_t allocFunc, asFREEFUNC_t freeFunc) +{ + userAlloc = allocFunc; + userFree = freeFunc; + + return 0; +} + +int asResetGlobalMemoryFunctions() +{ + asThreadCleanup(); + + userAlloc = malloc; + userFree = free; + + return 0; +} + +} // extern "C" + +asCMemoryMgr::asCMemoryMgr() +{ +} + +asCMemoryMgr::~asCMemoryMgr() +{ + FreeUnusedMemory(); +} + +void asCMemoryMgr::FreeUnusedMemory() +{ + // It's necessary to protect the scriptNodePool from multiple + // simultaneous accesses, as the parser is used by several methods + // that can be executed simultaneously. + ENTERCRITICALSECTION(cs); + + int n; + for( n = 0; n < (signed)scriptNodePool.GetLength(); n++ ) + userFree(scriptNodePool[n]); + scriptNodePool.Allocate(0, false); + + LEAVECRITICALSECTION(cs); + + // The engine already protects against multiple threads + // compiling scripts simultaneously so this pool doesn't have + // to be protected again. + for( n = 0; n < (signed)byteInstructionPool.GetLength(); n++ ) + userFree(byteInstructionPool[n]); + byteInstructionPool.Allocate(0, false); +} + +void *asCMemoryMgr::AllocScriptNode() +{ + ENTERCRITICALSECTION(cs); + + if( scriptNodePool.GetLength() ) + { + void *tRet = scriptNodePool.PopLast(); + LEAVECRITICALSECTION(cs); + return tRet; + } + + LEAVECRITICALSECTION(cs); + +#if defined(AS_DEBUG) + return ((asALLOCFUNCDEBUG_t)(userAlloc))(sizeof(asCScriptNode), __FILE__, __LINE__); +#else + return userAlloc(sizeof(asCScriptNode)); +#endif +} + +void asCMemoryMgr::FreeScriptNode(void *ptr) +{ + ENTERCRITICALSECTION(cs); + + // Pre allocate memory for the array to avoid slow growth + if( scriptNodePool.GetLength() == 0 ) + scriptNodePool.Allocate(100, 0); + + scriptNodePool.PushLast(ptr); + + LEAVECRITICALSECTION(cs); +} + +void *asCMemoryMgr::AllocByteInstruction() +{ + if( byteInstructionPool.GetLength() ) + return byteInstructionPool.PopLast(); + +#if defined(AS_DEBUG) + return ((asALLOCFUNCDEBUG_t)(userAlloc))(sizeof(cByteInstruction), __FILE__, __LINE__); +#else + return userAlloc(sizeof(cByteInstruction)); +#endif +} + +void asCMemoryMgr::FreeByteInstruction(void *ptr) +{ + // Pre allocate memory for the array to avoid slow growth + if( byteInstructionPool.GetLength() == 0 ) + byteInstructionPool.Allocate(100, 0); + + byteInstructionPool.PushLast(ptr); +} + +END_AS_NAMESPACE + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_memory.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_memory.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_memory.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_memory.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,103 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_memory.h +// +// Overload the default memory management functions so that we +// can let the application decide how to do it. +// + + + +#ifndef AS_MEMORY_H +#define AS_MEMORY_H + +#include "as_config.h" + +BEGIN_AS_NAMESPACE + +extern asALLOCFUNC_t userAlloc; +extern asFREEFUNC_t userFree; + +// We don't overload the new operator as that would affect the application as well + +#ifndef AS_DEBUG + + #define asNEW(x) new(userAlloc(sizeof(x))) x + #define asDELETE(ptr,x) {void *tmp = ptr; (ptr)->~x(); userFree(tmp);} + + #define asNEWARRAY(x,cnt) (x*)userAlloc(sizeof(x)*cnt) + #define asDELETEARRAY(ptr) userFree(ptr) + +#else + + typedef void *(*asALLOCFUNCDEBUG_t)(size_t, const char *, unsigned int); + + #define asNEW(x) new(((asALLOCFUNCDEBUG_t)(userAlloc))(sizeof(x), __FILE__, __LINE__)) x + #define asDELETE(ptr,x) {void *tmp = ptr; (ptr)->~x(); userFree(tmp);} + + #define asNEWARRAY(x,cnt) (x*)((asALLOCFUNCDEBUG_t)(userAlloc))(sizeof(x)*cnt, __FILE__, __LINE__) + #define asDELETEARRAY(ptr) userFree(ptr) + +#endif + +END_AS_NAMESPACE + +#include +#include "as_criticalsection.h" +#include "as_array.h" + +BEGIN_AS_NAMESPACE + +class asCMemoryMgr +{ +public: + asCMemoryMgr(); + ~asCMemoryMgr(); + + void FreeUnusedMemory(); + + void *AllocScriptNode(); + void FreeScriptNode(void *ptr); + + void *AllocByteInstruction(); + void FreeByteInstruction(void *ptr); + +protected: + DECLARECRITICALSECTION(cs); + asCArray scriptNodePool; + asCArray byteInstructionPool; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_module.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_module.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_module.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_module.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1358 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + + +// +// as_module.cpp +// +// A class that holds a script module +// + +#include "as_config.h" +#include "as_module.h" +#include "as_builder.h" +#include "as_context.h" +#include "as_texts.h" + +BEGIN_AS_NAMESPACE + +// internal +asCModule::asCModule(const char *name, asCScriptEngine *engine) +{ + this->name = name; + this->engine = engine; + + builder = 0; + isGlobalVarInitialized = false; +} + +// internal +asCModule::~asCModule() +{ + InternalReset(); + + if( builder ) + { + asDELETE(builder,asCBuilder); + builder = 0; + } + + // Remove the module from the engine + if( engine ) + { + if( engine->lastModule == this ) + engine->lastModule = 0; + + engine->scriptModules.RemoveValue(this); + } +} + +// interface +asIScriptEngine *asCModule::GetEngine() +{ + return engine; +} + +// interface +void asCModule::SetName(const char *name) +{ + this->name = name; +} + +// interface +const char *asCModule::GetName() +{ + return name.AddressOf(); +} + +// interface +int asCModule::AddScriptSection(const char *name, const char *code, size_t codeLength, int lineOffset) +{ + if( !builder ) + builder = asNEW(asCBuilder)(engine, this); + + builder->AddCode(name, code, (int)codeLength, lineOffset, (int)engine->GetScriptSectionNameIndex(name ? name : ""), engine->ep.copyScriptSections); + + return asSUCCESS; +} + +// internal +void asCModule::JITCompile() +{ + for (unsigned int i = 0; i < scriptFunctions.GetLength(); i++) + { + scriptFunctions[i]->JITCompile(); + } +} + +// interface +int asCModule::Build() +{ + // Only one thread may build at one time + int r = engine->RequestBuild(); + if( r < 0 ) + return r; + + engine->PrepareEngine(); + if( engine->configFailed ) + { + engine->WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_INVALID_CONFIGURATION); + engine->BuildCompleted(); + return asINVALID_CONFIGURATION; + } + + InternalReset(); + + if( !builder ) + { + engine->BuildCompleted(); + return asSUCCESS; + } + + // Compile the script + r = builder->Build(); + asDELETE(builder,asCBuilder); + builder = 0; + + if( r < 0 ) + { + // Reset module again + InternalReset(); + + engine->BuildCompleted(); + return r; + } + + JITCompile(); + + engine->PrepareEngine(); + engine->BuildCompleted(); + + // Initialize global variables + if( r >= 0 && engine->ep.initGlobalVarsAfterBuild ) + r = ResetGlobalVars(); + + return r; +} + +// interface +int asCModule::ResetGlobalVars() +{ + if( isGlobalVarInitialized ) + CallExit(); + + // TODO: The application really should do this manually through a context + // otherwise it cannot properly handle script exceptions that may be + // thrown by object initializations. + return CallInit(); +} + +// interface +int asCModule::GetFunctionIdByIndex(int index) +{ + if( index < 0 || index >= (int)scriptFunctions.GetLength() ) + return asNO_FUNCTION; + + return scriptFunctions[index]->id; +} + +// internal +int asCModule::CallInit() +{ + if( isGlobalVarInitialized ) + return asERROR; + + // Each global variable needs to be cleared individually + asUINT n; + for( n = 0; n < scriptGlobals.GetLength(); n++ ) + { + if( scriptGlobals[n] ) + { + memset(scriptGlobals[n]->GetAddressOfValue(), 0, sizeof(asDWORD)*scriptGlobals[n]->type.GetSizeOnStackDWords()); + } + } + + // Call the init function for each of the global variables + asIScriptContext *ctx = 0; + int r = 0; + for( n = 0; n < scriptGlobals.GetLength() && r == 0; n++ ) + { + if( scriptGlobals[n]->initFunc ) + { + if( ctx == 0 ) + { + r = engine->CreateContext(&ctx, true); + if( r < 0 ) + break; + } + + r = ctx->Prepare(scriptGlobals[n]->initFunc->id); + if( r >= 0 ) + r = ctx->Execute(); + } + } + + if( ctx ) + { + ctx->Release(); + ctx = 0; + } + + // Even if the initialization failed we need to set the + // flag that the variables have been initialized, otherwise + // the module won't free those variables that really were + // initialized. + isGlobalVarInitialized = true; + + if( r != asEXECUTION_FINISHED ) + return asINIT_GLOBAL_VARS_FAILED; + + return asSUCCESS; +} + +// internal +void asCModule::CallExit() +{ + if( !isGlobalVarInitialized ) return; + + for( size_t n = 0; n < scriptGlobals.GetLength(); n++ ) + { + if( scriptGlobals[n]->type.IsObject() ) + { + void *obj = *(void**)scriptGlobals[n]->GetAddressOfValue(); + if( obj ) + { + asCObjectType *ot = scriptGlobals[n]->type.GetObjectType(); + + if( ot->beh.release ) + engine->CallObjectMethod(obj, ot->beh.release); + else + { + if( ot->beh.destruct ) + engine->CallObjectMethod(obj, ot->beh.destruct); + + engine->CallFree(obj); + } + } + } + } + + isGlobalVarInitialized = false; +} + +// internal +void asCModule::InternalReset() +{ + CallExit(); + + size_t n; + + // Release all global functions + for( n = 0; n < globalFunctions.GetLength(); n++ ) + { + if( globalFunctions[n] ) + globalFunctions[n]->Release(); + } + globalFunctions.SetLength(0); + + // First release all compiled functions + for( n = 0; n < scriptFunctions.GetLength(); n++ ) + { + if( scriptFunctions[n] ) + { + // Remove the module reference in the functions + scriptFunctions[n]->module = 0; + scriptFunctions[n]->Release(); + } + } + scriptFunctions.SetLength(0); + + // Release the global properties declared in the module + for( n = 0; n < scriptGlobals.GetLength(); n++ ) + scriptGlobals[n]->Release(); + scriptGlobals.SetLength(0); + + UnbindAllImportedFunctions(); + + // Free bind information + for( n = 0; n < bindInformations.GetLength(); n++ ) + { + engine->importedFunctions[bindInformations[n]->importedFunctionSignature->id & 0xFFFF] = 0 ; + + asDELETE(bindInformations[n]->importedFunctionSignature, asCScriptFunction); + asDELETE(bindInformations[n], sBindInfo); + } + bindInformations.SetLength(0); + + // Free declared types, including classes, typedefs, and enums + for( n = 0; n < classTypes.GetLength(); n++ ) + classTypes[n]->Release(); + classTypes.SetLength(0); + for( n = 0; n < enumTypes.GetLength(); n++ ) + enumTypes[n]->Release(); + enumTypes.SetLength(0); + for( n = 0; n < typeDefs.GetLength(); n++ ) + typeDefs[n]->Release(); + typeDefs.SetLength(0); +} + +// interface +int asCModule::GetFunctionIdByName(const char *name) +{ + // TODO: optimize: Improve linear search + // Find the function id + int id = -1; + for( size_t n = 0; n < globalFunctions.GetLength(); n++ ) + { + if( globalFunctions[n]->name == name ) + { + if( id == -1 ) + id = globalFunctions[n]->id; + else + return asMULTIPLE_FUNCTIONS; + } + } + + if( id == -1 ) return asNO_FUNCTION; + + return id; +} + +// interface +int asCModule::GetImportedFunctionCount() +{ + return (int)bindInformations.GetLength(); +} + +// interface +int asCModule::GetImportedFunctionIndexByDecl(const char *decl) +{ + asCBuilder bld(engine, this); + + asCScriptFunction func(engine, this, -1); + bld.ParseFunctionDeclaration(0, decl, &func, false); + + // TODO: optimize: Improve linear search + // Search script functions for matching interface + int id = -1; + for( asUINT n = 0; n < bindInformations.GetLength(); ++n ) + { + if( func.name == bindInformations[n]->importedFunctionSignature->name && + func.returnType == bindInformations[n]->importedFunctionSignature->returnType && + func.parameterTypes.GetLength() == bindInformations[n]->importedFunctionSignature->parameterTypes.GetLength() ) + { + bool match = true; + for( asUINT p = 0; p < func.parameterTypes.GetLength(); ++p ) + { + if( func.parameterTypes[p] != bindInformations[n]->importedFunctionSignature->parameterTypes[p] ) + { + match = false; + break; + } + } + + if( match ) + { + if( id == -1 ) + id = n; + else + return asMULTIPLE_FUNCTIONS; + } + } + } + + if( id == -1 ) return asNO_FUNCTION; + + return id; +} + +// interface +int asCModule::GetFunctionCount() +{ + return (int)globalFunctions.GetLength(); +} + +// interface +int asCModule::GetFunctionIdByDecl(const char *decl) +{ + asCBuilder bld(engine, this); + + asCScriptFunction func(engine, this, -1); + int r = bld.ParseFunctionDeclaration(0, decl, &func, false); + if( r < 0 ) + return asINVALID_DECLARATION; + + // TODO: optimize: Improve linear search + // Search script functions for matching interface + int id = -1; + for( size_t n = 0; n < globalFunctions.GetLength(); ++n ) + { + if( globalFunctions[n]->objectType == 0 && + func.name == globalFunctions[n]->name && + func.returnType == globalFunctions[n]->returnType && + func.parameterTypes.GetLength() == globalFunctions[n]->parameterTypes.GetLength() ) + { + bool match = true; + for( size_t p = 0; p < func.parameterTypes.GetLength(); ++p ) + { + if( func.parameterTypes[p] != globalFunctions[n]->parameterTypes[p] ) + { + match = false; + break; + } + } + + if( match ) + { + if( id == -1 ) + id = globalFunctions[n]->id; + else + return asMULTIPLE_FUNCTIONS; + } + } + } + + if( id == -1 ) return asNO_FUNCTION; + + return id; +} + +// interface +int asCModule::GetGlobalVarCount() +{ + return (int)scriptGlobals.GetLength(); +} + +// interface +int asCModule::GetGlobalVarIndexByName(const char *name) +{ + // Find the global var id + int id = -1; + for( size_t n = 0; n < scriptGlobals.GetLength(); n++ ) + { + if( scriptGlobals[n]->name == name ) + { + id = (int)n; + break; + } + } + + if( id == -1 ) return asNO_GLOBAL_VAR; + + return id; +} + +// interface +int asCModule::RemoveGlobalVar(int index) +{ + if( index < 0 || index >= (int)scriptGlobals.GetLength() ) + return asINVALID_ARG; + + scriptGlobals[index]->Release(); + scriptGlobals.RemoveIndex(index); + + return 0; +} + +// interface +asIScriptFunction *asCModule::GetFunctionDescriptorByIndex(int index) +{ + if( index < 0 || index >= (int)globalFunctions.GetLength() ) + return 0; + + return globalFunctions[index]; +} + +// interface +asIScriptFunction *asCModule::GetFunctionDescriptorById(int funcId) +{ + return engine->GetFunctionDescriptorById(funcId); +} + +// interface +int asCModule::GetGlobalVarIndexByDecl(const char *decl) +{ + asCBuilder bld(engine, this); + + asCObjectProperty gvar; + bld.ParseVariableDeclaration(decl, &gvar); + + // TODO: optimize: Improve linear search + // Search script functions for matching interface + int id = -1; + for( size_t n = 0; n < scriptGlobals.GetLength(); ++n ) + { + if( gvar.name == scriptGlobals[n]->name && + gvar.type == scriptGlobals[n]->type ) + { + id = (int)n; + break; + } + } + + if( id == -1 ) return asNO_GLOBAL_VAR; + + return id; +} + +// interface +void *asCModule::GetAddressOfGlobalVar(int index) +{ + if( index < 0 || index >= (int)scriptGlobals.GetLength() ) + return 0; + + // TODO: value types shouldn't need dereferencing + // For object variables it's necessary to dereference the pointer to get the address of the value + if( scriptGlobals[index]->type.IsObject() && !scriptGlobals[index]->type.IsObjectHandle() ) + return *(void**)(scriptGlobals[index]->GetAddressOfValue()); + + return (void*)(scriptGlobals[index]->GetAddressOfValue()); +} + +// interface +const char *asCModule::GetGlobalVarDeclaration(int index) +{ + if( index < 0 || index >= (int)scriptGlobals.GetLength() ) + return 0; + + asCGlobalProperty *prop = scriptGlobals[index]; + + asASSERT(threadManager); + asCString *tempString = &threadManager->GetLocalData()->string; + *tempString = prop->type.Format(); + *tempString += " " + prop->name; + + return tempString->AddressOf(); +} + +// interface +const char *asCModule::GetGlobalVarName(int index) +{ + if( index < 0 || index >= (int)scriptGlobals.GetLength() ) + return 0; + + return scriptGlobals[index]->name.AddressOf(); +} + +// interface +// TODO: If the typeId ever encodes the const flag, then the isConst parameter should be removed +int asCModule::GetGlobalVarTypeId(int index, bool *isConst) +{ + if( index < 0 || index >= (int)scriptGlobals.GetLength() ) + return asINVALID_ARG; + + if( isConst ) + *isConst = scriptGlobals[index]->type.IsReadOnly(); + + return engine->GetTypeIdFromDataType(scriptGlobals[index]->type); +} + +// interface +int asCModule::GetObjectTypeCount() +{ + return (int)classTypes.GetLength(); +} + +// interface +asIObjectType *asCModule::GetObjectTypeByIndex(asUINT index) +{ + if( index >= classTypes.GetLength() ) + return 0; + + return classTypes[index]; +} + +// interface +int asCModule::GetTypeIdByDecl(const char *decl) +{ + asCDataType dt; + asCBuilder bld(engine, this); + int r = bld.ParseDataType(decl, &dt); + if( r < 0 ) + return asINVALID_TYPE; + + return engine->GetTypeIdFromDataType(dt); +} + +// interface +int asCModule::GetEnumCount() +{ + return (int)enumTypes.GetLength(); +} + +// interface +const char *asCModule::GetEnumByIndex(asUINT index, int *enumTypeId) +{ + if( index >= enumTypes.GetLength() ) + return 0; + + if( enumTypeId ) + *enumTypeId = GetTypeIdByDecl(enumTypes[index]->name.AddressOf()); + + return enumTypes[index]->name.AddressOf(); +} + +// interface +int asCModule::GetEnumValueCount(int enumTypeId) +{ + const asCDataType *dt = engine->GetDataTypeFromTypeId(enumTypeId); + asCObjectType *t = dt->GetObjectType(); + if( t == 0 || !(t->GetFlags() & asOBJ_ENUM) ) + return asINVALID_TYPE; + + return (int)t->enumValues.GetLength(); +} + +// interface +const char *asCModule::GetEnumValueByIndex(int enumTypeId, asUINT index, int *outValue) +{ + const asCDataType *dt = engine->GetDataTypeFromTypeId(enumTypeId); + asCObjectType *t = dt->GetObjectType(); + if( t == 0 || !(t->GetFlags() & asOBJ_ENUM) ) + return 0; + + if( index >= t->enumValues.GetLength() ) + return 0; + + if( outValue ) + *outValue = t->enumValues[index]->value; + + return t->enumValues[index]->name.AddressOf(); +} + +// interface +int asCModule::GetTypedefCount() +{ + return (int)typeDefs.GetLength(); +} + +// interface +const char *asCModule::GetTypedefByIndex(asUINT index, int *typeId) +{ + if( index >= typeDefs.GetLength() ) + return 0; + + if( typeId ) + *typeId = GetTypeIdByDecl(typeDefs[index]->name.AddressOf()); + + return typeDefs[index]->name.AddressOf(); +} + + +// internal +int asCModule::GetNextImportedFunctionId() +{ + return FUNC_IMPORTED | (asUINT)engine->importedFunctions.GetLength(); +} + +// internal +int asCModule::AddScriptFunction(int sectionIdx, int id, const char *name, const asCDataType &returnType, asCDataType *params, asETypeModifiers *inOutFlags, int paramCount, bool isInterface, asCObjectType *objType, bool isConstMethod, bool isGlobalFunction) +{ + asASSERT(id >= 0); + + // Store the function information + asCScriptFunction *func = asNEW(asCScriptFunction)(engine, this, isInterface ? asFUNC_INTERFACE : asFUNC_SCRIPT); + func->name = name; + func->id = id; + func->returnType = returnType; + func->scriptSectionIdx = sectionIdx; + for( int n = 0; n < paramCount; n++ ) + { + func->parameterTypes.PushLast(params[n]); + func->inOutFlags.PushLast(inOutFlags[n]); + } + func->objectType = objType; + func->isReadOnly = isConstMethod; + + // The script function's refCount was initialized to 1 + scriptFunctions.PushLast(func); + engine->SetScriptFunction(func); + + // Compute the signature id + if( objType ) + func->ComputeSignatureId(); + + // Add reference + if( isGlobalFunction ) + { + globalFunctions.PushLast(func); + func->AddRef(); + } + + return 0; +} + +// internal +int asCModule::AddScriptFunction(asCScriptFunction *func) +{ + scriptFunctions.PushLast(func); + func->AddRef(); + engine->SetScriptFunction(func); + + return 0; +} + + + + +// internal +int asCModule::AddImportedFunction(int id, const char *name, const asCDataType &returnType, asCDataType *params, asETypeModifiers *inOutFlags, int paramCount, const asCString &moduleName) +{ + asASSERT(id >= 0); + + // Store the function information + asCScriptFunction *func = asNEW(asCScriptFunction)(engine, this, asFUNC_IMPORTED); + func->name = name; + func->id = id; + func->returnType = returnType; + for( int n = 0; n < paramCount; n++ ) + { + func->parameterTypes.PushLast(params[n]); + func->inOutFlags.PushLast(inOutFlags[n]); + } + func->objectType = 0; + + sBindInfo *info = asNEW(sBindInfo); + info->importedFunctionSignature = func; + info->boundFunctionId = -1; + info->importFromModule = moduleName; + bindInformations.PushLast(info); + + // Add the info to the array in the engine + engine->importedFunctions.PushLast(info); + + return 0; +} + +// internal +asCScriptFunction *asCModule::GetImportedFunction(int index) +{ + return bindInformations[index]->importedFunctionSignature; +} + +// interface +int asCModule::BindImportedFunction(int index, int sourceId) +{ + // First unbind the old function + int r = UnbindImportedFunction(index); + if( r < 0 ) return r; + + // Must verify that the interfaces are equal + asCScriptFunction *dst = GetImportedFunction(index); + if( dst == 0 ) return asNO_FUNCTION; + + asCScriptFunction *src = engine->GetScriptFunction(sourceId); + if( src == 0 ) + return asNO_FUNCTION; + + // Verify return type + if( dst->returnType != src->returnType ) + return asINVALID_INTERFACE; + + if( dst->parameterTypes.GetLength() != src->parameterTypes.GetLength() ) + return asINVALID_INTERFACE; + + for( size_t n = 0; n < dst->parameterTypes.GetLength(); ++n ) + { + if( dst->parameterTypes[n] != src->parameterTypes[n] ) + return asINVALID_INTERFACE; + } + + bindInformations[index]->boundFunctionId = sourceId; + engine->scriptFunctions[sourceId]->AddRef(); + + return asSUCCESS; +} + +// interface +int asCModule::UnbindImportedFunction(int index) +{ + if( index < 0 || index > (int)bindInformations.GetLength() ) + return asINVALID_ARG; + + // Remove reference to old module + int oldFuncID = bindInformations[index]->boundFunctionId; + if( oldFuncID != -1 ) + { + bindInformations[index]->boundFunctionId = -1; + engine->scriptFunctions[oldFuncID]->Release(); + } + + return asSUCCESS; +} + +// interface +const char *asCModule::GetImportedFunctionDeclaration(int index) +{ + asCScriptFunction *func = GetImportedFunction(index); + if( func == 0 ) return 0; + + asASSERT(threadManager); + asCString *tempString = &threadManager->GetLocalData()->string; + *tempString = func->GetDeclarationStr(); + + return tempString->AddressOf(); +} + +// interface +const char *asCModule::GetImportedFunctionSourceModule(int index) +{ + if( index >= (int)bindInformations.GetLength() ) + return 0; + + return bindInformations[index]->importFromModule.AddressOf(); +} + +// inteface +int asCModule::BindAllImportedFunctions() +{ + bool notAllFunctionsWereBound = false; + + // Bind imported functions + int c = GetImportedFunctionCount(); + for( int n = 0; n < c; ++n ) + { + asCScriptFunction *func = GetImportedFunction(n); + if( func == 0 ) return asERROR; + + asCString str = func->GetDeclarationStr(); + + // Get module name from where the function should be imported + const char *moduleName = GetImportedFunctionSourceModule(n); + if( moduleName == 0 ) return asERROR; + + asCModule *srcMod = engine->GetModule(moduleName, false); + int funcId = -1; + if( srcMod ) + funcId = srcMod->GetFunctionIdByDecl(str.AddressOf()); + + if( funcId < 0 ) + notAllFunctionsWereBound = true; + else + { + if( BindImportedFunction(n, funcId) < 0 ) + notAllFunctionsWereBound = true; + } + } + + if( notAllFunctionsWereBound ) + return asCANT_BIND_ALL_FUNCTIONS; + + return asSUCCESS; +} + +// interface +int asCModule::UnbindAllImportedFunctions() +{ + int c = GetImportedFunctionCount(); + for( int n = 0; n < c; ++n ) + UnbindImportedFunction(n); + + return asSUCCESS; +} + +// internal +asCObjectType *asCModule::GetObjectType(const char *type) +{ + size_t n; + + // TODO: optimize: Improve linear search + for( n = 0; n < classTypes.GetLength(); n++ ) + if( classTypes[n]->name == type ) + return classTypes[n]; + + for( n = 0; n < enumTypes.GetLength(); n++ ) + if( enumTypes[n]->name == type ) + return enumTypes[n]; + + for( n = 0; n < typeDefs.GetLength(); n++ ) + if( typeDefs[n]->name == type ) + return typeDefs[n]; + + return 0; +} + +// internal +asCGlobalProperty *asCModule::AllocateGlobalProperty(const char *name, const asCDataType &dt) +{ + asCGlobalProperty *prop = engine->AllocateGlobalProperty(); + prop->name = name; + + // Allocate the memory for this property based on its type + prop->type = dt; + prop->AllocateMemory(); + + // Store the variable in the module scope (the reference count is already set to 1) + scriptGlobals.PushLast(prop); + + return prop; +} + +// internal +void asCModule::ResolveInterfaceIds() +{ + // For each of the interfaces declared in the script find identical interface in the engine. + // If an identical interface was found then substitute the current id for the identical interface's id, + // then remove this interface declaration. If an interface was modified by the declaration, then + // retry the detection of identical interface for it since it may now match another. + + // For an interface to be equal to another the name and methods must match. If the interface + // references another interface, then that must be checked as well, which can lead to circular references. + + // Example: + // + // interface A { void f(B@); } + // interface B { void f(A@); void f(C@); } + // interface C { void f(A@); } + // + // A1 equals A2 if and only if B1 equals B2 + // B1 equals B2 if and only if A1 equals A2 and C1 equals C2 + // C1 equals C2 if and only if A1 equals A2 + + + unsigned int i; + + // The interface can only be equal to interfaces declared in other modules. + // Interfaces registered by the application will conflict with this one if it has the same name. + // This means that we only need to look for the interfaces in the engine->classTypes, but not in engine->objectTypes. + asCArray equals; + for( i = 0; i < classTypes.GetLength(); i++ ) + { + asCObjectType *intf1 = classTypes[i]; + if( !intf1->IsInterface() ) + continue; + + // The interface may have been determined to be equal to another already + bool found = false; + for( unsigned int e = 0; e < equals.GetLength(); e++ ) + { + if( equals[e].a == intf1 ) + { + found = true; + break; + } + } + + if( found ) + break; + + for( unsigned int n = 0; n < engine->classTypes.GetLength(); n++ ) + { + // Don't compare against self + if( engine->classTypes[n] == intf1 ) + continue; + + asCObjectType *intf2 = engine->classTypes[n]; + + // Assume the interface are equal, then validate this + sObjectTypePair pair = {intf1,intf2}; + equals.PushLast(pair); + + if( AreInterfacesEqual(intf1, intf2, equals) ) + break; + + // Since they are not equal, remove them from the list again + equals.PopLast(); + } + } + + // For each of the interfaces that have been found to be equal we need to + // remove the new declaration and instead have the module use the existing one. + for( i = 0; i < equals.GetLength(); i++ ) + { + // Substitute the old object type from the module's class types + unsigned int c; + for( c = 0; c < classTypes.GetLength(); c++ ) + { + if( classTypes[c] == equals[i].a ) + { + classTypes[c] = equals[i].b; + equals[i].b->AddRef(); + break; + } + } + + // Remove the old object type from the engine's class types + for( c = 0; c < engine->classTypes.GetLength(); c++ ) + { + if( engine->classTypes[c] == equals[i].a ) + { + engine->classTypes[c] = engine->classTypes[engine->classTypes.GetLength()-1]; + engine->classTypes.PopLast(); + break; + } + } + + // Substitute all uses of this object type + // Only interfaces in the module is using the type so far + for( c = 0; c < classTypes.GetLength(); c++ ) + { + if( classTypes[c]->IsInterface() ) + { + asCObjectType *intf = classTypes[c]; + for( int m = 0; m < intf->GetMethodCount(); m++ ) + { + asCScriptFunction *func = engine->GetScriptFunction(intf->methods[m]); + if( func ) + { + if( func->returnType.GetObjectType() == equals[i].a ) + func->returnType.SetObjectType(equals[i].b); + + for( int p = 0; p < func->GetParamCount(); p++ ) + { + if( func->parameterTypes[p].GetObjectType() == equals[i].a ) + func->parameterTypes[p].SetObjectType(equals[i].b); + } + } + } + } + } + + // Substitute all interface methods in the module. Delete all methods for the old interface + for( unsigned int m = 0; m < equals[i].a->methods.GetLength(); m++ ) + { + for( c = 0; c < scriptFunctions.GetLength(); c++ ) + { + if( scriptFunctions[c]->id == equals[i].a->methods[m] ) + { + scriptFunctions[c]->Release(); + + scriptFunctions[c] = engine->GetScriptFunction(equals[i].b->methods[m]); + scriptFunctions[c]->AddRef(); + } + } + } + + // Deallocate the object type + asDELETE(equals[i].a, asCObjectType); + } +} + +// internal +bool asCModule::AreInterfacesEqual(asCObjectType *a, asCObjectType *b, asCArray &equals) +{ + // An interface is considered equal to another if the following criterias apply: + // + // - The interface names are equal + // - The number of methods is equal + // - All the methods are equal + // - The order of the methods is equal + // - If a method returns or takes an interface by handle or reference, both interfaces must be equal + + + // ------------ + // TODO: Study the possiblity of allowing interfaces where methods are declared in different orders to + // be considered equal. The compiler and VM can handle this, but it complicates the comparison of interfaces + // where multiple methods take different interfaces as parameters (or return values). Example: + // + // interface A + // { + // void f(B, C); + // void f(B); + // void f(C); + // } + // + // If 'void f(B)' in module A is compared against 'void f(C)' in module B, then the code will assume + // interface B in module A equals interface C in module B. Thus 'void f(B, C)' in module A won't match + // 'void f(C, B)' in module B. + // ------------ + + + // Are both interfaces? + if( !a->IsInterface() || !b->IsInterface() ) + return false; + + // Are the names equal? + if( a->name != b->name ) + return false; + + // Are the number of methods equal? + if( a->methods.GetLength() != b->methods.GetLength() ) + return false; + + // Keep the number of equals in the list so we can restore it later if necessary + int prevEquals = (int)equals.GetLength(); + + // Are the methods equal to each other? + bool match = true; + for( unsigned int n = 0; n < a->methods.GetLength(); n++ ) + { + match = false; + + asCScriptFunction *funcA = (asCScriptFunction*)engine->GetFunctionDescriptorById(a->methods[n]); + asCScriptFunction *funcB = (asCScriptFunction*)engine->GetFunctionDescriptorById(b->methods[n]); + + // funcB can be null if the module that created the interface has been + // discarded but the type has not yet been released by the engine. + if( funcB == 0 ) + break; + + // The methods must have the same name and the same number of parameters + if( funcA->name != funcB->name || + funcA->parameterTypes.GetLength() != funcB->parameterTypes.GetLength() ) + break; + + // The return types must be equal. If the return type is an interface the interfaces must match. + if( !AreTypesEqual(funcA->returnType, funcB->returnType, equals) ) + break; + + match = true; + for( unsigned int p = 0; p < funcA->parameterTypes.GetLength(); p++ ) + { + if( !AreTypesEqual(funcA->parameterTypes[p], funcB->parameterTypes[p], equals) || + funcA->inOutFlags[p] != funcB->inOutFlags[p] ) + { + match = false; + break; + } + } + + if( !match ) + break; + } + + // For each of the new interfaces that we're assuming to be equal, we need to validate this + if( match ) + { + for( unsigned int n = prevEquals; n < equals.GetLength(); n++ ) + { + if( !AreInterfacesEqual(equals[n].a, equals[n].b, equals) ) + { + match = false; + break; + } + } + } + + if( !match ) + { + // The interfaces doesn't match. + // Restore the list of previous equals before we go on, so + // the caller can continue comparing with another interface + equals.SetLength(prevEquals); + } + + return match; +} + +// internal +bool asCModule::AreTypesEqual(const asCDataType &a, const asCDataType &b, asCArray &equals) +{ + if( !a.IsEqualExceptInterfaceType(b) ) + return false; + + asCObjectType *ai = a.GetObjectType(); + asCObjectType *bi = b.GetObjectType(); + + if( ai && ai->IsInterface() ) + { + // If the interface is in the equals list, then the pair must match the pair in the list + bool found = false; + unsigned int e; + for( e = 0; e < equals.GetLength(); e++ ) + { + if( equals[e].a == ai ) + { + found = true; + break; + } + } + + if( found ) + { + // Do the pairs match? + if( equals[e].b != bi ) + return false; + } + else + { + // Assume they are equal from now on + sObjectTypePair pair = {ai, bi}; + equals.PushLast(pair); + } + } + + return true; +} + +// interface +int asCModule::SaveByteCode(asIBinaryStream *out) +{ + if( out == 0 ) return asINVALID_ARG; + + asCRestore rest(this, out, engine); + return rest.Save(); +} + +// interface +int asCModule::LoadByteCode(asIBinaryStream *in) +{ + if( in == 0 ) return asINVALID_ARG; + + // Only permit loading bytecode if no other thread is currently compiling + int r = engine->RequestBuild(); + if( r < 0 ) + return r; + + asCRestore rest(this, in, engine); + r = rest.Restore(); + + JITCompile(); + + engine->BuildCompleted(); + + return r; +} + +// interface +int asCModule::CompileGlobalVar(const char *sectionName, const char *code, int lineOffset) +{ + // Validate arguments + if( code == 0 ) + return asINVALID_ARG; + + // Only one thread may build at one time + int r = engine->RequestBuild(); + if( r < 0 ) + return r; + + // Prepare the engine + engine->PrepareEngine(); + if( engine->configFailed ) + { + engine->WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_INVALID_CONFIGURATION); + engine->BuildCompleted(); + return asINVALID_CONFIGURATION; + } + + // Compile the global variable and add it to the module scope + asCBuilder builder(engine, this); + asCString str = code; + r = builder.CompileGlobalVar(sectionName, str.AddressOf(), lineOffset); + + engine->BuildCompleted(); + + // Initialize the variable + if( r >= 0 && engine->ep.initGlobalVarsAfterBuild ) + { + // Clear the memory + asCGlobalProperty *prop = scriptGlobals[scriptGlobals.GetLength()-1]; + memset(prop->GetAddressOfValue(), 0, sizeof(asDWORD)*prop->type.GetSizeOnStackDWords()); + + if( prop->initFunc ) + { + // Call the init function for the global variable + asIScriptContext *ctx = 0; + int r = engine->CreateContext(&ctx, true); + if( r < 0 ) + return r; + + r = ctx->Prepare(prop->initFunc->id); + if( r >= 0 ) + r = ctx->Execute(); + + ctx->Release(); + } + } + + return r; +} + +// interface +int asCModule::CompileFunction(const char *sectionName, const char *code, int lineOffset, asDWORD compileFlags, asIScriptFunction **outFunc) +{ + asASSERT(outFunc == 0 || *outFunc == 0); + + // Validate arguments + if( code == 0 || + (compileFlags != 0 && compileFlags != asCOMP_ADD_TO_MODULE) ) + return asINVALID_ARG; + + // Only one thread may build at one time + int r = engine->RequestBuild(); + if( r < 0 ) + return r; + + // Prepare the engine + engine->PrepareEngine(); + if( engine->configFailed ) + { + engine->WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_INVALID_CONFIGURATION); + engine->BuildCompleted(); + return asINVALID_CONFIGURATION; + } + + // Compile the single function + asCBuilder builder(engine, this); + asCString str = code; + asCScriptFunction *func = 0; + r = builder.CompileFunction(sectionName, str.AddressOf(), lineOffset, compileFlags, &func); + + engine->BuildCompleted(); + + if( r >= 0 && outFunc ) + { + // Return the function to the caller + *outFunc = func; + func->AddRef(); + } + + // Release our reference to the function + if( func ) + func->Release(); + + return r; +} + +// interface +int asCModule::RemoveFunction(int funcId) +{ + // Find the global function + for( asUINT n = 0; n < globalFunctions.GetLength(); n++ ) + { + if( globalFunctions[n] && globalFunctions[n]->id == funcId ) + { + asCScriptFunction *func = globalFunctions[n]; + globalFunctions.RemoveIndex(n); + func->Release(); + + scriptFunctions.RemoveValue(func); + func->Release(); + + return 0; + } + } + + return asNO_FUNCTION; +} + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_module.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_module.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_module.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_module.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,213 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + + +// +// as_module.h +// +// A class that holds a script module +// + +#ifndef AS_MODULE_H +#define AS_MODULE_H + +#include "as_config.h" +#include "as_atomic.h" +#include "as_string.h" +#include "as_array.h" +#include "as_datatype.h" +#include "as_scriptfunction.h" +#include "as_property.h" + +BEGIN_AS_NAMESPACE + +// TODO: import: Remove this when the imported functions are removed +const int FUNC_IMPORTED = 0x40000000; + +class asCScriptEngine; +class asCCompiler; +class asCBuilder; +class asCContext; +class asCConfigGroup; + +struct sBindInfo +{ + asCScriptFunction *importedFunctionSignature; + asCString importFromModule; + int boundFunctionId; +}; + +struct sObjectTypePair +{ + asCObjectType *a; + asCObjectType *b; +}; + +// TODO: import: Remove function imports. When I have implemented function +// pointers the function imports should be deprecated. + +// TODO: Need a separate interface for compiling scripts. The asIScriptCompiler +// will have a target module, and will allow the compilation of an entire +// script or just individual functions within the scope of the module +// +// With this separation it will be possible to compile the library without +// the compiler, thus giving a much smaller binary executable. + + +class asCModule : public asIScriptModule +{ +//------------------------------------------- +// Public interface +//-------------------------------------------- +public: + virtual asIScriptEngine *GetEngine(); + virtual void SetName(const char *name); + virtual const char *GetName(); + + // Compilation + virtual int AddScriptSection(const char *name, const char *code, size_t codeLength, int lineOffset); + virtual int Build(); + virtual int CompileFunction(const char *sectionName, const char *code, int lineOffset, asDWORD reserved, asIScriptFunction **outFunc); + virtual int CompileGlobalVar(const char *sectionName, const char *code, int lineOffset); + + // Script functions + virtual int GetFunctionCount(); + virtual int GetFunctionIdByIndex(int index); + virtual int GetFunctionIdByName(const char *name); + virtual int GetFunctionIdByDecl(const char *decl); + virtual asIScriptFunction *GetFunctionDescriptorByIndex(int index); + virtual asIScriptFunction *GetFunctionDescriptorById(int funcId); + virtual int RemoveFunction(int funcId); + + // Script global variables + virtual int ResetGlobalVars(); + virtual int GetGlobalVarCount(); + virtual int GetGlobalVarIndexByName(const char *name); + virtual int GetGlobalVarIndexByDecl(const char *decl); + virtual const char *GetGlobalVarDeclaration(int index); + virtual const char *GetGlobalVarName(int index); + virtual int GetGlobalVarTypeId(int index, bool *isConst); + virtual void *GetAddressOfGlobalVar(int index); + virtual int RemoveGlobalVar(int index); + + // Type identification + virtual int GetObjectTypeCount(); + virtual asIObjectType *GetObjectTypeByIndex(asUINT index); + virtual int GetTypeIdByDecl(const char *decl); + + // Enums + virtual int GetEnumCount(); + virtual const char *GetEnumByIndex(asUINT index, int *enumTypeId); + virtual int GetEnumValueCount(int enumTypeId); + virtual const char *GetEnumValueByIndex(int enumTypeId, asUINT index, int *outValue); + + // Typedefs + virtual int GetTypedefCount(); + virtual const char *GetTypedefByIndex(asUINT index, int *typeId); + + // Dynamic binding between modules + virtual int GetImportedFunctionCount(); + virtual int GetImportedFunctionIndexByDecl(const char *decl); + virtual const char *GetImportedFunctionDeclaration(int importIndex); + virtual const char *GetImportedFunctionSourceModule(int importIndex); + virtual int BindImportedFunction(int index, int sourceID); + virtual int UnbindImportedFunction(int importIndex); + virtual int BindAllImportedFunctions(); + virtual int UnbindAllImportedFunctions(); + + // Bytecode Saving/Loading + virtual int SaveByteCode(asIBinaryStream *out); + virtual int LoadByteCode(asIBinaryStream *in); + +//----------------------------------------------- +// Internal +//----------------------------------------------- + asCModule(const char *name, asCScriptEngine *engine); + ~asCModule(); + +//protected: + friend class asCScriptEngine; + friend class asCBuilder; + friend class asCCompiler; + friend class asCContext; + friend class asCRestore; + + void InternalReset(); + + int CallInit(); + void CallExit(); + + void JITCompile(); + + int AddScriptFunction(int sectionIdx, int id, const char *name, const asCDataType &returnType, asCDataType *params, asETypeModifiers *inOutFlags, int paramCount, bool isInterface, asCObjectType *objType = 0, bool isConstMethod = false, bool isGlobalFunction = false); + int AddScriptFunction(asCScriptFunction *func); + int AddImportedFunction(int id, const char *name, const asCDataType &returnType, asCDataType *params, asETypeModifiers *inOutFlags, int paramCount, const asCString &moduleName); + + int GetNextImportedFunctionId(); + + void ResolveInterfaceIds(); + bool AreInterfacesEqual(asCObjectType *a, asCObjectType *b, asCArray &equals); + bool AreTypesEqual(const asCDataType &a, const asCDataType &b, asCArray &equals); + + asCScriptFunction *GetImportedFunction(int funcId); + + asCObjectType *GetObjectType(const char *type); + + asCGlobalProperty *AllocateGlobalProperty(const char *name, const asCDataType &dt); + + + asCString name; + + asCScriptEngine *engine; + asCBuilder *builder; + + // This array holds all functions, class members, factories, etc that were compiled with the module + asCArray scriptFunctions; + // This array holds global functions declared in the module + asCArray globalFunctions; + // This array holds imported functions in the module + asCArray bindInformations; + + // This array holds the global variables declared in the script + asCArray scriptGlobals; + bool isGlobalVarInitialized; + + // This array holds class and interface types + asCArray classTypes; + // This array holds enum types + asCArray enumTypes; + // This array holds typedefs + asCArray typeDefs; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_objecttype.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_objecttype.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_objecttype.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_objecttype.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,670 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_objecttype.cpp +// +// A class for storing object type information +// + + +#include + +#include "as_config.h" +#include "as_objecttype.h" +#include "as_configgroup.h" +#include "as_scriptengine.h" + +BEGIN_AS_NAMESPACE + +#ifdef AS_MAX_PORTABILITY + +static void ObjectType_AddRef_Generic(asIScriptGeneric *gen) +{ + asCObjectType *self = (asCObjectType*)gen->GetObject(); + self->AddRef(); +} + +static void ObjectType_Release_Generic(asIScriptGeneric *gen) +{ + asCObjectType *self = (asCObjectType*)gen->GetObject(); + self->Release(); +} + +static void ObjectType_GetRefCount_Generic(asIScriptGeneric *gen) +{ + asCObjectType *self = (asCObjectType*)gen->GetObject(); + *(int*)gen->GetAddressOfReturnLocation() = self->GetRefCount(); +} + +static void ObjectType_SetGCFlag_Generic(asIScriptGeneric *gen) +{ + asCObjectType *self = (asCObjectType*)gen->GetObject(); + self->SetGCFlag(); +} + +static void ObjectType_GetGCFlag_Generic(asIScriptGeneric *gen) +{ + asCObjectType *self = (asCObjectType*)gen->GetObject(); + *(bool*)gen->GetAddressOfReturnLocation() = self->GetGCFlag(); +} + +static void ObjectType_EnumReferences_Generic(asIScriptGeneric *gen) +{ + asCObjectType *self = (asCObjectType*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->EnumReferences(engine); +} + +static void ObjectType_ReleaseAllHandles_Generic(asIScriptGeneric *gen) +{ + asCObjectType *self = (asCObjectType*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->ReleaseAllHandles(engine); +} + +#endif + + +void RegisterObjectTypeGCBehaviours(asCScriptEngine *engine) +{ + // Register the gc behaviours for the object types + int r; + engine->objectTypeBehaviours.engine = engine; + engine->objectTypeBehaviours.flags = asOBJ_REF | asOBJ_GC; + engine->objectTypeBehaviours.name = "_builtin_objecttype_"; +#ifndef AS_MAX_PORTABILITY + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_ADDREF, "void f()", asMETHOD(asCObjectType,AddRef), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_RELEASE, "void f()", asMETHOD(asCObjectType,Release), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_GETREFCOUNT, "int f()", asMETHOD(asCObjectType,GetRefCount), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_SETGCFLAG, "void f()", asMETHOD(asCObjectType,SetGCFlag), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_GETGCFLAG, "bool f()", asMETHOD(asCObjectType,GetGCFlag), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_ENUMREFS, "void f(int&in)", asMETHOD(asCObjectType,EnumReferences), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_RELEASEREFS, "void f(int&in)", asMETHOD(asCObjectType,ReleaseAllHandles), asCALL_THISCALL); asASSERT( r >= 0 ); +#else + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_ADDREF, "void f()", asFUNCTION(ObjectType_AddRef_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_RELEASE, "void f()", asFUNCTION(ObjectType_Release_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_GETREFCOUNT, "int f()", asFUNCTION(ObjectType_GetRefCount_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_SETGCFLAG, "void f()", asFUNCTION(ObjectType_SetGCFlag_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_GETGCFLAG, "bool f()", asFUNCTION(ObjectType_GetGCFlag_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_ENUMREFS, "void f(int&in)", asFUNCTION(ObjectType_EnumReferences_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->objectTypeBehaviours, asBEHAVE_RELEASEREFS, "void f(int&in)", asFUNCTION(ObjectType_ReleaseAllHandles_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); +#endif +} + +asCObjectType::asCObjectType() +{ + engine = 0; + refCount.set(0); + derivedFrom = 0; + + acceptValueSubType = true; + acceptRefSubType = true; +} + +asCObjectType::asCObjectType(asCScriptEngine *engine) +{ + this->engine = engine; + refCount.set(0); + derivedFrom = 0; + + acceptValueSubType = true; + acceptRefSubType = true; +} + +int asCObjectType::AddRef() +{ + gcFlag = false; + return refCount.atomicInc(); +} + +int asCObjectType::Release() +{ + gcFlag = false; + return refCount.atomicDec(); +} + +int asCObjectType::GetRefCount() +{ + return refCount.get(); +} + +bool asCObjectType::GetGCFlag() +{ + return gcFlag; +} + +void asCObjectType::SetGCFlag() +{ + gcFlag = true; +} + +asCObjectType::~asCObjectType() +{ + // Release the object type held by the templateSubType + if( templateSubType.GetObjectType() ) + templateSubType.GetObjectType()->Release(); + + if( derivedFrom ) + derivedFrom->Release(); + + asUINT n; + for( n = 0; n < properties.GetLength(); n++ ) + if( properties[n] ) + { + if( flags & asOBJ_SCRIPT_OBJECT ) + { + // Release the config group for script classes that are being destroyed + asCConfigGroup *group = engine->FindConfigGroupForObjectType(properties[n]->type.GetObjectType()); + if( group != 0 ) group->Release(); + } + + asDELETE(properties[n],asCObjectProperty); + } + + properties.SetLength(0); + + ReleaseAllFunctions(); + + for( n = 0; n < enumValues.GetLength(); n++ ) + { + if( enumValues[n] ) + asDELETE(enumValues[n],asSEnumValue); + } + + enumValues.SetLength(0); +} + +bool asCObjectType::Implements(const asCObjectType *objType) const +{ + if( this == objType ) + return true; + + for( asUINT n = 0; n < interfaces.GetLength(); n++ ) + if( interfaces[n] == objType ) return true; + + return false; +} + +bool asCObjectType::DerivesFrom(const asCObjectType *objType) const +{ + if( this == objType ) + return true; + + asCObjectType *base = derivedFrom; + while( base ) + { + if( base == objType ) + return true; + + base = base->derivedFrom; + } + + return false; +} + +// interface +const char *asCObjectType::GetName() const +{ + return name.AddressOf(); +} + +// interface +asDWORD asCObjectType::GetFlags() const +{ + return flags; +} + +// interface +asUINT asCObjectType::GetSize() const +{ + return size; +} + +// interface +int asCObjectType::GetTypeId() const +{ + // We need a non const pointer to create the asCDataType object. + // We're not breaking anything here because this function is not + // modifying the object, so this const cast is safe. + asCObjectType *ot = const_cast(this); + + return engine->GetTypeIdFromDataType(asCDataType::CreateObject(ot, false)); +} + +// interface +int asCObjectType::GetSubTypeId() const +{ + // TODO: template: This method should allow indexing multiple template subtypes + + if( flags & asOBJ_TEMPLATE ) + { + return engine->GetTypeIdFromDataType(templateSubType); + } + + // Only template types have sub types + return asERROR; +} + +int asCObjectType::GetInterfaceCount() const +{ + return (int)interfaces.GetLength(); +} + +asIObjectType *asCObjectType::GetInterface(asUINT index) const +{ + assert(index < interfaces.GetLength()); + + return interfaces[index]; +} + +// internal +bool asCObjectType::IsInterface() const +{ + if( (flags & asOBJ_SCRIPT_OBJECT) && size == 0 ) + return true; + + return false; +} + +asIScriptEngine *asCObjectType::GetEngine() const +{ + return engine; +} + +int asCObjectType::GetFactoryCount() const +{ + return (int)beh.factories.GetLength(); +} + +int asCObjectType::GetFactoryIdByIndex(int index) const +{ + if( index < 0 || (unsigned)index >= beh.factories.GetLength() ) + return asINVALID_ARG; + + return beh.factories[index]; +} + +int asCObjectType::GetFactoryIdByDecl(const char *decl) const +{ + if( beh.factories.GetLength() == 0 ) + return asNO_FUNCTION; + + // Let the engine parse the string and find the appropriate factory function + return engine->GetFactoryIdByDecl(this, decl); +} + +int asCObjectType::GetMethodCount() const +{ + return (int)methods.GetLength(); +} + +int asCObjectType::GetMethodIdByIndex(int index) const +{ + if( index < 0 || (unsigned)index >= methods.GetLength() ) + return asINVALID_ARG; + + return methods[index]; +} + +int asCObjectType::GetMethodIdByName(const char *name) const +{ + int id = -1; + for( size_t n = 0; n < methods.GetLength(); n++ ) + { + if( engine->scriptFunctions[methods[n]]->name == name ) + { + if( id == -1 ) + id = methods[n]; + else + return asMULTIPLE_FUNCTIONS; + } + } + + if( id == -1 ) return asNO_FUNCTION; + + return id; +} + +int asCObjectType::GetMethodIdByDecl(const char *decl) const +{ + // Get the module from one of the methods + if( methods.GetLength() == 0 ) + return asNO_FUNCTION; + + asCModule *mod = engine->scriptFunctions[methods[0]]->module; + if( mod == 0 ) + { + if( engine->scriptFunctions[methods[0]]->funcType == asFUNC_INTERFACE ) + return engine->GetMethodIdByDecl(this, decl, 0); + + return asNO_MODULE; + } + + return engine->GetMethodIdByDecl(this, decl, mod); +} + +asIScriptFunction *asCObjectType::GetMethodDescriptorByIndex(int index) const +{ + if( index < 0 || (unsigned)index >= methods.GetLength() ) + return 0; + + return engine->scriptFunctions[methods[index]]; +} + +int asCObjectType::GetPropertyCount() const +{ + return (int)properties.GetLength(); +} + +int asCObjectType::GetPropertyTypeId(asUINT prop) const +{ + if( prop >= properties.GetLength() ) + return asINVALID_ARG; + + return engine->GetTypeIdFromDataType(properties[prop]->type); +} + +const char *asCObjectType::GetPropertyName(asUINT prop) const +{ + if( prop >= properties.GetLength() ) + return 0; + + return properties[prop]->name.AddressOf(); +} + +asIObjectType *asCObjectType::GetBaseType() const +{ + return derivedFrom; +} + +int asCObjectType::GetPropertyOffset(asUINT prop) const +{ + if( prop >= properties.GetLength() ) + return 0; + + return properties[prop]->byteOffset; +} + +int asCObjectType::GetBehaviourCount() const +{ + // Count the number of behaviours (except factory functions) + int count = 0; + + if( beh.destruct ) count++; + if( beh.addref ) count++; + if( beh.release ) count++; + if( beh.gcGetRefCount ) count++; + if( beh.gcSetFlag ) count++; + if( beh.gcGetFlag ) count++; + if( beh.gcEnumReferences ) count++; + if( beh.gcReleaseAllReferences ) count++; + if( beh.templateCallback ) count++; + + count += (int)beh.constructors.GetLength(); + count += (int)beh.operators.GetLength() / 2; + + return count; +} + +int asCObjectType::GetBehaviourByIndex(asUINT index, asEBehaviours *outBehaviour) const +{ + // Find the correct behaviour + int count = 0; + + if( beh.destruct && count++ == (int)index ) // only increase count if the behaviour is registered + { + if( outBehaviour ) *outBehaviour = asBEHAVE_DESTRUCT; + return beh.destruct; + } + + if( beh.addref && count++ == (int)index ) + { + if( outBehaviour ) *outBehaviour = asBEHAVE_ADDREF; + return beh.addref; + } + + if( beh.release && count++ == (int)index ) + { + if( outBehaviour ) *outBehaviour = asBEHAVE_RELEASE; + return beh.release; + } + + if( beh.gcGetRefCount && count++ == (int)index ) + { + if( outBehaviour ) *outBehaviour = asBEHAVE_GETREFCOUNT; + return beh.gcGetRefCount; + } + + if( beh.gcSetFlag && count++ == (int)index ) + { + if( outBehaviour ) *outBehaviour = asBEHAVE_SETGCFLAG; + return beh.gcSetFlag; + } + + if( beh.gcGetFlag && count++ == (int)index ) + { + if( outBehaviour ) *outBehaviour = asBEHAVE_GETGCFLAG; + return beh.gcGetFlag; + } + + if( beh.gcEnumReferences && count++ == (int)index ) + { + if( outBehaviour ) *outBehaviour = asBEHAVE_ENUMREFS; + return beh.gcEnumReferences; + } + + if( beh.gcReleaseAllReferences && count++ == (int)index ) + { + if( outBehaviour ) *outBehaviour = asBEHAVE_RELEASEREFS; + return beh.gcReleaseAllReferences; + } + + if( beh.templateCallback && count++ == (int)index ) + { + if( outBehaviour ) *outBehaviour = asBEHAVE_TEMPLATE_CALLBACK; + return beh.templateCallback; + } + + if( index - count < beh.constructors.GetLength() ) + { + if( outBehaviour ) *outBehaviour = asBEHAVE_CONSTRUCT; + return beh.constructors[index - count]; + } + else + count += (int)beh.constructors.GetLength(); + + if( index - count < beh.operators.GetLength() / 2 ) + { + index = 2*(index - count); + + if( outBehaviour ) *outBehaviour = static_cast(beh.operators[index]); + return beh.operators[index + 1]; + } + + return asINVALID_ARG; +} + +// interface +const char *asCObjectType::GetConfigGroup() const +{ + asCConfigGroup *group = engine->FindConfigGroupForObjectType(this); + if( group == 0 ) + return 0; + + return group->groupName.AddressOf(); +} + +// internal +void asCObjectType::ReleaseAllHandles(asIScriptEngine *) +{ + ReleaseAllFunctions(); +} + +// internal +void asCObjectType::ReleaseAllFunctions() +{ + beh.factory = 0; + for( asUINT a = 0; a < beh.factories.GetLength(); a++ ) + { + if( engine->scriptFunctions[beh.factories[a]] ) + engine->scriptFunctions[beh.factories[a]]->Release(); + } + beh.factories.SetLength(0); + + beh.construct = 0; + for( asUINT b = 0; b < beh.constructors.GetLength(); b++ ) + { + if( engine->scriptFunctions[beh.constructors[b]] ) + engine->scriptFunctions[beh.constructors[b]]->Release(); + } + beh.constructors.SetLength(0); + + if( beh.templateCallback ) + engine->scriptFunctions[beh.templateCallback]->Release(); + beh.templateCallback = 0; + + if( beh.destruct ) + engine->scriptFunctions[beh.destruct]->Release(); + beh.destruct = 0; + + if( beh.addref ) + engine->scriptFunctions[beh.addref]->Release(); + beh.addref = 0; + + if( beh.release ) + engine->scriptFunctions[beh.release]->Release(); + beh.release = 0; + + if( beh.copy ) + engine->scriptFunctions[beh.copy]->Release(); + beh.copy = 0; + + if( beh.gcEnumReferences ) + engine->scriptFunctions[beh.gcEnumReferences]->Release(); + beh.gcEnumReferences = 0; + + if( beh.gcGetFlag ) + engine->scriptFunctions[beh.gcGetFlag]->Release(); + beh.gcGetFlag = 0; + + if( beh.gcGetRefCount ) + engine->scriptFunctions[beh.gcGetRefCount]->Release(); + beh.gcGetRefCount = 0; + + if( beh.gcReleaseAllReferences ) + engine->scriptFunctions[beh.gcReleaseAllReferences]->Release(); + beh.gcReleaseAllReferences = 0; + + if( beh.gcSetFlag ) + engine->scriptFunctions[beh.gcSetFlag]->Release(); + beh.gcSetFlag = 0; + + for( asUINT e = 1; e < beh.operators.GetLength(); e += 2 ) + { + if( engine->scriptFunctions[beh.operators[e]] ) + engine->scriptFunctions[beh.operators[e]]->Release(); + } + beh.operators.SetLength(0); + + for( asUINT c = 0; c < methods.GetLength(); c++ ) + { + if( engine->scriptFunctions[methods[c]] ) + engine->scriptFunctions[methods[c]]->Release(); + } + methods.SetLength(0); + + for( asUINT d = 0; d < virtualFunctionTable.GetLength(); d++ ) + { + if( virtualFunctionTable[d] ) + virtualFunctionTable[d]->Release(); + } + virtualFunctionTable.SetLength(0); +} + +// internal +void asCObjectType::EnumReferences(asIScriptEngine *) +{ + for( asUINT a = 0; a < beh.factories.GetLength(); a++ ) + if( engine->scriptFunctions[beh.factories[a]] ) + engine->GCEnumCallback(engine->scriptFunctions[beh.factories[a]]); + + for( asUINT b = 0; b < beh.constructors.GetLength(); b++ ) + if( engine->scriptFunctions[beh.constructors[b]] ) + engine->GCEnumCallback(engine->scriptFunctions[beh.constructors[b]]); + + if( beh.templateCallback ) + engine->GCEnumCallback(engine->scriptFunctions[beh.templateCallback]); + + if( beh.destruct ) + engine->GCEnumCallback(engine->scriptFunctions[beh.destruct]); + + if( beh.addref ) + engine->GCEnumCallback(engine->scriptFunctions[beh.addref]); + + if( beh.release ) + engine->GCEnumCallback(engine->scriptFunctions[beh.release]); + + if( beh.copy ) + engine->GCEnumCallback(engine->scriptFunctions[beh.copy]); + + if( beh.gcEnumReferences ) + engine->GCEnumCallback(engine->scriptFunctions[beh.gcEnumReferences]); + + if( beh.gcGetFlag ) + engine->GCEnumCallback(engine->scriptFunctions[beh.gcGetFlag]); + + if( beh.gcGetRefCount ) + engine->GCEnumCallback(engine->scriptFunctions[beh.gcGetRefCount]); + + if( beh.gcReleaseAllReferences ) + engine->GCEnumCallback(engine->scriptFunctions[beh.gcReleaseAllReferences]); + + if( beh.gcSetFlag ) + engine->GCEnumCallback(engine->scriptFunctions[beh.gcSetFlag]); + + for( asUINT e = 1; e < beh.operators.GetLength(); e += 2 ) + if( engine->scriptFunctions[beh.operators[e]] ) + engine->GCEnumCallback(engine->scriptFunctions[beh.operators[e]]); + + for( asUINT c = 0; c < methods.GetLength(); c++ ) + if( engine->scriptFunctions[methods[c]] ) + engine->GCEnumCallback(engine->scriptFunctions[methods[c]]); + + for( asUINT d = 0; d < virtualFunctionTable.GetLength(); d++ ) + if( virtualFunctionTable[d] ) + engine->GCEnumCallback(virtualFunctionTable[d]); +} + +END_AS_NAMESPACE + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_objecttype.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_objecttype.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_objecttype.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_objecttype.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,220 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + + +// +// as_objecttype.h +// +// A class for storing object type information +// + + + +#ifndef AS_OBJECTTYPE_H +#define AS_OBJECTTYPE_H + +#include "as_atomic.h" +#include "as_string.h" +#include "as_property.h" +#include "as_array.h" +#include "as_scriptfunction.h" + +BEGIN_AS_NAMESPACE + +// TODO: memory: Need to minimize used memory here, because not all types use all properties of the class + +// TODO: The type id should have flags for diferenciating between value types and reference types. It should also have a flag for differenciating interface types. + +// Additional flag to the class object type +const asDWORD asOBJ_IMPLICIT_HANDLE = 0x40000; +const asDWORD asOBJ_TYPEDEF = 0x40000000; +const asDWORD asOBJ_ENUM = 0x10000000; +const asDWORD asOBJ_TEMPLATE_SUBTYPE = 0x20000000; + + + + +// asOBJ_GC is used to indicate that the type can potentially +// form circular references, thus is garbage collected. + +// The fact that an object is garbage collected doesn't imply that an object that +// can references it also must be garbage collected, only if the garbage collected +// object can reference it as well. + +// For registered types however, we set the flag asOBJ_GC if the GC +// behaviours are registered. For script types that contain any such type we +// automatically make garbage collected as well, because we cannot know what type +// of references that object can contain, and must assume the worst. + + +struct asSTypeBehaviour +{ + asSTypeBehaviour() + { + factory = 0; + construct = 0; + destruct = 0; + copy = 0; + addref = 0; + release = 0; + gcGetRefCount = 0; + gcSetFlag = 0; + gcGetFlag = 0; + gcEnumReferences = 0; + gcReleaseAllReferences = 0; + templateCallback = 0; + } + + int factory; + int construct; + int destruct; + int copy; + int addref; + int release; + int templateCallback; + + // GC behaviours + int gcGetRefCount; + int gcSetFlag; + int gcGetFlag; + int gcEnumReferences; + int gcReleaseAllReferences; + + asCArray factories; + asCArray constructors; + asCArray operators; +}; + +struct asSEnumValue +{ + asCString name; + int value; +}; + +class asCScriptEngine; + +void RegisterObjectTypeGCBehaviours(asCScriptEngine *engine); + +class asCObjectType : public asIObjectType +{ +public: +//===================================== +// From asIObjectType +//===================================== + asIScriptEngine *GetEngine() const; + const char *GetConfigGroup() const; + + // Memory management + int AddRef(); + int Release(); + + // Type info + const char *GetName() const; + asIObjectType *GetBaseType() const; + asDWORD GetFlags() const; + asUINT GetSize() const; + int GetTypeId() const; + int GetSubTypeId() const; + + // Behaviours + int GetBehaviourCount() const; + int GetBehaviourByIndex(asUINT index, asEBehaviours *outBehaviour) const; + + // Interfaces + int GetInterfaceCount() const; + asIObjectType *GetInterface(asUINT index) const; + + // Factories + int GetFactoryCount() const; + int GetFactoryIdByIndex(int index) const; + int GetFactoryIdByDecl(const char *decl) const; + + // Methods + int GetMethodCount() const; + int GetMethodIdByIndex(int index) const; + int GetMethodIdByName(const char *name) const; + int GetMethodIdByDecl(const char *decl) const; + asIScriptFunction *GetMethodDescriptorByIndex(int index) const; + + // Properties + int GetPropertyCount() const; + int GetPropertyTypeId(asUINT prop) const; + const char *GetPropertyName(asUINT prop) const; + int GetPropertyOffset(asUINT prop) const; + +//=========================================== +// Internal +//=========================================== +public: + asCObjectType(); + asCObjectType(asCScriptEngine *engine); + ~asCObjectType(); + + int GetRefCount(); + void SetGCFlag(); + bool GetGCFlag(); + void EnumReferences(asIScriptEngine *); + void ReleaseAllHandles(asIScriptEngine *); + + void ReleaseAllFunctions(); + + bool Implements(const asCObjectType *objType) const; + bool DerivesFrom(const asCObjectType *objType) const; + bool IsInterface() const; + + asCString name; + int size; + asCArray properties; + asCArray methods; + asCArray interfaces; + asCArray enumValues; + asCObjectType * derivedFrom; + asCArray virtualFunctionTable; + + asDWORD flags; + + asSTypeBehaviour beh; + + // Used for template types + asCDataType templateSubType; + bool acceptValueSubType; + bool acceptRefSubType; + + asCScriptEngine *engine; + +protected: + asCAtomic refCount; + bool gcFlag; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_outputbuffer.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_outputbuffer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_outputbuffer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_outputbuffer.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,100 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2007 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_outputbuffer.cpp +// +// This class appends strings to one large buffer that can later +// be sent to the real output stream +// + +#include "as_config.h" +#include "as_outputbuffer.h" +#include "as_scriptengine.h" + +BEGIN_AS_NAMESPACE + +asCOutputBuffer::~asCOutputBuffer() +{ + Clear(); +} + +void asCOutputBuffer::Clear() +{ + for( asUINT n = 0; n < messages.GetLength(); n++ ) + { + if( messages[n] ) + { + asDELETE(messages[n],message_t); + } + } + messages.SetLength(0); +} + +void asCOutputBuffer::Callback(asSMessageInfo *msg) +{ + message_t *msgInfo = asNEW(message_t); + msgInfo->section = msg->section; + msgInfo->row = msg->row; + msgInfo->col = msg->col; + msgInfo->type = msg->type; + msgInfo->msg = msg->message; + + messages.PushLast(msgInfo); +} + +void asCOutputBuffer::Append(asCOutputBuffer &in) +{ + for( asUINT n = 0; n < in.messages.GetLength(); n++ ) + messages.PushLast(in.messages[n]); + in.messages.SetLength(0); +} + +void asCOutputBuffer::SendToCallback(asCScriptEngine *engine, asSSystemFunctionInterface *func, void *obj) +{ + for( asUINT n = 0; n < messages.GetLength(); n++ ) + { + asSMessageInfo msg; + msg.section = messages[n]->section.AddressOf(); + msg.row = messages[n]->row; + msg.col = messages[n]->col; + msg.type = messages[n]->type; + msg.message = messages[n]->msg.AddressOf(); + + if( func->callConv < ICC_THISCALL ) + engine->CallGlobalFunction(&msg, obj, func, 0); + else + engine->CallObjectMethod(obj, &msg, func, 0); + } + Clear(); +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_outputbuffer.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_outputbuffer.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_outputbuffer.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_outputbuffer.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,75 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2008 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_outputbuffer.h +// +// This class appends strings to one large buffer that can later +// be sent to the real output stream +// + + +#ifndef AS_OUTPUTBUFFER_H +#define AS_OUTPUTBUFFER_H + +#include "as_config.h" +#include "as_string.h" +#include "as_array.h" + +BEGIN_AS_NAMESPACE + +struct asSSystemFunctionInterface; +class asCScriptEngine; + +class asCOutputBuffer +{ +public: + ~asCOutputBuffer (); + void Clear(); + void Callback(asSMessageInfo *msg); + void Append(asCOutputBuffer &in); + void SendToCallback(asCScriptEngine *engine, asSSystemFunctionInterface *func, void *obj); + + struct message_t + { + asCString section; + int row; + int col; + asEMsgType type; + asCString msg; + }; + + asCArray messages; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_parser.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_parser.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_parser.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_parser.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2928 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_parser.cpp +// +// This class parses the script code and builds a tree for compilation +// + + + +#include "as_config.h" +#include "as_parser.h" +#include "as_tokendef.h" +#include "as_texts.h" + +#ifdef _MSC_VER +#pragma warning(disable:4702) // unreachable code +#endif + +BEGIN_AS_NAMESPACE + +asCParser::asCParser(asCBuilder *builder) +{ + this->builder = builder; + this->engine = builder->engine; + + script = 0; + scriptNode = 0; + checkValidTypes = false; + isParsingAppInterface = false; +} + +asCParser::~asCParser() +{ + Reset(); +} + +void asCParser::Reset() +{ + errorWhileParsing = false; + isSyntaxError = false; + checkValidTypes = false; + isParsingAppInterface = false; + + sourcePos = 0; + + if( scriptNode ) + { + scriptNode->Destroy(engine); + } + + scriptNode = 0; + + script = 0; +} + +asCScriptNode *asCParser::GetScriptNode() +{ + return scriptNode; +} + +int asCParser::ParseScript(asCScriptCode *script) +{ + Reset(); + + this->script = script; + + scriptNode = ParseScript(); + + if( errorWhileParsing ) + return -1; + + return 0; +} + +int asCParser::ParseFunctionDefinition(asCScriptCode *script) +{ + Reset(); + + // Set flag that permits ? as datatype for parameters + isParsingAppInterface = true; + + this->script = script; + + scriptNode = ParseFunctionDefinition(); + + // The declaration should end after the definition + if( !isSyntaxError ) + { + sToken t; + GetToken(&t); + if( t.type != ttEnd ) + { + Error(ExpectedToken(asGetTokenDefinition(ttEnd)).AddressOf(), &t); + return -1; + } + } + + if( errorWhileParsing ) + return -1; + + return 0; +} + +int asCParser::ParseDataType(asCScriptCode *script) +{ + Reset(); + + this->script = script; + + scriptNode = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snDataType); + + scriptNode->AddChildLast(ParseType(true)); + if( isSyntaxError ) return -1; + + // The declaration should end after the type + sToken t; + GetToken(&t); + if( t.type != ttEnd ) + { + Error(ExpectedToken(asGetTokenDefinition(ttEnd)).AddressOf(), &t); + return -1; + } + + if( errorWhileParsing ) + return -1; + + return 0; +} + + +// Parse a template declaration: IDENTIFIER < class IDENTIFIER > +int asCParser::ParseTemplateDecl(asCScriptCode *script) +{ + Reset(); + + this->script = script; + scriptNode = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snUndefined); + + scriptNode->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return -1; + + sToken t; + GetToken(&t); + if( t.type != ttLessThan ) + { + Error(ExpectedToken(asGetTokenDefinition(ttLessThan)).AddressOf(), &t); + return -1; + } + + GetToken(&t); + if( t.type != ttClass ) + { + Error(ExpectedToken(asGetTokenDefinition(ttClass)).AddressOf(), &t); + return -1; + } + + scriptNode->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return -1; + + GetToken(&t); + if( t.type != ttGreaterThan ) + { + Error(ExpectedToken(asGetTokenDefinition(ttGreaterThan)).AddressOf(), &t); + return -1; + } + + GetToken(&t); + if( t.type != ttEnd ) + { + Error(ExpectedToken(asGetTokenDefinition(ttEnd)).AddressOf(), &t); + return -1; + } + + if( errorWhileParsing ) + return -1; + + return 0; +} + +int asCParser::ParsePropertyDeclaration(asCScriptCode *script) +{ + Reset(); + + this->script = script; + + scriptNode = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snDeclaration); + + scriptNode->AddChildLast(ParseType(true)); + if( isSyntaxError ) return -1; + + scriptNode->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return -1; + + // The declaration should end after the identifier + sToken t; + GetToken(&t); + if( t.type != ttEnd ) + { + Error(ExpectedToken(asGetTokenDefinition(ttEnd)).AddressOf(), &t); + return -1; + } + + return 0; +} + +asCScriptNode *asCParser::ParseImport() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snImport); + + sToken t; + GetToken(&t); + if( t.type != ttImport ) + { + Error(ExpectedToken(asGetTokenDefinition(ttImport)).AddressOf(), &t); + return node; + } + + node->SetToken(&t); + node->UpdateSourcePos(t.pos, t.length); + + node->AddChildLast(ParseFunctionDefinition()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttIdentifier ) + { + Error(ExpectedToken(FROM_TOKEN).AddressOf(), &t); + return node; + } + + asCString str; + str.Assign(&script->code[t.pos], t.length); + if( str != FROM_TOKEN ) + { + Error(ExpectedToken(FROM_TOKEN).AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + GetToken(&t); + if( t.type != ttStringConstant ) + { + Error(TXT_EXPECTED_STRING, &t); + return node; + } + + asCScriptNode *mod = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snConstant); + node->AddChildLast(mod); + + mod->SetToken(&t); + mod->UpdateSourcePos(t.pos, t.length); + + GetToken(&t); + if( t.type != ttEndStatement ) + { + Error(ExpectedToken(asGetTokenDefinition(ttEndStatement)).AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseFunctionDefinition() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snFunction); + + node->AddChildLast(ParseType(true)); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseTypeMod(false)); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseParameterList()); + if( isSyntaxError ) return node; + + // Parse an optional const after the function definition (used for object methods) + sToken t1; + GetToken(&t1); + RewindTo(&t1); + if( t1.type == ttConst ) + node->AddChildLast(ParseToken(ttConst)); + + return node; +} + +asCScriptNode *asCParser::ParseScript() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snScript); + + // Determine type of node + sToken t1; + + for(;;) + { + while( !isSyntaxError ) + { + GetToken(&t1); + RewindTo(&t1); + + if( t1.type == ttImport ) + node->AddChildLast(ParseImport()); + else if( t1.type == ttEnum ) + node->AddChildLast(ParseEnumeration()); // Handle enumerations + else if( t1.type == ttTypedef ) + node->AddChildLast(ParseTypedef()); // Handle primitive typedefs + else if( t1.type == ttClass ) + node->AddChildLast(ParseClass()); + else if( t1.type == ttInterface ) + node->AddChildLast(ParseInterface()); + else if( t1.type == ttConst || IsDataType(t1) ) + { + if( IsVarDecl() ) + node->AddChildLast(ParseGlobalVar()); + else + node->AddChildLast(ParseFunction()); + } + else if( t1.type == ttEndStatement ) + { + // Ignore a semicolon by itself + GetToken(&t1); + } + else if( t1.type == ttEnd ) + return node; + else + { + asCString str; + const char *t = asGetTokenDefinition(t1.type); + if( t == 0 ) t = ""; + + str.Format(TXT_UNEXPECTED_TOKEN_s, t); + + Error(str.AddressOf(), &t1); + } + } + + if( isSyntaxError ) + { + // Search for either ';' or '{' or end + GetToken(&t1); + while( t1.type != ttEndStatement && t1.type != ttEnd && + t1.type != ttStartStatementBlock ) + GetToken(&t1); + + if( t1.type == ttStartStatementBlock ) + { + // Find the end of the block and skip nested blocks + int level = 1; + while( level > 0 ) + { + GetToken(&t1); + if( t1.type == ttStartStatementBlock ) level++; + if( t1.type == ttEndStatementBlock ) level--; + if( t1.type == ttEnd ) break; + } + } + + isSyntaxError = false; + } + } + UNREACHABLE_RETURN; +} + +int asCParser::ParseStatementBlock(asCScriptCode *script, asCScriptNode *block) +{ + Reset(); + + // Tell the parser to validate the identifiers as valid types + checkValidTypes = true; + + this->script = script; + sourcePos = block->tokenPos; + + scriptNode = ParseStatementBlock(); + + if( isSyntaxError || errorWhileParsing ) + return -1; + + return 0; +} + +asCScriptNode *asCParser::ParseEnumeration() +{ + asCScriptNode *ident; + asCScriptNode *dataType; + + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snEnum); + + sToken token; + + // Check for enum + GetToken(&token); + if( token.type != ttEnum ) + { + Error(ExpectedToken(asGetTokenDefinition(ttEnum)).AddressOf(), &token); + return node; + } + + node->SetToken(&token); + node->UpdateSourcePos(token.pos, token.length); + + // Get the identifier + GetToken(&token); + if(ttIdentifier != token.type) + { + Error(TXT_EXPECTED_IDENTIFIER, &token); + return node; + } + + dataType = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snDataType); + node->AddChildLast(dataType); + + ident = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snIdentifier); + ident->SetToken(&token); + ident->UpdateSourcePos(token.pos, token.length); + dataType->AddChildLast(ident); + + // check for the start of the declaration block + GetToken(&token); + if( token.type != ttStartStatementBlock ) + { + RewindTo(&token); + Error(ExpectedToken(asGetTokenDefinition(token.type)).AddressOf(), &token); + return node; + } + + while(ttEnd != token.type) + { + GetToken(&token); + + if( ttEndStatementBlock == token.type ) + { + RewindTo(&token); + break; + } + + if(ttIdentifier != token.type) + { + Error(TXT_EXPECTED_IDENTIFIER, &token); + return node; + } + + // Add the enum element + ident = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snIdentifier); + ident->SetToken(&token); + ident->UpdateSourcePos(token.pos, token.length); + node->AddChildLast(ident); + + GetToken(&token); + + if( token.type == ttAssignment ) + { + asCScriptNode *tmp; + + RewindTo(&token); + + tmp = SuperficiallyParseGlobalVarInit(); + + node->AddChildLast(tmp); + if( isSyntaxError ) return node; + GetToken(&token); + } + + if(ttListSeparator != token.type) + { + RewindTo(&token); + break; + } + } + + // check for the end of the declaration block + GetToken(&token); + if( token.type != ttEndStatementBlock ) + { + RewindTo(&token); + Error(ExpectedToken(asGetTokenDefinition(token.type)).AddressOf(), &token); + return node; + } + + // Parse the declarations + return node; +} + +bool asCParser::CheckTemplateType(sToken &t) +{ + // Is this a template type? + asCString typeName; + typeName.Assign(&script->code[t.pos], t.length); + if( engine->IsTemplateType(typeName.AddressOf()) ) + { + // Expect the sub type within < > + GetToken(&t); + if( t.type != ttLessThan ) + return false; + + // Now there must be a data type + GetToken(&t); + if( !IsDataType(t) ) + return false; + + if( !CheckTemplateType(t) ) + return false; + + GetToken(&t); + + // Is it a handle or array? + while( t.type == ttHandle || t.type == ttOpenBracket ) + { + if( t.type == ttOpenBracket ) + { + GetToken(&t); + if( t.type != ttCloseBracket ) + return false; + } + + GetToken(&t); + } + + // Accept >> and >>> tokens too. But then force the tokenizer to move + // only 1 character ahead (thus splitting the token in two). + if( script->code[t.pos] != '>' ) + return false; + else if( t.length != 1 ) + { + // We need to break the token, so that only the first character is parsed + sToken t2 = t; + t2.pos = t.pos + 1; + RewindTo(&t2); + } + } + + return true; +} + +bool asCParser::IsVarDecl() +{ + // Set start point so that we can rewind + sToken t; + GetToken(&t); + RewindTo(&t); + + // A variable decl can start with a const + sToken t1; + GetToken(&t1); + if( t1.type == ttConst ) + GetToken(&t1); + + if( !IsDataType(t1) ) + { + RewindTo(&t); + return false; + } + + if( !CheckTemplateType(t1) ) + { + RewindTo(&t); + return false; + } + + // Object handles can be interleaved with the array brackets + sToken t2; + GetToken(&t2); + while( t2.type == ttHandle || t2.type == ttOpenBracket ) + { + if( t2.type == ttOpenBracket ) + { + GetToken(&t2); + if( t2.type != ttCloseBracket ) + { + RewindTo(&t); + return false; + } + } + + GetToken(&t2); + } + + if( t2.type != ttIdentifier ) + { + RewindTo(&t); + return false; + } + + GetToken(&t2); + if( t2.type == ttEndStatement || t2.type == ttAssignment || t2.type == ttListSeparator ) + { + RewindTo(&t); + return true; + } + if( t2.type == ttOpenParanthesis ) + { + // If the closing paranthesis is followed by a statement + // block or end-of-file, then treat it as a function. + while( t2.type != ttCloseParanthesis && t2.type != ttEnd ) + GetToken(&t2); + + if( t2.type == ttEnd ) + return false; + else + { + GetToken(&t1); + RewindTo(&t); + if( t1.type == ttStartStatementBlock || t1.type == ttEnd ) + return false; + } + + RewindTo(&t); + + return true; + } + + RewindTo(&t); + return false; +} + +bool asCParser::IsFuncDecl(bool isMethod) +{ + // Set start point so that we can rewind + sToken t; + GetToken(&t); + RewindTo(&t); + + // A class constructor starts with identifier followed by parenthesis + // A class destructor starts with the ~ token + if( isMethod ) + { + sToken t1, t2; + GetToken(&t1); + GetToken(&t2); + RewindTo(&t); + if( (t1.type == ttIdentifier && t2.type == ttOpenParanthesis) || t1.type == ttBitNot ) + return true; + } + + // A function decl can start with a const + sToken t1; + GetToken(&t1); + if( t1.type == ttConst ) + GetToken(&t1); + + if( !IsDataType(t1) ) + { + RewindTo(&t); + return false; + } + + // Object handles can be interleaved with the array brackets + sToken t2; + GetToken(&t2); + while( t2.type == ttHandle || t2.type == ttOpenBracket ) + { + if( t2.type == ttOpenBracket ) + { + GetToken(&t2); + if( t2.type != ttCloseBracket ) + { + RewindTo(&t); + return false; + } + } + + GetToken(&t2); + } + + if( t2.type != ttIdentifier ) + { + RewindTo(&t); + return false; + } + + GetToken(&t2); + if( t2.type == ttOpenParanthesis ) + { + // If the closing paranthesis is not followed by a + // statement block then it is not a function. + while( t2.type != ttCloseParanthesis && t2.type != ttEnd ) + GetToken(&t2); + + if( t2.type == ttEnd ) + return false; + else + { + // A class method can have a 'const' token after the parameter list + if( isMethod ) + { + GetToken(&t1); + if( t1.type != ttConst ) + RewindTo(&t1); + } + + GetToken(&t1); + RewindTo(&t); + if( t1.type == ttStartStatementBlock ) + return true; + } + + RewindTo(&t); + return false; + } + + RewindTo(&t); + return false; +} + +asCScriptNode *asCParser::ParseFunction(bool isMethod) +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snFunction); + + sToken t1,t2; + GetToken(&t1); + GetToken(&t2); + RewindTo(&t1); + + // If it is a global function, or a method, except constructor and destructor, then the return type is parsed + if( !isMethod || (t1.type != ttBitNot && t2.type != ttOpenParanthesis) ) + { + node->AddChildLast(ParseType(true)); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseTypeMod(false)); + if( isSyntaxError ) return node; + } + + // If this is a class destructor then it starts with ~, and no return type is declared + if( isMethod && t1.type == ttBitNot ) + { + node->AddChildLast(ParseToken(ttBitNot)); + if( isSyntaxError ) return node; + } + + node->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseParameterList()); + if( isSyntaxError ) return node; + + if( isMethod ) + { + // Is the method a const? + GetToken(&t1); + RewindTo(&t1); + if( t1.type == ttConst ) + node->AddChildLast(ParseToken(ttConst)); + } + + // We should just find the end of the statement block here. The statements + // will be parsed on request by the compiler once it starts the compilation. + node->AddChildLast(SuperficiallyParseStatementBlock()); + + return node; +} + +asCScriptNode *asCParser::ParseInterfaceMethod() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snFunction); + + node->AddChildLast(ParseType(true)); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseTypeMod(false)); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseParameterList()); + if( isSyntaxError ) return node; + + // Parse an optional const after the method definition + sToken t1; + GetToken(&t1); + RewindTo(&t1); + if( t1.type == ttConst ) + node->AddChildLast(ParseToken(ttConst)); + + GetToken(&t1); + if( t1.type != ttEndStatement ) + { + Error(ExpectedToken(";").AddressOf(), &t1); + return node; + } + + node->UpdateSourcePos(t1.pos, t1.length); + + return node; +} + +asCScriptNode *asCParser::ParseInterface() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snInterface); + + sToken t; + GetToken(&t); + if( t.type != ttInterface ) + { + Error(ExpectedToken("interface").AddressOf(), &t); + return node; + } + + node->SetToken(&t); + + node->AddChildLast(ParseIdentifier()); + + GetToken(&t); + if( t.type != ttStartStatementBlock ) + { + Error(ExpectedToken("{").AddressOf(), &t); + return node; + } + + // Parse interface methods + GetToken(&t); + RewindTo(&t); + while( t.type != ttEndStatementBlock && t.type != ttEnd ) + { + // Parse the method signature + node->AddChildLast(ParseInterfaceMethod()); + if( isSyntaxError ) return node; + + GetToken(&t); + RewindTo(&t); + } + + GetToken(&t); + if( t.type != ttEndStatementBlock ) + { + Error(ExpectedToken("}").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseClass() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snClass); + + sToken t; + GetToken(&t); + if( t.type != ttClass ) + { + Error(ExpectedToken("class").AddressOf(), &t); + return node; + } + + node->SetToken(&t); + + if( engine->ep.allowImplicitHandleTypes ) + { + // Parse 'implicit handle class' construct + GetToken(&t); + + if ( t.type == ttHandle ) + node->SetToken(&t); + else + RewindTo(&t); + } + + node->AddChildLast(ParseIdentifier()); + + GetToken(&t); + + // Optional list of interfaces that are being implemented and classes that are being inherited + if( t.type == ttColon ) + { + node->AddChildLast(ParseIdentifier()); + GetToken(&t); + while( t.type == ttListSeparator ) + { + node->AddChildLast(ParseIdentifier()); + GetToken(&t); + } + } + + if( t.type != ttStartStatementBlock ) + { + Error(ExpectedToken("{").AddressOf(), &t); + return node; + } + + // Parse properties + GetToken(&t); + RewindTo(&t); + while( t.type != ttEndStatementBlock && t.type != ttEnd ) + { + // Is it a property or a method? + if( IsFuncDecl(true) ) + { + // Parse the method + node->AddChildLast(ParseFunction(true)); + } + else if( IsVarDecl() ) + { + // Parse a property declaration + asCScriptNode *prop = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snDeclaration); + node->AddChildLast(prop); + + prop->AddChildLast(ParseType(true)); + if( isSyntaxError ) return node; + + prop->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttEndStatement ) + { + Error(ExpectedToken(";").AddressOf(), &t); + return node; + } + prop->UpdateSourcePos(t.pos, t.length); + } + else + { + Error(TXT_EXPECTED_METHOD_OR_PROPERTY, &t); + return node; + } + + GetToken(&t); + RewindTo(&t); + } + + GetToken(&t); + if( t.type != ttEndStatementBlock ) + { + Error(ExpectedToken("}").AddressOf(), &t); + return node; + } + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseGlobalVar() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snGlobalVar); + + // Parse data type + node->AddChildLast(ParseType(true)); + if( isSyntaxError ) return node; + + sToken t; + + for(;;) + { + // Parse identifier + node->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return node; + + // Only superficially parse the initialization info for the variable + GetToken(&t); + RewindTo(&t); + if( t.type == ttAssignment || t.type == ttOpenParanthesis ) + { + node->AddChildLast(SuperficiallyParseGlobalVarInit()); + if( isSyntaxError ) return node; + } + + // continue if list separator, else terminate with end statement + GetToken(&t); + if( t.type == ttListSeparator ) + continue; + else if( t.type == ttEndStatement ) + { + node->UpdateSourcePos(t.pos, t.length); + + return node; + } + else + { + Error(ExpectedTokens(",", ";").AddressOf(), &t); + return node; + } + } + UNREACHABLE_RETURN; +} + +int asCParser::ParseGlobalVarInit(asCScriptCode *script, asCScriptNode *init) +{ + Reset(); + + // Tell the parser to validate the identifiers as valid types + checkValidTypes = true; + + this->script = script; + sourcePos = init->tokenPos; + + // If next token is assignment, parse expression + sToken t; + GetToken(&t); + if( t.type == ttAssignment ) + { + GetToken(&t); + RewindTo(&t); + if( t.type == ttStartStatementBlock ) + scriptNode = ParseInitList(); + else + scriptNode = ParseAssignment(); + } + else if( t.type == ttOpenParanthesis ) + { + RewindTo(&t); + scriptNode = ParseArgList(); + } + else + { + int tokens[] = {ttAssignment, ttOpenParanthesis}; + Error(ExpectedOneOf(tokens, 2).AddressOf(), &t); + } + + if( isSyntaxError || errorWhileParsing ) + return -1; + + return 0; +} + +asCScriptNode *asCParser::SuperficiallyParseGlobalVarInit() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snAssignment); + + sToken t; + GetToken(&t); + node->UpdateSourcePos(t.pos, t.length); + + if( t.type == ttAssignment ) + { + GetToken(&t); + if( t.type == ttStartStatementBlock ) + { + // Find the end of the initialization list + int indent = 1; + while( indent ) + { + GetToken(&t); + if( t.type == ttStartStatementBlock ) + indent++; + else if( t.type == ttEndStatementBlock ) + indent--; + else if( t.type == ttEnd ) + { + Error(TXT_UNEXPECTED_END_OF_FILE, &t); + break; + } + } + } + else + { + // Find the end of the expression + int indent = 0; + while( indent || (t.type != ttListSeparator && t.type != ttEndStatement && t.type != ttEndStatementBlock) ) + { + if( t.type == ttOpenParanthesis ) + indent++; + else if( t.type == ttCloseParanthesis ) + indent--; + else if( t.type == ttEnd ) + { + Error(TXT_UNEXPECTED_END_OF_FILE, &t); + break; + } + GetToken(&t); + } + + // Rewind so that the next token read is the list separator, end statement, or end statement block + RewindTo(&t); + } + } + else if( t.type == ttOpenParanthesis ) + { + // Find the end of the argument list + int indent = 1; + while( indent ) + { + GetToken(&t); + if( t.type == ttOpenParanthesis ) + indent++; + else if( t.type == ttCloseParanthesis ) + indent--; + else if( t.type == ttEnd ) + { + Error(TXT_UNEXPECTED_END_OF_FILE, &t); + break; + } + } + } + else + { + int tokens[] = {ttAssignment, ttOpenParanthesis}; + Error(ExpectedOneOf(tokens, 2).AddressOf(), &t); + } + + return node; +} + +asCScriptNode *asCParser::ParseTypeMod(bool isParam) +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snDataType); + + sToken t; + + // Parse possible & token + GetToken(&t); + RewindTo(&t); + if( t.type == ttAmp ) + { + node->AddChildLast(ParseToken(ttAmp)); + if( isSyntaxError ) return node; + + if( isParam ) + { + GetToken(&t); + RewindTo(&t); + + if( t.type == ttIn || t.type == ttOut || t.type == ttInOut ) + { + int tokens[3] = {ttIn, ttOut, ttInOut}; + node->AddChildLast(ParseOneOf(tokens, 3)); + } + } + } + + // Parse possible + token + GetToken(&t); + RewindTo(&t); + if( t.type == ttPlus ) + { + node->AddChildLast(ParseToken(ttPlus)); + if( isSyntaxError ) return node; + } + + return node; +} + +asCScriptNode *asCParser::ParseType(bool allowConst, bool allowVariableType) +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snDataType); + + sToken t; + + if( allowConst ) + { + GetToken(&t); + RewindTo(&t); + if( t.type == ttConst ) + { + node->AddChildLast(ParseToken(ttConst)); + if( isSyntaxError ) return node; + } + } + + node->AddChildLast(ParseDataType(allowVariableType)); + + // If the datatype is a template type, then parse the subtype within the < > + asCScriptNode *type = node->lastChild; + asCString typeName; + typeName.Assign(&script->code[type->tokenPos], type->tokenLength); + if( engine->IsTemplateType(typeName.AddressOf()) ) + { + GetToken(&t); + if( t.type != ttLessThan ) + { + Error(ExpectedToken(asGetTokenDefinition(ttLessThan)).AddressOf(), &t); + return node; + } + + node->AddChildLast(ParseType(true, false)); + if( isSyntaxError ) return node; + + // Accept >> and >>> tokens too. But then force the tokenizer to move + // only 1 character ahead (thus splitting the token in two). + GetToken(&t); + if( script->code[t.pos] != '>' ) + { + Error(ExpectedToken(asGetTokenDefinition(ttGreaterThan)).AddressOf(), &t); + return node; + } + else + { + // Break the token so that only the first > is parsed + sToken t2 = t; + t2.pos = t.pos + 1; + RewindTo(&t2); + } + } + + // Parse [] and @ + GetToken(&t); + RewindTo(&t); + while( t.type == ttOpenBracket || t.type == ttHandle) + { + if( t.type == ttOpenBracket ) + { + node->AddChildLast(ParseToken(ttOpenBracket)); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttCloseBracket ) + { + Error(ExpectedToken("]").AddressOf(), &t); + return node; + } + } + else + { + node->AddChildLast(ParseToken(ttHandle)); + if( isSyntaxError ) return node; + } + + GetToken(&t); + RewindTo(&t); + } + + return node; +} + +asCScriptNode *asCParser::ParseToken(int token) +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snUndefined); + + sToken t1; + + GetToken(&t1); + if( t1.type != token ) + { + Error(ExpectedToken(asGetTokenDefinition(token)).AddressOf(), &t1); + return node; + } + + node->SetToken(&t1); + node->UpdateSourcePos(t1.pos, t1.length); + + return node; +} + +asCScriptNode *asCParser::ParseOneOf(int *tokens, int count) +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snUndefined); + + sToken t1; + + GetToken(&t1); + int n; + for( n = 0; n < count; n++ ) + { + if( tokens[n] == t1.type ) + break; + } + if( n == count ) + { + Error(ExpectedOneOf(tokens, count).AddressOf(), &t1); + return node; + } + + node->SetToken(&t1); + node->UpdateSourcePos(t1.pos, t1.length); + + return node; +} + + +asCScriptNode *asCParser::ParseDataType(bool allowVariableType) +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snDataType); + + sToken t1; + + GetToken(&t1); + if( !IsDataType(t1) && !(allowVariableType && t1.type == ttQuestion) ) + { + Error(TXT_EXPECTED_DATA_TYPE, &t1); + return node; + } + + node->SetToken(&t1); + node->UpdateSourcePos(t1.pos, t1.length); + + return node; +} + +asCScriptNode *asCParser::ParseRealType() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snDataType); + + sToken t1; + + GetToken(&t1); + if( !IsRealType(t1.type) ) + { + Error(TXT_EXPECTED_DATA_TYPE, &t1); + return node; + } + + node->SetToken(&t1); + node->UpdateSourcePos(t1.pos, t1.length); + + return node; +} + +asCScriptNode *asCParser::ParseIdentifier() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snIdentifier); + + sToken t1; + + GetToken(&t1); + if( t1.type != ttIdentifier ) + { + Error(TXT_EXPECTED_IDENTIFIER, &t1); + return node; + } + + node->SetToken(&t1); + node->UpdateSourcePos(t1.pos, t1.length); + + return node; +} + +asCScriptNode *asCParser::ParseCast() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snCast); + + sToken t1; + GetToken(&t1); + if( t1.type != ttCast ) + { + Error(ExpectedToken("cast").AddressOf(), &t1); + return node; + } + + node->UpdateSourcePos(t1.pos, t1.length); + + GetToken(&t1); + if( t1.type != ttLessThan ) + { + Error(ExpectedToken("<").AddressOf(), &t1); + return node; + } + + // Parse the data type + node->AddChildLast(ParseType(true)); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseTypeMod(false)); + if( isSyntaxError ) return node; + + GetToken(&t1); + if( t1.type != ttGreaterThan ) + { + Error(ExpectedToken(">").AddressOf(), &t1); + return node; + } + + GetToken(&t1); + if( t1.type != ttOpenParanthesis ) + { + Error(ExpectedToken("(").AddressOf(), &t1); + return node; + } + + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + GetToken(&t1); + if( t1.type != ttCloseParanthesis ) + { + Error(ExpectedToken(")").AddressOf(), &t1); + return node; + } + + node->UpdateSourcePos(t1.pos, t1.length); + + return node; +} + +asCScriptNode *asCParser::ParseParameterList() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snParameterList); + + sToken t1; + GetToken(&t1); + if( t1.type != ttOpenParanthesis ) + { + Error(ExpectedToken("(").AddressOf(), &t1); + return node; + } + + node->UpdateSourcePos(t1.pos, t1.length); + + GetToken(&t1); + if( t1.type == ttCloseParanthesis ) + { + node->UpdateSourcePos(t1.pos, t1.length); + + // Statement block is finished + return node; + } + else + { + RewindTo(&t1); + + for(;;) + { + // Parse data type + node->AddChildLast(ParseType(true, isParsingAppInterface)); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseTypeMod(true)); + if( isSyntaxError ) return node; + + // Parse identifier + GetToken(&t1); + if( t1.type == ttIdentifier ) + { + RewindTo(&t1); + + node->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return node; + + GetToken(&t1); + } + + // Check if list continues + if( t1.type == ttCloseParanthesis ) + { + node->UpdateSourcePos(t1.pos, t1.length); + + return node; + } + else if( t1.type == ttListSeparator ) + continue; + else + { + Error(ExpectedTokens(")", ",").AddressOf(), &t1); + return node; + } + } + } + UNREACHABLE_RETURN; +} + +asCScriptNode *asCParser::ParseExprValue() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snExprValue); + + sToken t1, t2; + GetToken(&t1); + GetToken(&t2); + RewindTo(&t1); + + // TODO: namespace: Datatypes can be defined in namespaces, thus types too must allow scope prefix + if( IsDataType(t1) && t2.type != ttScope ) + node->AddChildLast(ParseConstructCall()); + else if( t1.type == ttIdentifier || t1.type == ttScope ) + { + if( IsFunctionCall() ) + node->AddChildLast(ParseFunctionCall()); + else + node->AddChildLast(ParseVariableAccess()); + } + else if( t1.type == ttCast ) + node->AddChildLast(ParseCast()); + else if( IsConstant(t1.type) ) + node->AddChildLast(ParseConstant()); + else if( t1.type == ttOpenParanthesis ) + { + GetToken(&t1); + node->UpdateSourcePos(t1.pos, t1.length); + + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + GetToken(&t1); + if( t1.type != ttCloseParanthesis ) + Error(ExpectedToken(")").AddressOf(), &t1); + + node->UpdateSourcePos(t1.pos, t1.length); + } + else + Error(TXT_EXPECTED_EXPRESSION_VALUE, &t1); + + return node; +} + +asCScriptNode *asCParser::ParseConstant() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snConstant); + + sToken t; + GetToken(&t); + if( !IsConstant(t.type) ) + { + Error(TXT_EXPECTED_CONSTANT, &t); + return node; + } + + node->SetToken(&t); + node->UpdateSourcePos(t.pos, t.length); + + // We want to gather a list of string constants to concatenate as children + if( t.type == ttStringConstant || t.type == ttMultilineStringConstant || t.type == ttHeredocStringConstant ) + RewindTo(&t); + + while( t.type == ttStringConstant || t.type == ttMultilineStringConstant || t.type == ttHeredocStringConstant ) + { + node->AddChildLast(ParseStringConstant()); + + GetToken(&t); + RewindTo(&t); + } + + return node; +} + +asCScriptNode *asCParser::ParseStringConstant() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snConstant); + + sToken t; + GetToken(&t); + if( t.type != ttStringConstant && t.type != ttMultilineStringConstant && t.type != ttHeredocStringConstant ) + { + Error(TXT_EXPECTED_STRING, &t); + return node; + } + + node->SetToken(&t); + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseFunctionCall() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snFunctionCall); + + // Parse scope prefix + sToken t1, t2; + GetToken(&t1); + if( t1.type == ttScope ) + { + RewindTo(&t1); + node->AddChildLast(ParseToken(ttScope)); + GetToken(&t1); + } + GetToken(&t2); + while( t1.type == ttIdentifier && t2.type == ttScope ) + { + RewindTo(&t1); + node->AddChildLast(ParseIdentifier()); + node->AddChildLast(ParseToken(ttScope)); + GetToken(&t1); + GetToken(&t2); + } + + RewindTo(&t1); + + // Parse the function name followed by the argument list + node->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseArgList()); + + return node; +} + +asCScriptNode *asCParser::ParseVariableAccess() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snVariableAccess); + + // Parse scope prefix + sToken t1, t2; + GetToken(&t1); + if( t1.type == ttScope ) + { + RewindTo(&t1); + node->AddChildLast(ParseToken(ttScope)); + GetToken(&t1); + } + GetToken(&t2); + while( t1.type == ttIdentifier && t2.type == ttScope ) + { + RewindTo(&t1); + node->AddChildLast(ParseIdentifier()); + node->AddChildLast(ParseToken(ttScope)); + GetToken(&t1); + GetToken(&t2); + } + + RewindTo(&t1); + + // Parse the variable name + node->AddChildLast(ParseIdentifier()); + + return node; +} + +asCScriptNode *asCParser::ParseConstructCall() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snConstructCall); + + node->AddChildLast(ParseType(false)); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseArgList()); + + return node; +} + +asCScriptNode *asCParser::ParseArgList() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snArgList); + + sToken t1; + GetToken(&t1); + if( t1.type != ttOpenParanthesis ) + { + Error(ExpectedToken("(").AddressOf(), &t1); + return node; + } + + node->UpdateSourcePos(t1.pos, t1.length); + + GetToken(&t1); + if( t1.type == ttCloseParanthesis ) + { + node->UpdateSourcePos(t1.pos, t1.length); + + // Statement block is finished + return node; + } + else + { + RewindTo(&t1); + + for(;;) + { + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + // Check if list continues + GetToken(&t1); + if( t1.type == ttCloseParanthesis ) + { + node->UpdateSourcePos(t1.pos, t1.length); + + return node; + } + else if( t1.type == ttListSeparator ) + continue; + else + { + Error(ExpectedTokens(")", ",").AddressOf(), &t1); + return node; + } + } + } + return 0; +} + +asCScriptNode *asCParser::SuperficiallyParseStatementBlock() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snStatementBlock); + + // This function will only superficially parse the statement block in order to find the end of it + sToken t1; + + GetToken(&t1); + if( t1.type != ttStartStatementBlock ) + { + Error(ExpectedToken("{").AddressOf(), &t1); + return node; + } + + node->UpdateSourcePos(t1.pos, t1.length); + + int level = 1; + while( level > 0 && !isSyntaxError ) + { + GetToken(&t1); + if( t1.type == ttEndStatementBlock ) + level--; + else if( t1.type == ttStartStatementBlock ) + level++; + else if( t1.type == ttEnd ) + Error(TXT_UNEXPECTED_END_OF_FILE, &t1); + } + + node->UpdateSourcePos(t1.pos, t1.length); + + return node; +} + +asCScriptNode *asCParser::ParseStatementBlock() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snStatementBlock); + + sToken t1; + + GetToken(&t1); + if( t1.type != ttStartStatementBlock ) + { + Error(ExpectedToken("{").AddressOf(), &t1); + return node; + } + + node->UpdateSourcePos(t1.pos, t1.length); + + for(;;) + { + while( !isSyntaxError ) + { + GetToken(&t1); + if( t1.type == ttEndStatementBlock ) + { + node->UpdateSourcePos(t1.pos, t1.length); + + // Statement block is finished + return node; + } + else + { + RewindTo(&t1); + + if( IsVarDecl() ) + node->AddChildLast(ParseDeclaration()); + else + node->AddChildLast(ParseStatement()); + } + } + + if( isSyntaxError ) + { + // Search for either ';', '{', '}', or end + GetToken(&t1); + while( t1.type != ttEndStatement && t1.type != ttEnd && + t1.type != ttStartStatementBlock && t1.type != ttEndStatementBlock ) + { + GetToken(&t1); + } + + // Skip this statement block + if( t1.type == ttStartStatementBlock ) + { + // Find the end of the block and skip nested blocks + int level = 1; + while( level > 0 ) + { + GetToken(&t1); + if( t1.type == ttStartStatementBlock ) level++; + if( t1.type == ttEndStatementBlock ) level--; + if( t1.type == ttEnd ) break; + } + } + else if( t1.type == ttEndStatementBlock ) + { + RewindTo(&t1); + } + else if( t1.type == ttEnd ) + { + Error(TXT_UNEXPECTED_END_OF_FILE, &t1); + return node; + } + + isSyntaxError = false; + } + } + UNREACHABLE_RETURN; +} + +asCScriptNode *asCParser::ParseInitList() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snInitList); + + sToken t1; + + GetToken(&t1); + if( t1.type != ttStartStatementBlock ) + { + Error(ExpectedToken("{").AddressOf(), &t1); + return node; + } + + node->UpdateSourcePos(t1.pos, t1.length); + + GetToken(&t1); + if( t1.type == ttEndStatementBlock ) + { + node->UpdateSourcePos(t1.pos, t1.length); + + // Statement block is finished + return node; + } + else + { + RewindTo(&t1); + for(;;) + { + GetToken(&t1); + if( t1.type == ttListSeparator ) + { + // No expression + node->AddChildLast(new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snUndefined)); + + GetToken(&t1); + if( t1.type == ttEndStatementBlock ) + { + // No expression + node->AddChildLast(new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snUndefined)); + node->UpdateSourcePos(t1.pos, t1.length); + return node; + } + RewindTo(&t1); + } + else if( t1.type == ttEndStatementBlock ) + { + // No expression + node->AddChildLast(new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snUndefined)); + + node->UpdateSourcePos(t1.pos, t1.length); + + // Statement block is finished + return node; + } + else if( t1.type == ttStartStatementBlock ) + { + RewindTo(&t1); + node->AddChildLast(ParseInitList()); + if( isSyntaxError ) return node; + + GetToken(&t1); + if( t1.type == ttListSeparator ) + continue; + else if( t1.type == ttEndStatementBlock ) + { + node->UpdateSourcePos(t1.pos, t1.length); + + // Statement block is finished + return node; + } + else + { + Error(ExpectedTokens("}", ",").AddressOf(), &t1); + return node; + } + } + else + { + RewindTo(&t1); + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + + GetToken(&t1); + if( t1.type == ttListSeparator ) + continue; + else if( t1.type == ttEndStatementBlock ) + { + node->UpdateSourcePos(t1.pos, t1.length); + + // Statement block is finished + return node; + } + else + { + Error(ExpectedTokens("}", ",").AddressOf(), &t1); + return node; + } + } + } + } + UNREACHABLE_RETURN; +} + +bool asCParser::IsFunctionCall() +{ + sToken s; + sToken t1, t2; + + GetToken(&s); + t1 = s; + + // A function call may be prefixed with scope resolution + if( t1.type == ttScope ) + GetToken(&t1); + GetToken(&t2); + + while( t1.type == ttIdentifier && t2.type == ttScope ) + { + GetToken(&t1); + GetToken(&t2); + } + + // A function call starts with an identifier followed by an argument list + if( t1.type != ttIdentifier || IsDataType(t1) ) + { + RewindTo(&s); + return false; + } + + if( t2.type == ttOpenParanthesis ) + { + RewindTo(&s); + return true; + } + + RewindTo(&s); + return false; +} + +asCScriptNode *asCParser::ParseDeclaration() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snDeclaration); + + // Parse data type + node->AddChildLast(ParseType(true)); + if( isSyntaxError ) return node; + + sToken t; + + for(;;) + { + // Parse identifier + node->AddChildLast(ParseIdentifier()); + if( isSyntaxError ) return node; + + // If next token is assignment, parse expression + GetToken(&t); + if( t.type == ttOpenParanthesis ) + { + RewindTo(&t); + node->AddChildLast(ParseArgList()); + if( isSyntaxError ) return node; + } + else if( t.type == ttAssignment ) + { + GetToken(&t); + RewindTo(&t); + if( t.type == ttStartStatementBlock ) + { + node->AddChildLast(ParseInitList()); + if( isSyntaxError ) return node; + } + else + { + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + } + } + else + RewindTo(&t); + + // continue if list separator, else terminate with end statement + GetToken(&t); + if( t.type == ttListSeparator ) + continue; + else if( t.type == ttEndStatement ) + { + node->UpdateSourcePos(t.pos, t.length); + + return node; + } + else + { + Error(ExpectedTokens(",", ";").AddressOf(), &t); + return node; + } + } + UNREACHABLE_RETURN; +} + +asCScriptNode *asCParser::ParseStatement() +{ + sToken t1; + + GetToken(&t1); + RewindTo(&t1); + + if( t1.type == ttIf ) + return ParseIf(); + else if( t1.type == ttFor ) + return ParseFor(); + else if( t1.type == ttWhile ) + return ParseWhile(); + else if( t1.type == ttReturn ) + return ParseReturn(); + else if( t1.type == ttStartStatementBlock ) + return ParseStatementBlock(); + else if( t1.type == ttBreak ) + return ParseBreak(); + else if( t1.type == ttContinue ) + return ParseContinue(); + else if( t1.type == ttDo ) + return ParseDoWhile(); + else if( t1.type == ttSwitch ) + return ParseSwitch(); + else + return ParseExpressionStatement(); +} + +asCScriptNode *asCParser::ParseExpressionStatement() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snExpressionStatement); + + sToken t; + GetToken(&t); + if( t.type == ttEndStatement ) + { + node->UpdateSourcePos(t.pos, t.length); + + return node; + } + + RewindTo(&t); + + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttEndStatement ) + { + Error(ExpectedToken(";").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseSwitch() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snSwitch); + + sToken t; + GetToken(&t); + if( t.type != ttSwitch ) + { + Error(ExpectedToken("switch").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + GetToken(&t); + if( t.type != ttOpenParanthesis ) + { + Error(ExpectedToken("(").AddressOf(), &t); + return node; + } + + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttCloseParanthesis ) + { + Error(ExpectedToken(")").AddressOf(), &t); + return node; + } + + GetToken(&t); + if( t.type != ttStartStatementBlock ) + { + Error(ExpectedToken("{").AddressOf(), &t); + return node; + } + + while( !isSyntaxError ) + { + GetToken(&t); + + if( t.type == ttEndStatementBlock || t.type == ttDefault) + break; + + RewindTo(&t); + + if( t.type != ttCase ) + { + Error(ExpectedToken("case").AddressOf(), &t); + return node; + } + + node->AddChildLast(ParseCase()); + if( isSyntaxError ) return node; + } + + if( t.type == ttDefault) + { + RewindTo(&t); + + node->AddChildLast(ParseCase()); + if( isSyntaxError ) return node; + + GetToken(&t); + } + + if( t.type != ttEndStatementBlock ) + { + Error(ExpectedToken("}").AddressOf(), &t); + return node; + } + + return node; +} + +asCScriptNode *asCParser::ParseCase() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snCase); + + sToken t; + GetToken(&t); + if( t.type != ttCase && t.type != ttDefault ) + { + Error(ExpectedTokens("case", "default").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + if(t.type == ttCase) + { + node->AddChildLast(ParseExpression()); + } + + GetToken(&t); + if( t.type != ttColon ) + { + Error(ExpectedToken(":").AddressOf(), &t); + return node; + } + + // Parse statements until we find either of }, case, default, and break + GetToken(&t); + RewindTo(&t); + while( t.type != ttCase && + t.type != ttDefault && + t.type != ttEndStatementBlock && + t.type != ttBreak ) + { + + node->AddChildLast(ParseStatement()); + if( isSyntaxError ) return node; + + GetToken(&t); + RewindTo(&t); + } + + // If the case was ended with a break statement, add it to the node + if( t.type == ttBreak ) + node->AddChildLast(ParseBreak()); + + return node; +} + +asCScriptNode *asCParser::ParseIf() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snIf); + + sToken t; + GetToken(&t); + if( t.type != ttIf ) + { + Error(ExpectedToken("if").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + GetToken(&t); + if( t.type != ttOpenParanthesis ) + { + Error(ExpectedToken("(").AddressOf(), &t); + return node; + } + + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttCloseParanthesis ) + { + Error(ExpectedToken(")").AddressOf(), &t); + return node; + } + + node->AddChildLast(ParseStatement()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttElse ) + { + // No else statement return already + RewindTo(&t); + return node; + } + + node->AddChildLast(ParseStatement()); + + return node; +} + +asCScriptNode *asCParser::ParseFor() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snFor); + + sToken t; + GetToken(&t); + if( t.type != ttFor ) + { + Error(ExpectedToken("for").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + GetToken(&t); + if( t.type != ttOpenParanthesis ) + { + Error(ExpectedToken("(").AddressOf(), &t); + return node; + } + + if( IsVarDecl() ) + node->AddChildLast(ParseDeclaration()); + else + node->AddChildLast(ParseExpressionStatement()); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseExpressionStatement()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttCloseParanthesis ) + { + RewindTo(&t); + + asCScriptNode *n = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snExpressionStatement); + node->AddChildLast(n); + n->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttCloseParanthesis ) + { + Error(ExpectedToken(")").AddressOf(), &t); + return node; + } + } + + node->AddChildLast(ParseStatement()); + + return node; +} + + + + + +asCScriptNode *asCParser::ParseWhile() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snWhile); + + sToken t; + GetToken(&t); + if( t.type != ttWhile ) + { + Error(ExpectedToken("while").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + GetToken(&t); + if( t.type != ttOpenParanthesis ) + { + Error(ExpectedToken("(").AddressOf(), &t); + return node; + } + + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttCloseParanthesis ) + { + Error(ExpectedToken(")").AddressOf(), &t); + return node; + } + + node->AddChildLast(ParseStatement()); + + return node; +} + +asCScriptNode *asCParser::ParseDoWhile() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snDoWhile); + + sToken t; + GetToken(&t); + if( t.type != ttDo ) + { + Error(ExpectedToken("do").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + node->AddChildLast(ParseStatement()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttWhile ) + { + Error(ExpectedToken("while").AddressOf(), &t); + return node; + } + + GetToken(&t); + if( t.type != ttOpenParanthesis ) + { + Error(ExpectedToken("(").AddressOf(), &t); + return node; + } + + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttCloseParanthesis ) + { + Error(ExpectedToken(")").AddressOf(), &t); + return node; + } + + GetToken(&t); + if( t.type != ttEndStatement ) + { + Error(ExpectedToken(";").AddressOf(), &t); + return node; + } + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseReturn() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snReturn); + + sToken t; + GetToken(&t); + if( t.type != ttReturn ) + { + Error(ExpectedToken("return").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + GetToken(&t); + if( t.type == ttEndStatement ) + { + node->UpdateSourcePos(t.pos, t.length); + return node; + } + + RewindTo(&t); + + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttEndStatement ) + { + Error(ExpectedToken(";").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseBreak() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snBreak); + + sToken t; + GetToken(&t); + if( t.type != ttBreak ) + { + Error(ExpectedToken("break").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + GetToken(&t); + if( t.type != ttEndStatement ) + Error(ExpectedToken(";").AddressOf(), &t); + + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseContinue() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snContinue); + + sToken t; + GetToken(&t); + if( t.type != ttContinue ) + { + Error(ExpectedToken("continue").AddressOf(), &t); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + + GetToken(&t); + if( t.type != ttEndStatement ) + Error(ExpectedToken(";").AddressOf(), &t); + + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseAssignment() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snAssignment); + + node->AddChildLast(ParseCondition()); + if( isSyntaxError ) return node; + + sToken t; + GetToken(&t); + RewindTo(&t); + + if( IsAssignOperator(t.type) ) + { + node->AddChildLast(ParseAssignOperator()); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + } + + return node; +} + +asCScriptNode *asCParser::ParseCondition() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snCondition); + + node->AddChildLast(ParseExpression()); + if( isSyntaxError ) return node; + + sToken t; + GetToken(&t); + if( t.type == ttQuestion ) + { + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + + GetToken(&t); + if( t.type != ttColon ) + { + Error(ExpectedToken(":").AddressOf(), &t); + return node; + } + + node->AddChildLast(ParseAssignment()); + if( isSyntaxError ) return node; + } + else + RewindTo(&t); + + return node; +} + +asCScriptNode *asCParser::ParseExpression() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snExpression); + + node->AddChildLast(ParseExprTerm()); + if( isSyntaxError ) return node; + + for(;;) + { + sToken t; + GetToken(&t); + RewindTo(&t); + + if( !IsOperator(t.type) ) + return node; + + node->AddChildLast(ParseExprOperator()); + if( isSyntaxError ) return node; + + node->AddChildLast(ParseExprTerm()); + if( isSyntaxError ) return node; + } + UNREACHABLE_RETURN; +} + +asCScriptNode *asCParser::ParseExprTerm() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snExprTerm); + + for(;;) + { + sToken t; + GetToken(&t); + RewindTo(&t); + if( !IsPreOperator(t.type) ) + break; + + node->AddChildLast(ParseExprPreOp()); + if( isSyntaxError ) return node; + } + + node->AddChildLast(ParseExprValue()); + if( isSyntaxError ) return node; + + + for(;;) + { + sToken t; + GetToken(&t); + RewindTo(&t); + if( !IsPostOperator(t.type) ) + return node; + + node->AddChildLast(ParseExprPostOp()); + if( isSyntaxError ) return node; + } + UNREACHABLE_RETURN; +} + +asCScriptNode *asCParser::ParseExprPreOp() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snExprPreOp); + + sToken t; + GetToken(&t); + if( !IsPreOperator(t.type) ) + { + Error(TXT_EXPECTED_PRE_OPERATOR, &t); + return node; + } + + node->SetToken(&t); + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseExprPostOp() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snExprPostOp); + + sToken t; + GetToken(&t); + if( !IsPostOperator(t.type) ) + { + Error(TXT_EXPECTED_POST_OPERATOR, &t); + return node; + } + + node->SetToken(&t); + node->UpdateSourcePos(t.pos, t.length); + + if( t.type == ttDot ) + { + sToken t1, t2; + GetToken(&t1); + GetToken(&t2); + RewindTo(&t1); + if( t2.type == ttOpenParanthesis ) + node->AddChildLast(ParseFunctionCall()); + else + node->AddChildLast(ParseIdentifier()); + } + else if( t.type == ttOpenBracket ) + { + node->AddChildLast(ParseAssignment()); + + GetToken(&t); + if( t.type != ttCloseBracket ) + { + ExpectedToken("]"); + return node; + } + + node->UpdateSourcePos(t.pos, t.length); + } + + return node; +} + +asCScriptNode *asCParser::ParseExprOperator() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snExprOperator); + + sToken t; + GetToken(&t); + if( !IsOperator(t.type) ) + { + Error(TXT_EXPECTED_OPERATOR, &t); + return node; + } + + node->SetToken(&t); + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +asCScriptNode *asCParser::ParseAssignOperator() +{ + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snExprOperator); + + sToken t; + GetToken(&t); + if( !IsAssignOperator(t.type) ) + { + Error(TXT_EXPECTED_OPERATOR, &t); + return node; + } + + node->SetToken(&t); + node->UpdateSourcePos(t.pos, t.length); + + return node; +} + +void asCParser::GetToken(sToken *token) +{ + size_t sourceLength = script->codeLength; + + do + { + if( sourcePos >= sourceLength ) + { + token->type = ttEnd; + token->length = 0; + } + else + token->type = tokenizer.GetToken(&script->code[sourcePos], sourceLength - sourcePos, &token->length); + + token->pos = sourcePos; + + // Update state + sourcePos += token->length; + } + // Filter out whitespace and comments + while( token->type == ttWhiteSpace || + token->type == ttOnelineComment || + token->type == ttMultilineComment ); +} + +void asCParser::RewindTo(const sToken *token) +{ + sourcePos = token->pos; +} + +void asCParser::Error(const char *text, sToken *token) +{ + RewindTo(token); + + isSyntaxError = true; + errorWhileParsing = true; + + int row, col; + script->ConvertPosToRowCol(token->pos, &row, &col); + + if( builder ) + builder->WriteError(script->name.AddressOf(), text, row, col); +} + +bool asCParser::IsRealType(int tokenType) +{ + if( tokenType == ttVoid || + tokenType == ttInt || + tokenType == ttInt8 || + tokenType == ttInt16 || + tokenType == ttInt64 || + tokenType == ttUInt || + tokenType == ttUInt8 || + tokenType == ttUInt16 || + tokenType == ttUInt64 || + tokenType == ttFloat || + tokenType == ttBool || + tokenType == ttDouble ) + return true; + + return false; +} + + +bool asCParser::IsDataType(const sToken &token) +{ + if( token.type == ttIdentifier ) + { + if( checkValidTypes ) + { + // Check if this is a registered type + asCString str; + str.Assign(&script->code[token.pos], token.length); + if( !builder->GetObjectType(str.AddressOf()) ) + return false; + } + return true; + } + + if( IsRealType(token.type) ) + return true; + + return false; +} + +bool asCParser::IsOperator(int tokenType) +{ + if( tokenType == ttPlus || + tokenType == ttMinus || + tokenType == ttStar || + tokenType == ttSlash || + tokenType == ttPercent || + tokenType == ttAnd || + tokenType == ttOr || + tokenType == ttXor || + tokenType == ttEqual || + tokenType == ttNotEqual || + tokenType == ttLessThan || + tokenType == ttLessThanOrEqual || + tokenType == ttGreaterThan || + tokenType == ttGreaterThanOrEqual || + tokenType == ttAmp || + tokenType == ttBitOr || + tokenType == ttBitXor || + tokenType == ttBitShiftLeft || + tokenType == ttBitShiftRight || + tokenType == ttBitShiftRightArith || + tokenType == ttIs || + tokenType == ttNotIs ) + return true; + + return false; +} + +bool asCParser::IsAssignOperator(int tokenType) +{ + if( tokenType == ttAssignment || + tokenType == ttAddAssign || + tokenType == ttSubAssign || + tokenType == ttMulAssign || + tokenType == ttDivAssign || + tokenType == ttModAssign || + tokenType == ttAndAssign || + tokenType == ttOrAssign || + tokenType == ttXorAssign || + tokenType == ttShiftLeftAssign || + tokenType == ttShiftRightLAssign || + tokenType == ttShiftRightAAssign ) + return true; + + return false; +} + +bool asCParser::IsPreOperator(int tokenType) +{ + if( tokenType == ttMinus || + tokenType == ttPlus || + tokenType == ttNot || + tokenType == ttInc || + tokenType == ttDec || + tokenType == ttBitNot || + tokenType == ttHandle ) + return true; + return false; +} + +bool asCParser::IsPostOperator(int tokenType) +{ + if( tokenType == ttInc || + tokenType == ttDec || + tokenType == ttDot || + tokenType == ttOpenBracket ) + return true; + return false; +} + +bool asCParser::IsConstant(int tokenType) +{ + if( tokenType == ttIntConstant || + tokenType == ttFloatConstant || + tokenType == ttDoubleConstant || + tokenType == ttStringConstant || + tokenType == ttMultilineStringConstant || + tokenType == ttHeredocStringConstant || + tokenType == ttTrue || + tokenType == ttFalse || + tokenType == ttBitsConstant || + tokenType == ttNull ) + return true; + + return false; +} + +asCString asCParser::ExpectedToken(const char *token) +{ + asCString str; + + str.Format(TXT_EXPECTED_s, token); + + return str; +} + +asCString asCParser::ExpectedTokens(const char *t1, const char *t2) +{ + asCString str; + + str.Format(TXT_EXPECTED_s_OR_s, t1, t2); + + return str; +} + +asCString asCParser::ExpectedOneOf(int *tokens, int count) +{ + asCString str; + + str = TXT_EXPECTED_ONE_OF; + for( int n = 0; n < count; n++ ) + { + str += asGetTokenDefinition(tokens[n]); + if( n < count-1 ) + str += ", "; + } + + return str; +} + +// TODO: typedef: Typedefs should accept complex types as well +asCScriptNode *asCParser::ParseTypedef() +{ + // Create the typedef node + asCScriptNode *node = new(engine->memoryMgr.AllocScriptNode()) asCScriptNode(snTypedef); + + sToken token; + + GetToken(&token); + if( token.type != ttTypedef) + { + Error(ExpectedToken(asGetTokenDefinition(token.type)).AddressOf(), &token); + return node; + } + + node->SetToken(&token); + node->UpdateSourcePos(token.pos, token.length); + + // Parse the base type + GetToken(&token); + RewindTo(&token); + + // Make sure it is a primitive type (except ttVoid) + if( !IsRealType(token.type) || token.type == ttVoid ) + { + asCString str; + str.Format(TXT_UNEXPECTED_TOKEN_s, asGetTokenDefinition(token.type)); + Error(str.AddressOf(), &token); + return node; + } + + node->AddChildLast(ParseRealType()); + node->AddChildLast(ParseIdentifier()); + + // Check for the end of the typedef + GetToken(&token); + if( token.type != ttEndStatement ) + { + RewindTo(&token); + Error(ExpectedToken(asGetTokenDefinition(token.type)).AddressOf(), &token); + } + + return node; +} + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_parser.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_parser.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_parser.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_parser.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,205 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_parser.h +// +// This class parses the script code and builds a tree for compilation +// + + + +/* + +TYPEDEF = 'typedef' REALTYPE IDENTIFIER ';' +ENUM = 'enum' IDENTIFIER '{' ENUMELEMENT? (',' ENUMELEMENT)* '}' +ENUMELEMENT = IDENTIFIER ('=' EXPRESSION) +SCRIPT = (FUNCTION | GLOBVAR | IMPORT | STRUCT | INTERFACE | TYPEDEF | ENUM)* +TYPE = 'const'? DATATYPE +TYPEMOD = ('&' ('in' | 'out' | 'inout')?)? +FUNCTION = TYPE TYPEMOD IDENTIFIER PARAMLIST BLOCK +IMPORT = 'import' TYPE TYPEMOD IDENTIFIER PARAMLIST 'from' STRING ';' +INTERFACE = 'interface' IDENTIFIER '{' (TYPE TYPEMOD IDENTIFIER PARAMLIST ';')* '}' ';' +GLOBVAR = TYPE IDENTIFIER ('=' (INITLIST | ASSIGNMENT))? (',' IDENTIFIER ('=' (INITLIST | ASSIGNMENT))?)* ';' +DATATYPE = REALTYPE | IDENTIFIER +REALTYPE = 'void' | 'bool' | 'float' | 'int' | 'uint' | 'bits' +PARAMLIST = '(' (TYPE TYPEMOD IDENTIFIER? (',' TYPE TYPEMOD IDENTIFIER?)*)? ')' +BLOCK = '{' (DECLARATION | STATEMENT)* '}' +DECLARATION = TYPE IDENTIFIER ('=' (INITLIST | ASSIGNMENT))? (',' IDENTIFIER ('=' (INITLIST | ASSIGNMENT))?)* ';' +STATEMENT = BLOCK | IF | WHILE | DOWHILE | RETURN | EXPRSTATEMENT | BREAK | CONTINUE +BREAK = 'break' ';' +CONTINUE = 'continue' ';' +EXPRSTATEMENT = ASSIGNMENT? ';' +FOR = 'for' '(' (DECLARATION | EXPRSTATEMENT) EXPRSTATEMENT ASSIGNMENT? ')' STATEMENT +IF = 'if' '(' ASSIGNMENT ')' STATEMENT ('else' STATEMENT)? +WHILE = 'while' '(' ASSIGNMENT ')' STATEMENT +DOWHILE = 'do' STATEMENT 'while' '(' ASSIGNMENT ')' ';' +RETURN = 'return' ASSIGNMENT? ';' +ASSIGNMENT = CONDITION (ASSIGNOP ASSIGNMENT)? +CONDITION = EXPRESSION ('?' ASSIGNMENT ':' ASSIGNMENT)? +EXPRESSION = TERM (OP TERM)* +TERM = PRE* VALUE POST* +VALUE = '(' ASSIGNMENT ')' | CONSTANT | IDENTIFIER | FUNCTIONCALL | CONVERSION | CAST +PRE = '-' | '+' | 'not' | '++' | '--' | '~' +POST = '++' | '--' | ('.' | '->') (IDENTIFIER | FUNCTIONCALL) | '[' ASSIGNMENT ']' +FUNCTIONCALL = IDENTIFIER ARGLIST +ARGLIST = '(' (ASSIGNMENT (',' ASSIGNMENT)*)? ')' +CONSTANT = "abc" | 123 | 123.1 | 'true' | 'false' | 0xFFFF +OP = 'and' | 'or' | + '==' | '!=' | '<' | '<=' | '>=' | '>' | + '+' | '-' | '*' | '/' | '%' | '|' | '&' | '^' | '<<' | '>>' | '>>>' +ASSIGNOP = '=' | '+=' | '-=' | '*=' | '/=' | '%=' | '|=' | '&=' | '^=' | '<<=' | '>>=' | '>>>=' +CONVERSION = TYPE '(' ASSIGNMENT ')' +INITLIST = '{' ((INITLIST | ASSIGNMENT)? (',' (INITLIST | ASSIGNMENT)?)*)? '}' +CAST = 'cast' '<' TYPE '>' '(' ASSIGNMENT ')' + +*/ + +#ifndef AS_PARSER_H +#define AS_PARSER_H + +#include "as_scriptnode.h" +#include "as_scriptcode.h" +#include "as_builder.h" +#include "as_tokenizer.h" + +BEGIN_AS_NAMESPACE + +class asCParser +{ +public: + asCParser(asCBuilder *builder); + ~asCParser(); + + int ParseScript(asCScriptCode *script); + int ParseFunctionDefinition(asCScriptCode *script); + int ParsePropertyDeclaration(asCScriptCode *script); + int ParseDataType(asCScriptCode *script); + int ParseTemplateDecl(asCScriptCode *script); + + int ParseStatementBlock(asCScriptCode *script, asCScriptNode *block); + int ParseGlobalVarInit(asCScriptCode *script, asCScriptNode *init); + + asCScriptNode *GetScriptNode(); + +protected: + void Reset(); + + void GetToken(sToken *token); + void RewindTo(const sToken *token); + void Error(const char *text, sToken *token); + + asCScriptNode *ParseImport(); + asCScriptNode *ParseFunctionDefinition(); + + asCScriptNode *ParseScript(); + asCScriptNode *ParseType(bool allowConst, bool allowVariableType = false); + asCScriptNode *ParseTypeMod(bool isParam); + asCScriptNode *ParseFunction(bool isMethod = false); + asCScriptNode *ParseGlobalVar(); + asCScriptNode *ParseParameterList(); + asCScriptNode *SuperficiallyParseStatementBlock(); + asCScriptNode *SuperficiallyParseGlobalVarInit(); + asCScriptNode *ParseStatementBlock(); + asCScriptNode *ParseDeclaration(); + asCScriptNode *ParseStatement(); + asCScriptNode *ParseExpressionStatement(); + asCScriptNode *ParseSwitch(); + asCScriptNode *ParseCase(); + asCScriptNode *ParseIf(); + asCScriptNode *ParseFor(); + asCScriptNode *ParseWhile(); + asCScriptNode *ParseDoWhile(); + asCScriptNode *ParseReturn(); + asCScriptNode *ParseBreak(); + asCScriptNode *ParseContinue(); + asCScriptNode *ParseAssignment(); + asCScriptNode *ParseAssignOperator(); + asCScriptNode *ParseCondition(); + asCScriptNode *ParseExpression(); + asCScriptNode *ParseExprTerm(); + asCScriptNode *ParseExprOperator(); + asCScriptNode *ParseExprPreOp(); + asCScriptNode *ParseExprPostOp(); + asCScriptNode *ParseExprValue(); + asCScriptNode *ParseArgList(); + asCScriptNode *ParseDataType(bool allowVariableType = false); + asCScriptNode *ParseRealType(); + asCScriptNode *ParseIdentifier(); + asCScriptNode *ParseConstant(); + asCScriptNode *ParseStringConstant(); + asCScriptNode *ParseFunctionCall(); + asCScriptNode *ParseVariableAccess(); + asCScriptNode *ParseConstructCall(); + asCScriptNode *ParseToken(int token); + asCScriptNode *ParseOneOf(int *tokens, int num); + asCScriptNode *ParseClass(); + asCScriptNode *ParseInitList(); + asCScriptNode *ParseInterface(); + asCScriptNode *ParseInterfaceMethod(); + asCScriptNode *ParseCast(); + asCScriptNode *ParseEnumeration(); // Parse enumeration enum { X, Y } + asCScriptNode *ParseTypedef(); // Parse named type declaration + + bool IsVarDecl(); + bool IsFuncDecl(bool isMethod); + bool IsRealType(int tokenType); + bool IsDataType(const sToken &token); + bool IsOperator(int tokenType); + bool IsPreOperator(int tokenType); + bool IsPostOperator(int tokenType); + bool IsConstant(int tokenType); + bool IsAssignOperator(int tokenType); + bool IsFunctionCall(); + + bool CheckTemplateType(sToken &t); + + asCString ExpectedToken(const char *token); + asCString ExpectedTokens(const char *token1, const char *token2); + asCString ExpectedOneOf(int *tokens, int count); + + bool errorWhileParsing; + bool isSyntaxError; + bool checkValidTypes; + bool isParsingAppInterface; + + asCScriptEngine *engine; + asCBuilder *builder; + asCScriptCode *script; + asCScriptNode *scriptNode; + + asCTokenizer tokenizer; + size_t sourcePos; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_property.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_property.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_property.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_property.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,100 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_property.h +// +// A class for storing object property information +// + + + +#ifndef AS_PROPERTY_H +#define AS_PROPERTY_H + +#include "as_string.h" +#include "as_datatype.h" +#include "as_atomic.h" +#include "as_scriptfunction.h" + +BEGIN_AS_NAMESPACE + +class asCObjectProperty +{ +public: + asCString name; + asCDataType type; + int byteOffset; +}; + +// TODO: functions: When function pointers are available, it will be possible to create a circular +// reference between a function pointer in global variable and a function. To +// resolve this I need to use a garbage collector. + +class asCGlobalProperty +{ +public: + asCGlobalProperty(); + ~asCGlobalProperty(); + + void AddRef(); + void Release(); + + void *GetAddressOfValue(); + void AllocateMemory(); + void SetRegisteredAddress(void *p); + + asCString name; + asCDataType type; + asUINT id; + asCScriptFunction *initFunc; + +protected: + // This is only stored for registered properties, and keeps the pointer given by the application + void *realAddress; + + bool memoryAllocated; + union + { + void *memory; + asQWORD storage; + }; + +protected: + // The global property structure is reference counted, so that the + // engine can keep track of how many references to the property there are. + friend class asCScriptEngine; + asCAtomic refCount; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_restore.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_restore.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_restore.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_restore.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1486 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_restore.cpp +// +// Functions for saving and restoring module bytecode +// asCRestore was originally written by Dennis Bollyn, dennis@gyrbo.be + +#include "as_config.h" +#include "as_restore.h" +#include "as_bytecode.h" +#include "as_arrayobject.h" + +BEGIN_AS_NAMESPACE + +#define WRITE_NUM(N) stream->Write(&(N), sizeof(N)) +#define READ_NUM(N) stream->Read(&(N), sizeof(N)) + +asCRestore::asCRestore(asCModule* _module, asIBinaryStream* _stream, asCScriptEngine* _engine) + : module(_module), stream(_stream), engine(_engine) +{ +} + +int asCRestore::Save() +{ + unsigned long i, count; + + // Store everything in the same order that the builder parses scripts + + // Store enums + count = (asUINT)module->enumTypes.GetLength(); + WRITE_NUM(count); + for( i = 0; i < count; i++ ) + { + WriteObjectTypeDeclaration(module->enumTypes[i], false); + WriteObjectTypeDeclaration(module->enumTypes[i], true); + } + + // Store type declarations first + count = (asUINT)module->classTypes.GetLength(); + WRITE_NUM(count); + for( i = 0; i < count; i++ ) + { + // Store only the name of the class/interface types + WriteObjectTypeDeclaration(module->classTypes[i], false); + } + + // Now store all interface methods + for( i = 0; i < count; i++ ) + { + if( module->classTypes[i]->IsInterface() ) + WriteObjectTypeDeclaration(module->classTypes[i], true); + } + + // Then store the class methods, properties, and behaviours + for( i = 0; i < count; ++i ) + { + if( !module->classTypes[i]->IsInterface() ) + WriteObjectTypeDeclaration(module->classTypes[i], true); + } + + // Store typedefs + count = (asUINT)module->typeDefs.GetLength(); + WRITE_NUM(count); + for( i = 0; i < count; i++ ) + { + WriteObjectTypeDeclaration(module->typeDefs[i], false); + WriteObjectTypeDeclaration(module->typeDefs[i], true); + } + + // scriptGlobals[] + count = (asUINT)module->scriptGlobals.GetLength(); + WRITE_NUM(count); + for( i = 0; i < count; ++i ) + WriteGlobalProperty(module->scriptGlobals[i]); + + // scriptFunctions[] + count = 0; + for( i = 0; i < module->scriptFunctions.GetLength(); i++ ) + if( module->scriptFunctions[i]->objectType == 0 ) + count++; + WRITE_NUM(count); + for( i = 0; i < module->scriptFunctions.GetLength(); ++i ) + if( module->scriptFunctions[i]->objectType == 0 ) + WriteFunction(module->scriptFunctions[i]); + + // globalFunctions[] + count = (int)module->globalFunctions.GetLength(); + WRITE_NUM(count); + for( i = 0; i < count; i++ ) + { + WriteFunction(module->globalFunctions[i]); + } + + // bindInformations[] + count = (asUINT)module->bindInformations.GetLength(); + WRITE_NUM(count); + for( i = 0; i < count; ++i ) + { + WriteFunction(module->bindInformations[i]->importedFunctionSignature); + WriteString(&module->bindInformations[i]->importFromModule); + } + + // usedTypes[] + count = (asUINT)usedTypes.GetLength(); + WRITE_NUM(count); + for( i = 0; i < count; ++i ) + { + WriteObjectType(usedTypes[i]); + } + + // usedTypeIds[] + WriteUsedTypeIds(); + + // usedFunctions[] + WriteUsedFunctions(); + + // usedGlobalProperties[] + WriteUsedGlobalProps(); + + // usedStringConstants[] + WriteUsedStringConstants(); + + // TODO: Store script section names + + return asSUCCESS; +} + +int asCRestore::Restore() +{ + // Before starting the load, make sure that + // any existing resources have been freed + module->InternalReset(); + + unsigned long i, count; + + asCScriptFunction* func; + + // Read enums + READ_NUM(count); + module->enumTypes.Allocate(count, 0); + for( i = 0; i < count; i++ ) + { + asCObjectType *ot = asNEW(asCObjectType)(engine); + ReadObjectTypeDeclaration(ot, false); + engine->classTypes.PushLast(ot); + module->enumTypes.PushLast(ot); + ot->AddRef(); + ReadObjectTypeDeclaration(ot, true); + } + + // structTypes[] + // First restore the structure names, then the properties + READ_NUM(count); + module->classTypes.Allocate(count, 0); + for( i = 0; i < count; ++i ) + { + asCObjectType *ot = asNEW(asCObjectType)(engine); + ReadObjectTypeDeclaration(ot, false); + engine->classTypes.PushLast(ot); + module->classTypes.PushLast(ot); + ot->AddRef(); + + // Add script classes to the GC + if( (ot->GetFlags() & asOBJ_SCRIPT_OBJECT) && ot->GetSize() > 0 ) + engine->gc.AddScriptObjectToGC(ot, &engine->objectTypeBehaviours); + } + + // Read interface methods + for( i = 0; i < module->classTypes.GetLength(); i++ ) + { + if( module->classTypes[i]->IsInterface() ) + ReadObjectTypeDeclaration(module->classTypes[i], true); + } + + module->ResolveInterfaceIds(); + + // Read class methods, properties, and behaviours + for( i = 0; i < module->classTypes.GetLength(); ++i ) + { + if( !module->classTypes[i]->IsInterface() ) + ReadObjectTypeDeclaration(module->classTypes[i], true); + } + + // Read typedefs + READ_NUM(count); + module->typeDefs.Allocate(count, 0); + for( i = 0; i < count; i++ ) + { + asCObjectType *ot = asNEW(asCObjectType)(engine); + ReadObjectTypeDeclaration(ot, false); + engine->classTypes.PushLast(ot); + module->typeDefs.PushLast(ot); + ot->AddRef(); + ReadObjectTypeDeclaration(ot, true); + } + + // scriptGlobals[] + READ_NUM(count); + module->scriptGlobals.Allocate(count, 0); + for( i = 0; i < count; ++i ) + { + ReadGlobalProperty(); + } + + // scriptFunctions[] + READ_NUM(count); + for( i = 0; i < count; ++i ) + { + func = ReadFunction(); + } + + // globalFunctions[] + READ_NUM(count); + for( i = 0; i < count; ++i ) + { + func = ReadFunction(false, false); + + module->globalFunctions.PushLast(func); + func->AddRef(); + } + + // bindInformations[] + READ_NUM(count); + module->bindInformations.SetLength(count); + for(i=0;iimportedFunctionSignature = ReadFunction(false, false); + info->importedFunctionSignature->id = int(FUNC_IMPORTED + engine->importedFunctions.GetLength()); + engine->importedFunctions.PushLast(info); + ReadString(&info->importFromModule); + info->boundFunctionId = -1; + module->bindInformations[i] = info; + } + + // usedTypes[] + READ_NUM(count); + usedTypes.Allocate(count, 0); + for( i = 0; i < count; ++i ) + { + asCObjectType *ot = ReadObjectType(); + usedTypes.PushLast(ot); + } + + // usedTypeIds[] + ReadUsedTypeIds(); + + // usedFunctions[] + ReadUsedFunctions(); + + // usedGlobalProperties[] + ReadUsedGlobalProps(); + + // usedStringConstants[] + ReadUsedStringConstants(); + + for( i = 0; i < module->scriptFunctions.GetLength(); i++ ) + TranslateFunction(module->scriptFunctions[i]); + for( i = 0; i < module->scriptGlobals.GetLength(); i++ ) + if( module->scriptGlobals[i]->initFunc ) + TranslateFunction(module->scriptGlobals[i]->initFunc); + + // Init system functions properly + engine->PrepareEngine(); + + // Add references for all functions + for( i = 0; i < module->scriptFunctions.GetLength(); i++ ) + module->scriptFunctions[i]->AddReferences(); + for( i = 0; i < module->scriptGlobals.GetLength(); i++ ) + if( module->scriptGlobals[i]->initFunc ) + module->scriptGlobals[i]->initFunc->AddReferences(); + + module->CallInit(); + + return 0; +} + +int asCRestore::FindStringConstantIndex(int id) +{ + for( asUINT i = 0; i < usedStringConstants.GetLength(); i++ ) + if( usedStringConstants[i] == id ) + return i; + + usedStringConstants.PushLast(id); + return int(usedStringConstants.GetLength() - 1); +} + +void asCRestore::WriteUsedStringConstants() +{ + asUINT count = (asUINT)usedStringConstants.GetLength(); + WRITE_NUM(count); + for( asUINT i = 0; i < count; ++i ) + WriteString(engine->stringConstants[i]); +} + +void asCRestore::ReadUsedStringConstants() +{ + asCString str; + + asUINT count; + READ_NUM(count); + usedStringConstants.SetLength(count); + for( asUINT i = 0; i < count; ++i ) + { + ReadString(&str); + usedStringConstants[i] = engine->AddConstantString(str.AddressOf(), str.GetLength()); + } +} + +void asCRestore::WriteUsedFunctions() +{ + asUINT count = (asUINT)usedFunctions.GetLength(); + WRITE_NUM(count); + + for( asUINT n = 0; n < usedFunctions.GetLength(); n++ ) + { + char c; + + // Write enough data to be able to uniquely identify the function upon load + + // Is the function from the module or the application? + c = usedFunctions[n]->module ? 'm' : 'a'; + WRITE_NUM(c); + + WriteFunctionSignature(usedFunctions[n]); + } +} + +void asCRestore::ReadUsedFunctions() +{ + asUINT count; + READ_NUM(count); + usedFunctions.SetLength(count); + + for( asUINT n = 0; n < usedFunctions.GetLength(); n++ ) + { + char c; + + // Read the data to be able to uniquely identify the function + + // Is the function from the module or the application? + READ_NUM(c); + + asCScriptFunction func(engine, c == 'm' ? module : 0, -1); + ReadFunctionSignature(&func); + + // Find the correct function + if( c == 'm' ) + { + for( asUINT i = 0; i < module->scriptFunctions.GetLength(); i++ ) + { + asCScriptFunction *f = module->scriptFunctions[i]; + if( !func.IsSignatureEqual(f) || + func.objectType != f->objectType || + func.funcType != f->funcType ) + continue; + + usedFunctions[n] = f; + break; + } + } + else + { + for( asUINT i = 0; i < engine->scriptFunctions.GetLength(); i++ ) + { + asCScriptFunction *f = engine->scriptFunctions[i]; + if( f == 0 || + !func.IsSignatureEqual(f) || + func.objectType != f->objectType ) + continue; + + usedFunctions[n] = f; + break; + } + } + + // Set the type to dummy so it won't try to release the id + func.funcType = -1; + } +} + +void asCRestore::WriteFunctionSignature(asCScriptFunction *func) +{ + asUINT i, count; + + WriteString(&func->name); + WriteDataType(&func->returnType); + count = (asUINT)func->parameterTypes.GetLength(); + WRITE_NUM(count); + for( i = 0; i < count; ++i ) + WriteDataType(&func->parameterTypes[i]); + + count = (asUINT)func->inOutFlags.GetLength(); + WRITE_NUM(count); + for( i = 0; i < count; ++i ) + WRITE_NUM(func->inOutFlags[i]); + + WRITE_NUM(func->funcType); + + WriteObjectType(func->objectType); + + WRITE_NUM(func->isReadOnly); +} + +void asCRestore::ReadFunctionSignature(asCScriptFunction *func) +{ + int i, count; + asCDataType dt; + int num; + + ReadString(&func->name); + ReadDataType(&func->returnType); + READ_NUM(count); + func->parameterTypes.Allocate(count, 0); + for( i = 0; i < count; ++i ) + { + ReadDataType(&dt); + func->parameterTypes.PushLast(dt); + } + + READ_NUM(count); + func->inOutFlags.Allocate(count, 0); + for( i = 0; i < count; ++i ) + { + READ_NUM(num); + func->inOutFlags.PushLast(static_cast(num)); + } + + READ_NUM(func->funcType); + + func->objectType = ReadObjectType(); + + READ_NUM(func->isReadOnly); +} + +void asCRestore::WriteFunction(asCScriptFunction* func) +{ + char c; + + // If there is no function, then store a null char + if( func == 0 ) + { + c = '\0'; + WRITE_NUM(c); + return; + } + + // First check if the function has been saved already + for( asUINT f = 0; f < savedFunctions.GetLength(); f++ ) + { + if( savedFunctions[f] == func ) + { + c = 'r'; + WRITE_NUM(c); + WRITE_NUM(f); + return; + } + } + + // Keep a reference to the function in the list + savedFunctions.PushLast(func); + + c = 'f'; + WRITE_NUM(c); + + asUINT i, count; + + WriteFunctionSignature(func); + + count = (asUINT)func->byteCode.GetLength(); + WRITE_NUM(count); + WriteByteCode(func->byteCode.AddressOf(), count); + + count = (asUINT)func->objVariablePos.GetLength(); + WRITE_NUM(count); + for( i = 0; i < count; ++i ) + { + WriteObjectType(func->objVariableTypes[i]); + WRITE_NUM(func->objVariablePos[i]); + } + + WRITE_NUM(func->stackNeeded); + + asUINT length = (asUINT)func->lineNumbers.GetLength(); + WRITE_NUM(length); + for( i = 0; i < length; ++i ) + WRITE_NUM(func->lineNumbers[i]); + + WRITE_NUM(func->vfTableIdx); + + WriteGlobalVarPointers(func); + + // TODO: Write variables + + // TODO: Store script section index +} + +asCScriptFunction *asCRestore::ReadFunction(bool addToModule, bool addToEngine) +{ + char c; + READ_NUM(c); + + if( c == '\0' ) + { + // There is no function, so return a null pointer + return 0; + } + + if( c == 'r' ) + { + // This is a reference to a previously saved function + int index; + READ_NUM(index); + + return savedFunctions[index]; + } + + // Load the new function + asCScriptFunction *func = asNEW(asCScriptFunction)(engine,module,-1); + savedFunctions.PushLast(func); + + int i, count; + asCDataType dt; + int num; + + ReadFunctionSignature(func); + + if( func->funcType == asFUNC_SCRIPT ) + engine->gc.AddScriptObjectToGC(func, &engine->functionBehaviours); + + func->id = engine->GetNextScriptFunctionId(); + + READ_NUM(count); + func->byteCode.Allocate(count, 0); + ReadByteCode(func->byteCode.AddressOf(), count); + func->byteCode.SetLength(count); + + READ_NUM(count); + func->objVariablePos.Allocate(count, 0); + func->objVariableTypes.Allocate(count, 0); + for( i = 0; i < count; ++i ) + { + func->objVariableTypes.PushLast(ReadObjectType()); + READ_NUM(num); + func->objVariablePos.PushLast(num); + } + + READ_NUM(func->stackNeeded); + + int length; + READ_NUM(length); + func->lineNumbers.SetLength(length); + for( i = 0; i < length; ++i ) + READ_NUM(func->lineNumbers[i]); + + READ_NUM(func->vfTableIdx); + + if( addToModule ) + { + // The refCount is already 1 + module->scriptFunctions.PushLast(func); + } + if( addToEngine ) + engine->SetScriptFunction(func); + if( func->objectType ) + func->ComputeSignatureId(); + + ReadGlobalVarPointers(func); + + return func; +} + +void asCRestore::WriteObjectTypeDeclaration(asCObjectType *ot, bool writeProperties) +{ + if( !writeProperties ) + { + // name + WriteString(&ot->name); + // size + int size = ot->size; + WRITE_NUM(size); + // flags + asDWORD flags = ot->flags; + WRITE_NUM(flags); + } + else + { + if( ot->flags & asOBJ_ENUM ) + { + // enumValues[] + int size = (int)ot->enumValues.GetLength(); + WRITE_NUM(size); + + for( int n = 0; n < size; n++ ) + { + WriteString(&ot->enumValues[n]->name); + WRITE_NUM(ot->enumValues[n]->value); + } + } + else if( ot->flags & asOBJ_TYPEDEF ) + { + eTokenType t = ot->templateSubType.GetTokenType(); + WRITE_NUM(t); + } + else + { + WriteObjectType(ot->derivedFrom); + + // interfaces[] + int size = (asUINT)ot->interfaces.GetLength(); + WRITE_NUM(size); + asUINT n; + for( n = 0; n < ot->interfaces.GetLength(); n++ ) + { + WriteObjectType(ot->interfaces[n]); + } + + // properties[] + size = (asUINT)ot->properties.GetLength(); + WRITE_NUM(size); + for( n = 0; n < ot->properties.GetLength(); n++ ) + { + WriteObjectProperty(ot->properties[n]); + } + + // behaviours + if( !ot->IsInterface() && ot->flags != asOBJ_TYPEDEF && ot->flags != asOBJ_ENUM ) + { + WriteFunction(engine->scriptFunctions[ot->beh.construct]); + WriteFunction(engine->scriptFunctions[ot->beh.destruct]); + WriteFunction(engine->scriptFunctions[ot->beh.factory]); + size = (int)ot->beh.constructors.GetLength() - 1; + WRITE_NUM(size); + for( n = 1; n < ot->beh.constructors.GetLength(); n++ ) + { + WriteFunction(engine->scriptFunctions[ot->beh.constructors[n]]); + WriteFunction(engine->scriptFunctions[ot->beh.factories[n]]); + } + } + + // methods[] + size = (int)ot->methods.GetLength(); + WRITE_NUM(size); + for( n = 0; n < ot->methods.GetLength(); n++ ) + { + WriteFunction(engine->scriptFunctions[ot->methods[n]]); + } + + // virtualFunctionTable[] + size = (int)ot->virtualFunctionTable.GetLength(); + WRITE_NUM(size); + for( n = 0; n < (asUINT)size; n++ ) + { + WriteFunction(ot->virtualFunctionTable[n]); + } + } + } +} + +void asCRestore::ReadObjectTypeDeclaration(asCObjectType *ot, bool readProperties) +{ + if( !readProperties ) + { + // name + ReadString(&ot->name); + // size + int size; + READ_NUM(size); + ot->size = size; + // flags + asDWORD flags; + READ_NUM(flags); + ot->flags = flags; + + // Use the default script class behaviours + ot->beh = engine->scriptTypeBehaviours.beh; + engine->scriptFunctions[ot->beh.addref]->AddRef(); + engine->scriptFunctions[ot->beh.release]->AddRef(); + engine->scriptFunctions[ot->beh.gcEnumReferences]->AddRef(); + engine->scriptFunctions[ot->beh.gcGetFlag]->AddRef(); + engine->scriptFunctions[ot->beh.gcGetRefCount]->AddRef(); + engine->scriptFunctions[ot->beh.gcReleaseAllReferences]->AddRef(); + engine->scriptFunctions[ot->beh.gcSetFlag]->AddRef(); + engine->scriptFunctions[ot->beh.copy]->AddRef(); + engine->scriptFunctions[ot->beh.factory]->AddRef(); + engine->scriptFunctions[ot->beh.construct]->AddRef(); + for( asUINT i = 1; i < ot->beh.operators.GetLength(); i += 2 ) + engine->scriptFunctions[ot->beh.operators[i]]->AddRef(); + } + else + { + if( ot->flags & asOBJ_ENUM ) + { + int count; + READ_NUM(count); + ot->enumValues.Allocate(count, 0); + for( int n = 0; n < count; n++ ) + { + asSEnumValue *e = asNEW(asSEnumValue); + ReadString(&e->name); + READ_NUM(e->value); + ot->enumValues.PushLast(e); + } + } + else if( ot->flags & asOBJ_TYPEDEF ) + { + eTokenType t; + READ_NUM(t); + ot->templateSubType = asCDataType::CreatePrimitive(t, false); + } + else + { + ot->derivedFrom = ReadObjectType(); + if( ot->derivedFrom ) + ot->derivedFrom->AddRef(); + + // interfaces[] + int size; + READ_NUM(size); + ot->interfaces.Allocate(size,0); + int n; + for( n = 0; n < size; n++ ) + { + asCObjectType *intf = ReadObjectType(); + ot->interfaces.PushLast(intf); + } + + // properties[] + READ_NUM(size); + ot->properties.Allocate(size,0); + for( n = 0; n < size; n++ ) + { + asCObjectProperty *prop = asNEW(asCObjectProperty); + ReadObjectProperty(prop); + ot->properties.PushLast(prop); + } + + // behaviours + if( !ot->IsInterface() && ot->flags != asOBJ_TYPEDEF && ot->flags != asOBJ_ENUM ) + { + asCScriptFunction *func = ReadFunction(); + engine->scriptFunctions[ot->beh.construct]->Release(); + ot->beh.construct = func->id; + ot->beh.constructors[0] = func->id; + func->AddRef(); + + func = ReadFunction(); + if( func ) + { + ot->beh.destruct = func->id; + func->AddRef(); + } + + func = ReadFunction(); + engine->scriptFunctions[ot->beh.factory]->Release(); + ot->beh.factory = func->id; + ot->beh.factories[0] = func->id; + func->AddRef(); + + READ_NUM(size); + for( n = 0; n < size; n++ ) + { + asCScriptFunction *func = ReadFunction(); + ot->beh.constructors.PushLast(func->id); + func->AddRef(); + + func = ReadFunction(); + ot->beh.factories.PushLast(func->id); + func->AddRef(); + } + } + + // methods[] + READ_NUM(size); + for( n = 0; n < size; n++ ) + { + asCScriptFunction *func = ReadFunction(); + ot->methods.PushLast(func->id); + func->AddRef(); + } + + // virtualFunctionTable[] + READ_NUM(size); + for( n = 0; n < size; n++ ) + { + asCScriptFunction *func = ReadFunction(); + ot->virtualFunctionTable.PushLast(func); + func->AddRef(); + } + } + } +} + +void asCRestore::WriteString(asCString* str) +{ + asUINT len = (asUINT)str->GetLength(); + WRITE_NUM(len); + stream->Write(str->AddressOf(), (asUINT)len); +} + +void asCRestore::ReadString(asCString* str) +{ + asUINT len; + READ_NUM(len); + str->SetLength(len); + stream->Read(str->AddressOf(), len); +} + +void asCRestore::WriteGlobalProperty(asCGlobalProperty* prop) +{ + // TODO: We might be able to avoid storing the name and type of the global + // properties twice if we merge this with the WriteUsedGlobalProperties. + WriteString(&prop->name); + WriteDataType(&prop->type); + + // Store the initialization function + if( prop->initFunc ) + { + bool f = true; + WRITE_NUM(f); + + WriteFunction(prop->initFunc); + } + else + { + bool f = false; + WRITE_NUM(f); + } +} + +void asCRestore::ReadGlobalProperty() +{ + asCString name; + asCDataType type; + + ReadString(&name); + ReadDataType(&type); + + asCGlobalProperty *prop = module->AllocateGlobalProperty(name.AddressOf(), type); + + // Read the initialization function + bool f; + READ_NUM(f); + if( f ) + { + asCScriptFunction *func = ReadFunction(false, true); + + // refCount was already set to 1 + prop->initFunc = func; + } +} + +void asCRestore::WriteObjectProperty(asCObjectProperty* prop) +{ + WriteString(&prop->name); + WriteDataType(&prop->type); + WRITE_NUM(prop->byteOffset); +} + +void asCRestore::ReadObjectProperty(asCObjectProperty* prop) +{ + ReadString(&prop->name); + ReadDataType(&prop->type); + READ_NUM(prop->byteOffset); +} + +void asCRestore::WriteDataType(const asCDataType *dt) +{ + bool b; + int t = dt->GetTokenType(); + WRITE_NUM(t); + WriteObjectType(dt->GetObjectType()); + b = dt->IsObjectHandle(); + WRITE_NUM(b); + b = dt->IsReadOnly(); + WRITE_NUM(b); + b = dt->IsHandleToConst(); + WRITE_NUM(b); + b = dt->IsReference(); + WRITE_NUM(b); +} + +void asCRestore::ReadDataType(asCDataType *dt) +{ + eTokenType tokenType; + READ_NUM(tokenType); + asCObjectType *objType = ReadObjectType(); + bool isObjectHandle; + READ_NUM(isObjectHandle); + bool isReadOnly; + READ_NUM(isReadOnly); + bool isHandleToConst; + READ_NUM(isHandleToConst); + bool isReference; + READ_NUM(isReference); + + if( tokenType == ttIdentifier ) + *dt = asCDataType::CreateObject(objType, false); + else + *dt = asCDataType::CreatePrimitive(tokenType, false); + if( isObjectHandle ) + { + dt->MakeReadOnly(isHandleToConst); + dt->MakeHandle(true); + } + dt->MakeReadOnly(isReadOnly); + dt->MakeReference(isReference); +} + +void asCRestore::WriteObjectType(asCObjectType* ot) +{ + char ch; + + // Only write the object type name + if( ot ) + { + // Check for template instances/specializations + if( ot->templateSubType.GetTokenType() != ttUnrecognizedToken && + ot != engine->defaultArrayObjectType ) + { + ch = 'a'; + WRITE_NUM(ch); + + if( ot->templateSubType.IsObject() ) + { + ch = 's'; + WRITE_NUM(ch); + WriteObjectType(ot->templateSubType.GetObjectType()); + + if( ot->templateSubType.IsObjectHandle() ) + ch = 'h'; + else + ch = 'o'; + WRITE_NUM(ch); + } + else + { + ch = 't'; + WRITE_NUM(ch); + eTokenType t = ot->templateSubType.GetTokenType(); + WRITE_NUM(t); + } + } + else if( ot->flags & asOBJ_TEMPLATE_SUBTYPE ) + { + ch = 's'; + WRITE_NUM(ch); + WriteString(&ot->name); + } + else + { + ch = 'o'; + WRITE_NUM(ch); + WriteString(&ot->name); + } + } + else + { + ch = '\0'; + WRITE_NUM(ch); + // Write a null string + asDWORD null = 0; + WRITE_NUM(null); + } +} + +asCObjectType* asCRestore::ReadObjectType() +{ + asCObjectType *ot; + char ch; + READ_NUM(ch); + if( ch == 'a' ) + { + READ_NUM(ch); + if( ch == 's' ) + { + ot = ReadObjectType(); + asCDataType dt = asCDataType::CreateObject(ot, false); + + READ_NUM(ch); + if( ch == 'h' ) + dt.MakeHandle(true); + + dt.MakeArray(engine); + ot = dt.GetObjectType(); + + asASSERT(ot); + } + else + { + eTokenType tokenType; + READ_NUM(tokenType); + asCDataType dt = asCDataType::CreatePrimitive(tokenType, false); + dt.MakeArray(engine); + ot = dt.GetObjectType(); + + asASSERT(ot); + } + } + else if( ch == 's' ) + { + // Read the name of the template subtype + asCString typeName; + ReadString(&typeName); + + // Find the template subtype + for( asUINT n = 0; n < engine->templateSubTypes.GetLength(); n++ ) + { + if( engine->templateSubTypes[n] && engine->templateSubTypes[n]->name == typeName ) + { + ot = engine->templateSubTypes[n]; + break; + } + } + + // TODO: Should give a friendly error in case the template type isn't found + asASSERT(ot); + } + else + { + // Read the object type name + asCString typeName; + ReadString(&typeName); + + if( typeName.GetLength() && typeName != "_builtin_object_" ) + { + // Find the object type + ot = module->GetObjectType(typeName.AddressOf()); + if( !ot ) + ot = engine->GetObjectType(typeName.AddressOf()); + + asASSERT(ot); + } + else if( typeName == "_builtin_object_" ) + { + ot = &engine->scriptTypeBehaviours; + } + else + ot = 0; + } + + return ot; +} + +void asCRestore::WriteByteCode(asDWORD *bc, int length) +{ + while( length ) + { + asDWORD c = *(asBYTE*)bc; + + if( c == asBC_ALLOC ) + { + WRITE_NUM(*bc++); + asDWORD tmp[MAX_DATA_SIZE]; + int n; + for( n = 0; n < asBCTypeSize[asBCInfo[c].type]-1; n++ ) + tmp[n] = *bc++; + + // Translate the object type + asCObjectType *ot = *(asCObjectType**)tmp; + *(int*)tmp = FindObjectTypeIdx(ot); + + // Translate the constructor func id, if it is a script class + if( ot->flags & asOBJ_SCRIPT_OBJECT ) + *(int*)&tmp[AS_PTR_SIZE] = FindFunctionIndex(engine->scriptFunctions[*(int*)&tmp[AS_PTR_SIZE]]); + + for( n = 0; n < asBCTypeSize[asBCInfo[c].type]-1; n++ ) + WRITE_NUM(tmp[n]); + } + else if( c == asBC_FREE || + c == asBC_REFCPY || + c == asBC_OBJTYPE ) + { + WRITE_NUM(*bc++); + // Translate object type pointers into indices + asDWORD tmp[MAX_DATA_SIZE]; + int n; + for( n = 0; n < asBCTypeSize[asBCInfo[c].type]-1; n++ ) + tmp[n] = *bc++; + + *(int*)tmp = FindObjectTypeIdx(*(asCObjectType**)tmp); + + for( n = 0; n < asBCTypeSize[asBCInfo[c].type]-1; n++ ) + WRITE_NUM(tmp[n]); + } + else if( c == asBC_TYPEID ) + { + WRITE_NUM(*bc++); + + // Translate type ids into indices + asDWORD tmp[MAX_DATA_SIZE]; + int n; + for( n = 0; n < asBCTypeSize[asBCInfo[c].type]-1; n++ ) + tmp[n] = *bc++; + + *(int*)tmp = FindTypeIdIdx(*(int*)tmp); + + for( n = 0; n < asBCTypeSize[asBCInfo[c].type]-1; n++ ) + WRITE_NUM(tmp[n]); + } + else if( c == asBC_CALL || + c == asBC_CALLINTF || + c == asBC_CALLSYS ) + { + WRITE_NUM(*bc++); + + // Translate the function id + asDWORD tmp[MAX_DATA_SIZE]; + int n; + for( n = 0; n < asBCTypeSize[asBCInfo[c].type]-1; n++ ) + tmp[n] = *bc++; + + *(int*)tmp = FindFunctionIndex(engine->scriptFunctions[*(int*)tmp]); + + for( n = 0; n < asBCTypeSize[asBCInfo[c].type]-1; n++ ) + WRITE_NUM(tmp[n]); + } + else if( c == asBC_STR ) + { + asDWORD tmp = *bc++; + + // Translate the string constant id + asWORD *arg = ((asWORD*)&tmp)+1; + *arg = FindStringConstantIndex(*arg); + WRITE_NUM(tmp); + } + else if( c == asBC_CALLBND ) + { + WRITE_NUM(*bc++); + + // Translate the function id + int funcId = *bc++; + for( asUINT n = 0; n < module->bindInformations.GetLength(); n++ ) + if( module->bindInformations[n]->importedFunctionSignature->id == funcId ) + { + funcId = n; + break; + } + + WRITE_NUM(funcId); + } + else + { + // Store the bc as is + for( int n = 0; n < asBCTypeSize[asBCInfo[c].type]; n++ ) + WRITE_NUM(*bc++); + } + + length -= asBCTypeSize[asBCInfo[c].type]; + } +} + +void asCRestore::ReadByteCode(asDWORD *bc, int length) +{ + while( length ) + { + asDWORD c; + READ_NUM(c); + *bc = c; + bc += 1; + c = *(asBYTE*)&c; + + // Read the bc as is + for( int n = 1; n < asBCTypeSize[asBCInfo[c].type]; n++ ) + READ_NUM(*bc++); + + length -= asBCTypeSize[asBCInfo[c].type]; + } +} + +void asCRestore::WriteUsedTypeIds() +{ + asUINT count = (asUINT)usedTypeIds.GetLength(); + WRITE_NUM(count); + for( asUINT n = 0; n < count; n++ ) + WriteDataType(engine->GetDataTypeFromTypeId(usedTypeIds[n])); +} + +void asCRestore::ReadUsedTypeIds() +{ + asUINT n; + asUINT count; + READ_NUM(count); + usedTypeIds.SetLength(count); + for( n = 0; n < count; n++ ) + { + asCDataType dt; + ReadDataType(&dt); + usedTypeIds[n] = engine->GetTypeIdFromDataType(dt); + } +} + +int asCRestore::FindGlobalPropPtrIndex(void *ptr) +{ + int i = usedGlobalProperties.IndexOf(ptr); + if( i >= 0 ) return i; + + usedGlobalProperties.PushLast(ptr); + return (int)usedGlobalProperties.GetLength()-1; +} + +void asCRestore::WriteUsedGlobalProps() +{ + int c = (int)usedGlobalProperties.GetLength(); + WRITE_NUM(c); + + for( int n = 0; n < c; n++ ) + { + size_t *p = (size_t*)usedGlobalProperties[n]; + + // First search for the global in the module + char moduleProp = 0; + asCGlobalProperty *prop = 0; + for( int i = 0; i < (signed)module->scriptGlobals.GetLength(); i++ ) + { + if( p == module->scriptGlobals[i]->GetAddressOfValue() ) + { + prop = module->scriptGlobals[i]; + moduleProp = 1; + break; + } + } + + // If it is not in the module, it must be an application registered property + if( !prop ) + { + for( int i = 0; i < (signed)engine->registeredGlobalProps.GetLength(); i++ ) + { + if( engine->registeredGlobalProps[i]->GetAddressOfValue() == p ) + { + prop = engine->registeredGlobalProps[i]; + break; + } + } + } + + asASSERT(prop); + + // Store the name and type of the property so we can find it again on loading + WriteString(&prop->name); + WriteDataType(&prop->type); + + // Also store whether the property is a module property or a registered property + WRITE_NUM(moduleProp); + } +} + +void asCRestore::ReadUsedGlobalProps() +{ + int c; + READ_NUM(c); + + usedGlobalProperties.SetLength(c); + + for( int n = 0; n < c; n++ ) + { + asCString name; + asCDataType type; + char moduleProp; + + ReadString(&name); + ReadDataType(&type); + READ_NUM(moduleProp); + + // Find the real property + void *prop = 0; + if( moduleProp ) + { + for( asUINT p = 0; p < module->scriptGlobals.GetLength(); p++ ) + { + if( module->scriptGlobals[p]->name == name && + module->scriptGlobals[p]->type == type ) + { + prop = module->scriptGlobals[p]->GetAddressOfValue(); + break; + } + } + } + else + { + for( asUINT p = 0; p < engine->registeredGlobalProps.GetLength(); p++ ) + { + if( engine->registeredGlobalProps[p] && + engine->registeredGlobalProps[p]->name == name && + engine->registeredGlobalProps[p]->type == type ) + { + prop = engine->registeredGlobalProps[p]->GetAddressOfValue(); + break; + } + } + } + + // TODO: If the property isn't found, we must give an error + asASSERT(prop); + + usedGlobalProperties[n] = prop; + } +} + +void asCRestore::WriteGlobalVarPointers(asCScriptFunction *func) +{ + int c = (int)func->globalVarPointers.GetLength(); + WRITE_NUM(c); + + for( int n = 0; n < c; n++ ) + { + void *p = (void*)func->globalVarPointers[n]; + + int i = FindGlobalPropPtrIndex(p); + WRITE_NUM(i); + } +} + +void asCRestore::ReadGlobalVarPointers(asCScriptFunction *func) +{ + int c; + READ_NUM(c); + + func->globalVarPointers.SetLength(c); + + for( int n = 0; n < c; n++ ) + { + int idx; + READ_NUM(idx); + + // This will later on be translated into the true pointer + func->globalVarPointers[n] = (void*)(size_t)idx; + } +} + +//--------------------------------------------------------------------------------------------------- +// Miscellaneous +//--------------------------------------------------------------------------------------------------- + +int asCRestore::FindFunctionIndex(asCScriptFunction *func) +{ + asUINT n; + for( n = 0; n < usedFunctions.GetLength(); n++ ) + { + if( usedFunctions[n] == func ) + return n; + } + + usedFunctions.PushLast(func); + return (int)usedFunctions.GetLength() - 1; +} + +asCScriptFunction *asCRestore::FindFunction(int idx) +{ + return usedFunctions[idx]; +} + +void asCRestore::TranslateFunction(asCScriptFunction *func) +{ + asUINT n; + asDWORD *bc = func->byteCode.AddressOf(); + for( n = 0; n < func->byteCode.GetLength(); ) + { + int c = *(asBYTE*)&bc[n]; + if( c == asBC_FREE || + c == asBC_REFCPY || c == asBC_OBJTYPE ) + { + // Translate the index to the true object type + asPTRWORD *ot = (asPTRWORD*)&bc[n+1]; + *(asCObjectType**)ot = FindObjectType(*(int*)ot); + } + else if( c == asBC_TYPEID ) + { + // Translate the index to the type id + int *tid = (int*)&bc[n+1]; + *tid = FindTypeId(*tid); + } + else if( c == asBC_CALL || + c == asBC_CALLINTF || + c == asBC_CALLSYS ) + { + // Translate the index to the func id + int *fid = (int*)&bc[n+1]; + *fid = FindFunction(*fid)->id; + } + else if( c == asBC_ALLOC ) + { + // Translate the index to the true object type + asPTRWORD *arg = (asPTRWORD*)&bc[n+1]; + *(asCObjectType**)arg = FindObjectType(*(int*)arg); + + // If the object type is a script class then the constructor id must be translated + asCObjectType *ot = *(asCObjectType**)arg; + if( ot->flags & asOBJ_SCRIPT_OBJECT ) + { + int *fid = (int*)&bc[n+1+AS_PTR_SIZE]; + *fid = FindFunction(*fid)->id; + } + } + else if( c == asBC_STR ) + { + // Translate the index to the true string id + asWORD *arg = ((asWORD*)&bc[n])+1; + + *arg = usedStringConstants[*arg]; + } + else if( c == asBC_CALLBND ) + { + // Translate the function id + int *fid = (int*)&bc[n+1]; + *fid = module->bindInformations[*fid]->importedFunctionSignature->id; + } + + n += asBCTypeSize[asBCInfo[c].type]; + } + + // Translate the globalVarPointers + for( n = 0; n < func->globalVarPointers.GetLength(); n++ ) + { + func->globalVarPointers[n] = usedGlobalProperties[(int)(size_t)func->globalVarPointers[n]]; + } +} + +int asCRestore::FindTypeIdIdx(int typeId) +{ + asUINT n; + for( n = 0; n < usedTypeIds.GetLength(); n++ ) + { + if( usedTypeIds[n] == typeId ) + return n; + } + + usedTypeIds.PushLast(typeId); + return (int)usedTypeIds.GetLength() - 1; +} + +int asCRestore::FindTypeId(int idx) +{ + return usedTypeIds[idx]; +} + +int asCRestore::FindObjectTypeIdx(asCObjectType *obj) +{ + asUINT n; + for( n = 0; n < usedTypes.GetLength(); n++ ) + { + if( usedTypes[n] == obj ) + return n; + } + + usedTypes.PushLast(obj); + return (int)usedTypes.GetLength() - 1; +} + +asCObjectType *asCRestore::FindObjectType(int idx) +{ + return usedTypes[idx]; +} + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_restore.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_restore.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_restore.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_restore.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,122 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_restore.h +// +// Functions for saving and restoring module bytecode +// asCRestore was originally written by Dennis Bollyn, dennis@gyrbo.be + + +// TODO: This should be split in two, so that an application that doesn't compile any +// code but only loads precompiled code can link with only the bytecode loader + +#ifndef AS_RESTORE_H +#define AS_RESTORE_H + +#include "as_scriptengine.h" +#include "as_context.h" +#include "as_map.h" + +BEGIN_AS_NAMESPACE + +class asCRestore +{ +public: + asCRestore(asCModule *module, asIBinaryStream *stream, asCScriptEngine *engine); + + int Save(); + int Restore(); + +protected: + asCModule *module; + asIBinaryStream *stream; + asCScriptEngine *engine; + + void WriteString(asCString *str); + void WriteFunction(asCScriptFunction *func); + void WriteFunctionSignature(asCScriptFunction *func); + void WriteGlobalProperty(asCGlobalProperty *prop); + void WriteObjectProperty(asCObjectProperty *prop); + void WriteDataType(const asCDataType *dt); + void WriteObjectType(asCObjectType *ot); + void WriteObjectTypeDeclaration(asCObjectType *ot, bool writeProperties); + void WriteGlobalVarPointers(asCScriptFunction *func); + void WriteByteCode(asDWORD *bc, int length); + + void ReadString(asCString *str); + asCScriptFunction *ReadFunction(bool addToModule = true, bool addToEngine = true); + void ReadFunctionSignature(asCScriptFunction *func); + void ReadGlobalProperty(); + void ReadObjectProperty(asCObjectProperty *prop); + void ReadDataType(asCDataType *dt); + asCObjectType *ReadObjectType(); + void ReadObjectTypeDeclaration(asCObjectType *ot, bool readProperties); + void ReadGlobalVarPointers(asCScriptFunction *func); + void ReadByteCode(asDWORD *bc, int length); + + // Helper functions for storing variable data + int FindObjectTypeIdx(asCObjectType*); + asCObjectType *FindObjectType(int idx); + int FindTypeIdIdx(int typeId); + int FindTypeId(int idx); + int FindFunctionIndex(asCScriptFunction *func); + asCScriptFunction *FindFunction(int idx); + int FindGlobalPropPtrIndex(void *); + int FindStringConstantIndex(int id); + + // Intermediate data used for storing that which isn't constant, function id's, pointers, etc + void WriteUsedTypeIds(); + void WriteUsedFunctions(); + void WriteUsedGlobalProps(); + void WriteUsedStringConstants(); + + void ReadUsedTypeIds(); + void ReadUsedFunctions(); + void ReadUsedGlobalProps(); + void ReadUsedStringConstants(); + + // After loading, each function needs to be translated to update pointers, function ids, etc + void TranslateFunction(asCScriptFunction *func); + + // Temporary storage for persisting variable data + asCArray usedTypeIds; + asCArray usedTypes; + asCArray usedFunctions; + asCArray usedGlobalProperties; + asCArray usedStringConstants; + + asCArray savedFunctions; +}; + +END_AS_NAMESPACE + +#endif //AS_RESTORE_H diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptcode.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptcode.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptcode.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptcode.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,141 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2008 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_scriptcode.cpp +// +// A container class for the script code to be compiled +// + + + +#include "as_config.h" +#include "as_scriptcode.h" + +BEGIN_AS_NAMESPACE + +asCScriptCode::asCScriptCode() +{ + lineOffset = 0; + code = 0; + codeLength = 0; + sharedCode = false; +} + +asCScriptCode::~asCScriptCode() +{ + if( !sharedCode && code ) + { + asDELETEARRAY(code); + } +} + +int asCScriptCode::SetCode(const char *name, const char *code, bool makeCopy) +{ + return SetCode(name, code, strlen(code), makeCopy); +} + +int asCScriptCode::SetCode(const char *name, const char *code, size_t length, bool makeCopy) +{ + this->name = name; + if( !sharedCode && this->code ) + { + asDELETEARRAY(this->code); + } + if( length == 0 ) + length = strlen(code); + if( makeCopy ) + { + this->code = asNEWARRAY(char,length); + memcpy((char*)this->code, code, length); + codeLength = length; + sharedCode = false; + } + else + { + codeLength = length; + this->code = const_cast(code); + sharedCode = true; + } + + // Find the positions of each line + linePositions.PushLast(0); + for( size_t n = 0; n < length; n++ ) + if( code[n] == '\n' ) linePositions.PushLast(n+1); + linePositions.PushLast(length); + + return 0; +} + +void asCScriptCode::ConvertPosToRowCol(size_t pos, int *row, int *col) +{ + if( linePositions.GetLength() == 0 ) + { + if( row ) *row = lineOffset; + if( col ) *col = 1; + return; + } + + // Do a binary search in the buffer + int max = (int)linePositions.GetLength() - 1; + int min = 0; + int i = max/2; + + for(;;) + { + if( linePositions[i] < pos ) + { + // Have we found the largest number < programPosition? + if( min == i ) break; + + min = i; + i = (max + min)/2; + } + else if( linePositions[i] > pos ) + { + // Have we found the smallest number > programPoisition? + if( max == i ) break; + + max = i; + i = (max + min)/2; + } + else + { + // We found the exact position + break; + } + } + + if( row ) *row = i + 1 + lineOffset; + if( col ) *col = (int)(pos - linePositions[i]) + 1; +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptcode.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptcode.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptcode.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptcode.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,70 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2007 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_scriptcode.h +// +// A container class for the script code to be compiled +// + + + +#ifndef AS_SCRIPTCODE_H +#define AS_SCRIPTCODE_H + +#include "as_array.h" +#include "as_string.h" + +BEGIN_AS_NAMESPACE + +class asCScriptCode +{ +public: + asCScriptCode(); + ~asCScriptCode(); + + int SetCode(const char *name, const char *code, bool makeCopy); + int SetCode(const char *name, const char *code, size_t length, bool makeCopy); + + void ConvertPosToRowCol(size_t pos, int *row, int *col); + + asCString name; + char *code; + size_t codeLength; + bool sharedCode; + int idx; + int lineOffset; + asCArray linePositions; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptengine.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptengine.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptengine.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptengine.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,4005 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_scriptengine.cpp +// +// The implementation of the script engine interface +// + + +#include + +#include "as_config.h" +#include "as_scriptengine.h" +#include "as_builder.h" +#include "as_context.h" +#include "as_string_util.h" +#include "as_tokenizer.h" +#include "as_texts.h" +#include "as_module.h" +#include "as_callfunc.h" +#include "as_arrayobject.h" +#include "as_generic.h" +#include "as_scriptobject.h" +#include "as_compiler.h" + +BEGIN_AS_NAMESPACE + +extern "C" +{ + +AS_API const char * asGetLibraryVersion() +{ +#ifdef _DEBUG + return ANGELSCRIPT_VERSION_STRING " DEBUG"; +#else + return ANGELSCRIPT_VERSION_STRING; +#endif +} + +AS_API const char * asGetLibraryOptions() +{ + const char *string = " " + + // Options +#ifdef AS_MAX_PORTABILITY + "AS_MAX_PORTABILITY " +#endif +#ifdef AS_DEBUG + "AS_DEBUG " +#endif +#ifdef AS_NO_CLASS_METHODS + "AS_NO_CLASS_METHODS " +#endif +#ifdef AS_USE_DOUBLE_AS_FLOAT + "AS_USE_DOUBLE_AS_FLOAT " +#endif +#ifdef AS_64BIT_PTR + "AS_64BIT_PTR " +#endif +#ifdef AS_NO_THREADS + "AS_NO_THREADS " +#endif +#ifdef AS_NO_ATOMIC + "AS_NO_ATOMIC " +#endif + + // Target system +#ifdef AS_WIN + "AS_WIN " +#endif +#ifdef AS_LINUX + "AS_LINUX " +#endif +#ifdef AS_MAC + "AS_MAC " +#endif +#ifdef AS_BSD + "AS_BSD " +#endif +#ifdef AS_XBOX + "AS_XBOX " +#endif +#ifdef AS_XBOX360 + "AS_XBOX360 " +#endif +#ifdef AS_PSP + "AS_PSP " +#endif +#ifdef AS_PS2 + "AS_PS2 " +#endif +#ifdef AS_PS3 + "AS_PS3 " +#endif +#ifdef AS_DC + "AS_DC " +#endif +#ifdef AS_GC + "AS_GC " +#endif +#ifdef AS_WII + "AS_WII " +#endif +#ifdef AS_IPHONE + "AS_IPHONE " +#endif +#ifdef AS_ANDROID + "AS_ANDROID " +#endif + + // CPU family +#ifdef AS_PPC + "AS_PPC " +#endif +#ifdef AS_PPC_64 + "AS_PPC_64 " +#endif +#ifdef AS_X86 + "AS_X86 " +#endif +#ifdef AS_MIPS + "AS_MIPS " +#endif +#ifdef AS_SH4 + "AS_SH4 " +#endif +#ifdef AS_XENON + "AS_XENON " +#endif +#ifdef AS_ARM + "AS_ARM " +#endif + ; + + return string; +} + +AS_API asIScriptEngine *asCreateScriptEngine(asDWORD version) +{ + // Verify the version that the application expects + if( (version/10000) != (ANGELSCRIPT_VERSION/10000) ) + return 0; + + if( (version/100)%100 != (ANGELSCRIPT_VERSION/100)%100 ) + return 0; + + if( (version%100) > (ANGELSCRIPT_VERSION%100) ) + return 0; + + // Verify the size of the types + asASSERT( sizeof(asBYTE) == 1 ); + asASSERT( sizeof(asWORD) == 2 ); + asASSERT( sizeof(asDWORD) == 4 ); + asASSERT( sizeof(asQWORD) == 8 ); + asASSERT( sizeof(asPWORD) == sizeof(void*) ); + + // Verify the boolean type + asASSERT( sizeof(bool) == AS_SIZEOF_BOOL ); + asASSERT( true == VALUE_OF_BOOLEAN_TRUE ); + + // Verify endianess +#ifdef AS_BIG_ENDIAN + asASSERT( *(asDWORD*)"\x00\x01\x02\x03" == 0x00010203 ); + asASSERT( *(asQWORD*)"\x00\x01\x02\x03\x04\x05\x06\x07" == I64(0x0001020304050607) ); +#else + asASSERT( *(asDWORD*)"\x00\x01\x02\x03" == 0x03020100 ); + asASSERT( *(asQWORD*)"\x00\x01\x02\x03\x04\x05\x06\x07" == I64(0x0706050403020100) ); +#endif + + return asNEW(asCScriptEngine)(); +} + +int asCScriptEngine::SetEngineProperty(asEEngineProp property, asPWORD value) +{ + switch( property ) + { + case asEP_ALLOW_UNSAFE_REFERENCES: + ep.allowUnsafeReferences = value ? true : false; + break; + + case asEP_OPTIMIZE_BYTECODE: + ep.optimizeByteCode = value ? true : false; + break; + + case asEP_COPY_SCRIPT_SECTIONS: + ep.copyScriptSections = value ? true : false; + break; + + case asEP_MAX_STACK_SIZE: + // The size is given in bytes, but we only store dwords + ep.maximumContextStackSize = (int)value/4; + if( initialContextStackSize > ep.maximumContextStackSize ) + initialContextStackSize = ep.maximumContextStackSize; + break; + + case asEP_USE_CHARACTER_LITERALS: + ep.useCharacterLiterals = value ? true : false; + break; + + case asEP_ALLOW_MULTILINE_STRINGS: + ep.allowMultilineStrings = value ? true : false; + break; + + case asEP_ALLOW_IMPLICIT_HANDLE_TYPES: + ep.allowImplicitHandleTypes = value ? true : false; + break; + + case asEP_BUILD_WITHOUT_LINE_CUES: + ep.buildWithoutLineCues = value ? true : false; + break; + + case asEP_INIT_GLOBAL_VARS_AFTER_BUILD: + ep.initGlobalVarsAfterBuild = value ? true : false; + break; + + case asEP_REQUIRE_ENUM_SCOPE: + ep.requireEnumScope = value ? true : false; + break; + + case asEP_SCRIPT_SCANNER: + if( value <= 1 ) + ep.scanner = (int)value; + else + return asINVALID_ARG; + break; + + case asEP_INCLUDE_JIT_INSTRUCTIONS: + ep.includeJitInstructions = value ? true : false; + break; + + case asEP_STRING_ENCODING: + if( value <= 1 ) + ep.stringEncoding = (int)value; + else + return asINVALID_ARG; + break; + + default: + return asINVALID_ARG; + } + + return asSUCCESS; +} + +asPWORD asCScriptEngine::GetEngineProperty(asEEngineProp property) +{ + switch( property ) + { + case asEP_ALLOW_UNSAFE_REFERENCES: + return ep.allowUnsafeReferences; + + case asEP_OPTIMIZE_BYTECODE: + return ep.optimizeByteCode; + + case asEP_COPY_SCRIPT_SECTIONS: + return ep.copyScriptSections; + + case asEP_MAX_STACK_SIZE: + return ep.maximumContextStackSize*4; + + case asEP_USE_CHARACTER_LITERALS: + return ep.useCharacterLiterals; + + case asEP_ALLOW_MULTILINE_STRINGS: + return ep.allowMultilineStrings; + + case asEP_ALLOW_IMPLICIT_HANDLE_TYPES: + return ep.allowImplicitHandleTypes; + + case asEP_BUILD_WITHOUT_LINE_CUES: + return ep.buildWithoutLineCues; + + case asEP_INIT_GLOBAL_VARS_AFTER_BUILD: + return ep.initGlobalVarsAfterBuild; + + case asEP_REQUIRE_ENUM_SCOPE: + return ep.requireEnumScope; + + case asEP_SCRIPT_SCANNER: + return ep.scanner; + + case asEP_INCLUDE_JIT_INSTRUCTIONS: + return ep.includeJitInstructions; + + case asEP_STRING_ENCODING: + return ep.stringEncoding; + } + + return 0; +} + +} // extern "C" + + + + + +asCScriptEngine::asCScriptEngine() +{ + // Instanciate the thread manager + if( threadManager == 0 ) + threadManager = asNEW(asCThreadManager); + else + threadManager->AddRef(); + + // Engine properties + ep.allowUnsafeReferences = false; + ep.optimizeByteCode = true; + ep.copyScriptSections = true; + ep.maximumContextStackSize = 0; // no limit + ep.useCharacterLiterals = false; + ep.allowMultilineStrings = false; + ep.allowImplicitHandleTypes = false; + ep.buildWithoutLineCues = false; + ep.initGlobalVarsAfterBuild = true; + ep.requireEnumScope = false; + ep.scanner = 1; // utf8. 0 = ascii + ep.includeJitInstructions = false; + ep.stringEncoding = 0; // utf8. 1 = utf16 + + gc.engine = this; + + refCount.set(1); + stringFactory = 0; + configFailed = false; + isPrepared = false; + isBuilding = false; + lastModule = 0; + + + userData = 0; + + initialContextStackSize = 1024; // 1 KB + + + typeIdSeqNbr = 0; + currentGroup = &defaultGroup; + + msgCallback = 0; + jitCompiler = 0; + + // Reserve function id 0 for no function + scriptFunctions.PushLast(0); + + // Make sure typeId for the built-in primitives are defined according to asETypeIdFlags + int id; + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttVoid, false)); asASSERT( id == asTYPEID_VOID ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttBool, false)); asASSERT( id == asTYPEID_BOOL ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttInt8, false)); asASSERT( id == asTYPEID_INT8 ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttInt16, false)); asASSERT( id == asTYPEID_INT16 ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttInt, false)); asASSERT( id == asTYPEID_INT32 ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttInt64, false)); asASSERT( id == asTYPEID_INT64 ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttUInt8, false)); asASSERT( id == asTYPEID_UINT8 ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttUInt16, false)); asASSERT( id == asTYPEID_UINT16 ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttUInt, false)); asASSERT( id == asTYPEID_UINT32 ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttUInt64, false)); asASSERT( id == asTYPEID_UINT64 ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttFloat, false)); asASSERT( id == asTYPEID_FLOAT ); + id = GetTypeIdFromDataType(asCDataType::CreatePrimitive(ttDouble, false)); asASSERT( id == asTYPEID_DOUBLE ); + + defaultArrayObjectType = 0; + + RegisterArrayObject(this); + RegisterScriptObject(this); + RegisterScriptFunction(this); + RegisterObjectTypeGCBehaviours(this); +} + +asCScriptEngine::~asCScriptEngine() +{ + asASSERT(refCount.get() == 0); + asUINT n; + + // The modules must be deleted first, as they may use + // object types from the config groups + for( n = (asUINT)scriptModules.GetLength(); n-- > 0; ) + { + if( scriptModules[n] ) + { + asDELETE(scriptModules[n],asCModule); + } + } + scriptModules.SetLength(0); + + GarbageCollect(asGC_FULL_CYCLE); + + // Delete the functions for template types that may references object types + for( n = 0; n < templateTypes.GetLength(); n++ ) + { + if( templateTypes[n] ) + { + asUINT f; + + // Delete the factory stubs first + for( f = 0; f < templateTypes[n]->beh.factories.GetLength(); f++ ) + { + scriptFunctions[templateTypes[n]->beh.factories[f]]->Release(); + } + templateTypes[n]->beh.factories.Allocate(0, false); + + // Delete the specialized functions + for( f = 1; f < templateTypes[n]->beh.operators.GetLength(); f += 2 ) + { + if( scriptFunctions[templateTypes[n]->beh.operators[f]]->objectType == templateTypes[n] ) + { + scriptFunctions[templateTypes[n]->beh.operators[f]]->Release(); + templateTypes[n]->beh.operators[f] = 0; + } + } + } + } + + // Do one more garbage collect to free gc objects that were global variables + GarbageCollect(asGC_FULL_CYCLE); + FreeUnusedGlobalProperties(); + ClearUnusedTypes(); + + // Break all relationship between remaining class types and functions + for( n = 0; n < classTypes.GetLength(); n++ ) + { + if( classTypes[n] ) + classTypes[n]->ReleaseAllFunctions(); + + if( classTypes[n]->derivedFrom ) + { + classTypes[n]->derivedFrom->Release(); + classTypes[n]->derivedFrom = 0; + } + } + + GarbageCollect(asGC_FULL_CYCLE); + FreeUnusedGlobalProperties(); + ClearUnusedTypes(); + + asSMapNode *cursor = 0; + while( mapTypeIdToDataType.MoveFirst(&cursor) ) + { + asDELETE(mapTypeIdToDataType.GetValue(cursor),asCDataType); + mapTypeIdToDataType.Erase(cursor); + } + + defaultGroup.RemoveConfiguration(this); + while( configGroups.GetLength() ) + { + // Delete config groups in the right order + asCConfigGroup *grp = configGroups.PopLast(); + if( grp ) + { + asDELETE(grp,asCConfigGroup); + } + } + + for( n = 0; n < registeredGlobalProps.GetLength(); n++ ) + { + if( registeredGlobalProps[n] ) + { + asDELETE(registeredGlobalProps[n],asCGlobalProperty); + } + } + registeredGlobalProps.SetLength(0); + FreeUnusedGlobalProperties(); + + for( n = 0; n < templateTypes.GetLength(); n++ ) + { + if( templateTypes[n] ) + { + // Clear the sub type before deleting the template type so that the sub type isn't freed to soon + templateTypes[n]->templateSubType = asCDataType::CreateNullHandle(); + asDELETE(templateTypes[n],asCObjectType); + } + } + templateTypes.SetLength(0); + + for( n = 0; n < objectTypes.GetLength(); n++ ) + { + if( objectTypes[n] ) + { + // Clear the sub type before deleting the template type so that the sub type isn't freed to soon + objectTypes[n]->templateSubType = asCDataType::CreateNullHandle(); + asDELETE(objectTypes[n],asCObjectType); + } + } + objectTypes.SetLength(0); + for( n = 0; n < templateSubTypes.GetLength(); n++ ) + { + if( templateSubTypes[n] ) + { + asDELETE(templateSubTypes[n], asCObjectType); + } + } + templateSubTypes.SetLength(0); + registeredTypeDefs.SetLength(0); + registeredEnums.SetLength(0); + registeredObjTypes.SetLength(0); + + for( n = 0; n < registeredGlobalFuncs.GetLength(); n++ ) + { + if( registeredGlobalFuncs[n] ) + registeredGlobalFuncs[n]->Release(); + } + registeredGlobalFuncs.SetLength(0); + + scriptTypeBehaviours.ReleaseAllFunctions(); + functionBehaviours.ReleaseAllFunctions(); + objectTypeBehaviours.ReleaseAllFunctions(); + + // Free string constants + for( n = 0; n < stringConstants.GetLength(); n++ ) + { + asDELETE(stringConstants[n],asCString); + } + stringConstants.SetLength(0); + + // Free the script section names + for( n = 0; n < scriptSectionNames.GetLength(); n++ ) + { + asDELETE(scriptSectionNames[n],asCString); + } + scriptSectionNames.SetLength(0); + + // Release the thread manager + threadManager->Release(); +} + +// interface +int asCScriptEngine::AddRef() +{ + return refCount.atomicInc(); +} + +// interface +int asCScriptEngine::Release() +{ + int r = refCount.atomicDec(); + + if( r == 0 ) + { + asDELETE(this,asCScriptEngine); + return 0; + } + + return r; +} + +// interface +void *asCScriptEngine::SetUserData(void *data) +{ + void *old = userData; + userData = data; + return old; +} + +// interface +void *asCScriptEngine::GetUserData() +{ + return userData; +} + +// interface +int asCScriptEngine::SetMessageCallback(const asSFuncPtr &callback, void *obj, asDWORD callConv) +{ + msgCallback = true; + msgCallbackObj = obj; + bool isObj = false; + if( (unsigned)callConv == asCALL_GENERIC ) + { + msgCallback = false; + return asNOT_SUPPORTED; + } + if( (unsigned)callConv >= asCALL_THISCALL ) + { + isObj = true; + if( obj == 0 ) + { + msgCallback = false; + return asINVALID_ARG; + } + } + int r = DetectCallingConvention(isObj, callback, callConv, &msgCallbackFunc); + if( r < 0 ) msgCallback = false; + return r; +} + +// interface +int asCScriptEngine::ClearMessageCallback() +{ + msgCallback = false; + return 0; +} + +// interface +int asCScriptEngine::WriteMessage(const char *section, int row, int col, asEMsgType type, const char *message) +{ + // Validate input parameters + if( section == 0 || + message == 0 ) + return asINVALID_ARG; + + // If there is no callback then there's nothing to do + if( !msgCallback ) + return 0; + + asSMessageInfo msg; + msg.section = section; + msg.row = row; + msg.col = col; + msg.type = type; + msg.message = message; + + if( msgCallbackFunc.callConv < ICC_THISCALL ) + CallGlobalFunction(&msg, msgCallbackObj, &msgCallbackFunc, 0); + else + CallObjectMethod(msgCallbackObj, &msg, &msgCallbackFunc, 0); + + return 0; +} + +int asCScriptEngine::SetJITCompiler(asIJITCompiler *compiler) +{ + jitCompiler = compiler; + return asSUCCESS; +} + +asIJITCompiler *asCScriptEngine::GetJITCompiler() +{ + return jitCompiler; +} + +// interface +asETokenClass asCScriptEngine::ParseToken(const char *string, size_t stringLength, int *tokenLength) +{ + if( stringLength == 0 ) + stringLength = strlen(string); + + size_t len; + asCTokenizer t; + asETokenClass tc; + t.GetToken(string, stringLength, &len, &tc); + + if( tokenLength ) + *tokenLength = (int)len; + + return tc; +} + +// interface +asIScriptModule *asCScriptEngine::GetModule(const char *module, asEGMFlags flag) +{ + asCModule *mod = GetModule(module, false); + + if( flag == asGM_ALWAYS_CREATE ) + { + if( mod != 0 ) + { + asDELETE(mod, asCModule); + } + return GetModule(module, true); + } + + if( mod == 0 && flag == asGM_CREATE_IF_NOT_EXISTS ) + { + return GetModule(module, true); + } + + return mod; +} + +// interface +int asCScriptEngine::DiscardModule(const char *module) +{ + asCModule *mod = GetModule(module, false); + if( mod == 0 ) return asNO_MODULE; + + asDELETE(mod, asCModule); + + FreeUnusedGlobalProperties(); + ClearUnusedTypes(); + + return 0; +} + +void asCScriptEngine::ClearUnusedTypes() +{ + // Build a list of all types to check for + asCArray types; + types = classTypes; + types.Concatenate(templateInstanceTypes); + + // Go through all modules + asUINT n; + for( n = 0; n < scriptModules.GetLength() && types.GetLength(); n++ ) + { + asCModule *mod = scriptModules[n]; + if( mod ) + { + // Functions/Methods/Globals are handled after this + + // Go through all type declarations + asUINT m; + for( m = 0; m < mod->classTypes.GetLength() && types.GetLength(); m++ ) + RemoveTypeAndRelatedFromList(types, mod->classTypes[m]); + for( m = 0; m < mod->enumTypes.GetLength() && types.GetLength(); m++ ) + RemoveTypeAndRelatedFromList(types, mod->enumTypes[m]); + for( m = 0; m < mod->typeDefs.GetLength() && types.GetLength(); m++ ) + RemoveTypeAndRelatedFromList(types, mod->typeDefs[m]); + } + } + + // Go through all function parameters and remove used types + for( n = 0; n < scriptFunctions.GetLength() && types.GetLength(); n++ ) + { + asCScriptFunction *func = scriptFunctions[n]; + if( func ) + { + // Ignore factory stubs + if( func->name == "factstub" ) + continue; + + asCObjectType *ot = func->returnType.GetObjectType(); + if( ot != 0 && ot != func->objectType ) + if( func->name != ot->name ) + RemoveTypeAndRelatedFromList(types, ot); + + for( asUINT p = 0; p < func->parameterTypes.GetLength(); p++ ) + { + ot = func->parameterTypes[p].GetObjectType(); + if( ot != 0 && ot != func->objectType ) + if( func->name != ot->name ) + RemoveTypeAndRelatedFromList(types, ot); + } + } + } + + // Go through all global properties + for( n = 0; n < globalProperties.GetLength() && types.GetLength(); n++ ) + { + if( globalProperties[n] && globalProperties[n]->type.GetObjectType() ) + RemoveTypeAndRelatedFromList(types, globalProperties[n]->type.GetObjectType()); + } + + // All that remains in the list after this can be discarded, since they are no longer used + for(;;) + { + bool didClearTemplateInstanceType = false; + + for( n = 0; n < types.GetLength(); n++ ) + { + // Template types and script classes will have two references for each factory stub + int refCount = ((types[n]->flags & asOBJ_TEMPLATE) || (types[n]->flags & asOBJ_SCRIPT_OBJECT)) ? 2*(int)types[n]->beh.factories.GetLength() : 0; + + if( types[n]->GetRefCount() == refCount ) + { + if( types[n]->flags & asOBJ_TEMPLATE ) + { + didClearTemplateInstanceType = true; + RemoveTemplateInstanceType(types[n]); + } + else + { + RemoveFromTypeIdMap(types[n]); + asDELETE(types[n],asCObjectType); + + int i = classTypes.IndexOf(types[n]); + if( i == (signed)classTypes.GetLength() - 1 ) + classTypes.PopLast(); + else + classTypes[i] = classTypes.PopLast(); + } + + // Remove the type from the array + if( n < types.GetLength() - 1 ) + types[n] = types.PopLast(); + else + types.PopLast(); + n--; + } + } + + if( didClearTemplateInstanceType == false ) + break; + } +} + +void asCScriptEngine::RemoveTypeAndRelatedFromList(asCArray &types, asCObjectType *ot) +{ + // Remove the type from the list + int i = types.IndexOf(ot); + if( i == -1 ) return; + + if( i == (signed)types.GetLength() - 1 ) + types.PopLast(); + else + types[i] = types.PopLast(); + + // If the type is an template type, then remove all sub types as well + if( ot->templateSubType.GetObjectType() ) + { + while( ot->templateSubType.GetObjectType() ) + { + ot = ot->templateSubType.GetObjectType(); + RemoveTypeAndRelatedFromList(types, ot); + } + return; + } + + // If the type is a class, then remove all properties types as well + if( ot->properties.GetLength() ) + { + for( asUINT n = 0; n < ot->properties.GetLength(); n++ ) + RemoveTypeAndRelatedFromList(types, ot->properties[n]->type.GetObjectType()); + } +} + + +// internal +int asCScriptEngine::GetFactoryIdByDecl(const asCObjectType *ot, const char *decl) +{ + asCModule *mod = 0; + + // Is this a script class? + if( ot->flags & asOBJ_SCRIPT_OBJECT && ot->size > 0 ) + mod = scriptFunctions[ot->beh.factory]->module; + + asCBuilder bld(this, mod); + + asCScriptFunction func(this, mod,-1); + int r = bld.ParseFunctionDeclaration(0, decl, &func, false); + if( r < 0 ) + return asINVALID_DECLARATION; + + // Search for matching factory function + int id = -1; + for( size_t n = 0; n < ot->beh.factories.GetLength(); n++ ) + { + asCScriptFunction *f = scriptFunctions[ot->beh.factories[n]]; + if( f->IsSignatureEqual(&func) ) + { + id = ot->beh.factories[n]; + break; + } + } + + if( id == -1 ) return asNO_FUNCTION; + + return id; +} + + +// internal +int asCScriptEngine::GetMethodIdByDecl(const asCObjectType *ot, const char *decl, asCModule *mod) +{ + asCBuilder bld(this, mod); + + asCScriptFunction func(this, mod, -1); + int r = bld.ParseFunctionDeclaration(0, decl, &func, false); + if( r < 0 ) + return asINVALID_DECLARATION; + + // Set the object type so that the signature can be properly compared + // This cast is OK, it will only be used for comparison + func.objectType = const_cast(ot); + + // Search script functions for matching interface + int id = -1; + for( size_t n = 0; n < ot->methods.GetLength(); ++n ) + { + if( func.IsSignatureEqual(scriptFunctions[ot->methods[n]]) ) + { + if( id == -1 ) + id = ot->methods[n]; + else + return asMULTIPLE_FUNCTIONS; + } + } + + if( id == -1 ) return asNO_FUNCTION; + + return id; +} + + +// Internal +asCString asCScriptEngine::GetFunctionDeclaration(int funcID) +{ + asCString str; + asCScriptFunction *func = GetScriptFunction(funcID); + if( func ) + str = func->GetDeclarationStr(); + + return str; +} + +asCScriptFunction *asCScriptEngine::GetScriptFunction(int funcId) +{ + if( funcId < 0 || funcId >= (int)scriptFunctions.GetLength() ) + return 0; + + return scriptFunctions[funcId]; +} + + + +asIScriptContext *asCScriptEngine::CreateContext() +{ + asIScriptContext *ctx = 0; + CreateContext(&ctx, false); + return ctx; +} + +int asCScriptEngine::CreateContext(asIScriptContext **context, bool isInternal) +{ + *context = asNEW(asCContext)(this, !isInternal); + + // We need to make sure the engine has been + // prepared before any context is executed + PrepareEngine(); + + return 0; +} + + +int asCScriptEngine::RegisterObjectProperty(const char *obj, const char *declaration, int byteOffset) +{ + int r; + asCDataType dt; + asCBuilder bld(this, 0); + r = bld.ParseDataType(obj, &dt); + if( r < 0 ) + return ConfigError(r); + + // Verify that the correct config group is used + if( currentGroup->FindType(dt.GetObjectType()->name.AddressOf()) == 0 ) + return ConfigError(asWRONG_CONFIG_GROUP); + + asCDataType type; + asCString name; + + if( (r = bld.VerifyProperty(&dt, declaration, name, type)) < 0 ) + return ConfigError(r); + + // Store the property info + if( dt.GetObjectType() == 0 ) + return ConfigError(asINVALID_OBJECT); + + asCObjectProperty *prop = asNEW(asCObjectProperty); + prop->name = name; + prop->type = type; + prop->byteOffset = byteOffset; + + dt.GetObjectType()->properties.PushLast(prop); + + currentGroup->RefConfigGroup(FindConfigGroupForObjectType(type.GetObjectType())); + + return asSUCCESS; +} + +int asCScriptEngine::RegisterInterface(const char *name) +{ + if( name == 0 ) return ConfigError(asINVALID_NAME); + + // Verify if the name has been registered as a type already + asUINT n; + for( n = 0; n < objectTypes.GetLength(); n++ ) + { + if( objectTypes[n] && objectTypes[n]->name == name ) + return asALREADY_REGISTERED; + } + + // Use builder to parse the datatype + asCDataType dt; + asCBuilder bld(this, 0); + bool oldMsgCallback = msgCallback; msgCallback = false; + int r = bld.ParseDataType(name, &dt); + msgCallback = oldMsgCallback; + if( r >= 0 ) return ConfigError(asERROR); + + // Make sure the name is not a reserved keyword + asCTokenizer t; + size_t tokenLen; + int token = t.GetToken(name, strlen(name), &tokenLen); + if( token != ttIdentifier || strlen(name) != tokenLen ) + return ConfigError(asINVALID_NAME); + + r = bld.CheckNameConflict(name, 0, 0); + if( r < 0 ) + return ConfigError(asNAME_TAKEN); + + // Don't have to check against members of object + // types as they are allowed to use the names + + // Register the object type for the interface + asCObjectType *st = asNEW(asCObjectType)(this); + st->flags = asOBJ_REF | asOBJ_SCRIPT_OBJECT; + st->size = 0; // Cannot be instanciated + st->name = name; + + // Use the default script class behaviours + st->beh.factory = 0; + st->beh.addref = scriptTypeBehaviours.beh.addref; + scriptFunctions[st->beh.addref]->AddRef(); + st->beh.release = scriptTypeBehaviours.beh.release; + scriptFunctions[st->beh.release]->AddRef(); + st->beh.copy = 0; + + objectTypes.PushLast(st); + registeredObjTypes.PushLast(st); + + currentGroup->objTypes.PushLast(st); + + return asSUCCESS; +} + +int asCScriptEngine::RegisterInterfaceMethod(const char *intf, const char *declaration) +{ + // Verify that the correct config group is set. + if( currentGroup->FindType(intf) == 0 ) + return ConfigError(asWRONG_CONFIG_GROUP); + + asCDataType dt; + asCBuilder bld(this, 0); + int r = bld.ParseDataType(intf, &dt); + if( r < 0 ) + return ConfigError(r); + + asCScriptFunction *func = asNEW(asCScriptFunction)(this, 0, asFUNC_INTERFACE); + func->objectType = dt.GetObjectType(); + + r = bld.ParseFunctionDeclaration(func->objectType, declaration, func, false); + if( r < 0 ) + { + asDELETE(func,asCScriptFunction); + return ConfigError(asINVALID_DECLARATION); + } + + // Check name conflicts + r = bld.CheckNameConflictMember(dt, func->name.AddressOf(), 0, 0); + if( r < 0 ) + { + asDELETE(func,asCScriptFunction); + return ConfigError(asNAME_TAKEN); + } + + func->id = GetNextScriptFunctionId(); + SetScriptFunction(func); + func->objectType->methods.PushLast(func->id); + // The refCount was already set to 1 + + func->ComputeSignatureId(); + + // If parameter type from other groups are used, add references + // TODO: The code for adding references to config groups is repeated in a lot of places + if( func->returnType.GetObjectType() ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(func->returnType.GetObjectType()); + currentGroup->RefConfigGroup(group); + } + for( asUINT n = 0; n < func->parameterTypes.GetLength(); n++ ) + { + if( func->parameterTypes[n].GetObjectType() ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(func->parameterTypes[n].GetObjectType()); + currentGroup->RefConfigGroup(group); + } + } + + // Return function id as success + return func->id; +} + +int asCScriptEngine::RegisterObjectType(const char *name, int byteSize, asDWORD flags) +{ + int r; + + isPrepared = false; + + // Verify flags + // Must have either asOBJ_REF or asOBJ_VALUE + if( flags & asOBJ_REF ) + { + // Can optionally have the asOBJ_GC, asOBJ_NOHANDLE, asOBJ_SCOPED, or asOBJ_TEMPLATE flag set, but nothing else + if( flags & ~(asOBJ_REF | asOBJ_GC | asOBJ_NOHANDLE | asOBJ_SCOPED | asOBJ_TEMPLATE) ) + return ConfigError(asINVALID_ARG); + + // flags are exclusive + if( (flags & asOBJ_GC) && (flags & (asOBJ_NOHANDLE|asOBJ_SCOPED)) ) + return ConfigError(asINVALID_ARG); + if( (flags & asOBJ_NOHANDLE) && (flags & (asOBJ_GC|asOBJ_SCOPED)) ) + return ConfigError(asINVALID_ARG); + if( (flags & asOBJ_SCOPED) && (flags & (asOBJ_GC|asOBJ_NOHANDLE)) ) + return ConfigError(asINVALID_ARG); + } + else if( flags & asOBJ_VALUE ) + { + // Cannot use reference flags + // TODO: template: Should be possible to register a value type as template type + if( flags & (asOBJ_REF | asOBJ_GC | asOBJ_SCOPED) ) + return ConfigError(asINVALID_ARG); + + // If the app type is given, we must validate the flags + if( flags & asOBJ_APP_CLASS ) + { + // Must not set the primitive or float flag + if( flags & (asOBJ_APP_PRIMITIVE | + asOBJ_APP_FLOAT) ) + return ConfigError(asINVALID_ARG); + } + else if( flags & asOBJ_APP_PRIMITIVE ) + { + // Must not set the class flags nor the float flag + if( flags & (asOBJ_APP_CLASS | + asOBJ_APP_CLASS_CONSTRUCTOR | + asOBJ_APP_CLASS_DESTRUCTOR | + asOBJ_APP_CLASS_ASSIGNMENT | + asOBJ_APP_FLOAT) ) + return ConfigError(asINVALID_ARG); + } + else if( flags & asOBJ_APP_FLOAT ) + { + // Must not set the class flags nor the primitive flag + if( flags & (asOBJ_APP_CLASS | + asOBJ_APP_CLASS_CONSTRUCTOR | + asOBJ_APP_CLASS_DESTRUCTOR | + asOBJ_APP_CLASS_ASSIGNMENT | + asOBJ_APP_PRIMITIVE) ) + return ConfigError(asINVALID_ARG); + } + else if( flags & (asOBJ_APP_CLASS_CONSTRUCTOR | + asOBJ_APP_CLASS_DESTRUCTOR | + asOBJ_APP_CLASS_ASSIGNMENT) ) + { + // Must not set the class properties, without the class flag + return ConfigError(asINVALID_ARG); + } + } + else + return ConfigError(asINVALID_ARG); + + // Don't allow anything else than the defined flags + if( flags - (flags & asOBJ_MASK_VALID_FLAGS) ) + return ConfigError(asINVALID_ARG); + + // Value types must have a defined size + if( (flags & asOBJ_VALUE) && byteSize == 0 ) + { + WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_VALUE_TYPE_MUST_HAVE_SIZE); + return ConfigError(asINVALID_ARG); + } + + // Verify type name + if( name == 0 ) + return ConfigError(asINVALID_NAME); + + asCString typeName; + asCBuilder bld(this, 0); + if( flags & asOBJ_TEMPLATE ) + { + asCString subtypeName; + r = bld.ParseTemplateDecl(name, &typeName, &subtypeName); + if( r < 0 ) + return r; + + // Verify that the template name hasn't been registered as a type already + asUINT n; + for( n = 0; n < objectTypes.GetLength(); n++ ) + { + if( objectTypes[n] && objectTypes[n]->name == typeName ) + return asALREADY_REGISTERED; + } + + asCObjectType *type = asNEW(asCObjectType)(this); + type->name = typeName; + type->size = byteSize; + type->flags = flags; + + // Store it in the object types + objectTypes.PushLast(type); + + // Define a template subtype + asCObjectType *subtype = 0; + for( n = 0; n < templateSubTypes.GetLength(); n++ ) + { + if( templateSubTypes[n]->name == subtypeName ) + { + subtype = templateSubTypes[n]; + break; + } + } + if( subtype == 0 ) + { + // Create the new subtype if not already existing + subtype = asNEW(asCObjectType)(this); + subtype->name = subtypeName; + subtype->size = 0; + subtype->flags = asOBJ_TEMPLATE_SUBTYPE; + templateSubTypes.PushLast(subtype); + subtype->AddRef(); + } + type->templateSubType = asCDataType::CreateObject(subtype, false); + subtype->AddRef(); + + currentGroup->objTypes.PushLast(type); + + if( defaultArrayObjectType == 0 ) + { + // TODO: The default array object type should be defined by the application + // The default array object type is registered by the engine itself + defaultArrayObjectType = type; + type->AddRef(); + } + else + { + registeredObjTypes.PushLast(type); + } + } + else + { + typeName = name; + + // Verify if the name has been registered as a type already + asUINT n; + for( n = 0; n < objectTypes.GetLength(); n++ ) + { + if( objectTypes[n] && objectTypes[n]->name == typeName ) + return asALREADY_REGISTERED; + } + + for( n = 0; n < templateTypes.GetLength(); n++ ) + { + if( templateTypes[n] && templateTypes[n]->name == typeName ) + return asALREADY_REGISTERED; + } + + // Verify the most recently created template instance type + asCObjectType *mostRecentTemplateInstanceType = 0; + if( templateInstanceTypes.GetLength() ) + mostRecentTemplateInstanceType = templateInstanceTypes[templateInstanceTypes.GetLength()-1]; + + // Use builder to parse the datatype + asCDataType dt; + bool oldMsgCallback = msgCallback; msgCallback = false; + r = bld.ParseDataType(name, &dt); + msgCallback = oldMsgCallback; + + // If the builder fails, then the type name + // is new and it should be registered + if( r < 0 ) + { + // Make sure the name is not a reserved keyword + asCTokenizer t; + size_t tokenLen; + int token = t.GetToken(name, typeName.GetLength(), &tokenLen); + if( token != ttIdentifier || typeName.GetLength() != tokenLen ) + return ConfigError(asINVALID_NAME); + + int r = bld.CheckNameConflict(name, 0, 0); + if( r < 0 ) + return ConfigError(asNAME_TAKEN); + + // Don't have to check against members of object + // types as they are allowed to use the names + + // Put the data type in the list + asCObjectType *type = asNEW(asCObjectType)(this); + type->name = typeName; + type->size = byteSize; + type->flags = flags; + + objectTypes.PushLast(type); + registeredObjTypes.PushLast(type); + + currentGroup->objTypes.PushLast(type); + } + else + { + // The application is registering a template specialization so we + // need to replace the template instance type with the new type. + + // TODO: Template: We don't require the lower dimensions to be registered first for registered template types + // int[][] must not be allowed to be registered + // if int[] hasn't been registered first + if( dt.GetSubType().IsTemplate() ) + return ConfigError(asLOWER_ARRAY_DIMENSION_NOT_REGISTERED); + + if( dt.IsReadOnly() || + dt.IsReference() ) + return ConfigError(asINVALID_TYPE); + + // Was the template instance type created before? + if( templateInstanceTypes[templateInstanceTypes.GetLength()-1] == mostRecentTemplateInstanceType || + mostRecentTemplateInstanceType == dt.GetObjectType() ) + // TODO: Should have a better error message + return ConfigError(asNOT_SUPPORTED); + + // TODO: Add this again. The type is used by the factory stubs so we need to discount that + // Is the template instance type already being used? +// if( dt.GetObjectType()->GetRefCount() > 1 ) +// return ConfigError(asNOT_SUPPORTED); + + // Put the data type in the list + asCObjectType *type = asNEW(asCObjectType)(this); + type->name = dt.GetObjectType()->name; + type->templateSubType = dt.GetSubType(); + if( type->templateSubType.GetObjectType() ) type->templateSubType.GetObjectType()->AddRef(); + type->size = byteSize; + type->flags = flags; + + templateTypes.PushLast(type); + + currentGroup->objTypes.PushLast(type); + + // Remove the template instance type, which will no longer be used. + RemoveTemplateInstanceType(dt.GetObjectType()); + } + } + + return asSUCCESS; +} + +// interface +int asCScriptEngine::RegisterObjectBehaviour(const char *datatype, asEBehaviours behaviour, const char *decl, const asSFuncPtr &funcPointer, asDWORD callConv) +{ + if( datatype == 0 ) return ConfigError(asINVALID_ARG); + + // Determine the object type + asCBuilder bld(this, 0); + asCDataType type; + int r = bld.ParseDataType(datatype, &type); + if( r < 0 ) + return ConfigError(r); + + if( type.GetObjectType() == 0 ) + return ConfigError(asINVALID_TYPE); + + if( type.IsReadOnly() || type.IsReference() ) + return ConfigError(asINVALID_TYPE); + + return RegisterBehaviourToObjectType(type.GetObjectType(), behaviour, decl, funcPointer, callConv); +} + +// internal +int asCScriptEngine::RegisterBehaviourToObjectType(asCObjectType *objectType, asEBehaviours behaviour, const char *decl, const asSFuncPtr &funcPointer, asDWORD callConv) +{ + asSSystemFunctionInterface internal; + if( behaviour == asBEHAVE_FACTORY || + behaviour == asBEHAVE_TEMPLATE_CALLBACK ) + { +#ifdef AS_MAX_PORTABILITY + if( callConv != asCALL_GENERIC ) + return ConfigError(asNOT_SUPPORTED); +#endif + int r = DetectCallingConvention(false, funcPointer, callConv, &internal); + if( r < 0 ) + return ConfigError(r); + } + else + { +#ifdef AS_MAX_PORTABILITY + if( callConv != asCALL_GENERIC ) + return ConfigError(asNOT_SUPPORTED); +#else + if( callConv != asCALL_THISCALL && + callConv != asCALL_CDECL_OBJLAST && + callConv != asCALL_CDECL_OBJFIRST && + callConv != asCALL_GENERIC ) + return ConfigError(asNOT_SUPPORTED); +#endif + + int r = DetectCallingConvention(true, funcPointer, callConv, &internal); + if( r < 0 ) + return ConfigError(r); + } + + isPrepared = false; + + asSTypeBehaviour *beh = &objectType->beh; + + // Verify function declaration + asCScriptFunction func(this, 0, -1); + + asCBuilder bld(this, 0); + int r = bld.ParseFunctionDeclaration(objectType, decl, &func, true, &internal.paramAutoHandles, &internal.returnAutoHandle); + if( r < 0 ) + return ConfigError(asINVALID_DECLARATION); + func.name.Format("_beh_%d_", behaviour); + + if( behaviour != asBEHAVE_FACTORY ) + func.objectType = objectType; + + // Check if the method restricts that use of the template to value types or reference types + if( objectType->flags & asOBJ_TEMPLATE ) + { + if( func.returnType.GetObjectType() == objectType->templateSubType.GetObjectType() ) + { + if( func.returnType.IsObjectHandle() ) + objectType->acceptValueSubType = false; + else if( !func.returnType.IsReference() ) + objectType->acceptRefSubType = false; + } + + for( asUINT n = 0; n < func.parameterTypes.GetLength(); n++ ) + { + if( func.parameterTypes[n].GetObjectType() == objectType->templateSubType.GetObjectType() ) + { + // TODO: If unsafe references are allowed, then inout references allow value types + if( func.parameterTypes[n].IsObjectHandle() || (func.parameterTypes[n].IsReference() && func.inOutFlags[n] == asTM_INOUTREF) ) + objectType->acceptValueSubType = false; + else if( !func.parameterTypes[n].IsReference() ) + objectType->acceptRefSubType = false; + } + } + } + + if( behaviour == asBEHAVE_CONSTRUCT ) + { + // TODO: Add asBEHAVE_IMPLICIT_CONSTRUCT + + // Verify that the return type is void + if( func.returnType != asCDataType::CreatePrimitive(ttVoid, false) ) + return ConfigError(asINVALID_DECLARATION); + + if( objectType->flags & asOBJ_SCRIPT_OBJECT ) + { + // The script object is a special case + asASSERT(func.parameterTypes.GetLength() == 1); + + beh->construct = AddBehaviourFunction(func, internal); + beh->factory = beh->construct; + scriptFunctions[beh->factory]->AddRef(); + beh->constructors.PushLast(beh->construct); + beh->factories.PushLast(beh->factory); + func.id = beh->construct; + } + else + { + // Verify that it is a value type + if( !(func.objectType->flags & asOBJ_VALUE) ) + { + WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_ILLEGAL_BEHAVIOUR_FOR_TYPE); + return ConfigError(asILLEGAL_BEHAVIOUR_FOR_TYPE); + } + + // Implicit constructors must take one and only one parameter + /* if( behaviour == asBEHAVE_IMPLICIT_CONSTRUCT && + func.parameterTypes.GetLength() != 1 ) + return ConfigError(asINVALID_DECLARATION); + */ + // TODO: Verify that the same constructor hasn't been registered already + + // Store all constructors in a list + if( func.parameterTypes.GetLength() == 0 ) + { + func.id = beh->construct = AddBehaviourFunction(func, internal); + beh->constructors.PushLast(beh->construct); + } + else + { + func.id = AddBehaviourFunction(func, internal); + beh->constructors.PushLast(func.id); + /* + if( behaviour == asBEHAVE_IMPLICIT_CONSTRUCT ) + { + beh->operators.PushLast(behaviour); + beh->operators.PushLast(func.id); + } + */ } + } + } + else if( behaviour == asBEHAVE_DESTRUCT ) + { + // Must be a value type + if( !(func.objectType->flags & asOBJ_VALUE) ) + { + WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_ILLEGAL_BEHAVIOUR_FOR_TYPE); + return ConfigError(asILLEGAL_BEHAVIOUR_FOR_TYPE); + } + + if( beh->destruct ) + return ConfigError(asALREADY_REGISTERED); + + // Verify that the return type is void + if( func.returnType != asCDataType::CreatePrimitive(ttVoid, false) ) + return ConfigError(asINVALID_DECLARATION); + + // Verify that there are no parameters + if( func.parameterTypes.GetLength() > 0 ) + return ConfigError(asINVALID_DECLARATION); + + func.id = beh->destruct = AddBehaviourFunction(func, internal); + } + else if( behaviour == asBEHAVE_FACTORY ) + { + // TODO: Add asBEHAVE_IMPLICIT_FACTORY + + // Must be a ref type and must not have asOBJ_NOHANDLE + if( !(objectType->flags & asOBJ_REF) || (objectType->flags & asOBJ_NOHANDLE) ) + { + WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_ILLEGAL_BEHAVIOUR_FOR_TYPE); + return ConfigError(asILLEGAL_BEHAVIOUR_FOR_TYPE); + } + + // Verify that the return type is a handle to the type + if( func.returnType != asCDataType::CreateObjectHandle(objectType, false) ) + return ConfigError(asINVALID_DECLARATION); + + // Implicit factories must take one and only one parameter +/* if( behaviour == asBEHAVE_IMPLICIT_FACTORY && + func.parameterTypes.GetLength() != 1 ) + return ConfigError(asINVALID_DECLARATION); +*/ + // TODO: Verify that the same factory function hasn't been registered already + + // The templates take a hidden parameter with the object type + if( (objectType->flags & asOBJ_TEMPLATE) && + (func.parameterTypes.GetLength() == 0 || + !func.parameterTypes[0].IsReference()) ) + { + return ConfigError(asINVALID_DECLARATION); + } + + // Store all factory functions in a list + if( (func.parameterTypes.GetLength() == 0) || + (func.parameterTypes.GetLength() == 1 && (objectType->flags & asOBJ_TEMPLATE)) ) + { + func.id = beh->factory = AddBehaviourFunction(func, internal); + beh->factories.PushLast(beh->factory); + } + else + { + func.id = AddBehaviourFunction(func, internal); + beh->factories.PushLast(func.id); +/* + if( behaviour == asBEHAVE_IMPLICIT_FACTORY ) + { + beh->operators.PushLast(behaviour); + beh->operators.PushLast(func.id); + } +*/ } + } + else if( behaviour == asBEHAVE_ADDREF ) + { + // Must be a ref type and must not have asOBJ_NOHANDLE, nor asOBJ_SCOPED + if( !(func.objectType->flags & asOBJ_REF) || + (func.objectType->flags & asOBJ_NOHANDLE) || + (func.objectType->flags & asOBJ_SCOPED) ) + { + WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_ILLEGAL_BEHAVIOUR_FOR_TYPE); + return ConfigError(asILLEGAL_BEHAVIOUR_FOR_TYPE); + } + + if( beh->addref ) + return ConfigError(asALREADY_REGISTERED); + + // Verify that the return type is void + if( func.returnType != asCDataType::CreatePrimitive(ttVoid, false) ) + return ConfigError(asINVALID_DECLARATION); + + // Verify that there are no parameters + if( func.parameterTypes.GetLength() > 0 ) + return ConfigError(asINVALID_DECLARATION); + + func.id = beh->addref = AddBehaviourFunction(func, internal); + } + else if( behaviour == asBEHAVE_RELEASE ) + { + // Must be a ref type and must not have asOBJ_NOHANDLE + if( !(func.objectType->flags & asOBJ_REF) || (func.objectType->flags & asOBJ_NOHANDLE) ) + { + WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_ILLEGAL_BEHAVIOUR_FOR_TYPE); + return ConfigError(asILLEGAL_BEHAVIOUR_FOR_TYPE); + } + + if( beh->release ) + return ConfigError(asALREADY_REGISTERED); + + // Verify that the return type is void + if( func.returnType != asCDataType::CreatePrimitive(ttVoid, false) ) + return ConfigError(asINVALID_DECLARATION); + + // Verify that there are no parameters + if( func.parameterTypes.GetLength() > 0 ) + return ConfigError(asINVALID_DECLARATION); + + func.id = beh->release = AddBehaviourFunction(func, internal); + } + else if( behaviour == asBEHAVE_TEMPLATE_CALLBACK ) + { + // Must be a template type + if( !(func.objectType->flags & asOBJ_TEMPLATE) ) + { + WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_ILLEGAL_BEHAVIOUR_FOR_TYPE); + return ConfigError(asILLEGAL_BEHAVIOUR_FOR_TYPE); + } + + if( beh->templateCallback ) + return ConfigError(asALREADY_REGISTERED); + + // Verify that the return type is bool + if( func.returnType != asCDataType::CreatePrimitive(ttBool, false) ) + return ConfigError(asINVALID_DECLARATION); + + // Verify that there is one parameters + if( func.parameterTypes.GetLength() != 1 ) + return ConfigError(asINVALID_DECLARATION); + + func.id = beh->templateCallback = AddBehaviourFunction(func, internal); + } + else if( behaviour == asBEHAVE_INDEX ) + { + // Verify that the var type is not used + if( VerifyVarTypeNotInFunction(&func) < 0 ) + return ConfigError(asINVALID_DECLARATION); + + // Verify that there is only one parameter + if( func.parameterTypes.GetLength() != 1 ) + return ConfigError(asINVALID_DECLARATION); + + // Verify that the return type is not void + if( func.returnType.GetTokenType() == ttVoid ) + return ConfigError(asINVALID_DECLARATION); + + // TODO: Verify that the operator hasn't been registered already + + beh->operators.PushLast(behaviour); + func.id = AddBehaviourFunction(func, internal); + beh->operators.PushLast(func.id); + } + else if( behaviour >= asBEHAVE_FIRST_GC && + behaviour <= asBEHAVE_LAST_GC ) + { + // Only allow GC behaviours for types registered to be garbage collected + if( !(func.objectType->flags & asOBJ_GC) ) + { + WriteMessage("", 0, 0, asMSGTYPE_ERROR, TXT_ILLEGAL_BEHAVIOUR_FOR_TYPE); + return ConfigError(asILLEGAL_BEHAVIOUR_FOR_TYPE); + } + + // Verify parameter count + if( (behaviour == asBEHAVE_GETREFCOUNT || + behaviour == asBEHAVE_SETGCFLAG || + behaviour == asBEHAVE_GETGCFLAG) && + func.parameterTypes.GetLength() != 0 ) + return ConfigError(asINVALID_DECLARATION); + + if( (behaviour == asBEHAVE_ENUMREFS || + behaviour == asBEHAVE_RELEASEREFS) && + func.parameterTypes.GetLength() != 1 ) + return ConfigError(asINVALID_DECLARATION); + + // Verify return type + if( behaviour == asBEHAVE_GETREFCOUNT && + func.returnType != asCDataType::CreatePrimitive(ttInt, false) ) + return ConfigError(asINVALID_DECLARATION); + + if( behaviour == asBEHAVE_GETGCFLAG && + func.returnType != asCDataType::CreatePrimitive(ttBool, false) ) + return ConfigError(asINVALID_DECLARATION); + + if( (behaviour == asBEHAVE_SETGCFLAG || + behaviour == asBEHAVE_ENUMREFS || + behaviour == asBEHAVE_RELEASEREFS) && + func.returnType != asCDataType::CreatePrimitive(ttVoid, false) ) + return ConfigError(asINVALID_DECLARATION); + + if( behaviour == asBEHAVE_GETREFCOUNT ) + func.id = beh->gcGetRefCount = AddBehaviourFunction(func, internal); + else if( behaviour == asBEHAVE_SETGCFLAG ) + func.id = beh->gcSetFlag = AddBehaviourFunction(func, internal); + else if( behaviour == asBEHAVE_GETGCFLAG ) + func.id = beh->gcGetFlag = AddBehaviourFunction(func, internal); + else if( behaviour == asBEHAVE_ENUMREFS ) + func.id = beh->gcEnumReferences = AddBehaviourFunction(func, internal); + else if( behaviour == asBEHAVE_RELEASEREFS ) + func.id = beh->gcReleaseAllReferences = AddBehaviourFunction(func, internal); + } + else if( behaviour == asBEHAVE_IMPLICIT_VALUE_CAST || + behaviour == asBEHAVE_VALUE_CAST ) + { + // Verify parameter count + if( func.parameterTypes.GetLength() != 0 ) + return ConfigError(asINVALID_DECLARATION); + + // Verify return type + if( func.returnType.IsEqualExceptRefAndConst(asCDataType::CreatePrimitive(ttBool, false)) ) + return ConfigError(asNOT_SUPPORTED); + + if( func.returnType.IsEqualExceptRefAndConst(asCDataType::CreatePrimitive(ttVoid, false)) ) + return ConfigError(asINVALID_DECLARATION); + + // TODO: verify that the same cast is not registered already (const or non-const is treated the same for the return type) + + beh->operators.PushLast(behaviour); + func.id = AddBehaviourFunction(func, internal); + beh->operators.PushLast(func.id); + } + else if( behaviour == asBEHAVE_REF_CAST || + behaviour == asBEHAVE_IMPLICIT_REF_CAST ) + { + // Verify parameter count + if( func.parameterTypes.GetLength() != 0 ) + return ConfigError(asINVALID_DECLARATION); + + // Verify return type + if( !func.returnType.IsObjectHandle() ) + return ConfigError(asINVALID_DECLARATION); + + // TODO: verify that the same cast is not registered already (cosnt or non-const is treated the same for the return type) + + beh->operators.PushLast(behaviour); + func.id = AddBehaviourFunction(func, internal); + beh->operators.PushLast(func.id); + } + else + { + asASSERT(false); + + return ConfigError(asINVALID_ARG); + } + + // Return function id as success + return func.id; +} + + +int asCScriptEngine::VerifyVarTypeNotInFunction(asCScriptFunction *func) +{ + // Don't allow var type in this function + if( func->returnType.GetTokenType() == ttQuestion ) + return asINVALID_DECLARATION; + + for( unsigned int n = 0; n < func->parameterTypes.GetLength(); n++ ) + if( func->parameterTypes[n].GetTokenType() == ttQuestion ) + return asINVALID_DECLARATION; + + return 0; +} + +int asCScriptEngine::AddBehaviourFunction(asCScriptFunction &func, asSSystemFunctionInterface &internal) +{ + asUINT n; + + int id = GetNextScriptFunctionId(); + + asSSystemFunctionInterface *newInterface = asNEW(asSSystemFunctionInterface); + newInterface->func = internal.func; + newInterface->baseOffset = internal.baseOffset; + newInterface->callConv = internal.callConv; + newInterface->scriptReturnSize = internal.scriptReturnSize; + newInterface->hostReturnInMemory = internal.hostReturnInMemory; + newInterface->hostReturnFloat = internal.hostReturnFloat; + newInterface->hostReturnSize = internal.hostReturnSize; + newInterface->paramSize = internal.paramSize; + newInterface->takesObjByVal = internal.takesObjByVal; + newInterface->paramAutoHandles = internal.paramAutoHandles; + newInterface->returnAutoHandle = internal.returnAutoHandle; + newInterface->hasAutoHandles = internal.hasAutoHandles; + + asCScriptFunction *f = asNEW(asCScriptFunction)(this, 0, asFUNC_SYSTEM); + asASSERT(func.name != "" && func.name != "f"); + f->name = func.name; + f->sysFuncIntf = newInterface; + f->returnType = func.returnType; + f->objectType = func.objectType; + f->id = id; + f->isReadOnly = func.isReadOnly; + for( n = 0; n < func.parameterTypes.GetLength(); n++ ) + { + f->parameterTypes.PushLast(func.parameterTypes[n]); + f->inOutFlags.PushLast(func.inOutFlags[n]); + } + + SetScriptFunction(f); + + // If parameter type from other groups are used, add references + if( f->returnType.GetObjectType() ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(f->returnType.GetObjectType()); + currentGroup->RefConfigGroup(group); + } + for( n = 0; n < f->parameterTypes.GetLength(); n++ ) + { + if( f->parameterTypes[n].GetObjectType() ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(f->parameterTypes[n].GetObjectType()); + currentGroup->RefConfigGroup(group); + } + } + + return id; +} + +// interface +int asCScriptEngine::RegisterGlobalProperty(const char *declaration, void *pointer) +{ + asCDataType type; + asCString name; + + int r; + asCBuilder bld(this, 0); + if( (r = bld.VerifyProperty(0, declaration, name, type)) < 0 ) + return ConfigError(r); + + // Don't allow registering references as global properties + if( type.IsReference() ) + return ConfigError(asINVALID_TYPE); + + // Store the property info + asCGlobalProperty *prop = AllocateGlobalProperty(); + prop->name = name; + prop->type = type; + + prop->SetRegisteredAddress(pointer); + + registeredGlobalProps.PushLast(prop); + currentGroup->globalProps.PushLast(prop); + + // If from another group add reference + if( type.GetObjectType() ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(type.GetObjectType()); + currentGroup->RefConfigGroup(group); + } + + return asSUCCESS; +} + +// internal +asCGlobalProperty *asCScriptEngine::AllocateGlobalProperty() +{ + asCGlobalProperty *prop = asNEW(asCGlobalProperty); + + // First check the availability of a free slot + if( freeGlobalPropertyIds.GetLength() ) + { + prop->id = freeGlobalPropertyIds.PopLast(); + globalProperties[prop->id] = prop; + return prop; + } + + prop->id = (asUINT)globalProperties.GetLength(); + globalProperties.PushLast(prop); + return prop; +} + +// internal +void asCScriptEngine::FreeUnusedGlobalProperties() +{ + for( asUINT n = 0; n < globalProperties.GetLength(); n++ ) + { + if( globalProperties[n] && globalProperties[n]->refCount.get() == 0 ) + { + freeGlobalPropertyIds.PushLast(n); + asDELETE(globalProperties[n], asCGlobalProperty); + globalProperties[n] = 0; + } + } +} + +// interface +int asCScriptEngine::GetGlobalPropertyCount() +{ + return (int)registeredGlobalProps.GetLength(); +} + +// interface +// TODO: If the typeId ever encodes the const flag, then the isConst parameter should be removed +int asCScriptEngine::GetGlobalPropertyByIndex(asUINT index, const char **name, int *typeId, bool *isConst, const char **configGroup, void **pointer) +{ + if( index >= registeredGlobalProps.GetLength() ) + return asINVALID_ARG; + + if( name ) + *name = registeredGlobalProps[index]->name.AddressOf(); + + if( configGroup ) + { + asCConfigGroup *group = FindConfigGroupForGlobalVar(index); + if( group ) + *configGroup = group->groupName.AddressOf(); + else + *configGroup = 0; + } + + if( typeId ) + *typeId = GetTypeIdFromDataType(registeredGlobalProps[index]->type); + + if( isConst ) + *isConst = registeredGlobalProps[index]->type.IsReadOnly(); + + if( pointer ) + *pointer = registeredGlobalProps[index]->realAddress; + + return asSUCCESS; +} + +// interface +int asCScriptEngine::RegisterObjectMethod(const char *obj, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv) +{ + if( obj == 0 ) + return ConfigError(asINVALID_ARG); + + // Determine the object type + asCDataType dt; + asCBuilder bld(this, 0); + int r = bld.ParseDataType(obj, &dt); + if( r < 0 ) + return ConfigError(r); + + if( dt.GetObjectType() == 0 ) + return ConfigError(asINVALID_ARG); + + return RegisterMethodToObjectType(dt.GetObjectType(), declaration, funcPointer, callConv); +} + +// internal +int asCScriptEngine::RegisterMethodToObjectType(asCObjectType *objectType, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv) +{ + asSSystemFunctionInterface internal; + int r = DetectCallingConvention(true, funcPointer, callConv, &internal); + if( r < 0 ) + return ConfigError(r); + + // We only support these calling conventions for object methods +#ifdef AS_MAX_PORTABILITY + if( callConv != asCALL_GENERIC ) + return ConfigError(asNOT_SUPPORTED); +#else + if( callConv != asCALL_THISCALL && + callConv != asCALL_CDECL_OBJLAST && + callConv != asCALL_CDECL_OBJFIRST && + callConv != asCALL_GENERIC ) + return ConfigError(asNOT_SUPPORTED); +#endif + + isPrepared = false; + + // Put the system function in the list of system functions + asSSystemFunctionInterface *newInterface = asNEW(asSSystemFunctionInterface)(internal); + + asCScriptFunction *func = asNEW(asCScriptFunction)(this, 0, asFUNC_SYSTEM); + func->sysFuncIntf = newInterface; + func->objectType = objectType; + + asCBuilder bld(this, 0); + r = bld.ParseFunctionDeclaration(func->objectType, declaration, func, true, &newInterface->paramAutoHandles, &newInterface->returnAutoHandle); + if( r < 0 ) + { + // Set as dummy function before deleting + func->funcType = -1; + asDELETE(func,asCScriptFunction); + return ConfigError(asINVALID_DECLARATION); + } + + // Check name conflicts + asCDataType x = asCDataType::CreateObject(objectType, false); + r = bld.CheckNameConflictMember(x, func->name.AddressOf(), 0, 0); + if( r < 0 ) + { + asDELETE(func,asCScriptFunction); + return ConfigError(asNAME_TAKEN); + } + + func->id = GetNextScriptFunctionId(); + func->objectType->methods.PushLast(func->id); + SetScriptFunction(func); + + // TODO: This code is repeated in many places + // If parameter type from other groups are used, add references + if( func->returnType.GetObjectType() ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(func->returnType.GetObjectType()); + currentGroup->RefConfigGroup(group); + } + for( asUINT n = 0; n < func->parameterTypes.GetLength(); n++ ) + { + if( func->parameterTypes[n].GetObjectType() ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(func->parameterTypes[n].GetObjectType()); + currentGroup->RefConfigGroup(group); + } + } + + // Check if the method restricts that use of the template to value types or reference types + if( func->objectType->flags & asOBJ_TEMPLATE ) + { + if( func->returnType.GetObjectType() == func->objectType->templateSubType.GetObjectType() ) + { + if( func->returnType.IsObjectHandle() ) + func->objectType->acceptValueSubType = false; + else if( !func->returnType.IsReference() ) + func->objectType->acceptRefSubType = false; + } + + for( asUINT n = 0; n < func->parameterTypes.GetLength(); n++ ) + { + if( func->parameterTypes[n].GetObjectType() == func->objectType->templateSubType.GetObjectType() ) + { + // TODO: If unsafe references are allowed, then inout references allow value types + if( func->parameterTypes[n].IsObjectHandle() || (func->parameterTypes[n].IsReference() && func->inOutFlags[n] == asTM_INOUTREF) ) + func->objectType->acceptValueSubType = false; + else if( !func->parameterTypes[n].IsReference() ) + func->objectType->acceptRefSubType = false; + } + } + } + + // TODO: beh.copy member will be removed, so this is not necessary + // Is this the default copy behaviour? + if( func->name == "opAssign" && func->parameterTypes.GetLength() == 1 && func->isReadOnly == false && + (objectType->flags & asOBJ_SCRIPT_OBJECT || func->parameterTypes[0].IsEqualExceptRefAndConst(asCDataType::CreateObject(func->objectType, false))) ) + { + func->objectType->beh.copy = func->id; + func->AddRef(); + } + + // Return the function id as success + return func->id; +} + +// interface +int asCScriptEngine::RegisterGlobalFunction(const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv) +{ + asSSystemFunctionInterface internal; + int r = DetectCallingConvention(false, funcPointer, callConv, &internal); + if( r < 0 ) + return ConfigError(r); + +#ifdef AS_MAX_PORTABILITY + if( callConv != asCALL_GENERIC ) + return ConfigError(asNOT_SUPPORTED); +#else + if( callConv != asCALL_CDECL && + callConv != asCALL_STDCALL && + callConv != asCALL_GENERIC ) + return ConfigError(asNOT_SUPPORTED); +#endif + + isPrepared = false; + + // Put the system function in the list of system functions + asSSystemFunctionInterface *newInterface = asNEW(asSSystemFunctionInterface)(internal); + + asCScriptFunction *func = asNEW(asCScriptFunction)(this, 0, asFUNC_SYSTEM); + func->sysFuncIntf = newInterface; + + asCBuilder bld(this, 0); + r = bld.ParseFunctionDeclaration(0, declaration, func, true, &newInterface->paramAutoHandles, &newInterface->returnAutoHandle); + if( r < 0 ) + { + // Set as dummy function before deleting + func->funcType = -1; + asDELETE(func,asCScriptFunction); + return ConfigError(asINVALID_DECLARATION); + } + + // Check name conflicts + r = bld.CheckNameConflict(func->name.AddressOf(), 0, 0); + if( r < 0 ) + { + asDELETE(func,asCScriptFunction); + return ConfigError(asNAME_TAKEN); + } + + func->id = GetNextScriptFunctionId(); + SetScriptFunction(func); + + currentGroup->scriptFunctions.PushLast(func); + registeredGlobalFuncs.PushLast(func); + + // If parameter type from other groups are used, add references + if( func->returnType.GetObjectType() ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(func->returnType.GetObjectType()); + currentGroup->RefConfigGroup(group); + } + for( asUINT n = 0; n < func->parameterTypes.GetLength(); n++ ) + { + if( func->parameterTypes[n].GetObjectType() ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(func->parameterTypes[n].GetObjectType()); + currentGroup->RefConfigGroup(group); + } + } + + // Return the function id as success + return func->id; +} + +// interface +int asCScriptEngine::GetGlobalFunctionCount() +{ + return (int)registeredGlobalFuncs.GetLength(); +} + +// interface +int asCScriptEngine::GetGlobalFunctionIdByIndex(asUINT index) +{ + if( index >= registeredGlobalFuncs.GetLength() ) + return asINVALID_ARG; + + return registeredGlobalFuncs[index]->id; +} + + + + + +asCObjectType *asCScriptEngine::GetObjectType(const char *type) +{ + // TODO: optimize: Improve linear search + for( asUINT n = 0; n < objectTypes.GetLength(); n++ ) + if( objectTypes[n] && + objectTypes[n]->name == type ) // TODO: template: Should we check the subtype in case of template instances? + return objectTypes[n]; + + return 0; +} + + + + +void asCScriptEngine::PrepareEngine() +{ + if( isPrepared ) return; + if( configFailed ) return; + + asUINT n; + for( n = 0; n < scriptFunctions.GetLength(); n++ ) + { + // Determine the host application interface + if( scriptFunctions[n] && scriptFunctions[n]->funcType == asFUNC_SYSTEM ) + { + if( scriptFunctions[n]->sysFuncIntf->callConv == ICC_GENERIC_FUNC || + scriptFunctions[n]->sysFuncIntf->callConv == ICC_GENERIC_METHOD ) + PrepareSystemFunctionGeneric(scriptFunctions[n], scriptFunctions[n]->sysFuncIntf, this); + else + PrepareSystemFunction(scriptFunctions[n], scriptFunctions[n]->sysFuncIntf, this); + } + } + + // Validate object type registrations + for( n = 0; n < objectTypes.GetLength(); n++ ) + { + if( objectTypes[n] && !(objectTypes[n]->flags & asOBJ_SCRIPT_OBJECT) ) + { + bool missingBehaviour = false; + const char *infoMsg = 0; + + // Verify that GC types have all behaviours + if( objectTypes[n]->flags & asOBJ_GC ) + { + if( objectTypes[n]->beh.addref == 0 || + objectTypes[n]->beh.release == 0 || + objectTypes[n]->beh.gcGetRefCount == 0 || + objectTypes[n]->beh.gcSetFlag == 0 || + objectTypes[n]->beh.gcGetFlag == 0 || + objectTypes[n]->beh.gcEnumReferences == 0 || + objectTypes[n]->beh.gcReleaseAllReferences == 0 ) + { + infoMsg = TXT_GC_REQUIRE_ADD_REL_GC_BEHAVIOUR; + missingBehaviour = true; + } + } + // Verify that scoped ref types have the release behaviour + else if( objectTypes[n]->flags & asOBJ_SCOPED ) + { + if( objectTypes[n]->beh.release == 0 ) + { + infoMsg = TXT_SCOPE_REQUIRE_REL_BEHAVIOUR; + missingBehaviour = true; + } + } + // Verify that ref types have add ref and release behaviours + else if( (objectTypes[n]->flags & asOBJ_REF) && + !(objectTypes[n]->flags & asOBJ_NOHANDLE) ) + { + if( objectTypes[n]->beh.addref == 0 || + objectTypes[n]->beh.release == 0 ) + { + infoMsg = TXT_REF_REQUIRE_ADD_REL_BEHAVIOUR; + missingBehaviour = true; + } + } + // Verify that non-pod value types have the constructor and destructor registered + else if( (objectTypes[n]->flags & asOBJ_VALUE) && + !(objectTypes[n]->flags & asOBJ_POD) ) + { + if( objectTypes[n]->beh.construct == 0 || + objectTypes[n]->beh.destruct == 0 ) + { + infoMsg = TXT_NON_POD_REQUIRE_CONSTR_DESTR_BEHAVIOUR; + missingBehaviour = true; + } + } + + if( missingBehaviour ) + { + asCString str; + str.Format(TXT_TYPE_s_IS_MISSING_BEHAVIOURS, objectTypes[n]->name.AddressOf()); + WriteMessage("", 0, 0, asMSGTYPE_ERROR, str.AddressOf()); + WriteMessage("", 0, 0, asMSGTYPE_INFORMATION, infoMsg); + ConfigError(asINVALID_CONFIGURATION); + } + } + } + + isPrepared = true; +} + +int asCScriptEngine::ConfigError(int err) +{ + configFailed = true; + return err; +} + + +// interface +int asCScriptEngine::RegisterStringFactory(const char *datatype, const asSFuncPtr &funcPointer, asDWORD callConv) +{ + asSSystemFunctionInterface internal; + int r = DetectCallingConvention(false, funcPointer, callConv, &internal); + if( r < 0 ) + return ConfigError(r); + +#ifdef AS_MAX_PORTABILITY + if( callConv != asCALL_GENERIC ) + return ConfigError(asNOT_SUPPORTED); +#else + if( callConv != asCALL_CDECL && + callConv != asCALL_STDCALL && + callConv != asCALL_GENERIC ) + return ConfigError(asNOT_SUPPORTED); +#endif + + // Put the system function in the list of system functions + asSSystemFunctionInterface *newInterface = asNEW(asSSystemFunctionInterface)(internal); + + asCScriptFunction *func = asNEW(asCScriptFunction)(this, 0, asFUNC_SYSTEM); + func->name = "_string_factory_"; + func->sysFuncIntf = newInterface; + + asCBuilder bld(this, 0); + + asCDataType dt; + r = bld.ParseDataType(datatype, &dt); + if( r < 0 ) + { + // Set as dummy before deleting + func->funcType = -1; + asDELETE(func,asCScriptFunction); + return ConfigError(asINVALID_TYPE); + } + + func->returnType = dt; + func->parameterTypes.PushLast(asCDataType::CreatePrimitive(ttInt, true)); + asCDataType parm1 = asCDataType::CreatePrimitive(ttUInt8, true); + parm1.MakeReference(true); + func->parameterTypes.PushLast(parm1); + func->id = GetNextScriptFunctionId(); + SetScriptFunction(func); + + stringFactory = func; + + if( func->returnType.GetObjectType() ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(func->returnType.GetObjectType()); + if( group == 0 ) group = &defaultGroup; + group->scriptFunctions.PushLast(func); + } + + // Register function id as success + return func->id; +} + +// interface +int asCScriptEngine::GetStringFactoryReturnTypeId() +{ + if( stringFactory == 0 ) + return asNO_FUNCTION; + + return GetTypeIdFromDataType(stringFactory->returnType); +} + +// interface +asCModule *asCScriptEngine::GetModule(const char *_name, bool create) +{ + // Accept null as well as zero-length string + const char *name = ""; + if( _name != 0 ) name = _name; + + if( lastModule && lastModule->name == name ) + return lastModule; + + // TODO: optimize: Improve linear search + for( asUINT n = 0; n < scriptModules.GetLength(); ++n ) + if( scriptModules[n] && scriptModules[n]->name == name ) + { + lastModule = scriptModules[n]; + return lastModule; + } + + if( create ) + { + asCModule *module = asNEW(asCModule)(name, this); + + scriptModules.PushLast(module); + + lastModule = module; + + return lastModule; + } + + return 0; +} + +asCModule *asCScriptEngine::GetModuleFromFuncId(int id) +{ + if( id < 0 ) return 0; + if( id >= (int)scriptFunctions.GetLength() ) return 0; + asCScriptFunction *func = scriptFunctions[id]; + if( func == 0 ) return 0; + return func->module; +} + +// internal +int asCScriptEngine::RequestBuild() +{ + ENTERCRITICALSECTION(engineCritical); + if( isBuilding ) + { + LEAVECRITICALSECTION(engineCritical); + return asBUILD_IN_PROGRESS; + } + isBuilding = true; + LEAVECRITICALSECTION(engineCritical); + + return 0; +} + +// internal +void asCScriptEngine::BuildCompleted() +{ + // Always free up pooled memory after a completed build + memoryMgr.FreeUnusedMemory(); + + isBuilding = false; +} + +#ifdef AS_DEPRECATED +// Deprecated since 2009-12-08, 2.18.0 +// interface +int asCScriptEngine::ExecuteString(const char *module, const char *script, asIScriptContext **ctx, asDWORD flags) +{ + int r; + if( (r = RequestBuild()) < 0 ) + return r; + + PrepareEngine(); + + // Make sure the config worked + if( configFailed ) + { + if( ctx && !(flags & asEXECSTRING_USE_MY_CONTEXT) ) + *ctx = 0; + + WriteMessage("",0,0,asMSGTYPE_ERROR,TXT_INVALID_CONFIGURATION); + isBuilding = false; + return asINVALID_CONFIGURATION; + } + + asIScriptContext *exec = 0; + if( !(flags & asEXECSTRING_USE_MY_CONTEXT) ) + { + int r = CreateContext(&exec, false); + if( r < 0 ) + { + if( ctx && !(flags & asEXECSTRING_USE_MY_CONTEXT) ) + *ctx = 0; + isBuilding = false; + return r; + } + if( ctx ) + { + *ctx = exec; + exec->AddRef(); + } + } + else + { + if( *ctx == 0 ) + { + isBuilding = false; + return asINVALID_ARG; + } + exec = *ctx; + exec->AddRef(); + } + + // Make sure the context isn't holding a reference to the previous ExecuteString function() + exec->Unprepare(); + + // Get the module to compile the string in + asCModule *mod = GetModule(module, true); + + // Compile string function + asCBuilder builder(this, mod); + asCString str = script; + str = "void ExecuteString(){\n" + str + "\n;}"; + + r = builder.BuildString(str.AddressOf(), (asCContext*)exec); + + BuildCompleted(); + + if( r < 0 ) + { + if( ctx && !(flags & asEXECSTRING_USE_MY_CONTEXT) ) + { + (*ctx)->Release(); + *ctx = 0; + } + exec->Release(); + return asERROR; + } + + // Prepare and execute the context + r = ((asCContext*)exec)->Prepare(((asCContext*)exec)->stringFunction->id); + if( r < 0 ) + { + if( ctx && !(flags & asEXECSTRING_USE_MY_CONTEXT) ) + { + (*ctx)->Release(); + *ctx = 0; + } + exec->Release(); + return r; + } + + if( flags & asEXECSTRING_ONLY_PREPARE ) + r = asEXECUTION_PREPARED; + else + r = exec->Execute(); + + exec->Release(); + return r; +} +#endif + +void asCScriptEngine::RemoveTemplateInstanceType(asCObjectType *t) +{ + int n; + + // Destroy the factory stubs + for( n = 0; n < (int)t->beh.factories.GetLength(); n++ ) + { + // Make sure the factory stub isn't referencing this object anymore + scriptFunctions[t->beh.factories[n]]->ReleaseAllHandles(this); + scriptFunctions[t->beh.factories[n]]->Release(); + } + t->beh.factories.SetLength(0); + + // Destroy the specialized functions + for( n = 1; n < (int)t->beh.operators.GetLength(); n += 2 ) + { + if( t->beh.operators[n] && scriptFunctions[t->beh.operators[n]]->objectType == t ) + { + scriptFunctions[t->beh.operators[n]]->Release(); + } + } + t->beh.operators.SetLength(0); + + // Start searching from the end of the list, as most of + // the time it will be the last two types + for( n = (int)templateTypes.GetLength()-1; n >= 0; n-- ) + { + if( templateTypes[n] == t ) + { + if( n == (signed)templateTypes.GetLength()-1 ) + templateTypes.PopLast(); + else + templateTypes[n] = templateTypes.PopLast(); + } + } + + for( n = (int)templateInstanceTypes.GetLength()-1; n >= 0; n-- ) + { + if( templateInstanceTypes[n] == t ) + { + if( n == (signed)templateInstanceTypes.GetLength()-1 ) + templateInstanceTypes.PopLast(); + else + templateInstanceTypes[n] = templateInstanceTypes.PopLast(); + } + } + + asDELETE(t,asCObjectType); +} + +asCObjectType *asCScriptEngine::GetTemplateInstanceType(asCObjectType *templateType, asCDataType &subType) +{ + asUINT n; + + // Is there any template instance type or template specialization already with this subtype? + for( n = 0; n < templateTypes.GetLength(); n++ ) + { + if( templateTypes[n] && + templateTypes[n]->name == templateType->name && + templateTypes[n]->templateSubType == subType ) + return templateTypes[n]; + } + + // No previous template instance exists + + // Make sure this template supports the subtype + if( !templateType->acceptValueSubType && (subType.IsPrimitive() || (subType.GetObjectType()->flags & asOBJ_VALUE)) ) + return 0; + + if( !templateType->acceptRefSubType && (subType.IsObject() && (subType.GetObjectType()->flags & asOBJ_REF)) ) + return 0; + + // Create a new template instance type based on the templateType + asCObjectType *ot = asNEW(asCObjectType)(this); + ot->templateSubType = subType; + ot->flags = templateType->flags; + ot->size = templateType->size; + ot->name = templateType->name; + + // Before filling in the methods, call the template instance callback behaviour to validate the type + if( templateType->beh.templateCallback ) + { + asCScriptFunction *callback = scriptFunctions[templateType->beh.templateCallback]; + if( !CallGlobalFunctionRetBool(ot, 0, callback->sysFuncIntf, callback) ) + { + // The type cannot be instanciated + ot->templateSubType = asCDataType(); + asDELETE(ot, asCObjectType); + return 0; + } + } + + ot->methods = templateType->methods; + for( n = 0; n < ot->methods.GetLength(); n++ ) + scriptFunctions[ot->methods[n]]->AddRef(); + // Store the real factory in the constructor + ot->beh.construct = templateType->beh.factory; + ot->beh.constructors = templateType->beh.factories; + for( n = 0; n < ot->beh.constructors.GetLength(); n++ ) + scriptFunctions[ot->beh.constructors[n]]->AddRef(); + + // Generate factory stubs for each of the factories + for( n = 0; n < templateType->beh.factories.GetLength(); n++ ) + { + int factoryId = templateType->beh.factories[n]; + asCScriptFunction *factory = scriptFunctions[factoryId]; + + asCScriptFunction *func = asNEW(asCScriptFunction)(this, 0, asFUNC_SCRIPT); + func->name = "factstub"; + func->id = GetNextScriptFunctionId(); + func->returnType = asCDataType::CreateObjectHandle(ot, false); + + // Skip the first parameter as this is the object type pointer that the stub will add + for( asUINT p = 1; p < factory->parameterTypes.GetLength(); p++ ) + { + func->parameterTypes.PushLast(factory->parameterTypes[p]); + func->inOutFlags.PushLast(factory->inOutFlags[p]); + } + + SetScriptFunction(func); + + asCBuilder builder(this, 0); + asCCompiler compiler(this); + compiler.CompileTemplateFactoryStub(&builder, factoryId, ot, func); + + // The function's refCount was already initialized to 1 + ot->beh.factories.PushLast(func->id); + } + if( ot->beh.factories.GetLength() ) + ot->beh.factory = ot->beh.factories[0]; + else + { + asASSERT(false); + ot->beh.factory = templateType->beh.factory; + } + + + + ot->beh.addref = templateType->beh.addref; + if( scriptFunctions[ot->beh.addref] ) scriptFunctions[ot->beh.addref]->AddRef(); + ot->beh.release = templateType->beh.release; + if( scriptFunctions[ot->beh.release] ) scriptFunctions[ot->beh.release]->AddRef(); + ot->beh.copy = templateType->beh.copy; + if( scriptFunctions[ot->beh.copy] ) scriptFunctions[ot->beh.copy]->AddRef(); + ot->beh.operators = templateType->beh.operators; + for( n = 1; n < ot->beh.operators.GetLength(); n += 2 ) + { + scriptFunctions[ot->beh.operators[n]]->AddRef(); + } + ot->beh.gcGetRefCount = templateType->beh.gcGetRefCount; + if( scriptFunctions[ot->beh.gcGetRefCount] ) scriptFunctions[ot->beh.gcGetRefCount]->AddRef(); + ot->beh.gcSetFlag = templateType->beh.gcSetFlag; + if( scriptFunctions[ot->beh.gcSetFlag] ) scriptFunctions[ot->beh.gcSetFlag]->AddRef(); + ot->beh.gcGetFlag = templateType->beh.gcGetFlag; + if( scriptFunctions[ot->beh.gcGetFlag] ) scriptFunctions[ot->beh.gcGetFlag]->AddRef(); + ot->beh.gcEnumReferences = templateType->beh.gcEnumReferences; + if( scriptFunctions[ot->beh.gcEnumReferences] ) scriptFunctions[ot->beh.gcEnumReferences]->AddRef(); + ot->beh.gcReleaseAllReferences = templateType->beh.gcReleaseAllReferences; + if( scriptFunctions[ot->beh.gcReleaseAllReferences] ) scriptFunctions[ot->beh.gcReleaseAllReferences]->AddRef(); + + // As the new template type is instanciated, the engine should + // generate new functions to substitute the ones with the template subtype. + for( n = 1; n < ot->beh.operators.GetLength(); n += 2 ) + { + int funcId = ot->beh.operators[n]; + asCScriptFunction *func = scriptFunctions[funcId]; + + if( GenerateNewTemplateFunction(templateType, ot, subType, func, &func) ) + { + // Release the old function, the new one already has its ref count set to 1 + scriptFunctions[ot->beh.operators[n]]->Release(); + ot->beh.operators[n] = func->id; + } + } + + // As the new template type is instanciated, the engine should + // generate new functions to substitute the ones with the template subtype. + for( n = 0; n < ot->methods.GetLength(); n++ ) + { + int funcId = ot->methods[n]; + asCScriptFunction *func = scriptFunctions[funcId]; + + if( GenerateNewTemplateFunction(templateType, ot, subType, func, &func) ) + { + // Release the old function, the new one already has its ref count set to 1 + scriptFunctions[ot->methods[n]]->Release(); + ot->methods[n] = func->id; + } + } + + // Increase ref counter for sub type if it is an object type + if( ot->templateSubType.GetObjectType() ) ot->templateSubType.GetObjectType()->AddRef(); + + // Verify if the subtype contains a garbage collected object, in which case this template is a potential circular reference + // TODO: We may be a bit smarter here. If we can guarantee that the array type cannot be part of the + // potential circular reference then we don't need to set the flag + + if( ot->templateSubType.GetObjectType() && (ot->templateSubType.GetObjectType()->flags & asOBJ_GC) ) + ot->flags |= asOBJ_GC; + else if( ot->name == defaultArrayObjectType->name ) + ot->flags &= ~asOBJ_GC; + + templateTypes.PushLast(ot); + + // We need to store the object type somewhere for clean-up later + // TODO: Why do we need both templateTypes and templateInstanceTypes? It is possible to differ between template instance and template specialization by checking for the asOBJ_TEMPLATE flag + templateInstanceTypes.PushLast(ot); + + return ot; +} + +bool asCScriptEngine::GenerateNewTemplateFunction(asCObjectType *templateType, asCObjectType *ot, asCDataType &subType, asCScriptFunction *func, asCScriptFunction **newFunc) +{ + bool needNewFunc = false; + if( func->returnType.GetObjectType() == templateType->templateSubType.GetObjectType() || + func->returnType.GetObjectType() == templateType ) + needNewFunc = true; + else + { + for( asUINT p = 0; p < func->parameterTypes.GetLength(); p++ ) + { + if( func->parameterTypes[p].GetObjectType() == templateType->templateSubType.GetObjectType() || + func->parameterTypes[p].GetObjectType() == templateType ) + { + needNewFunc = true; + break; + } + } + } + + if( needNewFunc ) + { + asCScriptFunction *func2 = asNEW(asCScriptFunction)(this, 0, func->funcType); + func2->name = func->name; + func2->id = GetNextScriptFunctionId(); + + if( func->returnType.GetObjectType() == templateType->templateSubType.GetObjectType() ) + { + func2->returnType = subType; + if( func->returnType.IsObjectHandle() ) + func2->returnType.MakeHandle(true, true); + func2->returnType.MakeReference(func->returnType.IsReference()); + func2->returnType.MakeReadOnly(func->returnType.IsReadOnly()); + } + else if( func->returnType.GetObjectType() == templateType ) + { + if( func2->returnType.IsObjectHandle() ) + func2->returnType = asCDataType::CreateObjectHandle(ot, false); + else + func2->returnType = asCDataType::CreateObject(ot, false); + + func2->returnType.MakeReference(func->returnType.IsReference()); + func2->returnType.MakeReadOnly(func->returnType.IsReadOnly()); + } + else + func2->returnType = func->returnType; + + func2->parameterTypes.SetLength(func->parameterTypes.GetLength()); + for( asUINT p = 0; p < func->parameterTypes.GetLength(); p++ ) + { + if( func->parameterTypes[p].GetObjectType() == templateType->templateSubType.GetObjectType() ) + { + func2->parameterTypes[p] = subType; + if( func->parameterTypes[p].IsObjectHandle() ) + func2->parameterTypes[p].MakeHandle(true); + func2->parameterTypes[p].MakeReference(func->parameterTypes[p].IsReference()); + func2->parameterTypes[p].MakeReadOnly(func->parameterTypes[p].IsReference()); + } + else if( func->parameterTypes[p].GetObjectType() == templateType ) + { + if( func2->parameterTypes[p].IsObjectHandle() ) + func2->parameterTypes[p] = asCDataType::CreateObjectHandle(ot, false); + else + func2->parameterTypes[p] = asCDataType::CreateObject(ot, false); + + func2->parameterTypes[p].MakeReference(func->parameterTypes[p].IsReference()); + func2->parameterTypes[p].MakeReadOnly(func->parameterTypes[p].IsReadOnly()); + } + else + func2->parameterTypes[p] = func->parameterTypes[p]; + } + + // TODO: template: Must be careful when instanciating templates for garbage collected types + // If the template hasn't been registered with the behaviours, it shouldn't + // permit instanciation of garbage collected types that in turn may refer to + // this instance. + + func2->inOutFlags = func->inOutFlags; + func2->isReadOnly = func->isReadOnly; + func2->objectType = ot; + func2->stackNeeded = func->stackNeeded; + func2->sysFuncIntf = asNEW(asSSystemFunctionInterface)(*func->sysFuncIntf); + + SetScriptFunction(func2); + + // Return the new function + *newFunc = func2; + } + + return needNewFunc; +} + +void asCScriptEngine::CallObjectMethod(void *obj, int func) +{ + asCScriptFunction *s = scriptFunctions[func]; + CallObjectMethod(obj, s->sysFuncIntf, s); +} + +void asCScriptEngine::CallObjectMethod(void *obj, asSSystemFunctionInterface *i, asCScriptFunction *s) +{ +#ifdef __GNUC__ + if( i->callConv == ICC_GENERIC_METHOD ) + { + asCGeneric gen(this, s, obj, 0); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + } + else if( i->callConv == ICC_VIRTUAL_THISCALL ) + { + // For virtual thiscalls we must call the method as a true class method + // so that the compiler will lookup the function address in the vftable + union + { + asSIMPLEMETHOD_t mthd; + struct + { + asFUNCTION_t func; + asPWORD baseOffset; // Same size as the pointer + } f; + } p; + p.f.func = (void (*)())(i->func); + p.f.baseOffset = asPWORD(i->baseOffset); + void (asCSimpleDummy::*f)() = p.mthd; + (((asCSimpleDummy*)obj)->*f)(); + } + else /*if( i->callConv == ICC_THISCALL || i->callConv == ICC_CDECL_OBJLAST || i->callConv == ICC_CDECL_OBJFIRST )*/ + { + // Non-virtual thiscall can be called just like any global function, passing the object as the first parameter + void (*f)(void *) = (void (*)(void *))(i->func); + f(obj); + } +#else +#ifndef AS_NO_CLASS_METHODS + if( i->callConv == ICC_THISCALL ) + { + union + { + asSIMPLEMETHOD_t mthd; + asFUNCTION_t func; + } p; + p.func = (void (*)())(i->func); + void (asCSimpleDummy::*f)() = p.mthd; + (((asCSimpleDummy*)obj)->*f)(); + } + else +#endif + if( i->callConv == ICC_GENERIC_METHOD ) + { + asCGeneric gen(this, s, obj, 0); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + } + else /*if( i->callConv == ICC_CDECL_OBJLAST || i->callConv == ICC_CDECL_OBJFIRST )*/ + { + void (*f)(void *) = (void (*)(void *))(i->func); + f(obj); + } +#endif +} + +bool asCScriptEngine::CallObjectMethodRetBool(void *obj, int func) +{ + asCScriptFunction *s = scriptFunctions[func]; + asSSystemFunctionInterface *i = s->sysFuncIntf; + +#ifdef __GNUC__ + if( i->callConv == ICC_GENERIC_METHOD ) + { + asCGeneric gen(this, s, obj, 0); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + return *(bool*)gen.GetReturnPointer(); + } + else if( i->callConv == ICC_VIRTUAL_THISCALL ) + { + // For virtual thiscalls we must call the method as a true class method so that the compiler will lookup the function address in the vftable + union + { + asSIMPLEMETHOD_t mthd; + struct + { + asFUNCTION_t func; + asDWORD baseOffset; + } f; + } p; + p.f.func = (void (*)())(i->func); + p.f.baseOffset = i->baseOffset; + bool (asCSimpleDummy::*f)() = (bool (asCSimpleDummy::*)())(p.mthd); + return (((asCSimpleDummy*)obj)->*f)(); + } + else /*if( i->callConv == ICC_THISCALL || i->callConv == ICC_CDECL_OBJLAST || i->callConv == ICC_CDECL_OBJFIRST )*/ + { + // Non-virtual thiscall can be called just like any global function, passing the object as the first parameter + bool (*f)(void *) = (bool (*)(void *))(i->func); + return f(obj); + } +#else +#ifndef AS_NO_CLASS_METHODS + if( i->callConv == ICC_THISCALL ) + { + union + { + asSIMPLEMETHOD_t mthd; + asFUNCTION_t func; + } p; + p.func = (void (*)())(i->func); + bool (asCSimpleDummy::*f)() = (bool (asCSimpleDummy::*)())p.mthd; + return (((asCSimpleDummy*)obj)->*f)(); + } + else +#endif + if( i->callConv == ICC_GENERIC_METHOD ) + { + asCGeneric gen(this, s, obj, 0); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + return *(bool*)gen.GetReturnPointer(); + } + else /*if( i->callConv == ICC_CDECL_OBJLAST || i->callConv == ICC_CDECL_OBJFIRST )*/ + { + bool (*f)(void *) = (bool (*)(void *))(i->func); + return f(obj); + } +#endif +} + +int asCScriptEngine::CallObjectMethodRetInt(void *obj, int func) +{ + asCScriptFunction *s = scriptFunctions[func]; + asSSystemFunctionInterface *i = s->sysFuncIntf; + +#ifdef __GNUC__ + if( i->callConv == ICC_GENERIC_METHOD ) + { + asCGeneric gen(this, s, obj, 0); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + return *(int*)gen.GetReturnPointer(); + } + else if( i->callConv == ICC_VIRTUAL_THISCALL ) + { + // For virtual thiscalls we must call the method as a true class method so that the compiler will lookup the function address in the vftable + union + { + asSIMPLEMETHOD_t mthd; + struct + { + asFUNCTION_t func; + asDWORD baseOffset; + } f; + } p; + p.f.func = (void (*)())(i->func); + p.f.baseOffset = i->baseOffset; + int (asCSimpleDummy::*f)() = (int (asCSimpleDummy::*)())(p.mthd); + return (((asCSimpleDummy*)obj)->*f)(); + } + else /*if( i->callConv == ICC_THISCALL || i->callConv == ICC_CDECL_OBJLAST || i->callConv == ICC_CDECL_OBJFIRST )*/ + { + // Non-virtual thiscall can be called just like any global function, passing the object as the first parameter + int (*f)(void *) = (int (*)(void *))(i->func); + return f(obj); + } +#else +#ifndef AS_NO_CLASS_METHODS + if( i->callConv == ICC_THISCALL ) + { + union + { + asSIMPLEMETHOD_t mthd; + asFUNCTION_t func; + } p; + p.func = (void (*)())(i->func); + int (asCSimpleDummy::*f)() = (int (asCSimpleDummy::*)())p.mthd; + return (((asCSimpleDummy*)obj)->*f)(); + } + else +#endif + if( i->callConv == ICC_GENERIC_METHOD ) + { + asCGeneric gen(this, s, obj, 0); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + return *(int*)gen.GetReturnPointer(); + } + else /*if( i->callConv == ICC_CDECL_OBJLAST || i->callConv == ICC_CDECL_OBJFIRST )*/ + { + int (*f)(void *) = (int (*)(void *))(i->func); + return f(obj); + } +#endif +} + +void *asCScriptEngine::CallGlobalFunctionRetPtr(int func) +{ + asCScriptFunction *s = scriptFunctions[func]; + return CallGlobalFunctionRetPtr(s->sysFuncIntf, s); +} + +void *asCScriptEngine::CallGlobalFunctionRetPtr(int func, void *param1) +{ + asCScriptFunction *s = scriptFunctions[func]; + return CallGlobalFunctionRetPtr(s->sysFuncIntf, s, param1); +} + +void *asCScriptEngine::CallGlobalFunctionRetPtr(asSSystemFunctionInterface *i, asCScriptFunction *s) +{ + if( i->callConv == ICC_CDECL ) + { + void *(*f)() = (void *(*)())(i->func); + return f(); + } + else if( i->callConv == ICC_STDCALL ) + { + void *(STDCALL *f)() = (void *(STDCALL *)())(i->func); + return f(); + } + else + { + asCGeneric gen(this, s, 0, 0); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + return *(void**)gen.GetReturnPointer(); + } +} + +void *asCScriptEngine::CallGlobalFunctionRetPtr(asSSystemFunctionInterface *i, asCScriptFunction *s, void *param1) +{ + if( i->callConv == ICC_CDECL ) + { + void *(*f)(void *) = (void *(*)(void *))(i->func); + return f(param1); + } + else if( i->callConv == ICC_STDCALL ) + { + void *(STDCALL *f)(void *) = (void *(STDCALL *)(void *))(i->func); + return f(param1); + } + else + { + asCGeneric gen(this, s, 0, (asDWORD*)¶m1); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + return *(void**)gen.GetReturnPointer(); + } +} + +void asCScriptEngine::CallObjectMethod(void *obj, void *param, int func) +{ + asCScriptFunction *s = scriptFunctions[func]; + CallObjectMethod(obj, param, s->sysFuncIntf, s); +} + +void asCScriptEngine::CallObjectMethod(void *obj, void *param, asSSystemFunctionInterface *i, asCScriptFunction *s) +{ +#ifdef __GNUC__ + if( i->callConv == ICC_CDECL_OBJLAST ) + { + void (*f)(void *, void *) = (void (*)(void *, void *))(i->func); + f(param, obj); + } + else if( i->callConv == ICC_GENERIC_METHOD ) + { + asCGeneric gen(this, s, obj, (asDWORD*)¶m); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + } + else /*if( i->callConv == ICC_CDECL_OBJFIRST || i->callConv == ICC_THISCALL )*/ + { + void (*f)(void *, void *) = (void (*)(void *, void *))(i->func); + f(obj, param); + } +#else +#ifndef AS_NO_CLASS_METHODS + if( i->callConv == ICC_THISCALL ) + { + union + { + asSIMPLEMETHOD_t mthd; + asFUNCTION_t func; + } p; + p.func = (void (*)())(i->func); + void (asCSimpleDummy::*f)(void *) = (void (asCSimpleDummy::*)(void *))(p.mthd); + (((asCSimpleDummy*)obj)->*f)(param); + } + else +#endif + if( i->callConv == ICC_CDECL_OBJLAST ) + { + void (*f)(void *, void *) = (void (*)(void *, void *))(i->func); + f(param, obj); + } + else if( i->callConv == ICC_GENERIC_METHOD ) + { + asCGeneric gen(this, s, obj, (asDWORD*)¶m); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + } + else /*if( i->callConv == ICC_CDECL_OBJFIRST )*/ + { + void (*f)(void *, void *) = (void (*)(void *, void *))(i->func); + f(obj, param); + } +#endif +} + +void asCScriptEngine::CallGlobalFunction(void *param1, void *param2, asSSystemFunctionInterface *i, asCScriptFunction *s) +{ + if( i->callConv == ICC_CDECL ) + { + void (*f)(void *, void *) = (void (*)(void *, void *))(i->func); + f(param1, param2); + } + else if( i->callConv == ICC_STDCALL ) + { + void (STDCALL *f)(void *, void *) = (void (STDCALL *)(void *, void *))(i->func); + f(param1, param2); + } + else + { + asCGeneric gen(this, s, 0, (asDWORD*)¶m1); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + } +} + +bool asCScriptEngine::CallGlobalFunctionRetBool(void *param1, void *param2, asSSystemFunctionInterface *i, asCScriptFunction *s) +{ + if( i->callConv == ICC_CDECL ) + { + bool (*f)(void *, void *) = (bool (*)(void *, void *))(i->func); + return f(param1, param2); + } + else if( i->callConv == ICC_STDCALL ) + { + bool (STDCALL *f)(void *, void *) = (bool (STDCALL *)(void *, void *))(i->func); + return f(param1, param2); + } + else + { + // TODO: When simulating a 64bit environment by defining AS_64BIT_PTR on a 32bit platform this code + // fails, because the stack given to asCGeneric is not prepared with two 64bit arguments. + asCGeneric gen(this, s, 0, (asDWORD*)¶m1); + void (*f)(asIScriptGeneric *) = (void (*)(asIScriptGeneric *))(i->func); + f(&gen); + return *(bool*)gen.GetReturnPointer(); + } +} + +void *asCScriptEngine::CallAlloc(asCObjectType *type) +{ + // Allocate 4 bytes as the smallest size. Otherwise CallSystemFunction may try to + // copy a DWORD onto a smaller memory block, in case the object type is return in registers. +#if defined(AS_DEBUG) + return ((asALLOCFUNCDEBUG_t)(userAlloc))(type->size < 4 ? 4 : type->size, __FILE__, __LINE__); +#else + return userAlloc(type->size < 4 ? 4 : type->size); +#endif +} + +void asCScriptEngine::CallFree(void *obj) +{ + userFree(obj); +} + +// interface +void asCScriptEngine::NotifyGarbageCollectorOfNewObject(void *obj, int typeId) +{ + asCObjectType *objType = GetObjectTypeFromTypeId(typeId); + gc.AddScriptObjectToGC(obj, objType); +} + +// interface +int asCScriptEngine::GarbageCollect(asDWORD flags) +{ + return gc.GarbageCollect(flags); +} + +// interface +void asCScriptEngine::GetGCStatistics(asUINT *currentSize, asUINT *totalDestroyed, asUINT *totalDetected) +{ + gc.GetStatistics(currentSize, totalDestroyed, totalDetected); +} + +// interface +void asCScriptEngine::GCEnumCallback(void *reference) +{ + gc.GCEnumCallback(reference); +} + + +// TODO: multithread: The mapTypeIdToDataType must be protected with critical sections in all functions that access it +int asCScriptEngine::GetTypeIdFromDataType(const asCDataType &dt) +{ + if( dt.IsNullHandle() ) return 0; + + // Find the existing type id + asSMapNode *cursor = 0; + mapTypeIdToDataType.MoveFirst(&cursor); + while( cursor ) + { + if( mapTypeIdToDataType.GetValue(cursor)->IsEqualExceptRefAndConst(dt) ) + return mapTypeIdToDataType.GetKey(cursor); + + mapTypeIdToDataType.MoveNext(&cursor, cursor); + } + + // The type id doesn't exist, create it + + // Setup the basic type id + int typeId = typeIdSeqNbr++; + if( dt.GetObjectType() ) + { + if( dt.GetObjectType()->flags & asOBJ_SCRIPT_OBJECT ) typeId |= asTYPEID_SCRIPTOBJECT; + else if( dt.GetObjectType()->flags & asOBJ_TEMPLATE ) typeId |= asTYPEID_SCRIPTARRAY; // TODO: Should be asTYPEID_TEMPLATE + else if( dt.GetObjectType()->flags & asOBJ_ENUM ); // TODO: Should we have a specific bit for this? + else typeId |= asTYPEID_APPOBJECT; + } + + // Insert the basic object type + asCDataType *newDt = asNEW(asCDataType)(dt); + newDt->MakeReference(false); + newDt->MakeReadOnly(false); + newDt->MakeHandle(false); + + mapTypeIdToDataType.Insert(typeId, newDt); + + // If the object type supports object handles then register those types as well + // Note: Don't check for addref, as asOBJ_SCOPED don't have this + if( dt.IsObject() && dt.GetObjectType()->beh.release ) + { + newDt = asNEW(asCDataType)(dt); + newDt->MakeReference(false); + newDt->MakeReadOnly(false); + newDt->MakeHandle(true); + newDt->MakeHandleToConst(false); + + mapTypeIdToDataType.Insert(typeId | asTYPEID_OBJHANDLE, newDt); + + newDt = asNEW(asCDataType)(dt); + newDt->MakeReference(false); + newDt->MakeReadOnly(false); + newDt->MakeHandle(true); + newDt->MakeHandleToConst(true); + + mapTypeIdToDataType.Insert(typeId | asTYPEID_OBJHANDLE | asTYPEID_HANDLETOCONST, newDt); + } + + // Call the method recursively to get the correct type id + return GetTypeIdFromDataType(dt); +} + +const asCDataType *asCScriptEngine::GetDataTypeFromTypeId(int typeId) +{ + asSMapNode *cursor = 0; + if( mapTypeIdToDataType.MoveTo(&cursor, typeId) ) + return mapTypeIdToDataType.GetValue(cursor); + + return 0; +} + +asCObjectType *asCScriptEngine::GetObjectTypeFromTypeId(int typeId) +{ + asSMapNode *cursor = 0; + if( mapTypeIdToDataType.MoveTo(&cursor, typeId) ) + return mapTypeIdToDataType.GetValue(cursor)->GetObjectType(); + + return 0; +} + +void asCScriptEngine::RemoveFromTypeIdMap(asCObjectType *type) +{ + asSMapNode *cursor = 0; + mapTypeIdToDataType.MoveFirst(&cursor); + while( cursor ) + { + asCDataType *dt = mapTypeIdToDataType.GetValue(cursor); + asSMapNode *old = cursor; + mapTypeIdToDataType.MoveNext(&cursor, cursor); + if( dt->GetObjectType() == type ) + { + asDELETE(dt,asCDataType); + mapTypeIdToDataType.Erase(old); + } + } +} + +// interface +int asCScriptEngine::GetTypeIdByDecl(const char *decl) +{ + asCDataType dt; + asCBuilder bld(this, 0); + int r = bld.ParseDataType(decl, &dt); + if( r < 0 ) + return asINVALID_TYPE; + + return GetTypeIdFromDataType(dt); +} + + + +const char *asCScriptEngine::GetTypeDeclaration(int typeId) +{ + const asCDataType *dt = GetDataTypeFromTypeId(typeId); + if( dt == 0 ) return 0; + + asASSERT(threadManager); + asCString *tempString = &threadManager->GetLocalData()->string; + *tempString = dt->Format(); + + return tempString->AddressOf(); +} + +int asCScriptEngine::GetSizeOfPrimitiveType(int typeId) +{ + const asCDataType *dt = GetDataTypeFromTypeId(typeId); + if( dt == 0 ) return 0; + if( !dt->IsPrimitive() ) return 0; + + return dt->GetSizeInMemoryBytes(); +} + +void *asCScriptEngine::CreateScriptObject(int typeId) +{ + // Make sure the type id is for an object type, and not a primitive or a handle + if( (typeId & (asTYPEID_MASK_OBJECT | asTYPEID_MASK_SEQNBR)) != typeId ) return 0; + if( (typeId & asTYPEID_MASK_OBJECT) == 0 ) return 0; + + const asCDataType *dt = GetDataTypeFromTypeId(typeId); + + // Is the type id valid? + if( !dt ) return 0; + + // Allocate the memory + asCObjectType *objType = dt->GetObjectType(); + void *ptr = 0; + + // Construct the object + if( objType->flags & asOBJ_SCRIPT_OBJECT ) + ptr = ScriptObjectFactory(objType, this); + else if( objType->flags & asOBJ_TEMPLATE ) + // The registered factory is moved to the construct behaviour when the type is instanciated + ptr = CallGlobalFunctionRetPtr(objType->beh.construct, objType); + else if( objType->flags & asOBJ_REF ) + ptr = CallGlobalFunctionRetPtr(objType->beh.factory); + else + { + ptr = CallAlloc(objType); + int funcIndex = objType->beh.construct; + if( funcIndex ) + CallObjectMethod(ptr, funcIndex); + } + + return ptr; +} + +void *asCScriptEngine::CreateScriptObjectCopy(void *origObj, int typeId) +{ + void *newObj = CreateScriptObject(typeId); + if( newObj == 0 ) return 0; + + CopyScriptObject(newObj, origObj, typeId); + + return newObj; +} + +void asCScriptEngine::CopyScriptObject(void *dstObj, void *srcObj, int typeId) +{ + // Make sure the type id is for an object type, and not a primitive or a handle + if( (typeId & (asTYPEID_MASK_OBJECT | asTYPEID_MASK_SEQNBR)) != typeId ) return; + if( (typeId & asTYPEID_MASK_OBJECT) == 0 ) return; + + // Copy the contents from the original object, using the assignment operator + const asCDataType *dt = GetDataTypeFromTypeId(typeId); + + // Is the type id valid? + if( !dt ) return; + + asCObjectType *objType = dt->GetObjectType(); + // TODO: beh.copy will be removed, so we need to find the default opAssign method instead + if( objType->beh.copy ) + { + CallObjectMethod(dstObj, srcObj, objType->beh.copy); + } + else if( objType->size ) + { + memcpy(dstObj, srcObj, objType->size); + } +} + +void asCScriptEngine::AddRefScriptObject(void *obj, int typeId) +{ + // Make sure it is not a null pointer + if( obj == 0 ) return; + + // Make sure the type id is for an object type or a handle + if( (typeId & asTYPEID_MASK_OBJECT) == 0 ) return; + + const asCDataType *dt = GetDataTypeFromTypeId(typeId); + + // Is the type id valid? + if( !dt ) return; + + asCObjectType *objType = dt->GetObjectType(); + + if( objType->beh.addref ) + { + // Call the addref behaviour + CallObjectMethod(obj, objType->beh.addref); + } +} + +void asCScriptEngine::ReleaseScriptObject(void *obj, int typeId) +{ + // Make sure it is not a null pointer + if( obj == 0 ) return; + + // Make sure the type id is for an object type or a handle + if( (typeId & asTYPEID_MASK_OBJECT) == 0 ) return; + + const asCDataType *dt = GetDataTypeFromTypeId(typeId); + + // Is the type id valid? + if( !dt ) return; + + asCObjectType *objType = dt->GetObjectType(); + + if( objType->beh.release ) + { + // Call the release behaviour + CallObjectMethod(obj, objType->beh.release); + } + else + { + // Call the destructor + if( objType->beh.destruct ) + CallObjectMethod(obj, objType->beh.destruct); + + // Then free the memory + CallFree(obj); + } +} + +bool asCScriptEngine::IsHandleCompatibleWithObject(void *obj, int objTypeId, int handleTypeId) +{ + // if equal, then it is obvious they are compatible + if( objTypeId == handleTypeId ) + return true; + + // Get the actual data types from the type ids + const asCDataType *objDt = GetDataTypeFromTypeId(objTypeId); + const asCDataType *hdlDt = GetDataTypeFromTypeId(handleTypeId); + + // A handle to const cannot be passed to a handle that is not referencing a const object + if( objDt->IsHandleToConst() && !hdlDt->IsHandleToConst() ) + return false; + + if( objDt->GetObjectType() == hdlDt->GetObjectType() ) + { + // The object type is equal + return true; + } + else if( objDt->IsScriptObject() && obj ) + { + // There's still a chance the object implements the requested interface + asCObjectType *objType = ((asCScriptObject*)obj)->objType; + if( objType->Implements(hdlDt->GetObjectType()) ) + return true; + } + + return false; +} + + +int asCScriptEngine::BeginConfigGroup(const char *groupName) +{ + // Make sure the group name doesn't already exist + for( asUINT n = 0; n < configGroups.GetLength(); n++ ) + { + if( configGroups[n]->groupName == groupName ) + return asNAME_TAKEN; + } + + if( currentGroup != &defaultGroup ) + return asNOT_SUPPORTED; + + asCConfigGroup *group = asNEW(asCConfigGroup)(); + group->groupName = groupName; + + configGroups.PushLast(group); + currentGroup = group; + + return 0; +} + +int asCScriptEngine::EndConfigGroup() +{ + // Raise error if trying to end the default config + if( currentGroup == &defaultGroup ) + return asNOT_SUPPORTED; + + currentGroup = &defaultGroup; + + return 0; +} + +int asCScriptEngine::RemoveConfigGroup(const char *groupName) +{ + // It is not allowed to remove a group that is still in use. + + // It would be possible to change the code in such a way that + // the group could be removed even though it was still in use, + // but that would cause severe negative impact on runtime + // performance, since the VM would then have to be able handle + // situations where the types, functions, and global variables + // can be removed at any time. + + for( asUINT n = 0; n < configGroups.GetLength(); n++ ) + { + if( configGroups[n]->groupName == groupName ) + { + asCConfigGroup *group = configGroups[n]; + + // Make sure the group isn't referenced by anyone + if( group->refCount > 0 ) + return asCONFIG_GROUP_IS_IN_USE; + + // Verify if any objects registered in this group is still alive + if( group->HasLiveObjects() ) + return asCONFIG_GROUP_IS_IN_USE; + + // Remove the group from the list + if( n == configGroups.GetLength() - 1 ) + configGroups.PopLast(); + else + configGroups[n] = configGroups.PopLast(); + + // Remove the configurations registered with this group + group->RemoveConfiguration(this); + + asDELETE(group,asCConfigGroup); + } + } + + return 0; +} + +asCConfigGroup *asCScriptEngine::FindConfigGroupForFunction(int funcId) +{ + for( asUINT n = 0; n < configGroups.GetLength(); n++ ) + { + // Check global functions + asUINT m; + for( m = 0; m < configGroups[n]->scriptFunctions.GetLength(); m++ ) + { + if( configGroups[n]->scriptFunctions[m]->id == funcId ) + return configGroups[n]; + } + } + + return 0; +} + + +asCConfigGroup *asCScriptEngine::FindConfigGroupForGlobalVar(int gvarId) +{ + for( asUINT n = 0; n < configGroups.GetLength(); n++ ) + { + for( asUINT m = 0; m < configGroups[n]->globalProps.GetLength(); m++ ) + { + if( configGroups[n]->globalProps[m]->id == gvarId ) + return configGroups[n]; + } + } + + return 0; +} + +asCConfigGroup *asCScriptEngine::FindConfigGroupForObjectType(const asCObjectType *objType) +{ + for( asUINT n = 0; n < configGroups.GetLength(); n++ ) + { + for( asUINT m = 0; m < configGroups[n]->objTypes.GetLength(); m++ ) + { + if( configGroups[n]->objTypes[m] == objType ) + return configGroups[n]; + } + } + + return 0; +} + +int asCScriptEngine::SetConfigGroupModuleAccess(const char *groupName, const char *module, bool hasAccess) +{ + asCConfigGroup *group = 0; + + // Make sure the group name doesn't already exist + for( asUINT n = 0; n < configGroups.GetLength(); n++ ) + { + if( configGroups[n]->groupName == groupName ) + { + group = configGroups[n]; + break; + } + } + + if( group == 0 ) + return asWRONG_CONFIG_GROUP; + + return group->SetModuleAccess(module, hasAccess); +} + +int asCScriptEngine::GetNextScriptFunctionId() +{ + if( freeScriptFunctionIds.GetLength() ) + return freeScriptFunctionIds.PopLast(); + + int id = (int)scriptFunctions.GetLength(); + scriptFunctions.PushLast(0); + return id; +} + +void asCScriptEngine::SetScriptFunction(asCScriptFunction *func) +{ + scriptFunctions[func->id] = func; +} + +void asCScriptEngine::FreeScriptFunctionId(int id) +{ + if( id < 0 ) return; + id &= 0xFFFF; + if( id >= (int)scriptFunctions.GetLength() ) return; + + if( scriptFunctions[id] ) + { + asCScriptFunction *func = scriptFunctions[id]; + + // Remove the function from the list of script functions + if( id == (int)scriptFunctions.GetLength() - 1 ) + { + scriptFunctions.PopLast(); + } + else + { + scriptFunctions[id] = 0; + freeScriptFunctionIds.PushLast(id); + } + + // Is the function used as signature id? + if( func->signatureId == id ) + { + // Remove the signature id + signatureIds.RemoveValue(func); + + // Update all functions using the signature id + int newSigId = 0; + for( asUINT n = 0; n < scriptFunctions.GetLength(); n++ ) + { + if( scriptFunctions[n] && scriptFunctions[n]->signatureId == id ) + { + if( newSigId == 0 ) + { + newSigId = scriptFunctions[n]->id; + signatureIds.PushLast(scriptFunctions[n]); + } + + scriptFunctions[n]->signatureId = newSigId; + } + } + } + } +} + +// interface +// TODO: typedef: Accept complex types for the typedefs +int asCScriptEngine::RegisterTypedef(const char *type, const char *decl) +{ + if( type == 0 ) return ConfigError(asINVALID_NAME); + + // Verify if the name has been registered as a type already + asUINT n; + for( n = 0; n < objectTypes.GetLength(); n++ ) + { + if( objectTypes[n] && objectTypes[n]->name == type ) + return asALREADY_REGISTERED; + } + + // Grab the data type + asCTokenizer t; + size_t tokenLen; + eTokenType token; + asCDataType dataType; + + // Create the data type + token = t.GetToken(decl, strlen(decl), &tokenLen); + switch(token) + { + case ttBool: + case ttInt: + case ttInt8: + case ttInt16: + case ttInt64: + case ttUInt: + case ttUInt8: + case ttUInt16: + case ttUInt64: + case ttFloat: + case ttDouble: + if( strlen(decl) != tokenLen ) + { + return ConfigError(asINVALID_TYPE); + } + break; + + default: + return ConfigError(asINVALID_TYPE); + } + + dataType = asCDataType::CreatePrimitive(token, false); + + // Make sure the name is not a reserved keyword + token = t.GetToken(type, strlen(type), &tokenLen); + if( token != ttIdentifier || strlen(type) != tokenLen ) + return ConfigError(asINVALID_NAME); + + asCBuilder bld(this, 0); + int r = bld.CheckNameConflict(type, 0, 0); + if( r < 0 ) + return ConfigError(asNAME_TAKEN); + + // Don't have to check against members of object + // types as they are allowed to use the names + + // Put the data type in the list + asCObjectType *object= asNEW(asCObjectType)(this); + object->flags = asOBJ_TYPEDEF; + object->size = dataType.GetSizeInMemoryBytes(); + object->name = type; + object->templateSubType = dataType; + + objectTypes.PushLast(object); + registeredTypeDefs.PushLast(object); + + currentGroup->objTypes.PushLast(object); + + return asSUCCESS; +} + +// interface +int asCScriptEngine::GetTypedefCount() +{ + return (int)registeredTypeDefs.GetLength(); +} + +// interface +const char *asCScriptEngine::GetTypedefByIndex(asUINT index, int *typeId, const char **configGroup) +{ + if( index >= registeredTypeDefs.GetLength() ) + return 0; + + if( typeId ) + *typeId = GetTypeIdByDecl(registeredTypeDefs[index]->name.AddressOf()); + + if( configGroup ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(registeredTypeDefs[index]); + if( group ) + *configGroup = group->groupName.AddressOf(); + else + *configGroup = 0; + } + + return registeredTypeDefs[index]->name.AddressOf(); +} + +// interface +int asCScriptEngine::RegisterEnum(const char *name) +{ + // Check the name + if( NULL == name ) + return ConfigError(asINVALID_NAME); + + // Verify if the name has been registered as a type already + asUINT n; + for( n = 0; n < objectTypes.GetLength(); n++ ) + if( objectTypes[n] && objectTypes[n]->name == name ) + return asALREADY_REGISTERED; + + // Use builder to parse the datatype + asCDataType dt; + asCBuilder bld(this, 0); + bool oldMsgCallback = msgCallback; msgCallback = false; + int r = bld.ParseDataType(name, &dt); + msgCallback = oldMsgCallback; + if( r >= 0 ) + return ConfigError(asERROR); + + // Make sure the name is not a reserved keyword + asCTokenizer t; + size_t tokenLen; + int token = t.GetToken(name, strlen(name), &tokenLen); + if( token != ttIdentifier || strlen(name) != tokenLen ) + return ConfigError(asINVALID_NAME); + + r = bld.CheckNameConflict(name, 0, 0); + if( r < 0 ) + return ConfigError(asNAME_TAKEN); + + asCObjectType *st = asNEW(asCObjectType)(this); + + asCDataType dataType; + dataType.CreatePrimitive(ttInt, false); + + st->flags = asOBJ_ENUM; + st->size = dataType.GetSizeInMemoryBytes(); + st->name = name; + + objectTypes.PushLast(st); + registeredEnums.PushLast(st); + + currentGroup->objTypes.PushLast(st); + + return asSUCCESS; +} + +// interface +int asCScriptEngine::RegisterEnumValue(const char *typeName, const char *valueName, int value) +{ + // Verify that the correct config group is used + if( currentGroup->FindType(typeName) == 0 ) + return asWRONG_CONFIG_GROUP; + + asCDataType dt; + int r; + asCBuilder bld(this, 0); + r = bld.ParseDataType(typeName, &dt); + if( r < 0 ) + return ConfigError(r); + + // Store the enum value + asCObjectType *ot = dt.GetObjectType(); + if( ot == 0 || !(ot->flags & asOBJ_ENUM) ) + return ConfigError(asINVALID_TYPE); + + if( NULL == valueName ) + return ConfigError(asINVALID_NAME); + + for( unsigned int n = 0; n < ot->enumValues.GetLength(); n++ ) + { + if( ot->enumValues[n]->name == valueName ) + return ConfigError(asALREADY_REGISTERED); + } + + asSEnumValue *e = asNEW(asSEnumValue); + e->name = valueName; + e->value = value; + + ot->enumValues.PushLast(e); + + return asSUCCESS; +} + +// interface +int asCScriptEngine::GetEnumCount() +{ + return (int)registeredEnums.GetLength(); +} + +// interface +const char *asCScriptEngine::GetEnumByIndex(asUINT index, int *enumTypeId, const char **configGroup) +{ + if( index >= registeredEnums.GetLength() ) + return 0; + + if( configGroup ) + { + asCConfigGroup *group = FindConfigGroupForObjectType(registeredEnums[index]); + if( group ) + *configGroup = group->groupName.AddressOf(); + else + *configGroup = 0; + } + + if( enumTypeId ) + *enumTypeId = GetTypeIdByDecl(registeredEnums[index]->name.AddressOf()); + + return registeredEnums[index]->name.AddressOf(); +} + +// interface +int asCScriptEngine::GetEnumValueCount(int enumTypeId) +{ + const asCDataType *dt = GetDataTypeFromTypeId(enumTypeId); + asCObjectType *t = dt->GetObjectType(); + if( t == 0 || !(t->GetFlags() & asOBJ_ENUM) ) + return asINVALID_TYPE; + + return (int)t->enumValues.GetLength(); +} + +// interface +const char *asCScriptEngine::GetEnumValueByIndex(int enumTypeId, asUINT index, int *outValue) +{ + // TODO: This same function is implemented in as_module.cpp as well. Perhaps it should be moved to asCObjectType? + const asCDataType *dt = GetDataTypeFromTypeId(enumTypeId); + asCObjectType *t = dt->GetObjectType(); + if( t == 0 || !(t->GetFlags() & asOBJ_ENUM) ) + return 0; + + if( index >= t->enumValues.GetLength() ) + return 0; + + if( outValue ) + *outValue = t->enumValues[index]->value; + + return t->enumValues[index]->name.AddressOf(); +} + +// interface +int asCScriptEngine::GetObjectTypeCount() +{ + return (int)registeredObjTypes.GetLength(); +} + +// interface +asIObjectType *asCScriptEngine::GetObjectTypeByIndex(asUINT index) +{ + if( index >= registeredObjTypes.GetLength() ) + return 0; + + return registeredObjTypes[index]; +} + +// interface +asIObjectType *asCScriptEngine::GetObjectTypeById(int typeId) +{ + const asCDataType *dt = GetDataTypeFromTypeId(typeId); + + // Is the type id valid? + if( !dt ) return 0; + + // Enum types are not objects, so we shouldn't return an object type for them + if( dt->GetObjectType() && dt->GetObjectType()->GetFlags() & asOBJ_ENUM ) + return 0; + + return dt->GetObjectType(); +} + + +asIScriptFunction *asCScriptEngine::GetFunctionDescriptorById(int funcId) +{ + return GetScriptFunction(funcId); +} + + +// internal +bool asCScriptEngine::IsTemplateType(const char *name) +{ + // TODO: optimize: Improve linear search + for( unsigned int n = 0; n < objectTypes.GetLength(); n++ ) + { + if( objectTypes[n] && objectTypes[n]->name == name ) + { + return objectTypes[n]->flags & asOBJ_TEMPLATE ? true : false; + } + } + + return false; +} + +// internal +int asCScriptEngine::AddConstantString(const char *str, size_t len) +{ + // The str may contain null chars, so we cannot use strlen, or strcmp, or strcpy + + // TODO: optimize: Improve linear search + // Has the string been registered before? + for( size_t n = 0; n < stringConstants.GetLength(); n++ ) + { + if( stringConstants[n]->Compare(str, len) == 0 ) + { + return (int)n; + } + } + + // No match was found, add the string + asCString *cstr = asNEW(asCString)(str, len); + stringConstants.PushLast(cstr); + + // The VM currently doesn't handle string ids larger than 65535 + asASSERT(stringConstants.GetLength() <= 65536); + + return (int)stringConstants.GetLength() - 1; +} + +// internal +const asCString &asCScriptEngine::GetConstantString(int id) +{ + return *stringConstants[id]; +} + +// internal +int asCScriptEngine::GetScriptSectionNameIndex(const char *name) +{ + // TODO: These names are only released when the engine is freed. The assumption is that + // the same script section names will be reused instead of there always being new + // names. Is this assumption valid? Do we need to add reference counting? + + // Store the script section names for future reference + for( asUINT n = 0; n < scriptSectionNames.GetLength(); n++ ) + { + if( scriptSectionNames[n]->Compare(name) == 0 ) + return n; + } + + scriptSectionNames.PushLast(asNEW(asCString)(name)); + return int(scriptSectionNames.GetLength()-1); +} + + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptengine.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptengine.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptengine.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptengine.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,378 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_scriptengine.h +// +// The implementation of the script engine interface +// + + + +#ifndef AS_SCRIPTENGINE_H +#define AS_SCRIPTENGINE_H + +#include "as_config.h" +#include "as_atomic.h" +#include "as_scriptfunction.h" +#include "as_array.h" +#include "as_datatype.h" +#include "as_objecttype.h" +#include "as_module.h" +#include "as_restore.h" +#include "as_callfunc.h" +#include "as_configgroup.h" +#include "as_memory.h" +#include "as_gc.h" + +BEGIN_AS_NAMESPACE + +class asCBuilder; +class asCContext; + +// TODO: Remove this when import is removed +struct sBindInfo; + +// TODO: Deprecate CreateScriptObject. Objects should be created by calling the factory function instead. +// TODO: Deprecate GetSizeOfPrimitiveType. This function is not necessary now that all primitive types have fixed typeIds + + +// TODO: DiscardModule should take an optional pointer to asIScriptModule instead of module name. If null, nothing is done. + +// TODO: Should have a CreateModule/GetModule instead of just GetModule with parameters. + +// TODO: Should allow enumerating modules, in case they have not been named. + + +class asCScriptEngine : public asIScriptEngine +{ +//============================================================= +// From asIScriptEngine +//============================================================= +public: + // Memory management + virtual int AddRef(); + virtual int Release(); + + // Engine properties + virtual int SetEngineProperty(asEEngineProp property, asPWORD value); + virtual asPWORD GetEngineProperty(asEEngineProp property); + + // Compiler messages + virtual int SetMessageCallback(const asSFuncPtr &callback, void *obj, asDWORD callConv); + virtual int ClearMessageCallback(); + virtual int WriteMessage(const char *section, int row, int col, asEMsgType type, const char *message); + + // JIT Compiler + virtual int SetJITCompiler(asIJITCompiler *compiler); + virtual asIJITCompiler *GetJITCompiler(); + + // Global functions + virtual int RegisterGlobalFunction(const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv); + virtual int GetGlobalFunctionCount(); + virtual int GetGlobalFunctionIdByIndex(asUINT index); + + // Global properties + virtual int RegisterGlobalProperty(const char *declaration, void *pointer); + virtual int GetGlobalPropertyCount(); + virtual int GetGlobalPropertyByIndex(asUINT index, const char **name, int *typeId = 0, bool *isConst = 0, const char **configGroup = 0, void **pointer = 0); + + // Type registration + virtual int RegisterObjectType(const char *obj, int byteSize, asDWORD flags); + virtual int RegisterObjectProperty(const char *obj, const char *declaration, int byteOffset); + virtual int RegisterObjectMethod(const char *obj, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv); + virtual int RegisterObjectBehaviour(const char *obj, asEBehaviours behaviour, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv); + virtual int RegisterInterface(const char *name); + virtual int RegisterInterfaceMethod(const char *intf, const char *declaration); + virtual int GetObjectTypeCount(); + virtual asIObjectType *GetObjectTypeByIndex(asUINT index); + + // String factory + virtual int RegisterStringFactory(const char *datatype, const asSFuncPtr &factoryFunc, asDWORD callConv); + virtual int GetStringFactoryReturnTypeId(); + + // Enums + virtual int RegisterEnum(const char *type); + virtual int RegisterEnumValue(const char *type, const char *name, int value); + virtual int GetEnumCount(); + virtual const char *GetEnumByIndex(asUINT index, int *enumTypeId, const char **configGroup = 0); + virtual int GetEnumValueCount(int enumTypeId); + virtual const char *GetEnumValueByIndex(int enumTypeId, asUINT index, int *outValue); + + // Typedefs + virtual int RegisterTypedef(const char *type, const char *decl); + virtual int GetTypedefCount(); + virtual const char *GetTypedefByIndex(asUINT index, int *typeId, const char **configGroup = 0); + + // Configuration groups + virtual int BeginConfigGroup(const char *groupName); + virtual int EndConfigGroup(); + virtual int RemoveConfigGroup(const char *groupName); + virtual int SetConfigGroupModuleAccess(const char *groupName, const char *module, bool hasAccess); + + // Script modules + virtual asIScriptModule *GetModule(const char *module, asEGMFlags flag); + virtual int DiscardModule(const char *module); + + // Script functions + virtual asIScriptFunction *GetFunctionDescriptorById(int funcId); + + // Type identification + virtual asIObjectType *GetObjectTypeById(int typeId); + virtual int GetTypeIdByDecl(const char *decl); + virtual const char *GetTypeDeclaration(int typeId); + virtual int GetSizeOfPrimitiveType(int typeId); + + // Script execution + virtual asIScriptContext *CreateContext(); + virtual void *CreateScriptObject(int typeId); + virtual void *CreateScriptObjectCopy(void *obj, int typeId); + virtual void CopyScriptObject(void *dstObj, void *srcObj, int typeId); + virtual void ReleaseScriptObject(void *obj, int typeId); + virtual void AddRefScriptObject(void *obj, int typeId); + virtual bool IsHandleCompatibleWithObject(void *obj, int objTypeId, int handleTypeId); + + // String interpretation + virtual asETokenClass ParseToken(const char *string, size_t stringLength = 0, int *tokenLength = 0); + + // Garbage collection + virtual int GarbageCollect(asDWORD flags = asGC_FULL_CYCLE); + virtual void GetGCStatistics(asUINT *currentSize, asUINT *totalDestroyed, asUINT *totalDetected); + virtual void NotifyGarbageCollectorOfNewObject(void *obj, int typeId); + virtual void GCEnumCallback(void *reference); + + // User data + virtual void *SetUserData(void *data); + virtual void *GetUserData(); + +#ifdef AS_DEPRECATED + // deprecated since 2009-12-08, 2.18.0 + virtual int ExecuteString(const char *module, const char *script, asIScriptContext **ctx, asDWORD flags); +#endif + +//=========================================================== +// internal methods +//=========================================================== +public: + asCScriptEngine(); + virtual ~asCScriptEngine(); + +//protected: + friend class asCBuilder; + friend class asCCompiler; + friend class asCContext; + friend class asCDataType; + friend class asCModule; + friend class asCRestore; + friend class asCByteCode; + friend int PrepareSystemFunction(asCScriptFunction *func, asSSystemFunctionInterface *internal, asCScriptEngine *engine); + + int RegisterMethodToObjectType(asCObjectType *objectType, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv); + int RegisterBehaviourToObjectType(asCObjectType *objectType, asEBehaviours behaviour, const char *decl, const asSFuncPtr &funcPointer, asDWORD callConv); + + int VerifyVarTypeNotInFunction(asCScriptFunction *func); + + void *CallAlloc(asCObjectType *objType); + void CallFree(void *obj); + void *CallGlobalFunctionRetPtr(int func); + void *CallGlobalFunctionRetPtr(int func, void *param1); + void *CallGlobalFunctionRetPtr(asSSystemFunctionInterface *func, asCScriptFunction *desc); + void *CallGlobalFunctionRetPtr(asSSystemFunctionInterface *i, asCScriptFunction *s, void *param1); + void CallObjectMethod(void *obj, int func); + void CallObjectMethod(void *obj, void *param, int func); + void CallObjectMethod(void *obj, asSSystemFunctionInterface *func, asCScriptFunction *desc); + void CallObjectMethod(void *obj, void *param, asSSystemFunctionInterface *func, asCScriptFunction *desc); + bool CallObjectMethodRetBool(void *obj, int func); + int CallObjectMethodRetInt(void *obj, int func); + void CallGlobalFunction(void *param1, void *param2, asSSystemFunctionInterface *func, asCScriptFunction *desc); + bool CallGlobalFunctionRetBool(void *param1, void *param2, asSSystemFunctionInterface *func, asCScriptFunction *desc); + + void ClearUnusedTypes(); + void RemoveTemplateInstanceType(asCObjectType *t); + void RemoveTypeAndRelatedFromList(asCArray &types, asCObjectType *ot); + + asCConfigGroup *FindConfigGroupForFunction(int funcId); + asCConfigGroup *FindConfigGroupForGlobalVar(int gvarId); + asCConfigGroup *FindConfigGroupForObjectType(const asCObjectType *type); + + int RequestBuild(); + void BuildCompleted(); + + void PrepareEngine(); + bool isPrepared; + + int CreateContext(asIScriptContext **context, bool isInternal); + + asCObjectType *GetObjectType(const char *type); + + int AddBehaviourFunction(asCScriptFunction &func, asSSystemFunctionInterface &internal); + + asCString GetFunctionDeclaration(int funcID); + + asCScriptFunction *GetScriptFunction(int funcID); + + asCModule *GetModule(const char *name, bool create); + asCModule *GetModuleFromFuncId(int funcId); + + int GetMethodIdByDecl(const asCObjectType *ot, const char *decl, asCModule *mod); + int GetFactoryIdByDecl(const asCObjectType *ot, const char *decl); + + int GetNextScriptFunctionId(); + void SetScriptFunction(asCScriptFunction *func); + void FreeScriptFunctionId(int id); + + int ConfigError(int err); + + int GetTypeIdFromDataType(const asCDataType &dt); + const asCDataType *GetDataTypeFromTypeId(int typeId); + asCObjectType *GetObjectTypeFromTypeId(int typeId); + void RemoveFromTypeIdMap(asCObjectType *type); + + bool IsTemplateType(const char *name); + asCObjectType *GetTemplateInstanceType(asCObjectType *templateType, asCDataType &subType); + bool GenerateNewTemplateFunction(asCObjectType *templateType, asCObjectType *templateInstanceType, asCDataType &subType, asCScriptFunction *templateFunc, asCScriptFunction **newFunc); + + // String constants + // TODO: Must free unused string constants, thus the ref count for each must be tracked + int AddConstantString(const char *str, size_t length); + const asCString &GetConstantString(int id); + + // Global property management + asCGlobalProperty *AllocateGlobalProperty(); + void FreeUnusedGlobalProperties(); + + int GetScriptSectionNameIndex(const char *name); + +//=========================================================== +// internal properties +//=========================================================== + asCMemoryMgr memoryMgr; + + int initialContextStackSize; + + asCObjectType *defaultArrayObjectType; + asCObjectType scriptTypeBehaviours; + asCObjectType functionBehaviours; + asCObjectType objectTypeBehaviours; + + // Registered interface + asCArray registeredObjTypes; + asCArray registeredTypeDefs; + asCArray registeredEnums; + asCArray registeredGlobalProps; + asCArray registeredGlobalFuncs; + asCScriptFunction *stringFactory; + bool configFailed; + + // Stores all known object types, both application registered, and script declared + asCArray objectTypes; + asCArray templateSubTypes; + + // Store information about template types + asCArray templateTypes; + + // Stores all global properties, both those registered by application, and those declared by scripts. + // The id of a global property is the index in this array. + asCArray globalProperties; + asCArray freeGlobalPropertyIds; + + // Stores all functions, i.e. registered functions, script functions, class methods, behaviours, etc. + asCArray scriptFunctions; + asCArray freeScriptFunctionIds; + asCArray signatureIds; + + // An array with all module imported functions + asCArray importedFunctions; + + // These resources must be protected for multiple accesses + asCAtomic refCount; + asCArray scriptModules; + asCModule *lastModule; + bool isBuilding; + + // Stores script declared object types + asCArray classTypes; + // This array stores the template instances types, that have been generated from template types + asCArray templateInstanceTypes; + + // Stores the names of the script sections for debugging purposes + asCArray scriptSectionNames; + + // Type identifiers + int typeIdSeqNbr; + asCMap mapTypeIdToDataType; + + // Garbage collector + asCGarbageCollector gc; + + // Dynamic groups + asCConfigGroup defaultGroup; + asCArray configGroups; + asCConfigGroup *currentGroup; + + // Message callback + bool msgCallback; + asSSystemFunctionInterface msgCallbackFunc; + void *msgCallbackObj; + + asIJITCompiler *jitCompiler; + + // String constants + asCArray stringConstants; + + // User data + void *userData; + + // Critical sections for threads + DECLARECRITICALSECTION(engineCritical); + + // Engine properties + struct + { + bool allowUnsafeReferences; + bool optimizeByteCode; + bool copyScriptSections; + int maximumContextStackSize; + bool useCharacterLiterals; + bool allowMultilineStrings; + bool allowImplicitHandleTypes; + bool buildWithoutLineCues; + bool initGlobalVarsAfterBuild; + bool requireEnumScope; + int scanner; + bool includeJitInstructions; + int stringEncoding; + } ep; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptfunction.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptfunction.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptfunction.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptfunction.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,885 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_scriptfunction.cpp +// +// A container for a compiled script function +// + + + +#include "as_config.h" +#include "as_scriptfunction.h" +#include "as_tokendef.h" +#include "as_scriptengine.h" +#include "as_callfunc.h" +#include "as_bytecode.h" +#include "as_texts.h" + +BEGIN_AS_NAMESPACE + +#ifdef AS_MAX_PORTABILITY + +static void ScriptFunction_AddRef_Generic(asIScriptGeneric *gen) +{ + asCScriptFunction *self = (asCScriptFunction*)gen->GetObject(); + self->AddRef(); +} + +static void ScriptFunction_Release_Generic(asIScriptGeneric *gen) +{ + asCScriptFunction *self = (asCScriptFunction*)gen->GetObject(); + self->Release(); +} + +static void ScriptFunction_GetRefCount_Generic(asIScriptGeneric *gen) +{ + asCScriptFunction *self = (asCScriptFunction*)gen->GetObject(); + *(int*)gen->GetAddressOfReturnLocation() = self->GetRefCount(); +} + +static void ScriptFunction_SetFlag_Generic(asIScriptGeneric *gen) +{ + asCScriptFunction *self = (asCScriptFunction*)gen->GetObject(); + self->SetFlag(); +} + +static void ScriptFunction_GetFlag_Generic(asIScriptGeneric *gen) +{ + asCScriptFunction *self = (asCScriptFunction*)gen->GetObject(); + *(bool*)gen->GetAddressOfReturnLocation() = self->GetFlag(); +} + +static void ScriptFunction_EnumReferences_Generic(asIScriptGeneric *gen) +{ + asCScriptFunction *self = (asCScriptFunction*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->EnumReferences(engine); +} + +static void ScriptFunction_ReleaseAllHandles_Generic(asIScriptGeneric *gen) +{ + asCScriptFunction *self = (asCScriptFunction*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->ReleaseAllHandles(engine); +} + +#endif + + +void RegisterScriptFunction(asCScriptEngine *engine) +{ + // Register the gc behaviours for the script functions + int r; + engine->functionBehaviours.engine = engine; + engine->functionBehaviours.flags = asOBJ_REF | asOBJ_GC; + engine->functionBehaviours.name = "_builtin_function_"; +#ifndef AS_MAX_PORTABILITY + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_ADDREF, "void f()", asMETHOD(asCScriptFunction,AddRef), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_RELEASE, "void f()", asMETHOD(asCScriptFunction,Release), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_GETREFCOUNT, "int f()", asMETHOD(asCScriptFunction,GetRefCount), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_SETGCFLAG, "void f()", asMETHOD(asCScriptFunction,SetFlag), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_GETGCFLAG, "bool f()", asMETHOD(asCScriptFunction,GetFlag), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_ENUMREFS, "void f(int&in)", asMETHOD(asCScriptFunction,EnumReferences), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_RELEASEREFS, "void f(int&in)", asMETHOD(asCScriptFunction,ReleaseAllHandles), asCALL_THISCALL); asASSERT( r >= 0 ); +#else + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_ADDREF, "void f()", asFUNCTION(ScriptFunction_AddRef_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_RELEASE, "void f()", asFUNCTION(ScriptFunction_Release_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_GETREFCOUNT, "int f()", asFUNCTION(ScriptFunction_GetRefCount_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_SETGCFLAG, "void f()", asFUNCTION(ScriptFunction_SetFlag_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_GETGCFLAG, "bool f()", asFUNCTION(ScriptFunction_GetFlag_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_ENUMREFS, "void f(int&in)", asFUNCTION(ScriptFunction_EnumReferences_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->functionBehaviours, asBEHAVE_RELEASEREFS, "void f(int&in)", asFUNCTION(ScriptFunction_ReleaseAllHandles_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); +#endif +} + +// internal +asCScriptFunction::asCScriptFunction(asCScriptEngine *engine, asCModule *mod, int _funcType) +{ + refCount.set(1); + this->engine = engine; + funcType = _funcType; + module = mod; + objectType = 0; + name = ""; + isReadOnly = false; + stackNeeded = 0; + sysFuncIntf = 0; + signatureId = 0; + scriptSectionIdx = -1; + dontCleanUpOnException = false; + vfTableIdx = -1; + jitFunction = 0; + gcFlag = false; + + // Notify the GC of script functions + if( funcType == asFUNC_SCRIPT ) + engine->gc.AddScriptObjectToGC(this, &engine->functionBehaviours); +} + +// internal +asCScriptFunction::~asCScriptFunction() +{ + // Imported functions are not reference counted, nor are dummy + // functions that are allocated on the stack + asASSERT( funcType == -1 || + funcType == asFUNC_IMPORTED || + refCount.get() == 0 ); + + ReleaseReferences(); + + // Tell engine to free the function id + if( funcType != -1 && funcType != asFUNC_IMPORTED && id ) + engine->FreeScriptFunctionId(id); + + for( asUINT n = 0; n < variables.GetLength(); n++ ) + { + asDELETE(variables[n],asSScriptVariable); + } + + if( sysFuncIntf ) + { + asDELETE(sysFuncIntf,asSSystemFunctionInterface); + } +} + +// interface +int asCScriptFunction::GetId() const +{ + return id; +} + +// interface +int asCScriptFunction::AddRef() +{ + gcFlag = false; + asASSERT( funcType != asFUNC_IMPORTED ); + return refCount.atomicInc(); +} + +// interface +int asCScriptFunction::Release() +{ + gcFlag = false; + asASSERT( funcType != asFUNC_IMPORTED ); + int r = refCount.atomicDec(); + if( r == 0 && funcType != -1 ) // Dummy functions are allocated on the stack and cannot be deleted + asDELETE(this,asCScriptFunction); + + return r; +} + +// interface +const char *asCScriptFunction::GetModuleName() const +{ + if( module ) + { + return module->name.AddressOf(); + } + + return 0; +} + +// interface +asIObjectType *asCScriptFunction::GetObjectType() const +{ + return objectType; +} + +// interface +const char *asCScriptFunction::GetObjectName() const +{ + if( objectType ) + return objectType->GetName(); + + return 0; +} + +// interface +const char *asCScriptFunction::GetName() const +{ + return name.AddressOf(); +} + +// interface +bool asCScriptFunction::IsClassMethod() const +{ + return objectType && objectType->IsInterface() == false; +} + +// interface +bool asCScriptFunction::IsInterfaceMethod() const +{ + return objectType && objectType->IsInterface(); +} + +// interface +bool asCScriptFunction::IsReadOnly() const +{ + return isReadOnly; +} + +// internal +int asCScriptFunction::GetSpaceNeededForArguments() +{ + // We need to check the size for each type + int s = 0; + for( asUINT n = 0; n < parameterTypes.GetLength(); n++ ) + s += parameterTypes[n].GetSizeOnStackDWords(); + + return s; +} + +// internal +int asCScriptFunction::GetSpaceNeededForReturnValue() +{ + return returnType.GetSizeOnStackDWords(); +} + +// internal +asCString asCScriptFunction::GetDeclarationStr(bool includeObjectName) const +{ + asCString str; + + str = returnType.Format(); + str += " "; + if( objectType && includeObjectName ) + { + if( objectType->name != "" ) + str += objectType->name + "::"; + else + str += "_unnamed_type_::"; + } + asASSERT(name.GetLength() > 0); + if( name == "" ) + str += "_unnamed_function_("; + else + str += name + "("; + + if( parameterTypes.GetLength() > 0 ) + { + asUINT n; + for( n = 0; n < parameterTypes.GetLength() - 1; n++ ) + { + str += parameterTypes[n].Format(); + if( parameterTypes[n].IsReference() && inOutFlags.GetLength() > n ) + { + if( inOutFlags[n] == asTM_INREF ) str += "in"; + else if( inOutFlags[n] == asTM_OUTREF ) str += "out"; + else if( inOutFlags[n] == asTM_INOUTREF ) str += "inout"; + } + str += ", "; + } + + str += parameterTypes[n].Format(); + if( parameterTypes[n].IsReference() && inOutFlags.GetLength() > n ) + { + if( inOutFlags[n] == asTM_INREF ) str += "in"; + else if( inOutFlags[n] == asTM_OUTREF ) str += "out"; + else if( inOutFlags[n] == asTM_INOUTREF ) str += "inout"; + } + } + + str += ")"; + + if( isReadOnly ) + str += " const"; + + return str; +} + +// internal +int asCScriptFunction::GetLineNumber(int programPosition) +{ + if( lineNumbers.GetLength() == 0 ) return 0; + + // Do a binary search in the buffer + int max = (int)lineNumbers.GetLength()/2 - 1; + int min = 0; + int i = max/2; + + for(;;) + { + if( lineNumbers[i*2] < programPosition ) + { + // Have we found the largest number < programPosition? + if( max == i ) return lineNumbers[i*2+1]; + if( lineNumbers[i*2+2] > programPosition ) return lineNumbers[i*2+1]; + + min = i + 1; + i = (max + min)/2; + } + else if( lineNumbers[i*2] > programPosition ) + { + // Have we found the smallest number > programPosition? + if( min == i ) return lineNumbers[i*2+1]; + + max = i - 1; + i = (max + min)/2; + } + else + { + // We found the exact position + return lineNumbers[i*2+1]; + } + } +} + +// internal +void asCScriptFunction::AddVariable(asCString &name, asCDataType &type, int stackOffset) +{ + asSScriptVariable *var = asNEW(asSScriptVariable); + var->name = name; + var->type = type; + var->stackOffset = stackOffset; + variables.PushLast(var); +} + +// internal +void asCScriptFunction::ComputeSignatureId() +{ + // This function will compute the signatureId based on the + // function name, return type, and parameter types. The object + // type for methods is not used, so that class methods and + // interface methods match each other. + for( asUINT n = 0; n < engine->signatureIds.GetLength(); n++ ) + { + if( !IsSignatureEqual(engine->signatureIds[n]) ) continue; + + // We don't need to increment the reference counter here, because + // asCScriptEngine::FreeScriptFunctionId will maintain the signature + // id as the function is freed. + signatureId = engine->signatureIds[n]->signatureId; + return; + } + + signatureId = id; + engine->signatureIds.PushLast(this); +} + +// internal +bool asCScriptFunction::IsSignatureEqual(const asCScriptFunction *func) const +{ + if( name != func->name ) return false; + if( returnType != func->returnType ) return false; + if( isReadOnly != func->isReadOnly ) return false; + if( inOutFlags != func->inOutFlags ) return false; + if( parameterTypes != func->parameterTypes ) return false; + if( (objectType != 0) != (func->objectType != 0) ) return false; + + return true; +} + +// internal +void asCScriptFunction::AddReferences() +{ + asUINT n; + + // Only count references if there is any bytecode + if( byteCode.GetLength() ) + { + if( returnType.IsObject() ) + returnType.GetObjectType()->AddRef(); + + for( asUINT p = 0; p < parameterTypes.GetLength(); p++ ) + if( parameterTypes[p].IsObject() ) + parameterTypes[p].GetObjectType()->AddRef(); + } + + // TODO: global: The global var address should be stored in the instruction directly + // Go through the byte code and add references to all resources used by the function + for( n = 0; n < byteCode.GetLength(); n += asBCTypeSize[asBCInfo[*(asBYTE*)&byteCode[n]].type] ) + { + switch( *(asBYTE*)&byteCode[n] ) + { + // Object types + case asBC_OBJTYPE: + case asBC_FREE: + case asBC_REFCPY: + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(&byteCode[n]); + objType->AddRef(); + } + break; + + // Object type and function + case asBC_ALLOC: + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(&byteCode[n]); + objType->AddRef(); + + int func = asBC_INTARG(&byteCode[n]+AS_PTR_SIZE); + if( func ) + engine->scriptFunctions[func]->AddRef(); + } + break; + + // Global variables + case asBC_LDG: + case asBC_PGA: + case asBC_PshG4: + case asBC_SetG4: + case asBC_CpyVtoG4: + // Need to increase the reference for each global variable + { + int gvarIdx = asBC_WORDARG0(&byteCode[n]); + asCConfigGroup *group = GetConfigGroupByGlobalVarPtrIndex(gvarIdx); + if( group != 0 ) group->AddRef(); + } + break; + + case asBC_LdGRdR4: + case asBC_CpyGtoV4: + // Need to increase the reference for each global variable + { + int gvarIdx = asBC_WORDARG1(&byteCode[n]); + asCConfigGroup *group = GetConfigGroupByGlobalVarPtrIndex(gvarIdx); + if( group != 0 ) group->AddRef(); + } + break; + + // System functions + case asBC_CALLSYS: + { + int funcId = asBC_INTARG(&byteCode[n]); + asCConfigGroup *group = engine->FindConfigGroupForFunction(funcId); + if( group != 0 ) group->AddRef(); + + engine->scriptFunctions[funcId]->AddRef(); + } + break; + + // Functions + case asBC_CALL: + case asBC_CALLINTF: + { + int func = asBC_INTARG(&byteCode[n]); + engine->scriptFunctions[func]->AddRef(); + } + break; + } + } + + // Add reference to the global properties + for( n = 0; n < globalVarPointers.GetLength(); n++ ) + { + asCGlobalProperty *prop = GetPropertyByGlobalVarPtrIndex(n); + prop->AddRef(); + } +} + +// internal +void asCScriptFunction::ReleaseReferences() +{ + asUINT n; + + // Only count references if there is any bytecode + if( byteCode.GetLength() ) + { + if( returnType.IsObject() ) + returnType.GetObjectType()->Release(); + + for( asUINT p = 0; p < parameterTypes.GetLength(); p++ ) + if( parameterTypes[p].IsObject() ) + parameterTypes[p].GetObjectType()->Release(); + } + + // TODO: global: The global var address should be stored in the instruction directly + // Go through the byte code and release references to all resources used by the function + for( n = 0; n < byteCode.GetLength(); n += asBCTypeSize[asBCInfo[*(asBYTE*)&byteCode[n]].type] ) + { + switch( *(asBYTE*)&byteCode[n] ) + { + // Object types + case asBC_OBJTYPE: + case asBC_FREE: + case asBC_REFCPY: + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(&byteCode[n]); + if( objType ) + objType->Release(); + } + break; + + // Object type and function + case asBC_ALLOC: + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(&byteCode[n]); + if( objType ) + objType->Release(); + + int func = asBC_INTARG(&byteCode[n]+AS_PTR_SIZE); + if( func ) + engine->scriptFunctions[func]->Release(); + } + break; + + // Global variables + case asBC_LDG: + case asBC_PGA: + case asBC_PshG4: + case asBC_SetG4: + case asBC_CpyVtoG4: + // Need to decrease the reference for each global variable + { + int gvarIdx = asBC_WORDARG0(&byteCode[n]); + asCConfigGroup *group = GetConfigGroupByGlobalVarPtrIndex(gvarIdx); + if( group != 0 ) group->Release(); + } + break; + + case asBC_LdGRdR4: + case asBC_CpyGtoV4: + // Need to decrease the reference for each global variable + { + int gvarIdx = asBC_WORDARG1(&byteCode[n]); + asCConfigGroup *group = GetConfigGroupByGlobalVarPtrIndex(gvarIdx); + if( group != 0 ) group->Release(); + } + break; + + // System functions + case asBC_CALLSYS: + { + int funcId = asBC_INTARG(&byteCode[n]); + asCConfigGroup *group = engine->FindConfigGroupForFunction(funcId); + if( group != 0 ) group->Release(); + + if( funcId ) + engine->scriptFunctions[funcId]->Release(); + } + break; + + // Functions + case asBC_CALL: + case asBC_CALLINTF: + { + int func = asBC_INTARG(&byteCode[n]); + if( func ) + engine->scriptFunctions[func]->Release(); + } + break; + } + } + + // Release the global properties + for( n = 0; n < globalVarPointers.GetLength(); n++ ) + { + asCGlobalProperty *prop = GetPropertyByGlobalVarPtrIndex(n); + prop->Release(); + } + + // Release the jit compiled function + if( jitFunction ) + engine->jitCompiler->ReleaseJITFunction(jitFunction); + jitFunction = 0; +} + +// interface +int asCScriptFunction::GetReturnTypeId() const +{ + return engine->GetTypeIdFromDataType(returnType); +} + +// interface +int asCScriptFunction::GetParamCount() const +{ + return (int)parameterTypes.GetLength(); +} + +// interface +int asCScriptFunction::GetParamTypeId(int index, asDWORD *flags) const +{ + if( index < 0 || (unsigned)index >= parameterTypes.GetLength() ) + return asINVALID_ARG; + + if( flags ) + *flags = inOutFlags[index]; + + return engine->GetTypeIdFromDataType(parameterTypes[index]); +} + +// interface +asIScriptEngine *asCScriptFunction::GetEngine() const +{ + return engine; +} + +// interface +const char *asCScriptFunction::GetDeclaration(bool includeObjectName) const +{ + asASSERT(threadManager); + asCString *tempString = &threadManager->GetLocalData()->string; + *tempString = GetDeclarationStr(includeObjectName); + return tempString->AddressOf(); +} + +// interface +const char *asCScriptFunction::GetScriptSectionName() const +{ + if( scriptSectionIdx >= 0 ) + return engine->scriptSectionNames[scriptSectionIdx]->AddressOf(); + + return 0; +} + +// interface +const char *asCScriptFunction::GetConfigGroup() const +{ + asCConfigGroup *group = engine->FindConfigGroupForFunction(id); + if( group == 0 ) + return 0; + + return group->groupName.AddressOf(); +} + +// internal +void asCScriptFunction::JITCompile() +{ + asIJITCompiler *jit = engine->GetJITCompiler(); + if( !jit ) + return; + + // Release the previous function, if any + if( jitFunction ) + { + engine->jitCompiler->ReleaseJITFunction(jitFunction); + jitFunction = 0; + } + + // Compile for native system + int r = jit->CompileFunction(this, &jitFunction); + if( r < 0 ) + { + asASSERT( jitFunction == 0 ); + } +} + +// interface +asDWORD *asCScriptFunction::GetByteCode(asUINT *length) +{ + if( length ) + *length = (asUINT)byteCode.GetLength(); + + if( byteCode.GetLength() ) + { + return byteCode.AddressOf(); + } + + return 0; +} + +// internal +int asCScriptFunction::GetGlobalVarPtrIndex(int gvarId) +{ + void *ptr = engine->globalProperties[gvarId]->GetAddressOfValue(); + + // Check if this pointer has been stored already + for( int n = 0; n < (signed)globalVarPointers.GetLength(); n++ ) + if( globalVarPointers[n] == ptr ) + return n; + + // Add the new variable to the array + globalVarPointers.PushLast(ptr); + return (int)globalVarPointers.GetLength()-1; +} + +// internal +asCConfigGroup *asCScriptFunction::GetConfigGroupByGlobalVarPtrIndex(int index) +{ + void *gvarPtr = globalVarPointers[index]; + + int gvarId = -1; + for( asUINT g = 0; g < engine->registeredGlobalProps.GetLength(); g++ ) + { + if( engine->registeredGlobalProps[g] && engine->registeredGlobalProps[g]->GetAddressOfValue() == gvarPtr ) + { + gvarId = engine->registeredGlobalProps[g]->id; + break; + } + } + + if( gvarId >= 0 ) + { + // Find the config group from the property id + return engine->FindConfigGroupForGlobalVar(gvarId); + } + + return 0; +} + +// internal +asCGlobalProperty *asCScriptFunction::GetPropertyByGlobalVarPtrIndex(int index) +{ + void *gvarPtr = globalVarPointers[index]; + + for( asUINT g = 0; g < engine->globalProperties.GetLength(); g++ ) + if( engine->globalProperties[g] && engine->globalProperties[g]->GetAddressOfValue() == gvarPtr ) + return engine->globalProperties[g]; + + return 0; +} + +// internal +int asCScriptFunction::GetRefCount() +{ + return refCount.get(); +} + +// internal +void asCScriptFunction::SetFlag() +{ + gcFlag = true; +} + +// internal +bool asCScriptFunction::GetFlag() +{ + return gcFlag; +} + +// internal +void asCScriptFunction::EnumReferences(asIScriptEngine *) +{ + // Notify the GC of all object types used + if( returnType.IsObject() ) + engine->GCEnumCallback(returnType.GetObjectType()); + + for( asUINT p = 0; p < parameterTypes.GetLength(); p++ ) + if( parameterTypes[p].IsObject() ) + engine->GCEnumCallback(parameterTypes[p].GetObjectType()); + + // Notify the GC of all script functions that is accessed + for( asUINT n = 0; n < byteCode.GetLength(); n += asBCTypeSize[asBCInfo[*(asBYTE*)&byteCode[n]].type] ) + { + switch( *(asBYTE*)&byteCode[n] ) + { + case asBC_OBJTYPE: + case asBC_FREE: + case asBC_REFCPY: + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(&byteCode[n]); + engine->GCEnumCallback(objType); + } + break; + + case asBC_ALLOC: + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(&byteCode[n]); + engine->GCEnumCallback(objType); + + int func = asBC_INTARG(&byteCode[n]+AS_PTR_SIZE); + if( func ) + engine->GCEnumCallback(engine->scriptFunctions[func]); + } + break; + + case asBC_CALL: + case asBC_CALLINTF: + { + int func = asBC_INTARG(&byteCode[n]); + if( func ) + engine->GCEnumCallback(engine->scriptFunctions[func]); + } + break; + } + } +} + +// internal +void asCScriptFunction::ReleaseAllHandles(asIScriptEngine *) +{ + // Release paramaters + if( byteCode.GetLength() ) + { + if( returnType.IsObject() ) + { + returnType.GetObjectType()->Release(); + returnType = asCDataType::CreatePrimitive(ttVoid, false); + } + + for( asUINT p = 0; p < parameterTypes.GetLength(); p++ ) + if( parameterTypes[p].IsObject() ) + { + parameterTypes[p].GetObjectType()->Release(); + parameterTypes[p] = asCDataType::CreatePrimitive(ttInt, false); + } + } + + // Release all script functions + for( asUINT n = 0; n < byteCode.GetLength(); n += asBCTypeSize[asBCInfo[*(asBYTE*)&byteCode[n]].type] ) + { + switch( *(asBYTE*)&byteCode[n] ) + { + // Object types + case asBC_OBJTYPE: + case asBC_FREE: + case asBC_REFCPY: + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(&byteCode[n]); + objType->Release(); + *(void**)&byteCode[n+1] = 0; + } + break; + + case asBC_ALLOC: + { + asCObjectType *objType = (asCObjectType*)(size_t)asBC_PTRARG(&byteCode[n]); + objType->Release(); + *(void**)&byteCode[n+1] = 0; + + int func = asBC_INTARG(&byteCode[n]+AS_PTR_SIZE); + if( func ) + { + engine->scriptFunctions[func]->Release(); + byteCode[n+AS_PTR_SIZE+1] = 0; + } + } + break; + + case asBC_CALL: + case asBC_CALLINTF: + { + int func = asBC_INTARG(&byteCode[n]); + if( func ) + { + engine->scriptFunctions[func]->Release(); + byteCode[n+1] = 0; + } + } + break; + } + } +} + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptfunction.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptfunction.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptfunction.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptfunction.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,193 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_scriptfunction.h +// +// A container for a compiled script function +// + + + +#ifndef AS_SCRIPTFUNCTION_H +#define AS_SCRIPTFUNCTION_H + +#include "as_config.h" +#include "as_string.h" +#include "as_array.h" +#include "as_datatype.h" +#include "as_atomic.h" + +BEGIN_AS_NAMESPACE + +class asCScriptEngine; +class asCModule; +class asCConfigGroup; +class asCGlobalProperty; + +struct asSScriptVariable +{ + asCString name; + asCDataType type; + int stackOffset; +}; + +const int asFUNC_SYSTEM = 0; +const int asFUNC_SCRIPT = 1; +const int asFUNC_INTERFACE = 2; +const int asFUNC_IMPORTED = 3; +const int asFUNC_VIRTUAL = 4; + +struct asSSystemFunctionInterface; + +// TODO: Need a method for obtaining the function type, so that the application can differenciate between the types +// This should replace the IsClassMethod and IsInterfaceMethod + +// TODO: GetModuleName should be removed. A function won't belong to a specific module anymore +// as the function can be removed from the module, but still remain alive. For example +// for dynamically generated functions held by a function pointer. + +// TODO: Might be interesting to allow enumeration of accessed global variables, and +// also functions/methods that are being called. + +void RegisterScriptFunction(asCScriptEngine *engine); + +class asCScriptFunction : public asIScriptFunction +{ +public: + // From asIScriptFunction + asIScriptEngine *GetEngine() const; + + // Memory management + int AddRef(); + int Release(); + + int GetId() const; + const char *GetModuleName() const; + asIObjectType *GetObjectType() const; + const char *GetObjectName() const; + const char *GetName() const; + const char *GetDeclaration(bool includeObjectName = true) const; + const char *GetScriptSectionName() const; + const char *GetConfigGroup() const; + + bool IsClassMethod() const; + bool IsInterfaceMethod() const; + bool IsReadOnly() const; + + int GetParamCount() const; + int GetParamTypeId(int index, asDWORD *flags = 0) const; + int GetReturnTypeId() const; + + // For JIT compilation + asDWORD *GetByteCode(asUINT *length = 0); + +public: + //----------------------------------- + // Internal methods + + asCScriptFunction(asCScriptEngine *engine, asCModule *mod, int funcType); + ~asCScriptFunction(); + + void AddVariable(asCString &name, asCDataType &type, int stackOffset); + + int GetSpaceNeededForArguments(); + int GetSpaceNeededForReturnValue(); + asCString GetDeclarationStr(bool includeObjectName = true) const; + int GetLineNumber(int programPosition); + void ComputeSignatureId(); + bool IsSignatureEqual(const asCScriptFunction *func) const; + + void JITCompile(); + + void AddReferences(); + void ReleaseReferences(); + + int GetGlobalVarPtrIndex(int gvarId); + asCConfigGroup *GetConfigGroupByGlobalVarPtrIndex(int index); + asCGlobalProperty *GetPropertyByGlobalVarPtrIndex(int index); + + // GC methods + int GetRefCount(); + void SetFlag(); + bool GetFlag(); + void EnumReferences(asIScriptEngine *engine); + void ReleaseAllHandles(asIScriptEngine *engine); + +public: + //----------------------------------- + // Properties + + asCAtomic refCount; + bool gcFlag; + asCScriptEngine *engine; + asCModule *module; + + // Function signature + asCString name; + asCDataType returnType; + asCArray parameterTypes; + asCArray inOutFlags; + bool isReadOnly; + asCObjectType *objectType; + int signatureId; + + int id; + + int funcType; + + // Used by asFUNC_SCRIPT + asCArray byteCode; + asCArray objVariableTypes; + asCArray objVariablePos; + int stackNeeded; + asCArray lineNumbers; // debug info + asCArray variables; // debug info + int scriptSectionIdx; // debug info + bool dontCleanUpOnException; // Stub functions don't own the object and parameters + + // This array holds pointers to all global variables that the function access. + // The byte code holds an index into this table to refer to a global variable. + asCArray globalVarPointers; + + // Used by asFUNC_VIRTUAL + int vfTableIdx; + + // Used by asFUNC_SYSTEM + asSSystemFunctionInterface *sysFuncIntf; + + // JIT compiled code of this function + asJITFunction jitFunction; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptnode.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptnode.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptnode.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptnode.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,149 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2007 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_scriptnode.cpp +// +// A node in the script tree built by the parser for compilation +// + + + +#include "as_scriptnode.h" +#include "as_scriptengine.h" + +BEGIN_AS_NAMESPACE + +asCScriptNode::asCScriptNode(eScriptNode type) +{ + nodeType = type; + tokenType = ttUnrecognizedToken; + tokenPos = 0; + tokenLength = 0; + + parent = 0; + next = 0; + prev = 0; + firstChild = 0; + lastChild = 0; +} + +void asCScriptNode::Destroy(asCScriptEngine *engine) +{ + // Destroy all children + asCScriptNode *node = firstChild; + asCScriptNode *next; + + while( node ) + { + next = node->next; + node->Destroy(engine); + node = next; + } + + // Return the memory to the memory manager + engine->memoryMgr.FreeScriptNode(this); +} + +void asCScriptNode::SetToken(sToken *token) +{ + tokenType = token->type; +} + +void asCScriptNode::UpdateSourcePos(size_t pos, size_t length) +{ + if( pos == 0 && length == 0 ) return; + + if( tokenPos == 0 && tokenLength == 0 ) + { + tokenPos = pos; + tokenLength = length; + } + else + { + if( tokenPos > pos ) + { + tokenLength = tokenPos + tokenLength - pos; + tokenPos = pos; + } + + if( pos + length > tokenPos + tokenLength ) + { + tokenLength = pos + length - tokenPos; + } + } +} + +void asCScriptNode::AddChildLast(asCScriptNode *node) +{ + if( lastChild ) + { + lastChild->next = node; + node->next = 0; + node->prev = lastChild; + node->parent = this; + lastChild = node; + } + else + { + firstChild = node; + lastChild = node; + node->next = 0; + node->prev = 0; + node->parent = this; + } + + UpdateSourcePos(node->tokenPos, node->tokenLength); +} + +void asCScriptNode::DisconnectParent() +{ + if( parent ) + { + if( parent->firstChild == this ) + parent->firstChild = next; + if( parent->lastChild == this ) + parent->lastChild = prev; + } + + if( next ) + next->prev = prev; + + if( prev ) + prev->next = next; + + parent = 0; + next = 0; + prev = 0; +} + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptnode.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptnode.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptnode.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptnode.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,130 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_scriptnode.h +// +// A node in the script tree built by the parser for compilation +// + + +#ifndef AS_SCRIPTNODE_H +#define AS_SCRIPTNODE_H + +#include "as_config.h" +#include "as_tokendef.h" + +BEGIN_AS_NAMESPACE + +enum eScriptNode +{ + snUndefined, + snScript, + snFunction, + snConstant, + snDataType, + snIdentifier, + snParameterList, + snStatementBlock, + snDeclaration, + snExpressionStatement, + snIf, + snFor, + snWhile, + snReturn, + snExpression, + snExprTerm, + snFunctionCall, + snConstructCall, + snArgList, + snExprPreOp, + snExprPostOp, + snExprOperator, + snExprValue, + snBreak, + snContinue, + snDoWhile, + snAssignment, + snCondition, + snGlobalVar, + snSwitch, + snCase, + snImport, + snClass, + snInitList, + snInterface, + snEnum, + snTypedef, + snCast, + snVariableAccess +}; + +struct sToken +{ + eTokenType type; + size_t pos; + size_t length; +}; + +class asCScriptEngine; + +class asCScriptNode +{ +public: + asCScriptNode(eScriptNode nodeType); + + void Destroy(asCScriptEngine *engine); + + void SetToken(sToken *token); + void AddChildLast(asCScriptNode *node); + void DisconnectParent(); + + void UpdateSourcePos(size_t pos, size_t length); + + eScriptNode nodeType; + eTokenType tokenType; + size_t tokenPos; + size_t tokenLength; + + asCScriptNode *parent; + asCScriptNode *next; + asCScriptNode *prev; + asCScriptNode *firstChild; + asCScriptNode *lastChild; + +protected: + // Must call Destroy instead + ~asCScriptNode() {} +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptobject.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptobject.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptobject.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptobject.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,527 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +#include + +#include "as_config.h" + +#include "as_scriptengine.h" + +#include "as_scriptobject.h" +#include "as_arrayobject.h" + +BEGIN_AS_NAMESPACE + +// This helper function will call the default factory, that is a script function +asIScriptObject *ScriptObjectFactory(asCObjectType *objType, asCScriptEngine *engine) +{ + asIScriptContext *ctx; + int r = engine->CreateContext(&ctx, true); + if( r < 0 ) + return 0; + + r = ctx->Prepare(objType->beh.factory); + if( r < 0 ) + { + ctx->Release(); + return 0; + } + + r = ctx->Execute(); + if( r != asEXECUTION_FINISHED ) + { + // TODO: Verify that the memory for the structure have been released already + ctx->Release(); + return 0; + } + + asIScriptObject *ptr = (asIScriptObject*)ctx->GetReturnAddress(); + + // Increase the reference, because the context will release it's pointer + ptr->AddRef(); + + ctx->Release(); + + return ptr; +} + +#ifdef AS_MAX_PORTABILITY + +static void ScriptObject_AddRef_Generic(asIScriptGeneric *gen) +{ + asCScriptObject *self = (asCScriptObject*)gen->GetObject(); + self->AddRef(); +} + +static void ScriptObject_Release_Generic(asIScriptGeneric *gen) +{ + asCScriptObject *self = (asCScriptObject*)gen->GetObject(); + self->Release(); +} + +static void ScriptObject_GetRefCount_Generic(asIScriptGeneric *gen) +{ + asCScriptObject *self = (asCScriptObject*)gen->GetObject(); + *(int*)gen->GetAddressOfReturnLocation() = self->GetRefCount(); +} + +static void ScriptObject_SetFlag_Generic(asIScriptGeneric *gen) +{ + asCScriptObject *self = (asCScriptObject*)gen->GetObject(); + self->SetFlag(); +} + +static void ScriptObject_GetFlag_Generic(asIScriptGeneric *gen) +{ + asCScriptObject *self = (asCScriptObject*)gen->GetObject(); + *(bool*)gen->GetAddressOfReturnLocation() = self->GetFlag(); +} + +static void ScriptObject_EnumReferences_Generic(asIScriptGeneric *gen) +{ + asCScriptObject *self = (asCScriptObject*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->EnumReferences(engine); +} + +static void ScriptObject_ReleaseAllHandles_Generic(asIScriptGeneric *gen) +{ + asCScriptObject *self = (asCScriptObject*)gen->GetObject(); + asIScriptEngine *engine = *(asIScriptEngine**)gen->GetAddressOfArg(0); + self->ReleaseAllHandles(engine); +} + +#endif + +void RegisterScriptObject(asCScriptEngine *engine) +{ + // Register the default script class behaviours + int r; + engine->scriptTypeBehaviours.engine = engine; + engine->scriptTypeBehaviours.flags = asOBJ_SCRIPT_OBJECT | asOBJ_REF | asOBJ_GC; + engine->scriptTypeBehaviours.name = "_builtin_object_"; +#ifndef AS_MAX_PORTABILITY + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_CONSTRUCT, "void f(int&in)", asFUNCTION(ScriptObject_Construct), asCALL_CDECL_OBJLAST); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_ADDREF, "void f()", asMETHOD(asCScriptObject,AddRef), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_RELEASE, "void f()", asMETHOD(asCScriptObject,Release), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterMethodToObjectType(&engine->scriptTypeBehaviours, "int &opAssign(int &in)", asFUNCTION(ScriptObject_Assignment), asCALL_CDECL_OBJLAST); asASSERT( r >= 0 ); + + // Register GC behaviours + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_GETREFCOUNT, "int f()", asMETHOD(asCScriptObject,GetRefCount), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_SETGCFLAG, "void f()", asMETHOD(asCScriptObject,SetFlag), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_GETGCFLAG, "bool f()", asMETHOD(asCScriptObject,GetFlag), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_ENUMREFS, "void f(int&in)", asMETHOD(asCScriptObject,EnumReferences), asCALL_THISCALL); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_RELEASEREFS, "void f(int&in)", asMETHOD(asCScriptObject,ReleaseAllHandles), asCALL_THISCALL); asASSERT( r >= 0 ); +#else + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_CONSTRUCT, "void f(int&in)", asFUNCTION(ScriptObject_Construct_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_ADDREF, "void f()", asFUNCTION(ScriptObject_AddRef_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_RELEASE, "void f()", asFUNCTION(ScriptObject_Release_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterMethodToObjectType(&engine->scriptTypeBehaviours, "int &opAssign(int &in)", asFUNCTION(ScriptObject_Assignment_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + + // Register GC behaviours + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_GETREFCOUNT, "int f()", asFUNCTION(ScriptObject_GetRefCount_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_SETGCFLAG, "void f()", asFUNCTION(ScriptObject_SetFlag_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_GETGCFLAG, "bool f()", asFUNCTION(ScriptObject_GetFlag_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_ENUMREFS, "void f(int&in)", asFUNCTION(ScriptObject_EnumReferences_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); + r = engine->RegisterBehaviourToObjectType(&engine->scriptTypeBehaviours, asBEHAVE_RELEASEREFS, "void f(int&in)", asFUNCTION(ScriptObject_ReleaseAllHandles_Generic), asCALL_GENERIC); asASSERT( r >= 0 ); +#endif +} + +void ScriptObject_Construct_Generic(asIScriptGeneric *gen) +{ + asCObjectType *objType = *(asCObjectType**)gen->GetAddressOfArg(0); + asCScriptObject *self = (asCScriptObject*)gen->GetObject(); + + ScriptObject_Construct(objType, self); +} + +void ScriptObject_Construct(asCObjectType *objType, asCScriptObject *self) +{ + new(self) asCScriptObject(objType); +} + +asCScriptObject::asCScriptObject(asCObjectType *ot) +{ + refCount.set(1); + objType = ot; + objType->AddRef(); + isDestructCalled = false; + + // Notify the garbage collector of this object + if( objType->flags & asOBJ_GC ) + objType->engine->gc.AddScriptObjectToGC(this, objType); + + // Construct all properties + asCScriptEngine *engine = objType->engine; + for( asUINT n = 0; n < objType->properties.GetLength(); n++ ) + { + asCObjectProperty *prop = objType->properties[n]; + if( prop->type.IsObject() ) + { + size_t *ptr = (size_t*)(((char*)this) + prop->byteOffset); + + if( prop->type.IsObjectHandle() ) + *ptr = 0; + else + { + // Allocate the object and call it's constructor + *ptr = (size_t)AllocateObject(prop->type.GetObjectType(), engine); + } + } + } +} + +void asCScriptObject::Destruct() +{ + // Call the destructor, which will also call the GCObject's destructor + this->~asCScriptObject(); + + // Free the memory + userFree(this); +} + +asCScriptObject::~asCScriptObject() +{ + objType->Release(); + + // The engine pointer should be available from the objectType + asCScriptEngine *engine = objType->engine; + + // Destroy all properties + for( asUINT n = 0; n < objType->properties.GetLength(); n++ ) + { + asCObjectProperty *prop = objType->properties[n]; + if( prop->type.IsObject() ) + { + // Destroy the object + void **ptr = (void**)(((char*)this) + prop->byteOffset); + if( *ptr ) + { + FreeObject(*ptr, prop->type.GetObjectType(), engine); + *(asDWORD*)ptr = 0; + } + } + } +} + +asIScriptEngine *asCScriptObject::GetEngine() const +{ + return objType->engine; +} + +int asCScriptObject::AddRef() +{ + // Increase counter and clear flag set by GC + gcFlag = false; + return refCount.atomicInc(); +} + +int asCScriptObject::Release() +{ + // Clear the flag set by the GC + gcFlag = false; + + // Call the script destructor behaviour if the reference counter is 1. + if( refCount.get() == 1 && !isDestructCalled ) + { + CallDestructor(); + } + + // Now do the actual releasing + int r = refCount.atomicDec(); + if( r == 0 ) + { + Destruct(); + return 0; + } + + return r; +} + +void asCScriptObject::CallDestructor() +{ + // Make sure the destructor is called once only, even if the + // reference count is increased and then decreased again + isDestructCalled = true; + + asIScriptContext *ctx = 0; + + // Call the destructor for this class and all the super classes + asCObjectType *ot = objType; + while( ot ) + { + int funcIndex = ot->beh.destruct; + if( funcIndex ) + { + if( ctx == 0 ) + { + // Setup a context for calling the default constructor + asCScriptEngine *engine = objType->engine; + int r = engine->CreateContext(&ctx, true); + if( r < 0 ) return; + } + + int r = ctx->Prepare(funcIndex); + if( r >= 0 ) + { + ctx->SetObject(this); + ctx->Execute(); + + // There's not much to do if the execution doesn't + // finish, so we just ignore the result + } + } + + ot = ot->derivedFrom; + } + + if( ctx ) + { + ctx->Release(); + } +} + +asIObjectType *asCScriptObject::GetObjectType() const +{ + return objType; +} + +int asCScriptObject::GetRefCount() +{ + return refCount.get(); +} + +void asCScriptObject::SetFlag() +{ + gcFlag = true; +} + +bool asCScriptObject::GetFlag() +{ + return gcFlag; +} + +// interface +int asCScriptObject::GetTypeId() const +{ + asCDataType dt = asCDataType::CreateObject(objType, false); + return objType->engine->GetTypeIdFromDataType(dt); +} + +int asCScriptObject::GetPropertyCount() const +{ + return (int)objType->properties.GetLength(); +} + +int asCScriptObject::GetPropertyTypeId(asUINT prop) const +{ + if( prop >= objType->properties.GetLength() ) + return asINVALID_ARG; + + return objType->engine->GetTypeIdFromDataType(objType->properties[prop]->type); +} + +const char *asCScriptObject::GetPropertyName(asUINT prop) const +{ + if( prop >= objType->properties.GetLength() ) + return 0; + + return objType->properties[prop]->name.AddressOf(); +} + +void *asCScriptObject::GetAddressOfProperty(asUINT prop) +{ + if( prop >= objType->properties.GetLength() ) + return 0; + + // Objects are stored by reference, so this must be dereferenced + asCDataType *dt = &objType->properties[prop]->type; + if( dt->IsObject() && !dt->IsObjectHandle() ) + return *(void**)(((char*)this) + objType->properties[prop]->byteOffset); + + return (void*)(((char*)this) + objType->properties[prop]->byteOffset); +} + +void asCScriptObject::EnumReferences(asIScriptEngine *engine) +{ + // We'll notify the GC of all object handles that we're holding + for( asUINT n = 0; n < objType->properties.GetLength(); n++ ) + { + asCObjectProperty *prop = objType->properties[n]; + if( prop->type.IsObject() ) + { + void *ptr = *(void**)(((char*)this) + prop->byteOffset); + if( ptr ) + ((asCScriptEngine*)engine)->GCEnumCallback(ptr); + } + } +} + +void asCScriptObject::ReleaseAllHandles(asIScriptEngine *engine) +{ + for( asUINT n = 0; n < objType->properties.GetLength(); n++ ) + { + asCObjectProperty *prop = objType->properties[n]; + if( prop->type.IsObject() && prop->type.IsObjectHandle() ) + { + void **ptr = (void**)(((char*)this) + prop->byteOffset); + if( *ptr ) + { + ((asCScriptEngine*)engine)->CallObjectMethod(*ptr, prop->type.GetBehaviour()->release); + *ptr = 0; + } + } + } +} + +void ScriptObject_Assignment_Generic(asIScriptGeneric *gen) +{ + asCScriptObject *other = *(asCScriptObject**)gen->GetAddressOfArg(0); + asCScriptObject *self = (asCScriptObject*)gen->GetObject(); + + *self = *other; + + *(asCScriptObject**)gen->GetAddressOfReturnLocation() = self; +} + +asCScriptObject &ScriptObject_Assignment(asCScriptObject *other, asCScriptObject *self) +{ + return (*self = *other); +} + +asCScriptObject &asCScriptObject::operator=(const asCScriptObject &other) +{ + if( &other != this ) + { + asASSERT( other.objType->DerivesFrom(objType) ); + + asCScriptEngine *engine = objType->engine; + + // Copy all properties + for( asUINT n = 0; n < objType->properties.GetLength(); n++ ) + { + asCObjectProperty *prop = objType->properties[n]; + if( prop->type.IsObject() ) + { + void **dst = (void**)(((char*)this) + prop->byteOffset); + void **src = (void**)(((char*)&other) + prop->byteOffset); + if( !prop->type.IsObjectHandle() ) + CopyObject(*src, *dst, prop->type.GetObjectType(), engine); + else + CopyHandle((asDWORD*)src, (asDWORD*)dst, prop->type.GetObjectType(), engine); + } + else + { + void *dst = ((char*)this) + prop->byteOffset; + void *src = ((char*)&other) + prop->byteOffset; + memcpy(dst, src, prop->type.GetSizeInMemoryBytes()); + } + } + } + + return *this; +} + +int asCScriptObject::CopyFrom(asIScriptObject *other) +{ + if( other == 0 ) return asINVALID_ARG; + + if( GetTypeId() != other->GetTypeId() ) + return asINVALID_TYPE; + + *this = *(asCScriptObject*)other; + + return 0; +} + +void *asCScriptObject::AllocateObject(asCObjectType *objType, asCScriptEngine *engine) +{ + void *ptr = 0; + + if( objType->flags & asOBJ_SCRIPT_OBJECT ) + { + ptr = ScriptObjectFactory(objType, engine); + } + else if( objType->flags & asOBJ_TEMPLATE ) + { + ptr = ArrayObjectFactory(objType); + } + else if( objType->flags & asOBJ_REF ) + { + ptr = engine->CallGlobalFunctionRetPtr(objType->beh.factory); + } + else + { + ptr = engine->CallAlloc(objType); + int funcIndex = objType->beh.construct; + if( funcIndex ) + engine->CallObjectMethod(ptr, funcIndex); + } + + return ptr; +} + +void asCScriptObject::FreeObject(void *ptr, asCObjectType *objType, asCScriptEngine *engine) +{ + if( !objType->beh.release ) + { + if( objType->beh.destruct ) + engine->CallObjectMethod(ptr, objType->beh.destruct); + + engine->CallFree(ptr); + } + else + { + engine->CallObjectMethod(ptr, objType->beh.release); + } +} + +void asCScriptObject::CopyObject(void *src, void *dst, asCObjectType *objType, asCScriptEngine *engine) +{ + int funcIndex = objType->beh.copy; + + if( funcIndex ) + engine->CallObjectMethod(dst, src, funcIndex); + else + memcpy(dst, src, objType->size); +} + +void asCScriptObject::CopyHandle(asDWORD *src, asDWORD *dst, asCObjectType *objType, asCScriptEngine *engine) +{ + if( *dst ) + engine->CallObjectMethod(*(void**)dst, objType->beh.release); + *dst = *src; + if( *dst ) + engine->CallObjectMethod(*(void**)dst, objType->beh.addref); +} + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptobject.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptobject.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptobject.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_scriptobject.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,120 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + + +// +// as_scriptobject.h +// +// A generic class for handling script declared structures +// + + + +#ifndef AS_SCRIPTOBJECT_H +#define AS_SCRIPTOBJECT_H + +#include "as_config.h" +#include "as_atomic.h" + +BEGIN_AS_NAMESPACE + +class asCObjectType; + + +class asCScriptObject : public asIScriptObject +{ +public: +//=================================== +// From asIScriptObject +//=================================== + asIScriptEngine *GetEngine() const; + + // Memory management + int AddRef(); + int Release(); + + // Type info + int GetTypeId() const; + asIObjectType *GetObjectType() const; + + // Class properties + int GetPropertyCount() const; + int GetPropertyTypeId(asUINT prop) const; + const char *GetPropertyName(asUINT prop) const; + void *GetAddressOfProperty(asUINT prop); + + int CopyFrom(asIScriptObject *other); + +//==================================== +// Internal +//==================================== + asCScriptObject(asCObjectType *objType); + virtual ~asCScriptObject(); + + asCScriptObject &operator=(const asCScriptObject &other); + + // GC methods + void Destruct(); + int GetRefCount(); + void SetFlag(); + bool GetFlag(); + void EnumReferences(asIScriptEngine *engine); + void ReleaseAllHandles(asIScriptEngine *engine); + + // Used for properties + void *AllocateObject(asCObjectType *objType, asCScriptEngine *engine); + void FreeObject(void *ptr, asCObjectType *objType, asCScriptEngine *engine); + void CopyObject(void *src, void *dst, asCObjectType *objType, asCScriptEngine *engine); + void CopyHandle(asDWORD *src, asDWORD *dst, asCObjectType *objType, asCScriptEngine *engine); + + void CallDestructor(); + + asCObjectType *objType; + +protected: + asCAtomic refCount; + bool gcFlag; + bool isDestructCalled; +}; + +void ScriptObject_Construct(asCObjectType *objType, asCScriptObject *self); +asCScriptObject &ScriptObject_Assignment(asCScriptObject *other, asCScriptObject *self); + +void ScriptObject_Construct_Generic(asIScriptGeneric *gen); +void ScriptObject_Assignment_Generic(asIScriptGeneric *gen); + +void RegisterScriptObject(asCScriptEngine *engine); + +asIScriptObject *ScriptObjectFactory(asCObjectType *objType, asCScriptEngine *engine); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,387 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + +#include "as_config.h" + +#include // va_list, va_start(), etc +#include // strtod(), strtol() +#include // some compilers declare memcpy() here + +#if !defined(AS_NO_MEMORY_H) +#include +#endif + +#include "as_string.h" + +asCString::asCString() +{ + length = 0; + local[0] = 0; + +// Assign("", 0); +} + +// Copy constructor +asCString::asCString(const asCString &str) +{ + length = 0; + local[0] = 0; + + Assign(str.AddressOf(), str.length); +} + +asCString::asCString(const char *str, size_t len) +{ + length = 0; + local[0] = 0; + + Assign(str, len); +} + +asCString::asCString(const char *str) +{ + length = 0; + local[0] = 0; + + size_t len = strlen(str); + Assign(str, len); +} + +asCString::asCString(char ch) +{ + length = 0; + local[0] = 0; + + Assign(&ch, 1); +} + +asCString::~asCString() +{ + if( length > 11 && dynamic ) + { + asDELETEARRAY(dynamic); + } +} + +char *asCString::AddressOf() +{ + if( length <= 11 ) + return local; + else + return dynamic; +} + +const char *asCString::AddressOf() const +{ + if( length <= 11 ) + return local; + else + return dynamic; +} + +void asCString::SetLength(size_t len) +{ + Allocate(len, true); +} + +void asCString::Allocate(size_t len, bool keepData) +{ + if( len > 11 ) + { + char *buf = asNEWARRAY(char,len+1); + + if( keepData ) + { + int l = (int)len < (int)length ? (int)len : (int)length; + memcpy(buf, AddressOf(), l); + } + + if( length > 11 ) + { + asDELETEARRAY(dynamic); + } + + dynamic = buf; + } + else + { + if( length > 11 ) + { + if( keepData ) + { + memcpy(&local, dynamic, len); + } + asDELETEARRAY(dynamic); + } + } + + length = (int)len; + + // Make sure the buffer is null terminated + AddressOf()[length] = 0; +} + +void asCString::Assign(const char *str, size_t len) +{ + Allocate(len, false); + + // Copy the string + memcpy(AddressOf(), str, length); + AddressOf()[length] = 0; +} + +asCString &asCString::operator =(const char *str) +{ + size_t len = str ? strlen(str) : 0; + Assign(str, len); + + return *this; +} + +asCString &asCString::operator =(const asCString &str) +{ + Assign(str.AddressOf(), str.length); + + return *this; +} + +asCString &asCString::operator =(char ch) +{ + Assign(&ch, 1); + + return *this; +} + +void asCString::Concatenate(const char *str, size_t len) +{ + asUINT oldLength = length; + SetLength(length + len); + + memcpy(AddressOf() + oldLength, str, len); + AddressOf()[length] = 0; +} + +asCString &asCString::operator +=(const char *str) +{ + size_t len = strlen(str); + Concatenate(str, len); + + return *this; +} + +asCString &asCString::operator +=(const asCString &str) +{ + Concatenate(str.AddressOf(), str.length); + + return *this; +} + +asCString &asCString::operator +=(char ch) +{ + Concatenate(&ch, 1); + + return *this; +} + +size_t asCString::GetLength() const +{ + return length; +} + +// Returns the length +size_t asCString::Format(const char *format, ...) +{ + va_list args; + va_start(args, format); + + char tmp[256]; + int r = asVSNPRINTF(tmp, 255, format, args); + + if( r > 0 ) + { + Assign(tmp, r); + } + else + { + size_t n = 512; + asCString str; // Use temporary string in case the current buffer is a parameter + str.Allocate(n, false); + + while( (r = asVSNPRINTF(str.AddressOf(), n, format, args)) < 0 ) + { + n *= 2; + str.Allocate(n, false); + } + + Assign(str.AddressOf(), r); + } + + va_end(args); + + return length; +} + +char &asCString::operator [](size_t index) +{ + asASSERT(index < length); + + return AddressOf()[index]; +} + +const char &asCString::operator [](size_t index) const +{ + asASSERT(index < length); + + return AddressOf()[index]; +} + +asCString asCString::SubString(size_t start, size_t length) const +{ + if( start >= GetLength() || length == 0 ) + return asCString(""); + + if( length == (size_t)(-1) ) length = GetLength() - start; + + asCString tmp; + tmp.Assign(AddressOf() + start, length); + + return tmp; +} + +int asCString::Compare(const char *str) const +{ + return Compare(str, strlen(str)); +} + +int asCString::Compare(const asCString &str) const +{ + return Compare(str.AddressOf(), str.GetLength()); +} + +int asCString::Compare(const char *str, size_t len) const +{ + if( length == 0 ) + { + if( str == 0 || len == 0 ) return 0; // Equal + + return 1; // The other string is larger than this + } + + if( str == 0 ) + { + if( length == 0 ) + return 0; // Equal + + return -1; // The other string is smaller than this + } + + if( len < length ) + { + int result = memcmp(AddressOf(), str, len); + if( result == 0 ) return -1; // The other string is smaller than this + + return result; + } + + int result = memcmp(AddressOf(), str, length); + if( result == 0 && length < len ) return 1; // The other string is larger than this + + return result; +} + +size_t asCString::RecalculateLength() +{ + SetLength(strlen(AddressOf())); + + return length; +} + +//----------------------------------------------------------------------------- +// Helper functions + +bool operator ==(const asCString &a, const char *b) +{ + return a.Compare(b) == 0; +} + +bool operator !=(const asCString &a, const char *b) +{ + return a.Compare(b) != 0; +} + +bool operator ==(const asCString &a, const asCString &b) +{ + return a.Compare(b) == 0; +} + +bool operator !=(const asCString &a, const asCString &b) +{ + return a.Compare(b) != 0; +} + +bool operator ==(const char *a, const asCString &b) +{ + return b.Compare(a) == 0; +} + +bool operator !=(const char *a, const asCString &b) +{ + return b.Compare(a) != 0; +} + +bool operator <(const asCString &a, const asCString &b) +{ + return a.Compare(b) < 0; +} + +asCString operator +(const asCString &a, const asCString &b) +{ + asCString res = a; + res += b; + + return res; +} + +asCString operator +(const char *a, const asCString &b) +{ + asCString res = a; + res += b; + + return res; +} + +asCString operator +(const asCString &a, const char *b) +{ + asCString res = a; + res += b; + + return res; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,106 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + +// This class has been designed to be easy to use, but not necessarily efficiency. +// It doesn't use shared string memory, or reference counting. It keeps track of +// string length, memory size. It also makes sure that the string is null-terminated. + +#ifndef AS_STRING_H +#define AS_STRING_H + +#include +#include + +class asCString +{ +public: + asCString(); + ~asCString(); + + asCString(const asCString &); + asCString(const char *); + asCString(const char *, size_t length); + explicit asCString(char); + + void Allocate(size_t len, bool keepData); + void SetLength(size_t len); + size_t GetLength() const; + + void Concatenate(const char *str, size_t length); + asCString &operator +=(const asCString &); + asCString &operator +=(const char *); + asCString &operator +=(char); + + void Assign(const char *str, size_t length); + asCString &operator =(const asCString &); + asCString &operator =(const char *); + asCString &operator =(char); + + asCString SubString(size_t start, size_t length = (size_t)(-1)) const; + + size_t Format(const char *fmt, ...); + + int Compare(const char *str) const; + int Compare(const asCString &str) const; + int Compare(const char *str, size_t length) const; + + char *AddressOf(); + const char *AddressOf() const; + char &operator [](size_t index); + const char &operator[](size_t index) const; + size_t RecalculateLength(); + +protected: + unsigned int length; + union + { + char *dynamic; + char local[12]; + }; +}; + +// Helper functions + +bool operator ==(const asCString &, const asCString &); +bool operator !=(const asCString &, const asCString &); + +bool operator ==(const asCString &, const char *); +bool operator !=(const asCString &, const char *); + +bool operator ==(const char *, const asCString &); +bool operator !=(const char *, const asCString &); + +bool operator <(const asCString &, const asCString &); + +asCString operator +(const asCString &, const char *); +asCString operator +(const char *, const asCString &); +asCString operator +(const asCString &, const asCString &); + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string_util.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string_util.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string_util.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string_util.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,264 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com + +*/ + +#include "as_config.h" + +#include // va_list, va_start(), etc +#include // strtod(), strtol() +#include // _vsnprintf() +#include // some compilers declare memcpy() here +#include // setlocale() + +#if !defined(AS_NO_MEMORY_H) +#include +#endif + +#include "as_string.h" +#include "as_string_util.h" + +BEGIN_AS_NAMESPACE + +double asStringScanDouble(const char *string, size_t *numScanned) +{ + char *end; + + // WinCE doesn't have setlocale. Some quick testing on my current platform + // still manages to parse the numbers such as "3.14" even if the decimal for the + // locale is ",". +#if !defined(_WIN32_WCE) && !defined(ANDROID) + // Set the locale to C so that we are guaranteed to parse the float value correctly + asCString orig = setlocale(LC_NUMERIC, 0); + setlocale(LC_NUMERIC, "C"); +#endif + + double res = strtod(string, &end); + +#if !defined(_WIN32_WCE) && !defined(ANDROID) + // Restore the locale + setlocale(LC_NUMERIC, orig.AddressOf()); +#endif + + if( numScanned ) + *numScanned = end - string; + + return res; +} + +asQWORD asStringScanUInt64(const char *string, int base, size_t *numScanned) +{ + asASSERT(base == 10 || base == 16); + + const char *end = string; + + asQWORD res = 0; + if( base == 10 ) + { + while( *end >= '0' && *end <= '9' ) + { + res *= 10; + res += *end++ - '0'; + } + } + else if( base == 16 ) + { + while( (*end >= '0' && *end <= '9') || + (*end >= 'a' && *end <= 'f') || + (*end >= 'A' && *end <= 'F') ) + { + res *= 16; + if( *end >= '0' && *end <= '9' ) + res += *end++ - '0'; + else if( *end >= 'a' && *end <= 'f' ) + res += *end++ - 'a' + 10; + else if( *end >= 'A' && *end <= 'F' ) + res += *end++ - 'A' + 10; + } + } + + if( numScanned ) + *numScanned = end - string; + + return res; +} + +// +// The function will encode the unicode code point into the outEncodedBuffer, and then +// return the length of the encoded value. If the input value is not a valid unicode code +// point, then the function will return -1. +// +// This function is taken from the AngelCode ToolBox. +// +int asStringEncodeUTF8(unsigned int value, char *outEncodedBuffer) +{ + unsigned char *buf = (unsigned char*)outEncodedBuffer; + + int length = -1; + + if( value <= 0x7F ) + { + buf[0] = static_cast(value); + return 1; + } + else if( value >= 0x80 && value <= 0x7FF ) + { + // Encode it with 2 characters + buf[0] = static_cast(0xC0 + (value >> 6)); + length = 2; + } + else if( (value >= 0x800 && value <= 0xD7FF) || (value >= 0xE000 && value <= 0xFFFF) ) + { + // Note: Values 0xD800 to 0xDFFF are not valid unicode characters + buf[0] = static_cast(0xE0 + (value >> 12)); + length = 3; + } + else if( value >= 0x10000 && value <= 0x10FFFF ) + { + buf[0] = static_cast(0xF0 + (value >> 18)); + length = 4; + } + + int n = length-1; + for( ; n > 0; n-- ) + { + buf[n] = static_cast(0x80 + (value & 0x3F)); + value >>= 6; + } + + return length; +} + +// +// The function will decode an UTF8 character and return the unicode code point. +// outLength will receive the number of bytes that were decoded. +// +// This function is taken from the AngelCode ToolBox. +// +int asStringDecodeUTF8(const char *encodedBuffer, unsigned int *outLength) +{ + const unsigned char *buf = (const unsigned char*)encodedBuffer; + + int value = 0; + int length = -1; + unsigned char byte = buf[0]; + if( (byte & 0x80) == 0 ) + { + // This is the only byte + if( outLength ) *outLength = 1; + return byte; + } + else if( (byte & 0xE0) == 0xC0 ) + { + // There is one more byte + value = int(byte & 0x1F); + length = 2; + + // The value at this moment must not be less than 2, because + // that should have been encoded with one byte only. + if( value < 2 ) + length = -1; + } + else if( (byte & 0xF0) == 0xE0 ) + { + // There are two more bytes + value = int(byte & 0x0F); + length = 3; + } + else if( (byte & 0xF8) == 0xF0 ) + { + // There are three more bytes + value = int(byte & 0x07); + length = 4; + } + + int n = 1; + for( ; n < length; n++ ) + { + byte = buf[n]; + if( (byte & 0xC0) == 0x80 ) + value = (value << 6) + int(byte & 0x3F); + else + break; + } + + if( n == length ) + { + if( outLength ) *outLength = (unsigned)length; + return value; + } + + // The byte sequence isn't a valid UTF-8 byte sequence. + return -1; +} + +// +// The function will encode the unicode code point into the outEncodedBuffer, and then +// return the length of the encoded value. If the input value is not a valid unicode code +// point, then the function will return -1. +// +// This function is taken from the AngelCode ToolBox. +// +int asStringEncodeUTF16(unsigned int value, char *outEncodedBuffer) +{ + if( value < 0x10000 ) + { +#ifndef AS_BIG_ENDIAN + outEncodedBuffer[0] = (value & 0xFF); + outEncodedBuffer[1] = ((value >> 8) & 0xFF); +#else + outEncodedBuffer[1] = (value & 0xFF); + outEncodedBuffer[0] = ((value >> 8) & 0xFF); +#endif + return 2; + } + else + { + value -= 0x10000; + int surrogate1 = ((value >> 10) & 0x3FF) + 0xD800; + int surrogate2 = (value & 0x3FF) + 0xDC00; + +#ifndef AS_BIG_ENDIAN + outEncodedBuffer[0] = (surrogate1 & 0xFF); + outEncodedBuffer[1] = ((surrogate1 >> 8) & 0xFF); + outEncodedBuffer[2] = (surrogate2 & 0xFF); + outEncodedBuffer[3] = ((surrogate2 >> 8) & 0xFF); +#else + outEncodedBuffer[1] = (surrogate1 & 0xFF); + outEncodedBuffer[0] = ((surrogate1 >> 8) & 0xFF); + outEncodedBuffer[3] = (surrogate2 & 0xFF); + outEncodedBuffer[2] = ((surrogate2 >> 8) & 0xFF); +#endif + + return 4; + } +} + + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string_util.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string_util.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string_util.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_string_util.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +#ifndef AS_STRING_UTIL_H +#define AS_STRING_UTIL_H + +#include "as_config.h" + +BEGIN_AS_NAMESPACE + +double asStringScanDouble(const char *string, size_t *numScanned); +asQWORD asStringScanUInt64(const char *string, int base, size_t *numScanned); + +int asStringEncodeUTF8(unsigned int value, char *outEncodedBuffer); +int asStringDecodeUTF8(const char *encodedBuffer, unsigned int *outLength); + +int asStringEncodeUTF16(unsigned int value, char *outEncodedBuffer); + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_texts.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_texts.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_texts.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_texts.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,218 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_texts.h +// +// These are text strings used through out the library +// + + +#ifndef AS_TEXTS_H +#define AS_TEXTS_H + +// Compiler messages + +#define TXT_s_ALREADY_DECLARED "'%s' already declared" +#define TXT_ARG_NOT_LVALUE "Argument cannot be assigned. Output will be discarded." +#define TXT_ASSIGN_IN_GLOBAL_EXPR "Assignments are not allowed in global expressions" + +#define TXT_BOTH_MUST_BE_SAME "Both expressions must have the same type" +#define TXT_BOTH_CONDITIONS_MUST_CALL_CONSTRUCTOR "Both conditions must call constructor" + +#define TXT_CALLING_NONCONST_METHOD_ON_TEMP "A non-const method is called on temporary object. Changes to the object may be lost." +#define TXT_CANDIDATES_ARE "Candidates are:" +#define TXT_CANNOT_CALL_CONSTRUCTOR_IN_LOOPS "Can't call a constructor in loops" +#define TXT_CANNOT_CALL_CONSTRUCTOR_IN_SWITCH "Can't call a constructor in switch" +#define TXT_CANNOT_CALL_CONSTRUCTOR_TWICE "Can't call a constructor multiple times" +#define TXT_CANNOT_INHERIT_FROM_s "Can't inherit from '%s'" +#define TXT_CANNOT_INHERIT_FROM_MULTIPLE_CLASSES "Can't inherit from multiple classes" +#define TXT_CANNOT_INHERIT_FROM_SELF "Can't inherit from itself, or another class that inherits from this class" +#define TXT_CANNOT_INSTANCIATE_TEMPLATE_s_WITH_s "Can't instanciate template '%s' with subtype '%s'" +#define TXT_CANT_IMPLICITLY_CONVERT_s_TO_s "Can't implicitly convert from '%s' to '%s'." +#define TXT_CANT_RETURN_VALUE "Can't return value when return type is 'void'" +#define TXT_CHANGE_SIGN "Implicit conversion changed sign of value" +#define TXT_COMPILING_s "Compiling %s" +#define TXT_COMPOUND_ASGN_WITH_PROP "Compound assignments with property accessors are not allowed" +#define TXT_CONSTRUCTOR_NAME_ERROR "The constructor name must be the same as the class" + +#define TXT_DATA_TYPE_CANT_BE_s "Data type can't be '%s'" +#define TXT_DEFAULT_MUST_BE_LAST "The default case must be the last one" +#define TXT_DESTRUCTOR_MAY_NOT_HAVE_PARM "The destructor must not have any parameters" +#define TXT_DUPLICATE_SWITCH_CASE "Duplicate switch case" + +#define TXT_ELSE_WITH_EMPTY_STATEMENT "Else with empty statement" +#define TXT_EMPTY_SWITCH "Empty switch statement" +#define TXT_EXPECTED_s "Expected '%s'" +#define TXT_EXPECTED_CONSTANT "Expected constant" +#define TXT_EXPECTED_DATA_TYPE "Expected data type" +#define TXT_EXPECTED_EXPRESSION_VALUE "Expected expression value" +#define TXT_EXPECTED_IDENTIFIER "Expected identifier" +#define TXT_EXPECTED_METHOD_OR_PROPERTY "Expected method or property" +#define TXT_EXPECTED_ONE_OF "Expected one of: " +#define TXT_EXPECTED_OPERATOR "Expected operator" +#define TXT_EXPECTED_s_OR_s "Expected '%s' or '%s'" +#define TXT_EXPECTED_POST_OPERATOR "Expected post operator" +#define TXT_EXPECTED_PRE_OPERATOR "Expected pre operator" +#define TXT_EXPECTED_STRING "Expected string" +#define TXT_EXPR_MUST_BE_BOOL "Expression must be of boolean type" + +#define TXT_FOUND_MULTIPLE_ENUM_VALUES "Found multiple matching enum values" +#define TXT_FUNCTION_IN_GLOBAL_EXPR "Function calls are not allowed in global expressions" +#define TXT_FUNCTION_ALREADY_EXIST "A function with the same name and parameters already exist" +#define TXT_FUNCTION_s_NOT_FOUND "Function '%s' not found" + +#define TXT_GET_SET_ACCESSOR_TYPE_MISMATCH_FOR_s "The property '%s' has mismatching types for the get and set accessors" + +#define TXT_HANDLE_COMPARISON "The operand is implicitly converted to handle in order to compare them" + +#define TXT_IDENTIFIER_s_NOT_DATA_TYPE "Identifier '%s' is not a data type" +#define TXT_IF_WITH_EMPTY_STATEMENT "If with empty statement" +#define TXT_ILLEGAL_MEMBER_TYPE "Illegal member type" +// TODO: Should be TXT_ILLEGAL_OPERATION_ON_s +#define TXT_ILLEGAL_OPERATION "Illegal operation on this datatype" +#define TXT_ILLEGAL_OPERATION_ON_s "Illegal operation on '%s'" +#define TXT_ILLEGAL_TARGET_TYPE_FOR_REF_CAST "Illegal target type for reference cast" +#define TXT_ILLEGAL_VARIABLE_NAME_s "Illegal variable name '%s'." +#define TXT_INC_OP_IN_GLOBAL_EXPR "Incremental operators are not allowed in global expressions" +#define TXT_INIT_LIST_CANNOT_BE_USED_WITH_s "Initialization lists cannot be used with '%s'" +#define TXT_INTERFACE_s_ALREADY_IMPLEMENTED "The interface '%s' is already implemented" +#define TXT_INVALID_BREAK "Invalid 'break'" +#define TXT_INVALID_CHAR_LITERAL "Invalid character literal" +#define TXT_INVALID_CONTINUE "Invalid 'continue'" +#define TXT_INVALID_ESCAPE_SEQUENCE "Invalid escape sequence" +#define TXT_INVALID_SCOPE "Invalid scope resolution" +#define TXT_INVALID_TYPE "Invalid type" +#define TXT_INVALID_UNICODE_FORMAT_EXPECTED_d "Invalid unicode escape sequence, expected %d hex digits" +#define TXT_INVALID_UNICODE_VALUE "Invalid unicode code point" +#define TXT_INVALID_UNICODE_SEQUENCE_IN_SRC "Invalid unicode sequence in source" + +#define TXT_METHOD_IN_GLOBAL_EXPR "Object method calls are not allowed in global expressions" +#define TXT_MISSING_IMPLEMENTATION_OF_s "Missing implementation of '%s'" +#define TXT_MORE_THAN_ONE_MATCHING_OP "Found more than one matching operator" +#define TXT_MULTIPLE_MATCHING_SIGNATURES_TO_s "Multiple matching signatures to '%s'" +#define TXT_MULTIPLE_PROP_GET_ACCESSOR_FOR_s "Found multiple get accessors for property '%s'" +#define TXT_MULTIPLE_PROP_SET_ACCESSOR_FOR_s "Found multiple set accessors for property '%s'" +#define TXT_MULTILINE_STRINGS_NOT_ALLOWED "Multiline strings are not allowed in this application" +#define TXT_MUST_BE_OBJECT "Only objects have constructors" +#define TXT_MUST_RETURN_VALUE "Must return a value" + +#define TXT_NAME_CONFLICT_s_EXTENDED_TYPE "Name conflict. '%s' is an extended data type." +#define TXT_NAME_CONFLICT_s_GLOBAL_PROPERTY "Name conflict. '%s' is a global property." +#define TXT_NAME_CONFLICT_s_IS_NAMED_TYPE "Name conflict. '%s' is a named type." +#define TXT_NAME_CONFLICT_s_STRUCT "Name conflict. '%s' is a class." +#define TXT_NAME_CONFLICT_s_OBJ_PROPERTY "Name conflict. '%s' is an object property." +#define TXT_NO_APPROPRIATE_INDEX_OPERATOR "No appropriate indexing operator found" +#define TXT_NO_CONVERSION_s_TO_s "No conversion from '%s' to '%s' available." +#define TXT_NO_CONVERSION_s_TO_MATH_TYPE "No conversion from '%s' to math type available." +#define TXT_NO_DEFAULT_CONSTRUCTOR_FOR_s "No default constructor for object of type '%s'." +#define TXT_NO_DEFAULT_COPY_OP "There is no copy operator for this type available." +#define TXT_NO_MATCHING_SIGNATURES_TO_s "No matching signatures to '%s'" +#define TXT_NO_MATCHING_OP_FOUND_FOR_TYPE_s "No matching operator that takes the type '%s' found" +#define TXT_NO_MATCHING_OP_FOUND_FOR_TYPES_s_AND_s "No matching operator that takes the types '%s' and '%s' found" +#define TXT_NON_CONST_METHOD_ON_CONST_OBJ "Non-const method call on read-only object reference" +#define TXT_NOT_ALL_PATHS_RETURN "Not all paths return a value" +#define TXT_s_NOT_DECLARED "'%s' is not declared" +#define TXT_NOT_EXACT "Implicit conversion of value is not exact" +#define TXT_s_NOT_INITIALIZED "'%s' is not initialized." +#define TXT_s_NOT_MEMBER_OF_s "'%s' is not a member of '%s'" +#define TXT_NOT_VALID_REFERENCE "Not a valid reference" +#define TXT_NOT_VALID_LVALUE "Not a valid lvalue" + +#define TXT_OBJECT_DOESNT_SUPPORT_INDEX_OP "Type '%s' doesn't support the indexing operator" +#define TXT_OBJECT_HANDLE_NOT_SUPPORTED "Object handle is not supported for this type" +#define TXT_ONLY_OBJECTS_MAY_USE_REF_INOUT "Only object types that support object handles can use &inout. Use &in or &out instead" +#define TXT_ONLY_ONE_ARGUMENT_IN_CAST "A cast operator has one argument" +#define TXT_ONLY_ONE_FUNCTION_ALLOWED "The code must contain one and only one function" +#define TXT_ONLY_ONE_VARIABLE_ALLOWED "The code must contain one and only one global variable" + +#define TXT_PARAMETER_ALREADY_DECLARED "Parameter already declared" +#define TXT_PARAMETER_CANT_BE_s "Parameter type can't be '%s'" +#define TXT_POSSIBLE_LOSS_OF_PRECISION "Conversion from double to float, possible loss of precision" +#define TXT_PROPERTY_CANT_BE_CONST "Class properties cannot be declared as const" +#define TXT_PROPERTY_HAS_NO_GET_ACCESSOR "The property has no get accessor" +#define TXT_PROPERTY_HAS_NO_SET_ACCESSOR "The property has no set accessor" + +#define TXT_REF_IS_READ_ONLY "Reference is read-only" +#define TXT_REF_IS_TEMP "Reference is temporary" +#define TXT_RETURN_CANT_BE_s "Return type can't be '%s'" + +#define TXT_SCRIPT_FUNCTIONS_DOESNT_SUPPORT_RETURN_REF "Script functions must not return references" +#define TXT_SIGNED_UNSIGNED_MISMATCH "Signed/Unsigned mismatch" +#define TXT_STRINGS_NOT_RECOGNIZED "Strings are not recognized by the application" +#define TXT_SWITCH_CASE_MUST_BE_CONSTANT "Case expressions must be constants" +#define TXT_SWITCH_MUST_BE_INTEGRAL "Switch expressions must be integral numbers" + +#define TXT_TOO_MANY_ARRAY_DIMENSIONS "Too many array dimensions" +#define TXT_TYPE_s_NOT_AVAILABLE_FOR_MODULE "Type '%s' is not available for this module" + +#define TXT_UNEXPECTED_END_OF_FILE "Unexpected end of file" +#define TXT_UNEXPECTED_TOKEN_s "Unexpected token '%s'" +#define TXT_UNINITIALIZED_GLOBAL_VAR_s "Use of uninitialized global variable '%s'." +#define TXT_UNREACHABLE_CODE "Unreachable code" +#define TXT_UNUSED_SCRIPT_NODE "Unused script node" + +#define TXT_VALUE_TOO_LARGE_FOR_TYPE "Value is too large for data type" + +// Engine message + +#define TXT_INVALID_CONFIGURATION "Invalid configuration" +#define TXT_VALUE_TYPE_MUST_HAVE_SIZE "A value type must be registered with a non-zero size" +#define TXT_TYPE_s_IS_MISSING_BEHAVIOURS "Type '%s' is missing behaviours" +#define TXT_ILLEGAL_BEHAVIOUR_FOR_TYPE "The behaviour is not compatible with the type" +#define TXT_GC_REQUIRE_ADD_REL_GC_BEHAVIOUR "A garbage collected type must have the addref, release, and all gc behaviours" +#define TXT_SCOPE_REQUIRE_REL_BEHAVIOUR "A scoped reference type must have the release behaviour" +#define TXT_REF_REQUIRE_ADD_REL_BEHAVIOUR "A reference type must have the addref and release behaviours" +#define TXT_NON_POD_REQUIRE_CONSTR_DESTR_BEHAVIOUR "A non-pod value type must have the constructor and destructor behaviours" +#define TXT_CANNOT_PASS_TYPE_s_BY_VAL "Can't pass type '%s' by value unless the application type is informed in the registration" +#define TXT_CANNOT_RET_TYPE_s_BY_VAL "Can't return type '%s' by value unless the application type is informed in the registration" + +// Internal names + +#ifdef AS_DEPRECATED +// Deprecated since 2.18.0, 2009-12-08 +#define TXT_EXECUTESTRING "ExecuteString" +#endif +#define TXT_PROPERTY "Property" +#define TXT_SYSTEM_FUNCTION "System function" +#define TXT_VARIABLE_DECL "Variable declaration" + +// Exceptions + +#define TXT_STACK_OVERFLOW "Stack overflow" +#define TXT_NULL_POINTER_ACCESS "Null pointer access" +#define TXT_DIVIDE_BY_ZERO "Divide by zero" +#define TXT_UNRECOGNIZED_BYTE_CODE "Unrecognized byte code" +#define TXT_INVALID_CALLING_CONVENTION "Invalid calling convention" +#define TXT_UNBOUND_FUNCTION "Unbound function called" +#define TXT_OUT_OF_BOUNDS "Out of range" + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_thread.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_thread.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_thread.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_thread.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,270 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2008 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + + +// +// as_thread.cpp +// +// Functions for multi threading support +// + +#include "as_config.h" +#include "as_thread.h" +#include "as_atomic.h" + +BEGIN_AS_NAMESPACE + +// Singleton +asCThreadManager *threadManager = 0; + +//====================================================================== + +extern "C" +{ + +AS_API int asThreadCleanup() +{ + // As this function can be called globally, + // we can't assume the threadManager exists + if( threadManager ) + return threadManager->CleanupLocalData(); + + return 0; +} + +} + +//====================================================================== + +asCThreadManager::asCThreadManager() +{ +#ifdef AS_NO_THREADS + tld = 0; +#endif + refCount.set(1); +} + +void asCThreadManager::AddRef() +{ + refCount.atomicInc(); +} + +void asCThreadManager::Release() +{ + if( refCount.atomicDec() == 0 ) + { + // The last engine has been destroyed, so we + // need to delete the thread manager as well + asDELETE(this,asCThreadManager); + threadManager = 0; + } +} + +asCThreadManager::~asCThreadManager() +{ +#ifndef AS_NO_THREADS + ENTERCRITICALSECTION(criticalSection); + + // Delete all thread local datas + asSMapNode *cursor = 0; + if( tldMap.MoveFirst(&cursor) ) + { + do + { + if( tldMap.GetValue(cursor) ) + { + asDELETE(tldMap.GetValue(cursor),asCThreadLocalData); + } + } while( tldMap.MoveNext(&cursor, cursor) ); + } + + LEAVECRITICALSECTION(criticalSection); +#else + if( tld ) + { + asDELETE(tld,asCThreadLocalData); + } + tld = 0; +#endif +} + +int asCThreadManager::CleanupLocalData() +{ +#ifndef AS_NO_THREADS + int r = 0; +#if defined AS_POSIX_THREADS + asDWORD id = (asDWORD)pthread_self(); +#elif defined AS_WINDOWS_THREADS + asDWORD id = GetCurrentThreadId(); +#endif + + ENTERCRITICALSECTION(criticalSection); + + asSMapNode *cursor = 0; + if( tldMap.MoveTo(&cursor, id) ) + { + asCThreadLocalData *tld = tldMap.GetValue(cursor); + + // Can we really remove it at this time? + if( tld->activeContexts.GetLength() == 0 ) + { + asDELETE(tld,asCThreadLocalData); + tldMap.Erase(cursor); + r = 0; + } + else + r = asCONTEXT_ACTIVE; + } + + LEAVECRITICALSECTION(criticalSection); + + return r; +#else + if( tld ) + { + if( tld->activeContexts.GetLength() == 0 ) + { + asDELETE(tld,asCThreadLocalData); + tld = 0; + } + else + return asCONTEXT_ACTIVE; + } + return 0; +#endif +} + +#ifndef AS_NO_THREADS +asCThreadLocalData *asCThreadManager::GetLocalData(asDWORD threadId) +{ + asCThreadLocalData *tld = 0; + + ENTERCRITICALSECTION(criticalSection); + + asSMapNode *cursor = 0; + if( tldMap.MoveTo(&cursor, threadId) ) + tld = tldMap.GetValue(cursor); + + LEAVECRITICALSECTION(criticalSection); + + return tld; +} + +void asCThreadManager::SetLocalData(asDWORD threadId, asCThreadLocalData *tld) +{ + ENTERCRITICALSECTION(criticalSection); + + tldMap.Insert(threadId, tld); + + LEAVECRITICALSECTION(criticalSection); +} +#endif + +asCThreadLocalData *asCThreadManager::GetLocalData() +{ +#ifndef AS_NO_THREADS +#if defined AS_POSIX_THREADS + asDWORD id = (asDWORD)pthread_self(); +#elif defined AS_WINDOWS_THREADS + asDWORD id = GetCurrentThreadId(); +#endif + + asCThreadLocalData *tld = GetLocalData(id); + if( tld == 0 ) + { + // Create a new tld + tld = asNEW(asCThreadLocalData)(); + SetLocalData(id, tld); + } + + return tld; +#else + if( tld == 0 ) + tld = asNEW(asCThreadLocalData)(); + + return tld; +#endif +} + +//========================================================================= + +asCThreadLocalData::asCThreadLocalData() +{ +} + +asCThreadLocalData::~asCThreadLocalData() +{ +} + +//========================================================================= + +#ifndef AS_NO_THREADS +asCThreadCriticalSection::asCThreadCriticalSection() +{ +#if defined AS_POSIX_THREADS + pthread_mutex_init(&criticalSection, 0); +#elif defined AS_WINDOWS_THREADS + InitializeCriticalSection(&criticalSection); +#endif +} + +asCThreadCriticalSection::~asCThreadCriticalSection() +{ +#if defined AS_POSIX_THREADS + pthread_mutex_destroy(&criticalSection); +#elif defined AS_WINDOWS_THREADS + DeleteCriticalSection(&criticalSection); +#endif +} + +void asCThreadCriticalSection::Enter() +{ +#if defined AS_POSIX_THREADS + pthread_mutex_lock(&criticalSection); +#elif defined AS_WINDOWS_THREADS + EnterCriticalSection(&criticalSection); +#endif +} + +void asCThreadCriticalSection::Leave() +{ +#if defined AS_POSIX_THREADS + pthread_mutex_unlock(&criticalSection); +#elif defined AS_WINDOWS_THREADS + LeaveCriticalSection(&criticalSection); +#endif +} +#endif + +//======================================================================== + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_thread.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_thread.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_thread.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_thread.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,100 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2008 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + + +// +// as_thread.h +// +// Classes for multi threading support +// + +#ifndef AS_THREAD_H +#define AS_THREAD_H + +#include "as_config.h" +#include "as_string.h" +#include "as_array.h" +#include "as_map.h" +#include "as_atomic.h" +#include "as_criticalsection.h" + +BEGIN_AS_NAMESPACE + +class asCThreadLocalData; + +class asCThreadManager +{ +public: + asCThreadManager(); + + asCThreadLocalData *GetLocalData(); + int CleanupLocalData(); + + void AddRef(); + void Release(); + +protected: + ~asCThreadManager(); + asCAtomic refCount; + +#ifndef AS_NO_THREADS + asCThreadLocalData *GetLocalData(asDWORD threadId); + void SetLocalData(asDWORD threadId, asCThreadLocalData *tld); + + asCMap tldMap; + DECLARECRITICALSECTION(criticalSection); +#else + asCThreadLocalData *tld; +#endif +}; + +extern asCThreadManager *threadManager; + +//====================================================================== + +class asIScriptContext; + +class asCThreadLocalData +{ +public: + asCArray activeContexts; + asCString string; + +protected: + friend class asCThreadManager; + + asCThreadLocalData(); + ~asCThreadLocalData(); +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokendef.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokendef.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokendef.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokendef.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,290 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_tokendef.h +// +// Definitions for tokens identifiable by the tokenizer +// + + +#ifndef AS_TOKENDEF_H +#define AS_TOKENDEF_H + +#include "as_config.h" + +BEGIN_AS_NAMESPACE + +enum eTokenType +{ + ttUnrecognizedToken, + + ttEnd, // End of file + + // White space and comments + ttWhiteSpace, // ' ', '\t', '\r', '\n', UTF8 byte-order-mark + ttOnelineComment, // // \n + ttMultilineComment, // /* */ + + // Atoms + ttIdentifier, // abc123 + ttIntConstant, // 1234 + ttFloatConstant, // 12.34e56f + ttDoubleConstant, // 12.34e56 + ttStringConstant, // "123" + ttMultilineStringConstant, // + ttHeredocStringConstant, // """text""" + ttNonTerminatedStringConstant, // "123 + ttBitsConstant, // 0xFFFF + + // Math operators + ttPlus, // + + ttMinus, // - + ttStar, // * + ttSlash, // / + ttPercent, // % + + ttHandle, // @ + + ttAddAssign, // += + ttSubAssign, // -= + ttMulAssign, // *= + ttDivAssign, // /= + ttModAssign, // %= + + ttOrAssign, // |= + ttAndAssign, // &= + ttXorAssign, // ^= + ttShiftLeftAssign, // <<= + ttShiftRightLAssign, // >>= + ttShiftRightAAssign, // >>>= + + ttInc, // ++ + ttDec, // -- + + ttDot, // . + ttScope, // :: + + // Statement tokens + ttAssignment, // = + ttEndStatement, // ; + ttListSeparator, // , + ttStartStatementBlock, // { + ttEndStatementBlock, // } + ttOpenParanthesis, // ( + ttCloseParanthesis, // ) + ttOpenBracket, // [ + ttCloseBracket, // ] + ttAmp, // & + + // Bitwise operators + ttBitOr, // | + ttBitNot, // ~ + ttBitXor, // ^ + ttBitShiftLeft, // << + ttBitShiftRight, // >> + ttBitShiftRightArith, // >>> + + // Compare operators + ttEqual, // == + ttNotEqual, // != + ttLessThan, // < + ttGreaterThan, // > + ttLessThanOrEqual, // <= + ttGreaterThanOrEqual, // >= + + ttQuestion, // ? + ttColon, // : + + // Reserved keywords + ttIf, // if + ttElse, // else + ttFor, // for + ttWhile, // while + ttBool, // bool + ttImport, // import + ttInt, // int + ttInt8, // int8 + ttInt16, // int16 + ttInt64, // int64 + ttInterface, // interface + ttIs, // is + ttNotIs, // !is + ttUInt, // uint + ttUInt8, // uint8 + ttUInt16, // uint16 + ttUInt64, // uint64 + ttFloat, // float + ttVoid, // void + ttTrue, // true + ttFalse, // false + ttReturn, // return + ttNot, // not + ttAnd, // and + ttOr, // or + ttXor, // xor + ttBreak, // break + ttContinue, // continue + ttConst, // const + ttDo, // do + ttDouble, // double + ttSwitch, // switch + ttCase, // case + ttDefault, // default + ttIn, // in + ttOut, // out + ttInOut, // inout + ttNull, // null + ttClass, // class + ttTypedef, // typedef + ttEnum, // enum + ttCast // cast +}; + +struct sTokenWord +{ + const char *word; + eTokenType tokenType; +}; + +sTokenWord const tokenWords[] = +{ + {"+" , ttPlus}, + {"-" , ttMinus}, + {"*" , ttStar}, + {"/" , ttSlash}, + {"%" , ttPercent}, + {"=" , ttAssignment}, + {"." , ttDot}, + {"+=" , ttAddAssign}, + {"-=" , ttSubAssign}, + {"*=" , ttMulAssign}, + {"/=" , ttDivAssign}, + {"%=" , ttModAssign}, + {"|=" , ttOrAssign}, + {"&=" , ttAndAssign}, + {"^=" , ttXorAssign}, + {"<<=" , ttShiftLeftAssign}, + {">>=" , ttShiftRightLAssign}, + {">>>=" , ttShiftRightAAssign}, + {"|" , ttBitOr}, + {"~" , ttBitNot}, + {"^" , ttBitXor}, + {"<<" , ttBitShiftLeft}, + {">>" , ttBitShiftRight}, + {">>>" , ttBitShiftRightArith}, + {";" , ttEndStatement}, + {"," , ttListSeparator}, + {"{" , ttStartStatementBlock}, + {"}" , ttEndStatementBlock}, + {"(" , ttOpenParanthesis}, + {")" , ttCloseParanthesis}, + {"[" , ttOpenBracket}, + {"]" , ttCloseBracket}, + {"?" , ttQuestion}, + {":" , ttColon}, + {"::" , ttScope}, + {"==" , ttEqual}, + {"!=" , ttNotEqual}, + {"<" , ttLessThan}, + {">" , ttGreaterThan}, + {"<=" , ttLessThanOrEqual}, + {">=" , ttGreaterThanOrEqual}, + {"++" , ttInc}, + {"--" , ttDec}, + {"&" , ttAmp}, + {"!" , ttNot}, + {"||" , ttOr}, + {"&&" , ttAnd}, + {"^^" , ttXor}, + {"@" , ttHandle}, + {"and" , ttAnd}, + {"bool" , ttBool}, + {"break" , ttBreak}, + {"cast" , ttCast}, + {"const" , ttConst}, + {"continue" , ttContinue}, + {"do" , ttDo}, +#ifdef AS_USE_DOUBLE_AS_FLOAT + {"double" , ttFloat}, +#else + {"double" , ttDouble}, +#endif + {"else" , ttElse}, + {"false" , ttFalse}, + {"float" , ttFloat}, + {"for" , ttFor}, + {"if" , ttIf}, + {"in" , ttIn}, + {"inout" , ttInOut}, + {"import" , ttImport}, + {"int" , ttInt}, + {"int8" , ttInt8}, + {"int16" , ttInt16}, + {"int32" , ttInt}, + {"int64" , ttInt64}, + {"interface" , ttInterface}, + {"is" , ttIs}, + {"!is" , ttNotIs}, + {"not" , ttNot}, + {"null" , ttNull}, + {"or" , ttOr}, + {"out" , ttOut}, + {"return" , ttReturn}, + {"true" , ttTrue}, + {"void" , ttVoid}, + {"while" , ttWhile}, + {"uint" , ttUInt}, + {"uint8" , ttUInt8}, + {"uint16" , ttUInt16}, + {"uint32" , ttUInt}, + {"uint64" , ttUInt64}, + {"switch" , ttSwitch}, + {"class" , ttClass}, + {"case" , ttCase}, + {"default" , ttDefault}, + {"xor" , ttXor}, + {"typedef" , ttTypedef}, + {"enum" , ttEnum}, +}; + +const unsigned int numTokenWords = sizeof(tokenWords)/sizeof(sTokenWord); + +const char * const whiteSpace = " \t\r\n"; + +// Some keywords that are not considered tokens by the parser +const char * const THIS_TOKEN = "this"; +const char * const FROM_TOKEN = "from"; +const char * const SUPER_TOKEN = "super"; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokenizer.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokenizer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokenizer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokenizer.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,463 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_tokenizer.cpp +// +// This class identifies tokens from the script code +// + +#include "as_config.h" +#include "as_tokenizer.h" +#include "as_tokendef.h" + +#if !defined(AS_NO_MEMORY_H) +#include +#endif +#include // strcmp() + +BEGIN_AS_NAMESPACE + +asCTokenizer::asCTokenizer() +{ +} + +asCTokenizer::~asCTokenizer() +{ +} + +const char *asGetTokenDefinition(int tokenType) +{ + if( tokenType == ttUnrecognizedToken ) return ""; + if( tokenType == ttEnd ) return ""; + if( tokenType == ttWhiteSpace ) return ""; + if( tokenType == ttOnelineComment ) return ""; + if( tokenType == ttMultilineComment ) return ""; + if( tokenType == ttIdentifier ) return ""; + if( tokenType == ttIntConstant ) return ""; + if( tokenType == ttFloatConstant ) return ""; + if( tokenType == ttDoubleConstant ) return ""; + if( tokenType == ttStringConstant ) return ""; + if( tokenType == ttMultilineStringConstant ) return ""; + if( tokenType == ttNonTerminatedStringConstant ) return ""; + if( tokenType == ttBitsConstant ) return ""; + if( tokenType == ttHeredocStringConstant ) return ""; + + for( asUINT n = 0; n < numTokenWords; n++ ) + if( tokenWords[n].tokenType == tokenType ) + return tokenWords[n].word; + + return 0; +} + +eTokenType asCTokenizer::GetToken(const char *source, size_t sourceLength, size_t *tokenLength, asETokenClass *tc) +{ + asASSERT(source != 0); + asASSERT(tokenLength != 0); + + this->source = source; + this->sourceLength = sourceLength; + + asETokenClass t = ParseToken(); + if( tc ) *tc = t; + + // Copy the output to the token + *tokenLength = this->tokenLength; + + return tokenType; +} + +asETokenClass asCTokenizer::ParseToken() +{ + if( IsWhiteSpace() ) return asTC_WHITESPACE; + if( IsComment() ) return asTC_COMMENT; + if( IsConstant() ) return asTC_VALUE; + if( IsIdentifier() ) return asTC_IDENTIFIER; + if( IsKeyWord() ) return asTC_KEYWORD; + + // If none of the above this is an unrecognized token + // We can find the length of the token by advancing + // one step and trying to identify a token there + tokenType = ttUnrecognizedToken; + tokenLength = 1; + + return asTC_UNKNOWN; +} + +bool asCTokenizer::IsWhiteSpace() +{ + // Treat UTF8 byte-order-mark (EF BB BF) as whitespace + if( sourceLength >= 3 && + asBYTE(source[0]) == 0xEFu && + asBYTE(source[1]) == 0xBBu && + asBYTE(source[2]) == 0xBFu ) + { + tokenType = ttWhiteSpace; + tokenLength = 3; + return true; + } + + // Group all other white space characters into one + size_t n; + int numWsChars = (int)strlen(whiteSpace); + for( n = 0; n < sourceLength; n++ ) + { + bool isWhiteSpace = false; + for( int w = 0; w < numWsChars; w++ ) + { + if( source[n] == whiteSpace[w] ) + { + isWhiteSpace = true; + break; + } + } + if( !isWhiteSpace ) break; + } + + if( n > 0 ) + { + tokenType = ttWhiteSpace; + tokenLength = n; + return true; + } + + return false; +} + +bool asCTokenizer::IsComment() +{ + if( sourceLength < 2 ) + return false; + + if( source[0] != '/' ) + return false; + + if( source[1] == '/' ) + { + // One-line comment + + // Find the length + size_t n; + for( n = 2; n < sourceLength; n++ ) + { + if( source[n] == '\n' ) + break; + } + + tokenType = ttOnelineComment; + tokenLength = n+1; + + return true; + } + + if( source[1] == '*' ) + { + // Multi-line comment + + // Find the length + size_t n; + for( n = 2; n < sourceLength-1; ) + { + if( source[n++] == '*' && source[n] == '/' ) + break; + } + + tokenType = ttMultilineComment; + tokenLength = n+1; + + return true; + } + + return false; +} + +bool asCTokenizer::IsConstant() +{ + // Starting with number + if( source[0] >= '0' && source[0] <= '9' ) + { + // Is it a hexadecimal number? + if( source[0] == '0' && sourceLength >= 1 && (source[1] == 'x' || source[1] == 'X') ) + { + size_t n; + for( n = 2; n < sourceLength; n++ ) + { + if( !(source[n] >= '0' && source[n] <= '9') && + !(source[n] >= 'a' && source[n] <= 'f') && + !(source[n] >= 'A' && source[n] <= 'F') ) + break; + } + + tokenType = ttBitsConstant; + tokenLength = n; + return true; + } + + size_t n; + for( n = 1; n < sourceLength; n++ ) + { + if( source[n] < '0' || source[n] > '9' ) + break; + } + + if( n < sourceLength && source[n] == '.' ) + { + n++; + for( ; n < sourceLength; n++ ) + { + if( source[n] < '0' || source[n] > '9' ) + break; + } + + if( n < sourceLength && (source[n] == 'e' || source[n] == 'E') ) + { + n++; + if( n < sourceLength && (source[n] == '-' || source[n] == '+') ) + n++; + + for( ; n < sourceLength; n++ ) + { + if( source[n] < '0' || source[n] > '9' ) + break; + } + } + + if( n < sourceLength && (source[n] == 'f' || source[n] == 'F') ) + { + tokenType = ttFloatConstant; + tokenLength = n + 1; + } + else + { +#ifdef AS_USE_DOUBLE_AS_FLOAT + tokenType = ttFloatConstant; +#else + tokenType = ttDoubleConstant; +#endif + tokenLength = n; + } + return true; + } + + tokenType = ttIntConstant; + tokenLength = n; + return true; + } + + // String constant between double or single quotes + if( source[0] == '"' || source[0] == '\'' ) + { + // Is it a normal string constant or a heredoc string constant? + if( sourceLength >= 6 && source[0] == '"' && source[1] == '"' && source[2] == '"' ) + { + // Heredoc string constant (spans multiple lines, no escape sequences) + + // Find the length + size_t n; + for( n = 3; n < sourceLength-2; n++ ) + { + if( source[n] == '"' && source[n+1] == '"' && source[n+2] == '"' ) + break; + } + + tokenType = ttHeredocStringConstant; + tokenLength = n+3; + } + else + { + // Normal string constant + tokenType = ttStringConstant; + char quote = source[0]; + bool evenSlashes = true; + size_t n; + for( n = 1; n < sourceLength; n++ ) + { +#ifdef AS_DOUBLEBYTE_CHARSET + // Double-byte characters are only allowed for ASCII + if( (source[n] & 0x80) && engine->ep.scanner == 0 ) + { + // This is a leading character in a double byte character, + // include both in the string and continue processing. + n++; + continue; + } +#endif + + if( source[n] == '\n' ) + tokenType = ttMultilineStringConstant; + if( source[n] == quote && evenSlashes ) + { + tokenLength = n+1; + return true; + } + if( source[n] == '\\' ) evenSlashes = !evenSlashes; else evenSlashes = true; + } + + tokenType = ttNonTerminatedStringConstant; + tokenLength = n; + } + + return true; + } + + return false; +} + +bool asCTokenizer::IsIdentifier() +{ + // Starting with letter or underscore + if( (source[0] >= 'a' && source[0] <= 'z') || + (source[0] >= 'A' && source[0] <= 'Z') || + source[0] == '_' ) + { + tokenType = ttIdentifier; + tokenLength = 1; + + for( size_t n = 1; n < sourceLength; n++ ) + { + if( (source[n] >= 'a' && source[n] <= 'z') || + (source[n] >= 'A' && source[n] <= 'Z') || + (source[n] >= '0' && source[n] <= '9') || + source[n] == '_' ) + tokenLength++; + else + break; + } + + // Make sure the identifier isn't a reserved keyword + if( tokenLength > 50 ) return true; + + char test[51]; + memcpy(test, source, tokenLength); + test[tokenLength] = 0; + + for( asUINT i = 0; i < numTokenWords; i++ ) + { + if( strcmp(test, tokenWords[i].word) == 0 ) + return false; + } + + return true; + } + + return false; +} + +bool asCTokenizer::IsKeyWord() +{ + // Fill the list with all possible keywords + // Check each character against all the keywords in the list, + // remove keywords that don't match. When only one remains and + // it matches the source completely we have found a match. + int words[numTokenWords]; + asUINT n; + for( n = 0; n < numTokenWords; n++ ) + words[n] = n; + + int numWords = numTokenWords; + int lastPossible = -1; + + n = 0; + while( n < sourceLength && numWords >= 0 ) + { + for( int i = 0; i < numWords; i++ ) + { + if( tokenWords[words[i]].word[n] == '\0' ) + { + // tokens that end with a character that can be part of an + // identifier require an extra verification to guarantee that + // we don't split an identifier token, e.g. the "!is" token + // and the "!isTrue" expression. + if( ((tokenWords[words[i]].word[n-1] >= 'a' && tokenWords[words[i]].word[n-1] <= 'z') || + (tokenWords[words[i]].word[n-1] >= 'A' && tokenWords[words[i]].word[n-1] <= 'Z')) && + ((source[n] >= 'a' && source[n] <= 'z') || + (source[n] >= 'A' && source[n] <= 'Z') || + (source[n] >= '0' && source[n] <= '9') || + (source[n] == '_')) ) + { + // The token doesn't really match, even though + // the start of the source matches the token + words[i--] = words[--numWords]; + } + else if( numWords > 1 ) + { + // It's possible that a longer token matches, so let's + // remember this match and continue searching + lastPossible = words[i]; + words[i--] = words[--numWords]; + continue; + } + else + { + // Only one token matches, so we return it + tokenType = tokenWords[words[i]].tokenType; + tokenLength = n; + return true; + } + } + else if( tokenWords[words[i]].word[n] != source[n] ) + { + // The token doesn't match + words[i--] = words[--numWords]; + } + } + n++; + } + + // The source length ended or there where no more matchable words + if( numWords ) + { + // If any of the tokenWords also end at this + // position then we have found the matching token + for( int i = 0; i < numWords; i++ ) + { + if( tokenWords[words[i]].word[n] == '\0' ) + { + tokenType = tokenWords[words[i]].tokenType; + tokenLength = n; + return true; + } + } + } + + // It is still possible that a shorter token was found + if( lastPossible > -1 ) + { + tokenType = tokenWords[lastPossible].tokenType; + tokenLength = strlen(tokenWords[lastPossible].word); + return true; + } + + return false; +} + +END_AS_NAMESPACE + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokenizer.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokenizer.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokenizer.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_tokenizer.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,75 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2008 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_tokenizer.cpp +// +// This class identifies tokens from the script code +// + + + +#ifndef AS_TOKENIZER_H +#define AS_TOKENIZER_H + +#include "as_tokendef.h" + +BEGIN_AS_NAMESPACE + +const char *asGetTokenDefinition(int tokenType); + +class asCTokenizer +{ +public: + asCTokenizer(); + ~asCTokenizer(); + + eTokenType GetToken(const char *source, size_t sourceLength, size_t *tokenLength, asETokenClass *tc = 0); + +protected: + asETokenClass ParseToken(); + bool IsWhiteSpace(); + bool IsComment(); + bool IsConstant(); + bool IsKeyWord(); + bool IsIdentifier(); + + const char *source; + size_t sourceLength; + + eTokenType tokenType; + size_t tokenLength; +}; + +END_AS_NAMESPACE + +#endif + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_typeinfo.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_typeinfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_typeinfo.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_typeinfo.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,135 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2007 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_typeinfo.cpp +// +// This class holds extra type info for the compiler +// + +#include "as_config.h" +#include "as_typeinfo.h" + +BEGIN_AS_NAMESPACE + +asCTypeInfo::asCTypeInfo() +{ + isTemporary = false; + stackOffset = 0; + isConstant = false; + isVariable = false; + isExplicitHandle = false; + qwordValue = 0; +} + +void asCTypeInfo::Set(const asCDataType &dt) +{ + dataType = dt; + + isTemporary = false; + stackOffset = 0; + isConstant = false; + isVariable = false; + isExplicitHandle = false; + qwordValue = 0; +} + +void asCTypeInfo::SetVariable(const asCDataType &dt, int stackOffset, bool isTemporary) +{ + Set(dt); + + this->isVariable = true; + this->isTemporary = isTemporary; + this->stackOffset = (short)stackOffset; +} + +void asCTypeInfo::SetConstantQW(const asCDataType &dt, asQWORD value) +{ + Set(dt); + + isConstant = true; + qwordValue = value; +} + +void asCTypeInfo::SetConstantDW(const asCDataType &dt, asDWORD value) +{ + Set(dt); + + isConstant = true; + dwordValue = value; +} + +void asCTypeInfo::SetConstantB(const asCDataType &dt, asBYTE value) +{ + Set(dt); + + isConstant = true; + byteValue = value; +} + +void asCTypeInfo::SetConstantF(const asCDataType &dt, float value) +{ + Set(dt); + + isConstant = true; + floatValue = value; +} + +void asCTypeInfo::SetConstantD(const asCDataType &dt, double value) +{ + Set(dt); + + isConstant = true; + doubleValue = value; +} + +void asCTypeInfo::SetNullConstant() +{ + Set(asCDataType::CreateNullHandle()); + isConstant = true; + isExplicitHandle = true; + qwordValue = 0; +} + +void asCTypeInfo::SetDummy() +{ + SetConstantQW(asCDataType::CreatePrimitive(ttInt, true), 0); +} + +bool asCTypeInfo::IsNullConstant() +{ + if( isConstant && dataType.IsObjectHandle() ) + return true; + + return false; +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_typeinfo.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_typeinfo.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_typeinfo.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_typeinfo.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,85 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2007 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_typeinfo.h +// +// This class holds extra type info for the compiler +// + + + +#ifndef AS_TYPEINFO_H +#define AS_TYPEINFO_H + +#include "as_config.h" +#include "as_datatype.h" + +BEGIN_AS_NAMESPACE + +struct asCTypeInfo +{ + asCTypeInfo(); + void Set(const asCDataType &dataType); + + void SetVariable(const asCDataType &dataType, int stackOffset, bool isTemporary); + void SetConstantB(const asCDataType &dataType, asBYTE value); + void SetConstantQW(const asCDataType &dataType, asQWORD value); + void SetConstantDW(const asCDataType &dataType, asDWORD value); + void SetConstantF(const asCDataType &dataType, float value); + void SetConstantD(const asCDataType &dataType, double value); + void SetNullConstant(); + void SetDummy(); + + bool IsNullConstant(); + + asCDataType dataType; + bool isTemporary : 1; + bool isConstant : 1; + bool isVariable : 1; + bool isExplicitHandle : 1; + short dummy : 12; + short stackOffset; + union + { + asQWORD qwordValue; + double doubleValue; + asDWORD dwordValue; + float floatValue; + int intValue; + asWORD wordValue; + asBYTE byteValue; + }; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_variablescope.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_variablescope.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_variablescope.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_variablescope.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,129 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2007 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_variablescope.cpp +// +// A manager class for variable declarations +// + + +#include "as_config.h" +#include "as_variablescope.h" + +BEGIN_AS_NAMESPACE + +asCVariableScope::asCVariableScope(asCVariableScope *parent) +{ + this->parent = parent; + Reset(); +} + +asCVariableScope::~asCVariableScope() +{ + Reset(); +} + +void asCVariableScope::Reset() +{ + isBreakScope = false; + isContinueScope = false; + + for( asUINT n = 0; n < variables.GetLength(); n++ ) + if( variables[n] ) + { + asDELETE(variables[n],sVariable); + } + variables.SetLength(0); +} + +int asCVariableScope::DeclareVariable(const char *name, const asCDataType &type, int stackOffset) +{ + // TODO: optimize: Improve linear search + // See if the variable is already declared + if( strcmp(name, "") != 0 ) + { + for( asUINT n = 0; n < variables.GetLength(); n++ ) + { + if( variables[n]->name == name ) + return -1; + } + } + + sVariable *var = asNEW(sVariable); + var->name = name; + var->type = type; + var->stackOffset = stackOffset; + var->isInitialized = false; + var->isPureConstant = false; + + // Parameters are initialized + if( stackOffset <= 0 ) + var->isInitialized = true; + + variables.PushLast(var); + + return 0; +} + +sVariable *asCVariableScope::GetVariable(const char *name) +{ + // TODO: optimize: Improve linear search + // Find the variable + for( asUINT n = 0; n < variables.GetLength(); n++ ) + { + if( variables[n]->name == name ) + return variables[n]; + } + + if( parent ) + return parent->GetVariable(name); + + return 0; +} + +sVariable *asCVariableScope::GetVariableByOffset(int offset) +{ + // TODO: optimize: Improve linear search + // Find the variable + for( asUINT n = 0; n < variables.GetLength(); n++ ) + { + if( variables[n]->stackOffset == offset ) + return variables[n]; + } + + if( parent ) + return parent->GetVariableByOffset(offset); + + return 0; +} + +END_AS_NAMESPACE diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_variablescope.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_variablescope.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_variablescope.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/angelscript/source/as_variablescope.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,80 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2007 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// as_variablescope.h +// +// A manager class for variable declarations +// + + +#ifndef AS_VARIABLESCOPE_H +#define AS_VARIABLESCOPE_H + +#include "as_array.h" +#include "as_string.h" +#include "as_datatype.h" + +BEGIN_AS_NAMESPACE + +struct sVariable +{ + asCString name; + asCDataType type; + int stackOffset; + bool isInitialized; + bool isPureConstant; + asQWORD constantValue; +}; + +class asCVariableScope +{ +public: + asCVariableScope(asCVariableScope *parent); + ~asCVariableScope(); + + void Reset(); + + int DeclareVariable(const char *name, const asCDataType &type, int stackOffset); + sVariable *GetVariable(const char *name); + sVariable *GetVariableByOffset(int offset); + + asCVariableScope *parent; + + bool isBreakScope; + bool isContinueScope; + + asCArray variables; +}; + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes0.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes0.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes0.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes0.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,206 @@ + + +AngelScript - Changes + + + + + + + +

AngelScript Change Log

+ +

Version 0.95 - 2003/06/17

+ +
    +
  • Fixed bug in constant declaration +
  • Improved byte code for string manipulation +
  • Added data type: bits +
  • new operators: ~ | & ^ << >> >>> |= &= ^= <<= >>= >>>= +
  • added bits constants: 0xFFA +
  • Fixed a bug in the call stack +
+ +

Version 0.85 - 2003/06/04

+ +
    +
  • stack positions are re-used when variables goes out of scope +
  • bstr is now copied instead of reference counted +
  • concatenation operators for bstr: + += +
  • comparison operators for bstr: == != < > <= >= +
  • If script is aborted or an exception occurs the engine cleans up the stack +
  • Engine now executes until finished or until aborted +
  • Arguments can now be sent by reference instead of by value +
+ +

Version 0.7 - 2003/05/28

+ +
    +
  • Added ?: operator +
  • Added compound assignments: += -= *= /= %= +
  • New data type: bstr (byte string) +
  • Added support for string constants +
  • Character sequences: \n \r \0 \\ \" \x00 +
+ +

Version 0.55 - 2003/05/19

+ +
    +
  • removed include from AngelScript +
  • AngelScript no longer loads the scriptcode from disk +
  • the host application can add several pieces of code that will be compiled as one +
+ +

Version 0.5 - 2003/05/15

+ +
    +
  • declaration of global constants through directive: const +
  • added do-while statement +
  • fixed bug in AngelScript +
+ +

Version 0.4 - 2003/05/09

+ +
    +
  • AngelScript now allows for application defined datatypes +
  • fixed potential bug in AngelScript +
+ +

Version 0.3 - 2003/04/23

+ +
    +
  • Modulo operator % +
  • minor changes in the virtual machine +
  • fixed bug in compiler +
+ +

Version 0.25 - 2003/04/15

+ +
    +
  • Added ++ -- +
  • Boolean expressions are no longer fully evaluated +
  • Added break continue +
+ +

Version 0.2 - 2003/04/09

+ +
    +
  • using cdecl calling convention +
+ +

Version 0.1 - 2003/03/28

+ +
    +
  • Simple scripting with int float +
+ + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes1.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes1.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes1.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes1.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,898 @@ + + +AngelScript - Changes + + + + + + + +

AngelScript Change Log

+ +

Version 1.10.1d - 2005/01/21

+ +
    +
  • Bug fixes +
      +
    • asGetActiveContext() now returns 0 if there are no active contexts +
    • It is now possible to overload arrays of registered types +
    • Removed an assert failure when compiling math operator on non-math types +
    • On GCC/Linux all classes/structs are always returned in memory regardless of size and complexity +
    • Some compilers complained about the negative array size in the template code that is never instanciated. The code was commented. +
    • Fixed an assert failure when trying to use a unregistered object type (thanks Alain "abrken" Bridel) +
    +
+ +

Version 1.10.1c - 2004/12/19

+ +
    +
  • Bug fixes +
      +
    • ExecuteString() could sometimes return an invalid context pointer when an error occurred. +
    • Application functions that returned float or double failed on GNUC based compilers with optimizations turned on. (thanks Marcin "Szpak" Zajaczkowski) +
    • Prepare() could crash if the function id was incorrect. +
    +
+ +

Version 1.10.1b - 2004/12/01

+ +
    +
  • Bug fixes +
      +
    • Temporary objects created explicitly by calling the object's constructor weren't properly handled by the exception handler (thanks Alain "abrken" Bridel) +
    • Values were not implicitly converted to the parameter type when sent as function arguments +
    +
+ +

Version 1.10.1a - 2004/11/26

+ +
    +
  • Bug fixes +
      +
    • The tokenizer wasn't able to handle string constants that ended with two backslashes (thanks Scott "waheyluggage" Newby) +
    • The calling convention asCALL_CDECL_OBJFIRST wasn't working for functions with parameters +
    • rvalue was not verified to be initialized in assignments +
    +
+ +

Version 1.10.1 - 2004/11/21

+ +
    +
  • Bug fixes +
      +
    • The -> operator didn't compile correctly (thanks Adrian Licu) +
    • If the ?: operator returned literal constants there was an assert failure (thanks Alain "abrken" Bridel) +
    • Arrays of pointers were wrongly reported as uninitialized by the compiler +
    • Dereferencing temporary variables didn't release the variable +
    • Multidimensional arrays weren't working on GNUC based compilers +
    • Arrays of pointers to objects where causing problems (thanks Dan "Aggrav8d" Royer) +
    • Conversions to and from double failed in the VM (thanks Jetro Lauha) +
    • CALLBND didn't work in the ASM vm +
    • ExecuteStep() still didn't work as before with BUILD_WITH_LINE_CUES (thanks Josh Passenger) +
    • ++ and -- failed in ASM VM for float values +
    • Temporary variables where at times prematurely released (thanks Jetro Lauha) +
    + +
  • Library interface +
      +
    • asIScriptContext::Prepare() can now be called with the argument asPREPARE_PREVIOUS to prepare a context for calling the same function that was previously called. +
    + +
  • Script language +
      +
    • All number types are now implicitly converted for assignments and function arguments +
    • When evaluating math operations of two different number types the types are first implicitly converted to the largest type +
    • bits datatype is implicitly converted to and from uint/int +
    + +
  • Virtual machine +
      +
    • Optimized the ASM VM +
    + +
  • Compiler +
      +
    • Greatly improved build times +
    + +
  • Multithreading +
      +
    • Multithreading support is off by default, to add the support define the flag USE_THREADS +
    • The flag NO_THREADS no longer have any effect +
    + +
  • Project files +
      +
    • Added as_typeinfo.h and as_typeinfo.cpp +
    +
+ +

Version 1.10.0 - 2004/11/02

+ +
    +
  • Virtual machine +
      +
    • Optimized the C++ VM +
    • Jumps no longer suspend the VM +
    • New byte code BC_END, only used by exception handler. +
    • Added a new module as_context_x86.cpp with an optimized VM using assembly. Compile with the flag USE_ASM_VM to utilize this new VM. (contribution by Andres "Lioric" Carrera) NOTE: This is currently slightly slower than the C++ VM, but will be optimized further in future releases. +
    • Removed the NOP instructions as they are no longer needed for alignment +
    • Added the SUSPEND bytecode again. It's used to guarantee that the host application always can suspend a context, i.e. all loops have a SUSPEND instruction. +
    + +
  • Bug fixes +
      +
    • Exception handler would continue the execution +
    • Temporary variables were not always freed after compiling a function call +
    • Constants were not always successfully converted to reference when making function calls (thanks Anthony "Deyja" Casteel) +
    • The switch case didn't treat 8 and 16 bit integer types correctly (thanks Alain "abrken" Bridel) +
    • The exception handler failed when objects where returned by reference +
    • There was a memory leak when adding script sections but not actually building them (thanks Alain "abrken" Bridel) +
    + +
  • Script language +
      +
    • Added the operator 'xor' for boolean types. Alias '^^' (suggestion by Thomas Suter) +
    • Added native support for arrays +
    + +
  • Library interface +
      +
    • Changed the parameter type for callConv to asDWORD in the interface +
    • If the configuration is wrong the engine writes the message "Invalid configuration" to the outstream if available. People keep forgetting to verify the return code, this may help them understand why the build isn't done. +
    • RegisterObjectBehaviour() should only be used for object behaviours. Global behaviours should be registered with RegisterGlobalBehaviour(). +
    • GetFunctionName(), GetFunctionDeclaration(), GetGlobalVarName(), GetGlobalVarDeclaration(), GetImportedFunctionDeclaration(), and GetExceptionString() have changed to return a pointer to the string, so it is no longer necessary to pass a buffer to them. +
    • GetImportedFunctionSourceModule() and GetModuleNameFromIndex() now return the length as well. +
    • New global function asThreadCleanup() (see multithreading) + +
    • Fixed ExecuteStep() to work as before +
        +
      • By default ExecuteStep() is guaranteed to suspend execution at least once per loop +
      • Added the compile flag BUILD_WITH_LINE_CUES, which makes the script compiler add extra bytecodes that allow ExecuteStep() to return after each statement. +
      + +
    • Improved ExecuteString() +
        +
      • Calls to ExecuteString() can now be nested. +
      • ExecuteString() now takes an extra parameter, which allow the application to receive the context pointer directly, or even pass its own context by using the flag asEXECSTRING_USE_MY_CONTEXT. +
      • GetContextForExecuteString() is deprecated. +
      • ExecuteString() now reports build errors with line and column number starting with the passed string. +
      + +
    • Overridable array objects +
        +
      • It is now possible to register array objects, overriding the native array object +
      • New error code: asLOWER_ARRAY_DIMENSION_NOT_REGISTERED +
      • The library now returns asAPP_CANT_INTERFACE_DEFAULT_ARRAY if the application tries to register a function that uses arrays that haven't been registered by the application. +
      +
    + +
  • Multithreading +
      +
    • Added support for multithreading (can be disabled by defining NO_THREADS) +
    • Multithreading should now work with both MSVC and MinGW. Still only for Windows though. +
    • asGetActiveContext() is now thread safe +
    • Reference counting is thread safe +
    • The engine now deletes all unused modules when Discard() is called, this simplifies the context's interaction with the modules making the engine more stable for multithreading +
    • Created the global function asThreadCleanup() that will allow AngelScript to cleanup some thread local data. Should be called before exiting any extra threads that access AngelScript. +
    + +
  • Miscellaneous +
      +
    • Added the module as_thread.cpp that abstract the OS's thread functions +
    • New module as_arrayobject.cpp for the default array implementation +
    • Added as_debug.h +
    • Made minor code changes to make compilation on Linux smoother (thanks Johannes Plass) +
    • Changed MSVC projects to output to a different file when in debugmode (thanks Dan "Aggrav8d" Royer) +
    • Added std::vector binding code to the library download (thanks Anthony "Deyja" Casteel) +
    • as_compiler_expression.cpp was merged with as_compiler.cpp +
    + +
+ +

Version 1.9.2a - 2004/10/12

+ +
    +
  • Bug fixes +
      +
    • Subtraction was optimized as if it was associative (thanks Lennart Denninger) +
    • SetArguments() failed for script functions that returns registered object types by value. (thanks Thomas Suter) +
    • The application would crash if an exception was raised in ExecuteString() (thanks Joe "Desdemona" Wright) +
    • GetFunctionName() and GetFunctionDeclaration() now works for the ExecuteString() function id as well. +
    • The compiler didn't warn when passing uninitialized variables to function parameters (thanks Alain "abrken" Bridel) +
    • Constructors with parameters could cause assertion failure in GenerateExceptionHandler(). (thanks Alain "abrken" Bridel) +
    +
+ +

Version 1.9.2 - 2004/09/30

+ +
    +
  • Library interface +
      +
    • The interface now uses default argument value where applicable to make it easier to use +
    +
  • Script language +
      +
    • Added support for global objects using constructors with parameters (contribution by Andres Carrera) +
    • Improved constructors with parameters to work with local objects as well +
    • Constructors can now be used in expressions to create temporary objects +
    +
  • Virtual Machine +
      +
    • Removed the bytecode EID, which speeds up execution when there are objects in the scripts +
    • The exception ID is found by looking in a separate array +
    • Added the bytecodes RDGA4 and MOVGA4 for faster access to global variables +
    • Removed the bytecodes SET1 and PSP +
    • Added the bytecodes ADDIi, SUBIi, ADDIf, SUBIf, CMPIf +
    +
+ +

Version 1.9.1 - 2004/09/21

+ +
    +
  • Bug fixes +
      +
    • Switch-case didn't work correctly if the cases were not ordered in ascending order (thanks Dmitry "RCL" Rekman) +
    • The ternary operator ?: didn't release temporary variables as it should, causing an assert failure in the debug version (thanks Dmitry "RCL" Rekman) +
    • Passing string constants to condition operator would cause an assertion failure. (thanks Joe "Desdemona" Wright) +
    • Implicit conversion of pointer to a reference to a pointer caused assert failure (thanks Joe "Desdemona" Wright) +
    • The ternary operator ?: still wasn't working ok (thanks Joe "Desdemona" Wright) +
    +
  • Virtual Machine +
      +
    • Added 4 new conditional jump byte codes JS, JNS, JP, and JNP +
    • Renamed JMP0 and JMP1 to JZ and JNZ respectively +
    • Added the bytecodes CMPIi and CMPIui +
    • Removed the bytecodes LINE and SUSPEND. +
    • Line numbers are now stored in a separate array for the functions that need them +
    • Added bytecode CALLSYS for calling system functions and CALLBND for calling bound functions +
    • RET now pops the function arguments +
    +
  • Script language +
      +
    • String constants are now concatenated by the compiler if only whitespace separate them +
    • If the first case in the ternary operator ?: is a constant 0 it's type will be converted to the type of the second case. +
    +
  • Compiler +
      +
    • Added many optimizations +
    • Code that can't be reached is now removed by the compiler +
    • If statements that have constant expressions are optimized to go directly to the correct case +
    • If there are no objects in the function the exception handler will only have a return instruction +
    +
  • Library interface +
      +
    • ExecuteStep() no longer suspends execution after each statement because of the remove bytecodes LINE and SUSPEND. +
    • Added support for asCALL_CDECL_OBJFIRST (thanks Tristan "Kurioes" Hartskeerl) +
    • The value of boolean true can now be configured in as_config.h (the default is set to 1) +
    +
+ +

Version 1.9.0 - 2004/09/02

+ +
    +
  • Library interface +
      +
    • Renamed RegisterTypeBehaviour() to RegisterObjectBehaviour() +
    • Removed the flags asCALL_RETURNBYVAL and asCALL_RETURNBYREF +
    • Removed the flags asOBJ_IS_COMPLEX and asOBJ_IS_NOT_COMPLEX +
    • Included support for saving and loading compiled bytecode (thanks Dennis Bollyn) +
    • Removed the need to pass stack size when calling Prepare() or ExecuteString() +
    • Added the method SetDefaultContextStackSize() +
    • New error message asINVALID_CONFIGURATION, which is returned by Build() if the configuration failed +
    • Removed AS_CALL from the interface. This changes the exported function names. +
    • Added new methods for binding module functions from different modules. +
    • Removed GetModuleID() +
    • Added GetModuleIndex(), and GetModuleNameFromIndex() +
    • Added GetFunctionIDByIndex() and GetGlobalVarIDByIndex() +
    • Added functions for automatically binding all functions imported in a module. New error code asCANT_BIND_ALL_FUNCTIONS +
    • Added the lineOffset parameter to AddScriptSection() +
    +
  • Compiler +
      +
    • Compiler no longer outputs unecessary messages, such as "Building..." +
    • Each error message now follows a standard format: {section name} ({row}, {col}) : {Error or Warning} : {Message} +
    +
  • Virtual machine +
      +
    • The context stack now dynamically grows as needed +
    • New byte code BC_STR, that pushes the constant string address and length on the stack. The direct memory address is no longer stored in the compiled byte code +
    +
  • Script language +
      +
    • Added the global statement 'import FUNC_DEF from "MODULE NAME";'. 'import' is a reserved keyword, but 'from' isn't. +
    +
  • Miscellaneous +
      +
    • Renamed acCString to asCString and acCArray to asCArray +
    • Minor code improvements and potential bug fixes (thanks Wade Brainerd) +
    +
  • Bug fixes +
      +
    • Returning complex objects in script functions didn't work as expected. (thanks Joe "Desdemona" Wright) +
    • An assert failed in GenerateExceptionHandler() when returning large types. +
    • The macros asFUNCTIONP() and asFUNCTIONPR() wasn't working (thanks Joe "Desdemona" Wright) +
    • When a Build() fails, the module is cleaned up so that ExecuteString() can't call half compiled functions +
    +
+ +

Version 1.8.3 - 2004/08/31

+ +
    +
  • bug fix: An object with asBEHAVE_ASSIGNMENT registered could be assigned even though it was declared as const (thanks Lee "_MrC_" Clark) +
  • bug fix: Two functions with the same name and parameters would cause an assertion failure in compiler (thanks Alain "abrken" Bridel) +
  • bug fix: Discarding a module with Discard() could sometimes cause the module object to be deleted twice (thanks Alain "abrken" Bridel) +
  • bug fix: There was a typo in macro asMETHODPR() (thanks Joe "Desdemona" Wright) +
  • bug fix: An unclosed statement block could lead to assert failure in the parser (thanks Alain "abrken" Bridel) +
+ +

Version 1.8.2 - 2004/08/13

+ +
    +
  • Methods from classes with multiple inheritance are now supported +
  • Changed how the byte code references script functions, so that they are now local to each module, i.e. independent of module ID +
  • BC_PGA now takes an int instead of a dword +
  • Changed so that registered global properties are referenced by index instead of their memory address +
  • Global script variables are referenced by their local index, i.e. independent of module ID +
  • Added support for switch case statements (thanks Jeff White) +
  • Added support for the negative operator behaviour. The new flag is asBEHAVE_NEGATE +
+ +

Version 1.8.1 - 2004/08/13

+ +
    +
  • Changed debug output to be put in subdirectory AS_DEBUG +
  • bug fix: Some errors were always reported on line 1 column 1, no matter where they were located +
  • bug fix: An assertion failed when a function call used a temporary variable and the function wasn't found (thanks Jakub "krajzega" Wasilewski) +
  • bug fix: Non-complex objects with 2 DWORDs in size is now correctly returned from system functions +
  • bug fix: Objects returned in memory is now correctly handled by MinGW for cdecl calling convention +
  • bug fix: Objects registered with asOBJ_IS_COMPLEX was not treated correctly by MinGW +
  • bug fix: BC_PGA didn't mask out the module ID when retrieving the address of the global variable. (thanks Anders "Dentoid" Stenberg) +
  • bug fix: Class methods can now return objects in MSVC +
  • bug fix: Local variables in the top statement block could be destroyed at return even though they were declared after the return statement. (thanks Anders "Dentoid" Stenberg) +
  • bug fix: Class methods can now return objects in memory on MinGW +
  • bug fix: ExecuteString() could cause a crash when executed on a script compiled for the second time using the same module name. (thanks Jakub "krajzega" Wasilewski) +
  • Registering methods from classes with multiple inheritance are detected and reported as not supported +
  • Registering methods from classes with virtual inheritance are detected and reported as not supported on MSVC. Can't be detected on GNUC +
  • Cleaned up as_callfunc_x86.cpp +
  • Added support for virtual methods in GNUC +
  • New flags for RegisterObjectType(): asOBJ_CLASS, asOBJ_CLASS_CONSTRUCTOR, asOBJ_CLASS_DESTRUCTOR, asOBJ_CLASS_ASSIGNMENT, asOBJ_PRIMITIVE, asOBJ_FLOAT +
  • The flags asCALL_RETURNBYREF and asCALL_RETURNBYVAL no longer have any effect, and will be removed in a future version +
+ +

Version 1.8.0c - 2004/07/19

+ +
    +
  • bug fix: When creating a module its ID wasn't set correctly if another module had previously been released (thanks Lennart Denninger) +
  • bug fix: An assert failed when calling function in global variable initialization (thanks Lennart Denninger) +
+ +

Version 1.8.0b - 2004/07/17

+ +
    +
  • bug fix: Overloaded functions in multiple modules didn't compile correctly (thanks Anders "Dentoid" Stenberg) +
  • bug fix: MinGW reported duplicate labels when compiling as_callfunc_x86.cpp (thanks Jakub "krajzega" Wasilewski) +
+ +

Version 1.8.0a - 2004/07/12

+ +
    +
  • bug fix: asOBJ_IS_NOT_COMPLEX incorrectly identified objects smaller than or equal to 8 bytes (thanks Lennart Denninger) +
  • bug fix: Function calls in a second module didn't compile correctly (thanks Lennart Denninger) +
+ +

Version 1.8.0 - 2004/07/10

+ +
    +
  • Removed the flags parameter from RegisterGlobalProperty() and RegisterObjectProperty() +
  • Added RegisterStringFactory() +
  • Removed the bstr type from the library +
  • Added new behaviour flags for assignment operators, changing the values of the others +
  • Overloading assignment operator and compound assignment operators now work +
  • Added changes to remove level 4 warnings for MSVC .NET (thanks Ricard) +
  • Added C++ code alternative to the assembler code (thanks Eric Love) +
  • Changed the way function pointers and method pointers are registered. Use as asFUNCTION(f) and asMETHOD(c, m) macros. +
  • bug fix: Object method calls didn't free the object if it was temporary. (thanks Peter Marshall) +
  • Support for compilation of scripts into separate modules have been implemented. +
  • BC_PGA now takes a DWORD instead of a WORD +
  • @init() and @exit() are no longer reported by GetFunction...() +
  • Added support for STDCALL (contribution by Adam Hoult) +
  • bug fix: Functions with arguments of object types sent by value didn't pop all the arguments from the stack (thanks Adam Hoult) +
  • Added the method Discard() which allows the application to discard a module when it is no longer needed +
  • Added the method GetModuleID() which can be used to enumerate script functions in modules +
  • RegisterObjectType() should now use the new flags asOBJ_IS_COMPLEX and asOBJ_IS_NOT_COMPLEX +
  • ExecuteString() now take the name of the module in which it is to be executed +
  • Added support for enumeration of global script variables +
  • Added new macros to make it easier to take the pointer of overloaded functions and methods +
+ +

Version 1.7.1a - 2004/06/10

+ +
    +
  • bug fix: Arguments received by reference was erronously destroyed (thanks Peter Marshall) +
  • bug fix: MSVC++.Net 2003 crashed when compiling scripts. (thanks Fredrik Malmer) +
  • bug fix: Unnamed parameters wasn't treated by the exception handler +
  • bug fix: Some temporary variables wasn't correctly freed, leading to memory leakage +
+ +

Version 1.7.1 - 2004/05/27

+ +
    +
  • bstr has become an internally registered type +
  • bstr.length() is now a method instead of a property +
  • Removed the byte code STRMKE +
  • RegisterObjectType() now accepts the flags asCALL_RETURNBYVAL and asCALL_RETURNBYREF +
  • bug fix: Prepare() should no longer crash when receiving invalid function id (thanks Xavier "meink" Shay) +
  • The unexpected token message now shows what token was found +
  • It is now possible to use function overloads for scripted functions as well +
  • GetFunctionIDByName() returns asMULTIPLE_FUNCTIONS if more than one function with the same name exists +
  • GetFunctionIDByDecl() is now supported +
  • bug fix: The -> operator now works with direct pointers as well as pointer references (thanks Joe "Desdemona" Wright) +
  • bug fix: multiple variables per global declaration statement now works again (thanks Lennart Denninger) +
  • bug fix: scripts with errors in global variables could crash the application if no output stream was specified (thanks Fredrik Ehnbom) +
  • bug fix: calling ExecuteString() without first building a script didn't work (thanks Fredrik Ehnbom) +
  • ExecuteStep(asEXEC_STEP_OVER) is now supported +
  • Added support for the indexing operator +
  • The asBEHAVE_INDEX flag is used to register the overloaded indexing operator +
  • bstr[int] returns a reference to the indexed byte +
  • The library is now working on the Dreamcast (thanks Fredrik Ehnbom) +
  • bug fix: When compiling function calls the compiler didn't discard alternatives with more parameters than used arguments (thanks Lennart Denninger) +
+ +

Version 1.7.0 - 2004/05/03

+ +
    +
  • Included the makefile for Linux compilers (thanks Stefan Diepenbrock) +
  • Added the methods ExecuteString() and GetContextForExecuteString() to the engine interface +
  • ExecuteStep() now takes a parameter that defines how to execute, only asEXEC_STEP_INTO is supported at the moment +
  • ExecuteString() is able to work with compiled script +
  • ExecuteString() now takes a flag that can be either 0 or asEXECSTRING_ONLY_PREPARE (thanks Joe "Desdemona" Wright) +
  • Removed the concept of global constants, they are instead global variables that are read-only +
  • bug fix: global variables ignored any type modifiers, thus global pointers were not possible (thanks Gunder Wulde) +
  • condition operator can be used when initializing global variables +
  • Global variables can now be initialized with expressions using other global variables, not just constants +
  • When finding the matching overloaded function, a conversion between signed and unsigned integers are given priority over conversion between integer and float (thanks Joe "Desdemona" Wright) +
  • bug fix: A pointer with an assignment behaviour can now be assigned a null pointer. +
  • Changed the library license from LGPL to the zLib license +
+ +

Version 1.6.1b - 2004/03/30

+ +
    +
  • bug fix: Declaring multiple global variables in the same statement resulted in compiler error (thanks Jayanth) +
  • Added the tokens &&, ||, and ! as aliases to 'and', 'or', and 'not' +
+ +

Version 1.6.1a - 2004/03/23

+ +
    +
  • Removed compilation warning for VSC++ .NET 2003 (thanks Daniel Krenn) +
  • bug fix: When reading booleans as object properties the compiler failed to mask out value (thanks Joe "Desdemona" Wright) +
+ +

Version 1.6.1 - 2004/03/21

+ +
    +
  • bug fix: There was a memory leak in the tokenizer (thanks Philip Love) +
  • bug fix: An exception occured when compiling method calls with objects as parameters (thanks Bartosz "Hans" Czuba) +
  • More code cleaned up +
  • BCONSTR and BDESTR are no longer used, instead BC_CALL is used +
  • BCONSTR, BDESTR, BCOPY, STRDEL, STRCPY, STRMOV, STRCAT, STRCMP and STRWRT has been removed +
  • bug fix: break, continue, and return sometimes caused GenerateExceptionHandler() to fail since objects were destroyed more than once +
  • Added support for the for-loop (thanks Erik J Baran) +
  • Return values are now returned in a special register instead of on the stack +
  • Added bytecodes SRET4, SRET8, RRET4, RRET8 for managing the return register +
  • Added the calling convention asCALL_CDECL_OBJLAST for object methods. This calls the method as a normal C function with the object reference as the last parameter +
  • The asMETHOD and asFUNCTION types are now defined macros instead +
  • Type behaviours must be registered as either asCALL_THISCALL or asCDECL_OBJLAST +
  • Pointers can now be compared with other pointers of the same type and level, or with 0 for null pointer tests +
  • It is now possible to register overloaded operators for all dual operators, except assignment operators +
  • bstr is now handled with operator overloads +
  • bug fix: booleans are now 1 byte large, just as for C++ (thanks Josh "nihlist" Passenger for spotting the bug). +
  • Cleaned up the code that compiles overloaded operators and function calls +
  • Changed all the JMP instructions to use a 4 byte offset +
  • Function overloading for registered functions and object methods is now supported +
  • bug fix: When converting a constant to another type the value would become 0 +
+ +

Version 1.6.0 - 2004/02/18

+ +
    +
  • Added parameter flags for RegisterObjectType, but should be set to 0 +
  • The flag asCALL_WITHCONTEXT is no longer available, use asGetActiveContext() to retrieve context instead +
  • GetFunctionCount() can now be used to obtain the number of script functions compiled +
  • The way type behaviours are registered have been changed to allow more flexibility +
  • Cleaned up the code +
  • bug fix: RegisterObjectMethod() didn't accept asCALL_RETURNBYVAL and asCALL_RETURNBYREF flags +
  • If any of the engine configuration methods fail the engine object will no longer let the application build scripts. +
  • Function parameters and variables can now be declared as const +
  • The flag asPROPERTY_READONLY has been removed, use const in declaration instead +
  • bug fix: exceptionID wasn't initialized to zero in Prepare() and the program could crash at an exception +
  • Lot's of changes to allow compilation with DJGPP (thanks Eric Love) +
  • Added as_config.h that may be used to configure some aspects of the compilation to acomodate for compiler differences +
  • Improved the angelscript.h by allowing the user to define exactly the way AngelScript is linked +
  • bug fix: Equality comparison between bits types didn't work (thanks Bartosz "Hans" Czuba) +
+ +

Version 1.5.2 - 2004/01/30

+ +
    +
  • bug fix: When sending objects with behaviours by value in function arguments the exception handler didn't correctly destroy the objects +
  • bug fix: Pointers now work correctly with behaviours +
  • Added the flags asCALL_RETURNBYVAL and asCALL_RETURNBYREF that can be used to register how a system function returns if the engine isn't able to correctly determine it +
  • Cleaned up the method CallSystemFunction() giving about 10% performance improvement +
+ +

Version 1.5.1 - 2004/01/26

+ +
    +
  • bug fix: The compiler no longer crashes when an object method name is not found (thanks Lennart Denninger) +
  • Changed where and when objects are constructed and destructed +
  • Changed bstr to use behaviour functions for construct, destruct, and copy +
  • Changed the STRMKE and the STRCAT byte codes +
  • STRDEL, STRCPY, STRMOV, and STRWRT are no longer used +
  • Added bytecodes JMPP, EID, and PEID +
  • Completely remade the way the script engine cleans up the stack in case of exceptions +
  • It is now allowed to register behaviours for pointers to objects +
  • Exceptions may be thrown in the construct and copy behaviour functions +
+ +

Version 1.5.0 - 2004/01/19

+ +
    +
  • When registering object types the name is checked against all other names registered +
  • It is no longer possible to register two object members with the same name +
  • Contexts now hold a reference to the engine object +
  • Added RegisterTypeBehaviour() that allows the application to register helper function that will be call when a script variable is initialized, uninitialized, and copied +
  • Added bytecodes BC_BCONSTR, BC_BDESTR, and BC_BCOPY +
  • Objects with behaviour cannot be sent by value +
  • Returning objects with behaviour requires special care for system functions +
+ +

Version 1.4.1 - 2004/01/14

+ +
    +
  • bug fix: SetArguments() and GetReturnValue() didn't work +
  • Change the message for when implicit conversion is not possible to a more descriptive one +
  • Added int32 as alias to int, uint32 to uint, and bits32 to bits +
+ +

Version 1.4.0 - 2004/01/12

+ +
    +
  • Created the asIScriptContext interface for communicating directly with the contexts +
  • Context::Prepare() now takes a function ID instead of a string, making it faster for repeated preparations with the same function +
  • Get/SetStackData() has been renamed to GetReturnValue() and SetArguments() +
  • GetReturnValue() and SetArguments() now takes an array of dwords instead of a single dword +
  • System functions now receive a pointer to the context instead of the engine +
  • Added RegisterGlobalProperty() giving the script engine access to variables in the host application +
  • bug fix: properties are now properly treated as read only if the flag is set +
+ +

Version 1.3.9 - 2004/01/06

+ +
    +
  • bug fix: the compiler determined the size of the returned value incorrectly for large types +
  • bug fix: the script engine crashed the program when calling system functions that returned large types +
  • warnings and errors during compilation of constants are now correctly shown +
  • Improved performance for repetetive execution of the same script function by caching some values +
+ +

Version 1.3.8 - 2003/12/10

+ +
    +
  • Explicit conversions no longer generate warnings about precision +
  • bug fix: global constants of type double didn't hold the correct value +
  • float constants can now be declared explicitly by including the f modifier after the number +
+ +

Version 1.3.7 - 2003/11/27

+ +
    +
  • Added datatype double +
  • lots of new byte codes to handle the double data type +
  • Added missing conversions bits -> bits8, bits16 -> bits8, bits -> bits16 +
  • bug fix: Conversions in constant expressions now work +
  • bug fix: bits constants are now correctly parsed +
+ +

Version 1.3.6 - 2003/11/07

+ +
    +
  • Fixed a memory leak +
  • Multiple global constants of the same type can now be declared in the same statement +
  • Conversion on constants now continue being constants if possible +
  • Constant declarations now correctly report error if expression type is wrong +
  • Constant expressions are now implicitly converted to correct type for constant declarations +
  • Global variables can now be declared and initialized with constant expressions +
  • Added byte code PGA (Push Global Address) used to access global variables +
+ +

Version 1.3.5 - 2003/09/23

+ +
    +
  • Fixed a bug with returning a pointer to a float from a system function +
  • Fixed bug in CleanStack, that crashed program on an exception +
  • bstr.length is now uint +
  • Changed data types for functions asCreateScriptEngine, asBStrAlloc, and asBStrLength +
  • Improved speed of object method calls with almost 10% +
  • Added new bytecode PUSHZERO improving speed about 3% +
  • Added new bytecode COPY for copying memory blocks +
  • Simple structs are now supported, those that don't need special treatment for construction, destruction and assignments +
  • Added bytecode PSP (again) +
  • Fixed a bug that sometimes crashed the program if a system function declaration was wrong +
+ +

Version 1.3.4 - 2003/09/16

+ +
    +
  • Added data types: int8, int16, uint8, uint16, bits8, bits16 +
  • Bitwise shift operators now takes an unsigned integer to the right +
  • bits, int, and uint can be implicitly converted to a larger type but never to a smaller +
  • Added byte codes BC_SB, BC_SW, BC_UB, BC_UW, BC_WRT1, BC_WRT2, BC_INCi16, BC_INCi8, BC_DECi16, BC_DECi8 +
  • Implemented ++, -- for uint type (missing from last version) +
+ +

Version 1.3.3 - 2003/09/10

+ +
    +
  • Added data type: uint +
  • Integer constants are now uint +
  • Added byte codes BC_UI2F, BC_F2UI, BC_CMPui +
  • Fixed a bug that affected unary operations on constant values +
+ +

Version 1.3.2 - 2003/09/02

+ +
    +
  • Separated texts from the code for easier maintenance +
  • Separated library code from Windows DLL code +
  • Library code is now following the ANSI standard +
  • Fixed bug that at crashed program when the engine was destroyed +
  • System functions may now returns references that the script engine can write to +
+ +

Version 1.3.1 - 2003/08/22

+ +
    +
  • RegisterObjectMethod() is now supported for non virtual object methods +
+ +

Version 1.3.0 - 2003/08/19

+ +
    +
  • Reduced windows .dll size 10% by using the linker option /OPT:NOWIN98 +
  • Reduced size another 20% by turning off exception handling (something that can't safely be used in a dll anyway as other compilers don't implement it the same way) +
  • Interface functions and methods are now explicitly declared as _stdcall +
  • The script language now allows the use of pointer declarations, although no pointer arithmetic +
  • Added the -> operator to access members from pointers +
  • Changed the RegisterObjectProperty() parameters +
  • RegisterObjectType() now takes an object size as property as well (although, only 0 is supported) +
+ +

Version 1.2.1 - 2003/08/12

+ +
    +
  • Registered object types are checked already when registering them +
  • Registered global functions are checked at inclusion +
  • Fixed bug, a script exception could sometimes crash the app +
  • Object properties can now be registered by the application. +
+ +

Version 1.2.0 - 2003/08/05

+ +
    +
  • The engine now supports multiple contexts for executing several script functions in parallel +
  • The application can now set a script exception in system functions +
  • The application can query the current function and line number being executed +
  • Changed the status codes returned by Execute() +
  • It is now possible to suspend a context +
  • The last context executed is returned with GetLastContextExecuted() +
  • EnumerateContexts() enumerates all existing context IDs. +
  • PrepareContext() uses an existing context created with CreateContext() to improve performance of execution +
  • A pointer to the scripting engine is sent as the last parameter to the system functions +
  • Improved error codes for interface methods +
  • ExecuteStep() allows the application to step through the script. +
+ +

Version 1.1.2 - 2003/07/31

+ +
    +
  • Added the access operator . for object properties +
  • Added length property to the bstr type +
  • Added ADDOFF that adds an offset to a pointer in a variable +
  • Fixed a bug in CompileDeclaration() +
  • Fixed a bug in Execute() where it returned 1 when finished succesfully +
  • Fixed bug in CallCDeclFunction(), where printf() and OutputDebugString() didn't work in the called function +
  • asCDataType now allows references to be marked as read-only +
+ +

Version 1.1.1 - 2003/07/25

+ +
    +
  • Cleaned up the code for the instruction set +
  • Added instruction set statistics +
  • Removed NOP, PSP, END +
  • Added MOVSF4, SWAP4, STORE4, RECALL4 +
  • Improved performance of the switch case in asCThread::ExecuteNext() +
  • Improved performance for compound assignments +
  • Fixed a bug in CompileConversion() +
+ +

Version 1.1.0 - 2003/07/18

+ +
    +
  • The thread now reserves space on the stack for arguments and return value +
  • It is now possible to send arguments and retrieve return value +
  • The declarations of the script functions can be retrieved for verification +
  • Compiler error on divide by zero with constant +
  • Throws divide-by-zero on DIVi, MODi, DIVf, MODf +
  • Added byte code LINE that the thread uses to report on which line an exception ocurred +
  • The output stream is now only used during build. +
  • Made the string methods global because the memory is shared anyway +
  • Information about exceptions ocurred can now be retrieved from the engine +
  • The engine interface now uses reference counting to control memory deallocation +
  • Changed the name of the thread functions, as they create the misconceptions that multiple threads are allowed +
  • The output stream is now sent with the Build() method, as it is only used during build. +
+ +

Version 1.0.4 - 2003/07/16

+ +
    +
  • Improved compiler code to be easier to maintain +
  • Improved the implicit conversion to include assignment and return expressions. +
  • Improved compiler message output, doesn't write "Parsing..." or "Compiling..." unless there is an error or warning. +
  • Improved verification of extended types and system functions +
+ +

Version 1.0.3 - 2003/07/08

+ +
    +
  • Undeclared variables are only reported once +
  • Doesn't give assert failed when lvalue is a temporary variable (gives a compile error instead) +
  • A warning is now given if a variable is used before being assigned a value +
  • Added implicit conversion between int and float for constant values +
  • Constant expressions are evaluated into a single constant +
  • Constant declarations may now take constant expressions +
  • Constants can only be declared one per statement. +
+ +

Version 1.0.2 - 2003/07/03

+ +
    +
  • Fixed minor error where the script engine treated the argument to STRMKE as short instead of WORD as it should. +
  • Added an extra SUSPEND in both while and do-while loops to make sure that at least one exist in every loop. +
  • Fixed a bug where assigning a string to a variable breaks the code. +
  • Added post compile optimizations +
  • Added byte code RDSF4 that the optimizer puts in the place of PSF followed by RD4 +
  • Added asGetLibraryVersion() to the API +
+ +

Version 1.0.1 - 2003/06/30

+ +
    +
  • Corrected the missing return type for operator = in asCDataType (thanks Marc Fascia for spotting that) +
  • Fixed a bug where the script engine crashed when initializing variables with a declared bstr constant. +
  • Improved version check so that it is backwards compatible for changes in build version (bug fixes) +
+ +

Version 1.0.0 - 2003/06/25

+ +
    +
  • Improved temporary variable reutilization +
  • Removed bug in release version +
  • Cleaned up the code for public release +
  • Prepared for compilation as DLL +
+ + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes2.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes2.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes2.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/articles/changes2.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1469 @@ + + +AngelScript - Changes + + + + + + + +

AngelScript Change Log

+ +

Version 2.18.0 - 2009/12/16

+ +
    +
  • Bug fixes +
      +
    • Fixed assert in compiler when accessing property through temporary object (Thanks Scarabus2) +
    • Fixed crash with too large array sizes, both for built-in array and array add-on (Thanks loboWu) +
    • Fixed memory leak when an exception occurred in ExecuteString, and another ExecuteString was called afterwards +
    • Fixed improper re-use of temporary variable by property get accessor when compiling binary operators (Thanks Scarabus2) +
    • Fixed a bug in array template add-on with max portability mode (Thanks quarnster) +
    +
  • Library interface +
      +
    • Added asIScriptModule::CompileFunction() for dynamically compiling a single function that can be executed, and optionally added to the module +
    • Added asIScriptFunction::GetId() +
    • Added asIScriptModule::RemoveFunction() for dynamically removing a single function from the scope +
    • Deprecated the asIScriptEngine::ExecuteString method. An add-on has been provided to replace it +
    • Removed the error code asMODULE_IS_IN_USE as it is no longer used +
    • Removed old deprecated methods +
    • Added asIScriptModule::CompileGlobalVar() and RemoveGlobalVar() for dynamically adding and removing single global variables to and from the module +
    +
  • Library +
      +
    • Added support for UTF-16 encoded string literals through dynamic engine property asEP_STRING_ENCODING (Thanks Jubok Kim) +
    • Each global variable has it's own intialization function now, which will allow individual globals to be added or removed dynamically +
    • Each script function now holds its own list of accessed global variables, so they do not have to go back to the module for that info +
    • Added support for native calling conventions on iPhone (Thanks Fredrik Ehnbom) +
    • String constants are now stored in the engine and shared between modules +
    • The context no longer references the module, as script functions no longer depend on the module for anything +
    • Changed the script functions to use reference counting +
    • Improved compiler messages when function arguments doesn't match available functions (Thanks droz) +
    +
  • Add-ons +
      +
    • Added the global helper function ExecuteString, which replaces the asIScriptEngine::ExecuteString method +
    +
  • Project +
      +
    • Renamed the as_callfunc_armasm.asm to as_callfunc_arm_msvc.asm +
    • Renamed the as_callfunc_armasm.S to as_callfunc_arm_gcc.S +
    • Added as_callfunc_arm_xcode.s which is the Apple XCode assembler code for arm CPUs (Thanks Gilad Novik) +
    • Added as_globalproperty.cpp +
    +
+ +

Version 2.17.2 - 2009/10/18

+ +
    +
  • Bug fixes +
      +
    • Fixed assert failure after compiler error in construct call (Thanks loboWu) +
    • Fixed bug in compiler that freed objects returned by value too early (Thanks xivVerge) +
    • Class methods are now allowed to be registered to types registered in previous config groups (Thanks Wavesonics) +
    • Template factory stubs weren't removing arguments from the stack (Thanks loboWu) +
    +
  • Script language +
      +
    • Ref classes without default factory can now be instanciated by explicitly calling one of the non-default factories (Thanks Wracky) +
    +
  • Library +
      +
    • Added the object behaviour asBEHAVE_TEMPLATE_CALLBACK, which is used to perform compile time validation of template instances +
    +
  • Add-ons +
      +
    • Fixed bug in CScriptBuilder to avoid endless loops in default include handler (Thanks leave) +
    +
+ +

Version 2.17.1 - 2009/09/16

+ +
    +
  • Bug fixes +
      +
    • Loading pre-compiled bytecode for scripts that used registered functions that included the built-in array type in the signature crashed (Thanks loboWu) +
    • Fixed the parsing of templates to accept handles as subtypes (Thanks dxj19831029) +
    • Fixed bug with &inout and constants for invalid scripts (Thanks scypior) +
    • Fixed crash when loading pre-compiled bytecode that had classes with enums as members (Thanks huangyous) +
    • Fixed memory access violation in CContextMgr add-on (Thanks Kim PoongHo) +
    +
  • Library +
      +
    • Improved the registerable template types to also support a template type as subtype. +
    • Loading pre-compiled bytecode is now agnostic of the order that global properties were registered. +
    +
  • Script language +
      +
    • Added support for class property get and set accessors. +
    +
  • Project +
      +
    • Added compile time option to GNUC makefile to build a shared library (Thanks Dan Horák) +
    • Added as_callfunc_armasm.S, which is an adaption of the MSVC assembler code in as_callfunc_armasm.asm to GNUC assembler (Thanks darktemplar216) +
    • Added configurations in as_config.h to detect the Android OS and enable support for native calling conventions on ARM for it (Thanks sliao) +
    +
  • Add-ons +
      +
    • Improved the script builder to allow custom processing of include directives via a callback +
    • Improved memory management in CContextMgr to reduce run-time allocations by pooling objects +
    +
+ +

Version 2.17.0 - 2009/08/09

+ +
    +
  • Bug fixes +
      +
    • Fixed compiler error in the XBox 360 specific code. (Thanks Marc Hanson) +
    • Scoped reference types can now be members of script classes. (Thanks Jeff Slutter) +
    • Fixed crash in compiler on invalid script (Thanks cvet) +
    • Reference types that had been registered with zero size wasn't allowed as members of script classes. (Thanks Friggle) +
    • Added validation for duplicate switch cases in script compiler (Thanks loboWu) +
    +
  • Library +
      +
    • Removed all old deprecated functionality +
    • The built-in array type is now completely unaware of the library internals and uses only the public interface +
    • Unified parts of the code for native calling conventions to improve maintainability +
    • Informing the application type when registering a value type is now only required if the type is returned by value or passed by value to a function with native calling convention +
    • Added engine property asEP_INCLUDE_JIT_INSTRUCTIONS to indicate if the JIT bytecode instructions should be included or not. Defaults to off. +
    • The variant parameter, ?, now receive a reference to the actual object if the argument is not a handle (Thanks IndependentHat) +
    +
  • Library interface +
      +
    • Added GetTypeId, GetSubTypeId, AddRef, and Release to asIObjectType +
    • Created the interface for an external JIT compiler plug-in (Thanks Fredrik Ehnbom) +
    • Deprecated RegisterGlobalBehaviour, GetGlobalBehaviourCount, and GetGlobalBehaviourByIndex. These behaviours should use the new class methods instead. +
    • Deprecated CompareScriptObjects. Use the helper functions CompareRelation or CompareEquality from the add-ons instead. +
    • Deprecated all assignment behaviours and the negate behaviour. These behaviours should use the new class methods instead. +
    • Changed asBEHAVE_REF_CAST and asBEHAVE_IMPLICIT_REF_CAST to be registered as object behaviours. Verify the documentation for implementation changes. +
    • Added AddRef, Release, IsReadOnly, and GetByteCode methods to asIScriptFunction. +
    • Deprecated asIScriptObject's GetPropertyPointer, which has been replaced with GetAddressOfProperty. +
    • Deprecated asIScriptContext's GetArgPointer, which has been replaced with GetAddressOfArg. +
    +
  • Virtual machine +
      +
    • Added bytecode instruction JitEntry that transfers control to the JIT compiled function +
    • Renamed SET8 to PshC8 +
    +
  • Add-ons +
      +
    • Added the atan2 function to the math add-on +
    • Added the helper functions CompareRelation and CompareEquality as add-ons +
    • Added a template script array object +
    • Implemented the CContextMgr add-on that supports co-routines and concurrent script threads +
    +
  • Project +
      +
    • Removed as_bytecodedef.h as its content has been moved to angelscript.h +
    • Renamed as_scriptstruct files to as_scriptobject +
    +
+ +

Version 2.16.3 - 2009/07/05

+ +
    +
  • Bug fixes +
      +
    • Fixed bug in compiler when passing a constant to argument expecting out ref. +
    +
  • Library +
      +
    • Added support for native calling conventions for ARM processors with MSVC compiler (Thanks Fredrik Ehnbom) +
    +
  • Script language +
      +
    • Script classes can now implement operator overloads for all dual operators with specific class methods +
    • Script classes can also implement overloads for the unary negate and bit complement operators +
    • An if condition followed by an empty statement will now give a compiler error (Thanks asterix12) +
    +
+ + +

Version 2.16.2 - 2009/06/07

+ +
    +
  • Bug fixes +
      +
    • Fixed crash after call to DiscardModule where GC held objects declared by the module (Thanks Jeff Slutter) +
    • Fixed crash on compiling invalid script (Thanks cvet) +
    • Fixed bug with virtual function table and multiple levels of inheritance (Thanks huangyous) +
    • Fixed some compatibility issues with MSVC and 64bit targets +
    • Fixed bug with implicit cast of const ref type to non-const ref type (Thanks cvet) +
    • The asFUNCTIONPR and asMETHODPR no longer accepts pointers to functions that are not exactly like the specified one (Thanks Wavesonics) +
    • Fixed crash on compiling global variable of registered type with missing copy behaviour (Thanks 39ster) +
    • Fixed value of asTYPEID_SCRIPTOBJECT to be just 1 bit (Thanks SiCrane) +
    • Fixed bug in string add-ons where the full string wouldn't be created by the factory if it contained null characters. +
    • Fixed rare bug when script called application function with float args and the application uses full optimization (this time on GNUC/x86) (Thanks kunitoki) +
    • Fixed alignment bug for script class properties (Thanks Fredrik Ehnbom) +
    +
  • Library +
      +
    • Build and ResetGlobalVars now return an error if the initialization of the global variables fails. +
    • Changed initialization of global variables so that variables of primitive types are initialized first. (Thanks Friggle) +
    • Added informational message to better explain the error 'missing behaviours' on invalid registration. +
    • It is now possible for the application to register template types, though the feature is still not considered complete. +
    • Added asEP_SCRIPT_SCANNER property for choosing between ASCII and UTF8 script encoding. Default is UTF8. +
    +
  • Script language +
      +
    • Added support for string escape sequences \uFFFF and \UFFFFFFFF for inserting unicode characters in string constants. +
    +
+ +

Version 2.16.1 - 2009/05/09

+ +
    +
  • Bug fixes +
      +
    • Fixed bug with implicit conversion from temporary 'const obj @' to 'obj &' (Thanks Jeff Slutter) +
    • Fixed problem with float values and locale (Thanks scypior) +
    • Fixed incorrect conversion of null handle to primitive (Thanks cvet) +
    • Fixed crash when assigning array to itself (Thanks cvet) +
    • Fixed assert failure after invalid conditional expression (Thanks Jeff Slutter) +
    • Fixed bug in compiler when attempting to return null handle for a function declared to return object by value (Thanks marvi) +
    • Compiler is now giving a proper error when script function returns reference (Thanks marvi) +
    • Fixed crash when a script constructor that receives object handle throws an exception (Thanks cvet) +
    • Fixed implicit value cast to another object type (Thanks SiCrane) +
    • Fixed multithread support on FreeBSD (Thanks droz) +
    • Character literals for characters above ASCII 127 are now compiled correctly (Thanks cvet) +
    • Fixed rare bug when script called application function with float args and the application uses full optimization (Thanks Jeff Slutter and DaBono) +
    +
  • Library +
      +
    • The built-in array type is now implemented using a template type. +
    • The tokenizer now recognizes the UTF8 byte-order-mark as whitespace permitting the compilation of UTF8 encoded scripts. +
    • Added support for multibyte character sets through the preprocessor flag AS_DOUBLEBYTE_CHARSET, it's recommended to use UTF8 instead though. (Thanks loverlin) +
    • Added asEP_REQUIRE_ENUM_SCOPE to force the use of enum scope when accessing enum values. (Thanks Jeff Slutter) +
    • The value cast behaviour can now be used to instanciate an object type if the type doesn't have the appropriate constructor. (Thanks SiCrane) +
    • The callstack is no longer cleaned up immediately on an exception, thus allowing the examination of it even after Execute returns. +
    +
  • Script language +
      +
    • Enum values can now be prefixed with the enum type to give the exact enum value when multiple enums declare the same name. (Thanks Jeff Slutter) +
    +
  • Add-ons +
      +
    • CScriptBuilder is now better at handling relative include paths (Stuart Golodetz) +
    +
+ +

Version 2.16.0 - 2009/03/30

+ +
    +
  • Bug fixes +
      +
    • Fixed bug in compiler where temporary variable was freed twice during compound assignments with some complex lvalue expressions (Thanks _Vicious_) +
    • Fixed crash when parsing invalid typedefs. +
    • Typedefs declared in scripts now accept float and double as well. +
    • Fixed crash when compiling handle comparison with invalid types (Thanks _Vicious_) +
    • It's now possible to determine type id for handle to scoped reference types (Thanks Jeff Slutter) +
    • Unary operators weren't supported for enum types (Thanks jal_) +
    • Fixed crash when declaring a script class that inherits from a class declared below it (Thanks Zeu5) +
    • Fixed bug when registering an interface after previously removing dynamic config group (Thanks Zeu5) +
    • Fixed bug in CScriptBuilder add-on that broke global declarations with array types (Thanks except134) +
    • Fixed problem with class inheritance and order of declaration (Thanks Zeu5) +
    • Fixed assert failure after compile error (Thanks Cliff Cawley) +
    +
  • Library +
      +
    • All primitive types now have fixed type ids, so it is no longer necessary to call the GetTypeIdByDecl method to obtain their ids. +
    • Removed the AS_NO_USER_ALLOC config option. +
    • Enumeration of functions in the modules now only return global functions. +
    • Enumeration of object types in modules now only return classes and interfaces. +
    • Added engine property asEP_BUILD_WITHOUT_LINE_CUES (replaces the config option). +
    • Added engine property asEP_INIT_GLOBAL_VARS_AFTER_BUILD, which will allow compiling scripts without having the implementation of the application functions. +
    • Enumeration of object types in the engine now only return registered object types. +
    +
  • Library interface +
      +
    • Removed some functions that had been deprecated in version 2.14.0. +
    • Renamed asIScriptStruct to asIScriptObject. +
    • Renamed GetStructTypeId to GetTypeId in asIScriptObject. +
    • Added enumeration of factory functions and behaviours to asIObjectType. +
    • Added GetBaseType, GetFlags, GetSize, and GetPropertyOffset to asIObjectType. +
    • Deprecated GetSubType and IsInterface in asIObjectType. +
    • Added enumeration of enums and typedefs to asIScriptModule. +
    • Added enumeration of registered functions, properties, enums, and typedefs to asIScriptEngine. +
    • Added parameter to asIScriptFunction::GetDeclaration to include or not the object name in the returned string. +
    • Removed all output length parameters for functions that returned strings, all strings are null terminated anyway. +
    • Deprecated GetReturnPointer in asIScriptGeneric, replaced by GetAddressOfReturnLocation. +
    +
  • Add-ons +
      +
    • Added registration of std::string as a standard add-on, complementing the CScriptString +
    • Added resize method to the string add-ons +
    • Changed CScriptFile to be compatible with both std::string and CScriptString +
    • Modified CScriptBuilder to permit enabling/disabling metadata processing through preprocessor define +
    • Added autowrapper add-on that automatically generates wrappers for the generic calling convention for functions and class methods (Thanks George Yohng) +
    • Added registration of the double counter parts to the math functions +
    +
+ +

Version 2.15.2 - 2009/02/22

+ +
    +
  • Bug fixes +
      +
    • The pre-compiled bytecode didn't store the script class destructors, nor the implemented interfaces +
    • Script class factories didn't work for constructors with more than 1 argument (Thanks BornToCode and scypior) +
    • Changed as_atomic.cpp to use critical sections for older versions of GCC on Linux (Thanks _Vicious_) +
    • Fixed some 64bit compatibility issues (Thanks Ionut "gargltk" Leonte and _Vicious_) +
    • Fixed dangling pointer problem after removing dynamic configuration group (Thanks Ionut "gargltk" Leonte) +
    +
  • Script language +
      +
    • Added support for single inheritance for script classes +
    • Added support for scope resolution operator +
    +
  • Library +
      +
    • Added support for native calling conventions on 64bit Linux (Thanks Ionut "gargltk" Leonte) +
    +
  • Add-ons +
      +
    • Implemented readLine, isEndOfFile, writeString, getPos, setPos, and movePos for the CScriptFile +
    • Removed use of bool in the C library header (Thanks Gibbon_99) +
    • Added support for #if/#endif preprocessor directives to the CScriptBuilder +
    +
+ +

Version 2.15.1 - 2009/01/25

+ +
    +
  • Bug fixes +
      +
    • Fixed a bug with bitwise operators and 8/16 bit integer types (Thanks jkhax0r) +
    • Fixed the error message when no matching constructor is found for a construct call +
    • Fixed bug when compiling expressions that called index operator that returned an object by value on a temporary variable (Thanks dxj19831029) +
    • Saved pre-compiled bytecode didn't store the read-only flag for class methods +
    • Fixed bug where class method calls that returned a reference to a member of the class would release the class before the reference was used +
    • Fixed bug that allowed object handles for value types (Thanks Wavesonics) +
    • Modified as_atomic.h to avoid use of kernel specific atomic.h on Linux (Thanks namtabmai) +
    • Fixed compile error in as_callfunc_x86.cpp on GNUC when using -O3 option (Thanks bigjo) +
    • Fixed the calling conventions for MinGW on Windows +
    +
  • Library +
      +
    • Internally reference types (including script classes) are now allocated by calling the factory function directly +
    • Updated as_config to properly identify operating system, thus improving multithreading performance +
    • Created script factory stub functions for instanciating template types, thus simplifying script compiler +
    • The memory for global variables declared in scripts is now allocated individually, which will allow more flexibility +
    +
  • Add-ons +
      +
    • Added the generic interface to the CScriptFile object +
    +
+ +

Version 2.15.0 - 2008/12/13

+ +
    +
  • Bug fixes +
      +
    • Fixed assignments where the rvalue is a temporary object instanciated with a construct call (Thanks SiCrane) +
    • The parser no longer accepts other digits than 0 to initiate a hex literal value (Thanks SiCrane) +
    • Fixed compiler error in as_callfunc_ppc_64.cpp (Thanks James Chan) +
    • Fixed saving bytecode with enums (Thanks loboWu) +
    • Fixed the index operator call on temporary object that caused an invalid reference (Thanks dxj19831029) +
    • Fixed bug in the tokenizer and the !in token versus identifier (Thanks xivVerge) +
    • Script functions can now be declared to return const types (Thanks SiCrane) +
    • Fixed multithread problem in memory manager for the script node pool (Thanks xivVerge) +
    • Fixed assert failure after compilation error with ref cast operator (Thanks Jeff Slutter) +
    • Fixed compiler warnings for g++ 4.3.2 (Thanks Matt Williams) +
    +
  • Library interface +
      +
    • Changed the parameters for the engine's GarbageCollect method to give more control to the application +
    • Replaced GetObjectsInGarbageCollectorCount in the engine interface with GetGCStatistics +
    • Added GetEngine to asIScriptStruct and asIScriptArray +
    • Replaced GetVarPointer and GetReturnPointer in the context interface with GetAddressOfVar and GetAddressOfReturnValue respectively +
    • Replaced GetArgPointer in the generic interface with GetAddressOfArg +
    • Added SetUserData/GetUserData to the engine interface +
    • Added the ParseToken method to the engine interface, useful for IDEs that provide syntax highlighting or intellisense +
    • Removed deprecated GetMethodDescriptorByIndex, GetMethodCount, GetMethodIDByIndex, GetMethodIDByName, GetMethodIDByDecl from engine interface +
    • Removed deprecated GetFunctionDeclaration, GetFunctionModule, GetFunctionSection, GetFunctionName from engine interface +
    • Removed deprecated SetDefaultContextStackSize from engine interface +
    • Added asIScriptModule, which will be used to interact with the modules directly, instead of through the engine interface +
    • Added GetModule to the engine +
    • Deprecated the methods in the engine for interacting with the modules, as these methods are now available in the module interface +
    • Added GetGlobalVarTypeId to the module interface. There were no corresponding method for this in the engine interface +
    • Renamed Discard in the engine interface to DiscardModule +
    • Modified the GetTypeIdByDecl in the engine interface to take only the declaration and not the module name +
    +
  • Library +
      +
    • Configured the library to work with Nintendo Wii (Thanks James Chan) +
    +
  • Project +
      +
    • Added as_criticalsection.h +
    • Moved as_c.cpp out of the main project, and into the C lib add-on project +
    +
  • Add-ons +
      +
    • Added CScriptBuilder with support for include directive and metadata through a pre-processing pass +
    • Improved const correctness to CScriptAny and CScriptDictionary +
    • Removed the 'as' prefix from CScriptString and CScriptFile +
    +
+ +

Version 2.14.1 - 2008/11/02

+ +
    +
  • Bug fixes +
      +
    • Removed the need to inform @ when performing explicit ref cast with an implicit ref cast behaviour +
    • Added the namespace macros to the scriptnode module (Thanks SiCrane) +
    • Fixed an application crash in the asCThreadManager when the script engine was released by a global var upon application exit (Thanks BornToCode and SiCrane) +
    • Fixed application freeze on compiling scripts that declare a const return value for class methods (Thanks SiCrane) +
    • Fixed some assert failures after compilation errors (Thanks SiCrane) +
    +
  • Library +
      +
    • Added engine property asEP_ALLOW_IMPLICIT_HANDLE_TYPES to turn on the experimental feature. +
    • Added compiler warning when compiling handle comparison where either of the operands have not been explicitly set as handle. +
    • Updated as_config.h to support MSVC 2008 + x64 processor (native calling conventions is still not supported). (Thanks wildmild and SiCrane) +
    • Improved thread safety in the library. +
    • Added multithread support for MacOS X, x86 and ppc +
    +
  • Script language +
      +
    • Added experimental support for implicit handle types. These are declared with 'class@ name {}' (Thanks George Yohng) +
    • Class methods can now be declared as 'const' in the script class declaration. +
    • Implemented the 'is' operator for identity comparisons, i.e. comparing two object handles. +
    +
  • Project +
      +
    • Added as_gc.h and as_gc.cpp, which holds the garbage collector previously in the script engine module. +
    • Added as_atomic.h and as_atomic.cpp, which provides a threadsafe reference counter. +
    +
+ +

Version 2.14.0 - 2008/10/05

+ +
    +
  • Bug fixes +
      +
    • Fixed some issues with the scoped reference type (Thanks Jeff Slutter) +
    • Improved validation of type flags on RegisterObjectType with asOBJ_VALUE (Thanks dxj19831029) +
    • Fixed bug with for loop that was not using primitives in the loop increment statement (Thanks jal) +
    +
  • Library interface +
      +
    • The C interface now has a dedicated header file with it's own project in the add_on directory. +
    • Added WriteMessage to the engine interface, for writing to the message callback. +
    • Deprecated GetGlobalVarIDByIndex, GetGlobalVarIDByName, GetGlobalVarIDByDecl, and GetGlobalVarPointer. +
    • Added GetGlobalVarIndexByName, GetGlobalVarIndexByDecl, and GetAddressOfGlobalVar. +
    • The method GetAddressOfGlobalVar that replaces GetGlobalVarPointer now returns the address of objects directly, rather than a pointer to the address of the objects, for object variables. +
    • Added asBEHAVE_IMPLICIT_VALUE_CAST to differenciate between implicit and explicit value cast behaviours. +
    +
  • Library +
      +
    • Identical interfaces declared in different modules will now share type id. +
    • Added constraint against multiple threads trying to compile scripts at the same time. +
    • The script compiler no longer uses constructor/factory behaviours in implicit value casts. +
    • The engine's GetObjectTypeCount and GetObjectTypeByIndex now return application registered types as well. +
    • The context can be used to call registered functions/class methods directly. +
    +
  • Script language +
      +
    • The cast<type>(expr) operator can now only be used for reference casts. Value casts must use the construct cast, i.e. type(expr). +
    +
+ +

Version 2.13.1 - 2008/08/17

+ +
    +
  • Bug fixes +
      +
    • Fixed reference casts when the source handle is a script class member (Thanks Marcin "Pris" Musial) +
    • Fixed the declaration of the CRITICAL_SECTION on 64 bit Windows (Thanks Viktor Levitin) +
    • Fixed bug with temporary variables being reused too early (Thanks loboWu and Dentoid) +
    • Fixed bug with temporary variable not being released (Thanks dxj19831029) +
    • Fixed bug with enum lists not ended with comma (Thanks Shurwint) +
    • Fixed bug with compiler optimization of constant expressions (Thanks loboWu) +
    +
  • Script language +
      +
    • Single quoted strings can now be used instead of double quoted strings. +
    +
  • Library interface +
      +
    • Added asEP_USE_CHARACTER_LITERALS to allow applications to interpret single quoted strings as character literals. +
    • Added asEP_ALLOW_MULTILINE_STRINGS that will allow the compiler to accept string constants with line breaks. +
    • Added extra validation to register functions to minimize user errors. +
    • Added support for asBEHAVE_IMPLICIT_REF_CAST. +
    +
  • Library +
      +
    • Added support for posix threads on the platforms that support it (Thanks kunitoki) +
    • Support for multithreading is now turned on by default, it can be turned off by defining AS_NO_THREADS. +
    +
+ +

Version 2.13.0 - 2008/06/08

+ +
    +
  • Bug fixes +
      +
    • Fixed compile error on non-standards compliant compilers, e.g. MSVC6 (Thanks Shurwint) +
    • Updated as_config.h to remove compiler warning for stdcall on 64bit linux (Thanks Alraz) +
    • Moved enum declarations to top of header to fix compile error on GNUC (Thanks Samuel E. Henley) +
    • Global variables declared with enum types crashed the engine (Thanks mono2k) +
    • Fixed bug with shift operators and byte operands that should have been converted to dword (Thanks loboWu) +
    • Fixed compile error on GNUC/Linux. (Thanks droz) +
    • bool[] objects didn't use the correct element size on Mac OS X with PPC (Thanks Edward Rudd) +
    • Enum values are now correct on big endian CPUs as well. +
    • Illegal casts without arguments would crash the compiler (Thanks loboWu) +
    • Fixed a bug in compiler that could make the script engine release invalid objects (Thanks Milleniumas) +
    • Fixed a bug where global arrays of handles where initialized with handles of other global variables (Thanks sunwoolee) +
    +
  • Library interface +
      +
    • Added engine property asEP_MAX_STACK_SIZE +
    • Added methods for enumerating object type methods and properties to the asIObjectType interface +
    • Added methods for enumerating parameter types to the asIScriptFunction interface +
    • Added GetFunctionDescriptorById to the asIScriptEngine interface +
    • Added methods for getting function declaration and script section to asIScriptFunction +
    • Deprecated SetDefaultContextStackSize in asIScriptEngine +
    • Deprecated GetFunctionName, GetFunctionDeclaration, GetFunctionModule, GetFunctionSection in asIScriptEngine +
    • Deprecated GetMethodCount, GetMethodIDByIndex, GetMethodIDByName, GetMethodIDByDecl, GetMethodDescriptorByIndex in asIScriptEngine +
    • Deprecated global behaviours LOGICAL_OR and LOGICAL_AND as these operators are exclusive to boolean types +
    • Added global behaviour asBEHAVE_REF_CAST, that allow explicit casts between handles to application registered types +
    +
  • Library +
      +
    • Added initial support for native calling conventions on 64bit platforms (Thanks niteice) +
    • Updated as_config.h to add support for native calling conventions on FreeBSD (Thanks Jeremy "droz" Harmon) +
    +
  • Project +
      +
    • Added as_callfunc_x64_gcc.cpp +
    +
+ +

Version 2.12.0 - 2008/03/22

+ +
    +
  • Bug fixes +
      +
    • Fixed assert failure when compiling if statement with incorrect expression (Thanks Chet Simpson) +
    • Fixed assert failure when returning an input reference by reference from script function (Thanks Chet Simpson) +
    • Fixed potential heap corruption when internally copying system function information (Thanks Chet Simpson) +
    • Fixed asOBJ_VALUE | asOBJ_APP_FLOAT with RegisterObjectType (Thanks RsblsbShawn) +
    • Fixed access to global variables when the object method is from another module (Thanks Chet Simpson) +
    • A const object can now be passed to a function expecting a non-const object by making a copy (Thanks Jeff Slutter) +
    • Fixed a bug in tokenizer on 64 bit platforms (Thanks DaBono) +
    +
  • Script language +
      +
    • Added typedef. Currently it allows to define aliases of built-in primitive types (Thanks Chet Simpson) +
    • Added enum. (Thanks Chet Simpson) +
    +
  • Library interface +
      +
    • Added RegisterEnum and RegisterEnumValue to asIScriptEngine (Thanks Chet Simpson) +
    • Added RegisterTypedef to asIScriptEngine (Thanks Chet Simpson) +
    • Added GetObjectTypeId, GetArgCount, and GetReturnTypeId to asIScriptGeneric. +
    • Added the asIObjectType interface (Thanks Chet Simpson) +
    • AngelScript is now capable of differentiating between global functions, class methods, and functions using the generic calling convention. +
    • Added asWRONG_CALLING_CONV return code when the wrong calling convention is used. +
    • Changed constants to enums for better grouping. +
    • Added asIScriptFunction interface (Thanks Chet Simpson) +
    +
+ +

Version 2.11.2 - 2008/01/21

+ +
    +
  • Bug fixes +
      +
    • Compiler didn't warn when using post incremental/decremental operator on uninitialized variable (Thanks Noelia Rodriguez Matilla) +
    • Switch cases didn't work properly for uint8 and uint16 types (Thanks Noelia Rodriguez Matilla) +
    • Compound assignments in conjunction with arrays could give incorrect results (Thanks loboWu) +
    +
  • Library interface +
      +
    • Added behaviour asBEHAVE_VALUE_CAST that allow objects to be cast to other types, including primitives +
    +
  • Library +
      +
    • ExecuteString no longer locks dynamic configuration groups. (Thanks mono2k) +
    • Compiler gives better error message when it cannot match class methods for a call (Thanks Jeremy Harmon) +
    +
+ +

Version 2.11.1 - 2007/12/16

+ +
    +
  • Bug fixes +
      +
    • Expressions that tried to use indexing operator on primitive types caused assert failure (Thanks Anders Hansson) +
    • GetFunctionIDByDecl returned asINVALID_DECLARATION for functions that returned or passed reference types by value (Thanks loboWu) +
    • Corrected as_config.h in regards to vsnprintf for MSVC9 (Thanks Schrompf) +
    +
  • Library interface +
      +
    • Added the new object type flag asOBJ_SCOPED, that allows applications to + register reference types that behaves like value types but with special memory management needs +
    +
  • Library +
      +
    • Compiler emits less error messages that are concequences of previously detected errors +
    +
+ +

Version 2.11.0 - 2007/11/30

+ +
    +
  • Bug fixes +
      +
    • Copying script classes that held object handles crashed (Thanks Jeff Slutter) +
    • Script class methods with the same name as an object type was incorrectly causing compilation error +
    • Compiler didn't find objects methods when compiling a method call if the method had the same name as an object type (Thanks Jeff Slutter) +
    • The bytecode optimizer failed in a specific situation (Thanks Jeff Slutter) +
    • The multithread support in as_thread.cpp was broken (Thanks Martin Kaeser) +
    • Garbage collector could in certain cases removed type definitions that were still needed causing application crashes (Thanks Jeff Slutter) +
    • Script classes inheriting from other classes didn't give a compiler error (Thanks Pris) +
    • The script allow called to non const methods for handles to const objects (Thanks virtualcodewarrior) +
    • Fixed a few null pointer accesses when passing null handles to and from application (Thanks behc) +
    • asIScriptContext::GetState can now return asEXECUTION_ABORTED as well (Thanks Anders Hansson) +
    • Fixed uint64 to double conversion +
    +
  • Library interface +
      +
    • Added new flags asOBJ_REF, asOBJ_VALUE, asOBJ_GC, asOBJ_POD, and asOBJ_NOHANDLE that represents how the type is intended to work in AngelScript +
    • Changed prefix for previous asOBJ flags to asOBJ_APP. They should only be used with asOBJ_VALUE. +
    • AngelScript now validates the behaviours, to check for missing behaviours or behaviours that shouldn't be registered for the type +
    • Types registered as reference counted won't be allowed to be passed by value to system functions, nor returned by value +
    • Reference types must now use the new FACTORY behaviour instead of the CONSTRUCT behaviour. +
    • Removed the asBEHAVE_ALLOC and asBEHAVE_FREE behaviours. +
    • Added Unprepare to context interface. +
    +
  • Library +
      +
    • Added native calling conventions for XBox 360 (Thanks Laszlo Perneky) +
    +
+ +

Version 2.10.0 - 2007/09/23

+ +
    +
  • Bug fixes +
      +
    • Fixed a bug with matching functions with boolean arguments (Thanks Jeff Slutter) +
    • CopyScriptObject is now able to copy registered types that have no registered copy behaviour (Thanks Jeff Slutter) +
    • Script classes crashed on construction with AS_MAX_PORTABILITY (Thanks Carlos Campaña) +
    • Fixed a null pointer access on stack clean up (Thanks Thomas Cowell) +
    • Fixed an assert failure in the compiler (Thanks Jeff Slutter) +
    • When compiling assignment the compiler made incorrect implicit conversions to object type (Thanks Anders Hansson) +
    • Fixed access violation in RegisterGlobalProperty when the property had already been registered in another group (Thanks mono2k) +
    • The condition operator didn't handle void expressions in the results (Thanks Anders Hansson) +
    • Comparison with local boolean variable toggled the variable's value (Thanks Anders Hansson) +
    +
  • Script language +
      +
    • The any type is no longer a built-in type +
    • Bitwise operators will maintain the signed/unsigned type of the left operand (Thanks Trikko) +
    +
  • Library interface +
      +
    • Added GCEnumCallback and NotifyGarbageCollectorOfNewObject to engine +
    • Added behaviours GETREFCOUNT, SETGCFLAG, GETGCFLAG, ENUMREFS, RELEASEREFS +
    • The any type is no longer a built-in type, thus the asIScriptAny interface + and the asTYPEID_SCRIPTANY constant have been removed (CScriptAny add-on was created to replace them) +
    • Added CompareScriptObjects method to engine (Thanks Jeff Slutter) +
    +
  • Project +
      +
    • Removed as_gcobject.cpp and as_gcobject.h +
    • Removed as_anyobject.cpp and as_anyobject.h +
    +
+ +

Version 2.9.1 - 2007/08/19

+ +
    +
  • Bug fixes +
      +
    • The default constructor wasn't called for script class members of script class types (Thanks Jeff Slutter) +
    • ReleaseScriptObject failed for types that didn't have the release behaviour, nor the destructor (Thanks Jeff Slutter) +
    +
  • Script language +
      +
    • Implemented support for destructors in the script classes. (Thanks Jeff Slutter) +
    +
+ +

Version 2.9.0 - 2007/08/12

+ +
    +
  • Bug fixes +
      +
    • Parser could hang on scripts with non-terminated strings. (Thanks derefed) +
    • Compiler died when compiling a return statement with a void expression. (Thanks SiCrane) +
    • A bug when calling class methods with 1 or 2 byte arguments was fixed for PPC, both 32bit and 64bit. (Thanks Jeff Slutter) +
    • Fixed a bug with &inout references and script class member variables (Thanks Jeff Slutter) +
    +
  • Library interface +
      +
    • GetGlobalVarPointer returns the pointer to the pointer to the object for object variables. Likewise for object handles a pointer to the object handle is returned (Thanks Jeff Slutter) +
    • Added GetArgByte(), GetArgWord(), SetReturnByte(), SetReturnWord() to asIScriptGeneric for better support on big endian processors +
    • Added SetArgByte(), SetArgWord(), GetReturnByte(), GetReturnWord() to asIScriptContext for better support on big endian processors +
    • GetArgDWord(), SetReturnDWord(), SetArgDWord(), and GetReturnDWord() now validates that type is 4 bytes +
    • Added GetThisTypeId and GetThisPointer to asIScriptContext (Thanks Jeff Slutter) +
    • GetTypeIdByDecl is now able to understand const type declarations. (Thanks Jeff Slutter) +
    • Added GetArgTypeId and GetFunctionId to the generic interface +
    • Removed the makeCopy parameter from AddScriptSection, and instead added a new engine property asEP_COPY_SCRIPT_SECTIONS +
    • Added CreateScriptObjectCopy, CopyScriptObject, AddRefScriptObject, ReleaseScriptObject, and GetSizeOfPrimitiveType to engine for easier development of generic container classes +
    • All methods for registering functions, methods, or behaviours are now returning the function id as a success indicator. Negative values still indicate an error. +
    • Implemented support for variable parameter type, ?&, in object constructor, object methods, and global functions +
    +
+ +

Version 2.8.1 - 2007/07/09

+ +
    +
  • Bug fixes +
      +
    • Fixed the behaviour of the AS_USE_NAMESPACE macro (Thanks SkunkGuru) +
    • Fixed misleading message when compiling statement like 'Object &ref' (Thanks Steve Williams) +
    • Fixed bug in compiler where it didn't reuse temporary variables properly +
    • Fixed problem with C++ compiler optimizations that changed the result of AngelScript code and thus breaking (Thanks Jeff Slutter) +
    • Fixed the as_config.h file for GNUC/Apple +
    • Fixed conversion of negative floating point values to unsigned int on GNUC based compilers +
    • Fixed bug with booleans returned from functions that didn't evaluate to false when expected. (Thanks Rakkar2) +
    • Fixed bug where the compiler failed when passing constant references as function parameters. (Thanks Rakkar2) +
    • Engine no longer permits the registration of functions with void parameters (Thanks Juan Pablo Bettini) +
    • Fixed compiler assert when assigning a void value to a variable (Thanks Anders Hansson) +
    • Fixed bug in compiler where the property name wasn't validated correctly for name conflicts (Thanks Andy R) +
    • Fixed intermittent bug in the byte code optimization that affected only big endian processors. +
    • Fixed incorrect name conflict between script class methods and global functions (Thanks Anders Hansson) +
    • Fixed assertion failure when declaring variables as void (Thanks Anders Hansson) +
    • Fixed bug with GetGlobalVarID that didn't return the id with the moduleId (Thanks Julian Storer) +
    • Fixed bug with initialization lists for arrays of object handles. +
    • Fixed bug with loading bytecode that used registered array types. (Thanks Juan Pablo Bettini) +
    • Fixed bug with loading bytecode with script classes that were declared out of order. (Thanks Juan Pablo Bettini) +
    • Fixed bug where CHKREF was placed incorrectly to verify only the first parameter on the stack. (Thanks CyberGorgolith) +
    • Fixed bug with boolean operations that treated false values as true due to trash data in upper bytes of the boolean variable. +
    • The default constructor for script classes wasn't called for classes in arrays. (Thanks Jeff Slutter) +
    • Fixed bug with explicit handle for class members and array elements (Thanks Juan Pablo Bettini) +
    +
  • Library +
      +
    • Improved memory foot print of the compiler. +
    • When parsing statements the parser now has full knowledge of available + types so it is able to better distinguish the true semantic of identifiers. +
    • Added support for PS3 native calling conventions. (Thanks Jeff Slutter) +
    • GNUC assembler for native calling conventions now guarantee stack pointer alignment on 16 bytes. +
    • Added support for Mac OS X with Intel native calling conventions. +
    • Added support for Mac OS X with PPC native calling conventions. +
    +
  • Library interface +
      +
    • Added OPTIMIZE_BYTECODE as engine property. +
    • Removed restriction on registered object type's sizes, they can now be of any size, even non-multiple of 4. (Thanks Tonin) +
    +
  • Virtual machine +
      +
    • New byte codes: ChkNullS, ClrHi +
    +
  • Project +
      +
    • Added as_callfunc_ppc_64.cpp +
    +
+ + +

Version 2.8.0a - 2007/02/18

+ +
    +
  • Bug fixes +
      +
    • Fixed memory leak with exception handler inside script class method +
    • Fixed the DELETEARRAY macro that didn't work on gnuc (Thanks Jeremy "droz" Harmon) +
    +
  • Library +
      +
    • Improved the memory management facility +
    • Added the config option AS_NO_USER_ALLOC. Define this to turn off the user defined memory + managements. The default memory management in the library may not be compatible with all compilers yet. By + defining this macro when you compile the library, you should be able to use the library anyway, though + without the functionality of asSetGlobalMemoryFunctions(). +
    +
  • Project +
      +
    • Removed as_objectarray.h +
    +
+ +

Version 2.8.0 - 2007/02/04

+ +
    +
  • Bug fixes +
      +
    • Fixed incorrect use of temporary variables during evaluation of function argument expressions (Thanks Gilad Novik) +
    • Fixed error with exception handler inside script class method (Thanks Anders "Dentoid" Stenberg) +
    +
  • Library interface +
      +
    • Added Set/GetEngineProperty() that will allow you to dynamically changes some settings that previously required a recompilation of the library. +
    • ALLOW_UNSAFE_REFERENCES is now an engine property instead of a compile time flag. +
    • Removed some deprecated functions. +
    • Added GetArgPointer() and GetReturnPointer() to asIScriptContext and asIScriptGeneric. +
    • Removed the SetCommonObjectMemoryFunctions() from the script engine. +
    • Added the global SetGlobalMemoryFunctions() and ResetGlobalMemoryFunctions(). +
    • Added SetUserData() and GetUserData() to the context interface (Thanks Steve Williams) +
    +
  • Library +
      +
    • Fixed a lot of compiler warnings (Thanks Manu Evans) +
    • All dynamically allocated memory now uses the memory functions registered with SetGlobalMemoryFunctions. +
    • By changing the asCString implementation I was able to decrease the number of memory allocations by 15%. +
    +
  • Script language +
      +
    • Deprecated the bits type. All bitwise operators are now performed on the uint type. There is no longer any bitwise conversion of float to uint. +
    • Added the int64 and uint64 types. +
    • The this keyword is now optional when accessing class members from within a class method. +
    • Object constructors can now be used to perform implicit conversions in expressions. +
    +
  • Virtual machine +
      +
    • New byte codes: + i64TOi, uTOi64, iTOi64, fTOi64, dTOi64, fTOu64, dTOu64, i64TOf, u64TOf, i64TOd, u64TOd, + NEGi64, INCi64, DECi64, BNOT64, + ADDi64, SUBi64, MULi64, DIVi64, MODi64, + BAND64, BOR64, BXOR64, BSLL64, BSRL64, BSRA64 + CMPi64, CMPu64 +
    +
  • Project +
      +
    • Added as_memory.h, as_memory.cpp, and as_objectarray.h +
    +
+ +

Version 2.7.1b - 2006/12/03

+ +
    +
  • Bug fixes +
      +
    • Save/load of bytecode followed by ExecuteString() that called one of the script functions failed during compilation. (Thanks coollofty) +
    +
+ +

Version 2.7.1a - 2006/11/04

+ +
    +
  • Bug fixes +
      +
    • Constant bits8 and bits16 variables didn't work properly (Thanks Cheetah3d) +
    +
+ +

Version 2.7.1 - 2006/11/02

+ +
    +
  • Bug fixes +
      +
    • Minor bug fix with an incorrect error message (Thanks Alraz) +
    • Empty switch statements would crash the compiler (Thanks the_bateman) +
    • Registering global properties didn't update a cache in compiled script modules, sometimes invalidating pointers (Thanks Anthony Rufrano, a.k.a "paradoxnj") +
    • Fixed compiler differences for 64bit integer constants +
    • Fixed some compiler asserts (Thanks Anders Hansson) +
    • The index operator on handles to array objects didn't work (Thanks Anders Hansson) +
    • The compiler would crash if a script class inherited from an undeclared type (Thanks Anders Hansson) +
    • The compiler incorrectly reused temporary variables (Thanks MrC_XBMC) +
    +
  • Library +
      +
    • The non-reserved tokens, any, from, and this, are now also defined in the as_tokendef.h file (Thanks Deyja) +
    • Adjustments have been made to make the library indepentent of CPU memory layout of words. This if for PPC. (Thanks Edward Rudd) +
    • Cleaned up as_config.h to make it easier to maintain +
    • Changed compiler to do proper conversion between types of different sizes, for the sake of big-endian CPUs. +
    +
  • Script language +
      +
    • Added the reserved keyword 'cast' +
    • Support for dynamic casts between object handles with cast<type>(expr) +
    +
  • Virtual machine +
      +
    • Added byte codes iTOb, iTOw, SetV1, and SetV2 to support big endian CPUs +
    • Added byte code Cast for dynamic casts of object handles +
    +
+ +

Version 2.7.0 - 2006/07/23

+ +
    +
  • Bug fixes +
      +
    • Fixed a problem with script classes and multiple modules where the engine failed to find the class methods (Thanks Dentoid) +
    • Fixed bug where an assert fails when the operands for an assignment has compiler errors (Thanks Dentoid) +
    • Parser entered endless loop if the script ended before closing the class declaration (Thanks Dentoid) +
    • Parser entered endless loop if a method declaration had syntax error (Thanks kunitoki) +
    • Fixed assert hit for some compiler errors (Thanks kunitoki) +
    • Discard() would remove array types from the configuration, leading to failure in following builds (Thanks loboWu) +
    • Fixed bug with the any type and AS_MAX_PORTABILITY +
    • Fixed bug with AS_MAX_PORTABILITY and script classes that were not constructed properly +
    • Fixed a bug with the bytecode optimization for 64bit processors +
    • Fixed some bugs with the internal array object and AS_MAX_PORTABILITY and AS_64BIT_PTR +
    • Fixed bug with null value and AS_64BIT_PTR +
    • Fixed some bugs in the virtual machine on 64bit processors +
    • Added check to see if script property has a size 0 (Thanks Maddi) +
    +
  • Library interface +
      +
    • The engine methods GetMethodCount(), GetMethodIDByIndex(), GetMethodIDByName(), and GetMethodIDByDecl() were changed to take the typeId instead of the module name and object type name. This makes it unnecessary to know the module if you only have the type id, and it is also much more efficient. +
    • Added methods RegisterInterface() and RegisterInterfaceMethod() that allow the application to register a script interface which can be passed to the application +
    • Added method GetFunctionModule() +
    • Deprecated the methods GetModuleIndex() and GetModuleNameFromIndex() +
    • Added GetVarTypeId() to the context interface +
    • Replaced SetCommonMessageStream() with SetMessageCallback() which is more flexible in that it receives a structure with info instead of a string +
    • asIOutputStream is removed +
    • Added asGetLibraryOptions() which returns a string with the compile time options. Mostly used for testing. +
    +
  • Library +
      +
    • Applied changes to make the library work better with 64bit platforms (Thanks Yiannis Mandravellos) +
    • Fixed a couple of compiler warnings (Thanks Alraz) +
    • Added support for native calling conventions on MIPS processors. (Contribution by Manu Evans) +
    • Added first support for native calling conventions on PPC processors. (Contribution by Pecan Heber) +
    • Unified the way registered functions and script functions are stored in the engine +
    • Improved performance of Prepare() when using the same function as last Prepare() +
    +
  • Script language +
      +
    • Added new token 'interface' +
    • Semi-colon after class declaration is now optional +
    • It's now possible to declare interfaces in the scripts +
    • Added support for the '\t' escape sequence in strings. (Thanks Lbas) +
    • Deprecated the keyword 'struct' in the script language +
    +
  • Virtual machine +
      +
    • Added bytecode CALLINTF which resolves interface methods to the real class method +
    +
  • Project +
      +
    • Added as_callfunc_mips.cpp +
    • Added as_callfunc_ppc.cpp +
    +
+ +

Version 2.6.0 - 2006/04/08

+ +
    +
  • Bug fixes +
      +
    • Fixed a bug with RegisterGlobalProperty() (Thanks loboWu) +
    • Type conversions may now be used in initialization of global variables. (Thanks iram) +
    +
  • Script language +
      +
    • It's now possible to define class methods and constructors for the script declared structures. The definition of the method must be written inside the struct declaration. +
    • The this keyword can be used to access the object and its members from within the class method. It's not yet possible to access the struct members without using the this keyword. +
    • Added the keyword 'class' as synonym for 'struct' +
    • For &inout parameter references the 'inout' keyword is now optional +
    • Only object types that support object handles can now use the &inout parameter references. Other types must use &in or &out, unless AS_ALLOW_UNSAFE_REFERENCES is defined. +
    • Added the reserved keyword: int64. Currently this is only used internally, but in time it will be a fully implemented primitive. +
    +
  • Library interface +
      +
    • Removed the deprecated version of the Build() method. +
    • Added SetArgAddress() and GetReturnAddress() methods to the context interface. These should be used to handle references +
    • Added GetArgAddress() and SetReturnAddress() methods to the generic interface. +
    • Changed AddScriptSection() to accept a size_t for the script length instead of int +
    • Improved the way the [Set|Get][Arg|Return][Address|Object]() methods work. +
    • Added the method SetObject() to the context for calling object methods +
    • ExecuteString() now adds a line break after the given string. This allows for one-line comments to be used without producing an invalid script. (Thanks B_old) +
    • Added the methods GetMethodCount(), GetMethodIDByIndex(), GetMethodIDByName(), and GetMethodIDByDecl() that should be used to obtain the function id for a script declared class method. +
    +
  • Library +
      +
    • Fixed a lot but not all of the compiler warnings that MSVC8 reports for 64bit incompatibilities. +
    • If native calling conventions are not supported for the target platform, then AS_MAX_PORTABILITY will automatically be defined to allow compilation of the library. (Thanks mandrav) +
    • Added a new compiler flag AS_64BIT_PTR, which should be defined for 64bit platforms. Ideally the as_config.h file should automatically set the flag according to the target platform. When this flag is defined, all pointers will be stored in the bytecode as 64bit words. +
    • Made improvements to better handle 64bit platforms +
    +
+ +

Version 2.5.0c - 2006/02/16

+ +
    +
  • Bug fixes +
      +
    • Using named constants, i.e. variables declared and initialized with constants, would in certain situations give the wrong value. (Thanks Villemon) +
    • Added null checks to fix memory access failure related to dynamic configurations. (Thanks mandrav) +
    +
  • Project +
      +
    • Removed as_structs.h +
    +
+ +

Version 2.5.0b - 2006/01/31

+ +
    +
  • Bug fixes +
      +
    • Comparison with object handle in a local variable produced incorrect byte code. (Thanks Villemon) +
    • A bug in the VM for the BC_ChkNullV byte code caused script exceptions when using asCScriptString compiled with VC++ 2005. (Thanks topcatse) +
    • When releasing the engine, the internal resources were released in the wrong order, causing assert failures in the memory manager with VC++ 2005. +
    • The assignment operator for the internal type 'any' wasn't properly registered, causing memory management problems. +
    • Global variables were not initialized properly when loading pre-compiled bytecode. (Thanks Villemon) +
    +
+ +

Version 2.5.0a - 2006/01/20

+ +
    +
  • Bug fixes +
      +
    • Using assignment behaviours that took a reference as &inout with asALLOW_UNSAFE_REFERENCES would crash the application. (Thanks Deyja) +
    • Using the default constructor for script structures to create temporary objects didn't work. +
    +
+ +

Version 2.5.0 - 2006/01/12

+ +
    +
  • Bug fixes +
      +
    • asCALL_CDECL_OBJLAST that returned objects by value didn't work correctly (Thanks Deyja) +
    +
  • Script language +
      +
    • Primitive types can be implicitly converted to a reference of another primitive type for function calls. This is something C++ doesn't accept. +
    • Parameter reference specified as &inout no longer copies the value. The argument is only computed once. The function receives a reference to the true value. Expressions where the reference cannot be guaranteed during the execution of the function generates a compiler error. The value must then be copied to a local variable instead. +
    • Added support for character literals. +
    +
  • Library interface +
      +
    • Overloaded operators may now use &inout references. Since this type of references now guarantees a pointer to the true object this is useful if the operand has to be modified, e.g. a stream class. +
    • Overloaded operators may now use &out references. The order of evaluation will change, but precedence order is kept. +
    • Added functions to the asIScriptContext interface that allow the application to enumerate variables on the stack and examine their values. (Thanks Ivan Marinov) +
    +
  • Library +
      +
    • A couple of minor code changes to make it easier to compile the library on Metrowerks CodeWarrior for NintendoDS (Thanks Fumihiro KanaYA) +
    • The script compiler was changed to generate less copies of objects when doing function parameters by reference. +
    • Added a new compile time flag: AS_ALLOW_UNSAFE_REFERENCES. When this is defined the library will allow parameter references without the in, out, or inout keywords. These parameters references will also work just like normal C++ parameter references, without any restrictions. +
    +
  • Virtual Machine +
      +
    • The VM has been changed to use three op instructions instead of stack based instructions. In some situations the new VM is faster, in others it is about the same. +
    +
  • Project +
      +
    • as_types.h was removed. +
    +
+ +

Version 2.4.1e - 2006/02/04

+ +
    +
  • Bug fixes +
      +
    • When releasing the engine, the internal resources were released in the wrong order, causing assert failures in the memory manager with VC++ 2005. +
    • The assignment operator for the internal type 'any' wasn't properly registered, causing memory management problems. +
    • asCALL_CDECL_OBJLAST that returned objects by value didn't work correctly (Thanks Deyja) +
    • Global variables were not initialized properly when loading pre-compiled bytecode. (Thanks Villemon) +
    • Using the default constructor for script structures to create temporary objects didn't work. +
    • Comparison with boolean values resulted in the value -1 instead of 1. +
    +
+ +

Version 2.4.1d - 2005/12/09

+ +
    +
  • Bug fixes +
      +
    • The compiler didn't raise an error when doing an handle assignment where the lvalue was a normal object (Thanks Lbas) +
    +
+ +

Version 2.4.1c - 2005/11/22

+ +
    +
  • Bug fixes +
      +
    • Overloaded indexing operators that take an object as parameter and returns a reference, crashed the application when compiling the script. (Thanks Desdemona) +
    +
+ +

Version 2.4.1b - 2005/11/08

+ +
    +
  • Bug fixes +
      +
    • Chained expressions with overloaded operators and registered types could cause null pointer violations (continued) (Thanks __Avatar__) +
    +
+ +

Version 2.4.1a - 2005/10/18

+ +
    +
  • Bug fixes +
      +
    • Registering global properties, after removing a config group with global properties, caused a null pointer violation. (Thanks DaesDemon) +
    • An assert failed when initializing variables with a function that took reference parameters. (Thanks mandrav) +
    • Chained expressions with overloaded operators and registered types could cause null pointer violations. (Thanks Anders Stenberg, a.k.a Dentoid) +
    • Expressions with multiple levels of indirections (.) and object handles as arguments in each level, caused incorrect bytecode. (Thanks Vexorian) +
    +
+ +

Version 2.4.1 - 2005/09/23

+ +
    +
  • Script language +
      +
    • Added support for heredoc string constants. (Thanks Ashish Ranjan) +
    • Added support for array initialization lists. +
    +
+ +

Version 2.4.0 - 2005/09/15

+ +
    +
  • Bug fixes +
      +
    • The bitwise negate operator, ~, now works with integer types as well, e.g. int and uint. (Thanks Suudy) +
    • Save and load of compiled bytecode with script arrays now work. (Thanks Evgeny Efremov, a.k.a wolfenstein) +
    +
  • Library interface +
      +
    • Added methods BeginConfigGroup(), EndConfigGroup(), and RemoveConfigGroup() for asIScriptEngine. +
    • The engine no longer allow overriding the array types if they are already being used elsewhere. +
    • All methods taking asUPtr as parameter was changed to take const asUPtr& instead, which ought to help avoid ESP problems that some people have encountered. +
    • Added an optional namespace. Define the flag AS_USE_NAMESPACE when compiling to put the script engine in the namespace AngelScript. +
    • Added a method SetCommonObjectMemoryFunctions() that allow the application to register an alloc()/free() function pair that will be used for all script objects. +
    • asIBinaryStream was changed to use asUINT instead of int for the block size, and const void * instead of void * for Write(). +
    • Added a method SetCommonMessageStream(). The engine uses this output stream to output error messages when registering configurations, and also if the Build() method is called with a null pointer for the output stream. A second version of this method is available that takes a simple function pointer and an optional parameter, like a normal callback function. +
    • Build() and ExecuteString() no longer takes a pointer to an asIOutputStream. The old version is still available by defining the flag AS_DEPRECATED. +
    • Added method SetConfigGroupModuleAccess() which is used to set both default module access mode and individual module accesses. +
    +
  • Script language +
      +
    • Constant variables that are initialized with a constant expression, can now be used as named constants in for example switch cases. (Thanks juhnu) +
    +
  • Library +
      +
    • Changed the way the modules free global variables. Instead of a script function, it is now just a simple loop freeing each of the variables. +
    • asBSTR is no longer used internally to store constant strings, asCString is used instead. +
    • Converted the asCMap to template code. +
    • The assembler VM was removed as it will no longer be possible to keep it compatible with the C++ VM. +
    +
  • Project +
      +
    • Added as_configgroup.cpp and as_configgroup.h. +
    • Removed as_map.cpp +
    • Removed as_context_x86.cpp +
    • Removed as_bstr_util.cpp and as_bstr_util.h. +
    +
+ +

Version 2.3.0b - 2005/08/09

+ +
    +
  • Bug fixes +
      +
    • Parameters where freed before the returned reference was used, which caused errors if the reference pointed to one of the parameters. (Thanks Suudy) +
    +
+ +

Version 2.3.0a - 2005/07/29

+ +
    +
  • Bug fixes +
      +
    • Structure definitions and function declarations where not order independent. (Thanks Carl dahl) +
    • Added the old CreateContext() and GetGlobalVarPointer() as deprecated methods. +
    • Fixed some more compiler warnings. +
    +
+ +

Version 2.3.0 - 2005/07/14

+ +
    +
  • Bug fixes +
      +
    • RegisterGlobalProperty() for object handles wasn't working correctly, the wrong address was used by the VM. +
    • The C interface for asIScriptGeneric wasn't declared correctly. +
    • Fixed a few compiler warnings. (Thanks Rain Dog) +
    • When calling methods on null handles, the application crashed with a memory access violation (Thanks Robert Manuszewski) +
    • If accessing the elements of a script array handle, the compiler wrongly made the elements handles as well (Thanks Scott Dillman, a.k.a AlphaDog) +
    +
  • Library interface +
      +
    • Added an interface to manipulate the any type, asIScriptAny. +
    • Added an interface to manipulate script structures, asIScriptStruct. +
    • Added an interface to manipulate script arrays, asIScriptArray. +
    • Added methods GetTypeIdByDecl() and GetTypeDeclaration(). +
    • Added the method asIScriptEngine::CreateScriptObject() that allow the application to create objects from a type id. +
    • Added the method asIScriptEngine::GetObjectsInGarbageCollectorCount() + which can be used to finetune how often the GarbageCollect() is called. +
    • Changed the asIScriptEngine::CreateContext() to return the context pointer instead of placing it in the parameter. +
    • asIScriptEngine::GetGlobalVarPointer() now returns the pointer directly, instead of putting it in the argument. +
    • Removed the deprecated asIScriptContext::ExecuteStep(). +
    +
  • Script language +
      +
    • New built-in type: any. This type will be able to hold any other type, as a generic container, though currently it can only hold object handles. It is possible to pass this type to the application. +
    +
  • Library +
      +
    • Changed the implementation for asCGCObject, since it is not possible to use multiple inheritance with anonymous pointers. +
    • Slimmed down the internal datatype representation, for the typeid feature. +
    +
  • Virtual machine +
      +
    • A new bytecode TYPEID has been implemented. +
    • The object types are now passed as pointers directly in the bytecode, instead of by index. +
    +
  • Project +
      +
    • Added as_anyobject.h and as_anyobject.cpp +
    +
+ +

Version 2.2.0 - 2005/06/08

+ +
    +
  • Script language +
      +
    • New reserved keyword: struct +
    • The scripts can now declare and use structures. +
    • The compiler now automatically converts objects to object handles, when it is obvious a handle is wanted, i.e. there will be less need to use the @ operator. +
    +
  • Library interface +
      +
    • It is now possible to tell the library to automatically handle reference for handles passed to and from application functions. Simply add a + after the @. This makes it possible to pass handles to functions that do not call the release method before returning. +
    • A new method GarbageCollect() has been implemented that will free unused script objects. For long running programs it is necessary to call this every now and then. It can do either a full cycle or just a small incremental step, depending on the needs of the application. +
    +
  • Virtual machine +
      +
    • The bytecode now identifies object types locally to each module. +
    • There is a new bytecode OBJTYPE that translates a local object type id to the engine's object type id. +
    +
  • Library +
      +
    • Added a new preprocessor flag, AS_MAX_PORTABILITY, which removes all calls to assembler routines, which should make the library work on all platforms. In this mode, only asCALL_GENERIC can be used for application functions. +
    • Changed the internal data type description class to be easier to work with. The intention is to allow the application to access this to get information about types for global variables, function declarations, etc. +
    • Changed the implementation of the internal script array object to work more similar to the way script structures work. +
    +
  • Project +
      +
    • New files: as_scriptstruct.cpp and as_scriptstruct.h +
    • Added as_callfunc.cpp which implements the portable functions when AS_MAX_PORTABILITY is defined. +
    • Added the files as_gcobject.h and as_gcobject.cpp +
    +
+ +

Version 2.1.0c - 2005/05/26

+ +
    +
  • Bug fixes +
      +
    • When getting the function declaration the library didn't set the 'in', 'out', 'inout' flags for parameter references (Thanks Andrey Kraynov, a.k.a _Dreamer) +
    • After loading precompiled bytecode script functions that took objects by handle couldn't be identified (Thanks Andrey Kraynov, a.k.a _Dreamer) +
    +
+ +

Version 2.1.0b - 2005/04/25

+ +
    +
  • Bug fixes +
      +
    • The C interface wasn't exporting the functions. (Thanks Lars Peter Christiansen) +
    • Variables of types int and uint of any size weren't implicitly converted to bits. +
    • Uninitialized variables passed to &out parameters were incorrectly reported as uninitialized. +
    • The compiler was accepting assignments of any type to objects with no registered assignment operator. +
    +
+ +

Version 2.1.0a - 2005/04/11

+ +
    +
  • Bug fixes +
      +
    • The null pointer access in the compiler when matching function arguments was removed (Thanks Lennart Denninger) +
    • The ?: operator was reusing temporary variables incorrectly. +
    • The compiler failed to compile the boolean not operator for variables. (Thanks SharkBait) +
    +
+ +

Version 2.1.0 - 2005/04/03

+ +
    +
  • Bug fixes +
      +
    • The line numbers reported by the VM were incorrect. +
    • GetGlobalVarPointer() was returning a pointer to a pointer for registered object types. (Thanks Rain Dog) +
    • Fixed a possible crash when calling AddScriptSection() with 0 for section name. +
    • The operands for overloaded operators are now evaluated left-to-right. +
    • Output parameters weren't working correctly for object methods (Thanks Mrten Svanfeldt, a.k.a thebolt00) +
    • The engine failed when calling registered functions that received objects both by value and by reference (Thanks Lennart Denninger) +
    • Registered object types without registered constructor couldn't be used to create temporary objects in expressions. +
    • Global variables couldn't use overloaded assignment operators to initialize the variables. +
    • Object properties declared as object handles were not handled correctly by the compiler. +
    • Fixed a bug that crashed the application when compiling a function declared with a void parameter. (Thanks SharkBait) +
    • Sending complex objects by value to class methods caused a crash on GNUC based compilers. (Thanks Torsten, a.k.a torsten_pf) +
    • Passing objects by reference to constructors in declarations caused an assert failure. (Thanks Rain Dog) +
    +
  • Script language +
      +
    • The script language now allows statements like: func(expr), where the function doesn't take any arguments and + the expression evaluates to a void type. This is especially useful when using dynamically generating scripts where + the expression type isn't known before hand. +
    • Object variables and properties can be declared as const again +
    • Properties of a const object are automatically const as well +
    • When the object is const, the compiler doesn't allow non-const methods to be called +
    • It is possible to take a handle for a const object, but it can only be assigned to a handle to a const object +
    • The object held by a handle that is member of a const object, is not automatically const +
    • An object handle that is member of a const object is also const +
    • Const can be used for parameters again +
    +
  • Virtual machine +
      +
    • The calling convention used by the script engine now passes the object pointer as the first parameter instead of the last. +
    • GETOBJ was changed to read the offset from the stack instead of the address to the variable. +
    • Added GETOBJREF and GETREF to handle parameter references. +
    • Parameter references to overloaded operators are also protected by copying them to temporary variables. +
    • Added SWAP48 and SWAP84 to swap two values of different bytesizes. +
    • The compiler has been changed to output bytecode that don't keep unprotected pointers on the stack where they cannot be controlled. This will prove especially useful when I will later implement context serialization and co-routines. +
    • Calling the constructors with arguments are now also protected by not pushing the object pointer on the stack before the arguments. +
    +
  • Library interface +
      +
    • Implemented a C wrapper for the library. Compile the library with AS_C_INTERFACE to use it. +
    • Added a dummy array in asUPtr to make the size equal on all compilers (even when the C++ interface is disabled) +
    • Added SetLineCallback()/ClearLineCallback() to the context interface. These should be used instead of ExecuteStep() to control how much is executed each frame. +
    • Added SetExceptionCallback()/ClearExceptionCallback() to the context interface. These methods can be used for debugging purposes and allow the application to examine the callstack when an exception is raised. +
    • Added GetCallstackSize() and GetCallstackFunction() to the context interface. +
    • Added the possibility to turn off support for registering class methods. Compile the library with AS_NO_CLASS_METHODS. This can be used on compilers where class methods don't currently work. +
    • Added GetFunctionSection() to the engine interface. +
    • ExecuteStep() is now a deprecated method. Use the line callback method instead, which is much more flexible. +
    • Added GetCallstackLineNumber() to the context interface. +
    • All methods that return line numbers can now optionally return column number as well. +
    • Added the asCALL_GENERIC flag for functions using the generic calling convention. +
    • Added a new asIScriptGeneric interface for handling generic functions. +
    • Added GetObject() to the generic interface, that will return the object pointer when a method function using the generic calling convention is called. +
    • Added GetArgDWord(), GetArgQWord(), GetArgFloat(), GetArgDouble(), and GetArgObject() to the generic interface. +
    • Added SetReturnDWord(), SetReturnQWord(), SetReturnFloat(), SetReturnDouble(), and SetReturnObject() to the generic interface. +
    • Added two new behaviours asBEHAVE_ALLOC and asBEHAVE_FREE, that can be used to register custom memory allocation functions for an object type. +
    • Overloaded operators have been limited to only allow parameter references marked as 'in' (non-references are still allowed). This means that you cannot rely on that you receive a reference to the actual operand, as it might be a copy. +
    • The extra call to addref/release for the object pointer when calling class methods has been removed. The responsibility of making sure the pointer is valid during the call has been moved to the application. +
    • RegisterObjectType() now returns asALREADY_REGISTERED if name has already been registered as a type. (Suggestion by Adrian Licu) +
    • It is now possible to declare object methods as const, so that they can be called for constant objects. Ex: "void GetVal() const" +
    • Const overloading is now available for object behaviours and methods, i.e. if the object is const then the const version will be used, otherwise the non-const version will be used. +
    • AddScriptSection() now has an extra parameter that can be used to tell the library not to make a copy of the script code, and instead use the original pointer directly. (Thanks Adrian Licu) +
    • A new method ResetModule() was added to the engine. This can be used to reset the value of global variables for a module. +
    +
  • Project +
      +
    • Added as_generic.cpp and as_generic.h with the interface for generic functions. +
    • Removed the #include <memory.h> from the angelscript.h file. +
    • Added as_c.cpp with the C wrapper functions. +
    +
+ +

Version 2.0.0a - 2005/01/31

+ +
    +
  • Bug fixes +
      +
    • GetCurrentFunction() and GetExceptionFunction() didn't return the function ID with the module index, affecting applications that were using module bindings (Thanks Tomas Stepanek) +
    • The library crashed when trying to register a function that used a handle to a type that had no addref/release behaviours registered (Thanks Adrian Licu) +
    • It wasn't possible to return null in a function which return type is a handle (Thanks Adrian Licu) +
    • Passing object handles by value to application functions could cause a crash (Thanks Adrian Licu) +
    • Fixed a minor memory leak when RegisterGlobalFunction() failed. +
    +
+ +

Version 2.0.0 - 2005/01/23

+ +
    +
  • Bug fixes +
      +
    • GNUC: Classes with destructors can now be sent by value to system functions +
    • The compiler failed to successfully parse/compile temporary array constructors, e.g. int[](3). +
    • On GCC/Linux all classes/structs are returned in memory regardless of size, complexity, or calling convention. (Thanks Fredrik Ehnbom) +
    • Some compilers complained about the negative array size in the template code that is never instanciated. The code was commented. +
    • Overloaded assignment operators that take types other than the target can now be used in initializations. (Thanks Alan Kemp) +
    • asGetActiveContext() would cause an assert failure if called when no context was active. (Thanks Chee Chong Tay, a.k.a Iram) +
    • It was not possible to register arrays of registered types. (Thanks Tomas Stepanek) +
    + +
  • Library interface +
      +
    • Removed deprecated functionality +
    • Removed the flag asOBJ_GUESS for RegisterObjectType(). +
    • Removed the macros asFUNCTIONP() and asMETHODP(). +
    • Removed GetReturnValue() +
    • Added GetReturnDWord(), GetReturnQWord(), GetReturnFloat(), GetReturnDouble(), and GetReturnObject() +
    • Removed SetArguments() +
    • Added SetArgDWord(), SetArgQWord(), SetArgFloat(), SetArgDouble(), SetArgObject() +
    • Protected destructors have been added to the interfaces so that the application doesn't call them by mistake (thanks Dan "Aggrav8d" Royer) +
    • Function declarations with arguments by ref must use the in, out, or inout flags +
    • Added the behaviours ADDREF and RELEASE that will be used by object handles to do memory management +
    • New context state: asEXECUTION_ERROR, that is set if one of the SetArg...() functions failed. +
    + +
  • Script language +
      +
    • Removed the pointer type modifier +
    • Removed the -> operator +
    • In declarations the array brackets are now part of the type, i.e. for "int[] a, b;" both a and b are arrays +
    • Arrays can now be resized by using the method resize(). +
    • Parameter references are now protected by copying the value into a + temporary variable when calling the function, and then copying the + temporary variable back to the original location when the function + returns. The expression is computed twice for in/out references. +
    • Function parameters by reference should use the flags in, out, or inout to allow the compiler to optimize the use of the parameters. +
    • Added the object handle type modifier so that object handles can be declared. The token @ is used so as not to confuse it with C++ pointers or references. +
    • Added the null keyword for object handles. +
    • const is now only available for variable and property declarations, and only for primitive types. This change was made for consistency and because the script language was not able to guarantee that an object isn't changed by object methods. +
    • Arrays have been limited to only allow four dimensions +
    + +
  • Virtual machine +
      +
    • Removed the bytecode ADDOFF +
    • Objects are stored in dynamically allocated memory. A pointer to the memory is stored on the stack +
    • Created ALLOC/FREE instructions for allocating and freeing the objects +
    • Objects are returned in a register +
    • Created LOADOBJ/STOREOBJ that moves an object pointer from a variable into the object register, and vice versa +
    • Created GETOBJ which moves an object pointer from a reference to the stack, overwriting the reference +
    • Removed END and PEID. +
    • Simplified the exception handler to free objects based only on their position on the stack +
    • A script function receives an object by value and by ref the same way. The difference is if the function is the owner of the object or not. +
    • Added REFCPY to support reference assignments for object handles +
    • Added CHKREF to validate object handles when used as normal objects +
    • Added the bytecodes RD1 and RD2 to fix alignment problems on CPUs that requires data to be aligned. +
    • The VM keeps a reference to the object when calling a method, to protect the object from being released before the method returns. +
    + +
  • Library +
      +
    • The library was made to work with Dreamcast once more. (Thanks Fredrik Ehnbom) +
    • The compile time flag BUILD_WITH_LINE_CUES was replaced with BUILD_WITHOUT_LINE_CUES. This flag is not +defined by default making ExecuteStep() work as specified, but for those that do not use this function the +performance may be increased a little by specifying this flag when compiling the library. +
    +
+ + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/Doxyfile kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/Doxyfile --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/Doxyfile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/Doxyfile 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,286 @@ +# Doxyfile 1.5.6 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = AngelScript +PROJECT_NUMBER = +OUTPUT_DIRECTORY = "output" +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = NO +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = YES +HIDE_FRIEND_COMPOUNDS = YES +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = NO +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = NO +INLINE_INFO = NO +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = NO +SHOW_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = source +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.vhd \ + *.vhdl +RECURSIVE = NO +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = source/logo +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = NO +USE_HTAGS = NO +VERBATIM_HEADERS = NO +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +HTML_DYNAMIC_SECTIONS = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = YES +ENUM_VALUES_PER_LINE = 1 +GENERATE_TREEVIEW = FRAME +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = AS_DEPRECATED +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +DOT_FONTNAME = FreeSans +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 1000 +DOT_TRANSPARENT = YES +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/angelscript.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/angelscript.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/angelscript.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/angelscript.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,3862 @@ +/* + AngelCode Scripting Library + Copyright (c) 2003-2009 Andreas Jonsson + + 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. + + The original version of this library can be located at: + http://www.angelcode.com/angelscript/ + + Andreas Jonsson + andreas@angelcode.com +*/ + + +// +// angelscript.h +// +// The script engine interface +// + + +//! \file angelscript.h +//! \brief The API definition for AngelScript. +//! +//! This header file describes the complete application programming interface for AngelScript. + +#ifndef ANGELSCRIPT_H +#define ANGELSCRIPT_H + +#include + +#ifdef AS_USE_NAMESPACE + #define BEGIN_AS_NAMESPACE namespace AngelScript { + #define END_AS_NAMESPACE } +#else + #define BEGIN_AS_NAMESPACE + #define END_AS_NAMESPACE +#endif + +BEGIN_AS_NAMESPACE + +// AngelScript version + +//! \details Version 2.18.0 +#define ANGELSCRIPT_VERSION 21800 +#define ANGELSCRIPT_VERSION_STRING "2.18.0" + +// Data types + +class asIScriptEngine; +class asIScriptModule; +class asIScriptContext; +class asIScriptGeneric; +class asIScriptObject; +class asIScriptArray; +class asIObjectType; +class asIScriptFunction; +class asIBinaryStream; +class asIJITCompiler; + +// Enumerations and constants + +// Engine properties +//! Engine properties +enum asEEngineProp +{ + //! Allow unsafe references. Default: false. + asEP_ALLOW_UNSAFE_REFERENCES = 1, + //! Optimize byte code. Default: true. + asEP_OPTIMIZE_BYTECODE = 2, + //! Copy script section memory. Default: true. + asEP_COPY_SCRIPT_SECTIONS = 3, + //! Maximum stack size for script contexts. Default: 0 (no limit). + asEP_MAX_STACK_SIZE = 4, + //! Interpret single quoted strings as character literals. Default: false. + asEP_USE_CHARACTER_LITERALS = 5, + //! Allow linebreaks in string constants. Default: false. + asEP_ALLOW_MULTILINE_STRINGS = 6, + //! Allow script to declare implicit handle types. Default: false. + asEP_ALLOW_IMPLICIT_HANDLE_TYPES = 7, + //! Remove SUSPEND instructions between each statement. Default: false. + asEP_BUILD_WITHOUT_LINE_CUES = 8, + //! Initialize global variables after a build. Default: true. + asEP_INIT_GLOBAL_VARS_AFTER_BUILD = 9, + //! When set the enum values must be prefixed with the enum type. Default: false. + asEP_REQUIRE_ENUM_SCOPE = 10, + //! Select scanning method: 0 - ASCII, 1 - UTF8. Default: 1 (UTF8). + asEP_SCRIPT_SCANNER = 11, + //! When set extra bytecode instructions needed for JIT compiled funcions will be included. Default: false. + asEP_INCLUDE_JIT_INSTRUCTIONS = 12, + //! Select string encoding for literals: 0 - UTF8/ASCII, 1 - UTF16. Default: 0 (UTF8) + asEP_STRING_ENCODING = 13 +}; + +// Calling conventions +//! Calling conventions +enum asECallConvTypes +{ + //! A cdecl function. + asCALL_CDECL = 0, + //! A stdcall function. + asCALL_STDCALL = 1, + //! A thiscall class method. + asCALL_THISCALL = 2, + //! A cdecl function that takes the object pointer as the last parameter. + asCALL_CDECL_OBJLAST = 3, + //! A cdecl function that takes the object pointer as the first parameter. + asCALL_CDECL_OBJFIRST = 4, + //! A function using the generic calling convention. + asCALL_GENERIC = 5 +}; + +// Object type flags +//! Object type flags +enum asEObjTypeFlags +{ + //! A reference type. + asOBJ_REF = 0x01, + //! A value type. + asOBJ_VALUE = 0x02, + //! A garbage collected type. Only valid for reference types. + asOBJ_GC = 0x04, + //! A plain-old-data type. Only valid for value types. + asOBJ_POD = 0x08, + //! This reference type doesn't allow handles to be held. Only valid for reference types. + asOBJ_NOHANDLE = 0x10, + //! The life time of objects of this type are controlled by the scope of the variable. Only valid for reference types. + asOBJ_SCOPED = 0x20, + //! A template type. + asOBJ_TEMPLATE = 0x40, + //! The C++ type is a class type. Only valid for value types. + asOBJ_APP_CLASS = 0x100, + //! The C++ class has an explicit constructor. Only valid for value types. + asOBJ_APP_CLASS_CONSTRUCTOR = 0x200, + //! The C++ class has an explicit destructor. Only valid for value types. + asOBJ_APP_CLASS_DESTRUCTOR = 0x400, + //! The C++ class has an explicit assignment operator. Only valid for value types. + asOBJ_APP_CLASS_ASSIGNMENT = 0x800, + //! The C++ type is a class with a constructor, but no destructor or assignment operator. + asOBJ_APP_CLASS_C = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR), + //! The C++ type is a class with a constructor and destructor, but no assignment operator. + asOBJ_APP_CLASS_CD = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_DESTRUCTOR), + //! The C++ type is a class with a constructor and assignment operator, but no destructor. + asOBJ_APP_CLASS_CA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), + //! The C++ type is a class with a constructor, destructor, and assignment operator. + asOBJ_APP_CLASS_CDA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_DESTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), + //! The C++ type is a class with a destructor, but no constructor or assignment operator. + asOBJ_APP_CLASS_D = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_DESTRUCTOR), + //! The C++ type is a class with an assignment operator, but no constructor or destructor. + asOBJ_APP_CLASS_A = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_ASSIGNMENT), + //! The C++ type is a class with a destructor and assignment operator, but no constructor. + asOBJ_APP_CLASS_DA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_DESTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), + //! The C++ type is a primitive type. Only valid for value types. + asOBJ_APP_PRIMITIVE = 0x1000, + //! The C++ type is a float or double. Only valid for value types. + asOBJ_APP_FLOAT = 0x2000, + asOBJ_MASK_VALID_FLAGS = 0x3F7F, + //! The object is a script class or an interface. + asOBJ_SCRIPT_OBJECT = 0x10000 +}; + +// Behaviours +//! Behaviours +enum asEBehaviours +{ + // Value object memory management + //! \brief Constructor + asBEHAVE_CONSTRUCT, + //! \brief Destructor + asBEHAVE_DESTRUCT, + + // Reference object memory management + //! \brief Factory + asBEHAVE_FACTORY, + //! \brief AddRef + asBEHAVE_ADDREF, + //! \brief Release + asBEHAVE_RELEASE, + + // Object operators + //! \brief Explicit value cast operator + asBEHAVE_VALUE_CAST, + //! \brief Implicit value cast operator + asBEHAVE_IMPLICIT_VALUE_CAST, + //! \brief Explicit reference cast operator + asBEHAVE_REF_CAST, + //! \brief Implicit reference cast operator + asBEHAVE_IMPLICIT_REF_CAST, + //! \brief operator [] + asBEHAVE_INDEX, + //! \brief Callback for validating template instances + asBEHAVE_TEMPLATE_CALLBACK, + + // Garbage collection behaviours + asBEHAVE_FIRST_GC, + //! \brief (GC) Get reference count + asBEHAVE_GETREFCOUNT = asBEHAVE_FIRST_GC, + //! \brief (GC) Set GC flag + asBEHAVE_SETGCFLAG, + //! \brief (GC) Get GC flag + asBEHAVE_GETGCFLAG, + //! \brief (GC) Enumerate held references + asBEHAVE_ENUMREFS, + //! \brief (GC) Release all references + asBEHAVE_RELEASEREFS, + asBEHAVE_LAST_GC = asBEHAVE_RELEASEREFS, + + asBEHAVE_MAX +}; + +// Return codes +//! Return codes +enum asERetCodes +{ + //! Success + asSUCCESS = 0, + //! Failure + asERROR = -1, + //! The context is active + asCONTEXT_ACTIVE = -2, + //! The context is not finished + asCONTEXT_NOT_FINISHED = -3, + //! The context is not prepared + asCONTEXT_NOT_PREPARED = -4, + //! Invalid argument + asINVALID_ARG = -5, + //! The function was not found + asNO_FUNCTION = -6, + //! Not supported + asNOT_SUPPORTED = -7, + //! Invalid name + asINVALID_NAME = -8, + //! The name is already taken + asNAME_TAKEN = -9, + //! Invalid declaration + asINVALID_DECLARATION = -10, + //! Invalid object + asINVALID_OBJECT = -11, + //! Invalid type + asINVALID_TYPE = -12, + //! Already registered + asALREADY_REGISTERED = -13, + //! Multiple matching functions + asMULTIPLE_FUNCTIONS = -14, + //! The module was not found + asNO_MODULE = -15, + //! The global variable was not found + asNO_GLOBAL_VAR = -16, + //! Invalid configuration + asINVALID_CONFIGURATION = -17, + //! Invalid interface + asINVALID_INTERFACE = -18, + //! All imported functions couldn't be bound + asCANT_BIND_ALL_FUNCTIONS = -19, + //! The array sub type has not been registered yet + asLOWER_ARRAY_DIMENSION_NOT_REGISTERED = -20, + //! Wrong configuration group + asWRONG_CONFIG_GROUP = -21, + //! The configuration group is in use + asCONFIG_GROUP_IS_IN_USE = -22, + //! Illegal behaviour for the type + asILLEGAL_BEHAVIOUR_FOR_TYPE = -23, + //! The specified calling convention doesn't match the function/method pointer + asWRONG_CALLING_CONV = -24, + //! A build is currently in progress + asBUILD_IN_PROGRESS = -25, + //! The initialization of global variables failed + asINIT_GLOBAL_VARS_FAILED = -26 +}; + +// Context states + +//! \brief Context states. +enum asEContextState +{ + //! The context has successfully completed the execution. + asEXECUTION_FINISHED = 0, + //! The execution is suspended and can be resumed. + asEXECUTION_SUSPENDED = 1, + //! The execution was aborted by the application. + asEXECUTION_ABORTED = 2, + //! The execution was terminated by an unhandled script exception. + asEXECUTION_EXCEPTION = 3, + //! The context has been prepared for a new execution. + asEXECUTION_PREPARED = 4, + //! The context is not initialized. + asEXECUTION_UNINITIALIZED = 5, + //! The context is currently executing a function call. + asEXECUTION_ACTIVE = 6, + //! The context has encountered an error and must be reinitialized. + asEXECUTION_ERROR = 7 +}; + +#ifdef AS_DEPRECATED +// Deprecated since 2.18.0, 2009-12-08 +// ExecuteString flags +//! \brief ExecuteString flags. +//! \deprecated since 2.18.0 +enum asEExecStrFlags +{ + //! Only prepare the context + asEXECSTRING_ONLY_PREPARE = 1, + //! Use the pre-allocated context + asEXECSTRING_USE_MY_CONTEXT = 2 +}; +#endif + +// Message types + +//! \brief Compiler message types. +enum asEMsgType +{ + //! The message is an error. + asMSGTYPE_ERROR = 0, + //! The message is a warning. + asMSGTYPE_WARNING = 1, + //! The message is informational only. + asMSGTYPE_INFORMATION = 2 +}; + +// Garbage collector flags + +//! \brief Garbage collector flags. +enum asEGCFlags +{ + //! Execute a full cycle. + asGC_FULL_CYCLE = 1, + //! Execute only one step + asGC_ONE_STEP = 2, + //! Destroy known garbage + asGC_DESTROY_GARBAGE = 4, + //! Detect garbage with circular references + asGC_DETECT_GARBAGE = 8 +}; + +// Token classes +//! \brief Token classes. +enum asETokenClass +{ + //! Unknown token. + asTC_UNKNOWN = 0, + //! Keyword token. + asTC_KEYWORD = 1, + //! Literal value token. + asTC_VALUE = 2, + //! Identifier token. + asTC_IDENTIFIER = 3, + //! Comment token. + asTC_COMMENT = 4, + //! White space token. + asTC_WHITESPACE = 5 +}; + +// Prepare flags +const int asPREPARE_PREVIOUS = -1; + +// Config groups +const char * const asALL_MODULES = (const char * const)-1; + +// Type id flags +//! \brief Type id flags +enum asETypeIdFlags +{ + //! The type id for void + asTYPEID_VOID = 0, + //! The type id for bool + asTYPEID_BOOL = 1, + //! The type id for int8 + asTYPEID_INT8 = 2, + //! The type id for int16 + asTYPEID_INT16 = 3, + //! The type id for int + asTYPEID_INT32 = 4, + //! The type id for int64 + asTYPEID_INT64 = 5, + //! The type id for uint8 + asTYPEID_UINT8 = 6, + //! The type id for uint16 + asTYPEID_UINT16 = 7, + //! The type id for uint + asTYPEID_UINT32 = 8, + //! The type id for uint64 + asTYPEID_UINT64 = 9, + //! The type id for float + asTYPEID_FLOAT = 10, + //! The type id for double + asTYPEID_DOUBLE = 11, + //! The bit that shows if the type is a handle + asTYPEID_OBJHANDLE = 0x40000000, + //! The bit that shows if the type is a handle to a const + asTYPEID_HANDLETOCONST = 0x20000000, + //! If any of these bits are set, then the type is an object + asTYPEID_MASK_OBJECT = 0x1C000000, + //! The bit that shows if the type is an application registered type + asTYPEID_APPOBJECT = 0x04000000, + //! The bit that shows if the type is a script class + asTYPEID_SCRIPTOBJECT = 0x08000000, + //! The bit that shows if the type is a script array + asTYPEID_SCRIPTARRAY = 0x10000000, + //! The mask for the type id sequence number + asTYPEID_MASK_SEQNBR = 0x03FFFFFF +}; + +// Type modifiers +//! \brief Type modifiers +enum asETypeModifiers +{ + //! No modification + asTM_NONE = 0, + //! Input reference + asTM_INREF = 1, + //! Output reference + asTM_OUTREF = 2, + //! In/out reference + asTM_INOUTREF = 3 +}; + +// GetModule flags +//! \brief Flags for GetModule. +enum asEGMFlags +{ + //! \brief Don't return any module if it is not found. + asGM_ONLY_IF_EXISTS = 0, + //! \brief Create the module if it doesn't exist. + asGM_CREATE_IF_NOT_EXISTS = 1, + //! \brief Always create a new module, discarding the existing one. + asGM_ALWAYS_CREATE = 2 +}; + +// Compile flags +//! \brief Flags for compilation +enum asECompileFlags +{ + //! \brief The compiled function should be added to the scope of the module. + asCOMP_ADD_TO_MODULE = 1 +}; + + + +//! \typedef asBYTE +//! \brief 8 bit unsigned integer + +//! \typedef asWORD +//! \brief 16 bit unsigned integer + +//! \typedef asDWORD +//! \brief 32 bit unsigned integer + +//! \typedef asQWORD +//! \brief 64 bit unsigned integer + +//! \typedef asUINT +//! \brief 32 bit unsigned integer + +//! \typedef asINT64 +//! \brief 64 bit integer + +//! \typedef asPWORD +//! \brief Unsigned integer with the size of a pointer. + +// +// asBYTE = 8 bits +// asWORD = 16 bits +// asDWORD = 32 bits +// asQWORD = 64 bits +// asPWORD = size of pointer +// +typedef unsigned char asBYTE; +typedef unsigned short asWORD; +typedef unsigned int asUINT; +typedef size_t asPWORD; +#ifdef __LP64__ + typedef unsigned int asDWORD; + typedef unsigned long asQWORD; + typedef long asINT64; +#else + typedef unsigned long asDWORD; + #if defined(__GNUC__) || defined(__MWERKS__) + typedef unsigned long long asQWORD; + typedef long long asINT64; + #else + typedef unsigned __int64 asQWORD; + typedef __int64 asINT64; + #endif +#endif + +typedef void (*asFUNCTION_t)(); +typedef void (*asGENFUNC_t)(asIScriptGeneric *); + +//! The function signature for the custom memory allocation function +typedef void *(*asALLOCFUNC_t)(size_t); +//! The function signature for the custom memory deallocation function +typedef void (*asFREEFUNC_t)(void *); + +//! \ingroup funcs +//! \brief Returns an asSFuncPtr representing the function specified by the name +#define asFUNCTION(f) asFunctionPtr(f) +//! \ingroup funcs +//! \brief Returns an asSFuncPtr representing the function specified by the name, parameter list, and return type +#if defined(_MSC_VER) && _MSC_VER <= 1200 +// MSVC 6 has a bug that prevents it from properly compiling using the correct asFUNCTIONPR with operator > +// so we need to use ordinary C style cast instead of static_cast. The drawback is that the compiler can't +// check that the cast is really valid. +#define asFUNCTIONPR(f,p,r) asFunctionPtr((void (*)())((r (*)p)(f))) +#else +#define asFUNCTIONPR(f,p,r) asFunctionPtr((void (*)())(static_cast(f))) +#endif + +#ifndef AS_NO_CLASS_METHODS + +class asCUnknownClass; +typedef void (asCUnknownClass::*asMETHOD_t)(); + +//! \brief Represents a function or method pointer. +struct asSFuncPtr +{ + union + { + // The largest known method point is 20 bytes (MSVC 64bit), + // but with 8byte alignment this becomes 24 bytes. So we need + // to be able to store at least that much. + char dummy[25]; + struct {asMETHOD_t mthd; char dummy[25-sizeof(asMETHOD_t)];} m; + struct {asFUNCTION_t func; char dummy[25-sizeof(asFUNCTION_t)];} f; + } ptr; + asBYTE flag; // 1 = generic, 2 = global func, 3 = method +}; + +//! \ingroup funcs +//! \brief Returns an asSFuncPtr representing the class method specified by class and method name. +#define asMETHOD(c,m) asSMethodPtr::Convert((void (c::*)())(&c::m)) +//! \ingroup funcs +//! \brief Returns an asSFuncPtr representing the class method specified by class, method name, parameter list, return type. +#define asMETHODPR(c,m,p,r) asSMethodPtr::Convert(static_cast(&c::m)) + +#else // Class methods are disabled + +struct asSFuncPtr +{ + union + { + char dummy[25]; // largest known class method pointer + struct {asFUNCTION_t func; char dummy[25-sizeof(asFUNCTION_t)];} f; + } ptr; + asBYTE flag; // 1 = generic, 2 = global func +}; + +#endif + +//! \brief Represents a compiler message +struct asSMessageInfo +{ + //! The script section where the message is raised + const char *section; + //! The row number + int row; + //! The column + int col; + //! The type of message + asEMsgType type; + //! The message text + const char *message; +}; + + +// API functions + +// ANGELSCRIPT_EXPORT is defined when compiling the dll or lib +// ANGELSCRIPT_DLL_LIBRARY_IMPORT is defined when dynamically linking to the +// dll through the link lib automatically generated by MSVC++ +// ANGELSCRIPT_DLL_MANUAL_IMPORT is defined when manually loading the dll +// Don't define anything when linking statically to the lib + +//! \def AS_API +//! \brief A define that specifies how the function should be imported + +#ifdef WIN32 + #ifdef ANGELSCRIPT_EXPORT + #define AS_API __declspec(dllexport) + #elif defined ANGELSCRIPT_DLL_LIBRARY_IMPORT + #define AS_API __declspec(dllimport) + #else // statically linked library + #define AS_API + #endif +#else + #define AS_API +#endif + +#ifndef ANGELSCRIPT_DLL_MANUAL_IMPORT +extern "C" +{ + // Engine + //! \brief Creates the script engine. + //! + //! \param[in] version The library version. Should always be \ref ANGELSCRIPT_VERSION. + //! \return A pointer to the script engine interface. + //! + //! Call this function to create a new script engine. When you're done with the + //! script engine, i.e. after you've executed all your scripts, you should call + //! \ref asIScriptEngine::Release "Release" on the pointer to free the engine object. + AS_API asIScriptEngine * asCreateScriptEngine(asDWORD version); + //! \brief Returns the version of the compiled library. + //! + //! \return A null terminated string with the library version. + //! + //! The returned string can be used for presenting the library version in a log file, or in the GUI. + AS_API const char * asGetLibraryVersion(); + //! \brief Returns the options used to compile the library. + //! + //! \return A null terminated string with indicators that identify the options + //! used to compile the script library. + //! + //! This can be used to identify at run-time different ways to configure the engine. + //! For example, if the returned string contain the identifier AS_MAX_PORTABILITY then + //! functions and methods must be registered with the \ref asCALL_GENERIC calling convention. + AS_API const char * asGetLibraryOptions(); + + // Context + //! \brief Returns the currently active context. + //! + //! \return A pointer to the currently executing context, or null if no context is executing. + //! + //! This function is most useful for registered functions, as it will allow them to obtain + //! a pointer to the context that is calling the function, and through that get the engine, + //! or custom user data. + //! + //! If the script library is compiled with multithread support, this function will return + //! the context that is currently active in the thread that is being executed. It will thus + //! work even if there are multiple threads executing scripts at the same time. + AS_API asIScriptContext * asGetActiveContext(); + + // Thread support + //! \brief Cleans up memory allocated for the current thread. + //! + //! \return A negative value on error. + //! \retval asCONTEXT_ACTIVE A context is still active. + //! + //! Call this method before terminating a thread that has + //! accessed the engine to clean up memory allocated for that thread. + //! + //! It's not necessary to call this if only a single thread accesses the engine. + AS_API int asThreadCleanup(); + + // Memory management + //! \brief Set the memory management functions that AngelScript should use. + //! + //! \param[in] allocFunc The function that will be used to allocate memory. + //! \param[in] freeFunc The function that will be used to free the memory. + //! \return A negative value on error. + //! + //! Call this method to register the global memory allocation and deallocation + //! functions that AngelScript should use for memory management. This function + //! Should be called before \ref asCreateScriptEngine. + //! + //! If not called, AngelScript will use the malloc and free functions from the + //! standard C library. + AS_API int asSetGlobalMemoryFunctions(asALLOCFUNC_t allocFunc, asFREEFUNC_t freeFunc); + + //! \brief Remove previously registered memory management functions. + //! + //! \return A negative value on error. + //! + //! Call this method to restore the default memory management functions. + AS_API int asResetGlobalMemoryFunctions(); +} +#endif // ANGELSCRIPT_DLL_MANUAL_IMPORT + +// Interface declarations + +//! \brief The engine interface +class asIScriptEngine +{ +public: + // Memory management + //! \name Memory management + //! \{ + + //! \brief Increase reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when storing an additional reference to the object. + //! Remember that the first reference that is received from \ref asCreateScriptEngine + //! is already accounted for. + virtual int AddRef() = 0; + //! \brief Decrease reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when you will no longer use the references that you own. + virtual int Release() = 0; + //! \} + + // Engine properties + //! \name Engine properties + //! \{ + + //! \brief Dynamically change some engine properties. + //! + //! \param[in] property One of the \ref asEEngineProp values. + //! \param[in] value The new value of the property. + //! \return Negative value on error. + //! \retval asINVALID_ARG Invalid property. + //! + //! With this method you can change the way the script engine works in some regards. + virtual int SetEngineProperty(asEEngineProp property, asPWORD value) = 0; + //! \brief Retrieve current engine property settings. + //! + //! \param[in] property One of the \ref asEEngineProp values. + //! \return The value of the property, or 0 if it is an invalid property. + //! + //! Calling this method lets you determine the current value of the engine properties. + virtual asPWORD GetEngineProperty(asEEngineProp property) = 0; + //! \} + + // Compiler messages + //! \name Compiler messages + //! \{ + + //! \brief Sets a message callback that will receive compiler messages. + //! + //! \param[in] callback A function or class method pointer. + //! \param[in] obj The object for methods, or an optional parameter for functions. + //! \param[in] callConv The calling convention. + //! \return A negative value for an error. + //! \retval asINVALID_ARG One of the arguments is incorrect, e.g. obj is null for a class method. + //! \retval asNOT_SUPPORTED The arguments are not supported, e.g. asCALL_GENERIC. + //! + //! This method sets the callback routine that will receive compiler messages. + //! The callback routine can be either a class method, e.g: + //! \code + //! void MyClass::MessageCallback(const asSMessageInfo *msg); + //! r = engine->SetMessageCallback(asMETHOD(MyClass,MessageCallback), &obj, asCALL_THISCALL); + //! \endcode + //! or a global function, e.g: + //! \code + //! void MessageCallback(const asSMessageInfo *msg, void *param); + //! r = engine->SetMessageCallback(asFUNCTION(MessageCallback), param, asCALL_CDECL); + //! \endcode + //! It is recommended to register the message callback routine right after creating the engine, + //! as some of the registration functions can provide useful information to better explain errors. + virtual int SetMessageCallback(const asSFuncPtr &callback, void *obj, asDWORD callConv) = 0; + //! \brief Clears the registered message callback routine. + //! + //! \return A negative value on error. + //! + //! Call this method to remove the message callback. + virtual int ClearMessageCallback() = 0; + //! \brief Writes a message to the message callback. + //! + //! \param[in] section The name of the script section. + //! \param[in] row The row number. + //! \param[in] col The column number. + //! \param[in] type The message type. + //! \param[in] message The message text. + //! \return A negative value on error. + //! \retval asINVALID_ARG The section or message is null. + //! + //! This method can be used by the application to write messages + //! to the same message callback that the script compiler uses. This + //! is useful for example if a preprocessor is used. + virtual int WriteMessage(const char *section, int row, int col, asEMsgType type, const char *message) = 0; + //! \} + + // JIT Compiler + //! \name JIT compiler + //! \{ + + //! \brief Sets the JIT compiler + virtual int SetJITCompiler(asIJITCompiler *compiler) = 0; + //! \brief Returns the JIT compiler + virtual asIJITCompiler *GetJITCompiler() = 0; + //! \} + + // Global functions + //! \name Global functions + //! \{ + + //! \brief Registers a global function. + //! + //! \param[in] declaration The declaration of the global function in script syntax. + //! \param[in] funcPointer The function pointer. + //! \param[in] callConv The calling convention for the function. + //! \return A negative value on error, or the function id if successful. + //! \retval asNOT_SUPPORTED The calling convention is not supported. + //! \retval asWRONG_CALLING_CONV The function's calling convention doesn't match \a callConv. + //! \retval asINVALID_DECLARATION The function declaration is invalid. + //! \retval asNAME_TAKEN The function name is already used elsewhere. + //! + //! This method registers system functions that the scripts may use to communicate with the host application. + //! + //! \see \ref doc_register_func + virtual int RegisterGlobalFunction(const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv) = 0; + //! \brief Returns the number of registered functions. + //! \return The number of registered functions. + virtual int GetGlobalFunctionCount() = 0; + //! \brief Returns the function id of the registered function. + //! \param[in] index The index of the registered global function. + //! \return The id of the function, or a negative value on error. + //! \retval asINVALID_ARG \a index is too large. + virtual int GetGlobalFunctionIdByIndex(asUINT index) = 0; + //! \} + + // Global properties + //! \name Global properties + //! \{ + + //! \brief Registers a global property. + //! + //! \param[in] declaration The declaration of the global property in script syntax. + //! \param[in] pointer The address of the property that will be used to access the property value. + //! \return A negative value on error. + //! \retval asINVALID_DECLARATION The declaration has invalid syntax. + //! \retval asINVALID_TYPE The declaration is a reference. + //! \retval asNAME_TAKEN The name is already taken. + //! + //! Use this method to register a global property that the scripts will be + //! able to access as global variables. The property may optionally be registered + //! as const, if the scripts shouldn't be allowed to modify it. + //! + //! When registering the property, the application must pass the address to + //! the actual value. The application must also make sure that this address + //! remains valid throughout the life time of this registration, i.e. until + //! the engine is released or the dynamic configuration group is removed. + virtual int RegisterGlobalProperty(const char *declaration, void *pointer) = 0; + //! \brief Returns the number of registered global properties. + //! \return The number of registered global properties. + virtual int GetGlobalPropertyCount() = 0; + //! \brief Returns the detail on the registered global property. + //! \param[in] index The index of the global variable. + //! \param[out] name Receives the name of the property. + //! \param[out] typeId Receives the typeId of the property. + //! \param[out] isConst Receives the constness indicator of the property. + //! \param[out] configGroup Receives the config group in which the property was registered. + //! \param[out] pointer Receives the pointer of the property. + //! \return A negative value on error. + //! \retval asINVALID_ARG \a index is too large. + virtual int GetGlobalPropertyByIndex(asUINT index, const char **name, int *typeId = 0, bool *isConst = 0, const char **configGroup = 0, void **pointer = 0) = 0; + //! \} + + // Object types + //! \name Object types + //! \{ + + //! \brief Registers a new object type. + //! + //! \param[in] obj The name of the type. + //! \param[in] byteSize The size of the type in bytes. Only necessary for value types. + //! \param[in] flags One or more of the asEObjTypeFlags. + //! \return A negative value on error. + //! \retval asINVALID_ARG The flags are invalid. + //! \retval asINVALID_NAME The name is invalid. + //! \retval asALREADY_REGISTERED Another type of the same name already exists. + //! \retval asNAME_TAKEN The name conflicts with other symbol names. + //! \retval asLOWER_ARRAY_DIMENSION_NOT_REGISTERED When registering an array type the array element must be a primitive or a registered type. + //! \retval asINVALID_TYPE The array type was not properly formed. + //! \retval asNOT_SUPPORTED The array type is not supported, or already in use preventing it from being overloaded. + //! + //! Use this method to register new types that should be available to the scripts. + //! Reference types, which have their memory managed by the application, should be registered with \ref asOBJ_REF. + //! Value types, which have their memory managed by the engine, should be registered with \ref asOBJ_VALUE. + //! + //! \see \ref doc_register_type + virtual int RegisterObjectType(const char *obj, int byteSize, asDWORD flags) = 0; + //! \brief Registers a property for the object type. + //! + //! \param[in] obj The name of the type. + //! \param[in] declaration The property declaration in script syntax. + //! \param[in] byteOffset The offset into the memory block where this property is found. + //! \return A negative value on error. + //! \retval asWRONG_CONFIG_GROUP The object type was registered in a different configuration group. + //! \retval asINVALID_OBJECT The \a obj does not specify an object type. + //! \retval asINVALID_TYPE The \a obj parameter has invalid syntax. + //! \retval asINVALID_DECLARATION The \a declaration is invalid. + //! \retval asNAME_TAKEN The name conflicts with other members. + //! + //! Use this method to register a member property of a class. The property must + //! be local to the object, i.e. not a global variable or a static member. The + //! easiest way to get the offset of the property is to use the offsetof macro + //! from stddef.h. + //! + //! \code + //! struct MyType {float prop;}; + //! r = engine->RegisterObjectProperty("MyType", "float prop", offsetof(MyType, prop))); + //! \endcode + virtual int RegisterObjectProperty(const char *obj, const char *declaration, int byteOffset) = 0; + //! \brief Registers a method for the object type. + //! + //! \param[in] obj The name of the type. + //! \param[in] declaration The declaration of the method in script syntax. + //! \param[in] funcPointer The method or function pointer. + //! \param[in] callConv The calling convention for the method or function. + //! \return A negative value on error, or the function id if successful. + //! \retval asWRONG_CONFIG_GROUP The object type was registered in a different configuration group. + //! \retval asNOT_SUPPORTED The calling convention is not supported. + //! \retval asINVALID_TYPE The \a obj parameter is not a valid object name. + //! \retval asINVALID_DECLARATION The \a declaration is invalid. + //! \retval asNAME_TAKEN The name conflicts with other members. + //! \retval asWRONG_CALLING_CONV The function's calling convention isn't compatible with \a callConv. + //! + //! Use this method to register a member method for the type. The method + //! that is registered may be an actual class method, or a global function + //! that takes the object pointer as either the first or last parameter. Or + //! it may be a global function implemented with the generic calling convention. + //! + //! \see \ref doc_register_func + virtual int RegisterObjectMethod(const char *obj, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv) = 0; + //! \brief Registers a behaviour for the object type. + //! + //! \param[in] obj The name of the type. + //! \param[in] behaviour One of the object behaviours from \ref asEBehaviours. + //! \param[in] declaration The declaration of the method in script syntax. + //! \param[in] funcPointer The method or function pointer. + //! \param[in] callConv The calling convention for the method or function. + //! \return A negative value on error, or the function id is successful. + //! \retval asWRONG_CONFIG_GROUP The object type was registered in a different configuration group. + //! \retval asINVALID_ARG \a obj is not set, or a global behaviour is given in \a behaviour. + //! \retval asWRONG_CALLING_CONV The function's calling convention isn't compatible with \a callConv. + //! \retval asNOT_SUPPORTED The calling convention or the behaviour signature is not supported. + //! \retval asINVALID_TYPE The \a obj parameter is not a valid object name. + //! \retval asINVALID_DECLARATION The \a declaration is invalid. + //! \retval asILLEGAL_BEHAVIOUR_FOR_TYPE The \a behaviour is not allowed for this type. + //! \retval asALREADY_REGISTERED The behaviour is already registered with the same signature. + //! + //! Use this method to register behaviour functions that will be called by + //! the virtual machine to perform certain operations, such as memory management, + //! math operations, comparisons, etc. + //! + //! \see \ref doc_register_func, \ref doc_reg_opbeh + virtual int RegisterObjectBehaviour(const char *obj, asEBehaviours behaviour, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv) = 0; + //! \brief Registers an interface. + //! + //! \param[in] name The name of the interface. + //! \return A negative value on error. + //! \retval asINVALID_NAME The \a name is null, or a reserved keyword. + //! \retval asALREADY_REGISTERED An object type with this name already exists. + //! \retval asERROR The \a name is not a proper identifier. + //! \retval asNAME_TAKEN The \a name is already used elsewhere. + //! + //! This registers an interface that script classes can implement. By doing this the application + //! can register functions and methods that receives an \ref asIScriptObject and still be sure that the + //! class implements certain methods needed by the application. + virtual int RegisterInterface(const char *name) = 0; + //! \brief Registers an interface method. + //! + //! \param[in] intf The name of the interface. + //! \param[in] declaration The method declaration. + //! \return A negative value on error. + //! \retval asWRONG_CONFIG_GROUP The interface was registered in another configuration group. + //! \retval asINVALID_TYPE \a intf is not an interface type. + //! \retval asINVALID_DECLARATION The \a declaration is invalid. + //! \retval asNAME_TAKEN The method name is already taken. + //! + //! This registers a method that the class that implements the interface must have. + virtual int RegisterInterfaceMethod(const char *intf, const char *declaration) = 0; + //! \brief Returns the number of registered object types. + //! \return The number of object types registered by the application. + virtual int GetObjectTypeCount() = 0; + //! \brief Returns the object type interface by index. + //! \param[in] index The index of the type. + //! \return The registered object type interface for the type, or null if not found. + virtual asIObjectType *GetObjectTypeByIndex(asUINT index) = 0; + //! \} + + // String factory + //! \name String factory + //! \{ + + //! \brief Registers the string factory. + //! + //! \param[in] datatype The datatype that the string factory returns + //! \param[in] factoryFunc The pointer to the factory function + //! \param[in] callConv The calling convention of the factory function + //! \return A negative value on error, or the function id if successful. + //! \retval asNOT_SUPPORTED The calling convention is not supported. + //! \retval asWRONG_CALLING_CONV The function's calling convention doesn't match \a callConv. + //! \retval asINVALID_TYPE The \a datatype is not a valid type. + //! + //! Use this function to register a string factory that will be called when the + //! virtual machine finds a string constant in an expression. The string factory + //! function will receive two parameters, the length of the string constant in bytes and a + //! pointer to the character data. The factory should return a value to a previously + //! registered type that will represent the string. Example: + //! + //! \code + //! // Our string factory implementation + //! std::string StringFactory(unsigned int byteLength, const char *s) + //! { + //! return std::string(s, byteLength); + //! } + //! + //! // Registering the string factory + //! int r = engine->RegisterStringFactory("string", asFUNCTION(StringFactory), asCALL_CDECL); assert( r >= 0 ); + //! \endcode + //! + //! The example assumes that the std::string type has been registered as the string type, with \ref RegisterObjectType. + virtual int RegisterStringFactory(const char *datatype, const asSFuncPtr &factoryFunc, asDWORD callConv) = 0; + //! \brief Returns the type id of the type that the string factory returns. + //! \return The type id of the type that the string type returns, or a negative value on error. + //! \retval asNO_FUNCTION The string factory has not been registered. + virtual int GetStringFactoryReturnTypeId() = 0; + //! \} + + // Enums + //! \name Enums + //! \{ + + //! \brief Registers an enum type. + //! + //! \param[in] type The name of the enum type. + //! \return A negative value on error. + //! \retval asINVALID_NAME \a type is null. + //! \retval asALREADY_REGISTERED Another type with this name already exists. + //! \retval asERROR The \a type couldn't be parsed. + //! \retval asINVALID_NAME The \a type is not an identifier, or it is a reserved keyword. + //! \retval asNAME_TAKEN The type name is already taken. + //! + //! This method registers an enum type in the engine. The enum values should then be registered + //! with \ref RegisterEnumValue. + virtual int RegisterEnum(const char *type) = 0; + //! \brief Registers an enum value. + //! + //! \param[in] type The name of the enum type. + //! \param[in] name The name of the enum value. + //! \param[in] value The integer value of the enum value. + //! \return A negative value on error. + //! \retval asWRONG_CONFIG_GROUP The enum \a type was registered in a different configuration group. + //! \retval asINVALID_TYPE The \a type is invalid. + //! \retval asALREADY_REGISTERED The \a name is already registered for this enum. + //! + //! This method registers an enum value for a previously registered enum type. + virtual int RegisterEnumValue(const char *type, const char *name, int value) = 0; + //! \brief Returns the number of registered enum types. + //! \return The number of registered enum types. + virtual int GetEnumCount() = 0; + //! \brief Returns the registered enum type. + //! \param[in] index The index of the enum type. + //! \param[out] enumTypeId Receives the type if of the enum type. + //! \param[out] configGroup Receives the config group in which the enum was registered. + //! \return The name of the registered enum type, or null on error. + virtual const char *GetEnumByIndex(asUINT index, int *enumTypeId, const char **configGroup = 0) = 0; + //! \brief Returns the number of enum values for the enum type. + //! \param[in] enumTypeId The type id of the enum type. + //! \return The number of enum values for the enum type. + virtual int GetEnumValueCount(int enumTypeId) = 0; + //! \brief Returns the name and value of the enum value for the enum type. + //! \param[in] enumTypeId The type id of the enum type. + //! \param[in] index The index of the enum value. + //! \param[out] outValue Receives the value of the enum value. + //! \return The name of the enum value. + virtual const char *GetEnumValueByIndex(int enumTypeId, asUINT index, int *outValue) = 0; + //! \} + + // Typedefs + //! \name Typedefs + //! \{ + + //! \brief Registers a typedef. + //! + //! \param[in] type The name of the new typedef + //! \param[in] decl The datatype that the typedef represents + //! \return A negative value on error. + //! \retval asINVALID_NAME The \a type is null. + //! \retval asALREADY_REGISTERED A type with the same name already exists. + //! \retval asINVALID_TYPE The \a decl is not a primitive type. + //! \retval asINVALID_NAME The \a type is not an identifier, or it is a reserved keyword. + //! \retval asNAME_TAKEN The name is already used elsewhere. + //! + //! This method registers an alias for a data type. + //! + //! Currently typedefs can only be registered for built-in primitive types. + virtual int RegisterTypedef(const char *type, const char *decl) = 0; + //! \brief Returns the number of registered typedefs. + //! \return The number of registered typedefs. + virtual int GetTypedefCount() = 0; + //! \brief Returns a registered typedef. + //! \param[in] index The index of the typedef. + //! \param[out] typeId The type that the typedef aliases. + //! \param[out] configGroup Receives the config group in which the type def was registered. + //! \return The name of the typedef. + virtual const char *GetTypedefByIndex(asUINT index, int *typeId, const char **configGroup = 0) = 0; + //! \} + + // Configuration groups + //! \name Configuration groups + //! \{ + + //! \brief Starts a new dynamic configuration group. + //! + //! \param[in] groupName The name of the configuration group + //! \return A negative value on error + //! \retval asNAME_TAKEN Another group with the same name already exists. + //! \retval asNOT_SUPPORTED Nesting configuration groups is not supported. + //! + //! Starts a new dynamic configuration group. This group can be setup so that it is only + //! visible to specific modules, and it can also be removed when it is no longer used. + virtual int BeginConfigGroup(const char *groupName) = 0; + //! \brief Ends the configuration group. + //! + //! \return A negative value on error + //! \retval asNOT_SUPPORTED Can't end a group that hasn't been begun. + //! + //! Ends the current configuration group. Once finished a config group cannot be changed, + //! but it can be removed when it is no longer used. + virtual int EndConfigGroup() = 0; + //! \brief Removes a previously registered configuration group. + //! + //! \param[in] groupName The name of the configuration group + //! \return A negative value on error + //! \retval asCONFIG_GROUP_IS_IN_USE The group is in use and cannot be removed. + //! + //! Remove the configuration group. If something in the configuration group is currently in + //! use, the function will return with an error code. Examples of uses are compiled modules + //! that have function calls to functions in the group and global variables of types registered + //! in the group. + virtual int RemoveConfigGroup(const char *groupName) = 0; + //! \brief Tell AngelScript which modules have access to which configuration groups. + //! + //! \param[in] groupName The name of the configuration group + //! \param[in] module The module name + //! \param[in] hasAccess Whether the module has access or not to the group members + //! \return A negative value on error + //! \retval asWRONG_CONFIG_GROUP No group with the \a groupName was found. + //! + //! With this method the application can give modules access to individual configuration groups. + //! This is useful when exposing more than one script interface for various parts of the application, + //! e.g. one interface for GUI handling, another for in-game events, etc. + //! + //! The default module access is granted. The default for a group can be changed by specifying + //! the modulename asALL_MODULES. + virtual int SetConfigGroupModuleAccess(const char *groupName, const char *module, bool hasAccess) = 0; + //! \} + + // Script modules + //! \name Script modules + //! \{ + + //! \brief Return an interface pointer to the module. + //! + //! \param[in] module The name of the module + //! \param[in] flag One of the \ref asEGMFlags flags + //! \return A pointer to the module interface + //! + //! Use this method to get access to the module interface, which will + //! let you build new scripts, and enumerate functions and types in + //! existing modules. + //! + //! If \ref asGM_ALWAYS_CREATE is informed as the flag the previous + //! module with the same name will be discarded, thus any pointers that + //! the engine holds to it will be invalid after the call. + virtual asIScriptModule *GetModule(const char *module, asEGMFlags flag = asGM_ONLY_IF_EXISTS) = 0; + //! \brief Discard a module. + //! + //! \param[in] module The name of the module + //! \return A negative value on error + //! \retval asNO_MODULE The module was not found. + //! + //! Discards a module and frees its memory. Any pointers that the application holds + //! to this module will be invalid after this call. + virtual int DiscardModule(const char *module) = 0; + //! \} + + // Script functions + //! \name Script functions + //! \{ + + //! \brief Returns the function descriptor for the script function + //! \param[in] funcId The id of the function or method. + //! \return A pointer to the function description interface, or null if not found. + virtual asIScriptFunction *GetFunctionDescriptorById(int funcId) = 0; + //! \} + + // Type identification + //! \name Type identification + //! \{ + + //! \brief Returns the object type interface for type. + //! \param[in] typeId The type id of the type. + //! \return The object type interface for the type, or null if not found. + virtual asIObjectType *GetObjectTypeById(int typeId) = 0; + //! \brief Returns a type id by declaration. + //! \param[in] decl The declaration of the type. + //! \return A negative value on error, or the type id of the type. + //! \retval asINVALID_TYPE \a decl is not a valid type. + //! + //! Translates a type declaration into a type id. The returned type id is valid for as long as + //! the type is valid, so you can safely store it for later use to avoid potential overhead by + //! calling this function each time. Just remember to update the type id, any time the type is + //! changed within the engine, e.g. when recompiling script declared classes, or changing the + //! engine configuration. + //! + //! The type id is based on a sequence number and depends on the order in which the type ids are + //! queried, thus is not guaranteed to always be the same for each execution of the application. + //! The \ref asETypeIdFlags can be used to obtain some information about the type directly from the id. + //! + //! A base type yields the same type id whether the declaration is const or not, however if the + //! const is for the subtype then the type id is different, e.g. string@ isn't the same as const + //! string@ but string is the same as const string. + //! + //! This method is only able to return the type id that are not specific for a script module, i.e. + //! built-in types and application registered types. Type ids for script declared types should + //! be obtained through the script module's \ref asIScriptModule::GetTypeIdByDecl "GetTypeIdByDecl". + virtual int GetTypeIdByDecl(const char *decl) = 0; + //! \brief Returns a type declaration. + //! \param[in] typeId The type id of the type. + //! \return A null terminated string with the type declaration, or null if not found. + virtual const char *GetTypeDeclaration(int typeId) = 0; + //! \brief Returns the size of a primitive type. + //! \param[in] typeId The type id of the type. + //! \return The size of the type in bytes. + virtual int GetSizeOfPrimitiveType(int typeId) = 0; + //! \} + + // Script execution + //! \name Script execution + //! \{ + + //! \brief Creates a new script context. + //! \return A pointer to the new script context. + //! + //! This method creates a context that will be used to execute the script functions. + //! The context interface created will have its reference counter already increased. + virtual asIScriptContext *CreateContext() = 0; + //! \brief Creates a script object defined by its type id. + //! \param[in] typeId The type id of the object to create. + //! \return A pointer to the new object if successful, or null if not. + //! + //! This method is used to create a script object based on it's type id. The method will + //! allocate the memory and call the object's default constructor. Reference counted + //! objects will have their reference counter set to 1 so the application needs to + //! release the pointer when it will no longer use it. + //! + //! This only works for objects, for primitive types and object handles the method + //! doesn't do anything and returns a null pointer. + virtual void *CreateScriptObject(int typeId) = 0; + //! \brief Creates a copy of a script object. + //! \param[in] obj A pointer to the source object. + //! \param[in] typeId The type id of the object. + //! \return A pointer to the new object if successful, or null if not. + //! + //! This method is used to create a copy of an existing object. + //! + //! This only works for objects, for primitive types and object handles the method + //! doesn't do anything and returns a null pointer. + virtual void *CreateScriptObjectCopy(void *obj, int typeId) = 0; + //! \brief Copy one script object to another. + //! \param[in] dstObj A pointer to the destination object. + //! \param[in] srcObj A pointer to the source object. + //! \param[in] typeId The type id of the objects. + //! + //! This calls the assignment operator to copy the object from one to the other. + //! + //! This only works for objects. + virtual void CopyScriptObject(void *dstObj, void *srcObj, int typeId) = 0; + //! \brief Release the script object pointer. + //! \param[in] obj A pointer to the object. + //! \param[in] typeId The type id of the object. + //! + //! This calls the release method of the object to release the reference. + //! + //! This only works for objects. + virtual void ReleaseScriptObject(void *obj, int typeId) = 0; + //! \brief Increase the reference counter for the script object. + //! \param[in] obj A pointer to the object. + //! \param[in] typeId The type id of the object. + //! + //! This calls the add ref method of the object to increase the reference count. + //! + //! This only works for objects. + virtual void AddRefScriptObject(void *obj, int typeId) = 0; + //! \brief Returns true if the object referenced by a handle compatible with the specified type. + //! \param[in] obj A pointer to the object. + //! \param[in] objTypeId The type id of the object. + //! \param[in] handleTypeId The type id of the handle. + //! \return Returns true if the handle type is compatible with the object type. + //! + //! This method can be used to determine if a handle of a certain type is + //! compatible with an object of another type. This is useful if you have a pointer + //! to a object, but only knows that it implements a certain interface and now you + //! want to determine if it implements another interface. + virtual bool IsHandleCompatibleWithObject(void *obj, int objTypeId, int handleTypeId) = 0; + //! \} + + // String interpretation + //! \name String interpretation + //! \{ + + //! \brief Returns the class and length of the first token in the string. + //! \param[in] string The string to parse. + //! \param[in] stringLength The length of the string. Can be 0 if the string is null terminated. + //! \param[out] tokenLength Gives the length of the identified token. + //! \return One of the \ref asETokenClass values. + //! + //! This function is useful for those applications that want to tokenize strings into + //! tokens that the script language uses, e.g. IDEs providing syntax highlighting, or intellisense. + //! It can also be used to parse the meta data strings that may be declared for script entities. + virtual asETokenClass ParseToken(const char *string, size_t stringLength = 0, int *tokenLength = 0) = 0; + //! \} + + // Garbage collection + //! \name Garbage collection + //! \{ + + //! \brief Perform garbage collection. + //! \param[in] flags Set to a combination of the \ref asEGCFlags. + //! \return 1 if the cycle wasn't completed, 0 if it was. + //! + //! This method will free script objects that can no longer be reached. When the engine + //! is released the garbage collector will automatically do a full cycle to release all + //! objects still alive. If the engine is long living it is important to call this method + //! every once in a while to free up memory allocated by the scripts. If a script does a + //! lot of allocations before returning it may be necessary to implement a line callback + //! function that calls the garbage collector during execution of the script. + //! + //! It is not necessary to do a full cycle with every call. This makes it possible to spread + //! out the garbage collection time over a large period, thus not impacting the responsiveness + //! of the application. + //! + //! \see \ref doc_gc + virtual int GarbageCollect(asDWORD flags = asGC_FULL_CYCLE) = 0; + //! \brief Obtain statistics from the garbage collector. + //! \param[out] currentSize The current number of objects known to the garbage collector. + //! \param[out] totalDestroyed The total number of objects destroyed by the garbage collector. + //! \param[out] totalDetected The total number of objects detected as garbage with circular references. + //! + //! This method can be used to query the number of objects that the garbage collector is + //! keeping track of. If the number is very large then it is probably time to call the + //! \ref GarbageCollect method so that some of the objects ca be freed. + //! + //! \see \ref doc_gc + virtual void GetGCStatistics(asUINT *currentSize, asUINT *totalDestroyed = 0, asUINT *totalDetected = 0) = 0; + //! \brief Notify the garbage collector of a new object that needs to be managed. + //! \param[in] obj A pointer to the newly created object. + //! \param[in] typeId The type id of the object. + //! + //! This method should be called when a new garbage collected object is created. + //! The GC will then store a reference to the object so that it can automatically + //! detect whether the object is involved in any circular references that should be released. + //! + //! \see \ref doc_gc_object + virtual void NotifyGarbageCollectorOfNewObject(void *obj, int typeId) = 0; + //! \brief Used by the garbage collector to enumerate all references held by an object. + //! \param[in] reference A pointer to the referenced object. + //! + //! When processing the EnumReferences call the called object should call GCEnumCallback + //! for each of the references it holds to other objects. + //! + //! \see \ref doc_gc_object + virtual void GCEnumCallback(void *reference) = 0; + //! \} + + // User data + //! \name User data + //! \{ + + //! \brief Register the memory address of some user data. + //! \param[in] data A pointer to the user data. + //! \return The previous pointer stored in the engine. + //! + //! This method allows the application to associate a value, e.g. a pointer, with the engine instance. + virtual void *SetUserData(void *data) = 0; + //! \brief Returns the address of the previously registered user data. + //! \return The pointer to the user data. + virtual void *GetUserData() = 0; + //! \} + +#ifdef AS_DEPRECATED + //! \name Deprecated + //! \{ + + // deprecated since 2009-12-08, 2.18.0 + //! \deprecated Since 2.18.0. Use the \ref doc_addon_helpers "ExecuteString" helper function instead. + virtual int ExecuteString(const char *module, const char *script, asIScriptContext **ctx = 0, asDWORD flags = 0) = 0; + //! \} +#endif + +protected: + virtual ~asIScriptEngine() {} +}; + +//! \brief The interface to the script modules +class asIScriptModule +{ +public: + //! \name Miscellaneous + //! \{ + + //! \brief Returns a pointer to the engine. + //! \return A pointer to the engine. + virtual asIScriptEngine *GetEngine() = 0; + //! \brief Sets the name of the module. + //! \param[in] name The new name. + //! + //! Sets the name of the script module. + virtual void SetName(const char *name) = 0; + //! \brief Gets the name of the module. + //! \return The name of the module. + virtual const char *GetName() = 0; + //! \} + + // Compilation + //! \name Compilation + //! \{ + + //! \brief Add a script section for the next build. + //! + //! \param[in] name The name of the script section + //! \param[in] code The script code buffer + //! \param[in] codeLength The length of the script code + //! \param[in] lineOffset An offset that will be added to compiler message line numbers + //! \return A negative value on error. + //! \retval asMODULE_IS_IN_USE The module is currently in use. + //! + //! This adds a script section to the module. All sections added will be treated as if one + //! large script. Errors reported will give the name of the corresponding section. + //! + //! The code added is copied by the engine, so there is no need to keep the original buffer after the call. + //! Note that this can be changed by setting the engine property \ref asEP_COPY_SCRIPT_SECTIONS + //! with \ref asIScriptEngine::SetEngineProperty. + virtual int AddScriptSection(const char *name, const char *code, size_t codeLength = 0, int lineOffset = 0) = 0; + //! \brief Build the previously added script sections. + //! + //! \return A negative value on error + //! \retval asINVALID_CONFIGURATION The engine configuration is invalid. + //! \retval asERROR The script failed to build. + //! \retval asBUILD_IN_PROGRESS Another thread is currently building. + //! + //! Builds the script based on the added sections, and registered types and functions. After the + //! build is complete the script sections are removed to free memory. If the script module needs + //! to be rebuilt all of the script sections needs to be added again. + //! + //! Compiler messages are sent to the message callback function set with \ref asIScriptEngine::SetMessageCallback. + //! If there are no errors or warnings, no messages will be sent to the callback function. + //! + //! Any global variables found in the script will be initialized by the + //! compiler if the engine property \ref asEP_INIT_GLOBAL_VARS_AFTER_BUILD is set. + virtual int Build() = 0; + //! \brief Compile a single function. + //! + //! \param[in] sectionName The name of the script section + //! \param[in] code The script code buffer + //! \param[in] lineOffset An offset that will be added to compiler message line numbers + //! \param[in] compileFlags One of \ref asECompileFlags values + //! \param[out] outFunc Optional parameter to receive the compiled function descriptor + //! \return A negative value on error + //! \retval asINVALID_ARG One or more arguments have invalid values. + //! \retval asINVALID_CONFIGURATION The engine configuration is invalid. + //! \retval asBUILD_IN_PROGRESS Another build is in progress. + //! \retval asERROR The compilation failed. + //! + //! Use this to compile a single function. The function can be optionally added to the scope of the module, in which case + //! it will be available for subsequent compilations. If not added to the module, the function can still be returned in the + //! output parameter, which will allow the application to execute it, and then discard it when it is no longer needed. + //! + //! If the output function parameter is set, remember to release the function object when you're done with it. + virtual int CompileFunction(const char *sectionName, const char *code, int lineOffset, asDWORD compileFlags, asIScriptFunction **outFunc) = 0; + //! \brief Compile a single global variable and add it to the scope of the module + //! + //! \param[in] sectionName The name of the script section + //! \param[in] code The script code buffer + //! \param[in] lineOffset An offset that will be added to compiler message line numbers + //! \return A negative value on error + //! \retval asINVALID_ARG One or more arguments have invalid values. + //! \retval asINVALID_CONFIGURATION The engine configuration is invalid. + //! \retval asBUILD_IN_PROGRESS Another build is in progress. + //! \retval asERROR The compilation failed. + //! + //! Use this to add a single global variable to the scope of a module. The variable can then + //! be referred to by the application and subsequent compilations. + //! + //! The script code may contain an initialization expression, which will be executed by the + //! compiler if the engine property \ref asEP_INIT_GLOBAL_VARS_AFTER_BUILD is set. + virtual int CompileGlobalVar(const char *sectionName, const char *code, int lineOffset) = 0; + //! \} + + // Functions + //! \name Functions + //! \{ + + //! \brief Returns the number of global functions in the module. + //! \return A negative value on error, or the number of global functions in this module. + //! \retval asERROR The module was not compiled successfully. + //! + //! This method retrieves the number of compiled script functions. + virtual int GetFunctionCount() = 0; + //! \brief Returns the function id by index. + //! \param[in] index The index of the function. + //! \return A negative value on error, or the function id. + //! \retval asNO_FUNCTION There is no function with that index. + //! + //! This method should be used to retrieve the id of the script function that you wish to + //! execute. The id is then sent to the context's \ref asIScriptContext::Prepare "Prepare" method. + virtual int GetFunctionIdByIndex(int index) = 0; + //! \brief Returns the function id by name. + //! \param[in] name The name of the function. + //! \return A negative value on error, or the function id. + //! \retval asERROR The module was not compiled successfully. + //! \retval asMULTIPLE_FUNCTIONS Found multiple matching functions. + //! \retval asNO_FUNCTION Didn't find any matching functions. + //! + //! This method should be used to retrieve the id of the script function that you + //! wish to execute. The id is then sent to the context's \ref asIScriptContext::Prepare "Prepare" method. + virtual int GetFunctionIdByName(const char *name) = 0; + //! \brief Returns the function id by declaration. + //! \param[in] decl The function signature. + //! \return A negative value on error, or the function id. + //! \retval asERROR The module was not compiled successfully. + //! \retval asINVALID_DECLARATION The \a decl is invalid. + //! \retval asMULTIPLE_FUNCTIONS Found multiple matching functions. + //! \retval asNO_FUNCTION Didn't find any matching functions. + //! + //! This method should be used to retrieve the id of the script function that you wish + //! to execute. The id is then sent to the context's \ref asIScriptContext::Prepare "Prepare" method. + //! + //! The method will find the script function with the exact same declaration. + virtual int GetFunctionIdByDecl(const char *decl) = 0; + //! \brief Returns the function descriptor for the script function + //! \param[in] index The index of the function. + //! \return A pointer to the function description interface, or null if not found. + virtual asIScriptFunction *GetFunctionDescriptorByIndex(int index) = 0; + //! \brief Returns the function descriptor for the script function + //! \param[in] funcId The id of the function or method. + //! \return A pointer to the function description interface, or null if not found. + virtual asIScriptFunction *GetFunctionDescriptorById(int funcId) = 0; + //! \brief Remove a single function from the scope of the module + //! \param[in] funcId The id of the function to remove. + //! \return A negative value on error. + //! \retval asNO_FUNCTION The function is not part of the scope. + //! + //! This method allows the application to remove a single function from the + //! scope of the module. The function is not destroyed immediately though, + //! only when no more references point to it. + virtual int RemoveFunction(int funcId) = 0; + //! \} + + // Global variables + //! \name Global variables + //! \{ + + //! \brief Reset the global variables of the module. + //! + //! \return A negative value on error. + //! \retval asERROR The module was not compiled successfully. + //! + //! Resets the global variables declared in this module to their initial value. + virtual int ResetGlobalVars() = 0; + //! \brief Returns the number of global variables in the module. + //! \return A negative value on error, or the number of global variables in the module. + //! \retval asERROR The module was not compiled successfully. + //! \retval asINIT_GLOBAL_VARS_FAILED The initialization of the global variables failed. + virtual int GetGlobalVarCount() = 0; + //! \brief Returns the global variable index by name. + //! \param[in] name The name of the global variable. + //! \return A negative value on error, or the global variable index. + //! \retval asERROR The module was not built successfully. + //! \retval asNO_GLOBAL_VAR The matching global variable was found. + //! + //! This method should be used to retrieve the index of the script variable that you wish to access. + virtual int GetGlobalVarIndexByName(const char *name) = 0; + //! \brief Returns the global variable index by declaration. + //! \param[in] decl The global variable declaration. + //! \return A negative value on error, or the global variable index. + //! \retval asERROR The module was not built successfully. + //! \retval asNO_GLOBAL_VAR The matching global variable was found. + //! + //! This method should be used to retrieve the index of the script variable that you wish to access. + //! + //! The method will find the script variable with the exact same declaration. + virtual int GetGlobalVarIndexByDecl(const char *decl) = 0; + //! \brief Returns the global variable declaration. + //! \param[in] index The index of the global variable. + //! \return A null terminated string with the variable declaration, or null if not found. + //! + //! This method can be used to retrieve the variable declaration of the script variables + //! that the host application will access. Verifying the declaration is important because, + //! even though the script may compile correctly the user may not have used the variable + //! types as intended. + virtual const char *GetGlobalVarDeclaration(int index) = 0; + //! \brief Returns the global variable name. + //! \param[in] index The index of the global variable. + //! \return A null terminated string with the variable name, or null if not found. + virtual const char *GetGlobalVarName(int index) = 0; + //! \brief Returns the type id for the global variable. + //! \param[in] index The index of the global variable. + //! \param[out] isConst Receives the constness indicator of the variable. + //! \return The type id of the global variable, or a negative value on error. + //! \retval asINVALID_ARG The index is out of range. + virtual int GetGlobalVarTypeId(int index, bool *isConst = 0) = 0; + //! \brief Returns the pointer to the global variable. + //! \param[in] index The index of the global variable. + //! \return A pointer to the global variable, or null if not found. + //! + //! This method should be used to retrieve the pointer of a variable that you wish to access. + virtual void *GetAddressOfGlobalVar(int index) = 0; + //! \brief Remove the global variable from the scope of the module. + //! \param[in] index The index of the global variable. + //! \return A negative value on error. + //! \retval asINVALID_ARG The index is out of range. + //! + //! The global variable is removed from the scope of the module, but + //! it is not destroyed until all functions that access it are freed. + virtual int RemoveGlobalVar(int index) = 0; + //! \} + + // Type identification + //! \name Type identification + //! \{ + + //! \brief Returns the number of object types. + //! \return The number of object types declared in the module. + virtual int GetObjectTypeCount() = 0; + //! \brief Returns the object type interface by index. + //! \param[in] index The index of the type. + //! \return The object type interface for the type, or null if not found. + virtual asIObjectType *GetObjectTypeByIndex(asUINT index) = 0; + //! \brief Returns a type id by declaration. + //! \param[in] decl The declaration of the type. + //! \return A negative value on error, or the type id of the type. + //! \retval asINVALID_TYPE \a decl is not a valid type. + //! + //! Translates a type declaration into a type id. The returned type id is valid for as long as + //! the type is valid, so you can safely store it for later use to avoid potential overhead by + //! calling this function each time. Just remember to update the type id, any time the type is + //! changed within the engine, e.g. when recompiling script declared classes, or changing the + //! engine configuration. + //! + //! The type id is based on a sequence number and depends on the order in which the type ids are + //! queried, thus is not guaranteed to always be the same for each execution of the application. + //! The \ref asETypeIdFlags can be used to obtain some information about the type directly from the id. + //! + //! A base type yields the same type id whether the declaration is const or not, however if the + //! const is for the subtype then the type id is different, e.g. string@ isn't the same as const + //! string@ but string is the same as const string. + virtual int GetTypeIdByDecl(const char *decl) = 0; + //! \} + + // Enums + //! \name Enums + //! \{ + + //! \brief Returns the number of enum types declared in the module. + //! \return The number of enum types in the module. + virtual int GetEnumCount() = 0; + //! \brief Returns the enum type. + //! \param[in] index The index of the enum type. + //! \param[out] enumTypeId Receives the type id of the enum type. + //! \return The name of the enum type, or null on error. + virtual const char *GetEnumByIndex(asUINT index, int *enumTypeId) = 0; + //! \brief Returns the number of values defined for the enum type. + //! \param[in] enumTypeId The type id of the enum type. + //! \return The number of enum values or a negative value on error. + //! \retval asINVALID_ARG \a enumTypeId is not an enum type. + virtual int GetEnumValueCount(int enumTypeId) = 0; + //! \brief Returns the name and value of the enum value. + //! \param[in] enumTypeId The type id of the enum type. + //! \param[in] index The index of the enum value. + //! \param[out] outValue Receives the numeric value. + //! \return The name of the enum value. + virtual const char *GetEnumValueByIndex(int enumTypeId, asUINT index, int *outValue) = 0; + //! \} + + // Typedefs + //! \name Typedefs + //! \{ + + //! \brief Returns the number of typedefs in the module. + //! \return The number of typedefs in the module. + virtual int GetTypedefCount() = 0; + //! \brief Returns the typedef. + //! \param[in] index The index of the typedef. + //! \param[out] typeId The type that the typedef aliases. + //! \return The name of the typedef. + virtual const char *GetTypedefByIndex(asUINT index, int *typeId) = 0; + //! \} + + // Dynamic binding between modules + //! \name Dynamic binding between modules + //! \{ + + //! \brief Returns the number of functions declared for import. + //! \return A negative value on error, or the number of imported functions. + //! \retval asERROR The module was not built successfully. + //! + //! This function returns the number of functions that are imported in a module. These + //! functions need to be bound before they can be used, or a script exception will be thrown. + virtual int GetImportedFunctionCount() = 0; + //! \brief Returns the imported function index by declaration. + //! \param[in] decl The function declaration of the imported function. + //! \return A negative value on error, or the index of the imported function. + //! \retval asERROR The module was not built successfully. + //! \retval asMULTIPLE_FUNCTIONS Found multiple matching functions. + //! \retval asNO_FUNCTION Didn't find any matching function. + //! + //! This function is used to find a specific imported function by its declaration. + virtual int GetImportedFunctionIndexByDecl(const char *decl) = 0; + //! \brief Returns the imported function declaration. + //! \param[in] importIndex The index of the imported function. + //! \return A null terminated string with the function declaration, or null if not found. + //! + //! Use this function to get the declaration of the imported function. The returned + //! declaration can be used to find a matching function in another module that can be bound + //! to the imported function. + virtual const char *GetImportedFunctionDeclaration(int importIndex) = 0; + //! \brief Returns the declared imported function source module. + //! \param[in] importIndex The index of the imported function. + //! \return A null terminated string with the name of the source module, or null if not found. + //! + //! Use this function to get the name of the suggested module to import the function from. + virtual const char *GetImportedFunctionSourceModule(int importIndex) = 0; + //! \brief Binds an imported function to the function from another module. + //! \param[in] importIndex The index of the imported function. + //! \param[in] funcId The function id of the function that will be bound to the imported function. + //! \return A negative value on error. + //! \retval asNO_FUNCTION \a importIndex or \a fundId is incorrect. + //! \retval asINVALID_INTERFACE The signature of function doesn't match the import statement. + //! + //! The imported function is only bound if the functions have the exact same signature, + //! i.e the same return type, and parameters. + virtual int BindImportedFunction(int importIndex, int funcId) = 0; + //! \brief Unbinds an imported function. + //! \param[in] importIndex The index of the imported function. + //! \return A negative value on error. + //! \retval asINVALID_ARG The index is not valid. + //! + //! Unbinds the imported function. + virtual int UnbindImportedFunction(int importIndex) = 0; + + //! \brief Binds all imported functions in a module, by searching their equivalents in the declared source modules. + //! \return A negative value on error. + //! \retval asERROR An error occurred. + //! \retval asCANT_BIND_ALL_FUNCTIONS Not all functions where bound. + //! + //! This functions tries to bind all imported functions in the module by searching for matching + //! functions in the suggested modules. If a function cannot be bound the function will give an + //! error \ref asCANT_BIND_ALL_FUNCTIONS, but it will continue binding the rest of the functions. + virtual int BindAllImportedFunctions() = 0; + //! \brief Unbinds all imported functions. + //! \return A negative value on error. + //! + //! Unbinds all imported functions in the module. + virtual int UnbindAllImportedFunctions() = 0; + //! \} + + // Bytecode saving and loading + //! \name Bytecode saving and loading + //! \{ + + //! \brief Save compiled bytecode to a binary stream. + //! \param[in] out The output stream. + //! \return A negative value on error. + //! \retval asINVALID_ARG The stream object wasn't specified. + //! + //! This method is used to save pre-compiled byte code to disk or memory, for a later restoral. + //! The application must implement an object that inherits from \ref asIBinaryStream to provide + //! the necessary stream operations. + //! + //! The pre-compiled byte code is currently not platform independent, so you need to make + //! sure the byte code is compiled on a platform that is compatible with the one that will load it. + virtual int SaveByteCode(asIBinaryStream *out) = 0; + //! \brief Load pre-compiled bytecode from a binary stream. + //! + //! \param[in] in The input stream. + //! \return A negative value on error. + //! \retval asINVALID_ARG The stream object wasn't specified. + //! \retval asBUILD_IN_PROGRESS Another thread is currently building. + //! + //! This method is used to load pre-compiled byte code from disk or memory. The application must + //! implement an object that inherits from \ref asIBinaryStream to provide the necessary stream operations. + //! + //! It is expected that the application performs the necessary validations to make sure the + //! pre-compiled byte code is from a trusted source. The application should also make sure the + //! pre-compiled byte code is compatible with the current engine configuration, i.e. that the + //! engine has been configured in the same way as when the byte code was first compiled. + virtual int LoadByteCode(asIBinaryStream *in) = 0; + //! \} + +protected: + virtual ~asIScriptModule() {} +}; + +//! \brief The interface to the virtual machine +class asIScriptContext +{ +public: + // Memory management + //! \name Memory management + //! \{ + + //! \brief Increase reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when storing an additional reference to the object. + //! Remember that the first reference that is received from \ref asIScriptEngine::CreateContext + //! is already accounted for. + virtual int AddRef() = 0; + //! \brief Decrease reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when you will no longer use the references that you own. + virtual int Release() = 0; + //! \} + + // Miscellaneous + //! \name Miscellaneous + //! \{ + + //! \brief Returns a pointer to the engine. + //! \return A pointer to the engine. + virtual asIScriptEngine *GetEngine() = 0; + //! \} + + // Execution + //! \name Execution + //! \{ + + //! \brief Prepares the context for execution of the function identified by funcId. + //! \param[in] funcId The id of the function/method that will be executed. + //! \return A negative value on error. + //! \retval asCONTEXT_ACTIVE The context is still active or suspended. + //! \retval asNO_FUNCTION The function id doesn't exist. + //! + //! This method prepares the context for execution of a script function. It allocates + //! the stack space required and reserves space for return value and parameters. The + //! default value for parameters and return value is 0. + //! + //! \see \ref doc_call_script_func + virtual int Prepare(int funcId) = 0; + //! \brief Frees resources held by the context. + //! \return A negative value on error. + //! \retval asCONTEXT_ACTIVE The context is still active or suspended. + //! + //! This function frees resources held by the context. It's usually not necessary + //! to call this function as the resources are automatically freed when the context + //! is released, or reused when \ref Prepare is called again. + virtual int Unprepare() = 0; + //! \brief Sets the object for a class method call. + //! \param[in] obj A pointer to the object. + //! \return A negative value on error. + //! \retval asCONTEXT_NOT_PREPARED The context is not in prepared state. + //! \retval asERROR The prepared function is not a class method. + //! + //! This method sets object pointer when calling class methods. + virtual int SetObject(void *obj) = 0; + //! \brief Executes the prepared function. + //! \return A negative value on error, or one of \ref asEContextState. + //! \retval asERROR Invalid context object, the context is not prepared, or it is not in suspended state. + //! \retval asEXECUTION_ABORTED The execution was aborted with a call to \ref Abort. + //! \retval asEXECUTION_SUSPENDED The execution was suspended with a call to \ref Suspend. + //! \retval asEXECUTION_FINISHED The execution finished successfully. + //! \retval asEXECUTION_EXCEPTION The execution ended with an exception. + //! + //! Executes the prepared function until the script returns. If the execution was previously + //! suspended the function resumes where it left of. + //! + //! Note that if the script freezes, e.g. if trapped in a never ending loop, you may call + //! \ref Abort from another thread to stop execution. + //! + //! \see \ref doc_call_script_func + virtual int Execute() = 0; + //! \brief Aborts the execution. + //! \return A negative value on error. + //! \retval asERROR Invalid context object. + //! + //! Aborts the current execution of a script. + virtual int Abort() = 0; + //! \brief Suspends the execution, which can then be resumed by calling Execute again. + //! \return A negative value on error. + //! \retval asERROR Invalid context object. + //! + //! Suspends the current execution of a script. The execution can then be resumed by calling \ref Execute again. + //! + //! \see \ref doc_call_script_func + virtual int Suspend() = 0; + //! \brief Returns the state of the context. + //! \return The current state of the context. + virtual asEContextState GetState() = 0; + //! \} + + // Arguments + //! \name Arguments + //! \{ + + //! \brief Sets an 8-bit argument value. + //! \param[in] arg The argument index. + //! \param[in] value The value of the argument. + //! \return A negative value on error. + //! \retval asCONTEXT_NOT_PREPARED The context is not in prepared state. + //! \retval asINVALID_ARG The \a arg is larger than the number of arguments in the prepared function. + //! \retval asINVALID_TYPE The argument is not an 8-bit value. + //! + //! Sets a 1 byte argument. + virtual int SetArgByte(asUINT arg, asBYTE value) = 0; + //! \brief Sets a 16-bit argument value. + //! \param[in] arg The argument index. + //! \param[in] value The value of the argument. + //! \return A negative value on error. + //! \retval asCONTEXT_NOT_PREPARED The context is not in prepared state. + //! \retval asINVALID_ARG The \a arg is larger than the number of arguments in the prepared function. + //! \retval asINVALID_TYPE The argument is not a 16-bit value. + //! + //! Sets a 2 byte argument. + virtual int SetArgWord(asUINT arg, asWORD value) = 0; + //! \brief Sets a 32-bit integer argument value. + //! \param[in] arg The argument index. + //! \param[in] value The value of the argument. + //! \return A negative value on error. + //! \retval asCONTEXT_NOT_PREPARED The context is not in prepared state. + //! \retval asINVALID_ARG The \a arg is larger than the number of arguments in the prepared function. + //! \retval asINVALID_TYPE The argument is not a 32-bit value. + //! + //! Sets a 4 byte argument. + virtual int SetArgDWord(asUINT arg, asDWORD value) = 0; + //! \brief Sets a 64-bit integer argument value. + //! \param[in] arg The argument index. + //! \param[in] value The value of the argument. + //! \return A negative value on error. + //! \retval asCONTEXT_NOT_PREPARED The context is not in prepared state. + //! \retval asINVALID_ARG The \a arg is larger than the number of arguments in the prepared function. + //! \retval asINVALID_TYPE The argument is not a 64-bit value. + //! + //! Sets an 8 byte argument. + virtual int SetArgQWord(asUINT arg, asQWORD value) = 0; + //! \brief Sets a float argument value. + //! \param[in] arg The argument index. + //! \param[in] value The value of the argument. + //! \return A negative value on error. + //! \retval asCONTEXT_NOT_PREPARED The context is not in prepared state. + //! \retval asINVALID_ARG The \a arg is larger than the number of arguments in the prepared function. + //! \retval asINVALID_TYPE The argument is not a 32-bit value. + //! + //! Sets a float argument. + virtual int SetArgFloat(asUINT arg, float value) = 0; + //! \brief Sets a double argument value. + //! \param[in] arg The argument index. + //! \param[in] value The value of the argument. + //! \return A negative value on error. + //! \retval asCONTEXT_NOT_PREPARED The context is not in prepared state. + //! \retval asINVALID_ARG The \a arg is larger than the number of arguments in the prepared function. + //! \retval asINVALID_TYPE The argument is not a 64-bit value. + //! + //! Sets a double argument. + virtual int SetArgDouble(asUINT arg, double value) = 0; + //! \brief Sets the address of a reference or handle argument. + //! \param[in] arg The argument index. + //! \param[in] addr The address that should be passed in the argument. + //! \return A negative value on error. + //! \retval asCONTEXT_NOT_PREPARED The context is not in prepared state. + //! \retval asINVALID_ARG The \a arg is larger than the number of arguments in the prepared function. + //! \retval asINVALID_TYPE The argument is not a reference or an object handle. + //! + //! Sets an address argument, e.g. an object handle or a reference. + virtual int SetArgAddress(asUINT arg, void *addr) = 0; + //! \brief Sets the object argument value. + //! \param[in] arg The argument index. + //! \param[in] obj A pointer to the object. + //! \return A negative value on error. + //! \retval asCONTEXT_NOT_PREPARED The context is not in prepared state. + //! \retval asINVALID_ARG The \a arg is larger than the number of arguments in the prepared function. + //! \retval asINVALID_TYPE The argument is not an object or handle. + //! + //! Sets an object argument. If the argument is an object handle AngelScript will increment the reference + //! for the object. If the argument is an object value AngelScript will make a copy of the object. + virtual int SetArgObject(asUINT arg, void *obj) = 0; + //! \brief Returns a pointer to the argument for assignment. + //! \param[in] arg The argument index. + //! \return A pointer to the argument on the stack. + //! + //! This method returns a pointer to the argument on the stack for assignment. For object handles, you + //! should increment the reference counter. For object values, you should pass a pointer to a copy of the + //! object. + virtual void *GetAddressOfArg(asUINT arg) = 0; + //! \} + + // Return value + //! \name Return value + //! \{ + + //! \brief Returns the 8-bit return value. + //! \return The 1 byte value returned from the script function, or 0 on error. + virtual asBYTE GetReturnByte() = 0; + //! \brief Returns the 16-bit return value. + //! \return The 2 byte value returned from the script function, or 0 on error. + virtual asWORD GetReturnWord() = 0; + //! \brief Returns the 32-bit return value. + //! \return The 4 byte value returned from the script function, or 0 on error. + virtual asDWORD GetReturnDWord() = 0; + //! \brief Returns the 64-bit return value. + //! \return The 8 byte value returned from the script function, or 0 on error. + virtual asQWORD GetReturnQWord() = 0; + //! \brief Returns the float return value. + //! \return The float value returned from the script function, or 0 on error. + virtual float GetReturnFloat() = 0; + //! \brief Returns the double return value. + //! \return The double value returned from the script function, or 0 on error. + virtual double GetReturnDouble() = 0; + //! \brief Returns the address for a reference or handle return type. + //! \return The address value returned from the script function, or 0 on error. + //! + //! The method doesn't increase the reference counter with this call, so if you store + //! the pointer of a reference counted object you need to increase the reference manually + //! otherwise the object will be released when the context is released or reused. + virtual void *GetReturnAddress() = 0; + //! \brief Return a pointer to the returned object. + //! \return A pointer to the object returned from the script function, or 0 on error. + //! + //! The method doesn't increase the reference counter with this call, so if you store + //! the pointer of a reference counted object you need to increase the reference manually + //! otherwise the object will be released when the context is released or reused. + virtual void *GetReturnObject() = 0; + //! \brief Returns the address of the returned value + //! \return A pointer to the return value returned from the script function, or 0 on error. + virtual void *GetAddressOfReturnValue() = 0; + //! \} + + // Exception handling + //! \name Exception handling + //! \{ + + //! \brief Sets an exception, which aborts the execution. + //! \param[in] string A string that describes the exception that occurred. + //! \return A negative value on error. + //! \retval asERROR The context isn't currently calling an application registered function. + //! + //! This method sets a script exception in the context. This will only work if the + //! context is currently calling a system function, thus this method can only be + //! used for system functions. + //! + //! Note that if your system function sets an exception, it should not return any + //! object references because the engine will not release the returned reference. + virtual int SetException(const char *string) = 0; + //! \brief Returns the line number where the exception occurred. + //! \param[out] column The variable will receive the column number. + //! \return The line number where the exception occurred. + //! + //! This method returns the line number where the exception ocurred. The line number + //! is relative to the script section where the function was implemented. + virtual int GetExceptionLineNumber(int *column = 0) = 0; + //! \brief Returns the function id of the function where the exception occurred. + //! \return The function id where the exception occurred. + virtual int GetExceptionFunction() = 0; + //! \brief Returns the exception string text. + //! \return A null terminated string describing the exception that occurred. + virtual const char *GetExceptionString() = 0; + //! \brief Sets an exception callback function. The function will be called if a script exception occurs. + //! \param[in] callback The callback function/method that should be called upon an exception. + //! \param[in] obj The object pointer on which the callback is called. + //! \param[in] callConv The calling convention of the callback function/method. + //! \return A negative value on error. + //! \retval asNOT_SUPPORTED Calling convention must not be asCALL_GENERIC, or the routine's calling convention is not supported. + //! \retval asINVALID_ARG \a obj must not be null for class methods. + //! \retval asWRONG_CALLING_CONV \a callConv isn't compatible with the routines' calling convention. + //! + //! This callback function will be called by the VM when a script exception is raised, which + //! allow the application to examine the callstack and generate a detailed report before the + //! callstack is cleaned up. + //! + //! See \ref SetLineCallback for details on the calling convention. + virtual int SetExceptionCallback(asSFuncPtr callback, void *obj, int callConv) = 0; + //! \brief Removes a previously registered callback. + //! Removes a previously registered callback. + virtual void ClearExceptionCallback() = 0; + //! \} + + // Debugging + //! \name Debugging + //! \{ + + //! \brief Sets a line callback function. The function will be called for each executed script statement. + //! \param[in] callback The callback function/method that should be called for each script line executed. + //! \param[in] obj The object pointer on which the callback is called. + //! \param[in] callConv The calling convention of the callback function/method. + //! \return A negative value on error. + //! \retval asNOT_SUPPORTED Calling convention must not be asCALL_GENERIC, or the routine's calling convention is not supported. + //! \retval asINVALID_ARG \a obj must not be null for class methods. + //! \retval asWRONG_CALLING_CONV \a callConv isn't compatible with the routines' calling convention. + //! + //! This function sets a callback function that will be called by the VM each time the SUSPEND + //! instruction is encounted. Generally this instruction is placed before each statement. Thus by + //! setting this callback function it is possible to monitor the execution, and suspend the execution + //! at application defined locations. + //! + //! The callback function can be either a global function or a class method. For a global function + //! the VM will pass two parameters, first the context pointer and then the object pointer specified + //! by the application. For a class method, the VM will call the method using the object pointer + //! as the owner. + //! + //! \code + //! void Callback(asIScriptContext *ctx, void *obj); + //! void Object::Callback(asIScriptContext *ctx); + //! \endcode + //! + //! The global function can use either \ref asCALL_CDECL or \ref asCALL_STDCALL, and the class method can use either + //! \ref asCALL_THISCALL, \ref asCALL_CDECL_OBJLAST, or \ref asCALL_CDECL_OBJFIRST. + //! + //! \see \ref doc_debug + virtual int SetLineCallback(asSFuncPtr callback, void *obj, int callConv) = 0; + //! \brief Removes a previously registered callback. + //! Removes a previously registered callback. + virtual void ClearLineCallback() = 0; + //! \brief Get the current line number that is being executed. + //! \param[out] column The variable will receive the column number. + //! \return The current line number. + //! + //! This method returns the line number where the context is currently located. + //! The line number is relative to the script section where the function was implemented. + virtual int GetCurrentLineNumber(int *column = 0) = 0; + //! \brief Get the current function that is being executed. + //! \return The function id of the current function. + virtual int GetCurrentFunction() = 0; + //! \brief Returns the size of the callstack, i.e. the number of functions that have yet to complete. + //! \return The number of functions on the call stack. + //! + //! This methods returns the size of the callstack, i.e. how many parent functions there are + //! above the current functions being called. It can be used to enumerate the callstack in order + //! to generate a detailed report when an exception occurs, or for debugging running scripts. + virtual int GetCallstackSize() = 0; + //! \brief Returns the function id at the specified callstack level. + //! \param[in] index The index on the call stack. + //! \return The function id on the call stack referred to by the index. + virtual int GetCallstackFunction(int index) = 0; + //! \brief Returns the line number at the specified callstack level. + //! \param[in] index The index on the call stack. + //! \param[out] column The variable will receive the column number. + //! \return The line number for the call stack level referred to by the index. + virtual int GetCallstackLineNumber(int index, int *column = 0) = 0; + //! \brief Returns the number of local variables at the specified callstack level. + //! \param[in] stackLevel The index on the call stack. + //! \return The number of variables in the function on the call stack level. + //! + //! Returns the number of declared variables, including the parameters, in the function on the stack. + virtual int GetVarCount(int stackLevel = -1) = 0; + //! \brief Returns the name of local variable at the specified callstack level. + //! \param[in] varIndex The index of the variable. + //! \param[in] stackLevel The index on the call stack. + //! \return A null terminated string with the name of the variable. + virtual const char *GetVarName(int varIndex, int stackLevel = -1) = 0; + //! \brief Returns the declaration of a local variable at the specified callstack level. + //! \param[in] varIndex The index of the variable. + //! \param[in] stackLevel The index on the call stack. + //! \return A null terminated string with the declaration of the variable. + virtual const char *GetVarDeclaration(int varIndex, int stackLevel = -1) = 0; + //! \brief Returns the type id of a local variable at the specified callstack level. + //! \param[in] varIndex The index of the variable. + //! \param[in] stackLevel The index on the call stack. + //! \return The type id of the variable, or a negative value on error. + //! \retval asINVALID_ARG The index or stack level is invalid. + virtual int GetVarTypeId(int varIndex, int stackLevel = -1) = 0; + //! \brief Returns a pointer to a local variable at the specified callstack level. + //! \param[in] varIndex The index of the variable. + //! \param[in] stackLevel The index on the call stack. + //! \return A pointer to the variable. + //! + //! Returns a pointer to the variable, so that its value can be read and written. The + //! address is valid until the script function returns. + //! + //! Note that object variables may not be initalized at all moments, thus you must verify + //! if the address returned points to a null pointer, before you try to dereference it. + virtual void *GetAddressOfVar(int varIndex, int stackLevel = -1) = 0; + //! \brief Returns the type id of the object, if a class method is being executed. + //! \param[in] stackLevel The index on the call stack. + //! \return Returns the type id of the object if it is a class method. + virtual int GetThisTypeId(int stackLevel = -1) = 0; + //! \brief Returns a pointer to the object, if a class method is being executed. + //! \param[in] stackLevel The index on the call stack. + //! \return Returns a pointer to the object if it is a class method. + virtual void *GetThisPointer(int stackLevel = -1) = 0; + //! \} + + // User data + //! \name User data + //! \{ + + //! \brief Register the memory address of some user data. + //! \param[in] data A pointer to the user data. + //! \return The previous pointer stored in the context. + //! + //! This method allows the application to associate a value, e.g. a pointer, with the context instance. + virtual void *SetUserData(void *data) = 0; + //! \brief Returns the address of the previously registered user data. + //! \return The pointer to the user data. + virtual void *GetUserData() = 0; + //! \} + +protected: + virtual ~asIScriptContext() {} +}; + +//! \brief The interface for the generic calling convention +class asIScriptGeneric +{ +public: + // Miscellaneous + //! \name Miscellaneous + //! \{ + + //! \brief Returns a pointer to the script engine. + //! \return A pointer to the engine. + virtual asIScriptEngine *GetEngine() = 0; + //! \brief Returns the function id of the called function. + //! \return The function id of the function being called. + virtual int GetFunctionId() = 0; + //! \} + + // Object + //! \name Object + //! \{ + + //! \brief Returns the object pointer if this is a class method, or null if it not. + //! \return A pointer to the object, if this is a method. + virtual void *GetObject() = 0; + //! \brief Returns the type id of the object if this is a class method. + //! \return The type id of the object if this is a method. + virtual int GetObjectTypeId() = 0; + //! \} + + // Arguments + //! \name Arguments + //! \{ + + //! \brief Returns the number of arguments. + //! \return The number of arguments to the function. + virtual int GetArgCount() = 0; + //! \brief Returns the type id of the argument. + //! \param[in] arg The argument index. + //! \return The type id of the argument. + virtual int GetArgTypeId(asUINT arg) = 0; + //! \brief Returns the value of an 8-bit argument. + //! \param[in] arg The argument index. + //! \return The 1 byte argument value. + virtual asBYTE GetArgByte(asUINT arg) = 0; + //! \brief Returns the value of a 16-bit argument. + //! \param[in] arg The argument index. + //! \return The 2 byte argument value. + virtual asWORD GetArgWord(asUINT arg) = 0; + //! \brief Returns the value of a 32-bit integer argument. + //! \param[in] arg The argument index. + //! \return The 4 byte argument value. + virtual asDWORD GetArgDWord(asUINT arg) = 0; + //! \brief Returns the value of a 64-bit integer argument. + //! \param[in] arg The argument index. + //! \return The 8 byte argument value. + virtual asQWORD GetArgQWord(asUINT arg) = 0; + //! \brief Returns the value of a float argument. + //! \param[in] arg The argument index. + //! \return The float argument value. + virtual float GetArgFloat(asUINT arg) = 0; + //! \brief Returns the value of a double argument. + //! \param[in] arg The argument index. + //! \return The double argument value. + virtual double GetArgDouble(asUINT arg) = 0; + //! \brief Returns the address held in a reference or handle argument. + //! \param[in] arg The argument index. + //! \return The address argument value, which can be a reference or and object handle. + //! + //! Don't release the pointer if this is an object or object handle, the asIScriptGeneric object will + //! do that for you. + virtual void *GetArgAddress(asUINT arg) = 0; + //! \brief Returns a pointer to the object in a object argument. + //! \param[in] arg The argument index. + //! \return A pointer to the object argument, which can be an object value or object handle. + //! + //! Don't release the pointer if this is an object handle, the asIScriptGeneric object will + //! do that for you. + virtual void *GetArgObject(asUINT arg) = 0; + //! \brief Returns a pointer to the argument value. + //! \param[in] arg The argument index. + //! \return A pointer to the argument value. + virtual void *GetAddressOfArg(asUINT arg) = 0; + //! \} + + // Return value + //! \name Return value + //! \{ + + //! \brief Gets the type id of the return value. + //! \return The type id of the return value. + virtual int GetReturnTypeId() = 0; + //! \brief Sets the 8-bit return value. + //! \param[in] val The return value. + //! \return A negative value on error. + //! \retval asINVALID_TYPE The return type is not an 8-bit value. + //! Sets the 1 byte return value. + virtual int SetReturnByte(asBYTE val) = 0; + //! \brief Sets the 16-bit return value. + //! \param[in] val The return value. + //! \return A negative value on error. + //! \retval asINVALID_TYPE The return type is not a 16-bit value. + //! Sets the 2 byte return value. + virtual int SetReturnWord(asWORD val) = 0; + //! \brief Sets the 32-bit integer return value. + //! \param[in] val The return value. + //! \return A negative value on error. + //! \retval asINVALID_TYPE The return type is not a 32-bit value. + //! Sets the 4 byte return value. + virtual int SetReturnDWord(asDWORD val) = 0; + //! \brief Sets the 64-bit integer return value. + //! \param[in] val The return value. + //! \return A negative value on error. + //! \retval asINVALID_TYPE The return type is not a 64-bit value. + //! Sets the 8 byte return value. + virtual int SetReturnQWord(asQWORD val) = 0; + //! \brief Sets the float return value. + //! \param[in] val The return value. + //! \return A negative value on error. + //! \retval asINVALID_TYPE The return type is not a 32-bit value. + //! Sets the float return value. + virtual int SetReturnFloat(float val) = 0; + //! \brief Sets the double return value. + //! \param[in] val The return value. + //! \return A negative value on error. + //! \retval asINVALID_TYPE The return type is not a 64-bit value. + //! Sets the double return value. + virtual int SetReturnDouble(double val) = 0; + //! \brief Sets the address return value when the return is a reference or handle. + //! \param[in] addr The return value, which is an address. + //! \return A negative value on error. + //! \retval asINVALID_TYPE The return type is not a reference or handle. + //! + //! Sets the address return value. If an object handle the application must first + //! increment the reference counter, unless it won't keep a reference itself. + virtual int SetReturnAddress(void *addr) = 0; + //! \brief Sets the object return value. + //! \param[in] obj A pointer to the object return value. + //! \return A negative value on error. + //! \retval asINVALID_TYPE The return type is not an object value or handle. + //! + //! If the function returns an object, the library will automatically do what is + //! necessary based on how the object was declared, i.e. if the function was + //! registered to return a handle then the library will call the addref behaviour. + //! If it was registered to return an object by value, then the library will make + //! a copy of the object. + virtual int SetReturnObject(void *obj) = 0; + //! \brief Gets the address to the memory where the return value should be placed. + //! \return A pointer to the memory where the return values is to be placed. + //! + //! The memory is not initialized, so if you're going to return a complex type by value, + //! you shouldn't use the assignment operator to initialize it. Instead use the placement new + //! operator to call the type's copy constructor to perform the initialization. + //! + //! \code + //! new(gen->GetAddressOfReturnLocation()) std::string(myRetValue); + //! \endcode + //! + //! The placement new operator works for primitive types too, so this method is ideal + //! for writing automatically generated functions that works the same way for all types. + virtual void *GetAddressOfReturnLocation() = 0; + //! \} + +protected: + virtual ~asIScriptGeneric() {} +}; + +//! \brief The interface for an instance of a script object +class asIScriptObject +{ +public: + // Memory management + //! \name Memory management + //! \{ + + //! \brief Increase reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when storing an additional reference to the object. + virtual int AddRef() = 0; + //! \brief Decrease reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when you will no longer use the references that you own. + virtual int Release() = 0; + //! \} + + // Type info + //! \name Type info + //! \{ + + //! \brief Returns the type id of the object. + //! \return The type id of the script object. + virtual int GetTypeId() const = 0; + //! \brief Returns the object type interface for the object. + //! \return The object type interface of the script object. + virtual asIObjectType *GetObjectType() const = 0; + //! \} + + // Class properties + //! \name Properties + //! \{ + + //! \brief Returns the number of properties that the object contains. + //! \return The number of member properties of the script object. + virtual int GetPropertyCount() const = 0; + //! \brief Returns the type id of the property referenced by prop. + //! \param[in] prop The property index. + //! \return The type id of the member property, or a negative value on error. + //! \retval asINVALID_ARG \a prop is too large + virtual int GetPropertyTypeId(asUINT prop) const = 0; + //! \brief Returns the name of the property referenced by prop. + //! \param[in] prop The property index. + //! \return A null terminated string with the property name. + virtual const char *GetPropertyName(asUINT prop) const = 0; + //! \brief Returns a pointer to the property referenced by prop. + //! \param[in] prop The property index. + //! \return A pointer to the property value. + //! + //! The method returns a pointer to the memory location for the property. Use the type + //! id for the property to determine the content of the pointer, and how to handle it. + virtual void *GetAddressOfProperty(asUINT prop) = 0; + //! \} + + //! \name Miscellaneous + //! \{ + + //! \brief Return the script engine. + //! \return The script engine. + virtual asIScriptEngine *GetEngine() const = 0; + //! \brief Copies the content from another object of the same type. + //! \param[in] other A pointer to the source object. + //! \return A negative value on error. + //! \retval asINVALID_ARG The argument is null. + //! \retval asINVALID_TYPE The other object is of different type. + //! + //! This method copies the contents of the other object to this one. + virtual int CopyFrom(asIScriptObject *other) = 0; + //! \} + +protected: + virtual ~asIScriptObject() {} +}; + + +//! \brief The interface for a script array object +class asIScriptArray +{ +public: + //! \brief Return the script engine. + //! \return The script engine. + virtual asIScriptEngine *GetEngine() const = 0; + + // Memory management + //! \brief Increase reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when storing an additional reference to the object. + virtual int AddRef() = 0; + //! \brief Decrease reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when you will no longer use the references that you own. + virtual int Release() = 0; + + // Array type + //! \brief Returns the type id of the array object. + //! \return The type id of the array object. + virtual int GetArrayTypeId() = 0; + + // Elements + //! \brief Returns the type id of the contained elements. + //! \return The type id of the array elements. + virtual int GetElementTypeId() = 0; + + //! \brief Returns the size of the array. + //! \return The number of elements in the array. + virtual asUINT GetElementCount() = 0; + + //! \brief Returns a pointer to the element referenced by index. + //! \param[in] index The element index. + //! \return A pointer to the element value. + //! + //! The method returns a pointer to the memory location for the element. Use the + //! type id for the element to determine the content of the pointer, and how to handle it. + virtual void * GetElementPointer(asUINT index) = 0; + + //! \brief Resizes the array. + //! \param[in] size The new size of the array. + //! + //! This method allows the application to resize the array. + virtual void Resize(asUINT size) = 0; + + //! \brief Copies the elements from another array, overwriting the current content. + //! \param[in] other A pointer to the source array. + //! \return A negative value on error. + //! \retval asINVALID_ARG The argument is null. + //! \retval asINVALID_TYPE The other array is of different type. + //! + //! This method copies the contents of the other object to this one. + virtual int CopyFrom(asIScriptArray *other) = 0; + +protected: + virtual ~asIScriptArray() {} +}; + +//! \brief The interface for an object type +class asIObjectType +{ +public: + //! \name Miscellaneous + //! \{ + + //! \brief Returns a pointer to the script engine. + //! \return A pointer to the engine. + virtual asIScriptEngine *GetEngine() const = 0; + //! \brief Returns the config group in which the type was registered. + //! \return The name of the config group, or null if not set. + virtual const char *GetConfigGroup() const = 0; + //! \} + + // Memory management + //! \name Memory management + //! \{ + + //! \brief Increases the reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when storing an additional reference to the object. + virtual int AddRef() = 0; + //! \brief Decrease reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when you will no longer use the references that you own. + virtual int Release() = 0; + //! \} + + // Type info + //! \name Type info + //! \{ + + //! \brief Returns a temporary pointer to the name of the datatype. + //! \return A null terminated string with the name of the object type. + virtual const char *GetName() const = 0; + //! \brief Returns the object type that this type derives from. + //! \return A pointer to the object type that this type derives from. + //! + //! This method will only return a pointer in case of script classes that derives from another script class. + virtual asIObjectType *GetBaseType() const = 0; + //! \brief Returns the object type flags. + //! \return A bit mask with the flags from \ref asEObjTypeFlags. + //! + //! Script classes are identified by having the asOBJ_SCRIPT_OBJECT flag set. + //! Interfaces are identified as a script class with a size of zero. + //! + //! \see GetSize + virtual asDWORD GetFlags() const = 0; + //! \brief Returns the size of the object type. + //! \return The number of bytes necessary to store instances of this type. + //! + //! Application registered reference types doesn't store this information, + //! as the script engine doesn't allocate memory for these itself. + virtual asUINT GetSize() const = 0; + //! \brief Returns the type id for the object type. + //! \return The type id for the object type. + virtual int GetTypeId() const = 0; + //! \brief Returns the type id of the template sub type. + //! \return The type id of the template sub type, or a negative value on error. + //! \retval asERROR The type is not a template type. + virtual int GetSubTypeId() const = 0; + //! \} + + // Interfaces + //! \name Interfaces + //! \{ + + //! \brief Returns the number of interfaces implemented. + //! \return The number of interfaces implemented by this type. + virtual int GetInterfaceCount() const = 0; + //! \brief Returns a temporary pointer to the specified interface or null if none are found. + //! \param[in] index The interface index. + //! \return A pointer to the interface type. + virtual asIObjectType *GetInterface(asUINT index) const = 0; + //! \} + + // Factories + //! \name Factories + //! \{ + + //! \brief Returns the number of factory functions for the object type. + //! \return A negative value on error, or the number of factory functions for this object. + virtual int GetFactoryCount() const = 0; + //! \brief Returns the factory id by index. + //! \param[in] index The index of the factory function. + //! \return A negative value on error, or the factory id. + //! \retval asINVALID_ARG \a index is out of bounds. + virtual int GetFactoryIdByIndex(int index) const = 0; + //! \brief Returns the factory id by declaration. + //! \param[in] decl The factory signature. + //! \return A negative value on error, or the factory id. + //! \retval asNO_FUNCTION Didn't find any matching functions. + //! \retval asINVALID_DECLARATION \a decl is not a valid declaration. + //! \retval asERROR The module for the type was not built successfully. + //! + //! The factory function is named after the object type and + //! returns a handle to the object. Example: + //! + //! \code + //! id = type->GetFactoryIdByDecl("object@ object(int arg1, int arg2)"); + //! \endcode + virtual int GetFactoryIdByDecl(const char *decl) const = 0; + //! \} + + // Methods + //! \name Methods + //! \{ + + //! \brief Returns the number of methods for the object type. + //! \return A negative value on error, or the number of methods for this object. + virtual int GetMethodCount() const = 0; + //! \brief Returns the method id by index. + //! \param[in] index The index of the method. + //! \return A negative value on error, or the method id. + //! \retval asINVALID_ARG \a index is out of bounds. + //! + //! This method should be used to retrieve the ID of the script method for the object + //! that you wish to execute. The ID is then sent to the context's \ref asIScriptContext::Prepare "Prepare" method. + virtual int GetMethodIdByIndex(int index) const = 0; + //! \brief Returns the method id by name. + //! \param[in] name The name of the method. + //! \return A negative value on error, or the method id. + //! \retval asMULTIPLE_FUNCTIONS Found multiple matching methods. + //! \retval asNO_FUNCTION Didn't find any matching method. + //! + //! This method should be used to retrieve the ID of the script method for the object + //! that you wish to execute. The ID is then sent to the context's \ref asIScriptContext::Prepare "Prepare" method. + virtual int GetMethodIdByName(const char *name) const = 0; + //! \brief Returns the method id by declaration. + //! \param[in] decl The method signature. + //! \return A negative value on error, or the method id. + //! \retval asMULTIPLE_FUNCTIONS Found multiple matching methods. + //! \retval asNO_FUNCTION Didn't find any matching method. + //! \retval asINVALID_DECLARATION \a decl is not a valid declaration. + //! \retval asERROR The module for the type was not built successfully. + //! + //! This method should be used to retrieve the ID of the script method for the object + //! that you wish to execute. The ID is then sent to the context's \ref asIScriptContext::Prepare "Prepare" method. + //! + //! The method will find the script method with the exact same declaration. + virtual int GetMethodIdByDecl(const char *decl) const = 0; + //! \brief Returns the function descriptor for the script method + //! \param[in] index The index of the method. + //! \return A pointer to the method description interface, or null if not found. + virtual asIScriptFunction *GetMethodDescriptorByIndex(int index) const = 0; + //! \} + + // Properties + //! \name Properties + //! \{ + + //! \brief Returns the number of properties that the object contains. + //! \return The number of member properties of the script object. + virtual int GetPropertyCount() const = 0; + //! \brief Returns the type id of the property referenced by \a prop. + //! \param[in] prop The property index. + //! \return The type id of the member property, or a negative value on error. + //! \retval asINVALID_ARG \a prop is too large + virtual int GetPropertyTypeId(asUINT prop) const = 0; + //! \brief Returns the name of the property referenced by \a prop. + //! \param[in] prop The property index. + //! \return A null terminated string with the property name. + virtual const char *GetPropertyName(asUINT prop) const = 0; + //! \brief Returns the offset of the property in the memory layout. + //! \param[in] prop The property index. + //! \return The offset of the property in the memory layout. + virtual int GetPropertyOffset(asUINT prop) const = 0; + //! \} + + // Behaviours + //! \name Behaviours + //! \{ + + //! \brief Returns the number of behaviours. + //! \return The number of behaviours for this type. + virtual int GetBehaviourCount() const = 0; + //! \brief Returns the function id and type of the behaviour. + //! \param[in] index The index of the behaviour. + //! \param[out] outBehaviour Receives the type of the behaviour. + //! \return The function id of the behaviour. + //! \retval asINVALID_ARG The \a index is too large. + virtual int GetBehaviourByIndex(asUINT index, asEBehaviours *outBehaviour) const = 0; + //! \} + +protected: + virtual ~asIObjectType() {} +}; + +//! \brief The interface for a script function description +class asIScriptFunction +{ +public: + //! \name Miscellaneous + //! \{ + + //! \brief Returns a pointer to the script engine. + //! \return A pointer to the engine. + virtual asIScriptEngine *GetEngine() const = 0; + + // Memory management + //! \brief Increases the reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when storing an additional reference to the object. + virtual int AddRef() = 0; + //! \brief Decrease reference counter. + //! + //! \return The number of references to this object. + //! + //! Call this method when you will no longer use the references that you own. + virtual int Release() = 0; + + //! \brief Returns the id of the function + //! \return The id of the function + virtual int GetId() const = 0; + //! \brief Returns the name of the module where the function was implemented + //! \return A null terminated string with the module name. + virtual const char *GetModuleName() const = 0; + //! \brief Returns the name of the script section where the function was implemented. + //! \return A null terminated string with the script section name where the function was implemented. + virtual const char *GetScriptSectionName() const = 0; + //! \brief Returns the name of the config group in which the function was registered. + //! \return The name of the config group, or null if not in any group. + virtual const char *GetConfigGroup() const = 0; + //! \} + + //! \name Function info + //! \{ + + //! \brief Returns the object type for class or interface method + //! \return A pointer to the object type interface if this is a method. + virtual asIObjectType *GetObjectType() const = 0; + //! \brief Returns the name of the object for class or interface methods + //! \return A null terminated string with the name of the object type if this a method. + virtual const char *GetObjectName() const = 0; + //! \brief Returns the name of the function or method + //! \return A null terminated string with the name of the function. + virtual const char *GetName() const = 0; + //! \brief Returns the function declaration + //! \param[in] includeObjectName Indicate whether the object name should be prepended to the function name + //! \return A null terminated string with the function declaration. + virtual const char *GetDeclaration(bool includeObjectName = true) const = 0; + //! \brief Returns true if it is a class method + //! \return True if this a class method. + virtual bool IsClassMethod() const = 0; + //! \brief Returns true if it is an interface method + //! \return True if this is an interface method. + virtual bool IsInterfaceMethod() const = 0; + //! \brief Returns true if the class method is read-only + //! \return True if the class method is read-only + virtual bool IsReadOnly() const = 0; + //! \} + + //! \name Parameter and return types + //! \{ + + //! \brief Returns the number of parameters for this function. + //! \return The number of parameters. + virtual int GetParamCount() const = 0; + //! \brief Returns the type id of the specified parameter. + //! \param[in] index The zero based parameter index. + //! \param[out] flags A combination of \ref asETypeModifiers. + //! \return A negative value on error, or the type id of the specified parameter. + //! \retval asINVALID_ARG The index is out of bounds. + virtual int GetParamTypeId(int index, asDWORD *flags = 0) const = 0; + //! \brief Returns the type id of the return type. + //! \return The type id of the return type. + virtual int GetReturnTypeId() const = 0; + //! \} + + //! \name JIT compilation + //! \{ + + // For JIT compilation + //! \brief Returns the byte code buffer and length. + //! \param[out] length The length of the byte code buffer in DWORDs + //! \return A pointer to the byte code buffer, or 0 if this is not a script function. + //! + //! This function is used by the \ref asIJITCompiler to obtain the byte + //! code buffer for building the native machine code representation. + virtual asDWORD *GetByteCode(asUINT *length = 0) = 0; + //! \} + +protected: + virtual ~asIScriptFunction() {}; +}; + +//! \brief A binary stream interface. +//! +//! This interface is used when storing compiled bytecode to disk or memory, and then loading it into the engine again. +//! +//! \see \ref asIScriptModule::SaveByteCode, \ref asIScriptModule::LoadByteCode +class asIBinaryStream +{ +public: + //! \brief Read size bytes from the stream into the memory pointed to by ptr. + //! + //! \param[out] ptr A pointer to the buffer that will receive the data. + //! \param[in] size The number of bytes to read. + //! + //! Read \a size bytes from the data stream into the memory pointed to by \a ptr. + virtual void Read(void *ptr, asUINT size) = 0; + //! \brief Write size bytes to the stream from the memory pointed to by ptr. + //! + //! \param[in] ptr A pointer to the buffer that the data should written from. + //! \param[in] size The number of bytes to write. + //! + //! Write \a size bytes to the data stream from the memory pointed to by \a ptr. + virtual void Write(const void *ptr, asUINT size) = 0; + +public: + virtual ~asIBinaryStream() {} +}; + +//----------------------------------------------------------------- +// Function pointers + +// Use our own memset() and memcpy() implementations for better portability +inline void asMemClear(void *_p, int size) +{ + char *p = (char *)_p; + const char *e = p + size; + for( ; p < e; p++ ) + *p = 0; +} + +inline void asMemCopy(void *_d, const void *_s, int size) +{ + char *d = (char *)_d; + const char *s = (const char *)_s; + const char *e = s + size; + for( ; s < e; d++, s++ ) + *d = *s; +} + +// Template function to capture all global functions, +// except the ones using the generic calling convention +template +inline asSFuncPtr asFunctionPtr(T func) +{ + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + p.ptr.f.func = (asFUNCTION_t)(size_t)func; + + // Mark this as a global function + p.flag = 2; + + return p; +} + +// Specialization for functions using the generic calling convention +template<> +inline asSFuncPtr asFunctionPtr(asGENFUNC_t func) +{ + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + p.ptr.f.func = (asFUNCTION_t)func; + + // Mark this as a generic function + p.flag = 1; + + return p; +} + +#ifndef AS_NO_CLASS_METHODS + +// Method pointers + +// Declare a dummy class so that we can determine the size of a simple method pointer +class asCSimpleDummy {}; +typedef void (asCSimpleDummy::*asSIMPLEMETHOD_t)(); +const int SINGLE_PTR_SIZE = sizeof(asSIMPLEMETHOD_t); + +// Define template +template +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + // This version of the function should never be executed, nor compiled, + // as it would mean that the size of the method pointer cannot be determined. + + int ERROR_UnsupportedMethodPtr[N-100]; + return 0; + } +}; + +// Template specialization +template <> +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + + asMemCopy(&p, &Mthd, SINGLE_PTR_SIZE); + + // Mark this as a class method + p.flag = 3; + + return p; + } +}; + +#if defined(_MSC_VER) && !defined(__MWERKS__) + +// MSVC and Intel uses different sizes for different class method pointers +template <> +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + + asMemCopy(&p, &Mthd, SINGLE_PTR_SIZE+sizeof(int)); + + // Mark this as a class method + p.flag = 3; + + return p; + } +}; + +template <> +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + // This is where a class with virtual inheritance falls, or + // on 64bit platforms with 8byte data alignments. + + // Method pointers for virtual inheritance is not supported, + // as it requires the location of the vbase table, which is + // only available to the C++ compiler, but not in the method + // pointer. + + // You can get around this by forward declaring the class and + // storing the sizeof its method pointer in a constant. Example: + + // class ClassWithVirtualInheritance; + // const int ClassWithVirtualInheritance_workaround = sizeof(void ClassWithVirtualInheritance::*()); + + // This will force the compiler to use the unknown type + // for the class, which falls under the next case + + // TODO: We need to try to identify if this is really a method pointer + // with virtual inheritance, or just a method pointer for multiple + // inheritance with pad bytes to produce a 16byte structure. + + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + + asMemCopy(&p, &Mthd, SINGLE_PTR_SIZE+2*sizeof(int)); + + // Mark this as a class method + p.flag = 3; + + return p; + } +}; + +template <> +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + + asMemCopy(&p, &Mthd, SINGLE_PTR_SIZE+3*sizeof(int)); + + // Mark this as a class method + p.flag = 3; + + return p; + } +}; + +template <> +struct asSMethodPtr +{ + template + static asSFuncPtr Convert(M Mthd) + { + // On 64bit platforms with 8byte data alignment + // the unknown class method pointers will come here. + + asSFuncPtr p; + asMemClear(&p, sizeof(p)); + + asMemCopy(&p, &Mthd, SINGLE_PTR_SIZE+4*sizeof(int)); + + // Mark this as a class method + p.flag = 3; + + return p; + } +}; + +#endif + +#endif // AS_NO_CLASS_METHODS + +//---------------------------------------------------------------- +// JIT compiler + +//! \brief A struct with registers from the VM sent to a JIT compiled function +//! +//! The JIT compiled function will receive a pointer to this structure when called. +//! It is the responsibility of the JIT compiled function to make sure these +//! values are updated correctly before control is returned to the VM. +//! +//! \see \ref doc_adv_jit +struct asSVMRegisters +{ + //! \brief Points to the current bytecode instruction + asDWORD *programPointer; // points to current bytecode instruction + //! \brief Function stack frame. This doesn't change during the function execution. + asDWORD *stackFramePointer; // function stack frame + //! \brief Top of the stack (grows downward) + asDWORD *stackPointer; // top of stack (grows downward) + //! \brief Array of global variable pointers. This doesn't change during the function execution. + void **globalVarPointers; // global variable pointers + //! \brief Temporary register for primitives and unmanaged references + asQWORD valueRegister; // temp register for primitives + //! \brief Temporary register for managed object references/handles + void *objectRegister; // temp register for objects and handles + //! \brief Type of the object held in the object register + asIObjectType *objectType; // type of object held in object register + //! \brief Set to true if the SUSPEND instruction should be processed. Do not update this value. + bool doProcessSuspend; // whether or not the JIT should break out when it encounters a suspend instruction +}; + +//! \brief The function signature of a JIT compiled function +//! \param [in] registers A pointer to the virtual machine's registers. +//! \param [in] entryId The value defined by the JIT compiler for the current entry point in the JIT function. +//! +//! A JIT function receives a pointer to the virtual machine's registers when called and +//! an argument telling it where in the script function to continue the execution. The JIT +//! function must make sure to update the VM's registers according to the actions performed +//! before returning control to the VM. +//! +//! \see \ref doc_adv_jit +typedef void (*asJITFunction)(asSVMRegisters *registers, asDWORD entryId); + +//! \brief The interface that AS use to interact with the JIT compiler +//! +//! This is the minimal interface that the JIT compiler must implement +//! so that AngelScript can request the compilation of the script functions. +//! +//! \see \ref doc_adv_jit +class asIJITCompiler +{ +public: + //! \brief Called by AngelScript to begin the compilation + //! + //! \param [in] function A pointer to the script function + //! \param [out] output The JIT compiled function + //! \return A negative value on error. + //! + //! AngelScript will call this function to request the compilation of + //! a script function. The JIT compiler should produce the native machine + //! code representation of the function and update the JitEntry instructions + //! in the byte code to allow the VM to transfer the control to the JIT compiled + //! function. + virtual int CompileFunction(asIScriptFunction *function, asJITFunction *output) = 0; + //! \brief Called by AngelScript when the JIT function is released + //! \param [in] func Pointer to the JIT function + virtual void ReleaseJITFunction(asJITFunction func) = 0; +public: + virtual ~asIJITCompiler() {} +}; + +// Byte code instructions +//! \brief The bytecode instructions used by the VM +//! \see \ref doc_adv_jit_1 +enum asEBCInstr +{ + //! \brief Decrease the stack with the amount in the argument + asBC_POP = 0, + //! \brief Increase the stack with the amount in the argument + asBC_PUSH = 1, + //! \brief Push the 32bit value in the argument onto the stack + asBC_PshC4 = 2, + //! \brief Push the 32bit value from a variable onto the stack + asBC_PshV4 = 3, + //! \brief Push the address of the stack frame onto the stack + asBC_PSF = 4, + //! \brief Swap the top two DWORDs on the stack + asBC_SWAP4 = 5, + //! \brief Perform a boolean not on the value in a variable + asBC_NOT = 6, + //! \brief Push the 32bit value from a global variable onto the stack + asBC_PshG4 = 7, + //! \brief Perform the actions of \ref asBC_LDG followed by \ref asBC_RDR4 + asBC_LdGRdR4 = 8, + //! \brief Jump to a script function, indexed by the argument + asBC_CALL = 9, + //! \brief Return to the instruction after the last executed call + asBC_RET = 10, + //! \brief Unconditional jump to a relative position in this function + asBC_JMP = 11, + //! \brief If the value register is 0 jump to a relative position in this function + asBC_JZ = 12, + //! \brief If the value register is not 0 jump to a relative position in this function + asBC_JNZ = 13, + //! \brief If the value register is less than 0 jump to a relative position in this function + asBC_JS = 14, + //! \brief If the value register is greater than or equal to 0 jump to a relative position in this function + asBC_JNS = 15, + //! \brief If the value register is greater than 0 jump to a relative position in this function + asBC_JP = 16, + //! \brief If the value register is less than or equal to 0 jump to a relative position in this function + asBC_JNP = 17, + //! \brief If the value register is 0 set it to 1 + asBC_TZ = 18, + //! \brief If the value register is not 0 set it to 1 + asBC_TNZ = 19, + //! \brief If the value register is less than 0 set it to 1 + asBC_TS = 20, + //! \brief If the value register is greater than or equal to 0 set it to 1 + asBC_TNS = 21, + //! \brief If the value register is greater than 0 set it to 1 + asBC_TP = 22, + //! \brief If the value register is less than or equal to 0 set it to 1 + asBC_TNP = 23, + //! \brief Negate the 32bit integer value in the variable + asBC_NEGi = 24, + //! \brief Negate the float value in the variable + asBC_NEGf = 25, + //! \brief Negate the double value in the variable + asBC_NEGd = 26, + //! \brief Increment the 16bit integer value that is stored at the address pointed to by the reference in the value register + asBC_INCi16 = 27, + //! \brief Increment the 8bit integer value that is stored at the address pointed to by the reference in the value register + asBC_INCi8 = 28, + //! \brief Decrement the 16bit integer value that is stored at the address pointed to by the reference in the value register + asBC_DECi16 = 29, + //! \brief Increment the 8bit integer value that is stored at the address pointed to by the reference in the value register + asBC_DECi8 = 30, + //! \brief Increment the 32bit integer value that is stored at the address pointed to by the reference in the value register + asBC_INCi = 31, + //! \brief Decrement the 32bit integer value that is stored at the address pointed to by the reference in the value register + asBC_DECi = 32, + //! \brief Increment the float value that is stored at the address pointed to by the reference in the value register + asBC_INCf = 33, + //! \brief Decrement the float value that is stored at the address pointed to by the reference in the value register + asBC_DECf = 34, + //! \brief Increment the double value that is stored at the address pointed to by the reference in the value register + asBC_INCd = 35, + //! \brief Decrement the double value that is stored at the address pointed to by the reference in the value register + asBC_DECd = 36, + //! \brief Increment the 32bit integer value in the variable + asBC_IncVi = 37, + //! \brief Decrement the 32bit integer value in the variable + asBC_DecVi = 38, + //! \brief Perform a bitwise complement on the 32bit value in the variable + asBC_BNOT = 39, + //! \brief Perform a bitwise and of two 32bit values and store the result in a third variable + asBC_BAND = 40, + //! \brief Perform a bitwise or of two 32bit values and store the result in a third variable + asBC_BOR = 41, + //! \brief Perform a bitwise exclusive or of two 32bit values and store the result in a third variable + asBC_BXOR = 42, + //! \brief Perform a logical left shift of a 32bit value and store the result in a third variable + asBC_BSLL = 43, + //! \brief Perform a logical right shift of a 32bit value and store the result in a third variable + asBC_BSRL = 44, + //! \brief Perform a arithmetical right shift of a 32bit value and store the result in a third variable + asBC_BSRA = 45, + //! \brief Pop the destination and source addresses from the stack. Perform a bitwise copy of the referred object. Push the destination address on the stack. + asBC_COPY = 46, + //! \brief Push a 64bit value on the stack + asBC_PshC8 = 47, + //! \brief Pop an address from the stack, then read a 64bit value from that address and push it on the stack + asBC_RDS8 = 48, + //! \brief Swap the top two QWORDs on the stack + asBC_SWAP8 = 49, + //! \brief Compare two double variables and store the result in the value register + asBC_CMPd = 50, + //! \brief Compare two unsigned 32bit integer variables and store the result in the value register + asBC_CMPu = 51, + //! \brief Compare two float variables and store the result in the value register + asBC_CMPf = 52, + //! \brief Compare two 32bit integer variables and store the result in the value register + asBC_CMPi = 53, + //! \brief Compare 32bit integer variable with constant and store the result in value register + asBC_CMPIi = 54, + //! \brief Compare float variable with constant and store the result in value register + asBC_CMPIf = 55, + //! \brief Compare unsigned 32bit integer variable with constant and store the result in value register + asBC_CMPIu = 56, + //! \brief Jump to relative position in the function where the offset is stored in a variable + asBC_JMPP = 57, + //! \brief Pop a pointer from the stack and store it in the value register + asBC_PopRPtr = 58, + //! \brief Push a pointer from the value register onto the stack + asBC_PshRPtr = 59, + //! \brief Push string address and length on the stack + asBC_STR = 60, + //! \brief Call registered function. Suspend further execution if requested. + asBC_CALLSYS = 61, + //! \brief Jump to an imported script function, indexed by the argument + asBC_CALLBND = 62, + //! \brief Call line callback function if set. Suspend execution if requested. + asBC_SUSPEND = 63, + //! \brief Allocate the memory for the object. If the type is a script object then jump to the constructor, else call the registered constructor behaviour. Suspend further execution if requested. + asBC_ALLOC = 64, + //! \brief Pop the address of the object variable from the stack. If ref type, call the release method, else call the destructor then free the memory. Clear the pointer in the variable. + asBC_FREE = 65, + //! \brief Copy the object pointer from a variable to the object register. Clear the variable. + asBC_LOADOBJ = 66, + //! \brief Copy the object pointer from the object register to the variable. Clear the object register. + asBC_STOREOBJ = 67, + //! \brief Move object pointer from variable onto stack location. + asBC_GETOBJ = 68, + //! \brief Pop destination handle reference. Perform a handle assignment, while updating the reference count for both previous and new objects. + asBC_REFCPY = 69, + //! \brief Throw an exception if the pointer on the top of the stack is null. + asBC_CHKREF = 70, + //! \brief Replace a variable index on the stack with the object handle stored in that variable. + asBC_GETOBJREF = 71, + //! \brief Replace a variable index on the stack with the address of the variable. + asBC_GETREF = 72, + //! \brief Swap the top DWORD with the QWORD below it + asBC_SWAP48 = 73, + //! \brief Swap the top QWORD with the DWORD below it + asBC_SWAP84 = 74, + //! \brief Push the pointer argument onto the stack. The pointer is a pointer to an object type structure + asBC_OBJTYPE = 75, + //! \brief Push the type id onto the stack. Equivalent to \ref asBC_PshC4 "PshC4". + asBC_TYPEID = 76, + //! \brief Initialize the variable with a DWORD. + asBC_SetV4 = 77, + //! \brief Initialize the variable with a QWORD. + asBC_SetV8 = 78, + //! \brief Add a value to the top pointer on the stack, thus updating the address itself. + asBC_ADDSi = 79, + //! \brief Copy a DWORD from one variable to another + asBC_CpyVtoV4 = 80, + //! \brief Copy a QWORD from one variable to another + asBC_CpyVtoV8 = 81, + //! \brief Copy a DWORD from a variable into the value register + asBC_CpyVtoR4 = 82, + //! \brief Copy a QWORD from a variable into the value register + asBC_CpyVtoR8 = 83, + //! \brief Copy a DWORD from a local variable to a global variable + asBC_CpyVtoG4 = 84, + //! \brief Copy a DWORD from the value register into a variable + asBC_CpyRtoV4 = 85, + //! \brief Copy a QWORD from the value register into a variable + asBC_CpyRtoV8 = 86, + //! \brief Copy a DWORD from a global variable to a local variable + asBC_CpyGtoV4 = 87, + //! \brief Copy a BYTE from a variable to the address held in the value register + asBC_WRTV1 = 88, + //! \brief Copy a WORD from a variable to the address held in the value register + asBC_WRTV2 = 89, + //! \brief Copy a DWORD from a variable to the address held in the value register + asBC_WRTV4 = 90, + //! \brief Copy a QWORD from a variable to the address held in the value register + asBC_WRTV8 = 91, + //! \brief Copy a BYTE from address held in the value register to a variable. Clear the top bytes in the variable + asBC_RDR1 = 92, + //! \brief Copy a WORD from address held in the value register to a variable. Clear the top word in the variable + asBC_RDR2 = 93, + //! \brief Copy a DWORD from address held in the value register to a variable. + asBC_RDR4 = 94, + //! \brief Copy a QWORD from address held in the value register to a variable. + asBC_RDR8 = 95, + //! \brief Load the address of a global variable into the value register + asBC_LDG = 96, + //! \brief Load the address of a local variable into the value register + asBC_LDV = 97, + //! \brief Push the address of a global variable on the stack + asBC_PGA = 98, + //! \brief Pop an address from the stack. Read a DWORD from the address, and push it on the stack. + asBC_RDS4 = 99, + //! \brief Push the index of the variable on the stack, with the size of a pointer. + asBC_VAR = 100, + //! \brief Convert the 32bit integer value to a float in the variable + asBC_iTOf = 101, + //! \brief Convert the float value to a 32bit integer in the variable + asBC_fTOi = 102, + //! \brief Convert the unsigned 32bit integer value to a float in the variable + asBC_uTOf = 103, + //! \brief Convert the float value to an unsigned 32bit integer in the variable + asBC_fTOu = 104, + //! \brief Expand the low byte as a signed value to a full 32bit integer in the variable + asBC_sbTOi = 105, + //! \brief Expand the low word as a signed value to a full 32bit integer in the variable + asBC_swTOi = 106, + //! \brief Expand the low byte as an unsigned value to a full 32bit integer in the variable + asBC_ubTOi = 107, + //! \brief Expand the low word as an unsigned value to a full 32bit integer in the variable + asBC_uwTOi = 108, + //! \brief Convert the double value in one variable to a 32bit integer in another variable + asBC_dTOi = 109, + //! \brief Convert the double value in one variable to a 32bit unsigned integer in another variable + asBC_dTOu = 110, + //! \brief Convert the double value in one variable to a float in another variable + asBC_dTOf = 111, + //! \brief Convert the 32bit integer value in one variable to a double in another variable + asBC_iTOd = 112, + //! \brief Convert the 32bit unsigned integer value in one variable to a double in another variable + asBC_uTOd = 113, + //! \brief Convert the float value in one variable to a double in another variable + asBC_fTOd = 114, + //! \brief Add the values of two 32bit integer variables and store in a third variable + asBC_ADDi = 115, + //! \brief Subtract the values of two 32bit integer variables and store in a third variable + asBC_SUBi = 116, + //! \brief Multiply the values of two 32bit integer variables and store in a third variable + asBC_MULi = 117, + //! \brief Divide the values of two 32bit integer variables and store in a third variable + asBC_DIVi = 118, + //! \brief Calculate the modulo of values of two 32bit integer variables and store in a third variable + asBC_MODi = 119, + //! \brief Add the values of two float variables and store in a third variable + asBC_ADDf = 120, + //! \brief Subtract the values of two float variables and store in a third variable + asBC_SUBf = 121, + //! \brief Multiply the values of two float variables and store in a third variable + asBC_MULf = 122, + //! \brief Divide the values of two float variables and store in a third variable + asBC_DIVf = 123, + //! \brief Calculate the modulo of values of two float variables and store in a third variable + asBC_MODf = 124, + //! \brief Add the values of two double variables and store in a third variable + asBC_ADDd = 125, + //! \brief Subtract the values of two double variables and store in a third variable + asBC_SUBd = 126, + //! \brief Multiply the values of two double variables and store in a third variable + asBC_MULd = 127, + //! \brief Divide the values of two double variables and store in a third variable + asBC_DIVd = 128, + //! \brief Calculate the modulo of values of two double variables and store in a third variable + asBC_MODd = 129, + //! \brief Add a 32bit integer variable with a constant value and store the result in another variable + asBC_ADDIi = 130, + //! \brief Subtract a 32bit integer variable with a constant value and store the result in another variable + asBC_SUBIi = 131, + //! \brief Multiply a 32bit integer variable with a constant value and store the result in another variable + asBC_MULIi = 132, + //! \brief Add a float variable with a constant value and store the result in another variable + asBC_ADDIf = 133, + //! \brief Subtract a float variable with a constant value and store the result in another variable + asBC_SUBIf = 134, + //! \brief Multiply a float variable with a constant value and store the result in another variable + asBC_MULIf = 135, + //! \brief Set the value of global variable to a 32bit word + asBC_SetG4 = 136, + //! \brief Throw an exception if the address stored on the stack points to a null pointer + asBC_ChkRefS = 137, + //! \brief Throw an exception if the variable is null + asBC_ChkNullV = 138, + //! \brief Jump to an interface method, indexed by the argument + asBC_CALLINTF = 139, + //! \brief Convert a 32bit integer in a variable to a byte, clearing the top bytes + asBC_iTOb = 140, + //! \brief Convert a 32bit integer in a variable to a word, clearing the top word + asBC_iTOw = 141, + //! \brief Same as \ref asBC_SetV4 "SetV4" + asBC_SetV1 = 142, + //! \brief Same as \ref asBC_SetV4 "SetV4" + asBC_SetV2 = 143, + //! \brief Pop an object handle to a script class from the stack. Perform a dynamic cast on it and store the result in the object register. + asBC_Cast = 144, + //! \brief Convert the 64bit integer value in one variable to a 32bit integer in another variable + asBC_i64TOi = 145, + //! \brief Convert the 32bit unsigned integer value in one variable to a 64bit integer in another variable + asBC_uTOi64 = 146, + //! \brief Convert the 32bit integer value in one variable to a 64bit integer in another variable + asBC_iTOi64 = 147, + //! \brief Convert the float value in one variable to a 64bit integer in another variable + asBC_fTOi64 = 148, + //! \brief Convert the double value in the variable to a 64bit integer + asBC_dTOi64 = 149, + //! \brief Convert the float value in one variable to a 64bit unsigned integer in another variable + asBC_fTOu64 = 150, + //! \brief Convert the double value in the variable to a 64bit unsigned integer + asBC_dTOu64 = 151, + //! \brief Convert the 64bit integer value in one variable to a float in another variable + asBC_i64TOf = 152, + //! \brief Convert the 64bit unsigned integer value in one variable to a float in another variable + asBC_u64TOf = 153, + //! \brief Convert the 32bit integer value in the variable to a double + asBC_i64TOd = 154, + //! \brief Convert the 32bit unsigned integer value in the variable to a double + asBC_u64TOd = 155, + //! \brief Negate the 64bit integer value in the variable + asBC_NEGi64 = 156, + //! \brief Increment the 64bit integer value that is stored at the address pointed to by the reference in the value register + asBC_INCi64 = 157, + //! \brief Decrement the 64bit integer value that is stored at the address pointed to by the reference in the value register + asBC_DECi64 = 158, + //! \brief Perform a bitwise complement on the 64bit value in the variable + asBC_BNOT64 = 159, + //! \brief Perform an addition with two 64bit integer variables and store the result in a third variable + asBC_ADDi64 = 160, + //! \brief Perform a subtraction with two 64bit integer variables and store the result in a third variable + asBC_SUBi64 = 161, + //! \brief Perform a multiplication with two 64bit integer variables and store the result in a third variable + asBC_MULi64 = 162, + //! \brief Perform a division with two 64bit integer variables and store the result in a third variable + asBC_DIVi64 = 163, + //! \brief Perform the modulo operation with two 64bit integer variables and store the result in a third variable + asBC_MODi64 = 164, + //! \brief Perform a bitwise and of two 64bit values and store the result in a third variable + asBC_BAND64 = 165, + //! \brief Perform a bitwise or of two 64bit values and store the result in a third variable + asBC_BOR64 = 166, + //! \brief Perform a bitwise exclusive or of two 64bit values and store the result in a third variable + asBC_BXOR64 = 167, + //! \brief Perform a logical left shift of a 64bit value and store the result in a third variable + asBC_BSLL64 = 168, + //! \brief Perform a logical right shift of a 64bit value and store the result in a third variable + asBC_BSRL64 = 169, + //! \brief Perform a arithmetical right shift of a 64bit value and store the result in a third variable + asBC_BSRA64 = 170, + //! \brief Compare two 64bit integer variables and store the result in the value register + asBC_CMPi64 = 171, + //! \brief Compare two unsigned 64bit integer variables and store the result in the value register + asBC_CMPu64 = 172, + //! \brief Check if a pointer on the stack is null, and if it is throw an exception. The argument is relative to the top of the stack + asBC_ChkNullS = 173, + //! \brief Clear the upper bytes of the value register so that only the value in the lowest byte is kept + asBC_ClrHi = 174, + //! \brief If a JIT function is available and the argument is not 0 then call the JIT function + asBC_JitEntry = 175, + + asBC_MAXBYTECODE = 176, + + // Temporary tokens. Can't be output to the final program + asBC_PSP = 253, + asBC_LINE = 254, + asBC_LABEL = 255 +}; + +// Instruction types +//! \brief Describes the structure of a bytecode instruction +enum asEBCType +{ + asBCTYPE_INFO = 0, + //! \brief Instruction + no args + asBCTYPE_NO_ARG = 1, + //! \brief Instruction + WORD arg + asBCTYPE_W_ARG = 2, + //! \brief Instruction + WORD arg (dest var) + asBCTYPE_wW_ARG = 3, + //! \brief Instruction + DWORD arg + asBCTYPE_DW_ARG = 4, + //! \brief Instruction + WORD arg (source var) + DWORD arg + asBCTYPE_rW_DW_ARG = 5, + //! \brief Instruction + QWORD arg + asBCTYPE_QW_ARG = 6, + //! \brief Instruction + DWORD arg + DWORD arg + asBCTYPE_DW_DW_ARG = 7, + //! \brief Instruction + WORD arg (dest var) + WORD arg (source var) + WORD arg (source var) + asBCTYPE_wW_rW_rW_ARG = 8, + //! \brief Instruction + WORD arg (dest var) + QWORD arg + asBCTYPE_wW_QW_ARG = 9, + //! \brief Instruction + WORD arg (dest var) + WORD arg (source var) + asBCTYPE_wW_rW_ARG = 10, + //! \brief Instruction + WORD arg (source var) + asBCTYPE_rW_ARG = 11, + //! \brief Instruction + WORD arg (dest var) + DWORD arg + asBCTYPE_wW_DW_ARG = 12, + //! \brief Instruction + WORD arg (dest var) + WORD arg (source var) + DWORD arg + asBCTYPE_wW_rW_DW_ARG = 13, + //! \brief Instruction + WORD arg (source var) + WORD arg (source var) + asBCTYPE_rW_rW_ARG = 14, + //! \brief Instruction + WORD arg + WORD arg (source var) + asBCTYPE_W_rW_ARG = 15, + //! \brief Instruction + WORD arg (dest var) + WORD arg + asBCTYPE_wW_W_ARG = 16, + //! \brief Instruction + WORD arg + DWORD arg + asBCTYPE_W_DW_ARG = 17, + //! \brief Instruction + QWORD arg + DWORD arg + asBCTYPE_QW_DW_ARG = 18 +}; + +// Instruction type sizes +//! \brief Lookup table for determining the size of each \ref asEBCType "type" of bytecode instruction. +const int asBCTypeSize[19] = +{ + 0, // asBCTYPE_INFO + 1, // asBCTYPE_NO_ARG + 1, // asBCTYPE_W_ARG + 1, // asBCTYPE_wW_ARG + 2, // asBCTYPE_DW_ARG + 2, // asBCTYPE_rW_DW_ARG + 3, // asBCTYPE_QW_ARG + 3, // asBCTYPE_DW_DW_ARG + 2, // asBCTYPE_wW_rW_rW_ARG + 3, // asBCTYPE_wW_QW_ARG + 2, // asBCTYPE_wW_rW_ARG + 1, // asBCTYPE_rW_ARG + 2, // asBCTYPE_wW_DW_ARG + 3, // asBCTYPE_wW_rW_DW_ARG + 2, // asBCTYPE_rW_rW_ARG + 2, // asBCTYPE_W_rW_ARG + 2, // asBCTYPE_wW_W_ARG + 2, // asBCTYPE_W_DW_ARG + 4 // asBCTYPE_QW_DW_ARG +}; + +// Instruction info +//! \brief Information on a bytecode instruction +//! +//! This structure can be obtained for each bytecode instruction +//! by looking it up in the \ref asBCInfo array. +//! +//! The size of the instruction can be obtained by looking up the +//! type in the \ref asBCTypeSize array. +//! +//! \see \ref doc_adv_jit +struct asSBCInfo +{ + //! \brief Bytecode instruction id + asEBCInstr bc; + //! \brief Instruction argument layout + asEBCType type; + //! \brief How much this argument increments the stack pointer. 0xFFFF if it depends on the arguments. + int stackInc; + //! \brief Name of the instruction for debugging + const char *name; +}; + +#ifndef AS_64BIT_PTR + #define asBCTYPE_PTR_ARG asBCTYPE_DW_ARG + #define asBCTYPE_PTR_DW_ARG asBCTYPE_DW_DW_ARG + #ifndef AS_PTR_SIZE + #define AS_PTR_SIZE 1 + #endif +#else + #define asBCTYPE_PTR_ARG asBCTYPE_QW_ARG + #define asBCTYPE_PTR_DW_ARG asBCTYPE_QW_DW_ARG + #ifndef AS_PTR_SIZE + #define AS_PTR_SIZE 2 + #endif +#endif + +#define asBCINFO(b,t,s) {asBC_##b, asBCTYPE_##t, s, #b} +#define asBCINFO_DUMMY(b) {asEBCInstr(b), asBCTYPE_INFO, 0, "BC_" #b} + +//! \brief Information on each bytecode instruction +const asSBCInfo asBCInfo[256] = +{ + asBCINFO(POP, W_ARG, 0xFFFF), + asBCINFO(PUSH, W_ARG, 0xFFFF), + asBCINFO(PshC4, DW_ARG, 1), + asBCINFO(PshV4, rW_ARG, 1), + asBCINFO(PSF, rW_ARG, AS_PTR_SIZE), + asBCINFO(SWAP4, NO_ARG, 0), + asBCINFO(NOT, rW_ARG, 0), + asBCINFO(PshG4, W_ARG, 1), + asBCINFO(LdGRdR4, wW_W_ARG, 0), + asBCINFO(CALL, DW_ARG, 0xFFFF), + asBCINFO(RET, W_ARG, 0xFFFF), + asBCINFO(JMP, DW_ARG, 0), + asBCINFO(JZ, DW_ARG, 0), + asBCINFO(JNZ, DW_ARG, 0), + asBCINFO(JS, DW_ARG, 0), + asBCINFO(JNS, DW_ARG, 0), + asBCINFO(JP, DW_ARG, 0), + asBCINFO(JNP, DW_ARG, 0), + asBCINFO(TZ, NO_ARG, 0), + asBCINFO(TNZ, NO_ARG, 0), + asBCINFO(TS, NO_ARG, 0), + asBCINFO(TNS, NO_ARG, 0), + asBCINFO(TP, NO_ARG, 0), + asBCINFO(TNP, NO_ARG, 0), + asBCINFO(NEGi, rW_ARG, 0), + asBCINFO(NEGf, rW_ARG, 0), + asBCINFO(NEGd, rW_ARG, 0), + asBCINFO(INCi16, NO_ARG, 0), + asBCINFO(INCi8, NO_ARG, 0), + asBCINFO(DECi16, NO_ARG, 0), + asBCINFO(DECi8, NO_ARG, 0), + asBCINFO(INCi, NO_ARG, 0), + asBCINFO(DECi, NO_ARG, 0), + asBCINFO(INCf, NO_ARG, 0), + asBCINFO(DECf, NO_ARG, 0), + asBCINFO(INCd, NO_ARG, 0), + asBCINFO(DECd, NO_ARG, 0), + asBCINFO(IncVi, rW_ARG, 0), + asBCINFO(DecVi, rW_ARG, 0), + asBCINFO(BNOT, rW_ARG, 0), + asBCINFO(BAND, wW_rW_rW_ARG, 0), + asBCINFO(BOR, wW_rW_rW_ARG, 0), + asBCINFO(BXOR, wW_rW_rW_ARG, 0), + asBCINFO(BSLL, wW_rW_rW_ARG, 0), + asBCINFO(BSRL, wW_rW_rW_ARG, 0), + asBCINFO(BSRA, wW_rW_rW_ARG, 0), + asBCINFO(COPY, W_ARG, -AS_PTR_SIZE), + asBCINFO(PshC8, QW_ARG, 2), + asBCINFO(RDS8, NO_ARG, 2-AS_PTR_SIZE), + asBCINFO(SWAP8, NO_ARG, 0), + asBCINFO(CMPd, rW_rW_ARG, 0), + asBCINFO(CMPu, rW_rW_ARG, 0), + asBCINFO(CMPf, rW_rW_ARG, 0), + asBCINFO(CMPi, rW_rW_ARG, 0), + asBCINFO(CMPIi, rW_DW_ARG, 0), + asBCINFO(CMPIf, rW_DW_ARG, 0), + asBCINFO(CMPIu, rW_DW_ARG, 0), + asBCINFO(JMPP, rW_ARG, 0), + asBCINFO(PopRPtr, NO_ARG, -AS_PTR_SIZE), + asBCINFO(PshRPtr, NO_ARG, AS_PTR_SIZE), + asBCINFO(STR, W_ARG, 1+AS_PTR_SIZE), + asBCINFO(CALLSYS, DW_ARG, 0xFFFF), + asBCINFO(CALLBND, DW_ARG, 0xFFFF), + asBCINFO(SUSPEND, NO_ARG, 0), + asBCINFO(ALLOC, PTR_DW_ARG, 0xFFFF), + asBCINFO(FREE, PTR_ARG, -AS_PTR_SIZE), + asBCINFO(LOADOBJ, rW_ARG, 0), + asBCINFO(STOREOBJ, wW_ARG, 0), + asBCINFO(GETOBJ, W_ARG, 0), + asBCINFO(REFCPY, PTR_ARG, -AS_PTR_SIZE), + asBCINFO(CHKREF, NO_ARG, 0), + asBCINFO(GETOBJREF, W_ARG, 0), + asBCINFO(GETREF, W_ARG, 0), + asBCINFO(SWAP48, NO_ARG, 0), + asBCINFO(SWAP84, NO_ARG, 0), + asBCINFO(OBJTYPE, PTR_ARG, AS_PTR_SIZE), + asBCINFO(TYPEID, DW_ARG, 1), + asBCINFO(SetV4, wW_DW_ARG, 0), + asBCINFO(SetV8, wW_QW_ARG, 0), + asBCINFO(ADDSi, DW_ARG, 0), + asBCINFO(CpyVtoV4, wW_rW_ARG, 0), + asBCINFO(CpyVtoV8, wW_rW_ARG, 0), + asBCINFO(CpyVtoR4, rW_ARG, 0), + asBCINFO(CpyVtoR8, rW_ARG, 0), + asBCINFO(CpyVtoG4, W_rW_ARG, 0), + asBCINFO(CpyRtoV4, wW_ARG, 0), + asBCINFO(CpyRtoV8, wW_ARG, 0), + asBCINFO(CpyGtoV4, wW_W_ARG, 0), + asBCINFO(WRTV1, rW_ARG, 0), + asBCINFO(WRTV2, rW_ARG, 0), + asBCINFO(WRTV4, rW_ARG, 0), + asBCINFO(WRTV8, rW_ARG, 0), + asBCINFO(RDR1, wW_ARG, 0), + asBCINFO(RDR2, wW_ARG, 0), + asBCINFO(RDR4, wW_ARG, 0), + asBCINFO(RDR8, wW_ARG, 0), + asBCINFO(LDG, W_ARG, 0), + asBCINFO(LDV, rW_ARG, 0), + asBCINFO(PGA, W_ARG, AS_PTR_SIZE), + asBCINFO(RDS4, NO_ARG, 1-AS_PTR_SIZE), + asBCINFO(VAR, rW_ARG, AS_PTR_SIZE), + asBCINFO(iTOf, rW_ARG, 0), + asBCINFO(fTOi, rW_ARG, 0), + asBCINFO(uTOf, rW_ARG, 0), + asBCINFO(fTOu, rW_ARG, 0), + asBCINFO(sbTOi, rW_ARG, 0), + asBCINFO(swTOi, rW_ARG, 0), + asBCINFO(ubTOi, rW_ARG, 0), + asBCINFO(uwTOi, rW_ARG, 0), + asBCINFO(dTOi, wW_rW_ARG, 0), + asBCINFO(dTOu, wW_rW_ARG, 0), + asBCINFO(dTOf, wW_rW_ARG, 0), + asBCINFO(iTOd, wW_rW_ARG, 0), + asBCINFO(uTOd, wW_rW_ARG, 0), + asBCINFO(fTOd, wW_rW_ARG, 0), + asBCINFO(ADDi, wW_rW_rW_ARG, 0), + asBCINFO(SUBi, wW_rW_rW_ARG, 0), + asBCINFO(MULi, wW_rW_rW_ARG, 0), + asBCINFO(DIVi, wW_rW_rW_ARG, 0), + asBCINFO(MODi, wW_rW_rW_ARG, 0), + asBCINFO(ADDf, wW_rW_rW_ARG, 0), + asBCINFO(SUBf, wW_rW_rW_ARG, 0), + asBCINFO(MULf, wW_rW_rW_ARG, 0), + asBCINFO(DIVf, wW_rW_rW_ARG, 0), + asBCINFO(MODf, wW_rW_rW_ARG, 0), + asBCINFO(ADDd, wW_rW_rW_ARG, 0), + asBCINFO(SUBd, wW_rW_rW_ARG, 0), + asBCINFO(MULd, wW_rW_rW_ARG, 0), + asBCINFO(DIVd, wW_rW_rW_ARG, 0), + asBCINFO(MODd, wW_rW_rW_ARG, 0), + asBCINFO(ADDIi, wW_rW_DW_ARG, 0), + asBCINFO(SUBIi, wW_rW_DW_ARG, 0), + asBCINFO(MULIi, wW_rW_DW_ARG, 0), + asBCINFO(ADDIf, wW_rW_DW_ARG, 0), + asBCINFO(SUBIf, wW_rW_DW_ARG, 0), + asBCINFO(MULIf, wW_rW_DW_ARG, 0), + asBCINFO(SetG4, W_DW_ARG, 0), + asBCINFO(ChkRefS, NO_ARG, 0), + asBCINFO(ChkNullV, rW_ARG, 0), + asBCINFO(CALLINTF, DW_ARG, 0xFFFF), + asBCINFO(iTOb, rW_ARG, 0), + asBCINFO(iTOw, rW_ARG, 0), + asBCINFO(SetV1, wW_DW_ARG, 0), + asBCINFO(SetV2, wW_DW_ARG, 0), + asBCINFO(Cast, DW_ARG, -AS_PTR_SIZE), + asBCINFO(i64TOi, wW_rW_ARG, 0), + asBCINFO(uTOi64, wW_rW_ARG, 0), + asBCINFO(iTOi64, wW_rW_ARG, 0), + asBCINFO(fTOi64, wW_rW_ARG, 0), + asBCINFO(dTOi64, rW_ARG, 0), + asBCINFO(fTOu64, wW_rW_ARG, 0), + asBCINFO(dTOu64, rW_ARG, 0), + asBCINFO(i64TOf, wW_rW_ARG, 0), + asBCINFO(u64TOf, wW_rW_ARG, 0), + asBCINFO(i64TOd, rW_ARG, 0), + asBCINFO(u64TOd, rW_ARG, 0), + asBCINFO(NEGi64, rW_ARG, 0), + asBCINFO(INCi64, NO_ARG, 0), + asBCINFO(DECi64, NO_ARG, 0), + asBCINFO(BNOT64, rW_ARG, 0), + asBCINFO(ADDi64, wW_rW_rW_ARG, 0), + asBCINFO(SUBi64, wW_rW_rW_ARG, 0), + asBCINFO(MULi64, wW_rW_rW_ARG, 0), + asBCINFO(DIVi64, wW_rW_rW_ARG, 0), + asBCINFO(MODi64, wW_rW_rW_ARG, 0), + asBCINFO(BAND64, wW_rW_rW_ARG, 0), + asBCINFO(BOR64, wW_rW_rW_ARG, 0), + asBCINFO(BXOR64, wW_rW_rW_ARG, 0), + asBCINFO(BSLL64, wW_rW_rW_ARG, 0), + asBCINFO(BSRL64, wW_rW_rW_ARG, 0), + asBCINFO(BSRA64, wW_rW_rW_ARG, 0), + asBCINFO(CMPi64, rW_rW_ARG, 0), + asBCINFO(CMPu64, rW_rW_ARG, 0), + asBCINFO(ChkNullS, W_ARG, 0), + asBCINFO(ClrHi, NO_ARG, 0), + asBCINFO(JitEntry, W_ARG, 0), + + asBCINFO_DUMMY(176), + asBCINFO_DUMMY(177), + asBCINFO_DUMMY(178), + asBCINFO_DUMMY(179), + asBCINFO_DUMMY(180), + asBCINFO_DUMMY(181), + asBCINFO_DUMMY(182), + asBCINFO_DUMMY(183), + asBCINFO_DUMMY(184), + asBCINFO_DUMMY(185), + asBCINFO_DUMMY(186), + asBCINFO_DUMMY(187), + asBCINFO_DUMMY(188), + asBCINFO_DUMMY(189), + asBCINFO_DUMMY(190), + asBCINFO_DUMMY(191), + asBCINFO_DUMMY(192), + asBCINFO_DUMMY(193), + asBCINFO_DUMMY(194), + asBCINFO_DUMMY(195), + asBCINFO_DUMMY(196), + asBCINFO_DUMMY(197), + asBCINFO_DUMMY(198), + asBCINFO_DUMMY(199), + asBCINFO_DUMMY(200), + asBCINFO_DUMMY(201), + asBCINFO_DUMMY(202), + asBCINFO_DUMMY(203), + asBCINFO_DUMMY(204), + asBCINFO_DUMMY(205), + asBCINFO_DUMMY(206), + asBCINFO_DUMMY(207), + asBCINFO_DUMMY(208), + asBCINFO_DUMMY(209), + asBCINFO_DUMMY(210), + asBCINFO_DUMMY(211), + asBCINFO_DUMMY(212), + asBCINFO_DUMMY(213), + asBCINFO_DUMMY(214), + asBCINFO_DUMMY(215), + asBCINFO_DUMMY(216), + asBCINFO_DUMMY(217), + asBCINFO_DUMMY(218), + asBCINFO_DUMMY(219), + asBCINFO_DUMMY(220), + asBCINFO_DUMMY(221), + asBCINFO_DUMMY(222), + asBCINFO_DUMMY(223), + asBCINFO_DUMMY(224), + asBCINFO_DUMMY(225), + asBCINFO_DUMMY(226), + asBCINFO_DUMMY(227), + asBCINFO_DUMMY(228), + asBCINFO_DUMMY(229), + asBCINFO_DUMMY(230), + asBCINFO_DUMMY(231), + asBCINFO_DUMMY(232), + asBCINFO_DUMMY(233), + asBCINFO_DUMMY(234), + asBCINFO_DUMMY(235), + asBCINFO_DUMMY(236), + asBCINFO_DUMMY(237), + asBCINFO_DUMMY(238), + asBCINFO_DUMMY(239), + asBCINFO_DUMMY(240), + asBCINFO_DUMMY(241), + asBCINFO_DUMMY(242), + asBCINFO_DUMMY(243), + asBCINFO_DUMMY(244), + asBCINFO_DUMMY(245), + asBCINFO_DUMMY(246), + asBCINFO_DUMMY(247), + asBCINFO_DUMMY(248), + asBCINFO_DUMMY(249), + asBCINFO_DUMMY(250), + asBCINFO_DUMMY(251), + asBCINFO_DUMMY(252), + + asBCINFO(PSP, W_ARG, AS_PTR_SIZE), + asBCINFO(LINE, INFO, 0xFFFF), + asBCINFO(LABEL, INFO, 0xFFFF) +}; + +// Macros to access bytecode instruction arguments +//! \brief Macro to access the first DWORD argument in the bytecode instruction +#define asBC_DWORDARG(x) (asDWORD(*(x+1))) +//! \brief Macro to access the first 32bit integer argument in the bytecode instruction +#define asBC_INTARG(x) (int(*(x+1))) +//! \brief Macro to access the first QWORD argument in the bytecode instruction +#define asBC_QWORDARG(x) (*(asQWORD*)(x+1)) +//! \brief Macro to access the first float argument in the bytecode instruction +#define asBC_FLOATARG(x) (*(float*)(x+1)) +//! \brief Macro to access the first pointer argument in the bytecode instruction +#define asBC_PTRARG(x) (asPTRWORD(*(x+1))) +//! \brief Macro to access the first WORD argument in the bytecode instruction +#define asBC_WORDARG0(x) (*(((asWORD*)x)+1)) +//! \brief Macro to access the second WORD argument in the bytecode instruction +#define asBC_WORDARG1(x) (*(((asWORD*)x)+2)) +//! \brief Macro to access the first signed WORD argument in the bytecode instruction +#define asBC_SWORDARG0(x) (*(((short*)x)+1)) +//! \brief Macro to access the second signed WORD argument in the bytecode instruction +#define asBC_SWORDARG1(x) (*(((short*)x)+2)) +//! \brief Macro to access the third signed WORD argument in the bytecode instruction +#define asBC_SWORDARG2(x) (*(((short*)x)+3)) + + +END_AS_NAMESPACE + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_addon.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_addon.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_addon.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_addon.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1083 @@ +/** + +\page doc_addon Add-ons + +This page gives a brief description of the add-ons that you'll find in the /sdk/add_on/ folder. + + - \subpage doc_addon_application + - \subpage doc_addon_script + +\page doc_addon_application Application modules + + - \subpage doc_addon_build + - \subpage doc_addon_ctxmgr + - \subpage doc_addon_autowrap + - \subpage doc_addon_helpers + - \subpage doc_addon_clib + +\page doc_addon_script Script extensions + + - \subpage doc_addon_std_string + - \subpage doc_addon_string + - \subpage doc_addon_array + - \subpage doc_addon_any + - \subpage doc_addon_dict + - \subpage doc_addon_file + - \subpage doc_addon_math + - \subpage doc_addon_math3d + + + +\page doc_addon_ctxmgr Context manager + +Path: /sdk/add_on/contextmgr/ + +The CContextMgr is a class designed to aid the management of multiple simultaneous +scripts executing in parallel. It supports both \ref doc_adv_concurrent "concurrent script threads" and \ref doc_adv_coroutine "co-routines". + +If the application doesn't need multiple contexts, i.e. all scripts that are executed +always complete before the next script is executed, then this class is not necessary. + +Multiple context managers can be used, for example when you have a group of scripts controlling +ingame objects, and another group of scripts controlling GUI elements, then each of these groups +may be managed by different context managers. + +Observe, that the context manager class hasn't been designed for multithreading, so you need to +be careful if your application needs to execute scripts from multiple threads. + +\see The samples \ref doc_samples_concurrent and \ref doc_samples_corout for uses + +\section doc_addon_ctxmgr_1 Public C++ interface + +\code +class CContextMgr +{ +public: + CContextMgr(); + ~CContextMgr(); + + // Set the function that the manager will use to obtain the time in milliseconds. + void SetGetTimeCallback(TIMEFUNC_t func); + + // Registers the script function + // + // void sleep(uint milliseconds) + // + // The application must set the get time callback for this to work + void RegisterThreadSupport(asIScriptEngine *engine); + + // Registers the script functions + // + // void createCoRoutine(const string &in functionName, any @arg) + // void yield() + void RegisterCoRoutineSupport(asIScriptEngine *engine); + + // Create a new context, prepare it with the function id, then return + // it so that the application can pass the argument values. The context + // will be released by the manager after the execution has completed. + asIScriptContext *AddContext(asIScriptEngine *engine, int funcId); + + // Create a new context, prepare it with the function id, then return + // it so that the application can pass the argument values. The context + // will be added as a co-routine in the same thread as the currCtx. + asIScriptContext *AddContextForCoRoutine(asIScriptContext *currCtx, int funcId); + + // Execute each script that is not currently sleeping. The function returns after + // each script has been executed once. The application should call this function + // for each iteration of the message pump, or game loop, or whatever. + void ExecuteScripts(); + + // Put a script to sleep for a while + void SetSleeping(asIScriptContext *ctx, asUINT milliSeconds); + + // Switch the execution to the next co-routine in the group. + // Returns true if the switch was successful. + void NextCoRoutine(); + + // Abort all scripts + void AbortAll(); +}; +\endcode + + + + + + + + + + + +\page doc_addon_array array template object + +Path: /sdk/add_on/scriptarray/ + +The array type is a \ref doc_adv_template "template object" that allow the scripts to declare arrays of any type. +Since it is a generic class it is not the most performatic due to the need to determine characteristics at +runtime. For that reason it is recommended that the application registers a \ref doc_adv_template_2 "template specialization" for the +array types that are most commonly used. + +The type is registered with RegisterScriptArray(asIScriptEngine*). + +\section doc_addon_array_1 Public C++ interface + +\code +class CScriptArray +{ +public: + // Constructor + CScriptArray(asUINT length, asIObjectType *ot); + virtual ~CScriptArray(); + + // Memory management + void AddRef(); + void Release(); + + // Type information + asIObjectType *GetArrayObjectType() const; + int GetArrayTypeId() const; + int GetElementTypeId() const; + + // Get the current size + asUINT GetSize(); + + // Resize the array + void Resize(asUINT numElements); + + // Get a pointer to an element. Returns 0 if out of bounds + void *At(asUINT index); + + // Copy the contents of one array to another (only if the types are the same) + CScriptArray &operator=(const CScriptArray&); +}; +\endcode + +\section doc_addon_array_2 Public script interface + +
+  class array
+  {
+    array();
+    array(uint length);
+    
+    // Access elements
+    // T & operator [] (uint)
+    // const T & operator [] (uint) const
+
+    array opAssign(const array & in);
+    
+    uint length();
+    void resize(uint);
+  }
+
+ +\section doc_addon_array_3 Script example + +
+  int main()
+  {
+    array arr(3);
+    arr[0] = 1;
+    arr[1] = 2;
+    arr[2] = 3;
+    
+    int sum = 0;
+    for( uint n = 0; n < arr.length(); n++ )
+      sum += arr[n];
+      
+    return sum;
+  }
+
+ + + + + + + + + +\page doc_addon_any any object + +Path: /sdk/add_on/scriptany/ + +The any type is a generic container that can hold any value. It is a reference type. + +The type is registered with RegisterScriptAny(asIScriptEngine*). + +\section doc_addon_any_1 Public C++ interface + +\code +class CScriptAny +{ +public: + // Constructors + CScriptAny(asIScriptEngine *engine); + CScriptAny(void *ref, int refTypeId, asIScriptEngine *engine); + + // Memory management + int AddRef(); + int Release(); + + // Copy the stored value from another any object + CScriptAny &operator=(const CScriptAny&); + int CopyFrom(const CScriptAny *other); + + // Store the value, either as variable type, integer number, or real number + void Store(void *ref, int refTypeId); + void Store(asINT64 &value); + void Store(double &value); + + // Retrieve the stored value, either as variable type, integer number, or real number + bool Retrieve(void *ref, int refTypeId) const; + bool Retrieve(asINT64 &value) const; + bool Retrieve(double &value) const; + + // Get the type id of the stored value + int GetTypeId() const; +}; +\endcode + +\section doc_addon_any_2 Public script interface + +
+  class any
+  {
+    any();
+    any(? &in value);
+  
+    void store(? &in value);
+    void store(int64 &in value);
+    void store(double &in value);
+  
+    bool retrieve(? &out value) const;
+    bool retrieve(int64 &out value) const;
+    bool retrieve(double &out value) const;
+  }
+
+ +\section doc_addon_any_3 Example usage + +In the scripts it can be used as follows: + +
+  int value;
+  obj object;
+  obj \@handle;
+  any a,b,c;
+  a.store(value);      // store the value
+  b.store(\@handle);    // store an object handle
+  c.store(object);     // store a copy of the object
+  
+  a.retrieve(value);   // retrieve the value
+  b.retrieve(\@handle); // retrieve the object handle
+  c.retrieve(object);  // retrieve a copy of the object
+
+ +In C++ the type can be used as follows: + +\code +CScriptAny *myAny; +int typeId = engine->GetTypeIdByDecl("string@"); +CScriptString *str = new CScriptString("hello world"); +myAny->Store((void*)&str, typeId); +myAny->Retrieve((void*)&str, typeId); +\endcode + + + +\page doc_addon_std_string string object (STL) + +Path: /sdk/add_on/scriptstdstring/ + +This add-on registers the std::string type as-is with AngelScript. This gives +perfect compatibility with C++ functions that use std::string in parameters or +as return type. + +A potential drawback is that the std::string type is a value type, thus may +increase the number of copies taken when string values are being passed around +in the script code. However, this is most likely only a problem for scripts +that perform a lot of string operations. + +Register the type with RegisterStdString(asIScriptEngine*). + +\see \ref doc_addon_string + +\section doc_addon_std_string_1 Public C++ interface + +Refer to the std::string implementation for your compiler. + +\section doc_addon_std_string_2 Public script interface + +
+  class string
+  {
+    // Constructors
+    string();
+    
+    // Returns the length of the string
+    uint length() const;
+    
+    // Assignment and concatenation
+    string &opAssign(const string &in other);
+    string &opAddAssign(const string &in other);
+    string  opAdd(const string &in right) const;
+    
+    // Access individual characters
+    // uint8 &operator [] (uint)
+    // const uint8 &operator [] (uint) const
+    
+    // Comparison operators
+    bool opEquals(const string &in right) const;
+    int  opCmp(const string &in right) const;
+    
+    // Automatic conversion from number types to string type
+    string &opAssign(double val);
+    string &opAddAssign(double val);
+    string  opAdd(double val) const;
+    string  opAdd_r(double val) const;
+    
+    string &opAssign(int val);
+    string &opAddAssign(int val);
+    string  opAdd(int val) const;
+    string  opAdd_r(int val) const;
+    
+    string &opAssign(uint val);
+    string &opAddAssign(uint val);
+    string  opAdd(uint val) const;
+    string  opAdd_r(uint val) const;
+  }
+
+ + + + +\page doc_addon_string string object (reference counted) + +Path: /sdk/add_on/scriptstring/ + +This add-on registers a string type that is in most situations compatible with the +std::string, except that it uses reference counting. This means that if you have an +application function that takes a std::string by reference, you can register it +with AngelScript to take a script string by reference. This works because the CScriptString +wraps the std::string type, with the std::string type at the first byte of the CScriptString +object. + +Register the type with RegisterScriptString(asIScriptEngine*). Register the +utility functions with RegisterScriptStringUtils(asIScriptEngine*). + +\see \ref doc_addon_std_string + +\section doc_addon_string_1 Public C++ interface + +\code +class CScriptString +{ +public: + // Constructors + CScriptString(); + CScriptString(const CScriptString &other); + CScriptString(const char *s); + CScriptString(const std::string &s); + + // Memory management + void AddRef(); + void Release(); + + // Assignment + CScriptString &operator=(const CScriptString &other); + + // Concatenation + CScriptString &operator+=(const CScriptString &other); + friend CScriptString *operator+(const CScriptString &a, const CScriptString &b); + + // Memory buffer + std::string buffer; +}; +\endcode + +\section doc_addon_string_2 Public script interface + +
+  class string
+  {
+    // Constructors
+    string();
+    string(const string &in other);
+    
+    // Returns the length of the string
+    uint length() const;
+    
+    // Assignment and concatenation
+    string &opAssign(const string &in other);
+    string &opAddAssign(const string &in other);
+    string \@opAdd(const string &in right) const;
+    
+    // Access individual characters
+    // uint8 &operator [] (uint)
+    // const uint8 &operator [] (uint) const
+    
+    // Comparison operators
+    bool opEquals(const string &in right) const;
+    int  opCmp(const string &in right) const;
+    
+    // Automatic conversion from number types to string type
+    string &opAssign(double val);
+    string &opAddAssign(double val);
+    string \@opAdd(double val) const;
+    string \@opAdd_r(double val) const;
+ 
+    string &opAssign(float val);
+    string &opAddAssign(float val);
+    string \@opAdd(float val) const;
+    string \@opAdd_r(float val) const;
+ 
+    string &opAssign(int val);
+    string &opAddAssign(int val);
+    string \@opAdd(int val) const;
+    string \@opAdd_r(int val) const;
+    
+    string &opAssign(uint val);
+    string &opAddAssign(uint val);
+    string \@opAdd(uint val) const;
+    string \@opAdd_r(uint val) const;
+  }
+
+  // Get a substring of a string
+  string @ substring(const string &in str, int start, int length);
+
+  // Find the first occurrance of the substring
+  int findFirst(const string &in str, const string &in sub);
+  int findFirst(const string &in str, const string &in sub, int startAt)
+  
+  // Find the last occurrance of the substring
+  int findLast(const string &in str, const string &in sub);
+  int findLast(const string &in str, const string &in sub, int startAt);
+  
+  // Find the first character from the set 
+  int findFirstOf(const string &in str, const string &in set);
+  int findFirstOf(const string &in str, const string &in set, int startAt);
+  
+  // Find the first character not in the set
+  int findFirstNotOf(const string &in str, const string &in set);
+  int findFirstNotOf(const string &in str, const string &in set, int startAt);
+  
+  // Find the last character from the set
+  int findLastOf(const string &in str, const string &in set);
+  int findLastOf(const string &in str, const string &in set, int startAt);
+  
+  // Find the last character not in the set
+  int findLastNotOf(const string &in str, const string &in set);
+  int findLastNotOf(const string &in str, const string &in set, int startAt);
+  
+  // Split the string into an array of substrings
+  string@[]@ split(const string &in str, const string &in delimiter);
+  
+  // Join an array of strings into a larger string separated by a delimiter
+  string@ join(const string@[] &in str, const string &in delimiter);
+
+ + + + +\page doc_addon_dict dictionary object + +Path: /sdk/add_on/scriptdictionary/ + +The dictionary object maps string values to values or objects of other types. + +Register with RegisterScriptDictionary(asIScriptEngine*). + +\section doc_addon_dict_1 Public C++ interface + +\code +class CScriptDictionary +{ +public: + // Memory management + CScriptDictionary(asIScriptEngine *engine); + void AddRef(); + void Release(); + + // Sets/Gets a variable type value for a key + void Set(const std::string &key, void *value, int typeId); + bool Get(const std::string &key, void *value, int typeId) const; + + // Sets/Gets an integer number value for a key + void Set(const std::string &key, asINT64 &value); + bool Get(const std::string &key, asINT64 &value) const; + + // Sets/Gets a real number value for a key + void Set(const std::string &key, double &value); + bool Get(const std::string &key, double &value) const; + + // Returns true if the key is set + bool Exists(const std::string &key) const; + + // Deletes the key + void Delete(const std::string &key); + + // Deletes all keys + void DeleteAll(); +}; +\endcode + +\section doc_addon_dict_2 Public script interface + +
+  class dictionary
+  {
+    void set(const string &in key, ? &in value);
+    bool get(const string &in value, ? &out value) const;
+    
+    void set(const string &in key, int64 &in value);
+    bool get(const string &in key, int64 &out value) const;
+    
+    void set(const string &in key, double &in value);
+    bool get(const string &in key, double &out value) const;
+    
+    bool exists(const string &in key) const;
+    void delete(const string &in key);
+    void deleteAll();
+  }
+
+ +\section doc_addon_dict_3 Script example + +
+  dictionary dict;
+  obj object;
+  obj \@handle;
+  
+  dict.set("one", 1);
+  dict.set("object", object);
+  dict.set("handle", \@handle);
+  
+  if( dict.exists("one") )
+  {
+    bool found = dict.get("handle", \@handle);
+    if( found )
+    {
+      dict.delete("object");
+    }
+  }
+  
+  dict.deleteAll();
+
+ + + + + +\page doc_addon_file file object + +Path: /sdk/add_on/scriptfile/ + +This object provides support for reading and writing files. + +Register with RegisterScriptFile(asIScriptEngine*). + +If you do not want to provide write access for scripts then you can compile +the add on with the define AS_WRITE_OPS 0, which will disable support for writing. +This define can be made in the project settings or directly in the header. + + +\section doc_addon_file_1 Public C++ interface + +\code +class CScriptFile +{ +public: + // Constructor + CScriptFile(); + + // Memory management + void AddRef(); + void Release(); + + // Opening and closing file handles + // mode = "r" -> open the file for reading + // mode = "w" -> open the file for writing (overwrites existing files) + // mode = "a" -> open the file for appending + int Open(const std::string &filename, const std::string &mode); + int Close(); + + // Returns the size of the file + int GetSize() const; + + // Returns true if the end of the file has been reached + bool IsEOF() const; + + // Reads a specified number of bytes into the string + int ReadString(unsigned int length, std::string &str); + + // Reads to the next new-line character + int ReadLine(std::string &str); + + // Writes a string to the file + int WriteString(const std::string &str); + + // File cursor manipulation + int GetPos() const; + int SetPos(int pos); + int MovePos(int delta); +}; +\endcode + +\section doc_addon_file_2 Public script interface + +
+  class file
+  {
+    int      open(const string &in filename, const string &in mode);
+    int      close();
+    int      getSize() const;
+    bool     isEndOfFile() const;
+    int      readString(uint length, string &out str);
+    int      readLine(string &out str);
+    int      writeString(const string &in string);
+    int      getPos() const;
+    int      setPos(int pos);
+    int      movePos(int delta);
+  }
+
+ +\section doc_addon_file_3 Script example + +
+  file f;
+  // Open the file in 'read' mode
+  if( f.open("file.txt", "r") >= 0 ) 
+  {
+      // Read the whole file into the string buffer
+      string str;
+      f.readString(f.getSize(), str); 
+      f.close();
+  }
+
+ + + + + +\page doc_addon_math math functions + +Path: /sdk/add_on/scriptmath/ + +This add-on registers the math functions from the standard C runtime library with the script +engine. Use RegisterScriptMath(asIScriptEngine*) to perform the registration. + +By defining the preprocessor word AS_USE_FLOAT=0, the functions will be registered to take +and return doubles instead of floats. + +\section doc_addon_math_1 Public script interface + +
+  float cos(float rad);
+  float sin(float rad);
+  float tan(float rad);
+  float acos(float val);
+  float asin(float val);
+  float atan(float val);
+  float atan2(float y, float x);
+  float cosh(float rad);
+  float sinh(float rad);
+  float tanh(float rad);
+  float log(float val);
+  float log10(float val);
+  float pow(float val, float exp);
+  float sqrt(float val);
+  float ceil(float val);
+  float abs(float val);
+  float floor(float val);
+  float fraction(float val);
+
+ + + + + +\page doc_addon_math3d 3D math functions + +Path: /sdk/add_on/scriptmath3d/ + +This add-on registers some value types and functions that permit the scripts to perform +3D mathematical operations. Use RegisterScriptMath3D(asIScriptEngine*) to +perform the registration. + +Currently the only thing registered is the vector3 type, representing a 3D vector, +with basic math operators, such as add, subtract, scalar multiply, equality comparison, etc. + +This add-on serves mostly as a sample on how to register a value type. Application +developers will most likely want to register their own math library rather than use +this add-on as-is. + + + + + + + +\page doc_addon_build Script builder helper + +Path: /sdk/add_on/scriptbuilder/ + +This class is a helper class for loading and building scripts, with a basic pre-processor +that supports conditional compilation, include directives, and metadata declarations. + +By default the script builder resolves include directives by loading the included file +from the relative directory of the file it is included from. If you want to do this in another +way, then you should implement the \ref doc_addon_build_1_1 "include callback" which will +let you process the include directive in a custom way, e.g. to load the included file from +memory, or to support multiple search paths. The include callback should call the AddSectionFromFile or +AddSectionFromMemory to include the section in the current build. + +If you do not want process metadata then you can compile the add-on with the define +AS_PROCESS_METADATA 0, which will exclude the code for processing this. This define +can be made in the project settings or directly in the header. + + +\section doc_addon_build_1 Public C++ interface + +\code +class CScriptBuilder +{ +public: + // Start a new module + int StartNewModule(asIScriptEngine *engine, const char *moduleName); + + // Load a script section from a file on disk + int AddSectionFromFile(const char *filename); + + // Load a script section from memory + int AddSectionFromMemory(const char *scriptCode, + const char *sectionName = ""); + + // Build the added script sections + int BuildModule(); + + // Register the callback for resolving include directive + void SetIncludeCallback(INCLUDECALLBACK_t callback, void *userParam); + + // Add a pre-processor define for conditional compilation + void DefineWord(const char *word); + + // Get metadata declared for class types and interfaces + const char *GetMetadataStringForType(int typeId); + + // Get metadata declared for functions + const char *GetMetadataStringForFunc(int funcId); + + // Get metadata declared for global variables + const char *GetMetadataStringForVar(int varIdx); +}; +\endcode + +\subsection doc_addon_build_1_1 The include callback signature + +\code +// This callback will be called for each #include directive encountered by the +// builder. The callback should call the AddSectionFromFile or AddSectionFromMemory +// to add the included section to the script. If the include cannot be resolved +// then the function should return a negative value to abort the compilation. +typedef int (*INCLUDECALLBACK_t)(const char *include, const char *from, CScriptBuilder *builder, void *userParam); +\endcode + +\section doc_addon_build_2 Include directives + +Example script with include directive: + +
+  \#include "commonfuncs.as"
+  
+  void main()
+  {
+    // Call a function from the included file
+    CommonFunc();
+  }
+
+ + +\section doc_addon_build_condition Conditional programming + +The builder supports conditional programming through the \#if/\#endif preprocessor directives. +The application may define a word with a call to DefineWord(), then the scripts may check +for this definition in the code in order to include/exclude parts of the code. + +This is especially useful when scripts are shared between different binaries, for example, in a +client/server application. + +Example script with conditional compilation: + +
+  class CObject
+  {
+    void Process()
+    {
+  \#if SERVER
+      // Do some server specific processing
+  \#endif
+
+  \#if CLIENT
+      // Do some client specific processing
+  \#endif 
+
+      // Do some common processing
+    }
+  }
+
+ + + + + +\section doc_addon_build_metadata Metadata in scripts + +Metadata can be added before script class, interface, function, and global variable +declarations. The metadata is removed from the script by the builder class and stored +for post build lookup by the type id, function id, or variable index. + +Exactly what the metadata looks like is up to the application. The builder class doesn't +impose any rules, except that the metadata should be added between brackets []. After +the script has been built the application can obtain the metadata strings and interpret +them as it sees fit. + +Example script with metadata: + +
+  [factory func = CreateOgre,
+   editable: myPosition,
+   editable: myStrength [10, 100]]
+  class COgre
+  {
+    vector3 myPosition;
+    int     myStrength;
+  }
+  
+  [factory]
+  COgre \@CreateOgre()
+  {
+    return \@COgre();
+  }
+
+ +Example usage: + +\code +CScriptBuilder builder; +int r = builder.StartNewModule(engine, "my module"); +if( r >= 0 ) + r = builder.AddSectionFromMemory(script); +if( r >= 0 ) + r = builder.BuildModule(); +if( r >= 0 ) +{ + // Find global variables that have been marked as editable by user + asIScriptModule *mod = engine->GetModule("my module"); + int count = mod->GetGlobalVarCount(); + for( int n = 0; n < count; n++ ) + { + string metadata = builder.GetMetadataStringForVar(n); + if( metadata == "editable" ) + { + // Show the global variable in a GUI + ... + } + } +} +\endcode + + + + +\page doc_addon_autowrap Automatic wrapper functions + +Path: /sdk/add_on/autowrapper/aswrappedcall.h + +This header file declares some macros and template functions that will let the application developer +automatically generate wrapper functions using the \ref doc_generic "generic calling convention" with +a simple call to a preprocessor macro. This is useful for those platforms where the native calling +conventions are not yet supported. + +The macros are defined as + +\code +#define asDECLARE_FUNCTION_WRAPPER(wrapper_name,func) +#define asDECLARE_FUNCTION_WRAPPERPR(wrapper_name,func,params,rettype) +#define asDECLARE_METHOD_WRAPPER(wrapper_name,cl,func) +#define asDECLARE_METHOD_WRAPPERPR(wrapper_name,cl,func,params,rettype) +\endcode + +where wrapper_name is the name of the function that you want to generate, and func is a function pointer +to the function you want to wrap, cl is the class name, params is the parameter list, and rettype is the return type. + +Unfortunately the template functions needed to perform this generation are quite complex and older +compilers may not be able to handle them. One such example is Microsoft Visual C++ 6, though luckily +it has no need for them as AngelScript already supports native calling conventions for it. + +\section doc_addon_autowrap_1 Example usage + +\code +#include "aswrappedcall.h" + +// The application function that we want to register +void DoSomething(std::string param1, int param2); + +// Generate the wrapper for the function +asDECLARE_FUNCTION_WRAPPER(DoSomething_Generic, DoSomething); + +// Registering the wrapper with AngelScript +void RegisterWrapper(asIScriptEngine *engine) +{ + int r; + + r = engine->RegisterGlobalFunction("void DoSomething(string, int)", asFUNCTION(DoSomething_Generic), asCALL_GENERIC); assert( r >= 0 ); +} +\endcode + + + + + + +\page doc_addon_clib ANSI C library interface + +Path: /sdk/add_on/clib/ + +This add-on defines a pure C interface, that can be used in those applications that do not +understand C++ code but do understand C, e.g. Delphi, Java, and D. + +To compile the AngelScript C library, you need to compile the library source files in sdk/angelscript/source together +with the source files in sdk/add-on/clib, and link them as a shared dynamic library. In the application that will use +the AngelScript C library, you'll include the angelscript_c.h header file, instead of the ordinary +%angelscript.h header file. After that you can use the library much the same way that it's used in C++. + +To find the name of the C functions to call, you normally take the corresponding interface method +and give a prefix according to the following table: + + + + + + + + + + + +
interface  prefix 
asIScriptEngine   asEngine_
asIScriptModule   asModule_
asIScriptContext   asContext_
asIScriptGeneric   asGeneric_
asIScriptArray   asArray_
asIScriptObject   asObject_
asIObjectType   asObjectType_
asIScriptFunction   asScriptFunction_
+ +All interface methods take the interface pointer as the first parameter when in the C function format, the rest +of the parameters are the same as in the C++ interface. There are a few exceptions though, e.g. all parameters that +take an asSFuncPtr take a normal function pointer in the C function format. + +Example: + +\code +#include +#include +#include "angelscript_c.h" + +void MessageCallback(asSMessageInfo *msg, void *); +void PrintSomething(); + +int main(int argc, char **argv) +{ + int r = 0; + + // Create and initialize the script engine + asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); + r = asEngine_SetMessageCallback(engine, (asFUNCTION_t)MessageCallback, 0, asCALL_CDECL); assert( r >= 0 ); + r = asEngine_RegisterGlobalFunction(engine, "void print()", (asFUNCTION_t)PrintSomething, asCALL_CDECL); assert( r >= 0 ); + + // Execute a simple script + r = asEngine_ExecuteString(engine, 0, "print()", 0, 0); + if( r != asEXECUTION_FINISHED ) + { + printf("Something wen't wrong with the execution\n"); + } + else + { + printf("The script was executed successfully\n"); + } + + // Release the script engine + asEngine_Release(engine); + + return r; +} + +void MessageCallback(asSMessageInfo *msg, void *) +{ + const char *msgType = 0; + if( msg->type == 0 ) msgType = "Error "; + if( msg->type == 1 ) msgType = "Warning"; + if( msg->type == 2 ) msgType = "Info "; + + printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, msgType, msg->message); +} + +void PrintSomething() +{ + printf("Called from the script\n"); +} +\endcode + + + +\page doc_addon_helpers Helper functions + +Path: /sdk/add_on/scripthelper/ + +These helper functions simplify the implemention of common tasks. They can be used as is +or can serve as the starting point for your own framework. + +\section doc_addon_helpers_1 Public C++ interface + +\code +// Compare relation between two objects of the same type. +// Uses the object's opCmp method to perform the comparison. +// Returns a negative value if the comparison couldn't be performed. +int CompareRelation(asIScriptEngine *engine, void *leftObj, void *rightObj, int typeId, int &result); + +// Compare equality between two objects of the same type. +// Uses the object's opEquals method to perform the comparison, or if that doesn't exist the opCmp method. +// Returns a negative value if the comparison couldn't be performed. +int CompareEquality(asIScriptEngine *engine, void *leftObj, void *rightObj, int typeId, bool &result); + +// Compile and execute simple statements. +// The module is optional. If given the statements can access the entities compiled in the module. +// The caller can optionally provide its own context, for example if a context should be reused. +int ExecuteString(asIScriptEngine *engine, const char *code, asIScriptModule *mod = 0, asIScriptContext *ctx = 0); +\endcode + +\section doc_addon_helpers_2 Example + +To compare two script objects the application can execute the following code: + +\code +void Compare(asIScriptObject *a, asIScriptObject *b) +{ + asIScriptEngine *engine = a->GetEngine(); + int typeId = a->GetTypeId(); + + int cmp; + int r = CompareRelation(engine, a, b, typeId, cmp); + if( r < 0 ) + { + cout << "The relation between a and b cannot be established b" << endl; + } + else + { + if( cmp < 0 ) + cout << "a is smaller than b" << endl; + else if( cmp == 0 ) + cout << "a is equal to b" << endl; + else + cout << "a is greater than b" << endl; + } +} +\endcode + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_class_hierarchy.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_class_hierarchy.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_class_hierarchy.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_class_hierarchy.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,125 @@ +/** + +\page doc_adv_class_hierarchy Class hierarchies + +AngelScript cannot automatically determine relationships between registered classes, so in +order to establish the hierarchies for use within the script language it is necessary +to do a bit more registration beyond the normal \ref doc_register_type "object registration". + +Hierarchies can currently only be registered for \ref doc_reg_basicref "reference types", +not for \ref doc_register_val_type "value types". + +\section doc_adv_class_hierarchy_1 Establishing the relationship + +In order to let AngelScript know that two types are related you need to register the +reference cast behaviours \ref asBEHAVE_REF_CAST and \ref asBEHAVE_IMPLICIT_REF_CAST. The +asBEHAVE_REF_CAST should be used if you only want to allow the cast through an explicit +call with the \ref conversion "cast<class>" operator. asBEHAVE_IMPLICIT_REF_CAST +should be used when you want to allow the compiler to implicitly perform the cast as necessary. + +Usually you'll want to use asBEHAVE_IMPLICIT_REF_CAST for casts from a derived type to the base type, +and asBEHAVE_REF_CAST for casts from a base type to a derived type. + +\code +// Example REF_CAST behaviour +template +B* refCast(A* a) +{ + // If the handle already is a null handle, then just return the null handle + if( !a ) return 0; + + // Now try to dynamically cast the pointer to the wanted type + B* b = dynamic_cast(a); + if( b != 0 ) + { + // Since the cast was made, we need to increase the ref counter for the returned handle + b->addref(); + } + return b; +} + +// Example registration of the behaviour +r = engine->RegisterObjectBehaviour("base", asBEHAVE_REF_CAST, "derived@ f()", asFUNCTION((refCast)), asCALL_CDECL_OBJLAST); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("derived", asBEHAVE_IMPLICIT_REF_CAST, "base@ f()", asFUNCTION((refCast)), asCALL_CDECL_OBJLAST); assert( r >= 0 ); +\endcode + +Note that it may be necessary to add extra parenthesis to the asFUNCTION macro so that the preprocessor +doesn't interpret the , in the template declaration as the argument separator in the macro. + +Remember that it is legal for the script to attempt a cast on a null pointer, in which case the result is +also a null pointer. This means that the reference cast behaviour must not be implemented as a virtual class +method, because then the call will crash if the object pointer is null. + +\section doc_adv_class_hierarchy_2 Inherited methods and properties + +Just as relationships cannot be determined, there is also no way to automatically let AngelScript +add inherited methods and properties to derived types. The reason for this is that method pointers +and property offsets may differ between the base class and derived class, especially when multiple +inheritance is used, and there is no way to automatically determine exactly what the difference is. + +For this reason the application needs to register all the inherited methods and properties for +the derived classes, which may lead to a bit of duplicate code. However, you may be able to avoid +the duplication through a bit of clever thinking. Here is an example of registering the methods and +properties for a base class and the derived class (registration of behaviours has been omitted for briefness): + +\code +// The base class +class base +{ +public: + virtual void aMethod(); + + int aProperty; +}; + +// The derived class +class derived : public base +{ +public: + virtual void aNewMethod(); + + int aNewProperty; +}; + +// The code to register the classes +// This is implemented as a template function, to support multiple inheritance +template +void RegisterBaseMembers(asIScriptEngine *engine, const char *type) +{ + int r; + + r = engine->RegisterObjectMethod(type, "void aMethod()", asMETHOD(T, aMethod), asCALL_THISCALL); assert( r >= 0 ); + + r = engine->RegisterObjectProperty(type, "int aProperty", offsetof(T, aProperty)); assert( r >= 0 ); +} + +template +void RegisterDerivedMembers(asIScriptEngine *engine, const char *type) +{ + int r; + + // Register the inherited members by calling + // the registration of the base members + RegisterBaseMembers(engine, type); + + // Now register the new members + r = engine->RegisterObjectMethod(type, "void aNewMethod()", asMETHOD(T, aNewMethod), asCALL_THISCALL); assert( r >= 0 ); + + r = engine->RegisterObjectProperty(type, "int aProperty", offsetof(T, aProperty)); assert( r >= 0 ); +} + +void RegisterTypes(asIScriptEngine *engine) +{ + int r; + + // Register the base type + r = engine->RegisterObjectType("base", 0, asOBJ_REF); assert( r >= 0 ); + RegisterBaseMembers(engine, "base"); + + // Register the derived type + r = engine->RegisterObjectType("derived", 0, asOBJ_REF); assert( r >= 0 ); + RegisterDerivedMembers(engine, "derived"); +} +\endcode + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_concurrent.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_concurrent.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_concurrent.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_concurrent.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,14 @@ +/** + +\page doc_adv_concurrent Concurrent scripts + +\todo Complete this page + +\see \ref doc_addon_ctxmgr, \ref doc_samples_concurrent + + + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_coroutine.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_coroutine.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_coroutine.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_coroutine.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,14 @@ +/** + +\page doc_adv_coroutine Co-routines + +\todo Complete this page + +\see \ref doc_addon_ctxmgr, \ref doc_samples_corout + + + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_jit.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_jit.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_jit.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_jit.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,548 @@ +/** + +\page doc_adv_jit JIT compilation + +AngelScript doesn't provide a built-in JIT compiler, instead it permits an external JIT compiler to be implemented +through a public interface. + +To use JIT compilation, the scripts must be compiled with a few extra instructions that provide hints to the JIT compiler +and also entry points so that the VM will know when to pass control to the JIT compiled function. By default this is +turned off, and must thus be turned on by setting the engine property \ref asEP_INCLUDE_JIT_INSTRUCTIONS. + +If the application sets the \ref asIJITCompiler "JIT compiler" with \ref asIScriptEngine::SetJITCompiler "SetJITCompiler" +AngelScript will automatically invoke it to provide the \ref asJITFunction "JIT functions" with each compilation or +\ref doc_adv_precompile "loading of pre-compiled bytecode". + + + + +\section doc_adv_jit_3 The structure of the JIT function + +The \ref asJITFunction "JIT compiled function" must follow certain rules in order to behave well with the virtual machine. The intention +is that the VM will pass the control to the JIT function, and when the execution is to be suspended the JIT function +returns the control to the VM, updating the internal state of the VM so that the VM can resume the execution when +requested. Each time the JIT function returns control to the VM it must make sure that the \ref asSVMRegisters "VM registers" and stack values +have been updated according to the code that was executed. + +The byte code will have a special instruction, \ref asBC_JitEntry "JitEntry", which defines the positions where the VM +can pass the control to the JIT function. These are usually placed for every script statement, and after each instruction +that calls another function. This implies that the JIT compiled function needs to be able to start the execution at +different points based on the argument in the JitEntry instruction. The value of the argument is defined by the JIT compiler +and how it is interpreted is also up to the JIT compiler, with the exception of 0 that means that the control should not be +passed to the JIT function. + +Some byte code instructions are not meant to be converted into native code. These are usually the ones that have a more +global effect on the VM, e.g. the instructions that setup a call to a new script function, or that return from a previous +instruction. When these functions are encountered, the JIT function should return the control to the VM, and then the VM +will execute the instruction. + +Other byte code instructions may be partially implemented by the JIT function, for example those that can throw an exception +based on specific conditions. One such example is the instructions for divisions, if the divider is 0 the VM will set +an exception and abort the execution. For these instructions the JIT compiler should preferrably implement the condition +that doesn't throw an exception, and if an exception is to be thrown the JIT function will instead break out to the VM. + +The following shows a possible structure of a JIT compiled function: + +
+  void jitCompiledFunc(asSVMRegisters *regs, asDWORD entry)
+  {
+    Read desired VM registers into CPU registers
+    Jump to the current position of the function based on the 'entry' argument
+  1:
+    Execute code in block 1
+    Jump to exit if an illegal operation is done, e.g. divide by zero. 
+    Jump to exit if block ends with an instruction that should not be executed by JIT function. 
+  2:
+    ...
+  3:
+    ...
+  exit:
+    Update the VM registers before returning control to VM
+  }
+
+ + + +\section doc_adv_jit_2 Traversing the byte code + + +\code +int CJITCompiler::CompileFunction(asIScriptFunction *func, asJITFunction *output) +{ + bool success = StartNewCompilation(); + + // Get the script byte code + asUINT length; + asDWORD *byteCode = func->GetByteCode(&length); + asDWORD *end = byteCode + length; + + while( byteCode < end ) + { + // Determine the instruction + asEBCInstr op = asEBCInstr(*(asBYTE*)byteCode); + switch( op ) + { + // Translate each byte code instruction into native code. + // The codes that cannot be translated should return the control + // to the VM, so that it can continue the processing. When + // the VM encounters the next JitEntry instruction it will + // transfer the control back to the JIT function. + ... + + case asBC_JitEntry: + // Update the argument for the JitEntry instruction with + // the argument that should be sent to the jit function. + // Remember that 0 means that the VM should not pass + // control to the JIT function. + asBC_SWORDARG0(byteCode) = DetermineJitEntryArg(); + break; + } + + // Move to next instruction + byteCode += asBCTypeSize[asBCInfo[op].type]; + } + + if( success ) + { + *output = GetCompiledFunction(); + return 0; + } + + return -1; +} +\endcode + +The following macros should be used to read the arguments from the bytecode instruction. +The layout of the arguments is determined from the \ref asBCInfo array. + + - \ref asBC_DWORDARG + - \ref asBC_INTARG + - \ref asBC_QWORDARG + - \ref asBC_FLOATARG + - \ref asBC_PTRARG + - \ref asBC_WORDARG0 + - \ref asBC_WORDARG1 + - \ref asBC_SWORDARG0 + - \ref asBC_SWORDARG1 + - \ref asBC_SWORDARG2 + +What each \ref asEBCInstr "byte code" instruction does is described in \subpage doc_adv_jit_1, but the exact +implementation of each byte code instruction is best determined from the implementation +in the VM, i.e. the asCScriptContext::ExecuteNext method. + + + + + + + +\page doc_adv_jit_1 Byte code instructions + +This page gives a brief description of each of the byte code instructions that the virtual machine has. + + + - \ref doc_adv_jit_1_1 + - \ref doc_adv_jit_1_2 + - \ref doc_adv_jit_1_3 + - \ref doc_adv_jit_1_4 + - \ref doc_adv_jit_1_5 + - \ref doc_adv_jit_1_6 + - \ref doc_adv_jit_1_7 + - \ref doc_adv_jit_1_8 + - \ref doc_adv_jit_1_9 + + + + +\section doc_adv_jit_1_1 Object management + +Perform a bitwise copy of a memory buffer to another + + - \ref asBC_COPY + +Push the address and length of a string on the stack + + - \ref asBC_STR + +Allocate the memory for an object and setup the VM to execute the constructor + + - \ref asBC_ALLOC + +Release the memory of an object + + - \ref asBC_FREE + +Move the address in an object variable to the object register. The address in the variable is then cleared. + + - \ref asBC_LOADOBJ + +Move the address from the object register to an object variable. The address in the object register is then cleared. + + - \ref asBC_STOREOBJ + +Copy the object handle from one address to another. The reference count of the object is updated to reflect the copy. + + - \ref asBC_REFCPY + +Push the pointer of an object type on the stack + + - \ref asBC_OBJTYPE + +Push the type id on the stack + + - \ref asBC_TYPEID + +Pop an address to a script object from the stack. If the desired cast can be made store the address in the object register. + + - \ref asBC_Cast + + + + +\section doc_adv_jit_1_2 Math instructions + +Negate the value in the variable. The original value is overwritten. + + - \ref asBC_NEGi + - \ref asBC_NEGf + - \ref asBC_NEGd + - \ref asBC_NEGi64 + +Perform the operation with the value of two variables and store the result in a third variable. + + - \ref asBC_ADDi + - \ref asBC_SUBi + - \ref asBC_MULi + - \ref asBC_DIVi + - \ref asBC_MODi + + - \ref asBC_ADDf + - \ref asBC_SUBf + - \ref asBC_MULf + - \ref asBC_DIVf + - \ref asBC_MODf + + - \ref asBC_ADDd + - \ref asBC_SUBd + - \ref asBC_MULd + - \ref asBC_DIVd + - \ref asBC_MODd + + - \ref asBC_ADDi64 + - \ref asBC_SUBi64 + - \ref asBC_MULi64 + - \ref asBC_DIVi64 + - \ref asBC_MODi64 + +Perform the operation with a constant value and the value of the variable. The original value is overwritten. + + - \ref asBC_ADDIi + - \ref asBC_SUBIi + - \ref asBC_MULIi + + - \ref asBC_ADDIf + - \ref asBC_SUBIf + - \ref asBC_MULIf + + + + +\section doc_adv_jit_1_3 Bitwise instructions + +Perform a boolean not operation on the value in the variable. The original value is overwritten. + + - \ref asBC_NOT + +Perform a bitwise complement on the value in the variable. The original value is overwritten. + + - \ref asBC_BNOT + - \ref asBC_BNOT64 + +Perform the operation with the value of two variables and store the result in a third variable. + + - \ref asBC_BAND + - \ref asBC_BOR + - \ref asBC_BXOR + + - \ref asBC_BAND64 + - \ref asBC_BOR64 + - \ref asBC_BXOR64 + + - \ref asBC_BSLL + - \ref asBC_BSRL + - \ref asBC_BSRA + + - \ref asBC_BSLL64 + - \ref asBC_BSRL64 + - \ref asBC_BSRA64 + + + + +\section doc_adv_jit_1_4 Comparisons + +Compare the value of two variables and store the result in the value register. + + - \ref asBC_CMPi + - \ref asBC_CMPu + - \ref asBC_CMPf + - \ref asBC_CMPd + - \ref asBC_CMPi64 + - \ref asBC_CMPu64 + +Compare the value of a variable with a constant and store the result in the value register. + + - \ref asBC_CMPIi + - \ref asBC_CMPIu + - \ref asBC_CMPIf + +Test the value in the value register. Update the value register according to the result. + + - \ref asBC_TZ + - \ref asBC_TNZ + - \ref asBC_TS + - \ref asBC_TNS + - \ref asBC_TP + - \ref asBC_TNP + + + + +\section doc_adv_jit_1_5 Type conversions + +Convert the value in the variable. The original value is overwritten. + + - \ref asBC_iTOb + - \ref asBC_iTOw + - \ref asBC_sbTOi + - \ref asBC_swTOi + - \ref asBC_ubTOi + - \ref asBC_uwTOi + + - \ref asBC_iTOf + - \ref asBC_fTOi + - \ref asBC_uTOf + - \ref asBC_fTOu + + - \ref asBC_dTOi64 + - \ref asBC_dTOu64 + - \ref asBC_i64TOd + - \ref asBC_u64TOd + +Convert the value of a variable and store the result in another variable. + + - \ref asBC_dTOi + - \ref asBC_dTOu + - \ref asBC_dTOf + - \ref asBC_iTOd + - \ref asBC_uTOd + - \ref asBC_fTOd + + - \ref asBC_i64TOi + - \ref asBC_i64TOf + - \ref asBC_u64TOf + - \ref asBC_uTOi64 + - \ref asBC_iTOi64 + - \ref asBC_fTOi64 + - \ref asBC_fTOu64 + + + + +\section doc_adv_jit_1_6 Increment and decrement + +Increment or decrement the value pointed to by the address in the value register. + + - \ref asBC_INCi8 + - \ref asBC_DECi8 + - \ref asBC_INCi16 + - \ref asBC_DECi16 + - \ref asBC_INCi + - \ref asBC_DECi + - \ref asBC_INCi64 + - \ref asBC_DECi64 + - \ref asBC_INCf + - \ref asBC_DECf + - \ref asBC_INCd + - \ref asBC_DECd + +Increment or decrement the value in the variable. + + - \ref asBC_IncVi + - \ref asBC_DecVi + + + + +\section doc_adv_jit_1_7 Flow control + +Setup the VM to begin execution of the other script function + + - \ref asBC_CALL + - \ref asBC_CALLINTF + - \ref asBC_CALLBND + +Setup the VM to return to the calling function + + - \ref asBC_RET + +Make an unconditional jump to a relative position + + - \ref asBC_JMP + +Make a jump to a relative position depending on the value in the value register + + - \ref asBC_JZ + - \ref asBC_JNZ + - \ref asBC_JS + - \ref asBC_JNS + - \ref asBC_JP + - \ref asBC_JNP + - \ref asBC_JMPP + +Call an application registered function + + - \ref asBC_CALLSYS + +Save the state and suspend execution, then return control to the application + + - \ref asBC_SUSPEND + +Give control of execution to the JIT compiled function + + - \ref asBC_JitEntry + + + + +\section doc_adv_jit_1_8 Stack and data management + +Update the stack pointer. + + - \ref asBC_POP + - \ref asBC_PUSH + +Push a constant value on the stack. + + - \ref asBC_PshC4 + - \ref asBC_PshC8 + +Push the stack frame pointer on the stack. + + - \ref asBC_PSF + +Swap the top values on the stack. + + - \ref asBC_SWAP4 + - \ref asBC_SWAP8 + - \ref asBC_SWAP48 + - \ref asBC_SWAP84 + +Pop an address from the stack, read a value from the address and push it on the stack. + + - \ref asBC_RDS4 + - \ref asBC_RDS8 + +Add an offset to the top address on the stack. + + - \ref asBC_ADDSi + +Push the value of a variable on the stack. + + - \ref asBC_PshV4 + +Initialize the value of a variable with a constant. + + - \ref asBC_SetV1 + - \ref asBC_SetV2 + - \ref asBC_SetV4 + - \ref asBC_SetV8 + +Copy the value of one variable to another. + + - \ref asBC_CpyVtoV4 + - \ref asBC_CpyVtoV8 + +Validate that an expected pointer is not null. + + - \ref asBC_CHKREF + - \ref asBC_ChkRefS + - \ref asBC_ChkNullV + - \ref asBC_ChkNullS + +Push the variable index with the size of a pointer on the stack. + + - \ref asBC_VAR + +Replace a variable index on the stack with an address. + + - \ref asBC_GETREF + - \ref asBC_GETOBJ + - \ref asBC_GETOBJREF + +Pop or push an address to or from the value register. + + - \ref asBC_PopRPtr + - \ref asBC_PshRPtr + +Copy a value between value register and a variable. + + - \ref asBC_CpyVtoR4 + - \ref asBC_CpyVtoR8 + - \ref asBC_CpyRtoV4 + - \ref asBC_CpyRtoV8 + +Copy a value from a variable to the address held in the value register + + - \ref asBC_WRTV1 + - \ref asBC_WRTV2 + - \ref asBC_WRTV4 + - \ref asBC_WRTV8 + +Copy a value from the address held in the value register to a variable + + - \ref asBC_RDR1 + - \ref asBC_RDR2 + - \ref asBC_RDR4 + - \ref asBC_RDR8 + +Load the address of the variable into the value register + + - \ref asBC_LDV + +Clear the upper bytes of the value register + + - \ref asBC_ClrHi + + + + +\section doc_adv_jit_1_9 Global variables + +Push the value of a global variable on the stack + + - \ref asBC_PshG4 + +Load the address of a global variable into the value register + + - \ref asBC_LDG + +Load the address of a global variable into the value register and copy the value of the global variable to local variable + + - \ref asBC_LdGRdR4 + +Copy a value between local variable and global variable. + + - \ref asBC_CpyVtoG4 + - \ref asBC_CpyGtoV4 + +Push the address of the global variable on the stack. + + - \ref asBC_PGA + +Initialize the variable of a global variable with a constant. + + - \ref asBC_SetG4 + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_multithread.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_multithread.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_multithread.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_multithread.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,47 @@ +/** + +\page doc_adv_multithread Multithreading + +AngelScript supports multithreading, though not yet on all platforms. You can determine if multithreading +is supported on your platform by calling the \ref asGetLibraryOptions function and checking the returned +string for "AS_NO_THREADS". If the identifier is in the returned string then multithreading is +not supported. + +Even if you don't want or can't use multithreading, you can still write applications that execute +\ref doc_adv_concurrent "multiple scripts simultaneously". + +\section doc_adv_multithread_1 Things to think about with a multithreaded environment + + - Always call \ref asThreadCleanup before terminating a thread that accesses the script engine. If this + is not done, the memory allocated specifically for that thread will be lost until the script engine + is freed. + + - Multiple threads may execute scripts in separate contexts. The contexts may execute scripts from the + same module, but if the module has global variables you need to make sure the scripts perform proper + access control so that they do not get corrupted, if multiple threads try to update them simultaneously. + + - The engine will only allow one thread to build scripts at any one time, since this is something that + changes the internal state of the engine and cannot safely be done in multiple threads simultaneously. + + - Do not execute the \ref doc_gc "garbage collector" while other script threads are executed, as the + garbage collector may be traversing the reference graph while the objects are modified by the + other threads. + + - Resources that are shared by script modules such as registered properties and objects must be protected + by the application for simultaneous access, as the script engine doesn't do this automatically. + +\section doc_adv_fibers Fibers + +AngelScript can be used with fibers as well. However, as fibers are not real threads you need to be careful +if multiple fibers need to execute scripts. AngelScript keeps track of active contexts by pushing and popping +the context pointers on a stack. With fibers you can easily corrupt this stack if you do not pay attention +to where and when script executions are performed. + +Try to avoid switching fibers when a script is executing, instead you should \ref asIScriptContext::Suspend "suspend" the current script +execution and only switch to the other fiber when the context's \ref asIScriptContext::Execute "Execute()" method returns. If you really +must switch fibers while executing a script, then make sure the second fiber initiates and concludes its own +script execution before switching back to the original fiber. + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_precompile.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_precompile.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_precompile.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_precompile.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,48 @@ +/** + +\page doc_adv_precompile Pre-compiled byte code + +Sometimes it may be useful to use pre-compiled bytecode instead of re-building the +scripts every time a script is loaded. This can for example reduce load times, or +if scripts are transferred over the net, it can reduce the transfer time for large scripts. + +To save already compiled code you should call the \ref asIScriptModule::SaveByteCode "SaveByteCode" +method on the \ref asIScriptModule, passing in a pointer to the object that implements the \ref +asIBinaryStream interface. The script module will then push all the bytecode and related data onto +this object with the \ref asIBinaryStream::Write "Write" method. + +When loading the pre-compiled bytecode you should first get an instance of the \ref asIScriptModule, +just as if compiling a new script. Instead of calling AddScriptSection followed by Build you will +call the \ref asIScriptModule::LoadByteCode "LoadByteCode" method, passing it a pointer to the binary +stream object. The script module will then pull all the bytecode and related data from that object with +the \ref asIBinaryStream::Read "Read" method to reconstruct the script module. + +\section doc_adv_precompile_1 Things to remember + + - The engine configuration must be the same when saving and loading the bytecode, otherwise the + load will fail as functions, types, or global properties cannot be found. + + - The script engine doesn't perform validation of the pre-compiled bytecode, so the application is + responsible for authenticating the source. If this authentication isn't performed by the application + you'll have potential security risks in your application as the bytecode may have been manually + manipulated to perform otherwise illegal tasks. + + - The pre-compiled bytecode is currently not independent of the used CPU architecture, a script that + is compiled for a 32-bit target is generally not equal to a script compiled for a 64-bit target. This + is also true for big-endian and little-endian differences. The bytecode is independent of the target + OS though, so a script compiled on Linux is equal to Windows, given that the engine configuration is + the same for both. + + - If the application that compiles the script code is separate from the application that will execute + them, then you may register the functions and methods with null pointers so you don't need to + actually implement all of them. In this case you should also set the engine property \ref asEP_INIT_GLOBAL_VARS_AFTER_BUILD + to false with \ref asIScriptEngine::SetEngineProperty, so the script engine doesn't attempt to initialize the global variables after the script + has been built. + + + + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_scoped_type.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_scoped_type.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_scoped_type.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_scoped_type.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,52 @@ +/** + +\page doc_adv_scoped_type Registering a scoped reference type + +Some C++ value types have special requirements for the memory where they +are located, e.g. specific alignment needs, or memory pooling. Since +AngelScript doesn't provide that much control over where and how value types +are allocated, they must be registered as reference types. In this case you'd +register the type as a scoped reference type. + +A scoped reference type will have the life time controlled by the scope of +the variable that instanciate it, i.e. as soon as the variable goes out of +scope the instance is destroyed. This means that the type doesn't permit +handles to be taken for the type. + +A scoped reference type requires only that the release behaviour is registered. +The addref behaviour is not permitted. If the factory behaviour is not registered +the script will not be able to instanciate objects of this type, but it can +still receive them as parameters from the application. + +Since no handles can be taken for the object type, there is no need to keep +track of the number of references held to the object. This means that the +release behaviour should simply destroy and deallocate the object as soon as +it's called. + +\code +scoped *Scoped_Factory() +{ + return new scoped; +} + +void Scoped_Release(scoped *s) +{ + if( s ) delete s; +} + +// Registering a scoped reference type +r = engine->RegisterObjectType("scoped", 0, asOBJ_REF | asOBJ_SCOPED); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("scoped", asBEHAVE_FACTORY, "scoped @f()", asFUNCTION(Scoped_Factory), asCALL_CDECL); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("scoped", asBEHAVE_RELEASE, "void f()", asFUNCTION(Scoped_Release), asCALL_CDECL_OBJLAST); assert( r >= 0 ); +\endcode + + +\see \ref doc_reg_basicref + + + + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_single_ref_type.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_single_ref_type.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_single_ref_type.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_single_ref_type.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,37 @@ +/** + +\page doc_adv_single_ref_type Registering a single-reference type + +A variant of the uninstanciable reference types is the single-reference +type. This is a type that have only 1 reference accessing it, i.e. the script +cannot store any extra references to the object during execution. The script +is forced to use the reference it receives from the application at the moment +the application passes it on to the script. + +The reference can be passed to the script through a property, either global +or a class member, or it can be returned from an application registered +function or class method. + +The script engine will not permit declaration of functions that take this +type as a parameter, neither as a reference nor as a handle. If that was allowed +it would mean that a reference to the instance is placed on the stack, which +in turn means that it is no longer a single-reference type. + +\code +// Registering the type so that it cannot be instanciated +// by the script, nor allow scripts to store references to the type +r = engine->RegisterObjectType("single", 0, asOBJ_REF | asOBJ_NOHANDLE); assert( r >= 0 ); +\endcode + +This sort of type is most useful when you want to have complete control over +references to an object, for example so that the application can destroy and +recreate objects of the type without having to worry about potential references +held by scripts. This allows the application to control when a script has access +to an object and it's members. + + +\see \ref doc_reg_basicref + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_template.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_template.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_template.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_template.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,122 @@ +/** + +\page doc_adv_template Template types + +A template type in AngelScript works similarly to how templates work in C++. The scripts +will be able to instanciate different forms of the template type by specifying which subtype +that should be used. The methods for the instance will then be adapted to this subtype, so +that the correct handling of parameters and return types will be applied. + +The implementation of the template type is not a C++ template though, instead it must +be implemented as a generic class that can determine what to do dynamically at runtime based +on the subtype for which it was instanciated. This is obviously a lot less efficient than +having specific implementations for each type, and for that reason AngelScript permits the +application to register a template specialization where the extra performance is needed. + +This gives the best of both worlds, performance where the subtype is known before hand, and +support for all other types that cannot be pre-determined. + +\section doc_adv_template_1 Registering the template type + +The template registration is registered similarly to normal \ref doc_reg_basicref "reference types", +with a few differences. The name of the type is formed by the name of the template type plus +the name of the subtype with angle brackets. The type flag asOBJ_TEMPLATE must also be used. + +\code +// Register the template type +r = engine->RegisterObjectType("myTemplate", 0, asOBJ_REF | asOBJ_GC | asOBJ_TEMPLATE); assert( r >= 0 ); +\endcode + +The template type doesn't have to be \ref doc_gc_object "garbage collected", but since you may not know +which subtypes it will be instanciated for, it is usually best to implement that support. + +When registering the behaviours, methods, and properties for the template type the type is identified +with the name and subtype within angle brackets, but without the class token, e.g. myTemplate<T>. +The sub type is identified by just the name of the subtype as it was declared in the call to RegisterObjectType. + +The factory behaviour for the template type is also different. In order for the implementation to know +which subtype it is instanciated for the factory receives the \ref asIObjectType of the template instance +as a hidden first parameter. When registering the factory this hidden parameter is reflected in the declaration, +for example as int &in. + +\code +// Register the factory behaviour +r = engine->RegisterObjectBehaviour("myTemplate", asBEHAVE_FACTORY, "myTemplate@ f(int&in)", asFUNCTIONPR(myTemplateFactory, (asIObjectType*), myTemplate*), asCALL_CDECL); assert( r >= 0 ); +\endcode + +Remember that since the subtype must be determined dynamically at runtime, it is not possible to declare +functions to receive the subtype by value, nor to return it by value. Instead you'll have to design the +methods and behaviours to take the type by reference. It is possible to use object handles, but then +the script engine won't be able to instanciate the template type for primitives and other values types. + +\see \ref doc_addon_array + +\section doc_adv_template_4 Validating template instantiations at compile time + +In order to avoid unnecessary runtime validations of invalid template instantiations, the application +should preferably register the \ref asBEHAVE_TEMPLATE_CALLBACK behaviour. This is a special behaviour function +that the script engine will invoke everytime a new template instance type is generated. The callback +function can then perform necessary validations to verify if the type can be handled, and if not tell +the engine that the instance isn't supported. + +The callback function must be a global function that receives an asIObjectType pointer, and should return +a boolean. If the template instance is valid the return value should be true. + +\code +// Register the template callback +r = engine->RegisterObjectBehaviour("myTemplate", asBEHAVE_TEMPLATE_CALLBACK, "bool f(int &in)", asFUNCTION(myTemplateCallback), asCALL_CDECL); assert( r >= 0 ); +\endcode + +Here's an example callback function: + +\code +bool myTemplateCallback(asIObjectType *ot) +{ + // This template will only support primitive types + int typeId = ot->GetSubTypeId(); + if( typeId & asTYPEID_MASK_OBJECT ) + { + // The script is attempting to instantiate the + // template with an object type, this is not allowed. + return false; + } + + // Primitive types are allowed + return true; +} +\endcode + + + +\section doc_adv_template_2 Template specializations + +When registering a template specialization you override the template instance that AngelScript would normally +do when compiling a declaration with the template type. This allow the application to register a completely +different object with its own implementation for template specializations. Obviously it is recommended that +the template specialization is registered so that to the script writer it is transparent, i.e. try to avoid +having different method names or behaviours for the template type and template specializations. + +With the exception of the type name, a template specialization is registered exactly like a \ref doc_register_type "normal type". + +\code +// Register a template specialization for the float subtype +r = engine->RegisterObjectType("myTemplate", 0, asOBJ_REF); assert( r >= 0 ); + +// Register the factory (there are no hidden parameters for specializations) +r = engine->RegisterObjectBehaviour("myTemplate", asBEHAVE_FACTORY, "myTemplate@ f()", asFUNCTION(myTemplateFloatFactory, (), myTemplateFloat*), asCALL_CDECL); assert( r >= 0 ); +\endcode + + + + + +\section doc_adv_template_3 Current limitations + + - Template types are currently limited to reference types only, i.e. it must be registered + with a factory and addref and release behaviours. + + - Only one template subtype can be used at the moment. + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_timeout.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_timeout.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_timeout.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_timeout.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,101 @@ +/** + +\page doc_adv_timeout Timeout long running scripts + +To prevent long running scripts to freeze the application it may be necessary +to add a way to timeout the execution. This article presents two different +ways to do so. + +\section doc_adv_timeout_1 With the line callback + +The line callback feature can be used to perform some special treatment +during execution of the scripts. The callback is called for every script +statement, which for example makes it possible to verify if the script has +executed for too long time and if so suspend the execution to be resumed at +a later time. + +Before calling the context's \ref asIScriptContext::Execute "Execute" method, +set the callback function like so: + +\code +int ExecuteScriptWithTimeOut(asIScriptContext *ctx) +{ + // Define the timeout as 1 second + DWORD timeOut = timeGetTime() + 1000; + + // Set up the line callback that will timout the script + ctx->SetLineCallback(asFUNCTION(LineCallback), &timeOut, asCALL_CDECL); + + // Execute the script + int status = ctx->Execute(); + + // If the status is asEXECUTION_SUSPENDED the script can + // be resumed by calling this function again. + return status; +} + +// The line callback function is called by the VM for each statement that is executed +void LineCallback(asIScriptContext *ctx, DWORD *timeOut) +{ + // If the time out is reached we suspend the script + if( *timeOut < timeGetTime() ) + ctx->Suspend(); +} +\endcode + +Take a look at the sample \ref doc_samples_events to +see this working. + +\section doc_adv_timeout_2 With a secondary thread + +A second thread can be set up to suspend the execution after the timeout. This thread +can then be put to sleep so that it doesn't impact performance during the execution. +When the thread wakes up it should call the context's \ref asIScriptContext::Suspend "Suspend" method. + +The below shows some possible code for doing this. Note that the code for setting up +the thread is fictive, as this is different for each target OS. + +\code +// The variables that are shared between the threads +asIScriptContext *threadCtx; +int threadId; + +// This function will be executed in the secondary thread +void SuspendThread() +{ + // Put the thread to sleep until the timeout (1 second) + Sleep(1000); + + // When we wake-up we call the context's Suspend method + ctx->Suspend(); +} + +// This function sets up the timeout thread and executes the script +int ExecuteScriptWithTimeOut(asIScriptContext *ctx) +{ + // Set the shared context pointer before creating the thread + threadCtx = ctx; + + // Create the thread that will immediately go to sleep + threadId = CreateThread(SuspendThread); + + // Execute the script + int status = ctx->Execute(); + + // Destroy the secondary thread before releasing the context + DestroyThread(threadId); + + // Clear the global variables + threadId = 0; + threadCtx = 0; + + // If the status is asEXECUTION_SUSPENDED the script can + // be resumed by calling this function again. + + return status; +} +\endcode + +Observe that this way of doing it is safe even if the AngelScript library has been +built without \ref doc_adv_multithread "multithread support". +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_var_type.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_var_type.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_var_type.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_adv_var_type.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,52 @@ +/** + +\page doc_adv_var_type The variable parameter type + + + +The application can register functions that take a reference to a variable +type, which means that the function can receive a reference to a variable of +any type. This is useful when making generic containers. + + +When a function is registered with this special parameter type, the +function will receive both the reference and an extra argument with the type +id of the variable type. The reference refers to the actual value that the +caller sent, i.e. if the expression is an object handle then the reference +will refer to the handle, not the actual object. + +\code +// An example usage with a native function +engine->RegisterGlobalFunction("void func_c(?&in)", asFUNCTION(func_c), asCALL_CDECL); + +void func_c(void *ref, int typeId) +{ + // Do something with the reference + + // The type of the reference is determined through the type id +} + +// An example usage with a generic function +engine->RegisterGlobalFunction("void func_g(?&in)", asFUNCTION(func_g), asCALL_GENERIC); + +void func_g(asIScriptGeneric *gen) +{ + void *ref = gen->GetArgAddress(0); + int typeId = gen->GetArgTypeId(0); + + func_c(ref, typeId); +} +\endcode + +The variable type can also be used with out references, but not +with inout references. Currently it can only be used with global +functions, object constructors, and object methods. It cannot be used with +other behaviours and operators. + +The variable type is not available within scripts, so it can only be used +to register application functions. + +\see \ref doc_addon_any and \ref doc_addon_dict for examples + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_api_functions.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_api_functions.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_api_functions.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_api_functions.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,25 @@ +/** + +\page doc_api_functions Functions + +\section doc_api_funcs_1 Principal functions + + - \ref asCreateScriptEngine + - \ref asGetActiveContext + +\section doc_api_funcs_2 Multithread support + + - \ref asThreadCleanup + +\section doc_api_funcs_3 Custom memory management + + - \ref asSetGlobalMemoryFunctions + - \ref asResetGlobalMemoryFunctions + +\section doc_api_funcs_4 Auxiliary functions + + - \ref asGetLibraryVersion + - \ref asGetLibraryOptions + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_api_interfaces.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_api_interfaces.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_api_interfaces.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_api_interfaces.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,27 @@ +/** + +\page doc_api_interfaces Interfaces + +\section doc_api_intf_1 Principal interfaces + + - \ref asIScriptEngine + - \ref asIScriptModule + - \ref asIScriptContext + +\section doc_api_intf_2 Secondary interfaces + + - \ref asIScriptGeneric + - \ref asIScriptObject + - \ref asIScriptArray + - \ref asIObjectType + - \ref asIScriptFunction + - \ref asIJITCompiler + +\section doc_api_intf_3 Auxiliary interfaces + + - \ref asIBinaryStream + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_as_vs_cpp_types.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_as_vs_cpp_types.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_as_vs_cpp_types.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_as_vs_cpp_types.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,131 @@ +/** + +\page doc_as_vs_cpp_types Datatypes in AngelScript and C++ + + +\section doc_as_vs_cpp_types_1 Primitives + +Primitives in AngelScript have direct matches in C++. + + + + + + + + + + + + + + + +
AngelScriptC++Size (bits)
void void 0
int8 signed char 8
int16 signed short 16
int signed long (*) 32
int64 signed long long 64
uint8 unsigned char 8
uint16unsigned short 16
uint unsigned long (*) 32
uint64unsigned long long64
float float 32
doubledouble 64
bool bool 8 (**)
+ + +%*) If the target CPU is 32 bit, the C++ type long is 32 bit, but on 64 bit CPUs + it is commonly 64 bit, but in AngelScript an int is always 32 bits. + +%**) On 32 bit PowerPC platforms the bool type commonly have the size of 32 bit, + when compiled on such platforms AngelScript also uses 32 bits for the bool type + +\section doc_as_vs_cpp_types_5 Strings + +AngelScript expects the application to register its own \ref doc_strings "string type", +so the string types should match perfectly. + +The char* string type that is so convenient in C++ is however very difficult to use +in a scripted environment where you do not have full control over how it is used. For that +reason it is recommended that you wrap any functions that use the char* string type so +that the string is properly converted to an object that can be safely handled by both +the application and the script engine, e.g. std::string or another class of your preference. + +\section doc_as_vs_cpp_types_2 Arrays + +The AngelScript arrays are not directly matched by C++ arrays. The arrays +are stored in an special object, accessed through the \ref asIScriptArray interface. +Thus you can normally not directly exchange a script with a C++ function expecting +a C++ array, or vice versa. Nor can the application register C++ arrays as properties +and expect AngelScript to be able to understand them. + +It is however possible to override AngelScript's built-in array objects +with application specified objects, on a per array type basis. + +\section doc_as_vs_cpp_types_3 Object handles + +The AngelScript object handles are reference counted pointers to objects. +This means that for object handles to work, the object must have some way of +counting references, for example an AddRef/Release method pair. + +When AngelScript passes an object handle by value to a function it +increases the reference count to count for the argument instance, thus the +function is responsible for releasing the reference once it is finished with +it. In the same manner AngelScript expects any handle returned from a function +to already have the reference accounted for. + +However, when registering functions/methods with AngelScript the +application can tell the library that it should automatically take care of +releasing the handle references once a function return, likewise for returned +handles. This is done by adding a + sign to the \@ type modifier. When doing +this an object handle can be safely passed to a C++ function that expects a +normal pointer, but don't release it afterwards. + +\see \ref doc_obj_handle + +\section doc_as_vs_cpp_types_4 Parameter references + +Because AngelScript needs to guarantee validity of pointers at all times, +it doesn't always pass references to the true object to the function +parameter. Instead it creates a copy of the object, whose reference is passed +to the function, and if the reference is marked to return a value, the clone +is copied back to the original object (if it still exists) once the function +returns. + +Because of this, AngelScript's parameter references are mostly compatible +with C++ references, or pointers, except that the address normally shouldn't be +stored for later use, since the object may be destroyed once the function returns. + +If it is necessary to store the address of the object, then object handles +should be used instead. + + + + + + + + + +
ReferenceDescription
&inA copy of the value is always taken and the +reference to the copy is passed to the function. For script functions this is not +useful, but it is maintained for compatibility with application registered functions.
const &inIf the life time of the value can be +guaranteed to be valid during the execution of the function, the reference to the +true object is passed to the function, otherwise a copy is made.
&outA reference to an unitialized value is passed +to the function. When the function returns the value is copied to the true reference. +The argument expression is evaluated only after the function call. This is the best +way to have functions return multiple values.
const &outUseless as the function wouldn't be able +to modify the value.
&inoutThe true reference is always passed to the +function. If the life time of the value cannot be guaranteed, a compile time error +is generated and the script writer will have to copy the value to a local variable +first. Objects that support object handles are best suitable for this type as they +can always be guaranteed.
const &inoutThe reference cannot be changed by the +function.
+ +If the application wants parameter references that work like they do in C++, +then the engine property asEP_ALLOW_UNSAFE_REFERENCES can be set. When this is done, +the parameter references can be declared without the in, out, +or inout. The parameter references declared without any of the keywords +will always pass the address to the original value, and will not have any restrictions +to the expressions that can be used. The parameter references with the in +and out keywords will still work like before, but the references with the +inout keyword will have the restrictions removed so that they work just +like normal C++ references. + +The application writer and script writer has to be aware that it is possible to +write scripts that access invalid references when the library is compiled in this +mode, just like it is possible to do so in C++. + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_call_script_func.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_call_script_func.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_call_script_func.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_call_script_func.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,192 @@ +/** + +\page doc_call_script_func Calling a script function + + +\section doc_call_script_1 Preparing context and executing the function + +Normally a script function is executed in a few steps: + +
    +
  1. Prepare the context +
  2. Set the function arguments +
  3. Execute the function +
  4. Retrieve the return value +
+ +The code for this might look something like this: + +\code +// Get a script context instance. Usually you'll want to reuse a previously +// created instance to avoid the overhead of allocating the instance with +// each call. +asIScriptContext *ctx = engine->CreateContext(); + +// Obtain the function id from the module. This value should preferrably +// be cached if the same function is called multiple times. +int funcId = engine->GetModule(module_name)->GetFunctionIdByDecl(function_declaration); + +// Prepare() must be called to allow the context to prepare the stack +ctx->Prepare(funcId); + +// Set the function arguments +ctx->SetArgDWord(...); + +int r = ctx->Execute(); +if( r == asEXECUTION_FINISHED ) +{ + // The return value is only valid if the execution finished successfully + asDWORD ret = ctx->GetReturnDWord(); +} + +// Release the context when you're done with it +ctx->Release(); +\endcode + +If your application allow the execution to be suspended, either by using +the callback function or registering a function that allow the script to +manually suspend the execution, then the execution function may return +before finishing with the return code asEXECUTION_SUSPENDED. In that case you +can later resume the execution by simply calling the execution function again. + +Note that the return value retrieved with GetReturnValue() is only valid +if the script function returned successfully, i.e. if Execute() returned +asEXECUTION_FINISHED. + +\section doc_call_script_2 Passing and returning primitives + +When calling script functions that take arguments, the values of these +arguments must be set after the call to Prepare() and before Execute(). +The arguments are set using a group of SetArg methods: + +\code +int SetArgDWord(int arg, asDWORD value); +int SetArgQWord(int arg, asQWORD value); +int SetArgFloat(int arg, float value); +int SetArgDouble(int arg, double value); +\endcode + +arg is the argument number, where the first argument is on 0, the second +on 1, and so on. value is the value of the argument. What method to use is +determined by the type of the parameter. For primitive types you can use any of these. +If the parameter type is a reference to a primitive type it is recommended to use the +SetArgDWord() method and pass the pointer as the value. For non-primitive types the +method SetArgObject() should be used, which will be described in the next section. + +\code +// The context has been prepared for a script +// function with the following signature: +// int function(int, double, int&in) + +// Put the arguments on the context stack, starting with the first one +ctx->SetArgDWord(0, 1); +ctx->SetArgDouble(1, 3.141592); +int val; +ctx->SetArgDWord(2, (asDWORD)&val); +\endcode + +Once the script function has been executed the return value is retrieved in +a similar way using the group of GetReturn methods: + +\code +asDWORD GetReturnDWord(); +asQWORD GetReturnQWord(); +float GetReturnFloat(); +double GetReturnDouble(); +\endcode + +Note that you must make sure the returned value is in fact valid, for +example if the script function was interrupted by a script exception the value +would not be valid. You do this by verifying the return code from Execute() or +GetState(), where the return code should be asEXECUTION_FINISHED. + +\section doc_call_script_3 Passing and returning objects + +Passing registered object types to a script function is done in a similar +way to how primitive types are passed. The function to use is SetArgObject(): + +\code +int SetArgObject(int arg, void *object); +\endcode + +arg is the argument number, just like the other SetArg methods. +object is a pointer to the object you wish to pass. + +This same method is used both for parameters passed by value and for those +passed by reference. The library will automatically make a copy of the object +if the parameter is defined to be passed by value. + +\code +// The complex object we wish to pass to the script function +CObject obj; + +// Pass the object to the function +ctx->SetArgObject(0, &obj); +\endcode + +Getting an object returned by a script function is done in a similar way, using +GetReturnObject(): + +\code +void *GetReturnObject(); +\endcode + +This method will return a pointer to the object returned by the script function. +The library will still hold a reference to the object, which will only be freed as +the context is released. + +\code +// The object where we want to store the return value +CObject obj; + +// Execute the function +int r = ctx->Execute(); +if( r == asEXECUTION_FINISHED ) +{ + // Get a pointer to the returned object and copy it to our object + obj = *(CObject*)ctx->GetReturnObject(); +} +\endcode + +It is important to make a copy of the returned object, or if it is managed by +reference counting add a reference to it. If this is not done the pointer obtained +with GetReturnObject() will be invalidated as the context is released, or reused for +another script function call. + +\section doc_call_script_4 Exception handling + +If the script performs an illegal action, e.g. calling a method on a null handle, then +the script engine will throw a script exception. The virtual machine will then abort +the execution and the \ref asIScriptContext::Execute "Execute" method will return with the value +\ref asEXECUTION_EXCEPTION. + +At this time it is possible to obtain information about the exception through the +\ref asIScriptContext's methods. Example: + +\code +void PrintExceptionInfo(asIScriptContext *ctx) +{ + asIScriptEngine *engine = ctx->GetEngine(); + + // Determine the exception that occurred + printf("desc: %s\n", ctx->GetExceptionString()); + + // Determine the function where the exception occurred + int funcId = ctx->GetExceptionFunction(); + const asIScriptFunction *function = engine->GetFunctionDescriptorById(funcId); + printf("func: %s\n", function->GetDeclaration()); + printf("modl: %s\n", function->GetModuleName()); + printf("sect: %s\n", function->GetScriptSectionName()); + + // Determine the line number where the exception occurred + printf("line: %d\n", ctx->GetExceptionLineNumber()); +} +\endcode + +If desired, it is also possible to \ref asIScriptContext::SetExceptionCallback "register a callback function" +that will be called at the moment the exception occurred, before the \ref asIScriptContext::Execute "Execute" method returns. + +\see \ref doc_debug for information on examining the callstack + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_compile_lib.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_compile_lib.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_compile_lib.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_compile_lib.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,138 @@ +/** + +\page doc_compile_lib Compile the library + +In the sdk/angelscript/projects directory you'll find project files for many of the popular compilers. +However, these project files are not always up to date with the latest version of the library. If you get +any compiler or linker errors please make sure the project file include all the files in the +sdk/angelscript/source directory, and that the project settings are set according to this article. + +If you don't find a project file for your compiler, you can easily create your own project by adding +all the files in the sdk/angelscript/source directory, and configuring the project apropriately. If you +have a new compiler/target that hasn't been used with AngelScript before, you may need to edit the +as_config.h file to make sure the library is compiled properly. + + + + +\section doc_compile_lib_1 Set compile time options + +The code tries to contain compiler differences in as few places as possible. The header as_config.h +was created for that purpose. There you will find some \#defines that allow different compilers +to work. You'll probably not have to change this file, but if you're using a compiler not +previously used and you're getting compiler errors it might be worth it to take a look at +this file. + +There are also a couple of other \#defines used in the code to alter the compilation. When +compiling the library you might want to define ANGELSCRIPT_EXPORT so that library functions +are exported. If you include the library source code directly in your application project you +shouldn't have to define this flag.

+ +If AS_DEPRECATED is defined then some backwards compatibility is maintained, this can help +you do the upgrade to the latest version a little more smoothly. There is no guarantee that +the backwards compatibility will be maintained though so try to remove use of deprecated functions +as soon as possible. + + + +\section doc_compile_lib_2 Linking with the library + +There are four ways of compiling and linking with AngelScript in order to use it. I +recommend linking with a static library. Note that all four ways are interchangable with +only a small change in your code, i.e a defined flag before including the header file, and +possibly a routine for manually loading the dll. The rest of your code should look exactly +the same for each of the alternatives. + + + +\subsection doc_compile_lib_2_1 1. Include library source files in project + +You can take the source files for AngelScript and include them directly in your own +project. The advantage of this is that you can be sure that the same compiler options are +used for the library and the host applications, e.g. multi-threaded or single-threaded CRT. +The disadvantage is that your project will be poluted with the library files. + +The files that need to use the library should include the %angelscript.h header with no +need for any special settings. + +\code +// Include the library interface +#include "angelscript.h" + +// ... Start using the library +\endcode + + + +\subsection doc_compile_lib_2_2 2. Compile a static library and link into project + +The most recommended way is to compile a static library that your project will link with. +When compiling the static library you have to make sure that the correct compiler settings +are used so that you don't get conflicts in linkage with the CRT functions. This happens +if you for example compile the library with dynamically linked multi-threaded CRT and your +application with statically linked single-threaded CRT. (For Visual C++ you'll find these +settings under Project -> Settings -> C/C++ -> Category: Code Generation) + +To use the library you only need to include the %angelscript.h header file. + +\code +// Include the library interface +#include "angelscript.h" + +// ... Start using the library +\endcode + + + +\subsection doc_compile_lib_2_3 3. Compile a dynamically loaded library with an import library + +With Microsoft Visual C++ it is possible to compile a dynamically loaded library with an +import library. The import library will then take care of the work needed to load the dll +and bind the functions. A possible disadvantage of this method is that you are not able to +give any user-friendly error messages in case loading the library fails. + +To use the library you'll have to define ANGELSCRIPT_DLL_LIBRARY_IMPORT before including +the %angelscript.h header file. + +\code +// Include the library interface +#define ANGELSCRIPT_DLL_LIBRARY_IMPORT +#include "angelscript.h" + +// ... Start using the library +\endcode + + + + +\subsection doc_compile_lib_2_4 4. Load the dynamically loaded library manually + +If you want to use a dll, e.g. to share code between applications, I recommend loading the +library manually as you can treat any failures to load or bind functions graciously. + +To use manually loaded dll, you should define ANGELSCRIPT_DLL_MANUAL_IMPORT before including +the %angelscript.h header file. This will insure that the header file doesn't declare the +function prototypes, as you will most likely want to use these names for the function pointers. + +\code +// Include the library interface +#define ANGELSCRIPT_DLL_MANUAL_IMPORT +#include "angelscript.h" + +// Declare the function pointers +typedef asIScriptEngine * AS_CALL t_asCreateScriptEngine(int); +t_asCreateScriptEngine *asCreateScriptEngine = 0; + +// ... Declare the rest of the functions + +// Load the dll and bind the functions (error handling left out for clarity) +HMODULE dll = LoadLibrary("angelscript.dll"); +asCreateScriptEngine = (t_asCreateScriptEngine*)GetProcAddress(dll, "_asCreateScriptEngine"); + +// ... Bind the other functions + +// ... Start using the library +\endcode + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_compile_script.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_compile_script.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_compile_script.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_compile_script.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,112 @@ +/** + +\page doc_compile_script Compiling scripts + +After \ref doc_register_api "registering the application interface" it's time to +compile the scripts that will be executed. + +\section doc_compile_script_msg Message callback + +Before starting the compilation, remember to have the message callback set in the +engine so that you can get more information on compilation errors than just an +error code. In fact, it is recommended to set the message callback right after +creating the script engine, as the message callback may even be helpful while +registering the application interface. + +The message callback has been designed so that it doesn't output anything if there +are no errors or warnings, so when everything is ok, you shouldn't get anything from +it. But if the \ref asIScriptModule::Build "Build" method returns an error, the message +callback will have received detailed information about the error. + +If desired, the application may send its own messages to the callback via the +\ref asIScriptEngine::WriteMessage "WriteMessage" method on the engine. + +\code +// Implement a simple message callback function +void MessageCallback(const asSMessageInfo *msg, void *param) +{ + const char *type = "ERR "; + if( msg->type == asMSGTYPE_WARNING ) + type = "WARN"; + else if( msg->type == asMSGTYPE_INFORMATION ) + type = "INFO"; + printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message); +} + +// Set the message callback when creating the engine +asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); +engine->SetMessageCallback(asFUNCTION(MessageCallback), 0, asCALL_CDECL); +\endcode + +\section doc_compile_script_load Loading and compiling scripts + +To build a script module you first obtain a module from the engine, then add +the script sections, and finally compile them. A compiled script module may be +composed of one or more script sections, so your application may store each +section in different files, or even generate them dynamically. It doesn't matter +in which order the script sections are added to the module, as the compiler +is able to resolve all names regardless of where they are declared in the script. + +\code +// Create a new script module +asIScriptModule *mod = engine->GetModule("module", asGM_ALWAYS_CREATE); + +// Load and add the script sections to the module +string script; +LoadScriptFile("script.as", script); +mod->AddScriptSection("script.as", script.c_str()); + +// Build the module +int r = mod->Build(); +if( r < 0 ) +{ + // The build failed. The message stream will have received + // compiler errors that shows what needs to be fixed +} +\endcode + +AngelScript doesn't provide built-in functions for loading script files as most +applications have their own way of loading files. However, it is quite easy to write +your own routines for loading script files, for example: + +\code +// Load the entire script file into a string buffer +void LoadScriptFile(const char *fileName, string &script) +{ + // Open the file in binary mode + FILE *f = fopen("test.as", "rb"); + + // Determine the size of the file + fseek(f, 0, SEEK_END); + int len = ftell(f); + fseek(f, 0, SEEK_SET); + + // Load the entire file in one call + script.resize(len); + fread(&script[0], len, 1, f); + + fclose(f); +} +\endcode + +As AngelScript doesn't load the files itself, it also doesn't have built-in support +for including other files from within the script. However, if you look in the add-on +directory, you'll find a \ref doc_addon_build "CScriptBuilder" class that provides +this support and more. It is a helper class for loading files, perform a pre-processing pass, +and then building the module. With it the code for building a module looks like this: + +\code +CScriptBuilder builder; +int r = builder.BuildScriptFromFile(engine, "module", "script.as"); +if( r < 0 ) +{ + // The build failed. The message stream will have received + // compiler errors that shows what needs to be fixed +} +\endcode + +\see \ref doc_adv_precompile + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_debug.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_debug.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_debug.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_debug.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,13 @@ +/** + +\page doc_debug Debugging scripts + +\todo Complete this page + + + + + + + +*/ \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_gc.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_gc.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_gc.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_gc.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,37 @@ +/** + +\page doc_gc Garbage collection + +Though AngelScript uses reference counting for memory management, there is still need for a garbage collector to +take care of the few cases where circular referencing between objects prevents the reference counter from reaching zero. +As the application wants to guarantee responsiveness of the application, AngelScript doesn't invoke the garbage collector +automatically. For that reason it is important that the application do this manually at convenient times. + +The garbage collector implemented in AngelScript is incremental, so it can be executed for short periods of time without +requiring the entire application to halt. For this reason, it is recommended that a call to \ref +asIScriptEngine::GarbageCollect "GarbageCollect"(\ref asGC_ONE_STEP) is made at least once during the normal event processing. This will +execute one step in the incremental process, eventually detecting and destroying objects being kept alive due to circular +references. + +This may not be enough for all applications though, as some script may produce more garbage than others. Performing the +garbage collection only one step at a time may not be fast enough to free the old garbage before the new garbage is generated. +For this reason it is recommended that the application monitor the statistics for the garbage collector and adjust the +frequency of the calls as necessary. The statistics is obtained through a call to \ref asIScriptEngine::GetGCStatistics "GetGCStatistics", +which returns the number of objects currently known to the garbage collector as well as the number of objects that have been +destroyed and the number of object that have been detected as garbage with circular references. + +If the scripts produce a lot of garbage but only a low number of garbage in circular references, the application can make a +call to \ref +asIScriptEngine::GarbageCollect "GarbageCollect"(\ref asGC_FULL_CYCLE | \ref asGC_DESTROY_GARBAGE), which will only destroy the known garbage without trying +to detect circular references. This call is relatively fast as the garbage collector only has to make a trivial local check +to determine if an object is garbage without circular references. + +Finally, if the application goes into a state where responsiveness is not so critical, it might be a good idea to do a full +cycle on the garbage collector, thus cleaning up all garbage at once. To do this, call \ref +asIScriptEngine::GarbageCollect "GarbageCollect"(\ref asGC_FULL_CYCLE). + +\see \ref doc_memory + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_gc_object.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_gc_object.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_gc_object.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_gc_object.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,141 @@ +/** + +\page doc_gc_object Garbage collected objects + +Reference counting as memory management has a drawback in that it is +difficult to detect circular references when determining dead objects. +AngelScript allows the application to register types with special behaviours +to support the garbage collection for detecting circular references. These +behaviours make the class a bit more complex, but you should only have to +register them for a few types, e.g. generic container classes. + +\code +// Registering the garbage collected reference type +r = engine->RegisterObjectType("ref", 0, asOBJ_REF | asOBJ_GC); assert( r >= 0 ); +\endcode + +The difference between the garbage collected and non-garbage collected +types is in the addref and release behaviours, the class constructor, and +the extra support behaviours. + +\see The \ref doc_addon_dict "dictionary" add-on for an example of a garbage collected object + +\section doc_reg_gcref_1 GC support behaviours + +The GC determines when objects should be destroyed by counting the +references it can follow for each object. If the GC can see all references +that points to an object, it knows that the object is part of a circular +reference. If all the objects involved in that circular reference have no +outside references it means that they should be destroyed. + +The process of determining the dead objects uses the first for of the +behaviours below, while the destruction of the objects is done by forcing the +release of the object's references. + +\code +void CGCRef::SetGCFlag() +{ + // Set the gc flag as the high bit in the reference counter + refCount |= 0x80000000; +} + +bool CGCRef::GetGCFlag() +{ + // Return the gc flag + return (refCount & 0x80000000) ? true : false; +} + +int CGCRef::GetRefCount() +{ + // Return the reference count, without the gc flag + return (refCount & 0x7FFFFFFF); +} + +void CGCRef::EnumReferences() +{ + // Call the engine::GCEnumCallback for all references to other objects held + engine->GCEnumCallback(myref); +} + +void CGCRef::ReleaseAllReferences() +{ + // When we receive this call, we are as good as dead, but + // the garbage collector will still hold a references to us, so we + // cannot just delete ourself yet. Just free all references to other + // objects that we hold + if( myref ) + { + myref->Release(); + myref = 0; + } +} + +// Register the GC support behaviours +r = engine->RegisterObjectBehaviour("gc", asBEHAVE_SETGCFLAG, "void f()", asMETHOD(CGCRef,SetGCFlag), asCALL_THISCALL); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("gc", asBEHAVE_GETGCFLAG, "bool f()", asMETHOD(CGCRef,GetGCFlag), asCALL_THISCALL); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("gc", asBEHAVE_GETREFCOUNT, "int f()", asMETHOD(CGCRef,GetRefCount), asCALL_THISCALL); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("gc", asBEHAVE_ENUMREFS, "void f(int&in)", asMETHOD(CGCRef,EnumReferences), asCALL_THISCALL); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("gc", asBEHAVE_RELEASEREFS, "void f(int&in)", asMETHOD(CGCRef,ReleaseAllReferences), asCALL_THISCALL); assert( r >= 0 ); +\endcode + +\section doc_reg_gcref_2 Factory for garbage collection + +Whenever a garbage collected class is created, the garbage collector must +be notified of it's existence. The easiest way of doing that is to have the +factory behaviour, or the class constructor call the +NotifyGarbageCollectorOfNewObject() method on the engine when initializing the +class. + +\code +CGCRef *GCRef_Factory() +{ + // Create the object and then notify the GC of its existence + CGCRef *obj = new CGCRef(); + int typeId = engine->GetTypeIdByDecl("gc"); + engine->NotifyGarbageCollectorOfNewObject(obj, typeId); + return obj; +} +\endcode + +You may want to consider caching the typeId, so that it doesn't have to be +looked up through the relatively expensive call to GetTypeIdByDecl every time +an object of this type is created. + +Note, if you create objects of this type from the application side, you +must also notify the garbage collector of its existence, so it's a good idea +to make sure all code use the same way of creating objects of this type. + +\section doc_reg_gcref_3 Addref and release for garbage collection + +For garbage collected objects it is important to make sure the AddRef and +Release behaviours clear the GC flag. Otherwise it is possible that the GC +incorrectly determine that the object should be destroyed. + +\code +void CGCRef::AddRef() +{ + // Clear the gc flag and increase the reference counter + refCount = (refCount&0x7FFFFFFF) + 1; +} + +void CGCRef::Release() +{ + // Clear the gc flag, decrease ref count and delete if it reaches 0 + refCount &= 0x7FFFFFFF; + if( --refCount == 0 ) + delete this; +} + +// Registering the addref/release behaviours +r = engine->RegisterObjectBehaviour("gc", asBEHAVE_ADDREF, "void f()", asMETHOD(CGCRef,AddRef), asCALL_THISCALL); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("gc", asBEHAVE_RELEASE, "void f()", asMETHOD(CGCRef,Release), asCALL_THISCALL); assert( r >= 0 ); +\endcode + + + + + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_generic.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_generic.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_generic.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_generic.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,60 @@ +/** + +\page doc_generic The generic calling convention + +The generic calling convention is available for those situations where the application's native calling +convention doesn't work, for example on platforms where support for native calling conventions haven't +been added yet. You can detect if native calling conventions isn't supported on your target platform by +calling the \ref asGetLibraryOptions function and checking the returned string for "AS_MAX_PORTABILITY". If the +identifier is in the returned string, then native calling conventions is not supported. + +Functions implementing the generic calling conventions are always global functions (or static class methods), +that take as parameter a pointer to an asIScriptGeneric interface and returns void. + +\code +void MyGenericFunction(asIScriptGeneric *gen) +{ + // Code to extract arguments from the generic + // interface and to execute the real function + ... +} +\endcode + +Functions using the generic calling convention can be registered anywhere the script engine is expecting +global functions or class methods (except where explicitly written otherwise). + +Writing the functions for the generic calling convention requires extracting each argument from the AngelScript +stack, and then manually giving the return value back. For that reason it may be a desired to use the +\ref doc_addon_autowrap "automatic wrapper functions" rather than writing the functions yourself. + +\section doc_generic_1 Extracting function arguments + +To extract functions arguments from the generic interface you should call one of the GetArg methods that +will return the value of the argument, or the \ref asIScriptGeneric::GetAddressOfArg "GetAddressOfArg" method. +The GetAddressOfArg method returns a pointer to the actual value. The application should then cast this pointer +to a pointer of the correct type so that the value can be read from the address. + +If the function you're implementing represents a class method, the pointer to the object instance should be obtained +with a call to \ref asIScriptGeneric::GetObject "GetObject". + +Note that the asIScriptGeneric interface is the owner of any references it returns with these calls, so you +should not release these references manually. If you want to store a reference to an object received from the +generic interface, you need to call AddRef on that object to avoid invalidating the reference when the function returns. + +\section doc_generic_2 Returning values + +To return a value from the function one of the SetReturn methods can be called to pass the value to the +generic interface. Returning primitive values is straight forward, but care must be taken when returning object types, +either by value, reference, or as object handle. Depending on the type and the function used it may be necessary to +increment the reference count, or even make a copy of the object first. Carefully read the instructions for +\ref asIScriptGeneric::SetReturnAddress "SetReturnAddress" and \ref asIScriptGeneric::SetReturnObject "SetReturnObject" +to determine what needs to be done to get the expected result. + +It is also possible to use the \ref asIScriptGeneric::GetAddressOfReturnLocation "GetAddressOfReturnLocation" method to +obtain the address of the memory where the return value will be stored. The memory is not initialized, so you should +use the placement new operator to initialize this memory with a call to the constructor. This also works for primitive +types, which makes this ideal for template implementations, such as that in the \ref doc_addon_autowrap "automatic wrapper functions". + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_good_practice.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_good_practice.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_good_practice.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_good_practice.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,42 @@ +/** + +\page doc_good_practice Good practices + + +This article will try to explain some good practices, that will help you get going faster and easier find the solution when a problem occurs. + +\section doc_checkretval Always check return values for registrations + + +When configuring the script engine you should always check the return values, at least in debug mode. +All error codes are negative so a simple assert( r >= 0 ) where r is the returned value is sufficient +to pinpoint where the configuration failed. + + +If a function failed during the configuration, the \ref asIScriptModule::Build "Build" method will always fail with a return code +of \ref asINVALID_CONFIGURATION. Unless you already verified the error codes for all the configuration +calls, it will not be possible to determine what the error was. + +\code +// Verifying the return code with an assert is simple and won't pollute the code +r = engine->RegisterGlobalFunction("void func()", asFUNCTION(func), asCALL_CDECL); assert( r >= 0 ); +\endcode + +assert() can safely be used with engine registrations, since the engine will set the internal state +to invalid configuration if a function fails. Even in release mode the failure is discovered when +a script is built. + +\section doc_usemsgcallbck Use the message callback to receive detailed error messages + +The return code from the register functions, \ref asIScriptModule::Build "Build", and +\ref asIScriptModule::CompileFunction "CompileFunction", can only tell you that something was wrong, +not what it was. To help identify the exact problem the message callback should be used. The script +library will then send messages explaining the error or warning in clear text. + +See \ref doc_compile_script_msg for more information on the message callback. + + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_hello_world.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_hello_world.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_hello_world.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_hello_world.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,115 @@ +/** + +\page doc_hello_world Your first script + +Being an embedded scripting library there isn't much that AngelScript allows the scripts +to do by themselves, so the first thing the application must do is to register the interface +that the script will have to interact with the application. The interface may consist of +functions, variables, and even complete classes. + +\code +// Create the script engine +asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); + +// Set the message callback to receive information on errors in human readable form. +// It's recommended to do this right after the creation of the engine, because if +// some registration fails the engine may send valuable information to the message +// stream. +r = engine->SetMessageCallback(asFUNCTION(MessageCallback), 0, asCALL_CDECL); assert( r >= 0 ); + +// AngelScript doesn't have a built-in string type, as there is no definite standard +// string type for C++ applications. Every developer is free to register it's own string type. +// The SDK do however provide a standard add-on for registering a string type, so it's not +// necessary to implement the registration yourself if you don't want to. +RegisterStdString(engine); + +// Register the function that we want the scripts to call +r = engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL); assert( r >= 0 ); +\endcode + +After the engine has been configured, the next step is to compile the scripts that should be executed. + +The following is our script that will call the registered print function to write Hello world on the +standard output stream. Let's say it's stored in the file test.as. + +
+  void main()
+  {
+    print("Hello world\n");
+  }
+
+ +Here's the code for loading the script file and compiling it. + +\code +// The CScriptBuilder helper is an add-on that loads the file, +// performs a pre-processing pass if necessary, and then tells +// the engine to build a script module. +CScriptBuilder builder; +r = builder.BuildScriptFromFile(engine, "MyModule", "test.as"); +if( r < 0 ) +{ + // An error occurred. Instruct the script writer to fix the + // compilation errors that were listed in the output stream. + printf("Please correct the errors in the script and try again.\n"); + return; +} +\endcode + +The last step is to identify the function that is to be called, and set up a context +for executing it. + +\code +// Find the function that is to be called. +asIScriptModule *mod = engine->GetModule("MyModule"); +int funcId = mod->GetFunctionIdByDecl("void main()"); +if( funcId < 0 ) +{ + // The function couldn't be found. Instruct the script writer + // to include the expected function in the script. + printf("The script must have the function 'void main()'. Please add it and try again.\n"); + return; +} + +// Create our context, prepare it, and then execute +asIScriptContext *ctx = engine->CreateContext(); +ctx->Prepare(funcId); +r = ctx->Execute() +if( r != asEXECUTION_FINISHED ) +{ + // The execution didn't complete as expected. Determine what happened. + if( r == asEXECUTION_EXCEPTION ) + { + // An exception occurred, let the script writer know what happened so it can be corrected. + printf("An exception '%s' occurred. Please correct the code and try again.\n", ctx->GetExceptionString()); + } +} +\endcode + +The exception handling above is very basic. The application may also obtain information about line number, +function, call stack, and even values of local and global variables if wanted. + +Don't forget to clean up after you're done with the engine. + +\code +// Clean up +ctx->Release(); +engine->Release(); +\endcode + +\section doc_hello_world_1 Helper functions + +The print function is implemented as a very simple wrapper on the printf function. + +\code +// Print the script string to the standard output stream +void print(string &msg) +{ + printf("%s", msg.c_str()); +} +\endcode + +\see \ref doc_compile_script_msg, \ref doc_addon_build, and \ref doc_addon_std_string + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_license.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_license.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_license.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_license.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,32 @@ +/** + +\page doc_license License + +\section doc_lic_1 AngelCode Scripting Library +Copyright © 2003-2009 Andreas Jönsson + +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. +
+ + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_main.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_main.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_main.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_main.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,123 @@ +/** + +\mainpage Manual + +\image html aslogo.png + +
\copydetails ANGELSCRIPT_VERSION
+ +\ref doc_overview "AngelScript" is a \ref doc_license "free, open source", flexible, and cross-platform scripting library meant to be +embedded in applications. The purpose is to provide an easy to use library that is powerful, but that isn't weighed +down by a large amount of rarely used features. + +Development of AngelScript begun in February, 2003, with the first public release on March 28th, 2003, with only the most basic +of functionality. Ever since that day the world has seen frequent releases with new features and improvements. The author is still +dedicated to the continued improvement and growth of this library. + +The official site for the library is http://www.angelcode.com/angelscript. + + +\section main_topics Topics + + - \subpage doc_start + - \subpage doc_using + - \subpage doc_script + - \subpage doc_api + - \subpage doc_samples + - \subpage doc_addon + + + + + + + + + +\page doc_start Getting started + + - \subpage doc_overview + - \subpage doc_license + - \subpage doc_compile_lib + - \subpage doc_hello_world + - \subpage doc_good_practice + + + + + + + + +\page doc_using Using AngelScript + + - \subpage doc_understanding_as + - \subpage doc_register_api + - \subpage doc_strings + - \subpage doc_compile_script + - \subpage doc_call_script_func + - \subpage doc_use_script_class + - \subpage doc_gc + - \subpage doc_advanced + + + + + + +\page doc_advanced Advanced topics + + - \subpage doc_debug + - \subpage doc_adv_timeout + - \subpage doc_adv_multithread + - \subpage doc_adv_concurrent + - \subpage doc_adv_coroutine + - \subpage doc_adv_precompile + - \subpage doc_adv_jit + +\todo Add page about dynamic config groups +\todo Add page about custom memory management +\todo Add page about customizations/optimizations +\todo Add page about imports and function binding +\todo Add page about execute string and dynamic compilations + + + + + + +\page doc_script The script language + +This is the reference documentation for the AngelScript scripting language. + + - \subpage doc_global + - \subpage doc_script_statements + - \subpage doc_expressions + - \subpage doc_datatypes + - \subpage doc_script_handle + - \subpage doc_script_class_main + - \subpage doc_operator_precedence + - \subpage doc_reserved_keywords + + +\page doc_script_class_main Script classes + + - \subpage doc_script_class + - \subpage doc_script_class_ops + - \subpage doc_script_class_prop + +\todo Add page on class methods +\todo Add page on constructor and destructors +\todo Add page on inheritance + + + + +\page doc_api The API reference + +This is the reference documentation for the AngelScript application programming interface. + + - \subpage doc_api_functions + - \subpage doc_api_interfaces + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_memory.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_memory.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_memory.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_memory.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,150 @@ +/** + +\page doc_memory Memory management + +This article will explain the memory management in AngelScript in detail. +It's probably more detail than most developers need to know, but some may want +to know exactly how it works in order to evaluate AngelScript better. + + + + +\section doc_memory_1 Overview of the memory management + +AngelScript uses a hybrid method with both reference counting and garbage +collection, where reference counting is the main method and the garbage +collection is only for backup when circular references needs to be resolved. + +This design was chosen because reference counting is the easiest way of +passing objects between script engine and application while still keeping +track of live objects. If pure garbage collection was used, the script engine +would have to know about the entire memory space of the application where +script objects could be stored, otherwise it wouldn't be able to know if the +objects are still alive or not. + +The garbage collector is only used for those object types that have a +possibility of forming a circular reference with itself or other objects, e.g. +objects that have a member variable as a handle to the same type as itself. +Whenever such an object is created, the garbage collector is informed so that +it can keep track of the object. + +The garbage collector is executed manually because the application +will want to control when that extra processing should be done, usually at +idle moments of the application execution. The garbage collector in +AngelScript is also incremental, so that it can be executed in tiny steps +throughout the application execution. + +\see \ref doc_gc + + + + +\section doc_memory_2 Reference counting algorithm + +All built-in script objects are automatically reference counted, and the +application just need to make sure to call the AddRef and Release methods +appropriately if it is storing any references to the objects outside the +script engine. + +Application registered objects may or may not be reference counted. Those +that should be reference counted must implement the ADDREF and RELEASE +behaviours so that AngelScript can notify the objects of the changes to the +reference count. The application needs keep track of the reference counter +itself and free the memory when there are no more references to the object. +This is usually done by having an integer member variable in the object +structure itself to hold the reference count. It can also be implemented with +a separate structure for holding the reference counter, but it adds extra +overhead as the reference counter must be searched for with each change. + +\see \ref doc_register_type + + + + + +\section doc_memory_3 Garbage collector algorithm + +The garbage collector, used to handle the scenarios where reference counting +isn't enough, uses the following algorithm. + +
    + +
  1. Destroy garbage: Free all objects with only one reference. This + reference is held by the GC itself so therefore it is known that nobody + else is referencing the object. + +
  2. Clear counters: Clear the GC counter for the remaining objects. + This counter will be used to count the references to the object reachable + from the GC. At the same time the objects are also flagged, so that we can + detect if the references change while the garbage collector is running. + This flag is automatically cleared when incrementing or decrementing the + reference counter. + +
  3. Count GC references: For each of the objects in the GC, tell it to + increment the GC counter for all objects it holds references to. This is + only done for objects still flagged, because if the flag is no longer set + we know it has been referenced by the application, thus it is considered + live along with all objects it holds references to. + +
  4. Mark live objects: Build a list of all objects in the GC that are + not flagged or that doesn't have the GC count equal to the reference + counter. These are objects that are considered live. For each of the + objects in the list, add all of the references in the object to the list + as well, unless they are already in the list. As the list is traversed it + will grow with new objects, these objects will also have their references + added to the list. This way we're following the chain of references so + we're gathering all objects that are alive. + +
  5. Verify unmarked objects: Make one more pass over the list of + objects in the GC to see if any of the objects that were not marked as + alive has had the flag cleared, if it has then the run the 'mark live + objects' step again. + +
  6. Break circular references: All objects that have not been marked as + alive by this time are involved in unreachable circular references and must be + destroyed. The objects are destroyed by telling the objects to release the + references they hold, thus breaking the circular references. When all + circular references have been broken, the entire GC routine is restarted + which will free the objects. If there were no dead objects, then the GC + is finished. + +
+ +All of the steps, except 'verify unmarked objects' are incremental, i.e. they +can be interrupted to allow the application and scripts to execute before +continuing the garbage collection. Step 1 can also be executed individually +at any time during the cycle, this permits to free up memory for objects that +are not involved in cyclic memory without having to wait for the detection cycle +to complete. + +The application should ideally invoke the garbage collector every once in +a while to make sure too much garbage isn't accumulated over long periods. + +It may also be a good idea to do a complete run of the GC when it doesn't +matter if the application pauses for a little while, for example when in menu +mode. + +The garbage collector can also take care of application registered types +if the application registers the appropriate object behaviours. + +\see \ref doc_gc_object + +\section doc_memory_4 Memory heap + +By default AngelScript uses the memory heap accessed through the standard +malloc and free global functions when allocating memory. Usually this means +that AngelScript shares the memory heap with the application, though if +the AngelScript library is compiled as a DLL or a shared object the heap may +actually be separate from the application heap. + +Some applications need extra control over the memory heap that the standard +C/C++ library doesn't provide. This is common with video games for consoles, +that have limited memory and cannot afford loosing space due to fragmentation +or many small allocations. AngelScript aids these applications as well as it +is possible to register custom memory allocation routines with the library, +giving the application exact control over the memory used by AngelScript. + +\see \ref asSetGlobalMemoryFunctions + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_obj_handle.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_obj_handle.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_obj_handle.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_obj_handle.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,105 @@ +/** + +\page doc_obj_handle Object handles + + +In AngelScript an object handle is a reference counted pointer to an object. In the scripts +they are used to pass the objects around by reference instead of by value. Depending on how +an application type is registered the type will support handles. + +\see \ref doc_register_type, \ref doc_script_handle in the script language + + + + + +\section doc_obj_handle_3 Managing the reference counter in functions + +Whenever the object handle is passed by value from the application to the script engine, +or vice versa its reference should be accounted for. This means that the application must +release any object handles it receives as parameters when it no longer needs them, it also +means that the application must increase the reference counter for any object handle being +returned to the script engine. Note that this is not the same for the \ref doc_generic +"generic calling convention" where AngelScript automatically takes care of most of work. + +A function that creates an object and returns it to the script engine might look like this: + +\code +// Registered as "obj@ CreateObject()" +obj *CreateObject() +{ + // The constructor already initializes the ref count to 1 + return new obj(); +} +\endcode + +A function that receives an object handle from the script and stores it in a global variable might look like this: + +\code +// Registered as "void StoreObject(obj@)" +obj *o = 0; +void StoreObject(obj *newO) +{ + // Release the old object handle + if( o ) o->Release(); + + // Store the new object handle + o = newO; +} +\endcode + +A function that retrieves a previously stored object handle might look like this: + +\code +// Registered as "obj@ RetrieveObject()" +obj *RetrieveObject() +{ + // Increase the reference counter to account for the returned handle + if( o ) o->AddRef(); + + // It is ok to return null if there is no previous handle stored + return o; +} +\endcode + +A function that receives an object handle in the parameter, but doesn't store it looks like this: + +\code +// Registered as "void DoSomething(obj@)" +void DoSomething(obj *o) +{ + // When finished with the object it must be released + if( o ) o->Release(); +} +\endcode + + + + + +\section doc_obj_handle_4 Auto handles can make it easier + +The application can use auto handles (\@+) to alleviate some of the work of managing the reference counter. +When registering the function or method with AngelScript, add a plus sign to the object handles that +AngelScript should automatically manage. For parameters AngelScript will then release the reference after +the function returns, and for the return value AngelScript will increase the reference on the returned +pointer. The reference for the returned value is increased before the parameters are released, so it is +possible to have the function return one of the parameters. + +\code +// Registered as "obj@+ ChooseObj(obj@+, obj@+)" +obj *ChooseObj(obj *a, obj *b) +{ + // Because of the auto handles AngelScript will + // automatically manage the reference counters + return some_condition ? a : b; +} +\endcode + +However, it is not recommended to use this feature unless you can't change the functions you want +to register to properly handle the reference counters. When using the auto handles, AngelScript +needs to process all of the handles which causes an extra overhead when calling application registered functions. + +The auto handles does not affect the behaviour of the handles when the \ref doc_generic "generic calling convention" is used. + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_overview.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_overview.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_overview.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_overview.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,34 @@ +/** + +\page doc_overview Overview + +AngelScript is structured around an \ref asIScriptEngine "engine" where the application should +\ref doc_register_api "register" the \ref doc_register_func "functions", \ref doc_register_prop "properties", and even \ref doc_register_type "types", +that the scripts will be able to use. The scripts are then compiled into \ref asIScriptModule "modules", +where the application may have one or more modules, depending on the need of the application. The application can also expose +a different interface to each module through the use of \ref asIScriptEngine::BeginConfigGroup "configuration groups". +This is especially useful when the application works with multiple types of scripts, e.g. GUI, AI control, etc. + +Each \ref asIScriptModule "module" has it's own scope of script functions, global variables, and classes. These +are normally not shared between modules, even though multiple modules may be built from the same source scripts. +However modules may interact with each others through \ref asIScriptModule::BindImportedFunction "function binding". + +As the scripts are compiled into bytecode AngelScript also provides a virtual machine, also known +as a \ref asIScriptContext "script context", for \ref doc_call_script_func "executing" the bytecode. The application can have any number of +script context at the same time, though most applications will probably only need one. The contexts support +\ref asIScriptContext::Suspend "suspending" the execution and then resuming it, so the application can easily +implement features such as \ref doc_adv_concurrent "concurrent scripts" and \ref doc_adv_coroutine "co-routines". +The script context also provides an interface for extracting run-time information, useful for \ref doc_debug "debugging" scripts. + +The \ref doc_script "script language" is based on the well known syntax of C++ and more modern languages such as Java, C#, and D. +Anyone with some knowledge of those languages, or other script languages with similar syntax, such as Javascript and ActionScript, +should feel right at home with AngelScript. Contrary to most script languages, AngelScript is a strongly typed language, which +permits faster execution of the code and smoother interaction with the host application as there will be less need for runtime +evaluation of the true type of values. + +The \ref doc_memory "memory management" in AngelScript is based on reference counting with an incremental \ref doc_gc "garbage collector" +for detecting and freeing objects with circular references. This provides for a controlled environment without application freezes as the +garbage collector steps in to free up memory. + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_api.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_api.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_api.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_api.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ +/** + +\page doc_register_api Registering the application interface + +AngelScript requires the application developer to register the interface +that the scripts should use to interact with anything outside the script itself. + +It's possible to register \ref doc_register_func "global functions" and +\ref doc_register_prop "global properties" that can be used directly by the +scripts. + +For more complex scripts it may be useful to register new \ref doc_register_type "object types" +to complement the built-in data types. + +AngelScript doesn't have a \ref doc_strings "built-in string type" as there is no de-facto standard for string types +in C++. Instead AngelScript permits the application to register its own preferred string type, and +a \ref asIScriptEngine::RegisterStringFactory "string factory" that the script engine will use +to instanciate the strings. + +\ref asIScriptEngine::RegisterInterface "Class interfaces" can be registered if you want +to guarantee that script classes implement a specific set of class methods. Interfaces can +be easier to use when working with script classes from the application, but they are not +necessary as the application can easily enumerate available methods and properties even +without the interfaces. + +\ref asIScriptEngine::RegisterEnum "enumeration types" and +\ref asIScriptEngine::RegisterTypedef "typedefs" can also be registered to improve readability of the scripts. + +\section doc_register_api_1 Topics + + - \subpage doc_register_func + - \subpage doc_register_prop + - \subpage doc_register_type + - \subpage doc_generic + - \subpage doc_advanced_api + + +\page doc_advanced_api Advanced application interface + + - \subpage doc_gc_object + - \subpage doc_adv_scoped_type + - \subpage doc_adv_single_ref_type + - \subpage doc_adv_class_hierarchy + - \subpage doc_adv_var_type + - \subpage doc_adv_template + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_func.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_func.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_func.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_func.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,149 @@ +/** + +\page doc_register_func Registering a function + +This article aims to explain the way functions are registered with AngelScript, and some of the +differences between C++ and AngelScript that the developer needs to be aware of in order to be +successful in registering the application interface that the scripts will use. The principles +learned here are used in several locations, such as \ref asIScriptEngine::RegisterGlobalFunction +"RegisterGlobalFunction", \ref asIScriptEngine::RegisterObjectMethod "RegisterObjectMethod", \ref +asIScriptEngine::RegisterObjectBehaviour "RegisterObjectBehaviour", etc. + +\section doc_register_func_1 How to get the address of the application function or method + +The macros \ref asFUNCTION, \ref asFUNCTIONPR, \ref asMETHOD, and \ref asMETHODPR +have been implemented to facilitate the task of getting the function pointer and +passing them on to the script engine. + +The asFUNCTION takes the function name as the parameter, which works for all global +functions that do not have any overloads. If you use overloads, i.e. multiple functions +with the same name but with different parameters, then you need to use asFUNCTIONPR instead. +This macro takes as parameter the function name, parameter list, and return type, so that +the C++ compiler can resolve exactly which overloaded function to take the address of. + +\code +// Global function +void globalFunc(); +r = engine->RegisterGlobalFunction("void globalFunc()", asFUNCTION(globalFunc), asCALL_CDECL); assert( r >= 0 ); + +// Overloaded global functions +void globalFunc2(int); +void globalFunc2(float); +r = engine->RegisterGlobalFunction("void globalFunc2(int)", asFUNCTIONPR(globalFunc2, (int), void), asCALL_CDECL); assert( r >= 0 ); +\endcode + +The same goes for asMETHOD and asMETHODPR. The difference between these and asFUNCTION/asFUNCTIONPR +is that the former take the class name as well as parameter. + +\code +class Object +{ + // Class method + void method(); + + // Overloaded method + void method2(int input); + void method2(int input, int &output); +}; + +// Registering the class method +r = engine->RegisterObjectMethod("object", "void method()", asMETHOD(Object,method), asCALL_THISCALL); assert( r >= 0 ); + +// Registering the overloaded methods +r = engine->RegisterObjectMethod("object", "void method2(int)", asMETHODPR(Object, method2, (int), void), asCALL_THISCALL); assert( r >= 0 ); +r = engine->RegisterObjectMethod("object", "void method2(int, int &out)", asMETHODPR(Object, method2, (int, int&), void), asCALL_THISCALL); assert( r >= 0 ); +\endcode + + + + +\section doc_register_func_2 Calling convention + +AngelScript accepts most common calling conventions that C++ uses, i.e. cdecl, stdcall, and thiscall. There is also a +generic calling convention that can be used for example when native calling conventions are not supported on the target platform. + +All functions and behaviours must be registered with the \ref asCALL_CDECL, \ref asCALL_STDCALL, \ref asCALL_THISCALL, or +\ref asCALL_GENERIC flags to tell AngelScript which calling convention the application function uses. The special conventions +\ref asCALL_CDECL_OBJLAST and \ref asCALL_CDECL_OBJFIRST can also be used wherever asCALL_THISCALL is accepted, in order to +simulate a class method through a global function. + +If the incorrect calling convention is given on the registration you'll very likely see the application crash with +a stack corruption whenever the script engine calls the function. cdecl is the default calling convention for all global +functions in C++ programs, so if in doubt try with asCALL_CDECL first. The calling convention only differs from cdecl if the +function is explicitly declared to use a different convention, or if you've set the compiler options to default to another +convention. + +For class methods there is only the thiscall convention, except when the method is static, as those methods are in truth global +functions in the class namespace. Normal methods, virtual methods, and methods for classes with multiple inheritance are all +registered the same way, with asCALL_THISCALL. Classes with \ref doc_register_func_4 "virtual inheritance are not supported natively". + +\see \ref doc_generic + + + +\section doc_register_func_4 Virtual inheritance is not supported + +Registering class methods for classes with virtual inheritance is not supported due to the high complexity involved with them. +Each compiler implements the method pointers for these classes differently, and keeping the code portable would be very difficult. +This is not a great loss though, as classes with virtual inheritance are relatively rare, and it is easy to write simple proxy +functions where the classes to exist. + +\code +class A { void SomeMethodA(); }; +class B : virtual A {}; +class C : virtual A {}; +class D : public B, public C {}; + +// Need a proxy function for registering SomeMethodA for class D +void D_SomeMethodA_proxy(D *d) +{ + // The C++ compiler will resolve the virtual method for us + d->SomeMethodA(); +} + +// Register the global function as if it was a class method, +// but with calling convention asCALL_CDECL_OBJLAST +engine->RegisterObjectMethod("D", "void SomeMethodA()", asFUNCTION(D_SomeMethodA_proxy), asCALL_CDECL_OBJLAST); +\endcode + +If you have a lot of classes with virtual inheritance, you should probably think about writing a template proxy function, so +you don't have to manually write all the proxy functions. + + + + +\section doc_register_func_3 A little on type differences + +AngelScript supports most of the same types that C++ has, but there are differences that you'll need to know when registering +functions, methods, and behaviours. + +All primitive types in C++ have a corresponding type in AngelScript, though sometimes with a slightly different name, i.e. +char in C++ is int8 in AngelScript. You can see a list of all types and their match in respective +language \ref doc_as_vs_cpp_types "here". + +Pointers do not exist in AngelScript in the same way as in C++, so you need to decide on how they should be passed. For this you +have two options, either as reference, or as an \ref doc_obj_handle "object handle". Most common uses of pointers in parameters +can be represented with either references or object handles in AngelScript, for the few uses where it cannot be done a wrapper +function must be written to simplify the function interface to a form that AngelScript can understand. + +Parameter references in AngelScript have an additional restriction over the C++ references, and that is that you must specify +the intended direction of the value that the reference points to, i.e. whether it is an input value, output value, or if the value +is both input and output. This is done by adding the keywords in, out, or inout after the +& character. If no keyword is given AngelScript assumes inout. Value types can only use in and out, +as AngelScript cannot guarantee the safety of the references otherwise. + +Object handles are reference counted pointers to objects, so when using these you need to pay attention to the reference counter, +e.g. whenever you receive an object handle from AngelScript, you must make sure to decrease the reference when you're done with it. +Similarly whenever you pass an object handle to AngelScript you must make sure that reference is accounted for, so that AngelScript +doesn't destroy the object too early. If your application functions are not already prepared to work like this, you can most of the +time tell AngelScript to handle the reference counting for you by using the auto-handles, \@+. + +Strings are a bit complicated as C++ doesn't have one standard way of dealing with them. Because of that AngelScript also doesn't +impose a specific string type on the applications. Instead the application needs to register the string type it wants to use, and +then the string parameters needs to be registered accordingly. AngelScript comes with two standard add-ons for registering string +types, one for std::string, and another for a light wrapper on std::string, which +for the most part is compatible with std::string, except that it is reference counted. + +\see \ref doc_obj_handle, \ref doc_as_vs_cpp_types, \ref doc_addon_std_string, \ref doc_addon_string + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_prop.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_prop.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_prop.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_prop.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,44 @@ +/** + +\page doc_register_prop Registering global properties + +By registering global properties with the script engine you can allow the scripts to +inspect and/or modify variables within the application directly, without the need to +write special functions to do this. + +To register the property, you just need to call the \ref asIScriptEngine::RegisterGlobalProperty +"RegisterGlobalProperty" method, passing the declaration and a pointer to the property. +Remember that the registered property must stay alive as long as its registration is +valid in the engine. + +\code +// Variables that should be accessible through the script. +int g_number = 0; +CObject *g_object = 0; +Vector3 g_vector = {0,0,0}; +bool g_readOnlyFlag = false; + +// A function to register the global properties. +void RegisterProperties(asIScriptEngine *engine) +{ + int r; + + // Register a primitive property that can be read and written to from the script. + r = engine->RegisterGlobalProperty("int g_number", &g_number); assert( r >= 0 ); + + // Register variable where the script can store a handle to a CObject type. + // Assumes that the CObject type has been registered with the engine already as a reference type. + r = engine->RegisterGlobalProperty("CObject @g_object", &g_object); assert( r >= 0 ); + + // Register a 3D vector variable. + // Assumes that the Vector3 type has been registered already as a value type. + r = engine->RegisterGlobalProperty("Vector3 g_vector", &g_vector); assert( r >= 0 ); + + // Register a boolean flag that can be read, but not modified by the script. + r = engine->RegisterGlobalProperty("const bool g_readOnlyFlag", &g_readOnlyFlag); assert( r >= 0 ); +} +\endcode + +\see \ref doc_register_type + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_type.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_type.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_type.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_register_type.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,345 @@ +/** + +\page doc_register_type Registering an object type + + +The are two principal paths to take when registering a new type, either the +type is a reference type that is located in dynamic memory, or the type is a +value type that is located on the stack. Complex types are usually registered +as reference types, while simple types that are meant to be used as primitives +are registered as value types. A reference type support object handles (unless restricted by application), but +cannot be passed by value to application registered functions, a value type +doesn't support handles and can be passed by value to application registered +functions. + + - \subpage doc_reg_basicref + - \subpage doc_register_val_type + - \subpage doc_reg_opbeh + - \subpage doc_reg_objmeth + - \subpage doc_reg_objprop + + + + + + + +\page doc_reg_basicref Registering a reference type + +The basic reference type should be registered with the following behaviours: +\ref asBEHAVE_FACTORY, \ref asBEHAVE_ADDREF, and \ref asBEHAVE_RELEASE. + +\code +// Registering the reference type +r = engine->RegisterObjectType("ref", 0, asOBJ_REF); assert( r >= 0 ); +\endcode + +\see The \ref doc_addon_string "string" add-on for an example of a reference type. + +\see \ref doc_gc_object, \ref doc_adv_class_hierarchy, \ref doc_adv_scoped_type, and \ref doc_adv_single_ref_type for more advanced types. + + +\section doc_reg_basicref_1 Factory function + +The factory function is the one that AngelScript will use to instanciate +objects of this type when a variable is declared. It is responsible for +allocating and initializing the object memory. + +The default factory function doesn't take any parameters and should return +an object handle for the new object. Make sure the object's reference counter +is accounting for the reference being returned by the factory function, so +that the object is properly released when all references to it are removed. + +\code +CRef::CRef() +{ + // Let the constructor initialize the reference counter to 1 + refCount = 1; +} + +CRef *Ref_Factory() +{ + // The class constructor is initializing the reference counter to 1 + return new CRef(); +} + +// Registering the factory behaviour +r = engine->RegisterObjectBehaviour("ref", asBEHAVE_FACTORY, "ref@ f()", asFUNCTION(Ref_Factory), asCALL_CDECL); assert( r >= 0 ); +\endcode + +You may also register factory functions that take parameters, which may +then be used when initializing the object. + +The factory function must be registered as a global function, but can be +implemented as a static class method, common global function, or a global +function following the generic calling convention. + +\section doc_reg_basicref_2 Addref and release behaviours + +\code +void CRef::Addref() +{ + // Increase the reference counter + refCount++; +} + +void CRef::Release() +{ + // Decrease ref count and delete if it reaches 0 + if( --refCount == 0 ) + delete this; +} + +// Registering the addref/release behaviours +r = engine->RegisterObjectBehaviour("ref", asBEHAVE_ADDREF, "void f()", asMETHOD(CRef,AddRef), asCALL_THISCALL); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("ref", asBEHAVE_RELEASE, "void f()", asMETHOD(CRef,Release), asCALL_THISCALL); assert( r >= 0 ); +\endcode + + + + +\section doc_reg_noinst Registering an uninstanciable reference type + +Sometimes it may be useful to register types that cannot be instanciated by +the scripts, yet can be interacted with. You can do this by registering the +type as a normal reference type, but omit the registration of the factory +behaviour. You can later register global properties, or functions that allow the +scripts to access objects created by the application via object handles. + +This would be used when the application has a limited number of objects +available and doesn't want to create new ones. For example singletons, or +pooled objects. + + + + + + + + + + + + +\page doc_register_val_type Registering a value type + +When registering a value type, the size of the type must be given so that AngelScript knows how much space is needed for it. +If the type doesn't require any special treatment, i.e. doesn't contain any pointers or other resource references that must be +maintained, then the type can be registered with the flag \ref asOBJ_POD. In this case AngelScript doesn't require the default +constructor, assignment behaviour, or destructor as it will be able to automatically handle these cases the same way it handles +built-in primitives. + +If you plan on passing the or returning the type by value to registered functions that uses native calling convention, you also +need to inform \ref doc_reg_val_2 "how the type is implemented in the application", but if you only plan on using generic +calling conventions, or don't pass these types by value then you don't need to worry about that. + + + +\code +// Register a primitive type, that doesn't need any special management of the content +r = engine->RegisterObjectType("pod", sizeof(pod), asOBJ_VALUE | asOBJ_POD); assert( r >= 0 ); + +// Register a class that must be properly initialized and uninitialized +r = engine->RegisterObjectType("val", sizeof(val), asOBJ_VALUE); assert( r >= 0 ); +\endcode + +\see The \ref doc_addon_std_string or \ref doc_addon_math3d "vector3" add-on for examples of value types + + +\section doc_reg_val_1 Constructor and destructor + +If a constructor or destructor is needed they shall be registered the following way: + +\code +void Constructor(void *memory) +{ + // Initialize the pre-allocated memory by calling the + // object constructor with the placement-new operator + new(memory) Object(); +} + +void Destructor(void *memory) +{ + // Uninitialize the memory by calling the object destructor + ((Object*)memory)->~Object(); +} + +// Register the behaviours +r = engine->RegisterObjectBehaviour("val", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(Constructor), asCALL_CDECL_OBJLAST); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("val", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(Destructor), asCALL_CDECL_OBJLAST); assert( r >= 0 ); +\endcode + + + + +\section doc_reg_val_2 Value types and native calling conventions + +If the type will be passed to and from the application by value using native calling conventions, it is important to inform +AngelScript of its real type in C++, otherwise AngelScript won't be able to determine exactly how C++ is treating the type in +a parameter or return value. + +There are a few different flags for this: + + + + + + + + +
\ref asOBJ_APP_CLASS   The C++ type is a class, struct, or union
\ref asOBJ_APP_CLASS_CONSTRUCTOR   The C++ type has a defined constructor
\ref asOBJ_APP_CLASS_DESTRUCTOR   The C++ type has a defined destructor
\ref asOBJ_APP_CLASS_ASSIGNMENT   The C++ type has a defined assignment operator
\ref asOBJ_APP_PRIMITIVE   The C++ type is a C++ primitive, but not a float or double
\ref asOBJ_APP_FLOAT   The C++ type is a float or double
+ +Note that these don't represent how the type will behave in the script language, only what the real type is in the host +application. So if you want to register a C++ class that you want to behave as a primitive type in the script language +you should still use the flag \ref asOBJ_APP_CLASS. The same thing for the flags to identify that the class has a constructor, +destructor, or assignment. These flags tell AngelScript that the class has the respective function, but not that the type +in the script language should have these behaviours. + +For class types there are also a shorter form of the flags for each combination of the 4 flags. They are of the form \ref asOBJ_APP_CLASS_CDA, +where the existance of the last letters determine if the constructor, destructor, and/or assignment behaviour are available. For example +\ref asOBJ_APP_CLASS_CDA is defined as \ref asOBJ_APP_CLASS | \ref asOBJ_APP_CLASS_CONSTRUCTOR | \ref asOBJ_APP_CLASS_DESTRUCTOR | \ref asOBJ_APP_CLASS_ASSIGNMENT. + +\code +// Register a complex type that will be passed by value to the application +r = engine->RegisterObjectType("complex", sizeof(complex), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); assert( r >= 0 ); +\endcode + +Make sure you inform these flags correctly, because if you do not you may get various errors when executing the scripts. +Common problems are stack corruptions, and invalid memory accesses. In some cases you may face more silent errors that +may be difficult to detect, e.g. the function is not returning the expected values. + + + + + +\page doc_reg_opbeh Registering operator behaviours + +In order for AngelScript to know how to work with the application registered types, it is +necessary to register some behaviours, for example for memory management. + +The memory management behaviours are described with the registeration of registering +\ref doc_reg_basicref "reference types" and \ref doc_register_val_type "value types". + +Other advanced behaviours are described with the \ref doc_advanced_api "advanced types". + +Only a few operators have special behaviours for them, the other operators are registered as +ordinary \ref doc_script_class_ops "class methods with predefined names". + +\section doc_reg_opbeh_1 Index operator + +The index operator is usually used to access an element by index, e.g. the elements of an array. + +\code +// Simple implementation of the index operator +int &MyClass::operator[] (int index) +{ + return internal_array[index]; +} + +// Non-mutable variant that works on const references to the object +const int &MyClass::operator[] (int index) const +{ + return internal_array[index]; +} + +// Register both the const and non-const alternative for const correctness +r = engine->RegisterObjectBehaviour("mytype", asBEHAVE_INDEX, "int &f(int)", asMETHODPR(MyClass, operator[], (int), int&), asCALL_THISCALL); assert( r >= 0 ); +r = engine->RegisterObjectBehaviour("mytype", asBEHAVE_INDEX, "const int &f(int) const", asMETHODPR(MyClass, operator[], (int) const, const int&), asCALL_THISCALL); assert( r >= 0 ); +\endcode + +\section doc_reg_opbeh_2 Value cast operators + +The value cast operators are used to allow the scripts to convert an object type to another +type by constructing a new value. This is different from a \ref doc_adv_class_hierarchy "reference cast", +that do not construct new values, but rather changes the way it is perceived. + +By registering the behaviour either as \ref asBEHAVE_VALUE_CAST or \ref asBEHAVE_IMPLICIT_VALUE_CAST you +let AngelScript know whether the behaviour may be used to implicitly cast the type or not. + +\code +// Convert a string to an int +int ConvStringToInt(const std::string &s) +{ + return atoi(s.c_str()); +} + +// Register the behaviour +r = engine->RegisterObjectBehaviour("string", asBEHAVE_VALUE_CAST, "int f() const", asFUNCTION(ConvStringToInt), asCALL_CDECL_OBJLAST); assert( r >= 0 ); +\endcode + +The return type for the cast behaviour can be any type except bool and void. The value cast is meant to create a new value, so if the function +returns a reference or an object handle make sure it points to a new value and not the original one. + +The object constructors and factories also serve as alternative explicit value cast operators, so if a constructor or factory is already available +then there is no need to register the explicit value cast operator. + + + + + + + + + + + + + + +\page doc_reg_objmeth Registering object methods + +Class methods are registered with the RegisterObjectMethod call. + +\code +// Register a class method +void MyClass::ClassMethod() +{ + // Do something +} + +r = engine->RegisterObjectMethod("mytype", "void ClassMethod()", asMETHOD(MyClass,ClassMethod), asCALL_THISCALL); assert( r >= 0 ); +\endcode + +It is also possible to register a global function that takes a pointer to +the object as a class method. This can be used to extend the functionality of +a class when accessed via AngelScript, without actually changing the C++ +implementation of the class. + +\code +// Register a global function as an object method +void MyClass_MethodWrapper(MyClass *obj) +{ + // Access the object + obj->DoSomething(); +} + +r = engine->RegisterObjectMethod("mytype", "void MethodWrapper()", asFUNCTION(MyClass_MethodWrapper), asCALL_CDECL_OBJLAST); assert( r >= 0 ); +\endcode + +\page doc_reg_objprop Registering object properties + +Class member variables can be registered so that they can be directly +accessed by the script without the need for any method calls. + +\code +struct MyStruct +{ + int a; +}; + +r = engine->RegisterObjectProperty("mytype", "int a", offsetof(MyStruct,a)); assert( r >= 0 ); +\endcode + +offsetof() is a macro declared in stddef.h header file. + +It is also possible to expose properties through \ref doc_script_class_prop "property accessors", +which are a pair of class methods for getting and setting the property value. This is especially +useful when the offset of the property cannot be determined, or if the type of the property is +not registered in the script and some translation must occur, i.e. from char* to string. + + + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_samples.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_samples.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_samples.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_samples.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,125 @@ +/** + +\page doc_samples Samples + + +This page gives a brief description of the samples that you'll find in the /sdk/samples/ folder. + + - \subpage doc_samples_tutorial + - \subpage doc_samples_concurrent + - \subpage doc_samples_console + - \subpage doc_samples_corout + - \subpage doc_samples_events + - \subpage doc_samples_incl + + + +\page doc_samples_tutorial Tutorial + +Path: /sdk/samples/tutorial/ + +This sample was written with the intention of explaining the basics of +AngelScript, that is, how to configure the engine, load and compile a script, +and finally execute a script function with parameters and return value. + + + - LineCallback() function which aborts execution when the time is up + - Strings + - Registered global functions + - Script function parameters and return value + - Retrieving information about script exceptions + - asIScriptGeneric for when the library doesn't support native calling convention + + + + + + +\page doc_samples_concurrent Concurrent scripts + +Path: /sdk/samples/concurrent/ + +This sample shows how to execute two or more long running scripts +\ref doc_adv_concurrent "concurrently". The scripts voluntarily hand over the control to the next script in +the queue by calling the function sleep(). + + + - \ref doc_addon_ctxmgr + - Multiple scripts running in parallel + - sleep() + - Strings + - Registered global functions + + + + +\page doc_samples_console Console + +Path: /sdk/samples/console/ + +This sample implements a simple interactive console, which lets the user type in +commands and also evaluate simple script statements to manipulate the application. + +The user is also able to define new variables and functions from the command line. +These functions can then be executed to perform automated tasks. + + - \ref doc_addon_helpers "ExecuteString" + - \ref asIScriptModule::CompileFunction "CompileFunction", \ref asIScriptModule::CompileGlobalVar "CompileGlobalVar", \ref asIScriptModule::RemoveFunction "RemoveFunction", \ref asIScriptModule::RemoveGlobalVar "RemoveGlobalVar" + - Enumerate global functions and variables + - \ref doc_addon_string "Strings" + - Registered global functions and properties + - Special function _grab() with overloads to receive and print resulting value from script statements + + + +\page doc_samples_corout Co-routines + +Path: /sdk/samples/coroutine/ + +This sample shows how \ref doc_adv_coroutine "co-routines" can be implemented with AngelScript. Co-routines are +threads that can be created from the scripts, and that work together by voluntarily passing control +to each other by calling yield(). + + - \ref doc_addon_ctxmgr + - Co-routines created from the scripts with variable parameter structure. + - Strings + - Registered global functions + - Handling the variable argument type + - Passing arguments to script functions + + +\page doc_samples_events Events + +Path: /sdk/samples/events/ + +This sample has the script engine execute a long running script. The script execution is regularly +interrupted by the application so that keyboard events can be processed, which execute another short +script before resuming the execution of the main script. The event handling scripts change the state +of the long running script. + + - LineCallback() function which suspends execution when the time is up + - Strings + - Registered global functions + - Scripted event handlers + + + +\page doc_samples_incl Include directive + +Path: /sdk/samples/include/ + +This sample shows how to implement a very simple preprocessor to add support for the \#include +directive, which allow the script writer to reuse common script code. The preprocessor simply adds +the included scripts as multiple script sections, which is ok as AngelScript is able to resolve global +declarations independently of their order. The preprocessor also makes sure that a script file is only +included once, so the script writer doesn't have to take extra care to avoid multiple includes or even +complicated circular includes. + + - \ref doc_addon_build + - LineCallback() functions which aborts execution when the time is up + - Processing the \#include directive + - Circular \#includes are resolved automatically + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,104 @@ +/** + + +\page doc_script_class Script classes + +In AngelScript the script writer may declare script classes. The syntax is +similar to that of C++, except the public, protected, and private keywords are +not available. All the class methods must be declared with their implementation, +like in Java. + +The default constructor and destructor are not needed, unless specific +logic is wanted. AngelScript will take care of the proper initialization of +members upon construction, and releasing members upon destruction, even if not +manually implemented. + +With classes the script writer can declare new data types that hold groups +of variables and methods to manipulate them. The class' properties can be +accessed directly or through \ref doc_script_class_prop "property accessors". +It is also possible to \ref doc_script_class_ops "overload operators" for the classes. + +
+  // The class declaration
+  class MyClass
+  {
+    // The default constructor
+    MyClass()
+    {
+      a = 0;
+    }
+
+    // Destructor
+    ~MyClass()
+    {
+    }
+
+    // Another constructor
+    MyClass(int a)
+    {
+      this.a = a;
+    }
+
+    // A class method
+    void DoSomething()
+    {
+      a *= 2;
+    }
+
+    // A class property
+    int a;
+  }
+
+ +AngelScript supports single inheritance, where a derived class inherits the +properties and methods of its base class. Multiple inheritance is not supported, +but polymorphism is supprted by implementing \ref doc_global_interface "interfaces". + +All the class methods are virtual, so it is not necessary to specify this manually. +When a derived class overrides an implementation, it can extend +the original implementation by specifically calling the base class' method using the +scope resolution operator. When implementing the constructor for a derived class +the constructor for the base class is called using the super keyword. +If none of the base class' constructors is manually called, the compiler will +automatically insert a call to the default constructor in the beginning. The base class' +destructor will always be called after the derived class' destructor, so there is no +need to manually do this. + +
+  // A derived class
+  class MyDerived : MyClass
+  {
+    // The default constructor
+    MyDerived()
+    {
+      // Calling the non-default constructor of the base class
+      super(10);
+      
+      b = 0;
+    }
+    
+    // Overloading a virtual method
+    void DoSomething()
+    {
+      // Call the base class' implementation
+      MyClass::DoSomething();
+      
+      // Do something more
+      b = a;
+    }
+    
+    int b;
+  }
+
+ +Note, that since AngelScript uses \ref doc_memory "automatic memory management", it can be +difficult to know exactly when the destructor is called, so you shouldn't rely +on the destructor being called at a specific moment. AngelScript will also +call the destructor only once, even if the object is resurrected by adding a +reference to it while executing the destructor. + + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class_ops.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class_ops.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class_ops.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class_ops.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,108 @@ +/** + +\page doc_script_class_ops Operator overloads + +It is possible to define what should be done when an operator is +used with a script class. While not necessary in most scripts it can +be useful to improve readability of the code. + +This is called operator overloading, and is done by implementing +specific class methods. The compiler will recognize and use these +methods when it compiles expressions involving the overloaded operators +and the script class. + + +\section doc_script_class_unary_ops Unary operators + + + + + +
opopfunc
- opNeg
~ opCom
+ +When the expression op a is compiled, the compiler will rewrite it as a.opfunc and compile that instead. + + +\section doc_script_class_cmp_ops Comparison operators + + + + + + + + + +
opopfunc
== opEquals
!= opEquals
< opCmp
<= opCmp
> opCmp
>= opCmp
+ +The a == b expression will be rewritten as a.opEquals(b) and b.opEquals(a) and +then the best match will be used. != is treated similarly, except that the result is negated. The +opEquals method must be implemented to return a bool in order to be considered by the compiler. + +The comparison operators are rewritten as a.opCmp(b) op 0 and 0 op b.opCmp(a) +and then the best match is used. The opCmp method must be implemented to return a int in order to be +considered by the compiler. + +If an equality check is made and the opEquals method is not available the compiler looks for the opCmp method +instead. So if the opCmp method is available it is really not necesary to implement the opEquals method, except +for optimization reasons. + + +\section doc_script_class_assign_ops Assignment operators + + + + + + + + + + + + + + + +
opopfunc
= opAssign
+= opAddAssign
-= opSubAssign
*= opMulAssign
/= opDivAssign
\%= opModAssign
&= opAndAssign
|= opOrAssign
^= opXorAssign
<<= opShlAssign
>>= opShrAssign
>>>= opUShrAssign
+ +The assignment expressions a op b are rewritten as a.opfunc(b) and then the +best matching method is used. An assignment operator can for example be implemented like this: + +
+  obj@ opAssign(const obj &in other)
+  {
+    // Do the proper assignment
+    ...
+    
+    // Return a handle to self, so that multiple assignments can be chained
+    return this;
+  }
+
+ +All script classes have a default assignment operator that does a bitwise copy of the content of the class, +so if that is all you want to do, then there is no need to implement this method. + + + +\section doc_script_class_binary_ops Binary operators + + + + + + + + + + + + + + +
opopfuncopfunc_r
+ opAdd opAdd_r
- opSub opSub_r
* opMul opMul_r
/ opDiv opDiv_r
% opMod opMod_r
& opAnd opAnd_r
| opOr opOr_r
^ opXor opXor_r
<< opShl opShl_r
>> opShr opShr_r
>>> opUShr opUShr_r
+ +The expressions with binary operators a op b will be rewritten as a.opfunc(b) +and b.opfunc_r(a) and then the best match will be used. + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class_prop.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class_prop.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class_prop.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_class_prop.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,60 @@ +/** + +\page doc_script_class_prop Property accessors + +Many times when working with class properties it is necessary to make sure specific logic is followed when +accessing them. An example would be to always send a notification when a property is modified, or computing +the value of the property from other properties. By implementing property accessor methods for the properties +this can be implemented by the class itself, making it easier for the one who accesses the properties. + +In AngelScript property accessors are implemented as ordinary class methods with the prefixes get_ and set_. + +
+  // The class declaration with property accessors
+  class MyObj
+  {
+    int get_prop() const
+    {
+      // The actual value of the property could be stored
+      // somewhere else, or even computed at access time
+      return realProp;
+    }
+
+    void set_prop(int val)
+    {
+      // Here we can do extra logic, e.g. make sure 
+      // the value is within the proper range
+      if( val > 1000 ) val = 1000;
+      if( val < 0 ) val = 0;
+
+      realProp = val;
+    }
+
+    // The caller should use the property accessors
+    // 'prop' to access this property
+    int realProp;
+  }
+
+  // An example for how to access the property through the accessors
+  void Func()
+  {
+    MyObj obj;
+
+    // Set the property value just like a normal property.
+    // The compiler will convert this to a call to set_prop(10000).
+    obj.prop = 10000;
+
+    // Get the property value just a like a normal property.
+    // The compiler will convert this to a call to get_prop().
+    assert( obj.prop == 1000 );
+  }
+
+ +When implementing the property accessors you must make sure the return type of the get accessor and the +parameter type of the set accessor match, otherwise the compiler will not know which is the correct type +to use. + +You can also leave out either the get or set accessor. If you leave out the set accessor, then the +property will be read-only. If you leave out the get accessor, then the property will be write-only. + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_datatypes.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_datatypes.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_datatypes.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_datatypes.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,251 @@ +/** + +\page doc_datatypes Data types + +Note that the host application may add types specific to that application, refer to the application's manual for more information. + + - \subpage doc_datatypes_primitives + - \subpage doc_datatypes_arrays + - \subpage doc_datatypes_obj + - \subpage doc_datatypes_strings + +\page doc_datatypes_primitives Primitives + +\section void void + +void is not really a data type, more like lack of data type. It can only be used to tell the compiler that a function doesn't return any data. + + +\section bool bool + +bool is a boolean type with only two +possible values: true or +false. The keywords +true and +false are constants of type +bool that can be used as such in expressions. + + +\section int Integer numbers + + + + + + + + + + + +
typemin valuemax value
int8 -128 127
int16 -32,768 32,767
int -2,147,483,648 2,147,483,647
int64 -9,223,372,036,854,775,808 9,223,372,036,854,775,807
uint8 0 255
uint16 0 65,535
uint 0 4,294,967,295
uint64 018,446,744,073,709,551,615
+ +As the scripting engine has been optimized for 32 bit datatypes, using the smaller variants is only recommended for accessing application specified variables. For local variables it is better to use the 32 bit variant. + +int32 is an alias for int, and uint32 is an alias for uint. + + + + +\section real Real numbers + + + + + +
typerange of valuessmallest positive value maximum digits
float +/- 3.402823466e+38 1.175494351e-38 6
double +/- 1.7976931348623158e+308 2.2250738585072014e-308 15
+ +Rounding errors will occur if more digits than the maximum number of digits are used. + +Curiousity: Real numbers may also have the additional values of positive and negative 0 or +infinite, and NaN (Not-a-Number). For float NaN is represented by the 32 bit data word 0x7fc00000. + + + + + + + + +\page doc_datatypes_arrays Arrays + +It is possible to declare array variables by appending the [] brackets to the type. + +When declaring a variable with a type modifier, the type modifier affects the type of all variables in the list. +Example: + +
+  int[] a, b, c;
+
+ +a, b, and c are now arrays of integers. + +When declaring arrays it is possible to define the initial size of the array by passing the length as a parameter to the constructor. The elements can also be individually initialized by specifying an initialization list. Example: + +
+  int[] a;           // A zero-length array of integers
+  int[] b(3);        // An array of integers with 3 elements
+  int[] c = {,3,4,}; // An array of integers with 4 elements, where
+                     // the second and third elements are initialized
+
+ +Each element in the array is accessed with the indexing operator. The indices are zero based, i.e the range of valid indices are from 0 to length - 1. + +
+  a[0] = some_value;
+
+ +An array also have two methods. length() allow you to determine how many elements are in the array, and resize() lets you resize the array. + + + + +\page doc_datatypes_obj Objects and handles + +\section objects Objects + +There are two forms of objects, reference types and value types. + +Value types behave much like the primitive types, in that they are allocated on the stack and deallocated +when the variable goes out of scope. Only the application can register these types, so you need to check +with the application's documentation for more information about the registered types. + +Reference types are allocated on the memory heap, and may outlive the initial variable that allocates +them if another reference to the instance is kept. All \ref doc_global_class "script declared classes" are reference types. +\ref doc_global_interface "Interfaces" are a special form of reference types, that cannot be instanciated, but can be used to access +the objects that implement the interfaces without knowing exactly what type of object it is. + +
+  obj o;      // An object is instanciated
+  o = obj();  // A temporary instance is created whose 
+              // value is assigned to the variable
+
+ + + +\section handles Object handles + +Object handles are a special type that can be used to hold references to other objects. When calling methods or +accessing properties on a variable that is an object handle you will be accessing the actual object that the +handle references, just as if it was an alias. Note that unless initialized with the handle of an object, the +handle is null. + +
+  obj o;
+  obj@ a;           // a is initialized to null
+  obj@ b = \@o;      // b holds a reference to o
+
+  b.ModifyMe();     // The method modifies the original object
+
+  if( a is null )   // Verify if the object points to an object
+  {
+    \@a = \@b;        // Make a hold a reference to the same object as b
+  }
+
+ +Not all types allow a handle to be taken. Neither of the primitive types can have handles, and there may exist some object types that do not allow handles. Which objects allow handles or not, are up to the application that registers them. + +Object handle and array type modifiers can be combined to form handles to arrays, or arrays of handles, etc. + +\see \ref doc_script_handle + +\page doc_datatypes_strings Strings + +Strings are a special type of data that can be used only if the application +registers support for them. They hold an array of +bytes or 16bit words depending on the application settings. The only limit to how +large this array can be is the memory available on the computer. + +There are two types of string constants supported in the AngelScript +language, the normal double quoted string, and the documentation strings, +called heredoc strings. + +The normal strings are written between double quotation marks (") or single quotation marks (')1. +Inside the constant strings some escape sequences can be used to write exact +byte values that might not be possible to write in your normal editor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sequencevaluedescription
\\0  0null character
\\\\  92back-slash
\\'  39single quotation mark (apostrophe)
\\"  34double quotation mark
\\n  10new line feed
\\r  13carriage return
\\t  9tab character
\\xFFFF 0xFFFFFFFF should be exchanged for a 1 to 4 digit hexadecimal number representing the value wanted. If the application uses 8bit strings then only values up to 255 is accepted.
\\uFFFF 0xFFFFFFFF should be exchanged for the hexadecimal number representing the unicode code point
\\UFFFFFFFF 0xFFFFFFFFFFFFFFFF should be exchanged for the hexadecimal number representing the unicode code point
+ + +
+  string str1 = "This is a string with \"escape sequences\".";
+  string str2 = 'If single quotes are used then double quotes can be included without "escape sequences".';
+
+ + +The heredoc strings are designed for inclusion of large portions of text +without processing of escape sequences. A heredoc string is surrounded by +triple double-quotation marks ("""), and can span multiple lines +of code. If the characters following the start of the string until the first +linebreak only contains white space, it is automatically removed by the +compiler. Likewise if the characters following the last line break until the +end of the string only contains white space this is also remove, including the +linebreak. + + +
+  string str = """
+  This is some text without "escape sequences". This is some text.
+  This is some text. This is some text. This is some text. This is
+  some text. This is some text. This is some text. This is some
+  text. This is some text. This is some text. This is some text.
+  This is some text.
+  """;
+
+ +If more than one string constants are written in sequence with only whitespace or +comments between them the compiler will concatenate them into one constant. + +
+  string str = "First line.\n"
+               "Second line.\n"
+               "Third line.\n";
+
+ +The escape sequences \\u and \\U will add the specified unicode code point as a +UTF-8 or UTF-16 encoded sequence depending on the application settings. Only valid unicode 5.1 +code points are accepted, i.e. code points between U+D800 and U+DFFF (reserved for surrogate pairs) +or above U+10FFFF are not accepted. + +1) The application can change the interpretation of single quoted strings by setting an engine +property. If this is done the first character in the single quoted string will be interpreted as +a single uint value instead of a string literal. + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_expr.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_expr.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_expr.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_expr.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,340 @@ +/** + +\page doc_expressions Expressions + + - \ref assignment + - \ref compound + - \ref function + - \ref conversion + - \ref math + - \ref bits + - \ref logic + - \ref equal + - \ref relation + - \ref identity + - \ref increment + - \ref index + - \ref condition + - \ref member + - \ref handle + - \ref parenthesis + - \ref scope + + +\section assignment Assignments + +
  lvalue = rvalue;
+ +lvalue must be an expression that evaluates to a memory location where the +expression value can be stored, e.g. a variable. An assignment evaluates to +the same value and type of the data stored. The right hand expression is +always computed before the left. + + + + +\section compound Compound assignments + +
+  lvalue += rvalue;
+  lvalue = lvalue + rvalue;
+
+ +A compound assignment is a combination of an operator followed by the assignment. The two expressions +above means practically the same thing. Except that first one is more efficient in that the lvalue is +only evaluated once, which can make a difference if the lvalue is complex expression in itself. + +Available operators: += -= *= /= %= &= |= ^= <<= >>= >>>= + + + +\section function Function call + +
+  func();
+  func(arg);
+  func(arg1, arg2);
+  lvalue = func();
+
+ +Functions are called to perform an action, and possibly return a value that can be used in further operations. +If a function takes more than one argument, the argument expressions are evaluated in the reverse order, i.e. +the last argument is evaluated first. + + + + +\section conversion Type conversions + +
+  // implicitly convert the clss handle to a intf handle
+  intf \@a = \@clss();
+
+  // explicitly convert the intf handle to a clss handle
+  clss \@b = cast<clss>(a);
+
+ +Object handles can be converted to other object handles with the cast operator. +If the cast is valid, i.e. the true object implements the class or interface being +requested, the operator returns a valid handle. If the cast is not valid, the cast +returns a null handle. + +The above is called a reference cast, and only works for types that support object handles. +In this case the handle still refers to the same object, it is just exposed through a +different interface. + +Types that do not support object handles can be converted with a value cast instead. In +this case a new value is constructed, or in case of objects a new instance of the object is +created. + +
+  // implicit value cast
+  int a = 1.0f;
+  
+  // explicit value cast
+  float b = float(a)/2;
+
+ +In most cases an explicit cast is not necessary for primitive types, however, +as the compiler is usually able to do an implicit cast to the correct type. + + + + + + +\section math Math operators + +
+  c = -(a + b);
+
+ + + + + + + + + + +
operatordescriptionleft handright handresult
+ unary positive   NUM NUM
- unary negative   NUM NUM
+ addition NUM NUM NUM
- subtraction NUM NUM NUM
* multiplication NUM NUM NUM
/ division NUM NUM NUM
% modulos NUM NUM NUM
+ +Plus and minus can be used as unary operators as well. NUM can be exchanged +for any numeric type, e.g. int or float. Both terms +of the dual operations will be implicitly converted to have the same type. The +result is always the same type as the original terms. One exception is unary +negative which is not available for uint. + + + + +\section bits Bitwise operators + +
+  c = ~(a | b);
+
+ + + + + + + + + + +
operator description left hand right hand result
~ bitwise complement   NUMNUM
& bitwise and NUMNUMNUM
| bitwise or NUMNUMNUM
^ bitwise xor NUMNUMNUM
<< left shift NUMNUMNUM
>> right shift NUMNUMNUM
>>>arithmetic right shiftNUMNUMNUM
+ + +All except ~ are dual operators. + + + + + +\section logic Logic operators + +
+  if( a and b or not c )
+  {
+    // ... do something
+  }
+
+ + + + + + + +
operator description left hand right hand result
notlogical not   boolbool
andlogical and boolboolbool
or logical or boolboolbool
xorlogical exclusive orboolboolbool
+ +Boolean operators only evaluate necessary terms. For example in expression +a and b, b is only evaluated if a is +true. + +Each of the logic operators can be written as symbols as well, i.e. || +for or, && for and, ^^ for +xor, and ! for not. + + + + + +\section equal Equality comparison operators + +
+  if( a == b )
+  {
+    // ... do something
+  }
+
+ +The operators == and != are used to compare two values to determine if they are equal +or not equal, respectively. The result of this operation is always a boolean value. + + + + + +\section relation Relational comparison operators + +
+  if( a > b )
+  {
+    // ... do something
+  }
+
+ +The operators <, >, <=, and >= are used to compare two +values to determine their relationship. The result is always a boolean value. + + + +\section identity Identity comparison operators + +
+  if( a is null )
+  {
+    // ... do something
+  }
+  else if( a is b )
+  {
+    // ... do something
+  }
+
+ +The operators is and !is are used to compare the identity of two objects, i.e. to determine if +the two are the same object or not. These operators are only valid for reference types as they compare the address of two +objects. The result is always a boolean value. + + + + + + +\section increment Increment operators + +
+  // The following means a = i; i = i + 1;
+  a = i++;
+
+  // The following means i = i - 1; b = i;
+  b = --i;
+
+ +These operators can be placed either before or after an lvalue to +increment/decrement its value either before or after the value +is used in the expression. The value is always incremented or decremented with 1. + + + +\section index Indexing operator + +
+  arr[i] = 1;
+
+ +This operator is used to access an element contained within the object. Depending on the +object type, the expression between the [] needs to be of different types. + + + + +\section condition Conditional expression + +
+  choose ? a : b;
+
+ +If the value of choose is true then the expression returns a +otherwise it will return b. Both a and b must be of the same +type. + + + + + +\section member Member access + +
+  object.property = 1;
+  object.method();
+
+ + +object must be an expression resulting in a data type that have members. property +is the name of a member variable that can be read/set directly. method is the name of a member +method that can be called on the object. + + + +\section handle Handle-of + +
+  // Make handle reference the object instance
+  \@handle = \@object;
+  
+  // Clear the handle and release the object it references
+  \@handle = null;
+
+ + +Object handles are references to an object. More than one handle can reference the same object, and only +when no more handles reference an object is the object destroyed. + +The members of the object that the handle references are accessed the same way through the handle as if +accessed directly through the object variable, i.e. with . operator. + + + +\section parenthesis Parenthesis + +
+  a = c * (a + b);
+  if( (a or b) and c )
+  {
+    // ... do something
+  }
+
+ +Parenthesis are used to group expressions when the \ref doc_operator_precedence "operator precedence" does +not give the desired order of evaluation. + + +\section scope Scope resolution + +
+  int value;
+  void function()
+  {
+    int value;        // local variable overloads the global variable
+    ::∅value = value; // use scope resolution operator to refer to the global variable 
+  } 
+
+ +The scope resolution operator :: can be used to access variables or functions from another scope when +the name is overloaded by a local variable or function. Write the scope name on the left (or blank for the global scope) +and the name of the variable/function on the right. +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_global.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_global.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_global.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_global.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,219 @@ +/** + +\page doc_global Globals + +All global declarations share the same namespace so their names may not +conflict. This includes extended data types and built-in functions registered +by the host application. Also, all declarations are visible to all, e.g. a +function to be called does not have to be declared above the function that calls +it. + +
    +
  • \ref doc_global_function +
  • \ref doc_global_variable +
  • \ref doc_global_class +
  • \ref doc_global_interface +
  • \ref doc_global_import +
  • \ref doc_global_enums +
  • \ref doc_global_typedef +
+ + + + +\section doc_global_function Functions + +Global functions are declared normally, just as in C/C++. The function body must be defined, +i.e. it is not possible to declare prototypes, nor is it necessary as the compiler can resolve +the function names anyway. + +For parameters sent by reference, i.e. with the & modifier it is necessary to +specify in which direction the value is passed, in, out, or inout, e.g. &out. If no keyword +is used, the compiler assumes the inout modifier. For parameters marked with in, the value is +passed in to the function, and for parameters marked with out the value is returned from the function. + +Parameters can also be declared as const which prohibits the alteration of their value. It is +good practice to declare variables that will not be changed as const, +because it makes for more readable code and the compiler is also able to take advantage +of it some times. Especially for const &in the compiler is many times able to avoid a copy of the value. + +Note that although functions that return types by references can't be +declared by scripts you may still see functions like these if the host +application defines them. In that case the returned value may also +be used as the target in assignments. + +
+  int MyFunction(int a, int b)
+  {
+    return a + b;
+  }
+
+ + + + + +\section doc_global_variable Variables + +Global variables may be declared in the scripts, which will then be shared between +all contexts accessing the script module. + +The global variables may be initialized by simple expressions that do not require +any functions to be called, i.e. the value can be evaluated at compile time. + +Variables declared globally like this are accessible from all functions. The +value of the variables are initialized at compile time and any changes are +maintained between calls. If a global variable holds a memory resource, e.g. +a string, its memory is released when the module is discarded or the script engine is reset. + +
+  int MyValue = 0;
+  const uint Flag1 = 0x01;
+
+ +Variables of primitive types are initialized before variables of non-primitive types. +This allows class constructors to access other global variables already with their +correct initial value. The exception is if the other global variable also is of a +non-primitive type, in which case there is no guarantee which variable is initialized +first, which may lead to null-pointer exceptions being thrown during initialization. + + + + + + +\section doc_global_class Classes + +In AngelScript the script writer may declare script classes. The syntax is +similar to that of C++ or Java. + +With classes the script writer can declare new data types that hold groups +of variables and methods to manipulate them. The classes also supports inheritance +and polymorphism through \ref doc_global_interface "interfaces". + +
+  // The class declaration
+  class MyClass
+  {
+    // The default constructor
+    MyClass()
+    {
+      a = 0;
+    }
+
+    // A class method
+    void DoSomething()
+    {
+      a *= 2;
+    }
+
+    // A class property
+    int a;
+  }
+
+ +\see \ref doc_script_class + + + + + +\section doc_global_interface Interfaces + +An interface works like a contract, the classes that implements an interface +are guaranteed to implement the methods declared in the interface. This allows +for the use of polymorphism in that a function can specify that it wants an +object handle to an object that implements a certain interface. The function +can then call the methods on this interface without having to know the +exact type of the object that it is working with. + +
+  // The interface declaration
+  interface MyInterface
+  {
+    void DoSomething();
+  }
+
+  // A class that implements the interface MyInterface
+  class MyClass : MyInterface
+  {
+    void DoSomething()
+    {
+      // Do something
+    }
+  }
+
+ +A class can implement multiple interfaces; Simply list all the interfaces +separated by a comma. + + + + + +\section doc_global_import Imports + +Sometimes it may be useful to load script modules dynamically without having to recompile +the main script, but still let the modules interact with each other. In that case the script +may import functions from another module. This declaration is written using the import +keyword, followed by the function signature, and then specifying which module to import from. + +This allows the script to be compiled using these imported functions, without them actually +being available at compile time. The application can then bind the functions at a later time, +and even unbind them again. + +If a script is calling an imported function that has not yet been bound the script will be +aborted with a script exception. + +
+  import void MyFunction(int a, int b) from "Another module";
+
+ + + + + +\section doc_global_enums Enums + +Enums are a convenient way of registering a family of integer constants that may be used throughout the script +as named literals instead of numeric constants. Using enums often help improve the readability of the code, as +the named literal normally explains what the intention is without the reader having to look up what a numeric value +means in the manual. + +Even though enums list the valid values, you cannot rely on a variable of the enum type to only contain values +from the declared list. Always have a default action in case the variable holds an unexpected value. + +The enum values are declared by listing them in an enum statement. Unless a specific value is given for an enum +constant it will take the value of the previous constant + 1. The first constant will receive the value 0, +unless otherwise specified. + +
+  enum MyEnum
+  {
+    eValue0,
+    eValue2 = 2,
+    eValue3,
+    eValue200 = eValue2 * 100
+  }
+
+ + + + + + +\section doc_global_typedef Typedefs + +Typedefs are used to define aliases for other types. + +Currently a typedef can only be used to define an alias for primitive types, but a future version will have +more complete support for all kinds of types. + +
+  typedef float  real32;
+  typedef double real64;
+
+ + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_handle.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_handle.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_handle.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_handle.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,131 @@ +/** + +\page doc_script_handle Object handles + + +An object handle is a type that can hold a reference to an object. With +object handles it is possible to declare more than one variables that refer +to the same physical object. + +Not all types allow object handles to be used. None of the primitive +data types, bool, int, float, etc, can have object handles. Object types +registered by the application may or may not allow object handles, depending +on how they have been registered. + +\section doc_script_handle_1 General usage + +An object handle is declared by appending the @ symbol to the data type. + +
+  object\@ obj_h;
+
+ +This code declares the object handle obj and initializes it to null, i.e. +it doesn't hold a reference to any object. + +In expressions variables declared as object handles are used the exact +same way as normal objects. But you should be aware that object handles are +not guaranteed to actually reference an object, and if you try to access the +contents of an object in a handle that is null an exception will be raised. + +
+  object obj;
+  object\@ obj_h;
+  obj.Method();
+  obj_h.Method();
+
+ +Operators like = or any other operator registered for the object type work +on the actual object that the handle references. These will also throw an +exception if the handle is empty. + +
+  object obj;
+  object\@ obj_h;
+  obj_h = obj;
+
+ +When you need to make an operation on the actual handle, you should prepend +the expression with the \@ symbol. Setting the object handle to point to an +object is for example done like this: + +
+  object obj;
+  object\@ obj_h;
+  \@obj_h = \@obj;
+
+ +An object handle can be compared against another object handle +(of the same type) to verify if they are pointing to the same object or not. +It can also be compared against null, which is a special keyword that +represents an empty handle. This is done using the identity operator, is. + +
+  object\@ obj_a, obj_b;
+  if( obj_a is obj_b ) {}
+  if( obj_a !is null ) {}
+
+ +\section doc_script_handle_2 Object life times + +An object's life time is normally for the duration of the scope the +variable was declared in. But if a handle outside the scope is set to +reference the object, the object will live on until all object handles are +released. + +
+  object\@ obj_h;
+  {
+    object obj;
+    \@obj_h = \@obj;
+
+    // The object would normally die when the block ends,
+    // but the handle is still holding a reference to it
+  }
+
+  // The object still lives on in obj_h ...
+  obj_h.Method();
+
+  // ... until the reference is explicitly released
+  // or the object handle goes out of scope
+  \@obj_h = null;
+
+ +\section doc_script_handle_3 Object relations and polymorphing + +Object handles can be used to write common code for related types, by means of +inheritance or interfaces. This allows a handle to an interface to store references +to all object types that implement that interface, similarly a handle to a base +class can store references to all object types that derive from that class. + +
+  interface I {}
+  class A : I {}
+  class B : I {}
+
+  // Store reference in handle to interface 
+  I \@i1 = A();  
+  I \@i2 = B();  
+  
+  void function(I \@i)
+  { 
+    // Functions implemented by the interface can be  
+    // called directly on the interface handle. But if
+    // special treatment is need for a specific type, a 
+    // cast can be used to get a handle to the true type.
+    A \@a = cast(i);
+    if( a !is null )
+    {
+      // Access A's members directly
+      ...
+    }
+    else
+    { 
+      // The object referenced by i is not of type A
+      ...
+    }
+  }
+
+ + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_precedence.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_precedence.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_precedence.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_precedence.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,110 @@ +/** + +\page doc_operator_precedence Operator precedence + +In expressions, the operator with the highest precedence is always computed first. + +\section unary Unary operators + +Unary operators have the higher precedence than other operators, and between unary operators the operator closest to the actual value has the highest precedence. Post-operators have higher precedence than pre-operators. + +This list shows the available unary operators. + + + +
+:: + +scope resolution operator +
+[] + +indexing operator +
+++ -- + +post increment and decrement +
+. + +member access +
+++ -- + +pre increment and decrement +
+not ! + +logical not +
++ - + +unary positive and negative +
+~ + +bitwise complement +
+@ + +handle of +
+ +\section binary Binary and ternary operators + +This list shows the dual and ternary operator precedence in decreasing order. + + + +
+* / % + +multiply, divide, and modulo +
++ - + +add and subtract +
+<< >> >>> + +left shift, right shift, and arithmetic right shift +
+& + +bitwise and +
+^ + +bitwise xor +
+| + +bitwise or +
+<= < >= > + +comparison +
+== != is !is xor ^^ + +equality, identity, and logical exclusive or +
+and && + +logical and +
+or || + +logical or +
+?: + +condition +
+= += -= *= /= %= &=
+|= ^= <<= >>= >>>=
+
+assignment and compound assignments +
+ +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_reserved.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_reserved.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_reserved.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_reserved.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,154 @@ +/** + +\page doc_reserved_keywords Reserved keywords and tokens + +These are the keywords that are reserved by the language, i.e. they can't +be used by any script defined identifiers. Remember that the host application +may reserve additional keywords that are specific to that application. + + + + + + + + + +
+and
+bool
+break
+case
+cast
+class
+const
+continue
+default
+do
+
+double
+else
+enum
+false
+float
+for
+from*
+if
+import
+in
+
+inout
+int
+interface
+int8
+int16
+int32
+int64
+is
+not
+null
+
+or
+out
+return
+super*
+switch
+this*
+true
+typedef
+uint
+uint8
+
+uint16
+uint32
+uint64
+void
+while
+xor
+
+ +%* Not really a reserved keyword, but is recognized by the compiler as a built-in keyword. + +These are the non-alphabetical tokens that are also used in the language syntax. + + + + + +
+%*
+/
+%
++
+-
+<=
+<
+>=
+>
+(
+
+)
+==
+!=
+?
+:
+=
++=
+-=
+*=
+/=
+
+%=
+++
+--
+&
+,
+{
+}
+;
+|
+^
+
+~
+<<
+>>
+>>>
+&=
+|=
+^=
+<<=
+>>=
+>>>=
+
+.
+&&
+||
+!
+[
+]
+^^
+@
+!is
+::
+
+ +Other than the above tokens there are also numerical, string, identifier, and comment tokens. + +
+123456789
+123.123e123
+123.123e123f
+0x1234FEDC
+'abc'
+"abc"
+"""heredoc"""
+_Abc123
+//
+/*
+*/
+
+ +The characters space (32), tab (9), carriage return (13), line feed (10), and the +UTF8 byte-order-mark (U+FEFF) are all recognized as whitespace. + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_statement.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_statement.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_statement.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_script_statement.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,249 @@ +/** + +\page doc_script_statements Statements + + - \ref variable + - \ref expression + - \ref if + - \ref while + - \ref break + - \ref return + - \ref block + + + + + + +\section variable Variable declarations + +
+  int var = 0, var2 = 10;
+  object\@ handle, handle2;
+  const float pi = 3.141592f;
+
+ +Variables must be declared before they are used within the statement block, +or any sub blocks. When the code exits the statement block where the variable +was declared the variable is no longer valid. + +A variable can be declared with or without an initial expression. If it +is declared with an initial expression it, the expression must have the evaluate +to a type compatible with the variable type. + +Any number of variables can be declared on the same line separated with commas, where +all variables then get the same type. + +Variables can be declared as const. In these cases the value of the +variable cannot be changed after initialization. + +Variables of primitive types that are declared without an initial value, will have +a random value. Variables of complex types, such as handles and object are initialized +with a default value. For handles this is null, for objects this is +what is defined by the object's default constructor. + + + + + +\section expression Expression statement + +
+  a = b;  // a variable assignment
+  func(); // a function call
+
+ +Any \ref doc_expressions "expression" may be placed alone on a line as a statement. This will +normally be used for variable assignments or function calls that don't return any value of importance. + +All expression statements must end with a ;. + + + + + + + +\section if Conditions: if / if-else / switch-case + +
+  if( condition ) 
+  {
+    // Do something if condition is true
+  }
+
+  if( value < 10 ) 
+  {
+    // Do something if value is less than 10
+  }
+  else
+  {
+    // Do something else if value is greater than or equal to 10
+  }
+
+ +If statements are used to decide whether to execute a part of the logic +or not depending on a certain condition. The conditional expression must +always evaluate to true or false. + +It's possible to chain several if-else statements, in which case +each condition will be evaluated sequencially until one is found to be true. + +
+  switch( value )
+  {
+  case 0:
+    // Do something if value equals 0, then leave
+    break;
+
+  case 2:
+  case constant_value:
+    // This will be executed if value equals 2 or the constant_value
+    break;
+
+  default:
+    // This will be executed if value doesn't equal any of the cases
+  }
+
+ +If you have an integer (signed or unsigned) expression that have many +different outcomes that should lead to different code, a switch case is often +the best choice for implementing the condition. It is much faster than a +series of ifs, especially if all of the case values are close in numbers. + +Each case should be terminated with a break statement unless you want the +code to continue with the next case. + +The case value can be a constant variable that was initialized with a constant +expression. If the constant variable was initialized with an expression that +cannot be determined at compile time it cannot be used in the case values. + + + + +\section while Loops: while / do-while / for + +
+  // Loop, where the condition is checked before the logic is executed
+  int i = 0;
+  while( i < 10 )
+  {
+    // Do something
+    i++;
+  }
+
+  // Loop, where the logic is executed before the condition is checked
+  int j = 0;
+  do 
+  {
+    // Do something
+    j++;
+  } while( j < 10 );
+
+ +For both while and do-while the expression that determines +if the loop should continue must evaluate to either true or false. If it evaluates +to true, the loop continues, otherwise it stops and the code will continue with the next +statement immediately following the loop. + +
+  // More compact loop, where condituion is checked before the logic is executed
+  for( int n = 0; n < 10; n++ ) 
+  {
+    // Do something
+  }
+
+ +The for loop is a more compact form of a while loop. The +first part of the statement (until the first ;) is executed only once, +before the loop starts. Here it is possible to declare a variable that will be visible +only within the loop statement. The second part is the condition that must be satisfied +for the loop to be executed. A blank expression here will always evaluate to true. The last +part is executed after the logic within the loop, e.g. used to increment an iteration variable. + + + + + + + +\section break Loop control: break / continue + +
+  for(;;) // endless loop
+  {
+    // Do something 
+
+    // End the loop when condition is true
+    if( condition )
+      break;
+  }
+
+ +break terminates the smallest enclosing loop statement or switch statement. + +
+  for(int n = 0; n < 10; n++ )
+  {
+    if( n == 5 )
+      continue;
+
+    // Do something for all values from 0 to 9, except for the value 5
+  }
+
+ +continue jumps to the next iteration of the smallest enclosing loop statement. + + + + + +\section return Return statement + +
+  float valueOfPI()
+  {
+    return 3.141592f; // return a value 
+  }
+
+ +Any function with a return type other than void must be finished with a +return statement where expression evaluates to the same +data type as the function return type. Functions declared as void can have +return statements without any expression to terminate early. + + + + + + + + +\section block Statement blocks + +
+  {
+    int a; 
+    float b;
+
+    {
+      float a; // Override the declaration of the outer variable
+               // but only within the scope of this block.
+
+      // variables from outer blocks are still visible
+      b = a;
+    }
+  
+    // a now refers to the integer variable again
+  }
+
+ +A statement block is a collection of statements. Each statement block has its own scope of +visibility, so variables declared within a statement block are not visible outside the block. + + + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_strings.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_strings.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_strings.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_strings.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,75 @@ +/** + +\page doc_strings The string type + +Almost all applications have some need to manipulate text strings in one way or another. However +most applications have very different needs, and also different ways of representing their string +types. For that reason, AngelScript doesn't come with its own built-in string type that the application +would be forced to adapt to, instead AngelScript allows the application to \ref doc_register_api "register its own string type". + +This article presents the options for customizing the script language to the application's needs with regards +to strings. If you do not want, or do not need to have AngelScript use your own string type, then I suggest +you use one of the standard string add-ons, either the \ref doc_addon_std_string "std::string registration", or the \ref +doc_addon_string "reference counted string type". + +\section doc_strings_1 Unicode vs ASCII + +Is you're application using Unicode or plain ASCII for the text? If you use Unicode, then you'll want to encode the scripts +in UTF-8, which the AngelScript compiler supports natively. By default AngelScript expects the scripts to have been encoded +in UTF-8, but should you prefer ASCII you can turn this off by setting the engine property \ref asEP_SCRIPT_SCANNER to 0 right +after creating the engine. + +\code +// Set engine to use ASCII scanner for script code +engine->SetEngineProperty(asEP_SCRIPT_SCANNER, 0); +\endcode + +If you do use Unicode, then you'll also want to choose the desired encoding for the string literals, either UTF-8 or UTF-16. By +default the string literals in AngelScript are encoded with UTF-8, but if you're application is better prepared for UTF-16 then +you'll want to change this by setting the engine property \ref asEP_STRING_ENCODING to 1 before compiling your scripts. + +\code +// Set engine to use UTF-16 encoding for string literals +engine->SetEngineProperty(asEP_STRING_ENCODING, 1); +\endcode + +Observe that the \ref asIScriptEngine::RegisterStringFactory "string factory" called by the engine to create new strings gives the +size of the string data in bytes even for UTF-16 encoded strings, so you'll need to divide the size by two to get the number of +characters in the string. + +\section doc_string_2 Multiline string literals + +There is also a couple of options that affect the script language itself a bit. If you like the convenience of allowing string +literals to span multiple lines of code, then you can turn this on by setting the engine property \ref asEP_ALLOW_MULTILINE_STRINGS +to true. Without this the compiler will give an error if it encounters a line break before the end of the string. + +\code +// Set engine to allow string literals with line breaks +engine->SetEngineProperty(asEP_ALLOW_MULTILINE_STRINGS, true); +\endcode + +Observe that the line ending encoding of the source file will not be modified by the script compiler, so depending on how the file +has been saved, you may get strings using different line endings. + +The \ref doc_datatypes_strings "heredoc strings" are not affected by this setting, as they are designed to support multiline text sections. + +\section doc_string_3 Character literals + +By default AngelScript doesn't have character literals as C and C++ does. A string literal can be written with double quotes or single +quotes and still have the same meaning. This makes it convenient to embed scripts in XML files or C/C++ source files where double +quotes would otherwise end the script code. + +If you want to have single quoted literals mean a single character literal instead of a string, then you can do so by setting the +engine property \ref asEP_USE_CHARACTER_LITERALS to true. The compiler will then convert single quoted literals to an integer number +representing the first character. + +\code +// Set engine to use character literals +engine->SetEngineProperty(asEP_USE_CHARACTER_LITERALS, true); +\endcode + +Observe that the \ref asEP_SCRIPT_SCANNER property has great importance in this case, as an ASCII character can only represent values +between 0 and 255, whereas a Unicode character can represent values between 0 and 1,114,111. + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_understanding_as.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_understanding_as.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_understanding_as.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_understanding_as.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,23 @@ +/** + +\page doc_understanding_as Understanding AngelScript + +In order to successfully use AngelScript it is important to +understand some differences between AngelScript and C++. While +the library has been written so that it can be embedded within +the application with as little change to the application functions +and classes as possible, there are some care that must be taken +when passing objects between AngelScript and C++. + +\section doc_understading_as_1 Topics + + - \subpage doc_as_vs_cpp_types + - \subpage doc_obj_handle + - \subpage doc_memory + + + + + + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_using_script_class.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_using_script_class.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_using_script_class.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/doc_using_script_class.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,65 @@ +/** + +\page doc_use_script_class Using script classes + +When there are multiple objects controlled by the same script implementation it may be favourable to use script classes, +rather than global script functions. Using script classes each instance can have it's own set of variables within the +class, contrary to the global functions that needs to rely on global variables to store persistent information. + +Of course, it would be possible to duplicate the script modules, so that there is one module for each object instance, but +that would be impose a rather big overhead for the application. Script classes don't have that overhead, as all instances +share the same module, and thus the same bytecode and function ids, etc. + +\section doc_use_script_class_1 Instanciating the script class + +Before instanciating the script class you need to know which class to instanciate. Exactly how this is done +depends on the application, but here are some suggestions. + +If the application knows the name of the class, either hardcoded or from some configuration, the class type +can easily be obtained by calling the module's \ref asIScriptModule::GetTypeIdByDecl "GetTypeIdByDecl" with the name +of the class. The application can also choose to identify the class through some properties of the class, e.g. +if the class implements a predefined \ref asIScriptEngine::RegisterInterface "interface". Then the application +can enumerate the class types implemented in the script with \ref asIScriptModule::GetObjectTypeByIndex "GetObjectTypeByIndex" +and then examine the type through the \ref asIObjectType interface. + +A third option, if you're using the \ref doc_addon_build "script builder add-on", is to use the metadata to identify +the class. If you choose this option, use the \ref asIScriptModule to enumerate the declared types and then query the +\ref doc_addon_build "CScriptBuilder" for their metadata. + +Once the object type is known you create the instance by calling the class' factory function, passing it the necessary +arguments, e.g. a pointer to the application object which the script class should be bound to. The factory function id +is found by querying the \ref asIObjectType. + +\code +// Get the object type +asIScriptModule *module = engine->GetModule("MyModule"); +asIObjectType *type = engine->GetObjectTypeById(module->GetTypeIdByDecl("MyClass")); + +// Get the factory function id from the object type +int factoryId = type->GetFactoryIdByDecl("MyClass @MyClass(int)"); +\endcode + +The factory function is \ref doc_call_script_func "called as a regular global function" and returns a handle to +the newly instanciated class. + +\section doc_use_script_class_2 Calling a method on the script class + +Calling the methods of the script classes are similar to \ref doc_call_script_func "calling global functions" except +that you obtain the function id from the \ref asIObjectType, and you must set the object pointer along with the +rest of the function arguments. + +\code +// Obtain the id of the class method +int funcId = type->GetMethodIdByDecl("void method()"); + +// Prepare the context for calling the method +ctx->Prepare(funcId); + +// Set the object pointer +ctx->SetObject(obj); + +// Execute the call +ctx->Execute(); +\endcode + +*/ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/logo/aslogo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/logo/aslogo.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/logo/aslogo.svg kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/logo/aslogo.svg --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/logo/aslogo.svg 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/doxygen/source/logo/aslogo.svg 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,76 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/index.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/index.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/index.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/index.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,120 @@ + + +Documentation + + + + + + + + +

AngelCode Scripting Library

+ +

+Application Writer's Manual
+This is the reference manual for the library interface.

+ +

+AngelScript Change Log versions 2.x
+AngelScript Change Log versions 1.x
+AngelScript Change Log versions 0.x
+The complete change log for the library. +

+ + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/angelscript_8h.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/angelscript_8h.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/angelscript_8h.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/angelscript_8h.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2087 @@ + + +AngelScript: angelscript.h File Reference + + + + +
+

angelscript.h File Reference

The API definition for AngelScript. +More... +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Classes

struct  asSFuncPtr
 Represents a function or method pointer. More...
struct  asSMessageInfo
 Represents a compiler message. More...
class  asIScriptEngine
 The engine interface. More...
class  asIScriptModule
 The interface to the script modules. More...
class  asIScriptContext
 The interface to the virtual machine. More...
class  asIScriptGeneric
 The interface for the generic calling convention. More...
class  asIScriptObject
 The interface for an instance of a script object. More...
class  asIScriptArray
 The interface for a script array object. More...
class  asIObjectType
 The interface for an object type. More...
class  asIScriptFunction
 The interface for a script function description. More...
class  asIBinaryStream
 A binary stream interface. More...
struct  asSVMRegisters
 A struct with registers from the VM sent to a JIT compiled function. More...
class  asIJITCompiler
 The interface that AS use to interact with the JIT compiler. More...
struct  asSBCInfo
 Information on a bytecode instruction. More...

Defines

#define ANGELSCRIPT_VERSION   21800
+#define asFUNCTION(f)   asFunctionPtr(f)
 Returns an asSFuncPtr representing the function specified by the name.
+#define asFUNCTIONPR(f, p, r)   asFunctionPtr((void (*)())(static_cast<r (*)p>(f)))
 Returns an asSFuncPtr representing the function specified by the name, parameter list, and return type.
+#define asMETHOD(c, m)   asSMethodPtr<sizeof(void (c::*)())>::Convert((void (c::*)())(&c::m))
 Returns an asSFuncPtr representing the class method specified by class and method name.
+#define asMETHODPR(c, m, p, r)   asSMethodPtr<sizeof(void (c::*)())>::Convert(static_cast<r (c::*)p>(&c::m))
 Returns an asSFuncPtr representing the class method specified by class, method name, parameter list, return type.
+#define AS_API
 A define that specifies how the function should be imported.
+#define asBC_DWORDARG(x)   (asDWORD(*(x+1)))
 Macro to access the first DWORD argument in the bytecode instruction.
+#define asBC_INTARG(x)   (int(*(x+1)))
 Macro to access the first 32bit integer argument in the bytecode instruction.
+#define asBC_QWORDARG(x)   (*(asQWORD*)(x+1))
 Macro to access the first QWORD argument in the bytecode instruction.
+#define asBC_FLOATARG(x)   (*(float*)(x+1))
 Macro to access the first float argument in the bytecode instruction.
+#define asBC_PTRARG(x)   (asPTRWORD(*(x+1)))
 Macro to access the first pointer argument in the bytecode instruction.
+#define asBC_WORDARG0(x)   (*(((asWORD*)x)+1))
 Macro to access the first WORD argument in the bytecode instruction.
+#define asBC_WORDARG1(x)   (*(((asWORD*)x)+2))
 Macro to access the second WORD argument in the bytecode instruction.
+#define asBC_SWORDARG0(x)   (*(((short*)x)+1))
 Macro to access the first signed WORD argument in the bytecode instruction.
+#define asBC_SWORDARG1(x)   (*(((short*)x)+2))
 Macro to access the second signed WORD argument in the bytecode instruction.
+#define asBC_SWORDARG2(x)   (*(((short*)x)+3))
 Macro to access the third signed WORD argument in the bytecode instruction.

Typedefs

+typedef unsigned char asBYTE
 8 bit unsigned integer
+typedef unsigned short asWORD
 16 bit unsigned integer
+typedef unsigned int asUINT
 32 bit unsigned integer
+typedef size_t asPWORD
 Unsigned integer with the size of a pointer.
+typedef unsigned long asDWORD
 32 bit unsigned integer
+typedef unsigned __int64 asQWORD
 64 bit unsigned integer
+typedef __int64 asINT64
 64 bit integer
+typedef void *(* asALLOCFUNC_t )(size_t)
 The function signature for the custom memory allocation function.
+typedef void(* asFREEFUNC_t )(void *)
 The function signature for the custom memory deallocation function.
typedef void(* asJITFunction )(asSVMRegisters *registers, asDWORD entryId)
 The function signature of a JIT compiled function.

Enumerations

enum  asEEngineProp {
+  asEP_ALLOW_UNSAFE_REFERENCES = 1, +
+  asEP_OPTIMIZE_BYTECODE = 2, +
+  asEP_COPY_SCRIPT_SECTIONS = 3, +
+  asEP_MAX_STACK_SIZE = 4, +
+  asEP_USE_CHARACTER_LITERALS = 5, +
+  asEP_ALLOW_MULTILINE_STRINGS = 6, +
+  asEP_ALLOW_IMPLICIT_HANDLE_TYPES = 7, +
+  asEP_BUILD_WITHOUT_LINE_CUES = 8, +
+  asEP_INIT_GLOBAL_VARS_AFTER_BUILD = 9, +
+  asEP_REQUIRE_ENUM_SCOPE = 10, +
+  asEP_SCRIPT_SCANNER = 11, +
+  asEP_INCLUDE_JIT_INSTRUCTIONS = 12, +
+  asEP_STRING_ENCODING = 13 +
+ }
 Engine properties. More...
enum  asECallConvTypes {
+  asCALL_CDECL = 0, +
+  asCALL_STDCALL = 1, +
+  asCALL_THISCALL = 2, +
+  asCALL_CDECL_OBJLAST = 3, +
+  asCALL_CDECL_OBJFIRST = 4, +
+  asCALL_GENERIC = 5 +
+ }
 Calling conventions. More...
enum  asEObjTypeFlags {
+  asOBJ_REF = 0x01, +
+  asOBJ_VALUE = 0x02, +
+  asOBJ_GC = 0x04, +
+  asOBJ_POD = 0x08, +
+  asOBJ_NOHANDLE = 0x10, +
+  asOBJ_SCOPED = 0x20, +
+  asOBJ_TEMPLATE = 0x40, +
+  asOBJ_APP_CLASS = 0x100, +
+  asOBJ_APP_CLASS_CONSTRUCTOR = 0x200, +
+  asOBJ_APP_CLASS_DESTRUCTOR = 0x400, +
+  asOBJ_APP_CLASS_ASSIGNMENT = 0x800, +
+  asOBJ_APP_CLASS_C = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR), +
+  asOBJ_APP_CLASS_CD = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_DESTRUCTOR), +
+  asOBJ_APP_CLASS_CA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), +
+  asOBJ_APP_CLASS_CDA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_CONSTRUCTOR + asOBJ_APP_CLASS_DESTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), +
+  asOBJ_APP_CLASS_D = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_DESTRUCTOR), +
+  asOBJ_APP_CLASS_A = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_ASSIGNMENT), +
+  asOBJ_APP_CLASS_DA = (asOBJ_APP_CLASS + asOBJ_APP_CLASS_DESTRUCTOR + asOBJ_APP_CLASS_ASSIGNMENT), +
+  asOBJ_APP_PRIMITIVE = 0x1000, +
+  asOBJ_APP_FLOAT = 0x2000 +,
+  asOBJ_SCRIPT_OBJECT = 0x10000 +
+ }
 Object type flags. More...
enum  asEBehaviours {
+  asBEHAVE_CONSTRUCT, +
+  asBEHAVE_DESTRUCT, +
+  asBEHAVE_FACTORY, +
+  asBEHAVE_ADDREF, +
+  asBEHAVE_RELEASE, +
+  asBEHAVE_VALUE_CAST, +
+  asBEHAVE_IMPLICIT_VALUE_CAST, +
+  asBEHAVE_REF_CAST, +
+  asBEHAVE_IMPLICIT_REF_CAST, +
+  asBEHAVE_INDEX, +
+  asBEHAVE_TEMPLATE_CALLBACK +,
+  asBEHAVE_GETREFCOUNT = asBEHAVE_FIRST_GC, +
+  asBEHAVE_SETGCFLAG, +
+  asBEHAVE_GETGCFLAG, +
+  asBEHAVE_ENUMREFS, +
+  asBEHAVE_RELEASEREFS +
+ }
 Behaviours. More...
enum  asERetCodes {
+  asSUCCESS = 0, +
+  asERROR = -1, +
+  asCONTEXT_ACTIVE = -2, +
+  asCONTEXT_NOT_FINISHED = -3, +
+  asCONTEXT_NOT_PREPARED = -4, +
+  asINVALID_ARG = -5, +
+  asNO_FUNCTION = -6, +
+  asNOT_SUPPORTED = -7, +
+  asINVALID_NAME = -8, +
+  asNAME_TAKEN = -9, +
+  asINVALID_DECLARATION = -10, +
+  asINVALID_OBJECT = -11, +
+  asINVALID_TYPE = -12, +
+  asALREADY_REGISTERED = -13, +
+  asMULTIPLE_FUNCTIONS = -14, +
+  asNO_MODULE = -15, +
+  asNO_GLOBAL_VAR = -16, +
+  asINVALID_CONFIGURATION = -17, +
+  asINVALID_INTERFACE = -18, +
+  asCANT_BIND_ALL_FUNCTIONS = -19, +
+  asLOWER_ARRAY_DIMENSION_NOT_REGISTERED = -20, +
+  asWRONG_CONFIG_GROUP = -21, +
+  asCONFIG_GROUP_IS_IN_USE = -22, +
+  asILLEGAL_BEHAVIOUR_FOR_TYPE = -23, +
+  asWRONG_CALLING_CONV = -24, +
+  asBUILD_IN_PROGRESS = -25, +
+  asINIT_GLOBAL_VARS_FAILED = -26 +
+ }
 Return codes. More...
enum  asEContextState {
+  asEXECUTION_FINISHED = 0, +
+  asEXECUTION_SUSPENDED = 1, +
+  asEXECUTION_ABORTED = 2, +
+  asEXECUTION_EXCEPTION = 3, +
+  asEXECUTION_PREPARED = 4, +
+  asEXECUTION_UNINITIALIZED = 5, +
+  asEXECUTION_ACTIVE = 6, +
+  asEXECUTION_ERROR = 7 +
+ }
 Context states. More...
enum  asEExecStrFlags {
+  asEXECSTRING_ONLY_PREPARE = 1, +
+  asEXECSTRING_USE_MY_CONTEXT = 2 +
+ }
 ExecuteString flags. More...
enum  asEMsgType {
+  asMSGTYPE_ERROR = 0, +
+  asMSGTYPE_WARNING = 1, +
+  asMSGTYPE_INFORMATION = 2 +
+ }
 Compiler message types. More...
enum  asEGCFlags {
+  asGC_FULL_CYCLE = 1, +
+  asGC_ONE_STEP = 2, +
+  asGC_DESTROY_GARBAGE = 4, +
+  asGC_DETECT_GARBAGE = 8 +
+ }
 Garbage collector flags. More...
enum  asETokenClass {
+  asTC_UNKNOWN = 0, +
+  asTC_KEYWORD = 1, +
+  asTC_VALUE = 2, +
+  asTC_IDENTIFIER = 3, +
+  asTC_COMMENT = 4, +
+  asTC_WHITESPACE = 5 +
+ }
 Token classes. More...
enum  asETypeIdFlags {
+  asTYPEID_VOID = 0, +
+  asTYPEID_BOOL = 1, +
+  asTYPEID_INT8 = 2, +
+  asTYPEID_INT16 = 3, +
+  asTYPEID_INT32 = 4, +
+  asTYPEID_INT64 = 5, +
+  asTYPEID_UINT8 = 6, +
+  asTYPEID_UINT16 = 7, +
+  asTYPEID_UINT32 = 8, +
+  asTYPEID_UINT64 = 9, +
+  asTYPEID_FLOAT = 10, +
+  asTYPEID_DOUBLE = 11, +
+  asTYPEID_OBJHANDLE = 0x40000000, +
+  asTYPEID_HANDLETOCONST = 0x20000000, +
+  asTYPEID_MASK_OBJECT = 0x1C000000, +
+  asTYPEID_APPOBJECT = 0x04000000, +
+  asTYPEID_SCRIPTOBJECT = 0x08000000, +
+  asTYPEID_SCRIPTARRAY = 0x10000000, +
+  asTYPEID_MASK_SEQNBR = 0x03FFFFFF +
+ }
 Type id flags. More...
enum  asETypeModifiers {
+  asTM_NONE = 0, +
+  asTM_INREF = 1, +
+  asTM_OUTREF = 2, +
+  asTM_INOUTREF = 3 +
+ }
 Type modifiers. More...
enum  asEGMFlags {
+  asGM_ONLY_IF_EXISTS = 0, +
+  asGM_CREATE_IF_NOT_EXISTS = 1, +
+  asGM_ALWAYS_CREATE = 2 +
+ }
 Flags for GetModule. More...
enum  asECompileFlags { asCOMP_ADD_TO_MODULE = 1 + }
 Flags for compilation. More...
enum  asEBCInstr {
+  asBC_POP = 0, +
+  asBC_PUSH = 1, +
+  asBC_PshC4 = 2, +
+  asBC_PshV4 = 3, +
+  asBC_PSF = 4, +
+  asBC_SWAP4 = 5, +
+  asBC_NOT = 6, +
+  asBC_PshG4 = 7, +
+  asBC_LdGRdR4 = 8, +
+  asBC_CALL = 9, +
+  asBC_RET = 10, +
+  asBC_JMP = 11, +
+  asBC_JZ = 12, +
+  asBC_JNZ = 13, +
+  asBC_JS = 14, +
+  asBC_JNS = 15, +
+  asBC_JP = 16, +
+  asBC_JNP = 17, +
+  asBC_TZ = 18, +
+  asBC_TNZ = 19, +
+  asBC_TS = 20, +
+  asBC_TNS = 21, +
+  asBC_TP = 22, +
+  asBC_TNP = 23, +
+  asBC_NEGi = 24, +
+  asBC_NEGf = 25, +
+  asBC_NEGd = 26, +
+  asBC_INCi16 = 27, +
+  asBC_INCi8 = 28, +
+  asBC_DECi16 = 29, +
+  asBC_DECi8 = 30, +
+  asBC_INCi = 31, +
+  asBC_DECi = 32, +
+  asBC_INCf = 33, +
+  asBC_DECf = 34, +
+  asBC_INCd = 35, +
+  asBC_DECd = 36, +
+  asBC_IncVi = 37, +
+  asBC_DecVi = 38, +
+  asBC_BNOT = 39, +
+  asBC_BAND = 40, +
+  asBC_BOR = 41, +
+  asBC_BXOR = 42, +
+  asBC_BSLL = 43, +
+  asBC_BSRL = 44, +
+  asBC_BSRA = 45, +
+  asBC_COPY = 46, +
+  asBC_PshC8 = 47, +
+  asBC_RDS8 = 48, +
+  asBC_SWAP8 = 49, +
+  asBC_CMPd = 50, +
+  asBC_CMPu = 51, +
+  asBC_CMPf = 52, +
+  asBC_CMPi = 53, +
+  asBC_CMPIi = 54, +
+  asBC_CMPIf = 55, +
+  asBC_CMPIu = 56, +
+  asBC_JMPP = 57, +
+  asBC_PopRPtr = 58, +
+  asBC_PshRPtr = 59, +
+  asBC_STR = 60, +
+  asBC_CALLSYS = 61, +
+  asBC_CALLBND = 62, +
+  asBC_SUSPEND = 63, +
+  asBC_ALLOC = 64, +
+  asBC_FREE = 65, +
+  asBC_LOADOBJ = 66, +
+  asBC_STOREOBJ = 67, +
+  asBC_GETOBJ = 68, +
+  asBC_REFCPY = 69, +
+  asBC_CHKREF = 70, +
+  asBC_GETOBJREF = 71, +
+  asBC_GETREF = 72, +
+  asBC_SWAP48 = 73, +
+  asBC_SWAP84 = 74, +
+  asBC_OBJTYPE = 75, +
+  asBC_TYPEID = 76, +
+  asBC_SetV4 = 77, +
+  asBC_SetV8 = 78, +
+  asBC_ADDSi = 79, +
+  asBC_CpyVtoV4 = 80, +
+  asBC_CpyVtoV8 = 81, +
+  asBC_CpyVtoR4 = 82, +
+  asBC_CpyVtoR8 = 83, +
+  asBC_CpyVtoG4 = 84, +
+  asBC_CpyRtoV4 = 85, +
+  asBC_CpyRtoV8 = 86, +
+  asBC_CpyGtoV4 = 87, +
+  asBC_WRTV1 = 88, +
+  asBC_WRTV2 = 89, +
+  asBC_WRTV4 = 90, +
+  asBC_WRTV8 = 91, +
+  asBC_RDR1 = 92, +
+  asBC_RDR2 = 93, +
+  asBC_RDR4 = 94, +
+  asBC_RDR8 = 95, +
+  asBC_LDG = 96, +
+  asBC_LDV = 97, +
+  asBC_PGA = 98, +
+  asBC_RDS4 = 99, +
+  asBC_VAR = 100, +
+  asBC_iTOf = 101, +
+  asBC_fTOi = 102, +
+  asBC_uTOf = 103, +
+  asBC_fTOu = 104, +
+  asBC_sbTOi = 105, +
+  asBC_swTOi = 106, +
+  asBC_ubTOi = 107, +
+  asBC_uwTOi = 108, +
+  asBC_dTOi = 109, +
+  asBC_dTOu = 110, +
+  asBC_dTOf = 111, +
+  asBC_iTOd = 112, +
+  asBC_uTOd = 113, +
+  asBC_fTOd = 114, +
+  asBC_ADDi = 115, +
+  asBC_SUBi = 116, +
+  asBC_MULi = 117, +
+  asBC_DIVi = 118, +
+  asBC_MODi = 119, +
+  asBC_ADDf = 120, +
+  asBC_SUBf = 121, +
+  asBC_MULf = 122, +
+  asBC_DIVf = 123, +
+  asBC_MODf = 124, +
+  asBC_ADDd = 125, +
+  asBC_SUBd = 126, +
+  asBC_MULd = 127, +
+  asBC_DIVd = 128, +
+  asBC_MODd = 129, +
+  asBC_ADDIi = 130, +
+  asBC_SUBIi = 131, +
+  asBC_MULIi = 132, +
+  asBC_ADDIf = 133, +
+  asBC_SUBIf = 134, +
+  asBC_MULIf = 135, +
+  asBC_SetG4 = 136, +
+  asBC_ChkRefS = 137, +
+  asBC_ChkNullV = 138, +
+  asBC_CALLINTF = 139, +
+  asBC_iTOb = 140, +
+  asBC_iTOw = 141, +
+  asBC_SetV1 = 142, +
+  asBC_SetV2 = 143, +
+  asBC_Cast = 144, +
+  asBC_i64TOi = 145, +
+  asBC_uTOi64 = 146, +
+  asBC_iTOi64 = 147, +
+  asBC_fTOi64 = 148, +
+  asBC_dTOi64 = 149, +
+  asBC_fTOu64 = 150, +
+  asBC_dTOu64 = 151, +
+  asBC_i64TOf = 152, +
+  asBC_u64TOf = 153, +
+  asBC_i64TOd = 154, +
+  asBC_u64TOd = 155, +
+  asBC_NEGi64 = 156, +
+  asBC_INCi64 = 157, +
+  asBC_DECi64 = 158, +
+  asBC_BNOT64 = 159, +
+  asBC_ADDi64 = 160, +
+  asBC_SUBi64 = 161, +
+  asBC_MULi64 = 162, +
+  asBC_DIVi64 = 163, +
+  asBC_MODi64 = 164, +
+  asBC_BAND64 = 165, +
+  asBC_BOR64 = 166, +
+  asBC_BXOR64 = 167, +
+  asBC_BSLL64 = 168, +
+  asBC_BSRL64 = 169, +
+  asBC_BSRA64 = 170, +
+  asBC_CMPi64 = 171, +
+  asBC_CMPu64 = 172, +
+  asBC_ChkNullS = 173, +
+  asBC_ClrHi = 174, +
+  asBC_JitEntry = 175 +
+ }
 The bytecode instructions used by the VM. More...
enum  asEBCType { ,
+  asBCTYPE_NO_ARG = 1, +
+  asBCTYPE_W_ARG = 2, +
+  asBCTYPE_wW_ARG = 3, +
+  asBCTYPE_DW_ARG = 4, +
+  asBCTYPE_rW_DW_ARG = 5, +
+  asBCTYPE_QW_ARG = 6, +
+  asBCTYPE_DW_DW_ARG = 7, +
+  asBCTYPE_wW_rW_rW_ARG = 8, +
+  asBCTYPE_wW_QW_ARG = 9, +
+  asBCTYPE_wW_rW_ARG = 10, +
+  asBCTYPE_rW_ARG = 11, +
+  asBCTYPE_wW_DW_ARG = 12, +
+  asBCTYPE_wW_rW_DW_ARG = 13, +
+  asBCTYPE_rW_rW_ARG = 14, +
+  asBCTYPE_W_rW_ARG = 15, +
+  asBCTYPE_wW_W_ARG = 16, +
+  asBCTYPE_W_DW_ARG = 17, +
+  asBCTYPE_QW_DW_ARG = 18 +
+ }
 Describes the structure of a bytecode instruction. More...

Functions

AS_API asIScriptEngineasCreateScriptEngine (asDWORD version)
 Creates the script engine.
AS_API const char * asGetLibraryVersion ()
 Returns the version of the compiled library.
AS_API const char * asGetLibraryOptions ()
 Returns the options used to compile the library.
AS_API asIScriptContextasGetActiveContext ()
 Returns the currently active context.
AS_API int asThreadCleanup ()
 Cleans up memory allocated for the current thread.
AS_API int asSetGlobalMemoryFunctions (asALLOCFUNC_t allocFunc, asFREEFUNC_t freeFunc)
 Set the memory management functions that AngelScript should use.
AS_API int asResetGlobalMemoryFunctions ()
 Remove previously registered memory management functions.

Variables

+const int asBCTypeSize [19]
 Lookup table for determining the size of each type of bytecode instruction.
+const asSBCInfo asBCInfo [256]
 Information on each bytecode instruction.
+


Detailed Description

+This header file describes the complete application programming interface for AngelScript.

Define Documentation

+ +
+
+ + + + +
#define ANGELSCRIPT_VERSION   21800
+
+
+ +

+Version 2.18.0 +

+

+


Typedef Documentation

+ +
+
+ + + + +
typedef void(* asJITFunction)(asSVMRegisters *registers, asDWORD entryId)
+
+
+ +

+

Parameters:
+ + + +
[in] registers A pointer to the virtual machine's registers.
[in] entryId The value defined by the JIT compiler for the current entry point in the JIT function.
+
+A JIT function receives a pointer to the virtual machine's registers when called and an argument telling it where in the script function to continue the execution. The JIT function must make sure to update the VM's registers according to the actions performed before returning control to the VM.

+

See also:
JIT compilation
+ +
+

+


Enumeration Type Documentation

+ +
+
+ + + + +
enum asEBCInstr
+
+
+ +

+

See also:
Byte code instructions
+
Enumerator:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
asBC_POP  +Decrease the stack with the amount in the argument.
asBC_PUSH  +Increase the stack with the amount in the argument.
asBC_PshC4  +Push the 32bit value in the argument onto the stack.
asBC_PshV4  +Push the 32bit value from a variable onto the stack.
asBC_PSF  +Push the address of the stack frame onto the stack.
asBC_SWAP4  +Swap the top two DWORDs on the stack.
asBC_NOT  +Perform a boolean not on the value in a variable.
asBC_PshG4  +Push the 32bit value from a global variable onto the stack.
asBC_LdGRdR4  +Perform the actions of asBC_LDG followed by asBC_RDR4.
asBC_CALL  +Jump to a script function, indexed by the argument.
asBC_RET  +Return to the instruction after the last executed call.
asBC_JMP  +Unconditional jump to a relative position in this function.
asBC_JZ  +If the value register is 0 jump to a relative position in this function.
asBC_JNZ  +If the value register is not 0 jump to a relative position in this function.
asBC_JS  +If the value register is less than 0 jump to a relative position in this function.
asBC_JNS  +If the value register is greater than or equal to 0 jump to a relative position in this function.
asBC_JP  +If the value register is greater than 0 jump to a relative position in this function.
asBC_JNP  +If the value register is less than or equal to 0 jump to a relative position in this function.
asBC_TZ  +If the value register is 0 set it to 1.
asBC_TNZ  +If the value register is not 0 set it to 1.
asBC_TS  +If the value register is less than 0 set it to 1.
asBC_TNS  +If the value register is greater than or equal to 0 set it to 1.
asBC_TP  +If the value register is greater than 0 set it to 1.
asBC_TNP  +If the value register is less than or equal to 0 set it to 1.
asBC_NEGi  +Negate the 32bit integer value in the variable.
asBC_NEGf  +Negate the float value in the variable.
asBC_NEGd  +Negate the double value in the variable.
asBC_INCi16  +Increment the 16bit integer value that is stored at the address pointed to by the reference in the value register.
asBC_INCi8  +Increment the 8bit integer value that is stored at the address pointed to by the reference in the value register.
asBC_DECi16  +Decrement the 16bit integer value that is stored at the address pointed to by the reference in the value register.
asBC_DECi8  +Increment the 8bit integer value that is stored at the address pointed to by the reference in the value register.
asBC_INCi  +Increment the 32bit integer value that is stored at the address pointed to by the reference in the value register.
asBC_DECi  +Decrement the 32bit integer value that is stored at the address pointed to by the reference in the value register.
asBC_INCf  +Increment the float value that is stored at the address pointed to by the reference in the value register.
asBC_DECf  +Decrement the float value that is stored at the address pointed to by the reference in the value register.
asBC_INCd  +Increment the double value that is stored at the address pointed to by the reference in the value register.
asBC_DECd  +Decrement the double value that is stored at the address pointed to by the reference in the value register.
asBC_IncVi  +Increment the 32bit integer value in the variable.
asBC_DecVi  +Decrement the 32bit integer value in the variable.
asBC_BNOT  +Perform a bitwise complement on the 32bit value in the variable.
asBC_BAND  +Perform a bitwise and of two 32bit values and store the result in a third variable.
asBC_BOR  +Perform a bitwise or of two 32bit values and store the result in a third variable.
asBC_BXOR  +Perform a bitwise exclusive or of two 32bit values and store the result in a third variable.
asBC_BSLL  +Perform a logical left shift of a 32bit value and store the result in a third variable.
asBC_BSRL  +Perform a logical right shift of a 32bit value and store the result in a third variable.
asBC_BSRA  +Perform a arithmetical right shift of a 32bit value and store the result in a third variable.
asBC_COPY  +Pop the destination and source addresses from the stack. Perform a bitwise copy of the referred object. Push the destination address on the stack.
asBC_PshC8  +Push a 64bit value on the stack.
asBC_RDS8  +Pop an address from the stack, then read a 64bit value from that address and push it on the stack.
asBC_SWAP8  +Swap the top two QWORDs on the stack.
asBC_CMPd  +Compare two double variables and store the result in the value register.
asBC_CMPu  +Compare two unsigned 32bit integer variables and store the result in the value register.
asBC_CMPf  +Compare two float variables and store the result in the value register.
asBC_CMPi  +Compare two 32bit integer variables and store the result in the value register.
asBC_CMPIi  +Compare 32bit integer variable with constant and store the result in value register.
asBC_CMPIf  +Compare float variable with constant and store the result in value register.
asBC_CMPIu  +Compare unsigned 32bit integer variable with constant and store the result in value register.
asBC_JMPP  +Jump to relative position in the function where the offset is stored in a variable.
asBC_PopRPtr  +Pop a pointer from the stack and store it in the value register.
asBC_PshRPtr  +Push a pointer from the value register onto the stack.
asBC_STR  +Push string address and length on the stack.
asBC_CALLSYS  +Call registered function. Suspend further execution if requested.
asBC_CALLBND  +Jump to an imported script function, indexed by the argument.
asBC_SUSPEND  +Call line callback function if set. Suspend execution if requested.
asBC_ALLOC  +Allocate the memory for the object. If the type is a script object then jump to the constructor, else call the registered constructor behaviour. Suspend further execution if requested.
asBC_FREE  +Pop the address of the object variable from the stack. If ref type, call the release method, else call the destructor then free the memory. Clear the pointer in the variable.
asBC_LOADOBJ  +Copy the object pointer from a variable to the object register. Clear the variable.
asBC_STOREOBJ  +Copy the object pointer from the object register to the variable. Clear the object register.
asBC_GETOBJ  +Move object pointer from variable onto stack location.
asBC_REFCPY  +Pop destination handle reference. Perform a handle assignment, while updating the reference count for both previous and new objects.
asBC_CHKREF  +Throw an exception if the pointer on the top of the stack is null.
asBC_GETOBJREF  +Replace a variable index on the stack with the object handle stored in that variable.
asBC_GETREF  +Replace a variable index on the stack with the address of the variable.
asBC_SWAP48  +Swap the top DWORD with the QWORD below it.
asBC_SWAP84  +Swap the top QWORD with the DWORD below it.
asBC_OBJTYPE  +Push the pointer argument onto the stack. The pointer is a pointer to an object type structure.
asBC_TYPEID  +Push the type id onto the stack. Equivalent to PshC4.
asBC_SetV4  +Initialize the variable with a DWORD.
asBC_SetV8  +Initialize the variable with a QWORD.
asBC_ADDSi  +Add a value to the top pointer on the stack, thus updating the address itself.
asBC_CpyVtoV4  +Copy a DWORD from one variable to another.
asBC_CpyVtoV8  +Copy a QWORD from one variable to another.
asBC_CpyVtoR4  +Copy a DWORD from a variable into the value register.
asBC_CpyVtoR8  +Copy a QWORD from a variable into the value register.
asBC_CpyVtoG4  +Copy a DWORD from a local variable to a global variable.
asBC_CpyRtoV4  +Copy a DWORD from the value register into a variable.
asBC_CpyRtoV8  +Copy a QWORD from the value register into a variable.
asBC_CpyGtoV4  +Copy a DWORD from a global variable to a local variable.
asBC_WRTV1  +Copy a BYTE from a variable to the address held in the value register.
asBC_WRTV2  +Copy a WORD from a variable to the address held in the value register.
asBC_WRTV4  +Copy a DWORD from a variable to the address held in the value register.
asBC_WRTV8  +Copy a QWORD from a variable to the address held in the value register.
asBC_RDR1  +Copy a BYTE from address held in the value register to a variable. Clear the top bytes in the variable.
asBC_RDR2  +Copy a WORD from address held in the value register to a variable. Clear the top word in the variable.
asBC_RDR4  +Copy a DWORD from address held in the value register to a variable.
asBC_RDR8  +Copy a QWORD from address held in the value register to a variable.
asBC_LDG  +Load the address of a global variable into the value register.
asBC_LDV  +Load the address of a local variable into the value register.
asBC_PGA  +Push the address of a global variable on the stack.
asBC_RDS4  +Pop an address from the stack. Read a DWORD from the address, and push it on the stack.
asBC_VAR  +Push the index of the variable on the stack, with the size of a pointer.
asBC_iTOf  +Convert the 32bit integer value to a float in the variable.
asBC_fTOi  +Convert the float value to a 32bit integer in the variable.
asBC_uTOf  +Convert the unsigned 32bit integer value to a float in the variable.
asBC_fTOu  +Convert the float value to an unsigned 32bit integer in the variable.
asBC_sbTOi  +Expand the low byte as a signed value to a full 32bit integer in the variable.
asBC_swTOi  +Expand the low word as a signed value to a full 32bit integer in the variable.
asBC_ubTOi  +Expand the low byte as an unsigned value to a full 32bit integer in the variable.
asBC_uwTOi  +Expand the low word as an unsigned value to a full 32bit integer in the variable.
asBC_dTOi  +Convert the double value in one variable to a 32bit integer in another variable.
asBC_dTOu  +Convert the double value in one variable to a 32bit unsigned integer in another variable.
asBC_dTOf  +Convert the double value in one variable to a float in another variable.
asBC_iTOd  +Convert the 32bit integer value in one variable to a double in another variable.
asBC_uTOd  +Convert the 32bit unsigned integer value in one variable to a double in another variable.
asBC_fTOd  +Convert the float value in one variable to a double in another variable.
asBC_ADDi  +Add the values of two 32bit integer variables and store in a third variable.
asBC_SUBi  +Subtract the values of two 32bit integer variables and store in a third variable.
asBC_MULi  +Multiply the values of two 32bit integer variables and store in a third variable.
asBC_DIVi  +Divide the values of two 32bit integer variables and store in a third variable.
asBC_MODi  +Calculate the modulo of values of two 32bit integer variables and store in a third variable.
asBC_ADDf  +Add the values of two float variables and store in a third variable.
asBC_SUBf  +Subtract the values of two float variables and store in a third variable.
asBC_MULf  +Multiply the values of two float variables and store in a third variable.
asBC_DIVf  +Divide the values of two float variables and store in a third variable.
asBC_MODf  +Calculate the modulo of values of two float variables and store in a third variable.
asBC_ADDd  +Add the values of two double variables and store in a third variable.
asBC_SUBd  +Subtract the values of two double variables and store in a third variable.
asBC_MULd  +Multiply the values of two double variables and store in a third variable.
asBC_DIVd  +Divide the values of two double variables and store in a third variable.
asBC_MODd  +Calculate the modulo of values of two double variables and store in a third variable.
asBC_ADDIi  +Add a 32bit integer variable with a constant value and store the result in another variable.
asBC_SUBIi  +Subtract a 32bit integer variable with a constant value and store the result in another variable.
asBC_MULIi  +Multiply a 32bit integer variable with a constant value and store the result in another variable.
asBC_ADDIf  +Add a float variable with a constant value and store the result in another variable.
asBC_SUBIf  +Subtract a float variable with a constant value and store the result in another variable.
asBC_MULIf  +Multiply a float variable with a constant value and store the result in another variable.
asBC_SetG4  +Set the value of global variable to a 32bit word.
asBC_ChkRefS  +Throw an exception if the address stored on the stack points to a null pointer.
asBC_ChkNullV  +Throw an exception if the variable is null.
asBC_CALLINTF  +Jump to an interface method, indexed by the argument.
asBC_iTOb  +Convert a 32bit integer in a variable to a byte, clearing the top bytes.
asBC_iTOw  +Convert a 32bit integer in a variable to a word, clearing the top word.
asBC_SetV1  +Same as SetV4.
asBC_SetV2  +Same as SetV4.
asBC_Cast  +Pop an object handle to a script class from the stack. Perform a dynamic cast on it and store the result in the object register.
asBC_i64TOi  +Convert the 64bit integer value in one variable to a 32bit integer in another variable.
asBC_uTOi64  +Convert the 32bit unsigned integer value in one variable to a 64bit integer in another variable.
asBC_iTOi64  +Convert the 32bit integer value in one variable to a 64bit integer in another variable.
asBC_fTOi64  +Convert the float value in one variable to a 64bit integer in another variable.
asBC_dTOi64  +Convert the double value in the variable to a 64bit integer.
asBC_fTOu64  +Convert the float value in one variable to a 64bit unsigned integer in another variable.
asBC_dTOu64  +Convert the double value in the variable to a 64bit unsigned integer.
asBC_i64TOf  +Convert the 64bit integer value in one variable to a float in another variable.
asBC_u64TOf  +Convert the 64bit unsigned integer value in one variable to a float in another variable.
asBC_i64TOd  +Convert the 32bit integer value in the variable to a double.
asBC_u64TOd  +Convert the 32bit unsigned integer value in the variable to a double.
asBC_NEGi64  +Negate the 64bit integer value in the variable.
asBC_INCi64  +Increment the 64bit integer value that is stored at the address pointed to by the reference in the value register.
asBC_DECi64  +Decrement the 64bit integer value that is stored at the address pointed to by the reference in the value register.
asBC_BNOT64  +Perform a bitwise complement on the 64bit value in the variable.
asBC_ADDi64  +Perform an addition with two 64bit integer variables and store the result in a third variable.
asBC_SUBi64  +Perform a subtraction with two 64bit integer variables and store the result in a third variable.
asBC_MULi64  +Perform a multiplication with two 64bit integer variables and store the result in a third variable.
asBC_DIVi64  +Perform a division with two 64bit integer variables and store the result in a third variable.
asBC_MODi64  +Perform the modulo operation with two 64bit integer variables and store the result in a third variable.
asBC_BAND64  +Perform a bitwise and of two 64bit values and store the result in a third variable.
asBC_BOR64  +Perform a bitwise or of two 64bit values and store the result in a third variable.
asBC_BXOR64  +Perform a bitwise exclusive or of two 64bit values and store the result in a third variable.
asBC_BSLL64  +Perform a logical left shift of a 64bit value and store the result in a third variable.
asBC_BSRL64  +Perform a logical right shift of a 64bit value and store the result in a third variable.
asBC_BSRA64  +Perform a arithmetical right shift of a 64bit value and store the result in a third variable.
asBC_CMPi64  +Compare two 64bit integer variables and store the result in the value register.
asBC_CMPu64  +Compare two unsigned 64bit integer variables and store the result in the value register.
asBC_ChkNullS  +Check if a pointer on the stack is null, and if it is throw an exception. The argument is relative to the top of the stack.
asBC_ClrHi  +Clear the upper bytes of the value register so that only the value in the lowest byte is kept.
asBC_JitEntry  +If a JIT function is available and the argument is not 0 then call the JIT function.
+
+ +
+

+ +

+
+ + + + +
enum asEBCType
+
+
+ +

+

Enumerator:
+ + + + + + + + + + + + + + + + + + + +
asBCTYPE_NO_ARG  +Instruction + no args.
asBCTYPE_W_ARG  +Instruction + WORD arg.
asBCTYPE_wW_ARG  +Instruction + WORD arg (dest var).
asBCTYPE_DW_ARG  +Instruction + DWORD arg.
asBCTYPE_rW_DW_ARG  +Instruction + WORD arg (source var) + DWORD arg.
asBCTYPE_QW_ARG  +Instruction + QWORD arg.
asBCTYPE_DW_DW_ARG  +Instruction + DWORD arg + DWORD arg.
asBCTYPE_wW_rW_rW_ARG  +Instruction + WORD arg (dest var) + WORD arg (source var) + WORD arg (source var).
asBCTYPE_wW_QW_ARG  +Instruction + WORD arg (dest var) + QWORD arg.
asBCTYPE_wW_rW_ARG  +Instruction + WORD arg (dest var) + WORD arg (source var).
asBCTYPE_rW_ARG  +Instruction + WORD arg (source var).
asBCTYPE_wW_DW_ARG  +Instruction + WORD arg (dest var) + DWORD arg.
asBCTYPE_wW_rW_DW_ARG  +Instruction + WORD arg (dest var) + WORD arg (source var) + DWORD arg.
asBCTYPE_rW_rW_ARG  +Instruction + WORD arg (source var) + WORD arg (source var).
asBCTYPE_W_rW_ARG  +Instruction + WORD arg + WORD arg (source var).
asBCTYPE_wW_W_ARG  +Instruction + WORD arg (dest var) + WORD arg.
asBCTYPE_W_DW_ARG  +Instruction + WORD arg + DWORD arg.
asBCTYPE_QW_DW_ARG  +Instruction + QWORD arg + DWORD arg.
+
+ +
+

+ +

+
+ + + + +
enum asEBehaviours
+
+
+ +

+

Enumerator:
+ + + + + + + + + + + + + + + + + +
asBEHAVE_CONSTRUCT  +Constructor.
asBEHAVE_DESTRUCT  +Destructor.
asBEHAVE_FACTORY  +Factory.
asBEHAVE_ADDREF  +AddRef.
asBEHAVE_RELEASE  +Release.
asBEHAVE_VALUE_CAST  +Explicit value cast operator.
asBEHAVE_IMPLICIT_VALUE_CAST  +Implicit value cast operator.
asBEHAVE_REF_CAST  +Explicit reference cast operator.
asBEHAVE_IMPLICIT_REF_CAST  +Implicit reference cast operator.
asBEHAVE_INDEX  +operator []
asBEHAVE_TEMPLATE_CALLBACK  +Callback for validating template instances.
asBEHAVE_GETREFCOUNT  +(GC) Get reference count
asBEHAVE_SETGCFLAG  +(GC) Set GC flag
asBEHAVE_GETGCFLAG  +(GC) Get GC flag
asBEHAVE_ENUMREFS  +(GC) Enumerate held references
asBEHAVE_RELEASEREFS  +(GC) Release all references
+
+ +
+

+ +

+
+ + + + +
enum asECallConvTypes
+
+
+ +

+

Enumerator:
+ + + + + + + +
asCALL_CDECL  +A cdecl function.
asCALL_STDCALL  +A stdcall function.
asCALL_THISCALL  +A thiscall class method.
asCALL_CDECL_OBJLAST  +A cdecl function that takes the object pointer as the last parameter.
asCALL_CDECL_OBJFIRST  +A cdecl function that takes the object pointer as the first parameter.
asCALL_GENERIC  +A function using the generic calling convention.
+
+ +
+

+ +

+
+ + + + +
enum asECompileFlags
+
+
+ +

+

Enumerator:
+ + +
asCOMP_ADD_TO_MODULE  +The compiled function should be added to the scope of the module.
+
+ +
+

+ +

+
+ + + + +
enum asEContextState
+
+
+ +

+

Enumerator:
+ + + + + + + + + +
asEXECUTION_FINISHED  +The context has successfully completed the execution.
asEXECUTION_SUSPENDED  +The execution is suspended and can be resumed.
asEXECUTION_ABORTED  +The execution was aborted by the application.
asEXECUTION_EXCEPTION  +The execution was terminated by an unhandled script exception.
asEXECUTION_PREPARED  +The context has been prepared for a new execution.
asEXECUTION_UNINITIALIZED  +The context is not initialized.
asEXECUTION_ACTIVE  +The context is currently executing a function call.
asEXECUTION_ERROR  +The context has encountered an error and must be reinitialized.
+
+ +
+

+ +

+
+ + + + +
enum asEEngineProp
+
+
+ +

+

Enumerator:
+ + + + + + + + + + + + + + +
asEP_ALLOW_UNSAFE_REFERENCES  +Allow unsafe references. Default: false.
asEP_OPTIMIZE_BYTECODE  +Optimize byte code. Default: true.
asEP_COPY_SCRIPT_SECTIONS  +Copy script section memory. Default: true.
asEP_MAX_STACK_SIZE  +Maximum stack size for script contexts. Default: 0 (no limit).
asEP_USE_CHARACTER_LITERALS  +Interpret single quoted strings as character literals. Default: false.
asEP_ALLOW_MULTILINE_STRINGS  +Allow linebreaks in string constants. Default: false.
asEP_ALLOW_IMPLICIT_HANDLE_TYPES  +Allow script to declare implicit handle types. Default: false.
asEP_BUILD_WITHOUT_LINE_CUES  +Remove SUSPEND instructions between each statement. Default: false.
asEP_INIT_GLOBAL_VARS_AFTER_BUILD  +Initialize global variables after a build. Default: true.
asEP_REQUIRE_ENUM_SCOPE  +When set the enum values must be prefixed with the enum type. Default: false.
asEP_SCRIPT_SCANNER  +Select scanning method: 0 - ASCII, 1 - UTF8. Default: 1 (UTF8).
asEP_INCLUDE_JIT_INSTRUCTIONS  +When set extra bytecode instructions needed for JIT compiled funcions will be included. Default: false.
asEP_STRING_ENCODING  +Select string encoding for literals: 0 - UTF8/ASCII, 1 - UTF16. Default: 0 (UTF8).
+
+ +
+

+ +

+
+ + + + +
enum asEExecStrFlags
+
+
+ +

+

Deprecated:
since 2.18.0
+
Enumerator:
+ + + +
asEXECSTRING_ONLY_PREPARE  +Only prepare the context.
asEXECSTRING_USE_MY_CONTEXT  +Use the pre-allocated context.
+
+ +
+

+ +

+
+ + + + +
enum asEGCFlags
+
+
+ +

+

Enumerator:
+ + + + + +
asGC_FULL_CYCLE  +Execute a full cycle.
asGC_ONE_STEP  +Execute only one step.
asGC_DESTROY_GARBAGE  +Destroy known garbage.
asGC_DETECT_GARBAGE  +Detect garbage with circular references.
+
+ +
+

+ +

+
+ + + + +
enum asEGMFlags
+
+
+ +

+

Enumerator:
+ + + + +
asGM_ONLY_IF_EXISTS  +Don't return any module if it is not found.
asGM_CREATE_IF_NOT_EXISTS  +Create the module if it doesn't exist.
asGM_ALWAYS_CREATE  +Always create a new module, discarding the existing one.
+
+ +
+

+ +

+
+ + + + +
enum asEMsgType
+
+
+ +

+

Enumerator:
+ + + + +
asMSGTYPE_ERROR  +The message is an error.
asMSGTYPE_WARNING  +The message is a warning.
asMSGTYPE_INFORMATION  +The message is informational only.
+
+ +
+

+ +

+
+ + + + +
enum asEObjTypeFlags
+
+
+ +

+

Enumerator:
+ + + + + + + + + + + + + + + + + + + + + + +
asOBJ_REF  +A reference type.
asOBJ_VALUE  +A value type.
asOBJ_GC  +A garbage collected type. Only valid for reference types.
asOBJ_POD  +A plain-old-data type. Only valid for value types.
asOBJ_NOHANDLE  +This reference type doesn't allow handles to be held. Only valid for reference types.
asOBJ_SCOPED  +The life time of objects of this type are controlled by the scope of the variable. Only valid for reference types.
asOBJ_TEMPLATE  +A template type.
asOBJ_APP_CLASS  +The C++ type is a class type. Only valid for value types.
asOBJ_APP_CLASS_CONSTRUCTOR  +The C++ class has an explicit constructor. Only valid for value types.
asOBJ_APP_CLASS_DESTRUCTOR  +The C++ class has an explicit destructor. Only valid for value types.
asOBJ_APP_CLASS_ASSIGNMENT  +The C++ class has an explicit assignment operator. Only valid for value types.
asOBJ_APP_CLASS_C  +The C++ type is a class with a constructor, but no destructor or assignment operator.
asOBJ_APP_CLASS_CD  +The C++ type is a class with a constructor and destructor, but no assignment operator.
asOBJ_APP_CLASS_CA  +The C++ type is a class with a constructor and assignment operator, but no destructor.
asOBJ_APP_CLASS_CDA  +The C++ type is a class with a constructor, destructor, and assignment operator.
asOBJ_APP_CLASS_D  +The C++ type is a class with a destructor, but no constructor or assignment operator.
asOBJ_APP_CLASS_A  +The C++ type is a class with an assignment operator, but no constructor or destructor.
asOBJ_APP_CLASS_DA  +The C++ type is a class with a destructor and assignment operator, but no constructor.
asOBJ_APP_PRIMITIVE  +The C++ type is a primitive type. Only valid for value types.
asOBJ_APP_FLOAT  +The C++ type is a float or double. Only valid for value types.
asOBJ_SCRIPT_OBJECT  +The object is a script class or an interface.
+
+ +
+

+ +

+
+ + + + +
enum asERetCodes
+
+
+ +

+

Enumerator:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
asSUCCESS  +Success.
asERROR  +Failure.
asCONTEXT_ACTIVE  +The context is active.
asCONTEXT_NOT_FINISHED  +The context is not finished.
asCONTEXT_NOT_PREPARED  +The context is not prepared.
asINVALID_ARG  +Invalid argument.
asNO_FUNCTION  +The function was not found.
asNOT_SUPPORTED  +Not supported.
asINVALID_NAME  +Invalid name.
asNAME_TAKEN  +The name is already taken.
asINVALID_DECLARATION  +Invalid declaration.
asINVALID_OBJECT  +Invalid object.
asINVALID_TYPE  +Invalid type.
asALREADY_REGISTERED  +Already registered.
asMULTIPLE_FUNCTIONS  +Multiple matching functions.
asNO_MODULE  +The module was not found.
asNO_GLOBAL_VAR  +The global variable was not found.
asINVALID_CONFIGURATION  +Invalid configuration.
asINVALID_INTERFACE  +Invalid interface.
asCANT_BIND_ALL_FUNCTIONS  +All imported functions couldn't be bound.
asLOWER_ARRAY_DIMENSION_NOT_REGISTERED  +The array sub type has not been registered yet.
asWRONG_CONFIG_GROUP  +Wrong configuration group.
asCONFIG_GROUP_IS_IN_USE  +The configuration group is in use.
asILLEGAL_BEHAVIOUR_FOR_TYPE  +Illegal behaviour for the type.
asWRONG_CALLING_CONV  +The specified calling convention doesn't match the function/method pointer.
asBUILD_IN_PROGRESS  +A build is currently in progress.
asINIT_GLOBAL_VARS_FAILED  +The initialization of global variables failed.
+
+ +
+

+ +

+
+ + + + +
enum asETokenClass
+
+
+ +

+

Enumerator:
+ + + + + + + +
asTC_UNKNOWN  +Unknown token.
asTC_KEYWORD  +Keyword token.
asTC_VALUE  +Literal value token.
asTC_IDENTIFIER  +Identifier token.
asTC_COMMENT  +Comment token.
asTC_WHITESPACE  +White space token.
+
+ +
+

+ +

+
+ + + + +
enum asETypeIdFlags
+
+
+ +

+

Enumerator:
+ + + + + + + + + + + + + + + + + + + + +
asTYPEID_VOID  +The type id for void.
asTYPEID_BOOL  +The type id for bool.
asTYPEID_INT8  +The type id for int8.
asTYPEID_INT16  +The type id for int16.
asTYPEID_INT32  +The type id for int.
asTYPEID_INT64  +The type id for int64.
asTYPEID_UINT8  +The type id for uint8.
asTYPEID_UINT16  +The type id for uint16.
asTYPEID_UINT32  +The type id for uint.
asTYPEID_UINT64  +The type id for uint64.
asTYPEID_FLOAT  +The type id for float.
asTYPEID_DOUBLE  +The type id for double.
asTYPEID_OBJHANDLE  +The bit that shows if the type is a handle.
asTYPEID_HANDLETOCONST  +The bit that shows if the type is a handle to a const.
asTYPEID_MASK_OBJECT  +If any of these bits are set, then the type is an object.
asTYPEID_APPOBJECT  +The bit that shows if the type is an application registered type.
asTYPEID_SCRIPTOBJECT  +The bit that shows if the type is a script class.
asTYPEID_SCRIPTARRAY  +The bit that shows if the type is a script array.
asTYPEID_MASK_SEQNBR  +The mask for the type id sequence number.
+
+ +
+

+ +

+
+ + + + +
enum asETypeModifiers
+
+
+ +

+

Enumerator:
+ + + + + +
asTM_NONE  +No modification.
asTM_INREF  +Input reference.
asTM_OUTREF  +Output reference.
asTM_INOUTREF  +In/out reference.
+
+ +
+

+


Function Documentation

+ +
+
+ + + + + + + + + +
AS_API asIScriptEngine* asCreateScriptEngine (asDWORD  version  ) 
+
+
+ +

+

Parameters:
+ + +
[in] version The library version. Should always be ANGELSCRIPT_VERSION.
+
+
Returns:
A pointer to the script engine interface.
+Call this function to create a new script engine. When you're done with the script engine, i.e. after you've executed all your scripts, you should call Release on the pointer to free the engine object. +
+

+ +

+
+ + + + + + + + +
AS_API asIScriptContext* asGetActiveContext (  ) 
+
+
+ +

+

Returns:
A pointer to the currently executing context, or null if no context is executing.
+This function is most useful for registered functions, as it will allow them to obtain a pointer to the context that is calling the function, and through that get the engine, or custom user data.

+If the script library is compiled with multithread support, this function will return the context that is currently active in the thread that is being executed. It will thus work even if there are multiple threads executing scripts at the same time. +

+

+ +

+
+ + + + + + + + +
AS_API const char* asGetLibraryOptions (  ) 
+
+
+ +

+

Returns:
A null terminated string with indicators that identify the options used to compile the script library.
+This can be used to identify at run-time different ways to configure the engine. For example, if the returned string contain the identifier AS_MAX_PORTABILITY then functions and methods must be registered with the asCALL_GENERIC calling convention. +
+

+ +

+
+ + + + + + + + +
AS_API const char* asGetLibraryVersion (  ) 
+
+
+ +

+

Returns:
A null terminated string with the library version.
+The returned string can be used for presenting the library version in a log file, or in the GUI. +
+

+ +

+
+ + + + + + + + +
AS_API int asResetGlobalMemoryFunctions (  ) 
+
+
+ +

+

Returns:
A negative value on error.
+Call this method to restore the default memory management functions. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
AS_API int asSetGlobalMemoryFunctions (asALLOCFUNC_t  allocFunc,
asFREEFUNC_t  freeFunc 
)
+
+
+ +

+

Parameters:
+ + + +
[in] allocFunc The function that will be used to allocate memory.
[in] freeFunc The function that will be used to free the memory.
+
+
Returns:
A negative value on error.
+Call this method to register the global memory allocation and deallocation functions that AngelScript should use for memory management. This function Should be called before asCreateScriptEngine.

+If not called, AngelScript will use the malloc and free functions from the standard C library. +

+

+ +

+
+ + + + + + + + +
AS_API int asThreadCleanup (  ) 
+
+
+ +

+

Returns:
A negative value on error.
+
Return values:
+ + +
asCONTEXT_ACTIVE A context is still active.
+
+Call this method before terminating a thread that has accessed the engine to clean up memory allocated for that thread.

+It's not necessary to call this if only a single thread accesses the engine. +

+

+

+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/annotated.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/annotated.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/annotated.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/annotated.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,30 @@ + + +AngelScript: Class List + + + + +
+

Class List

Here are the classes, structs, unions and interfaces with brief descriptions: + + + + + + + + + + + + + + +
asIBinaryStreamA binary stream interface
asIJITCompilerThe interface that AS use to interact with the JIT compiler
asIObjectTypeThe interface for an object type
asIScriptArrayThe interface for a script array object
asIScriptContextThe interface to the virtual machine
asIScriptEngineThe engine interface
asIScriptFunctionThe interface for a script function description
asIScriptGenericThe interface for the generic calling convention
asIScriptModuleThe interface to the script modules
asIScriptObjectThe interface for an instance of a script object
asSBCInfoInformation on a bytecode instruction
asSFuncPtrRepresents a function or method pointer
asSMessageInfoRepresents a compiler message
asSVMRegistersA struct with registers from the VM sent to a JIT compiled function
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/aslogo.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/aslogo.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_binary_stream.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_binary_stream.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_binary_stream.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_binary_stream.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,105 @@ + + +AngelScript: asIBinaryStream Class Reference + + + + +
+

asIBinaryStream Class Reference

A binary stream interface. +More... +

+ +

+List of all members. + + + + + + + + +

Public Member Functions

virtual void Read (void *ptr, asUINT size)=0
 Read size bytes from the stream into the memory pointed to by ptr.
virtual void Write (const void *ptr, asUINT size)=0
 Write size bytes to the stream from the memory pointed to by ptr.
+


Detailed Description

+This interface is used when storing compiled bytecode to disk or memory, and then loading it into the engine again.

+

See also:
asIScriptModule::SaveByteCode, asIScriptModule::LoadByteCode
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
virtual void asIBinaryStream::Read (void *  ptr,
asUINT  size 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[out] ptr A pointer to the buffer that will receive the data.
[in] size The number of bytes to read.
+
+Read size bytes from the data stream into the memory pointed to by ptr. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual void asIBinaryStream::Write (const void *  ptr,
asUINT  size 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] ptr A pointer to the buffer that the data should written from.
[in] size The number of bytes to write.
+
+Write size bytes to the data stream from the memory pointed to by ptr. +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_binary_stream-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_binary_stream-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_binary_stream-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_binary_stream-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ + + +AngelScript: Member List + + + + +
+

asIBinaryStream Member List

This is the complete list of members for asIBinaryStream, including all inherited members.

+ + +
Read(void *ptr, asUINT size)=0asIBinaryStream [pure virtual]
Write(const void *ptr, asUINT size)=0asIBinaryStream [pure virtual]

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_j_i_t_compiler.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_j_i_t_compiler.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_j_i_t_compiler.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_j_i_t_compiler.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,96 @@ + + +AngelScript: asIJITCompiler Class Reference + + + + +
+

asIJITCompiler Class Reference

The interface that AS use to interact with the JIT compiler. +More... +

+ +

+List of all members. + + + + + + + + +

Public Member Functions

virtual int CompileFunction (asIScriptFunction *function, asJITFunction *output)=0
 Called by AngelScript to begin the compilation.
virtual void ReleaseJITFunction (asJITFunction func)=0
 Called by AngelScript when the JIT function is released.
+


Detailed Description

+This is the minimal interface that the JIT compiler must implement so that AngelScript can request the compilation of the script functions.

+

See also:
JIT compilation
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
virtual int asIJITCompiler::CompileFunction (asIScriptFunction function,
asJITFunction output 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] function A pointer to the script function
[out] output The JIT compiled function
+
+
Returns:
A negative value on error.
+AngelScript will call this function to request the compilation of a script function. The JIT compiler should produce the native machine code representation of the function and update the JitEntry instructions in the byte code to allow the VM to transfer the control to the JIT compiled function. +
+

+ +

+
+ + + + + + + + + +
virtual void asIJITCompiler::ReleaseJITFunction (asJITFunction  func  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] func Pointer to the JIT function
+
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_j_i_t_compiler-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_j_i_t_compiler-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_j_i_t_compiler-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_j_i_t_compiler-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ + + +AngelScript: Member List + + + + +
+

asIJITCompiler Member List

This is the complete list of members for asIJITCompiler, including all inherited members.

+ + +
CompileFunction(asIScriptFunction *function, asJITFunction *output)=0asIJITCompiler [pure virtual]
ReleaseJITFunction(asJITFunction func)=0asIJITCompiler [pure virtual]

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_object_type.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_object_type.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_object_type.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_object_type.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,759 @@ + + +AngelScript: asIObjectType Class Reference + + + + +
+

asIObjectType Class Reference

The interface for an object type. + +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

Miscellaneous
virtual asIScriptEngineGetEngine () const =0
 Returns a pointer to the script engine.
virtual const char * GetConfigGroup () const =0
 Returns the config group in which the type was registered.
Memory management
virtual int AddRef ()=0
 Increases the reference counter.
virtual int Release ()=0
 Decrease reference counter.
Type info
virtual const char * GetName () const =0
 Returns a temporary pointer to the name of the datatype.
virtual asIObjectTypeGetBaseType () const =0
 Returns the object type that this type derives from.
virtual asDWORD GetFlags () const =0
 Returns the object type flags.
virtual asUINT GetSize () const =0
 Returns the size of the object type.
virtual int GetTypeId () const =0
 Returns the type id for the object type.
virtual int GetSubTypeId () const =0
 Returns the type id of the template sub type.
Interfaces
virtual int GetInterfaceCount () const =0
 Returns the number of interfaces implemented.
virtual asIObjectTypeGetInterface (asUINT index) const =0
 Returns a temporary pointer to the specified interface or null if none are found.
Factories
virtual int GetFactoryCount () const =0
 Returns the number of factory functions for the object type.
virtual int GetFactoryIdByIndex (int index) const =0
 Returns the factory id by index.
virtual int GetFactoryIdByDecl (const char *decl) const =0
 Returns the factory id by declaration.
Methods
virtual int GetMethodCount () const =0
 Returns the number of methods for the object type.
virtual int GetMethodIdByIndex (int index) const =0
 Returns the method id by index.
virtual int GetMethodIdByName (const char *name) const =0
 Returns the method id by name.
virtual int GetMethodIdByDecl (const char *decl) const =0
 Returns the method id by declaration.
virtual asIScriptFunctionGetMethodDescriptorByIndex (int index) const =0
 Returns the function descriptor for the script method.
Properties
virtual int GetPropertyCount () const =0
 Returns the number of properties that the object contains.
virtual int GetPropertyTypeId (asUINT prop) const =0
 Returns the type id of the property referenced by prop.
virtual const char * GetPropertyName (asUINT prop) const =0
 Returns the name of the property referenced by prop.
virtual int GetPropertyOffset (asUINT prop) const =0
 Returns the offset of the property in the memory layout.
Behaviours
virtual int GetBehaviourCount () const =0
 Returns the number of behaviours.
virtual int GetBehaviourByIndex (asUINT index, asEBehaviours *outBehaviour) const =0
 Returns the function id and type of the behaviour.
+


Member Function Documentation

+ +
+
+ + + + + + + + +
virtual int asIObjectType::AddRef (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when storing an additional reference to the object. +
+

+ +

+
+ + + + + + + + +
virtual asIObjectType* asIObjectType::GetBaseType (  )  const [pure virtual]
+
+
+ +

+

Returns:
A pointer to the object type that this type derives from.
+This method will only return a pointer in case of script classes that derives from another script class. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIObjectType::GetBehaviourByIndex (asUINT  index,
asEBehaviours outBehaviour 
) const [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] index The index of the behaviour.
[out] outBehaviour Receives the type of the behaviour.
+
+
Returns:
The function id of the behaviour.
+
Return values:
+ + +
asINVALID_ARG The index is too large.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIObjectType::GetBehaviourCount (  )  const [pure virtual]
+
+
+ +

+

Returns:
The number of behaviours for this type.
+ +
+

+ +

+
+ + + + + + + + +
virtual const char* asIObjectType::GetConfigGroup (  )  const [pure virtual]
+
+
+ +

+

Returns:
The name of the config group, or null if not set.
+ +
+

+ +

+
+ + + + + + + + +
virtual asIScriptEngine* asIObjectType::GetEngine (  )  const [pure virtual]
+
+
+ +

+

Returns:
A pointer to the engine.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIObjectType::GetFactoryCount (  )  const [pure virtual]
+
+
+ +

+

Returns:
A negative value on error, or the number of factory functions for this object.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIObjectType::GetFactoryIdByDecl (const char *  decl  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] decl The factory signature.
+
+
Returns:
A negative value on error, or the factory id.
+
Return values:
+ + + + +
asNO_FUNCTION Didn't find any matching functions.
asINVALID_DECLARATION decl is not a valid declaration.
asERROR The module for the type was not built successfully.
+
+The factory function is named after the object type and returns a handle to the object. Example:

+

 id = type->GetFactoryIdByDecl("object@ object(int arg1, int arg2)");
+
+
+

+ +

+
+ + + + + + + + + +
virtual int asIObjectType::GetFactoryIdByIndex (int  index  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the factory function.
+
+
Returns:
A negative value on error, or the factory id.
+
Return values:
+ + +
asINVALID_ARG index is out of bounds.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual asDWORD asIObjectType::GetFlags (  )  const [pure virtual]
+
+
+ +

+

Returns:
A bit mask with the flags from asEObjTypeFlags.
+Script classes are identified by having the asOBJ_SCRIPT_OBJECT flag set. Interfaces are identified as a script class with a size of zero.

+

See also:
GetSize
+ +
+

+ +

+
+ + + + + + + + + +
virtual asIObjectType* asIObjectType::GetInterface (asUINT  index  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The interface index.
+
+
Returns:
A pointer to the interface type.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIObjectType::GetInterfaceCount (  )  const [pure virtual]
+
+
+ +

+

Returns:
The number of interfaces implemented by this type.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIObjectType::GetMethodCount (  )  const [pure virtual]
+
+
+ +

+

Returns:
A negative value on error, or the number of methods for this object.
+ +
+

+ +

+
+ + + + + + + + + +
virtual asIScriptFunction* asIObjectType::GetMethodDescriptorByIndex (int  index  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the method.
+
+
Returns:
A pointer to the method description interface, or null if not found.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIObjectType::GetMethodIdByDecl (const char *  decl  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] decl The method signature.
+
+
Returns:
A negative value on error, or the method id.
+
Return values:
+ + + + + +
asMULTIPLE_FUNCTIONS Found multiple matching methods.
asNO_FUNCTION Didn't find any matching method.
asINVALID_DECLARATION decl is not a valid declaration.
asERROR The module for the type was not built successfully.
+
+This method should be used to retrieve the ID of the script method for the object that you wish to execute. The ID is then sent to the context's Prepare method.

+The method will find the script method with the exact same declaration. +

+

+ +

+
+ + + + + + + + + +
virtual int asIObjectType::GetMethodIdByIndex (int  index  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the method.
+
+
Returns:
A negative value on error, or the method id.
+
Return values:
+ + +
asINVALID_ARG index is out of bounds.
+
+This method should be used to retrieve the ID of the script method for the object that you wish to execute. The ID is then sent to the context's Prepare method. +
+

+ +

+
+ + + + + + + + + +
virtual int asIObjectType::GetMethodIdByName (const char *  name  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] name The name of the method.
+
+
Returns:
A negative value on error, or the method id.
+
Return values:
+ + + +
asMULTIPLE_FUNCTIONS Found multiple matching methods.
asNO_FUNCTION Didn't find any matching method.
+
+This method should be used to retrieve the ID of the script method for the object that you wish to execute. The ID is then sent to the context's Prepare method. +
+

+ +

+
+ + + + + + + + +
virtual const char* asIObjectType::GetName (  )  const [pure virtual]
+
+
+ +

+

Returns:
A null terminated string with the name of the object type.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIObjectType::GetPropertyCount (  )  const [pure virtual]
+
+
+ +

+

Returns:
The number of member properties of the script object.
+ +
+

+ +

+
+ + + + + + + + + +
virtual const char* asIObjectType::GetPropertyName (asUINT  prop  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] prop The property index.
+
+
Returns:
A null terminated string with the property name.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIObjectType::GetPropertyOffset (asUINT  prop  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] prop The property index.
+
+
Returns:
The offset of the property in the memory layout.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIObjectType::GetPropertyTypeId (asUINT  prop  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] prop The property index.
+
+
Returns:
The type id of the member property, or a negative value on error.
+
Return values:
+ + +
asINVALID_ARG prop is too large
+
+ +
+

+ +

+
+ + + + + + + + +
virtual asUINT asIObjectType::GetSize (  )  const [pure virtual]
+
+
+ +

+

Returns:
The number of bytes necessary to store instances of this type.
+Application registered reference types doesn't store this information, as the script engine doesn't allocate memory for these itself. +
+

+ +

+
+ + + + + + + + +
virtual int asIObjectType::GetSubTypeId (  )  const [pure virtual]
+
+
+ +

+

Returns:
The type id of the template sub type, or a negative value on error.
+
Return values:
+ + +
asERROR The type is not a template type.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIObjectType::GetTypeId (  )  const [pure virtual]
+
+
+ +

+

Returns:
The type id for the object type.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIObjectType::Release (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when you will no longer use the references that you own. +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_object_type-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_object_type-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_object_type-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_object_type-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,41 @@ + + +AngelScript: Member List + + + + +
+

asIObjectType Member List

This is the complete list of members for asIObjectType, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
AddRef()=0asIObjectType [pure virtual]
GetBaseType() const =0asIObjectType [pure virtual]
GetBehaviourByIndex(asUINT index, asEBehaviours *outBehaviour) const =0asIObjectType [pure virtual]
GetBehaviourCount() const =0asIObjectType [pure virtual]
GetConfigGroup() const =0asIObjectType [pure virtual]
GetEngine() const =0asIObjectType [pure virtual]
GetFactoryCount() const =0asIObjectType [pure virtual]
GetFactoryIdByDecl(const char *decl) const =0asIObjectType [pure virtual]
GetFactoryIdByIndex(int index) const =0asIObjectType [pure virtual]
GetFlags() const =0asIObjectType [pure virtual]
GetInterface(asUINT index) const =0asIObjectType [pure virtual]
GetInterfaceCount() const =0asIObjectType [pure virtual]
GetMethodCount() const =0asIObjectType [pure virtual]
GetMethodDescriptorByIndex(int index) const =0asIObjectType [pure virtual]
GetMethodIdByDecl(const char *decl) const =0asIObjectType [pure virtual]
GetMethodIdByIndex(int index) const =0asIObjectType [pure virtual]
GetMethodIdByName(const char *name) const =0asIObjectType [pure virtual]
GetName() const =0asIObjectType [pure virtual]
GetPropertyCount() const =0asIObjectType [pure virtual]
GetPropertyName(asUINT prop) const =0asIObjectType [pure virtual]
GetPropertyOffset(asUINT prop) const =0asIObjectType [pure virtual]
GetPropertyTypeId(asUINT prop) const =0asIObjectType [pure virtual]
GetSize() const =0asIObjectType [pure virtual]
GetSubTypeId() const =0asIObjectType [pure virtual]
GetTypeId() const =0asIObjectType [pure virtual]
Release()=0asIObjectType [pure virtual]

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_array.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_array.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_array.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_array.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,256 @@ + + +AngelScript: asIScriptArray Class Reference + + + + +
+

asIScriptArray Class Reference

The interface for a script array object. + +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

virtual asIScriptEngineGetEngine () const =0
 Return the script engine.
virtual int AddRef ()=0
 Increase reference counter.
virtual int Release ()=0
 Decrease reference counter.
virtual int GetArrayTypeId ()=0
 Returns the type id of the array object.
virtual int GetElementTypeId ()=0
 Returns the type id of the contained elements.
virtual asUINT GetElementCount ()=0
 Returns the size of the array.
virtual void * GetElementPointer (asUINT index)=0
 Returns a pointer to the element referenced by index.
virtual void Resize (asUINT size)=0
 Resizes the array.
virtual int CopyFrom (asIScriptArray *other)=0
 Copies the elements from another array, overwriting the current content.
+


Member Function Documentation

+ +
+
+ + + + + + + + +
virtual int asIScriptArray::AddRef (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when storing an additional reference to the object. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptArray::CopyFrom (asIScriptArray other  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] other A pointer to the source array.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + +
asINVALID_ARG The argument is null.
asINVALID_TYPE The other array is of different type.
+
+This method copies the contents of the other object to this one. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptArray::GetArrayTypeId (  )  [pure virtual]
+
+
+ +

+

Returns:
The type id of the array object.
+ +
+

+ +

+
+ + + + + + + + +
virtual asUINT asIScriptArray::GetElementCount (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of elements in the array.
+ +
+

+ +

+
+ + + + + + + + + +
virtual void* asIScriptArray::GetElementPointer (asUINT  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The element index.
+
+
Returns:
A pointer to the element value.
+The method returns a pointer to the memory location for the element. Use the type id for the element to determine the content of the pointer, and how to handle it. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptArray::GetElementTypeId (  )  [pure virtual]
+
+
+ +

+

Returns:
The type id of the array elements.
+ +
+

+ +

+
+ + + + + + + + +
virtual asIScriptEngine* asIScriptArray::GetEngine (  )  const [pure virtual]
+
+
+ +

+

Returns:
The script engine.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptArray::Release (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when you will no longer use the references that you own. +
+

+ +

+
+ + + + + + + + + +
virtual void asIScriptArray::Resize (asUINT  size  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] size The new size of the array.
+
+This method allows the application to resize the array. +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_array-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_array-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_array-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_array-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,24 @@ + + +AngelScript: Member List + + + + +
+

asIScriptArray Member List

This is the complete list of members for asIScriptArray, including all inherited members.

+ + + + + + + + + +
AddRef()=0asIScriptArray [pure virtual]
CopyFrom(asIScriptArray *other)=0asIScriptArray [pure virtual]
GetArrayTypeId()=0asIScriptArray [pure virtual]
GetElementCount()=0asIScriptArray [pure virtual]
GetElementPointer(asUINT index)=0asIScriptArray [pure virtual]
GetElementTypeId()=0asIScriptArray [pure virtual]
GetEngine() const =0asIScriptArray [pure virtual]
Release()=0asIScriptArray [pure virtual]
Resize(asUINT size)=0asIScriptArray [pure virtual]

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_context.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_context.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_context.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_context.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1633 @@ + + +AngelScript: asIScriptContext Class Reference + + + + +
+

asIScriptContext Class Reference

The interface to the virtual machine. + +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

Memory management
virtual int AddRef ()=0
 Increase reference counter.
virtual int Release ()=0
 Decrease reference counter.
Miscellaneous
virtual asIScriptEngineGetEngine ()=0
 Returns a pointer to the engine.
Execution
virtual int Prepare (int funcId)=0
 Prepares the context for execution of the function identified by funcId.
virtual int Unprepare ()=0
 Frees resources held by the context.
virtual int SetObject (void *obj)=0
 Sets the object for a class method call.
virtual int Execute ()=0
 Executes the prepared function.
virtual int Abort ()=0
 Aborts the execution.
virtual int Suspend ()=0
 Suspends the execution, which can then be resumed by calling Execute again.
virtual asEContextState GetState ()=0
 Returns the state of the context.
Arguments
virtual int SetArgByte (asUINT arg, asBYTE value)=0
 Sets an 8-bit argument value.
virtual int SetArgWord (asUINT arg, asWORD value)=0
 Sets a 16-bit argument value.
virtual int SetArgDWord (asUINT arg, asDWORD value)=0
 Sets a 32-bit integer argument value.
virtual int SetArgQWord (asUINT arg, asQWORD value)=0
 Sets a 64-bit integer argument value.
virtual int SetArgFloat (asUINT arg, float value)=0
 Sets a float argument value.
virtual int SetArgDouble (asUINT arg, double value)=0
 Sets a double argument value.
virtual int SetArgAddress (asUINT arg, void *addr)=0
 Sets the address of a reference or handle argument.
virtual int SetArgObject (asUINT arg, void *obj)=0
 Sets the object argument value.
virtual void * GetAddressOfArg (asUINT arg)=0
 Returns a pointer to the argument for assignment.
Return value
virtual asBYTE GetReturnByte ()=0
 Returns the 8-bit return value.
virtual asWORD GetReturnWord ()=0
 Returns the 16-bit return value.
virtual asDWORD GetReturnDWord ()=0
 Returns the 32-bit return value.
virtual asQWORD GetReturnQWord ()=0
 Returns the 64-bit return value.
virtual float GetReturnFloat ()=0
 Returns the float return value.
virtual double GetReturnDouble ()=0
 Returns the double return value.
virtual void * GetReturnAddress ()=0
 Returns the address for a reference or handle return type.
virtual void * GetReturnObject ()=0
 Return a pointer to the returned object.
virtual void * GetAddressOfReturnValue ()=0
 Returns the address of the returned value.
Exception handling
virtual int SetException (const char *string)=0
 Sets an exception, which aborts the execution.
virtual int GetExceptionLineNumber (int *column=0)=0
 Returns the line number where the exception occurred.
virtual int GetExceptionFunction ()=0
 Returns the function id of the function where the exception occurred.
virtual const char * GetExceptionString ()=0
 Returns the exception string text.
virtual int SetExceptionCallback (asSFuncPtr callback, void *obj, int callConv)=0
 Sets an exception callback function. The function will be called if a script exception occurs.
virtual void ClearExceptionCallback ()=0
Debugging
virtual int SetLineCallback (asSFuncPtr callback, void *obj, int callConv)=0
 Sets a line callback function. The function will be called for each executed script statement.
virtual void ClearLineCallback ()=0
virtual int GetCurrentLineNumber (int *column=0)=0
 Get the current line number that is being executed.
virtual int GetCurrentFunction ()=0
 Get the current function that is being executed.
virtual int GetCallstackSize ()=0
 Returns the size of the callstack, i.e. the number of functions that have yet to complete.
virtual int GetCallstackFunction (int index)=0
 Returns the function id at the specified callstack level.
virtual int GetCallstackLineNumber (int index, int *column=0)=0
 Returns the line number at the specified callstack level.
virtual int GetVarCount (int stackLevel=-1)=0
 Returns the number of local variables at the specified callstack level.
virtual const char * GetVarName (int varIndex, int stackLevel=-1)=0
 Returns the name of local variable at the specified callstack level.
virtual const char * GetVarDeclaration (int varIndex, int stackLevel=-1)=0
 Returns the declaration of a local variable at the specified callstack level.
virtual int GetVarTypeId (int varIndex, int stackLevel=-1)=0
 Returns the type id of a local variable at the specified callstack level.
virtual void * GetAddressOfVar (int varIndex, int stackLevel=-1)=0
 Returns a pointer to a local variable at the specified callstack level.
virtual int GetThisTypeId (int stackLevel=-1)=0
 Returns the type id of the object, if a class method is being executed.
virtual void * GetThisPointer (int stackLevel=-1)=0
 Returns a pointer to the object, if a class method is being executed.
User data
virtual void * SetUserData (void *data)=0
 Register the memory address of some user data.
virtual void * GetUserData ()=0
 Returns the address of the previously registered user data.
+


Member Function Documentation

+ +
+
+ + + + + + + + +
virtual int asIScriptContext::Abort (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error.
+
Return values:
+ + +
asERROR Invalid context object.
+
+Aborts the current execution of a script. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptContext::AddRef (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when storing an additional reference to the object. Remember that the first reference that is received from asIScriptEngine::CreateContext is already accounted for. +
+

+ +

+
+ + + + + + + + +
virtual void asIScriptContext::ClearExceptionCallback (  )  [pure virtual]
+
+
+ +

+Removes a previously registered callback. +

+

+ +

+
+ + + + + + + + +
virtual void asIScriptContext::ClearLineCallback (  )  [pure virtual]
+
+
+ +

+Removes a previously registered callback. +

+

+ +

+
+ + + + + + + + +
virtual int asIScriptContext::Execute (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error, or one of asEContextState.
+
Return values:
+ + + + + + +
asERROR Invalid context object, the context is not prepared, or it is not in suspended state.
asEXECUTION_ABORTED The execution was aborted with a call to Abort.
asEXECUTION_SUSPENDED The execution was suspended with a call to Suspend.
asEXECUTION_FINISHED The execution finished successfully.
asEXECUTION_EXCEPTION The execution ended with an exception.
+
+Executes the prepared function until the script returns. If the execution was previously suspended the function resumes where it left of.

+Note that if the script freezes, e.g. if trapped in a never ending loop, you may call Abort from another thread to stop execution.

+

See also:
Calling a script function
+ +
+

+ +

+
+ + + + + + + + + +
virtual void* asIScriptContext::GetAddressOfArg (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
A pointer to the argument on the stack.
+This method returns a pointer to the argument on the stack for assignment. For object handles, you should increment the reference counter. For object values, you should pass a pointer to a copy of the object. +
+

+ +

+
+ + + + + + + + +
virtual void* asIScriptContext::GetAddressOfReturnValue (  )  [pure virtual]
+
+
+ +

+

Returns:
A pointer to the return value returned from the script function, or 0 on error.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual void* asIScriptContext::GetAddressOfVar (int  varIndex,
int  stackLevel = -1 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] varIndex The index of the variable.
[in] stackLevel The index on the call stack.
+
+
Returns:
A pointer to the variable.
+Returns a pointer to the variable, so that its value can be read and written. The address is valid until the script function returns.

+Note that object variables may not be initalized at all moments, thus you must verify if the address returned points to a null pointer, before you try to dereference it. +

+

+ +

+
+ + + + + + + + + +
virtual int asIScriptContext::GetCallstackFunction (int  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index on the call stack.
+
+
Returns:
The function id on the call stack referred to by the index.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::GetCallstackLineNumber (int  index,
int *  column = 0 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] index The index on the call stack.
[out] column The variable will receive the column number.
+
+
Returns:
The line number for the call stack level referred to by the index.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptContext::GetCallstackSize (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of functions on the call stack.
+This methods returns the size of the callstack, i.e. how many parent functions there are above the current functions being called. It can be used to enumerate the callstack in order to generate a detailed report when an exception occurs, or for debugging running scripts. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptContext::GetCurrentFunction (  )  [pure virtual]
+
+
+ +

+

Returns:
The function id of the current function.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptContext::GetCurrentLineNumber (int *  column = 0  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[out] column The variable will receive the column number.
+
+
Returns:
The current line number.
+This method returns the line number where the context is currently located. The line number is relative to the script section where the function was implemented. +
+

+ +

+
+ + + + + + + + +
virtual asIScriptEngine* asIScriptContext::GetEngine (  )  [pure virtual]
+
+
+ +

+

Returns:
A pointer to the engine.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptContext::GetExceptionFunction (  )  [pure virtual]
+
+
+ +

+

Returns:
The function id where the exception occurred.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptContext::GetExceptionLineNumber (int *  column = 0  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[out] column The variable will receive the column number.
+
+
Returns:
The line number where the exception occurred.
+This method returns the line number where the exception ocurred. The line number is relative to the script section where the function was implemented. +
+

+ +

+
+ + + + + + + + +
virtual const char* asIScriptContext::GetExceptionString (  )  [pure virtual]
+
+
+ +

+

Returns:
A null terminated string describing the exception that occurred.
+ +
+

+ +

+
+ + + + + + + + +
virtual void* asIScriptContext::GetReturnAddress (  )  [pure virtual]
+
+
+ +

+

Returns:
The address value returned from the script function, or 0 on error. The method doesn't increase the reference counter with this call, so if you store the pointer of a reference counted object you need to increase the reference manually otherwise the object will be released when the context is released or reused.
+ +
+

+ +

+
+ + + + + + + + +
virtual asBYTE asIScriptContext::GetReturnByte (  )  [pure virtual]
+
+
+ +

+

Returns:
The 1 byte value returned from the script function, or 0 on error.
+ +
+

+ +

+
+ + + + + + + + +
virtual double asIScriptContext::GetReturnDouble (  )  [pure virtual]
+
+
+ +

+

Returns:
The double value returned from the script function, or 0 on error.
+ +
+

+ +

+
+ + + + + + + + +
virtual asDWORD asIScriptContext::GetReturnDWord (  )  [pure virtual]
+
+
+ +

+

Returns:
The 4 byte value returned from the script function, or 0 on error.
+ +
+

+ +

+
+ + + + + + + + +
virtual float asIScriptContext::GetReturnFloat (  )  [pure virtual]
+
+
+ +

+

Returns:
The float value returned from the script function, or 0 on error.
+ +
+

+ +

+
+ + + + + + + + +
virtual void* asIScriptContext::GetReturnObject (  )  [pure virtual]
+
+
+ +

+

Returns:
A pointer to the object returned from the script function, or 0 on error. The method doesn't increase the reference counter with this call, so if you store the pointer of a reference counted object you need to increase the reference manually otherwise the object will be released when the context is released or reused.
+ +
+

+ +

+
+ + + + + + + + +
virtual asQWORD asIScriptContext::GetReturnQWord (  )  [pure virtual]
+
+
+ +

+

Returns:
The 8 byte value returned from the script function, or 0 on error.
+ +
+

+ +

+
+ + + + + + + + +
virtual asWORD asIScriptContext::GetReturnWord (  )  [pure virtual]
+
+
+ +

+

Returns:
The 2 byte value returned from the script function, or 0 on error.
+ +
+

+ +

+
+ + + + + + + + +
virtual asEContextState asIScriptContext::GetState (  )  [pure virtual]
+
+
+ +

+

Returns:
The current state of the context.
+ +
+

+ +

+
+ + + + + + + + + +
virtual void* asIScriptContext::GetThisPointer (int  stackLevel = -1  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] stackLevel The index on the call stack.
+
+
Returns:
Returns a pointer to the object if it is a class method.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptContext::GetThisTypeId (int  stackLevel = -1  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] stackLevel The index on the call stack.
+
+
Returns:
Returns the type id of the object if it is a class method.
+ +
+

+ +

+
+ + + + + + + + +
virtual void* asIScriptContext::GetUserData (  )  [pure virtual]
+
+
+ +

+

Returns:
The pointer to the user data.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptContext::GetVarCount (int  stackLevel = -1  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] stackLevel The index on the call stack.
+
+
Returns:
The number of variables in the function on the call stack level.
+Returns the number of declared variables, including the parameters, in the function on the stack. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual const char* asIScriptContext::GetVarDeclaration (int  varIndex,
int  stackLevel = -1 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] varIndex The index of the variable.
[in] stackLevel The index on the call stack.
+
+
Returns:
A null terminated string with the declaration of the variable.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual const char* asIScriptContext::GetVarName (int  varIndex,
int  stackLevel = -1 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] varIndex The index of the variable.
[in] stackLevel The index on the call stack.
+
+
Returns:
A null terminated string with the name of the variable.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::GetVarTypeId (int  varIndex,
int  stackLevel = -1 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] varIndex The index of the variable.
[in] stackLevel The index on the call stack.
+
+
Returns:
The type id of the variable, or a negative value on error.
+
Return values:
+ + +
asINVALID_ARG The index or stack level is invalid.
+
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptContext::Prepare (int  funcId  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] funcId The id of the function/method that will be executed.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + +
asCONTEXT_ACTIVE The context is still active or suspended.
asNO_FUNCTION The function id doesn't exist.
+
+This method prepares the context for execution of a script function. It allocates the stack space required and reserves space for return value and parameters. The default value for parameters and return value is 0.

+

See also:
Calling a script function
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptContext::Release (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when you will no longer use the references that you own. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::SetArgAddress (asUINT  arg,
void *  addr 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] arg The argument index.
[in] addr The address that should be passed in the argument.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asCONTEXT_NOT_PREPARED The context is not in prepared state.
asINVALID_ARG The arg is larger than the number of arguments in the prepared function.
asINVALID_TYPE The argument is not a reference or an object handle.
+
+Sets an address argument, e.g. an object handle or a reference. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::SetArgByte (asUINT  arg,
asBYTE  value 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] arg The argument index.
[in] value The value of the argument.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asCONTEXT_NOT_PREPARED The context is not in prepared state.
asINVALID_ARG The arg is larger than the number of arguments in the prepared function.
asINVALID_TYPE The argument is not an 8-bit value.
+
+Sets a 1 byte argument. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::SetArgDouble (asUINT  arg,
double  value 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] arg The argument index.
[in] value The value of the argument.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asCONTEXT_NOT_PREPARED The context is not in prepared state.
asINVALID_ARG The arg is larger than the number of arguments in the prepared function.
asINVALID_TYPE The argument is not a 64-bit value.
+
+Sets a double argument. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::SetArgDWord (asUINT  arg,
asDWORD  value 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] arg The argument index.
[in] value The value of the argument.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asCONTEXT_NOT_PREPARED The context is not in prepared state.
asINVALID_ARG The arg is larger than the number of arguments in the prepared function.
asINVALID_TYPE The argument is not a 32-bit value.
+
+Sets a 4 byte argument. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::SetArgFloat (asUINT  arg,
float  value 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] arg The argument index.
[in] value The value of the argument.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asCONTEXT_NOT_PREPARED The context is not in prepared state.
asINVALID_ARG The arg is larger than the number of arguments in the prepared function.
asINVALID_TYPE The argument is not a 32-bit value.
+
+Sets a float argument. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::SetArgObject (asUINT  arg,
void *  obj 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] arg The argument index.
[in] obj A pointer to the object.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asCONTEXT_NOT_PREPARED The context is not in prepared state.
asINVALID_ARG The arg is larger than the number of arguments in the prepared function.
asINVALID_TYPE The argument is not an object or handle.
+
+Sets an object argument. If the argument is an object handle AngelScript will increment the reference for the object. If the argument is an object value AngelScript will make a copy of the object. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::SetArgQWord (asUINT  arg,
asQWORD  value 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] arg The argument index.
[in] value The value of the argument.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asCONTEXT_NOT_PREPARED The context is not in prepared state.
asINVALID_ARG The arg is larger than the number of arguments in the prepared function.
asINVALID_TYPE The argument is not a 64-bit value.
+
+Sets an 8 byte argument. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::SetArgWord (asUINT  arg,
asWORD  value 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] arg The argument index.
[in] value The value of the argument.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asCONTEXT_NOT_PREPARED The context is not in prepared state.
asINVALID_ARG The arg is larger than the number of arguments in the prepared function.
asINVALID_TYPE The argument is not a 16-bit value.
+
+Sets a 2 byte argument. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptContext::SetException (const char *  string  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] string A string that describes the exception that occurred.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asERROR The context isn't currently calling an application registered function.
+
+This method sets a script exception in the context. This will only work if the context is currently calling a system function, thus this method can only be used for system functions.

+Note that if your system function sets an exception, it should not return any object references because the engine will not release the returned reference. +

+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::SetExceptionCallback (asSFuncPtr  callback,
void *  obj,
int  callConv 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] callback The callback function/method that should be called upon an exception.
[in] obj The object pointer on which the callback is called.
[in] callConv The calling convention of the callback function/method.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asNOT_SUPPORTED Calling convention must not be asCALL_GENERIC, or the routine's calling convention is not supported.
asINVALID_ARG obj must not be null for class methods.
asWRONG_CALLING_CONV callConv isn't compatible with the routines' calling convention.
+
+This callback function will be called by the VM when a script exception is raised, which allow the application to examine the callstack and generate a detailed report before the callstack is cleaned up.

+See SetLineCallback for details on the calling convention. +

+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptContext::SetLineCallback (asSFuncPtr  callback,
void *  obj,
int  callConv 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] callback The callback function/method that should be called for each script line executed.
[in] obj The object pointer on which the callback is called.
[in] callConv The calling convention of the callback function/method.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asNOT_SUPPORTED Calling convention must not be asCALL_GENERIC, or the routine's calling convention is not supported.
asINVALID_ARG obj must not be null for class methods.
asWRONG_CALLING_CONV callConv isn't compatible with the routines' calling convention.
+
+This function sets a callback function that will be called by the VM each time the SUSPEND instruction is encounted. Generally this instruction is placed before each statement. Thus by setting this callback function it is possible to monitor the execution, and suspend the execution at application defined locations.

+The callback function can be either a global function or a class method. For a global function the VM will pass two parameters, first the context pointer and then the object pointer specified by the application. For a class method, the VM will call the method using the object pointer as the owner.

+

 void Callback(asIScriptContext *ctx, void *obj);
+ void Object::Callback(asIScriptContext *ctx);
+

+The global function can use either asCALL_CDECL or asCALL_STDCALL, and the class method can use either asCALL_THISCALL, asCALL_CDECL_OBJLAST, or asCALL_CDECL_OBJFIRST.

+

See also:
Debugging scripts
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptContext::SetObject (void *  obj  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] obj A pointer to the object.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + +
asCONTEXT_NOT_PREPARED The context is not in prepared state.
asERROR The prepared function is not a class method.
+
+This method sets object pointer when calling class methods. +
+

+ +

+
+ + + + + + + + + +
virtual void* asIScriptContext::SetUserData (void *  data  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] data A pointer to the user data.
+
+
Returns:
The previous pointer stored in the context.
+This method allows the application to associate a value, e.g. a pointer, with the context instance. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptContext::Suspend (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error.
+
Return values:
+ + +
asERROR Invalid context object.
+
+Suspends the current execution of a script. The execution can then be resumed by calling Execute again.

+

See also:
Calling a script function
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptContext::Unprepare (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error.
+
Return values:
+ + +
asCONTEXT_ACTIVE The context is still active or suspended.
+
+This function frees resources held by the context. It's usually not necessary to call this function as the resources are automatically freed when the context is released, or reused when Prepare is called again. +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_context-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_context-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_context-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_context-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,65 @@ + + +AngelScript: Member List + + + + +
+

asIScriptContext Member List

This is the complete list of members for asIScriptContext, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Abort()=0asIScriptContext [pure virtual]
AddRef()=0asIScriptContext [pure virtual]
ClearExceptionCallback()=0asIScriptContext [pure virtual]
ClearLineCallback()=0asIScriptContext [pure virtual]
Execute()=0asIScriptContext [pure virtual]
GetAddressOfArg(asUINT arg)=0asIScriptContext [pure virtual]
GetAddressOfReturnValue()=0asIScriptContext [pure virtual]
GetAddressOfVar(int varIndex, int stackLevel=-1)=0asIScriptContext [pure virtual]
GetCallstackFunction(int index)=0asIScriptContext [pure virtual]
GetCallstackLineNumber(int index, int *column=0)=0asIScriptContext [pure virtual]
GetCallstackSize()=0asIScriptContext [pure virtual]
GetCurrentFunction()=0asIScriptContext [pure virtual]
GetCurrentLineNumber(int *column=0)=0asIScriptContext [pure virtual]
GetEngine()=0asIScriptContext [pure virtual]
GetExceptionFunction()=0asIScriptContext [pure virtual]
GetExceptionLineNumber(int *column=0)=0asIScriptContext [pure virtual]
GetExceptionString()=0asIScriptContext [pure virtual]
GetReturnAddress()=0asIScriptContext [pure virtual]
GetReturnByte()=0asIScriptContext [pure virtual]
GetReturnDouble()=0asIScriptContext [pure virtual]
GetReturnDWord()=0asIScriptContext [pure virtual]
GetReturnFloat()=0asIScriptContext [pure virtual]
GetReturnObject()=0asIScriptContext [pure virtual]
GetReturnQWord()=0asIScriptContext [pure virtual]
GetReturnWord()=0asIScriptContext [pure virtual]
GetState()=0asIScriptContext [pure virtual]
GetThisPointer(int stackLevel=-1)=0asIScriptContext [pure virtual]
GetThisTypeId(int stackLevel=-1)=0asIScriptContext [pure virtual]
GetUserData()=0asIScriptContext [pure virtual]
GetVarCount(int stackLevel=-1)=0asIScriptContext [pure virtual]
GetVarDeclaration(int varIndex, int stackLevel=-1)=0asIScriptContext [pure virtual]
GetVarName(int varIndex, int stackLevel=-1)=0asIScriptContext [pure virtual]
GetVarTypeId(int varIndex, int stackLevel=-1)=0asIScriptContext [pure virtual]
Prepare(int funcId)=0asIScriptContext [pure virtual]
Release()=0asIScriptContext [pure virtual]
SetArgAddress(asUINT arg, void *addr)=0asIScriptContext [pure virtual]
SetArgByte(asUINT arg, asBYTE value)=0asIScriptContext [pure virtual]
SetArgDouble(asUINT arg, double value)=0asIScriptContext [pure virtual]
SetArgDWord(asUINT arg, asDWORD value)=0asIScriptContext [pure virtual]
SetArgFloat(asUINT arg, float value)=0asIScriptContext [pure virtual]
SetArgObject(asUINT arg, void *obj)=0asIScriptContext [pure virtual]
SetArgQWord(asUINT arg, asQWORD value)=0asIScriptContext [pure virtual]
SetArgWord(asUINT arg, asWORD value)=0asIScriptContext [pure virtual]
SetException(const char *string)=0asIScriptContext [pure virtual]
SetExceptionCallback(asSFuncPtr callback, void *obj, int callConv)=0asIScriptContext [pure virtual]
SetLineCallback(asSFuncPtr callback, void *obj, int callConv)=0asIScriptContext [pure virtual]
SetObject(void *obj)=0asIScriptContext [pure virtual]
SetUserData(void *data)=0asIScriptContext [pure virtual]
Suspend()=0asIScriptContext [pure virtual]
Unprepare()=0asIScriptContext [pure virtual]

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_engine.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_engine.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_engine.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_engine.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2336 @@ + + +AngelScript: asIScriptEngine Class Reference + + + + +
+

asIScriptEngine Class Reference

The engine interface. + +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

Memory management
virtual int AddRef ()=0
 Increase reference counter.
virtual int Release ()=0
 Decrease reference counter.
Engine properties
virtual int SetEngineProperty (asEEngineProp property, asPWORD value)=0
 Dynamically change some engine properties.
virtual asPWORD GetEngineProperty (asEEngineProp property)=0
 Retrieve current engine property settings.
Compiler messages
virtual int SetMessageCallback (const asSFuncPtr &callback, void *obj, asDWORD callConv)=0
 Sets a message callback that will receive compiler messages.
virtual int ClearMessageCallback ()=0
 Clears the registered message callback routine.
virtual int WriteMessage (const char *section, int row, int col, asEMsgType type, const char *message)=0
 Writes a message to the message callback.
JIT compiler
+virtual int SetJITCompiler (asIJITCompiler *compiler)=0
 Sets the JIT compiler.
+virtual asIJITCompilerGetJITCompiler ()=0
 Returns the JIT compiler.
Global functions
virtual int RegisterGlobalFunction (const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv)=0
 Registers a global function.
virtual int GetGlobalFunctionCount ()=0
 Returns the number of registered functions.
virtual int GetGlobalFunctionIdByIndex (asUINT index)=0
 Returns the function id of the registered function.
Global properties
virtual int RegisterGlobalProperty (const char *declaration, void *pointer)=0
 Registers a global property.
virtual int GetGlobalPropertyCount ()=0
 Returns the number of registered global properties.
virtual int GetGlobalPropertyByIndex (asUINT index, const char **name, int *typeId=0, bool *isConst=0, const char **configGroup=0, void **pointer=0)=0
 Returns the detail on the registered global property.
Object types
virtual int RegisterObjectType (const char *obj, int byteSize, asDWORD flags)=0
 Registers a new object type.
virtual int RegisterObjectProperty (const char *obj, const char *declaration, int byteOffset)=0
 Registers a property for the object type.
virtual int RegisterObjectMethod (const char *obj, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv)=0
 Registers a method for the object type.
virtual int RegisterObjectBehaviour (const char *obj, asEBehaviours behaviour, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv)=0
 Registers a behaviour for the object type.
virtual int RegisterInterface (const char *name)=0
 Registers an interface.
virtual int RegisterInterfaceMethod (const char *intf, const char *declaration)=0
 Registers an interface method.
virtual int GetObjectTypeCount ()=0
 Returns the number of registered object types.
virtual asIObjectTypeGetObjectTypeByIndex (asUINT index)=0
 Returns the object type interface by index.
String factory
virtual int RegisterStringFactory (const char *datatype, const asSFuncPtr &factoryFunc, asDWORD callConv)=0
 Registers the string factory.
virtual int GetStringFactoryReturnTypeId ()=0
 Returns the type id of the type that the string factory returns.
Enums
virtual int RegisterEnum (const char *type)=0
 Registers an enum type.
virtual int RegisterEnumValue (const char *type, const char *name, int value)=0
 Registers an enum value.
virtual int GetEnumCount ()=0
 Returns the number of registered enum types.
virtual const char * GetEnumByIndex (asUINT index, int *enumTypeId, const char **configGroup=0)=0
 Returns the registered enum type.
virtual int GetEnumValueCount (int enumTypeId)=0
 Returns the number of enum values for the enum type.
virtual const char * GetEnumValueByIndex (int enumTypeId, asUINT index, int *outValue)=0
 Returns the name and value of the enum value for the enum type.
Typedefs
virtual int RegisterTypedef (const char *type, const char *decl)=0
 Registers a typedef.
virtual int GetTypedefCount ()=0
 Returns the number of registered typedefs.
virtual const char * GetTypedefByIndex (asUINT index, int *typeId, const char **configGroup=0)=0
 Returns a registered typedef.
Configuration groups
virtual int BeginConfigGroup (const char *groupName)=0
 Starts a new dynamic configuration group.
virtual int EndConfigGroup ()=0
 Ends the configuration group.
virtual int RemoveConfigGroup (const char *groupName)=0
 Removes a previously registered configuration group.
virtual int SetConfigGroupModuleAccess (const char *groupName, const char *module, bool hasAccess)=0
 Tell AngelScript which modules have access to which configuration groups.
Script modules
virtual asIScriptModuleGetModule (const char *module, asEGMFlags flag=asGM_ONLY_IF_EXISTS)=0
 Return an interface pointer to the module.
virtual int DiscardModule (const char *module)=0
 Discard a module.
Script functions
virtual asIScriptFunctionGetFunctionDescriptorById (int funcId)=0
 Returns the function descriptor for the script function.
Type identification
virtual asIObjectTypeGetObjectTypeById (int typeId)=0
 Returns the object type interface for type.
virtual int GetTypeIdByDecl (const char *decl)=0
 Returns a type id by declaration.
virtual const char * GetTypeDeclaration (int typeId)=0
 Returns a type declaration.
virtual int GetSizeOfPrimitiveType (int typeId)=0
 Returns the size of a primitive type.
Script execution
virtual asIScriptContextCreateContext ()=0
 Creates a new script context.
virtual void * CreateScriptObject (int typeId)=0
 Creates a script object defined by its type id.
virtual void * CreateScriptObjectCopy (void *obj, int typeId)=0
 Creates a copy of a script object.
virtual void CopyScriptObject (void *dstObj, void *srcObj, int typeId)=0
 Copy one script object to another.
virtual void ReleaseScriptObject (void *obj, int typeId)=0
 Release the script object pointer.
virtual void AddRefScriptObject (void *obj, int typeId)=0
 Increase the reference counter for the script object.
virtual bool IsHandleCompatibleWithObject (void *obj, int objTypeId, int handleTypeId)=0
 Returns true if the object referenced by a handle compatible with the specified type.
String interpretation
virtual asETokenClass ParseToken (const char *string, size_t stringLength=0, int *tokenLength=0)=0
 Returns the class and length of the first token in the string.
Garbage collection
virtual int GarbageCollect (asDWORD flags=asGC_FULL_CYCLE)=0
 Perform garbage collection.
virtual void GetGCStatistics (asUINT *currentSize, asUINT *totalDestroyed=0, asUINT *totalDetected=0)=0
 Obtain statistics from the garbage collector.
virtual void NotifyGarbageCollectorOfNewObject (void *obj, int typeId)=0
 Notify the garbage collector of a new object that needs to be managed.
virtual void GCEnumCallback (void *reference)=0
 Used by the garbage collector to enumerate all references held by an object.
User data
virtual void * SetUserData (void *data)=0
 Register the memory address of some user data.
virtual void * GetUserData ()=0
 Returns the address of the previously registered user data.
Deprecated
virtual int ExecuteString (const char *module, const char *script, asIScriptContext **ctx=0, asDWORD flags=0)=0
+


Member Function Documentation

+ +
+
+ + + + + + + + +
virtual int asIScriptEngine::AddRef (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when storing an additional reference to the object. Remember that the first reference that is received from asCreateScriptEngine is already accounted for. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual void asIScriptEngine::AddRefScriptObject (void *  obj,
int  typeId 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] obj A pointer to the object.
[in] typeId The type id of the object.
+
+This calls the add ref method of the object to increase the reference count.

+This only works for objects. +

+

+ +

+
+ + + + + + + + + +
virtual int asIScriptEngine::BeginConfigGroup (const char *  groupName  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] groupName The name of the configuration group
+
+
Returns:
A negative value on error
+
Return values:
+ + + +
asNAME_TAKEN Another group with the same name already exists.
asNOT_SUPPORTED Nesting configuration groups is not supported.
+
+Starts a new dynamic configuration group. This group can be setup so that it is only visible to specific modules, and it can also be removed when it is no longer used. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptEngine::ClearMessageCallback (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error.
+Call this method to remove the message callback. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual void asIScriptEngine::CopyScriptObject (void *  dstObj,
void *  srcObj,
int  typeId 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] dstObj A pointer to the destination object.
[in] srcObj A pointer to the source object.
[in] typeId The type id of the objects.
+
+This calls the assignment operator to copy the object from one to the other.

+This only works for objects. +

+

+ +

+
+ + + + + + + + +
virtual asIScriptContext* asIScriptEngine::CreateContext (  )  [pure virtual]
+
+
+ +

+

Returns:
A pointer to the new script context.
+This method creates a context that will be used to execute the script functions. The context interface created will have its reference counter already increased. +
+

+ +

+
+ + + + + + + + + +
virtual void* asIScriptEngine::CreateScriptObject (int  typeId  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] typeId The type id of the object to create.
+
+
Returns:
A pointer to the new object if successful, or null if not.
+This method is used to create a script object based on it's type id. The method will allocate the memory and call the object's default constructor. Reference counted objects will have their reference counter set to 1 so the application needs to release the pointer when it will no longer use it.

+This only works for objects, for primitive types and object handles the method doesn't do anything and returns a null pointer. +

+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual void* asIScriptEngine::CreateScriptObjectCopy (void *  obj,
int  typeId 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] obj A pointer to the source object.
[in] typeId The type id of the object.
+
+
Returns:
A pointer to the new object if successful, or null if not.
+This method is used to create a copy of an existing object.

+This only works for objects, for primitive types and object handles the method doesn't do anything and returns a null pointer. +

+

+ +

+
+ + + + + + + + + +
virtual int asIScriptEngine::DiscardModule (const char *  module  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] module The name of the module
+
+
Returns:
A negative value on error
+
Return values:
+ + +
asNO_MODULE The module was not found.
+
+Discards a module and frees its memory. Any pointers that the application holds to this module will be invalid after this call. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptEngine::EndConfigGroup (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error
+
Return values:
+ + +
asNOT_SUPPORTED Can't end a group that hasn't been begun.
+
+Ends the current configuration group. Once finished a config group cannot be changed, but it can be removed when it is no longer used. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::ExecuteString (const char *  module,
const char *  script,
asIScriptContext **  ctx = 0,
asDWORD  flags = 0 
) [pure virtual]
+
+
+ +

+

Deprecated:
Since 2.18.0. Use the ExecuteString helper function instead.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptEngine::GarbageCollect (asDWORD  flags = asGC_FULL_CYCLE  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] flags Set to a combination of the asEGCFlags.
+
+
Returns:
1 if the cycle wasn't completed, 0 if it was.
+This method will free script objects that can no longer be reached. When the engine is released the garbage collector will automatically do a full cycle to release all objects still alive. If the engine is long living it is important to call this method every once in a while to free up memory allocated by the scripts. If a script does a lot of allocations before returning it may be necessary to implement a line callback function that calls the garbage collector during execution of the script.

+It is not necessary to do a full cycle with every call. This makes it possible to spread out the garbage collection time over a large period, thus not impacting the responsiveness of the application.

See also:
Garbage collection
+ +
+

+ +

+
+ + + + + + + + + +
virtual void asIScriptEngine::GCEnumCallback (void *  reference  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] reference A pointer to the referenced object.
+
+When processing the EnumReferences call the called object should call GCEnumCallback for each of the references it holds to other objects.

+

See also:
Garbage collected objects
+ +
+

+ +

+
+ + + + + + + + + +
virtual asPWORD asIScriptEngine::GetEngineProperty (asEEngineProp  property  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] property One of the asEEngineProp values.
+
+
Returns:
The value of the property, or 0 if it is an invalid property.
+Calling this method lets you determine the current value of the engine properties. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual const char* asIScriptEngine::GetEnumByIndex (asUINT  index,
int *  enumTypeId,
const char **  configGroup = 0 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] index The index of the enum type.
[out] enumTypeId Receives the type if of the enum type.
[out] configGroup Receives the config group in which the enum was registered.
+
+
Returns:
The name of the registered enum type, or null on error.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptEngine::GetEnumCount (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of registered enum types.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual const char* asIScriptEngine::GetEnumValueByIndex (int  enumTypeId,
asUINT  index,
int *  outValue 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] enumTypeId The type id of the enum type.
[in] index The index of the enum value.
[out] outValue Receives the value of the enum value.
+
+
Returns:
The name of the enum value.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptEngine::GetEnumValueCount (int  enumTypeId  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] enumTypeId The type id of the enum type.
+
+
Returns:
The number of enum values for the enum type.
+ +
+

+ +

+
+ + + + + + + + + +
virtual asIScriptFunction* asIScriptEngine::GetFunctionDescriptorById (int  funcId  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] funcId The id of the function or method.
+
+
Returns:
A pointer to the function description interface, or null if not found.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual void asIScriptEngine::GetGCStatistics (asUINT currentSize,
asUINT totalDestroyed = 0,
asUINT totalDetected = 0 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[out] currentSize The current number of objects known to the garbage collector.
[out] totalDestroyed The total number of objects destroyed by the garbage collector.
[out] totalDetected The total number of objects detected as garbage with circular references.
+
+This method can be used to query the number of objects that the garbage collector is keeping track of. If the number is very large then it is probably time to call the GarbageCollect method so that some of the objects ca be freed.

+

See also:
Garbage collection
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptEngine::GetGlobalFunctionCount (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of registered functions.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptEngine::GetGlobalFunctionIdByIndex (asUINT  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the registered global function.
+
+
Returns:
The id of the function, or a negative value on error.
+
Return values:
+ + +
asINVALID_ARG index is too large.
+
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::GetGlobalPropertyByIndex (asUINT  index,
const char **  name,
int *  typeId = 0,
bool *  isConst = 0,
const char **  configGroup = 0,
void **  pointer = 0 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + + + + +
[in] index The index of the global variable.
[out] name Receives the name of the property.
[out] typeId Receives the typeId of the property.
[out] isConst Receives the constness indicator of the property.
[out] configGroup Receives the config group in which the property was registered.
[out] pointer Receives the pointer of the property.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_ARG index is too large.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptEngine::GetGlobalPropertyCount (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of registered global properties.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual asIScriptModule* asIScriptEngine::GetModule (const char *  module,
asEGMFlags  flag = asGM_ONLY_IF_EXISTS 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] module The name of the module
[in] flag One of the asEGMFlags flags
+
+
Returns:
A pointer to the module interface
+Use this method to get access to the module interface, which will let you build new scripts, and enumerate functions and types in existing modules.

+If asGM_ALWAYS_CREATE is informed as the flag the previous module with the same name will be discarded, thus any pointers that the engine holds to it will be invalid after the call. +

+

+ +

+
+ + + + + + + + + +
virtual asIObjectType* asIScriptEngine::GetObjectTypeById (int  typeId  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] typeId The type id of the type.
+
+
Returns:
The object type interface for the type, or null if not found.
+ +
+

+ +

+
+ + + + + + + + + +
virtual asIObjectType* asIScriptEngine::GetObjectTypeByIndex (asUINT  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the type.
+
+
Returns:
The registered object type interface for the type, or null if not found.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptEngine::GetObjectTypeCount (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of object types registered by the application.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptEngine::GetSizeOfPrimitiveType (int  typeId  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] typeId The type id of the type.
+
+
Returns:
The size of the type in bytes.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptEngine::GetStringFactoryReturnTypeId (  )  [pure virtual]
+
+
+ +

+

Returns:
The type id of the type that the string type returns, or a negative value on error.
+
Return values:
+ + +
asNO_FUNCTION The string factory has not been registered.
+
+ +
+

+ +

+
+ + + + + + + + + +
virtual const char* asIScriptEngine::GetTypeDeclaration (int  typeId  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] typeId The type id of the type.
+
+
Returns:
A null terminated string with the type declaration, or null if not found.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual const char* asIScriptEngine::GetTypedefByIndex (asUINT  index,
int *  typeId,
const char **  configGroup = 0 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] index The index of the typedef.
[out] typeId The type that the typedef aliases.
[out] configGroup Receives the config group in which the type def was registered.
+
+
Returns:
The name of the typedef.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptEngine::GetTypedefCount (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of registered typedefs.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptEngine::GetTypeIdByDecl (const char *  decl  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] decl The declaration of the type.
+
+
Returns:
A negative value on error, or the type id of the type.
+
Return values:
+ + +
asINVALID_TYPE decl is not a valid type.
+
+Translates a type declaration into a type id. The returned type id is valid for as long as the type is valid, so you can safely store it for later use to avoid potential overhead by calling this function each time. Just remember to update the type id, any time the type is changed within the engine, e.g. when recompiling script declared classes, or changing the engine configuration.

+The type id is based on a sequence number and depends on the order in which the type ids are queried, thus is not guaranteed to always be the same for each execution of the application. The asETypeIdFlags can be used to obtain some information about the type directly from the id.

+A base type yields the same type id whether the declaration is const or not, however if the const is for the subtype then the type id is different, e.g. string@ isn't the same as const string@ but string is the same as const string.

+This method is only able to return the type id that are not specific for a script module, i.e. built-in types and application registered types. Type ids for script declared types should be obtained through the script module's GetTypeIdByDecl. +

+

+ +

+
+ + + + + + + + +
virtual void* asIScriptEngine::GetUserData (  )  [pure virtual]
+
+
+ +

+

Returns:
The pointer to the user data.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual bool asIScriptEngine::IsHandleCompatibleWithObject (void *  obj,
int  objTypeId,
int  handleTypeId 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] obj A pointer to the object.
[in] objTypeId The type id of the object.
[in] handleTypeId The type id of the handle.
+
+
Returns:
Returns true if the handle type is compatible with the object type.
+This method can be used to determine if a handle of a certain type is compatible with an object of another type. This is useful if you have a pointer to a object, but only knows that it implements a certain interface and now you want to determine if it implements another interface. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual void asIScriptEngine::NotifyGarbageCollectorOfNewObject (void *  obj,
int  typeId 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] obj A pointer to the newly created object.
[in] typeId The type id of the object.
+
+This method should be called when a new garbage collected object is created. The GC will then store a reference to the object so that it can automatically detect whether the object is involved in any circular references that should be released.

+

See also:
Garbage collected objects
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual asETokenClass asIScriptEngine::ParseToken (const char *  string,
size_t  stringLength = 0,
int *  tokenLength = 0 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] string The string to parse.
[in] stringLength The length of the string. Can be 0 if the string is null terminated.
[out] tokenLength Gives the length of the identified token.
+
+
Returns:
One of the asETokenClass values.
+This function is useful for those applications that want to tokenize strings into tokens that the script language uses, e.g. IDEs providing syntax highlighting, or intellisense. It can also be used to parse the meta data strings that may be declared for script entities. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptEngine::RegisterEnum (const char *  type  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] type The name of the enum type.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + + + +
asINVALID_NAME type is null.
asALREADY_REGISTERED Another type with this name already exists.
asERROR The type couldn't be parsed.
asINVALID_NAME The type is not an identifier, or it is a reserved keyword.
asNAME_TAKEN The type name is already taken.
+
+This method registers an enum type in the engine. The enum values should then be registered with RegisterEnumValue. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::RegisterEnumValue (const char *  type,
const char *  name,
int  value 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] type The name of the enum type.
[in] name The name of the enum value.
[in] value The integer value of the enum value.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asWRONG_CONFIG_GROUP The enum type was registered in a different configuration group.
asINVALID_TYPE The type is invalid.
asALREADY_REGISTERED The name is already registered for this enum.
+
+This method registers an enum value for a previously registered enum type. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::RegisterGlobalFunction (const char *  declaration,
const asSFuncPtr funcPointer,
asDWORD  callConv 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] declaration The declaration of the global function in script syntax.
[in] funcPointer The function pointer.
[in] callConv The calling convention for the function.
+
+
Returns:
A negative value on error, or the function id if successful.
+
Return values:
+ + + + + +
asNOT_SUPPORTED The calling convention is not supported.
asWRONG_CALLING_CONV The function's calling convention doesn't match callConv.
asINVALID_DECLARATION The function declaration is invalid.
asNAME_TAKEN The function name is already used elsewhere.
+
+This method registers system functions that the scripts may use to communicate with the host application.

+

See also:
Registering a function
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::RegisterGlobalProperty (const char *  declaration,
void *  pointer 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] declaration The declaration of the global property in script syntax.
[in] pointer The address of the property that will be used to access the property value.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + +
asINVALID_DECLARATION The declaration has invalid syntax.
asINVALID_TYPE The declaration is a reference.
asNAME_TAKEN The name is already taken.
+
+Use this method to register a global property that the scripts will be able to access as global variables. The property may optionally be registered as const, if the scripts shouldn't be allowed to modify it.

+When registering the property, the application must pass the address to the actual value. The application must also make sure that this address remains valid throughout the life time of this registration, i.e. until the engine is released or the dynamic configuration group is removed. +

+

+ +

+
+ + + + + + + + + +
virtual int asIScriptEngine::RegisterInterface (const char *  name  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] name The name of the interface.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + + +
asINVALID_NAME The name is null, or a reserved keyword.
asALREADY_REGISTERED An object type with this name already exists.
asERROR The name is not a proper identifier.
asNAME_TAKEN The name is already used elsewhere.
+
+This registers an interface that script classes can implement. By doing this the application can register functions and methods that receives an asIScriptObject and still be sure that the class implements certain methods needed by the application. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::RegisterInterfaceMethod (const char *  intf,
const char *  declaration 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] intf The name of the interface.
[in] declaration The method declaration.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + + +
asWRONG_CONFIG_GROUP The interface was registered in another configuration group.
asINVALID_TYPE intf is not an interface type.
asINVALID_DECLARATION The declaration is invalid.
asNAME_TAKEN The method name is already taken.
+
+This registers a method that the class that implements the interface must have. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::RegisterObjectBehaviour (const char *  obj,
asEBehaviours  behaviour,
const char *  declaration,
const asSFuncPtr funcPointer,
asDWORD  callConv 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + + + +
[in] obj The name of the type.
[in] behaviour One of the object behaviours from asEBehaviours.
[in] declaration The declaration of the method in script syntax.
[in] funcPointer The method or function pointer.
[in] callConv The calling convention for the method or function.
+
+
Returns:
A negative value on error, or the function id is successful.
+
Return values:
+ + + + + + + + + +
asWRONG_CONFIG_GROUP The object type was registered in a different configuration group.
asINVALID_ARG obj is not set, or a global behaviour is given in behaviour.
asWRONG_CALLING_CONV The function's calling convention isn't compatible with callConv.
asNOT_SUPPORTED The calling convention or the behaviour signature is not supported.
asINVALID_TYPE The obj parameter is not a valid object name.
asINVALID_DECLARATION The declaration is invalid.
asILLEGAL_BEHAVIOUR_FOR_TYPE The behaviour is not allowed for this type.
asALREADY_REGISTERED The behaviour is already registered with the same signature.
+
+Use this method to register behaviour functions that will be called by the virtual machine to perform certain operations, such as memory management, math operations, comparisons, etc.

+

See also:
Registering a function, Registering operator behaviours
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::RegisterObjectMethod (const char *  obj,
const char *  declaration,
const asSFuncPtr funcPointer,
asDWORD  callConv 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + + +
[in] obj The name of the type.
[in] declaration The declaration of the method in script syntax.
[in] funcPointer The method or function pointer.
[in] callConv The calling convention for the method or function.
+
+
Returns:
A negative value on error, or the function id if successful.
+
Return values:
+ + + + + + + +
asWRONG_CONFIG_GROUP The object type was registered in a different configuration group.
asNOT_SUPPORTED The calling convention is not supported.
asINVALID_TYPE The obj parameter is not a valid object name.
asINVALID_DECLARATION The declaration is invalid.
asNAME_TAKEN The name conflicts with other members.
asWRONG_CALLING_CONV The function's calling convention isn't compatible with callConv.
+
+Use this method to register a member method for the type. The method that is registered may be an actual class method, or a global function that takes the object pointer as either the first or last parameter. Or it may be a global function implemented with the generic calling convention.

+

See also:
Registering a function
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::RegisterObjectProperty (const char *  obj,
const char *  declaration,
int  byteOffset 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] obj The name of the type.
[in] declaration The property declaration in script syntax.
[in] byteOffset The offset into the memory block where this property is found.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + + + +
asWRONG_CONFIG_GROUP The object type was registered in a different configuration group.
asINVALID_OBJECT The obj does not specify an object type.
asINVALID_TYPE The obj parameter has invalid syntax.
asINVALID_DECLARATION The declaration is invalid.
asNAME_TAKEN The name conflicts with other members.
+
+Use this method to register a member property of a class. The property must be local to the object, i.e. not a global variable or a static member. The easiest way to get the offset of the property is to use the offsetof macro from stddef.h.

+

 struct MyType {float prop;};
+ r = engine->RegisterObjectProperty("MyType", "float prop", offsetof(MyType, prop)));
+
+
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::RegisterObjectType (const char *  obj,
int  byteSize,
asDWORD  flags 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] obj The name of the type.
[in] byteSize The size of the type in bytes. Only necessary for value types.
[in] flags One or more of the asEObjTypeFlags.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + + + + + +
asINVALID_ARG The flags are invalid.
asINVALID_NAME The name is invalid.
asALREADY_REGISTERED Another type of the same name already exists.
asNAME_TAKEN The name conflicts with other symbol names.
asLOWER_ARRAY_DIMENSION_NOT_REGISTERED When registering an array type the array element must be a primitive or a registered type.
asINVALID_TYPE The array type was not properly formed.
asNOT_SUPPORTED The array type is not supported, or already in use preventing it from being overloaded.
+
+Use this method to register new types that should be available to the scripts. Reference types, which have their memory managed by the application, should be registered with asOBJ_REF. Value types, which have their memory managed by the engine, should be registered with asOBJ_VALUE.

+

See also:
Registering an object type
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::RegisterStringFactory (const char *  datatype,
const asSFuncPtr factoryFunc,
asDWORD  callConv 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] datatype The datatype that the string factory returns
[in] factoryFunc The pointer to the factory function
[in] callConv The calling convention of the factory function
+
+
Returns:
A negative value on error, or the function id if successful.
+
Return values:
+ + + + +
asNOT_SUPPORTED The calling convention is not supported.
asWRONG_CALLING_CONV The function's calling convention doesn't match callConv.
asINVALID_TYPE The datatype is not a valid type.
+
+Use this function to register a string factory that will be called when the virtual machine finds a string constant in an expression. The string factory function will receive two parameters, the length of the string constant in bytes and a pointer to the character data. The factory should return a value to a previously registered type that will represent the string. Example:

+

 // Our string factory implementation
+ std::string StringFactory(unsigned int byteLength, const char *s)
+ {
+     return std::string(s, byteLength);
+ }
+
+ // Registering the string factory
+ int r = engine->RegisterStringFactory("string", asFUNCTION(StringFactory), asCALL_CDECL); assert( r >= 0 );
+

+The example assumes that the std::string type has been registered as the string type, with RegisterObjectType. +

+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::RegisterTypedef (const char *  type,
const char *  decl 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] type The name of the new typedef
[in] decl The datatype that the typedef represents
+
+
Returns:
A negative value on error.
+
Return values:
+ + + + + + +
asINVALID_NAME The type is null.
asALREADY_REGISTERED A type with the same name already exists.
asINVALID_TYPE The decl is not a primitive type.
asINVALID_NAME The type is not an identifier, or it is a reserved keyword.
asNAME_TAKEN The name is already used elsewhere.
+
+This method registers an alias for a data type.

+Currently typedefs can only be registered for built-in primitive types. +

+

+ +

+
+ + + + + + + + +
virtual int asIScriptEngine::Release (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when you will no longer use the references that you own. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual void asIScriptEngine::ReleaseScriptObject (void *  obj,
int  typeId 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] obj A pointer to the object.
[in] typeId The type id of the object.
+
+This calls the release method of the object to release the reference.

+This only works for objects. +

+

+ +

+
+ + + + + + + + + +
virtual int asIScriptEngine::RemoveConfigGroup (const char *  groupName  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] groupName The name of the configuration group
+
+
Returns:
A negative value on error
+
Return values:
+ + +
asCONFIG_GROUP_IS_IN_USE The group is in use and cannot be removed.
+
+Remove the configuration group. If something in the configuration group is currently in use, the function will return with an error code. Examples of uses are compiled modules that have function calls to functions in the group and global variables of types registered in the group. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::SetConfigGroupModuleAccess (const char *  groupName,
const char *  module,
bool  hasAccess 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] groupName The name of the configuration group
[in] module The module name
[in] hasAccess Whether the module has access or not to the group members
+
+
Returns:
A negative value on error
+
Return values:
+ + +
asWRONG_CONFIG_GROUP No group with the groupName was found.
+
+With this method the application can give modules access to individual configuration groups. This is useful when exposing more than one script interface for various parts of the application, e.g. one interface for GUI handling, another for in-game events, etc.

+The default module access is granted. The default for a group can be changed by specifying the modulename asALL_MODULES. +

+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::SetEngineProperty (asEEngineProp  property,
asPWORD  value 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] property One of the asEEngineProp values.
[in] value The new value of the property.
+
+
Returns:
Negative value on error.
+
Return values:
+ + +
asINVALID_ARG Invalid property.
+
+With this method you can change the way the script engine works in some regards. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::SetMessageCallback (const asSFuncPtr callback,
void *  obj,
asDWORD  callConv 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] callback A function or class method pointer.
[in] obj The object for methods, or an optional parameter for functions.
[in] callConv The calling convention.
+
+
Returns:
A negative value for an error.
+
Return values:
+ + + +
asINVALID_ARG One of the arguments is incorrect, e.g. obj is null for a class method.
asNOT_SUPPORTED The arguments are not supported, e.g. asCALL_GENERIC.
+
+This method sets the callback routine that will receive compiler messages. The callback routine can be either a class method, e.g:
 void MyClass::MessageCallback(const asSMessageInfo *msg);
+ r = engine->SetMessageCallback(asMETHOD(MyClass,MessageCallback), &obj, asCALL_THISCALL);
+
or a global function, e.g:
 void MessageCallback(const asSMessageInfo *msg, void *param);
+ r = engine->SetMessageCallback(asFUNCTION(MessageCallback), param, asCALL_CDECL);
+
It is recommended to register the message callback routine right after creating the engine, as some of the registration functions can provide useful information to better explain errors. +
+

+ +

+
+ + + + + + + + + +
virtual void* asIScriptEngine::SetUserData (void *  data  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] data A pointer to the user data.
+
+
Returns:
The previous pointer stored in the engine.
+This method allows the application to associate a value, e.g. a pointer, with the engine instance. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptEngine::WriteMessage (const char *  section,
int  row,
int  col,
asEMsgType  type,
const char *  message 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + + + +
[in] section The name of the script section.
[in] row The row number.
[in] col The column number.
[in] type The message type.
[in] message The message text.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_ARG The section or message is null.
+
+This method can be used by the application to write messages to the same message callback that the script compiler uses. This is useful for example if a preprocessor is used. +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_engine-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_engine-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_engine-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_engine-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,75 @@ + + +AngelScript: Member List + + + + +
+

asIScriptEngine Member List

This is the complete list of members for asIScriptEngine, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddRef()=0asIScriptEngine [pure virtual]
AddRefScriptObject(void *obj, int typeId)=0asIScriptEngine [pure virtual]
BeginConfigGroup(const char *groupName)=0asIScriptEngine [pure virtual]
ClearMessageCallback()=0asIScriptEngine [pure virtual]
CopyScriptObject(void *dstObj, void *srcObj, int typeId)=0asIScriptEngine [pure virtual]
CreateContext()=0asIScriptEngine [pure virtual]
CreateScriptObject(int typeId)=0asIScriptEngine [pure virtual]
CreateScriptObjectCopy(void *obj, int typeId)=0asIScriptEngine [pure virtual]
DiscardModule(const char *module)=0asIScriptEngine [pure virtual]
EndConfigGroup()=0asIScriptEngine [pure virtual]
ExecuteString(const char *module, const char *script, asIScriptContext **ctx=0, asDWORD flags=0)=0asIScriptEngine [pure virtual]
GarbageCollect(asDWORD flags=asGC_FULL_CYCLE)=0asIScriptEngine [pure virtual]
GCEnumCallback(void *reference)=0asIScriptEngine [pure virtual]
GetEngineProperty(asEEngineProp property)=0asIScriptEngine [pure virtual]
GetEnumByIndex(asUINT index, int *enumTypeId, const char **configGroup=0)=0asIScriptEngine [pure virtual]
GetEnumCount()=0asIScriptEngine [pure virtual]
GetEnumValueByIndex(int enumTypeId, asUINT index, int *outValue)=0asIScriptEngine [pure virtual]
GetEnumValueCount(int enumTypeId)=0asIScriptEngine [pure virtual]
GetFunctionDescriptorById(int funcId)=0asIScriptEngine [pure virtual]
GetGCStatistics(asUINT *currentSize, asUINT *totalDestroyed=0, asUINT *totalDetected=0)=0asIScriptEngine [pure virtual]
GetGlobalFunctionCount()=0asIScriptEngine [pure virtual]
GetGlobalFunctionIdByIndex(asUINT index)=0asIScriptEngine [pure virtual]
GetGlobalPropertyByIndex(asUINT index, const char **name, int *typeId=0, bool *isConst=0, const char **configGroup=0, void **pointer=0)=0asIScriptEngine [pure virtual]
GetGlobalPropertyCount()=0asIScriptEngine [pure virtual]
GetJITCompiler()=0asIScriptEngine [pure virtual]
GetModule(const char *module, asEGMFlags flag=asGM_ONLY_IF_EXISTS)=0asIScriptEngine [pure virtual]
GetObjectTypeById(int typeId)=0asIScriptEngine [pure virtual]
GetObjectTypeByIndex(asUINT index)=0asIScriptEngine [pure virtual]
GetObjectTypeCount()=0asIScriptEngine [pure virtual]
GetSizeOfPrimitiveType(int typeId)=0asIScriptEngine [pure virtual]
GetStringFactoryReturnTypeId()=0asIScriptEngine [pure virtual]
GetTypeDeclaration(int typeId)=0asIScriptEngine [pure virtual]
GetTypedefByIndex(asUINT index, int *typeId, const char **configGroup=0)=0asIScriptEngine [pure virtual]
GetTypedefCount()=0asIScriptEngine [pure virtual]
GetTypeIdByDecl(const char *decl)=0asIScriptEngine [pure virtual]
GetUserData()=0asIScriptEngine [pure virtual]
IsHandleCompatibleWithObject(void *obj, int objTypeId, int handleTypeId)=0asIScriptEngine [pure virtual]
NotifyGarbageCollectorOfNewObject(void *obj, int typeId)=0asIScriptEngine [pure virtual]
ParseToken(const char *string, size_t stringLength=0, int *tokenLength=0)=0asIScriptEngine [pure virtual]
RegisterEnum(const char *type)=0asIScriptEngine [pure virtual]
RegisterEnumValue(const char *type, const char *name, int value)=0asIScriptEngine [pure virtual]
RegisterGlobalFunction(const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv)=0asIScriptEngine [pure virtual]
RegisterGlobalProperty(const char *declaration, void *pointer)=0asIScriptEngine [pure virtual]
RegisterInterface(const char *name)=0asIScriptEngine [pure virtual]
RegisterInterfaceMethod(const char *intf, const char *declaration)=0asIScriptEngine [pure virtual]
RegisterObjectBehaviour(const char *obj, asEBehaviours behaviour, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv)=0asIScriptEngine [pure virtual]
RegisterObjectMethod(const char *obj, const char *declaration, const asSFuncPtr &funcPointer, asDWORD callConv)=0asIScriptEngine [pure virtual]
RegisterObjectProperty(const char *obj, const char *declaration, int byteOffset)=0asIScriptEngine [pure virtual]
RegisterObjectType(const char *obj, int byteSize, asDWORD flags)=0asIScriptEngine [pure virtual]
RegisterStringFactory(const char *datatype, const asSFuncPtr &factoryFunc, asDWORD callConv)=0asIScriptEngine [pure virtual]
RegisterTypedef(const char *type, const char *decl)=0asIScriptEngine [pure virtual]
Release()=0asIScriptEngine [pure virtual]
ReleaseScriptObject(void *obj, int typeId)=0asIScriptEngine [pure virtual]
RemoveConfigGroup(const char *groupName)=0asIScriptEngine [pure virtual]
SetConfigGroupModuleAccess(const char *groupName, const char *module, bool hasAccess)=0asIScriptEngine [pure virtual]
SetEngineProperty(asEEngineProp property, asPWORD value)=0asIScriptEngine [pure virtual]
SetJITCompiler(asIJITCompiler *compiler)=0asIScriptEngine [pure virtual]
SetMessageCallback(const asSFuncPtr &callback, void *obj, asDWORD callConv)=0asIScriptEngine [pure virtual]
SetUserData(void *data)=0asIScriptEngine [pure virtual]
WriteMessage(const char *section, int row, int col, asEMsgType type, const char *message)=0asIScriptEngine [pure virtual]

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_function.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_function.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_function.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_function.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,477 @@ + + +AngelScript: asIScriptFunction Class Reference + + + + +
+

asIScriptFunction Class Reference

The interface for a script function description. + +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

Miscellaneous
virtual asIScriptEngineGetEngine () const =0
 Returns a pointer to the script engine.
virtual int AddRef ()=0
 Increases the reference counter.
virtual int Release ()=0
 Decrease reference counter.
virtual int GetId () const =0
 Returns the id of the function.
virtual const char * GetModuleName () const =0
 Returns the name of the module where the function was implemented.
virtual const char * GetScriptSectionName () const =0
 Returns the name of the script section where the function was implemented.
virtual const char * GetConfigGroup () const =0
 Returns the name of the config group in which the function was registered.
Function info
virtual asIObjectTypeGetObjectType () const =0
 Returns the object type for class or interface method.
virtual const char * GetObjectName () const =0
 Returns the name of the object for class or interface methods.
virtual const char * GetName () const =0
 Returns the name of the function or method.
virtual const char * GetDeclaration (bool includeObjectName=true) const =0
 Returns the function declaration.
virtual bool IsClassMethod () const =0
 Returns true if it is a class method.
virtual bool IsInterfaceMethod () const =0
 Returns true if it is an interface method.
virtual bool IsReadOnly () const =0
 Returns true if the class method is read-only.
Parameter and return types
virtual int GetParamCount () const =0
 Returns the number of parameters for this function.
virtual int GetParamTypeId (int index, asDWORD *flags=0) const =0
 Returns the type id of the specified parameter.
virtual int GetReturnTypeId () const =0
 Returns the type id of the return type.
JIT compilation
virtual asDWORDGetByteCode (asUINT *length=0)=0
 Returns the byte code buffer and length.
+


Member Function Documentation

+ +
+
+ + + + + + + + +
virtual int asIScriptFunction::AddRef (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when storing an additional reference to the object. +
+

+ +

+
+ + + + + + + + + +
virtual asDWORD* asIScriptFunction::GetByteCode (asUINT length = 0  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[out] length The length of the byte code buffer in DWORDs
+
+
Returns:
A pointer to the byte code buffer, or 0 if this is not a script function.
+This function is used by the asIJITCompiler to obtain the byte code buffer for building the native machine code representation. +
+

+ +

+
+ + + + + + + + +
virtual const char* asIScriptFunction::GetConfigGroup (  )  const [pure virtual]
+
+
+ +

+

Returns:
The name of the config group, or null if not in any group.
+ +
+

+ +

+
+ + + + + + + + + +
virtual const char* asIScriptFunction::GetDeclaration (bool  includeObjectName = true  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] includeObjectName Indicate whether the object name should be prepended to the function name
+
+
Returns:
A null terminated string with the function declaration.
+ +
+

+ +

+
+ + + + + + + + +
virtual asIScriptEngine* asIScriptFunction::GetEngine (  )  const [pure virtual]
+
+
+ +

+

Returns:
A pointer to the engine.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptFunction::GetId (  )  const [pure virtual]
+
+
+ +

+

Returns:
The id of the function
+ +
+

+ +

+
+ + + + + + + + +
virtual const char* asIScriptFunction::GetModuleName (  )  const [pure virtual]
+
+
+ +

+

Returns:
A null terminated string with the module name.
+ +
+

+ +

+
+ + + + + + + + +
virtual const char* asIScriptFunction::GetName (  )  const [pure virtual]
+
+
+ +

+

Returns:
A null terminated string with the name of the function.
+ +
+

+ +

+
+ + + + + + + + +
virtual const char* asIScriptFunction::GetObjectName (  )  const [pure virtual]
+
+
+ +

+

Returns:
A null terminated string with the name of the object type if this a method.
+ +
+

+ +

+
+ + + + + + + + +
virtual asIObjectType* asIScriptFunction::GetObjectType (  )  const [pure virtual]
+
+
+ +

+

Returns:
A pointer to the object type interface if this is a method.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptFunction::GetParamCount (  )  const [pure virtual]
+
+
+ +

+

Returns:
The number of parameters.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptFunction::GetParamTypeId (int  index,
asDWORD flags = 0 
) const [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] index The zero based parameter index.
[out] flags A combination of asETypeModifiers.
+
+
Returns:
A negative value on error, or the type id of the specified parameter.
+
Return values:
+ + +
asINVALID_ARG The index is out of bounds.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptFunction::GetReturnTypeId (  )  const [pure virtual]
+
+
+ +

+

Returns:
The type id of the return type.
+ +
+

+ +

+
+ + + + + + + + +
virtual const char* asIScriptFunction::GetScriptSectionName (  )  const [pure virtual]
+
+
+ +

+

Returns:
A null terminated string with the script section name where the function was implemented.
+ +
+

+ +

+
+ + + + + + + + +
virtual bool asIScriptFunction::IsClassMethod (  )  const [pure virtual]
+
+
+ +

+

Returns:
True if this a class method.
+ +
+

+ +

+
+ + + + + + + + +
virtual bool asIScriptFunction::IsInterfaceMethod (  )  const [pure virtual]
+
+
+ +

+

Returns:
True if this is an interface method.
+ +
+

+ +

+
+ + + + + + + + +
virtual bool asIScriptFunction::IsReadOnly (  )  const [pure virtual]
+
+
+ +

+

Returns:
True if the class method is read-only
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptFunction::Release (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when you will no longer use the references that you own. +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_function-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_function-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_function-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_function-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,33 @@ + + +AngelScript: Member List + + + + +
+

asIScriptFunction Member List

This is the complete list of members for asIScriptFunction, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
AddRef()=0asIScriptFunction [pure virtual]
GetByteCode(asUINT *length=0)=0asIScriptFunction [pure virtual]
GetConfigGroup() const =0asIScriptFunction [pure virtual]
GetDeclaration(bool includeObjectName=true) const =0asIScriptFunction [pure virtual]
GetEngine() const =0asIScriptFunction [pure virtual]
GetId() const =0asIScriptFunction [pure virtual]
GetModuleName() const =0asIScriptFunction [pure virtual]
GetName() const =0asIScriptFunction [pure virtual]
GetObjectName() const =0asIScriptFunction [pure virtual]
GetObjectType() const =0asIScriptFunction [pure virtual]
GetParamCount() const =0asIScriptFunction [pure virtual]
GetParamTypeId(int index, asDWORD *flags=0) const =0asIScriptFunction [pure virtual]
GetReturnTypeId() const =0asIScriptFunction [pure virtual]
GetScriptSectionName() const =0asIScriptFunction [pure virtual]
IsClassMethod() const =0asIScriptFunction [pure virtual]
IsInterfaceMethod() const =0asIScriptFunction [pure virtual]
IsReadOnly() const =0asIScriptFunction [pure virtual]
Release()=0asIScriptFunction [pure virtual]

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_generic.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_generic.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_generic.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_generic.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,756 @@ + + +AngelScript: asIScriptGeneric Class Reference + + + + +
+

asIScriptGeneric Class Reference

The interface for the generic calling convention. + +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

Miscellaneous
virtual asIScriptEngineGetEngine ()=0
 Returns a pointer to the script engine.
virtual int GetFunctionId ()=0
 Returns the function id of the called function.
Object
virtual void * GetObject ()=0
 Returns the object pointer if this is a class method, or null if it not.
virtual int GetObjectTypeId ()=0
 Returns the type id of the object if this is a class method.
Arguments
virtual int GetArgCount ()=0
 Returns the number of arguments.
virtual int GetArgTypeId (asUINT arg)=0
 Returns the type id of the argument.
virtual asBYTE GetArgByte (asUINT arg)=0
 Returns the value of an 8-bit argument.
virtual asWORD GetArgWord (asUINT arg)=0
 Returns the value of a 16-bit argument.
virtual asDWORD GetArgDWord (asUINT arg)=0
 Returns the value of a 32-bit integer argument.
virtual asQWORD GetArgQWord (asUINT arg)=0
 Returns the value of a 64-bit integer argument.
virtual float GetArgFloat (asUINT arg)=0
 Returns the value of a float argument.
virtual double GetArgDouble (asUINT arg)=0
 Returns the value of a double argument.
virtual void * GetArgAddress (asUINT arg)=0
 Returns the address held in a reference or handle argument.
virtual void * GetArgObject (asUINT arg)=0
 Returns a pointer to the object in a object argument.
virtual void * GetAddressOfArg (asUINT arg)=0
 Returns a pointer to the argument value.
Return value
virtual int GetReturnTypeId ()=0
 Gets the type id of the return value.
virtual int SetReturnByte (asBYTE val)=0
 Sets the 8-bit return value.
virtual int SetReturnWord (asWORD val)=0
 Sets the 16-bit return value.
virtual int SetReturnDWord (asDWORD val)=0
 Sets the 32-bit integer return value.
virtual int SetReturnQWord (asQWORD val)=0
 Sets the 64-bit integer return value.
virtual int SetReturnFloat (float val)=0
 Sets the float return value.
virtual int SetReturnDouble (double val)=0
 Sets the double return value.
virtual int SetReturnAddress (void *addr)=0
 Sets the address return value when the return is a reference or handle.
virtual int SetReturnObject (void *obj)=0
 Sets the object return value.
virtual void * GetAddressOfReturnLocation ()=0
 Gets the address to the memory where the return value should be placed.
+


Member Function Documentation

+ +
+
+ + + + + + + + + +
virtual void* asIScriptGeneric::GetAddressOfArg (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
A pointer to the argument value.
+ +
+

+ +

+
+ + + + + + + + +
virtual void* asIScriptGeneric::GetAddressOfReturnLocation (  )  [pure virtual]
+
+
+ +

+

Returns:
A pointer to the memory where the return values is to be placed.
+The memory is not initialized, so if you're going to return a complex type by value, you shouldn't use the assignment operator to initialize it. Instead use the placement new operator to call the type's copy constructor to perform the initialization.

+

 new(gen->GetAddressOfReturnLocation()) std::string(myRetValue);
+

+The placement new operator works for primitive types too, so this method is ideal for writing automatically generated functions that works the same way for all types. +

+

+ +

+
+ + + + + + + + + +
virtual void* asIScriptGeneric::GetArgAddress (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
The address argument value, which can be a reference or and object handle.
+Don't release the pointer if this is an object or object handle, the asIScriptGeneric object will do that for you. +
+

+ +

+
+ + + + + + + + + +
virtual asBYTE asIScriptGeneric::GetArgByte (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
The 1 byte argument value.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptGeneric::GetArgCount (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of arguments to the function.
+ +
+

+ +

+
+ + + + + + + + + +
virtual double asIScriptGeneric::GetArgDouble (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
The double argument value.
+ +
+

+ +

+
+ + + + + + + + + +
virtual asDWORD asIScriptGeneric::GetArgDWord (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
The 4 byte argument value.
+ +
+

+ +

+
+ + + + + + + + + +
virtual float asIScriptGeneric::GetArgFloat (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
The float argument value.
+ +
+

+ +

+
+ + + + + + + + + +
virtual void* asIScriptGeneric::GetArgObject (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
A pointer to the object argument, which can be an object value or object handle.
+Don't release the pointer if this is an object handle, the asIScriptGeneric object will do that for you. +
+

+ +

+
+ + + + + + + + + +
virtual asQWORD asIScriptGeneric::GetArgQWord (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
The 8 byte argument value.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptGeneric::GetArgTypeId (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
The type id of the argument.
+ +
+

+ +

+
+ + + + + + + + + +
virtual asWORD asIScriptGeneric::GetArgWord (asUINT  arg  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] arg The argument index.
+
+
Returns:
The 2 byte argument value.
+ +
+

+ +

+
+ + + + + + + + +
virtual asIScriptEngine* asIScriptGeneric::GetEngine (  )  [pure virtual]
+
+
+ +

+

Returns:
A pointer to the engine.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptGeneric::GetFunctionId (  )  [pure virtual]
+
+
+ +

+

Returns:
The function id of the function being called.
+ +
+

+ +

+
+ + + + + + + + +
virtual void* asIScriptGeneric::GetObject (  )  [pure virtual]
+
+
+ +

+

Returns:
A pointer to the object, if this is a method.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptGeneric::GetObjectTypeId (  )  [pure virtual]
+
+
+ +

+

Returns:
The type id of the object if this is a method.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptGeneric::GetReturnTypeId (  )  [pure virtual]
+
+
+ +

+

Returns:
The type id of the return value.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptGeneric::SetReturnAddress (void *  addr  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] addr The return value, which is an address.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_TYPE The return type is not a reference or handle.
+
+Sets the address return value. If an object handle the application must first increment the reference counter, unless it won't keep a reference itself. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptGeneric::SetReturnByte (asBYTE  val  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] val The return value.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_TYPE The return type is not an 8-bit value. Sets the 1 byte return value.
+
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptGeneric::SetReturnDouble (double  val  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] val The return value.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_TYPE The return type is not a 64-bit value. Sets the double return value.
+
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptGeneric::SetReturnDWord (asDWORD  val  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] val The return value.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_TYPE The return type is not a 32-bit value. Sets the 4 byte return value.
+
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptGeneric::SetReturnFloat (float  val  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] val The return value.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_TYPE The return type is not a 32-bit value. Sets the float return value.
+
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptGeneric::SetReturnObject (void *  obj  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] obj A pointer to the object return value.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_TYPE The return type is not an object value or handle.
+
+If the function returns an object, the library will automatically do what is necessary based on how the object was declared, i.e. if the function was registered to return a handle then the library will call the addref behaviour. If it was registered to return an object by value, then the library will make a copy of the object. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptGeneric::SetReturnQWord (asQWORD  val  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] val The return value.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_TYPE The return type is not a 64-bit value. Sets the 8 byte return value.
+
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptGeneric::SetReturnWord (asWORD  val  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] val The return value.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_TYPE The return type is not a 16-bit value. Sets the 2 byte return value.
+
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_generic-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_generic-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_generic-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_generic-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,40 @@ + + +AngelScript: Member List + + + + +
+

asIScriptGeneric Member List

This is the complete list of members for asIScriptGeneric, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
GetAddressOfArg(asUINT arg)=0asIScriptGeneric [pure virtual]
GetAddressOfReturnLocation()=0asIScriptGeneric [pure virtual]
GetArgAddress(asUINT arg)=0asIScriptGeneric [pure virtual]
GetArgByte(asUINT arg)=0asIScriptGeneric [pure virtual]
GetArgCount()=0asIScriptGeneric [pure virtual]
GetArgDouble(asUINT arg)=0asIScriptGeneric [pure virtual]
GetArgDWord(asUINT arg)=0asIScriptGeneric [pure virtual]
GetArgFloat(asUINT arg)=0asIScriptGeneric [pure virtual]
GetArgObject(asUINT arg)=0asIScriptGeneric [pure virtual]
GetArgQWord(asUINT arg)=0asIScriptGeneric [pure virtual]
GetArgTypeId(asUINT arg)=0asIScriptGeneric [pure virtual]
GetArgWord(asUINT arg)=0asIScriptGeneric [pure virtual]
GetEngine()=0asIScriptGeneric [pure virtual]
GetFunctionId()=0asIScriptGeneric [pure virtual]
GetObject()=0asIScriptGeneric [pure virtual]
GetObjectTypeId()=0asIScriptGeneric [pure virtual]
GetReturnTypeId()=0asIScriptGeneric [pure virtual]
SetReturnAddress(void *addr)=0asIScriptGeneric [pure virtual]
SetReturnByte(asBYTE val)=0asIScriptGeneric [pure virtual]
SetReturnDouble(double val)=0asIScriptGeneric [pure virtual]
SetReturnDWord(asDWORD val)=0asIScriptGeneric [pure virtual]
SetReturnFloat(float val)=0asIScriptGeneric [pure virtual]
SetReturnObject(void *obj)=0asIScriptGeneric [pure virtual]
SetReturnQWord(asQWORD val)=0asIScriptGeneric [pure virtual]
SetReturnWord(asWORD val)=0asIScriptGeneric [pure virtual]

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_module.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_module.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_module.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_module.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1461 @@ + + +AngelScript: asIScriptModule Class Reference + + + + +
+

asIScriptModule Class Reference

The interface to the script modules. + +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

Miscellaneous
virtual asIScriptEngineGetEngine ()=0
 Returns a pointer to the engine.
virtual void SetName (const char *name)=0
 Sets the name of the module.
virtual const char * GetName ()=0
 Gets the name of the module.
Compilation
virtual int AddScriptSection (const char *name, const char *code, size_t codeLength=0, int lineOffset=0)=0
 Add a script section for the next build.
virtual int Build ()=0
 Build the previously added script sections.
virtual int CompileFunction (const char *sectionName, const char *code, int lineOffset, asDWORD compileFlags, asIScriptFunction **outFunc)=0
 Compile a single function.
virtual int CompileGlobalVar (const char *sectionName, const char *code, int lineOffset)=0
 Compile a single global variable and add it to the scope of the module.
Functions
virtual int GetFunctionCount ()=0
 Returns the number of global functions in the module.
virtual int GetFunctionIdByIndex (int index)=0
 Returns the function id by index.
virtual int GetFunctionIdByName (const char *name)=0
 Returns the function id by name.
virtual int GetFunctionIdByDecl (const char *decl)=0
 Returns the function id by declaration.
virtual asIScriptFunctionGetFunctionDescriptorByIndex (int index)=0
 Returns the function descriptor for the script function.
virtual asIScriptFunctionGetFunctionDescriptorById (int funcId)=0
 Returns the function descriptor for the script function.
virtual int RemoveFunction (int funcId)=0
 Remove a single function from the scope of the module.
Global variables
virtual int ResetGlobalVars ()=0
 Reset the global variables of the module.
virtual int GetGlobalVarCount ()=0
 Returns the number of global variables in the module.
virtual int GetGlobalVarIndexByName (const char *name)=0
 Returns the global variable index by name.
virtual int GetGlobalVarIndexByDecl (const char *decl)=0
 Returns the global variable index by declaration.
virtual const char * GetGlobalVarDeclaration (int index)=0
 Returns the global variable declaration.
virtual const char * GetGlobalVarName (int index)=0
 Returns the global variable name.
virtual int GetGlobalVarTypeId (int index, bool *isConst=0)=0
 Returns the type id for the global variable.
virtual void * GetAddressOfGlobalVar (int index)=0
 Returns the pointer to the global variable.
virtual int RemoveGlobalVar (int index)=0
 Remove the global variable from the scope of the module.
Type identification
virtual int GetObjectTypeCount ()=0
 Returns the number of object types.
virtual asIObjectTypeGetObjectTypeByIndex (asUINT index)=0
 Returns the object type interface by index.
virtual int GetTypeIdByDecl (const char *decl)=0
 Returns a type id by declaration.
Enums
virtual int GetEnumCount ()=0
 Returns the number of enum types declared in the module.
virtual const char * GetEnumByIndex (asUINT index, int *enumTypeId)=0
 Returns the enum type.
virtual int GetEnumValueCount (int enumTypeId)=0
 Returns the number of values defined for the enum type.
virtual const char * GetEnumValueByIndex (int enumTypeId, asUINT index, int *outValue)=0
 Returns the name and value of the enum value.
Typedefs
virtual int GetTypedefCount ()=0
 Returns the number of typedefs in the module.
virtual const char * GetTypedefByIndex (asUINT index, int *typeId)=0
 Returns the typedef.
Dynamic binding between modules
virtual int GetImportedFunctionCount ()=0
 Returns the number of functions declared for import.
virtual int GetImportedFunctionIndexByDecl (const char *decl)=0
 Returns the imported function index by declaration.
virtual const char * GetImportedFunctionDeclaration (int importIndex)=0
 Returns the imported function declaration.
virtual const char * GetImportedFunctionSourceModule (int importIndex)=0
 Returns the declared imported function source module.
virtual int BindImportedFunction (int importIndex, int funcId)=0
 Binds an imported function to the function from another module.
virtual int UnbindImportedFunction (int importIndex)=0
 Unbinds an imported function.
virtual int BindAllImportedFunctions ()=0
 Binds all imported functions in a module, by searching their equivalents in the declared source modules.
virtual int UnbindAllImportedFunctions ()=0
 Unbinds all imported functions.
Bytecode saving and loading
virtual int SaveByteCode (asIBinaryStream *out)=0
 Save compiled bytecode to a binary stream.
virtual int LoadByteCode (asIBinaryStream *in)=0
 Load pre-compiled bytecode from a binary stream.
+


Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptModule::AddScriptSection (const char *  name,
const char *  code,
size_t  codeLength = 0,
int  lineOffset = 0 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + + +
[in] name The name of the script section
[in] code The script code buffer
[in] codeLength The length of the script code
[in] lineOffset An offset that will be added to compiler message line numbers
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asMODULE_IS_IN_USE The module is currently in use.
+
+This adds a script section to the module. All sections added will be treated as if one large script. Errors reported will give the name of the corresponding section.

+The code added is copied by the engine, so there is no need to keep the original buffer after the call. Note that this can be changed by setting the engine property asEP_COPY_SCRIPT_SECTIONS with asIScriptEngine::SetEngineProperty. +

+

+ +

+
+ + + + + + + + +
virtual int asIScriptModule::BindAllImportedFunctions (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error.
+
Return values:
+ + + +
asERROR An error occurred.
asCANT_BIND_ALL_FUNCTIONS Not all functions where bound.
+
+This functions tries to bind all imported functions in the module by searching for matching functions in the suggested modules. If a function cannot be bound the function will give an error asCANT_BIND_ALL_FUNCTIONS, but it will continue binding the rest of the functions. +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptModule::BindImportedFunction (int  importIndex,
int  funcId 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] importIndex The index of the imported function.
[in] funcId The function id of the function that will be bound to the imported function.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + +
asNO_FUNCTION importIndex or fundId is incorrect.
asINVALID_INTERFACE The signature of function doesn't match the import statement.
+
+The imported function is only bound if the functions have the exact same signature, i.e the same return type, and parameters. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptModule::Build (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error
+
Return values:
+ + + + +
asINVALID_CONFIGURATION The engine configuration is invalid.
asERROR The script failed to build.
asBUILD_IN_PROGRESS Another thread is currently building.
+
+Builds the script based on the added sections, and registered types and functions. After the build is complete the script sections are removed to free memory. If the script module needs to be rebuilt all of the script sections needs to be added again.

+Compiler messages are sent to the message callback function set with asIScriptEngine::SetMessageCallback. If there are no errors or warnings, no messages will be sent to the callback function.

+Any global variables found in the script will be initialized by the compiler if the engine property asEP_INIT_GLOBAL_VARS_AFTER_BUILD is set. +

+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptModule::CompileFunction (const char *  sectionName,
const char *  code,
int  lineOffset,
asDWORD  compileFlags,
asIScriptFunction **  outFunc 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + + + +
[in] sectionName The name of the script section
[in] code The script code buffer
[in] lineOffset An offset that will be added to compiler message line numbers
[in] compileFlags One of asECompileFlags values
[out] outFunc Optional parameter to receive the compiled function descriptor
+
+
Returns:
A negative value on error
+
Return values:
+ + + + + +
asINVALID_ARG One or more arguments have invalid values.
asINVALID_CONFIGURATION The engine configuration is invalid.
asBUILD_IN_PROGRESS Another build is in progress.
asERROR The compilation failed.
+
+Use this to compile a single function. The function can be optionally added to the scope of the module, in which case it will be available for subsequent compilations. If not added to the module, the function can still be returned in the output parameter, which will allow the application to execute it, and then discard it when it is no longer needed.

+If the output function parameter is set, remember to release the function object when you're done with it. +

+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual int asIScriptModule::CompileGlobalVar (const char *  sectionName,
const char *  code,
int  lineOffset 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] sectionName The name of the script section
[in] code The script code buffer
[in] lineOffset An offset that will be added to compiler message line numbers
+
+
Returns:
A negative value on error
+
Return values:
+ + + + + +
asINVALID_ARG One or more arguments have invalid values.
asINVALID_CONFIGURATION The engine configuration is invalid.
asBUILD_IN_PROGRESS Another build is in progress.
asERROR The compilation failed.
+
+Use this to add a single global variable to the scope of a module. The variable can then be referred to by the application and subsequent compilations.

+The script code may contain an initialization expression, which will be executed by the compiler if the engine property asEP_INIT_GLOBAL_VARS_AFTER_BUILD is set. +

+

+ +

+
+ + + + + + + + + +
virtual void* asIScriptModule::GetAddressOfGlobalVar (int  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the global variable.
+
+
Returns:
A pointer to the global variable, or null if not found.
+This method should be used to retrieve the pointer of a variable that you wish to access. +
+

+ +

+
+ + + + + + + + +
virtual asIScriptEngine* asIScriptModule::GetEngine (  )  [pure virtual]
+
+
+ +

+

Returns:
A pointer to the engine.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual const char* asIScriptModule::GetEnumByIndex (asUINT  index,
int *  enumTypeId 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] index The index of the enum type.
[out] enumTypeId Receives the type id of the enum type.
+
+
Returns:
The name of the enum type, or null on error.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptModule::GetEnumCount (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of enum types in the module.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual const char* asIScriptModule::GetEnumValueByIndex (int  enumTypeId,
asUINT  index,
int *  outValue 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + + +
[in] enumTypeId The type id of the enum type.
[in] index The index of the enum value.
[out] outValue Receives the numeric value.
+
+
Returns:
The name of the enum value.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::GetEnumValueCount (int  enumTypeId  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] enumTypeId The type id of the enum type.
+
+
Returns:
The number of enum values or a negative value on error.
+
Return values:
+ + +
asINVALID_ARG enumTypeId is not an enum type.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptModule::GetFunctionCount (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error, or the number of global functions in this module.
+
Return values:
+ + +
asERROR The module was not compiled successfully.
+
+This method retrieves the number of compiled script functions. +
+

+ +

+
+ + + + + + + + + +
virtual asIScriptFunction* asIScriptModule::GetFunctionDescriptorById (int  funcId  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] funcId The id of the function or method.
+
+
Returns:
A pointer to the function description interface, or null if not found.
+ +
+

+ +

+
+ + + + + + + + + +
virtual asIScriptFunction* asIScriptModule::GetFunctionDescriptorByIndex (int  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the function.
+
+
Returns:
A pointer to the function description interface, or null if not found.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::GetFunctionIdByDecl (const char *  decl  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] decl The function signature.
+
+
Returns:
A negative value on error, or the function id.
+
Return values:
+ + + + + +
asERROR The module was not compiled successfully.
asINVALID_DECLARATION The decl is invalid.
asMULTIPLE_FUNCTIONS Found multiple matching functions.
asNO_FUNCTION Didn't find any matching functions.
+
+This method should be used to retrieve the id of the script function that you wish to execute. The id is then sent to the context's Prepare method.

+The method will find the script function with the exact same declaration. +

+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::GetFunctionIdByIndex (int  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the function.
+
+
Returns:
A negative value on error, or the function id.
+
Return values:
+ + +
asNO_FUNCTION There is no function with that index.
+
+This method should be used to retrieve the id of the script function that you wish to execute. The id is then sent to the context's Prepare method. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::GetFunctionIdByName (const char *  name  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] name The name of the function.
+
+
Returns:
A negative value on error, or the function id.
+
Return values:
+ + + + +
asERROR The module was not compiled successfully.
asMULTIPLE_FUNCTIONS Found multiple matching functions.
asNO_FUNCTION Didn't find any matching functions.
+
+This method should be used to retrieve the id of the script function that you wish to execute. The id is then sent to the context's Prepare method. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptModule::GetGlobalVarCount (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error, or the number of global variables in the module.
+
Return values:
+ + + +
asERROR The module was not compiled successfully.
asINIT_GLOBAL_VARS_FAILED The initialization of the global variables failed.
+
+ +
+

+ +

+
+ + + + + + + + + +
virtual const char* asIScriptModule::GetGlobalVarDeclaration (int  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the global variable.
+
+
Returns:
A null terminated string with the variable declaration, or null if not found.
+This method can be used to retrieve the variable declaration of the script variables that the host application will access. Verifying the declaration is important because, even though the script may compile correctly the user may not have used the variable types as intended. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::GetGlobalVarIndexByDecl (const char *  decl  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] decl The global variable declaration.
+
+
Returns:
A negative value on error, or the global variable index.
+
Return values:
+ + + +
asERROR The module was not built successfully.
asNO_GLOBAL_VAR The matching global variable was found.
+
+This method should be used to retrieve the index of the script variable that you wish to access.

+The method will find the script variable with the exact same declaration. +

+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::GetGlobalVarIndexByName (const char *  name  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] name The name of the global variable.
+
+
Returns:
A negative value on error, or the global variable index.
+
Return values:
+ + + +
asERROR The module was not built successfully.
asNO_GLOBAL_VAR The matching global variable was found.
+
+This method should be used to retrieve the index of the script variable that you wish to access. +
+

+ +

+
+ + + + + + + + + +
virtual const char* asIScriptModule::GetGlobalVarName (int  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the global variable.
+
+
Returns:
A null terminated string with the variable name, or null if not found.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual int asIScriptModule::GetGlobalVarTypeId (int  index,
bool *  isConst = 0 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] index The index of the global variable.
[out] isConst Receives the constness indicator of the variable.
+
+
Returns:
The type id of the global variable, or a negative value on error.
+
Return values:
+ + +
asINVALID_ARG The index is out of range.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptModule::GetImportedFunctionCount (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error, or the number of imported functions.
+
Return values:
+ + +
asERROR The module was not built successfully.
+
+This function returns the number of functions that are imported in a module. These functions need to be bound before they can be used, or a script exception will be thrown. +
+

+ +

+
+ + + + + + + + + +
virtual const char* asIScriptModule::GetImportedFunctionDeclaration (int  importIndex  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] importIndex The index of the imported function.
+
+
Returns:
A null terminated string with the function declaration, or null if not found.
+Use this function to get the declaration of the imported function. The returned declaration can be used to find a matching function in another module that can be bound to the imported function. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::GetImportedFunctionIndexByDecl (const char *  decl  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] decl The function declaration of the imported function.
+
+
Returns:
A negative value on error, or the index of the imported function.
+
Return values:
+ + + + +
asERROR The module was not built successfully.
asMULTIPLE_FUNCTIONS Found multiple matching functions.
asNO_FUNCTION Didn't find any matching function.
+
+This function is used to find a specific imported function by its declaration. +
+

+ +

+
+ + + + + + + + + +
virtual const char* asIScriptModule::GetImportedFunctionSourceModule (int  importIndex  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] importIndex The index of the imported function.
+
+
Returns:
A null terminated string with the name of the source module, or null if not found.
+Use this function to get the name of the suggested module to import the function from. +
+

+ +

+
+ + + + + + + + +
virtual const char* asIScriptModule::GetName (  )  [pure virtual]
+
+
+ +

+

Returns:
The name of the module.
+ +
+

+ +

+
+ + + + + + + + + +
virtual asIObjectType* asIScriptModule::GetObjectTypeByIndex (asUINT  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the type.
+
+
Returns:
The object type interface for the type, or null if not found.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptModule::GetObjectTypeCount (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of object types declared in the module.
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual const char* asIScriptModule::GetTypedefByIndex (asUINT  index,
int *  typeId 
) [pure virtual]
+
+
+ +

+

Parameters:
+ + + +
[in] index The index of the typedef.
[out] typeId The type that the typedef aliases.
+
+
Returns:
The name of the typedef.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptModule::GetTypedefCount (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of typedefs in the module.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::GetTypeIdByDecl (const char *  decl  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] decl The declaration of the type.
+
+
Returns:
A negative value on error, or the type id of the type.
+
Return values:
+ + +
asINVALID_TYPE decl is not a valid type.
+
+Translates a type declaration into a type id. The returned type id is valid for as long as the type is valid, so you can safely store it for later use to avoid potential overhead by calling this function each time. Just remember to update the type id, any time the type is changed within the engine, e.g. when recompiling script declared classes, or changing the engine configuration.

+The type id is based on a sequence number and depends on the order in which the type ids are queried, thus is not guaranteed to always be the same for each execution of the application. The asETypeIdFlags can be used to obtain some information about the type directly from the id.

+A base type yields the same type id whether the declaration is const or not, however if the const is for the subtype then the type id is different, e.g. string@ isn't the same as const string@ but string is the same as const string. +

+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::LoadByteCode (asIBinaryStream in  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] in The input stream.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + +
asINVALID_ARG The stream object wasn't specified.
asBUILD_IN_PROGRESS Another thread is currently building.
+
+This method is used to load pre-compiled byte code from disk or memory. The application must implement an object that inherits from asIBinaryStream to provide the necessary stream operations.

+It is expected that the application performs the necessary validations to make sure the pre-compiled byte code is from a trusted source. The application should also make sure the pre-compiled byte code is compatible with the current engine configuration, i.e. that the engine has been configured in the same way as when the byte code was first compiled. +

+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::RemoveFunction (int  funcId  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] funcId The id of the function to remove.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asNO_FUNCTION The function is not part of the scope.
+
+This method allows the application to remove a single function from the scope of the module. The function is not destroyed immediately though, only when no more references point to it. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::RemoveGlobalVar (int  index  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] index The index of the global variable.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_ARG The index is out of range.
+
+The global variable is removed from the scope of the module, but it is not destroyed until all functions that access it are freed. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptModule::ResetGlobalVars (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error.
+
Return values:
+ + +
asERROR The module was not compiled successfully.
+
+Resets the global variables declared in this module to their initial value. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::SaveByteCode (asIBinaryStream out  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] out The output stream.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_ARG The stream object wasn't specified.
+
+This method is used to save pre-compiled byte code to disk or memory, for a later restoral. The application must implement an object that inherits from asIBinaryStream to provide the necessary stream operations.

+The pre-compiled byte code is currently not platform independent, so you need to make sure the byte code is compiled on a platform that is compatible with the one that will load it. +

+

+ +

+
+ + + + + + + + + +
virtual void asIScriptModule::SetName (const char *  name  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] name The new name.
+
+Sets the name of the script module. +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptModule::UnbindAllImportedFunctions (  )  [pure virtual]
+
+
+ +

+

Returns:
A negative value on error.
+Unbinds all imported functions in the module. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptModule::UnbindImportedFunction (int  importIndex  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] importIndex The index of the imported function.
+
+
Returns:
A negative value on error.
+
Return values:
+ + +
asINVALID_ARG The index is not valid. Unbinds the imported function.
+
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_module-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_module-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_module-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_module-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,57 @@ + + +AngelScript: Member List + + + + +
+

asIScriptModule Member List

This is the complete list of members for asIScriptModule, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddScriptSection(const char *name, const char *code, size_t codeLength=0, int lineOffset=0)=0asIScriptModule [pure virtual]
BindAllImportedFunctions()=0asIScriptModule [pure virtual]
BindImportedFunction(int importIndex, int funcId)=0asIScriptModule [pure virtual]
Build()=0asIScriptModule [pure virtual]
CompileFunction(const char *sectionName, const char *code, int lineOffset, asDWORD compileFlags, asIScriptFunction **outFunc)=0asIScriptModule [pure virtual]
CompileGlobalVar(const char *sectionName, const char *code, int lineOffset)=0asIScriptModule [pure virtual]
GetAddressOfGlobalVar(int index)=0asIScriptModule [pure virtual]
GetEngine()=0asIScriptModule [pure virtual]
GetEnumByIndex(asUINT index, int *enumTypeId)=0asIScriptModule [pure virtual]
GetEnumCount()=0asIScriptModule [pure virtual]
GetEnumValueByIndex(int enumTypeId, asUINT index, int *outValue)=0asIScriptModule [pure virtual]
GetEnumValueCount(int enumTypeId)=0asIScriptModule [pure virtual]
GetFunctionCount()=0asIScriptModule [pure virtual]
GetFunctionDescriptorById(int funcId)=0asIScriptModule [pure virtual]
GetFunctionDescriptorByIndex(int index)=0asIScriptModule [pure virtual]
GetFunctionIdByDecl(const char *decl)=0asIScriptModule [pure virtual]
GetFunctionIdByIndex(int index)=0asIScriptModule [pure virtual]
GetFunctionIdByName(const char *name)=0asIScriptModule [pure virtual]
GetGlobalVarCount()=0asIScriptModule [pure virtual]
GetGlobalVarDeclaration(int index)=0asIScriptModule [pure virtual]
GetGlobalVarIndexByDecl(const char *decl)=0asIScriptModule [pure virtual]
GetGlobalVarIndexByName(const char *name)=0asIScriptModule [pure virtual]
GetGlobalVarName(int index)=0asIScriptModule [pure virtual]
GetGlobalVarTypeId(int index, bool *isConst=0)=0asIScriptModule [pure virtual]
GetImportedFunctionCount()=0asIScriptModule [pure virtual]
GetImportedFunctionDeclaration(int importIndex)=0asIScriptModule [pure virtual]
GetImportedFunctionIndexByDecl(const char *decl)=0asIScriptModule [pure virtual]
GetImportedFunctionSourceModule(int importIndex)=0asIScriptModule [pure virtual]
GetName()=0asIScriptModule [pure virtual]
GetObjectTypeByIndex(asUINT index)=0asIScriptModule [pure virtual]
GetObjectTypeCount()=0asIScriptModule [pure virtual]
GetTypedefByIndex(asUINT index, int *typeId)=0asIScriptModule [pure virtual]
GetTypedefCount()=0asIScriptModule [pure virtual]
GetTypeIdByDecl(const char *decl)=0asIScriptModule [pure virtual]
LoadByteCode(asIBinaryStream *in)=0asIScriptModule [pure virtual]
RemoveFunction(int funcId)=0asIScriptModule [pure virtual]
RemoveGlobalVar(int index)=0asIScriptModule [pure virtual]
ResetGlobalVars()=0asIScriptModule [pure virtual]
SaveByteCode(asIBinaryStream *out)=0asIScriptModule [pure virtual]
SetName(const char *name)=0asIScriptModule [pure virtual]
UnbindAllImportedFunctions()=0asIScriptModule [pure virtual]
UnbindImportedFunction(int importIndex)=0asIScriptModule [pure virtual]

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_object.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_object.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_object.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_object.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,295 @@ + + +AngelScript: asIScriptObject Class Reference + + + + +
+

asIScriptObject Class Reference

The interface for an instance of a script object. + +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

Memory management
virtual int AddRef ()=0
 Increase reference counter.
virtual int Release ()=0
 Decrease reference counter.
Type info
virtual int GetTypeId () const =0
 Returns the type id of the object.
virtual asIObjectTypeGetObjectType () const =0
 Returns the object type interface for the object.
Properties
virtual int GetPropertyCount () const =0
 Returns the number of properties that the object contains.
virtual int GetPropertyTypeId (asUINT prop) const =0
 Returns the type id of the property referenced by prop.
virtual const char * GetPropertyName (asUINT prop) const =0
 Returns the name of the property referenced by prop.
virtual void * GetAddressOfProperty (asUINT prop)=0
 Returns a pointer to the property referenced by prop.
Miscellaneous
virtual asIScriptEngineGetEngine () const =0
 Return the script engine.
virtual int CopyFrom (asIScriptObject *other)=0
 Copies the content from another object of the same type.
+


Member Function Documentation

+ +
+
+ + + + + + + + +
virtual int asIScriptObject::AddRef (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when storing an additional reference to the object. +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptObject::CopyFrom (asIScriptObject other  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] other A pointer to the source object.
+
+
Returns:
A negative value on error.
+
Return values:
+ + + +
asINVALID_ARG The argument is null.
asINVALID_TYPE The other object is of different type.
+
+This method copies the contents of the other object to this one. +
+

+ +

+
+ + + + + + + + + +
virtual void* asIScriptObject::GetAddressOfProperty (asUINT  prop  )  [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] prop The property index.
+
+
Returns:
A pointer to the property value.
+The method returns a pointer to the memory location for the property. Use the type id for the property to determine the content of the pointer, and how to handle it. +
+

+ +

+
+ + + + + + + + +
virtual asIScriptEngine* asIScriptObject::GetEngine (  )  const [pure virtual]
+
+
+ +

+

Returns:
The script engine.
+ +
+

+ +

+
+ + + + + + + + +
virtual asIObjectType* asIScriptObject::GetObjectType (  )  const [pure virtual]
+
+
+ +

+

Returns:
The object type interface of the script object.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptObject::GetPropertyCount (  )  const [pure virtual]
+
+
+ +

+

Returns:
The number of member properties of the script object.
+ +
+

+ +

+
+ + + + + + + + + +
virtual const char* asIScriptObject::GetPropertyName (asUINT  prop  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] prop The property index.
+
+
Returns:
A null terminated string with the property name.
+ +
+

+ +

+
+ + + + + + + + + +
virtual int asIScriptObject::GetPropertyTypeId (asUINT  prop  )  const [pure virtual]
+
+
+ +

+

Parameters:
+ + +
[in] prop The property index.
+
+
Returns:
The type id of the member property, or a negative value on error.
+
Return values:
+ + +
asINVALID_ARG prop is too large
+
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptObject::GetTypeId (  )  const [pure virtual]
+
+
+ +

+

Returns:
The type id of the script object.
+ +
+

+ +

+
+ + + + + + + + +
virtual int asIScriptObject::Release (  )  [pure virtual]
+
+
+ +

+

Returns:
The number of references to this object.
+Call this method when you will no longer use the references that you own. +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_object-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_object-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_object-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classas_i_script_object-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,25 @@ + + +AngelScript: Member List + + + + +
+

asIScriptObject Member List

This is the complete list of members for asIScriptObject, including all inherited members.

+ + + + + + + + + + +
AddRef()=0asIScriptObject [pure virtual]
CopyFrom(asIScriptObject *other)=0asIScriptObject [pure virtual]
GetAddressOfProperty(asUINT prop)=0asIScriptObject [pure virtual]
GetEngine() const =0asIScriptObject [pure virtual]
GetObjectType() const =0asIScriptObject [pure virtual]
GetPropertyCount() const =0asIScriptObject [pure virtual]
GetPropertyName(asUINT prop) const =0asIScriptObject [pure virtual]
GetPropertyTypeId(asUINT prop) const =0asIScriptObject [pure virtual]
GetTypeId() const =0asIScriptObject [pure virtual]
Release()=0asIScriptObject [pure virtual]

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classes.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classes.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classes.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/classes.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ + + +AngelScript: Alphabetical List + + + + + +
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/deprecated.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/deprecated.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/deprecated.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/deprecated.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,23 @@ + + +AngelScript: Deprecated List + + + + +
+

Deprecated List

+
Member asIScriptEngine::ExecuteString (const char *module, const char *script, asIScriptContext **ctx=0, asDWORD flags=0)=0
+
Since 2.18.0. Use the ExecuteString helper function instead.
+
+

+

+
Member asEExecStrFlags
+
since 2.18.0
+
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_any.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_any.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_any.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_any.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,81 @@ + + +AngelScript: any object + + + + +
+

any object

Path: /sdk/add_on/scriptany/

+The any type is a generic container that can hold any value. It is a reference type.

+The type is registered with RegisterScriptAny(asIScriptEngine*).

+Public C++ interface

+
class CScriptAny
+{
+public:
+  // Constructors
+  CScriptAny(asIScriptEngine *engine);
+  CScriptAny(void *ref, int refTypeId, asIScriptEngine *engine);
+
+  // Memory management
+  int AddRef();
+  int Release();
+
+  // Copy the stored value from another any object
+  CScriptAny &operator=(const CScriptAny&);
+  int CopyFrom(const CScriptAny *other);
+
+  // Store the value, either as variable type, integer number, or real number
+  void Store(void *ref, int refTypeId);
+  void Store(asINT64 &value);
+  void Store(double &value);
+
+  // Retrieve the stored value, either as variable type, integer number, or real number
+  bool Retrieve(void *ref, int refTypeId) const;
+  bool Retrieve(asINT64 &value) const;
+  bool Retrieve(double &value) const;
+
+  // Get the type id of the stored value
+  int GetTypeId() const;
+};
+

+Public script interface

+
+  class any
+  {
+    any();
+    any(? &in value);

+

    void store(? &in value);
+    void store(int64 &in value);
+    void store(double &in value);

+

    bool retrieve(? &out value) const;
+    bool retrieve(int64 &out value) const;
+    bool retrieve(double &out value) const;
+  }
+

+Example usage

+In the scripts it can be used as follows:

+

+  int value;
+  obj object;
+  obj @handle;
+  any a,b,c;
+  a.store(value);      // store the value
+  b.store(@handle);    // store an object handle
+  c.store(object);     // store a copy of the object

+

  a.retrieve(value);   // retrieve the value
+  b.retrieve(@handle); // retrieve the object handle
+  c.retrieve(object);  // retrieve a copy of the object
+

+In C++ the type can be used as follows:

+

CScriptAny *myAny;
+int typeId = engine->GetTypeIdByDecl("string@");
+CScriptString *str = new CScriptString("hello world");
+myAny->Store((void*)&str, typeId);
+myAny->Retrieve((void*)&str, typeId);
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_application.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_application.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_application.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_application.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,16 @@ + + +AngelScript: Application modules + + + + + +
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_array.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_array.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_array.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_array.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,74 @@ + + +AngelScript: array template object + + + + +
+

array template object

Path: /sdk/add_on/scriptarray/

+The array type is a template object that allow the scripts to declare arrays of any type. Since it is a generic class it is not the most performatic due to the need to determine characteristics at runtime. For that reason it is recommended that the application registers a template specialization for the array types that are most commonly used.

+The type is registered with RegisterScriptArray(asIScriptEngine*).

+Public C++ interface

+
class CScriptArray
+{
+public:
+  // Constructor
+  CScriptArray(asUINT length, asIObjectType *ot);
+  virtual ~CScriptArray();
+
+  // Memory management
+  void AddRef();
+  void Release();
+
+  // Type information
+  asIObjectType *GetArrayObjectType() const;
+  int            GetArrayTypeId() const;
+  int            GetElementTypeId() const;
+
+  // Get the current size
+  asUINT GetSize();
+
+  // Resize the array
+  void   Resize(asUINT numElements);
+  
+  // Get a pointer to an element. Returns 0 if out of bounds
+  void  *At(asUINT index);
+
+  // Copy the contents of one array to another (only if the types are the same)
+  CScriptArray &operator=(const CScriptArray&);
+};
+

+Public script interface

+
+  class array<class T>
+  {
+    array();
+    array(uint length);

+

    // Access elements
+    // T & operator [] (uint)
+    // const T & operator [] (uint) const

+

    array<T> opAssign(const array<T> & in);

+

    uint length();
+    void resize(uint);
+  }
+

+Script example

+
+  int main()
+  {
+    array<int> arr(3);
+    arr[0] = 1;
+    arr[1] = 2;
+    arr[2] = 3;

+

    int sum = 0;
+    for( uint n = 0; n < arr.length(); n++ )
+      sum += arr[n];

+

    return sum;
+  }
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_autowrap.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_autowrap.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_autowrap.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_autowrap.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,40 @@ + + +AngelScript: Automatic wrapper functions + + + + +
+

Automatic wrapper functions

Path: /sdk/add_on/autowrapper/aswrappedcall.h

+This header file declares some macros and template functions that will let the application developer automatically generate wrapper functions using the generic calling convention with a simple call to a preprocessor macro. This is useful for those platforms where the native calling conventions are not yet supported.

+The macros are defined as

+

#define asDECLARE_FUNCTION_WRAPPER(wrapper_name,func)
+#define asDECLARE_FUNCTION_WRAPPERPR(wrapper_name,func,params,rettype)
+#define asDECLARE_METHOD_WRAPPER(wrapper_name,cl,func)
+#define asDECLARE_METHOD_WRAPPERPR(wrapper_name,cl,func,params,rettype)
+

+where wrapper_name is the name of the function that you want to generate, and func is a function pointer to the function you want to wrap, cl is the class name, params is the parameter list, and rettype is the return type.

+Unfortunately the template functions needed to perform this generation are quite complex and older compilers may not be able to handle them. One such example is Microsoft Visual C++ 6, though luckily it has no need for them as AngelScript already supports native calling conventions for it.

+Example usage

+
#include "aswrappedcall.h"
+
+// The application function that we want to register
+void DoSomething(std::string param1, int param2);
+
+// Generate the wrapper for the function
+asDECLARE_FUNCTION_WRAPPER(DoSomething_Generic, DoSomething);
+
+// Registering the wrapper with AngelScript
+void RegisterWrapper(asIScriptEngine *engine)
+{
+  int r;
+
+  r = engine->RegisterGlobalFunction("void DoSomething(string, int)", asFUNCTION(DoSomething_Generic), asCALL_GENERIC); assert( r >= 0 );
+}
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_build.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_build.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_build.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_build.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,128 @@ + + +AngelScript: Script builder helper + + + + +
+

Script builder helper

Path: /sdk/add_on/scriptbuilder/

+This class is a helper class for loading and building scripts, with a basic pre-processor that supports conditional compilation, include directives, and metadata declarations.

+By default the script builder resolves include directives by loading the included file from the relative directory of the file it is included from. If you want to do this in another way, then you should implement the include callback which will let you process the include directive in a custom way, e.g. to load the included file from memory, or to support multiple search paths. The include callback should call the AddSectionFromFile or AddSectionFromMemory to include the section in the current build.

+If you do not want process metadata then you can compile the add-on with the define AS_PROCESS_METADATA 0, which will exclude the code for processing this. This define can be made in the project settings or directly in the header.

+Public C++ interface

+
class CScriptBuilder
+{
+public:
+  // Start a new module
+  int StartNewModule(asIScriptEngine *engine, const char *moduleName);
+
+  // Load a script section from a file on disk
+  int AddSectionFromFile(const char *filename);
+
+  // Load a script section from memory
+  int AddSectionFromMemory(const char *scriptCode, 
+                           const char *sectionName = "");
+
+  // Build the added script sections
+  int BuildModule();
+
+  // Register the callback for resolving include directive
+  void SetIncludeCallback(INCLUDECALLBACK_t callback, void *userParam);
+
+  // Add a pre-processor define for conditional compilation
+  void DefineWord(const char *word);
+
+  // Get metadata declared for class types and interfaces
+  const char *GetMetadataStringForType(int typeId);
+
+  // Get metadata declared for functions
+  const char *GetMetadataStringForFunc(int funcId);
+
+  // Get metadata declared for global variables
+  const char *GetMetadataStringForVar(int varIdx);
+};
+

+The include callback signature

+
// This callback will be called for each #include directive encountered by the
+// builder. The callback should call the AddSectionFromFile or AddSectionFromMemory
+// to add the included section to the script. If the include cannot be resolved
+// then the function should return a negative value to abort the compilation.
+typedef int (*INCLUDECALLBACK_t)(const char *include, const char *from, CScriptBuilder *builder, void *userParam);
+

+Include directives

+Example script with include directive:

+

+  #include "commonfuncs.as"

+

  void main()
+  {
+    // Call a function from the included file
+    CommonFunc();
+  }
+

+Conditional programming

+The builder supports conditional programming through the #if/#endif preprocessor directives. The application may define a word with a call to DefineWord(), then the scripts may check for this definition in the code in order to include/exclude parts of the code.

+This is especially useful when scripts are shared between different binaries, for example, in a client/server application.

+Example script with conditional compilation:

+

+  class CObject
+  {
+    void Process()
+    {
+  #if SERVER
+      // Do some server specific processing
+  #endif

+

  #if CLIENT
+      // Do some client specific processing
+  #endif

+

      // Do some common processing
+    }
+  }
+

+Metadata in scripts

+Metadata can be added before script class, interface, function, and global variable declarations. The metadata is removed from the script by the builder class and stored for post build lookup by the type id, function id, or variable index.

+Exactly what the metadata looks like is up to the application. The builder class doesn't impose any rules, except that the metadata should be added between brackets []. After the script has been built the application can obtain the metadata strings and interpret them as it sees fit.

+Example script with metadata:

+

+  [factory func = CreateOgre,
+   editable: myPosition,
+   editable: myStrength [10, 100]]
+  class COgre
+  {
+    vector3 myPosition;
+    int     myStrength;
+  }

+

  [factory]
+  COgre @CreateOgre()
+  {
+    return @COgre();
+  }
+

+Example usage:

+

CScriptBuilder builder;
+int r = builder.StartNewModule(engine, "my module");
+if( r >= 0 )
+  r = builder.AddSectionFromMemory(script);
+if( r >= 0 )
+  r = builder.BuildModule();
+if( r >= 0 )
+{
+  // Find global variables that have been marked as editable by user
+  asIScriptModule *mod = engine->GetModule("my module");
+  int count = mod->GetGlobalVarCount();
+  for( int n = 0; n < count; n++ )
+  {
+    string metadata = builder.GetMetadataStringForVar(n);
+    if( metadata == "editable" )
+    {
+      // Show the global variable in a GUI
+      ...
+    }
+  }
+}
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_clib.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_clib.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_clib.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_clib.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,88 @@ + + +AngelScript: ANSI C library interface + + + + +
+

ANSI C library interface

Path: /sdk/add_on/clib/

+This add-on defines a pure C interface, that can be used in those applications that do not understand C++ code but do understand C, e.g. Delphi, Java, and D.

+To compile the AngelScript C library, you need to compile the library source files in sdk/angelscript/source together with the source files in sdk/add-on/clib, and link them as a shared dynamic library. In the application that will use the AngelScript C library, you'll include the angelscript_c.h header file, instead of the ordinary angelscript.h header file. After that you can use the library much the same way that it's used in C++.

+To find the name of the C functions to call, you normally take the corresponding interface method and give a prefix according to the following table:

+ + + + + + + + + + + + + + + + + + + +
interface  prefix 
asIScriptEngine   asEngine_
asIScriptModule   asModule_
asIScriptContext   asContext_
asIScriptGeneric   asGeneric_
asIScriptArray   asArray_
asIScriptObject   asObject_
asIObjectType   asObjectType_
asIScriptFunction   asScriptFunction_
+

+All interface methods take the interface pointer as the first parameter when in the C function format, the rest of the parameters are the same as in the C++ interface. There are a few exceptions though, e.g. all parameters that take an asSFuncPtr take a normal function pointer in the C function format.

+Example:

+

#include <stdio.h>
+#include <assert.h>
+#include "angelscript_c.h"
+
+void MessageCallback(asSMessageInfo *msg, void *);
+void PrintSomething();
+
+int main(int argc, char **argv)
+{
+  int r = 0;
+
+  // Create and initialize the script engine
+  asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
+  r = asEngine_SetMessageCallback(engine, (asFUNCTION_t)MessageCallback, 0, asCALL_CDECL); assert( r >= 0 );
+  r = asEngine_RegisterGlobalFunction(engine, "void print()", (asFUNCTION_t)PrintSomething, asCALL_CDECL); assert( r >= 0 );
+
+  // Execute a simple script
+  r = asEngine_ExecuteString(engine, 0, "print()", 0, 0);
+  if( r != asEXECUTION_FINISHED )
+  {
+      printf("Something wen't wrong with the execution\n");
+  }
+  else
+  {
+      printf("The script was executed successfully\n");
+  }
+
+  // Release the script engine
+  asEngine_Release(engine);
+  
+  return r;
+}
+
+void MessageCallback(asSMessageInfo *msg, void *)
+{
+  const char *msgType = 0;
+  if( msg->type == 0 ) msgType = "Error  ";
+  if( msg->type == 1 ) msgType = "Warning";
+  if( msg->type == 2 ) msgType = "Info   ";
+
+  printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, msgType, msg->message);
+}
+
+void PrintSomething()
+{
+  printf("Called from the script\n");
+}
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_ctxmgr.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_ctxmgr.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_ctxmgr.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_ctxmgr.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,69 @@ + + +AngelScript: Context manager + + + + +
+

Context manager

Path: /sdk/add_on/contextmgr/

+The CContextMgr is a class designed to aid the management of multiple simultaneous scripts executing in parallel. It supports both concurrent script threads and co-routines.

+If the application doesn't need multiple contexts, i.e. all scripts that are executed always complete before the next script is executed, then this class is not necessary.

+Multiple context managers can be used, for example when you have a group of scripts controlling ingame objects, and another group of scripts controlling GUI elements, then each of these groups may be managed by different context managers.

+Observe, that the context manager class hasn't been designed for multithreading, so you need to be careful if your application needs to execute scripts from multiple threads.

+

See also:
The samples Concurrent scripts and Co-routines for uses
+

+Public C++ interface

+
class CContextMgr
+{
+public:
+  CContextMgr();
+  ~CContextMgr();
+
+  // Set the function that the manager will use to obtain the time in milliseconds.
+  void SetGetTimeCallback(TIMEFUNC_t func);
+
+  // Registers the script function
+  //
+  //  void sleep(uint milliseconds)
+  //
+  // The application must set the get time callback for this to work
+  void RegisterThreadSupport(asIScriptEngine *engine);
+
+  // Registers the script functions
+  //
+  //  void createCoRoutine(const string &in functionName, any @arg)
+  //  void yield()
+  void RegisterCoRoutineSupport(asIScriptEngine *engine);
+
+  // Create a new context, prepare it with the function id, then return 
+  // it so that the application can pass the argument values. The context
+  // will be released by the manager after the execution has completed.
+  asIScriptContext *AddContext(asIScriptEngine *engine, int funcId);
+
+  // Create a new context, prepare it with the function id, then return
+  // it so that the application can pass the argument values. The context
+  // will be added as a co-routine in the same thread as the currCtx.
+  asIScriptContext *AddContextForCoRoutine(asIScriptContext *currCtx, int funcId);
+
+  // Execute each script that is not currently sleeping. The function returns after 
+  // each script has been executed once. The application should call this function
+  // for each iteration of the message pump, or game loop, or whatever.
+  void ExecuteScripts();
+
+  // Put a script to sleep for a while
+  void SetSleeping(asIScriptContext *ctx, asUINT milliSeconds);
+
+  // Switch the execution to the next co-routine in the group.
+  // Returns true if the switch was successful.
+  void NextCoRoutine();
+
+  // Abort all scripts
+  void AbortAll();
+};
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_dict.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_dict.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_dict.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_dict.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,80 @@ + + +AngelScript: dictionary object + + + + +
+

dictionary object

Path: /sdk/add_on/scriptdictionary/

+The dictionary object maps string values to values or objects of other types.

+Register with RegisterScriptDictionary(asIScriptEngine*).

+Public C++ interface

+
class CScriptDictionary
+{
+public:
+  // Memory management
+  CScriptDictionary(asIScriptEngine *engine);
+  void AddRef();
+  void Release();
+
+  // Sets/Gets a variable type value for a key
+  void Set(const std::string &key, void *value, int typeId);
+  bool Get(const std::string &key, void *value, int typeId) const;
+
+  // Sets/Gets an integer number value for a key
+  void Set(const std::string &key, asINT64 &value);
+  bool Get(const std::string &key, asINT64 &value) const;
+
+  // Sets/Gets a real number value for a key
+  void Set(const std::string &key, double &value);
+  bool Get(const std::string &key, double &value) const;
+
+  // Returns true if the key is set
+  bool Exists(const std::string &key) const;
+  
+  // Deletes the key
+  void Delete(const std::string &key);
+  
+  // Deletes all keys
+  void DeleteAll();
+};
+

+Public script interface

+
+  class dictionary
+  {
+    void set(const string &in key, ? &in value);
+    bool get(const string &in value, ? &out value) const;

+

    void set(const string &in key, int64 &in value);
+    bool get(const string &in key, int64 &out value) const;

+

    void set(const string &in key, double &in value);
+    bool get(const string &in key, double &out value) const;

+

    bool exists(const string &in key) const;
+    void delete(const string &in key);
+    void deleteAll();
+  }
+

+Script example

+
+  dictionary dict;
+  obj object;
+  obj @handle;

+

  dict.set("one", 1);
+  dict.set("object", object);
+  dict.set("handle", @handle);

+

  if( dict.exists("one") )
+  {
+    bool found = dict.get("handle", @handle);
+    if( found )
+    {
+      dict.delete("object");
+    }
+  }

+

  dict.deleteAll();
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_file.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_file.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_file.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_file.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,84 @@ + + +AngelScript: file object + + + + +
+

file object

Path: /sdk/add_on/scriptfile/

+This object provides support for reading and writing files.

+Register with RegisterScriptFile(asIScriptEngine*).

+If you do not want to provide write access for scripts then you can compile the add on with the define AS_WRITE_OPS 0, which will disable support for writing. This define can be made in the project settings or directly in the header.

+Public C++ interface

+
class CScriptFile
+{
+public:
+  // Constructor
+  CScriptFile();
+
+  // Memory management
+  void AddRef();
+  void Release();
+
+  // Opening and closing file handles
+  // mode = "r" -> open the file for reading
+  // mode = "w" -> open the file for writing (overwrites existing files)
+  // mode = "a" -> open the file for appending
+  int Open(const std::string &filename, const std::string &mode);
+  int Close();
+  
+  // Returns the size of the file
+  int GetSize() const;
+  
+  // Returns true if the end of the file has been reached
+  bool IsEOF() const;
+
+  // Reads a specified number of bytes into the string
+  int ReadString(unsigned int length, std::string &str);
+  
+  // Reads to the next new-line character
+  int ReadLine(std::string &str);
+  
+  // Writes a string to the file
+  int WriteString(const std::string &str);
+  
+  // File cursor manipulation
+  int GetPos() const;
+  int SetPos(int pos);
+  int MovePos(int delta);
+};
+

+Public script interface

+
+  class file
+  {
+    int      open(const string &in filename, const string &in mode);
+    int      close();
+    int      getSize() const;
+    bool     isEndOfFile() const;
+    int      readString(uint length, string &out str);
+    int      readLine(string &out str);
+    int      writeString(const string &in string);
+    int      getPos() const;
+    int      setPos(int pos);
+    int      movePos(int delta);
+  }
+

+Script example

+
+  file f;
+  // Open the file in 'read' mode
+  if( f.open("file.txt", "r") >= 0 ) 
+  {
+      // Read the whole file into the string buffer
+      string str;
+      f.readString(f.getSize(), str); 
+      f.close();
+  }
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_helpers.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_helpers.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_helpers.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_helpers.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,55 @@ + + +AngelScript: Helper functions + + + + +
+

Helper functions

Path: /sdk/add_on/scripthelper/

+These helper functions simplify the implemention of common tasks. They can be used as is or can serve as the starting point for your own framework.

+Public C++ interface

+
// Compare relation between two objects of the same type.
+// Uses the object's opCmp method to perform the comparison.
+// Returns a negative value if the comparison couldn't be performed.
+int CompareRelation(asIScriptEngine *engine, void *leftObj, void *rightObj, int typeId, int &result);
+
+// Compare equality between two objects of the same type.
+// Uses the object's opEquals method to perform the comparison, or if that doesn't exist the opCmp method.
+// Returns a negative value if the comparison couldn't be performed.
+int CompareEquality(asIScriptEngine *engine, void *leftObj, void *rightObj, int typeId, bool &result);
+
+// Compile and execute simple statements.
+// The module is optional. If given the statements can access the entities compiled in the module.
+// The caller can optionally provide its own context, for example if a context should be reused.
+int ExecuteString(asIScriptEngine *engine, const char *code, asIScriptModule *mod = 0, asIScriptContext *ctx = 0);
+

+Example

+To compare two script objects the application can execute the following code:

+

void Compare(asIScriptObject *a, asIScriptObject *b)
+{
+  asIScriptEngine *engine = a->GetEngine();
+  int typeId = a->GetTypeId();
+
+  int cmp;
+  int r = CompareRelation(engine, a, b, typeId, cmp);
+  if( r < 0 )
+  {
+    cout << "The relation between a and b cannot be established b" << endl;
+  }
+  else
+  {
+    if( cmp < 0 )
+      cout << "a is smaller than b" << endl;
+    else if( cmp == 0 )
+      cout << "a is equal to b" << endl;
+    else
+      cout << "a is greater than b" << endl;
+  }
+}
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ + + +AngelScript: Add-ons + + + + +
+

Add-ons

This page gives a brief description of the add-ons that you'll find in the /sdk/add_on/ folder.

+

+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_math3d.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_math3d.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_math3d.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_math3d.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ + + +AngelScript: 3D math functions + + + + +
+

3D math functions

Path: /sdk/add_on/scriptmath3d/

+This add-on registers some value types and functions that permit the scripts to perform 3D mathematical operations. Use RegisterScriptMath3D(asIScriptEngine*) to perform the registration.

+Currently the only thing registered is the vector3 type, representing a 3D vector, with basic math operators, such as add, subtract, scalar multiply, equality comparison, etc.

+This add-on serves mostly as a sample on how to register a value type. Application developers will most likely want to register their own math library rather than use this add-on as-is.

+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_math.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_math.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_math.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_math.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,37 @@ + + +AngelScript: math functions + + + + +
+

math functions

Path: /sdk/add_on/scriptmath/

+This add-on registers the math functions from the standard C runtime library with the script engine. Use RegisterScriptMath(asIScriptEngine*) to perform the registration.

+By defining the preprocessor word AS_USE_FLOAT=0, the functions will be registered to take and return doubles instead of floats.

+Public script interface

+
+  float cos(float rad);
+  float sin(float rad);
+  float tan(float rad);
+  float acos(float val);
+  float asin(float val);
+  float atan(float val);
+  float atan2(float y, float x);
+  float cosh(float rad);
+  float sinh(float rad);
+  float tanh(float rad);
+  float log(float val);
+  float log10(float val);
+  float pow(float val, float exp);
+  float sqrt(float val);
+  float ceil(float val);
+  float abs(float val);
+  float floor(float val);
+  float fraction(float val);
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_script.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_script.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_script.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_script.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,16 @@ + + +AngelScript: Script extensions + + + + + +
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_std_string.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_std_string.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_std_string.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_std_string.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,54 @@ + + +AngelScript: string object (STL) + + + + +
+

string object (STL)

Path: /sdk/add_on/scriptstdstring/

+This add-on registers the std::string type as-is with AngelScript. This gives perfect compatibility with C++ functions that use std::string in parameters or as return type.

+A potential drawback is that the std::string type is a value type, thus may increase the number of copies taken when string values are being passed around in the script code. However, this is most likely only a problem for scripts that perform a lot of string operations.

+Register the type with RegisterStdString(asIScriptEngine*).

+

See also:
string object (reference counted)
+

+Public C++ interface

+Refer to the std::string implementation for your compiler.

+Public script interface

+
+  class string
+  {
+    // Constructors
+    string();

+

    // Returns the length of the string
+    uint length() const;

+

    // Assignment and concatenation
+    string &opAssign(const string &in other);
+    string &opAddAssign(const string &in other);
+    string  opAdd(const string &in right) const;

+

    // Access individual characters
+    // uint8 &operator [] (uint)
+    // const uint8 &operator [] (uint) const

+

    // Comparison operators
+    bool opEquals(const string &in right) const;
+    int  opCmp(const string &in right) const;

+

    // Automatic conversion from number types to string type
+    string &opAssign(double val);
+    string &opAddAssign(double val);
+    string  opAdd(double val) const;
+    string  opAdd_r(double val) const;

+

    string &opAssign(int val);
+    string &opAddAssign(int val);
+    string  opAdd(int val) const;
+    string  opAdd_r(int val) const;

+

    string &opAssign(uint val);
+    string &opAddAssign(uint val);
+    string  opAdd(uint val) const;
+    string  opAdd_r(uint val) const;
+  }
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_string.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_string.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_string.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_addon_string.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,105 @@ + + +AngelScript: string object (reference counted) + + + + +
+

string object (reference counted)

Path: /sdk/add_on/scriptstring/

+This add-on registers a string type that is in most situations compatible with the std::string, except that it uses reference counting. This means that if you have an application function that takes a std::string by reference, you can register it with AngelScript to take a script string by reference. This works because the CScriptString wraps the std::string type, with the std::string type at the first byte of the CScriptString object.

+Register the type with RegisterScriptString(asIScriptEngine*). Register the utility functions with RegisterScriptStringUtils(asIScriptEngine*).

+

See also:
string object (STL)
+

+Public C++ interface

+
class CScriptString
+{
+public:
+  // Constructors
+  CScriptString();
+  CScriptString(const CScriptString &other);
+  CScriptString(const char *s);
+  CScriptString(const std::string &s);
+
+  // Memory management
+  void AddRef();
+  void Release();
+
+  // Assignment
+  CScriptString &operator=(const CScriptString &other);
+  
+  // Concatenation
+  CScriptString &operator+=(const CScriptString &other);
+  friend CScriptString *operator+(const CScriptString &a, const CScriptString &b);
+  
+  // Memory buffer
+  std::string buffer;
+};
+

+Public script interface

+
+  class string
+  {
+    // Constructors
+    string();
+    string(const string &in other);

+

    // Returns the length of the string
+    uint length() const;

+

    // Assignment and concatenation
+    string &opAssign(const string &in other);
+    string &opAddAssign(const string &in other);
+    string @opAdd(const string &in right) const;

+

    // Access individual characters
+    // uint8 &operator [] (uint)
+    // const uint8 &operator [] (uint) const

+

    // Comparison operators
+    bool opEquals(const string &in right) const;
+    int  opCmp(const string &in right) const;

+

    // Automatic conversion from number types to string type
+    string &opAssign(double val);
+    string &opAddAssign(double val);
+    string @opAdd(double val) const;
+    string @opAdd_r(double val) const;

+

    string &opAssign(float val);
+    string &opAddAssign(float val);
+    string @opAdd(float val) const;
+    string @opAdd_r(float val) const;

+

    string &opAssign(int val);
+    string &opAddAssign(int val);
+    string @opAdd(int val) const;
+    string @opAdd_r(int val) const;

+

    string &opAssign(uint val);
+    string &opAddAssign(uint val);
+    string @opAdd(uint val) const;
+    string @opAdd_r(uint val) const;
+  }

+

  // Get a substring of a string
+  string @ substring(const string &in str, int start, int length);

+

  // Find the first occurrance of the substring
+  int findFirst(const string &in str, const string &in sub);
+  int findFirst(const string &in str, const string &in sub, int startAt)

+

  // Find the last occurrance of the substring
+  int findLast(const string &in str, const string &in sub);
+  int findLast(const string &in str, const string &in sub, int startAt);

+

  // Find the first character from the set 
+  int findFirstOf(const string &in str, const string &in set);
+  int findFirstOf(const string &in str, const string &in set, int startAt);

+

  // Find the first character not in the set
+  int findFirstNotOf(const string &in str, const string &in set);
+  int findFirstNotOf(const string &in str, const string &in set, int startAt);

+

  // Find the last character from the set
+  int findLastOf(const string &in str, const string &in set);
+  int findLastOf(const string &in str, const string &in set, int startAt);

+

  // Find the last character not in the set
+  int findLastNotOf(const string &in str, const string &in set);
+  int findLastNotOf(const string &in str, const string &in set, int startAt);

+

  // Split the string into an array of substrings
+  string@[]@ split(const string &in str, const string &in delimiter);

+

  // Join an array of strings into a larger string separated by a delimiter
+  string@ join(const string@[] &in str, const string &in delimiter);
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_advanced_api.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_advanced_api.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_advanced_api.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_advanced_api.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,16 @@ + + +AngelScript: Advanced application interface + + + + + +
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_advanced.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_advanced.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_advanced.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_advanced.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,22 @@ + + +AngelScript: Advanced topics + + + + +
+

Advanced topics

+

+

Todo:
Add page about dynamic config groups

+Add page about custom memory management

+Add page about customizations/optimizations

+Add page about imports and function binding

+Add page about execute string and dynamic compilations

+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_class_hierarchy.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_class_hierarchy.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_class_hierarchy.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_class_hierarchy.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,102 @@ + + +AngelScript: Class hierarchies + + + + +
+

Class hierarchies

AngelScript cannot automatically determine relationships between registered classes, so in order to establish the hierarchies for use within the script language it is necessary to do a bit more registration beyond the normal object registration.

+Hierarchies can currently only be registered for reference types, not for value types.

+Establishing the relationship

+In order to let AngelScript know that two types are related you need to register the reference cast behaviours asBEHAVE_REF_CAST and asBEHAVE_IMPLICIT_REF_CAST. The asBEHAVE_REF_CAST should be used if you only want to allow the cast through an explicit call with the cast<class> operator. asBEHAVE_IMPLICIT_REF_CAST should be used when you want to allow the compiler to implicitly perform the cast as necessary.

+Usually you'll want to use asBEHAVE_IMPLICIT_REF_CAST for casts from a derived type to the base type, and asBEHAVE_REF_CAST for casts from a base type to a derived type.

+

// Example REF_CAST behaviour
+template<class A, B>
+B* refCast(A* a)
+{
+    // If the handle already is a null handle, then just return the null handle
+    if( !a ) return 0;
+
+    // Now try to dynamically cast the pointer to the wanted type
+    B* b = dynamic_cast<B*>(a);
+    if( b != 0 )
+    {
+        // Since the cast was made, we need to increase the ref counter for the returned handle
+        b->addref();
+    }
+    return b;
+}
+
+// Example registration of the behaviour
+r = engine->RegisterObjectBehaviour("base", asBEHAVE_REF_CAST, "derived@ f()", asFUNCTION((refCast<base,derived>)), asCALL_CDECL_OBJLAST); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("derived", asBEHAVE_IMPLICIT_REF_CAST, "base@ f()", asFUNCTION((refCast<derived,base>)), asCALL_CDECL_OBJLAST); assert( r >= 0 );
+

+Note that it may be necessary to add extra parenthesis to the asFUNCTION macro so that the preprocessor doesn't interpret the , in the template declaration as the argument separator in the macro.

+Remember that it is legal for the script to attempt a cast on a null pointer, in which case the result is also a null pointer. This means that the reference cast behaviour must not be implemented as a virtual class method, because then the call will crash if the object pointer is null.

+Inherited methods and properties

+Just as relationships cannot be determined, there is also no way to automatically let AngelScript add inherited methods and properties to derived types. The reason for this is that method pointers and property offsets may differ between the base class and derived class, especially when multiple inheritance is used, and there is no way to automatically determine exactly what the difference is.

+For this reason the application needs to register all the inherited methods and properties for the derived classes, which may lead to a bit of duplicate code. However, you may be able to avoid the duplication through a bit of clever thinking. Here is an example of registering the methods and properties for a base class and the derived class (registration of behaviours has been omitted for briefness):

+

// The base class
+class base
+{
+public:
+  virtual void aMethod();
+  
+  int aProperty;
+};
+
+// The derived class
+class derived : public base
+{
+public:
+  virtual void aNewMethod();
+  
+  int aNewProperty;
+};
+
+// The code to register the classes
+// This is implemented as a template function, to support multiple inheritance
+template <class T>
+void RegisterBaseMembers(asIScriptEngine *engine, const char *type)
+{
+  int r;
+
+  r = engine->RegisterObjectMethod(type, "void aMethod()", asMETHOD(T, aMethod), asCALL_THISCALL); assert( r >= 0 );
+  
+  r = engine->RegisterObjectProperty(type, "int aProperty", offsetof(T, aProperty)); assert( r >= 0 );
+}
+
+template <class T>
+void RegisterDerivedMembers(asIScriptEngine *engine, const char *type)
+{
+  int r;
+
+  // Register the inherited members by calling 
+  // the registration of the base members
+  RegisterBaseMembers<T>(engine, type);
+
+  // Now register the new members
+  r = engine->RegisterObjectMethod(type, "void aNewMethod()", asMETHOD(T, aNewMethod), asCALL_THISCALL); assert( r >= 0 );
+
+  r = engine->RegisterObjectProperty(type, "int aProperty", offsetof(T, aProperty)); assert( r >= 0 );
+}
+
+void RegisterTypes(asIScriptEngine *engine)
+{
+  int r;
+
+  // Register the base type
+  r = engine->RegisterObjectType("base", 0, asOBJ_REF); assert( r >= 0 );
+  RegisterBaseMembers<base>(engine, "base");
+
+  // Register the derived type
+  r = engine->RegisterObjectType("derived", 0, asOBJ_REF); assert( r >= 0 );
+  RegisterDerivedMembers<derived>(engine, "derived");
+}
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_concurrent.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_concurrent.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_concurrent.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_concurrent.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,16 @@ + + +AngelScript: Concurrent scripts + + + + + +
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_coroutine.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_coroutine.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_coroutine.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_coroutine.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,16 @@ + + +AngelScript: Co-routines + + + + +
+

Co-routines

Todo:
Complete this page
+
See also:
Context manager, Co-routines
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_jit_1.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_jit_1.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_jit_1.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_jit_1.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,272 @@ + + +AngelScript: Byte code instructions + + + + +
+

Byte code instructions

This page gives a brief description of each of the byte code instructions that the virtual machine has.

+

+

+Object management

+Perform a bitwise copy of a memory buffer to another

+

+

+Push the address and length of a string on the stack

+

+

+Allocate the memory for an object and setup the VM to execute the constructor

+

+

+Release the memory of an object

+

+

+Move the address in an object variable to the object register. The address in the variable is then cleared.

+

+

+Move the address from the object register to an object variable. The address in the object register is then cleared.

+

+

+Copy the object handle from one address to another. The reference count of the object is updated to reflect the copy.

+

+

+Push the pointer of an object type on the stack

+

+

+Push the type id on the stack

+

+

+Pop an address to a script object from the stack. If the desired cast can be made store the address in the object register.

+

+

+Math instructions

+Negate the value in the variable. The original value is overwritten.

+

+

+Perform the operation with the value of two variables and store the result in a third variable.

+

+

+

+

+

+

+

+

+Perform the operation with a constant value and the value of the variable. The original value is overwritten.

+

+

+

+

+Bitwise instructions

+Perform a boolean not operation on the value in the variable. The original value is overwritten.

+

+

+Perform a bitwise complement on the value in the variable. The original value is overwritten.

+

+

+Perform the operation with the value of two variables and store the result in a third variable.

+

+

+

+

+

+

+

+

+Comparisons

+Compare the value of two variables and store the result in the value register.

+

+

+Compare the value of a variable with a constant and store the result in the value register.

+

+

+Test the value in the value register. Update the value register according to the result.

+

+

+Type conversions

+Convert the value in the variable. The original value is overwritten.

+

+

+

+

+

+

+Convert the value of a variable and store the result in another variable.

+

+

+

+

+Increment and decrement

+Increment or decrement the value pointed to by the address in the value register.

+

+

+Increment or decrement the value in the variable.

+

+

+Flow control

+Setup the VM to begin execution of the other script function

+

+

+Setup the VM to return to the calling function

+

+

+Make an unconditional jump to a relative position

+

+

+Make a jump to a relative position depending on the value in the value register

+

+

+Call an application registered function

+

+

+Save the state and suspend execution, then return control to the application

+

+

+Give control of execution to the JIT compiled function

+

+

+Stack and data management

+Update the stack pointer.

+

+

+Push a constant value on the stack.

+

+

+Push the stack frame pointer on the stack.

+

+

+Swap the top values on the stack.

+

+

+Pop an address from the stack, read a value from the address and push it on the stack.

+

+

+Add an offset to the top address on the stack.

+

+

+Push the value of a variable on the stack.

+

+

+Initialize the value of a variable with a constant.

+

+

+Copy the value of one variable to another.

+

+

+Validate that an expected pointer is not null.

+

+

+Push the variable index with the size of a pointer on the stack.

+

+

+Replace a variable index on the stack with an address.

+

+

+Pop or push an address to or from the value register.

+

+

+Copy a value between value register and a variable.

+

+

+Copy a value from a variable to the address held in the value register

+

+

+Copy a value from the address held in the value register to a variable

+

+

+Load the address of the variable into the value register

+

+

+Clear the upper bytes of the value register

+

+

+Global variables

+Push the value of a global variable on the stack

+

+

+Load the address of a global variable into the value register

+

+

+Load the address of a global variable into the value register and copy the value of the global variable to local variable

+

+

+Copy a value between local variable and global variable.

+

+

+Push the address of the global variable on the stack.

+

+

+Initialize the variable of a global variable with a constant.

+

+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_jit.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_jit.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_jit.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_jit.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,89 @@ + + +AngelScript: JIT compilation + + + + +
+

JIT compilation

AngelScript doesn't provide a built-in JIT compiler, instead it permits an external JIT compiler to be implemented through a public interface.

+To use JIT compilation, the scripts must be compiled with a few extra instructions that provide hints to the JIT compiler and also entry points so that the VM will know when to pass control to the JIT compiled function. By default this is turned off, and must thus be turned on by setting the engine property asEP_INCLUDE_JIT_INSTRUCTIONS.

+If the application sets the JIT compiler with SetJITCompiler AngelScript will automatically invoke it to provide the JIT functions with each compilation or loading of pre-compiled bytecode.

+The structure of the JIT function

+The JIT compiled function must follow certain rules in order to behave well with the virtual machine. The intention is that the VM will pass the control to the JIT function, and when the execution is to be suspended the JIT function returns the control to the VM, updating the internal state of the VM so that the VM can resume the execution when requested. Each time the JIT function returns control to the VM it must make sure that the VM registers and stack values have been updated according to the code that was executed.

+The byte code will have a special instruction, JitEntry, which defines the positions where the VM can pass the control to the JIT function. These are usually placed for every script statement, and after each instruction that calls another function. This implies that the JIT compiled function needs to be able to start the execution at different points based on the argument in the JitEntry instruction. The value of the argument is defined by the JIT compiler and how it is interpreted is also up to the JIT compiler, with the exception of 0 that means that the control should not be passed to the JIT function.

+Some byte code instructions are not meant to be converted into native code. These are usually the ones that have a more global effect on the VM, e.g. the instructions that setup a call to a new script function, or that return from a previous instruction. When these functions are encountered, the JIT function should return the control to the VM, and then the VM will execute the instruction.

+Other byte code instructions may be partially implemented by the JIT function, for example those that can throw an exception based on specific conditions. One such example is the instructions for divisions, if the divider is 0 the VM will set an exception and abort the execution. For these instructions the JIT compiler should preferrably implement the condition that doesn't throw an exception, and if an exception is to be thrown the JIT function will instead break out to the VM.

+The following shows a possible structure of a JIT compiled function:

+

+  void jitCompiledFunc(asSVMRegisters *regs, asDWORD entry)
+  {
+    Read desired VM registers into CPU registers
+    Jump to the current position of the function based on the 'entry' argument
+  1:
+    Execute code in block 1
+    Jump to exit if an illegal operation is done, e.g. divide by zero. 
+    Jump to exit if block ends with an instruction that should not be executed by JIT function. 
+  2:
+    ...
+  3:
+    ...
+  exit:
+    Update the VM registers before returning control to VM
+  }
+

+Traversing the byte code

+
int CJITCompiler::CompileFunction(asIScriptFunction *func, asJITFunction *output)
+{
+  bool success = StartNewCompilation();
+
+  // Get the script byte code
+  asUINT   length;
+  asDWORD *byteCode = func->GetByteCode(&length);
+  asDWORD *end = byteCode + length;
+  
+  while( byteCode < end )
+  {
+    // Determine the instruction
+    asEBCInstr op = asEBCInstr(*(asBYTE*)byteCode);
+    switch( op )
+    {
+    // Translate each byte code instruction into native code.
+    // The codes that cannot be translated should return the control
+    // to the VM, so that it can continue the processing. When 
+    // the VM encounters the next JitEntry instruction it will
+    // transfer the control back to the JIT function.
+    ...
+    
+    case asBC_JitEntry:
+      // Update the argument for the JitEntry instruction with  
+      // the argument that should be sent to the jit function.
+      // Remember that 0 means that the VM should not pass
+      // control to the JIT function.
+      asBC_SWORDARG0(byteCode) = DetermineJitEntryArg();
+      break;
+    }
+    
+    // Move to next instruction
+    byteCode += asBCTypeSize[asBCInfo[op].type];
+  }
+  
+  if( success )
+  {
+    *output = GetCompiledFunction();
+    return 0;
+  }
+  
+  return -1;
+}
+

+The following macros should be used to read the arguments from the bytecode instruction. The layout of the arguments is determined from the asBCInfo array.

+

+

+What each byte code instruction does is described in Byte code instructions, but the exact implementation of each byte code instruction is best determined from the implementation in the VM, i.e. the asCScriptContext::ExecuteNext method.

+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_multithread.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_multithread.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_multithread.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_multithread.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,34 @@ + + +AngelScript: Multithreading + + + + +
+

Multithreading

AngelScript supports multithreading, though not yet on all platforms. You can determine if multithreading is supported on your platform by calling the asGetLibraryOptions function and checking the returned string for "AS_NO_THREADS". If the identifier is in the returned string then multithreading is not supported.

+Even if you don't want or can't use multithreading, you can still write applications that execute multiple scripts simultaneously.

+Things to think about with a multithreaded environment

+
    +
  • Always call asThreadCleanup before terminating a thread that accesses the script engine. If this is not done, the memory allocated specifically for that thread will be lost until the script engine is freed.
+

+

    +
  • Multiple threads may execute scripts in separate contexts. The contexts may execute scripts from the same module, but if the module has global variables you need to make sure the scripts perform proper access control so that they do not get corrupted, if multiple threads try to update them simultaneously.
+

+

    +
  • The engine will only allow one thread to build scripts at any one time, since this is something that changes the internal state of the engine and cannot safely be done in multiple threads simultaneously.
+

+

    +
  • Do not execute the garbage collector while other script threads are executed, as the garbage collector may be traversing the reference graph while the objects are modified by the other threads.
+

+

    +
  • Resources that are shared by script modules such as registered properties and objects must be protected by the application for simultaneous access, as the script engine doesn't do this automatically.
+

+Fibers

+AngelScript can be used with fibers as well. However, as fibers are not real threads you need to be careful if multiple fibers need to execute scripts. AngelScript keeps track of active contexts by pushing and popping the context pointers on a stack. With fibers you can easily corrupt this stack if you do not pay attention to where and when script executions are performed.

+Try to avoid switching fibers when a script is executing, instead you should suspend the current script execution and only switch to the other fiber when the context's Execute() method returns. If you really must switch fibers while executing a script, then make sure the second fiber initiates and concludes its own script execution before switching back to the original fiber.

+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_precompile.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_precompile.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_precompile.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_precompile.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,29 @@ + + +AngelScript: Pre-compiled byte code + + + + +
+

Pre-compiled byte code

Sometimes it may be useful to use pre-compiled bytecode instead of re-building the scripts every time a script is loaded. This can for example reduce load times, or if scripts are transferred over the net, it can reduce the transfer time for large scripts.

+To save already compiled code you should call the SaveByteCode method on the asIScriptModule, passing in a pointer to the object that implements the asIBinaryStream interface. The script module will then push all the bytecode and related data onto this object with the Write method.

+When loading the pre-compiled bytecode you should first get an instance of the asIScriptModule, just as if compiling a new script. Instead of calling AddScriptSection followed by Build you will call the LoadByteCode method, passing it a pointer to the binary stream object. The script module will then pull all the bytecode and related data from that object with the Read method to reconstruct the script module.

+Things to remember

+
    +
  • The engine configuration must be the same when saving and loading the bytecode, otherwise the load will fail as functions, types, or global properties cannot be found.
+

+

    +
  • The script engine doesn't perform validation of the pre-compiled bytecode, so the application is responsible for authenticating the source. If this authentication isn't performed by the application you'll have potential security risks in your application as the bytecode may have been manually manipulated to perform otherwise illegal tasks.
+

+

    +
  • The pre-compiled bytecode is currently not independent of the used CPU architecture, a script that is compiled for a 32-bit target is generally not equal to a script compiled for a 64-bit target. This is also true for big-endian and little-endian differences. The bytecode is independent of the target OS though, so a script compiled on Linux is equal to Windows, given that the engine configuration is the same for both.
+

+

    +
  • If the application that compiles the script code is separate from the application that will execute them, then you may register the functions and methods with null pointers so you don't need to actually implement all of them. In this case you should also set the engine property asEP_INIT_GLOBAL_VARS_AFTER_BUILD to false with asIScriptEngine::SetEngineProperty, so the script engine doesn't attempt to initialize the global variables after the script has been built.
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_scoped_type.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_scoped_type.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_scoped_type.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_scoped_type.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,34 @@ + + +AngelScript: Registering a scoped reference type + + + + +
+

Registering a scoped reference type

Some C++ value types have special requirements for the memory where they are located, e.g. specific alignment needs, or memory pooling. Since AngelScript doesn't provide that much control over where and how value types are allocated, they must be registered as reference types. In this case you'd register the type as a scoped reference type.

+A scoped reference type will have the life time controlled by the scope of the variable that instanciate it, i.e. as soon as the variable goes out of scope the instance is destroyed. This means that the type doesn't permit handles to be taken for the type.

+A scoped reference type requires only that the release behaviour is registered. The addref behaviour is not permitted. If the factory behaviour is not registered the script will not be able to instanciate objects of this type, but it can still receive them as parameters from the application.

+Since no handles can be taken for the object type, there is no need to keep track of the number of references held to the object. This means that the release behaviour should simply destroy and deallocate the object as soon as it's called.

+

scoped *Scoped_Factory()
+{
+  return new scoped;
+}
+
+void Scoped_Release(scoped *s)
+{
+  if( s ) delete s;
+}
+
+// Registering a scoped reference type
+r = engine->RegisterObjectType("scoped", 0, asOBJ_REF | asOBJ_SCOPED); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("scoped", asBEHAVE_FACTORY, "scoped @f()", asFUNCTION(Scoped_Factory), asCALL_CDECL); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("scoped", asBEHAVE_RELEASE, "void f()", asFUNCTION(Scoped_Release), asCALL_CDECL_OBJLAST); assert( r >= 0 );
+

+

See also:
Registering a reference type
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_single_ref_type.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_single_ref_type.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_single_ref_type.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_single_ref_type.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,23 @@ + + +AngelScript: Registering a single-reference type + + + + +
+

Registering a single-reference type

A variant of the uninstanciable reference types is the single-reference type. This is a type that have only 1 reference accessing it, i.e. the script cannot store any extra references to the object during execution. The script is forced to use the reference it receives from the application at the moment the application passes it on to the script.

+The reference can be passed to the script through a property, either global or a class member, or it can be returned from an application registered function or class method.

+The script engine will not permit declaration of functions that take this type as a parameter, neither as a reference nor as a handle. If that was allowed it would mean that a reference to the instance is placed on the stack, which in turn means that it is no longer a single-reference type.

+

// Registering the type so that it cannot be instanciated
+// by the script, nor allow scripts to store references to the type
+r = engine->RegisterObjectType("single", 0, asOBJ_REF | asOBJ_NOHANDLE); assert( r >= 0 );
+

+This sort of type is most useful when you want to have complete control over references to an object, for example so that the application can destroy and recreate objects of the type without having to worry about potential references held by scripts. This allows the application to control when a script has access to an object and it's members.

+

See also:
Registering a reference type
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_template.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_template.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_template.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_template.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,68 @@ + + +AngelScript: Template types + + + + +
+

Template types

A template type in AngelScript works similarly to how templates work in C++. The scripts will be able to instanciate different forms of the template type by specifying which subtype that should be used. The methods for the instance will then be adapted to this subtype, so that the correct handling of parameters and return types will be applied.

+The implementation of the template type is not a C++ template though, instead it must be implemented as a generic class that can determine what to do dynamically at runtime based on the subtype for which it was instanciated. This is obviously a lot less efficient than having specific implementations for each type, and for that reason AngelScript permits the application to register a template specialization where the extra performance is needed.

+This gives the best of both worlds, performance where the subtype is known before hand, and support for all other types that cannot be pre-determined.

+Registering the template type

+The template registration is registered similarly to normal reference types, with a few differences. The name of the type is formed by the name of the template type plus the name of the subtype with angle brackets. The type flag asOBJ_TEMPLATE must also be used.

+

// Register the template type
+r = engine->RegisterObjectType("myTemplate<class T>", 0, asOBJ_REF | asOBJ_GC | asOBJ_TEMPLATE); assert( r >= 0 );
+

+The template type doesn't have to be garbage collected, but since you may not know which subtypes it will be instanciated for, it is usually best to implement that support.

+When registering the behaviours, methods, and properties for the template type the type is identified with the name and subtype within angle brackets, but without the class token, e.g. myTemplate<T>. The sub type is identified by just the name of the subtype as it was declared in the call to RegisterObjectType.

+The factory behaviour for the template type is also different. In order for the implementation to know which subtype it is instanciated for the factory receives the asIObjectType of the template instance as a hidden first parameter. When registering the factory this hidden parameter is reflected in the declaration, for example as int &in.

+

// Register the factory behaviour
+r = engine->RegisterObjectBehaviour("myTemplate<T>", asBEHAVE_FACTORY, "myTemplate<T>@ f(int&in)", asFUNCTIONPR(myTemplateFactory, (asIObjectType*), myTemplate*), asCALL_CDECL); assert( r >= 0 );
+

+Remember that since the subtype must be determined dynamically at runtime, it is not possible to declare functions to receive the subtype by value, nor to return it by value. Instead you'll have to design the methods and behaviours to take the type by reference. It is possible to use object handles, but then the script engine won't be able to instanciate the template type for primitives and other values types.

+

See also:
array template object
+

+Validating template instantiations at compile time

+In order to avoid unnecessary runtime validations of invalid template instantiations, the application should preferably register the asBEHAVE_TEMPLATE_CALLBACK behaviour. This is a special behaviour function that the script engine will invoke everytime a new template instance type is generated. The callback function can then perform necessary validations to verify if the type can be handled, and if not tell the engine that the instance isn't supported.

+The callback function must be a global function that receives an asIObjectType pointer, and should return a boolean. If the template instance is valid the return value should be true.

+

// Register the template callback
+r = engine->RegisterObjectBehaviour("myTemplate<T>", asBEHAVE_TEMPLATE_CALLBACK, "bool f(int &in)", asFUNCTION(myTemplateCallback), asCALL_CDECL); assert( r >= 0 );
+

+Here's an example callback function:

+

bool myTemplateCallback(asIObjectType *ot)
+{
+  // This template will only support primitive types
+  int typeId = ot->GetSubTypeId();
+  if( typeId & asTYPEID_MASK_OBJECT )
+  {
+    // The script is attempting to instantiate the 
+    // template with an object type, this is not allowed.
+    return false;
+  }
+    
+  // Primitive types are allowed
+  return true;
+}
+

+Template specializations

+When registering a template specialization you override the template instance that AngelScript would normally do when compiling a declaration with the template type. This allow the application to register a completely different object with its own implementation for template specializations. Obviously it is recommended that the template specialization is registered so that to the script writer it is transparent, i.e. try to avoid having different method names or behaviours for the template type and template specializations.

+With the exception of the type name, a template specialization is registered exactly like a normal type.

+

// Register a template specialization for the float subtype
+r = engine->RegisterObjectType("myTemplate<float>", 0, asOBJ_REF); assert( r >= 0 );
+  
+// Register the factory (there are no hidden parameters for specializations)
+r = engine->RegisterObjectBehaviour("myTemplate<float>", asBEHAVE_FACTORY, "myTemplate<float>@ f()", asFUNCTION(myTemplateFloatFactory, (), myTemplateFloat*), asCALL_CDECL); assert( r >= 0 );
+

+Current limitations

+
    +
  • Template types are currently limited to reference types only, i.e. it must be registered with a factory and addref and release behaviours.
+

+

    +
  • Only one template subtype can be used at the moment.
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_timeout.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_timeout.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_timeout.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_timeout.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,85 @@ + + +AngelScript: Timeout long running scripts + + + + +
+

Timeout long running scripts

To prevent long running scripts to freeze the application it may be necessary to add a way to timeout the execution. This article presents two different ways to do so.

+With the line callback

+The line callback feature can be used to perform some special treatment during execution of the scripts. The callback is called for every script statement, which for example makes it possible to verify if the script has executed for too long time and if so suspend the execution to be resumed at a later time.

+Before calling the context's Execute method, set the callback function like so:

+

int ExecuteScriptWithTimeOut(asIScriptContext *ctx)
+{
+  // Define the timeout as 1 second
+  DWORD timeOut = timeGetTime() + 1000;
+
+  // Set up the line callback that will timout the script
+  ctx->SetLineCallback(asFUNCTION(LineCallback), &timeOut, asCALL_CDECL);
+
+  // Execute the script
+  int status = ctx->Execute();
+
+  // If the status is asEXECUTION_SUSPENDED the script can
+  // be resumed by calling this function again.
+  return status;
+}
+
+// The line callback function is called by the VM for each statement that is executed
+void LineCallback(asIScriptContext *ctx, DWORD *timeOut)
+{
+  // If the time out is reached we suspend the script
+  if( *timeOut < timeGetTime() )
+    ctx->Suspend();
+}
+

+Take a look at the sample Events to see this working.

+With a secondary thread

+A second thread can be set up to suspend the execution after the timeout. This thread can then be put to sleep so that it doesn't impact performance during the execution. When the thread wakes up it should call the context's Suspend method.

+The below shows some possible code for doing this. Note that the code for setting up the thread is fictive, as this is different for each target OS.

+

// The variables that are shared between the threads
+asIScriptContext *threadCtx;
+int threadId;
+
+// This function will be executed in the secondary thread
+void SuspendThread()
+{
+  // Put the thread to sleep until the timeout (1 second)
+  Sleep(1000);
+  
+  // When we wake-up we call the context's Suspend method
+  ctx->Suspend();
+}
+
+// This function sets up the timeout thread and executes the script
+int ExecuteScriptWithTimeOut(asIScriptContext *ctx)
+{
+  // Set the shared context pointer before creating the thread
+  threadCtx = ctx;
+
+  // Create the thread that will immediately go to sleep
+  threadId = CreateThread(SuspendThread);
+  
+  // Execute the script
+  int status = ctx->Execute();
+  
+  // Destroy the secondary thread before releasing the context
+  DestroyThread(threadId);
+  
+  // Clear the global variables
+  threadId = 0;
+  threadCtx = 0;
+  
+  // If the status is asEXECUTION_SUSPENDED the script can
+  // be resumed by calling this function again.
+  
+  return status;
+}
+

+Observe that this way of doing it is safe even if the AngelScript library has been built without multithread support.

+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_var_type.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_var_type.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_var_type.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_adv_var_type.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,40 @@ + + +AngelScript: The variable parameter type + + + + +
+

The variable parameter type

The application can register functions that take a reference to a variable type, which means that the function can receive a reference to a variable of any type. This is useful when making generic containers.

+When a function is registered with this special parameter type, the function will receive both the reference and an extra argument with the type id of the variable type. The reference refers to the actual value that the caller sent, i.e. if the expression is an object handle then the reference will refer to the handle, not the actual object.

+

// An example usage with a native function
+engine->RegisterGlobalFunction("void func_c(?&in)", asFUNCTION(func_c), asCALL_CDECL);
+
+void func_c(void *ref, int typeId)
+{
+    // Do something with the reference
+
+    // The type of the reference is determined through the type id
+}
+
+// An example usage with a generic function
+engine->RegisterGlobalFunction("void func_g(?&in)", asFUNCTION(func_g), asCALL_GENERIC);
+
+void func_g(asIScriptGeneric *gen)
+{
+    void *ref = gen->GetArgAddress(0);
+    int typeId = gen->GetArgTypeId(0);
+
+    func_c(ref, typeId);
+}
+

+The variable type can also be used with out references, but not with inout references. Currently it can only be used with global functions, object constructors, and object methods. It cannot be used with other behaviours and operators.

+The variable type is not available within scripts, so it can only be used to register application functions.

+

See also:
any object and dictionary object for examples
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api_functions.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api_functions.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api_functions.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api_functions.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,30 @@ + + +AngelScript: Functions + + + + + +
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ + + +AngelScript: The API reference + + + + +
+

The API reference

This is the reference documentation for the AngelScript application programming interface.

+

+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api_interfaces.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api_interfaces.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api_interfaces.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_api_interfaces.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,26 @@ + + +AngelScript: Interfaces + + + + + +
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_as_vs_cpp_types.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_as_vs_cpp_types.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_as_vs_cpp_types.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_as_vs_cpp_types.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,82 @@ + + +AngelScript: Datatypes in AngelScript and C++ + + + + +
+

Datatypes in AngelScript and C++

+Primitives

+Primitives in AngelScript have direct matches in C++.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
AngelScriptC++Size (bits)
void void 0
int8 signed char 8
int16 signed short 16
int signed long (*) 32
int64 signed long long 64
uint8 unsigned char 8
uint16unsigned short 16
uint unsigned long (*) 32
uint64unsigned long long64
float float 32
doubledouble 64
bool bool 8 (**)
+

+*) If the target CPU is 32 bit, the C++ type long is 32 bit, but on 64 bit CPUs it is commonly 64 bit, but in AngelScript an int is always 32 bits.

+**) On 32 bit PowerPC platforms the bool type commonly have the size of 32 bit, when compiled on such platforms AngelScript also uses 32 bits for the bool type

+Strings

+AngelScript expects the application to register its own string type, so the string types should match perfectly.

+The char* string type that is so convenient in C++ is however very difficult to use in a scripted environment where you do not have full control over how it is used. For that reason it is recommended that you wrap any functions that use the char* string type so that the string is properly converted to an object that can be safely handled by both the application and the script engine, e.g. std::string or another class of your preference.

+Arrays

+The AngelScript arrays are not directly matched by C++ arrays. The arrays are stored in an special object, accessed through the asIScriptArray interface. Thus you can normally not directly exchange a script with a C++ function expecting a C++ array, or vice versa. Nor can the application register C++ arrays as properties and expect AngelScript to be able to understand them.

+It is however possible to override AngelScript's built-in array objects with application specified objects, on a per array type basis.

+Object handles

+The AngelScript object handles are reference counted pointers to objects. This means that for object handles to work, the object must have some way of counting references, for example an AddRef/Release method pair.

+When AngelScript passes an object handle by value to a function it increases the reference count to count for the argument instance, thus the function is responsible for releasing the reference once it is finished with it. In the same manner AngelScript expects any handle returned from a function to already have the reference accounted for.

+However, when registering functions/methods with AngelScript the application can tell the library that it should automatically take care of releasing the handle references once a function return, likewise for returned handles. This is done by adding a + sign to the @ type modifier. When doing this an object handle can be safely passed to a C++ function that expects a normal pointer, but don't release it afterwards.

+

See also:
Object handles
+

+Parameter references

+Because AngelScript needs to guarantee validity of pointers at all times, it doesn't always pass references to the true object to the function parameter. Instead it creates a copy of the object, whose reference is passed to the function, and if the reference is marked to return a value, the clone is copied back to the original object (if it still exists) once the function returns.

+Because of this, AngelScript's parameter references are mostly compatible with C++ references, or pointers, except that the address normally shouldn't be stored for later use, since the object may be destroyed once the function returns.

+If it is necessary to store the address of the object, then object handles should be used instead.

+ + + + + + + + + + + + + + + +
ReferenceDescription
&inA copy of the value is always taken and the reference to the copy is passed to the function. For script functions this is not useful, but it is maintained for compatibility with application registered functions.
const &inIf the life time of the value can be guaranteed to be valid during the execution of the function, the reference to the true object is passed to the function, otherwise a copy is made.
&outA reference to an unitialized value is passed to the function. When the function returns the value is copied to the true reference. The argument expression is evaluated only after the function call. This is the best way to have functions return multiple values.
const &outUseless as the function wouldn't be able to modify the value.
&inoutThe true reference is always passed to the function. If the life time of the value cannot be guaranteed, a compile time error is generated and the script writer will have to copy the value to a local variable first. Objects that support object handles are best suitable for this type as they can always be guaranteed.
const &inoutThe reference cannot be changed by the function.
+

+If the application wants parameter references that work like they do in C++, then the engine property asEP_ALLOW_UNSAFE_REFERENCES can be set. When this is done, the parameter references can be declared without the in, out, or inout. The parameter references declared without any of the keywords will always pass the address to the original value, and will not have any restrictions to the expressions that can be used. The parameter references with the in and out keywords will still work like before, but the references with the inout keyword will have the restrictions removed so that they work just like normal C++ references.

+The application writer and script writer has to be aware that it is possible to write scripts that access invalid references when the library is compiled in this mode, just like it is possible to do so in C++.

+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_call_script_func.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_call_script_func.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_call_script_func.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_call_script_func.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,132 @@ + + +AngelScript: Calling a script function + + + + +
+

Calling a script function

+Preparing context and executing the function

+Normally a script function is executed in a few steps:

+

    +
  1. +Prepare the context
  2. +
  3. +Set the function arguments
  4. +
  5. +Execute the function
  6. +
  7. +Retrieve the return value
  8. +
+

+The code for this might look something like this:

+

// Get a script context instance. Usually you'll want to reuse a previously
+// created instance to avoid the overhead of allocating the instance with
+// each call.
+asIScriptContext *ctx = engine->CreateContext();
+
+// Obtain the function id from the module. This value should preferrably  
+// be cached if the same function is called multiple times.
+int funcId = engine->GetModule(module_name)->GetFunctionIdByDecl(function_declaration);
+
+// Prepare() must be called to allow the context to prepare the stack
+ctx->Prepare(funcId);
+
+// Set the function arguments
+ctx->SetArgDWord(...);
+
+int r = ctx->Execute();
+if( r == asEXECUTION_FINISHED )
+{
+  // The return value is only valid if the execution finished successfully
+  asDWORD ret = ctx->GetReturnDWord();
+}
+
+// Release the context when you're done with it
+ctx->Release();
+

+If your application allow the execution to be suspended, either by using the callback function or registering a function that allow the script to manually suspend the execution, then the execution function may return before finishing with the return code asEXECUTION_SUSPENDED. In that case you can later resume the execution by simply calling the execution function again.

+Note that the return value retrieved with GetReturnValue() is only valid if the script function returned successfully, i.e. if Execute() returned asEXECUTION_FINISHED.

+Passing and returning primitives

+When calling script functions that take arguments, the values of these arguments must be set after the call to Prepare() and before Execute(). The arguments are set using a group of SetArg methods:

+

int SetArgDWord(int arg, asDWORD value);
+int SetArgQWord(int arg, asQWORD value);
+int SetArgFloat(int arg, float value);
+int SetArgDouble(int arg, double value);
+

+arg is the argument number, where the first argument is on 0, the second on 1, and so on. value is the value of the argument. What method to use is determined by the type of the parameter. For primitive types you can use any of these. If the parameter type is a reference to a primitive type it is recommended to use the SetArgDWord() method and pass the pointer as the value. For non-primitive types the method SetArgObject() should be used, which will be described in the next section.

+

// The context has been prepared for a script 
+// function with the following signature:
+// int function(int, double, int&in)
+
+// Put the arguments on the context stack, starting with the first one
+ctx->SetArgDWord(0, 1);
+ctx->SetArgDouble(1, 3.141592);
+int val;
+ctx->SetArgDWord(2, (asDWORD)&val);
+

+Once the script function has been executed the return value is retrieved in a similar way using the group of GetReturn methods:

+

asDWORD GetReturnDWord();
+asQWORD GetReturnQWord();
+float   GetReturnFloat();
+double  GetReturnDouble();
+

+Note that you must make sure the returned value is in fact valid, for example if the script function was interrupted by a script exception the value would not be valid. You do this by verifying the return code from Execute() or GetState(), where the return code should be asEXECUTION_FINISHED.

+Passing and returning objects

+Passing registered object types to a script function is done in a similar way to how primitive types are passed. The function to use is SetArgObject():

+

int SetArgObject(int arg, void *object);
+

+arg is the argument number, just like the other SetArg methods. object is a pointer to the object you wish to pass.

+This same method is used both for parameters passed by value and for those passed by reference. The library will automatically make a copy of the object if the parameter is defined to be passed by value.

+

// The complex object we wish to pass to the script function
+CObject obj;
+
+// Pass the object to the function
+ctx->SetArgObject(0, &obj);
+

+Getting an object returned by a script function is done in a similar way, using GetReturnObject():

+

void *GetReturnObject();
+

+This method will return a pointer to the object returned by the script function. The library will still hold a reference to the object, which will only be freed as the context is released.

+

// The object where we want to store the return value
+CObject obj;
+
+// Execute the function
+int r = ctx->Execute();
+if( r == asEXECUTION_FINISHED )
+{
+  // Get a pointer to the returned object and copy it to our object
+  obj = *(CObject*)ctx->GetReturnObject();
+}
+

+It is important to make a copy of the returned object, or if it is managed by reference counting add a reference to it. If this is not done the pointer obtained with GetReturnObject() will be invalidated as the context is released, or reused for another script function call.

+Exception handling

+If the script performs an illegal action, e.g. calling a method on a null handle, then the script engine will throw a script exception. The virtual machine will then abort the execution and the Execute method will return with the value asEXECUTION_EXCEPTION.

+At this time it is possible to obtain information about the exception through the asIScriptContext's methods. Example:

+

void PrintExceptionInfo(asIScriptContext *ctx)
+{
+  asIScriptEngine *engine = ctx->GetEngine();
+
+  // Determine the exception that occurred
+  printf("desc: %s\n", ctx->GetExceptionString());
+
+  // Determine the function where the exception occurred
+  int funcId = ctx->GetExceptionFunction();
+  const asIScriptFunction *function = engine->GetFunctionDescriptorById(funcId);
+  printf("func: %s\n", function->GetDeclaration());
+  printf("modl: %s\n", function->GetModuleName());
+  printf("sect: %s\n", function->GetScriptSectionName());
+  
+  // Determine the line number where the exception occurred
+  printf("line: %d\n", ctx->GetExceptionLineNumber());
+}
+

+If desired, it is also possible to register a callback function that will be called at the moment the exception occurred, before the Execute method returns.

+

See also:
Debugging scripts for information on examining the callstack
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_compile_lib.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_compile_lib.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_compile_lib.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_compile_lib.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,67 @@ + + +AngelScript: Compile the library + + + + +
+

Compile the library

In the sdk/angelscript/projects directory you'll find project files for many of the popular compilers. However, these project files are not always up to date with the latest version of the library. If you get any compiler or linker errors please make sure the project file include all the files in the sdk/angelscript/source directory, and that the project settings are set according to this article.

+If you don't find a project file for your compiler, you can easily create your own project by adding all the files in the sdk/angelscript/source directory, and configuring the project apropriately. If you have a new compiler/target that hasn't been used with AngelScript before, you may need to edit the as_config.h file to make sure the library is compiled properly.

+Set compile time options

+The code tries to contain compiler differences in as few places as possible. The header as_config.h was created for that purpose. There you will find some #defines that allow different compilers to work. You'll probably not have to change this file, but if you're using a compiler not previously used and you're getting compiler errors it might be worth it to take a look at this file.

+There are also a couple of other #defines used in the code to alter the compilation. When compiling the library you might want to define ANGELSCRIPT_EXPORT so that library functions are exported. If you include the library source code directly in your application project you shouldn't have to define this flag.

+If AS_DEPRECATED is defined then some backwards compatibility is maintained, this can help you do the upgrade to the latest version a little more smoothly. There is no guarantee that the backwards compatibility will be maintained though so try to remove use of deprecated functions as soon as possible.

+Linking with the library

+There are four ways of compiling and linking with AngelScript in order to use it. I recommend linking with a static library. Note that all four ways are interchangable with only a small change in your code, i.e a defined flag before including the header file, and possibly a routine for manually loading the dll. The rest of your code should look exactly the same for each of the alternatives.

+1. Include library source files in project

+You can take the source files for AngelScript and include them directly in your own project. The advantage of this is that you can be sure that the same compiler options are used for the library and the host applications, e.g. multi-threaded or single-threaded CRT. The disadvantage is that your project will be poluted with the library files.

+The files that need to use the library should include the angelscript.h header with no need for any special settings.

+

// Include the library interface
+#include "angelscript.h"
+
+// ... Start using the library
+

+2. Compile a static library and link into project

+The most recommended way is to compile a static library that your project will link with. When compiling the static library you have to make sure that the correct compiler settings are used so that you don't get conflicts in linkage with the CRT functions. This happens if you for example compile the library with dynamically linked multi-threaded CRT and your application with statically linked single-threaded CRT. (For Visual C++ you'll find these settings under Project -> Settings -> C/C++ -> Category: Code Generation)

+To use the library you only need to include the angelscript.h header file.

+

// Include the library interface
+#include "angelscript.h"
+
+// ... Start using the library
+

+3. Compile a dynamically loaded library with an import library

+With Microsoft Visual C++ it is possible to compile a dynamically loaded library with an import library. The import library will then take care of the work needed to load the dll and bind the functions. A possible disadvantage of this method is that you are not able to give any user-friendly error messages in case loading the library fails.

+To use the library you'll have to define ANGELSCRIPT_DLL_LIBRARY_IMPORT before including the angelscript.h header file.

+

// Include the library interface
+#define ANGELSCRIPT_DLL_LIBRARY_IMPORT
+#include "angelscript.h"
+
+// ... Start using the library
+

+4. Load the dynamically loaded library manually

+If you want to use a dll, e.g. to share code between applications, I recommend loading the library manually as you can treat any failures to load or bind functions graciously.

+To use manually loaded dll, you should define ANGELSCRIPT_DLL_MANUAL_IMPORT before including the angelscript.h header file. This will insure that the header file doesn't declare the function prototypes, as you will most likely want to use these names for the function pointers.

+

// Include the library interface
+#define ANGELSCRIPT_DLL_MANUAL_IMPORT
+#include "angelscript.h"
+
+// Declare the function pointers
+typedef asIScriptEngine * AS_CALL t_asCreateScriptEngine(int);
+t_asCreateScriptEngine *asCreateScriptEngine = 0;
+
+// ... Declare the rest of the functions
+
+// Load the dll and bind the functions (error handling left out for clarity)
+HMODULE dll = LoadLibrary("angelscript.dll");
+asCreateScriptEngine = (t_asCreateScriptEngine*)GetProcAddress(dll, "_asCreateScriptEngine");
+
+// ... Bind the other functions
+
+// ... Start using the library
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_compile_script.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_compile_script.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_compile_script.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_compile_script.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,81 @@ + + +AngelScript: Compiling scripts + + + + +
+

Compiling scripts

After registering the application interface it's time to compile the scripts that will be executed.

+Message callback

+Before starting the compilation, remember to have the message callback set in the engine so that you can get more information on compilation errors than just an error code. In fact, it is recommended to set the message callback right after creating the script engine, as the message callback may even be helpful while registering the application interface.

+The message callback has been designed so that it doesn't output anything if there are no errors or warnings, so when everything is ok, you shouldn't get anything from it. But if the Build method returns an error, the message callback will have received detailed information about the error.

+If desired, the application may send its own messages to the callback via the WriteMessage method on the engine.

+

// Implement a simple message callback function
+void MessageCallback(const asSMessageInfo *msg, void *param)
+{
+  const char *type = "ERR ";
+  if( msg->type == asMSGTYPE_WARNING ) 
+    type = "WARN";
+  else if( msg->type == asMSGTYPE_INFORMATION ) 
+    type = "INFO";
+  printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message);
+}
+
+// Set the message callback when creating the engine
+asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
+engine->SetMessageCallback(asFUNCTION(MessageCallback), 0, asCALL_CDECL);
+

+Loading and compiling scripts

+To build a script module you first obtain a module from the engine, then add the script sections, and finally compile them. A compiled script module may be composed of one or more script sections, so your application may store each section in different files, or even generate them dynamically. It doesn't matter in which order the script sections are added to the module, as the compiler is able to resolve all names regardless of where they are declared in the script.

+

// Create a new script module
+asIScriptModule *mod = engine->GetModule("module", asGM_ALWAYS_CREATE);
+
+// Load and add the script sections to the module
+string script;
+LoadScriptFile("script.as", script);
+mod->AddScriptSection("script.as", script.c_str());
+
+// Build the module
+int r = mod->Build();
+if( r < 0 )
+{
+  // The build failed. The message stream will have received  
+  // compiler errors that shows what needs to be fixed
+}
+

+AngelScript doesn't provide built-in functions for loading script files as most applications have their own way of loading files. However, it is quite easy to write your own routines for loading script files, for example:

+

// Load the entire script file into a string buffer
+void LoadScriptFile(const char *fileName, string &script)
+{
+  // Open the file in binary mode
+  FILE *f = fopen("test.as", "rb");
+  
+  // Determine the size of the file
+  fseek(f, 0, SEEK_END);
+  int len = ftell(f);
+  fseek(f, 0, SEEK_SET);
+  
+  // Load the entire file in one call
+  script.resize(len);
+  fread(&script[0], len, 1, f);
+  
+  fclose(f);
+} 
+

+As AngelScript doesn't load the files itself, it also doesn't have built-in support for including other files from within the script. However, if you look in the add-on directory, you'll find a CScriptBuilder class that provides this support and more. It is a helper class for loading files, perform a pre-processing pass, and then building the module. With it the code for building a module looks like this:

+

CScriptBuilder builder;
+int r = builder.BuildScriptFromFile(engine, "module", "script.as");
+if( r < 0 )
+{
+  // The build failed. The message stream will have received  
+  // compiler errors that shows what needs to be fixed
+}
+

+

See also:
Pre-compiled byte code
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_arrays.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_arrays.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_arrays.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_arrays.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,31 @@ + + +AngelScript: Arrays + + + + +
+

Arrays

It is possible to declare array variables by appending the [] brackets to the type.

+When declaring a variable with a type modifier, the type modifier affects the type of all variables in the list. Example:

+

+  int[] a, b, c;
+

+a, b, and c are now arrays of integers.

+When declaring arrays it is possible to define the initial size of the array by passing the length as a parameter to the constructor. The elements can also be individually initialized by specifying an initialization list. Example:

+

+  int[] a;           // A zero-length array of integers
+  int[] b(3);        // An array of integers with 3 elements
+  int[] c = {,3,4,}; // An array of integers with 4 elements, where
+                     // the second and third elements are initialized
+

+Each element in the array is accessed with the indexing operator. The indices are zero based, i.e the range of valid indices are from 0 to length - 1.

+

+  a[0] = some_value;
+

+An array also have two methods. length() allow you to determine how many elements are in the array, and resize() lets you resize the array.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ + + +AngelScript: Data types + + + + +
+

Data types

Note that the host application may add types specific to that application, refer to the application's manual for more information.

+

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_obj.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_obj.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_obj.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_obj.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,39 @@ + + +AngelScript: Objects and handles + + + + +
+

Objects and handles

+Objects

+There are two forms of objects, reference types and value types.

+Value types behave much like the primitive types, in that they are allocated on the stack and deallocated when the variable goes out of scope. Only the application can register these types, so you need to check with the application's documentation for more information about the registered types.

+Reference types are allocated on the memory heap, and may outlive the initial variable that allocates them if another reference to the instance is kept. All script declared classes are reference types. Interfaces are a special form of reference types, that cannot be instanciated, but can be used to access the objects that implement the interfaces without knowing exactly what type of object it is.

+

+  obj o;      // An object is instanciated
+  o = obj();  // A temporary instance is created whose 
+              // value is assigned to the variable
+

+Object handles

+Object handles are a special type that can be used to hold references to other objects. When calling methods or accessing properties on a variable that is an object handle you will be accessing the actual object that the handle references, just as if it was an alias. Note that unless initialized with the handle of an object, the handle is null.

+

+  obj o;
+  obj@ a;           // a is initialized to null
+  obj@ b = @o;      // b holds a reference to o

+

  b.ModifyMe();     // The method modifies the original object

+

  if( a is null )   // Verify if the object points to an object
+  {
+    @a = @b;        // Make a hold a reference to the same object as b
+  }
+

+Not all types allow a handle to be taken. Neither of the primitive types can have handles, and there may exist some object types that do not allow handles. Which objects allow handles or not, are up to the application that registers them.

+Object handle and array type modifiers can be combined to form handles to arrays, or arrays of handles, etc.

+

See also:
Object handles
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_primitives.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_primitives.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_primitives.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_primitives.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,54 @@ + + +AngelScript: Primitives + + + + +
+

Primitives

+void

+void is not really a data type, more like lack of data type. It can only be used to tell the compiler that a function doesn't return any data.

+bool

+bool is a boolean type with only two possible values: true or false. The keywords true and false are constants of type bool that can be used as such in expressions.

+Integer numbers

+ + + + + + + + + + + + + + + + + + + +
typemin valuemax value
int8 -128127
int16 -32,76832,767
int -2,147,483,6482,147,483,647
int64 -9,223,372,036,854,775,8089,223,372,036,854,775,807
uint8 0255
uint16065,535
uint 04,294,967,295
uint64018,446,744,073,709,551,615
+

+As the scripting engine has been optimized for 32 bit datatypes, using the smaller variants is only recommended for accessing application specified variables. For local variables it is better to use the 32 bit variant.

+int32 is an alias for int, and uint32 is an alias for uint.

+Real numbers

+ + + + + + + +
typerange of valuessmallest positive value maximum digits
float +/- 3.402823466e+38 1.175494351e-38 6
double +/- 1.7976931348623158e+308 2.2250738585072014e-308 15
+

+Rounding errors will occur if more digits than the maximum number of digits are used.

+Curiousity: Real numbers may also have the additional values of positive and negative 0 or infinite, and NaN (Not-a-Number). For float NaN is represented by the 32 bit data word 0x7fc00000.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_strings.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_strings.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_strings.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_datatypes_strings.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,64 @@ + + +AngelScript: Strings + + + + +
+

Strings

Strings are a special type of data that can be used only if the application registers support for them. They hold an array of bytes or 16bit words depending on the application settings. The only limit to how large this array can be is the memory available on the computer.

+There are two types of string constants supported in the AngelScript language, the normal double quoted string, and the documentation strings, called heredoc strings.

+The normal strings are written between double quotation marks (") or single quotation marks (')1. Inside the constant strings some escape sequences can be used to write exact byte values that might not be possible to write in your normal editor.

+ + + + + + + + + + + + + + + + + + + + + + + +
sequence value description

+

\0  0 null character
\\  92 back-slash
\'  39 single quotation mark (apostrophe)
\"  34 double quotation mark
\n  10 new line feed
\r  13 carriage return
\t  9 tab character
\xFFFF  0xFFFF FFFF should be exchanged for a 1 to 4 digit hexadecimal number representing the value wanted. If the application uses 8bit strings then only values up to 255 is accepted.
\uFFFF  0xFFFF FFFF should be exchanged for the hexadecimal number representing the unicode code point
\UFFFFFFFF  0xFFFFFFFF FFFFFFFF should be exchanged for the hexadecimal number representing the unicode code point
+

+

+  string str1 = "This is a string with \"escape sequences\".";
+  string str2 = 'If single quotes are used then double quotes can be included without "escape sequences".';
+

+The heredoc strings are designed for inclusion of large portions of text without processing of escape sequences. A heredoc string is surrounded by triple double-quotation marks ("""), and can span multiple lines of code. If the characters following the start of the string until the first linebreak only contains white space, it is automatically removed by the compiler. Likewise if the characters following the last line break until the end of the string only contains white space this is also remove, including the linebreak.

+

+  string str = """
+  This is some text without "escape sequences". This is some text.
+  This is some text. This is some text. This is some text. This is
+  some text. This is some text. This is some text. This is some
+  text. This is some text. This is some text. This is some text.
+  This is some text.
+  """;
+

+If more than one string constants are written in sequence with only whitespace or comments between them the compiler will concatenate them into one constant.

+

+  string str = "First line.\n"
+               "Second line.\n"
+               "Third line.\n";
+

+The escape sequences \u and \U will add the specified unicode code point as a UTF-8 or UTF-16 encoded sequence depending on the application settings. Only valid unicode 5.1 code points are accepted, i.e. code points between U+D800 and U+DFFF (reserved for surrogate pairs) or above U+10FFFF are not accepted.

+1) The application can change the interpretation of single quoted strings by setting an engine property. If this is done the first character in the single quoted string will be interpreted as a single uint value instead of a string literal.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_debug.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_debug.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_debug.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_debug.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,15 @@ + + +AngelScript: Debugging scripts + + + + +
+

Debugging scripts

Todo:
Complete this page
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_expressions.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_expressions.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_expressions.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_expressions.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,201 @@ + + +AngelScript: Expressions + + + + +
+

Expressions

+

+Assignments

+
  lvalue = rvalue;

+lvalue must be an expression that evaluates to a memory location where the expression value can be stored, e.g. a variable. An assignment evaluates to the same value and type of the data stored. The right hand expression is always computed before the left.

+Compound assignments

+
+  lvalue += rvalue;
+  lvalue = lvalue + rvalue;
+

+A compound assignment is a combination of an operator followed by the assignment. The two expressions above means practically the same thing. Except that first one is more efficient in that the lvalue is only evaluated once, which can make a difference if the lvalue is complex expression in itself.

+Available operators: += -= *= /= = &= |= ^= <<= >>= >>>=

+Function call

+
+  func();
+  func(arg);
+  func(arg1, arg2);
+  lvalue = func();
+

+Functions are called to perform an action, and possibly return a value that can be used in further operations. If a function takes more than one argument, the argument expressions are evaluated in the reverse order, i.e. the last argument is evaluated first.

+Type conversions

+
+  // implicitly convert the clss handle to a intf handle
+  intf @a = @clss();

+

  // explicitly convert the intf handle to a clss handle
+  clss @b = cast<clss>(a);
+

+Object handles can be converted to other object handles with the cast operator. If the cast is valid, i.e. the true object implements the class or interface being requested, the operator returns a valid handle. If the cast is not valid, the cast returns a null handle.

+The above is called a reference cast, and only works for types that support object handles. In this case the handle still refers to the same object, it is just exposed through a different interface.

+Types that do not support object handles can be converted with a value cast instead. In this case a new value is constructed, or in case of objects a new instance of the object is created.

+

+  // implicit value cast
+  int a = 1.0f;

+

  // explicit value cast
+  float b = float(a)/2;
+

+In most cases an explicit cast is not necessary for primitive types, however, as the compiler is usually able to do an implicit cast to the correct type.

+Math operators

+
+  c = -(a + b);
+

+ + + + + + + + + + + + + + + + + +
operatordescriptionleft handright handresult
+ unary positive   NUM NUM
- unary negative   NUM NUM
+ addition NUM NUM NUM
- subtraction NUM NUM NUM
* multiplication NUM NUM NUM
/ division NUM NUM NUM
% modulos NUM NUM NUM
+

+Plus and minus can be used as unary operators as well. NUM can be exchanged for any numeric type, e.g. int or float. Both terms of the dual operations will be implicitly converted to have the same type. The result is always the same type as the original terms. One exception is unary negative which is not available for uint.

+Bitwise operators

+
+  c = ~(a | b);
+

+ + + + + + + + + + + + + + + + + +
operator description left hand right hand result
~ bitwise complement   NUMNUM
& bitwise and NUMNUMNUM
| bitwise or NUMNUMNUM
^ bitwise xor NUMNUMNUM
<< left shift NUMNUMNUM
>> right shift NUMNUMNUM
>>>arithmetic right shiftNUMNUMNUM
+

+All except ~ are dual operators.

+Logic operators

+
+  if( a and b or not c )
+  {
+    // ... do something
+  }
+

+ + + + + + + + + + + +
operator description left hand right hand result
notlogical not   boolbool
andlogical and boolboolbool
or logical or boolboolbool
xorlogical exclusive orboolboolbool
+

+Boolean operators only evaluate necessary terms. For example in expression a and b, b is only evaluated if a is true.

+Each of the logic operators can be written as symbols as well, i.e. || for or, && for and, ^^ for xor, and ! for not.

+Equality comparison operators

+
+  if( a == b )
+  {
+    // ... do something
+  }
+

+The operators == and != are used to compare two values to determine if they are equal or not equal, respectively. The result of this operation is always a boolean value.

+Relational comparison operators

+
+  if( a > b )
+  {
+    // ... do something
+  }
+

+The operators <, >, <=, and >= are used to compare two values to determine their relationship. The result is always a boolean value.

+Identity comparison operators

+
+  if( a is null )
+  {
+    // ... do something
+  }
+  else if( a is b )
+  {
+    // ... do something
+  }
+

+The operators is and !is are used to compare the identity of two objects, i.e. to determine if the two are the same object or not. These operators are only valid for reference types as they compare the address of two objects. The result is always a boolean value.

+Increment operators

+
+  // The following means a = i; i = i + 1;
+  a = i++;

+

  // The following means i = i - 1; b = i;
+  b = --i;
+

+These operators can be placed either before or after an lvalue to increment/decrement its value either before or after the value is used in the expression. The value is always incremented or decremented with 1.

+Indexing operator

+
+  arr[i] = 1;
+

+This operator is used to access an element contained within the object. Depending on the object type, the expression between the [] needs to be of different types.

+Conditional expression

+
+  choose ? a : b;
+

+If the value of choose is true then the expression returns a otherwise it will return b. Both a and b must be of the same type.

+Member access

+
+  object.property = 1;
+  object.method();
+

+object must be an expression resulting in a data type that have members. property is the name of a member variable that can be read/set directly. method is the name of a member method that can be called on the object.

+Handle-of

+
+  // Make handle reference the object instance
+  @handle = @object;

+

  // Clear the handle and release the object it references
+  @handle = null;
+

+Object handles are references to an object. More than one handle can reference the same object, and only when no more handles reference an object is the object destroyed.

+The members of the object that the handle references are accessed the same way through the handle as if accessed directly through the object variable, i.e. with . operator.

+Parenthesis

+
+  a = c * (a + b);
+  if( (a or b) and c )
+  {
+    // ... do something
+  }
+

+Parenthesis are used to group expressions when the operator precedence does not give the desired order of evaluation.

+Scope resolution

+
+  int value;
+  void function()
+  {
+    int value;        // local variable overloads the global variable
+    ::value = value; // use scope resolution operator to refer to the global variable 
+  } 
+

+The scope resolution operator :: can be used to access variables or functions from another scope when the name is overloaded by a local variable or function. Write the scope name on the left (or blank for the global scope) and the name of the variable/function on the right.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_gc.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_gc.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_gc.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_gc.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,20 @@ + + +AngelScript: Garbage collection + + + + +
+

Garbage collection

Though AngelScript uses reference counting for memory management, there is still need for a garbage collector to take care of the few cases where circular referencing between objects prevents the reference counter from reaching zero. As the application wants to guarantee responsiveness of the application, AngelScript doesn't invoke the garbage collector automatically. For that reason it is important that the application do this manually at convenient times.

+The garbage collector implemented in AngelScript is incremental, so it can be executed for short periods of time without requiring the entire application to halt. For this reason, it is recommended that a call to GarbageCollect(asGC_ONE_STEP) is made at least once during the normal event processing. This will execute one step in the incremental process, eventually detecting and destroying objects being kept alive due to circular references.

+This may not be enough for all applications though, as some script may produce more garbage than others. Performing the garbage collection only one step at a time may not be fast enough to free the old garbage before the new garbage is generated. For this reason it is recommended that the application monitor the statistics for the garbage collector and adjust the frequency of the calls as necessary. The statistics is obtained through a call to GetGCStatistics, which returns the number of objects currently known to the garbage collector as well as the number of objects that have been destroyed and the number of object that have been detected as garbage with circular references.

+If the scripts produce a lot of garbage but only a low number of garbage in circular references, the application can make a call to GarbageCollect(asGC_FULL_CYCLE | asGC_DESTROY_GARBAGE), which will only destroy the known garbage without trying to detect circular references. This call is relatively fast as the garbage collector only has to make a trivial local check to determine if an object is garbage without circular references.

+Finally, if the application goes into a state where responsiveness is not so critical, it might be a good idea to do a full cycle on the garbage collector, thus cleaning up all garbage at once. To do this, call GarbageCollect(asGC_FULL_CYCLE).

+

See also:
Memory management
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_gc_object.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_gc_object.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_gc_object.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_gc_object.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,100 @@ + + +AngelScript: Garbage collected objects + + + + +
+

Garbage collected objects

Reference counting as memory management has a drawback in that it is difficult to detect circular references when determining dead objects. AngelScript allows the application to register types with special behaviours to support the garbage collection for detecting circular references. These behaviours make the class a bit more complex, but you should only have to register them for a few types, e.g. generic container classes.

+

// Registering the garbage collected reference type
+r = engine->RegisterObjectType("ref", 0, asOBJ_REF | asOBJ_GC); assert( r >= 0 );
+

+The difference between the garbage collected and non-garbage collected types is in the addref and release behaviours, the class constructor, and the extra support behaviours.

+

See also:
The dictionary add-on for an example of a garbage collected object
+

+GC support behaviours

+The GC determines when objects should be destroyed by counting the references it can follow for each object. If the GC can see all references that points to an object, it knows that the object is part of a circular reference. If all the objects involved in that circular reference have no outside references it means that they should be destroyed.

+The process of determining the dead objects uses the first for of the behaviours below, while the destruction of the objects is done by forcing the release of the object's references.

+

void CGCRef::SetGCFlag()
+{
+    // Set the gc flag as the high bit in the reference counter
+    refCount |= 0x80000000;
+}
+
+bool CGCRef::GetGCFlag()
+{
+    // Return the gc flag
+    return (refCount & 0x80000000) ? true : false;
+}
+
+int CGCRef::GetRefCount()
+{
+    // Return the reference count, without the gc flag
+    return (refCount & 0x7FFFFFFF);
+}
+
+void CGCRef::EnumReferences()
+{
+    // Call the engine::GCEnumCallback for all references to other objects held
+    engine->GCEnumCallback(myref);
+}
+
+void CGCRef::ReleaseAllReferences()
+{
+    // When we receive this call, we are as good as dead, but
+    // the garbage collector will still hold a references to us, so we
+    // cannot just delete ourself yet. Just free all references to other
+    // objects that we hold
+    if( myref )
+    {
+        myref->Release();
+        myref = 0;
+    }
+}
+
+// Register the GC support behaviours
+r = engine->RegisterObjectBehaviour("gc", asBEHAVE_SETGCFLAG, "void f()", asMETHOD(CGCRef,SetGCFlag), asCALL_THISCALL); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("gc", asBEHAVE_GETGCFLAG, "bool f()", asMETHOD(CGCRef,GetGCFlag), asCALL_THISCALL); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("gc", asBEHAVE_GETREFCOUNT, "int f()", asMETHOD(CGCRef,GetRefCount), asCALL_THISCALL); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("gc", asBEHAVE_ENUMREFS, "void f(int&in)", asMETHOD(CGCRef,EnumReferences), asCALL_THISCALL); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("gc", asBEHAVE_RELEASEREFS, "void f(int&in)", asMETHOD(CGCRef,ReleaseAllReferences), asCALL_THISCALL); assert( r >= 0 );
+

+Factory for garbage collection

+Whenever a garbage collected class is created, the garbage collector must be notified of it's existence. The easiest way of doing that is to have the factory behaviour, or the class constructor call the NotifyGarbageCollectorOfNewObject() method on the engine when initializing the class.

+

CGCRef *GCRef_Factory()
+{
+    // Create the object and then notify the GC of its existence
+    CGCRef *obj = new CGCRef();
+    int typeId = engine->GetTypeIdByDecl("gc");
+    engine->NotifyGarbageCollectorOfNewObject(obj, typeId);
+    return obj;
+}
+

+You may want to consider caching the typeId, so that it doesn't have to be looked up through the relatively expensive call to GetTypeIdByDecl every time an object of this type is created.

+Note, if you create objects of this type from the application side, you must also notify the garbage collector of its existence, so it's a good idea to make sure all code use the same way of creating objects of this type.

+Addref and release for garbage collection

+For garbage collected objects it is important to make sure the AddRef and Release behaviours clear the GC flag. Otherwise it is possible that the GC incorrectly determine that the object should be destroyed.

+

void CGCRef::AddRef()
+{
+    // Clear the gc flag and increase the reference counter
+    refCount = (refCount&0x7FFFFFFF) + 1;
+}
+
+void CGCRef::Release()
+{
+    // Clear the gc flag, decrease ref count and delete if it reaches 0
+    refCount &= 0x7FFFFFFF;
+    if( --refCount == 0 )
+        delete this;
+}
+
+// Registering the addref/release behaviours
+r = engine->RegisterObjectBehaviour("gc", asBEHAVE_ADDREF, "void f()", asMETHOD(CGCRef,AddRef), asCALL_THISCALL); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("gc", asBEHAVE_RELEASE, "void f()", asMETHOD(CGCRef,Release), asCALL_THISCALL); assert( r >= 0 );
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_generic.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_generic.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_generic.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_generic.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,31 @@ + + +AngelScript: The generic calling convention + + + + +
+

The generic calling convention

The generic calling convention is available for those situations where the application's native calling convention doesn't work, for example on platforms where support for native calling conventions haven't been added yet. You can detect if native calling conventions isn't supported on your target platform by calling the asGetLibraryOptions function and checking the returned string for "AS_MAX_PORTABILITY". If the identifier is in the returned string, then native calling conventions is not supported.

+Functions implementing the generic calling conventions are always global functions (or static class methods), that take as parameter a pointer to an asIScriptGeneric interface and returns void.

+

void MyGenericFunction(asIScriptGeneric *gen)
+{
+  // Code to extract arguments from the generic 
+  // interface and to execute the real function
+  ...
+}
+

+Functions using the generic calling convention can be registered anywhere the script engine is expecting global functions or class methods (except where explicitly written otherwise).

+Writing the functions for the generic calling convention requires extracting each argument from the AngelScript stack, and then manually giving the return value back. For that reason it may be a desired to use the automatic wrapper functions rather than writing the functions yourself.

+Extracting function arguments

+To extract functions arguments from the generic interface you should call one of the GetArg methods that will return the value of the argument, or the GetAddressOfArg method. The GetAddressOfArg method returns a pointer to the actual value. The application should then cast this pointer to a pointer of the correct type so that the value can be read from the address.

+If the function you're implementing represents a class method, the pointer to the object instance should be obtained with a call to GetObject.

+Note that the asIScriptGeneric interface is the owner of any references it returns with these calls, so you should not release these references manually. If you want to store a reference to an object received from the generic interface, you need to call AddRef on that object to avoid invalidating the reference when the function returns.

+Returning values

+To return a value from the function one of the SetReturn methods can be called to pass the value to the generic interface. Returning primitive values is straight forward, but care must be taken when returning object types, either by value, reference, or as object handle. Depending on the type and the function used it may be necessary to increment the reference count, or even make a copy of the object first. Carefully read the instructions for SetReturnAddress and SetReturnObject to determine what needs to be done to get the expected result.

+It is also possible to use the GetAddressOfReturnLocation method to obtain the address of the memory where the return value will be stored. The memory is not initialized, so you should use the placement new operator to initialize this memory with a call to the constructor. This also works for primitive types, which makes this ideal for template implementations, such as that in the automatic wrapper functions.

+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_global.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_global.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_global.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_global.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,119 @@ + + +AngelScript: Globals + + + + +
+

Globals

All global declarations share the same namespace so their names may not conflict. This includes extended data types and built-in functions registered by the host application. Also, all declarations are visible to all, e.g. a function to be called does not have to be declared above the function that calls it.

+

+

+Functions

+Global functions are declared normally, just as in C/C++. The function body must be defined, i.e. it is not possible to declare prototypes, nor is it necessary as the compiler can resolve the function names anyway.

+For parameters sent by reference, i.e. with the & modifier it is necessary to specify in which direction the value is passed, in, out, or inout, e.g. &out. If no keyword is used, the compiler assumes the inout modifier. For parameters marked with in, the value is passed in to the function, and for parameters marked with out the value is returned from the function.

+Parameters can also be declared as const which prohibits the alteration of their value. It is good practice to declare variables that will not be changed as const, because it makes for more readable code and the compiler is also able to take advantage of it some times. Especially for const &in the compiler is many times able to avoid a copy of the value.

+Note that although functions that return types by references can't be declared by scripts you may still see functions like these if the host application defines them. In that case the returned value may also be used as the target in assignments.

+

+  int MyFunction(int a, int b)
+  {
+    return a + b;
+  }
+

+Variables

+Global variables may be declared in the scripts, which will then be shared between all contexts accessing the script module.

+The global variables may be initialized by simple expressions that do not require any functions to be called, i.e. the value can be evaluated at compile time.

+Variables declared globally like this are accessible from all functions. The value of the variables are initialized at compile time and any changes are maintained between calls. If a global variable holds a memory resource, e.g. a string, its memory is released when the module is discarded or the script engine is reset.

+

+  int MyValue = 0;
+  const uint Flag1 = 0x01;
+

+Variables of primitive types are initialized before variables of non-primitive types. This allows class constructors to access other global variables already with their correct initial value. The exception is if the other global variable also is of a non-primitive type, in which case there is no guarantee which variable is initialized first, which may lead to null-pointer exceptions being thrown during initialization.

+Classes

+In AngelScript the script writer may declare script classes. The syntax is similar to that of C++ or Java.

+With classes the script writer can declare new data types that hold groups of variables and methods to manipulate them. The classes also supports inheritance and polymorphism through interfaces.

+

+  // The class declaration
+  class MyClass
+  {
+    // The default constructor
+    MyClass()
+    {
+      a = 0;
+    }

+

    // A class method
+    void DoSomething()
+    {
+      a *= 2;
+    }

+

    // A class property
+    int a;
+  }
+

+

See also:
Script classes
+

+Interfaces

+An interface works like a contract, the classes that implements an interface are guaranteed to implement the methods declared in the interface. This allows for the use of polymorphism in that a function can specify that it wants an object handle to an object that implements a certain interface. The function can then call the methods on this interface without having to know the exact type of the object that it is working with.

+

+  // The interface declaration
+  interface MyInterface
+  {
+    void DoSomething();
+  }

+

  // A class that implements the interface MyInterface
+  class MyClass : MyInterface
+  {
+    void DoSomething()
+    {
+      // Do something
+    }
+  }
+

+A class can implement multiple interfaces; Simply list all the interfaces separated by a comma.

+Imports

+Sometimes it may be useful to load script modules dynamically without having to recompile the main script, but still let the modules interact with each other. In that case the script may import functions from another module. This declaration is written using the import keyword, followed by the function signature, and then specifying which module to import from.

+This allows the script to be compiled using these imported functions, without them actually being available at compile time. The application can then bind the functions at a later time, and even unbind them again.

+If a script is calling an imported function that has not yet been bound the script will be aborted with a script exception.

+

+  import void MyFunction(int a, int b) from "Another module";
+

+Enums

+Enums are a convenient way of registering a family of integer constants that may be used throughout the script as named literals instead of numeric constants. Using enums often help improve the readability of the code, as the named literal normally explains what the intention is without the reader having to look up what a numeric value means in the manual.

+Even though enums list the valid values, you cannot rely on a variable of the enum type to only contain values from the declared list. Always have a default action in case the variable holds an unexpected value.

+The enum values are declared by listing them in an enum statement. Unless a specific value is given for an enum constant it will take the value of the previous constant + 1. The first constant will receive the value 0, unless otherwise specified.

+

+  enum MyEnum
+  {
+    eValue0,
+    eValue2 = 2,
+    eValue3,
+    eValue200 = eValue2 * 100
+  }
+

+Typedefs

+Typedefs are used to define aliases for other types.

+Currently a typedef can only be used to define an alias for primitive types, but a future version will have more complete support for all kinds of types.

+

+  typedef float  real32;
+  typedef double real64;
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_good_practice.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_good_practice.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_good_practice.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_good_practice.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,24 @@ + + +AngelScript: Good practices + + + + +
+

Good practices

This article will try to explain some good practices, that will help you get going faster and easier find the solution when a problem occurs.

+Always check return values for registrations

+When configuring the script engine you should always check the return values, at least in debug mode. All error codes are negative so a simple assert( r >= 0 ) where r is the returned value is sufficient to pinpoint where the configuration failed.

+If a function failed during the configuration, the Build method will always fail with a return code of asINVALID_CONFIGURATION. Unless you already verified the error codes for all the configuration calls, it will not be possible to determine what the error was.

+

// Verifying the return code with an assert is simple and won't pollute the code
+r = engine->RegisterGlobalFunction("void func()", asFUNCTION(func), asCALL_CDECL); assert( r >= 0 );
+

+assert() can safely be used with engine registrations, since the engine will set the internal state to invalid configuration if a function fails. Even in release mode the failure is discovered when a script is built.

+Use the message callback to receive detailed error messages

+The return code from the register functions, Build, and CompileFunction, can only tell you that something was wrong, not what it was. To help identify the exact problem the message callback should be used. The script library will then send messages explaining the error or warning in clear text.

+See Message callback for more information on the message callback.

+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_hello_world.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_hello_world.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_hello_world.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_hello_world.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,96 @@ + + +AngelScript: Your first script + + + + +
+

Your first script

Being an embedded scripting library there isn't much that AngelScript allows the scripts to do by themselves, so the first thing the application must do is to register the interface that the script will have to interact with the application. The interface may consist of functions, variables, and even complete classes.

+

// Create the script engine
+asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
+
+// Set the message callback to receive information on errors in human readable form.
+// It's recommended to do this right after the creation of the engine, because if
+// some registration fails the engine may send valuable information to the message
+// stream.
+r = engine->SetMessageCallback(asFUNCTION(MessageCallback), 0, asCALL_CDECL); assert( r >= 0 );
+
+// AngelScript doesn't have a built-in string type, as there is no definite standard 
+// string type for C++ applications. Every developer is free to register it's own string type.
+// The SDK do however provide a standard add-on for registering a string type, so it's not
+// necessary to implement the registration yourself if you don't want to.
+RegisterStdString(engine);
+
+// Register the function that we want the scripts to call 
+r = engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL); assert( r >= 0 );
+

+After the engine has been configured, the next step is to compile the scripts that should be executed.

+The following is our script that will call the registered print function to write Hello world on the standard output stream. Let's say it's stored in the file test.as.

+

+  void main()
+  {
+    print("Hello world\n");
+  }
+

+Here's the code for loading the script file and compiling it.

+

// The CScriptBuilder helper is an add-on that loads the file,
+// performs a pre-processing pass if necessary, and then tells
+// the engine to build a script module.
+CScriptBuilder builder;
+r = builder.BuildScriptFromFile(engine, "MyModule", "test.as");
+if( r < 0 )
+{
+  // An error occurred. Instruct the script writer to fix the 
+  // compilation errors that were listed in the output stream.
+  printf("Please correct the errors in the script and try again.\n");
+  return;
+}
+

+The last step is to identify the function that is to be called, and set up a context for executing it.

+

// Find the function that is to be called. 
+asIScriptModule *mod = engine->GetModule("MyModule");
+int funcId = mod->GetFunctionIdByDecl("void main()");
+if( funcId < 0 )
+{
+  // The function couldn't be found. Instruct the script writer
+  // to include the expected function in the script.
+  printf("The script must have the function 'void main()'. Please add it and try again.\n");
+  return;
+}
+
+// Create our context, prepare it, and then execute
+asIScriptContext *ctx = engine->CreateContext();
+ctx->Prepare(funcId);
+r = ctx->Execute()
+if( r != asEXECUTION_FINISHED )
+{
+  // The execution didn't complete as expected. Determine what happened.
+  if( r == asEXECUTION_EXCEPTION )
+  {
+    // An exception occurred, let the script writer know what happened so it can be corrected.
+    printf("An exception '%s' occurred. Please correct the code and try again.\n", ctx->GetExceptionString());
+  }
+}
+

+The exception handling above is very basic. The application may also obtain information about line number, function, call stack, and even values of local and global variables if wanted.

+Don't forget to clean up after you're done with the engine.

+

// Clean up
+ctx->Release();
+engine->Release();
+

+Helper functions

+The print function is implemented as a very simple wrapper on the printf function.

+

// Print the script string to the standard output stream
+void print(string &msg)
+{
+  printf("%s", msg.c_str());
+}
+

+

See also:
Message callback, Script builder helper, and string object (STL)
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_license.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_license.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_license.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_license.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,29 @@ + + +AngelScript: License + + + + +
+

License

+AngelCode Scripting Library

+Copyright © 2003-2009 Andreas Jönsson

+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. +
  3. +Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.

    +

  4. +
  5. +This notice may not be removed or altered from any source distribution.
  6. +
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_memory.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_memory.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_memory.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_memory.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,60 @@ + + +AngelScript: Memory management + + + + +
+

Memory management

This article will explain the memory management in AngelScript in detail. It's probably more detail than most developers need to know, but some may want to know exactly how it works in order to evaluate AngelScript better.

+Overview of the memory management

+AngelScript uses a hybrid method with both reference counting and garbage collection, where reference counting is the main method and the garbage collection is only for backup when circular references needs to be resolved.

+This design was chosen because reference counting is the easiest way of passing objects between script engine and application while still keeping track of live objects. If pure garbage collection was used, the script engine would have to know about the entire memory space of the application where script objects could be stored, otherwise it wouldn't be able to know if the objects are still alive or not.

+The garbage collector is only used for those object types that have a possibility of forming a circular reference with itself or other objects, e.g. objects that have a member variable as a handle to the same type as itself. Whenever such an object is created, the garbage collector is informed so that it can keep track of the object.

+The garbage collector is executed manually because the application will want to control when that extra processing should be done, usually at idle moments of the application execution. The garbage collector in AngelScript is also incremental, so that it can be executed in tiny steps throughout the application execution.

+

See also:
Garbage collection
+

+Reference counting algorithm

+All built-in script objects are automatically reference counted, and the application just need to make sure to call the AddRef and Release methods appropriately if it is storing any references to the objects outside the script engine.

+Application registered objects may or may not be reference counted. Those that should be reference counted must implement the ADDREF and RELEASE behaviours so that AngelScript can notify the objects of the changes to the reference count. The application needs keep track of the reference counter itself and free the memory when there are no more references to the object. This is usually done by having an integer member variable in the object structure itself to hold the reference count. It can also be implemented with a separate structure for holding the reference counter, but it adds extra overhead as the reference counter must be searched for with each change.

+

See also:
Registering an object type
+

+Garbage collector algorithm

+The garbage collector, used to handle the scenarios where reference counting isn't enough, uses the following algorithm.

+

    +
  1. +Destroy garbage: Free all objects with only one reference. This reference is held by the GC itself so therefore it is known that nobody else is referencing the object.

    +

  2. +
  3. +Clear counters: Clear the GC counter for the remaining objects. This counter will be used to count the references to the object reachable from the GC. At the same time the objects are also flagged, so that we can detect if the references change while the garbage collector is running. This flag is automatically cleared when incrementing or decrementing the reference counter.

    +

  4. +
  5. +Count GC references: For each of the objects in the GC, tell it to increment the GC counter for all objects it holds references to. This is only done for objects still flagged, because if the flag is no longer set we know it has been referenced by the application, thus it is considered live along with all objects it holds references to.

    +

  6. +
  7. +Mark live objects: Build a list of all objects in the GC that are not flagged or that doesn't have the GC count equal to the reference counter. These are objects that are considered live. For each of the objects in the list, add all of the references in the object to the list as well, unless they are already in the list. As the list is traversed it will grow with new objects, these objects will also have their references added to the list. This way we're following the chain of references so we're gathering all objects that are alive.

    +

  8. +
  9. +Verify unmarked objects: Make one more pass over the list of objects in the GC to see if any of the objects that were not marked as alive has had the flag cleared, if it has then the run the 'mark live objects' step again.

    +

  10. +
  11. +Break circular references: All objects that have not been marked as alive by this time are involved in unreachable circular references and must be destroyed. The objects are destroyed by telling the objects to release the references they hold, thus breaking the circular references. When all circular references have been broken, the entire GC routine is restarted which will free the objects. If there were no dead objects, then the GC is finished.

    +

  12. +
+

+All of the steps, except 'verify unmarked objects' are incremental, i.e. they can be interrupted to allow the application and scripts to execute before continuing the garbage collection. Step 1 can also be executed individually at any time during the cycle, this permits to free up memory for objects that are not involved in cyclic memory without having to wait for the detection cycle to complete.

+The application should ideally invoke the garbage collector every once in a while to make sure too much garbage isn't accumulated over long periods.

+It may also be a good idea to do a complete run of the GC when it doesn't matter if the application pauses for a little while, for example when in menu mode.

+The garbage collector can also take care of application registered types if the application registers the appropriate object behaviours.

+

See also:
Garbage collected objects
+

+Memory heap

+By default AngelScript uses the memory heap accessed through the standard malloc and free global functions when allocating memory. Usually this means that AngelScript shares the memory heap with the application, though if the AngelScript library is compiled as a DLL or a shared object the heap may actually be separate from the application heap.

+Some applications need extra control over the memory heap that the standard C/C++ library doesn't provide. This is common with video games for consoles, that have limited memory and cannot afford loosing space due to fragmentation or many small allocations. AngelScript aids these applications as well as it is possible to register custom memory allocation routines with the library, giving the application exact control over the memory used by AngelScript.

+

See also:
asSetGlobalMemoryFunctions
+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_obj_handle.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_obj_handle.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_obj_handle.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_obj_handle.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,69 @@ + + +AngelScript: Object handles + + + + +
+

Object handles

In AngelScript an object handle is a reference counted pointer to an object. In the scripts they are used to pass the objects around by reference instead of by value. Depending on how an application type is registered the type will support handles.

+

See also:
Registering an object type, Object handles in the script language
+

+Managing the reference counter in functions

+Whenever the object handle is passed by value from the application to the script engine, or vice versa its reference should be accounted for. This means that the application must release any object handles it receives as parameters when it no longer needs them, it also means that the application must increase the reference counter for any object handle being returned to the script engine. Note that this is not the same for the generic calling convention where AngelScript automatically takes care of most of work.

+A function that creates an object and returns it to the script engine might look like this:

+

// Registered as "obj@ CreateObject()"
+obj *CreateObject()
+{
+  // The constructor already initializes the ref count to 1
+  return new obj();
+}
+

+A function that receives an object handle from the script and stores it in a global variable might look like this:

+

// Registered as "void StoreObject(obj@)"
+obj *o = 0;
+void StoreObject(obj *newO)
+{
+  // Release the old object handle
+  if( o ) o->Release();
+
+  // Store the new object handle
+  o = newO;
+}
+

+A function that retrieves a previously stored object handle might look like this:

+

// Registered as "obj@ RetrieveObject()"
+obj *RetrieveObject()
+{
+  // Increase the reference counter to account for the returned handle
+  if( o ) o->AddRef();
+
+  // It is ok to return null if there is no previous handle stored
+  return o;
+}
+

+A function that receives an object handle in the parameter, but doesn't store it looks like this:

+

// Registered as "void DoSomething(obj@)"
+void DoSomething(obj *o)
+{
+  // When finished with the object it must be released
+  if( o ) o->Release();
+}
+

+Auto handles can make it easier

+The application can use auto handles (@+) to alleviate some of the work of managing the reference counter. When registering the function or method with AngelScript, add a plus sign to the object handles that AngelScript should automatically manage. For parameters AngelScript will then release the reference after the function returns, and for the return value AngelScript will increase the reference on the returned pointer. The reference for the returned value is increased before the parameters are released, so it is possible to have the function return one of the parameters.

+

// Registered as "obj@+ ChooseObj(obj@+, obj@+)"
+obj *ChooseObj(obj *a, obj *b)
+{
+  // Because of the auto handles AngelScript will
+  // automatically manage the reference counters
+  return some_condition ? a : b;
+}
+

+However, it is not recommended to use this feature unless you can't change the functions you want to register to properly handle the reference counters. When using the auto handles, AngelScript needs to process all of the handles which causes an extra overhead when calling application registered functions.

+The auto handles does not affect the behaviour of the handles when the generic calling convention is used.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_operator_precedence.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_operator_precedence.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_operator_precedence.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_operator_precedence.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,68 @@ + + +AngelScript: Operator precedence + + + + +
+

Operator precedence

In expressions, the operator with the highest precedence is always computed first.

+Unary operators

+Unary operators have the higher precedence than other operators, and between unary operators the operator closest to the actual value has the highest precedence. Post-operators have higher precedence than pre-operators.

+This list shows the available unary operators.

+ + + + + + + + + + + + + + + + + + + +
:: scope resolution operator
[] indexing operator
++ -- post increment and decrement
. member access
++ -- pre increment and decrement
not ! logical not
+ - unary positive and negative
~ bitwise complement
@ handle of
+

+Binary and ternary operators

+This list shows the dual and ternary operator precedence in decreasing order.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
* / % multiply, divide, and modulo
+ - add and subtract
<< >> >>> left shift, right shift, and arithmetic right shift
& bitwise and
^ bitwise xor
| bitwise or
<= < >= > comparison
== != is !is xor ^^ equality, identity, and logical exclusive or
and && logical and
or || logical or
?: condition
= += -= *= /= = &=
+ |= ^= <<= >>= >>>=
assignment and compound assignments
+

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_overview.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_overview.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_overview.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_overview.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ + + +AngelScript: Overview + + + + +
+

Overview

AngelScript is structured around an engine where the application should register the functions, properties, and even types, that the scripts will be able to use. The scripts are then compiled into modules, where the application may have one or more modules, depending on the need of the application. The application can also expose a different interface to each module through the use of configuration groups. This is especially useful when the application works with multiple types of scripts, e.g. GUI, AI control, etc.

+Each module has it's own scope of script functions, global variables, and classes. These are normally not shared between modules, even though multiple modules may be built from the same source scripts. However modules may interact with each others through function binding.

+As the scripts are compiled into bytecode AngelScript also provides a virtual machine, also known as a script context, for executing the bytecode. The application can have any number of script context at the same time, though most applications will probably only need one. The contexts support suspending the execution and then resuming it, so the application can easily implement features such as concurrent scripts and co-routines. The script context also provides an interface for extracting run-time information, useful for debugging scripts.

+The script language is based on the well known syntax of C++ and more modern languages such as Java, C#, and D. Anyone with some knowledge of those languages, or other script languages with similar syntax, such as Javascript and ActionScript, should feel right at home with AngelScript. Contrary to most script languages, AngelScript is a strongly typed language, which permits faster execution of the code and smoother interaction with the host application as there will be less need for runtime evaluation of the true type of values.

+The memory management in AngelScript is based on reference counting with an incremental garbage collector for detecting and freeing objects with circular references. This provides for a controlled environment without application freezes as the garbage collector steps in to free up memory.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_basicref.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_basicref.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_basicref.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_basicref.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,61 @@ + + +AngelScript: Registering a reference type + + + + +
+

Registering a reference type

The basic reference type should be registered with the following behaviours: asBEHAVE_FACTORY, asBEHAVE_ADDREF, and asBEHAVE_RELEASE.

+

// Registering the reference type
+r = engine->RegisterObjectType("ref", 0, asOBJ_REF); assert( r >= 0 );
+

+

See also:
The string add-on for an example of a reference type.

+Garbage collected objects, Class hierarchies, Registering a scoped reference type, and Registering a single-reference type for more advanced types.

+

+Factory function

+The factory function is the one that AngelScript will use to instanciate objects of this type when a variable is declared. It is responsible for allocating and initializing the object memory.

+The default factory function doesn't take any parameters and should return an object handle for the new object. Make sure the object's reference counter is accounting for the reference being returned by the factory function, so that the object is properly released when all references to it are removed.

+

CRef::CRef()
+{
+    // Let the constructor initialize the reference counter to 1
+    refCount = 1;
+}
+
+CRef *Ref_Factory()
+{
+    // The class constructor is initializing the reference counter to 1
+    return new CRef();
+}
+
+// Registering the factory behaviour
+r = engine->RegisterObjectBehaviour("ref", asBEHAVE_FACTORY, "ref@ f()", asFUNCTION(Ref_Factory), asCALL_CDECL); assert( r >= 0 );
+

+You may also register factory functions that take parameters, which may then be used when initializing the object.

+The factory function must be registered as a global function, but can be implemented as a static class method, common global function, or a global function following the generic calling convention.

+Addref and release behaviours

+
void CRef::Addref()
+{
+    // Increase the reference counter
+    refCount++;
+}
+
+void CRef::Release()
+{
+    // Decrease ref count and delete if it reaches 0
+    if( --refCount == 0 )
+        delete this;
+}
+
+// Registering the addref/release behaviours
+r = engine->RegisterObjectBehaviour("ref", asBEHAVE_ADDREF, "void f()", asMETHOD(CRef,AddRef), asCALL_THISCALL); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("ref", asBEHAVE_RELEASE, "void f()", asMETHOD(CRef,Release), asCALL_THISCALL); assert( r >= 0 );
+

+Registering an uninstanciable reference type

+Sometimes it may be useful to register types that cannot be instanciated by the scripts, yet can be interacted with. You can do this by registering the type as a normal reference type, but omit the registration of the factory behaviour. You can later register global properties, or functions that allow the scripts to access objects created by the application via object handles.

+This would be used when the application has a limited number of objects available and doesn't want to create new ones. For example singletons, or pooled objects.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_api.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_api.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_api.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_api.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,23 @@ + + +AngelScript: Registering the application interface + + + + +
+

Registering the application interface

AngelScript requires the application developer to register the interface that the scripts should use to interact with anything outside the script itself.

+It's possible to register global functions and global properties that can be used directly by the scripts.

+For more complex scripts it may be useful to register new object types to complement the built-in data types.

+AngelScript doesn't have a built-in string type as there is no de-facto standard for string types in C++. Instead AngelScript permits the application to register its own preferred string type, and a string factory that the script engine will use to instanciate the strings.

+Class interfaces can be registered if you want to guarantee that script classes implement a specific set of class methods. Interfaces can be easier to use when working with script classes from the application, but they are not necessary as the application can easily enumerate available methods and properties even without the interfaces.

+enumeration types and typedefs can also be registered to improve readability of the scripts.

+Topics

+ +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_func.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_func.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_func.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_func.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,79 @@ + + +AngelScript: Registering a function + + + + +
+

Registering a function

This article aims to explain the way functions are registered with AngelScript, and some of the differences between C++ and AngelScript that the developer needs to be aware of in order to be successful in registering the application interface that the scripts will use. The principles learned here are used in several locations, such as RegisterGlobalFunction, RegisterObjectMethod, RegisterObjectBehaviour, etc.

+How to get the address of the application function or method

+The macros asFUNCTION, asFUNCTIONPR, asMETHOD, and asMETHODPR have been implemented to facilitate the task of getting the function pointer and passing them on to the script engine.

+The asFUNCTION takes the function name as the parameter, which works for all global functions that do not have any overloads. If you use overloads, i.e. multiple functions with the same name but with different parameters, then you need to use asFUNCTIONPR instead. This macro takes as parameter the function name, parameter list, and return type, so that the C++ compiler can resolve exactly which overloaded function to take the address of.

+

// Global function
+void globalFunc();
+r = engine->RegisterGlobalFunction("void globalFunc()", asFUNCTION(globalFunc), asCALL_CDECL); assert( r >= 0 );
+
+// Overloaded global functions
+void globalFunc2(int);
+void globalFunc2(float);
+r = engine->RegisterGlobalFunction("void globalFunc2(int)", asFUNCTIONPR(globalFunc2, (int), void), asCALL_CDECL); assert( r >= 0 );
+

+The same goes for asMETHOD and asMETHODPR. The difference between these and asFUNCTION/asFUNCTIONPR is that the former take the class name as well as parameter.

+

class Object
+{
+  // Class method
+  void method();
+  
+  // Overloaded method
+  void method2(int input);
+  void method2(int input, int &output);
+};
+
+// Registering the class method
+r = engine->RegisterObjectMethod("object", "void method()", asMETHOD(Object,method), asCALL_THISCALL); assert( r >= 0 );
+
+// Registering the overloaded methods
+r = engine->RegisterObjectMethod("object", "void method2(int)", asMETHODPR(Object, method2, (int), void), asCALL_THISCALL); assert( r >= 0 );
+r = engine->RegisterObjectMethod("object", "void method2(int, int &out)", asMETHODPR(Object, method2, (int, int&), void), asCALL_THISCALL); assert( r >= 0 );
+

+Calling convention

+AngelScript accepts most common calling conventions that C++ uses, i.e. cdecl, stdcall, and thiscall. There is also a generic calling convention that can be used for example when native calling conventions are not supported on the target platform.

+All functions and behaviours must be registered with the asCALL_CDECL, asCALL_STDCALL, asCALL_THISCALL, or asCALL_GENERIC flags to tell AngelScript which calling convention the application function uses. The special conventions asCALL_CDECL_OBJLAST and asCALL_CDECL_OBJFIRST can also be used wherever asCALL_THISCALL is accepted, in order to simulate a class method through a global function.

+If the incorrect calling convention is given on the registration you'll very likely see the application crash with a stack corruption whenever the script engine calls the function. cdecl is the default calling convention for all global functions in C++ programs, so if in doubt try with asCALL_CDECL first. The calling convention only differs from cdecl if the function is explicitly declared to use a different convention, or if you've set the compiler options to default to another convention.

+For class methods there is only the thiscall convention, except when the method is static, as those methods are in truth global functions in the class namespace. Normal methods, virtual methods, and methods for classes with multiple inheritance are all registered the same way, with asCALL_THISCALL. Classes with virtual inheritance are not supported natively.

+

See also:
The generic calling convention
+

+Virtual inheritance is not supported

+Registering class methods for classes with virtual inheritance is not supported due to the high complexity involved with them. Each compiler implements the method pointers for these classes differently, and keeping the code portable would be very difficult. This is not a great loss though, as classes with virtual inheritance are relatively rare, and it is easy to write simple proxy functions where the classes to exist.

+

class A { void SomeMethodA(); };
+class B : virtual A {};
+class C : virtual A {};
+class D : public B, public C {};
+
+// Need a proxy function for registering SomeMethodA for class D
+void D_SomeMethodA_proxy(D *d)
+{
+  // The C++ compiler will resolve the virtual method for us
+  d->SomeMethodA();
+}
+
+// Register the global function as if it was a class method, 
+// but with calling convention asCALL_CDECL_OBJLAST
+engine->RegisterObjectMethod("D", "void SomeMethodA()", asFUNCTION(D_SomeMethodA_proxy), asCALL_CDECL_OBJLAST);
+

+If you have a lot of classes with virtual inheritance, you should probably think about writing a template proxy function, so you don't have to manually write all the proxy functions.

+A little on type differences

+AngelScript supports most of the same types that C++ has, but there are differences that you'll need to know when registering functions, methods, and behaviours.

+All primitive types in C++ have a corresponding type in AngelScript, though sometimes with a slightly different name, i.e. char in C++ is int8 in AngelScript. You can see a list of all types and their match in respective language here.

+Pointers do not exist in AngelScript in the same way as in C++, so you need to decide on how they should be passed. For this you have two options, either as reference, or as an object handle. Most common uses of pointers in parameters can be represented with either references or object handles in AngelScript, for the few uses where it cannot be done a wrapper function must be written to simplify the function interface to a form that AngelScript can understand.

+Parameter references in AngelScript have an additional restriction over the C++ references, and that is that you must specify the intended direction of the value that the reference points to, i.e. whether it is an input value, output value, or if the value is both input and output. This is done by adding the keywords in, out, or inout after the & character. If no keyword is given AngelScript assumes inout. Value types can only use in and out, as AngelScript cannot guarantee the safety of the references otherwise.

+Object handles are reference counted pointers to objects, so when using these you need to pay attention to the reference counter, e.g. whenever you receive an object handle from AngelScript, you must make sure to decrease the reference when you're done with it. Similarly whenever you pass an object handle to AngelScript you must make sure that reference is accounted for, so that AngelScript doesn't destroy the object too early. If your application functions are not already prepared to work like this, you can most of the time tell AngelScript to handle the reference counting for you by using the auto-handles, @+.

+Strings are a bit complicated as C++ doesn't have one standard way of dealing with them. Because of that AngelScript also doesn't impose a specific string type on the applications. Instead the application needs to register the string type it wants to use, and then the string parameters needs to be registered accordingly. AngelScript comes with two standard add-ons for registering string types, one for std::string, and another for a light wrapper on std::string, which for the most part is compatible with std::string, except that it is reference counted.

+

See also:
Object handles, Datatypes in AngelScript and C++, string object (STL), string object (reference counted)
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_prop.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_prop.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_prop.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_prop.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,43 @@ + + +AngelScript: Registering global properties + + + + +
+

Registering global properties

By registering global properties with the script engine you can allow the scripts to inspect and/or modify variables within the application directly, without the need to write special functions to do this.

+To register the property, you just need to call the RegisterGlobalProperty method, passing the declaration and a pointer to the property. Remember that the registered property must stay alive as long as its registration is valid in the engine.

+

// Variables that should be accessible through the script.
+int      g_number       = 0;
+CObject *g_object       = 0;
+Vector3  g_vector       = {0,0,0};
+bool     g_readOnlyFlag = false;
+
+// A function to register the global properties. 
+void RegisterProperties(asIScriptEngine *engine)
+{
+    int r;
+    
+    // Register a primitive property that can be read and written to from the script.
+    r = engine->RegisterGlobalProperty("int g_number", &g_number); assert( r >= 0 );
+    
+    // Register variable where the script can store a handle to a CObject type. 
+    // Assumes that the CObject type has been registered with the engine already as a reference type.
+    r = engine->RegisterGlobalProperty("CObject @g_object", &g_object); assert( r >= 0 );
+    
+    // Register a 3D vector variable.
+    // Assumes that the Vector3 type has been registered already as a value type.
+    r = engine->RegisterGlobalProperty("Vector3 g_vector", &g_vector); assert( r >= 0 );
+    
+    // Register a boolean flag that can be read, but not modified by the script.
+    r = engine->RegisterGlobalProperty("const bool g_readOnlyFlag", &g_readOnlyFlag); assert( r >= 0 );
+}
+

+

See also:
Registering an object type
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_type.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_type.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_type.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_type.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ + + +AngelScript: Registering an object type + + + + +
+

Registering an object type

The are two principal paths to take when registering a new type, either the type is a reference type that is located in dynamic memory, or the type is a value type that is located on the stack. Complex types are usually registered as reference types, while simple types that are meant to be used as primitives are registered as value types. A reference type support object handles (unless restricted by application), but cannot be passed by value to application registered functions, a value type doesn't support handles and can be passed by value to application registered functions.

+

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_val_type.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_val_type.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_val_type.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_register_val_type.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,66 @@ + + +AngelScript: Registering a value type + + + + +
+

Registering a value type

When registering a value type, the size of the type must be given so that AngelScript knows how much space is needed for it. If the type doesn't require any special treatment, i.e. doesn't contain any pointers or other resource references that must be maintained, then the type can be registered with the flag asOBJ_POD. In this case AngelScript doesn't require the default constructor, assignment behaviour, or destructor as it will be able to automatically handle these cases the same way it handles built-in primitives.

+If you plan on passing the or returning the type by value to registered functions that uses native calling convention, you also need to inform how the type is implemented in the application, but if you only plan on using generic calling conventions, or don't pass these types by value then you don't need to worry about that.

+

// Register a primitive type, that doesn't need any special management of the content
+r = engine->RegisterObjectType("pod", sizeof(pod), asOBJ_VALUE | asOBJ_POD); assert( r >= 0 );
+
+// Register a class that must be properly initialized and uninitialized
+r = engine->RegisterObjectType("val", sizeof(val), asOBJ_VALUE); assert( r >= 0 );
+

+

See also:
The string object (STL) or vector3 add-on for examples of value types
+

+Constructor and destructor

+If a constructor or destructor is needed they shall be registered the following way:

+

void Constructor(void *memory)
+{
+  // Initialize the pre-allocated memory by calling the
+  // object constructor with the placement-new operator
+  new(memory) Object();
+}
+
+void Destructor(void *memory)
+{
+  // Uninitialize the memory by calling the object destructor
+  ((Object*)memory)->~Object();
+}
+
+// Register the behaviours
+r = engine->RegisterObjectBehaviour("val", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(Constructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("val", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(Destructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );
+

+Value types and native calling conventions

+If the type will be passed to and from the application by value using native calling conventions, it is important to inform AngelScript of its real type in C++, otherwise AngelScript won't be able to determine exactly how C++ is treating the type in a parameter or return value.

+There are a few different flags for this:

+ + + + + + + + + + + + + +
asOBJ_APP_CLASS   The C++ type is a class, struct, or union
asOBJ_APP_CLASS_CONSTRUCTOR   The C++ type has a defined constructor
asOBJ_APP_CLASS_DESTRUCTOR   The C++ type has a defined destructor
asOBJ_APP_CLASS_ASSIGNMENT   The C++ type has a defined assignment operator
asOBJ_APP_PRIMITIVE   The C++ type is a C++ primitive, but not a float or double
asOBJ_APP_FLOAT   The C++ type is a float or double
+

+Note that these don't represent how the type will behave in the script language, only what the real type is in the host application. So if you want to register a C++ class that you want to behave as a primitive type in the script language you should still use the flag asOBJ_APP_CLASS. The same thing for the flags to identify that the class has a constructor, destructor, or assignment. These flags tell AngelScript that the class has the respective function, but not that the type in the script language should have these behaviours.

+For class types there are also a shorter form of the flags for each combination of the 4 flags. They are of the form asOBJ_APP_CLASS_CDA, where the existance of the last letters determine if the constructor, destructor, and/or assignment behaviour are available. For example asOBJ_APP_CLASS_CDA is defined as asOBJ_APP_CLASS | asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT.

+

// Register a complex type that will be passed by value to the application
+r = engine->RegisterObjectType("complex", sizeof(complex), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); assert( r >= 0 );
+

+Make sure you inform these flags correctly, because if you do not you may get various errors when executing the scripts. Common problems are stack corruptions, and invalid memory accesses. In some cases you may face more silent errors that may be difficult to detect, e.g. the function is not returning the expected values.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_objmeth.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_objmeth.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_objmeth.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_objmeth.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,32 @@ + + +AngelScript: Registering object methods + + + + +
+

Registering object methods

Class methods are registered with the RegisterObjectMethod call.

+

// Register a class method
+void MyClass::ClassMethod()
+{
+  // Do something
+}
+
+r = engine->RegisterObjectMethod("mytype", "void ClassMethod()", asMETHOD(MyClass,ClassMethod), asCALL_THISCALL); assert( r >= 0 );
+

+It is also possible to register a global function that takes a pointer to the object as a class method. This can be used to extend the functionality of a class when accessed via AngelScript, without actually changing the C++ implementation of the class.

+

// Register a global function as an object method
+void MyClass_MethodWrapper(MyClass *obj)
+{
+  // Access the object
+  obj->DoSomething();
+}
+
+r = engine->RegisterObjectMethod("mytype", "void MethodWrapper()", asFUNCTION(MyClass_MethodWrapper), asCALL_CDECL_OBJLAST); assert( r >= 0 );
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_objprop.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_objprop.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_objprop.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_objprop.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,23 @@ + + +AngelScript: Registering object properties + + + + +
+

Registering object properties

Class member variables can be registered so that they can be directly accessed by the script without the need for any method calls.

+

struct MyStruct
+{
+  int a;
+};
+
+r = engine->RegisterObjectProperty("mytype", "int a", offsetof(MyStruct,a)); assert( r >= 0 );
+

+offsetof() is a macro declared in stddef.h header file.

+It is also possible to expose properties through property accessors, which are a pair of class methods for getting and setting the property value. This is especially useful when the offset of the property cannot be determined, or if the type of the property is not registered in the script and some translation must occur, i.e. from char* to string.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_opbeh.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_opbeh.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_opbeh.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reg_opbeh.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ + + +AngelScript: Registering operator behaviours + + + + +
+

Registering operator behaviours

In order for AngelScript to know how to work with the application registered types, it is necessary to register some behaviours, for example for memory management.

+The memory management behaviours are described with the registeration of registering reference types and value types.

+Other advanced behaviours are described with the advanced types.

+Only a few operators have special behaviours for them, the other operators are registered as ordinary class methods with predefined names.

+Index operator

+The index operator is usually used to access an element by index, e.g. the elements of an array.

+

// Simple implementation of the index operator
+int &MyClass::operator[] (int index)
+{
+  return internal_array[index];
+}
+
+// Non-mutable variant that works on const references to the object
+const int &MyClass::operator[] (int index) const
+{
+  return internal_array[index];
+}
+
+// Register both the const and non-const alternative for const correctness
+r = engine->RegisterObjectBehaviour("mytype", asBEHAVE_INDEX, "int &f(int)", asMETHODPR(MyClass, operator[], (int), int&), asCALL_THISCALL); assert( r >= 0 );
+r = engine->RegisterObjectBehaviour("mytype", asBEHAVE_INDEX, "const int &f(int) const", asMETHODPR(MyClass, operator[], (int) const, const int&), asCALL_THISCALL); assert( r >= 0 );
+

+Value cast operators

+The value cast operators are used to allow the scripts to convert an object type to another type by constructing a new value. This is different from a reference cast, that do not construct new values, but rather changes the way it is perceived.

+By registering the behaviour either as asBEHAVE_VALUE_CAST or asBEHAVE_IMPLICIT_VALUE_CAST you let AngelScript know whether the behaviour may be used to implicitly cast the type or not.

+

// Convert a string to an int
+int ConvStringToInt(const std::string &s)
+{
+  return atoi(s.c_str());
+}
+
+// Register the behaviour
+r = engine->RegisterObjectBehaviour("string", asBEHAVE_VALUE_CAST, "int f() const", asFUNCTION(ConvStringToInt), asCALL_CDECL_OBJLAST); assert( r >= 0 );
+

+The return type for the cast behaviour can be any type except bool and void. The value cast is meant to create a new value, so if the function returns a reference or an object handle make sure it points to a new value and not the original one.

+The object constructors and factories also serve as alternative explicit value cast operators, so if a constructor or factory is already available then there is no need to register the explicit value cast operator.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reserved_keywords.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reserved_keywords.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reserved_keywords.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_reserved_keywords.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,137 @@ + + +AngelScript: Reserved keywords and tokens + + + + +
+

Reserved keywords and tokens

These are the keywords that are reserved by the language, i.e. they can't be used by any script defined identifiers. Remember that the host application may reserve additional keywords that are specific to that application.

+ + + +
and
+ bool
+ break
+ case
+ cast
+ class
+ const
+ continue
+ default
+ do
+
double
+ else
+ enum
+ false
+ float
+ for
+ from*
+ if
+ import
+ in
+
inout
+ int
+ interface
+ int8
+ int16
+ int32
+ int64
+ is
+ not
+ null
+
or
+ out
+ return
+ super*
+ switch
+ this*
+ true
+ typedef
+ uint
+ uint8
+
uint16
+ uint32
+ uint64
+ void
+ while
+ xor
+
+

+* Not really a reserved keyword, but is recognized by the compiler as a built-in keyword.

+These are the non-alphabetical tokens that are also used in the language syntax.

+ + + +
*
+ /
+ %
+ +
+ -
+ <=
+ <
+ >=
+ >
+ (
+
)
+ ==
+ !=
+ ?
+ :
+ =
+ +=
+ -=
+ =
+ /=
+
=
+ ++
+ --
+ &
+ ,
+ {
+ }
+ ;
+ |
+ ^
+
~
+ <<
+ >>
+ >>>
+ &=
+ |=
+ ^=
+ <<=
+ >>=
+ >>>=
+
.
+ &&
+ ||
+ !
+ [
+ ]
+ ^^
+ @
+ !is
+ ::
+
+

+Other than the above tokens there are also numerical, string, identifier, and comment tokens.

+

+123456789
+123.123e123
+123.123e123f
+0x1234FEDC
+'abc'
+"abc"
+"""heredoc"""
+_Abc123
+//
+/*
+*/
+

+The characters space (32), tab (9), carriage return (13), line feed (10), and the UTF8 byte-order-mark (U+FEFF) are all recognized as whitespace.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_concurrent.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_concurrent.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_concurrent.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_concurrent.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ + + +AngelScript: Concurrent scripts + + + + +
+

Concurrent scripts

Path: /sdk/samples/concurrent/

+This sample shows how to execute two or more long running scripts concurrently. The scripts voluntarily hand over the control to the next script in the queue by calling the function sleep().

+

    +
  • Context manager
  • Multiple scripts running in parallel
  • sleep()
  • Strings
  • Registered global functions
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_console.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_console.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_console.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_console.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,19 @@ + + +AngelScript: Console + + + + +
+

Console

Path: /sdk/samples/console/

+This sample implements a simple interactive console, which lets the user type in commands and also evaluate simple script statements to manipulate the application.

+The user is also able to define new variables and functions from the command line. These functions can then be executed to perform automated tasks.

+

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_corout.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_corout.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_corout.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_corout.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ + + +AngelScript: Co-routines + + + + +
+

Co-routines

Path: /sdk/samples/coroutine/

+This sample shows how co-routines can be implemented with AngelScript. Co-routines are threads that can be created from the scripts, and that work together by voluntarily passing control to each other by calling yield().

+

    +
  • Context manager
  • Co-routines created from the scripts with variable parameter structure.
  • Strings
  • Registered global functions
  • Handling the variable argument type
  • Passing arguments to script functions
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_events.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_events.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_events.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_events.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ + + +AngelScript: Events + + + + +
+

Events

Path: /sdk/samples/events/

+This sample has the script engine execute a long running script. The script execution is regularly interrupted by the application so that keyboard events can be processed, which execute another short script before resuming the execution of the main script. The event handling scripts change the state of the long running script.

+

    +
  • LineCallback() function which suspends execution when the time is up
  • Strings
  • Registered global functions
  • Scripted event handlers
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ + + +AngelScript: Samples + + + + +
+

Samples

This page gives a brief description of the samples that you'll find in the /sdk/samples/ folder.

+

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_incl.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_incl.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_incl.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_incl.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ + + +AngelScript: Include directive + + + + +
+

Include directive

Path: /sdk/samples/include/

+This sample shows how to implement a very simple preprocessor to add support for the #include directive, which allow the script writer to reuse common script code. The preprocessor simply adds the included scripts as multiple script sections, which is ok as AngelScript is able to resolve global declarations independently of their order. The preprocessor also makes sure that a script file is only included once, so the script writer doesn't have to take extra care to avoid multiple includes or even complicated circular includes.

+

    +
  • Script builder helper
  • LineCallback() functions which aborts execution when the time is up
  • Processing the #include directive
  • Circular #includes are resolved automatically
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_tutorial.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_tutorial.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_tutorial.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_samples_tutorial.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ + + +AngelScript: Tutorial + + + + +
+

Tutorial

Path: /sdk/samples/tutorial/

+This sample was written with the intention of explaining the basics of AngelScript, that is, how to configure the engine, load and compile a script, and finally execute a script function with parameters and return value.

+

    +
  • LineCallback() function which aborts execution when the time is up
  • Strings
  • Registered global functions
  • Script function parameters and return value
  • Retrieving information about script exceptions
  • asIScriptGeneric for when the library doesn't support native calling convention
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,68 @@ + + +AngelScript: Script classes + + + + +
+

Script classes

In AngelScript the script writer may declare script classes. The syntax is similar to that of C++, except the public, protected, and private keywords are not available. All the class methods must be declared with their implementation, like in Java.

+The default constructor and destructor are not needed, unless specific logic is wanted. AngelScript will take care of the proper initialization of members upon construction, and releasing members upon destruction, even if not manually implemented.

+With classes the script writer can declare new data types that hold groups of variables and methods to manipulate them. The class' properties can be accessed directly or through property accessors. It is also possible to overload operators for the classes.

+

+  // The class declaration
+  class MyClass
+  {
+    // The default constructor
+    MyClass()
+    {
+      a = 0;
+    }

+

    // Destructor
+    ~MyClass()
+    {
+    }

+

    // Another constructor
+    MyClass(int a)
+    {
+      this.a = a;
+    }

+

    // A class method
+    void DoSomething()
+    {
+      a *= 2;
+    }

+

    // A class property
+    int a;
+  }
+

+AngelScript supports single inheritance, where a derived class inherits the properties and methods of its base class. Multiple inheritance is not supported, but polymorphism is supprted by implementing interfaces.

+All the class methods are virtual, so it is not necessary to specify this manually. When a derived class overrides an implementation, it can extend the original implementation by specifically calling the base class' method using the scope resolution operator. When implementing the constructor for a derived class the constructor for the base class is called using the super keyword. If none of the base class' constructors is manually called, the compiler will automatically insert a call to the default constructor in the beginning. The base class' destructor will always be called after the derived class' destructor, so there is no need to manually do this.

+

+  // A derived class
+  class MyDerived : MyClass
+  {
+    // The default constructor
+    MyDerived()
+    {
+      // Calling the non-default constructor of the base class
+      super(10);

+

      b = 0;
+    }

+

    // Overloading a virtual method
+    void DoSomething()
+    {
+      // Call the base class' implementation
+      MyClass::DoSomething();

+

      // Do something more
+      b = a;
+    }

+

    int b;
+  }
+

+Note, that since AngelScript uses automatic memory management, it can be difficult to know exactly when the destructor is called, so you shouldn't rely on the destructor being called at a specific moment. AngelScript will also call the destructor only once, even if the object is resurrected by adding a reference to it while executing the destructor.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_main.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_main.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_main.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_main.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,20 @@ + + +AngelScript: Script classes + + + + +
+

Script classes

+

+

Todo:
Add page on class methods

+Add page on constructor and destructors

+Add page on inheritance

+
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_ops.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_ops.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_ops.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_ops.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,117 @@ + + +AngelScript: Operator overloads + + + + +
+

Operator overloads

It is possible to define what should be done when an operator is used with a script class. While not necessary in most scripts it can be useful to improve readability of the code.

+This is called operator overloading, and is done by implementing specific class methods. The compiler will recognize and use these methods when it compiles expressions involving the overloaded operators and the script class.

+Unary operators

+ + + + + + + +
opopfunc
- opNeg
~ opCom
+

+When the expression op a is compiled, the compiler will rewrite it as a.opfunc and compile that instead.

+Comparison operators

+ + + + + + + + + + + + + + + +
opopfunc
== opEquals
!= opEquals
< opCmp
<= opCmp
> opCmp
>= opCmp
+

+The a == b expression will be rewritten as a.opEquals(b) and b.opEquals(a) and then the best match will be used. != is treated similarly, except that the result is negated. The opEquals method must be implemented to return a bool in order to be considered by the compiler.

+The comparison operators are rewritten as a.opCmp(b) op 0 and 0 op b.opCmp(a) and then the best match is used. The opCmp method must be implemented to return a int in order to be considered by the compiler.

+If an equality check is made and the opEquals method is not available the compiler looks for the opCmp method instead. So if the opCmp method is available it is really not necesary to implement the opEquals method, except for optimization reasons.

+Assignment operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
opopfunc
= opAssign
+= opAddAssign
-= opSubAssign
*= opMulAssign
/= opDivAssign
%= opModAssign
&= opAndAssign
|= opOrAssign
^= opXorAssign
<<= opShlAssign
>>= opShrAssign
>>>= opUShrAssign
+

+The assignment expressions a op b are rewritten as a.opfunc(b) and then the best matching method is used. An assignment operator can for example be implemented like this:

+

+  obj@ opAssign(const obj &in other)
+  {
+    // Do the proper assignment
+    ...

+

    // Return a handle to self, so that multiple assignments can be chained
+    return this;
+  }
+

+All script classes have a default assignment operator that does a bitwise copy of the content of the class, so if that is all you want to do, then there is no need to implement this method.

+Binary operators

+ + + + + + + + + + + + + + + + + + + + + + + + + +
opopfuncopfunc_r
+ opAdd opAdd_r
- opSub opSub_r
* opMul opMul_r
/ opDiv opDiv_r
% opMod opMod_r
& opAnd opAnd_r
| opOr opOr_r
^ opXor opXor_r
<< opShl opShl_r
>> opShr opShr_r
>>> opUShr opUShr_r
+

+The expressions with binary operators a op b will be rewritten as a.opfunc(b) and b.opfunc_r(a) and then the best match will be used.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_prop.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_prop.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_prop.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_class_prop.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,51 @@ + + +AngelScript: Property accessors + + + + +
+

Property accessors

Many times when working with class properties it is necessary to make sure specific logic is followed when accessing them. An example would be to always send a notification when a property is modified, or computing the value of the property from other properties. By implementing property accessor methods for the properties this can be implemented by the class itself, making it easier for the one who accesses the properties.

+In AngelScript property accessors are implemented as ordinary class methods with the prefixes get_ and set_.

+

+  // The class declaration with property accessors
+  class MyObj
+  {
+    int get_prop() const
+    {
+      // The actual value of the property could be stored
+      // somewhere else, or even computed at access time
+      return realProp;
+    }

+

    void set_prop(int val)
+    {
+      // Here we can do extra logic, e.g. make sure 
+      // the value is within the proper range
+      if( val > 1000 ) val = 1000;
+      if( val < 0 ) val = 0;

+

      realProp = val;
+    }

+

    // The caller should use the property accessors
+    // 'prop' to access this property
+    int realProp;
+  }

+

  // An example for how to access the property through the accessors
+  void Func()
+  {
+    MyObj obj;

+

    // Set the property value just like a normal property.
+    // The compiler will convert this to a call to set_prop(10000).
+    obj.prop = 10000;

+

    // Get the property value just a like a normal property.
+    // The compiler will convert this to a call to get_prop().
+    assert( obj.prop == 1000 );
+  }
+

+When implementing the property accessors you must make sure the return type of the get accessor and the parameter type of the set accessor match, otherwise the compiler will not know which is the correct type to use.

+You can also leave out either the get or set accessor. If you leave out the set accessor, then the property will be read-only. If you leave out the get accessor, then the property will be write-only.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_handle.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_handle.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_handle.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_handle.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,90 @@ + + +AngelScript: Object handles + + + + +
+

Object handles

An object handle is a type that can hold a reference to an object. With object handles it is possible to declare more than one variables that refer to the same physical object.

+Not all types allow object handles to be used. None of the primitive data types, bool, int, float, etc, can have object handles. Object types registered by the application may or may not allow object handles, depending on how they have been registered.

+General usage

+An object handle is declared by appending the @ symbol to the data type.

+

+  object@ obj_h;
+

+This code declares the object handle obj and initializes it to null, i.e. it doesn't hold a reference to any object.

+In expressions variables declared as object handles are used the exact same way as normal objects. But you should be aware that object handles are not guaranteed to actually reference an object, and if you try to access the contents of an object in a handle that is null an exception will be raised.

+

+  object obj;
+  object@ obj_h;
+  obj.Method();
+  obj_h.Method();
+

+Operators like = or any other operator registered for the object type work on the actual object that the handle references. These will also throw an exception if the handle is empty.

+

+  object obj;
+  object@ obj_h;
+  obj_h = obj;
+

+When you need to make an operation on the actual handle, you should prepend the expression with the @ symbol. Setting the object handle to point to an object is for example done like this:

+

+  object obj;
+  object@ obj_h;
+  @obj_h = @obj;
+

+An object handle can be compared against another object handle (of the same type) to verify if they are pointing to the same object or not. It can also be compared against null, which is a special keyword that represents an empty handle. This is done using the identity operator, is.

+

+  object@ obj_a, obj_b;
+  if( obj_a is obj_b ) {}
+  if( obj_a !is null ) {}
+

+Object life times

+An object's life time is normally for the duration of the scope the variable was declared in. But if a handle outside the scope is set to reference the object, the object will live on until all object handles are released.

+

+  object@ obj_h;
+  {
+    object obj;
+    @obj_h = @obj;

+

    // The object would normally die when the block ends,
+    // but the handle is still holding a reference to it
+  }

+

  // The object still lives on in obj_h ...
+  obj_h.Method();

+

  // ... until the reference is explicitly released
+  // or the object handle goes out of scope
+  @obj_h = null;
+

+Object relations and polymorphing

+Object handles can be used to write common code for related types, by means of inheritance or interfaces. This allows a handle to an interface to store references to all object types that implement that interface, similarly a handle to a base class can store references to all object types that derive from that class.

+

+  interface I {}
+  class A : I {}
+  class B : I {}

+

  // Store reference in handle to interface 
+  I @i1 = A();  
+  I @i2 = B();

+

  void function(I @i)
+  { 
+    // Functions implemented by the interface can be  
+    // called directly on the interface handle. But if
+    // special treatment is need for a specific type, a 
+    // cast can be used to get a handle to the true type.
+    A @a = cast<A>(i);
+    if( a !is null )
+    {
+      // Access A's members directly
+      ...
+    }
+    else
+    { 
+      // The object referenced by i is not of type A
+      ...
+    }
+  }
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ + + +AngelScript: The script language + + + + + +
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_statements.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_statements.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_statements.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_script_statements.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,137 @@ + + +AngelScript: Statements + + + + +
+

Statements

+

+Variable declarations

+
+  int var = 0, var2 = 10;
+  object@ handle, handle2;
+  const float pi = 3.141592f;
+

+Variables must be declared before they are used within the statement block, or any sub blocks. When the code exits the statement block where the variable was declared the variable is no longer valid.

+A variable can be declared with or without an initial expression. If it is declared with an initial expression it, the expression must have the evaluate to a type compatible with the variable type.

+Any number of variables can be declared on the same line separated with commas, where all variables then get the same type.

+Variables can be declared as const. In these cases the value of the variable cannot be changed after initialization.

+Variables of primitive types that are declared without an initial value, will have a random value. Variables of complex types, such as handles and object are initialized with a default value. For handles this is null, for objects this is what is defined by the object's default constructor.

+Expression statement

+
+  a = b;  // a variable assignment
+  func(); // a function call
+

+Any expression may be placed alone on a line as a statement. This will normally be used for variable assignments or function calls that don't return any value of importance.

+All expression statements must end with a ;.

+Conditions: if / if-else / switch-case

+
+  if( condition ) 
+  {
+    // Do something if condition is true
+  }

+

  if( value < 10 ) 
+  {
+    // Do something if value is less than 10
+  }
+  else
+  {
+    // Do something else if value is greater than or equal to 10
+  }
+

+If statements are used to decide whether to execute a part of the logic or not depending on a certain condition. The conditional expression must always evaluate to true or false.

+It's possible to chain several if-else statements, in which case each condition will be evaluated sequencially until one is found to be true.

+

+  switch( value )
+  {
+  case 0:
+    // Do something if value equals 0, then leave
+    break;

+

  case 2:
+  case constant_value:
+    // This will be executed if value equals 2 or the constant_value
+    break;

+

  default:
+    // This will be executed if value doesn't equal any of the cases
+  }
+

+If you have an integer (signed or unsigned) expression that have many different outcomes that should lead to different code, a switch case is often the best choice for implementing the condition. It is much faster than a series of ifs, especially if all of the case values are close in numbers.

+Each case should be terminated with a break statement unless you want the code to continue with the next case.

+The case value can be a constant variable that was initialized with a constant expression. If the constant variable was initialized with an expression that cannot be determined at compile time it cannot be used in the case values.

+Loops: while / do-while / for

+
+  // Loop, where the condition is checked before the logic is executed
+  int i = 0;
+  while( i < 10 )
+  {
+    // Do something
+    i++;
+  }

+

  // Loop, where the logic is executed before the condition is checked
+  int j = 0;
+  do 
+  {
+    // Do something
+    j++;
+  } while( j < 10 );
+

+For both while and do-while the expression that determines if the loop should continue must evaluate to either true or false. If it evaluates to true, the loop continues, otherwise it stops and the code will continue with the next statement immediately following the loop.

+

+  // More compact loop, where condituion is checked before the logic is executed
+  for( int n = 0; n < 10; n++ ) 
+  {
+    // Do something
+  }
+

+The for loop is a more compact form of a while loop. The first part of the statement (until the first ;) is executed only once, before the loop starts. Here it is possible to declare a variable that will be visible only within the loop statement. The second part is the condition that must be satisfied for the loop to be executed. A blank expression here will always evaluate to true. The last part is executed after the logic within the loop, e.g. used to increment an iteration variable.

+Loop control: break / continue

+
+  for(;;) // endless loop
+  {
+    // Do something

+

    // End the loop when condition is true
+    if( condition )
+      break;
+  }
+

+break terminates the smallest enclosing loop statement or switch statement.

+

+  for(int n = 0; n < 10; n++ )
+  {
+    if( n == 5 )
+      continue;

+

    // Do something for all values from 0 to 9, except for the value 5
+  }
+

+continue jumps to the next iteration of the smallest enclosing loop statement.

+Return statement

+
+  float valueOfPI()
+  {
+    return 3.141592f; // return a value 
+  }
+

+Any function with a return type other than void must be finished with a return statement where expression evaluates to the same data type as the function return type. Functions declared as void can have return statements without any expression to terminate early.

+Statement blocks

+
+  {
+    int a; 
+    float b;

+

    {
+      float a; // Override the declaration of the outer variable
+               // but only within the scope of this block.

+

      // variables from outer blocks are still visible
+      b = a;
+    }

+

    // a now refers to the integer variable again
+  }
+

+A statement block is a collection of statements. Each statement block has its own scope of visibility, so variables declared within a statement block are not visible outside the block.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_start.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_start.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_start.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_start.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,16 @@ + + +AngelScript: Getting started + + + + + +
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_strings.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_strings.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_strings.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_strings.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,39 @@ + + +AngelScript: The string type + + + + +
+

The string type

Almost all applications have some need to manipulate text strings in one way or another. However most applications have very different needs, and also different ways of representing their string types. For that reason, AngelScript doesn't come with its own built-in string type that the application would be forced to adapt to, instead AngelScript allows the application to register its own string type.

+This article presents the options for customizing the script language to the application's needs with regards to strings. If you do not want, or do not need to have AngelScript use your own string type, then I suggest you use one of the standard string add-ons, either the std::string registration, or the reference counted string type.

+Unicode vs ASCII

+Is you're application using Unicode or plain ASCII for the text? If you use Unicode, then you'll want to encode the scripts in UTF-8, which the AngelScript compiler supports natively. By default AngelScript expects the scripts to have been encoded in UTF-8, but should you prefer ASCII you can turn this off by setting the engine property asEP_SCRIPT_SCANNER to 0 right after creating the engine.

+

// Set engine to use ASCII scanner for script code
+engine->SetEngineProperty(asEP_SCRIPT_SCANNER, 0);
+

+If you do use Unicode, then you'll also want to choose the desired encoding for the string literals, either UTF-8 or UTF-16. By default the string literals in AngelScript are encoded with UTF-8, but if you're application is better prepared for UTF-16 then you'll want to change this by setting the engine property asEP_STRING_ENCODING to 1 before compiling your scripts.

+

// Set engine to use UTF-16 encoding for string literals
+engine->SetEngineProperty(asEP_STRING_ENCODING, 1);
+

+Observe that the string factory called by the engine to create new strings gives the size of the string data in bytes even for UTF-16 encoded strings, so you'll need to divide the size by two to get the number of characters in the string.

+Multiline string literals

+There is also a couple of options that affect the script language itself a bit. If you like the convenience of allowing string literals to span multiple lines of code, then you can turn this on by setting the engine property asEP_ALLOW_MULTILINE_STRINGS to true. Without this the compiler will give an error if it encounters a line break before the end of the string.

+

// Set engine to allow string literals with line breaks
+engine->SetEngineProperty(asEP_ALLOW_MULTILINE_STRINGS, true);
+

+Observe that the line ending encoding of the source file will not be modified by the script compiler, so depending on how the file has been saved, you may get strings using different line endings.

+The heredoc strings are not affected by this setting, as they are designed to support multiline text sections.

+Character literals

+By default AngelScript doesn't have character literals as C and C++ does. A string literal can be written with double quotes or single quotes and still have the same meaning. This makes it convenient to embed scripts in XML files or C/C++ source files where double quotes would otherwise end the script code.

+If you want to have single quoted literals mean a single character literal instead of a string, then you can do so by setting the engine property asEP_USE_CHARACTER_LITERALS to true. The compiler will then convert single quoted literals to an integer number representing the first character.

+

// Set engine to use character literals 
+engine->SetEngineProperty(asEP_USE_CHARACTER_LITERALS, true);
+

+Observe that the asEP_SCRIPT_SCANNER property has great importance in this case, as an ASCII character can only represent values between 0 and 255, whereas a Unicode character can represent values between 0 and 1,114,111.

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_understanding_as.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_understanding_as.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_understanding_as.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_understanding_as.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,18 @@ + + +AngelScript: Understanding AngelScript + + + + +
+

Understanding AngelScript

In order to successfully use AngelScript it is important to understand some differences between AngelScript and C++. While the library has been written so that it can be embedded within the application with as little change to the application functions and classes as possible, there are some care that must be taken when passing objects between AngelScript and C++.

+Topics

+ +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_use_script_class.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_use_script_class.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_use_script_class.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_use_script_class.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,42 @@ + + +AngelScript: Using script classes + + + + +
+

Using script classes

When there are multiple objects controlled by the same script implementation it may be favourable to use script classes, rather than global script functions. Using script classes each instance can have it's own set of variables within the class, contrary to the global functions that needs to rely on global variables to store persistent information.

+Of course, it would be possible to duplicate the script modules, so that there is one module for each object instance, but that would be impose a rather big overhead for the application. Script classes don't have that overhead, as all instances share the same module, and thus the same bytecode and function ids, etc.

+Instanciating the script class

+Before instanciating the script class you need to know which class to instanciate. Exactly how this is done depends on the application, but here are some suggestions.

+If the application knows the name of the class, either hardcoded or from some configuration, the class type can easily be obtained by calling the module's GetTypeIdByDecl with the name of the class. The application can also choose to identify the class through some properties of the class, e.g. if the class implements a predefined interface. Then the application can enumerate the class types implemented in the script with GetObjectTypeByIndex and then examine the type through the asIObjectType interface.

+A third option, if you're using the script builder add-on, is to use the metadata to identify the class. If you choose this option, use the asIScriptModule to enumerate the declared types and then query the CScriptBuilder for their metadata.

+Once the object type is known you create the instance by calling the class' factory function, passing it the necessary arguments, e.g. a pointer to the application object which the script class should be bound to. The factory function id is found by querying the asIObjectType.

+

// Get the object type
+asIScriptModule *module = engine->GetModule("MyModule");
+asIObjectType *type = engine->GetObjectTypeById(module->GetTypeIdByDecl("MyClass"));
+
+// Get the factory function id from the object type
+int factoryId = type->GetFactoryIdByDecl("MyClass @MyClass(int)");
+

+The factory function is called as a regular global function and returns a handle to the newly instanciated class.

+Calling a method on the script class

+Calling the methods of the script classes are similar to calling global functions except that you obtain the function id from the asIObjectType, and you must set the object pointer along with the rest of the function arguments.

+

// Obtain the id of the class method
+int funcId = type->GetMethodIdByDecl("void method()");
+
+// Prepare the context for calling the method
+ctx->Prepare(funcId);
+
+// Set the object pointer
+ctx->SetObject(obj);
+
+// Execute the call
+ctx->Execute();
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_using.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_using.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_using.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doc_using.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,16 @@ + + +AngelScript: Using AngelScript + + + + + +
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doxygen.css kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doxygen.css --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doxygen.css 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doxygen.css 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,441 @@ +body, table, div, p, dl { + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 12px; +} + +/* @group Heading Levels */ + +h1 { + text-align: center; + font-size: 150%; +} + +h2 { + font-size: 120%; +} + +h3 { + font-size: 100%; +} + +/* @end */ + +caption { + font-weight: bold; +} + +div.qindex, div.navtab{ + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #153788; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #1b77c5; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code { +} + +a.codeRef { +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +.fragment { + font-family: monospace, fixed; + font-size: 105%; +} + +pre.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + padding: 4px 6px; + margin: 4px 8px 4px 2px; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} + +td.indexkey { + background-color: #e8eef2; + font-weight: bold; + border: 1px solid #CCCCCC; + margin: 2px 0px 2px 0; + padding: 2px 10px; +} + +td.indexvalue { + background-color: #e8eef2; + border: 1px solid #CCCCCC; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #f0f0f0; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +/* @end */ + +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} + +th.dirtab { + background: #e8eef2; + font-weight: bold; +} + +hr { + height: 0; + border: none; + border-top: 1px solid #666; +} + +/* @group Member Descriptions */ + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #FAFAFA; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #ccc; +} + +.memTemplParams { + color: #606060; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; + margin-left: 3px; +} + +.memnav { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.memitem { + padding: 0; +} + +.memname { + white-space: nowrap; + font-weight: bold; +} + +.memproto, .memdoc { + border: 1px solid #84b0c7; +} + +.memproto { + padding: 0; + background-color: #d5e1e8; + font-weight: bold; + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -moz-border-radius-topleft: 8px; + -moz-border-radius-topright: 8px; +} + +.memdoc { + padding: 2px 5px; + background-color: #eef3f5; + border-top-width: 0; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} + +/* @end */ + +/* @group Directory (tree) */ + +/* for the tree view */ + +.ftvtree { + font-family: sans-serif; + margin: 0.5em; +} + +/* these are for tree view when used as main index */ + +.directory { + font-size: 9pt; + font-weight: bold; +} + +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +/* +The following two styles can be used to replace the root node title +with an image of your choice. Simply uncomment the next two styles, +specify the name of your image and be sure to set 'height' to the +proper pixel height of your image. +*/ + +/* +.directory h3.swap { + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); +} +.directory h3.swap span { + display: none; +} +*/ + +.directory > h3 { + margin-top: 0; +} + +.directory p { + margin: 0px; + white-space: nowrap; +} + +.directory div { + display: none; + margin: 0px; +} + +.directory img { + vertical-align: -30%; +} + +/* these are for tree view when not used as main index */ + +.directory-alt { + font-size: 100%; + font-weight: bold; +} + +.directory-alt h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +.directory-alt > h3 { + margin-top: 0; +} + +.directory-alt p { + margin: 0px; + white-space: nowrap; +} + +.directory-alt div { + display: none; + margin: 0px; +} + +.directory-alt img { + vertical-align: -30%; +} + +/* @end */ + +address { + font-style: normal; + color: #333; +} Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doxygen.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/doxygen.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/files.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/files.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/files.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/files.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,17 @@ + + +AngelScript: File Index + + + + +
+

File List

Here is a list of all documented files with brief descriptions: + +
angelscript.hThe API definition for AngelScript
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2blank.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2blank.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2doc.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2doc.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2folderclosed.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2folderclosed.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2folderopen.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2folderopen.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2lastnode.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2lastnode.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2link.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2link.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2mlastnode.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2mlastnode.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2mnode.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2mnode.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2node.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2node.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2plastnode.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2plastnode.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2pnode.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2pnode.png differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2vertline.png and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/ftv2vertline.png differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x62.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x62.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x62.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x62.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,57 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- b -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x63.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x63.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x63.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x63.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,71 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- c -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x64.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x64.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x64.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x64.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,51 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- d -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x65.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x65.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x65.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x65.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,53 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- e -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x67.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x67.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x67.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x67.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,316 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- g -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x69.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x69.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x69.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x69.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,55 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- i -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6c.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6c.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6c.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6c.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- l -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6d.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6d.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6d.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6d.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- m -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6e.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6e.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6e.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6e.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,51 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- n -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6f.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6f.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6f.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x6f.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,51 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- o -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x70.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x70.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x70.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x70.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,53 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- p -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x72.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x72.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x72.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x72.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,96 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- r -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x73.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x73.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x73.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x73.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,112 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- s -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x74.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x74.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x74.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x74.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,50 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- t -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x75.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x75.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x75.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x75.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,53 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- u -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x76.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x76.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x76.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x76.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- v -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x77.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x77.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x77.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_0x77.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,51 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- w -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x62.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x62.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x62.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x62.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,51 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- b -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x63.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x63.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x63.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x63.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,65 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- c -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x64.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x64.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x64.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x64.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,45 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- d -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x65.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x65.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x65.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x65.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- e -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x67.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x67.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x67.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x67.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,310 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- g -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x69.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x69.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x69.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x69.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,51 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- i -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x6c.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x6c.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x6c.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x6c.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,45 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- l -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x6e.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x6e.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x6e.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x6e.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,45 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- n -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x70.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x70.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x70.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x70.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,47 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- p -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x72.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x72.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x72.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x72.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,90 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- r -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x73.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x73.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x73.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x73.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,100 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- s -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x75.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x75.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x75.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x75.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- u -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x77.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x77.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x77.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func_0x77.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,47 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- w -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_func.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,56 @@ + + +AngelScript: Class Members - Functions + + + + +
+ +
+
+ +
+
+  +

+

- a -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,60 @@ + + +AngelScript: Class Members + + + + +
+ +
+
+ +
+
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- a -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_vars.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_vars.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_vars.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/functions_vars.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,58 @@ + + +AngelScript: Class Members - Variables + + + + +
+ +
+
+  +

+

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_defs.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_defs.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_defs.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_defs.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,61 @@ + + +AngelScript: Class Members + + + + + +
+  +

+

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_enum.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_enum.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_enum.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_enum.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,61 @@ + + +AngelScript: Class Members + + + + + +
+  +

+

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_eval.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_eval.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_eval.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_eval.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,688 @@ + + +AngelScript: Class Members + + + + + +
+
    +
  • a
  • +
+
+
+  +

+

- a -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_func.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_func.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_func.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_func.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,43 @@ + + +AngelScript: Class Members + + + + + +
+  +

+

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,790 @@ + + +AngelScript: Class Members + + + + + +
+
    +
  • a
  • +
+
+
+Here is a list of all documented file members with links to the documentation: +

+

- a -

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_type.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_type.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_type.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_type.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ + + +AngelScript: Class Members + + + + + +
+  +

+

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_vars.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_vars.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_vars.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/globals_vars.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,33 @@ + + +AngelScript: Class Members + + + + + +
+  +

+

+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/index.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/index.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/index.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/index.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,11 @@ + + +AngelScript + + + + + <a href="main.html">Frames are disabled. Click here to go to the main page.</a> + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/main.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/main.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/main.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/main.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,27 @@ + + +AngelScript: Manual + + + + +
+

Manual

+

+

+aslogo.png +
+

+

Version 2.18.0

+AngelScript is a free, open source, flexible, and cross-platform scripting library meant to be embedded in applications. The purpose is to provide an easy to use library that is powerful, but that isn't weighed down by a large amount of rarely used features.

+Development of AngelScript begun in February, 2003, with the first public release on March 28th, 2003, with only the most basic of functionality. Ever since that day the world has seen frequent releases with new features and improvements. The author is still dedicated to the continued improvement and growth of this library.

+The official site for the library is http://www.angelcode.com/angelscript.

+Topics

+ +
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/pages.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/pages.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/pages.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/pages.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,20 @@ + + +AngelScript: Page Index + + + + +
+

Related Pages

Here is a list of all related documentation pages: +
+
Generated on Wed Dec 16 19:34:50 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_b_c_info.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_b_c_info.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_b_c_info.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_b_c_info.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,45 @@ + + +AngelScript: asSBCInfo Struct Reference + + + + +
+

asSBCInfo Struct Reference

Information on a bytecode instruction. +More... +

+ +

+List of all members. + + + + + + + + + + + + + + +

Public Attributes

+asEBCInstr bc
 Bytecode instruction id.
+asEBCType type
 Instruction argument layout.
+int stackInc
 How much this argument increments the stack pointer. 0xFFFF if it depends on the arguments.
+const char * name
 Name of the instruction for debugging.
+


Detailed Description

+This structure can be obtained for each bytecode instruction by looking it up in the asBCInfo array.

+The size of the instruction can be obtained by looking up the type in the asBCTypeSize array.

+

See also:
JIT compilation
+
The documentation for this struct was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_b_c_info-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_b_c_info-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_b_c_info-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_b_c_info-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,19 @@ + + +AngelScript: Member List + + + + +
+

asSBCInfo Member List

This is the complete list of members for asSBCInfo, including all inherited members.

+ + + + +
bcasSBCInfo
nameasSBCInfo
stackIncasSBCInfo
typeasSBCInfo

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_func_ptr.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_func_ptr.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_func_ptr.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_func_ptr.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,24 @@ + + +AngelScript: asSFuncPtr Struct Reference + + + + +
+

asSFuncPtr Struct Reference

Represents a function or method pointer. + +

+ +

+List of all members. + +
+


The documentation for this struct was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_func_ptr-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_func_ptr-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_func_ptr-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_func_ptr-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,15 @@ + + +AngelScript: Member List + + + + +
+

asSFuncPtr Member List

This is the complete list of members for asSFuncPtr, including all inherited members.

+

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_message_info.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_message_info.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_message_info.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_message_info.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,45 @@ + + +AngelScript: asSMessageInfo Struct Reference + + + + +
+

asSMessageInfo Struct Reference

Represents a compiler message. + +

+ +

+List of all members. + + + + + + + + + + + + + + + + + +

Public Attributes

+const char * section
 The script section where the message is raised.
+int row
 The row number.
+int col
 The column.
+asEMsgType type
 The type of message.
+const char * message
 The message text.
+


The documentation for this struct was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_message_info-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_message_info-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_message_info-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_message_info-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,20 @@ + + +AngelScript: Member List + + + + +
+

asSMessageInfo Member List

This is the complete list of members for asSMessageInfo, including all inherited members.

+ + + + + +
colasSMessageInfo
messageasSMessageInfo
rowasSMessageInfo
sectionasSMessageInfo
typeasSMessageInfo

+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_v_m_registers.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_v_m_registers.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_v_m_registers.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_v_m_registers.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,60 @@ + + +AngelScript: asSVMRegisters Struct Reference + + + + +
+

asSVMRegisters Struct Reference

A struct with registers from the VM sent to a JIT compiled function. +More... +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Attributes

+asDWORDprogramPointer
 Points to the current bytecode instruction.
+asDWORDstackFramePointer
 Function stack frame. This doesn't change during the function execution.
+asDWORDstackPointer
 Top of the stack (grows downward).
+void ** globalVarPointers
 Array of global variable pointers. This doesn't change during the function execution.
+asQWORD valueRegister
 Temporary register for primitives and unmanaged references.
+void * objectRegister
 Temporary register for managed object references/handles.
+asIObjectTypeobjectType
 Type of the object held in the object register.
+bool doProcessSuspend
 Set to true if the SUSPEND instruction should be processed. Do not update this value.
+


Detailed Description

+The JIT compiled function will receive a pointer to this structure when called. It is the responsibility of the JIT compiled function to make sure these values are updated correctly before control is returned to the VM.

+

See also:
JIT compilation
+
The documentation for this struct was generated from the following file: +
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_v_m_registers-members.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_v_m_registers-members.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_v_m_registers-members.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/structas_s_v_m_registers-members.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,23 @@ + + +AngelScript: Member List + + + + + +
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tab_b.gif and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tab_b.gif differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tab_l.gif and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tab_l.gif differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tab_r.gif and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tab_r.gif differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tabs.css kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tabs.css --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tabs.css 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tabs.css 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,105 @@ +/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ + +DIV.tabs +{ + float : left; + width : 100%; + background : url("tab_b.gif") repeat-x bottom; + margin-bottom : 4px; +} + +DIV.tabs UL +{ + margin : 0px; + padding-left : 10px; + list-style : none; +} + +DIV.tabs LI, DIV.tabs FORM +{ + display : inline; + margin : 0px; + padding : 0px; +} + +DIV.tabs FORM +{ + float : right; +} + +DIV.tabs A +{ + float : left; + background : url("tab_r.gif") no-repeat right top; + border-bottom : 1px solid #84B0C7; + font-size : 80%; + font-weight : bold; + text-decoration : none; +} + +DIV.tabs A:hover +{ + background-position: 100% -150px; +} + +DIV.tabs A:link, DIV.tabs A:visited, +DIV.tabs A:active, DIV.tabs A:hover +{ + color: #1A419D; +} + +DIV.tabs SPAN +{ + float : left; + display : block; + background : url("tab_l.gif") no-repeat left top; + padding : 5px 9px; + white-space : nowrap; +} + +DIV.tabs INPUT +{ + float : right; + display : inline; + font-size : 1em; +} + +DIV.tabs TD +{ + font-size : 80%; + font-weight : bold; + text-decoration : none; +} + + + +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +DIV.tabs SPAN {float : none;} +/* End IE5-Mac hack */ + +DIV.tabs A:hover SPAN +{ + background-position: 0% -150px; +} + +DIV.tabs LI.current A +{ + background-position: 100% -150px; + border-width : 0px; +} + +DIV.tabs LI.current SPAN +{ + background-position: 0% -150px; + padding-bottom : 6px; +} + +DIV.navpath +{ + background : none; + border : none; + border-bottom : 1px solid #84B0C7; + text-align : center; + margin : 2px; + padding : 2px; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/todo.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/todo.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/todo.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/todo.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ + + +AngelScript: Todo List + + + + +
+

Todo List

+
Page Concurrent scripts
+
Complete this page

+

+
+

+

+
Page Co-routines
+
Complete this page

+

+
+

+

+
Page Debugging scripts
+
Complete this page

+

+
+

+

+
Page Advanced topics
+
Add page about dynamic config groups

+Add page about custom memory management

+Add page about customizations/optimizations

+Add page about imports and function binding

+Add page about execute string and dynamic compilations

+

+
+

+

+
Page Script classes
+
Add page on class methods

+Add page on constructor and destructors

+Add page on inheritance

+

+
+
+
Generated on Wed Dec 16 19:34:51 2009 for AngelScript by  + +doxygen 1.5.9
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tree.html kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tree.html --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tree.html 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/angelscript/docs/manual/tree.html 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,212 @@ + + + + + + + TreeView + + + + +
+

AngelScript

+
+

o+Manual

+
+

|o+Getting started

+ +

|o+Using AngelScript

+ +

|o+The script language

+ +

|o+The API reference

+ +

|o+Samples

+ +

|\+Add-ons

+ +
+

o*Deprecated List

+

o*Todo List

+

o+Class List

+ +

o*Class Members

+

o+File List

+ +

\*File Members

+
+
+ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/StandAlone/StandAlone.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/StandAlone/StandAlone.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/StandAlone/StandAlone.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/StandAlone/StandAlone.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,216 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#define _CRTDBG_MAP_ALLOC +#include +#include + +#include +#include +#include "Vortex.h" +#include + +IDirect3D9* pD3D9 = NULL; +IDirect3DDevice9* pD3DDevice = NULL; +HWND gHWND = NULL; + +Vortex g_Vortex; + +void CreateDevice( int iWidth, int iHeight ) +{ + pD3D9 = Direct3DCreate9( D3D_SDK_VERSION ); + D3DDISPLAYMODE mode; + pD3D9->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &mode ); + +// iWidth = mode.Width; +// iHeight = mode.Height; +// bool bWindowed = TRUE; + + D3DPRESENT_PARAMETERS PresentParameters; + memset( &PresentParameters, 0, sizeof( PresentParameters ) ); + + PresentParameters.BackBufferCount = 1; + PresentParameters.BackBufferFormat = mode.Format; + PresentParameters.BackBufferWidth = iWidth; + PresentParameters.BackBufferHeight = iHeight; + PresentParameters.SwapEffect = D3DSWAPEFFECT_COPY; + PresentParameters.Flags = 0; + PresentParameters.EnableAutoDepthStencil = TRUE; + PresentParameters.AutoDepthStencilFormat = D3DFMT_D24X8; + PresentParameters.Windowed = true; + PresentParameters.PresentationInterval = D3DPRESENT_INTERVAL_ONE; + PresentParameters.hDeviceWindow = ( HWND )gHWND; + + pD3D9->CreateDevice( D3DADAPTER_DEFAULT, + D3DDEVTYPE_HAL, + ( HWND )gHWND, + D3DCREATE_HARDWARE_VERTEXPROCESSING, + &PresentParameters, + &pD3DDevice ); +} + +LRESULT CALLBACK StaticWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch( uMsg ) + { + case WM_CLOSE: + { + HMENU hMenu; + hMenu = GetMenu( hWnd ); + if( hMenu != NULL ) + DestroyMenu( hMenu ); + DestroyWindow( hWnd ); + UnregisterClass( "Direct3DWindowClass", NULL ); + return 0; + } + + case WM_DESTROY: + PostQuitMessage( 0 ); + break; + } + + return DefWindowProc( hWnd, uMsg, wParam, lParam ); +} + +void RenderFrame() +{ + + pD3DDevice->BeginScene(); + + short waves[2][576]; + static float sin1 = 0; + static float sin2 = 0; + + sin1 += 10; + sin2 += 20; + + static short iCurrent = 0; + for ( int i=0; i < 576; i++) + { +// if ( ( rand() % 10) > 4) +// iCurrent += (short)(rand() % (255)); +// else +// iCurrent -= (short)(rand() % (255)); +// iCurrent = sinf(sin1) * (1 << 11); +// iCurrent += sinf(sin2) * (1 << 11); + waves[0][i] = (rand() % 128 ) << 10;//iCurrent;//iCurrent; + waves[1][i] = (rand() % 128 ) << 10;//iCurrent;//iCurrent; + } + sin1 += 0.2f; + sin2 += 0.3f; + + g_Vortex.AudioData(&waves[0][0], 576, NULL, 0); + + g_Vortex.Render(); + + pD3DDevice->EndScene(); + + pD3DDevice->Present( NULL, NULL, 0, NULL ); +} + +void MainLoop() +{ + bool bGotMsg; + MSG msg; + msg.message = WM_NULL; + PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE ); + + while( WM_QUIT != msg.message ) + { + // Use PeekMessage() so we can use idle time to render the scene. + bGotMsg = ( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) != 0 ); + + if( bGotMsg ) + { + TranslateMessage( &msg ); + DispatchMessage( &msg ); + } + else + { + // Render a frame during idle time (no messages are waiting) + RenderFrame(); + } + } +} + + +int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) +{ + // Register the windows class + WNDCLASS wndClass; + wndClass.style = CS_DBLCLKS; + wndClass.lpfnWndProc = StaticWndProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hInstance = hInstance; + wndClass.hIcon = NULL; + wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); + wndClass.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH ); + wndClass.lpszMenuName = NULL; + wndClass.lpszClassName = "Direct3DWindowClass"; + + if( !RegisterClass( &wndClass ) ) + { + DWORD dwError = GetLastError(); + if( dwError != ERROR_CLASS_ALREADY_EXISTS ) + return -1; + } + + // Find the window's initial size, but it might be changed later + int nDefaultWidth = 640; + int nDefaultHeight = 360; + + RECT rc; + SetRect( &rc, 0, 0, nDefaultWidth, nDefaultHeight ); + AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, false ); + + // Create the render window + HWND hWnd = CreateWindow( "Direct3DWindowClass", "Vortex", WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, ( rc.right - rc.left ), ( rc.bottom - rc.top ), 0, + NULL, hInstance, 0 ); + if( hWnd == NULL ) + { + DWORD dwError = GetLastError(); + return -1; + } + gHWND = hWnd; + + ShowWindow( hWnd, SW_SHOW ); + + CreateDevice( nDefaultWidth, nDefaultHeight ); + + extern char g_TexturePath[]; + extern char g_PresetPath[]; + + strcpy_s( g_TexturePath, 511, "Textures//" ); + strcpy_s( g_PresetPath, 511, "Presets//" ); + + g_Vortex.Init( pD3DDevice, 0, 0, nDefaultWidth, nDefaultHeight, 1.0f); + + MainLoop(); + + g_Vortex.Shutdown(); + + pD3DDevice->Release(); + pD3D9->Release(); + + _CrtDumpMemoryLeaks(); + + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/Vortex/Vortex.sln kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/Vortex/Vortex.sln --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/Vortex/Vortex.sln 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/Vortex/Vortex.sln 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Vortex", "Vortex.vcxproj", "{AFF288D5-8A77-4817-8DD9-364E183CDBF8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AFF288D5-8A77-4817-8DD9-364E183CDBF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {AFF288D5-8A77-4817-8DD9-364E183CDBF8}.Debug|Win32.Build.0 = Debug|Win32 + {AFF288D5-8A77-4817-8DD9-364E183CDBF8}.Release|Win32.ActiveCfg = Release|Win32 + {AFF288D5-8A77-4817-8DD9-364E183CDBF8}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/Vortex/Vortex.vcxproj kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/Vortex/Vortex.vcxproj --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/Vortex/Vortex.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/Vortex/Vortex.vcxproj 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,167 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {AFF288D5-8A77-4817-8DD9-364E183CDBF8} + Win32Proj + Vortex + visVortex + + + + + DynamicLibrary + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + + + + + + + + + + + + + true + $(DXSDK_DIR)Include;$(IncludePath) + $(DXSDK_DIR)Lib\x86;$(LibraryPath) + $(SolutionDir)libs\$(TargetName)\$(Configuration)\ + $(SolutionDir)objs\$(TargetName)\$(Configuration)\ + Vortex_win32dx + .vis + + + false + $(DXSDK_DIR)Include;$(IncludePath) + $(DXSDK_DIR)Lib\x86;$(LibraryPath) + $(SolutionDir)libs\$(TargetName)\$(Configuration)\ + $(SolutionDir)objs\$(TargetName)\$(Configuration)\ + Vortex_win32dx + .vis + + + + _USRDLL;VORTEX_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) + ..\VortexVis\core;..\VortexVis\effects;..\angelscript\angelscript\include;..\..\..\;%(AdditionalIncludeDirectories) + + + D3dx9.lib;winmm.lib;%(AdditionalDependencies) + libcmtd + + + copy "$(TargetPath)" "$(SolutionDir)..\..\addons\visualization.vortex\$(TargetFileName)" + + + + + _USRDLL;VORTEX_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) + ..\VortexVis\core;..\VortexVis\effects;..\angelscript\angelscript\include;..\..\..\;%(AdditionalIncludeDirectories) + + + D3dx9.lib;winmm.lib;%(AdditionalDependencies) + + + copy "$(TargetPath)" "$(SolutionDir)..\..\addons\visualization.vortex\$(TargetFileName)" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {034b1d02-ca92-455d-8866-db95bee49c10} + + + + + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/Vortex/Vortex.vcxproj.filters kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/Vortex/Vortex.vcxproj.filters --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/Vortex/Vortex.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/Vortex/Vortex.vcxproj.filters 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,240 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {1ac7feaf-f9b1-425f-b8ae-e5a5f73a6f72} + + + {4fd0c1de-bcdb-4784-8573-45d524da87b8} + + + {bd0ab410-dc08-46fb-b294-1f3e5ef4f12a} + + + {77d1bd1e-c934-4594-966f-a5773f491581} + + + {98e8d217-f32e-4eec-87cd-05369f120e4a} + + + + + Source Files + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\source + + + Source Files\angelscript\add_on + + + Source Files\angelscript\add_on + + + Source Files\Effects + + + Source Files\Effects + + + Source Files\Effects + + + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\angelscript\add_on + + + Source Files\Effects + + + Source Files\Effects + + + Source Files\Effects + + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/DebugConsole.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/DebugConsole.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/DebugConsole.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/DebugConsole.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,115 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "DebugConsole.h" +#include "Renderer.h" +#include + +#define NUM_LINES ( 100 ) + +namespace +{ + struct ConsoleLine + { + char Txt[ 255 ]; + DWORD Col; + }; + + ConsoleLine Lines[ NUM_LINES ]; + int iCurrentLine = 0; + char Temp[1024]; + bool bHasError = false; +} + +void AddTxt( char* pText, DWORD Col ) +{ + int iOffset = 0; + int len = strlen( pText ); + while ( len > 0 ) + { + strcpy_s( Lines[ iCurrentLine ].Txt, 255, &pText[ iOffset ] ); + Lines[ iCurrentLine ].Col = Col; + len -= 254; + iOffset += 254; + iCurrentLine = ( iCurrentLine + 1 ) % NUM_LINES; + } +} + +void DebugConsole::Log( const char* pText, ... ) +{ + va_list arglist; + va_start(arglist,pText); + vsprintf(Temp,pText,arglist); + va_end(arglist); + + AddTxt( Temp, 0xffffffff ); + OutputDebugStringA( Temp ); +} + +void DebugConsole::Warn( const char* pText, ... ) +{ + va_list arglist; + va_start(arglist,pText); + vsprintf(Temp,pText,arglist); + va_end(arglist); + + AddTxt( Temp, 0xffffff00 ); + OutputDebugStringA( Temp ); +} + +void DebugConsole::Error( const char* pText, ... ) +{ + va_list arglist; + va_start(arglist,pText); + vsprintf(Temp,pText,arglist); + va_end(arglist); + + AddTxt( Temp, 0xffff0000 ); + bHasError = true; + OutputDebugStringA( Temp ); +} + +int iLineHeight = 14; + +void DebugConsole::Render() +{ +// if ( bHasError == false ) +// return; + + int iViewportHeight = Renderer::GetViewportHeight(); + int iLineToDraw = iCurrentLine - 1; + if ( iLineToDraw < 0 ) + iLineToDraw += NUM_LINES; + + for ( int iLine = NUM_LINES - 1; iLine >= 0; iLine-- ) + { + Renderer::DrawText( 0, ( float )iViewportHeight - ( ( NUM_LINES - iLine )* iLineHeight ), Lines[ iLineToDraw ].Txt, Lines[ iLineToDraw ].Col ); + iLineToDraw = ( iLineToDraw - 1 ); + if ( iLineToDraw < 0 ) + iLineToDraw += NUM_LINES; + } +} + +void DebugConsole::Init() +{ + for ( int i = 0; i < NUM_LINES; i++ ) + { + AddTxt( "", 0xffffffff ); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/DebugConsole.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/DebugConsole.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/DebugConsole.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/DebugConsole.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,33 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _DEBUG_CONSOLE_H_ +#define _DEBUG_CONSOLE_H_ + + +class DebugConsole +{ +public: + static void Log( const char* pText, ... ); + static void Warn( const char* pText, ... ); + static void Error( const char* pText, ... ); + static void Render(); + static void Init(); +}; +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/EffectBase.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/EffectBase.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/EffectBase.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/EffectBase.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,32 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "EffectBase.h" +#include "angelscript.h" + +void EffectBase::RegisterScriptInterface( class asIScriptEngine* pScriptEngine ) +{ + int r; + + //--------------------------------------------------------------------------- + // Register the base effect class + r = pScriptEngine->RegisterObjectType( "EffectBase", 0, asOBJ_REF );// assert(r >= 0); + r = pScriptEngine->RegisterObjectBehaviour( "EffectBase", asBEHAVE_ADDREF, "void f()", asMETHOD( EffectBase, AddRef ), asCALL_THISCALL ); //assert(r >= 0); + r = pScriptEngine->RegisterObjectBehaviour( "EffectBase", asBEHAVE_RELEASE, "void f()", asMETHOD( EffectBase, Release ), asCALL_THISCALL ); //assert(r >= 0); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/EffectBase.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/EffectBase.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/EffectBase.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/EffectBase.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,70 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _EFFECT_H_ +#define _EFFECT_H_ + +struct IDirect3DTexture9; + +class EffectBase +{ +public: + static void RegisterScriptInterface( class asIScriptEngine* ); + EffectBase() + { + m_iRefCount = 1; + } + + virtual ~EffectBase() {}; + + void AddRef() + { + m_iRefCount++; + } + + void Release() + { + if ( --m_iRefCount == 0 ) + delete this; + } + + virtual IDirect3DTexture9* GetTexture() { return 0; } + virtual IDirect3DTexture9* GetRenderTarget() { return 0; } + +protected: + int m_iRefCount; +}; + +template +B* refCast(A* a) +{ + // If the handle already is a null handle, then just return the null handle + if( !a ) return 0; + + // Now try to dynamically cast the pointer to the wanted type + B* b = dynamic_cast(a); + if( b != 0 ) + { + // Since the cast was made, we need to increase the ref counter for the returned handle + b->AddRef(); + } + return b; +} + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/fft.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/fft.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/fft.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/fft.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,319 @@ +/* + LICENSE + ------- +Copyright 2005 Nullsoft, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Nullsoft nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "fft.h" + +#define PI 3.141592653589793238462643383279502884197169399f + +#define SafeDeleteArray(x) { if (x) { delete [] x; x = 0; } } + + +/*****************************************************************************/ + +FFT::FFT() +{ + NFREQ = 0; + + envelope = 0; + equalize = 0; + bitrevtable = 0; + cossintable = 0; + temp1 = 0; + temp2 = 0; +} + +/*****************************************************************************/ + +FFT::~FFT() +{ + CleanUp(); +} + +/*****************************************************************************/ + +void FFT::Init(int samples_in, int samples_out, int bEqualize, float envelope_power) +{ + // samples_in: # of waveform samples you'll feed into the FFT + // samples_out: # of frequency samples you want out; MUST BE A POWER OF 2. + + CleanUp(); + + m_samples_in = samples_in; + NFREQ = samples_out*2; + + InitBitRevTable(); + InitCosSinTable(); + if (envelope_power > 0) + InitEnvelopeTable(envelope_power); + if (bEqualize) + InitEqualizeTable(); + temp1 = new float[NFREQ]; + temp2 = new float[NFREQ]; +} + +/*****************************************************************************/ + +void FFT::CleanUp() +{ + SafeDeleteArray(envelope); + SafeDeleteArray(equalize); + SafeDeleteArray(bitrevtable); + SafeDeleteArray(cossintable); + SafeDeleteArray(temp1); + SafeDeleteArray(temp2); +} + +/*****************************************************************************/ + +void FFT::InitEqualizeTable() +{ + int i; + float scaling = -0.02f; + float inv_half_nfreq = 1.0f/(float)(NFREQ/2); + + equalize = new float[NFREQ/2]; + + for (i=0; i i) + { + temp = bitrevtable[i]; + bitrevtable[i] = bitrevtable[j]; + bitrevtable[j] = temp; + } + + m = NFREQ >> 1; + + while (m >= 1 && j >= m) + { + j -= m; + m >>= 1; + } + + j += m; + } +} + +/*****************************************************************************/ + +void FFT::InitCosSinTable() +{ + + int i,dftsize,tabsize; + float theta; + + dftsize = 2; + tabsize = 0; + while (dftsize <= NFREQ) + { + tabsize++; + dftsize <<= 1; + } + + cossintable = new float[tabsize][2]; + + dftsize = 2; + i = 0; + while (dftsize <= NFREQ) + { + theta = (float)(-2.0f*PI/(float)dftsize); + cossintable[i][0] = (float)cosf(theta); + cossintable[i][1] = (float)sinf(theta); + i++; + dftsize <<= 1; + } +} + +/*****************************************************************************/ + +void FFT::time_to_frequency_domain(float *in_wavedata, float *out_spectraldata) +{ + // Converts time-domain samples from in_wavedata[] + // into frequency-domain samples in out_spectraldata[]. + // The array lengths are the two parameters to Init(). + + // The last sample of the output data will represent the frequency + // that is 1/4th of the input sampling rate. For example, + // if the input wave data is sampled at 44,100 Hz, then the last + // sample of the spectral data output will represent the frequency + // 11,025 Hz. The first sample will be 0 Hz; the frequencies of + // the rest of the samples vary linearly in between. + // Note that since human hearing is limited to the range 200 - 20,000 + // Hz. 200 is a low bass hum; 20,000 is an ear-piercing high shriek. + // Each time the frequency doubles, that sounds like going up an octave. + // That means that the difference between 200 and 300 Hz is FAR more + // than the difference between 5000 and 5100, for example! + // So, when trying to analyze bass, you'll want to look at (probably) + // the 200-800 Hz range; whereas for treble, you'll want the 1,400 - + // 11,025 Hz range. + // If you want to get 3 bands, try it this way: + // a) 11,025 / 200 = 55.125 + // b) to get the number of octaves between 200 and 11,025 Hz, solve for n: + // 2^n = 55.125 + // n = log 55.125 / log 2 + // n = 5.785 + // c) so each band should represent 5.785/3 = 1.928 octaves; the ranges are: + // 1) 200 - 200*2^1.928 or 200 - 761 Hz + // 2) 200*2^1.928 - 200*2^(1.928*2) or 761 - 2897 Hz + // 3) 200*2^(1.928*2) - 200*2^(1.928*3) or 2897 - 11025 Hz + + // A simple sine-wave-based envelope is convolved with the waveform + // data before doing the FFT, to emeliorate the bad frequency response + // of a square (i.e. nonexistent) filter. + + // You might want to slightly damp (blur) the input if your signal isn't + // of a very high quality, to reduce high-frequency noise that would + // otherwise show up in the output. + + int j, m, i, dftsize, hdftsize, t; + float wr, wi, wpi, wpr, wtemp, tempr, tempi; + + if (!bitrevtable) return; + //if (!envelope) return; + //if (!equalize) return; + if (!temp1) return; + if (!temp2) return; + if (!cossintable) return; + + // 1. set up input to the fft + if (envelope) + { + for (i=0; i> 1; + + for (m = 0; m < hdftsize; m+=1) + { + for (i = m; i < NFREQ; i+=dftsize) + { + j = i + hdftsize; + tempr = wr*real[j] - wi*imag[j]; + tempi = wr*imag[j] + wi*real[j]; + real[j] = real[i] - tempr; + imag[j] = imag[i] - tempi; + real[i] += tempr; + imag[i] += tempi; + } + + wr = (wtemp=wr)*wpr - wi*wpi; + wi = wi*wpr + wtemp*wpi; + } + + dftsize <<= 1; + t++; + } + + // 3. take the magnitude & equalize it (on a log10 scale) for output + if (equalize) + for (i=0; i. + * + */ + +#include "Mesh.h" +#include +#include + +using namespace std; + +Mesh::Mesh() +{ + m_iRefCount = 1; + m_pMesh = NULL; +} + +Mesh::~Mesh() +{ + if ( m_pMesh ) + { + m_pMesh->Release(); + m_pMesh = NULL; + } +} + +//-------------------- +// reference counting +//-------------------- + +void Mesh::AddRef() +{ + m_iRefCount++; +} + +void Mesh::Release() +{ + if ( --m_iRefCount == 0 ) + delete this; +} + +void Mesh::CreateTextMesh( string& InString, bool bCentered ) +{ + if ( m_pMesh ) + { + m_pMesh->Release(); + } + + m_pMesh = Renderer::CreateD3DXTextMesh( InString.c_str(), bCentered ); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Mesh.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Mesh.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Mesh.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Mesh.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,49 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _MESH_H_ +#define _MESH_H_ + +#include "Renderer.h" +#include + +class Mesh +{ +public: + Mesh(); + void CreateTextMesh( std::string& InString, bool bCentered = true ); + + void AddRef(); + void Release(); + LPD3DXMESH GetMesh() { return m_pMesh; }; +protected: + ~Mesh(); + int m_iRefCount; + + LPD3DXMESH m_pMesh; + +}; + +inline Mesh* Mesh_Factory() +{ + // The class constructor is initializing the reference counter to 1 + return new Mesh(); +} + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Preset.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Preset.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Preset.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Preset.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,168 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "Preset.h" +#include +#include +#include "DebugConsole.h" +#include "angelscript.h" + +const char * constants = +"const int PRIM_POINTLIST = 1;" +"const int PRIM_LINELIST = 2;" +"const int PRIM_LINESTRIP = 3;" +"const int PRIM_TRIANGLELIST = 4;" +"const int PRIM_TRIANGLESTRIP = 5;" +"const int PRIM_TRIANGLEFAN = 6;" +"const int PRIM_LINELOOP = 7;" +"const int PRIM_QUADLIST = 8;" +"const int PRIM_QUADSTRIP = 9;" +"const int TEXTURE_FRAMEBUFFER = 1;" +"const int TEXTURE_NEXTPRESET = 2;" +"const int TEXTURE_CURRPRESET = 3;" +"const int TEXTURE_ALBUMART = 4;" +"const int NULL = 0;" +"const int BLEND_OFF = 0;" +"const int BLEND_ADD = 1;" +"const int BLEND_MOD = 2;" +"const int BLEND_MAX = 3;" +"const int FILLMODE_SOLID = 0;" +"const int FILLMODE_WIREFRAME = 1;"; + +//-- Init --------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Preset::Init( asIScriptEngine* pScriptEngine, char* pModuleName ) +{ + m_pScriptEngine = pScriptEngine; + m_moduleName[ 0 ] = 0; + strncpy_s( m_moduleName, 32, pModuleName, 31 ); + m_moduleName[ 31 ] = 0; + m_bValid = false; + +} // Init + +//-- End -------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Preset::End() +{ + if ( m_bValid ) + { + m_pContext->Release(); + m_pScriptEngine->DiscardModule( m_moduleName ); + } + + m_bValid = false; + +} // End + +//-- Begin -------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool Preset::Begin( char* pFilename ) +{ + int r; + char* pScript; + FILE* iS; + + m_bValid = false; + + DebugConsole::Log("INFO: Loading preset %s\n", pFilename ); + + //------------------------------------------------------------------------- + // Load script + iS = fopen( pFilename, "rb" ); + if ( iS == NULL ) + { + DebugConsole::Error( "ERROR: Unable to open preset %s\n", pFilename ); + return false; + } + + fseek(iS, 0, SEEK_END); + int length = ftell(iS); + fseek(iS, 0, SEEK_SET); + pScript = new char[length]; + length = fread(pScript, 1, length, iS); + fclose(iS); + + //------------------------------------------------------------------------- + // Compile script + m_pModule = m_pScriptEngine->GetModule( m_moduleName, asGM_CREATE_IF_NOT_EXISTS ); + m_pModule->AddScriptSection("constants", constants, strlen(constants), 0); + m_pModule->AddScriptSection(m_moduleName, pScript, length, 0); + + r = m_pModule->Build(); + delete[] pScript; + if (r < 0) + { + m_pScriptEngine->DiscardModule(m_moduleName); + DebugConsole::Error("ERROR: Failed to compile Preset %s\n", pFilename); + return false; + } + + //------------------------------------------------------------------------- + // Create script context + m_pContext = m_pScriptEngine->CreateContext(); + if (m_pContext == 0) + { + // Failed to create context + m_pContext = 0; + m_pScriptEngine->DiscardModule(m_moduleName); + DebugConsole::Error("ERROR: Failed to create script context\n"); + return false; + } + + //------------------------------------------------------------------------- + // Get render function Id + m_iRenderFuncId = m_pModule->GetFunctionIdByName("Render"); + + //------------------------------------------------------------------------- + // Execute Init function if there is one + int initFuncId = m_pModule->GetFunctionIdByName("Init"); + if (initFuncId >= 0) + { + if (m_pContext->Prepare(initFuncId) == 0) + { + m_pContext->Execute(); + } + } + + m_bValid = true; + return true; + +} // Begin + +//-- Render ------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Preset::Render() +{ + if (!m_bValid) + return; + + if (m_iRenderFuncId < 0) + return; + + if (m_pContext->Prepare(m_iRenderFuncId) == 0) + { + m_pContext->Execute(); + } + +} // Render diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Preset.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Preset.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Preset.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Preset.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,46 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _PRESET_H_ + +class asIScriptEngine; +class asIScriptContext; +class asIScriptModule; + +class Preset +{ +public: + void Init( asIScriptEngine* pScriptEngine, char* pModuleName ); + bool Begin( char* pFilename ); + void Render(); + void End(); + bool IsValid() { return m_bValid; } + + int m_presetId; + +private: + bool m_bValid; + char m_moduleName[32]; + int m_iRenderFuncId; + asIScriptEngine* m_pScriptEngine; + asIScriptModule* m_pModule; + asIScriptContext* m_pContext; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1637 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "Renderer.h" +#include +#include "DebugConsole.h" +#include +#include "Shader.h" + +D3DVERTEXELEMENT9 declPosNormalColUV[] = +{ // stream, offset, type, method, usage, usage index + { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, +// { 0, 24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, + { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, 32, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, + D3DDECL_END() +}; + +D3DVERTEXELEMENT9 declPosColUV[] = +{ // stream, offset, type, method, usage, usage index + { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, +// { 0, 24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, + { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, 32, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, + D3DDECL_END() +}; + +D3DVERTEXELEMENT9 declPosNormal[] = +{ // stream, offset, type, method, usage, usage index + { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, + D3DDECL_END() +}; + + + +LPDIRECT3DVERTEXDECLARATION9 g_pPosNormalColUVDeclaration = NULL; +LPDIRECT3DVERTEXDECLARATION9 g_pPosColUVDeclaration = NULL; +LPDIRECT3DVERTEXDECLARATION9 g_pPosNormalDeclaration = NULL; + +namespace +{ + LPDIRECT3DVERTEXBUFFER9 g_pCubeVbuffer = NULL; + LPDIRECT3DINDEXBUFFER9 g_pCubeIbuffer = NULL; + LPDIRECT3DDEVICE9 m_pD3DDevice = NULL; + IDirect3DSurface9* g_backBuffer; + IDirect3DSurface9* g_depthBuffer; + IDirect3DSurface9* g_oldDepthBuffer; + LPDIRECT3DTEXTURE9 m_pTextureFont = NULL; + D3DVIEWPORT9 g_viewport; + D3DXMATRIX g_matProj; + D3DXMATRIX g_matView; + float g_aspect; + float g_defaultAspect; + float g_aspectValue; + float g_tex0U; + float g_tex0V; + DWORD g_colour; + D3DXVECTOR4 g_fColour; + D3DXVECTOR3 g_normal; + ID3DXMatrixStack* g_matrixStack; + int g_matrixStackLevel; + bool g_envMapSet; + bool g_textureSet; + + D3DPRIMITIVETYPE g_primType; + + LPDIRECT3DTEXTURE9 g_scratchTexture; + HFONT g_hFont; + + // Vertices +#define MAX_VERTICES (65535) + + PosColNormalUVVertex g_vertices[ MAX_VERTICES ]; + int g_currentVertex; + + enum ETextureStageMode + { + TSM_COLOUR = 0, + TSM_TEXTURE = 1, + TSM_INVALID = -1 + }; + ETextureStageMode CurrentTextureStageMode = TSM_INVALID; +} + +void Renderer::Init( LPDIRECT3DDEVICE9 pD3DDevice, int iXPos, int iYPos, int iWidth, int iHeight, float fPixelRatio ) +{ + DebugConsole::Log("Renderer: Viewport x%d, y%d, w%d, h%d, pixel%f\n", iXPos, iYPos, iWidth, iHeight, fPixelRatio ); + m_pD3DDevice = pD3DDevice; + g_viewport.X = iXPos; + g_viewport.Y = iYPos; + g_viewport.Width = iWidth; + g_viewport.Height = iHeight; + g_viewport.MinZ = 0; + g_viewport.MaxZ = 1; + + g_defaultAspect = ((float)iWidth / iHeight) * fPixelRatio; + + m_pD3DDevice->CreateDepthStencilSurface(1024, 1024, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, TRUE, &g_depthBuffer, NULL); +/* + if (D3D_OK != m_pD3DDevice->GetDepthStencilSurface(&g_oldDepthBuffer)) + { + DebugConsole::Log("Renderer: No default depth buffer\n", iXPos, iYPos, iWidth, iHeight, fPixelRatio ); + //OutputDebugString("Vortex INFO: Renderer::Init - Failed to Get old depth stencil\n"); + // Create our own +// D3DSURFACE_DESC desc; +// g_backBuffer->GetDesc(&desc); +// g_device->CreateDepthStencilSurface(desc.Width, desc.Height, D3DFMT_LIN_D24S8, 0, &g_oldDepthBuffer); +// g_ownDepth = true; + } + else + { +// g_ownDepth = false; + } +*/ + { + char fullname[512]; + sprintf_s(fullname, 512, "%sfont.bmp", g_TexturePath ); + m_pTextureFont = LoadTexture( fullname, false ); + } + + D3DXCreateMatrixStack(0, &g_matrixStack); + g_matrixStackLevel = 0; + + g_scratchTexture = CreateTexture( 512, 512 ); + + CompileShaders(); + + CreateCubeBuffers(); + + CreateFonts(); +} + +void Renderer::CreateFonts() +{ + HDC hdc = CreateCompatibleDC( NULL ); + if( hdc == NULL ) + return; + + INT nHeight = -MulDiv( 12, GetDeviceCaps( hdc, LOGPIXELSY ), 72 ); + DeleteDC( hdc ); + + BOOL bBold = FALSE; + BOOL bItalic = FALSE; + + g_hFont = CreateFontA( nHeight, 0, 0, 0, bBold ? FW_BOLD : FW_NORMAL, bItalic, FALSE, FALSE, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, + "Arial" ); +} + +LPD3DXMESH Renderer::CreateD3DXTextMesh( const char* pString, bool bCentered ) +{ + HRESULT hr; + LPD3DXMESH pMeshNew = NULL; + + HDC hdc = CreateCompatibleDC( NULL ); + if( hdc == NULL ) + return NULL; + + HFONT newfont=CreateFont(10, //Height + 0, //Width + 0, //Escapement + 0, //Orientation + FW_NORMAL, //Weight + false, //Italic + false, //Underline + false, //Strikeout + DEFAULT_CHARSET,//Charset + OUT_DEFAULT_PRECIS, //Output Precision + CLIP_DEFAULT_PRECIS, //Clipping Precision + DEFAULT_QUALITY, //Quality + DEFAULT_PITCH|FF_DONTCARE, //Pitch and Family + "Arial"); + + + + HFONT hFontOld; + hFontOld = ( HFONT )SelectObject( hdc, newfont ); + hr = D3DXCreateText( m_pD3DDevice, hdc, pString, 0.001f, 0.2f, &pMeshNew, NULL, NULL ); + SelectObject( hdc, hFontOld ); + DeleteDC( hdc ); + + if( SUCCEEDED( hr ) ) + { + if( bCentered ) + { + // Center text + D3DXVECTOR3 vMin, vMax; + + PosNormalVertex* pVertices; + pMeshNew->LockVertexBuffer( 0, reinterpret_cast(&pVertices)); + D3DXComputeBoundingBox( (D3DXVECTOR3*)pVertices, pMeshNew->GetNumVertices(), sizeof ( PosNormalVertex ), &vMin, &vMax ); + + D3DXVECTOR3 vOffset; + D3DXVec3Subtract( &vOffset, &vMax, &vMin ); + D3DXVec3Scale( &vOffset, &vOffset, 0.5f ); + for ( unsigned int i = 0; i < pMeshNew->GetNumVertices(); i++) + { + D3DXVec3Subtract( &pVertices[i].Coord, &pVertices[i].Coord, &vOffset ); + } + pMeshNew->UnlockVertexBuffer(); + } + } + + return pMeshNew; +} + +void Renderer::DrawMesh( LPD3DXMESH pMesh ) +{ + if ( pMesh == NULL ) + { + return; + } + + UVNormalEnvVertexShader* pShader = &UVNormalEnvVertexShader::StaticType; + CommitTransforms( pShader ); + CommitTextureState(); + m_pD3DDevice->SetVertexShader( pShader->GetVertexShader() ); + m_pD3DDevice->SetVertexDeclaration( g_pPosNormalDeclaration ); + + pMesh->DrawSubset( 0 ); +} + +void Renderer::CreateCubeBuffers() +{ + m_pD3DDevice->CreateVertexBuffer( 24 * sizeof( PosColNormalUVVertex ), + D3DUSAGE_WRITEONLY, + 0, + D3DPOOL_DEFAULT, + &g_pCubeVbuffer, + NULL ); + + m_pD3DDevice->CreateIndexBuffer( 36 * sizeof( short ), + D3DUSAGE_WRITEONLY, + D3DFMT_INDEX16, + D3DPOOL_DEFAULT, + &g_pCubeIbuffer, + NULL ); + + + PosColNormalUVVertex* v; + g_pCubeVbuffer->Lock( 0, 0, (void**)&v, 0 ); + + short* indices; + g_pCubeIbuffer->Lock( 0, 0, (void**)&indices, 0 ); + + float nx = -1.0f; + float ny = -1.0f; + float nz = -1.0f; + float x = 1.0f; + float y = 1.0f; + float z = 1.0f; + + g_colour = 0xfffffff; + g_fColour = D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f); + + // Front Face + v[0].Coord = D3DXVECTOR3(nx, y, nz); +// v[0].Diffuse = g_colour; + v[0].FDiffuse = g_fColour; + v[0].Normal = D3DXVECTOR3(0, 0, -1); + v[0].u = 0; + v[0].v = 0; + v[1].Coord = D3DXVECTOR3(x, y, nz); +// v[1].Diffuse = g_colour; + v[1].FDiffuse = g_fColour; + v[1].Normal = D3DXVECTOR3(0, 0, -1); + v[1].u = 1; + v[1].v = 0; + v[2].Coord = D3DXVECTOR3(x, ny, nz); +// v[2].Diffuse = g_colour; + v[2].FDiffuse = g_fColour; + v[2].Normal = D3DXVECTOR3(0, 0, -1); + v[2].u = 1; + v[2].v = 1; + v[3].Coord = D3DXVECTOR3(nx, ny, nz); +// v[3].Diffuse = g_colour; + v[3].FDiffuse = g_fColour; + v[3].Normal = D3DXVECTOR3(0, 0, -1); + v[3].u = 0; + v[3].v = 1; + + *indices++ = 0; + *indices++ = 1; + *indices++ = 2; + *indices++ = 0; + *indices++ = 2; + *indices++ = 3; + + // Back Face + v[4].Coord = D3DXVECTOR3(x, y, z); +// v[4].Diffuse = g_colour; + v[4].FDiffuse = g_fColour; + v[4].Normal = D3DXVECTOR3(0, 0, 1); + v[4].u = 0; + v[4].v = 0; + v[5].Coord = D3DXVECTOR3(nx, y, z); +// v[5].Diffuse = g_colour; + v[5].FDiffuse = g_fColour; + v[5].Normal = D3DXVECTOR3(0, 0, 1); + v[5].u = 1; + v[5].v = 0; + v[6].Coord = D3DXVECTOR3(nx, ny, z); +// v[6].Diffuse = g_colour; + v[6].FDiffuse = g_fColour; + v[6].Normal = D3DXVECTOR3(0, 0, 1); + v[6].u = 1; + v[6].v = 1; + v[7].Coord = D3DXVECTOR3(x, ny, z); +// v[7].Diffuse = g_colour; + v[7].FDiffuse = g_fColour; + v[7].Normal = D3DXVECTOR3(0, 0, 1); + v[7].u = 0; + v[7].v = 1; + + *indices++ = 4; + *indices++ = 5; + *indices++ = 6; + *indices++ = 4; + *indices++ = 6; + *indices++ = 7; + + // Top Face + v[8].Coord = D3DXVECTOR3(nx, y, z); +// v[8].Diffuse = g_colour; + v[8].FDiffuse = g_fColour; + v[8].Normal = D3DXVECTOR3(0, 1, 0); + v[8].u = 0; + v[8].v = 0; + v[9].Coord = D3DXVECTOR3(x, y, z); +// v[9].Diffuse = g_colour; + v[9].FDiffuse = g_fColour; + v[9].Normal = D3DXVECTOR3(0, 1, 0); + v[9].u = 1; + v[9].v = 0; + v[10].Coord = D3DXVECTOR3(x, y, nz); +// v[10].Diffuse = g_colour; + v[10].FDiffuse = g_fColour; + v[10].Normal = D3DXVECTOR3(0, 1, 0); + v[10].u = 1; + v[10].v = 1; + v[11].Coord = D3DXVECTOR3(nx, y, nz); +// v[11].Diffuse = g_colour; + v[11].FDiffuse = g_fColour; + v[11].Normal = D3DXVECTOR3(0, 1, 0); + v[11].u = 0; + v[11].v = 1; + + *indices++ = 8; + *indices++ = 9; + *indices++ = 10; + *indices++ = 8; + *indices++ = 10; + *indices++ = 11; + + // Bottom Face + v[12].Coord = D3DXVECTOR3(nx, ny, nz); +// v[12].Diffuse = g_colour; + v[12].FDiffuse = g_fColour; + v[12].Normal = D3DXVECTOR3(0, -1, 0); + v[12].u = 0; + v[12].v = 0; + v[13].Coord = D3DXVECTOR3(x, ny, nz); +// v[13].Diffuse = g_colour; + v[13].FDiffuse = g_fColour; + v[13].Normal = D3DXVECTOR3(0, -1, 0); + v[13].u = 1; + v[13].v = 0; + v[14].Coord = D3DXVECTOR3(x, ny, z); +// v[14].Diffuse = g_colour; + v[14].FDiffuse = g_fColour; + v[14].Normal = D3DXVECTOR3(0, -1, 0); + v[14].u = 1; + v[14].v = 1; + v[15].Coord = D3DXVECTOR3(nx, ny, z); +// v[15].Diffuse = g_colour; + v[15].FDiffuse = g_fColour; + v[15].Normal = D3DXVECTOR3(0, -1, 0); + v[15].u = 0; + v[15].v = 1; + + *indices++ = 12; + *indices++ = 13; + *indices++ = 14; + *indices++ = 12; + *indices++ = 14; + *indices++ = 15; + + // Left Face + v[16].Coord = D3DXVECTOR3(nx, y, z); +// v[16].Diffuse = g_colour; + v[16].FDiffuse = g_fColour; + v[16].Normal = D3DXVECTOR3(-1, 0, 0); + v[16].u = 0; + v[16].v = 0; + v[17].Coord = D3DXVECTOR3(nx, y, nz); +// v[17].Diffuse = g_colour; + v[17].FDiffuse = g_fColour; + v[17].Normal = D3DXVECTOR3(-1, 0, 0); + v[17].u = 1; + v[17].v = 0; + v[18].Coord = D3DXVECTOR3(nx, ny, nz); +// v[18].Diffuse = g_colour; + v[18].FDiffuse = g_fColour; + v[18].Normal = D3DXVECTOR3(-1, 0, 0); + v[18].u = 1; + v[18].v = 1; + v[19].Coord = D3DXVECTOR3(nx, ny, z); +// v[19].Diffuse = g_colour; + v[19].FDiffuse = g_fColour; + v[19].Normal = D3DXVECTOR3(-1, 0, 0); + v[19].u = 0; + v[19].v = 1; + + *indices++ = 16; + *indices++ = 17; + *indices++ = 18; + *indices++ = 16; + *indices++ = 18; + *indices++ = 19; + + // Right Face + v[20].Coord = D3DXVECTOR3(x, y, nz); +// v[20].Diffuse = g_colour; + v[20].FDiffuse = g_fColour; + v[20].Normal = D3DXVECTOR3(1, 0, 0); + v[20].u = 0; + v[20].v = 0; + v[21].Coord = D3DXVECTOR3(x, y, z); +// v[21].Diffuse = g_colour; + v[21].FDiffuse = g_fColour; + v[21].Normal = D3DXVECTOR3(1, 0, 0); + v[21].u = 1; + v[21].v = 0; + v[22].Coord = D3DXVECTOR3(x, ny, z); +// v[22].Diffuse = g_colour; + v[22].FDiffuse = g_fColour; + v[22].Normal = D3DXVECTOR3(1, 0, 0); + v[22].u = 1; + v[22].v = 1; + v[23].Coord = D3DXVECTOR3(x, ny, nz); +// v[23].Diffuse = g_colour; + v[23].FDiffuse = g_fColour; + v[23].Normal = D3DXVECTOR3(1, 0, 0); + v[23].u = 0; + v[23].v = 1; + + *indices++ = 20; + *indices++ = 21; + *indices++ = 22; + *indices++ = 20; + *indices++ = 22; + *indices++ = 23; + + g_pCubeVbuffer->Unlock(); + g_pCubeIbuffer->Unlock(); + +} + +void Renderer::Exit() +{ + DeleteObject( g_hFont ); + + if ( m_pD3DDevice ) + { + m_pD3DDevice->SetPixelShader( NULL ); + m_pD3DDevice->SetVertexShader( NULL ); + } + + if ( g_pPosNormalColUVDeclaration ) + g_pPosNormalColUVDeclaration->Release(); + + if ( g_pPosColUVDeclaration ) + g_pPosColUVDeclaration->Release(); + + if ( g_pPosNormalDeclaration ) + g_pPosNormalDeclaration->Release(); + + Shader::ReleaseAllShaders(); + + if ( g_pCubeIbuffer ) + g_pCubeIbuffer->Release(); + if ( g_pCubeVbuffer ) + g_pCubeVbuffer->Release(); + +// if ( g_backBuffer ) +// g_backBuffer->Release(); + +// if ( g_oldDepthBuffer ) +// g_oldDepthBuffer->Release(); + + if ( g_matrixStack ) + g_matrixStack->Release(); + + if ( g_scratchTexture ) + { + g_scratchTexture->Release(); + g_scratchTexture = NULL; + } + + if ( m_pTextureFont ) + { + m_pTextureFont->Release(); + m_pTextureFont = NULL; + } + + if ( g_depthBuffer ) + g_depthBuffer->Release(); +} + +//-- SetDrawMode2d ------------------------------------------------------------ +// +//----------------------------------------------------------------------------- +void Renderer::SetDrawMode2d() +{ + D3DXMATRIX Ortho2D; + D3DXMatrixOrthoLH(&Ortho2D, 2.0f, -2.0f, 0.0f, 1.0f); + m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE); + Renderer::SetProjection( Ortho2D ); + +} // SetDrawMode2d + +//-- SetDrawMode3d ------------------------------------------------------------ +// +//----------------------------------------------------------------------------- +void Renderer::SetDrawMode3d() +{ + D3DXMATRIX matProj; + D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, g_aspect, 0.25f, 2000.0f ); + Renderer::SetProjection(matProj); + m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); + +} // SetDrawMode3d + +void Renderer::Clear( DWORD Col ) +{ + Col |= 0xff000000; + m_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, Col, 1.0f, 0 ); +} + +void Renderer::ClearDepth() +{ + m_pD3DDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER, 0, 1.0f, 0 ); +} + +void Renderer::Rect( float x1, float y1, float x2, float y2, DWORD Col ) +{ + unsigned char* pCol = (unsigned char*)&Col; + D3DXVECTOR4 FColour(pCol[2],pCol[1], pCol[0], pCol[3] ); + + PosColNormalUVVertex v[4]; + + v[0].Coord.x = x1; + v[0].Coord.y = y1; + v[0].Coord.z = 0.0f; +// v[0].Diffuse = Col; + v[0].FDiffuse = FColour; + + v[1].Coord.x = x2; + v[1].Coord.y = y1; + v[1].Coord.z = 0.0f; +// v[1].Diffuse = Col; + v[1].FDiffuse = FColour; + + v[2].Coord.x = x2; + v[2].Coord.y = y2; + v[2].Coord.z = 0.0f; +// v[2].Diffuse = Col; + v[2].FDiffuse = FColour; + + v[3].Coord.x = x1; + v[3].Coord.y = y2; + v[3].Coord.z = 0.0f; +// v[3].Diffuse = Col; + v[3].FDiffuse = FColour; + + m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, &v, sizeof(PosColNormalUVVertex)); + +} // Rect + +void Renderer::Line( float x1, float y1, float x2, float y2, DWORD Col ) +{ + // TODO +/* PosColNormalUVVertex v[2]; + + v[0].Coord.x = x1; + v[0].Coord.y = y1; + v[0].Coord.z = 0.0f; + v[0].Diffuse = Col; + + v[1].Coord.x = x2; + v[1].Coord.y = y2; + v[1].Coord.z = 0.0f; + v[1].Diffuse = Col; + + m_pD3DDevice->DrawPrimitiveUP(D3DPT_LINELIST, 1, &v, sizeof(PosColNormalUVVertex)); +*/ +} // Line + +void Renderer::Point( float x, float y, DWORD Col ) +{ +/* + PosColNormalUVVertex v[2]; + + v[0].Coord.x = x; + v[0].Coord.y = y; + v[0].Coord.z = 0.0f; + v[0].Diffuse = Col; + + m_pD3DDevice->DrawPrimitiveUP(D3DPT_POINTLIST, 1, &v, sizeof(PosColNormalUVVertex)); +*/ +} // Point + +LPDIRECT3DTEXTURE9 Renderer::CreateTexture( int iWidth, int iHeight, D3DFORMAT Format /* = D3DFMT_X8R8G8B8 */, bool bDynamic /* = false */ ) +{ + LPDIRECT3DTEXTURE9 pTexture; +// IDirect3DSurface9* pSurface; +// D3DLOCKED_RECT lock; + + if ( bDynamic == false ) + { + m_pD3DDevice->CreateTexture( iWidth, iHeight, 1, D3DUSAGE_RENDERTARGET, Format, D3DPOOL_DEFAULT, &pTexture, NULL ); + } + else + { + m_pD3DDevice->CreateTexture( iWidth, iHeight, 1, D3DUSAGE_DYNAMIC, Format, D3DPOOL_DEFAULT, &pTexture, NULL ); + } + + if ( pTexture == NULL ) + { + DebugConsole::Log("Renderer: Failed to create texture, Width:%d, Height:%d\n", iWidth, iHeight); + return NULL; + } + + // TODO: Clear target + +// pTexture->GetSurfaceLevel( 0, &pSurface ); +// pSurface->LockRect( &lock, NULL, 0 ); +// int iTexSize = ( iWidth * iHeight * 4 ); +// memset( lock.pBits, 0, iTexSize ); +// pSurface->UnlockRect(); +// pSurface->Release(); + return pTexture; +} + +LPDIRECT3DTEXTURE9 Renderer::LoadTexture( char* pFilename, bool bAutoResize ) +{ + LPDIRECT3DTEXTURE9 pTexture = NULL; + + FILE* iS; + iS = fopen( pFilename, "rb" ); + if ( iS != NULL ) + { + fseek( iS, 0, SEEK_END ); + int iLength = ftell( iS ); + fseek( iS, 0, SEEK_SET ); + BYTE* pTextureInMem = new BYTE[ iLength ]; + int iReadLength = fread( pTextureInMem, 1, iLength, iS ); + fclose( iS ); + + D3DXCreateTextureFromFileInMemoryEx(m_pD3DDevice, // device + pTextureInMem, // SrcData + iReadLength, // SrcDataSize + 0, // Width + 0, // Height + 1, // MipLevels + 0, // Usage + D3DFMT_UNKNOWN, // Format + D3DPOOL_DEFAULT, // Pool + bAutoResize ? D3DX_FILTER_POINT : D3DX_FILTER_NONE, // Filter + D3DX_FILTER_NONE, // MipFilter + 0x00000000, // ColorKey + NULL, // SrcInfo + NULL, // Palette + &pTexture ); // DestTexture + + delete[] pTextureInMem; + } + + if ( pTexture == NULL ) + { + DebugConsole::Log( "Renderer: Failed to load texture: %s\n", pFilename ); + } + + return pTexture; +} + +void Renderer::ReleaseTexture( LPDIRECT3DTEXTURE9 pTexture ) +{ + if ( pTexture ) + { + pTexture->Release(); + } +} + +void Renderer::DrawText( float x, float y, char* txt, DWORD Col ) +{ + unsigned char* pCol = (unsigned char*)&Col; + D3DXVECTOR4 FColour(pCol[2],pCol[1], pCol[0], pCol[3] ); +// D3DXVECTOR4 FColour(1,1, 0, 1 ); + + SetTexture( m_pTextureFont ); + DiffuseUVVertexShader* pShader = &DiffuseUVVertexShader::StaticType; + CommitTransforms( pShader ); + CommitTextureState(); + m_pD3DDevice->SetVertexShader( pShader->GetVertexShader() ); + m_pD3DDevice->SetVertexDeclaration( g_pPosColUVDeclaration ); + + x = ( x / g_viewport.Width ) * 2 - 1; + y = ( y / g_viewport.Height ) * 2 -1; + + PosColNormalUVVertex v[4]; + unsigned char ch; + while (txt[0] != 0) + { + ch = txt[0]; + if (ch < 32) + ch = 32; + + ch = ch - 32; + + float sizeX = 9.0f / 256.0f; + float sizeY = 16.0f / 256.0f; + + float cx = (((ch % 16) * 9.0f) / 256.0f) + 0.5f / 256.0f; + float cy = (((ch / 16) * 16.0f) / 256.0f) + 0.5f / 256.0f; + + v[0].Coord.x = x; + v[0].Coord.y = y; + v[0].Coord.z = 0.0f; + v[0].u = cx; + v[0].v = cy; +// v[0].Diffuse = Col; + v[0].FDiffuse = FColour; + + v[1].Coord.x = x + 9.0f / (g_viewport.Width * 0.5f); + v[1].Coord.y = y; + v[1].Coord.z = 0.0f; + v[1].u = cx + sizeX; + v[1].v = cy; +// v[1].Diffuse = Col; + v[1].FDiffuse = FColour; + + v[2].Coord.x = x + 9.0f / (g_viewport.Width * 0.5f); + v[2].Coord.y = y + 14.0f / (g_viewport.Height * 0.5f); + v[2].Coord.z = 0.0f; + v[2].u = cx + sizeX; + v[2].v = cy + sizeY; +// v[2].Diffuse = Col; + v[2].FDiffuse = FColour; + + v[3].Coord.x = x; + v[3].Coord.y = y + 14.0f / (g_viewport.Height * 0.5f); + v[3].Coord.z = 0.0f; + v[3].u = cx; + v[3].v = cy + sizeY; +// v[3].Diffuse = Col; + v[3].FDiffuse = FColour; + + m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, &v, sizeof(PosColNormalUVVertex)); + + x += 9.0f / (g_viewport.Width * 0.5f); + txt++; + } +} + +int Renderer::GetViewportHeight() +{ + return g_viewport.Height; +} + +int Renderer::GetViewportWidth() +{ + return g_viewport.Width; +} + +//-- SetAspect ---------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::SetAspect(float aspect) +{ + D3DXMATRIX matProj; + + aspect = min(aspect, 1); + aspect = max(aspect, 0); + g_aspectValue = aspect; + // g_aspect = 1.0f + aspect * ((4.0f / 3.0f) - 1.0f); + g_aspect = 1.0f + aspect * ((g_defaultAspect) - 1.0f); + + D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, g_aspect, 0.25f, 2000.0f ); + // D3DXMatrixPerspectiveFovLH( &matProj, D3DXToRadian(60), g_aspect, 0.25f, 2000.0f ); + Renderer::SetProjection(matProj); + +} // SetAspect + +//-- LookAt ------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::LookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) +{ + D3DXVECTOR3 eye(eyeX, eyeY, eyeZ); + D3DXVECTOR3 center(centerX, centerY, centerZ); + D3DXVECTOR3 up(upX, upY, upZ); + D3DXMATRIX matOut; + D3DXMatrixLookAtLH(&matOut, &eye, ¢er, &up); + g_matrixStack->MultMatrix(&matOut); + +} // LookAt + + +//-- SetDefaults -------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::SetDefaults() +{ + for (;g_matrixStackLevel > 0; g_matrixStackLevel--) + { + g_matrixStack->Pop(); + } + + g_matrixStack->LoadIdentity(); + + // Renderstates + m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); + // d3dSetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + m_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); + m_pD3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); + m_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); + m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + m_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); + m_pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); + m_pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0); + m_pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); + + m_pD3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE); + + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + + for (int i = 0; i < 4; i++) + { + m_pD3DDevice->SetSamplerState( i, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); + m_pD3DDevice->SetSamplerState( i, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); + m_pD3DDevice->SetSamplerState( i, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + m_pD3DDevice->SetSamplerState( i, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + m_pD3DDevice->SetTexture(i, NULL); + } + + CurrentTextureStageMode = TSM_TEXTURE; + g_envMapSet = false; + g_textureSet = false; + + // Globals + g_colour = 0xffffffff; + g_fColour = D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f); + g_aspect = g_defaultAspect; + g_aspectValue = 1.0f; + + SetDrawMode3d(); + D3DXMATRIX matView; + D3DXMatrixIdentity( &matView ); + SetView( matView ); + + SetBlendMode( BLEND_OFF ); + +// m_pD3DDevice->SetVertexDeclaration( g_pVertexDeclaration ); + +} // SetDefaults + +//-- SetProjection ------------------------------------------------------------ +// +//----------------------------------------------------------------------------- +void Renderer::SetProjection(D3DXMATRIX& matProj) +{ + g_matProj = matProj; + +} // SetProjection + +void Renderer::GetProjection(D3DXMATRIX& matProj) +{ + matProj = g_matProj; + +} // SetProjection + +//-- SetView ------------------------------------------------------------------ +// +//----------------------------------------------------------------------------- +void Renderer::SetView(D3DXMATRIX& matView) +{ + g_matView = matView; + +} // SetView + +//-- Translate ---------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::Translate(float x, float y, float z) +{ + g_matrixStack->TranslateLocal(x, y, z); + +} // Translate + +//-- Scale -------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::Scale(float x, float y, float z) +{ + g_matrixStack->ScaleLocal(x, y, z); + +} // Scale + +//-- CommitTransforms --------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::CommitTransforms( DiffuseUVVertexShader* pShader ) +{ + D3DXMATRIX worldView, worldViewProjection; + D3DXMATRIX* worldMat = g_matrixStack->GetTop(); + D3DXMatrixMultiply( &worldView, worldMat, &g_matView); + D3DXMatrixMultiply( &worldViewProjection, &worldView, &g_matProj ); + + D3DXMatrixTranspose( &worldViewProjection, &worldViewProjection ); + D3DXMatrixTranspose( &worldView, &worldView ); + + pShader->SetWV( &worldView ); + pShader->SetWVP( &worldViewProjection ); +} + +//-- CommitTextureState ------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::CommitTextureState() +{ + if ( ( g_textureSet || g_envMapSet ) && CurrentTextureStageMode != TSM_TEXTURE ) + { + CurrentTextureStageMode = TSM_TEXTURE; + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + } + else if ( !g_textureSet && !g_envMapSet && CurrentTextureStageMode != TSM_COLOUR ) + { + CurrentTextureStageMode = TSM_COLOUR; + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE ); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); + } +} + +//-- SetBlendMode ------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::SetBlendMode(eBlendMode blendMode) +{ + switch (blendMode) + { + case BLEND_OFF: + { + m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + m_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); + break; + } + case BLEND_ADD: + { + m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + m_pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); + m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + m_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); + break; + } + case BLEND_MOD: + { + m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + m_pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); + m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + m_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); + break; + } + case BLEND_MAX: + { + m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + m_pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_MAX); + m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + m_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); + break; + } + default: + { + m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + break; + } + } + +} // SetBlendMode + +//-- NumPrimsFromType --------------------------------------------------------- +// +//----------------------------------------------------------------------------- +int NumPrimsFromType(D3DPRIMITIVETYPE primType, int numVerts) +{ + switch (primType) + { + case D3DPT_POINTLIST: + return numVerts; + case D3DPT_LINELIST: + { + if (numVerts == 1) + return -1; + if (numVerts & 0x1) + return -1; + + return numVerts / 2; + } + case D3DPT_LINESTRIP: + { + if (numVerts & 0x1) + return -1; + + return numVerts - 1; + } + case D3DPT_TRIANGLELIST: + { + if (numVerts < 3) + return -1; + if (numVerts % 3 != 0) + return -1; + return numVerts / 3; + } + case D3DPT_TRIANGLESTRIP: + case D3DPT_TRIANGLEFAN: + { + if (numVerts < 3) + return -1; + return numVerts - 2; + } + case 8: // QUADLIST + { + if (numVerts < 4) + return -1; + if (numVerts % 4 != 0) + return -1; + return numVerts / 4; + } + case 9: // QUADSTRIP + { + if (numVerts < 4) + return -1; + if ((numVerts & 0x1) != 0) + return -1; + return numVerts / 2 - 1; + + } + default: + return -1; + } + +} // NumPrimsFromType + + +//-- Begin -------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::Begin(D3DPRIMITIVETYPE primType) +{ + g_primType = primType; + g_currentVertex = 0; + +} // Begin + +//-- End ---------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::End() +{ + int primCount = NumPrimsFromType(g_primType, g_currentVertex); + if ( primCount == -1 ) + return; + + DiffuseUVVertexShader* pShader = NULL; + if ( g_envMapSet ) + { + pShader = &DiffuseUVEnvVertexShader::StaticType; + m_pD3DDevice->SetVertexDeclaration( g_pPosNormalColUVDeclaration ); + } + else + { + pShader = &DiffuseUVVertexShader::StaticType; + m_pD3DDevice->SetVertexDeclaration( g_pPosColUVDeclaration ); + } + + CommitTransforms( pShader ); + CommitTextureState(); + m_pD3DDevice->SetVertexShader( pShader->GetVertexShader() ); + + if ( g_primType == 8 ) // QUADLIST + { + for ( INT i = 0; i < primCount; i++ ) + { + m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, &g_vertices[ i * 4], sizeof(PosColNormalUVVertex)); + } + } + else if ( g_primType == 9 ) // QUADSTRIP + { + for ( INT i = 0; i < primCount; i++ ) + { + m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, &g_vertices[ i * 2], sizeof(PosColNormalUVVertex)); + } + } + + else + { + m_pD3DDevice->DrawPrimitiveUP(g_primType, primCount, g_vertices, sizeof(PosColNormalUVVertex)); + } + +} // End + + +/* +__forceinline float ClampCol(float c) +{ + if (c < 0) + { + c = 0; + } + else if (c > 1) + { + c = 1; + } + + return c; +} +*/ + +//-- Colour ------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::Colour(float r, float g, float b, float a) +{ +// r = ClampCol(r); +// g = ClampCol(g); +// b = ClampCol(b); +// a = ClampCol(a); +// unsigned char cr = (unsigned char) (r * 255.0f); +// unsigned char cg = (unsigned char) (g * 255.0f); +// unsigned char cb = (unsigned char) (b * 255.0f); +// unsigned char ca = (unsigned char) (a * 255.0f); +// g_colour = D3DCOLOR_ARGB(ca, cr, cg, cb); + g_fColour = D3DXVECTOR4(r, g, b, a); + +} // Colour + +//-- Vertex ------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::Vertex( float x, float y, float z ) +{ + if ( g_currentVertex == MAX_VERTICES ) + { + return; + } + + PosColNormalUVVertex& v = g_vertices[ g_currentVertex++ ]; + + v.Coord.x = x; + v.Coord.y = y; + v.Coord.z = z; +// v.Diffuse = g_colour; + v.Normal = g_normal; + v.u = g_tex0U; + v.v = g_tex0V; + v.FDiffuse = g_fColour; + +} // Vertex + +//-- RotateAxis --------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::RotateAxis( float angle, float x, float y, float z ) +{ + D3DXVECTOR3 axis( x, y, z ); + g_matrixStack->RotateAxisLocal( &axis, D3DXToRadian( angle ) ); + +} // RotateAxis + +//-- Cube --------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::Cube( float nx, float ny, float nz, float x, float y, float z ) +{ + // 4-------5 + // /| /| + // 0-------1 | + // | 7-----|-6 + // |/ |/ + // 3-------2 + + PushMatrix(); + + Translate( ( nx + x ) * 0.5f, + ( ny + y ) * 0.5f, + ( nz + z ) * 0.5f ); + + DiffuseUVCubeVertexShader* pShader = NULL; + if ( g_envMapSet ) + { + pShader = &DiffuseUVEnvCubeVertexShader::StaticType; + } + else + { + pShader = &DiffuseUVCubeVertexShader::StaticType; + } + + CommitTransforms( pShader ); + CommitTextureState(); + + PopMatrix(); + + D3DXVECTOR4 vScale( ( x - nx ) * 0.5f, ( y - ny ) * 0.5f, ( z - nz ) * 0.5f, 1.0f ); + + pShader->SetScale( &vScale ); + pShader->SetColour( &g_fColour ); + + m_pD3DDevice->SetVertexShader( pShader->GetVertexShader() ); + m_pD3DDevice->SetVertexDeclaration( g_pPosNormalColUVDeclaration ); + + m_pD3DDevice->SetStreamSource( 0, + g_pCubeVbuffer, + 0, + sizeof( PosColNormalUVVertex ) ); + + m_pD3DDevice->SetIndices( g_pCubeIbuffer ); + + m_pD3DDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 24, 0, 12 ); + + m_pD3DDevice->SetStreamSource( 0, + NULL, + 0, + sizeof( PosColNormalUVVertex ) ); + + m_pD3DDevice->SetIndices( NULL ); + +} // Cube + +#define PI180 0.0174532925199432957692369076848861f // pi / 180 + +inline void RotY( const float angle, D3DXVECTOR3& vec) +{ + float s = (float) sin( PI180*angle ); + float c = (float) cos( PI180*angle ); + float X = vec.x; + vec.x = vec.x*c + vec.z*s; + vec.z = -X*s + vec.z*c; +} +void Renderer::SimpleSphere(float size) +{ + Sphere(10,10, size); +} + +void Renderer::Sphere(int del_uhol_x, int del_uhol_y, float size) +{ + // del_uhol_x krat 2*(del_uhol_y+1) bodov + + // Vertex_t v[del_uhol_x*2*(del_uhol_y+1)]; + PosColNormalUVVertex* v = new PosColNormalUVVertex[del_uhol_x*2*(del_uhol_y+1)]; + + D3DXVECTOR3 a,b,ay,by; + float dy=360.f/del_uhol_y; + float dx=180.f*PI180/del_uhol_x; + for(int x=0; xSetVertexDeclaration( g_pPosNormalColUVDeclaration ); + } + else + { + pShader = &DiffuseUVVertexShader::StaticType; + m_pD3DDevice->SetVertexDeclaration( g_pPosColUVDeclaration ); + } + + CommitTransforms( pShader ); + CommitTextureState(); + m_pD3DDevice->SetVertexShader( pShader->GetVertexShader() ); + for(int i=0; iDrawPrimitive(D3DPT_TRIANGLESTRIP, i*2*(del_y+1), 2*del_y ); + m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2*del_uhol_y, &v[i*2*(del_uhol_y+1)], sizeof(PosColNormalUVVertex)); + + delete [] v; + // pd->DrawPrimitive( D3DPT_TRIANGLESTRIP, i*2*(del_y+1), 2*del_y ); +} + +//-- SetEnvTexture --------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::SetEnvTexture( LPDIRECT3DTEXTURE9 texture ) +{ + if ( texture == SCRATCH_TEXTURE ) + { + m_pD3DDevice->SetTexture(0, g_scratchTexture); + } + else + { + m_pD3DDevice->SetTexture( 0, texture ); + } + g_envMapSet = texture != NULL; + +} // SetEnvTexture + +//-- SetTexture --------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::SetTexture (LPDIRECT3DTEXTURE9 texture ) +{ + if ( texture == SCRATCH_TEXTURE ) + { + m_pD3DDevice->SetTexture( 0, g_scratchTexture ); + } + else + { + m_pD3DDevice->SetTexture( 0, texture ); + } + g_textureSet = texture != NULL; + +} // SetTexture + +//-- SetRenderTarget ---------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::SetRenderTarget( LPDIRECT3DTEXTURE9 texture ) +{ + IDirect3DSurface9* surface; + texture->GetSurfaceLevel( 0, &surface ); + + m_pD3DDevice->SetRenderTarget( 0, surface ); + m_pD3DDevice->SetDepthStencilSurface( g_depthBuffer ); + m_pD3DDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, 0, 1.0f, 0 ); + + surface->Release(); + + // m_renderTargetWidth = texture->Width(); + // m_renderTargetHeight = texture->Height(); + +} // SetRenderTarget + +void Renderer::GetBackBuffer() +{ + m_pD3DDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &g_backBuffer); + m_pD3DDevice->GetDepthStencilSurface(&g_oldDepthBuffer); +} + +void Renderer::ReleaseBackbuffer() +{ + g_oldDepthBuffer->Release(); + g_backBuffer->Release(); +} + +//-- SetRenderTargetBackBuffer ------------------------------------------------ +// +//----------------------------------------------------------------------------- +void Renderer::SetRenderTargetBackBuffer() +{ + + m_pD3DDevice->SetRenderTarget(0, g_backBuffer); + m_pD3DDevice->SetDepthStencilSurface( g_oldDepthBuffer ); + +// m_pD3DDevice->SetViewport(&g_viewport); + + // m_renderTargetWidth = 640; + // m_renderTargetHeight = 480; + +} // SetRenderTargetBackBuffer + + +void Renderer::CompileShaders() +{ + m_pD3DDevice->CreateVertexDeclaration( declPosNormalColUV, &g_pPosNormalColUVDeclaration ); + m_pD3DDevice->CreateVertexDeclaration( declPosColUV, &g_pPosColUVDeclaration ); + m_pD3DDevice->CreateVertexDeclaration( declPosNormal, &g_pPosNormalDeclaration ); + + Shader::CompileAllShaders(); +} + +//-- PushMatrix --------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::PushMatrix() +{ + g_matrixStack->Push(); + +} // PushMatrix + +//-- PopMatrix ---------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::PopMatrix() +{ + g_matrixStack->Pop(); + +} // PopMatrix + + +void Renderer::TexCoord( float u, float v ) +{ + g_tex0U = u; + g_tex0V = v; + +} // TexCoord + +void Renderer::Normal( float nx, float ny, float nz ) +{ + g_normal.x = nx; + g_normal.y = ny; + g_normal.z = nz; + D3DXVec3Normalize( &g_normal, &g_normal ); +} + +//-- ClearFloat --------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::ClearFloat(float r, float g, float b) +{ + unsigned char cr = (unsigned char) (r * 255.0f); + unsigned char cg = (unsigned char) (g * 255.0f); + unsigned char cb = (unsigned char) (b * 255.0f); + unsigned char ca = (unsigned char) (1.0f * 255.0f); + unsigned int colour = D3DCOLOR_ARGB(ca, cr, cg, cb); + + m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, colour, 1.0f, 0); + +} // ClearFloat + +//-- TexRect ---------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::TexRect(float x1, float y1, float x2, float y2) +{ + PosColNormalUVVertex v[4]; + + v[0].Coord.x = x1; + v[0].Coord.y = y1; + v[0].Coord.z = 0.0f; +// v[0].Diffuse = g_colour; + v[0].FDiffuse = g_fColour; + v[0].u = 0.5f / 256.0f; + v[0].v = 0.5f / 256.0f; + + v[1].Coord.x = x2; + v[1].Coord.y = y1; + v[1].Coord.z = 0.0f; +// v[1].Diffuse = g_colour; + v[1].FDiffuse = g_fColour; + v[1].u = 1.0f; + v[1].v = 0.5f / 256.0f; + + v[2].Coord.x = x2; + v[2].Coord.y = y2; + v[2].Coord.z = 0.0f; +// v[2].Diffuse = g_colour; + v[2].FDiffuse = g_fColour; + v[2].u = 1.0f; + v[2].v = 1.0f; + + v[3].Coord.x = x1; + v[3].Coord.y = y2; + v[3].Coord.z = 0.0f; +// v[3].Diffuse = g_colour; + v[3].FDiffuse = g_fColour; + v[3].u = 0.5f / 256.0f; + v[3].v = 1.0f; + + DiffuseUVVertexShader* pShader = &DiffuseUVVertexShader::StaticType; + CommitTransforms( pShader ); + CommitTextureState(); + m_pD3DDevice->SetVertexShader( pShader->GetVertexShader() ); + m_pD3DDevice->SetVertexDeclaration( g_pPosColUVDeclaration ); + + m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE); + m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, &v, sizeof(PosColNormalUVVertex)); + m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); + +} // TexRect + +//-- CopyToScratch ------------------------------------------------------------ +// +//----------------------------------------------------------------------------- +void Renderer::CopyToScratch() +{ + // TODO: +/* + // Copy current render target to scratch buffer + IDirect3DSurface9* currSurface; + IDirect3DSurface9* destSurface; + + m_pD3DDevice->GetRenderTarget(0, &currSurface); + g_scratchTexture->GetSurfaceLevel(0, &destSurface); + + RECT src; + POINT dst; + src.left = 0; + src.right = 512; + src.top = 0; + src.bottom = 512; + dst.x = 0; + dst.y = 0; + +// m_pD3DDevice->CopyRects(currSurface, &src, 1, destSurface, &dst); + m_pD3DDevice->UpdateSurface( currSurface, &src, destSurface, &dst ); + currSurface->Release(); + destSurface->Release(); +*/ +} // CopyToScratch + +//-- GetDevice ---------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +LPDIRECT3DDEVICE9 Renderer::GetDevice() +{ + return m_pD3DDevice; + +} // GetDevice + +//-- GetAspect ---------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +float Renderer::GetAspect() +{ + return g_aspectValue; + +} // GetAspect + +//-- SetIdentity -------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void Renderer::SetIdentity() +{ + g_matrixStack->LoadIdentity(); + +} // SetIdentity + + +IDirect3DPixelShader9* Renderer::CreatePixelShader( DWORD* pCode ) +{ + IDirect3DPixelShader9* pPixelShader; + m_pD3DDevice->CreatePixelShader( pCode, &pPixelShader ); + return pPixelShader; +} + +IDirect3DVertexShader9* Renderer::CreateVertexShader( DWORD* pCode ) +{ + IDirect3DVertexShader9* pVertexShader; + m_pD3DDevice->CreateVertexShader( pCode, &pVertexShader ); + return pVertexShader; +} + +void Renderer::SetConstantTableMatrix( LPD3DXCONSTANTTABLE pConstantTable, char* pConstantName, D3DXMATRIX* pMatrix ) +{ + pConstantTable->SetMatrix( m_pD3DDevice, pConstantName, pMatrix ); +} + +void Renderer::SetConstantTableVector( LPD3DXCONSTANTTABLE pConstantTable, char* pConstantName, D3DXVECTOR4* pVector) +{ + pConstantTable->SetVector( m_pD3DDevice, pConstantName, pVector ); +} + +void Renderer::SetFillMode( int fillMode ) +{ + if ( fillMode == 0 ) + { + m_pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); + } + else + { + m_pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,149 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _RENDERER_H_ +#define _RENDERER_H_ + +#include +#include + +enum eBlendMode +{ + BLEND_OFF = 0, + BLEND_ADD = 1, + BLEND_MOD = 2, + BLEND_MAX = 3 +}; + +struct PosColNormalUVVertex +{ + D3DXVECTOR3 Coord; + D3DXVECTOR3 Normal; +// DWORD Diffuse; // diffuse color + float u, v; // Texture 0 coords + D3DXVECTOR4 FDiffuse; // float diffuse color +}; + +struct PosNormalVertex +{ + D3DXVECTOR3 Coord; + D3DXVECTOR3 Normal; +}; + +#define SCRATCH_TEXTURE ((LPDIRECT3DTEXTURE9)-1) + +extern LPDIRECT3DVERTEXDECLARATION9 g_pPosNormalColUVDeclaration; +extern LPDIRECT3DVERTEXDECLARATION9 g_pPosColUVDeclaration; +extern LPDIRECT3DVERTEXDECLARATION9 g_pPosNormalDeclaration; + +extern char g_TexturePath[]; + +class Renderer +{ +public: + static void Init( LPDIRECT3DDEVICE9 pD3DDevice, int iXPos, int iYPos, int iWidth, int iHeight, float fPixelRatio ); + static void Exit(); + static void GetBackBuffer(); + static void ReleaseBackbuffer(); + static void SetDefaults(); + static LPDIRECT3DDEVICE9 GetDevice(); + + static void SetRenderTarget(LPDIRECT3DTEXTURE9 texture); + static void SetRenderTargetBackBuffer(); + + static void SetDrawMode2d(); + static void SetDrawMode3d(); + static void SetProjection(D3DXMATRIX& matProj); + static void SetView(D3DXMATRIX& matView); + + static void GetProjection( D3DXMATRIX& matProj ); + static LPD3DXMESH CreateD3DXTextMesh( const char* pString, bool bCentered ); + static void DrawMesh( LPD3DXMESH pMesh ); + + + static void Clear( DWORD Col ); + static void ClearDepth(); + static void ClearFloat(float r, float g, float b); + static void Rect( float x1, float y1, float x2, float y2, DWORD Col ); + static void Line( float x1, float y1, float x2, float y2, DWORD Col ); + static void Point( float x, float y, DWORD Col ); + + static LPDIRECT3DTEXTURE9 CreateTexture( int iWidth, int iHeight, D3DFORMAT Format = D3DFMT_X8R8G8B8, bool bDynamic = FALSE ); + static LPDIRECT3DTEXTURE9 LoadTexture( char* pFilename, bool bAutoResize = true ); + static void ReleaseTexture( LPDIRECT3DTEXTURE9 pTexture ); + static void DrawText( float x, float y, char* txt, DWORD Col = 0xffffffff); + + static int GetViewportWidth(); + static int GetViewportHeight(); + static void SetBlendMode(eBlendMode blendMode); + static float GetAspect(); + static void SetAspect(float aspect); + + static void SetTexture(LPDIRECT3DTEXTURE9 texture); + static void SetEnvTexture(LPDIRECT3DTEXTURE9 texture); + + static void CopyToScratch(); + + static void Begin(D3DPRIMITIVETYPE primType); + static void End(); + + static void Colour(float r, float g, float b, float a); + static void TexCoord(float u, float v); + static void Normal(float nx, float ny, float nz); + static void NormalVec(D3DVECTOR& normal); + static void Vertex(float x, float y, float z); + static void VertexVec(D3DVECTOR& pos); + + static void Cube(float nx, float ny, float nz, float x, float y, float z); + static void Sphere(int del_uhol_x, int del_uhol_y, float size); + static void SimpleSphere(float size); + + static void Circle(float radius, int numSides, D3DXVECTOR3& dir); + static void PushMatrix(); + static void PopMatrix(); + static void SetIdentity(); + static void Rotate(float x, float y, float z); + static void RotateAxis(float angle, float x, float y, float z); + static void Translate(float x, float y, float z); + static void Scale(float x, float y, float z); + static void LookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ); + + static void Rect(float x1, float y1, float x2, float y2); + static void TexRect(float x1, float y1, float x2, float y2); + + static void DrawPrimitive(D3DPRIMITIVETYPE primType, unsigned int startIndex, unsigned int numPrims); + static void SetLineWidth(float width); + static void SetFillMode(int fillMode); + + static void CommitTransforms( class DiffuseUVVertexShader* pShader ); + static void CommitTextureState(); + + static IDirect3DPixelShader9* CreatePixelShader( DWORD* pCode ); + static IDirect3DVertexShader9* CreateVertexShader( DWORD* pCode ); + static void SetConstantTableMatrix( LPD3DXCONSTANTTABLE pConstantTable, char* pConstantName, D3DXMATRIX* pMatrix ); + static void SetConstantTableVector( LPD3DXCONSTANTTABLE pConstantTable, char* pConstantName, D3DXVECTOR4* pVector ); + +private: + static void CreateCubeBuffers(); + static void CreateFonts(); + static void CompileShaders(); + +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Shader.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Shader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Shader.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Shader.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,289 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "Shader.h" +#include "Renderer.h" + +void Shader::ReleaseAllShaders() +{ + std::vector& ShaderList = GetShaderList(); + + std::vector::iterator ShaderIterator; + + for (ShaderIterator = ShaderList.begin(); + ShaderIterator != ShaderList.end(); + ShaderIterator++ ) + { + if ( (*ShaderIterator)->m_pVShader ) + (*ShaderIterator)->m_pVShader->Release(); + if ( (*ShaderIterator)->m_pPShader ) + (*ShaderIterator)->m_pPShader->Release(); + } +} + +bool Shader::CompileAllShaders() +{ + std::vector& ShaderList = GetShaderList(); + + std::vector::iterator ShaderIterator; + + for (ShaderIterator = ShaderList.begin(); + ShaderIterator != ShaderList.end(); + ShaderIterator++ ) + { + if ( (*ShaderIterator)->CompileShader() == false ) + return false; + } + return true; +} + +bool Shader::CompileShader() +{ + DWORD dwShaderFlags = D3DXSHADER_PARTIALPRECISION; + LPD3DXBUFFER pCode; + LPD3DXBUFFER pErrors; + + int iSrcLen = strlen( m_pShaderSrc ); + if ( iSrcLen == 0 ) + return false; + + HRESULT hr = ( D3DXCompileShader( m_pShaderSrc, + iSrcLen, + NULL, // defines + NULL, // include + "Main", // Function name + m_ShaderType == ST_PIXEL ? "ps_2_0": "vs_2_0", // profile + dwShaderFlags, // Flags + &pCode, // Output compiled shader + &pErrors, // error messages + &m_pConstantTable // constant table + ) ); + + if( FAILED( hr ) ) + { + char* errors = (char*)pErrors->GetBufferPointer(); + OutputDebugStringA( errors ); + return false; + } + + if ( m_ShaderType == ST_PIXEL ) + { + m_pPShader = Renderer::CreatePixelShader( ( DWORD* )pCode->GetBufferPointer() ); + } + else + { + m_pVShader = Renderer::CreateVertexShader( ( DWORD* )pCode->GetBufferPointer() ); + } + + pCode->Release(); + return true; +} + +char DiffuseUVVertexShaderSrc[] = +{ + " struct VS_INPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 Colour : COLOR; \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " struct VS_OUTPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 Colour : COLOR; \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " \n" + " float4x4 WVPMat; \n" + " VS_OUTPUT Main( VS_INPUT input ) \n" + " { \n" + " VS_OUTPUT output; \n" + " // Transform coord \n" + " output.vPosition = mul(WVPMat, float4(input.vPosition.xyz, 1.0f)); \n" + " output.Colour = input.Colour; \n" + " output.Tex0 = input.Tex0; \n" + " return output; \n" + " } \n" + " \n" +}; + +char DiffuseUVEnvVertexShaderSrc[] = +{ + " struct VS_INPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 vNormal : NORMAL; \n" + " float4 Colour : COLOR; \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " struct VS_OUTPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 Colour : COLOR; \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " \n" + " float4x4 WVMat; \n" + " float4x4 WVPMat; \n" + " VS_OUTPUT Main( VS_INPUT input ) \n" + " { \n" + " VS_OUTPUT output; \n" + " // Transform coord \n" + " output.vPosition = mul(WVPMat, float4(input.vPosition.xyz, 1.0f)); \n" + " output.Colour = input.Colour; \n" + " float4 NormalCamSpace = mul(WVMat, float4(input.vNormal.xyz, 0.0f));\n" + " output.Tex0.xy = (NormalCamSpace.xy * 0.8f) + 0.5f; \n" +// " output.Colour = float4(NormalCamSpace.xyz, 1); \n" + " return output; \n" + " } \n" + " \n" +}; + +char DiffuseUVCubeVertexShaderSrc[] = +{ + " struct VS_INPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 Colour : COLOR; \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " struct VS_OUTPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 Colour : COLOR; \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " \n" + " float4 Col; \n" + " float4 vScale; \n" + " float4x4 WVMat; \n" + " float4x4 WVPMat; \n" + " VS_OUTPUT Main( VS_INPUT input ) \n" + " { \n" + " VS_OUTPUT output; \n" + " float4 vPos = float4(input.vPosition.xyz * vScale, 1); \n" + " // Transform coord \n" + " output.vPosition = mul(WVPMat, vPos); \n" + " output.Colour = Col; \n" + " output.Tex0.xy = input.Tex0; \n" + " return output; \n" + " } \n" + " \n" +}; + +char DiffuseUVEnvCubeVertexShaderSrc[] = +{ + " struct VS_INPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 vNormal : NORMAL; \n" + " float4 Colour : COLOR; \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " struct VS_OUTPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 Colour : COLOR; \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " \n" + " float4 Col; \n" + " float4 vScale; \n" + " float4x4 WVMat; \n" + " float4x4 WVPMat; \n" + " VS_OUTPUT Main( VS_INPUT input ) \n" + " { \n" + " VS_OUTPUT output; \n" + " float4 vPos = float4(input.vPosition.xyz * vScale, 1); \n" + " // Transform coord \n" + " output.vPosition = mul(WVPMat, vPos); \n" + " output.Colour = Col; \n" + " float4 NormalCamSpace = mul(WVMat, float4(input.vNormal.xyz, 0.0f));\n" + " output.Tex0.xy = (NormalCamSpace.xy * 0.5f) + 0.5f; \n" + " return output; \n" + " } \n" + " \n" +}; + +char DiffuseNormalEnvCubeVertexShaderSrc[] = +{ + " struct VS_INPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 vNormal : NORMAL; \n" + " }; \n" + " struct VS_OUTPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 Colour : COLOR; \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " \n" + " float4 Col; \n" + " float4x4 WVMat; \n" + " float4x4 WVPMat; \n" + " VS_OUTPUT Main( VS_INPUT input ) \n" + " { \n" + " VS_OUTPUT output; \n" + " float4 vPos = float4(input.vPosition.xyz, 1); \n" + " // Transform coord \n" + " output.vPosition = mul(WVPMat, vPos); \n" + " output.Colour = 0xffffffff; \n" + " float4 NormalCamSpace = mul(WVMat, float4(input.vNormal.xyz, 0.0f));\n" + " output.Tex0.xy = (NormalCamSpace.xy * 0.2f) + 0.5f; \n" + " return output; \n" + " } \n" + " \n" +}; + +char UVNormalEnvVertexShaderSrc[] = +{ + " struct VS_INPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 vNormal : NORMAL; \n" + " }; \n" + " struct VS_OUTPUT \n" + " { \n" + " float4 vPosition : POSITION; \n" + " float4 Colour : COLOR; \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " \n" + " float4x4 WVMat; \n" + " float4x4 WVPMat; \n" + " VS_OUTPUT Main( VS_INPUT input ) \n" + " { \n" + " VS_OUTPUT output; \n" + " // Transform coord \n" + " output.vPosition = mul(WVPMat, float4(input.vPosition.xyz, 1.0f)); \n" + " output.Colour = 0xffffffff; \n" + " float4 NormalCamSpace = mul(WVMat, float4(input.vNormal.xyz, 0.0f));\n" + " output.Tex0.xy = (NormalCamSpace.xy * 0.2f) + 0.5f; \n" + " return output; \n" + " } \n" + " \n" +}; + +IMPLEMENT_SHADER(DiffuseUVVertexShader, DiffuseUVVertexShaderSrc, ST_VERTEX); +IMPLEMENT_SHADER(DiffuseUVEnvVertexShader, DiffuseUVEnvVertexShaderSrc, ST_VERTEX); +IMPLEMENT_SHADER(DiffuseUVCubeVertexShader, DiffuseUVCubeVertexShaderSrc, ST_VERTEX); +IMPLEMENT_SHADER(DiffuseUVEnvCubeVertexShader, DiffuseUVEnvCubeVertexShaderSrc, ST_VERTEX); +IMPLEMENT_SHADER(DiffuseNormalEnvCubeVertexShader, DiffuseNormalEnvCubeVertexShaderSrc, ST_VERTEX); +IMPLEMENT_SHADER(UVNormalEnvVertexShader, UVNormalEnvVertexShaderSrc, ST_VERTEX); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Shader.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Shader.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Shader.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Shader.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,136 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _SHADER_H_ +#define _SHADER_H_ + +#include +#include +#include "Renderer.h" + +enum EShaderType +{ + ST_VERTEX, + ST_PIXEL +}; + +#define DECLARE_SHADER(InShaderName) \ + public: \ + static InShaderName StaticType; + +#define IMPLEMENT_SHADER(ShaderName, ShaderSrc, ShaderType)\ + ShaderName ShaderName::StaticType = ShaderName( ShaderType, ShaderSrc ); + +class Shader +{ +public: + Shader( EShaderType ShaderType, char* pShaderSrc ) : + m_ShaderType( ShaderType ), + m_pShaderSrc( pShaderSrc ) + { + std::vector& ShaderList = GetShaderList(); + ShaderList.push_back( this ); + } + + static std::vector& GetShaderList() + { + static std::vector s_Shaders; + return s_Shaders; + } + + static bool CompileAllShaders(); + static void ReleaseAllShaders(); + + LPDIRECT3DVERTEXSHADER9 GetVertexShader() { return m_pVShader; } + LPDIRECT3DPIXELSHADER9 GetPixelShader() { return m_pPShader; } + +protected: + EShaderType m_ShaderType; + char* m_pShaderSrc; + + bool CompileShader(); + + LPDIRECT3DVERTEXSHADER9 m_pVShader; + LPDIRECT3DPIXELSHADER9 m_pPShader; + LPD3DXCONSTANTTABLE m_pConstantTable; +// LPDIRECT3DVERTEXDECLARATION9* m_ppVertexDecl; +}; + +class DiffuseUVVertexShader : public Shader +{ + DECLARE_SHADER(DiffuseUVVertexShader); +public: + DiffuseUVVertexShader( EShaderType ShaderType, char* pShaderSrc ) : Shader( ShaderType, pShaderSrc ){}; + + void SetWVP( D3DXMATRIX* pWVPMat ) + { + Renderer::SetConstantTableMatrix( m_pConstantTable, "WVPMat", pWVPMat ); + } + void SetWV( D3DXMATRIX* pWVMat ) + { + Renderer::SetConstantTableMatrix( m_pConstantTable, "WVMat", pWVMat ); + } +}; + +class DiffuseUVEnvVertexShader : public DiffuseUVVertexShader +{ + DECLARE_SHADER(DiffuseUVEnvVertexShader); +public: + DiffuseUVEnvVertexShader( EShaderType ShaderType, char* pShaderSrc ) : DiffuseUVVertexShader( ShaderType, pShaderSrc ){}; +}; + +class DiffuseUVCubeVertexShader : public DiffuseUVVertexShader +{ + DECLARE_SHADER(DiffuseUVCubeVertexShader); +public: + DiffuseUVCubeVertexShader( EShaderType ShaderType, char* pShaderSrc ) : DiffuseUVVertexShader( ShaderType, pShaderSrc ){}; + + void SetScale( D3DXVECTOR4* pvScale ) + { + Renderer::SetConstantTableVector( m_pConstantTable, "vScale", pvScale); + } + void SetColour( D3DXVECTOR4* pvCol ) + { + Renderer::SetConstantTableVector( m_pConstantTable, "Col", pvCol); + } + +}; + +class DiffuseUVEnvCubeVertexShader : public DiffuseUVCubeVertexShader +{ + DECLARE_SHADER(DiffuseUVEnvCubeVertexShader); +public: + DiffuseUVEnvCubeVertexShader( EShaderType ShaderType, char* pShaderSrc ) : DiffuseUVCubeVertexShader( ShaderType, pShaderSrc ){}; +}; + +class DiffuseNormalEnvCubeVertexShader : public DiffuseUVCubeVertexShader +{ + DECLARE_SHADER(DiffuseNormalEnvCubeVertexShader); +public: + DiffuseNormalEnvCubeVertexShader( EShaderType ShaderType, char* pShaderSrc ) : DiffuseUVCubeVertexShader( ShaderType, pShaderSrc ){}; +}; + +class UVNormalEnvVertexShader : public DiffuseUVVertexShader +{ + DECLARE_SHADER(UVNormalEnvVertexShader); +public: + UVNormalEnvVertexShader( EShaderType ShaderType, char* pShaderSrc ) : DiffuseUVVertexShader( ShaderType, pShaderSrc ){}; +}; + +#endif _SHADER_H_ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Texture.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Texture.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Texture.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Texture.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,77 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "Texture.h" +#include "Renderer.h" +#include +#include + +using namespace std; + +Texture::Texture() +{ + m_iRefCount = 1; + m_pTexture = NULL; + m_renderTarget = false; + +} // Constructor + +Texture::~Texture() +{ + if (!m_renderTarget) + { + Renderer::ReleaseTexture(m_pTexture); + } + else if (m_pTexture != NULL) + { + m_pTexture->Release(); + m_pTexture = NULL; + } + +} // Destructor + +//-------------------- +// reference counting +//-------------------- + +void Texture::AddRef() +{ + m_iRefCount++; +} + +void Texture::Release() +{ + if ( --m_iRefCount == 0 ) + delete this; +} + +void Texture::CreateTexture() +{ + m_pTexture = Renderer::CreateTexture(512, 512); + m_renderTarget = true; + +} // CreateTexture + +void Texture::LoadTexture(string& filename) +{ + char fullname[ 512 ]; + sprintf_s(fullname, 512, "%s%s", g_TexturePath, filename.c_str() ); + m_pTexture = Renderer::LoadTexture(fullname); + +} // LoadTexture diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Texture.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Texture.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Texture.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Texture.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,50 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _TEXTURE_H_ +#define _TEXTURE_H_ + +#include "Renderer.h" +#include + +class Texture +{ +public: + Texture(); + void CreateTexture(); + void LoadTexture( std::string& filename ); + + void AddRef(); + void Release(); + + LPDIRECT3DTEXTURE9 m_pTexture; + bool m_renderTarget; + +protected: + ~Texture(); + int m_iRefCount; +}; + +inline Texture* Texture_Factory() +{ + // The class constructor is initializing the reference counter to 1 + return new Texture(); +} + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Vortex.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Vortex.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Vortex.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Vortex.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1462 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include +#include + +#include "Vortex.h" +#include "Renderer.h" +#include +#include "fft.h" +#include "Preset.h" +#include "Texture.h" +#include "Mesh.h" +#include "Shader.h" +#include "XmlDocument.h" + +#include +using namespace std; + +#include "angelscript.h" +#include "../../angelscript/add_on/scriptstring/scriptstring.h" + +#include "DebugConsole.h" +#include "../../../../addons/include/xbmc_vis_types.h" + +// Effects +#include "Map.h" +#include "VoicePrint.h" +#include "Tunnel.h" + +#define NUM_FREQUENCIES (512) +#define TEXTURE_FRAMEBUFFER (1) +#define TEXTURE_NEXTPRESET (2) +#define TEXTURE_CURRPRESET (3) +#define TEXTURE_ALBUMART (4) + +// Announcements currently disabled due to fonts no longer loading in the latest version of XBMC +// No idea why yet, they work fine in stand alone mode and previous versions of XBMC +#define ENABLE_ANNOUNCE (0) + +class TrackInfo +{ +public: + TrackInfo() + { + Title = "None"; + TrackNumber = DiscNumber = Duration = Year = 0; + Rating = 0; + } + + void SetFromVisTrack(VisTrack* pVisTrack) + { + Title = pVisTrack->title; + Artist = pVisTrack->artist; + Album = pVisTrack->album; + AlbumArtist = pVisTrack->albumArtist; + Genre = pVisTrack->genre; + Comment = pVisTrack->comment; + Lyrics = pVisTrack->lyrics; + TrackNumber = pVisTrack->trackNumber; + DiscNumber = pVisTrack->discNumber; + Duration = pVisTrack->duration; + Year = pVisTrack->year; + Rating = pVisTrack->rating; + } + + string Title; + string Artist; + string Album; + string AlbumArtist; + string Genre; + string Comment; + string Lyrics; + + int TrackNumber; + int DiscNumber; + int Duration; + int Year; + char Rating; +}; + +char g_TexturePath[ 512 ] = "special://xbmc/addons/visualization.vortex/resources/Textures/"; +char g_PresetPath[ 512 ] = "special://xbmc/addons/visualization.vortex/resources/Presets/"; +char g_TransitionPath[ 512 ] = "special://xbmc//addons/visualization.vortex/resources/Transitions/"; +char g_AnnouncePath[ 512 ] = "special://xbmc/addons/visualization.vortex/resources/Announcements/"; + +class FileHolder +{ +public: + FileHolder() : + m_FilenameAddresses( NULL ), + m_AllFilenames( NULL ) + { + + } + + ~FileHolder() + { + if ( m_AllFilenames ) + { + delete[] m_AllFilenames; + } + + if ( m_FilenameAddresses ) + { + delete m_FilenameAddresses; + } + } + + void GetFiles( const string fileDir, const string fileExt ) + { + if ( m_AllFilenames ) + { + delete[] m_AllFilenames; + m_AllFilenames = NULL; + } + + if ( m_FilenameAddresses ) + { + delete m_FilenameAddresses; + m_FilenameAddresses = NULL; + } + + m_Filenames.clear(); + string path = fileDir + "*." + fileExt; + + WIN32_FIND_DATA findData; + HANDLE hFind = FindFirstFile( path.c_str(), &findData ); + if ( hFind == INVALID_HANDLE_VALUE ) + { + return; + } + + do + { + m_Filenames.push_back( findData.cFileName); + } while ( FindNextFile( hFind, &findData ) != FALSE ); + + FindClose( hFind ); + } + + const char* GetFilename(unsigned int index) + { + if ( index < 0 || index > m_Filenames.size() ) + { + return "Invalid"; + } + else + { + return m_Filenames[ index ].c_str(); + } + } + + int NumFiles() { return m_Filenames.size(); } + + char** GetAllFilenames() + { + if ( m_AllFilenames == NULL ) + { + int totalFilenameLength = 0; + for( int i = 0; i < NumFiles(); i++ ) + { + totalFilenameLength += m_Filenames[ i ].length() - 3; + } + totalFilenameLength += 1; + m_AllFilenames = new char[ totalFilenameLength ]; + m_FilenameAddresses = new char*[ NumFiles() ]; + + int currentOffset = 0; + for( int i = 0; i < NumFiles(); i++ ) + { + strncpy_s( &m_AllFilenames[ currentOffset ], totalFilenameLength - currentOffset, m_Filenames[ i ].c_str(), m_Filenames[ i ].length() - 4 ); + m_FilenameAddresses[ i ] = &m_AllFilenames[ currentOffset ]; + currentOffset += m_Filenames[ i ].length() - 3; + } + m_AllFilenames[ currentOffset ] = '\0'; + + } + + return m_FilenameAddresses; + } + +private: + vector m_Filenames; + char* m_AllFilenames; + char** m_FilenameAddresses; +}; + +namespace +{ + // Presets + Preset g_preset1; + Preset g_preset2; + Preset g_transition; + Preset g_AnnouncePreset; + Preset* g_presets[2] = {&g_preset1, &g_preset2}; + + LPDIRECT3DTEXTURE9 g_currPresetTex; + LPDIRECT3DTEXTURE9 g_newPresetTex; + LPDIRECT3DTEXTURE9 g_albumArt = NULL; + LPDIRECT3DTEXTURE9 g_vortexLogo = NULL; + + int g_renderTarget = 0; + int g_currPresetId = 0; + int g_transitionId = 0; + int g_loadPreset = -1; + int* g_randomPresetIndices; + float g_mainCounter = 7.0f; + + // User config settings + UserSettings g_Settings; + + enum EState {STATE_RENDER_PRESET, STATE_TRANSITION}; + EState g_currentState = STATE_RENDER_PRESET; + + TrackInfo g_TrackInfo; + + FileHolder g_PresetFiles; + FileHolder g_TransitionFiles; + FileHolder g_AnnouncementFiles; + + FFT g_fftobj; + + FLOAT fSecsPerTick; + LARGE_INTEGER qwTime, qwLastTime, qwElapsedTime, qwAppTime, qwElapsedAppTime; + FLOAT fTime, fElapsedTime, fAppTime, fElapsedAppTime; + FLOAT fLastTime = 0; + INT iFrames = 0; + FLOAT fFPS = 0; +} + +VOID InitTime() +{ + // Get the frequency of the timer + LARGE_INTEGER qwTicksPerSec; + QueryPerformanceFrequency( &qwTicksPerSec ); + fSecsPerTick = 1.0f / (FLOAT)qwTicksPerSec.QuadPart; + + // Save the start time + QueryPerformanceCounter( &qwTime ); + qwLastTime.QuadPart = qwTime.QuadPart; + + qwAppTime.QuadPart = 0; + qwElapsedTime.QuadPart = 0; + qwElapsedAppTime.QuadPart = 0; + srand(qwTime.QuadPart); + +} + +VOID UpdateTime() +{ + QueryPerformanceCounter( &qwTime ); + qwElapsedTime.QuadPart = qwTime.QuadPart - qwLastTime.QuadPart; + qwLastTime.QuadPart = qwTime.QuadPart; + qwElapsedAppTime.QuadPart = qwElapsedTime.QuadPart; + qwAppTime.QuadPart += qwElapsedAppTime.QuadPart; + + // Store the current time values as floating point + fTime = fSecsPerTick * ((FLOAT)(qwTime.QuadPart)); + fElapsedTime = fSecsPerTick * ((FLOAT)(qwElapsedTime.QuadPart)); + fAppTime = fSecsPerTick * ((FLOAT)(qwAppTime.QuadPart)); + fElapsedAppTime = fSecsPerTick * ((FLOAT)(qwElapsedAppTime.QuadPart)); + + // Keep track of the frame count + + iFrames++; + + // Update the scene stats once per second + if( fAppTime - fLastTime > 1.0f ) + { + fFPS = ( float )( iFrames / ( fAppTime - fLastTime ) ); + fLastTime = fAppTime; + iFrames = 0; + } + +} + +int GetRandomPreset() +{ + // Pick a random preset from the first 5 and then move that index to the end of the random list + // This will bias the randomness so you don't see the same preset again until its back in the top 5 + int randomIndex = rand() % ( min( 5, g_PresetFiles.NumFiles() ) ); + int nextPreset = g_randomPresetIndices[ randomIndex ]; + + for ( int i = randomIndex; i < g_PresetFiles.NumFiles() - 1; i++ ) + { + g_randomPresetIndices[ i ] = g_randomPresetIndices[ i + 1 ]; + } + g_randomPresetIndices[ g_PresetFiles.NumFiles() - 1 ] = nextPreset; + + return nextPreset; +} + +void Vortex::Init( LPDIRECT3DDEVICE9 pD3DDevice, int iPosX, int iPosY, int iWidth, int iHeight, float fPixelRatio ) +{ + InitTime(); + + DebugConsole::Init(); + Renderer::Init( pD3DDevice, iPosX, iPosY, iWidth, iHeight, fPixelRatio ); + InitAngelScript(); + g_fftobj.Init(576, NUM_FREQUENCIES); + + char fullname[ 512 ]; + sprintf_s(fullname, 512, "%s%s", g_TexturePath, "Vortex-v.jpg" ); + g_vortexLogo = Renderer::LoadTexture(fullname); + g_currPresetTex = Renderer::CreateTexture(1024, 768); + g_newPresetTex = Renderer::CreateTexture(1024, 768); + + g_PresetFiles.GetFiles( g_PresetPath, "vtx" ); + + if ( g_PresetFiles.NumFiles() == 0 ) + { + return; + } + + g_TransitionFiles.GetFiles( g_TransitionPath, "tra" ); + g_AnnouncementFiles.GetFiles( g_AnnouncePath, "ann" ); + + g_randomPresetIndices = new int[ g_PresetFiles.NumFiles() ]; + + for ( int i = 0; i < g_PresetFiles.NumFiles(); i++ ) + { + g_randomPresetIndices[ i ] = i; + } + + // Mix em up a bit + for ( int i = 0; i < 100; i++ ) + { + int a = rand() % g_PresetFiles.NumFiles(); + int b = rand() % g_PresetFiles.NumFiles(); + int old = g_randomPresetIndices[ a ]; + g_randomPresetIndices[ a ] = g_randomPresetIndices[ b ]; + g_randomPresetIndices[ b ] = old; + } + + g_preset1.Init(m_pScriptEngine, "PRESET1"); + g_preset1.m_presetId = 0; + g_preset2.Init(m_pScriptEngine, "PRESET2"); + g_preset2.m_presetId = 1; + g_transition.Init(m_pScriptEngine, "TRANSITION"); + g_transition.m_presetId = 2; + + g_AnnouncePreset.Init(m_pScriptEngine, "ANNOUNCE"); + g_AnnouncePreset.m_presetId = 3; + + if ( GetUserSettings().PresetLocked ) + { + // Check that the preset locked in the settings file is still valid + if ( g_currPresetId >= g_PresetFiles.NumFiles() || g_currPresetId < 0 ) + { + g_currPresetId = GetRandomPreset(); + } + } + else if ( GetUserSettings().RandomPresetsEnabled ) + { + g_currPresetId = GetRandomPreset(); + } + + if ( g_currPresetId < 0 || g_currPresetId >= g_PresetFiles.NumFiles() ) + { + g_currPresetId = 0; + } + char filename[ 256 ]; + sprintf( filename, "%s%s", g_PresetPath, g_PresetFiles.GetFilename( g_currPresetId ) ); + g_presets[ 0 ]->Begin( filename ); + g_mainCounter = GetUserSettings().TimeBetweenPresets + ((rand() % 100) / 100.0f) * GetUserSettings().TimeBetweenPresetsRand; + g_currentState = STATE_RENDER_PRESET; +} + +void Vortex::Start( int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName ) +{ +} + +void Vortex::UpdateTrack( VisTrack* pVisTrack ) +{ + g_TrackInfo.SetFromVisTrack( pVisTrack ); + + // TODO: if song change announcements are enabled... +#if ENABLE_ANNOUNCE + { + char filename[ 512 ]; + sprintf(filename, "%s%s.ann", g_AnnouncePath, "Announce"); + g_AnnouncePreset.Begin( filename ); + } +#endif +} + +void Vortex::Shutdown() +{ + g_preset1.End(); + g_preset2.End(); + g_transition.End(); + g_AnnouncePreset.End(); + + delete[] g_randomPresetIndices; + + if ( m_pScriptEngine ) + { + m_pScriptEngine->Release(); + m_pScriptEngine = NULL; + } + + if ( g_vortexLogo ) + { + Renderer::ReleaseTexture( g_vortexLogo ); + } + + if ( g_albumArt ) + { + g_albumArt->Release(); + g_albumArt = NULL; + } + if ( g_currPresetTex ) + { + g_currPresetTex->Release(); + g_currPresetTex = NULL; + } + if ( g_newPresetTex ) + { + g_newPresetTex->Release(); + g_newPresetTex = NULL; + } + + Renderer::Exit(); + g_fftobj.CleanUp(); +} + +float AdjustRateToFPS(float per_frame_decay_rate_at_fps1, float fps1, float actual_fps) +{ + // returns the equivalent per-frame decay rate at actual_fps + + // basically, do all your testing at fps1 and get a good decay rate; + // then, in the real application, adjust that rate by the actual fps each time you use it. + + float per_second_decay_rate_at_fps1 = powf(per_frame_decay_rate_at_fps1, fps1); + float per_frame_decay_rate_at_fps2 = powf(per_second_decay_rate_at_fps1, 1.0f/actual_fps); + + return per_frame_decay_rate_at_fps2; +} + +struct SoundData +{ + float imm[2][3]; // bass, mids, treble, no damping, for each channel (long-term average is 1) + float avg[2][3]; // bass, mids, treble, some damping, for each channel (long-term average is 1) + float med_avg[2][3]; // bass, mids, treble, more damping, for each channel (long-term average is 1) + // float long_avg[2][3]; // bass, mids, treble, heavy damping, for each channel (long-term average is 1) + float fWaveform[2][576]; // Not all 576 are valid! - only NUM_WAVEFORM_SAMPLES samples are valid for each channel (note: NUM_WAVEFORM_SAMPLES is declared in shell_defines.h) + float fSpectrum[2][NUM_FREQUENCIES]; // NUM_FREQUENCIES samples for each channel (note: NUM_FREQUENCIES is declared in shell_defines.h) + + float specImm[32]; + float specAvg[32]; + float specMedAvg[32]; + + float bigSpecImm[512]; + float leftBigSpecAvg[512]; + float rightBigSpecAvg[512]; +}; + +SoundData g_sound; +float g_bass; +float g_treble; +float g_middle; +float g_timePass; +bool g_finished; + +void Vortex::AudioData( const float* pAudioData, int iAudioDataLength, float* pFreq, int iFreqDataLength ) +{ + float tempWave[2][576]; + + int iPos = 0; + int iOld = 0; + //const float SCALE = (1.0f / 32768.0f ) * 255.0f; + while ( iPos < 576 ) + { + for ( int i = 0; i < iAudioDataLength; i += 2 ) + { + g_sound.fWaveform[ 0 ][ iPos ] = float( ( pAudioData[ i ] / 32768.0f ) * 255.0f ); + g_sound.fWaveform[ 1 ][ iPos ] = float( ( pAudioData[ i+1 ] / 32768.0f) * 255.0f ); + + // damp the input into the FFT a bit, to reduce high-frequency noise: + tempWave[ 0 ][ iPos ] = 0.5f * ( g_sound.fWaveform[ 0 ][ iPos ] + g_sound.fWaveform[ 0 ][ iOld ] ); + tempWave[ 1 ][ iPos ] = 0.5f * ( g_sound.fWaveform[ 1 ][ iPos ] + g_sound.fWaveform[ 1 ][ iOld ] ); + iOld = iPos; + iPos++; + if ( iPos >= 576 ) + break; + } + } + + g_fftobj.time_to_frequency_domain( tempWave[ 0 ], g_sound.fSpectrum[ 0 ] ); + g_fftobj.time_to_frequency_domain( tempWave[ 1 ], g_sound.fSpectrum[ 1 ] ); +} + +void AnalyzeSound() +{ + // Some bits of this were pinched from Milkdrop... + int m_fps = 60; + + // sum (left channel) spectrum up into 3 bands + // [note: the new ranges do it so that the 3 bands are equally spaced, pitch-wise] + float min_freq = 200.0f; + float max_freq = 11025.0f; + float net_octaves = (logf(max_freq/min_freq) / logf(2.0f)); // 5.7846348455575205777914165223593 + float octaves_per_band = net_octaves / 3.0f; // 1.9282116151858401925971388407864 + float mult = powf(2.0f, octaves_per_band); // each band's highest freq. divided by its lowest freq.; 3.805831305510122517035102576162 + // [to verify: min_freq * mult * mult * mult should equal max_freq.] + // for (int ch=0; ch<2; ch++) + { + for (int i=0; i<3; i++) + { + // old guesswork code for this: + // float exp = 2.1f; + // int start = (int)(NUM_FREQUENCIES*0.5f*powf(i/3.0f, exp)); + // int end = (int)(NUM_FREQUENCIES*0.5f*powf((i+1)/3.0f, exp)); + // results: + // old range: new range (ideal): + // bass: 0-1097 200-761 + // mids: 1097-4705 761-2897 + // treb: 4705-11025 2897-11025 + int start = (int)(NUM_FREQUENCIES * min_freq*powf(mult, (float)i )/11025.0f); + int end = (int)(NUM_FREQUENCIES * min_freq*powf(mult, (float)i+1)/11025.0f); + if (start < 0) start = 0; + if (end > NUM_FREQUENCIES) end = NUM_FREQUENCIES; + + g_sound.imm[0][i] = 0; + for (int j=start; j NUM_FREQUENCIES) end = NUM_FREQUENCIES; + + g_sound.specImm[i] = 0; + for (int j=start; j g_sound.specAvg[i]) + avg_mix = AdjustRateToFPS(0.2f, 14.0f, (float)m_fps); + else + avg_mix = AdjustRateToFPS(0.5f, 14.0f, (float)m_fps); + g_sound.specAvg[i] = g_sound.specAvg[i]*avg_mix + g_sound.specImm[i]*(1-avg_mix); + + float med_mix = 0.91f;//0.800f + 0.11f*powf(t, 0.4f); // primarily used for velocity_damping + med_mix = AdjustRateToFPS( med_mix, 14.0f, (float)m_fps); + g_sound.specMedAvg[i] = g_sound.specMedAvg[i]*(med_mix ) + g_sound.specImm[i]*(1-med_mix); + } + + for (int i=0; i<512; i++) + { + g_sound.bigSpecImm[i] = g_sound.fSpectrum[0][i]; + g_sound.bigSpecImm[i] *= 0.2408f; + + float avg_mix; + if (g_sound.bigSpecImm[i] > g_sound.leftBigSpecAvg[i]) + avg_mix = AdjustRateToFPS(0.2f, 14.0f, (float)m_fps); + else + avg_mix = AdjustRateToFPS(0.5f, 14.0f, (float)m_fps); + + g_sound.leftBigSpecAvg[i] = g_sound.leftBigSpecAvg[i]*avg_mix + g_sound.bigSpecImm[i]*(1-avg_mix); + } + + for (int i=0; i<512; i++) + { + g_sound.bigSpecImm[i] = g_sound.fSpectrum[1][i]; + g_sound.bigSpecImm[i] *= 0.2408f; + + float avg_mix; + if (g_sound.bigSpecImm[i] > g_sound.rightBigSpecAvg[i]) + avg_mix = AdjustRateToFPS(0.2f, 14.0f, (float)m_fps); + else + avg_mix = AdjustRateToFPS(0.5f, 14.0f, (float)m_fps); + + g_sound.rightBigSpecAvg[i] = g_sound.rightBigSpecAvg[i]*avg_mix + g_sound.bigSpecImm[i]*(1-avg_mix); + } + + + // multiply by long-term, empirically-determined inverse averages: + // (for a trial of 244 songs, 10 seconds each, somewhere in the 2nd or 3rd minute, + // the average levels were: 0.326781557 0.38087377 0.199888934 + for (int ch=0; ch<2; ch++) + { + g_sound.imm[ch][0] /= 0.326781557f;//0.270f; + g_sound.imm[ch][1] /= 0.380873770f;//0.343f; + g_sound.imm[ch][2] /= 0.199888934f;//0.295f; + } + + // do temporal blending to create attenuated and super-attenuated versions + for (int ch=0; ch<2; ch++) + { + for (int i=0; i<3; i++) + { + // g_sound.avg[i] + { + float avg_mix; + if (g_sound.imm[ch][i] > g_sound.avg[ch][i]) + avg_mix = AdjustRateToFPS(0.2f, 14.0f, (float)m_fps); + else + avg_mix = AdjustRateToFPS(0.5f, 14.0f, (float)m_fps); + // if (g_sound.imm[ch][i] > g_sound.avg[ch][i]) + // avg_mix = 0.5f; + // else + // avg_mix = 0.8f; + g_sound.avg[ch][i] = g_sound.avg[ch][i]*avg_mix + g_sound.imm[ch][i]*(1-avg_mix); + } + + { + float med_mix = 0.91f;//0.800f + 0.11f*powf(t, 0.4f); // primarily used for velocity_damping + float long_mix = 0.96f;//0.800f + 0.16f*powf(t, 0.2f); // primarily used for smoke plumes + med_mix = AdjustRateToFPS( med_mix, 14.0f, (float)m_fps); + long_mix = AdjustRateToFPS(long_mix, 14.0f, (float)m_fps); + g_sound.med_avg[ch][i] = g_sound.med_avg[ch][i]*(med_mix ) + g_sound.imm[ch][i]*(1-med_mix ); + // g_sound.long_avg[ch][i] = g_sound.long_avg[ch][i]*(long_mix) + g_sound.imm[ch][i]*(1-long_mix); + } + } + } + + float newBass = ((g_sound.avg[0][0] - g_sound.med_avg[0][0]) / g_sound.med_avg[0][0]) * 2; + float newMiddle = ((g_sound.avg[0][1] - g_sound.med_avg[0][1]) / g_sound.med_avg[0][1]) * 2; + float newTreble = ((g_sound.avg[0][2] - g_sound.med_avg[0][2]) / g_sound.med_avg[0][2]) * 2; + newBass = max(min(newBass, 1.0f), -1.0f); + newMiddle = max(min(newMiddle, 1.0f), -1.0f); + newTreble = max(min(newTreble, 1.0f), -1.0f); + + + float avg_mix; + if (newTreble > g_treble) + avg_mix = 0.5f; + else + avg_mix = 0.5f; + g_bass = g_bass*avg_mix + newBass*(1-avg_mix); + g_middle = g_middle*avg_mix + newMiddle*(1-avg_mix); + g_treble = g_treble*avg_mix + newTreble*(1-avg_mix); + + g_bass = max(min(g_bass, 1.0f), -1.0f); + g_middle = max(min(g_middle, 1.0f), -1.0f); + g_treble = max(min(g_treble, 1.0f), -1.0f); +} + +namespace +{ + float vl[256]; + float tm[256]; + float mx[256]; +} + +float GetSpecLeft(int index) +{ + index = min(index, 511); + index = max(index, 0); + + index = (int)((index / 511.0f) * 350.0f); + + return g_sound.leftBigSpecAvg[index]; +} + +float GetSpecRight(int index) +{ + index = min(index, 511); + index = max(index, 0); + index = (int)((index / 511.0f) * 350.0f); + + return g_sound.rightBigSpecAvg[index]; +} + +void UpdateSpectrum() +{ + int x; + for (x=0;x<256;x=x+1) + vl[x] = 0; + for (x=0;x<512;x=x+1) + vl[x/2] = vl[x/2] + GetSpecLeft(x)+GetSpecRight(x); + + for (int x = 0; x < 256; x++) + { + vl[x] = vl[x]/8; + if (vl[x]>1.0) + vl[x]=1.0; + } +} + +float GetSpec( int x ) +{ + if ( x < 0 ) + x = 0; + if ( x > 511 ) + x = 511; + return vl[ x ]; +} + +void SwapPresets() +{ + g_presets[0]->End(); + g_transition.End(); + Preset* temp = g_presets[0]; + g_presets[0] = g_presets[1]; + g_presets[1] = temp; +} + + +void Vortex::Render() +{ + if ( g_PresetFiles.NumFiles() == 0) + { + return; + } + + Renderer::GetBackBuffer(); + + UpdateTime(); + + g_timePass = 1.0f / 60.f;//fElapsedAppTime; + g_timePass = fElapsedAppTime; + + AnalyzeSound(); + UpdateSpectrum(); + + static bool doOnce = true; + //--------------------------------------------------------------------------- + // Do rendering + + switch ( g_currentState ) + { + case STATE_RENDER_PRESET: + { + g_renderTarget = TEXTURE_FRAMEBUFFER; + Renderer::SetRenderTargetBackBuffer(); + Renderer::SetDefaults(); + Renderer::Clear(0); + g_presets[0]->Render(); + break; + } + + case STATE_TRANSITION: + { + if (doOnce) + { + Renderer::SetDefaults(); + Renderer::SetRenderTarget(g_currPresetTex); + g_renderTarget = TEXTURE_CURRPRESET; + Renderer::Clear(0); + g_presets[0]->Render(); + doOnce = false; + } + + Renderer::SetDefaults(); + Renderer::SetRenderTarget(g_newPresetTex); + g_renderTarget = TEXTURE_NEXTPRESET; + Renderer::Clear(0); + g_presets[1]->Render(); + + Renderer::SetDefaults(); + Renderer::SetRenderTargetBackBuffer(); + g_renderTarget = TEXTURE_FRAMEBUFFER; + Renderer::Clear(0); + g_transition.Render(); + break; + } + } + + // Restore state + Renderer::SetRenderTargetBackBuffer(); + Renderer::SetDefaults(); + + //--------------------------------------------------------------------------- + // Do state updating + + switch ( g_currentState ) + { + case STATE_RENDER_PRESET: + { + // OutputDebugString("STATE = STATE_RENDER_PRESET\n"); + if ( !GetUserSettings().PresetLocked ) + { + g_mainCounter -= g_timePass; + } + + if ( g_mainCounter <= 0 || g_loadPreset != -1 ) + { + char filename[ 255 ]; + + if ( g_mainCounter <= 0 ) + { + // Not in a transition, preset not locked and time for a new preset + if ( GetUserSettings().RandomPresetsEnabled ) + { + int nextPreset = GetRandomPreset(); + if ( nextPreset == g_currPresetId ) + g_currPresetId = (g_currPresetId+1) % g_PresetFiles.NumFiles(); + else + g_currPresetId = nextPreset; + } + else + { + g_currPresetId = (g_currPresetId+1) % g_PresetFiles.NumFiles(); + } + } + + if ( g_loadPreset != -1 ) + { + // New preset requested + g_currPresetId = g_loadPreset; + g_loadPreset = -1; + } + + g_finished = true; + g_mainCounter = GetUserSettings().TimeBetweenPresets + ((rand() % 100) / 100.0f) * GetUserSettings().TimeBetweenPresetsRand; + + // Load preset + sprintf(filename, "%s%s", g_PresetPath, g_PresetFiles.GetFilename( g_currPresetId ) ); + if ( g_presets[ 1 ]->Begin( filename ) == true ) + { + // Load and begin transition + if ( GetUserSettings().TransitionsEnabled && g_TransitionFiles.NumFiles() != 0 ) + { + g_transitionId = ( g_transitionId + 1 ) % g_TransitionFiles.NumFiles(); + sprintf( filename, "%s%s", g_TransitionPath, g_TransitionFiles.GetFilename( g_transitionId ) ); + if ( g_transition.Begin( filename ) == true ) + { + // Transition loading succeeded + g_finished = false; + doOnce = true; + g_currentState = STATE_TRANSITION; + } + else + { + SwapPresets(); + } + } + else + { + SwapPresets(); + } + } + } + break; + } + + case STATE_TRANSITION: + { + // OutputDebugString("STATE = STATE_TRANSITION\n"); + if (g_finished) + { + g_mainCounter = GetUserSettings().TimeBetweenPresets + ((rand() % 100) / 100.0f) * GetUserSettings().TimeBetweenPresetsRand; + SwapPresets(); + g_finished = false; + + g_currentState = STATE_RENDER_PRESET; + } + break; + } + } + + //---------------------------------------------------------------------------- + // Render announcement overlay if there is one + if ( g_AnnouncePreset.IsValid() ) + { + g_finished = false; + Renderer::ClearDepth(); + g_AnnouncePreset.Render(); + if ( g_finished ) + g_AnnouncePreset.End(); + } + + Renderer::SetDefaults(); + Renderer::SetDrawMode2d(); + +// Renderer::Clear( 0 ); +// Renderer::SetDefaults(); +// Preset1.Render(); + +// Renderer::SetDefaults(); +// Renderer::SetDrawMode2d(); +// Renderer::Rect( -1.0, -1.0, 1.0, 1.0, 0xff000000 ); +/* + + if ( GetUserSettings().ShowAudioAnalysis ) + { + FLOAT BAR_WIDTH = 1.0f / 128; + / * + for(int i = 0; i < 128; i++) + { + / *if(bar_heights[i] > 4) + bar_heights[i] -= 4; + else + bar_heights[i] = 0;* / + // Renderer::Rect( ( i * (WIDTH / NUM_BANDS) ) / 512.0f, + // ( HEIGHT - 1 - bar_heights[i] ) / 512.0f, + // ( i * (WIDTH / NUM_BANDS ) + (WIDTH / NUM_BANDS) - 1 ) / 512.0f, + // bar_heights[i] / 512.0f, 0xff0000ff); + + // Renderer::Rect( -1 + (i * BAR_WIDTH), 1, (-1 + (i+1)) * BAR_WIDTH, 1 - (bar_heights[ i ] / 200.0f), 0xff0000ff); + Renderer::Rect( -0.5f + (i * BAR_WIDTH), 0, -0.5f + ((i+1) * BAR_WIDTH), 0 - (bars[ i ] / 100.0f), 0xff0000ff); + + // Renderer::Rect( -0.5f + (i * BAR_WIDTH), 1, -0.5f + ((i+1) * BAR_WIDTH), 1 - (SpecAvgLeft[ i ] / 100.0f), 0xffff00ff); + + // Renderer::Rect( -0.5 + (i * BAR_WIDTH), 1 - (SpecAvgLeft[ i ] / 100.0f), -0.5 + ((i+1) * BAR_WIDTH), 1 - (SpecAvgLeft[ i ] / 100.0f), 0xffffffff); + + // Renderer::Line(-0.5f + (i * BAR_WIDTH), + // 1 - (SpecMedAvgLeft[ i ] / 100.0f), + // -0.5f + ((i+1) * BAR_WIDTH), + // 1 - (SpecMedAvgLeft[ i ] / 100.0f), + // 0xffffffff ); + } + * / + + // Renderer::Colour(1, 0, 0, 1); + Renderer::Rect(-0.5f, 0, -0.25f, -g_bass*0.5f, 0xffff0000); + // Renderer::Colour(1, 1, 1, 1); + Renderer::Rect(-0.5f, 1, -0.25f, 1-g_sound.med_avg[0][0]*0.07f, 0xffffffff); + // Renderer::Colour(1, 0, 0, 1); + Renderer::Rect(-0.4f, 1, -0.35f, 1-g_sound.avg[0][0]*0.07f, 0xffff0000); + + // Renderer::Colour(0, 1, 0, 1); + Renderer::Rect(-0.125f, 0, 0.125f, -g_middle*0.5f, 0xff00ff00); + // Renderer::Colour(1, 1, 1, 1); + Renderer::Rect(-0.125f, 1, 0.125f, 1-g_sound.med_avg[0][1]*0.07f, 0xffffffff); + // Renderer::Colour(0, 1, 0, 1); + Renderer::Rect(-0.025f, 1, 0.025f, 1-g_sound.avg[0][1]*0.07f, 0xff00ff00); + + // Renderer::Colour(0, 0, 1, 1); + Renderer::Rect(0.25f, 0, 0.5f, -g_treble*0.5f, 0xff0000ff); + // Renderer::Colour(1, 1, 1, 1); + Renderer::Rect(0.25f, 1, 0.5f, 1-g_sound.med_avg[0][2]*0.07f, 0xffffffff); + // Renderer::Colour(0, 0, 1, 1); + Renderer::Rect(0.35f, 1, 0.4f, 1-g_sound.avg[0][2]*0.07f, 0xff0000ff); + + { + for (int x = 0; x < 256; x++) + { + // vl[x] = vl[x]/8; + // if (vl[x]>1.0) + // vl[x]=1.0; + + float xPos = x / 128.0f; + + Renderer::Begin( D3DPT_TRIANGLEFAN ); + + Renderer::Colour(0,0,1,1); + Renderer::Vertex(-1+xPos+(1/128.0f),1,0); + Renderer::Vertex(-1+xPos,1,0); + Renderer::Colour(0,vl[x],1, 1); + Renderer::Vertex(-1+xPos,1-vl[x]*0.4f,0); + Renderer::Vertex(-1+xPos+(1/128.0f),1-vl[x]*0.4f,0); + / * + gfxColour(1,1,1,1); + gfxVertex(xPos+(1/128.0f),mx[x]*0.4,0); + gfxVertex(xPos,mx[x]*0.4,0); + gfxVertex(xPos,(mx[x]-0.01)*0.4,0); + gfxVertex(xPos+(1/128.0f),(mx[x]-0.01)*0.4,0); + * / + Renderer::End(); + } + } + } + +*/ + if( GetUserSettings().ShowDebugConsole ) + { + DebugConsole::Render(); + } + + if( GetUserSettings().ShowFPS ) + { + char FrameRate[256]; + sprintf_s(FrameRate, 256, "FPS = %0.02f\n", fFPS ); + Renderer::DrawText(0, 0, FrameRate, 0xffffffff ); + } + + Renderer::ReleaseBackbuffer(); +} + +// Function implementation with native calling convention +void PrintString(string &str) +{ + DebugConsole::Log( str.c_str() ); +} + +// Function implementation with generic script interface +void PrintString_Generic(asIScriptGeneric *gen) +{ + string *str = (string*)gen->GetArgAddress(0); + DebugConsole::Log( str->c_str() ); +} + +// Function wrapper is needed when native calling conventions are not supported +void timeGetTime_Generic(asIScriptGeneric *gen) +{ + gen->SetReturnDWord(timeGetTime()); +} + +#define assert(x) (x) + +void ConfigureEngine( asIScriptEngine* engine ) +{ + int r; + + // Register the script string type + // Look at the implementation for this function for more information + // on how to register a custom string type, and other object types. + // The implementation is in "/add_on/scriptstring/scriptstring.cpp" + RegisterScriptString(engine); + + if( !strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") ) + { + // Register the functions that the scripts will be allowed to use. + // Note how the return code is validated with an assert(). This helps + // us discover where a problem occurs, and doesn't pollute the code + // with a lot of if's. If an error occurs in release mode it will + // be caught when a script is being built, so it is not necessary + // to do the verification here as well. + r = engine->RegisterGlobalFunction("void Print(string &in)", asFUNCTION(PrintString), asCALL_CDECL); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("uint GetSystemTime()", asFUNCTION(timeGetTime), asCALL_STDCALL); assert( r >= 0 ); + } + else + { + // Notice how the registration is almost identical to the above. + r = engine->RegisterGlobalFunction("void Print(string &in)", asFUNCTION(PrintString_Generic), asCALL_GENERIC); assert( r >= 0 ); + r = engine->RegisterGlobalFunction("uint GetSystemTime()", asFUNCTION(timeGetTime_Generic), asCALL_GENERIC); assert( r >= 0 ); + } + + + // It is possible to register the functions, properties, and types in + // configuration groups as well. When compiling the scripts it then + // be defined which configuration groups should be available for that + // script. If necessary a configuration group can also be removed from + // the engine, so that the engine configuration could be changed + // without having to recompile all the scripts. +} + +void MessageCallback(const asSMessageInfo *msg, void *param) +{ + const char *type = "ERR "; + if( msg->type == asMSGTYPE_WARNING ) + type = "WARN"; + else if( msg->type == asMSGTYPE_INFORMATION ) + type = "INFO"; + + char txt[512]; + sprintf_s(txt, 512, "%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message); + + if ( msg->type == asMSGTYPE_INFORMATION ) + { + DebugConsole::Log( txt ); + } + else if ( msg->type == asMSGTYPE_WARNING ) + { + DebugConsole::Warn( txt ); + } + else + { + DebugConsole::Error( txt ); + } +} + +float GetWaveLeft(int index) +{ + if ( index < 0 ) + index = 0; + else if ( index > 575 ) + index = 575; + return g_sound.fWaveform[0][index] * (1.0f / 255.0f); +} + +float GetWaveRight(int index) +{ + if ( index < 0 ) + index = 0; + else if ( index > 575 ) + index = 575; + return g_sound.fWaveform[1][index] * (1.0f / 255.0f); +} + +void SetUserEnvTexture(Texture& texture) +{ + Renderer::SetEnvTexture(texture.m_pTexture); + + texture.Release(); +} + +void SetUserTexture(Texture& texture) +{ + Renderer::SetTexture(texture.m_pTexture); + + texture.Release(); +} + +float Mag(float a, float b) +{ + return sqrtf(a*a + b*b); +} + +float Rand() +{ + return (rand() % 100 ) / 100.0f; +} + +void SetUserRenderTarget(Texture& texture) +{ + if (texture.m_renderTarget && texture.m_pTexture) + { + Renderer::SetRenderTarget(texture.m_pTexture); + } + else + { + Renderer::SetRenderTargetBackBuffer(); + } + + texture.Release(); +} + +void SetRenderTarget(int target) +{ + if (g_renderTarget== TEXTURE_FRAMEBUFFER) + { + // Current frame buffer + Renderer::SetRenderTargetBackBuffer(); + } + else if (g_renderTarget == TEXTURE_CURRPRESET) + { + // Current preset + Renderer::SetRenderTarget(g_currPresetTex); + } + else if (g_renderTarget == TEXTURE_NEXTPRESET) + { + // Next preset + Renderer::SetRenderTarget(g_newPresetTex); + } +} + +void SetTexture(int textureId) +{ + if (textureId == TEXTURE_CURRPRESET) + { + // Current preset + Renderer::SetTexture(g_currPresetTex); + } + else if (textureId == TEXTURE_NEXTPRESET) + { + // Next preset + Renderer::SetTexture(g_newPresetTex); + } + else if (textureId == TEXTURE_ALBUMART) + { + if ( g_albumArt ) + Renderer::SetTexture( g_albumArt ); + else + Renderer::SetTexture( g_vortexLogo ); + } + else + { + Renderer::SetTexture(NULL); + } + +} // SetTexture + +void SetEnvTexture(int textureId) +{ + if (textureId == TEXTURE_CURRPRESET) + { + // Current preset + Renderer::SetEnvTexture(g_currPresetTex); + } + else if (textureId == TEXTURE_NEXTPRESET) + { + // Next preset + Renderer::SetEnvTexture(g_newPresetTex); + } + else if (textureId == TEXTURE_ALBUMART) + { + if ( g_albumArt /*&& g_useAlbumArt*/ ) + Renderer::SetTexture( g_albumArt ); + else + // Renderer_c::SetTexture(g_vortexLogo); + Renderer::SetEnvTexture( NULL ); + } + else + { + Renderer::SetEnvTexture(NULL); + } + +} // SetTexture + + + +int MyAbs( int a ) +{ + return a < 0 ? -a : a; +} + +float FloatClamp(float val, float min, float max) +{ + if (val < min) + val = min; + else if (val > max) + val = max; + + return val; +} + +int IntClamp(int val, int min, int max) +{ + if (val < min) + val = min; + else if (val > max) + val = max; + + return val; +} + +void SetEffectTexture( EffectBase& rEffect ) +{ + Renderer::SetTexture( rEffect.GetTexture() ); + rEffect.Release(); +} + +void SetEffectRenderTarget( EffectBase& rEffect ) +{ + Renderer::SetRenderTarget( rEffect.GetRenderTarget() ); + + rEffect.Release(); +} + +void DrawMesh( Mesh& pMesh ) +{ + Renderer::DrawMesh( pMesh.GetMesh() ); + pMesh.Release(); +} + +void NULLFunction() +{ + +} + +bool Vortex::InitAngelScript() +{ + // Create the script engine + m_pScriptEngine = asCreateScriptEngine( ANGELSCRIPT_VERSION ); + if ( m_pScriptEngine == 0 ) + { + DebugConsole::Error( "AngelScript: Failed to create script engine.\n" ); + return false; + } + + // The script compiler will write any compiler messages to the callback. + m_pScriptEngine->SetMessageCallback( asFUNCTION( MessageCallback ), 0, asCALL_CDECL ); + + // Configure the script engine with all the functions, + // and variables that the script should be able to use. + ConfigureEngine( m_pScriptEngine ); + + int r; + + //--------------------------------------------------------------------------- + // Math functions + r = m_pScriptEngine->RegisterGlobalFunction("float Rand()", asFUNCTION(Rand), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float Sin(float)", asFUNCTION(sinf), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float Cos(float)", asFUNCTION(cosf), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float Mag(float, float)", asFUNCTION(Mag), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float Clamp(float, float, float)", asFUNCTION(FloatClamp), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("int Clamp(int, int, int)", asFUNCTION(IntClamp), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float Fabs(float)", asFUNCTION(fabsf), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("int Abs(int)", asFUNCTION(MyAbs), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float Atan2(float, float)", asFUNCTION(atan2f), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float Pow(float, float)", asFUNCTION(powf), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float Sqrt(float)", asFUNCTION(sqrtf), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float Atan(float)", asFUNCTION(atanf), asCALL_CDECL); assert(r >= 0); + + + //--------------------------------------------------------------------------- + // Global vars + r = m_pScriptEngine->RegisterGlobalProperty("const float TIMEPASS", &g_timePass); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalProperty("bool FINISHED", &g_finished); assert(r >= 0); + + r = m_pScriptEngine->RegisterGlobalProperty("const float BASS", &g_bass); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalProperty("const float MIDDLE", &g_middle); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalProperty("const float TREBLE", &g_treble); assert(r >= 0); + + r = m_pScriptEngine->RegisterGlobalFunction("float WaveLeft(int)", asFUNCTION(GetWaveLeft), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float WaveRight(int)", asFUNCTION(GetWaveRight), asCALL_CDECL); assert(r >= 0); +// r = g_scriptEngine->RegisterGlobalFunction("float GetSpec(int)", asFUNCTION(GetSpec), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float GetSpecLeft(int)", asFUNCTION(GetSpecLeft), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("float GetSpecRight(int)", asFUNCTION(GetSpecRight), asCALL_CDECL); assert(r >= 0); + + r = m_pScriptEngine->RegisterGlobalFunction("float GetSpec(int)", asFUNCTION(GetSpec), asCALL_CDECL); assert(r >= 0); + + //---------------------------------------------------------------------------- + // Register Track Info + r = m_pScriptEngine->RegisterObjectType("TrackInfo", sizeof(TrackInfo), asOBJ_VALUE | asOBJ_POD); assert( r >= 0 ); + + // Register the object properties + r = m_pScriptEngine->RegisterObjectProperty("const TrackInfo", "string Title", offsetof(TrackInfo, Title)); assert( r >= 0 ); + r = m_pScriptEngine->RegisterObjectProperty("const TrackInfo", "int TrackNumber", offsetof(TrackInfo, Title)); assert( r >= 0 ); + + r = m_pScriptEngine->RegisterGlobalProperty("const TrackInfo CurrentTrackInfo", &g_TrackInfo); assert(r >= 0); + + + //--------------------------------------------------------------------------- + // Renderer functions + r = m_pScriptEngine->RegisterGlobalFunction("void gfxBegin(uint)", asFUNCTION(Renderer::Begin), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxEnd()", asFUNCTION(Renderer::End), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxClear(uint)", asFUNCTION(Renderer::Clear), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxClear(float r, float g, float b)", asFUNCTION(Renderer::ClearFloat), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxColour(float r, float g, float b, float a)", asFUNCTION(Renderer::Colour), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxNormal(float nx, float ny, float nz)", asFUNCTION(Renderer::Normal), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxTexCoord(float u, float v)", asFUNCTION(Renderer::TexCoord), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxVertex(float x, float y, float z)", asFUNCTION(Renderer::Vertex), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxCube(float nx, float ny, float nz, float x, float y, float z)", asFUNCTION(Renderer::Cube), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSphere(float size)", asFUNCTION(Renderer::SimpleSphere), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxPushMatrix()", asFUNCTION(Renderer::PushMatrix), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxPopMatrix()", asFUNCTION(Renderer::PopMatrix), asCALL_CDECL); assert(r >= 0); +// r = m_pScriptEngine->RegisterGlobalFunction("void gfxRotate(float x, float y, float z)", asFUNCTION(Renderer::Rotate), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxRotate(float angle, float x, float y, float z)", asFUNCTION(Renderer::RotateAxis), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxTranslate(float x, float y, float z)", asFUNCTION(Renderer::Translate), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxScale(float x, float y, float z)", asFUNCTION(Renderer::Scale), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)", asFUNCTION(Renderer::LookAt), asCALL_CDECL); assert(r >= 0); + +// r = m_pScriptEngine->RegisterGlobalFunction("void gfxRect(float x1, float y1, float x2, float y2)", asFUNCTION(Renderer::Rect), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxTexRect(float x1, float y1, float x2, float y2)", asFUNCTION(Renderer::TexRect), asCALL_CDECL); assert(r >= 0); +// // r = g_scriptEngine->RegisterGlobalFunction("void gfxSetDrawMode2d()", asFUNCTION(Renderer::SetDrawMode2d), asCALL_CDECL); assert(r >= 0); +// // r = g_scriptEngine->RegisterGlobalFunction("void gfxSetDrawMode3d()", asFUNCTION(Renderer::SetDrawMode3d), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetBlendMode(int)", asFUNCTION(Renderer::SetBlendMode), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetAspect(float)", asFUNCTION(Renderer::SetAspect), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetFillMode(int)", asFUNCTION(Renderer::SetFillMode), asCALL_CDECL); assert(r >= 0); + + // Not supported functions from Xbox Vortex + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetLineWidth(float)", asFUNCTION(NULLFunction), asCALL_CDECL); assert(r >= 0); + + + //--------------------------------------------------------------------------- + // Texture Object + // Registering the reference type + r = m_pScriptEngine->RegisterObjectType("Texture", 0, asOBJ_REF); assert( r >= 0 ); + // Registering the factory behaviour + r = m_pScriptEngine->RegisterObjectBehaviour("Texture", asBEHAVE_FACTORY, "Texture@ f()", asFUNCTION(Texture_Factory), asCALL_CDECL); assert( r >= 0 ); + // Registering the addref/release behaviours + r = m_pScriptEngine->RegisterObjectBehaviour("Texture", asBEHAVE_ADDREF, "void f()", asMETHOD(Texture,AddRef), asCALL_THISCALL); assert( r >= 0 ); + r = m_pScriptEngine->RegisterObjectBehaviour("Texture", asBEHAVE_RELEASE, "void f()", asMETHOD(Texture,Release), asCALL_THISCALL); assert( r >= 0 ); + r = m_pScriptEngine->RegisterObjectMethod("Texture", "void CreateTexture()", asMETHOD(Texture, CreateTexture), asCALL_THISCALL); assert(r >= 0); + r = m_pScriptEngine->RegisterObjectMethod("Texture", "void LoadTexture(string&)", asMETHOD(Texture, LoadTexture), asCALL_THISCALL); assert(r >= 0); + + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetEnvTexture(uint)", asFUNCTION(SetEnvTexture), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetEnvTexture(Texture@)", asFUNCTION(SetUserEnvTexture), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetTexture(Texture@)", asFUNCTION(SetUserTexture), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetTexture(uint)", asFUNCTION(SetTexture), asCALL_CDECL); assert(r >= 0); + + + //--------------------------------------------------------------------------- + // Mesh Object + // Registering the reference type + r = m_pScriptEngine->RegisterObjectType("Mesh", 0, asOBJ_REF); assert( r >= 0 ); + // Registering the factory behaviour + r = m_pScriptEngine->RegisterObjectBehaviour("Mesh", asBEHAVE_FACTORY, "Mesh@ f()", asFUNCTION(Mesh_Factory), asCALL_CDECL); assert( r >= 0 ); + // Registering the addref/release behaviours + r = m_pScriptEngine->RegisterObjectBehaviour("Mesh", asBEHAVE_ADDREF, "void f()", asMETHOD(Mesh,AddRef), asCALL_THISCALL); assert( r >= 0 ); + r = m_pScriptEngine->RegisterObjectBehaviour("Mesh", asBEHAVE_RELEASE, "void f()", asMETHOD(Mesh,Release), asCALL_THISCALL); assert( r >= 0 ); + r = m_pScriptEngine->RegisterObjectMethod("Mesh", "void CreateTextMesh(string&, bool bCentered)", asMETHOD(Mesh, CreateTextMesh), asCALL_THISCALL); assert(r >= 0); + + r = m_pScriptEngine->RegisterGlobalFunction("void gfxDrawMesh(Mesh@)", asFUNCTION(DrawMesh), asCALL_CDECL); assert(r >= 0); + + + //--------------------------------------------------------------------------- + // Register the different effects + EffectBase::RegisterScriptInterface( m_pScriptEngine ); + Map::RegisterScriptInterface( m_pScriptEngine ); + VoicePrint::RegisterScriptInterface( m_pScriptEngine ); + Tunnel::RegisterScriptInterface( m_pScriptEngine ); + + //--------------------------------------------------------------------------- + // Texture Functions + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetRenderTarget(Texture@)", asFUNCTION(SetUserRenderTarget), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetRenderTarget(int)", asFUNCTION(SetRenderTarget), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetRenderTarget(EffectBase@)", asFUNCTION(SetEffectRenderTarget), asCALL_CDECL); assert(r >= 0); + r = m_pScriptEngine->RegisterGlobalFunction("void gfxSetTexture(EffectBase@)", asFUNCTION(SetEffectTexture), asCALL_CDECL); assert(r >= 0); + + return true; +} + +void Vortex::UpdateAlbumArt( char* artFilename ) +{ + Renderer::ReleaseTexture( g_albumArt ); + g_albumArt = Renderer::LoadTexture( artFilename ); +} + +int Vortex::GetCurrentPresetIndex() +{ + return g_currPresetId; +} + +UserSettings& Vortex::GetUserSettings() +{ + return g_Settings; +} + +int Vortex::GetPresets( char*** Presets ) +{ + *Presets = g_PresetFiles.GetAllFilenames(); + return g_PresetFiles.NumFiles(); +} + +void Vortex::LoadNextPreset() +{ + g_loadPreset = ( g_currPresetId + 1 ) % g_PresetFiles.NumFiles(); +} + +void Vortex::LoadPreviousPreset() +{ + g_loadPreset = g_currPresetId - 1; + if ( g_loadPreset < 0 ) + { + g_loadPreset = g_PresetFiles.NumFiles() - 1; + } +} + +void Vortex::LoadRandomPreset() +{ + g_loadPreset = GetRandomPreset(); +} + +void Vortex::LoadPreset( int PresetId ) +{ + g_loadPreset = PresetId; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Vortex.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Vortex.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/Vortex.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/Vortex.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,81 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _VORTEX_H_ + +#include + +class asIScriptEngine; +class VisTrack; + +struct UserSettings +{ + bool RandomPresetsEnabled; + bool PresetLocked; + bool TransitionsEnabled; + bool ShowAudioAnalysis; + bool StopFirstPreset; + bool ShowFPS; + bool ShowDebugConsole; + float TimeBetweenPresets; + float TimeBetweenPresetsRand; + + UserSettings() + { + RandomPresetsEnabled = true; + PresetLocked = false; + TransitionsEnabled = true; + ShowAudioAnalysis = false; + StopFirstPreset = true; + ShowFPS = false; + ShowDebugConsole = false; + TimeBetweenPresets = 10.0f; + TimeBetweenPresetsRand = 0.0f; + } + +}; + +class Vortex +{ +public: + void Init( LPDIRECT3DDEVICE9 pD3DDevice, int iPosX, int iPosY, int iWidth, int iHeight, float fPixelRatio ); + void Start( int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName ); + void Shutdown(); + void AudioData( const float* pAudioData, int iAudioDataLength, float* pFreq, int iFreqDataLength ); + void Render(); + void UpdateTrack( VisTrack* pVisTrack ); + void UpdateAlbumArt( char* artFilename ); + void LoadNextPreset(); + void LoadPreviousPreset(); + void LoadRandomPreset(); + void LoadPreset( int PresetId ); + + int GetCurrentPresetIndex(); + int GetPresets( char*** Presets ); + + UserSettings& GetUserSettings(); + void LoadSettings(); + void SaveSettings(); + +private: + bool InitAngelScript(); + asIScriptEngine* m_pScriptEngine; +}; + +#endif // _VORTEX_H_ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/XBMCTypes.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/XBMCTypes.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/XBMCTypes.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/XBMCTypes.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,201 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _XBMC_TYPES_H_ +#define _XBMC_TYPES_H_ + +// Having to duplicate some of the XBMC types here due to multiply externed +// vars if xbmc_addon_dll.h is included in the lib + +#include +#include +#include + + +typedef struct +{ + int type; + char* id; + char* label; + int current; + char** entry; + unsigned int entry_elements; +} StructSetting; + +class DllSetting +{ +public: + enum SETTING_TYPE { NONE=0, CHECK, SPIN }; + + DllSetting(SETTING_TYPE t, const char *n, const char *l) + { + id = NULL; + label = NULL; + if (n) + { + id = new char[strlen(n)+1]; + strcpy(id, n); + } + if (l) + { + label = new char[strlen(l)+1]; + strcpy(label, l); + } + current = 0; + type = t; + } + + DllSetting(const DllSetting &rhs) // copy constructor + { + id = NULL; + label = NULL; + if (rhs.id) + { + id = new char[strlen(rhs.id)+1]; + strcpy(id, rhs.id); + } + if (rhs.label) + { + label = new char[strlen(rhs.label)+1]; + strcpy(label, rhs.label); + } + current = rhs.current; + type = rhs.type; + for (unsigned int i = 0; i < rhs.entry.size(); i++) + { + char *lab = new char[strlen(rhs.entry[i]) + 1]; + strcpy(lab, rhs.entry[i]); + entry.push_back(lab); + } + } + + ~DllSetting() + { + delete[] id; + delete[] label; + for (unsigned int i=0; i < entry.size(); i++) + delete[] entry[i]; + } + + void AddEntry(const char *label) + { + if (!label || type != SPIN) return; + char *lab = new char[strlen(label) + 1]; + strcpy(lab, label); + entry.push_back(lab); + } + + // data members + SETTING_TYPE type; + char* id; + char* label; + int current; + std::vector entry; +}; + +class DllUtils +{ +public: + + static unsigned int VecToStruct(std::vector &vecSet, StructSetting*** sSet) + { + *sSet = NULL; + if(vecSet.size() == 0) + return 0; + + unsigned int uiElements=0; + + *sSet = (StructSetting**)malloc(vecSet.size()*sizeof(StructSetting*)); + for(unsigned int i=0;iid = NULL; + (*sSet)[i]->label = NULL; + uiElements++; + + if (vecSet[i].id && vecSet[i].label) + { + (*sSet)[i]->id = strdup(vecSet[i].id); + (*sSet)[i]->label = strdup(vecSet[i].label); + (*sSet)[i]->type = vecSet[i].type; + (*sSet)[i]->current = vecSet[i].current; + (*sSet)[i]->entry_elements = 0; + (*sSet)[i]->entry = NULL; + if(vecSet[i].type == DllSetting::SPIN && vecSet[i].entry.size() > 0) + { + (*sSet)[i]->entry = (char**)malloc(vecSet[i].entry.size()*sizeof(char**)); + for(unsigned int j=0;j 0) + { + (*sSet)[i]->entry[j] = strdup(vecSet[i].entry[j]); + (*sSet)[i]->entry_elements++; + } + } + } + } + } + return uiElements; + } + + static void StructToVec(unsigned int iElements, StructSetting*** sSet, std::vector *vecSet) + { + if(iElements == 0) + return; + + vecSet->clear(); + for(unsigned int i=0;itype, (*sSet)[i]->id, (*sSet)[i]->label); + if((*sSet)[i]->type == DllSetting::SPIN) + { + for(unsigned int j=0;j<(*sSet)[i]->entry_elements;j++) + { + vSet.AddEntry((*sSet)[i]->entry[j]); + } + } + vSet.current = (*sSet)[i]->current; + vecSet->push_back(vSet); + } + } + + static void FreeStruct(unsigned int iElements, StructSetting*** sSet) + { + if(iElements == 0) + return; + + for(unsigned int i=0;itype == DllSetting::SPIN) + { + for(unsigned int j=0;j<(*sSet)[i]->entry_elements;j++) + { + free((*sSet)[i]->entry[j]); + } + free((*sSet)[i]->entry); + } + free((*sSet)[i]->id); + free((*sSet)[i]->label); + free((*sSet)[i]); + } + free(*sSet); + } +}; +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/XmlDocument.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/XmlDocument.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/XmlDocument.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/XmlDocument.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,324 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// XmlDocument.cpp: implementation of the CXmlDocument class. +// +////////////////////////////////////////////////////////////////////// +#include "XmlDocument.h" +#include + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CXmlDocument::CXmlDocument() +{ + m_doc = 0; + m_size = 0; + m_nodes = 0; + + m_szTag[0] = 0; + m_szText[0] = 0; +} + +void CXmlDocument::Create(char* szString) +{ + m_size = strlen(szString); + m_doc = new char[m_size+1]; + memcpy(m_doc, szString, m_size+1); +} + +CXmlDocument::~CXmlDocument() +{ + if(m_doc) { + delete[] m_doc; + m_doc = NULL; + } +} + + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_load_doc +// Opens an XML document and loads it into memory. +// +int CXmlDocument::Load(char* szFile) +{ + FILE* hFile; + + hFile = fopen(szFile,"rb"); + if (hFile==NULL) + { + return -1; + } + + fseek(hFile,0,SEEK_END); + m_size = ftell(hFile); + + fseek(hFile,0,SEEK_SET); + + m_doc = new char[m_size]; + if (!m_doc) + { + m_size = 0; + fclose(hFile); + return -2; + } + + if (fread(m_doc, m_size, 1, hFile)<=0) + { + delete[] m_doc; + m_doc = 0; + m_size = 0; + fclose(hFile); + return -3; + } + + fclose(hFile); + return 0; +} + + + + + + + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_close_doc +// Closes XML document freeing up resources. +// +void CXmlDocument::Close() +{ + if (m_doc!=NULL) + { + delete[] m_doc; + m_doc =0; + } + + m_size =0; + m_nodes = 0; + m_szTag[0] = 0; + m_szText[0] = 0; +} + + + + +int CXmlDocument::GetNodeCount(char* szTag) +{ + m_nodes = 0; + + char* szCurrentTag; + XmlNode node; + + node = GetNextNode(XML_ROOT_NODE); + while (node>0) + { + szCurrentTag = GetNodeTag(node); + if ( !strcmpi(szCurrentTag,szTag) ) + m_nodes++; + + node = GetNextNode(node); + } + + return m_nodes; +} + + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_next_tag +// Moves the current position to the next tag. +// +XmlNode CXmlDocument::GetNextNode(XmlNode node) +{ + int openBracket = -1; + int closeBracket = -1; + int i; + char c; + + for (i=node; i') + { + closeBracket=i; + break; + } + } + } + + if ((openBracket>=0) && (closeBracket>=0)) + { + return openBracket+1; + } + + return 0; +} + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_get_tag_name +// Gets the tag name at the current position (max 32 chars!). +// +char* CXmlDocument::GetNodeTag(XmlNode node) +{ + int i; + char c; + + for (i=node; i') ) + { + memcpy(m_szTag,&m_doc[node],i-node); + m_szTag[i-node]=0; + return m_szTag; + } + } + + return 0; +} + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_get_child_tag +// Gets the position of the child tag. +// +XmlNode CXmlDocument::GetChildNode(XmlNode node, char* szTag) +{ + char szCurrentTag[32]; + char* szChildTag; + + // get parent node tag + strcpy(szCurrentTag,GetNodeTag(node)); + + // get child node + node = GetNextNode(node); + while (node>0) + { + // get child node tag + szChildTag = GetNodeTag(node); + + // does the child's tag match the one we're looking for + if ( !strcmpi(szChildTag,szTag) ) + return node; + + // is this actually the parent's closing tag? + else if ( !strcmpi(&szChildTag[1],szCurrentTag) ) + return 0; + + node = GetNextNode(node); + } + + return 0; +} + + + +////////////////////////////////////////////////////////////////////////////////// +// Function: xml_get_tag_text +// Gets the text of a given tag (max limit 128 chars!!). +// +char* CXmlDocument::GetNodeText(XmlNode node) +{ + int i,text=0; + int opens=1; + int elements=0; + char c; + for (i=node;i<(m_size-1);i++) + { + c = m_doc[i]; + + switch (c) + { + case '<': + opens++; + if (m_doc[i+1]!='/') + elements++; + else + elements--; + break; + case '>' : + opens--; + break; + case ' ' : + case '\n': + case '\r': + case '\t': + break; + default: + if ((opens==0) && (elements==0)) + text = i; + break; + } + + if (text) + break; + } + + if (!text) + return 0; + + for (i=text;i0) + { + szCurrentTag = GetNodeTag(node); + if ( !strcmpi(szCurrentTag,szTag) ) + pFunc(szTag,node); + + node = GetNextNode(node); + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/XmlDocument.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/XmlDocument.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Core/XmlDocument.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Core/XmlDocument.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,128 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// XmlDocument.h: interface for the CXmlDocument class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_XMLDOCUMENT_H__D68461F7_E0CE_4FA0_B1C9_0541610164E9__INCLUDED_) +#define AFX_XMLDOCUMENT_H__D68461F7_E0CE_4FA0_B1C9_0541610164E9__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include + +#include + +#define XML_ROOT_NODE 0 +#define XML_MAX_TAGNAME_SIZE 32 +#define XML_MAX_INNERTEXT_SIZE 1024 + +typedef int XmlNode; +typedef void (*XmlNodeCallback) (char* szTag, XmlNode node); + + + +class CXmlDocument +{ +public: + CXmlDocument(); + virtual ~CXmlDocument(); + + void Create(char* szString); + int Load(char* szFile); + void Close(); + + int GetNodeCount(char* tag); + + void EnumerateNodes(char* szTag, XmlNodeCallback pFunc); + + XmlNode GetChildNode(XmlNode node, char* szTag); + XmlNode GetNextNode(XmlNode node); + char* GetNodeText(XmlNode node); + char* GetNodeTag(XmlNode node); + +private: + + char* m_doc; + int m_size; + int m_nodes; + char m_szTag[XML_MAX_TAGNAME_SIZE]; + char m_szText[XML_MAX_INNERTEXT_SIZE]; +}; + +class WriteXML +{ +public: + WriteXML() { m_file = NULL; m_rootTag = NULL; }; + ~WriteXML() { Close(); }; + + bool Open(const char *szFile, const char *szOpeningTag) + { + remove(szFile); + if (!szFile || !szOpeningTag) return false; + m_file = fopen(szFile, "w"); + if (!m_file) return false; + m_rootTag = new char[strlen(szOpeningTag) + 1]; + strcpy(m_rootTag, szOpeningTag); + fprintf(m_file, "<%s>\n", m_rootTag); + return true; + }; + void Close() + { + if (m_file) + { + if (m_rootTag) + fprintf(m_file, "\n", m_rootTag); + fclose(m_file); + } + delete[] m_rootTag; + m_rootTag = NULL; + m_file = NULL; + }; + void WriteTag(const char *szTag, const char *data) + { + if (!m_file || !szTag || !data) return; + fprintf(m_file, "\t<%s>%s\n", szTag, data, szTag); + }; + void WriteTag(const char *szTag, int data, const char *format = "%i") + { + char temp[10]; + sprintf(temp, format, data); + WriteTag(szTag, temp); + }; + void WriteTag(const char *szTag, float data) + { + if (!m_file || !szTag) return; + fprintf(m_file, "\t<%s>%f\n", szTag, data, szTag); + }; + void WriteTag(const char *szTag, bool data) + { + if (!m_file || !szTag) return; + fprintf(m_file, "\t<%s>%s\n", szTag, data ? "true" : "false", szTag); + }; + +private: + char *m_rootTag; + FILE *m_file; +}; + +#endif // !defined(AFX_XMLDOCUMENT_H__D68461F7_E0CE_4FA0_B1C9_0541610164E9__INCLUDED_) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/Map.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/Map.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/Map.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/Map.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,283 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "map.h" +#include "angelscript.h" + +#include "Shader.h" + +#define GRID_WIDTH (32) +#define GRID_HEIGHT (24) + +#define NUM_INDICES (1584) + +#define TEX_WIDTH ( 1024 ) +#define TEX_HEIGHT ( 512 ) + +Map::Map() +{ + m_iCurrentTexture = 0; + m_timed = false; + m_tex1 = Renderer::CreateTexture(TEX_WIDTH, TEX_HEIGHT); + m_tex2 = Renderer::CreateTexture(TEX_WIDTH, TEX_HEIGHT); + + m_texture = m_tex1; + + m_vertices = NULL; + + Renderer::GetDevice()->CreateIndexBuffer( NUM_INDICES * 2, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &m_iBuffer, NULL ); + Renderer::GetDevice()->CreateVertexBuffer( GRID_WIDTH * GRID_HEIGHT * sizeof( PosColNormalUVVertex ), + D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, 0, D3DPOOL_DEFAULT, + &m_vBuffer, NULL ); + + PosColNormalUVVertex* v; + m_vBuffer->Lock( 0, 0, (void**)&v, 0 ); + + for (int y = 0; y < GRID_HEIGHT; y++) + { + for (int x = 0; x < GRID_WIDTH; x ++) + { + // 0-(32 / 2) / (32 / 2) = -1 + // 15-(32 / 2) / (32 / 2) = -1 + v->Coord.x = ((float)x - ((GRID_WIDTH -1 ) / 2.0f)) / ((GRID_WIDTH -1 ) / 2.0f); + v->Coord.y = -(((float)y - ((GRID_HEIGHT -1 ) / 2.0f)) / ((GRID_HEIGHT -1 ) / 2.0f)); +// v->Diffuse= 0xffffffff; + v->FDiffuse.x = 1.0f; + v->FDiffuse.y = 1.0f; + v->FDiffuse.z = 1.0f; + v->FDiffuse.w = 1.0f; + // v->coord. = 1.0f; + v->Coord.z = 0.0f; + // v->u = ((((float)x - ((GRID_WIDTH -1 ) / 2.0f)) / ((GRID_WIDTH -1 ) / 2.0f) * 256 + 256) * (1.0f / 512)) + (0.5f / 512); + // v->v = ((((float)y - ((GRID_HEIGHT -1 ) / 2.0f)) / ((GRID_HEIGHT -1 ) / 2.0f) * 256 + 256) * (1.0f / 512)) + (0.5f / 512); + v->u = ((float)x / (GRID_WIDTH -1));// + (0.5f / TEX_SIZE); + v->v = ((float)y / (GRID_HEIGHT -1));// + (0.5f / TEX_SIZE) ;//+ (5 / 512.0f); + v++; + } + } + m_vBuffer->Unlock(); + + + //--------------------------------------------------------------------------- + // Build indices + unsigned short* pIndices; + m_iBuffer->Lock( 0, 0, (void**)&pIndices, 0 ); + int numIndices = 0; + unsigned short iIndex = 0; + + for (int a = 0; a < GRID_HEIGHT; ++a) + { + for (int i = 0; i < GRID_WIDTH; ++i, pIndices += 2, ++iIndex ) + { + pIndices[ 0 ] = iIndex + GRID_WIDTH; + pIndices[ 1 ] = iIndex; + numIndices+=2; + } + + // connect two strips by inserting two degenerate triangles + if (GRID_WIDTH - 2 > a) + { + pIndices[0] = iIndex - 1; + pIndices[1] = iIndex + GRID_WIDTH; + + pIndices += 2; + numIndices += 2; + } + } + + m_numIndices = numIndices - 2; + + m_iBuffer->Unlock(); +} + +Map::~Map() +{ + if ( m_vertices != NULL ) + { + m_vBuffer->Unlock(); + m_vertices = NULL; + } + m_vBuffer->Release(); + m_iBuffer->Release(); + m_tex1->Release(); + m_tex2->Release(); +} + +__inline float MapCol( float a ) +{ + // static float speed = 1.02f; + float res = powf(1.02f, a); + if (res < 0) + res = 0; + else if (res > 1) + res = 1.0f; + return res; +} + +__inline float Clamp( float a ) +{ + if (a < 0) + a = 0; + else if (a > 1) + a = 1.0f; + return a; +} + +void Map::SetTimed() +{ + m_timed = true; +} + +void Map::SetValues(unsigned int x, unsigned int y, float uOffset, float vOffset, float r, float g, float b) +{ + int index = ((y )* GRID_WIDTH) + x; + if( index >= GRID_HEIGHT * GRID_WIDTH ) + { + return; + } + + if( m_vertices == NULL ) + { + m_vBuffer->Lock( 0, 0, (void**)&m_vertices, 0 ); + } + + PosColNormalUVVertex* v = &m_vertices[ index ]; + + static const float invWidth = 1.0f / ( GRID_WIDTH - 1 ); + static const float invHeight = 1.0f / ( GRID_HEIGHT - 1 ); + + if( m_timed ) + { + v->u = ((float)x * invWidth ) + (0.5f / TEX_WIDTH) + ( ( uOffset ) * invWidth ); + v->v = ((float)y * invHeight ) + (0.5f / TEX_HEIGHT) + ( ( vOffset ) * invHeight ); +/* unsigned char* col = (unsigned char*)&v->Diffuse; + col[3] = 0xff; + col[2] = int(MapCol(r) * 255); + col[1] = int(MapCol(g) * 255); + col[0] = int(MapCol(b) * 255); +*/ + v->FDiffuse.x = MapCol(r); + v->FDiffuse.y = MapCol(g); + v->FDiffuse.z = MapCol(b); + v->FDiffuse.w = 1.0f; + } + else + { + v->u = ((float)x * invWidth ) + (0.5f / TEX_WIDTH) + ((uOffset)); + v->v = ((float)y * invHeight ) + (0.5f / TEX_HEIGHT) + ((vOffset)); +// unsigned char* col = (unsigned char*)&v->Diffuse; +// col[3] = 0xff; +// col[2] = int(Clamp(r) * 255); +// col[1] = int(Clamp(g) * 255); +// col[0] = int(Clamp(b) * 255); + v->FDiffuse.x = r; + v->FDiffuse.y = g; + v->FDiffuse.z = b; + v->FDiffuse.w = 1; + } +} + +void Map::Render() +{ + if ( m_vertices != NULL ) + { + m_vBuffer->Unlock(); + m_vertices = NULL; + } + + if ( m_iCurrentTexture == 0 ) + { + Renderer::SetRenderTarget(m_tex1); + Renderer::SetTexture(m_tex2); + m_texture = m_tex1; + } + else + { + Renderer::SetRenderTarget(m_tex2); + Renderer::SetTexture(m_tex1); + m_texture = m_tex2; + } + + Renderer::PushMatrix(); + Renderer::SetIdentity(); + float oldAspect = Renderer::GetAspect(); + Renderer::SetAspect(0); + Renderer::Translate(0, 0, 2.414f); + + DiffuseUVVertexShader* pShader = &DiffuseUVVertexShader::StaticType; + Renderer::CommitTransforms( pShader ); + Renderer::CommitTextureState(); + Renderer::GetDevice()->SetVertexShader( pShader->GetVertexShader() ); + Renderer::GetDevice()->SetVertexDeclaration( g_pPosColUVDeclaration ); + + Renderer::GetDevice()->SetStreamSource( 0, + m_vBuffer, + 0, + sizeof( PosColNormalUVVertex ) ); + + Renderer::GetDevice()->SetIndices( m_iBuffer ); + + Renderer::GetDevice()->DrawIndexedPrimitive( D3DPT_TRIANGLESTRIP, 0, 0, GRID_WIDTH * GRID_HEIGHT, 0, 1514 ); + + Renderer::GetDevice()->SetStreamSource( 0, + NULL, + 0, + 0 ); + + Renderer::GetDevice()->SetIndices( NULL ); + + Renderer::SetTexture(NULL); + Renderer::PopMatrix(); + Renderer::SetAspect(oldAspect); + + m_iCurrentTexture = 1 - m_iCurrentTexture; + +} // Render + +//----------------------------------------------------------------------------- +// Script interface + +Map* Map_Factory() +{ + /* The class constructor is initializing the reference counter to 1*/ + return new Map(); +} + +void Map::RegisterScriptInterface( asIScriptEngine* pScriptEngine ) +{ +#ifndef assert +#define assert +#endif + int r; + + // Registering the reference type + r = pScriptEngine->RegisterObjectType("Map", 0, asOBJ_REF); assert(r >= 0); + + // Registering the factory behaviour + r = pScriptEngine->RegisterObjectBehaviour("Map", asBEHAVE_FACTORY, "Map@ f()", asFUNCTION(Map_Factory), asCALL_CDECL); assert( r >= 0 ); + + // Registering the addref/release behaviours + r = pScriptEngine->RegisterObjectBehaviour("Map", asBEHAVE_ADDREF, "void f()", asMETHOD(Map, AddRef), asCALL_THISCALL); assert(r >= 0); + r = pScriptEngine->RegisterObjectBehaviour("Map", asBEHAVE_RELEASE, "void f()", asMETHOD(Map, Release), asCALL_THISCALL); assert(r >= 0); + r = pScriptEngine->RegisterObjectMethod("Map", "void Render()", asMETHOD(Map, Render), asCALL_THISCALL); assert(r >= 0); + r = pScriptEngine->RegisterObjectMethod("Map", "void SetValues(int, int, float, float, float, float, float)", asMETHOD(Map, SetValues), asCALL_THISCALL); assert(r >= 0); + r = pScriptEngine->RegisterObjectMethod("Map", "void SetTimed()", asMETHOD(Map, SetTimed), asCALL_THISCALL); assert(r >= 0); + + r = pScriptEngine->RegisterObjectBehaviour("Map", asBEHAVE_IMPLICIT_REF_CAST, "EffectBase@ f()", asFUNCTION((refCast)), asCALL_CDECL_OBJLAST); assert( r >= 0 ); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/Map.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/Map.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/Map.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/Map.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,53 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _MAP_H_ +#define _MAP_H_ + +#include +#include "Renderer.h" +#include "EffectBase.h" + +class Map : public EffectBase +{ +public: + static void RegisterScriptInterface( class asIScriptEngine* ); + + Map(); + ~Map(); + void Init(); + void Render(); + void SetValues( unsigned int x, unsigned int y, float uOffset, float vOffset, float r, float g, float b); + void SetTimed(); + IDirect3DTexture9* GetTexture() { return m_texture; } + IDirect3DTexture9* GetRenderTarget() { return m_texture; } + +private: + IDirect3DVertexBuffer9* m_vBuffer; + IDirect3DIndexBuffer9* m_iBuffer; + LPDIRECT3DTEXTURE9 m_texture; + LPDIRECT3DTEXTURE9 m_tex1; + LPDIRECT3DTEXTURE9 m_tex2; + int m_iCurrentTexture; + PosColNormalUVVertex* m_vertices; + int m_numIndices; + bool m_timed; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/Tunnel.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/Tunnel.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/Tunnel.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/Tunnel.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,123 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "Tunnel.h" +#include "Renderer.h" +#include "angelscript.h" + +struct TunnelParameters +{ + float Time; + float XRadius; + float YRadius; + float XCounter; + float YCounter; + int CircleSegments; + int TunnelLength; + float TunnelZ; + float RotateX; + float RotateY; + float RotateZ; +}; + +float Min( float x, float y ) +{ + return x < y ? x : y; +} + +float Max( float x, float y ) +{ + return x > y ? x : y; +} + +float ApplySinX(int i, float time) +{ + const float radian = (i/40.0f*(2.0f*3.14159f)); + float returnvalue = sinf(radian/2.0f+time)+6.0f*cosf(radian/4.0f+time);//+6*cosf((radian+time)/10.0f); + return returnvalue*1.0f; +} + +float ApplySinY(int i, float time) +{ + const float radian = (i/40.0f*(2.0f*3.14159f)); + float returnvalue = 3.0f*sinf(radian/8.0f+time)+3.0f*cosf(radian/2.0f+time)*sinf(radian/4.0f+time); + return returnvalue*0.2f; +} + +void RenderTunnel( TunnelParameters& tp ) +{ + int TunnelLength = max( min( tp.TunnelLength, 100 ), 2 ); + int CircleSegments = max( min( tp.CircleSegments, 30 ), 3 ); + +// Renderer::RotateAxis(atanf((ApplySinX(3, tp.XCounter)-ApplySinX(0,tp.XCounter))/3.0f)*(180.0f/3.14159f), 0.0f, 1.0f, 0.0f); +// Renderer::RotateAxis(atanf((ApplySinY(0,tp.YCounter)-ApplySinY(7, tp.YCounter))/7.0f)*(180.0f/3.14159f), 1.0f, 0.0f, 0.0f); + + Renderer::RotateAxis( (tp.RotateZ) * 45, 0, 0, 1 ); + + Renderer::Translate( -ApplySinX( 0, tp.XCounter ), -ApplySinY( 0, tp.YCounter ), 0.0f ); + + for ( int z = 0; z < CircleSegments; z++ ) + { + Renderer::Begin( D3DPT_TRIANGLESTRIP ); + for ( int i = 0; i < TunnelLength; i++ ) + { + float col = 1-(((1.0f * i / TunnelLength))*1); + Renderer::Colour( col, col, col, col ); + Renderer::TexCoord( 1-((float)z/CircleSegments*4.0f), + 1 - ( (float)i / TunnelLength * 8 + tp.TunnelZ ) ); + Renderer::Vertex( tp.XRadius * sinf( (float)z / CircleSegments * ( 2.0f * 3.14159f ) ) + ApplySinX( i, tp.XCounter ), + tp.YRadius * cosf( (float)z / CircleSegments * ( 2.0f * 3.14159f ) ) + ApplySinY( i, tp.YCounter ), + (float)i ); + Renderer::TexCoord( 1 - ( ( (float)z + 1 ) / CircleSegments * 4.0f ), + 1 - ( (float)i / TunnelLength * 8 + tp.TunnelZ ) ); + Renderer::Vertex( tp.XRadius * sinf( ( (float)z + 1 ) / CircleSegments * ( 2.0f * 3.14159f ) ) + ApplySinX( i, tp.XCounter ), + tp.YRadius * cosf( ( (float)z + 1 ) / CircleSegments * ( 2.0f * 3.14159f ) ) + ApplySinY( i, tp.YCounter ), + (float)i ); + } + Renderer::End(); + } +} + +#ifndef assert +#define assert +#endif + +void Tunnel::RegisterScriptInterface( asIScriptEngine* pScriptEngine ) +{ + int r; + + //---------------------------------------------------------------------------- + // Register Tunnel Parameter structure + r = pScriptEngine->RegisterObjectType("TunnelParameters", sizeof(TunnelParameters), asOBJ_VALUE | asOBJ_POD); assert( r >= 0 ); + + // Register the object properties + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "float Time", offsetof(TunnelParameters, Time)); assert( r >= 0 ); + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "float XRadius", offsetof(TunnelParameters, XRadius)); assert( r >= 0 ); + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "float YRadius", offsetof(TunnelParameters, YRadius)); assert( r >= 0 ); + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "float XCounter", offsetof(TunnelParameters, XCounter)); assert( r >= 0 ); + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "float YCounter", offsetof(TunnelParameters, YCounter)); assert( r >= 0 ); + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "int CircleSegments", offsetof(TunnelParameters, CircleSegments)); assert( r >= 0 ); + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "int TunnelLength", offsetof(TunnelParameters, TunnelLength)); assert( r >= 0 ); + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "float TunnelZ", offsetof(TunnelParameters, TunnelZ)); assert( r >= 0 ); + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "float RotateX", offsetof(TunnelParameters, RotateX)); assert( r >= 0 ); + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "float RotateY", offsetof(TunnelParameters, RotateY)); assert( r >= 0 ); + r = pScriptEngine->RegisterObjectProperty("TunnelParameters", "float RotateZ", offsetof(TunnelParameters, RotateZ)); assert( r >= 0 ); + + r = pScriptEngine->RegisterGlobalFunction("void RenderTunnel(TunnelParameters& in)", asFUNCTION(RenderTunnel), asCALL_CDECL); assert(r >= 0); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/Tunnel.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/Tunnel.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/Tunnel.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/Tunnel.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,29 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _TUNNEL_H_ +#define _TUNNEL_H_ + +class Tunnel +{ +public: + static void RegisterScriptInterface( class asIScriptEngine* ); +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/VoicePrint.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/VoicePrint.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/VoicePrint.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/VoicePrint.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,286 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "VoicePrint.h" +#include +#include "Shader.h" +#include "angelscript.h" + +using namespace std; + +char ColourRemapPixelShaderSrc[] = +{ + " sampler2D SpectrumTexture : tex0; \n" + " sampler2D RemapTexture : tex1; \n" + " struct PS_INPUT \n" + " { \n" + " float2 Tex0 : TEXCOORD0; \n" + " }; \n" + " \n" + " void Main( PS_INPUT input, out float4 OutColor : COLOR0 ) \n" + " { \n" + " float4 SpecCol = tex2D( SpectrumTexture, input.Tex0 ); \n" + " OutColor = tex2D( RemapTexture, SpecCol.ra ); \n" + " } \n" + " \n" +}; + + +class ColourRemapPixelShader : public Shader +{ + DECLARE_SHADER(ColourRemapPixelShader); +public: + ColourRemapPixelShader( EShaderType ShaderType, char* pShaderSrc ) : Shader( ShaderType, pShaderSrc ){}; +}; + +IMPLEMENT_SHADER(ColourRemapPixelShader, ColourRemapPixelShaderSrc, ST_PIXEL); + +// TODO +float GetSpecLeft(int index); +extern float g_timePass; + +VoicePrint::VoicePrint() +{ + m_iCurrentTexture = 0; + m_tex1 = Renderer::CreateTexture(512, 512); + m_tex2 = Renderer::CreateTexture(512, 512); + m_colourMap = NULL; + + m_spectrumTexture = Renderer::CreateTexture(1, 512, D3DFMT_A8R8G8B8, true); + + m_speed = 0.008f; + m_minX = 0.99f; + m_maxX = 0.01f; + m_minY = 0.5f; + m_maxY = 0.5f; + +} // Constructor + +VoicePrint::~VoicePrint() +{ + if (m_colourMap) + { + Renderer::ReleaseTexture( m_colourMap ); + } + + if ( m_tex1 ) + m_tex1->Release(); + + if ( m_tex2 ) + m_tex2->Release(); + + if ( m_spectrumTexture ) + m_spectrumTexture->Release(); + +} // Destructor + +void VoicePrint::LoadColourMap(string& filename) +{ + char fullname[ 512 ]; + sprintf_s(fullname, 512, "%s%s", g_TexturePath, filename.c_str() ); + + m_colourMap = Renderer::LoadTexture( fullname ); + +} // LoadColourMap + +void VoicePrint::SetRect(float minX, float minY, float maxX, float maxY) +{ + m_minX = minX; + m_minY = minY; + m_maxX = maxX; + m_maxY = maxY; + +} // SetRect + +void VoicePrint::SetSpeed(float speed) +{ + const float MIN_SPEED = 0.004f; + const float MAX_SPEED = 0.02f; + + speed = min(speed, 1.0f); + speed = max(speed, 0.0f); + + m_speed = MIN_SPEED + speed * (MAX_SPEED - MIN_SPEED); + +} // SetSpeed + +void VoicePrint::Render() +{ + float mySpeed = m_speed;// * (g_timePass / (1.0f/50.0f)); + + //--------------------------------------------------------------------------- + // Update spectrum texture + D3DLOCKED_RECT lockedRect; + m_spectrumTexture->LockRect(0, &lockedRect, NULL, 0); + + unsigned char* data = (unsigned char*)lockedRect.pBits; + + for (int i=0; i<512; i++) + { + int val = ((int)(GetSpecLeft(i) * 0.8f * 255.0f)); + val = min(val, 255); + val = max(0, val); + + float xVal = (m_minX * 255) + (val * (m_maxX - m_minX)); + float yVal = ((m_minY * 255) + (val * (m_maxY - m_minY))); + + data[3] = (char)yVal; // r = y + data[2] = (char)xVal; // a = x + data += lockedRect.Pitch; + } + m_spectrumTexture->UnlockRect( 0 ); + + //--------------------------------------------------------------------------- + // Shift voiceprint texture to the left a bit + if ( m_iCurrentTexture == 0 ) + { + Renderer::SetRenderTarget( m_tex1 ); + Renderer::SetTexture( m_tex2 ); + m_texture = m_tex1; + } + else + { + Renderer::SetRenderTarget( m_tex2 ); + Renderer::SetTexture( m_tex1 ); + m_texture = m_tex2; + } + m_iCurrentTexture = 1 - m_iCurrentTexture; + + + Renderer::SetDrawMode2d(); + + DiffuseUVVertexShader* pShader = &DiffuseUVVertexShader::StaticType; + Renderer::CommitTransforms( pShader ); + Renderer::CommitTextureState(); + Renderer::GetDevice()->SetVertexShader( pShader->GetVertexShader() ); + Renderer::GetDevice()->SetVertexDeclaration( g_pPosColUVDeclaration ); + + for (int i = 0; i < 2; i++) + { + Renderer::GetDevice()->SetSamplerState( i, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); + Renderer::GetDevice()->SetSamplerState( i, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); + Renderer::GetDevice()->SetSamplerState( i, D3DSAMP_MINFILTER, D3DTEXF_POINT); + Renderer::GetDevice()->SetSamplerState( i, D3DSAMP_MAGFILTER, D3DTEXF_POINT); + } + + PosColNormalUVVertex v[4]; + + v[0].Coord.x = -1 - mySpeed; + v[0].Coord.y = -1; + v[0].Coord.z = 0.0f; +// v[0].Diffuse = 0xffffffff; + v[0].FDiffuse.x = 1.0f; + v[0].FDiffuse.y = 1.0f; + v[0].FDiffuse.z = 1.0f; + v[0].FDiffuse.w = 1.0f; + v[0].u = 0.0f + (0.5f / 512); + v[0].v = 0.0f + (0.5f / 512); + + v[1].Coord.x = 1 - mySpeed; + v[1].Coord.y = -1; + v[1].Coord.z = 0.0f; +// v[1].Diffuse = 0xffffffff; + v[1].FDiffuse = v[0].FDiffuse; + v[1].u = 1.0f + (0.5f / 512); + v[1].v = 0.0f + (0.5f / 512); + + v[2].Coord.x = 1 - mySpeed; + v[2].Coord.y = 1; + v[2].Coord.z = 0.0f; +// v[2].Diffuse = 0xffffffff; + v[2].FDiffuse = v[0].FDiffuse; + v[2].u = 1.0f + (0.5f / 512); + v[2].v = 1.0f + (0.5f / 512); + + v[3].Coord.x = -1 - mySpeed; + v[3].Coord.y = 1; + v[3].Coord.z = 0.0f; +// v[3].Diffuse = 0xffffffff; + v[3].FDiffuse = v[0].FDiffuse; + v[3].u = 0.0f + (0.5f / 512); + v[3].v = 1.0f + (0.5f / 512); + + Renderer::GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, &v, sizeof(PosColNormalUVVertex)); + + + //--------------------------------------------------------------------------- + // Draw this frame's voiceprint data to right hand side of voice print texture + Renderer::SetTexture(m_spectrumTexture); + Renderer::GetDevice()->SetTexture(1, m_colourMap); + ColourRemapPixelShader* pPShader = &ColourRemapPixelShader::StaticType; + + Renderer::GetDevice()->SetPixelShader( pPShader->GetPixelShader() ); + v[0].Coord.x = (1-mySpeed); + v[0].Coord.y = (-1); + v[1].Coord.x = (1); + v[1].Coord.y = (-1); + v[2].Coord.x = (1); + v[2].Coord.y = (1); + v[3].Coord.x = (1-mySpeed); + v[3].Coord.y = (1); + + Renderer::GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, &v, sizeof(PosColNormalUVVertex)); + for (int i = 0; i < 2; i++) + { + Renderer::GetDevice()->SetSamplerState( i, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); + Renderer::GetDevice()->SetSamplerState( i, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); + Renderer::GetDevice()->SetSamplerState( i, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + Renderer::GetDevice()->SetSamplerState( i, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + } + Renderer::GetDevice()->SetTexture(1, NULL); + Renderer::SetTexture(NULL); + Renderer::GetDevice()->SetPixelShader( NULL ); + Renderer::SetRenderTargetBackBuffer(); + +} // Render + +//----------------------------------------------------------------------------- +// Script interface + +VoicePrint* VoicePrint_Factory() +{ + /* The class constructor is initializing the reference counter to 1*/ + return new VoicePrint(); +} + +void VoicePrint::RegisterScriptInterface( asIScriptEngine* pScriptEngine ) +{ +#ifndef assert +#define assert +#endif + + int r; + + // Registering the reference type + r = pScriptEngine->RegisterObjectType("VoicePrint", 0, asOBJ_REF); assert(r >= 0); + + // Registering the factory behaviour + r = pScriptEngine->RegisterObjectBehaviour("VoicePrint", asBEHAVE_FACTORY, "VoicePrint@ f()", asFUNCTION(VoicePrint_Factory), asCALL_CDECL); assert( r >= 0 ); + + // Registering the addref/release behaviours + r = pScriptEngine->RegisterObjectBehaviour("VoicePrint", asBEHAVE_ADDREF, "void f()", asMETHOD(VoicePrint, AddRef), asCALL_THISCALL); assert(r >= 0); + r = pScriptEngine->RegisterObjectBehaviour("VoicePrint", asBEHAVE_RELEASE, "void f()", asMETHOD(VoicePrint, Release), asCALL_THISCALL); assert(r >= 0); + r = pScriptEngine->RegisterObjectMethod("VoicePrint", "void Render()", asMETHOD(VoicePrint, Render), asCALL_THISCALL); assert(r >= 0); + r = pScriptEngine->RegisterObjectMethod("VoicePrint", "void LoadColourMap(string& in)", asMETHOD(VoicePrint, LoadColourMap), asCALL_THISCALL); assert(r >= 0); + r = pScriptEngine->RegisterObjectMethod("VoicePrint", "void SetSpeed(float)", asMETHOD(VoicePrint, SetSpeed), asCALL_THISCALL); assert(r >= 0); + r = pScriptEngine->RegisterObjectMethod("VoicePrint", "void SetRect(float, float, float, float)", asMETHOD(VoicePrint, SetRect), asCALL_THISCALL); assert(r >= 0); + + r = pScriptEngine->RegisterObjectBehaviour("VoicePrint", asBEHAVE_IMPLICIT_REF_CAST, "EffectBase@ f()", asFUNCTION((refCast)), asCALL_CDECL_OBJLAST); assert( r >= 0 ); + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/VoicePrint.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/VoicePrint.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexVis/Effects/VoicePrint.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexVis/Effects/VoicePrint.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,56 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _VOICEPRINT_H_ +#define _VOICEPRINT_H_ + +#include +#include "Renderer.h" +#include "EffectBase.h" +#include + +class VoicePrint : public EffectBase +{ +public: + static void RegisterScriptInterface( class asIScriptEngine* ); + VoicePrint(); + ~VoicePrint(); + void Init(); + void Render(); + void LoadColourMap( std::string& filename ); + void SetRect(float minX, float minY, float maxX, float maxY); + void SetSpeed(float speed); + + IDirect3DTexture9* GetTexture() { return m_texture; } + +private: + int m_iCurrentTexture; + LPDIRECT3DTEXTURE9 m_texture; + LPDIRECT3DTEXTURE9 m_tex1; + LPDIRECT3DTEXTURE9 m_tex2; + LPDIRECT3DTEXTURE9 m_colourMap; + LPDIRECT3DTEXTURE9 m_spectrumTexture; + float m_speed; + float m_minX; + float m_maxX; + float m_minY; + float m_maxY; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexXBMC/VortexXBMC.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexXBMC/VortexXBMC.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/Vortex/VortexXBMC/VortexXBMC.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/Vortex/VortexXBMC/VortexXBMC.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,251 @@ +/* + * Copyright © 2010-2013 Team XBMC + * http://xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include +#include +#include +#include "Vortex.h" + +#include "../../../addons/include/xbmc_vis_dll.h" +#include "../../../addons/include/xbmc_addon_cpp_dll.h" + + +Vortex* g_Vortex = NULL; + +// settings vector +//StructSetting** g_structSettings; + +extern "C" ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + VIS_PROPS* visprops = (VIS_PROPS*)props; + + g_Vortex = new Vortex; + g_Vortex->Init( ( LPDIRECT3DDEVICE9 )visprops->device, visprops->x, visprops->y, visprops->width, visprops->height, visprops->pixelRatio ); + + return ADDON_STATUS_NEED_SAVEDSETTINGS; +} + +extern "C" void Start( int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName ) +{ + g_Vortex->Start( iChannels, iSamplesPerSec, iBitsPerSample, szSongName ); +} + +extern "C" void ADDON_Stop() +{ + if ( g_Vortex ) + { + g_Vortex->Shutdown(); + delete g_Vortex; + g_Vortex = NULL; + } +} + +extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +{ + g_Vortex->AudioData( pAudioData, iAudioDataLength, pFreqData, iFreqDataLength ); +} + +extern "C" void Render() +{ + g_Vortex->Render(); +} + +extern "C" void GetInfo(VIS_INFO* pInfo) +{ + pInfo->bWantsFreq = false; + pInfo->iSyncDelay = 0; +} + +extern "C" bool OnAction(long action, const void *param) +{ + bool handled = true; + if( action == VIS_ACTION_UPDATE_TRACK ) + { + VisTrack* visTrack = (VisTrack*) param; + g_Vortex->UpdateTrack( visTrack ); + } + else if( action == VIS_ACTION_UPDATE_ALBUMART ) + { + g_Vortex->UpdateAlbumArt( ( char* ) param ); + } + else if (action == VIS_ACTION_NEXT_PRESET) + { + g_Vortex->LoadNextPreset(); + } + else if (action == VIS_ACTION_PREV_PRESET) + { + g_Vortex->LoadPreviousPreset(); + } + else if (action == VIS_ACTION_LOAD_PRESET && param) + { + g_Vortex->LoadPreset( (*(int *)param) ); + } + else if (action == VIS_ACTION_LOCK_PRESET) + { + g_Vortex->GetUserSettings().PresetLocked = !g_Vortex->GetUserSettings().PresetLocked; + } + else if (action == VIS_ACTION_RANDOM_PRESET) + { + g_Vortex->LoadRandomPreset(); + } + else + { + handled = false; + } + + return handled; +} + +extern "C" unsigned int GetPresets(char ***presets) +{ + if( g_Vortex == NULL ) + { + return 0; + } + return g_Vortex->GetPresets( presets ); +} +//-- GetPreset ---------------------------------------------------------------- +// Return the index of the current playing preset +//----------------------------------------------------------------------------- +extern "C" unsigned GetPreset() +{ + if ( g_Vortex) + return g_Vortex->GetCurrentPresetIndex(); + return 0; +} + + +//-- IsLocked ----------------------------------------------------------------- +// Returns true if this add-on use settings +//----------------------------------------------------------------------------- +extern "C" bool IsLocked() +{ + if ( g_Vortex ) + return g_Vortex->GetUserSettings().PresetLocked; + else + return false; +} + +//-- Destroy------------------------------------------------------------------- +// Do everything before unload of this add-on +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Destroy() +{ + ADDON_Stop(); +} + +//-- HasSettings -------------------------------------------------------------- +// Returns true if this add-on use settings +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" bool ADDON_HasSettings() +{ + return true; +} + +//-- GetStatus --------------------------------------------------------------- +// Returns the current Status of this visualisation +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +extern "C" unsigned int ADDON_GetSettings(ADDON_StructSetting*** sSet) +{ + return 0; +} + +extern "C" void ADDON_FreeSettings() +{ + +} + +extern "C" ADDON_STATUS ADDON_SetSetting(const char* id, const void* value) +{ + if ( !id || !value || g_Vortex == NULL ) + return ADDON_STATUS_UNKNOWN; + + UserSettings& userSettings = g_Vortex->GetUserSettings(); + + if (strcmpi(id, "Use Preset") == 0) + { + OnAction(34, &value); + } + else if (strcmpi(id, "RandomPresets") == 0) + { + userSettings.RandomPresetsEnabled = *(bool*)value == 1; + } + else if (strcmpi(id, "TimeBetweenPresets") == 0) + { + userSettings.TimeBetweenPresets = (float)(*(int*)value * 5 + 5); + } + else if (strcmpi(id, "AdditionalRandomTime") == 0) + { + userSettings.TimeBetweenPresetsRand = (float)(*(int*)value * 5 ); + } + else if (strcmpi(id, "EnableTransitions") == 0) + { + userSettings.TransitionsEnabled = *(bool*)value == 1; + } + else if (strcmpi(id, "StopFirstPreset") == 0) + { + userSettings.StopFirstPreset = *(bool*)value == 1; + } + else if (strcmpi(id, "ShowFPS") == 0) + { + userSettings.ShowFPS = *(bool*)value == 1; + } + else if (strcmpi(id, "ShowDebugConsole") == 0) + { + userSettings.ShowDebugConsole = *(bool*)value == 1; + } + else if (strcmpi(id, "ShowAudioAnalysis") == 0) + { + userSettings.ShowAudioAnalysis = *(bool*)value == 1; + } + else if (strcmpi(id, "LockPreset") == 0) + { + userSettings.PresetLocked = *(bool*)value == 1; + } + else + return ADDON_STATUS_UNKNOWN; + + return ADDON_STATUS_OK; +} + +//-- GetSubModules ------------------------------------------------------------ +// Return any sub modules supported by this vis +//----------------------------------------------------------------------------- +extern "C" unsigned int GetSubModules(char ***presets) +{ + return 0; // this vis supports 0 sub modules +} + +//-- Announce ----------------------------------------------------------------- +// Receive announcements from XBMC +//----------------------------------------------------------------------------- +extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Main.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Main.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Main.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Main.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,304 @@ +/* + * Copyright (C) 2008-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +// Waveform.vis +// A simple visualisation example by MrC + +#include "addons/include/xbmc_vis_dll.h" +#include +#ifdef HAS_GL +#include +#else +#ifdef _WIN32 +#include +#endif +#endif + +char g_visName[512]; +#ifndef HAS_GL +LPDIRECT3DDEVICE9 g_device; +#else +void* g_device; +#endif +float g_fWaveform[2][512]; + +#ifdef HAS_GL +typedef struct { + int X; + int Y; + int Width; + int Height; + int MinZ; + int MaxZ; +} D3DVIEWPORT9; +typedef unsigned long D3DCOLOR; +#endif + +D3DVIEWPORT9 g_viewport; + +struct Vertex_t +{ + float x, y, z; + D3DCOLOR col; +}; + +#ifndef HAS_GL +#define VERTEX_FORMAT (D3DFVF_XYZ | D3DFVF_DIFFUSE) +#endif + +//-- Create ------------------------------------------------------------------- +// Called on load. Addon should fully initalize or return error status +//----------------------------------------------------------------------------- +ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + VIS_PROPS* visProps = (VIS_PROPS*)props; + +#ifndef HAS_GL + g_device = (LPDIRECT3DDEVICE9)visProps->device; +#else + g_device = visProps->device; +#endif + g_viewport.X = visProps->x; + g_viewport.Y = visProps->y; + g_viewport.Width = visProps->width; + g_viewport.Height = visProps->height; + g_viewport.MinZ = 0; + g_viewport.MaxZ = 1; + + return ADDON_STATUS_OK; +} + +//-- Start -------------------------------------------------------------------- +// Called when a new soundtrack is played +//----------------------------------------------------------------------------- +extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName) +{ + //printf("Got Start Command\n"); +} + +//-- Audiodata ---------------------------------------------------------------- +// Called by XBMC to pass new audio data to the vis +//----------------------------------------------------------------------------- +extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +{ + int ipos=0; + while (ipos < 512) + { + for (int i=0; i < iAudioDataLength; i+=2) + { + g_fWaveform[0][ipos] = pAudioData[i ]; // left channel + g_fWaveform[1][ipos] = pAudioData[i+1]; // right channel + ipos++; + if (ipos >= 512) break; + } + } +} + + +//-- Render ------------------------------------------------------------------- +// Called once per frame. Do all rendering here. +//----------------------------------------------------------------------------- +extern "C" void Render() +{ + Vertex_t verts[512]; + +#ifndef HAS_GL + g_device->SetFVF(VERTEX_FORMAT); + g_device->SetPixelShader(NULL); +#endif + + // Left channel +#ifdef HAS_GL + GLenum errcode; + glColor3f(1.0, 1.0, 1.0); + glDisable(GL_BLEND); + glPushMatrix(); + glTranslatef(0,0,-1.0); + glBegin(GL_LINE_STRIP); +#endif + for (int i = 0; i < 256; i++) + { + verts[i].col = 0xffffffff; + verts[i].x = g_viewport.X + ((i / 255.0f) * g_viewport.Width); + verts[i].y = g_viewport.Y + g_viewport.Height * 0.33f + (g_fWaveform[0][i] * g_viewport.Height * 0.15f); + verts[i].z = 1.0; +#ifdef HAS_GL + glVertex2f(verts[i].x, verts[i].y); +#endif + } + +#ifdef HAS_GL + glEnd(); + if ((errcode=glGetError())!=GL_NO_ERROR) { + printf("Houston, we have a GL problem: %s\n", gluErrorString(errcode)); + } +#elif !defined(HAS_GL) + g_device->DrawPrimitiveUP(D3DPT_LINESTRIP, 255, verts, sizeof(Vertex_t)); +#endif + + // Right channel +#ifdef HAS_GL + glBegin(GL_LINE_STRIP); +#endif + for (int i = 0; i < 256; i++) + { + verts[i].col = 0xffffffff; + verts[i].x = g_viewport.X + ((i / 255.0f) * g_viewport.Width); + verts[i].y = g_viewport.Y + g_viewport.Height * 0.66f + (g_fWaveform[1][i] * g_viewport.Height * 0.15f); + verts[i].z = 1.0; +#ifdef HAS_GL + glVertex2f(verts[i].x, verts[i].y); +#endif + } + +#ifdef HAS_GL + glEnd(); + glEnable(GL_BLEND); + glPopMatrix(); + if ((errcode=glGetError())!=GL_NO_ERROR) { + printf("Houston, we have a GL problem: %s\n", gluErrorString(errcode)); + } +#elif !defined(HAS_GL) + g_device->DrawPrimitiveUP(D3DPT_LINESTRIP, 255, verts, sizeof(Vertex_t)); +#endif + +} + +//-- GetInfo ------------------------------------------------------------------ +// Tell XBMC our requirements +//----------------------------------------------------------------------------- +extern "C" void GetInfo(VIS_INFO* pInfo) +{ + pInfo->bWantsFreq = false; + pInfo->iSyncDelay = 0; +} + +//-- OnAction ----------------------------------------------------------------- +// Handle XBMC actions such as next preset, lock preset, album art changed etc +//----------------------------------------------------------------------------- +extern "C" bool OnAction(long flags, const void *param) +{ + bool ret = false; + return ret; +} + +//-- GetPresets --------------------------------------------------------------- +// Return a list of presets to XBMC for display +//----------------------------------------------------------------------------- +extern "C" unsigned int GetPresets(char ***presets) +{ + return 0; +} + +//-- GetPreset ---------------------------------------------------------------- +// Return the index of the current playing preset +//----------------------------------------------------------------------------- +extern "C" unsigned GetPreset() +{ + return 0; +} + +//-- IsLocked ----------------------------------------------------------------- +// Returns true if this add-on use settings +//----------------------------------------------------------------------------- +extern "C" bool IsLocked() +{ + return false; +} + +//-- GetSubModules ------------------------------------------------------------ +// Return any sub modules supported by this vis +//----------------------------------------------------------------------------- +extern "C" unsigned int GetSubModules(char ***names) +{ + return 0; // this vis supports 0 sub modules +} + +//-- Stop --------------------------------------------------------------------- +// This dll must stop all runtime activities +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Stop() +{ +} + +//-- Detroy ------------------------------------------------------------------- +// Do everything before unload of this add-on +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Destroy() +{ +} + +//-- HasSettings -------------------------------------------------------------- +// Returns true if this add-on use settings +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" bool ADDON_HasSettings() +{ + return false; +} + +//-- GetStatus --------------------------------------------------------------- +// Returns the current Status of this visualisation +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +//-- GetSettings -------------------------------------------------------------- +// Return the settings for XBMC to display +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +//-- FreeSettings -------------------------------------------------------------- +// Free the settings struct passed from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- + +extern "C" void ADDON_FreeSettings() +{ +} + +//-- SetSetting --------------------------------------------------------------- +// Set a specific Setting value (called from XBMC) +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_SetSetting(const char *strSetting, const void* value) +{ + return ADDON_STATUS_OK; +} + +//-- Announce ----------------------------------------------------------------- +// Receive announcements from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Main_gles.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Main_gles.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Main_gles.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Main_gles.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,337 @@ +/* XMMS - Cross-platform multimedia player + * Copyright (C) 1998-2000 Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * Wed May 24 10:49:37 CDT 2000 + * Fixes to threading/context creation for the nVidia X4 drivers by + * Christian Zander + */ + +/* + * Ported to GLES by gimli + */ + + + +#include +#include +#if defined(__APPLE__) + #include + #include +#else + #include + #include +#endif + +#include "addons/include/xbmc_vis_dll.h" +#include "VisGUIShader.h" + +#define NUM_BANDS 16 + +#ifndef M_PI +#define M_PI 3.141592654f +#endif +#define DEG2RAD(d) ( (d) * M_PI/180.0f ) + +/*GLfloat x_angle = 20.0f, x_speed = 0.0f; +GLfloat y_angle = 45.0f, y_speed = 0.5f; +GLfloat z_angle = 0.0f, z_speed = 0.0f; +GLfloat heights[16][16], cHeights[16][16], scale; +GLfloat hSpeed = 0.025f; +GLenum g_mode = GL_TRIANGLES; +*/ +float g_fWaveform[2][512]; + +const char *frag = "precision mediump float; \n" + "varying lowp vec4 m_colour; \n" + "void main () \n" + "{ \n" + " gl_FragColor = m_colour; \n" + "}\n"; + +const char *vert = "attribute vec4 m_attrpos;\n" + "attribute vec4 m_attrcol;\n" + "attribute vec4 m_attrcord0;\n" + "attribute vec4 m_attrcord1;\n" + "varying vec4 m_cord0;\n" + "varying vec4 m_cord1;\n" + "varying lowp vec4 m_colour;\n" + "uniform mat4 m_proj;\n" + "uniform mat4 m_model;\n" + "void main ()\n" + "{\n" + " mat4 mvp = m_proj * m_model;\n" + " gl_Position = mvp * m_attrpos;\n" + " m_colour = m_attrcol;\n" + " m_cord0 = m_attrcord0;\n" + " m_cord1 = m_attrcord1;\n" + "}\n"; + +CVisGUIShader *vis_shader = NULL; + +//-- Create ------------------------------------------------------------------- +// Called on load. Addon should fully initalize or return error status +//----------------------------------------------------------------------------- +ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + vis_shader = new CVisGUIShader(vert, frag); + + if(!vis_shader) + return ADDON_STATUS_UNKNOWN; + + if(!vis_shader->CompileAndLink()) + { + delete vis_shader; + return ADDON_STATUS_UNKNOWN; + } + + return ADDON_STATUS_NEED_SETTINGS; +} + +//-- Render ------------------------------------------------------------------- +// Called once per frame. Do all rendering here. +//----------------------------------------------------------------------------- +extern "C" void Render() +{ + GLfloat col[256][3]; + GLfloat ver[256][3]; + GLubyte idx[256]; + + glDisable(GL_BLEND); + + vis_shader->MatrixMode(MM_PROJECTION); + vis_shader->PushMatrix(); + vis_shader->LoadIdentity(); + //vis_shader->Frustum(-1.0f, 1.0f, -1.0f, 1.0f, 1.5f, 10.0f); + vis_shader->MatrixMode(MM_MODELVIEW); + vis_shader->PushMatrix(); + vis_shader->LoadIdentity(); + + vis_shader->PushMatrix(); + vis_shader->Translatef(0.0f ,0.0f ,-1.0f); + vis_shader->Rotatef(0.0f, 1.0f, 0.0f, 0.0f); + vis_shader->Rotatef(0.0f, 0.0f, 1.0f, 0.0f); + vis_shader->Rotatef(0.0f, 0.0f, 0.0f, 1.0f); + + vis_shader->Enable(); + + GLint posLoc = vis_shader->GetPosLoc(); + GLint colLoc = vis_shader->GetColLoc(); + + glVertexAttribPointer(colLoc, 3, GL_FLOAT, 0, 0, col); + glVertexAttribPointer(posLoc, 3, GL_FLOAT, 0, 0, ver); + + glEnableVertexAttribArray(posLoc); + glEnableVertexAttribArray(colLoc); + + for (int i = 0; i < 256; i++) + { + col[i][0] = 128; + col[i][1] = 128; + col[i][2] = 128; + //ver[i][0] = g_viewport.X + ((i / 255.0f) * g_viewport.Width); + //ver[i][1] = g_viewport.Y + g_viewport.Height * 0.33f + (g_fWaveform[0][i] * g_viewport.Height * 0.15f); + ver[i][0] = -1.0f + ((i / 255.0f) * 2.0f); + ver[i][1] = 0.5f + g_fWaveform[0][i]; + ver[i][2] = 1.0f; + idx[i] = i; + } + + glDrawElements(GL_LINE_STRIP, 256, GL_UNSIGNED_BYTE, idx); + + // Right channel + for (int i = 0; i < 256; i++) + { + col[i][0] = 128; + col[i][1] = 128; + col[i][2] = 128; + //ver[i][0] = g_viewport.X + ((i / 255.0f) * g_viewport.Width); + //ver[i][1] = g_viewport.Y + g_viewport.Height * 0.66f + (g_fWaveform[1][i] * g_viewport.Height * 0.15f); + ver[i][0] = -1.0f + ((i / 255.0f) * 2.0f); + ver[i][1] = -0.5f + g_fWaveform[1][i]; + ver[i][2] = 1.0f; + idx[i] = i; + + } + + glDrawElements(GL_LINE_STRIP, 256, GL_UNSIGNED_BYTE, idx); + + glDisableVertexAttribArray(posLoc); + glDisableVertexAttribArray(colLoc); + + vis_shader->Disable(); + + vis_shader->PopMatrix(); + + vis_shader->PopMatrix(); + vis_shader->MatrixMode(MM_PROJECTION); + vis_shader->PopMatrix(); + + glEnable(GL_BLEND); + +} + +extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName) +{ +} + +extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +{ + int ipos=0; + while (ipos < 512) + { + for (int i=0; i < iAudioDataLength; i+=2) + { + g_fWaveform[0][ipos] = pAudioData[i ]; // left channel + g_fWaveform[1][ipos] = pAudioData[i+1]; // right channel + ipos++; + if (ipos >= 512) break; + } + } +} + + +//-- GetInfo ------------------------------------------------------------------ +// Tell XBMC our requirements +//----------------------------------------------------------------------------- +extern "C" void GetInfo(VIS_INFO* pInfo) +{ + pInfo->bWantsFreq = false; + pInfo->iSyncDelay = 0; +} + + +//-- GetSubModules ------------------------------------------------------------ +// Return any sub modules supported by this vis +//----------------------------------------------------------------------------- +extern "C" unsigned int GetSubModules(char ***names) +{ + return 0; // this vis supports 0 sub modules +} + +//-- OnAction ----------------------------------------------------------------- +// Handle XBMC actions such as next preset, lock preset, album art changed etc +//----------------------------------------------------------------------------- +extern "C" bool OnAction(long flags, const void *param) +{ + bool ret = false; + return ret; +} + +//-- GetPresets --------------------------------------------------------------- +// Return a list of presets to XBMC for display +//----------------------------------------------------------------------------- +extern "C" unsigned int GetPresets(char ***presets) +{ + return 0; +} + +//-- GetPreset ---------------------------------------------------------------- +// Return the index of the current playing preset +//----------------------------------------------------------------------------- +extern "C" unsigned GetPreset() +{ + return 0; +} + +//-- IsLocked ----------------------------------------------------------------- +// Returns true if this add-on use settings +//----------------------------------------------------------------------------- +extern "C" bool IsLocked() +{ + return false; +} + +//-- Stop --------------------------------------------------------------------- +// This dll must cease all runtime activities +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Stop() +{ +} + +//-- Destroy ------------------------------------------------------------------ +// Do everything before unload of this add-on +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Destroy() +{ + if (vis_shader) + { + vis_shader->Free(); + delete vis_shader; + vis_shader = NULL; + } +} + +//-- HasSettings -------------------------------------------------------------- +// Returns true if this add-on use settings +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" bool ADDON_HasSettings() +{ + return true; +} + +//-- GetStatus --------------------------------------------------------------- +// Returns the current Status of this visualisation +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +//-- GetSettings -------------------------------------------------------------- +// Return the settings for XBMC to display +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +//-- FreeSettings -------------------------------------------------------------- +// Free the settings struct passed from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- + +extern "C" void ADDON_FreeSettings() +{ +} + +//-- SetSetting --------------------------------------------------------------- +// Set a specific Setting value (called from XBMC) +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_SetSetting(const char *strSetting, const void* value) +{ +// return ADDON_STATUS_OK; + return ADDON_STATUS_UNKNOWN; +} + +//-- Announce ----------------------------------------------------------------- +// Receive announcements from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Makefile.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,37 @@ +ARCH=@ARCH@ +CXXFLAGS=-fPIC + +ifeq (@USE_ANDROID@,1) +SLIB = @abs_top_srcdir@/system/libvisWaveform.so +else +SLIB = @abs_top_srcdir@/addons/visualization.waveform/Waveform.vis +endif + +ifeq (@USE_OPENGLES@,1) + DEFINES += -DHAS_GLES=2 + INCLUDES+= -I@abs_top_srcdir@/xbmc/visualizations/EGLHelpers + OBJS = Main_gles.o + OBJS += @abs_top_srcdir@/xbmc/visualizations/EGLHelpers/eglhelpers.a + ifeq ($(findstring osx,$(ARCH)), osx) + LDFLAGS += -framework OpenGLES + else + LDFLAGS += -lGLESv2 + endif +else + OBJS = Main.o + DEFINES += -DHAS_GL + ifeq ($(findstring osx,$(ARCH)), osx) + LDFLAGS += -framework OpenGL + else + LDFLAGS += -lGL -lGLU + endif +endif + +$(SLIB): $(OBJS) +ifeq ($(findstring osx,$(ARCH)), osx) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -bundle -o $@ $(OBJS) +else + $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -o $@ $(OBJS) +endif + +include @abs_top_srcdir@/Makefile.include diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Waveform.sln kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Waveform.sln --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Waveform.sln 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Waveform.sln 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,27 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Waveform", "Waveform.vcproj", "{D450FE9A-CE56-4496-B4AB-379094E642F2}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug (DirectX) = Debug (DirectX) + Debug (OpenGL) = Debug (OpenGL) + Release (DirectX) = Release (DirectX) + Release (OpenGL) = Release (OpenGL) + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Debug (DirectX).ActiveCfg = Debug (DirectX)|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Debug (DirectX).Build.0 = Debug (DirectX)|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Debug (OpenGL).ActiveCfg = Debug (OpenGL)|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Debug (OpenGL).Build.0 = Debug (OpenGL)|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Release (DirectX).ActiveCfg = Release (DirectX)|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Release (DirectX).Build.0 = Release (DirectX)|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Release (OpenGL).ActiveCfg = Release (OpenGL)|Win32 + {D450FE9A-CE56-4496-B4AB-379094E642F2}.Release (OpenGL).Build.0 = Release (OpenGL)|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Waveform.vcxproj kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Waveform.vcxproj --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Waveform.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Waveform.vcxproj 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,101 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + visWaveform + {D450FE9A-CE56-4496-B4AB-379094E642F2} + visWaveform + Win32Proj + + + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + true + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)libs\$(TargetName)\$(Configuration)\ + $(SolutionDir)objs\$(TargetName)\$(Configuration)\ + $(SolutionDir)libs\$(TargetName)\$(Configuration)\ + $(SolutionDir)objs\$(TargetName)\$(Configuration)\ + .vis + .vis + Waveform_win32 + Waveform_win32 + $(SolutionDir)\..\..\xbmc;$(SolutionDir)\..\BuildDependencies\include;$(IncludePath) + $(SolutionDir)\..\..\xbmc;$(SolutionDir)\..\BuildDependencies\include;$(IncludePath) + + + + WAVEFORM_EXPORTS;_WIN32PC;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) + + + + + + + $(OutDir)$(TargetName)$(TargetExt) + $(OutDir)Waveform.pdb + false + + + $(OutDir)Waveform.lib + + + copy "$(TargetPath)" "$(SolutionDir)..\..\addons\visualization.waveform\$(TargetFileName)" + + + + + _USRDLL;WAVEFORM_EXPORTS;_WIN32PC;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) + + + + + + + $(OutDir)$(TargetName)$(TargetExt) + false + + + $(OutDir)Waveform.lib + + + copy "$(TargetPath)" "$(SolutionDir)..\..\addons\visualization.waveform\$(TargetFileName)" + + + + + + + + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Waveform.vcxproj.filters kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Waveform.vcxproj.filters --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/WaveForm/Waveform.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/WaveForm/Waveform.vcxproj.filters 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/build_projectM_win32.sh kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/build_projectM_win32.sh --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/build_projectM_win32.sh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/build_projectM_win32.sh 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,6 @@ + +SRC="libprojectM/SOIL.c libprojectM/image_DXT.c libprojectM/image_helper.c libprojectM/stb_image_aug.c" + +gcc -c -O2 -DUSE_FBO -IlibprojectM/ -I../../../lib/libSDL-WIN32/include/ -Iwin32/pthreads -I../../../visualisations/ Main.cpp libprojectM/*.cpp ${SRC} +gcc -g -s -shared -o ../../../visualisations/ProjectM_win32.vis *.o -lopengl32 -lstdc++ -lglew32 -Lwin32/glew/ +rm *.o \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Algorithms.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Algorithms.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Algorithms.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Algorithms.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,68 @@ +#ifndef PROJECTM_ALGORITHMS_HPP +#define PROJECTM_ALGORITHMS_HPP +#include +/// A collection of algorithms generically written over map style containers +namespace Algorithms +{ + + template + void traverse(Container & container) + { + + TraverseFunctor functor; + + for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos) + { + assert(pos->second); + functor(pos->second); + } + + } + + + template + void traverseVector(Container & container) + { + + TraverseFunctor functor; + + for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos) + { + assert(*pos); + functor(*pos); + } + + } + + template + void traverse(Container & container, TraverseFunctor & functor) + { + + for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos) + { + assert(pos->second); + functor(pos->second); + } + + } + + namespace TraverseFunctors + { + template + class DeleteFunctor + { + + public: + + void operator() (Data * data) + { + assert(data); + delete(data); + } + + }; + } + + +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BeatDetect.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BeatDetect.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BeatDetect.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BeatDetect.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,190 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * Takes sound data from wherever and returns beat detection values + * Uses statistical Energy-Based methods. Very simple + * + * Some stuff was taken from Frederic Patin's beat-detection article, + * you'll find it online + */ + +#include +#include + +#include "wipemalloc.h" + +#include "Common.hpp" +#include "PCM.hpp" +#include +#include "BeatDetect.hpp" + +#ifdef _WIN32 +#define DLLEXPORT +#endif + +DLLEXPORT BeatDetect::BeatDetect(PCM *pcm) { + int x,y; + + this->pcm=pcm; + + this->vol_instant=0; + this->vol_history=0; + + for (y=0;y<80;y++) + { + this->vol_buffer[y]=0; + } + + this->beat_buffer_pos=0; + + for (x=0;x<32;x++) { + this->beat_instant[x]=0; + this->beat_history[x]=0; + this->beat_val[x]=1.0; + this->beat_att[x]=1.0; + this->beat_variance[x]=0; + for (y=0;y<80;y++) { + this->beat_buffer[x][y]=0; + } + } + + this->treb = 0; + this->mid = 0; + this->bass = 0; + this->vol_old = 0; + this->beat_sensitivity = 10.00; + this->treb_att = 0; + this->mid_att = 0; + this->bass_att = 0; + this->vol = 0; + + + } + +DLLEXPORT BeatDetect::~BeatDetect() +{ + +} + +void BeatDetect::reset() { + this->treb = 0; + this->mid = 0; + this->bass = 0; + this->treb_att = 0; + this->mid_att = 0; + this->bass_att = 0; + } + +void BeatDetect::detectFromSamples() { + vol_old = vol; + bass=0;mid=0;treb=0; + + getBeatVals(pcm->pcmdataL,pcm->pcmdataR); + } + +void BeatDetect::getBeatVals( float *vdataL,float *vdataR ) { + + int linear=0; + int x,y; + float temp2=0; + + vol_instant=0; + for ( x=0;x<16;x++) + { + + beat_instant[x]=0; + for ( y=linear*2;y<(linear+8+x)*2;y++) + { + beat_instant[x]+=((vdataL[y]*vdataL[y])+(vdataR[y]*vdataR[y]))*(1.0/(8+x)); +// printf( "beat_instant[%d]: %f %f %f\n", x, beat_instant[x], vdataL[y], vdataR[y] ); + vol_instant+=((vdataL[y]*vdataL[y])+(vdataR[y]*vdataR[y]))*(1.0/512.0); + + } +//printf("1"); + linear=y/2; + beat_history[x]-=(beat_buffer[x][beat_buffer_pos])*.0125; + beat_buffer[x][beat_buffer_pos]=beat_instant[x]; + beat_history[x]+=(beat_instant[x])*.0125; + + beat_val[x]=(beat_instant[x])/(beat_history[x]); + + beat_att[x]+=(beat_instant[x])/(beat_history[x]); + +//printf("2\n"); + + } +//printf("b\n"); + vol_history-=(vol_buffer[beat_buffer_pos])*.0125; + vol_buffer[beat_buffer_pos]=vol_instant; + vol_history+=(vol_instant)*.0125; + + mid=0; + for(x=1;x<10;x++) + { + mid+=(beat_instant[x]); + temp2+=(beat_history[x]); + + } + + mid=mid/(1.5*temp2); + temp2=0; + treb=0; + for(x=10;x<16;x++) + { + treb+=(beat_instant[x]); + temp2+=(beat_history[x]); + } +//printf("c\n"); + treb=treb/(1.5*temp2); +// *vol=vol_instant/(1.5*vol_history); + vol=vol_instant/(1.5*vol_history); + + bass=(beat_instant[0])/(1.5*beat_history[0]); + + + if ( projectM_isnan( treb ) ) { + treb = 0.0; + } + if ( projectM_isnan( mid ) ) { + mid = 0.0; + } + if ( projectM_isnan( bass ) ) { + bass = 0.0; + } + treb_att=.6 * treb_att + .4 * treb; + mid_att=.6 * mid_att + .4 * mid; + bass_att=.6 * bass_att + .4 * bass; + + if(bass_att>100)bass_att=100; + if(bass >100)bass=100; + if(mid_att>100)mid_att=100; + if(mid >100)mid=100; + if(treb_att>100)treb_att=100; + if(treb >100)treb=100; + if(vol>100)vol=100; + + // *vol=(beat_instant[3])/(beat_history[3]); + beat_buffer_pos++; + if( beat_buffer_pos>79)beat_buffer_pos=0; + +} + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BeatDetect.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BeatDetect.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BeatDetect.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BeatDetect.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,73 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Beat detection class. Takes decompressed sound buffers and returns + * various characteristics + * + * $Log$ + * + */ + +#ifndef _BEAT_DETECT_H +#define _BEAT_DETECT_H + +#include "PCM.hpp" + +class BeatDetect +{ + public: + /** Vars */ + float beat_buffer[32][80], + beat_instant[32], + beat_history[32]; + float beat_val[32], + beat_att[32], + beat_variance[32]; + int beat_buffer_pos; + float vol_buffer[80], + vol_instant, + vol_history; + + float treb ; + float mid ; + float bass ; + float vol_old ; + float beat_sensitivity; + float treb_att ; + float mid_att ; + float bass_att ; + float vol; + + PCM *pcm; + + /** Methods */ + BeatDetect(PCM *pcm); + ~BeatDetect(); + void initBeatDetect(); + void reset(); + void detectFromSamples(); + void getBeatVals ( float *vdataL, float *vdataR ); + +}; + +#endif /** !_BEAT_DETECT_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinFuncs.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinFuncs.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinFuncs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinFuncs.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,159 @@ +// +// C++ Implementation: BuiltinFuncs +// +// Description: +// +// +// Author: Carmelo Piccione , (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +/* Loads all builtin functions */ + + +/* Loads a builtin function */ +#include "BuiltinFuncs.hpp" +#include +#include "Algorithms.hpp" +#include +#include "fatal.h" +using namespace Algorithms; + +std::map BuiltinFuncs::builtin_func_tree; + +int BuiltinFuncs::load_builtin_func(const std::string & name, float (*func_ptr)(float*), int num_args) { + + Func * func; + int retval; + + /* Create new function */ + func = new Func(name, func_ptr, num_args); + + if (func == NULL) + return PROJECTM_OUTOFMEM_ERROR; + + retval = insert_func( func ); + + return retval; + +} + +Func * BuiltinFuncs::find_func(const std::string & name) { + + std::map::iterator pos = builtin_func_tree.find(name); + + // Case: function not found, return null + if (pos == builtin_func_tree.end()) + return 0; + + // Case: function found, return a pointer to it + return pos->second; + +} + +int BuiltinFuncs::load_all_builtin_func() { + + if (load_builtin_func("int", FuncWrappers::int_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("abs", FuncWrappers::abs_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("sin", FuncWrappers::sin_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("cos", FuncWrappers::cos_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("tan", FuncWrappers::tan_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("asin", FuncWrappers::asin_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("acos", FuncWrappers::acos_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("atan", FuncWrappers::atan_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("sqr", FuncWrappers::sqr_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("sqrt", FuncWrappers::sqrt_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("pow", FuncWrappers::pow_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("exp", FuncWrappers::exp_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("log", FuncWrappers::log_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("log10", FuncWrappers::log10_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("sign", FuncWrappers::sign_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("min", FuncWrappers::min_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("max", FuncWrappers::max_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("sigmoid", FuncWrappers::sigmoid_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("atan2", FuncWrappers::atan2_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("rand", FuncWrappers::rand_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("band", FuncWrappers::band_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("bor", FuncWrappers::bor_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("bnot", FuncWrappers::bnot_wrapper, 1) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("if", FuncWrappers::if_wrapper, 3) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("equal", FuncWrappers::equal_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("above", FuncWrappers::above_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("below", FuncWrappers::below_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("nchoosek", FuncWrappers::nchoosek_wrapper, 2) < 0) + return PROJECTM_ERROR; + if (load_builtin_func("fact", FuncWrappers::fact_wrapper, 1) < 0) + return PROJECTM_ERROR; + + return PROJECTM_SUCCESS; +} + + +/* Initialize the builtin function database. + Should only be necessary once */ +int BuiltinFuncs::init_builtin_func_db() { + int retval; + + retval = load_all_builtin_func(); + return retval; +} + + + +/* Destroy the builtin function database. + Generally, do this on projectm exit */ +int BuiltinFuncs::destroy_builtin_func_db() { + +traverse >(builtin_func_tree); + +builtin_func_tree.clear(); + +return PROJECTM_SUCCESS; +} + +/* Insert a function into the database */ +int BuiltinFuncs::insert_func( Func *func ) { + + assert(func); + std::pair::iterator, bool> inserteePair = + builtin_func_tree.insert(std::make_pair(std::string(func->getName()), func)); + + if (!inserteePair.second && builtin_func_tree.find(func->getName()) == builtin_func_tree.end()) { + std::cerr << "Failed to insert builtin function \"" << func->getName() << "\" into collection! Bailing..." << std::endl; + abort(); + + } + + return PROJECTM_SUCCESS; +} + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinFuncs.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinFuncs.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinFuncs.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinFuncs.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,234 @@ +// +// C++ Interface: BuiltinFuncs +// +// Description: +// +// +// Author: Carmelo Piccione , (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef _BUILTIN_FUNCS_HPP +#define _BUILTIN_FUNCS_HPP + +#include "Common.hpp" +#include "Func.hpp" +#include +#include +#include + +#include "RandomNumberGenerators.hpp" + +/* Wrappers for all the builtin functions + The arg_list pointer is a list of floats. Its + size is equal to the number of arguments the parameter + takes */ +class FuncWrappers { + +/* Values to optimize the sigmoid function */ +static const int R = 32767; +static const int RR = 65534; + +public: + +static inline float int_wrapper(float * arg_list) { + +return floor(arg_list[0]); + +} + + +static inline float sqr_wrapper(float * arg_list) { + +return pow(2, (int)arg_list[0]); +} + + +static inline float sign_wrapper(float * arg_list) { + +return -arg_list[0]; +} + +static inline float min_wrapper(float * arg_list) { + +if (arg_list[0] > arg_list[1]) +return arg_list[1]; + +return arg_list[0]; +} + +static inline float max_wrapper(float * arg_list) { + +if (arg_list[0] > arg_list[1]) +return arg_list[0]; + +return arg_list[1]; +} + +/* consult your AI book */ +static inline float sigmoid_wrapper(float * arg_list) { +return (RR / (1 + exp( -(((float)(arg_list[0])) * arg_list[1]) / R) - R)); +} + + +static inline float bor_wrapper(float * arg_list) { + +return (float)((int)arg_list[0] || (int)arg_list[1]); +} + +static inline float band_wrapper(float * arg_list) { +return (float)((int)arg_list[0] && (int)arg_list[1]); +} + +static inline float bnot_wrapper(float * arg_list) { +return (float)(!(int)arg_list[0]); +} + +static inline float if_wrapper(float * arg_list) { + +if ((int)arg_list[0] == 0) +return arg_list[2]; +return arg_list[1]; +} + + +static inline float rand_wrapper(float * arg_list) { +float l=1; + +// printf("RAND ARG:(%d)\n", (int)arg_list[0]); +if ((int)arg_list[0] > 0) + l = (float) RandomNumberGenerators::uniformInteger((int)arg_list[0]); + +return l; +} + +static inline float equal_wrapper(float * arg_list) { + return (arg_list[0] == arg_list[1]); +} + + +static inline float above_wrapper(float * arg_list) { + +return (arg_list[0] > arg_list[1]); +} + + +static inline float below_wrapper(float * arg_list) { + +return (arg_list[0] < arg_list[1]); +} + +static float sin_wrapper(float * arg_list) { + + assert(arg_list); +//return .5; +float d = sinf(*arg_list); +return d; +//return (sin (arg_list[0])); +} + + +static inline float cos_wrapper(float * arg_list) { +return (cos (arg_list[0])); +} + +static inline float tan_wrapper(float * arg_list) { +return (tan(arg_list[0])); +} + +static inline float asin_wrapper(float * arg_list) { +return (asin (arg_list[0])); +} + +static inline float acos_wrapper(float * arg_list) { +return (acos (arg_list[0])); +} + +static inline float atan_wrapper(float * arg_list) { +return (atan (arg_list[0])); +} + +static inline float atan2_wrapper(float * arg_list) { +return (atan2 (arg_list[0], arg_list[1])); +} + +static inline float pow_wrapper(float * arg_list) { +return (pow (arg_list[0], arg_list[1])); +} + +static inline float exp_wrapper(float * arg_list) { +return (exp(arg_list[0])); +} + +static inline float abs_wrapper(float * arg_list) { +return (fabs(arg_list[0])); +} + +static inline float log_wrapper(float* arg_list) { +return (log (arg_list[0])); +} + +static inline float log10_wrapper(float * arg_list) { +return (log10 (arg_list[0])); +} + +static inline float sqrt_wrapper(float * arg_list) { +return (sqrt (arg_list[0])); +} + + +static inline float nchoosek_wrapper(float * arg_list) { +unsigned long cnm = 1UL; +int i, f; +int n, m; + +n = (int)arg_list[0]; +m = (int)arg_list[1]; + +if (m*2 >n) m = n-m; +for (i=1 ; i <= m; n--, i++) +{ +if ((f=n) % i == 0) +f /= i; +else cnm /= i; +cnm *= f; +} +return (float)cnm; +} + + +static inline float fact_wrapper(float * arg_list) { + + +int result = 1; + +int n = (int)arg_list[0]; + +while (n > 1) { +result = result * n; +n--; +} +return (float)result; +} +}; + +#include +class BuiltinFuncs { + +public: + + static int init_builtin_func_db(); + static int destroy_builtin_func_db(); + static int load_all_builtin_func(); + static int load_builtin_func( const std::string & name, float (*func_ptr)(float*), int num_args ); + + static int insert_func( Func *func ); + static int remove_func( Func *func ); + static Func *find_func( const std::string & name ); +private: + static std::map builtin_func_tree; +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinParams.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinParams.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinParams.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinParams.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,393 @@ +#include +#include +#include +#include + +#include "fatal.h" +#include "BuiltinParams.hpp" +#include "Algorithms.hpp" +#include "InitCondUtils.hpp" + + +using namespace Algorithms; + +BuiltinParams::BuiltinParams() {} + +BuiltinParams::BuiltinParams(const PresetInputs & presetInputs, PresetOutputs & presetOutputs) +{ + + int ret; + if ((ret = init_builtin_param_db(presetInputs, presetOutputs)) != PROJECTM_SUCCESS) + { + std::cout << "failed to allocate builtin parameter database with error " << ret << std::endl;; + throw ret; + } + +} + +BuiltinParams::~BuiltinParams() +{ + destroy_builtin_param_db(); +} + +/* Loads a float parameter into the builtin database */ +int BuiltinParams::load_builtin_param_float(const std::string & name, void * engine_val, void * matrix, short int flags, + float init_val, float upper_bound, float lower_bound, const std::string & alt_name) +{ + + Param * param = NULL; + CValue iv, ub, lb; + + iv.float_val = init_val; + ub.float_val = upper_bound; + lb.float_val = lower_bound; + + /* Create new parameter of type float */ + if (BUILTIN_PARAMS_DEBUG == 2) + { + printf("load_builtin_param_float: (name \"%s\") (alt_name = \"%s\") ", name.c_str(), alt_name.c_str()); + fflush(stdout); + } + +std::string lowerName(name); +std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); + + if ((param = new Param(lowerName, P_TYPE_DOUBLE, flags, engine_val, matrix, iv, ub, lb)) == NULL) + { + return PROJECTM_OUTOFMEM_ERROR; + } + + if (BUILTIN_PARAMS_DEBUG == 2) + { + printf("created..."); + fflush(stdout); + } + + /* Insert the paremeter into the database */ + + if (insert_builtin_param( param ) < 0) + { + delete param; + return PROJECTM_ERROR; + } + + if (BUILTIN_PARAMS_DEBUG == 2) + { + printf("inserted..."); + fflush(stdout); + } + + /* If this parameter has an alternate name, insert it into the database as link */ + + if (alt_name != "") + { + std::string alt_lower_name(alt_name); + std::transform(alt_lower_name.begin(), alt_lower_name.end(), alt_lower_name.begin(), tolower); + insert_param_alt_name(param,alt_lower_name); + + if (BUILTIN_PARAMS_DEBUG == 2) + { + printf("alt_name inserted..."); + fflush(stdout); + } + + + } + + if (BUILTIN_PARAMS_DEBUG == 2) printf("finished\n"); + + /* Finished, return success */ + return PROJECTM_SUCCESS; +} + + + +/* Destroy the builtin parameter database. + Generally, do this on projectm exit */ +int BuiltinParams::destroy_builtin_param_db() +{ + + Algorithms::traverse >(builtin_param_tree); + return PROJECTM_SUCCESS; +} + + +/* Insert a parameter into the database with an alternate name */ +int BuiltinParams::insert_param_alt_name(Param * param, const std::string & alt_name) +{ + + assert(param); + + aliasMap.insert(std::make_pair(alt_name, param->name)); + + return PROJECTM_SUCCESS; +} + +Param * BuiltinParams::find_builtin_param(const std::string & name) +{ + + + + AliasMap::iterator pos = aliasMap.find(name); + Param * param = 0; + //std::cerr << "[BuiltinParams] find_builtin_param: name is " << name << std::endl; + if (pos == aliasMap.end()) + { + std::map::iterator builtinPos = builtin_param_tree.find(name); + + if (builtinPos != builtin_param_tree.end()) { + // std::cerr << "[BuiltinParams] find_builtin_param: found it directly." << std::endl; + param = builtinPos->second; + } + } + else + { + + std::map::iterator builtinPos = builtin_param_tree.find(pos->second); + + if (builtinPos != builtin_param_tree.end()) { + //std::cerr << "[BuiltinParams] find_builtin_param: found it indirectly." << std::endl; + param = builtinPos->second; + +} + } + return param; +} + + +/* Loads a integer parameter into the builtin database */ +int BuiltinParams::load_builtin_param_int(const std::string & name, void * engine_val, short int flags, + int init_val, int upper_bound, int lower_bound, const std::string &alt_name) +{ + + Param * param; + CValue iv, ub, lb; + + iv.int_val = init_val; + ub.int_val = upper_bound; + lb.int_val = lower_bound; + +std::string lowerName(name); +std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); + param = new Param(lowerName, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb); + + if (param == NULL) + { + return PROJECTM_OUTOFMEM_ERROR; + } + + if (insert_builtin_param( param ) < 0) + { + delete param; + return PROJECTM_ERROR; + } + + if (alt_name != "") + { + std::string alt_lower_name(alt_name); + std::transform(alt_lower_name.begin(), alt_lower_name.end(), alt_lower_name.begin(), tolower); + insert_param_alt_name(param,alt_lower_name); + + } + + return PROJECTM_SUCCESS; + +} + +/* Loads a boolean parameter */ +int BuiltinParams::load_builtin_param_bool(const std:: string & name, void * engine_val, short int flags, + int init_val, const std::string &alt_name) +{ + + Param * param; + CValue iv, ub, lb; + + iv.int_val = init_val; + ub.int_val = TRUE; + lb.int_val = false; + +std::string lowerName(name); +std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); + + param = new Param(lowerName, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb); + + if (param == NULL) + { + return PROJECTM_OUTOFMEM_ERROR; + } + + if (insert_builtin_param(param) < 0) + { + delete param; + return PROJECTM_ERROR; + } + + if (alt_name != "") + { + std::string alt_lower_name(alt_name); + std::transform(alt_lower_name.begin(), alt_lower_name.end(), alt_lower_name.begin(), tolower); + insert_param_alt_name(param,alt_lower_name); + } + + return PROJECTM_SUCCESS; + +} + +/* Inserts a parameter into the builtin database */ +int BuiltinParams::insert_builtin_param( Param *param ) +{ + std::pair::iterator, bool> inserteePos = builtin_param_tree.insert(std::make_pair(param->name, param)); + + return inserteePos.second; +} + + + +/* Initialize the builtin parameter database. + Should only be necessary once */ +int BuiltinParams::init_builtin_param_db(const PresetInputs & presetInputs, PresetOutputs & presetOutputs) +{ + + if (BUILTIN_PARAMS_DEBUG) + { + printf("init_builtin_param: loading database..."); + fflush(stdout); + } + + /* Loads all builtin parameters into the database */ + if (load_all_builtin_param(presetInputs, presetOutputs) < 0) + { + if (BUILTIN_PARAMS_DEBUG) printf("failed loading builtin parameters (FATAL)\n"); + return PROJECTM_ERROR; + } + + if (BUILTIN_PARAMS_DEBUG) printf("success!\n"); + + /* Finished, no errors */ + return PROJECTM_SUCCESS; +} + + + +/* Loads all builtin parameters, limits are also defined here */ +int BuiltinParams::load_all_builtin_param(const PresetInputs & presetInputs, PresetOutputs & presetOutputs) +{ + + load_builtin_param_float("frating", (void*)&presetOutputs.fRating, NULL, P_FLAG_NONE, 0.0 , 5.0, 0.0, ""); + load_builtin_param_float("fwavescale", (void*)&presetOutputs.fWaveScale, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("gamma", (void*)&presetOutputs.fGammaAdj, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fGammaAdj"); + load_builtin_param_float("echo_zoom", (void*)&presetOutputs.fVideoEchoZoom, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fVideoEchoZoom"); + load_builtin_param_float("echo_alpha", (void*)&presetOutputs.fVideoEchoAlpha, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fvideoechoalpha"); + load_builtin_param_float("wave_a", (void*)&presetOutputs.fWaveAlpha, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fwavealpha"); + load_builtin_param_float("fwavesmoothing", (void*)&presetOutputs.fWaveSmoothing, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); + load_builtin_param_float("fmodwavealphastart", (void*)&presetOutputs.fModWaveAlphaStart, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); + load_builtin_param_float("fmodwavealphaend", (void*)&presetOutputs.fModWaveAlphaEnd, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); + load_builtin_param_float("fWarpAnimSpeed", (void*)&presetOutputs.fWarpAnimSpeed, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); + load_builtin_param_float("fWarpScale", (void*)&presetOutputs.fWarpScale, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); + // load_builtin_param_float("warp", (void*)&presetOutputs.warp, warp_mesh, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, ""); + + load_builtin_param_float("fshader", (void*)&presetOutputs.fShader, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); + load_builtin_param_float("decay", (void*)&presetOutputs.decay, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fdecay"); + + load_builtin_param_int("echo_orient", (void*)&presetOutputs.nVideoEchoOrientation, P_FLAG_NONE, 0, 3, 0, "nVideoEchoOrientation"); + load_builtin_param_int("wave_mode", (void*)&presetOutputs.nWaveMode, P_FLAG_NONE, 0, 7, 0, "nwavemode"); + + load_builtin_param_bool("wave_additive", (void*)&presetOutputs.bAdditiveWaves, P_FLAG_NONE, false, "bAdditiveWaves"); + load_builtin_param_bool("bmodwavealphabyvolume", (void*)&presetOutputs.bModWaveAlphaByVolume, P_FLAG_NONE, false, ""); + load_builtin_param_bool("wave_brighten", (void*)&presetOutputs.bMaximizeWaveColor, P_FLAG_NONE, false, "bMaximizeWaveColor"); + load_builtin_param_bool("wrap", (void*)&presetOutputs.bTexWrap, P_FLAG_NONE, false, "btexwrap"); + load_builtin_param_bool("darken_center", (void*)&presetOutputs.bDarkenCenter, P_FLAG_NONE, false, "bdarkencenter"); + load_builtin_param_bool("bredbluestereo", (void*)&presetOutputs.bRedBlueStereo, P_FLAG_NONE, false, ""); + load_builtin_param_bool("brighten", (void*)&presetOutputs.bBrighten, P_FLAG_NONE, false, "bbrighten"); + load_builtin_param_bool("darken", (void*)&presetOutputs.bDarken, P_FLAG_NONE, false, "bdarken"); + load_builtin_param_bool("solarize", (void*)&presetOutputs.bSolarize, P_FLAG_NONE, false, "bsolarize"); + load_builtin_param_bool("invert", (void*)&presetOutputs.bInvert, P_FLAG_NONE, false, "binvert"); + load_builtin_param_bool("bmotionvectorson", (void*)&presetOutputs.bMotionVectorsOn, P_FLAG_NONE, false, ""); + load_builtin_param_bool("wave_dots", (void*)&presetOutputs.bWaveDots, P_FLAG_NONE, false, "bwavedots"); + load_builtin_param_bool("wave_thick", (void*)&presetOutputs.bWaveThick, P_FLAG_NONE, false, "bwavethick"); + load_builtin_param_float("warp", (void*)&presetOutputs.warp, presetOutputs.warp_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); + load_builtin_param_float("zoom", (void*)&presetOutputs.zoom, presetOutputs.zoom_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); + load_builtin_param_float("rot", (void*)&presetOutputs.rot, presetOutputs.rot_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); + /// @note added huge bug fix here potentially by prevening zoomexp_mesh from being freed when presets dealloc + load_builtin_param_float("zoomexp", (void*)&presetOutputs.zoomexp, presetOutputs.zoomexp_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE , 0.0, MAX_DOUBLE_SIZE, 0, "fzoomexponent"); + + load_builtin_param_float("cx", (void*)&presetOutputs.cx, presetOutputs.cx_mesh, P_FLAG_PER_PIXEL | P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); + load_builtin_param_float("cy", (void*)&presetOutputs.cy, presetOutputs.cy_mesh, P_FLAG_PER_PIXEL | P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); + load_builtin_param_float("dx", (void*)&presetOutputs.dx, presetOutputs.dx_mesh, P_FLAG_PER_PIXEL | P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); + load_builtin_param_float("dy", (void*)&presetOutputs.dy, presetOutputs.dy_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); + load_builtin_param_float("sx", (void*)&presetOutputs.sx, presetOutputs.sx_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); + load_builtin_param_float("sy", (void*)&presetOutputs.sy, presetOutputs.sy_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, ""); + + load_builtin_param_float("wave_r", (void*)&presetOutputs.wave_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("wave_g", (void*)&presetOutputs.wave_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("wave_b", (void*)&presetOutputs.wave_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("wave_x", (void*)&presetOutputs.wave_x, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("wave_y", (void*)&presetOutputs.wave_y, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("wave_mystery", (void*)&presetOutputs.wave_mystery, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, "fWaveParam"); + + load_builtin_param_float("ob_size", (void*)&presetOutputs.ob_size, NULL, P_FLAG_NONE, 0.0, 0.5, 0, ""); + load_builtin_param_float("ob_r", (void*)&presetOutputs.ob_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("ob_g", (void*)&presetOutputs.ob_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("ob_b", (void*)&presetOutputs.ob_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("ob_a", (void*)&presetOutputs.ob_a, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + + load_builtin_param_float("ib_size", (void*)&presetOutputs.ib_size, NULL,P_FLAG_NONE, 0.0, .5, 0.0, ""); + load_builtin_param_float("ib_r", (void*)&presetOutputs.ib_r, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("ib_g", (void*)&presetOutputs.ib_g, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("ib_b", (void*)&presetOutputs.ib_b, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("ib_a", (void*)&presetOutputs.ib_a, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + + load_builtin_param_float("mv_r", (void*)&presetOutputs.mv_r, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("mv_g", (void*)&presetOutputs.mv_g, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("mv_b", (void*)&presetOutputs.mv_b, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("mv_x", (void*)&presetOutputs.mv_x, NULL,P_FLAG_NONE, 0.0, 64.0, 0.0, "nmotionvectorsx"); + load_builtin_param_float("mv_y", (void*)&presetOutputs.mv_y, NULL,P_FLAG_NONE, 0.0, 48.0, 0.0, "nmotionvectorsy"); + load_builtin_param_float("mv_l", (void*)&presetOutputs.mv_l, NULL,P_FLAG_NONE, 0.0, 5.0, 0.0, ""); + load_builtin_param_float("mv_dy", (void*)&presetOutputs.mv_dy, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, ""); + load_builtin_param_float("mv_dx", (void*)&presetOutputs.mv_dx, NULL,P_FLAG_NONE, 0.0, 1.0, -1.0, ""); + load_builtin_param_float("mv_a", (void*)&presetOutputs.mv_a, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, ""); + + load_builtin_param_float("time", (void*)&presetInputs.time, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, ""); + load_builtin_param_float("bass", (void*)&presetInputs.bass, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, ""); + load_builtin_param_float("mid", (void*)&presetInputs.mid, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, ""); + + load_builtin_param_float("treb", (void*)&presetInputs.treb, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, ""); + + + load_builtin_param_float("mood_r", (void*)&presetInputs.mood_r, NULL,P_FLAG_READONLY, 0.0, 1.0, 0.0, ""); + load_builtin_param_float("mood_g", (void*)&presetInputs.mood_g, NULL,P_FLAG_READONLY, 0.0, 1.0, 0, ""); + load_builtin_param_float("mood_b", (void*)&presetInputs.mood_b, NULL,P_FLAG_READONLY, 0.0, 1.0, 0, ""); + + load_builtin_param_float("bass_att", (void*)&presetInputs.bass_att, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, ""); + load_builtin_param_float("mid_att", (void*)&presetInputs.mid_att, NULL, P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, ""); + load_builtin_param_float("treb_att", (void*)&presetInputs.treb_att, NULL, P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, ""); + load_builtin_param_int("frame", (void*)&presetInputs.frame, P_FLAG_READONLY, 0, MAX_INT_SIZE, 0, ""); + load_builtin_param_float("progress", (void*)&presetInputs.progress, NULL,P_FLAG_READONLY, 0.0, 1, 0, ""); + load_builtin_param_int("fps", (void*)&presetInputs.fps, P_FLAG_READONLY, 15, MAX_INT_SIZE, 0, ""); + + load_builtin_param_float("x", (void*)&presetInputs.x_per_pixel, presetInputs.x_mesh, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_NONE, + 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("y", (void*)&presetInputs.y_per_pixel, presetInputs.y_mesh, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX |P_FLAG_READONLY | P_FLAG_NONE, + 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("ang", (void*)&presetInputs.ang_per_pixel, presetInputs.theta_mesh, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_NONE, + 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("rad", (void*)&presetInputs.rad_per_pixel, presetInputs.rad_mesh, P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_NONE, + 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + + load_builtin_param_float("q1", (void*)&presetOutputs.q1, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("q2", (void*)&presetOutputs.q2, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("q3", (void*)&presetOutputs.q3, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("q4", (void*)&presetOutputs.q4, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("q5", (void*)&presetOutputs.q5, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("q6", (void*)&presetOutputs.q6, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("q7", (void*)&presetOutputs.q7, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + load_builtin_param_float("q8", (void*)&presetOutputs.q8, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + + /* variables added in 1.04 */ + load_builtin_param_int("meshx", (void*)&presetInputs.gx, P_FLAG_READONLY, 32, 96, 8, ""); + load_builtin_param_int("meshy", (void*)&presetInputs.gy, P_FLAG_READONLY, 24, 72, 6, ""); + + return PROJECTM_SUCCESS; + +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinParams.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinParams.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinParams.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/BuiltinParams.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,84 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ + + +/** BuiltinParams.hpp :: a class to encapsulate and centralize + * all projectm builtin parameter methods and state. Used primarily + * by preset class +**/ +#ifndef _BUILTIN_PARAMS_HPP +#define _BUILTIN_PARAMS_HPP + +#include +#include +#include "PresetFrameIO.hpp" +#include "Param.hpp" +#include +#include "Algorithms.hpp" + +class BuiltinParams { + +public: + typedef std::map AliasMap; + + /** Default constructor leaves database in an uninitialized state. */ + BuiltinParams(); + + /** Construct a new builtin parameter database with variables references given by + * the preset input and output structures */ + BuiltinParams(const PresetInputs & presetInputs, PresetOutputs & presetOutputs); + + ~BuiltinParams(); + + /** Param database initalizer / destructor functions */ + int init_builtin_param_db(const PresetInputs & presetInputs, PresetOutputs & presetOutputs); + int load_all_builtin_param(const PresetInputs & presetInputs, PresetOutputs & presetOutputs); + int destroy_builtin_param_db(); + + int insert_param_alt_name( Param *param, const std::string& salt_name ); + Param *find_builtin_param( const std::string & name ); + int load_builtin_param_float( const std::string & name, void *engine_val, void *matrix, + short int flags, + float init_val, float upper_bound, + float lower_bound, const std::string & alt_name ); + int load_builtin_param_int( const std::string & name, void *engine_val, short int flags, + int init_val, int upper_bound, + int lower_bound, const std::string & alt_name ); + int load_builtin_param_bool( const std::string & name, void *engine_val, short int flags, + int init_val, const std::string & alt_name ); + int insert_builtin_param( Param *param ); + + template + void traverse(Fun & fun) { + Algorithms::traverse(builtin_param_tree, fun); + } + + +private: + static const bool BUILTIN_PARAMS_DEBUG = false; + + // Used to associate multiple string names to one parameter + AliasMap aliasMap; + + // Internal datastructure to store the parameters + std::map builtin_param_tree; +}; +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/carbontoprojectM.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/carbontoprojectM.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/carbontoprojectM.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/carbontoprojectM.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,105 @@ +r/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: carbontoprojectM.hpp,v 1.2 2004/11/12 15:12:58 cvs Exp $ + * + * Translates CARBON -> projectM variables + * + * $Log$ + */ + +#ifndef _CARBONTOPROJECTM_H +#define _CARBONTOPROJECTM_H + +#include "event.h" + +#ifdef WIN32 +#else +#endif + +projectMEvent carbon2pmEvent( EventRecord *event ) { \ +\ + switch ( event->what ) { \ + case updateEvt: \ + return PROJECTM_VIDEORESIZE; \ + case keyUp: \ + return PROJECTM_KEYUP; \ + case keyDown: \ + return PROJECTM_KEYDOWN; \ + default: + return PROJECTM_KEYUP; \ + } \ + } \ + +projectMKeycode carbon2pmKeycode( EventRecord *event ) { \ + projectMKeycode char_code = (projectMKeycode)(event->message & charCodeMask); \ + switch ( char_code ) { \ + case kFunctionKeyCharCode: { \ + switch ( ( event->message << 16 ) >> 24 ) { \ + case 111: { \ + return PROJECTM_K_F12; \ + } \ + case 103: { \ + return PROJECTM_K_F11; \ + } \ + case 109: { \ + return PROJECTM_K_F10; \ + } \ + case 101: { \ + return PROJECTM_K_F9; \ + } \ + case 100: { \ + return PROJECTM_K_F8; \ + } \ + case 98: { \ + return PROJECTM_K_F7; \ + } \ + case 97: { \ + return PROJECTM_K_F6; \ + } \ + case 96: { \ + return PROJECTM_K_F5; \ + } \ + case 118: { \ + return PROJECTM_K_F4; \ + } \ + case 99: { \ + return PROJECTM_K_F3; \ + } \ + case 120: { \ + return PROJECTM_K_F2; \ + } \ + case 122: { \ + return PROJECTM_K_F1; \ + } \ + } \ + } \ + default: { \ + return char_code; \ + } \ + } \ + } \ + +projectMModifier carbon2pmModifier( EventRecord *event ) { \ + return (projectMModifier)PROJECTM_K_LSHIFT; \ + } \ + +#endif /** _CARBONTOPROJECTM_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/ChangeLog kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/ChangeLog --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/ChangeLog 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/ChangeLog 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,96 @@ +New for version 1.1 +------------------------------------------------------ +* general performance improvements and improved video card compatability +* multi-threading during smooth preset switching +* pulse audio support +* Qt4 GUI implemented for playlist management and preset editing (jack / pulseaudio only) + +New for versoin 1.01 +------------------------------------------------------ +* Bugfixes + +New for version 1.00 +------------------------------------------------------ +This release includes months of refactoring. The code changes are immense. The list below does not even begin to explain the amount of upheaval that has occured. + +*Smooth Preset Switching + +*OpenGL Framebuffer Objects (sharper rendering) + +*PerPixel Warp effect added + +*Custom Shape Texturing via Images (imageURL property) + +*Serious Parser/Evaluator improvements for better .milk Compatability + +*projectM-engine can render to a texture instead of the framebuffer (see projectM-test/projectM-test-texture.cpp) + +*projectM-engine, projectM-xmms, projectM-jack, and projectM-test build system converted to CMake + +*3D Song title animation + +*New Configuration File (more options, more flexible) + +New for version 0.99 +------------------------------------------------------ +*config file now saved at ~/.projectM/config + +*internal rendering coordinate spaces corrected. (basically, I made some stupid decisions a long time ago, and just fixed them now) + +*xmms plugins close properly via window decorations + +*mouse cursor hidden in xmms-projectM during fullscreen + +*menus should resize relative to the screen size now + +*Fixed numerous compilation bugs + +*when the player changes to a new song, libprojectM will zoom in the title for a few seconds, then blend the title into the vis (ala milkdrop), if the player support sending the title to libprojectM (only xmms-projectM now) + + +New for version 0.98 +------------------------------------------------------ +*projectM has been refactored into a shared library called libprojectM. + -Now compiles as C++ (even though 99% of the code is C) + +*libvisual-projectM now supports libvisual 0.4.0 + +*Preset library updated (~150 new, ~25 removed) + +*Improved Rendering Engine + -rewrote per pixel mathematics + -fixed waveforms 0, 1, and 4 + -fixed Order of drawing (Vectors, Custom Shapes, Custom Waves, Waveform, Borders) + -fixed custom shape rotation and texture parameter bugs + -added support for the bDarkenCenter feature + -added pbuffer support (however, you can't use it yet) + -improved motion vectors when using pbuffers + +*Improved .milk Parser + -corrected behavior of frame, wave, and shape init_eqns + -fixed bug with multiple equations on one line + +*Menu/Help/Display System Improvements + -Replaced GLF with FTGL (TrueType) fonts. + -Added the solarize, brighten, darken, and invert filters to the post-processing menu + -(F4) new Rendering stats display + -(F5) Framerate display fixed + +*New Framerate limiter + +*n0dalus contributed some autotools patches. + +*Chris Byrne of Monstavision contributed: + -3 Memory Leak fixes! + -Performance improvements during PCM input + -Preset index code rewritten to allow presets to be added while projectM is running + +*Hai Zaar helped us clean up the autotools stuff + -Presets/fonts will be stored in $DATADIR/projectM/fonts and /presets + -The config file will be stored in $SYSCONFDIR/projectM + -By default DATADIR is $PREFIX/share and SYSCONFDIR is $PREFIX/etc + so we reccomend you run configure like so: + + ./configure --sysconfdir=/etc + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CMakeLists.txt kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CMakeLists.txt --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CMakeLists.txt 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,144 @@ +PROJECT(projectM) + +cmake_minimum_required(VERSION 2.6) + +OPTION (USE_DEVIL "Use devIL for image loading rather than the builtin SOIL library" OFF) + +OPTION (USE_FBO "Use Framebuffer Objects for increased rendering quality. Disable this for OpenGL ES 1.x or if you are experiencing problems on older or poorly supported hardware." ON) + +OPTION (USE_GLES1 "Use OpenGL ES 1.x" OFF) + + +OPTION (USE_NATIVE_GLEW "Use projectM's native implemention of GLEW." OFF) + +#OPTION (FTGL_STATIC "Build the projectM target library in the platform's native static (NOT shared) format." OFF) + +OPTION (BUILD_PROJECTM_STATIC "Build the projectM target library in the platform's native static (NOT shared) format." OFF) +SET(SOIL_SOURCES image_DXT.c image_helper.c SOIL.c stb_image_aug.c) + +if (USE_NATIVE_GLEW) +ADD_DEFINITIONS(-DUSE_NATIVE_GLEW) +SET(GLEW_SOURCES glew.h glew.c) +SET(GLEW_LINK_TARGETS ) +else(USE_NATIVE_GLEW) +SET(GLEW_SOURCES ) +SET (GLEW_LINK_TARGETS GLEW) +endif(USE_NATIVE_GLEW) + +SET(projectM_SOURCES projectM.cpp FBO.cpp InitCond.cpp + Expr.cpp PCM.cpp Parser.cpp Preset.cpp BeatDetect.cpp PerPixelEqn.cpp Param.cpp CustomWave.cpp CustomShape.cpp +Func.cpp Eval.cpp PerFrameEqn.cpp PerPointEqn.cpp fftsg.cpp KeyHandler.cpp + timer.cpp wipemalloc.cpp BuiltinFuncs.cpp BuiltinParams.cpp Renderer.cpp +PresetLoader.cpp PresetChooser.cpp PresetFrameIO.cpp PresetMerge.cpp +ConfigFile.cpp IdlePreset.cpp TextureManager.cpp TimeKeeper.cpp ${GLEW_SOURCES}) + +if (USE_DEVIL) +SET (projectM_SOURCES ${projectM_SOURCES}) +ADD_DEFINITIONS(-DUSE_DEVIL) +SET (IMAGE_LINK_TARGETS IL ILU ILUT) +else (USE_DEVIL) +SET (projectM_SOURCES ${projectM_SOURCES} ${SOIL_SOURCES}) +SET (IMAGE_LINK_TARGETS ) +endif (USE_DEVIL) + +if(USE_GLES1) +ADD_DEFINITIONS(-DUSE_GLES1) +endif(USE_GLES1) + +if(USE_FBO) +ADD_DEFINITIONS(-DUSE_FBO) +endif(USE_FBO) + +if (BUILD_PROJECTM_STATIC) +ADD_LIBRARY(projectM STATIC ${projectM_SOURCES}) +else(BUILD_PROJECTM_STATIC) +ADD_LIBRARY(projectM SHARED ${projectM_SOURCES}) +endif(BUILD_PROJECTM_STATIC) + +SET_TARGET_PROPERTIES(projectM PROPERTIES VERSION 2.00 SOVERSION 2) + +if (APPLE) +ADD_DEFINITIONS(-DMACOS -DSTBI_NO_DDS) +set(RESOURCE_PREFIX "Resources" ) +FIND_LIBRARY(CORE_FOUNDATION_LIBRARY CoreFoundation ) +MARK_AS_ADVANCED (CORE_FOUNDATION_LIBRARY) +set(EXTRA_LIBS ${CORE_FOUNDATION_LIBRARY}) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" ) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" ) +else (APPLE) +if (WIN32) +set (RESOURCE_PREFIX "Resources") +ADD_DEFINITIONS(-DWIN32 -DSTBI_NO_DDS) +else(WIN32) +set (RESOURCE_PREFIX "share/projectM") +ADD_DEFINITIONS(-DLINUX -DSTBI_NO_DDS) +endif(WIN32) +endif(APPLE) + +ADD_DEFINITIONS(-DCMAKE_INSTALL_PREFIX="\\\"${CMAKE_INSTALL_PREFIX}\\\"") + +FIND_PACKAGE(OpenGL) + +INCLUDE(FindPkgConfig.cmake) + +pkg_search_module (FTGL ftgl) + +if (FTGL_FOUND) + OPTION(USE_FTGL "Use FTGL for on-screen fonts (found on your system)" ON) +else (FTGL_FOUND) + OPTION(USE_FTGL "Use FTGL for on-screen fonts (Warning: NOT found on your system! Turning this on will probably bust the compilation.)" OFF) +endif(FTGL_FOUND) + +#set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH};/opt/local/include;/Developer/SDKs/MACOSX10.5.sdk/usr/X11/include) +#set(CMAKE_LIBRARY_PATH /opt/local/lib;/Developer/SDKs/MACOSX10.5.sdk;/Developer/SDKs/MacOSX10.5.sdk/usr/X11/lib/) + +IF(USE_FTGL) + if (FTGL_FOUND) + MESSAGE(STATUS "[projectM] FTGL font support was detected and enabled.") + else (FTGL_FOUND) + MESSAGE(STATUS + "[projectM] Warning! FTGL has been enabled but not detected. Your compilation will probably break. Turn off FTGL support by setting USE_FTGL to false, or visit http://ftgl.wiki.sourceforge.net/ for help on installing FTGL.") + endif (FTGL_FOUND) + + ADD_DEFINITIONS(-DUSE_FTGL) + + set (FTGL_INCUDE_DIRS ${FTGL_INCLUDE_DIRS} ${CMAKE_INCLUDE_PATH} ${OPENGL_INCLUDE_DIR}) + set (FTGL_LINK_DIRS ${FTGL_LIBRARY_DIRS} ) + set (FTGL_LINK_TARGETS ftgl freetype) + +ELSE (USE_FTGL) + IF (FTGL_FOUND) + MESSAGE(STATUS "[projectM] Warning: FTGL font support was detected but NOT enabled. You can enable it by setting USE_FTGL=true") + ELSE (FTGL_FOUND) + MESSAGE(STATUS "[projectM] Warning: FTGL font support was not detected. Visit http://ftgl.wiki.sourceforge.net/ for help on installing FTGL.") + ENDIF(FTGL_FOUND) + + # todo: change this because its obscure and probably not being used + set (FTGL_INCLUDE_DIRS "/opt/local/include") + set (FTGL_LINK_DIRS) + set (FTGL_LINK_TARGETS ) +ENDIF(USE_FTGL) + + + +INCLUDE_DIRECTORIES(${FTGL_INCLUDE_DIRS}) +LINK_DIRECTORIES(${FTGL_LINK_DIRS} "./") + +if(BUILD_PROJECTM_STATIC) + TARGET_LINK_LIBRARIES(projectM ${GLEW_LINK_TARGETS} m ${FTGL_LINK_TARGETS} ${OPENGL_LIBRARIES} ${IMAGE_LINK_TARGETS} ${EXTRA_LIBS} ) +else(BUILD_PROJECTM_STATIC) + TARGET_LINK_LIBRARIES(projectM ${GLEW_LINK_TARGETS} m ${FTGL_LINK_TARGETS} ${OPENGL_LIBRARIES} ${IMAGE_LINK_TARGETS} ${EXTRA_LIBS} ) +endif(BUILD_PROJECTM_STATIC) + + +CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/libprojectM.pc.in" "${CMAKE_CURRENT_SOURCE_DIR}/libprojectM.pc" @ONLY) +CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/config.inp.in" "${CMAKE_CURRENT_SOURCE_DIR}/config.inp" @ONLY) + +FILE(GLOB presets "presets/*.milk" "presets/*.prjm" "presets/*.tga") +INSTALL(FILES ${presets} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/projectM/presets) +FILE(GLOB fonts "fonts/*.ttf") +INSTALL(FILES ${fonts} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/projectM/fonts) +INSTALL(FILES "${CMAKE_CURRENT_SOURCE_DIR}/libprojectM.pc" DESTINATION ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/pkgconfig) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/config.inp DESTINATION ${CMAKE_INSTALL_PREFIX}/share/projectM) +INSTALL(FILES projectM.hpp event.h dlldefs.h fatal.h PresetFrameIO.hpp PCM.hpp DESTINATION include/libprojectM) +INSTALL(TARGETS projectM DESTINATION lib${LIB_SUFFIX}) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Common.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Common.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Common.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Common.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,146 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * $Log$ + */ + +#ifndef COMMON_H +#define COMMON_H + +#include + +#ifdef _MSC_VER +#define strcasecmp(s, t) _strcmpi(s, t) +#endif + +#ifdef DEBUG +//extern FILE *debugFile; +#endif + +#ifdef MACOS +#include +extern FILE *fmemopen(void *buf, size_t len, const char *pMode); +#endif /** MACOS */ + +#include "dlldefs.h" + +#define DEFAULT_FONT_PATH "/home/carm/fonts/courier1.glf" +#define MAX_TOKEN_SIZE 512 +#define MAX_PATH_SIZE 4096 + +#define STRING_BUFFER_SIZE 1024*150 +#define STRING_LINE_SIZE 1024 + + +#ifdef LINUX +#include +#endif + +#ifdef LINUX +#define projectM_isnan isnan +#endif + +#ifdef LINUX +#define projectM_isnan isnan +#endif + +#ifdef WIN32 +#define projectM_isnan(x) ((x) != (x)) +#endif + +#ifdef MACOS +#define projectM_isnan(x) ((x) != (x)) +#endif + +#ifdef LINUX +#define projectM_fmax fmax +#endif + +#ifdef WIN32 +#define projectM_fmax(x,y) ((x) >= (y) ? (x): (y)) +#endif + +#ifdef MACOS +#define projectM_fmax(x,y) ((x) >= (y) ? (x): (y)) +#endif + +#ifdef LINUX +#define projectM_fmin fmin +#endif + +#ifdef WIN32 +#define projectM_fmin(x,y) ((x) <= (y) ? (x): (y)) +#endif + +#ifdef MACOS +#define projectM_fmin(x,y) ((x) <= (y) ? (x): (y)) +#endif + +#ifndef TRUE +#define TRUE true +#endif + +#ifndef FALSE +#define FALSE false +#endif + + +#define MAX_DOUBLE_SIZE 10000000.0 +#define MIN_DOUBLE_SIZE -10000000.0 + +#define MAX_INT_SIZE 10000000 +#define MIN_INT_SIZE -10000000 + +/* default float initial value */ +#define DEFAULT_DOUBLE_IV 0.0 + +/* default float lower bound */ +#define DEFAULT_DOUBLE_LB MIN_DOUBLE_SIZE + +/* default float upper bound */ +#define DEFAULT_DOUBLE_UB MAX_DOUBLE_SIZE + +#ifdef WIN32 +#include +#define isnan _isnan +#endif /** WIN32 */ + +/** Per-platform path separators */ +#define WIN32_PATH_SEPARATOR '\\' +#define UNIX_PATH_SEPARATOR '/' +#ifdef WIN32 +#define PATH_SEPARATOR WIN32_PATH_SEPARATOR +#else +#define PATH_SEPARATOR UNIX_PATH_SEPARATOR +#endif /** WIN32 */ + +inline void DWRITE( char *fmt, ... ) { + return; + va_list args; + va_start( args, fmt ); + va_end( args ); + } + +#endif + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/compare.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/compare.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/compare.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/compare.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,114 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * $Log$ + */ + +#ifndef _COMPARE_H +#define _COMPARE_H +#include "wipemalloc.h" +#include "Common.hpp" + +/// @bug this will be ripped away when splaytree is more standardly written or its removed in favor of stl-esque data structure +class SplayKeyFunctions { +public: +static int compare_int(const int * num1, const int * num2); +static int compare_string(const char * string1, const char * string2); + +static void free_int(int * num); +static void free_string(char * string); +static void * copy_int(int * num); +static void * copy_string(char * string); +static int compare_string_version(const char * str1, const char * str2); +}; + + +/** tree_types.cpp */ +/* Compares integer value numbers in 32 bit range */ +inline int SplayKeyFunctions::compare_int(const int * num1, const int * num2) { + + if ((*num1) < (*num2)) + return -1; + if ((*num1) > (*num2)) + return 1; + + return 0; +} + +/* Compares strings in lexographical order */ +inline int SplayKeyFunctions::compare_string(const char * str1, const char * str2) { + + // printf("comparing \"%s\" to \"%s\"\n", str1, str2); + //return strcmp(str1, str2); + return strncmp(str1, str2, MAX_TOKEN_SIZE-1); + +} + +/* Compares a string in version order. That is, file1 < file2 < file10 */ +inline int SplayKeyFunctions::compare_string_version(const char * str1, const char * str2) { + + return strcmp( str1, str2 ); +#ifdef PANTS + return strverscmp(str1, str2); +#endif +} + + +inline void SplayKeyFunctions::free_int(int * num) { + free(num); +} + + + + inline void SplayKeyFunctions::free_string(char * string) { + free(string); +} + + + + inline void * SplayKeyFunctions::copy_int(int * num) { + + int * new_num; + + if ((new_num = (int*)wipemalloc(sizeof(int))) == NULL) + return NULL; + + *new_num = *num; + + return (void*)new_num; +} + + +inline void * SplayKeyFunctions::copy_string(char * string) { + + char * new_string; + + if ((new_string = (char*)wipemalloc(MAX_TOKEN_SIZE)) == NULL) + return NULL; + + strncpy(new_string, string, MAX_TOKEN_SIZE-1); + + return (void*)new_string; +} + +#endif /** !_COMPARE_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/ConfigFile.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/ConfigFile.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/ConfigFile.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/ConfigFile.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,142 @@ +// ConfigFile.cpp + +#include "ConfigFile.h" + +using std::string; + +ConfigFile::ConfigFile( string filename, string delimiter, + string comment, string sentry ) + : myDelimiter(delimiter), myComment(comment), mySentry(sentry) +{ + // Construct a ConfigFile, getting keys and values from given file + + std::ifstream in( filename.c_str() ); + + if( !in ) throw file_not_found( filename ); + + in >> (*this); +} + + +ConfigFile::ConfigFile() + : myDelimiter( string(1,'=') ), myComment( string(1,'#') ) +{ + // Construct a ConfigFile without a file; empty +} + + +void ConfigFile::remove( const string& key ) +{ + // Remove key and its value + myContents.erase( myContents.find( key ) ); + return; +} + + +bool ConfigFile::keyExists( const string& key ) const +{ + // Indicate whether key is found + mapci p = myContents.find( key ); + return ( p != myContents.end() ); +} + + +/* static */ +void ConfigFile::trim( string& s ) +{ + // Remove leading and trailing whitespace + static const char whitespace[] = " \n\t\v\r\f"; + s.erase( 0, s.find_first_not_of(whitespace) ); + s.erase( s.find_last_not_of(whitespace) + 1U ); +} + + +std::ostream& operator<<( std::ostream& os, const ConfigFile& cf ) +{ + // Save a ConfigFile to os + for( ConfigFile::mapci p = cf.myContents.begin(); + p != cf.myContents.end(); + ++p ) + { + os << p->first << " " << cf.myDelimiter << " "; + os << p->second << std::endl; + } + return os; +} + + +std::istream& operator>>( std::istream& is, ConfigFile& cf ) +{ + // Load a ConfigFile from is + // Read in keys and values, keeping internal whitespace + typedef string::size_type pos; + const string& delim = cf.myDelimiter; // separator + const string& comm = cf.myComment; // comment + const string& sentry = cf.mySentry; // end of file sentry + const pos skip = delim.length(); // length of separator + + string nextline = ""; // might need to read ahead to see where value ends + + while( is || nextline.length() > 0 ) + { + // Read an entire line at a time + string line; + if( nextline.length() > 0 ) + { + line = nextline; // we read ahead; use it now + nextline = ""; + } + else + { + std::getline( is, line ); + } + + // Ignore comments + line = line.substr( 0, line.find(comm) ); + + // Check for end of file sentry + if( sentry != "" && line.find(sentry) != string::npos ) return is; + + // Parse the line if it contains a delimiter + pos delimPos = line.find( delim ); + if( delimPos < string::npos ) + { + // Extract the key + string key = line.substr( 0, delimPos ); + line.replace( 0, delimPos+skip, "" ); + + // See if value continues on the next line + // Stop at blank line, next line with a key, end of stream, + // or end of file sentry + bool terminate = false; + while( !terminate && is ) + { + std::getline( is, nextline ); + terminate = true; + + string nlcopy = nextline; + ConfigFile::trim(nlcopy); + if( nlcopy == "" ) continue; + + nextline = nextline.substr( 0, nextline.find(comm) ); + if( nextline.find(delim) != string::npos ) + continue; + if( sentry != "" && nextline.find(sentry) != string::npos ) + continue; + + nlcopy = nextline; + ConfigFile::trim(nlcopy); + if( nlcopy != "" ) line += "\n"; + line += nextline; + terminate = false; + } + + // Store key and value + ConfigFile::trim(key); + ConfigFile::trim(line); + cf.myContents[key] = line; // overwrites if key is repeated + } + } + + return is; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/ConfigFile.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/ConfigFile.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/ConfigFile.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/ConfigFile.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,253 @@ +// ConfigFile.h +// Class for reading named values from configuration files +// Richard J. Wagner v2.1 24 May 2004 wagnerr@umich.edu + +// Copyright (c) 2004 Richard J. Wagner +// +// 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. + +// Typical usage +// ------------- +// +// Given a configuration file "settings.inp": +// atoms = 25 +// length = 8.0 # nanometers +// name = Reece Surcher +// +// Named values are read in various ways, with or without default values: +// ConfigFile config( "settings.inp" ); +// int atoms = config.read( "atoms" ); +// double length = config.read( "length", 10.0 ); +// string author, title; +// config.readInto( author, "name" ); +// config.readInto( title, "title", string("Untitled") ); +// +// See file example.cpp for more examples. + +#ifndef CONFIGFILE_H +#define CONFIGFILE_H + +#include +#include +#include +#include +#include + +using std::string; + +class ConfigFile { +// Data +protected: + string myDelimiter; // separator between key and value + string myComment; // separator between value and comments + string mySentry; // optional string to signal end of file + std::map myContents; // extracted keys and values + + typedef std::map::iterator mapi; + typedef std::map::const_iterator mapci; + +// Methods +public: + ConfigFile( string filename, + string delimiter = "=", + string comment = "#", + string sentry = "EndConfigFile" ); + ConfigFile(); + + // Search for key and read value or optional default value + template T read( const string& key ) const; // call as read + template T read( const string& key, const T& value ) const; + template bool readInto( T& var, const string& key ) const; + template + bool readInto( T& var, const string& key, const T& value ) const; + + // Modify keys and values + template void add( string key, const T& value ); + void remove( const string& key ); + + // Check whether key exists in configuration + bool keyExists( const string& key ) const; + + // Check or change configuration syntax + string getDelimiter() const { return myDelimiter; } + string getComment() const { return myComment; } + string getSentry() const { return mySentry; } + string setDelimiter( const string& s ) + { string old = myDelimiter; myDelimiter = s; return old; } + string setComment( const string& s ) + { string old = myComment; myComment = s; return old; } + + // Write or read configuration + friend std::ostream& operator<<( std::ostream& os, const ConfigFile& cf ); + friend std::istream& operator>>( std::istream& is, ConfigFile& cf ); + +protected: + template static string T_as_string( const T& t ); + template static T string_as_T( const string& s ); + static void trim( string& s ); + + +// Exception types +public: + struct file_not_found { + string filename; + file_not_found( const string& filename_ = string() ) + : filename(filename_) {} }; + struct key_not_found { // thrown only by T read(key) variant of read() + string key; + key_not_found( const string& key_ = string() ) + : key(key_) {} }; +}; + + +/* static */ +template +string ConfigFile::T_as_string( const T& t ) +{ + // Convert from a T to a string + // Type T must support << operator + std::ostringstream ost; + ost << t; + return ost.str(); +} + + +/* static */ +template +T ConfigFile::string_as_T( const string& s ) +{ + // Convert from a string to a T + // Type T must support >> operator + T t; + std::istringstream ist(s); + ist >> t; + return t; +} + + +/* static */ +template<> +inline string ConfigFile::string_as_T( const string& s ) +{ + // Convert from a string to a string + // In other words, do nothing + return s; +} + + +/* static */ +template<> +inline bool ConfigFile::string_as_T( const string& s ) +{ + // Convert from a string to a bool + // Interpret "false", "F", "no", "n", "0" as false + // Interpret "true", "T", "yes", "y", "1", "-1", or anything else as true + bool b = true; + string sup = s; + for( string::iterator p = sup.begin(); p != sup.end(); ++p ) + *p = toupper(*p); // make string all caps + if( sup==string("FALSE") || sup==string("F") || + sup==string("NO") || sup==string("N") || + sup==string("0") || sup==string("NONE") ) + b = false; + return b; +} + + +template +T ConfigFile::read( const string& key ) const +{ + // Read the value corresponding to key + mapci p = myContents.find(key); + if( p == myContents.end() ) throw key_not_found(key); + return string_as_T( p->second ); +} + + +template +T ConfigFile::read( const string& key, const T& value ) const +{ + // Return the value corresponding to key or given default value + // if key is not found + mapci p = myContents.find(key); + if( p == myContents.end() ) return value; + return string_as_T( p->second ); +} + + +template +bool ConfigFile::readInto( T& var, const string& key ) const +{ + // Get the value corresponding to key and store in var + // Return true if key is found + // Otherwise leave var untouched + mapci p = myContents.find(key); + bool found = ( p != myContents.end() ); + if( found ) var = string_as_T( p->second ); + return found; +} + + +template +bool ConfigFile::readInto( T& var, const string& key, const T& value ) const +{ + // Get the value corresponding to key and store in var + // Return true if key is found + // Otherwise set var to given default + mapci p = myContents.find(key); + bool found = ( p != myContents.end() ); + if( found ) + var = string_as_T( p->second ); + else + var = value; + return found; +} + + +template +void ConfigFile::add( string key, const T& value ) +{ + // Add a key with given value + string v = T_as_string( value ); + trim(key); + trim(v); + myContents[key] = v; + return; +} + +#endif // CONFIGFILE_H + +// Release notes: +// v1.0 21 May 1999 +// + First release +// + Template read() access only through non-member readConfigFile() +// + ConfigurationFileBool is only built-in helper class +// +// v2.0 3 May 2002 +// + Shortened name from ConfigurationFile to ConfigFile +// + Implemented template member functions +// + Changed default comment separator from % to # +// + Enabled reading of multiple-line values +// +// v2.1 24 May 2004 +// + Made template specializations inline to avoid compiler-dependent linkage +// + Allowed comments within multiple-line values +// + Enabled blank line termination for multiple-line values +// + Added optional sentry to detect end of configuration file +// + Rewrote messy trimWhitespace() function as elegant trim() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/config.inp.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/config.inp.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/config.inp.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/config.inp.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,22 @@ +# config.inp +# Configuration File for projectM + +Texture Size = 1024 # Size of internal rendering texture +Mesh X = 32 # Width of PerPixel Equation mesh +Mesh Y = 24 # Height of PerPixel Equation mesh +FPS = 35 # Frames Per Second +Fullscreen = false +Window Width = 512 # startup window width +Window Height = 512 # startup window height + +Smooth Transition Duration = 5 # in seconds +Preset Duration = 30 # in seconds +Easter Egg Parameter = 1 + +Hard Cut Sensitivity = 10 # Lower to make hard cuts more frequent +Aspect Correction = true # Custom Shape Aspect Correction + +Preset Path = @CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@/presets # preset location +Title Font = @CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@/fonts/Vera.ttf +Menu Font = @CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@/fonts/VeraMono.ttf + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomShape.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomShape.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomShape.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomShape.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,288 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed i the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ + +#include +#include +#include + +#include "Common.hpp" +#include "fatal.h" + +#include "CustomShape.hpp" +#include "Eval.hpp" +#include "Expr.hpp" +#include "InitCond.hpp" +#include "Param.hpp" +#include "PerFrameEqn.hpp" +#include "Preset.hpp" +#include +#include "ParamUtils.hpp" +#include "InitCondUtils.hpp" +#include "wipemalloc.h" +#include "Algorithms.hpp" + + +using namespace Algorithms; + + +CustomShape::CustomShape ( int id ) : imageUrl("") +{ + + Param * param; + + this->id = id; + this->per_frame_count = 0; + + /* Start: Load custom shape parameters */ + param = Param::new_param_float ( "r", P_FLAG_NONE, &this->r, NULL, 1.0, 0.0, 0.5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "g", P_FLAG_NONE, &this->g, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "b", P_FLAG_NONE, &this->b, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "a", P_FLAG_NONE, &this->a, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "border_r", P_FLAG_NONE, &this->border_r, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "border_g", P_FLAG_NONE, &this->border_g, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "border_b", P_FLAG_NONE, &this->border_b, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "border_a", P_FLAG_NONE, &this->border_a, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "r2", P_FLAG_NONE, &this->r2, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "g2", P_FLAG_NONE, &this->g2, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "b2", P_FLAG_NONE, &this->b2, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "a2", P_FLAG_NONE, &this->a2, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "x", P_FLAG_NONE, &this->x, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "y", P_FLAG_NONE, &this->y, NULL, 1.0, 0.0, .5 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_bool ( "thickoutline", P_FLAG_NONE, &this->thickOutline, 1, 0, 0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_bool ( "enabled", P_FLAG_NONE, &this->enabled, 1, 0, 0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_int ( "sides", P_FLAG_NONE, &this->sides, 100, 3, 3 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_bool ( "additive", P_FLAG_NONE, &this->additive, 1, 0, 0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_bool ( "textured", P_FLAG_NONE, &this->textured, 1, 0, 0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "rad", P_FLAG_NONE, &this->radius, NULL, MAX_DOUBLE_SIZE, 0, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "ang", P_FLAG_NONE, &this->ang, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "tex_zoom", P_FLAG_NONE, &this->tex_zoom, NULL, MAX_DOUBLE_SIZE, .00000000001, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "tex_ang", P_FLAG_NONE, &this->tex_ang, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + + param = Param::new_param_float ( "t1", P_FLAG_TVAR, &this->t1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "t2", P_FLAG_TVAR, &this->t2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "t3", P_FLAG_TVAR, &this->t3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "t4", P_FLAG_TVAR, &this->t4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "t5", P_FLAG_TVAR, &this->t5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "t6", P_FLAG_TVAR, &this->t6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "t7", P_FLAG_TVAR, &this->t7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "t8", P_FLAG_TVAR, &this->t8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + + param = Param::new_param_float ( "q1", P_FLAG_QVAR, &this->q1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "q2", P_FLAG_QVAR, &this->q2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "q3", P_FLAG_QVAR, &this->q3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "q4", P_FLAG_QVAR, &this->q4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "q5", P_FLAG_QVAR, &this->q5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "q6", P_FLAG_QVAR, &this->q6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "q7", P_FLAG_QVAR, &this->q7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + param = Param::new_param_float ( "q8", P_FLAG_QVAR, &this->q8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( !ParamUtils::insert( param, &this->param_tree ) ) + { + abort(); + } + + param = Param::new_param_string ( "imageurl", P_FLAG_NONE, &this->imageUrl); + if ( !ParamUtils::insert( param, &this->text_properties_tree ) ) + { + abort(); + } + +} + +/* Frees a custom shape form object */ +CustomShape::~CustomShape() +{ + + traverseVector > ( per_frame_eqn_tree ); + traverse > ( init_cond_tree ); + traverse > ( param_tree ); + traverse > ( per_frame_init_eqn_tree ); + traverse > ( text_properties_tree ); + +} + +void CustomShape::loadUnspecInitConds() +{ + + // NOTE: This is verified to be same behavior as trunk + + InitCondUtils::LoadUnspecInitCond fun ( this->init_cond_tree, this->per_frame_init_eqn_tree ); + traverse ( param_tree, fun ); +} + +void CustomShape::evalInitConds() +{ + + // NOTE: This is verified to be same behavior as trunk + for ( std::map::iterator pos = per_frame_init_eqn_tree.begin(); pos != per_frame_init_eqn_tree.end();++pos ) + pos->second->evaluate(); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomShape.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomShape.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomShape.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomShape.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,130 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Encapsulation of a custom shape + * + * $Log$ + */ + +#ifndef _CUSTOM_SHAPE_H +#define _CUSTOM_SHAPE_H + +#define CUSTOM_SHAPE_DEBUG 0 +#include +#include "Param.hpp" +#include "PerFrameEqn.hpp" +#include "InitCond.hpp" +#include + +class Preset; + + +class CustomShape { +public: + /* Numerical id */ + int id; + int per_frame_count; + + /* Parameter tree associated with this custom shape */ + std::map param_tree; + + /* Engine variables */ + int sides; + bool thickOutline; + bool enabled; + bool additive; + bool textured; + + float tex_zoom; + float tex_ang; + + float x; /* x position for per point equations */ + float y; /* y position for per point equations */ + float radius; + float ang; + + float r; /* red color value */ + float g; /* green color value */ + float b; /* blue color value */ + float a; /* alpha color value */ + + float r2; /* red color value */ + float g2; /* green color value */ + float b2; /* blue color value */ + float a2; /* alpha color value */ + + float border_r; /* red color value */ + float border_g; /* green color value */ + float border_b; /* blue color value */ + float border_a; /* alpha color value */ + + /* stupid t variables */ + float t1; + float t2; + float t3; + float t4; + float t5; + float t6; + float t7; + float t8; + + /* stupider q variables */ + float q1; + float q2; + float q3; + float q4; + float q5; + float q6; + float q7; + float q8; + + // projectM exclusive parameter to load textures over a shape + std::string imageUrl; + + /// Returns any image url (usually used for texture maps) associated with the custom shape + /// Will return empty string if none is set + inline const std::string & getImageUrl() const { + return imageUrl; + } + + // Data structure to hold per frame / per frame init equations + std::map init_cond_tree; + std::vector per_frame_eqn_tree; + std::map per_frame_init_eqn_tree; + + std::map text_properties_tree; + + + /// Allocate a new custom shape, including param associations, per point equations, and initial values. + /// \param id an integer id to associate with this custom wave. Future line parsing uses this as a reference key. + CustomShape( int id ); + + ~CustomShape(); + + void loadUnspecInitConds(); + void evalInitConds(); + }; + + +#endif /** !_CUSTOM_SHAPE_H */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomWave.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomWave.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomWave.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomWave.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,586 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ + +#include +#include +#include + + +#include "Common.hpp" +#include "fatal.h" + +#include "CustomWave.hpp" +#include "Eval.hpp" +#include "Expr.hpp" +#include "InitCond.hpp" +#include "Param.hpp" +#include "PerFrameEqn.hpp" +#include "PerPointEqn.hpp" +#include "Preset.hpp" +#include +#include "ParamUtils.hpp" +#include "InitCondUtils.hpp" +#include "wipemalloc.h" +#define MAX_SAMPLE_SIZE 4096 + + +CustomWave::CustomWave(int _id): + id(_id), + per_frame_count(0), + r(0), + g(0), + b(0), + a(0), + samples(512), + bSpectrum(0), + bUseDots(0), + bAdditive(0), + + scaling(1.0), + smoothing(0.0) + + + +{ + + Param * param; + + /// @bug deprecate the use of wipemalloc + this->r_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); + this->g_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); + this->b_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); + this->a_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); + this->x_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); + this->y_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); + this->value1 = (float*) wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); + this->value2 = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); + this->sample_mesh = (float*)wipemalloc(MAX_SAMPLE_SIZE*sizeof(float)); + + /* Start: Load custom wave parameters */ + + if ((param = Param::new_param_float("r", P_FLAG_NONE | P_FLAG_PER_POINT, &this->r, this->r_mesh, 1.0, 0.0, .5)) == NULL) + { + ; + /// @bug make exception + abort(); + } + + if (ParamUtils::insert(param, ¶m_tree) < 0) + { + /// @bug make exception + abort(); + } + + if ((param = Param::new_param_float("g", P_FLAG_NONE | P_FLAG_PER_POINT, &this->g, this->g_mesh, 1.0, 0.0, .5)) == NULL) + { + ; + /// @bug make exception + abort(); + } + + if (ParamUtils::insert(param, ¶m_tree) < 0) + { + ; + /// @bug make exception + abort(); + } + + if ((param = Param::new_param_float("b", P_FLAG_NONE | P_FLAG_PER_POINT, &this->b, this->b_mesh, 1.0, 0.0, .5)) == NULL) + { + ; + /// @bug make exception + abort(); + + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + /// @bug make exception + abort(); + } + + if ((param = Param::new_param_float("a", P_FLAG_NONE | P_FLAG_PER_POINT, &this->a, this->a_mesh, 1.0, 0.0, .5)) == NULL) + { + ; + /// @bug make exception + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + /// @bug make exception + abort(); + } + + if ((param = Param::new_param_float("x", P_FLAG_NONE | P_FLAG_PER_POINT, &this->x, this->x_mesh, 1.0, 0.0, .5)) == NULL) + { + ; + /// @bug make exception + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + /// @bug make exception + abort(); + } + + if ((param = Param::new_param_float("y", P_FLAG_NONE | P_FLAG_PER_POINT, &this->y, this->y_mesh, 1.0, 0.0, .5)) == NULL) + { + ; + /// @bug make exception + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + + /// @bug make exception + abort(); + + } + + if ((param = Param::new_param_bool("enabled", P_FLAG_NONE, &this->enabled, 1, 0, 0)) == NULL) + { + ; + /// @bug make exception + abort(); + + + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + + /// @bug make exception + abort(); + + } + + if ((param = Param::new_param_int("sep", P_FLAG_NONE, &this->sep, 100, -100, 0)) == NULL) + { + ; + /// @bug make exception + abort(); + + + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + /// @bug make exception + abort(); + + + } + + if ((param = Param::new_param_bool("bspectrum", P_FLAG_NONE, &this->bSpectrum, 1, 0, 0)) == NULL) + { + /// @bug make exception + abort(); + + + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + /// @bug make exception + abort(); + + } + + if ((param = Param::new_param_bool("bdrawthick", P_FLAG_NONE, &this->bDrawThick, 1, 0, 0)) == NULL) + { + /// @bug make exception + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + /// @bug make exception + abort(); + + } + + if ((param = Param::new_param_bool("busedots", P_FLAG_NONE, &this->bUseDots, 1, 0, 0)) == NULL) + { + + /// @bug make exception + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + abort(); + } + + if ((param = Param::new_param_bool("badditive", P_FLAG_NONE, &this->bAdditive, 1, 0, 0)) == NULL) + { + ; + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + abort(); + } + + if ((param = Param::new_param_int("samples", P_FLAG_NONE, &this->samples, 2048, 1, 512)) == NULL) + { + ; + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + abort(); + } + + if ((param = Param::new_param_float("sample", P_FLAG_READONLY | P_FLAG_NONE | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, + &this->sample, this->sample_mesh, 1.0, 0.0, 0.0)) == NULL) + { + ; + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + abort(); + } + + if ((param = Param::new_param_float("value1", P_FLAG_READONLY | P_FLAG_NONE | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, &this->v1, this->value1, 1.0, -1.0, 0.0)) == NULL) + { + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + abort(); + } + + if ((param = Param::new_param_float("value2", P_FLAG_READONLY | P_FLAG_NONE | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, &this->v2, this->value2, 1.0, -1.0, 0.0)) == NULL) + { + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + abort(); + } + + if ((param = Param::new_param_float("smoothing", P_FLAG_NONE, &this->smoothing, NULL, 1.0, 0.0, 0.0)) == NULL) + { + ; + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + abort(); + } + + if ((param = Param::new_param_float("scaling", P_FLAG_NONE, &this->scaling, NULL, MAX_DOUBLE_SIZE, 0.0, 1.0)) == NULL) + { + ; + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + abort(); + } + + if ((param = Param::new_param_float("t1", P_FLAG_PER_POINT | P_FLAG_TVAR, &this->t1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) + { + ; + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + abort(); + } + + if ((param = Param::new_param_float("t2", P_FLAG_PER_POINT |P_FLAG_TVAR, &this->t2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) + { + ; + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + abort(); + } + + if ((param = Param::new_param_float("t3", P_FLAG_PER_POINT |P_FLAG_TVAR, &this->t3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) + { + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + + abort(); + } + if ((param = Param::new_param_float("t4", P_FLAG_PER_POINT |P_FLAG_TVAR, &this->t4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) + { + + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + abort(); + } + if ((param = Param::new_param_float("t5", P_FLAG_TVAR, &this->t5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) + { + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + abort(); + } + if ((param = Param::new_param_float("t6", P_FLAG_TVAR | P_FLAG_PER_POINT, &this->t6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) + { + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + + abort(); + } + if ((param = Param::new_param_float("t7", P_FLAG_TVAR | P_FLAG_PER_POINT, &this->t7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) + { + + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + abort(); + } + + if ((param = Param::new_param_float("t8", P_FLAG_TVAR | P_FLAG_PER_POINT, &this->t8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) + { + ; + abort(); + } + + if (ParamUtils::insert(param, &this->param_tree) < 0) + { + ; + abort(); + } + + + param = Param::new_param_float ( "q1", P_FLAG_QVAR, &this->q1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( ParamUtils::insert ( param, &this->param_tree ) < 0 ) + { + + } + param = Param::new_param_float ( "q2", P_FLAG_QVAR, &this->q2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( ParamUtils::insert ( param, &this->param_tree ) < 0 ) + { + + } + param = Param::new_param_float ( "q3", P_FLAG_QVAR, &this->q3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( ParamUtils::insert ( param, &this->param_tree ) < 0 ) + { + + } + param = Param::new_param_float ( "q4", P_FLAG_QVAR, &this->q4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( ParamUtils::insert ( param, &this->param_tree ) < 0 ) + { + + } + param = Param::new_param_float ( "q5", P_FLAG_QVAR, &this->q5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( ParamUtils::insert ( param, &this->param_tree ) < 0 ) + { + + } + param = Param::new_param_float ( "q6", P_FLAG_QVAR, &this->q6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( ParamUtils::insert ( param, &this->param_tree ) < 0 ) + { + + } + param = Param::new_param_float ( "q7", P_FLAG_QVAR, &this->q7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( ParamUtils::insert ( param, &this->param_tree ) < 0 ) + { + + } + param = Param::new_param_float ( "q8", P_FLAG_QVAR, &this->q8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0 ); + if ( ParamUtils::insert ( param, &this->param_tree ) < 0 ) + { + + } + /* End of parameter loading. Note that the read only parameters associated + with custom waves (ie, sample) are variables stored in PresetFrameIO.hpp, + and not specific to the custom wave datastructure. */ + +} + +CustomWave::~CustomWave() +{ + + + for (std::vector::iterator pos = per_point_eqn_tree.begin(); pos != per_point_eqn_tree.end(); ++pos) + delete(*pos); + + for (std::vector::iterator pos = per_frame_eqn_tree.begin(); pos != per_frame_eqn_tree.end(); ++pos) + delete(*pos); + + for (std::map::iterator pos = init_cond_tree.begin(); pos != init_cond_tree.end(); ++pos) + delete(pos->second); + + for (std::map::iterator pos = per_frame_init_eqn_tree.begin(); pos != per_frame_init_eqn_tree.end(); ++pos) + delete(pos->second); + + for (std::map::iterator pos = param_tree.begin(); pos != param_tree.end(); ++pos) + delete(pos->second); + + free(r_mesh); + free(g_mesh); + free(b_mesh); + free(a_mesh); + free(x_mesh); + free(y_mesh); + free(value1); + free(value2); + free(sample_mesh); + +} + + + + +// Comments: index is not passed, so we assume monotonic increment by 1 is ok here +int CustomWave::add_per_point_eqn(char * name, GenExpr * gen_expr) +{ + + PerPointEqn * per_point_eqn; + int index; + Param * param = NULL; + + /* Argument checks */ + if (gen_expr == NULL) + return PROJECTM_FAILURE; + if (name == NULL) + return PROJECTM_FAILURE; + + if (CUSTOM_WAVE_DEBUG) printf("add_per_point_eqn: per pixel equation (name = \"%s\")\n", name); + + /* Search for the parameter so we know what matrix the per pixel equation is referencing */ + + if ((param = ParamUtils::find(name,¶m_tree)) == NULL) + { + if (CUSTOM_WAVE_DEBUG) printf("add_per_point_eqn: failed to allocate a new parameter!\n"); + return PROJECTM_FAILURE; + + } + + /* Get largest index in the tree */ + index = per_point_eqn_tree.size(); + + /* Create the per point equation given the index, parameter, and general expression */ + if ((per_point_eqn = new PerPointEqn(index, param, gen_expr, samples)) == NULL) + return PROJECTM_FAILURE; + if (CUSTOM_WAVE_DEBUG) + printf("add_per_point_eqn: created new equation (index = %d) (name = \"%s\")\n", per_point_eqn->index, per_point_eqn->param->name.c_str()); + + /* Insert the per pixel equation into the preset per pixel database */ + + per_point_eqn_tree.push_back(per_point_eqn); + + /* Done */ + return PROJECTM_SUCCESS; +} + + +void CustomWave::evalInitConds() +{ + + for (std::map::iterator pos = per_frame_init_eqn_tree.begin(); pos != per_frame_init_eqn_tree.end(); ++pos) + { + assert(pos->second); + pos->second->evaluate(); + } + +} + +/** Evaluate per-point equations */ +void CustomWave::evalPerPointEqns() +{ + + + + assert(samples > 0); + assert(r_mesh); + assert(g_mesh); + assert(b_mesh); + assert(a_mesh); + assert(x_mesh); + assert(y_mesh); + + int k; + for (k = 0; k < samples; k++) + r_mesh[k] = r; + for (k = 0; k < samples; k++) + g_mesh[k] = g; + for (k = 0; k < samples; k++) + b_mesh[k] = b; + for (k = 0; k < samples; k++) + a_mesh[k] = a; + for (k = 0; k < samples; k++) + x_mesh[k] = x; + for (k = 0; k < samples; k++) + y_mesh[k] = y; + + /* Evaluate per pixel equations */ +for (k = 0; k < samples;k++) + for (std::vector::iterator pos = per_point_eqn_tree.begin(); pos != per_point_eqn_tree.end();++pos) { + (*pos)->evaluate(k); + } + +} + +void CustomWave::loadUnspecInitConds() +{ + + InitCondUtils::LoadUnspecInitCond fun(this->init_cond_tree, this->per_frame_init_eqn_tree); + Algorithms::traverse(param_tree, fun); +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomWave.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomWave.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomWave.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CustomWave.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,139 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Encapsulation of a custom wave + * + * $Log$ + */ + +#ifndef _CUSTOM_WAVE_H +#define _CUSTOM_WAVE_H + +#define CUSTOM_WAVE_DEBUG 0 + +class CustomWave; +class GenExpr; +class PerPointEqn; +class Preset; + +#include + +#include "Common.hpp" +#include "Param.hpp" +#include "PerFrameEqn.hpp" + +#include + +class CustomWave { +public: + + /** Empty constructor leaves wave in undefined state **/ + CustomWave() {} + + /** Initializes a custom wave id given the integer id */ + CustomWave(int id); + + /** Destructor is necessary so we can free the per point matrices **/ + ~CustomWave(); + + /* Numerical id */ + int id; + int per_frame_count; + + /* Parameter tree associated with this custom wave */ + std::map param_tree; + + /* Engine variables */ + float x; /* x position for per point equations */ + float y; /* y position for per point equations */ + float r; /* red color value */ + float g; /* green color value */ + float b; /* blue color value */ + float a; /* alpha color value */ + float * x_mesh; + float * y_mesh; + float * r_mesh; + float * b_mesh; + float * g_mesh; + float * a_mesh; + float * value1; + float * value2; + float * sample_mesh; + + bool enabled; /* if true then wave is visible, hidden otherwise */ + int samples; /* number of samples associated with this wave form. Usually powers of 2 */ + float sample; + bool bSpectrum; /* spectrum data or pcm data */ + bool bUseDots; /* draw wave as dots or lines */ + bool bDrawThick; /* draw thicker lines */ + bool bAdditive; /* add color values together */ + + float scaling; /* scale factor of waveform */ + float smoothing; /* smooth factor of waveform */ + int sep; /* no idea what this is yet... */ + + /* stupid t variables */ + float t1; + float t2; + float t3; + float t4; + float t5; + float t6; + float t7; + float t8; + + + /* stupider q variables */ + float q1; + float q2; + float q3; + float q4; + float q5; + float q6; + float q7; + float q8; + + float v1,v2; + + /* Data structures to hold per frame and per point equations */ + std::map init_cond_tree; + std::vector per_frame_eqn_tree; + std::vector per_point_eqn_tree; + std::map per_frame_init_eqn_tree; + + /* Denotes the index of the last character for each string buffer */ + int per_point_eqn_string_index; + int per_frame_eqn_string_index; + int per_frame_init_eqn_string_index; + + int add_per_point_eqn(char * name, GenExpr * gen_expr); + void evalCustomWaveInitConditions(Preset *preset); + void evalPerPointEqns(); + + void loadUnspecInitConds(); + + void evalInitConds(); + +}; + +#endif /** !_CUSTOM_WAVE_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CValue.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CValue.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/CValue.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/CValue.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,38 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Value + * + * $Log$ + */ + +#ifndef _CVALUE_H +#define _CVALUE_H + +typedef union CValue_t { + bool bool_val; + int int_val; + float float_val; + } CValue; + +#endif /** _CVALUE_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/dlldefs.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/dlldefs.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/dlldefs.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/dlldefs.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,40 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * DLL definitions for exporting symbols on various platforms + * + * $Log$ + */ + +#ifndef _DLLDEFS_H +#define _DLLDEFS_H + +#ifndef DLLEXPORT +#ifdef WIN32 +#define DLLEXPORT __declspec(dllexport) +#else /** !WIN32 */ +#define DLLEXPORT +#endif /** WIN32 */ +#endif /** !DLLEXPORT */ + +#endif /** !_DLLDEFS_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Eval.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Eval.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Eval.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Eval.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,91 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/* Evaluation Code */ + +#include +#include + +#include "Common.hpp" +#include "fatal.h" + +#include "Eval.hpp" +#include "Expr.hpp" +#include "Param.hpp" +#include "Func.hpp" +#include "wipemalloc.h" + +#include "BuiltinFuncs.hpp" + +InfixOp *Eval::infix_add = NULL; +InfixOp *Eval::infix_minus = NULL; +InfixOp *Eval::infix_div = NULL; +InfixOp *Eval::infix_mult = NULL; +InfixOp *Eval::infix_or = NULL; +InfixOp *Eval::infix_and = NULL; +InfixOp *Eval::infix_mod = NULL; +InfixOp *Eval::infix_negative = NULL; +InfixOp *Eval::infix_positive = NULL; + +/* Initializes all infix operators */ +int Eval::init_infix_ops() { + + Eval::infix_add = new InfixOp(INFIX_ADD, 4); + Eval::infix_minus = new InfixOp(INFIX_MINUS, 3); + Eval::infix_div = new InfixOp(INFIX_DIV, 2); + Eval::infix_or = new InfixOp(INFIX_OR, 5); + Eval::infix_and = new InfixOp(INFIX_AND,4); + Eval::infix_mod = new InfixOp(INFIX_MOD, 1); + Eval::infix_mult = new InfixOp(INFIX_MULT, 2); + + /* Prefix operators */ + Eval::infix_positive = new InfixOp(INFIX_ADD, 0); + Eval::infix_negative = new InfixOp(INFIX_MINUS, 0); + + return PROJECTM_SUCCESS; +} + +/* Destroys the infix operator list. This should + be done on program exit */ +int Eval::destroy_infix_ops() +{ + + delete(Eval::infix_add); + delete(Eval::infix_minus); + delete(Eval::infix_div); + delete(Eval::infix_or); + delete(Eval::infix_and); + delete(Eval::infix_mod); + delete(Eval::infix_mult); + delete(Eval::infix_positive); + delete(Eval::infix_negative); + + Eval::infix_add = NULL; + Eval::infix_minus = NULL; + Eval::infix_div = NULL; + Eval::infix_or = NULL; + Eval::infix_and = NULL; + Eval::infix_mod = NULL; + Eval::infix_mult = NULL; + Eval::infix_positive = NULL; + Eval::infix_negative = NULL; + + return PROJECTM_SUCCESS; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Eval.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Eval.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Eval.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Eval.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,94 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Expression evaluators + * + * $Log$ + */ + +/* Eval.hpp: evaluation functions of expressions */ + +#ifndef __EVAL_H +#define __EVAL_H + +#include "fatal.h" +//#include "projectM.hpp" +#include "Func.hpp" +#include "Param.hpp" + +//#define EVAL_DEBUG 2 +//#define EVAL_DEBUG_DOUBLE 2 + +#define VAL_T 1 +#define PREFUN_T 3 +#define TREE_T 4 +#define NONE_T 0 + +#define CONSTANT_TERM_T 0 +#define PARAM_TERM_T 1 + +#define INFIX_ADD 0 +#define INFIX_MINUS 1 +#define INFIX_MOD 2 +#define INFIX_DIV 3 +#define INFIX_MULT 4 +#define INFIX_OR 5 +#define INFIX_AND 6 + +class InfixOp; + +class Eval { +public: + static InfixOp *infix_add, + *infix_minus, + *infix_div, + *infix_mult, + *infix_or, + *infix_and, + *infix_mod, + *infix_negative, + *infix_positive; + + float eval_gen_expr(GenExpr * gen_expr); + inline GenExpr * opt_gen_expr(GenExpr * gen_expr, int ** param_list); + + GenExpr * const_to_expr(float val); + GenExpr * param_to_expr(Param * param); + GenExpr * prefun_to_expr(float (*func_ptr)(), GenExpr ** expr_list, int num_args); + + static TreeExpr * new_tree_expr(InfixOp * infix_op, GenExpr * gen_expr, TreeExpr * left, TreeExpr * right); + static GenExpr * new_gen_expr(int type, void * item); + static ValExpr * new_val_expr(int type, Term *term); + + static InfixOp * new_infix_op(int type, int precedence); + static int init_infix_ops(); + static int destroy_infix_ops(); + void reset_engine_vars(); + + GenExpr * clone_gen_expr(GenExpr * gen_expr); + TreeExpr * clone_tree_expr(TreeExpr * tree_expr); + ValExpr * clone_val_expr(ValExpr * val_expr); + PrefunExpr * clone_prefun_expr(PrefunExpr * prefun_expr); + }; + +#endif /** !_EVAL_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/event.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/event.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/event.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/event.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,151 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: event.h,v 1.2 2004/10/08 10:54:27 cvs Exp $ + * + * projectM keycodes. Enables translation from various event schemes such as Win32, SDL + * &c. + * + * $Log: event.h,v $ + */ + +#ifndef _PROJECTM_EVENT_H +#define _PROJECTM_EVENT_H + +typedef enum { + /** Event types */ + PROJECTM_KEYUP, + PROJECTM_KEYDOWN, + PROJECTM_VIDEORESIZE, + PROJECTM_VIDEOQUIT, + } projectMEvent; + +typedef enum { + /** Keycodes */ + PROJECTM_K_RETURN, + PROJECTM_K_RIGHT, + PROJECTM_K_LEFT, + PROJECTM_K_UP, + PROJECTM_K_DOWN, + PROJECTM_K_PAGEUP, + PROJECTM_K_PAGEDOWN, + PROJECTM_K_INSERT, + PROJECTM_K_DELETE, + PROJECTM_K_ESCAPE, + PROJECTM_K_LSHIFT, + PROJECTM_K_RSHIFT, + PROJECTM_K_CAPSLOCK, + PROJECTM_K_LCTRL, + PROJECTM_K_HOME, + PROJECTM_K_END, + PROJECTM_K_BACKSPACE, + + PROJECTM_K_F1, + PROJECTM_K_F2, + PROJECTM_K_F3, + PROJECTM_K_F4, + PROJECTM_K_F5, + PROJECTM_K_F6, + PROJECTM_K_F7, + PROJECTM_K_F8, + PROJECTM_K_F9, + PROJECTM_K_F10, + PROJECTM_K_F11, + PROJECTM_K_F12, + + PROJECTM_K_0 = 48, + PROJECTM_K_1, + PROJECTM_K_2, + PROJECTM_K_3, + PROJECTM_K_4, + PROJECTM_K_5, + PROJECTM_K_6, + PROJECTM_K_7, + PROJECTM_K_8, + PROJECTM_K_9, + + PROJECTM_K_A = 65, + PROJECTM_K_B, + PROJECTM_K_C, + PROJECTM_K_D, + PROJECTM_K_E, + PROJECTM_K_F, + PROJECTM_K_G, + PROJECTM_K_H, + PROJECTM_K_I, + PROJECTM_K_J, + PROJECTM_K_K, + PROJECTM_K_L, + PROJECTM_K_M, + PROJECTM_K_N, + PROJECTM_K_O, + PROJECTM_K_P, + PROJECTM_K_Q, + PROJECTM_K_R, + PROJECTM_K_S, + PROJECTM_K_T, + PROJECTM_K_U, + PROJECTM_K_V, + PROJECTM_K_W, + PROJECTM_K_X, + PROJECTM_K_Y, + PROJECTM_K_Z, + + PROJECTM_K_a = 97, + PROJECTM_K_b, + PROJECTM_K_c, + PROJECTM_K_d, + PROJECTM_K_e, + PROJECTM_K_f, + PROJECTM_K_g, + PROJECTM_K_h, + PROJECTM_K_i, + PROJECTM_K_j, + PROJECTM_K_k, + PROJECTM_K_l, + PROJECTM_K_m, + PROJECTM_K_n, + PROJECTM_K_o, + PROJECTM_K_p, + PROJECTM_K_q, + PROJECTM_K_r, + PROJECTM_K_s, + PROJECTM_K_t, + PROJECTM_K_u, + PROJECTM_K_v, + PROJECTM_K_w, + PROJECTM_K_x, + PROJECTM_K_y, + PROJECTM_K_z, + PROJECTM_K_NONE, + } projectMKeycode; + +typedef enum { + /** Modifiers */ + PROJECTM_KMOD_LSHIFT, + PROJECTM_KMOD_RSHIFT, + PROJECTM_KMOD_CAPS, + PROJECTM_KMOD_LCTRL, + PROJECTM_KMOD_RCTRL, + } projectMModifier; + +#endif /** !_PROJECTM_EVENT_H */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Expr.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Expr.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Expr.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Expr.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,450 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ + +#include "wipemalloc.h" + +#include "Expr.hpp" +#include + +#include +#include "Eval.hpp" + +float GenExpr::eval_gen_expr ( int mesh_i, int mesh_j ) +{ + float l; + + assert ( item ); + switch ( this->type ) + { + case VAL_T: + return ( ( ValExpr* ) item )->eval_val_expr ( mesh_i, mesh_j ); + case PREFUN_T: + l = ( ( PrefunExpr * ) item )->eval_prefun_expr ( mesh_i, mesh_j ); + //if (EVAL_DEBUG) DWRITE( "eval_gen_expr: prefix function return value: %f\n", l); + return l; + case TREE_T: + return ( ( TreeExpr* ) ( item ) )->eval_tree_expr ( mesh_i, mesh_j ); + default: +#ifdef EVAL_DEBUG + DWRITE ( "eval_gen_expr: general expression matched no cases!\n" ); +#endif + return EVAL_ERROR; + } + +} + +/* Evaluates functions in prefix form */ +float PrefunExpr::eval_prefun_expr ( int mesh_i, int mesh_j ) +{ + + + assert ( func_ptr ); + + float * arg_list = new float[this->num_args]; + + assert(arg_list); + +#ifdef EVAL_DEBUG_DOUBLE + DWRITE ( "fn[" ); +#endif + + //printf("numargs %d", num_args); + + /* Evaluate each argument before calling the function itself */ + for ( int i = 0; i < num_args; i++ ) + { + arg_list[i] = expr_list[i]->eval_gen_expr ( mesh_i, mesh_j ); +#ifdef EVAL_DEBUG_DOUBLE + if ( i < ( num_args - 1 ) ) + DWRITE ( ", " ); +#endif + //printf("numargs %x", arg_list[i]); + + + } +#ifdef EVAL_DEBUG_DOUBLE + DWRITE ( "]" ); +#endif + + /* Now we call the function, passing a list of + floats as its argument */ + + const float value = ( func_ptr ) ( arg_list ); + + delete[](arg_list); + return value; +} + + +/* Evaluates a value expression */ +float ValExpr::eval_val_expr ( int mesh_i, int mesh_j ) +{ + + + /* Value is a constant, return the float value */ + if ( type == CONSTANT_TERM_T ) + { +#ifdef EVAL_DEBUG + DWRITE ( "%.4f", term.constant ); +#endif + return ( term.constant ); + } + + /* Value is variable, dereference it */ + if ( type == PARAM_TERM_T ) + { + switch ( term.param->type ) + { + + case P_TYPE_BOOL: +#ifdef EVAL_DEBUG + DWRITE ( "(%s:%.4f)", term.param->name.c_str(), ( float ) ( * ( ( bool* ) ( term.param->engine_val ) ) ) ); +#endif + + + return ( float ) ( * ( ( bool* ) ( term.param->engine_val ) ) ); + case P_TYPE_INT: +#ifdef EVAL_DEBUG + DWRITE ( "(%s:%.4f)", term.param->name.c_str(), ( float ) ( * ( ( int* ) ( term.param->engine_val ) ) ) ); +#endif + + + return ( float ) ( * ( ( int* ) ( term.param->engine_val ) ) ); + case P_TYPE_DOUBLE: + + + if ( term.param->matrix_flag | ( term.param->flags & P_FLAG_ALWAYS_MATRIX ) ) + { + + /* Sanity check the matrix is there... */ + assert ( term.param->matrix != NULL ); + + /// @slow boolean check could be expensive in this critical (and common) step of evaluation + if ( mesh_i >= 0 ) + { + if ( mesh_j >= 0 ) + { + return ( ( ( float** ) term.param->matrix ) [mesh_i][mesh_j] ); + } + else + { + return ( ( ( float* ) term.param->matrix ) [mesh_i] ); + } + } + //assert(mesh_i >=0); + } + //std::cout << term.param->name << ": " << (*((float*)term.param->engine_val)) << std::endl; + return * ( ( float* ) ( term.param->engine_val ) ); + default: + return EVAL_ERROR; + } + } + /* Unknown type, return failure */ + return PROJECTM_FAILURE; +} + +/* Evaluates an expression tree */ +float TreeExpr::eval_tree_expr ( int mesh_i, int mesh_j ) +{ + + float left_arg, right_arg; + + /* A leaf node, evaluate the general expression. If the expression is null as well, return zero */ + if ( infix_op == NULL ) + { + if ( gen_expr == NULL ) + return 0; + else + return gen_expr->eval_gen_expr ( mesh_i, mesh_j ); + } + + /* Otherwise, this node is an infix operator. Evaluate + accordingly */ + +#ifdef EVAL_DEBUG + DWRITE ( "(" ); +#endif + + assert(left); + left_arg = left->eval_tree_expr ( mesh_i, mesh_j ); + +#ifdef EVAL_DEBUG + + switch ( infix_op->type ) + { + case INFIX_ADD: + DWRITE ( "+" ); + break; + case INFIX_MINUS: + DWRITE ( "-" ); + break; + case INFIX_MULT: + DWRITE ( "*" ); + break; + case INFIX_MOD: + DWRITE ( "%%" ); + break; + case INFIX_OR: + DWRITE ( "|" ); + break; + case INFIX_AND: + DWRITE ( "&" ); + break; + case INFIX_DIV: + DWRITE ( "/" ); + break; + default: + DWRITE ( "?" ); + } + +#endif + + assert(right); + right_arg = right->eval_tree_expr ( mesh_i, mesh_j ); + +#ifdef EVAL_DEBUG + DWRITE ( ")" ); +#endif + +#ifdef EVAL_DEBUG + DWRITE ( "\n" ); +#endif + + switch ( infix_op->type ) + { + case INFIX_ADD: + return ( left_arg + right_arg ); + case INFIX_MINUS: + return ( left_arg - right_arg ); + case INFIX_MULT: + return ( left_arg * right_arg ); + case INFIX_MOD: + if ( ( int ) right_arg == 0 ) + { +#ifdef EVAL_DEBUG + DWRITE ( "eval_tree_expr: modulo zero!\n" ); +#endif + return PROJECTM_DIV_BY_ZERO; + } + return ( ( int ) left_arg % ( int ) right_arg ); + case INFIX_OR: + return ( ( int ) left_arg | ( int ) right_arg ); + case INFIX_AND: + return ( ( int ) left_arg & ( int ) right_arg ); + case INFIX_DIV: + if ( right_arg == 0 ) + { +#ifdef EVAL_DEBUG + DWRITE ( "eval_tree_expr: division by zero!\n" ); +#endif + return MAX_DOUBLE_SIZE; + } + return ( left_arg / right_arg ); + default: +#ifdef EVAL_DEBUG + DWRITE ( "eval_tree_expr: unknown infix operator!\n" ); +#endif + return EVAL_ERROR; + } + + return EVAL_ERROR; +} + +/* Converts a float value to a general expression */ +GenExpr * GenExpr::const_to_expr ( float val ) +{ + + GenExpr * gen_expr; + ValExpr * val_expr; + Term term; + + term.constant = val; + + if ( ( val_expr = new ValExpr ( CONSTANT_TERM_T, &term ) ) == NULL ) + return NULL; + + gen_expr = new GenExpr ( VAL_T, ( void* ) val_expr ); + + if ( gen_expr == NULL ) + { + delete val_expr; + } + + return gen_expr; +} + +/* Converts a regular parameter to an expression */ +GenExpr * GenExpr::param_to_expr ( Param * param ) +{ + + GenExpr * gen_expr = NULL; + ValExpr * val_expr = NULL; + Term term; + + if ( param == NULL ) + return NULL; + + /* This code is still a work in progress. We need + to figure out if the initial condition is used for + each per frame equation or not. I am guessing that + it isn't, and it is thusly implemented this way */ + + /* Current guess of true behavior (08/01/03) note from carm + First try to use the per_pixel_expr (with cloning) + If it is null however, use the engine variable instead. */ + + /* 08/20/03 : Presets are now objects, as well as per pixel equations. This ends up + making the parser handle the case where parameters are essentially per pixel equation + substitutions */ + + + term.param = param; + if ( ( val_expr = new ValExpr ( PARAM_TERM_T, &term ) ) == NULL ) + return NULL; + + if ( ( gen_expr = new GenExpr ( VAL_T, ( void* ) val_expr ) ) == NULL ) + { + delete val_expr; + return NULL; + } + return gen_expr; +} + +/* Converts a prefix function to an expression */ +GenExpr * GenExpr::prefun_to_expr ( float ( *func_ptr ) ( void * ), GenExpr ** expr_list, int num_args ) +{ + + GenExpr * gen_expr; + PrefunExpr * prefun_expr; + + prefun_expr = new PrefunExpr(); + + if ( prefun_expr == NULL ) + return NULL; + + prefun_expr->num_args = num_args; + prefun_expr->func_ptr = ( float ( * ) ( void* ) ) func_ptr; + prefun_expr->expr_list = expr_list; + + gen_expr = new GenExpr ( PREFUN_T, ( void* ) prefun_expr ); + + if ( gen_expr == NULL ) + delete prefun_expr; + + return gen_expr; +} + +/* Creates a new tree expression */ +TreeExpr::TreeExpr ( InfixOp * _infix_op, GenExpr * _gen_expr, TreeExpr * _left, TreeExpr * _right ) : + infix_op ( _infix_op ), gen_expr ( _gen_expr ), + left ( _left ), right ( _right ) {} + + +/* Creates a new value expression */ +ValExpr::ValExpr ( int _type, Term * _term ) :type ( _type ) +{ + + + //val_expr->type = _type; + term.constant = _term->constant; + term.param = _term->param; + + //return val_expr; +} + +/* Creates a new general expression */ + +GenExpr::GenExpr ( int _type, void * _item ) :type ( _type ), item ( _item ) {} + +/* Frees a general expression */ +GenExpr::~GenExpr() +{ + + switch ( type ) + { + case VAL_T: + delete ( ( ValExpr* ) item ); + break; + case PREFUN_T: + delete ( ( PrefunExpr* ) item ); + break; + case TREE_T: + delete ( ( TreeExpr* ) item ); + break; + } +} + +/* Frees a function in prefix notation */ +PrefunExpr::~PrefunExpr() +{ + + int i; + + /* Free every element in expression list */ + for ( i = 0 ; i < num_args; i++ ) + { + delete expr_list[i]; + } + free ( expr_list ); +} + +/* Frees values of type VARIABLE and CONSTANT */ +ValExpr::~ValExpr() +{} + +/* Frees a tree expression */ +TreeExpr::~TreeExpr() +{ + + /* free left tree */ + if ( left != NULL ) + { + delete left; + } + + /* free general expression object */ + if ( gen_expr != NULL ) + { + delete gen_expr; + } + + /* Note that infix operators are always + stored in memory unless the program + exits, so we don't remove them here */ + + /* free right tree */ + if ( right != NULL ) + { + delete right; + } +} + +/* Initializes an infix operator */ +DLLEXPORT InfixOp::InfixOp ( int type, int precedence ) +{ + + this->type = type; + this->precedence = precedence; +} + + + +PrefunExpr::PrefunExpr() {} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Expr.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Expr.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Expr.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Expr.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,122 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Expression + * + * $Log$ + */ + +#ifndef _EXPR_H +#define _EXPR_H + +#include "dlldefs.h" +#include "CValue.hpp" + +class Param; + +#define CONST_STACK_ELEMENT 0 +#define EXPR_STACK_ELEMENT 1 + +#define EVAL_ERROR -1 + +/* Infix Operator Function */ +class InfixOp +{ +public: + int type; + int precedence; + + DLLEXPORT InfixOp( int type, int precedence ); +}; + +/** Term */ +class Term +{ +public: + float constant; /* static variable */ + Param *param; /* pointer to a changing variable */ + + Term() { this->constant = 0; this->param = 0; } +}; + +/* General Expression Type */ +class GenExpr +{ +public: + int type; + void * item; + + ~GenExpr(); + + GenExpr( int type, void *item ); + float eval_gen_expr(int mesh_i, int mesh_j); + + static GenExpr *const_to_expr( float val ); + static GenExpr *param_to_expr( Param *param ); + static GenExpr *prefun_to_expr( float (*func_ptr)(void *), GenExpr **expr_list, int num_args ); +}; + +/* Value expression, contains a term union */ +class ValExpr +{ +public: + int type; + Term term; + + ~ValExpr(); + ValExpr( int type, Term *term ); + + float eval_val_expr(int mesh_i, int mesh_j); +}; + +/* A binary expression tree ordered by operator precedence */ +class TreeExpr +{ +public: + InfixOp * infix_op; /* null if leaf */ + GenExpr * gen_expr; + TreeExpr *left, *right; + + ~TreeExpr(); + TreeExpr( InfixOp *infix_op, GenExpr *gen_expr, + TreeExpr *left, TreeExpr *right ); + + float eval_tree_expr(int mesh_i, int mesh_j); +}; + +/* A function expression in prefix form */ +class PrefunExpr +{ +public: + float (*func_ptr)(void*); + int num_args; + GenExpr **expr_list; + PrefunExpr(); + ~PrefunExpr(); + + /* Evaluates functions in prefix form */ + float eval_prefun_expr(int mesh_i, int mesh_j); + +}; + +#endif /** _EXPR_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/fatal.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/fatal.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/fatal.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/fatal.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,43 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: fatal.h,v 1.1.1.1 2005/12/23 18:05:05 psperl Exp $ + * + * Error codes + * + * $Log$ + */ + +#ifndef _FATAL_H +#define _FATAL_H + +/* Fatal Error Definitions */ + +#define PROJECTM_OUTOFMEM_ERROR -7; /* out of memory */ +#define PROJECTM_ERROR -1 /* non specific error */ +#define PROJECTM_SUCCESS 1 +#define PROJECTM_FAILURE -1 +#define PROJECTM_PARSE_ERROR -11 +#define PROJECTM_DIV_BY_ZERO -3 +#define PROJECTM_OK 2 + +#endif /** !_FATAL_H */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/FBO.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/FBO.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/FBO.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/FBO.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,301 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: FBO.c,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $ + * + * Render this methods + */ + +#include +//#include + +#include "Common.hpp" +#include "FBO.hpp" + + + +RenderTarget::~RenderTarget() { + + + glDeleteTextures( 1, &this->textureID[0]); + +#ifdef USE_FBO + if (useFBO) + { + glDeleteTextures( 1, &this->textureID[1] ); + glDeleteRenderbuffersEXT(1, &this->depthb[0]); + glDeleteFramebuffersEXT(1, &this->fbuffer[0]); + if(renderToTexture) + { + glDeleteTextures( 1, &this->textureID[2] ); + glDeleteRenderbuffersEXT(1, &this->depthb[1]); + glDeleteFramebuffersEXT(1, &this->fbuffer[1]); + } + } +#endif + +} + +GLuint RenderTarget::initRenderToTexture() +{ +#ifdef USE_FBO + + if (this->useFBO==1) + { + this->renderToTexture=1; + + GLuint fb2, depth_rb2; + glGenFramebuffersEXT(1, &fb2); + glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb2 ); + glGenRenderbuffersEXT(1, &depth_rb2); + glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb2 ); + + glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->texsize,this->texsize ); + glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb2 ); + this->fbuffer[1] = fb2; + this->depthb[1]= depth_rb2; + glGenTextures(1, &this->textureID[2]); + glBindTexture(GL_TEXTURE_2D, this->textureID[2]); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, this->textureID[2], 0 ); + return this->textureID[2]; + } +#endif +return -1; + +} + +/** Creates new pbuffers */ +RenderTarget::RenderTarget(int texsize, int width, int height, bool use_fbo) : useFBO(use_fbo) { + + int mindim = 0; + int origtexsize = 0; + + this->renderToTexture = 0; + this->useFBO = use_fbo; + this->texsize = texsize; + +#ifdef USE_FBO + if(this->useFBO) + { + //glewInit(); + + if(glewIsSupported("GL_EXT_framebuffer_object")) + { + + GLuint fb, depth_rb, rgba_tex, other_tex; + glGenFramebuffersEXT(1, &fb); + glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb ); + + glGenRenderbuffersEXT(1, &depth_rb); + glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb ); + glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->texsize,this->texsize ); + glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb ); + this->fbuffer[0] = fb; + this->depthb[0]= depth_rb; + + glGenTextures(1, &other_tex); + glBindTexture(GL_TEXTURE_2D,other_tex); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + //glGenerateMipmapEXT(GL_TEXTURE_2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + + + + glGenTextures(1, &rgba_tex); + glBindTexture(GL_TEXTURE_2D, rgba_tex); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + //glGenerateMipmapEXT(GL_TEXTURE_2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + + + + glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, rgba_tex, 0 ); + this->textureID[0] = rgba_tex; + this->textureID[1] = other_tex; + + GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + if (status == GL_FRAMEBUFFER_COMPLETE_EXT) { + this->renderToTexture = 1; + return; + } + } + + } + + this->useFBO=false; +#else + this->useFBO=false; +#endif + /** Fallback pbuf;fer creation via teximage hack */ + /** Check the texture size against the viewport size */ + /** If the viewport is smaller, then we'll need to scale the texture size down */ + /** If the viewport is larger, scale it up */ + mindim = width < height ? width : height; + origtexsize = this->texsize; + this->texsize = nearestPower2( mindim, SCALE_MINIFY ); + this->texsize = origtexsize; // ^-- ok, texsize is just ignored with this + + + + glGenTextures(1, &this->textureID[0] ); + + glBindTexture(GL_TEXTURE_2D, this->textureID[0] ); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGB, + this->texsize, this->texsize, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + NULL); + + + + return; + } + + void RenderTarget::fallbackRescale(int width, int height) + { + int mindim = width < height ? width : height; + int origtexsize = this->texsize; + this->texsize = nearestPower2( mindim, SCALE_MINIFY ); + if (!this->useFBO) { + this->texsize = origtexsize; // ^-- ok, texsize is just ignored with the previous assignment + } + /* Create the texture that will be bound to the render this */ + /* + + if ( this->texsize != origtexsize ) { + + glDeleteTextures( 1, &this->textureID[0] ); + } + */ + + + glGenTextures(1, &this->textureID[0] ); + + glBindTexture(GL_TEXTURE_2D, this->textureID[0] ); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGB, + this->texsize, this->texsize, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + NULL); + + + } + +/** Destroys the pbuffer */ + +/** Locks the pbuffer */ +void RenderTarget::lock() { + +#ifdef USE_FBO + if(this->useFBO) + { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->fbuffer[0]); + } +#endif + } + +/** Unlocks the pbuffer */ +void RenderTarget::unlock() { + +#ifdef USE_FBO + if(this->useFBO) + { + glBindTexture( GL_TEXTURE_2D, this->textureID[1] ); + glCopyTexSubImage2D( GL_TEXTURE_2D, + 0, 0, 0, 0, 0, + this->texsize, this->texsize ); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + return; + } +#endif + /** Fallback texture path */ + glBindTexture( GL_TEXTURE_2D, this->textureID[0] ); + + glCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, this->texsize, this->texsize ); + } + +/** + * Calculates the nearest power of two to the given number using the + * appropriate rule + */ +int RenderTarget::nearestPower2( int value, TextureScale scaleRule ) { + + int x = value; + int power = 0; + + while ( ( x & 0x01 ) != 1 ) { + x >>= 1; + } + + if ( x == 1 ) { + return value; + } else { + x = value; + while ( x != 0 ) { + x >>= 1; + power++; + } + switch ( scaleRule ) { + case SCALE_NEAREST: + if ( ( ( 1 << power ) - value ) <= ( value - ( 1 << ( power - 1 ) ) ) ) { + return 1 << power; + } else { + return 1 << ( power - 1 ); + } + case SCALE_MAGNIFY: + return 1 << power; + case SCALE_MINIFY: + return 1 << ( power - 1 ); + default: + break; + } + } + return 0; + } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/FBO.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/FBO.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/FBO.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/FBO.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,96 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: FBO.hpp,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $ + * + * Opaque render target + * + */ + +#ifndef _RENDERTARGET_H +#define _RENDERTARGET_H + +#ifdef USE_FBO +#ifdef USE_NATIVE_GLEW +#include "glew.h" +#else +#include +#endif +#endif + +#ifdef MACOS +#include +#include +#endif /** MACOS */ + +#ifdef WIN32 +#include +#endif /** WIN32 */ + +#ifdef LINUX +#ifdef USE_GLES1 +#include +#else +#include +#include +#endif +#endif + +typedef enum { SCALE_NEAREST, SCALE_MAGNIFY, SCALE_MINIFY } TextureScale; + +class RenderTarget { + + +public: + /** Texture size */ + int texsize; + + int useFBO; + int renderToTexture; + + ~RenderTarget(); + + RenderTarget( int texsize, int width, int height, bool use_fbo=false ); + void lock(); + void unlock(); + GLuint initRenderToTexture(); + int nearestPower2( int value, TextureScale scaleRule ); + void fallbackRescale(int width, int height); + + /** Opaque pbuffer context and pbuffer */ +/* +#ifdef MACOS + void *origContext; + void *pbufferContext; + void *pbuffer; +#endif +*/ + /** Render target texture ID for non-pbuffer systems */ + GLuint textureID[3]; +#ifdef USE_FBO + GLuint fbuffer[2]; + GLuint depthb[2]; +#endif + }; + + + +#endif /** !_RENDERTARGET_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/fftsg.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/fftsg.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/fftsg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/fftsg.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,3325 @@ +/* +Fast Fourier/Cosine/Sine Transform + dimension :one + data length :power of 2 + decimation :frequency + radix :split-radix + data :inplace + table :use +functions + cdft: Complex Discrete Fourier Transform + rdft: Real Discrete Fourier Transform + ddct: Discrete Cosine Transform + ddst: Discrete Sine Transform + dfct: Cosine Transform of RDFT (Real Symmetric DFT) + dfst: Sine Transform of RDFT (Real Anti-symmetric DFT) +function prototypes + void cdft(int, int, double *, int *, double *); + void rdft(int, int, double *, int *, double *); + void ddct(int, int, double *, int *, double *); + void ddst(int, int, double *, int *, double *); + void dfct(int, double *, double *, int *, double *); + void dfst(int, double *, double *, int *, double *); +macro definitions + USE_CDFT_PTHREADS : default=not defined + CDFT_THREADS_BEGIN_N : must be >= 512, default=8192 + CDFT_4THREADS_BEGIN_N : must be >= 512, default=65536 + USE_CDFT_WINTHREADS : default=not defined + CDFT_THREADS_BEGIN_N : must be >= 512, default=32768 + CDFT_4THREADS_BEGIN_N : must be >= 512, default=524288 + + +-------- Complex DFT (Discrete Fourier Transform) -------- + [definition] + + X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k + X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k + ip[0] = 0; // first time only + cdft(2*n, 1, a, ip, w); + + ip[0] = 0; // first time only + cdft(2*n, -1, a, ip, w); + [parameters] + 2*n :data length (int) + n >= 1, n = power of 2 + a[0...2*n-1] :input/output data (double *) + input data + a[2*j] = Re(x[j]), + a[2*j+1] = Im(x[j]), 0<=j= 2+sqrt(n) + strictly, + length of ip >= + 2+(1<<(int)(log(n+0.5)/log(2))/2). + ip[0],ip[1] are pointers of the cos/sin table. + w[0...n/2-1] :cos/sin table (double *) + w[],ip[] are initialized if ip[0] == 0. + [remark] + Inverse of + cdft(2*n, -1, a, ip, w); + is + cdft(2*n, 1, a, ip, w); + for (j = 0; j <= 2 * n - 1; j++) { + a[j] *= 1.0 / n; + } + . + + +-------- Real DFT / Inverse of Real DFT -------- + [definition] + RDFT + R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2 + I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0 IRDFT (excluding scale) + a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + + sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + + sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k + ip[0] = 0; // first time only + rdft(n, 1, a, ip, w); + + ip[0] = 0; // first time only + rdft(n, -1, a, ip, w); + [parameters] + n :data length (int) + n >= 2, n = power of 2 + a[0...n-1] :input/output data (double *) + + output data + a[2*k] = R[k], 0<=k + input data + a[2*j] = R[j], 0<=j= 2+sqrt(n/2) + strictly, + length of ip >= + 2+(1<<(int)(log(n/2+0.5)/log(2))/2). + ip[0],ip[1] are pointers of the cos/sin table. + w[0...n/2-1] :cos/sin table (double *) + w[],ip[] are initialized if ip[0] == 0. + [remark] + Inverse of + rdft(n, 1, a, ip, w); + is + rdft(n, -1, a, ip, w); + for (j = 0; j <= n - 1; j++) { + a[j] *= 2.0 / n; + } + . + + +-------- DCT (Discrete Cosine Transform) / Inverse of DCT -------- + [definition] + IDCT (excluding scale) + C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k DCT + C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k + ip[0] = 0; // first time only + ddct(n, 1, a, ip, w); + + ip[0] = 0; // first time only + ddct(n, -1, a, ip, w); + [parameters] + n :data length (int) + n >= 2, n = power of 2 + a[0...n-1] :input/output data (double *) + output data + a[k] = C[k], 0<=k= 2+sqrt(n/2) + strictly, + length of ip >= + 2+(1<<(int)(log(n/2+0.5)/log(2))/2). + ip[0],ip[1] are pointers of the cos/sin table. + w[0...n*5/4-1] :cos/sin table (double *) + w[],ip[] are initialized if ip[0] == 0. + [remark] + Inverse of + ddct(n, -1, a, ip, w); + is + a[0] *= 0.5; + ddct(n, 1, a, ip, w); + for (j = 0; j <= n - 1; j++) { + a[j] *= 2.0 / n; + } + . + + +-------- DST (Discrete Sine Transform) / Inverse of DST -------- + [definition] + IDST (excluding scale) + S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k DST + S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0 + ip[0] = 0; // first time only + ddst(n, 1, a, ip, w); + + ip[0] = 0; // first time only + ddst(n, -1, a, ip, w); + [parameters] + n :data length (int) + n >= 2, n = power of 2 + a[0...n-1] :input/output data (double *) + + input data + a[j] = A[j], 0 + output data + a[k] = S[k], 0= 2+sqrt(n/2) + strictly, + length of ip >= + 2+(1<<(int)(log(n/2+0.5)/log(2))/2). + ip[0],ip[1] are pointers of the cos/sin table. + w[0...n*5/4-1] :cos/sin table (double *) + w[],ip[] are initialized if ip[0] == 0. + [remark] + Inverse of + ddst(n, -1, a, ip, w); + is + a[0] *= 0.5; + ddst(n, 1, a, ip, w); + for (j = 0; j <= n - 1; j++) { + a[j] *= 2.0 / n; + } + . + + +-------- Cosine Transform of RDFT (Real Symmetric DFT) -------- + [definition] + C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n + [usage] + ip[0] = 0; // first time only + dfct(n, a, t, ip, w); + [parameters] + n :data length - 1 (int) + n >= 2, n = power of 2 + a[0...n] :input/output data (double *) + output data + a[k] = C[k], 0<=k<=n + t[0...n/2] :work area (double *) + ip[0...*] :work area for bit reversal (int *) + length of ip >= 2+sqrt(n/4) + strictly, + length of ip >= + 2+(1<<(int)(log(n/4+0.5)/log(2))/2). + ip[0],ip[1] are pointers of the cos/sin table. + w[0...n*5/8-1] :cos/sin table (double *) + w[],ip[] are initialized if ip[0] == 0. + [remark] + Inverse of + a[0] *= 0.5; + a[n] *= 0.5; + dfct(n, a, t, ip, w); + is + a[0] *= 0.5; + a[n] *= 0.5; + dfct(n, a, t, ip, w); + for (j = 0; j <= n; j++) { + a[j] *= 2.0 / n; + } + . + + +-------- Sine Transform of RDFT (Real Anti-symmetric DFT) -------- + [definition] + S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0= 2, n = power of 2 + a[0...n-1] :input/output data (double *) + output data + a[k] = S[k], 0= 2+sqrt(n/4) + strictly, + length of ip >= + 2+(1<<(int)(log(n/4+0.5)/log(2))/2). + ip[0],ip[1] are pointers of the cos/sin table. + w[0...n*5/8-1] :cos/sin table (double *) + w[],ip[] are initialized if ip[0] == 0. + [remark] + Inverse of + dfst(n, a, t, ip, w); + is + dfst(n, a, t, ip, w); + for (j = 1; j <= n - 1; j++) { + a[j] *= 2.0 / n; + } + . + + +Appendix : + The cos/sin table is recalculated when the larger table required. + w[] and ip[] are compatible with all routines. +*/ + + +void cdft(int n, int isgn, double *a, int *ip, double *w) +{ + void makewt(int nw, int *ip, double *w); + void cftfsub(int n, double *a, int *ip, int nw, double *w); + void cftbsub(int n, double *a, int *ip, int nw, double *w); + int nw; + + nw = ip[0]; + if (n > (nw << 2)) { + nw = n >> 2; + makewt(nw, ip, w); + } + if (isgn >= 0) { + cftfsub(n, a, ip, nw, w); + } else { + cftbsub(n, a, ip, nw, w); + } +} + + +void rdft(int n, int isgn, double *a, int *ip, double *w) +{ + void makewt(int nw, int *ip, double *w); + void makect(int nc, int *ip, double *c); + void cftfsub(int n, double *a, int *ip, int nw, double *w); + void cftbsub(int n, double *a, int *ip, int nw, double *w); + void rftfsub(int n, double *a, int nc, double *c); + void rftbsub(int n, double *a, int nc, double *c); + int nw, nc; + double xi; + + nw = ip[0]; + if (n > (nw << 2)) { + nw = n >> 2; + makewt(nw, ip, w); + } + nc = ip[1]; + if (n > (nc << 2)) { + nc = n >> 2; + makect(nc, ip, w + nw); + } + if (isgn >= 0) { + if (n > 4) { + cftfsub(n, a, ip, nw, w); + rftfsub(n, a, nc, w + nw); + } else if (n == 4) { + cftfsub(n, a, ip, nw, w); + } + xi = a[0] - a[1]; + a[0] += a[1]; + a[1] = xi; + } else { + a[1] = 0.5 * (a[0] - a[1]); + a[0] -= a[1]; + if (n > 4) { + rftbsub(n, a, nc, w + nw); + cftbsub(n, a, ip, nw, w); + } else if (n == 4) { + cftbsub(n, a, ip, nw, w); + } + } +} + + +void ddct(int n, int isgn, double *a, int *ip, double *w) +{ + void makewt(int nw, int *ip, double *w); + void makect(int nc, int *ip, double *c); + void cftfsub(int n, double *a, int *ip, int nw, double *w); + void cftbsub(int n, double *a, int *ip, int nw, double *w); + void rftfsub(int n, double *a, int nc, double *c); + void rftbsub(int n, double *a, int nc, double *c); + void dctsub(int n, double *a, int nc, double *c); + int j, nw, nc; + double xr; + + nw = ip[0]; + if (n > (nw << 2)) { + nw = n >> 2; + makewt(nw, ip, w); + } + nc = ip[1]; + if (n > nc) { + nc = n; + makect(nc, ip, w + nw); + } + if (isgn < 0) { + xr = a[n - 1]; + for (j = n - 2; j >= 2; j -= 2) { + a[j + 1] = a[j] - a[j - 1]; + a[j] += a[j - 1]; + } + a[1] = a[0] - xr; + a[0] += xr; + if (n > 4) { + rftbsub(n, a, nc, w + nw); + cftbsub(n, a, ip, nw, w); + } else if (n == 4) { + cftbsub(n, a, ip, nw, w); + } + } + dctsub(n, a, nc, w + nw); + if (isgn >= 0) { + if (n > 4) { + cftfsub(n, a, ip, nw, w); + rftfsub(n, a, nc, w + nw); + } else if (n == 4) { + cftfsub(n, a, ip, nw, w); + } + xr = a[0] - a[1]; + a[0] += a[1]; + for (j = 2; j < n; j += 2) { + a[j - 1] = a[j] - a[j + 1]; + a[j] += a[j + 1]; + } + a[n - 1] = xr; + } +} + + +void ddst(int n, int isgn, double *a, int *ip, double *w) +{ + void makewt(int nw, int *ip, double *w); + void makect(int nc, int *ip, double *c); + void cftfsub(int n, double *a, int *ip, int nw, double *w); + void cftbsub(int n, double *a, int *ip, int nw, double *w); + void rftfsub(int n, double *a, int nc, double *c); + void rftbsub(int n, double *a, int nc, double *c); + void dstsub(int n, double *a, int nc, double *c); + int j, nw, nc; + double xr; + + nw = ip[0]; + if (n > (nw << 2)) { + nw = n >> 2; + makewt(nw, ip, w); + } + nc = ip[1]; + if (n > nc) { + nc = n; + makect(nc, ip, w + nw); + } + if (isgn < 0) { + xr = a[n - 1]; + for (j = n - 2; j >= 2; j -= 2) { + a[j + 1] = -a[j] - a[j - 1]; + a[j] -= a[j - 1]; + } + a[1] = a[0] + xr; + a[0] -= xr; + if (n > 4) { + rftbsub(n, a, nc, w + nw); + cftbsub(n, a, ip, nw, w); + } else if (n == 4) { + cftbsub(n, a, ip, nw, w); + } + } + dstsub(n, a, nc, w + nw); + if (isgn >= 0) { + if (n > 4) { + cftfsub(n, a, ip, nw, w); + rftfsub(n, a, nc, w + nw); + } else if (n == 4) { + cftfsub(n, a, ip, nw, w); + } + xr = a[0] - a[1]; + a[0] += a[1]; + for (j = 2; j < n; j += 2) { + a[j - 1] = -a[j] - a[j + 1]; + a[j] -= a[j + 1]; + } + a[n - 1] = -xr; + } +} + + +void dfct(int n, double *a, double *t, int *ip, double *w) +{ + void makewt(int nw, int *ip, double *w); + void makect(int nc, int *ip, double *c); + void cftfsub(int n, double *a, int *ip, int nw, double *w); + void rftfsub(int n, double *a, int nc, double *c); + void dctsub(int n, double *a, int nc, double *c); + int j, k, l, m, mh, nw, nc; + double xr, xi, yr, yi; + + nw = ip[0]; + if (n > (nw << 3)) { + nw = n >> 3; + makewt(nw, ip, w); + } + nc = ip[1]; + if (n > (nc << 1)) { + nc = n >> 1; + makect(nc, ip, w + nw); + } + m = n >> 1; + yi = a[m]; + xi = a[0] + a[n]; + a[0] -= a[n]; + t[0] = xi - yi; + t[m] = xi + yi; + if (n > 2) { + mh = m >> 1; + for (j = 1; j < mh; j++) { + k = m - j; + xr = a[j] - a[n - j]; + xi = a[j] + a[n - j]; + yr = a[k] - a[n - k]; + yi = a[k] + a[n - k]; + a[j] = xr; + a[k] = yr; + t[j] = xi - yi; + t[k] = xi + yi; + } + t[mh] = a[mh] + a[n - mh]; + a[mh] -= a[n - mh]; + dctsub(m, a, nc, w + nw); + if (m > 4) { + cftfsub(m, a, ip, nw, w); + rftfsub(m, a, nc, w + nw); + } else if (m == 4) { + cftfsub(m, a, ip, nw, w); + } + a[n - 1] = a[0] - a[1]; + a[1] = a[0] + a[1]; + for (j = m - 2; j >= 2; j -= 2) { + a[2 * j + 1] = a[j] + a[j + 1]; + a[2 * j - 1] = a[j] - a[j + 1]; + } + l = 2; + m = mh; + while (m >= 2) { + dctsub(m, t, nc, w + nw); + if (m > 4) { + cftfsub(m, t, ip, nw, w); + rftfsub(m, t, nc, w + nw); + } else if (m == 4) { + cftfsub(m, t, ip, nw, w); + } + a[n - l] = t[0] - t[1]; + a[l] = t[0] + t[1]; + k = 0; + for (j = 2; j < m; j += 2) { + k += l << 2; + a[k - l] = t[j] - t[j + 1]; + a[k + l] = t[j] + t[j + 1]; + } + l <<= 1; + mh = m >> 1; + for (j = 0; j < mh; j++) { + k = m - j; + t[j] = t[m + k] - t[m + j]; + t[k] = t[m + k] + t[m + j]; + } + t[mh] = t[m + mh]; + m = mh; + } + a[l] = t[0]; + a[n] = t[2] - t[1]; + a[0] = t[2] + t[1]; + } else { + a[1] = a[0]; + a[2] = t[0]; + a[0] = t[1]; + } +} + + +void dfst(int n, double *a, double *t, int *ip, double *w) +{ + void makewt(int nw, int *ip, double *w); + void makect(int nc, int *ip, double *c); + void cftfsub(int n, double *a, int *ip, int nw, double *w); + void rftfsub(int n, double *a, int nc, double *c); + void dstsub(int n, double *a, int nc, double *c); + int j, k, l, m, mh, nw, nc; + double xr, xi, yr, yi; + + nw = ip[0]; + if (n > (nw << 3)) { + nw = n >> 3; + makewt(nw, ip, w); + } + nc = ip[1]; + if (n > (nc << 1)) { + nc = n >> 1; + makect(nc, ip, w + nw); + } + if (n > 2) { + m = n >> 1; + mh = m >> 1; + for (j = 1; j < mh; j++) { + k = m - j; + xr = a[j] + a[n - j]; + xi = a[j] - a[n - j]; + yr = a[k] + a[n - k]; + yi = a[k] - a[n - k]; + a[j] = xr; + a[k] = yr; + t[j] = xi + yi; + t[k] = xi - yi; + } + t[0] = a[mh] - a[n - mh]; + a[mh] += a[n - mh]; + a[0] = a[m]; + dstsub(m, a, nc, w + nw); + if (m > 4) { + cftfsub(m, a, ip, nw, w); + rftfsub(m, a, nc, w + nw); + } else if (m == 4) { + cftfsub(m, a, ip, nw, w); + } + a[n - 1] = a[1] - a[0]; + a[1] = a[0] + a[1]; + for (j = m - 2; j >= 2; j -= 2) { + a[2 * j + 1] = a[j] - a[j + 1]; + a[2 * j - 1] = -a[j] - a[j + 1]; + } + l = 2; + m = mh; + while (m >= 2) { + dstsub(m, t, nc, w + nw); + if (m > 4) { + cftfsub(m, t, ip, nw, w); + rftfsub(m, t, nc, w + nw); + } else if (m == 4) { + cftfsub(m, t, ip, nw, w); + } + a[n - l] = t[1] - t[0]; + a[l] = t[0] + t[1]; + k = 0; + for (j = 2; j < m; j += 2) { + k += l << 2; + a[k - l] = -t[j] - t[j + 1]; + a[k + l] = t[j] - t[j + 1]; + } + l <<= 1; + mh = m >> 1; + for (j = 1; j < mh; j++) { + k = m - j; + t[j] = t[m + k] + t[m + j]; + t[k] = t[m + k] - t[m + j]; + } + t[0] = t[m + mh]; + m = mh; + } + a[l] = t[0]; + } + a[0] = 0; +} + + +/* -------- initializing routines -------- */ + + +#include + +void makewt(int nw, int *ip, double *w) +{ + void makeipt(int nw, int *ip); + int j, nwh, nw0, nw1; + double delta, wn4r, wk1r, wk1i, wk3r, wk3i; + + ip[0] = nw; + ip[1] = 1; + if (nw > 2) { + nwh = nw >> 1; + delta = atan(1.0) / nwh; + wn4r = cos(delta * nwh); + w[0] = 1; + w[1] = wn4r; + if (nwh == 4) { + w[2] = cos(delta * 2); + w[3] = sin(delta * 2); + } else if (nwh > 4) { + makeipt(nw, ip); + w[2] = 0.5 / cos(delta * 2); + w[3] = 0.5 / cos(delta * 6); + for (j = 4; j < nwh; j += 4) { + w[j] = cos(delta * j); + w[j + 1] = sin(delta * j); + w[j + 2] = cos(3 * delta * j); + w[j + 3] = -sin(3 * delta * j); + } + } + nw0 = 0; + while (nwh > 2) { + nw1 = nw0 + nwh; + nwh >>= 1; + w[nw1] = 1; + w[nw1 + 1] = wn4r; + if (nwh == 4) { + wk1r = w[nw0 + 4]; + wk1i = w[nw0 + 5]; + w[nw1 + 2] = wk1r; + w[nw1 + 3] = wk1i; + } else if (nwh > 4) { + wk1r = w[nw0 + 4]; + wk3r = w[nw0 + 6]; + w[nw1 + 2] = 0.5 / wk1r; + w[nw1 + 3] = 0.5 / wk3r; + for (j = 4; j < nwh; j += 4) { + wk1r = w[nw0 + 2 * j]; + wk1i = w[nw0 + 2 * j + 1]; + wk3r = w[nw0 + 2 * j + 2]; + wk3i = w[nw0 + 2 * j + 3]; + w[nw1 + j] = wk1r; + w[nw1 + j + 1] = wk1i; + w[nw1 + j + 2] = wk3r; + w[nw1 + j + 3] = wk3i; + } + } + nw0 = nw1; + } + } +} + + +void makeipt(int nw, int *ip) +{ + int j, l, m, m2, p, q; + + ip[2] = 0; + ip[3] = 16; + m = 2; + for (l = nw; l > 32; l >>= 2) { + m2 = m << 1; + q = m2 << 3; + for (j = m; j < m2; j++) { + p = ip[j] << 2; + ip[m + j] = p; + ip[m2 + j] = p + q; + } + m = m2; + } +} + + +void makect(int nc, int *ip, double *c) +{ + int j, nch; + double delta; + + ip[1] = nc; + if (nc > 1) { + nch = nc >> 1; + delta = atan(1.0) / nch; + c[0] = cos(delta * nch); + c[nch] = 0.5 * c[0]; + for (j = 1; j < nch; j++) { + c[j] = 0.5 * cos(delta * j); + c[nc - j] = 0.5 * sin(delta * j); + } + } +} + + +/* -------- child routines -------- */ + + +#ifdef USE_CDFT_PTHREADS +#define USE_CDFT_THREADS +#ifndef CDFT_THREADS_BEGIN_N +#define CDFT_THREADS_BEGIN_N 8192 +#endif +#ifndef CDFT_4THREADS_BEGIN_N +#define CDFT_4THREADS_BEGIN_N 65536 +#endif +#include +#include +#include +#define cdft_thread_t pthread_t +#define cdft_thread_create(thp,func,argp) { \ + if (pthread_create(thp, NULL, func, (void *) argp) != 0) { \ + fprintf(stderr, "cdft thread error\n"); \ + exit(1); \ + } \ +} +#define cdft_thread_wait(th) { \ + if (pthread_join(th, NULL) != 0) { \ + fprintf(stderr, "cdft thread error\n"); \ + exit(1); \ + } \ +} +#endif /* USE_CDFT_PTHREADS */ + + +#ifdef USE_CDFT_WINTHREADS +#define USE_CDFT_THREADS +#ifndef CDFT_THREADS_BEGIN_N +#define CDFT_THREADS_BEGIN_N 32768 +#endif +#ifndef CDFT_4THREADS_BEGIN_N +#define CDFT_4THREADS_BEGIN_N 524288 +#endif +#include +#include +#include +#define cdft_thread_t HANDLE +#ifdef __FreeBSD__ +#define cdft_thread_create(thp,func,argp) { \ + LONG thid; \ + *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); \ + if (*(thp) == 0) { \ + fprintf(stderr, "cdft thread error\n"); \ + exit(1); \ + } \ +} +#else +#define cdft_thread_create(thp,func,argp) { \ + DWORD thid; \ + *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); \ + if (*(thp) == 0) { \ + fprintf(stderr, "cdft thread error\n"); \ + exit(1); \ + } \ +} +#endif +#define cdft_thread_wait(th) { \ + WaitForSingleObject(th, INFINITE); \ + CloseHandle(th); \ +} +#endif /* USE_CDFT_WINTHREADS */ + + +void cftfsub(int n, double *a, int *ip, int nw, double *w) +{ + void bitrv2(int n, int *ip, double *a); + void bitrv216(double *a); + void bitrv208(double *a); + void cftf1st(int n, double *a, double *w); + void cftrec4(int n, double *a, int nw, double *w); + void cftleaf(int n, int isplt, double *a, int nw, double *w); + void cftfx41(int n, double *a, int nw, double *w); + void cftf161(double *a, double *w); + void cftf081(double *a, double *w); + void cftf040(double *a); + void cftx020(double *a); +#ifdef USE_CDFT_THREADS + void cftrec4_th(int n, double *a, int nw, double *w); +#endif /* USE_CDFT_THREADS */ + + if (n > 8) { + if (n > 32) { + cftf1st(n, a, &w[nw - (n >> 2)]); +#ifdef USE_CDFT_THREADS + if (n > CDFT_THREADS_BEGIN_N) { + cftrec4_th(n, a, nw, w); + } else +#endif /* USE_CDFT_THREADS */ + if (n > 512) { + cftrec4(n, a, nw, w); + } else if (n > 128) { + cftleaf(n, 1, a, nw, w); + } else { + cftfx41(n, a, nw, w); + } + bitrv2(n, ip, a); + } else if (n == 32) { + cftf161(a, &w[nw - 8]); + bitrv216(a); + } else { + cftf081(a, w); + bitrv208(a); + } + } else if (n == 8) { + cftf040(a); + } else if (n == 4) { + cftx020(a); + } +} + + +void cftbsub(int n, double *a, int *ip, int nw, double *w) +{ + void bitrv2conj(int n, int *ip, double *a); + void bitrv216neg(double *a); + void bitrv208neg(double *a); + void cftb1st(int n, double *a, double *w); + void cftrec4(int n, double *a, int nw, double *w); + void cftleaf(int n, int isplt, double *a, int nw, double *w); + void cftfx41(int n, double *a, int nw, double *w); + void cftf161(double *a, double *w); + void cftf081(double *a, double *w); + void cftb040(double *a); + void cftx020(double *a); +#ifdef USE_CDFT_THREADS + void cftrec4_th(int n, double *a, int nw, double *w); +#endif /* USE_CDFT_THREADS */ + + if (n > 8) { + if (n > 32) { + cftb1st(n, a, &w[nw - (n >> 2)]); +#ifdef USE_CDFT_THREADS + if (n > CDFT_THREADS_BEGIN_N) { + cftrec4_th(n, a, nw, w); + } else +#endif /* USE_CDFT_THREADS */ + if (n > 512) { + cftrec4(n, a, nw, w); + } else if (n > 128) { + cftleaf(n, 1, a, nw, w); + } else { + cftfx41(n, a, nw, w); + } + bitrv2conj(n, ip, a); + } else if (n == 32) { + cftf161(a, &w[nw - 8]); + bitrv216neg(a); + } else { + cftf081(a, w); + bitrv208neg(a); + } + } else if (n == 8) { + cftb040(a); + } else if (n == 4) { + cftx020(a); + } +} + + +void bitrv2(int n, int *ip, double *a) +{ + int j, j1, k, k1, l, m, nh, nm; + double xr, xi, yr, yi; + + m = 1; + for (l = n >> 2; l > 8; l >>= 2) { + m <<= 1; + } + nh = n >> 1; + nm = 4 * m; + if (l == 8) { + for (k = 0; k < m; k++) { + for (j = 0; j < k; j++) { + j1 = 4 * j + 2 * ip[m + k]; + k1 = 4 * k + 2 * ip[m + j]; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh; + k1 += 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 += nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += 2; + k1 += nh; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh; + k1 -= 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 += nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + k1 = 4 * k + 2 * ip[m + k]; + j1 = k1 + 2; + k1 += nh; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= 2; + k1 -= nh; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh + 2; + k1 += nh + 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh - nm; + k1 += 2 * nm - 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + } else { + for (k = 0; k < m; k++) { + for (j = 0; j < k; j++) { + j1 = 4 * j + ip[m + k]; + k1 = 4 * k + ip[m + j]; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh; + k1 += 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += 2; + k1 += nh; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh; + k1 -= 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + k1 = 4 * k + ip[m + k]; + j1 = k1 + 2; + k1 += nh; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + } +} + + +void bitrv2conj(int n, int *ip, double *a) +{ + int j, j1, k, k1, l, m, nh, nm; + double xr, xi, yr, yi; + + m = 1; + for (l = n >> 2; l > 8; l >>= 2) { + m <<= 1; + } + nh = n >> 1; + nm = 4 * m; + if (l == 8) { + for (k = 0; k < m; k++) { + for (j = 0; j < k; j++) { + j1 = 4 * j + 2 * ip[m + k]; + k1 = 4 * k + 2 * ip[m + j]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh; + k1 += 2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 += nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += 2; + k1 += nh; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh; + k1 -= 2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 += nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + k1 = 4 * k + 2 * ip[m + k]; + j1 = k1 + 2; + k1 += nh; + a[j1 - 1] = -a[j1 - 1]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + a[k1 + 3] = -a[k1 + 3]; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= 2; + k1 -= nh; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh + 2; + k1 += nh + 2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh - nm; + k1 += 2 * nm - 2; + a[j1 - 1] = -a[j1 - 1]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + a[k1 + 3] = -a[k1 + 3]; + } + } else { + for (k = 0; k < m; k++) { + for (j = 0; j < k; j++) { + j1 = 4 * j + ip[m + k]; + k1 = 4 * k + ip[m + j]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh; + k1 += 2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += 2; + k1 += nh; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh; + k1 -= 2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + k1 = 4 * k + ip[m + k]; + j1 = k1 + 2; + k1 += nh; + a[j1 - 1] = -a[j1 - 1]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + a[k1 + 3] = -a[k1 + 3]; + j1 += nm; + k1 += nm; + a[j1 - 1] = -a[j1 - 1]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + a[k1 + 3] = -a[k1 + 3]; + } + } +} + + +void bitrv216(double *a) +{ + double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, + x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, + x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i; + + x1r = a[2]; + x1i = a[3]; + x2r = a[4]; + x2i = a[5]; + x3r = a[6]; + x3i = a[7]; + x4r = a[8]; + x4i = a[9]; + x5r = a[10]; + x5i = a[11]; + x7r = a[14]; + x7i = a[15]; + x8r = a[16]; + x8i = a[17]; + x10r = a[20]; + x10i = a[21]; + x11r = a[22]; + x11i = a[23]; + x12r = a[24]; + x12i = a[25]; + x13r = a[26]; + x13i = a[27]; + x14r = a[28]; + x14i = a[29]; + a[2] = x8r; + a[3] = x8i; + a[4] = x4r; + a[5] = x4i; + a[6] = x12r; + a[7] = x12i; + a[8] = x2r; + a[9] = x2i; + a[10] = x10r; + a[11] = x10i; + a[14] = x14r; + a[15] = x14i; + a[16] = x1r; + a[17] = x1i; + a[20] = x5r; + a[21] = x5i; + a[22] = x13r; + a[23] = x13i; + a[24] = x3r; + a[25] = x3i; + a[26] = x11r; + a[27] = x11i; + a[28] = x7r; + a[29] = x7i; +} + + +void bitrv216neg(double *a) +{ + double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, + x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, + x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, + x13r, x13i, x14r, x14i, x15r, x15i; + + x1r = a[2]; + x1i = a[3]; + x2r = a[4]; + x2i = a[5]; + x3r = a[6]; + x3i = a[7]; + x4r = a[8]; + x4i = a[9]; + x5r = a[10]; + x5i = a[11]; + x6r = a[12]; + x6i = a[13]; + x7r = a[14]; + x7i = a[15]; + x8r = a[16]; + x8i = a[17]; + x9r = a[18]; + x9i = a[19]; + x10r = a[20]; + x10i = a[21]; + x11r = a[22]; + x11i = a[23]; + x12r = a[24]; + x12i = a[25]; + x13r = a[26]; + x13i = a[27]; + x14r = a[28]; + x14i = a[29]; + x15r = a[30]; + x15i = a[31]; + a[2] = x15r; + a[3] = x15i; + a[4] = x7r; + a[5] = x7i; + a[6] = x11r; + a[7] = x11i; + a[8] = x3r; + a[9] = x3i; + a[10] = x13r; + a[11] = x13i; + a[12] = x5r; + a[13] = x5i; + a[14] = x9r; + a[15] = x9i; + a[16] = x1r; + a[17] = x1i; + a[18] = x14r; + a[19] = x14i; + a[20] = x6r; + a[21] = x6i; + a[22] = x10r; + a[23] = x10i; + a[24] = x2r; + a[25] = x2i; + a[26] = x12r; + a[27] = x12i; + a[28] = x4r; + a[29] = x4i; + a[30] = x8r; + a[31] = x8i; +} + + +void bitrv208(double *a) +{ + double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i; + + x1r = a[2]; + x1i = a[3]; + x3r = a[6]; + x3i = a[7]; + x4r = a[8]; + x4i = a[9]; + x6r = a[12]; + x6i = a[13]; + a[2] = x4r; + a[3] = x4i; + a[6] = x6r; + a[7] = x6i; + a[8] = x1r; + a[9] = x1i; + a[12] = x3r; + a[13] = x3i; +} + + +void bitrv208neg(double *a) +{ + double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, + x5r, x5i, x6r, x6i, x7r, x7i; + + x1r = a[2]; + x1i = a[3]; + x2r = a[4]; + x2i = a[5]; + x3r = a[6]; + x3i = a[7]; + x4r = a[8]; + x4i = a[9]; + x5r = a[10]; + x5i = a[11]; + x6r = a[12]; + x6i = a[13]; + x7r = a[14]; + x7i = a[15]; + a[2] = x7r; + a[3] = x7i; + a[4] = x3r; + a[5] = x3i; + a[6] = x5r; + a[7] = x5i; + a[8] = x1r; + a[9] = x1i; + a[10] = x6r; + a[11] = x6i; + a[12] = x2r; + a[13] = x2i; + a[14] = x4r; + a[15] = x4i; +} + + +void cftf1st(int n, double *a, double *w) +{ + int j, j0, j1, j2, j3, k, m, mh; + double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, + wd1r, wd1i, wd3r, wd3i; + double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, + y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i; + + mh = n >> 3; + m = 2 * mh; + j1 = m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[0] + a[j2]; + x0i = a[1] + a[j2 + 1]; + x1r = a[0] - a[j2]; + x1i = a[1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + a[j2] = x1r - x3i; + a[j2 + 1] = x1i + x3r; + a[j3] = x1r + x3i; + a[j3 + 1] = x1i - x3r; + wn4r = w[1]; + csc1 = w[2]; + csc3 = w[3]; + wd1r = 1; + wd1i = 0; + wd3r = 1; + wd3i = 0; + k = 0; + for (j = 2; j < mh - 2; j += 4) { + k += 4; + wk1r = csc1 * (wd1r + w[k]); + wk1i = csc1 * (wd1i + w[k + 1]); + wk3r = csc3 * (wd3r + w[k + 2]); + wk3i = csc3 * (wd3i + w[k + 3]); + wd1r = w[k]; + wd1i = w[k + 1]; + wd3r = w[k + 2]; + wd3i = w[k + 3]; + j1 = j + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j] + a[j2]; + x0i = a[j + 1] + a[j2 + 1]; + x1r = a[j] - a[j2]; + x1i = a[j + 1] - a[j2 + 1]; + y0r = a[j + 2] + a[j2 + 2]; + y0i = a[j + 3] + a[j2 + 3]; + y1r = a[j + 2] - a[j2 + 2]; + y1i = a[j + 3] - a[j2 + 3]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + y2r = a[j1 + 2] + a[j3 + 2]; + y2i = a[j1 + 3] + a[j3 + 3]; + y3r = a[j1 + 2] - a[j3 + 2]; + y3i = a[j1 + 3] - a[j3 + 3]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + a[j + 2] = y0r + y2r; + a[j + 3] = y0i + y2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + a[j1 + 2] = y0r - y2r; + a[j1 + 3] = y0i - y2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wk1r * x0r - wk1i * x0i; + a[j2 + 1] = wk1r * x0i + wk1i * x0r; + x0r = y1r - y3i; + x0i = y1i + y3r; + a[j2 + 2] = wd1r * x0r - wd1i * x0i; + a[j2 + 3] = wd1r * x0i + wd1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3r * x0r + wk3i * x0i; + a[j3 + 1] = wk3r * x0i - wk3i * x0r; + x0r = y1r + y3i; + x0i = y1i - y3r; + a[j3 + 2] = wd3r * x0r + wd3i * x0i; + a[j3 + 3] = wd3r * x0i - wd3i * x0r; + j0 = m - j; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] + a[j2]; + x0i = a[j0 + 1] + a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = a[j0 + 1] - a[j2 + 1]; + y0r = a[j0 - 2] + a[j2 - 2]; + y0i = a[j0 - 1] + a[j2 - 1]; + y1r = a[j0 - 2] - a[j2 - 2]; + y1i = a[j0 - 1] - a[j2 - 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + y2r = a[j1 - 2] + a[j3 - 2]; + y2i = a[j1 - 1] + a[j3 - 1]; + y3r = a[j1 - 2] - a[j3 - 2]; + y3i = a[j1 - 1] - a[j3 - 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i + x2i; + a[j0 - 2] = y0r + y2r; + a[j0 - 1] = y0i + y2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + a[j1 - 2] = y0r - y2r; + a[j1 - 1] = y0i - y2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wk1i * x0r - wk1r * x0i; + a[j2 + 1] = wk1i * x0i + wk1r * x0r; + x0r = y1r - y3i; + x0i = y1i + y3r; + a[j2 - 2] = wd1i * x0r - wd1r * x0i; + a[j2 - 1] = wd1i * x0i + wd1r * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3i * x0r + wk3r * x0i; + a[j3 + 1] = wk3i * x0i - wk3r * x0r; + x0r = y1r + y3i; + x0i = y1i - y3r; + a[j3 - 2] = wd3i * x0r + wd3r * x0i; + a[j3 - 1] = wd3i * x0i - wd3r * x0r; + } + wk1r = csc1 * (wd1r + wn4r); + wk1i = csc1 * (wd1i + wn4r); + wk3r = csc3 * (wd3r - wn4r); + wk3i = csc3 * (wd3i - wn4r); + j0 = mh; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0 - 2] + a[j2 - 2]; + x0i = a[j0 - 1] + a[j2 - 1]; + x1r = a[j0 - 2] - a[j2 - 2]; + x1i = a[j0 - 1] - a[j2 - 1]; + x2r = a[j1 - 2] + a[j3 - 2]; + x2i = a[j1 - 1] + a[j3 - 1]; + x3r = a[j1 - 2] - a[j3 - 2]; + x3i = a[j1 - 1] - a[j3 - 1]; + a[j0 - 2] = x0r + x2r; + a[j0 - 1] = x0i + x2i; + a[j1 - 2] = x0r - x2r; + a[j1 - 1] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2 - 2] = wk1r * x0r - wk1i * x0i; + a[j2 - 1] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3 - 2] = wk3r * x0r + wk3i * x0i; + a[j3 - 1] = wk3r * x0i - wk3i * x0r; + x0r = a[j0] + a[j2]; + x0i = a[j0 + 1] + a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = a[j0 + 1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wn4r * (x0r - x0i); + a[j2 + 1] = wn4r * (x0i + x0r); + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = -wn4r * (x0r + x0i); + a[j3 + 1] = -wn4r * (x0i - x0r); + x0r = a[j0 + 2] + a[j2 + 2]; + x0i = a[j0 + 3] + a[j2 + 3]; + x1r = a[j0 + 2] - a[j2 + 2]; + x1i = a[j0 + 3] - a[j2 + 3]; + x2r = a[j1 + 2] + a[j3 + 2]; + x2i = a[j1 + 3] + a[j3 + 3]; + x3r = a[j1 + 2] - a[j3 + 2]; + x3i = a[j1 + 3] - a[j3 + 3]; + a[j0 + 2] = x0r + x2r; + a[j0 + 3] = x0i + x2i; + a[j1 + 2] = x0r - x2r; + a[j1 + 3] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2 + 2] = wk1i * x0r - wk1r * x0i; + a[j2 + 3] = wk1i * x0i + wk1r * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3 + 2] = wk3i * x0r + wk3r * x0i; + a[j3 + 3] = wk3i * x0i - wk3r * x0r; +} + + +void cftb1st(int n, double *a, double *w) +{ + int j, j0, j1, j2, j3, k, m, mh; + double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, + wd1r, wd1i, wd3r, wd3i; + double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, + y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i; + + mh = n >> 3; + m = 2 * mh; + j1 = m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[0] + a[j2]; + x0i = -a[1] - a[j2 + 1]; + x1r = a[0] - a[j2]; + x1i = -a[1] + a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[0] = x0r + x2r; + a[1] = x0i - x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i + x2i; + a[j2] = x1r + x3i; + a[j2 + 1] = x1i + x3r; + a[j3] = x1r - x3i; + a[j3 + 1] = x1i - x3r; + wn4r = w[1]; + csc1 = w[2]; + csc3 = w[3]; + wd1r = 1; + wd1i = 0; + wd3r = 1; + wd3i = 0; + k = 0; + for (j = 2; j < mh - 2; j += 4) { + k += 4; + wk1r = csc1 * (wd1r + w[k]); + wk1i = csc1 * (wd1i + w[k + 1]); + wk3r = csc3 * (wd3r + w[k + 2]); + wk3i = csc3 * (wd3i + w[k + 3]); + wd1r = w[k]; + wd1i = w[k + 1]; + wd3r = w[k + 2]; + wd3i = w[k + 3]; + j1 = j + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j] + a[j2]; + x0i = -a[j + 1] - a[j2 + 1]; + x1r = a[j] - a[j2]; + x1i = -a[j + 1] + a[j2 + 1]; + y0r = a[j + 2] + a[j2 + 2]; + y0i = -a[j + 3] - a[j2 + 3]; + y1r = a[j + 2] - a[j2 + 2]; + y1i = -a[j + 3] + a[j2 + 3]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + y2r = a[j1 + 2] + a[j3 + 2]; + y2i = a[j1 + 3] + a[j3 + 3]; + y3r = a[j1 + 2] - a[j3 + 2]; + y3i = a[j1 + 3] - a[j3 + 3]; + a[j] = x0r + x2r; + a[j + 1] = x0i - x2i; + a[j + 2] = y0r + y2r; + a[j + 3] = y0i - y2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i + x2i; + a[j1 + 2] = y0r - y2r; + a[j1 + 3] = y0i + y2i; + x0r = x1r + x3i; + x0i = x1i + x3r; + a[j2] = wk1r * x0r - wk1i * x0i; + a[j2 + 1] = wk1r * x0i + wk1i * x0r; + x0r = y1r + y3i; + x0i = y1i + y3r; + a[j2 + 2] = wd1r * x0r - wd1i * x0i; + a[j2 + 3] = wd1r * x0i + wd1i * x0r; + x0r = x1r - x3i; + x0i = x1i - x3r; + a[j3] = wk3r * x0r + wk3i * x0i; + a[j3 + 1] = wk3r * x0i - wk3i * x0r; + x0r = y1r - y3i; + x0i = y1i - y3r; + a[j3 + 2] = wd3r * x0r + wd3i * x0i; + a[j3 + 3] = wd3r * x0i - wd3i * x0r; + j0 = m - j; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] + a[j2]; + x0i = -a[j0 + 1] - a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = -a[j0 + 1] + a[j2 + 1]; + y0r = a[j0 - 2] + a[j2 - 2]; + y0i = -a[j0 - 1] - a[j2 - 1]; + y1r = a[j0 - 2] - a[j2 - 2]; + y1i = -a[j0 - 1] + a[j2 - 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + y2r = a[j1 - 2] + a[j3 - 2]; + y2i = a[j1 - 1] + a[j3 - 1]; + y3r = a[j1 - 2] - a[j3 - 2]; + y3i = a[j1 - 1] - a[j3 - 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i - x2i; + a[j0 - 2] = y0r + y2r; + a[j0 - 1] = y0i - y2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i + x2i; + a[j1 - 2] = y0r - y2r; + a[j1 - 1] = y0i + y2i; + x0r = x1r + x3i; + x0i = x1i + x3r; + a[j2] = wk1i * x0r - wk1r * x0i; + a[j2 + 1] = wk1i * x0i + wk1r * x0r; + x0r = y1r + y3i; + x0i = y1i + y3r; + a[j2 - 2] = wd1i * x0r - wd1r * x0i; + a[j2 - 1] = wd1i * x0i + wd1r * x0r; + x0r = x1r - x3i; + x0i = x1i - x3r; + a[j3] = wk3i * x0r + wk3r * x0i; + a[j3 + 1] = wk3i * x0i - wk3r * x0r; + x0r = y1r - y3i; + x0i = y1i - y3r; + a[j3 - 2] = wd3i * x0r + wd3r * x0i; + a[j3 - 1] = wd3i * x0i - wd3r * x0r; + } + wk1r = csc1 * (wd1r + wn4r); + wk1i = csc1 * (wd1i + wn4r); + wk3r = csc3 * (wd3r - wn4r); + wk3i = csc3 * (wd3i - wn4r); + j0 = mh; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0 - 2] + a[j2 - 2]; + x0i = -a[j0 - 1] - a[j2 - 1]; + x1r = a[j0 - 2] - a[j2 - 2]; + x1i = -a[j0 - 1] + a[j2 - 1]; + x2r = a[j1 - 2] + a[j3 - 2]; + x2i = a[j1 - 1] + a[j3 - 1]; + x3r = a[j1 - 2] - a[j3 - 2]; + x3i = a[j1 - 1] - a[j3 - 1]; + a[j0 - 2] = x0r + x2r; + a[j0 - 1] = x0i - x2i; + a[j1 - 2] = x0r - x2r; + a[j1 - 1] = x0i + x2i; + x0r = x1r + x3i; + x0i = x1i + x3r; + a[j2 - 2] = wk1r * x0r - wk1i * x0i; + a[j2 - 1] = wk1r * x0i + wk1i * x0r; + x0r = x1r - x3i; + x0i = x1i - x3r; + a[j3 - 2] = wk3r * x0r + wk3i * x0i; + a[j3 - 1] = wk3r * x0i - wk3i * x0r; + x0r = a[j0] + a[j2]; + x0i = -a[j0 + 1] - a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = -a[j0 + 1] + a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i - x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i + x2i; + x0r = x1r + x3i; + x0i = x1i + x3r; + a[j2] = wn4r * (x0r - x0i); + a[j2 + 1] = wn4r * (x0i + x0r); + x0r = x1r - x3i; + x0i = x1i - x3r; + a[j3] = -wn4r * (x0r + x0i); + a[j3 + 1] = -wn4r * (x0i - x0r); + x0r = a[j0 + 2] + a[j2 + 2]; + x0i = -a[j0 + 3] - a[j2 + 3]; + x1r = a[j0 + 2] - a[j2 + 2]; + x1i = -a[j0 + 3] + a[j2 + 3]; + x2r = a[j1 + 2] + a[j3 + 2]; + x2i = a[j1 + 3] + a[j3 + 3]; + x3r = a[j1 + 2] - a[j3 + 2]; + x3i = a[j1 + 3] - a[j3 + 3]; + a[j0 + 2] = x0r + x2r; + a[j0 + 3] = x0i - x2i; + a[j1 + 2] = x0r - x2r; + a[j1 + 3] = x0i + x2i; + x0r = x1r + x3i; + x0i = x1i + x3r; + a[j2 + 2] = wk1i * x0r - wk1r * x0i; + a[j2 + 3] = wk1i * x0i + wk1r * x0r; + x0r = x1r - x3i; + x0i = x1i - x3r; + a[j3 + 2] = wk3i * x0r + wk3r * x0i; + a[j3 + 3] = wk3i * x0i - wk3r * x0r; +} + + +#ifdef USE_CDFT_THREADS +struct cdft_arg_st { + int n0; + int n; + double *a; + int nw; + double *w; +}; +typedef struct cdft_arg_st cdft_arg_t; + + +void cftrec4_th(int n, double *a, int nw, double *w) +{ + void *cftrec1_th(void *p); + void *cftrec2_th(void *p); + int i, idiv4, m, nthread; + cdft_thread_t th[4]; + cdft_arg_t ag[4]; + + nthread = 2; + idiv4 = 0; + m = n >> 1; + if (n > CDFT_4THREADS_BEGIN_N) { + nthread = 4; + idiv4 = 1; + m >>= 1; + } + for (i = 0; i < nthread; i++) { + ag[i].n0 = n; + ag[i].n = m; + ag[i].a = &a[i * m]; + ag[i].nw = nw; + ag[i].w = w; + if (i != idiv4) { + cdft_thread_create(&th[i], cftrec1_th, &ag[i]); + } else { + cdft_thread_create(&th[i], cftrec2_th, &ag[i]); + } + } + for (i = 0; i < nthread; i++) { + cdft_thread_wait(th[i]); + } +} + + +void *cftrec1_th(void *p) +{ + int cfttree(int n, int j, int k, double *a, int nw, double *w); + void cftleaf(int n, int isplt, double *a, int nw, double *w); + void cftmdl1(int n, double *a, double *w); + int isplt, j, k, m, n, n0, nw; + double *a, *w; + + n0 = ((cdft_arg_t *) p)->n0; + n = ((cdft_arg_t *) p)->n; + a = ((cdft_arg_t *) p)->a; + nw = ((cdft_arg_t *) p)->nw; + w = ((cdft_arg_t *) p)->w; + m = n0; + while (m > 512) { + m >>= 2; + cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]); + } + cftleaf(m, 1, &a[n - m], nw, w); + k = 0; + for (j = n - m; j > 0; j -= m) { + k++; + isplt = cfttree(m, j, k, a, nw, w); + cftleaf(m, isplt, &a[j - m], nw, w); + } + return (void *) 0; +} + + +void *cftrec2_th(void *p) +{ + int cfttree(int n, int j, int k, double *a, int nw, double *w); + void cftleaf(int n, int isplt, double *a, int nw, double *w); + void cftmdl2(int n, double *a, double *w); + int isplt, j, k, m, n, n0, nw; + double *a, *w; + + n0 = ((cdft_arg_t *) p)->n0; + n = ((cdft_arg_t *) p)->n; + a = ((cdft_arg_t *) p)->a; + nw = ((cdft_arg_t *) p)->nw; + w = ((cdft_arg_t *) p)->w; + k = 1; + m = n0; + while (m > 512) { + m >>= 2; + k <<= 2; + cftmdl2(m, &a[n - m], &w[nw - m]); + } + cftleaf(m, 0, &a[n - m], nw, w); + k >>= 1; + for (j = n - m; j > 0; j -= m) { + k++; + isplt = cfttree(m, j, k, a, nw, w); + cftleaf(m, isplt, &a[j - m], nw, w); + } + return (void *) 0; +} +#endif /* USE_CDFT_THREADS */ + + +void cftrec4(int n, double *a, int nw, double *w) +{ + int cfttree(int n, int j, int k, double *a, int nw, double *w); + void cftleaf(int n, int isplt, double *a, int nw, double *w); + void cftmdl1(int n, double *a, double *w); + int isplt, j, k, m; + + m = n; + while (m > 512) { + m >>= 2; + cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]); + } + cftleaf(m, 1, &a[n - m], nw, w); + k = 0; + for (j = n - m; j > 0; j -= m) { + k++; + isplt = cfttree(m, j, k, a, nw, w); + cftleaf(m, isplt, &a[j - m], nw, w); + } +} + + +int cfttree(int n, int j, int k, double *a, int nw, double *w) +{ + void cftmdl1(int n, double *a, double *w); + void cftmdl2(int n, double *a, double *w); + int i, isplt, m; + + if ((k & 3) != 0) { + isplt = k & 1; + if (isplt != 0) { + cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]); + } else { + cftmdl2(n, &a[j - n], &w[nw - n]); + } + } else { + m = n; + for (i = k; (i & 3) == 0; i >>= 2) { + m <<= 2; + } + isplt = i & 1; + if (isplt != 0) { + while (m > 128) { + cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]); + m >>= 2; + } + } else { + while (m > 128) { + cftmdl2(m, &a[j - m], &w[nw - m]); + m >>= 2; + } + } + } + return isplt; +} + + +void cftleaf(int n, int isplt, double *a, int nw, double *w) +{ + void cftmdl1(int n, double *a, double *w); + void cftmdl2(int n, double *a, double *w); + void cftf161(double *a, double *w); + void cftf162(double *a, double *w); + void cftf081(double *a, double *w); + void cftf082(double *a, double *w); + + if (n == 512) { + cftmdl1(128, a, &w[nw - 64]); + cftf161(a, &w[nw - 8]); + cftf162(&a[32], &w[nw - 32]); + cftf161(&a[64], &w[nw - 8]); + cftf161(&a[96], &w[nw - 8]); + cftmdl2(128, &a[128], &w[nw - 128]); + cftf161(&a[128], &w[nw - 8]); + cftf162(&a[160], &w[nw - 32]); + cftf161(&a[192], &w[nw - 8]); + cftf162(&a[224], &w[nw - 32]); + cftmdl1(128, &a[256], &w[nw - 64]); + cftf161(&a[256], &w[nw - 8]); + cftf162(&a[288], &w[nw - 32]); + cftf161(&a[320], &w[nw - 8]); + cftf161(&a[352], &w[nw - 8]); + if (isplt != 0) { + cftmdl1(128, &a[384], &w[nw - 64]); + cftf161(&a[480], &w[nw - 8]); + } else { + cftmdl2(128, &a[384], &w[nw - 128]); + cftf162(&a[480], &w[nw - 32]); + } + cftf161(&a[384], &w[nw - 8]); + cftf162(&a[416], &w[nw - 32]); + cftf161(&a[448], &w[nw - 8]); + } else { + cftmdl1(64, a, &w[nw - 32]); + cftf081(a, &w[nw - 8]); + cftf082(&a[16], &w[nw - 8]); + cftf081(&a[32], &w[nw - 8]); + cftf081(&a[48], &w[nw - 8]); + cftmdl2(64, &a[64], &w[nw - 64]); + cftf081(&a[64], &w[nw - 8]); + cftf082(&a[80], &w[nw - 8]); + cftf081(&a[96], &w[nw - 8]); + cftf082(&a[112], &w[nw - 8]); + cftmdl1(64, &a[128], &w[nw - 32]); + cftf081(&a[128], &w[nw - 8]); + cftf082(&a[144], &w[nw - 8]); + cftf081(&a[160], &w[nw - 8]); + cftf081(&a[176], &w[nw - 8]); + if (isplt != 0) { + cftmdl1(64, &a[192], &w[nw - 32]); + cftf081(&a[240], &w[nw - 8]); + } else { + cftmdl2(64, &a[192], &w[nw - 64]); + cftf082(&a[240], &w[nw - 8]); + } + cftf081(&a[192], &w[nw - 8]); + cftf082(&a[208], &w[nw - 8]); + cftf081(&a[224], &w[nw - 8]); + } +} + + +void cftmdl1(int n, double *a, double *w) +{ + int j, j0, j1, j2, j3, k, m, mh; + double wn4r, wk1r, wk1i, wk3r, wk3i; + double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + mh = n >> 3; + m = 2 * mh; + j1 = m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[0] + a[j2]; + x0i = a[1] + a[j2 + 1]; + x1r = a[0] - a[j2]; + x1i = a[1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + a[j2] = x1r - x3i; + a[j2 + 1] = x1i + x3r; + a[j3] = x1r + x3i; + a[j3 + 1] = x1i - x3r; + wn4r = w[1]; + k = 0; + for (j = 2; j < mh; j += 2) { + k += 4; + wk1r = w[k]; + wk1i = w[k + 1]; + wk3r = w[k + 2]; + wk3i = w[k + 3]; + j1 = j + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j] + a[j2]; + x0i = a[j + 1] + a[j2 + 1]; + x1r = a[j] - a[j2]; + x1i = a[j + 1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wk1r * x0r - wk1i * x0i; + a[j2 + 1] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3r * x0r + wk3i * x0i; + a[j3 + 1] = wk3r * x0i - wk3i * x0r; + j0 = m - j; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] + a[j2]; + x0i = a[j0 + 1] + a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = a[j0 + 1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wk1i * x0r - wk1r * x0i; + a[j2 + 1] = wk1i * x0i + wk1r * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3i * x0r + wk3r * x0i; + a[j3 + 1] = wk3i * x0i - wk3r * x0r; + } + j0 = mh; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] + a[j2]; + x0i = a[j0 + 1] + a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = a[j0 + 1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wn4r * (x0r - x0i); + a[j2 + 1] = wn4r * (x0i + x0r); + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = -wn4r * (x0r + x0i); + a[j3 + 1] = -wn4r * (x0i - x0r); +} + + +void cftmdl2(int n, double *a, double *w) +{ + int j, j0, j1, j2, j3, k, kr, m, mh; + double wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i; + double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i; + + mh = n >> 3; + m = 2 * mh; + wn4r = w[1]; + j1 = m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[0] - a[j2 + 1]; + x0i = a[1] + a[j2]; + x1r = a[0] + a[j2 + 1]; + x1i = a[1] - a[j2]; + x2r = a[j1] - a[j3 + 1]; + x2i = a[j1 + 1] + a[j3]; + x3r = a[j1] + a[j3 + 1]; + x3i = a[j1 + 1] - a[j3]; + y0r = wn4r * (x2r - x2i); + y0i = wn4r * (x2i + x2r); + a[0] = x0r + y0r; + a[1] = x0i + y0i; + a[j1] = x0r - y0r; + a[j1 + 1] = x0i - y0i; + y0r = wn4r * (x3r - x3i); + y0i = wn4r * (x3i + x3r); + a[j2] = x1r - y0i; + a[j2 + 1] = x1i + y0r; + a[j3] = x1r + y0i; + a[j3 + 1] = x1i - y0r; + k = 0; + kr = 2 * m; + for (j = 2; j < mh; j += 2) { + k += 4; + wk1r = w[k]; + wk1i = w[k + 1]; + wk3r = w[k + 2]; + wk3i = w[k + 3]; + kr -= 4; + wd1i = w[kr]; + wd1r = w[kr + 1]; + wd3i = w[kr + 2]; + wd3r = w[kr + 3]; + j1 = j + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j] - a[j2 + 1]; + x0i = a[j + 1] + a[j2]; + x1r = a[j] + a[j2 + 1]; + x1i = a[j + 1] - a[j2]; + x2r = a[j1] - a[j3 + 1]; + x2i = a[j1 + 1] + a[j3]; + x3r = a[j1] + a[j3 + 1]; + x3i = a[j1 + 1] - a[j3]; + y0r = wk1r * x0r - wk1i * x0i; + y0i = wk1r * x0i + wk1i * x0r; + y2r = wd1r * x2r - wd1i * x2i; + y2i = wd1r * x2i + wd1i * x2r; + a[j] = y0r + y2r; + a[j + 1] = y0i + y2i; + a[j1] = y0r - y2r; + a[j1 + 1] = y0i - y2i; + y0r = wk3r * x1r + wk3i * x1i; + y0i = wk3r * x1i - wk3i * x1r; + y2r = wd3r * x3r + wd3i * x3i; + y2i = wd3r * x3i - wd3i * x3r; + a[j2] = y0r + y2r; + a[j2 + 1] = y0i + y2i; + a[j3] = y0r - y2r; + a[j3 + 1] = y0i - y2i; + j0 = m - j; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] - a[j2 + 1]; + x0i = a[j0 + 1] + a[j2]; + x1r = a[j0] + a[j2 + 1]; + x1i = a[j0 + 1] - a[j2]; + x2r = a[j1] - a[j3 + 1]; + x2i = a[j1 + 1] + a[j3]; + x3r = a[j1] + a[j3 + 1]; + x3i = a[j1 + 1] - a[j3]; + y0r = wd1i * x0r - wd1r * x0i; + y0i = wd1i * x0i + wd1r * x0r; + y2r = wk1i * x2r - wk1r * x2i; + y2i = wk1i * x2i + wk1r * x2r; + a[j0] = y0r + y2r; + a[j0 + 1] = y0i + y2i; + a[j1] = y0r - y2r; + a[j1 + 1] = y0i - y2i; + y0r = wd3i * x1r + wd3r * x1i; + y0i = wd3i * x1i - wd3r * x1r; + y2r = wk3i * x3r + wk3r * x3i; + y2i = wk3i * x3i - wk3r * x3r; + a[j2] = y0r + y2r; + a[j2 + 1] = y0i + y2i; + a[j3] = y0r - y2r; + a[j3 + 1] = y0i - y2i; + } + wk1r = w[m]; + wk1i = w[m + 1]; + j0 = mh; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] - a[j2 + 1]; + x0i = a[j0 + 1] + a[j2]; + x1r = a[j0] + a[j2 + 1]; + x1i = a[j0 + 1] - a[j2]; + x2r = a[j1] - a[j3 + 1]; + x2i = a[j1 + 1] + a[j3]; + x3r = a[j1] + a[j3 + 1]; + x3i = a[j1 + 1] - a[j3]; + y0r = wk1r * x0r - wk1i * x0i; + y0i = wk1r * x0i + wk1i * x0r; + y2r = wk1i * x2r - wk1r * x2i; + y2i = wk1i * x2i + wk1r * x2r; + a[j0] = y0r + y2r; + a[j0 + 1] = y0i + y2i; + a[j1] = y0r - y2r; + a[j1 + 1] = y0i - y2i; + y0r = wk1i * x1r - wk1r * x1i; + y0i = wk1i * x1i + wk1r * x1r; + y2r = wk1r * x3r - wk1i * x3i; + y2i = wk1r * x3i + wk1i * x3r; + a[j2] = y0r - y2r; + a[j2 + 1] = y0i - y2i; + a[j3] = y0r + y2r; + a[j3 + 1] = y0i + y2i; +} + + +void cftfx41(int n, double *a, int nw, double *w) +{ + void cftf161(double *a, double *w); + void cftf162(double *a, double *w); + void cftf081(double *a, double *w); + void cftf082(double *a, double *w); + + if (n == 128) { + cftf161(a, &w[nw - 8]); + cftf162(&a[32], &w[nw - 32]); + cftf161(&a[64], &w[nw - 8]); + cftf161(&a[96], &w[nw - 8]); + } else { + cftf081(a, &w[nw - 8]); + cftf082(&a[16], &w[nw - 8]); + cftf081(&a[32], &w[nw - 8]); + cftf081(&a[48], &w[nw - 8]); + } +} + + +void cftf161(double *a, double *w) +{ + double wn4r, wk1r, wk1i, + x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, + y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, + y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, + y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, + y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i; + + wn4r = w[1]; + wk1r = w[2]; + wk1i = w[3]; + x0r = a[0] + a[16]; + x0i = a[1] + a[17]; + x1r = a[0] - a[16]; + x1i = a[1] - a[17]; + x2r = a[8] + a[24]; + x2i = a[9] + a[25]; + x3r = a[8] - a[24]; + x3i = a[9] - a[25]; + y0r = x0r + x2r; + y0i = x0i + x2i; + y4r = x0r - x2r; + y4i = x0i - x2i; + y8r = x1r - x3i; + y8i = x1i + x3r; + y12r = x1r + x3i; + y12i = x1i - x3r; + x0r = a[2] + a[18]; + x0i = a[3] + a[19]; + x1r = a[2] - a[18]; + x1i = a[3] - a[19]; + x2r = a[10] + a[26]; + x2i = a[11] + a[27]; + x3r = a[10] - a[26]; + x3i = a[11] - a[27]; + y1r = x0r + x2r; + y1i = x0i + x2i; + y5r = x0r - x2r; + y5i = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + y9r = wk1r * x0r - wk1i * x0i; + y9i = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + y13r = wk1i * x0r - wk1r * x0i; + y13i = wk1i * x0i + wk1r * x0r; + x0r = a[4] + a[20]; + x0i = a[5] + a[21]; + x1r = a[4] - a[20]; + x1i = a[5] - a[21]; + x2r = a[12] + a[28]; + x2i = a[13] + a[29]; + x3r = a[12] - a[28]; + x3i = a[13] - a[29]; + y2r = x0r + x2r; + y2i = x0i + x2i; + y6r = x0r - x2r; + y6i = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + y10r = wn4r * (x0r - x0i); + y10i = wn4r * (x0i + x0r); + x0r = x1r + x3i; + x0i = x1i - x3r; + y14r = wn4r * (x0r + x0i); + y14i = wn4r * (x0i - x0r); + x0r = a[6] + a[22]; + x0i = a[7] + a[23]; + x1r = a[6] - a[22]; + x1i = a[7] - a[23]; + x2r = a[14] + a[30]; + x2i = a[15] + a[31]; + x3r = a[14] - a[30]; + x3i = a[15] - a[31]; + y3r = x0r + x2r; + y3i = x0i + x2i; + y7r = x0r - x2r; + y7i = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + y11r = wk1i * x0r - wk1r * x0i; + y11i = wk1i * x0i + wk1r * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + y15r = wk1r * x0r - wk1i * x0i; + y15i = wk1r * x0i + wk1i * x0r; + x0r = y12r - y14r; + x0i = y12i - y14i; + x1r = y12r + y14r; + x1i = y12i + y14i; + x2r = y13r - y15r; + x2i = y13i - y15i; + x3r = y13r + y15r; + x3i = y13i + y15i; + a[24] = x0r + x2r; + a[25] = x0i + x2i; + a[26] = x0r - x2r; + a[27] = x0i - x2i; + a[28] = x1r - x3i; + a[29] = x1i + x3r; + a[30] = x1r + x3i; + a[31] = x1i - x3r; + x0r = y8r + y10r; + x0i = y8i + y10i; + x1r = y8r - y10r; + x1i = y8i - y10i; + x2r = y9r + y11r; + x2i = y9i + y11i; + x3r = y9r - y11r; + x3i = y9i - y11i; + a[16] = x0r + x2r; + a[17] = x0i + x2i; + a[18] = x0r - x2r; + a[19] = x0i - x2i; + a[20] = x1r - x3i; + a[21] = x1i + x3r; + a[22] = x1r + x3i; + a[23] = x1i - x3r; + x0r = y5r - y7i; + x0i = y5i + y7r; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + x0r = y5r + y7i; + x0i = y5i - y7r; + x3r = wn4r * (x0r - x0i); + x3i = wn4r * (x0i + x0r); + x0r = y4r - y6i; + x0i = y4i + y6r; + x1r = y4r + y6i; + x1i = y4i - y6r; + a[8] = x0r + x2r; + a[9] = x0i + x2i; + a[10] = x0r - x2r; + a[11] = x0i - x2i; + a[12] = x1r - x3i; + a[13] = x1i + x3r; + a[14] = x1r + x3i; + a[15] = x1i - x3r; + x0r = y0r + y2r; + x0i = y0i + y2i; + x1r = y0r - y2r; + x1i = y0i - y2i; + x2r = y1r + y3r; + x2i = y1i + y3i; + x3r = y1r - y3r; + x3i = y1i - y3i; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[2] = x0r - x2r; + a[3] = x0i - x2i; + a[4] = x1r - x3i; + a[5] = x1i + x3r; + a[6] = x1r + x3i; + a[7] = x1i - x3r; +} + + +void cftf162(double *a, double *w) +{ + double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, + x0r, x0i, x1r, x1i, x2r, x2i, + y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, + y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, + y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, + y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i; + + wn4r = w[1]; + wk1r = w[4]; + wk1i = w[5]; + wk3r = w[6]; + wk3i = -w[7]; + wk2r = w[8]; + wk2i = w[9]; + x1r = a[0] - a[17]; + x1i = a[1] + a[16]; + x0r = a[8] - a[25]; + x0i = a[9] + a[24]; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + y0r = x1r + x2r; + y0i = x1i + x2i; + y4r = x1r - x2r; + y4i = x1i - x2i; + x1r = a[0] + a[17]; + x1i = a[1] - a[16]; + x0r = a[8] + a[25]; + x0i = a[9] - a[24]; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + y8r = x1r - x2i; + y8i = x1i + x2r; + y12r = x1r + x2i; + y12i = x1i - x2r; + x0r = a[2] - a[19]; + x0i = a[3] + a[18]; + x1r = wk1r * x0r - wk1i * x0i; + x1i = wk1r * x0i + wk1i * x0r; + x0r = a[10] - a[27]; + x0i = a[11] + a[26]; + x2r = wk3i * x0r - wk3r * x0i; + x2i = wk3i * x0i + wk3r * x0r; + y1r = x1r + x2r; + y1i = x1i + x2i; + y5r = x1r - x2r; + y5i = x1i - x2i; + x0r = a[2] + a[19]; + x0i = a[3] - a[18]; + x1r = wk3r * x0r - wk3i * x0i; + x1i = wk3r * x0i + wk3i * x0r; + x0r = a[10] + a[27]; + x0i = a[11] - a[26]; + x2r = wk1r * x0r + wk1i * x0i; + x2i = wk1r * x0i - wk1i * x0r; + y9r = x1r - x2r; + y9i = x1i - x2i; + y13r = x1r + x2r; + y13i = x1i + x2i; + x0r = a[4] - a[21]; + x0i = a[5] + a[20]; + x1r = wk2r * x0r - wk2i * x0i; + x1i = wk2r * x0i + wk2i * x0r; + x0r = a[12] - a[29]; + x0i = a[13] + a[28]; + x2r = wk2i * x0r - wk2r * x0i; + x2i = wk2i * x0i + wk2r * x0r; + y2r = x1r + x2r; + y2i = x1i + x2i; + y6r = x1r - x2r; + y6i = x1i - x2i; + x0r = a[4] + a[21]; + x0i = a[5] - a[20]; + x1r = wk2i * x0r - wk2r * x0i; + x1i = wk2i * x0i + wk2r * x0r; + x0r = a[12] + a[29]; + x0i = a[13] - a[28]; + x2r = wk2r * x0r - wk2i * x0i; + x2i = wk2r * x0i + wk2i * x0r; + y10r = x1r - x2r; + y10i = x1i - x2i; + y14r = x1r + x2r; + y14i = x1i + x2i; + x0r = a[6] - a[23]; + x0i = a[7] + a[22]; + x1r = wk3r * x0r - wk3i * x0i; + x1i = wk3r * x0i + wk3i * x0r; + x0r = a[14] - a[31]; + x0i = a[15] + a[30]; + x2r = wk1i * x0r - wk1r * x0i; + x2i = wk1i * x0i + wk1r * x0r; + y3r = x1r + x2r; + y3i = x1i + x2i; + y7r = x1r - x2r; + y7i = x1i - x2i; + x0r = a[6] + a[23]; + x0i = a[7] - a[22]; + x1r = wk1i * x0r + wk1r * x0i; + x1i = wk1i * x0i - wk1r * x0r; + x0r = a[14] + a[31]; + x0i = a[15] - a[30]; + x2r = wk3i * x0r - wk3r * x0i; + x2i = wk3i * x0i + wk3r * x0r; + y11r = x1r + x2r; + y11i = x1i + x2i; + y15r = x1r - x2r; + y15i = x1i - x2i; + x1r = y0r + y2r; + x1i = y0i + y2i; + x2r = y1r + y3r; + x2i = y1i + y3i; + a[0] = x1r + x2r; + a[1] = x1i + x2i; + a[2] = x1r - x2r; + a[3] = x1i - x2i; + x1r = y0r - y2r; + x1i = y0i - y2i; + x2r = y1r - y3r; + x2i = y1i - y3i; + a[4] = x1r - x2i; + a[5] = x1i + x2r; + a[6] = x1r + x2i; + a[7] = x1i - x2r; + x1r = y4r - y6i; + x1i = y4i + y6r; + x0r = y5r - y7i; + x0i = y5i + y7r; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + a[8] = x1r + x2r; + a[9] = x1i + x2i; + a[10] = x1r - x2r; + a[11] = x1i - x2i; + x1r = y4r + y6i; + x1i = y4i - y6r; + x0r = y5r + y7i; + x0i = y5i - y7r; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + a[12] = x1r - x2i; + a[13] = x1i + x2r; + a[14] = x1r + x2i; + a[15] = x1i - x2r; + x1r = y8r + y10r; + x1i = y8i + y10i; + x2r = y9r - y11r; + x2i = y9i - y11i; + a[16] = x1r + x2r; + a[17] = x1i + x2i; + a[18] = x1r - x2r; + a[19] = x1i - x2i; + x1r = y8r - y10r; + x1i = y8i - y10i; + x2r = y9r + y11r; + x2i = y9i + y11i; + a[20] = x1r - x2i; + a[21] = x1i + x2r; + a[22] = x1r + x2i; + a[23] = x1i - x2r; + x1r = y12r - y14i; + x1i = y12i + y14r; + x0r = y13r + y15i; + x0i = y13i - y15r; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + a[24] = x1r + x2r; + a[25] = x1i + x2i; + a[26] = x1r - x2r; + a[27] = x1i - x2i; + x1r = y12r + y14i; + x1i = y12i - y14r; + x0r = y13r - y15i; + x0i = y13i + y15r; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + a[28] = x1r - x2i; + a[29] = x1i + x2r; + a[30] = x1r + x2i; + a[31] = x1i - x2r; +} + + +void cftf081(double *a, double *w) +{ + double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, + y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, + y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; + + wn4r = w[1]; + x0r = a[0] + a[8]; + x0i = a[1] + a[9]; + x1r = a[0] - a[8]; + x1i = a[1] - a[9]; + x2r = a[4] + a[12]; + x2i = a[5] + a[13]; + x3r = a[4] - a[12]; + x3i = a[5] - a[13]; + y0r = x0r + x2r; + y0i = x0i + x2i; + y2r = x0r - x2r; + y2i = x0i - x2i; + y1r = x1r - x3i; + y1i = x1i + x3r; + y3r = x1r + x3i; + y3i = x1i - x3r; + x0r = a[2] + a[10]; + x0i = a[3] + a[11]; + x1r = a[2] - a[10]; + x1i = a[3] - a[11]; + x2r = a[6] + a[14]; + x2i = a[7] + a[15]; + x3r = a[6] - a[14]; + x3i = a[7] - a[15]; + y4r = x0r + x2r; + y4i = x0i + x2i; + y6r = x0r - x2r; + y6i = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + x2r = x1r + x3i; + x2i = x1i - x3r; + y5r = wn4r * (x0r - x0i); + y5i = wn4r * (x0r + x0i); + y7r = wn4r * (x2r - x2i); + y7i = wn4r * (x2r + x2i); + a[8] = y1r + y5r; + a[9] = y1i + y5i; + a[10] = y1r - y5r; + a[11] = y1i - y5i; + a[12] = y3r - y7i; + a[13] = y3i + y7r; + a[14] = y3r + y7i; + a[15] = y3i - y7r; + a[0] = y0r + y4r; + a[1] = y0i + y4i; + a[2] = y0r - y4r; + a[3] = y0i - y4i; + a[4] = y2r - y6i; + a[5] = y2i + y6r; + a[6] = y2r + y6i; + a[7] = y2i - y6r; +} + + +void cftf082(double *a, double *w) +{ + double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, + y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, + y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; + + wn4r = w[1]; + wk1r = w[2]; + wk1i = w[3]; + y0r = a[0] - a[9]; + y0i = a[1] + a[8]; + y1r = a[0] + a[9]; + y1i = a[1] - a[8]; + x0r = a[4] - a[13]; + x0i = a[5] + a[12]; + y2r = wn4r * (x0r - x0i); + y2i = wn4r * (x0i + x0r); + x0r = a[4] + a[13]; + x0i = a[5] - a[12]; + y3r = wn4r * (x0r - x0i); + y3i = wn4r * (x0i + x0r); + x0r = a[2] - a[11]; + x0i = a[3] + a[10]; + y4r = wk1r * x0r - wk1i * x0i; + y4i = wk1r * x0i + wk1i * x0r; + x0r = a[2] + a[11]; + x0i = a[3] - a[10]; + y5r = wk1i * x0r - wk1r * x0i; + y5i = wk1i * x0i + wk1r * x0r; + x0r = a[6] - a[15]; + x0i = a[7] + a[14]; + y6r = wk1i * x0r - wk1r * x0i; + y6i = wk1i * x0i + wk1r * x0r; + x0r = a[6] + a[15]; + x0i = a[7] - a[14]; + y7r = wk1r * x0r - wk1i * x0i; + y7i = wk1r * x0i + wk1i * x0r; + x0r = y0r + y2r; + x0i = y0i + y2i; + x1r = y4r + y6r; + x1i = y4i + y6i; + a[0] = x0r + x1r; + a[1] = x0i + x1i; + a[2] = x0r - x1r; + a[3] = x0i - x1i; + x0r = y0r - y2r; + x0i = y0i - y2i; + x1r = y4r - y6r; + x1i = y4i - y6i; + a[4] = x0r - x1i; + a[5] = x0i + x1r; + a[6] = x0r + x1i; + a[7] = x0i - x1r; + x0r = y1r - y3i; + x0i = y1i + y3r; + x1r = y5r - y7r; + x1i = y5i - y7i; + a[8] = x0r + x1r; + a[9] = x0i + x1i; + a[10] = x0r - x1r; + a[11] = x0i - x1i; + x0r = y1r + y3i; + x0i = y1i - y3r; + x1r = y5r + y7r; + x1i = y5i + y7i; + a[12] = x0r - x1i; + a[13] = x0i + x1r; + a[14] = x0r + x1i; + a[15] = x0i - x1r; +} + + +void cftf040(double *a) +{ + double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + x0r = a[0] + a[4]; + x0i = a[1] + a[5]; + x1r = a[0] - a[4]; + x1i = a[1] - a[5]; + x2r = a[2] + a[6]; + x2i = a[3] + a[7]; + x3r = a[2] - a[6]; + x3i = a[3] - a[7]; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[2] = x1r - x3i; + a[3] = x1i + x3r; + a[4] = x0r - x2r; + a[5] = x0i - x2i; + a[6] = x1r + x3i; + a[7] = x1i - x3r; +} + + +void cftb040(double *a) +{ + double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + x0r = a[0] + a[4]; + x0i = a[1] + a[5]; + x1r = a[0] - a[4]; + x1i = a[1] - a[5]; + x2r = a[2] + a[6]; + x2i = a[3] + a[7]; + x3r = a[2] - a[6]; + x3i = a[3] - a[7]; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[2] = x1r + x3i; + a[3] = x1i - x3r; + a[4] = x0r - x2r; + a[5] = x0i - x2i; + a[6] = x1r - x3i; + a[7] = x1i + x3r; +} + + +void cftx020(double *a) +{ + double x0r, x0i; + + x0r = a[0] - a[2]; + x0i = a[1] - a[3]; + a[0] += a[2]; + a[1] += a[3]; + a[2] = x0r; + a[3] = x0i; +} + + +void rftfsub(int n, double *a, int nc, double *c) +{ + int j, k, kk, ks, m; + double wkr, wki, xr, xi, yr, yi; + + m = n >> 1; + ks = 2 * nc / m; + kk = 0; + for (j = 2; j < m; j += 2) { + k = n - j; + kk += ks; + wkr = 0.5 - c[nc - kk]; + wki = c[kk]; + xr = a[j] - a[k]; + xi = a[j + 1] + a[k + 1]; + yr = wkr * xr - wki * xi; + yi = wkr * xi + wki * xr; + a[j] -= yr; + a[j + 1] -= yi; + a[k] += yr; + a[k + 1] -= yi; + } +} + + +void rftbsub(int n, double *a, int nc, double *c) +{ + int j, k, kk, ks, m; + double wkr, wki, xr, xi, yr, yi; + + m = n >> 1; + ks = 2 * nc / m; + kk = 0; + for (j = 2; j < m; j += 2) { + k = n - j; + kk += ks; + wkr = 0.5 - c[nc - kk]; + wki = c[kk]; + xr = a[j] - a[k]; + xi = a[j + 1] + a[k + 1]; + yr = wkr * xr + wki * xi; + yi = wkr * xi - wki * xr; + a[j] -= yr; + a[j + 1] -= yi; + a[k] += yr; + a[k + 1] -= yi; + } +} + + +void dctsub(int n, double *a, int nc, double *c) +{ + int j, k, kk, ks, m; + double wkr, wki, xr; + + m = n >> 1; + ks = nc / n; + kk = 0; + for (j = 1; j < m; j++) { + k = n - j; + kk += ks; + wkr = c[kk] - c[nc - kk]; + wki = c[kk] + c[nc - kk]; + xr = wki * a[j] - wkr * a[k]; + a[j] = wkr * a[j] + wki * a[k]; + a[k] = xr; + } + a[m] *= c[0]; +} + + +void dstsub(int n, double *a, int nc, double *c) +{ + int j, k, kk, ks, m; + double wkr, wki, xr; + + m = n >> 1; + ks = nc / n; + kk = 0; + for (j = 1; j < m; j++) { + k = n - j; + kk += ks; + wkr = c[kk] - c[nc - kk]; + wki = c[kk] + c[nc - kk]; + xr = wki * a[k] - wkr * a[j]; + a[k] = wkr * a[k] + wki * a[j]; + a[j] = xr; + } + a[m] *= c[0]; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/fftsg.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/fftsg.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/fftsg.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/fftsg.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,35 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: fftsg.h,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $ + * + * Wrapper for rdft() and friends + * + * $Log$ + */ + +#ifndef _FFTSG_H +#define _FFTSG_H + +extern void rdft(int n, int isgn, double *a, int *ip, double *w); + +#endif /** !_FFTSG_H */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/FindPkgConfig.cmake kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/FindPkgConfig.cmake --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/FindPkgConfig.cmake 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/FindPkgConfig.cmake 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,360 @@ +# - a pkg-config module for CMake +# +# Usage: +# pkg_check_modules( [REQUIRED] []*) +# checks for all the given modules +# +# pkg_search_module( [REQUIRED] []*) +# checks for given modules and uses the first working one +# +# When the 'REQUIRED' argument was set, macros will fail with an error +# when module(s) could not be found +# +# It sets the following variables: +# PKG_CONFIG_FOUND ... true iff pkg-config works on the system +# PKG_CONFIG_EXECUTABLE ... pathname of the pkg-config program +# _FOUND ... set to 1 iff module(s) exist +# +# For the following variables two sets of values exist; first one is the +# common one and has the given PREFIX. The second set contains flags +# which are given out when pkgconfig was called with the '--static' +# option. +# _LIBRARIES ... only the libraries (w/o the '-l') +# _LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') +# _LDFLAGS ... all required linker flags +# _LDFLAGS_OTHERS ... all other linker flags +# _INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') +# _CFLAGS ... all required cflags +# _CFLAGS_OTHERS ... the other compiler flags +# +# = for common case +# = _STATIC for static linking +# +# There are some special variables whose prefix depends on the count +# of given modules. When there is only one module, stays +# unchanged. When there are multiple modules, the prefix will be +# changed to _: +# _VERSION ... version of the module +# _PREFIX ... prefix-directory of the module +# _INCLUDEDIR ... include-dir of the module +# _LIBDIR ... lib-dir of the module +# +# = when |MODULES| == 1, else +# = _ +# +# A parameter can have the following formats: +# {MODNAME} ... matches any version +# {MODNAME}>={VERSION} ... at least version is required +# {MODNAME}={VERSION} ... exactly version is required +# {MODNAME}<={VERSION} ... modules must not be newer than +# +# Examples +# pkg_check_modules (GLIB2 glib-2.0) +# +# pkg_check_modules (GLIB2 glib-2.0>=2.10) +# requires at least version 2.10 of glib2 and defines e.g. +# GLIB2_VERSION=2.10.3 +# +# pkg_check_modules (FOO glib-2.0>=2.10 gtk+-2.0) +# requires both glib2 and gtk2, and defines e.g. +# FOO_glib-2.0_VERSION=2.10.3 +# FOO_gtk+-2.0_VERSION=2.8.20 +# +# pkg_check_modules (XRENDER REQUIRED xrender) +# defines e.g.: +# XRENDER_LIBRARIES=Xrender;X11 +# XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp +# +# pkg_search_module (BAR libxml-2.0 libxml2 libxml>=2) + + +# Copyright (C) 2006 Enrico Scholz +# +# Redistribution and use, with or without modification, are permitted +# provided that the following conditions are met: +# +# 1. Redistributions must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# 2. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +### Common stuff #### +set(PKG_CONFIG_VERSION 1) +set(PKG_CONFIG_FOUND 0) + +find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable") +mark_as_advanced(PKG_CONFIG_EXECUTABLE) + +if(PKG_CONFIG_EXECUTABLE) + set(PKG_CONFIG_FOUND 1) +endif(PKG_CONFIG_EXECUTABLE) + + +# Unsets the given variables +macro(_pkgconfig_unset var) + set(${var} "" CACHE INTERNAL "") +endmacro(_pkgconfig_unset) + +macro(_pkgconfig_set var value) + set(${var} ${value} CACHE INTERNAL "") +endmacro(_pkgconfig_set) + +# Invokes pkgconfig, cleans up the result and sets variables +macro(_pkgconfig_invoke _pkglist _prefix _varname _regexp) + set(_pkgconfig_invoke_result) + + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} ${ARGN} ${_pkglist} + OUTPUT_VARIABLE _pkgconfig_invoke_result + RESULT_VARIABLE _pkgconfig_failed) + + if (_pkgconfig_failed) + set(_pkgconfig_${_varname} "") + _pkgconfig_unset(${_prefix}_${_varname}) + else(_pkgconfig_failed) + string(REGEX REPLACE "[\r\n]" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + string(REGEX REPLACE " +$" "" _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + + if (NOT ${_regexp} STREQUAL "") + string(REGEX REPLACE "${_regexp}" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + endif(NOT ${_regexp} STREQUAL "") + + separate_arguments(_pkgconfig_invoke_result) + + #message(STATUS " ${_varname} ... ${_pkgconfig_invoke_result}") + set(_pkgconfig_${_varname} ${_pkgconfig_invoke_result}) + _pkgconfig_set(${_prefix}_${_varname} "${_pkgconfig_invoke_result}") + endif(_pkgconfig_failed) +endmacro(_pkgconfig_invoke) + +# Invokes pkgconfig two times; once without '--static' and once with +# '--static' +macro(_pkgconfig_invoke_dyn _pkglist _prefix _varname cleanup_regexp) + _pkgconfig_invoke("${_pkglist}" ${_prefix} ${_varname} "${cleanup_regexp}" ${ARGN}) + _pkgconfig_invoke("${_pkglist}" ${_prefix} STATIC_${_varname} "${cleanup_regexp}" --static ${ARGN}) +endmacro(_pkgconfig_invoke_dyn) + +# Splits given arguments into options and a package list +macro(_pkgconfig_parse_options _result _is_req) + set(${_is_req} 0) + + foreach(_pkg ${ARGN}) + if (_pkg STREQUAL "REQUIRED") + set(${_is_req} 1) + endif (_pkg STREQUAL "REQUIRED") + endforeach(_pkg ${ARGN}) + + set(${_result} ${ARGN}) + list(REMOVE_ITEM ${_result} "REQUIRED") +endmacro(_pkgconfig_parse_options) + +### +macro(_pkg_check_modules_internal _is_required _is_silent _prefix) + _pkgconfig_unset(${_prefix}_FOUND) + _pkgconfig_unset(${_prefix}_VERSION) + _pkgconfig_unset(${_prefix}_PREFIX) + _pkgconfig_unset(${_prefix}_INCLUDEDIR) + _pkgconfig_unset(${_prefix}_LIBDIR) + _pkgconfig_unset(${_prefix}_LIBS) + _pkgconfig_unset(${_prefix}_LIBS_L) + _pkgconfig_unset(${_prefix}_LIBS_PATHS) + _pkgconfig_unset(${_prefix}_LIBS_OTHER) + _pkgconfig_unset(${_prefix}_CFLAGS) + _pkgconfig_unset(${_prefix}_CFLAGS_I) + _pkgconfig_unset(${_prefix}_CFLAGS_OTHER) + _pkgconfig_unset(${_prefix}_STATIC_LIBDIR) + _pkgconfig_unset(${_prefix}_STATIC_LIBS) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_L) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_PATHS) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_OTHER) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_I) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_OTHER) + + # create a better addressable variable of the modules and calculate its size + set(_pkg_check_modules_list ${ARGN}) + list(LENGTH _pkg_check_modules_list _pkg_check_modules_cnt) + + if(PKG_CONFIG_EXECUTABLE) + # give out status message telling checked module + if (NOT ${_is_silent}) + if (_pkg_check_modules_cnt EQUAL 1) + message(STATUS "checking for module '${_pkg_check_modules_list}'") + else(_pkg_check_modules_cnt EQUAL 1) + message(STATUS "checking for modules '${_pkg_check_modules_list}'") + endif(_pkg_check_modules_cnt EQUAL 1) + endif(NOT ${_is_silent}) + + set(_pkg_check_modules_packages) + set(_pkg_check_modules_failed) + + # iterate through module list and check whether they exist and match the required version + foreach (_pkg_check_modules_pkg ${_pkg_check_modules_list}) + set(_pkg_check_modules_exist_query) + + # check whether version is given + if (_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\1" _pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\2" _pkg_check_modules_pkg_op "${_pkg_check_modules_pkg}") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\3" _pkg_check_modules_pkg_ver "${_pkg_check_modules_pkg}") + else(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + set(_pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") + set(_pkg_check_modules_pkg_op) + set(_pkg_check_modules_pkg_ver) + endif(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + + # handle the operands + if (_pkg_check_modules_pkg_op STREQUAL ">=") + list(APPEND _pkg_check_modules_exist_query --atleast-version) + endif(_pkg_check_modules_pkg_op STREQUAL ">=") + + if (_pkg_check_modules_pkg_op STREQUAL "=") + list(APPEND _pkg_check_modules_exist_query --exact-version) + endif(_pkg_check_modules_pkg_op STREQUAL "=") + + if (_pkg_check_modules_pkg_op STREQUAL "<=") + list(APPEND _pkg_check_modules_exist_query --max-version) + endif(_pkg_check_modules_pkg_op STREQUAL "<=") + + # create the final query which is of the format: + # * --atleast-version + # * --exact-version + # * --max-version + # * --exists + if (_pkg_check_modules_pkg_op) + list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_ver}") + else(_pkg_check_modules_pkg_op) + list(APPEND _pkg_check_modules_exist_query --exists) + endif(_pkg_check_modules_pkg_op) + + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_VERSION) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_PREFIX) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_INCLUDEDIR) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_LIBDIR) + + list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_name}") + list(APPEND _pkg_check_modules_packages "${_pkg_check_modules_pkg_name}") + + # execute the query + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} ${_pkg_check_modules_exist_query} + RESULT_VARIABLE _pkgconfig_retval) + + # evaluate result and tell failures + if (_pkgconfig_retval) + if(NOT ${_is_silent}) + message(STATUS " package '${_pkg_check_modules_pkg}' not found") + endif(NOT ${_is_silent}) + + set(_pkg_check_modules_failed 1) + endif(_pkgconfig_retval) + endforeach(_pkg_check_modules_pkg) + + if(_pkg_check_modules_failed) + # fail when requested + if (${_is_required}) + message(SEND_ERROR "A required package was not found") + endif (${_is_required}) + else(_pkg_check_modules_failed) + # when we are here, we checked whether requested modules + # exist. Now, go through them and set variables + + _pkgconfig_set(${_prefix}_FOUND 1) + list(LENGTH _pkg_check_modules_packages pkg_count) + + # iterate through all modules again and set individual variables + foreach (_pkg_check_modules_pkg ${_pkg_check_modules_packages}) + # handle case when there is only one package required + if (pkg_count EQUAL 1) + set(_pkg_check_prefix "${_prefix}") + else(pkg_count EQUAL 1) + set(_pkg_check_prefix "${_prefix}_${_pkg_check_modules_pkg}") + endif(pkg_count EQUAL 1) + + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" VERSION "" --modversion ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" PREFIX "" --variable=prefix ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" INCLUDEDIR "" --variable=includedir ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" LIBDIR "" --variable=libdir ) + + message(STATUS " found ${_pkg_check_modules_pkg}, version ${_pkgconfig_VERSION}") + endforeach(_pkg_check_modules_pkg) + + # set variables which are combined for multiple modules + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARIES "(^| )-l" --libs-only-l ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARY_DIRS "(^| )-L" --libs-only-L ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS "" --libs ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS_OTHER "" --libs-only-other ) + + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" INCLUDE_DIRS "(^| )-I" --cflags-only-I ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS "" --cflags ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS_OTHER "" --cflags-only-other ) + endif(_pkg_check_modules_failed) + else(PKG_CONFIG_EXECUTABLE) + if (${_is_required}) + message(SEND_ERROR "pkg-config tool not found") + endif (${_is_required}) + endif(PKG_CONFIG_EXECUTABLE) +endmacro(_pkg_check_modules_internal) + +### +### User visible macros start here +### + +### +macro(pkg_check_modules _prefix _module0) + # check cached value + if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) + _pkgconfig_parse_options (_pkg_modules _pkg_is_required "${_module0}" ${ARGN}) + _pkg_check_modules_internal("${_pkg_is_required}" 0 "${_prefix}" ${_pkg_modules}) + + _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) + endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) +endmacro(pkg_check_modules) + +### +macro(pkg_search_module _prefix _module0) + # check cached value + if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) + set(_pkg_modules_found 0) + _pkgconfig_parse_options(_pkg_modules_alt _pkg_is_required "${_module0}" ${ARGN}) + + message(STATUS "checking for one of the modules '${_pkg_modules_alt}'") + + # iterate through all modules and stop at the first working one. + foreach(_pkg_alt ${_pkg_modules_alt}) + if(NOT _pkg_modules_found) + _pkg_check_modules_internal(0 1 "${_prefix}" "${_pkg_alt}") + endif(NOT _pkg_modules_found) + + if (${_prefix}_FOUND) + set(_pkg_modules_found 1) + endif(${_prefix}_FOUND) + endforeach(_pkg_alt) + + if (NOT ${_prefix}_FOUND) + if(${_pkg_is_required}) + message(SEND_ERROR "None of the required '${_pkg_modules_alt}' found") + endif(${_pkg_is_required}) + endif(NOT ${_prefix}_FOUND) + + _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) + endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) +endmacro(pkg_search_module) + +### Local Variables: +### mode: cmake +### End: Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/fonts/VeraMono.ttf and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/fonts/VeraMono.ttf differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/fonts/Vera.ttf and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/fonts/Vera.ttf differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Func.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Func.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Func.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Func.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,37 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/* Function management */ + +#include +#include +#include + +#include "Common.hpp" +#include "fatal.h" + +#include "Func.hpp" +#include + +Func::Func (const std::string & _name, float (*_func_ptr)(float*), int _num_args): + name(_name), func_ptr(_func_ptr), num_args(_num_args) {} + +/* Frees a function type, real complicated... */ +Func::~Func() {} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Func.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Func.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Func.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Func.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,63 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Function + * + * $Log$ + */ + +#ifndef _FUNC_H +#define _FUNC_H + +#include "Common.hpp" +#include + +/* Function Type */ +class Func { +public: + + /// Create a new function wrapper object + /// \param name a name to uniquely identify the function. + /// \param func_ptr a pointer to a function of floating point arguments + /// \param num_args the number of floating point arguments this function requires + Func(const std::string & name, float (*func_ptr)(float*), int num_args ); + + /* Public Prototypes */ + DLLEXPORT ~Func(); + + inline const std::string & getName() const { + return name; + } + + inline int getNumArgs() const { + return num_args; + } + + float (*func_ptr)(float*); +private: + std::string name; + int num_args; + +}; + +#endif /** !_FUNC_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/glError.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/glError.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/glError.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/glError.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,31 @@ +// +// File: glError.h +// Author: fatray +// +// Created on 02 December 2007, 16:08 +// + +#ifndef _GLERROR_H +#define _GLERROR_H + +// no need to include GL in here, +// if someone wants GL errors they probably already included it. + + +/* + * if we are debugging, print all glErrors to stderr. + * Remeber that glErrors are buffered, this just prints any in the buffer. + */ +#ifdef NDEBUG +#define glError() +#else +#define glError() { \ + GLenum err; \ + while ((err = glGetError()) != GL_NO_ERROR) \ + fprintf(stderr, "glError: %s at %s:%u\n", \ + (char *)gluErrorString(err), __FILE__, __LINE__); \ +} +#endif /* glError */ + +#endif /* _GLERROR_H */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/glew.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/glew.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/glew.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/glew.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,10835 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "glew.h" +#if defined(_WIN32) +# include +#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) +# include "glxew.h" +#endif + +/* + * Define glewGetContext and related helper macros. + */ +#ifdef GLEW_MX +# define glewGetContext() ctx +# ifdef _WIN32 +# define GLEW_CONTEXT_ARG_DEF_INIT GLEWContext* ctx +# define GLEW_CONTEXT_ARG_VAR_INIT ctx +# define wglewGetContext() ctx +# define WGLEW_CONTEXT_ARG_DEF_INIT WGLEWContext* ctx +# define WGLEW_CONTEXT_ARG_DEF_LIST WGLEWContext* ctx +# else /* _WIN32 */ +# define GLEW_CONTEXT_ARG_DEF_INIT void +# define GLEW_CONTEXT_ARG_VAR_INIT +# define glxewGetContext() ctx +# define GLXEW_CONTEXT_ARG_DEF_INIT void +# define GLXEW_CONTEXT_ARG_DEF_LIST GLXEWContext* ctx +# endif /* _WIN32 */ +# define GLEW_CONTEXT_ARG_DEF_LIST GLEWContext* ctx +#else /* GLEW_MX */ +# define GLEW_CONTEXT_ARG_DEF_INIT void +# define GLEW_CONTEXT_ARG_VAR_INIT +# define GLEW_CONTEXT_ARG_DEF_LIST void +# define WGLEW_CONTEXT_ARG_DEF_INIT void +# define WGLEW_CONTEXT_ARG_DEF_LIST void +# define GLXEW_CONTEXT_ARG_DEF_INIT void +# define GLXEW_CONTEXT_ARG_DEF_LIST void +#endif /* GLEW_MX */ + +#if defined(__APPLE__) +#include +#include +#include + +void* NSGLGetProcAddress (const GLubyte *name) +{ + static const struct mach_header* image = NULL; + NSSymbol symbol; + char* symbolName; + if (NULL == image) + { + image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); + } + /* prepend a '_' for the Unix C symbol mangling convention */ + symbolName = malloc(strlen((const char*)name) + 2); + strcpy(symbolName+1, (const char*)name); + symbolName[0] = '_'; + symbol = NULL; + /* if (NSIsSymbolNameDefined(symbolName)) + symbol = NSLookupAndBindSymbol(symbolName); */ + symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL; + free(symbolName); + return symbol ? NSAddressOfSymbol(symbol) : NULL; +} +#endif /* __APPLE__ */ + +#if defined(__sgi) || defined (__sun) +#include +#include +#include + +void* dlGetProcAddress (const GLubyte* name) +{ + static void* h = NULL; + static void* gpa; + + if (h == NULL) + { + if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL; + gpa = dlsym(h, "glXGetProcAddress"); + } + + if (gpa != NULL) + return ((void*(*)(const GLubyte*))gpa)(name); + else + return dlsym(h, (const char*)name); +} +#endif /* __sgi || __sun */ + +/* + * Define glewGetProcAddress. + */ +#if defined(_WIN32) +# define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) +#else +# if defined(__APPLE__) +# define glewGetProcAddress(name) NSGLGetProcAddress(name) +# else +# if defined(__sgi) || defined(__sun) +# define glewGetProcAddress(name) dlGetProcAddress(name) +# else /* __linux */ +# define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) +# endif +# endif +#endif + +/* + * Define GLboolean const cast. + */ +#define CONST_CAST(x) (*(GLboolean*)&x) + +/* + * GLEW, just like OpenGL or GLU, does not rely on the standard C library. + * These functions implement the functionality required in this file. + */ +static GLuint _glewStrLen (const GLubyte* s) +{ + GLuint i=0; + if (s == NULL) return 0; + while (s[i] != '\0') i++; + return i; +} + +static GLuint _glewStrCLen (const GLubyte* s, GLubyte c) +{ + GLuint i=0; + if (s == NULL) return 0; + while (s[i] != '\0' && s[i] != c) i++; + return s[i] == c ? i : 0; +} + +static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n) +{ + GLuint i=0; + if(a == NULL || b == NULL) + return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE; + while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++; + return i == n ? GL_TRUE : GL_FALSE; +} + +static GLboolean _glewStrSame1 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) +{ + while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t')) + { + (*a)++; + (*na)--; + } + if(*na >= nb) + { + GLuint i=0; + while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; + if(i == nb) + { + *a = *a + nb; + *na = *na - nb; + return GL_TRUE; + } + } + return GL_FALSE; +} + +static GLboolean _glewStrSame2 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) +{ + if(*na >= nb) + { + GLuint i=0; + while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; + if(i == nb) + { + *a = *a + nb; + *na = *na - nb; + return GL_TRUE; + } + } + return GL_FALSE; +} + +static GLboolean _glewStrSame3 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) +{ + if(*na >= nb) + { + GLuint i=0; + while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; + if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t')) + { + *a = *a + nb; + *na = *na - nb; + return GL_TRUE; + } + } + return GL_FALSE; +} + +#if !defined(_WIN32) || !defined(GLEW_MX) + +PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL; +PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL; +PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL; +PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL; + +PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL; +PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL; +PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL; +PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL; +PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL; +PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL; +PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL; +PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL; +PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL; +PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL; +PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL; +PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL; +PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL; +PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL; +PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL; +PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL; +PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL; +PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL; +PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL; +PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL; +PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL; +PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL; +PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL; +PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL; +PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL; +PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL; +PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL; +PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL; +PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL; +PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL; +PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL; +PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL; +PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL; +PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL; +PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL; +PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL; +PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL; +PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL; +PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL; + +PFNGLBLENDCOLORPROC __glewBlendColor = NULL; +PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL; +PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL; +PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL; +PFNGLFOGCOORDDPROC __glewFogCoordd = NULL; +PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL; +PFNGLFOGCOORDFPROC __glewFogCoordf = NULL; +PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL; +PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL; +PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL; +PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL; +PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL; +PFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL; +PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL; +PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL; +PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL; +PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL; +PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL; +PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL; +PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL; +PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL; +PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL; +PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL; +PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL; +PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL; +PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL; +PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL; +PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL; +PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL; +PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL; +PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL; +PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL; +PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL; +PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL; +PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL; +PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL; +PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL; +PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL; +PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL; +PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL; +PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL; +PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL; +PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL; +PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL; +PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL; +PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL; +PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL; + +PFNGLBEGINQUERYPROC __glewBeginQuery = NULL; +PFNGLBINDBUFFERPROC __glewBindBuffer = NULL; +PFNGLBUFFERDATAPROC __glewBufferData = NULL; +PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL; +PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL; +PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL; +PFNGLENDQUERYPROC __glewEndQuery = NULL; +PFNGLGENBUFFERSPROC __glewGenBuffers = NULL; +PFNGLGENQUERIESPROC __glewGenQueries = NULL; +PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL; +PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL; +PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL; +PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL; +PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL; +PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL; +PFNGLISBUFFERPROC __glewIsBuffer = NULL; +PFNGLISQUERYPROC __glewIsQuery = NULL; +PFNGLMAPBUFFERPROC __glewMapBuffer = NULL; +PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL; + +PFNGLATTACHSHADERPROC __glewAttachShader = NULL; +PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL; +PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL; +PFNGLCOMPILESHADERPROC __glewCompileShader = NULL; +PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL; +PFNGLCREATESHADERPROC __glewCreateShader = NULL; +PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL; +PFNGLDELETESHADERPROC __glewDeleteShader = NULL; +PFNGLDETACHSHADERPROC __glewDetachShader = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL; +PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL; +PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL; +PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL; +PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL; +PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL; +PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL; +PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL; +PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL; +PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL; +PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL; +PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL; +PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL; +PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL; +PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL; +PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL; +PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL; +PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL; +PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL; +PFNGLISPROGRAMPROC __glewIsProgram = NULL; +PFNGLISSHADERPROC __glewIsShader = NULL; +PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL; +PFNGLSHADERSOURCEPROC __glewShaderSource = NULL; +PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL; +PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL; +PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL; +PFNGLUNIFORM1FPROC __glewUniform1f = NULL; +PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL; +PFNGLUNIFORM1IPROC __glewUniform1i = NULL; +PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL; +PFNGLUNIFORM2FPROC __glewUniform2f = NULL; +PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL; +PFNGLUNIFORM2IPROC __glewUniform2i = NULL; +PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL; +PFNGLUNIFORM3FPROC __glewUniform3f = NULL; +PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL; +PFNGLUNIFORM3IPROC __glewUniform3i = NULL; +PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL; +PFNGLUNIFORM4FPROC __glewUniform4f = NULL; +PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL; +PFNGLUNIFORM4IPROC __glewUniform4i = NULL; +PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL; +PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL; +PFNGLUSEPROGRAMPROC __glewUseProgram = NULL; +PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL; +PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL; +PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL; +PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL; +PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL; +PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL; +PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL; +PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL; +PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL; +PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL; +PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL; +PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL; +PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL; +PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL; +PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL; +PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL; +PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL; +PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL; +PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL; +PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL; +PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL; +PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL; +PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL; +PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL; +PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL; +PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL; +PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL; +PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL; +PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL; +PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL; +PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL; +PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL; +PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL; +PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL; +PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL; +PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL; +PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL; +PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL; + +PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL; +PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL; +PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL; +PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL; +PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL; +PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL; + +PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL; + +PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; +PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; +PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; +PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL; +PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL; + +PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL; +PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL; +PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL; +PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL; +PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL; +PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL; +PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL; +PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL; + +PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL; + +PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL; +PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL; + +PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL; +PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL; +PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL; +PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL; + +PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL; +PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL; +PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL; + +PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; + +PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL; + +PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL; +PFNGLCOLORTABLEPROC __glewColorTable = NULL; +PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL; +PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL; +PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL; +PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL; +PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL; +PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL; +PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL; +PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL; +PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL; +PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL; +PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL; +PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL; +PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL; +PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL; +PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL; +PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL; +PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL; +PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL; +PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL; +PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL; +PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL; +PFNGLGETMINMAXPROC __glewGetMinmax = NULL; +PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL; +PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL; +PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL; +PFNGLHISTOGRAMPROC __glewHistogram = NULL; +PFNGLMINMAXPROC __glewMinmax = NULL; +PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; +PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; +PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; + +PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL; +PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL; +PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; +PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; +PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; + +PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL; + +PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL; +PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL; +PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL; +PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL; +PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL; +PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL; +PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL; +PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL; +PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL; +PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL; +PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL; +PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL; +PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL; +PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL; +PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL; +PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL; +PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL; +PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL; +PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL; +PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL; +PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL; +PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL; +PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL; +PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL; +PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL; +PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL; +PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL; +PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL; +PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL; +PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL; +PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL; +PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL; +PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL; +PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL; + +PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL; +PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL; +PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL; +PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL; +PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL; +PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL; +PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL; +PFNGLISQUERYARBPROC __glewIsQueryARB = NULL; + +PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL; +PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL; + +PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL; +PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL; +PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL; +PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL; +PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL; +PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL; +PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL; +PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL; +PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL; +PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL; +PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL; +PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL; +PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL; +PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL; +PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL; +PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL; +PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL; +PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL; +PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL; +PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL; +PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL; +PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL; +PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL; +PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL; +PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL; +PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL; +PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL; +PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL; +PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL; +PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL; +PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL; +PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL; +PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL; +PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL; +PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL; +PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL; +PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL; +PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL; +PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL; + +PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL; + +PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL; +PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL; +PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL; +PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL; + +PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL; +PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL; +PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL; +PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL; +PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL; +PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL; +PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL; +PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL; +PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL; +PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL; + +PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL; +PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL; +PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL; +PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL; +PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL; +PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL; +PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL; +PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL; +PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL; +PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL; +PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL; + +PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL; +PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL; +PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL; +PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL; +PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL; +PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL; +PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL; +PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL; +PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL; +PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL; +PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL; +PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL; +PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL; +PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL; +PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL; +PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL; +PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL; +PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL; +PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL; +PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL; +PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL; +PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL; +PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL; +PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL; +PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL; +PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL; +PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL; +PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL; +PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL; +PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL; +PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL; +PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL; +PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL; +PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL; +PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL; +PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL; +PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL; +PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL; +PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL; +PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL; +PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL; +PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL; +PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL; +PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL; +PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL; +PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL; +PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL; +PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL; +PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL; +PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL; +PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL; +PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL; +PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL; +PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL; +PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL; +PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL; +PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL; + +PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL; +PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL; +PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL; + +PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL; +PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL; +PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL; +PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL; +PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL; +PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL; +PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL; +PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL; +PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL; +PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL; +PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL; +PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL; +PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL; +PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL; +PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL; +PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL; + +PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL; + +PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL; +PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL; +PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL; + +PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL; +PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL; +PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL; +PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL; + +PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL; +PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL; +PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL; +PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL; +PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL; +PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL; +PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL; +PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL; +PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL; +PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL; +PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL; +PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL; +PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL; +PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL; + +PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL; +PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL; + +PFNGLPNTRIANGLESFATIPROC __glPNTrianglewesfATI = NULL; +PFNGLPNTRIANGLESIATIPROC __glPNTrianglewesiATI = NULL; + +PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL; +PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL; + +PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL; +PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL; +PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL; +PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL; +PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL; +PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL; +PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL; +PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL; +PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL; +PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL; +PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL; +PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL; + +PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL; +PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL; +PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL; + +PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL; +PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL; +PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL; +PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL; +PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL; +PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL; +PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL; +PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL; +PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL; +PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL; +PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL; +PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL; +PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL; +PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL; +PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL; +PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL; +PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL; +PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL; +PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL; +PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL; +PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL; +PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL; +PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL; +PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL; +PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL; +PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL; +PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL; +PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL; +PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL; +PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL; +PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL; +PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL; +PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL; +PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL; +PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL; +PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL; +PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL; + +PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL; +PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL; +PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL; + +PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL; + +PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL; + +PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL; + +PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL; + +PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL; +PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL; + +PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL; +PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL; + +PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL; +PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL; +PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL; +PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL; +PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL; +PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL; +PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL; +PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL; +PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL; +PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL; +PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL; +PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL; +PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL; + +PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL; +PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL; + +PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL; +PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL; + +PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL; +PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL; + +PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL; + +PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL; +PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL; +PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL; +PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL; +PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL; +PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL; + +PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL; +PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL; + +PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL; + +PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL; +PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL; +PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL; +PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL; +PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL; + +PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL; +PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL; +PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL; +PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL; +PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL; +PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL; +PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL; +PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL; +PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL; +PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL; +PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL; +PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL; +PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL; +PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL; +PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL; +PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL; +PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL; +PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL; + +PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL; + +PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL; +PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL; +PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL; +PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL; +PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL; +PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL; +PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL; +PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL; +PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL; +PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL; +PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL; + +PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL; +PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL; +PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL; +PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL; + +PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL; +PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL; + +PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL; +PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL; +PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL; +PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL; +PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL; +PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL; +PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL; +PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL; +PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL; +PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL; +PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL; +PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL; +PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL; +PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL; +PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL; +PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL; +PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL; +PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL; +PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL; +PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL; +PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL; +PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL; +PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL; +PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL; +PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL; +PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL; +PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL; +PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL; +PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL; +PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL; +PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL; +PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL; +PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL; +PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL; + +PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL; +PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL; +PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL; +PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL; +PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL; +PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL; +PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL; +PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL; +PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL; +PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL; + +PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL; + +PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL; + +PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL; +PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL; +PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL; + +PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL; +PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL; + +PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL; +PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL; + +PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL; +PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL; +PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL; +PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL; + +PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL; +PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL; + +PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL; +PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL; + +PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL; + +PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL; +PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL; + +PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL; +PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL; +PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL; +PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL; +PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL; +PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL; +PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL; +PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL; +PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL; +PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL; +PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL; +PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL; +PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL; +PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL; +PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL; +PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL; +PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL; + +PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL; + +PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL; +PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL; +PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL; + +PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL; + +PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL; + +PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL; +PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL; +PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL; +PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL; +PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL; +PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL; + +PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL; +PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL; +PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL; +PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL; +PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL; +PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL; + +PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL; + +PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL; +PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL; + +PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL; +PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL; +PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL; +PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL; +PFNGLGETPOINTERVEXTPROC __glewGetPointervEXT = NULL; +PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL; +PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL; +PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL; +PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL; + +PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL; +PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL; +PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL; +PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL; +PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL; +PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL; +PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL; +PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL; +PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL; +PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL; +PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL; +PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL; +PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL; +PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL; +PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL; +PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL; +PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL; +PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL; +PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL; +PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL; +PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL; +PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL; +PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL; +PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL; +PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL; +PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL; +PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL; +PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL; +PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL; +PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL; +PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL; +PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL; +PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL; +PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL; +PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL; +PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL; +PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL; +PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL; +PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL; +PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL; +PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL; +PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL; + +PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL; +PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL; +PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL; + +PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL; + +PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL; + +PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL; +PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL; + +PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL; +PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL; + +PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL; +PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL; +PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL; +PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL; +PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL; +PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; +PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; +PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; + +PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; +PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; +PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; +PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL; + +PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL; +PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL; + +PFNGLBUFFERREGIONENABLEDEXTPROC __glewBufferRegionEnabledEXT = NULL; +PFNGLDELETEBUFFERREGIONEXTPROC __glewDeleteBufferRegionEXT = NULL; +PFNGLDRAWBUFFERREGIONEXTPROC __glewDrawBufferRegionEXT = NULL; +PFNGLNEWBUFFERREGIONEXTPROC __glewNewBufferRegionEXT = NULL; +PFNGLREADBUFFERREGIONEXTPROC __glewReadBufferRegionEXT = NULL; + +PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL; + +PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL; +PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL; +PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL; +PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL; +PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL; +PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL; +PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL; +PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL; +PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL; +PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL; +PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL; +PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL; +PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL; +PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL; +PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL; +PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL; +PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL; +PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL; +PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL; +PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL; +PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL; +PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; +PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; +PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; + +PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; +PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; +PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; + +PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; +PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; +PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; +PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL; +PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL; +PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL; +PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL; +PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL; +PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL; + +PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL; +PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL; +PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL; +PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL; +PFNGLISFENCENVPROC __glewIsFenceNV = NULL; +PFNGLSETFENCENVPROC __glewSetFenceNV = NULL; +PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL; + +PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL; +PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL; + +PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL; + +PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL; +PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL; +PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL; +PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL; +PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL; +PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL; + +PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL; +PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL; +PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL; +PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL; +PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL; +PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL; +PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL; +PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL; +PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL; +PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL; +PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL; +PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL; +PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL; +PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL; +PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL; +PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL; +PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL; +PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL; +PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL; +PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL; +PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL; +PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL; +PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL; +PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL; +PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL; +PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL; +PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL; +PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL; +PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL; +PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL; +PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL; +PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL; +PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL; +PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL; +PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL; +PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL; +PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL; +PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL; +PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL; +PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL; +PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL; +PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL; +PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL; +PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL; +PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL; +PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL; + +PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL; +PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL; +PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL; +PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL; +PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL; +PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL; +PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL; + +PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL; +PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL; +PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL; + +PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL; +PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL; + +PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL; +PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL; + +PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; +PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; + +PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL; +PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL; +PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL; +PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL; +PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL; +PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL; +PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL; +PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL; +PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL; +PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL; +PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL; +PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL; +PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL; + +PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL; +PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL; + +PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL; +PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL; +PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL; +PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL; +PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL; +PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL; +PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL; +PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL; +PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL; + +PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL; +PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL; + +PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL; +PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL; +PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL; +PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL; +PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL; +PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL; +PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL; +PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL; +PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL; +PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL; +PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL; +PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL; +PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL; +PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL; +PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL; +PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL; +PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL; +PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL; +PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL; +PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL; +PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL; +PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL; +PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL; +PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL; +PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL; +PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL; +PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL; +PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL; +PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL; +PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL; +PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL; +PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL; +PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL; +PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL; +PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL; +PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL; +PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL; +PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL; +PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL; +PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL; +PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL; +PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL; +PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL; +PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL; +PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL; +PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL; +PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL; +PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL; +PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL; +PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL; +PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL; +PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL; +PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL; +PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL; +PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL; +PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL; +PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL; +PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL; +PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL; +PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL; +PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL; +PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL; +PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL; +PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL; + +PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES = NULL; +PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES = NULL; +PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES = NULL; +PFNGLFRUSTUMFOESPROC __glewFrustumfOES = NULL; +PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES = NULL; +PFNGLORTHOFOESPROC __glewOrthofOES = NULL; + +PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; +PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; + +PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL; +PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL; + +PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL; +PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL; + +PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL; +PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL; + +PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL; +PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL; + +PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL; +PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL; + +PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL; +PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL; +PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL; +PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL; +PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL; +PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL; + +PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL; + +PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL; + +PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL; +PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL; +PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL; +PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL; +PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL; +PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL; +PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL; +PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL; +PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL; +PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL; +PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL; +PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL; +PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL; + +PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL; + +PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL; + +PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL; + +PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL; +PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL; +PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL; +PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL; + +PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL; + +PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL; +PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL; +PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL; +PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL; +PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL; +PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL; +PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL; + +PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL; + +PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL; +PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL; +PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL; +PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL; +PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL; +PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL; +PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL; +PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL; + +PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL; + +PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL; +PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL; +PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL; +PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL; +PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL; +PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL; +PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL; + +PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL; +PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL; +PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL; +PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL; +PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL; +PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL; +PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL; +PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL; +PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL; +PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL; +PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL; +PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL; +PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL; +PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; +PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL; +PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL; + +PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL; + +#endif /* !WIN32 || !GLEW_MX */ + +#if !defined(GLEW_MX) + +GLboolean __GLEW_VERSION_1_1 = GL_FALSE; +GLboolean __GLEW_VERSION_1_2 = GL_FALSE; +GLboolean __GLEW_VERSION_1_3 = GL_FALSE; +GLboolean __GLEW_VERSION_1_4 = GL_FALSE; +GLboolean __GLEW_VERSION_1_5 = GL_FALSE; +GLboolean __GLEW_VERSION_2_0 = GL_FALSE; +GLboolean __GLEW_VERSION_2_1 = GL_FALSE; +GLboolean __GLEW_3DFX_multisample = GL_FALSE; +GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; +GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; +GLboolean __GLEW_APPLE_client_storage = GL_FALSE; +GLboolean __GLEW_APPLE_element_array = GL_FALSE; +GLboolean __GLEW_APPLE_fence = GL_FALSE; +GLboolean __GLEW_APPLE_float_pixels = GL_FALSE; +GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE; +GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE; +GLboolean __GLEW_APPLE_specular_vector = GL_FALSE; +GLboolean __GLEW_APPLE_texture_range = GL_FALSE; +GLboolean __GLEW_APPLE_transform_hint = GL_FALSE; +GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE; +GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE; +GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE; +GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; +GLboolean __GLEW_ARB_depth_texture = GL_FALSE; +GLboolean __GLEW_ARB_draw_buffers = GL_FALSE; +GLboolean __GLEW_ARB_fragment_program = GL_FALSE; +GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE; +GLboolean __GLEW_ARB_fragment_shader = GL_FALSE; +GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; +GLboolean __GLEW_ARB_imaging = GL_FALSE; +GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; +GLboolean __GLEW_ARB_multisample = GL_FALSE; +GLboolean __GLEW_ARB_multitexture = GL_FALSE; +GLboolean __GLEW_ARB_occlusion_query = GL_FALSE; +GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_point_parameters = GL_FALSE; +GLboolean __GLEW_ARB_point_sprite = GL_FALSE; +GLboolean __GLEW_ARB_shader_objects = GL_FALSE; +GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE; +GLboolean __GLEW_ARB_shadow = GL_FALSE; +GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; +GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE; +GLboolean __GLEW_ARB_texture_compression = GL_FALSE; +GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_add = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; +GLboolean __GLEW_ARB_texture_float = GL_FALSE; +GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; +GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; +GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; +GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE; +GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; +GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_vertex_program = GL_FALSE; +GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; +GLboolean __GLEW_ARB_window_pos = GL_FALSE; +GLboolean __GLEW_ATIX_point_sprites = GL_FALSE; +GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE; +GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE; +GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE; +GLboolean __GLEW_ATI_draw_buffers = GL_FALSE; +GLboolean __GLEW_ATI_element_array = GL_FALSE; +GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE; +GLboolean __GLEW_ATI_fragment_shader = GL_FALSE; +GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE; +GLboolean __GLEW_ATI_pn_triangles = GL_FALSE; +GLboolean __GLEW_ATI_separate_stencil = GL_FALSE; +GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE; +GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE; +GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE; +GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE; +GLboolean __GLEW_ATI_texture_float = GL_FALSE; +GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE; +GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE; +GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE; +GLboolean __GLEW_ATI_vertex_streams = GL_FALSE; +GLboolean __GLEW_EXT_422_pixels = GL_FALSE; +GLboolean __GLEW_EXT_Cg_shader = GL_FALSE; +GLboolean __GLEW_EXT_abgr = GL_FALSE; +GLboolean __GLEW_EXT_bgra = GL_FALSE; +GLboolean __GLEW_EXT_bindable_uniform = GL_FALSE; +GLboolean __GLEW_EXT_blend_color = GL_FALSE; +GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE; +GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE; +GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE; +GLboolean __GLEW_EXT_blend_minmax = GL_FALSE; +GLboolean __GLEW_EXT_blend_subtract = GL_FALSE; +GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE; +GLboolean __GLEW_EXT_cmyka = GL_FALSE; +GLboolean __GLEW_EXT_color_subtable = GL_FALSE; +GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE; +GLboolean __GLEW_EXT_convolution = GL_FALSE; +GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE; +GLboolean __GLEW_EXT_copy_texture = GL_FALSE; +GLboolean __GLEW_EXT_cull_vertex = GL_FALSE; +GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE; +GLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE; +GLboolean __GLEW_EXT_draw_instanced = GL_FALSE; +GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE; +GLboolean __GLEW_EXT_fog_coord = GL_FALSE; +GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE; +GLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE; +GLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE; +GLboolean __GLEW_EXT_histogram = GL_FALSE; +GLboolean __GLEW_EXT_index_array_formats = GL_FALSE; +GLboolean __GLEW_EXT_index_func = GL_FALSE; +GLboolean __GLEW_EXT_index_material = GL_FALSE; +GLboolean __GLEW_EXT_index_texture = GL_FALSE; +GLboolean __GLEW_EXT_light_texture = GL_FALSE; +GLboolean __GLEW_EXT_misc_attribute = GL_FALSE; +GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE; +GLboolean __GLEW_EXT_multisample = GL_FALSE; +GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE; +GLboolean __GLEW_EXT_packed_float = GL_FALSE; +GLboolean __GLEW_EXT_packed_pixels = GL_FALSE; +GLboolean __GLEW_EXT_paletted_texture = GL_FALSE; +GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE; +GLboolean __GLEW_EXT_pixel_transform = GL_FALSE; +GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE; +GLboolean __GLEW_EXT_point_parameters = GL_FALSE; +GLboolean __GLEW_EXT_polygon_offset = GL_FALSE; +GLboolean __GLEW_EXT_rescale_normal = GL_FALSE; +GLboolean __GLEW_EXT_scene_marker = GL_FALSE; +GLboolean __GLEW_EXT_secondary_color = GL_FALSE; +GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE; +GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE; +GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE; +GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE; +GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE; +GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE; +GLboolean __GLEW_EXT_subtexture = GL_FALSE; +GLboolean __GLEW_EXT_texture = GL_FALSE; +GLboolean __GLEW_EXT_texture3D = GL_FALSE; +GLboolean __GLEW_EXT_texture_array = GL_FALSE; +GLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE; +GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE; +GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE; +GLboolean __GLEW_EXT_texture_env = GL_FALSE; +GLboolean __GLEW_EXT_texture_env_add = GL_FALSE; +GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE; +GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE; +GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE; +GLboolean __GLEW_EXT_texture_integer = GL_FALSE; +GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE; +GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE; +GLboolean __GLEW_EXT_texture_object = GL_FALSE; +GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE; +GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE; +GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE; +GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE; +GLboolean __GLEW_EXT_timer_query = GL_FALSE; +GLboolean __GLEW_EXT_vertex_array = GL_FALSE; +GLboolean __GLEW_EXT_vertex_shader = GL_FALSE; +GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE; +GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE; +GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE; +GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE; +GLboolean __GLEW_HP_image_transform = GL_FALSE; +GLboolean __GLEW_HP_occlusion_test = GL_FALSE; +GLboolean __GLEW_HP_texture_lighting = GL_FALSE; +GLboolean __GLEW_IBM_cull_vertex = GL_FALSE; +GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE; +GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE; +GLboolean __GLEW_IBM_static_data = GL_FALSE; +GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; +GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; +GLboolean __GLEW_INGR_color_clamp = GL_FALSE; +GLboolean __GLEW_INGR_interlace_read = GL_FALSE; +GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; +GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; +GLboolean __GLEW_KTX_buffer_region = GL_FALSE; +GLboolean __GLEW_MESAX_texture_stack = GL_FALSE; +GLboolean __GLEW_MESA_pack_invert = GL_FALSE; +GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; +GLboolean __GLEW_MESA_window_pos = GL_FALSE; +GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; +GLboolean __GLEW_NV_blend_square = GL_FALSE; +GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; +GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; +GLboolean __GLEW_NV_depth_clamp = GL_FALSE; +GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; +GLboolean __GLEW_NV_evaluators = GL_FALSE; +GLboolean __GLEW_NV_fence = GL_FALSE; +GLboolean __GLEW_NV_float_buffer = GL_FALSE; +GLboolean __GLEW_NV_fog_distance = GL_FALSE; +GLboolean __GLEW_NV_fragment_program = GL_FALSE; +GLboolean __GLEW_NV_fragment_program2 = GL_FALSE; +GLboolean __GLEW_NV_fragment_program4 = GL_FALSE; +GLboolean __GLEW_NV_fragment_program_option = GL_FALSE; +GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE; +GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; +GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; +GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; +GLboolean __GLEW_NV_half_float = GL_FALSE; +GLboolean __GLEW_NV_light_max_exponent = GL_FALSE; +GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE; +GLboolean __GLEW_NV_occlusion_query = GL_FALSE; +GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE; +GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE; +GLboolean __GLEW_NV_pixel_data_range = GL_FALSE; +GLboolean __GLEW_NV_point_sprite = GL_FALSE; +GLboolean __GLEW_NV_primitive_restart = GL_FALSE; +GLboolean __GLEW_NV_register_combiners = GL_FALSE; +GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; +GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; +GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; +GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE; +GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE; +GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE; +GLboolean __GLEW_NV_texture_rectangle = GL_FALSE; +GLboolean __GLEW_NV_texture_shader = GL_FALSE; +GLboolean __GLEW_NV_texture_shader2 = GL_FALSE; +GLboolean __GLEW_NV_texture_shader3 = GL_FALSE; +GLboolean __GLEW_NV_transform_feedback = GL_FALSE; +GLboolean __GLEW_NV_vertex_array_range = GL_FALSE; +GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE; +GLboolean __GLEW_NV_vertex_program = GL_FALSE; +GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE; +GLboolean __GLEW_NV_vertex_program2 = GL_FALSE; +GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE; +GLboolean __GLEW_NV_vertex_program3 = GL_FALSE; +GLboolean __GLEW_NV_vertex_program4 = GL_FALSE; +GLboolean __GLEW_OES_byte_coordinates = GL_FALSE; +GLboolean __GLEW_OES_compressed_paletted_texture = GL_FALSE; +GLboolean __GLEW_OES_read_format = GL_FALSE; +GLboolean __GLEW_OES_single_precision = GL_FALSE; +GLboolean __GLEW_OML_interlace = GL_FALSE; +GLboolean __GLEW_OML_resample = GL_FALSE; +GLboolean __GLEW_OML_subsample = GL_FALSE; +GLboolean __GLEW_PGI_misc_hints = GL_FALSE; +GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; +GLboolean __GLEW_REND_screen_coordinates = GL_FALSE; +GLboolean __GLEW_S3_s3tc = GL_FALSE; +GLboolean __GLEW_SGIS_color_range = GL_FALSE; +GLboolean __GLEW_SGIS_detail_texture = GL_FALSE; +GLboolean __GLEW_SGIS_fog_function = GL_FALSE; +GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE; +GLboolean __GLEW_SGIS_multisample = GL_FALSE; +GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE; +GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE; +GLboolean __GLEW_SGIS_texture4D = GL_FALSE; +GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE; +GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE; +GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE; +GLboolean __GLEW_SGIS_texture_lod = GL_FALSE; +GLboolean __GLEW_SGIS_texture_select = GL_FALSE; +GLboolean __GLEW_SGIX_async = GL_FALSE; +GLboolean __GLEW_SGIX_async_histogram = GL_FALSE; +GLboolean __GLEW_SGIX_async_pixel = GL_FALSE; +GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE; +GLboolean __GLEW_SGIX_clipmap = GL_FALSE; +GLboolean __GLEW_SGIX_depth_texture = GL_FALSE; +GLboolean __GLEW_SGIX_flush_raster = GL_FALSE; +GLboolean __GLEW_SGIX_fog_offset = GL_FALSE; +GLboolean __GLEW_SGIX_fog_texture = GL_FALSE; +GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE; +GLboolean __GLEW_SGIX_framezoom = GL_FALSE; +GLboolean __GLEW_SGIX_interlace = GL_FALSE; +GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE; +GLboolean __GLEW_SGIX_list_priority = GL_FALSE; +GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE; +GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE; +GLboolean __GLEW_SGIX_reference_plane = GL_FALSE; +GLboolean __GLEW_SGIX_resample = GL_FALSE; +GLboolean __GLEW_SGIX_shadow = GL_FALSE; +GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE; +GLboolean __GLEW_SGIX_sprite = GL_FALSE; +GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE; +GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE; +GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE; +GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE; +GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE; +GLboolean __GLEW_SGIX_texture_range = GL_FALSE; +GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE; +GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE; +GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE; +GLboolean __GLEW_SGIX_ycrcb = GL_FALSE; +GLboolean __GLEW_SGI_color_matrix = GL_FALSE; +GLboolean __GLEW_SGI_color_table = GL_FALSE; +GLboolean __GLEW_SGI_texture_color_table = GL_FALSE; +GLboolean __GLEW_SUNX_constant_data = GL_FALSE; +GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE; +GLboolean __GLEW_SUN_global_alpha = GL_FALSE; +GLboolean __GLEW_SUN_mesh_array = GL_FALSE; +GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE; +GLboolean __GLEW_SUN_slice_accum = GL_FALSE; +GLboolean __GLEW_SUN_triangle_list = GL_FALSE; +GLboolean __GLEW_SUN_vertex = GL_FALSE; +GLboolean __GLEW_WIN_phong_shading = GL_FALSE; +GLboolean __GLEW_WIN_specular_fog = GL_FALSE; +GLboolean __GLEW_WIN_swap_hint = GL_FALSE; + +#endif /* !GLEW_MX */ + +#ifdef GL_VERSION_1_2 + +static GLboolean _glewInit_GL_VERSION_1_2 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r; + r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r; + r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r; + r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_2 */ + +#ifdef GL_VERSION_1_3 + +static GLboolean _glewInit_GL_VERSION_1_3 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r; + r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r; + r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r; + r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r; + r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r; + r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r; + r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r; + r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r; + r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r; + r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r; + r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r; + r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r; + r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r; + r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r; + r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r; + r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r; + r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r; + r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r; + r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r; + r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r; + r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r; + r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r; + r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r; + r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r; + r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r; + r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r; + r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r; + r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r; + r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r; + r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r; + r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r; + r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r; + r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r; + r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r; + r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r; + r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r; + r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r; + r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r; + r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r; + r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r; + r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r; + r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r; + r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r; + r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r; + r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r; + r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_3 */ + +#ifdef GL_VERSION_1_4 + +static GLboolean _glewInit_GL_VERSION_1_4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r; + r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; + r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r; + r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r; + r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r; + r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r; + r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r; + r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r; + r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r; + r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r; + r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r; + r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r; + r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPointParameteri")) == NULL) || r; + r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriv")) == NULL) || r; + r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r; + r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r; + r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r; + r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r; + r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r; + r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r; + r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r; + r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r; + r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r; + r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r; + r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r; + r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r; + r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r; + r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r; + r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r; + r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r; + r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r; + r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r; + r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r; + r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r; + r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r; + r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r; + r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r; + r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r; + r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r; + r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r; + r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r; + r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r; + r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r; + r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r; + r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r; + r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r; + r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_4 */ + +#ifdef GL_VERSION_1_5 + +static GLboolean _glewInit_GL_VERSION_1_5 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r; + r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r; + r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r; + r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r; + r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r; + r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r; + r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r; + r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r; + r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r; + r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r; + r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r; + r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r; + r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r; + r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r; + r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r; + r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r; + r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r; + r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r; + r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_5 */ + +#ifdef GL_VERSION_2_0 + +static GLboolean _glewInit_GL_VERSION_2_0 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r; + r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r; + r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r; + r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r; + r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r; + r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r; + r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r; + r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r; + r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r; + r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r; + r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r; + r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r; + r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r; + r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r; + r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r; + r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r; + r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r; + r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r; + r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r; + r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r; + r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r; + r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r; + r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r; + r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r; + r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r; + r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r; + r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r; + r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r; + r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r; + r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r; + r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r; + r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r; + r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r; + r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r; + r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r; + r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r; + r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r; + r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r; + r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r; + r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r; + r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r; + r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r; + r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r; + r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r; + r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r; + r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r; + r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r; + r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r; + r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r; + r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r; + r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r; + r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r; + r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r; + r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r; + r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r; + r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r; + r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r; + r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r; + r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r; + r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r; + r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r; + r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r; + r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r; + r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r; + r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r; + r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r; + r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r; + r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r; + r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r; + r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r; + r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r; + r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r; + r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r; + r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r; + r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r; + r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r; + r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r; + r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r; + r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r; + r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r; + r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r; + r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r; + r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r; + r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r; + r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r; + r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r; + r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r; + r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r; + r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r; + r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r; + r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r; + r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r; + r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_2_0 */ + +#ifdef GL_VERSION_2_1 + +static GLboolean _glewInit_GL_VERSION_2_1 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fv")) == NULL) || r; + r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fv")) == NULL) || r; + r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fv")) == NULL) || r; + r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fv")) == NULL) || r; + r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fv")) == NULL) || r; + r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fv")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_2_1 */ + +#ifdef GL_3DFX_multisample + +#endif /* GL_3DFX_multisample */ + +#ifdef GL_3DFX_tbuffer + +static GLboolean _glewInit_GL_3DFX_tbuffer (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r; + + return r; +} + +#endif /* GL_3DFX_tbuffer */ + +#ifdef GL_3DFX_texture_compression_FXT1 + +#endif /* GL_3DFX_texture_compression_FXT1 */ + +#ifdef GL_APPLE_client_storage + +#endif /* GL_APPLE_client_storage */ + +#ifdef GL_APPLE_element_array + +static GLboolean _glewInit_GL_APPLE_element_array (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r; + r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r; + r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r; + r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r; + r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_element_array */ + +#ifdef GL_APPLE_fence + +static GLboolean _glewInit_GL_APPLE_fence (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r; + r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r; + r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r; + r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r; + r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r; + r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r; + r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r; + r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_fence */ + +#ifdef GL_APPLE_float_pixels + +#endif /* GL_APPLE_float_pixels */ + +#ifdef GL_APPLE_flush_buffer_range + +static GLboolean _glewInit_GL_APPLE_flush_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBufferParameteriAPPLE")) == NULL) || r; + r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_flush_buffer_range */ + +#ifdef GL_APPLE_pixel_buffer + +#endif /* GL_APPLE_pixel_buffer */ + +#ifdef GL_APPLE_specular_vector + +#endif /* GL_APPLE_specular_vector */ + +#ifdef GL_APPLE_texture_range + +static GLboolean _glewInit_GL_APPLE_texture_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r; + r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_texture_range */ + +#ifdef GL_APPLE_transform_hint + +#endif /* GL_APPLE_transform_hint */ + +#ifdef GL_APPLE_vertex_array_object + +static GLboolean _glewInit_GL_APPLE_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r; + r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r; + r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r; + r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_vertex_array_object */ + +#ifdef GL_APPLE_vertex_array_range + +static GLboolean _glewInit_GL_APPLE_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r; + r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r; + r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_vertex_array_range */ + +#ifdef GL_APPLE_ycbcr_422 + +#endif /* GL_APPLE_ycbcr_422 */ + +#ifdef GL_ARB_color_buffer_float + +static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_color_buffer_float */ + +#ifdef GL_ARB_depth_texture + +#endif /* GL_ARB_depth_texture */ + +#ifdef GL_ARB_draw_buffers + +static GLboolean _glewInit_GL_ARB_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_draw_buffers */ + +#ifdef GL_ARB_fragment_program + +#endif /* GL_ARB_fragment_program */ + +#ifdef GL_ARB_fragment_program_shadow + +#endif /* GL_ARB_fragment_program_shadow */ + +#ifdef GL_ARB_fragment_shader + +#endif /* GL_ARB_fragment_shader */ + +#ifdef GL_ARB_half_float_pixel + +#endif /* GL_ARB_half_float_pixel */ + +#ifdef GL_ARB_imaging + +static GLboolean _glewInit_GL_ARB_imaging (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; + r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r; + r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r; + r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r; + r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r; + r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r; + r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r; + r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r; + r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r; + r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r; + r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r; + r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r; + r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r; + r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r; + r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r; + r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r; + r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r; + r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r; + r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r; + r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r; + r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r; + r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r; + r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r; + r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r; + r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r; + r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r; + r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r; + r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r; + r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r; + r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r; + r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r; + r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r; + r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_imaging */ + +#ifdef GL_ARB_matrix_palette + +static GLboolean _glewInit_GL_ARB_matrix_palette (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r; + r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r; + r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r; + r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r; + r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_matrix_palette */ + +#ifdef GL_ARB_multisample + +static GLboolean _glewInit_GL_ARB_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multisample */ + +#ifdef GL_ARB_multitexture + +static GLboolean _glewInit_GL_ARB_multitexture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r; + r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r; + r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r; + r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r; + r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r; + r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r; + r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r; + r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r; + r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r; + r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r; + r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r; + r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r; + r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r; + r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r; + r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r; + r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r; + r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r; + r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r; + r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r; + r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r; + r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r; + r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r; + r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r; + r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r; + r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r; + r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r; + r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r; + r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r; + r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r; + r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r; + r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r; + r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r; + r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r; + r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multitexture */ + +#ifdef GL_ARB_occlusion_query + +static GLboolean _glewInit_GL_ARB_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r; + r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r; + r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r; + r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r; + r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r; + r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r; + r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r; + r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_occlusion_query */ + +#ifdef GL_ARB_pixel_buffer_object + +#endif /* GL_ARB_pixel_buffer_object */ + +#ifdef GL_ARB_point_parameters + +static GLboolean _glewInit_GL_ARB_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r; + r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_point_parameters */ + +#ifdef GL_ARB_point_sprite + +#endif /* GL_ARB_point_sprite */ + +#ifdef GL_ARB_shader_objects + +static GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r; + r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r; + r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r; + r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r; + r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r; + r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r; + r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r; + r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r; + r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r; + r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r; + r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r; + r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r; + r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r; + r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r; + r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r; + r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r; + r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r; + r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r; + r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r; + r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r; + r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r; + r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r; + r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r; + r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r; + r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r; + r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r; + r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r; + r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r; + r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r; + r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r; + r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r; + r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r; + r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r; + r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r; + r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r; + r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r; + r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r; + r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r; + r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_objects */ + +#ifdef GL_ARB_shading_language_100 + +#endif /* GL_ARB_shading_language_100 */ + +#ifdef GL_ARB_shadow + +#endif /* GL_ARB_shadow */ + +#ifdef GL_ARB_shadow_ambient + +#endif /* GL_ARB_shadow_ambient */ + +#ifdef GL_ARB_texture_border_clamp + +#endif /* GL_ARB_texture_border_clamp */ + +#ifdef GL_ARB_texture_compression + +static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r; + r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r; + r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r; + r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r; + r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r; + r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r; + r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_compression */ + +#ifdef GL_ARB_texture_cube_map + +#endif /* GL_ARB_texture_cube_map */ + +#ifdef GL_ARB_texture_env_add + +#endif /* GL_ARB_texture_env_add */ + +#ifdef GL_ARB_texture_env_combine + +#endif /* GL_ARB_texture_env_combine */ + +#ifdef GL_ARB_texture_env_crossbar + +#endif /* GL_ARB_texture_env_crossbar */ + +#ifdef GL_ARB_texture_env_dot3 + +#endif /* GL_ARB_texture_env_dot3 */ + +#ifdef GL_ARB_texture_float + +#endif /* GL_ARB_texture_float */ + +#ifdef GL_ARB_texture_mirrored_repeat + +#endif /* GL_ARB_texture_mirrored_repeat */ + +#ifdef GL_ARB_texture_non_power_of_two + +#endif /* GL_ARB_texture_non_power_of_two */ + +#ifdef GL_ARB_texture_rectangle + +#endif /* GL_ARB_texture_rectangle */ + +#ifdef GL_ARB_transpose_matrix + +static GLboolean _glewInit_GL_ARB_transpose_matrix (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r; + r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r; + r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r; + r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_transpose_matrix */ + +#ifdef GL_ARB_vertex_blend + +static GLboolean _glewInit_GL_ARB_vertex_blend (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r; + r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r; + r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r; + r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r; + r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r; + r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r; + r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r; + r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r; + r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r; + r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_blend */ + +#ifdef GL_ARB_vertex_buffer_object + +static GLboolean _glewInit_GL_ARB_vertex_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r; + r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r; + r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r; + r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r; + r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r; + r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r; + r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r; + r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r; + r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r; + r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r; + r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_buffer_object */ + +#ifdef GL_ARB_vertex_program + +static GLboolean _glewInit_GL_ARB_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r; + r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r; + r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r; + r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r; + r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r; + r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r; + r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r; + r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r; + r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r; + r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r; + r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r; + r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r; + r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r; + r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r; + r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r; + r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r; + r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r; + r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r; + r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r; + r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r; + r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r; + r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r; + r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r; + r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r; + r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r; + r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r; + r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r; + r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r; + r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r; + r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r; + r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r; + r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r; + r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r; + r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r; + r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r; + r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r; + r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r; + r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r; + r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r; + r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r; + r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r; + r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r; + r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r; + r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r; + r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r; + r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r; + r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r; + r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r; + r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r; + r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r; + r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r; + r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r; + r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r; + r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r; + r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r; + r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r; + r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r; + r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r; + r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r; + r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r; + r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r; + r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_program */ + +#ifdef GL_ARB_vertex_shader + +static GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r; + r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r; + r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_shader */ + +#ifdef GL_ARB_window_pos + +static GLboolean _glewInit_GL_ARB_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r; + r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r; + r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r; + r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r; + r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r; + r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r; + r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r; + r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r; + r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r; + r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r; + r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r; + r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r; + r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r; + r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r; + r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r; + r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_window_pos */ + +#ifdef GL_ATIX_point_sprites + +#endif /* GL_ATIX_point_sprites */ + +#ifdef GL_ATIX_texture_env_combine3 + +#endif /* GL_ATIX_texture_env_combine3 */ + +#ifdef GL_ATIX_texture_env_route + +#endif /* GL_ATIX_texture_env_route */ + +#ifdef GL_ATIX_vertex_shader_output_point_size + +#endif /* GL_ATIX_vertex_shader_output_point_size */ + +#ifdef GL_ATI_draw_buffers + +static GLboolean _glewInit_GL_ATI_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_draw_buffers */ + +#ifdef GL_ATI_element_array + +static GLboolean _glewInit_GL_ATI_element_array (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r; + r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r; + r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_element_array */ + +#ifdef GL_ATI_envmap_bumpmap + +static GLboolean _glewInit_GL_ATI_envmap_bumpmap (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r; + r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r; + r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r; + r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_envmap_bumpmap */ + +#ifdef GL_ATI_fragment_shader + +static GLboolean _glewInit_GL_ATI_fragment_shader (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r; + r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r; + r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r; + r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r; + r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r; + r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r; + r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r; + r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r; + r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r; + r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r; + r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r; + r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r; + r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r; + r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_fragment_shader */ + +#ifdef GL_ATI_map_object_buffer + +static GLboolean _glewInit_GL_ATI_map_object_buffer (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r; + r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_map_object_buffer */ + +#ifdef GL_ATI_pn_triangles + +static GLboolean _glewInit_GL_ATI_pn_triangles (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r; + r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_pn_triangles */ + +#ifdef GL_ATI_separate_stencil + +static GLboolean _glewInit_GL_ATI_separate_stencil (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r; + r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_separate_stencil */ + +#ifdef GL_ATI_shader_texture_lod + +#endif /* GL_ATI_shader_texture_lod */ + +#ifdef GL_ATI_text_fragment_shader + +#endif /* GL_ATI_text_fragment_shader */ + +#ifdef GL_ATI_texture_compression_3dc + +#endif /* GL_ATI_texture_compression_3dc */ + +#ifdef GL_ATI_texture_env_combine3 + +#endif /* GL_ATI_texture_env_combine3 */ + +#ifdef GL_ATI_texture_float + +#endif /* GL_ATI_texture_float */ + +#ifdef GL_ATI_texture_mirror_once + +#endif /* GL_ATI_texture_mirror_once */ + +#ifdef GL_ATI_vertex_array_object + +static GLboolean _glewInit_GL_ATI_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r; + r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r; + r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r; + r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r; + r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r; + r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r; + r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r; + r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r; + r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r; + r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r; + r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r; + r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_vertex_array_object */ + +#ifdef GL_ATI_vertex_attrib_array_object + +static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r; + r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r; + r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_vertex_attrib_array_object */ + +#ifdef GL_ATI_vertex_streams + +static GLboolean _glewInit_GL_ATI_vertex_streams (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r; + r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r; + r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r; + r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r; + r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r; + r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r; + r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r; + r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r; + r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r; + r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r; + r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r; + r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r; + r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r; + r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r; + r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r; + r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r; + r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r; + r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r; + r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r; + r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r; + r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r; + r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r; + r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r; + r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r; + r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r; + r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r; + r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r; + r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r; + r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r; + r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r; + r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r; + r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r; + r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r; + r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r; + r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r; + r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r; + r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_vertex_streams */ + +#ifdef GL_EXT_422_pixels + +#endif /* GL_EXT_422_pixels */ + +#ifdef GL_EXT_Cg_shader + +#endif /* GL_EXT_Cg_shader */ + +#ifdef GL_EXT_abgr + +#endif /* GL_EXT_abgr */ + +#ifdef GL_EXT_bgra + +#endif /* GL_EXT_bgra */ + +#ifdef GL_EXT_bindable_uniform + +static GLboolean _glewInit_GL_EXT_bindable_uniform (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBufferSizeEXT")) == NULL) || r; + r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformOffsetEXT")) == NULL) || r; + r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUniformBufferEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_bindable_uniform */ + +#ifdef GL_EXT_blend_color + +static GLboolean _glewInit_GL_EXT_blend_color (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_color */ + +#ifdef GL_EXT_blend_equation_separate + +static GLboolean _glewInit_GL_EXT_blend_equation_separate (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_equation_separate */ + +#ifdef GL_EXT_blend_func_separate + +static GLboolean _glewInit_GL_EXT_blend_func_separate (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_func_separate */ + +#ifdef GL_EXT_blend_logic_op + +#endif /* GL_EXT_blend_logic_op */ + +#ifdef GL_EXT_blend_minmax + +static GLboolean _glewInit_GL_EXT_blend_minmax (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_minmax */ + +#ifdef GL_EXT_blend_subtract + +#endif /* GL_EXT_blend_subtract */ + +#ifdef GL_EXT_clip_volume_hint + +#endif /* GL_EXT_clip_volume_hint */ + +#ifdef GL_EXT_cmyka + +#endif /* GL_EXT_cmyka */ + +#ifdef GL_EXT_color_subtable + +static GLboolean _glewInit_GL_EXT_color_subtable (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r; + r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_color_subtable */ + +#ifdef GL_EXT_compiled_vertex_array + +static GLboolean _glewInit_GL_EXT_compiled_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r; + r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_compiled_vertex_array */ + +#ifdef GL_EXT_convolution + +static GLboolean _glewInit_GL_EXT_convolution (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r; + r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r; + r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r; + r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r; + r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r; + r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r; + r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r; + r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r; + r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r; + r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r; + r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r; + r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r; + r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_convolution */ + +#ifdef GL_EXT_coordinate_frame + +static GLboolean _glewInit_GL_EXT_coordinate_frame (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r; + r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_coordinate_frame */ + +#ifdef GL_EXT_copy_texture + +static GLboolean _glewInit_GL_EXT_copy_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r; + r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r; + r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r; + r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r; + r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_copy_texture */ + +#ifdef GL_EXT_cull_vertex + +static GLboolean _glewInit_GL_EXT_cull_vertex (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r; + r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_cull_vertex */ + +#ifdef GL_EXT_depth_bounds_test + +static GLboolean _glewInit_GL_EXT_depth_bounds_test (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_depth_bounds_test */ + +#ifdef GL_EXT_draw_buffers2 + +static GLboolean _glewInit_GL_EXT_draw_buffers2 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskIndexedEXT")) == NULL) || r; + r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableIndexedEXT")) == NULL) || r; + r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableIndexedEXT")) == NULL) || r; + r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetBooleanIndexedvEXT")) == NULL) || r; + r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerIndexedvEXT")) == NULL) || r; + r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledIndexedEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_buffers2 */ + +#ifdef GL_EXT_draw_instanced + +static GLboolean _glewInit_GL_EXT_draw_instanced (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedEXT")) == NULL) || r; + r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_instanced */ + +#ifdef GL_EXT_draw_range_elements + +static GLboolean _glewInit_GL_EXT_draw_range_elements (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_range_elements */ + +#ifdef GL_EXT_fog_coord + +static GLboolean _glewInit_GL_EXT_fog_coord (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r; + r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r; + r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r; + r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r; + r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_fog_coord */ + +#ifdef GL_EXT_fragment_lighting + +static GLboolean _glewInit_GL_EXT_fragment_lighting (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r; + r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r; + r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r; + r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r; + r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r; + r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r; + r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r; + r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r; + r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r; + r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r; + r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r; + r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r; + r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r; + r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r; + r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r; + r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r; + r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r; + r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_fragment_lighting */ + +#ifdef GL_EXT_framebuffer_blit + +static GLboolean _glewInit_GL_EXT_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_framebuffer_blit */ + +#ifdef GL_EXT_framebuffer_multisample + +static GLboolean _glewInit_GL_EXT_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_framebuffer_multisample */ + +#ifdef GL_EXT_framebuffer_object + +static GLboolean _glewInit_GL_EXT_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r; + r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r; + r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r; + r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r; + r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r; + r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r; + r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r; + r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r; + r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r; + r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r; + r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r; + r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r; + r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r; + r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r; + r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r; + r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r; + r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_framebuffer_object */ + +#ifdef GL_EXT_framebuffer_sRGB + +#endif /* GL_EXT_framebuffer_sRGB */ + +#ifdef GL_EXT_geometry_shader4 + +static GLboolean _glewInit_GL_EXT_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureEXT")) == NULL) || r; + r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceEXT")) == NULL) || r; + r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerEXT")) == NULL) || r; + r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_geometry_shader4 */ + +#ifdef GL_EXT_gpu_program_parameters + +static GLboolean _glewInit_GL_EXT_gpu_program_parameters (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameters4fvEXT")) == NULL) || r; + r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameters4fvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_gpu_program_parameters */ + +#ifdef GL_EXT_gpu_shader4 + +static GLboolean _glewInit_GL_EXT_gpu_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationEXT")) == NULL) || r; + r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocationEXT")) == NULL) || r; + r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuivEXT")) == NULL) || r; + r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIivEXT")) == NULL) || r; + r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuivEXT")) == NULL) || r; + r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiEXT")) == NULL) || r; + r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uivEXT")) == NULL) || r; + r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiEXT")) == NULL) || r; + r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uivEXT")) == NULL) || r; + r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiEXT")) == NULL) || r; + r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uivEXT")) == NULL) || r; + r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiEXT")) == NULL) || r; + r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uivEXT")) == NULL) || r; + r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iEXT")) == NULL) || r; + r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ivEXT")) == NULL) || r; + r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiEXT")) == NULL) || r; + r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uivEXT")) == NULL) || r; + r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iEXT")) == NULL) || r; + r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ivEXT")) == NULL) || r; + r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiEXT")) == NULL) || r; + r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uivEXT")) == NULL) || r; + r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iEXT")) == NULL) || r; + r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ivEXT")) == NULL) || r; + r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiEXT")) == NULL) || r; + r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uivEXT")) == NULL) || r; + r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bvEXT")) == NULL) || r; + r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iEXT")) == NULL) || r; + r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ivEXT")) == NULL) || r; + r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4svEXT")) == NULL) || r; + r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubvEXT")) == NULL) || r; + r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiEXT")) == NULL) || r; + r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uivEXT")) == NULL) || r; + r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usvEXT")) == NULL) || r; + r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_gpu_shader4 */ + +#ifdef GL_EXT_histogram + +static GLboolean _glewInit_GL_EXT_histogram (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r; + r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r; + r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r; + r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r; + r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r; + r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r; + r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r; + r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r; + r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r; + r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_histogram */ + +#ifdef GL_EXT_index_array_formats + +#endif /* GL_EXT_index_array_formats */ + +#ifdef GL_EXT_index_func + +static GLboolean _glewInit_GL_EXT_index_func (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_index_func */ + +#ifdef GL_EXT_index_material + +static GLboolean _glewInit_GL_EXT_index_material (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_index_material */ + +#ifdef GL_EXT_index_texture + +#endif /* GL_EXT_index_texture */ + +#ifdef GL_EXT_light_texture + +static GLboolean _glewInit_GL_EXT_light_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r; + r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r; + r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_light_texture */ + +#ifdef GL_EXT_misc_attribute + +#endif /* GL_EXT_misc_attribute */ + +#ifdef GL_EXT_multi_draw_arrays + +static GLboolean _glewInit_GL_EXT_multi_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r; + r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_multi_draw_arrays */ + +#ifdef GL_EXT_multisample + +static GLboolean _glewInit_GL_EXT_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r; + r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_multisample */ + +#ifdef GL_EXT_packed_depth_stencil + +#endif /* GL_EXT_packed_depth_stencil */ + +#ifdef GL_EXT_packed_float + +#endif /* GL_EXT_packed_float */ + +#ifdef GL_EXT_packed_pixels + +#endif /* GL_EXT_packed_pixels */ + +#ifdef GL_EXT_paletted_texture + +static GLboolean _glewInit_GL_EXT_paletted_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r; + r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r; + r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r; + r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_paletted_texture */ + +#ifdef GL_EXT_pixel_buffer_object + +#endif /* GL_EXT_pixel_buffer_object */ + +#ifdef GL_EXT_pixel_transform + +static GLboolean _glewInit_GL_EXT_pixel_transform (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r; + r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r; + r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r; + r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r; + r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r; + r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_pixel_transform */ + +#ifdef GL_EXT_pixel_transform_color_table + +#endif /* GL_EXT_pixel_transform_color_table */ + +#ifdef GL_EXT_point_parameters + +static GLboolean _glewInit_GL_EXT_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r; + r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_point_parameters */ + +#ifdef GL_EXT_polygon_offset + +static GLboolean _glewInit_GL_EXT_polygon_offset (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_polygon_offset */ + +#ifdef GL_EXT_rescale_normal + +#endif /* GL_EXT_rescale_normal */ + +#ifdef GL_EXT_scene_marker + +static GLboolean _glewInit_GL_EXT_scene_marker (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r; + r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_scene_marker */ + +#ifdef GL_EXT_secondary_color + +static GLboolean _glewInit_GL_EXT_secondary_color (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r; + r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r; + r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r; + r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r; + r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r; + r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r; + r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r; + r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r; + r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r; + r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r; + r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r; + r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r; + r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r; + r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r; + r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r; + r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r; + r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_secondary_color */ + +#ifdef GL_EXT_separate_specular_color + +#endif /* GL_EXT_separate_specular_color */ + +#ifdef GL_EXT_shadow_funcs + +#endif /* GL_EXT_shadow_funcs */ + +#ifdef GL_EXT_shared_texture_palette + +#endif /* GL_EXT_shared_texture_palette */ + +#ifdef GL_EXT_stencil_clear_tag + +#endif /* GL_EXT_stencil_clear_tag */ + +#ifdef GL_EXT_stencil_two_side + +static GLboolean _glewInit_GL_EXT_stencil_two_side (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_stencil_two_side */ + +#ifdef GL_EXT_stencil_wrap + +#endif /* GL_EXT_stencil_wrap */ + +#ifdef GL_EXT_subtexture + +static GLboolean _glewInit_GL_EXT_subtexture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r; + r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r; + r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_subtexture */ + +#ifdef GL_EXT_texture + +#endif /* GL_EXT_texture */ + +#ifdef GL_EXT_texture3D + +static GLboolean _glewInit_GL_EXT_texture3D (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture3D */ + +#ifdef GL_EXT_texture_array + +#endif /* GL_EXT_texture_array */ + +#ifdef GL_EXT_texture_buffer_object + +static GLboolean _glewInit_GL_EXT_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexBufferEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_buffer_object */ + +#ifdef GL_EXT_texture_compression_dxt1 + +#endif /* GL_EXT_texture_compression_dxt1 */ + +#ifdef GL_EXT_texture_compression_latc + +#endif /* GL_EXT_texture_compression_latc */ + +#ifdef GL_EXT_texture_compression_rgtc + +#endif /* GL_EXT_texture_compression_rgtc */ + +#ifdef GL_EXT_texture_compression_s3tc + +#endif /* GL_EXT_texture_compression_s3tc */ + +#ifdef GL_EXT_texture_cube_map + +#endif /* GL_EXT_texture_cube_map */ + +#ifdef GL_EXT_texture_edge_clamp + +#endif /* GL_EXT_texture_edge_clamp */ + +#ifdef GL_EXT_texture_env + +#endif /* GL_EXT_texture_env */ + +#ifdef GL_EXT_texture_env_add + +#endif /* GL_EXT_texture_env_add */ + +#ifdef GL_EXT_texture_env_combine + +#endif /* GL_EXT_texture_env_combine */ + +#ifdef GL_EXT_texture_env_dot3 + +#endif /* GL_EXT_texture_env_dot3 */ + +#ifdef GL_EXT_texture_filter_anisotropic + +#endif /* GL_EXT_texture_filter_anisotropic */ + +#ifdef GL_EXT_texture_integer + +static GLboolean _glewInit_GL_EXT_texture_integer (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIiEXT")) == NULL) || r; + r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIuiEXT")) == NULL) || r; + r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivEXT")) == NULL) || r; + r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivEXT")) == NULL) || r; + r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivEXT")) == NULL) || r; + r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_integer */ + +#ifdef GL_EXT_texture_lod_bias + +#endif /* GL_EXT_texture_lod_bias */ + +#ifdef GL_EXT_texture_mirror_clamp + +#endif /* GL_EXT_texture_mirror_clamp */ + +#ifdef GL_EXT_texture_object + +static GLboolean _glewInit_GL_EXT_texture_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r; + r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r; + r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r; + r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r; + r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r; + r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_object */ + +#ifdef GL_EXT_texture_perturb_normal + +static GLboolean _glewInit_GL_EXT_texture_perturb_normal (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_perturb_normal */ + +#ifdef GL_EXT_texture_rectangle + +#endif /* GL_EXT_texture_rectangle */ + +#ifdef GL_EXT_texture_sRGB + +#endif /* GL_EXT_texture_sRGB */ + +#ifdef GL_EXT_texture_shared_exponent + +#endif /* GL_EXT_texture_shared_exponent */ + +#ifdef GL_EXT_timer_query + +static GLboolean _glewInit_GL_EXT_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vEXT")) == NULL) || r; + r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_timer_query */ + +#ifdef GL_EXT_vertex_array + +static GLboolean _glewInit_GL_EXT_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r; + r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r; + r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r; + r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r; + r = ((glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointervEXT")) == NULL) || r; + r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r; + r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r; + r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r; + r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_array */ + +#ifdef GL_EXT_vertex_shader + +static GLboolean _glewInit_GL_EXT_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r; + r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r; + r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r; + r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r; + r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r; + r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r; + r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r; + r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r; + r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r; + r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r; + r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r; + r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r; + r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r; + r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r; + r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r; + r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r; + r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r; + r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r; + r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r; + r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r; + r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r; + r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r; + r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r; + r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r; + r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r; + r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r; + r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r; + r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r; + r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r; + r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r; + r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r; + r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r; + r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r; + r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r; + r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r; + r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r; + r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r; + r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r; + r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r; + r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r; + r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r; + r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_shader */ + +#ifdef GL_EXT_vertex_weighting + +static GLboolean _glewInit_GL_EXT_vertex_weighting (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r; + r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r; + r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_weighting */ + +#ifdef GL_GREMEDY_frame_terminator + +static GLboolean _glewInit_GL_GREMEDY_frame_terminator (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glFrameTerminatorGREMEDY")) == NULL) || r; + + return r; +} + +#endif /* GL_GREMEDY_frame_terminator */ + +#ifdef GL_GREMEDY_string_marker + +static GLboolean _glewInit_GL_GREMEDY_string_marker (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r; + + return r; +} + +#endif /* GL_GREMEDY_string_marker */ + +#ifdef GL_HP_convolution_border_modes + +#endif /* GL_HP_convolution_border_modes */ + +#ifdef GL_HP_image_transform + +static GLboolean _glewInit_GL_HP_image_transform (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r; + r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r; + r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r; + r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r; + r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r; + r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r; + + return r; +} + +#endif /* GL_HP_image_transform */ + +#ifdef GL_HP_occlusion_test + +#endif /* GL_HP_occlusion_test */ + +#ifdef GL_HP_texture_lighting + +#endif /* GL_HP_texture_lighting */ + +#ifdef GL_IBM_cull_vertex + +#endif /* GL_IBM_cull_vertex */ + +#ifdef GL_IBM_multimode_draw_arrays + +static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r; + r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r; + + return r; +} + +#endif /* GL_IBM_multimode_draw_arrays */ + +#ifdef GL_IBM_rasterpos_clip + +#endif /* GL_IBM_rasterpos_clip */ + +#ifdef GL_IBM_static_data + +#endif /* GL_IBM_static_data */ + +#ifdef GL_IBM_texture_mirrored_repeat + +#endif /* GL_IBM_texture_mirrored_repeat */ + +#ifdef GL_IBM_vertex_array_lists + +static GLboolean _glewInit_GL_IBM_vertex_array_lists (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r; + r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r; + r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r; + r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r; + r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r; + r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r; + r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r; + r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r; + + return r; +} + +#endif /* GL_IBM_vertex_array_lists */ + +#ifdef GL_INGR_color_clamp + +#endif /* GL_INGR_color_clamp */ + +#ifdef GL_INGR_interlace_read + +#endif /* GL_INGR_interlace_read */ + +#ifdef GL_INTEL_parallel_arrays + +static GLboolean _glewInit_GL_INTEL_parallel_arrays (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r; + r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r; + r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r; + r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_parallel_arrays */ + +#ifdef GL_INTEL_texture_scissor + +static GLboolean _glewInit_GL_INTEL_texture_scissor (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r; + r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_texture_scissor */ + +#ifdef GL_KTX_buffer_region + +static GLboolean _glewInit_GL_KTX_buffer_region (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBufferRegionEnabledEXT = (PFNGLBUFFERREGIONENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabledEXT")) == NULL) || r; + r = ((glDeleteBufferRegionEXT = (PFNGLDELETEBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegionEXT")) == NULL) || r; + r = ((glDrawBufferRegionEXT = (PFNGLDRAWBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegionEXT")) == NULL) || r; + r = ((glNewBufferRegionEXT = (PFNGLNEWBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegionEXT")) == NULL) || r; + r = ((glReadBufferRegionEXT = (PFNGLREADBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegionEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_KTX_buffer_region */ + +#ifdef GL_MESAX_texture_stack + +#endif /* GL_MESAX_texture_stack */ + +#ifdef GL_MESA_pack_invert + +#endif /* GL_MESA_pack_invert */ + +#ifdef GL_MESA_resize_buffers + +static GLboolean _glewInit_GL_MESA_resize_buffers (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r; + + return r; +} + +#endif /* GL_MESA_resize_buffers */ + +#ifdef GL_MESA_window_pos + +static GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r; + r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r; + r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r; + r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r; + r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r; + r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r; + r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r; + r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r; + r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r; + r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r; + r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r; + r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r; + r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r; + r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r; + r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r; + r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r; + r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r; + r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r; + r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r; + r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r; + r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r; + r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r; + r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r; + r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r; + + return r; +} + +#endif /* GL_MESA_window_pos */ + +#ifdef GL_MESA_ycbcr_texture + +#endif /* GL_MESA_ycbcr_texture */ + +#ifdef GL_NV_blend_square + +#endif /* GL_NV_blend_square */ + +#ifdef GL_NV_copy_depth_to_color + +#endif /* GL_NV_copy_depth_to_color */ + +#ifdef GL_NV_depth_buffer_float + +static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)"glClearDepthdNV")) == NULL) || r; + r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsdNV")) == NULL) || r; + r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangedNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_depth_buffer_float */ + +#ifdef GL_NV_depth_clamp + +#endif /* GL_NV_depth_clamp */ + +#ifdef GL_NV_depth_range_unclamped + +#endif /* GL_NV_depth_range_unclamped */ + +#ifdef GL_NV_evaluators + +static GLboolean _glewInit_GL_NV_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r; + r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r; + r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r; + r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r; + r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r; + r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r; + r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r; + r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r; + r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_evaluators */ + +#ifdef GL_NV_fence + +static GLboolean _glewInit_GL_NV_fence (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r; + r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r; + r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r; + r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r; + r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r; + r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r; + r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_fence */ + +#ifdef GL_NV_float_buffer + +#endif /* GL_NV_float_buffer */ + +#ifdef GL_NV_fog_distance + +#endif /* GL_NV_fog_distance */ + +#ifdef GL_NV_fragment_program + +static GLboolean _glewInit_GL_NV_fragment_program (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r; + r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r; + r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r; + r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r; + r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r; + r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_fragment_program */ + +#ifdef GL_NV_fragment_program2 + +#endif /* GL_NV_fragment_program2 */ + +#ifdef GL_NV_fragment_program4 + +#endif /* GL_NV_fragment_program4 */ + +#ifdef GL_NV_fragment_program_option + +#endif /* GL_NV_fragment_program_option */ + +#ifdef GL_NV_framebuffer_multisample_coverage + +static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleCoverageNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_framebuffer_multisample_coverage */ + +#ifdef GL_NV_geometry_program4 + +static GLboolean _glewInit_GL_NV_geometry_program4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)"glProgramVertexLimitNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_geometry_program4 */ + +#ifdef GL_NV_geometry_shader4 + +#endif /* GL_NV_geometry_shader4 */ + +#ifdef GL_NV_gpu_program4 + +static GLboolean _glewInit_GL_NV_gpu_program4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4iNV")) == NULL) || r; + r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4ivNV")) == NULL) || r; + r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uiNV")) == NULL) || r; + r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uivNV")) == NULL) || r; + r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4ivNV")) == NULL) || r; + r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4uivNV")) == NULL) || r; + r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4iNV")) == NULL) || r; + r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4ivNV")) == NULL) || r; + r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uiNV")) == NULL) || r; + r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uivNV")) == NULL) || r; + r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4ivNV")) == NULL) || r; + r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4uivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_gpu_program4 */ + +#ifdef GL_NV_half_float + +static GLboolean _glewInit_GL_NV_half_float (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r; + r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r; + r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r; + r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r; + r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r; + r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r; + r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r; + r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r; + r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r; + r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r; + r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r; + r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r; + r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r; + r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r; + r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r; + r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r; + r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r; + r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r; + r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r; + r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r; + r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r; + r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r; + r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r; + r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r; + r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r; + r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r; + r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r; + r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r; + r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r; + r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r; + r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r; + r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r; + r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r; + r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r; + r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r; + r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r; + r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r; + r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r; + r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r; + r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r; + r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r; + r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r; + r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r; + r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r; + r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r; + r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_half_float */ + +#ifdef GL_NV_light_max_exponent + +#endif /* GL_NV_light_max_exponent */ + +#ifdef GL_NV_multisample_filter_hint + +#endif /* GL_NV_multisample_filter_hint */ + +#ifdef GL_NV_occlusion_query + +static GLboolean _glewInit_GL_NV_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r; + r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r; + r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r; + r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r; + r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r; + r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r; + r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_occlusion_query */ + +#ifdef GL_NV_packed_depth_stencil + +#endif /* GL_NV_packed_depth_stencil */ + +#ifdef GL_NV_parameter_buffer_object + +static GLboolean _glewInit_GL_NV_parameter_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIivNV")) == NULL) || r; + r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIuivNV")) == NULL) || r; + r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersfvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_parameter_buffer_object */ + +#ifdef GL_NV_pixel_data_range + +static GLboolean _glewInit_GL_NV_pixel_data_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r; + r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_pixel_data_range */ + +#ifdef GL_NV_point_sprite + +static GLboolean _glewInit_GL_NV_point_sprite (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r; + r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_point_sprite */ + +#ifdef GL_NV_primitive_restart + +static GLboolean _glewInit_GL_NV_primitive_restart (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r; + r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_primitive_restart */ + +#ifdef GL_NV_register_combiners + +static GLboolean _glewInit_GL_NV_register_combiners (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r; + r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r; + r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r; + r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r; + r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r; + r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r; + r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r; + r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r; + r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r; + r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r; + r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r; + r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r; + r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_register_combiners */ + +#ifdef GL_NV_register_combiners2 + +static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r; + r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_register_combiners2 */ + +#ifdef GL_NV_texgen_emboss + +#endif /* GL_NV_texgen_emboss */ + +#ifdef GL_NV_texgen_reflection + +#endif /* GL_NV_texgen_reflection */ + +#ifdef GL_NV_texture_compression_vtc + +#endif /* GL_NV_texture_compression_vtc */ + +#ifdef GL_NV_texture_env_combine4 + +#endif /* GL_NV_texture_env_combine4 */ + +#ifdef GL_NV_texture_expand_normal + +#endif /* GL_NV_texture_expand_normal */ + +#ifdef GL_NV_texture_rectangle + +#endif /* GL_NV_texture_rectangle */ + +#ifdef GL_NV_texture_shader + +#endif /* GL_NV_texture_shader */ + +#ifdef GL_NV_texture_shader2 + +#endif /* GL_NV_texture_shader2 */ + +#ifdef GL_NV_texture_shader3 + +#endif /* GL_NV_texture_shader3 */ + +#ifdef GL_NV_transform_feedback + +static GLboolean _glewInit_GL_NV_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glActiveVaryingNV")) == NULL) || r; + r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackNV")) == NULL) || r; + r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseNV")) == NULL) || r; + r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetNV")) == NULL) || r; + r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeNV")) == NULL) || r; + r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackNV")) == NULL) || r; + r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveVaryingNV")) == NULL) || r; + r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingNV")) == NULL) || r; + r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)"glGetVaryingLocationNV")) == NULL) || r; + r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackAttribsNV")) == NULL) || r; + r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_transform_feedback */ + +#ifdef GL_NV_vertex_array_range + +static GLboolean _glewInit_GL_NV_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r; + r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vertex_array_range */ + +#ifdef GL_NV_vertex_array_range2 + +#endif /* GL_NV_vertex_array_range2 */ + +#ifdef GL_NV_vertex_program + +static GLboolean _glewInit_GL_NV_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r; + r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r; + r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r; + r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r; + r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r; + r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r; + r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r; + r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r; + r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r; + r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r; + r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r; + r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r; + r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r; + r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r; + r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r; + r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r; + r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r; + r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r; + r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r; + r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r; + r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r; + r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r; + r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r; + r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r; + r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r; + r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r; + r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r; + r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r; + r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r; + r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r; + r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r; + r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r; + r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r; + r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r; + r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r; + r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r; + r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r; + r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r; + r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r; + r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r; + r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r; + r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r; + r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r; + r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r; + r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r; + r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r; + r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r; + r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r; + r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r; + r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r; + r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r; + r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r; + r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r; + r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r; + r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r; + r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r; + r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r; + r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r; + r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r; + r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r; + r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r; + r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r; + r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r; + r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vertex_program */ + +#ifdef GL_NV_vertex_program1_1 + +#endif /* GL_NV_vertex_program1_1 */ + +#ifdef GL_NV_vertex_program2 + +#endif /* GL_NV_vertex_program2 */ + +#ifdef GL_NV_vertex_program2_option + +#endif /* GL_NV_vertex_program2_option */ + +#ifdef GL_NV_vertex_program3 + +#endif /* GL_NV_vertex_program3 */ + +#ifdef GL_NV_vertex_program4 + +#endif /* GL_NV_vertex_program4 */ + +#ifdef GL_OES_byte_coordinates + +#endif /* GL_OES_byte_coordinates */ + +#ifdef GL_OES_compressed_paletted_texture + +#endif /* GL_OES_compressed_paletted_texture */ + +#ifdef GL_OES_read_format + +#endif /* GL_OES_read_format */ + +#ifdef GL_OES_single_precision + +static GLboolean _glewInit_GL_OES_single_precision (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glewGetProcAddress((const GLubyte*)"glClearDepthfOES")) == NULL) || r; + r = ((glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glClipPlanefOES")) == NULL) || r; + r = ((glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glewGetProcAddress((const GLubyte*)"glDepthRangefOES")) == NULL) || r; + r = ((glFrustumfOES = (PFNGLFRUSTUMFOESPROC)glewGetProcAddress((const GLubyte*)"glFrustumfOES")) == NULL) || r; + r = ((glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanefOES")) == NULL) || r; + r = ((glOrthofOES = (PFNGLORTHOFOESPROC)glewGetProcAddress((const GLubyte*)"glOrthofOES")) == NULL) || r; + + return r; +} + +#endif /* GL_OES_single_precision */ + +#ifdef GL_OML_interlace + +#endif /* GL_OML_interlace */ + +#ifdef GL_OML_resample + +#endif /* GL_OML_resample */ + +#ifdef GL_OML_subsample + +#endif /* GL_OML_subsample */ + +#ifdef GL_PGI_misc_hints + +#endif /* GL_PGI_misc_hints */ + +#ifdef GL_PGI_vertex_hints + +#endif /* GL_PGI_vertex_hints */ + +#ifdef GL_REND_screen_coordinates + +#endif /* GL_REND_screen_coordinates */ + +#ifdef GL_S3_s3tc + +#endif /* GL_S3_s3tc */ + +#ifdef GL_SGIS_color_range + +#endif /* GL_SGIS_color_range */ + +#ifdef GL_SGIS_detail_texture + +static GLboolean _glewInit_GL_SGIS_detail_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r; + r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_detail_texture */ + +#ifdef GL_SGIS_fog_function + +static GLboolean _glewInit_GL_SGIS_fog_function (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r; + r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_fog_function */ + +#ifdef GL_SGIS_generate_mipmap + +#endif /* GL_SGIS_generate_mipmap */ + +#ifdef GL_SGIS_multisample + +static GLboolean _glewInit_GL_SGIS_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r; + r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_multisample */ + +#ifdef GL_SGIS_pixel_texture + +#endif /* GL_SGIS_pixel_texture */ + +#ifdef GL_SGIS_sharpen_texture + +static GLboolean _glewInit_GL_SGIS_sharpen_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r; + r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_sharpen_texture */ + +#ifdef GL_SGIS_texture4D + +static GLboolean _glewInit_GL_SGIS_texture4D (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r; + r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_texture4D */ + +#ifdef GL_SGIS_texture_border_clamp + +#endif /* GL_SGIS_texture_border_clamp */ + +#ifdef GL_SGIS_texture_edge_clamp + +#endif /* GL_SGIS_texture_edge_clamp */ + +#ifdef GL_SGIS_texture_filter4 + +static GLboolean _glewInit_GL_SGIS_texture_filter4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r; + r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_texture_filter4 */ + +#ifdef GL_SGIS_texture_lod + +#endif /* GL_SGIS_texture_lod */ + +#ifdef GL_SGIS_texture_select + +#endif /* GL_SGIS_texture_select */ + +#ifdef GL_SGIX_async + +static GLboolean _glewInit_GL_SGIX_async (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r; + r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r; + r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r; + r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r; + r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r; + r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_async */ + +#ifdef GL_SGIX_async_histogram + +#endif /* GL_SGIX_async_histogram */ + +#ifdef GL_SGIX_async_pixel + +#endif /* GL_SGIX_async_pixel */ + +#ifdef GL_SGIX_blend_alpha_minmax + +#endif /* GL_SGIX_blend_alpha_minmax */ + +#ifdef GL_SGIX_clipmap + +#endif /* GL_SGIX_clipmap */ + +#ifdef GL_SGIX_depth_texture + +#endif /* GL_SGIX_depth_texture */ + +#ifdef GL_SGIX_flush_raster + +static GLboolean _glewInit_GL_SGIX_flush_raster (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_flush_raster */ + +#ifdef GL_SGIX_fog_offset + +#endif /* GL_SGIX_fog_offset */ + +#ifdef GL_SGIX_fog_texture + +static GLboolean _glewInit_GL_SGIX_fog_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_fog_texture */ + +#ifdef GL_SGIX_fragment_specular_lighting + +static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r; + r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r; + r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r; + r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r; + r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r; + r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r; + r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r; + r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r; + r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r; + r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r; + r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r; + r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r; + r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r; + r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r; + r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r; + r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r; + r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_fragment_specular_lighting */ + +#ifdef GL_SGIX_framezoom + +static GLboolean _glewInit_GL_SGIX_framezoom (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_framezoom */ + +#ifdef GL_SGIX_interlace + +#endif /* GL_SGIX_interlace */ + +#ifdef GL_SGIX_ir_instrument1 + +#endif /* GL_SGIX_ir_instrument1 */ + +#ifdef GL_SGIX_list_priority + +#endif /* GL_SGIX_list_priority */ + +#ifdef GL_SGIX_pixel_texture + +static GLboolean _glewInit_GL_SGIX_pixel_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_pixel_texture */ + +#ifdef GL_SGIX_pixel_texture_bits + +#endif /* GL_SGIX_pixel_texture_bits */ + +#ifdef GL_SGIX_reference_plane + +static GLboolean _glewInit_GL_SGIX_reference_plane (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_reference_plane */ + +#ifdef GL_SGIX_resample + +#endif /* GL_SGIX_resample */ + +#ifdef GL_SGIX_shadow + +#endif /* GL_SGIX_shadow */ + +#ifdef GL_SGIX_shadow_ambient + +#endif /* GL_SGIX_shadow_ambient */ + +#ifdef GL_SGIX_sprite + +static GLboolean _glewInit_GL_SGIX_sprite (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r; + r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r; + r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r; + r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_sprite */ + +#ifdef GL_SGIX_tag_sample_buffer + +static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_tag_sample_buffer */ + +#ifdef GL_SGIX_texture_add_env + +#endif /* GL_SGIX_texture_add_env */ + +#ifdef GL_SGIX_texture_coordinate_clamp + +#endif /* GL_SGIX_texture_coordinate_clamp */ + +#ifdef GL_SGIX_texture_lod_bias + +#endif /* GL_SGIX_texture_lod_bias */ + +#ifdef GL_SGIX_texture_multi_buffer + +#endif /* GL_SGIX_texture_multi_buffer */ + +#ifdef GL_SGIX_texture_range + +#endif /* GL_SGIX_texture_range */ + +#ifdef GL_SGIX_texture_scale_bias + +#endif /* GL_SGIX_texture_scale_bias */ + +#ifdef GL_SGIX_vertex_preclip + +#endif /* GL_SGIX_vertex_preclip */ + +#ifdef GL_SGIX_vertex_preclip_hint + +#endif /* GL_SGIX_vertex_preclip_hint */ + +#ifdef GL_SGIX_ycrcb + +#endif /* GL_SGIX_ycrcb */ + +#ifdef GL_SGI_color_matrix + +#endif /* GL_SGI_color_matrix */ + +#ifdef GL_SGI_color_table + +static GLboolean _glewInit_GL_SGI_color_table (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r; + r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r; + r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r; + r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r; + r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r; + r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r; + r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r; + + return r; +} + +#endif /* GL_SGI_color_table */ + +#ifdef GL_SGI_texture_color_table + +#endif /* GL_SGI_texture_color_table */ + +#ifdef GL_SUNX_constant_data + +static GLboolean _glewInit_GL_SUNX_constant_data (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r; + + return r; +} + +#endif /* GL_SUNX_constant_data */ + +#ifdef GL_SUN_convolution_border_modes + +#endif /* GL_SUN_convolution_border_modes */ + +#ifdef GL_SUN_global_alpha + +static GLboolean _glewInit_GL_SUN_global_alpha (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r; + r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r; + r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r; + r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_global_alpha */ + +#ifdef GL_SUN_mesh_array + +#endif /* GL_SUN_mesh_array */ + +#ifdef GL_SUN_read_video_pixels + +static GLboolean _glewInit_GL_SUN_read_video_pixels (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_read_video_pixels */ + +#ifdef GL_SUN_slice_accum + +#endif /* GL_SUN_slice_accum */ + +#ifdef GL_SUN_triangle_list + +static GLboolean _glewInit_GL_SUN_triangle_list (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r; + r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r; + r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r; + r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r; + r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r; + r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r; + r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_triangle_list */ + +#ifdef GL_SUN_vertex + +static GLboolean _glewInit_GL_SUN_vertex (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r; + r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r; + r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r; + r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r; + r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r; + r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r; + r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r; + r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r; + r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r; + r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r; + r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_vertex */ + +#ifdef GL_WIN_phong_shading + +#endif /* GL_WIN_phong_shading */ + +#ifdef GL_WIN_specular_fog + +#endif /* GL_WIN_specular_fog */ + +#ifdef GL_WIN_swap_hint + +static GLboolean _glewInit_GL_WIN_swap_hint (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r; + + return r; +} + +#endif /* GL_WIN_swap_hint */ + +/* ------------------------------------------------------------------------- */ + +/* + * Search for name in the extensions string. Use of strstr() + * is not sufficient because extension names can be prefixes of + * other extension names. Could use strtok() but the constant + * string returned by glGetString might be in read-only memory. + */ +GLboolean glewGetExtension (const char* name) +{ + GLubyte* p; + GLubyte* end; + GLuint len = _glewStrLen((const GLubyte*)name); + p = (GLubyte*)glGetString(GL_EXTENSIONS); + if (0 == p) return GL_FALSE; + end = p + _glewStrLen(p); + while (p < end) + { + GLuint n = _glewStrCLen(p, ' '); + if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; + p += n+1; + } + return GL_FALSE; +} + +/* ------------------------------------------------------------------------- */ + +#ifndef GLEW_MX +static +#endif +GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) +{ + const GLubyte* s; + GLuint dot, major, minor; + /* query opengl version */ + s = glGetString(GL_VERSION); + dot = _glewStrCLen(s, '.'); + major = dot-1; + minor = dot+1; + if (dot == 0 || s[minor] == '\0') + return GLEW_ERROR_NO_GL_VERSION; + if (s[major] == '1' && s[minor] == '0') + { + return GLEW_ERROR_GL_VERSION_10_ONLY; + } + else + { + CONST_CAST(GLEW_VERSION_1_1) = GL_TRUE; + if (s[major] >= '2') + { + CONST_CAST(GLEW_VERSION_1_2) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_3) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_4) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_5) = GL_TRUE; + CONST_CAST(GLEW_VERSION_2_0) = GL_TRUE; + if (s[minor] >= '1') + { + CONST_CAST(GLEW_VERSION_2_1) = GL_TRUE; + } + } + else + { + if (s[minor] >= '5') + { + CONST_CAST(GLEW_VERSION_1_2) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_3) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_4) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_5) = GL_TRUE; + CONST_CAST(GLEW_VERSION_2_0) = GL_FALSE; + CONST_CAST(GLEW_VERSION_2_1) = GL_FALSE; + } + if (s[minor] == '4') + { + CONST_CAST(GLEW_VERSION_1_2) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_3) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_4) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_5) = GL_FALSE; + CONST_CAST(GLEW_VERSION_2_0) = GL_FALSE; + CONST_CAST(GLEW_VERSION_2_1) = GL_FALSE; + } + if (s[minor] == '3') + { + CONST_CAST(GLEW_VERSION_1_2) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_3) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_4) = GL_FALSE; + CONST_CAST(GLEW_VERSION_1_5) = GL_FALSE; + CONST_CAST(GLEW_VERSION_2_0) = GL_FALSE; + CONST_CAST(GLEW_VERSION_2_1) = GL_FALSE; + } + if (s[minor] == '2') + { + CONST_CAST(GLEW_VERSION_1_2) = GL_TRUE; + CONST_CAST(GLEW_VERSION_1_3) = GL_FALSE; + CONST_CAST(GLEW_VERSION_1_4) = GL_FALSE; + CONST_CAST(GLEW_VERSION_1_5) = GL_FALSE; + CONST_CAST(GLEW_VERSION_2_0) = GL_FALSE; + CONST_CAST(GLEW_VERSION_2_1) = GL_FALSE; + } + if (s[minor] < '2') + { + CONST_CAST(GLEW_VERSION_1_2) = GL_FALSE; + CONST_CAST(GLEW_VERSION_1_3) = GL_FALSE; + CONST_CAST(GLEW_VERSION_1_4) = GL_FALSE; + CONST_CAST(GLEW_VERSION_1_5) = GL_FALSE; + CONST_CAST(GLEW_VERSION_2_0) = GL_FALSE; + CONST_CAST(GLEW_VERSION_2_1) = GL_FALSE; + } + } + } + /* initialize extensions */ +#ifdef GL_VERSION_1_2 + if (glewExperimental || GLEW_VERSION_1_2) CONST_CAST(GLEW_VERSION_1_2) = !_glewInit_GL_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_1_2 */ +#ifdef GL_VERSION_1_3 + if (glewExperimental || GLEW_VERSION_1_3) CONST_CAST(GLEW_VERSION_1_3) = !_glewInit_GL_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_1_3 */ +#ifdef GL_VERSION_1_4 + if (glewExperimental || GLEW_VERSION_1_4) CONST_CAST(GLEW_VERSION_1_4) = !_glewInit_GL_VERSION_1_4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_1_4 */ +#ifdef GL_VERSION_1_5 + if (glewExperimental || GLEW_VERSION_1_5) CONST_CAST(GLEW_VERSION_1_5) = !_glewInit_GL_VERSION_1_5(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_1_5 */ +#ifdef GL_VERSION_2_0 + if (glewExperimental || GLEW_VERSION_2_0) CONST_CAST(GLEW_VERSION_2_0) = !_glewInit_GL_VERSION_2_0(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_2_0 */ +#ifdef GL_VERSION_2_1 + if (glewExperimental || GLEW_VERSION_2_1) CONST_CAST(GLEW_VERSION_2_1) = !_glewInit_GL_VERSION_2_1(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_2_1 */ +#ifdef GL_3DFX_multisample + CONST_CAST(GLEW_3DFX_multisample) = glewGetExtension("GL_3DFX_multisample"); +#endif /* GL_3DFX_multisample */ +#ifdef GL_3DFX_tbuffer + CONST_CAST(GLEW_3DFX_tbuffer) = glewGetExtension("GL_3DFX_tbuffer"); + if (glewExperimental || GLEW_3DFX_tbuffer) CONST_CAST(GLEW_3DFX_tbuffer) = !_glewInit_GL_3DFX_tbuffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_3DFX_tbuffer */ +#ifdef GL_3DFX_texture_compression_FXT1 + CONST_CAST(GLEW_3DFX_texture_compression_FXT1) = glewGetExtension("GL_3DFX_texture_compression_FXT1"); +#endif /* GL_3DFX_texture_compression_FXT1 */ +#ifdef GL_APPLE_client_storage + CONST_CAST(GLEW_APPLE_client_storage) = glewGetExtension("GL_APPLE_client_storage"); +#endif /* GL_APPLE_client_storage */ +#ifdef GL_APPLE_element_array + CONST_CAST(GLEW_APPLE_element_array) = glewGetExtension("GL_APPLE_element_array"); + if (glewExperimental || GLEW_APPLE_element_array) CONST_CAST(GLEW_APPLE_element_array) = !_glewInit_GL_APPLE_element_array(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_element_array */ +#ifdef GL_APPLE_fence + CONST_CAST(GLEW_APPLE_fence) = glewGetExtension("GL_APPLE_fence"); + if (glewExperimental || GLEW_APPLE_fence) CONST_CAST(GLEW_APPLE_fence) = !_glewInit_GL_APPLE_fence(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_fence */ +#ifdef GL_APPLE_float_pixels + CONST_CAST(GLEW_APPLE_float_pixels) = glewGetExtension("GL_APPLE_float_pixels"); +#endif /* GL_APPLE_float_pixels */ +#ifdef GL_APPLE_flush_buffer_range + CONST_CAST(GLEW_APPLE_flush_buffer_range) = glewGetExtension("GL_APPLE_flush_buffer_range"); + if (glewExperimental || GLEW_APPLE_flush_buffer_range) CONST_CAST(GLEW_APPLE_flush_buffer_range) = !_glewInit_GL_APPLE_flush_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_flush_buffer_range */ +#ifdef GL_APPLE_pixel_buffer + CONST_CAST(GLEW_APPLE_pixel_buffer) = glewGetExtension("GL_APPLE_pixel_buffer"); +#endif /* GL_APPLE_pixel_buffer */ +#ifdef GL_APPLE_specular_vector + CONST_CAST(GLEW_APPLE_specular_vector) = glewGetExtension("GL_APPLE_specular_vector"); +#endif /* GL_APPLE_specular_vector */ +#ifdef GL_APPLE_texture_range + CONST_CAST(GLEW_APPLE_texture_range) = glewGetExtension("GL_APPLE_texture_range"); + if (glewExperimental || GLEW_APPLE_texture_range) CONST_CAST(GLEW_APPLE_texture_range) = !_glewInit_GL_APPLE_texture_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_texture_range */ +#ifdef GL_APPLE_transform_hint + CONST_CAST(GLEW_APPLE_transform_hint) = glewGetExtension("GL_APPLE_transform_hint"); +#endif /* GL_APPLE_transform_hint */ +#ifdef GL_APPLE_vertex_array_object + CONST_CAST(GLEW_APPLE_vertex_array_object) = glewGetExtension("GL_APPLE_vertex_array_object"); + if (glewExperimental || GLEW_APPLE_vertex_array_object) CONST_CAST(GLEW_APPLE_vertex_array_object) = !_glewInit_GL_APPLE_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_vertex_array_object */ +#ifdef GL_APPLE_vertex_array_range + CONST_CAST(GLEW_APPLE_vertex_array_range) = glewGetExtension("GL_APPLE_vertex_array_range"); + if (glewExperimental || GLEW_APPLE_vertex_array_range) CONST_CAST(GLEW_APPLE_vertex_array_range) = !_glewInit_GL_APPLE_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_vertex_array_range */ +#ifdef GL_APPLE_ycbcr_422 + CONST_CAST(GLEW_APPLE_ycbcr_422) = glewGetExtension("GL_APPLE_ycbcr_422"); +#endif /* GL_APPLE_ycbcr_422 */ +#ifdef GL_ARB_color_buffer_float + CONST_CAST(GLEW_ARB_color_buffer_float) = glewGetExtension("GL_ARB_color_buffer_float"); + if (glewExperimental || GLEW_ARB_color_buffer_float) CONST_CAST(GLEW_ARB_color_buffer_float) = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_color_buffer_float */ +#ifdef GL_ARB_depth_texture + CONST_CAST(GLEW_ARB_depth_texture) = glewGetExtension("GL_ARB_depth_texture"); +#endif /* GL_ARB_depth_texture */ +#ifdef GL_ARB_draw_buffers + CONST_CAST(GLEW_ARB_draw_buffers) = glewGetExtension("GL_ARB_draw_buffers"); + if (glewExperimental || GLEW_ARB_draw_buffers) CONST_CAST(GLEW_ARB_draw_buffers) = !_glewInit_GL_ARB_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_draw_buffers */ +#ifdef GL_ARB_fragment_program + CONST_CAST(GLEW_ARB_fragment_program) = glewGetExtension("GL_ARB_fragment_program"); +#endif /* GL_ARB_fragment_program */ +#ifdef GL_ARB_fragment_program_shadow + CONST_CAST(GLEW_ARB_fragment_program_shadow) = glewGetExtension("GL_ARB_fragment_program_shadow"); +#endif /* GL_ARB_fragment_program_shadow */ +#ifdef GL_ARB_fragment_shader + CONST_CAST(GLEW_ARB_fragment_shader) = glewGetExtension("GL_ARB_fragment_shader"); +#endif /* GL_ARB_fragment_shader */ +#ifdef GL_ARB_half_float_pixel + CONST_CAST(GLEW_ARB_half_float_pixel) = glewGetExtension("GL_ARB_half_float_pixel"); +#endif /* GL_ARB_half_float_pixel */ +#ifdef GL_ARB_imaging + CONST_CAST(GLEW_ARB_imaging) = glewGetExtension("GL_ARB_imaging"); + if (glewExperimental || GLEW_ARB_imaging) CONST_CAST(GLEW_ARB_imaging) = !_glewInit_GL_ARB_imaging(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_imaging */ +#ifdef GL_ARB_matrix_palette + CONST_CAST(GLEW_ARB_matrix_palette) = glewGetExtension("GL_ARB_matrix_palette"); + if (glewExperimental || GLEW_ARB_matrix_palette) CONST_CAST(GLEW_ARB_matrix_palette) = !_glewInit_GL_ARB_matrix_palette(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_matrix_palette */ +#ifdef GL_ARB_multisample + CONST_CAST(GLEW_ARB_multisample) = glewGetExtension("GL_ARB_multisample"); + if (glewExperimental || GLEW_ARB_multisample) CONST_CAST(GLEW_ARB_multisample) = !_glewInit_GL_ARB_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_multisample */ +#ifdef GL_ARB_multitexture + CONST_CAST(GLEW_ARB_multitexture) = glewGetExtension("GL_ARB_multitexture"); + if (glewExperimental || GLEW_ARB_multitexture) CONST_CAST(GLEW_ARB_multitexture) = !_glewInit_GL_ARB_multitexture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_multitexture */ +#ifdef GL_ARB_occlusion_query + CONST_CAST(GLEW_ARB_occlusion_query) = glewGetExtension("GL_ARB_occlusion_query"); + if (glewExperimental || GLEW_ARB_occlusion_query) CONST_CAST(GLEW_ARB_occlusion_query) = !_glewInit_GL_ARB_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_occlusion_query */ +#ifdef GL_ARB_pixel_buffer_object + CONST_CAST(GLEW_ARB_pixel_buffer_object) = glewGetExtension("GL_ARB_pixel_buffer_object"); +#endif /* GL_ARB_pixel_buffer_object */ +#ifdef GL_ARB_point_parameters + CONST_CAST(GLEW_ARB_point_parameters) = glewGetExtension("GL_ARB_point_parameters"); + if (glewExperimental || GLEW_ARB_point_parameters) CONST_CAST(GLEW_ARB_point_parameters) = !_glewInit_GL_ARB_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_point_parameters */ +#ifdef GL_ARB_point_sprite + CONST_CAST(GLEW_ARB_point_sprite) = glewGetExtension("GL_ARB_point_sprite"); +#endif /* GL_ARB_point_sprite */ +#ifdef GL_ARB_shader_objects + CONST_CAST(GLEW_ARB_shader_objects) = glewGetExtension("GL_ARB_shader_objects"); + if (glewExperimental || GLEW_ARB_shader_objects) CONST_CAST(GLEW_ARB_shader_objects) = !_glewInit_GL_ARB_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_shader_objects */ +#ifdef GL_ARB_shading_language_100 + CONST_CAST(GLEW_ARB_shading_language_100) = glewGetExtension("GL_ARB_shading_language_100"); +#endif /* GL_ARB_shading_language_100 */ +#ifdef GL_ARB_shadow + CONST_CAST(GLEW_ARB_shadow) = glewGetExtension("GL_ARB_shadow"); +#endif /* GL_ARB_shadow */ +#ifdef GL_ARB_shadow_ambient + CONST_CAST(GLEW_ARB_shadow_ambient) = glewGetExtension("GL_ARB_shadow_ambient"); +#endif /* GL_ARB_shadow_ambient */ +#ifdef GL_ARB_texture_border_clamp + CONST_CAST(GLEW_ARB_texture_border_clamp) = glewGetExtension("GL_ARB_texture_border_clamp"); +#endif /* GL_ARB_texture_border_clamp */ +#ifdef GL_ARB_texture_compression + CONST_CAST(GLEW_ARB_texture_compression) = glewGetExtension("GL_ARB_texture_compression"); + if (glewExperimental || GLEW_ARB_texture_compression) CONST_CAST(GLEW_ARB_texture_compression) = !_glewInit_GL_ARB_texture_compression(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_texture_compression */ +#ifdef GL_ARB_texture_cube_map + CONST_CAST(GLEW_ARB_texture_cube_map) = glewGetExtension("GL_ARB_texture_cube_map"); +#endif /* GL_ARB_texture_cube_map */ +#ifdef GL_ARB_texture_env_add + CONST_CAST(GLEW_ARB_texture_env_add) = glewGetExtension("GL_ARB_texture_env_add"); +#endif /* GL_ARB_texture_env_add */ +#ifdef GL_ARB_texture_env_combine + CONST_CAST(GLEW_ARB_texture_env_combine) = glewGetExtension("GL_ARB_texture_env_combine"); +#endif /* GL_ARB_texture_env_combine */ +#ifdef GL_ARB_texture_env_crossbar + CONST_CAST(GLEW_ARB_texture_env_crossbar) = glewGetExtension("GL_ARB_texture_env_crossbar"); +#endif /* GL_ARB_texture_env_crossbar */ +#ifdef GL_ARB_texture_env_dot3 + CONST_CAST(GLEW_ARB_texture_env_dot3) = glewGetExtension("GL_ARB_texture_env_dot3"); +#endif /* GL_ARB_texture_env_dot3 */ +#ifdef GL_ARB_texture_float + CONST_CAST(GLEW_ARB_texture_float) = glewGetExtension("GL_ARB_texture_float"); +#endif /* GL_ARB_texture_float */ +#ifdef GL_ARB_texture_mirrored_repeat + CONST_CAST(GLEW_ARB_texture_mirrored_repeat) = glewGetExtension("GL_ARB_texture_mirrored_repeat"); +#endif /* GL_ARB_texture_mirrored_repeat */ +#ifdef GL_ARB_texture_non_power_of_two + CONST_CAST(GLEW_ARB_texture_non_power_of_two) = glewGetExtension("GL_ARB_texture_non_power_of_two"); +#endif /* GL_ARB_texture_non_power_of_two */ +#ifdef GL_ARB_texture_rectangle + CONST_CAST(GLEW_ARB_texture_rectangle) = glewGetExtension("GL_ARB_texture_rectangle"); +#endif /* GL_ARB_texture_rectangle */ +#ifdef GL_ARB_transpose_matrix + CONST_CAST(GLEW_ARB_transpose_matrix) = glewGetExtension("GL_ARB_transpose_matrix"); + if (glewExperimental || GLEW_ARB_transpose_matrix) CONST_CAST(GLEW_ARB_transpose_matrix) = !_glewInit_GL_ARB_transpose_matrix(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_transpose_matrix */ +#ifdef GL_ARB_vertex_blend + CONST_CAST(GLEW_ARB_vertex_blend) = glewGetExtension("GL_ARB_vertex_blend"); + if (glewExperimental || GLEW_ARB_vertex_blend) CONST_CAST(GLEW_ARB_vertex_blend) = !_glewInit_GL_ARB_vertex_blend(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_blend */ +#ifdef GL_ARB_vertex_buffer_object + CONST_CAST(GLEW_ARB_vertex_buffer_object) = glewGetExtension("GL_ARB_vertex_buffer_object"); + if (glewExperimental || GLEW_ARB_vertex_buffer_object) CONST_CAST(GLEW_ARB_vertex_buffer_object) = !_glewInit_GL_ARB_vertex_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_buffer_object */ +#ifdef GL_ARB_vertex_program + CONST_CAST(GLEW_ARB_vertex_program) = glewGetExtension("GL_ARB_vertex_program"); + if (glewExperimental || GLEW_ARB_vertex_program) CONST_CAST(GLEW_ARB_vertex_program) = !_glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_program */ +#ifdef GL_ARB_vertex_shader + CONST_CAST(GLEW_ARB_vertex_shader) = glewGetExtension("GL_ARB_vertex_shader"); + if (glewExperimental || GLEW_ARB_vertex_shader) CONST_CAST(GLEW_ARB_vertex_shader) = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_shader */ +#ifdef GL_ARB_window_pos + CONST_CAST(GLEW_ARB_window_pos) = glewGetExtension("GL_ARB_window_pos"); + if (glewExperimental || GLEW_ARB_window_pos) CONST_CAST(GLEW_ARB_window_pos) = !_glewInit_GL_ARB_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_window_pos */ +#ifdef GL_ATIX_point_sprites + CONST_CAST(GLEW_ATIX_point_sprites) = glewGetExtension("GL_ATIX_point_sprites"); +#endif /* GL_ATIX_point_sprites */ +#ifdef GL_ATIX_texture_env_combine3 + CONST_CAST(GLEW_ATIX_texture_env_combine3) = glewGetExtension("GL_ATIX_texture_env_combine3"); +#endif /* GL_ATIX_texture_env_combine3 */ +#ifdef GL_ATIX_texture_env_route + CONST_CAST(GLEW_ATIX_texture_env_route) = glewGetExtension("GL_ATIX_texture_env_route"); +#endif /* GL_ATIX_texture_env_route */ +#ifdef GL_ATIX_vertex_shader_output_point_size + CONST_CAST(GLEW_ATIX_vertex_shader_output_point_size) = glewGetExtension("GL_ATIX_vertex_shader_output_point_size"); +#endif /* GL_ATIX_vertex_shader_output_point_size */ +#ifdef GL_ATI_draw_buffers + CONST_CAST(GLEW_ATI_draw_buffers) = glewGetExtension("GL_ATI_draw_buffers"); + if (glewExperimental || GLEW_ATI_draw_buffers) CONST_CAST(GLEW_ATI_draw_buffers) = !_glewInit_GL_ATI_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_draw_buffers */ +#ifdef GL_ATI_element_array + CONST_CAST(GLEW_ATI_element_array) = glewGetExtension("GL_ATI_element_array"); + if (glewExperimental || GLEW_ATI_element_array) CONST_CAST(GLEW_ATI_element_array) = !_glewInit_GL_ATI_element_array(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_element_array */ +#ifdef GL_ATI_envmap_bumpmap + CONST_CAST(GLEW_ATI_envmap_bumpmap) = glewGetExtension("GL_ATI_envmap_bumpmap"); + if (glewExperimental || GLEW_ATI_envmap_bumpmap) CONST_CAST(GLEW_ATI_envmap_bumpmap) = !_glewInit_GL_ATI_envmap_bumpmap(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_envmap_bumpmap */ +#ifdef GL_ATI_fragment_shader + CONST_CAST(GLEW_ATI_fragment_shader) = glewGetExtension("GL_ATI_fragment_shader"); + if (glewExperimental || GLEW_ATI_fragment_shader) CONST_CAST(GLEW_ATI_fragment_shader) = !_glewInit_GL_ATI_fragment_shader(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_fragment_shader */ +#ifdef GL_ATI_map_object_buffer + CONST_CAST(GLEW_ATI_map_object_buffer) = glewGetExtension("GL_ATI_map_object_buffer"); + if (glewExperimental || GLEW_ATI_map_object_buffer) CONST_CAST(GLEW_ATI_map_object_buffer) = !_glewInit_GL_ATI_map_object_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_map_object_buffer */ +#ifdef GL_ATI_pn_triangles + CONST_CAST(GLEW_ATI_pn_triangles) = glewGetExtension("GL_ATI_pn_triangles"); + if (glewExperimental || GLEW_ATI_pn_triangles) CONST_CAST(GLEW_ATI_pn_triangles) = !_glewInit_GL_ATI_pn_triangles(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_pn_triangles */ +#ifdef GL_ATI_separate_stencil + CONST_CAST(GLEW_ATI_separate_stencil) = glewGetExtension("GL_ATI_separate_stencil"); + if (glewExperimental || GLEW_ATI_separate_stencil) CONST_CAST(GLEW_ATI_separate_stencil) = !_glewInit_GL_ATI_separate_stencil(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_separate_stencil */ +#ifdef GL_ATI_shader_texture_lod + CONST_CAST(GLEW_ATI_shader_texture_lod) = glewGetExtension("GL_ATI_shader_texture_lod"); +#endif /* GL_ATI_shader_texture_lod */ +#ifdef GL_ATI_text_fragment_shader + CONST_CAST(GLEW_ATI_text_fragment_shader) = glewGetExtension("GL_ATI_text_fragment_shader"); +#endif /* GL_ATI_text_fragment_shader */ +#ifdef GL_ATI_texture_compression_3dc + CONST_CAST(GLEW_ATI_texture_compression_3dc) = glewGetExtension("GL_ATI_texture_compression_3dc"); +#endif /* GL_ATI_texture_compression_3dc */ +#ifdef GL_ATI_texture_env_combine3 + CONST_CAST(GLEW_ATI_texture_env_combine3) = glewGetExtension("GL_ATI_texture_env_combine3"); +#endif /* GL_ATI_texture_env_combine3 */ +#ifdef GL_ATI_texture_float + CONST_CAST(GLEW_ATI_texture_float) = glewGetExtension("GL_ATI_texture_float"); +#endif /* GL_ATI_texture_float */ +#ifdef GL_ATI_texture_mirror_once + CONST_CAST(GLEW_ATI_texture_mirror_once) = glewGetExtension("GL_ATI_texture_mirror_once"); +#endif /* GL_ATI_texture_mirror_once */ +#ifdef GL_ATI_vertex_array_object + CONST_CAST(GLEW_ATI_vertex_array_object) = glewGetExtension("GL_ATI_vertex_array_object"); + if (glewExperimental || GLEW_ATI_vertex_array_object) CONST_CAST(GLEW_ATI_vertex_array_object) = !_glewInit_GL_ATI_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_vertex_array_object */ +#ifdef GL_ATI_vertex_attrib_array_object + CONST_CAST(GLEW_ATI_vertex_attrib_array_object) = glewGetExtension("GL_ATI_vertex_attrib_array_object"); + if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) CONST_CAST(GLEW_ATI_vertex_attrib_array_object) = !_glewInit_GL_ATI_vertex_attrib_array_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_vertex_attrib_array_object */ +#ifdef GL_ATI_vertex_streams + CONST_CAST(GLEW_ATI_vertex_streams) = glewGetExtension("GL_ATI_vertex_streams"); + if (glewExperimental || GLEW_ATI_vertex_streams) CONST_CAST(GLEW_ATI_vertex_streams) = !_glewInit_GL_ATI_vertex_streams(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_vertex_streams */ +#ifdef GL_EXT_422_pixels + CONST_CAST(GLEW_EXT_422_pixels) = glewGetExtension("GL_EXT_422_pixels"); +#endif /* GL_EXT_422_pixels */ +#ifdef GL_EXT_Cg_shader + CONST_CAST(GLEW_EXT_Cg_shader) = glewGetExtension("GL_EXT_Cg_shader"); +#endif /* GL_EXT_Cg_shader */ +#ifdef GL_EXT_abgr + CONST_CAST(GLEW_EXT_abgr) = glewGetExtension("GL_EXT_abgr"); +#endif /* GL_EXT_abgr */ +#ifdef GL_EXT_bgra + CONST_CAST(GLEW_EXT_bgra) = glewGetExtension("GL_EXT_bgra"); +#endif /* GL_EXT_bgra */ +#ifdef GL_EXT_bindable_uniform + CONST_CAST(GLEW_EXT_bindable_uniform) = glewGetExtension("GL_EXT_bindable_uniform"); + if (glewExperimental || GLEW_EXT_bindable_uniform) CONST_CAST(GLEW_EXT_bindable_uniform) = !_glewInit_GL_EXT_bindable_uniform(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_bindable_uniform */ +#ifdef GL_EXT_blend_color + CONST_CAST(GLEW_EXT_blend_color) = glewGetExtension("GL_EXT_blend_color"); + if (glewExperimental || GLEW_EXT_blend_color) CONST_CAST(GLEW_EXT_blend_color) = !_glewInit_GL_EXT_blend_color(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_blend_color */ +#ifdef GL_EXT_blend_equation_separate + CONST_CAST(GLEW_EXT_blend_equation_separate) = glewGetExtension("GL_EXT_blend_equation_separate"); + if (glewExperimental || GLEW_EXT_blend_equation_separate) CONST_CAST(GLEW_EXT_blend_equation_separate) = !_glewInit_GL_EXT_blend_equation_separate(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_blend_equation_separate */ +#ifdef GL_EXT_blend_func_separate + CONST_CAST(GLEW_EXT_blend_func_separate) = glewGetExtension("GL_EXT_blend_func_separate"); + if (glewExperimental || GLEW_EXT_blend_func_separate) CONST_CAST(GLEW_EXT_blend_func_separate) = !_glewInit_GL_EXT_blend_func_separate(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_blend_func_separate */ +#ifdef GL_EXT_blend_logic_op + CONST_CAST(GLEW_EXT_blend_logic_op) = glewGetExtension("GL_EXT_blend_logic_op"); +#endif /* GL_EXT_blend_logic_op */ +#ifdef GL_EXT_blend_minmax + CONST_CAST(GLEW_EXT_blend_minmax) = glewGetExtension("GL_EXT_blend_minmax"); + if (glewExperimental || GLEW_EXT_blend_minmax) CONST_CAST(GLEW_EXT_blend_minmax) = !_glewInit_GL_EXT_blend_minmax(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_blend_minmax */ +#ifdef GL_EXT_blend_subtract + CONST_CAST(GLEW_EXT_blend_subtract) = glewGetExtension("GL_EXT_blend_subtract"); +#endif /* GL_EXT_blend_subtract */ +#ifdef GL_EXT_clip_volume_hint + CONST_CAST(GLEW_EXT_clip_volume_hint) = glewGetExtension("GL_EXT_clip_volume_hint"); +#endif /* GL_EXT_clip_volume_hint */ +#ifdef GL_EXT_cmyka + CONST_CAST(GLEW_EXT_cmyka) = glewGetExtension("GL_EXT_cmyka"); +#endif /* GL_EXT_cmyka */ +#ifdef GL_EXT_color_subtable + CONST_CAST(GLEW_EXT_color_subtable) = glewGetExtension("GL_EXT_color_subtable"); + if (glewExperimental || GLEW_EXT_color_subtable) CONST_CAST(GLEW_EXT_color_subtable) = !_glewInit_GL_EXT_color_subtable(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_color_subtable */ +#ifdef GL_EXT_compiled_vertex_array + CONST_CAST(GLEW_EXT_compiled_vertex_array) = glewGetExtension("GL_EXT_compiled_vertex_array"); + if (glewExperimental || GLEW_EXT_compiled_vertex_array) CONST_CAST(GLEW_EXT_compiled_vertex_array) = !_glewInit_GL_EXT_compiled_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_compiled_vertex_array */ +#ifdef GL_EXT_convolution + CONST_CAST(GLEW_EXT_convolution) = glewGetExtension("GL_EXT_convolution"); + if (glewExperimental || GLEW_EXT_convolution) CONST_CAST(GLEW_EXT_convolution) = !_glewInit_GL_EXT_convolution(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_convolution */ +#ifdef GL_EXT_coordinate_frame + CONST_CAST(GLEW_EXT_coordinate_frame) = glewGetExtension("GL_EXT_coordinate_frame"); + if (glewExperimental || GLEW_EXT_coordinate_frame) CONST_CAST(GLEW_EXT_coordinate_frame) = !_glewInit_GL_EXT_coordinate_frame(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_coordinate_frame */ +#ifdef GL_EXT_copy_texture + CONST_CAST(GLEW_EXT_copy_texture) = glewGetExtension("GL_EXT_copy_texture"); + if (glewExperimental || GLEW_EXT_copy_texture) CONST_CAST(GLEW_EXT_copy_texture) = !_glewInit_GL_EXT_copy_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_copy_texture */ +#ifdef GL_EXT_cull_vertex + CONST_CAST(GLEW_EXT_cull_vertex) = glewGetExtension("GL_EXT_cull_vertex"); + if (glewExperimental || GLEW_EXT_cull_vertex) CONST_CAST(GLEW_EXT_cull_vertex) = !_glewInit_GL_EXT_cull_vertex(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_cull_vertex */ +#ifdef GL_EXT_depth_bounds_test + CONST_CAST(GLEW_EXT_depth_bounds_test) = glewGetExtension("GL_EXT_depth_bounds_test"); + if (glewExperimental || GLEW_EXT_depth_bounds_test) CONST_CAST(GLEW_EXT_depth_bounds_test) = !_glewInit_GL_EXT_depth_bounds_test(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_depth_bounds_test */ +#ifdef GL_EXT_draw_buffers2 + CONST_CAST(GLEW_EXT_draw_buffers2) = glewGetExtension("GL_EXT_draw_buffers2"); + if (glewExperimental || GLEW_EXT_draw_buffers2) CONST_CAST(GLEW_EXT_draw_buffers2) = !_glewInit_GL_EXT_draw_buffers2(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_draw_buffers2 */ +#ifdef GL_EXT_draw_instanced + CONST_CAST(GLEW_EXT_draw_instanced) = glewGetExtension("GL_EXT_draw_instanced"); + if (glewExperimental || GLEW_EXT_draw_instanced) CONST_CAST(GLEW_EXT_draw_instanced) = !_glewInit_GL_EXT_draw_instanced(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_draw_instanced */ +#ifdef GL_EXT_draw_range_elements + CONST_CAST(GLEW_EXT_draw_range_elements) = glewGetExtension("GL_EXT_draw_range_elements"); + if (glewExperimental || GLEW_EXT_draw_range_elements) CONST_CAST(GLEW_EXT_draw_range_elements) = !_glewInit_GL_EXT_draw_range_elements(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_draw_range_elements */ +#ifdef GL_EXT_fog_coord + CONST_CAST(GLEW_EXT_fog_coord) = glewGetExtension("GL_EXT_fog_coord"); + if (glewExperimental || GLEW_EXT_fog_coord) CONST_CAST(GLEW_EXT_fog_coord) = !_glewInit_GL_EXT_fog_coord(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_fog_coord */ +#ifdef GL_EXT_fragment_lighting + CONST_CAST(GLEW_EXT_fragment_lighting) = glewGetExtension("GL_EXT_fragment_lighting"); + if (glewExperimental || GLEW_EXT_fragment_lighting) CONST_CAST(GLEW_EXT_fragment_lighting) = !_glewInit_GL_EXT_fragment_lighting(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_fragment_lighting */ +#ifdef GL_EXT_framebuffer_blit + CONST_CAST(GLEW_EXT_framebuffer_blit) = glewGetExtension("GL_EXT_framebuffer_blit"); + if (glewExperimental || GLEW_EXT_framebuffer_blit) CONST_CAST(GLEW_EXT_framebuffer_blit) = !_glewInit_GL_EXT_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_framebuffer_blit */ +#ifdef GL_EXT_framebuffer_multisample + CONST_CAST(GLEW_EXT_framebuffer_multisample) = glewGetExtension("GL_EXT_framebuffer_multisample"); + if (glewExperimental || GLEW_EXT_framebuffer_multisample) CONST_CAST(GLEW_EXT_framebuffer_multisample) = !_glewInit_GL_EXT_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_framebuffer_multisample */ +#ifdef GL_EXT_framebuffer_object + CONST_CAST(GLEW_EXT_framebuffer_object) = glewGetExtension("GL_EXT_framebuffer_object"); + if (glewExperimental || GLEW_EXT_framebuffer_object) CONST_CAST(GLEW_EXT_framebuffer_object) = !_glewInit_GL_EXT_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_framebuffer_object */ +#ifdef GL_EXT_framebuffer_sRGB + CONST_CAST(GLEW_EXT_framebuffer_sRGB) = glewGetExtension("GL_EXT_framebuffer_sRGB"); +#endif /* GL_EXT_framebuffer_sRGB */ +#ifdef GL_EXT_geometry_shader4 + CONST_CAST(GLEW_EXT_geometry_shader4) = glewGetExtension("GL_EXT_geometry_shader4"); + if (glewExperimental || GLEW_EXT_geometry_shader4) CONST_CAST(GLEW_EXT_geometry_shader4) = !_glewInit_GL_EXT_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_geometry_shader4 */ +#ifdef GL_EXT_gpu_program_parameters + CONST_CAST(GLEW_EXT_gpu_program_parameters) = glewGetExtension("GL_EXT_gpu_program_parameters"); + if (glewExperimental || GLEW_EXT_gpu_program_parameters) CONST_CAST(GLEW_EXT_gpu_program_parameters) = !_glewInit_GL_EXT_gpu_program_parameters(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_gpu_program_parameters */ +#ifdef GL_EXT_gpu_shader4 + CONST_CAST(GLEW_EXT_gpu_shader4) = glewGetExtension("GL_EXT_gpu_shader4"); + if (glewExperimental || GLEW_EXT_gpu_shader4) CONST_CAST(GLEW_EXT_gpu_shader4) = !_glewInit_GL_EXT_gpu_shader4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_gpu_shader4 */ +#ifdef GL_EXT_histogram + CONST_CAST(GLEW_EXT_histogram) = glewGetExtension("GL_EXT_histogram"); + if (glewExperimental || GLEW_EXT_histogram) CONST_CAST(GLEW_EXT_histogram) = !_glewInit_GL_EXT_histogram(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_histogram */ +#ifdef GL_EXT_index_array_formats + CONST_CAST(GLEW_EXT_index_array_formats) = glewGetExtension("GL_EXT_index_array_formats"); +#endif /* GL_EXT_index_array_formats */ +#ifdef GL_EXT_index_func + CONST_CAST(GLEW_EXT_index_func) = glewGetExtension("GL_EXT_index_func"); + if (glewExperimental || GLEW_EXT_index_func) CONST_CAST(GLEW_EXT_index_func) = !_glewInit_GL_EXT_index_func(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_index_func */ +#ifdef GL_EXT_index_material + CONST_CAST(GLEW_EXT_index_material) = glewGetExtension("GL_EXT_index_material"); + if (glewExperimental || GLEW_EXT_index_material) CONST_CAST(GLEW_EXT_index_material) = !_glewInit_GL_EXT_index_material(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_index_material */ +#ifdef GL_EXT_index_texture + CONST_CAST(GLEW_EXT_index_texture) = glewGetExtension("GL_EXT_index_texture"); +#endif /* GL_EXT_index_texture */ +#ifdef GL_EXT_light_texture + CONST_CAST(GLEW_EXT_light_texture) = glewGetExtension("GL_EXT_light_texture"); + if (glewExperimental || GLEW_EXT_light_texture) CONST_CAST(GLEW_EXT_light_texture) = !_glewInit_GL_EXT_light_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_light_texture */ +#ifdef GL_EXT_misc_attribute + CONST_CAST(GLEW_EXT_misc_attribute) = glewGetExtension("GL_EXT_misc_attribute"); +#endif /* GL_EXT_misc_attribute */ +#ifdef GL_EXT_multi_draw_arrays + CONST_CAST(GLEW_EXT_multi_draw_arrays) = glewGetExtension("GL_EXT_multi_draw_arrays"); + if (glewExperimental || GLEW_EXT_multi_draw_arrays) CONST_CAST(GLEW_EXT_multi_draw_arrays) = !_glewInit_GL_EXT_multi_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_multi_draw_arrays */ +#ifdef GL_EXT_multisample + CONST_CAST(GLEW_EXT_multisample) = glewGetExtension("GL_EXT_multisample"); + if (glewExperimental || GLEW_EXT_multisample) CONST_CAST(GLEW_EXT_multisample) = !_glewInit_GL_EXT_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_multisample */ +#ifdef GL_EXT_packed_depth_stencil + CONST_CAST(GLEW_EXT_packed_depth_stencil) = glewGetExtension("GL_EXT_packed_depth_stencil"); +#endif /* GL_EXT_packed_depth_stencil */ +#ifdef GL_EXT_packed_float + CONST_CAST(GLEW_EXT_packed_float) = glewGetExtension("GL_EXT_packed_float"); +#endif /* GL_EXT_packed_float */ +#ifdef GL_EXT_packed_pixels + CONST_CAST(GLEW_EXT_packed_pixels) = glewGetExtension("GL_EXT_packed_pixels"); +#endif /* GL_EXT_packed_pixels */ +#ifdef GL_EXT_paletted_texture + CONST_CAST(GLEW_EXT_paletted_texture) = glewGetExtension("GL_EXT_paletted_texture"); + if (glewExperimental || GLEW_EXT_paletted_texture) CONST_CAST(GLEW_EXT_paletted_texture) = !_glewInit_GL_EXT_paletted_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_paletted_texture */ +#ifdef GL_EXT_pixel_buffer_object + CONST_CAST(GLEW_EXT_pixel_buffer_object) = glewGetExtension("GL_EXT_pixel_buffer_object"); +#endif /* GL_EXT_pixel_buffer_object */ +#ifdef GL_EXT_pixel_transform + CONST_CAST(GLEW_EXT_pixel_transform) = glewGetExtension("GL_EXT_pixel_transform"); + if (glewExperimental || GLEW_EXT_pixel_transform) CONST_CAST(GLEW_EXT_pixel_transform) = !_glewInit_GL_EXT_pixel_transform(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_pixel_transform */ +#ifdef GL_EXT_pixel_transform_color_table + CONST_CAST(GLEW_EXT_pixel_transform_color_table) = glewGetExtension("GL_EXT_pixel_transform_color_table"); +#endif /* GL_EXT_pixel_transform_color_table */ +#ifdef GL_EXT_point_parameters + CONST_CAST(GLEW_EXT_point_parameters) = glewGetExtension("GL_EXT_point_parameters"); + if (glewExperimental || GLEW_EXT_point_parameters) CONST_CAST(GLEW_EXT_point_parameters) = !_glewInit_GL_EXT_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_point_parameters */ +#ifdef GL_EXT_polygon_offset + CONST_CAST(GLEW_EXT_polygon_offset) = glewGetExtension("GL_EXT_polygon_offset"); + if (glewExperimental || GLEW_EXT_polygon_offset) CONST_CAST(GLEW_EXT_polygon_offset) = !_glewInit_GL_EXT_polygon_offset(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_polygon_offset */ +#ifdef GL_EXT_rescale_normal + CONST_CAST(GLEW_EXT_rescale_normal) = glewGetExtension("GL_EXT_rescale_normal"); +#endif /* GL_EXT_rescale_normal */ +#ifdef GL_EXT_scene_marker + CONST_CAST(GLEW_EXT_scene_marker) = glewGetExtension("GL_EXT_scene_marker"); + if (glewExperimental || GLEW_EXT_scene_marker) CONST_CAST(GLEW_EXT_scene_marker) = !_glewInit_GL_EXT_scene_marker(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_scene_marker */ +#ifdef GL_EXT_secondary_color + CONST_CAST(GLEW_EXT_secondary_color) = glewGetExtension("GL_EXT_secondary_color"); + if (glewExperimental || GLEW_EXT_secondary_color) CONST_CAST(GLEW_EXT_secondary_color) = !_glewInit_GL_EXT_secondary_color(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_secondary_color */ +#ifdef GL_EXT_separate_specular_color + CONST_CAST(GLEW_EXT_separate_specular_color) = glewGetExtension("GL_EXT_separate_specular_color"); +#endif /* GL_EXT_separate_specular_color */ +#ifdef GL_EXT_shadow_funcs + CONST_CAST(GLEW_EXT_shadow_funcs) = glewGetExtension("GL_EXT_shadow_funcs"); +#endif /* GL_EXT_shadow_funcs */ +#ifdef GL_EXT_shared_texture_palette + CONST_CAST(GLEW_EXT_shared_texture_palette) = glewGetExtension("GL_EXT_shared_texture_palette"); +#endif /* GL_EXT_shared_texture_palette */ +#ifdef GL_EXT_stencil_clear_tag + CONST_CAST(GLEW_EXT_stencil_clear_tag) = glewGetExtension("GL_EXT_stencil_clear_tag"); +#endif /* GL_EXT_stencil_clear_tag */ +#ifdef GL_EXT_stencil_two_side + CONST_CAST(GLEW_EXT_stencil_two_side) = glewGetExtension("GL_EXT_stencil_two_side"); + if (glewExperimental || GLEW_EXT_stencil_two_side) CONST_CAST(GLEW_EXT_stencil_two_side) = !_glewInit_GL_EXT_stencil_two_side(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_stencil_two_side */ +#ifdef GL_EXT_stencil_wrap + CONST_CAST(GLEW_EXT_stencil_wrap) = glewGetExtension("GL_EXT_stencil_wrap"); +#endif /* GL_EXT_stencil_wrap */ +#ifdef GL_EXT_subtexture + CONST_CAST(GLEW_EXT_subtexture) = glewGetExtension("GL_EXT_subtexture"); + if (glewExperimental || GLEW_EXT_subtexture) CONST_CAST(GLEW_EXT_subtexture) = !_glewInit_GL_EXT_subtexture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_subtexture */ +#ifdef GL_EXT_texture + CONST_CAST(GLEW_EXT_texture) = glewGetExtension("GL_EXT_texture"); +#endif /* GL_EXT_texture */ +#ifdef GL_EXT_texture3D + CONST_CAST(GLEW_EXT_texture3D) = glewGetExtension("GL_EXT_texture3D"); + if (glewExperimental || GLEW_EXT_texture3D) CONST_CAST(GLEW_EXT_texture3D) = !_glewInit_GL_EXT_texture3D(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture3D */ +#ifdef GL_EXT_texture_array + CONST_CAST(GLEW_EXT_texture_array) = glewGetExtension("GL_EXT_texture_array"); +#endif /* GL_EXT_texture_array */ +#ifdef GL_EXT_texture_buffer_object + CONST_CAST(GLEW_EXT_texture_buffer_object) = glewGetExtension("GL_EXT_texture_buffer_object"); + if (glewExperimental || GLEW_EXT_texture_buffer_object) CONST_CAST(GLEW_EXT_texture_buffer_object) = !_glewInit_GL_EXT_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture_buffer_object */ +#ifdef GL_EXT_texture_compression_dxt1 + CONST_CAST(GLEW_EXT_texture_compression_dxt1) = glewGetExtension("GL_EXT_texture_compression_dxt1"); +#endif /* GL_EXT_texture_compression_dxt1 */ +#ifdef GL_EXT_texture_compression_latc + CONST_CAST(GLEW_EXT_texture_compression_latc) = glewGetExtension("GL_EXT_texture_compression_latc"); +#endif /* GL_EXT_texture_compression_latc */ +#ifdef GL_EXT_texture_compression_rgtc + CONST_CAST(GLEW_EXT_texture_compression_rgtc) = glewGetExtension("GL_EXT_texture_compression_rgtc"); +#endif /* GL_EXT_texture_compression_rgtc */ +#ifdef GL_EXT_texture_compression_s3tc + CONST_CAST(GLEW_EXT_texture_compression_s3tc) = glewGetExtension("GL_EXT_texture_compression_s3tc"); +#endif /* GL_EXT_texture_compression_s3tc */ +#ifdef GL_EXT_texture_cube_map + CONST_CAST(GLEW_EXT_texture_cube_map) = glewGetExtension("GL_EXT_texture_cube_map"); +#endif /* GL_EXT_texture_cube_map */ +#ifdef GL_EXT_texture_edge_clamp + CONST_CAST(GLEW_EXT_texture_edge_clamp) = glewGetExtension("GL_EXT_texture_edge_clamp"); +#endif /* GL_EXT_texture_edge_clamp */ +#ifdef GL_EXT_texture_env + CONST_CAST(GLEW_EXT_texture_env) = glewGetExtension("GL_EXT_texture_env"); +#endif /* GL_EXT_texture_env */ +#ifdef GL_EXT_texture_env_add + CONST_CAST(GLEW_EXT_texture_env_add) = glewGetExtension("GL_EXT_texture_env_add"); +#endif /* GL_EXT_texture_env_add */ +#ifdef GL_EXT_texture_env_combine + CONST_CAST(GLEW_EXT_texture_env_combine) = glewGetExtension("GL_EXT_texture_env_combine"); +#endif /* GL_EXT_texture_env_combine */ +#ifdef GL_EXT_texture_env_dot3 + CONST_CAST(GLEW_EXT_texture_env_dot3) = glewGetExtension("GL_EXT_texture_env_dot3"); +#endif /* GL_EXT_texture_env_dot3 */ +#ifdef GL_EXT_texture_filter_anisotropic + CONST_CAST(GLEW_EXT_texture_filter_anisotropic) = glewGetExtension("GL_EXT_texture_filter_anisotropic"); +#endif /* GL_EXT_texture_filter_anisotropic */ +#ifdef GL_EXT_texture_integer + CONST_CAST(GLEW_EXT_texture_integer) = glewGetExtension("GL_EXT_texture_integer"); + if (glewExperimental || GLEW_EXT_texture_integer) CONST_CAST(GLEW_EXT_texture_integer) = !_glewInit_GL_EXT_texture_integer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture_integer */ +#ifdef GL_EXT_texture_lod_bias + CONST_CAST(GLEW_EXT_texture_lod_bias) = glewGetExtension("GL_EXT_texture_lod_bias"); +#endif /* GL_EXT_texture_lod_bias */ +#ifdef GL_EXT_texture_mirror_clamp + CONST_CAST(GLEW_EXT_texture_mirror_clamp) = glewGetExtension("GL_EXT_texture_mirror_clamp"); +#endif /* GL_EXT_texture_mirror_clamp */ +#ifdef GL_EXT_texture_object + CONST_CAST(GLEW_EXT_texture_object) = glewGetExtension("GL_EXT_texture_object"); + if (glewExperimental || GLEW_EXT_texture_object) CONST_CAST(GLEW_EXT_texture_object) = !_glewInit_GL_EXT_texture_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture_object */ +#ifdef GL_EXT_texture_perturb_normal + CONST_CAST(GLEW_EXT_texture_perturb_normal) = glewGetExtension("GL_EXT_texture_perturb_normal"); + if (glewExperimental || GLEW_EXT_texture_perturb_normal) CONST_CAST(GLEW_EXT_texture_perturb_normal) = !_glewInit_GL_EXT_texture_perturb_normal(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture_perturb_normal */ +#ifdef GL_EXT_texture_rectangle + CONST_CAST(GLEW_EXT_texture_rectangle) = glewGetExtension("GL_EXT_texture_rectangle"); +#endif /* GL_EXT_texture_rectangle */ +#ifdef GL_EXT_texture_sRGB + CONST_CAST(GLEW_EXT_texture_sRGB) = glewGetExtension("GL_EXT_texture_sRGB"); +#endif /* GL_EXT_texture_sRGB */ +#ifdef GL_EXT_texture_shared_exponent + CONST_CAST(GLEW_EXT_texture_shared_exponent) = glewGetExtension("GL_EXT_texture_shared_exponent"); +#endif /* GL_EXT_texture_shared_exponent */ +#ifdef GL_EXT_timer_query + CONST_CAST(GLEW_EXT_timer_query) = glewGetExtension("GL_EXT_timer_query"); + if (glewExperimental || GLEW_EXT_timer_query) CONST_CAST(GLEW_EXT_timer_query) = !_glewInit_GL_EXT_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_timer_query */ +#ifdef GL_EXT_vertex_array + CONST_CAST(GLEW_EXT_vertex_array) = glewGetExtension("GL_EXT_vertex_array"); + if (glewExperimental || GLEW_EXT_vertex_array) CONST_CAST(GLEW_EXT_vertex_array) = !_glewInit_GL_EXT_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_vertex_array */ +#ifdef GL_EXT_vertex_shader + CONST_CAST(GLEW_EXT_vertex_shader) = glewGetExtension("GL_EXT_vertex_shader"); + if (glewExperimental || GLEW_EXT_vertex_shader) CONST_CAST(GLEW_EXT_vertex_shader) = !_glewInit_GL_EXT_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_vertex_shader */ +#ifdef GL_EXT_vertex_weighting + CONST_CAST(GLEW_EXT_vertex_weighting) = glewGetExtension("GL_EXT_vertex_weighting"); + if (glewExperimental || GLEW_EXT_vertex_weighting) CONST_CAST(GLEW_EXT_vertex_weighting) = !_glewInit_GL_EXT_vertex_weighting(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_vertex_weighting */ +#ifdef GL_GREMEDY_frame_terminator + CONST_CAST(GLEW_GREMEDY_frame_terminator) = glewGetExtension("GL_GREMEDY_frame_terminator"); + if (glewExperimental || GLEW_GREMEDY_frame_terminator) CONST_CAST(GLEW_GREMEDY_frame_terminator) = !_glewInit_GL_GREMEDY_frame_terminator(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_GREMEDY_frame_terminator */ +#ifdef GL_GREMEDY_string_marker + CONST_CAST(GLEW_GREMEDY_string_marker) = glewGetExtension("GL_GREMEDY_string_marker"); + if (glewExperimental || GLEW_GREMEDY_string_marker) CONST_CAST(GLEW_GREMEDY_string_marker) = !_glewInit_GL_GREMEDY_string_marker(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_GREMEDY_string_marker */ +#ifdef GL_HP_convolution_border_modes + CONST_CAST(GLEW_HP_convolution_border_modes) = glewGetExtension("GL_HP_convolution_border_modes"); +#endif /* GL_HP_convolution_border_modes */ +#ifdef GL_HP_image_transform + CONST_CAST(GLEW_HP_image_transform) = glewGetExtension("GL_HP_image_transform"); + if (glewExperimental || GLEW_HP_image_transform) CONST_CAST(GLEW_HP_image_transform) = !_glewInit_GL_HP_image_transform(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_HP_image_transform */ +#ifdef GL_HP_occlusion_test + CONST_CAST(GLEW_HP_occlusion_test) = glewGetExtension("GL_HP_occlusion_test"); +#endif /* GL_HP_occlusion_test */ +#ifdef GL_HP_texture_lighting + CONST_CAST(GLEW_HP_texture_lighting) = glewGetExtension("GL_HP_texture_lighting"); +#endif /* GL_HP_texture_lighting */ +#ifdef GL_IBM_cull_vertex + CONST_CAST(GLEW_IBM_cull_vertex) = glewGetExtension("GL_IBM_cull_vertex"); +#endif /* GL_IBM_cull_vertex */ +#ifdef GL_IBM_multimode_draw_arrays + CONST_CAST(GLEW_IBM_multimode_draw_arrays) = glewGetExtension("GL_IBM_multimode_draw_arrays"); + if (glewExperimental || GLEW_IBM_multimode_draw_arrays) CONST_CAST(GLEW_IBM_multimode_draw_arrays) = !_glewInit_GL_IBM_multimode_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_IBM_multimode_draw_arrays */ +#ifdef GL_IBM_rasterpos_clip + CONST_CAST(GLEW_IBM_rasterpos_clip) = glewGetExtension("GL_IBM_rasterpos_clip"); +#endif /* GL_IBM_rasterpos_clip */ +#ifdef GL_IBM_static_data + CONST_CAST(GLEW_IBM_static_data) = glewGetExtension("GL_IBM_static_data"); +#endif /* GL_IBM_static_data */ +#ifdef GL_IBM_texture_mirrored_repeat + CONST_CAST(GLEW_IBM_texture_mirrored_repeat) = glewGetExtension("GL_IBM_texture_mirrored_repeat"); +#endif /* GL_IBM_texture_mirrored_repeat */ +#ifdef GL_IBM_vertex_array_lists + CONST_CAST(GLEW_IBM_vertex_array_lists) = glewGetExtension("GL_IBM_vertex_array_lists"); + if (glewExperimental || GLEW_IBM_vertex_array_lists) CONST_CAST(GLEW_IBM_vertex_array_lists) = !_glewInit_GL_IBM_vertex_array_lists(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_IBM_vertex_array_lists */ +#ifdef GL_INGR_color_clamp + CONST_CAST(GLEW_INGR_color_clamp) = glewGetExtension("GL_INGR_color_clamp"); +#endif /* GL_INGR_color_clamp */ +#ifdef GL_INGR_interlace_read + CONST_CAST(GLEW_INGR_interlace_read) = glewGetExtension("GL_INGR_interlace_read"); +#endif /* GL_INGR_interlace_read */ +#ifdef GL_INTEL_parallel_arrays + CONST_CAST(GLEW_INTEL_parallel_arrays) = glewGetExtension("GL_INTEL_parallel_arrays"); + if (glewExperimental || GLEW_INTEL_parallel_arrays) CONST_CAST(GLEW_INTEL_parallel_arrays) = !_glewInit_GL_INTEL_parallel_arrays(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_INTEL_parallel_arrays */ +#ifdef GL_INTEL_texture_scissor + CONST_CAST(GLEW_INTEL_texture_scissor) = glewGetExtension("GL_INTEL_texture_scissor"); + if (glewExperimental || GLEW_INTEL_texture_scissor) CONST_CAST(GLEW_INTEL_texture_scissor) = !_glewInit_GL_INTEL_texture_scissor(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_INTEL_texture_scissor */ +#ifdef GL_KTX_buffer_region + CONST_CAST(GLEW_KTX_buffer_region) = glewGetExtension("GL_KTX_buffer_region"); + if (glewExperimental || GLEW_KTX_buffer_region) CONST_CAST(GLEW_KTX_buffer_region) = !_glewInit_GL_KTX_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_KTX_buffer_region */ +#ifdef GL_MESAX_texture_stack + CONST_CAST(GLEW_MESAX_texture_stack) = glewGetExtension("GL_MESAX_texture_stack"); +#endif /* GL_MESAX_texture_stack */ +#ifdef GL_MESA_pack_invert + CONST_CAST(GLEW_MESA_pack_invert) = glewGetExtension("GL_MESA_pack_invert"); +#endif /* GL_MESA_pack_invert */ +#ifdef GL_MESA_resize_buffers + CONST_CAST(GLEW_MESA_resize_buffers) = glewGetExtension("GL_MESA_resize_buffers"); + if (glewExperimental || GLEW_MESA_resize_buffers) CONST_CAST(GLEW_MESA_resize_buffers) = !_glewInit_GL_MESA_resize_buffers(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_MESA_resize_buffers */ +#ifdef GL_MESA_window_pos + CONST_CAST(GLEW_MESA_window_pos) = glewGetExtension("GL_MESA_window_pos"); + if (glewExperimental || GLEW_MESA_window_pos) CONST_CAST(GLEW_MESA_window_pos) = !_glewInit_GL_MESA_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_MESA_window_pos */ +#ifdef GL_MESA_ycbcr_texture + CONST_CAST(GLEW_MESA_ycbcr_texture) = glewGetExtension("GL_MESA_ycbcr_texture"); +#endif /* GL_MESA_ycbcr_texture */ +#ifdef GL_NV_blend_square + CONST_CAST(GLEW_NV_blend_square) = glewGetExtension("GL_NV_blend_square"); +#endif /* GL_NV_blend_square */ +#ifdef GL_NV_copy_depth_to_color + CONST_CAST(GLEW_NV_copy_depth_to_color) = glewGetExtension("GL_NV_copy_depth_to_color"); +#endif /* GL_NV_copy_depth_to_color */ +#ifdef GL_NV_depth_buffer_float + CONST_CAST(GLEW_NV_depth_buffer_float) = glewGetExtension("GL_NV_depth_buffer_float"); + if (glewExperimental || GLEW_NV_depth_buffer_float) CONST_CAST(GLEW_NV_depth_buffer_float) = !_glewInit_GL_NV_depth_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_depth_buffer_float */ +#ifdef GL_NV_depth_clamp + CONST_CAST(GLEW_NV_depth_clamp) = glewGetExtension("GL_NV_depth_clamp"); +#endif /* GL_NV_depth_clamp */ +#ifdef GL_NV_depth_range_unclamped + CONST_CAST(GLEW_NV_depth_range_unclamped) = glewGetExtension("GL_NV_depth_range_unclamped"); +#endif /* GL_NV_depth_range_unclamped */ +#ifdef GL_NV_evaluators + CONST_CAST(GLEW_NV_evaluators) = glewGetExtension("GL_NV_evaluators"); + if (glewExperimental || GLEW_NV_evaluators) CONST_CAST(GLEW_NV_evaluators) = !_glewInit_GL_NV_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_evaluators */ +#ifdef GL_NV_fence + CONST_CAST(GLEW_NV_fence) = glewGetExtension("GL_NV_fence"); + if (glewExperimental || GLEW_NV_fence) CONST_CAST(GLEW_NV_fence) = !_glewInit_GL_NV_fence(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_fence */ +#ifdef GL_NV_float_buffer + CONST_CAST(GLEW_NV_float_buffer) = glewGetExtension("GL_NV_float_buffer"); +#endif /* GL_NV_float_buffer */ +#ifdef GL_NV_fog_distance + CONST_CAST(GLEW_NV_fog_distance) = glewGetExtension("GL_NV_fog_distance"); +#endif /* GL_NV_fog_distance */ +#ifdef GL_NV_fragment_program + CONST_CAST(GLEW_NV_fragment_program) = glewGetExtension("GL_NV_fragment_program"); + if (glewExperimental || GLEW_NV_fragment_program) CONST_CAST(GLEW_NV_fragment_program) = !_glewInit_GL_NV_fragment_program(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_fragment_program */ +#ifdef GL_NV_fragment_program2 + CONST_CAST(GLEW_NV_fragment_program2) = glewGetExtension("GL_NV_fragment_program2"); +#endif /* GL_NV_fragment_program2 */ +#ifdef GL_NV_fragment_program4 + CONST_CAST(GLEW_NV_fragment_program4) = glewGetExtension("GL_NV_fragment_program4"); +#endif /* GL_NV_fragment_program4 */ +#ifdef GL_NV_fragment_program_option + CONST_CAST(GLEW_NV_fragment_program_option) = glewGetExtension("GL_NV_fragment_program_option"); +#endif /* GL_NV_fragment_program_option */ +#ifdef GL_NV_framebuffer_multisample_coverage + CONST_CAST(GLEW_NV_framebuffer_multisample_coverage) = glewGetExtension("GL_NV_framebuffer_multisample_coverage"); + if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) CONST_CAST(GLEW_NV_framebuffer_multisample_coverage) = !_glewInit_GL_NV_framebuffer_multisample_coverage(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_framebuffer_multisample_coverage */ +#ifdef GL_NV_geometry_program4 + CONST_CAST(GLEW_NV_geometry_program4) = glewGetExtension("GL_NV_geometry_program4"); + if (glewExperimental || GLEW_NV_geometry_program4) CONST_CAST(GLEW_NV_geometry_program4) = !_glewInit_GL_NV_geometry_program4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_geometry_program4 */ +#ifdef GL_NV_geometry_shader4 + CONST_CAST(GLEW_NV_geometry_shader4) = glewGetExtension("GL_NV_geometry_shader4"); +#endif /* GL_NV_geometry_shader4 */ +#ifdef GL_NV_gpu_program4 + CONST_CAST(GLEW_NV_gpu_program4) = glewGetExtension("GL_NV_gpu_program4"); + if (glewExperimental || GLEW_NV_gpu_program4) CONST_CAST(GLEW_NV_gpu_program4) = !_glewInit_GL_NV_gpu_program4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_gpu_program4 */ +#ifdef GL_NV_half_float + CONST_CAST(GLEW_NV_half_float) = glewGetExtension("GL_NV_half_float"); + if (glewExperimental || GLEW_NV_half_float) CONST_CAST(GLEW_NV_half_float) = !_glewInit_GL_NV_half_float(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_half_float */ +#ifdef GL_NV_light_max_exponent + CONST_CAST(GLEW_NV_light_max_exponent) = glewGetExtension("GL_NV_light_max_exponent"); +#endif /* GL_NV_light_max_exponent */ +#ifdef GL_NV_multisample_filter_hint + CONST_CAST(GLEW_NV_multisample_filter_hint) = glewGetExtension("GL_NV_multisample_filter_hint"); +#endif /* GL_NV_multisample_filter_hint */ +#ifdef GL_NV_occlusion_query + CONST_CAST(GLEW_NV_occlusion_query) = glewGetExtension("GL_NV_occlusion_query"); + if (glewExperimental || GLEW_NV_occlusion_query) CONST_CAST(GLEW_NV_occlusion_query) = !_glewInit_GL_NV_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_occlusion_query */ +#ifdef GL_NV_packed_depth_stencil + CONST_CAST(GLEW_NV_packed_depth_stencil) = glewGetExtension("GL_NV_packed_depth_stencil"); +#endif /* GL_NV_packed_depth_stencil */ +#ifdef GL_NV_parameter_buffer_object + CONST_CAST(GLEW_NV_parameter_buffer_object) = glewGetExtension("GL_NV_parameter_buffer_object"); + if (glewExperimental || GLEW_NV_parameter_buffer_object) CONST_CAST(GLEW_NV_parameter_buffer_object) = !_glewInit_GL_NV_parameter_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_parameter_buffer_object */ +#ifdef GL_NV_pixel_data_range + CONST_CAST(GLEW_NV_pixel_data_range) = glewGetExtension("GL_NV_pixel_data_range"); + if (glewExperimental || GLEW_NV_pixel_data_range) CONST_CAST(GLEW_NV_pixel_data_range) = !_glewInit_GL_NV_pixel_data_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_pixel_data_range */ +#ifdef GL_NV_point_sprite + CONST_CAST(GLEW_NV_point_sprite) = glewGetExtension("GL_NV_point_sprite"); + if (glewExperimental || GLEW_NV_point_sprite) CONST_CAST(GLEW_NV_point_sprite) = !_glewInit_GL_NV_point_sprite(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_point_sprite */ +#ifdef GL_NV_primitive_restart + CONST_CAST(GLEW_NV_primitive_restart) = glewGetExtension("GL_NV_primitive_restart"); + if (glewExperimental || GLEW_NV_primitive_restart) CONST_CAST(GLEW_NV_primitive_restart) = !_glewInit_GL_NV_primitive_restart(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_primitive_restart */ +#ifdef GL_NV_register_combiners + CONST_CAST(GLEW_NV_register_combiners) = glewGetExtension("GL_NV_register_combiners"); + if (glewExperimental || GLEW_NV_register_combiners) CONST_CAST(GLEW_NV_register_combiners) = !_glewInit_GL_NV_register_combiners(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_register_combiners */ +#ifdef GL_NV_register_combiners2 + CONST_CAST(GLEW_NV_register_combiners2) = glewGetExtension("GL_NV_register_combiners2"); + if (glewExperimental || GLEW_NV_register_combiners2) CONST_CAST(GLEW_NV_register_combiners2) = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_register_combiners2 */ +#ifdef GL_NV_texgen_emboss + CONST_CAST(GLEW_NV_texgen_emboss) = glewGetExtension("GL_NV_texgen_emboss"); +#endif /* GL_NV_texgen_emboss */ +#ifdef GL_NV_texgen_reflection + CONST_CAST(GLEW_NV_texgen_reflection) = glewGetExtension("GL_NV_texgen_reflection"); +#endif /* GL_NV_texgen_reflection */ +#ifdef GL_NV_texture_compression_vtc + CONST_CAST(GLEW_NV_texture_compression_vtc) = glewGetExtension("GL_NV_texture_compression_vtc"); +#endif /* GL_NV_texture_compression_vtc */ +#ifdef GL_NV_texture_env_combine4 + CONST_CAST(GLEW_NV_texture_env_combine4) = glewGetExtension("GL_NV_texture_env_combine4"); +#endif /* GL_NV_texture_env_combine4 */ +#ifdef GL_NV_texture_expand_normal + CONST_CAST(GLEW_NV_texture_expand_normal) = glewGetExtension("GL_NV_texture_expand_normal"); +#endif /* GL_NV_texture_expand_normal */ +#ifdef GL_NV_texture_rectangle + CONST_CAST(GLEW_NV_texture_rectangle) = glewGetExtension("GL_NV_texture_rectangle"); +#endif /* GL_NV_texture_rectangle */ +#ifdef GL_NV_texture_shader + CONST_CAST(GLEW_NV_texture_shader) = glewGetExtension("GL_NV_texture_shader"); +#endif /* GL_NV_texture_shader */ +#ifdef GL_NV_texture_shader2 + CONST_CAST(GLEW_NV_texture_shader2) = glewGetExtension("GL_NV_texture_shader2"); +#endif /* GL_NV_texture_shader2 */ +#ifdef GL_NV_texture_shader3 + CONST_CAST(GLEW_NV_texture_shader3) = glewGetExtension("GL_NV_texture_shader3"); +#endif /* GL_NV_texture_shader3 */ +#ifdef GL_NV_transform_feedback + CONST_CAST(GLEW_NV_transform_feedback) = glewGetExtension("GL_NV_transform_feedback"); + if (glewExperimental || GLEW_NV_transform_feedback) CONST_CAST(GLEW_NV_transform_feedback) = !_glewInit_GL_NV_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_transform_feedback */ +#ifdef GL_NV_vertex_array_range + CONST_CAST(GLEW_NV_vertex_array_range) = glewGetExtension("GL_NV_vertex_array_range"); + if (glewExperimental || GLEW_NV_vertex_array_range) CONST_CAST(GLEW_NV_vertex_array_range) = !_glewInit_GL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_vertex_array_range */ +#ifdef GL_NV_vertex_array_range2 + CONST_CAST(GLEW_NV_vertex_array_range2) = glewGetExtension("GL_NV_vertex_array_range2"); +#endif /* GL_NV_vertex_array_range2 */ +#ifdef GL_NV_vertex_program + CONST_CAST(GLEW_NV_vertex_program) = glewGetExtension("GL_NV_vertex_program"); + if (glewExperimental || GLEW_NV_vertex_program) CONST_CAST(GLEW_NV_vertex_program) = !_glewInit_GL_NV_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_vertex_program */ +#ifdef GL_NV_vertex_program1_1 + CONST_CAST(GLEW_NV_vertex_program1_1) = glewGetExtension("GL_NV_vertex_program1_1"); +#endif /* GL_NV_vertex_program1_1 */ +#ifdef GL_NV_vertex_program2 + CONST_CAST(GLEW_NV_vertex_program2) = glewGetExtension("GL_NV_vertex_program2"); +#endif /* GL_NV_vertex_program2 */ +#ifdef GL_NV_vertex_program2_option + CONST_CAST(GLEW_NV_vertex_program2_option) = glewGetExtension("GL_NV_vertex_program2_option"); +#endif /* GL_NV_vertex_program2_option */ +#ifdef GL_NV_vertex_program3 + CONST_CAST(GLEW_NV_vertex_program3) = glewGetExtension("GL_NV_vertex_program3"); +#endif /* GL_NV_vertex_program3 */ +#ifdef GL_NV_vertex_program4 + CONST_CAST(GLEW_NV_vertex_program4) = glewGetExtension("GL_NV_vertex_program4"); +#endif /* GL_NV_vertex_program4 */ +#ifdef GL_OES_byte_coordinates + CONST_CAST(GLEW_OES_byte_coordinates) = glewGetExtension("GL_OES_byte_coordinates"); +#endif /* GL_OES_byte_coordinates */ +#ifdef GL_OES_compressed_paletted_texture + CONST_CAST(GLEW_OES_compressed_paletted_texture) = glewGetExtension("GL_OES_compressed_paletted_texture"); +#endif /* GL_OES_compressed_paletted_texture */ +#ifdef GL_OES_read_format + CONST_CAST(GLEW_OES_read_format) = glewGetExtension("GL_OES_read_format"); +#endif /* GL_OES_read_format */ +#ifdef GL_OES_single_precision + CONST_CAST(GLEW_OES_single_precision) = glewGetExtension("GL_OES_single_precision"); + if (glewExperimental || GLEW_OES_single_precision) CONST_CAST(GLEW_OES_single_precision) = !_glewInit_GL_OES_single_precision(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_OES_single_precision */ +#ifdef GL_OML_interlace + CONST_CAST(GLEW_OML_interlace) = glewGetExtension("GL_OML_interlace"); +#endif /* GL_OML_interlace */ +#ifdef GL_OML_resample + CONST_CAST(GLEW_OML_resample) = glewGetExtension("GL_OML_resample"); +#endif /* GL_OML_resample */ +#ifdef GL_OML_subsample + CONST_CAST(GLEW_OML_subsample) = glewGetExtension("GL_OML_subsample"); +#endif /* GL_OML_subsample */ +#ifdef GL_PGI_misc_hints + CONST_CAST(GLEW_PGI_misc_hints) = glewGetExtension("GL_PGI_misc_hints"); +#endif /* GL_PGI_misc_hints */ +#ifdef GL_PGI_vertex_hints + CONST_CAST(GLEW_PGI_vertex_hints) = glewGetExtension("GL_PGI_vertex_hints"); +#endif /* GL_PGI_vertex_hints */ +#ifdef GL_REND_screen_coordinates + CONST_CAST(GLEW_REND_screen_coordinates) = glewGetExtension("GL_REND_screen_coordinates"); +#endif /* GL_REND_screen_coordinates */ +#ifdef GL_S3_s3tc + CONST_CAST(GLEW_S3_s3tc) = glewGetExtension("GL_S3_s3tc"); +#endif /* GL_S3_s3tc */ +#ifdef GL_SGIS_color_range + CONST_CAST(GLEW_SGIS_color_range) = glewGetExtension("GL_SGIS_color_range"); +#endif /* GL_SGIS_color_range */ +#ifdef GL_SGIS_detail_texture + CONST_CAST(GLEW_SGIS_detail_texture) = glewGetExtension("GL_SGIS_detail_texture"); + if (glewExperimental || GLEW_SGIS_detail_texture) CONST_CAST(GLEW_SGIS_detail_texture) = !_glewInit_GL_SGIS_detail_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_detail_texture */ +#ifdef GL_SGIS_fog_function + CONST_CAST(GLEW_SGIS_fog_function) = glewGetExtension("GL_SGIS_fog_function"); + if (glewExperimental || GLEW_SGIS_fog_function) CONST_CAST(GLEW_SGIS_fog_function) = !_glewInit_GL_SGIS_fog_function(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_fog_function */ +#ifdef GL_SGIS_generate_mipmap + CONST_CAST(GLEW_SGIS_generate_mipmap) = glewGetExtension("GL_SGIS_generate_mipmap"); +#endif /* GL_SGIS_generate_mipmap */ +#ifdef GL_SGIS_multisample + CONST_CAST(GLEW_SGIS_multisample) = glewGetExtension("GL_SGIS_multisample"); + if (glewExperimental || GLEW_SGIS_multisample) CONST_CAST(GLEW_SGIS_multisample) = !_glewInit_GL_SGIS_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_multisample */ +#ifdef GL_SGIS_pixel_texture + CONST_CAST(GLEW_SGIS_pixel_texture) = glewGetExtension("GL_SGIS_pixel_texture"); +#endif /* GL_SGIS_pixel_texture */ +#ifdef GL_SGIS_sharpen_texture + CONST_CAST(GLEW_SGIS_sharpen_texture) = glewGetExtension("GL_SGIS_sharpen_texture"); + if (glewExperimental || GLEW_SGIS_sharpen_texture) CONST_CAST(GLEW_SGIS_sharpen_texture) = !_glewInit_GL_SGIS_sharpen_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_sharpen_texture */ +#ifdef GL_SGIS_texture4D + CONST_CAST(GLEW_SGIS_texture4D) = glewGetExtension("GL_SGIS_texture4D"); + if (glewExperimental || GLEW_SGIS_texture4D) CONST_CAST(GLEW_SGIS_texture4D) = !_glewInit_GL_SGIS_texture4D(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_texture4D */ +#ifdef GL_SGIS_texture_border_clamp + CONST_CAST(GLEW_SGIS_texture_border_clamp) = glewGetExtension("GL_SGIS_texture_border_clamp"); +#endif /* GL_SGIS_texture_border_clamp */ +#ifdef GL_SGIS_texture_edge_clamp + CONST_CAST(GLEW_SGIS_texture_edge_clamp) = glewGetExtension("GL_SGIS_texture_edge_clamp"); +#endif /* GL_SGIS_texture_edge_clamp */ +#ifdef GL_SGIS_texture_filter4 + CONST_CAST(GLEW_SGIS_texture_filter4) = glewGetExtension("GL_SGIS_texture_filter4"); + if (glewExperimental || GLEW_SGIS_texture_filter4) CONST_CAST(GLEW_SGIS_texture_filter4) = !_glewInit_GL_SGIS_texture_filter4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_texture_filter4 */ +#ifdef GL_SGIS_texture_lod + CONST_CAST(GLEW_SGIS_texture_lod) = glewGetExtension("GL_SGIS_texture_lod"); +#endif /* GL_SGIS_texture_lod */ +#ifdef GL_SGIS_texture_select + CONST_CAST(GLEW_SGIS_texture_select) = glewGetExtension("GL_SGIS_texture_select"); +#endif /* GL_SGIS_texture_select */ +#ifdef GL_SGIX_async + CONST_CAST(GLEW_SGIX_async) = glewGetExtension("GL_SGIX_async"); + if (glewExperimental || GLEW_SGIX_async) CONST_CAST(GLEW_SGIX_async) = !_glewInit_GL_SGIX_async(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_async */ +#ifdef GL_SGIX_async_histogram + CONST_CAST(GLEW_SGIX_async_histogram) = glewGetExtension("GL_SGIX_async_histogram"); +#endif /* GL_SGIX_async_histogram */ +#ifdef GL_SGIX_async_pixel + CONST_CAST(GLEW_SGIX_async_pixel) = glewGetExtension("GL_SGIX_async_pixel"); +#endif /* GL_SGIX_async_pixel */ +#ifdef GL_SGIX_blend_alpha_minmax + CONST_CAST(GLEW_SGIX_blend_alpha_minmax) = glewGetExtension("GL_SGIX_blend_alpha_minmax"); +#endif /* GL_SGIX_blend_alpha_minmax */ +#ifdef GL_SGIX_clipmap + CONST_CAST(GLEW_SGIX_clipmap) = glewGetExtension("GL_SGIX_clipmap"); +#endif /* GL_SGIX_clipmap */ +#ifdef GL_SGIX_depth_texture + CONST_CAST(GLEW_SGIX_depth_texture) = glewGetExtension("GL_SGIX_depth_texture"); +#endif /* GL_SGIX_depth_texture */ +#ifdef GL_SGIX_flush_raster + CONST_CAST(GLEW_SGIX_flush_raster) = glewGetExtension("GL_SGIX_flush_raster"); + if (glewExperimental || GLEW_SGIX_flush_raster) CONST_CAST(GLEW_SGIX_flush_raster) = !_glewInit_GL_SGIX_flush_raster(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_flush_raster */ +#ifdef GL_SGIX_fog_offset + CONST_CAST(GLEW_SGIX_fog_offset) = glewGetExtension("GL_SGIX_fog_offset"); +#endif /* GL_SGIX_fog_offset */ +#ifdef GL_SGIX_fog_texture + CONST_CAST(GLEW_SGIX_fog_texture) = glewGetExtension("GL_SGIX_fog_texture"); + if (glewExperimental || GLEW_SGIX_fog_texture) CONST_CAST(GLEW_SGIX_fog_texture) = !_glewInit_GL_SGIX_fog_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_fog_texture */ +#ifdef GL_SGIX_fragment_specular_lighting + CONST_CAST(GLEW_SGIX_fragment_specular_lighting) = glewGetExtension("GL_SGIX_fragment_specular_lighting"); + if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) CONST_CAST(GLEW_SGIX_fragment_specular_lighting) = !_glewInit_GL_SGIX_fragment_specular_lighting(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_fragment_specular_lighting */ +#ifdef GL_SGIX_framezoom + CONST_CAST(GLEW_SGIX_framezoom) = glewGetExtension("GL_SGIX_framezoom"); + if (glewExperimental || GLEW_SGIX_framezoom) CONST_CAST(GLEW_SGIX_framezoom) = !_glewInit_GL_SGIX_framezoom(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_framezoom */ +#ifdef GL_SGIX_interlace + CONST_CAST(GLEW_SGIX_interlace) = glewGetExtension("GL_SGIX_interlace"); +#endif /* GL_SGIX_interlace */ +#ifdef GL_SGIX_ir_instrument1 + CONST_CAST(GLEW_SGIX_ir_instrument1) = glewGetExtension("GL_SGIX_ir_instrument1"); +#endif /* GL_SGIX_ir_instrument1 */ +#ifdef GL_SGIX_list_priority + CONST_CAST(GLEW_SGIX_list_priority) = glewGetExtension("GL_SGIX_list_priority"); +#endif /* GL_SGIX_list_priority */ +#ifdef GL_SGIX_pixel_texture + CONST_CAST(GLEW_SGIX_pixel_texture) = glewGetExtension("GL_SGIX_pixel_texture"); + if (glewExperimental || GLEW_SGIX_pixel_texture) CONST_CAST(GLEW_SGIX_pixel_texture) = !_glewInit_GL_SGIX_pixel_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_pixel_texture */ +#ifdef GL_SGIX_pixel_texture_bits + CONST_CAST(GLEW_SGIX_pixel_texture_bits) = glewGetExtension("GL_SGIX_pixel_texture_bits"); +#endif /* GL_SGIX_pixel_texture_bits */ +#ifdef GL_SGIX_reference_plane + CONST_CAST(GLEW_SGIX_reference_plane) = glewGetExtension("GL_SGIX_reference_plane"); + if (glewExperimental || GLEW_SGIX_reference_plane) CONST_CAST(GLEW_SGIX_reference_plane) = !_glewInit_GL_SGIX_reference_plane(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_reference_plane */ +#ifdef GL_SGIX_resample + CONST_CAST(GLEW_SGIX_resample) = glewGetExtension("GL_SGIX_resample"); +#endif /* GL_SGIX_resample */ +#ifdef GL_SGIX_shadow + CONST_CAST(GLEW_SGIX_shadow) = glewGetExtension("GL_SGIX_shadow"); +#endif /* GL_SGIX_shadow */ +#ifdef GL_SGIX_shadow_ambient + CONST_CAST(GLEW_SGIX_shadow_ambient) = glewGetExtension("GL_SGIX_shadow_ambient"); +#endif /* GL_SGIX_shadow_ambient */ +#ifdef GL_SGIX_sprite + CONST_CAST(GLEW_SGIX_sprite) = glewGetExtension("GL_SGIX_sprite"); + if (glewExperimental || GLEW_SGIX_sprite) CONST_CAST(GLEW_SGIX_sprite) = !_glewInit_GL_SGIX_sprite(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_sprite */ +#ifdef GL_SGIX_tag_sample_buffer + CONST_CAST(GLEW_SGIX_tag_sample_buffer) = glewGetExtension("GL_SGIX_tag_sample_buffer"); + if (glewExperimental || GLEW_SGIX_tag_sample_buffer) CONST_CAST(GLEW_SGIX_tag_sample_buffer) = !_glewInit_GL_SGIX_tag_sample_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_tag_sample_buffer */ +#ifdef GL_SGIX_texture_add_env + CONST_CAST(GLEW_SGIX_texture_add_env) = glewGetExtension("GL_SGIX_texture_add_env"); +#endif /* GL_SGIX_texture_add_env */ +#ifdef GL_SGIX_texture_coordinate_clamp + CONST_CAST(GLEW_SGIX_texture_coordinate_clamp) = glewGetExtension("GL_SGIX_texture_coordinate_clamp"); +#endif /* GL_SGIX_texture_coordinate_clamp */ +#ifdef GL_SGIX_texture_lod_bias + CONST_CAST(GLEW_SGIX_texture_lod_bias) = glewGetExtension("GL_SGIX_texture_lod_bias"); +#endif /* GL_SGIX_texture_lod_bias */ +#ifdef GL_SGIX_texture_multi_buffer + CONST_CAST(GLEW_SGIX_texture_multi_buffer) = glewGetExtension("GL_SGIX_texture_multi_buffer"); +#endif /* GL_SGIX_texture_multi_buffer */ +#ifdef GL_SGIX_texture_range + CONST_CAST(GLEW_SGIX_texture_range) = glewGetExtension("GL_SGIX_texture_range"); +#endif /* GL_SGIX_texture_range */ +#ifdef GL_SGIX_texture_scale_bias + CONST_CAST(GLEW_SGIX_texture_scale_bias) = glewGetExtension("GL_SGIX_texture_scale_bias"); +#endif /* GL_SGIX_texture_scale_bias */ +#ifdef GL_SGIX_vertex_preclip + CONST_CAST(GLEW_SGIX_vertex_preclip) = glewGetExtension("GL_SGIX_vertex_preclip"); +#endif /* GL_SGIX_vertex_preclip */ +#ifdef GL_SGIX_vertex_preclip_hint + CONST_CAST(GLEW_SGIX_vertex_preclip_hint) = glewGetExtension("GL_SGIX_vertex_preclip_hint"); +#endif /* GL_SGIX_vertex_preclip_hint */ +#ifdef GL_SGIX_ycrcb + CONST_CAST(GLEW_SGIX_ycrcb) = glewGetExtension("GL_SGIX_ycrcb"); +#endif /* GL_SGIX_ycrcb */ +#ifdef GL_SGI_color_matrix + CONST_CAST(GLEW_SGI_color_matrix) = glewGetExtension("GL_SGI_color_matrix"); +#endif /* GL_SGI_color_matrix */ +#ifdef GL_SGI_color_table + CONST_CAST(GLEW_SGI_color_table) = glewGetExtension("GL_SGI_color_table"); + if (glewExperimental || GLEW_SGI_color_table) CONST_CAST(GLEW_SGI_color_table) = !_glewInit_GL_SGI_color_table(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGI_color_table */ +#ifdef GL_SGI_texture_color_table + CONST_CAST(GLEW_SGI_texture_color_table) = glewGetExtension("GL_SGI_texture_color_table"); +#endif /* GL_SGI_texture_color_table */ +#ifdef GL_SUNX_constant_data + CONST_CAST(GLEW_SUNX_constant_data) = glewGetExtension("GL_SUNX_constant_data"); + if (glewExperimental || GLEW_SUNX_constant_data) CONST_CAST(GLEW_SUNX_constant_data) = !_glewInit_GL_SUNX_constant_data(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SUNX_constant_data */ +#ifdef GL_SUN_convolution_border_modes + CONST_CAST(GLEW_SUN_convolution_border_modes) = glewGetExtension("GL_SUN_convolution_border_modes"); +#endif /* GL_SUN_convolution_border_modes */ +#ifdef GL_SUN_global_alpha + CONST_CAST(GLEW_SUN_global_alpha) = glewGetExtension("GL_SUN_global_alpha"); + if (glewExperimental || GLEW_SUN_global_alpha) CONST_CAST(GLEW_SUN_global_alpha) = !_glewInit_GL_SUN_global_alpha(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SUN_global_alpha */ +#ifdef GL_SUN_mesh_array + CONST_CAST(GLEW_SUN_mesh_array) = glewGetExtension("GL_SUN_mesh_array"); +#endif /* GL_SUN_mesh_array */ +#ifdef GL_SUN_read_video_pixels + CONST_CAST(GLEW_SUN_read_video_pixels) = glewGetExtension("GL_SUN_read_video_pixels"); + if (glewExperimental || GLEW_SUN_read_video_pixels) CONST_CAST(GLEW_SUN_read_video_pixels) = !_glewInit_GL_SUN_read_video_pixels(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SUN_read_video_pixels */ +#ifdef GL_SUN_slice_accum + CONST_CAST(GLEW_SUN_slice_accum) = glewGetExtension("GL_SUN_slice_accum"); +#endif /* GL_SUN_slice_accum */ +#ifdef GL_SUN_triangle_list + CONST_CAST(GLEW_SUN_triangle_list) = glewGetExtension("GL_SUN_triangle_list"); + if (glewExperimental || GLEW_SUN_triangle_list) CONST_CAST(GLEW_SUN_triangle_list) = !_glewInit_GL_SUN_triangle_list(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SUN_triangle_list */ +#ifdef GL_SUN_vertex + CONST_CAST(GLEW_SUN_vertex) = glewGetExtension("GL_SUN_vertex"); + if (glewExperimental || GLEW_SUN_vertex) CONST_CAST(GLEW_SUN_vertex) = !_glewInit_GL_SUN_vertex(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SUN_vertex */ +#ifdef GL_WIN_phong_shading + CONST_CAST(GLEW_WIN_phong_shading) = glewGetExtension("GL_WIN_phong_shading"); +#endif /* GL_WIN_phong_shading */ +#ifdef GL_WIN_specular_fog + CONST_CAST(GLEW_WIN_specular_fog) = glewGetExtension("GL_WIN_specular_fog"); +#endif /* GL_WIN_specular_fog */ +#ifdef GL_WIN_swap_hint + CONST_CAST(GLEW_WIN_swap_hint) = glewGetExtension("GL_WIN_swap_hint"); + if (glewExperimental || GLEW_WIN_swap_hint) CONST_CAST(GLEW_WIN_swap_hint) = !_glewInit_GL_WIN_swap_hint(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_WIN_swap_hint */ + + return GLEW_OK; +} + + +#if defined(_WIN32) + +#if !defined(GLEW_MX) + +PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; + +PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL; +PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL; +PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL; +PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL; + +PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL; + +PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL; +PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL; + +PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL; +PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL; +PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL; +PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL; +PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL; + +PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL; +PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL; +PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL; + +PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL; +PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL; +PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL; + +PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL; +PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL; +PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL; +PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL; + +PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL; + +PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL; +PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL; + +PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL; +PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL; +PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL; +PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL; +PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL; + +PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL; +PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL; +PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL; + +PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL; +PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL; + +PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL; +PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL; + +PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL; +PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL; +PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL; +PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL; + +PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL; +PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL; +PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL; +PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL; +PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL; +PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL; +PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL; +PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL; +PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL; +PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL; +PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL; +PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL; + +PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL; +PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL; +PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL; +PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL; + +PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL; +PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL; +PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL; +PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL; + +PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL; +PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL; +PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL; +PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL; + +PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL; +PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL; +PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL; +PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL; +PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL; + +PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL; +PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL; + +PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL; +PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL; +PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL; +PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL; +PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL; +PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL; +GLboolean __WGLEW_3DFX_multisample = GL_FALSE; +GLboolean __WGLEW_3DL_stereo_control = GL_FALSE; +GLboolean __WGLEW_ARB_buffer_region = GL_FALSE; +GLboolean __WGLEW_ARB_extensions_string = GL_FALSE; +GLboolean __WGLEW_ARB_make_current_read = GL_FALSE; +GLboolean __WGLEW_ARB_multisample = GL_FALSE; +GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; +GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; +GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; +GLboolean __WGLEW_ARB_render_texture = GL_FALSE; +GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; +GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; +GLboolean __WGLEW_EXT_depth_float = GL_FALSE; +GLboolean __WGLEW_EXT_display_color_table = GL_FALSE; +GLboolean __WGLEW_EXT_extensions_string = GL_FALSE; +GLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean __WGLEW_EXT_make_current_read = GL_FALSE; +GLboolean __WGLEW_EXT_multisample = GL_FALSE; +GLboolean __WGLEW_EXT_pbuffer = GL_FALSE; +GLboolean __WGLEW_EXT_pixel_format = GL_FALSE; +GLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE; +GLboolean __WGLEW_EXT_swap_control = GL_FALSE; +GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE; +GLboolean __WGLEW_I3D_gamma = GL_FALSE; +GLboolean __WGLEW_I3D_genlock = GL_FALSE; +GLboolean __WGLEW_I3D_image_buffer = GL_FALSE; +GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE; +GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE; +GLboolean __WGLEW_NV_float_buffer = GL_FALSE; +GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE; +GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE; +GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE; +GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE; +GLboolean __WGLEW_OML_sync_control = GL_FALSE; + +#endif /* !GLEW_MX */ + +#ifdef WGL_3DFX_multisample + +#endif /* WGL_3DFX_multisample */ + +#ifdef WGL_3DL_stereo_control + +static GLboolean _glewInit_WGL_3DL_stereo_control (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r; + + return r; +} + +#endif /* WGL_3DL_stereo_control */ + +#ifdef WGL_ARB_buffer_region + +static GLboolean _glewInit_WGL_ARB_buffer_region (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r; + r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r; + r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r; + r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_buffer_region */ + +#ifdef WGL_ARB_extensions_string + +static GLboolean _glewInit_WGL_ARB_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_extensions_string */ + +#ifdef WGL_ARB_make_current_read + +static GLboolean _glewInit_WGL_ARB_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r; + r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_make_current_read */ + +#ifdef WGL_ARB_multisample + +#endif /* WGL_ARB_multisample */ + +#ifdef WGL_ARB_pbuffer + +static GLboolean _glewInit_WGL_ARB_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r; + r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r; + r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r; + r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r; + r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_pbuffer */ + +#ifdef WGL_ARB_pixel_format + +static GLboolean _glewInit_WGL_ARB_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r; + r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r; + r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_pixel_format */ + +#ifdef WGL_ARB_pixel_format_float + +#endif /* WGL_ARB_pixel_format_float */ + +#ifdef WGL_ARB_render_texture + +static GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r; + r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r; + r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_render_texture */ + +#ifdef WGL_ATI_pixel_format_float + +#endif /* WGL_ATI_pixel_format_float */ + +#ifdef WGL_ATI_render_texture_rectangle + +#endif /* WGL_ATI_render_texture_rectangle */ + +#ifdef WGL_EXT_depth_float + +#endif /* WGL_EXT_depth_float */ + +#ifdef WGL_EXT_display_color_table + +static GLboolean _glewInit_WGL_EXT_display_color_table (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r; + r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r; + r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r; + r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_display_color_table */ + +#ifdef WGL_EXT_extensions_string + +static GLboolean _glewInit_WGL_EXT_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_extensions_string */ + +#ifdef WGL_EXT_framebuffer_sRGB + +#endif /* WGL_EXT_framebuffer_sRGB */ + +#ifdef WGL_EXT_make_current_read + +static GLboolean _glewInit_WGL_EXT_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r; + r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_make_current_read */ + +#ifdef WGL_EXT_multisample + +#endif /* WGL_EXT_multisample */ + +#ifdef WGL_EXT_pbuffer + +static GLboolean _glewInit_WGL_EXT_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r; + r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r; + r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r; + r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r; + r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_pbuffer */ + +#ifdef WGL_EXT_pixel_format + +static GLboolean _glewInit_WGL_EXT_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r; + r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r; + r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_pixel_format */ + +#ifdef WGL_EXT_pixel_format_packed_float + +#endif /* WGL_EXT_pixel_format_packed_float */ + +#ifdef WGL_EXT_swap_control + +static GLboolean _glewInit_WGL_EXT_swap_control (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r; + r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_swap_control */ + +#ifdef WGL_I3D_digital_video_control + +static GLboolean _glewInit_WGL_I3D_digital_video_control (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r; + r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_digital_video_control */ + +#ifdef WGL_I3D_gamma + +static GLboolean _glewInit_WGL_I3D_gamma (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r; + r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r; + r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r; + r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_gamma */ + +#ifdef WGL_I3D_genlock + +static GLboolean _glewInit_WGL_I3D_genlock (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r; + r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r; + r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r; + r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r; + r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r; + r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r; + r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r; + r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r; + r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r; + r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r; + r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r; + r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_genlock */ + +#ifdef WGL_I3D_image_buffer + +static GLboolean _glewInit_WGL_I3D_image_buffer (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r; + r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r; + r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r; + r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_image_buffer */ + +#ifdef WGL_I3D_swap_frame_lock + +static GLboolean _glewInit_WGL_I3D_swap_frame_lock (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r; + r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r; + r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r; + r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_swap_frame_lock */ + +#ifdef WGL_I3D_swap_frame_usage + +static GLboolean _glewInit_WGL_I3D_swap_frame_usage (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r; + r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r; + r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r; + r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_swap_frame_usage */ + +#ifdef WGL_NV_float_buffer + +#endif /* WGL_NV_float_buffer */ + +#ifdef WGL_NV_gpu_affinity + +static GLboolean _glewInit_WGL_NV_gpu_affinity (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglCreateAffinityDCNV")) == NULL) || r; + r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)"wglDeleteDCNV")) == NULL) || r; + r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpuDevicesNV")) == NULL) || r; + r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusFromAffinityDCNV")) == NULL) || r; + r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_gpu_affinity */ + +#ifdef WGL_NV_render_depth_texture + +#endif /* WGL_NV_render_depth_texture */ + +#ifdef WGL_NV_render_texture_rectangle + +#endif /* WGL_NV_render_texture_rectangle */ + +#ifdef WGL_NV_vertex_array_range + +static GLboolean _glewInit_WGL_NV_vertex_array_range (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r; + r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_vertex_array_range */ + +#ifdef WGL_OML_sync_control + +static GLboolean _glewInit_WGL_OML_sync_control (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r; + r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r; + r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r; + r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r; + r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r; + r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r; + + return r; +} + +#endif /* WGL_OML_sync_control */ + +/* ------------------------------------------------------------------------- */ + +static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; +static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; + +GLboolean wglewGetExtension (const char* name) +{ + GLubyte* p; + GLubyte* end; + GLuint len = _glewStrLen((const GLubyte*)name); + if (_wglewGetExtensionsStringARB == NULL) + if (_wglewGetExtensionsStringEXT == NULL) + return GL_FALSE; + else + p = (GLubyte*)_wglewGetExtensionsStringEXT(); + else + p = (GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); + if (0 == p) return GL_FALSE; + end = p + _glewStrLen(p); + while (p < end) + { + GLuint n = _glewStrCLen(p, ' '); + if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; + p += n+1; + } + return GL_FALSE; +} + +GLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) +{ + GLboolean crippled; + /* find wgl extension string query functions */ + _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); + _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); + /* initialize extensions */ + crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; +#ifdef WGL_3DFX_multisample + CONST_CAST(WGLEW_3DFX_multisample) = wglewGetExtension("WGL_3DFX_multisample"); +#endif /* WGL_3DFX_multisample */ +#ifdef WGL_3DL_stereo_control + CONST_CAST(WGLEW_3DL_stereo_control) = wglewGetExtension("WGL_3DL_stereo_control"); + if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) CONST_CAST(WGLEW_3DL_stereo_control)= !_glewInit_WGL_3DL_stereo_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_3DL_stereo_control */ +#ifdef WGL_ARB_buffer_region + CONST_CAST(WGLEW_ARB_buffer_region) = wglewGetExtension("WGL_ARB_buffer_region"); + if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) CONST_CAST(WGLEW_ARB_buffer_region)= !_glewInit_WGL_ARB_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_buffer_region */ +#ifdef WGL_ARB_extensions_string + CONST_CAST(WGLEW_ARB_extensions_string) = wglewGetExtension("WGL_ARB_extensions_string"); + if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) CONST_CAST(WGLEW_ARB_extensions_string)= !_glewInit_WGL_ARB_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_extensions_string */ +#ifdef WGL_ARB_make_current_read + CONST_CAST(WGLEW_ARB_make_current_read) = wglewGetExtension("WGL_ARB_make_current_read"); + if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) CONST_CAST(WGLEW_ARB_make_current_read)= !_glewInit_WGL_ARB_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_make_current_read */ +#ifdef WGL_ARB_multisample + CONST_CAST(WGLEW_ARB_multisample) = wglewGetExtension("WGL_ARB_multisample"); +#endif /* WGL_ARB_multisample */ +#ifdef WGL_ARB_pbuffer + CONST_CAST(WGLEW_ARB_pbuffer) = wglewGetExtension("WGL_ARB_pbuffer"); + if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) CONST_CAST(WGLEW_ARB_pbuffer)= !_glewInit_WGL_ARB_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_pbuffer */ +#ifdef WGL_ARB_pixel_format + CONST_CAST(WGLEW_ARB_pixel_format) = wglewGetExtension("WGL_ARB_pixel_format"); + if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) CONST_CAST(WGLEW_ARB_pixel_format)= !_glewInit_WGL_ARB_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_pixel_format */ +#ifdef WGL_ARB_pixel_format_float + CONST_CAST(WGLEW_ARB_pixel_format_float) = wglewGetExtension("WGL_ARB_pixel_format_float"); +#endif /* WGL_ARB_pixel_format_float */ +#ifdef WGL_ARB_render_texture + CONST_CAST(WGLEW_ARB_render_texture) = wglewGetExtension("WGL_ARB_render_texture"); + if (glewExperimental || WGLEW_ARB_render_texture|| crippled) CONST_CAST(WGLEW_ARB_render_texture)= !_glewInit_WGL_ARB_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_render_texture */ +#ifdef WGL_ATI_pixel_format_float + CONST_CAST(WGLEW_ATI_pixel_format_float) = wglewGetExtension("WGL_ATI_pixel_format_float"); +#endif /* WGL_ATI_pixel_format_float */ +#ifdef WGL_ATI_render_texture_rectangle + CONST_CAST(WGLEW_ATI_render_texture_rectangle) = wglewGetExtension("WGL_ATI_render_texture_rectangle"); +#endif /* WGL_ATI_render_texture_rectangle */ +#ifdef WGL_EXT_depth_float + CONST_CAST(WGLEW_EXT_depth_float) = wglewGetExtension("WGL_EXT_depth_float"); +#endif /* WGL_EXT_depth_float */ +#ifdef WGL_EXT_display_color_table + CONST_CAST(WGLEW_EXT_display_color_table) = wglewGetExtension("WGL_EXT_display_color_table"); + if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) CONST_CAST(WGLEW_EXT_display_color_table)= !_glewInit_WGL_EXT_display_color_table(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_display_color_table */ +#ifdef WGL_EXT_extensions_string + CONST_CAST(WGLEW_EXT_extensions_string) = wglewGetExtension("WGL_EXT_extensions_string"); + if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) CONST_CAST(WGLEW_EXT_extensions_string)= !_glewInit_WGL_EXT_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_extensions_string */ +#ifdef WGL_EXT_framebuffer_sRGB + CONST_CAST(WGLEW_EXT_framebuffer_sRGB) = wglewGetExtension("WGL_EXT_framebuffer_sRGB"); +#endif /* WGL_EXT_framebuffer_sRGB */ +#ifdef WGL_EXT_make_current_read + CONST_CAST(WGLEW_EXT_make_current_read) = wglewGetExtension("WGL_EXT_make_current_read"); + if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) CONST_CAST(WGLEW_EXT_make_current_read)= !_glewInit_WGL_EXT_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_make_current_read */ +#ifdef WGL_EXT_multisample + CONST_CAST(WGLEW_EXT_multisample) = wglewGetExtension("WGL_EXT_multisample"); +#endif /* WGL_EXT_multisample */ +#ifdef WGL_EXT_pbuffer + CONST_CAST(WGLEW_EXT_pbuffer) = wglewGetExtension("WGL_EXT_pbuffer"); + if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) CONST_CAST(WGLEW_EXT_pbuffer)= !_glewInit_WGL_EXT_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_pbuffer */ +#ifdef WGL_EXT_pixel_format + CONST_CAST(WGLEW_EXT_pixel_format) = wglewGetExtension("WGL_EXT_pixel_format"); + if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) CONST_CAST(WGLEW_EXT_pixel_format)= !_glewInit_WGL_EXT_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_pixel_format */ +#ifdef WGL_EXT_pixel_format_packed_float + CONST_CAST(WGLEW_EXT_pixel_format_packed_float) = wglewGetExtension("WGL_EXT_pixel_format_packed_float"); +#endif /* WGL_EXT_pixel_format_packed_float */ +#ifdef WGL_EXT_swap_control + CONST_CAST(WGLEW_EXT_swap_control) = wglewGetExtension("WGL_EXT_swap_control"); + if (glewExperimental || WGLEW_EXT_swap_control|| crippled) CONST_CAST(WGLEW_EXT_swap_control)= !_glewInit_WGL_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_swap_control */ +#ifdef WGL_I3D_digital_video_control + CONST_CAST(WGLEW_I3D_digital_video_control) = wglewGetExtension("WGL_I3D_digital_video_control"); + if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) CONST_CAST(WGLEW_I3D_digital_video_control)= !_glewInit_WGL_I3D_digital_video_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_digital_video_control */ +#ifdef WGL_I3D_gamma + CONST_CAST(WGLEW_I3D_gamma) = wglewGetExtension("WGL_I3D_gamma"); + if (glewExperimental || WGLEW_I3D_gamma|| crippled) CONST_CAST(WGLEW_I3D_gamma)= !_glewInit_WGL_I3D_gamma(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_gamma */ +#ifdef WGL_I3D_genlock + CONST_CAST(WGLEW_I3D_genlock) = wglewGetExtension("WGL_I3D_genlock"); + if (glewExperimental || WGLEW_I3D_genlock|| crippled) CONST_CAST(WGLEW_I3D_genlock)= !_glewInit_WGL_I3D_genlock(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_genlock */ +#ifdef WGL_I3D_image_buffer + CONST_CAST(WGLEW_I3D_image_buffer) = wglewGetExtension("WGL_I3D_image_buffer"); + if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) CONST_CAST(WGLEW_I3D_image_buffer)= !_glewInit_WGL_I3D_image_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_image_buffer */ +#ifdef WGL_I3D_swap_frame_lock + CONST_CAST(WGLEW_I3D_swap_frame_lock) = wglewGetExtension("WGL_I3D_swap_frame_lock"); + if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) CONST_CAST(WGLEW_I3D_swap_frame_lock)= !_glewInit_WGL_I3D_swap_frame_lock(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_swap_frame_lock */ +#ifdef WGL_I3D_swap_frame_usage + CONST_CAST(WGLEW_I3D_swap_frame_usage) = wglewGetExtension("WGL_I3D_swap_frame_usage"); + if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) CONST_CAST(WGLEW_I3D_swap_frame_usage)= !_glewInit_WGL_I3D_swap_frame_usage(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_swap_frame_usage */ +#ifdef WGL_NV_float_buffer + CONST_CAST(WGLEW_NV_float_buffer) = wglewGetExtension("WGL_NV_float_buffer"); +#endif /* WGL_NV_float_buffer */ +#ifdef WGL_NV_gpu_affinity + CONST_CAST(WGLEW_NV_gpu_affinity) = wglewGetExtension("WGL_NV_gpu_affinity"); + if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) CONST_CAST(WGLEW_NV_gpu_affinity)= !_glewInit_WGL_NV_gpu_affinity(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_gpu_affinity */ +#ifdef WGL_NV_render_depth_texture + CONST_CAST(WGLEW_NV_render_depth_texture) = wglewGetExtension("WGL_NV_render_depth_texture"); +#endif /* WGL_NV_render_depth_texture */ +#ifdef WGL_NV_render_texture_rectangle + CONST_CAST(WGLEW_NV_render_texture_rectangle) = wglewGetExtension("WGL_NV_render_texture_rectangle"); +#endif /* WGL_NV_render_texture_rectangle */ +#ifdef WGL_NV_vertex_array_range + CONST_CAST(WGLEW_NV_vertex_array_range) = wglewGetExtension("WGL_NV_vertex_array_range"); + if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) CONST_CAST(WGLEW_NV_vertex_array_range)= !_glewInit_WGL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_vertex_array_range */ +#ifdef WGL_OML_sync_control + CONST_CAST(WGLEW_OML_sync_control) = wglewGetExtension("WGL_OML_sync_control"); + if (glewExperimental || WGLEW_OML_sync_control|| crippled) CONST_CAST(WGLEW_OML_sync_control)= !_glewInit_WGL_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_OML_sync_control */ + + return GLEW_OK; +} + +#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) + +PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; + +PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL; +PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL; +PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL; +PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL; +PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL; +PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL; +PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL; +PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL; +PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL; +PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL; +PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL; +PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL; +PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL; +PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL; +PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; +PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; +PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; + +PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; +PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL; +PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL; + +PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL; +PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL; +PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL; +PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL; + +PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL; +PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL; + +PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL; + +PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL; + +PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL; + +PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL; + +PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL; + +PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL; +PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL; + +#ifdef GLX_OML_sync_control +PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL; +PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL; +PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL; +PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL; +PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL; +#endif + +PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL; +PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL; +PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL; +PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL; +PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL; +PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL; + +PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL; +PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL; +PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL; +PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL; +PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL; +PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL; +PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL; +PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL; + +PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL; +PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL; +PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL; +PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL; +PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL; + +PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL; +PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL; + +PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL; + +PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL; +PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL; +PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL; +PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL; +PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL; + +PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL; + +PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL; +PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL; + +PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL; + +PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL; +PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL; + +PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL; + +PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL; +PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL; + +#if !defined(GLEW_MX) + +GLboolean __GLXEW_VERSION_1_0 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_1 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_2 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_3 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_4 = GL_FALSE; +GLboolean __GLXEW_3DFX_multisample = GL_FALSE; +GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE; +GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE; +GLboolean __GLXEW_ARB_multisample = GL_FALSE; +GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; +GLboolean __GLXEW_ATI_render_texture = GL_FALSE; +GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; +GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean __GLXEW_EXT_import_context = GL_FALSE; +GLboolean __GLXEW_EXT_scene_marker = GL_FALSE; +GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE; +GLboolean __GLXEW_EXT_visual_info = GL_FALSE; +GLboolean __GLXEW_EXT_visual_rating = GL_FALSE; +GLboolean __GLXEW_MESA_agp_offset = GL_FALSE; +GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE; +GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE; +GLboolean __GLXEW_MESA_release_buffers = GL_FALSE; +GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE; +GLboolean __GLXEW_NV_float_buffer = GL_FALSE; +GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; +GLboolean __GLXEW_OML_swap_method = GL_FALSE; +#ifdef GLX_OML_sync_control +GLboolean __GLXEW_OML_sync_control = GL_FALSE; +#endif +GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; +GLboolean __GLXEW_SGIS_color_range = GL_FALSE; +GLboolean __GLXEW_SGIS_multisample = GL_FALSE; +GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE; +GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE; +GLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE; +GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE; +GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE; +GLboolean __GLXEW_SGIX_swap_group = GL_FALSE; +GLboolean __GLXEW_SGIX_video_resize = GL_FALSE; +GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE; +GLboolean __GLXEW_SGI_cushion = GL_FALSE; +GLboolean __GLXEW_SGI_make_current_read = GL_FALSE; +GLboolean __GLXEW_SGI_swap_control = GL_FALSE; +GLboolean __GLXEW_SGI_video_sync = GL_FALSE; +GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE; +GLboolean __GLXEW_SUN_video_resize = GL_FALSE; + +#endif /* !GLEW_MX */ + +#ifdef GLX_VERSION_1_2 + +static GLboolean _glewInit_GLX_VERSION_1_2 (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r; + + return r; +} + +#endif /* GLX_VERSION_1_2 */ + +#ifdef GLX_VERSION_1_3 + +static GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r; + r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r; + r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r; + r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r; + r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r; + r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r; + r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r; + r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r; + r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r; + r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r; + r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r; + r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r; + r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r; + r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r; + r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r; + r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r; + r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r; + + return r; +} + +#endif /* GLX_VERSION_1_3 */ + +#ifdef GLX_VERSION_1_4 + +#endif /* GLX_VERSION_1_4 */ + +#ifdef GLX_3DFX_multisample + +#endif /* GLX_3DFX_multisample */ + +#ifdef GLX_ARB_fbconfig_float + +#endif /* GLX_ARB_fbconfig_float */ + +#ifdef GLX_ARB_get_proc_address + +#endif /* GLX_ARB_get_proc_address */ + +#ifdef GLX_ARB_multisample + +#endif /* GLX_ARB_multisample */ + +#ifdef GLX_ATI_pixel_format_float + +#endif /* GLX_ATI_pixel_format_float */ + +#ifdef GLX_ATI_render_texture + +static GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r; + r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r; + r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r; + + return r; +} + +#endif /* GLX_ATI_render_texture */ + +#ifdef GLX_EXT_fbconfig_packed_float + +#endif /* GLX_EXT_fbconfig_packed_float */ + +#ifdef GLX_EXT_framebuffer_sRGB + +#endif /* GLX_EXT_framebuffer_sRGB */ + +#ifdef GLX_EXT_import_context + +static GLboolean _glewInit_GLX_EXT_import_context (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r; + r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r; + r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r; + r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r; + + return r; +} + +#endif /* GLX_EXT_import_context */ + +#ifdef GLX_EXT_scene_marker + +#endif /* GLX_EXT_scene_marker */ + +#ifdef GLX_EXT_texture_from_pixmap + +static GLboolean _glewInit_GLX_EXT_texture_from_pixmap (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageEXT")) == NULL) || r; + r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageEXT")) == NULL) || r; + + return r; +} + +#endif /* GLX_EXT_texture_from_pixmap */ + +#ifdef GLX_EXT_visual_info + +#endif /* GLX_EXT_visual_info */ + +#ifdef GLX_EXT_visual_rating + +#endif /* GLX_EXT_visual_rating */ + +#ifdef GLX_MESA_agp_offset + +static GLboolean _glewInit_GLX_MESA_agp_offset (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_agp_offset */ + +#ifdef GLX_MESA_copy_sub_buffer + +static GLboolean _glewInit_GLX_MESA_copy_sub_buffer (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_copy_sub_buffer */ + +#ifdef GLX_MESA_pixmap_colormap + +static GLboolean _glewInit_GLX_MESA_pixmap_colormap (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_pixmap_colormap */ + +#ifdef GLX_MESA_release_buffers + +static GLboolean _glewInit_GLX_MESA_release_buffers (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_release_buffers */ + +#ifdef GLX_MESA_set_3dfx_mode + +static GLboolean _glewInit_GLX_MESA_set_3dfx_mode (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_set_3dfx_mode */ + +#ifdef GLX_NV_float_buffer + +#endif /* GLX_NV_float_buffer */ + +#ifdef GLX_NV_vertex_array_range + +static GLboolean _glewInit_GLX_NV_vertex_array_range (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r; + r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_vertex_array_range */ + +#ifdef GLX_OML_swap_method + +#endif /* GLX_OML_swap_method */ + +#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#include + +static GLboolean _glewInit_GLX_OML_sync_control (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r; + r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r; + r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r; + r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r; + r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r; + + return r; +} + +#endif /* GLX_OML_sync_control */ + +#ifdef GLX_SGIS_blended_overlay + +#endif /* GLX_SGIS_blended_overlay */ + +#ifdef GLX_SGIS_color_range + +#endif /* GLX_SGIS_color_range */ + +#ifdef GLX_SGIS_multisample + +#endif /* GLX_SGIS_multisample */ + +#ifdef GLX_SGIS_shared_multisample + +#endif /* GLX_SGIS_shared_multisample */ + +#ifdef GLX_SGIX_fbconfig + +static GLboolean _glewInit_GLX_SGIX_fbconfig (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r; + r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r; + r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r; + r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r; + r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r; + r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_fbconfig */ + +#ifdef GLX_SGIX_hyperpipe + +static GLboolean _glewInit_GLX_SGIX_hyperpipe (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindHyperpipeSGIX")) == NULL) || r; + r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyHyperpipeConfigSGIX")) == NULL) || r; + r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeAttribSGIX")) == NULL) || r; + r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeConfigSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeAttribSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeBestAttribSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeConfigSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeNetworkSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_hyperpipe */ + +#ifdef GLX_SGIX_pbuffer + +static GLboolean _glewInit_GLX_SGIX_pbuffer (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r; + r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r; + r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r; + r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r; + r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_pbuffer */ + +#ifdef GLX_SGIX_swap_barrier + +static GLboolean _glewInit_GLX_SGIX_swap_barrier (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r; + r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_swap_barrier */ + +#ifdef GLX_SGIX_swap_group + +static GLboolean _glewInit_GLX_SGIX_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_swap_group */ + +#ifdef GLX_SGIX_video_resize + +static GLboolean _glewInit_GLX_SGIX_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r; + r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r; + r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r; + r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r; + r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_video_resize */ + +#ifdef GLX_SGIX_visual_select_group + +#endif /* GLX_SGIX_visual_select_group */ + +#ifdef GLX_SGI_cushion + +static GLboolean _glewInit_GLX_SGI_cushion (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_cushion */ + +#ifdef GLX_SGI_make_current_read + +static GLboolean _glewInit_GLX_SGI_make_current_read (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r; + r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_make_current_read */ + +#ifdef GLX_SGI_swap_control + +static GLboolean _glewInit_GLX_SGI_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_swap_control */ + +#ifdef GLX_SGI_video_sync + +static GLboolean _glewInit_GLX_SGI_video_sync (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r; + r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_video_sync */ + +#ifdef GLX_SUN_get_transparent_index + +static GLboolean _glewInit_GLX_SUN_get_transparent_index (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r; + + return r; +} + +#endif /* GLX_SUN_get_transparent_index */ + +#ifdef GLX_SUN_video_resize + +static GLboolean _glewInit_GLX_SUN_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r; + r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r; + + return r; +} + +#endif /* GLX_SUN_video_resize */ + +/* ------------------------------------------------------------------------ */ + +GLboolean glxewGetExtension (const char* name) +{ + GLubyte* p; + GLubyte* end; + GLuint len = _glewStrLen((const GLubyte*)name); +/* if (glXQueryExtensionsString == NULL || glXGetCurrentDisplay == NULL) return GL_FALSE; */ +/* p = (GLubyte*)glXQueryExtensionsString(glXGetCurrentDisplay(), DefaultScreen(glXGetCurrentDisplay())); */ + if (glXGetClientString == NULL || glXGetCurrentDisplay == NULL) return GL_FALSE; + p = (GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); + if (0 == p) return GL_FALSE; + end = p + _glewStrLen(p); + while (p < end) + { + GLuint n = _glewStrCLen(p, ' '); + if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; + p += n+1; + } + return GL_FALSE; +} + +GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) +{ + int major, minor; + /* initialize core GLX 1.2 */ + if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY; + /* initialize flags */ + CONST_CAST(GLXEW_VERSION_1_0) = GL_TRUE; + CONST_CAST(GLXEW_VERSION_1_1) = GL_TRUE; + CONST_CAST(GLXEW_VERSION_1_2) = GL_TRUE; + CONST_CAST(GLXEW_VERSION_1_3) = GL_TRUE; + CONST_CAST(GLXEW_VERSION_1_4) = GL_TRUE; + /* query GLX version */ + glXQueryVersion(glXGetCurrentDisplay(), &major, &minor); + if (major == 1 && minor <= 3) + { + switch (minor) + { + case 3: + CONST_CAST(GLXEW_VERSION_1_4) = GL_FALSE; + break; + case 2: + CONST_CAST(GLXEW_VERSION_1_4) = GL_FALSE; + CONST_CAST(GLXEW_VERSION_1_3) = GL_FALSE; + break; + default: + return GLEW_ERROR_GLX_VERSION_11_ONLY; + break; + } + } + /* initialize extensions */ +#ifdef GLX_VERSION_1_3 + if (glewExperimental || GLXEW_VERSION_1_3) CONST_CAST(GLXEW_VERSION_1_3) = !_glewInit_GLX_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_VERSION_1_3 */ +#ifdef GLX_3DFX_multisample + CONST_CAST(GLXEW_3DFX_multisample) = glxewGetExtension("GLX_3DFX_multisample"); +#endif /* GLX_3DFX_multisample */ +#ifdef GLX_ARB_fbconfig_float + CONST_CAST(GLXEW_ARB_fbconfig_float) = glxewGetExtension("GLX_ARB_fbconfig_float"); +#endif /* GLX_ARB_fbconfig_float */ +#ifdef GLX_ARB_get_proc_address + CONST_CAST(GLXEW_ARB_get_proc_address) = glxewGetExtension("GLX_ARB_get_proc_address"); +#endif /* GLX_ARB_get_proc_address */ +#ifdef GLX_ARB_multisample + CONST_CAST(GLXEW_ARB_multisample) = glxewGetExtension("GLX_ARB_multisample"); +#endif /* GLX_ARB_multisample */ +#ifdef GLX_ATI_pixel_format_float + CONST_CAST(GLXEW_ATI_pixel_format_float) = glxewGetExtension("GLX_ATI_pixel_format_float"); +#endif /* GLX_ATI_pixel_format_float */ +#ifdef GLX_ATI_render_texture + CONST_CAST(GLXEW_ATI_render_texture) = glxewGetExtension("GLX_ATI_render_texture"); + if (glewExperimental || GLXEW_ATI_render_texture) CONST_CAST(GLXEW_ATI_render_texture) = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_ATI_render_texture */ +#ifdef GLX_EXT_fbconfig_packed_float + CONST_CAST(GLXEW_EXT_fbconfig_packed_float) = glxewGetExtension("GLX_EXT_fbconfig_packed_float"); +#endif /* GLX_EXT_fbconfig_packed_float */ +#ifdef GLX_EXT_framebuffer_sRGB + CONST_CAST(GLXEW_EXT_framebuffer_sRGB) = glxewGetExtension("GLX_EXT_framebuffer_sRGB"); +#endif /* GLX_EXT_framebuffer_sRGB */ +#ifdef GLX_EXT_import_context + CONST_CAST(GLXEW_EXT_import_context) = glxewGetExtension("GLX_EXT_import_context"); + if (glewExperimental || GLXEW_EXT_import_context) CONST_CAST(GLXEW_EXT_import_context) = !_glewInit_GLX_EXT_import_context(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_EXT_import_context */ +#ifdef GLX_EXT_scene_marker + CONST_CAST(GLXEW_EXT_scene_marker) = glxewGetExtension("GLX_EXT_scene_marker"); +#endif /* GLX_EXT_scene_marker */ +#ifdef GLX_EXT_texture_from_pixmap + CONST_CAST(GLXEW_EXT_texture_from_pixmap) = glxewGetExtension("GLX_EXT_texture_from_pixmap"); + if (glewExperimental || GLXEW_EXT_texture_from_pixmap) CONST_CAST(GLXEW_EXT_texture_from_pixmap) = !_glewInit_GLX_EXT_texture_from_pixmap(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_EXT_texture_from_pixmap */ +#ifdef GLX_EXT_visual_info + CONST_CAST(GLXEW_EXT_visual_info) = glxewGetExtension("GLX_EXT_visual_info"); +#endif /* GLX_EXT_visual_info */ +#ifdef GLX_EXT_visual_rating + CONST_CAST(GLXEW_EXT_visual_rating) = glxewGetExtension("GLX_EXT_visual_rating"); +#endif /* GLX_EXT_visual_rating */ +#ifdef GLX_MESA_agp_offset + CONST_CAST(GLXEW_MESA_agp_offset) = glxewGetExtension("GLX_MESA_agp_offset"); + if (glewExperimental || GLXEW_MESA_agp_offset) CONST_CAST(GLXEW_MESA_agp_offset) = !_glewInit_GLX_MESA_agp_offset(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_agp_offset */ +#ifdef GLX_MESA_copy_sub_buffer + CONST_CAST(GLXEW_MESA_copy_sub_buffer) = glxewGetExtension("GLX_MESA_copy_sub_buffer"); + if (glewExperimental || GLXEW_MESA_copy_sub_buffer) CONST_CAST(GLXEW_MESA_copy_sub_buffer) = !_glewInit_GLX_MESA_copy_sub_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_copy_sub_buffer */ +#ifdef GLX_MESA_pixmap_colormap + CONST_CAST(GLXEW_MESA_pixmap_colormap) = glxewGetExtension("GLX_MESA_pixmap_colormap"); + if (glewExperimental || GLXEW_MESA_pixmap_colormap) CONST_CAST(GLXEW_MESA_pixmap_colormap) = !_glewInit_GLX_MESA_pixmap_colormap(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_pixmap_colormap */ +#ifdef GLX_MESA_release_buffers + CONST_CAST(GLXEW_MESA_release_buffers) = glxewGetExtension("GLX_MESA_release_buffers"); + if (glewExperimental || GLXEW_MESA_release_buffers) CONST_CAST(GLXEW_MESA_release_buffers) = !_glewInit_GLX_MESA_release_buffers(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_release_buffers */ +#ifdef GLX_MESA_set_3dfx_mode + CONST_CAST(GLXEW_MESA_set_3dfx_mode) = glxewGetExtension("GLX_MESA_set_3dfx_mode"); + if (glewExperimental || GLXEW_MESA_set_3dfx_mode) CONST_CAST(GLXEW_MESA_set_3dfx_mode) = !_glewInit_GLX_MESA_set_3dfx_mode(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_set_3dfx_mode */ +#ifdef GLX_NV_float_buffer + CONST_CAST(GLXEW_NV_float_buffer) = glxewGetExtension("GLX_NV_float_buffer"); +#endif /* GLX_NV_float_buffer */ +#ifdef GLX_NV_vertex_array_range + CONST_CAST(GLXEW_NV_vertex_array_range) = glxewGetExtension("GLX_NV_vertex_array_range"); + if (glewExperimental || GLXEW_NV_vertex_array_range) CONST_CAST(GLXEW_NV_vertex_array_range) = !_glewInit_GLX_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_vertex_array_range */ +#ifdef GLX_OML_swap_method + CONST_CAST(GLXEW_OML_swap_method) = glxewGetExtension("GLX_OML_swap_method"); +#endif /* GLX_OML_swap_method */ +#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#include + CONST_CAST(GLXEW_OML_sync_control) = glxewGetExtension("GLX_OML_sync_control"); + if (glewExperimental || GLXEW_OML_sync_control) CONST_CAST(GLXEW_OML_sync_control) = !_glewInit_GLX_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_OML_sync_control */ +#ifdef GLX_SGIS_blended_overlay + CONST_CAST(GLXEW_SGIS_blended_overlay) = glxewGetExtension("GLX_SGIS_blended_overlay"); +#endif /* GLX_SGIS_blended_overlay */ +#ifdef GLX_SGIS_color_range + CONST_CAST(GLXEW_SGIS_color_range) = glxewGetExtension("GLX_SGIS_color_range"); +#endif /* GLX_SGIS_color_range */ +#ifdef GLX_SGIS_multisample + CONST_CAST(GLXEW_SGIS_multisample) = glxewGetExtension("GLX_SGIS_multisample"); +#endif /* GLX_SGIS_multisample */ +#ifdef GLX_SGIS_shared_multisample + CONST_CAST(GLXEW_SGIS_shared_multisample) = glxewGetExtension("GLX_SGIS_shared_multisample"); +#endif /* GLX_SGIS_shared_multisample */ +#ifdef GLX_SGIX_fbconfig + CONST_CAST(GLXEW_SGIX_fbconfig) = glxewGetExtension("GLX_SGIX_fbconfig"); + if (glewExperimental || GLXEW_SGIX_fbconfig) CONST_CAST(GLXEW_SGIX_fbconfig) = !_glewInit_GLX_SGIX_fbconfig(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_fbconfig */ +#ifdef GLX_SGIX_hyperpipe + CONST_CAST(GLXEW_SGIX_hyperpipe) = glxewGetExtension("GLX_SGIX_hyperpipe"); + if (glewExperimental || GLXEW_SGIX_hyperpipe) CONST_CAST(GLXEW_SGIX_hyperpipe) = !_glewInit_GLX_SGIX_hyperpipe(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_hyperpipe */ +#ifdef GLX_SGIX_pbuffer + CONST_CAST(GLXEW_SGIX_pbuffer) = glxewGetExtension("GLX_SGIX_pbuffer"); + if (glewExperimental || GLXEW_SGIX_pbuffer) CONST_CAST(GLXEW_SGIX_pbuffer) = !_glewInit_GLX_SGIX_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_pbuffer */ +#ifdef GLX_SGIX_swap_barrier + CONST_CAST(GLXEW_SGIX_swap_barrier) = glxewGetExtension("GLX_SGIX_swap_barrier"); + if (glewExperimental || GLXEW_SGIX_swap_barrier) CONST_CAST(GLXEW_SGIX_swap_barrier) = !_glewInit_GLX_SGIX_swap_barrier(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_swap_barrier */ +#ifdef GLX_SGIX_swap_group + CONST_CAST(GLXEW_SGIX_swap_group) = glxewGetExtension("GLX_SGIX_swap_group"); + if (glewExperimental || GLXEW_SGIX_swap_group) CONST_CAST(GLXEW_SGIX_swap_group) = !_glewInit_GLX_SGIX_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_swap_group */ +#ifdef GLX_SGIX_video_resize + CONST_CAST(GLXEW_SGIX_video_resize) = glxewGetExtension("GLX_SGIX_video_resize"); + if (glewExperimental || GLXEW_SGIX_video_resize) CONST_CAST(GLXEW_SGIX_video_resize) = !_glewInit_GLX_SGIX_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_video_resize */ +#ifdef GLX_SGIX_visual_select_group + CONST_CAST(GLXEW_SGIX_visual_select_group) = glxewGetExtension("GLX_SGIX_visual_select_group"); +#endif /* GLX_SGIX_visual_select_group */ +#ifdef GLX_SGI_cushion + CONST_CAST(GLXEW_SGI_cushion) = glxewGetExtension("GLX_SGI_cushion"); + if (glewExperimental || GLXEW_SGI_cushion) CONST_CAST(GLXEW_SGI_cushion) = !_glewInit_GLX_SGI_cushion(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGI_cushion */ +#ifdef GLX_SGI_make_current_read + CONST_CAST(GLXEW_SGI_make_current_read) = glxewGetExtension("GLX_SGI_make_current_read"); + if (glewExperimental || GLXEW_SGI_make_current_read) CONST_CAST(GLXEW_SGI_make_current_read) = !_glewInit_GLX_SGI_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGI_make_current_read */ +#ifdef GLX_SGI_swap_control + CONST_CAST(GLXEW_SGI_swap_control) = glxewGetExtension("GLX_SGI_swap_control"); + if (glewExperimental || GLXEW_SGI_swap_control) CONST_CAST(GLXEW_SGI_swap_control) = !_glewInit_GLX_SGI_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGI_swap_control */ +#ifdef GLX_SGI_video_sync + CONST_CAST(GLXEW_SGI_video_sync) = glxewGetExtension("GLX_SGI_video_sync"); + if (glewExperimental || GLXEW_SGI_video_sync) CONST_CAST(GLXEW_SGI_video_sync) = !_glewInit_GLX_SGI_video_sync(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGI_video_sync */ +#ifdef GLX_SUN_get_transparent_index + CONST_CAST(GLXEW_SUN_get_transparent_index) = glxewGetExtension("GLX_SUN_get_transparent_index"); + if (glewExperimental || GLXEW_SUN_get_transparent_index) CONST_CAST(GLXEW_SUN_get_transparent_index) = !_glewInit_GLX_SUN_get_transparent_index(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SUN_get_transparent_index */ +#ifdef GLX_SUN_video_resize + CONST_CAST(GLXEW_SUN_video_resize) = glxewGetExtension("GLX_SUN_video_resize"); + if (glewExperimental || GLXEW_SUN_video_resize) CONST_CAST(GLXEW_SUN_video_resize) = !_glewInit_GLX_SUN_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SUN_video_resize */ + + return GLEW_OK; +} + +#endif /* !__APPLE__ || GLEW_APPLE_GLX */ + +/* ------------------------------------------------------------------------ */ + +const GLubyte* glewGetErrorString (GLenum error) +{ + static const GLubyte* _glewErrorString[] = + { + (const GLubyte*)"No error", + (const GLubyte*)"Missing GL version", + (const GLubyte*)"GL 1.1 and up are not supported", + (const GLubyte*)"GLX 1.2 and up are not supported", + (const GLubyte*)"Unknown error" + }; + const int max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1; + return _glewErrorString[(int)error > max_error ? max_error : (int)error]; +} + +const GLubyte* glewGetString (GLenum name) +{ + static const GLubyte* _glewString[] = + { + (const GLubyte*)NULL, + (const GLubyte*)"1.5.0", + (const GLubyte*)"1", + (const GLubyte*)"5", + (const GLubyte*)"0" + }; + const int max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; + return _glewString[(int)name > max_string ? 0 : (int)name]; +} + +/* ------------------------------------------------------------------------ */ + +GLboolean glewExperimental = GL_FALSE; + +#if !defined(GLEW_MX) + +#if defined(_WIN32) +extern GLenum wglewContextInit (void); +#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */ +extern GLenum glxewContextInit (void); +#endif /* _WIN32 */ + +GLenum glewInit () +{ + GLenum r; + if ( (r = glewContextInit()) ) return r; +#if defined(_WIN32) + return wglewContextInit(); +#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */ + return glxewContextInit(); +#else + return r; +#endif /* _WIN32 */ +} + +#endif /* !GLEW_MX */ +#ifdef GLEW_MX +GLboolean glewContextIsSupported (GLEWContext* ctx, const char* name) +#else +GLboolean glewIsSupported (const char* name) +#endif +{ + GLubyte* pos = (GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3)) + { + if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) + { +#ifdef GL_VERSION_1_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) + { + ret = GLEW_VERSION_1_2; + continue; + } +#endif +#ifdef GL_VERSION_1_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) + { + ret = GLEW_VERSION_1_3; + continue; + } +#endif +#ifdef GL_VERSION_1_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) + { + ret = GLEW_VERSION_1_4; + continue; + } +#endif +#ifdef GL_VERSION_1_5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) + { + ret = GLEW_VERSION_1_5; + continue; + } +#endif +#ifdef GL_VERSION_2_0 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3)) + { + ret = GLEW_VERSION_2_0; + continue; + } +#endif +#ifdef GL_VERSION_2_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_1", 3)) + { + ret = GLEW_VERSION_2_1; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) + { +#ifdef GL_3DFX_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_3DFX_multisample; + continue; + } +#endif +#ifdef GL_3DFX_tbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7)) + { + ret = GLEW_3DFX_tbuffer; + continue; + } +#endif +#ifdef GL_3DFX_texture_compression_FXT1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24)) + { + ret = GLEW_3DFX_texture_compression_FXT1; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) + { +#ifdef GL_APPLE_client_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14)) + { + ret = GLEW_APPLE_client_storage; + continue; + } +#endif +#ifdef GL_APPLE_element_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) + { + ret = GLEW_APPLE_element_array; + continue; + } +#endif +#ifdef GL_APPLE_fence + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) + { + ret = GLEW_APPLE_fence; + continue; + } +#endif +#ifdef GL_APPLE_float_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12)) + { + ret = GLEW_APPLE_float_pixels; + continue; + } +#endif +#ifdef GL_APPLE_flush_buffer_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_buffer_range", 18)) + { + ret = GLEW_APPLE_flush_buffer_range; + continue; + } +#endif +#ifdef GL_APPLE_pixel_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12)) + { + ret = GLEW_APPLE_pixel_buffer; + continue; + } +#endif +#ifdef GL_APPLE_specular_vector + if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15)) + { + ret = GLEW_APPLE_specular_vector; + continue; + } +#endif +#ifdef GL_APPLE_texture_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) + { + ret = GLEW_APPLE_texture_range; + continue; + } +#endif +#ifdef GL_APPLE_transform_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14)) + { + ret = GLEW_APPLE_transform_hint; + continue; + } +#endif +#ifdef GL_APPLE_vertex_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) + { + ret = GLEW_APPLE_vertex_array_object; + continue; + } +#endif +#ifdef GL_APPLE_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = GLEW_APPLE_vertex_array_range; + continue; + } +#endif +#ifdef GL_APPLE_ycbcr_422 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9)) + { + ret = GLEW_APPLE_ycbcr_422; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) + { +#ifdef GL_ARB_color_buffer_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) + { + ret = GLEW_ARB_color_buffer_float; + continue; + } +#endif +#ifdef GL_ARB_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) + { + ret = GLEW_ARB_depth_texture; + continue; + } +#endif +#ifdef GL_ARB_draw_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) + { + ret = GLEW_ARB_draw_buffers; + continue; + } +#endif +#ifdef GL_ARB_fragment_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) + { + ret = GLEW_ARB_fragment_program; + continue; + } +#endif +#ifdef GL_ARB_fragment_program_shadow + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23)) + { + ret = GLEW_ARB_fragment_program_shadow; + continue; + } +#endif +#ifdef GL_ARB_fragment_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) + { + ret = GLEW_ARB_fragment_shader; + continue; + } +#endif +#ifdef GL_ARB_half_float_pixel + if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16)) + { + ret = GLEW_ARB_half_float_pixel; + continue; + } +#endif +#ifdef GL_ARB_imaging + if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7)) + { + ret = GLEW_ARB_imaging; + continue; + } +#endif +#ifdef GL_ARB_matrix_palette + if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) + { + ret = GLEW_ARB_matrix_palette; + continue; + } +#endif +#ifdef GL_ARB_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_ARB_multisample; + continue; + } +#endif +#ifdef GL_ARB_multitexture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) + { + ret = GLEW_ARB_multitexture; + continue; + } +#endif +#ifdef GL_ARB_occlusion_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) + { + ret = GLEW_ARB_occlusion_query; + continue; + } +#endif +#ifdef GL_ARB_pixel_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) + { + ret = GLEW_ARB_pixel_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_point_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) + { + ret = GLEW_ARB_point_parameters; + continue; + } +#endif +#ifdef GL_ARB_point_sprite + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) + { + ret = GLEW_ARB_point_sprite; + continue; + } +#endif +#ifdef GL_ARB_shader_objects + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14)) + { + ret = GLEW_ARB_shader_objects; + continue; + } +#endif +#ifdef GL_ARB_shading_language_100 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20)) + { + ret = GLEW_ARB_shading_language_100; + continue; + } +#endif +#ifdef GL_ARB_shadow + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) + { + ret = GLEW_ARB_shadow; + continue; + } +#endif +#ifdef GL_ARB_shadow_ambient + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) + { + ret = GLEW_ARB_shadow_ambient; + continue; + } +#endif +#ifdef GL_ARB_texture_border_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) + { + ret = GLEW_ARB_texture_border_clamp; + continue; + } +#endif +#ifdef GL_ARB_texture_compression + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19)) + { + ret = GLEW_ARB_texture_compression; + continue; + } +#endif +#ifdef GL_ARB_texture_cube_map + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) + { + ret = GLEW_ARB_texture_cube_map; + continue; + } +#endif +#ifdef GL_ARB_texture_env_add + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) + { + ret = GLEW_ARB_texture_env_add; + continue; + } +#endif +#ifdef GL_ARB_texture_env_combine + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) + { + ret = GLEW_ARB_texture_env_combine; + continue; + } +#endif +#ifdef GL_ARB_texture_env_crossbar + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) + { + ret = GLEW_ARB_texture_env_crossbar; + continue; + } +#endif +#ifdef GL_ARB_texture_env_dot3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) + { + ret = GLEW_ARB_texture_env_dot3; + continue; + } +#endif +#ifdef GL_ARB_texture_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) + { + ret = GLEW_ARB_texture_float; + continue; + } +#endif +#ifdef GL_ARB_texture_mirrored_repeat + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) + { + ret = GLEW_ARB_texture_mirrored_repeat; + continue; + } +#endif +#ifdef GL_ARB_texture_non_power_of_two + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24)) + { + ret = GLEW_ARB_texture_non_power_of_two; + continue; + } +#endif +#ifdef GL_ARB_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) + { + ret = GLEW_ARB_texture_rectangle; + continue; + } +#endif +#ifdef GL_ARB_transpose_matrix + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16)) + { + ret = GLEW_ARB_transpose_matrix; + continue; + } +#endif +#ifdef GL_ARB_vertex_blend + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12)) + { + ret = GLEW_ARB_vertex_blend; + continue; + } +#endif +#ifdef GL_ARB_vertex_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) + { + ret = GLEW_ARB_vertex_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_vertex_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) + { + ret = GLEW_ARB_vertex_program; + continue; + } +#endif +#ifdef GL_ARB_vertex_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) + { + ret = GLEW_ARB_vertex_shader; + continue; + } +#endif +#ifdef GL_ARB_window_pos + if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) + { + ret = GLEW_ARB_window_pos; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5)) + { +#ifdef GL_ATIX_point_sprites + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13)) + { + ret = GLEW_ATIX_point_sprites; + continue; + } +#endif +#ifdef GL_ATIX_texture_env_combine3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) + { + ret = GLEW_ATIX_texture_env_combine3; + continue; + } +#endif +#ifdef GL_ATIX_texture_env_route + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17)) + { + ret = GLEW_ATIX_texture_env_route; + continue; + } +#endif +#ifdef GL_ATIX_vertex_shader_output_point_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31)) + { + ret = GLEW_ATIX_vertex_shader_output_point_size; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) + { +#ifdef GL_ATI_draw_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) + { + ret = GLEW_ATI_draw_buffers; + continue; + } +#endif +#ifdef GL_ATI_element_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) + { + ret = GLEW_ATI_element_array; + continue; + } +#endif +#ifdef GL_ATI_envmap_bumpmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14)) + { + ret = GLEW_ATI_envmap_bumpmap; + continue; + } +#endif +#ifdef GL_ATI_fragment_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) + { + ret = GLEW_ATI_fragment_shader; + continue; + } +#endif +#ifdef GL_ATI_map_object_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17)) + { + ret = GLEW_ATI_map_object_buffer; + continue; + } +#endif +#ifdef GL_ATI_pn_triangles + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12)) + { + ret = GLEW_ATI_pn_triangles; + continue; + } +#endif +#ifdef GL_ATI_separate_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16)) + { + ret = GLEW_ATI_separate_stencil; + continue; + } +#endif +#ifdef GL_ATI_shader_texture_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) + { + ret = GLEW_ATI_shader_texture_lod; + continue; + } +#endif +#ifdef GL_ATI_text_fragment_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20)) + { + ret = GLEW_ATI_text_fragment_shader; + continue; + } +#endif +#ifdef GL_ATI_texture_compression_3dc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23)) + { + ret = GLEW_ATI_texture_compression_3dc; + continue; + } +#endif +#ifdef GL_ATI_texture_env_combine3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) + { + ret = GLEW_ATI_texture_env_combine3; + continue; + } +#endif +#ifdef GL_ATI_texture_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) + { + ret = GLEW_ATI_texture_float; + continue; + } +#endif +#ifdef GL_ATI_texture_mirror_once + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19)) + { + ret = GLEW_ATI_texture_mirror_once; + continue; + } +#endif +#ifdef GL_ATI_vertex_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) + { + ret = GLEW_ATI_vertex_array_object; + continue; + } +#endif +#ifdef GL_ATI_vertex_attrib_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26)) + { + ret = GLEW_ATI_vertex_attrib_array_object; + continue; + } +#endif +#ifdef GL_ATI_vertex_streams + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14)) + { + ret = GLEW_ATI_vertex_streams; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) + { +#ifdef GL_EXT_422_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10)) + { + ret = GLEW_EXT_422_pixels; + continue; + } +#endif +#ifdef GL_EXT_Cg_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9)) + { + ret = GLEW_EXT_Cg_shader; + continue; + } +#endif +#ifdef GL_EXT_abgr + if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4)) + { + ret = GLEW_EXT_abgr; + continue; + } +#endif +#ifdef GL_EXT_bgra + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4)) + { + ret = GLEW_EXT_bgra; + continue; + } +#endif +#ifdef GL_EXT_bindable_uniform + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindable_uniform", 16)) + { + ret = GLEW_EXT_bindable_uniform; + continue; + } +#endif +#ifdef GL_EXT_blend_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11)) + { + ret = GLEW_EXT_blend_color; + continue; + } +#endif +#ifdef GL_EXT_blend_equation_separate + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) + { + ret = GLEW_EXT_blend_equation_separate; + continue; + } +#endif +#ifdef GL_EXT_blend_func_separate + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) + { + ret = GLEW_EXT_blend_func_separate; + continue; + } +#endif +#ifdef GL_EXT_blend_logic_op + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14)) + { + ret = GLEW_EXT_blend_logic_op; + continue; + } +#endif +#ifdef GL_EXT_blend_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12)) + { + ret = GLEW_EXT_blend_minmax; + continue; + } +#endif +#ifdef GL_EXT_blend_subtract + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) + { + ret = GLEW_EXT_blend_subtract; + continue; + } +#endif +#ifdef GL_EXT_clip_volume_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16)) + { + ret = GLEW_EXT_clip_volume_hint; + continue; + } +#endif +#ifdef GL_EXT_cmyka + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5)) + { + ret = GLEW_EXT_cmyka; + continue; + } +#endif +#ifdef GL_EXT_color_subtable + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14)) + { + ret = GLEW_EXT_color_subtable; + continue; + } +#endif +#ifdef GL_EXT_compiled_vertex_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21)) + { + ret = GLEW_EXT_compiled_vertex_array; + continue; + } +#endif +#ifdef GL_EXT_convolution + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11)) + { + ret = GLEW_EXT_convolution; + continue; + } +#endif +#ifdef GL_EXT_coordinate_frame + if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16)) + { + ret = GLEW_EXT_coordinate_frame; + continue; + } +#endif +#ifdef GL_EXT_copy_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12)) + { + ret = GLEW_EXT_copy_texture; + continue; + } +#endif +#ifdef GL_EXT_cull_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) + { + ret = GLEW_EXT_cull_vertex; + continue; + } +#endif +#ifdef GL_EXT_depth_bounds_test + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17)) + { + ret = GLEW_EXT_depth_bounds_test; + continue; + } +#endif +#ifdef GL_EXT_draw_buffers2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers2", 13)) + { + ret = GLEW_EXT_draw_buffers2; + continue; + } +#endif +#ifdef GL_EXT_draw_instanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) + { + ret = GLEW_EXT_draw_instanced; + continue; + } +#endif +#ifdef GL_EXT_draw_range_elements + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19)) + { + ret = GLEW_EXT_draw_range_elements; + continue; + } +#endif +#ifdef GL_EXT_fog_coord + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9)) + { + ret = GLEW_EXT_fog_coord; + continue; + } +#endif +#ifdef GL_EXT_fragment_lighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17)) + { + ret = GLEW_EXT_fragment_lighting; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_blit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) + { + ret = GLEW_EXT_framebuffer_blit; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) + { + ret = GLEW_EXT_framebuffer_multisample; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) + { + ret = GLEW_EXT_framebuffer_object; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = GLEW_EXT_framebuffer_sRGB; + continue; + } +#endif +#ifdef GL_EXT_geometry_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) + { + ret = GLEW_EXT_geometry_shader4; + continue; + } +#endif +#ifdef GL_EXT_gpu_program_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_parameters", 22)) + { + ret = GLEW_EXT_gpu_program_parameters; + continue; + } +#endif +#ifdef GL_EXT_gpu_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader4", 11)) + { + ret = GLEW_EXT_gpu_shader4; + continue; + } +#endif +#ifdef GL_EXT_histogram + if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9)) + { + ret = GLEW_EXT_histogram; + continue; + } +#endif +#ifdef GL_EXT_index_array_formats + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19)) + { + ret = GLEW_EXT_index_array_formats; + continue; + } +#endif +#ifdef GL_EXT_index_func + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10)) + { + ret = GLEW_EXT_index_func; + continue; + } +#endif +#ifdef GL_EXT_index_material + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14)) + { + ret = GLEW_EXT_index_material; + continue; + } +#endif +#ifdef GL_EXT_index_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13)) + { + ret = GLEW_EXT_index_texture; + continue; + } +#endif +#ifdef GL_EXT_light_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13)) + { + ret = GLEW_EXT_light_texture; + continue; + } +#endif +#ifdef GL_EXT_misc_attribute + if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14)) + { + ret = GLEW_EXT_misc_attribute; + continue; + } +#endif +#ifdef GL_EXT_multi_draw_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17)) + { + ret = GLEW_EXT_multi_draw_arrays; + continue; + } +#endif +#ifdef GL_EXT_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_EXT_multisample; + continue; + } +#endif +#ifdef GL_EXT_packed_depth_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) + { + ret = GLEW_EXT_packed_depth_stencil; + continue; + } +#endif +#ifdef GL_EXT_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) + { + ret = GLEW_EXT_packed_float; + continue; + } +#endif +#ifdef GL_EXT_packed_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13)) + { + ret = GLEW_EXT_packed_pixels; + continue; + } +#endif +#ifdef GL_EXT_paletted_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16)) + { + ret = GLEW_EXT_paletted_texture; + continue; + } +#endif +#ifdef GL_EXT_pixel_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) + { + ret = GLEW_EXT_pixel_buffer_object; + continue; + } +#endif +#ifdef GL_EXT_pixel_transform + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15)) + { + ret = GLEW_EXT_pixel_transform; + continue; + } +#endif +#ifdef GL_EXT_pixel_transform_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27)) + { + ret = GLEW_EXT_pixel_transform_color_table; + continue; + } +#endif +#ifdef GL_EXT_point_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) + { + ret = GLEW_EXT_point_parameters; + continue; + } +#endif +#ifdef GL_EXT_polygon_offset + if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14)) + { + ret = GLEW_EXT_polygon_offset; + continue; + } +#endif +#ifdef GL_EXT_rescale_normal + if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14)) + { + ret = GLEW_EXT_rescale_normal; + continue; + } +#endif +#ifdef GL_EXT_scene_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) + { + ret = GLEW_EXT_scene_marker; + continue; + } +#endif +#ifdef GL_EXT_secondary_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15)) + { + ret = GLEW_EXT_secondary_color; + continue; + } +#endif +#ifdef GL_EXT_separate_specular_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23)) + { + ret = GLEW_EXT_separate_specular_color; + continue; + } +#endif +#ifdef GL_EXT_shadow_funcs + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12)) + { + ret = GLEW_EXT_shadow_funcs; + continue; + } +#endif +#ifdef GL_EXT_shared_texture_palette + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22)) + { + ret = GLEW_EXT_shared_texture_palette; + continue; + } +#endif +#ifdef GL_EXT_stencil_clear_tag + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17)) + { + ret = GLEW_EXT_stencil_clear_tag; + continue; + } +#endif +#ifdef GL_EXT_stencil_two_side + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16)) + { + ret = GLEW_EXT_stencil_two_side; + continue; + } +#endif +#ifdef GL_EXT_stencil_wrap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12)) + { + ret = GLEW_EXT_stencil_wrap; + continue; + } +#endif +#ifdef GL_EXT_subtexture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10)) + { + ret = GLEW_EXT_subtexture; + continue; + } +#endif +#ifdef GL_EXT_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7)) + { + ret = GLEW_EXT_texture; + continue; + } +#endif +#ifdef GL_EXT_texture3D + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9)) + { + ret = GLEW_EXT_texture3D; + continue; + } +#endif +#ifdef GL_EXT_texture_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) + { + ret = GLEW_EXT_texture_array; + continue; + } +#endif +#ifdef GL_EXT_texture_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) + { + ret = GLEW_EXT_texture_buffer_object; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_dxt1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) + { + ret = GLEW_EXT_texture_compression_dxt1; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_latc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) + { + ret = GLEW_EXT_texture_compression_latc; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_rgtc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) + { + ret = GLEW_EXT_texture_compression_rgtc; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_s3tc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) + { + ret = GLEW_EXT_texture_compression_s3tc; + continue; + } +#endif +#ifdef GL_EXT_texture_cube_map + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) + { + ret = GLEW_EXT_texture_cube_map; + continue; + } +#endif +#ifdef GL_EXT_texture_edge_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) + { + ret = GLEW_EXT_texture_edge_clamp; + continue; + } +#endif +#ifdef GL_EXT_texture_env + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11)) + { + ret = GLEW_EXT_texture_env; + continue; + } +#endif +#ifdef GL_EXT_texture_env_add + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) + { + ret = GLEW_EXT_texture_env_add; + continue; + } +#endif +#ifdef GL_EXT_texture_env_combine + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) + { + ret = GLEW_EXT_texture_env_combine; + continue; + } +#endif +#ifdef GL_EXT_texture_env_dot3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) + { + ret = GLEW_EXT_texture_env_dot3; + continue; + } +#endif +#ifdef GL_EXT_texture_filter_anisotropic + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) + { + ret = GLEW_EXT_texture_filter_anisotropic; + continue; + } +#endif +#ifdef GL_EXT_texture_integer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_integer", 15)) + { + ret = GLEW_EXT_texture_integer; + continue; + } +#endif +#ifdef GL_EXT_texture_lod_bias + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) + { + ret = GLEW_EXT_texture_lod_bias; + continue; + } +#endif +#ifdef GL_EXT_texture_mirror_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20)) + { + ret = GLEW_EXT_texture_mirror_clamp; + continue; + } +#endif +#ifdef GL_EXT_texture_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14)) + { + ret = GLEW_EXT_texture_object; + continue; + } +#endif +#ifdef GL_EXT_texture_perturb_normal + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22)) + { + ret = GLEW_EXT_texture_perturb_normal; + continue; + } +#endif +#ifdef GL_EXT_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) + { + ret = GLEW_EXT_texture_rectangle; + continue; + } +#endif +#ifdef GL_EXT_texture_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12)) + { + ret = GLEW_EXT_texture_sRGB; + continue; + } +#endif +#ifdef GL_EXT_texture_shared_exponent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23)) + { + ret = GLEW_EXT_texture_shared_exponent; + continue; + } +#endif +#ifdef GL_EXT_timer_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) + { + ret = GLEW_EXT_timer_query; + continue; + } +#endif +#ifdef GL_EXT_vertex_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12)) + { + ret = GLEW_EXT_vertex_array; + continue; + } +#endif +#ifdef GL_EXT_vertex_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) + { + ret = GLEW_EXT_vertex_shader; + continue; + } +#endif +#ifdef GL_EXT_vertex_weighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16)) + { + ret = GLEW_EXT_vertex_weighting; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8)) + { +#ifdef GL_GREMEDY_frame_terminator + if (_glewStrSame3(&pos, &len, (const GLubyte*)"frame_terminator", 16)) + { + ret = GLEW_GREMEDY_frame_terminator; + continue; + } +#endif +#ifdef GL_GREMEDY_string_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13)) + { + ret = GLEW_GREMEDY_string_marker; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3)) + { +#ifdef GL_HP_convolution_border_modes + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) + { + ret = GLEW_HP_convolution_border_modes; + continue; + } +#endif +#ifdef GL_HP_image_transform + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15)) + { + ret = GLEW_HP_image_transform; + continue; + } +#endif +#ifdef GL_HP_occlusion_test + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14)) + { + ret = GLEW_HP_occlusion_test; + continue; + } +#endif +#ifdef GL_HP_texture_lighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16)) + { + ret = GLEW_HP_texture_lighting; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4)) + { +#ifdef GL_IBM_cull_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) + { + ret = GLEW_IBM_cull_vertex; + continue; + } +#endif +#ifdef GL_IBM_multimode_draw_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21)) + { + ret = GLEW_IBM_multimode_draw_arrays; + continue; + } +#endif +#ifdef GL_IBM_rasterpos_clip + if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14)) + { + ret = GLEW_IBM_rasterpos_clip; + continue; + } +#endif +#ifdef GL_IBM_static_data + if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11)) + { + ret = GLEW_IBM_static_data; + continue; + } +#endif +#ifdef GL_IBM_texture_mirrored_repeat + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) + { + ret = GLEW_IBM_texture_mirrored_repeat; + continue; + } +#endif +#ifdef GL_IBM_vertex_array_lists + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18)) + { + ret = GLEW_IBM_vertex_array_lists; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5)) + { +#ifdef GL_INGR_color_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11)) + { + ret = GLEW_INGR_color_clamp; + continue; + } +#endif +#ifdef GL_INGR_interlace_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14)) + { + ret = GLEW_INGR_interlace_read; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) + { +#ifdef GL_INTEL_parallel_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) + { + ret = GLEW_INTEL_parallel_arrays; + continue; + } +#endif +#ifdef GL_INTEL_texture_scissor + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15)) + { + ret = GLEW_INTEL_texture_scissor; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4)) + { +#ifdef GL_KTX_buffer_region + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) + { + ret = GLEW_KTX_buffer_region; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6)) + { +#ifdef GL_MESAX_texture_stack + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13)) + { + ret = GLEW_MESAX_texture_stack; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) + { +#ifdef GL_MESA_pack_invert + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11)) + { + ret = GLEW_MESA_pack_invert; + continue; + } +#endif +#ifdef GL_MESA_resize_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14)) + { + ret = GLEW_MESA_resize_buffers; + continue; + } +#endif +#ifdef GL_MESA_window_pos + if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) + { + ret = GLEW_MESA_window_pos; + continue; + } +#endif +#ifdef GL_MESA_ycbcr_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13)) + { + ret = GLEW_MESA_ycbcr_texture; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) + { +#ifdef GL_NV_blend_square + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) + { + ret = GLEW_NV_blend_square; + continue; + } +#endif +#ifdef GL_NV_copy_depth_to_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19)) + { + ret = GLEW_NV_copy_depth_to_color; + continue; + } +#endif +#ifdef GL_NV_depth_buffer_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) + { + ret = GLEW_NV_depth_buffer_float; + continue; + } +#endif +#ifdef GL_NV_depth_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) + { + ret = GLEW_NV_depth_clamp; + continue; + } +#endif +#ifdef GL_NV_depth_range_unclamped + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_range_unclamped", 21)) + { + ret = GLEW_NV_depth_range_unclamped; + continue; + } +#endif +#ifdef GL_NV_evaluators + if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) + { + ret = GLEW_NV_evaluators; + continue; + } +#endif +#ifdef GL_NV_fence + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) + { + ret = GLEW_NV_fence; + continue; + } +#endif +#ifdef GL_NV_float_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) + { + ret = GLEW_NV_float_buffer; + continue; + } +#endif +#ifdef GL_NV_fog_distance + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12)) + { + ret = GLEW_NV_fog_distance; + continue; + } +#endif +#ifdef GL_NV_fragment_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) + { + ret = GLEW_NV_fragment_program; + continue; + } +#endif +#ifdef GL_NV_fragment_program2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17)) + { + ret = GLEW_NV_fragment_program2; + continue; + } +#endif +#ifdef GL_NV_fragment_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program4", 17)) + { + ret = GLEW_NV_fragment_program4; + continue; + } +#endif +#ifdef GL_NV_fragment_program_option + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23)) + { + ret = GLEW_NV_fragment_program_option; + continue; + } +#endif +#ifdef GL_NV_framebuffer_multisample_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_coverage", 32)) + { + ret = GLEW_NV_framebuffer_multisample_coverage; + continue; + } +#endif +#ifdef GL_NV_geometry_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_program4", 17)) + { + ret = GLEW_NV_geometry_program4; + continue; + } +#endif +#ifdef GL_NV_geometry_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) + { + ret = GLEW_NV_geometry_shader4; + continue; + } +#endif +#ifdef GL_NV_gpu_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program4", 12)) + { + ret = GLEW_NV_gpu_program4; + continue; + } +#endif +#ifdef GL_NV_half_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10)) + { + ret = GLEW_NV_half_float; + continue; + } +#endif +#ifdef GL_NV_light_max_exponent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18)) + { + ret = GLEW_NV_light_max_exponent; + continue; + } +#endif +#ifdef GL_NV_multisample_filter_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23)) + { + ret = GLEW_NV_multisample_filter_hint; + continue; + } +#endif +#ifdef GL_NV_occlusion_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) + { + ret = GLEW_NV_occlusion_query; + continue; + } +#endif +#ifdef GL_NV_packed_depth_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) + { + ret = GLEW_NV_packed_depth_stencil; + continue; + } +#endif +#ifdef GL_NV_parameter_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object", 23)) + { + ret = GLEW_NV_parameter_buffer_object; + continue; + } +#endif +#ifdef GL_NV_pixel_data_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16)) + { + ret = GLEW_NV_pixel_data_range; + continue; + } +#endif +#ifdef GL_NV_point_sprite + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) + { + ret = GLEW_NV_point_sprite; + continue; + } +#endif +#ifdef GL_NV_primitive_restart + if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17)) + { + ret = GLEW_NV_primitive_restart; + continue; + } +#endif +#ifdef GL_NV_register_combiners + if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18)) + { + ret = GLEW_NV_register_combiners; + continue; + } +#endif +#ifdef GL_NV_register_combiners2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19)) + { + ret = GLEW_NV_register_combiners2; + continue; + } +#endif +#ifdef GL_NV_texgen_emboss + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13)) + { + ret = GLEW_NV_texgen_emboss; + continue; + } +#endif +#ifdef GL_NV_texgen_reflection + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17)) + { + ret = GLEW_NV_texgen_reflection; + continue; + } +#endif +#ifdef GL_NV_texture_compression_vtc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23)) + { + ret = GLEW_NV_texture_compression_vtc; + continue; + } +#endif +#ifdef GL_NV_texture_env_combine4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20)) + { + ret = GLEW_NV_texture_env_combine4; + continue; + } +#endif +#ifdef GL_NV_texture_expand_normal + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21)) + { + ret = GLEW_NV_texture_expand_normal; + continue; + } +#endif +#ifdef GL_NV_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) + { + ret = GLEW_NV_texture_rectangle; + continue; + } +#endif +#ifdef GL_NV_texture_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14)) + { + ret = GLEW_NV_texture_shader; + continue; + } +#endif +#ifdef GL_NV_texture_shader2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15)) + { + ret = GLEW_NV_texture_shader2; + continue; + } +#endif +#ifdef GL_NV_texture_shader3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15)) + { + ret = GLEW_NV_texture_shader3; + continue; + } +#endif +#ifdef GL_NV_transform_feedback + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) + { + ret = GLEW_NV_transform_feedback; + continue; + } +#endif +#ifdef GL_NV_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = GLEW_NV_vertex_array_range; + continue; + } +#endif +#ifdef GL_NV_vertex_array_range2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19)) + { + ret = GLEW_NV_vertex_array_range2; + continue; + } +#endif +#ifdef GL_NV_vertex_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) + { + ret = GLEW_NV_vertex_program; + continue; + } +#endif +#ifdef GL_NV_vertex_program1_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17)) + { + ret = GLEW_NV_vertex_program1_1; + continue; + } +#endif +#ifdef GL_NV_vertex_program2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15)) + { + ret = GLEW_NV_vertex_program2; + continue; + } +#endif +#ifdef GL_NV_vertex_program2_option + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22)) + { + ret = GLEW_NV_vertex_program2_option; + continue; + } +#endif +#ifdef GL_NV_vertex_program3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15)) + { + ret = GLEW_NV_vertex_program3; + continue; + } +#endif +#ifdef GL_NV_vertex_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program4", 15)) + { + ret = GLEW_NV_vertex_program4; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OES_", 4)) + { +#ifdef GL_OES_byte_coordinates + if (_glewStrSame3(&pos, &len, (const GLubyte*)"byte_coordinates", 16)) + { + ret = GLEW_OES_byte_coordinates; + continue; + } +#endif +#ifdef GL_OES_compressed_paletted_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_paletted_texture", 27)) + { + ret = GLEW_OES_compressed_paletted_texture; + continue; + } +#endif +#ifdef GL_OES_read_format + if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format", 11)) + { + ret = GLEW_OES_read_format; + continue; + } +#endif +#ifdef GL_OES_single_precision + if (_glewStrSame3(&pos, &len, (const GLubyte*)"single_precision", 16)) + { + ret = GLEW_OES_single_precision; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) + { +#ifdef GL_OML_interlace + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) + { + ret = GLEW_OML_interlace; + continue; + } +#endif +#ifdef GL_OML_resample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) + { + ret = GLEW_OML_resample; + continue; + } +#endif +#ifdef GL_OML_subsample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) + { + ret = GLEW_OML_subsample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4)) + { +#ifdef GL_PGI_misc_hints + if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10)) + { + ret = GLEW_PGI_misc_hints; + continue; + } +#endif +#ifdef GL_PGI_vertex_hints + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12)) + { + ret = GLEW_PGI_vertex_hints; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5)) + { +#ifdef GL_REND_screen_coordinates + if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18)) + { + ret = GLEW_REND_screen_coordinates; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3)) + { +#ifdef GL_S3_s3tc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4)) + { + ret = GLEW_S3_s3tc; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) + { +#ifdef GL_SGIS_color_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) + { + ret = GLEW_SGIS_color_range; + continue; + } +#endif +#ifdef GL_SGIS_detail_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14)) + { + ret = GLEW_SGIS_detail_texture; + continue; + } +#endif +#ifdef GL_SGIS_fog_function + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12)) + { + ret = GLEW_SGIS_fog_function; + continue; + } +#endif +#ifdef GL_SGIS_generate_mipmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15)) + { + ret = GLEW_SGIS_generate_mipmap; + continue; + } +#endif +#ifdef GL_SGIS_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_SGIS_multisample; + continue; + } +#endif +#ifdef GL_SGIS_pixel_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) + { + ret = GLEW_SGIS_pixel_texture; + continue; + } +#endif +#ifdef GL_SGIS_sharpen_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15)) + { + ret = GLEW_SGIS_sharpen_texture; + continue; + } +#endif +#ifdef GL_SGIS_texture4D + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9)) + { + ret = GLEW_SGIS_texture4D; + continue; + } +#endif +#ifdef GL_SGIS_texture_border_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) + { + ret = GLEW_SGIS_texture_border_clamp; + continue; + } +#endif +#ifdef GL_SGIS_texture_edge_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) + { + ret = GLEW_SGIS_texture_edge_clamp; + continue; + } +#endif +#ifdef GL_SGIS_texture_filter4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15)) + { + ret = GLEW_SGIS_texture_filter4; + continue; + } +#endif +#ifdef GL_SGIS_texture_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11)) + { + ret = GLEW_SGIS_texture_lod; + continue; + } +#endif +#ifdef GL_SGIS_texture_select + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14)) + { + ret = GLEW_SGIS_texture_select; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) + { +#ifdef GL_SGIX_async + if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5)) + { + ret = GLEW_SGIX_async; + continue; + } +#endif +#ifdef GL_SGIX_async_histogram + if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15)) + { + ret = GLEW_SGIX_async_histogram; + continue; + } +#endif +#ifdef GL_SGIX_async_pixel + if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11)) + { + ret = GLEW_SGIX_async_pixel; + continue; + } +#endif +#ifdef GL_SGIX_blend_alpha_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18)) + { + ret = GLEW_SGIX_blend_alpha_minmax; + continue; + } +#endif +#ifdef GL_SGIX_clipmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7)) + { + ret = GLEW_SGIX_clipmap; + continue; + } +#endif +#ifdef GL_SGIX_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) + { + ret = GLEW_SGIX_depth_texture; + continue; + } +#endif +#ifdef GL_SGIX_flush_raster + if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12)) + { + ret = GLEW_SGIX_flush_raster; + continue; + } +#endif +#ifdef GL_SGIX_fog_offset + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10)) + { + ret = GLEW_SGIX_fog_offset; + continue; + } +#endif +#ifdef GL_SGIX_fog_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11)) + { + ret = GLEW_SGIX_fog_texture; + continue; + } +#endif +#ifdef GL_SGIX_fragment_specular_lighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26)) + { + ret = GLEW_SGIX_fragment_specular_lighting; + continue; + } +#endif +#ifdef GL_SGIX_framezoom + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9)) + { + ret = GLEW_SGIX_framezoom; + continue; + } +#endif +#ifdef GL_SGIX_interlace + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) + { + ret = GLEW_SGIX_interlace; + continue; + } +#endif +#ifdef GL_SGIX_ir_instrument1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14)) + { + ret = GLEW_SGIX_ir_instrument1; + continue; + } +#endif +#ifdef GL_SGIX_list_priority + if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13)) + { + ret = GLEW_SGIX_list_priority; + continue; + } +#endif +#ifdef GL_SGIX_pixel_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) + { + ret = GLEW_SGIX_pixel_texture; + continue; + } +#endif +#ifdef GL_SGIX_pixel_texture_bits + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18)) + { + ret = GLEW_SGIX_pixel_texture_bits; + continue; + } +#endif +#ifdef GL_SGIX_reference_plane + if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15)) + { + ret = GLEW_SGIX_reference_plane; + continue; + } +#endif +#ifdef GL_SGIX_resample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) + { + ret = GLEW_SGIX_resample; + continue; + } +#endif +#ifdef GL_SGIX_shadow + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) + { + ret = GLEW_SGIX_shadow; + continue; + } +#endif +#ifdef GL_SGIX_shadow_ambient + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) + { + ret = GLEW_SGIX_shadow_ambient; + continue; + } +#endif +#ifdef GL_SGIX_sprite + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6)) + { + ret = GLEW_SGIX_sprite; + continue; + } +#endif +#ifdef GL_SGIX_tag_sample_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17)) + { + ret = GLEW_SGIX_tag_sample_buffer; + continue; + } +#endif +#ifdef GL_SGIX_texture_add_env + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15)) + { + ret = GLEW_SGIX_texture_add_env; + continue; + } +#endif +#ifdef GL_SGIX_texture_coordinate_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24)) + { + ret = GLEW_SGIX_texture_coordinate_clamp; + continue; + } +#endif +#ifdef GL_SGIX_texture_lod_bias + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) + { + ret = GLEW_SGIX_texture_lod_bias; + continue; + } +#endif +#ifdef GL_SGIX_texture_multi_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20)) + { + ret = GLEW_SGIX_texture_multi_buffer; + continue; + } +#endif +#ifdef GL_SGIX_texture_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) + { + ret = GLEW_SGIX_texture_range; + continue; + } +#endif +#ifdef GL_SGIX_texture_scale_bias + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18)) + { + ret = GLEW_SGIX_texture_scale_bias; + continue; + } +#endif +#ifdef GL_SGIX_vertex_preclip + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14)) + { + ret = GLEW_SGIX_vertex_preclip; + continue; + } +#endif +#ifdef GL_SGIX_vertex_preclip_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19)) + { + ret = GLEW_SGIX_vertex_preclip_hint; + continue; + } +#endif +#ifdef GL_SGIX_ycrcb + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5)) + { + ret = GLEW_SGIX_ycrcb; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) + { +#ifdef GL_SGI_color_matrix + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12)) + { + ret = GLEW_SGI_color_matrix; + continue; + } +#endif +#ifdef GL_SGI_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11)) + { + ret = GLEW_SGI_color_table; + continue; + } +#endif +#ifdef GL_SGI_texture_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19)) + { + ret = GLEW_SGI_texture_color_table; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5)) + { +#ifdef GL_SUNX_constant_data + if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13)) + { + ret = GLEW_SUNX_constant_data; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) + { +#ifdef GL_SUN_convolution_border_modes + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) + { + ret = GLEW_SUN_convolution_border_modes; + continue; + } +#endif +#ifdef GL_SUN_global_alpha + if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12)) + { + ret = GLEW_SUN_global_alpha; + continue; + } +#endif +#ifdef GL_SUN_mesh_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10)) + { + ret = GLEW_SUN_mesh_array; + continue; + } +#endif +#ifdef GL_SUN_read_video_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17)) + { + ret = GLEW_SUN_read_video_pixels; + continue; + } +#endif +#ifdef GL_SUN_slice_accum + if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11)) + { + ret = GLEW_SUN_slice_accum; + continue; + } +#endif +#ifdef GL_SUN_triangle_list + if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13)) + { + ret = GLEW_SUN_triangle_list; + continue; + } +#endif +#ifdef GL_SUN_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6)) + { + ret = GLEW_SUN_vertex; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4)) + { +#ifdef GL_WIN_phong_shading + if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13)) + { + ret = GLEW_WIN_phong_shading; + continue; + } +#endif +#ifdef GL_WIN_specular_fog + if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12)) + { + ret = GLEW_WIN_specular_fog; + continue; + } +#endif +#ifdef GL_WIN_swap_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9)) + { + ret = GLEW_WIN_swap_hint; + continue; + } +#endif + } + } + ret = (len == 0); + } + return ret; +} + +#if defined(_WIN32) + +#if defined(GLEW_MX) +GLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name) +#else +GLboolean wglewIsSupported (const char* name) +#endif +{ + GLubyte* pos = (GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4)) + { + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) + { +#ifdef WGL_3DFX_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = WGLEW_3DFX_multisample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4)) + { +#ifdef WGL_3DL_stereo_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14)) + { + ret = WGLEW_3DL_stereo_control; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) + { +#ifdef WGL_ARB_buffer_region + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) + { + ret = WGLEW_ARB_buffer_region; + continue; + } +#endif +#ifdef WGL_ARB_extensions_string + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) + { + ret = WGLEW_ARB_extensions_string; + continue; + } +#endif +#ifdef WGL_ARB_make_current_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) + { + ret = WGLEW_ARB_make_current_read; + continue; + } +#endif +#ifdef WGL_ARB_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = WGLEW_ARB_multisample; + continue; + } +#endif +#ifdef WGL_ARB_pbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) + { + ret = WGLEW_ARB_pbuffer; + continue; + } +#endif +#ifdef WGL_ARB_pixel_format + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) + { + ret = WGLEW_ARB_pixel_format; + continue; + } +#endif +#ifdef WGL_ARB_pixel_format_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) + { + ret = WGLEW_ARB_pixel_format_float; + continue; + } +#endif +#ifdef WGL_ARB_render_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) + { + ret = WGLEW_ARB_render_texture; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) + { +#ifdef WGL_ATI_pixel_format_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) + { + ret = WGLEW_ATI_pixel_format_float; + continue; + } +#endif +#ifdef WGL_ATI_render_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) + { + ret = WGLEW_ATI_render_texture_rectangle; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) + { +#ifdef WGL_EXT_depth_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11)) + { + ret = WGLEW_EXT_depth_float; + continue; + } +#endif +#ifdef WGL_EXT_display_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19)) + { + ret = WGLEW_EXT_display_color_table; + continue; + } +#endif +#ifdef WGL_EXT_extensions_string + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) + { + ret = WGLEW_EXT_extensions_string; + continue; + } +#endif +#ifdef WGL_EXT_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = WGLEW_EXT_framebuffer_sRGB; + continue; + } +#endif +#ifdef WGL_EXT_make_current_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) + { + ret = WGLEW_EXT_make_current_read; + continue; + } +#endif +#ifdef WGL_EXT_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = WGLEW_EXT_multisample; + continue; + } +#endif +#ifdef WGL_EXT_pbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) + { + ret = WGLEW_EXT_pbuffer; + continue; + } +#endif +#ifdef WGL_EXT_pixel_format + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) + { + ret = WGLEW_EXT_pixel_format; + continue; + } +#endif +#ifdef WGL_EXT_pixel_format_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_packed_float", 25)) + { + ret = WGLEW_EXT_pixel_format_packed_float; + continue; + } +#endif +#ifdef WGL_EXT_swap_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) + { + ret = WGLEW_EXT_swap_control; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4)) + { +#ifdef WGL_I3D_digital_video_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21)) + { + ret = WGLEW_I3D_digital_video_control; + continue; + } +#endif +#ifdef WGL_I3D_gamma + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5)) + { + ret = WGLEW_I3D_gamma; + continue; + } +#endif +#ifdef WGL_I3D_genlock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7)) + { + ret = WGLEW_I3D_genlock; + continue; + } +#endif +#ifdef WGL_I3D_image_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12)) + { + ret = WGLEW_I3D_image_buffer; + continue; + } +#endif +#ifdef WGL_I3D_swap_frame_lock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15)) + { + ret = WGLEW_I3D_swap_frame_lock; + continue; + } +#endif +#ifdef WGL_I3D_swap_frame_usage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16)) + { + ret = WGLEW_I3D_swap_frame_usage; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) + { +#ifdef WGL_NV_float_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) + { + ret = WGLEW_NV_float_buffer; + continue; + } +#endif +#ifdef WGL_NV_gpu_affinity + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_affinity", 12)) + { + ret = WGLEW_NV_gpu_affinity; + continue; + } +#endif +#ifdef WGL_NV_render_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20)) + { + ret = WGLEW_NV_render_depth_texture; + continue; + } +#endif +#ifdef WGL_NV_render_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) + { + ret = WGLEW_NV_render_texture_rectangle; + continue; + } +#endif +#ifdef WGL_NV_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = WGLEW_NV_vertex_array_range; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) + { +#ifdef WGL_OML_sync_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) + { + ret = WGLEW_OML_sync_control; + continue; + } +#endif + } + } + ret = (len == 0); + } + return ret; +} + +#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) + +#if defined(GLEW_MX) +GLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name) +#else +GLboolean glxewIsSupported (const char* name) +#endif +{ + GLubyte* pos = (GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4)) + { + if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) + { +#ifdef GLX_VERSION_1_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) + { + ret = GLXEW_VERSION_1_2; + continue; + } +#endif +#ifdef GLX_VERSION_1_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) + { + ret = GLXEW_VERSION_1_3; + continue; + } +#endif +#ifdef GLX_VERSION_1_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) + { + ret = GLXEW_VERSION_1_4; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) + { +#ifdef GLX_3DFX_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLXEW_3DFX_multisample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) + { +#ifdef GLX_ARB_fbconfig_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14)) + { + ret = GLXEW_ARB_fbconfig_float; + continue; + } +#endif +#ifdef GLX_ARB_get_proc_address + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16)) + { + ret = GLXEW_ARB_get_proc_address; + continue; + } +#endif +#ifdef GLX_ARB_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLXEW_ARB_multisample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) + { +#ifdef GLX_ATI_pixel_format_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) + { + ret = GLXEW_ATI_pixel_format_float; + continue; + } +#endif +#ifdef GLX_ATI_render_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) + { + ret = GLXEW_ATI_render_texture; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) + { +#ifdef GLX_EXT_fbconfig_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21)) + { + ret = GLXEW_EXT_fbconfig_packed_float; + continue; + } +#endif +#ifdef GLX_EXT_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = GLXEW_EXT_framebuffer_sRGB; + continue; + } +#endif +#ifdef GLX_EXT_import_context + if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14)) + { + ret = GLXEW_EXT_import_context; + continue; + } +#endif +#ifdef GLX_EXT_scene_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) + { + ret = GLXEW_EXT_scene_marker; + continue; + } +#endif +#ifdef GLX_EXT_texture_from_pixmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) + { + ret = GLXEW_EXT_texture_from_pixmap; + continue; + } +#endif +#ifdef GLX_EXT_visual_info + if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11)) + { + ret = GLXEW_EXT_visual_info; + continue; + } +#endif +#ifdef GLX_EXT_visual_rating + if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13)) + { + ret = GLXEW_EXT_visual_rating; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) + { +#ifdef GLX_MESA_agp_offset + if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10)) + { + ret = GLXEW_MESA_agp_offset; + continue; + } +#endif +#ifdef GLX_MESA_copy_sub_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15)) + { + ret = GLXEW_MESA_copy_sub_buffer; + continue; + } +#endif +#ifdef GLX_MESA_pixmap_colormap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15)) + { + ret = GLXEW_MESA_pixmap_colormap; + continue; + } +#endif +#ifdef GLX_MESA_release_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15)) + { + ret = GLXEW_MESA_release_buffers; + continue; + } +#endif +#ifdef GLX_MESA_set_3dfx_mode + if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13)) + { + ret = GLXEW_MESA_set_3dfx_mode; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) + { +#ifdef GLX_NV_float_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) + { + ret = GLXEW_NV_float_buffer; + continue; + } +#endif +#ifdef GLX_NV_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = GLXEW_NV_vertex_array_range; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) + { +#ifdef GLX_OML_swap_method + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11)) + { + ret = GLXEW_OML_swap_method; + continue; + } +#endif +#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#include + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) + { + ret = GLXEW_OML_sync_control; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) + { +#ifdef GLX_SGIS_blended_overlay + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15)) + { + ret = GLXEW_SGIS_blended_overlay; + continue; + } +#endif +#ifdef GLX_SGIS_color_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) + { + ret = GLXEW_SGIS_color_range; + continue; + } +#endif +#ifdef GLX_SGIS_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLXEW_SGIS_multisample; + continue; + } +#endif +#ifdef GLX_SGIS_shared_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) + { + ret = GLXEW_SGIS_shared_multisample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) + { +#ifdef GLX_SGIX_fbconfig + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8)) + { + ret = GLXEW_SGIX_fbconfig; + continue; + } +#endif +#ifdef GLX_SGIX_hyperpipe + if (_glewStrSame3(&pos, &len, (const GLubyte*)"hyperpipe", 9)) + { + ret = GLXEW_SGIX_hyperpipe; + continue; + } +#endif +#ifdef GLX_SGIX_pbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) + { + ret = GLXEW_SGIX_pbuffer; + continue; + } +#endif +#ifdef GLX_SGIX_swap_barrier + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12)) + { + ret = GLXEW_SGIX_swap_barrier; + continue; + } +#endif +#ifdef GLX_SGIX_swap_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) + { + ret = GLXEW_SGIX_swap_group; + continue; + } +#endif +#ifdef GLX_SGIX_video_resize + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) + { + ret = GLXEW_SGIX_video_resize; + continue; + } +#endif +#ifdef GLX_SGIX_visual_select_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19)) + { + ret = GLXEW_SGIX_visual_select_group; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) + { +#ifdef GLX_SGI_cushion + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7)) + { + ret = GLXEW_SGI_cushion; + continue; + } +#endif +#ifdef GLX_SGI_make_current_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) + { + ret = GLXEW_SGI_make_current_read; + continue; + } +#endif +#ifdef GLX_SGI_swap_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) + { + ret = GLXEW_SGI_swap_control; + continue; + } +#endif +#ifdef GLX_SGI_video_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10)) + { + ret = GLXEW_SGI_video_sync; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) + { +#ifdef GLX_SUN_get_transparent_index + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21)) + { + ret = GLXEW_SUN_get_transparent_index; + continue; + } +#endif +#ifdef GLX_SUN_video_resize + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) + { + ret = GLXEW_SUN_video_resize; + continue; + } +#endif + } + } + ret = (len == 0); + } + return ret; +} + +#endif /* _WIN32 */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/glew.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/glew.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/glew.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/glew.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,10783 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Mesa 3-D graphics library + * Version: 7.0 + * + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* +** Copyright (c) 2007 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are 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 Materials. +** +** THE MATERIALS ARE 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 +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __glew_h__ +#define __glew_h__ +#define __GLEW_H__ + +#if defined(__gl_h_) || defined(__GL_H__) +#error gl.h included before glew.h +#endif +#if defined(__glext_h_) || defined(__GLEXT_H_) +#error glext.h included before glew.h +#endif +#if defined(__gl_ATI_h_) +#error glATI.h included before glew.h +#endif + +#define __gl_h_ +#define __GL_H__ +#define __glext_h_ +#define __GLEXT_H_ +#define __gl_ATI_h_ + +#if defined(_WIN32) + +/* + * GLEW does not include to avoid name space pollution. + * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t + * defined properly. + */ +/* */ +#ifndef APIENTRY +#define GLEW_APIENTRY_DEFINED +# if defined(__MINGW32__) +# define APIENTRY __stdcall +# elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) +# define APIENTRY __stdcall +# else +# define APIENTRY +# endif +#endif +#ifndef GLAPI +# if defined(__MINGW32__) +# define GLAPI extern +# endif +#endif +/* */ +#ifndef CALLBACK +#define GLEW_CALLBACK_DEFINED +# if defined(__MINGW32__) +# define CALLBACK __attribute__ ((__stdcall__)) +# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +#endif +/* and */ +#ifndef WINGDIAPI +#define GLEW_WINGDIAPI_DEFINED +#define WINGDIAPI __declspec(dllimport) +#endif +/* */ +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +#endif +/* */ +#if !defined(_W64) +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif +#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) +# ifdef _WIN64 +typedef __int64 ptrdiff_t; +# else +typedef _W64 int ptrdiff_t; +# endif +# define _PTRDIFF_T_DEFINED +# define _PTRDIFF_T_ +#endif + +#ifndef GLAPI +# if defined(__MINGW32__) +# define GLAPI extern +# else +# define GLAPI WINGDIAPI +# endif +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY APIENTRY +#endif + +/* + * GLEW_STATIC needs to be set when using the static version. + * GLEW_BUILD is set when building the DLL version. + */ +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#else /* _UNIX */ + +/* + * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO + * C. On my system, this amounts to _3 lines_ of included code, all of + * them pretty much harmless. If you know of a way of detecting 32 vs + * 64 _targets_ at compile time you are free to replace this with + * something that's portable. For now, _this_ is the portable solution. + * (mem, 2004-01-04) + */ + +#include + +#define GLEW_APIENTRY_DEFINED +#define APIENTRY +#define GLEWAPI extern + +/* */ +#ifndef GLAPI +#define GLAPI extern +#endif +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#endif /* _WIN32 */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ + +#ifndef GL_VERSION_1_1 +#define GL_VERSION_1_1 1 + +#if defined(__APPLE__) +typedef unsigned long GLenum; +typedef unsigned long GLbitfield; +typedef unsigned long GLuint; +typedef long GLint; +typedef long GLsizei; +#else +typedef unsigned int GLenum; +typedef unsigned int GLbitfield; +typedef unsigned int GLuint; +typedef int GLint; +typedef int GLsizei; +#endif +typedef unsigned char GLboolean; +typedef signed char GLbyte; +typedef short GLshort; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef unsigned long GLulong; +typedef float GLfloat; +typedef float GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void GLvoid; +#if defined(_MSC_VER) && _MSC_VER < 1400 +typedef __int64 GLint64EXT; +typedef unsigned __int64 GLuint64EXT; +#else +typedef signed long long GLint64EXT; +typedef unsigned long long GLuint64EXT; +#endif + +#define GL_ACCUM 0x0100 +#define GL_LOAD 0x0101 +#define GL_RETURN 0x0102 +#define GL_MULT 0x0103 +#define GL_ADD 0x0104 +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000fffff +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_TRUE 1 +#define GL_FALSE 0 +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A +#define GL_NONE 0 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LIST_MODE 0x0B30 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_SHADE_MODEL 0x0B54 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_FOG 0x0B60 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_NORMALIZE 0x0BA1 +#define GL_VIEWPORT 0x0BA2 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_DITHER 0x0BD0 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND 0x0BE2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_INDEX_MODE 0x0C30 +#define GL_RGBA_MODE 0x0C31 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_RENDER_MODE 0x0C40 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_INDEX_BITS 0x0D51 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_COLOR_INDEX 0x1900 +#define GL_STENCIL_INDEX 0x1901 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_BITMAP 0x1A00 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_RENDER 0x1C00 +#define GL_FEEDBACK 0x1C01 +#define GL_SELECT 0x1C02 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV 0x2300 +#define GL_EYE_LINEAR 0x2400 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_SPHERE_MAP 0x2402 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_PLANE 0x2502 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_CLAMP 0x2900 +#define GL_REPEAT 0x2901 +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_LOGIC_OP GL_INDEX_LOGIC_OP +#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 + +GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); +GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); +GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void GLAPIENTRY glArrayElement (GLint i); +GLAPI void GLAPIENTRY glBegin (GLenum mode); +GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); +GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GLAPI void GLAPIENTRY glCallList (GLuint list); +GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists); +GLAPI void GLAPIENTRY glClear (GLbitfield mask); +GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); +GLAPI void GLAPIENTRY glClearIndex (GLfloat c); +GLAPI void GLAPIENTRY glClearStencil (GLint s); +GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); +GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); +GLAPI void GLAPIENTRY glColor3iv (const GLint *v); +GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); +GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void GLAPIENTRY glColor4iv (const GLint *v); +GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); +GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); +GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); +GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); +GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glCullFace (GLenum mode); +GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); +GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GLAPI void GLAPIENTRY glDepthFunc (GLenum func); +GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); +GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); +GLAPI void GLAPIENTRY glDisable (GLenum cap); +GLAPI void GLAPIENTRY glDisableClientState (GLenum array); +GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); +GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); +GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); +GLAPI void GLAPIENTRY glEnable (GLenum cap); +GLAPI void GLAPIENTRY glEnableClientState (GLenum array); +GLAPI void GLAPIENTRY glEnd (void); +GLAPI void GLAPIENTRY glEndList (void); +GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); +GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); +GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); +GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); +GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); +GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); +GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); +GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); +GLAPI void GLAPIENTRY glFinish (void); +GLAPI void GLAPIENTRY glFlush (void); +GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glFrontFace (GLenum mode); +GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); +GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); +GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); +GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); +GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); +GLAPI GLenum GLAPIENTRY glGetError (void); +GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); +GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); +GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); +GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); +GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); +GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); +GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, GLvoid* *params); +GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); +GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); +GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); +GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); +GLAPI void GLAPIENTRY glIndexMask (GLuint mask); +GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glIndexd (GLdouble c); +GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); +GLAPI void GLAPIENTRY glIndexf (GLfloat c); +GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); +GLAPI void GLAPIENTRY glIndexi (GLint c); +GLAPI void GLAPIENTRY glIndexiv (const GLint *c); +GLAPI void GLAPIENTRY glIndexs (GLshort c); +GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); +GLAPI void GLAPIENTRY glIndexub (GLubyte c); +GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); +GLAPI void GLAPIENTRY glInitNames (void); +GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer); +GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); +GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); +GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); +GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); +GLAPI void GLAPIENTRY glLineWidth (GLfloat width); +GLAPI void GLAPIENTRY glListBase (GLuint base); +GLAPI void GLAPIENTRY glLoadIdentity (void); +GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glLoadName (GLuint name); +GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); +GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); +GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); +GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); +GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); +GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); +GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); +GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); +GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); +GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void GLAPIENTRY glPassThrough (GLfloat token); +GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); +GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); +GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); +GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); +GLAPI void GLAPIENTRY glPointSize (GLfloat size); +GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); +GLAPI void GLAPIENTRY glPopAttrib (void); +GLAPI void GLAPIENTRY glPopClientAttrib (void); +GLAPI void GLAPIENTRY glPopMatrix (void); +GLAPI void GLAPIENTRY glPopName (void); +GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); +GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushMatrix (void); +GLAPI void GLAPIENTRY glPushName (GLuint name); +GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); +GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); +GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); +GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); +GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); +GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); +GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); +GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); +GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); +GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); +GLAPI void GLAPIENTRY glShadeModel (GLenum mode); +GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GLAPI void GLAPIENTRY glStencilMask (GLuint mask); +GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); +GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); +GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord1i (GLint s); +GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); +GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); +GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); +GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); +GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) + +#endif /* GL_VERSION_1_1 */ + +/* ---------------------------------- GLU ---------------------------------- */ + +/* this is where we can safely include GLU */ +#if defined(__APPLE__) && defined(__MACH__) +#include +#else +#include +#endif + +/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 + +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E + +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); + +#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) +#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) +#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) +#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) + +#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) + +#endif /* GL_VERSION_1_2 */ + +/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 + +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_SUBTRACT 0x84E7 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_MULTISAMPLE_BIT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLvoid *img); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); + +#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) +#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) +#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) +#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) +#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) +#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) +#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) +#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) +#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) +#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) +#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) +#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) +#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) +#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) +#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) +#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) +#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) +#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) +#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) +#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) +#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) +#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) +#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) +#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) +#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) +#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) +#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) +#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) +#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) +#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) +#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) +#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) +#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) +#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) +#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) +#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) +#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) +#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) +#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) +#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) +#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) +#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) +#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) +#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) +#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) +#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) + +#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) + +#endif /* GL_VERSION_1_3 */ + +/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 + +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E + +typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); + +#define glBlendColor GLEW_GET_FUN(__glewBlendColor) +#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) +#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) +#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) +#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) +#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) +#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) +#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) +#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) +#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) +#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) +#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) +#define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) +#define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) +#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) +#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) +#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) +#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) +#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) +#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) +#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) +#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) +#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) +#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) +#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) +#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) +#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) +#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) +#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) +#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) +#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) +#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) +#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) +#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) +#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) +#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) +#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) +#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) +#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) +#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) +#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) +#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) +#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) +#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) +#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) +#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) +#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) + +#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) + +#endif /* GL_VERSION_1_4 */ + +/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 + +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 + +typedef ptrdiff_t GLsizeiptr; +typedef ptrdiff_t GLintptr; + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); +typedef GLvoid* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); + +#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) +#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) +#define glBufferData GLEW_GET_FUN(__glewBufferData) +#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) +#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) +#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) +#define glEndQuery GLEW_GET_FUN(__glewEndQuery) +#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) +#define glGenQueries GLEW_GET_FUN(__glewGenQueries) +#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) +#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) +#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) +#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) +#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) +#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) +#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) +#define glIsQuery GLEW_GET_FUN(__glewIsQuery) +#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) +#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) + +#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) + +#endif /* GL_VERSION_1_5 */ + +/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 + +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 + +typedef char GLchar; + +typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum, GLenum); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLint obj, GLsizei maxLength, GLsizei* length, GLchar* source); +typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLint programObj, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint, GLenum, GLdouble*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint, GLenum, GLfloat*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint, GLenum, GLint*); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar** strings, const GLint* lengths); +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum, GLuint); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + +#define glAttachShader GLEW_GET_FUN(__glewAttachShader) +#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) +#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) +#define glCompileShader GLEW_GET_FUN(__glewCompileShader) +#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) +#define glCreateShader GLEW_GET_FUN(__glewCreateShader) +#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) +#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) +#define glDetachShader GLEW_GET_FUN(__glewDetachShader) +#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) +#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) +#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) +#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) +#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) +#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) +#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) +#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) +#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) +#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) +#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) +#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) +#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) +#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) +#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) +#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) +#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) +#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) +#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) +#define glIsProgram GLEW_GET_FUN(__glewIsProgram) +#define glIsShader GLEW_GET_FUN(__glewIsShader) +#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) +#define glShaderSource GLEW_GET_FUN(__glewShaderSource) +#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) +#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) +#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) +#define glUniform1f GLEW_GET_FUN(__glewUniform1f) +#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) +#define glUniform1i GLEW_GET_FUN(__glewUniform1i) +#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) +#define glUniform2f GLEW_GET_FUN(__glewUniform2f) +#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) +#define glUniform2i GLEW_GET_FUN(__glewUniform2i) +#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) +#define glUniform3f GLEW_GET_FUN(__glewUniform3f) +#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) +#define glUniform3i GLEW_GET_FUN(__glewUniform3i) +#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) +#define glUniform4f GLEW_GET_FUN(__glewUniform4f) +#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) +#define glUniform4i GLEW_GET_FUN(__glewUniform4i) +#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) +#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) +#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) +#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) +#define glUseProgram GLEW_GET_FUN(__glewUseProgram) +#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) +#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) +#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) +#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) +#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) +#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) +#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) +#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) +#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) +#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) +#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) +#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) +#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) +#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) +#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) +#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) +#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) +#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) +#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) +#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) +#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) +#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) +#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) +#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) +#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) +#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) +#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) +#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) +#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) +#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) +#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) +#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) +#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) +#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) +#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) +#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) +#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) +#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) + +#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) + +#endif /* GL_VERSION_2_0 */ + +/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 + +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B + +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + +#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) +#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) +#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) +#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) +#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) +#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) + +#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) + +#endif /* GL_VERSION_2_1 */ + +/* -------------------------- GL_3DFX_multisample -------------------------- */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 + +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 + +#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) + +#endif /* GL_3DFX_multisample */ + +/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 + +typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); + +#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) + +#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) + +#endif /* GL_3DFX_tbuffer */ + +/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 + +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 + +#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) + +#endif /* GL_3DFX_texture_compression_FXT1 */ + +/* ------------------------ GL_APPLE_client_storage ------------------------ */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 + +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 + +#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) + +#endif /* GL_APPLE_client_storage */ + +/* ------------------------- GL_APPLE_element_array ------------------------ */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 + +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void* pointer); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); + +#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) +#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) +#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) +#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) +#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) + +#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) + +#endif /* GL_APPLE_element_array */ + +/* ----------------------------- GL_APPLE_fence ---------------------------- */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 + +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); + +#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) +#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) +#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) +#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) +#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) +#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) +#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) +#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) + +#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) + +#endif /* GL_APPLE_fence */ + +/* ------------------------- GL_APPLE_float_pixels ------------------------- */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 + +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F + +#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) + +#endif /* GL_APPLE_float_pixels */ + +/* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 + +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 + +typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); + +#define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) +#define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) + +#define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) + +#endif /* GL_APPLE_flush_buffer_range */ + +/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ + +#ifndef GL_APPLE_pixel_buffer +#define GL_APPLE_pixel_buffer 1 + +#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 + +#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) + +#endif /* GL_APPLE_pixel_buffer */ + +/* ------------------------ GL_APPLE_specular_vector ----------------------- */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 + +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 + +#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) + +#endif /* GL_APPLE_specular_vector */ + +/* ------------------------- GL_APPLE_texture_range ------------------------ */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 + +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid **params); +typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, GLvoid *pointer); + +#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) +#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) + +#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) + +#endif /* GL_APPLE_texture_range */ + +/* ------------------------ GL_APPLE_transform_hint ------------------------ */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 + +#define GL_TRANSFORM_HINT_APPLE 0x85B1 + +#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) + +#endif /* GL_APPLE_transform_hint */ + +/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); + +#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) +#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) +#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) +#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) + +#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) + +#endif /* GL_APPLE_vertex_array_object */ + +/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); + +#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) +#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) +#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) + +#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) + +#endif /* GL_APPLE_vertex_array_range */ + +/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 + +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB + +#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) + +#endif /* GL_APPLE_ycbcr_422 */ + +/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 + +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D + +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); + +#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) + +#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) + +#endif /* GL_ARB_color_buffer_float */ + +/* -------------------------- GL_ARB_depth_texture ------------------------- */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B + +#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) + +#endif /* GL_ARB_depth_texture */ + +/* -------------------------- GL_ARB_draw_buffers -------------------------- */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) + +#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) + +#endif /* GL_ARB_draw_buffers */ + +/* ------------------------ GL_ARB_fragment_program ------------------------ */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 + +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 + +#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) + +#endif /* GL_ARB_fragment_program */ + +/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 + +#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) + +#endif /* GL_ARB_fragment_program_shadow */ + +/* ------------------------- GL_ARB_fragment_shader ------------------------ */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 + +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B + +#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) + +#endif /* GL_ARB_fragment_shader */ + +/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 + +#define GL_HALF_FLOAT_ARB 0x140B + +#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) + +#endif /* GL_ARB_half_float_pixel */ + +/* ----------------------------- GL_ARB_imaging ---------------------------- */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 + +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_IGNORE_BORDER 0x8150 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_WRAP_BORDER 0x8152 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); + +#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) +#define glColorTable GLEW_GET_FUN(__glewColorTable) +#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) +#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) +#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) +#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) +#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) +#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) +#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) +#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) +#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) +#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) +#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) +#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) +#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) +#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) +#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) +#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) +#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) +#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) +#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) +#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) +#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) +#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) +#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) +#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) +#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) +#define glHistogram GLEW_GET_FUN(__glewHistogram) +#define glMinmax GLEW_GET_FUN(__glewMinmax) +#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) +#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) +#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) + +#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) + +#endif /* GL_ARB_imaging */ + +/* ------------------------- GL_ARB_matrix_palette ------------------------- */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 + +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 + +typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); + +#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) +#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) +#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) +#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) +#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) + +#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) + +#endif /* GL_ARB_matrix_palette */ + +/* --------------------------- GL_ARB_multisample -------------------------- */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 + +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); + +#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) + +#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) + +#endif /* GL_ARB_multisample */ + +/* -------------------------- GL_ARB_multitexture -------------------------- */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 + +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); + +#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) +#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) +#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) +#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) +#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) +#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) +#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) +#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) +#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) +#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) +#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) +#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) +#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) +#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) +#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) +#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) +#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) +#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) +#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) +#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) +#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) +#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) +#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) +#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) +#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) +#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) +#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) +#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) +#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) +#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) +#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) +#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) +#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) +#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) + +#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) + +#endif /* GL_ARB_multitexture */ + +/* ------------------------- GL_ARB_occlusion_query ------------------------ */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 + +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); + +#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) +#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) +#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) +#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) +#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) +#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) +#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) +#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) + +#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) + +#endif /* GL_ARB_occlusion_query */ + +/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF + +#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) + +#endif /* GL_ARB_pixel_buffer_object */ + +/* ------------------------ GL_ARB_point_parameters ------------------------ */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 + +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, GLfloat* params); + +#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) +#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) + +#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) + +#endif /* GL_ARB_point_parameters */ + +/* -------------------------- GL_ARB_point_sprite -------------------------- */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 + +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 + +#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) + +#endif /* GL_ARB_point_sprite */ + +/* ------------------------- GL_ARB_shader_objects ------------------------- */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 + +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 + +typedef char GLcharARB; +typedef unsigned int GLhandleARB; + +typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); +typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); + +#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) +#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) +#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) +#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) +#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) +#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) +#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) +#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) +#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) +#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) +#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) +#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) +#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) +#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) +#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) +#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) +#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) +#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) +#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) +#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) +#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) +#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) +#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) +#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) +#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) +#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) +#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) +#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) +#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) +#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) +#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) +#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) +#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) +#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) +#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) +#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) +#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) +#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) +#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) + +#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) + +#endif /* GL_ARB_shader_objects */ + +/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 + +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C + +#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) + +#endif /* GL_ARB_shading_language_100 */ + +/* ----------------------------- GL_ARB_shadow ----------------------------- */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 + +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E + +#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) + +#endif /* GL_ARB_shadow */ + +/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 + +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF + +#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) + +#endif /* GL_ARB_shadow_ambient */ + +/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_ARB 0x812D + +#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) + +#endif /* GL_ARB_texture_border_clamp */ + +/* ----------------------- GL_ARB_texture_compression ---------------------- */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 + +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 + +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void* img); + +#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) +#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) +#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) +#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) +#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) +#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) +#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) + +#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) + +#endif /* GL_ARB_texture_compression */ + +/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 + +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C + +#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) + +#endif /* GL_ARB_texture_cube_map */ + +/* ------------------------- GL_ARB_texture_env_add ------------------------ */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 + +#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) + +#endif /* GL_ARB_texture_env_add */ + +/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 + +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A + +#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) + +#endif /* GL_ARB_texture_env_combine */ + +/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 + +#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) + +#endif /* GL_ARB_texture_env_crossbar */ + +/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 + +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF + +#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) + +#endif /* GL_ARB_texture_env_dot3 */ + +/* -------------------------- GL_ARB_texture_float ------------------------- */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 + +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 + +#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) + +#endif /* GL_ARB_texture_float */ + +/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_ARB 0x8370 + +#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) + +#endif /* GL_ARB_texture_mirrored_repeat */ + +/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 + +#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) + +#endif /* GL_ARB_texture_non_power_of_two */ + +/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 + +#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) + +#endif /* GL_ARB_texture_rectangle */ + +/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 + +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 + +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); + +#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) +#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) +#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) +#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) + +#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) + +#endif /* GL_ARB_transpose_matrix */ + +/* -------------------------- GL_ARB_vertex_blend -------------------------- */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 + +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F + +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); +typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); + +#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) +#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) +#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) +#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) +#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) +#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) +#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) +#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) +#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) +#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) + +#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) + +#endif /* GL_ARB_vertex_blend */ + +/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 + +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA + +typedef ptrdiff_t GLsizeiptrARB; +typedef ptrdiff_t GLintptrARB; + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); + +#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) +#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) +#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) +#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) +#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) +#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) +#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) +#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) +#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) +#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) +#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) + +#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) + +#endif /* GL_ARB_vertex_buffer_object */ + +/* ------------------------- GL_ARB_vertex_program ------------------------- */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 + +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF + +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void* string); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void* string); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); + +#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) +#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) +#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) +#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) +#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) +#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) +#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) +#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) +#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) +#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) +#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) +#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) +#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) +#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) +#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) +#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) +#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) +#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) +#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) +#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) +#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) +#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) +#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) +#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) +#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) +#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) +#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) +#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) +#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) +#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) +#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) +#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) +#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) +#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) +#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) +#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) +#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) +#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) +#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) +#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) +#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) +#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) +#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) +#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) +#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) +#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) +#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) +#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) +#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) +#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) +#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) +#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) +#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) +#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) +#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) +#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) +#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) +#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) +#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) +#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) +#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) +#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) + +#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) + +#endif /* GL_ARB_vertex_program */ + +/* -------------------------- GL_ARB_vertex_shader ------------------------- */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 + +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A + +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); + +#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) +#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) +#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) + +#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) + +#endif /* GL_ARB_vertex_shader */ + +/* --------------------------- GL_ARB_window_pos --------------------------- */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); + +#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) +#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) +#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) +#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) +#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) +#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) +#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) +#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) +#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) +#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) +#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) +#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) +#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) +#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) +#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) +#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) + +#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) + +#endif /* GL_ARB_window_pos */ + +/* ------------------------- GL_ATIX_point_sprites ------------------------- */ + +#ifndef GL_ATIX_point_sprites +#define GL_ATIX_point_sprites 1 + +#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 +#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 +#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 +#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 +#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 +#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 + +#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) + +#endif /* GL_ATIX_point_sprites */ + +/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ + +#ifndef GL_ATIX_texture_env_combine3 +#define GL_ATIX_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATIX 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 +#define GL_MODULATE_SUBTRACT_ATIX 0x8746 + +#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) + +#endif /* GL_ATIX_texture_env_combine3 */ + +/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ + +#ifndef GL_ATIX_texture_env_route +#define GL_ATIX_texture_env_route 1 + +#define GL_SECONDARY_COLOR_ATIX 0x8747 +#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 +#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 + +#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) + +#endif /* GL_ATIX_texture_env_route */ + +/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ + +#ifndef GL_ATIX_vertex_shader_output_point_size +#define GL_ATIX_vertex_shader_output_point_size 1 + +#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E + +#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) + +#endif /* GL_ATIX_vertex_shader_output_point_size */ + +/* -------------------------- GL_ATI_draw_buffers -------------------------- */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) + +#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) + +#endif /* GL_ATI_draw_buffers */ + +/* -------------------------- GL_ATI_element_array ------------------------- */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 + +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void* pointer); + +#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) +#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) +#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) + +#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) + +#endif /* GL_ATI_element_array */ + +/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 + +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C + +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); + +#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) +#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) +#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) +#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) + +#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) + +#endif /* GL_ATI_envmap_bumpmap */ + +/* ------------------------- GL_ATI_fragment_shader ------------------------ */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 + +#define GL_RED_BIT_ATI 0x00000001 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B + +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); + +#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) +#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) +#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) +#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) +#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) +#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) +#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) +#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) +#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) +#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) +#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) +#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) +#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) +#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) + +#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) + +#endif /* GL_ATI_fragment_shader */ + +/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 + +typedef void* (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); + +#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) +#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) + +#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) + +#endif /* GL_ATI_map_object_buffer */ + +/* -------------------------- GL_ATI_pn_triangles -------------------------- */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 + +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 + +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); + +#define glPNTrianglesfATI GLEW_GET_FUN(__glPNTrianglewesfATI) +#define glPNTrianglesiATI GLEW_GET_FUN(__glPNTrianglewesiATI) + +#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) + +#endif /* GL_ATI_pn_triangles */ + +/* ------------------------ GL_ATI_separate_stencil ------------------------ */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 + +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 + +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + +#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) +#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) + +#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) + +#endif /* GL_ATI_separate_stencil */ + +/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ + +#ifndef GL_ATI_shader_texture_lod +#define GL_ATI_shader_texture_lod 1 + +#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) + +#endif /* GL_ATI_shader_texture_lod */ + +/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 + +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 + +#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) + +#endif /* GL_ATI_text_fragment_shader */ + +/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ + +#ifndef GL_ATI_texture_compression_3dc +#define GL_ATI_texture_compression_3dc 1 + +#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 + +#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) + +#endif /* GL_ATI_texture_compression_3dc */ + +/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 + +#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) + +#endif /* GL_ATI_texture_env_combine3 */ + +/* -------------------------- GL_ATI_texture_float ------------------------- */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 + +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F + +#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) + +#endif /* GL_ATI_texture_float */ + +/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 + +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 + +#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) + +#endif /* GL_ATI_texture_mirror_once */ + +/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 + +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 + +typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void* pointer, GLenum usage); +typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve); +typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + +#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) +#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) +#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) +#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) +#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) +#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) +#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) +#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) +#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) +#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) +#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) +#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) + +#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) + +#endif /* GL_ATI_vertex_array_object */ + +/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); + +#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) +#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) +#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) + +#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) + +#endif /* GL_ATI_vertex_attrib_array_object */ + +/* ------------------------- GL_ATI_vertex_streams ------------------------- */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 + +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_SOURCE_ATI 0x876C +#define GL_VERTEX_STREAM0_ATI 0x876D +#define GL_VERTEX_STREAM1_ATI 0x876E +#define GL_VERTEX_STREAM2_ATI 0x876F +#define GL_VERTEX_STREAM3_ATI 0x8770 +#define GL_VERTEX_STREAM4_ATI 0x8771 +#define GL_VERTEX_STREAM5_ATI 0x8772 +#define GL_VERTEX_STREAM6_ATI 0x8773 +#define GL_VERTEX_STREAM7_ATI 0x8774 + +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *v); + +#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) +#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) +#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) +#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) +#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) +#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) +#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) +#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) +#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) +#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) +#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) +#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) +#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) +#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) +#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) +#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) +#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) +#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) +#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) +#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) +#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) +#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) +#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) +#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) +#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) +#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) +#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) +#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) +#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) +#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) +#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) +#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) +#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) +#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) +#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) +#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) +#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) + +#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) + +#endif /* GL_ATI_vertex_streams */ + +/* --------------------------- GL_EXT_422_pixels --------------------------- */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 + +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF + +#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) + +#endif /* GL_EXT_422_pixels */ + +/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ + +#ifndef GL_EXT_Cg_shader +#define GL_EXT_Cg_shader 1 + +#define GL_CG_VERTEX_SHADER_EXT 0x890E +#define GL_CG_FRAGMENT_SHADER_EXT 0x890F + +#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) + +#endif /* GL_EXT_Cg_shader */ + +/* ------------------------------ GL_EXT_abgr ------------------------------ */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 + +#define GL_ABGR_EXT 0x8000 + +#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) + +#endif /* GL_EXT_abgr */ + +/* ------------------------------ GL_EXT_bgra ------------------------------ */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 + +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 + +#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) + +#endif /* GL_EXT_bgra */ + +/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 + +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF + +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); + +#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) +#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) +#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) + +#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) + +#endif /* GL_EXT_bindable_uniform */ + +/* --------------------------- GL_EXT_blend_color -------------------------- */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 + +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 + +typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + +#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) + +#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) + +#endif /* GL_EXT_blend_color */ + +/* --------------------- GL_EXT_blend_equation_separate -------------------- */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 + +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); + +#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) + +#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) + +#endif /* GL_EXT_blend_equation_separate */ + +/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 + +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB + +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + +#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) + +#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) + +#endif /* GL_EXT_blend_func_separate */ + +/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 + +#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) + +#endif /* GL_EXT_blend_logic_op */ + +/* -------------------------- GL_EXT_blend_minmax -------------------------- */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 + +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); + +#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) + +#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) + +#endif /* GL_EXT_blend_minmax */ + +/* ------------------------- GL_EXT_blend_subtract ------------------------- */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 + +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B + +#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) + +#endif /* GL_EXT_blend_subtract */ + +/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 + +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 + +#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) + +#endif /* GL_EXT_clip_volume_hint */ + +/* ------------------------------ GL_EXT_cmyka ----------------------------- */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 + +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F + +#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) + +#endif /* GL_EXT_cmyka */ + +/* ------------------------- GL_EXT_color_subtable ------------------------- */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + +#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) +#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) + +#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) + +#endif /* GL_EXT_color_subtable */ + +/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 + +typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); + +#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) +#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) + +#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) + +#endif /* GL_EXT_compiled_vertex_array */ + +/* --------------------------- GL_EXT_convolution -------------------------- */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 + +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 + +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column); + +#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) +#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) +#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) +#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) +#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) +#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) +#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) +#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) +#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) +#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) +#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) +#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) +#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) + +#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) + +#endif /* GL_EXT_convolution */ + +/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 + +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 + +typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); +typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); + +#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) +#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) + +#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) + +#endif /* GL_EXT_coordinate_frame */ + +/* -------------------------- GL_EXT_copy_texture -------------------------- */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 + +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) +#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) +#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) +#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) +#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) + +#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) + +#endif /* GL_EXT_copy_texture */ + +/* --------------------------- GL_EXT_cull_vertex -------------------------- */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 + +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); + +#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) +#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) + +#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) + +#endif /* GL_EXT_cull_vertex */ + +/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 + +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 + +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); + +#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) + +#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) + +#endif /* GL_EXT_depth_bounds_test */ + +/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 + +typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); + +#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) +#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) +#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) +#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) +#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) +#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) + +#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) + +#endif /* GL_EXT_draw_buffers2 */ + +/* ------------------------- GL_EXT_draw_instanced ------------------------- */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); + +#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) +#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) + +#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) + +#endif /* GL_EXT_draw_instanced */ + +/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 + +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 + +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); + +#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) + +#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) + +#endif /* GL_EXT_draw_range_elements */ + +/* ---------------------------- GL_EXT_fog_coord --------------------------- */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 + +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 + +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); + +#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) +#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) +#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) +#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) +#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) + +#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) + +#endif /* GL_EXT_fog_coord */ + +/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ + +#ifndef GL_EXT_fragment_lighting +#define GL_EXT_fragment_lighting 1 + +#define GL_FRAGMENT_LIGHTING_EXT 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 +#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 +#define GL_LIGHT_ENV_MODE_EXT 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B +#define GL_FRAGMENT_LIGHT0_EXT 0x840C +#define GL_FRAGMENT_LIGHT7_EXT 0x8413 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); + +#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) +#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) +#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) +#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) +#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) +#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) +#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) +#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) +#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) +#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) +#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) +#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) +#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) +#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) +#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) +#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) +#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) +#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) + +#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) + +#endif /* GL_EXT_fragment_lighting */ + +/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) + +#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) + +#endif /* GL_EXT_framebuffer_blit */ + +/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) + +#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) + +#endif /* GL_EXT_framebuffer_multisample */ + +/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) +#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) +#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) +#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) +#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) +#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) +#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) +#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) +#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) +#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) +#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) +#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) +#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) +#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) +#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) +#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) +#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) + +#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) + +#endif /* GL_EXT_framebuffer_object */ + +/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA + +#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) + +#endif /* GL_EXT_framebuffer_sRGB */ + +/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) +#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) +#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) +#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) + +#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) + +#endif /* GL_EXT_geometry_shader4 */ + +/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); + +#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) +#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) + +#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) + +#endif /* GL_EXT_gpu_program_parameters */ + +/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + +#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) +#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) +#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) +#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) +#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) +#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) +#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) +#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) +#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) +#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) +#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) +#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) +#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) +#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) +#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) +#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) +#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) +#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) +#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) +#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) +#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) +#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) +#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) +#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) +#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) +#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) +#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) +#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) +#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) +#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) +#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) +#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) +#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) +#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) + +#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) + +#endif /* GL_EXT_gpu_shader4 */ + +/* ---------------------------- GL_EXT_histogram --------------------------- */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 + +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 + +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); + +#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) +#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) +#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) +#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) +#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) +#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) +#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) +#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) +#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) +#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) + +#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) + +#endif /* GL_EXT_histogram */ + +/* ----------------------- GL_EXT_index_array_formats ---------------------- */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 + +#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) + +#endif /* GL_EXT_index_array_formats */ + +/* --------------------------- GL_EXT_index_func --------------------------- */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 + +typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); + +#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) + +#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) + +#endif /* GL_EXT_index_func */ + +/* ------------------------- GL_EXT_index_material ------------------------- */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 + +typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) + +#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) + +#endif /* GL_EXT_index_material */ + +/* -------------------------- GL_EXT_index_texture ------------------------- */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 + +#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) + +#endif /* GL_EXT_index_texture */ + +/* -------------------------- GL_EXT_light_texture ------------------------- */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 + +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 + +typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) +#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) +#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) + +#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) + +#endif /* GL_EXT_light_texture */ + +/* ------------------------- GL_EXT_misc_attribute ------------------------- */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 + +#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) + +#endif /* GL_EXT_misc_attribute */ + +/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint* first, GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount); + +#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) +#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) + +#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) + +#endif /* GL_EXT_multi_draw_arrays */ + +/* --------------------------- GL_EXT_multisample -------------------------- */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 + +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); + +#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) +#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) + +#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) + +#endif /* GL_EXT_multisample */ + +/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 + +#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) + +#endif /* GL_EXT_packed_depth_stencil */ + +/* -------------------------- GL_EXT_packed_float -------------------------- */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 + +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C + +#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) + +#endif /* GL_EXT_packed_float */ + +/* -------------------------- GL_EXT_packed_pixels ------------------------- */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 + +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 + +#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) + +#endif /* GL_EXT_packed_pixels */ + +/* ------------------------ GL_EXT_paletted_texture ------------------------ */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 + +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 +#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void* data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); + +#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) +#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) +#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) +#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) + +#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) + +#endif /* GL_EXT_paletted_texture */ + +/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF + +#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) + +#endif /* GL_EXT_pixel_buffer_object */ + +/* ------------------------- GL_EXT_pixel_transform ------------------------ */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 + +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 + +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) +#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) +#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) +#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) +#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) +#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) + +#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) + +#endif /* GL_EXT_pixel_transform */ + +/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 + +#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) + +#endif /* GL_EXT_pixel_transform_color_table */ + +/* ------------------------ GL_EXT_point_parameters ------------------------ */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 + +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); + +#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) +#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) + +#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) + +#endif /* GL_EXT_point_parameters */ + +/* ------------------------- GL_EXT_polygon_offset ------------------------- */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 + +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); + +#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) + +#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) + +#endif /* GL_EXT_polygon_offset */ + +/* ------------------------- GL_EXT_rescale_normal ------------------------- */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 + +#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) + +#endif /* GL_EXT_rescale_normal */ + +/* -------------------------- GL_EXT_scene_marker -------------------------- */ + +#ifndef GL_EXT_scene_marker +#define GL_EXT_scene_marker 1 + +typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); + +#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) +#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) + +#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) + +#endif /* GL_EXT_scene_marker */ + +/* ------------------------- GL_EXT_secondary_color ------------------------ */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 + +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E + +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); + +#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) +#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) +#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) +#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) +#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) +#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) +#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) +#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) +#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) +#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) +#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) +#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) +#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) +#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) +#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) +#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) +#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) + +#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) + +#endif /* GL_EXT_secondary_color */ + +/* --------------------- GL_EXT_separate_specular_color -------------------- */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 + +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA + +#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) + +#endif /* GL_EXT_separate_specular_color */ + +/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 + +#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) + +#endif /* GL_EXT_shadow_funcs */ + +/* --------------------- GL_EXT_shared_texture_palette --------------------- */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 + +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB + +#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) + +#endif /* GL_EXT_shared_texture_palette */ + +/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 + +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 + +#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) + +#endif /* GL_EXT_stencil_clear_tag */ + +/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 + +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 + +typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); + +#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) + +#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) + +#endif /* GL_EXT_stencil_two_side */ + +/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 + +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 + +#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) + +#endif /* GL_EXT_stencil_wrap */ + +/* --------------------------- GL_EXT_subtexture --------------------------- */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 + +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); + +#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) +#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) +#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) + +#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) + +#endif /* GL_EXT_subtexture */ + +/* ----------------------------- GL_EXT_texture ---------------------------- */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 + +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 + +#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) + +#endif /* GL_EXT_texture */ + +/* ---------------------------- GL_EXT_texture3D --------------------------- */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 + +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); + +#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) + +#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) + +#endif /* GL_EXT_texture3D */ + +/* -------------------------- GL_EXT_texture_array ------------------------- */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 + +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D + +#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) + +#endif /* GL_EXT_texture_array */ + +/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) + +#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) + +#endif /* GL_EXT_texture_buffer_object */ + +/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 + +#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) + +#endif /* GL_EXT_texture_compression_dxt1 */ + +/* -------------------- GL_EXT_texture_compression_latc -------------------- */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 + +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 + +#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) + +#endif /* GL_EXT_texture_compression_latc */ + +/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE + +#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) + +#endif /* GL_EXT_texture_compression_rgtc */ + +/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + +#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) + +#endif /* GL_EXT_texture_compression_s3tc */ + +/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 + +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C + +#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) + +#endif /* GL_EXT_texture_cube_map */ + +/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ + +#ifndef GL_EXT_texture_edge_clamp +#define GL_EXT_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_EXT 0x812F + +#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) + +#endif /* GL_EXT_texture_edge_clamp */ + +/* --------------------------- GL_EXT_texture_env -------------------------- */ + +#ifndef GL_EXT_texture_env +#define GL_EXT_texture_env 1 + +#define GL_TEXTURE_ENV0_EXT 0 +#define GL_ENV_BLEND_EXT 0 +#define GL_TEXTURE_ENV_SHIFT_EXT 0 +#define GL_ENV_REPLACE_EXT 0 +#define GL_ENV_ADD_EXT 0 +#define GL_ENV_SUBTRACT_EXT 0 +#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0 +#define GL_ENV_REVERSE_SUBTRACT_EXT 0 +#define GL_ENV_REVERSE_BLEND_EXT 0 +#define GL_ENV_COPY_EXT 0 +#define GL_ENV_MODULATE_EXT 0 + +#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) + +#endif /* GL_EXT_texture_env */ + +/* ------------------------- GL_EXT_texture_env_add ------------------------ */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 + +#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) + +#endif /* GL_EXT_texture_env_add */ + +/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 + +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A + +#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) + +#endif /* GL_EXT_texture_env_combine */ + +/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 + +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 + +#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) + +#endif /* GL_EXT_texture_env_dot3 */ + +/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + +#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) + +#endif /* GL_EXT_texture_filter_anisotropic */ + +/* ------------------------- GL_EXT_texture_integer ------------------------ */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 + +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E + +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); + +#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) +#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) +#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) +#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) +#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) +#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) + +#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) + +#endif /* GL_EXT_texture_integer */ + +/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 + +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 + +#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) + +#endif /* GL_EXT_texture_lod_bias */ + +/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 + +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 + +#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) + +#endif /* GL_EXT_texture_mirror_clamp */ + +/* ------------------------- GL_EXT_texture_object ------------------------- */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 + +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A + +typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); + +#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) +#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) +#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) +#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) +#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) +#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) + +#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) + +#endif /* GL_EXT_texture_object */ + +/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 + +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF + +typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); + +#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) + +#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) + +#endif /* GL_EXT_texture_perturb_normal */ + +/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ + +#ifndef GL_EXT_texture_rectangle +#define GL_EXT_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 + +#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) + +#endif /* GL_EXT_texture_rectangle */ + +/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 + +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F + +#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) + +#endif /* GL_EXT_texture_sRGB */ + +/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 + +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F + +#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) + +#endif /* GL_EXT_texture_shared_exponent */ + +/* --------------------------- GL_EXT_timer_query -------------------------- */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 + +#define GL_TIME_ELAPSED_EXT 0x88BF + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); + +#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) +#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) + +#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) + +#endif /* GL_EXT_timer_query */ + +/* -------------------------- GL_EXT_vertex_array -------------------------- */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 + +#define GL_DOUBLE_EXT 0x140A +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 + +typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); +typedef void (GLAPIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); + +#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) +#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) +#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) +#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) +#define glGetPointervEXT GLEW_GET_FUN(__glewGetPointervEXT) +#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) +#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) +#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) +#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) + +#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) + +#endif /* GL_EXT_vertex_array */ + +/* -------------------------- GL_EXT_vertex_shader ------------------------- */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 + +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED + +typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); +typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid **data); +typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); +typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + +#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) +#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) +#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) +#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) +#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) +#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) +#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) +#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) +#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) +#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) +#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) +#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) +#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) +#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) +#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) +#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) +#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) +#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) +#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) +#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) +#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) +#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) +#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) +#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) +#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) +#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) +#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) +#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) +#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) +#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) +#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) +#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) +#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) +#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) +#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) +#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) +#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) +#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) +#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) +#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) +#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) +#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) + +#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) + +#endif /* GL_EXT_vertex_shader */ + +/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 + +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 + +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); + +#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) +#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) +#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) + +#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) + +#endif /* GL_EXT_vertex_weighting */ + +/* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ + +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 + +typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); + +#define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) + +#define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) + +#endif /* GL_GREMEDY_frame_terminator */ + +/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 + +typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void* string); + +#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) + +#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) + +#endif /* GL_GREMEDY_string_marker */ + +/* --------------------- GL_HP_convolution_border_modes -------------------- */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 + +#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) + +#endif /* GL_HP_convolution_border_modes */ + +/* ------------------------- GL_HP_image_transform ------------------------- */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 + +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) +#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) +#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) +#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) +#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) +#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) + +#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) + +#endif /* GL_HP_image_transform */ + +/* -------------------------- GL_HP_occlusion_test ------------------------- */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 + +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 + +#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) + +#endif /* GL_HP_occlusion_test */ + +/* ------------------------- GL_HP_texture_lighting ------------------------ */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 + +#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) + +#endif /* GL_HP_texture_lighting */ + +/* --------------------------- GL_IBM_cull_vertex -------------------------- */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 + +#define GL_CULL_VERTEX_IBM 103050 + +#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) + +#endif /* GL_IBM_cull_vertex */ + +/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, GLint modestride); + +#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) +#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) + +#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) + +#endif /* GL_IBM_multimode_draw_arrays */ + +/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 + +#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 + +#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) + +#endif /* GL_IBM_rasterpos_clip */ + +/* --------------------------- GL_IBM_static_data -------------------------- */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 + +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 + +#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) + +#endif /* GL_IBM_static_data */ + +/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_IBM 0x8370 + +#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) + +#endif /* GL_IBM_texture_mirrored_repeat */ + +/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 + +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); + +#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) +#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) +#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) +#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) +#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) +#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) +#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) +#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) + +#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) + +#endif /* GL_IBM_vertex_array_lists */ + +/* -------------------------- GL_INGR_color_clamp -------------------------- */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 + +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 + +#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) + +#endif /* GL_INGR_color_clamp */ + +/* ------------------------- GL_INGR_interlace_read ------------------------ */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 + +#define GL_INTERLACE_READ_INGR 0x8568 + +#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) + +#endif /* GL_INGR_interlace_read */ + +/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 + +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); + +#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) +#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) +#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) +#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) + +#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) + +#endif /* GL_INTEL_parallel_arrays */ + +/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ + +#ifndef GL_INTEL_texture_scissor +#define GL_INTEL_texture_scissor 1 + +typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); +typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); + +#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) +#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) + +#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) + +#endif /* GL_INTEL_texture_scissor */ + +/* -------------------------- GL_KTX_buffer_region ------------------------- */ + +#ifndef GL_KTX_buffer_region +#define GL_KTX_buffer_region 1 + +#define GL_KTX_FRONT_REGION 0x0 +#define GL_KTX_BACK_REGION 0x1 +#define GL_KTX_Z_REGION 0x2 +#define GL_KTX_STENCIL_REGION 0x3 + +typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONEXTPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); +typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONEXTPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glBufferRegionEnabledEXT GLEW_GET_FUN(__glewBufferRegionEnabledEXT) +#define glDeleteBufferRegionEXT GLEW_GET_FUN(__glewDeleteBufferRegionEXT) +#define glDrawBufferRegionEXT GLEW_GET_FUN(__glewDrawBufferRegionEXT) +#define glNewBufferRegionEXT GLEW_GET_FUN(__glewNewBufferRegionEXT) +#define glReadBufferRegionEXT GLEW_GET_FUN(__glewReadBufferRegionEXT) + +#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) + +#endif /* GL_KTX_buffer_region */ + +/* ------------------------- GL_MESAX_texture_stack ------------------------ */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 + +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E + +#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) + +#endif /* GL_MESAX_texture_stack */ + +/* -------------------------- GL_MESA_pack_invert -------------------------- */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 + +#define GL_PACK_INVERT_MESA 0x8758 + +#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) + +#endif /* GL_MESA_pack_invert */ + +/* ------------------------- GL_MESA_resize_buffers ------------------------ */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 + +typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); + +#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) + +#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) + +#endif /* GL_MESA_resize_buffers */ + +/* --------------------------- GL_MESA_window_pos -------------------------- */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); + +#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) +#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) +#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) +#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) +#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) +#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) +#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) +#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) +#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) +#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) +#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) +#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) +#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) +#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) +#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) +#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) +#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) +#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) +#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) +#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) +#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) +#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) +#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) +#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) + +#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) + +#endif /* GL_MESA_window_pos */ + +/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 + +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 + +#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) + +#endif /* GL_MESA_ycbcr_texture */ + +/* --------------------------- GL_NV_blend_square -------------------------- */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 + +#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) + +#endif /* GL_NV_blend_square */ + +/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 + +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F + +#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) + +#endif /* GL_NV_copy_depth_to_color */ + +/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); + +#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) +#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) +#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) + +#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) + +#endif /* GL_NV_depth_buffer_float */ + +/* --------------------------- GL_NV_depth_clamp --------------------------- */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 + +#define GL_DEPTH_CLAMP_NV 0x864F + +#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) + +#endif /* GL_NV_depth_clamp */ + +/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ + +#ifndef GL_NV_depth_range_unclamped +#define GL_NV_depth_range_unclamped 1 + +#define GL_SAMPLE_COUNT_BITS_NV 0x8864 +#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 +#define GL_QUERY_RESULT_NV 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 +#define GL_SAMPLE_COUNT_NV 0x8914 + +#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) + +#endif /* GL_NV_depth_range_unclamped */ + +/* ---------------------------- GL_NV_evaluators --------------------------- */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 + +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 + +typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) +#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) +#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) +#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) +#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) +#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) +#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) +#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) +#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) + +#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) + +#endif /* GL_NV_evaluators */ + +/* ------------------------------ GL_NV_fence ------------------------------ */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 + +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); +typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); + +#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) +#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) +#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) +#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) +#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) +#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) +#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) + +#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) + +#endif /* GL_NV_fence */ + +/* --------------------------- GL_NV_float_buffer -------------------------- */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 + +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E + +#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) + +#endif /* GL_NV_float_buffer */ + +/* --------------------------- GL_NV_fog_distance -------------------------- */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 + +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C + +#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) + +#endif /* GL_NV_fog_distance */ + +/* ------------------------- GL_NV_fragment_program ------------------------ */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 + +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); + +#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) +#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) +#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) +#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) +#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) +#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) + +#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) + +#endif /* GL_NV_fragment_program */ + +/* ------------------------ GL_NV_fragment_program2 ------------------------ */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 + +#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) + +#endif /* GL_NV_fragment_program2 */ + +/* ------------------------ GL_NV_fragment_program4 ------------------------ */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 + +#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) + +#endif /* GL_NV_fragment_program4 */ + +/* --------------------- GL_NV_fragment_program_option --------------------- */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 + +#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) + +#endif /* GL_NV_fragment_program_option */ + +/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 + +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) + +#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) + +#endif /* GL_NV_framebuffer_multisample_coverage */ + +/* ------------------------ GL_NV_geometry_program4 ------------------------ */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 + +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 + +typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); + +#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) + +#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) + +#endif /* GL_NV_geometry_program4 */ + +/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 + +#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) + +#endif /* GL_NV_geometry_shader4 */ + +/* --------------------------- GL_NV_gpu_program4 -------------------------- */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 + +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); + +#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) +#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) +#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) +#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) +#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) +#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) +#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) +#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) +#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) +#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) +#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) +#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) + +#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) + +#endif /* GL_NV_gpu_program4 */ + +/* ---------------------------- GL_NV_half_float --------------------------- */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 + +#define GL_HALF_FLOAT_NV 0x140B + +typedef unsigned short GLhalf; + +typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); + +#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) +#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) +#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) +#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) +#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) +#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) +#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) +#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) +#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) +#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) +#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) +#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) +#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) +#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) +#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) +#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) +#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) +#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) +#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) +#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) +#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) +#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) +#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) +#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) +#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) +#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) +#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) +#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) +#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) +#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) +#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) +#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) +#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) +#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) +#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) +#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) +#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) +#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) +#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) +#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) +#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) +#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) +#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) +#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) +#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) +#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) + +#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) + +#endif /* GL_NV_half_float */ + +/* ------------------------ GL_NV_light_max_exponent ----------------------- */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 + +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 + +#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) + +#endif /* GL_NV_light_max_exponent */ + +/* --------------------- GL_NV_multisample_filter_hint --------------------- */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 + +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 + +#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) + +#endif /* GL_NV_multisample_filter_hint */ + +/* ------------------------- GL_NV_occlusion_query ------------------------- */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 + +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 + +typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); + +#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) +#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) +#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) +#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) +#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) +#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) +#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) + +#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) + +#endif /* GL_NV_occlusion_query */ + +/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA + +#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) + +#endif /* GL_NV_packed_depth_stencil */ + +/* --------------------- GL_NV_parameter_buffer_object --------------------- */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 + +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 + +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); + +#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) +#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) +#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) + +#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) + +#endif /* GL_NV_parameter_buffer_object */ + +/* ------------------------- GL_NV_pixel_data_range ------------------------ */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 + +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D + +typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void* pointer); + +#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) +#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) + +#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) + +#endif /* GL_NV_pixel_data_range */ + +/* --------------------------- GL_NV_point_sprite -------------------------- */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 + +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); + +#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) +#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) + +#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) + +#endif /* GL_NV_point_sprite */ + +/* ------------------------ GL_NV_primitive_restart ------------------------ */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 + +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); + +#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) +#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) + +#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) + +#endif /* GL_NV_primitive_restart */ + +/* ------------------------ GL_NV_register_combiners ----------------------- */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 + +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 + +typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); + +#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) +#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) +#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) +#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) +#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) +#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) +#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) +#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) +#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) +#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) +#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) +#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) +#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) + +#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) + +#endif /* GL_NV_register_combiners */ + +/* ----------------------- GL_NV_register_combiners2 ----------------------- */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 + +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 + +typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); + +#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) +#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) + +#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) + +#endif /* GL_NV_register_combiners2 */ + +/* -------------------------- GL_NV_texgen_emboss -------------------------- */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 + +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F + +#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) + +#endif /* GL_NV_texgen_emboss */ + +/* ------------------------ GL_NV_texgen_reflection ------------------------ */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 + +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 + +#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) + +#endif /* GL_NV_texgen_reflection */ + +/* --------------------- GL_NV_texture_compression_vtc --------------------- */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 + +#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) + +#endif /* GL_NV_texture_compression_vtc */ + +/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 + +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B + +#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) + +#endif /* GL_NV_texture_env_combine4 */ + +/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 + +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F + +#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) + +#endif /* GL_NV_texture_expand_normal */ + +/* ------------------------ GL_NV_texture_rectangle ------------------------ */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 + +#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) + +#endif /* GL_NV_texture_rectangle */ + +/* -------------------------- GL_NV_texture_shader ------------------------- */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 + +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F + +#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) + +#endif /* GL_NV_texture_shader */ + +/* ------------------------- GL_NV_texture_shader2 ------------------------- */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 + +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D + +#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) + +#endif /* GL_NV_texture_shader2 */ + +/* ------------------------- GL_NV_texture_shader3 ------------------------- */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 + +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 + +#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) + +#endif /* GL_NV_texture_shader3 */ + +/* ------------------------ GL_NV_transform_feedback ----------------------- */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 + +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F + +typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); + +#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) +#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) +#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) +#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) +#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) +#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) +#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) +#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) +#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) +#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) +#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) + +#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) + +#endif /* GL_NV_transform_feedback */ + +/* ------------------------ GL_NV_vertex_array_range ----------------------- */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer); + +#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) +#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) + +#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) + +#endif /* GL_NV_vertex_array_range */ + +/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 + +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 + +#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) + +#endif /* GL_NV_vertex_array_range2 */ + +/* -------------------------- GL_NV_vertex_program ------------------------- */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 + +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F + +typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint num, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint num, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); + +#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) +#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) +#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) +#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) +#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) +#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) +#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) +#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) +#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) +#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) +#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) +#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) +#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) +#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) +#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) +#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) +#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) +#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) +#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) +#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) +#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) +#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) +#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) +#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) +#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) +#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) +#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) +#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) +#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) +#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) +#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) +#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) +#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) +#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) +#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) +#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) +#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) +#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) +#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) +#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) +#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) +#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) +#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) +#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) +#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) +#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) +#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) +#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) +#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) +#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) +#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) +#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) +#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) +#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) +#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) +#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) +#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) +#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) +#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) +#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) +#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) +#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) +#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) +#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) + +#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) + +#endif /* GL_NV_vertex_program */ + +/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 + +#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) + +#endif /* GL_NV_vertex_program1_1 */ + +/* ------------------------- GL_NV_vertex_program2 ------------------------- */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 + +#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) + +#endif /* GL_NV_vertex_program2 */ + +/* ---------------------- GL_NV_vertex_program2_option --------------------- */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 + +#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) + +#endif /* GL_NV_vertex_program2_option */ + +/* ------------------------- GL_NV_vertex_program3 ------------------------- */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 + +#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C + +#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) + +#endif /* GL_NV_vertex_program3 */ + +/* ------------------------- GL_NV_vertex_program4 ------------------------- */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 + +#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) + +#endif /* GL_NV_vertex_program4 */ + +/* ------------------------ GL_OES_byte_coordinates ------------------------ */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 + +#define GL_BYTE 0x1400 + +#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) + +#endif /* GL_OES_byte_coordinates */ + +/* ------------------- GL_OES_compressed_paletted_texture ------------------ */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 + +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 + +#define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture) + +#endif /* GL_OES_compressed_paletted_texture */ + +/* --------------------------- GL_OES_read_format -------------------------- */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 + +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B + +#define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format) + +#endif /* GL_OES_read_format */ + +/* ------------------------ GL_OES_single_precision ------------------------ */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampd depth); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + +#define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES) +#define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES) +#define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES) +#define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES) +#define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES) +#define glOrthofOES GLEW_GET_FUN(__glewOrthofOES) + +#define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision) + +#endif /* GL_OES_single_precision */ + +/* ---------------------------- GL_OML_interlace --------------------------- */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 + +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 + +#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) + +#endif /* GL_OML_interlace */ + +/* ---------------------------- GL_OML_resample ---------------------------- */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 + +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 + +#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) + +#endif /* GL_OML_resample */ + +/* ---------------------------- GL_OML_subsample --------------------------- */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 + +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 + +#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) + +#endif /* GL_OML_subsample */ + +/* --------------------------- GL_PGI_misc_hints --------------------------- */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 + +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 +#define GL_CONSERVE_MEMORY_HINT_PGI 107005 +#define GL_RECLAIM_MEMORY_HINT_PGI 107006 +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 +#define GL_ALWAYS_FAST_HINT_PGI 107020 +#define GL_ALWAYS_SOFT_HINT_PGI 107021 +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 +#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 +#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 +#define GL_STRICT_LIGHTING_HINT_PGI 107031 +#define GL_STRICT_SCISSOR_HINT_PGI 107032 +#define GL_FULL_STIPPLE_HINT_PGI 107033 +#define GL_CLIP_NEAR_HINT_PGI 107040 +#define GL_CLIP_FAR_HINT_PGI 107041 +#define GL_WIDE_LINE_HINT_PGI 107042 +#define GL_BACK_NORMALS_HINT_PGI 107043 + +#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) + +#endif /* GL_PGI_misc_hints */ + +/* -------------------------- GL_PGI_vertex_hints -------------------------- */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 + +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_VERTEX_DATA_HINT_PGI 107050 +#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 +#define GL_MATERIAL_SIDE_HINT_PGI 107052 +#define GL_MAX_VERTEX_HINT_PGI 107053 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 + +#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) + +#endif /* GL_PGI_vertex_hints */ + +/* ----------------------- GL_REND_screen_coordinates ---------------------- */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 + +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 + +#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) + +#endif /* GL_REND_screen_coordinates */ + +/* ------------------------------- GL_S3_s3tc ------------------------------ */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 + +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 + +#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) + +#endif /* GL_S3_s3tc */ + +/* -------------------------- GL_SGIS_color_range -------------------------- */ + +#ifndef GL_SGIS_color_range +#define GL_SGIS_color_range 1 + +#define GL_EXTENDED_RANGE_SGIS 0x85A5 +#define GL_MIN_RED_SGIS 0x85A6 +#define GL_MAX_RED_SGIS 0x85A7 +#define GL_MIN_GREEN_SGIS 0x85A8 +#define GL_MAX_GREEN_SGIS 0x85A9 +#define GL_MIN_BLUE_SGIS 0x85AA +#define GL_MAX_BLUE_SGIS 0x85AB +#define GL_MIN_ALPHA_SGIS 0x85AC +#define GL_MAX_ALPHA_SGIS 0x85AD + +#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) + +#endif /* GL_SGIS_color_range */ + +/* ------------------------- GL_SGIS_detail_texture ------------------------ */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 + +typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); + +#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) +#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) + +#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) + +#endif /* GL_SGIS_detail_texture */ + +/* -------------------------- GL_SGIS_fog_function ------------------------- */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 + +typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); + +#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) +#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) + +#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) + +#endif /* GL_SGIS_fog_function */ + +/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 + +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 + +#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) + +#endif /* GL_SGIS_generate_mipmap */ + +/* -------------------------- GL_SGIS_multisample -------------------------- */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 + +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); + +#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) +#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) + +#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) + +#endif /* GL_SGIS_multisample */ + +/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 + +#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) + +#endif /* GL_SGIS_pixel_texture */ + +/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 + +typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); +typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); + +#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) +#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) + +#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) + +#endif /* GL_SGIS_sharpen_texture */ + +/* --------------------------- GL_SGIS_texture4D --------------------------- */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void* pixels); + +#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) +#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) + +#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) + +#endif /* GL_SGIS_texture4D */ + +/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_SGIS 0x812D + +#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) + +#endif /* GL_SGIS_texture_border_clamp */ + +/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_SGIS 0x812F + +#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) + +#endif /* GL_SGIS_texture_edge_clamp */ + +/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 + +typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); +typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); + +#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) +#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) + +#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) + +#endif /* GL_SGIS_texture_filter4 */ + +/* -------------------------- GL_SGIS_texture_lod -------------------------- */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 + +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D + +#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) + +#endif /* GL_SGIS_texture_lod */ + +/* ------------------------- GL_SGIS_texture_select ------------------------ */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 + +#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) + +#endif /* GL_SGIS_texture_select */ + +/* ----------------------------- GL_SGIX_async ----------------------------- */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 + +#define GL_ASYNC_MARKER_SGIX 0x8329 + +typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); +typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); + +#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) +#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) +#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) +#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) +#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) +#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) + +#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) + +#endif /* GL_SGIX_async */ + +/* ------------------------ GL_SGIX_async_histogram ------------------------ */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 + +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D + +#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) + +#endif /* GL_SGIX_async_histogram */ + +/* -------------------------- GL_SGIX_async_pixel -------------------------- */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 + +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 + +#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) + +#endif /* GL_SGIX_async_pixel */ + +/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 + +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 + +#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) + +#endif /* GL_SGIX_blend_alpha_minmax */ + +/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 + +#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) + +#endif /* GL_SGIX_clipmap */ + +/* ------------------------- GL_SGIX_depth_texture ------------------------- */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 + +#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) + +#endif /* GL_SGIX_depth_texture */ + +/* -------------------------- GL_SGIX_flush_raster ------------------------- */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 + +typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); + +#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) + +#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) + +#endif /* GL_SGIX_flush_raster */ + +/* --------------------------- GL_SGIX_fog_offset -------------------------- */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 + +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 + +#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) + +#endif /* GL_SGIX_fog_offset */ + +/* -------------------------- GL_SGIX_fog_texture -------------------------- */ + +#ifndef GL_SGIX_fog_texture +#define GL_SGIX_fog_texture 1 + +#define GL_TEXTURE_FOG_SGIX 0 +#define GL_FOG_PATCHY_FACTOR_SGIX 0 +#define GL_FRAGMENT_FOG_SGIX 0 + +typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); + +#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) + +#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) + +#endif /* GL_SGIX_fog_texture */ + +/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ + +#ifndef GL_SGIX_fragment_specular_lighting +#define GL_SGIX_fragment_specular_lighting 1 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); + +#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) +#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) +#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) +#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) +#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) +#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) +#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) +#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) +#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) +#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) +#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) +#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) +#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) +#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) +#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) +#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) +#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) + +#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) + +#endif /* GL_SGIX_fragment_specular_lighting */ + +/* --------------------------- GL_SGIX_framezoom --------------------------- */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 + +typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); + +#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) + +#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) + +#endif /* GL_SGIX_framezoom */ + +/* --------------------------- GL_SGIX_interlace --------------------------- */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 + +#define GL_INTERLACE_SGIX 0x8094 + +#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) + +#endif /* GL_SGIX_interlace */ + +/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 + +#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) + +#endif /* GL_SGIX_ir_instrument1 */ + +/* ------------------------- GL_SGIX_list_priority ------------------------- */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 + +#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) + +#endif /* GL_SGIX_list_priority */ + +/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 + +typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); + +#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) + +#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) + +#endif /* GL_SGIX_pixel_texture */ + +/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ + +#ifndef GL_SGIX_pixel_texture_bits +#define GL_SGIX_pixel_texture_bits 1 + +#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) + +#endif /* GL_SGIX_pixel_texture_bits */ + +/* ------------------------ GL_SGIX_reference_plane ------------------------ */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 + +typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); + +#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) + +#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) + +#endif /* GL_SGIX_reference_plane */ + +/* ---------------------------- GL_SGIX_resample --------------------------- */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 + +#define GL_PACK_RESAMPLE_SGIX 0x842E +#define GL_UNPACK_RESAMPLE_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 + +#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) + +#endif /* GL_SGIX_resample */ + +/* ----------------------------- GL_SGIX_shadow ---------------------------- */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 + +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D + +#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) + +#endif /* GL_SGIX_shadow */ + +/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 + +#define GL_SHADOW_AMBIENT_SGIX 0x80BF + +#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) + +#endif /* GL_SGIX_shadow_ambient */ + +/* ----------------------------- GL_SGIX_sprite ---------------------------- */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 + +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); + +#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) +#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) +#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) +#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) + +#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) + +#endif /* GL_SGIX_sprite */ + +/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 + +typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); + +#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) + +#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) + +#endif /* GL_SGIX_tag_sample_buffer */ + +/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 + +#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) + +#endif /* GL_SGIX_texture_add_env */ + +/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 + +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B + +#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) + +#endif /* GL_SGIX_texture_coordinate_clamp */ + +/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 + +#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) + +#endif /* GL_SGIX_texture_lod_bias */ + +/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 + +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E + +#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) + +#endif /* GL_SGIX_texture_multi_buffer */ + +/* ------------------------- GL_SGIX_texture_range ------------------------- */ + +#ifndef GL_SGIX_texture_range +#define GL_SGIX_texture_range 1 + +#define GL_RGB_SIGNED_SGIX 0x85E0 +#define GL_RGBA_SIGNED_SGIX 0x85E1 +#define GL_ALPHA_SIGNED_SGIX 0x85E2 +#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 +#define GL_INTENSITY_SIGNED_SGIX 0x85E4 +#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 +#define GL_RGB16_SIGNED_SGIX 0x85E6 +#define GL_RGBA16_SIGNED_SGIX 0x85E7 +#define GL_ALPHA16_SIGNED_SGIX 0x85E8 +#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 +#define GL_INTENSITY16_SIGNED_SGIX 0x85EA +#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB +#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC +#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED +#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE +#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF +#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 +#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 +#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 +#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 +#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 +#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 +#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 +#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 +#define GL_MIN_LUMINANCE_SGIS 0x85F8 +#define GL_MAX_LUMINANCE_SGIS 0x85F9 +#define GL_MIN_INTENSITY_SGIS 0x85FA +#define GL_MAX_INTENSITY_SGIS 0x85FB + +#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) + +#endif /* GL_SGIX_texture_range */ + +/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 + +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C + +#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) + +#endif /* GL_SGIX_texture_scale_bias */ + +/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) + +#endif /* GL_SGIX_vertex_preclip */ + +/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ + +#ifndef GL_SGIX_vertex_preclip_hint +#define GL_SGIX_vertex_preclip_hint 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) + +#endif /* GL_SGIX_vertex_preclip_hint */ + +/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 + +#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) + +#endif /* GL_SGIX_ycrcb */ + +/* -------------------------- GL_SGI_color_matrix -------------------------- */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 + +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB + +#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) + +#endif /* GL_SGI_color_matrix */ + +/* --------------------------- GL_SGI_color_table -------------------------- */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 + +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void* table); + +#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) +#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) +#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) +#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) +#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) +#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) +#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) + +#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) + +#endif /* GL_SGI_color_table */ + +/* ----------------------- GL_SGI_texture_color_table ---------------------- */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 + +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD + +#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) + +#endif /* GL_SGI_texture_color_table */ + +/* ------------------------- GL_SUNX_constant_data ------------------------- */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 + +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 + +typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); + +#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) + +#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) + +#endif /* GL_SUNX_constant_data */ + +/* -------------------- GL_SUN_convolution_border_modes -------------------- */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 + +#define GL_WRAP_BORDER_SUN 0x81D4 + +#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) + +#endif /* GL_SUN_convolution_border_modes */ + +/* -------------------------- GL_SUN_global_alpha -------------------------- */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 + +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA + +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); + +#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) +#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) +#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) +#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) +#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) +#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) +#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) +#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) + +#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) + +#endif /* GL_SUN_global_alpha */ + +/* --------------------------- GL_SUN_mesh_array --------------------------- */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 + +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 + +#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) + +#endif /* GL_SUN_mesh_array */ + +/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ + +#ifndef GL_SUN_read_video_pixels +#define GL_SUN_read_video_pixels 1 + +typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); + +#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) + +#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) + +#endif /* GL_SUN_read_video_pixels */ + +/* --------------------------- GL_SUN_slice_accum -------------------------- */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 + +#define GL_SLICE_ACCUM_SUN 0x85CC + +#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) + +#endif /* GL_SUN_slice_accum */ + +/* -------------------------- GL_SUN_triangle_list ------------------------- */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 + +#define GL_RESTART_SUN 0x01 +#define GL_REPLACE_MIDDLE_SUN 0x02 +#define GL_REPLACE_OLDEST_SUN 0x03 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB + +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); + +#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) +#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) +#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) +#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) +#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) +#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) +#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) + +#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) + +#endif /* GL_SUN_triangle_list */ + +/* ----------------------------- GL_SUN_vertex ----------------------------- */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 + +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); + +#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) +#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) +#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) +#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) +#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) +#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) +#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) +#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) +#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) +#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) +#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) +#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) +#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) +#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) +#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) +#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) +#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) +#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) +#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) +#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) +#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) +#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) +#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) +#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) +#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) +#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) +#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) +#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) +#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) + +#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) + +#endif /* GL_SUN_vertex */ + +/* -------------------------- GL_WIN_phong_shading ------------------------- */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 + +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB + +#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) + +#endif /* GL_WIN_phong_shading */ + +/* -------------------------- GL_WIN_specular_fog -------------------------- */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 + +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC + +#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) + +#endif /* GL_WIN_specular_fog */ + +/* ---------------------------- GL_WIN_swap_hint --------------------------- */ + +#ifndef GL_WIN_swap_hint +#define GL_WIN_swap_hint 1 + +typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); + +#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) + +#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) + +#endif /* GL_WIN_swap_hint */ + +/* ------------------------------------------------------------------------- */ + +#if defined(GLEW_MX) && defined(_WIN32) +#define GLEW_FUN_EXPORT +#else +#define GLEW_FUN_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#if defined(GLEW_MX) +#define GLEW_VAR_EXPORT +#else +#define GLEW_VAR_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#if defined(GLEW_MX) && defined(_WIN32) +struct GLEWContextStruct +{ +#endif /* GLEW_MX */ + +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; + +GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; +GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; +GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; +GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; +GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; +GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; +GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; +GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; +GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; +GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; +GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; +GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; + +GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; +GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; +GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; +GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; +GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; +GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; +GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; +GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; +GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; +GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; +GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; +GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; +GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; +GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; +GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; + +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; + +GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; +GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; +GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; +GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; + +GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; +GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; +GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; +GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; +GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; + +GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; + +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; +GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; +GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; +GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; + +GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; +GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; +GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; +GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; +GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; +GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; +GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; + +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; + +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; + +GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; +GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; +GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; +GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; +GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; +GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; + +GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; +GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; + +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; + +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; + +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; +GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; +GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; +GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; + +GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; + +GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glPNTrianglewesfATI; +GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glPNTrianglewesiATI; + +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; + +GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; +GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; +GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; +GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; +GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; + +GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; + +GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; +GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; + +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; + +GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; + +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; +GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; + +GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; + +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; + +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; +GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; +GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; +GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; + +GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; + +GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; + +GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; +GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; + +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; + +GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; +GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; + +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; + +GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; + +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; + +GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; +GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; + +GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; +GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; +GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; +GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; +GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; + +GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; + +GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; +GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; +GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERVEXTPROC __glewGetPointervEXT; +GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; +GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; + +GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; +GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; +GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; +GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; +GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; +GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; +GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; +GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; +GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; +GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; +GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; +GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; + +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; + +GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; + +GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; + +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; + +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; + +GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; +GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; + +GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDEXTPROC __glewBufferRegionEnabledEXT; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONEXTPROC __glewDeleteBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONEXTPROC __glewDrawBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONEXTPROC __glewNewBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONEXTPROC __glewReadBufferRegionEXT; + +GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; + +GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; +GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; +GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; +GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; +GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; +GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; +GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; +GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; +GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; + +GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; +GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; + +GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; +GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; + +GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; +GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; + +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; +GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; +GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; + +GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; +GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; + +GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; +GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; +GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; +GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; +GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; +GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; +GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES; +GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES; +GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; +GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; + +GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; + +GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; + +GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; +GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; + +GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; +GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; + +GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; + +GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; + +GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; + +GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; + +GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; + +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; + +GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; + +GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; + +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; + +GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; + +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; + +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; + +GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; + +#if defined(GLEW_MX) && !defined(_WIN32) +struct GLEWContextStruct +{ +#endif /* GLEW_MX */ + +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; +GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; +GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; + +#ifdef GLEW_MX +}; /* GLEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------- */ + +/* error codes */ +#define GLEW_OK 0 +#define GLEW_NO_ERROR 0 +#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ +#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* GL 1.1 and up are not supported */ +#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* GLX 1.2 and up are not supported */ + +/* string codes */ +#define GLEW_VERSION 1 +#define GLEW_VERSION_MAJOR 2 +#define GLEW_VERSION_MINOR 3 +#define GLEW_VERSION_MICRO 4 + +/* API */ +#ifdef GLEW_MX + +typedef struct GLEWContextStruct GLEWContext; +GLEWAPI GLenum glewContextInit (GLEWContext* ctx); +GLEWAPI GLboolean glewContextIsSupported (GLEWContext* ctx, const char* name); + +#define glewInit() glewContextInit(glewGetContext()) +#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x) +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x)) +#ifdef _WIN32 +# define GLEW_GET_FUN(x) glewGetContext()->x +#else +# define GLEW_GET_FUN(x) x +#endif + +#else /* GLEW_MX */ + +GLEWAPI GLenum glewInit (); +GLEWAPI GLboolean glewIsSupported (const char* name); +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#define GLEW_GET_VAR(x) (*(const GLboolean*)&x) +#define GLEW_GET_FUN(x) x + +#endif /* GLEW_MX */ + +GLEWAPI GLboolean glewExperimental; +GLEWAPI GLboolean glewGetExtension (const char* name); +GLEWAPI const GLubyte* glewGetErrorString (GLenum error); +GLEWAPI const GLubyte* glewGetString (GLenum name); + +#ifdef __cplusplus +} +#endif + +#ifdef GLEW_APIENTRY_DEFINED +#undef GLEW_APIENTRY_DEFINED +#undef APIENTRY +#undef GLAPIENTRY +#endif + +#ifdef GLEW_CALLBACK_DEFINED +#undef GLEW_CALLBACK_DEFINED +#undef CALLBACK +#endif + +#ifdef GLEW_WINGDIAPI_DEFINED +#undef GLEW_WINGDIAPI_DEFINED +#undef WINGDIAPI +#endif + +#undef GLAPI +/* #undef GLEWAPI */ + +#endif /* __glew_h__ */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/glxew.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/glxew.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/glxew.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/glxew.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1267 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Mesa 3-D graphics library + * Version: 7.0 + * + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* +** Copyright (c) 2007 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are 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 Materials. +** +** THE MATERIALS ARE 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 +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __glxew_h__ +#define __glxew_h__ +#define __GLXEW_H__ + +#ifdef __glxext_h_ +#error glxext.h included before glxew.h +#endif +#ifdef GLX_H +#error glx.h included before glxew.h +#endif + +#define __glxext_h_ +#define __GLX_glx_h__ +#define GLX_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ---------------------------- GLX_VERSION_1_0 --------------------------- */ + +#ifndef GLX_VERSION_1_0 +#define GLX_VERSION_1_0 1 + +#define GLX_USE_GL 1 +#define GLX_BUFFER_SIZE 2 +#define GLX_LEVEL 3 +#define GLX_RGBA 4 +#define GLX_DOUBLEBUFFER 5 +#define GLX_STEREO 6 +#define GLX_AUX_BUFFERS 7 +#define GLX_RED_SIZE 8 +#define GLX_GREEN_SIZE 9 +#define GLX_BLUE_SIZE 10 +#define GLX_ALPHA_SIZE 11 +#define GLX_DEPTH_SIZE 12 +#define GLX_STENCIL_SIZE 13 +#define GLX_ACCUM_RED_SIZE 14 +#define GLX_ACCUM_GREEN_SIZE 15 +#define GLX_ACCUM_BLUE_SIZE 16 +#define GLX_ACCUM_ALPHA_SIZE 17 +#define GLX_BAD_SCREEN 1 +#define GLX_BAD_ATTRIBUTE 2 +#define GLX_NO_EXTENSION 3 +#define GLX_BAD_VISUAL 4 +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + +typedef XID GLXDrawable; +typedef XID GLXPixmap; +#ifdef __sun +typedef struct __glXContextRec *GLXContext; +#else +typedef struct __GLXcontextRec *GLXContext; +#endif + +extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); +extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); +extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); +extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); +extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); +extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); +extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); +extern void glXDestroyContext (Display *dpy, GLXContext ctx); +extern Bool glXIsDirect (Display *dpy, GLXContext ctx); +extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); +extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); +extern GLXContext glXGetCurrentContext (void); +extern GLXDrawable glXGetCurrentDrawable (void); +extern void glXWaitGL (void); +extern void glXWaitX (void); +extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); +extern void glXUseXFont (Font font, int first, int count, int listBase); + +#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) + +#endif /* GLX_VERSION_1_0 */ + +/* ---------------------------- GLX_VERSION_1_1 --------------------------- */ + +#ifndef GLX_VERSION_1_1 +#define GLX_VERSION_1_1 + +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_EXTENSIONS 0x3 + +extern const char* glXQueryExtensionsString (Display *dpy, int screen); +extern const char* glXGetClientString (Display *dpy, int name); +extern const char* glXQueryServerString (Display *dpy, int screen, int name); + +#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) + +#endif /* GLX_VERSION_1_1 */ + +/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ + +#ifndef GLX_VERSION_1_2 +#define GLX_VERSION_1_2 1 + +typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); + +#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) + +#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) + +#endif /* GLX_VERSION_1_2 */ + +/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ + +#ifndef GLX_VERSION_1_3 +#define GLX_VERSION_1_3 1 + +#define GLX_RGBA_BIT 0x00000001 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_VISUAL_ID 0x800B +#define GLX_SCREEN 0x800C +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_DONT_CARE 0xFFFFFFFF + +typedef XID GLXFBConfigID; +typedef XID GLXWindow; +typedef XID GLXPbuffer; +typedef struct __GLXFBConfigRec *GLXFBConfig; + +typedef struct { + int event_type; + int draw_type; + unsigned long serial; + Bool send_event; + Display *display; + GLXDrawable drawable; + unsigned int buffer_mask; + unsigned int aux_buffer; + int x, y; + int width, height; + int count; +} GLXPbufferClobberEvent; +typedef union __GLXEvent { + GLXPbufferClobberEvent glxpbufferclobber; + long pad[24]; +} GLXEvent; + +typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); +typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); +typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); +typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); +typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); + +#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) +#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) +#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) +#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) +#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) +#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) +#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) +#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) +#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) +#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) +#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) +#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) +#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) +#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) +#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) +#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) +#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) + +#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) + +#endif /* GLX_VERSION_1_3 */ + +/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ + +#ifndef GLX_VERSION_1_4 +#define GLX_VERSION_1_4 1 + +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAMPLES 100001 + +extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); + +#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) + +#endif /* GLX_VERSION_1_4 */ + +/* -------------------------- GLX_3DFX_multisample ------------------------- */ + +#ifndef GLX_3DFX_multisample +#define GLX_3DFX_multisample 1 + +#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 +#define GLX_SAMPLES_3DFX 0x8051 + +#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) + +#endif /* GLX_3DFX_multisample */ + +/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ + +#ifndef GLX_ARB_fbconfig_float +#define GLX_ARB_fbconfig_float 1 + +#define GLX_RGBA_FLOAT_BIT 0x00000004 +#define GLX_RGBA_FLOAT_TYPE 0x20B9 + +#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) + +#endif /* GLX_ARB_fbconfig_float */ + +/* ------------------------ GLX_ARB_get_proc_address ----------------------- */ + +#ifndef GLX_ARB_get_proc_address +#define GLX_ARB_get_proc_address 1 + +extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); + +#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) + +#endif /* GLX_ARB_get_proc_address */ + +/* -------------------------- GLX_ARB_multisample -------------------------- */ + +#ifndef GLX_ARB_multisample +#define GLX_ARB_multisample 1 + +#define GLX_SAMPLE_BUFFERS_ARB 100000 +#define GLX_SAMPLES_ARB 100001 + +#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) + +#endif /* GLX_ARB_multisample */ + +/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ + +#ifndef GLX_ATI_pixel_format_float +#define GLX_ATI_pixel_format_float 1 + +#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 + +#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) + +#endif /* GLX_ATI_pixel_format_float */ + +/* ------------------------- GLX_ATI_render_texture ------------------------ */ + +#ifndef GLX_ATI_render_texture +#define GLX_ATI_render_texture 1 + +#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 +#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 +#define GLX_TEXTURE_FORMAT_ATI 0x9802 +#define GLX_TEXTURE_TARGET_ATI 0x9803 +#define GLX_MIPMAP_TEXTURE_ATI 0x9804 +#define GLX_TEXTURE_RGB_ATI 0x9805 +#define GLX_TEXTURE_RGBA_ATI 0x9806 +#define GLX_NO_TEXTURE_ATI 0x9807 +#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 +#define GLX_TEXTURE_1D_ATI 0x9809 +#define GLX_TEXTURE_2D_ATI 0x980A +#define GLX_MIPMAP_LEVEL_ATI 0x980B +#define GLX_CUBE_MAP_FACE_ATI 0x980C +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 +#define GLX_FRONT_LEFT_ATI 0x9813 +#define GLX_FRONT_RIGHT_ATI 0x9814 +#define GLX_BACK_LEFT_ATI 0x9815 +#define GLX_BACK_RIGHT_ATI 0x9816 +#define GLX_AUX0_ATI 0x9817 +#define GLX_AUX1_ATI 0x9818 +#define GLX_AUX2_ATI 0x9819 +#define GLX_AUX3_ATI 0x981A +#define GLX_AUX4_ATI 0x981B +#define GLX_AUX5_ATI 0x981C +#define GLX_AUX6_ATI 0x981D +#define GLX_AUX7_ATI 0x981E +#define GLX_AUX8_ATI 0x981F +#define GLX_AUX9_ATI 0x9820 +#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 +#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 + +typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); +typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); +typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); + +#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) +#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) +#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) + +#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) + +#endif /* GLX_ATI_render_texture */ + +/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ + +#ifndef GLX_EXT_fbconfig_packed_float +#define GLX_EXT_fbconfig_packed_float 1 + +#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 +#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 + +#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) + +#endif /* GLX_EXT_fbconfig_packed_float */ + +/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef GLX_EXT_framebuffer_sRGB +#define GLX_EXT_framebuffer_sRGB 1 + +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 + +#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) + +#endif /* GLX_EXT_framebuffer_sRGB */ + +/* ------------------------- GLX_EXT_import_context ------------------------ */ + +#ifndef GLX_EXT_import_context +#define GLX_EXT_import_context 1 + +#define GLX_SHARE_CONTEXT_EXT 0x800A +#define GLX_VISUAL_ID_EXT 0x800B +#define GLX_SCREEN_EXT 0x800C + +typedef XID GLXContextID; + +typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); +typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); +typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); +typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); + +#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) +#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) +#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) +#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) + +#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) + +#endif /* GLX_EXT_import_context */ + +/* -------------------------- GLX_EXT_scene_marker ------------------------- */ + +#ifndef GLX_EXT_scene_marker +#define GLX_EXT_scene_marker 1 + +#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) + +#endif /* GLX_EXT_scene_marker */ + +/* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */ + +#ifndef GLX_EXT_texture_from_pixmap +#define GLX_EXT_texture_from_pixmap 1 + +#define GLX_TEXTURE_1D_BIT_EXT 0x00000001 +#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 +#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 +#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 +#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 +#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 +#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 +#define GLX_Y_INVERTED_EXT 0x20D4 +#define GLX_TEXTURE_FORMAT_EXT 0x20D5 +#define GLX_TEXTURE_TARGET_EXT 0x20D6 +#define GLX_MIPMAP_TEXTURE_EXT 0x20D7 +#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 +#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 +#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA +#define GLX_TEXTURE_1D_EXT 0x20DB +#define GLX_TEXTURE_2D_EXT 0x20DC +#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD +#define GLX_FRONT_LEFT_EXT 0x20DE +#define GLX_FRONT_RIGHT_EXT 0x20DF +#define GLX_BACK_LEFT_EXT 0x20E0 +#define GLX_BACK_RIGHT_EXT 0x20E1 +#define GLX_AUX0_EXT 0x20E2 +#define GLX_AUX1_EXT 0x20E3 +#define GLX_AUX2_EXT 0x20E4 +#define GLX_AUX3_EXT 0x20E5 +#define GLX_AUX4_EXT 0x20E6 +#define GLX_AUX5_EXT 0x20E7 +#define GLX_AUX6_EXT 0x20E8 +#define GLX_AUX7_EXT 0x20E9 +#define GLX_AUX8_EXT 0x20EA +#define GLX_AUX9_EXT 0x20EB + +typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list); +typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer); + +#define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT) +#define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT) + +#define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap) + +#endif /* GLX_EXT_texture_from_pixmap */ + +/* -------------------------- GLX_EXT_visual_info -------------------------- */ + +#ifndef GLX_EXT_visual_info +#define GLX_EXT_visual_info 1 + +#define GLX_X_VISUAL_TYPE_EXT 0x22 +#define GLX_TRANSPARENT_TYPE_EXT 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 +#define GLX_NONE_EXT 0x8000 +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 + +#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) + +#endif /* GLX_EXT_visual_info */ + +/* ------------------------- GLX_EXT_visual_rating ------------------------- */ + +#ifndef GLX_EXT_visual_rating +#define GLX_EXT_visual_rating 1 + +#define GLX_VISUAL_CAVEAT_EXT 0x20 +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D + +#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) + +#endif /* GLX_EXT_visual_rating */ + +/* -------------------------- GLX_MESA_agp_offset -------------------------- */ + +#ifndef GLX_MESA_agp_offset +#define GLX_MESA_agp_offset 1 + +typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); + +#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) + +#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) + +#endif /* GLX_MESA_agp_offset */ + +/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ + +#ifndef GLX_MESA_copy_sub_buffer +#define GLX_MESA_copy_sub_buffer 1 + +typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); + +#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) + +#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) + +#endif /* GLX_MESA_copy_sub_buffer */ + +/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ + +#ifndef GLX_MESA_pixmap_colormap +#define GLX_MESA_pixmap_colormap 1 + +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); + +#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) + +#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) + +#endif /* GLX_MESA_pixmap_colormap */ + +/* ------------------------ GLX_MESA_release_buffers ----------------------- */ + +#ifndef GLX_MESA_release_buffers +#define GLX_MESA_release_buffers 1 + +typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); + +#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) + +#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) + +#endif /* GLX_MESA_release_buffers */ + +/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_MESA_set_3dfx_mode 1 + +#define GLX_3DFX_WINDOW_MODE_MESA 0x1 +#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 + +typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); + +#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) + +#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) + +#endif /* GLX_MESA_set_3dfx_mode */ + +/* -------------------------- GLX_NV_float_buffer -------------------------- */ + +#ifndef GLX_NV_float_buffer +#define GLX_NV_float_buffer 1 + +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 + +#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) + +#endif /* GLX_NV_float_buffer */ + +/* ----------------------- GLX_NV_vertex_array_range ----------------------- */ + +#ifndef GLX_NV_vertex_array_range +#define GLX_NV_vertex_array_range 1 + +typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); + +#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) +#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) + +#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) + +#endif /* GLX_NV_vertex_array_range */ + +/* -------------------------- GLX_OML_swap_method -------------------------- */ + +#ifndef GLX_OML_swap_method +#define GLX_OML_swap_method 1 + +#define GLX_SWAP_METHOD_OML 0x8060 +#define GLX_SWAP_EXCHANGE_OML 0x8061 +#define GLX_SWAP_COPY_OML 0x8062 +#define GLX_SWAP_UNDEFINED_OML 0x8063 + +#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) + +#endif /* GLX_OML_swap_method */ + +/* -------------------------- GLX_OML_sync_control ------------------------- */ + +#if !defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#include +#define GLX_OML_sync_control 1 + +typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); +typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); +typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); + +#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) +#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) +#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) +#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) +#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) + +#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) + +#endif /* GLX_OML_sync_control */ + +/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ + +#ifndef GLX_SGIS_blended_overlay +#define GLX_SGIS_blended_overlay 1 + +#define GLX_BLENDED_RGBA_SGIS 0x8025 + +#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) + +#endif /* GLX_SGIS_blended_overlay */ + +/* -------------------------- GLX_SGIS_color_range ------------------------- */ + +#ifndef GLX_SGIS_color_range +#define GLX_SGIS_color_range 1 + +#define GLX_MIN_RED_SGIS 0 +#define GLX_MAX_GREEN_SGIS 0 +#define GLX_MIN_BLUE_SGIS 0 +#define GLX_MAX_ALPHA_SGIS 0 +#define GLX_MIN_GREEN_SGIS 0 +#define GLX_MIN_ALPHA_SGIS 0 +#define GLX_MAX_RED_SGIS 0 +#define GLX_EXTENDED_RANGE_SGIS 0 +#define GLX_MAX_BLUE_SGIS 0 + +#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) + +#endif /* GLX_SGIS_color_range */ + +/* -------------------------- GLX_SGIS_multisample ------------------------- */ + +#ifndef GLX_SGIS_multisample +#define GLX_SGIS_multisample 1 + +#define GLX_SAMPLE_BUFFERS_SGIS 100000 +#define GLX_SAMPLES_SGIS 100001 + +#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) + +#endif /* GLX_SGIS_multisample */ + +/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ + +#ifndef GLX_SGIS_shared_multisample +#define GLX_SGIS_shared_multisample 1 + +#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 +#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 + +#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) + +#endif /* GLX_SGIS_shared_multisample */ + +/* --------------------------- GLX_SGIX_fbconfig --------------------------- */ + +#ifndef GLX_SGIX_fbconfig +#define GLX_SGIX_fbconfig 1 + +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#define GLX_RGBA_BIT_SGIX 0x00000001 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_SCREEN_EXT 0x800C +#define GLX_DRAWABLE_TYPE_SGIX 0x8010 +#define GLX_RENDER_TYPE_SGIX 0x8011 +#define GLX_X_RENDERABLE_SGIX 0x8012 +#define GLX_FBCONFIG_ID_SGIX 0x8013 +#define GLX_RGBA_TYPE_SGIX 0x8014 +#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 + +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; + +typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); +typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); +typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); + +#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) +#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) +#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) +#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) +#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) +#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) + +#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) + +#endif /* GLX_SGIX_fbconfig */ + +/* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ + +#ifndef GLX_SGIX_hyperpipe +#define GLX_SGIX_hyperpipe 1 + +#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 +#define GLX_PIPE_RECT_SGIX 0x00000001 +#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 +#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 +#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 +#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 +#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 +#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 +#define GLX_BAD_HYPERPIPE_SGIX 92 +#define GLX_HYPERPIPE_ID_SGIX 0x8030 + +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int networkId; +} GLXHyperpipeNetworkSGIX; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int XOrigin; + int YOrigin; + int maxHeight; + int maxWidth; +} GLXPipeRectLimits; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int channel; + unsigned int participationType; + int timeSlice; +} GLXHyperpipeConfigSGIX; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int srcXOrigin; + int srcYOrigin; + int srcWidth; + int srcHeight; + int destXOrigin; + int destYOrigin; + int destWidth; + int destHeight; +} GLXPipeRect; + +typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); +typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); +typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); +typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); +typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); +typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); +typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); +typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); + +#define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) +#define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) +#define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) +#define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) +#define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) +#define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) +#define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) +#define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) + +#define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) + +#endif /* GLX_SGIX_hyperpipe */ + +/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ + +#ifndef GLX_SGIX_pbuffer +#define GLX_SGIX_pbuffer 1 + +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 +#define GLX_PBUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 +#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 +#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 +#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 +#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 +#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 +#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 +#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A +#define GLX_PRESERVED_CONTENTS_SGIX 0x801B +#define GLX_LARGEST_PBUFFER_SGIX 0x801C +#define GLX_WIDTH_SGIX 0x801D +#define GLX_HEIGHT_SGIX 0x801E +#define GLX_EVENT_MASK_SGIX 0x801F +#define GLX_DAMAGED_SGIX 0x8020 +#define GLX_SAVED_SGIX 0x8021 +#define GLX_WINDOW_SGIX 0x8022 +#define GLX_PBUFFER_SGIX 0x8023 +#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 + +typedef XID GLXPbufferSGIX; +typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; + +typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); +typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); +typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); + +#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) +#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) +#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) +#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) +#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) + +#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) + +#endif /* GLX_SGIX_pbuffer */ + +/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ + +#ifndef GLX_SGIX_swap_barrier +#define GLX_SGIX_swap_barrier 1 + +typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); +typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); + +#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) +#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) + +#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) + +#endif /* GLX_SGIX_swap_barrier */ + +/* -------------------------- GLX_SGIX_swap_group -------------------------- */ + +#ifndef GLX_SGIX_swap_group +#define GLX_SGIX_swap_group 1 + +typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); + +#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) + +#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) + +#endif /* GLX_SGIX_swap_group */ + +/* ------------------------- GLX_SGIX_video_resize ------------------------- */ + +#ifndef GLX_SGIX_video_resize +#define GLX_SGIX_video_resize 1 + +#define GLX_SYNC_FRAME_SGIX 0x00000000 +#define GLX_SYNC_SWAP_SGIX 0x00000001 + +typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); +typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); +typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); +typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); +typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); + +#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) +#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) +#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) +#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) +#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) + +#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) + +#endif /* GLX_SGIX_video_resize */ + +/* ---------------------- GLX_SGIX_visual_select_group --------------------- */ + +#ifndef GLX_SGIX_visual_select_group +#define GLX_SGIX_visual_select_group 1 + +#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 + +#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) + +#endif /* GLX_SGIX_visual_select_group */ + +/* ---------------------------- GLX_SGI_cushion ---------------------------- */ + +#ifndef GLX_SGI_cushion +#define GLX_SGI_cushion 1 + +typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); + +#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) + +#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) + +#endif /* GLX_SGI_cushion */ + +/* ----------------------- GLX_SGI_make_current_read ----------------------- */ + +#ifndef GLX_SGI_make_current_read +#define GLX_SGI_make_current_read 1 + +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); +typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); + +#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) +#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) + +#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) + +#endif /* GLX_SGI_make_current_read */ + +/* -------------------------- GLX_SGI_swap_control ------------------------- */ + +#ifndef GLX_SGI_swap_control +#define GLX_SGI_swap_control 1 + +typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); + +#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) + +#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) + +#endif /* GLX_SGI_swap_control */ + +/* --------------------------- GLX_SGI_video_sync -------------------------- */ + +#ifndef GLX_SGI_video_sync +#define GLX_SGI_video_sync 1 + +typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (uint* count); +typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); + +#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) +#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) + +#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) + +#endif /* GLX_SGI_video_sync */ + +/* --------------------- GLX_SUN_get_transparent_index --------------------- */ + +#ifndef GLX_SUN_get_transparent_index +#define GLX_SUN_get_transparent_index 1 + +typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); + +#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) + +#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) + +#endif /* GLX_SUN_get_transparent_index */ + +/* -------------------------- GLX_SUN_video_resize ------------------------- */ + +#ifndef GLX_SUN_video_resize +#define GLX_SUN_video_resize 1 + +#define GLX_VIDEO_RESIZE_SUN 0x8171 +#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD + +typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); +typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); + +#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) +#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) + +#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) + +#endif /* GLX_SUN_video_resize */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX +#define GLXEW_EXPORT +#else +#define GLXEW_EXPORT extern +#endif /* GLEW_MX */ + +extern PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; + +extern PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; +extern PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; +extern PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; +extern PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; +extern PFNGLXCREATEWINDOWPROC __glewXCreateWindow; +extern PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; +extern PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; +extern PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; +extern PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; +extern PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; +extern PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; +extern PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; +extern PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; +extern PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; +extern PFNGLXQUERYCONTEXTPROC __glewXQueryContext; +extern PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; +extern PFNGLXSELECTEVENTPROC __glewXSelectEvent; + +extern PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; +extern PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; +extern PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; + +extern PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; +extern PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; +extern PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; +extern PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; + +extern PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; +extern PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; + +extern PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; + +extern PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; + +extern PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; + +extern PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; + +extern PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; + +extern PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; +extern PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; + +#ifdef GLX_OML_sync_control +extern PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; +extern PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; +extern PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; +extern PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; +extern PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; +#endif + +extern PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; +extern PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; +extern PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; +extern PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; +extern PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; +extern PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; + +extern PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; +extern PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; +extern PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; +extern PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; +extern PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; +extern PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; +extern PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; +extern PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; + +extern PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; +extern PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; +extern PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; +extern PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; +extern PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; + +extern PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; +extern PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; + +extern PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; + +extern PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; +extern PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; +extern PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; +extern PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; +extern PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; + +extern PFNGLXCUSHIONSGIPROC __glewXCushionSGI; + +extern PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; +extern PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; + +extern PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; + +extern PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; +extern PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; + +extern PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; + +extern PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; +extern PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; + +#if defined(GLEW_MX) +struct GLXEWContextStruct +{ +#endif /* GLEW_MX */ + +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_0; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_1; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_2; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_3; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_4; +GLXEW_EXPORT GLboolean __GLXEW_3DFX_multisample; +GLXEW_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; +GLXEW_EXPORT GLboolean __GLXEW_ARB_get_proc_address; +GLXEW_EXPORT GLboolean __GLXEW_ARB_multisample; +GLXEW_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; +GLXEW_EXPORT GLboolean __GLXEW_ATI_render_texture; +GLXEW_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; +GLXEW_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; +GLXEW_EXPORT GLboolean __GLXEW_EXT_import_context; +GLXEW_EXPORT GLboolean __GLXEW_EXT_scene_marker; +GLXEW_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; +GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_info; +GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_rating; +GLXEW_EXPORT GLboolean __GLXEW_MESA_agp_offset; +GLXEW_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; +GLXEW_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; +GLXEW_EXPORT GLboolean __GLXEW_MESA_release_buffers; +GLXEW_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; +GLXEW_EXPORT GLboolean __GLXEW_NV_float_buffer; +GLXEW_EXPORT GLboolean __GLXEW_NV_vertex_array_range; +GLXEW_EXPORT GLboolean __GLXEW_OML_swap_method; +GLXEW_EXPORT GLboolean __GLXEW_OML_sync_control; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_color_range; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_multisample; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_fbconfig; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_pbuffer; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_group; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_video_resize; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; +GLXEW_EXPORT GLboolean __GLXEW_SGI_cushion; +GLXEW_EXPORT GLboolean __GLXEW_SGI_make_current_read; +GLXEW_EXPORT GLboolean __GLXEW_SGI_swap_control; +GLXEW_EXPORT GLboolean __GLXEW_SGI_video_sync; +GLXEW_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; +GLXEW_EXPORT GLboolean __GLXEW_SUN_video_resize; + +#ifdef GLEW_MX +}; /* GLXEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------ */ + +#ifdef GLEW_MX + +typedef struct GLXEWContextStruct GLXEWContext; +extern GLenum glxewContextInit (GLXEWContext* ctx); +extern GLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name); + +#define glxewInit() glxewContextInit(glxewGetContext()) +#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x) + +#define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x)) +#define GLXEW_GET_FUN(x) x + +#else /* GLEW_MX */ + +#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) +#define GLXEW_GET_FUN(x) x + +extern GLboolean glxewIsSupported (const char* name); + +#endif /* GLEW_MX */ + +extern GLboolean glxewGetExtension (const char* name); + +#ifdef __cplusplus +} +#endif + +#endif /* __glxew_h__ */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdlePreset.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdlePreset.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdlePreset.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdlePreset.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,206 @@ +#include "IdlePreset.hpp" +#include +#include + +const std::string IdlePreset::IDLE_PRESET_NAME + ("Geiss & Sperl - Feedback (projectM idle HDR mix)"); + +std::string IdlePreset::presetText() { + +std::ostringstream out; + +out << "[preset00]\n" << +"fRating=2.000000\n" << +"fGammaAdj=1.700000\n" << +"fDecay=0.940000\n" << +"fVideoEchoZoom=1.000000\n" << +"fVideoEchoAlpha=0.000000\n" << +"nVideoEchoOrientation=0\n" << +"nWaveMode=0\n" << +"bAdditiveWaves=1\n" << +"bWaveDots=0\n" << +"bWaveThick=0\n" << +"bModWaveAlphaByVolume=0\n" << +"bMaximizeWaveColor=0\n" << +"bTexWrap=1\n" << +"bDarkenCenter=0\n" << +"bRedBlueStereo=0\n" << +"bBrighten=0\n" << +"bDarken=0\n" << +"bSolarize=0\n" << +"bInvert=0\n" << +"fWaveAlpha=0.001000\n" << +"fWaveScale=0.010000\n" << +"fWaveSmoothing=0.630000\n" << +"fWaveParam=-1.000000\n" << +"fModWaveAlphaStart=0.710000\n" << +"fModWaveAlphaEnd=1.300000\n" << +"fWarpAnimSpeed=1.000000\n" << +"fWarpScale=1.331000\n" << +"fZoomExponent=1.000000\n" << +"fShader=0.000000\n" << +"zoom=13.290894\n" << +"rot=-0.020000\n" << +"cx=0.500000\n" << +"cy=0.500000\n" << +"dx=-0.280000\n" << +"dy=-0.320000\n" << +"warp=0.010000\n" << +"sx=1.000000\n" << +"sy=1.000000\n" << +"wave_r=0.650000\n" << +"wave_g=0.650000\n" << +"wave_b=0.650000\n" << +"wave_x=0.500000\n" << +"wave_y=0.500000\n" << +"ob_size=0.000000\n" << +"ob_r=0.010000\n" << +"ob_g=0.000000\n" << +"ob_b=0.000000\n" << +"ob_a=1.000000\n" << +"ib_size=0.000000\n" << +"ib_r=0.950000\n" << +"ib_g=0.850000\n" << +"ib_b=0.650000\n" << +"ib_a=1.000000\n" << +"nMotionVectorsX=64.000000\n" << +"nMotionVectorsY=0.000000\n" << +"mv_dx=0.000000\n" << +"mv_dy=0.000000\n" << +"mv_l=0.900000\n" << +"mv_r=1.000000\n" << +"mv_g=1.000000\n" << +"mv_b=1.000000\n" << +"mv_a=0.000000\n" << +"shapecode_3_enabled=1\n" << +"shapecode_3_sides=20\n" << +"shapecode_3_additive=0\n" << +"shapecode_3_thickOutline=0\n" << +"shapecode_3_textured=1\n" << +"shapecode_3_ImageURL=M.tga\n" << +"shapecode_3_x=0.68\n" << +"shapecode_3_y=0.5\n" << +"shapecode_3_rad=0.41222\n" << +"shapecode_3_ang=0\n" << +"shapecode_3_tex_ang=0\n" << +"shapecode_3_tex_zoom=0.71\n" << +"shapecode_3_r=1\n" << +"shapecode_3_g=1\n" << +"shapecode_3_b=1\n" << +"shapecode_3_a=1\n" << +"shapecode_3_r2=1\n" << +"shapecode_3_g2=1\n" << +"shapecode_3_b2=1\n" << +"shapecode_3_a2=1\n" << +"shapecode_3_border_r=0\n" << +"shapecode_3_border_g=0\n" << +"shapecode_3_border_b=0\n" << +"shapecode_3_border_a=0\n" << +"shape_3_per_frame1=x = x + q1;\n" << +"shape_3_per_frame2=y = y + q2;\n" << +"shape_3_per_frame3=r =0.5 + 0.5*sin(q8*0.613 + 1);\n" << +"shape_3_per_frame4=g = 0.5 + 0.5*sin(q8*0.763 + 2);\n" << +"shape_3_per_frame5=b = 0.5 + 0.5*sin(q8*0.771 + 5);\n" << +"shape_3_per_frame6=r2 = 0.5 + 0.5*sin(q8*0.635 + 4);\n" << +"shape_3_per_frame7=g2 = 0.5 + 0.5*sin(q8*0.616+ 1);\n" << +"shape_3_per_frame8=b2 = 0.5 + 0.5*sin(q8*0.538 + 3);\n" << +"shapecode_4_enabled=1\n" << +"shapecode_4_sides=4\n" << +"shapecode_4_additive=0\n" << +"shapecode_4_thickOutline=0\n" << +"shapecode_4_textured=1\n" << +"shapecode_4_ImageURL=headphones.tga\n" << +"shapecode_4_x=0.68\n" << +"shapecode_4_y=0.58\n" << +"shapecode_4_rad=0.6\n" << +"shapecode_4_ang=0\n" << +"shapecode_4_tex_ang=0\n" << +"shapecode_4_tex_zoom=0.71\n" << +"shapecode_4_r=1\n" << +"shapecode_4_g=1\n" << +"shapecode_4_b=1\n" << +"shapecode_4_a=1\n" << +"shapecode_4_r2=1\n" << +"shapecode_4_g2=1\n" << +"shapecode_4_b2=1\n" << +"shapecode_4_a2=1\n" << +"shapecode_4_border_r=0\n" << +"shapecode_4_border_g=0\n" << +"shapecode_4_border_b=0\n" << +"shapecode_4_border_a=0\n" << +"shape_4_per_frame1=x = x + q1;\n" << +"shape_4_per_frame2=y = y + q2;\n" << +"shape_4_per_frame3=rad = rad + bass * 0.1;\n" << +"shape_4_per_frame4=a = q3;\n" << +"shape_4_per_frame5=a2 = q3;\n" << +"shapecode_6_enabled=1\n" << +"shapecode_6_sides=4\n" << +"shapecode_6_additive=0\n" << +"shapecode_6_thickOutline=0\n" << +"shapecode_6_textured=1\n" << +"shapecode_6_ImageURL=project.tga\n" << +"shapecode_6_x=0.38\n" << +"shapecode_6_y=0.435\n" << +"shapecode_6_rad=0.8\n" << +"shapecode_6_ang=0\n" << +"shapecode_6_tex_ang=0\n" << +"shapecode_6_tex_zoom=0.71\n" << +"shapecode_6_r=1\n" << +"shapecode_6_g=1\n" << +"shapecode_6_b=1\n" << +"shapecode_6_a=1\n" << +"shapecode_6_r2=1\n" << +"shapecode_6_g2=1\n" << +"shapecode_6_b2=1\n" << +"shapecode_6_a2=1\n" << +"shapecode_6_border_r=0\n" << +"shapecode_6_border_g=0\n" << +"shapecode_6_border_b=0\n" << +"shapecode_6_border_a=0\n" << +"shape_6_per_frame1=x = x + q1;\n" << +"shape_6_per_frame2=y = y + q2;\n" << +"shape_6_per_frame3=a = q3;\n" << +"shape_6_per_frame4=a2 = q3;\n" << +"per_frame_1=ob_r = 0.5 + 0.4*sin(time*1.324);\n" << +"per_frame_2=ob_g = 0.5 + 0.4*cos(time*1.371);\n" << +"per_frame_3=ob_b = 0.5+0.4*sin(2.332*time);\n" << +"per_frame_4=ib_r = 0.5 + 0.25*sin(time*1.424);\n" << +"per_frame_5=ib_g = 0.25 + 0.25*cos(time*1.871);\n" << +"per_frame_6=ib_b = 1-ob_b;\n" << +"per_frame_7=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att);\n" << +"per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg);\n" << +"per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp);\n" << +"per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir));\n" << +"per_frame_11=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp);\n" << +"per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp);\n" << +"per_frame_13=xpos = xpos + 0.001*xspeed;\n" << +"per_frame_14=dx = xpos*0.05;\n" << +"per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg);\n" << +"per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp);\n" << +"per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir));\n" << +"per_frame_18=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp);\n" << +"per_frame_19=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp);\n" << +"per_frame_20=ypos = ypos + 0.001*yspeed;\n" << +"per_frame_21=dy = ypos*0.05;\n" << +"per_frame_22=wave_a = 0;\n" << +"per_frame_23=q8 = oldq8 + 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps);\n" << +"per_frame_24=oldq8 = q8;\n" << +"per_frame_25=q7 = 0.003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps);\n" << +"per_frame_26=rot = 0.4 + 1.5*sin(time*0.273) + 0.4*sin(time*0.379+3);\n" << +"per_frame_27=q1 = 0.05*sin(time*1.14);\n" << +"per_frame_28=q2 = 0.03*sin(time*0.93+2);\n" << +"per_frame_29=q3 = if(above(frame,60),1, frame/60.0);\n" << +"per_frame_30=oldq8 = if(above(oldq8,1000),0,oldq8);\n" << +"per_pixel_1=zoom =( log(sqrt(2)-rad) -0.24)*1;\n"; + +return out.str(); + +} + +std::unique_ptr IdlePreset::allocate( PresetInputs & presetInputs, PresetOutputs & presetOutputs) +{ + + std::istringstream in(presetText()); + return std::unique_ptr(new Preset(in, IDLE_PRESET_NAME, presetInputs, presetOutputs)); +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdlePreset.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdlePreset.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdlePreset.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdlePreset.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,21 @@ +#ifndef IDLE_PRESET_HPP +#define IDLE_PRESET_HPP +#include +#include "PresetFrameIO.hpp" +#include "Preset.hpp" + +/// A preset that does not depend on the file system to be loaded. This allows projectM to render +/// something (ie. self indulgent project advertisting) even when no valid preset directory is found. +class IdlePreset { + + public: + /// Allocate a new idle preset instance + /// \param presetInputs the preset inputs instance to associate with the preset + /// \param presetOutputs the preset output instance to associate with the preset + /// \returns a newly allocated auto pointer of an idle preset instance + static std::unique_ptr allocate(PresetInputs & presetInputs, PresetOutputs & presetOutputs); + private: + static std::string presetText(); + static const std::string IDLE_PRESET_NAME; +}; +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdleTextures.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdleTextures.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdleTextures.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/IdleTextures.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,5985 @@ + +/* begin binary data: */ +const int M_bytes = 27965; + +/* begin binary data: */ +const unsigned char M_data[] = /* 27965 */ +{0x00,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00 +,0x01,0x20,0x08,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xAD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7D,0xFF,0x00 +,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xAD,0x00 +,0x00,0x00,0xFF,0xAD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC7,0xFF,0x00 +,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00 +,0x00,0xEC,0xAD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0xAC,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x13,0xFF,0x00,0x00,0x00 +,0x00,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0xAD,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xC2,0xAD,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x5A,0xFF,0x00,0x00,0x00,0x00,0x9F,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x7D,0xAD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xC2,0x00,0x00,0x00,0x00,0x6C,0x83,0x00,0x00,0x00,0xFF,0x00,0x0D,0x0D,0x0D +,0xFF,0xA3,0x37,0x37,0x37,0xFF,0x00,0x2B,0x2B,0x2B,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xA4,0xFF,0x00,0x00,0x00,0x00,0x9F,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xC5,0x83,0x00,0x00,0x00,0xFF,0x00,0x34,0x34,0x34 +,0xFF,0xA3,0x37,0x37,0x37,0xFF,0x00,0x0D,0x0D,0x0D,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x6B,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xFD +,0x82,0x00,0x00,0x00,0xFF,0x01,0x10,0x10,0x10,0xFF,0xF9,0xF9,0xF9,0xFF,0xA2 +,0xFF,0xFF,0xFF,0xFF,0x01,0xF0,0xF0,0xF0,0xFF,0x04,0x04,0x04,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEB,0x00,0x00,0x00,0x02,0xFF,0x00,0x00 +,0x00,0x00,0x9D,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00 +,0xFC,0x82,0x00,0x00,0x00,0xFF,0x00,0x1C,0x1C,0x1C,0xFF,0xA3,0xFF,0xFF,0xFF +,0xFF,0x01,0xF9,0xF9,0xF9,0xFF,0x10,0x10,0x10,0xFF,0x82,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x17,0x01,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0xBF,0x83,0x00,0x00,0x00,0xFF,0x00,0xB3,0xB3,0xB3,0xFF,0xA3,0xFF +,0xFF,0xFF,0xFF,0x00,0x3E,0x3E,0x3E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x37,0xFF,0x00,0x00,0x00,0x00,0x9D,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x54,0x83,0x00,0x00,0x00,0xFF,0x00,0x63,0x63,0x63,0xFF,0xA3,0xFF +,0xFF,0xFF,0xFF,0x00,0xB2,0xB2,0xB2,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xBD,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x69,0x83,0x00,0x00,0x00,0xFF,0x00,0x5D,0x5D,0x5D,0xFF,0xA3,0xFF,0xFF,0xFF +,0xFF,0x00,0x87,0x87,0x87,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x80,0xFF,0x00,0x00,0x00,0x00,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x9C,0x83,0x00,0x00,0x00,0xFF,0x00,0xAA,0xAA,0xAA,0xFF,0xA3,0xFF,0xFF,0xFF +,0xFF,0x00,0x5B,0x5B,0x5B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0x66,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x00 +,0x00,0x00,0xFC,0x82,0x00,0x00,0x00,0xFF,0x01,0x0E,0x0E,0x0E,0xFF,0xF8,0xF8 +,0xF8,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0xD1,0xD1,0xD1,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xCA,0xFF,0x00,0x00,0x00,0x00,0x9D,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xE4,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03 +,0x03,0xFF,0xEF,0xEF,0xEF,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x01,0xF7,0xF7,0xF7 +,0xFF,0x0D,0x0D,0x0D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xFB +,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0xBC,0x83,0x00,0x00,0x00,0xFF,0x00,0xB1,0xB1,0xB1,0xFF,0xA3,0xFF +,0xFF,0xFF,0xFF,0x00,0x1B,0x1B,0x1B,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xFE,0x00,0x00,0x00,0x15,0xFF,0x00,0x00,0x00,0x00,0x9B,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x83,0x00,0x00,0x00,0xFF,0x00,0x3A,0x3A +,0x3A,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00,0xAD,0xAD,0xAD,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x81,0x00,0x00,0x00,0x00,0x81,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x83,0x00,0x00,0x00,0xFF,0x00,0x5A,0x5A +,0x5A,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00,0x64,0x64,0x64,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x5D,0xFF,0x00,0x00,0x00,0x00,0x9B,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x83,0x00,0x00,0x00,0xFF,0x00,0x81,0x81 +,0x81,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00,0x56,0x56,0x56,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0x81,0x00,0x00,0x00,0x00,0x81,0x00,0x00 +,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7,0xF7,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF +,0x00,0xAD,0xAD,0xAD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA6 +,0xFF,0x00,0x00,0x00,0x00,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBB +,0x83,0x00,0x00,0x00,0xFF,0x00,0xC9,0xC9,0xC9,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF +,0x01,0xF4,0xF4,0xF4,0xFF,0x0A,0x0A,0x0A,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x10,0x81,0x00,0x00,0x00,0x00,0x82,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB9,0x83,0x00,0x00,0x00,0xFF,0x00,0xAE +,0xAE,0xAE,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x05,0x05 +,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xED,0x00,0x00,0x00 +,0x02,0xFF,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 +,0x0A,0x00,0x00,0x00,0xF8,0x82,0x00,0x00,0x00,0xFF,0x01,0x13,0x13,0x13,0xFF +,0xFD,0xFD,0xFD,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0xA8,0xA8,0xA8,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB3,0x82,0x00,0x00,0x00,0x00,0x82 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x58,0x58,0x58,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00,0x40,0x40,0x40,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x39,0xFF,0x00,0x00,0x00,0x00,0x99 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4B,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x59,0x59,0x59,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00,0x51,0x51,0x51,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5C,0x82,0x00,0x00,0x00,0x00,0x82 +,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xFA,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x0B,0x0B,0x0B,0xFF,0xF6,0xF6,0xF6,0xFF,0xA2,0xFF,0xFF +,0xFF,0xFF,0x00,0x8A,0x8A,0x8A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x83,0xFF,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x93,0x83,0x00,0x00,0x00,0xFF,0x00,0xA0,0xA0,0xA0,0xFF,0xA2,0xFF,0xFF +,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x0D,0x82,0x00,0x00,0x00,0x00 +,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB7,0x83,0x00,0x00,0x00,0xFF +,0x00,0xAB,0xAB,0xAB,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0xD3,0xD3,0xD3,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCC,0xFF,0x00,0x00,0x00,0x00 +,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0x82,0x00,0x00,0x00,0xFF +,0x01,0x01,0x01,0x01,0xFF,0xE7,0xE7,0xE7,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00 +,0xA3,0xA3,0xA3,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAE,0x83 +,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x55,0x55,0x55,0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0x00 +,0x1D,0x1D,0x1D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x17,0xFF,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x22,0x83,0x00,0x00,0x00,0xFF,0x00,0x30,0x30,0x30,0xFF,0xA3,0xFF +,0xFF,0xFF,0xFF,0x00,0x4C,0x4C,0x4C,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x57,0x83,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x01,0x00 +,0x00,0x00,0x10,0x00,0x00,0x00,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01,0x0A,0x0A +,0x0A,0xFF,0xF4,0xF4,0xF4,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x66,0x66,0x66 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5F,0xFF,0x00,0x00,0x00 +,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6A,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x77,0x77,0x77,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x01,0xEF,0xEF,0xEF +,0xFF,0x06,0x06,0x06,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF5 +,0x00,0x00,0x00,0x0B,0x83,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0xB4,0x83,0x00,0x00,0x00,0xFF,0x00,0xA8,0xA8,0xA8,0xFF,0xA2 +,0xFF,0xFF,0xFF,0xFF,0x00,0xB0,0xB0,0xB0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xA9,0xFF,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0xB2,0x83,0x00,0x00,0x00,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0xA2 +,0xFF,0xFF,0xFF,0xFF,0x00,0x9E,0x9E,0x9E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xA9,0x84,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x5E,0x83,0x00,0x00,0x00,0xFF,0x00,0x52,0x52,0x52,0xFF,0xA2 +,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3,0xFF,0x06,0x06,0x06,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x03,0xFF,0x00,0x00 +,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00 +,0xF3,0x82,0x00,0x00,0x00,0xFF,0x01,0x0C,0x0C,0x0C,0xFF,0xFA,0xFA,0xFA,0xFF +,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x47,0x47,0x47,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x52,0x84,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00 +,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xF8,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x09,0x09,0x09,0xFF,0xF3,0xF3,0xF3,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x43 +,0x43,0x43,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3C,0xFF,0x00 +,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x4E,0x4E,0x4E,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x01,0xEB +,0xEB,0xEB,0xFF,0x04,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xF2,0x00,0x00,0x00,0x08,0x84,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xB1,0x83,0x00,0x00,0x00,0xFF,0x00,0xA6,0xA6,0xA6 +,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x8C,0x8C,0x8C,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x85,0xFF,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x89,0x83,0x00,0x00,0x00,0xFF,0x00,0x96,0x96,0x96 +,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x99,0x99,0x99,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xA4,0x85,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x5B,0x83,0x00,0x00,0x00,0xFF,0x00,0x4F,0x4F,0x4F +,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0xD6,0xD6,0xD6,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xCF,0xFF,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xD1,0x83,0x00,0x00,0x00,0xFF,0x00,0xDE,0xDE,0xDE +,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x42,0x42,0x42,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x4D,0x85,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00 +,0x00,0x01,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xF7,0x82,0x00,0x00,0x00,0xFF +,0x01,0x07,0x07,0x07,0xFF,0xF1,0xF1,0xF1,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00 +,0x20,0x20,0x20,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x19,0xFF,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x1A,0x83,0x00,0x00,0x00,0xFF,0x00,0x25,0x25,0x25,0xFF,0xA2,0xFF +,0xFF,0xFF,0xFF,0x01,0xE8,0xE8,0xE8,0xFF,0x03,0x03,0x03,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x06,0x85,0x00,0x00,0x00 +,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAE,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xA3,0xA3,0xA3,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x69,0x69,0x69 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0xFF,0x00,0x00,0x00 +,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x94,0x94,0x94 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9F,0x86,0x00,0x00,0x00 +,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x4D,0x4D,0x4D,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0xB3,0xB3,0xB3 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAB,0xFF,0x00,0x00,0x00 +,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x3D,0x3D,0x3D +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x48,0x86,0x00,0x00,0x00 +,0x00,0x86,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0xF6 +,0x82,0x00,0x00,0x00,0xFF,0x01,0x06,0x06,0x06,0xFF,0xF0,0xF0,0xF0,0xFF,0xA1 +,0xFF,0xFF,0xFF,0xFF,0x01,0xF4,0xF4,0xF4,0xFF,0x07,0x07,0x07,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x04,0xFF,0x00,0x00 +,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00 +,0xED,0x82,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF5,0xF5,0xF5,0xFF +,0xA1,0xFF,0xFF,0xFF,0xFF,0x01,0xE4,0xE4,0xE4,0xFF,0x01,0x01,0x01,0xFF,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x04,0x86,0x00 +,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x83,0x00 +,0x00,0x00,0xFF,0x00,0xA0,0xA0,0xA0,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x46 +,0x46,0x46,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3E,0xFF,0x00 +,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x44,0x44,0x44,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x8F +,0x8F,0x8F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9A,0x87,0x00 +,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x4A,0x4A,0x4A,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x8F +,0x8F,0x8F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x87,0xFF,0x00 +,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x8C,0x8C,0x8C,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x38 +,0x38,0x38,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x43,0x87,0x00 +,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00 +,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF,0x01,0x05,0x05,0x05,0xFF,0xEE,0xEE,0xEE +,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xD9,0xD9,0xD9,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xD1,0xFF,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xC8,0x83,0x00,0x00,0x00,0xFF,0x00,0xD4,0xD4,0xD4 +,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xE0,0xE0,0xE0,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xE9,0x00,0x00,0x00,0x03,0x87,0x00,0x00,0x00,0x00 +,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA9,0x83,0x00,0x00,0x00,0xFF +,0x00,0x9D,0x9D,0x9D,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x22,0x22,0x22,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x1B,0xFF,0x00,0x00,0x00,0x00 +,0x8F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xFD,0x82 +,0x00,0x00,0x00,0xFF,0x00,0x1C,0x1C,0x1C,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00 +,0x8A,0x8A,0x8A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x95,0x88 +,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x47,0x47,0x47,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00 +,0x6C,0x6C,0x6C,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x64,0xFF +,0x00,0x00,0x00,0x00,0x8F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x63,0x63,0x63,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00 +,0x33,0x33,0x33,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3E,0x88 +,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x09,0x00 +,0x00,0x00,0xF3,0x82,0x00,0x00,0x00,0xFF,0x01,0x04,0x04,0x04,0xFF,0xEC,0xEC +,0xEC,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xAD,0xFF,0x00,0x00,0x00,0x00,0x8F,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x9F,0x83,0x00,0x00,0x00,0xFF,0x00,0xAB,0xAB +,0xAB,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xDB,0xDB,0xDB,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xE5,0x00,0x00,0x00,0x02,0x88,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x9B,0x9B,0x9B,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6 +,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1 +,0x00,0x00,0x00,0x05,0xFF,0x00,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0xE6,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEF +,0xEF,0xEF,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x85,0x85,0x85,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x90,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x83,0x00,0x00,0x00,0xFF,0x00,0x44 +,0x44,0x44,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x48,0x48,0x48,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0xFF,0x00,0x00,0x00,0x00,0x8D,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2F,0x83,0x00,0x00,0x00,0xFF,0x00,0x3A +,0x3A,0x3A,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x2E,0x2E,0x2E,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x39,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF1,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEA,0xEA,0xEA,0xFF,0xA1,0xFF,0xFF,0xFF +,0xFF,0x00,0x92,0x92,0x92,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x8A,0xFF,0x00,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x76,0x83,0x00,0x00,0x00,0xFF,0x00,0x82,0x82,0x82,0xFF,0xA1,0xFF,0xFF,0xFF +,0xFF,0x00,0xD7,0xD7,0xD7,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xE1,0x00,0x00,0x00,0x01,0x89,0x00,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xA3,0x83,0x00,0x00,0x00,0xFF,0x00,0x98,0x98,0x98,0xFF +,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xDB,0xDB,0xDB,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xD3,0xFF,0x00,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xBE,0x83,0x00,0x00,0x00,0xFF,0x00,0xC9,0xC9,0xC9,0xFF +,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80,0x80,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x8B,0x8A,0x00,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x4D,0x83,0x00,0x00,0x00,0xFF,0x00,0x42,0x42,0x42,0xFF +,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x25,0x25,0x25,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x1D,0xFF,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0x00 +,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x13,0x13,0x13,0xFF,0xFD,0xFD,0xFD,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x29 +,0x29,0x29,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x34,0x8A,0x00 +,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00 +,0x00,0xF0,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xE8,0xE8,0xE8 +,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x6E,0x6E,0x6E,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x66,0xFF,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x4E,0x83,0x00,0x00,0x00,0xFF,0x00,0x59,0x59,0x59 +,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xD2,0xD2,0xD2,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xDD,0x8B,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xA0,0x83,0x00,0x00,0x00,0xFF,0x00,0x95,0x95,0x95 +,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xB8,0xB8,0xB8,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xB0,0xFF,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x95,0x83,0x00,0x00,0x00,0xFF,0x00,0xA0,0xA0,0xA0 +,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x7B,0x7B,0x7B,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x86,0x8B,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x4A,0x83,0x00,0x00,0x00,0xFF,0x00,0x3F,0x3F,0x3F +,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x01,0xF7,0xF7,0xF7,0xFF,0x0A,0x0A,0x0A,0xFF +,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0x06,0xFF +,0x00,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDD,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE7,0xE7,0xE7,0xFF,0xA1,0xFF +,0xFF,0xFF,0xFF,0x00,0x24,0x24,0x24,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x2F,0x8B,0x00,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0x00,0x01,0x00 +,0x00,0x00,0x05,0x00,0x00,0x00,0xEE,0x82,0x00,0x00,0x00,0xFF,0x01,0x02,0x02 +,0x02,0xFF,0xE6,0xE6,0xE6,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x4B,0x4B,0x4B +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x43,0xFF,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x30,0x30,0x30,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xCD,0xCD,0xCD +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD8,0x8C,0x00,0x00,0x00 +,0x00,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x92,0x92,0x92,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x94,0x94,0x94 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0xFF,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6D,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x77,0x77,0x77,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x76,0x76,0x76 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x81,0x8C,0x00,0x00,0x00 +,0x00,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x3C,0x3C,0x3C,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xDE,0xDE,0xDE +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD6,0xFF,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x20,0x20,0x20 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2A,0x8C,0x00,0x00,0x00 +,0x00,0x8C,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xEC +,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE4,0xE4,0xE4,0xFF,0xA1 +,0xFF,0xFF,0xFF,0xFF,0x00,0x27,0x27,0x27,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x1F,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x94 +,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x48,0xB7,0x00,0x00,0x00,0x00,0x01 +,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF5,0x82,0x00,0x00,0x00,0xFF,0x01,0x0C +,0x0C,0x0C,0xFF,0xFA,0xFA,0xFA,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xC8,0xC8 +,0xC8,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD3,0x8D,0x00,0x00 +,0x00,0x00,0x8D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9B,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x90,0x90,0x90,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x71,0x71 +,0x71,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x69,0xB7,0x00,0x00 +,0x00,0x00,0x01,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xFD,0x94,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x05,0xB6,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x44,0x83,0x00,0x00,0x00,0xFF,0x00,0x4E,0x4E,0x4E,0xFF +,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x71,0x71,0x71,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x7C,0x8D,0x00,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x44,0x83,0x00,0x00,0x00,0xFF,0x00,0x39,0x39,0x39,0xFF +,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xBA,0xBA,0xBA,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB2,0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73 +,0x96,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4B,0xB6,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x8C,0x83,0x00,0x00,0x00,0xFF,0x00,0x96,0x96,0x96,0xFF +,0xA0,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1B,0x1B,0x1B,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x26,0x8D,0x00,0x00,0x00,0x00,0x8D +,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xEA,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE2,0xE2,0xE2,0xFF,0xA0,0xFF,0xFF +,0xFF,0xFF,0x01,0xF8,0xF8,0xF8,0xFF,0x0B,0x0B,0x0B,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x07,0xB6,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xCB,0x96,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA3 +,0xB6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x83,0x00,0x00,0x00,0xFF +,0x00,0xDE,0xDE,0xDE,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xC3,0xC3,0xC3,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF,0x8E,0x00,0x00,0x00,0x00 +,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x83,0x00,0x00,0x00,0xFF +,0x00,0x8D,0x8D,0x8D,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x4D,0x4D,0x4D,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x45,0xB5,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x23,0x97,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2 +,0x00,0x00,0x00,0x08,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x26,0x26,0x26,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00 +,0x6C,0x6C,0x6C,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x78,0x8E +,0x00,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x37,0x37,0x37,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00 +,0x97,0x97,0x97,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8F,0xB5 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7A,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x4D,0x4D,0x4D,0xFF,0x8E,0x9F,0x9F,0x9F,0xFF,0x00,0x34,0x34,0x34,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x52,0xB4,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x63,0x83,0x00,0x00,0x00,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0xA0 +,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x18,0x18,0x18,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x21,0x8E,0x00,0x00,0x00,0x00,0x8E,0x00 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xE8,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xE0,0xE0,0xE0,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xE0,0xE0 +,0xE0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD8,0xB5,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xD2,0x83,0x00,0x00,0x00,0xFF,0x00,0xC2,0xC2 +,0xC2,0xFF,0x8E,0xFF,0xFF,0xFF,0xFF,0x00,0x9A,0x9A,0x9A,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xAA,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0xA0,0xFF,0xFF +,0xFF,0xFF,0x00,0xBE,0xBE,0xBE,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xCA,0x8F,0x00,0x00,0x00,0x00,0x8F,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x95,0x83,0x00,0x00,0x00,0xFF,0x00,0x8A,0x8A,0x8A,0xFF,0xA1,0xFF,0xFF +,0xFF,0xFF,0x00,0x2A,0x2A,0x2A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x22,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,0x83,0x00,0x00 +,0x00,0xFF,0x01,0x1C,0x1C,0x1C,0xFF,0xFE,0xFE,0xFE,0xFF,0x8E,0xFF,0xFF,0xFF +,0xFF,0x01,0xED,0xED,0xED,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x0C,0xB2,0x00,0x00,0x00,0x00,0x01 +,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xEF,0x82,0x00,0x00,0x00,0xFF,0x01,0x07 +,0x07,0x07,0xFF,0xF5,0xF5,0xF5,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x67,0x67 +,0x67,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x73,0x8F,0x00,0x00 +,0x00,0x00,0x8F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x34,0x34,0x34,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x73,0x73 +,0x73,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6B,0xB3,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x83,0x00,0x00,0x00,0xFF,0x00,0x72,0x72 +,0x72,0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0x4A,0x4A,0x4A,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x5A,0xB2,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x3B,0x83,0x00,0x00,0x00,0xFF,0x00,0x44,0x44,0x44,0xFF,0xA0,0xFF,0xFF +,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x14,0x14,0x14,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1D,0x8F,0x00,0x00,0x00,0x00 +,0x8F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE6,0x83 +,0x00,0x00,0x00,0xFF,0x00,0xDD,0xDD,0xDD,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00 +,0xBD,0xBD,0xBD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB4,0xB3 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA,0x83,0x00,0x00,0x00,0xFF,0x00 +,0xCA,0xCA,0xCA,0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0xA2,0xA2,0xA2,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB1,0xB2,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x82,0x83,0x00,0x00,0x00,0xFF,0x00,0x8C,0x8C,0x8C,0xFF,0xA0 +,0xFF,0xFF,0xFF,0xFF,0x00,0xB9,0xB9,0xB9,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xC5,0x90,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x92,0x83,0x00,0x00,0x00,0xFF,0x00,0x87,0x87,0x87,0xFF,0xA0 +,0xFF,0xFF,0xFF,0xFF,0x01,0xF9,0xF9,0xF9,0xFF,0x0C,0x0C,0x0C,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x08,0xB1,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x83,0x00,0x00,0x00,0xFF,0x00,0x22,0x22 +,0x22,0xFF,0x91,0xFF,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x08,0x08,0x08 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x10 +,0xB1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0x83,0x00,0x00,0x00,0xFF +,0x00,0xD4,0xD4,0xD4,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x62,0x62,0x62,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6E,0x90,0x00,0x00,0x00,0x00 +,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x83,0x00,0x00,0x00,0xFF +,0x00,0x31,0x31,0x31,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x50,0x50,0x50,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x47,0xB1,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x89,0x83,0x00,0x00,0x00,0xFF,0x00,0x7A,0x7A,0x7A,0xFF +,0x92,0xFF,0xFF,0xFF,0xFF,0x00,0x52,0x52,0x52,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x61,0xB0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14 +,0x00,0x00,0x00,0xFD,0x82,0x00,0x00,0x00,0xFF,0x00,0x1C,0x1C,0x1C,0xFF,0xA0 +,0xFF,0xFF,0xFF,0xFF,0x01,0xFA,0xFA,0xFA,0xFF,0x11,0x11,0x11,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x19,0x90,0x00,0x00 +,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 +,0xE4,0x83,0x00,0x00,0x00,0xFF,0x00,0xDB,0xDB,0xDB,0xFF,0xA0,0xFF,0xFF,0xFF +,0xFF,0x00,0x99,0x99,0x99,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x91,0xB0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE0 +,0x83,0x00,0x00,0x00,0xFF,0x00,0xD2,0xD2,0xD2,0xFF,0x92,0xFF,0xFF,0xFF,0xFF +,0x00,0xAA,0xAA,0xAA,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB9 +,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5A,0x83,0x00,0x00,0x00,0xFF +,0x00,0x63,0x63,0x63,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xB4,0xB4,0xB4,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC0,0x91,0x00,0x00,0x00,0x00 +,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x83,0x00,0x00,0x00,0xFF +,0x00,0x85,0x85,0x85,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xE2,0xE2,0xE2,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDA,0xB0,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x39,0x83,0x00,0x00,0x00,0xFF,0x00,0x2A,0x2A,0x2A,0xFF +,0x93,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6,0xFF,0x0C,0x0C,0x0C,0xFF,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x15,0xAF,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA2,0x83,0x00,0x00,0x00,0xFF,0x00,0xAB +,0xAB,0xAB,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x5D,0x5D,0x5D,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x69,0x91,0x00,0x00,0x00,0x00,0x91,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x83,0x00,0x00,0x00,0xFF,0x00,0x2E +,0x2E,0x2E,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0x2C,0x2C,0x2C,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x24,0xAF,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x91,0x83,0x00,0x00,0x00,0xFF,0x00,0x81,0x81,0x81,0xFF,0x94,0xFF +,0xFF,0xFF,0xFF,0x00,0x59,0x59,0x59,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x68,0xAE,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00 +,0x00,0xE8,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEF,0xEF,0xEF +,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xF8,0xF8,0xF8,0xFF,0x0E,0x0E,0x0E,0xFF +,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x15,0x91 +,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00 +,0x00,0x00,0xE2,0x83,0x00,0x00,0x00,0xFF,0x00,0xD8,0xD8,0xD8,0xFF,0xA0,0xFF +,0xFF,0xFF,0xFF,0x00,0x76,0x76,0x76,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x6D,0xAE,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00 +,0x00,0xE6,0x83,0x00,0x00,0x00,0xFF,0x00,0xD9,0xD9,0xD9,0xFF,0x94,0xFF,0xFF +,0xFF,0xFF,0x00,0xB1,0xB1,0xB1,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xC0,0xAE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x3A,0x3A,0x3A,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xAF,0xAF +,0xAF,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBB,0x92,0x00,0x00 +,0x00,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8D,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x82,0x82,0x82,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xBF,0xBF +,0xBF,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB7,0xAE,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x83,0x00,0x00,0x00,0xFF,0x00,0x31,0x31 +,0x31,0xFF,0x95,0xFF,0xFF,0xFF,0xFF,0x01,0xF9,0xF9,0xF9,0xFF,0x10,0x10,0x10 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x1A +,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x83,0x00,0x00,0x00,0xFF +,0x00,0x82,0x82,0x82,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x58,0x58,0x58,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x64,0x92,0x00,0x00,0x00,0x00 +,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x83,0x00,0x00,0x00,0xFF +,0x00,0x2C,0x2C,0x2C,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x01,0xFA,0xFA,0xFA,0xFF +,0x0E,0x0E,0x0E,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF7,0x00 +,0x00,0x00,0x09,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x89,0x89,0x89,0xFF,0x96,0xFF,0xFF,0xFF,0xFF,0x00,0x61 +,0x61,0x61,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x70,0xAD,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x83,0x00,0x00,0x00,0xFF,0x00,0xC9 +,0xC9,0xC9,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xF5,0xF5,0xF5,0xFF,0x0B,0x0B +,0x0B,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00 +,0x12,0x92,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0xDF,0x83,0x00,0x00,0x00,0xFF,0x00,0xD5,0xD5,0xD5,0xFF,0xA0,0xFF,0xFF,0xFF +,0xFF,0x00,0x52,0x52,0x52,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x4A,0xAC,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xEC +,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE0,0xE0,0xE0,0xFF,0x96 +,0xFF,0xFF,0xFF,0xFF,0x00,0xB9,0xB9,0xB9,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xC7,0xAC,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0E,0x00 +,0x00,0x00,0xFA,0x82,0x00,0x00,0x00,0xFF,0x01,0x13,0x13,0x13,0xFF,0xFD,0xFD +,0xFD,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0xAA,0xAA,0xAA,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xB6,0x93,0x00,0x00,0x00,0x00,0x93,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x8A,0x83,0x00,0x00,0x00,0xFF,0x00,0x7F,0x7F +,0x7F,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0x9C,0x9C,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x93,0xAC,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x48,0x83,0x00,0x00,0x00,0xFF,0x00,0x39,0x39,0x39,0xFF,0x97,0xFF,0xFF +,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x15,0x15,0x15,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x20,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x50,0x83,0x00,0x00,0x00,0xFF,0x00,0x59,0x59,0x59,0xFF,0xA0,0xFF,0xFF,0xFF +,0xFF,0x00,0x53,0x53,0x53,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x5F,0x93,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x34,0x83,0x00,0x00,0x00,0xFF,0x00,0x29,0x29,0x29,0xFF,0xA0,0xFF,0xFF,0xFF +,0xFF,0x00,0xE5,0xE5,0xE5,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xDD,0xAC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x91,0x91,0x91,0xFF,0x98,0xFF,0xFF,0xFF,0xFF,0x00,0x69,0x69,0x69 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x77,0xAB,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x98,0x83,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1 +,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3,0xFF,0x09,0x09,0x09,0xFF +,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x0F,0x93 +,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDD,0x83 +,0x00,0x00,0x00,0xFF,0x00,0xD3,0xD3,0xD3,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00 +,0x2F,0x2F,0x2F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x26,0xAA +,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF0,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE6,0xE6,0xE6,0xFF,0x98,0xFF,0xFF +,0xFF,0xFF,0x00,0xC1,0xC1,0xC1,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xCF,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE7,0xE7,0xE7,0xFF,0x9F,0xFF,0xFF,0xFF +,0xFF,0x00,0xA5,0xA5,0xA5,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xB1,0x94,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x87,0x83,0x00,0x00,0x00,0xFF,0x00,0x7C,0x7C,0x7C,0xFF,0xA0,0xFF,0xFF,0xFF +,0xFF,0x00,0x78,0x78,0x78,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x70,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x41,0x41,0x41,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD +,0xFF,0x1B,0x1B,0x1B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x27 +,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x83,0x00,0x00,0x00,0xFF +,0x00,0x30,0x30,0x30,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x4E,0x4E,0x4E,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5A,0x94,0x00,0x00,0x00,0x00 +,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x83,0x00,0x00,0x00,0xFF +,0x00,0x26,0x26,0x26,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xC2,0xC2,0xC2,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB9,0xAA,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xA8,0x83,0x00,0x00,0x00,0xFF,0x00,0x98,0x98,0x98,0xFF +,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0x70,0x70,0x70,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x7E,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F +,0x83,0x00,0x00,0x00,0xFF,0x00,0x78,0x78,0x78,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF +,0x01,0xF0,0xF0,0xF0,0xFF,0x06,0x06,0x06,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x0C,0x94,0x00,0x00,0x00,0x00,0x95,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA,0x83,0x00,0x00,0x00,0xFF,0x00,0xD0 +,0xD0,0xD0,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x10,0x10 +,0x10,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00 +,0x0A,0xA8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xF4 +,0x82,0x00,0x00,0x00,0xFF,0x01,0x04,0x04,0x04,0xFF,0xEC,0xEC,0xEC,0xFF,0x9A +,0xFF,0xFF,0xFF,0xFF,0x00,0xC8,0xC8,0xC8,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xD6,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB7,0x83 +,0x00,0x00,0x00,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00 +,0xA0,0xA0,0xA0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAC,0x95 +,0x00,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x7A,0x7A,0x7A,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00 +,0x55,0x55,0x55,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4C,0xA8 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x48,0x48,0x48,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x21,0x21,0x21,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2E,0xA7,0x00,0x00,0x00,0x00,0x01 +,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xF6,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D +,0x0D,0x0D,0xFF,0xFA,0xFA,0xFA,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x49,0x49 +,0x49,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x55,0x95,0x00,0x00 +,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x24,0x24,0x24,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x9E,0x9E +,0x9E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x96,0xA8,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xAF,0x83,0x00,0x00,0x00,0xFF,0x00,0xA0,0xA0 +,0xA0,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x78,0x78,0x78,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x86,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x47,0x83,0x00,0x00,0x00,0xFF,0x00,0x4F,0x4F,0x4F,0xFF,0x9F,0xFF,0xFF +,0xFF,0xFF,0x01,0xED,0xED,0xED,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x0A,0x95,0x00,0x00,0x00,0x00 +,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x83,0x00,0x00,0x00,0xFF +,0x00,0xCD,0xCD,0xCD,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xE7,0xE7,0xE7,0xFF +,0x01,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDF,0xA7 +,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xF8,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF0,0xF0,0xF0,0xFF,0x9C,0xFF,0xFF +,0xFF,0xFF,0x00,0xD0,0xD0,0xD0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xDD,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8F,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x96,0x96,0x96,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x9B,0x9B +,0x9B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA7,0x96,0x00,0x00 +,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x77,0x77,0x77,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x31,0x31 +,0x31,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x29,0xA6,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x5F,0x83,0x00,0x00,0x00,0xFF,0x00,0x50,0x50 +,0x50,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x28,0x28,0x28,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x35,0xA6,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0xD6,0x83,0x00,0x00,0x00,0xFF,0x00,0xDE,0xDE,0xDE,0xFF,0x9F,0xFF,0xFF +,0xFF,0xFF,0x00,0x44,0x44,0x44,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x50,0x96,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x2B,0x83,0x00,0x00,0x00,0xFF,0x00,0x21,0x21,0x21,0xFF,0xA0,0xFF,0xFF +,0xFF,0xFF,0x00,0x7B,0x7B,0x7B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x72,0xA6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB7,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xA8,0xA8,0xA8,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80 +,0x80,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8D,0xA5,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x83,0x00,0x00,0x00,0xFF,0x00,0x26,0x26 +,0x26,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xE9,0xE9,0xE9,0xFF,0x03,0x03,0x03 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x07 +,0x96,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5 +,0x83,0x00,0x00,0x00,0xFF,0x00,0xCA,0xCA,0xCA,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF +,0x00,0xC4,0xC4,0xC4,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBC +,0xA5,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xFB,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x0B,0x0B,0x0B,0xFF,0xF5,0xF5,0xF5,0xFF,0x9E,0xFF +,0xFF,0xFF,0xFF,0x00,0xD8,0xD8,0xD8,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xE3,0x00,0x00,0x00,0x01,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x66,0x83,0x00,0x00,0x00,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0x9F,0xFF,0xFF +,0xFF,0xFF,0x00,0x96,0x96,0x96,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xA2,0x97,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x7F,0x83,0x00,0x00,0x00,0xFF,0x00,0x74,0x74,0x74,0xFF,0x9F,0xFF,0xFF +,0xFF,0xFF,0x01,0xFC,0xFC,0xFC,0xFF,0x11,0x11,0x11,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x0C,0xA4,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x66,0x83,0x00,0x00,0x00,0xFF,0x00,0x58,0x58,0x58,0xFF +,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0x30,0x30,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x3D,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAE +,0x83,0x00,0x00,0x00,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF +,0x00,0x3F,0x3F,0x3F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4B +,0x97,0x00,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x1F,0x1F,0x1F,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF +,0x00,0x57,0x57,0x57,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4F +,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0x83,0x00,0x00,0x00,0xFF +,0x00,0xAF,0xAF,0xAF,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x87,0x87,0x87,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x94,0xA3,0x00,0x00,0x00,0x00 +,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF1,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x07,0x07,0x07,0xFF,0xF5,0xF5,0xF5,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xE5 +,0xE5,0xE5,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xEE,0x00,0x00,0x00,0x05,0x97,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xD2,0x83,0x00,0x00,0x00,0xFF,0x00,0xC8,0xC8,0xC8 +,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x98,0xA3,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 +,0x19,0x00,0x00,0x00,0xFD,0x82,0x00,0x00,0x00,0xFF,0x01,0x0F,0x0F,0x0F,0xFF +,0xF8,0xF8,0xF8,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0xDF,0xDF,0xDF,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE9,0x00,0x00,0x00,0x03,0xA2,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3D,0x83,0x00,0x00,0x00,0xFF,0x00,0x44 +,0x44,0x44,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x91,0x91,0x91,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0x98,0x00,0x00,0x00,0x00,0x98,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x83,0x00,0x00,0x00,0xFF,0x00,0x71 +,0x71,0x71,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xE9,0xE9,0xE9,0xFF,0x01,0x01 +,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE1,0xA3,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x83,0x00,0x00,0x00,0xFF,0x00,0x5F,0x5F +,0x5F,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x37,0x37,0x37,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x44,0xA2,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x85,0x83,0x00,0x00,0x00,0xFF,0x00,0x8C,0x8C,0x8C,0xFF,0x9F,0xFF,0xFF +,0xFF,0xFF,0x00,0x3A,0x3A,0x3A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x46,0x98,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x26,0x83,0x00,0x00,0x00,0xFF,0x01,0x1D,0x1D,0x1D,0xFF,0xFE,0xFE,0xFE +,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x34,0x34,0x34,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x2B,0xA2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0xC6,0x83,0x00,0x00,0x00,0xFF,0x00,0xB7,0xB7,0xB7,0xFF,0xA2,0xFF,0xFF,0xFF +,0xFF,0x00,0x8F,0x8F,0x8F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x9C,0xA2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCD,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xD4,0xD4,0xD4,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xE1,0xE1,0xE1 +,0xFF,0x01,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEB +,0x00,0x00,0x00,0x04,0x98,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF,0x00,0xC5,0xC5,0xC5,0xFF,0x9F +,0xFF,0xFF,0xFF,0xFF,0x00,0x7E,0x7E,0x7E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x74,0xA1,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1F,0x00 +,0x00,0x00,0xFE,0x82,0x00,0x00,0x00,0xFF,0x01,0x14,0x14,0x14,0xFF,0xFB,0xFB +,0xFB,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x01,0xE5,0xE5,0xE5,0xFF,0x02,0x02,0x02 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x05 +,0xA0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0xFE,0x82 +,0x00,0x00,0x00,0xFF,0x00,0x1C,0x1C,0x1C,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00 +,0x8C,0x8C,0x8C,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x98,0x99 +,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x6F,0x6F,0x6F,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00 +,0xC7,0xC7,0xC7,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBE,0xA1 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x67,0x67,0x67,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x00,0x3F,0x3F,0x3F,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4B,0xA0,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x5C,0x83,0x00,0x00,0x00,0xFF,0x00,0x63,0x63,0x63,0xFF,0x9F +,0xFF,0xFF,0xFF,0xFF,0x00,0x35,0x35,0x35,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x41,0x99,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x23,0x83,0x00,0x00,0x00,0xFF,0x01,0x1A,0x1A,0x1A,0xFF,0xFE +,0xFE,0xFE,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x13,0x13 +,0x13,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00 +,0x0D,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCD,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x00,0x97,0x97,0x97 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA3,0xA0,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xA4,0x83,0x00,0x00,0x00,0xFF,0x00,0xAB,0xAB,0xAB +,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xDD,0xDD,0xDD,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x02,0x99,0x00,0x00,0x00,0x00 +,0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCD,0x83,0x00,0x00,0x00,0xFF +,0x00,0xC2,0xC2,0xC2,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x5A,0x5A,0x5A,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x51,0x9F,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x25,0x83,0x00,0x00,0x00,0xFF,0x01,0x19,0x19,0x19,0xFF +,0xFD,0xFD,0xFD,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x01,0xEA,0xEA,0xEA,0xFF,0x04 +,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2,0x00,0x00 +,0x00,0x08,0x9E,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 +,0xEA,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEF,0xEF,0xEF,0xFF +,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x87,0x87,0x87,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x93,0x9A,0x00,0x00,0x00,0x00,0x9A,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x76,0x83,0x00,0x00,0x00,0xFF,0x00,0x6C,0x6C,0x6C,0xFF +,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0xA4,0xA4,0xA4,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x9A,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7D +,0x83,0x00,0x00,0x00,0xFF,0x00,0x6F,0x6F,0x6F,0xFF,0xA6,0xFF,0xFF,0xFF,0xFF +,0x00,0x47,0x47,0x47,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x53 +,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x83,0x00,0x00,0x00,0xFF +,0x00,0x3A,0x3A,0x3A,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0x30,0x30,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3C,0x9A,0x00,0x00,0x00,0x00 +,0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x83,0x00,0x00,0x00,0xFF +,0x01,0x18,0x18,0x18,0xFF,0xFD,0xFD,0xFD,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01 +,0xEB,0xEB,0xEB,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xE3,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5,0x83,0x00 +,0x00,0x00,0xFF,0x00,0xC6,0xC6,0xC6,0xFF,0xA6,0xFF,0xFF,0xFF,0xFF,0x00,0x9E +,0x9E,0x9E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAA,0x9E,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x83,0x00,0x00,0x00,0xFF,0x00,0x82 +,0x82,0x82,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xD9,0xD9,0xD9,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x01,0x9A,0x00,0x00 +,0x00,0x00,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x37,0x37 +,0x37,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2D,0x9D,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x83,0x00,0x00,0x00,0xFF,0x00,0x1F,0x1F +,0x1F,0xFF,0xA7,0xFF,0xFF,0xFF,0xFF,0x01,0xEF,0xEF,0xEF,0xFF,0x06,0x06,0x06 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x0C +,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC3,0x83,0x00,0x00,0x00,0xFF +,0x00,0xCA,0xCA,0xCA,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x82,0x82,0x82,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8E,0x9B,0x00,0x00,0x00,0x00 +,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x83,0x00,0x00,0x00,0xFF +,0x00,0x69,0x69,0x69,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80,0x80,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x77,0x9D,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x84,0x83,0x00,0x00,0x00,0xFF,0x00,0x76,0x76,0x76,0xFF +,0xA8,0xFF,0xFF,0xFF,0xFF,0x00,0x4E,0x4E,0x4E,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x5A,0x9C,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0F +,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF,0x01,0x14,0x14,0x14,0xFF,0xFD +,0xFD,0xFD,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x2B,0x2B,0x2B,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x37,0x9B,0x00,0x00,0x00,0x00,0x9B,0x00 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xFE,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x16,0x16,0x16,0xFF,0xFC,0xFC,0xFC,0xFF,0x9E,0xFF,0xFF,0xFF +,0xFF,0x00,0xCA,0xCA,0xCA,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xC0,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDC,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xCE,0xCE,0xCE,0xFF,0xA8,0xFF,0xFF,0xFF,0xFF,0x00,0xA6,0xA6,0xA6 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB2,0x9C,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x53,0x83,0x00,0x00,0x00,0xFF,0x00,0x59,0x59,0x59 +,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xD4,0xD4,0xD4,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xDF,0x9C,0x00,0x00,0x00,0x00,0x9C,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xC7,0x83,0x00,0x00,0x00,0xFF,0x00,0xBD,0xBD,0xBD +,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x15,0x15,0x15,0xFF +,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x0F,0x9B +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x26,0x26,0x26,0xFF,0xA9,0xFF,0xFF,0xFF,0xFF,0x01,0xF4,0xF4,0xF4,0xFF,0x0A +,0x0A,0x0A,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00 +,0x00,0x10,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9B,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x7D,0x7D +,0x7D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x89,0x9C,0x00,0x00 +,0x00,0x00,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x66,0x66,0x66,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x5D,0x5D +,0x5D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x53,0x9B,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x83,0x00,0x00,0x00,0xFF,0x00,0x7E,0x7E +,0x7E,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0x56,0x56,0x56,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0xE2,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE7,0xE7,0xE7 +,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x26,0x26,0x26,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x32,0x9C,0x00,0x00,0x00,0x00,0x9C,0x00,0x00,0x00 +,0x00,0x01,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xFE,0x82,0x00,0x00,0x00,0xFF +,0x01,0x14,0x14,0x14,0xFF,0xFB,0xFB,0xFB,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00 +,0xA6,0xA6,0xA6,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0x9A +,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE2,0x83,0x00 +,0x00,0x00,0xFF,0x00,0xD6,0xD6,0xD6,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0xAE +,0xAE,0xAE,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB9,0x9A,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,0x83,0x00,0x00,0x00,0xFF,0x00,0x30 +,0x30,0x30,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xCF,0xCF,0xCF,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDB,0x9D,0x00,0x00,0x00,0x00,0x9D,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0x83,0x00,0x00,0x00,0xFF,0x00,0xBA +,0xBA,0xBA,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xED,0xED,0xED,0xFF,0x02,0x02 +,0x02,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE5,0x9A,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x83,0x00,0x00,0x00,0xFF,0x00,0x2E,0x2E +,0x2E,0xFF,0xAB,0xFF,0xFF,0xFF,0xFF,0x01,0xF7,0xF7,0xF7,0xFF,0x0E,0x0E,0x0E +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x15 +,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x83,0x00,0x00,0x00,0xFF +,0x00,0x78,0x78,0x78,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x78,0x78,0x78,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x84,0x9D,0x00,0x00,0x00,0x00 +,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x83,0x00,0x00,0x00,0xFF +,0x00,0x64,0x64,0x64,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0x39,0x39,0x39,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x30,0x99,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x93,0x83,0x00,0x00,0x00,0xFF,0x00,0x86,0x86,0x86,0xFF +,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0x5E,0x5E,0x5E,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x69,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBA +,0x83,0x00,0x00,0x00,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF +,0x00,0x21,0x21,0x21,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2D +,0x9D,0x00,0x00,0x00,0x00,0x9D,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1A +,0x00,0x00,0x00,0xFD,0x82,0x00,0x00,0x00,0xFF,0x01,0x12,0x12,0x12,0xFF,0xFB +,0xFB,0xFB,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x83,0x83,0x83,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x79,0x98,0x00,0x00,0x00,0x00,0x01,0x00 +,0x00,0x00,0x03,0x00,0x00,0x00,0xE8,0x83,0x00,0x00,0x00,0xFF,0x00,0xDD,0xDD +,0xDD,0xFF,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xC0,0x98,0x00,0x00,0x00,0x00,0x01,0x00,0x00 +,0x00,0x0A,0x00,0x00,0x00,0xF8,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D +,0xFF,0xFA,0xFA,0xFA,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xCA,0xCA,0xCA,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD6,0x9E,0x00,0x00,0x00,0x00 +,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x83,0x00,0x00,0x00,0xFF +,0x00,0xB7,0xB7,0xB7,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xCC,0xCC,0xCC,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC3,0x98,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x43,0x83,0x00,0x00,0x00,0xFF,0x00,0x35,0x35,0x35,0xFF +,0xAD,0xFF,0xFF,0xFF,0xFF,0x01,0xFA,0xFA,0xFA,0xFF,0x12,0x12,0x12,0xFF,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x1A,0x97,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4A,0x83,0x00,0x00,0x00,0xFF,0x00,0x4F +,0x4F,0x4F,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x73,0x73,0x73,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7F,0x9E,0x00,0x00,0x00,0x00,0x9E,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6B,0x83,0x00,0x00,0x00,0xFF,0x00,0x61 +,0x61,0x61,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x17,0x17 +,0x17,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00 +,0x10,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9B,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x8D,0x8D,0x8D,0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0x00,0x65,0x65,0x65 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x70,0x97,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x91,0x83,0x00,0x00,0x00,0xFF,0x00,0x97,0x97,0x97 +,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1D,0x1D,0x1D,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x29,0x9E,0x00,0x00,0x00,0x00 +,0x9E,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xFD,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x11,0x11,0x11,0xFF,0xFA,0xFA,0xFA,0xFF,0x9E,0xFF +,0xFF,0xFF,0xFF,0x00,0x5F,0x5F,0x5F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x56,0x96,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00 +,0x00,0xED,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE3,0xE3,0xE3 +,0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0x00,0xBD,0xBD,0xBD,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xC8,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0xD9,0x83,0x00,0x00,0x00,0xFF,0x00,0xDE,0xDE,0xDE,0xFF,0x9D,0xFF,0xFF,0xFF +,0xFF,0x00,0xC5,0xC5,0xC5,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xD2,0x9F,0x00,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0xBF,0x83,0x00,0x00,0x00,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x9E,0xFF,0xFF,0xFF +,0xFF,0x00,0xA9,0xA9,0xA9,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x9F,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4A,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x3D,0x3D,0x3D,0xFF,0xAF,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD +,0xFF,0x18,0x18,0x18,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x20 +,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x83,0x00,0x00,0x00,0xFF +,0x00,0x26,0x26,0x26,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x6E,0x6E,0x6E,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7B,0x9F,0x00,0x00,0x00,0x00 +,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x83,0x00,0x00,0x00,0xFF +,0x00,0x5E,0x5E,0x5E,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x01,0xEE,0xEE,0xEE,0xFF +,0x03,0x03,0x03,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00 +,0x00,0x00,0x01,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA2,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x95,0x95,0x95,0xFF,0xB0,0xFF,0xFF,0xFF,0xFF,0x00,0x6D +,0x6D,0x6D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x77,0x95,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x83,0x00,0x00,0x00,0xFF,0x00,0x6E +,0x6E,0x6E,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x19,0x19 +,0x19,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x24,0x9F,0x00,0x00 +,0x00,0x00,0x9F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00 +,0xFC,0x82,0x00,0x00,0x00,0xFF,0x01,0x0F,0x0F,0x0F,0xFF,0xF9,0xF9,0xF9,0xFF +,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x3C,0x3C,0x3C,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x32,0x94,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08 +,0x00,0x00,0x00,0xF2,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xE9 +,0xE9,0xE9,0xFF,0xB0,0xFF,0xFF,0xFF,0xFF,0x00,0xC5,0xC5,0xC5,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF,0x95,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0xB0,0x83,0x00,0x00,0x00,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x9D,0xFF +,0xFF,0xFF,0xFF,0x00,0xC0,0xC0,0xC0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xCD,0xA0,0x00,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0xBC,0x83,0x00,0x00,0x00,0xFF,0x00,0xB2,0xB2,0xB2,0xFF,0x9E,0xFF +,0xFF,0xFF,0xFF,0x00,0x85,0x85,0x85,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x7C,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x45,0x45,0x45,0xFF,0xB1,0xFF,0xFF,0xFF,0xFF,0x01,0xFE +,0xFE,0xFE,0xFF,0x1E,0x1E,0x1E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x27,0x93,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00 +,0xF3,0x82,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF5,0xF5,0xF5,0xFF +,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x69,0x69,0x69,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x76,0xA0,0x00,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x66,0x83,0x00,0x00,0x00,0xFF,0x00,0x5C,0x5C,0x5C,0xFF +,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xCF,0xCF,0xCF,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xC5,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA +,0x83,0x00,0x00,0x00,0xFF,0x00,0x9D,0x9D,0x9D,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF +,0x00,0x75,0x75,0x75,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7F +,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x83,0x00,0x00,0x00,0xFF +,0x00,0x45,0x45,0x45,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xFC,0xFC,0xFC,0xFF +,0x15,0x15,0x15,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x20,0xA0 +,0x00,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x00 +,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7 +,0xF7,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x19,0x19,0x19,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x12,0x92,0x00,0x00,0x00 +,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF6,0x82,0x00,0x00,0x00,0xFF +,0x01,0x06,0x06,0x06,0xFF,0xEE,0xEE,0xEE,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF,0x00 +,0xCC,0xCC,0xCC,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD6,0x93 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x8C,0x8C,0x8C,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xBB,0xBB,0xBB,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC8,0xA1,0x00,0x00,0x00,0x00,0xA1 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB9,0x83,0x00,0x00,0x00,0xFF,0x00 +,0xAF,0xAF,0xAF,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x62,0x62,0x62,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x58,0x92,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x59,0x83,0x00,0x00,0x00,0xFF,0x00,0x4C,0x4C,0x4C,0xFF,0xB4 +,0xFF,0xFF,0xFF,0xFF,0x00,0x25,0x25,0x25,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x2E,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x83 +,0x00,0x00,0x00,0xFF,0x00,0xD4,0xD4,0xD4,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00 +,0x64,0x64,0x64,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x71,0xA1 +,0x00,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x59,0x59,0x59,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00 +,0xAB,0xAB,0xAB,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA2,0x92 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB1,0x83,0x00,0x00,0x00,0xFF,0x00 +,0xA4,0xA4,0xA4,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF,0x00,0x7C,0x7C,0x7C,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x86,0x91,0x00,0x00,0x00,0x00,0x01 +,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xFE,0x82,0x00,0x00,0x00,0xFF,0x00,0x1C +,0x1C,0x1C,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xFA,0xFA,0xFA,0xFF,0x12,0x12 +,0x12,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x1B,0xA1,0x00,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 +,0x12,0x00,0x00,0x00,0xFA,0x82,0x00,0x00,0x00,0xFF,0x01,0x0C,0x0C,0x0C,0xFF +,0xF6,0xF6,0xF6,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xF0,0xF0,0xF0,0xFF,0x04 +,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE9,0x00,0x00 +,0x00,0x01,0x90,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00 +,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01,0x09,0x09,0x09,0xFF,0xF3,0xF3,0xF3,0xFF +,0xB4,0xFF,0xFF,0xFF,0xFF,0x00,0xD4,0xD4,0xD4,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xDD,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5F +,0x83,0x00,0x00,0x00,0xFF,0x00,0x63,0x63,0x63,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF +,0x00,0xB6,0xB6,0xB6,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC3 +,0xA2,0x00,0x00,0x00,0x00,0xA2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB6 +,0x83,0x00,0x00,0x00,0xFF,0x00,0xAC,0xAC,0xAC,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF +,0x00,0x3E,0x3E,0x3E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x34 +,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x83,0x00,0x00,0x00,0xFF +,0x00,0x54,0x54,0x54,0xFF,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0x2C,0x2C,0x2C,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x36,0x90,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xA7,0x83,0x00,0x00,0x00,0xFF,0x00,0xAB,0xAB,0xAB,0xFF +,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x5F,0x5F,0x5F,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x6C,0xA2,0x00,0x00,0x00,0x00,0xA2,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x60,0x83,0x00,0x00,0x00,0xFF,0x00,0x56,0x56,0x56,0xFF +,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x88,0x88,0x88,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x7E,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB9 +,0x83,0x00,0x00,0x00,0xFF,0x00,0xAC,0xAC,0xAC,0xFF,0xB6,0xFF,0xFF,0xFF,0xFF +,0x00,0x84,0x84,0x84,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8D +,0x8F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xEC,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEF,0xEF,0xEF,0xFF,0x9C,0xFF +,0xFF,0xFF,0xFF,0x01,0xF8,0xF8,0xF8,0xFF,0x0F,0x0F,0x0F,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x18,0xA2,0x00,0x00,0x00 +,0x00,0xA2,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xF9 +,0x82,0x00,0x00,0x00,0xFF,0x01,0x0A,0x0A,0x0A,0xFF,0xF5,0xF5,0xF5,0xFF,0x9D +,0xFF,0xFF,0xFF,0xFF,0x00,0xD1,0xD1,0xD1,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xC7,0x8F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x15,0x00 +,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7 +,0xF7,0xFF,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0xDB,0xDB,0xDB,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xE3,0x00,0x00,0x00,0x01,0x8E,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x37,0x83,0x00,0x00,0x00,0xFF,0x00,0x3A,0x3A,0x3A +,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xB1,0xB1,0xB1,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xBE,0xA3,0x00,0x00,0x00,0x00,0xA3,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xB4,0x83,0x00,0x00,0x00,0xFF,0x00,0xAA,0xAA,0xAA +,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x1B,0x1B,0x1B,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x13,0x8E,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x69,0x83,0x00,0x00,0x00,0xFF,0x00,0x5C,0x5C,0x5C,0xFF +,0xB8,0xFF,0xFF,0xFF,0xFF,0x00,0x34,0x34,0x34,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x3D,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E +,0x83,0x00,0x00,0x00,0xFF,0x00,0x82,0x82,0x82,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF +,0x00,0x5A,0x5A,0x5A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x67 +,0xA3,0x00,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D +,0x83,0x00,0x00,0x00,0xFF,0x00,0x53,0x53,0x53,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF +,0x00,0x64,0x64,0x64,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5A +,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x83,0x00,0x00,0x00,0xFF +,0x00,0xB4,0xB4,0xB4,0xFF,0xB8,0xFF,0xFF,0xFF,0xFF,0x00,0x8C,0x8C,0x8C,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x95,0x8E,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xC6,0x83,0x00,0x00,0x00,0xFF,0x00,0xCA,0xCA,0xCA,0xFF +,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6,0xFF,0x0C,0x0C,0x0C,0xFF,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x14,0xA3,0x00 +,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0E,0x00,0x00 +,0x00,0xF8,0x82,0x00,0x00,0x00,0xFF,0x01,0x09,0x09,0x09,0xFF,0xF3,0xF3,0xF3 +,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xAE,0xAE,0xAE,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xA4,0x8D,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 +,0x1A,0x00,0x00,0x00,0xFD,0x82,0x00,0x00,0x00,0xFF,0x01,0x11,0x11,0x11,0xFF +,0xFA,0xFA,0xFA,0xFF,0xB8,0xFF,0xFF,0xFF,0xFF,0x01,0xE2,0xE2,0xE2,0xFF,0x01 +,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE9,0x00,0x00 +,0x00,0x03,0x8C,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00 +,0xFC,0x82,0x00,0x00,0x00,0xFF,0x01,0x14,0x14,0x14,0xFF,0xFD,0xFD,0xFD,0xFF +,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xAC,0xAC,0xAC,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB9,0xA4,0x00,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xB1,0x83,0x00,0x00,0x00,0xFF,0x00,0xA7,0xA7,0xA7,0xFF +,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x05,0x05,0x05,0xFF,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEB,0x00,0x00,0x00,0x02,0x8C,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x83,0x00,0x00,0x00,0xFF,0x00,0x63 +,0x63,0x63,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xE8,0xE8,0xE8,0xFF,0x9C,0xFF +,0xFF,0xFF,0xFF,0x00,0x3B,0x3B,0x3B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x44,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x59,0x59,0x59,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x55 +,0x55,0x55,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x62,0xA4,0x00 +,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5A,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x51,0x51,0x51,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x41 +,0x41,0x41,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x37,0x8C,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x83,0x00,0x00,0x00,0xFF,0x00,0xBB +,0xBB,0xBB,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xF8,0xF8,0xF8,0xFF,0x58,0x58 +,0x58,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x93,0x93,0x93,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x9C,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x9D,0x83,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x9C,0xFF,0xFF +,0xFF,0xFF,0x01,0xF4,0xF4,0xF4,0xFF,0x09,0x09,0x09,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x11,0xA4,0x00,0x00,0x00,0x00 +,0xA4,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xF7,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x08,0x08,0x08,0xFF,0xF2,0xF2,0xF2,0xFF,0x9D,0xFF +,0xFF,0xFF,0xFF,0x00,0x8A,0x8A,0x8A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x80,0x8B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x83,0x00 +,0x00,0x00,0xFF,0x01,0x16,0x16,0x16,0xFF,0xFC,0xFC,0xFC,0xFF,0x9B,0xFF,0xFF +,0xFF,0xFF,0x02,0xAF,0xAF,0xAF,0xFF,0x06,0x06,0x06,0xFF,0xF0,0xF0,0xF0,0xFF +,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xE8,0xE8,0xE8,0xFF,0x03,0x03,0x03,0xFF,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x05,0x8B,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE5,0x82,0x00,0x00,0x00,0xFF,0x01,0x01 +,0x01,0x01,0xFF,0xE7,0xE7,0xE7,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xA7,0xA7 +,0xA7,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB4,0xA5,0x00,0x00 +,0x00,0x00,0xA5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAE,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xA4,0xA4,0xA4,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xD4,0xD4 +,0xD4,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCA,0x8B,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x83,0x00,0x00,0x00,0xFF,0x00,0x6B,0x6B +,0x6B,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x02,0x58,0x58,0x58,0xFF,0x00,0x00,0x00 +,0xFF,0xA4,0xA4,0xA4,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x43,0x43,0x43,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4C,0x8A,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x2D,0x83,0x00,0x00,0x00,0xFF,0x00,0x30,0x30,0x30,0xFF +,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x50,0x50,0x50,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x5D,0xA5,0x00,0x00,0x00,0x00,0xA5,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x58,0x83,0x00,0x00,0x00,0xFF,0x00,0x4E,0x4E,0x4E,0xFF +,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x1E,0x1E,0x1E,0xFF,0x82,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x15,0x8A,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF,0x00,0xC3,0xC3,0xC3,0xFF,0x9B +,0xFF,0xFF,0xFF,0xFF,0x03,0xF5,0xF5,0xF5,0xFF,0x0B,0x0B,0x0B,0xFF,0x00,0x00 +,0x00,0xFF,0x51,0x51,0x51,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x9B,0x9B,0x9B +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA3,0x8A,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x75,0x83,0x00,0x00,0x00,0xFF,0x00,0x78,0x78,0x78 +,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xF1,0xF1,0xF1,0xFF,0x07,0x07,0x07,0xFF +,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x0E,0xA5 +,0x00,0x00,0x00,0x00,0xA5,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0B,0x00 +,0x00,0x00,0xF6,0x82,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF0,0xF0 +,0xF0,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x67,0x67,0x67,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x5D,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x27,0x83,0x00,0x00,0x00,0xFF,0x01,0x1C,0x1C,0x1C,0xFF,0xFE,0xFE,0xFE +,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xAA,0xAA,0xAA,0xFF,0x81,0x00,0x00,0x00 +,0xFF,0x01,0x09,0x09,0x09,0xFF,0xF4,0xF4,0xF4,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF +,0x01,0xED,0xED,0xED,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x08,0x89,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0xBD,0x83,0x00,0x00,0x00,0xFF,0x00,0xC0,0xC0,0xC0,0xFF,0x9C,0xFF +,0xFF,0xFF,0xFF,0x00,0xA2,0xA2,0xA2,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xAF,0xA6,0x00,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x9D,0xFF +,0xFF,0xFF,0xFF,0x00,0xB0,0xB0,0xB0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xA6,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x73,0x73,0x73,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x53 +,0x53,0x53,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0xAB,0xAB,0xAB,0xFF,0x9C,0xFF +,0xFF,0xFF,0xFF,0x00,0x4B,0x4B,0x4B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x53,0x88,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0B,0x00,0x00 +,0x00,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xFA,0xFA,0xFA +,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x4A,0x4A,0x4A,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x58,0xA6,0x00,0x00,0x00,0x00,0xA6,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x55,0x83,0x00,0x00,0x00,0xFF,0x00,0x4B,0x4B,0x4B +,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3,0xFF,0x06,0x06,0x06,0xFF +,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xED,0x00,0x00,0x00,0x02,0x88 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0x83,0x00,0x00,0x00,0xFF,0x00 +,0xCB,0xCB,0xCB,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3,0xFF,0x09 +,0x09,0x09,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x58,0x58,0x58,0xFF,0x9C,0xFF +,0xFF,0xFF,0xFF,0x00,0xA3,0xA3,0xA3,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xAB,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x4F,0x4F,0x4F,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xEE +,0xEE,0xEE,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xF5,0x00,0x00,0x00,0x0B,0xA6,0x00,0x00,0x00,0x00,0xA6,0x00,0x00,0x00 +,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF +,0x01,0x06,0x06,0x06,0xFF,0xEF,0xEF,0xEF,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00 +,0x43,0x43,0x43,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x39,0x87 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2F,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x23,0x23,0x23,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xA6,0xA6,0xA6,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x01,0x0C,0x0C,0x0C,0xFF,0xF7,0xF7,0xF7,0xFF,0x9B,0xFF +,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x0C,0x87,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x94,0x83,0x00,0x00,0x00,0xFF,0x00,0x97,0x97,0x97 +,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0x9C,0x9C,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xAA,0xA7,0x00,0x00,0x00,0x00,0xA7,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xA8,0x83,0x00,0x00,0x00,0xFF,0x00,0x9F,0x9F,0x9F +,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x8D,0x8D,0x8D,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x83,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x87,0x83,0x00,0x00,0x00,0xFF,0x00,0x7A,0x7A,0x7A,0xFF,0x9C,0xFF,0xFF,0xFF +,0xFF,0x00,0x50,0x50,0x50,0xFF,0x84,0x00,0x00,0x00,0xFF,0x00,0xB1,0xB1,0xB1 +,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x52,0x52,0x52,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x5A,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0xDC,0x83,0x00,0x00,0x00,0xFF,0x00,0xDE,0xDE,0xDE,0xFF,0x9C,0xFF,0xFF,0xFF +,0xFF,0x00,0x45,0x45,0x45,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x53,0xA7,0x00,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x52,0x83,0x00,0x00,0x00,0xFF,0x00,0x48,0x48,0x48,0xFF,0x9D,0xFF,0xFF,0xFF +,0xFF,0x00,0xD6,0xD6,0xD6,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xCC,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDE,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xD2,0xD2,0xD2,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2 +,0xFF,0x08,0x08,0x08,0xFF,0x84,0x00,0x00,0x00,0xFF,0x00,0x5D,0x5D,0x5D,0xFF +,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xAA,0xAA,0xAA,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB2,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x26,0x26,0x26,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF +,0x01,0xEA,0xEA,0xEA,0xFF,0x04,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0x09,0xA7,0x00,0x00,0x00,0x00,0xA7,0x00 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xF3,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x05,0x05,0x05,0xFF,0xED,0xED,0xED,0xFF,0x9D,0xFF,0xFF,0xFF +,0xFF,0x00,0x20,0x20,0x20,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xFE,0x00,0x00,0x00,0x17,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x2A,0x2A,0x2A,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF +,0x00,0xA4,0xA4,0xA4,0xFF,0x85,0x00,0x00,0x00,0xFF,0x01,0x10,0x10,0x10,0xFF +,0xF9,0xF9,0xF9,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6,0xFF,0x0C +,0x0C,0x0C,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00 +,0x00,0x10,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6B,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x6E,0x6E,0x6E,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x97,0x97 +,0x97,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA5,0xA8,0x00,0x00 +,0x00,0x00,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x9C,0x9C,0x9C,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x69,0x69 +,0x69,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5F,0x85,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x8E,0x83,0x00,0x00,0x00,0xFF,0x00,0x82,0x82 +,0x82,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x4D,0x4D,0x4D,0xFF,0x86,0x00,0x00 +,0x00,0xFF,0x00,0xB6,0xB6,0xB6,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x5A,0x5A +,0x5A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x62,0x85,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xB3,0x83,0x00,0x00,0x00,0xFF,0x00,0xB5,0xB5 +,0xB5,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x40,0x40,0x40,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x4E,0xA8,0x00,0x00,0x00,0x00,0xA8,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x4F,0x83,0x00,0x00,0x00,0xFF,0x00,0x46,0x46 +,0x46,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0xB3,0xB3,0xB3,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xA9,0x84,0x00,0x00,0x00,0x00,0x01,0x00,0x00 +,0x00,0x01,0x00,0x00,0x00,0xE4,0x83,0x00,0x00,0x00,0xFF,0x00,0xDA,0xDA,0xDA +,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xF0,0xF0,0xF0,0xFF,0x06,0x06,0x06,0xFF +,0x86,0x00,0x00,0x00,0xFF,0x00,0x62,0x62,0x62,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF +,0x00,0xB2,0xB2,0xB2,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB9 +,0x84,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xF4,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF5,0xF5,0xF5,0xFF,0x9B,0xFF +,0xFF,0xFF,0xFF,0x01,0xE7,0xE7,0xE7,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x07,0xA8,0x00,0x00,0x00 +,0x00,0xA8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF1 +,0x82,0x00,0x00,0x00,0xFF,0x01,0x04,0x04,0x04,0xFF,0xEB,0xEB,0xEB,0xFF,0x9C +,0xFF,0xFF,0xFF,0xFF,0x01,0xF5,0xF5,0xF5,0xFF,0x07,0x07,0x07,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x03,0x83,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x83,0x00,0x00,0x00,0xFF,0x00,0x32,0x32 +,0x32,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x87,0x00,0x00 +,0x00,0xFF,0x01,0x13,0x13,0x13,0xFF,0xFB,0xFB,0xFB,0xFF,0x9B,0xFF,0xFF,0xFF +,0xFF,0x01,0xF9,0xF9,0xF9,0xFF,0x10,0x10,0x10,0xFF,0x82,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x15,0x83,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x43,0x83,0x00,0x00,0x00,0xFF,0x00,0x45,0x45,0x45,0xFF,0x9C +,0xFF,0xFF,0xFF,0xFF,0x00,0x92,0x92,0x92,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xA0,0xA9,0x00,0x00,0x00,0x00,0xA9,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0xA3,0x83,0x00,0x00,0x00,0xFF,0x00,0x99,0x99,0x99,0xFF,0x9D +,0xFF,0xFF,0xFF,0xFF,0x00,0x46,0x46,0x46,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x3C,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x8A,0x8A,0x8A,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00 +,0x4B,0x4B,0x4B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xF5,0x83 +,0x00,0x00,0x00,0xFF,0x00,0xBB,0xBB,0xBB,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00 +,0x62,0x62,0x62,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x69,0x83 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8A,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x8D,0x8D,0x8D,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x3B,0x3B,0x3B,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x49,0xA9,0x00,0x00,0x00,0x00,0xA9 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x43,0x43,0x43,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x8F,0x8F,0x8F,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x85,0x82,0x00,0x00,0x00,0x00,0x01 +,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xEA,0x82,0x00,0x00,0x00,0xFF,0x01,0x01 +,0x01,0x01,0xFF,0xE0,0xE0,0xE0,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xEE,0xEE +,0xEE,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xF4,0x00,0x00,0x00,0x7B,0x83,0x00,0x00,0x00,0xFF,0x00,0x68,0x68,0x68,0xFF +,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xBA,0xBA,0xBA,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xC1,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD2 +,0x83,0x00,0x00,0x00,0xFF,0x00,0xD4,0xD4,0xD4,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF +,0x01,0xE3,0xE3,0xE3,0xFF,0x01,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xED,0x00,0x00,0x00,0x05,0xA9,0x00,0x00,0x00,0x00,0xA9,0x00 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xF0,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xE9,0xE9,0xE9,0xFF,0x9C,0xFF,0xFF,0xFF +,0xFF,0x00,0xD9,0xD9,0xD9,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xCF,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x39,0x39,0x39,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x9E,0x9E,0x9E +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xA9,0x00,0x00,0x00,0x1E +,0x83,0x00,0x00,0x00,0xFF,0x01,0x17,0x17,0x17,0xFF,0xFD,0xFD,0xFD,0xFF,0x9B +,0xFF,0xFF,0xFF,0xFF,0x01,0xFC,0xFC,0xFC,0xFF,0x15,0x15,0x15,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x1B,0x81,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x83,0x00,0x00,0x00,0xFF,0x00,0x1C,0x1C +,0x1C,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x8D,0x8D,0x8D,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x9B,0xAA,0x00,0x00,0x00,0x00,0xAA,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x83,0x00,0x00,0x00,0xFF,0x00,0x96,0x96 +,0x96,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x22,0x22,0x22,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x19,0x81,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x9D,0x83,0x00,0x00,0x00,0xFF,0x00,0x91,0x91,0x91 +,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x48,0x48,0x48,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x02,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0x83 +,0x00,0x00,0x00,0xFF,0x00,0xC0,0xC0,0xC0,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00 +,0x69,0x69,0x69,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x70,0x81 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x64,0x64,0x64,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x36,0x36,0x36,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x44,0xAA,0x00,0x00,0x00,0x00,0xAA +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4A,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x40,0x40,0x40,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x6C,0x6C,0x6C,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x06,0x00,0x00,0x00,0xEF,0x82,0x00,0x00,0x00,0xFF,0x01,0x02,0x02,0x02 +,0xFF,0xE7,0xE7,0xE7,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xED,0xED,0xED,0xFF +,0x04,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0x00,0xF3,0x00 +,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xC1,0xC1,0xC1 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC8,0x81,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xAA,0x83,0x00,0x00,0x00,0xFF,0x00,0xAB,0xAB,0xAB +,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xDF,0xDF,0xDF,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xEA,0x00,0x00,0x00,0x03,0xAA,0x00,0x00,0x00,0x00 +,0xAA,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xEE,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE7,0xE7,0xE7,0xFF,0x9C,0xFF +,0xFF,0xFF,0xFF,0x00,0xB5,0xB5,0xB5,0xFF,0x83,0x00,0x00,0x00,0xFF,0x02,0x00 +,0x00,0x00,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x41,0x41,0x41,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x9B,0x9B,0x9B +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA6,0x81,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x23,0x83,0x00,0x00,0x00,0xFF,0x01,0x1B,0x1B,0x1B +,0xFF,0xFE,0xFE,0xFE,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF +,0x1B,0x1B,0x1B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0x21,0x00 +,0x00,0x00,0x03,0x00,0x00,0x00,0xEE,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03 +,0x03,0xFF,0xEF,0xEF,0xEF,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x88,0x88,0x88 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x96,0xAB,0x00,0x00,0x00 +,0x00,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9D,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x94,0x94,0x94,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6 +,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xF0 +,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xA5,0x83,0x00,0x00,0x00,0xFF,0x00,0x99 +,0x99,0x99,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x45,0x45,0x45,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x50,0x82,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF,0x00,0xC6,0xC6,0xC6,0xFF,0x9C,0xFF +,0xFF,0xFF,0xFF,0x00,0x71,0x71,0x71,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0x78,0x00,0x00,0x00,0x39,0x83,0x00,0x00,0x00,0xFF,0x00,0x3B,0x3B +,0x3B,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x31,0x31,0x31,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x3F,0xAB,0x00,0x00,0x00,0x00,0xAB,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x83,0x00,0x00,0x00,0xFF,0x00,0x3D,0x3D +,0x3D,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x48,0x48,0x48,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0xF3,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x04,0x04,0x04,0xFF,0xEC,0xEC,0xEC,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF +,0x01,0xEB,0xEB,0xEB,0xFF,0x04,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x07,0x82,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x7B,0x83,0x00,0x00,0x00,0xFF,0x00,0x72,0x72,0x72,0xFF,0x9C,0xFF +,0xFF,0xFF,0xFF,0x00,0xC9,0xC9,0xC9,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xCF,0x00,0x00,0x00,0x81,0x83,0x00,0x00,0x00,0xFF,0x00,0x82,0x82 +,0x82,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xDA,0xDA,0xDA,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xE6,0x00,0x00,0x00,0x02,0xAB,0x00,0x00,0x00 +,0x00,0xAB,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xEC +,0x82,0x00,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE5,0xE5,0xE5,0xFF,0x9C +,0xFF,0xFF,0xFF,0xFF,0x00,0x92,0x92,0x92,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xD6,0x83,0x00,0x00,0x00,0xFF,0x00,0x49,0x49,0x49,0xFF,0x9C +,0xFF,0xFF,0xFF,0xFF,0x00,0x98,0x98,0x98,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xA3,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x1F,0x1F,0x1F,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00 +,0x21,0x21,0x21,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE3,0x83 +,0x00,0x00,0x00,0xFF,0x00,0xCA,0xCA,0xCA,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00 +,0x83,0x83,0x83,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x91,0xAC +,0x00,0x00,0x00,0x00,0xAC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9A,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x91,0x91,0x91,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00 +,0xDC,0xDC,0xDC,0xFF,0x88,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x9C +,0xFF,0xFF,0xFF,0xFF,0x00,0x42,0x42,0x42,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x4D,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x83 +,0x00,0x00,0x00,0xFF,0x00,0xCB,0xCB,0xCB,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00 +,0x79,0x79,0x79,0xFF,0x87,0x00,0x00,0x00,0xFF,0x01,0x14,0x14,0x14,0xFF,0xFD +,0xFD,0xFD,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x2C,0x2C,0x2C,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3A,0xAC,0x00,0x00,0x00,0x00,0xAC,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x83,0x00,0x00,0x00,0xFF,0x00,0x3B +,0x3B,0x3B,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x25,0x25,0x25,0xFF,0x86,0x00 +,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF1,0xF1,0xF1,0xFF,0x9B,0xFF,0xFF +,0xFF,0xFF,0x01,0xE9,0xE9,0xE9,0xFF,0x03,0x03,0x03,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x06,0x84,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x81,0x83,0x00,0x00,0x00,0xFF,0x00,0x77,0x77,0x77,0xFF +,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xD1,0xD1,0xD1,0xFF,0x87,0x00,0x00,0x00,0xFF +,0x00,0x59,0x59,0x59,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xD5,0xD5,0xD5,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0x01,0xAC +,0x00,0x00,0x00,0x00,0xAC,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00 +,0x00,0x00,0xEA,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE3,0xE3 +,0xE3,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x6F,0x6F,0x6F,0xFF,0x86,0x00,0x00 +,0x00,0xFF,0x00,0x50,0x50,0x50,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x96,0x96 +,0x96,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA1,0x85,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x2D,0x83,0x00,0x00,0x00,0xFF,0x00,0x24,0x24 +,0x24,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x28,0x28,0x28,0xFF,0x86,0x00,0x00 +,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x7E,0x7E +,0x7E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0xAD,0x00,0x00 +,0x00,0x00,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x8E,0x8E,0x8E,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xB8,0xB8 +,0xB8,0xFF,0x86,0x00,0x00,0x00,0xFF,0x00,0xA8,0xA8,0xA8,0xFF,0x9C,0xFF,0xFF +,0xFF,0xFF,0x00,0x3F,0x3F,0x3F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x4A,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD9,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xD0,0xD0,0xD0,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80 +,0x80,0xFF,0x85,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE8,0xE8,0xE8 +,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x27,0x27,0x27,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x35,0xAD,0x00,0x00,0x00,0x00,0xAD,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x41,0x83,0x00,0x00,0x00,0xFF,0x00,0x38,0x38,0x38 +,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xF7,0xF7,0xF7,0xFF,0x0A,0x0A,0x0A,0xFF +,0x84,0x00,0x00,0x00,0xFF,0x01,0x0B,0x0B,0x0B,0xFF,0xF5,0xF5,0xF5,0xFF,0x9B +,0xFF,0xFF,0xFF,0xFF,0x01,0xE7,0xE7,0xE7,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x05,0x86,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x83,0x00,0x00,0x00,0xFF,0x00,0x7C,0x7C +,0x7C,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xD8,0xD8,0xD8,0xFF,0x85,0x00,0x00 +,0x00,0xFF,0x00,0x30,0x30,0x30,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xD0,0xD0 +,0xD0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDE,0xAE,0x00,0x00 +,0x00,0x00,0xAD,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00 +,0xE8,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE1,0xE1,0xE1,0xFF +,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x4B,0x4B,0x4B,0xFF,0x84,0x00,0x00,0x00,0xFF +,0x00,0x58,0x58,0x58,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x93,0x93,0x93,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9E,0x87,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x32,0x83,0x00,0x00,0x00,0xFF,0x00,0x29,0x29,0x29,0xFF +,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0x30,0x30,0xFF,0x84,0x00,0x00,0x00,0xFF +,0x00,0x78,0x78,0x78,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x79,0x79,0x79,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x87,0xAE,0x00,0x00,0x00,0x00 +,0xAE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x83,0x00,0x00,0x00,0xFF +,0x00,0x8B,0x8B,0x8B,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x95,0x95,0x95,0xFF +,0x84,0x00,0x00,0x00,0xFF,0x00,0xB0,0xB0,0xB0,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF +,0x00,0x3D,0x3D,0x3D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x48 +,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDE,0x83,0x00,0x00,0x00,0xFF +,0x00,0xD5,0xD5,0xD5,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x88,0x88,0x88,0xFF +,0x84,0x00,0x00,0x00,0xFF,0x00,0xC0,0xC0,0xC0,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF +,0x00,0x23,0x23,0x23,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x30 +,0xAE,0x00,0x00,0x00,0x00,0xAE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F +,0x83,0x00,0x00,0x00,0xFF,0x00,0x35,0x35,0x35,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF +,0x00,0xDE,0xDE,0xDE,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x0F,0x0F,0x0F,0xFF +,0xF8,0xF8,0xF8,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xE5,0xE5,0xE5,0xFF,0x01 +,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xED,0x00,0x00 +,0x00,0x04,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x82,0x82,0x82,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xDF,0xDF +,0xDF,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xFA,0xFA,0xFA +,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0xCB,0xCB,0xCB,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xD9,0xAF,0x00,0x00,0x00,0x00,0xAE,0x00,0x00,0x00 +,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE6,0x83,0x00,0x00,0x00,0xFF +,0x00,0xDE,0xDE,0xDE,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x28,0x28,0x28,0xFF +,0x82,0x00,0x00,0x00,0xFF,0x00,0x60,0x60,0x60,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF +,0x00,0x90,0x90,0x90,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9B +,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x83,0x00,0x00,0x00,0xFF +,0x00,0x2E,0x2E,0x2E,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x00,0x38,0x38,0x38,0xFF +,0x82,0x00,0x00,0x00,0xFF,0x00,0x4F,0x4F,0x4F,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF +,0x00,0x74,0x74,0x74,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83 +,0xAF,0x00,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x89,0x89,0x89,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF +,0x00,0x71,0x71,0x71,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0xB8,0xB8,0xB8,0xFF +,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x3A,0x3A,0x3A,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x45,0x89,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01 +,0x00,0x00,0x00,0xE3,0x83,0x00,0x00,0x00,0xFF,0x00,0xDA,0xDA,0xDA,0xFF,0x9C +,0xFF,0xFF,0xFF,0xFF,0x00,0x8F,0x8F,0x8F,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00 +,0x98,0x98,0x98,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1E +,0x1E,0x1E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2C,0xAF,0x00 +,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x32,0x32,0x32,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xBB +,0xBB,0xBB,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x15,0x15,0x15,0xFF,0xFB,0xFB +,0xFB,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x01,0xE2,0xE2,0xE2,0xFF,0x01,0x01,0x01 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEB,0x00,0x00,0x00,0x04 +,0x8A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x83,0x00,0x00,0x00,0xFF +,0x00,0x87,0x87,0x87,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x01,0xE4,0xE4,0xE4,0xFF +,0x01,0x01,0x01,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0xE1,0xE1,0xE1,0xFF,0x9A +,0xFF,0xFF,0xFF,0xFF,0x00,0xC6,0xC6,0xC6,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xD5,0xB0,0x00,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0x00,0x01 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE4,0x83,0x00,0x00,0x00,0xFF,0x00,0xDC +,0xDC,0xDC,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x03,0xF9,0xF9,0xF9,0xFF,0x0B,0x0B +,0x0B,0xFF,0x00,0x00,0x00,0xFF,0x69,0x69,0x69,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF +,0x00,0x8D,0x8D,0x8D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x99 +,0x8B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3D,0x83,0x00,0x00,0x00,0xFF +,0x00,0x33,0x33,0x33,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x02,0x3D,0x3D,0x3D,0xFF +,0x00,0x00,0x00,0xFF,0x29,0x29,0x29,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0x6F +,0x6F,0x6F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7E,0xB0,0x00 +,0x00,0x00,0x00,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8F,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x86,0x86,0x86,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x02,0x4E +,0x4E,0x4E,0xFF,0x00,0x00,0x00,0xFF,0xC1,0xC1,0xC1,0xFF,0x9C,0xFF,0xFF,0xFF +,0xFF,0x00,0x37,0x37,0x37,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x42,0x8B,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE7 +,0x83,0x00,0x00,0x00,0xFF,0x00,0xDF,0xDF,0xDF,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF +,0x02,0x94,0x94,0x94,0xFF,0x00,0x00,0x00,0xFF,0x72,0x72,0x72,0xFF,0x9A,0xFF +,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1A,0x1A,0x1A,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x27,0xB0,0x00,0x00,0x00,0x00,0xB0,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x83,0x00,0x00,0x00,0xFF,0x00,0x30,0x30 +,0x30,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x02,0x98,0x98,0x98,0xFF,0x1B,0x1B,0x1B +,0xFF,0xFE,0xFE,0xFE,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xE0,0xE0,0xE0,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE9,0x00,0x00,0x00,0x03,0x8C +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x8C,0x8C,0x8C,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x02,0xE8,0xE8,0xE8,0xFF,0x03 +,0x03,0x03,0xFF,0xBB,0xBB,0xBB,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0xC1,0xC1 +,0xC1,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD0,0xB1,0x00,0x00 +,0x00,0x00,0xB0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 +,0xE1,0x83,0x00,0x00,0x00,0xFF,0x00,0xD9,0xD9,0xD9,0xFF,0x9B,0xFF,0xFF,0xFF +,0xFF,0x01,0xE1,0xE1,0xE1,0xFF,0x72,0x72,0x72,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF +,0x00,0x8B,0x8B,0x8B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x96 +,0x8D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x83,0x00,0x00,0x00,0xFF +,0x00,0x39,0x39,0x39,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0x4E,0x4E,0x4E,0xFF +,0xF8,0xF8,0xF8,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0x6A,0x6A,0x6A,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x79,0xB1,0x00,0x00,0x00,0x00,0xB1 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x83,0x83,0x83,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xE6,0xE6,0xE6,0xFF,0x9C +,0xFF,0xFF,0xFF,0xFF,0x00,0x34,0x34,0x34,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x40,0x8D,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00 +,0x00,0x00,0xEB,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE4,0xE4 +,0xE4,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xDD,0xDD,0xDD,0xFF,0x9A,0xFF,0xFF +,0xFF,0xFF,0x01,0xFC,0xFC,0xFC,0xFF,0x17,0x17,0x17,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x22,0xB1,0x00,0x00,0x00,0x00,0xB1,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x36,0x83,0x00,0x00,0x00,0xFF,0x00,0x2D,0x2D,0x2D +,0xFF,0xB9,0xFF,0xFF,0xFF,0xFF,0x00,0xDE,0xDE,0xDE,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x9B,0x83,0x00,0x00,0x00,0xFF,0x00,0x91,0x91,0x91,0xFF +,0xB8,0xFF,0xFF,0xFF,0xFF,0x00,0xBC,0xBC,0xBC,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xCB,0xB2,0x00,0x00,0x00,0x00,0xB2,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xDF,0x83,0x00,0x00,0x00,0xFF,0x00,0xD7,0xD7,0xD7,0xFF +,0xB8,0xFF,0xFF,0xFF,0xFF,0x00,0x88,0x88,0x88,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x93,0x8F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x3E,0x3E,0x3E,0xFF,0xB8,0xFF,0xFF,0xFF,0xFF +,0x00,0x65,0x65,0x65,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x74 +,0xB2,0x00,0x00,0x00,0x00,0xB2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8A +,0x83,0x00,0x00,0x00,0xFF,0x00,0x80,0x80,0x80,0xFF,0xB8,0xFF,0xFF,0xFF,0xFF +,0x00,0x32,0x32,0x32,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3D +,0x8F,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xEE,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE8,0xE8,0xE8,0xFF,0xB6,0xFF +,0xFF,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x13,0x13,0x13,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1E,0xB2,0x00,0x00,0x00 +,0x00,0xB2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x2A,0x2A,0x2A,0xFF,0xB7,0xFF,0xFF,0xFF,0xFF,0x00,0xDB,0xDB,0xDB +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE5,0x00,0x00,0x00,0x01 +,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x83,0x00,0x00,0x00,0xFF +,0x00,0x97,0x97,0x97,0xFF,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0xB7,0xB7,0xB7,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC6,0xB3,0x00,0x00,0x00,0x00 +,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDD,0x83,0x00,0x00,0x00,0xFF +,0x00,0xD4,0xD4,0xD4,0xFF,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0x85,0x85,0x85,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x4D,0x83,0x00,0x00,0x00,0xFF,0x00,0x43,0x43,0x43,0xFF +,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0x60,0x60,0x60,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x6F,0xB3,0x00,0x00,0x00,0x00,0xB3,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x87,0x83,0x00,0x00,0x00,0xFF,0x00,0x7E,0x7E,0x7E,0xFF +,0xB6,0xFF,0xFF,0xFF,0xFF,0x00,0x2F,0x2F,0x2F,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x3A,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07 +,0x00,0x00,0x00,0xF2,0x82,0x00,0x00,0x00,0xFF,0x01,0x03,0x03,0x03,0xFF,0xEC +,0xEC,0xEC,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF,0x01,0xF9,0xF9,0xF9,0xFF,0x10,0x10 +,0x10,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00 +,0x1A,0xB3,0x00,0x00,0x00,0x00,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x31,0x83,0x00,0x00,0x00,0xFF,0x00,0x27,0x27,0x27,0xFF,0xB5,0xFF,0xFF,0xFF +,0xFF,0x00,0xD8,0xD8,0xD8,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xE3,0x00,0x00,0x00,0x01,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA5 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x9C,0x9C,0x9C,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF +,0x00,0xB2,0xB2,0xB2,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC1 +,0xB4,0x00,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA +,0x83,0x00,0x00,0x00,0xFF,0x00,0xD1,0xD1,0xD1,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF +,0x00,0x82,0x82,0x82,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8E +,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x83,0x00,0x00,0x00,0xFF +,0x00,0x48,0x48,0x48,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF,0x00,0x5B,0x5B,0x5B,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6A,0xB4,0x00,0x00,0x00,0x00 +,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x83,0x00,0x00,0x00,0xFF +,0x00,0x7B,0x7B,0x7B,0xFF,0xB4,0xFF,0xFF,0xFF,0xFF,0x00,0x2C,0x2C,0x2C,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x38,0x93,0x00,0x00,0x00,0x00 +,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x05,0x05,0x05,0xFF,0xEF,0xEF,0xEF,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF,0x01,0xF7 +,0xF7,0xF7,0xFF,0x0D,0x0D,0x0D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xFC,0x00,0x00,0x00,0x16,0xB4,0x00,0x00,0x00,0x00,0xB4,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x2E,0x83,0x00,0x00,0x00,0xFF,0x00,0x25,0x25,0x25 +,0xFF,0xB3,0xFF,0xFF,0xFF,0xFF,0x00,0xD6,0xD6,0xD6,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xE1,0x00,0x00,0x00,0x01,0x94,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF +,0xB2,0xFF,0xFF,0xFF,0xFF,0x00,0xAD,0xAD,0xAD,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xBC,0xB5,0x00,0x00,0x00,0x00,0xB5,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xD7,0x83,0x00,0x00,0x00,0xFF,0x00,0xCE,0xCE,0xCE,0xFF +,0xB2,0xFF,0xFF,0xFF,0xFF,0x00,0x7F,0x7F,0x7F,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x8B,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x4E,0x4E,0x4E,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF +,0x00,0x56,0x56,0x56,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x65 +,0xB5,0x00,0x00,0x00,0x00,0xB5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x78,0x78,0x78,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF +,0x00,0x29,0x29,0x29,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x35 +,0x95,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF7,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF2,0xF2,0xF2,0xFF,0xB0,0xFF +,0xFF,0xFF,0xFF,0x01,0xF5,0xF5,0xF5,0xFF,0x0A,0x0A,0x0A,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x13,0xB5,0x00,0x00,0x00 +,0x00,0xB5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2B,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x22,0x22,0x22,0xFF,0xB1,0xFF,0xFF,0xFF,0xFF,0x00,0xD3,0xD3,0xD3 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDE,0x97,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xB0,0x83,0x00,0x00,0x00,0xFF,0x00,0xA6,0xA6,0xA6 +,0xFF,0xB0,0xFF,0xFF,0xFF,0xFF,0x00,0xA8,0xA8,0xA8,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xB7,0xB6,0x00,0x00,0x00,0x00,0xB6,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xD5,0x83,0x00,0x00,0x00,0xFF,0x00,0xCC,0xCC,0xCC +,0xFF,0xB0,0xFF,0xFF,0xFF,0xFF,0x00,0x7D,0x7D,0x7D,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x89,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x5C,0x83,0x00,0x00,0x00,0xFF,0x00,0x53,0x53,0x53,0xFF,0xB0,0xFF,0xFF,0xFF +,0xFF,0x00,0x51,0x51,0x51,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x60,0xB6,0x00,0x00,0x00,0x00,0xB6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x7E,0x83,0x00,0x00,0x00,0xFF,0x00,0x75,0x75,0x75,0xFF,0xB0,0xFF,0xFF,0xFF +,0xFF,0x00,0x27,0x27,0x27,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x33,0x97,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xF9 +,0x82,0x00,0x00,0x00,0xFF,0x01,0x0A,0x0A,0x0A,0xFF,0xF5,0xF5,0xF5,0xFF,0xAE +,0xFF,0xFF,0xFF,0xFF,0x01,0xF2,0xF2,0xF2,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x10,0xB6,0x00,0x00 +,0x00,0x00,0xB6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x20,0x20,0x20,0xFF,0xAF,0xFF,0xFF,0xFF,0xFF,0x00,0xD0,0xD0 +,0xD0,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDC,0x99,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x83,0x00,0x00,0x00,0xFF,0x00,0xAC,0xAC +,0xAC,0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0x00,0xA3,0xA3,0xA3,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xB2,0xB7,0x00,0x00,0x00,0x00,0xB7,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xD2,0x83,0x00,0x00,0x00,0xFF,0x00,0xC9,0xC9 +,0xC9,0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0x00,0x7A,0x7A,0x7A,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x86,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x61,0x83,0x00,0x00,0x00,0xFF,0x00,0x58,0x58,0x58,0xFF,0xAE,0xFF,0xFF +,0xFF,0xFF,0x00,0x4C,0x4C,0x4C,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x5B,0xB7,0x00,0x00,0x00,0x00,0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x7C,0x83,0x00,0x00,0x00,0xFF,0x00,0x73,0x73,0x73,0xFF,0xAE,0xFF,0xFF +,0xFF,0xFF,0x00,0x24,0x24,0x24,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x30,0x99,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00 +,0xFB,0x82,0x00,0x00,0x00,0xFF,0x01,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7,0xF7,0xFF +,0xAC,0xFF,0xFF,0xFF,0xFF,0x01,0xEF,0xEF,0xEF,0xFF,0x06,0x06,0x06,0xFF,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x0D,0xB7,0x00 +,0x00,0x00,0x00,0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x83,0x00 +,0x00,0x00,0xFF,0x01,0x1E,0x1E,0x1E,0xFF,0xFE,0xFE,0xFE,0xFF,0xAC,0xFF,0xFF +,0xFF,0xFF,0x00,0xCD,0xCD,0xCD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xD9,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xB1,0xB1,0xB1,0xFF,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0x9E,0x9E +,0x9E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAD,0xB8,0x00,0x00 +,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xC6,0xC6,0xC6,0xFF,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0x77,0x77 +,0x77,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83,0x9B,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x83,0x00,0x00,0x00,0xFF,0x00,0x5D,0x5D +,0x5D,0xFF,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0x47,0x47,0x47,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x56,0xB8,0x00,0x00,0x00,0x00,0xB8,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x83,0x00,0x00,0x00,0xFF,0x00,0x70,0x70 +,0x70,0xFF,0xAC,0xFF,0xFF,0xFF,0xFF,0x00,0x21,0x21,0x21,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x2D,0x9B,0x00,0x00,0x00,0x00,0x01,0x00,0x00 +,0x00,0x16,0x00,0x00,0x00,0xFD,0x82,0x00,0x00,0x00,0xFF,0x01,0x10,0x10,0x10 +,0xFF,0xFA,0xFA,0xFA,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x01,0xEC,0xEC,0xEC,0xFF +,0x04,0x04,0x04,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00 +,0x00,0x00,0x0A,0xB8,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x23,0x83,0x00,0x00,0x00,0xFF,0x01,0x1B,0x1B,0x1B,0xFF,0xFE,0xFE +,0xFE,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0xCB,0xCB,0xCB,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xD7,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0xC0,0x83,0x00,0x00,0x00,0xFF,0x00,0xB6,0xB6,0xB6,0xFF,0xAA,0xFF,0xFF +,0xFF,0xFF,0x00,0x99,0x99,0x99,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xA8,0xB9,0x00,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0xCC,0x83,0x00,0x00,0x00,0xFF,0x00,0xC3,0xC3,0xC3,0xFF,0xAA,0xFF,0xFF +,0xFF,0xFF,0x00,0x74,0x74,0x74,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x81,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x62,0x62,0x62,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0x42,0x42 +,0x42,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x51,0xB9,0x00,0x00 +,0x00,0x00,0xB9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0x1F,0x1F +,0x1F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2B,0x9D,0x00,0x00 +,0x00,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFE,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x13,0x13,0x13,0xFF,0xFB,0xFB,0xFB,0xFF,0xA8,0xFF,0xFF,0xFF,0xFF +,0x01,0xE8,0xE8,0xE8,0xFF,0x03,0x03,0x03,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x08,0xB9,0x00,0x00,0x00,0x00,0xB9,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x83,0x00,0x00,0x00,0xFF,0x01,0x19 +,0x19,0x19,0xFF,0xFD,0xFD,0xFD,0xFF,0xA8,0xFF,0xFF,0xFF,0xFF,0x00,0xC8,0xC8 +,0xC8,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD4,0x9F,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0x83,0x00,0x00,0x00,0xFF,0x00,0xBB,0xBB +,0xBB,0xFF,0xA8,0xFF,0xFF,0xFF,0xFF,0x00,0x94,0x94,0x94,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xA3,0xBA,0x00,0x00,0x00,0x00,0xBA,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0x83,0x00,0x00,0x00,0xFF,0x00,0xC1,0xC1 +,0xC1,0xFF,0xA8,0xFF,0xFF,0xFF,0xFF,0x00,0x72,0x72,0x72,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x7E,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x71,0x83,0x00,0x00,0x00,0xFF,0x00,0x68,0x68,0x68,0xFF,0xA8,0xFF,0xFF +,0xFF,0xFF,0x00,0x3D,0x3D,0x3D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x4C,0xBA,0x00,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x73,0x83,0x00,0x00,0x00,0xFF,0x00,0x6A,0x6A,0x6A,0xFF,0xA7,0xFF,0xFF +,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1D,0x1D,0x1D,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x28,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x1E,0x83,0x00,0x00,0x00,0xFF,0x01,0x17,0x17,0x17,0xFF,0xFD,0xFD,0xFD,0xFF +,0xA6,0xFF,0xFF,0xFF,0xFF,0x01,0xE4,0xE4,0xE4,0xFF,0x01,0x01,0x01,0xFF,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x06,0xBA,0x00 +,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1E,0x00,0x00 +,0x00,0xFE,0x82,0x00,0x00,0x00,0xFF,0x01,0x17,0x17,0x17,0xFF,0xFD,0xFD,0xFD +,0xFF,0xA6,0xFF,0xFF,0xFF,0xFF,0x00,0xC5,0xC5,0xC5,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xD2,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0xCA,0x83,0x00,0x00,0x00,0xFF,0x00,0xC1,0xC1,0xC1,0xFF,0xA6,0xFF,0xFF,0xFF +,0xFF,0x00,0x8F,0x8F,0x8F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x9E,0xBB,0x00,0x00,0x00,0x00,0xBB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0xC7,0x83,0x00,0x00,0x00,0xFF,0x00,0xBE,0xBE,0xBE,0xFF,0xA6,0xFF,0xFF,0xFF +,0xFF,0x00,0x6F,0x6F,0x6F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x7B,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x6D,0x6D,0x6D,0xFF,0xA6,0xFF,0xFF,0xFF,0xFF,0x00,0x38,0x38,0x38 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x47,0xBB,0x00,0x00,0x00 +,0x00,0xBB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x68,0x68,0x68,0xFF,0xA5,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE +,0xFF,0x1A,0x1A,0x1A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x25 +,0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x83,0x00,0x00,0x00,0xFF +,0x01,0x1B,0x1B,0x1B,0xFF,0xFE,0xFE,0xFE,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x01 +,0xE0,0xE0,0xE0,0xFF,0x01,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xEC,0x00,0x00,0x00,0x04,0xBB,0x00,0x00,0x00,0x00,0xBB,0x00,0x00 +,0x00,0x00,0x01,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xFE,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x15,0x15,0x15,0xFF,0xFC,0xFC,0xFC,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF +,0x00,0xC2,0xC2,0xC2,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF +,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF +,0x00,0xC6,0xC6,0xC6,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x00,0x8A,0x8A,0x8A,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x99,0xBC,0x00,0x00,0x00,0x00 +,0xBC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0x83,0x00,0x00,0x00,0xFF +,0x00,0xBB,0xBB,0xBB,0xFF,0xA4,0xFF,0xFF,0xFF,0xFF,0x00,0x6C,0x6C,0x6C,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x79,0xA3,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x7C,0x83,0x00,0x00,0x00,0xFF,0x00,0x72,0x72,0x72,0xFF +,0xA4,0xFF,0xFF,0xFF,0xFF,0x00,0x33,0x33,0x33,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x42,0xBC,0x00,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x6E,0x83,0x00,0x00,0x00,0xFF,0x00,0x65,0x65,0x65,0xFF +,0xA3,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x18,0x18,0x18,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x23,0xA3,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x28,0x83,0x00,0x00,0x00,0xFF,0x00,0x1F,0x1F,0x1F,0xFF,0xA3 +,0xFF,0xFF,0xFF,0xFF,0x00,0xDC,0xDC,0xDC,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xE8,0x00,0x00,0x00,0x03,0xBC,0x00,0x00,0x00,0x00,0xBC,0x00 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFD,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x13,0x13,0x13,0xFF,0xFB,0xFB,0xFB,0xFF,0xA2,0xFF,0xFF,0xFF +,0xFF,0x00,0xBF,0xBF,0xBF,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xCC,0xA5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xCB,0xCB,0xCB,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x85,0x85,0x85 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x94,0xBD,0x00,0x00,0x00 +,0x00,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xB9,0xB9,0xB9,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x69,0x69,0x69 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x76,0xA5,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x81,0x83,0x00,0x00,0x00,0xFF,0x00,0x77,0x77,0x77 +,0xFF,0xA2,0xFF,0xFF,0xFF,0xFF,0x00,0x2E,0x2E,0x2E,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x3D,0xBD,0x00,0x00,0x00,0x00,0xBD,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x6B,0x83,0x00,0x00,0x00,0xFF,0x00,0x62,0x62,0x62 +,0xFF,0xA1,0xFF,0xFF,0xFF,0xFF,0x01,0xFC,0xFC,0xFC,0xFF,0x16,0x16,0x16,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x21,0xA5,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x2D,0x83,0x00,0x00,0x00,0xFF,0x00,0x24,0x24,0x24,0xFF +,0xA1,0xFF,0xFF,0xFF,0xFF,0x00,0xD7,0xD7,0xD7,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x01,0xBD,0x00,0x00,0x00,0x00,0xBD +,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0xFD,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x11,0x11,0x11,0xFF,0xFA,0xFA,0xFA,0xFF,0xA0,0xFF,0xFF +,0xFF,0xFF,0x00,0xBD,0xBD,0xBD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xCA,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xD0,0xD0,0xD0,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80 +,0x80,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8F,0xBE,0x00,0x00 +,0x00,0x00,0xBE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xB6,0xB6,0xB6,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x66,0x66 +,0x66,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x74,0xA7,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x83,0x00,0x00,0x00,0xFF,0x00,0x7D,0x7D +,0x7D,0xFF,0xA0,0xFF,0xFF,0xFF,0xFF,0x00,0x29,0x29,0x29,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x38,0xBE,0x00,0x00,0x00,0x00,0xBE,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x83,0x00,0x00,0x00,0xFF,0x00,0x60,0x60 +,0x60,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x14,0x14,0x14 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1E +,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x83,0x00,0x00,0x00,0xFF +,0x00,0x29,0x29,0x29,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0x00,0xD2,0xD2,0xD2,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x01,0xBE +,0x00,0x00,0x00,0x00,0xBE,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x15,0x00 +,0x00,0x00,0xFC,0x82,0x00,0x00,0x00,0xFF,0x01,0x10,0x10,0x10,0xFF,0xF9,0xF9 +,0xF9,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0xBA,0xBA,0xBA,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xC7,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0xDE,0x83,0x00,0x00,0x00,0xFF,0x00,0xD6,0xD6,0xD6,0xFF,0x9E,0xFF,0xFF +,0xFF,0xFF,0x00,0x7B,0x7B,0x7B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x8A,0xBF,0x00,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0xBC,0x83,0x00,0x00,0x00,0xFF,0x00,0xB3,0xB3,0xB3,0xFF,0x9E,0xFF,0xFF +,0xFF,0xFF,0x00,0x64,0x64,0x64,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x71,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x82,0x82,0x82,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x24,0x24 +,0x24,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x33,0xBF,0x00,0x00 +,0x00,0x00,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x5D,0x5D,0x5D,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x01,0xFB,0xFB +,0xFB,0xFF,0x12,0x12,0x12,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xFE,0x00,0x00,0x00,0x1C,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x2E,0x2E,0x2E,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF +,0x00,0xCD,0xCD,0xCD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDC +,0xC0,0x00,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x13 +,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF,0x01,0x0E,0x0E,0x0E,0xFF,0xF8 +,0xF8,0xF8,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0xB7,0xB7,0xB7,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC4,0xAA,0x00,0x00,0x00,0x00,0x01,0x00 +,0x00,0x00,0x01,0x00,0x00,0x00,0xE3,0x83,0x00,0x00,0x00,0xFF,0x00,0xDB,0xDB +,0xDB,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x76,0x76,0x76,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x86,0xC0,0x00,0x00,0x00,0x00,0xC0,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xB9,0x83,0x00,0x00,0x00,0xFF,0x00,0xB0,0xB0 +,0xB0,0xFF,0x9C,0xFF,0xFF,0xFF,0xFF,0x00,0x61,0x61,0x61,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x6E,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x91,0x83,0x00,0x00,0x00,0xFF,0x00,0x87,0x87,0x87,0xFF,0x9C,0xFF,0xFF +,0xFF,0xFF,0x00,0x20,0x20,0x20,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x2F,0xC0,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x62,0x83,0x00,0x00,0x00,0xFF,0x00,0x5A,0x5A,0x5A,0xFF,0x9B,0xFF,0xFF +,0xFF,0xFF,0x01,0xFA,0xFA,0xFA,0xFF,0x11,0x11,0x11,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x1A,0xAB,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x3D,0x83,0x00,0x00,0x00,0xFF,0x00,0x34,0x34,0x34,0xFF +,0x9B,0xFF,0xFF,0xFF,0xFF,0x00,0xC8,0xC8,0xC8,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xD7,0xC1,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00 +,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xFA,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7,0xF7,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0xB4 +,0xB4,0xB4,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC2,0xAC,0x00 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE7,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xDF,0xDF,0xDF,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0x71,0x71 +,0x71,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x81,0xC1,0x00,0x00 +,0x00,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB6,0x83,0x00,0x00 +,0x00,0xFF,0x00,0xAE,0xAE,0xAE,0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0x5E,0x5E +,0x5E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6C,0xAD,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x83,0x00,0x00,0x00,0xFF,0x00,0x8C,0x8C +,0x8C,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0x01,0xFE,0xFE,0xFE,0xFF,0x1C,0x1C,0x1C +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2A,0xC1,0x00,0x00,0x00 +,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x57,0x57,0x57,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0x01,0xF8,0xF8,0xF8 +,0xFF,0x0F,0x0F,0x0F,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD +,0x00,0x00,0x00,0x18,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x39,0x39,0x39,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0x00 +,0xC3,0xC3,0xC3,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD3,0xC2 +,0x00,0x00,0x00,0x00,0xC1,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00 +,0x00,0x00,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01,0x0B,0x0B,0x0B,0xFF,0xF5,0xF5 +,0xF5,0xFF,0x98,0xFF,0xFF,0xFF,0xFF,0x00,0xB2,0xB2,0xB2,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xBF,0xAE,0x00,0x00,0x00,0x00,0x01,0x00,0x00 +,0x00,0x03,0x00,0x00,0x00,0xEB,0x82,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01 +,0xFF,0xE4,0xE4,0xE4,0xFF,0x98,0xFF,0xFF,0xFF,0xFF,0x00,0x6C,0x6C,0x6C,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7C,0xC2,0x00,0x00,0x00,0x00 +,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB3,0x83,0x00,0x00,0x00,0xFF +,0x00,0xAB,0xAB,0xAB,0xFF,0x98,0xFF,0xFF,0xFF,0xFF,0x00,0x5B,0x5B,0x5B,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x69,0xAF,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x9B,0x83,0x00,0x00,0x00,0xFF,0x00,0x92,0x92,0x92,0xFF +,0x97,0xFF,0xFF,0xFF,0xFF,0x01,0xFD,0xFD,0xFD,0xFF,0x18,0x18,0x18,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x25,0xC2,0x00,0x00,0x00,0x00,0xC2 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x55,0x55,0x55,0xFF,0x97,0xFF,0xFF,0xFF,0xFF,0x01,0xF7,0xF7,0xF7,0xFF,0x0D +,0x0D,0x0D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00 +,0x00,0x16,0xAF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x3E,0x3E,0x3E,0xFF,0x97,0xFF,0xFF,0xFF,0xFF,0x00,0xBE,0xBE +,0xBE,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCE,0xC3,0x00,0x00 +,0x00,0x00,0xC2,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0E,0x00,0x00,0x00 +,0xF8,0x82,0x00,0x00,0x00,0xFF,0x01,0x0A,0x0A,0x0A,0xFF,0xF4,0xF4,0xF4,0xFF +,0x96,0xFF,0xFF,0xFF,0xFF,0x00,0xAF,0xAF,0xAF,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xBC,0xB0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05 +,0x00,0x00,0x00,0xEE,0x82,0x00,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE8 +,0xE8,0xE8,0xFF,0x96,0xFF,0xFF,0xFF,0xFF,0x00,0x67,0x67,0x67,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x77,0xC3,0x00,0x00,0x00,0x00,0xC3,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x83,0x00,0x00,0x00,0xFF,0x00,0xA8 +,0xA8,0xA8,0xFF,0x96,0xFF,0xFF,0xFF,0xFF,0x00,0x59,0x59,0x59,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x66,0xB1,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0xA0,0x83,0x00,0x00,0x00,0xFF,0x00,0x97,0x97,0x97,0xFF,0x95,0xFF +,0xFF,0xFF,0xFF,0x01,0xFB,0xFB,0xFB,0xFF,0x14,0x14,0x14,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x20,0xC3,0x00,0x00,0x00,0x00,0xC3,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x5A,0x83,0x00,0x00,0x00,0xFF,0x00,0x52,0x52 +,0x52,0xFF,0x95,0xFF,0xFF,0xFF,0xFF,0x01,0xF6,0xF6,0xF6,0xFF,0x0C,0x0C,0x0C +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x14 +,0xB1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x83,0x00,0x00,0x00,0xFF +,0x00,0x43,0x43,0x43,0xFF,0x95,0xFF,0xFF,0xFF,0xFF,0x00,0xB9,0xB9,0xB9,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC9,0xC4,0x00,0x00,0x00,0x00 +,0xC3,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xF7,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x08,0x08,0x08,0xFF,0xF3,0xF3,0xF3,0xFF,0x94,0xFF +,0xFF,0xFF,0xFF,0x00,0xAC,0xAC,0xAC,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xBA,0xB2,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00 +,0x00,0xF2,0x82,0x00,0x00,0x00,0xFF,0x01,0x04,0x04,0x04,0xFF,0xEC,0xEC,0xEC +,0xFF,0x94,0xFF,0xFF,0xFF,0xFF,0x00,0x62,0x62,0x62,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x72,0xC4,0x00,0x00,0x00,0x00,0xC4,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xAE,0x83,0x00,0x00,0x00,0xFF,0x00,0xA5,0xA5,0xA5 +,0xFF,0x94,0xFF,0xFF,0xFF,0xFF,0x00,0x56,0x56,0x56,0xFF,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x64,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0xA6,0x83,0x00,0x00,0x00,0xFF,0x00,0x9C,0x9C,0x9C,0xFF,0x93,0xFF,0xFF,0xFF +,0xFF,0x01,0xFA,0xFA,0xFA,0xFF,0x11,0x11,0x11,0xFF,0x82,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1C,0xC4,0x00,0x00,0x00,0x00,0xC4 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x4F,0x4F,0x4F,0xFF,0x93,0xFF,0xFF,0xFF,0xFF,0x01,0xF5,0xF5,0xF5,0xFF,0x0A +,0x0A,0x0A,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00 +,0x00,0x12,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x49,0x49,0x49,0xFF,0x93,0xFF,0xFF,0xFF,0xFF,0x00,0xB4,0xB4 +,0xB4,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC4,0xC5,0x00,0x00 +,0x00,0x00,0xC4,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0B,0x00,0x00,0x00 +,0xF5,0x82,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07,0xFF,0xF1,0xF1,0xF1,0xFF +,0x92,0xFF,0xFF,0xFF,0xFF,0x00,0xA9,0xA9,0xA9,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB7,0xB4,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x09 +,0x00,0x00,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF,0x01,0x05,0x05,0x05,0xFF,0xEF +,0xEF,0xEF,0xFF,0x92,0xFF,0xFF,0xFF,0xFF,0x00,0x5D,0x5D,0x5D,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6D,0xC5,0x00,0x00,0x00,0x00,0xC5,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0xA3 +,0xA3,0xA3,0xFF,0x92,0xFF,0xFF,0xFF,0xFF,0x00,0x53,0x53,0x53,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0xB5,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0xA1,0xA1,0xA1,0xFF,0x91,0xFF +,0xFF,0xFF,0xFF,0x01,0xF8,0xF8,0xF8,0xFF,0x0E,0x0E,0x0E,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x18,0xC5,0x00,0x00,0x00 +,0x00,0xC5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x4C,0x4C,0x4C,0xFF,0x91,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3 +,0xFF,0x09,0x09,0x09,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA +,0x00,0x00,0x00,0x11,0xB5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x4E,0x4E,0x4E,0xFF,0x91,0xFF,0xFF,0xFF,0xFF,0x00 +,0xAF,0xAF,0xAF,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBF,0xC6 +,0x00,0x00,0x00,0x00,0xC5,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0A,0x00 +,0x00,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF,0x01,0x06,0x06,0x06,0xFF,0xEF,0xEF +,0xEF,0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0xA6,0xA6,0xA6,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xB5,0xB6,0x00,0x00,0x00,0x00,0x01,0x00,0x00 +,0x00,0x0C,0x00,0x00,0x00,0xF7,0x82,0x00,0x00,0x00,0xFF,0x01,0x07,0x07,0x07 +,0xFF,0xF2,0xF2,0xF2,0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0x58,0x58,0x58,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x68,0xC6,0x00,0x00,0x00,0x00 +,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x83,0x00,0x00,0x00,0xFF +,0x00,0xA0,0xA0,0xA0,0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0x50,0x50,0x50,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5E,0xB7,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xB0,0x83,0x00,0x00,0x00,0xFF,0x00,0xA7,0xA7,0xA7,0xFF +,0x8F,0xFF,0xFF,0xFF,0xFF,0x01,0xF5,0xF5,0xF5,0xFF,0x0B,0x0B,0x0B,0xFF,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x15,0xC6,0x00 +,0x00,0x00,0x00,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x4A,0x4A,0x4A,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,0x01,0xF2 +,0xF2,0xF2,0xFF,0x08,0x08,0x08,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xF9,0x00,0x00,0x00,0x0F,0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x5C,0x83,0x00,0x00,0x00,0xFF,0x00,0x53,0x53,0x53,0xFF,0x8F,0xFF,0xFF,0xFF +,0xFF,0x00,0xAA,0xAA,0xAA,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xBA,0xC7,0x00,0x00,0x00,0x00,0xC6,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 +,0x08,0x00,0x00,0x00,0xF3,0x82,0x00,0x00,0x00,0xFF,0x01,0x05,0x05,0x05,0xFF +,0xEE,0xEE,0xEE,0xFF,0x8E,0xFF,0xFF,0xFF,0xFF,0x00,0xA4,0xA4,0xA4,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB2,0xB8,0x00,0x00,0x00,0x00,0x01 +,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xF9,0x82,0x00,0x00,0x00,0xFF,0x01,0x0A +,0x0A,0x0A,0xFF,0xF5,0xF5,0xF5,0xFF,0x8E,0xFF,0xFF,0xFF,0xFF,0x00,0x53,0x53 +,0x53,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x63,0xC7,0x00,0x00 +,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA5,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x9D,0x9D,0x9D,0xFF,0x8E,0xFF,0xFF,0xFF,0xFF,0x00,0x4D,0x4D +,0x4D,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5C,0xB9,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x83,0x00,0x00,0x00,0xFF,0x00,0xAC,0xAC +,0xAC,0xFF,0x8D,0xFF,0xFF,0xFF,0xFF,0x01,0xF3,0xF3,0xF3,0xFF,0x09,0x09,0x09 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x12 +,0xC7,0x00,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4F +,0x83,0x00,0x00,0x00,0xFF,0x00,0x47,0x47,0x47,0xFF,0x8D,0xFF,0xFF,0xFF,0xFF +,0x01,0xF0,0xF0,0xF0,0xFF,0x07,0x07,0x07,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x0D,0xB9,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x62,0x83,0x00,0x00,0x00,0xFF,0x00,0x58,0x58,0x58,0xFF,0x8D,0xFF +,0xFF,0xFF,0xFF,0x00,0xA5,0xA5,0xA5,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xB5,0xC8,0x00,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x01,0x00 +,0x00,0x00,0x07,0x00,0x00,0x00,0xF1,0x82,0x00,0x00,0x00,0xFF,0x01,0x04,0x04 +,0x04,0xFF,0xEC,0xEC,0xEC,0xFF,0x8C,0xFF,0xFF,0xFF,0xFF,0x00,0xA1,0xA1,0xA1 +,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAF,0xBA,0x00,0x00,0x00 +,0x00,0x01,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF +,0x01,0x0D,0x0D,0x0D,0xFF,0xF7,0xF7,0xF7,0xFF,0x8C,0xFF,0xFF,0xFF,0xFF,0x00 +,0x4E,0x4E,0x4E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5E,0xC8 +,0x00,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA2,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x9A,0x9A,0x9A,0xFF,0x8C,0xFF,0xFF,0xFF,0xFF,0x00 +,0x4B,0x4B,0x4B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x59,0xBB +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0x83,0x00,0x00,0x00,0xFF,0x00 +,0xB1,0xB1,0xB1,0xFF,0x8B,0xFF,0xFF,0xFF,0xFF,0x01,0xF0,0xF0,0xF0,0xFF,0x07 +,0x07,0x07,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00 +,0x00,0x0E,0xC8,0x00,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x4C,0x83,0x00,0x00,0x00,0xFF,0x00,0x44,0x44,0x44,0xFF,0x8B,0xFF,0xFF +,0xFF,0xFF,0x01,0xEE,0xEE,0xEE,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x0C,0xBB,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x67,0x83,0x00,0x00,0x00,0xFF,0x00,0x5D,0x5D,0x5D,0xFF +,0x8B,0xFF,0xFF,0xFF,0xFF,0x00,0xA0,0xA0,0xA0,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB0,0xC9,0x00,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x00 +,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xEF,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x03,0x03,0x03,0xFF,0xEA,0xEA,0xEA,0xFF,0x8A,0xFF,0xFF,0xFF,0xFF,0x00,0x9E +,0x9E,0x9E,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAD,0xBC,0x00 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0xFD,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x10,0x10,0x10,0xFF,0xFA,0xFA,0xFA,0xFF,0x8A,0xFF,0xFF,0xFF +,0xFF,0x00,0x49,0x49,0x49,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x59,0xC9,0x00,0x00,0x00,0x00,0xC9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0xA0,0x83,0x00,0x00,0x00,0xFF,0x00,0x98,0x98,0x98,0xFF,0x8A,0xFF,0xFF,0xFF +,0xFF,0x00,0x48,0x48,0x48,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x56,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xB6,0xB6,0xB6,0xFF,0x89,0xFF,0xFF,0xFF,0xFF,0x01,0xED,0xED,0xED +,0xFF,0x05,0x05,0x05,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6 +,0x00,0x00,0x00,0x0C,0xC9,0x00,0x00,0x00,0x00,0xC9,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x49,0x83,0x00,0x00,0x00,0xFF,0x00,0x41,0x41,0x41,0xFF,0x89 +,0xFF,0xFF,0xFF,0xFF,0x01,0xED,0xED,0xED,0xFF,0x04,0x04,0x04,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF5,0x00,0x00,0x00,0x0B,0xBD,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x83,0x00,0x00,0x00,0xFF,0x00,0x63,0x63 +,0x63,0xFF,0x89,0xFF,0xFF,0xFF,0xFF,0x00,0x9B,0x9B,0x9B,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xAB,0xCA,0x00,0x00,0x00,0x00,0xC9,0x00,0x00 +,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xEE,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE8,0xE8,0xE8,0xFF,0x88,0xFF,0xFF,0xFF,0xFF +,0x00,0x9B,0x9B,0x9B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAA +,0xBE,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFE,0x82 +,0x00,0x00,0x00,0xFF,0x01,0x13,0x13,0x13,0xFF,0xFB,0xFB,0xFB,0xFF,0x88,0xFF +,0xFF,0xFF,0xFF,0x00,0x44,0x44,0x44,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x54,0xCA,0x00,0x00,0x00,0x00,0xCA,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x9D,0x83,0x00,0x00,0x00,0xFF,0x00,0x95,0x95,0x95,0xFF,0x88,0xFF +,0xFF,0xFF,0xFF,0x00,0x45,0x45,0x45,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x54,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0x83,0x00 +,0x00,0x00,0xFF,0x00,0xBC,0xBC,0xBC,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0x01,0xE9 +,0xE9,0xE9,0xFF,0x03,0x03,0x03,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xF3,0x00,0x00,0x00,0x09,0xCA,0x00,0x00,0x00,0x00,0xCA,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x47,0x83,0x00,0x00,0x00,0xFF,0x00,0x3F,0x3F,0x3F +,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0x01,0xEB,0xEB,0xEB,0xFF,0x04,0x04,0x04,0xFF +,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x09,0xBF +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x68,0x68,0x68,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0x00,0x96,0x96,0x96,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA6,0xCB,0x00,0x00,0x00,0x00,0xCA +,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xEC,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x02,0x02,0x02,0xFF,0xE6,0xE6,0xE6,0xFF,0x86,0xFF,0xFF +,0xFF,0xFF,0x00,0x99,0x99,0x99,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xA7,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x83,0x00,0x00 +,0x00,0xFF,0x01,0x17,0x17,0x17,0xFF,0xFD,0xFD,0xFD,0xFF,0x86,0xFF,0xFF,0xFF +,0xFF,0x00,0x3F,0x3F,0x3F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x4F,0xCB,0x00,0x00,0x00,0x00,0xCB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x9A,0x83,0x00,0x00,0x00,0xFF,0x00,0x92,0x92,0x92,0xFF,0x86,0xFF,0xFF,0xFF +,0xFF,0x00,0x42,0x42,0x42,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x51,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0x83,0x00,0x00,0x00 +,0xFF,0x00,0xC1,0xC1,0xC1,0xFF,0x85,0xFF,0xFF,0xFF,0xFF,0x01,0xE6,0xE6,0xE6 +,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1 +,0x00,0x00,0x00,0x07,0xCB,0x00,0x00,0x00,0x00,0xCB,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x44,0x83,0x00,0x00,0x00,0xFF,0x00,0x3C,0x3C,0x3C,0xFF,0x85 +,0xFF,0xFF,0xFF,0xFF,0x01,0xE9,0xE9,0xE9,0xFF,0x03,0x03,0x03,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x08,0xC1,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x83,0x00,0x00,0x00,0xFF,0x00,0x6D,0x6D +,0x6D,0xFF,0x85,0xFF,0xFF,0xFF,0xFF,0x00,0x91,0x91,0x91,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xA1,0xCC,0x00,0x00,0x00,0x00,0xCB,0x00,0x00 +,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xEA,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x01,0x01,0x01,0xFF,0xE4,0xE4,0xE4,0xFF,0x84,0xFF,0xFF,0xFF,0xFF +,0x00,0x96,0x96,0x96,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA5 +,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x83,0x00,0x00,0x00,0xFF +,0x01,0x1B,0x1B,0x1B,0xFF,0xFE,0xFE,0xFE,0xFF,0x84,0xFF,0xFF,0xFF,0xFF,0x00 +,0x3A,0x3A,0x3A,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4A,0xCC +,0x00,0x00,0x00,0x00,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x8F,0x8F,0x8F,0xFF,0x84,0xFF,0xFF,0xFF,0xFF,0x00 +,0x3F,0x3F,0x3F,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4E,0xC3 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0xC6,0xC6,0xC6,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0x01,0xE2,0xE2,0xE2,0xFF,0x01 +,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00,0x00 +,0x00,0x05,0xCC,0x00,0x00,0x00,0x00,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x41,0x83,0x00,0x00,0x00,0xFF,0x00,0x39,0x39,0x39,0xFF,0x83,0xFF,0xFF +,0xFF,0xFF,0x01,0xE7,0xE7,0xE7,0xFF,0x02,0x02,0x02,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x07,0xC3,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x7C,0x83,0x00,0x00,0x00,0xFF,0x00,0x72,0x72,0x72,0xFF +,0x83,0xFF,0xFF,0xFF,0xFF,0x00,0x8C,0x8C,0x8C,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x9C,0xCD,0x00,0x00,0x00,0x00,0xCC,0x00,0x00,0x00,0x00 +,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE8,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x01,0x01,0x01,0xFF,0xE2,0xE2,0xE2,0xFF,0x82,0xFF,0xFF,0xFF,0xFF,0x00,0x93 +,0x93,0x93,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA2,0xC4,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x83,0x00,0x00,0x00,0xFF,0x00,0x1F +,0x1F,0x1F,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0x00,0x35,0x35,0x35,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x45,0xCD,0x00,0x00,0x00,0x00,0xCD,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x83,0x00,0x00,0x00,0xFF,0x00,0x8D +,0x8D,0x8D,0xFF,0x82,0xFF,0xFF,0xFF,0xFF,0x00,0x3D,0x3D,0x3D,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4C,0xC5,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0xD5,0x83,0x00,0x00,0x00,0xFF,0x00,0xCB,0xCB,0xCB,0xFF,0x81,0xFF +,0xFF,0xFF,0xFF,0x00,0xDD,0xDD,0xDD,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xEA,0x00,0x00,0x00,0x03,0xCD,0x00,0x00,0x00,0x00,0xCD,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x83,0x00,0x00,0x00,0xFF,0x00,0x36,0x36 +,0x36,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0x01,0xE5,0xE5,0xE5,0xFF,0x01,0x01,0x01 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x06 +,0xC5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x83,0x00,0x00,0x00,0xFF +,0x00,0x78,0x78,0x78,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0x00,0x87,0x87,0x87,0xFF +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x97,0xCE,0x00,0x00,0x00,0x00 +,0xCD,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE6,0x83 +,0x00,0x00,0x00,0xFF,0x02,0xDF,0xDF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0x90,0x90 +,0x90,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9F,0xC6,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x2D,0x83,0x00,0x00,0x00,0xFF,0x00,0x24,0x24 +,0x24,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0x30,0x30,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0xCE,0x00,0x00,0x00,0x00,0xCE,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x83,0x00,0x00,0x00,0xFF,0x02,0x8A,0x8A +,0x8A,0xFF,0xFF,0xFF,0xFF,0xFF,0x3A,0x3A,0x3A,0xFF,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x49,0xC7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA +,0x83,0x00,0x00,0x00,0xFF,0x01,0xD0,0xD0,0xD0,0xFF,0xD9,0xD9,0xD9,0xFF,0x83 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x02,0xCE,0x00 +,0x00,0x00,0x00,0xCE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x83,0x00 +,0x00,0x00,0xFF,0x02,0x34,0x34,0x34,0xFF,0xE2,0xE2,0xE2,0xFF,0x01,0x01,0x01 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xED,0x00,0x00,0x00,0x05 +,0xC7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x83,0x00,0x00,0x00,0xFF +,0x01,0x7D,0x7D,0x7D,0xFF,0x82,0x82,0x82,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x92,0xCF,0x00,0x00,0x00,0x00,0xCE,0x00,0x00,0x00,0x00,0x01 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE3,0x83,0x00,0x00,0x00,0xFF,0x00,0x6B +,0x6B,0x6B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0xC8,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x83,0x00,0x00,0x00,0xFF,0x01,0x29 +,0x29,0x29,0xFF,0x2B,0x2B,0x2B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x3B,0xCF,0x00,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x8F,0x83,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0x01,0xFF,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x46,0xC9,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0xDF,0x87,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE3,0x00,0x00,0x00 +,0x01,0xCF,0x00,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x39,0x87,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x04 +,0xC9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x87,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x8D,0xD0,0x00,0x00,0x00,0x00,0xCF,0x00,0x00,0x00,0x00 +,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE1,0x86,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x9A,0xCA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x87 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x37,0xD0,0x00,0x00,0x00,0x00,0xD0 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x86,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x44,0xCA,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00 +,0x00,0x00,0xE3,0x85,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDF,0xD1,0x00 +,0x00,0x00,0x00,0xD0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x85,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEA,0x00,0x00,0x00,0x03,0xCB,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x85,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x89,0xD1,0x00,0x00,0x00,0x00,0xD1,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0xDF,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x97,0xCC,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x3D,0x85,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x32,0xD1,0x00,0x00,0x00,0x00,0xD1,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x89,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x41,0xCC,0x00,0x00 +,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE7,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xDA,0xD2,0x00,0x00,0x00,0x00,0xD1,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x33,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xE8,0x00,0x00,0x00,0x02,0xCD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x84,0xD2,0x00,0x00,0x00,0x00 +,0xD2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDC,0x82,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x95,0xCE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2D,0xD2,0x00,0x00,0x00,0x00 +,0xD2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x82,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x3F,0xCE,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03 +,0x00,0x00,0x00,0xEB,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD5,0xD3 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x54,0x52,0x55,0x45,0x56,0x49,0x53,0x49,0x4F,0x4E,0x2D,0x58,0x46 +,0x49,0x4C,0x45,0x2E,0x00}; +/* end binary data. size = 27965 bytes */ + + +/* begin binary data: */ +const int project_bytes = 39085; +const unsigned char project_data[] = /* 39085 */ +{0x00,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB9,0x01,0xB9 +,0x01,0x20,0x08,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xB2,0xFF +,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x90,0x00,0x00,0x00 +,0xD0,0x00,0x02,0x02,0xE9,0x00,0x00,0x00,0xFD,0x95,0x00,0x00,0x00,0xFF,0x05 +,0x00,0x01,0x01,0xF7,0x00,0x01,0x01,0xDB,0x00,0x00,0x00,0xBE,0x00,0x00,0x00 +,0xA3,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x17,0xFF,0xFF,0xFF,0xFF,0x00,0xE4 +,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xB0,0xFF,0xFF,0xFF,0x00,0x06 +,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0xFF,0x02,0x15,0x19,0xFE,0x03,0x2C,0x35,0xFF,0x05,0x3A,0x46,0xFF,0x95,0x05 +,0x3B,0x47,0xFF,0x02,0x04,0x37,0x41,0xFF,0x03,0x23,0x2A,0xFF,0x01,0x0D,0x0F +,0xFD,0x81,0x00,0x00,0x00,0xFF,0x03,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0xAA +,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x00,0xE1,0xFF +,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xB0,0xFF,0xFF,0xFF,0x00,0x03,0x00 +,0x00,0x00,0x65,0x00,0x00,0x00,0xFF,0x04,0x35,0x3F,0xFF,0x0C,0x93,0xAF,0xFF +,0x9B,0x0F,0xBF,0xE4,0xFF,0x06,0x0F,0xB9,0xDD,0xFF,0x0A,0x82,0x9B,0xFF,0x04 +,0x35,0x3F,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xCE +,0x00,0x00,0x00,0x2F,0xFF,0xFF,0xFF,0xFF,0x00,0xE0,0xFF,0xFF,0xFF,0x00,0xFF +,0xFF,0xFF,0xFF,0x00,0xB0,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x72,0x00 +,0x00,0x00,0xFF,0x0B,0x8A,0xA5,0xFF,0x9F,0x0F,0xBF,0xE4,0xFF,0x05,0x0D,0xA8 +,0xC8,0xFF,0x07,0x56,0x67,0xFF,0x00,0x02,0x03,0xFE,0x00,0x01,0x01,0xFB,0x00 +,0x00,0x00,0x80,0x00,0x00,0x00,0x05,0xFF,0xFF,0xFF,0xFF,0x00,0xDE,0xFF,0xFF +,0xFF,0x00,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x33,0x00,0x00,0x00 +,0x92,0x00,0x00,0x00,0xC7,0x90,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x00,0x30 +,0xFF,0xFF,0xFF,0xFF,0x00,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x35 +,0x00,0x00,0x00,0xFF,0x07,0x5D,0x6F,0xFF,0xA1,0x0F,0xBF,0xE4,0xFF,0x04,0x0C +,0x9A,0xB7,0xFF,0x03,0x23,0x29,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xD2 +,0x00,0x00,0x00,0x28,0xFF,0xFF,0xFF,0xFF,0x00,0xDD,0xFF,0xFF,0xFF,0x00,0x81 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x7C,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x01,0x10,0x13,0xFD,0x8D,0x02,0x16,0x1A,0xFD,0x00,0x01,0x09,0x0B,0xFE,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x01,0x01,0x64,0xFF,0xFF,0xFF,0xFF,0x00,0x98 +,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0xF2,0x02,0x1F +,0x26,0xFE,0x0F,0xBE,0xE3,0xFF,0xA1,0x0F,0xBF,0xE4,0xFF,0x04,0x0F,0xBB,0xE0 +,0xFF,0x08,0x61,0x73,0xFF,0x00,0x03,0x03,0xFE,0x00,0x01,0x01,0xED,0x00,0x00 +,0x00,0x35,0xFF,0xFF,0xFF,0xFF,0x00,0xDC,0xFF,0xFF,0xFF,0x00,0x04,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xFF,0x03,0x24,0x2B,0xFE,0x0C +,0x97,0xB4,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB8,0xDC,0xFF,0x01,0x0F +,0x12,0xFD,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0x45,0xFF,0xFF,0xFF,0xFF,0x00 +,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0xFF,0x0B +,0x86,0xA0,0xFF,0xA3,0x0F,0xBF,0xE4,0xFF,0x03,0x0B,0x89,0xA4,0xFF,0x00,0x06 +,0x08,0xFD,0x00,0x01,0x01,0xF4,0x00,0x00,0x00,0x42,0xFF,0xFF,0xFF,0xFF,0x00 +,0xDB,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x4B,0x00,0x00,0x00,0xFD,0x02 +,0x1E,0x24,0xFE,0x0E,0xB2,0xD4,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xAC +,0xCD,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x98,0xFF,0xFF,0xFF,0xFF,0x00 +,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1A,0x00,0x01,0x01,0xFA,0x03 +,0x2C,0x34,0xFF,0xA4,0x0F,0xBF,0xE4,0xFF,0x03,0x0C,0x93,0xAF,0xFF,0x01,0x0A +,0x0C,0xFD,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x50,0xFF,0xFF,0xFF,0xFF,0x00 +,0xDA,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAC,0x00,0x01,0x01,0xFF,0x0D +,0xA5,0xC5,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA9,0xCA,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x8D,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0xFF,0x0C,0x93,0xAF,0xFF,0xA4 +,0x0F,0xBF,0xE4,0xFF,0x03,0x0C,0x9B,0xB9,0xFF,0x01,0x0F,0x12,0xFD,0x00,0x01 +,0x01,0xF9,0x00,0x00,0x00,0x2F,0xFF,0xFF,0xFF,0xFF,0x00,0xD9,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0xD7,0x02,0x1A,0x1F,0xFE,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x0E,0xAF,0xD1,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAE,0xFF,0xFF +,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x27,0x00,0x00 +,0x00,0xFD,0x04,0x39,0x44,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF,0x03,0x0C,0x98,0xB6 +,0xFF,0x00,0x03,0x04,0xFE,0x00,0x01,0x01,0xD7,0x00,0x00,0x00,0x0A,0xFF,0xFF +,0xFF,0xFF,0x00,0xD8,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xED,0x03,0x21 +,0x28,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x31,0x3B,0xFF,0x00,0x01,0x01 +,0xFB,0x00,0x00,0x00,0x16,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0xAD,0x00,0x01,0x01,0xFF,0x0C,0x9E,0xBD,0xFF,0xA5,0x0F +,0xBF,0xE4,0xFF,0x02,0x08,0x68,0x7C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x9A,0xFF,0xFF,0xFF,0xFF,0x00,0xD8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x99,0x00,0x00,0x00,0xFF,0x0C,0x9D,0xBC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0A,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x74,0xFF,0xFF,0xFF +,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x36,0x00,0x00,0x00 +,0xFF,0x05,0x46,0x53,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF +,0x04,0x35,0x3F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x53,0xFF,0xFF,0xFF +,0xFF,0x00,0xD7,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x39,0x00,0x00,0x00 +,0xFF,0x07,0x55,0x66,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBA,0xDE,0xFF +,0x01,0x0C,0x0F,0xFE,0x00,0x01,0x01,0xD8,0xFF,0xFF,0xFF,0xFF,0x00,0x9D,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBF,0x00,0x02,0x03,0xFE,0x0D,0xA8,0xC8 +,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xAE,0xCF,0xFF,0x01,0x0F,0x12,0xFD +,0x00,0x01,0x01,0xE9,0x00,0x00,0x00,0x08,0xFF,0xFF,0xFF,0xFF,0x00,0xD6,0xFF +,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0xFF,0x00,0x00,0x01,0x01,0xD9,0x01,0x0F,0x12 +,0xFD,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x52,0x62,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3B,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0xFF,0x06,0x52,0x61 +,0xFF,0xA6,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6E,0x83,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x69,0xFF,0xFF,0xFF,0xFF,0x00,0xD6,0xFF,0xFF,0xFF,0x00,0x03 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xFF,0x0A,0x85,0x9E +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBC,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x9E,0xFF,0xFF,0xFF,0xFF,0x00,0x9D,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x01,0x01,0xD0,0x01,0x07,0x08,0xFE,0x0E,0xB0,0xD2,0xFF,0xA5,0x0F,0xBF +,0xE4,0xFF,0x03,0x0E,0xB8,0xDC,0xFF,0x01,0x0E,0x11,0xFD,0x00,0x01,0x01,0xDE +,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0x00,0xD5,0xFF,0xFF,0xFF,0x00,0x03 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xFD,0x05,0x3D,0x48 +,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x28,0x30,0xFF,0x00,0x01,0x01,0xF5 +,0x00,0x00,0x00,0x0D,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0xFF,0x07,0x5E,0x71,0xFF,0x81,0x0F,0xBF +,0xE4,0xFF,0x08,0x0E,0xB4,0xD7,0xFF,0x0B,0x91,0xAD,0xFF,0x0B,0x88,0xA2,0xFF +,0x0B,0x88,0xA3,0xFF,0x0B,0x91,0xAD,0xFF,0x0C,0x9A,0xB8,0xFF,0x0D,0xA3,0xC3 +,0xFF,0x0E,0xAC,0xCE,0xFF,0x0E,0xB6,0xD9,0xFF,0x9B,0x0F,0xBF,0xE4,0xFF,0x02 +,0x08,0x62,0x75,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x59,0xFF,0xFF,0xFF +,0xFF,0x00,0xD5,0xFF,0xFF,0xFF,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xB8,0x00,0x03,0x04,0xFE,0x0E,0xB0,0xD2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x09,0x73,0x8A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x66,0xFF,0xFF +,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x01 +,0x01,0xDF,0x01,0x0D,0x0F,0xFE,0x0C,0x9E,0xBD,0xFF,0x06,0x4A,0x59,0xFF,0x01 +,0x07,0x09,0xFE,0x87,0x00,0x00,0x00,0xFF,0x08,0x00,0x02,0x02,0xFF,0x01,0x0D +,0x0F,0xFD,0x02,0x1A,0x1E,0xFE,0x03,0x26,0x2E,0xFF,0x04,0x32,0x3C,0xFF,0x05 +,0x3F,0x4B,0xFF,0x06,0x4B,0x59,0xFF,0x08,0x69,0x7D,0xFF,0x0E,0xB6,0xD9,0xFF +,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD5,0xFF,0x01,0x08,0x0A,0xFE,0x00 +,0x01,0x01,0xD1,0xFF,0xFF,0xFF,0xFF,0x00,0xD5,0xFF,0xFF,0xFF,0x00,0x81,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0xFF,0x08,0x6C,0x81 +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5,0xD8,0xFF,0x01,0x07,0x09,0xFE +,0x00,0x00,0x00,0xC9,0xFF,0xFF,0xFF,0xFF,0x00,0x9D,0xFF,0xFF,0xFF,0x00,0x11 +,0x00,0x00,0x00,0x6A,0x00,0x00,0x00,0xFF,0x00,0x01,0x02,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x01,0xC5,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x60,0x00,0x00 +,0x00,0x5E,0x00,0x00,0x00,0x6A,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x82,0x00 +,0x00,0x00,0x8F,0x00,0x00,0x00,0x9D,0x00,0x00,0x00,0xAE,0x00,0x00,0x00,0xC0 +,0x00,0x00,0x00,0xD2,0x00,0x01,0x01,0xE4,0x00,0x01,0x01,0xF6,0x82,0x00,0x00 +,0x00,0xFF,0x02,0x01,0x0F,0x11,0xFD,0x08,0x6A,0x7F,0xFF,0x0F,0xB9,0xDD,0xFF +,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x56,0x67,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x45,0xFF,0xFF,0xFF,0xFF,0x00,0xD4,0xFF,0xFF,0xFF,0x00,0x81,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x01,0x01,0xF0,0x03,0x23,0x2A +,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x49,0x58,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x2D,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x03 +,0x00,0x00,0x00,0x09,0x00,0x01,0x02,0xEB,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x75,0x8D,0xFF,0xFF,0xFF,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x19 +,0x00,0x00,0x00,0x6D,0x00,0x01,0x01,0xE8,0x00,0x00,0x00,0xFF,0x02,0x1F,0x25 +,0xFE,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA6,0xC6,0xFF +,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA9,0xFF,0xFF,0xFF,0xFF,0x00,0xD4,0xFF +,0xFF,0xFF,0x00,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x97,0x00,0x00 +,0x00,0xFF,0x0C,0x9B,0xB9,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x94,0xB1 +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x90,0xFF,0xFF,0xFF,0xFF,0x00,0x9D +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x79,0x00,0x04,0x04,0xDA,0x00,0x00 +,0x00,0x3D,0x90,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x09,0x00,0x00,0x00 +,0x99,0x00,0x00,0x00,0xFF,0x09,0x75,0x8B,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02 +,0x04,0x33,0x3D,0xFF,0x00,0x01,0x01,0xFA,0x00,0x00,0x00,0x13,0xFF,0xFF,0xFF +,0xFF,0x00,0xD3,0xFF,0xFF,0xFF,0x00,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x36,0x00,0x00,0x00,0xFF,0x07,0x53,0x63,0xFF,0x91,0x0F,0xBF,0xE4,0xFF +,0x02,0x02,0x1F,0x25,0xFE,0x00,0x01,0x02,0xEE,0x00,0x00,0x00,0x07,0xFF,0xFF +,0xFF,0xFF,0x00,0xB1,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0E,0x00,0x01 +,0x02,0xEE,0x02,0x16,0x1B,0xFE,0x0F,0xBB,0xDF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x0A,0x7D,0x95,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x70,0xFF,0xFF +,0xFF,0xFF,0x00,0xD3,0xFF,0xFF,0xFF,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x01,0x01,0xD7,0x01,0x0E,0x11,0xFD,0x0F,0xBB,0xE0,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x02,0x08,0x6A,0x7E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x57,0xFF +,0xFF,0xFF,0xFF,0x00,0xB2,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x75,0x00 +,0x00,0x00,0xFF,0x09,0x70,0x85,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBA +,0xDE,0xFF,0x01,0x0D,0x10,0xFD,0x00,0x01,0x01,0xD5,0xFF,0xFF,0xFF,0xFF,0x00 +,0xD3,0xFF,0xFF,0xFF,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x76 +,0x00,0x00,0x00,0xFF,0x0A,0x82,0x9C,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E +,0xB0,0xD2,0xFF,0x00,0x04,0x05,0xFE,0x00,0x00,0x00,0xBB,0xFF,0xFF,0xFF,0xFF +,0x00,0xB2,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x09,0x00,0x01,0x02,0xEC +,0x02,0x19,0x1E,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x53,0x63,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x38,0xFF,0xFF,0xFF,0xFF,0x00,0xD2,0xFF,0xFF +,0xFF,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x19,0x00,0x00,0x00 +,0xFD,0x05,0x3A,0x46,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x40,0x4C,0xFF +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x20,0xBA,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x14,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x50,0x92,0x00,0x00,0x00 +,0x60,0x00,0x00,0x00,0x00,0x1A,0xB2,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00 +,0x0D,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x2A,0x00,0x00 +,0x00,0x22,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0xA5 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xFF,0x0C,0x97 +,0xB4,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9E,0xBD,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x9C,0x9D,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x09 +,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x5F,0x97,0x00,0x00 +,0x00,0x60,0x02,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x11 +,0xA6,0xFF,0xFF,0xFF,0x00,0x06,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x38,0x00 +,0x00,0x00,0x55,0x00,0x00,0x00,0x5A,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x5E +,0x00,0x00,0x00,0x5F,0x98,0x00,0x00,0x00,0x60,0x01,0x00,0x00,0x00,0x53,0x00 +,0x00,0x00,0x16,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0B,0x00,0x00 +,0x00,0x5B,0x00,0x00,0x00,0xAA,0x9D,0x00,0x00,0x00,0xB8,0x03,0x00,0x00,0x00 +,0xB7,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0x6E,0x00,0x00,0x00,0x33,0x99,0xFF +,0xFF,0xFF,0x00,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB5,0x00,0x02 +,0x03,0xFE,0x0E,0xAF,0xD0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA5 +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9B,0x93,0x00,0x00,0x00,0x48,0x07 +,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x38,0x00,0x00,0x00 +,0x31,0x00,0x00,0x00,0x2A,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1A,0x00,0x00 +,0x00,0x03,0x9C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00 +,0xAE,0x95,0x00,0x00,0x00,0xFF,0x00,0x00,0x02,0x03,0x63,0xAB,0xFF,0xFF,0xFF +,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x3A,0x00,0x00,0x00,0x73,0x00 +,0x00,0x00,0x92,0x00,0x00,0x00,0xB1,0x00,0x00,0x00,0xCF,0x00,0x01,0x01,0xEF +,0x87,0x00,0x00,0x00,0xFF,0x06,0x00,0x00,0x00,0xFE,0x00,0x01,0x01,0xF2,0x00 +,0x00,0x00,0xC6,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x35 +,0x00,0x00,0x00,0x08,0x9E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x3A,0x00 +,0x00,0x00,0xFF,0x07,0x54,0x64,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x29 +,0x31,0xFF,0x00,0x01,0x01,0xF4,0x00,0x00,0x00,0x0C,0x96,0xFF,0xFF,0xFF,0x00 +,0x06,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x5E,0x00,0x00,0x00,0x85,0x00,0x00 +,0x00,0xA6,0x00,0x00,0x00,0xC6,0x00,0x01,0x01,0xE8,0x00,0x00,0x00,0xFE,0x9D +,0x00,0x00,0x00,0xFF,0x03,0x00,0x01,0x01,0xEC,0x00,0x00,0x00,0xBA,0x00,0x00 +,0x00,0x4E,0x00,0x00,0x00,0x01,0x9E,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00 +,0x11,0x00,0x00,0x00,0x5D,0x00,0x00,0x00,0xAD,0x00,0x01,0x01,0xF0,0xA0,0x00 +,0x00,0x00,0xFF,0x03,0x00,0x00,0x00,0xFE,0x00,0x00,0x01,0xD3,0x00,0x00,0x00 +,0x85,0x00,0x00,0x00,0x0C,0x89,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x23 +,0x00,0x01,0x02,0xDD,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xFF,0x9D,0x01,0x0A +,0x0C,0xFD,0x00,0x01,0x09,0x0A,0xFD,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x01 +,0x01,0xDC,0x00,0x00,0x00,0x53,0x97,0xFF,0xFF,0xFF,0x00,0x84,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0xFF,0x08,0x6A,0x7E,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x01,0x0F,0xBE,0xE2,0xFF,0x02,0x16,0x1B,0xFE,0x9B,0x00 +,0x00,0x00,0xFF,0x04,0x00,0x01,0x01,0xF9,0x00,0x01,0x01,0xD1,0x00,0x00,0x00 +,0xA5,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x13,0x98,0xFF,0xFF,0xFF,0x00,0x04 +,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0xFF,0x04,0x34,0x3F,0xFF,0x08,0x64,0x77 +,0xFF,0x0A,0x7B,0x93,0xFF,0x8E,0x0A,0x83,0x9C,0xFF,0x04,0x09,0x70,0x86,0xFF +,0x00,0x02,0x03,0xFF,0x00,0x01,0x01,0xF8,0x00,0x00,0x00,0x97,0x00,0x00,0x00 +,0x29,0xA8,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x5A +,0x00,0x00,0x00,0xA5,0x00,0x01,0x02,0xEE,0x82,0x00,0x00,0x00,0xFF,0x0D,0x00 +,0x04,0x05,0xFE,0x02,0x18,0x1D,0xFE,0x04,0x2F,0x38,0xFF,0x05,0x46,0x53,0xFF +,0x07,0x5B,0x6D,0xFF,0x08,0x62,0x75,0xFF,0x07,0x5C,0x6E,0xFF,0x07,0x57,0x68 +,0xFF,0x06,0x51,0x61,0xFF,0x06,0x4B,0x59,0xFF,0x05,0x45,0x52,0xFF,0x05,0x40 +,0x4C,0xFF,0x04,0x2F,0x38,0xFF,0x01,0x0B,0x0D,0xFD,0x82,0x00,0x00,0x00,0xFF +,0x04,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xD4,0x00,0x00,0x00,0xA4,0x00,0x00 +,0x00,0x66,0x00,0x00,0x00,0x11,0x9A,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00 +,0x01,0x00,0x01,0x01,0xE2,0x01,0x13,0x16,0xFE,0x0F,0xBE,0xE2,0xFF,0x90,0x0F +,0xBF,0xE4,0xFF,0x02,0x09,0x74,0x8B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x63,0x93,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x67 +,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0xFD,0x81,0x00,0x00,0x00,0xFF,0x06,0x00 +,0x01,0x01,0xFF,0x01,0x12,0x16,0xFD,0x03,0x2C,0x35,0xFF,0x05,0x45,0x52,0xFF +,0x07,0x5D,0x6F,0xFF,0x09,0x76,0x8C,0xFF,0x0B,0x88,0xA3,0xFF,0x97,0x0B,0x89 +,0xA4,0xFF,0x07,0x0A,0x80,0x99,0xFF,0x08,0x65,0x79,0xFF,0x06,0x49,0x58,0xFF +,0x04,0x2D,0x36,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01 +,0xD9,0x00,0x00,0x00,0x5F,0x9B,0xFF,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x55 +,0x00,0x00,0x00,0xBC,0x00,0x00,0x01,0xFC,0x00,0x00,0x00,0xFF,0x00,0x02,0x02 +,0xFE,0x03,0x2C,0x35,0xFF,0x06,0x4C,0x5B,0xFF,0x08,0x68,0x7C,0xFF,0x0A,0x80 +,0x99,0xFF,0x9C,0x0A,0x83,0x9C,0xFF,0x05,0x09,0x76,0x8D,0xFF,0x05,0x44,0x51 +,0xFF,0x01,0x10,0x13,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xDF,0x00,0x00 +,0x00,0x41,0x87,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x01,0x02 +,0xE6,0x00,0x01,0x01,0xFF,0x08,0x64,0x77,0xFF,0x0E,0xAF,0xD0,0xFF,0x9E,0x0F +,0xBF,0xE4,0xFF,0x05,0x0E,0xB0,0xD2,0xFF,0x0B,0x8F,0xAB,0xFF,0x07,0x54,0x64 +,0xFF,0x01,0x0C,0x0E,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x94,0x96,0xFF +,0xFF,0xFF,0x00,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x01 +,0x01,0xEE,0x03,0x21,0x28,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x00,0x0B,0x92,0xAE +,0xFF,0x94,0x09,0x77,0x8E,0xFF,0x0D,0x09,0x76,0x8D,0xFF,0x09,0x70,0x86,0xFF +,0x08,0x6A,0x7E,0xFF,0x08,0x63,0x76,0xFF,0x07,0x5D,0x6F,0xFF,0x07,0x56,0x67 +,0xFF,0x06,0x4F,0x5F,0xFF,0x05,0x3A,0x46,0xFF,0x02,0x1B,0x20,0xFE,0x00,0x02 +,0x02,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0xB4,0x00 +,0x00,0x00,0x3C,0x95,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x36,0x00,0x00 +,0x00,0xFF,0x05,0x3B,0x47,0xFF,0x0F,0xBE,0xE2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x06,0x4B,0x59,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x5B,0xA8,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xC4,0x00,0x00,0x00 +,0xFD,0x81,0x00,0x00,0x00,0xFF,0x04,0x03,0x25,0x2C,0xFF,0x07,0x5F,0x72,0xFF +,0x0C,0x93,0xAF,0xFF,0x0E,0xAC,0xCE,0xFF,0x0F,0xBE,0xE3,0xFF,0x8C,0x0F,0xBF +,0xE4,0xFF,0x04,0x0D,0xA7,0xC7,0xFF,0x0A,0x83,0x9C,0xFF,0x07,0x5F,0x72,0xFF +,0x05,0x3B,0x47,0xFF,0x02,0x16,0x1B,0xFE,0x81,0x00,0x00,0x00,0xFF,0x03,0x00 +,0x01,0x01,0xFA,0x00,0x00,0x00,0xAD,0x00,0x00,0x00,0x4F,0x00,0x00,0x00,0x05 +,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0xFF,0x0B +,0x90,0xAC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5,0xD8,0xFF,0x01,0x07 +,0x09,0xFE,0x00,0x00,0x01,0xC7,0x92,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00 +,0x3B,0x00,0x01,0x01,0xDB,0x00,0x00,0x00,0xFF,0x00,0x05,0x06,0xFE,0x05,0x3B +,0x47,0xFF,0x0A,0x7B,0x93,0xFF,0x0D,0xA3,0xC2,0xFF,0x0F,0xBA,0xDE,0xFF,0xA1 +,0x0F,0xBF,0xE4,0xFF,0x05,0x0E,0xAF,0xD0,0xFF,0x07,0x5B,0x6D,0xFF,0x01,0x0A +,0x0C,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0x0A,0x97 +,0xFF,0xFF,0xFF,0x00,0x06,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xB8,0x00,0x00 +,0x00,0xFF,0x00,0x05,0x06,0xFE,0x05,0x3A,0x46,0xFF,0x09,0x76,0x8D,0xFF,0x0E +,0xB0,0xD2,0xFF,0xA2,0x0F,0xBF,0xE4,0xFF,0x04,0x0F,0xBE,0xE2,0xFF,0x08,0x69 +,0x7D,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x72,0x86 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9B,0x00,0x00,0x00,0xFF,0x09,0x71 +,0x87,0xFF,0xA3,0x0F,0xBF,0xE4,0xFF,0x03,0x0D,0xAA,0xCB,0xFF,0x03,0x29,0x31 +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x59,0x95,0xFF,0xFF,0xFF,0x00,0x85 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0xFF,0x0C,0x9A +,0xB7,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x06,0x0E,0xB8,0xDB,0xFF,0x0A,0x7F,0x97 +,0xFF,0x05,0x3A,0x46,0xFF,0x00,0x03,0x04,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00 +,0x00,0x9F,0x00,0x00,0x00,0x15,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x7C,0x00,0x00,0x00,0xFF,0x0B,0x8F,0xAB,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x01 +,0x02,0x1B,0x20,0xFE,0x00,0x01,0x01,0xE0,0xA7,0xFF,0xFF,0xFF,0x00,0x06,0x00 +,0x00,0x00,0x38,0x00,0x00,0x00,0xC4,0x00,0x00,0x00,0xFF,0x00,0x05,0x06,0xFE +,0x04,0x38,0x43,0xFF,0x09,0x72,0x88,0xFF,0x0D,0xAB,0xCC,0xFF,0x96,0x0F,0xBF +,0xE4,0xFF,0x07,0x0E,0xB1,0xD3,0xFF,0x09,0x73,0x8A,0xFF,0x04,0x2E,0x37,0xFF +,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xEC,0x00,0x00,0x00 +,0x93,0x00,0x00,0x00,0x35,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x30 +,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5A,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x06 +,0x49,0x58,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2B,0x90,0xFF,0xFF,0xFF +,0x00,0x04,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0xFD,0x00,0x06,0x07,0xFE,0x08 +,0x67,0x7A,0xFF,0x0E,0xB5,0xD8,0xFF,0xA7,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xB4 +,0xD7,0xFF,0x05,0x3E,0x4A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xD1,0x00 +,0x00,0x00,0x10,0x95,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x5C,0x00,0x01 +,0x01,0xF7,0x00,0x01,0x01,0xFF,0x06,0x47,0x55,0xFF,0x0E,0xAF,0xD1,0xFF,0xA7 +,0x0F,0xBF,0xE4,0xFF,0x03,0x0D,0xA3,0xC3,0xFF,0x02,0x1E,0x24,0xFE,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x70,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x1E,0x00,0x00,0x00,0xFE,0x04,0x33,0x3D,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF,0x03 +,0x0E,0xAF,0xD1,0xFF,0x01,0x0F,0x11,0xFD,0x00,0x01,0x01,0xED,0x00,0x00,0x00 +,0x13,0x94,0xFF,0xFF,0xFF,0x00,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x34,0x00,0x00,0x00,0xFF,0x06,0x51,0x61,0xFF,0xB2,0x0F,0xBF,0xE4,0xFF,0x04 +,0x0D,0xA2,0xC1,0xFF,0x04,0x32,0x3C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x02 +,0xEF,0x00,0x00,0x00,0x4C,0x92,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x84 +,0x00,0x00,0x00,0xFF,0x0D,0xA5,0xC5,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x01,0x02 +,0x13,0x17,0xFE,0x00,0x00,0x00,0xCA,0xA5,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00 +,0x00,0x24,0x00,0x00,0x00,0xAB,0x00,0x00,0x00,0xFF,0x00,0x02,0x03,0xFE,0x06 +,0x4F,0x5E,0xFF,0x0E,0xAE,0xCF,0xFF,0x9C,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA9 +,0xC9,0xFF,0x08,0x65,0x79,0xFF,0x02,0x20,0x26,0xFE,0x81,0x00,0x00,0x00,0xFF +,0x02,0x00,0x01,0x01,0xD8,0x00,0x00,0x00,0x5D,0x00,0x00,0x00,0x01,0x94,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x01,0xD5,0x01,0x0C,0x0E,0xFD,0x0F,0xBB,0xDF +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x93,0xAF,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x86,0x8F,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x5C,0x00 +,0x00,0x00,0xFF,0x03,0x2A,0x32,0xFF,0x0D,0xA3,0xC2,0xFF,0xAB,0x0F,0xBF,0xE4 +,0xFF,0x03,0x08,0x60,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xB5,0x00 +,0x00,0x00,0x01,0x93,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x4F,0x00,0x01 +,0x01,0xFC,0x02,0x15,0x19,0xFE,0x0B,0x92,0xAE,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF +,0x03,0x0E,0xAF,0xD0,0xFF,0x02,0x1D,0x22,0xFE,0x00,0x01,0x01,0xF8,0x00,0x00 +,0x00,0x1B,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x42,0x00,0x00,0x00 +,0xFF,0x08,0x6A,0x7E,0xFF,0xA6,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x75,0x8B,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6F,0x94,0xFF,0xFF,0xFF,0x00,0x86,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD5,0x01,0x0D,0x10,0xFD,0x0F,0xBB,0xDF +,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x03,0x0A,0x7D,0x95,0xFF,0x01,0x0F,0x11,0xFD +,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x79,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x7B,0x00,0x00,0x00,0xFF,0x0B,0x8B,0xA6,0xFF,0x91,0x0F,0xBF,0xE4 +,0xFF,0x01,0x03,0x26,0x2E,0xFF,0x00,0x01,0x01,0xE2,0xA4,0xFF,0xFF,0xFF,0x00 +,0x04,0x00,0x00,0x00,0x2F,0x00,0x01,0x01,0xF0,0x00,0x00,0x00,0xFF,0x05,0x3C +,0x48,0xFF,0x0D,0xA2,0xC1,0xFF,0xA1,0x0F,0xBF,0xE4,0xFF,0x05,0x0C,0x9B,0xB9 +,0xFF,0x07,0x57,0x68,0xFF,0x01,0x0E,0x11,0xFD,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x01,0xC7,0x00,0x00,0x00,0x35,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x7B,0x00,0x00,0x00,0xFF,0x0A,0x84,0x9D,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0F,0xBE,0xE3,0xFF,0x02,0x15,0x19,0xFE,0x00,0x01,0x01,0xDD,0x8E,0xFF,0xFF +,0xFF,0x00,0x03,0x00,0x00,0x00,0x15,0x00,0x01,0x02,0xEE,0x01,0x0F,0x12,0xFD +,0x0E,0xB1,0xD3,0xFF,0xAD,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x47,0x55,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x81,0x92,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 +,0x00,0x39,0x00,0x01,0x01,0xF8,0x01,0x0F,0x11,0xFD,0x0D,0xA2,0xC1,0xFF,0xAC +,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x89,0xA4,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x96,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x62,0x00,0x00,0x00 +,0xFF,0x0A,0x7F,0x98,0xFF,0xA6,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB6,0xD9,0xFF +,0x01,0x07,0x08,0xFE,0x00,0x00,0x00,0xCB,0x94,0xFF,0xFF,0xFF,0x00,0x86,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0xFF,0x0A,0x81,0x9A +,0xFF,0xB4,0x0F,0xBF,0xE4,0xFF,0x04,0x0D,0xA9,0xC9,0xFF,0x03,0x23,0x29,0xFE +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0x07,0x8F,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0xFF,0x06,0x48,0x56,0xFF +,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3F,0x4B,0xFF,0x00,0x01,0x01,0xFC,0x00 +,0x00,0x00,0x12,0xA2,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x24,0x00,0x01 +,0x02,0xEA,0x00,0x04,0x04,0xFE,0x0B,0x87,0xA1,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF +,0x05,0x0E,0xB4,0xD7,0xFF,0x07,0x54,0x64,0xFF,0x00,0x02,0x03,0xFE,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x9E,0x00,0x00,0x00,0x17,0x91,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0xFF,0x05,0x40,0x4C,0xFF,0x91,0x0F +,0xBF,0xE4,0xFF,0x02,0x07,0x55,0x66,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x33,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xFF +,0x0A,0x7E,0x96,0xFF,0xAE,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB8,0xDC,0xFF,0x03 +,0x24,0x2B,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x2D,0x90,0xFF,0xFF,0xFF +,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xCC,0x00,0x04,0x05,0xFE,0x0C +,0x99,0xB6,0xFF,0xAE,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x2A,0x32,0xFF,0x00,0x01 +,0x01,0xFA,0x00,0x00,0x00,0x11,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x4C,0x00,0x00,0x00,0xFF,0x08,0x66,0x7A,0xFF,0xA7,0x0F,0xBF,0xE4,0xFF,0x02 +,0x05,0x43,0x50,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x27,0x93,0xFF,0xFF +,0xFF,0x00,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x17,0x00,0x01,0x01 +,0xFC,0x04,0x38,0x43,0xFF,0xB5,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xB7,0xDA,0xFF +,0x05,0x3D,0x49,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xAB,0x00,0x00,0x00 +,0x02,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD1,0x01,0x0A,0x0C,0xFE +,0x0F,0xB9,0xDD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7E,0x96,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x67,0xA1,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 +,0x00,0x1B,0x00,0x01,0x02,0xE1,0x00,0x02,0x02,0xFE,0x0A,0x81,0x9A,0xFF,0xA8 +,0x0F,0xBF,0xE4,0xFF,0x05,0x0D,0xA0,0xBE,0xFF,0x04,0x32,0x3C,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x01,0x01,0xF2,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x05,0x90 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC5,0x00,0x06,0x07,0xFE,0x0E,0xB5 +,0xD8,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB4,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x8A,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x09 +,0x00,0x01,0x01,0xF6,0x03,0x2C,0x35,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF,0x02,0x0B +,0x91,0xAD,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8C,0x90,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0xFF,0x07,0x53,0x63,0xFF,0xAF +,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x74,0x8B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x64,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x01,0x01 +,0xEF,0x03,0x24,0x2B,0xFE,0xA7,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x88,0xA3,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x83,0x93,0xFF,0xFF,0xFF,0x00,0x87,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB3,0x00,0x02,0x02,0xFE,0x0E,0xAD,0xCF +,0xFF,0xB5,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x05,0x40,0x4D,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x90,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x75,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0E,0xB8,0xDC,0xFF,0x01,0x08,0x0A,0xFE,0x00,0x00,0x00,0xC2,0xA1 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBB,0x00,0x00,0x00,0xFF,0x09,0x74 +,0x8B,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x04,0x0A,0x81,0x9A,0xFF,0x02,0x16,0x1B +,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xDA,0x00,0x00,0x00,0x3D,0x8F,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6A,0x00,0x00,0x00,0xFF,0x09,0x78,0x8F +,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x17,0x1C,0xFE,0x00,0x01,0x01,0xE1 +,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xFF,0x09 +,0x6D,0x82,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x02,0x17 +,0x1C,0xFE,0x00,0x01,0x01,0xE9,0x00,0x00,0x00,0x03,0x8F,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x01,0x01,0xD8,0x01,0x09,0x0B,0xFE,0x0E,0xAF,0xD1,0xFF,0xAF,0x0F +,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD5,0xFF,0x00,0x04,0x04,0xFE,0x00,0x00,0x00 +,0xBD,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9B,0x00,0x00,0x00,0xFF +,0x0D,0xA1,0xC0,0xFF,0xA6,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBD,0xE1,0xFF,0x01 +,0x10,0x13,0xFD,0x00,0x01,0x01,0xDF,0x00,0x00,0x00,0x01,0x92,0xFF,0xFF,0xFF +,0x00,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0xFF +,0x08,0x67,0x7B,0xFF,0xB6,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBA,0xDE,0xFF,0x04 +,0x30,0x39,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x73,0x8E,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0xFE,0x05,0x3D,0x48,0xFF,0x91 +,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x46,0x53,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00 +,0x00,0x1E,0x9F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x17,0x00,0x00,0x00 +,0xFD,0x05,0x3A,0x46,0xFF,0xAD,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xB8,0xDC,0xFF +,0x07,0x5F,0x72,0xFF,0x00,0x05,0x06,0xFE,0x00,0x01,0x01,0xF9,0x00,0x00,0x00 +,0x51,0x8E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x14,0x00,0x00,0x01,0xFC +,0x04,0x34,0x3E,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x58,0x6A,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x37,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xA0,0x00,0x00,0x00,0xFF,0x0D,0xA9,0xCA,0xFF,0xB1,0x0F,0xBF,0xE4,0xFF +,0x02,0x07,0x5E,0x70,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x48,0x8E,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0xFF,0x06,0x4E,0x5D +,0xFF,0xB1,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x45,0xFF,0x00,0x00,0x00,0xFD +,0x00,0x00,0x00,0x18,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x43,0x00 +,0x00,0x00,0xFF,0x07,0x5F,0x72,0xFF,0xA7,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x53 +,0x63,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3B,0x92,0xFF,0xFF,0xFF,0x00 +,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x01,0x01,0xED,0x02 +,0x1F,0x25,0xFE,0xB7,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB4,0xD7,0xFF,0x03,0x21 +,0x27,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x58,0x8E,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0xC0,0x00,0x05,0x05,0xFE,0x0E,0xB3,0xD6,0xFF,0x90,0x0F +,0xBF,0xE4,0xFF,0x02,0x0B,0x8A,0xA5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x77,0x9F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0xFF +,0x0A,0x7C,0x94,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x03,0x0C,0x9D,0xBB,0xFF,0x01 +,0x11,0x14,0xFD,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x63,0x8E,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0xB5,0x00,0x02,0x02,0xFE,0x0E,0xAD,0xCF,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9A,0xB7,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x8E,0x8B,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x02,0xE9,0x03,0x25,0x2C +,0xFF,0xB2,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA4,0xC4,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0xA6,0x8E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6D,0x00 +,0x00,0x00,0xFF,0x0A,0x85,0x9F,0xFF,0xB1,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7C +,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6E,0x82,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x03,0x00,0x01,0x01,0xE9,0x02,0x1D,0x22,0xFE,0xA7,0x0F +,0xBF,0xE4,0xFF,0x02,0x0C,0x99,0xB6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x97,0x92,0xFF,0xFF,0xFF,0x00,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x92,0x00,0x00,0x00,0xFF,0x0C,0x97,0xB5,0xFF,0xB7,0x0F,0xBF,0xE4,0xFF,0x03 +,0x0D,0xAB,0xCC,0xFF,0x02,0x15,0x19,0xFD,0x00,0x01,0x01,0xFA,0x00,0x00,0x00 +,0x40,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0xFF +,0x09,0x75,0x8B,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBD,0xE1,0xFF,0x01 +,0x10,0x13,0xFD,0x00,0x01,0x01,0xD3,0x9F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xBE,0x00,0x05,0x06,0xFE,0x0E,0xB5,0xD8,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF +,0x03,0x0D,0xA6,0xC6,0xFF,0x02,0x18,0x1D,0xFD,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x77,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5A,0x00,0x00,0x00 +,0xFF,0x08,0x6C,0x81,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x1A,0x1F,0xFE +,0x00,0x01,0x02,0xE5,0x00,0x00,0x00,0x01,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x08,0x00,0x00,0x00,0xFF,0x05,0x46,0x53,0xFF,0xB3,0x0F,0xBF,0xE4 +,0xFF,0x02,0x03,0x2B,0x34,0xFF,0x00,0x01,0x01,0xF7,0x00,0x00,0x00,0x0E,0x8D +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAB,0x00,0x02,0x02,0xFE,0x0E,0xB7 +,0xDA,0xFF,0xB1,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB7,0xDA,0xFF,0x01,0x07,0x09 +,0xFE,0x00,0x00,0x00,0xC6,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x92 +,0x00,0x00,0x00,0xFF,0x0C,0x9A,0xB8,0xFF,0xA7,0x0F,0xBF,0xE4,0xFF,0x02,0x02 +,0x1E,0x24,0xFE,0x00,0x01,0x01,0xEE,0x00,0x00,0x00,0x06,0x91,0xFF,0xFF,0xFF +,0x00,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xFF +,0x06,0x4F,0x5E,0xFF,0xB8,0x0F,0xBF,0xE4,0xFF,0x03,0x0D,0xA0,0xBF,0xFF,0x01 +,0x0B,0x0E,0xFD,0x00,0x01,0x01,0xF2,0x00,0x00,0x00,0x2D,0x8C,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x11,0x00,0x01,0x01,0xFA,0x04,0x31,0x3A,0xFF,0x91 +,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x52,0x62,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x2D,0x9D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x16,0x00,0x00,0x00 +,0xFD,0x05,0x3C,0x48,0xFF,0x96,0x0F,0xBF,0xE4,0xFF,0x07,0x0E,0xB7,0xDA,0xFF +,0x0B,0x8D,0xA8,0xFF,0x0A,0x84,0x9D,0xFF,0x0A,0x7E,0x96,0xFF,0x09,0x78,0x8F +,0xFF,0x09,0x76,0x8C,0xFF,0x0C,0x95,0xB2,0xFF,0x0E,0xB8,0xDC,0xFF,0x93,0x0F +,0xBF,0xE4,0xFF,0x04,0x0E,0xAD,0xCF,0xFF,0x03,0x22,0x28,0xFE,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x8C,0x00,0x00,0x00,0x01,0x8B,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x0B,0x00,0x01,0x01,0xF5,0x03,0x28,0x30,0xFF,0x91,0x0F,0xBF +,0xE4,0xFF,0x02,0x07,0x5C,0x6E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3C +,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0xFF,0x07 +,0x5C,0x6E,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x72,0x88,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x63,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0xBD,0x01,0x0C,0x0F,0xFD,0xB3,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x43,0x50,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x20,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x39,0x00,0x00,0x00,0xFF,0x07,0x58,0x6A,0xFF,0xA7,0x0F,0xBF,0xE4 +,0xFF,0x02,0x08,0x64,0x77,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x50,0x91 +,0xFF,0xFF,0xFF,0x00,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x01,0xD2,0x01 +,0x0C,0x0E,0xFD,0x0F,0xBA,0xDE,0xFF,0xB8,0x0F,0xBF,0xE4,0xFF,0x03,0x0B,0x92 +,0xAE,0xFF,0x00,0x05,0x06,0xFE,0x00,0x01,0x01,0xDA,0x00,0x00,0x00,0x08,0x8C +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB1,0x00,0x01,0x01,0xFF,0x0D,0xAB +,0xCC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB4,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x88,0x9D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4C +,0x00,0x00,0x00,0xFF,0x09,0x70,0x86,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x03,0x0D +,0xA9,0xC9,0xFF,0x09,0x6E,0x83,0xFF,0x04,0x35,0x3F,0xFF,0x00,0x04,0x05,0xFE +,0x85,0x00,0x00,0x00,0xFF,0x03,0x00,0x02,0x02,0xFE,0x03,0x21,0x28,0xFE,0x06 +,0x49,0x57,0xFF,0x0C,0x94,0xB0,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB3 +,0xD6,0xFF,0x03,0x2C,0x34,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7C,0x8C +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0xFF,0x0D,0xA3 +,0xC3,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBB,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x92,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x44 +,0x00,0x00,0x00,0xFF,0x09,0x73,0x8A,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x02,0x0E +,0xB2,0xD5,0xFF,0x00,0x05,0x05,0xFE,0x00,0x00,0x00,0xC1,0x8D,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0xCB,0x02,0x16,0x1B,0xFE,0xB3,0x0F,0xBF,0xE4,0xFF +,0x02,0x0A,0x85,0x9F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x77,0x82,0xFF +,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xE1,0x02,0x16,0x1A +,0xFE,0x0F,0xBE,0xE3,0xFF,0xA6,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA8,0xC8,0xFF +,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAC,0x91,0xFF,0xFF,0xFF,0x00,0x89,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0xFF,0x0A,0x7F,0x97 +,0xFF,0xB9,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6D,0x82,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x8B,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x56,0x00 +,0x00,0x00,0xFF,0x08,0x69,0x7D,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x1A +,0x1F,0xFE,0x00,0x01,0x02,0xE3,0x00,0x00,0x00,0x01,0x9C,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x5D,0x00,0x00,0x00,0xFF,0x0A,0x82,0x9B,0xFF,0x92,0x0F +,0xBF,0xE4,0xFF,0x11,0x09,0x6F,0x84,0xFF,0x00,0x05,0x06,0xFE,0x00,0x00,0x00 +,0xFF,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0xB7,0x00,0x00,0x00,0x70,0x00,0x00 +,0x00,0x5A,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x4E,0x00,0x00,0x00,0x4D,0x00 +,0x00,0x00,0x77,0x00,0x00,0x00,0xA9,0x00,0x01,0x01,0xDC,0x00,0x00,0x00,0xFE +,0x00,0x00,0x00,0xFF,0x04,0x2D,0x35,0xFF,0x0B,0x86,0xA0,0xFF,0x0F,0xBE,0xE3 +,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB7,0xDA,0xFF,0x02,0x1E,0x24,0xFE +,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x3B,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x4A,0x00,0x00,0x00,0xFF,0x08,0x60,0x72,0xFF,0x91,0x0F,0xBF,0xE4 +,0xFF,0x02,0x02,0x1D,0x23,0xFE,0x00,0x01,0x02,0xE9,0x00,0x00,0x00,0x02,0x88 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xFF,0x0B,0x89 +,0xA4,0xFF,0xB4,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3F,0x4B,0xFF,0x00,0x00,0x00 +,0xFE,0x00,0x00,0x00,0x20,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0xD9 +,0x03,0x21,0x27,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBB,0xDF,0xFF,0x01 +,0x0C,0x0E,0xFE,0x00,0x01,0x01,0xD1,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0xFF,0x0C,0x94,0xB0,0xFF,0x95,0x0F,0xBF,0xE4,0xFF +,0x01,0x0F,0xBE,0xE2,0xFF,0x0C,0x9D,0xBC,0xFF,0x8B,0x0C,0x9B,0xB9,0xFF,0x00 +,0x0D,0xA5,0xC5,0xFF,0x82,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2F,0x38,0xFF,0x00 +,0x01,0x01,0xF9,0x00,0x00,0x00,0x10,0x90,0xFF,0xFF,0xFF,0x00,0x89,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x16,0x00,0x01,0x01,0xFB,0x04,0x36,0x40,0xFF +,0xB9,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x04,0x2D,0x35,0xFF,0x00 +,0x01,0x01,0xFD,0x00,0x00,0x00,0x37,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x09,0x00,0x01,0x01,0xF3,0x03,0x25,0x2C,0xFF,0x91,0x0F,0xBF,0xE4,0xFF +,0x02,0x07,0x5E,0x71,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3E,0x9C,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6E,0x00,0x00,0x00,0xFF,0x0B,0x8F,0xAB +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x05,0x0E,0xB1,0xD3,0xFF,0x05,0x3A,0x46,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xDB,0x00,0x00,0x00,0x52,0x00,0x00,0x00 +,0x0B,0x88,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x9A +,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0xFF,0x04,0x31,0x3B,0xFF,0x0E,0xB7,0xDA +,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0C,0x9D,0xBC,0xFF,0x00,0x06,0x07,0xFE +,0x00,0x01,0x01,0xE3,0x00,0x00,0x00,0x11,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x04,0x00,0x01,0x01,0xEB,0x02,0x1C,0x21,0xFE,0x91,0x0F,0xBF,0xE4 +,0xFF,0x02,0x07,0x5F,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x40,0x88 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xFF,0x0B,0x8D +,0xA8,0xFF,0xB4,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x85,0x9F,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x7D,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xE8 +,0x03,0x2A,0x32,0xFF,0x9A,0x0F,0xBF,0xE4,0xFF,0x09,0x0E,0xB2,0xD4,0xFF,0x0C +,0x99,0xB6,0xFF,0x0C,0x93,0xAF,0xFF,0x0C,0x99,0xB6,0xFF,0x0D,0xA0,0xBE,0xFF +,0x0D,0xA6,0xC6,0xFF,0x0E,0xAC,0xCE,0xFF,0x0E,0xB3,0xD6,0xFF,0x0F,0xB9,0xDD +,0xFF,0x0F,0xBE,0xE3,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4B,0x59,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x29,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x30,0x00,0x00,0x00,0xFF,0x06,0x51,0x61,0xFF,0x93,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0F,0xBB,0xE0,0xFF,0x08,0x6C,0x81,0xFF,0x02,0x19,0x1E,0xFE,0x8D +,0x00,0x00,0x00,0xFF,0x05,0x04,0x2E,0x37,0xFF,0x0A,0x81,0x9A,0xFF,0x0F,0xBE +,0xE2,0xFF,0x09,0x74,0x8B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x64,0x90 +,0xFF,0xFF,0xFF,0x00,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB0,0x00 +,0x02,0x02,0xFE,0x0D,0xAC,0xCD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x00,0x09,0x72 +,0x88,0xFF,0x8E,0x06,0x4D,0x5C,0xFF,0x03,0x07,0x5B,0x6C,0xFF,0x09,0x78,0x8F +,0xFF,0x0C,0x94,0xB1,0xFF,0x0E,0xB1,0xD3,0xFF,0x94,0x0F,0xBF,0xE4,0xFF,0x03 +,0x0D,0xA3,0xC2,0xFF,0x00,0x05,0x06,0xFE,0x00,0x01,0x01,0xD7,0x00,0x00,0x00 +,0x07,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0xFF +,0x0D,0xA1,0xC0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA3,0xC2,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x98,0x9C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x7F,0x00,0x00,0x00,0xFF,0x0C,0x9D,0xBC,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF +,0x04,0x0F,0xBA,0xDE,0xFF,0x02,0x19,0x1E,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x9E,0x00,0x00,0x00,0x0B,0x8C,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00 +,0x1A,0x00,0x00,0x00,0x9D,0x00,0x00,0x00,0xFF,0x03,0x2B,0x34,0xFF,0x0E,0xB4 +,0xD7,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x73,0x89,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0xAF,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x94 +,0x00,0x00,0x00,0xFF,0x0C,0x98,0xB6,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D +,0xA0,0xBF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x97,0x88,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0xFF,0x0B,0x89,0xA4,0xFF,0xB4 +,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBC,0xE0,0xFF,0x01,0x0F,0x12,0xFE,0x00,0x01 +,0x01,0xDB,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xF6,0x04,0x34,0x3E +,0xFF,0x96,0x0F,0xBF,0xE4,0xFF,0x03,0x0D,0xA9,0xC9,0xFF,0x06,0x4A,0x59,0xFF +,0x03,0x24,0x2B,0xFF,0x01,0x09,0x0B,0xFE,0x89,0x00,0x00,0x00,0xFF,0x0B,0x00 +,0x05,0x06,0xFE,0x01,0x0B,0x0D,0xFE,0x01,0x11,0x14,0xFE,0x02,0x17,0x1C,0xFE +,0x02,0x1E,0x24,0xFF,0x03,0x24,0x2B,0xFF,0x03,0x2B,0x33,0xFF,0x04,0x37,0x42 +,0xFF,0x07,0x56,0x67,0xFF,0x09,0x76,0x8D,0xFF,0x0C,0x96,0xB3,0xFF,0x0E,0xB5 +,0xD8,0xFF,0x83,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8E,0xA9,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x81,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD9 +,0x01,0x10,0x13,0xFE,0x0F,0xBD,0xE1,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x03,0x09 +,0x77,0x8E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xEF,0x00,0x00,0x00,0x93 +,0x8B,0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0xA1,0x00,0x01,0x01,0xF9,0x00 +,0x00,0x00,0xFF,0x04,0x2D,0x36,0xFF,0x0C,0x9A,0xB8,0xFF,0x00,0x05,0x06,0xFE +,0x00,0x00,0x00,0xC0,0x90,0xFF,0xFF,0xFF,0x00,0x8A,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xFF,0x08,0x66,0x7A,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x00,0x09,0x70,0x85,0xFF,0x92,0x00,0x00,0x00,0xFF,0x01,0x03,0x26 +,0x2D,0xFE,0x0B,0x8B,0xA5,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x68,0x7C +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x86,0x8B,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xFF,0x07,0x5D,0x6F,0xFF,0x91,0x0F,0xBF +,0xE4,0xFF,0x02,0x03,0x27,0x2E,0xFF,0x00,0x01,0x02,0xEF,0x00,0x00,0x00,0x06 +,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xFF,0x0D +,0xAC,0xCD,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x6B,0x80,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x79,0x90,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00 +,0x85,0x00,0x00,0x00,0xFF,0x03,0x26,0x2D,0xFE,0x0E,0xB5,0xD8,0xFF,0x8F,0x0F +,0xBF,0xE4,0xFF,0x02,0x05,0x40,0x4D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x6B,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0xFF +,0x07,0x54,0x64,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x21,0x27,0xFE,0x00 +,0x01,0x02,0xEC,0x00,0x00,0x00,0x03,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x5A,0x00,0x00,0x00,0xFF,0x0A,0x85,0x9F,0xFF,0x95,0x0F,0xBF,0xE4,0xFF +,0x04,0x0E,0xB7,0xDA,0xFF,0x0D,0xA6,0xC6,0xFF,0x0C,0x94,0xB1,0xFF,0x0A,0x83 +,0x9C,0xFF,0x09,0x78,0x8F,0xFF,0x8C,0x09,0x77,0x8E,0xFF,0x07,0x0A,0x79,0x91 +,0xFF,0x0A,0x7E,0x96,0xFF,0x0A,0x82,0x9C,0xFF,0x0B,0x87,0xA1,0xFF,0x0B,0x8B +,0xA6,0xFF,0x0B,0x8F,0xAB,0xFF,0x0C,0x94,0xB0,0xFF,0x0D,0xA8,0xC8,0xFF,0x85 +,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x53,0x63,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x39,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00 +,0xFF,0x05,0x3D,0x49,0xFF,0x95,0x0F,0xBF,0xE4,0xFF,0x16,0x09,0x70,0x85,0xFF +,0x00,0x05,0x06,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xDF,0x00,0x00,0x00 +,0xBD,0x00,0x00,0x00,0x9E,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x72,0x00,0x00 +,0x00,0x7A,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x8F,0x00 +,0x00,0x00,0x98,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0xAA,0x00,0x00,0x00,0xB3 +,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0xC5,0x00,0x00,0x00,0xCE,0x00,0x00,0x00 +,0xD7,0x00,0x01,0x01,0xE0,0x00,0x01,0x01,0xEA,0x00,0x01,0x01,0xF9,0x83,0x00 +,0x00,0x00,0xFF,0x06,0x02,0x15,0x19,0xFE,0x04,0x36,0x40,0xFF,0x08,0x67,0x7B +,0xFF,0x0E,0xB7,0xDA,0xFF,0x0F,0xBE,0xE2,0xFF,0x01,0x12,0x15,0xFE,0x00,0x01 +,0x01,0xDA,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7F,0x00,0x00,0x00 +,0xFF,0x0B,0x8C,0xA7,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF +,0x02,0x1F,0x25,0xFE,0x00,0x01,0x01,0xF2,0x00,0x00,0x00,0x10,0x8D,0xFF,0xFF +,0xFF,0x00,0x06,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xFE +,0x01,0x09,0x0A,0xFE,0x01,0x10,0x13,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x1E,0x8F,0xFF,0xFF,0xFF,0x00,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x05,0x00,0x01,0x01,0xEB,0x02,0x1D,0x23,0xFE,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0E,0xAF,0xD1,0xFF,0x00,0x03,0x03,0xFE,0x00,0x00,0x00,0xC6,0x8C,0x00,0x00 +,0x00,0x18,0x07,0x00,0x00,0x00,0x2E,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x7B +,0x00,0x00,0x00,0xA7,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0xFF,0x04,0x38,0x43 +,0xFF,0x0E,0xB5,0xD8,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBD,0xE1,0xFF +,0x03,0x28,0x30,0xFE,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x34,0x8A,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x01,0x01,0xE9,0x02,0x1A,0x1F,0xFE +,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x6B,0x80,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x4E,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA1,0x00,0x00 +,0x00,0xFF,0x0F,0xBA,0xDE,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB5,0xD8 +,0xFF,0x01,0x0F,0x11,0xFD,0x00,0x01,0x02,0xE4,0x00,0x00,0x00,0x07,0x91,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFF,0x07,0x54,0x64 +,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB5,0xD7,0xFF,0x02,0x18,0x1D,0xFD +,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x2E,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x01,0x01,0xDF,0x01,0x12,0x15,0xFE,0x0F,0xBE,0xE2,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x02,0x08,0x62,0x75,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x44,0x87 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0xFF,0x0A,0x82 +,0x9B,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x99,0xB6,0xFF,0x06,0x4F,0x5E +,0xFF,0x01,0x0E,0x11,0xFE,0x99,0x00,0x00,0x00,0xFF,0x03,0x01,0x0D,0x10,0xFE +,0x04,0x35,0x3F,0xFF,0x09,0x73,0x8A,0xFF,0x0E,0xB5,0xD7,0xFF,0x81,0x0F,0xBF +,0xE4,0xFF,0x02,0x0C,0x9A,0xB7,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x97 +,0x8B,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xF7,0x04,0x34,0x3E,0xFF,0x94 +,0x0F,0xBF,0xE4,0xFF,0x03,0x0B,0x88,0xA2,0xFF,0x00,0x01,0x01,0xFF,0x00,0x01 +,0x01,0xDE,0x00,0x00,0x00,0x46,0x92,0xFF,0xFF,0xFF,0x00,0x0C,0x00,0x00,0x00 +,0x02,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0x75,0x00,0x00 +,0x00,0x9F,0x00,0x00,0x00,0xC9,0x00,0x01,0x01,0xF3,0x00,0x00,0x00,0xFF,0x01 +,0x0F,0x11,0xFD,0x08,0x67,0x7B,0xFF,0x06,0x4C,0x5A,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x32,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x27,0x00 +,0x00,0x00,0xFF,0x06,0x4A,0x59,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBB +,0xDF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xAA,0x90,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x44,0x00,0x01,0x02,0xEA,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x78,0x8F,0xFF,0xFF,0xFF,0x00,0x8B,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x8F,0x00,0x00,0x00,0xFF,0x0C,0x95,0xB2,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x04,0x36,0x40,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x18 +,0x8F,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xA1,0x00 +,0x00,0x00,0xFF,0x03,0x22,0x28,0xFE,0x0D,0xAB,0xCC,0xFF,0x91,0x0F,0xBF,0xE4 +,0xFF,0x03,0x0D,0xA0,0xBE,0xFF,0x00,0x04,0x05,0xFE,0x00,0x01,0x01,0xD4,0x00 +,0x00,0x00,0x06,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x91,0x00,0x00 +,0x00,0xFF,0x0C,0x95,0xB2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAD,0xCF +,0xFF,0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0xA9,0x9B,0xFF,0xFF,0xFF,0x00,0x01 +,0x00,0x00,0x00,0xAC,0x00,0x03,0x03,0xFE,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08 +,0x61,0x74,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x64,0x92,0xFF,0xFF,0xFF +,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xC2,0x00,0x02,0x02,0xFE,0x0C +,0x9A,0xB7,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x02 +,0x03,0xFE,0x00,0x00,0x00,0xC0,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x84,0x00,0x00,0x00,0xFF,0x0B,0x8C,0xA7,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0D,0xA3,0xC3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9B,0x87,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x4F,0x00,0x00,0x00,0xFF,0x0A,0x7A,0x92,0xFF +,0x91,0x0F,0xBF,0xE4,0xFF,0x07,0x0A,0x7D,0x95,0xFF,0x00,0x02,0x03,0xFE,0x00 +,0x00,0x00,0xFF,0x00,0x01,0x01,0xD0,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x5A,0x8D,0x00,0x00,0x00,0x48,0x11,0x00 +,0x00,0x00,0x4A,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x5C +,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x70,0x00,0x00,0x00 +,0x98,0x00,0x00,0x00,0xCC,0x00,0x01,0x01,0xFA,0x00,0x00,0x00,0xFF,0x01,0x07 +,0x08,0xFE,0x06,0x49,0x57,0xFF,0x0E,0xAD,0xCF,0xFF,0x0F,0xBF,0xE4,0xFF,0x02 +,0x20,0x26,0xFE,0x00,0x01,0x01,0xEF,0x00,0x00,0x00,0x07,0x8A,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0xD5,0x02,0x1A,0x1F,0xFE,0x93,0x0F,0xBF,0xE4,0xFF +,0x03,0x0E,0xB6,0xD9,0xFF,0x01,0x0B,0x0D,0xFD,0x00,0x01,0x01,0xF0,0x00,0x00 +,0x00,0x24,0x99,0xFF,0xFF,0xFF,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00 +,0x6A,0x00,0x01,0x01,0xE6,0x00,0x00,0x00,0xFF,0x00,0x02,0x02,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x8B,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01 +,0xCF,0x01,0x0B,0x0D,0xFE,0x0F,0xBB,0xDF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0F,0xBC,0xE0,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA8,0x91,0xFF,0xFF +,0xFF,0x00,0x03,0x00,0x00,0x00,0x21,0x00,0x01,0x02,0xDD,0x00,0x00,0x00,0xFF +,0x00,0x00,0x01,0xD5,0x8F,0xFF,0xFF,0xFF,0x00,0x8B,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x2F,0x00,0x00,0x00,0xFF,0x06,0x4D,0x5C,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x0A,0x79,0x91,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6F +,0x91,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0xFE,0x02 +,0x15,0x19,0xFE,0x0E,0xAC,0xCE,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x63 +,0x76,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7E,0x8A,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0xFF,0x06,0x52,0x61,0xFF,0x91,0x0F +,0xBF,0xE4,0xFF,0x02,0x04,0x34,0x3E,0xFF,0x00,0x01,0x01,0xF7,0x00,0x00,0x00 +,0x0D,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xFF +,0x0E,0xB3,0xD6,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x45,0xFF,0x00 +,0x00,0x00,0xFD,0x00,0x00,0x00,0x04,0x93,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 +,0x00,0x29,0x00,0x01,0x01,0xFA,0x03,0x26,0x2D,0xFE,0x0F,0xBD,0xE1,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4F,0x5F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x4F,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00 +,0xFF,0x06,0x48,0x56,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x24,0x2C,0xFF +,0x00,0x01,0x02,0xEF,0x00,0x00,0x00,0x05,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x30,0x00,0x00,0x00,0xFF,0x07,0x5F,0x72,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x03,0x0D,0xA3,0xC3,0xFF,0x00,0x02,0x02,0xFE,0x00,0x01,0x02,0xE5,0x00 +,0x00,0x00,0x34,0x9B,0xFF,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x0F,0x00,0x00 +,0x00,0x66,0x00,0x00,0x00,0xC6,0x00,0x00,0x00,0xFF,0x01,0x0B,0x0D,0xFD,0x09 +,0x73,0x8A,0xFF,0x08,0x66,0x7A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x53 +,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB4,0x00,0x03,0x04,0xFE,0x0F +,0xBD,0xE1,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x76,0x8D,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x6B,0x9C,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00 +,0x08,0x00,0x00,0x00,0x71,0x00,0x01,0x01,0xF1,0x00,0x00,0x00,0xFF,0x00,0x01 +,0x01,0xE3,0x00,0x00,0x00,0x01,0x82,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x76,0x00,0x00,0x00,0xFF,0x0A,0x85,0x9F,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0F,0xBE,0xE3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA8,0x92,0xFF,0xFF +,0xFF,0x00,0x03,0x00,0x00,0x00,0x21,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x31,0x8E,0xFF,0xFF,0xFF,0x00,0x8C,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x01,0x01,0xD0,0x01,0x0A,0x0C,0xFD,0x0F,0xB9,0xDD,0xFF,0x8F,0x0F,0xBF +,0xE4,0xFF,0x02,0x0E,0xB5,0xD8,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xC9 +,0x92,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xFF,0x03 +,0x2B,0x34,0xFF,0x0F,0xBB,0xDF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBC +,0xE0,0xFF,0x02,0x1F,0x25,0xFE,0x00,0x01,0x02,0xF5,0x00,0x00,0x00,0x16,0x8A +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xDD,0x01,0x10,0x13,0xFE,0x0F,0xBD +,0xE1,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x78,0x8F,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x5F,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x81 +,0x00,0x00,0x00,0xFF,0x0D,0xA2,0xC1,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x01,0x04 +,0x35,0x3F,0xFF,0x00,0x01,0x01,0xF7,0x95,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x84,0x00,0x00,0x00,0xFF,0x08,0x6C,0x81,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF +,0x03,0x0E,0xAF,0xD1,0xFF,0x01,0x09,0x0B,0xFD,0x00,0x01,0x01,0xDA,0x00,0x00 +,0x00,0x04,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xCE,0x01,0x09,0x0B +,0xFE,0x0F,0xB9,0xDD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x49,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x0A,0x00,0x00,0x00,0xFE,0x05,0x41,0x4E,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x02,0x09,0x70,0x85,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4D,0x9F +,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x48,0x00,0x01,0x02,0xE3,0x00,0x00 +,0x00,0xFF,0x02,0x1C,0x21,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xB1,0x8A +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xFF,0x0D,0xA8 +,0xC8,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2F,0x38,0xFF,0x00,0x01,0x01 +,0xF8,0x00,0x00,0x00,0x10,0x9E,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x4B +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3C,0x82,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0xFE,0x05,0x43,0x50,0xFF +,0x91,0x0F,0xBF,0xE4,0xFF,0x01,0x01,0x0C,0x0E,0xFE,0x00,0x01,0x01,0xD6,0x93 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6C,0x00,0x01,0x01,0xF6,0x00,0x00 +,0x00,0x52,0x8E,0xFF,0xFF,0xFF,0x00,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x6E,0x00,0x00,0x00,0xFF,0x0A,0x7C,0x94,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x05,0x40,0x4C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x23,0x92,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xFF,0x06,0x4E,0x5D +,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x83,0x9C,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x90,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x82,0x00 +,0x00,0x00,0xFF,0x0B,0x8A,0xA5,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5 +,0xD7,0xFF,0x00,0x05,0x06,0xFE,0x00,0x00,0x00,0xB9,0x9A,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x6A,0x00,0x00,0x00,0xFF,0x0B,0x90,0xAC,0xFF,0x8E,0x0F +,0xBF,0xE4,0xFF,0x01,0x04,0x31,0x3B,0xFF,0x00,0x01,0x02,0xF0,0x95,0xFF,0xFF +,0xFF,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x01,0x01,0xDC,0x01,0x08,0x0A,0xFD +,0x0D,0xAA,0xCB,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x6D,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x73,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x0D,0xA6,0xC6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9F,0x87,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x01,0x02,0xE3,0x03,0x24,0x2B,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x05,0x3E,0x4A,0xFF,0x00,0x01,0x01,0xFC,0x00,0x00,0x00,0x0D +,0xA0,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x94,0x81 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0x14,0x89,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0xFF,0x0B,0x8E,0xAA +,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBA,0xDE,0xFF,0x00,0x01,0x02,0xFF +,0x00,0x00,0x00,0xAE,0xA0,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x6D,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xC5,0x01,0x07,0x09,0xFE,0x0E,0xB8,0xDB,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x06,0x4C,0x5A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x30,0x92,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x13,0x8F,0xFF,0xFF +,0xFF,0x00,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x14,0x00,0x01,0x01 +,0xFB,0x04,0x34,0x3F,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x83,0x9C,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7C,0x92,0xFF,0xFF,0xFF,0x00,0x03,0x00 +,0x00,0x00,0x04,0x00,0x00,0x00,0xBE,0x00,0x00,0x00,0xFF,0x0A,0x7B,0x93,0xFF +,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x28,0x30,0xFF,0x00,0x01,0x01,0xF9,0x00 +,0x00,0x00,0x1E,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x27,0x00,0x00 +,0x00,0xFF,0x05,0x46,0x53,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x40,0x4C +,0xFF,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x18,0x99,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xFF,0x0A,0x7F,0x97,0xFF,0x8E,0x0F,0xBF +,0xE4,0xFF,0x01,0x04,0x2E,0x37,0xFF,0x00,0x02,0x02,0xE8,0x96,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0xFF,0x05,0x3D,0x48,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xB9,0xDD,0xFF,0x02,0x15,0x1A,0xFD,0x00,0x01 +,0x02,0xEE,0x00,0x00,0x00,0x0F,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x1B,0x00,0x00,0x00,0xFD,0x05,0x3C,0x48,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02 +,0x03,0x28,0x2F,0xFF,0x00,0x01,0x01,0xF2,0x00,0x00,0x00,0x06,0x86,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0xB9,0x01,0x07,0x08,0xFE,0x0F,0xBE,0xE3,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x01,0x04,0x34,0x3E,0xFF,0x00,0x01,0x01,0xF6,0xA3 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6E,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x6D,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4F,0x00 +,0x00,0x00,0xFF,0x09,0x76,0x8C,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA2 +,0xC1,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x88,0xA0,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x34,0x84,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x6D,0x00,0x00,0x00,0xFF,0x0A,0x7E,0x96,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x0B,0x90,0xAC,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8B +,0xA4,0xFF,0xFF,0xFF,0x00,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAE +,0x00,0x01,0x01,0xFF,0x0D,0xAA,0xCB,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F +,0xBB,0xDF,0xFF,0x01,0x0B,0x0D,0xFE,0x00,0x01,0x01,0xD6,0x93,0xFF,0xFF,0xFF +,0x00,0x03,0x00,0x00,0x00,0x15,0x00,0x01,0x02,0xEB,0x01,0x0F,0x12,0xFD,0x0E +,0xB3,0xD6,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8E,0xA9,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x9E,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01 +,0xCE,0x01,0x09,0x0B,0xFE,0x0E,0xB8,0xDC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0A,0x84,0x9D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6F,0x99,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xFF,0x09,0x6D,0x82,0xFF +,0x8E,0x0F,0xBF,0xE4,0xFF,0x01,0x03,0x2C,0x35,0xFF,0x00,0x01,0x02,0xEF,0x97 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA5,0x00,0x00,0x00,0xFF,0x0A,0x85 +,0x9E,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7B,0x93,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x8A,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBE +,0x00,0x04,0x05,0xFE,0x0E,0xB3,0xD6,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08 +,0x69,0x7D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4D,0x86,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xFF,0x0D,0xA9,0xC9,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x49,0x58,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x10,0xA3,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6B,0x00,0x00,0x01 +,0xFC,0x00,0x00,0x00,0x70,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2C +,0x00,0x00,0x00,0xFF,0x07,0x58,0x69,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0B +,0x88,0xA3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x68,0xA7,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x17,0x00,0x00,0x01,0xFD,0x05,0x3C,0x48,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x02,0x15,0x19,0xFE,0x00,0x01 +,0x01,0xE4,0x00,0x00,0x00,0x02,0xA3,0xFF,0xFF,0xFF,0x00,0x8D,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x4D,0x00,0x00,0x00,0xFF,0x08,0x64,0x77,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4A,0x59,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x2F,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5E,0x00,0x00,0x00 +,0xFF,0x06,0x50,0x60,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x33,0x3D,0xFF +,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x28,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x72,0x00,0x00,0x00,0xFF,0x0A,0x7E,0x96,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0F,0xBB,0xDF,0xFF,0x01,0x0C,0x0E,0xFE,0x00,0x01,0x01,0xCB,0x99 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0xFF,0x07,0x5B +,0x6D,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4D,0x5C,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x22,0x96,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x16 +,0x00,0x01,0x01,0xF0,0x02,0x15,0x18,0xFD,0x0E,0xB6,0xD9,0xFF,0x8E,0x0F,0xBF +,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x03,0x27,0x2E,0xFE,0x00,0x01,0x01,0xF9 +,0x00,0x00,0x00,0x1F,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x63,0x00 +,0x00,0x00,0xFF,0x09,0x74,0x8B,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA9 +,0xC9,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA4,0x86,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x6A,0x00,0x00,0x00,0xFF,0x0B,0x8B,0xA6,0xFF,0x8F,0x0F +,0xBF,0xE4,0xFF,0x02,0x08,0x60,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x2B,0xA4,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x19,0x8A,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0xEE,0x03,0x27,0x2E,0xFF,0x91 +,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x71,0x87,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x4A,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBC,0x00,0x04,0x05 +,0xFE,0x0E,0xB4,0xD7,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x58,0x6A,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x40,0xA3,0xFF,0xFF,0xFF,0x00,0x8D,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0xEA,0x02,0x1B,0x20 +,0xFE,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8D,0xA8,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x88,0x94,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x01,0xC1,0x00 +,0x01,0x01,0xFF,0x0C,0x9A,0xB8,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97 +,0xB5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xAC,0x89,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFD,0x05,0x3A,0x46,0xFF,0x91,0x0F +,0xBF,0xE4,0xFF,0x02,0x06,0x4C,0x5B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x25,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFF +,0x06,0x48,0x56,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x77,0x8E,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x5A,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x66,0x00,0x00,0x00,0xFF,0x07,0x55,0x65,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF +,0x02,0x0B,0x8B,0xA6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x91,0x88,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x01,0x01,0xF9,0x04,0x31,0x3A +,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x2B,0x33,0xFF,0x00,0x01,0x01,0xF4 +,0x00,0x00,0x00,0x08,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x42,0x00 +,0x00,0x00,0xFF,0x09,0x6D,0x83,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x76 +,0x8D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x51,0xB1,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0xAD,0x00,0x01,0x01,0xFF,0x0E,0xB3,0xD6,0xFF,0x90,0x0F +,0xBF,0xE4,0xFF,0x02,0x0A,0x7D,0x95,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x5C,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xFF +,0x09,0x77,0x8E,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBB,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x9B,0xA3,0xFF,0xFF,0xFF,0x00,0x8E,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xFF,0x0C,0x93,0xAF,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x01,0x12,0x15,0xFE,0x00 +,0x01,0x01,0xE2,0x00,0x00,0x00,0x01,0x93,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 +,0x00,0x2B,0x00,0x01,0x01,0xFB,0x03,0x2A,0x32,0xFF,0x0F,0xBE,0xE3,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3D,0x48,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00 +,0x00,0x33,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBD,0x00,0x04,0x05 +,0xFE,0x0E,0xB2,0xD4,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x91,0xAD,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x80,0x99,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x01,0x01,0xE6,0x03,0x24,0x2B,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA2 +,0xC1,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x92,0x97,0xFF,0xFF,0xFF,0x00 +,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xC5,0x00,0x02,0x02,0xFE,0x0C,0x9C +,0xBA,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x22,0x29,0xFE,0x00,0x01,0x01 +,0xF4,0x00,0x00,0x00,0x0F,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAE +,0x00,0x01,0x01,0xFF,0x0D,0xAB,0xCC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08 +,0x6C,0x81,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x51,0x85,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFF,0x06,0x50,0x60,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA2,0xC1,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x97,0xB1,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6A,0x00,0x00,0x00 +,0xFF,0x0A,0x83,0x9C,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9B,0xB9,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x82,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x11,0x00,0x01,0x01,0xFA,0x04,0x34,0x3F,0xFF,0x91,0x0F,0xBF,0xE4 +,0xFF,0x02,0x03,0x21,0x27,0xFE,0x00,0x01,0x01,0xF1,0x00,0x00,0x00,0x07,0xA2 +,0xFF,0xFF,0xFF,0x00,0x8E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2D,0x00 +,0x00,0x00,0xFF,0x06,0x4B,0x59,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x54 +,0x64,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3B,0x94,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0xFF,0x0A,0x7B,0x93,0xFF,0x90,0x0F +,0xBF,0xE4,0xFF,0x02,0x0D,0xA0,0xBE,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00 +,0xB9,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0xFF +,0x09,0x73,0x89,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBE,0xE3,0xFF,0x02 +,0x15,0x19,0xFE,0x00,0x01,0x02,0xDB,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xAE,0x00,0x02,0x03,0xFE,0x0E,0xB8,0xDC,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF +,0x02,0x0F,0xBE,0xE3,0xFF,0x01,0x0C,0x0E,0xFE,0x00,0x00,0x00,0xCA,0x98,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2E,0x00,0x00,0x00,0xFE,0x05,0x3F,0x4B +,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x77,0x8E,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x75,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x53,0x00 +,0x00,0x00,0xFF,0x08,0x68,0x7C,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xAC +,0xCD,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA8,0x86,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x01,0x01,0xF4,0x04,0x32,0x3C,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x01 +,0x02,0x18,0x1D,0xFE,0x00,0x01,0x01,0xE0,0xB1,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x27,0x00,0x00,0x00,0xFF,0x06,0x51,0x61,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0E,0xB8,0xDC,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA9,0xA9 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB2,0x00,0x02,0x02,0xFE,0x0E,0xAF +,0xD1,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x51,0xA2,0xFF,0xFF,0xFF,0x00,0x8F,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0xCC,0x01,0x09,0x0B,0xFD,0x0E,0xB8,0xDB,0xFF,0x8F,0x0F +,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x95,0x94,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x10,0x00,0x01,0x02,0xF1 +,0x02,0x1A,0x1F,0xFE,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x05 +,0x46,0x53,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x31,0x88,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x0F,0x00,0x01,0x01,0xF9,0x04,0x2E,0x37,0xFF,0x91 +,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x59,0x6A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x35,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00 +,0xFF,0x0B,0x92,0xAE,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x36,0x40,0xFF +,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0x08,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0xB2,0x00,0x01,0x01,0xFF,0x0D,0xA4,0xC4,0xFF,0x8E,0x0F,0xBF,0xE4 +,0xFF,0x03,0x0F,0xBB,0xDF,0xFF,0x01,0x11,0x14,0xFE,0x00,0x01,0x01,0xE3,0x00 +,0x00,0x00,0x04,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x01 +,0x01,0xF1,0x03,0x24,0x2B,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2E,0x37 +,0xFF,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0x0A,0x85,0xFF,0xFF,0xFF,0x00,0x01 +,0x00,0x00,0x00,0xCB,0x02,0x14,0x18,0xFE,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x06 +,0x4F,0x5E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x27,0xB1,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x01,0x01,0xE5,0x02,0x1F,0x25,0xFE,0x91,0x0F,0xBF,0xE4,0xFF +,0x01,0x02,0x16,0x1B,0xFE,0x00,0x00,0x00,0xD0,0xA9,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x5A,0x00,0x00,0x00,0xFF,0x09,0x70,0x85,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x0D,0xA9,0xC9,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAC +,0xA2,0xFF,0xFF,0xFF,0x00,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6C +,0x00,0x00,0x00,0xFF,0x0A,0x7A,0x92,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x02 +,0x1B,0x20,0xFE,0x00,0x01,0x01,0xEB,0x00,0x00,0x00,0x04,0x94,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x7A,0x00,0x00,0x00,0xFF,0x09,0x73,0x89,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9B,0xB9,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0xA0,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAD,0x00,0x01,0x01 +,0xFF,0x0D,0xA9,0xCA,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBB,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x90,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x40,0x00,0x00,0x00,0xFF,0x08,0x6A,0x7E,0xFF,0x8E,0x0F,0xBF,0xE4 +,0xFF,0x02,0x08,0x60,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3A,0x98 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x3B,0x00,0x00,0x00,0xFF,0x06,0x4D +,0x5C,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x62,0x75,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x59,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9D +,0x00,0x00,0x00,0xFF,0x0D,0xA0,0xBF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09 +,0x6F,0x84,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x56,0x85,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xFF,0x0E,0xAF,0xD1,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x85,0x9F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x70,0xB1,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA1,0x00,0x00,0x00 +,0xFF,0x0E,0xAC,0xCE,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x35,0x3F,0xFF +,0x00,0x01,0x01,0xF7,0x00,0x00,0x00,0x01,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x0C,0x00,0x01,0x01,0xF6,0x04,0x2E,0x37,0xFF,0x91,0x0F,0xBF,0xE4 +,0xFF,0x02,0x04,0x2E,0x37,0xFF,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x0F,0xA1 +,0xFF,0xFF,0xFF,0x00,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x12,0x00 +,0x01,0x01,0xFA,0x04,0x32,0x3C,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5E +,0x70,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x48,0x94,0xFF,0xFF,0xFF,0x00 +,0x03,0x00,0x00,0x00,0x0B,0x00,0x01,0x02,0xEB,0x02,0x14,0x18,0xFE,0x0F,0xB9 +,0xDD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2D,0x36,0xFF,0x00,0x01,0x01 +,0xF9,0x00,0x00,0x00,0x16,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x53 +,0x00,0x00,0x00,0xFF,0x08,0x67,0x7A,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03 +,0x20,0x27,0xFE,0x00,0x01,0x02,0xEA,0x00,0x00,0x00,0x03,0x97,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xFD,0x05,0x41,0x4E,0xFF,0x8E +,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x72,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC4,0x00,0x05,0x06 +,0xFE,0x0E,0xAE,0xCF,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB0,0xD2,0xFF +,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xCB,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x42,0x00,0x00,0x00,0xFF,0x07,0x5C,0x6E,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0E,0xAE,0xCF,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAD,0x85 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xFF,0x0A,0x79 +,0x91,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB7,0xDA,0xFF,0x00,0x04,0x05 +,0xFE,0x00,0x00,0x00,0xB8,0xB1,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5F +,0x00,0x00,0x00,0xFF,0x0A,0x7B,0x93,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x07 +,0x53,0x63,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x22,0xA9,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0xA9,0x00,0x01,0x01,0xFF,0x0D,0xAA,0xCB,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x72,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x62,0xA1,0xFF,0xFF,0xFF,0x00,0x90,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xAB,0x00,0x01,0x01,0xFF,0x0D,0xA9,0xC9,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF +,0x02,0x0D,0xA1,0xC0,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA2,0x95,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6F,0x00,0x00,0x00,0xFF,0x08,0x6A,0x7F +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x80,0x99,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x7D,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x07,0x00 +,0x01,0x01,0xF1,0x03,0x23,0x2A,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65 +,0x79,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x46,0x98,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x01,0x01,0xD3,0x02,0x18,0x1C,0xFE,0x8E,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0E,0xB6,0xD9,0xFF,0x00,0x05,0x06,0xFE,0x00,0x00,0x00,0xC1,0x99,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x4E,0x00,0x00,0x00,0xFF,0x07,0x5B,0x6D,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4C,0x5B,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x3D,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x01 +,0x01,0xE6,0x02,0x18,0x1C,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x31,0x3A +,0xFF,0x00,0x01,0x01,0xF7,0x00,0x00,0x00,0x0C,0x84,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xFD,0x05,0x41,0x4E,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x04,0x32,0x3C,0xFF,0x00,0x01,0x01,0xF8,0x00,0x00,0x00,0x09 +,0xB0,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xFF,0x06 +,0x49,0x58,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x82,0x9B,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x6B,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x51,0x00,0x00,0x00,0xFF,0x08,0x69,0x7D,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0E,0xB2,0xD4,0xFF,0x00,0x04,0x05,0xFE,0x00,0x00,0x00,0xBD,0xA1,0xFF,0xFF +,0xFF,0x00,0x90,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4B,0x00,0x00,0x00 +,0xFF,0x08,0x61,0x74,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x25,0x2C,0xFF +,0x00,0x01,0x01,0xF3,0x00,0x00,0x00,0x09,0x94,0xFF,0xFF,0xFF,0x00,0x03,0x00 +,0x00,0x00,0x07,0x00,0x01,0x02,0xE4,0x01,0x0F,0x12,0xFE,0x0E,0xB6,0xD9,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBD,0xE1,0xFF,0x02,0x15,0x19,0xFD,0x00 +,0x01,0x01,0xE7,0x00,0x00,0x00,0x05,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x9E,0x00,0x00,0x00,0xFF,0x0C,0x9F,0xBE,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x0D,0xA9,0xC9,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA1,0x98,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9B,0x00,0x00,0x00,0xFF,0x0E,0xAF,0xD1 +,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3E,0x4A,0xFF,0x00,0x00,0x00,0xFD +,0x00,0x00,0x00,0x1A,0x98,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x01,0x00 +,0x01,0x01,0xD7,0x01,0x0C,0x0E,0xFD,0x0E,0xB6,0xD9,0xFF,0x8E,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0D,0xA0,0xBF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9F,0x88 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xFF,0x0C,0x94 +,0xB1,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x72,0x88,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x5A,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC8 +,0x01,0x0C,0x0E,0xFE,0x0F,0xBD,0xE1,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08 +,0x68,0x7C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x48,0xB1,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x01,0x01,0xDA,0x02,0x16,0x1B,0xFE,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x0E,0xB7,0xDA,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xBC,0xA9,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x01,0x01,0xF1,0x03,0x26,0x2D +,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x46,0xFF,0x00,0x00,0x00,0xFD +,0x00,0x00,0x00,0x1A,0xA0,0xFF,0xFF,0xFF,0x00,0x90,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x03,0x00,0x01,0x01,0xE8,0x02,0x19,0x1E,0xFE,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x08,0x67,0x7B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x55 +,0x95,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xFF,0x08 +,0x61,0x74,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x5A,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x43,0x00,0x00,0x00,0xFF,0x07,0x5B,0x6D,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02 +,0x04,0x2E,0x36,0xFF,0x00,0x01,0x02,0xF4,0x00,0x00,0x00,0x09,0x97,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF +,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7F,0x98,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x6F,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x61,0x00,0x00 +,0x00,0xFF,0x08,0x6A,0x7E,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x24,0x2B +,0xFE,0x00,0x01,0x01,0xEF,0x00,0x00,0x00,0x05,0x87,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xFF,0x06,0x50,0x60,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x0E,0xB0,0xD2,0xFF,0x00,0x02,0x03,0xFE,0x00,0x00,0x00,0xB1 +,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xFF,0x0B +,0x92,0xAE,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9E,0xBD,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x91,0xB1,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x96,0x00,0x00,0x00,0xFF,0x0D,0xA5,0xC5,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x05,0x3A,0x46,0xFF,0x00,0x01,0x01,0xFC,0x00,0x00,0x00,0x11,0xA9,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xFF,0x0D,0xA3,0xC3,0xFF +,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7F,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x72,0xA0,0xFF,0xFF,0xFF,0x00,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x8A,0x00,0x00,0x00,0xFF,0x0B,0x91,0xAD,0xFF,0x8F,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0D,0xA9,0xCA,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAE,0x95 +,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0xDC,0x01,0x0A +,0x0C,0xFE,0x0E,0xB2,0xD4,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB1,0xD3 +,0xFF,0x00,0x05,0x06,0xFE,0x00,0x00,0x00,0xC8,0x88,0xFF,0xFF,0xFF,0x00,0x03 +,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0xE7,0x02,0x17,0x1C,0xFE,0x0F,0xBE,0xE3 +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x72,0x88,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x57,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1C,0x00 +,0x00,0x00,0xFE,0x05,0x41,0x4E,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB8 +,0xDC,0xFF,0x01,0x08,0x09,0xFD,0x00,0x00,0x00,0xC6,0x99,0xFF,0xFF,0xFF,0x00 +,0x03,0x00,0x00,0x00,0x06,0x00,0x01,0x01,0xE5,0x02,0x14,0x18,0xFD,0x0F,0xBB +,0xE0,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x64,0x77,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x47,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD8 +,0x01,0x0F,0x12,0xFE,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x04 +,0x34,0x3F,0xFF,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x0F,0x84,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0xFF,0x07,0x5A,0x6B,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x14,0x18,0xFE,0x00,0x01,0x01,0xDA,0xB1,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xFF,0x09,0x73,0x8A +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x76,0x8D,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x5D,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x47,0x00 +,0x00,0x00,0xFF,0x08,0x61,0x74,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB8 +,0xDC,0xFF,0x01,0x09,0x0B,0xFE,0x00,0x01,0x01,0xCE,0xA0,0xFF,0xFF,0xFF,0x00 +,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2A,0x00,0x00,0x00,0xFF,0x06 +,0x49,0x57,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2E,0x37,0xFF,0x00,0x01 +,0x01,0xF9,0x00,0x00,0x00,0x0F,0x95,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x5A,0x00,0x00,0x00,0xFF,0x07,0x59,0x6A,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x06,0x4A,0x59,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x37,0x88,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0xFF,0x0C,0x94,0xB0,0xFF +,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD4,0xFF,0x00,0x03,0x04,0xFE,0x00 +,0x00,0x00,0xB1,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x01,0xC7,0x01,0x08 +,0x0A,0xFE,0x0F,0xB9,0xDD,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x43,0x50 +,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1E,0x99,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0xFF,0x09,0x79,0x90,0xFF,0x8E,0x0F,0xBF +,0xE4,0xFF,0x02,0x0D,0xA3,0xC2,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9C +,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,0xFF,0x0B +,0x88,0xA3,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x75,0x8B,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x5E,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x01,0x00,0x01,0x01,0xEB,0x03,0x22,0x29,0xFE,0x90,0x0F,0xBF,0xE4,0xFF,0x01 +,0x06,0x4B,0x59,0xFF,0x00,0x00,0x00,0xFF,0xA5,0x00,0x01,0x01,0xF9,0x05,0x00 +,0x01,0x01,0xF8,0x00,0x01,0x01,0xDD,0x00,0x00,0x00,0xB5,0x00,0x00,0x00,0x8D +,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x23,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x13,0x00,0x00,0x00,0xFE,0x05,0x41,0x4E,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0E,0xB0,0xD2,0xFF,0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0xAD,0xA9 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0xEB,0x02,0x1F +,0x25,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x47,0x55,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x28,0x9F,0xFF,0xFF,0xFF,0x00,0x92,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0xCA,0x01,0x08,0x0A,0xFE,0x0E,0xB7,0xDA,0xFF,0x8F,0x0F +,0xBF,0xE4,0xFF,0x02,0x09,0x72,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x61,0x95,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0xD3 +,0x01,0x07,0x08,0xFE,0x0E,0xAD,0xCF,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0C +,0x9C,0xBA,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA3,0x88,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0xFF,0x06,0x4F,0x5F,0xFF,0x91 +,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x45,0xFF,0x00,0x01,0x01,0xFB,0x00,0x00 +,0x00,0x12,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00 +,0xFF,0x0A,0x84,0x9D,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x85,0x9F,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x74,0x99,0xFF,0xFF,0xFF,0x00,0x03,0x00 +,0x00,0x00,0x0D,0x00,0x01,0x02,0xF1,0x03,0x20,0x27,0xFE,0x0F,0xBE,0xE3,0xFF +,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x21,0x28,0xFE,0x00,0x01,0x01,0xED,0x00 +,0x00,0x00,0x04,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x22,0x00,0x00 +,0x00,0xFF,0x05,0x44,0x51,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD5 +,0xFF,0x00,0x03,0x04,0xFE,0x00,0x00,0x00,0xB5,0x85,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0xA2,0x00,0x00,0x00,0xFF,0x0D,0xAA,0xCB,0xFF,0x8F,0x0F,0xBF +,0xE4,0xFF,0x00,0x0B,0x8E,0xAA,0xFF,0xA6,0x05,0x3B,0x47,0xFF,0x02,0x04,0x39 +,0x44,0xFF,0x02,0x20,0x26,0xFE,0x00,0x05,0x05,0xFE,0x81,0x00,0x00,0x00,0xFF +,0x01,0x00,0x01,0x01,0xF8,0x00,0x00,0x00,0x6A,0x85,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0xCE,0x01,0x0F,0x12,0xFE,0x0F,0xBE,0xE3,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x04,0x2F,0x38,0xFF,0x00,0x01,0x01,0xF6,0x00,0x00,0x00,0x09 +,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xFF,0x0C +,0x9D,0xBB,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA6,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x83,0x9F,0xFF,0xFF,0xFF,0x00,0x92,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0xFF,0x09,0x78,0x8F,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB1,0xD3,0xFF,0x00,0x03,0x04,0xFE,0x00,0x00 +,0x00,0xBB,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4F,0x00,0x00,0x00 +,0xFF,0x06,0x51,0x61,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x2B,0x34,0xFF +,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0x0B,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x01,0x01,0xDA,0x01,0x0E,0x11,0xFE,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0A,0x7E,0x96,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x67,0x97 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xFF,0x05,0x46 +,0x53,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBB,0xDF,0xFF,0x01,0x0B,0x0D +,0xFD,0x00,0x00,0x00,0xCB,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x86 +,0x00,0x00,0x00,0xFF,0x0B,0x87,0xA1,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x08 +,0x61,0x73,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x44,0x88,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0xC7,0x01,0x07,0x09,0xFE,0x0E,0xB8,0xDB,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x37,0x42,0xFF,0x00,0x01,0x01,0xFB,0x00,0x00 +,0x00,0x11,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x58,0x00,0x00,0x00 +,0xFF,0x09,0x73,0x89,0xFF,0xB9,0x0F,0xBF,0xE4,0xFF,0x05,0x0F,0xBE,0xE2,0xFF +,0x0D,0xA6,0xC6,0xFF,0x0A,0x82,0x9B,0xFF,0x02,0x19,0x1E,0xFE,0x00,0x00,0x00 +,0xFD,0x00,0x00,0x00,0x2E,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x8B +,0x00,0x00,0x00,0xFF,0x0C,0x9A,0xB8,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08 +,0x6B,0x80,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4E,0xA9,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFF,0x07,0x5B,0x6C,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBD,0xE1,0xFF,0x01,0x12,0x15,0xFE,0x00,0x01 +,0x01,0xDE,0x9F,0xFF,0xFF,0xFF,0x00,0x92,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x11,0x00,0x01,0x01,0xF9,0x04,0x30,0x39,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x04,0x38,0x43,0xFF,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x18,0x96,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC9,0x00,0x04,0x05,0xFE,0x0D,0xA8,0xC8 +,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6F,0x84,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x5A,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7E,0x00 +,0x00,0x00,0xFF,0x0B,0x88,0xA2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB8 +,0xDC,0xFF,0x01,0x09,0x0A,0xFE,0x00,0x00,0x00,0xC2,0x98,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0xCC,0x01,0x0A,0x0C,0xFE,0x0F,0xBB,0xDF,0xFF,0x8E,0x0F +,0xBF,0xE4,0xFF,0x02,0x06,0x49,0x57,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x22,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x18,0x00,0x01,0x01,0xF9 +,0x04,0x2E,0x37,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA0,0xBE,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x98,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x6C,0x00,0x00,0x00,0xFF,0x0A,0x7C,0x94,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x09,0x79,0x90,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x63,0x84,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xFD,0x05,0x3B,0x47 +,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9A,0xB8,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0xA5,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x3A,0x00 +,0x00,0x00,0xFF,0x07,0x5B,0x6D,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA7 +,0xC7,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9F,0xA9,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xE5,0x02,0x18,0x1D,0xFE,0x91,0x0F +,0xBF,0xE4,0xFF,0x02,0x07,0x54,0x64,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x39,0x9E,0xFF,0xFF,0xFF,0x00,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0xA9,0x00,0x01,0x01,0xFF,0x0D,0xA6,0xC6,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0A,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6E,0x96,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xFF,0x06,0x4A,0x59,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAF,0xD0,0xFF,0x00,0x02,0x03,0xFE,0x00 +,0x00,0x00,0xB5,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00 +,0x00,0xFF,0x05,0x43,0x50,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x46,0x54 +,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1E,0x97,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xFF,0x0B,0x88,0xA3,0xFF,0x8E,0x0F,0xBF +,0xE4,0xFF,0x02,0x0B,0x8B,0xA5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x79 +,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0xFF,0x0D +,0xA5,0xC5,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x1E,0x24,0xFE,0x00,0x01 +,0x01,0xEA,0x00,0x00,0x00,0x03,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x16,0x00,0x01,0x01,0xFC,0x04,0x39,0x44,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0E,0xB4,0xD7,0xFF,0x00,0x05,0x05,0xFE,0x00,0x00,0x00,0xBA,0x85,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0xC5,0x01,0x07,0x09,0xFE,0x0F,0xBB,0xDF,0xFF +,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x2E,0x36,0xFF,0x00,0x01,0x01,0xF8,0x00 +,0x00,0x00,0x10,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x01 +,0x01,0xE3,0x02,0x1A,0x1F,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x23,0x2A +,0xFE,0x00,0x01,0x01,0xED,0x00,0x00,0x00,0x06,0xA9,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xFF,0x0C,0x96,0xB3,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x0C,0x98,0xB6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x94 +,0x9E,0xFF,0xFF,0xFF,0x00,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x49 +,0x00,0x00,0x00,0xFF,0x07,0x5F,0x72,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E +,0xB7,0xDA,0xFF,0x01,0x07,0x08,0xFE,0x00,0x00,0x01,0xC7,0x97,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0xC6,0x01,0x07,0x08,0xFE,0x0E,0xB5,0xD8,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x36,0x40,0xFF,0x00,0x00,0x01,0xFC,0x00,0x00 +,0x00,0x14,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC9,0x01,0x07,0x09 +,0xFE,0x0E,0xB7,0xDA,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA5,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x78,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x25,0x00,0x00,0x00,0xFF,0x06,0x49,0x58,0xFF,0x8E,0x0F,0xBF,0xE4 +,0xFF,0x03,0x0F,0xBD,0xE1,0xFF,0x01,0x0F,0x11,0xFD,0x00,0x01,0x01,0xD6,0x00 +,0x00,0x00,0x01,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x43,0x00,0x00 +,0x00,0xFF,0x08,0x61,0x74,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5E,0x70 +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x41,0x88,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0xB7,0x00,0x03,0x04,0xFE,0x0E,0xB1,0xD3,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x05,0x3A,0x46,0xFF,0x00,0x01,0x01,0xFC,0x00,0x00,0x00,0x14 +,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7B,0x00,0x00,0x00,0xFF,0x0B +,0x8B,0xA6,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x78,0x8F,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x6A,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x8E,0x00,0x00,0x00,0xFF,0x0C,0x9A,0xB7,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x08,0x68,0x7C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x5C,0xA9,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0xFF,0x07,0x53,0x63,0xFF +,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x1D,0x22,0xFE,0x00,0x01,0x01,0xEB,0x00 +,0x00,0x00,0x04,0x9D,0xFF,0xFF,0xFF,0x00,0x93,0xFF,0xFF,0xFF,0x00,0x03,0x00 +,0x00,0x00,0x03,0x00,0x01,0x01,0xE6,0x02,0x18,0x1C,0xFE,0x0F,0xBE,0xE3,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x42,0x4F,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x22,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x62,0x00,0x00 +,0x00,0xFF,0x09,0x74,0x8B,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x79,0x90 +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6A,0x88,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x6F,0x00,0x00,0x00,0xFF,0x0A,0x7C,0x94,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x0F,0xBD,0xE1,0xFF,0x01,0x10,0x13,0xFD,0x00,0x01,0x01,0xD3 +,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x01,0xD2,0x01,0x0D,0x10,0xFD,0x0F +,0xBC,0xE0,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x59,0x6A,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x4B,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x03,0x00,0x01,0x02,0xE9,0x02,0x1E,0x24,0xFE,0x8E,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0C,0x9D,0xBB,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x95,0x88,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xFF,0x09,0x70,0x86,0xFF +,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x67,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2A,0x00,0x00 +,0x00,0xFF,0x05,0x44,0x51,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB8,0xDB +,0xFF,0x01,0x09,0x0B,0xFE,0x00,0x01,0x01,0xCE,0x84,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xFF,0x07,0x59,0x6A,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x0E,0xB2,0xD5,0xFF,0x01,0x07,0x08,0xFE,0x00,0x00,0x00,0xCB +,0xAA,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xDD,0x01,0x12,0x15,0xFE,0x0F +,0xBE,0xE2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x61,0x74,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x49,0x9D,0xFF,0xFF,0xFF,0x00,0x94,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0xFF,0x0B,0x8F,0xAB,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x85,0x9F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x7B,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x01,0x01 +,0xF5,0x03,0x2B,0x34,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5,0xD8,0xFF +,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xC5,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x17,0x00,0x00,0x01,0xFD,0x04,0x38,0x43,0xFF,0x91,0x0F,0xBF,0xE4 +,0xFF,0x02,0x07,0x53,0x63,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2D,0x97 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xFF,0x0A,0x7D +,0x95,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAD,0xCF,0xFF,0x00,0x04,0x05 +,0xFE,0x00,0x00,0x00,0xC4,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x92 +,0x00,0x00,0x00,0xFF,0x0C,0x9B,0xB9,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x02 +,0x1B,0x20,0xFE,0x00,0x01,0x01,0xE9,0x00,0x00,0x00,0x02,0x87,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x01,0x01,0xF6,0x04,0x2D,0x35,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB6,0xD9,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00 +,0x00,0xBE,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC2,0x00,0x04,0x05 +,0xFE,0x0E,0xB1,0xD3,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4C,0x5B,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x30,0x83,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x01,0x00,0x01,0x01,0xE2,0x02,0x19,0x1D,0xFE,0x91,0x0F,0xBF,0xE4 +,0xFF,0x02,0x06,0x4E,0x5D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3A,0xA9 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0xFF,0x0B,0x8E +,0xAA,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA5,0xC5,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0xA4,0x9D,0xFF,0xFF,0xFF,0x00,0x94,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0xFF,0x06,0x46,0x54,0xFF,0x8F,0x0F +,0xBF,0xE4,0xFF,0x02,0x0F,0xBB,0xE0,0xFF,0x01,0x0D,0x0F,0xFE,0x00,0x01,0x01 +,0xD5,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xFF +,0x0D,0xA3,0xC2,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x40,0x4C,0xFF,0x00 +,0x00,0x00,0xFE,0x00,0x00,0x00,0x20,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xB9,0x00,0x03,0x04,0xFE,0x0E,0xB0,0xD2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x88,0x97,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x13,0x00,0x01,0x01,0xF6,0x03,0x26,0x2E +,0xFE,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4C,0x5B,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x3D,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x39,0x00 +,0x00,0x00,0xFF,0x07,0x58,0x69,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5B +,0x6C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3D,0x88,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0xA6,0x00,0x01,0x01,0xFF,0x0D,0xA8,0xC8,0xFF,0x90,0x0F +,0xBF,0xE4,0xFF,0x02,0x05,0x3D,0x49,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00 +,0x18,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5A,0x00,0x00,0x00,0xFF +,0x08,0x69,0x7D,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB4,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x93,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x8C,0x00,0x00,0x00,0xFF,0x0C,0x98,0xB6,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x0D,0xA0,0xBF,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAA,0xA9,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5B +,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x2A,0x32,0xFF,0x00,0x01,0x01,0xF5 +,0x00,0x00,0x00,0x0B,0x9C,0xFF,0xFF,0xFF,0x00,0x95,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0xC7,0x01,0x07,0x09,0xFE,0x0E,0xB6,0xD9,0xFF,0x8F,0x0F,0xBF +,0xE4,0xFF,0x02,0x06,0x4C,0x5B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2E +,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF,0x07 +,0x5B,0x6C,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x83,0x9C,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x76,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x5F,0x00,0x00,0x00,0xFF,0x09,0x70,0x86,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02 +,0x02,0x1B,0x20,0xFE,0x00,0x01,0x02,0xE3,0x00,0x00,0x00,0x01,0x97,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0xFF,0x0B,0x91,0xAD,0xFF +,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA4,0xC4,0xFF,0x00,0x01,0x01,0xFF,0x00 +,0x00,0x00,0xB5,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xE0,0x02,0x15 +,0x19,0xFE,0x0F,0xBE,0xE3,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9A,0xB7 +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x91,0x88,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0xFF,0x08,0x64,0x78,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x0A,0x7F,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6B +,0x84,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x01,0x01,0xEB,0x02 +,0x1B,0x20,0xFE,0x0F,0xBE,0xE3,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x21 +,0x28,0xFE,0x00,0x01,0x01,0xF0,0x00,0x00,0x00,0x06,0x83,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0xFF,0x07,0x58,0x69,0xFF,0x91,0x0F +,0xBF,0xE4,0xFF,0x02,0x04,0x34,0x3F,0xFF,0x00,0x01,0x01,0xFC,0x00,0x00,0x00 +,0x1D,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD4,0x01,0x0C,0x0F,0xFE +,0x0F,0xBB,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6E,0x83,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x5A,0x9C,0xFF,0xFF,0xFF,0x00,0x95,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0xFF,0x09,0x76,0x8D,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8F,0xAB,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x87,0x96,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01 +,0x01,0xDE,0x02,0x13,0x17,0xFE,0x0F,0xBD,0xE1,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF +,0x02,0x0F,0xBB,0xE0,0xFF,0x01,0x09,0x0B,0xFD,0x00,0x00,0x00,0xBF,0x88,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0D,0x00,0x01,0x01,0xF7,0x03,0x2C,0x35 +,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5F,0x72,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x3E,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x23,0x00 +,0x00,0x00,0xFD,0x05,0x3A,0x45,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x40 +,0x4C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2F,0x99,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0xFF,0x0C,0x9D,0xBB,0xFF,0x8E,0x0F +,0xBF,0xE4,0xFF,0x02,0x02,0x19,0x1E,0xFE,0x00,0x01,0x02,0xE6,0x00,0x00,0x00 +,0x01,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x01,0x01,0xED +,0x03,0x20,0x27,0xFE,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB8,0xDB,0xFF,0x01 +,0x07,0x09,0xFE,0x00,0x00,0x00,0xC2,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0xFF,0x0B,0x8E,0xA9,0xFF,0xBC,0x0F,0xBF,0xE4,0xFF +,0x02,0x08,0x64,0x77,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x42,0x84,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xDD,0x01,0x0F,0x12,0xFD,0x0F,0xBB,0xDF +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x88,0xA2,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x88,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7A,0x00 +,0x00,0x00,0xFF,0x0B,0x88,0xA2,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAF +,0xD0,0xFF,0x00,0x02,0x03,0xFE,0x00,0x00,0x00,0xB5,0x9C,0xFF,0xFF,0xFF,0x00 +,0x95,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0F,0x00,0x01,0x01,0xF8,0x04 +,0x2E,0x36,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x02,0x14 +,0x17,0xFE,0x00,0x01,0x01,0xE1,0x00,0x00,0x00,0x01,0x96,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,0xFF,0x0B,0x89,0xA4,0xFF,0x8F,0x0F +,0xBF,0xE4,0xFF,0x02,0x05,0x3C,0x48,0xFF,0x00,0x01,0x01,0xFB,0x00,0x00,0x00 +,0x0C,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAA,0x00,0x01,0x01,0xFF +,0x0D,0xA8,0xC8,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA3,0xC3,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x99,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xAD,0x00,0x01,0x01,0xFF,0x0D,0xA2,0xC1,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF +,0x02,0x0C,0x99,0xB6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA6,0x99,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0xFF,0x08,0x6C,0x81 +,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x58,0x6A,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x34,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x96,0x00 +,0x00,0x00,0xFF,0x0C,0x9D,0xBB,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x41 +,0x4E,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x1B,0x84,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xFE,0x05,0x40,0x4C,0xFF,0xBC,0x0F +,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x87,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0xFF +,0x0A,0x7E,0x96,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x02 +,0x1C,0x21,0xFE,0x00,0x01,0x01,0xEE,0x00,0x00,0x00,0x09,0xA8,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xFF,0x05,0x45,0x52,0xFF,0x91 +,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x37,0x41,0xFF,0x00,0x01,0x01,0xFC,0x00,0x00 +,0x00,0x15,0x9B,0xFF,0xFF,0xFF,0x00,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xA6,0x00,0x00,0x00,0xFF,0x0D,0xA5,0xC5,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF +,0x02,0x07,0x56,0x67,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3A,0x96,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0xFF,0x06,0x4D,0x5C +,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x70,0x86,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x4F,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4F,0x00 +,0x00,0x00,0xFF,0x08,0x64,0x78,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x27 +,0x2F,0xFF,0x00,0x01,0x02,0xEF,0x00,0x00,0x00,0x06,0x97,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x3A,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5B,0xFF,0x8F,0x0F +,0xBF,0xE4,0xFF,0x02,0x04,0x33,0x3D,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00 +,0x23,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x01,0x01,0xFC +,0x05,0x3B,0x47,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA6,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x68,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x3B,0x00,0x00,0x00,0xFF,0x07,0x58,0x6A,0xFF,0x90,0x0F,0xBF,0xE4,0xFF +,0x02,0x0A,0x82,0x9B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x70,0x85,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB8,0x00,0x03,0x04,0xFE,0x0E,0xAE,0xCF +,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xB6,0xD9,0xFF,0x07,0x5C,0x6E,0xFF +,0x07,0x58,0x69,0xFF,0x07,0x54,0x64,0xFF,0x06,0x50,0x60,0xFF,0x97,0x06,0x4E +,0x5D,0xFF,0x00,0x0A,0x7A,0x92,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBE +,0xE2,0xFF,0x01,0x0C,0x0E,0xFE,0x00,0x00,0x00,0xCC,0x84,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x15,0x00,0x01,0x01,0xFA,0x04,0x2F,0x38,0xFF,0x91,0x0F +,0xBF,0xE4,0xFF,0x02,0x09,0x6E,0x83,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x66,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC9,0x01,0x09,0x0A,0xFE +,0x0E,0xB8,0xDC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7B,0x93,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x6B,0x9B,0xFF,0xFF,0xFF,0x00,0x96,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xFF,0x07,0x5E,0x70,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9A,0xB7,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x94,0x97,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x02,0xEA,0x03,0x26 +,0x2E,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA4,0xC4,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x97,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x06 +,0x00,0x01,0x01,0xEF,0x03,0x21,0x27,0xFE,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x08 +,0x6C,0x81,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4E,0x98,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x01,0xC6,0x00,0x05,0x06,0xFE,0x0E,0xAF,0xD1,0xFF,0x8E +,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8D,0xA8,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x98,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC8,0x01,0x0B,0x0D +,0xFE,0x0F,0xBE,0xE2,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB1,0xD3,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9B,0x88,0xFF,0xFF,0xFF,0x00,0x03,0x00 +,0x00,0x00,0x01,0x00,0x01,0x01,0xE0,0x02,0x15,0x19,0xFE,0x0F,0xBE,0xE3,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xB9,0xDD,0xFF,0x01,0x09,0x0B,0xFE,0x00 +,0x00,0x01,0xC7,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x50,0x00,0x00 +,0x00,0xFF,0x08,0x64,0x78,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x00,0x04,0x35,0x3F +,0xFF,0x9A,0x00,0x00,0x00,0xFF,0x00,0x02,0x1F,0x26,0xFE,0x8E,0x0F,0xBF,0xE4 +,0xFF,0x02,0x05,0x3F,0x4B,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x13,0x84 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0xFF,0x0D,0xA0 +,0xBF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB6,0xD9,0xFF,0x01,0x0A,0x0C +,0xFD,0x00,0x01,0x01,0xD5,0xA9,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x71 +,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E +,0xB7,0xDA,0xFF,0x01,0x07,0x08,0xFE,0x00,0x00,0x00,0xC6,0x9B,0xFF,0xFF,0xFF +,0x00,0x96,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0xE4 +,0x02,0x16,0x1A,0xFE,0x0F,0xBE,0xE3,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x02 +,0x1D,0x22,0xFE,0x00,0x01,0x02,0xEB,0x00,0x00,0x00,0x03,0x96,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0xB1,0x00,0x04,0x05,0xFE,0x0F,0xBB,0xDF,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x18,0x1D,0xFE,0x00,0x01,0x01,0xE0,0x89,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9A,0x00,0x00,0x00,0xFF,0x0C,0x9D,0xBB +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAD,0xCF,0xFF,0x00,0x02,0x02,0xFE +,0x00,0x00,0x00,0xA9,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x52,0x00 +,0x00,0x00,0xFF,0x08,0x60,0x72,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x26 +,0x2E,0xFE,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x18,0x98,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0xFF,0x0C,0x9A,0xB7,0xFF,0x8E,0x0F +,0xBF,0xE4,0xFF,0x01,0x02,0x16,0x1B,0xFE,0x00,0x00,0x00,0xCD,0x89,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0xFF,0x0B,0x91,0xAD,0xFF +,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x44,0x51,0xFF,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x1E,0x84,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x01 +,0x01,0xE5,0x02,0x17,0x1B,0xFD,0x0F,0xBE,0xE2,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF +,0x04,0x0B,0x92,0xAE,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xB7,0x00,0x00 +,0x00,0x1B,0x00,0x00,0x00,0x18,0x95,0x00,0x00,0x00,0x17,0x02,0x00,0x00,0x00 +,0x9E,0x00,0x00,0x00,0xFF,0x0D,0xA6,0xC6,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02 +,0x09,0x72,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x55,0x84,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF,0x06,0x52,0x62,0xFF +,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x55,0x65,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x49,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1B,0x00,0x00 +,0x00,0xFD,0x05,0x3E,0x4A,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x43,0x50 +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x21,0x9A,0xFF,0xFF,0xFF,0x00,0x97 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0xFF,0x0B,0x8D +,0xA8,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x60,0x72,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x47,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x84 +,0x00,0x00,0x00,0xFF,0x0C,0x9F,0xBE,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x06 +,0x4D,0x5C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x27,0x88,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xFF,0x07,0x59,0x6A,0xFF,0x91 +,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x34,0x3F,0xFF,0x00,0x01,0x01,0xF7,0x00,0x00 +,0x00,0x0D,0x97,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x01,0x01 +,0xDD,0x01,0x0E,0x10,0xFD,0x0E,0xB3,0xD6,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0A,0x80,0x99,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x95,0x98,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0xFF,0x08,0x6A,0x7E,0xFF +,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3D,0x49,0xFF,0x00,0x01,0x01,0xFA,0x00 +,0x00,0x00,0x06,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2B,0x00,0x00 +,0x00,0xFF,0x06,0x4C,0x5B,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x85,0x9F +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x74,0x85,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xFF,0x0B,0x88,0xA3,0xFF,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x04,0x2E,0x37,0xFF,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x24 +,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4B,0x00,0x00,0x00,0xFF,0x09 +,0x6D,0x82,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA6,0xC6,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x9A,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01 +,0xD8,0x01,0x0B,0x0D,0xFE,0x0E,0xB8,0xDB,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03 +,0x0D,0xAA,0xCB,0xFF,0x00,0x06,0x07,0xFE,0x00,0x01,0x01,0xD3,0x00,0x00,0x00 +,0x03,0xA8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC0,0x00,0x05,0x06,0xFE +,0x0E,0xB5,0xD8,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x88,0xA2,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x7B,0x9A,0xFF,0xFF,0xFF,0x00,0x97,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0xFF,0x05,0x45,0x52,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA3,0xC3,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0xA0,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00 +,0x00,0xFF,0x0C,0x9B,0xB9,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x82,0x9B +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6E,0x88,0xFF,0xFF,0xFF,0x00,0x03 +,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xE4,0x02,0x16,0x1A,0xFE,0x0F,0xBE,0xE3 +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x78,0x8F,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x5F,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x57,0x00 +,0x00,0x00,0xFF,0x06,0x51,0x61,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE +,0xE3,0xFF,0x04,0x2D,0x35,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x32,0x97 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xFF,0x06,0x4D +,0x5C,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x63,0x76,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x32,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xD1 +,0x01,0x0C,0x0F,0xFD,0x0F,0xBB,0xDF,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F +,0xBB,0xDF,0xFF,0x01,0x0A,0x0C,0xFE,0x00,0x01,0x01,0xCC,0x85,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x1B,0x00,0x01,0x01,0xFC,0x05,0x3B,0x47,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x9C,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x01,0x01 +,0xF6,0x04,0x33,0x3D,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x19,0x1E,0xFE +,0x00,0x01,0x01,0xE0,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x70,0x00 +,0x00,0x00,0xFF,0x09,0x76,0x8D,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5C +,0x6E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x66,0xA8,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xFF,0x0A,0x79,0x91,0xFF,0x90,0x0F +,0xBF,0xE4,0xFF,0x02,0x0F,0xBC,0xE0,0xFF,0x01,0x0E,0x11,0xFE,0x00,0x01,0x01 +,0xD7,0x9A,0xFF,0xFF,0xFF,0x00,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0xC5,0x01,0x07,0x08,0xFE,0x0E,0xB5,0xD7,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02 +,0x03,0x27,0x2E,0xFF,0x00,0x01,0x02,0xF3,0x00,0x00,0x00,0x08,0x95,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xFF,0x0C,0x9B,0xB9,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB1,0xD3,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0xA4,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x8A,0x00,0x00 +,0x00,0xFF,0x0B,0x91,0xAD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5,0xD8 +,0xFF,0x00,0x06,0x07,0xFE,0x00,0x00,0x00,0xBA,0x99,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0xBE,0x00,0x02,0x02,0xFE,0x0C,0x9C,0xBA,0xFF,0x8E,0x0F,0xBF +,0xE4,0xFF,0x03,0x0C,0x9D,0xBC,0xFF,0x00,0x02,0x03,0xFE,0x00,0x00,0x00,0xC8 +,0x00,0x00,0x00,0x01,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x01,0x00 +,0x01,0x01,0xF9,0x04,0x36,0x40,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x88 +,0xA3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x65,0x89,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0xFF,0x0A,0x85,0x9E,0xFF,0x90,0x0F +,0xBF,0xE4,0xFF,0x02,0x06,0x47,0x55,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x22,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAE,0x00,0x01,0x01,0xFF +,0x0C,0x9F,0xBE,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x27,0x2E,0xFF,0x00 +,0x01,0x01,0xFB,0x00,0x00,0x00,0x1D,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xB0,0x00,0x03,0x04,0xFE,0x0E,0xB5,0xD7,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF +,0x02,0x06,0x4D,0x5C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x24,0x84,0xFF +,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x11,0x00,0x01,0x01,0xF7,0x03,0x21,0x28 +,0xFE,0x0F,0xBE,0xE3,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB5,0xD8,0xFF +,0x01,0x0F,0x12,0xFD,0x00,0x01,0x01,0xEA,0x00,0x00,0x00,0x0D,0xA7,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x14,0x00,0x01,0x01,0xFC,0x04,0x37,0x41,0xFF +,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x50,0x60,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x31,0x99,0xFF,0xFF,0xFF,0x00,0x98,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x65,0x00,0x00,0x00,0xFF,0x09,0x74,0x8B,0xFF,0x8F,0x0F,0xBF,0xE4 +,0xFF,0x02,0x08,0x6A,0x7E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x54,0x95 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9E,0x00,0x00,0x00,0xFF,0x0D,0xAB +,0xCC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x15,0x19,0xFE,0x00,0x00,0x01 +,0xD4,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0xFF +,0x06,0x4D,0x5C,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x40,0x4D,0xFF,0x00 +,0x00,0x01,0xFD,0x00,0x00,0x00,0x18,0x98,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 +,0x00,0x2B,0x00,0x01,0x01,0xFC,0x03,0x2C,0x34,0xFF,0x0F,0xBE,0xE3,0xFF,0x8E +,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x56,0x67,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x64,0x97,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xDD,0x02,0x1F,0x25 +,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xAF,0xD0,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x97,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1C,0x00 +,0x00,0x00,0xFE,0x05,0x41,0x4E,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x88 +,0xA3,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x78,0x85,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xFE,0x05,0x3A,0x45,0xFF,0x90,0x0F +,0xBF,0xE4,0xFF,0x02,0x0A,0x83,0x9C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x93,0x96,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xFF +,0x0A,0x82,0x9C,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x81,0x9A,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x69,0x85,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x8E,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x91,0x0F,0xBF,0xE4,0xFF +,0x02,0x09,0x71,0x87,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x87,0xA8,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB7,0x00,0x02,0x03,0xFE,0x0E,0xB1,0xD3 +,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x94,0xB1,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x8C,0x99,0xFF,0xFF,0xFF,0x00,0x98,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x0E,0x00,0x01,0x01,0xF7,0x03,0x2C,0x35,0xFF,0x8F,0x0F,0xBF +,0xE4,0xFF,0x02,0x0D,0xAC,0xCD,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAD +,0x94,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x02,0x02,0xED,0x03 +,0x24,0x2C,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x46,0xFF,0x00,0x00 +,0x01,0xFC,0x00,0x00,0x00,0x07,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01 +,0xD6,0x01,0x0C,0x0F,0xFE,0x0F,0xBB,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0A,0x85,0x9E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6F,0x99,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0xFF,0x09,0x79,0x90,0xFF +,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB6,0xD9,0xFF,0x02,0x13,0x17,0xFE,0x00 +,0x01,0x02,0xEE,0x00,0x00,0x00,0x1E,0x96,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0xBD,0x01,0x07,0x09,0xFE,0x8F,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x13,0x17 +,0xFD,0x00,0x00,0x00,0xCA,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC0 +,0x00,0x06,0x07,0xFE,0x0E,0xB5,0xD8,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F +,0xBB,0xE0,0xFF,0x01,0x0D,0x0F,0xFE,0x00,0x01,0x01,0xD0,0x86,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0xFF,0x0B,0x91,0xAD,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x03,0x20,0x26,0xFE,0x00,0x01 +,0x01,0xF8,0x00,0x00,0x00,0x2A,0x95,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x39,0x00,0x00,0x00,0xFF,0x08,0x6A,0x7F,0xFF,0x8D,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0E,0xB2,0xD5,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xAE,0x85,0xFF,0xFF +,0xFF,0x00,0x03,0x00,0x00,0x00,0x17,0x00,0x01,0x01,0xF6,0x03,0x21,0x28,0xFE +,0x0F,0xBE,0xE3,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBD,0xE1,0xFF,0x03 +,0x20,0x27,0xFE,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0x31,0xA7,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x5E,0x00,0x00,0x00,0xFF,0x09,0x72,0x88,0xFF,0x91 +,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x18,0x1D,0xFE,0x00,0x01,0x01,0xE6,0x00,0x00 +,0x00,0x02,0x98,0xFF,0xFF,0xFF,0x00,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xA4,0x00,0x00,0x00,0xFF,0x0D,0xA3,0xC3,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF +,0x02,0x04,0x31,0x3A,0xFF,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x0F,0x93,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xFF,0x08,0x61,0x74 +,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5E,0x71,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x32,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x7B,0x00 +,0x00,0x00,0xFF,0x0A,0x85,0x9F,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBB +,0xDF,0xFF,0x01,0x0C,0x0F,0xFD,0x00,0x01,0x01,0xD1,0x00,0x00,0x00,0x01,0x98 +,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0E,0x00,0x01,0x02,0xE9,0x01,0x10 +,0x13,0xFD,0x0E,0xB5,0xD7,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0A,0x84,0x9D +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x06,0x95,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0xFF,0x0E,0xB2,0xD5 +,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x46,0xFF,0x00,0x01,0x01,0xF8 +,0x00,0x00,0x00,0x04,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x65,0x00 +,0x00,0x00,0xFF,0x09,0x79,0x90,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4A +,0x59,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x26,0x85,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x22,0x00,0x01,0x01,0xFA,0x03,0x2A,0x32,0xFE,0x90,0x0F +,0xBF,0xE4,0xFF,0x03,0x0B,0x92,0xAE,0xFF,0x00,0x02,0x03,0xFE,0x00,0x01,0x01 +,0xD6,0x00,0x00,0x00,0x0A,0x94,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x21 +,0x00,0x00,0x00,0xFF,0x07,0x5A,0x6B,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x01,0x03 +,0x28,0x30,0xFF,0x00,0x01,0x01,0xEF,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x8B,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x91,0x0F,0xBF,0xE4,0xFF +,0x03,0x0C,0x9B,0xB9,0xFF,0x00,0x04,0x04,0xFE,0x00,0x01,0x01,0xD6,0x00,0x00 +,0x00,0x08,0xA6,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0E,0x00,0x01,0x01 +,0xF8,0x04,0x30,0x39,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5D,0x6F,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x42,0x98,0xFF,0xFF,0xFF,0x00,0x99,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xFF,0x07,0x5B,0x6D +,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x74,0x8B,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x60,0x92,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0C,0x00 +,0x01,0x02,0xE3,0x01,0x0C,0x0E,0xFD,0x0E,0xAF,0xD1,0xFF,0x91,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0A,0x83,0x9C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x62,0x89 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0xFF,0x05,0x42 +,0x4F,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5A,0x6B,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x61,0x99,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5E +,0x00,0x00,0x00,0xFF,0x07,0x54,0x64,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x07 +,0x55,0x66,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x93,0x95,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0xAD,0x00,0x01,0x01,0xFF,0x0F,0xBB,0xDF,0xFF,0x8E +,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x60,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x2E,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x11,0x00,0x01,0x01 +,0xFA,0x04,0x35,0x3F,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8B,0xA6,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7D,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x91,0x00,0x00,0x00,0xFF,0x0A,0x82,0x9B,0xFF,0x90,0x0F,0xBF,0xE4 +,0xFF,0x02,0x08,0x65,0x79,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA0,0x94 +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0xFF,0x07,0x53 +,0x63,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4D,0x5C,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x11,0x85,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x15 +,0x00,0x01,0x01,0xF5,0x03,0x21,0x28,0xFE,0x0F,0xBE,0xE3,0xFF,0x91,0x0F,0xBF +,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8E +,0xA7,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xAD,0x00,0x01,0x01,0xFF,0x0D +,0xAC,0xCD,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA1,0xC0,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x9C,0x98,0xFF,0xFF,0xFF,0x00,0x99,0xFF,0xFF,0xFF +,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0xE2,0x02,0x14,0x18,0xFE,0x0F +,0xBE,0xE2,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD5,0xFF,0x00,0x04 +,0x05,0xFE,0x00,0x00,0x00,0xBA,0x91,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00 +,0x03,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0xFF,0x09,0x71,0x87,0xFF,0x92,0x0F +,0xBF,0xE4,0xFF,0x02,0x0D,0xA6,0xC6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x8F,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC6,0x01,0x07,0x08,0xFE +,0x0E,0xB6,0xD9,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB5,0xD8,0xFF,0x01 +,0x10,0x13,0xFD,0x00,0x01,0x02,0xEB,0x00,0x00,0x00,0x0F,0x98,0xFF,0xFF,0xFF +,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xC4,0x00,0x02,0x03,0xFE,0x0C +,0x9E,0xBD,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBC,0xE0,0xFF,0x04,0x2E +,0x36,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x57,0x94,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0xC9,0x01,0x13,0x16,0xFE,0x8F,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0A,0x7F,0x97,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x59,0x8A,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0xAF,0x00,0x02,0x02,0xFE,0x0E,0xAE,0xCF,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBD,0xE1,0xFF,0x01,0x0F,0x12,0xFE,0x00 +,0x01,0x01,0xD5,0x86,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x15,0x00,0x01 +,0x01,0xF3,0x02,0x1C,0x22,0xFD,0x0F,0xBC,0xE0,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF +,0x03,0x0F,0xBE,0xE3,0xFF,0x04,0x36,0x40,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x60,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x45,0x00,0x00,0x00 +,0xFF,0x09,0x6F,0x84,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x65,0x79,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x31,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x87,0x00,0x00,0x00,0xFF,0x0A,0x80,0x99,0xFF,0x91,0x0F,0xBF,0xE4 +,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x04,0x2D,0x35,0xFF,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x57,0xA6,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x55,0x00,0x00 +,0x00,0xFF,0x08,0x6B,0x80,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x26,0x2D +,0xFE,0x00,0x01,0x01,0xF2,0x00,0x00,0x00,0x09,0x97,0xFF,0xFF,0xFF,0x00,0x9A +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0xFF,0x0B,0x8B +,0xA5,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3A,0x46,0xFF,0x00,0x00,0x01 +,0xFD,0x00,0x00,0x00,0x17,0x8F,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x0A +,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0xFF,0x05,0x3F,0x4B,0xFF,0x0F,0xBE,0xE2 +,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBB,0xE0,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0xA7,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x6B,0x00 +,0x00,0x00,0xFF,0x0A,0x7A,0x92,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x03,0x09,0x73 +,0x8A,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0x0B,0x98 +,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x01,0xFD,0x03,0x27 +,0x2F,0xFE,0x0F,0xBA,0xDE,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xAC,0xCE +,0xFF,0x01,0x11,0x14,0xFD,0x00,0x01,0x01,0xF7,0x00,0x00,0x00,0x51,0x93,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x02,0x02,0xE8,0x03,0x2A,0x32,0xFF,0x8F,0x0F,0xBF +,0xE4,0xFF,0x02,0x0A,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x56 +,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0xFF,0x09 +,0x6D,0x82,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4E,0x5D,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x2A,0x86,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x7D,0x00,0x00,0x00,0xFF,0x09,0x72,0x88,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03 +,0x0E,0xB0,0xD2,0xFF,0x01,0x13,0x17,0xFD,0x00,0x01,0x01,0xF6,0x00,0x00,0x00 +,0x2E,0x92,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x8A,0x00,0x00,0x00,0xFF +,0x0B,0x90,0xAC,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7C,0x94,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x50,0x86,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 +,0x00,0x13,0x00,0x01,0x02,0xF4,0x03,0x21,0x28,0xFE,0x0F,0xBE,0xE2,0xFF,0x91 +,0x0F,0xBF,0xE4,0xFF,0x04,0x0D,0xA6,0xC6,0xFF,0x01,0x0D,0x10,0xFD,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x8C,0x00,0x00,0x00,0x04,0xA4,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x09,0x00,0x01,0x01,0xF4,0x03,0x28,0x30,0xFF,0x91,0x0F +,0xBF,0xE4,0xFF,0x02,0x09,0x6E,0x83,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x83,0x97,0xFF,0xFF,0xFF,0x00,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x24,0x00,0x00,0x00,0xFF,0x05,0x43,0x50,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0A,0x7E,0x96,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6D,0x8D,0xFF,0xFF +,0xFF,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x4C,0x00,0x01,0x02,0xE1 +,0x00,0x00,0x00,0xFF,0x05,0x3F,0x4B,0xFF,0x0F,0xBC,0xE0,0xFF,0x94,0x0F,0xBF +,0xE4,0xFF,0x01,0x01,0x09,0x0B,0xFD,0x00,0x00,0x00,0xBB,0x8A,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x15,0x00,0x01,0x01,0xFC,0x04,0x36,0x40,0xFF,0x91 +,0x0F,0xBF,0xE4,0xFF,0x04,0x0F,0xBE,0xE2,0xFF,0x06,0x4C,0x5A,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x01,0x01,0xD2,0x00,0x00,0x00,0x48,0x98,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5A,0xFF,0x8F,0x0F +,0xBF,0xE4,0xFF,0x03,0x0C,0x98,0xB6,0xFF,0x01,0x0F,0x11,0xFD,0x00,0x00,0x00 +,0xFD,0x00,0x00,0x00,0x6D,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1D +,0x00,0x00,0x00,0xFD,0x05,0x40,0x4D,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09 +,0x76,0x8C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4D,0x8A,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x01,0x01,0xF2,0x03,0x29,0x31,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x8E,0xAA,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x81,0x86,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0B,0x00,0x01,0x01 +,0xE8,0x01,0x11,0x15,0xFD,0x0E,0xB7,0xDA,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x03 +,0x0B,0x91,0xAD,0xFF,0x00,0x02,0x02,0xFE,0x00,0x01,0x01,0xF2,0x00,0x00,0x00 +,0x4B,0x90,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x24,0x00,0x01,0x01,0xF9 +,0x03,0x25,0x2C,0xFE,0x0F,0xBE,0xE3,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x02,0x0C +,0x94,0xB1,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x70,0x87,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0xFF,0x09,0x6D,0x83,0xFF,0x92 +,0x0F,0xBF,0xE4,0xFF,0x08,0x0D,0xA7,0xC7,0xFF,0x03,0x27,0x2F,0xFE,0x00,0x00 +,0x00,0xFF,0x00,0x01,0x01,0xE0,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x3D,0x00 +,0x00,0x00,0x2B,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x09,0xA0,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0xFF,0x0D,0xA6,0xC6,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x05,0x0E,0xB6,0xD9,0xFF,0x03,0x23,0x2A,0xFE,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x2F,0x00,0x00,0x00,0x0C,0x94 +,0xFF,0xFF,0xFF,0x00,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xC2,0x00 +,0x05,0x06,0xFE,0x0E,0xB4,0xD7,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xB8 +,0xDB,0xFF,0x01,0x08,0x0A,0xFE,0x00,0x01,0x01,0xCC,0x00,0x00,0x00,0x22,0x00 +,0x00,0x00,0x04,0x88,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x00 +,0x00,0x4C,0x00,0x00,0x00,0x9C,0x00,0x01,0x01,0xEA,0x00,0x00,0x00,0xFF,0x01 +,0x09,0x0B,0xFD,0x09,0x70,0x86,0xFF,0x0F,0xBE,0xE3,0xFF,0x95,0x0F,0xBF,0xE4 +,0xFF,0x01,0x02,0x18,0x1D,0xFE,0x00,0x00,0x00,0xD0,0x8B,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0xB6,0x00,0x02,0x03,0xFE,0x0E,0xAF,0xD0,0xFF,0x92,0x0F +,0xBF,0xE4,0xFF,0x07,0x08,0x65,0x79,0xFF,0x00,0x03,0x04,0xFE,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x01,0xC7,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x5C,0x00,0x00 +,0x00,0x43,0x00,0x00,0x00,0x31,0x8C,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00 +,0x1B,0x85,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xB6 +,0x00,0x00,0x00,0xFF,0x09,0x73,0x8A,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x04,0x0D +,0xA5,0xC5,0xFF,0x02,0x1A,0x1F,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8B +,0x00,0x00,0x00,0x01,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB6,0x00 +,0x00,0x00,0xFF,0x0B,0x8A,0xA5,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6E +,0x83,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x44,0x8B,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0xFF,0x0D,0xA4,0xC4,0xFF,0x8F,0x0F +,0xBF,0xE4,0xFF,0x02,0x0F,0xBE,0xE2,0xFF,0x01,0x11,0x14,0xFE,0x00,0x01,0x01 +,0xD9,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xFF +,0x08,0x62,0x75,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x04,0x0B,0x8D,0xA8,0xFF,0x01 +,0x0D,0x10,0xFD,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x17 +,0x8D,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x38,0x00,0x01,0x01,0xE3,0x00 +,0x00,0x00,0xFF,0x0B,0x90,0xAC,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xAC +,0xCD,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8F,0x87,0xFF,0xFF,0xFF,0x00 +,0x03,0x00,0x00,0x00,0x0A,0x00,0x01,0x02,0xDE,0x01,0x07,0x09,0xFE,0x0D,0xA7 +,0xC7,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBB,0xDF,0xFF,0x07,0x5F,0x72 +,0xFF,0x02,0x16,0x1A,0xFE,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x01,0x01,0xF8 +,0x00,0x01,0x01,0xEA,0x90,0x00,0x01,0x01,0xE9,0x03,0x00,0x01,0x01,0xDA,0x00 +,0x00,0x00,0xA2,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x1F,0x83,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0xB1,0x84,0x00,0x01,0x01,0xE9,0x02,0x00,0x01,0x01 +,0xF3,0x00,0x00,0x00,0xFF,0x08,0x64,0x78,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x01 +,0x0E,0xAE,0xCF,0xFF,0x02,0x1F,0x25,0xFE,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x01,0x01,0xEF,0x88,0x00,0x01,0x01,0xE9,0x04,0x00,0x01,0x01,0xE8,0x00,0x00 +,0x00,0xD7,0x00,0x00,0x00,0xBA,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x1F,0x85 +,0xFF,0xFF,0xFF,0x00,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x62,0x00 +,0x00,0x00,0xFF,0x09,0x72,0x88,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x00,0x05,0x45 +,0x52,0xFF,0x81,0x00,0x00,0x00,0xFF,0x0A,0x00,0x00,0x01,0xFC,0x00,0x01,0x01 +,0xDD,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x74,0x00,0x00 +,0x00,0x72,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xA9,0x00 +,0x00,0x00,0xBD,0x00,0x01,0x01,0xF4,0x81,0x00,0x00,0x00,0xFF,0x02,0x03,0x21 +,0x28,0xFE,0x07,0x5E,0x71,0xFF,0x0D,0xAB,0xCC,0xFF,0x97,0x0F,0xBF,0xE4,0xFF +,0x01,0x03,0x28,0x2F,0xFF,0x00,0x01,0x01,0xE5,0x8B,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x5B,0x00,0x00,0x00,0xFF,0x09,0x6E,0x83,0xFF,0x93,0x0F,0xBF +,0xE4,0xFF,0x02,0x0D,0xA8,0xC8,0xFF,0x06,0x4E,0x5D,0xFF,0x00,0x04,0x05,0xFE +,0x91,0x00,0x00,0x00,0xFF,0x02,0x00,0x01,0x01,0xD0,0x00,0x00,0x00,0x80,0x00 +,0x00,0x00,0x14,0x83,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x11,0x00,0x01 +,0x02,0xDE,0x00,0x04,0x05,0xFE,0x0C,0x97,0xB4,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF +,0x05,0x0E,0xB0,0xD2,0xFF,0x03,0x2A,0x32,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01 +,0x01,0xC8,0x00,0x00,0x00,0x4F,0x00,0x00,0x00,0x01,0x8B,0xFF,0xFF,0xFF,0x00 +,0x03,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0xB3,0x00,0x00,0x00,0xFF,0x05,0x46 +,0x53,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x67,0x7B,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x3B,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x44 +,0x00,0x00,0x00,0xFF,0x08,0x61,0x73,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x06 +,0x51,0x61,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2F,0x86,0xFF,0xFF,0xFF +,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0xDA,0x01,0x09,0x0A,0xFD,0x0E +,0xAF,0xD1,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x06,0x0D,0xA8,0xC8,0xFF,0x03,0x28 +,0x30,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xF8,0x00,0x00,0x00,0x97,0x00 +,0x00,0x00,0x46,0x00,0x00,0x00,0x0C,0x87,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00 +,0x00,0x06,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x9A,0x00,0x01,0x01,0xFB,0x00 +,0x05,0x06,0xFE,0x09,0x73,0x8A,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBE +,0xE3,0xFF,0x00,0x02,0x02,0xFF,0x00,0x00,0x00,0xAE,0x88,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0xFF,0x04,0x34,0x3E,0xFF,0x94,0x0F +,0xBF,0xE4,0xFF,0x07,0x0F,0xBE,0xE3,0xFF,0x0C,0x93,0xAF,0xFF,0x08,0x67,0x7B +,0xFF,0x07,0x5B,0x6C,0xFF,0x06,0x4E,0x5D,0xFF,0x05,0x41,0x4E,0xFF,0x04,0x35 +,0x3F,0xFF,0x03,0x2B,0x33,0xFF,0x90,0x03,0x29,0x31,0xFF,0x05,0x02,0x1D,0x23 +,0xFE,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xFA,0x00,0x00 +,0x00,0x91,0x00,0x00,0x00,0x15,0x81,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x76,0x00,0x00,0x00,0xFF,0x02,0x19,0x1E,0xFF,0x84,0x03,0x29,0x31,0xFF,0x00 +,0x06,0x4B,0x59,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x04,0x0F,0xBE,0xE3,0xFF,0x0B +,0x8C,0xA7,0xFF,0x07,0x5C,0x6E,0xFF,0x05,0x43,0x50,0xFF,0x04,0x2D,0x36,0xFF +,0x89,0x03,0x29,0x31,0xFF,0x05,0x02,0x1B,0x21,0xFF,0x00,0x06,0x07,0xFE,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0x0F +,0x83,0xFF,0xFF,0xFF,0x00,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0D +,0x00,0x01,0x01,0xF6,0x03,0x2A,0x32,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x05,0x0D +,0xA6,0xC6,0xFF,0x09,0x6F,0x84,0xFF,0x07,0x55,0x65,0xFF,0x05,0x3B,0x47,0xFF +,0x03,0x21,0x28,0xFF,0x01,0x07,0x09,0xFE,0x85,0x00,0x00,0x00,0xFF,0x03,0x01 +,0x09,0x0B,0xFD,0x03,0x2A,0x33,0xFF,0x08,0x67,0x7B,0xFF,0x0D,0xA5,0xC5,0xFF +,0x9A,0x0F,0xBF,0xE4,0xFF,0x01,0x04,0x36,0x40,0xFF,0x00,0x01,0x01,0xF9,0x8B +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x01,0x01,0xF6,0x03,0x2A +,0x32,0xFF,0x95,0x0F,0xBF,0xE4,0xFF,0x04,0x0E,0xAF,0xD1,0xFF,0x0C,0x93,0xAF +,0xFF,0x0A,0x80,0x99,0xFF,0x09,0x6D,0x83,0xFF,0x08,0x60,0x72,0xFF,0x8C,0x07 +,0x5F,0x72,0xFF,0x04,0x05,0x43,0x50,0xFF,0x01,0x0C,0x0E,0xFE,0x00,0x00,0x00 +,0xFF,0x00,0x01,0x02,0xE8,0x00,0x00,0x00,0x45,0x83,0xFF,0xFF,0xFF,0x00,0x03 +,0x00,0x00,0x00,0x2F,0x00,0x01,0x01,0xF7,0x02,0x14,0x18,0xFD,0x0E,0xAF,0xD0 +,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x08,0x0E,0xB8,0xDC,0xFF,0x07,0x55,0x66,0xFF +,0x01,0x08,0x09,0xFD,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xD8,0x00,0x00,0x00 +,0x77,0x00,0x00,0x00,0x4B,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x01,0x83,0xFF +,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1E,0x00,0x00,0x00 +,0x5F,0x00,0x00,0x00,0xA7,0x00,0x01,0x01,0xF6,0x00,0x00,0x00,0xFF,0x05,0x3F +,0x4B,0xFF,0x0E,0xB3,0xD6,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x61,0x73 +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x32,0x8B,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x03,0x00,0x01,0x02,0xE8,0x02,0x1D,0x22,0xFE,0x90,0x0F,0xBF +,0xE4,0xFF,0x02,0x0B,0x92,0xAE,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x85 +,0x87,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xFF,0x05 +,0x3E,0x4A,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x01,0x0B,0x86,0xA0,0xFF,0x03,0x28 +,0x30,0xFF,0x81,0x00,0x00,0x00,0xFF,0x09,0x00,0x00,0x00,0xFD,0x00,0x00,0x00 +,0xCF,0x00,0x00,0x00,0xB5,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x8C,0x00,0x00 +,0x00,0x86,0x00,0x00,0x00,0x9A,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0xC4,0x00 +,0x01,0x01,0xF2,0x81,0x00,0x00,0x00,0xFF,0x01,0x03,0x25,0x2C,0xFE,0x0C,0x9D +,0xBB,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBD,0xE1,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0xAC,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x9B +,0x00,0x00,0x00,0xFF,0x09,0x76,0x8C,0xFF,0xAD,0x0F,0xBF,0xE4,0xFF,0x09,0x0E +,0xB3,0xD6,0xFF,0x0B,0x87,0xA1,0xFF,0x03,0x2B,0x33,0xFE,0x00,0x00,0x00,0xFF +,0x00,0x01,0x01,0xEB,0x00,0x00,0x00,0x1D,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x23,0x00,0x00,0x00,0xFF,0x06,0x4B,0x59,0xFF,0xA8,0x0F,0xBF,0xE4,0xFF,0x05 +,0x0F,0xBE,0xE3,0xFF,0x0B,0x89,0xA4,0xFF,0x04,0x31,0x3B,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x01,0x01,0xE3,0x00,0x00,0x00,0x2F,0x82,0xFF,0xFF,0xFF,0x00,0x9C +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0xFF,0x0D,0xA1 +,0xC0,0xFF,0x94,0x0F,0xBF,0xE4,0xFF,0x05,0x0E,0xAE,0xCF,0xFF,0x0C,0x94,0xB1 +,0xFF,0x0C,0x93,0xAF,0xFF,0x0D,0xA0,0xBF,0xFF,0x0E,0xAF,0xD0,0xFF,0x0F,0xBC +,0xE0,0xFF,0x9E,0x0F,0xBF,0xE4,0xFF,0x01,0x04,0x34,0x3E,0xFF,0x00,0x01,0x01 +,0xF7,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0xFF +,0x0D,0xA6,0xC6,0xFF,0xA7,0x0F,0xBF,0xE4,0xFF,0x04,0x0F,0xBC,0xE0,0xFF,0x09 +,0x78,0x8F,0xFF,0x01,0x0B,0x0D,0xFD,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x67 +,0x83,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xFF,0x04 +,0x30,0x39,0xFF,0x0F,0xBC,0xE0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2 +,0xD4,0xFF,0x08,0x61,0x74,0xFF,0x01,0x0E,0x11,0xFD,0x82,0x00,0x00,0x00,0xFF +,0x05,0x00,0x01,0x01,0xFB,0x00,0x01,0x02,0xF2,0x00,0x02,0x02,0xEB,0x00,0x02 +,0x02,0xE4,0x00,0x02,0x02,0xEF,0x00,0x00,0x00,0xFE,0x82,0x00,0x00,0x00,0xFF +,0x01,0x03,0x23,0x2A,0xFE,0x0B,0x87,0xA1,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02 +,0x07,0x53,0x63,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x28,0x8C,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x8F,0x00,0x00,0x00,0xFF,0x0C,0x99,0xB6,0xFF +,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBE,0xE3,0xFF,0x02,0x13,0x17,0xFE,0x00 +,0x01,0x01,0xDD,0x88,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA9,0x00,0x00 +,0x00,0xFF,0x08,0x6C,0x81,0xFF,0x94,0x0F,0xBF,0xE4,0xFF,0x04,0x0C,0x9B,0xB9 +,0xFF,0x08,0x6C,0x81,0xFF,0x05,0x3D,0x49,0xFF,0x02,0x13,0x17,0xFE,0x00,0x03 +,0x04,0xFE,0x83,0x00,0x00,0x00,0xFF,0x04,0x00,0x05,0x06,0xFE,0x02,0x15,0x19 +,0xFE,0x03,0x2B,0x34,0xFF,0x08,0x64,0x78,0xFF,0x0D,0xA3,0xC2,0xFF,0x93,0x0F +,0xBF,0xE4,0xFF,0x02,0x0E,0xB3,0xD6,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x9F,0x89,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0F,0x00,0x02,0x02,0xE7 +,0x01,0x0B,0x0D,0xFE,0x0E,0xAC,0xCE,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x07,0x09 +,0x76,0x8C,0xFF,0x00,0x01,0x01,0xFF,0x00,0x01,0x01,0xCB,0x00,0x00,0x00,0x07 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xD0,0x01,0x0E,0x10,0xFD,0x0F,0xBD,0xE1 +,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF,0x03,0x09,0x76,0x8C,0xFF,0x00,0x04,0x05,0xFE +,0x00,0x01,0x01,0xD8,0x00,0x00,0x00,0x09,0x81,0xFF,0xFF,0xFF,0x00,0x9C,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0xFF,0x07,0x59,0x6A +,0xFF,0xB9,0x0F,0xBF,0xE4,0xFF,0x01,0x03,0x24,0x2B,0xFF,0x00,0x01,0x01,0xE3 +,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0xFF,0x08 +,0x62,0x75,0xFF,0xA9,0x0F,0xBF,0xE4,0xFF,0x03,0x0D,0xAA,0xCB,0xFF,0x02,0x16 +,0x1A,0xFE,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x32,0x83,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0xFF,0x07,0x55,0x66,0xFF,0x92,0x0F +,0xBF,0xE4,0xFF,0x0C,0x0F,0xB9,0xDD,0xFF,0x0C,0x97,0xB5,0xFF,0x09,0x76,0x8C +,0xFF,0x07,0x54,0x64,0xFF,0x05,0x3B,0x47,0xFF,0x04,0x35,0x3F,0xFF,0x04,0x30 +,0x39,0xFF,0x03,0x2B,0x34,0xFF,0x04,0x32,0x3C,0xFF,0x05,0x40,0x4D,0xFF,0x06 +,0x4F,0x5F,0xFF,0x09,0x76,0x8C,0xFF,0x0D,0xAB,0xCC,0xFF,0x94,0x0F,0xBF,0xE4 +,0xFF,0x02,0x02,0x1E,0x24,0xFE,0x00,0x01,0x01,0xED,0x00,0x00,0x00,0x03,0x8C +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0xFF,0x07,0x55 +,0x65,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x54,0x64,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x33,0x87,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0D +,0x00,0x01,0x01,0xDB,0x00,0x03,0x04,0xFE,0x0C,0x96,0xB3,0xFF,0x98,0x0F,0xBF +,0xE4,0xFF,0x03,0x0E,0xB7,0xDA,0xFF,0x0D,0xA9,0xCA,0xFF,0x0D,0xA6,0xC6,0xFF +,0x0E,0xB5,0xD8,0xFF,0x98,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA9,0xC9,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x92,0x8A,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 +,0x00,0x4E,0x00,0x00,0x00,0xFF,0x05,0x3A,0x45,0xFF,0x0F,0xBE,0xE3,0xFF,0xAF +,0x0F,0xBF,0xE4,0xFF,0x06,0x07,0x5B,0x6D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x9A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFF,0x0B +,0x8E,0xA9,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x68,0x7C,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x86,0x81,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF +,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xE0,0x01,0x12,0x16,0xFD,0x0F +,0xBD,0xE1,0xFF,0xB8,0x0F,0xBF,0xE4,0xFF,0x01,0x02,0x14,0x18,0xFE,0x00,0x00 +,0x00,0xCE,0x8C,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x01,0x01 +,0xED,0x02,0x1E,0x24,0xFE,0xAA,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB4,0xFF +,0x00,0x03,0x04,0xFE,0x00,0x00,0x00,0xBB,0x83,0xFF,0xFF,0xFF,0x00,0x03,0x00 +,0x00,0x00,0x05,0x00,0x00,0x01,0xC4,0x00,0x00,0x00,0xFF,0x09,0x6E,0x83,0xFF +,0xB2,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA3,0xC3,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x9F,0x8E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01,0x01,0xDA,0x01,0x12 +,0x15,0xFE,0x0F,0xBE,0xE2,0xFF,0x8F,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x95,0xB2 +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8A,0x88,0xFF,0xFF,0xFF,0x00,0x03 +,0x00,0x00,0x00,0x2F,0x00,0x01,0x01,0xF8,0x02,0x15,0x1A,0xFD,0x0E,0xB2,0xD4 +,0xFF,0xB4,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9E,0xBD,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x85,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA6,0x00 +,0x00,0x00,0xFF,0x07,0x5A,0x6B,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x06,0x0F,0xBE +,0xE2,0xFF,0x04,0x34,0x3F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x42,0x00 +,0x00,0x00,0x2B,0x00,0x00,0x00,0xFF,0x06,0x4F,0x5F,0xFF,0xAB,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0F,0xBE,0xE2,0xFF,0x01,0x13,0x16,0xFE,0x00,0x00,0x00,0xCC,0x81 +,0xFF,0xFF,0xFF,0x00,0x9D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x81,0x00 +,0x00,0x00,0xFF,0x0B,0x88,0xA3,0xFF,0xB8,0x0F,0xBF,0xE4,0xFF,0x01,0x00,0x05 +,0x06,0xFE,0x00,0x00,0x00,0xBB,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x97,0x00,0x00,0x00,0xFF,0x0C,0x9A,0xB8,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF,0x02 +,0x05,0x42,0x4F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x28,0x83,0xFF,0xFF +,0xFF,0x00,0x04,0x00,0x00,0x00,0x19,0x00,0x01,0x02,0xDE,0x00,0x00,0x00,0xFF +,0x07,0x57,0x68,0xFF,0x0F,0xBE,0xE3,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF,0x02,0x08 +,0x68,0x7C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4E,0x8E,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFF,0x0B,0x8D,0xA8,0xFF,0x8F +,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xBE,0xE3,0xFF,0x02,0x16,0x1B,0xFE,0x00,0x01 +,0x01,0xE1,0x89,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x65,0x00,0x00,0x00 +,0xFF,0x04,0x38,0x43,0xFF,0x0F,0xBE,0xE3,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0C,0x94,0xB0,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x77,0x8B,0xFF,0xFF +,0xFF,0x00,0x03,0x00,0x00,0x00,0x0B,0x00,0x01,0x01,0xCB,0x00,0x00,0x00,0xFF +,0x09,0x70,0x85,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x06,0x0C,0x9B,0xB9,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x94,0xFF,0xFF,0xFF,0x00,0x00,0x01,0x01,0xDA +,0x01,0x11,0x14,0xFD,0x0F,0xBE,0xE2,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x03,0x04 +,0x39,0x44,0xFF,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x05,0xFF,0xFF,0xFF,0x00 +,0x9D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0xFE,0x05 +,0x40,0x4D,0xFF,0xB7,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD4,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0xA7,0x8D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x3C,0x00,0x00,0x00,0xFF,0x07,0x57,0x68,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0B,0x8E,0xA9,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8A,0x84,0xFF,0xFF +,0xFF,0x00,0x04,0x00,0x00,0x00,0x14,0x00,0x00,0x01,0xC4,0x00,0x00,0x00,0xFF +,0x05,0x3E,0x4A,0xFF,0x0E,0xB8,0xDC,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x02,0x04 +,0x2D,0x36,0xFF,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0x09,0x8E,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0xFF,0x06,0x49,0x57,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x57,0x68,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x37,0x89,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA4,0x00,0x00,0x00 +,0xFF,0x08,0x65,0x79,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x68,0x7C,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x50,0x8C,0xFF,0xFF,0xFF,0x00,0x03,0x00 +,0x00,0x00,0x16,0x00,0x01,0x01,0xDD,0x00,0x01,0x01,0xFF,0x0A,0x84,0x9D,0xFF +,0xAF,0x0F,0xBF,0xE4,0xFF,0x05,0x02,0x15,0x19,0xFE,0x00,0x01,0x01,0xE1,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0xFF,0x0B,0x92,0xAE,0xFF +,0xAB,0x0F,0xBF,0xE4,0xFF,0x03,0x07,0x5E,0x70,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x2F,0xFF,0xFF,0xFF,0x00,0x9E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0xC0,0x00,0x04,0x05,0xFE,0x0E,0xB2,0xD5,0xFF,0xB6,0x0F,0xBF,0xE4,0xFF +,0x02,0x09,0x72,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x6A,0x8D,0xFF +,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0xE1,0x02,0x13,0x17 +,0xFE,0x0F,0xBE,0xE2,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x00,0x0E,0xB4,0xD7,0xFF +,0x94,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x02,0x17,0x1C,0xFE,0x00 +,0x01,0x01,0xE8,0x00,0x00,0x00,0x04,0x84,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00 +,0x00,0x07,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0xFF,0x03,0x29,0x31,0xFE,0x0E +,0xAE,0xCF,0xFF,0xAD,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x87,0xA1,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0xA8,0x90,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01 +,0xE5,0x03,0x25,0x2D,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x98,0xB6,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8E,0x89,0xFF,0xFF,0xFF,0x00,0x03,0x00 +,0x00,0x00,0x0B,0x00,0x01,0x01,0xD8,0x00,0x02,0x02,0xFE,0x0B,0x91,0xAD,0xFF +,0xB2,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x21,0x27,0xFE,0x00,0x01,0x01,0xEF,0x00 +,0x00,0x00,0x06,0x8D,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x24,0x00,0x01 +,0x02,0xEC,0x00,0x06,0x07,0xFE,0x0C,0x95,0xB2,0xFF,0xAE,0x0F,0xBF,0xE4,0xFF +,0x05,0x06,0x50,0x60,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x2E,0x00,0x00 +,0x00,0x33,0x00,0x00,0x00,0xFF,0x07,0x53,0x63,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF +,0x03,0x0A,0x82,0x9C,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x60,0xFF,0xFF +,0xFF,0x00,0x9E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x61,0x00,0x00,0x00 +,0xFF,0x09,0x77,0x8E,0xFF,0xB6,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x28,0x2F,0xFF +,0x00,0x01,0x01,0xF7,0x00,0x00,0x00,0x0F,0x8E,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x87,0x00,0x00,0x00,0xFF,0x0B,0x8F,0xAB,0xFF,0x92,0x0F,0xBF,0xE4 +,0xFF,0x02,0x06,0x4C,0x5A,0xFF,0x00,0x05,0x05,0xFE,0x0C,0x9D,0xBC,0xFF,0x94 +,0x0F,0xBF,0xE4,0xFF,0x02,0x08,0x60,0x72,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x4D,0x86,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00 +,0xFF,0x01,0x0E,0x10,0xFD,0x0A,0x7E,0x96,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x03 +,0x0E,0xAC,0xCE,0xFF,0x01,0x0E,0x11,0xFD,0x00,0x01,0x02,0xED,0x00,0x00,0x00 +,0x1B,0x90,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xE8,0x03,0x2C,0x35,0xFF +,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x02,0x19,0x1E,0xFE,0x00,0x01,0x02,0xE5,0x00 +,0x00,0x00,0x01,0x89,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x2B,0x00,0x01 +,0x01,0xF6,0x01,0x12,0x15,0xFE,0x0D,0xAC,0xCD,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF +,0x02,0x0C,0x9A,0xB8,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x9A,0x8F,0xFF +,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x35,0x00,0x01,0x01,0xF5,0x01,0x0D,0x10 +,0xFD,0x0B,0x8B,0xA6,0xFF,0xAD,0x0F,0xBF,0xE4,0xFF,0x06,0x0B,0x8B,0xA5,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7A,0xFF,0xFF,0xFF,0x00,0x00,0x01,0x01 +,0xE1,0x02,0x15,0x19,0xFE,0x0F,0xBE,0xE3,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF,0x03 +,0x0D,0xA7,0xC7,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x91,0xFF,0xFF,0xFF +,0x00,0x9E,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xFF +,0x06,0x51,0x61,0xFF,0xB5,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBB,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0xA2,0x8F,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x2C,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5A,0xFF,0x92,0x0F,0xBF,0xE4,0xFF +,0x03,0x05,0x40,0x4C,0xFF,0x00,0x00,0x00,0xFF,0x03,0x28,0x30,0xFE,0x0F,0xBE +,0xE2,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA8,0xC8,0xFF,0x00,0x01,0x01 +,0xFF,0x00,0x00,0x00,0xAE,0x87,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x4D +,0x00,0x01,0x02,0xE9,0x00,0x00,0x00,0xFF,0x05,0x3D,0x49,0xFF,0x0E,0xAF,0xD0 +,0xFF,0xA8,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE3,0xFF,0x04,0x33,0x3C,0xFE +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4B,0x91,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x01,0x01,0xEF,0x04,0x32,0x3C,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x5A +,0x6B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3C,0x8A,0xFF,0xFF,0xFF,0x00 +,0x03,0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0xFF,0x02,0x18,0x1D,0xFD,0x0D,0xA5 +,0xC5,0xFF,0xAF,0x0F,0xBF,0xE4,0xFF,0x02,0x07,0x54,0x64,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x3E,0x90,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x47 +,0x00,0x01,0x02,0xF1,0x00,0x01,0x01,0xFF,0x07,0x55,0x65,0xFF,0x0F,0xBA,0xDE +,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x06,0x0F,0xBB,0xDF,0xFF,0x01,0x09,0x0A,0xFE +,0x00,0x00,0x00,0xC7,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8E,0x00,0x00,0x00 +,0xFF,0x0C,0x97,0xB4,0xFF,0xAB,0x0F,0xBF,0xE4,0xFF,0x02,0x01,0x0B,0x0D,0xFD +,0x00,0x00,0x00,0xC3,0xFF,0xFF,0xFF,0x00,0x9F,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x01,0x01,0xF1,0x04,0x30,0x39,0xFF,0xB5,0x0F,0xBF,0xE4,0xFF,0x02,0x06,0x4B +,0x59,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x3E,0x90,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x01,0xD4,0x01,0x0F,0x11,0xFD,0x0F,0xBD,0xE1,0xFF,0x91,0x0F +,0xBF,0xE4,0xFF,0x00,0x07,0x59,0x6A,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x08 +,0x6B,0x80,0xFF,0x94,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x32,0x3C,0xFF,0x00,0x01 +,0x01,0xFB,0x00,0x00,0x00,0x15,0x87,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00 +,0x12,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0xFF,0x01,0x0E,0x11,0xFD,0x09,0x6E +,0x83,0xFF,0x0E,0xB7,0xDA,0xFF,0xA5,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xAE,0xCF +,0xFF,0x04,0x37,0x41,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x8F,0x91,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xFF,0x06,0x4B,0x59 +,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x82,0x8B,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x63,0x00 +,0x00,0x01,0xFD,0x01,0x10,0x13,0xFD,0x0C,0x9C,0xBA,0xFF,0xAD,0x0F,0xBF,0xE4 +,0xFF,0x03,0x0D,0xA5,0xC5,0xFF,0x01,0x0B,0x0D,0xFD,0x00,0x01,0x01,0xE1,0x00 +,0x00,0x00,0x01,0x91,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x1E,0x00,0x00 +,0x01,0xC3,0x00,0x00,0x00,0xFF,0x03,0x22,0x29,0xFE,0x0C,0x9F,0xBE,0xFF,0xAB +,0x0F,0xBF,0xE4,0xFF,0x05,0x05,0x40,0x4C,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00 +,0x00,0x16,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xFF,0x07,0x58,0x69,0xFF,0xAB +,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x30,0x39,0xFF,0x00,0x01,0x01,0xF3,0x00,0x00 +,0x00,0x01,0x9F,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x01,0x01,0xEC,0x04,0x31,0x3B +,0xFF,0xB4,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x01,0x01,0xCA,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x80,0x00 +,0x00,0x00,0xFF,0x0B,0x90,0xAC,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x04,0x09,0x72 +,0x88,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFE,0x01,0x07,0x08,0xFD,0x0D +,0xA8,0xC8,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x7C,0x94,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x72,0x89,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00 +,0x53,0x00,0x01,0x02,0xEB,0x00,0x00,0x00,0xFF,0x01,0x0C,0x0E,0xFE,0x07,0x5B +,0x6C,0xFF,0x0D,0xAC,0xCD,0xFF,0xA2,0x0F,0xBF,0xE4,0xFF,0x04,0x0B,0x86,0xA0 +,0xFF,0x01,0x0F,0x12,0xFD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xA4,0x00,0x00 +,0x00,0x06,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x67,0x00,0x00,0x00 +,0xFF,0x0A,0x7F,0x98,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0D,0xA1,0xC0,0xFF +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x83,0x8C,0xFF,0xFF,0xFF,0x00,0x04,0x00 +,0x00,0x00,0x50,0x00,0x01,0x01,0xF9,0x01,0x09,0x0B,0xFD,0x09,0x76,0x8D,0xFF +,0x0F,0xBE,0xE3,0xFF,0xAA,0x0F,0xBF,0xE4,0xFF,0x03,0x0E,0xB2,0xD5,0xFF,0x02 +,0x1F,0x25,0xFE,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x4B,0x93,0xFF,0xFF,0xFF +,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x7F,0x00,0x00,0x01,0xFD,0x00 +,0x05,0x06,0xFE,0x08,0x66,0x7A,0xFF,0x0E,0xB1,0xD3,0xFF,0xA9,0x0F,0xBF,0xE4 +,0xFF,0x05,0x0A,0x7A,0x92,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x61,0x00 +,0x00,0x00,0x02,0x00,0x01,0x01,0xE8,0x02,0x19,0x1E,0xFE,0xAB,0x0F,0xBF,0xE4 +,0xFF,0x02,0x07,0x55,0x65,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x25,0x9E +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0xFE,0x05,0x3E +,0x4A,0xFF,0xB3,0x0F,0xBF,0xE4,0xFF,0x03,0x08,0x6A,0x7F,0xFF,0x00,0x03,0x04 +,0xFE,0x00,0x01,0x02,0xE7,0x00,0x00,0x00,0x1B,0x91,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x2E,0x00,0x00,0x00,0xFF,0x07,0x53,0x63,0xFF,0x91,0x0F,0xBF +,0xE4,0xFF,0x04,0x09,0x79,0x90,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x98 +,0x00,0x00,0x00,0xFE,0x04,0x36,0x40,0xFF,0x93,0x0F,0xBF,0xE4,0xFF,0x02,0x0F +,0xB9,0xDD,0xFF,0x01,0x0B,0x0D,0xFE,0x00,0x01,0x01,0xD4,0x8A,0xFF,0xFF,0xFF +,0x00,0x06,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x69,0x00,0x01,0x01,0xDB,0x00 +,0x00,0x00,0xFF,0x00,0x03,0x04,0xFE,0x05,0x46,0x53,0xFF,0x0C,0x9B,0xB9,0xFF +,0x9D,0x0F,0xBF,0xE4,0xFF,0x05,0x0F,0xBE,0xE3,0xFF,0x0B,0x8B,0xA6,0xFF,0x05 +,0x3F,0x4B,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x02,0xEF,0x00,0x00,0x00,0x56 +,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xB2,0x00,0x01,0x01,0xFF,0x0E +,0xB2,0xD4,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x0B,0x87,0xA1,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x6E,0x8D,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00 +,0x3F,0x00,0x01,0x02,0xE8,0x00,0x00,0x00,0xFF,0x03,0x2C,0x34,0xFE,0x0C,0x9B +,0xB9,0xFF,0xA8,0x0F,0xBF,0xE4,0xFF,0x03,0x0B,0x88,0xA2,0xFF,0x01,0x13,0x17 +,0xFD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x76,0x96,0xFF,0xFF,0xFF,0x00,0x06 +,0x00,0x00,0x00,0x3B,0x00,0x01,0x01,0xE1,0x00,0x00,0x00,0xFF,0x00,0x03,0x04 +,0xFE,0x05,0x3B,0x47,0xFF,0x0A,0x81,0x9A,0xFF,0x0F,0xBA,0xDE,0xFF,0xA6,0x0F +,0xBF,0xE4,0xFF,0x07,0x0E,0xB2,0xD4,0xFF,0x00,0x02,0x02,0xFE,0x00,0x00,0x00 +,0xAE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xFF,0x0B,0x8E +,0xAA,0xFF,0x0F,0xBB,0xDF,0xFF,0xA9,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x79,0x90 +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x56,0x9D,0xFF,0xFF,0xFF,0x00,0x03 +,0x00,0x00,0x00,0x05,0x00,0x01,0x01,0xD2,0x00,0x02,0x02,0xFE,0x0C,0x97,0xB5 +,0xFF,0xB0,0x0F,0xBF,0xE4,0xFF,0x05,0x0E,0xB8,0xDC,0xFF,0x0A,0x7B,0x93,0xFF +,0x04,0x2D,0x35,0xFF,0x00,0x00,0x00,0xFF,0x00,0x01,0x01,0xD8,0x00,0x00,0x00 +,0x2C,0x92,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFF +,0x06,0x49,0x57,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x06,0x07,0x58,0x6A,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x9A,0x00,0x00,0x00,0xFF +,0x06,0x49,0x58,0xFF,0x0F,0xBC,0xE0,0xFF,0x92,0x0F,0xBF,0xE4,0xFF,0x02,0x06 +,0x4E,0x5D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x35,0x8B,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4E,0x00,0x00,0x00,0xC1,0x81 +,0x00,0x00,0x00,0xFF,0x02,0x04,0x31,0x3B,0xFF,0x0B,0x86,0xA0,0xFF,0x0F,0xBA +,0xDE,0xFF,0x97,0x0F,0xBF,0xE4,0xFF,0x03,0x0F,0xBE,0xE2,0xFF,0x0D,0xA0,0xBF +,0xFF,0x08,0x60,0x72,0xFF,0x02,0x16,0x1B,0xFE,0x81,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xB6,0x00,0x00,0x00,0x1A,0x93,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x0E,0x00,0x01,0x01,0xF9,0x04,0x31,0x3A,0xFF,0x91,0x0F,0xBF,0xE4 +,0xFF,0x03,0x0F,0xBB,0xDF,0xFF,0x04,0x31,0x3B,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x1F,0x8E,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00,0x0D,0x00,0x00 +,0x00,0x8B,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0xFF,0x02,0x1C,0x21,0xFE,0x06 +,0x52,0x62,0xFF,0x0B,0x88,0xA2,0xFF,0x0E,0xB8,0xDC,0xFF,0x9F,0x0F,0xBF,0xE4 +,0xFF,0x07,0x0F,0xBE,0xE3,0xFF,0x0D,0xAB,0xCC,0xFF,0x0A,0x84,0x9D,0xFF,0x06 +,0x4D,0x5C,0xFF,0x02,0x15,0x19,0xFE,0x00,0x00,0x00,0xFF,0x00,0x01,0x02,0xF1 +,0x00,0x00,0x00,0x5B,0x98,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00,0x0B,0x00 +,0x00,0x00,0x5C,0x00,0x00,0x00,0xB8,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0xFF +,0x01,0x0C,0x0E,0xFD,0x06,0x4D,0x5C,0xFF,0x0C,0x93,0xAF,0xFF,0xA5,0x0F,0xBF +,0xE4,0xFF,0x03,0x04,0x2F,0x38,0xFF,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0x07 +,0x00,0x00,0x00,0x44,0x82,0x00,0x00,0x00,0xFF,0x05,0x01,0x0A,0x0C,0xFE,0x02 +,0x1B,0x20,0xFF,0x05,0x3A,0x45,0xFF,0x08,0x69,0x7D,0xFF,0x0C,0x98,0xB6,0xFF +,0x0F,0xBD,0xE1,0xFF,0xA3,0x0F,0xBF,0xE4,0xFF,0x02,0x0C,0x9D,0xBC,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x87,0x9C,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 +,0x00,0x10,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0xFF,0x07,0x56,0x67,0xFF,0xAD +,0x0F,0xBF,0xE4,0xFF,0x08,0x0F,0xBC,0xE0,0xFF,0x0D,0xA6,0xC6,0xFF,0x0B,0x8A +,0xA5,0xFF,0x06,0x4C,0x5B,0xFF,0x01,0x09,0x0B,0xFE,0x00,0x00,0x00,0xFF,0x00 +,0x01,0x01,0xFB,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x0A,0x93,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0xFF,0x09,0x76,0x8C,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x08,0x0C,0x9A,0xB8,0xFF,0x01,0x0A,0x0C,0xFD,0x00,0x01 +,0x01,0xEA,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0xFF,0x03,0x28,0x30,0xFE,0x0B,0x91,0xAD,0xFF,0x91,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0C,0x97,0xB5,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x96,0x8E +,0xFF,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0xA5,0x00,0x01 +,0x01,0xFC,0x00,0x00,0x00,0xFF,0x00,0x04,0x05,0xFE,0x03,0x2A,0x32,0xFF,0x07 +,0x55,0x66,0xFF,0x0A,0x80,0x99,0xFF,0x0D,0xAB,0xCC,0xFF,0x8C,0x0F,0xBF,0xE4 +,0xFF,0x07,0x0F,0xBB,0xE0,0xFF,0x0D,0xAC,0xCD,0xFF,0x0C,0x9B,0xB9,0xFF,0x0B +,0x8B,0xA5,0xFF,0x09,0x76,0x8C,0xFF,0x06,0x51,0x61,0xFF,0x03,0x2C,0x35,0xFF +,0x01,0x07,0x09,0xFE,0x81,0x00,0x00,0x00,0xFF,0x02,0x00,0x01,0x01,0xE5,0x00 +,0x00,0x00,0x88,0x00,0x00,0x00,0x2A,0x94,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 +,0x00,0x04,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0xFF,0x06,0x52,0x61,0xFF,0x8F +,0x0C,0x95,0xB2,0xFF,0x04,0x0B,0x8C,0xA7,0xFF,0x08,0x6C,0x81,0xFF,0x03,0x29 +,0x31,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xB0,0x91,0xFF,0xFF,0xFF,0x00 +,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x96,0x00,0x01,0x01,0xE1,0x81,0x00 +,0x00,0x00,0xFF,0x0E,0x00,0x02,0x02,0xFE,0x02,0x18,0x1C,0xFD,0x04,0x34,0x3E +,0xFF,0x06,0x4E,0x5D,0xFF,0x08,0x68,0x7C,0xFF,0x0A,0x7D,0x95,0xFF,0x0A,0x85 +,0x9F,0xFF,0x0B,0x8D,0xA8,0xFF,0x0C,0x94,0xB0,0xFF,0x0C,0x9B,0xB9,0xFF,0x0D +,0xA2,0xC1,0xFF,0x0D,0xA9,0xCA,0xFF,0x0E,0xB0,0xD2,0xFF,0x0E,0xB8,0xDB,0xFF +,0x0F,0xBE,0xE3,0xFF,0x84,0x0F,0xBF,0xE4,0xFF,0x0D,0x0F,0xBE,0xE2,0xFF,0x0E +,0xB4,0xD7,0xFF,0x0D,0xAA,0xCB,0xFF,0x0D,0xA0,0xBE,0xFF,0x0C,0x96,0xB3,0xFF +,0x0B,0x8B,0xA6,0xFF,0x0A,0x82,0x9B,0xFF,0x09,0x77,0x8E,0xFF,0x09,0x6D,0x82 +,0xFF,0x08,0x63,0x76,0xFF,0x07,0x55,0x66,0xFF,0x05,0x3C,0x48,0xFF,0x03,0x21 +,0x27,0xFE,0x00,0x06,0x07,0xFE,0x82,0x00,0x00,0x00,0xFF,0x02,0x00,0x01,0x01 +,0xD7,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x1D,0x9C,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x71,0x00,0x01,0x01,0xCE,0x81,0x00,0x00 +,0x00,0xFF,0x04,0x02,0x19,0x1D,0xFE,0x06,0x4E,0x5D,0xFF,0x09,0x70,0x85,0xFF +,0x0B,0x91,0xAD,0xFF,0x0E,0xB2,0xD5,0xFF,0xA0,0x0F,0xBF,0xE4,0xFF,0x09,0x08 +,0x6A,0x7E,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x03 +,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xA8,0x00,0x00,0x00 +,0xBD,0x00,0x00,0x00,0xD3,0x00,0x00,0x01,0xFC,0x81,0x00,0x00,0x00,0xFF,0x02 +,0x01,0x09,0x0B,0xFE,0x06,0x4A,0x59,0xFF,0x0D,0xA0,0xBF,0xFF,0xA1,0x0F,0xBF +,0xE4,0xFF,0x02,0x0F,0xBC,0xE0,0xFF,0x00,0x05,0x05,0xFE,0x00,0x00,0x00,0xB9 +,0x9B,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0xB2,0x00,0x01,0x01,0xFA,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x03,0x28,0x30,0xFF,0xAB,0x04,0x2F,0x38,0xFF,0x02 +,0x04,0x2E,0x37,0xFF,0x02,0x18,0x1D,0xFE,0x00,0x02,0x03,0xFE,0x82,0x00,0x00 +,0x00,0xFF,0x02,0x00,0x00,0x00,0xCD,0x00,0x00,0x00,0x6E,0x00,0x00,0x00,0x14 +,0x94,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x8C,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0xFF,0x05,0x3D,0x49,0xFF,0x8D,0x06,0x47,0x55,0xFF,0x05,0x06,0x46 +,0x54,0xFF,0x04,0x2E,0x37,0xFF,0x01,0x0A,0x0C,0xFE,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0xFD,0x00,0x00,0x00,0x43,0x81,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00 +,0x00,0x04,0x00,0x00,0x00,0x8C,0x00,0x01,0x01,0xFA,0x00,0x00,0x00,0xFF,0x01 +,0x12,0x16,0xFD,0x05,0x41,0x4E,0xFF,0x90,0x06,0x47,0x55,0xFF,0x02,0x00,0x04 +,0x04,0xFF,0x00,0x01,0x01,0xF0,0x00,0x00,0x00,0x08,0x8F,0xFF,0xFF,0xFF,0x00 +,0x03,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x7A,0x00,0x00,0x00,0xB5,0x00,0x01 +,0x01,0xEE,0x82,0x00,0x00,0x00,0xFF,0x0C,0x02,0x15,0x19,0xFE,0x04,0x34,0x3F +,0xFF,0x05,0x42,0x4F,0xFF,0x06,0x4F,0x5E,0xFF,0x07,0x5B,0x6D,0xFF,0x08,0x67 +,0x7B,0xFF,0x08,0x67,0x7A,0xFF,0x07,0x5D,0x6F,0xFF,0x06,0x4E,0x5D,0xFF,0x05 +,0x3D,0x49,0xFF,0x04,0x2D,0x36,0xFF,0x02,0x1C,0x22,0xFF,0x01,0x0B,0x0D,0xFE +,0x85,0x00,0x00,0x00,0xFF,0x04,0x00,0x01,0x02,0xED,0x00,0x00,0x00,0xB9,0x00 +,0x00,0x00,0x86,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x02,0x95,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xAB,0x95,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x04,0x94,0xFF,0xFF,0xFF,0x00,0x04 +,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0xAA,0x00,0x00,0x00 +,0xCE,0x00,0x01,0x01,0xF2,0x8B,0x00,0x00,0x00,0xFF,0x05,0x00,0x05,0x06,0xFE +,0x01,0x0C,0x0F,0xFD,0x02,0x13,0x17,0xFE,0x01,0x12,0x15,0xFE,0x01,0x08,0x0A +,0xFE,0x00,0x01,0x01,0xFF,0x89,0x00,0x00,0x00,0xFF,0x05,0x00,0x00,0x00,0xFD +,0x00,0x01,0x01,0xDF,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x92,0x00,0x00,0x00 +,0x67,0x00,0x00,0x00,0x20,0xA2,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x29 +,0x00,0x00,0x00,0x85,0x00,0x01,0x01,0xDF,0x83,0x00,0x00,0x00,0xFF,0x03,0x00 +,0x06,0x07,0xFE,0x01,0x11,0x14,0xFE,0x02,0x1D,0x23,0xFF,0x03,0x28,0x30,0xFF +,0x9C,0x04,0x2F,0x38,0xFF,0x02,0x03,0x23,0x2A,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x95,0x85,0xFF,0xFF,0xFF,0x00,0x07,0x00,0x00,0x00,0x0B,0x00,0x00 +,0x00,0x46,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0xC9,0x00,0x00,0x00,0xFF,0x00 +,0x01,0x01,0xFF,0x04,0x38,0x43,0xFF,0x0B,0x8F,0xAB,0xFF,0x8E,0x0F,0xBF,0xE4 +,0xFF,0x00,0x05,0x3D,0x48,0xFF,0x90,0x04,0x2F,0x38,0xFF,0x01,0x00,0x06,0x07 +,0xFF,0x00,0x01,0x01,0xEB,0x9B,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x04,0x04,0xB3 +,0xAF,0x00,0x02,0x02,0xEA,0x05,0x00,0x02,0x02,0xE8,0x00,0x00,0x00,0xCD,0x00 +,0x00,0x00,0xAC,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x2C +,0x97,0xFF,0xFF,0xFF,0x00,0x00,0x01,0x06,0x08,0x97,0x91,0x00,0x00,0x00,0xFF +,0x03,0x00,0x01,0x01,0xF3,0x00,0x00,0x00,0xC4,0x00,0x00,0x00,0x95,0x00,0x00 +,0x00,0x4F,0x84,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x21,0x00,0x00,0x00 +,0x86,0x00,0x01,0x01,0xD3,0x93,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5B +,0x92,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x28,0x00 +,0x00,0x00,0x61,0x00,0x00,0x00,0x9B,0x00,0x01,0x01,0xD5,0x00,0x01,0x01,0xF8 +,0x86,0x00,0x00,0x00,0xFF,0x09,0x00,0x00,0x00,0xFE,0x00,0x01,0x02,0xEE,0x00 +,0x00,0x00,0xD5,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x92 +,0x00,0x00,0x00,0x7B,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x4C,0x00,0x00,0x00 +,0x1E,0x9A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x2D,0x93,0x00,0x00,0x00 +,0x70,0x02,0x00,0x00,0x00,0x6B,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x18,0x9B +,0xFF,0xFF,0xFF,0x00,0x1C,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x38,0x00,0x00 +,0x00,0x52,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x70,0x00 +,0x00,0x00,0x7A,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0x98 +,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0xAD,0x00,0x00,0x00,0xB7,0x00,0x00,0x00 +,0xC1,0x00,0x00,0x00,0xCB,0x00,0x00,0x00,0xC9,0x00,0x00,0x00,0xBC,0x00,0x00 +,0x00,0xAE,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x86,0x00 +,0x00,0x00,0x78,0x00,0x00,0x00,0x6B,0x00,0x00,0x00,0x5D,0x00,0x00,0x00,0x50 +,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x25,0x00,0x00,0x00 +,0x07,0xAA,0xFF,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x42 +,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0xB9,0x00,0x00,0x00 +,0xC6,0x00,0x00,0x00,0xD3,0x00,0x01,0x02,0xE3,0x00,0x02,0x02,0xE9,0x9C,0x00 +,0x02,0x02,0xEA,0x01,0x00,0x01,0x02,0xEA,0x00,0x00,0x00,0xC9,0x89,0xFF,0xFF +,0xFF,0x00,0x06,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0xA9,0x00,0x00,0x01,0xFD +,0x00,0x00,0x00,0xFF,0x03,0x26,0x2D,0xFE,0x0A,0x7C,0x94,0xFF,0x0F,0xBC,0xE0 +,0xFF,0x8B,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x46,0x53,0xFF,0x00,0x00,0x00,0xFF +,0x00,0x01,0x02,0xF0,0x8F,0x00,0x02,0x02,0xEA,0x00,0x00,0x00,0x00,0xE8,0xEA +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0x91,0x00,0x00,0x00,0x08,0x00 +,0x00,0x00,0x00,0x01,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x06,0x92 +,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x04,0x98,0xFF,0xFF,0xFF,0x00,0x07 +,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x25,0x00,0x00,0x00 +,0x33,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x2D,0x00,0x00,0x00,0x19,0x00,0x00 +,0x00,0x04,0xFF,0xFF,0xFF,0xFF,0x00,0xD3,0xFF,0xFF,0xFF,0x00,0x06,0x00,0x00 +,0x00,0x21,0x00,0x00,0x00,0x92,0x00,0x01,0x01,0xF5,0x00,0x00,0x00,0xFF,0x02 +,0x15,0x1A,0xFD,0x09,0x70,0x85,0xFF,0x0F,0xBE,0xE2,0xFF,0x89,0x0F,0xBF,0xE4 +,0xFF,0x02,0x0A,0x84,0x9D,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x71,0x90 +,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF +,0xFF,0xFF,0xFF,0x00,0x95,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x12,0x00 +,0x00,0x00,0x7C,0x00,0x01,0x01,0xE9,0x00,0x00,0x00,0xFF,0x03,0x2A,0x33,0xFF +,0x0D,0xA0,0xBF,0xFF,0x88,0x0F,0xBF,0xE4,0xFF,0x02,0x0F,0xB9,0xDD,0xFF,0x01 +,0x08,0x0A,0xFE,0x00,0x00,0x00,0xC4,0x90,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF +,0xFF,0x00,0xEE,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00 +,0xA2,0x00,0x00,0x00,0xD6,0x00,0x01,0x02,0xED,0x00,0x00,0x00,0xFD,0x8C,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x01,0x01,0xE4,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF +,0xFF,0x00,0x94,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,0x00,0x00 +,0x8E,0x00,0x00,0x00,0xFD,0x00,0x04,0x05,0xFE,0x08,0x63,0x76,0xFF,0x0F,0xBC +,0xE0,0xFF,0x87,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x41,0x4E,0xFF,0x00,0x00,0x00 +,0xFE,0x00,0x00,0x00,0x19,0x8F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00 +,0xED,0xFF,0xFF,0xFF,0x00,0x05,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xB5,0x00 +,0x00,0x00,0xFF,0x02,0x17,0x1B,0xFF,0x04,0x2E,0x37,0xFF,0x05,0x3F,0x4B,0xFF +,0x8B,0x05,0x41,0x4E,0xFF,0x02,0x03,0x27,0x2E,0xFF,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x3E,0xFF,0xFF,0xFF,0xFF,0x00,0x96,0xFF,0xFF,0xFF,0x00,0x04,0x00 +,0x00,0x00,0x37,0x00,0x01,0x01,0xD5,0x00,0x00,0x00,0xFF,0x05,0x3B,0x47,0xFF +,0x0F,0xBA,0xDE,0xFF,0x86,0x0F,0xBF,0xE4,0xFF,0x02,0x0A,0x80,0x99,0xFF,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x6B,0x8F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF +,0xFF,0x00,0xEC,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x01,0x01 +,0xD8,0x00,0x00,0x00,0xFF,0x06,0x46,0x54,0xFF,0x0F,0xBD,0xE1,0xFF,0x8D,0x0F +,0xBF,0xE4,0xFF,0x02,0x0C,0x9E,0xBD,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x97,0xFF,0xFF,0xFF,0xFF,0x00,0x97,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00 +,0x06,0x00,0x00,0x00,0xA1,0x00,0x00,0x00,0xFF,0x04,0x34,0x3E,0xFF,0x0E,0xB8 +,0xDB,0xFF,0x85,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB7,0xDA,0xFF,0x00,0x06,0x07 +,0xFE,0x00,0x00,0x00,0xBE,0x8F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00 +,0xEC,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xFF,0x06 +,0x52,0x61,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x21,0x28,0xFE,0x00,0x01 +,0x02,0xEE,0x00,0x00,0x00,0x04,0xFF,0xFF,0xFF,0xFF,0x00,0x97,0xFF,0xFF,0xFF +,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xFF,0x03 +,0x2C,0x34,0xFE,0x0E,0xB5,0xD7,0xFF,0x85,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3D +,0x49,0xFF,0x00,0x00,0x01,0xFD,0x00,0x00,0x00,0x15,0x8E,0xFF,0xFF,0xFF,0x00 +,0xFF,0xFF,0xFF,0xFF,0x00,0xEC,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x71 +,0x00,0x00,0x00,0xFF,0x0B,0x8A,0xA5,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x08 +,0x65,0x79,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x4A,0xFF,0xFF,0xFF,0xFF +,0x00,0x99,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xFF +,0x05,0x3A,0x45,0xFF,0x0F,0xBE,0xE3,0xFF,0x84,0x0F,0xBF,0xE4,0xFF,0x02,0x0A +,0x7C,0x94,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x65,0x8E,0xFF,0xFF,0xFF +,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xEC,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x44,0x00,0x00,0x00,0xFF,0x08,0x64,0x78,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02 +,0x0D,0xA7,0xC7,0xFF,0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0xA3,0xFF,0xFF,0xFF +,0xFF,0x00,0x9A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA4,0x00,0x00,0x00 +,0xFF,0x08,0x65,0x79,0xFF,0x84,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB5,0xD7,0xFF +,0x00,0x05,0x05,0xFE,0x00,0x00,0x00,0xB8,0x8E,0xFF,0xFF,0xFF,0x00,0xFF,0xFF +,0xFF,0xFF,0x00,0xEC,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x01 +,0x01,0xF2,0x03,0x2A,0x32,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x03,0x2B,0x34 +,0xFF,0x00,0x01,0x01,0xF4,0x00,0x00,0x00,0x09,0xFF,0xFF,0xFF,0xFF,0x00,0x99 +,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0A,0x00,0x01,0x01,0xD4,0x00,0x02 +,0x02,0xFE,0x0B,0x8E,0xAA,0xFF,0x84,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x39,0x44 +,0xFF,0x00,0x01,0x01,0xFB,0x00,0x00,0x00,0x11,0x8D,0xFF,0xFF,0xFF,0x00,0xFF +,0xFF,0xFF,0xFF,0x00,0xED,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA8,0x00 +,0x01,0x01,0xFF,0x0E,0xAE,0xCF,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x6F +,0x84,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x56,0xFF,0xFF,0xFF,0xFF,0x00 +,0x9A,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x26,0x00,0x01,0x02,0xF3,0x01 +,0x12,0x15,0xFE,0x0E,0xB7,0xDA,0xFF,0x83,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x78 +,0x8F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x5F,0x8D,0xFF,0xFF,0xFF,0x00 +,0xFF,0xFF,0xFF,0xFF,0x00,0xED,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5A +,0x00,0x00,0x00,0xFF,0x09,0x75,0x8B,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x0E +,0xAF,0xD0,0xFF,0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0xAF,0xFF,0xFF,0xFF,0xFF +,0x00,0x9B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0xFF +,0x07,0x5E,0x71,0xFF,0x83,0x0F,0xBF,0xE4,0xFF,0x02,0x0E,0xB2,0xD5,0xFF,0x00 +,0x03,0x04,0xFE,0x00,0x00,0x00,0xB2,0x8D,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF +,0xFF,0x00,0xED,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x01,0x01 +,0xFC,0x05,0x3A,0x46,0xFF,0x91,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x35,0x3F,0xFF +,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x10,0xFF,0xFF,0xFF,0xFF,0x00,0x9A,0xFF +,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x01,0x01,0xD4,0x01,0x07,0x09 +,0xFE,0x0E,0xAC,0xCE,0xFF,0x83,0x0F,0xBF,0xE4,0xFF,0x02,0x04,0x35,0x3F,0xFF +,0x00,0x01,0x01,0xF9,0x00,0x00,0x00,0x0D,0x8C,0xFF,0xFF,0xFF,0x00,0xFF,0xFF +,0xFF,0xFF,0x00,0xEE,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xBE,0x01,0x07 +,0x08,0xFE,0x0E,0xB8,0xDC,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x77,0x8E +,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0x00,0x9B +,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0xFF,0x04,0x30 +,0x39,0xFF,0x83,0x07,0x59,0x6A,0xFF,0x02,0x04,0x2E,0x37,0xFF,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x59,0x8C,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00 +,0xEE,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xFF,0x0B +,0x86,0xA0,0xFF,0x90,0x0F,0xBF,0xE4,0xFF,0x02,0x09,0x70,0x85,0xFF,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x52,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0xB8,0x86,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xAE,0x8C,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xEE,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xFF,0x06,0x4C,0x5A,0xFF,0x90 +,0x0F,0xBF,0xE4,0xFF,0x02,0x05,0x3F,0x4B,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00 +,0x00,0x13,0xFF,0xFF,0xFF,0xFF,0x00,0x9C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x10,0x86,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x23,0x8C,0xFF,0xFF +,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xEF,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x01 +,0x01,0xD5,0x01,0x11,0x14,0xFD,0x0F,0xBE,0xE3,0xFF,0x8E,0x0F,0xBF,0xE4,0xFF +,0x02,0x0D,0xA8,0xC8,0xFF,0x01,0x0A,0x0C,0xFE,0x00,0x00,0x01,0xD2,0xFF,0xFF +,0xFF,0xFF,0x00,0xB3,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xEF,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0xFF,0x04,0x35,0x3F +,0xFF,0x8C,0x05,0x3B,0x47,0xFF,0x04,0x05,0x3C,0x48,0xFF,0x03,0x2B,0x33,0xFF +,0x01,0x0B,0x0D,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x53,0xFF,0xFF,0xFF +,0xFF,0x00,0xB3,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xEF,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0x38,0x8E,0x00,0x00,0x00,0xFF,0x03,0x00,0x00 +,0x00,0xFE,0x00,0x01,0x01,0xE7,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x6C,0xFF +,0xFF,0xFF,0xFF,0x00,0xB4,0xFF,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8 +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x52,0x55,0x45,0x56,0x49,0x53,0x49 +,0x4F,0x4E,0x2D,0x58,0x46,0x49,0x4C,0x45,0x2E,0x00}; +/* end binary data. size = 39085 bytes */ + + +/* begin binary data: */ +const int headphones_bytes = 22402; +const unsigned char headphones_data[] = /* 22402 */ +{0x00,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xEB +,0x00,0x20,0x08,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xFF,0xFF +,0xFF,0xFF,0x00,0xEA,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0x8B,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00 +,0x00,0x77,0x00,0x00,0x00,0x10,0xFF,0xFF,0xFF,0xFF,0x00,0xCC,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x0E,0x8B +,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x8B +,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0xDF,0x00,0x00,0x00,0x34,0xFF,0xFF,0xFF,0xFF,0x00,0xC9,0xFF,0xFF,0xFF +,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0xFB,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0xAC,0x8B,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00 +,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x3D,0x00,0x00,0x00,0xFB,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xF9,0x00,0x00,0x00,0x6B,0xFF,0xFF,0xFF,0xFF,0x00,0xC7,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0xB2,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x6F,0x8A,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x16,0x00 +,0x00,0x00,0xE5,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x39,0xFF,0xFF +,0xFF,0xFF,0x00,0xC6,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x00 +,0x00,0xF3,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00 +,0x38,0x89,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 +,0x00,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xBC +,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x90,0xFF,0xFF,0xFF,0xFF,0x00 +,0xC8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x56,0x84,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0x11,0x88,0xFF,0xFF,0xFF,0x00,0x89 +,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x88,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x65,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC7,0x00 +,0x00,0x00,0x05,0xFF,0xFF,0xFF,0xFF,0x00,0xC9,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x90,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x95,0x88,0xFF +,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x87,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xED,0x83,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x1D,0x89,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x7A,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFF,0x00 +,0xB2,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x5D,0x00,0x00,0x00,0xC2,0x00 +,0x00,0x00,0x07,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00 +,0x00,0xC5,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00 +,0x32,0x87,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 +,0x00,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9D,0x83,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x48,0x89,0xFF,0xFF,0xFF,0x00 +,0x03,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xF2,0x00,0x00 +,0x00,0x65,0x9D,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x29,0x00,0x00,0x00 +,0x72,0x00,0x00,0x00,0x1D,0xFF,0xFF,0xFF,0xFF,0x00,0x8E,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0xB2,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x87,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1C,0x00 +,0x00,0x00,0xF0,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC8,0x00,0x00 +,0x00,0x01,0x86,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 +,0x00,0x00,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x3A,0x00,0x00,0x00 +,0xFE,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0x89,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0xEB,0x82,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x72,0x98,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x0E +,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0xE1,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x57,0xEE,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00 +,0x00,0x8D,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x0F,0x9C,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x67,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC +,0x00,0x00,0x00,0x37,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6E,0x84 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x65,0x86,0xFF,0xFF,0xFF,0x00,0x89 +,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x85,0xFF,0xFF,0xFF,0x00,0x01 +,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xD0,0x83,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xEE,0x00,0x00,0x00,0x14,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0xAD,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE3,0x00,0x00,0x00 +,0x0F,0x85,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x01 +,0x8D,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x7A,0x00 +,0x00,0x00,0xC2,0x00,0x00,0x00,0xFB,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x89,0xED,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x14,0x81,0x00,0x00 +,0x00,0xFF,0x04,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0xC4,0x00,0x00,0x00,0x7C +,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x90,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x00,0x00,0x1B,0x00,0x00,0x00,0x2B,0x85,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x01,0x00,0x00,0x00,0xBC,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xD7,0x00,0x00,0x00,0x08,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x03 +,0x00,0x00,0x00,0xD1,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEC,0x00 +,0x00,0x00,0x11,0x85,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0x85,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x58,0x84,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x68,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x58,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x45,0x86,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0xC5,0x00,0x00,0x00 +,0x2E,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x9E +,0x00,0x00,0x00,0xFC,0x87,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBB,0xED +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x46,0x85,0x00,0x00,0x00,0xFF,0x03 +,0x00,0x00,0x00,0xEB,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0x57,0x00,0x00,0x00 +,0x03,0x8B,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x72 +,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0xD0,0x00,0x00,0x00,0x03,0x85,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xF1,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x8C,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x3C,0x00,0x00,0x00,0xFE,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7D +,0x85,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 +,0x85,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCF,0x83,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xCB,0x00,0x00,0x00,0x02,0x88,0xFF,0xFF,0xFF,0x00,0x01 +,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0xEC,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x97,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x44,0x81,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x16,0x87,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0xF9 +,0x85,0x00,0x00,0x00,0xFF,0x01,0x10,0x10,0x10,0xFF,0x18,0x18,0x18,0xFF,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xED,0xED,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x78,0x88,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xD8,0x00 +,0x00,0x00,0x57,0x00,0x00,0x00,0x01,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x12,0x00,0x00,0x00,0xEB,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x70,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x64,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x3A,0x89,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0xA1,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEA +,0x00,0x00,0x00,0x09,0x84,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0x84,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x48,0x84 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3B,0x89,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0xAF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDE,0x00 +,0x00,0x00,0x0C,0x85,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00 +,0x00,0xD9,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8D,0x87,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xCC,0x83,0x00,0x00,0x00 +,0xFF,0x05,0x02,0x02,0x02,0xFF,0x1C,0x1C,0x1C,0xFF,0x3C,0x3C,0x3C,0xFF,0x60 +,0x60,0x60,0xFF,0x73,0x73,0x73,0xFF,0x53,0x53,0x53,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x1F,0xEC,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0xAA,0x81,0x00,0x00,0x00,0xFF,0x02,0x13,0x13,0x13,0xFF,0x23,0x23,0x23,0xFF +,0x05,0x05,0x05,0xFF,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD0,0x00 +,0x00,0x00,0x30,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x61,0x81,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x1A,0x86,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0xB7,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xDA,0x00,0x00,0x00,0x09,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x1C,0x00,0x00,0x00,0xFA,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6B +,0x84,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 +,0x84,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xC2,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x56 +,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x3E,0x86 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x7C,0x81,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x0C,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x00,0x00,0x32,0x00,0x00,0x00,0xE4,0x82,0x00,0x00,0x00,0xFF,0x07,0x01,0x01 +,0x01,0xFF,0x20,0x20,0x20,0xFF,0x51,0x51,0x51,0xFF,0x63,0x63,0x63,0xFF,0x68 +,0x68,0x68,0xFF,0x6E,0x6E,0x6E,0xFF,0x73,0x73,0x73,0xFF,0x69,0x69,0x69,0xFF +,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x52,0xEC,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0xDD,0x81,0x00,0x00,0x00,0xFF,0x05,0x37,0x37,0x37,0xFF +,0x73,0x73,0x73,0xFF,0x6E,0x6E,0x6E,0xFF,0x4E,0x4E,0x4E,0xFF,0x2D,0x2D,0x2D +,0xFF,0x0B,0x0B,0x0B,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF4 +,0x00,0x00,0x00,0x51,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00 +,0x00,0x00,0xC3,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA8,0x86,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xEF,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x80,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x9D,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDF,0x00,0x00,0x00 +,0x04,0x83,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 +,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x38,0x84,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x4B,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0xCB,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8F,0x86,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0xF6,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x54,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x34 +,0x00,0x00,0x00,0xF5,0x82,0x00,0x00,0x00,0xFF,0x09,0x10,0x10,0x10,0xFF,0x44 +,0x44,0x44,0xFF,0x56,0x56,0x56,0xFF,0x5C,0x5C,0x5C,0xFF,0x61,0x61,0x61,0xFF +,0x66,0x66,0x66,0xFF,0x6C,0x6C,0x6C,0xFF,0x71,0x71,0x71,0xFF,0x73,0x73,0x73 +,0xFF,0x0C,0x0C,0x0C,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x84 +,0xEB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x10,0x82,0x00,0x00,0x00,0xFF +,0x07,0x4E,0x4E,0x4E,0xFF,0x73,0x73,0x73,0xFF,0x6F,0x6F,0x6F,0xFF,0x69,0x69 +,0x69,0xFF,0x64,0x64,0x64,0xFF,0x5D,0x5D,0x5D,0xFF,0x35,0x35,0x35,0xFF,0x09 +,0x09,0x09,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00 +,0x00,0x7B,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x2D,0x00,0x00,0x00 +,0xFB,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x44,0x86,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x5E,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xE6,0x00,0x00,0x00,0x04,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x27 +,0x00,0x00,0x00,0xFD,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5A,0x83 +,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x83 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xD3,0x00,0x00,0x00,0x01,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x33,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE6,0x00,0x00 +,0x00,0x09,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB3,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xB7,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x08,0x00,0x00,0x00,0xD7,0x82,0x00,0x00,0x00,0xFF,0x0A,0x17,0x17,0x17 +,0xFF,0x47,0x47,0x47,0xFF,0x4F,0x4F,0x4F,0xFF,0x54,0x54,0x54,0xFF,0x5A,0x5A +,0x5A,0xFF,0x5F,0x5F,0x5F,0xFF,0x64,0x64,0x64,0xFF,0x6A,0x6A,0x6A,0xFF,0x6F +,0x6F,0x6F,0xFF,0x73,0x73,0x73,0xFF,0x23,0x23,0x23,0xFF,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xB6,0xEB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x41,0x82,0x00,0x00,0x00,0xFF,0x08,0x65,0x65,0x65,0xFF,0x72,0x72,0x72,0xFF +,0x6D,0x6D,0x6D,0xFF,0x67,0x67,0x67,0xFF,0x62,0x62,0x62,0xFF,0x5D,0x5D,0x5D +,0xFF,0x57,0x57,0x57,0xFF,0x4F,0x4F,0x4F,0xFF,0x26,0x26,0x26,0xFF,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7E,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x8B,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD8,0x00,0x00 +,0x00,0x01,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCE,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x54,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0xAB,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCA,0x83,0xFF,0xFF +,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x82,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xF8,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x5D,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x9C,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83,0x86,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x25,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xF7,0x00,0x00,0x00,0x23,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x90 +,0x82,0x00,0x00,0x00,0xFF,0x0B,0x1B,0x1B,0x1B,0xFF,0x42,0x42,0x42,0xFF,0x48 +,0x48,0x48,0xFF,0x4D,0x4D,0x4D,0xFF,0x52,0x52,0x52,0xFF,0x58,0x58,0x58,0xFF +,0x5D,0x5D,0x5D,0xFF,0x62,0x62,0x62,0xFF,0x68,0x68,0x68,0xFF,0x6D,0x6D,0x6D +,0xFF,0x72,0x72,0x72,0xFF,0x3A,0x3A,0x3A,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xE8,0xEB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x74,0x81 +,0x00,0x00,0x00,0xFF,0x0B,0x09,0x09,0x09,0xFF,0x73,0x73,0x73,0xFF,0x70,0x70 +,0x70,0xFF,0x6B,0x6B,0x6B,0xFF,0x65,0x65,0x65,0xFF,0x60,0x60,0x60,0xFF,0x5B +,0x5B,0x5B,0xFF,0x55,0x55,0x55,0xFF,0x50,0x50,0x50,0xFF,0x4B,0x4B,0x4B,0xFF +,0x2D,0x2D,0x2D,0xFF,0x02,0x02,0x02,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xFB,0x00,0x00,0x00,0x35,0x87,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x0C,0x00,0x00,0x00,0xE4,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x40,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x66,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xBD,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x33,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x25,0x82,0xFF,0xFF,0xFF +,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x82,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x62,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xE6,0x00,0x00,0x00,0x04,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0F +,0x00,0x00,0x00,0xF5,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00 +,0x00,0x00,0x1E,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x85,0x81,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9A,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x00,0x00,0x42,0x00,0x00,0x00,0xFE,0x81,0x00,0x00,0x00,0xFF,0x0C,0x0C,0x0C +,0x0C,0xFF,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40,0xFF,0x46,0x46,0x46,0xFF,0x4B +,0x4B,0x4B,0xFF,0x50,0x50,0x50,0xFF,0x56,0x56,0x56,0xFF,0x5B,0x5B,0x5B,0xFF +,0x60,0x60,0x60,0xFF,0x66,0x66,0x66,0xFF,0x6B,0x6B,0x6B,0xFF,0x70,0x70,0x70 +,0xFF,0x50,0x50,0x50,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x1A +,0xEA,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA6,0x81,0x00,0x00,0x00,0xFF +,0x0C,0x1F,0x1F,0x1F,0xFF,0x73,0x73,0x73,0xFF,0x6E,0x6E,0x6E,0xFF,0x69,0x69 +,0x69,0xFF,0x63,0x63,0x63,0xFF,0x5E,0x5E,0x5E,0xFF,0x59,0x59,0x59,0xFF,0x53 +,0x53,0x53,0xFF,0x4E,0x4E,0x4E,0xFF,0x49,0x49,0x49,0xFF,0x43,0x43,0x43,0xFF +,0x2F,0x2F,0x2F,0xFF,0x01,0x01,0x01,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xD7,0x00,0x00,0x00,0x09,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x7E,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA1,0x86,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xF2,0x81,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x26,0x89,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0xCD,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7F +,0x82,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 +,0x82,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xBD,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x8F,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6D +,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB3,0x86,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE4,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x38,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC5,0x81 +,0x00,0x00,0x00,0xFF,0x0D,0x02,0x02,0x02,0xFF,0x2C,0x2C,0x2C,0xFF,0x39,0x39 +,0x39,0xFF,0x3E,0x3E,0x3E,0xFF,0x44,0x44,0x44,0xFF,0x49,0x49,0x49,0xFF,0x4E +,0x4E,0x4E,0xFF,0x54,0x54,0x54,0xFF,0x59,0x59,0x59,0xFF,0x5E,0x5E,0x5E,0xFF +,0x64,0x64,0x64,0xFF,0x69,0x69,0x69,0xFF,0x6E,0x6E,0x6E,0xFF,0x67,0x67,0x67 +,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4D,0xEA,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0xD9,0x81,0x00,0x00,0x00,0xFF,0x0C,0x36,0x36,0x36 +,0xFF,0x71,0x71,0x71,0xFF,0x6C,0x6C,0x6C,0xFF,0x67,0x67,0x67,0xFF,0x61,0x61 +,0x61,0xFF,0x5C,0x5C,0x5C,0xFF,0x57,0x57,0x57,0xFF,0x51,0x51,0x51,0xFF,0x4C +,0x4C,0x4C,0xFF,0x47,0x47,0x47,0xFF,0x41,0x41,0x41,0xFF,0x3C,0x3C,0x3C,0xFF +,0x1D,0x1D,0x1D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x90,0x87 +,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xFD,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0xF5,0x00,0x00,0x00,0x0D,0x86,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x96,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8E +,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x74,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xD9,0x82,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 +,0x89,0x00,0x00,0x00,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1A +,0x00,0x00,0x00,0xFD,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x36,0x89 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD5,0x82,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x4B,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x48,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD7,0x86,0xFF,0xFF,0xFF,0x00,0x01 +,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xFE,0x81,0x00,0x00,0x00,0xFF,0x0E,0x18 +,0x18,0x18,0xFF,0x32,0x32,0x32,0xFF,0x37,0x37,0x37,0xFF,0x3C,0x3C,0x3C,0xFF +,0x42,0x42,0x42,0xFF,0x47,0x47,0x47,0xFF,0x4C,0x4C,0x4C,0xFF,0x52,0x52,0x52 +,0xFF,0x57,0x57,0x57,0xFF,0x5C,0x5C,0x5C,0xFF,0x62,0x62,0x62,0xFF,0x67,0x67 +,0x67,0xFF,0x6C,0x6C,0x6C,0xFF,0x72,0x72,0x72,0xFF,0x0A,0x0A,0x0A,0xFF,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7F,0xE9,0xFF,0xFF,0xFF,0x00,0x01 +,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xFE,0x81,0x00,0x00,0x00,0xFF,0x0D,0x4C +,0x4C,0x4C,0xFF,0x6F,0x6F,0x6F,0xFF,0x6A,0x6A,0x6A,0xFF,0x65,0x65,0x65,0xFF +,0x5F,0x5F,0x5F,0xFF,0x5A,0x5A,0x5A,0xFF,0x55,0x55,0x55,0xFF,0x4F,0x4F,0x4F +,0xFF,0x4A,0x4A,0x4A,0xFF,0x45,0x45,0x45,0xFF,0x3F,0x3F,0x3F,0xFF,0x3A,0x3A +,0x3A,0xFF,0x35,0x35,0x35,0xFF,0x0B,0x0B,0x0B,0xFF,0x81,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x12,0x87,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0xBA,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x63,0x86 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x2F,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xED,0x00,0x00,0x00,0x08,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x00,0x00,0x1D,0x00,0x00,0x00,0xFE,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x33,0x81,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 +,0x00,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x70,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xDB,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x3E,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE1,0x00,0x00,0x00 +,0x02,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA9,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x75,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x6E,0x81,0x00,0x00,0x00,0xFF,0x0F,0x01,0x01,0x01,0xFF,0x27,0x27,0x27,0xFF +,0x30,0x30,0x30,0xFF,0x35,0x35,0x35,0xFF,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40 +,0xFF,0x45,0x45,0x45,0xFF,0x4A,0x4A,0x4A,0xFF,0x50,0x50,0x50,0xFF,0x55,0x55 +,0x55,0xFF,0x5A,0x5A,0x5A,0xFF,0x60,0x60,0x60,0xFF,0x65,0x65,0x65,0xFF,0x6A +,0x6A,0x6A,0xFF,0x70,0x70,0x70,0xFF,0x21,0x21,0x21,0xFF,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xB1,0xE9,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x3D,0x82,0x00,0x00,0x00,0xFF,0x0D,0x63,0x63,0x63,0xFF,0x6D,0x6D,0x6D,0xFF +,0x68,0x68,0x68,0xFF,0x63,0x63,0x63,0xFF,0x5D,0x5D,0x5D,0xFF,0x58,0x58,0x58 +,0xFF,0x53,0x53,0x53,0xFF,0x4D,0x4D,0x4D,0xFF,0x48,0x48,0x48,0xFF,0x43,0x43 +,0x43,0xFF,0x3D,0x3D,0x3D,0xFF,0x38,0x38,0x38,0xFF,0x33,0x33,0x33,0xFF,0x26 +,0x26,0x26,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0x87,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x58,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xC5,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC7,0x82,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5F,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0xC2,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x88,0x81,0xFF +,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x81,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB7,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x82,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA7,0x82,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7B,0x86,0xFF,0xFF,0xFF,0x00,0x04,0x00 +,0x00,0x00,0x12,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFB +,0x00,0x00,0x00,0x18,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC3,0x81 +,0x00,0x00,0x00,0xFF,0x0F,0x09,0x09,0x09,0xFF,0x28,0x28,0x28,0xFF,0x2E,0x2E +,0x2E,0xFF,0x33,0x33,0x33,0xFF,0x38,0x38,0x38,0xFF,0x3E,0x3E,0x3E,0xFF,0x43 +,0x43,0x43,0xFF,0x48,0x48,0x48,0xFF,0x4E,0x4E,0x4E,0xFF,0x53,0x53,0x53,0xFF +,0x58,0x58,0x58,0xFF,0x5E,0x5E,0x5E,0xFF,0x63,0x63,0x63,0xFF,0x68,0x68,0x68 +,0xFF,0x6E,0x6E,0x6E,0xFF,0x37,0x37,0x37,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xE3,0xE9,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x70,0x81 +,0x00,0x00,0x00,0xFF,0x0F,0x07,0x07,0x07,0xFF,0x71,0x71,0x71,0xFF,0x6B,0x6B +,0x6B,0xFF,0x66,0x66,0x66,0xFF,0x61,0x61,0x61,0xFF,0x5B,0x5B,0x5B,0xFF,0x56 +,0x56,0x56,0xFF,0x51,0x51,0x51,0xFF,0x4B,0x4B,0x4B,0xFF,0x46,0x46,0x46,0xFF +,0x41,0x41,0x41,0xFF,0x3B,0x3B,0x3B,0xFF,0x36,0x36,0x36,0xFF,0x31,0x31,0x31 +,0xFF,0x2B,0x2B,0x2B,0xFF,0x08,0x08,0x08,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB6,0x87,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x08,0x00 +,0x00,0x00,0xEE,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x26,0x86,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x60,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xC3,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x69,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC9,0x81,0xFF,0xFF,0xFF,0x00,0x89,0x00 +,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x02,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x03,0x00,0x00,0x00,0xF2,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x34,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xEF,0x81,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x19,0x86,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x65,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB3 +,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0xFE,0x81 +,0x00,0x00,0x00,0xFF,0x0F,0x13,0x13,0x13,0xFF,0x26,0x26,0x26,0xFF,0x2C,0x2C +,0x2C,0xFF,0x31,0x31,0x31,0xFF,0x36,0x36,0x36,0xFF,0x3C,0x3C,0x3C,0xFF,0x41 +,0x41,0x41,0xFF,0x46,0x46,0x46,0xFF,0x4C,0x4C,0x4C,0xFF,0x51,0x51,0x51,0xFF +,0x56,0x56,0x56,0xFF,0x5C,0x5C,0x5C,0xFF,0x61,0x61,0x61,0xFF,0x66,0x66,0x66 +,0xFF,0x6C,0x6C,0x6C,0xFF,0x4D,0x4D,0x4D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x16,0xE8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA2,0x81 +,0x00,0x00,0x00,0xFF,0x0F,0x1D,0x1D,0x1D,0xFF,0x6F,0x6F,0x6F,0xFF,0x69,0x69 +,0x69,0xFF,0x64,0x64,0x64,0xFF,0x5F,0x5F,0x5F,0xFF,0x59,0x59,0x59,0xFF,0x54 +,0x54,0x54,0xFF,0x4F,0x4F,0x4F,0xFF,0x49,0x49,0x49,0xFF,0x44,0x44,0x44,0xFF +,0x3F,0x3F,0x3F,0xFF,0x39,0x39,0x39,0xFF,0x34,0x34,0x34,0xFF,0x2F,0x2F,0x2F +,0xFF,0x29,0x29,0x29,0xFF,0x14,0x14,0x14,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x11,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x95,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x77,0x86,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xEF,0x81,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x05,0x88,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x22,0x83,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00 +,0xFB,0x00,0x00,0x00,0x0C,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x35,0x83,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x03,0x88,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0x21,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xC0,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9A,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x4C,0x82,0x00,0x00,0x00,0xFF,0x0F,0x1C,0x1C,0x1C,0xFF,0x24,0x24,0x24 +,0xFF,0x2A,0x2A,0x2A,0xFF,0x2F,0x2F,0x2F,0xFF,0x34,0x34,0x34,0xFF,0x3A,0x3A +,0x3A,0xFF,0x3F,0x3F,0x3F,0xFF,0x44,0x44,0x44,0xFF,0x4A,0x4A,0x4A,0xFF,0x4F +,0x4F,0x4F,0xFF,0x54,0x54,0x54,0xFF,0x5A,0x5A,0x5A,0xFF,0x5F,0x5F,0x5F,0xFF +,0x64,0x64,0x64,0xFF,0x6A,0x6A,0x6A,0xFF,0x62,0x62,0x62,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x48,0xE8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0xD4,0x81,0x00,0x00,0x00,0xFF,0x0F,0x33,0x33,0x33,0xFF,0x6D,0x6D,0x6D +,0xFF,0x67,0x67,0x67,0xFF,0x62,0x62,0x62,0xFF,0x5D,0x5D,0x5D,0xFF,0x57,0x57 +,0x57,0xFF,0x52,0x52,0x52,0xFF,0x4D,0x4D,0x4D,0xFF,0x47,0x47,0x47,0xFF,0x42 +,0x42,0x42,0xFF,0x3D,0x3D,0x3D,0xFF,0x37,0x37,0x37,0xFF,0x32,0x32,0x32,0xFF +,0x2D,0x2D,0x2D,0xFF,0x27,0x27,0x27,0xFF,0x1E,0x1E,0x1E,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x60,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x51,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA8,0x87,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0xB6,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x2F,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xE3,0x83,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0x46,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x74 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB7,0x89,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x52,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8E +,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCB,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x2F,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x5D +,0x81,0x00,0x00,0x00,0xFF,0x11,0x01,0x01,0x01,0xFF,0x1F,0x1F,0x1F,0xFF,0x22 +,0x22,0x22,0xFF,0x28,0x28,0x28,0xFF,0x2D,0x2D,0x2D,0xFF,0x32,0x32,0x32,0xFF +,0x38,0x38,0x38,0xFF,0x3D,0x3D,0x3D,0xFF,0x42,0x42,0x42,0xFF,0x48,0x48,0x48 +,0xFF,0x4D,0x4D,0x4D,0xFF,0x52,0x52,0x52,0xFF,0x58,0x58,0x58,0xFF,0x5D,0x5D +,0x5D,0xFF,0x62,0x62,0x62,0xFF,0x68,0x68,0x68,0xFF,0x6D,0x6D,0x6D,0xFF,0x08 +,0x08,0x08,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7A,0xE7,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xFC,0x81,0x00,0x00 +,0x00,0xFF,0x10,0x48,0x48,0x48,0xFF,0x6B,0x6B,0x6B,0xFF,0x65,0x65,0x65,0xFF +,0x60,0x60,0x60,0xFF,0x5B,0x5B,0x5B,0xFF,0x55,0x55,0x55,0xFF,0x50,0x50,0x50 +,0xFF,0x4B,0x4B,0x4B,0xFF,0x45,0x45,0x45,0xFF,0x40,0x40,0x40,0xFF,0x3B,0x3B +,0x3B,0xFF,0x35,0x35,0x35,0xFF,0x30,0x30,0x30,0xFF,0x2B,0x2B,0x2B,0xFF,0x25 +,0x25,0x25,0xFF,0x20,0x20,0x20,0xFF,0x05,0x05,0x05,0xFF,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x94,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x21,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD9,0x87,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x85,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x60,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA4,0x83,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0x85,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 +,0x89,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xB2,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x79,0x89,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x83,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5E,0x86 +,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF7,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x05,0x86,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x6F,0x81,0x00,0x00,0x00,0xFF,0x11,0x03,0x03,0x03,0xFF +,0x1F,0x1F,0x1F,0xFF,0x20,0x20,0x20,0xFF,0x26,0x26,0x26,0xFF,0x2B,0x2B,0x2B +,0xFF,0x30,0x30,0x30,0xFF,0x36,0x36,0x36,0xFF,0x3B,0x3B,0x3B,0xFF,0x40,0x40 +,0x40,0xFF,0x46,0x46,0x46,0xFF,0x4B,0x4B,0x4B,0xFF,0x50,0x50,0x50,0xFF,0x56 +,0x56,0x56,0xFF,0x5B,0x5B,0x5B,0xFF,0x60,0x60,0x60,0xFF,0x66,0x66,0x66,0xFF +,0x6B,0x6B,0x6B,0xFF,0x1E,0x1E,0x1E,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xAC,0xE7,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x39,0x82,0x00 +,0x00,0x00,0xFF,0x10,0x5D,0x5D,0x5D,0xFF,0x69,0x69,0x69,0xFF,0x63,0x63,0x63 +,0xFF,0x5E,0x5E,0x5E,0xFF,0x59,0x59,0x59,0xFF,0x53,0x53,0x53,0xFF,0x4E,0x4E +,0x4E,0xFF,0x49,0x49,0x49,0xFF,0x43,0x43,0x43,0xFF,0x3E,0x3E,0x3E,0xFF,0x39 +,0x39,0x39,0xFF,0x33,0x33,0x33,0xFF,0x2E,0x2E,0x2E,0xFF,0x29,0x29,0x29,0xFF +,0x23,0x23,0x23,0xFF,0x1F,0x1F,0x1F,0xFF,0x09,0x09,0x09,0xFF,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xA5,0x88,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00 +,0x00,0xEF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x0C,0x86 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x54,0x82,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x91,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x66,0x83 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC4,0xFF,0xFF,0xFF,0x00,0x89,0x00 +,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0xEC,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3A,0x89,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0xB3,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x2E,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x2C,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xCB,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x80,0x81,0x00,0x00,0x00,0xFF,0x00,0x05,0x05,0x05,0xFF,0x81,0x1F,0x1F +,0x1F,0xFF,0x0E,0x24,0x24,0x24,0xFF,0x29,0x29,0x29,0xFF,0x2E,0x2E,0x2E,0xFF +,0x34,0x34,0x34,0xFF,0x39,0x39,0x39,0xFF,0x3E,0x3E,0x3E,0xFF,0x44,0x44,0x44 +,0xFF,0x49,0x49,0x49,0xFF,0x4E,0x4E,0x4E,0xFF,0x54,0x54,0x54,0xFF,0x59,0x59 +,0x59,0xFF,0x5E,0x5E,0x5E,0xFF,0x64,0x64,0x64,0xFF,0x69,0x69,0x69,0xFF,0x33 +,0x33,0x33,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDE,0xE7,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6C,0x81,0x00,0x00,0x00,0xFF,0x11,0x05 +,0x05,0x05,0xFF,0x6B,0x6B,0x6B,0xFF,0x67,0x67,0x67,0xFF,0x61,0x61,0x61,0xFF +,0x5C,0x5C,0x5C,0xFF,0x57,0x57,0x57,0xFF,0x51,0x51,0x51,0xFF,0x4C,0x4C,0x4C +,0xFF,0x47,0x47,0x47,0xFF,0x41,0x41,0x41,0xFF,0x3C,0x3C,0x3C,0xFF,0x37,0x37 +,0x37,0xFF,0x31,0x31,0x31,0xFF,0x2C,0x2C,0x2C,0xFF,0x27,0x27,0x27,0xFF,0x21 +,0x21,0x21,0xFF,0x1F,0x1F,0x1F,0xFF,0x0B,0x0B,0x0B,0xFF,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xB5,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0xBF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3B,0x86,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x23,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xC2,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x27,0x83,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00,0x00,0x01,0x89,0x00,0x00,0x00,0x00 +,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x83,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x05,0x89,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0xE4,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00 +,0x00,0x00,0x04,0x86,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x5D,0x81,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9A,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x92,0x81,0x00,0x00,0x00,0xFF,0x00,0x07,0x07,0x07,0xFF,0x81,0x1F +,0x1F,0x1F,0xFF,0x0E,0x22,0x22,0x22,0xFF,0x27,0x27,0x27,0xFF,0x2C,0x2C,0x2C +,0xFF,0x32,0x32,0x32,0xFF,0x37,0x37,0x37,0xFF,0x3C,0x3C,0x3C,0xFF,0x42,0x42 +,0x42,0xFF,0x47,0x47,0x47,0xFF,0x4C,0x4C,0x4C,0xFF,0x52,0x52,0x52,0xFF,0x57 +,0x57,0x57,0xFF,0x5C,0x5C,0x5C,0xFF,0x62,0x62,0x62,0xFF,0x67,0x67,0x67,0xFF +,0x48,0x48,0x48,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x11,0xE6 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9E,0x81,0x00,0x00,0x00,0xFF,0x0E +,0x1A,0x1A,0x1A,0xFF,0x6A,0x6A,0x6A,0xFF,0x65,0x65,0x65,0xFF,0x5F,0x5F,0x5F +,0xFF,0x5A,0x5A,0x5A,0xFF,0x55,0x55,0x55,0xFF,0x4F,0x4F,0x4F,0xFF,0x4A,0x4A +,0x4A,0xFF,0x45,0x45,0x45,0xFF,0x3F,0x3F,0x3F,0xFF,0x3A,0x3A,0x3A,0xFF,0x35 +,0x35,0x35,0xFF,0x2F,0x2F,0x2F,0xFF,0x2A,0x2A,0x2A,0xFF,0x25,0x25,0x25,0xFF +,0x81,0x1F,0x1F,0x1F,0xFF,0x00,0x0D,0x0D,0x0D,0xFF,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xC6,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x8F +,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6B,0x86,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xF0,0x81,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x01,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0xEF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x1C,0x89,0x00 +,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD5,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x15,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCD,0x87,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x8D,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x68,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA4,0x81,0x00 +,0x00,0x00,0xFF,0x00,0x09,0x09,0x09,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x0D,0x25 +,0x25,0x25,0xFF,0x2A,0x2A,0x2A,0xFF,0x30,0x30,0x30,0xFF,0x35,0x35,0x35,0xFF +,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40,0xFF,0x45,0x45,0x45,0xFF,0x4A,0x4A,0x4A +,0xFF,0x50,0x50,0x50,0xFF,0x55,0x55,0x55,0xFF,0x5A,0x5A,0x5A,0xFF,0x60,0x60 +,0x60,0xFF,0x65,0x65,0x65,0xFF,0x5B,0x5B,0x5B,0xFF,0x82,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x43,0xE6,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD0 +,0x81,0x00,0x00,0x00,0xFF,0x0E,0x2F,0x2F,0x2F,0xFF,0x68,0x68,0x68,0xFF,0x63 +,0x63,0x63,0xFF,0x5D,0x5D,0x5D,0xFF,0x58,0x58,0x58,0xFF,0x53,0x53,0x53,0xFF +,0x4D,0x4D,0x4D,0xFF,0x48,0x48,0x48,0xFF,0x43,0x43,0x43,0xFF,0x3D,0x3D,0x3D +,0xFF,0x38,0x38,0x38,0xFF,0x33,0x33,0x33,0xFF,0x2D,0x2D,0x2D,0xFF,0x28,0x28 +,0x28,0xFF,0x23,0x23,0x23,0xFF,0x81,0x1F,0x1F,0x1F,0xFF,0x00,0x10,0x10,0x10 +,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD6,0x88,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x5E,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x9C,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC1,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x24,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0xCA,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x41,0x89,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xB1,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x46,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9C,0x87,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0xBC,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x38,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA6,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x0A,0x0A,0x0A,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x0E,0x23,0x23,0x23 +,0xFF,0x28,0x28,0x28,0xFF,0x2E,0x2E,0x2E,0xFF,0x33,0x33,0x33,0xFF,0x38,0x38 +,0x38,0xFF,0x3E,0x3E,0x3E,0xFF,0x43,0x43,0x43,0xFF,0x48,0x48,0x48,0xFF,0x4E +,0x4E,0x4E,0xFF,0x53,0x53,0x53,0xFF,0x58,0x58,0x58,0xFF,0x5E,0x5E,0x5E,0xFF +,0x63,0x63,0x63,0xFF,0x68,0x68,0x68,0xFF,0x06,0x06,0x06,0xFF,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x75,0xE5,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x08,0x00,0x00,0x00,0xFB,0x81,0x00,0x00,0x00,0xFF,0x0E,0x43,0x43,0x43 +,0xFF,0x66,0x66,0x66,0xFF,0x61,0x61,0x61,0xFF,0x5B,0x5B,0x5B,0xFF,0x56,0x56 +,0x56,0xFF,0x51,0x51,0x51,0xFF,0x4B,0x4B,0x4B,0xFF,0x46,0x46,0x46,0xFF,0x41 +,0x41,0x41,0xFF,0x3B,0x3B,0x3B,0xFF,0x36,0x36,0x36,0xFF,0x31,0x31,0x31,0xFF +,0x2B,0x2B,0x2B,0xFF,0x26,0x26,0x26,0xFF,0x21,0x21,0x21,0xFF,0x81,0x1F,0x1F +,0x1F,0xFF,0x00,0x12,0x12,0x12,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xE6,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x31,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xC4,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x90,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x55,0x89,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0xA6,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x67,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x81,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8D,0x89,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0x77,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x6C,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC9,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x25,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x86,0x81,0x00,0x00,0x00,0xFF,0x00,0x06,0x06,0x06,0xFF,0x82,0x1F,0x1F +,0x1F,0xFF,0x0E,0x21,0x21,0x21,0xFF,0x26,0x26,0x26,0xFF,0x2C,0x2C,0x2C,0xFF +,0x31,0x31,0x31,0xFF,0x36,0x36,0x36,0xFF,0x3C,0x3C,0x3C,0xFF,0x41,0x41,0x41 +,0xFF,0x46,0x46,0x46,0xFF,0x4C,0x4C,0x4C,0xFF,0x51,0x51,0x51,0xFF,0x56,0x56 +,0x56,0xFF,0x5C,0x5C,0x5C,0xFF,0x61,0x61,0x61,0xFF,0x66,0x66,0x66,0xFF,0x1B +,0x1B,0x1B,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA7,0xE5,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x35,0x82,0x00,0x00,0x00,0xFF,0x0D,0x56 +,0x56,0x56,0xFF,0x64,0x64,0x64,0xFF,0x5F,0x5F,0x5F,0xFF,0x59,0x59,0x59,0xFF +,0x54,0x54,0x54,0xFF,0x4F,0x4F,0x4F,0xFF,0x49,0x49,0x49,0xFF,0x44,0x44,0x44 +,0xFF,0x3F,0x3F,0x3F,0xFF,0x39,0x39,0x39,0xFF,0x34,0x34,0x34,0xFF,0x2F,0x2F +,0x2F,0xFF,0x29,0x29,0x29,0xFF,0x24,0x24,0x24,0xFF,0x82,0x1F,0x1F,0x1F,0xFF +,0x00,0x12,0x12,0x12,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE9 +,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x24,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xCA,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x5F +,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x85,0x89,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x82,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C +,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x68,0x89,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x8F,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x49 +,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCB,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x22,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x65 +,0x81,0x00,0x00,0x00,0xFF,0x00,0x02,0x02,0x02,0xFF,0x83,0x1F,0x1F,0x1F,0xFF +,0x0D,0x24,0x24,0x24,0xFF,0x2A,0x2A,0x2A,0xFF,0x2F,0x2F,0x2F,0xFF,0x34,0x34 +,0x34,0xFF,0x3A,0x3A,0x3A,0xFF,0x3F,0x3F,0x3F,0xFF,0x44,0x44,0x44,0xFF,0x4A +,0x4A,0x4A,0xFF,0x4F,0x4F,0x4F,0xFF,0x54,0x54,0x54,0xFF,0x5A,0x5A,0x5A,0xFF +,0x5F,0x5F,0x5F,0xFF,0x64,0x64,0x64,0xFF,0x2F,0x2F,0x2F,0xFF,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xD9,0xE5,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x68,0x81,0x00,0x00,0x00,0xFF,0x0E,0x03,0x03,0x03,0xFF,0x65,0x65,0x65 +,0xFF,0x62,0x62,0x62,0xFF,0x5D,0x5D,0x5D,0xFF,0x57,0x57,0x57,0xFF,0x52,0x52 +,0x52,0xFF,0x4D,0x4D,0x4D,0xFF,0x47,0x47,0x47,0xFF,0x42,0x42,0x42,0xFF,0x3D +,0x3D,0x3D,0xFF,0x37,0x37,0x37,0xFF,0x32,0x32,0x32,0xFF,0x2D,0x2D,0x2D,0xFF +,0x27,0x27,0x27,0xFF,0x22,0x22,0x22,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x00,0x0D +,0x0D,0x0D,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCA,0x88,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x21,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xCC,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x48,0x82,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8E,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x5E,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB1,0x89,0x00 +,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x46,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x8D,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x49,0x87,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCE,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x1E,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x45,0x82,0x00 +,0x00,0x00,0xFF,0x00,0x1D,0x1D,0x1D,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x0D,0x22 +,0x22,0x22,0xFF,0x28,0x28,0x28,0xFF,0x2D,0x2D,0x2D,0xFF,0x32,0x32,0x32,0xFF +,0x38,0x38,0x38,0xFF,0x3D,0x3D,0x3D,0xFF,0x42,0x42,0x42,0xFF,0x48,0x48,0x48 +,0xFF,0x4D,0x4D,0x4D,0xFF,0x52,0x52,0x52,0xFF,0x58,0x58,0x58,0xFF,0x5D,0x5D +,0x5D,0xFF,0x62,0x62,0x62,0xFF,0x43,0x43,0x43,0xFF,0x81,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x0D,0xE4,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x9A,0x81,0x00,0x00,0x00,0xFF,0x0E,0x17,0x17,0x17,0xFF,0x65 +,0x65,0x65,0xFF,0x60,0x60,0x60,0xFF,0x5B,0x5B,0x5B,0xFF,0x55,0x55,0x55,0xFF +,0x50,0x50,0x50,0xFF,0x4B,0x4B,0x4B,0xFF,0x45,0x45,0x45,0xFF,0x40,0x40,0x40 +,0xFF,0x3B,0x3B,0x3B,0xFF,0x35,0x35,0x35,0xFF,0x30,0x30,0x30,0xFF,0x2B,0x2B +,0x2B,0xFF,0x25,0x25,0x25,0xFF,0x20,0x20,0x20,0xFF,0x82,0x1F,0x1F,0x1F,0xFF +,0x00,0x09,0x09,0x09,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA8 +,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x1D,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xCE,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x49 +,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0x89,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x3F,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC4 +,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x35,0x89,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x8B,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4A +,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD0,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x1B,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x24 +,0x82,0x00,0x00,0x00,0xFF,0x00,0x19,0x19,0x19,0xFF,0x82,0x1F,0x1F,0x1F,0xFF +,0x0D,0x20,0x20,0x20,0xFF,0x26,0x26,0x26,0xFF,0x2B,0x2B,0x2B,0xFF,0x30,0x30 +,0x30,0xFF,0x36,0x36,0x36,0xFF,0x3B,0x3B,0x3B,0xFF,0x40,0x40,0x40,0xFF,0x46 +,0x46,0x46,0xFF,0x4B,0x4B,0x4B,0xFF,0x50,0x50,0x50,0xFF,0x56,0x56,0x56,0xFF +,0x5B,0x5B,0x5B,0xFF,0x60,0x60,0x60,0xFF,0x56,0x56,0x56,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x3E,0xE4,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0xCC,0x81,0x00,0x00,0x00,0xFF,0x0D,0x2B,0x2B,0x2B,0xFF,0x63,0x63,0x63 +,0xFF,0x5E,0x5E,0x5E,0xFF,0x59,0x59,0x59,0xFF,0x53,0x53,0x53,0xFF,0x4E,0x4E +,0x4E,0xFF,0x49,0x49,0x49,0xFF,0x43,0x43,0x43,0xFF,0x3E,0x3E,0x3E,0xFF,0x39 +,0x39,0x39,0xFF,0x33,0x33,0x33,0xFF,0x2E,0x2E,0x2E,0xFF,0x29,0x29,0x29,0xFF +,0x23,0x23,0x23,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x00,0x05,0x05,0x05,0xFF,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x86,0x88,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x1A,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD1,0x87 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x4A,0x82,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x8A,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x32,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x2A,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x89,0x82 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4B,0x87,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0xD2,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x17,0x87 +,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xFD,0x81,0x00 +,0x00,0x00,0xFF,0x00,0x15,0x15,0x15,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x0D,0x24 +,0x24,0x24,0xFF,0x29,0x29,0x29,0xFF,0x2E,0x2E,0x2E,0xFF,0x34,0x34,0x34,0xFF +,0x39,0x39,0x39,0xFF,0x3E,0x3E,0x3E,0xFF,0x44,0x44,0x44,0xFF,0x49,0x49,0x49 +,0xFF,0x4E,0x4E,0x4E,0xFF,0x54,0x54,0x54,0xFF,0x59,0x59,0x59,0xFF,0x5E,0x5E +,0x5E,0xFF,0x63,0x63,0x63,0xFF,0x05,0x05,0x05,0xFF,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x70,0xE3,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x05 +,0x00,0x00,0x00,0xF9,0x81,0x00,0x00,0x00,0xFF,0x0D,0x3F,0x3F,0x3F,0xFF,0x61 +,0x61,0x61,0xFF,0x5C,0x5C,0x5C,0xFF,0x57,0x57,0x57,0xFF,0x51,0x51,0x51,0xFF +,0x4C,0x4C,0x4C,0xFF,0x47,0x47,0x47,0xFF,0x41,0x41,0x41,0xFF,0x3C,0x3C,0x3C +,0xFF,0x37,0x37,0x37,0xFF,0x31,0x31,0x31,0xFF,0x2C,0x2C,0x2C,0xFF,0x27,0x27 +,0x27,0xFF,0x21,0x21,0x21,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x00,0x01,0x01,0x01 +,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x65,0x88,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x16,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xD3,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x4B,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x89,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x26,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDB,0x89,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE2,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x1E,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x87,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4C,0x87,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0xD5,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x14,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xE3,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x10,0x10,0x10,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x0D,0x22,0x22,0x22 +,0xFF,0x27,0x27,0x27,0xFF,0x2C,0x2C,0x2C,0xFF,0x32,0x32,0x32,0xFF,0x37,0x37 +,0x37,0xFF,0x3C,0x3C,0x3C,0xFF,0x42,0x42,0x42,0xFF,0x47,0x47,0x47,0xFF,0x4C +,0x4C,0x4C,0xFF,0x52,0x52,0x52,0xFF,0x57,0x57,0x57,0xFF,0x5C,0x5C,0x5C,0xFF +,0x62,0x62,0x62,0xFF,0x18,0x18,0x18,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0xA2,0xE3,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x31,0x82,0x00 +,0x00,0x00,0xFF,0x0C,0x51,0x51,0x51,0xFF,0x5F,0x5F,0x5F,0xFF,0x5A,0x5A,0x5A +,0xFF,0x55,0x55,0x55,0xFF,0x4F,0x4F,0x4F,0xFF,0x4A,0x4A,0x4A,0xFF,0x45,0x45 +,0x45,0xFF,0x3F,0x3F,0x3F,0xFF,0x3A,0x3A,0x3A,0xFF,0x35,0x35,0x35,0xFF,0x2F +,0x2F,0x2F,0xFF,0x2A,0x2A,0x2A,0xFF,0x25,0x25,0x25,0xFF,0x83,0x1F,0x1F,0x1F +,0xFF,0x00,0x1C,0x1C,0x1C,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x43,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x13,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xD5,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x4C,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x87,0x89,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x1A,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xE6,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0xEE,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x12,0x89,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x85,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x4D,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD7,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x11,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0xC2,0x81,0x00,0x00,0x00,0xFF,0x00,0x0B,0x0B,0x0B,0xFF,0x84,0x1F,0x1F,0x1F +,0xFF,0x0C,0x25,0x25,0x25,0xFF,0x2A,0x2A,0x2A,0xFF,0x30,0x30,0x30,0xFF,0x35 +,0x35,0x35,0xFF,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40,0xFF,0x45,0x45,0x45,0xFF +,0x4A,0x4A,0x4A,0xFF,0x50,0x50,0x50,0xFF,0x55,0x55,0x55,0xFF,0x5A,0x5A,0x5A +,0xFF,0x60,0x60,0x60,0xFF,0x2B,0x2B,0x2B,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xD4,0xE3,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x63,0x81 +,0x00,0x00,0x00,0xFF,0x0D,0x02,0x02,0x02,0xFF,0x61,0x61,0x61,0xFF,0x5D,0x5D +,0x5D,0xFF,0x58,0x58,0x58,0xFF,0x53,0x53,0x53,0xFF,0x4D,0x4D,0x4D,0xFF,0x48 +,0x48,0x48,0xFF,0x43,0x43,0x43,0xFF,0x3D,0x3D,0x3D,0xFF,0x38,0x38,0x38,0xFF +,0x33,0x33,0x33,0xFF,0x2D,0x2D,0x2D,0xFF,0x28,0x28,0x28,0xFF,0x23,0x23,0x23 +,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x00,0x18,0x18,0x18,0xFF,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x22,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x15,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD6,0x87,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x4D,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x85,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x0E,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xF1,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x00,0xF9,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x06,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x84,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x4E,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0xC3,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2E,0x88,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x8B,0x81,0x00,0x00,0x00,0xFF,0x00,0x03,0x03,0x03 +,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x0C,0x23,0x23,0x23,0xFF,0x28,0x28,0x28,0xFF +,0x2E,0x2E,0x2E,0xFF,0x33,0x33,0x33,0xFF,0x38,0x38,0x38,0xFF,0x3E,0x3E,0x3E +,0xFF,0x43,0x43,0x43,0xFF,0x48,0x48,0x48,0xFF,0x4E,0x4E,0x4E,0xFF,0x53,0x53 +,0x53,0xFF,0x58,0x58,0x58,0xFF,0x5E,0x5E,0x5E,0xFF,0x3E,0x3E,0x3E,0xFF,0x81 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x0A,0xE2,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x96,0x81,0x00,0x00,0x00,0xFF,0x0D,0x14 +,0x14,0x14,0xFF,0x61,0x61,0x61,0xFF,0x5B,0x5B,0x5B,0xFF,0x56,0x56,0x56,0xFF +,0x51,0x51,0x51,0xFF,0x4B,0x4B,0x4B,0xFF,0x46,0x46,0x46,0xFF,0x41,0x41,0x41 +,0xFF,0x3B,0x3B,0x3B,0xFF,0x36,0x36,0x36,0xFF,0x31,0x31,0x31,0xFF,0x2B,0x2B +,0x2B,0xFF,0x26,0x26,0x26,0xFF,0x21,0x21,0x21,0xFF,0x83,0x1F,0x1F,0x1F,0xFF +,0x00,0x13,0x13,0x13,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB +,0x00,0x00,0x00,0x04,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x3C,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB6,0x87,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x4E,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83,0x89 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xFC,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0xFC,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x03,0x89 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x4F,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x96,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5B,0x88,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x45,0x82,0x00,0x00,0x00,0xFF,0x00,0x19,0x19,0x19,0xFF,0x83 +,0x1F,0x1F,0x1F,0xFF,0x0C,0x21,0x21,0x21,0xFF,0x26,0x26,0x26,0xFF,0x2C,0x2C +,0x2C,0xFF,0x31,0x31,0x31,0xFF,0x36,0x36,0x36,0xFF,0x3C,0x3C,0x3C,0xFF,0x41 +,0x41,0x41,0xFF,0x46,0x46,0x46,0xFF,0x4C,0x4C,0x4C,0xFF,0x51,0x51,0x51,0xFF +,0x56,0x56,0x56,0xFF,0x5C,0x5C,0x5C,0xFF,0x50,0x50,0x50,0xFF,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x39,0xE2,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0xC8,0x81,0x00,0x00,0x00,0xFF,0x0C,0x27,0x27,0x27,0xFF,0x5F,0x5F,0x5F +,0xFF,0x59,0x59,0x59,0xFF,0x54,0x54,0x54,0xFF,0x4F,0x4F,0x4F,0xFF,0x49,0x49 +,0x49,0xFF,0x44,0x44,0x44,0xFF,0x3F,0x3F,0x3F,0xFF,0x39,0x39,0x39,0xFF,0x34 +,0x34,0x34,0xFF,0x2F,0x2F,0x2F,0xFF,0x29,0x29,0x29,0xFF,0x24,0x24,0x24,0xFF +,0x84,0x1F,0x1F,0x1F,0xFF,0x00,0x0A,0x0A,0x0A,0xFF,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xC4,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x69 +,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x89,0x87,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x4F,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x81 +,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x08,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xF8,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0xEF,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x12 +,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0x82,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x56,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6A +,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x87,0x88,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xF6,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x11,0x11,0x11,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x0C,0x24,0x24,0x24,0xFF,0x2A +,0x2A,0x2A,0xFF,0x2F,0x2F,0x2F,0xFF,0x34,0x34,0x34,0xFF,0x3A,0x3A,0x3A,0xFF +,0x3F,0x3F,0x3F,0xFF,0x44,0x44,0x44,0xFF,0x4A,0x4A,0x4A,0xFF,0x4F,0x4F,0x4F +,0xFF,0x54,0x54,0x54,0xFF,0x5A,0x5A,0x5A,0xFF,0x5E,0x5E,0x5E,0xFF,0x03,0x03 +,0x03,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6B,0xE1,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF6,0x81,0x00,0x00,0x00 +,0xFF,0x0C,0x3A,0x3A,0x3A,0xFF,0x5D,0x5D,0x5D,0xFF,0x57,0x57,0x57,0xFF,0x52 +,0x52,0x52,0xFF,0x4D,0x4D,0x4D,0xFF,0x47,0x47,0x47,0xFF,0x42,0x42,0x42,0xFF +,0x3D,0x3D,0x3D,0xFF,0x37,0x37,0x37,0xFF,0x32,0x32,0x32,0xFF,0x2D,0x2D,0x2D +,0xFF,0x27,0x27,0x27,0xFF,0x22,0x22,0x22,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x00 +,0x02,0x02,0x02,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7E,0x89 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x95,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x5D,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x61,0x82 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7D,0x89,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x17,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xEA,0x89 +,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x21,0x89,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x63,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x85,0x87 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x3D,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xB4,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB9,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x08,0x08,0x08,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x0C +,0x22,0x22,0x22,0xFF,0x28,0x28,0x28,0xFF,0x2D,0x2D,0x2D,0xFF,0x32,0x32,0x32 +,0xFF,0x38,0x38,0x38,0xFF,0x3D,0x3D,0x3D,0xFF,0x42,0x42,0x42,0xFF,0x48,0x48 +,0x48,0xFF,0x4D,0x4D,0x4D,0xFF,0x52,0x52,0x52,0xFF,0x58,0x58,0x58,0xFF,0x5D +,0x5D,0x5D,0xFF,0x15,0x15,0x15,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x9D,0xE1,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x2D,0x82,0x00,0x00 +,0x00,0xFF,0x0C,0x4C,0x4C,0x4C,0xFF,0x5B,0x5B,0x5B,0xFF,0x55,0x55,0x55,0xFF +,0x50,0x50,0x50,0xFF,0x4B,0x4B,0x4B,0xFF,0x45,0x45,0x45,0xFF,0x40,0x40,0x40 +,0xFF,0x3B,0x3B,0x3B,0xFF,0x35,0x35,0x35,0xFF,0x30,0x30,0x30,0xFF,0x2B,0x2B +,0x2B,0xFF,0x25,0x25,0x25,0xFF,0x20,0x20,0x20,0xFF,0x83,0x1F,0x1F,0x1F,0xFF +,0x00,0x18,0x18,0x18,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x38 +,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC2,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x30,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x96 +,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x54,0x89,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x26,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xDC +,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD2 +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x30,0x89,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x2E,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xBB +,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x11,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xE0,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x73 +,0x81,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0xFF,0x1E,0x1E,0x1E,0xFF,0x83 +,0x1F,0x1F,0x1F,0xFF,0x0C,0x20,0x20,0x20,0xFF,0x25,0x25,0x25,0xFF,0x2B,0x2B +,0x2B,0xFF,0x30,0x30,0x30,0xFF,0x36,0x36,0x36,0xFF,0x3B,0x3B,0x3B,0xFF,0x40 +,0x40,0x40,0xFF,0x46,0x46,0x46,0xFF,0x4B,0x4B,0x4B,0xFF,0x50,0x50,0x50,0xFF +,0x56,0x56,0x56,0xFF,0x5B,0x5B,0x5B,0xFF,0x28,0x28,0x28,0xFF,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF,0xE1,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x5F,0x81,0x00,0x00,0x00,0xFF,0x0C,0x02,0x02,0x02,0xFF,0x5B,0x5B,0x5B +,0xFF,0x59,0x59,0x59,0xFF,0x53,0x53,0x53,0xFF,0x4E,0x4E,0x4E,0xFF,0x49,0x49 +,0x49,0xFF,0x43,0x43,0x43,0xFF,0x3E,0x3E,0x3E,0xFF,0x39,0x39,0x39,0xFF,0x33 +,0x33,0x33,0xFF,0x2E,0x2E,0x2E,0xFF,0x29,0x29,0x29,0xFF,0x23,0x23,0x23,0xFF +,0x84,0x1F,0x1F,0x1F,0xFF,0x00,0x0F,0x0F,0x0F,0xFF,0x81,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x03,0x89,0xFF,0xFF,0xFF,0x00,0x03 +,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFC,0x00,0x00,0x00 +,0x07,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xCB,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x1F,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x35,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCE,0x89,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x3F,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x03,0x00,0x00,0x00,0xF5,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF +,0x00,0x00,0x00,0x01,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xE5,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x0E,0x88,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x2C,0x82,0x00,0x00,0x00,0xFF,0x00,0x16,0x16,0x16,0xFF,0x84 +,0x1F,0x1F,0x1F,0xFF,0x0B,0x24,0x24,0x24,0xFF,0x29,0x29,0x29,0xFF,0x2E,0x2E +,0x2E,0xFF,0x34,0x34,0x34,0xFF,0x39,0x39,0x39,0xFF,0x3E,0x3E,0x3E,0xFF,0x44 +,0x44,0x44,0xFF,0x49,0x49,0x49,0xFF,0x4E,0x4E,0x4E,0xFF,0x54,0x54,0x54,0xFF +,0x59,0x59,0x59,0xFF,0x39,0x39,0x39,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xFA,0x00,0x00,0x00,0x07,0xE0,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x92,0x81,0x00,0x00,0x00,0xFF,0x0C,0x11,0x11,0x11,0xFF,0x5C,0x5C,0x5C +,0xFF,0x57,0x57,0x57,0xFF,0x51,0x51,0x51,0xFF,0x4C,0x4C,0x4C,0xFF,0x47,0x47 +,0x47,0xFF,0x41,0x41,0x41,0xFF,0x3C,0x3C,0x3C,0xFF,0x37,0x37,0x37,0xFF,0x31 +,0x31,0x31,0xFF,0x2C,0x2C,0x2C,0xFF,0x27,0x27,0x27,0xFF,0x21,0x21,0x21,0xFF +,0x84,0x1F,0x1F,0x1F,0xFF,0x00,0x07,0x07,0x07,0xFF,0x81,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xAC,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x1D +,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xD7,0x87,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF9,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xE9,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x44,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC0,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB6,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x50,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC2,0x82 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x26,0x87,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0xB8,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x52,0x89 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xE6,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x0B,0x0B,0x0B,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x0B,0x22,0x22,0x22,0xFF,0x27 +,0x27,0x27,0xFF,0x2C,0x2C,0x2C,0xFF,0x32,0x32,0x32,0xFF,0x37,0x37,0x37,0xFF +,0x3C,0x3C,0x3C,0xFF,0x42,0x42,0x42,0xFF,0x47,0x47,0x47,0xFF,0x4C,0x4C,0x4C +,0xFF,0x52,0x52,0x52,0xFF,0x57,0x57,0x57,0xFF,0x4A,0x4A,0x4A,0xFF,0x82,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x34,0xE0,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0xC4,0x81,0x00,0x00,0x00,0xFF,0x0B,0x24,0x24,0x24,0xFF,0x5A,0x5A +,0x5A,0xFF,0x55,0x55,0x55,0xFF,0x4F,0x4F,0x4F,0xFF,0x4A,0x4A,0x4A,0xFF,0x45 +,0x45,0x45,0xFF,0x3F,0x3F,0x3F,0xFF,0x3A,0x3A,0x3A,0xFF,0x35,0x35,0x35,0xFF +,0x2F,0x2F,0x2F,0xFF,0x2A,0x2A,0x2A,0xFF,0x25,0x25,0x25,0xFF,0x84,0x1F,0x1F +,0x1F,0xFF,0x00,0x1D,0x1D,0x1D,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x66,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x70,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xA7,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x36,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB3,0x8A,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0x58,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xB0,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x9A,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x73,0x8A,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0x8D,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x5C,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6D,0x81,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xB5,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x94,0x82,0x00,0x00,0x00,0xFF,0x00,0x1A,0x1A,0x1A,0xFF,0x84,0x1F,0x1F +,0x1F,0xFF,0x0B,0x25,0x25,0x25,0xFF,0x2A,0x2A,0x2A,0xFF,0x30,0x30,0x30,0xFF +,0x35,0x35,0x35,0xFF,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40,0xFF,0x45,0x45,0x45 +,0xFF,0x4A,0x4A,0x4A,0xFF,0x50,0x50,0x50,0xFF,0x55,0x55,0x55,0xFF,0x58,0x58 +,0x58,0xFF,0x02,0x02,0x02,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x66,0xDF,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xF4 +,0x81,0x00,0x00,0x00,0xFF,0x0B,0x35,0x35,0x35,0xFF,0x58,0x58,0x58,0xFF,0x53 +,0x53,0x53,0xFF,0x4D,0x4D,0x4D,0xFF,0x48,0x48,0x48,0xFF,0x43,0x43,0x43,0xFF +,0x3D,0x3D,0x3D,0xFF,0x38,0x38,0x38,0xFF,0x33,0x33,0x33,0xFF,0x2D,0x2D,0x2D +,0xFF,0x28,0x28,0x28,0xFF,0x23,0x23,0x23,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x00 +,0x12,0x12,0x12,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x20,0x89 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD2,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x4E,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6B,0x82 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7E,0x8A,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x81,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8F,0x89 +,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9E,0x8A,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x57,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x92,0x87 +,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xF8,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x1B,0x88,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0xFA,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x0C,0x0C,0x0C,0xFF,0x84,0x1F,0x1F,0x1F,0xFF,0x0B,0x23,0x23,0x23,0xFF,0x28 +,0x28,0x28,0xFF,0x2E,0x2E,0x2E,0xFF,0x33,0x33,0x33,0xFF,0x38,0x38,0x38,0xFF +,0x3E,0x3E,0x3E,0xFF,0x43,0x43,0x43,0xFF,0x48,0x48,0x48,0xFF,0x4E,0x4E,0x4E +,0xFF,0x53,0x53,0x53,0xFF,0x58,0x58,0x58,0xFF,0x12,0x12,0x12,0xFF,0x81,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x98,0xDF,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x29,0x82,0x00,0x00,0x00,0xFF,0x0B,0x46,0x46,0x46,0xFF,0x56,0x56 +,0x56,0xFF,0x51,0x51,0x51,0xFF,0x4B,0x4B,0x4B,0xFF,0x46,0x46,0x46,0xFF,0x41 +,0x41,0x41,0xFF,0x3B,0x3B,0x3B,0xFF,0x36,0x36,0x36,0xFF,0x31,0x31,0x31,0xFF +,0x2B,0x2B,0x2B,0xFF,0x26,0x26,0x26,0xFF,0x21,0x21,0x21,0xFF,0x83,0x1F,0x1F +,0x1F,0xFF,0x01,0x1E,0x1E,0x1E,0xFF,0x04,0x04,0x04,0xFF,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0xCB,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x35,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x04 +,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA0,0x82,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x48,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xAB +,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x65,0x89,0x00,0x00,0x00,0x00 +,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xC9,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x22 +,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC8,0x88,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0xA7,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7B +,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9C,0x82,0x00,0x00,0x00,0xFF +,0x00,0x1B,0x1B,0x1B,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x0B,0x21,0x21,0x21,0xFF +,0x26,0x26,0x26,0xFF,0x2C,0x2C,0x2C,0xFF,0x31,0x31,0x31,0xFF,0x36,0x36,0x36 +,0xFF,0x3C,0x3C,0x3C,0xFF,0x41,0x41,0x41,0xFF,0x46,0x46,0x46,0xFF,0x4C,0x4C +,0x4C,0xFF,0x51,0x51,0x51,0xFF,0x56,0x56,0x56,0xFF,0x24,0x24,0x24,0xFF,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCB,0xDF,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x5B,0x81,0x00,0x00,0x00,0xFF,0x0B,0x01,0x01,0x01,0xFF,0x55 +,0x55,0x55,0xFF,0x54,0x54,0x54,0xFF,0x4F,0x4F,0x4F,0xFF,0x49,0x49,0x49,0xFF +,0x44,0x44,0x44,0xFF,0x3F,0x3F,0x3F,0xFF,0x39,0x39,0x39,0xFF,0x34,0x34,0x34 +,0xFF,0x2F,0x2F,0x2F,0xFF,0x29,0x29,0x29,0xFF,0x24,0x24,0x24,0xFF,0x84,0x1F +,0x1F,0x1F,0xFF,0x00,0x13,0x13,0x13,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x4E,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x97,0x81,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x88,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0xD6,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x13,0x8A,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD6,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x3B,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x1E,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF2,0x00,0x00 +,0x00,0x01,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xEB,0x81,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x07,0x87,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x44,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xDD,0x00,0x00,0x00,0x01,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x22 +,0x00,0x00,0x00,0xFB,0x81,0x00,0x00,0x00,0xFF,0x00,0x0C,0x0C,0x0C,0xFF,0x84 +,0x1F,0x1F,0x1F,0xFF,0x0A,0x24,0x24,0x24,0xFF,0x2A,0x2A,0x2A,0xFF,0x2F,0x2F +,0x2F,0xFF,0x34,0x34,0x34,0xFF,0x3A,0x3A,0x3A,0xFF,0x3F,0x3F,0x3F,0xFF,0x44 +,0x44,0x44,0xFF,0x4A,0x4A,0x4A,0xFF,0x4F,0x4F,0x4F,0xFF,0x54,0x54,0x54,0xFF +,0x35,0x35,0x35,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00 +,0x00,0x00,0x04,0xDE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x8E,0x81,0x00 +,0x00,0x00,0xFF,0x0B,0x0F,0x0F,0x0F,0xFF,0x57,0x57,0x57,0xFF,0x52,0x52,0x52 +,0xFF,0x4D,0x4D,0x4D,0xFF,0x47,0x47,0x47,0xFF,0x42,0x42,0x42,0xFF,0x3D,0x3D +,0x3D,0xFF,0x37,0x37,0x37,0xFF,0x32,0x32,0x32,0xFF,0x2D,0x2D,0x2D,0xFF,0x27 +,0x27,0x27,0xFF,0x22,0x22,0x22,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x01,0x1E,0x1E +,0x1E,0xFF,0x04,0x04,0x04,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xCF,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xF0 +,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x26,0x87,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xFD,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xDD,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06,0x00 +,0x00,0x00,0xFB,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x12,0x89,0x00 +,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00 +,0x00,0xF3,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x1E,0x8A,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0xB5,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x58,0x87,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 +,0xDF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x42,0x89,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0xA0,0x81,0x00,0x00,0x00,0xFF,0x01,0x01,0x01,0x01 +,0xFF,0x18,0x18,0x18,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x0A,0x22,0x22,0x22,0xFF +,0x28,0x28,0x28,0xFF,0x2D,0x2D,0x2D,0xFF,0x32,0x32,0x32,0xFF,0x38,0x38,0x38 +,0xFF,0x3D,0x3D,0x3D,0xFF,0x42,0x42,0x42,0xFF,0x48,0x48,0x48,0xFF,0x4D,0x4D +,0x4D,0xFF,0x52,0x52,0x52,0xFF,0x45,0x45,0x45,0xFF,0x82,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x2F,0xDE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0 +,0x81,0x00,0x00,0x00,0xFF,0x0B,0x20,0x20,0x20,0xFF,0x55,0x55,0x55,0xFF,0x50 +,0x50,0x50,0xFF,0x4B,0x4B,0x4B,0xFF,0x45,0x45,0x45,0xFF,0x40,0x40,0x40,0xFF +,0x3B,0x3B,0x3B,0xFF,0x35,0x35,0x35,0xFF,0x30,0x30,0x30,0xFF,0x2B,0x2B,0x2B +,0xFF,0x25,0x25,0x25,0xFF,0x20,0x20,0x20,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x00 +,0x13,0x13,0x13,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x52,0x89 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x5B,0x81,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xC2,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x71,0x82 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA0,0x8A,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x2C,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE8,0xFF +,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x01,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0xCB,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x55,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x60,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xBB,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x7E,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x89,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0xFC,0x81,0x00,0x00,0x00 +,0xFF,0x01,0x03,0x03,0x03,0xFF,0x1C,0x1C,0x1C,0xFF,0x82,0x1F,0x1F,0x1F,0xFF +,0x0B,0x20,0x20,0x20,0xFF,0x25,0x25,0x25,0xFF,0x2B,0x2B,0x2B,0xFF,0x30,0x30 +,0x30,0xFF,0x35,0x35,0x35,0xFF,0x3B,0x3B,0x3B,0xFF,0x40,0x40,0x40,0xFF,0x46 +,0x46,0x46,0xFF,0x4B,0x4B,0x4B,0xFF,0x50,0x50,0x50,0xFF,0x53,0x53,0x53,0xFF +,0x01,0x01,0x01,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0xDD +,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xF1,0x81,0x00 +,0x00,0x00,0xFF,0x0A,0x31,0x31,0x31,0xFF,0x53,0x53,0x53,0xFF,0x4E,0x4E,0x4E +,0xFF,0x49,0x49,0x49,0xFF,0x43,0x43,0x43,0xFF,0x3E,0x3E,0x3E,0xFF,0x39,0x39 +,0x39,0xFF,0x33,0x33,0x33,0xFF,0x2E,0x2E,0x2E,0xFF,0x29,0x29,0x29,0xFF,0x23 +,0x23,0x23,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x01,0x1C,0x1C,0x1C,0xFF,0x03,0x03 +,0x03,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD3,0x00,0x00,0x00 +,0x01,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xD9 +,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5F,0x88,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0xD4,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x41 +,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6B,0x83,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xBB,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x8F,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x00,0x00,0x0B,0x00,0x00,0x00,0xF2,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x20,0x87,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x1D,0x00,0x00,0x00,0xF9,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x66 +,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x81,0x82,0x00,0x00,0x00,0xFF +,0x01,0x06,0x06,0x06,0xFF,0x1E,0x1E,0x1E,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x0A +,0x24,0x24,0x24,0xFF,0x29,0x29,0x29,0xFF,0x2E,0x2E,0x2E,0xFF,0x34,0x34,0x34 +,0xFF,0x39,0x39,0x39,0xFF,0x3E,0x3E,0x3E,0xFF,0x44,0x44,0x44,0xFF,0x49,0x49 +,0x49,0xFF,0x4E,0x4E,0x4E,0xFF,0x54,0x54,0x54,0xFF,0x10,0x10,0x10,0xFF,0x81 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x93,0xDD,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x25,0x82,0x00,0x00,0x00,0xFF,0x0A,0x42,0x42,0x42,0xFF,0x51 +,0x51,0x51,0xFF,0x4C,0x4C,0x4C,0xFF,0x47,0x47,0x47,0xFF,0x41,0x41,0x41,0xFF +,0x3C,0x3C,0x3C,0xFF,0x37,0x37,0x37,0xFF,0x31,0x31,0x31,0xFF,0x2C,0x2C,0x2C +,0xFF,0x27,0x27,0x27,0xFF,0x21,0x21,0x21,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x01 +,0x1E,0x1E,0x1E,0xFF,0x06,0x06,0x06,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x57,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x94,0x81,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0x0A,0x87,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0x39,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xDD,0x00,0x00,0x00,0x01,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0xB2,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x7A,0xFF,0xFF,0xFF,0x00 +,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x4A,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE4,0x8B +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9B,0x82,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x85,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x77,0x81 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0x22,0x88,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xA9,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x0A,0x0A,0x0A,0xFF,0x1E,0x1E,0x1E,0xFF,0x81,0x1F,0x1F,0x1F +,0xFF,0x0A,0x22,0x22,0x22,0xFF,0x27,0x27,0x27,0xFF,0x2C,0x2C,0x2C,0xFF,0x32 +,0x32,0x32,0xFF,0x37,0x37,0x37,0xFF,0x3C,0x3C,0x3C,0xFF,0x42,0x42,0x42,0xFF +,0x47,0x47,0x47,0xFF,0x4C,0x4C,0x4C,0xFF,0x52,0x52,0x52,0xFF,0x20,0x20,0x20 +,0xFF,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC6,0xDD,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x57,0x82,0x00,0x00,0x00,0xFF,0x09,0x50,0x50,0x50 +,0xFF,0x4F,0x4F,0x4F,0xFF,0x4A,0x4A,0x4A,0xFF,0x45,0x45,0x45,0xFF,0x3F,0x3F +,0x3F,0xFF,0x3A,0x3A,0x3A,0xFF,0x35,0x35,0x35,0xFF,0x2F,0x2F,0x2F,0xFF,0x2A +,0x2A,0x2A,0xFF,0x25,0x25,0x25,0xFF,0x83,0x1F,0x1F,0x1F,0xFF,0x00,0x0B,0x0B +,0x0B,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xAD,0x00,0x00,0x00 +,0x01,0x88,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xFE +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x46,0x88,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0xAA,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x7C,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00 +,0xF3,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x35,0xFF,0xFF,0xFF,0x00 +,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x02,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0xF9,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x2C,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x39,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x13,0x87,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xC5,0x81,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xC2,0x00,0x00,0x00,0x02,0x88,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xCA,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x05,0x05,0x05,0xFF,0x19,0x19,0x19,0xFF,0x81,0x1F,0x1F,0x1F,0xFF,0x09,0x25 +,0x25,0x25,0xFF,0x2A,0x2A,0x2A,0xFF,0x30,0x30,0x30,0xFF,0x35,0x35,0x35,0xFF +,0x3A,0x3A,0x3A,0xFF,0x40,0x40,0x40,0xFF,0x45,0x45,0x45,0xFF,0x4A,0x4A,0x4A +,0xFF,0x50,0x50,0x50,0xFF,0x31,0x31,0x31,0xFF,0x81,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF5,0x00,0x00,0x00,0x03,0xDC,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x8A,0x81,0x00,0x00,0x00,0xFF,0x0A,0x0C,0x0C,0x0C,0xFF,0x53,0x53 +,0x53,0xFF,0x4D,0x4D,0x4D,0xFF,0x48,0x48,0x48,0xFF,0x43,0x43,0x43,0xFF,0x3D +,0x3D,0x3D,0xFF,0x38,0x38,0x38,0xFF,0x33,0x33,0x33,0xFF,0x2D,0x2D,0x2D,0xFF +,0x28,0x28,0x28,0xFF,0x23,0x23,0x23,0xFF,0x82,0x1F,0x1F,0x1F,0xFF,0x00,0x0E +,0x0E,0x0E,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xCE,0x00,0x00 +,0x00,0x0A,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00 +,0xE4,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x94,0x88,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0xFE,0x81,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x1D,0x8A,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x40,0x83,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xEE,0x00 +,0x00,0x00,0x02,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 +,0x00,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC0,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x73,0x8B,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0xC5,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0x88,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0xF4,0x81,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x74,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x19,0x00,0x00,0x00,0xE3,0x83,0x00,0x00,0x00,0xFF,0x0B,0x10,0x10,0x10,0xFF +,0x1E,0x1E,0x1E,0xFF,0x23,0x23,0x23,0xFF,0x28,0x28,0x28,0xFF,0x2E,0x2E,0x2E +,0xFF,0x33,0x33,0x33,0xFF,0x38,0x38,0x38,0xFF,0x3E,0x3E,0x3E,0xFF,0x43,0x43 +,0x43,0xFF,0x48,0x48,0x48,0xFF,0x4E,0x4E,0x4E,0xFF,0x40,0x40,0x40,0xFF,0x82 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2A,0xDC,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0xBC,0x81,0x00,0x00,0x00,0xFF,0x0D,0x1D,0x1D,0x1D,0xFF,0x51 +,0x51,0x51,0xFF,0x4B,0x4B,0x4B,0xFF,0x46,0x46,0x46,0xFF,0x41,0x41,0x41,0xFF +,0x3B,0x3B,0x3B,0xFF,0x36,0x36,0x36,0xFF,0x31,0x31,0x31,0xFF,0x2B,0x2B,0x2B +,0xFF,0x26,0x26,0x26,0xFF,0x21,0x21,0x21,0xFF,0x1F,0x1F,0x1F,0xFF,0x1B,0x1B +,0x1B,0xFF,0x07,0x07,0x07,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xE7,0x00,0x00,0x00,0x1D,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA7 +,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDA,0x00,0x00,0x00,0x0A,0x88 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB6,0x82,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0xA0,0x8B,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x87,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAC,0x81,0xFF,0xFF,0xFF,0x00,0x89 +,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x7A,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC3,0x8B +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x41,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x1B,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x69,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00 +,0x00,0x32,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x27,0x00,0x00,0x00 +,0xCC,0x83,0x00,0x00,0x00,0xFF,0x0A,0x01,0x01,0x01,0xFF,0x0B,0x0B,0x0B,0xFF +,0x1A,0x1A,0x1A,0xFF,0x2A,0x2A,0x2A,0xFF,0x31,0x31,0x31,0xFF,0x36,0x36,0x36 +,0xFF,0x3C,0x3C,0x3C,0xFF,0x41,0x41,0x41,0xFF,0x46,0x46,0x46,0xFF,0x4B,0x4B +,0x4B,0xFF,0x45,0x45,0x45,0xFF,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x5C,0xDC,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xEE,0x81,0x00,0x00,0x00 +,0xFF,0x0C,0x2D,0x2D,0x2D,0xFF,0x4F,0x4F,0x4F,0xFF,0x49,0x49,0x49,0xFF,0x44 +,0x44,0x44,0xFF,0x3F,0x3F,0x3F,0xFF,0x39,0x39,0x39,0xFF,0x34,0x34,0x34,0xFF +,0x2F,0x2F,0x2F,0xFF,0x29,0x29,0x29,0xFF,0x24,0x24,0x24,0xFF,0x1E,0x1E,0x1E +,0xFF,0x12,0x12,0x12,0xFF,0x01,0x01,0x01,0xFF,0x82,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0x37,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x6D,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00 +,0x00,0x37,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x3C,0x82,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x20,0x8A,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xDD,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x67,0x81,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 +,0x89,0x00,0x00,0x00,0x00,0x81,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x32 +,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x28,0x8B,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0xBC,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA2 +,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB9,0x81,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x44,0x89,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xFB,0x85,0x00,0x00 +,0x00,0xFF,0x04,0x04,0x04,0x04,0xFF,0x0A,0x0A,0x0A,0xFF,0x0F,0x0F,0x0F,0xFF +,0x0B,0x0B,0x0B,0xFF,0x05,0x05,0x05,0xFF,0x84,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x8E,0xDB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x21,0x82,0x00 +,0x00,0x00,0xFF,0x0A,0x2E,0x2E,0x2E,0xFF,0x43,0x43,0x43,0xFF,0x44,0x44,0x44 +,0xFF,0x42,0x42,0x42,0xFF,0x3D,0x3D,0x3D,0xFF,0x37,0x37,0x37,0xFF,0x32,0x32 +,0x32,0xFF,0x29,0x29,0x29,0xFF,0x1B,0x1B,0x1B,0xFF,0x0C,0x0C,0x0C,0xFF,0x01 +,0x01,0x01,0xFF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDB,0x00,0x00 +,0x00,0x38,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 +,0x87,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83,0x88,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xCD,0x82,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x93,0x8B,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x44 +,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x1B,0x81 +,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x82 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD3,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x8D,0x8B,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x37,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4E,0x88,0xFF,0xFF,0xFF,0x00,0x01 +,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xE4,0x81,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xFA,0x00,0x00,0x00,0x5E,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x34,0x00,0x00,0x00,0xCD,0x8E,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0xC0,0xDB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x53,0x85,0x00,0x00,0x00 +,0xFF,0x03,0x04,0x04,0x04,0xFF,0x09,0x09,0x09,0xFF,0x06,0x06,0x06,0xFF,0x01 +,0x01,0x01,0xFF,0x86,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x97,0x00,0x00 +,0x00,0x0B,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00 +,0xA7,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xB3,0x00,0x00,0x00,0x05 +,0x88,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x81,0x82,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x18,0x8B,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0xAA,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB4,0x82 +,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x82 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6E,0x83,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0x07,0x8B,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0xA1,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE8,0x00,0x00 +,0x00,0x13,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1B,0x00,0x00,0x00 +,0xD1,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x7C,0x8B,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0xE0,0x8A +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0xC6,0xDB,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x85,0x8E,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xD1,0x00,0x00,0x00,0x48,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x12,0x00,0x00,0x00,0xC2,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0x96,0x00,0x00,0x00,0x03,0x88,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x35 +,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6B,0x8B +,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0xF9,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x4E,0x82,0xFF,0xFF,0xFF,0x00,0x89,0x00 +,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x82,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x00,0x00,0x11,0x00,0x00,0x00,0xF7,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x58,0x8B,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00 +,0xE4,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xAC,0x89,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xBC,0x82,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0x9B,0x00,0x00,0x00,0x04,0x8B,0xFF,0xFF,0xFF,0x00,0x05 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x53,0x00,0x00,0x00 +,0x70,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0xF7,0x82,0x00,0x00,0x00,0xFF,0x02 +,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x0A,0xDD,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xD1,0x00,0x00,0x00,0xEB +,0x89,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xDF,0x00,0x00,0x00,0x85,0x00 +,0x00,0x00,0x2B,0x8A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1D,0x00,0x00 +,0x00,0xD8,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x76,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0xDA +,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0x01,0x8B +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x75,0x83,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xE5,0x00,0x00,0x00,0x03,0x82,0xFF,0xFF,0xFF,0x00,0x89,0x00 +,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0xA3,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xC9,0x8C,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x47,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x81,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00 +,0x00,0xA2,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00 +,0x26,0x90,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD3,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x28,0xE2,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x06,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x8B,0x82,0x00,0x00,0x00,0xFF,0x04 +,0x00,0x00,0x00,0xA3,0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0x42,0x00,0x00,0x00 +,0x25,0x00,0x00,0x00,0x01,0x8C,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x0C +,0x00,0x00,0x00,0xCD,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xF8,0x00,0x00,0x00 +,0x58,0x89,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xBE +,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x1E,0x8B +,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xE6,0x83,0x00 +,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x83,0x83,0xFF,0xFF,0xFF,0x00,0x89,0x00 +,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x83,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x3D,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x51,0x8C,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x99,0x83,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x5F,0x8A,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x85,0x00,0x00 +,0x00,0xFA,0x00,0x00,0x00,0x44,0x91,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0xA4,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x63,0xE4,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0xA0,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x1E,0x91,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCD +,0x00,0x00,0x00,0x3E,0x8A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x9F,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x61,0x8C,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x7A,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00 +,0x00,0x00,0x20,0x83,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0x84,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xC9,0x83,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD5,0x00,0x00,0x00,0x02,0x8B,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xC9,0x82,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x42,0x8A,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x24,0x92,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x68 +,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9E,0xE4,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0xE1,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xE2 +,0x93,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x8A,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x7F,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8D +,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xF0,0x83 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA4,0x84,0xFF,0xFF,0xFF,0x00,0x89 +,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x84,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x42,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5F,0x8C +,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0xDD,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x48,0x9D,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0x2C,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xDA,0xE3,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x21,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xA7,0x9D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x01,0x00,0x00,0x00,0x8E,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xAC,0x00,0x00,0x00,0x02,0x8C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x8D +,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFA,0x00,0x00,0x00,0x21,0x84 +,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x85 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xBA,0x83,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xDF,0x00,0x00,0x00,0x07,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x00,0x00,0x27,0x00,0x00,0x00,0xED,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xFB,0x00,0x00,0x00,0x5E,0x9C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x01,0x00,0x00,0x00,0xEE,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x16 +,0xE2,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x62,0x82,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x6B,0x9C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06 +,0x00,0x00,0x00,0xA8,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC6,0x00 +,0x00,0x00,0x08,0x8C,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00 +,0x00,0xF8,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x94,0x85,0xFF,0xFF +,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x85,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0xFE,0x83,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x88,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x3D,0x00,0x00,0x00,0xF4,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE +,0x00,0x00,0x00,0x77,0x9C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB4,0x82 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x51,0xE2,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0xA2,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x2F,0x9B +,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xC0,0x83,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD2,0x00,0x00,0x00,0x15,0x8C,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xBE,0x83,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x17,0x85,0xFF,0xFF,0xFF,0x00 +,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x86,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0xAA,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD +,0x00,0x00,0x00,0x3C,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x36,0x00 +,0x00,0x00,0xEB,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xAC,0x00,0x00 +,0x00,0x13,0x9A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x77,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0xE2,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0xE3,0x81,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF1,0x00,0x00,0x00 +,0x02,0x9A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x4B,0x00,0x00,0x00,0xE8 +,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x0F,0x8D +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x72,0x84,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x84,0x86,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0x86,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x25,0x00 +,0x00,0x00,0xF7,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDE,0x00,0x00 +,0x00,0x0D,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x26,0x00,0x00,0x00 +,0xDF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x49 +,0x99,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x3B,0x82,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0xCE,0xE1,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x23 +,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB8,0x99,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x99,0x84,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x07,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x00,0x00,0x2B,0x00,0x00,0x00,0xF8,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xE0,0x00,0x00,0x00,0x0D,0x86,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0x87,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00 +,0x6F,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x9D,0x8E,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0xCF,0x84,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x7C,0x98,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x07 +,0x00,0x00,0x00,0xF8,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x31,0xE0 +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0x82,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x7C,0x99,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x93,0x83 +,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x8B,0x00,0x00 +,0x00,0x01,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00 +,0xCF,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x3F +,0x87,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 +,0x87,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xBC,0x84 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x5C,0x8E,0xFF,0xFF,0xFF,0x00,0x02 +,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x8F,0x00,0x00,0x00,0xFE,0x81,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x37,0x99,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0xC2,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x98,0xDF,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xEA +,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x34,0x99,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xE7,0x81,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xE5,0x00,0x00,0x00,0x46,0x8F,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x98,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8C,0x88,0xFF +,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x88,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xEF,0x83,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x40,0x8F,0xFF,0xFF,0xFF +,0x00,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xE4,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x80,0x9A,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x68,0x82,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0x0D,0xDE,0xFF,0xFF +,0xFF,0x00,0x00,0x00,0x00,0x00,0x65,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xCF,0x9B,0xFF,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x48,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x11,0x8F,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0x79,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD3,0x00 +,0x00,0x00,0x07,0x88,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0x89,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x5B,0x84,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEF,0x00,0x00,0x00,0x2A,0x8F,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x04 +,0x9A,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0xF6,0x82 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x67,0xDD,0xFF,0xFF,0xFF,0x00,0x01 +,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xD7,0x82,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x6A,0x9C,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x34,0x90,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0xFE,0x83,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xF9,0x00,0x00,0x00,0x2F,0x89,0xFF,0xFF,0xFF +,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x8A,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0xA8,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xE0,0x00,0x00,0x00,0x18,0xAD,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA3 +,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xCF,0xDD,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x4B,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF5 +,0x00,0x00,0x00,0x0F,0xAD,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x43,0x00 +,0x00,0x00,0xFA,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x6C,0x8A,0xFF +,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x8A,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xC7,0x84,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xCD,0x00,0x00,0x00,0x10,0xAC,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x00,0x40,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 +,0x37,0xDC,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xBD,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x9F,0xAD,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x3C,0x00,0x00,0x00,0xF2,0x84,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8A +,0x8B,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 +,0x8B,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xD9,0x84 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD5,0x00,0x00,0x00,0x1F,0xAB,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xDC,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x9E,0xDB,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x30,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3A,0xAC,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0xF7,0x84,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xA5,0x00,0x00,0x00,0x01,0x8B,0xFF,0xFF,0xFF,0x00 +,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x8C,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xE8,0x84,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xE7,0x00,0x00,0x00,0x33,0xAB,0xFF,0xFF,0xFF,0x00,0x00,0x00 +,0x00,0x00,0x7B,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6,0x00,0x00 +,0x00,0x14,0xDA,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xA3,0x82,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xD4,0xAC,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x6F,0x00,0x00,0x00,0xFD,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xBD,0x00,0x00,0x00,0x06,0x8C,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 +,0x89,0x00,0x00,0x00,0x00,0x8D,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x33 +,0x00,0x00,0x00,0xF4,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF4,0x00 +,0x00,0x00,0x4C,0xAA,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1B,0x00,0x00 +,0x00,0xFC,0x82,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA1,0xD9,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0xFB,0x82,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x6F,0xAA,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x01,0x00,0x00,0x00,0x8D,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD0 +,0x00,0x00,0x00,0x0E,0x8D,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0x8E,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x3E,0x00 +,0x00,0x00,0xEF,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC,0x00,0x00 +,0x00,0x70,0xAA,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB5,0x83,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0x45,0xD7,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x0A,0x00,0x00,0x00,0xD9,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xF7,0x00,0x00,0x00,0x12,0xA9,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x17 +,0x00,0x00,0x00,0xB4,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC3,0x00 +,0x00,0x00,0x12,0x8E,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0x8F,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x2A,0x00,0x00 +,0x00,0xE1,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xB8,0x00,0x00,0x00 +,0x1A,0xA8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x52,0x83,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xDE,0x00,0x00,0x00,0x0A,0xD6,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x96,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xA4 +,0xA9,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0xEB,0x85 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xAC,0x00,0x00,0x00,0x08,0x8F,0xFF +,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x90,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0xCE,0x85,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xED,0x00,0x00,0x00,0x57,0xA7,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xDD,0x83,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x8B,0xD5,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x4A +,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x23,0xA7 +,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xA4,0x86,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x02,0x90,0xFF,0xFF +,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x91,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xB8,0x86,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xA6,0x00,0x00,0x00,0x10,0xA6,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x51,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFC +,0x00,0x00,0x00,0x32,0xD3,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x14,0x00 +,0x00,0x00,0xE7,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x82,0xA7,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0xE3,0x85,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x73,0x92,0xFF,0xFF,0xFF +,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x92,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x93,0x85,0x00,0x00,0x00,0xFF +,0x01,0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x23,0xA7,0xFF,0xFF,0xFF,0x00,0x00 +,0x00,0x00,0x00,0xBE,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xCE,0x00 +,0x00,0x00,0x04,0xD2,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xAE,0x83,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDF,0x00,0x00,0x00,0x09,0xA7,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xD8,0x84,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xE8,0x00,0x00,0x00,0x4C,0x93,0xFF,0xFF,0xFF,0x00 +,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x94,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xE3,0x83,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x68,0xA8,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x2E,0x00 +,0x00,0x00,0xFC,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x76,0xD1,0xFF +,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x61,0x84,0x00,0x00,0x00,0xFF,0x00,0x00 +,0x00,0x00,0x4F,0xA9,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x37,0x00,0x00 +,0x00,0xFC,0x82,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xAC,0x00,0x00,0x00 +,0x14,0x94,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 +,0x00,0x95,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xA3 +,0x81,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB7,0xAA,0xFF,0xFF,0xFF,0x00 +,0x00,0x00,0x00,0x00,0x98,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF6 +,0x00,0x00,0x00,0x30,0xCF,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x27,0x00 +,0x00,0x00,0xF2,0x83,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xB6,0xAB,0xFF +,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0xEF,0x00,0x00,0x00,0x5B,0x96,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 +,0x89,0x00,0x00,0x00,0x00,0x97,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x52 +,0x00,0x00,0x00,0xD9,0x00,0x00,0x00,0x1A,0xAA,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x00,0x00,0x15,0x00,0x00,0x00,0xF0,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00 +,0x00,0xE5,0x00,0x00,0x00,0x1D,0xCD,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x1E,0x00,0x00,0x00,0xE2,0x83,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xF8 +,0x00,0x00,0x00,0x24,0xAB,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x06,0x00 +,0x00,0x00,0x93,0x00,0x00,0x00,0x1B,0x97,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00 +,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x98,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 +,0x00,0x02,0xAC,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x72,0x84,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xD3,0x00,0x00,0x00,0x0E,0xCB,0xFF,0xFF,0xFF +,0x00,0x01,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0xDA,0x84,0x00,0x00,0x00,0xFF +,0x00,0x00,0x00,0x00,0x83,0xC7,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00 +,0x89,0x00,0x00,0x00,0x00,0xC6,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x05 +,0x00,0x00,0x00,0xD9,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xBB,0x00 +,0x00,0x00,0x06,0xC9,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00 +,0x00,0xD0,0x84,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE0,0x00,0x00,0x00 +,0x09,0xC7,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00 +,0x00,0xC7,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x4C,0x85,0x00,0x00,0x00 +,0xFF,0x01,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x0B,0xC7,0xFF,0xFF,0xFF,0x00 +,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xCC,0x85,0x00,0x00,0x00,0xFF,0x00 +,0x00,0x00,0x00,0x51,0xC8,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0xC8,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xB4,0x85 +,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xC6,0x00,0x00,0x00,0x11,0xC5,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x2E,0x00,0x00,0x00,0xE2,0x85,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xA6,0xC9,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00 +,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xC8,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x14,0x00,0x00,0x00,0xE2,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00 +,0xD2,0x00,0x00,0x00,0x19,0xC3,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x4A +,0x00,0x00,0x00,0xF2,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD1,0x00 +,0x00,0x00,0x0A,0xC9,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0xC9,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00 +,0x00,0xFA,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE2,0x00,0x00,0x00 +,0x3A,0xC0,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x77 +,0x00,0x00,0x00,0xFC,0x85,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xEE,0x00 +,0x00,0x00,0x22,0xCA,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0xCA,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x6F,0x86,0x00 +,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xFB,0x00,0x00,0x00,0x78,0x00,0x00,0x00 +,0x01,0xBD,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0xC5 +,0x86,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x48,0xCB +,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xCB +,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xAB,0x87,0x00,0x00,0x00,0xFF,0x01 +,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x16,0xBA,0xFF,0xFF,0xFF,0x00,0x02,0x00 +,0x00,0x00,0x01,0x00,0x00,0x00,0x6D,0x00,0x00,0x00,0xF5,0x87,0x00,0x00,0x00 +,0xFF,0x00,0x00,0x00,0x00,0x76,0xCC,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0xCB,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00 +,0x0E,0x00,0x00,0x00,0xCE,0x87,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xE9 +,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x03,0xB7,0xFF,0xFF,0xFF,0x00,0x01,0x00 +,0x00,0x00,0x2D,0x00,0x00,0x00,0xBF,0x88,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0x84,0xCD,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 +,0x00,0x00,0xCC,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x15,0x00,0x00,0x00 +,0xD8,0x88,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xD3,0x00,0x00,0x00,0x47 +,0xB4,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0xA5,0x00 +,0x00,0x00,0xFD,0x88,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8A,0xCE,0xFF +,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xCD,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0xE2,0x89,0x00,0x00 +,0x00,0xFF,0x01,0x00,0x00,0x00,0xB7,0x00,0x00,0x00,0x31,0xB0,0xFF,0xFF,0xFF +,0x00,0x02,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xFA,0x89 +,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x8F,0xCF,0xFF,0xFF,0xFF,0x00,0x89 +,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xCE,0xFF,0xFF,0xFF,0x00,0x01 +,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0xEA,0x8A,0x00,0x00,0x00,0xFF,0x02,0x00 +,0x00,0x00,0xC3,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x04,0xAA,0xFF,0xFF,0xFF +,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xA9,0x00 +,0x00,0x00,0xF9,0x8A,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x95,0xD0,0xFF +,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xCF,0xFF +,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0xE7,0x8B,0x00,0x00 +,0x00,0xFF,0x02,0x00,0x00,0x00,0xE5,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,0x18 +,0xA6,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x80,0x00 +,0x00,0x00,0xE1,0x8B,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFD,0x00,0x00 +,0x00,0x79,0xD1,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 +,0x00,0x00,0xD0,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1E,0x00,0x00,0x00 +,0xD2,0x8C,0x00,0x00,0x00,0xFF,0x04,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0xC8 +,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x02,0x9E,0xFF,0xFF +,0xFF,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x83 +,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0xFE,0x8C,0x00,0x00,0x00,0xFF,0x01,0x00 +,0x00,0x00,0xF1,0x00,0x00,0x00,0x4C,0xD2,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00 +,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xD1,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00 +,0x00,0x0D,0x00,0x00,0x00,0xB7,0x8F,0x00,0x00,0x00,0xFF,0x04,0x00,0x00,0x00 +,0xEB,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x38,0x00,0x00 +,0x00,0x0E,0x96,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x15,0x00,0x00,0x00 +,0x3B,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0xF5,0x8F,0x00 +,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xDA,0x00,0x00,0x00,0x29,0xD3,0xFF,0xFF +,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xD2,0xFF,0xFF +,0xFF,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x96,0x93,0x00,0x00,0x00 +,0xFF,0x16,0x00,0x00,0x00,0xE3,0x00,0x00,0x00,0xB9,0x00,0x00,0x00,0x8F,0x00 +,0x00,0x00,0x67,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x35 +,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x09,0xFF,0xFF,0xFF +,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x16,0x00,0x00 +,0x00,0x21,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x42,0x00 +,0x00,0x00,0x5B,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xA5,0x00,0x00,0x00,0xCA +,0x00,0x00,0x00,0xEF,0x93,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xB8,0x00 +,0x00,0x00,0x11,0xD4,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0xD4,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x61,0x00,0x00 +,0x00,0xF1,0x9B,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xFB,0x00,0x00,0x00 +,0xFE,0x9C,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xEE,0x00,0x00,0x00,0x63 +,0x00,0x00,0x00,0x01,0xD5,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0xD5,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x1C,0x00 +,0x00,0x00,0xB8,0xB8,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xA9,0x00,0x00 +,0x00,0x17,0xD7,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00 +,0x00,0x00,0xD7,0xFF,0xFF,0xFF,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x00,0x00 +,0xF1,0xB4,0x00,0x00,0x00,0xFF,0x01,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0x4C +,0xD9,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00 +,0xD8,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0xAB,0x00 +,0x00,0x00,0xFE,0xB0,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xE9,0x00,0x00 +,0x00,0x78,0x00,0x00,0x00,0x0C,0xDA,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00 +,0x00,0x89,0x00,0x00,0x00,0x00,0xDA,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00 +,0x2C,0x00,0x00,0x00,0xAA,0x00,0x00,0x00,0xFE,0xAC,0x00,0x00,0x00,0xFF,0x02 +,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0x6D,0x00,0x00,0x00,0x09,0xDC,0xFF,0xFF +,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xDC,0xFF,0xFF +,0xFF,0x00,0x02,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0xFD +,0xA8,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xD9,0x00,0x00,0x00,0x62,0x00 +,0x00,0x00,0x05,0xDE,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00 +,0x00,0x00,0x00,0xDE,0xFF,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x26,0x00,0x00 +,0x00,0x81,0x00,0x00,0x00,0xD8,0xA3,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0x00 +,0xDE,0x00,0x00,0x00,0x8B,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x01,0xE0,0xFF +,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xE1,0xFF +,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x2F,0x00,0x00,0x00,0x86,0x00,0x00,0x00 +,0xDD,0x9D,0x00,0x00,0x00,0xFF,0x02,0x00,0x00,0x00,0xDB,0x00,0x00,0x00,0x87 +,0x00,0x00,0x00,0x33,0xE4,0xFF,0xFF,0xFF,0x00,0x89,0x00,0x00,0x00,0x00,0x89 +,0x00,0x00,0x00,0x00,0xE4,0xFF,0xFF,0xFF,0x00,0x04,0x00,0x00,0x00,0x33,0x00 +,0x00,0x00,0x70,0x00,0x00,0x00,0xA2,0x00,0x00,0x00,0xD4,0x00,0x00,0x00,0xFC +,0x93,0x00,0x00,0x00,0xFF,0x04,0x00,0x00,0x00,0xE8,0x00,0x00,0x00,0xB7,0x00 +,0x00,0x00,0x86,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x24,0xE7,0xFF,0xFF,0xFF +,0x00,0x89,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0xE8,0xFF,0xFF,0xFF +,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x69,0x00 +,0x00,0x00,0x95,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0xB6,0x00,0x00,0x00,0xC4 +,0x00,0x00,0x00,0xD3,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0xF1,0x00,0x00,0x00 +,0xFD,0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0xE1,0x00,0x00,0x00,0xD1,0x00,0x00 +,0x00,0xC0,0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0x9F,0x00,0x00,0x00,0x8E,0x00 +,0x00,0x00,0x78,0x00,0x00,0x00,0x4A,0x00,0x00,0x00,0x19,0xEC,0xFF,0xFF,0xFF +,0x00,0x89,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 +,0x00,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00 +,0x00,0xFF,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +,0x00,0x00,0x00,0x00,0x54,0x52,0x55,0x45,0x56,0x49,0x53,0x49,0x4F,0x4E,0x2D +,0x58,0x46,0x49,0x4C,0x45,0x2E,0x00}; +/* end binary data. size = 22402 bytes */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_DXT.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_DXT.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_DXT.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_DXT.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,632 @@ +/* + Jonathan Dummer + 2007-07-31-10.32 + + simple DXT compression / decompression code + + public domain +*/ + +#include "image_DXT.h" +#include +#include +#include +#include + +/* set this =1 if you want to use the covarince matrix method... + which is better than my method of using standard deviations + overall, except on the infintesimal chance that the power + method fails for finding the largest eigenvector */ +#define USE_COV_MAT 1 + +/********* Function Prototypes *********/ +/* + Takes a 4x4 block of pixels and compresses it into 8 bytes + in DXT1 format (color only, no alpha). Speed is valued + over prettyness, at least for now. +*/ +void compress_DDS_color_block( + int channels, + const unsigned char *const uncompressed, + unsigned char compressed[8] ); +/* + Takes a 4x4 block of pixels and compresses the alpha + component it into 8 bytes for use in DXT5 DDS files. + Speed is valued over prettyness, at least for now. +*/ +void compress_DDS_alpha_block( + const unsigned char *const uncompressed, + unsigned char compressed[8] ); + +/********* Actual Exposed Functions *********/ +int + save_image_as_DDS + ( + const char *filename, + int width, int height, int channels, + const unsigned char *const data + ) +{ + /* variables */ + FILE *fout; + unsigned char *DDS_data; + DDS_header header; + int DDS_size; + /* error check */ + if( (NULL == filename) || + (width < 1) || (height < 1) || + (channels < 1) || (channels > 4) || + (data == NULL ) ) + { + return 0; + } + /* Convert the image */ + if( (channels & 1) == 1 ) + { + /* no alpha, just use DXT1 */ + DDS_data = convert_image_to_DXT1( data, width, height, channels, &DDS_size ); + } else + { + /* has alpha, so use DXT5 */ + DDS_data = convert_image_to_DXT5( data, width, height, channels, &DDS_size ); + } + /* save it */ + memset( &header, 0, sizeof( DDS_header ) ); + header.dwMagic = ('D' << 0) | ('D' << 8) | ('S' << 16) | (' ' << 24); + header.dwSize = 124; + header.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_LINEARSIZE; + header.dwWidth = width; + header.dwHeight = height; + header.dwPitchOrLinearSize = DDS_size; + header.sPixelFormat.dwSize = 32; + header.sPixelFormat.dwFlags = DDPF_FOURCC; + if( (channels & 1) == 1 ) + { + header.sPixelFormat.dwFourCC = ('D' << 0) | ('X' << 8) | ('T' << 16) | ('1' << 24); + } else + { + header.sPixelFormat.dwFourCC = ('D' << 0) | ('X' << 8) | ('T' << 16) | ('5' << 24); + } + header.sCaps.dwCaps1 = DDSCAPS_TEXTURE; + /* write it out */ + fout = fopen( filename, "wb"); + fwrite( &header, sizeof( DDS_header ), 1, fout ); + fwrite( DDS_data, 1, DDS_size, fout ); + fclose( fout ); + /* done */ + free( DDS_data ); + return 1; +} + +unsigned char* convert_image_to_DXT1( + const unsigned char *const uncompressed, + int width, int height, int channels, + int *out_size ) +{ + unsigned char *compressed; + int i, j, x, y; + unsigned char ublock[16*3]; + unsigned char cblock[8]; + int index = 0, chan_step = 1; + int block_count = 0; + /* error check */ + *out_size = 0; + if( (width < 1) || (height < 1) || + (NULL == uncompressed) || + (channels < 1) || (channels > 4) ) + { + return NULL; + } + /* for channels == 1 or 2, I do not step forward for R,G,B values */ + if( channels < 3 ) + { + chan_step = 0; + } + /* get the RAM for the compressed image + (8 bytes per 4x4 pixel block) */ + *out_size = ((width+3) >> 2) * ((height+3) >> 2) * 8; + compressed = (unsigned char*)malloc( *out_size ); + /* go through each block */ + for( j = 0; j < height; j += 4 ) + { + for( i = 0; i < width; i += 4 ) + { + /* copy this block into a new one */ + int idx = 0; + int mx = 4, my = 4; + if( j+4 >= height ) + { + my = height - j; + } + if( i+4 >= width ) + { + mx = width - i; + } + for( y = 0; y < my; ++y ) + { + for( x = 0; x < mx; ++x ) + { + ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels]; + ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step]; + ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step+chan_step]; + } + for( x = mx; x < 4; ++x ) + { + ublock[idx++] = ublock[0]; + ublock[idx++] = ublock[1]; + ublock[idx++] = ublock[2]; + } + } + for( y = my; y < 4; ++y ) + { + for( x = 0; x < 4; ++x ) + { + ublock[idx++] = ublock[0]; + ublock[idx++] = ublock[1]; + ublock[idx++] = ublock[2]; + } + } + /* compress the block */ + ++block_count; + compress_DDS_color_block( 3, ublock, cblock ); + /* copy the data from the block into the main block */ + for( x = 0; x < 8; ++x ) + { + compressed[index++] = cblock[x]; + } + } + } + return compressed; +} + +unsigned char* convert_image_to_DXT5( + const unsigned char *const uncompressed, + int width, int height, int channels, + int *out_size ) +{ + unsigned char *compressed; + int i, j, x, y; + unsigned char ublock[16*4]; + unsigned char cblock[8]; + int index = 0, chan_step = 1; + int block_count = 0, has_alpha; + /* error check */ + *out_size = 0; + if( (width < 1) || (height < 1) || + (NULL == uncompressed) || + (channels < 1) || ( channels > 4) ) + { + return NULL; + } + /* for channels == 1 or 2, I do not step forward for R,G,B vales */ + if( channels < 3 ) + { + chan_step = 0; + } + /* # channels = 1 or 3 have no alpha, 2 & 4 do have alpha */ + has_alpha = 1 - (channels & 1); + /* get the RAM for the compressed image + (16 bytes per 4x4 pixel block) */ + *out_size = ((width+3) >> 2) * ((height+3) >> 2) * 16; + compressed = (unsigned char*)malloc( *out_size ); + /* go through each block */ + for( j = 0; j < height; j += 4 ) + { + for( i = 0; i < width; i += 4 ) + { + /* local variables, and my block counter */ + int idx = 0; + int mx = 4, my = 4; + if( j+4 >= height ) + { + my = height - j; + } + if( i+4 >= width ) + { + mx = width - i; + } + for( y = 0; y < my; ++y ) + { + for( x = 0; x < mx; ++x ) + { + ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels]; + ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step]; + ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step+chan_step]; + ublock[idx++] = + has_alpha * uncompressed[(j+y)*width*channels+(i+x)*channels+channels-1] + + (1-has_alpha)*255; + } + for( x = mx; x < 4; ++x ) + { + ublock[idx++] = ublock[0]; + ublock[idx++] = ublock[1]; + ublock[idx++] = ublock[2]; + ublock[idx++] = ublock[3]; + } + } + for( y = my; y < 4; ++y ) + { + for( x = 0; x < 4; ++x ) + { + ublock[idx++] = ublock[0]; + ublock[idx++] = ublock[1]; + ublock[idx++] = ublock[2]; + ublock[idx++] = ublock[3]; + } + } + /* now compress the alpha block */ + compress_DDS_alpha_block( ublock, cblock ); + /* copy the data from the compressed alpha block into the main buffer */ + for( x = 0; x < 8; ++x ) + { + compressed[index++] = cblock[x]; + } + /* then compress the color block */ + ++block_count; + compress_DDS_color_block( 4, ublock, cblock ); + /* copy the data from the compressed color block into the main buffer */ + for( x = 0; x < 8; ++x ) + { + compressed[index++] = cblock[x]; + } + } + } + return compressed; +} + +/********* Helper Functions *********/ +int convert_bit_range( int c, int from_bits, int to_bits ) +{ + int b = (1 << (from_bits - 1)) + c * ((1 << to_bits) - 1); + return (b + (b >> from_bits)) >> from_bits; +} + +int rgb_to_565( int r, int g, int b ) +{ + return + (convert_bit_range( r, 8, 5 ) << 11) | + (convert_bit_range( g, 8, 6 ) << 05) | + (convert_bit_range( b, 8, 5 ) << 00); +} + +void rgb_888_from_565( unsigned int c, int *r, int *g, int *b ) +{ + *r = convert_bit_range( (c >> 11) & 31, 5, 8 ); + *g = convert_bit_range( (c >> 05) & 63, 6, 8 ); + *b = convert_bit_range( (c >> 00) & 31, 5, 8 ); +} + +void compute_color_line_STDEV( + const unsigned char *const uncompressed, + int channels, + float point[3], float direction[3] ) +{ + const float inv_16 = 1.0f / 16.0f; + int i; + float sum_r = 0.0f, sum_g = 0.0f, sum_b = 0.0f; + float sum_rr = 0.0f, sum_gg = 0.0f, sum_bb = 0.0f; + float sum_rg = 0.0f, sum_rb = 0.0f, sum_gb = 0.0f; + /* calculate all data needed for the covariance matrix + ( to compare with _rygdxt code) */ + for( i = 0; i < 16*channels; i += channels ) + { + sum_r += uncompressed[i+0]; + sum_rr += uncompressed[i+0] * uncompressed[i+0]; + sum_g += uncompressed[i+1]; + sum_gg += uncompressed[i+1] * uncompressed[i+1]; + sum_b += uncompressed[i+2]; + sum_bb += uncompressed[i+2] * uncompressed[i+2]; + sum_rg += uncompressed[i+0] * uncompressed[i+1]; + sum_rb += uncompressed[i+0] * uncompressed[i+2]; + sum_gb += uncompressed[i+1] * uncompressed[i+2]; + } + /* convert the sums to averages */ + sum_r *= inv_16; + sum_g *= inv_16; + sum_b *= inv_16; + /* and convert the squares to the squares of the value - avg_value */ + sum_rr -= 16.0f * sum_r * sum_r; + sum_gg -= 16.0f * sum_g * sum_g; + sum_bb -= 16.0f * sum_b * sum_b; + sum_rg -= 16.0f * sum_r * sum_g; + sum_rb -= 16.0f * sum_r * sum_b; + sum_gb -= 16.0f * sum_g * sum_b; + /* the point on the color line is the average */ + point[0] = sum_r; + point[1] = sum_g; + point[2] = sum_b; + #if USE_COV_MAT + /* + The following idea was from ryg. + (https://mollyrocket.com/forums/viewtopic.php?t=392) + The method worked great (less RMSE than mine) most of + the time, but had some issues handling some simple + boundary cases, like full green next to full red, + which would generate a covariance matrix like this: + + | 1 -1 0 | + | -1 1 0 | + | 0 0 0 | + + For a given starting vector, the power method can + generate all zeros! So no starting with {1,1,1} + as I was doing! This kind of error is still a + slight posibillity, but will be very rare. + */ + /* use the covariance matrix directly + (1st iteration, don't use all 1.0 values!) */ + sum_r = 1.0f; + sum_g = 2.718281828f; + sum_b = 3.141592654f; + direction[0] = sum_r*sum_rr + sum_g*sum_rg + sum_b*sum_rb; + direction[1] = sum_r*sum_rg + sum_g*sum_gg + sum_b*sum_gb; + direction[2] = sum_r*sum_rb + sum_g*sum_gb + sum_b*sum_bb; + /* 2nd iteration, use results from the 1st guy */ + sum_r = direction[0]; + sum_g = direction[1]; + sum_b = direction[2]; + direction[0] = sum_r*sum_rr + sum_g*sum_rg + sum_b*sum_rb; + direction[1] = sum_r*sum_rg + sum_g*sum_gg + sum_b*sum_gb; + direction[2] = sum_r*sum_rb + sum_g*sum_gb + sum_b*sum_bb; + /* 3rd iteration, use results from the 2nd guy */ + sum_r = direction[0]; + sum_g = direction[1]; + sum_b = direction[2]; + direction[0] = sum_r*sum_rr + sum_g*sum_rg + sum_b*sum_rb; + direction[1] = sum_r*sum_rg + sum_g*sum_gg + sum_b*sum_gb; + direction[2] = sum_r*sum_rb + sum_g*sum_gb + sum_b*sum_bb; + #else + /* use my standard deviation method + (very robust, a tiny bit slower and less accurate) */ + direction[0] = sqrt( sum_rr ); + direction[1] = sqrt( sum_gg ); + direction[2] = sqrt( sum_bb ); + /* which has a greater component */ + if( sum_gg > sum_rr ) + { + /* green has greater component, so base the other signs off of green */ + if( sum_rg < 0.0f ) + { + direction[0] = -direction[0]; + } + if( sum_gb < 0.0f ) + { + direction[2] = -direction[2]; + } + } else + { + /* red has a greater component */ + if( sum_rg < 0.0f ) + { + direction[1] = -direction[1]; + } + if( sum_rb < 0.0f ) + { + direction[2] = -direction[2]; + } + } + #endif +} + +void LSE_master_colors_max_min( + int *cmax, int *cmin, + int channels, + const unsigned char *const uncompressed ) +{ + int i, j; + /* the master colors */ + int c0[3], c1[3]; + /* used for fitting the line */ + float sum_x[] = { 0.0f, 0.0f, 0.0f }; + float sum_x2[] = { 0.0f, 0.0f, 0.0f }; + float dot_max = 1.0f, dot_min = -1.0f; + float vec_len2 = 0.0f; + float dot; + /* error check */ + if( (channels < 3) || (channels > 4) ) + { + return; + } + compute_color_line_STDEV( uncompressed, channels, sum_x, sum_x2 ); + vec_len2 = 1.0f / ( 0.00001f + + sum_x2[0]*sum_x2[0] + sum_x2[1]*sum_x2[1] + sum_x2[2]*sum_x2[2] ); + /* finding the max and min vector values */ + dot_max = + ( + sum_x2[0] * uncompressed[0] + + sum_x2[1] * uncompressed[1] + + sum_x2[2] * uncompressed[2] + ); + dot_min = dot_max; + for( i = 1; i < 16; ++i ) + { + dot = + ( + sum_x2[0] * uncompressed[i*channels+0] + + sum_x2[1] * uncompressed[i*channels+1] + + sum_x2[2] * uncompressed[i*channels+2] + ); + if( dot < dot_min ) + { + dot_min = dot; + } else if( dot > dot_max ) + { + dot_max = dot; + } + } + /* and the offset (from the average location) */ + dot = sum_x2[0]*sum_x[0] + sum_x2[1]*sum_x[1] + sum_x2[2]*sum_x[2]; + dot_min -= dot; + dot_max -= dot; + /* post multiply by the scaling factor */ + dot_min *= vec_len2; + dot_max *= vec_len2; + /* OK, build the master colors */ + for( i = 0; i < 3; ++i ) + { + /* color 0 */ + c0[i] = (int)(0.5f + sum_x[i] + dot_max * sum_x2[i]); + if( c0[i] < 0 ) + { + c0[i] = 0; + } else if( c0[i] > 255 ) + { + c0[i] = 255; + } + /* color 1 */ + c1[i] = (int)(0.5f + sum_x[i] + dot_min * sum_x2[i]); + if( c1[i] < 0 ) + { + c1[i] = 0; + } else if( c1[i] > 255 ) + { + c1[i] = 255; + } + } + /* down_sample (with rounding?) */ + i = rgb_to_565( c0[0], c0[1], c0[2] ); + j = rgb_to_565( c1[0], c1[1], c1[2] ); + if( i > j ) + { + *cmax = i; + *cmin = j; + } else + { + *cmax = j; + *cmin = i; + } +} + +void + compress_DDS_color_block + ( + int channels, + const unsigned char *const uncompressed, + unsigned char compressed[8] + ) +{ + /* variables */ + int i; + int next_bit; + int enc_c0, enc_c1; + int c0[4], c1[4]; + float color_line[] = { 0.0f, 0.0f, 0.0f, 0.0f }; + float vec_len2 = 0.0f, dot_offset = 0.0f; + /* stupid order */ + int swizzle4[] = { 0, 2, 3, 1 }; + /* get the master colors */ + LSE_master_colors_max_min( &enc_c0, &enc_c1, channels, uncompressed ); + /* store the 565 color 0 and color 1 */ + compressed[0] = (enc_c0 >> 0) & 255; + compressed[1] = (enc_c0 >> 8) & 255; + compressed[2] = (enc_c1 >> 0) & 255; + compressed[3] = (enc_c1 >> 8) & 255; + /* zero out the compressed data */ + compressed[4] = 0; + compressed[5] = 0; + compressed[6] = 0; + compressed[7] = 0; + /* reconstitute the master color vectors */ + rgb_888_from_565( enc_c0, &c0[0], &c0[1], &c0[2] ); + rgb_888_from_565( enc_c1, &c1[0], &c1[1], &c1[2] ); + /* the new vector */ + vec_len2 = 0.0f; + for( i = 0; i < 3; ++i ) + { + color_line[i] = c1[i] - c0[i]; + vec_len2 += color_line[i] * color_line[i]; + } + if( vec_len2 > 0.0f ) + { + vec_len2 = 1.0f / vec_len2; + } + /* pre-proform the scaling */ + color_line[0] *= vec_len2; + color_line[1] *= vec_len2; + color_line[2] *= vec_len2; + /* compute the offset (constant) portion of the dot product */ + dot_offset = color_line[0]*c0[0] + color_line[1]*c0[1] + color_line[2]*c0[2]; + /* store the rest of the bits */ + next_bit = 8*4; + for( i = 0; i < 16; ++i ) + { + /* find the dot product of this color, to place it on the line + (should be [-1,1]) */ + int next_value = 0; + float dot_product = + color_line[0] * uncompressed[i*channels+0] + + color_line[1] * uncompressed[i*channels+1] + + color_line[2] * uncompressed[i*channels+2] - + dot_offset; + /* map to [0,3] */ + next_value = (int)( dot_product * 3.0f + 0.5f ); + if( next_value > 3 ) + { + next_value = 3; + } else if( next_value < 0 ) + { + next_value = 0; + } + /* OK, store this value */ + compressed[next_bit >> 3] |= swizzle4[ next_value ] << (next_bit & 7); + next_bit += 2; + } + /* done compressing to DXT1 */ +} + +void + compress_DDS_alpha_block + ( + const unsigned char *const uncompressed, + unsigned char compressed[8] + ) +{ + /* variables */ + int i; + int next_bit; + int a0, a1; + float scale_me; + /* stupid order */ + int swizzle8[] = { 1, 7, 6, 5, 4, 3, 2, 0 }; + /* get the alpha limits (a0 > a1) */ + a0 = a1 = uncompressed[3]; + for( i = 4+3; i < 16*4; i += 4 ) + { + if( uncompressed[i] > a0 ) + { + a0 = uncompressed[i]; + } else if( uncompressed[i] < a1 ) + { + a1 = uncompressed[i]; + } + } + /* store those limits, and zero the rest of the compressed dataset */ + compressed[0] = a0; + compressed[1] = a1; + /* zero out the compressed data */ + compressed[2] = 0; + compressed[3] = 0; + compressed[4] = 0; + compressed[5] = 0; + compressed[6] = 0; + compressed[7] = 0; + /* store the all of the alpha values */ + next_bit = 8*2; + scale_me = 7.9999f / (a0 - a1); + for( i = 3; i < 16*4; i += 4 ) + { + /* convert this alpha value to a 3 bit number */ + int svalue; + int value = (int)((uncompressed[i] - a1) * scale_me); + svalue = swizzle8[ value&7 ]; + /* OK, store this value, start with the 1st byte */ + compressed[next_bit >> 3] |= svalue << (next_bit & 7); + if( (next_bit & 7) > 5 ) + { + /* spans 2 bytes, fill in the start of the 2nd byte */ + compressed[1 + (next_bit >> 3)] |= svalue >> (8 - (next_bit & 7) ); + } + next_bit += 3; + } + /* done compressing to DXT1 */ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_DXT.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_DXT.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_DXT.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_DXT.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,123 @@ +/* + Jonathan Dummer + 2007-07-31-10.32 + + simple DXT compression / decompression code + + public domain +*/ + +#ifndef HEADER_IMAGE_DXT +#define HEADER_IMAGE_DXT + +/** + Converts an image from an array of unsigned chars (RGB or RGBA) to + DXT1 or DXT5, then saves the converted image to disk. + \return 0 if failed, otherwise returns 1 +**/ +int +save_image_as_DDS +( + const char *filename, + int width, int height, int channels, + const unsigned char *const data +); + +/** + take an image and convert it to DXT1 (no alpha) +**/ +unsigned char* +convert_image_to_DXT1 +( + const unsigned char *const uncompressed, + int width, int height, int channels, + int *out_size +); + +/** + take an image and convert it to DXT5 (with alpha) +**/ +unsigned char* +convert_image_to_DXT5 +( + const unsigned char *const uncompressed, + int width, int height, int channels, + int *out_size +); + +/** A bunch of DirectDraw Surface structures and flags **/ +typedef struct +{ + unsigned int dwMagic; + unsigned int dwSize; + unsigned int dwFlags; + unsigned int dwHeight; + unsigned int dwWidth; + unsigned int dwPitchOrLinearSize; + unsigned int dwDepth; + unsigned int dwMipMapCount; + unsigned int dwReserved1[ 11 ]; + + /* DDPIXELFORMAT */ + struct + { + unsigned int dwSize; + unsigned int dwFlags; + unsigned int dwFourCC; + unsigned int dwRGBBitCount; + unsigned int dwRBitMask; + unsigned int dwGBitMask; + unsigned int dwBBitMask; + unsigned int dwAlphaBitMask; + } + sPixelFormat; + + /* DDCAPS2 */ + struct + { + unsigned int dwCaps1; + unsigned int dwCaps2; + unsigned int dwDDSX; + unsigned int dwReserved; + } + sCaps; + unsigned int dwReserved2; +} +DDS_header ; + +/* the following constants were copied directly off the MSDN website */ + +/* The dwFlags member of the original DDSURFACEDESC2 structure + can be set to one or more of the following values. */ +#define DDSD_CAPS 0x00000001 +#define DDSD_HEIGHT 0x00000002 +#define DDSD_WIDTH 0x00000004 +#define DDSD_PITCH 0x00000008 +#define DDSD_PIXELFORMAT 0x00001000 +#define DDSD_MIPMAPCOUNT 0x00020000 +#define DDSD_LINEARSIZE 0x00080000 +#define DDSD_DEPTH 0x00800000 + +/* DirectDraw Pixel Format */ +#define DDPF_ALPHAPIXELS 0x00000001 +#define DDPF_FOURCC 0x00000004 +#define DDPF_RGB 0x00000040 + +/* The dwCaps1 member of the DDSCAPS2 structure can be + set to one or more of the following values. */ +#define DDSCAPS_COMPLEX 0x00000008 +#define DDSCAPS_TEXTURE 0x00001000 +#define DDSCAPS_MIPMAP 0x00400000 + +/* The dwCaps2 member of the DDSCAPS2 structure can be + set to one or more of the following values. */ +#define DDSCAPS2_CUBEMAP 0x00000200 +#define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400 +#define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800 +#define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000 +#define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000 +#define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000 +#define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000 +#define DDSCAPS2_VOLUME 0x00200000 + +#endif /* HEADER_IMAGE_DXT */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_helper.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_helper.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_helper.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_helper.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,309 @@ +/* + Jonathan Dummer + + image helper functions + + MIT license +*/ + +#include "image_helper.h" +#include + +/* Upscaling the image uses simple bilinear interpolation */ +int + up_scale_image + ( + const unsigned char* const orig, + int width, int height, int channels, + unsigned char* resampled, + int resampled_width, int resampled_height + ) +{ + float dx, dy; + int x, y, c; + + /* error(s) check */ + if ( (width < 1) || (height < 1) || + (resampled_width < 2) || (resampled_height < 2) || + (channels < 1) || + (NULL == orig) || (NULL == resampled) ) + { + /* signify badness */ + return 0; + } + /* + for each given pixel in the new map, find the exact location + from the original map which would contribute to this guy + */ + dx = (width - 1.0f) / (resampled_width - 1.0f); + dy = (height - 1.0f) / (resampled_height - 1.0f); + for ( y = 0; y < resampled_height; ++y ) + { + /* find the base y index and fractional offset from that */ + float sampley = y * dy; + int inty = (int)sampley; + /* if( inty < 0 ) { inty = 0; } else */ + if( inty > height - 2 ) { inty = height - 2; } + sampley -= inty; + for ( x = 0; x < resampled_width; ++x ) + { + float samplex = x * dx; + int intx = (int)samplex; + int base_index; + /* find the base x index and fractional offset from that */ + /* if( intx < 0 ) { intx = 0; } else */ + if( intx > width - 2 ) { intx = width - 2; } + samplex -= intx; + /* base index into the original image */ + base_index = (inty * width + intx) * channels; + for ( c = 0; c < channels; ++c ) + { + /* do the sampling */ + float value = 0.5f; + value += orig[base_index] + *(1.0f-samplex)*(1.0f-sampley); + value += orig[base_index+channels] + *(samplex)*(1.0f-sampley); + value += orig[base_index+width*channels] + *(1.0f-samplex)*(sampley); + value += orig[base_index+width*channels+channels] + *(samplex)*(sampley); + /* move to the next channel */ + ++base_index; + /* save the new value */ + resampled[y*resampled_width*channels+x*channels+c] = + (unsigned char)(value); + } + } + } + /* done */ + return 1; +} + +int + mipmap_image + ( + const unsigned char* const orig, + int width, int height, int channels, + unsigned char* resampled, + int block_size_x, int block_size_y + ) +{ + int mip_width, mip_height; + int i, j, c; + + /* error check */ + if( (width < 1) || (height < 1) || + (channels < 1) || (orig == NULL) || + (resampled == NULL) || + (block_size_x < 1) || (block_size_y < 1) ) + { + /* nothing to do */ + return 0; + } + mip_width = width / block_size_x; + mip_height = height / block_size_y; + if( mip_width < 1 ) + { + mip_width = 1; + } + if( mip_height < 1 ) + { + mip_height = 1; + } + for( j = 0; j < mip_height; ++j ) + { + for( i = 0; i < mip_width; ++i ) + { + for( c = 0; c < channels; ++c ) + { + const int index = (j*block_size_y)*width*channels + (i*block_size_x)*channels + c; + int sum_value; + int u,v; + int u_block = block_size_x; + int v_block = block_size_y; + int block_area; + /* do a bit of checking so we don't over-run the boundaries + (necessary for non-square textures!) */ + if( block_size_x * (i+1) > width ) + { + u_block = width - i*block_size_y; + } + if( block_size_y * (j+1) > height ) + { + v_block = height - j*block_size_y; + } + block_area = u_block*v_block; + /* for this pixel, see what the average + of all the values in the block are. + note: start the sum at the rounding value, not at 0 */ + sum_value = block_area >> 1; + for( v = 0; v < v_block; ++v ) + for( u = 0; u < u_block; ++u ) + { + sum_value += orig[index + v*width*channels + u*channels]; + } + resampled[j*mip_width*channels + i*channels + c] = sum_value / block_area; + } + } + } + return 1; +} + +int + scale_image_RGB_to_NTSC_safe + ( + unsigned char* orig, + int width, int height, int channels + ) +{ + const float scale_lo = 16.0f - 0.499f; + const float scale_hi = 235.0f + 0.499f; + int i, j; + int nc = channels; + unsigned char scale_LUT[256]; + /* error check */ + if( (width < 1) || (height < 1) || + (channels < 1) || (orig == NULL) ) + { + /* nothing to do */ + return 0; + } + /* set up the scaling Look Up Table */ + for( i = 0; i < 256; ++i ) + { + scale_LUT[i] = (unsigned char)((scale_hi - scale_lo) * i / 255.0f + scale_lo); + } + /* for channels = 2 or 4, ignore the alpha component */ + nc -= 1 - (channels & 1); + /* OK, go through the image and scale any non-alpha components */ + for( i = 0; i < width*height*channels; i += channels ) + { + for( j = 0; j < nc; ++j ) + { + orig[i+j] = scale_LUT[orig[i+j]]; + } + } + return 1; +} + +unsigned char clamp_byte( int x ) { return ( (x) < 0 ? (0) : ( (x) > 255 ? 255 : (x) ) ); } + +/* + This function takes the RGB components of the image + and converts them into YCoCg. 3 components will be + re-ordered to CoYCg (for optimum DXT1 compression), + while 4 components will be ordered CoCgAY (for DXT5 + compression). +*/ +int + convert_RGB_to_YCoCg + ( + unsigned char* orig, + int width, int height, int channels + ) +{ + int i; + /* error check */ + if( (width < 1) || (height < 1) || + (channels < 3) || (channels > 4) || + (orig == NULL) ) + { + /* nothing to do */ + return -1; + } + /* do the conversion */ + if( channels == 3 ) + { + for( i = 0; i < width*height*3; i += 3 ) + { + int r = orig[i+0]; + int g = (orig[i+1] + 1) >> 1; + int b = orig[i+2]; + int tmp = (2 + r + b) >> 2; + /* Co */ + orig[i+0] = clamp_byte( 128 + ((r - b + 1) >> 1) ); + /* Y */ + orig[i+1] = clamp_byte( g + tmp ); + /* Cg */ + orig[i+2] = clamp_byte( 128 + g - tmp ); + } + } else + { + for( i = 0; i < width*height*4; i += 4 ) + { + int r = orig[i+0]; + int g = (orig[i+1] + 1) >> 1; + int b = orig[i+2]; + unsigned char a = orig[i+3]; + int tmp = (2 + r + b) >> 2; + /* Co */ + orig[i+0] = clamp_byte( 128 + ((r - b + 1) >> 1) ); + /* Cg */ + orig[i+1] = clamp_byte( 128 + g - tmp ); + /* Alpha */ + orig[i+2] = a; + /* Y */ + orig[i+3] = clamp_byte( g + tmp ); + } + } + /* done */ + return 0; +} + +/* + This function takes the YCoCg components of the image + and converts them into RGB. See above. +*/ +int + convert_YCoCg_to_RGB + ( + unsigned char* orig, + int width, int height, int channels + ) +{ + int i; + /* error check */ + if( (width < 1) || (height < 1) || + (channels < 3) || (channels > 4) || + (orig == NULL) ) + { + /* nothing to do */ + return -1; + } + /* do the conversion */ + if( channels == 3 ) + { + for( i = 0; i < width*height*3; i += 3 ) + { + int co = orig[i+0] - 128; + int y = orig[i+1]; + int cg = orig[i+2] - 128; + /* R */ + orig[i+0] = clamp_byte( y + co - cg ); + /* G */ + orig[i+1] = clamp_byte( y + cg ); + /* B */ + orig[i+2] = clamp_byte( y - co - cg ); + } + } else + { + for( i = 0; i < width*height*4; i += 4 ) + { + int co = orig[i+0] - 128; + int cg = orig[i+1] - 128; + unsigned char a = orig[i+2]; + int y = orig[i+3]; + /* R */ + orig[i+0] = clamp_byte( y + co - cg ); + /* G */ + orig[i+1] = clamp_byte( y + cg ); + /* B */ + orig[i+2] = clamp_byte( y - co - cg ); + /* A */ + orig[i+3] = a; + } + } + /* done */ + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_helper.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_helper.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_helper.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/image_helper.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,89 @@ +/* + Jonathan Dummer + + GLFW helper functions + + MIT license +*/ + +#ifndef HEADER_IMAGE_HELPER +#define HEADER_IMAGE_HELPER + +#ifdef __cplusplus +extern "C" { +#endif + +/** + This function upscales an image. + Not to be used to create MIPmaps, + but to make it square, + or to make it a power-of-two sized. +**/ +int + up_scale_image + ( + const unsigned char* const orig, + int width, int height, int channels, + unsigned char* resampled, + int resampled_width, int resampled_height + ); + +/** + This function downscales an image. + Used for creating MIPmaps, + the incoming image should be a + power-of-two sized. +**/ +int + mipmap_image + ( + const unsigned char* const orig, + int width, int height, int channels, + unsigned char* resampled, + int block_size_x, int block_size_y + ); + +/** + This function takes the RGB components of the image + and scales each channel from [0,255] to [16,235]. + This makes the colors "Safe" for display on NTSC + displays. Note that this is _NOT_ a good idea for + loading images like normal- or height-maps! +**/ +int + scale_image_RGB_to_NTSC_safe + ( + unsigned char* orig, + int width, int height, int channels + ); + +/** + This function takes the RGB components of the image + and converts them into YCoCg. 3 components will be + re-ordered to CoYCg (for optimum DXT1 compression), + while 4 components will be ordered CoCgAY (for DXT5 + compression). +**/ +int + convert_RGB_to_YCoCg + ( + unsigned char* orig, + int width, int height, int channels + ); + +/** + This function takes the YCoCg components of the image + and converts them into RGB. See above. +**/ +int + convert_YCoCg_to_RGB + ( + unsigned char* orig, + int width, int height, int channels + ); + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_IMAGE_HELPER */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCond.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCond.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCond.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCond.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,147 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/* Library functions to manipulate initial condition values */ + +#include +#include +#include + +#include "Common.hpp" +#include "fatal.h" + +#include "Expr.hpp" +#include "InitCond.hpp" +#include "Param.hpp" +#include + +#include "wipemalloc.h" +#include +#include + +char InitCond::init_cond_string_buffer[STRING_BUFFER_SIZE]; +int InitCond::init_cond_string_buffer_index = 0; + +/* Creates a new initial condition */ +InitCond::InitCond( Param * _param, CValue _init_val ):param(_param), init_val(_init_val) { + + + // std::cerr << "InitCond::InitCond: " << this->param->name << std::endl; + + assert(param); + assert(param->engine_val); +} + +/* Frees initial condition structure */ +InitCond::~InitCond() {} + +void InitCond::evaluate() +{ + evaluate(false); +} + +/* Evaluate an initial conditon */ +void InitCond::evaluate(bool evalUser) { + + + + assert(this); + assert(param); + +if (param->flags & P_FLAG_USERDEF && !evalUser) + return; + + /* Set matrix flag to zero. This ensures + its constant value will be used rather than a matrix value + */ +param->matrix_flag = false; + + /* Parameter is of boolean type, either true/false */ + + if (param->type == P_TYPE_BOOL) { + + // printf( "init_cond: %s = %d (TYPE BOOL)\n", param->name.c_str(), init_val.bool_val); + //std::cerr << "[InitCond] param is a boolean of with name " + // << param->name << std::endl; + + assert(param->engine_val); + + *((bool*)param->engine_val) = init_val.bool_val; + + return; + } + + /* Parameter is an integer type, just like C */ + + if ( param->type == P_TYPE_INT) { + assert(param->engine_val); + *((int*)param->engine_val) = init_val.int_val; + return; + } + + /* Parameter is of a float type, just like C */ + + if (param->type == P_TYPE_DOUBLE) { + assert(param->engine_val); + *((float*)param->engine_val) = init_val.float_val; + return; + } + + /* Unknown type of parameter */ + return; +} + +/* WIP */ +void InitCond::init_cond_to_string() { + + int string_length; + char string[MAX_TOKEN_SIZE]; + + /* Create a string "param_name=val" */ + switch (param->type) { + + case P_TYPE_BOOL: + sprintf(string, "%s=%d\n", param->name.c_str(), init_val.bool_val); + break; + case P_TYPE_INT: + sprintf(string, "%s=%d\n", param->name.c_str(), init_val.int_val); + break; + case P_TYPE_DOUBLE: + sprintf(string, "%s=%f\n", param->name.c_str(), init_val.float_val); + break; + default: + return; + } + + /* Compute the length of the string */ + string_length = strlen(string); + + /* Buffer overflow check */ + if ((init_cond_string_buffer_index + string_length + 1) > (STRING_BUFFER_SIZE - 1)) + return; + + /* Copy the string into the initial condition string buffer */ + strncpy(init_cond_string_buffer + init_cond_string_buffer_index, string, string_length); + + /* Increment the string buffer, offset by one for the null terminator, which will be + overwritten by the next call to this function */ + init_cond_string_buffer_index+= string_length + 1; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCond.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCond.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCond.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCond.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,60 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Initial condition + * + * $Log$ + */ + +#ifndef _INIT_COND_HPP +#define _INIT_COND_HPP + + +//#define INIT_COND_DEBUG 2 +#define INIT_COND_DEBUG 0 + +#include "Param.hpp" + +class InitCond; +class Param; +#include + +class InitCond { +public: + Param *param; + CValue init_val; + + static char init_cond_string_buffer[STRING_BUFFER_SIZE]; + static int init_cond_string_buffer_index; + + InitCond( Param * param, CValue init_val); + ~InitCond(); + void evaluate(); //Wrapper around following declaration + void evaluate(bool evalUser); + + void init_cond_to_string(); + void write_init(); + }; + + +#endif /** !_INIT_COND_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCondUtils.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCondUtils.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCondUtils.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/InitCondUtils.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,78 @@ +#ifndef _INIT_COND_UTILS_HPP +#define _INIT_COND_UTILS_HPP +#include +#include "InitCond.hpp" +#include + +namespace InitCondUtils { +class LoadUnspecInitCond { + public: + + LoadUnspecInitCond(std::map & initCondTree, std::map & perFrameInitEqnTree): + m_initCondTree(initCondTree), m_perFrameInitEqnTree(perFrameInitEqnTree) {} + + void operator()(Param * param); + + private: + std::map & m_initCondTree; + std::map & m_perFrameInitEqnTree; +}; + + +inline void LoadUnspecInitCond::operator() (Param * param) { + + InitCond * init_cond = 0; + CValue init_val; + + assert(param); + assert(param->engine_val); + + + /* Don't count these parameters as initial conditions */ + if (param->flags & P_FLAG_READONLY) + return; + if (param->flags & P_FLAG_QVAR) + return; +// if (param->flags & P_FLAG_TVAR) + // return; + if (param->flags & P_FLAG_USERDEF) + return; + + /* If initial condition was not defined by the preset file, force a default one + with the following code */ + + if (m_initCondTree.find(param->name) == m_initCondTree.end()) { + + /* Make sure initial condition does not exist in the set of per frame initial equations */ + if (m_perFrameInitEqnTree.find(param->name) != m_perFrameInitEqnTree.end()) + return; + + // Set an initial vialue via correct union member + if (param->type == P_TYPE_BOOL) + init_val.bool_val = param->default_init_val.bool_val; + else if (param->type == P_TYPE_INT) + init_val.int_val = param->default_init_val.int_val; + + else if (param->type == P_TYPE_DOUBLE) { + init_val.float_val = param->default_init_val.float_val; + } + + //printf("%s\n", param->name); + /* Create new initial condition */ + //std::cerr << "[InitCondUtils] creating an unspecified initial condition of name " << param->name << std::endl; + if ((init_cond = new InitCond(param, init_val)) == NULL) { + abort(); + } + + /* Insert the initial condition into this presets tree */ + std::pair::iterator, bool> inserteePair = + m_initCondTree.insert(std::make_pair(init_cond->param->name, init_cond)); + assert(inserteePair.second); + assert(inserteePair.first->second); + } else + assert(m_initCondTree.find(param->name)->second); + + +} +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/KeyHandler.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/KeyHandler.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/KeyHandler.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/KeyHandler.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,244 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ + +#include + +#include "Common.hpp" +#include "fatal.h" +#include "KeyHandler.hpp" +#include "event.h" +#include "BeatDetect.hpp" +#include "PresetChooser.hpp" +#include "Renderer.hpp" +#include "projectM.hpp" + +#include +#include "TimeKeeper.hpp" + + +class Preset; +interface_t current_interface = DEFAULT_INTERFACE; + +void refreshConsole() { + + switch (current_interface) { + + case MENU_INTERFACE: + // unimplemented + break; + case SHELL_INTERFACE: + // unimplemented + break; + case EDITOR_INTERFACE: + // unimplemented + break; + case DEFAULT_INTERFACE: + break; + case BROWSER_INTERFACE: + // unimplemented + break; + default: + break; + } + +} + +DLLEXPORT void projectM::key_handler( projectMEvent event, + projectMKeycode keycode, projectMModifier modifier ) { + + switch( event ) { + + + case PROJECTM_KEYDOWN: + + //default_key_handler(); + switch (current_interface) + { + + case MENU_INTERFACE: +// menu_key_handler(this, event, keycode); + break; + case SHELL_INTERFACE: + //shell_key_handler(); + break; + case EDITOR_INTERFACE: +// editor_key_handler(event,keycode); + break; + case BROWSER_INTERFACE: +// browser_key_handler(event,keycode,modifier); + break; + case DEFAULT_INTERFACE: + default_key_handler(event,keycode); + break; + default: + default_key_handler(event,keycode); + break; + + } + break; + default: + break; + + } +} + +void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode) { + + switch( event ) { + + case PROJECTM_KEYDOWN: + + switch( keycode ) + { + case PROJECTM_K_UP: + beatDetect->beat_sensitivity += 0.25; + if (beatDetect->beat_sensitivity > 5.0) beatDetect->beat_sensitivity = 5.0; + break; + case PROJECTM_K_DOWN: + beatDetect->beat_sensitivity -= 0.25; + if (beatDetect->beat_sensitivity < 0) beatDetect->beat_sensitivity = 0; + break; + case PROJECTM_K_h: + renderer->showhelp = !renderer->showhelp; + renderer->showstats= false; + renderer->showfps=false; + case PROJECTM_K_F1: + renderer->showhelp = !renderer->showhelp; + renderer->showstats=false; + renderer->showfps=false; + break; + case PROJECTM_K_y: + this->setShuffleEnabled(!this->isShuffleEnabled()); + break; + + case PROJECTM_K_F5: + if (!renderer->showhelp) + renderer->showfps = !renderer->showfps; + break; + case PROJECTM_K_F4: + if (!renderer->showhelp) + renderer->showstats = !renderer->showstats; + break; + case PROJECTM_K_F3: { + renderer->showpreset = !renderer->showpreset; + break; + } + case PROJECTM_K_F2: + renderer->showtitle = !renderer->showtitle; + break; +#ifndef MACOS + case PROJECTM_K_F9: +#else + case PROJECTM_K_F8: +#endif + + renderer->studio = !renderer->studio; + break; + + case PROJECTM_K_ESCAPE: { +// exit( 1 ); + break; + } + case PROJECTM_K_f: + + break; + case PROJECTM_K_a: + renderer->correction = !renderer->correction; + break; + case PROJECTM_K_b: + break; + case PROJECTM_K_n: + m_presetChooser->nextPreset(*m_presetPos); + presetSwitchedEvent(true, **m_presetPos); + m_activePreset = m_presetPos->allocate(this->presetInputs, this->presetOutputs); + renderer->setPresetName(m_activePreset->presetName()); + timeKeeper->StartPreset(); + break; + + case PROJECTM_K_r: + + if (m_presetChooser->empty()) + break; + + *m_presetPos = m_presetChooser->weightedRandom(); + presetSwitchedEvent(true, **m_presetPos); + m_activePreset = m_presetPos->allocate(this->presetInputs, this->presetOutputs); + + assert(m_activePreset.get()); + + renderer->setPresetName(m_activePreset->presetName()); + + timeKeeper->StartPreset(); + break; + case PROJECTM_K_p: + + if (m_presetChooser->empty()) + break; + + // Case: idle preset currently running, selected last preset of chooser + else if (*m_presetPos == m_presetChooser->end()) { + --(*m_presetPos); + } + + else if (*m_presetPos != m_presetChooser->begin()) { + --(*m_presetPos); + } + + else { + *m_presetPos = m_presetChooser->end(); + --(*m_presetPos); + } + + m_activePreset = m_presetPos->allocate(this->presetInputs, this->presetOutputs); + renderer->setPresetName(m_activePreset->presetName()); + + timeKeeper->StartPreset(); + break; + case PROJECTM_K_l: + renderer->noSwitch=!renderer->noSwitch; + break; + case PROJECTM_K_s: + renderer->studio = !renderer->studio; + case PROJECTM_K_i: + break; + case PROJECTM_K_z: + break; + case PROJECTM_K_0: +// nWaveMode=0; + break; + case PROJECTM_K_6: +// nWaveMode=6; + break; + case PROJECTM_K_7: +// nWaveMode=7; + break; + case PROJECTM_K_m: + break; + case PROJECTM_K_t: + break; + default: + break; + } + default: + break; + + } +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/KeyHandler.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/KeyHandler.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/KeyHandler.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/KeyHandler.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,39 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: console_interface.h,v 1.1.1.1 2005/12/23 18:05:03 psperl Exp $ + * + * $Log$ + */ + +#ifndef _KEY_HANDLER_HPP +#define _KEY_HANDLER_HPP + +#include "event.h" +class projectM; +void default_key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode); +void refreshConsole(); +#if defined(__CPLUSPLUS) && !defined(MACOS) +extern "C" void key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode, projectMModifier modifier ); +#else +extern void key_handler(projectM *PM, projectMEvent event, projectMKeycode keycode, projectMModifier modifier ); +#endif +#endif /** !_KEY_HANDLER_HPP */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.dsp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.dsp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.dsp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.dsp 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,348 @@ +# Microsoft Developer Studio Project File - Name="libprojectM" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=libprojectM - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "libprojectM.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "libprojectM.mak" CFG="libprojectM - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libprojectM - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "libprojectM - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "libprojectM - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "libprojectM - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "DEBUG" /YX /FD /GZ /c +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "libprojectM - Win32 Release" +# Name "libprojectM - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\BeatDetect.cpp +# End Source File +# Begin Source File + +SOURCE=.\browser.cpp +# End Source File +# Begin Source File + +SOURCE=.\builtin_funcs.cpp +# End Source File +# Begin Source File + +SOURCE=.\console_interface.cpp +# End Source File +# Begin Source File + +SOURCE=.\CustomShape.cpp +# End Source File +# Begin Source File + +SOURCE=.\CustomWave.cpp +# End Source File +# Begin Source File + +SOURCE=.\editor.cpp +# End Source File +# Begin Source File + +SOURCE=.\Eval.cpp +# End Source File +# Begin Source File + +SOURCE=.\Expr.cpp +# End Source File +# Begin Source File + +SOURCE=.\fftsg.cpp +# End Source File +# Begin Source File + +SOURCE=.\Func.cpp +# End Source File +# Begin Source File + +SOURCE=.\glConsole.cpp +# End Source File +# Begin Source File + +SOURCE=.\InitCond.cpp +# End Source File +# Begin Source File + +SOURCE=.\menu.cpp +# End Source File +# Begin Source File + +SOURCE=.\Param.cpp +# End Source File +# Begin Source File + +SOURCE=.\Parser.cpp +# End Source File +# Begin Source File + +SOURCE=.\pbuffer.cpp +# End Source File +# Begin Source File + +SOURCE=.\PCM.cpp +# End Source File +# Begin Source File + +SOURCE=.\PerFrameEqn.cpp +# End Source File +# Begin Source File + +SOURCE=.\PerPixelEqn.cpp +# End Source File +# Begin Source File + +SOURCE=.\PerPointEqn.cpp +# End Source File +# Begin Source File + +SOURCE=.\Preset.cpp +# End Source File +# Begin Source File + +SOURCE=.\projectM.cpp +# End Source File +# Begin Source File + +SOURCE=.\SplayTree.cpp +# End Source File +# Begin Source File + +SOURCE=.\timer.cpp +# End Source File +# Begin Source File + +SOURCE=".\win32-dirent.cpp" +# End Source File +# Begin Source File + +SOURCE=.\wipemalloc.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\BeatDetect.h +# End Source File +# Begin Source File + +SOURCE=.\browser.h +# End Source File +# Begin Source File + +SOURCE=.\builtin_funcs.h +# End Source File +# Begin Source File + +SOURCE=.\carbontoprojectM.h +# End Source File +# Begin Source File + +SOURCE=.\common.h +# End Source File +# Begin Source File + +SOURCE=.\compare.h +# End Source File +# Begin Source File + +SOURCE=.\console_interface.h +# End Source File +# Begin Source File + +SOURCE=.\CustomShape.h +# End Source File +# Begin Source File + +SOURCE=.\CustomWave.h +# End Source File +# Begin Source File + +SOURCE=.\CValue.h +# End Source File +# Begin Source File + +SOURCE=.\dlldefs.h +# End Source File +# Begin Source File + +SOURCE=.\editor.h +# End Source File +# Begin Source File + +SOURCE=.\Eval.h +# End Source File +# Begin Source File + +SOURCE=.\event.h +# End Source File +# Begin Source File + +SOURCE=.\Expr.h +# End Source File +# Begin Source File + +SOURCE=.\fatal.h +# End Source File +# Begin Source File + +SOURCE=.\fftsg.h +# End Source File +# Begin Source File + +SOURCE=.\Func.h +# End Source File +# Begin Source File + +SOURCE=.\glConsole.h +# End Source File +# Begin Source File + +SOURCE=.\glf.h +# End Source File +# Begin Source File + +SOURCE=.\InitCond.h +# End Source File +# Begin Source File + +SOURCE=.\lvtoprojectM.h +# End Source File +# Begin Source File + +SOURCE=.\menu.h +# End Source File +# Begin Source File + +SOURCE=.\Param.h +# End Source File +# Begin Source File + +SOURCE=.\Parser.h +# End Source File +# Begin Source File + +SOURCE=.\pbuffer.h +# End Source File +# Begin Source File + +SOURCE=.\PCM.h +# End Source File +# Begin Source File + +SOURCE=.\PerFrameEqn.h +# End Source File +# Begin Source File + +SOURCE=.\PerPixelEqn.h +# End Source File +# Begin Source File + +SOURCE=.\PerPointEqn.h +# End Source File +# Begin Source File + +SOURCE=.\Preset.h +# End Source File +# Begin Source File + +SOURCE=.\projectM.h +# End Source File +# Begin Source File + +SOURCE=.\sdltoprojectM.h +# End Source File +# Begin Source File + +SOURCE=.\SplayTree.h +# End Source File +# Begin Source File + +SOURCE=.\timer.h +# End Source File +# Begin Source File + +SOURCE=".\win32-dirent.h" +# End Source File +# Begin Source File + +SOURCE=.\wipemalloc.h +# End Source File +# End Group +# End Target +# End Project Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.opt and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.opt differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.pc.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.pc.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.pc.in 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,13 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@CMAKE_INSTALL_PREFIX@/lib +includedir=@CMAKE_INSTALL_PREFIX@/include +pkgdatadir=@CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@ +sysconfdir=@CMAKE_INSTALL_PREFIX@/@RESOURCE_PREFIX@ + +Name: libprojectM +Version: 1.2.0 +Description: projectM - OpenGL Milkdrop +Requires: +Libs: -L${libdir} -lprojectM +Cflags: -I${includedir} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.plg kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.plg --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.plg 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.plg 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,78 @@ + + +
+

Build Log

+

+--------------------Configuration: libprojectM - Win32 Debug-------------------- +

+

Command Lines

+Creating temporary file "C:\DOCUME~1\descarte\LOCALS~1\Temp\RSP2E1.tmp" with contents +[ +/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "DEBUG" /Fp"Debug/libprojectM.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c +"C:\tmp\projectM-1.00\src\libprojectM\browser.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\builtin_funcs.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\console_interface.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\CustomShape.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\CustomWave.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\editor.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\Eval.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\Expr.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\Func.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\glConsole.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\InitCond.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\menu.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\Param.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\Parser.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\PerFrameEqn.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\PerPixelEqn.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\PerPointEqn.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\Preset.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\projectM.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\SplayTree.cpp" +"C:\tmp\projectM-1.00\src\libprojectM\win32-dirent.cpp" +] +Creating command line "cl.exe @C:\DOCUME~1\descarte\LOCALS~1\Temp\RSP2E1.tmp" +Creating temporary file "C:\DOCUME~1\descarte\LOCALS~1\Temp\RSP2E2.tmp" with contents +[ +/nologo /out:"Debug\libprojectM.lib" +".\Debug\BeatDetect.obj" +".\Debug\browser.obj" +".\Debug\builtin_funcs.obj" +".\Debug\console_interface.obj" +".\Debug\CustomShape.obj" +".\Debug\CustomWave.obj" +".\Debug\editor.obj" +".\Debug\Eval.obj" +".\Debug\Expr.obj" +".\Debug\fftsg.obj" +".\Debug\Func.obj" +".\Debug\glConsole.obj" +".\Debug\InitCond.obj" +".\Debug\menu.obj" +".\Debug\Param.obj" +".\Debug\Parser.obj" +".\Debug\pbuffer.obj" +".\Debug\PCM.obj" +".\Debug\PerFrameEqn.obj" +".\Debug\PerPixelEqn.obj" +".\Debug\PerPointEqn.obj" +".\Debug\Preset.obj" +".\Debug\projectM.obj" +".\Debug\SplayTree.obj" +".\Debug\timer.obj" +".\Debug\win32-dirent.obj" +".\Debug\wipemalloc.obj" +] +Creating command line "link.exe -lib @C:\DOCUME~1\descarte\LOCALS~1\Temp\RSP2E2.tmp" +

Output Window

+Compiling... +browser.cpp +builtin_funcs.cpp +console_interface.cpp +CustomShape.cpp +CustomWave.cpp +cl.exe terminated at user request. + +
+ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.rc kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.rc --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.rc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.rc 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,61 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE 9, 1 +#pragma code_page(1252) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.sln kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.sln --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.sln 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.sln 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libprojectM", "libprojectM.vcproj", "{31B91091-431A-4842-8682-2A04B51C980A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {31B91091-431A-4842-8682-2A04B51C980A}.Debug|Win32.ActiveCfg = Debug|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Debug|Win32.Build.0 = Debug|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Release|Win32.ActiveCfg = Release|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.suo and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/libprojectM.suo differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/lvtoprojectM.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/lvtoprojectM.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/lvtoprojectM.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/lvtoprojectM.h 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,156 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: sdltoprojectM.hpp,v 1.1 2004/10/08 00:35:28 cvs Exp $ + * + * Translates SDL -> projectM variables + * + * $Log: sdltoprojectM.hpp,v $ + * Revision 1.1 2004/10/08 00:35:28 cvs + * Moved and imported + * + * Revision 1.1.1.1 2004/10/04 12:56:00 cvs + * Imported + * + */ + +#include + +projectMEvent lv2pmEvent( VisEventType event ) { + + switch ( event ) { + case VISUAL_EVENT_RESIZE: + return PROJECTM_VIDEORESIZE; + case VISUAL_EVENT_KEYUP: + return PROJECTM_KEYUP; + case VISUAL_EVENT_KEYDOWN: + return PROJECTM_KEYDOWN; + default: + return PROJECTM_KEYUP; + } + } +projectMKeycode lv2pmKeycode( VisKey keysym ) +{ + switch ( keysym ) + { + case VKEY_F1: + return PROJECTM_K_F1; + case VKEY_F2: + return PROJECTM_K_F2; + case VKEY_F3: + return PROJECTM_K_F3; + case VKEY_F4: + return PROJECTM_K_F4; + case VKEY_F5: + return PROJECTM_K_F5; + case VKEY_F6: + return PROJECTM_K_F6; + case VKEY_F7: + return PROJECTM_K_F7; + case VKEY_F8: + return PROJECTM_K_F8; + case VKEY_F9: + return PROJECTM_K_F9; + case VKEY_F10: + return PROJECTM_K_F10; + case VKEY_F11: + return PROJECTM_K_F11; + case VKEY_F12: + return PROJECTM_K_F12; + case VKEY_ESCAPE: + return PROJECTM_K_ESCAPE; + case VKEY_a: + return PROJECTM_K_a; + case VKEY_b: + return PROJECTM_K_b; + case VKEY_c: + return PROJECTM_K_c; + case VKEY_d: + return PROJECTM_K_d; + case VKEY_e: + return PROJECTM_K_e; + case VKEY_f: + return PROJECTM_K_f; + case VKEY_g: + return PROJECTM_K_g; + case VKEY_h: + return PROJECTM_K_h; + case VKEY_i: + return PROJECTM_K_i; + case VKEY_j: + return PROJECTM_K_j; + case VKEY_k: + return PROJECTM_K_k; + case VKEY_l: + return PROJECTM_K_l; + case VKEY_m: + return PROJECTM_K_m; + case VKEY_n: + return PROJECTM_K_n; + case VKEY_o: + return PROJECTM_K_o; + case VKEY_p: + return PROJECTM_K_p; + case VKEY_q: + return PROJECTM_K_q; + case VKEY_r: + return PROJECTM_K_r; + case VKEY_s: + return PROJECTM_K_s; + case VKEY_t: + return PROJECTM_K_t; + case VKEY_u: + return PROJECTM_K_u; + case VKEY_v: + return PROJECTM_K_v; + case VKEY_w: + return PROJECTM_K_w; + case VKEY_x: + return PROJECTM_K_x; + case VKEY_y: + return PROJECTM_K_y; + case VKEY_z: + return PROJECTM_K_z; + case VKEY_UP: + return PROJECTM_K_UP; + case VKEY_RETURN: + return PROJECTM_K_RETURN; + case VKEY_RIGHT: + return PROJECTM_K_RIGHT; + case VKEY_LEFT: + return PROJECTM_K_LEFT; + case VKEY_DOWN: + return PROJECTM_K_DOWN; + case VKEY_PAGEUP: + return PROJECTM_K_PAGEUP; + case VKEY_PAGEDOWN: + return PROJECTM_K_PAGEDOWN; + + + default: + return PROJECTM_K_NONE; + break; + } + } + +projectMModifier lv2pmModifier( int mod ) { + return mod && VKMOD_LSHIFT; + } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Param.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Param.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Param.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Param.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,198 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ + +/* Basic Parameter Functions */ + +#include +#include +#include +#include + +#include "fatal.h" +#include "Common.hpp" + +#include "CustomShape.hpp" +#include "Eval.hpp" +#include "Expr.hpp" +#include "InitCond.hpp" +#include "Param.hpp" +#include "Preset.hpp" +#include +#include + +/** Constructor */ +Param::Param( std::string _name, short int _type, short int _flags, void * _engine_val, void * _matrix, + CValue _default_init_val, CValue _upper_bound, CValue _lower_bound): + name(_name), + type(_type), + flags (_flags), + matrix_flag (0), + engine_val(_engine_val), + matrix (_matrix), + default_init_val (_default_init_val), + upper_bound (_upper_bound), + lower_bound (_lower_bound) + { + +} + + +/* Creates a user defined parameter */ +Param::Param(std::string _name) : + name(_name), + type(P_TYPE_DOUBLE), + flags(P_FLAG_USERDEF), + matrix_flag(0), + matrix(0) + { + + engine_val = new float(); + + default_init_val.float_val = DEFAULT_DOUBLE_IV; + upper_bound.float_val = DEFAULT_DOUBLE_UB; + lower_bound.float_val = DEFAULT_DOUBLE_LB; + + /// @note may have fixed a recent bug. testing + *((float*)engine_val) = default_init_val.float_val; + + +} + +/* Free's a parameter type */ +Param::~Param() { + + // I hate this, but will let it be for now + if (flags & P_FLAG_USERDEF) { + delete((double*)engine_val); + } + + if (PARAM_DEBUG) printf("~Param: freeing \"%s\".\n", name.c_str()); +} + + +/* Returns nonzero if the string is valid parameter name */ +bool Param::is_valid_param_string( const char * string ) { + + if (string == NULL) + return false; + + /* This ensures the first character is non numeric */ + if ( ((*string) >= 48) && ((*string) <= 57)) + return false; + + /* These probably should never happen */ + if (*string == '.') + return false; + + if (*string == '+') + return false; + + if (*string == '-') + return false; + + /* Could also add checks for other symbols. May do later */ + + return true; + +} + + + +/* Loads a float parameter into the builtin database */ +Param * Param::new_param_float(const char * name, short int flags, void * engine_val, void * matrix, + float upper_bound, float lower_bound, float init_val) { + + Param * param; + CValue iv, ub, lb; + assert(engine_val); + + iv.float_val = init_val; + ub.float_val = upper_bound; + lb.float_val = lower_bound; + + if ((param = new Param(name, P_TYPE_DOUBLE, flags, engine_val, matrix,iv, ub, lb)) == NULL) + return NULL; + + + /* Finished, return success */ + return param; +} + +/* Creates a new parameter of type int */ +Param * Param::new_param_int(const char * name, short int flags, void * engine_val, + int upper_bound, int lower_bound, int init_val) { + + Param * param; + CValue iv, ub, lb; + assert(engine_val); + + iv.int_val = init_val; + ub.int_val = upper_bound; + lb.int_val = lower_bound; + + if ((param = new Param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb)) == NULL) + return NULL; + + + /* Finished, return success */ + return param; +} + +/* Creates a new parameter of type bool */ +Param * Param::new_param_bool(const char * name, short int flags, void * engine_val, + bool upper_bound, bool lower_bound, bool init_val) { + + Param * param; + CValue iv, ub, lb; + assert(engine_val); + + iv.bool_val = init_val; + ub.bool_val = upper_bound; + lb.bool_val = lower_bound; + + if ((param = new Param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb)) == NULL) + return NULL; + + + /* Finished, return success */ + return param; +} + +/* Creates a new parameter of type string */ +Param * Param::new_param_string(const char * name, short int flags, void * engine_val) { + + Param * param; + CValue iv, ub, lb; + assert(engine_val); + + iv.bool_val = 0; + ub.bool_val = 0; + lb.bool_val = 0; + + if ((param = new Param(name, P_TYPE_STRING, flags, engine_val, NULL, iv, ub, lb)) == NULL) + return NULL; + + + /* Finished, return success */ + return param; +} + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Param.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Param.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Param.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Param.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,151 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Parameter used within a preset + * + * $Log$ + */ + +#ifndef _PARAM_H +#define _PARAM_H + +/* Debug level, zero for none */ +#define PARAM_DEBUG 0 + +#define P_CREATE 1 +#define P_NONE 0 + +#define P_TYPE_BOOL 0 +#define P_TYPE_INT 1 +#define P_TYPE_DOUBLE 2 +#define P_TYPE_STRING 3 + +#define P_FLAG_NONE 0 +#define P_FLAG_READONLY 1 +#define P_FLAG_USERDEF (1 << 1) +#define P_FLAG_QVAR (1 << 2) +#define P_FLAG_TVAR (1 << 3) +#define P_FLAG_ALWAYS_MATRIX (1 << 4) +#define P_FLAG_PER_PIXEL (1 << 6) +#define P_FLAG_PER_POINT (1 << 7) + + +#include "Expr.hpp" +#include "Common.hpp" +#include +#include +class InitCond; +class Param; +class Preset; +//#include + +/* Parameter Type */ +class Param { +public: + std::string name; /* name of the parameter, not necessary but useful neverthless */ + short int type; /* parameter number type (int, bool, or float) */ + short int flags; /* read, write, user defined, etc */ + short int matrix_flag; /* for optimization purposes */ + void * engine_val; /* pointer to the engine variable */ + void * matrix; /* per pixel / per point matrix for this variable */ + CValue default_init_val; /* a default initial condition value */ + CValue upper_bound; /* this parameter's upper bound */ + CValue lower_bound; /* this parameter's lower bound */ + + /// Create a new parameter + Param(std::string name, short int type, short int flags, + void * eqn_val, void *matrix, + CValue default_init_val, CValue upper_bound, + CValue lower_bound); + + ~Param(); + + /// Create a user defined floating point parameter + Param( std::string name ); + + static bool is_valid_param_string( const char *string ); + void set_param( float val ); + + static Param *new_param_float( const char *name, short int flags, void *engine_val, + void *matrix, float upper_bound, + float lower_bound, + float init_val ); + static Param *new_param_double(const char *name, short int flags, void *engine_val, + void *matrix, double upper_bound, + double lower_bound, + double init_val ); + static Param * new_param_int(const char * name, short int flags, void * engine_val, + int upper_bound, int lower_bound, int init_val ); + static Param * new_param_bool(const char * name, short int flags, void * engine_val, + bool upper_bound, bool lower_bound, bool init_val ); + static Param * new_param_string(const char * name, short int flags, void * engine_val); + +}; + + +/* Sets the parameter engine value to value val. + clipping occurs if necessary */ +inline void Param::set_param( float val) { + + switch (type) { + + case P_TYPE_BOOL: + if (val < 0) + *((bool*)engine_val) = false; + else if (val > 0) + *((bool*)engine_val) = true; + else + *((bool*)engine_val) = false; + break; + case P_TYPE_INT: + /* Make sure value is an integer */ + val = floor(val); + if (val < lower_bound.int_val) + *((int*)engine_val) = lower_bound.int_val; + else if (val > upper_bound.int_val) + *((int*)engine_val) = upper_bound.int_val; + else + *((int*)engine_val) = (int)val; + break; + case P_TYPE_DOUBLE: + /* Make sure value is an integer */ + + + if (val < lower_bound.float_val) + *((float*)engine_val) = lower_bound.float_val; + else if (val > upper_bound.float_val) + *((float*)engine_val) = upper_bound.float_val; + else + *((float*)engine_val) = val; + break; + default: + abort(); + break; + + } + + return; +} + +#endif /** !_PARAM_TYPES_H */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/ParamUtils.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/ParamUtils.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/ParamUtils.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/ParamUtils.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,88 @@ +/** ParamUtils.hpp: + * A collection of utility functions to make using parameter types easier. + * In reality, this stuff belongs elsewhere, but one step at a time + */ +#ifndef _PARAM_UTILS_HPP +#define _PARAM_UTILS_HPP + +#include "Param.hpp" +#include +#include + + +class BuiltinParams; + +class ParamUtils +{ +public: + static bool insert(Param * param, std::map * paramTree) + { + + assert(param); + assert(paramTree); + + + return ((paramTree->insert(std::make_pair(param->name,param))).second); + + } + + static const int AUTO_CREATE = 1; + static const int NO_CREATE = 0; + + template + static Param * find(std::string name, std::map * paramTree) + { + + assert(paramTree); + + Param * param; + + /* First look in the suggested database */ + std::map::iterator pos = paramTree->find(name); + + + if ((FLAGS == AUTO_CREATE) && ((pos == paramTree->end()))) + { + /* Check if string is valid */ + if (!Param::is_valid_param_string(name.c_str())) + return NULL; + + /* Now, create the user defined parameter given the passed name */ + if ((param = new Param(name)) == NULL) + return NULL; + + /* Finally, insert the new parameter into this preset's parameter tree */ + std::pair::iterator, bool> insertRetPair = + paramTree->insert(std::make_pair(param->name, param)); + + assert(insertRetPair.second); + + } else if (pos != paramTree->end()) + param = pos->second; + else + param = NULL; + + /* Return the found (or created) parameter. Note that this could be null */ + return param; + + + } + + + static Param * find(const std::string & name, BuiltinParams * builtinParams, std::map * insertionTree) + { + + Param * param; + + // Check first db + if ((param = builtinParams->find_builtin_param(name)) != 0) + return param; + + // Check second db, create if necessary + return find(name, insertionTree); + + } + +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Parser.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Parser.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Parser.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Parser.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2567 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU +* License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/* parser.c */ + +#include +#include +#include +#include +#include + +#include "Common.hpp" +#include "fatal.h" + +#include "CustomWave.hpp" +#include "CustomShape.hpp" +#include "Expr.hpp" +#include "Eval.hpp" +#include "Func.hpp" +#include "InitCond.hpp" +#include "Param.hpp" +#include "Preset.hpp" +#include "Parser.hpp" +#include "PerFrameEqn.hpp" +#include "PerPixelEqn.hpp" +#include +#include "ParamUtils.hpp" + +#include "wipemalloc.h" +#include +#include +#include "BuiltinFuncs.hpp" + +/* Grabs the next token from the file. The second argument points + to the raw string */ + +line_mode_t Parser::line_mode; +CustomWave *Parser::current_wave; +CustomShape *Parser::current_shape; +int Parser::string_line_buffer_index; +char Parser::string_line_buffer[STRING_LINE_SIZE]; +unsigned int Parser::line_count; +int Parser::per_frame_eqn_count; +int Parser::per_frame_init_eqn_count; +int Parser::last_custom_wave_id; +int Parser::last_custom_shape_id; +char Parser::last_eqn_type[MAX_TOKEN_SIZE]; +int Parser::last_token_size; + +std::string Parser::lastLinePrefix(""); + +#define white_space(c) ((c) == ' ' || (c) == '\t') +#define valid_digit(c) ((c) >= '0' && (c) <= '9') +#define end_char(c) ((c) == '\0' || (c) == '\r') +#define math_char(c) ((c) == '+' || (c) == '-'|| (c) == '.' || (c) == 'e'|| (c) == 'E' ) + +double fastatof (const char *p, bool &b_validformat) +{ + //check if it is a valid float format (only basic checking with no sequence ) + const char *p1=p; + while (!end_char(*p1) && ((math_char(*p1) || valid_digit(*p1)))) + p1 += 1; + if (!end_char(*p1) || p1 == p) + { + b_validformat = false; + return 0; + } + b_validformat = true; + + int frac = 0; + double sign, value, scale; + + // Skip leading white space, if any. + while (white_space(*p) ) { + p += 1; + } + + // Get sign, if any. + sign = 1.0; + if (*p == '-') { + sign = -1.0; + p += 1; + } else if (*p == '+') { + p += 1; + } + + // Get digits before decimal point or exponent, if any. + value = 0.0; + while (valid_digit(*p)) { + value = value * 10.0 + (*p - '0'); + p += 1; + } + + // Get digits after decimal point, if any. + if (*p == '.') { + double pow10 = 10.0; + p += 1; + while (valid_digit(*p)) { + value += (*p - '0') / pow10; + pow10 *= 10.0; + p += 1; + } + } + + // Handle exponent, if any. + scale = 1.0; + if ((*p == 'e') || (*p == 'E')) { + unsigned int expon; + p += 1; + + // Get sign of exponent, if any. + frac = 0; + if (*p == '-') { + frac = 1; + p += 1; + } else if (*p == '+') { + p += 1; + } + + // Get digits of exponent, if any. + expon = 0; + while (valid_digit(*p)) { + expon = expon * 10 + (*p - '0'); + p += 1; + } + if (expon > 308) expon = 308; + + // Calculate scaling factor. + while (expon >= 50) { scale *= 1E50; expon -= 50; } + while (expon >= 8) { scale *= 1E8; expon -= 8; } + while (expon > 0) { scale *= 10.0; expon -= 1; } + } + + // Return signed and scaled floating point result. + return sign * (frac ? (value / scale) : (value * scale)); +} + +bool Parser::tokenWrapAroundEnabled(false); + +token_type Parser::parseToken(std::istream & fs, char * string) +{ + + char c; + int i; + + if (string != NULL) + memset(string, 0, MAX_TOKEN_SIZE); + + + /* Loop until a delimiter is found, or the maximum string size is found */ + for (i = 0; i < MAX_TOKEN_SIZE;i++) + { + //c = fgetc(fs); + if (!fs || fs.eof()) + c = EOF; + else + c = fs.get(); + + last_token_size++; + /* If the string line buffer is full, quit */ + if (string_line_buffer_index == (STRING_LINE_SIZE - 1)) + return tStringBufferFilled; + + /* Otherwise add this character to the string line buffer */ + string_line_buffer[string_line_buffer_index++] = tolower(c); + /* Now interpret the character */ + switch (c) + { + case '+': + return tPlus; + case '-': + return tMinus; + case '%': + return tMod; + case '/': + + /* check for line comment here */ + if (!fs || fs.eof()) + c = EOF; + else + c = fs.get(); + if (c == '/') + { + while (true) + { + if (!fs || fs.eof()) + c = EOF; + else + c = fs.get(); + if (c == EOF) + { + line_mode = UNSET_LINE_MODE; + return tEOF; + } + if (c == '\n') + { + line_mode = UNSET_LINE_MODE; + return tEOL; + } + } + + } + + /* Otherwise, just a regular division operator */ + fs.unget(); + return tDiv; + case '*': + return tMult; + case '|': + return tOr; + case '&': + return tAnd; + case '(': + return tLPr; + case ')': + return tRPr; + case '[': + return tLBr; + case ']': + return tRBr; + case '=': + return tEq; + case '\n': + line_count++; + /// @note important hack implemented here to handle "wrap around tokens" + // In particular: "per_frame_1=x=t+1.\nper_frame_2=37 + 5;" implies + // "per_frame_1=x=t+1.37 + 5;". Thus, we have a global flag to determine + // if "token wrap mode" is enabled. If so, we consider a token *continuing* + // to the next line, but only attaching to the token buffer anything following + // the first equals sign on that line. + // + // We can safely assume the next line must be part of the token if we allow the + // semi colon to be a guaranteed delimiter in the grammar for all equation-based lines. + // This IS NO LONGER assumed here. Instead, we check if the next line prefix + // matches with the previous line prefix. If it passes a simple comparison, we wrap around. + + if (tokenWrapAroundEnabled) + { + std::ostringstream buffer; + + if (PARSE_DEBUG) std::cerr << "token wrap! line " << line_count << std::endl; + while (c != '=') + { + + if (!fs || fs.eof()) + { + line_count = 1; + line_mode = UNSET_LINE_MODE; + if (PARSE_DEBUG) std::cerr << "token wrap: end of file" << std::endl; + return tEOF; + } + + else { + c = fs.get(); + if ( c != '=') + buffer << c; + } + + } + if (PARSE_DEBUG) std::cerr << "parseToken: parsed away equal sign, line prefix is \"" << buffer.str() + << "\"" << std::endl; + --i; + + if (!wrapsToNextLine(buffer.str())) { + tokenWrapAroundEnabled = false; + int buf_size = (int)buffer.str().length(); + // <= to also remove equal sign parsing from stream + for (int k = 0; k <= buf_size; k++) { + if (fs) + fs.unget(); + else + abort(); + } + return tEOL; + } + + + // if (fs && fs.get() == '\n') { + // line_mode = UNSET_LINE_MODE; + // return tEOL; + // } else if (fs) + //fs.unget(); + + break; + } + + + line_mode = UNSET_LINE_MODE; + return tEOL; + case ',': + return tComma; + case ';': + tokenWrapAroundEnabled = false; + if (PARSE_DEBUG) std::cerr << "token wrap around = false (LINE " << line_count << ")" << std::endl; + return tSemiColon; + case ' ': /* space, skip the character */ + i--; + break; + case EOF: + line_count = 1; + line_mode = UNSET_LINE_MODE; + return tEOF; + + case '\r': + i--; + break; + default: + + if (string != NULL) + { + /// @bug remove this nonsense + if (c == '\r') + { + std::cerr << "R" << std::endl; + abort(); + } + if (c == '\b') + { + std::cerr << "B" << std::endl; + abort(); + } + string[i] = tolower(c); + //string[i+1] = 0; + //std::cerr << "string is \n\"" << string << "\"" << std::endl; + } + } + + } + + /* String reached maximum length, return special token error */ + return tStringTooLong; + +} + +/* Parse input in the form of "exp, exp, exp, ...)" + Returns a general expression list */ + +GenExpr **Parser::parse_prefix_args(std::istream & fs, int num_args, Preset * preset) +{ + + int i, j; + GenExpr ** expr_list; /* List of arguments to function */ + GenExpr * gen_expr; + + /* Malloc the expression list */ + expr_list = (GenExpr**)wipemalloc(sizeof(GenExpr*)*num_args); + + /* Malloc failed */ + if (expr_list == NULL) + return NULL; + + + i = 0; + + while (i < num_args) + { + //if (PARSE_DEBUG) printf("parse_prefix_args: parsing argument %d...\n", i+1); + /* Parse the ith expression in the list */ + if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) + { + //if (PARSE_DEBUG) printf("parse_prefix_args: failed to get parameter # %d for function (LINE %d)\n", i+1, line_count); + for (j = 0; j < i; j++) + delete expr_list[j]; + free(expr_list); + expr_list = NULL; + return NULL; + } + /* Assign entry in expression list */ + expr_list[i++] = gen_expr; + } + + //if (PARSE_DEBUG) printf("parse_prefix_args: finished parsing %d arguments (LINE %d)\n", num_args, line_count); + /* Finally, return the resulting expression list */ + return expr_list; +} + +/* Parses a comment at the top of the file. Stops when left bracket is found */ +int Parser::parse_top_comment(std::istream & fs) +{ + + char string[MAX_TOKEN_SIZE]; + token_type token; + + /* Process tokens until left bracket is found */ + while ((token = parseToken(fs, string)) != tLBr) + { + if (token == tEOF) + return PROJECTM_PARSE_ERROR; + } + + /* Done, return success */ + return PROJECTM_SUCCESS; +} + +/* Right Bracket is parsed by this function. + puts a new string into name */ +int Parser::parse_preset_name(std::istream & fs, char * name) +{ + + token_type token; + + if (name == NULL) + return PROJECTM_FAILURE; + + if ((token = parseToken(fs, name)) != tRBr) + return PROJECTM_PARSE_ERROR; + + return PROJECTM_SUCCESS; +} + + +/* Parses per pixel equations */ +int Parser::parse_per_pixel_eqn(std::istream & fs, Preset * preset, char * init_string) +{ + + + char string[MAX_TOKEN_SIZE]; + GenExpr * gen_expr; + + + if (init_string != 0) + { + strncpy(string, init_string, strlen(init_string)); + } + else + { + + if (parseToken(fs, string) != tEq) + { /* parse per pixel operator name */ + return PROJECTM_PARSE_ERROR; + } + } + + /* Parse right side of equation as an expression */ + if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) + { + return PROJECTM_PARSE_ERROR; + } + + /* Add the per pixel equation */ + if (preset->add_per_pixel_eqn(string, gen_expr) < 0) + { + if (PARSE_DEBUG) + { + + } + delete gen_expr; + return PROJECTM_PARSE_ERROR; + } + + return PROJECTM_SUCCESS; +} + +/* Parses an equation line, this function is way too big, should add some helper functions */ +int Parser::parse_line(std::istream & fs, Preset * preset) +{ + + char eqn_string[MAX_TOKEN_SIZE]; + token_type token; + InitCond * init_cond; + PerFrameEqn * per_frame_eqn; + + /* Clear the string line buffer */ + memset(string_line_buffer, 0, STRING_LINE_SIZE); + string_line_buffer_index = 0; + + tokenWrapAroundEnabled = false; + + token = parseToken( fs, eqn_string ); + switch (token ) + { + + /* Invalid Cases */ + case tRBr: + case tLPr: + case tRPr: + case tComma: + case tLBr: + case tPlus: + case tMinus: + case tMod: + case tMult: + case tOr: + case tAnd: + case tDiv: + + if (PARSE_DEBUG) std::cerr << "parse_line: invalid token found at start of line (LINE " + << line_count << ")" << std::endl; + + /* Invalid token found, return a parse error */ + return PROJECTM_PARSE_ERROR; + + + case tEOL: /* Empty line */ + line_mode = UNSET_LINE_MODE; + return PROJECTM_SUCCESS; + + case tEOF: /* End of File */ + line_mode = UNSET_LINE_MODE; + line_count = 1; + tokenWrapAroundEnabled = false; + return EOF; + + case tSemiColon: /* Indicates end of expression */ + tokenWrapAroundEnabled = false; + return PROJECTM_SUCCESS; + + /* Valid Case, either an initial condition or equation should follow */ + case tEq: + lastLinePrefix = std::string(eqn_string); + if (PARSE_DEBUG) std::cout << "last line prefix = \"" << eqn_string << "\"" << std::endl; + // std::cerr << "parse_line: tEQ case, fs.peek()=\'" << fs.peek() << "\'" << std::endl; + if (!fs) + return PROJECTM_PARSE_ERROR; + +// char z = fs.get(); + char tmpChar; + if ((tmpChar = fs.get()) == '\n') { + tokenWrapAroundEnabled = false; + return PROJECTM_PARSE_ERROR; + } else if (tmpChar == '\r') { + tokenWrapAroundEnabled = false; + return PROJECTM_PARSE_ERROR; + } else + fs.unget(); + + // if (z == 2) +// ; + // return PROJECTM_PARSE_ERROR; + //else + // fs.unget(); + + + /* CASE: PER FRAME INIT EQUATION */ + if (!strncmp(eqn_string, PER_FRAME_INIT_STRING, PER_FRAME_INIT_STRING_LENGTH)) + { + tokenWrapAroundEnabled = true; + //if (PARSE_DEBUG) printf("parse_line: per frame init equation found...(LINE %d)\n", line_count); + + /* Parse the per frame equation */ + if ((init_cond = parse_per_frame_init_eqn(fs, preset, NULL)) == NULL) + { + //if (PARSE_DEBUG) printf("parse_line: per frame init equation parsing failed (LINE %d)\n", line_count); + tokenWrapAroundEnabled = false; + return PROJECTM_PARSE_ERROR; + } + + /* Insert the equation in the per frame equation tree */ + preset->per_frame_init_eqn_tree.insert(std::make_pair(init_cond->param->name, init_cond)); + + line_mode = PER_FRAME_INIT_LINE_MODE; + return PROJECTM_SUCCESS; + } + + /* Per frame equation case */ + if (!strncmp(eqn_string, PER_FRAME_STRING, PER_FRAME_STRING_LENGTH)) + { + tokenWrapAroundEnabled = true; + /* Sometimes per frame equations are implicitly defined without the + per_frame_ prefix. This informs the parser that one could follow */ + line_mode = PER_FRAME_LINE_MODE; + + //if (PARSE_DEBUG) printf("parse_line: per frame equation found...(LINE %d)\n", line_count); + + /* Parse the per frame equation */ + if ((per_frame_eqn = parse_per_frame_eqn(fs, ++per_frame_eqn_count, preset)) == NULL) + { + if (PARSE_DEBUG) printf("parse_line: per frame equation parsing failed (LINE %d)\n", line_count); + tokenWrapAroundEnabled = false; + return PROJECTM_PARSE_ERROR; + } + + /* Insert the equation in the per frame equation tree */ + preset->per_frame_eqn_tree.push_back(per_frame_eqn); + + return PROJECTM_SUCCESS; + + } + + /* Wavecode initial condition case */ + if (!strncmp(eqn_string, WAVECODE_STRING, WAVECODE_STRING_LENGTH)) + { + + line_mode = CUSTOM_WAVE_WAVECODE_LINE_MODE; + + return parse_wavecode(eqn_string, fs, preset); + } + + /* Custom Wave Prefix */ + if ((!strncmp(eqn_string, WAVE_STRING, WAVE_STRING_LENGTH)) && + ((eqn_string[5] >= 48) && (eqn_string[5] <= 57))) + { + tokenWrapAroundEnabled = true; + // if (PARSE_DEBUG) printf("parse_line wave prefix found: \"%s\"\n", eqn_string); + + return parse_wave(eqn_string, fs, preset); + + } + + + /* Shapecode initial condition case */ + if (!strncmp(eqn_string, SHAPECODE_STRING, SHAPECODE_STRING_LENGTH)) + { + + line_mode = CUSTOM_SHAPE_SHAPECODE_LINE_MODE; + + if (PARSE_DEBUG) printf("parse_line: shapecode prefix found: \"%s\"\n", eqn_string); + + return parse_shapecode(eqn_string, fs, preset); + } + + /* Custom Shape Prefix */ + if ((!strncmp(eqn_string, SHAPE_STRING, SHAPE_STRING_LENGTH)) && + ((eqn_string[6] >= 48) && (eqn_string[6] <= 57))) + { + tokenWrapAroundEnabled = true; + if (PARSE_DEBUG) printf("parse_line shape prefix found: \"%s\"\n", eqn_string); + return parse_shape(eqn_string, fs, preset); + + } + + /* Per pixel equation case */ + if (!strncmp(eqn_string, PER_PIXEL_STRING, PER_PIXEL_STRING_LENGTH)) + { + tokenWrapAroundEnabled = true; + + line_mode = PER_PIXEL_LINE_MODE; + + if (parse_per_pixel_eqn(fs, preset, 0) < 0) + { + tokenWrapAroundEnabled = false; + return PROJECTM_PARSE_ERROR; + } + + + if (PARSE_DEBUG) printf("parse_line: finished parsing per pixel equation (LINE %d)\n", line_count); + return PROJECTM_SUCCESS; + } + + /* Sometimes equations are written implicitly in milkdrop files, in the form + + per_frame_1 = p1 = eqn1; p2 = eqn2; p3 = eqn3;..; + + which is analagous to: + + per_frame_1 = p1 = eqn1; per_frame_2 = p2 = eqn2; per_frame_3 = p3 = eqn3; ...; + + The following line mode hack allows such implicit declaration of the + prefix that specifies the equation type. An alternative method + may be to associate each equation line as list of equations separated + by semicolons (and a new line ends the list). Instead, however, a global + variable called "line_mode" specifies the last type of equation found, + and bases any implicitly typed input on this fact + + Note added by Carmelo Piccione (carmelo.piccione@gmail.com) 10/19/03 + */ + + /* Per frame line mode previously, try to parse the equation implicitly */ + if (line_mode == PER_FRAME_LINE_MODE) + { + tokenWrapAroundEnabled = true; + if ((per_frame_eqn = parse_implicit_per_frame_eqn(fs, eqn_string, ++per_frame_eqn_count, preset)) == NULL) + { + tokenWrapAroundEnabled = false; + return PROJECTM_PARSE_ERROR; + } + + /* Insert the equation in the per frame equation tree */ + preset->per_frame_eqn_tree.push_back(per_frame_eqn); + + + return PROJECTM_SUCCESS; + + } + else if (line_mode == PER_FRAME_INIT_LINE_MODE) + { + tokenWrapAroundEnabled = true; + if (PARSE_DEBUG) printf("parse_line: parsing implicit per frame init eqn)\n"); + if ((init_cond = parse_per_frame_init_eqn(fs, preset, NULL)) == NULL) + { + tokenWrapAroundEnabled = false; + return PROJECTM_PARSE_ERROR; + } + + ++per_frame_init_eqn_count; + + /* Insert the equation in the per frame equation tree */ + preset->per_frame_init_eqn_tree.insert(std::make_pair(init_cond->param->name, init_cond)); + + return PROJECTM_SUCCESS; + } + else if (line_mode == PER_PIXEL_LINE_MODE) + { + tokenWrapAroundEnabled = true; + if (PARSE_DEBUG) printf("parse_line: implicit per pixel eqn (LINE %d)\n", line_count); + return parse_per_pixel_eqn(fs, preset, eqn_string); + + + } + else if (line_mode == CUSTOM_WAVE_PER_POINT_LINE_MODE) + { + tokenWrapAroundEnabled = true; + if (PARSE_DEBUG) printf("parse_line: implicit cwave ppoint eqn found (LINE %d)\n", line_count); + //int len = strlen(eqn_string); + + if (parse_wave_helper(fs, preset, last_custom_wave_id, last_eqn_type, eqn_string) < 0) + { + if (PARSE_DEBUG) printf("parse_line: failed to parse an implicit custom wave per point eqn\n"); + return PROJECTM_FAILURE; + } + return PROJECTM_SUCCESS; + } + else if (line_mode == CUSTOM_WAVE_PER_FRAME_LINE_MODE) + { + tokenWrapAroundEnabled = true; + //Added by PJS. I hope I did it right + CustomWave * custom_wave; + + /* Retrieve custom shape associated with this id */ + if ((custom_wave = Preset::find_custom_object(last_custom_wave_id, preset->customWaves)) == NULL) + return PROJECTM_FAILURE; + return parse_wave_per_frame_eqn(fs, custom_wave, preset); + + } + else if (line_mode == CUSTOM_WAVE_WAVECODE_LINE_MODE) + { + if (PARSE_DEBUG) printf("unsupported line mode: CUSTOM_WAVE_WAVECODE_LINE_MODE\n"); + return PROJECTM_FAILURE; + } + else if (line_mode == CUSTOM_SHAPE_SHAPECODE_LINE_MODE) + { + if (PARSE_DEBUG) printf("unsupported line mode: CUSTOM_SHAPE_SHAPECODE_LINE_MODE\n"); + return PROJECTM_FAILURE; + } + else if (line_mode == CUSTOM_SHAPE_PER_FRAME_LINE_MODE) + { + tokenWrapAroundEnabled = true; + + CustomShape * custom_shape; + + /* Retrieve custom shape associated with this id */ + if ((custom_shape = Preset::find_custom_object(last_custom_shape_id, preset->customShapes)) == NULL) + return PROJECTM_FAILURE; + + return parse_shape_per_frame_eqn(fs, custom_shape, preset); + + } + else if (line_mode == CUSTOM_SHAPE_PER_FRAME_INIT_LINE_MODE) + { + tokenWrapAroundEnabled = true; + CustomShape * custom_shape; + + /* Retrieve custom shape associated with this id */ + if ((custom_shape = preset->find_custom_object(last_custom_shape_id, preset->customShapes)) == NULL) + return PROJECTM_FAILURE; + + return parse_shape_per_frame_init_eqn(fs, custom_shape, preset); + + } + + if (PARSE_DEBUG) printf("parse_line: found initial condition: name = \"%s\" (LINE %d)\n", eqn_string, line_count); + /* Evaluate the initial condition */ + if ((init_cond = parse_init_cond(fs, eqn_string, preset)) == NULL) + { + if (PARSE_DEBUG) printf("parse_line: failed to parse initial condition (LINE %d)\n", line_count); + return PROJECTM_PARSE_ERROR; + } + + /* Add equation to initial condition tree */ + preset->init_cond_tree.insert(std::make_pair(init_cond->param->name, init_cond)); + + /* Finished with initial condition line */ + // if (PARSE_DEBUG) printf("parse_line: initial condition parsed successfully\n"); + + return PROJECTM_SUCCESS; + + /* END INITIAL CONDITIONING PARSING */ + + default: /* an uncaught type or an error has occurred */ + if (PARSE_DEBUG) printf("parse_line: uncaught case, token val = %d\n", token); + return PROJECTM_PARSE_ERROR; + } + + /* Because of the default in the case statement, + control flow should never actually reach here */ + return PROJECTM_PARSE_ERROR; +} + + + +/* Parses a general expression, this function is the meat of the parser */ +GenExpr * Parser::parse_gen_expr ( std::istream & fs, TreeExpr * tree_expr, Preset * preset) +{ + + int i; + char string[MAX_TOKEN_SIZE]; + token_type token; + GenExpr * gen_expr; + float val; + Param * param = NULL; + Func * func; + GenExpr ** expr_list; + + switch (token = parseToken(fs,string)) + { + /* Left Parentice Case */ + case tLPr: + //std::cerr << "token before tLPr:" << string << std::endl; + /* CASE 1 (Left Parentice): See if the previous string before this parentice is a function name */ + if ((func = BuiltinFuncs::find_func(string)) != NULL) + { + if (PARSE_DEBUG) + { + std::cerr << "parse_gen_expr: found prefix function (name = \"" + << func->getName() << "\") (LINE " << line_count << ")" << std::endl; + } + + /* Parse the functions arguments */ + if ((expr_list = parse_prefix_args(fs, func->getNumArgs(), preset)) == NULL) + { + if (PARSE_DEBUG) + { + std::cerr << "parse_prefix_args: failed to generate an expresion list! (LINE " + << line_count << ")" << std::endl; + } + if ( tree_expr != NULL ) + { + delete tree_expr; + } + return NULL; + } + + /* Convert function to expression */ + if ((gen_expr = GenExpr::prefun_to_expr((float (*)(void *))func->func_ptr, expr_list, func->getNumArgs())) == NULL) + { + if (PARSE_DEBUG) printf("parse_prefix_args: failed to convert prefix function to general expression (LINE %d) \n", + line_count); + if (tree_expr) + delete tree_expr; + for (i = 0; i < func->getNumArgs();i++) + delete expr_list[i]; + free(expr_list); + expr_list = NULL; + return NULL; + } + + token = parseToken(fs, string); + + if (*string != 0) + { + if (PARSE_DEBUG) printf("parse_prefix_args: empty string expected, but not found...(LINE %d)\n", line_count); + /* continue anyway for now, could be implicit multiplication */ + } + + return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); + } + + + /* Case 2: (Left Parentice), a string coupled with a left parentice. Either an error or implicit + multiplication operator. For now treat it as an error */ + if (*string != 0) + { + std::cerr << "token prefix is " << *string << std::endl; + if (PARSE_DEBUG) printf("parse_gen_expr: implicit multiplication case unimplemented!\n"); + if (tree_expr) + delete tree_expr; + return NULL; + } + + /* CASE 3 (Left Parentice): the following is enclosed parentices to change order + of operations. So we create a new expression tree */ + + if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) + { + if (PARSE_DEBUG) printf("parse_gen_expr: found left parentice, but failed to create new expression tree \n"); + if (tree_expr) + delete tree_expr; + return NULL; + } + + if (PARSE_DEBUG) printf("parse_gen_expr: finished enclosed expression tree...\n"); + token = parseToken(fs, string); + return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); + + /* Plus is a prefix operator check */ + case tPlus: + if (*string == 0) + { + + if (PARSE_DEBUG) printf("parse_gen_expr: plus used as prefix (LINE %d)\n", line_count); + + /* Treat prefix plus as implict 0 preceding operator */ + gen_expr = GenExpr::const_to_expr(0); + + return parse_infix_op(fs, tPositive, insert_gen_expr(gen_expr, &tree_expr), preset); + } + + /* Minus is a prefix operator check */ + case tMinus: + if (*string == 0) + { + + /* Use the negative infix operator, but first add an implicit zero to the operator tree */ + gen_expr = GenExpr::const_to_expr(0); + //return parse_gen_expr(fs, insert_gen_expr(gen_expr, &tree_expr), preset); + return parse_infix_op(fs, tNegative, insert_gen_expr(gen_expr, &tree_expr), preset); + } + + /* All the following cases are strings followed by an infix operator or terminal */ + case tRPr: + case tEOL: + case tEOF: + case tSemiColon: + case tComma: + + /* CASE 1 (terminal): string is empty, but not null. Not sure if this will actually happen + any more. */ + if (*string == 0) + { + if (PARSE_DEBUG) printf("parse_gen_expr: empty string coupled with terminal (LINE %d) \n", line_count); + return parse_infix_op(fs, token, tree_expr, preset); + + } + + default: + + /* CASE 0: Empty string, parse error */ + if (*string == 0) + { + if (tree_expr) + delete tree_expr; + return NULL; + } + + /* CASE 1: Check if string is a just a floating point number */ + if (string_to_float(string, &val) != PROJECTM_PARSE_ERROR) + { + if ((gen_expr = GenExpr::const_to_expr(val)) == NULL) + { + if (tree_expr) + delete tree_expr; + return NULL; + } + + /* Parse the rest of the line */ + return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); + + } + + + /* CASE 4: custom shape variable */ + if (current_shape != NULL) + { + if ((param = ParamUtils::find(std::string(string), ¤t_shape->param_tree)) == NULL) + { + if ((param = preset->builtinParams.find_builtin_param(std::string(string))) == NULL) + if ((param = ParamUtils::find(std::string(string), ¤t_shape->param_tree)) == NULL) + { + if (tree_expr) + delete tree_expr; + return NULL; + } + } + + if (PARSE_DEBUG) + { + std::cerr << "parse_gen_expr: custom shape parameter (name = " + << param->name << ")" << std::endl; + } + + + /* Convert parameter to an expression */ + if ((gen_expr = GenExpr::param_to_expr(param)) == NULL) + { + delete tree_expr; + return NULL; + } + + //if (PARSE_DEBUG) printf("converted to expression (LINE %d)\n", line_count); + + /* Parse the rest of the line */ + return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); + } + + /* CASE 5: custom wave variable */ + if (current_wave != NULL) + { + if ((param = ParamUtils::find(std::string(string), ¤t_wave->param_tree)) == NULL) + { + if ((param = preset->builtinParams.find_builtin_param(std::string(string))) == NULL) + if ((param = ParamUtils::find(std::string(string), ¤t_wave->param_tree)) == NULL) + { + if (tree_expr) + delete tree_expr; + return NULL; + } + } + assert(param); + + if (PARSE_DEBUG) + { + std::cerr << "parse_gen_expr: custom wave parameter (name = " << param->name << ")" << std::endl; + + } + + /* Convert parameter to an expression */ + if ((gen_expr = GenExpr::param_to_expr(param)) == NULL) + { + delete tree_expr; + return NULL; + } + + //if (PARSE_DEBUG) printf("converted to expression (LINE %d)\n", line_count); + + /* Parse the rest of the line */ + return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); + + } + + /* CASE 6: regular parameter. Will be created if necessary and the string has no invalid characters */ + if ((param = ParamUtils::find(string, &preset->builtinParams, &preset->user_param_tree)) != NULL) + { + + if (PARSE_DEBUG) + { + std::cerr << "parse_gen_expr: parameter (name = \"" << param->name << "\")..." << std::endl; + } + + /* Convert parameter to an expression */ + if ((gen_expr = GenExpr::param_to_expr(param)) == NULL) + { + delete tree_expr; + return NULL; + } + + //if (PARSE_DEBUG) printf("converted to expression (LINE %d)\n", line_count); + + /* Parse the rest of the line */ + return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); + + } + + /* CASE 7: Bad string, give up */ + if (PARSE_DEBUG) + { + printf( "parse_gen_expr: syntax error [string = \"%s\"] (LINE %d)\n", string, line_count); + + } + if (tree_expr) + delete tree_expr; + return NULL; + } +} + + + +/* Inserts expressions into tree according to operator precedence. + If root is null, a new tree is created, with infix_op as only element */ + +TreeExpr * Parser::insert_infix_op(InfixOp * infix_op, TreeExpr **root) +{ + + TreeExpr * new_root; + + /* Sanity check */ + if (infix_op == NULL) + return NULL; + + /* The root is null, so make this operator + the new root */ + + if (*root == NULL) + { + new_root = new TreeExpr(infix_op, NULL, NULL, NULL); + *root = new_root; + return new_root; + } + + /* The root node is not an infix function, + so we make this infix operator the new root */ + + if ((*root)->infix_op == NULL) + { + new_root = new TreeExpr(infix_op, NULL, *root, NULL); + (*root) = new_root; + return new_root; + } + + /* The root is an infix function. If the precedence + of the item to be inserted is greater than the root's + precedence, then make gen_expr the root */ + + if (infix_op->precedence > (*root)->infix_op->precedence) + { + new_root = new TreeExpr(infix_op, NULL, *root, NULL); + (*root) = new_root; + return new_root; + } + + /* If control flow reaches here, use a recursive helper + with the knowledge that the root is higher precedence + than the item to be inserted */ + + insert_infix_rec(infix_op, *root); + return *root; + +} + + +TreeExpr * Parser::insert_gen_expr(GenExpr * gen_expr, TreeExpr ** root) +{ + + TreeExpr * new_root; + + /* If someone foolishly passes a null + pointer to insert, return the original tree */ + + if (gen_expr == NULL) + { + return *root; + } + + /* If the root is null, generate a new expression tree, + using the passed expression as the root element */ + + if (*root == NULL) + { + new_root = new TreeExpr(NULL, gen_expr, NULL, NULL); + *root = new_root; + return new_root; + } + + + /* Otherwise. the new element definitely will not replace the current root. + Use a recursive helper function to do insertion */ + + insert_gen_rec(gen_expr, *root); + return *root; +} + +/* A recursive helper function to insert general expression elements into the operator tree */ +int Parser::insert_gen_rec(GenExpr * gen_expr, TreeExpr * root) +{ + + /* Trivial Case: root is null */ + + if (root == NULL) + { + //if (PARSE_DEBUG) printf("insert_gen_rec: root is null, returning failure\n"); + return PROJECTM_FAILURE; + } + + + /* The current node's left pointer is null, and this + current node is an infix operator, so insert the + general expression at the left pointer */ + + if ((root->left == NULL) && (root->infix_op != NULL)) + { + root->left = new TreeExpr(NULL, gen_expr, NULL, NULL); + return PROJECTM_SUCCESS; + } + + /* The current node's right pointer is null, and this + current node is an infix operator, so insert the + general expression at the right pointer */ + + if ((root->right == NULL) && (root->infix_op != NULL)) + { + root->right = new TreeExpr(NULL, gen_expr, NULL, NULL); + return PROJECTM_SUCCESS; + } + + /* Otherwise recurse down to the left. If + this succeeds then return. If it fails, try + recursing down to the right */ + + if (insert_gen_rec(gen_expr, root->left) == PROJECTM_FAILURE) + return insert_gen_rec(gen_expr, root->right); + + /* Impossible for control flow to reach here, but in + the world of C programming, who knows... */ + if (PARSE_DEBUG) printf("insert_gen_rec: should never reach here!\n"); + return PROJECTM_FAILURE; +} + + +/* A recursive helper function to insert infix arguments by operator precedence */ +int Parser::insert_infix_rec(InfixOp * infix_op, TreeExpr * root) +{ + + /* Shouldn't happen, implies a parse error */ + + if (root == NULL) + return PROJECTM_FAILURE; + + /* Also shouldn't happen, also implies a (different) parse error */ + + if (root->infix_op == NULL) + return PROJECTM_FAILURE; + + /* Left tree is empty, attach this operator to it. + I don't think this will ever happen */ + if (root->left == NULL) + { + root->left = new TreeExpr(infix_op, NULL, root->left, NULL); + return PROJECTM_SUCCESS; + } + + /* Right tree is empty, attach this operator to it */ + if (root->right == NULL) + { + root->right = new TreeExpr(infix_op, NULL, root->right, NULL); + return PROJECTM_SUCCESS; + } + + /* The left element can now be ignored, since there is no way for this + operator to use those expressions */ + + /* If the right element is not an infix operator, + then insert the expression here, attaching the old right branch + to the left of the new expression */ + + if (root->right->infix_op == NULL) + { + root->right = new TreeExpr(infix_op, NULL, root->right, NULL); + return PROJECTM_SUCCESS; + } + + /* Traverse deeper if the inserting operator precedence is less than the + the root's right operator precedence */ + if (infix_op->precedence < root->right->infix_op->precedence) + return insert_infix_rec(infix_op, root->right); + + /* Otherwise, insert the operator here */ + + root->right = new TreeExpr(infix_op, NULL, root->right, NULL); + return PROJECTM_SUCCESS; + +} + +/* Parses an infix operator */ +GenExpr * Parser::parse_infix_op(std::istream & fs, token_type token, TreeExpr * tree_expr, Preset * preset) +{ + + GenExpr * gen_expr; + + switch (token) + { + /* All the infix operators */ + case tPlus: + if (PARSE_DEBUG) printf("parse_infix_op: found addition operator (LINE %d)\n", line_count); + if (PARSE_DEBUG) std::cerr << "WRAP AROUND IS " << tokenWrapAroundEnabled << std::endl; + + return parse_gen_expr(fs, insert_infix_op(Eval::infix_add, &tree_expr), preset); + case tMinus: + if (PARSE_DEBUG) printf("parse_infix_op: found subtraction operator (LINE %d)\n", line_count); + return parse_gen_expr(fs, insert_infix_op(Eval::infix_minus, &tree_expr), preset); + case tMult: + if (PARSE_DEBUG) printf("parse_infix_op: found multiplication operator (LINE %d)\n", line_count); + return parse_gen_expr(fs, insert_infix_op(Eval::infix_mult, &tree_expr), preset); + case tDiv: + if (PARSE_DEBUG) printf("parse_infix_op: found division operator (LINE %d)\n", line_count); + return parse_gen_expr(fs, insert_infix_op(Eval::infix_div, &tree_expr), preset); + case tMod: + if (PARSE_DEBUG) printf("parse_infix_op: found modulo operator (LINE %d)\n", line_count); + return parse_gen_expr(fs, insert_infix_op(Eval::infix_mod, &tree_expr), preset); + case tOr: + if (PARSE_DEBUG) printf("parse_infix_op: found bitwise or operator (LINE %d)\n", line_count); + return parse_gen_expr(fs, insert_infix_op(Eval::infix_or, &tree_expr), preset); + case tAnd: + if (PARSE_DEBUG) printf("parse_infix_op: found bitwise and operator (LINE %d)\n", line_count); + return parse_gen_expr(fs, insert_infix_op(Eval::infix_and, &tree_expr), preset); + case tPositive: + if (PARSE_DEBUG) printf("parse_infix_op: found positive operator (LINE %d)\n", line_count); + return parse_gen_expr(fs, insert_infix_op(Eval::infix_positive, &tree_expr), preset); + case tNegative: + if (PARSE_DEBUG) printf("parse_infix_op: found negative operator (LINE %d)\n", line_count); + return parse_gen_expr(fs, insert_infix_op(Eval::infix_negative, &tree_expr), preset); + + case tEOL: + case tEOF: + case tSemiColon: + case tRPr: + case tComma: + if (PARSE_DEBUG) printf("parse_infix_op: terminal found (LINE %d)\n", line_count); + gen_expr = new GenExpr(TREE_T, (void*)tree_expr); + assert(gen_expr); + return gen_expr; + default: + if (PARSE_DEBUG) printf("parse_infix_op: operator or terminal expected, but not found (LINE %d)\n", line_count); + delete tree_expr; + return NULL; + } + + /* Will never happen */ + return NULL; + +} + +/* Parses an integer, checks for +/- prefix */ +int Parser::parse_int(std::istream & fs, int * int_ptr) +{ + + char string[MAX_TOKEN_SIZE]; + token_type token; + int sign; + char * end_ptr = (char*)" "; + + token = parseToken(fs, string); + + + switch (token) + { + case tMinus: + sign = -1; + token = parseToken(fs, string); + break; + case tPlus: + sign = 1; + token = parseToken(fs, string); + break; + default: + sign = 1; + break; + } + + + if (string[0] == 0) + return PROJECTM_PARSE_ERROR; + + /* Convert the string to an integer. *end_ptr + should end up pointing to null terminator of 'string' + if the conversion was successful. */ + // printf("STRING: \"%s\"\n", string); + + (*int_ptr) = sign*strtol(string, &end_ptr, 10); + + /* If end pointer is a return character or null terminator, all is well */ + if ((*end_ptr == '\r') || (*end_ptr == '\0')) + return PROJECTM_SUCCESS; + + return PROJECTM_PARSE_ERROR; + +} +/* Parses a floating point number */ +int Parser::string_to_float(char * string, float * float_ptr) +{ + bool conv_success; + + if (*string == 0) + return PROJECTM_PARSE_ERROR; + + (*float_ptr) = fastatof(string, conv_success); + + if (conv_success) + return PROJECTM_SUCCESS; + else + return PROJECTM_PARSE_ERROR; +} + +/* Parses a floating point number */ +int Parser::parse_float(std::istream & fs, float * float_ptr) +{ + + char string[MAX_TOKEN_SIZE]; + bool conv_success; + token_type token; + int sign; + + token = parseToken(fs, string); + + switch (token) + { + case tMinus: + sign = -1; + token = parseToken(fs, string); + break; + case tPlus: + sign = 1; + token = parseToken(fs, string); + break; + default: + sign = 1; + } + + if (string[0] == 0) + return PROJECTM_PARSE_ERROR; + + (*float_ptr) = sign*fastatof(string, conv_success); + + if (conv_success) + return PROJECTM_SUCCESS; + else + return PROJECTM_PARSE_ERROR; +} + +/* Parses a per frame equation. That is, interprets a stream of data as a per frame equation */ +PerFrameEqn * Parser::parse_per_frame_eqn(std::istream & fs, int index, Preset * preset) +{ + + char string[MAX_TOKEN_SIZE]; + Param * param; + PerFrameEqn * per_frame_eqn; + GenExpr * gen_expr; + + + if (parseToken(fs, string) != tEq) + { + if (PARSE_DEBUG) printf("parse_per_frame_eqn: no equal sign after string \"%s\" (LINE %d)\n", string, line_count); + return NULL; + } + + /* Find the parameter associated with the string, create one if necessary */ + if ((param = ParamUtils::find(string, &preset->builtinParams, &preset->user_param_tree)) == NULL) + { + return NULL; + } + if (PARSE_DEBUG) std::cerr << "parse_per_frame_eqn: parameter \"" << param->name << "\" retrieved (LINE" << line_count << ")" << std::endl; + /* Make sure parameter is writable */ + if (param->flags & P_FLAG_READONLY) + { + if (PARSE_DEBUG) std::cerr << "parse_per_frame_eqn: parameter \"" << param->name << "\" %s is marked as read only (LINE " << line_count << ")" << std::endl; + return NULL; + } + + /* Parse right side of equation as an expression */ + if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) + { + if (PARSE_DEBUG) printf("parse_per_frame_eqn: equation evaluated to null (LINE %d)\n", line_count); + return NULL; + } + + if (PARSE_DEBUG) printf("parse_per_frame_eqn: finished per frame equation evaluation (LINE %d)\n", line_count); + + /* Create a new per frame equation */ + if ((per_frame_eqn = new PerFrameEqn(index, param, gen_expr)) == NULL) + { + if (PARSE_DEBUG) printf("parse_per_frame_eqn: failed to create a new per frame eqn, out of memory?\n"); + delete gen_expr; + return NULL; + } + + if (PARSE_DEBUG) printf("parse_per_frame_eqn: per_frame eqn parsed succesfully\n"); + + return per_frame_eqn; +} + +/* Parses an 'implicit' per frame equation. That is, interprets a stream of data as a per frame equation without a prefix */ +PerFrameEqn * Parser::parse_implicit_per_frame_eqn(std::istream & fs, char * param_string, int index, Preset * preset) +{ + + Param * param; + PerFrameEqn * per_frame_eqn; + GenExpr * gen_expr; + + if (param_string == NULL) + return NULL; + if (preset == NULL) + return NULL; + + //rintf("param string: %s\n", param_string); + /* Find the parameter associated with the string, create one if necessary */ + if ((param = ParamUtils::find(param_string, &preset->builtinParams, &preset->user_param_tree)) == NULL) + { + return NULL; + } + + //printf("parse_implicit_per_frame_eqn: param is %s\n", param->name); + + /* Make sure parameter is writable */ + if (param->flags & P_FLAG_READONLY) + { + if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: parameter %s is marked as read only (LINE %d)\n", param->name.c_str(), line_count); + return NULL; + } + + /* Parse right side of equation as an expression */ + if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) + { + if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: equation evaluated to null (LINE %d)\n", line_count); + return NULL; + } + + if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: finished per frame equation evaluation (LINE %d)\n", line_count); + + /* Create a new per frame equation */ + if ((per_frame_eqn = new PerFrameEqn(index, param, gen_expr)) == NULL) + { + if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: failed to create a new per frame eqn, out of memory?\n"); + delete gen_expr; + return NULL; + } + + if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: per_frame eqn parsed succesfully\n"); + + return per_frame_eqn; +} + +/* Parses an initial condition */ +InitCond * Parser::parse_init_cond(std::istream & fs, char * name, Preset * preset) +{ + + Param * param; + CValue init_val; + InitCond * init_cond; + + if (name == NULL) + return NULL; + if (preset == NULL) + return NULL; + + /* Search for the paramater in the database, creating it if necessary */ + if ((param = ParamUtils::find(name, &preset->builtinParams, &preset->user_param_tree)) == NULL) + { + return NULL; + } + + if (PARSE_DEBUG) printf("parse_init_cond: parameter = \"%s\" (LINE %d)\n", param->name.c_str(), line_count); + + if (param->flags & P_FLAG_READONLY) + { + if (PARSE_DEBUG) printf("parse_init_cond: builtin parameter \"%s\" marked as read only!\n", param->name.c_str()); + return NULL; + } + + /* At this point, a parameter has been created or was found + in the database. */ + + if (PARSE_DEBUG) printf("parse_init_cond: parsing initial condition value... (LINE %d)\n", line_count); + + /* integer value (boolean is an integer in C) */ + if ( (param->type == P_TYPE_BOOL)) + { + int bool_test; + if ((parse_int(fs, &bool_test)) == PROJECTM_PARSE_ERROR) + { + if (PARSE_DEBUG) printf("parse_init_cond: error parsing integer!\n"); + return NULL; + } + init_val.bool_val = bool_test; + } + + else if ((param->type == P_TYPE_INT)) + { + if ((parse_int(fs, (int*)&init_val.int_val)) == PROJECTM_PARSE_ERROR) + { + if (PARSE_DEBUG) printf("parse_init_cond: error parsing integer!\n"); + return NULL; + } + } + + /* float value */ + else if (param->type == P_TYPE_DOUBLE) + { + if ((parse_float(fs, (float*)&init_val.float_val)) == PROJECTM_PARSE_ERROR) + { + if (PARSE_DEBUG) printf("parse_init_cond: error parsing float!\n"); + return NULL; + } + } + + /* Unknown value */ + else + { + if (PARSE_DEBUG) printf("parse_init_cond: unknown parameter type!\n"); + return NULL; + } + + /* Create new initial condition */ + if ((init_cond = new InitCond(param, init_val)) == NULL) + { + if (PARSE_DEBUG) printf("parse_init_cond: new_init_cond failed!\n"); + return NULL; + } + + /* Finished */ + return init_cond; +} + +/* Parses a per frame init equation, not sure if this works right now */ +InitCond * Parser::parse_per_frame_init_eqn(std::istream & fs, Preset * preset, std::map * database) +{ + + char name[MAX_TOKEN_SIZE]; + Param * param = NULL; + CValue init_val; + InitCond * init_cond; + GenExpr * gen_expr; + float val; + token_type token; + + + if (preset == NULL) + return NULL; + + if ((token = parseToken(fs, name)) != tEq) + return NULL; + + + /* If a database was specified,then use ParamUtils::find_db instead */ + if ((database != NULL) && ((param = ParamUtils::find(name, database)) == NULL)) + { + return NULL; + } + + /* Otherwise use the builtin parameter and user databases. This is confusing. Sorry. */ + if ((param == NULL) && ((param = ParamUtils::find(name, &preset->builtinParams, &preset->user_param_tree)) == NULL)) + { + return NULL; + } + + if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: parameter = \"%s\" (LINE %d)\n", param->name.c_str(), line_count); + + if (param->flags & P_FLAG_READONLY) + { + if (PARSE_DEBUG) printf("pars_per_frame_init_eqn: builtin parameter \"%s\" marked as read only!\n", param->name.c_str()); + return NULL; + } + + /* At this point, a parameter has been created or was found + in the database. */ + + if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: parsing right hand side of per frame init equation.. (LINE %d)\n", line_count); + + if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) + { + if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: failed to parse general expresion!\n"); + return NULL; + } + + /* Compute initial condition value */ + val = gen_expr->eval_gen_expr(-1,-1); + + /* Free the general expression now that we are done with it */ + delete gen_expr; + + /* integer value (boolean is an integer in C) */ + if (param->type == P_TYPE_BOOL) + { + init_val.bool_val = (bool)val; + } + + else if ((param->type == P_TYPE_INT)) + { + init_val.int_val = (int)val; + } + + /* float value */ + else if (param->type == P_TYPE_DOUBLE) + { + init_val.float_val = val; + } + + /* Unknown value */ + else + { + if (PARSE_DEBUG) printf("pase_per_frame_init_eqn: unknown parameter type!\n"); + return NULL; + } + + + /* Create new initial condition */ + if ((init_cond = new InitCond(param, init_val)) == NULL) + { + if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: new_init_cond failed!\n"); + return NULL; + } + + init_cond->evaluate(true); + + /* Finished */ + return init_cond; +} + +int Parser::parse_wavecode(char * token, std::istream & fs, Preset * preset) +{ + + char * var_string; + InitCond * init_cond; + CustomWave * custom_wave; + int id; + CValue init_val; + Param * param; + + assert(preset); + assert(fs); + assert(token); + + /* token should be in the form wavecode_N_var, such as wavecode_1_samples */ + + /* Get id and variable name from token string */ + if (parse_wavecode_prefix(token, &id, &var_string) < 0) + return PROJECTM_PARSE_ERROR; + + last_custom_wave_id = id; + + if (PARSE_DEBUG) printf("parse_wavecode: wavecode id = %d, parameter = \"%s\"\n", id, var_string); + + /* Retrieve custom wave information from preset, allocating new one if necessary */ + if ((custom_wave = Preset::find_custom_object(id, preset->customWaves)) == NULL) + { + std::cerr << "parse_wavecode: failed to load (or create) custom wave (id = " + << id << ")!\n" << std::endl; + + return PROJECTM_FAILURE; + } + + if (PARSE_DEBUG) printf("parse_wavecode: custom wave found (id = %d)\n", custom_wave->id); + + /* Retrieve parameter from this custom waves parameter db */ + if ((param = ParamUtils::find(var_string,&custom_wave->param_tree)) == NULL) + return PROJECTM_FAILURE; + + if (PARSE_DEBUG) printf("parse_wavecode: custom wave parameter found (name = %s)\n", param->name.c_str()); + + /* integer value (boolean is an integer in C) */ + + if ((param->type == P_TYPE_BOOL)) + { + int bool_test; + if ((parse_int(fs, &bool_test)) == PROJECTM_PARSE_ERROR) + { + + if (PARSE_DEBUG) printf("parse_wavecode: error parsing integer!\n"); + return PROJECTM_PARSE_ERROR; + } + init_val.bool_val = bool_test; + } + else if ((param->type == P_TYPE_INT)) + { + if ((parse_int(fs, (int*)&init_val.int_val)) == PROJECTM_PARSE_ERROR) + { + + if (PARSE_DEBUG) printf("parse_wavecode: error parsing integer!\n"); + return PROJECTM_PARSE_ERROR; + } + } + + /* float value */ + else if (param->type == P_TYPE_DOUBLE) + { + if ((parse_float(fs, (float*)&init_val.float_val)) == PROJECTM_PARSE_ERROR) + { + if (PARSE_DEBUG) printf("parse_wavecode: error parsing float!\n"); + return PROJECTM_PARSE_ERROR; + } + } + + /* Unknown value */ + else + { + if (PARSE_DEBUG) printf("parse_wavecode: unknown parameter type!\n"); + return PROJECTM_PARSE_ERROR; + } + + /* Create new initial condition */ + if ((init_cond = new InitCond(param, init_val)) == NULL) + { + if (PARSE_DEBUG) printf("parse_wavecode: new_init_cond failed!\n"); + return PROJECTM_FAILURE; + } + + std::pair::iterator, bool> inserteePair = + custom_wave->init_cond_tree.insert(std::make_pair(init_cond->param->name, init_cond)); + + assert(inserteePair.second); + + line_mode = CUSTOM_WAVE_WAVECODE_LINE_MODE; + + if (PARSE_DEBUG) printf("parse_wavecode: [success]\n"); + return PROJECTM_SUCCESS; +} + +int Parser::parse_shapecode(char * token, std::istream & fs, Preset * preset) +{ + + char * var_string; + InitCond * init_cond; + CustomShape * custom_shape; + int id; + CValue init_val; + Param * param; + + /* Null argument checks */ + if (preset == NULL) + return PROJECTM_FAILURE; + if (token == NULL) + return PROJECTM_FAILURE; + + /* token should be in the form shapecode_N_var, such as shapecode_1_samples */ + + /* Get id and variable name from token string */ + if (parse_shapecode_prefix(token, &id, &var_string) < 0) + return PROJECTM_PARSE_ERROR; + + last_custom_shape_id = id; + + if (PARSE_DEBUG) printf("parse_shapecode: shapecode id = %d, parameter = \"%s\"\n", id, var_string); + + + /* Retrieve custom shape information from preset. The 3rd argument + if true creates a custom shape if one does not exist */ + + if ((custom_shape = Preset::find_custom_object(id, preset->customShapes)) == NULL) + { + if (PARSE_DEBUG) printf("parse_shapecode: failed to load (or create) custom shape (id = %d)!\n", id); + return PROJECTM_FAILURE; + } + if (PARSE_DEBUG) printf("parse_shapecode: custom shape found (id = %d)\n", custom_shape->id); + + if ((param = ParamUtils::find(var_string, &custom_shape->text_properties_tree)) != NULL) + { + + std::string text;//[MAX_TOKEN_SIZE]; + //token_type token = parseToken(fs, text); + + fs >> text; + + *((std::string*)param->engine_val) = text; + if (PARSE_DEBUG) + std::cerr << "parse_shapecode: found image url, text is \"" + << text << "\"" << std::endl; + + return PROJECTM_SUCCESS; + } + + /* Retrieve parameter from this custom shapes parameter db */ + + + if ((param = ParamUtils::find(var_string, &custom_shape->param_tree)) == NULL) + { + if (PARSE_DEBUG) printf("parse_shapecode: failed to create parameter.\n"); + return PROJECTM_FAILURE; + } + if (PARSE_DEBUG) printf("parse_shapecode: custom shape parameter found (name = %s)\n", param->name.c_str()); + + /* integer value (boolean is an integer in C) */ + + + if ((param->type == P_TYPE_BOOL)) + { + int bool_test; + if ((parse_int(fs, &bool_test)) == PROJECTM_PARSE_ERROR) + { + if (PARSE_DEBUG) printf("parse_shapecode: error parsing integer!\n"); + return PROJECTM_PARSE_ERROR; + } + init_val.bool_val = bool_test; + } + else if ((param->type == P_TYPE_INT)) + { + if ((parse_int(fs, (int*)&init_val.int_val)) == PROJECTM_PARSE_ERROR) + { + if (PARSE_DEBUG) printf("parse_shapecode: error parsing integer!\n"); + return PROJECTM_PARSE_ERROR; + } + } + + /* float value */ + else if (param->type == P_TYPE_DOUBLE) + { + if ((parse_float(fs, (float*)&init_val.float_val)) == PROJECTM_PARSE_ERROR) + { + if (PARSE_DEBUG) printf("parse_shapecode: error parsing float!\n"); + return PROJECTM_PARSE_ERROR; + } + } + + /* Unknown value */ + else + { + if (PARSE_DEBUG) printf("parse_shapecode: unknown parameter type!\n"); + return PROJECTM_PARSE_ERROR; + } + + /* Create new initial condition */ + if ((init_cond = new InitCond(param, init_val)) == NULL) + { + if (PARSE_DEBUG) printf("parse_shapecode: new_init_cond failed!\n"); + return PROJECTM_FAILURE; + } + + custom_shape->init_cond_tree.insert(std::make_pair(param->name,init_cond)); + line_mode = CUSTOM_SHAPE_SHAPECODE_LINE_MODE; + + if (PARSE_DEBUG) printf("parse_shapecode: [success]\n"); + return PROJECTM_SUCCESS; +} + + +int Parser::parse_wavecode_prefix(char * token, int * id, char ** var_string) +{ + + int len, i, j; + + if (token == NULL) + return PROJECTM_FAILURE; + /* + if (*var_string == NULL) + return PROJECTM_FAILURE; + */ + if (id == NULL) + return PROJECTM_FAILURE; + + len = strlen(token); + + /* Move pointer passed "wavecode_" prefix */ + if (len <= WAVECODE_STRING_LENGTH) + return PROJECTM_FAILURE; + i = WAVECODE_STRING_LENGTH; + j = 0; + (*id) = 0; + + /* This loop grabs the integer id for this custom wave */ + while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) + { + if (j >= MAX_TOKEN_SIZE) + return PROJECTM_FAILURE; + + (*id) = 10*(*id) + (token[i]-48); + j++; + i++; + } + + + if (i > (len - 2)) + return PROJECTM_FAILURE; + + *var_string = token + i + 1; + + return PROJECTM_SUCCESS; + +} + + +int Parser::parse_shapecode_prefix(char * token, int * id, char ** var_string) +{ + + int len, i, j; + + if (token == NULL) + return PROJECTM_FAILURE; + /* + if (*var_string == NULL) + return PROJECTM_FAILURE; + */ + if (id == NULL) + return PROJECTM_FAILURE; + + len = strlen(token); + + /* Move pointer passed "shapecode_" prefix */ + if (len <= SHAPECODE_STRING_LENGTH) + return PROJECTM_FAILURE; + i = SHAPECODE_STRING_LENGTH; + j = 0; + (*id) = 0; + + /* This loop grabs the integer id for this custom shape */ + while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) + { + if (j >= MAX_TOKEN_SIZE) + return PROJECTM_FAILURE; + + (*id) = 10*(*id) + (token[i]-48); + j++; + i++; + } + + + if (i > (len - 2)) + return PROJECTM_FAILURE; + + *var_string = token + i + 1; + + return PROJECTM_SUCCESS; + +} + +int Parser::parse_wave_prefix(char * token, int * id, char ** eqn_string) +{ + + int len, i, j; + + if (token == NULL) + return PROJECTM_FAILURE; + if (eqn_string == NULL) + return PROJECTM_FAILURE; + if (id == NULL) + return PROJECTM_FAILURE; + + len = strlen(token); + + if (len <= WAVE_STRING_LENGTH) + return PROJECTM_FAILURE; + + + i = WAVE_STRING_LENGTH; + j = 0; + (*id) = 0; + + /* This loop grabs the integer id for this custom wave */ + while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) + { + if (j >= MAX_TOKEN_SIZE) + return PROJECTM_FAILURE; + + (*id) = 10*(*id) + (token[i]-48); + j++; + i++; + } + + if (i > (len - 2)) + return PROJECTM_FAILURE; + + *eqn_string = token + i + 1; + + if (PARSE_DEBUG) printf("parse_wave_prefix: prefix = %s\n (LINE %d)", *eqn_string, line_count); + return PROJECTM_SUCCESS; + +} + +int Parser::parse_shape_prefix(char * token, int * id, char ** eqn_string) +{ + + int len, i, j; + + if (token == NULL) + return PROJECTM_FAILURE; + if (eqn_string == NULL) + return PROJECTM_FAILURE; + if (id == NULL) + return PROJECTM_FAILURE; + + len = strlen(token); + + if (len <= SHAPE_STRING_LENGTH) + return PROJECTM_FAILURE; + + + i = SHAPE_STRING_LENGTH; + j = 0; + (*id) = 0; + + /* This loop grabs the integer id for this custom wave */ + while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) + { + if (j >= MAX_TOKEN_SIZE) + return PROJECTM_FAILURE; + + (*id) = 10*(*id) + (token[i]-48); + j++; + i++; + } + + if (i > (len - 2)) + return PROJECTM_FAILURE; + + *eqn_string = token + i + 1; + + return PROJECTM_SUCCESS; + +} + +/* Parses custom wave equations */ +int Parser::parse_wave(char * token, std::istream & fs, Preset * preset) +{ + + int id; + char * eqn_type; + + if (PARSE_DEBUG) printf("parse_wave:begin\n"); + + if (token == NULL) + return PROJECTM_FAILURE; + if (preset == NULL) + return PROJECTM_FAILURE; + + /* Grab custom wave id and equation type (per frame or per point) from string token */ + if (parse_wave_prefix(token, &id, &eqn_type) < 0) + { + if (PARSE_DEBUG) printf("parse_wave: syntax error in custom wave prefix!\n"); + return PROJECTM_FAILURE; + } + + strncpy(last_eqn_type, eqn_type, MAX_TOKEN_SIZE); + + return parse_wave_helper(fs, preset, id, eqn_type, 0); + +} + +int Parser::parse_wave_helper(std::istream & fs, Preset * preset, int id, char * eqn_type, char * init_string) +{ + + Param * param; + GenExpr * gen_expr; + char string[MAX_TOKEN_SIZE]; + PerFrameEqn * per_frame_eqn; + CustomWave * custom_wave; + InitCond * init_cond; + + /* Retrieve custom wave associated with this id */ + if ((custom_wave = Preset::find_custom_object(id, preset->customWaves)) == NULL) + { + if (PARSE_DEBUG) printf("parse_wave_helper: custom wave id %d not found!\n", id); + return PROJECTM_FAILURE; + } + + /* per frame init equation case */ + if (!strncmp(eqn_type, WAVE_INIT_STRING, WAVE_INIT_STRING_LENGTH)) + { + + if (PARSE_DEBUG) printf("parse_wave_helper (per frame init): [begin] (LINE %d)\n", line_count); + + /* Parse the per frame init equation */ + if ((init_cond = parse_per_frame_init_eqn(fs, preset, &custom_wave->param_tree)) == NULL) + { + if (PARSE_DEBUG) printf("parse_wave_helper (per frame init): equation parsing failed (LINE %d)\n", line_count); + return PROJECTM_PARSE_ERROR; + } + + /* Insert the equation in the per frame equation tree */ + custom_wave->per_frame_init_eqn_tree.insert(std::make_pair(init_cond->param->name,init_cond)); + + { + if (PARSE_DEBUG) printf("parse_wave_helper: failed to update string buffer (LINE %d)\n", line_count); + return PROJECTM_FAILURE; + } + line_mode = CUSTOM_WAVE_PER_FRAME_INIT_LINE_MODE; + init_cond->evaluate(true); + return PROJECTM_SUCCESS; + + } + + /* per frame equation case */ + if (!strncmp(eqn_type, PER_FRAME_STRING_NO_UNDERSCORE, PER_FRAME_STRING_NO_UNDERSCORE_LENGTH)) + { + + if (PARSE_DEBUG) printf("parse_wave_helper (per_frame): [start] (custom wave id = %d)\n", custom_wave->id); + + if (parseToken(fs, string) != tEq) + { + if (PARSE_DEBUG) printf("parse_wave (per_frame): no equal sign after string \"%s\" (LINE %d)\n", string, line_count); + return PROJECTM_PARSE_ERROR; + } + + /* Find the parameter associated with the string in the custom wave database */ + if ((param = ParamUtils::find(string, &custom_wave->param_tree)) == NULL) + { + if (PARSE_DEBUG) printf("parse_wave (per_frame): parameter \"%s\" not found or cannot be wipemalloc'ed!!\n", string); + return PROJECTM_FAILURE; + } + + + /* Make sure parameter is writable */ + if (param->flags & P_FLAG_READONLY) + { + if (PARSE_DEBUG) printf("parse_wave (per_frame): parameter %s is marked as read only (LINE %d)\n", param->name.c_str(), line_count); + return PROJECTM_FAILURE; + } + + /* Parse right side of equation as an expression */ + + current_wave = custom_wave; + if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) + { + if (PARSE_DEBUG) printf("parse_wave (per_frame): equation evaluated to null (LINE %d)\n", line_count); + current_wave = NULL; + return PROJECTM_PARSE_ERROR; + + } + + current_wave = NULL; + + if (PARSE_DEBUG) printf("parse_wave (per_frame): [finished parsing equation] (LINE %d)\n", line_count); + + /* Create a new per frame equation */ + if ((per_frame_eqn = new PerFrameEqn(custom_wave->per_frame_count++, param, gen_expr)) == NULL) + { + if (PARSE_DEBUG) printf("parse_wave (per_frame): failed to create a new per frame eqn, out of memory?\n"); + delete gen_expr; + return PROJECTM_FAILURE; + } + + custom_wave->per_frame_eqn_tree.push_back(per_frame_eqn); + if (PARSE_DEBUG) printf("parse_wave (per_frame): equation %d associated with custom wave %d [success]\n", + per_frame_eqn->index, custom_wave->id); + + + /* Need to add stuff to string buffer so the editor can read the equations. + Why not make a nice little helper function for this? - here it is: */ + + line_mode = CUSTOM_WAVE_PER_FRAME_LINE_MODE; + return PROJECTM_SUCCESS; + } + + + /* per point equation case */ + if (!strncmp(eqn_type, PER_POINT_STRING, PER_POINT_STRING_LENGTH)) + { + + if (PARSE_DEBUG) printf("parse_wave_helper (per_point): per_pixel equation parsing start...(LINE %d)\n", line_count); + + /// HACK the parse_line code already parsed the per_pixel variable name. This handles that case + /// Parser needs reworked. Don't have time for it. So this is the result. + if (init_string) + strncpy(string, init_string, strlen(init_string)); + else + { + if (parseToken(fs, string) != tEq) + { /* parse per pixel operator name */ + if (PARSE_DEBUG) printf("parse_wave_helper (per_point): equal operator missing after per pixel operator. Last token = \"%s\" (LINE %d)\n", string, line_count); + + return PROJECTM_PARSE_ERROR; + } + } + + /* Parse right side of equation as an expression, First tell parser we are parsing a custom wave */ + current_wave = custom_wave; + if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) + { + if (PARSE_DEBUG) printf("parse_wave_helper (per_point): equation evaluated to null? (LINE %d)\n", line_count); + + return PROJECTM_PARSE_ERROR; + } + + + /* Add the per point equation */ + if (custom_wave->add_per_point_eqn(string, gen_expr) < 0) + { + delete gen_expr; + + return PROJECTM_PARSE_ERROR; + } + // This tells the parser we are no longer parsing a custom wave + current_wave = NULL; + + + + line_mode = CUSTOM_WAVE_PER_POINT_LINE_MODE; + if (PARSE_DEBUG) printf("parse_wave_helper (per_point): [finished] (custom wave id = %d)\n", custom_wave->id); + return PROJECTM_SUCCESS; + } + + return PROJECTM_FAILURE; +} + +/* Parses custom shape equations */ +int Parser::parse_shape(char * token, std::istream & fs, Preset * preset) +{ + + int id; + char * eqn_type; + CustomShape * custom_shape; + + + if (token == NULL) + + return PROJECTM_FAILURE; + if (preset == NULL) + return PROJECTM_FAILURE; + + /* Grab custom shape id and equation type (per frame or per point) from string token */ + if (parse_shape_prefix(token, &id, &eqn_type) < 0) + { + if (PARSE_DEBUG) printf("parse_shape: syntax error in custom shape prefix!\n"); + return PROJECTM_PARSE_ERROR; + } + + /* Retrieve custom shape associated with this id */ + if ((custom_shape = Preset::find_custom_object(id,preset->customShapes)) == NULL) + return PROJECTM_FAILURE; + + + /* per frame init equation case */ + if (!strncmp(eqn_type, SHAPE_INIT_STRING, SHAPE_INIT_STRING_LENGTH)) + { + return parse_shape_per_frame_init_eqn(fs, custom_shape, preset); + } + + /* per frame equation case */ + if (!strncmp(eqn_type, PER_FRAME_STRING_NO_UNDERSCORE, PER_FRAME_STRING_NO_UNDERSCORE_LENGTH)) + { + return parse_shape_per_frame_eqn(fs, custom_shape, preset); + } + + + /* Syntax error, return parse error */ + return PROJECTM_PARSE_ERROR; +} + +/* Helper function to update the string buffers used by the editor */ +int Parser::update_string_buffer(char * buffer, int * index) +{ + + int string_length; + int skip_size; + + if (!buffer) + return PROJECTM_FAILURE; + if (!index) + return PROJECTM_FAILURE; + + + /* If the string line buffer used by the parser is already full then quit */ + if (string_line_buffer_index == (STRING_LINE_SIZE-1)) + return PROJECTM_FAILURE; + + if ((skip_size = get_string_prefix_len(string_line_buffer)) == PROJECTM_FAILURE) + return PROJECTM_FAILURE; + + string_line_buffer[string_line_buffer_index++] = '\n'; + + // string_length = strlen(string_line_buffer + strlen(eqn_string)+1); + if (skip_size >= STRING_LINE_SIZE) + return PROJECTM_FAILURE; + + string_length = strlen(string_line_buffer + skip_size); + + if (skip_size > (STRING_LINE_SIZE-1)) + return PROJECTM_FAILURE; + + /* Add line to string buffer */ + strncpy(buffer + (*index), + string_line_buffer + skip_size, string_length); + + /* Buffer full, quit */ + if ((*index) > (STRING_BUFFER_SIZE - 1)) + { + if (PARSE_DEBUG) printf("update_string_buffer: string buffer full!\n"); + return PROJECTM_FAILURE; + } + + /* Otherwise, increment string index by the added string length */ + (*index)+=string_length; + + return PROJECTM_SUCCESS; + +} + + +/* Helper function: returns the length of the prefix portion in the line + buffer (the passed string here). In other words, given + the string 'per_frame_1 = x = ....', return the length of 'per_frame_1 = ' + Returns -1 if syntax error +*/ + +int Parser::get_string_prefix_len(char * string) +{ + + int i = 0; + + /* Null argument check */ + if (string == NULL) + return PROJECTM_FAILURE; + + /* First find the equal sign */ + while (string[i] != '=') + { + if (string[i] == 0) + return PROJECTM_FAILURE; + i++; + } + + /* If the string already ends at the next char then give up */ + if (string[i+1] == 0) + return PROJECTM_FAILURE; + + /* Move past the equal sign */ + i++; + + /* Now found the start of the LHS variable, ie skip the spaces */ + while(string[i] == ' ') + { + i++; + } + + /* If this is the end of the string then its a syntax error */ + if (string[i] == 0) + return PROJECTM_FAILURE; + + /* Finished succesfully, return the length */ + return i; +} + +int Parser::parse_shape_per_frame_init_eqn(std::istream & fs, CustomShape * custom_shape, Preset * preset) +{ + InitCond * init_cond; + + if (PARSE_DEBUG) printf("parse_shape (per frame init): [begin] (LINE %d)\n", line_count); + + /* Parse the per frame equation */ + if ((init_cond = parse_per_frame_init_eqn(fs, preset, &custom_shape->param_tree)) == NULL) + { + if (PARSE_DEBUG) printf("parse_shape (per frame init): equation parsing failed (LINE %d)\n", line_count); + return PROJECTM_PARSE_ERROR; + } + + /// \idea possibly a good place to update a string buffer; + + line_mode = CUSTOM_SHAPE_PER_FRAME_INIT_LINE_MODE; + init_cond->evaluate(true); + return PROJECTM_SUCCESS; +} + +int Parser::parse_shape_per_frame_eqn(std::istream & fs, CustomShape * custom_shape, Preset * preset) +{ + + Param * param; + GenExpr * gen_expr; + PerFrameEqn * per_frame_eqn; + + char string[MAX_TOKEN_SIZE]; + + if (PARSE_DEBUG) printf("parse_shape (per_frame): [start] (custom shape id = %d)\n", custom_shape->id); + + if (parseToken(fs, string) != tEq) + { + if (PARSE_DEBUG) printf("parse_shape (per_frame): no equal sign after string \"%s\" (LINE %d)\n", string, line_count); + return PROJECTM_PARSE_ERROR; + } + + /* Find the parameter associated with the string in the custom shape database */ + if ((param = ParamUtils::find(string, &custom_shape->param_tree)) == NULL) + { + if (PARSE_DEBUG) printf("parse_shape (per_frame): parameter \"%s\" not found or cannot be wipemalloc'ed!!\n", string); + return PROJECTM_FAILURE; + } + + + /* Make sure parameter is writable */ + if (param->flags & P_FLAG_READONLY) + { + if (PARSE_DEBUG) printf("parse_shape (per_frame): parameter %s is marked as read only (LINE %d)\n", param->name.c_str(), line_count); + return PROJECTM_PARSE_ERROR; + } + + /* Parse right side of equation as an expression */ + + current_shape = custom_shape; + if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) + { + if (PARSE_DEBUG) printf("parse_shape (per_frame): equation evaluated to null (LINE %d)\n", line_count); + current_shape = NULL; + return PROJECTM_PARSE_ERROR; + } + + current_shape = NULL; + + if (PARSE_DEBUG) printf("parse_shape (per_frame): [finished parsing equation] (LINE %d)\n", line_count); + + /* Create a new per frame equation */ + if ((per_frame_eqn = new PerFrameEqn(custom_shape->per_frame_count++, param, gen_expr)) == NULL) + { + if (PARSE_DEBUG) printf("parse_shape (per_frame): failed to create a new per frame eqn, out of memory?\n"); + delete gen_expr; + return PROJECTM_FAILURE; + } + + custom_shape->per_frame_eqn_tree.push_back(per_frame_eqn); + + /// \idea add string buffer update for easy >> and << + + line_mode = CUSTOM_SHAPE_PER_FRAME_LINE_MODE; + return PROJECTM_SUCCESS; +} + +int Parser::parse_wave_per_frame_eqn(std::istream & fs, CustomWave * custom_wave, Preset * preset) +{ + + Param * param; + GenExpr * gen_expr; + PerFrameEqn * per_frame_eqn; + + char string[MAX_TOKEN_SIZE]; + + if (PARSE_DEBUG) printf("parse_wave (per_frame): [start] (custom shape id = %d)\n", custom_wave->id); + + if (parseToken(fs, string) != tEq) + { + if (PARSE_DEBUG) printf("parse_wave (per_frame): no equal sign after string \"%s\" (LINE %d)\n", string, line_count); + return PROJECTM_PARSE_ERROR; + } + + /* Find the parameter associated with the string in the custom shape database */ + if ((param = ParamUtils::find(string, &custom_wave->param_tree)) == NULL) + { + if (PARSE_DEBUG) printf("parse_wave (per_frame): parameter \"%s\" not found or cannot be wipemalloc'ed!!\n", string); + return PROJECTM_FAILURE; + } + + + /* Make sure parameter is writable */ + if (param->flags & P_FLAG_READONLY) + { + if (PARSE_DEBUG) printf("parse_wave (per_frame): parameter %s is marked as read only (LINE %d)\n", param->name.c_str(), line_count); + return PROJECTM_FAILURE; + } + + /* Parse right side of equation as an expression */ + + current_wave = custom_wave; + if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) + { + if (PARSE_DEBUG) printf("parse_wave (per_frame): equation evaluated to null (LINE %d)\n", line_count); + current_wave = NULL; + return PROJECTM_PARSE_ERROR; + } + + current_wave = NULL; + + if (PARSE_DEBUG) printf("parse_wave (per_frame): [finished parsing equation] (LINE %d)\n", line_count); + + /* Create a new per frame equation */ + if ((per_frame_eqn = new PerFrameEqn(custom_wave->per_frame_count++, param, gen_expr)) == NULL) + { + if (PARSE_DEBUG) printf("parse_wave (per_frame): failed to create a new per frame eqn, out of memory?\n"); + delete gen_expr; + return PROJECTM_FAILURE; + } + + custom_wave->per_frame_eqn_tree.push_back(per_frame_eqn); + if (PARSE_DEBUG) printf("parse_wave (per_frame): equation %d associated with custom wave %d [success]\n", + per_frame_eqn->index, custom_wave->id); + + + /* Need to add stuff to string buffer so the editor can read the equations. + Why not make a nice little helper function for this? - here it is: */ + + line_mode = CUSTOM_WAVE_PER_FRAME_LINE_MODE; + return PROJECTM_SUCCESS; +} + + +bool Parser::wrapsToNextLine(const std::string & str) { + +std::size_t lastLineEndIndex = + lastLinePrefix.find_last_not_of("0123456789"); + +std::size_t thisLineEndIndex = + str.find_last_not_of("0123456789"); + +std::size_t startIndex = 0; +if ((str.compare(startIndex, lastLineEndIndex, lastLinePrefix.c_str(), thisLineEndIndex)) == 0) + return true; +else + return false; + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Parser.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Parser.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Parser.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Parser.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,182 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Preset parser + * + * $Log$ + */ + +#ifndef _PARSER_H +#define _PARSER_H +#define PARSE_DEBUG 0 +//#define PARSE_DEBUG 0 + +#include + +#include "Expr.hpp" +#include "PerFrameEqn.hpp" +#include "InitCond.hpp" +#include "Preset.hpp" + +/* Strings that prefix (and denote the type of) equations */ +#define PER_FRAME_STRING "per_frame_" +#define PER_FRAME_STRING_LENGTH 10 + +#define PER_PIXEL_STRING "per_pixel_" +#define PER_PIXEL_STRING_LENGTH 10 + +#define PER_FRAME_INIT_STRING "per_frame_init_" +#define PER_FRAME_INIT_STRING_LENGTH 15 + +#define WAVECODE_STRING "wavecode_" +#define WAVECODE_STRING_LENGTH 9 + +#define WAVE_STRING "wave_" +#define WAVE_STRING_LENGTH 5 + +#define PER_POINT_STRING "per_point" +#define PER_POINT_STRING_LENGTH 9 + +#define PER_FRAME_STRING_NO_UNDERSCORE "per_frame" +#define PER_FRAME_STRING_NO_UNDERSCORE_LENGTH 9 + +#define SHAPECODE_STRING "shapecode_" +#define SHAPECODE_STRING_LENGTH 10 + +#define SHAPE_STRING "shape_" +#define SHAPE_STRING_LENGTH 6 + +#define SHAPE_INIT_STRING "init" +#define SHAPE_INIT_STRING_LENGTH 4 + +#define WAVE_INIT_STRING "init" +#define WAVE_INIT_STRING_LENGTH 4 + +typedef enum { + UNSET_LINE_MODE, + PER_FRAME_LINE_MODE, + PER_PIXEL_LINE_MODE, + PER_FRAME_INIT_LINE_MODE, + INIT_COND_LINE_MODE, + CUSTOM_WAVE_PER_POINT_LINE_MODE, + CUSTOM_WAVE_PER_FRAME_LINE_MODE, + CUSTOM_WAVE_WAVECODE_LINE_MODE, + CUSTOM_SHAPE_SHAPECODE_LINE_MODE, + CUSTOM_SHAPE_PER_FRAME_LINE_MODE, + CUSTOM_SHAPE_PER_FRAME_INIT_LINE_MODE, + CUSTOM_WAVE_PER_FRAME_INIT_LINE_MODE +} line_mode_t; + +/** Token enumeration type */ +typedef enum { + tEOL, /* end of a line, usually a '/n' or '/r' */ + tEOF, /* end of file */ + tLPr, /* ( */ + tRPr, /* ) */ + tLBr, /* [ */ + tRBr, /* ] */ + tEq, /* = */ + tPlus, /* + */ + tMinus, /* - */ + tMult, /* * */ + tMod, /* % */ + tDiv, /* / */ + tOr, /* | */ + tAnd, /* & */ + tComma, /* , */ + tPositive, /* + as a prefix operator */ + tNegative, /* - as a prefix operator */ + tSemiColon, /* ; */ + tStringTooLong, /* special token to indicate an invalid string length */ + tStringBufferFilled /* the string buffer for this line is maxed out */ + } token_type; + +class CustomShape; +class CustomWave; +class GenExpr; +class InfixOp; +class PerFrameEqn; +class Preset; +class TreeExpr; + +class Parser { +public: + static std::string lastLinePrefix; + static line_mode_t line_mode; + static CustomWave *current_wave; + static CustomShape *current_shape; + static int string_line_buffer_index; + static char string_line_buffer[STRING_LINE_SIZE]; + static unsigned int line_count; + static int per_frame_eqn_count; + static int per_frame_init_eqn_count; + static int last_custom_wave_id; + static int last_custom_shape_id; + static char last_eqn_type[MAX_TOKEN_SIZE]; + static int last_token_size; + static bool tokenWrapAroundEnabled; + + static PerFrameEqn *parse_per_frame_eqn( std::istream & fs, int index, + Preset * preset); + static int parse_per_pixel_eqn( std::istream & fs, Preset * preset, + char * init_string); + static InitCond *parse_init_cond( std::istream & fs, char * name, Preset * preset ); + static int parse_preset_name( std::istream & fs, char * name ); + static int parse_top_comment( std::istream & fs ); + static int parse_line( std::istream & fs, Preset * preset ); + + static int get_string_prefix_len(char * string); + static TreeExpr * insert_gen_expr(GenExpr * gen_expr, TreeExpr ** root); + static TreeExpr * insert_infix_op(InfixOp * infix_op, TreeExpr ** root); + static token_type parseToken(std::istream & fs, char * string); + static GenExpr ** parse_prefix_args(std::istream & fs, int num_args, Preset * preset); + static GenExpr * parse_infix_op(std::istream & fs, token_type token, TreeExpr * tree_expr, Preset * preset); + static GenExpr * parse_sign_arg(std::istream & fs); + static int parse_float(std::istream & fs, float * float_ptr); + static int parse_int(std::istream & fs, int * int_ptr); + static int insert_gen_rec(GenExpr * gen_expr, TreeExpr * root); + static int insert_infix_rec(InfixOp * infix_op, TreeExpr * root); + static GenExpr * parse_gen_expr(std::istream & fs, TreeExpr * tree_expr, Preset * preset); + static PerFrameEqn * parse_implicit_per_frame_eqn(std::istream & fs, char * param_string, int index, Preset * preset); + static InitCond * parse_per_frame_init_eqn(std::istream & fs, Preset * preset, std::map * database); + static int parse_wavecode_prefix(char * token, int * id, char ** var_string); + static int parse_wavecode(char * token, std::istream & fs, Preset * preset); + static int parse_wave_prefix(char * token, int * id, char ** eqn_string); + static int parse_wave_helper(std::istream & fs, Preset * preset, int id, char * eqn_type, char * init_string); + static int parse_shapecode(char * eqn_string, std::istream & fs, Preset * preset); + static int parse_shapecode_prefix(char * token, int * id, char ** var_string); + + static int parse_wave(char * eqn_string, std::istream & fs, Preset * preset); + static int parse_shape(char * eqn_string, std::istream & fs, Preset * preset); + static int parse_shape_prefix(char * token, int * id, char ** eqn_string); + + static int update_string_buffer(char * buffer, int * index); + static int string_to_float(char * string, float * float_ptr); + static int parse_shape_per_frame_init_eqn(std::istream & fs, CustomShape * custom_shape, Preset * preset); + static int parse_shape_per_frame_eqn(std::istream & fs, CustomShape * custom_shape, Preset * preset); + static int parse_wave_per_frame_eqn(std::istream & fs, CustomWave * custom_wave, Preset * preset); + static bool wrapsToNextLine(const std::string & str); + }; + +#endif /** !_PARSER_H */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PCM.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PCM.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PCM.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PCM.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,349 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: PCM.c,v 1.3 2006/03/13 20:35:26 psperl Exp $ + * + * Takes sound data from wherever and hands it back out. + * Returns PCM Data or spectrum data, or the derivative of the PCM data + */ + +#include +#include + +#include "Common.hpp" +#include "wipemalloc.h" +#include "fftsg.h" +#include "PCM.hpp" +#include + +int PCM::maxsamples = 2048; + +//initPCM(int samples) +// +//Initializes the PCM buffer to +// number of samples specified. +#include +PCM::PCM() { + initPCM( 2048 ); + } + +void PCM::initPCM(int samples) { + int i; + + waveSmoothing = 0; + + //Allocate memory for PCM data buffer + assert(samples == 2048); + PCMd = (float **)wipemalloc(2 * sizeof(float *)); + PCMd[0] = (float *)wipemalloc(samples * sizeof(float)); + PCMd[1] = (float *)wipemalloc(samples * sizeof(float)); + + //maxsamples=samples; + newsamples=0; + numsamples = maxsamples; + + //Initialize buffers to 0 + for (i=0;imaxsamples = 2048; +// this->numsamples = 0; +// this->pcmdataL = NULL; +// this->pcmdataR = NULL; + + /** Allocate PCM data structures */ + pcmdataL=(float *)wipemalloc(this->maxsamples*sizeof(float)); + pcmdataR=(float *)wipemalloc(this->maxsamples*sizeof(float)); + +} + +PCM::~PCM() { + + free(pcmdataL); + free(pcmdataR); + free(w); + free(ip); + + free(PCMd[0]); + free(PCMd[1]); + free(PCMd); + +} + +#include + +void PCM::addPCMfloat(const float *PCMdata, int samples) const +{ + int i,j; + + for(i=0;imaxsamples) newsamples=maxsamples; + numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0); + getPCMnew(pcmdataL,0,0,waveSmoothing,0,1); + getPCM(vdataL,512,0,1,0,0); + getPCM(vdataR,512,1,1,0,0); +} + +void PCM::addPCM16Data(const short* pcm_data, short samples) const { + int i, j; + + for (i = 0; i < samples; ++i) { + j=i+start; + PCMd[0][j % maxsamples]=(pcm_data[i * 2 + 0]/16384.0); + PCMd[1][j % maxsamples]=(pcm_data[i * 2 + 1]/16384.0); + } + + start = (start + samples) % maxsamples; + + newsamples+=samples; + if (newsamples>maxsamples) newsamples=maxsamples; + numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0); + getPCMnew(pcmdataL,0,0,waveSmoothing,0,1); + getPCM(vdataL,512,0,1,0,0); + getPCM(vdataR,512,1,1,0,0); +} + + +void PCM::addPCM16(short PCMdata[2][512]) const +{ + int i,j; + int samples=512; + + for(i=0;imaxsamples) newsamples=maxsamples; + + numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0); + getPCMnew(pcmdataL,0,0,waveSmoothing,0,1); + getPCM(vdataL,512,0,1,0,0); + getPCM(vdataR,512,1,1,0,0); +} + + +void PCM::addPCM8( unsigned char PCMdata[2][1024]) const +{ + int i,j; + int samples=1024; + + + for(i=0;imaxsamples) newsamples=maxsamples; + numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0); + getPCMnew(pcmdataL,0,0,waveSmoothing,0,1); + getPCM(vdataL,512,0,1,0,0); + getPCM(vdataR,512,1,1,0,0); +} + +void PCM::addPCM8_512( const unsigned char PCMdata[2][512]) const +{ + int i,j; + int samples=512; + + + for(i=0;imaxsamples) newsamples=maxsamples; + numsamples = getPCMnew(pcmdataR,1,0,waveSmoothing,0,0); + getPCMnew(pcmdataL,0,0,waveSmoothing,0,1); + getPCM(vdataL,512,0,1,0,0); + getPCM(vdataR,512,1,1,0,0); +} + + +//puts sound data requested at provided pointer +// +//samples is number of PCM samples to return +//freq = 0 gives PCM data +//freq = 1 gives FFT data +//smoothing is the smoothing coefficient + +//returned values are normalized from -1 to 1 + +void PCM::getPCM(float *PCMdata, int samples, int channel, int freq, float smoothing, int derive) const +{ + int i,index; + + index=start-1; + + if (index<0) index=maxsamples+index; + + PCMdata[0]=PCMd[channel][index]; + + for(i=1;i +#include +#include + +#include "fatal.h" +#include "Common.hpp" + +#include "Param.hpp" +#include "PerFrameEqn.hpp" + +#include "Eval.hpp" +#include "Expr.hpp" + +#include "wipemalloc.h" +#include + +/* Evaluate an equation */ +void PerFrameEqn::evaluate() { + + if (PER_FRAME_EQN_DEBUG) { + printf("per_frame_%d=%s= ", index, param->name.c_str()); + fflush(stdout); + } + + //*((float*)per_frame_eqn->param->engine_val) = eval_gen_expr(per_frame_eqn->gen_expr); + assert(gen_expr); + assert(param); + param->set_param(gen_expr->eval_gen_expr(-1,-1)); + + if (PER_FRAME_EQN_DEBUG) printf(" = %.4f\n", *((float*)param->engine_val)); + +} + + +/* Frees perframe equation structure. Warning: assumes gen_expr pointer is not freed by anyone else! */ +PerFrameEqn::~PerFrameEqn() { + + delete gen_expr; + + // param is freed in param_tree container of some other class + +} + +/* Create a new per frame equation */ +PerFrameEqn::PerFrameEqn(int _index, Param * _param, GenExpr * _gen_expr) : + index(_index), param(_param), gen_expr(_gen_expr) {} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerFrameEqn.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerFrameEqn.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerFrameEqn.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerFrameEqn.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,53 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Per-frame equation + * + * $Log$ + */ + +#ifndef _PER_FRAME_EQN_H +#define _PER_FRAME_EQN_H + +#define PER_FRAME_EQN_DEBUG 0 + +class GenExpr; +class Param; +class PerFrameEqn; + +class PerFrameEqn { +public: + int index; /* a unique id for each per frame eqn (generated by order in preset files) */ + Param *param; /* parameter to be assigned a value */ + GenExpr *gen_expr; /* expression that paremeter is equal to */ + + PerFrameEqn(int index, Param * param, GenExpr * gen_expr); + ~PerFrameEqn(); + + /// Evaluate the per frame equation + void evaluate(); + + }; + + +#endif /** !_PER_FRAME_EQN_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPixelEqn.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPixelEqn.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPixelEqn.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPixelEqn.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,74 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ + +#include +#include +#include +#include + +#include "fatal.h" +#include "Common.hpp" + +#include "Expr.hpp" +#include "Eval.hpp" +#include "Param.hpp" +#include "PerPixelEqn.hpp" +#include + +#include "wipemalloc.h" +#include +/* Evaluates a per pixel equation */ +void PerPixelEqn::evaluate(int mesh_i, int mesh_j) { + + GenExpr * eqn_ptr = 0; + + + eqn_ptr = this->gen_expr; + + float ** param_matrix = (float**)this->param->matrix; + + if (param_matrix == 0) { + assert(param->engine_val); + (*(float*)param->engine_val) = eqn_ptr->eval_gen_expr(mesh_i, mesh_j); + + } else { + + assert(!(eqn_ptr == NULL || param_matrix == NULL)); + + param_matrix[mesh_i][mesh_j] = eqn_ptr->eval_gen_expr(mesh_i, mesh_j); + + /* Now that this parameter has been referenced with a per + pixel equation, we let the evaluator know by setting + this flag */ + /// @bug review and verify this behavior + param->matrix_flag = true; + param->flags |= P_FLAG_PER_PIXEL; + } +} + +PerPixelEqn::PerPixelEqn(int _index, Param * _param, GenExpr * _gen_expr):index(_index), param(_param), gen_expr(_gen_expr) { + + assert(index >= 0); + assert(param != 0); + assert(gen_expr != 0); + +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPixelEqn.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPixelEqn.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPixelEqn.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPixelEqn.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,66 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Per-pixel equation + * + * $Log$ + */ + +#ifndef _PER_PIXEL_EQN_H +#define _PER_PIXEL_EQN_H + +#define PER_PIXEL_EQN_DEBUG 0 + +#define ZOOM_OP 0 +#define ZOOMEXP_OP 1 +#define ROT_OP 2 +#define CX_OP 3 +#define CY_OP 4 +#define SX_OP 5 +#define SY_OP 6 +#define DX_OP 7 +#define DY_OP 8 +#define WARP_OP 9 +#define NUM_OPS 10 /* obviously, this number is dependent on the number of existing per pixel operations */ + +class GenExpr; +class Param; +class PerPixelEqn; +class Preset; + +class PerPixelEqn { +public: + int index; /* used for splay tree ordering. */ + int flags; /* primarily to specify if this variable is user-defined */ + Param *param; + GenExpr *gen_expr; + + void evalPerPixelEqns( Preset *preset ); + void evaluate(int mesh_i, int mesh_j); + + PerPixelEqn(int index, Param * param, GenExpr * gen_expr); + + }; + + +#endif /** !_PER_PIXEL_EQN_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPointEqn.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPointEqn.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPointEqn.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPointEqn.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,91 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ + +#include +#include +#include + +#include +#include "fatal.h" +#include "Common.hpp" + +#include "CustomWave.hpp" +#include "Eval.hpp" +#include "Expr.hpp" +#include "Param.hpp" +#include "PerPixelEqn.hpp" +#include "PerPointEqn.hpp" +#include +#include +#include "wipemalloc.h" + +/* Evaluates a per point equation for the current custom wave given by interface_wave ptr */ +void PerPointEqn::evaluate(int i) +{ + + float * param_matrix; + GenExpr * eqn_ptr; + + // samples = CustomWave::interface_wave->samples; + + eqn_ptr = gen_expr; + + if (param->matrix == NULL) + { + assert(param->matrix_flag == false); + (*(float*)param->engine_val) = eqn_ptr->eval_gen_expr(i,-1); + + + return; + } + + else + { + param_matrix = (float*)param->matrix; + + // -1 is because per points only use one dimension + param_matrix[i] = eqn_ptr->eval_gen_expr(i, -1); + + + /* Now that this parameter has been referenced with a per + point equation, we let the evaluator know by setting + this flag */ + + if (!param->matrix_flag) + param->matrix_flag = true; + + } + +} + +PerPointEqn::PerPointEqn(int _index, Param * _param, GenExpr * _gen_expr, int _samples): + index(_index), + samples(_samples), + param(_param), + gen_expr(_gen_expr) + +{} + + +PerPointEqn::~PerPointEqn() +{ + delete gen_expr; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPointEqn.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPointEqn.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPointEqn.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PerPointEqn.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,53 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Per-point equation + * + * $Log$ + */ + +#ifndef _PER_POINT_EQN_H +#define _PER_POINT_EQN_H + +class CustomWave; +class GenExpr; +class Param; +class PerPointEqn; + +class PerPointEqn { +public: + int index; + int samples; // the number of samples to iterate over + Param *param; + GenExpr * gen_expr; + ~PerPointEqn(); + void evaluate(int i); + PerPointEqn( int index, Param *param, GenExpr *gen_expr, int samples); + }; + + +//inline void eval_per_point_eqn_helper( void *per_point_eqn ) { +// ((PerPointEqn *)per_point_eqn)->evalPerPointEqn(); +// } + +#endif /** !_PER_POINT_EQN_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetChooser.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetChooser.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetChooser.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetChooser.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,14 @@ +// +// C++ Implementation: PresetChooser +// +// Description: +// +// +// Author: Carmelo Piccione , (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "PresetChooser.hpp" + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetChooser.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetChooser.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetChooser.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetChooser.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,204 @@ + +/// @idea Weighted random based on user stats + +#ifndef PRESET_CHOOSER_HPP +#define PRESET_CHOOSER_HPP + +#include "Preset.hpp" + +#include "PresetLoader.hpp" +#include "RandomNumberGenerators.hpp" +#include +#include +#include +class PresetChooser; + +/// A simple iterator class to traverse back and forth a preset directory +class PresetIterator { + +public: + PresetIterator() {} + + /// Instantiate a preset iterator at the given starting position + PresetIterator(std::size_t start); + + /// Move iterator forward + void operator++(); + + /// Move iterator backword + void operator--() ; + + /// Not equal comparator + bool operator !=(const PresetIterator & presetPos) const ; + + /// Equality comparator + bool operator ==(const PresetIterator & presetPos) const ; + + /// Returns an integer value representing the iterator position + /// @bug might become internal + /// \brief Returns the indexing value used by the current iterator. + std::size_t operator*() const; + + /// Allocate a new preset given this iterator's associated preset name + /// \param presetInputs the preset inputs to associate with the preset upon construction + /// \param presetOutputs the preset outputs to associate with the preset upon construction + /// \returns an autopointer of the newly allocated preset + std::unique_ptr allocate( PresetInputs & presetInputs, PresetOutputs & presetOutputs); + + /// Set the chooser asocciated with this iterator + void setChooser(const PresetChooser & chooser); + +private: + std::size_t m_currentIndex; + const PresetChooser * m_presetChooser; + +}; + +/// Provides functions and iterators to select presets. Requires a preset loader upon construction +class PresetChooser { + +public: + typedef PresetIterator iterator; + + /// Initializes a chooser with an established preset loader. + /// \param presetLoader an initialized preset loader to choose presets from + /// \note The preset loader is refreshed via events or otherwise outside this class's scope + PresetChooser(const PresetLoader & presetLoader); + + /// Choose a preset via the passed in index. Must be between 0 and num valid presets in directory + /// \param index An index lying in the interval [0, this->getNumPresets()) + /// \param presetInputs the preset inputs to associate with the preset upon construction + /// \param presetOutputs the preset outputs to associate with the preset upon construction + /// \returns an auto pointer of the newly allocated preset + std::unique_ptr directoryIndex(std::size_t index, PresetInputs & presetInputs, + PresetOutputs & presetOutputs) const; + + /// Gets the number of presets last believed to exist in the preset loader's filename collection + /// \returns the number of presets in the collection + std::size_t getNumPresets() const; + + + /// An STL-esque iterator to begin traversing presets from a directory + /// \param index the index to begin iterating at. Assumed valid between [0, num presets) + /// \returns the position of the first preset in the collection + PresetIterator begin(unsigned int index) const; + + /// An STL-esque iterator to begin traversing presets from a directory + /// \returns the position of the first preset in the collection + PresetIterator begin(); + + /// An STL-esque iterator to retrieve an end position from a directory + /// \returns the end position of the collection + PresetIterator end() const; + + /// Perform a weighted sample to select a preset (uses preset rating values) + /// \returns an iterator to the randomly selected preset + iterator weightedRandom() const; + + /// True if no presets in directory + bool empty() const; + + + inline void nextPreset(PresetIterator & presetPos); + +private: + + const PresetLoader * m_presetLoader; +}; + + +inline PresetChooser::PresetChooser(const PresetLoader & presetLoader):m_presetLoader(&presetLoader) {} + +inline std::size_t PresetChooser::getNumPresets() const { + return m_presetLoader->getNumPresets(); +} + +inline void PresetIterator::setChooser(const PresetChooser & chooser) { + m_presetChooser = &chooser; +} + +inline std::size_t PresetIterator::operator*() const { + return m_currentIndex; +} + +inline PresetIterator::PresetIterator(std::size_t start):m_currentIndex(start) {} + +inline void PresetIterator::operator++() { + assert(m_currentIndex < m_presetChooser->getNumPresets()); + m_currentIndex++; +} + +inline void PresetIterator::operator--() { + assert(m_currentIndex > 0); + m_currentIndex--; +} + +inline bool PresetIterator::operator !=(const PresetIterator & presetPos) const { + return (*presetPos != **this); +} + + +inline bool PresetIterator::operator ==(const PresetIterator & presetPos) const { + return (*presetPos == **this); +} + +inline std::unique_ptr PresetIterator::allocate( PresetInputs & presetInputs, PresetOutputs & presetOutputs) { + return m_presetChooser->directoryIndex(m_currentIndex, presetInputs, presetOutputs); +} + +inline void PresetChooser::nextPreset(PresetIterator & presetPos) { + + if (this->empty()) { + return; + } + + // Case: idle preset currently running, selected first preset of chooser + else if (presetPos == this->end()) + presetPos = this->begin(); + else + ++(presetPos); + + // Case: already at last preset, loop to beginning + if (((presetPos) == this->end())) { + presetPos = this->begin(); + } + +} + +inline PresetIterator PresetChooser::begin() { + PresetIterator pos(0); + pos.setChooser(*this); + return pos; +} + +inline PresetIterator PresetChooser::begin(unsigned int index) const{ + PresetIterator pos(index); + pos.setChooser(*this); + return pos; +} + +inline PresetIterator PresetChooser::end() const { + PresetIterator pos(m_presetLoader->getNumPresets()); + pos.setChooser(*this); + return pos; +} + + +inline bool PresetChooser::empty() const { + return m_presetLoader->getNumPresets() == 0; +} + +inline std::unique_ptr PresetChooser::directoryIndex(std::size_t index, PresetInputs & presetInputs, + PresetOutputs & presetOutputs) const { + + return m_presetLoader->loadPreset(index, presetInputs, presetOutputs); +} + + +inline PresetChooser::iterator PresetChooser::weightedRandom() const { + std::size_t index = RandomNumberGenerators::weightedRandom + (m_presetLoader->getPresetRatings(), m_presetLoader->getPresetRatingsSum()); + return begin(index); +} + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Preset.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Preset.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Preset.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Preset.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,544 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ + +#include +#include +#include +#include +#ifdef WIN32 +#include "win32-dirent.h" +#else +#include +#endif /** WIN32 */ +#include + +#include "Preset.hpp" +#include "Parser.hpp" +#include "ParamUtils.hpp" +#include "InitCondUtils.hpp" +#include "fatal.h" +#include +#include + +Preset::Preset(std::istream & in, const std::string & presetName, PresetInputs & presetInputs, PresetOutputs & presetOutputs): + builtinParams(presetInputs, presetOutputs), + m_presetName(presetName), + m_presetOutputs(presetOutputs), + m_presetInputs(presetInputs) +{ + + m_presetOutputs.customWaves.clear(); + m_presetOutputs.customShapes.clear(); + + initialize(in); + +} + + +Preset::Preset(const std::string & absoluteFilePath, const std::string & presetName, PresetInputs & presetInputs, PresetOutputs & presetOutputs): + builtinParams(presetInputs, presetOutputs), + m_absoluteFilePath(absoluteFilePath), + m_presetName(presetName), + m_presetOutputs(presetOutputs), + m_presetInputs(presetInputs) +{ + + m_presetOutputs.customWaves.clear(); + m_presetOutputs.customShapes.clear(); + + initialize(absoluteFilePath); + +} + +Preset::~Preset() +{ + + Algorithms::traverse >(init_cond_tree); + + Algorithms::traverse >(per_frame_init_eqn_tree); + + Algorithms::traverse >(per_pixel_eqn_tree); + + Algorithms::traverseVector >(per_frame_eqn_tree); + + Algorithms::traverse >(user_param_tree); + + for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos) + { + delete(*pos); + } + + for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos) + { + delete(*pos); + } + +} + +/* Adds a per pixel equation according to its string name. This + will be used only by the parser */ + +int Preset::add_per_pixel_eqn(char * name, GenExpr * gen_expr) +{ + + PerPixelEqn * per_pixel_eqn = NULL; + int index; + Param * param = NULL; + + assert(gen_expr); + assert(name); + + if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: per pixel equation (name = \"%s\")\n", name); + + + /* Search for the parameter so we know what matrix the per pixel equation is referencing */ + + param = ParamUtils::find(name, &this->builtinParams, &this->user_param_tree); + if ( !param ) + { + if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: failed to allocate a new parameter!\n"); + return PROJECTM_FAILURE; + } + + index = per_pixel_eqn_tree.size(); + + /* Create the per pixel equation given the index, parameter, and general expression */ + if ((per_pixel_eqn = new PerPixelEqn(index, param, gen_expr)) == NULL) + { + if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: failed to create new per pixel equation!\n"); + return PROJECTM_FAILURE; + } + + + + + /* Insert the per pixel equation into the preset per pixel database */ + std::pair::iterator, bool> inserteeOption = per_pixel_eqn_tree.insert + (std::make_pair(per_pixel_eqn->index, per_pixel_eqn)); + + if (!inserteeOption.second) + { + printf("failed to add per pixel eqn!\n"); + delete(per_pixel_eqn); + return PROJECTM_FAILURE; + } + + /* Done */ + return PROJECTM_SUCCESS; +} + +void Preset::evalCustomShapeInitConditions() +{ + + for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos) { + assert(*pos); + (*pos)->evalInitConds(); + } +} + + +void Preset::evalCustomWaveInitConditions() +{ + + for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos) { + assert(*pos); + (*pos)->evalInitConds(); +} +} + + +void Preset::evalCustomWavePerFrameEquations() +{ + + for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos) + { + + std::map & init_cond_tree = (*pos)->init_cond_tree; + for (std::map::iterator _pos = init_cond_tree.begin(); _pos != init_cond_tree.end(); ++_pos) + { + assert(_pos->second); + _pos->second->evaluate(); + } + + std::vector & per_frame_eqn_tree = (*pos)->per_frame_eqn_tree; + for (std::vector::iterator _pos = per_frame_eqn_tree.begin(); _pos != per_frame_eqn_tree.end(); ++_pos) + { + (*_pos)->evaluate(); + } + } + +} + +void Preset::evalCustomShapePerFrameEquations() +{ + + for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos) + { + + std::map & init_cond_tree = (*pos)->init_cond_tree; + for (std::map::iterator _pos = init_cond_tree.begin(); _pos != init_cond_tree.end(); ++_pos) + { + assert(_pos->second); + _pos->second->evaluate(); + } + + std::vector & per_frame_eqn_tree = (*pos)->per_frame_eqn_tree; + for (std::vector::iterator _pos = per_frame_eqn_tree.begin(); _pos != per_frame_eqn_tree.end(); ++_pos) + { + (*_pos)->evaluate(); + } + } + +} + +void Preset::evalPerFrameInitEquations() +{ + + for (std::map::iterator pos = per_frame_init_eqn_tree.begin(); pos != per_frame_init_eqn_tree.end(); ++pos) + { + assert(pos->second); + pos->second->evaluate(); + } + +} + +void Preset::evalPerFrameEquations() +{ + + for (std::map::iterator pos = init_cond_tree.begin(); pos != init_cond_tree.end(); ++pos) + { + assert(pos->second); + pos->second->evaluate(); + } + + for (std::vector::iterator pos = per_frame_eqn_tree.begin(); pos != per_frame_eqn_tree.end(); ++pos) + { + (*pos)->evaluate(); + } + +} + +void Preset::preloadInitialize() { + + /// @note commented this out because it should be unnecessary + // Clear equation trees + //init_cond_tree.clear(); + //user_param_tree.clear(); + //per_frame_eqn_tree.clear(); + //per_pixel_eqn_tree.clear(); + //per_frame_init_eqn_tree.clear(); + + +} + +void Preset::postloadInitialize() { + + /* It's kind of ugly to reset these values here. Should definitely be placed in the parser somewhere */ + this->per_frame_eqn_count = 0; + this->per_frame_init_eqn_count = 0; + + this->loadBuiltinParamsUnspecInitConds(); + this->loadCustomWaveUnspecInitConds(); + this->loadCustomShapeUnspecInitConds(); + + +/// @bug are you handling all the q variables conditions? in particular, the un-init case? +//m_presetOutputs.q1 = 0; +//m_presetOutputs.q2 = 0; +//m_presetOutputs.q3 = 0; +//m_presetOutputs.q4 = 0; +//m_presetOutputs.q5 = 0; +//m_presetOutputs.q6 = 0; +//m_presetOutputs.q7 = 0; +//m_presetOutputs.q8 = 0; + +} + +void Preset::initialize(const std::string & pathname) +{ + int retval; + + preloadInitialize(); + +if (PRESET_DEBUG) + std::cerr << "[Preset] loading file \"" << pathname << "\"..." << std::endl; + + if ((retval = loadPresetFile(pathname)) < 0) + { +if (PRESET_DEBUG) + std::cerr << "[Preset] failed to load file \"" << + pathname << "\"!" << std::endl; + + /// @bug how should we handle this problem? a well define exception? + throw retval; + } + + postloadInitialize(); +} + +void Preset::initialize(std::istream & in) +{ + int retval; + + preloadInitialize(); + + if ((retval = readIn(in)) < 0) + { + + if (PRESET_DEBUG) + std::cerr << "[Preset] failed to load from stream " << std::endl; + + /// @bug how should we handle this problem? a well define exception? + throw retval; + } + + postloadInitialize(); +} + +void Preset::loadBuiltinParamsUnspecInitConds() { + + InitCondUtils::LoadUnspecInitCond loadUnspecInitCond(this->init_cond_tree, this->per_frame_init_eqn_tree); + + this->builtinParams.traverse(loadUnspecInitCond); + Algorithms::traverse(user_param_tree, loadUnspecInitCond); + +} + +void Preset::loadCustomWaveUnspecInitConds() +{ + + + for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos) + { + assert(*pos); + (*pos)->loadUnspecInitConds(); + } + +} + +void Preset::loadCustomShapeUnspecInitConds() +{ + + for (PresetOutputs::cshape_container::iterator pos = customShapes.begin(); pos != customShapes.end(); ++pos) + { + assert(*pos); + (*pos)->loadUnspecInitConds(); + } +} + + +void Preset::evaluateFrame() +{ + + // Evaluate all equation objects according to milkdrop flow diagram + + evalPerFrameInitEquations(); + + evalPerFrameEquations(); + + + // Important step to ensure custom shapes and waves don't stamp on the q variable values + // calculated by the per frame (init) and per pixel equations. + transfer_q_variables(customWaves); + transfer_q_variables(customShapes); + + initialize_PerPixelMeshes(); + + evalPerPixelEqns(); + + evalCustomWaveInitConditions(); + evalCustomWavePerFrameEquations(); + + evalCustomShapeInitConditions(); + evalCustomShapePerFrameEquations(); + + // Setup pointers of the custom waves and shapes to the preset outputs instance + /// @slow an extra O(N) per frame, could do this during eval + m_presetOutputs.customWaves = PresetOutputs::cwave_container(customWaves); + m_presetOutputs.customShapes = PresetOutputs::cshape_container(customShapes); + +} + +void Preset::initialize_PerPixelMeshes() +{ + + int x,y; + for (x=0;x::iterator pos = per_pixel_eqn_tree.begin(); + pos != per_pixel_eqn_tree.end(); ++pos) + pos->second->evaluate(mesh_x, mesh_y); + +} + +int Preset::readIn(std::istream & fs) { + + line_mode_t line_mode; + + /* Parse any comments */ + if (Parser::parse_top_comment(fs) < 0) + { + if (PRESET_DEBUG) + std::cerr << "[Preset::readIn] no left bracket found..." << std::endl; + return PROJECTM_FAILURE; + } + + /* Parse the preset name and a left bracket */ + char tmp_name[MAX_TOKEN_SIZE]; + + if (Parser::parse_preset_name(fs, tmp_name) < 0) + { + std::cerr << "[Preset::readIn] loading of preset name failed" << std::endl; + return PROJECTM_ERROR; + } + + /// @note We ignore the preset name because [preset00] is just not so useful + + // Loop through each line in file, trying to succesfully parse the file. + // If a line does not parse correctly, keep trucking along to next line. + int retval; + while ((retval = Parser::parse_line(fs, this)) != EOF) + { + if (retval == PROJECTM_PARSE_ERROR) + { + line_mode = UNSET_LINE_MODE; + // std::cerr << "[Preset::readIn()] parse error in file \"" << this->absoluteFilePath() << "\"" << std::endl; + } + } + +// std::cerr << "loadPresetFile: finished line parsing successfully" << std::endl; + + /* Now the preset has been loaded. + Evaluation calls can be made at appropiate + times in the frame loop */ + +return PROJECTM_SUCCESS; +} + +/* loadPresetFile: private function that loads a specific preset denoted + by the given pathname */ +int Preset::loadPresetFile(const std::string & pathname) +{ + /* Open the file corresponding to pathname */ + FILE* f = fopen(pathname.c_str(), "r"); + if (!f) { + if (PRESET_DEBUG) + std::cerr << "loadPresetFile: loading of file \"" << pathname << "\" failed!\n"; + return PROJECTM_ERROR; + } + + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + rewind(f); + std::vector buffer(fsize); + + int err = fread(&buffer[0], 1, fsize, f); + if (!err) + { + printf("read failed\n"); + fclose(f); + return PROJECTM_ERROR; + } + + fclose(f); + std::stringstream stream; + stream.rdbuf()->pubsetbuf(&buffer[0],buffer.size()); + return readIn(stream); +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetFrameIO.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetFrameIO.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetFrameIO.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetFrameIO.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,249 @@ +#include "PresetFrameIO.hpp" +#include "wipemalloc.h" +#include +#include +#include +PresetInputs::PresetInputs() +{ +} + +void PresetInputs::Initialize ( int gx, int gy ) +{ + int x, y; + + this->gx =gx; + this->gy= gy; + + this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->rad_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->rad_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->theta_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x theta_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + + this->origtheta= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->origtheta[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->origrad= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->origrad[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->origx= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->origx[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->origy= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->origy[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + + for ( x=0;xorigx[x][y]=x/ ( float ) ( gx-1 ); + this->origy[x][y]=- ( ( y/ ( float ) ( gy-1 ) )-1 ); + this->origrad[x][y]=hypot ( ( this->origx[x][y]-.5 ) *2, ( this->origy[x][y]-.5 ) *2 ) * .7071067; + this->origtheta[x][y]=atan2 ( ( ( this->origy[x][y]-.5 ) *2 ), ( ( this->origx[x][y]-.5 ) *2 ) ); + } + } + + + +} + +PresetOutputs::PresetOutputs() +{} + +PresetOutputs::~PresetOutputs() +{ + assert(this->gx > 0); + + for ( int x = 0; x < this->gx; x++ ) + { + + + free(this->x_mesh[x]); + free(this->y_mesh[x]); + free(this->sx_mesh[x]); + free(this->sy_mesh[x]); + free(this->dy_mesh[x]); + free(this->dx_mesh[x]); + free(this->cy_mesh[x]); + free(this->cx_mesh[x]); + + free(this->warp_mesh[x]); + free(this->zoom_mesh[x]); + free(this->zoomexp_mesh[x]); + free(this->rot_mesh[x]); + + } + + free(this->x_mesh); + free(this->y_mesh); + free(this->sx_mesh); + free(this->sy_mesh); + free(this->dy_mesh); + free(this->dx_mesh); + free(this->cy_mesh); + free(this->cx_mesh); + free(this->warp_mesh); + free(this->zoom_mesh); + free(this->zoomexp_mesh); + free(this->rot_mesh); +} + +void PresetOutputs::Initialize ( int gx, int gy ) +{ + + assert(gx > 0); + this->gx = gx; + this->gy= gy; + assert(this->gx > 0); + int x; + this->x_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->x_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->y_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->y_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->sx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->sx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->sy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->sy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->dx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->dx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->dy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->dy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->cx_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->cx_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->cy_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->cy_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->zoom_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->zoom_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->zoomexp_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->zoomexp_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + this->rot_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->rot_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + + this->warp_mesh= ( float ** ) wipemalloc ( gx * sizeof ( float * ) ); + for ( x = 0; x < gx; x++ ) + { + this->warp_mesh[x] = ( float * ) wipemalloc ( gy * sizeof ( float ) ); + } + + +} + +PresetInputs::~PresetInputs() +{ + for ( int x = 0; x < this->gx; x++ ) + { + + + free ( this->origtheta[x] ); + free ( this->origrad[x] ); + free ( this->origx[x] ); + free ( this->origy[x] ); + + free ( this->x_mesh[x] ); + free ( this->y_mesh[x] ); + free ( this->rad_mesh[x] ); + free ( this->theta_mesh[x] ); + + } + + + free ( this->origx ); + free ( this->origy ); + free ( this->origrad ); + free ( this->origtheta ); + + free ( this->x_mesh ); + free ( this->y_mesh ); + free ( this->rad_mesh ); + free ( this->theta_mesh ); + + this->origx = NULL; + this->origy = NULL; + this->origtheta = NULL; + this->origrad = NULL; + + this->x_mesh = NULL; + this->y_mesh = NULL; + this->rad_mesh = NULL; + this->theta_mesh = NULL; +} + + +void PresetInputs::ResetMesh() +{ + int x,y; + + assert ( x_mesh ); + assert ( y_mesh ); + assert ( rad_mesh ); + assert ( theta_mesh ); + + for ( x=0;xgx;x++ ) + { + for ( y=0;ygy;y++ ) + { + x_mesh[x][y]=this->origx[x][y]; + y_mesh[x][y]=this->origy[x][y]; + rad_mesh[x][y]=this->origrad[x][y]; + theta_mesh[x][y]=this->origtheta[x][y]; + } + } + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetFrameIO.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetFrameIO.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetFrameIO.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetFrameIO.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,194 @@ +#ifndef PRESET_FRAME_IO_HPP +#define PRESET_FRAME_IO_HPP +#include +class CustomWave; +class CustomShape; + + +/// Container class for all preset writeable engine variables. This is the important glue +/// between the presets and renderer to facilitate smooth preset switching +/// Every preset object needs a reference to one of these. +class PresetOutputs { +public: + typedef std::vector cwave_container; + typedef std::vector cshape_container; + + cwave_container customWaves; + cshape_container customShapes; + + void Initialize(int gx, int gy); + PresetOutputs(); + ~PresetOutputs(); + /* PER FRAME VARIABLES BEGIN */ + float zoom; + float zoomexp; + float rot; + float warp; + + float sx; + float sy; + float dx; + float dy; + float cx; + float cy; + + float decay; + + float wave_r; + float wave_g; + float wave_b; + float wave_o; + float wave_x; + float wave_y; + float wave_mystery; + + float ob_size; + float ob_r; + float ob_g; + float ob_b; + float ob_a; + + float ib_size; + float ib_r; + float ib_g; + float ib_b; + float ib_a; + + float mv_a ; + float mv_r ; + float mv_g ; + float mv_b ; + float mv_l; + float mv_x; + float mv_y; + float mv_dy; + float mv_dx; + + int gy,gx; + /* PER_FRAME VARIABLES END */ + + float fRating; + float fGammaAdj; + float fVideoEchoZoom; + float fVideoEchoAlpha; + + int nVideoEchoOrientation; + int nWaveMode; + + bool bAdditiveWaves; + bool bWaveDots; + bool bWaveThick; + bool bModWaveAlphaByVolume; + bool bMaximizeWaveColor; + bool bTexWrap; + bool bDarkenCenter; + bool bRedBlueStereo; + bool bBrighten; + bool bDarken; + bool bSolarize; + bool bInvert; + bool bMotionVectorsOn; + + + float fWaveAlpha ; + float fWaveScale; + float fWaveSmoothing; + float fWaveParam; + float fModWaveAlphaStart; + float fModWaveAlphaEnd; + float fWarpAnimSpeed; + float fWarpScale; + float fShader; + + /* Q VARIABLES START */ + + float q1; + float q2; + float q3; + float q4; + float q5; + float q6; + float q7; + float q8; + + + /* Q VARIABLES END */ + + float **zoom_mesh; + float **zoomexp_mesh; + float **rot_mesh; + + float **sx_mesh; + float **sy_mesh; + float **dx_mesh; + float **dy_mesh; + float **cx_mesh; + float **cy_mesh; + float **warp_mesh; + + + float **x_mesh; + float **y_mesh; + + float wavearray[2048][2]; + float wavearray2[2048][2]; + + int wave_samples; + bool two_waves; + bool draw_wave_as_loop; + double wave_rot; + double wave_scale; + + +}; + +/// Container for all *read only* engine variables a preset requires to +/// evaluate milkdrop equations. Every preset object needs a reference to one of these. +class PresetInputs { + +public: + /* PER_PIXEL VARIBLES BEGIN */ + + float x_per_pixel; + float y_per_pixel; + float rad_per_pixel; + float ang_per_pixel; + + /* PER_PIXEL VARIBLES END */ + + int fps; + + + float time; + float bass; + float mid; + float treb; + float bass_att; + float mid_att; + float treb_att; + int frame; + float progress; + + + /* variables were added in milkdrop 1.04 */ + int gx,gy; + + float **x_mesh; + float **y_mesh; + float **rad_mesh; + float **theta_mesh; + + float **origtheta; //grid containing interpolated mesh reference values + float **origrad; + float **origx; //original mesh + float **origy; + + float mood_r, mood_g, mood_b; + + void ResetMesh(); + ~PresetInputs(); + PresetInputs(); + void Initialize(int gx, int gy); +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Preset.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Preset.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Preset.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Preset.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,248 @@ + +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id$ + * + * Preset + * + * $Log$ + */ + +#ifndef _PRESET_HPP +#define _PRESET_HPP + +#include "Common.hpp" +#include +#include +#include + +#define PRESET_DEBUG 0 /* 0 for no debugging, 1 for normal, 2 for insane */ + +#include "CustomShape.hpp" +#include "CustomWave.hpp" +#include "Expr.hpp" +#include "PerPixelEqn.hpp" +#include "PerFrameEqn.hpp" +#include "BuiltinParams.hpp" +#include "PresetFrameIO.hpp" +#include "InitCond.hpp" + +class CustomWave; +class CustomShape; +class InitCond; + + +class Preset +{ +protected: + +public: + + + /// Load a preset by filename with input and output buffers specified. + /// \param absoluteFilePath the absolute file path of a preset to load from the file system + /// \param presetName a descriptive name for the preset. Usually just the file name + /// \param presetInputs a reference to read only projectM engine variables + /// \param presetOutputs initialized and filled with data parsed from a preset + Preset(const std::string & absoluteFilePath, const std::string & presetName, PresetInputs & presetInputs, PresetOutputs & presetOutputs); + + /// Load a preset from an input stream with input and output buffers specified. + /// \param in an already initialized input stream to read the preset file from + /// \param presetName a descriptive name for the preset. Usually just the file name + /// \param presetInputs a reference to read only projectM engine variables + /// \param presetOutputs initialized and filled with data parsed from a preset + Preset(std::istream & in, const std::string & presetName, PresetInputs & presetInputs, PresetOutputs & presetOutputs); + + ~Preset(); + + /// Evaluates the preset for a frame given the current values of preset inputs / outputs + /// All calculated values are stored in the associated preset outputs instance + void evaluateFrame(); + + /// All "builtin" parameters for this preset. Anything *but* user defined parameters and + /// custom waves / shapes objects go here. + /// @bug encapsulate + BuiltinParams builtinParams; + + + /// Used by parser to find/create custom waves and shapes. May be refactored + template + static CustomObject * find_custom_object(int id, std::vector & customObjects); + + + int per_pixel_eqn_string_index; + int per_frame_eqn_string_index; + int per_frame_init_eqn_string_index; + + int per_frame_eqn_count, + per_frame_init_eqn_count; + + + /// Used by parser + /// @bug refactor + int add_per_pixel_eqn( char *name, GenExpr *gen_expr ); + + /// Accessor method to retrieve the absolute file path of the loaded preset + /// \returns a file path string + std::string absoluteFilePath() const + { + return m_absoluteFilePath; + } + + + /// Accessor method for the preset outputs instance associated with this preset + /// \returns A preset output instance with values computed from most recent evaluateFrame() + PresetOutputs & presetOutputs() const + { + + return m_presetOutputs; + } + + PresetInputs & presetInputs() const + { + + return m_presetInputs; + } + /// Sets the descriptive name for this preset (typically the file name) + /// \param theValue the new preset name to assign to the preset + void setPresetName ( const std::string& theValue ) + { + m_presetName = theValue; + } + + + /// Gets the descriptive name for this preset (typically the file name) + /// \returns the name of the preset + std::string presetName() const + { + return m_presetName; + } + + + /// @bug encapsulate + + PresetOutputs::cwave_container customWaves; + PresetOutputs::cshape_container customShapes; + + /// @bug encapsulate + /* Data structures that contain equation and initial condition information */ + std::vector per_frame_eqn_tree; /* per frame equations */ + std::map per_pixel_eqn_tree; /* per pixel equation tree */ + std::map per_frame_init_eqn_tree; /* per frame initial equations */ + std::map init_cond_tree; /* initial conditions */ + std::map user_param_tree; /* user parameter splay tree */ + +private: + + // The absolute file path of the preset + std::string m_absoluteFilePath; + + // The absolute path of the preset + std::string m_absolutePath; + + // The name for the preset. Usually the file name, but in theory anything goes + std::string m_presetName; + + void initialize(const std::string & pathname); + void initialize(std::istream & in); + + int loadPresetFile(const std::string & pathname); + + void loadBuiltinParamsUnspecInitConds(); + void loadCustomWaveUnspecInitConds(); + void loadCustomShapeUnspecInitConds(); + + void evalCustomWavePerFrameEquations(); + void evalCustomShapePerFrameEquations(); + void evalPerFrameInitEquations(); + void evalCustomWaveInitConditions(); + void evalCustomShapeInitConditions(); + void evalPerPixelEqns(); + void evalPerFrameEquations(); + void initialize_PerPixelMeshes(); + int readIn(std::istream & fs); + + void preloadInitialize(); + void postloadInitialize(); + + PresetOutputs & m_presetOutputs; + PresetInputs & m_presetInputs; // added for gx, gy reference. + +template +void transfer_q_variables(std::vector & customObjects); +}; + + +template +void Preset::transfer_q_variables(std::vector & customObjects) +{ + CustomObject * custom_object; + + for (typename std::vector::iterator pos = customObjects.begin(); pos != customObjects.end();++pos) { + + custom_object = *pos; + custom_object->q1 = m_presetOutputs.q1; + custom_object->q2 = m_presetOutputs.q2; + custom_object->q3 = m_presetOutputs.q3; + custom_object->q4 = m_presetOutputs.q4; + custom_object->q5 = m_presetOutputs.q5; + custom_object->q6 = m_presetOutputs.q6; + custom_object->q7 = m_presetOutputs.q7; + custom_object->q8 = m_presetOutputs.q8; + } + + +} + +template +CustomObject * Preset::find_custom_object(int id, std::vector & customObjects) +{ + + CustomObject * custom_object = NULL; + + + for (typename std::vector::iterator pos = customObjects.begin(); pos != customObjects.end();++pos) { + if ((*pos)->id == id) { + custom_object = *pos; + break; + } + } + + if (custom_object == NULL) + { + + if ((custom_object = new CustomObject(id)) == NULL) + { + return NULL; + } + + customObjects.push_back(custom_object); + + } + + assert(custom_object); + return custom_object; +} + + + +#endif /** !_PRESET_HPP */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetLoader.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetLoader.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetLoader.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetLoader.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,246 @@ +// +// C++ Implementation: PresetLoader +// +// Description: +// +// +// Author: Carmelo Piccione , (C) 2007 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "PresetLoader.hpp" +#include "Preset.hpp" +#include +#include +#include + +#ifdef LINUX +extern "C" +{ +#include +} +#endif + +#ifdef MACOS +extern "C" +{ +#include +} +#endif + +#include +#include "fatal.h" + +const std::string PresetLoader::PROJECTM_FILE_EXTENSION(".prjm"); +const std::string PresetLoader::MILKDROP_FILE_EXTENSION(".milk"); + +PresetLoader::PresetLoader(std::string dirname) :m_dirname(dirname), m_dir(0), m_ratingsSum(0) +{ + // Do one scan + if (m_dirname != std::string()) + rescan(); +} + +PresetLoader::~PresetLoader() +{ + if (m_dir) + closedir(m_dir); +} + +void PresetLoader::setScanDirectory(std::string dirname) +{ + m_dirname = dirname; +} + + +void PresetLoader::rescan() +{ + // std::cerr << "Rescanning..." << std::endl; + + // Clear the directory entry collection + m_entries.clear(); + m_presetNames.clear(); + m_ratings.clear(); + m_ratingsSum = 0; + // If directory already opened, close it first + if (m_dir) + { + closedir(m_dir); + m_dir = 0; + } + + // Allocate a new a stream given the current directory name + if ((m_dir = opendir(m_dirname.c_str())) == NULL) + { + handleDirectoryError(); + return; // no files loaded. m_entries is empty + } + + struct dirent * dir_entry; + std::set alphaSortedFileSet; + std::set alphaSortedPresetNameSet; + + while ((dir_entry = readdir(m_dir)) != NULL) + { + + std::ostringstream out; + // Convert char * to friendly string + std::string filename(dir_entry->d_name); + + // Verify extension is projectm or milkdrop + if ((filename.rfind(PROJECTM_FILE_EXTENSION) != (filename.length() - PROJECTM_FILE_EXTENSION.length())) + && (filename.rfind(MILKDROP_FILE_EXTENSION) != (filename.length() - MILKDROP_FILE_EXTENSION.length()))) + continue; + + if (filename.length() <= MILKDROP_FILE_EXTENSION.length()) + continue; + + if (filename.length() > 0 && filename[0] == '.') + continue; + + // Create full path name + out << m_dirname << PATH_SEPARATOR << filename; + + // Add to our directory entry collection + alphaSortedFileSet.insert(out.str()); + alphaSortedPresetNameSet.insert(filename); + + // the directory entry struct is freed elsewhere + } + + // Push all entries in order from the file set to the file entries member (which is an indexed vector) + for (std::set::iterator pos = alphaSortedFileSet.begin(); + pos != alphaSortedFileSet.end();++pos) + m_entries.push_back(*pos); + + // Push all preset names in similar fashion + for (std::set::iterator pos = alphaSortedPresetNameSet.begin(); + pos != alphaSortedPresetNameSet.end();++pos) + m_presetNames.push_back(*pos); + + // Give all presets equal rating of 3 - why 3? I don't know + m_ratings = std::vector(m_presetNames.size(), 3); + m_ratingsSum = 3 * m_ratings.size(); + + assert(m_entries.size() == m_presetNames.size()); + assert(m_ratings.size() == m_entries.size()); + + +} + + +std::unique_ptr PresetLoader::loadPreset(unsigned int index, PresetInputs & presetInputs, PresetOutputs & presetOutputs) const +{ + + // Check that index isn't insane + assert(index >= 0); + assert(index < m_entries.size()); + + // Return a new autopointer to a preset + return std::unique_ptr(new Preset(m_entries[index], m_presetNames[index], presetInputs, presetOutputs)); +} + +void PresetLoader::handleDirectoryError() +{ + +#ifdef WIN32 + std::cerr << "[PresetLoader] warning: errno unsupported on win32 platforms. fix me" << std::endl; +#else + + switch (errno) + { + case ENOENT: + std::cerr << "[PresetLoader] ENOENT error. The path \"" << this->m_dirname << "\" probably does not exist. \"man open\" for more info." << std::endl; + break; + case ENOMEM: + std::cerr << "[PresetLoader] out of memory! Are you running Windows?" << std::endl; + abort(); + case ENOTDIR: + std::cerr << "[PresetLoader] directory specified is not a preset directory! Trying to continue..." << std::endl; + break; + case ENFILE: + std::cerr << "[PresetLoader] Your system has reached its open file limit. Trying to continue..." << std::endl; + break; + case EMFILE: + std::cerr << "[PresetLoader] too many files in use by projectM! Bailing!" << std::endl; + break; + case EACCES: + std::cerr << "[PresetLoader] permissions issue reading the specified preset directory." << std::endl; + break; + default: + break; + } +#endif +} + +void PresetLoader::setRating(unsigned int index, int rating) { + assert(index >=0); + assert(index < m_ratings.size()); + + m_ratingsSum -= m_ratings[index]; + m_ratings[index] = rating; + m_ratingsSum += rating; + + assert(m_entries.size() == m_presetNames.size()); + assert(m_ratings.size() == m_entries.size()); + +} + +unsigned int PresetLoader::addPresetURL(const std::string & url, const std::string & presetName, int rating) { + m_entries.push_back(url); + m_presetNames.push_back(presetName); + m_ratings.push_back(rating); + m_ratingsSum += rating; + + assert(m_entries.size() == m_presetNames.size()); + assert(m_ratings.size() == m_entries.size()); + + return m_entries.size()-1; +} + +void PresetLoader::removePreset(unsigned int index) { + + m_entries.erase(m_entries.begin()+index); + m_presetNames.erase(m_presetNames.begin()+index); + m_ratingsSum -= m_ratings[index]; + m_ratings.erase(m_ratings.begin()+index); + + assert(m_entries.size() == m_presetNames.size()); + assert(m_ratings.size() == m_entries.size()); + +} + +const std::string & PresetLoader::getPresetURL ( unsigned int index) const { + return m_entries[index]; +} + +const std::string & PresetLoader::getPresetName ( unsigned int index) const { + return m_presetNames[index]; +} + +int PresetLoader::getPresetRating ( unsigned int index) const { + return m_ratings[index]; +} + + +const std::vector & PresetLoader::getPresetRatings () const { + return m_ratings; +} + + +int PresetLoader::getPresetRatingsSum () const { + return m_ratingsSum; +} + +void PresetLoader::insertPresetURL(unsigned int index, const std::string & url, const std::string & presetName, int rating) +{ + m_entries.insert(m_entries.begin()+index, url); + m_presetNames.insert(m_presetNames.begin() + index, presetName); + m_ratings.insert(m_ratings.begin()+index, rating); + m_ratingsSum += rating; + + assert(m_entries.size() == m_presetNames.size()); + assert(m_ratings.size() == m_entries.size()); + +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetLoader.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetLoader.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetLoader.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetLoader.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,106 @@ +#ifndef __PRESET_LOADER_HPP +#define __PRESET_LOADER_HPP + +#include // used for path / filename stuff + +#include // for auto pointers +#include +#ifdef WIN32 +#include "win32-dirent.h" +#endif + +#ifdef LINUX +#include +#endif + +#ifdef MACOS +#include +#endif + +#include + +class Preset; +class PresetInputs; +class PresetOutputs; + +class PresetLoader { + public: + static const std::string PROJECTM_FILE_EXTENSION; + static const std::string MILKDROP_FILE_EXTENSION; + + /** Initializes the preset loader with the target directory specified */ + PresetLoader(std::string dirname = std::string()); + + /** Destructor will remove all alllocated presets */ + ~PresetLoader(); + + /** Load a preset by specifying a filename of the directory (that is, NOT full path) */ + /** Autopointers: when you take it, I leave it */ + std::unique_ptr loadPreset(unsigned int index, PresetInputs & presetInputs, + PresetOutputs & presetOutputs) const; + + /// Add a preset to the loader's collection. + /// \param url an url referencing the preset + /// \param presetName a name for the preset + /// \param rating an integer representing the goodness of the preset + /// \returns The unique index assigned to the preset in the collection. Used with loadPreset + unsigned int addPresetURL ( const std::string & url, const std::string & presetName, int rating); + + + /// Add a preset to the loader's collection. + /// \param index insertion index + /// \param url an url referencing the preset + /// \param presetName a name for the preset + /// \param rating an integer representing the goodness of the preset + void insertPresetURL (unsigned int index, const std::string & url, const std::string & presetName, int rating); + + /// Clears all presets from the collection + inline void clear() { m_entries.clear(); m_presetNames.clear(); m_ratings.clear(); m_ratingsSum = 0; } + + const std::vector & getPresetRatings() const; + int getPresetRatingsSum() const; + + void removePreset(unsigned int index); + + void setRating(unsigned int index, int rating); + + /// Get a preset rating given an index + int getPresetRating ( unsigned int index) const; + + /// Get a preset url given an index + const std::string & getPresetURL ( unsigned int index) const; + + /// Get a preset name given an index + const std::string & getPresetName ( unsigned int index) const; + + /** Returns the number of presets in the active directory */ + inline std::size_t getNumPresets() const { + return m_entries.size(); + } + + /** Sets the directory where the loader will search for files */ + void setScanDirectory(std::string pathname); + + /// Returns the directory path associated with this preset chooser + inline const std::string & directoryName() const { + return m_dirname; + } + + /** Rescans the active preset directory */ + void rescan(); + + private: + void handleDirectoryError(); + std::string m_dirname; + DIR * m_dir; + + int m_ratingsSum; + + // vector chosen for speed, but not great for reverse index lookups + std::vector m_entries; + std::vector m_presetNames; + std::vector m_ratings; + +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetMerge.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetMerge.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetMerge.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetMerge.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,192 @@ +#include "PresetMerge.hpp" + +#include + +void PresetMerger::MergePresets(PresetOutputs & A, PresetOutputs & B, double ratio, int gx, int gy) +{ + +double invratio = 1.0 - ratio; + //Merge Simple Waveforms + // + // All the mess is because of Waveform 7, which is two lines. + // + A.wave_rot = A.wave_rot* invratio + B.wave_rot*ratio; + A.wave_scale = A.wave_scale* invratio + B.wave_scale*ratio; + + if (!B.draw_wave_as_loop) A.draw_wave_as_loop = false; + + if (A.two_waves && B.two_waves) + { + for (int x = 0; xa *= invratio; + (*pos)->a2 *= invratio; + (*pos)->border_a *= invratio; + } + + for (PresetOutputs::cshape_container::iterator pos = B.customShapes.begin(); + pos != B.customShapes.end(); ++pos) + { + (*pos)->a *= ratio; + (*pos)->a2 *= ratio; + (*pos)->border_a *= ratio; + + A.customShapes.push_back(*pos); + + } + for (PresetOutputs::cwave_container::iterator pos = A.customWaves.begin(); + pos != A.customWaves.end(); ++pos) + { + (*pos)->a *= invratio; + for (int x=0; x < (*pos)->samples; x++) + { + (*pos)->a_mesh[x]= (*pos)->a_mesh[x]*invratio; + } + } + + for (PresetOutputs::cwave_container::iterator pos = B.customWaves.begin(); + pos != B.customWaves.end(); ++pos) + { + (*pos)->a *= ratio; + for (int x=0; x < (*pos)->samples; x++) + { + (*pos)->a_mesh[x]= (*pos)->a_mesh[x]*ratio; + } + A.customWaves.push_back(*pos); + } + + + //Interpolate Per-Pixel mesh + + for (int x=0;x 0.5) + { + A.nVideoEchoOrientation = B.nVideoEchoOrientation; + A.nWaveMode = B.nWaveMode; + A.bAdditiveWaves = B.bAdditiveWaves; + A.bWaveDots = B.bWaveDots; + A.bWaveThick = B.bWaveThick; + A.bModWaveAlphaByVolume = B.bModWaveAlphaByVolume; + A.bMaximizeWaveColor = B.bMaximizeWaveColor; + A.bTexWrap = B.bTexWrap; + A.bDarkenCenter = B.bDarkenCenter; + A.bRedBlueStereo = B.bRedBlueStereo; + A.bBrighten = B.bBrighten; + A.bDarken = B.bDarken; + A.bSolarize = B.bSolarize; + A.bInvert = B.bInvert; + A.bMotionVectorsOn = B.bMotionVectorsOn; + } + + return; +} + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetMerge.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetMerge.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetMerge.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/PresetMerge.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,11 @@ +#ifndef PRESET_MERGE_HPP +#define PRESET_MERGE_HPP +#include "Preset.hpp" + +class PresetMerger +{ +public: + static void MergePresets(PresetOutputs & A, PresetOutputs & B, double ratio, int gx, int gy); +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Agitator.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Agitator.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Agitator.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Agitator.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.504000 +fDecay=0.900000 +fVideoEchoZoom=0.999592 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.311604 +fWaveSmoothing=0.450000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=0.010000 +fWarpScale=0.438651 +fZoomExponent=0.999994 +fShader=0.000000 +zoom=1.000156 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.990099 +sy=0.990099 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.100000 +ob_r=0.000000 +ob_g=0.600000 +ob_b=0.500000 +ob_a=0.100000 +ib_size=0.050000 +ib_r=0.000000 +ib_g=1.000000 +ib_b=1.000000 +ib_a=0.100000 +nMotionVectorsX=12.799995 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.5*sin(1.2*frame) + 0.3*sin(1.9*frame); +per_frame_2=wave_g = wave_g + 0.7*sin(1.1*frame) + 0.4*cos(1.6*frame); +per_frame_3=wave_b = wave_b + 0.2*sin(1.3*frame) + 0.4*sin(2*frame); +per_pixel_1=rot=rot + (0.5 + 0.1*sin(bass)-rad)*pow(bass,3)/50; +per_pixel_2=zoom= zoom + (0.5 + 0.3*tan(3*bass_att)-rad)*(cos(pow(rad,2.4))+(0.2*mid_att)); +per_pixel_3=warp = warp + if (above(bass,1.34), 0.5*(0.5+ 0.1*sin(bass)-rad)*(cos(pow(rad,2.4))+(5*bass_att)), 0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Aimless (Gravity Directive Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Aimless (Gravity Directive Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Aimless (Gravity Directive Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Aimless (Gravity Directive Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,75 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.611434 +fWaveSmoothing=0.000000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.900000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.12*sin(0.2*time) - 0.15*cos(0.1*time) + 0.1*sin(0.2*time); +per_frame_2=wave_y = wave_y + 0.1*sin(0.3*time) - 0.2*sin(0.88*time) + 0.13*cos(0.7*time); +per_frame_3=dx = dx + 0.04*sin(1.24*time); +per_frame_4=dy = dy + 0.04*sin(1.12*time); +per_frame_5=wave_r = wave_r + 0.35*sin(1.13*time) + 0.1245*sin(2.34*time); +per_frame_6=wave_g = wave_g + 0.35*sin(1.23*time) + 0.12*sin(2.134*time); +per_frame_7=wave_b = wave_b + 0.35*sin(1.33*time) + 0.12*sin(2.5*time); +per_frame_8=wave_mystery = wave_mystery + 0.00*sin(time); +per_frame_9=turn = above(bass_att,turn)*2 + (1-above(bass_att,turn))*((turn-1.3)*0.96+1.3); +per_frame_10=turnr = equal(turn,2)*0.089*sin(time*6.6) + (1-equal(turn,2))*turnr; +per_frame_11=simp = simp * 0.35*sin(1.2*time) - 0.62*sin(0.7*time) + 1.5*sin(turn); +per_frame_12=rot = rot + 1.05*((0.25*simp)*10*turnr); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Aimless (Spirogravity Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Aimless (Spirogravity Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Aimless (Spirogravity Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Aimless (Spirogravity Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,75 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.611434 +fWaveSmoothing=0.000000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.900000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.12*sin(0.2*time) - 0.15*cos(0.1*time) + 0.1*sin(0.2*time); +per_frame_2=wave_y = wave_y + 0.1*sin(0.3*time) - 0.2*sin(0.88*time) + 0.13*cos(0.7*time); +per_frame_3=dx = dx + 0.04*sin(1.24*time); +per_frame_4=dy = dy + 0.04*sin(1.12*time); +per_frame_5=wave_r = wave_r + 0.35*sin(1.13*time) + 0.1245*sin(2.34*time); +per_frame_6=wave_g = wave_g + 0.35*sin(1.23*time) + 0.12*sin(2.134*time); +per_frame_7=wave_b = wave_b + 0.35*sin(1.33*time) + 0.12*sin(2.5*time); +per_frame_8=wave_mystery = wave_mystery + 0.00*sin(time); +per_frame_9=turn = above(bass_att,turn)*2 + (1-above(bass_att,turn))*((turn-1.3)*0.96+1.3); +per_frame_10=turnr = equal(turn,2)*0.089*sin(time*6.6) + (1-equal(turn,2))*turnr; +per_frame_11=simp = simp * 0.35*sin(1.2*time) - 0.62*sin(0.7*time) + 1.5*sin(turn); +per_frame_12=rot = rot + 1.05*((0.25*simp)*10*turnr); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Airhandler (Menagerie Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Airhandler (Menagerie Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Airhandler (Menagerie Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Airhandler (Menagerie Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.700000 +fDecay=0.990000 +fVideoEchoZoom=0.999600 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.053726 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999513 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010100 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.900000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.900000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.5*sin(time*1.13); +per_frame_2=wave_g = wave_g + 0.5*sin(time*1.23); +per_frame_3=wave_b = wave_b + 0.5*sin(time*1.33); +per_frame_4= +per_frame_5=wave_x = wave_x + 0.05*sin(time); +per_frame_6=wave_y = wave_y + 0.05*cos(time); +per_frame_7= +per_frame_8=ib_r = ib_r + 0.25*sin(time); +per_frame_9=ib_g = ib_g + 0.25*cos(time); +per_frame_10=ib_b = ib_b + 0.25*sin(0.5*time); +per_pixel_1=zoom = zoom + 0.05*(sin(abs(50*sin(0.1*time))*rad) * sin(sin(time*2*sin(24*ang)*-rad))*3 * cos(rad)); +per_pixel_2=rot = rot + 0.1*sin(0.2+ 0.5*sin(time)-rad); +per_pixel_3=cx = cx + 1.1*(0.99*(0.5-rad))*sin(0.733*time)*below(sin(time),cos(time)); +per_pixel_4=cy = cy + 1.1*(0.99*(0.5-rad))*cos(0.953*time)*above(sin(time),cos(0.5*time)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Airs (Windy Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Airs (Windy Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Airs (Windy Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Airs (Windy Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,82 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.220183 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.241455 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.004500 +ob_r=1.000000 +ob_g=0.800000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.500000 +nMotionVectorsX=3.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.35*sin(1.4*time) + 0.15*sin(1.5*time); +per_frame_2=wave_g = wave_g + 0.35*sin(1.7*time) + 0.15*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.35*sin(1.84*time) + 0.15*sin(2.3*time); +per_frame_4= +per_frame_5=ib_r = wave_g; +per_frame_6=ib_g = wave_b; +per_frame_7=ib_b = wave_r; +per_frame_8=ob_r = wave_b; +per_frame_9=ob_g = wave_r; +per_frame_10=ob_b = wave_g; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=randomize = sin(time) - 0.75*cos(1.52*time) + 1.52*sin(5.5*time) - rand(2); +per_pixel_6=dx = dx + 0.07*pow(rad,x*2)*sin(time) + dx_r*1.75*sin(0.25-rad*randomize); +per_pixel_7=dy = dy + 0.07*pow(rad,x*2)*cos(time) + dy_r*1.75*sin(0.25-rad*randomize); +per_pixel_8=zoom = zoom - 0.1*pow(rad,x*0.6 + y*0.6)*cos(rad*randomize)*2*sin(time); +per_pixel_9=rot = rot - 0.25*(0.75*sin(1.25*time)*pow(rad,x)*sin(1.45*time))*sin(time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anchorpulse (Pulse Of A Ghast II Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anchorpulse (Pulse Of A Ghast II Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anchorpulse (Pulse Of A Ghast II Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anchorpulse (Pulse Of A Ghast II Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,84 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.700000 +fDecay=0.990000 +fVideoEchoZoom=0.451116 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.535239 +fWaveSmoothing=0.000000 +fWaveParam=-0.800000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.25*sin(1.4*time) + 0.25*sin(2.25*time); +per_frame_2=wave_g = wave_g + 0.25*sin(1.7*time) + 0.25*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.25*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=warp = 0; +per_frame_5= +per_frame_6=ob_r = wave_b; +per_frame_7=ob_g = wave_r; +per_frame_8=ob_b = wave_g; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=orb = ((0.5 - 0.5*sin(12*(sin(rad*time+ang))*(ang*time+rad)*time+rad))-2*rad); +per_pixel_6= +per_pixel_7=zoom = zoom + 0.1*sin(0.6*cos(0.33*(0.6*sin(1.52*time)*orb + (orb*0.8*cos(2.2*time))+ ((cos(orb))*0.7*sin(time)))))*(above(zoom,0.3)*0); +per_pixel_8= +per_pixel_9=sx = sx + (orb)*0.2*abs((above(sin(1.2*time),0))*sin(0.8*time)); +per_pixel_10=sy = sy + (-orb)*0.2*abs((below(sin(1.45*time),0))*cos(0.63*time)); +per_pixel_11= +per_pixel_12=dx = dx + 2*dx_r; +per_pixel_13=dy = dy+ 2*dy_r; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anchorpulse (Verified Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anchorpulse (Verified Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anchorpulse (Verified Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anchorpulse (Verified Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.950000 +fVideoEchoZoom=1.347848 +fVideoEchoAlpha=0.600000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.266718 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.25*sin(1.4*time) + 0.25*sin(2.25*time); +per_frame_2=wave_g = wave_g + 0.25*sin(1.7*time) + 0.25*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.25*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=warp = 0; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=orb = (0.05 + 0.25*sin(0.6*time + 0.62*cos(time))-(0.5/rad)); +per_pixel_6= +per_pixel_7=zoom = zoom + (bass_att)*abs(0.33*(0.6*sin(1.52*time)*(0.25-rad) + ((0.5-rad)*0.8*cos(2.2*time))+ ((2*orb+(2-rad))*0.7*sin(time))))*0.4; +per_pixel_8= +per_pixel_9=sx = sx + (0.5-rad)*0.2*abs((above(sin(time),0))*sin(time)); +per_pixel_10=sy = sy + (0.5-rad)*0.2*abs((below(sin(time),0))*cos(time)); +per_pixel_11= +per_pixel_12=dx = dx + dx_r; +per_pixel_13=dy = dy+ dy_r; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anomalous Material Science (Pure Splinter Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anomalous Material Science (Pure Splinter Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anomalous Material Science (Pure Splinter Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Anomalous Material Science (Pure Splinter Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.490000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.972362 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.999998 +fShader=0.000000 +zoom=0.999998 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.050000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.800000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.4*(0.25*sin(1.4*time)) + 0.25*sin(7.25*time); +per_frame_2=wave_g = wave_g + 0.34*(0.25*sin(1.7*time)) + 0.25*sin(6.11*time); +per_frame_3=wave_b = wave_b + 0.3*(0.25*sin(1.84*time)) + 0.25*sin(9.3*time); +per_frame_4=warp = 0; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.025*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.025*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=dx = dx + dx_r*(above(x,0.45+0.45*sin(1.5*time))*below(x,0.55+0.45*sin(1.5*time))); +per_pixel_6=dy = dy + dy_r*(above(y,0.45+0.45*cos(1.25*time))*below(y,0.55+0.45*cos(1.25*time))); +per_pixel_7=cx = cx + bass*(above(x,0.35+0.45*sin(1.05*time))*below(x,0.65+0.45*sin(1.05*time))); +per_pixel_8=cy = cy + bass*(above(y,0.35+0.45*cos(1.75*time))*below(y,0.65+0.45*cos(1.75*time))); +per_pixel_9=rot = rot + 0.15*((0.43*rad)*(5*cos(dx*dy-bass_att+(0.5-rad))*2-rad))*abs(0.5*(2*sin(0.2*time))); +per_pixel_10=zoom = zoom - 0.02*(abs(cos(12*ang))+0.4*rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote (Aqualung Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote (Aqualung Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote (Aqualung Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote (Aqualung Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999837 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.599171 +fWaveSmoothing=0.900000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=20.009382 +fWarpScale=5.427911 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.100000 +wave_b=1.000000 +wave_x=0.400000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=1.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=6.400000 +nMotionVectorsY=4.800000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.35*sin(4*time) + 0.15*sin(2.5*time); +per_frame_2=wave_g = wave_g + 0.35*sin(3.7*time) + 0.15*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.35*sin(3.84*time) + 0.15*sin(2.3*time); +per_frame_4=//wave_y = wave_y + 0.24*sin(2.5*time); +per_frame_5=wave_x = 0.5 + 0.25*sin(time); +per_frame_6=wave_y = 0.5 + 0.25*cos(time); +per_frame_7=ib_r = above(sin(0.2*time),-0.333)*1*below(sin(0.2*time),0.333); +per_frame_8=ib_g = below(sin(0.2*time),-0.333)*1; +per_frame_9=ib_b = above(sin(0.2*time),0.333)*1; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4=dy = dy + 0.001; +per_pixel_5=//warp = warp + dy_r*50* (if (above(x*cos(1.2*time), sin(1.62*time)), if(below(x*sin(1.72*time),cos(1.8*time)), if(below(y,sin(3*time)), + 1*bass, 0), 0), 0)); +per_pixel_6=rot = rot + 0.4*(1-rad)*0.5*sin(70*dy_r+dx_r*60); +per_pixel_7=zoom = zoom + 0.01*(1-rad*2)*0.03*(0.5-rad*0.1*sin(time)); +per_pixel_8=dy = dy + (0.005*sin(cos(x*time)*1.76*sin(0.52*time*cos(max(0.075*bass_att,0.0005*time))))); +per_pixel_9=dx = dx + (0.005*cos(sin(y*time)*1.54*sin(0.79*time*sin(max(0.075*treb_att,0.0005*time))))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,76 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999837 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.972360 +fWaveSmoothing=0.500000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=20.009382 +fWarpScale=5.427911 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.400000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=6.400000 +nMotionVectorsY=4.800000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.35*sin(4*time) + 0.15*sin(2.5*time); +per_frame_2=wave_g = wave_g + 0.35*sin(3.7*time) + 0.15*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.35*sin(3.84*time) + 0.15*sin(2.3*time); +per_frame_4=//wave_y = wave_y + 0.24*sin(2.5*time); +per_frame_5=wave_x = 0.5 + 0.15*sin(time); +per_pixel_1=//thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=//dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=//dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=//warp = warp + dy_r*50* (if (above(x*cos(1.2*time), sin(1.62*time)), if(below(x*sin(1.72*time),cos(1.8*time)), if(below(y,sin(3*time)), + 1*bass, 0), 0), 0)); +per_pixel_6= +per_pixel_7=dy = dy + (0.005*sin(cos(x*time)*1.76*sin(0.52*time*cos(max(0.075*bass_att,0.0005*time))))); +per_pixel_8=dx = dx + (0.005*cos(sin(y*time)*1.54*sin(0.79*time*sin(max(0.075*treb_att,0.0005*time))))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote (Side Effects Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote (Side Effects Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote (Side Effects Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antidote (Side Effects Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=5.427025 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.972360 +fWaveSmoothing=0.500000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=0.010000 +fWarpScale=1.766487 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.400000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=6.400000 +nMotionVectorsY=4.800000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.35*sin(1.4*time) + 0.15*sin(2.5*time+2*mid); +per_frame_2=wave_g = wave_g + 0.35*sin(1.7*time) + 0.15*sin(2.11*time+2.2*treb); +per_frame_3=wave_b = wave_b + 0.35*sin(1.84*time) + 0.15*sin(2.3*time+2*bass); +per_frame_4=//wave_y = wave_y + 0.24*sin(2.5*time); +per_frame_5=wave_x = 0.75 + 0.45*sin(sin(0.5*bass_att-0.4*treb_att)*sin(time)); +per_frame_6=//warp = warp + (0.8*bass_att - 0.8*treb_att)*0.25; +per_pixel_1=//thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=//dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=//dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=//warp = warp + dy_r*50* (if (above(x*cos(1.2*time), sin(1.62*time)), if(below(x*sin(1.72*time),cos(1.8*time)), if(below(y,sin(3*time)), + 1*bass, 0), 0), 0)); +per_pixel_6= +per_pixel_7=dy = dy + (0.004*sin(cos(x*2.25*time)*0.86*sin(0.52*time*cos(max(0.075*bass_att,0.0005*time))))); +per_pixel_8=dx = dx + (0.004*cos(sin(y*2.25*time)*0.94*sin(0.79*time*sin(max(0.075*treb_att,0.0005*time))))); +per_pixel_9=dy = dy - sin((1+x)*time*0.94)*(0.005*above(y,sin(1.14*time+0.02*treb_att))); +per_pixel_10=dx = dx + sin((0.25-y)*time*0.97)*(0.005*above(x,cos(1.2*time+0.02*bass_att))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antique Abyss.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antique Abyss.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antique Abyss.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Antique Abyss.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.700000 +fDecay=0.980000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=2.000454 +fWaveSmoothing=0.540000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.700000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.300000 +ob_a=0.200000 +ib_size=0.050000 +ib_r=0.000000 +ib_g=0.200000 +ib_b=0.300000 +ib_a=0.100000 +nMotionVectorsX=25.599995 +nMotionVectorsY=33.600002 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.300000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.150000 +per_frame_1=wave_r = wave_r + (0.35*sin(1.4*time*bass) + 0.25*sin(2.5*time))*4*treb*time; +per_frame_2=wave_g = wave_g + (0.35*sin(1.7*time*mid) - 0.25*sin(1.11*time))*4*bass*time; +per_frame_3=wave_b = wave_b + (0.35*sin(1.84*time*treb) + 0.25*sin(2.3*time))*4*mid*time; +per_frame_4=warp = 0; +per_frame_5=mv_g = 0.3 + 0.25*sin(wave_r); +per_frame_6=mv_r = 0.3 + 0.25*cos(wave_b); +per_frame_7=mv_b = 0.3 + 0.15*sin(wave_g); +per_frame_8=mv_x = mv_x - 3*bass; +per_frame_9=mv_y = mv_y - 4*treb; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4=zoom = zoom - 0.26*rad*(0.7+0.1*sin(4*bass*time)-rad); +per_pixel_5=dy= dy + 1.99*dy_r*(rad*sin(5*treb_att))*(1-rad); +per_pixel_6=dx = dx + 1.5*dx_r *(rad*cos(5*bass_att))*(0.6*rad-0.7-rad); +per_pixel_7=rot = rot + abs(0.8*(0.7*sin(bass*treb)*x-0.033*cos(ang))*(1-rad)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Arise! (Padded Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Arise! (Padded Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Arise! (Padded Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Arise! (Padded Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.350000 +fDecay=1.000000 +fVideoEchoZoom=1.503739 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=2.905225 +fWaveSmoothing=0.360000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.408391 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.25*sin(1.4*time) + 0.25*sin(2.25*time); +per_frame_2=wave_g = wave_g + 0.25*sin(1.7*time) + 0.25*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.25*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=warp = 0; +per_frame_5=//decay = 0.995 + 0.004*sin(0.5*time); +per_frame_6=wave_x = 0.01; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=dy = dy - 0.025*(1-y)*above(y,0.95); +per_pixel_6=dy = dy - 0.025*(y)*below(y,0.94); +per_pixel_7= +per_pixel_8=warp = warp + 0.25*(bass-treb)*above(y,0.9); +per_pixel_9=zoom = zoom - 0.02*(rad)*(above(y,0.9)); +per_pixel_10=sx = sx - above(x, 0.35 + 0.35*sin(time))*below(x,0.65 + 0.35*sin(time))* +per_pixel_11=above(y,0.8)*0.008*sin(time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Ashes Of Air (Remix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Ashes Of Air (Remix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Ashes Of Air (Remix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Ashes Of Air (Remix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.001000 +fDecay=1.000000 +fVideoEchoZoom=1.469141 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.386134 +fWaveScale=1.568857 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999513 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010100 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.800000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.5*sin(time*1.13); +per_frame_2=wave_g = wave_g + 0.5*sin(time*1.23); +per_frame_3=wave_b = wave_b + 0.5*sin(time*1.33); +per_pixel_1=zoom = zoom + 0.25*(0.05*bass_att + sin(sin(time+rad))*0.3 - cos(rad)*0.1); +per_pixel_2=rot = 0.06*sin(rad); +per_pixel_3=dx = dx + 0.008*(0.99*1-rad)*sin(0.733*time); +per_pixel_4=dy = dy + 0.008*(0.99*1-rad)*cos(0.953*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Bitterfeld (Crystal Border Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Bitterfeld (Crystal Border Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Bitterfeld (Crystal Border Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Bitterfeld (Crystal Border Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=2.448626 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.310603 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.999900 +fShader=0.000000 +zoom=0.999999 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.050000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.200000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=0.600000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.25*sin(1.4*time) + 0.25*sin(2.25*time); +per_frame_2=wave_g = wave_g + 0.25*sin(1.7*time) + 0.25*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.25*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=warp = 0; +per_frame_5=ib_r =wave_r; +per_frame_6=ib_g = wave_g; +per_frame_7=ib_b = wave_b; +per_frame_8=wave_mystery = wave_mystery + 0.3*time; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=zoom = zoom - 0.2*(1.5-rad)*sin(bass/2*treb_att)*(rad*2*(rad*abs(sin(9*ang)))); +per_pixel_6=rot = rot + dy_r*(2-zoom)*0.3*cos(bass)*20; +per_pixel_7=rot = rot - 0.4*(rad*cos(abs(12*ang)))*below(rad,0.3+ 0.4*sin(bass)); +per_pixel_8=dx = dx + 0.5*abs(rad+x-0.5*(bass/y*0.2))*dx_r; +per_pixel_9=dy = dy + 0.5*abs(rad+y-0.5*(treb/x*0.2))*dy_r; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Blender.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Blender.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Blender.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Blender.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=0.999997 +fVideoEchoAlpha=0.400000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=3.915820 +fWaveSmoothing=0.500000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=1.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.15*sin(time); +per_frame_2=wave_y = wave_y + 0.15*cos(time); +per_frame_3=wave_r = wave_r + 0.9; +per_frame_4=wave_g = 0.9 - 0.5*bass; +per_frame_5=wave_b = 0.9 - 0.5*bass; +per_pixel_1=rot = rot - 0.1*min((2-rad)*bass_att,(2-rad)*treb_att); +per_pixel_2=grad = sqrt(x*x + y*y)*2; +per_pixel_3=dx = dx - 0.02*(1-rad); +per_pixel_4=dy = dy + 0.02*(1-rad); +per_pixel_5=zoom = zoom - max(grad*(bass/8 - treb/8), 0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Bow To Gravity.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Bow To Gravity.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Bow To Gravity.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Bow To Gravity.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,85 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.930000 +fVideoEchoZoom=0.999837 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.796896 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.999995 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.010000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.500000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.25*sin(1.4*time) + 0.25*sin(2.25*time); +per_frame_2=wave_g = wave_g + 0.25*sin(1.7*time) + 0.25*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.25*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=warp = 0; +per_frame_5=ob_r = 0.5*wave_r; +per_frame_6=ob_b = 0.5*wave_g; +per_frame_7=ob_g = 0.5*wave_b; +per_frame_8=ib_r = wave_g; +per_frame_9=ib_g = wave_b; +per_frame_10=ib_b = wave_r; +per_frame_11=wave_mystery = wave_mystery + 25*sin(3-1*(sin(0.001*time))); +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4=dx = dx + above(x,0.5)*x*0.005; +per_pixel_5=dx = dx - below(x,0.5)*(1-x)*0.005; +per_pixel_6=dy = dy + above(y,0.5)*y*0.005; +per_pixel_7=dy = dy + below(y,0.5)*(1-y)*0.005; +per_pixel_8=zoom = zoom - 100*((1-rad)*((1.5*rad)*0.005 + 0.004*sin(0.5*bass_att))); +per_pixel_9= +per_pixel_10=rot = rot + (cos(bass_att*treb_att)/(1-treb)+0.5*time)*0.0005; +per_pixel_11=zoomexp = 0.8 + 1+sin(treb_att); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Brakefreak.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Brakefreak.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Brakefreak.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Brakefreak.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.880270 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.020000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=1.000000 +ob_a=1.000000 +ib_size=0.020000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.25*sin(1.4*time) + 0.25*sin(2.25*time); +per_frame_2=wave_g = wave_g + 0.25*sin(1.7*time) + 0.25*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.25*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=ib_r = wave_r*0.5; +per_frame_5=ib_g = wave_g*0.5; +per_frame_6=ib_b = wave_b*0.5; +per_frame_7=ob_r = wave_b; +per_frame_8=ob_g = wave_r; +per_frame_9=ob_b = wave_g; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=rot = rot + 0.06*(0.1*(time))+(0.5*(0.5-rad))+rad; +per_pixel_6=rot = rot - 0.1*sqr(0.5*cos(ang*time)*bass_att); +per_pixel_7=zoom = zoom - 0.04*(sin(rad)); +per_pixel_8=zoom = zoom - 0.1*above(y,0.5)*sqr(0.5*sin(ang*time)*bass_att); +per_pixel_9=zoom = zoom - 0.1*below(y,0.5)*sqr(0.5*cos(ang*time)*treb_att); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Candy Avian.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Candy Avian.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Candy Avian.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Candy Avian.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.923483 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.063785 +fWaveScale=0.724297 +fWaveSmoothing=0.500000 +fWaveParam=-0.300000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.500333 +fZoomExponent=1.000000 +fShader=0.100000 +zoom=0.990099 +rot=0.000000 +cx=0.500000 +cy=0.410000 +dx=-0.003990 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.200000 +ib_size=0.050000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.100000 +nMotionVectorsX=55.680000 +nMotionVectorsY=47.999996 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.250000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.4*sin(1.5*time) + 0.25*sin(2.14*time); +per_frame_2=wave_b = wave_b + 0.41*sin(1.2*time) + 0.26*sin(2.11*time); +per_frame_3=wave_g = wave_g + 0.4*sin(1.34*time) + 0.25*sin(2.34*time); +per_frame_4=ib_r = 4; +per_frame_5=ib_g = 0; +per_frame_6=ib_b = 0; +per_frame_7=wave_x = wave_x + +per_frame_8=if(above(wave_y,0.75),0.40*sin(time), 0.15*sin(time)); +per_frame_9=wave_y = wave_y + 0.30*cos(0.9*time); +per_frame_10=cx = cx + +per_frame_11=if(above(wave_x,0.5), +0.0*sin(7*treb_att), -0.0*sin(7*mid_att)); +per_frame_12=cy = cy + +per_frame_13=if(above(wave_x,0.5), +0.0*cos(7*bass_att), -0.0*cos(7*mid_att)); +per_frame_14=ob_r = 0.5*sin(treb)*time; +per_frame_15=ob_b = 0.5*sin(mid)*0.9*time; +per_frame_16=ob_g = 0.5*sin(bass)*0.8*time; +per_frame_17=warp = warp + if (above(bass_att,1.5), 1.5, 0); +per_frame_18=rot = rot + 0.08*sin(3*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.325446 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.200000 +wave_g=0.200000 +wave_b=0.200000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.030000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.030000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=0.100000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.4*sin(0.622*time) + 0.3*sin(0.155*time); +per_frame_2=wave_g = wave_g + 0.4*sin(0.45*time) + 0.3*sin(0.674*time); +per_frame_3=wave_b = wave_b + 0.4*sin(0.256*time) + 0.3*sin(0.35*time); +per_frame_4=ob_r = 1- wave_r; +per_frame_5=ob_g = 1 - wave_g; +per_frame_6=ob_b = 1-wave_b; +per_frame_7=ib_r = 0.9*ob_r; +per_frame_8=ib_g = 0.9*ob_g; +per_frame_9=ib_b = 0.9*ob_b; +per_frame_10=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_frame_11=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_frame_12=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_frame_13=dx = dx + dx_r; +per_frame_14=dy = dy + dy_r; +per_pixel_1=rot = rot + 0.04*sin(time*(rad)); +per_pixel_2=zoom = zoom + 0.025*cos(time*(rad)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams (Nightmare Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams (Nightmare Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams (Nightmare Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams (Nightmare Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,88 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=2.006758 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=1 +fWaveAlpha=100.000000 +fWaveScale=0.999835 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.010000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=0.010000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=basstrip = above(bass_att,basstrip)*2 + (1-above(bass_att,basstrip))*((basstrip-1.3)*0.96+1.3); +per_frame_2=basswack = equal(basstrip,2)*0.97*sin(time*2) + (1-equal(basstrip,2))*basswack; +per_frame_3=trebtrip = above(treb_att,trebtrip)*2 + (1-above(treb_att,trebtrip))*((trebtrip-1.3)*0.96+1.3); +per_frame_4=trebwack = equal(trebtrip,2)*0.97*sin(time*2.5) + (1-equal(trebtrip,2))*trebwack; +per_frame_5=midtrip = above(mid_att,midtrip)*2 + (1-above(mid_att,midtrip))*((midtrip-1.3)*0.96+1.3); +per_frame_6=midwack = equal(midtrip,2)*0.97*sin(time*2.75) + (1-equal(midtrip,2))*midwack; +per_frame_7=wave_r = wave_r + 0.75*basswack; +per_frame_8=wave_g = wave_g + 0.75*trebwack; +per_frame_9=wave_b = wave_b + 0.75*midwack; +per_frame_10=ob_r = 1- wave_r; +per_frame_11=ob_g = 1 - wave_g; +per_frame_12=ob_b = 1-wave_b; +per_frame_13=ib_r = 0.9*ob_r; +per_frame_14=ib_g = 0.9*ob_g; +per_frame_15=ib_b = 0.9*ob_b; +per_frame_16=volt = (bass_att+treb_att+mid_att)/3; +per_frame_17=zoom = zoom - 0.005; +per_frame_18=zoom = zoom + if (above(volt,0.75),- 0.005*(1-rad), 0); +per_frame_19=sy = sy + if (below(volt,0.83), - 0.01*(0.5-rad), 0); +per_pixel_1=//thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=//dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=//dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4=rot = rot + 0.05*sin(time*(rad*cos(time*12*ang))); +per_pixel_5=zoom = zoom + 0.025*cos(time*(0.5-rad)); +per_pixel_6=rot = rot - 0.05*((sin(time)-rad)*(0.9+abs(sin(rad*12)))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams (REMix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams (REMix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams (REMix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Causeway Of Dreams (REMix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.400279 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.200000 +wave_g=0.200000 +wave_b=0.200000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.030000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.030000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=0.100000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.4*sin(0.622*time) + 0.3*sin(0.155*time); +per_frame_2=wave_g = wave_g + 0.4*sin(0.45*time) + 0.3*sin(0.674*time); +per_frame_3=wave_b = wave_b + 0.4*sin(0.256*time) + 0.3*sin(0.35*time); +per_frame_4=ob_r = 1- wave_r; +per_frame_5=ob_g = 1 - wave_g; +per_frame_6=ob_b = 1-wave_b; +per_frame_7=ib_r = 0.9*ob_r; +per_frame_8=ib_g = 0.9*ob_g; +per_frame_9=ib_b = 0.9*ob_b; +per_frame_10=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_frame_11=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_frame_12=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_frame_13=dx = dx + 0.0*dx_r + if(above(gup,0), + 0.8*gup*dx_r, 0) + if(above(gslup,0), + 0.535*gslup*dx_r, 0); +per_frame_14=dy = dy + 0.0*dy_r + if(above(gup,0), + 0.8*gup*dy_r, 0) + if(above(glsup,0), + 0.535*gslup*dy_r, 0); +per_frame_15=gup = +2*sin(time) + sin(0.75*time); +per_frame_16=gslup = sin(0.655*time) - sin(0.176*time); +per_pixel_1=rot = rot + 0.04*sin(time*(rad)); +per_pixel_2=zoom = zoom + 0.025*cos(time*(rad)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Chromatic Abyss (The Other Side).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Chromatic Abyss (The Other Side).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Chromatic Abyss (The Other Side).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Chromatic Abyss (The Other Side).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.868317 +fWaveScale=0.484545 +fWaveSmoothing=0.000000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.010000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.250000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + (0.5*sin(12*treb)*3.12*time)/5; +per_frame_2=wave_b = wave_b + (0.5*sin(12*bass)*3.17*time)/5; +per_frame_3=wave_g =wave_g + (0.5*sin(12*mid)*3.22*time)/5; +per_frame_4=zoom = zoom + 0.01; +per_pixel_1=sx = sx + if (above(rad, 0.38), +0.01, 0); +per_pixel_2=sy = sy + if (above(rad, 0.38), +0.01, 0); +per_pixel_3=warp = warp + if (above(rad,0.56 + 0.05*sin(time)), +0.5*(sin(rad)), 0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Circlefacade.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Circlefacade.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Circlefacade.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Circlefacade.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.220186 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.459160 +fWaveScale=0.010000 +fWaveSmoothing=0.900000 +fWaveParam=-0.340000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.100000 +wave_y=0.900000 +ob_size=0.070000 +ob_r=1.000000 +ob_g=1.000000 +ob_b=1.000000 +ob_a=0.100000 +ib_size=0.010000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = 0.5 + 0.3*sin(0.75*time); +per_frame_2=wave_y = 0.5 + 0.3*cos(0.75*time); +per_frame_3=ob_r = ob_r + 0.445*sin(1.52*time); +per_frame_4=ob_g = ob_g + 0.436*sin(1.062*time); +per_frame_5=ob_b = ob_b + 0.325*sin(1.22*time); +per_frame_6=ib_a = ib_a + 5*tan(0.5*time); +per_frame_7=zoom = zoom - 0.1*zoom; +per_pixel_1=dx = dx + (sin(rad)*0.05)*0.76*sin(1.2255*time); +per_pixel_2=dy = dy + (sin(rad)*0.05)*0.76*cos(1.435*time); +per_pixel_3=rot = rot + (0.1*max(above(dx,dy),above(dy,dx))*bass_att)*(0.75-rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Contortion.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Contortion.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Contortion.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Contortion.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,84 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999996 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=2 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.691364 +fWaveSmoothing=0.000000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.200000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.25*sin(1.4*time) + 0.25*sin(2.25*time); +per_frame_2=wave_g = wave_g + 0.25*sin(1.7*time) + 0.25*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.25*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=warp = 0; +per_frame_5=ob_r = 0.3 + 0.3*sin(1.56*time); +per_frame_6=ob_g = 0.3 + 0.3*sin(2.15*time); +per_frame_7=ob_b = 0.3 + 0.3*cos(1.4*time); +per_frame_8=ib_r = 0.3 + 0.3*cos(1.83*time); +per_frame_9=ib_g = 0.3 + 0.3*cos(1.02*time); +per_frame_10=ib_b = 0.3 + 0.3*sin(2*time); +per_frame_11=ing = 2*sin(0.25*time); +per_frame_12=wave_x = wave_x + 0.57*sin(time); +per_frame_13=wave_y = wave_y + 0.57*cos(time); +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=rot = rot + above(bass,1)*0.25*(1-rad)*(100*dx_r); +per_pixel_6=zoom = zoom - 0.2*(1-rad); +per_pixel_7=cx = cx + above(bass,1)*0.25*sin(time)*(100*dy_r); +per_pixel_8=cy = cy + above(bass,1)*0.25*cos(time)*(100*dy_r); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Contortion (Xenomorph Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Contortion (Xenomorph Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Contortion (Xenomorph Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Contortion (Xenomorph Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,84 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.301000 +fDecay=1.000000 +fVideoEchoZoom=0.999996 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.003415 +fWaveScale=2.630066 +fWaveSmoothing=0.900000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=100.000000 +fWarpScale=0.010000 +fZoomExponent=11.202057 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=63.936001 +nMotionVectorsY=47.952000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.050000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.800000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.25*sin(1.4*time) + 0.25*sin(2.25*time); +per_frame_2=wave_g = wave_g + 0.25*sin(1.7*time) + 0.25*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.25*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=warp = 0; +per_frame_5=ob_r = 0.3 + 0.3*sin(1.56*time); +per_frame_6=ob_g = 0.3 + 0.3*sin(2.15*time); +per_frame_7=ob_b = 0.3 + 0.3*cos(1.4*time); +per_frame_8=ib_r = 0.3 + 0.3*cos(1.83*time); +per_frame_9=ib_g = 0.3 + 0.3*cos(1.02*time); +per_frame_10=ib_b = 0.3 + 0.3*sin(2*time); +per_frame_11=ing = 2*sin(0.25*time); +per_frame_12=wave_x = wave_x + 0.2*sin(time); +per_frame_13=wave_y = wave_y + 0.2*cos(time); +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=rot = rot + 0.5*(0.5-rad)*(5*sin(0.48*time*dy_r)*sin(time)); +per_pixel_6=zoom = zoom - 0.015*(0.65 - 0.25*sin((dx_r+dy_r)*20*bass)+rad); +per_pixel_7=cx = cx + .45*sin(time)*(0.75*sin(1.25*time*dy_r)*cos(0.74*sin(dx_r*2*time))); +per_pixel_8=cy = cy + .45*cos(time)*(0.75*cos(1.6*time*dx_r)*sin(0.74*cos(dy_r*2*time))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Crystal Storm.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Crystal Storm.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Crystal Storm.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Crystal Storm.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=0.649956 +fVideoEchoAlpha=0.300000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.691363 +fWaveSmoothing=0.000000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.931011 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.001000 +ob_r=1.000000 +ob_g=1.000000 +ob_b=1.000000 +ob_a=0.500000 +ib_size=0.001000 +ib_r=0.500000 +ib_g=1.000000 +ib_b=1.000000 +ib_a=0.500000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.050000 +per_frame_1=rot = rot + 0.1*(0.4*sin(bass) - 0.4*sin(treb) / 0.4*sin(mid))*sin(5*time); +per_frame_2=wave_x = wave_x + 0.1*sin(time) - 0.157*sin(1.73*time); +per_frame_3=wave_y = wave_y - 0.126*sin(time) + 0.15*cos(1.1*time); +per_frame_5=zoom = zoom + 0.01*bass*0.005*sqrt(treb/bass); +per_pixel_1=rot = rot + 0.05*min(abs(1-rad*cos(bass))*tan(bass),-(abs(1-rad*sin(treb))*sin(time))); +per_pixel_2=dx = dx + (0.025*sin(bass))*0.8*abs(5*bass-5*treb); +per_pixel_3=dy = dy + (0.015*cos(treb))*0.8*abs(5*treb - 5*bass); +per_pixel_4=cy = cy + (0.8*rad/time)*bass; +per_pixel_5=zoom = zoom - 0.05*log(1.5-rad); \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Dark Matter (Converse Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Dark Matter (Converse Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Dark Matter (Converse Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Dark Matter (Converse Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.074098 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.451117 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.500000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.25*sin(1.4*time) + 0.25*sin(2.25*time); +per_frame_2=wave_g = wave_g + 0.25*sin(1.7*time) + 0.25*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.25*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=warp = 0; +per_frame_5=wave_x = wave_x + 0.12*sin(time); +per_frame_6=wave_y = wave_y + 0.12*sin(1.24*time); +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=zoom = zoom - abs(0.6*sin(((sin(cos(time)+0.5*sin(1.6*bass)-0.44*cos(1.1*mid))+sin(-rad)))* +per_pixel_6=(sin(bass)*(0.5-rad)))); +per_pixel_7=zoom = zoom + 0.02*(2-rad); +per_pixel_8=dx = dx + dx_r; +per_pixel_9=dy = dy + dy_r; +per_pixel_10=dx = dx + abs(0.005*(1.2*cos(bass*0.73*time) + 1.2*sin((0.5-rad)*2.1*time))); +per_pixel_11=dy = dy + abs(0.005*(1.2*sin(bass*0.73*time) + 1.2*cos((0.5-rad)*1.3*time))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Elastoid.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Elastoid.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Elastoid.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Elastoid.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.970000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.655694 +fWaveSmoothing=0.000000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.015000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.35*sin(4*time) + 0.15*sin(2.5*time); +per_frame_2=wave_g = wave_g + 0.35*sin(3.7*time) + 0.15*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.35*sin(3.84*time) + 0.15*sin(2.3*time); +per_frame_4=ob_r = wave_r; +per_frame_5=ob_g = wave_g; +per_frame_6=ob_b=wave_b; +per_frame_7=zoom = zoom - 0.02; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=m1 = 2*sin(1.25*time); +per_pixel_6=m2 = 1.25*sin(4*time); +per_pixel_7=m3 = 5*sin(0.33*time); +per_pixel_8=sx = sx + if (above(m1,m2), if (above(m1,m3), dx_r, -dx_r), dx_r*1.75)*(.75-rad); +per_pixel_9=sy = sy + if (above(m2,m3), if (above(m3,m1), dy_r, dy_r*1.5), dy_r*0.75)*(.75-rad); +per_pixel_10=dx = dx + if (above(m2,m1), if (below(m1,m3), dx_r, dx_r*0.66), dx_r*1.8)*(.75-rad); +per_pixel_11=dy = dy + if (above(m3,m1), if(below(m2,m3), -dy_r, dy_r*1.25), dy_r*0.8)*(0.75-rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Floater Society.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Floater Society.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Floater Society.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Floater Society.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,82 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.350000 +fDecay=0.950000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.294621 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.050000 +ob_r=0.200000 +ob_g=0.300000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=1.920000 +nMotionVectorsY=23.999998 +mv_dx=-0.060000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=1.000000 +per_frame_1=wave_r = wave_r + 0.35*sin(4*time) + 0.25*sin(2.5*time); +per_frame_2=wave_g = wave_g + 0.35*sin(3.7*time) + 0.25*sin(2.11*time); +per_frame_3=wave_b = wave_b + 0.35*sin(3.84*time) + 0.25*sin(2.3*time); +per_frame_4=wave_mystery = sin(time); +per_frame_5=mv_l = mv_l + 2*sin(time); +per_frame_6=mv_r = wave_r; +per_frame_7=mv_g = wave_g; +per_frame_8=mv_b = wave_b; +per_frame_9=warp = 0; +per_frame_10=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_frame_11=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_frame_12=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_frame_13=bass_seek = below(bass_seek,bass) + bass_att - (above(bass_att,bass_seek) -bass); +per_frame_14=trip = 0.4*bass_seek; +per_frame_15=dy = dy + dy_r*trip*cos(time); +per_frame_16=dx = dx + dx_r*trip*sin(time); +per_frame_17=zoom = zoom - 0.025*trip*thresh; +per_frame_18=rot = rot + 0.015*trip*thresh; +per_pixel_1=dy = dy - 0.95-rad*dx; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Flowing Form.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Flowing Form.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Flowing Form.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Flowing Form.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,75 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.920000 +fVideoEchoZoom=1.343302 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.611957 +fWaveSmoothing=0.000000 +fWaveParam=0.080000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.999834 +fWarpScale=100.000000 +fZoomExponent=1.200114 +fShader=1.000000 +zoom=1.010011 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.020000 +dy=0.020000 +warp=0.059958 +sx=0.999998 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.100000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.100000 +ob_a=0.500000 +ib_size=0.000000 +ib_r=0.550000 +ib_g=0.250000 +ib_b=0.050000 +ib_a=0.700000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%200,0); +per_frame_7=ob_r = wave_g; +per_frame_8=ob_g = wave_b; +per_frame_9=ob_b = wave_r; +per_pixel_1=sx=sx+0.5*cos((y*2-1)*6+time*1.53+(x*2-1)*3.2); +per_pixel_2=sy=sy+0.5*cos((x*2-1)*8+time*1.71+(y*2-1)*4.3); +per_pixel_3=zoom = zoom - 0.01*ang; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Making Time (Swamp Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Making Time (Swamp Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Making Time (Swamp Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Making Time (Swamp Mix).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,85 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.599181 +fWaveSmoothing=0.900000 +fWaveParam=-0.200000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=bass_tick = above(bass_att,bass_tick)*2 + (1-above(bass_att,bass_tick))* +per_frame_2=((bass_tick-1.3)*0.96+1.3); +per_frame_3=treb_tick = above(treb_att,treb_tick)*2 + (1-above(treb_att,treb_tick))* +per_frame_4=((treb_tick-1.3)*0.96+1.3); +per_frame_5=mid_tick = above(mid_att,mid_tick)*2 + (1-above(mid_att,mid_tick))* +per_frame_6=((mid_tick-1.3)*0.96+1.3); +per_frame_7=bass_shift = equal(bass_tick,2)*0.95*sin(time*5) + (1-equal(bass_tick,2))*bass_shift; +per_frame_8=treb_shift = equal(treb_tick,2)*0.95*sin(time*5) + (1-equal(treb_tick,2))*treb_shift; +per_frame_9=mid_shift = equal(mid_tick,2)*0.95*sin(time*5) + (1-equal(mid_tick,2))*mid_shift; +per_frame_10=wave_mystery = wave_mystery + 0.15*sin(time) + 0.2*sin(0.2*time); +per_frame_11=wave_r = wave_r +bass_shift+0.3; +per_frame_12=wave_g = wave_g+treb_shift; +per_frame_13=wave_b = wave_b +mid_shift; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4=rot = rot + 2*abs((0.9*dy_r)*bass)*sin(0.7*time); +per_pixel_5=zoom = zoom + 10*(0.2*rad*(3-bass/cos(rad/12)*2*tan(12)))*(0.002*sin(ang*(12*sin(8*bass)))); +per_pixel_6=cx = cx + 0.3*sin(3*dy_r); +per_pixel_7=cy = cy + 0.3*cos(3*dx_r); +per_pixel_8=dy = dy + 1.7*dy_r; +per_pixel_9=dx = dx + 1.7*dx_r; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Potion of Spirits.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Potion of Spirits.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Potion of Spirits.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Potion of Spirits.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,234 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.420000 +fDecay=1.000000 +fVideoEchoZoom=0.999823 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001185 +fWaveScale=0.325446 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=2.630064 +fWarpScale=3.209168 +fZoomExponent=1.000158 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.100000 +nMotionVectorsX=6.400000 +nMotionVectorsY=4.800000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=wave_r = 0.5 + 0.5*sin(1.6*time); +per_frame_2=wave_g = 0.5 + 0.5*sin(4.1*time); +per_frame_3=wave_b = -1 + (1-wave_r + 1-wave_g); +per_frame_4=warp = 2; +per_frame_5= +per_frame_6=ob_r = ob_r+wave_b*above(sin(0.1*time),0); +per_frame_7=ob_b = ob_b+wave_g*above(sin(0.1*time),0); +per_frame_8=ob_g = ob_g+wave_r*above(sin(0.1*time),0); +per_frame_9=ob_r = ob_r+wave_g*below(sin(0.1*time),0); +per_frame_10=ob_b = ob_b+wave_r*below(sin(0.1*time),0); +per_frame_11=ob_g = ob_g+wave_b*below(sin(0.1*time),0); +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.05*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.056*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4=tg1 = abs(sin(time)); +per_pixel_5=tg2 = 22*above(tg1,0.75) + 12*below(tg1,0.25) + 18*above(tg1,0.25)*below(tg1,0.5)+ +per_pixel_6=12*above(tg1,0.5)*below(tg1,0.75); +per_pixel_7=tg3 = if(equal(thresh,2),tg2,tg3); +per_pixel_8= +per_pixel_9=six = sin(x); +per_pixel_10= +per_pixel_11=dx = dx + dx_r*sin(abs(tg3*y))*sin(time); +per_pixel_12=dy = dy + dy_r*sin(abs(tg3*x))*cos(time); +per_pixel_13=dx = dx + dx_r*pow(rad,y*2)*sin(time); +per_pixel_14=dy = dy + dy_r*pow(rad,x*2)*sin(time); +per_pixel_15=zoom = zoom - 0.0825*pow(rad,x*6)*cos(ang*6); +per_pixel_16=rot = rot - 0.0525*(0.75*sin(1.25*time)*pow(rad,x)*sin(1.45*time))*sin(time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Songflower (Moss Posy).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Songflower (Moss Posy).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Songflower (Moss Posy).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Songflower (Moss Posy).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,242 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=1.447722 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.015000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=leafset = 3; +per_frame_1=wave_r = 0.5 + 0.5*sin(1.6*time); +per_frame_2=wave_g = 0.5 + 0.5*sin(4.1*time); +per_frame_3=wave_b = -1 + (1-wave_r + 1-wave_g); +per_frame_4=warp = 0; +per_frame_5=pfthresh = above(bass_att,pfthresh)*3+(1-above(bass_att,pfthresh))*((pfthresh-1.3)*0.96+1.3); +per_frame_6=pfdx_r = equal(pfthresh,3)*0.015*sin(5*time)+(1-equal(pfthresh,3))*pfdx_r; +per_frame_7=pfdy_r = equal(pfthresh,3)*0.015*sin(6*time)+(1-equal(pfthresh,3))*pfdy_r; +per_frame_8=q1 = wave_r; +per_frame_9=q2 = wave_g; +per_frame_10=q3 = wave_b; +per_frame_11= +per_frame_12=ob_r = 1-abs(q1)*0.75; +per_frame_13=ob_g = 1-abs(q2)*0.75; +per_frame_14=ob_b = 1-abs(q3)*0.75; +per_frame_15=echo_zoom = echo_zoom + min(max(0.75,50*pfdx_r),1); +per_frame_16= +per_frame_17=echo_orient = echo_orient + 16*pfdy_r; +per_frame_18= +per_frame_19=dx = dx + 15.1*pfdx_r; +per_frame_20=dy = dy + 15.1*pfdy_r; +per_frame_21=ob_size = ob_size + 0.005*bass_att; +per_frame_22=ib_a = ib_a - min(0.5,0.5-abs(dx+dy)); +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4= +per_pixel_5=ladder = abs(sin(1*time)); +per_pixel_6=leaf = 5*below(ladder,0.2) + 8*above(ladder,0.2)*below(ladder,0.4) + +per_pixel_7=12*above(ladder,0.4)*below(ladder,0.6) + 18*above(ladder,0.6)*below(ladder,0.8) + +per_pixel_8=24*above(ladder,0.8); +per_pixel_9=leafset = if(equal(thresh,2), leaf, leafset); +per_pixel_10= +per_pixel_11=zoom = zoom + 0.05*(0.75-cos(leafset*rad))*(1-rad); +per_pixel_12=zoom = zoom - abs(0.05*(0.75-cos(4*rad))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Spillswirl.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Spillswirl.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Spillswirl.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - Spillswirl.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.020100 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.499722 +fWaveSmoothing=0.900000 +fWaveParam=-0.080000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=27.429565 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.001990 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.250000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=55.680000 +nMotionVectorsY=47.999996 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + if(above(wave_y,0.75), - 0.1*tan(time), + 0.1*tan(time)); +per_frame_2=wave_y = wave_y + 0.40*sin(8*mid); +per_frame_3=wave_r = wave_r + if(above(3*bass,2), +1,-2); +per_frame_4=wave_g = wave_g + if(above(3*mid,2), +1, -2); +per_frame_5=wave_b = wave_b + if(above(3*treb,2), +1, -2); +per_frame_6=warp = 0; +per_frame_7=rot = rot - 0.05; +per_pixel_1=zoom = zoom + if (below(rad,0.3), -0.2*(1-rad), 0); +per_pixel_2=zoom = zoom + if(below(rad,0.6), -0.2*(0.5-rad), 0); +per_pixel_3=rot = rot - if(below(rad,0.2), 0.1*(1-rad), 0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - What cannot be.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - What cannot be.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - What cannot be.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - What cannot be.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,78 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=2.216706 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=3.749272 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.990000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.35*sin(1.4*time) + 0.25*sin(2.5*time); +per_frame_2=wave_g = wave_g + 0.35*sin(1.7*time) - 0.25*sin(1.11*time); +per_frame_3=wave_b = wave_b + 0.35*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=warp = 0; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4=dy = dy + dy_r +below(y,0.5)*0.005; +per_pixel_5=dy = dy - dy_r -above(y,0.5)*0.005; +per_pixel_6=dx = dx + dx_r+ above(y,sin(time))*0.005 - below(y,0.8*sin(time))*0.005; +per_pixel_7=dx = dx + dx_r+ above(y,0.76*sin(1.2*time))*0.005 - below(y,0.55*sin(2*time))*0.005; +per_pixel_8=nx = 0.8*x * sin(time) - 0.4*x *sin(1.22*time); +per_pixel_9=ny = 0.8*y * cos(time) - 0.4*y *cos(1.4*time); +per_pixel_10=zoom = zoom + if(below(rad,0.4), + 0.05-rad, 0); +per_pixel_11=zoom = zoom + if (below(rad,0.2), + 0.1-rad, 0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - What Cannot Be Undone.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - What Cannot Be Undone.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - What Cannot Be Undone.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Aderrasi - What Cannot Be Undone.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,76 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=2.216706 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=3.749272 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.990000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.35*sin(1.4*time) + 0.25*sin(2.5*time); +per_frame_2=wave_g = wave_g + 0.35*sin(1.7*time) - 0.25*sin(1.11*time); +per_frame_3=wave_b = wave_b + 0.35*sin(1.84*time) + 0.25*sin(2.3*time); +per_frame_4=warp = 0; +per_pixel_1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_2=dx_r = equal(thresh,2)*0.015*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_3=dy_r = equal(thresh,2)*0.015*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_pixel_4=dy = dy + dy_r +below(y,0.5)*0.005; +per_pixel_5=dy = dy - dy_r -above(y,0.5)*0.005; +per_pixel_6=dx = dx + dx_r+ above(y,sin(time))*0.005 - below(y,0.8*sin(time))*0.005; +per_pixel_7=dx = dx + dx_r+ above(y,0.76*sin(1.2*time))*0.005 - below(y,0.55*sin(2*time))*0.005; +per_pixel_8=nx = 0.8*x * sin(time) - 0.4*x *sin(1.22*time); +per_pixel_9=ny = 0.8*y * cos(time) - 0.4*y *cos(1.4*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/baked - mushroom rainbows[2].milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/baked - mushroom rainbows[2].milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/baked - mushroom rainbows[2].milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/baked - mushroom rainbows[2].milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,306 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.925000 +fVideoEchoZoom=1.006500 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=2.850136 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.020000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.164463 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=tmie= (time*0.25) * (bass*0.05); +shape_0_per_frame2= +shape_0_per_frame3=ang = tmie; +shape_0_per_frame4= +shape_0_per_frame5=dx = asx; +shape_0_per_frame6= +shape_0_per_frame7=asx= sx - abs(time-sin(ang*x-y)); +shape_0_per_frame8=asy= sy - abs(time-sin(ang*x-y)); +shape_0_per_frame9= +shape_0_per_frame10= +shape_0_per_frame11=x = sin(time/2)*0.4 + 0.5; +shape_0_per_frame12= +shape_0_per_frame13= +shape_0_per_frame14=r = r2 * tmie ; +shape_0_per_frame15=g = g2 * tmie ; +shape_0_per_frame16=b = b2 * tmie ; +shape_0_per_frame17=r2 = r*.9998 - tmie ; +shape_0_per_frame18=g2 = g*.9998 - tmie ; +shape_0_per_frame19=b2 = b*.9998 - tmie ; +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.599577 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=3.141593 +shapecode_1_tex_zoom=0.756687 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=ang = sin(time*0.3) + .5; +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=mv_x = 64; +per_frame_init_2=mv_y = 89; +per_frame_1=wave_a = 0; +per_frame_2= +per_frame_3= +per_frame_4= +per_frame_5=//Thanks to Zylot for rainbow generator +per_frame_6=counter1 = if(equal(counter2,1),if(equal(counter1,1),0,counter1+.2),1); +per_frame_7=counter2 = if(equal(counter1,1),if(equal(counter2,1),0,counter2+.2),1); +per_frame_8=cdelay1 = if(equal(cdelay2,1),1,if(equal(colorcounter%2,1),if(equal(counter1,1),2 ,0), if(equal(counter2,1),2,0))); +per_frame_9=cdelay2 = if(equal(cdelay1,2),1,0); +per_frame_10=colorcounter = if(above(colorcounter,7),0,if(equal(cdelay1,1),colorcounter+1,colorcounter)); +per_frame_11=ob_r = .5*if(equal(colorcounter,1),1, if(equal(colorcounter,2),1, if(equal(colorcounter,3),1, if(equal(colorcounter,4),sin(counter2+2.1), if(equal(colorcounter,5),0, if(equal(colorcounter,6),0,sin(counter1))))))); +per_frame_12=ob_g = .5*if(equal(colorcounter,1),0, if(equal(colorcounter,2),sin(counter2*.5), if(equal(colorcounter,3),sin((counter1+1.75)*.4), if(equal(colorcounter,4),1, if(equal(colorcounter,5),1, if(equal(colorcounter,6),sin(counter2+2),0)))))); +per_frame_13=ob_b = if(equal(colorcounter,1),sin(counter1+2.1), if(equal(colorcounter,2),0, if(equal(colorcounter,3),0, if(equal(colorcounter,4),0, if(equal(colorcounter,5),sin(counter1), if(equal(colorcounter,6),1,1)))))); +per_frame_14= +per_frame_15= +per_frame_16= +per_frame_17=ib_r = ob_r*1.001; +per_frame_18=ib_g = ob_g*1.001; +per_frame_19=ib_b = ob_b*1.001; +per_frame_20= +per_frame_21= +per_frame_22= +per_frame_23=decay = 0.9999; +per_frame_24= +per_frame_25= +per_frame_26= +per_frame_27= +per_frame_28= +per_frame_29=basstemp= bass + bass_att + bass_thresh; +per_frame_30=trebtemp= treb + treb_att + treb_thresh; +per_frame_31=trasstemp= (max(basstemp, trebtemp)); +per_frame_32=trassave= (trasstemp/3); +per_frame_33= +per_frame_34=basst= max(bass + bass_att, treb + treb_att); +per_frame_35=trebb= min(basst + bass_thresh, basst + treb_thresh); +per_frame_36=midbeat= trebb/3; +per_frame_37=midtb= max(midbeat + mid, midbeat + mid_att); +per_frame_38=mtb= midtb/2.25; +per_frame_39= +per_frame_40=beetA= (max(treb, bass) + min(treb_att, bass_att)) /2; +per_frame_41=beetB= (max(mid, beetA) + min(mid_att, beetA*0.5)) /2; +per_frame_42=beetAB= (beetA+beetB)/2; +per_frame_43=beetC= (max(mid, treb) + min(mid_att, treb_att)) /2; +per_frame_44=beetD= (max(bass, beetC) + min(bass_att, beetC*0.5)) /2; +per_frame_45=beetCD= (beetC+beetD)/2; +per_frame_46=beet= (beetAB+beetCD) /2; +per_frame_47= +per_frame_48=madbeat= (trassave+mtb+beet) /3; +per_pixel_1=rot = rot +.05 * sin(rad-(time*.1+bas)) ; +per_pixel_2=bas = (bass*2.5); +per_pixel_3=bos = bass; +per_pixel_4=warp = (bos + bass + bass) * .1; +per_pixel_5=cx = (cx + treb) * .5; +per_pixel_6= +per_pixel_7=dx = dy+.01 ; +per_pixel_8=dy = dx-.01 ; +per_pixel_9= +per_pixel_10=basstemp= bass + bass_att + bass_thresh; +per_pixel_11=trebtemp= treb + treb_att + treb_thresh; +per_pixel_12=trasstemp= (max(basstemp, trebtemp)); +per_pixel_13=trassave= (trasstemp/3); +per_pixel_14= +per_pixel_15=basst= max(bass + bass_att, treb + treb_att); +per_pixel_16=trebb= min(basst + bass_thresh, basst + treb_thresh); +per_pixel_17=midbeat= trebb/3; +per_pixel_18=midtb= max(midbeat + mid, midbeat + mid_att); +per_pixel_19=mtb= midtb/2.25; +per_pixel_20= +per_pixel_21=beetA= (max(treb, bass) + min(treb_att, bass_att)) /2; +per_pixel_22=beetB= (max(mid, beetA) + min(mid_att, beetA*0.5)) /2; +per_pixel_23=beetAB= (beetA+beetB)/2; +per_pixel_24=beetC= (max(mid, treb) + min(mid_att, treb_att)) /2; +per_pixel_25=beetD= (max(bass, beetC) + min(bass_att, beetC*0.5)) /2; +per_pixel_26=beetCD= (beetC+beetD)/2; +per_pixel_27=beet= (beetAB+beetCD) /2; +per_pixel_28= +per_pixel_29=madbeat= (trassave+mtb+beet) /3; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Godhead.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Godhead.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Godhead.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Godhead.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,65 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.975000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.285749 +fWaveSmoothing=0.900000 +fWaveParam=0.600000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.380217 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.198054 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = bass-1; +per_frame_2=wave_g = mid-1.2; +per_frame_3=wave_b = treb-.5; +per_pixel_1=rot=0.1*pow(ang,3); +per_pixel_2=zoom=sin(pow(rad,mid))+.8; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren & Krash - Rainbow Orb Peacock (Centred Journey Mix.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren & Krash - Rainbow Orb Peacock (Centred Journey Mix.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren & Krash - Rainbow Orb Peacock (Centred Journey Mix.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren & Krash - Rainbow Orb Peacock (Centred Journey Mix.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,76 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=5.277897 +fWaveSmoothing=0.000000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.850000 +fModWaveAlphaEnd=1.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=-0.240000 +cx=0.650000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.887449 +sy=1.051010 +wave_r=0.400000 +wave_g=0.400000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=1.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=warp/bass; +per_frame_2=x_wave_x = 0.5+0.3*sin(bass+treb+mid); +per_frame_3=wave_r = 1 + sin(-x_wave_x*6.28); +per_frame_4=wave_g = abs(sin(2*x_wave_x*6.28)); +per_frame_5=wave_b = sin(x_wave_x*6.28); +per_frame_6=treb_effect = if(above(treb_att,1.4),pow(0.99,treb_att),1); +per_frame_7=net_effect = if(above(bass_att,0.8*treb_att),1,treb_effect); +per_frame_8=zoom = net_effect; +per_frame_9=rot = rot + rot_residual/1.5; +per_frame_10=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_11=shift = (tan(time*7)) -0.05; +per_frame_12=shift = if(above(shift,0),0,if(below(shift,-0.1),-0.1,shift)); +per_frame_13=rot_residual = if(equal(bass_thresh,2),shift,rot_residual); +per_frame_14=q1=net_effect; +per_frame_15=q2=bass_thresh; +per_pixel_1=rot = rot + if(equal(tan(ang), q1), rot, tan(q1-rad)/q2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren & Krash - Rainbow Orb Peacock (Lonely Signal Gone .milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren & Krash - Rainbow Orb Peacock (Lonely Signal Gone .milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren & Krash - Rainbow Orb Peacock (Lonely Signal Gone .milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren & Krash - Rainbow Orb Peacock (Lonely Signal Gone .milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.560000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.400000 +nVideoEchoOrientation=1 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=64 +nMotionVectorsY=1 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.599180 +fWaveSmoothing=0.750000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.850000 +fModWaveAlphaEnd=1.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.844378 +sy=1.061520 +wave_r=0.400000 +wave_g=0.400000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +per_frame_1=warp=0; +per_frame_2=x_wave_x = 0.5+0.3*sin(bass+treb+mid); +per_frame_3=wave_r = 1 + sin(-x_wave_x*6.28); +per_frame_4=wave_g = abs(sin(2*x_wave_x*6.28)); +per_frame_5=wave_b = sin(x_wave_x*6.28); +per_frame_6=treb_effect = if(above(treb_att,1.4),pow(0.99,treb_att),1); +per_frame_7=net_effect = if(above(bass_att,0.8*treb_att),1,treb_effect); +per_frame_8=zoom = net_effect*1.027; +per_frame_9=rot = rot + rot_residual; +per_frame_10=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_11=shift = (tan(time*7)) -0.05; +per_frame_12=shift = if(above(shift,0),0,if(below(shift,-0.1),-0.1,shift)); +per_frame_13=rot_residual = if(equal(bass_thresh,2),shift,rot_residual); +per_pixel_1=rot = rot + if(equal(sin(ang), 1), rot, sin(1-rad)/sqr(bass_att*1.5)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Pentultimate Nerual Slipstream (Tweak 2).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Pentultimate Nerual Slipstream (Tweak 2).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Pentultimate Nerual Slipstream (Tweak 2).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Pentultimate Nerual Slipstream (Tweak 2).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,63 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.950000 +fVideoEchoZoom=3.007504 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.880224 +fWaveSmoothing=0.000000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.074097 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + .5*sin(time*333) + bass*.3; +per_frame_3=wave_g = wave_g + .5*sin(time*222) + treb*.3; +per_frame_4=wave_b = wave_b + .5*sin(time*111) + mid*.3; +per_frame_5=rot = .4*sin(mid_att*.05); +per_pixel_1=ray = pow(rad,1.8)+.05; +per_pixel_2=zoom = (ray/rad)*1.4 + .3*sin(ang*(bass*5))+(bass*.2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Take This Highway.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Take This Highway.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Take This Highway.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Bmelgren - Take This Highway.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,66 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.925000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=2.850142 +fWaveSmoothing=0.360000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.380217 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.198054 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ff = 0.01*frame; +per_frame_2=wave_r = 0.5*sin(5*ff/bass)+0.5; +per_frame_3=wave_g = 0.5*cos(ff/mid)+0.5; +per_frame_4=wave_b = 0.5*cos(3*ff/treb)+0.5; +per_pixel_1=rot=0.1*pow(ang,3); +per_pixel_2=zoom=sin(pow(rad,3))+(.6*mid_att); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - adela the flower.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - adela the flower.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - adela the flower.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - adela the flower.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,107 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.988000 +fVideoEchoZoom=1.000499 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000416 +fWaveScale=0.671923 +fWaveSmoothing=0.450000 +fWaveParam=-0.000000 +fModWaveAlphaStart=0.200000 +fModWaveAlphaEnd=0.600000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000158 +fShader=0.000000 +zoom=0.980515 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=0.999999 +sy=0.999999 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.200000 +ob_r=0.000000 +ob_g=0.600000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=20.223999 +nMotionVectorsY=20.255999 +mv_dx=0.000000 +mv_dy=-0.000000 +mv_l=2.200000 +mv_r=0.900000 +mv_g=0.500000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=// timed sidon sensor +per_frame_2=// le = signal level; desired average value = 2 +per_frame_3=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_4=pulse=above(le,th); +per_frame_5=// pulsefreq = running average of interval between last 5 pulses +per_frame_6=pulsefreq=if(equal(pulsefreq,0),2, +per_frame_7=if(pulse,.8*pulsefreq+.2*(time-lastpulse),pulsefreq)); +per_frame_8=lastpulse=if(pulse,time,lastpulse); +per_frame_9=// bt = relative time; 0 = prev beat; 1 = expected beat +per_frame_10=bt=(time-lastbeat)/(.5*beatfreq+.5*pulsefreq); +per_frame_11=// hccp = handcicap for th driven by bt +per_frame_12=hccp=(.03/(bt+.2))+.5*if(band(above(bt,.8),below(bt,1.2)), +per_frame_13=(pow(sin((bt-1)*7.854),4)-1),0); +per_frame_14=beat=band(above(le,th+hccp),btblock); +per_frame_15=btblock=1-above(le,th+hccp); +per_frame_16=lastbeat=if(beat,time,lastbeat); +per_frame_17=beatfreq=if(equal(beatfreq,0),2, +per_frame_18=if(beat,.8*beatfreq+.2*(time-lastbeat),beatfreq)); +per_frame_19=// th = threshold +per_frame_20=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_21=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_22=th=if(above(th,6),6,th); +per_frame_23=thccl=thccl+(th-2.5144); +per_frame_24= +per_frame_25=cc=cc+beat; +per_frame_26=q1=cc; +per_frame_27=mv_a=if(equal((3*sin(cc))%2,0),.3+.3*sin(.01*thccl),0); +per_frame_28=zoom=.98+.02*sin(12*cc); +per_frame_29=zoomexp=1+.3*sin(26*cc); +per_frame_30=sx=1+.01*sin(11*cc); +per_frame_31=sy=1+.01*sin(14*cc); +per_frame_32=wave_x=.5+.4*sin((.02+.005*sin(.003*time))*thccl)+.05*sin(8*time); +per_frame_33=wave_y=.5+.4*sin((.017+.005*sin(.0027*time))*thccl)+.05*sin(6.7*time); +per_frame_34= +per_frame_35=wave_r=sqr(sin(cc+.07*time)); +per_frame_36=wave_g=sqr(sin(cc+.06*time)); +per_frame_37=wave_b=sqr(sin(cc+.05*time)); +per_frame_38=mv_r=.5+.5*sin(1.23*time+4*cc+.011*thccl); +per_frame_39=mv_g=.5+.5*sin(1.32*time+7*cc+.012*thccl); +per_frame_40=mv_b=.5+.5*sin(1.17*time+9*cc+.013*thccl); +per_pixel_1=ak=-sin(6*rad+((q1%5)*3)%5*ang+q1)*(1-rad+.2*sin(.54*q1))*above(rad,0); +per_pixel_2=block=if(below(ak,-.15),ak,0); +per_pixel_3=dx=if(block,x-1.5,.01*sin(24*x+13*y)*sin(3*rad*(q1%5))); +per_pixel_4=dy=if(block,y-1.5,.01*sin(25*x+12*y)*sin(3*rad*(q1%5))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Burning Hus.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Burning Hus.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Burning Hus.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Burning Hus.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,97 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000499 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000416 +fWaveScale=1.000404 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000157 +fShader=0.000000 +zoom=1.010225 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=2.048001 +nMotionVectorsY=47.999996 +mv_dx=-0.080000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=q8=60/fps; +per_frame_2=// timed sidon sensor +per_frame_3=// le = signal level; desired average value = 2 +per_frame_4=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_5=pulse=above(le,th); +per_frame_6=// pulsefreq = running average of interval between last 5 pulses +per_frame_7=pulsefreq=if(equal(pulsefreq,0),2, +per_frame_8=if(pulse,.8*pulsefreq+.2*(time-lastpulse),pulsefreq)); +per_frame_9=lastpulse=if(pulse,time,lastpulse); +per_frame_10=// bt = relative time; 0 = prev beat; 1 = expected beat +per_frame_11=bt=(time-lastbeat)/(.5*beatfreq+.5*pulsefreq); +per_frame_12=// hccp = handcicap for th driven by bt +per_frame_13=hccp=(.03/(bt+.2))+.5*if(band(above(bt,.8),below(bt,1.2)), +per_frame_14=(pow(sin((bt-1)*7.854),4)-1),0); +per_frame_15=beat=band(above(le,th+hccp),btblock); +per_frame_16=btblock=1-above(le,th+hccp); +per_frame_17=lastbeat=if(beat,time,lastbeat); +per_frame_18=beatfreq=if(equal(beatfreq,0),2, +per_frame_19=if(beat,.8*beatfreq+.2*(time-lastbeat),beatfreq)); +per_frame_20=// th = threshold +per_frame_21=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_22=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_23=th=if(above(th,6),6,th); +per_frame_24=thccl=thccl+q8*(th-2.5144); +per_frame_25=leccl=leccl+q8*le; +per_frame_26=btccl=btccl+beat; +per_frame_27=q1=thccl; +per_frame_28=q2=leccl; +per_frame_29=q3=btccl; +per_frame_30=wave_r=sqr(sin(1.5*time+.0037*leccl+3*bccl)); +per_frame_31=wave_g=.5+.5*sin(1.6*time+.0042*leccl+2*bccl); +per_frame_32=wave_b=.5+.5*sin(1.7*time+.0056*leccl+4*bccl); +per_pixel_1=zoom=1.01+q8*.13*sin(.1*q1)*(sin((8+3*sin(q3))*rad)+sin(.1*q2)); +per_pixel_2=rot=.05*q8*sin(.02*q1*sin(q3))*sin((4+3*sin(q3+.03*q2))*rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - burning hus (oil mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - burning hus (oil mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - burning hus (oil mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - burning hus (oil mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,101 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000499 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000416 +fWaveScale=1.000404 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000157 +fShader=0.000000 +zoom=1.010225 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=2.048001 +nMotionVectorsY=47.999996 +mv_dx=-0.080000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=q8=60/fps; +per_frame_2=// timed sidon sensor +per_frame_3=// le = signal level; desired average value = 2 +per_frame_4=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_5=pulse=above(le,th); +per_frame_6=// pulsefreq = running average of interval between last 5 pulses +per_frame_7=pulsefreq=if(equal(pulsefreq,0),2, +per_frame_8=if(pulse,.8*pulsefreq+.2*(time-lastpulse),pulsefreq)); +per_frame_9=lastpulse=if(pulse,time,lastpulse); +per_frame_10=// bt = relative time; 0 = prev beat; 1 = expected beat +per_frame_11=bt=(time-lastbeat)/(.5*beatfreq+.5*pulsefreq); +per_frame_12=// hccp = handcicap for th driven by bt +per_frame_13=hccp=(.03/(bt+.2))+.5*if(band(above(bt,.8),below(bt,1.2)), +per_frame_14=(pow(sin((bt-1)*7.854),4)-1),0); +per_frame_15=beat=band(above(le,th+hccp),btblock); +per_frame_16=btblock=1-above(le,th+hccp); +per_frame_17=lastbeat=if(beat,time,lastbeat); +per_frame_18=beatfreq=if(equal(beatfreq,0),2, +per_frame_19=if(beat,.8*beatfreq+.2*(time-lastbeat),beatfreq)); +per_frame_20=// th = threshold +per_frame_21=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_22=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_23=th=if(above(th,6),6,th); +per_frame_24=thccl=thccl+q8*(th-2.5144); +per_frame_25=leccl=leccl+q8*le; +per_frame_26=btccl=btccl+beat; +per_frame_27=q1=thccl; +per_frame_28=q2=leccl; +per_frame_29=q3=btccl; +per_frame_30=q4=sqr(sin(.0023*leccl)); +per_frame_31=q5=6.28*sqr(sin(.0023*leccl)); +per_frame_32=wave_r=sqr(sin(1.5*time+.0037*leccl+3*bccl)); +per_frame_33=wave_g=.5+.5*sin(1.6*time+.0042*leccl+2*bccl); +per_frame_34=wave_b=.5+.5*sin(1.7*time+.0056*leccl+4*bccl); +per_pixel_1=zoom=1.01+q8*.13*sin(.1*q1)*(sin((8+3*sin(q3))*rad)+sin(.1*q2)); +per_pixel_2=rot=.05*q8*sin(.02*q1*sin(q3))*sin((4+3*sin(q3+.03*q2))*rad); +per_pixel_3=zoom=if(below(abs(rot),.0025),exp(rad-q4),zoom); +per_pixel_4=rot=if(below(abs(rot),.002),ang-q5,rot); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Escape.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Escape.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Escape.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Escape.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,118 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.950000 +fVideoEchoZoom=1.000498 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000416 +fWaveScale=0.608285 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000154 +fShader=0.000000 +zoom=1.000223 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.150000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.050000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=6.400000 +nMotionVectorsY=14.400005 +mv_dx=0.000000 +mv_dy=-0.010000 +mv_l=0.350000 +mv_r=0.900000 +mv_g=0.500000 +mv_b=0.000000 +mv_a=1.000000 +per_frame_1=// timed sidon sensor +per_frame_2=// le = signal level; desired average value = 2 +per_frame_3=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_4=pulse=above(le,th); +per_frame_5=// pulsefreq = running average of interval between last 5 pulses +per_frame_6=pulsefreq=if(equal(pulsefreq,0),2, +per_frame_7=if(pulse,.8*pulsefreq+.2*(time-lastpulse),pulsefreq)); +per_frame_8=lastpulse=if(pulse,time,lastpulse); +per_frame_9=// bt = relative time; 0 = prev beat; 1 = expected beat +per_frame_10=bt=(time-lastbeat)/(.5*beatfreq+.5*pulsefreq); +per_frame_11=// hccp = handcicap for th driven by bt +per_frame_12=hccp=(.03/(bt+.2))+.5*if(band(above(bt,.8),below(bt,1.2)), +per_frame_13=(pow(sin((bt-1)*7.854),4)-1),0); +per_frame_14=beat=band(above(le,th+hccp),btblock); +per_frame_15=btblock=1-above(le,th+hccp); +per_frame_16=lastbeat=if(beat,time,lastbeat); +per_frame_17=beatfreq=if(equal(beatfreq,0),2, +per_frame_18=if(beat,.8*beatfreq+.2*(time-lastbeat),beatfreq)); +per_frame_19=// th = threshold +per_frame_20=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_21=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_22=th=if(above(th,6),6,th); +per_frame_23= +per_frame_24=q8=30/fps; +per_frame_25=ccl=ccl+beat; +per_frame_26=minorccl=minorccl+le*q8; +per_frame_27=q7=ccl+.0002*minorccl; +per_frame_28=q6=3.7*ccl+.01*minorccl; +per_frame_29=ob_size=.3+.3*sin(16*ccl+.007*minorccl); +per_frame_30=ib_a=.5+.4*sin(.01*minorccl+ccl); +per_frame_31=wave_r=.7+.3*sin(.04*ccl+.01*minorccl); +per_frame_32=wave_g=.7+.3*sin(.02*ccl+.012*minorccl); +per_frame_33=wave_b=.3+.3*sin(36*ccl+.013*minorccl); +per_frame_34=ib_r=.25+.25*sin(72*ccl+.016*minorccl); +per_frame_35=ib_g=.25+.25*sin(48*ccl+.021*minorccl); +per_frame_36=ib_b=.5+.3*sin(86*ccl)+.2*(.028*minorccl); +per_frame_37= +per_frame_38=echo_alpha=.5+.5*cos(68*ccl+.0041*minorccl); +per_frame_39=echo_zoom=exp(sin(13.7*ccl+.017*minorccl)); +per_frame_40=echo_orient=ccl%4; +per_frame_41= +per_frame_42=mvrot=ccl%6; +per_frame_43=mv_r=if(above(mvrot,2),if(above(mvrot,4),.039, +per_frame_44=if(equal(mvrot,3),.137,.835)),if(above(mvrot,1),.651, +per_frame_45=if(equal(mvrot,0),1,.773))); +per_frame_46=mv_g=if(above(mvrot,2),if(above(mvrot,4),.267, +per_frame_47=if(equal(mvrot,3),.886,.176)),if(above(mvrot,1),.804, +per_frame_48=if(equal(mvrot,0),1,.38))); +per_frame_49=mv_b=if(above(mvrot,2),if(above(mvrot,4),.694, +per_frame_50=if(equal(mvrot,3),.776,.851)),if(above(mvrot,1),.114, +per_frame_51=if(equal(mvrot,0),1,.145))); +per_pixel_1=zone=below(sin(sin(49*q7)*14*x-sin(36*q7)*14*y),-.2); +per_pixel_2=zoom=1+.33*q8*if(zone,-.5+.1*sin(1.08*q6),.5+.1*sin(.96*q6)); +per_pixel_3=zoomexp=exp(sin(if(zone,q6,-q6))); +per_pixel_4=rot=q8*.03*sin(q6+q7+q7*zone); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - terracarbon stream.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - terracarbon stream.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - terracarbon stream.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/che - terracarbon stream.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,113 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000499 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.030740 +fWaveScale=0.498516 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000158 +fShader=0.000000 +zoom=1.000223 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.100000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.060000 +ib_size=0.035000 +ib_r=0.250000 +ib_g=0.450000 +ib_b=0.250000 +ib_a=0.290000 +nMotionVectorsX=19.199999 +nMotionVectorsY=14.400005 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=2.500000 +mv_r=0.060000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.200000 +per_frame_1=// timed sidon sensor +per_frame_2=// le = signal level; desired average value = 2 +per_frame_3=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_4=pulse=above(le,th); +per_frame_5=// pulsefreq = running average of interval between last 5 pulses +per_frame_6=pulsefreq=if(equal(pulsefreq,0),2, +per_frame_7=if(pulse,.8*pulsefreq+.2*(time-lastpulse),pulsefreq)); +per_frame_8=lastpulse=if(pulse,time,lastpulse); +per_frame_9=// bt = relative time; 0 = prev beat; 1 = expected beat +per_frame_10=bt=(time-lastbeat)/(.5*beatfreq+.5*pulsefreq); +per_frame_11=// hccp = handcicap for th driven by bt +per_frame_12=hccp=(.03/(bt+.2))+.5*if(band(above(bt,.8),below(bt,1.2)), +per_frame_13=(pow(sin((bt-1)*7.854),4)-1),0); +per_frame_14=beat=band(above(le,th+hccp),btblock); +per_frame_15=btblock=1-above(le,th+hccp); +per_frame_16=lastbeat=if(beat,time,lastbeat); +per_frame_17=beatfreq=if(equal(beatfreq,0),2, +per_frame_18=if(beat,.8*beatfreq+.2*(time-lastbeat),beatfreq)); +per_frame_19=// th = threshold +per_frame_20=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_21=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_22=th=if(above(th,6),6,th); +per_frame_23=thccl=thccl+(th-2.5144); +per_frame_24= +per_frame_25=q1=le; +per_frame_26=q2=thccl+.2*leccl; +per_frame_27=leccl=leccl+dle*le; +per_frame_28=dle=if(beat,-dle,dle); +per_frame_29=bccl=bccl+beat; +per_frame_30= +per_frame_31=wave_r=.1+.8*sqr(sin(.011*thccl))+.1*sin(leccl*.061); +per_frame_32=wave_g=.1+.8*sqr(sin(.013*thccl))+.1*cos(leccl*.067); +per_frame_33=wave_b=.1+.8*sqr(cos(.017*thccl))+.1*sin(leccl*.065); +per_frame_34= +per_frame_35=ib_r=ib_r+.1*sin(1.3*time+.012*leccl); +per_frame_36=ib_g=ib_g+.1*sin(1.7*time+.019*leccl); +per_frame_37=ib_b=ib_b+.1*sin(1.9*time+.017*leccl); +per_frame_38=mv_r=.5*(ib_r+wave_r);mv_g=.5*(ib_g+wave_g);mv_b=.5*(ib_b+wave_b); +per_frame_39=mv_a=.5*sqr(sin(.01*leccl+bccl)); +per_frame_40= +per_frame_41=echo_alpha=.5+.2*cos(.07*leccl+.02*thccl); +per_frame_42=eo=if(band(equal(bccl%3,0),beat),rand(4),eo); +per_frame_43=q3=(equal(eo,2)+equal(eo,1))*equal(bccl%2,0); +per_frame_44=q4=(equal(eo,0)+equal(eo,3))*equal(bccl%2,0); +per_frame_45=echo_orient=eo; +per_pixel_1=dqv=above(x,.5)-above(y,.5); +per_pixel_2=rot=sin(sin(rad*(13+5*sin(.01*q2))+.06*q2)*q1*.01); +per_pixel_3=zoom=1+if(q3,dqv,1)*.1*sin(7*ang+.03*q2); +per_pixel_4=zoom=if(q4,if(below(rad,.8*sqr(sin(.016*q2))),.75+.4*cos(.021*q2),zoom),zoom); +per_frame_init_1=dle=1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Watch & Fly.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Watch & Fly.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Watch & Fly.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Che - Watch & Fly.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,125 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.173164 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000416 +fWaveScale=1.105069 +fWaveSmoothing=0.900000 +fWaveParam=-0.560000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000158 +fShader=0.000000 +zoom=1.000223 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.100000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.035000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=8.959999 +nMotionVectorsY=7.200006 +mv_dx=0.080000 +mv_dy=0.060000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=1.000000 +per_frame_1=// sensor - alpha +per_frame_2=// le = signal level; desired average value = 2 +per_frame_3=// th = threshold +per_frame_4=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_5=pulse=band(above(le,th),above(le-th,block)); +per_frame_6=block=le-th; +per_frame_7=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_8=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_9=th=if(above(th,6),6,th); +per_frame_10= +per_frame_11=// pulse cycler +per_frame_12=pcl=if(pulse,pcl+1,pcl); +per_frame_13=q1=pcl; +per_frame_14= +per_frame_15=ib_r=.5+.5*sin(pcl)+.3*sin(time*2.2); +per_frame_16=ib_g=.5+.5*sin(pcl*1.1)+.3*sin(time*2.1); +per_frame_17=ib_b=.5+.5*sin(pcl*1.2)+.3*sin(time*2); +per_frame_18=mv_r=ib_g; +per_frame_19=mv_g=ib_b; +per_frame_20=mv_b=ib_r; +per_frame_21=wave_r=1-ib_r; +per_frame_22=wave_g=1-ib_g; +per_frame_23=wave_b=1-ib_b; +per_frame_24= +per_frame_25=// level cycler +per_frame_26=levccl=levccl+le; +per_frame_27=q2=.1*levccl; +per_frame_28= +per_frame_29=mvx=if(pulse,rand(2)*rand(25),mvx);mv_x=mvx; +per_frame_30=mvy=if(pulse,rand(2)*rand(19),mvy);mv_y=mvy; +per_frame_31= +per_frame_32=q3=.5+.2*sin(23*pcl)+.2*sin(.023*levccl); +per_frame_33=wave_x=q3; +per_frame_34=q4=.5+.2*sin(24*pcl)+.2*sin(.02*levccl); +per_frame_35=wave_y=1-q4; +per_frame_36=thavg=.5*thavg+.5*th; +per_frame_37=q6=.2*thavg; +per_pixel_1=// coordinates transfomation +per_pixel_2=// q3,q4 = position; q6 = 1/size; +per_pixel_3=aang=atan2(y-q4,x-q3); +per_pixel_4=arad=sqrt(sqr(y-q4)+sqr(x-q3))*q6; +per_pixel_5=atx=cos(aang)*arad; +per_pixel_6=aty=sin(aang)*arad; +per_pixel_7= +per_pixel_8=boxzone=below(arad,.1); +per_pixel_9= +per_pixel_10=fxzone=band(band(above(x,.1),below(x,.9)), +per_pixel_11=band(above(y,.1),below(y,9))); +per_pixel_12= +per_pixel_13= +per_pixel_14=zoom=zoom+(1-boxzone)*if(fxzone,(-.2+.3*sin(3*q1)),-.2); +per_pixel_15=rot=(1-boxzone)*fxzone*(3.142*sin(12*q1)); +per_pixel_16= +per_pixel_17=dx=.01*bor(band(above(x,.05),below(x,.1)),above +per_pixel_18=(x,.95))-.01*bor(below(x,.05),band(above(x,.9),below(x,.95))); +per_pixel_19=dy=.01*bor(band(above(y,.05),below(y,.1)),above +per_pixel_20=(y,.95))-.01*bor(below(y,.05),band(above(y,.9),below(y,.95))); +per_pixel_21= +per_pixel_22=dx=if(boxzone,.1*atx,dx+fxzone*(.05*sin(q1+(9+4*sin(q1*2.3))*x+ +per_pixel_23=(6+3*sin(q1*2.4))*y+q2)+sin(q1*13))); +per_pixel_24=dy=if(boxzone,.1*aty,dy+fxzone*(.05*sin(q1+(8+4*sin(q1*2.2))*x+ +per_pixel_25=(5+3*sin(q1*2.1))*y+q2*1.2)+sin(q1*14))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/CrystalHigh - mad ravetriping.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/CrystalHigh - mad ravetriping.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/CrystalHigh - mad ravetriping.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/CrystalHigh - mad ravetriping.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,86 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.000000 +fDecay=0.963999 +fVideoEchoZoom=1.902700 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=33.469448 +fWaveScale=100.000000 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.240000 +fModWaveAlphaEnd=1.300001 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.009514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.035000 +ob_r=0.340000 +ob_g=0.340000 +ob_b=0.340000 +ob_a=0.380000 +ib_size=0.020000 +ib_r=0.340000 +ib_g=0.340000 +ib_b=0.340000 +ib_a=0.210000 +nMotionVectorsX=28.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=MyVolume = min(bass+mid+treb,5); +per_frame_2=decay = 1 - 0.01*MyVolume; +per_frame_3=wave_r = 0.30 + 0.15*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_4=wave_r = if(above(bass,1.2),wave_r + 0.35,wave_r); +per_frame_5=wave_g = 0.30 + 0.15*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_6=wave_b = 0.30 + 0.15*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_7=wave_b = if(above(wave_r,0.8),wave_b-0.25,wave_b); +per_frame_8=ib_a = max(sin(time),0); +per_frame_9=ib_size = 0.010 + 0.002*MyVolume; +per_frame_10=ob_a = 0.380 + 0.1*MyVolume; +per_frame_11=ob_size = 0.050 - 0.004*MyVoulme; +per_frame_12=ib_r = 0.340 + 0.2*sin(time*0.5413); +per_frame_13=ib_g = 0.340 + 0.2*sin(time*0.6459); +per_frame_14=ib_b = 0.340 + 0.2*sin(time*0.7354); +per_frame_15=ob_r = 0.340 + 0.2*sin(time*0.7251); +per_frame_16=ob_r = if(above(bass,1.2),ob_r + 0.35,ob_r); +per_frame_17=ob_g = 0.340 + 0.2*sin(time*0.5315); +per_frame_18=ob_b = 0.340 + 0.2*sin(time*0.6349); +per_frame_19=ob_b = if(above(ob_r,0.8),ob_b-0.25,ob_b); +per_frame_20=zoom = max(sin(bass-bass_residual*10),0.2); +per_frame_21=rot = mid_residual*2.5; +per_frame_22=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_23=bass_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*bass_residual; +per_frame_24=mid_thresh = above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*0.92+1.3); +per_frame_25=mid_residual = equal(mid_thresh,2)*0.013*sin(time*7) + (1-equal(mid_thresh,2))*mid_residual; +per_frame_26=monitor = zoom; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/DaNOnE - Highway to Heaven (rotating).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/DaNOnE - Highway to Heaven (rotating).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/DaNOnE - Highway to Heaven (rotating).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/DaNOnE - Highway to Heaven (rotating).milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,59 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.980000 +fVideoEchoZoom=1.169360 +fVideoEchoAlpha=0.300000 +nVideoEchoOrientation=3 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=2 +nMotionVectorsY=2 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.220039 +fWaveScale=1.170433 +fWaveSmoothing=0.684000 +fWaveParam=-0.040000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.053000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.263000 +sx=1.000000 +sy=1.000000 +wave_r=0.010000 +wave_g=0.100000 +wave_b=0.900000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.370000 +ob_g=0.460000 +ob_b=0.350000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.100000 +ib_g=0.000000 +ib_b=0.300000 +ib_a=1.000000 +per_frame_1=ib_size = ib_size + (0.05*bass); +per_frame_2=rot = rot + 0.3*sin(time); +per_frame_3=warp = warp + treb diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Changing Polyevolution.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Changing Polyevolution.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Changing Polyevolution.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Changing Polyevolution.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,95 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.220183 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.241455 +fWaveSmoothing=0.000000 +fWaveParam=-0.261032 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.526528 +wave_g=0.324083 +wave_b=0.134239 +wave_x=0.482812 +wave_y=0.467471 +ob_size=0.004500 +ob_r=0.071102 +ob_g=0.089654 +ob_b=0.514650 +ob_a=0.985207 +ib_size=0.005000 +ib_r=0.491715 +ib_g=0.022579 +ib_b=0.569085 +ib_a=0.949768 +nMotionVectorsX=3.000000 +nMotionVectorsY=48.000000 +mv_dx=-0.505893 +mv_dy=-0.993957 +mv_l=5.000000 +mv_r=0.835033 +mv_g=0.249397 +mv_b=0.055806 +mv_a=0.175581 +per_frame_1=wave_r = wave_r + 0.45*( 0.6*sin(1.517*time) + 0.4*mid_effect ); +per_frame_2=wave_b = wave_b + 0.45*( 0.6*sin(1.088*time) + 0.4*bass_effect ); +per_frame_3=wave_g = wave_g + 0.45*( 0.6*sin(1.037*time) + 0.4*treb_effect ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.020*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*below(frame%5,1); +per_frame_7=volume = 0.3*(bass+mid+att); +per_frame_8=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_9=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_10=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_11=peakbass_att = max(bass_att,peakbass_att); +per_frame_12=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_13=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_14=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_15=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_16=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_17=effect = if(beat,effect+rand(5)+1,effect); +per_frame_18=effect = if(above(effect,5),effect-6,effect); +per_frame_19=q1 = effect+2; +per_frame_20=monitor = q1; +per_frame_21=wave_mode = wave_g * wave_b; +per_frame_22=wave_r = time + treb; +per_frame_23=wave_r=if(below(wave_r,0.0), 0.0, wave_r); +per_frame_24=wave_r=if(above(wave_r,1.0), 1.0, wave_r); +per_frame_25=wave_mode=if(below(wave_mode,0), 0, wave_mode); +per_frame_26=wave_mode=if(above(wave_mode,7.0), 7.0, wave_mode); +per_frame_27=wave_r=if(below(wave_r,0.0), 0.0, wave_r); +per_frame_28=wave_r=if(above(wave_r,1.0), 1.0, wave_r); +per_pixel_1=zoom=zoom+0.04*sin(ang*int(q1)+time*2.6); +per_pixel_2=cy = x * b; +per_pixel_3=cy=if(below(cy,-1.0), -1.0, cy); +per_pixel_4=cy=if(above(cy,2.0), 2.0, cy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Look mama I'm on TV! 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Look mama I'm on TV! 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Look mama I'm on TV! 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Look mama I'm on TV! 2.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,98 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=100.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.640100 +fWaveSmoothing=0.270000 +fWaveParam=-0.250278 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995700 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=1.000000 +dy=1.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.840465 +wave_g=0.977183 +wave_b=0.577708 +wave_x=0.681590 +wave_y=0.841076 +ob_size=0.010000 +ob_r=0.364951 +ob_g=0.522256 +ob_b=0.961900 +ob_a=0.345787 +ib_size=0.000000 +ib_r=0.691402 +ib_g=0.523066 +ib_b=0.706478 +ib_a=0.808526 +nMotionVectorsX=0.000000 +nMotionVectorsY=48.000000 +mv_dx=0.479713 +mv_dy=-0.559295 +mv_l=5.000000 +mv_r=0.376825 +mv_g=0.651550 +mv_b=0.954265 +mv_a=0.602945 +per_frame_1=ob_r = 0.9 - 0.7*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.6- 0.4*sin(time*2.924); +per_frame_3=ob_b = 0.35 - 0.3*cos(time*0.816); +per_frame_4=cx = cx - 0.4*sin(time*0.342); +per_frame_5=cy = cy + 0.6*sin(time*0.433); +per_frame_6=warp =0; +per_frame_7=ib_size = 0.08; +per_frame_8=ib_r = ib_r + 0.5*sin(time*3.034); +per_frame_9=ib_g = ib_g + 0.5*sin(time*2.547); +per_frame_10=ib_b = ib_b - 0.5*sin(time*1.431); +per_frame_11=dx = dx -0.008*sin(time*0.23); +per_frame_12=dy = dy - 0.008*sin(time*0.2); +per_frame_13=dy = wave_r * wave_g; +per_frame_14=wave_g = treb - wave_r; +per_frame_15=wave_b = wave_r * bass; +per_frame_16=dy=if(below(dy,-1), -1, dy); +per_frame_17=dy=if(above(dy,1.0), 1.0, dy); +per_frame_18=wave_b=if(below(wave_b,0.0), 0.0, wave_b); +per_frame_19=wave_b=if(above(wave_b,1.0), 1.0, wave_b); +per_frame_20=wave_g=if(below(wave_g,0.0), 0.0, wave_g); +per_frame_21=wave_g=if(above(wave_g,1.0), 1.0, wave_g); +per_frame_22=wave_g=if(below(wave_g,0.0), 0.0, wave_g); +per_frame_23=wave_g=if(above(wave_g,1.0), 1.0, wave_g); +per_frame_24=wave_b=if(below(wave_b,0.0), 0.0, wave_b); +per_frame_25=wave_b=if(above(wave_b,1.0), 1.0, wave_b); +per_pixel_1=box=(1-rad)+0.7*abs(x*3-0.4*sin(q1))%2 + 0.8*abs(y*3+0.4*sin(q1))%2; +per_pixel_2=q1 = 8.05+(sin(x+0.137*time)-cos(y+0.513*time)); +per_pixel_3=zoom = if(above(box,1),q1*.1,zoom); +per_pixel_4=rot = if(above(box,1),1*sin(0.385*time)-time*.1,rot); +per_pixel_5=zoom = b + y*1.2; +per_pixel_6=dx = time * a; +per_pixel_7=zoom=if(below(zoom,0.01), 0.01, zoom); +per_pixel_8=zoom=if(above(zoom,100), 100, zoom); +per_pixel_9=dx=if(below(dx,-1), -1, dx); +per_pixel_10=dx=if(above(dx,1.0), 1.0, dx); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - They're so cute Dad can I keep one!.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - They're so cute Dad can I keep one!.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - They're so cute Dad can I keep one!.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - They're so cute Dad can I keep one!.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,106 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.940000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=4 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=2.651498 +fWaveSmoothing=0.000000 +fWaveParam=-0.180163 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.999997 +sx=0.578528 +sy=1.030301 +wave_r=0.610115 +wave_g=0.337971 +wave_b=0.298628 +wave_x=0.671479 +wave_y=0.725962 +ob_size=0.030000 +ob_r=0.148379 +ob_g=0.786533 +ob_b=0.637879 +ob_a=0.973918 +ib_size=0.045000 +ib_r=0.841289 +ib_g=0.297099 +ib_b=0.775799 +ib_a=0.238807 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.598910 +mv_dy=0.978744 +mv_l=0.500000 +mv_r=0.296168 +mv_g=0.490016 +mv_b=0.461879 +mv_a=0.573571 +per_frame_1=wave_r = wave_r + 0.45*( 0.6*sin(1.517*time) + 0.4*mid_effect ); +per_frame_2=wave_b = wave_b + 0.45*( 0.6*sin(1.088*time) + 0.4*bass_effect ); +per_frame_3=wave_g = wave_g + 0.45*( 0.6*sin(1.037*time) + 0.4*treb_effect ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.020*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*below(frame%5,1); +per_frame_7=volume = 0.3*(bass+mid+att); +per_frame_8=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_9=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_10=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_11=peakbass_att = max(bass_att,peakbass_att); +per_frame_12=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_13=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_14=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_15=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_16=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_17=effect = if(beat,effect+rand(5)+1,effect); +per_frame_18=effect = if(above(effect,5),effect-6,effect); +per_frame_19=q1 = effect+2; +per_frame_20=monitor = q1; +per_frame_21=wave_y = treb + wave_b; +per_frame_22=wave_y=if(below(wave_y,0.0), 0.0, wave_y); +per_frame_23=wave_y=if(above(wave_y,1.0), 1.0, wave_y); +per_frame_24=wave_y=if(below(wave_y,0.0), 0.0, wave_y); +per_frame_25=wave_y=if(above(wave_y,1.0), 1.0, wave_y); +per_pixel_1=zoom=zoom+0.04*sin(ang*int(q1)+time*2.6); +per_pixel_2=cy = q1 * warp; +per_pixel_3=cy = cy * rad; +per_pixel_4=cx = a * bass_att; +per_pixel_5=dy = warp + time; +per_pixel_6=zoomexp = bass_att + a; +per_pixel_7=rot = a * bass_att; +per_pixel_8=rot = rot * y; +per_pixel_9=zoomexp=if(below(zoomexp,0.01), 0.01, zoomexp); +per_pixel_10=zoomexp=if(above(zoomexp,100.0), 100.0, zoomexp); +per_pixel_11=rot=if(below(rot,-1.0), -1.0, rot); +per_pixel_12=rot=if(above(rot,1.0), 1.0, rot); +per_pixel_13=cx=if(below(cx,-1.0), -1.0, cx); +per_pixel_14=cx=if(above(cx,2.0), 2.0, cx); +per_pixel_15=cy=if(below(cy,-1.0), -1.0, cy); +per_pixel_16=cy=if(above(cy,2.0), 2.0, cy); +per_pixel_17=dy=if(below(dy,-1), -1, dy); +per_pixel_18=dy=if(above(dy,1.0), 1.0, dy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Turbulence Sandwich.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Turbulence Sandwich.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Turbulence Sandwich.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EMPR - Random - Turbulence Sandwich.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,140 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.950000 +fVideoEchoZoom=3.007504 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.880224 +fWaveSmoothing=0.000000 +fWaveParam=0.933237 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.074097 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.541826 +wave_g=0.907035 +wave_b=0.436348 +wave_x=0.911091 +wave_y=0.486312 +ob_size=0.010000 +ob_r=0.429397 +ob_g=0.567931 +ob_b=0.857834 +ob_a=0.309108 +ib_size=0.010000 +ib_r=0.331510 +ib_g=0.272420 +ib_b=0.199382 +ib_a=0.856912 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=-0.523285 +mv_dy=-0.160162 +mv_l=0.055000 +mv_r=0.934155 +mv_g=0.462715 +mv_b=0.821308 +mv_a=0.850204 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + .5*sin(time*333) + bass*.3; +per_frame_3=wave_g = wave_g + .5*sin(time*222) + treb*.3; +per_frame_4=wave_b = wave_b + .5*sin(time*111) + mid*.3; +per_frame_5=rot = .4*sin(mid_att*.05); +per_frame_6=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_7=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_8=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_9=// Appended Code From C:\Program Files\Winamp\Plugins\MilkDrop\Self\Turbulence.milk +per_frame_10=wave_b = if(equal(bass + wave_y , bass + bass) , min(min(bass * treb , time * treb_att) , time + wave_g) , treb_att * treb); +per_frame_11=ob_g = max(if(below(frame - bass_att , wave_g * bass) , time + treb , wave_y * wave_g) , wave_y * wave_r); +per_frame_12=wave_g = if(below(wave_r + time , treb - bass_att) , treb_att * treb , bass * bass); +per_frame_13=ib_a = min(min(wave_g * wave_r , treb * mid) , wave_g - warp); +per_frame_14=wave_r = if(below(bass + bass_att , wave_b + frame) , wave_b * bass_att , wave_g * treb); +per_frame_15=mv_x = 12 + bass_att - warp; +per_frame_16=ob_a = max(bass * time , bass_att * wave_b); +per_frame_17=ib_G = treb + warp; +per_frame_18=dy = 0 + if(equal(treb + bass , mid_att * zoom) , bass_att - bass , bass_att - treb); +per_frame_19=wave_r = if(below(wave_r * treb_att , wave_b + frame) , min(zoom + wave_g , wave_g * bass) , wave_b - warp); +per_frame_20=ob_g = max(if(equal(ob_g + wave_y , wave_b + wave_b) , wave_y + wave_b , wave_g * warp) , treb * wave_g); +per_frame_21=wave_y = if(above(treb * treb , treb + treb) , wave_r * frame , mid * wave_x); +per_frame_22=dy=if(below(dy,-1), -1, dy); +per_frame_23=dy=if(above(dy,1.0), 1.0, dy); +per_frame_24=wave_r=if(below(wave_r,0.0), 0.0, wave_r); +per_frame_25=wave_r=if(above(wave_r,1.0), 1.0, wave_r); +per_frame_26=wave_b=if(below(wave_b,0.0), 0.0, wave_b); +per_frame_27=wave_b=if(above(wave_b,1.0), 1.0, wave_b); +per_frame_28=wave_g=if(below(wave_g,0.0), 0.0, wave_g); +per_frame_29=wave_g=if(above(wave_g,1.0), 1.0, wave_g); +per_frame_30=wave_y=if(below(wave_y,0.0), 0.0, wave_y); +per_frame_31=wave_y=if(above(wave_y,1.0), 1.0, wave_y); +per_frame_32=ob_g=if(below(ob_g,0.0), 0.0, ob_g); +per_frame_33=ob_g=if(above(ob_g,1.0), 1.0, ob_g); +per_frame_34=ob_a=if(below(ob_a,0.0), 0.0, ob_a); +per_frame_35=ob_a=if(above(ob_a,1.0), 1.0, ob_a); +per_frame_36=ib_g=if(below(ib_g,0.0), 0.0, ib_g); +per_frame_37=ib_g=if(above(ib_g,1.0), 1.0, ib_g); +per_frame_38=ib_a=if(below(ib_a,0.0), 0.0, ib_a); +per_frame_39=ib_a=if(above(ib_a,1.0), 1.0, ib_a); +per_frame_40=mv_x=if(below(mv_x,0.0), 0.0, mv_x); +per_frame_41=mv_x=if(above(mv_x,64.0), 64.0, mv_x); +per_frame_42=wave_r=if(below(wave_r,0.0), 0.0, wave_r); +per_frame_43=wave_r=if(above(wave_r,1.0), 1.0, wave_r); +per_frame_44=wave_g=if(below(wave_g,0.0), 0.0, wave_g); +per_frame_45=wave_g=if(above(wave_g,1.0), 1.0, wave_g); +per_frame_46=wave_b=if(below(wave_b,0.0), 0.0, wave_b); +per_frame_47=wave_b=if(above(wave_b,1.0), 1.0, wave_b); +per_frame_48=ob_g=if(below(ob_g,0.0), 0.0, ob_g); +per_frame_49=ob_g=if(above(ob_g,1.0), 1.0, ob_g); +per_frame_50=wave_y=if(below(wave_y,0.0), 0.0, wave_y); +per_frame_51=wave_y=if(above(wave_y,1.0), 1.0, wave_y); +per_frame_52=wave_b=if(below(wave_b,0.0), 0.0, wave_b); +per_frame_53=wave_b=if(above(wave_b,1.0), 1.0, wave_b); +per_frame_54=wave_g=if(below(wave_g,0.0), 0.0, wave_g); +per_frame_55=wave_g=if(above(wave_g,1.0), 1.0, wave_g); +per_frame_56=wave_r=if(below(wave_r,0.0), 0.0, wave_r); +per_frame_57=wave_r=if(above(wave_r,1.0), 1.0, wave_r); +per_frame_58=ob_a=if(below(ob_a,0.0), 0.0, ob_a); +per_frame_59=ob_a=if(above(ob_a,1.0), 1.0, ob_a); +per_frame_60=ob_g=if(below(ob_g,0.0), 0.0, ob_g); +per_frame_61=ob_g=if(above(ob_g,1.0), 1.0, ob_g); +per_frame_62=ib_G=if(below(ib_G,0.0), 0.0, ib_G); +per_frame_63=ib_G=if(above(ib_G,1.0), 1.0, ib_G); +per_frame_64=wave_y=if(below(wave_y,0.0), 0.0, wave_y); +per_frame_65=wave_y=if(above(wave_y,1.0), 1.0, wave_y); +per_frame_66=ib_a=if(below(ib_a,0.0), 0.0, ib_a); +per_frame_67=ib_a=if(above(ib_a,1.0), 1.0, ib_a); +per_pixel_1=ray = pow(rad,1.8)+.05; +per_pixel_2=zoom = (ray/rad)*1.4 + .3*sin(ang*(bass*5))+(bass*.2); +per_pixel_3=rot=0; +per_pixel_4=dx = ((x-.5)+(y-.5)*.25*sin(time/10))*(2+.1*treb_att); +per_pixel_5=dy=(y-.5)*(2-.1*treb_att); +per_pixel_6=zoom =1; +per_pixel_7=; +per_pixel_8=warp = 1 + if(above(q1 * b , sx * y) , zoomexp * a , bass_att * warp); +per_pixel_9=warp=if(below(warp,0.01), 0.01, warp); +per_pixel_10=warp=if(above(warp,100.0), 100.0, warp); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 03 music.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 03 music.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 03 music.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 03 music.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,540 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.960000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.011726 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.037492 +fWarpScale=0.014889 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.033004 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.400000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.110000 +ob_g=0.000000 +ob_b=0.100000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=3.000000 +nMotionVectorsY=2.000000 +mv_dx=0.020000 +mv_dy=-0.020000 +mv_l=0.150000 +mv_r=0.490000 +mv_g=0.480000 +mv_b=0.300001 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.100000 +wavecode_0_g=1.000000 +wavecode_0_b=0.700000 +wavecode_0_a=1.000000 +wave_0_per_frame1=t1=sin(time)*0.5+0.5; +wave_0_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_0_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_0_per_frame4= +wave_0_per_frame5=t4=sin(-time+1.1)*0.5+0.5; +wave_0_per_frame6=t5=sin(-time+3.1)*0.5+0.5; +wave_0_per_frame7=t6=sin(-time+5.2)*0.5+0.5; +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2=phs=-sample * 0.2; +wave_0_per_point3=tm=q1 + phs; +wave_0_per_point4= +wave_0_per_point5=flip=flip+1; +wave_0_per_point6=flip=flip*below(flip,2); +wave_0_per_point7= +wave_0_per_point8=xp=0; +wave_0_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_0_per_point10=zp=0; +wave_0_per_point11= +wave_0_per_point12=//wrist movement; +wave_0_per_point13=ang=sin(tm*2)*0.5 +0.5; +wave_0_per_point14= +wave_0_per_point15=xq=xp; +wave_0_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point17=yq=yp*sinang + zp*cosang; +wave_0_per_point18=zq=yp*cosang - zp*sinang; +wave_0_per_point19=yq=yp; +wave_0_per_point20=zq=zp; +wave_0_per_point21= +wave_0_per_point22=ang=tm*8; +wave_0_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point24=xp=xq*sinang + yq*cosang; +wave_0_per_point25=yp=xq*cosang - yq*sinang; +wave_0_per_point26=zp=zq; +wave_0_per_point27= +wave_0_per_point28=//forearm movement; +wave_0_per_point29=zp=zp-0.3; +wave_0_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_0_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point32=xq=xp; +wave_0_per_point33=yq=yp*sinang + zp*cosang; +wave_0_per_point34=zq=yp*cosang - zp*sinang; +wave_0_per_point35= +wave_0_per_point36=//upper arm twist +wave_0_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_0_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point39=xp=xq*sinang + yq*cosang; +wave_0_per_point40=yp=xq*cosang - yq*sinang; +wave_0_per_point41=zp=zq; +wave_0_per_point42= +wave_0_per_point43=//upper arm outward; +wave_0_per_point44=zp=zp-0.35; +wave_0_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_0_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point47=xq=xp*sinang + zp*cosang; +wave_0_per_point48=yq=yp; +wave_0_per_point49=zq=xp*cosang - zp*sinang; +wave_0_per_point50= +wave_0_per_point51=//upper arm up down; +wave_0_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_0_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point54=xp=xq; +wave_0_per_point55=yp=yq*cosang - zq*sinang; +wave_0_per_point56=zp=yq*sinang + zq*cosang; +wave_0_per_point57= +wave_0_per_point58=//xp=xq;yp=yq;zp=zq; +wave_0_per_point59= +wave_0_per_point60= +wave_0_per_point61=//project into screenspace and draw on screen +wave_0_per_point62=zp=zp+2; +wave_0_per_point63=xs=xp/zp; +wave_0_per_point64=ys=yp/zp; +wave_0_per_point65= +wave_0_per_point66=x=xs+0.5; +wave_0_per_point67=y=ys*1.3+0.5; +wave_0_per_point68= +wave_0_per_point69= +wave_0_per_point70=a=(1-sample); +wave_0_per_point71= +wave_0_per_point72=b=b+pow(1-sample,2)*0.3; +wave_0_per_point73= +wave_0_per_point74= +wave_0_per_point75= +wave_0_per_point76=r1=t1; +wave_0_per_point77=g1=t2; +wave_0_per_point78=b1=t3; +wave_0_per_point79=r2=t4; +wave_0_per_point80=g2=t5; +wave_0_per_point81=b2=t6; +wave_0_per_point82= +wave_0_per_point83=r=r1*flip + r2*(1-flip); +wave_0_per_point84=g=g1*flip + g2*(1-flip); +wave_0_per_point85=b=b1*flip + b2*(1-flip); +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.200000 +wavecode_1_g=1.000000 +wavecode_1_b=0.600000 +wavecode_1_a=1.000000 +wave_1_per_frame1=t1=sin(time)*0.5+0.5; +wave_1_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_1_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_1_per_frame4= +wave_1_per_frame5=t4=sin(-time+1.1)*0.5+0.5; +wave_1_per_frame6=t5=sin(-time+3.1)*0.5+0.5; +wave_1_per_frame7=t6=sin(-time+5.2)*0.5+0.5; +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2=phs=-sample * 0.2; +wave_1_per_point3=tm=q1 + phs; +wave_1_per_point4= +wave_1_per_point5=flip=flip+1; +wave_1_per_point6=flip=flip*below(flip,2); +wave_1_per_point7= +wave_1_per_point8=xp=0; +wave_1_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2 +0.1; +wave_1_per_point10=yp=-yp; +wave_1_per_point11=zp=0; +wave_1_per_point12= +wave_1_per_point13=//wrist movement; +wave_1_per_point14=ang=sin(tm*2)*0.5 +0.5; +wave_1_per_point15= +wave_1_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point17=xq=xp; +wave_1_per_point18=yq=yp*sinang + zp*cosang; +wave_1_per_point19=zq=yp*cosang - zp*sinang; +wave_1_per_point20=yq=yp; +wave_1_per_point21=zq=zp; +wave_1_per_point22= +wave_1_per_point23=ang=tm*8; +wave_1_per_point24=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point25=xp=xq*sinang + yq*cosang; +wave_1_per_point26=yp=xq*cosang - yq*sinang; +wave_1_per_point27=zp=zq; +wave_1_per_point28= +wave_1_per_point29=//forearm movement; +wave_1_per_point30=zp=zp-0.3; +wave_1_per_point31=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_1_per_point32=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point33=xq=xp; +wave_1_per_point34=yq=yp*sinang + zp*cosang; +wave_1_per_point35=zq=yp*cosang - zp*sinang; +wave_1_per_point36= +wave_1_per_point37=//upper arm twist +wave_1_per_point38=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_1_per_point39=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point40=xp=xq*sinang + yq*cosang; +wave_1_per_point41=yp=xq*cosang - yq*sinang; +wave_1_per_point42=zp=zq; +wave_1_per_point43= +wave_1_per_point44=//upper arm outward; +wave_1_per_point45=zp=zp-0.35; +wave_1_per_point46=ang=cos(tm*2.3)*1.75 - 1.05; +wave_1_per_point47=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point48=xq=xp*sinang + zp*cosang; +wave_1_per_point49=yq=yp; +wave_1_per_point50=zq=xp*cosang - zp*sinang; +wave_1_per_point51= +wave_1_per_point52=//upper arm up down; +wave_1_per_point53=ang=cos(tm)*0.5 - 0.5; +wave_1_per_point54=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point55=xp=xq; +wave_1_per_point56=yp=yq*cosang - zq*sinang; +wave_1_per_point57=zp=yq*sinang + zq*cosang; +wave_1_per_point58= +wave_1_per_point59=//xp=xq;yp=yq;zp=zq; +wave_1_per_point60= +wave_1_per_point61= +wave_1_per_point62=//project into screenspace and draw on screen +wave_1_per_point63=zp=zp+2; +wave_1_per_point64=xs=xp/zp; +wave_1_per_point65=ys=yp/zp; +wave_1_per_point66= +wave_1_per_point67=x=xs+0.5; +wave_1_per_point68=y=ys*1.3+0.5; +wave_1_per_point69= +wave_1_per_point70= +wave_1_per_point71=a=(1-sample); +wave_1_per_point72= +wave_1_per_point73= +wave_1_per_point74=b=b+pow(1-sample,2)*0.3; +wave_1_per_point75= +wave_1_per_point76=r1=t1; +wave_1_per_point77=g1=t2; +wave_1_per_point78=b1=t3; +wave_1_per_point79=r2=t4; +wave_1_per_point80=g2=t5; +wave_1_per_point81=b2=t6; +wave_1_per_point82= +wave_1_per_point83=r=r1*flip + r2*(1-flip); +wave_1_per_point84=g=g1*flip + g2*(1-flip); +wave_1_per_point85=b=b1*flip + b2*(1-flip); +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=1 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=0.600000 +wavecode_2_b=0.100000 +wavecode_2_a=1.000000 +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2=tm=q1; +wave_2_per_point3=phs=-sample*0.5; +wave_2_per_point4= +wave_2_per_point5=flip=flip+1; +wave_2_per_point6=flip=flip*below(flip,2); +wave_2_per_point7= +wave_2_per_point8=xp=0; +wave_2_per_point9=yp=flip*0.1; +wave_2_per_point10=zp=0; +wave_2_per_point11= +wave_2_per_point12=//wrist movement; +wave_2_per_point13=ang=sin(tm*2+phs - 2)*0.5 +0.5 + 2; +wave_2_per_point14= +wave_2_per_point15=xq=xp; +wave_2_per_point16=yq=yp*sin(ang) + zp*cos(ang); +wave_2_per_point17=zq=yp*cos(ang) - zp*sin(ang); +wave_2_per_point18= +wave_2_per_point19=ang=cos(tm*2+phs - 2)*1.5 ; +wave_2_per_point20=xp=xq*sin(ang) + yq*cos(ang); +wave_2_per_point21=yp=xq*cos(ang) - yq*sin(ang); +wave_2_per_point22=zp=zq; +wave_2_per_point23= +wave_2_per_point24=//forearm movement; +wave_2_per_point25=zp=zp-0.3; +wave_2_per_point26=ang=3.14 + sin(tm*2+phs - 0.5)*1.5; +wave_2_per_point27=xq=xp; +wave_2_per_point28=yq=yp*sin(ang) + zp*cos(ang); +wave_2_per_point29=zq=yp*cos(ang) - zp*sin(ang); +wave_2_per_point30= +wave_2_per_point31=//upper arm twist +wave_2_per_point32=ang=-1.0 + cos(tm*3 + 0.5 +phs + 0.5); +wave_2_per_point33=xp=xq*sin(ang) + yq*cos(ang); +wave_2_per_point34=yp=xq*cos(ang) - yq*sin(ang); +wave_2_per_point35=zp=zq; +wave_2_per_point36= +wave_2_per_point37=//upper arm outward; +wave_2_per_point38=zp=zp-0.35; +wave_2_per_point39=ang=cos(tm*2+phs)*0.75 - 1.05; +wave_2_per_point40=xq=xp*sin(ang) + zp*cos(ang); +wave_2_per_point41=yq=yp; +wave_2_per_point42=zq=xp*cos(ang) - zp*sin(ang); +wave_2_per_point43= +wave_2_per_point44=//upper arm up down; +wave_2_per_point45=ang=cos(tm+phs)*0.5 - 0.5; +wave_2_per_point46=xp=xq; +wave_2_per_point47=yp=yq*cos(ang) - zq*sin(ang); +wave_2_per_point48=zp=yq*sin(ang) + zq*cos(ang); +wave_2_per_point49= +wave_2_per_point50=//xp=xq;yp=yq;zp=zq; +wave_2_per_point51= +wave_2_per_point52= +wave_2_per_point53=//project into screenspace and draw on screen +wave_2_per_point54=zp=zp+2; +wave_2_per_point55=xs=xp/zp; +wave_2_per_point56=ys=yp/zp; +wave_2_per_point57= +wave_2_per_point58=x=xs+0.5; +wave_2_per_point59=y=ys*1.3+0.5; +wave_2_per_point60= +wave_2_per_point61= +wave_2_per_point62=a=(1-sample)*0.05 +wave_2_per_point63= +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=1 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=0.300000 +wavecode_3_b=0.100000 +wavecode_3_a=1.000000 +wave_3_per_point1=n=sample*6.283; +wave_3_per_point2=tm=q1 ; +wave_3_per_point3=phs=-sample*0.5; +wave_3_per_point4= +wave_3_per_point5=flip=flip+1; +wave_3_per_point6=flip=flip*below(flip,2); +wave_3_per_point7= +wave_3_per_point8=xp=0; +wave_3_per_point9=yp=flip*0.1; +wave_3_per_point10=zp=0; +wave_3_per_point11= +wave_3_per_point12=//wrist movement; +wave_3_per_point13=ang=sin(tm*2+phs-2)*0.5 +0.5 + 2; +wave_3_per_point14= +wave_3_per_point15=xq=xp; +wave_3_per_point16=yq=yp*sin(ang) + zp*cos(ang); +wave_3_per_point17=zq=yp*cos(ang) - zp*sin(ang); +wave_3_per_point18= +wave_3_per_point19=ang=cos(tm*2+phs-2)*1.5; +wave_3_per_point20=xp=xq*sin(ang) + yq*cos(ang); +wave_3_per_point21=yp=xq*cos(ang) - yq*sin(ang); +wave_3_per_point22=zp=zq; +wave_3_per_point23= +wave_3_per_point24=//forearm movement; +wave_3_per_point25=zp=zp-0.3; +wave_3_per_point26=ang=3.14 + sin(tm*2+phs-0.5)*1.5; +wave_3_per_point27=xq=xp; +wave_3_per_point28=yq=yp*sin(ang) + zp*cos(ang); +wave_3_per_point29=zq=yp*cos(ang) - zp*sin(ang); +wave_3_per_point30= +wave_3_per_point31=//upper arm twist +wave_3_per_point32=ang=-1.0 + cos(tm*3 + 0.5 +phs); +wave_3_per_point33=xp=xq*sin(ang) + yq*cos(ang); +wave_3_per_point34=yp=xq*cos(ang) - yq*sin(ang); +wave_3_per_point35=zp=zq; +wave_3_per_point36= +wave_3_per_point37=//upper arm outward; +wave_3_per_point38=zp=zp-0.35; +wave_3_per_point39=ang=cos(tm*2+phs)*0.75 - 1.05; +wave_3_per_point40=xq=xp*sin(ang) + zp*cos(ang); +wave_3_per_point41=yq=yp; +wave_3_per_point42=zq=xp*cos(ang) - zp*sin(ang); +wave_3_per_point43= +wave_3_per_point44=//upper arm up down; +wave_3_per_point45=ang=cos(tm+phs)*0.5 - 0.5; +wave_3_per_point46=xp=xq; +wave_3_per_point47=yp=yq*cos(ang) - zq*sin(ang); +wave_3_per_point48=zp=yq*sin(ang) + zq*cos(ang); +wave_3_per_point49= +wave_3_per_point50=//xp=xq;yp=yq;zp=zq; +wave_3_per_point51= +wave_3_per_point52= +wave_3_per_point53=//project into screenspace and draw on screen +wave_3_per_point54=zp=zp+2; +wave_3_per_point55=xs=xp/zp; +wave_3_per_point56=ys=yp/zp; +wave_3_per_point57= +wave_3_per_point58=x=-xs+0.5; +wave_3_per_point59=y=ys*1.3+0.5; +wave_3_per_point60= +wave_3_per_point61= +wave_3_per_point62=a=(1-sample)*0.05; +wave_3_per_point63= +shapecode_0_enabled=1 +shapecode_0_sides=5 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.067790 +shapecode_0_ang=0.753982 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=0.779769 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang=sin(q1*0.15); +shape_0_per_frame2=x=sin(q1*0.5) * 0.05 + 0.5; +shape_0_per_frame3=y=cos(q1*0.63)* 0.05 + 0.5 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=mv_x=64;mv_y=48; +per_frame_init_2=nut=0; +per_frame_init_3=stp=0;stq=0; +per_frame_init_4=rtp=0;rtq=0; +per_frame_init_5=wvr=0; +per_frame_init_6=decay=0; +per_frame_init_7=dcsp=0 +per_frame_init_8= +per_frame_1=decay=0.98; +per_frame_2=zoom=1.002; +per_frame_3= +per_frame_4=vol=(bass_att+mid_att+treb_att)*0.25; +per_frame_5=vol=vol*vol; +per_frame_6=mtime=mtime+vol*0.1*(75/fps); +per_frame_7= +per_frame_8=q1=mtime*0.4; +per_frame_9= +per_frame_10= +per_frame_11= +per_frame_12= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 04 music minimal.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 04 music minimal.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 04 music minimal.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 04 music minimal.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,541 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.960000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.011726 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.037492 +fWarpScale=0.014889 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.033004 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.400000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.110000 +ob_g=0.000000 +ob_b=0.100000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=6.400000 +nMotionVectorsY=43.199997 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=0.910000 +mv_b=0.710000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.100000 +wavecode_0_g=1.000000 +wavecode_0_b=0.700000 +wavecode_0_a=1.000000 +wave_0_per_frame1=t1=sin(time)*0.5+0.5; +wave_0_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_0_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_0_per_frame4= +wave_0_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_0_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_0_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2=phs=-sample * 0.2; +wave_0_per_point3=tm=q1 + phs; +wave_0_per_point4= +wave_0_per_point5=flip=flip+1; +wave_0_per_point6=flip=flip*below(flip,2); +wave_0_per_point7= +wave_0_per_point8=xp=0; +wave_0_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_0_per_point10=zp=0; +wave_0_per_point11= +wave_0_per_point12=//wrist movement; +wave_0_per_point13=ang=sin(tm*2)*0.5 +0.5; +wave_0_per_point14= +wave_0_per_point15=xq=xp; +wave_0_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point17=yq=yp*sinang + zp*cosang; +wave_0_per_point18=zq=yp*cosang - zp*sinang; +wave_0_per_point19=yq=yp; +wave_0_per_point20=zq=zp; +wave_0_per_point21= +wave_0_per_point22=ang=tm*8; +wave_0_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point24=xp=xq*sinang + yq*cosang; +wave_0_per_point25=yp=xq*cosang - yq*sinang; +wave_0_per_point26=zp=zq; +wave_0_per_point27= +wave_0_per_point28=//forearm movement; +wave_0_per_point29=zp=zp-0.3; +wave_0_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_0_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point32=xq=xp; +wave_0_per_point33=yq=yp*sinang + zp*cosang; +wave_0_per_point34=zq=yp*cosang - zp*sinang; +wave_0_per_point35= +wave_0_per_point36=//upper arm twist +wave_0_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_0_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point39=xp=xq*sinang + yq*cosang; +wave_0_per_point40=yp=xq*cosang - yq*sinang; +wave_0_per_point41=zp=zq; +wave_0_per_point42= +wave_0_per_point43=//upper arm outward; +wave_0_per_point44=zp=zp-0.35; +wave_0_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_0_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point47=xq=xp*sinang + zp*cosang; +wave_0_per_point48=yq=yp; +wave_0_per_point49=zq=xp*cosang - zp*sinang; +wave_0_per_point50= +wave_0_per_point51=//upper arm up down; +wave_0_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_0_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point54=xp=xq; +wave_0_per_point55=yp=yq*cosang - zq*sinang; +wave_0_per_point56=zp=yq*sinang + zq*cosang; +wave_0_per_point57= +wave_0_per_point58=//xp=xq;yp=yq;zp=zq; +wave_0_per_point59= +wave_0_per_point60= +wave_0_per_point61=//project into screenspace and draw on screen +wave_0_per_point62=zp=zp+2; +wave_0_per_point63=xs=xp/zp; +wave_0_per_point64=ys=yp/zp; +wave_0_per_point65= +wave_0_per_point66=x=xs+0.5; +wave_0_per_point67=y=ys*1.3+0.5; +wave_0_per_point68= +wave_0_per_point69= +wave_0_per_point70=a=(1-sample); +wave_0_per_point71= +wave_0_per_point72=b=b+pow(1-sample,2)*0.3; +wave_0_per_point73= +wave_0_per_point74= +wave_0_per_point75= +wave_0_per_point76=r1=t1; +wave_0_per_point77=g1=t2; +wave_0_per_point78=b1=t3; +wave_0_per_point79=r2=t4; +wave_0_per_point80=g2=t5; +wave_0_per_point81=b2=t6; +wave_0_per_point82= +wave_0_per_point83=r=r1*flip + r2*(1-flip); +wave_0_per_point84=g=g1*flip + g2*(1-flip); +wave_0_per_point85=b=b1*flip + b2*(1-flip); +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.200000 +wavecode_1_g=1.000000 +wavecode_1_b=0.600000 +wavecode_1_a=1.000000 +wave_1_per_frame1=t1=sin(time)*0.5+0.5; +wave_1_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_1_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_1_per_frame4= +wave_1_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_1_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_1_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2=phs=-sample * 0.2; +wave_1_per_point3=tm=q1 + phs; +wave_1_per_point4= +wave_1_per_point5=flip=flip+1; +wave_1_per_point6=flip=flip*below(flip,2); +wave_1_per_point7= +wave_1_per_point8=xp=0; +wave_1_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2 +0.1; +wave_1_per_point10=yp=-yp; +wave_1_per_point11=zp=0; +wave_1_per_point12= +wave_1_per_point13=//wrist movement; +wave_1_per_point14=ang=sin(tm*2)*0.5 +0.5; +wave_1_per_point15= +wave_1_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point17=xq=xp; +wave_1_per_point18=yq=yp*sinang + zp*cosang; +wave_1_per_point19=zq=yp*cosang - zp*sinang; +wave_1_per_point20=yq=yp; +wave_1_per_point21=zq=zp; +wave_1_per_point22= +wave_1_per_point23=ang=tm*8; +wave_1_per_point24=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point25=xp=xq*sinang + yq*cosang; +wave_1_per_point26=yp=xq*cosang - yq*sinang; +wave_1_per_point27=zp=zq; +wave_1_per_point28= +wave_1_per_point29=//forearm movement; +wave_1_per_point30=zp=zp-0.3; +wave_1_per_point31=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_1_per_point32=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point33=xq=xp; +wave_1_per_point34=yq=yp*sinang + zp*cosang; +wave_1_per_point35=zq=yp*cosang - zp*sinang; +wave_1_per_point36= +wave_1_per_point37=//upper arm twist +wave_1_per_point38=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_1_per_point39=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point40=xp=xq*sinang + yq*cosang; +wave_1_per_point41=yp=xq*cosang - yq*sinang; +wave_1_per_point42=zp=zq; +wave_1_per_point43= +wave_1_per_point44=//upper arm outward; +wave_1_per_point45=zp=zp-0.35; +wave_1_per_point46=ang=cos(tm*2.3)*1.75 - 1.05; +wave_1_per_point47=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point48=xq=xp*sinang + zp*cosang; +wave_1_per_point49=yq=yp; +wave_1_per_point50=zq=xp*cosang - zp*sinang; +wave_1_per_point51= +wave_1_per_point52=//upper arm up down; +wave_1_per_point53=ang=cos(tm)*0.5 - 0.5; +wave_1_per_point54=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point55=xp=xq; +wave_1_per_point56=yp=yq*cosang - zq*sinang; +wave_1_per_point57=zp=yq*sinang + zq*cosang; +wave_1_per_point58= +wave_1_per_point59=//xp=xq;yp=yq;zp=zq; +wave_1_per_point60= +wave_1_per_point61= +wave_1_per_point62=//project into screenspace and draw on screen +wave_1_per_point63=zp=zp+2; +wave_1_per_point64=xs=xp/zp; +wave_1_per_point65=ys=yp/zp; +wave_1_per_point66= +wave_1_per_point67=x=xs+0.5; +wave_1_per_point68=y=ys*1.3+0.5; +wave_1_per_point69= +wave_1_per_point70= +wave_1_per_point71=a=(1-sample); +wave_1_per_point72= +wave_1_per_point73= +wave_1_per_point74=b=b+pow(1-sample,2)*0.3; +wave_1_per_point75= +wave_1_per_point76=r1=t1; +wave_1_per_point77=g1=t2; +wave_1_per_point78=b1=t3; +wave_1_per_point79=r2=t4; +wave_1_per_point80=g2=t5; +wave_1_per_point81=b2=t6; +wave_1_per_point82= +wave_1_per_point83=r=r1*flip + r2*(1-flip); +wave_1_per_point84=g=g1*flip + g2*(1-flip); +wave_1_per_point85=b=b1*flip + b2*(1-flip); +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=1 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=0.600000 +wavecode_2_b=0.100000 +wavecode_2_a=1.000000 +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2=tm=q1; +wave_2_per_point3=phs=-sample*0.5; +wave_2_per_point4= +wave_2_per_point5=flip=flip+1; +wave_2_per_point6=flip=flip*below(flip,2); +wave_2_per_point7= +wave_2_per_point8=xp=0; +wave_2_per_point9=yp=flip*0.1; +wave_2_per_point10=zp=0; +wave_2_per_point11= +wave_2_per_point12=//wrist movement; +wave_2_per_point13=ang=sin(tm*2+phs - 2)*0.5 +0.5 + 2; +wave_2_per_point14= +wave_2_per_point15=xq=xp; +wave_2_per_point16=yq=yp*sin(ang) + zp*cos(ang); +wave_2_per_point17=zq=yp*cos(ang) - zp*sin(ang); +wave_2_per_point18= +wave_2_per_point19=ang=cos(tm*2+phs - 2)*1.5 ; +wave_2_per_point20=xp=xq*sin(ang) + yq*cos(ang); +wave_2_per_point21=yp=xq*cos(ang) - yq*sin(ang); +wave_2_per_point22=zp=zq; +wave_2_per_point23= +wave_2_per_point24=//forearm movement; +wave_2_per_point25=zp=zp-0.3; +wave_2_per_point26=ang=3.14 + sin(tm*2+phs - 0.5)*1.5; +wave_2_per_point27=xq=xp; +wave_2_per_point28=yq=yp*sin(ang) + zp*cos(ang); +wave_2_per_point29=zq=yp*cos(ang) - zp*sin(ang); +wave_2_per_point30= +wave_2_per_point31=//upper arm twist +wave_2_per_point32=ang=-1.0 + cos(tm*3 + 0.5 +phs + 0.5); +wave_2_per_point33=xp=xq*sin(ang) + yq*cos(ang); +wave_2_per_point34=yp=xq*cos(ang) - yq*sin(ang); +wave_2_per_point35=zp=zq; +wave_2_per_point36= +wave_2_per_point37=//upper arm outward; +wave_2_per_point38=zp=zp-0.35; +wave_2_per_point39=ang=cos(tm*2+phs)*0.75 - 1.05; +wave_2_per_point40=xq=xp*sin(ang) + zp*cos(ang); +wave_2_per_point41=yq=yp; +wave_2_per_point42=zq=xp*cos(ang) - zp*sin(ang); +wave_2_per_point43= +wave_2_per_point44=//upper arm up down; +wave_2_per_point45=ang=cos(tm+phs)*0.5 - 0.5; +wave_2_per_point46=xp=xq; +wave_2_per_point47=yp=yq*cos(ang) - zq*sin(ang); +wave_2_per_point48=zp=yq*sin(ang) + zq*cos(ang); +wave_2_per_point49= +wave_2_per_point50=//xp=xq;yp=yq;zp=zq; +wave_2_per_point51= +wave_2_per_point52= +wave_2_per_point53=//project into screenspace and draw on screen +wave_2_per_point54=zp=zp+2; +wave_2_per_point55=xs=xp/zp; +wave_2_per_point56=ys=yp/zp; +wave_2_per_point57= +wave_2_per_point58=x=xs+0.5; +wave_2_per_point59=y=ys*1.3+0.5; +wave_2_per_point60= +wave_2_per_point61= +wave_2_per_point62=a=(1-sample)*0.05 +wave_2_per_point63= +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=1 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=0.300000 +wavecode_3_b=0.100000 +wavecode_3_a=1.000000 +wave_3_per_point1=n=sample*6.283; +wave_3_per_point2=tm=q1 ; +wave_3_per_point3=phs=-sample*0.5; +wave_3_per_point4= +wave_3_per_point5=flip=flip+1; +wave_3_per_point6=flip=flip*below(flip,2); +wave_3_per_point7= +wave_3_per_point8=xp=0; +wave_3_per_point9=yp=flip*0.1; +wave_3_per_point10=zp=0; +wave_3_per_point11= +wave_3_per_point12=//wrist movement; +wave_3_per_point13=ang=sin(tm*2+phs-2)*0.5 +0.5 + 2; +wave_3_per_point14= +wave_3_per_point15=xq=xp; +wave_3_per_point16=yq=yp*sin(ang) + zp*cos(ang); +wave_3_per_point17=zq=yp*cos(ang) - zp*sin(ang); +wave_3_per_point18= +wave_3_per_point19=ang=cos(tm*2+phs-2)*1.5; +wave_3_per_point20=xp=xq*sin(ang) + yq*cos(ang); +wave_3_per_point21=yp=xq*cos(ang) - yq*sin(ang); +wave_3_per_point22=zp=zq; +wave_3_per_point23= +wave_3_per_point24=//forearm movement; +wave_3_per_point25=zp=zp-0.3; +wave_3_per_point26=ang=3.14 + sin(tm*2+phs-0.5)*1.5; +wave_3_per_point27=xq=xp; +wave_3_per_point28=yq=yp*sin(ang) + zp*cos(ang); +wave_3_per_point29=zq=yp*cos(ang) - zp*sin(ang); +wave_3_per_point30= +wave_3_per_point31=//upper arm twist +wave_3_per_point32=ang=-1.0 + cos(tm*3 + 0.5 +phs); +wave_3_per_point33=xp=xq*sin(ang) + yq*cos(ang); +wave_3_per_point34=yp=xq*cos(ang) - yq*sin(ang); +wave_3_per_point35=zp=zq; +wave_3_per_point36= +wave_3_per_point37=//upper arm outward; +wave_3_per_point38=zp=zp-0.35; +wave_3_per_point39=ang=cos(tm*2+phs)*0.75 - 1.05; +wave_3_per_point40=xq=xp*sin(ang) + zp*cos(ang); +wave_3_per_point41=yq=yp; +wave_3_per_point42=zq=xp*cos(ang) - zp*sin(ang); +wave_3_per_point43= +wave_3_per_point44=//upper arm up down; +wave_3_per_point45=ang=cos(tm+phs)*0.5 - 0.5; +wave_3_per_point46=xp=xq; +wave_3_per_point47=yp=yq*cos(ang) - zq*sin(ang); +wave_3_per_point48=zp=yq*sin(ang) + zq*cos(ang); +wave_3_per_point49= +wave_3_per_point50=//xp=xq;yp=yq;zp=zq; +wave_3_per_point51= +wave_3_per_point52= +wave_3_per_point53=//project into screenspace and draw on screen +wave_3_per_point54=zp=zp+2; +wave_3_per_point55=xs=xp/zp; +wave_3_per_point56=ys=yp/zp; +wave_3_per_point57= +wave_3_per_point58=x=-xs+0.5; +wave_3_per_point59=y=ys*1.3+0.5; +wave_3_per_point60= +wave_3_per_point61= +wave_3_per_point62=a=(1-sample)*0.05; +wave_3_per_point63= +shapecode_0_enabled=0 +shapecode_0_sides=5 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.067790 +shapecode_0_ang=0.753982 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=0.779769 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang=sin(q1*0.15); +shape_0_per_frame2=x=sin(q1*0.5) * 0.05 + 0.5; +shape_0_per_frame3=y=cos(q1*0.63)* 0.05 + 0.5 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=mv_x=64;mv_y=48; +per_frame_init_2=nut=0; +per_frame_init_3=stp=0;stq=0; +per_frame_init_4=rtp=0;rtq=0; +per_frame_init_5=wvr=0; +per_frame_init_6=decay=0; +per_frame_init_7=dcsp=0; +per_frame_init_8=warp=0 +per_frame_init_9= +per_frame_1=decay=0.98; +per_frame_2=zoom=1.002; +per_frame_3= +per_frame_4=vol=(bass_att+mid_att+treb_att)*0.25; +per_frame_5=vol=vol*vol; +per_frame_6=mtime=mtime+vol*0.1*(75/fps); +per_frame_7= +per_frame_8=q1=mtime*0.4; +per_frame_9= +per_frame_10=warp=0 +per_frame_11= +per_frame_12= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix02b.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix02b.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix02b.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix02b.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,682 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.210000 +fDecay=0.960000 +fVideoEchoZoom=0.996630 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=0.001000 +fWaveScale=0.011726 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.037492 +fWarpScale=0.014889 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.033004 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.400000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.055000 +ob_r=1.000000 +ob_g=1.000000 +ob_b=1.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=43.199997 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=0.910000 +mv_b=0.710000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.100000 +wavecode_0_g=1.000000 +wavecode_0_b=0.700000 +wavecode_0_a=1.000000 +wave_0_per_frame1=t1=sin(time)*0.5+0.5; +wave_0_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_0_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_0_per_frame4= +wave_0_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_0_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_0_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2=phs=-sample * 0.2; +wave_0_per_point3=tm=q1 + phs; +wave_0_per_point4= +wave_0_per_point5=flip=flip+1; +wave_0_per_point6=flip=flip*below(flip,2); +wave_0_per_point7= +wave_0_per_point8=xp=0; +wave_0_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_0_per_point10=zp=0; +wave_0_per_point11= +wave_0_per_point12=//wrist movement; +wave_0_per_point13=ang=sin(tm*2 )*0.5 +0.5; +wave_0_per_point14= +wave_0_per_point15=xq=xp; +wave_0_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point17=yq=yp*sinang + zp*cosang; +wave_0_per_point18=zq=yp*cosang - zp*sinang; +wave_0_per_point19=yq=yp; +wave_0_per_point20=zq=zp; +wave_0_per_point21= +wave_0_per_point22=ang=tm*8; +wave_0_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point24=xp=xq*sinang + yq*cosang; +wave_0_per_point25=yp=xq*cosang - yq*sinang; +wave_0_per_point26=zp=zq; +wave_0_per_point27= +wave_0_per_point28=//forearm movement; +wave_0_per_point29=zp=zp-0.3; +wave_0_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_0_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point32=xq=xp; +wave_0_per_point33=yq=yp*sinang + zp*cosang; +wave_0_per_point34=zq=yp*cosang - zp*sinang; +wave_0_per_point35= +wave_0_per_point36=//upper arm twist +wave_0_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_0_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point39=xp=xq*sinang + yq*cosang; +wave_0_per_point40=yp=xq*cosang - yq*sinang; +wave_0_per_point41=zp=zq; +wave_0_per_point42= +wave_0_per_point43=//upper arm outward; +wave_0_per_point44=zp=zp-0.35; +wave_0_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_0_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point47=xq=xp*sinang + zp*cosang; +wave_0_per_point48=yq=yp; +wave_0_per_point49=zq=xp*cosang - zp*sinang; +wave_0_per_point50= +wave_0_per_point51=//upper arm up down; +wave_0_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_0_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point54=xp=xq; +wave_0_per_point55=yp=yq*cosang - zq*sinang; +wave_0_per_point56=zp=yq*sinang + zq*cosang; +wave_0_per_point57= +wave_0_per_point58=//xp=xq;yp=yq;zp=zq; +wave_0_per_point59= +wave_0_per_point60= +wave_0_per_point61=//project into screenspace and draw on screen +wave_0_per_point62=zp=zp+2; +wave_0_per_point63=xs=xp/zp; +wave_0_per_point64=ys=yp/zp; +wave_0_per_point65= +wave_0_per_point66=x=xs+0.5; +wave_0_per_point67=y=ys*1.3+0.5; +wave_0_per_point68= +wave_0_per_point69= +wave_0_per_point70=a=if( equal(q8,1) , (1-sample) , sample); +wave_0_per_point71=a=a*a; +wave_0_per_point72= +wave_0_per_point73=b=b+pow(1-sample,2)*0.3; +wave_0_per_point74= +wave_0_per_point75= +wave_0_per_point76= +wave_0_per_point77=r1=t1; +wave_0_per_point78=g1=t2; +wave_0_per_point79=b1=t3; +wave_0_per_point80=r2=t4; +wave_0_per_point81=g2=t5; +wave_0_per_point82=b2=t6; +wave_0_per_point83= +wave_0_per_point84=r=r1*flip + r2*(1-flip); +wave_0_per_point85=g=g1*flip + g2*(1-flip); +wave_0_per_point86=b=b1*flip + b2*(1-flip); +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.200000 +wavecode_1_g=1.000000 +wavecode_1_b=0.600000 +wavecode_1_a=1.000000 +wave_1_per_frame1=t1=sin(time)*0.5+0.5; +wave_1_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_1_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_1_per_frame4= +wave_1_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_1_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_1_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2=phs=-sample * 0.2; +wave_1_per_point3=tm=q1 + phs; +wave_1_per_point4= +wave_1_per_point5=flip=flip+1; +wave_1_per_point6=flip=flip*below(flip,2); +wave_1_per_point7= +wave_1_per_point8=xp=0; +wave_1_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2 +0.1; +wave_1_per_point10=yp=-yp; +wave_1_per_point11=zp=0; +wave_1_per_point12= +wave_1_per_point13=//wrist movement; +wave_1_per_point14=ang=sin(tm*2)*0.5 +0.5; +wave_1_per_point15= +wave_1_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point17=xq=xp; +wave_1_per_point18=yq=yp*sinang + zp*cosang; +wave_1_per_point19=zq=yp*cosang - zp*sinang; +wave_1_per_point20=yq=yp; +wave_1_per_point21=zq=zp; +wave_1_per_point22= +wave_1_per_point23=ang=tm*8; +wave_1_per_point24=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point25=xp=xq*sinang + yq*cosang; +wave_1_per_point26=yp=xq*cosang - yq*sinang; +wave_1_per_point27=zp=zq; +wave_1_per_point28= +wave_1_per_point29=//forearm movement; +wave_1_per_point30=zp=zp-0.3; +wave_1_per_point31=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_1_per_point32=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point33=xq=xp; +wave_1_per_point34=yq=yp*sinang + zp*cosang; +wave_1_per_point35=zq=yp*cosang - zp*sinang; +wave_1_per_point36= +wave_1_per_point37=//upper arm twist +wave_1_per_point38=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_1_per_point39=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point40=xp=xq*sinang + yq*cosang; +wave_1_per_point41=yp=xq*cosang - yq*sinang; +wave_1_per_point42=zp=zq; +wave_1_per_point43= +wave_1_per_point44=//upper arm outward; +wave_1_per_point45=zp=zp-0.35; +wave_1_per_point46=ang=cos(tm*2.3)*1.75 - 1.05; +wave_1_per_point47=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point48=xq=xp*sinang + zp*cosang; +wave_1_per_point49=yq=yp; +wave_1_per_point50=zq=xp*cosang - zp*sinang; +wave_1_per_point51= +wave_1_per_point52=//upper arm up down; +wave_1_per_point53=ang=cos(tm)*0.5 - 0.5; +wave_1_per_point54=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point55=xp=xq; +wave_1_per_point56=yp=yq*cosang - zq*sinang; +wave_1_per_point57=zp=yq*sinang + zq*cosang; +wave_1_per_point58= +wave_1_per_point59=//xp=xq;yp=yq;zp=zq; +wave_1_per_point60= +wave_1_per_point61= +wave_1_per_point62=//project into screenspace and draw on screen +wave_1_per_point63=zp=zp+2; +wave_1_per_point64=xs=xp/zp; +wave_1_per_point65=ys=yp/zp; +wave_1_per_point66= +wave_1_per_point67=x=xs+0.5; +wave_1_per_point68=y=ys*1.3+0.5; +wave_1_per_point69= +wave_1_per_point70= +wave_1_per_point71=a=if( equal(q8,1) , (1-sample) , sample); +wave_1_per_point72=a=a*a; +wave_1_per_point73= +wave_1_per_point74= +wave_1_per_point75=b=b+pow(1-sample,2)*0.3; +wave_1_per_point76= +wave_1_per_point77=r1=t1; +wave_1_per_point78=g1=t2; +wave_1_per_point79=b1=t3; +wave_1_per_point80=r2=t4; +wave_1_per_point81=g2=t5; +wave_1_per_point82=b2=t6; +wave_1_per_point83= +wave_1_per_point84=r=r1*flip + r2*(1-flip); +wave_1_per_point85=g=g1*flip + g2*(1-flip); +wave_1_per_point86=b=b1*flip + b2*(1-flip); +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=1 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=1 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=0.600000 +wavecode_2_b=0.100000 +wavecode_2_a=1.000000 +wave_2_per_frame1=t1=sin(time)*0.5+0.5; +wave_2_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_2_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_2_per_frame4= +wave_2_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_2_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_2_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_2_per_frame8= +wave_2_per_frame9= +wave_2_per_frame10=t8= int( sin(time*2)*2 + 3); +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2=phs=-sample * 0.2; +wave_2_per_point3=tm=q1 + phs; +wave_2_per_point4= +wave_2_per_point5=flip=flip+1; +wave_2_per_point6=flip=flip*below(flip,2); +wave_2_per_point7= +wave_2_per_point8=xp=0; +wave_2_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_2_per_point10=zp=0; +wave_2_per_point11= +wave_2_per_point12=//wrist movement; +wave_2_per_point13=ang=sin(tm*2)*0.5 +0.5; +wave_2_per_point14= +wave_2_per_point15=xq=xp; +wave_2_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point17=yq=yp*sinang + zp*cosang; +wave_2_per_point18=zq=yp*cosang - zp*sinang; +wave_2_per_point19=yq=yp; +wave_2_per_point20=zq=zp; +wave_2_per_point21= +wave_2_per_point22=ang=tm*8 + 1; +wave_2_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point24=xp=xq*sinang + yq*cosang; +wave_2_per_point25=yp=xq*cosang - yq*sinang; +wave_2_per_point26=zp=zq; +wave_2_per_point27= +wave_2_per_point28=//forearm movement; +wave_2_per_point29=zp=zp-0.3; +wave_2_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_2_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point32=xq=xp; +wave_2_per_point33=yq=yp*sinang + zp*cosang; +wave_2_per_point34=zq=yp*cosang - zp*sinang; +wave_2_per_point35= +wave_2_per_point36=//upper arm twist +wave_2_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_2_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point39=xp=xq*sinang + yq*cosang; +wave_2_per_point40=yp=xq*cosang - yq*sinang; +wave_2_per_point41=zp=zq; +wave_2_per_point42= +wave_2_per_point43=//upper arm outward; +wave_2_per_point44=zp=zp-0.35; +wave_2_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_2_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point47=xq=xp*sinang + zp*cosang; +wave_2_per_point48=yq=yp; +wave_2_per_point49=zq=xp*cosang - zp*sinang; +wave_2_per_point50= +wave_2_per_point51=//upper arm up down; +wave_2_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_2_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point54=xp=xq; +wave_2_per_point55=yp=yq*cosang - zq*sinang; +wave_2_per_point56=zp=yq*sinang + zq*cosang; +wave_2_per_point57= +wave_2_per_point58=//xp=xq;yp=yq;zp=zq; +wave_2_per_point59= +wave_2_per_point60= +wave_2_per_point61=//project into screenspace and draw on screen +wave_2_per_point62=zp=zp+2; +wave_2_per_point63=xs=xp/zp; +wave_2_per_point64=ys=yp/zp; +wave_2_per_point65= +wave_2_per_point66=x=xs+0.5; +wave_2_per_point67=y=ys*1.3+0.5; +wave_2_per_point68= +wave_2_per_point69=a=if( equal(q8,1) , (1-sample) , sample); +wave_2_per_point70= +wave_2_per_point71= +wave_2_per_point72=a=a* above( sin(tm*128*t8) , 0 ); +wave_2_per_point73= +wave_2_per_point74= +wave_2_per_point75=r=t4; +wave_2_per_point76=g=t5; +wave_2_per_point77=b=t6; +wave_2_per_point78= +wavecode_3_enabled=1 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=1 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=1 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=0.300000 +wavecode_3_b=0.100000 +wavecode_3_a=1.000000 +wave_3_per_frame1=t1=sin(time)*0.5+0.5; +wave_3_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_3_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_3_per_frame4= +wave_3_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_3_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_3_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_3_per_frame8= +wave_3_per_frame9= +wave_3_per_frame10=t8= int( sin(time*2)*2 + 3); +wave_3_per_point1=n=sample*6.283; +wave_3_per_point2=phs=-sample * 0.2; +wave_3_per_point3=tm=q1 + phs; +wave_3_per_point4= +wave_3_per_point5=flip=flip+1; +wave_3_per_point6=flip=flip*below(flip,2); +wave_3_per_point7= +wave_3_per_point8=xp=0; +wave_3_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2 +0.1; +wave_3_per_point10=yp=-yp; +wave_3_per_point11=zp=0; +wave_3_per_point12= +wave_3_per_point13=//wrist movement; +wave_3_per_point14=ang=sin(tm*2)*0.5 +0.5; +wave_3_per_point15= +wave_3_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point17=xq=xp; +wave_3_per_point18=yq=yp*sinang + zp*cosang; +wave_3_per_point19=zq=yp*cosang - zp*sinang; +wave_3_per_point20=yq=yp; +wave_3_per_point21=zq=zp; +wave_3_per_point22= +wave_3_per_point23=ang=tm*8+1; +wave_3_per_point24=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point25=xp=xq*sinang + yq*cosang; +wave_3_per_point26=yp=xq*cosang - yq*sinang; +wave_3_per_point27=zp=zq; +wave_3_per_point28= +wave_3_per_point29=//forearm movement; +wave_3_per_point30=zp=zp-0.3; +wave_3_per_point31=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_3_per_point32=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point33=xq=xp; +wave_3_per_point34=yq=yp*sinang + zp*cosang; +wave_3_per_point35=zq=yp*cosang - zp*sinang; +wave_3_per_point36= +wave_3_per_point37=//upper arm twist +wave_3_per_point38=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_3_per_point39=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point40=xp=xq*sinang + yq*cosang; +wave_3_per_point41=yp=xq*cosang - yq*sinang; +wave_3_per_point42=zp=zq; +wave_3_per_point43= +wave_3_per_point44=//upper arm outward; +wave_3_per_point45=zp=zp-0.35; +wave_3_per_point46=ang=cos(tm*2.3)*1.75 - 1.05; +wave_3_per_point47=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point48=xq=xp*sinang + zp*cosang; +wave_3_per_point49=yq=yp; +wave_3_per_point50=zq=xp*cosang - zp*sinang; +wave_3_per_point51= +wave_3_per_point52=//upper arm up down; +wave_3_per_point53=ang=cos(tm)*0.5 - 0.5; +wave_3_per_point54=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point55=xp=xq; +wave_3_per_point56=yp=yq*cosang - zq*sinang; +wave_3_per_point57=zp=yq*sinang + zq*cosang; +wave_3_per_point58= +wave_3_per_point59=//xp=xq;yp=yq;zp=zq; +wave_3_per_point60= +wave_3_per_point61= +wave_3_per_point62=//project into screenspace and draw on screen +wave_3_per_point63=zp=zp+2; +wave_3_per_point64=xs=xp/zp; +wave_3_per_point65=ys=yp/zp; +wave_3_per_point66= +wave_3_per_point67=x=xs+0.5; +wave_3_per_point68=y=ys*1.3+0.5; +wave_3_per_point69= +wave_3_per_point70= +wave_3_per_point71=a=if( equal(q8,1) , (1-sample) , sample); +wave_3_per_point72=a=a*a; +wave_3_per_point73= +wave_3_per_point74=a=a* above( sin(tm*128*t8) , 0 ); +wave_3_per_point75= +wave_3_per_point76= +wave_3_per_point77=r=t4; +wave_3_per_point78=g=t5; +wave_3_per_point79=b=t6; +shapecode_0_enabled=0 +shapecode_0_sides=5 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.067790 +shapecode_0_ang=0.753982 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=0.779769 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang=sin(q1*0.15); +shape_0_per_frame2=x=sin(q1*0.5) * 0.05 + 0.5; +shape_0_per_frame3=y=cos(q1*0.63)* 0.05 + 0.5 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=5 +shapecode_3_additive=1 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.038091 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=0.600000 +shapecode_3_b2=1.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +shape_3_per_frame1=tm=q1; +shape_3_per_frame2= +shape_3_per_frame3=xp=0; +shape_3_per_frame4=yp=0.1; +shape_3_per_frame5=zp=0; +shape_3_per_frame6= +shape_3_per_frame7=//wrist movement; +shape_3_per_frame8=ang=sin(tm*2 )*0.5 +0.5; +shape_3_per_frame9= +shape_3_per_frame10=xq=xp; +shape_3_per_frame11=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame12=yq=yp*sinang + zp*cosang; +shape_3_per_frame13=zq=yp*cosang - zp*sinang; +shape_3_per_frame14=yq=yp; +shape_3_per_frame15=zq=zp; +shape_3_per_frame16= +shape_3_per_frame17=ang=tm*8; +shape_3_per_frame18=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame19=xp=xq*sinang + yq*cosang; +shape_3_per_frame20=yp=xq*cosang - yq*sinang; +shape_3_per_frame21=zp=zq; +shape_3_per_frame22= +shape_3_per_frame23=//forearm movement; +shape_3_per_frame24=zp=zp-0.3; +shape_3_per_frame25=ang=3.14 + sin(tm*2 - 0.5)*1.5; +shape_3_per_frame26=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame27=xq=xp; +shape_3_per_frame28=yq=yp*sinang + zp*cosang; +shape_3_per_frame29=zq=yp*cosang - zp*sinang; +shape_3_per_frame30= +shape_3_per_frame31=//upper arm twist +shape_3_per_frame32=ang=-1.0 + cos(tm*3.1 + 0.5); +shape_3_per_frame33=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame34=xp=xq*sinang + yq*cosang; +shape_3_per_frame35=yp=xq*cosang - yq*sinang; +shape_3_per_frame36=zp=zq; +shape_3_per_frame37= +shape_3_per_frame38=//upper arm outward; +shape_3_per_frame39=zp=zp-0.35; +shape_3_per_frame40=ang=cos(tm*2.3)*1.75 - 1.05; +shape_3_per_frame41=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame42=xq=xp*sinang + zp*cosang; +shape_3_per_frame43=yq=yp; +shape_3_per_frame44=zq=xp*cosang - zp*sinang; +shape_3_per_frame45= +shape_3_per_frame46=//upper arm up down; +shape_3_per_frame47=ang=cos(tm)*0.5 - 0.5; +shape_3_per_frame48=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame49=xp=xq; +shape_3_per_frame50=yp=yq*cosang - zq*sinang; +shape_3_per_frame51=zp=yq*sinang + zq*cosang; +shape_3_per_frame52= +shape_3_per_frame53=//xp=xq;yp=yq;zp=zq; +shape_3_per_frame54= +shape_3_per_frame55= +shape_3_per_frame56=//project into screenspace and draw on screen +shape_3_per_frame57=zp=zp+2; +shape_3_per_frame58=xs=xp/zp; +shape_3_per_frame59=ys=yp/zp; +shape_3_per_frame60= +shape_3_per_frame61=x=xs+0.5; +shape_3_per_frame62=y=ys*1.3+0.5; +shape_3_per_frame63= +shape_3_per_frame64= +shape_3_per_frame65= +shape_3_per_frame66= +per_frame_init_1=mv_x=64;mv_y=48; +per_frame_init_2=nut=0; +per_frame_init_3=stp=0;stq=0; +per_frame_init_4=rtp=0;rtq=0; +per_frame_init_5=wvr=0; +per_frame_init_6=decay=0; +per_frame_init_7=dcsp=0; +per_frame_init_8=warp=0 +per_frame_init_9= +per_frame_1= +per_frame_2=//krash's beat detection code +per_frame_3=volume = 0.3*(bass+mid+att); +per_frame_4=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_5=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_6=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_7=peakbass_att = max(bass_att,peakbass_att); +per_frame_8=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_9=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_10=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_11=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_12=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_13=beatcounter = beatcounter + beat; +per_frame_14=mode = if(beat*equal(beatcounter%2,0),1-mode,mode); +per_frame_15=flip = 2*mode-1; +per_frame_16=monitor=flip; +per_frame_17=q8=flip; +per_frame_18= +per_frame_19= +per_frame_20=decay=1; +per_frame_21=zoom=1.002; +per_frame_22= +per_frame_23=vol=(bass_att+mid_att+treb_att)*0.25; +per_frame_24=vol=vol*vol; +per_frame_25=mtime=mtime+vol*0.1*flip*(55/fps); +per_frame_26= +per_frame_27=q1=mtime*0.4; +per_frame_28= +per_frame_29=warp=0.0 +per_pixel_1=//tm=time+(sin(time)*rad); +per_pixel_2=var=tan(time)*treb*treb; +per_pixel_3= +per_pixel_4=zoom=1+(rad/40)+(var/40); +per_pixel_5=//rot=((rad/100)*var)*sin(time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix07 recursive demons.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix07 recursive demons.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix07 recursive demons.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - glowsticks v2 05 and proton lights (+Krash's beat code) _Phat_remix07 recursive demons.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,719 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.560000 +fDecay=0.960000 +fVideoEchoZoom=0.996630 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.011726 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.037492 +fWarpScale=0.014889 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.033004 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.400000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=1.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=43.199997 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=0.910000 +mv_b=0.710000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.100000 +wavecode_0_g=1.000000 +wavecode_0_b=0.700000 +wavecode_0_a=1.000000 +wave_0_per_frame1=t1=sin(time)*0.5+0.5; +wave_0_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_0_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_0_per_frame4= +wave_0_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_0_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_0_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2=phs=-sample * 0.2; +wave_0_per_point3=tm=q1 + phs; +wave_0_per_point4= +wave_0_per_point5=flip=flip+1; +wave_0_per_point6=flip=flip*below(flip,2); +wave_0_per_point7= +wave_0_per_point8=xp=0; +wave_0_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_0_per_point10=zp=0; +wave_0_per_point11= +wave_0_per_point12=//wrist movement; +wave_0_per_point13=ang=sin(tm*2 )*0.5 +0.5; +wave_0_per_point14= +wave_0_per_point15=xq=xp; +wave_0_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point17=yq=yp*sinang + zp*cosang; +wave_0_per_point18=zq=yp*cosang - zp*sinang; +wave_0_per_point19=yq=yp; +wave_0_per_point20=zq=zp; +wave_0_per_point21= +wave_0_per_point22=ang=tm*8; +wave_0_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point24=xp=xq*sinang + yq*cosang; +wave_0_per_point25=yp=xq*cosang - yq*sinang; +wave_0_per_point26=zp=zq; +wave_0_per_point27= +wave_0_per_point28=//forearm movement; +wave_0_per_point29=zp=zp-0.3; +wave_0_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_0_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point32=xq=xp; +wave_0_per_point33=yq=yp*sinang + zp*cosang; +wave_0_per_point34=zq=yp*cosang - zp*sinang; +wave_0_per_point35= +wave_0_per_point36=//upper arm twist +wave_0_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_0_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point39=xp=xq*sinang + yq*cosang; +wave_0_per_point40=yp=xq*cosang - yq*sinang; +wave_0_per_point41=zp=zq; +wave_0_per_point42= +wave_0_per_point43=//upper arm outward; +wave_0_per_point44=zp=zp-0.35; +wave_0_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_0_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point47=xq=xp*sinang + zp*cosang; +wave_0_per_point48=yq=yp; +wave_0_per_point49=zq=xp*cosang - zp*sinang; +wave_0_per_point50= +wave_0_per_point51=//upper arm up down; +wave_0_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_0_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point54=xp=xq; +wave_0_per_point55=yp=yq*cosang - zq*sinang; +wave_0_per_point56=zp=yq*sinang + zq*cosang; +wave_0_per_point57= +wave_0_per_point58=//xp=xq;yp=yq;zp=zq; +wave_0_per_point59= +wave_0_per_point60= +wave_0_per_point61=//project into screenspace and draw on screen +wave_0_per_point62=zp=zp+2; +wave_0_per_point63=xs=xp/zp; +wave_0_per_point64=ys=yp/zp; +wave_0_per_point65= +wave_0_per_point66=x=xs+0.5; +wave_0_per_point67=y=ys*1.3+0.5; +wave_0_per_point68= +wave_0_per_point69= +wave_0_per_point70=a=if( equal(q8,1) , (1-sample) , sample); +wave_0_per_point71=a=a*a; +wave_0_per_point72= +wave_0_per_point73=b=b+pow(1-sample,2)*0.3; +wave_0_per_point74= +wave_0_per_point75= +wave_0_per_point76= +wave_0_per_point77=r1=t1; +wave_0_per_point78=g1=t2; +wave_0_per_point79=b1=t3; +wave_0_per_point80=r2=t4; +wave_0_per_point81=g2=t5; +wave_0_per_point82=b2=t6; +wave_0_per_point83= +wave_0_per_point84=r=r1*flip + r2*(1-flip); +wave_0_per_point85=g=g1*flip + g2*(1-flip); +wave_0_per_point86=b=b1*flip + b2*(1-flip); +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.200000 +wavecode_1_g=1.000000 +wavecode_1_b=0.600000 +wavecode_1_a=1.000000 +wave_1_per_frame1=t1=sin(time)*0.5+0.5; +wave_1_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_1_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_1_per_frame4= +wave_1_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_1_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_1_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2=phs=-sample * 0.2; +wave_1_per_point3=tm=q1 + phs; +wave_1_per_point4= +wave_1_per_point5=flip=flip+1; +wave_1_per_point6=flip=flip*below(flip,2); +wave_1_per_point7= +wave_1_per_point8=xp=0; +wave_1_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2 +0.1; +wave_1_per_point10=yp=-yp; +wave_1_per_point11=zp=0; +wave_1_per_point12= +wave_1_per_point13=//wrist movement; +wave_1_per_point14=ang=sin(tm*2)*0.5 +0.5; +wave_1_per_point15= +wave_1_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point17=xq=xp; +wave_1_per_point18=yq=yp*sinang + zp*cosang; +wave_1_per_point19=zq=yp*cosang - zp*sinang; +wave_1_per_point20=yq=yp; +wave_1_per_point21=zq=zp; +wave_1_per_point22= +wave_1_per_point23=ang=tm*8; +wave_1_per_point24=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point25=xp=xq*sinang + yq*cosang; +wave_1_per_point26=yp=xq*cosang - yq*sinang; +wave_1_per_point27=zp=zq; +wave_1_per_point28= +wave_1_per_point29=//forearm movement; +wave_1_per_point30=zp=zp-0.3; +wave_1_per_point31=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_1_per_point32=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point33=xq=xp; +wave_1_per_point34=yq=yp*sinang + zp*cosang; +wave_1_per_point35=zq=yp*cosang - zp*sinang; +wave_1_per_point36= +wave_1_per_point37=//upper arm twist +wave_1_per_point38=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_1_per_point39=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point40=xp=xq*sinang + yq*cosang; +wave_1_per_point41=yp=xq*cosang - yq*sinang; +wave_1_per_point42=zp=zq; +wave_1_per_point43= +wave_1_per_point44=//upper arm outward; +wave_1_per_point45=zp=zp-0.35; +wave_1_per_point46=ang=cos(tm*2.3)*1.75 - 1.05; +wave_1_per_point47=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point48=xq=xp*sinang + zp*cosang; +wave_1_per_point49=yq=yp; +wave_1_per_point50=zq=xp*cosang - zp*sinang; +wave_1_per_point51= +wave_1_per_point52=//upper arm up down; +wave_1_per_point53=ang=cos(tm)*0.5 - 0.5; +wave_1_per_point54=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point55=xp=xq; +wave_1_per_point56=yp=yq*cosang - zq*sinang; +wave_1_per_point57=zp=yq*sinang + zq*cosang; +wave_1_per_point58= +wave_1_per_point59=//xp=xq;yp=yq;zp=zq; +wave_1_per_point60= +wave_1_per_point61= +wave_1_per_point62=//project into screenspace and draw on screen +wave_1_per_point63=zp=zp+2; +wave_1_per_point64=xs=xp/zp; +wave_1_per_point65=ys=yp/zp; +wave_1_per_point66= +wave_1_per_point67=x=xs+0.5; +wave_1_per_point68=y=ys*1.3+0.5; +wave_1_per_point69= +wave_1_per_point70= +wave_1_per_point71=a=if( equal(q8,1) , (1-sample) , sample); +wave_1_per_point72=a=a*a; +wave_1_per_point73= +wave_1_per_point74= +wave_1_per_point75=b=b+pow(1-sample,2)*0.3; +wave_1_per_point76= +wave_1_per_point77=r1=t1; +wave_1_per_point78=g1=t2; +wave_1_per_point79=b1=t3; +wave_1_per_point80=r2=t4; +wave_1_per_point81=g2=t5; +wave_1_per_point82=b2=t6; +wave_1_per_point83= +wave_1_per_point84=r=r1*flip + r2*(1-flip); +wave_1_per_point85=g=g1*flip + g2*(1-flip); +wave_1_per_point86=b=b1*flip + b2*(1-flip); +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=0.100000 +wavecode_2_g=1.000000 +wavecode_2_b=0.700000 +wavecode_2_a=1.000000 +wave_2_per_frame1=t1=sin(time)*0.5+0.5; +wave_2_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_2_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_2_per_frame4= +wave_2_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_2_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_2_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2=phs=-sample * 0.2; +wave_2_per_point3=tm=q1 + phs; +wave_2_per_point4= +wave_2_per_point5=flip=flip+1; +wave_2_per_point6=flip=flip*below(flip,2); +wave_2_per_point7= +wave_2_per_point8=xp=0; +wave_2_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_2_per_point10=zp=0; +wave_2_per_point11= +wave_2_per_point12=//wrist movement; +wave_2_per_point13=ang=sin(tm*2 )*0.5 +0.5; +wave_2_per_point14= +wave_2_per_point15=xq=xp; +wave_2_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point17=yq=yp*sinang + zp*cosang; +wave_2_per_point18=zq=yp*cosang - zp*sinang; +wave_2_per_point19=yq=yp; +wave_2_per_point20=zq=zp; +wave_2_per_point21= +wave_2_per_point22=ang=tm*8; +wave_2_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point24=xp=xq*sinang + yq*cosang; +wave_2_per_point25=yp=xq*cosang - yq*sinang; +wave_2_per_point26=zp=zq; +wave_2_per_point27= +wave_2_per_point28=//forearm movement; +wave_2_per_point29=zp=zp-0.3; +wave_2_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_2_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point32=xq=xp; +wave_2_per_point33=yq=yp*sinang + zp*cosang; +wave_2_per_point34=zq=yp*cosang - zp*sinang; +wave_2_per_point35= +wave_2_per_point36=//upper arm twist +wave_2_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_2_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point39=xp=xq*sinang + yq*cosang; +wave_2_per_point40=yp=xq*cosang - yq*sinang; +wave_2_per_point41=zp=zq; +wave_2_per_point42= +wave_2_per_point43=//upper arm outward; +wave_2_per_point44=zp=zp-0.35; +wave_2_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_2_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point47=xq=xp*sinang + zp*cosang; +wave_2_per_point48=yq=yp; +wave_2_per_point49=zq=xp*cosang - zp*sinang; +wave_2_per_point50= +wave_2_per_point51=//upper arm up down; +wave_2_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_2_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point54=xp=xq; +wave_2_per_point55=yp=yq*cosang - zq*sinang; +wave_2_per_point56=zp=yq*sinang + zq*cosang; +wave_2_per_point57= +wave_2_per_point58=//xp=xq;yp=yq;zp=zq; +wave_2_per_point59= +wave_2_per_point60= +wave_2_per_point61=//project into screenspace and draw on screen +wave_2_per_point62=zp=zp+2; +wave_2_per_point63=xs=-xp/zp; +wave_2_per_point64=ys=yp/zp; +wave_2_per_point65= +wave_2_per_point66=x=xs+0.5; +wave_2_per_point67=y=ys*1.3+0.5; +wave_2_per_point68= +wave_2_per_point69= +wave_2_per_point70=a=if( equal(q8,1) , (1-sample) , sample); +wave_2_per_point71=a=a*a; +wave_2_per_point72= +wave_2_per_point73=b=b+pow(1-sample,2)*0.3; +wave_2_per_point74= +wave_2_per_point75= +wave_2_per_point76= +wave_2_per_point77=r1=t1; +wave_2_per_point78=g1=t2; +wave_2_per_point79=b1=t3; +wave_2_per_point80=r2=t4; +wave_2_per_point81=g2=t5; +wave_2_per_point82=b2=t6; +wave_2_per_point83= +wave_2_per_point84=r=r1*flip + r2*(1-flip); +wave_2_per_point85=g=g1*flip + g2*(1-flip); +wave_2_per_point86=b=b1*flip + b2*(1-flip); +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=0.200000 +wavecode_3_g=1.000000 +wavecode_3_b=0.600000 +wavecode_3_a=1.000000 +wave_3_per_frame1=t1=sin(time)*0.5+0.5; +wave_3_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_3_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_3_per_frame4= +wave_3_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_3_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_3_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_3_per_point1=n=sample*6.283; +wave_3_per_point2=phs=-sample * 0.2; +wave_3_per_point3=tm=q1 + phs; +wave_3_per_point4= +wave_3_per_point5=flip=flip+1; +wave_3_per_point6=flip=flip*below(flip,2); +wave_3_per_point7= +wave_3_per_point8=xp=0; +wave_3_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2 +0.1; +wave_3_per_point10=yp=-yp; +wave_3_per_point11=zp=0; +wave_3_per_point12= +wave_3_per_point13=//wrist movement; +wave_3_per_point14=ang=sin(tm*2)*0.5 +0.5; +wave_3_per_point15= +wave_3_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point17=xq=xp; +wave_3_per_point18=yq=yp*sinang + zp*cosang; +wave_3_per_point19=zq=yp*cosang - zp*sinang; +wave_3_per_point20=yq=yp; +wave_3_per_point21=zq=zp; +wave_3_per_point22= +wave_3_per_point23=ang=tm*8; +wave_3_per_point24=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point25=xp=xq*sinang + yq*cosang; +wave_3_per_point26=yp=xq*cosang - yq*sinang; +wave_3_per_point27=zp=zq; +wave_3_per_point28= +wave_3_per_point29=//forearm movement; +wave_3_per_point30=zp=zp-0.3; +wave_3_per_point31=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_3_per_point32=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point33=xq=xp; +wave_3_per_point34=yq=yp*sinang + zp*cosang; +wave_3_per_point35=zq=yp*cosang - zp*sinang; +wave_3_per_point36= +wave_3_per_point37=//upper arm twist +wave_3_per_point38=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_3_per_point39=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point40=xp=xq*sinang + yq*cosang; +wave_3_per_point41=yp=xq*cosang - yq*sinang; +wave_3_per_point42=zp=zq; +wave_3_per_point43= +wave_3_per_point44=//upper arm outward; +wave_3_per_point45=zp=zp-0.35; +wave_3_per_point46=ang=cos(tm*2.3)*1.75 - 1.05; +wave_3_per_point47=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point48=xq=xp*sinang + zp*cosang; +wave_3_per_point49=yq=yp; +wave_3_per_point50=zq=xp*cosang - zp*sinang; +wave_3_per_point51= +wave_3_per_point52=//upper arm up down; +wave_3_per_point53=ang=cos(tm)*0.5 - 0.5; +wave_3_per_point54=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point55=xp=xq; +wave_3_per_point56=yp=yq*cosang - zq*sinang; +wave_3_per_point57=zp=yq*sinang + zq*cosang; +wave_3_per_point58= +wave_3_per_point59=//xp=xq;yp=yq;zp=zq; +wave_3_per_point60= +wave_3_per_point61= +wave_3_per_point62=//project into screenspace and draw on screen +wave_3_per_point63=zp=zp+2; +wave_3_per_point64=xs=-xp/zp; +wave_3_per_point65=ys=yp/zp; +wave_3_per_point66= +wave_3_per_point67=x=xs+0.5; +wave_3_per_point68=y=ys*1.3+0.5; +wave_3_per_point69= +wave_3_per_point70= +wave_3_per_point71=a=if( equal(q8,1) , (1-sample) , sample); +wave_3_per_point72=a=a*a; +wave_3_per_point73= +wave_3_per_point74= +wave_3_per_point75=b=b+pow(1-sample,2)*0.3; +wave_3_per_point76= +wave_3_per_point77=r1=t1; +wave_3_per_point78=g1=t2; +wave_3_per_point79=b1=t3; +wave_3_per_point80=r2=t4; +wave_3_per_point81=g2=t5; +wave_3_per_point82=b2=t6; +wave_3_per_point83= +wave_3_per_point84=r=r1*flip + r2*(1-flip); +wave_3_per_point85=g=g1*flip + g2*(1-flip); +wave_3_per_point86=b=b1*flip + b2*(1-flip); +shapecode_0_enabled=0 +shapecode_0_sides=5 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.067790 +shapecode_0_ang=0.753982 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=0.779769 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang=sin(q1*0.15); +shape_0_per_frame2=x=sin(q1*0.5) * 0.05 + 0.5; +shape_0_per_frame3=y=cos(q1*0.63)* 0.05 + 0.5 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=5 +shapecode_3_additive=1 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.038091 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=0.600000 +shapecode_3_b2=1.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +shape_3_per_frame1=tm=q1; +shape_3_per_frame2= +shape_3_per_frame3=xp=0; +shape_3_per_frame4=yp=0.1; +shape_3_per_frame5=zp=0; +shape_3_per_frame6= +shape_3_per_frame7=//wrist movement; +shape_3_per_frame8=ang=sin(tm*2 )*0.5 +0.5; +shape_3_per_frame9= +shape_3_per_frame10=xq=xp; +shape_3_per_frame11=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame12=yq=yp*sinang + zp*cosang; +shape_3_per_frame13=zq=yp*cosang - zp*sinang; +shape_3_per_frame14=yq=yp; +shape_3_per_frame15=zq=zp; +shape_3_per_frame16= +shape_3_per_frame17=ang=tm*8; +shape_3_per_frame18=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame19=xp=xq*sinang + yq*cosang; +shape_3_per_frame20=yp=xq*cosang - yq*sinang; +shape_3_per_frame21=zp=zq; +shape_3_per_frame22= +shape_3_per_frame23=//forearm movement; +shape_3_per_frame24=zp=zp-0.3; +shape_3_per_frame25=ang=3.14 + sin(tm*2 - 0.5)*1.5; +shape_3_per_frame26=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame27=xq=xp; +shape_3_per_frame28=yq=yp*sinang + zp*cosang; +shape_3_per_frame29=zq=yp*cosang - zp*sinang; +shape_3_per_frame30= +shape_3_per_frame31=//upper arm twist +shape_3_per_frame32=ang=-1.0 + cos(tm*3.1 + 0.5); +shape_3_per_frame33=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame34=xp=xq*sinang + yq*cosang; +shape_3_per_frame35=yp=xq*cosang - yq*sinang; +shape_3_per_frame36=zp=zq; +shape_3_per_frame37= +shape_3_per_frame38=//upper arm outward; +shape_3_per_frame39=zp=zp-0.35; +shape_3_per_frame40=ang=cos(tm*2.3)*1.75 - 1.05; +shape_3_per_frame41=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame42=xq=xp*sinang + zp*cosang; +shape_3_per_frame43=yq=yp; +shape_3_per_frame44=zq=xp*cosang - zp*sinang; +shape_3_per_frame45= +shape_3_per_frame46=//upper arm up down; +shape_3_per_frame47=ang=cos(tm)*0.5 - 0.5; +shape_3_per_frame48=sinang=sin(ang);cosang=cos(ang); +shape_3_per_frame49=xp=xq; +shape_3_per_frame50=yp=yq*cosang - zq*sinang; +shape_3_per_frame51=zp=yq*sinang + zq*cosang; +shape_3_per_frame52= +shape_3_per_frame53=//xp=xq;yp=yq;zp=zq; +shape_3_per_frame54= +shape_3_per_frame55= +shape_3_per_frame56=//project into screenspace and draw on screen +shape_3_per_frame57=zp=zp+2; +shape_3_per_frame58=xs=xp/zp; +shape_3_per_frame59=ys=yp/zp; +shape_3_per_frame60= +shape_3_per_frame61=x=xs+0.5; +shape_3_per_frame62=y=ys*1.3+0.5; +shape_3_per_frame63= +shape_3_per_frame64= +shape_3_per_frame65= +shape_3_per_frame66= +per_frame_init_1=mv_x=64;mv_y=48; +per_frame_init_2=nut=0; +per_frame_init_3=stp=0;stq=0; +per_frame_init_4=rtp=0;rtq=0; +per_frame_init_5=wvr=0; +per_frame_init_6=decay=0; +per_frame_init_7=dcsp=0; +per_frame_init_8=warp=0 +per_frame_init_9= +per_frame_1=zoom=1; +per_frame_2=//krash's beat detection code +per_frame_3=volume = 0.3*(bass+mid+att); +per_frame_4=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_5=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_6=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_7=peakbass_att = max(bass_att,peakbass_att); +per_frame_8=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_9=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_10=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_11=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_12=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_13=beatcounter = beatcounter + beat; +per_frame_14=mode = if(beat*equal(beatcounter%2,0),1-mode,mode); +per_frame_15=flip = 2*mode-1; +per_frame_16=monitor=flip; +per_frame_17=q8=flip; +per_frame_18= +per_frame_19=angadv=angadv+beat; +per_frame_20=angadv=if( above(angadv,5) , 2 , angadv ); +per_frame_21=q7=angadv; +per_frame_22= +per_frame_23= +per_frame_24=decay=0.95; +per_frame_25=zoom=1.002; +per_frame_26= +per_frame_27=vol=(bass_att+mid_att+treb_att)*0.25; +per_frame_28=vol=vol*vol; +per_frame_29=mtime=mtime+vol*0.1*flip*(37/fps); +per_frame_30= +per_frame_31=q1=mtime*0.4; +per_frame_32= +per_frame_33=warp=0.0; +per_frame_34= +per_frame_35=cx=sin(mtime*0.2)*0.4 + 0.5; +per_frame_36=cy=sin(mtime*0.33); +per_frame_37=cys=sign(cy); +per_frame_38=cy=cy*cy*cys; +per_frame_39=cy=cy*0.4+0.5; +per_frame_40= +per_frame_41=//cx=sin(time)*0.5+0.5; +per_frame_42=//cy=cos(time)*0.5+0.5; +per_frame_43=//cx=0.5; +per_frame_44=//cy=0.5; +per_frame_45=rot=sin(time*0.25)*0.31 +per_frame_46= +per_pixel_1=//tm=time+(sin(time)*rad); +per_pixel_2=//var=tan(time)*treb; +per_pixel_3=tbr=0.7+treb*0.3; +per_pixel_4=var=-2*tbr*0.75; +per_pixel_5= +per_pixel_6=ag=atan( (y-0.5-(cy-0.5))/(x-0.5-(cx-0.5)) )*1.75; +per_pixel_7=star=sin(ang*q7)*tbr; +per_pixel_8= +per_pixel_9=rdd=max( abs(x-0.5) , abs(y-0.5) )*4 ; +per_pixel_10=zm=1+(rdd/40)+(var/40)+star*0.003 ; +per_pixel_11= +per_pixel_12=//sx=zm; +per_pixel_13=//sy=zm; +per_pixel_14=//sx=1+star*0.1;sy=1+star*0.1; +per_pixel_15=sx=0.8;sy=sx; +per_pixel_16=//rot=star*0.01*tbr diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - heater core C_Phat's_class + sparks_mix.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - heater core C_Phat's_class + sparks_mix.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - heater core C_Phat's_class + sparks_mix.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - heater core C_Phat's_class + sparks_mix.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,445 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.980001 +fDecay=0.900000 +fVideoEchoZoom=0.999999 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=2 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.311600 +fWaveScale=1.228910 +fWaveSmoothing=0.000000 +fWaveParam=0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.459526 +fWarpScale=2.006761 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999902 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-1.000000 +warp=0.010000 +sx=0.999998 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=1 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=1 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.000000 +wavecode_0_g=0.900000 +wavecode_0_b=0.800000 +wavecode_0_a=1.000000 +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2= +wave_0_per_point3=freq=sin(q7*0.5)*4+4; +wave_0_per_point4= +wave_0_per_point5=scale=sin(n*freq)*0.3+0.7; +wave_0_per_point6=xp=sin(n*1)*0.3*scale; +wave_0_per_point7=yp=cos(n*1)*0.3*scale; +wave_0_per_point8=zp=abs(sin(n*freq+time)*0.1); +wave_0_per_point9= +wave_0_per_point10=//rotate on y +wave_0_per_point11=ang=(q7+time*0.01)*0.2; +wave_0_per_point12=xp2=xp*sin(ang) + zp*cos(ang); +wave_0_per_point13=yp2=yp; +wave_0_per_point14=zp2=xp*cos(ang) - zp*sin(ang); +wave_0_per_point15= +wave_0_per_point16=//rotate on x +wave_0_per_point17=ang=(q7+time*0.01)*0.3; +wave_0_per_point18=xp3=xp2; +wave_0_per_point19=yp3=yp2*sin(ang) + zp2*cos(ang); +wave_0_per_point20=zp3=yp2*cos(ang) - zp2*sin(ang); +wave_0_per_point21= +wave_0_per_point22= +wave_0_per_point23=xp=xp3; +wave_0_per_point24=yp=yp3; +wave_0_per_point25=zp=zp3; +wave_0_per_point26=zp=zp+2.1; +wave_0_per_point27=xs=xp/zp; +wave_0_per_point28=ys=yp/zp; +wave_0_per_point29= +wave_0_per_point30=x=xs+0.5; +wave_0_per_point31=y=ys*1.3+0.5; +wave_0_per_point32= +wave_0_per_point33= +wave_0_per_point34=aflux=sin(n*8+time)*0.5+0.5; +wave_0_per_point35=a=1 - (aflux*aflux)*q8*3 +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=1 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.700000 +wavecode_1_g=0.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2= +wave_1_per_point3=freq=sin(q7*0.5)*4+4; +wave_1_per_point4= +wave_1_per_point5=scale=sin(n*freq)*0.3+0.7; +wave_1_per_point6=xp=sin(n*1)*0.3*scale; +wave_1_per_point7=yp=cos(n*1)*0.3*scale; +wave_1_per_point8=zp=-abs(sin(n*freq+time)*0.1); +wave_1_per_point9= +wave_1_per_point10=//rotate on y +wave_1_per_point11=ang=(q7+time*0.01)*0.2; +wave_1_per_point12=xp2=xp*sin(ang) + zp*cos(ang); +wave_1_per_point13=yp2=yp; +wave_1_per_point14=zp2=xp*cos(ang) - zp*sin(ang); +wave_1_per_point15= +wave_1_per_point16=//rotate on x +wave_1_per_point17=ang=(q7+time*0.01)*0.3; +wave_1_per_point18=xp3=xp2; +wave_1_per_point19=yp3=yp2*sin(ang) + zp2*cos(ang); +wave_1_per_point20=zp3=yp2*cos(ang) - zp2*sin(ang); +wave_1_per_point21= +wave_1_per_point22= +wave_1_per_point23=xp=xp3; +wave_1_per_point24=yp=yp3; +wave_1_per_point25=zp=zp3; +wave_1_per_point26=zp=zp+2.1; +wave_1_per_point27=xs=xp/zp; +wave_1_per_point28=ys=yp/zp; +wave_1_per_point29= +wave_1_per_point30=x=xs+0.5; +wave_1_per_point31=y=ys*1.3+0.5; +wave_1_per_point32= +wave_1_per_point33= +wave_1_per_point34=aflux=sin(n*8+time)*0.5+0.5; +wave_1_per_point35=a=1 - (aflux*aflux)*q8*3 +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=1 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2= +wave_2_per_point3=freq=sin(q7*0.5)*4+4; +wave_2_per_point4= +wave_2_per_point5=aflux=sin(n*0.5); +wave_2_per_point6= +wave_2_per_point7=scale=sin(n*freq)*0.3+0.7; +wave_2_per_point8=xp=rand(10)-5; +wave_2_per_point9=xp=xp*0.0008*aflux; +wave_2_per_point10=yp=rand(10)-5; +wave_2_per_point11=yp=yp*0.0008*aflux; +wave_2_per_point12=zp=sample*3-1.5; +wave_2_per_point13= +wave_2_per_point14=//rotate on y +wave_2_per_point15=ang=(q7+time*0.01)*0.2; +wave_2_per_point16=xp2=xp*sin(ang) + zp*cos(ang); +wave_2_per_point17=yp2=yp; +wave_2_per_point18=zp2=xp*cos(ang) - zp*sin(ang); +wave_2_per_point19= +wave_2_per_point20=//rotate on x +wave_2_per_point21=ang=(q7+time*0.01)*0.3; +wave_2_per_point22=xp3=xp2; +wave_2_per_point23=yp3=yp2*sin(ang) + zp2*cos(ang); +wave_2_per_point24=zp3=yp2*cos(ang) - zp2*sin(ang); +wave_2_per_point25= +wave_2_per_point26= +wave_2_per_point27=xp=xp3; +wave_2_per_point28=yp=yp3; +wave_2_per_point29=zp=zp3; +wave_2_per_point30= +wave_2_per_point31=zp=zp+2.1; +wave_2_per_point32=xs=xp/zp; +wave_2_per_point33=ys=yp/zp; +wave_2_per_point34= +wave_2_per_point35=x=xs+0.5; +wave_2_per_point36=y=ys*1.3+0.5; +wave_2_per_point37= +wave_2_per_point38= +wave_2_per_point39= +wave_2_per_point40=a=aflux +wavecode_3_enabled=1 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=1 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=1 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=0.600000 +wavecode_3_b=0.150000 +wavecode_3_a=1.000000 +wave_3_per_frame1=spark=rand(40); +wave_3_per_frame2=spark= above(spark,37); +wave_3_per_frame3= +wave_3_per_frame4=t1=spark; +wave_3_per_frame5=t2=0; +wave_3_per_frame6=t3=0; +wave_3_per_point1=n=sample*6.283; +wave_3_per_point2=offran=1-t1*0.1; +wave_3_per_point3=sparkcycle=above( sin(n*2) , 0); +wave_3_per_point4= +wave_3_per_point5=zran=(rand(8) - 4); +wave_3_per_point6=xran=(rand(8) - 4); +wave_3_per_point7=yran=(rand(8) - 4); +wave_3_per_point8=alp=min( 1-abs(zran*0.25), min( 1-abs(xran*0.25),1-abs(yran*0.25) )); +wave_3_per_point9=alp=alp*alp; +wave_3_per_point10=a=alp*(1-t1) + t1; +wave_3_per_point11=zran=zran*0.001*offran; +wave_3_per_point12=xran=xran*0.001*offran; +wave_3_per_point13=yran=yran*0.001*offran; +wave_3_per_point14= +wave_3_per_point15=xseed=sin(sample*3.14+time*15)+sin(sample*11)*0.4; +wave_3_per_point16=yseed=cos(sample*3.14+time*9)+sin(sample*17+time)*0.4; +wave_3_per_point17=t2=t2+xseed*sparkcycle; +wave_3_per_point18=t3=t3+yseed*sparkcycle; +wave_3_per_point19=xspark=t2*0.002; +wave_3_per_point20=yspark=t3*0.008; +wave_3_per_point21= +wave_3_per_point22=scale=sin(n*freq)*0.3+0.7; +wave_3_per_point23=zp=sin(time)+ zran; +wave_3_per_point24=zp=zp + yspark*t1*sparkcycle; +wave_3_per_point25= +wave_3_per_point26=aflux=sin(zp*3.14 + 3.14); +wave_3_per_point27=xp=sin(n)*0.1*aflux + xran; +wave_3_per_point28=xp=xp + xspark*t1*sparkcycle; +wave_3_per_point29=yp=cos(n)*0.1*aflux + yran; +wave_3_per_point30= +wave_3_per_point31=//rotate on y +wave_3_per_point32=ang=(q7+time*0.01)*0.2; +wave_3_per_point33=xp2=xp*sin(ang) + zp*cos(ang); +wave_3_per_point34=yp2=yp; +wave_3_per_point35=zp2=xp*cos(ang) - zp*sin(ang); +wave_3_per_point36= +wave_3_per_point37=//rotate on x +wave_3_per_point38=ang=(q7+time*0.01)*0.3; +wave_3_per_point39=xp3=xp2; +wave_3_per_point40=yp3=yp2*sin(ang) + zp2*cos(ang); +wave_3_per_point41=zp3=yp2*cos(ang) - zp2*sin(ang); +wave_3_per_point42= +wave_3_per_point43= +wave_3_per_point44=xp=xp3; +wave_3_per_point45=yp=yp3; +wave_3_per_point46=zp=zp3; +wave_3_per_point47= +wave_3_per_point48=zp=zp+2.1; +wave_3_per_point49=xs=xp/zp; +wave_3_per_point50=xs=xs+0.5; +wave_3_per_point51=ys=yp/zp; +wave_3_per_point52=ys=ys*1.3 + 0.5; +wave_3_per_point53= +wave_3_per_point54=x=xs; +wave_3_per_point55=y=ys; +wave_3_per_point56= +wave_3_per_point57= +wave_3_per_point58= +wave_3_per_point59= +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_textured=0 +shapecode_0_x=0.800000 +shapecode_0_y=0.500000 +shapecode_0_rad=6.650134 +shapecode_0_ang=3.644249 +shapecode_0_tex_ang=3.141593 +shapecode_0_tex_zoom=0.274293 +shapecode_0_r=0.500000 +shapecode_0_g=0.500000 +shapecode_0_b=1.000000 +shapecode_0_a=0.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.500000 +shapecode_0_border_a=0.000000 +shape_0_init1=t1 = rand(100)*0.01; +shape_0_init2=t2 = rand(100)*0.01; +shape_0_per_frame1=border_a=treb; +shape_0_per_frame2=rad=bass; +shapecode_1_enabled=1 +shapecode_1_sides=3 +shapecode_1_additive=0 +shapecode_1_thickOutline=1 +shapecode_1_textured=0 +shapecode_1_x=0.370000 +shapecode_1_y=0.490000 +shapecode_1_rad=0.749999 +shapecode_1_ang=3.644249 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=2.216712 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=0.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=0.000000 +shapecode_1_border_g=0.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_init1=t1 = rand(100)*0.01; +shape_1_init2=t2 = rand(100)*0.01; +shape_1_init3=te = 1; +shape_1_init4=poly = 4; +shape_1_per_frame1= +shape_1_per_frame2=rate = fps/(fps+1/2); +shape_1_per_frame3=beat = above(bass,bassthresh); +shape_1_per_frame4=bassthresh = beat*4 + (1-beat)*((bassthresh - 1.5)*rate+1.5); +shape_1_per_frame5=ran = rand(8)+4; +shape_1_per_frame6=poly = if(beat,if(equal(ran,poly),poly+1,ran),poly); +shape_1_per_frame7=//poly = if(above(poly,8),4,poly); +shape_1_per_frame8=sides = poly; +shape_1_per_frame9= +shape_1_per_frame10=rate2 = fps/(fps+10); +shape_1_per_frame11=out = (1-beat)*rate2*out + beat; +shape_1_per_frame12=border_a = out; +shape_1_per_frame13=te = bass/fps/2 + te; +shape_1_per_frame14=x = x + 0.056*sin(te*1.67); +shape_1_per_frame15=y = y + 0.043*sin(te*1.23); +shape_1_per_frame16=ang = 3*sin(-te*0.67) + 3*cos(te*0.4); +shape_1_per_frame17=rad = rad * (0.9 + 0.2*t2) - 0.1*sin(te*1.51);; +shape_1_per_frame18=r = min(1,max(0,r + 0.3*sin(time*0.427 + 1))); +shape_1_per_frame19=g = min(1,max(0,g + 0.3*sin(time*0.401 + 2))); +shape_1_per_frame20=b = min(1,max(0,b + 0.3*sin(time*0.452 + 4))); +shape_1_per_frame21=r2 = min(1,max(0,r2 + 0.3*sin(time*0.417 + 3))); +shape_1_per_frame22=g2 = min(1,max(0,g2 + 0.3*sin(time*0.457 + 5))); +shape_1_per_frame23=b2 = min(1,max(0,b2 + 0.3*sin(time*0.434 + 6))); +shapecode_2_enabled=1 +shapecode_2_sides=40 +shapecode_2_additive=0 +shapecode_2_thickOutline=1 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.853568 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.220190 +shapecode_2_r=0.980000 +shapecode_2_g=0.000000 +shapecode_2_b=0.890000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.920000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=0.050000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=0.000000 +shapecode_2_border_a=0.000000 +shape_2_init1=t1 = rand(100)*0.01; +shape_2_init2=t2 = rand(100)*0.01; +shape_2_init3=te = 1; +shape_2_init4=poly = 5; +shape_2_per_frame1=ang=sin(time*0.4)*0.05 * (sin(time*0.4)*0.5+0.5) +shapecode_3_enabled=0 +shapecode_3_sides=3 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.265151 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=0.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=0.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=1.000000 +shape_3_per_frame1=rate = fps/(fps+1/2); +shape_3_per_frame2= +shape_3_per_frame3=ang = time*0.5; +shape_3_per_frame4=vol = (bass_att+mid_att+treb_att)/6; +shape_3_per_frame5=te = vol/fps + te; +shape_3_per_frame6=x = x + 0.2*sin(te*1.14); +shape_3_per_frame7=y = y + 0.2*sin(te*0.96+2); +shape_3_per_frame8= +shape_3_per_frame9=beat = above(vol*1.5,bassthresh); +shape_3_per_frame10=bassthresh = beat*4 + (1-beat)*((bassthresh - 1.4)*rate+1.4); +shape_3_per_frame11=poly = if(beat,rand(5)+3,poly); +shape_3_per_frame12=poly = if(equal(poly,7),rand(50)+7,poly); +shape_3_per_frame13=sides = poly; +shape_3_per_frame14=rad = rad-log(poly)/100; +shape_3_per_frame15= +shape_3_per_frame16=a=pow(vol*2,2); +shape_3_per_frame17=border_a=a; +shape_3_per_frame18=rad=rad*0.7+a*0.015 +per_frame_1=decay=1; +per_frame_2= +per_frame_3=vol=(bass+mid+treb)*0.25; +per_frame_4=vol=vol*vol; +per_frame_5=mtime=mtime+vol*0.018*(70/fps); +per_frame_6=q7=mtime; +per_frame_7=q8=vol +per_pixel_1=zoom=-1.02 + rad*10; +per_pixel_2=//rot=rad*500; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - heater core C_Phat's_on route_mix+beam.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - heater core C_Phat's_on route_mix+beam.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - heater core C_Phat's_on route_mix+beam.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - heater core C_Phat's_on route_mix+beam.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,453 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980001 +fDecay=0.900000 +fVideoEchoZoom=0.999999 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=2 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.311600 +fWaveScale=1.228910 +fWaveSmoothing=0.000000 +fWaveParam=0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.459526 +fWarpScale=2.006761 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999902 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-1.000000 +warp=0.010000 +sx=0.999998 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.055000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=1 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=1 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.000000 +wavecode_0_g=0.900000 +wavecode_0_b=0.800000 +wavecode_0_a=1.000000 +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2= +wave_0_per_point3=freq=sin(q7*0.5)*4+4; +wave_0_per_point4= +wave_0_per_point5=scale=sin(n*freq)*0.3+0.7; +wave_0_per_point6=xp=sin(n*1)*0.3*scale; +wave_0_per_point7=yp=cos(n*1)*0.3*scale; +wave_0_per_point8=zp=abs(sin(n*freq+time)*0.1); +wave_0_per_point9= +wave_0_per_point10=//rotate on y +wave_0_per_point11=ang=(q7+time*0.01)*0.2; +wave_0_per_point12=xp2=xp*sin(ang) + zp*cos(ang); +wave_0_per_point13=yp2=yp; +wave_0_per_point14=zp2=xp*cos(ang) - zp*sin(ang); +wave_0_per_point15= +wave_0_per_point16=//rotate on x +wave_0_per_point17=ang=(q7+time*0.01)*0.3; +wave_0_per_point18=xp3=xp2; +wave_0_per_point19=yp3=yp2*sin(ang) + zp2*cos(ang); +wave_0_per_point20=zp3=yp2*cos(ang) - zp2*sin(ang); +wave_0_per_point21= +wave_0_per_point22= +wave_0_per_point23=xp=xp3; +wave_0_per_point24=yp=yp3; +wave_0_per_point25=zp=zp3; +wave_0_per_point26=zp=zp+2.1; +wave_0_per_point27=xs=xp/zp; +wave_0_per_point28=ys=yp/zp; +wave_0_per_point29= +wave_0_per_point30=x=xs+0.5; +wave_0_per_point31=y=ys*1.3+0.5; +wave_0_per_point32= +wave_0_per_point33= +wave_0_per_point34=aflux=sin(n*8+time)*0.5+0.5; +wave_0_per_point35=a=1 - (aflux*aflux)*q8*3 +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=1 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.700000 +wavecode_1_g=0.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2= +wave_1_per_point3=freq=sin(q7*0.5)*4+4; +wave_1_per_point4= +wave_1_per_point5=scale=sin(n*freq)*0.3+0.7; +wave_1_per_point6=xp=sin(n*1)*0.3*scale; +wave_1_per_point7=yp=cos(n*1)*0.3*scale; +wave_1_per_point8=zp=-abs(sin(n*freq+time)*0.1); +wave_1_per_point9= +wave_1_per_point10=//rotate on y +wave_1_per_point11=ang=(q7+time*0.01)*0.2; +wave_1_per_point12=xp2=xp*sin(ang) + zp*cos(ang); +wave_1_per_point13=yp2=yp; +wave_1_per_point14=zp2=xp*cos(ang) - zp*sin(ang); +wave_1_per_point15= +wave_1_per_point16=//rotate on x +wave_1_per_point17=ang=(q7+time*0.01)*0.3; +wave_1_per_point18=xp3=xp2; +wave_1_per_point19=yp3=yp2*sin(ang) + zp2*cos(ang); +wave_1_per_point20=zp3=yp2*cos(ang) - zp2*sin(ang); +wave_1_per_point21= +wave_1_per_point22= +wave_1_per_point23=xp=xp3; +wave_1_per_point24=yp=yp3; +wave_1_per_point25=zp=zp3; +wave_1_per_point26=zp=zp+2.1; +wave_1_per_point27=xs=xp/zp; +wave_1_per_point28=ys=yp/zp; +wave_1_per_point29= +wave_1_per_point30=x=xs+0.5; +wave_1_per_point31=y=ys*1.3+0.5; +wave_1_per_point32= +wave_1_per_point33= +wave_1_per_point34=aflux=sin(n*8+time)*0.5+0.5; +wave_1_per_point35=a=1 - (aflux*aflux)*q8*3 +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=1 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2= +wave_2_per_point3=freq=sin(q7*0.5)*4+4; +wave_2_per_point4= +wave_2_per_point5=aflux=sin(n*0.5); +wave_2_per_point6= +wave_2_per_point7=scale=sin(n*freq)*0.3+0.7; +wave_2_per_point8=xp=rand(10)-5; +wave_2_per_point9=xp=xp*0.0008*aflux; +wave_2_per_point10=yp=rand(10)-5; +wave_2_per_point11=yp=yp*0.0008*aflux; +wave_2_per_point12=zp=sample*3-1.5; +wave_2_per_point13= +wave_2_per_point14=//rotate on y +wave_2_per_point15=ang=(q7+time*0.01)*0.2; +wave_2_per_point16=xp2=xp*sin(ang) + zp*cos(ang); +wave_2_per_point17=yp2=yp; +wave_2_per_point18=zp2=xp*cos(ang) - zp*sin(ang); +wave_2_per_point19= +wave_2_per_point20=//rotate on x +wave_2_per_point21=ang=(q7+time*0.01)*0.3; +wave_2_per_point22=xp3=xp2; +wave_2_per_point23=yp3=yp2*sin(ang) + zp2*cos(ang); +wave_2_per_point24=zp3=yp2*cos(ang) - zp2*sin(ang); +wave_2_per_point25= +wave_2_per_point26= +wave_2_per_point27=xp=xp3; +wave_2_per_point28=yp=yp3; +wave_2_per_point29=zp=zp3; +wave_2_per_point30= +wave_2_per_point31=zp=zp+2.1; +wave_2_per_point32=xs=xp/zp; +wave_2_per_point33=ys=yp/zp; +wave_2_per_point34= +wave_2_per_point35=x=xs+0.5; +wave_2_per_point36=y=ys*1.3+0.5; +wave_2_per_point37= +wave_2_per_point38= +wave_2_per_point39= +wave_2_per_point40=a=aflux +wavecode_3_enabled=1 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +wave_3_per_point1=n=sample*6.283; +wave_3_per_point2= +wave_3_per_point3= +wave_3_per_point4= +wave_3_per_point5=scale=sin(n*freq)*0.3+0.7; +wave_3_per_point6=zp=sin(time); +wave_3_per_point7=aflux=sin(zp*3.1415+3.1415); +wave_3_per_point8=xp=sin(n)*0.1*aflux; +wave_3_per_point9=yp=cos(n)*0.1*aflux; +wave_3_per_point10= +wave_3_per_point11= +wave_3_per_point12=//rotate on y +wave_3_per_point13=ang=(q7+time*0.01)*0.2; +wave_3_per_point14=xp2=xp*sin(ang) + zp*cos(ang); +wave_3_per_point15=yp2=yp; +wave_3_per_point16=zp2=xp*cos(ang) - zp*sin(ang); +wave_3_per_point17= +wave_3_per_point18=//rotate on x +wave_3_per_point19=ang=(q7+time*0.01)*0.3; +wave_3_per_point20=xp3=xp2; +wave_3_per_point21=yp3=yp2*sin(ang) + zp2*cos(ang); +wave_3_per_point22=zp3=yp2*cos(ang) - zp2*sin(ang); +wave_3_per_point23= +wave_3_per_point24= +wave_3_per_point25=xp=xp3; +wave_3_per_point26=yp=yp3; +wave_3_per_point27=zp=zp3; +wave_3_per_point28= +wave_3_per_point29=zp=zp+2.1; +wave_3_per_point30=xs=xp/zp; +wave_3_per_point31=ys=yp/zp; +wave_3_per_point32= +wave_3_per_point33=x=xs+0.5; +wave_3_per_point34=y=ys*1.3+0.5; +wave_3_per_point35= +wave_3_per_point36= +wave_3_per_point37= +wave_3_per_point38=a=aflux +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=6.650134 +shapecode_0_ang=3.644249 +shapecode_0_tex_ang=3.141593 +shapecode_0_tex_zoom=0.274293 +shapecode_0_r=0.500000 +shapecode_0_g=0.500000 +shapecode_0_b=1.000000 +shapecode_0_a=0.180000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_init1=t1 = rand(100)*0.01; +shape_0_init2=t2 = rand(100)*0.01; +shape_0_per_frame1=rate = fps/(fps+1/3); +shape_0_per_frame2=beat = above(bass,bassthresh); +shape_0_per_frame3=bassthresh = beat*4 + (1-beat)*((bassthresh - 1.3)*rate+1.3); +shape_0_per_frame4=poly = if(beat,rand(30)+6,poly); +shape_0_per_frame5=sides = poly; +shape_0_per_frame6= +shape_0_per_frame7=te = te + max(bass/fps/3,0.003); +shape_0_per_frame8=x = 0.5+0.45*sin(te*1.87)+0.07*sin(time*0.6); +shape_0_per_frame9=y = 0.5+0.35*cos(te*1.87)+0.07*sin(time*1.3); +shape_0_per_frame10=ang = 3*sin(-te*1.67) + 3*cos(te*0.4); +shape_0_per_frame11=rad = rad * (0.9 + 0.2*t2); +shape_0_per_frame12=r = min(1,max(0,r + 0.4*sin(time*0.517 + 1))); +shape_0_per_frame13=g = min(1,max(0,g + 0.4*sin(time*0.491 + 2))); +shape_0_per_frame14=b = min(1,max(0,b + 0.4*sin(time*0.532 + 4))); +shape_0_per_frame15=r2 = min(1,max(0,r2 + 0.4*sin(time*0.457 + 3))); +shape_0_per_frame16=g2 = min(1,max(0,g2 + 0.4*sin(time*0.437 + 5))); +shape_0_per_frame17=b2 = min(1,max(0,b2 + 0.4*sin(time*0.484 + 6))); +shapecode_1_enabled=0 +shapecode_1_sides=3 +shapecode_1_additive=0 +shapecode_1_thickOutline=1 +shapecode_1_textured=1 +shapecode_1_x=0.370000 +shapecode_1_y=0.490000 +shapecode_1_rad=0.749999 +shapecode_1_ang=3.644249 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=0.000000 +shapecode_1_border_g=0.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_init1=t1 = rand(100)*0.01; +shape_1_init2=t2 = rand(100)*0.01; +shape_1_init3=te = 1; +shape_1_init4=poly = 4; +shape_1_per_frame1= +shape_1_per_frame2=rate = fps/(fps+1/2); +shape_1_per_frame3=beat = above(bass,bassthresh); +shape_1_per_frame4=bassthresh = beat*4 + (1-beat)*((bassthresh - 1.5)*rate+1.5); +shape_1_per_frame5=ran = rand(8)+4; +shape_1_per_frame6=poly = if(beat,if(equal(ran,poly),poly+1,ran),poly); +shape_1_per_frame7=//poly = if(above(poly,8),4,poly); +shape_1_per_frame8=sides = poly; +shape_1_per_frame9= +shape_1_per_frame10=rate2 = fps/(fps+10); +shape_1_per_frame11=out = (1-beat)*rate2*out + beat; +shape_1_per_frame12=border_a = out; +shape_1_per_frame13=te = bass/fps/2 + te; +shape_1_per_frame14=x = x + 0.056*sin(te*1.67); +shape_1_per_frame15=y = y + 0.043*sin(te*1.23); +shape_1_per_frame16=ang = 3*sin(-te*0.67) + 3*cos(te*0.4); +shape_1_per_frame17=rad = rad * (0.9 + 0.2*t2) - 0.1*sin(te*1.51);; +shape_1_per_frame18=r = min(1,max(0,r + 0.3*sin(time*0.427 + 1))); +shape_1_per_frame19=g = min(1,max(0,g + 0.3*sin(time*0.401 + 2))); +shape_1_per_frame20=b = min(1,max(0,b + 0.3*sin(time*0.452 + 4))); +shape_1_per_frame21=r2 = min(1,max(0,r2 + 0.3*sin(time*0.417 + 3))); +shape_1_per_frame22=g2 = min(1,max(0,g2 + 0.3*sin(time*0.457 + 5))); +shape_1_per_frame23=b2 = min(1,max(0,b2 + 0.3*sin(time*0.434 + 6))); +shapecode_2_enabled=1 +shapecode_2_sides=40 +shapecode_2_additive=0 +shapecode_2_thickOutline=1 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.853568 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.220190 +shapecode_2_r=0.980000 +shapecode_2_g=0.000000 +shapecode_2_b=0.890000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.920000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=0.050000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=0.000000 +shapecode_2_border_a=0.000000 +shape_2_init1=t1 = rand(100)*0.01; +shape_2_init2=t2 = rand(100)*0.01; +shape_2_init3=te = 1; +shape_2_init4=poly = 5; +shape_2_per_frame1=ang=sin(time*0.4)*0.05 * (sin(time*0.4)*0.5+0.5) +shapecode_3_enabled=0 +shapecode_3_sides=3 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.265151 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.100000 +shapecode_3_g2=0.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=0.500000 +shapecode_3_border_g=0.500000 +shapecode_3_border_b=0.500000 +shapecode_3_border_a=1.000000 +shape_3_per_frame1=rate = fps/(fps+1/2); +shape_3_per_frame2= +shape_3_per_frame3=ang = time*0.5; +shape_3_per_frame4=vol = (bass_att+mid_att+treb_att)/6; +shape_3_per_frame5=te = vol/fps + te; +shape_3_per_frame6=x = x + 0.2*sin(te*1.14); +shape_3_per_frame7=y = y + 0.2*sin(te*0.96+2); +shape_3_per_frame8= +shape_3_per_frame9=beat = above(vol*1.5,bassthresh); +shape_3_per_frame10=bassthresh = beat*4 + (1-beat)*((bassthresh - 1.4)*rate+1.4); +shape_3_per_frame11=poly = if(beat,rand(5)+3,poly); +shape_3_per_frame12=poly = if(equal(poly,7),rand(50)+7,poly); +shape_3_per_frame13=sides = poly; +shape_3_per_frame14=rad = rad-log(poly)/100; +shape_3_per_frame15= +shape_3_per_frame16=a=pow(vol*2,2); +shape_3_per_frame17=border_a=a; +shape_3_per_frame18=rad=rad*0.7+a*0.015 +per_frame_1=//This Preset is based on Geiss - Feedback and Geiss - Feedback 2 +per_frame_2= +per_frame_3=//Ever since Geiss made those presets I've made slight changes +per_frame_4=//to them and saved them. They were so cool, I used to watch +per_frame_5=//them for hours. This preset is then one that flowed from +per_frame_6=//changing and tweaking those. +per_frame_7= +per_frame_8=//Almost everything is changed, but the one shape, (shape 4) +per_frame_9=//feeding back into the two bigger ones (shape 2 and 3) is +per_frame_10=//obtained from the Feedback presets. +per_frame_11= +per_frame_12=//I've added a 4th shape (shape 1) that is the big 'filter' +per_frame_13=//to change colours etc. It is also textured, so thats why +per_frame_14=//the 'triple' feedback is for. +per_frame_15= +per_frame_16=//Shapes 3 and 2 can have their borders displayed in a strobe +per_frame_17=//like fashion on beats. They also change amount of sides. +per_frame_18= +per_frame_19=//-Reenen +per_frame_20= +per_frame_21= +per_frame_22=decay=1; +per_frame_23= +per_frame_24=vol=(bass+mid+treb)*0.25; +per_frame_25=vol=vol*vol; +per_frame_26=mtime=mtime+vol*0.018*(68/fps); +per_frame_27=q7=mtime; +per_frame_28=q8=vol +per_pixel_1=zoom=-1.02 + ((rad*(treb*10))*(bass*bass)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S.+Phat - Arm_upgrades - transformer.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S.+Phat - Arm_upgrades - transformer.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S.+Phat - Arm_upgrades - transformer.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S.+Phat - Arm_upgrades - transformer.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,282 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.940000 +fVideoEchoZoom=1.001822 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=1 +bSolarize=0 +bInvert=1 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999998 +fShader=0.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.050000 +ob_r=1.000000 +ob_g=1.000000 +ob_b=1.000000 +ob_a=1.000000 +ib_size=0.050000 +ib_r=0.000000 +ib_g=1.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2=size=0.165; +wave_0_per_point3= +wave_0_per_point4=x=sin(n)*size + 0.5; +wave_0_per_point5=y=cos(n)*size*1.3333 + 0.5; +wave_0_per_point6= +wave_0_per_point7=flux=sin(n*2-time)*0.5+0.5; +wave_0_per_point8=r=sin(n)*0.5 + 0.5; +wave_0_per_point9=g=sin(n+2.1)*0.5+0.5; +wave_0_per_point10=b=sin(n+4.2)*0.5 + 0.5; +wave_0_per_point11=r=r*flux; +wave_0_per_point12=g=g*flux; +wave_0_per_point13=b=b*flux +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=1 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2=size=0.165; +wave_1_per_point3= +wave_1_per_point4=x=sin(n)*size + 0.5; +wave_1_per_point5=y=cos(n)*size*1.3333 + 0.5; +wave_1_per_point6= +wave_1_per_point7=flux=sin(n*2-time)*0.5+0.5; +wave_1_per_point8=r=sin(n)*0.5 + 0.5; +wave_1_per_point9=g=sin(n+2.1)*0.5+0.5; +wave_1_per_point10=b=sin(n+4.2)*0.5 + 0.5; +wave_1_per_point11=r=r*flux; +wave_1_per_point12=g=g*flux; +wave_1_per_point13=b=b*flux +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.542785 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x=.5+q4;y=.5+q5; +shapecode_1_enabled=1 +shapecode_1_sides=65 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.724343 +shapecode_1_ang=6.283185 +shapecode_1_tex_ang=3.141593 +shapecode_1_tex_zoom=1.020088 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=0.000000 +shapecode_1_border_g=0.000000 +shapecode_1_border_b=0.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=tex_ang=0.01; +shape_1_per_frame2=//tex_zoom=2.235; +shape_1_per_frame3=x=.5-q4; +shape_1_per_frame4=y=.5-q5; +shape_1_per_frame5= +shape_1_per_frame6=vol= (mid*mid+treb*treb); +shape_1_per_frame7=vol=vol* above(vol,1); +shape_1_per_frame8=//ang=ang+ vol*0.1; +shape_1_per_frame9=ang=(sin(time/2)*0.5+0.5)*6.28; +shapecode_2_enabled=1 +shapecode_2_sides=13 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.444840 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=0.550441 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shapecode_3_enabled=1 +shapecode_3_sides=14 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=0.000000 +shapecode_3_g=0.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=0.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +per_frame_init_1= +per_frame_init_2=zoom=1; +per_frame_init_3=xpos=0; +per_frame_init_4=ypos=0; +per_frame_1=decay=1; +per_frame_2= +per_frame_3=vol= (bass+mid+treb)*0.25; +per_frame_4=vol=vol*vol; +per_frame_5= +per_frame_6= +per_frame_7=mv_r = 0.5 + 0.4*sin(time*1.324); +per_frame_8=mv_g = 0.5 + 0.4*cos(time*1.371); +per_frame_9= +per_frame_10= +per_frame_11= +per_frame_12=musictime=musictime+vol*(44/fps); +per_frame_13= +per_frame_14=q4=0; +per_frame_15=q5=0; +per_frame_16=//q4=sin(musictime*0.02)*0.3; +per_frame_17=//q5=sin(musictime*0.01)*0.3; +per_frame_18= +per_frame_19=dx=sin(musictime*0.1)*0.07; +per_frame_20=dy=cos(musictime*0.069)*0.01; +per_frame_21=q1=sin(musictime*0.001)*0.4+0.5; +per_frame_22=q2=cos(musictime*0.001)*0.5+0.5; +per_frame_23= +per_frame_24=q8=musictime; +per_frame_25=zoom=.8; +per_frame_26= +per_frame_27=monitor=rot; +per_frame_28= +per_frame_29= +per_frame_30=musictime=musictime+mid*0.1; +per_frame_31= +per_frame_32=xpos=sin(musictime*0.1)*0.2; +per_frame_33=ypos=cos(musictime*0.1)*0.2; +per_frame_34=q4=xpos; +per_frame_35=q5=ypos diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. + Phat - chasers 18 hallway.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. + Phat - chasers 18 hallway.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. + Phat - chasers 18 hallway.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. + Phat - chasers 18 hallway.milk 2015-10-19 08:39:18.000000000 +0000 @@ -0,0 +1,633 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.280000 +fDecay=0.960000 +fVideoEchoZoom=0.996630 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.011726 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.037492 +fWarpScale=0.014889 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.033004 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.400000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.110000 +ob_g=0.000000 +ob_b=0.100000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000001 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=0.910000 +mv_b=0.710000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=1 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=1 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.100000 +wavecode_0_g=0.500000 +wavecode_0_b=0.800000 +wavecode_0_a=1.000000 +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2=phs=-sample * 0.2; +wave_0_per_point3=tm=q1 + ((phs*4)/q2)*0.1; +wave_0_per_point4= +wave_0_per_point5=flip=flip+1; +wave_0_per_point6=flip=flip*below(flip,2); +wave_0_per_point7= +wave_0_per_point8=xp=0; +wave_0_per_point9=yp=(flip*0.1-0.05)*(sample); +wave_0_per_point10=zp=0; +wave_0_per_point11= +wave_0_per_point12=//spin; +wave_0_per_point13=ang=tm*20 + sin(tm*76 + time*4)*0.4; +wave_0_per_point14=sa=sin(ang);ca=cos(ang); +wave_0_per_point15=xr=xp*sa + yp*ca; +wave_0_per_point16=yr=xp*ca - yp*sa; +wave_0_per_point17=zr=zp; +wave_0_per_point18= +wave_0_per_point19=xp=xr; +wave_0_per_point20=yp=yr + 0.05 + (sin(tm)*0.5 + 0.5)*0.2 + 0.05; +wave_0_per_point21=zp=zr; +wave_0_per_point22= +wave_0_per_point23=//wrist movement; +wave_0_per_point24=ang=sin(tm*2); +wave_0_per_point25= +wave_0_per_point26=xq=xp; +wave_0_per_point27=sa=sin(ang);ca=cos(ang); +wave_0_per_point28=yq=yp*sa + zp*ca; +wave_0_per_point29=zq=yp*ca - zp*sa; +wave_0_per_point30= +wave_0_per_point31= +wave_0_per_point32=ang=tm*8; +wave_0_per_point33=sa=sin(ang);ca=cos(ang); +wave_0_per_point34=xp=xq*sa + yq*ca; +wave_0_per_point35=yp=xq*ca - yq*sa; +wave_0_per_point36=zp=zq; +wave_0_per_point37= +wave_0_per_point38=//forearm movement; +wave_0_per_point39=zp=zp-0.3; +wave_0_per_point40=ang=3.14 + sin(tm*2 - 0.5)*2.5; +wave_0_per_point41=xq=xp; +wave_0_per_point42=sa=sin(ang);ca=cos(ang); +wave_0_per_point43=yq=yp*sa + zp*ca; +wave_0_per_point44=zq=yp*ca - zp*sa; +wave_0_per_point45= +wave_0_per_point46=//upper arm twist +wave_0_per_point47=ang=-1.0 + cos(tm*3 + 0.5); +wave_0_per_point48=xp=xq*sa + yq*ca; +wave_0_per_point49=yp=xq*ca - yq*sa; +wave_0_per_point50=zp=zq; +wave_0_per_point51= +wave_0_per_point52=//upper arm outward; +wave_0_per_point53=zp=zp-0.35; +wave_0_per_point54=ang=cos(tm*1)*1.75 - 1.05; +wave_0_per_point55=sa=sin(ang);ca=cos(ang); +wave_0_per_point56=xq=xp*sa + zp*ca; +wave_0_per_point57=yq=yp; +wave_0_per_point58=zq=xp*ca - zp*sa; +wave_0_per_point59= +wave_0_per_point60=//upper arm up down; +wave_0_per_point61=ang=cos(tm); +wave_0_per_point62=xp=xq; +wave_0_per_point63=sa=sin(ang);ca=cos(ang); +wave_0_per_point64=yp=yq*ca - zq*sa; +wave_0_per_point65=zp=yq*sa + zq*ca; +wave_0_per_point66= +wave_0_per_point67=yp=yp*0.1 - 0.2; +wave_0_per_point68= +wave_0_per_point69= +wave_0_per_point70=//project into screenspace and draw on screen +wave_0_per_point71=zp=zp+1.5; +wave_0_per_point72=xs=xp/zp; +wave_0_per_point73=ys=yp/zp; +wave_0_per_point74= +wave_0_per_point75=x=xs+0.5; +wave_0_per_point76=y=ys*1.3+0.5; +wave_0_per_point77= +wave_0_per_point78= +wave_0_per_point79=a=(1-sample)*0.3; +wave_0_per_point80= +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=1 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=0.900000 +wavecode_1_b=0.800000 +wavecode_1_a=1.000000 +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2=phs=-sample * 0.4 ; +wave_1_per_point3=tm=q1 + ((phs*2)/q2)*0.1 - 0.01; +wave_1_per_point4= +wave_1_per_point5=flip=flip+1; +wave_1_per_point6=flip=flip*below(flip,2); +wave_1_per_point7= +wave_1_per_point8=xp=0; +wave_1_per_point9=yp=(flip*0.2-0.1)*(sample); +wave_1_per_point10=zp=0; +wave_1_per_point11= +wave_1_per_point12=//spin; +wave_1_per_point13=ang=-tm*29 + sin(tm*76 + time*4)*0.4;; +wave_1_per_point14=sa=sin(ang);ca=cos(ang); +wave_1_per_point15=xr=xp*sa + yp*ca; +wave_1_per_point16=yr=xp*ca - yp*sa; +wave_1_per_point17=zr=zp; +wave_1_per_point18= +wave_1_per_point19=xp=xr; +wave_1_per_point20=yp=yr + 0.05 + (sin(tm)*0.5 + 0.5)*0.2 + 0.05; +wave_1_per_point21=zp=zr; +wave_1_per_point22= +wave_1_per_point23=//wrist movement; +wave_1_per_point24=ang=sin(tm*2); +wave_1_per_point25= +wave_1_per_point26=xq=xp; +wave_1_per_point27=sa=sin(ang);ca=cos(ang); +wave_1_per_point28=yq=yp*sa + zp*ca; +wave_1_per_point29=zq=yp*ca - zp*sa; +wave_1_per_point30= +wave_1_per_point31= +wave_1_per_point32=ang=tm*8; +wave_1_per_point33=sa=sin(ang);ca=cos(ang); +wave_1_per_point34=xp=xq*sa + yq*ca; +wave_1_per_point35=yp=xq*ca - yq*sa; +wave_1_per_point36=zp=zq; +wave_1_per_point37= +wave_1_per_point38=//forearm movement; +wave_1_per_point39=zp=zp-0.3; +wave_1_per_point40=ang=3.14 + sin(tm*2 - 0.5)*2.5; +wave_1_per_point41=xq=xp; +wave_1_per_point42=sa=sin(ang);ca=cos(ang); +wave_1_per_point43=yq=yp*sa + zp*ca; +wave_1_per_point44=zq=yp*ca - zp*sa; +wave_1_per_point45= +wave_1_per_point46=//upper arm twist +wave_1_per_point47=ang=-1.0 + cos(tm*3 + 0.5); +wave_1_per_point48=xp=xq*sa + yq*ca; +wave_1_per_point49=yp=xq*ca - yq*sa; +wave_1_per_point50=zp=zq; +wave_1_per_point51= +wave_1_per_point52=//upper arm outward; +wave_1_per_point53=zp=zp-0.35; +wave_1_per_point54=ang=cos(tm*1)*1.75 - 1.05; +wave_1_per_point55=sa=sin(ang);ca=cos(ang); +wave_1_per_point56=xq=xp*sa + zp*ca; +wave_1_per_point57=yq=yp; +wave_1_per_point58=zq=xp*ca - zp*sa; +wave_1_per_point59= +wave_1_per_point60=//upper arm up down; +wave_1_per_point61=ang=cos(tm); +wave_1_per_point62=xp=xq; +wave_1_per_point63=sa=sin(ang);ca=cos(ang); +wave_1_per_point64=yp=yq*ca - zq*sa; +wave_1_per_point65=zp=yq*sa + zq*ca; +wave_1_per_point66= +wave_1_per_point67=//xp=xq;yp=yq;zp=zq; +wave_1_per_point68= +wave_1_per_point69= +wave_1_per_point70=//project into screenspace and draw on screen +wave_1_per_point71=zp=zp+1.5; +wave_1_per_point72=xs=xp/zp; +wave_1_per_point73=ys=yp/zp; +wave_1_per_point74= +wave_1_per_point75=x=xs+0.5; +wave_1_per_point76=y=ys*1.3+0.5; +wave_1_per_point77= +wave_1_per_point78= +wave_1_per_point79=a=(1-sample); +wave_1_per_point80= +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=1 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=0.320000 +wavecode_2_b=0.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2=phs=-sample * 0.4 ; +wave_2_per_point3=tm=q1 + ((phs*2)/q2)*0.1 - 2.02; +wave_2_per_point4= +wave_2_per_point5=flip=flip+1; +wave_2_per_point6=flip=flip*below(flip,2); +wave_2_per_point7= +wave_2_per_point8=xp=0; +wave_2_per_point9=yp=(flip*0.2-0.1)*(sample); +wave_2_per_point10=zp=0; +wave_2_per_point11= +wave_2_per_point12=//spin; +wave_2_per_point13=ang=tm*23 + sin(tm*76 + time*4)*0.3;; +wave_2_per_point14=sa=sin(ang);ca=cos(ang); +wave_2_per_point15=xr=xp*sa + yp*ca; +wave_2_per_point16=yr=xp*ca - yp*sa; +wave_2_per_point17=zr=zp; +wave_2_per_point18= +wave_2_per_point19=xp=xr; +wave_2_per_point20=yp=yr + 0.05 + (sin(tm)*0.5 + 0.5)*0.2 + 0.05; +wave_2_per_point21=zp=zr; +wave_2_per_point22= +wave_2_per_point23=//wrist movement; +wave_2_per_point24=ang=sin(tm*2); +wave_2_per_point25= +wave_2_per_point26=xq=xp; +wave_2_per_point27=sa=sin(ang);ca=cos(ang); +wave_2_per_point28=yq=yp*sa + zp*ca; +wave_2_per_point29=zq=yp*ca - zp*sa; +wave_2_per_point30= +wave_2_per_point31= +wave_2_per_point32=ang=tm*8; +wave_2_per_point33=sa=sin(ang);ca=cos(ang); +wave_2_per_point34=xp=xq*sa + yq*ca; +wave_2_per_point35=yp=xq*ca - yq*sa; +wave_2_per_point36=zp=zq; +wave_2_per_point37= +wave_2_per_point38=//forearm movement; +wave_2_per_point39=zp=zp-0.3; +wave_2_per_point40=ang=3.14 + sin(tm*2 - 0.5)*2.5; +wave_2_per_point41=xq=xp; +wave_2_per_point42=sa=sin(ang);ca=cos(ang); +wave_2_per_point43=yq=yp*sa + zp*ca; +wave_2_per_point44=zq=yp*ca - zp*sa; +wave_2_per_point45= +wave_2_per_point46=//upper arm twist +wave_2_per_point47=ang=-1.0 + cos(tm*3 + 0.5); +wave_2_per_point48=xp=xq*sa + yq*ca; +wave_2_per_point49=yp=xq*ca - yq*sa; +wave_2_per_point50=zp=zq; +wave_2_per_point51= +wave_2_per_point52=//upper arm outward; +wave_2_per_point53=zp=zp-0.35; +wave_2_per_point54=ang=cos(tm*1)*1.75 - 1.05; +wave_2_per_point55=sa=sin(ang);ca=cos(ang); +wave_2_per_point56=xq=xp*sa + zp*ca; +wave_2_per_point57=yq=yp; +wave_2_per_point58=zq=xp*ca - zp*sa; +wave_2_per_point59= +wave_2_per_point60=//upper arm up down; +wave_2_per_point61=ang=cos(tm); +wave_2_per_point62=xp=xq; +wave_2_per_point63=sa=sin(ang);ca=cos(ang); +wave_2_per_point64=yp=yq*ca - zq*sa; +wave_2_per_point65=zp=yq*sa + zq*ca; +wave_2_per_point66= +wave_2_per_point67=//xp=xq;yp=yq;zp=zq; +wave_2_per_point68= +wave_2_per_point69= +wave_2_per_point70=//project into screenspace and draw on screen +wave_2_per_point71=zp=zp+1.5; +wave_2_per_point72=xs=xp/zp; +wave_2_per_point73=ys=yp/zp; +wave_2_per_point74= +wave_2_per_point75=x=xs+0.5; +wave_2_per_point76=y=ys*1.3+0.5; +wave_2_per_point77= +wave_2_per_point78= +wave_2_per_point79=a=(1-sample); +wavecode_3_enabled=1 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=1 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=0.600000 +wavecode_3_g=0.700000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +wave_3_per_point1=n=sample*6.283; +wave_3_per_point2=phs=-sample * 0.4 ; +wave_3_per_point3=tm=q1 + ((phs*2)/q2)*0.1 - 1.03; +wave_3_per_point4= +wave_3_per_point5=flip=flip+1; +wave_3_per_point6=flip=flip*below(flip,2); +wave_3_per_point7= +wave_3_per_point8=xp=0; +wave_3_per_point9=yp=(flip*0.15-0.075)*(sample); +wave_3_per_point10=zp=0; +wave_3_per_point11= +wave_3_per_point12=//spin; +wave_3_per_point13=ang=-tm*14 + sin(tm*76 + time*4)*0.2;; +wave_3_per_point14=sa=sin(ang);ca=cos(ang); +wave_3_per_point15=xr=xp*sa + yp*ca; +wave_3_per_point16=yr=xp*ca - yp*sa; +wave_3_per_point17=zr=zp; +wave_3_per_point18= +wave_3_per_point19=xp=xr; +wave_3_per_point20=yp=yr + 0.05 + (sin(tm)*0.5 + 0.5)*0.2 + 0.05; +wave_3_per_point21=zp=zr; +wave_3_per_point22= +wave_3_per_point23=//wrist movement; +wave_3_per_point24=ang=sin(tm*2); +wave_3_per_point25= +wave_3_per_point26=xq=xp; +wave_3_per_point27=sa=sin(ang);ca=cos(ang); +wave_3_per_point28=yq=yp*sa + zp*ca; +wave_3_per_point29=zq=yp*ca - zp*sa; +wave_3_per_point30= +wave_3_per_point31= +wave_3_per_point32=ang=tm*8; +wave_3_per_point33=sa=sin(ang);ca=cos(ang); +wave_3_per_point34=xp=xq*sa + yq*ca; +wave_3_per_point35=yp=xq*ca - yq*sa; +wave_3_per_point36=zp=zq; +wave_3_per_point37= +wave_3_per_point38=//forearm movement; +wave_3_per_point39=zp=zp-0.3; +wave_3_per_point40=ang=3.14 + sin(tm*2 - 0.5)*2.5; +wave_3_per_point41=xq=xp; +wave_3_per_point42=sa=sin(ang);ca=cos(ang); +wave_3_per_point43=yq=yp*sa + zp*ca; +wave_3_per_point44=zq=yp*ca - zp*sa; +wave_3_per_point45= +wave_3_per_point46=//upper arm twist +wave_3_per_point47=ang=-1.0 + cos(tm*3 + 0.5); +wave_3_per_point48=xp=xq*sa + yq*ca; +wave_3_per_point49=yp=xq*ca - yq*sa; +wave_3_per_point50=zp=zq; +wave_3_per_point51= +wave_3_per_point52=//upper arm outward; +wave_3_per_point53=zp=zp-0.35; +wave_3_per_point54=ang=cos(tm*1)*1.75 - 1.05; +wave_3_per_point55=sa=sin(ang);ca=cos(ang); +wave_3_per_point56=xq=xp*sa + zp*ca; +wave_3_per_point57=yq=yp; +wave_3_per_point58=zq=xp*ca - zp*sa; +wave_3_per_point59= +wave_3_per_point60=//upper arm up down; +wave_3_per_point61=ang=cos(tm)-3.5; +wave_3_per_point62=xp=xq; +wave_3_per_point63=sa=sin(ang);ca=cos(ang); +wave_3_per_point64=yp=yq*ca - zq*sa; +wave_3_per_point65=zp=yq*sa + zq*ca; +wave_3_per_point66= +wave_3_per_point67=//xp=xq;yp=yq;zp=zq; +wave_3_per_point68= +wave_3_per_point69= +wave_3_per_point70=//project into screenspace and draw on screen +wave_3_per_point71=zp=zp+1.5; +wave_3_per_point72=xs=xp/zp; +wave_3_per_point73=ys=yp/zp; +wave_3_per_point74= +wave_3_per_point75=x=xs+0.5; +wave_3_per_point76=y=ys*1.3+0.5; +wave_3_per_point77= +wave_3_per_point78= +wave_3_per_point79=a=(1-sample)*0.4; +shapecode_0_enabled=0 +shapecode_0_sides=6 +shapecode_0_additive=1 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.045563 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.700000 +shapecode_0_b=0.300000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=tm=q1; +shape_0_per_frame2= +shape_0_per_frame3=flip=flip+1; +shape_0_per_frame4=flip=flip*below(flip,2); +shape_0_per_frame5= +shape_0_per_frame6=xp=0; +shape_0_per_frame7=yp=0; +shape_0_per_frame8=zp=0; +shape_0_per_frame9= +shape_0_per_frame10=//spin; +shape_0_per_frame11=ang=tm*20 + sin(tm*76 + time*4)*0.4; +shape_0_per_frame12=sa=sin(ang);ca=cos(ang); +shape_0_per_frame13=xr=xp*sa + yp*ca; +shape_0_per_frame14=yr=xp*ca - yp*sa; +shape_0_per_frame15=zr=zp; +shape_0_per_frame16= +shape_0_per_frame17=xp=xr; +shape_0_per_frame18=yp=yr + 0.05 + (sin(tm)*0.5 + 0.5)*0.2 + 0.05; +shape_0_per_frame19=zp=zr; +shape_0_per_frame20= +shape_0_per_frame21=//wrist movement; +shape_0_per_frame22=ang=sin(tm*2); +shape_0_per_frame23= +shape_0_per_frame24=xq=xp; +shape_0_per_frame25=sa=sin(ang);ca=cos(ang); +shape_0_per_frame26=yq=yp*sa + zp*ca; +shape_0_per_frame27=zq=yp*ca - zp*sa; +shape_0_per_frame28= +shape_0_per_frame29= +shape_0_per_frame30=ang=tm*8; +shape_0_per_frame31=sa=sin(ang);ca=cos(ang); +shape_0_per_frame32=xp=xq*sa + yq*ca; +shape_0_per_frame33=yp=xq*ca - yq*sa; +shape_0_per_frame34=zp=zq; +shape_0_per_frame35= +shape_0_per_frame36=//forearm movement; +shape_0_per_frame37=zp=zp-0.3; +shape_0_per_frame38=ang=3.14 + sin(tm*2 - 0.5)*2.5; +shape_0_per_frame39=xq=xp; +shape_0_per_frame40=sa=sin(ang);ca=cos(ang); +shape_0_per_frame41=yq=yp*sa + zp*ca; +shape_0_per_frame42=zq=yp*ca - zp*sa; +shape_0_per_frame43= +shape_0_per_frame44=//upper arm twist +shape_0_per_frame45=ang=-1.0 + cos(tm*3 + 0.5); +shape_0_per_frame46=xp=xq*sa + yq*ca; +shape_0_per_frame47=yp=xq*ca - yq*sa; +shape_0_per_frame48=zp=zq; +shape_0_per_frame49= +shape_0_per_frame50=//upper arm outward; +shape_0_per_frame51=zp=zp-0.35; +shape_0_per_frame52=ang=cos(tm*1)*1.75 - 1.05; +shape_0_per_frame53=sa=sin(ang);ca=cos(ang); +shape_0_per_frame54=xq=xp*sa + zp*ca; +shape_0_per_frame55=yq=yp; +shape_0_per_frame56=zq=xp*ca - zp*sa; +shape_0_per_frame57= +shape_0_per_frame58=//upper arm up down; +shape_0_per_frame59=ang=cos(tm); +shape_0_per_frame60=xp=xq; +shape_0_per_frame61=sa=sin(ang);ca=cos(ang); +shape_0_per_frame62=yp=yq*ca - zq*sa; +shape_0_per_frame63=zp=yq*sa + zq*ca; +shape_0_per_frame64= +shape_0_per_frame65=//xp=xq;yp=yq;zp=zq; +shape_0_per_frame66= +shape_0_per_frame67= +shape_0_per_frame68=//project into screenspace and draw on screen +shape_0_per_frame69=zp=zp+1.5; +shape_0_per_frame70=xs=xp/zp; +shape_0_per_frame71=ys=yp/zp; +shape_0_per_frame72= +shape_0_per_frame73=x=xs+0.5; +shape_0_per_frame74=y=ys*1.3+0.5; +shape_0_per_frame75= +shape_0_per_frame76= +shape_0_per_frame77=a=0.7; +shape_0_per_frame78= +shapecode_1_enabled=1 +shapecode_1_sides=5 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.761306 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=mv_x=64;mv_y=48; +per_frame_init_2=nut=0; +per_frame_init_3=stp=0;stq=0; +per_frame_init_4=rtp=0;rtq=0; +per_frame_init_5=wvr=0; +per_frame_init_6=decay=0; +per_frame_init_7=dcsp=0 +per_frame_init_8= +per_frame_1=decay=0.98; +per_frame_2= +per_frame_3=vol=(bass+mid+treb)*0.25; +per_frame_4=vol=vol*vol; +per_frame_5= +per_frame_6=vol2=(bass_att+mid_att+treb_att)*0.25; +per_frame_7=vol2=vol2*vol2; +per_frame_8= +per_frame_9=q2=vol2; +per_frame_10= +per_frame_11=mtime=mtime+(0.03 * (sin(time)*0.5 + 0.5))*(75/fps); +per_frame_12= +per_frame_13=q1=mtime*1; +per_frame_14= +per_frame_15= +per_frame_16=gamma=1 + min(vol*0.8,1)*0.7; +per_frame_17= +per_frame_18= +per_pixel_1=zm=1.002; +per_pixel_2= +per_pixel_3=sx=-zm; +per_pixel_4=sy=zm; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S.+Phat Cool Bug v2 + (Krash's beat detection).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S.+Phat Cool Bug v2 + (Krash's beat detection).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S.+Phat Cool Bug v2 + (Krash's beat detection).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S.+Phat Cool Bug v2 + (Krash's beat detection).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,261 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.940000 +fVideoEchoZoom=0.498313 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999998 +fShader=1.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.030000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=6.400000 +nMotionVectorsY=43.199997 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=0.910000 +mv_b=0.710000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.491382 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x=.5+q4;y=.5+q5; +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.444842 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=0.819541 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=tex_ang=0.01; +shape_1_per_frame2=x=.5+q4;y=.5+q5; +shape_1_per_frame3=ang = time/5 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=zoom=1; +per_frame_init_2=xpos=0; +per_frame_init_3=ypos=0; +per_frame_1=decay=1; +per_frame_2= +per_frame_3=vol= (bass+mid+treb)*0.55; +per_frame_4=vol=vol; +per_frame_5= +per_frame_6= +per_frame_7=mv_r = 0.5 + 0.4*sin(time*1.324); +per_frame_8=mv_g = 0.5 + 0.4*cos(time*1.371); +per_frame_9= +per_frame_10= +per_frame_11= +per_frame_12= +per_frame_13=zoom=.9; +per_frame_14= +per_frame_15=musictime=musictime+vol*(75/fps); +per_frame_16= +per_frame_17=q4=sin(musictime*0.02)*0.3; +per_frame_18=q5=sin(musictime*0.01)*0.3; +per_frame_19= +per_frame_20=dx=sin(musictime*0.1)*0.01; +per_frame_21=dy=cos(musictime*0.069)*0.01; +per_frame_22= +per_frame_23= +per_frame_24= +per_frame_25= +per_frame_26=monitor=rot; +per_frame_27= +per_frame_28= +per_frame_29= +per_frame_30=//krash's beat detection code +per_frame_31=volume = 0.3*(bass+mid+att); +per_frame_32=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_33=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_34=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_35=peakbass_att = max(bass_att,peakbass_att); +per_frame_36=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_37=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_38=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_39=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_40=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_41=beatcounter = beatcounter + beat; +per_frame_42=mode = if(beat*equal(beatcounter%2,0),1-mode,mode); +per_frame_43=flip = 2*mode-1; +per_frame_44=flip = flip*0.5+0.5; +per_frame_45= +per_frame_46=rot = -time/4 * flip; +per_frame_47= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - repeater 05 - rave on acid.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - repeater 05 - rave on acid.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - repeater 05 - rave on acid.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - repeater 05 - rave on acid.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,636 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.630000 +fDecay=0.960000 +fVideoEchoZoom=0.996630 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.011726 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.037492 +fWarpScale=0.014889 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.033004 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.400000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.110000 +ob_g=0.000000 +ob_b=0.100000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=43.199997 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=0.910000 +mv_b=0.710000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.100000 +wavecode_0_g=1.000000 +wavecode_0_b=0.700000 +wavecode_0_a=1.000000 +wave_0_per_frame1=t1=sin(time)*0.5+0.5; +wave_0_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_0_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_0_per_frame4= +wave_0_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_0_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_0_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2=phs=-sample * 0.2; +wave_0_per_point3=tm=q1 + phs; +wave_0_per_point4= +wave_0_per_point5=flip=flip+1; +wave_0_per_point6=flip=flip*below(flip,2); +wave_0_per_point7= +wave_0_per_point8=xp=0; +wave_0_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_0_per_point10=zp=0; +wave_0_per_point11= +wave_0_per_point12=//wrist movement; +wave_0_per_point13=ang=sin(tm*2 )*0.5 +0.5; +wave_0_per_point14= +wave_0_per_point15=xq=xp; +wave_0_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point17=yq=yp*sinang + zp*cosang; +wave_0_per_point18=zq=yp*cosang - zp*sinang; +wave_0_per_point19=yq=yp; +wave_0_per_point20=zq=zp; +wave_0_per_point21= +wave_0_per_point22=ang=tm*8; +wave_0_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point24=xp=xq*sinang + yq*cosang; +wave_0_per_point25=yp=xq*cosang - yq*sinang; +wave_0_per_point26=zp=zq; +wave_0_per_point27= +wave_0_per_point28=//forearm movement; +wave_0_per_point29=zp=zp-0.3; +wave_0_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_0_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point32=xq=xp; +wave_0_per_point33=yq=yp*sinang + zp*cosang; +wave_0_per_point34=zq=yp*cosang - zp*sinang; +wave_0_per_point35= +wave_0_per_point36=//upper arm twist +wave_0_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_0_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point39=xp=xq*sinang + yq*cosang; +wave_0_per_point40=yp=xq*cosang - yq*sinang; +wave_0_per_point41=zp=zq; +wave_0_per_point42= +wave_0_per_point43=//upper arm outward; +wave_0_per_point44=zp=zp-0.35; +wave_0_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_0_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point47=xq=xp*sinang + zp*cosang; +wave_0_per_point48=yq=yp; +wave_0_per_point49=zq=xp*cosang - zp*sinang; +wave_0_per_point50= +wave_0_per_point51=//upper arm up down; +wave_0_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_0_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point54=xp=xq; +wave_0_per_point55=yp=yq*cosang - zq*sinang; +wave_0_per_point56=zp=yq*sinang + zq*cosang; +wave_0_per_point57= +wave_0_per_point58=//xp=xq;yp=yq;zp=zq; +wave_0_per_point59= +wave_0_per_point60= +wave_0_per_point61=//project into screenspace and draw on screen +wave_0_per_point62=zp=zp+2; +wave_0_per_point63=xs=xp/zp; +wave_0_per_point64=ys=yp/zp; +wave_0_per_point65= +wave_0_per_point66=x=xs+0.5; +wave_0_per_point67=y=ys*1.3+0.5; +wave_0_per_point68= +wave_0_per_point69= +wave_0_per_point70=a=if( equal(q8,1) , (1-sample) , sample); +wave_0_per_point71=a=a*a; +wave_0_per_point72= +wave_0_per_point73=b=b+pow(1-sample,2)*0.3; +wave_0_per_point74= +wave_0_per_point75= +wave_0_per_point76= +wave_0_per_point77=r1=t1; +wave_0_per_point78=g1=t2; +wave_0_per_point79=b1=t3; +wave_0_per_point80=r2=t4; +wave_0_per_point81=g2=t5; +wave_0_per_point82=b2=t6; +wave_0_per_point83= +wave_0_per_point84=r=r1*flip + r2*(1-flip); +wave_0_per_point85=g=g1*flip + g2*(1-flip); +wave_0_per_point86=b=b1*flip + b2*(1-flip); +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.200000 +wavecode_1_g=1.000000 +wavecode_1_b=0.600000 +wavecode_1_a=1.000000 +wave_1_per_frame1=t1=sin(time)*0.5+0.5; +wave_1_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_1_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_1_per_frame4= +wave_1_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_1_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_1_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2=phs=-sample * 0.2; +wave_1_per_point3=tm=q1 + phs; +wave_1_per_point4= +wave_1_per_point5=flip=flip+1; +wave_1_per_point6=flip=flip*below(flip,2); +wave_1_per_point7= +wave_1_per_point8=xp=0; +wave_1_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2 +0.1; +wave_1_per_point10=yp=-yp; +wave_1_per_point11=zp=0; +wave_1_per_point12= +wave_1_per_point13=//wrist movement; +wave_1_per_point14=ang=sin(tm*2)*0.5 +0.5; +wave_1_per_point15= +wave_1_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point17=xq=xp; +wave_1_per_point18=yq=yp*sinang + zp*cosang; +wave_1_per_point19=zq=yp*cosang - zp*sinang; +wave_1_per_point20=yq=yp; +wave_1_per_point21=zq=zp; +wave_1_per_point22= +wave_1_per_point23=ang=tm*8; +wave_1_per_point24=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point25=xp=xq*sinang + yq*cosang; +wave_1_per_point26=yp=xq*cosang - yq*sinang; +wave_1_per_point27=zp=zq; +wave_1_per_point28= +wave_1_per_point29=//forearm movement; +wave_1_per_point30=zp=zp-0.3; +wave_1_per_point31=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_1_per_point32=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point33=xq=xp; +wave_1_per_point34=yq=yp*sinang + zp*cosang; +wave_1_per_point35=zq=yp*cosang - zp*sinang; +wave_1_per_point36= +wave_1_per_point37=//upper arm twist +wave_1_per_point38=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_1_per_point39=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point40=xp=xq*sinang + yq*cosang; +wave_1_per_point41=yp=xq*cosang - yq*sinang; +wave_1_per_point42=zp=zq; +wave_1_per_point43= +wave_1_per_point44=//upper arm outward; +wave_1_per_point45=zp=zp-0.35; +wave_1_per_point46=ang=cos(tm*2.3)*1.75 - 1.05; +wave_1_per_point47=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point48=xq=xp*sinang + zp*cosang; +wave_1_per_point49=yq=yp; +wave_1_per_point50=zq=xp*cosang - zp*sinang; +wave_1_per_point51= +wave_1_per_point52=//upper arm up down; +wave_1_per_point53=ang=cos(tm)*0.5 - 0.5; +wave_1_per_point54=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point55=xp=xq; +wave_1_per_point56=yp=yq*cosang - zq*sinang; +wave_1_per_point57=zp=yq*sinang + zq*cosang; +wave_1_per_point58= +wave_1_per_point59=//xp=xq;yp=yq;zp=zq; +wave_1_per_point60= +wave_1_per_point61= +wave_1_per_point62=//project into screenspace and draw on screen +wave_1_per_point63=zp=zp+2; +wave_1_per_point64=xs=xp/zp; +wave_1_per_point65=ys=yp/zp; +wave_1_per_point66= +wave_1_per_point67=x=xs+0.5; +wave_1_per_point68=y=ys*1.3+0.5; +wave_1_per_point69= +wave_1_per_point70= +wave_1_per_point71=a=if( equal(q8,1) , (1-sample) , sample); +wave_1_per_point72=a=a*a; +wave_1_per_point73= +wave_1_per_point74= +wave_1_per_point75=b=b+pow(1-sample,2)*0.3; +wave_1_per_point76= +wave_1_per_point77=r1=t1; +wave_1_per_point78=g1=t2; +wave_1_per_point79=b1=t3; +wave_1_per_point80=r2=t4; +wave_1_per_point81=g2=t5; +wave_1_per_point82=b2=t6; +wave_1_per_point83= +wave_1_per_point84=r=r1*flip + r2*(1-flip); +wave_1_per_point85=g=g1*flip + g2*(1-flip); +wave_1_per_point86=b=b1*flip + b2*(1-flip); +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=1 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=1 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=0.600000 +wavecode_2_b=0.100000 +wavecode_2_a=1.000000 +wave_2_per_frame1=t1=sin(time)*0.5+0.5; +wave_2_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_2_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_2_per_frame4= +wave_2_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_2_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_2_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_2_per_frame8= +wave_2_per_frame9= +wave_2_per_frame10=t8= int( sin(time*2)*2 + 3); +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2=phs=-sample * 0.2; +wave_2_per_point3=tm=q1 + phs; +wave_2_per_point4= +wave_2_per_point5=flip=flip+1; +wave_2_per_point6=flip=flip*below(flip,2); +wave_2_per_point7= +wave_2_per_point8=xp=0; +wave_2_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_2_per_point10=zp=0; +wave_2_per_point11= +wave_2_per_point12=//wrist movement; +wave_2_per_point13=ang=sin(tm*2)*0.5 +0.5; +wave_2_per_point14= +wave_2_per_point15=xq=xp; +wave_2_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point17=yq=yp*sinang + zp*cosang; +wave_2_per_point18=zq=yp*cosang - zp*sinang; +wave_2_per_point19=yq=yp; +wave_2_per_point20=zq=zp; +wave_2_per_point21= +wave_2_per_point22=ang=tm*8 + 1; +wave_2_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point24=xp=xq*sinang + yq*cosang; +wave_2_per_point25=yp=xq*cosang - yq*sinang; +wave_2_per_point26=zp=zq; +wave_2_per_point27= +wave_2_per_point28=//forearm movement; +wave_2_per_point29=zp=zp-0.3; +wave_2_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_2_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point32=xq=xp; +wave_2_per_point33=yq=yp*sinang + zp*cosang; +wave_2_per_point34=zq=yp*cosang - zp*sinang; +wave_2_per_point35= +wave_2_per_point36=//upper arm twist +wave_2_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_2_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point39=xp=xq*sinang + yq*cosang; +wave_2_per_point40=yp=xq*cosang - yq*sinang; +wave_2_per_point41=zp=zq; +wave_2_per_point42= +wave_2_per_point43=//upper arm outward; +wave_2_per_point44=zp=zp-0.35; +wave_2_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_2_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point47=xq=xp*sinang + zp*cosang; +wave_2_per_point48=yq=yp; +wave_2_per_point49=zq=xp*cosang - zp*sinang; +wave_2_per_point50= +wave_2_per_point51=//upper arm up down; +wave_2_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_2_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point54=xp=xq; +wave_2_per_point55=yp=yq*cosang - zq*sinang; +wave_2_per_point56=zp=yq*sinang + zq*cosang; +wave_2_per_point57= +wave_2_per_point58=//xp=xq;yp=yq;zp=zq; +wave_2_per_point59= +wave_2_per_point60= +wave_2_per_point61=//project into screenspace and draw on screen +wave_2_per_point62=zp=zp+2; +wave_2_per_point63=xs=xp/zp; +wave_2_per_point64=ys=yp/zp; +wave_2_per_point65= +wave_2_per_point66=x=xs+0.5; +wave_2_per_point67=y=ys*1.3+0.5; +wave_2_per_point68= +wave_2_per_point69=a=if( equal(q8,1) , (1-sample) , sample); +wave_2_per_point70= +wave_2_per_point71= +wave_2_per_point72=a=a* above( sin(tm*128*t8) , 0 ); +wave_2_per_point73= +wave_2_per_point74= +wave_2_per_point75=r=t4; +wave_2_per_point76=g=t5; +wave_2_per_point77=b=t6; +wave_2_per_point78= +wavecode_3_enabled=1 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=1 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=1 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=0.300000 +wavecode_3_b=0.100000 +wavecode_3_a=1.000000 +wave_3_per_frame1=t1=sin(time)*0.5+0.5; +wave_3_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_3_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_3_per_frame4= +wave_3_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_3_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_3_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_3_per_frame8= +wave_3_per_frame9= +wave_3_per_frame10=t8= int( sin(time*2)*2 + 3); +wave_3_per_point1=n=sample*6.283; +wave_3_per_point2=phs=-sample * 0.2; +wave_3_per_point3=tm=q1 + phs; +wave_3_per_point4= +wave_3_per_point5=flip=flip+1; +wave_3_per_point6=flip=flip*below(flip,2); +wave_3_per_point7= +wave_3_per_point8=xp=0; +wave_3_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2 +0.1; +wave_3_per_point10=yp=-yp; +wave_3_per_point11=zp=0; +wave_3_per_point12= +wave_3_per_point13=//wrist movement; +wave_3_per_point14=ang=sin(tm*2)*0.5 +0.5; +wave_3_per_point15= +wave_3_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point17=xq=xp; +wave_3_per_point18=yq=yp*sinang + zp*cosang; +wave_3_per_point19=zq=yp*cosang - zp*sinang; +wave_3_per_point20=yq=yp; +wave_3_per_point21=zq=zp; +wave_3_per_point22= +wave_3_per_point23=ang=tm*8+1; +wave_3_per_point24=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point25=xp=xq*sinang + yq*cosang; +wave_3_per_point26=yp=xq*cosang - yq*sinang; +wave_3_per_point27=zp=zq; +wave_3_per_point28= +wave_3_per_point29=//forearm movement; +wave_3_per_point30=zp=zp-0.3; +wave_3_per_point31=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_3_per_point32=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point33=xq=xp; +wave_3_per_point34=yq=yp*sinang + zp*cosang; +wave_3_per_point35=zq=yp*cosang - zp*sinang; +wave_3_per_point36= +wave_3_per_point37=//upper arm twist +wave_3_per_point38=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_3_per_point39=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point40=xp=xq*sinang + yq*cosang; +wave_3_per_point41=yp=xq*cosang - yq*sinang; +wave_3_per_point42=zp=zq; +wave_3_per_point43= +wave_3_per_point44=//upper arm outward; +wave_3_per_point45=zp=zp-0.35; +wave_3_per_point46=ang=cos(tm*2.3)*1.75 - 1.05; +wave_3_per_point47=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point48=xq=xp*sinang + zp*cosang; +wave_3_per_point49=yq=yp; +wave_3_per_point50=zq=xp*cosang - zp*sinang; +wave_3_per_point51= +wave_3_per_point52=//upper arm up down; +wave_3_per_point53=ang=cos(tm)*0.5 - 0.5; +wave_3_per_point54=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point55=xp=xq; +wave_3_per_point56=yp=yq*cosang - zq*sinang; +wave_3_per_point57=zp=yq*sinang + zq*cosang; +wave_3_per_point58= +wave_3_per_point59=//xp=xq;yp=yq;zp=zq; +wave_3_per_point60= +wave_3_per_point61= +wave_3_per_point62=//project into screenspace and draw on screen +wave_3_per_point63=zp=zp+2; +wave_3_per_point64=xs=xp/zp; +wave_3_per_point65=ys=yp/zp; +wave_3_per_point66= +wave_3_per_point67=x=xs+0.5; +wave_3_per_point68=y=ys*1.3+0.5; +wave_3_per_point69= +wave_3_per_point70= +wave_3_per_point71=a=if( equal(q8,1) , (1-sample) , sample); +wave_3_per_point72=a=a*a; +wave_3_per_point73= +wave_3_per_point74=a=a* above( sin(tm*128*t8) , 0 ); +wave_3_per_point75= +wave_3_per_point76= +wave_3_per_point77=r=t4; +wave_3_per_point78=g=t5; +wave_3_per_point79=b=t6; +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.260000 +shapecode_0_y=0.809999 +shapecode_0_rad=0.892690 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.082857 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = 0.264; +shape_0_per_frame2= +shape_0_per_frame3=r2=r2*q4; +shape_0_per_frame4=g2=g2*q4; +shape_0_per_frame5=b2=b2*q4; +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.740000 +shapecode_1_y=0.809999 +shapecode_1_rad=0.892690 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.082857 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=x=0.737; +shape_1_per_frame2= +shape_1_per_frame3= +shape_1_per_frame4=r2=r2*q4; +shape_1_per_frame5=g2=g2*q4; +shape_1_per_frame6=b2=b2*q4; +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.260000 +shapecode_2_y=0.179999 +shapecode_2_rad=0.892690 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.082857 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=x = 0.264; +shape_2_per_frame2=y = 0.178; +shape_2_per_frame3= +shape_2_per_frame4= +shape_2_per_frame5=r2=r2*q4; +shape_2_per_frame6=g2=g2*q4; +shape_2_per_frame7=b2=b2*q4; +shapecode_3_enabled=1 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.740000 +shapecode_3_y=0.809999 +shapecode_3_rad=0.892690 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.082857 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=1.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=x=0.737; +shape_3_per_frame2=y = 0.178; +shape_3_per_frame3= +shape_3_per_frame4= +shape_3_per_frame5=r2=r2*q4; +shape_3_per_frame6=g2=g2*q4; +shape_3_per_frame7=b2=b2*q4; +per_frame_init_1=mv_x=64;mv_y=48; +per_frame_init_2=nut=0; +per_frame_init_3=stp=0;stq=0; +per_frame_init_4=rtp=0;rtq=0; +per_frame_init_5=wvr=0; +per_frame_init_6=decay=0; +per_frame_init_7=dcsp=0; +per_frame_init_8=warp=0 +per_frame_init_9= +per_frame_1= +per_frame_2=//krash's beat detection code +per_frame_3=volume = 0.3*(bass+mid+att); +per_frame_4=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_5=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_6=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_7=peakbass_att = max(bass_att,peakbass_att); +per_frame_8=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_9=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_10=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_11=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_12=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_13=beatcounter = beatcounter + beat; +per_frame_14=mode = if(beat*equal(beatcounter%2,0),1-mode,mode); +per_frame_15=flip = 2*mode-1; +per_frame_16=monitor=flip; +per_frame_17=q8=flip; +per_frame_18= +per_frame_19= +per_frame_20=decay=0.98; +per_frame_21=zoom=1.01; +per_frame_22= +per_frame_23=vol=(bass_att+mid_att+treb_att)*0.25; +per_frame_24=vol=vol*vol; +per_frame_25=mtime=mtime+vol*0.1*flip*(45/fps); +per_frame_26= +per_frame_27=q1=mtime*0.4; +per_frame_28= +per_frame_29=warp=0.0; +per_frame_30= +per_frame_31= +per_frame_32=q4 = min( vol*0.8 , 1 )*0.1 + 0.9 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - repeater 15 - kaleidoscope b.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - repeater 15 - kaleidoscope b.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - repeater 15 - kaleidoscope b.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Eo.S. - repeater 15 - kaleidoscope b.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,640 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.960000 +fVideoEchoZoom=0.996630 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.011726 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.037492 +fWarpScale=0.014889 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.033004 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.400000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.110000 +ob_g=0.000000 +ob_b=0.100000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=43.199997 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=0.910000 +mv_b=0.710000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.100000 +wavecode_0_g=1.000000 +wavecode_0_b=0.700000 +wavecode_0_a=1.000000 +wave_0_per_frame1=t1=sin(time)*0.5+0.5; +wave_0_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_0_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_0_per_frame4= +wave_0_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_0_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_0_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2=phs=-sample * 0.2; +wave_0_per_point3=tm=q1 + phs; +wave_0_per_point4= +wave_0_per_point5=flip=flip+1; +wave_0_per_point6=flip=flip*below(flip,2); +wave_0_per_point7= +wave_0_per_point8=xp=0; +wave_0_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_0_per_point10=zp=0; +wave_0_per_point11= +wave_0_per_point12=//wrist movement; +wave_0_per_point13=ang=sin(tm*2 )*0.5 +0.5; +wave_0_per_point14= +wave_0_per_point15=xq=xp; +wave_0_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point17=yq=yp*sinang + zp*cosang; +wave_0_per_point18=zq=yp*cosang - zp*sinang; +wave_0_per_point19=yq=yp; +wave_0_per_point20=zq=zp; +wave_0_per_point21= +wave_0_per_point22=ang=tm*8; +wave_0_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point24=xp=xq*sinang + yq*cosang; +wave_0_per_point25=yp=xq*cosang - yq*sinang; +wave_0_per_point26=zp=zq; +wave_0_per_point27= +wave_0_per_point28=//forearm movement; +wave_0_per_point29=zp=zp-0.3; +wave_0_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_0_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point32=xq=xp; +wave_0_per_point33=yq=yp*sinang + zp*cosang; +wave_0_per_point34=zq=yp*cosang - zp*sinang; +wave_0_per_point35= +wave_0_per_point36=//upper arm twist +wave_0_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_0_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point39=xp=xq*sinang + yq*cosang; +wave_0_per_point40=yp=xq*cosang - yq*sinang; +wave_0_per_point41=zp=zq; +wave_0_per_point42= +wave_0_per_point43=//upper arm outward; +wave_0_per_point44=zp=zp-0.35; +wave_0_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_0_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point47=xq=xp*sinang + zp*cosang; +wave_0_per_point48=yq=yp; +wave_0_per_point49=zq=xp*cosang - zp*sinang; +wave_0_per_point50= +wave_0_per_point51=//upper arm up down; +wave_0_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_0_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_0_per_point54=xp=xq; +wave_0_per_point55=yp=yq*cosang - zq*sinang; +wave_0_per_point56=zp=yq*sinang + zq*cosang; +wave_0_per_point57= +wave_0_per_point58=//xp=xq;yp=yq;zp=zq; +wave_0_per_point59= +wave_0_per_point60= +wave_0_per_point61=//project into screenspace and draw on screen +wave_0_per_point62=zp=zp+2; +wave_0_per_point63=xs=xp/zp; +wave_0_per_point64=ys=yp/zp; +wave_0_per_point65= +wave_0_per_point66=x=xs+0.5; +wave_0_per_point67=y=ys*1.3+0.5; +wave_0_per_point68= +wave_0_per_point69= +wave_0_per_point70=a=if( equal(q8,1) , (1-sample) , sample); +wave_0_per_point71=a=a*a; +wave_0_per_point72= +wave_0_per_point73=b=b+pow(1-sample,2)*0.3; +wave_0_per_point74= +wave_0_per_point75= +wave_0_per_point76= +wave_0_per_point77=r1=t1; +wave_0_per_point78=g1=t2; +wave_0_per_point79=b1=t3; +wave_0_per_point80=r2=t4; +wave_0_per_point81=g2=t5; +wave_0_per_point82=b2=t6; +wave_0_per_point83= +wave_0_per_point84=r=r1*flip + r2*(1-flip); +wave_0_per_point85=g=g1*flip + g2*(1-flip); +wave_0_per_point86=b=b1*flip + b2*(1-flip); +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.100000 +wavecode_1_g=1.000000 +wavecode_1_b=0.700000 +wavecode_1_a=1.000000 +wave_1_per_frame1=t1=sin(time)*0.5+0.5; +wave_1_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_1_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_1_per_frame4= +wave_1_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_1_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_1_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2=phs=-sample * 0.2; +wave_1_per_point3=tm=q1 + phs; +wave_1_per_point4= +wave_1_per_point5=flip=flip+1; +wave_1_per_point6=flip=flip*below(flip,2); +wave_1_per_point7= +wave_1_per_point8=xp=0; +wave_1_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_1_per_point10=zp=0; +wave_1_per_point11= +wave_1_per_point12=//wrist movement; +wave_1_per_point13=ang=sin(tm*2 )*0.5 +0.5; +wave_1_per_point14= +wave_1_per_point15=xq=xp; +wave_1_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point17=yq=yp*sinang + zp*cosang; +wave_1_per_point18=zq=yp*cosang - zp*sinang; +wave_1_per_point19=yq=yp; +wave_1_per_point20=zq=zp; +wave_1_per_point21= +wave_1_per_point22=ang=tm*8; +wave_1_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point24=xp=xq*sinang + yq*cosang; +wave_1_per_point25=yp=xq*cosang - yq*sinang; +wave_1_per_point26=zp=zq; +wave_1_per_point27= +wave_1_per_point28=//forearm movement; +wave_1_per_point29=zp=zp-0.3; +wave_1_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_1_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point32=xq=xp; +wave_1_per_point33=yq=yp*sinang + zp*cosang; +wave_1_per_point34=zq=yp*cosang - zp*sinang; +wave_1_per_point35= +wave_1_per_point36=//upper arm twist +wave_1_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_1_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point39=xp=xq*sinang + yq*cosang; +wave_1_per_point40=yp=xq*cosang - yq*sinang; +wave_1_per_point41=zp=zq; +wave_1_per_point42= +wave_1_per_point43=//upper arm outward; +wave_1_per_point44=zp=zp-0.35; +wave_1_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_1_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point47=xq=xp*sinang + zp*cosang; +wave_1_per_point48=yq=yp; +wave_1_per_point49=zq=xp*cosang - zp*sinang; +wave_1_per_point50= +wave_1_per_point51=//upper arm up down; +wave_1_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_1_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_1_per_point54=xp=xq; +wave_1_per_point55=yp=yq*cosang - zq*sinang; +wave_1_per_point56=zp=yq*sinang + zq*cosang; +wave_1_per_point57= +wave_1_per_point58=//xp=xq;yp=yq;zp=zq; +wave_1_per_point59= +wave_1_per_point60= +wave_1_per_point61=//project into screenspace and draw on screen +wave_1_per_point62=zp=zp+2; +wave_1_per_point63=xs=-xp/zp; +wave_1_per_point64=ys=yp/zp; +wave_1_per_point65= +wave_1_per_point66=x=xs+0.5; +wave_1_per_point67=y=ys*1.3+0.5; +wave_1_per_point68= +wave_1_per_point69= +wave_1_per_point70=a=if( equal(q8,1) , (1-sample) , sample); +wave_1_per_point71=a=a*a; +wave_1_per_point72= +wave_1_per_point73=b=b+pow(1-sample,2)*0.3; +wave_1_per_point74= +wave_1_per_point75= +wave_1_per_point76= +wave_1_per_point77=r1=t1; +wave_1_per_point78=g1=t2; +wave_1_per_point79=b1=t3; +wave_1_per_point80=r2=t4; +wave_1_per_point81=g2=t5; +wave_1_per_point82=b2=t6; +wave_1_per_point83= +wave_1_per_point84=r=r1*flip + r2*(1-flip); +wave_1_per_point85=g=g1*flip + g2*(1-flip); +wave_1_per_point86=b=b1*flip + b2*(1-flip); +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=1 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=1 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=0.600000 +wavecode_2_b=0.100000 +wavecode_2_a=1.000000 +wave_2_per_frame1=t1=sin(time)*0.5+0.5; +wave_2_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_2_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_2_per_frame4= +wave_2_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_2_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_2_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_2_per_frame8= +wave_2_per_frame9= +wave_2_per_frame10=t8= int( sin(time*2)*2 + 3); +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2=phs=-sample * 0.2; +wave_2_per_point3=tm=q1 + phs; +wave_2_per_point4= +wave_2_per_point5=flip=flip+1; +wave_2_per_point6=flip=flip*below(flip,2); +wave_2_per_point7= +wave_2_per_point8=xp=0; +wave_2_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_2_per_point10=zp=0; +wave_2_per_point11= +wave_2_per_point12=//wrist movement; +wave_2_per_point13=ang=sin(tm*2)*0.5 +0.5; +wave_2_per_point14= +wave_2_per_point15=xq=xp; +wave_2_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point17=yq=yp*sinang + zp*cosang; +wave_2_per_point18=zq=yp*cosang - zp*sinang; +wave_2_per_point19=yq=yp; +wave_2_per_point20=zq=zp; +wave_2_per_point21= +wave_2_per_point22=ang=tm*8 + 1; +wave_2_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point24=xp=xq*sinang + yq*cosang; +wave_2_per_point25=yp=xq*cosang - yq*sinang; +wave_2_per_point26=zp=zq; +wave_2_per_point27= +wave_2_per_point28=//forearm movement; +wave_2_per_point29=zp=zp-0.3; +wave_2_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_2_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point32=xq=xp; +wave_2_per_point33=yq=yp*sinang + zp*cosang; +wave_2_per_point34=zq=yp*cosang - zp*sinang; +wave_2_per_point35= +wave_2_per_point36=//upper arm twist +wave_2_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_2_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point39=xp=xq*sinang + yq*cosang; +wave_2_per_point40=yp=xq*cosang - yq*sinang; +wave_2_per_point41=zp=zq; +wave_2_per_point42= +wave_2_per_point43=//upper arm outward; +wave_2_per_point44=zp=zp-0.35; +wave_2_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_2_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point47=xq=xp*sinang + zp*cosang; +wave_2_per_point48=yq=yp; +wave_2_per_point49=zq=xp*cosang - zp*sinang; +wave_2_per_point50= +wave_2_per_point51=//upper arm up down; +wave_2_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_2_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_2_per_point54=xp=xq; +wave_2_per_point55=yp=yq*cosang - zq*sinang; +wave_2_per_point56=zp=yq*sinang + zq*cosang; +wave_2_per_point57= +wave_2_per_point58=//xp=xq;yp=yq;zp=zq; +wave_2_per_point59= +wave_2_per_point60= +wave_2_per_point61=//project into screenspace and draw on screen +wave_2_per_point62=zp=zp+2; +wave_2_per_point63=xs=xp/zp; +wave_2_per_point64=ys=yp/zp; +wave_2_per_point65= +wave_2_per_point66=x=xs+0.5; +wave_2_per_point67=y=ys*1.3+0.5; +wave_2_per_point68= +wave_2_per_point69=a=if( equal(q8,1) , (1-sample) , sample); +wave_2_per_point70= +wave_2_per_point71= +wave_2_per_point72=a=a* above( sin(tm*128*t8) , 0 ); +wave_2_per_point73= +wave_2_per_point74= +wave_2_per_point75=r=t4; +wave_2_per_point76=g=t5; +wave_2_per_point77=b=t6; +wave_2_per_point78= +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=1 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=1 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=0.600000 +wavecode_3_b=0.100000 +wavecode_3_a=1.000000 +wave_3_per_frame1=t1=sin(time)*0.5+0.5; +wave_3_per_frame2=t2=sin(time+2.1)*0.5+0.5; +wave_3_per_frame3=t3=sin(time+4.2)*0.5+0.5; +wave_3_per_frame4= +wave_3_per_frame5=t4=sin(time+1.1)*0.5+0.5; +wave_3_per_frame6=t5=sin(time+3.1)*0.5+0.5; +wave_3_per_frame7=t6=sin(time+5.2)*0.5+0.5; +wave_3_per_frame8= +wave_3_per_frame9= +wave_3_per_frame10=t8= int( sin(time*2)*2 + 3); +wave_3_per_point1=n=sample*6.283; +wave_3_per_point2=phs=-sample * 0.2; +wave_3_per_point3=tm=q1 + phs; +wave_3_per_point4= +wave_3_per_point5=flip=flip+1; +wave_3_per_point6=flip=flip*below(flip,2); +wave_3_per_point7= +wave_3_per_point8=xp=0; +wave_3_per_point9=yp=flip*0.1 + (sin(tm)*0.5 + 0.5)*0.2; +wave_3_per_point10=zp=0; +wave_3_per_point11= +wave_3_per_point12=//wrist movement; +wave_3_per_point13=ang=sin(tm*2)*0.5 +0.5; +wave_3_per_point14= +wave_3_per_point15=xq=xp; +wave_3_per_point16=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point17=yq=yp*sinang + zp*cosang; +wave_3_per_point18=zq=yp*cosang - zp*sinang; +wave_3_per_point19=yq=yp; +wave_3_per_point20=zq=zp; +wave_3_per_point21= +wave_3_per_point22=ang=tm*8 + 1; +wave_3_per_point23=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point24=xp=xq*sinang + yq*cosang; +wave_3_per_point25=yp=xq*cosang - yq*sinang; +wave_3_per_point26=zp=zq; +wave_3_per_point27= +wave_3_per_point28=//forearm movement; +wave_3_per_point29=zp=zp-0.3; +wave_3_per_point30=ang=3.14 + sin(tm*2 - 0.5)*1.5; +wave_3_per_point31=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point32=xq=xp; +wave_3_per_point33=yq=yp*sinang + zp*cosang; +wave_3_per_point34=zq=yp*cosang - zp*sinang; +wave_3_per_point35= +wave_3_per_point36=//upper arm twist +wave_3_per_point37=ang=-1.0 + cos(tm*3.1 + 0.5); +wave_3_per_point38=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point39=xp=xq*sinang + yq*cosang; +wave_3_per_point40=yp=xq*cosang - yq*sinang; +wave_3_per_point41=zp=zq; +wave_3_per_point42= +wave_3_per_point43=//upper arm outward; +wave_3_per_point44=zp=zp-0.35; +wave_3_per_point45=ang=cos(tm*2.3)*1.75 - 1.05; +wave_3_per_point46=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point47=xq=xp*sinang + zp*cosang; +wave_3_per_point48=yq=yp; +wave_3_per_point49=zq=xp*cosang - zp*sinang; +wave_3_per_point50= +wave_3_per_point51=//upper arm up down; +wave_3_per_point52=ang=cos(tm)*0.5 - 0.5; +wave_3_per_point53=sinang=sin(ang);cosang=cos(ang); +wave_3_per_point54=xp=xq; +wave_3_per_point55=yp=yq*cosang - zq*sinang; +wave_3_per_point56=zp=yq*sinang + zq*cosang; +wave_3_per_point57= +wave_3_per_point58=//xp=xq;yp=yq;zp=zq; +wave_3_per_point59= +wave_3_per_point60= +wave_3_per_point61=//project into screenspace and draw on screen +wave_3_per_point62=zp=zp+2; +wave_3_per_point63=xs=-xp/zp; +wave_3_per_point64=ys=yp/zp; +wave_3_per_point65= +wave_3_per_point66=x=xs+0.5; +wave_3_per_point67=y=ys*1.3+0.5; +wave_3_per_point68= +wave_3_per_point69=a=if( equal(q8,1) , (1-sample) , sample); +wave_3_per_point70= +wave_3_per_point71= +wave_3_per_point72=a=a* above( sin(tm*128*t8) , 0 ); +wave_3_per_point73= +wave_3_per_point74= +wave_3_per_point75=r=t4; +wave_3_per_point76=g=t5; +wave_3_per_point77=b=t6; +wave_3_per_point78= +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.260000 +shapecode_0_y=0.809999 +shapecode_0_rad=0.892690 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.082857 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = 0.264; +shape_0_per_frame2= +shape_0_per_frame3=r2=r2*q4; +shape_0_per_frame4=g2=g2*q4; +shape_0_per_frame5=b2=b2*q4; +shape_0_per_frame6= +shape_0_per_frame7=tex_ang= q2 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.740000 +shapecode_1_y=0.809999 +shapecode_1_rad=0.892690 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.082857 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=x=0.737; +shape_1_per_frame2= +shape_1_per_frame3= +shape_1_per_frame4=r2=r2*q4; +shape_1_per_frame5=g2=g2*q4; +shape_1_per_frame6=b2=b2*q4; +shape_1_per_frame7= +shape_1_per_frame8= +shape_1_per_frame9=tex_ang= -q2 +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.260000 +shapecode_2_y=0.179999 +shapecode_2_rad=0.892690 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.082857 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=x = 0.264; +shape_2_per_frame2=y = 0.178; +shape_2_per_frame3= +shape_2_per_frame4= +shape_2_per_frame5=r2=r2*q4; +shape_2_per_frame6=g2=g2*q4; +shape_2_per_frame7=b2=b2*q4; +shape_2_per_frame8= +shape_2_per_frame9= +shape_2_per_frame10=tex_ang= -q2/2 +shapecode_3_enabled=1 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.499999 +shapecode_3_rad=0.476930 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=2.026830 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=1.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=x=0.4998 +per_frame_init_1=mv_x=64;mv_y=48; +per_frame_init_2=nut=0; +per_frame_init_3=stp=0;stq=0; +per_frame_init_4=rtp=0;rtq=0; +per_frame_init_5=wvr=0; +per_frame_init_6=decay=0; +per_frame_init_7=dcsp=0; +per_frame_init_8=warp=0 +per_frame_init_9= +per_frame_1= +per_frame_2=//krash's beat detection code +per_frame_3=volume = 0.3*(bass+mid+att); +per_frame_4=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_5=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_6=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_7=peakbass_att = max(bass_att,peakbass_att); +per_frame_8=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_9=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_10=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_11=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_12=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_13=beatcounter = beatcounter + beat; +per_frame_14=mode = if(beat*equal(beatcounter%2,0),1-mode,mode); +per_frame_15=flip = 2*mode-1; +per_frame_16=monitor=flip; +per_frame_17=q8=flip; +per_frame_18= +per_frame_19= +per_frame_20=decay=0.98; +per_frame_21=zoom=1.01; +per_frame_22= +per_frame_23=vol=(bass_att+mid_att+treb_att)*0.25; +per_frame_24=vol=vol*vol; +per_frame_25=mtime=mtime+vol*0.05*flip*(65/fps); +per_frame_26=mtimeb=mtimeb+vol*0.1*(65/fps); +per_frame_27= +per_frame_28=q1=time*3; +per_frame_29= +per_frame_30=warp=0.0; +per_frame_31= +per_frame_32= +per_frame_33=q4 = min( vol*0.8 , 1 )*0.1 + 0.9; +per_frame_34=q2 = mtimeb/30; +per_frame_35=sx=-1 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EvilJim - Follow the ball.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EvilJim - Follow the ball.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EvilJim - Follow the ball.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EvilJim - Follow the ball.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,65 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=0.999608 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.250302 +fWaveSmoothing=0.000000 +fWaveParam=-0.250000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=0.990097 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r=bass*2; +per_frame_2=wave_g=mid*4; +per_frame_3=wave_b=treb*0.6; +per_pixel_1=dx=if(above(x,bass*0.6),0.02,-0.02); +per_pixel_2=dy=if(above(y,treb_att*0.5),0.02,-0.02); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EvilJim - Ice Drops.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EvilJim - Ice Drops.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EvilJim - Ice Drops.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/EvilJim - Ice Drops.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,61 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=0.999601 +fVideoEchoAlpha=0.499900 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=1 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.199862 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=2.000000 +fModWaveAlphaEnd=2.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000353 +fZoomExponent=1.000157 +fShader=0.000000 +zoom=0.999511 +rot=0.000000 +cx=0.500001 +cy=0.050000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000158 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.999000 +wave_y=0.000000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=warp=0; +per_frame_2=wave_r=treb; +per_frame_3=wave_g=mid; +per_frame_4=wave_b=bass; +per_frame_5=dy=bass/50; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/fiShbRaiN - blueprint.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/fiShbRaiN - blueprint.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/fiShbRaiN - blueprint.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/fiShbRaiN - blueprint.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,263 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.925000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=1.285751 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999996 +fShader=1.000000 +zoom=0.989618 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=1.000000 +dy=0.020000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=20.160004 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.400000 +mv_r=1.000000 +mv_g=0.400000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_point1=ma1=ma1+(above(bass,1)*3.1415*.1*bass); +wave_0_per_point2=ma2=ma2-(above(treb,1)*3.1415*.1*treb); +wave_0_per_point3= +wave_0_per_point4=malpha=above(bass,.7)*above(treb,.7); +wave_0_per_point5= +wave_0_per_point6=mx=mx+(.02*cos(ma1)); +wave_0_per_point7=my=my+(.02*sin(ma2)); +wave_0_per_point8= +wave_0_per_point9=mx=if(above(mx,.9),(.9-mx),mx); +wave_0_per_point10=my=if(above(my,.9),(.9-my),my); +wave_0_per_point11=mx=if(below(mx,.1),(.9+mx),mx); +wave_0_per_point12=my=if(below(my,.1),(.9+my),my); +wave_0_per_point13= +wave_0_per_point14=x=mx; +wave_0_per_point15=y=my; +wave_0_per_point16= +wave_0_per_point17=a=malpha; +wave_0_per_point18=r=bass*.7; +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=1 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_init1=mx=.5; +wave_1_init2=my=.5; +wave_1_per_point1=mo=rand(4); +wave_1_per_point2= +wave_1_per_point3=mx=mx+(equal(mo,0)*.05*bass); +wave_1_per_point4=mx=mx-(equal(mo,1)*.05*bass); +wave_1_per_point5=my=my+(equal(mo,2)*.05*treb); +wave_1_per_point6=my=my-(equal(mo,3)*.05*treb); +wave_1_per_point7= +wave_1_per_point8=mx=if(equal(sample,1),.5,mx); +wave_1_per_point9=my=if(equal(sample,1),.5,my); +wave_1_per_point10= +wave_1_per_point11=x=mx; +wave_1_per_point12=y=my; +wave_1_per_point13=a=if(equal(rand(50),0),1,0); +wave_1_per_point14=g=treb*.7; +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=1 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=ma1=ma1+(above(bass,1)*3.1415*.01*bass); +wave_2_per_point2=ma2=ma2-(above(treb,1)*3.1415*.01*treb); +wave_2_per_point3= +wave_2_per_point4=malpha=above(bass,1)*above(treb,1); +wave_2_per_point5= +wave_2_per_point6=mx=mx+(.02*cos(ma1)); +wave_2_per_point7=my=my+(.02*sin(ma2)); +wave_2_per_point8= +wave_2_per_point9=mx=if(above(mx,.9),(.9-mx),mx); +wave_2_per_point10=my=if(above(my,.9),(.9-my),my); +wave_2_per_point11=mx=if(below(mx,.1),(.9+mx),mx); +wave_2_per_point12=my=if(below(my,.1),(.9+my),my); +wave_2_per_point13= +wave_2_per_point14=x=mx; +wave_2_per_point15=y=my; +wave_2_per_point16= +wave_2_per_point17=a=malpha; +wave_2_per_point18=b=bass*.7; +wave_2_per_point19=r=treb*.8; +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=eo=((time*.1)+(bass_att*4))%4; +per_frame_2= +per_frame_3=echo_orient=eo; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - 0 To 60.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - 0 To 60.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - 0 To 60.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - 0 To 60.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=3.500000 +fGammaAdj=1.000000 +fDecay=0.970000 +fVideoEchoZoom=1.008000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.091679 +fWaveScale=0.721421 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.489999 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.007348 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.115109 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000005 +dy=0.000000 +warp=0.010000 +sx=0.999998 +sy=1.000000 +wave_r=0.760000 +wave_g=0.480000 +wave_b=0.390000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=6.400000 +nMotionVectorsY=4.800000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=3.000000 +mv_r=0.669900 +mv_g=0.480000 +mv_b=0.390000 +mv_a=0.000000 +per_frame_1=wave_b = rand(100)/100; +per_frame_2=wave_r = rand(100)/100; +per_frame_3=wave_g = rand(100)/100; +per_frame_4=wave_y = wave_y; +per_frame_5=bass_eff = max(max(bass,bass_att)-1,0); +per_frame_6=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_7=vol =bass+treb+mid; +per_frame_8=dx = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_9=dy = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_10=dx_r = equal(bass_thresh,2)*0.016*sin(time*3) + (1-equal(bass_eff,2))*dx_r; +per_frame_11=dy_r = equal(bass_thresh,2)*0.012*sin(time*7) + (1-equal(bass_eff,2))*dy_r; +per_frame_12=rot = rot + 0.070*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_13=q1=sin(time*.7*.5)+(dx_r*dy_r)+(dx*dy); +per_frame_14=q2=sin(time*.7*.2)+(dx_r*dy_r); +per_frame_15=q3=0.1*(atan(abs(-rad+.5)))*q2; +per_pixel_1=zoom=zoom+.05*q3+.05*q1+bass_eff; +per_pixel_2=dx = .01*atan((rad)/.1*sin((dx_r*dy_r)*20+time*5)); +per_pixel_3=zoom = zoom + bass_eff + rad*.2*(q2)-vol; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - A Blur.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - A Blur.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - A Blur.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - A Blur.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=2.500000 +fGammaAdj=1.000000 +fDecay=0.985000 +fVideoEchoZoom=0.998100 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=1 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.597149 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.489999 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999500 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000005 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=43.200001 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=4.500000 +mv_r=0.759900 +mv_g=0.480000 +mv_b=0.390000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.825*time) + 0.40*sin(0.915*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.025*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.810*time) + 0.40*sin(0.950*time) ); +per_frame_4=wave_x = wave_x + 0.4*sin(1.85*time); +per_frame_5=wave_y = wave_y + 0.2*sin(1.85*time); +per_frame_6=dx = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_7=dy = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=bass_eff = max(max(bass,bass_att)-1,0); +per_frame_9=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_10=decay = decay - 0.05*equal(frame%16,0); +per_frame_11=zoom = zoom + 0.05 * cos(ang-ang); +per_frame_12=rot = bass_eff/bass_thresh-0.05; +per_frame_13=monitor=zoom; +per_pixel_1=sx=sx+0.07*sin(rad*18 + time*9); +per_pixel_2=sy=sy+0.07*sin(rad*18 + time*9); +per_pixel_3= +per_pixel_4= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese & Idiot24-7 - Rearview Mirror.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese & Idiot24-7 - Rearview Mirror.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese & Idiot24-7 - Rearview Mirror.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese & Idiot24-7 - Rearview Mirror.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.280000 +fDecay=0.970000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.660119 +fWaveSmoothing=0.630000 +fWaveParam=-0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=100.000000 +fShader=0.000000 +zoom=0.607700 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999999 +sy=0.999900 +wave_r=0.600000 +wave_g=0.400000 +wave_b=0.800000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=wave_r=wave_r*sin(bass+mid); +per_frame_2=wave_b=wave_b-.4*sin(time*bass); +per_frame_3=wave_g=wave_g+.6*cos(time*mid-bass); +per_frame_4=bass_eff = max(max(bass,bass_att)-1,0); +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_6=decay = decay - 0.05*equal(frame%16,0); +per_frame_7=rot = rot + bass_eff/bass_thresh-0.05; +per_frame_8=monitor = rot; +per_pixel_1=zoom=pow(.8+x&.8+y,1+x&1+y)+.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Lifesavor Anyone.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Lifesavor Anyone.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Lifesavor Anyone.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Lifesavor Anyone.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=2.500000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=1.008081 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.997766 +fWaveScale=0.653090 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.489999 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=100.000000 +fShader=0.000000 +zoom=0.999500 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000005 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.350000 +wave_g=0.550000 +wave_b=0.450000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=1.000000 +ob_b=0.200000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=43.200001 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=2.500000 +mv_r=0.759900 +mv_g=0.480000 +mv_b=0.390000 +mv_a=0.000000 +per_frame_1=wave_r = rand(100)/100; +per_frame_2=wave_g = rand(100)/100; +per_frame_3=wave_b = rand(100)/100; +per_pixel_1=zoom = pow(rad,0.05)+.05/bass; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - New meetings.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - New meetings.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - New meetings.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - New meetings.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,88 @@ +[preset00] +fRating=2.500000 +fGammaAdj=1.000000 +fDecay=0.985000 +fVideoEchoZoom=0.998100 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=1 +bInvert=0 +fWaveAlpha=4.050169 +fWaveScale=0.597149 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.489999 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999500 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000005 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=43.200001 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.500001 +mv_r=0.759900 +mv_g=0.480000 +mv_b=0.390000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.825*time) + 0.40*sin(0.915*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.025*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.810*time) + 0.40*sin(0.950*time) ); +per_frame_4=wave_y = wave_y + 0.2*sin(1.85*time); +per_frame_5=time = time/100; +per_frame_6=cx = cx + 0.225*( 0.60*sin(0.350*time) + 0.40*sin(0.350*time) ); +per_frame_7=cy = cy + 0.225*( 0.60*sin(0.350*time) + 0.40*sin(0.350*time) ); +per_frame_8=dx = 0.05 + 0.009*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_9=dy = 0.0005 + 0.009*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_10=xwave_x = wave_x + 0.250*( 0.60*sin(2.112*time) + 0.40*sin(1.589*time) ); +per_frame_11=xwave_y = wave_y + 0.250*( 0.60*sin(1.752*time) + 0.40*sin(2.298*time) ); +per_frame_12=bass_eff = max(max(bass,bass_att)-1,0); +per_frame_13=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_14=decay = decay - 0.05*equal(frame%16,0); +per_frame_15=zoom = decay; +per_frame_16=rot = bass_eff/bass_thresh; +per_frame_17=ob_size = rot-bass; +per_frame_18=ib_a = 1-bass_eff; +per_frame_19=ib_r = 1-wave_r; +per_frame_20=ib_b = 1-wave_g; +per_frame_21=ib_g = 1-wave_b; +per_pixel_1=sx=sx+0.07*sin(rad*18 + time*9); +per_pixel_2=sy=sy+0.07*sin(rad*18 + time*9); +per_pixel_3=zoom=zoom + 0.005*tan(ang-ang); +per_pixel_4=ray = pow(rad,1.85)+.037; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Quicksand.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Quicksand.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Quicksand.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Quicksand.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,78 @@ +[preset00] +fRating=4.500000 +fGammaAdj=1.000000 +fDecay=0.992000 +fVideoEchoZoom=1.008000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=1 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.499226 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.489999 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999500 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000005 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.760000 +wave_g=0.480000 +wave_b=0.390000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=1.000000 +ob_b=0.200000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.669900 +mv_g=0.480000 +mv_b=0.390000 +mv_a=0.200000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.825*time) + 0.40*sin(0.915*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.025*time) ); +per_frame_3=vol = (5*bass + 3*mid + 2*treb)/10; +per_frame_4=wave_x = wave_x + 0.03*vol*sin(0.727*time); +per_frame_5=wave_y = wave_y + 0.04*vol*sin(0.777*time); +per_frame_6=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_7=dx = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_9=monitor = time; +per_pixel_1=cx = (0.25&(x*5-0.5))*0.1+0.025; +per_pixel_2=cy = (0.25&(y*5-0.5))*0.1+0.025; +per_pixel_3=sx = sx -.005-abs(x-1)*.01; +per_pixel_4=sy = sy -.005-abs(x-1)*.01; +per_pixel_5=zoom = pow(rad,0.05)+.050; +per_pixel_6=rot = 0.03*sin(0.84*time)-0.013*cos(0.784*time)+0.02*sin(1-rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Round and Round (geiss gamma mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Round and Round (geiss gamma mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Round and Round (geiss gamma mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Round and Round (geiss gamma mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,224 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.944900 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.987793 +fWaveScale=1.008109 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.001800 +fWarpScale=1.001800 +fZoomExponent=1.008149 +fShader=0.000000 +zoom=1.008148 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999900 +sy=0.999900 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.400000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.300000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=6.400000 +nMotionVectorsY=2.400001 +mv_dx=0.000000 +mv_dy=0.340000 +mv_l=0.999999 +mv_r=0.759900 +mv_g=0.480000 +mv_b=0.390000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.722)); +per_frame_3=wave_g = wave_g + 0.4*sin(time*1.931); +per_frame_4=vol=0.15*(bass_att+bass+mid+mid_att); +per_frame_5=rot = rot+0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_6=myeff=(q3+ if(above(q2,0.75), + q1*tan(time), + q2*tan(time))+.4+((cos(vol))/2) +q3 + 0.40*sin(8*mid)+.25+(vol/10)); +per_frame_7=mytime=.7; +per_frame_8=q1=sin(mytime*4); +per_frame_9=q2=sin(mytime*2); +per_frame_10=q3=abs(rad-.1)*(mytime*myeff); +per_frame_11=xpos=.5; +per_frame_12=ypos=.5; +per_frame_13=wave_x = wave_x + if(above(wave_y,.75), - 0.1*tan(time), + 0.1*tan(time))-.4+((cos(vol))/2)*myeff; +per_frame_14=wave_y = wave_y + if(below(wave_x,.75), -0.1*tan(time), +0.1*tan(time))-.4+((cos(vol))/2)*myeff; +per_pixel_1=dx=q3*atan((rad)/q2*sin((dx_r*dy_r)*q3+time*5)); +per_pixel_2=dy=q3*atan((rad)/q2*cos((dx*dy)*q3+time*5)); +per_pixel_3= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - simple.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - simple.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - simple.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - simple.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.999000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.796630 +fWaveScale=0.543759 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.020000 +cy=0.020001 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.100000 +wave_g=0.400000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.600000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=19.200027 +mv_l=5.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.040000 +per_frame_1=warp = 0; +per_frame_2=dx = dx - .0005; +per_frame_3=dy = dy - .0005; +per_frame_4=wave_r = abs(wave_r + 0.1*(sin(time*0.346) + sin(time*1.334))); +per_frame_5=wave_g = wave_g + 0.1*(sin(time*0.763) + sin(time*1.231)); +per_frame_6=wave_b = wave_b + 0.2*(sin(time*0.695) + sin(time*0.367)); +per_frame_7=decay=decay-0.01*(frame%1); +per_frame_8=wave_x = 0.5+0.1*sin(time+rand(100)/100); +per_frame_9=dx = dx + dx_residual; +per_frame_10=dy = dy + dy_residual; +per_frame_11=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_12=dx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_13=dy_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_frame_14=mv_r=wave_g+bass; +per_frame_15=mv_g=wave_r+treb; +per_pixel_1=dx = .01*atan((rad)/.1*sin((x*dy)*20+time*5)); +per_pixel_2=zoom = zoom + rad*.08; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Stand Still!.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Stand Still!.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Stand Still!.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Stand Still!.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=2.500000 +fGammaAdj=2.200000 +fDecay=0.980000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=1 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.610095 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.000000 +cy=0.000000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.400000 +wave_g=0.400000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.500000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=8.319999 +nMotionVectorsY=2.400000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=2.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = rand(100)/100; +per_frame_2=wave_g = rand(100)/100; +per_frame_3=wave_b = rand(100)/100; +per_frame_4=wave_x = wave_x + if(above(wave_y,.75), - 0.1*tan(time), + 0.1*tan(time))-.4+((cos(vol))/2)*myeff; +per_frame_5=wave_y = wave_y + if(below(wave_x,.75), -0.1*tan(time), +0.1*tan(time))-.4+((cos(vol))/2)*myeff; +per_frame_6=cx = cx + 0.410*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time)+vol ); +per_frame_7=cy = cy + 0.410*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time)+vol ); +per_frame_8=zoom = zoom + 0.020*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time)*vol ); +per_frame_9=rot = rot + 0.005*( 0.60*sin(0.281*time) + 0.40*sin(0.839*time)*vol ); +per_frame_10=vol = (bass_att+bass+mid+mid_att+treb+treb_att); +per_frame_11=myeff=(wave_x + if(above(wave_y,0.75), + 0.1*tan(time), + 0.1*tan(time))+.4+((cos(vol))/2) & wave_y + 0.40*sin(8*mid)+.25+(vol/10)); +per_frame_12=dx = dx + 0.085*pow(rad,y*2)*sin(time)/vol; +per_frame_13=dy = dy + 0.085*pow(rad,y*2)*cos(time)/vol; +per_frame_14=sx = sx + 0.0555*pow(rad,x*2)*sin(time)/vol; +per_frame_15=sy = sy + 0.0777*pow(rad,y*2)*sin(time); +per_frame_16=monitor = vol; +per_frame_17= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - The Tunnel (Final Stage Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - The Tunnel (Final Stage Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - The Tunnel (Final Stage Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - The Tunnel (Final Stage Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=2 +fGammaAdj=1 +fDecay=0.995 +fVideoEchoZoom=1 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=1 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1 +fWaveScale=0.241456 +fWaveSmoothing=0.09 +fWaveParam=0 +fModWaveAlphaStart=0.5 +fModWaveAlphaEnd=1 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=0.741921 +fShader=0 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.01 +sx=0.9999 +sy=0.9999 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.005 +ob_r=0 +ob_g=0 +ob_b=0.4 +ob_a=0 +ib_size=0.005 +ib_r=0 +ib_g=0.3 +ib_b=0 +ib_a=1 +nMotionVectorsX=6.4 +nMotionVectorsY=1.440001 +mv_dx=0 +mv_dy=0 +mv_l=0 +mv_r=0.7599 +mv_g=0.48 +mv_b=0.39 +mv_a=0 +per_frame_1=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.722)); +per_frame_3=wave_g = wave_g + 0.4*sin(time*1.931); +per_frame_4=vol=0.15*(bass_att+bass+mid+mid_att); +per_frame_5=dx_r=if(equal(q3,0),if(above(x,xpos),dx*q1-xpos,dx+q2-xpos),dx); +per_frame_6=dy_r=if(equal(q3,0),if(above(y,ypos),dy*q1-ypos,dy+q2-ypos),dy); +per_frame_7=rot = rot+0.05*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_8=mytime=.7; +per_frame_9=q1=sin(time*mytime*4); +per_frame_10=q2=cos(time*mytime*2); +per_frame_11=q3=abs(rad-.5)*(q2*q1); +per_frame_12=xpos=.5/vol; +per_frame_13=ypos=.5/vol; +per_frame_14=wave_x=.5+0.1*sin(time+rand(100)/100); +per_frame_15=wave_y=.5+0.1*cos(time+rand(100)/100); +per_frame_16=ib_r=q3+q2; +per_frame_17=ib_b=q2+q1; +per_frame_18=ib_g=q1+q3; +per_pixel_1=zoom = if(below(q1,0),0.5*x,if(equal(q2,0),0.9*(1-x),if(above(q3,0),0.9*y,0.9*(1-y)))) + 0.6 - 0.13*(min(q3,0.3)); +per_pixel_2= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Window Reflection 6.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Window Reflection 6.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Window Reflection 6.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Window Reflection 6.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.000000 +fDecay=0.995000 +fVideoEchoZoom=0.199862 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.149765 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.010000 +fShader=0.000000 +zoom=0.999800 +rot=0.800000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999900 +sy=0.999800 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.300000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.722)); +per_frame_3=wave_g = wave_g + 0.4*sin(time*1.931); +per_frame_4=vol=0.15*(bass_att+bass+mid+mid_att); +per_frame_5=bass_eff = max(max(bass,bass_att)-1,0); +per_frame_6=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_7=q1=bass_eff+sin(time*mytime*4); +per_frame_8=q2=bas_eff+cos(time*mytime*2); +per_frame_9=q3=bass_eff+abs(rad+.5)+(q2*q5); +per_frame_10=q4=bass_thresh+abs(.9*5)*(dx_r*dy_r)*(dx*dy); +per_frame_11=q5=bass_tresh+cos(.2*2)*(dx_r*dy_r); +per_frame_12=q6=bass_thresh+0.1*(atan(abs(-rad+.5)))*q1; +per_frame_13=q7=if(above(bass+bass_att,2),-1.5+bass+bass_att,0); +per_frame_14=q8=below(rad- 0.1*x,0.18); +per_frame_15=q9=if(above(rad,.5),.9+rad,.5+bass*3%1000*.1); +per_frame_16=dx=q8; +per_frame_17=zoom=q9+0.4; +per_frame_18=monitor=zoom; +per_pixel_1=rot=zoom; +per_frame_init_1=myzoom=if(below(q1,q6),0.3*dx,if(equal(q2,q5),0.2*(1-dx),if(above(q3,q4),0.3*dy,0.2*(1-dy)+if(equal(q4,q3),0.3* dx, if(above(q5,q2),0.25*(1-dx),if(below(q6,q1),0.3*dy,0.25*(1-dy)+if(equal(q7,q9),0.3*dx, if(below(q8,q7),0.2*(1-dx),if(equal(q9,q6),0.3*dy,0.2*(1-dy)))))))))) + .8 - 0.02*(min(q6+q1,.5))*bass_eff; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Zoom Effects (Remix 2).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Zoom Effects (Remix 2).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Zoom Effects (Remix 2).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Fvese - Zoom Effects (Remix 2).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,91 @@ +[preset00] +fRating=2 +fGammaAdj=1 +fDecay=0.98 +fVideoEchoZoom=1 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=1 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1 +fWaveScale=0.241456 +fWaveSmoothing=0.09 +fWaveParam=0 +fModWaveAlphaStart=0.5 +fModWaveAlphaEnd=1 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=0.5503 +fShader=0 +zoom=0.999899 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.01 +sx=0.9999 +sy=0.9999 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0 +ob_r=0 +ob_g=0 +ob_b=0.4 +ob_a=0 +ib_size=0.005 +ib_r=0 +ib_g=0.3 +ib_b=0 +ib_a=1 +nMotionVectorsX=3.2 +nMotionVectorsY=2.400006 +mv_dx=0 +mv_dy=0 +mv_l=5 +mv_r=0.7599 +mv_g=0.48 +mv_b=0.39 +mv_a=0 +per_frame_1=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.722)); +per_frame_3=wave_g = wave_g + 0.4*sin(time*1.931); +per_frame_4=vol=0.15*(bass_att+bass+mid+mid_att); +per_frame_5=bass_eff = max(max(bass,bass_att)-1,0); +per_frame_6=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_7=dx = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_9=dx_r=if(equal(q3,0),if(above(x,xpos),dx*q1-xpos,dx+q2-xpos),dx); +per_frame_10=dy_r=if(equal(q3,0),if(above(y,ypos),dy*q1-ypos,dy+q2-ypos),dy); +per_frame_11=rot = rot+0.15*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_12=mytime=.9; +per_frame_13=xpos=.5/vol; +per_frame_14=ypos=.5/vol; +per_frame_15=q1=sin(time*mytime*4); +per_frame_16=q2=cos(time*mytime*2); +per_frame_17=q3=abs(rad+.5)+(q2*q5); +per_frame_18=q4=abs(.9*5)*(dx_r*dy_r)*(dx*dy); +per_frame_19=q5=cos(.2*2)*(dx_r*dy_r); +per_frame_20=q6=0.1*(atan(abs(-rad+.5)))*q1; +per_frame_21=q7=q1+q2+q3+q4+q5+q6; +per_frame_22=wave_x=.5+0.1*sin(time+rand(100)/100); +per_frame_23=wave_y=.5+0.1*cos(time+rand(100)/100); +per_frame_24=ib_r=q3+q2; +per_frame_25=ib_b=q2+q1; +per_frame_26=ib_g=q1+q3; +per_frame_27=monitor=q3; +per_pixel_1=zoom= if(below(q1,q6),0.5*x,if(equal(q2,q5),0.9*(1-x),if(above(q3,q4),0.5*y,0.9*(1-y)+if(below(q4,q3),0.5* xpos, if(equal(q5,q2),0.9*(1-xpos),if(above(q6,q1),0.9*ypos,0.3*(1-ypos))))))) + .8 - 0.03*(min(q7+q1,1)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Aieeeeee!!!.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Aieeeeee!!!.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Aieeeeee!!!.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Aieeeeee!!!.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,65 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.960000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.421896 +fWaveSmoothing=0.900000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.990548 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.198054 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.550000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_frame_8= +per_pixel_1=zoom=(zoom-1.0)*rad+1.0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss and Rovastar - The Chaos Of Colours (sprouting diment.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss and Rovastar - The Chaos Of Colours (sprouting diment.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss and Rovastar - The Chaos Of Colours (sprouting diment.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss and Rovastar - The Chaos Of Colours (sprouting diment.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,261 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.700000 +fDecay=0.940000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=13.290894 +rot=-0.020000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.950000 +ib_g=0.850000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.550000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.100000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.900000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.400000 +shape_0_per_frame1=ang = time*0.4;; +shape_0_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_0_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_0_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_0_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_0_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_0_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_0_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_0_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shapecode_1_enabled=1 +shapecode_1_sides=32 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.400000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.300000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shape_1_per_frame1=ang = time*1.7; +shape_1_per_frame2=x = 0.5 + 0.08*cos(time*1.1) + 0.03*cos(time*0.7); +shape_1_per_frame3=y = 0.5 + 0.08*sin(time*1.1) + 0.03*sin(time*0.7); +shape_1_per_frame4=r = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_1_per_frame5=g = 0.5 + 0.5*sin(q8*0.563 + 2); +shape_1_per_frame6=b = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_1_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.885 + 4); +shape_1_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.556+ 1); +shape_1_per_frame9=b2 = 0.5 + 0.5*sin(tq8*0.638 + 3); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.400000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.500000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shape_2_per_frame1=ang = time*1.24; +shape_2_per_frame2=x = 0.5 - 0.08*cos(time*1.07) + 0.03*cos(time*0.7); +shape_2_per_frame3=y = 0.5 - 0.08*sin(time*1.33) + 0.03*sin(time*0.7); +shape_2_per_frame4=g = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_2_per_frame5=b = 0.5 + 0.5*sin(q8*0.563 + 2); +shape_2_per_frame6=r = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_2_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.885 + 4); +shape_2_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.556+ 1); +shape_2_per_frame9=b2 = 0.5 + 0.5*sin(q8*.638 + 3); +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=ob_r = 0.5 + 0.4*sin(time*1.324); +per_frame_2=ob_g = 0.5 + 0.4*cos(time*1.371); +per_frame_3=ob_b = 0.5+0.4*sin(2.332*time); +per_frame_4=ib_r = 0.5 + 0.25*sin(time*1.424); +per_frame_5=ib_g = 0.25 + 0.25*cos(time*1.871); +per_frame_6=ib_b = 1-ob_b; +per_frame_7=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att); +per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_11=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_13=xpos = xpos + 0.001*xspeed; +per_frame_14=dx = xpos*0.05; +per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_18=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_19=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_20=ypos = ypos + 0.001*yspeed; +per_frame_21=dy = ypos*0.05; +per_frame_22=wave_a = 0; +per_frame_23=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_24=oldq8 = q8; +per_frame_25=q7 = 0.003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_26=rot = 0.4 + 1.5*sin(time*0.273) + 0.4*sin(time*0.379+3); +per_pixel_1=zoom =( log(sqrt(2)-rad) -0.24)*1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Anomaly 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Anomaly 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Anomaly 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Anomaly 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,54 @@ +[preset00] +fGammaAdj=1.994000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.240000 +fWaveScale=157.167007 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=0.971000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_x = wave_x + 0.500*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.500*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=rot = rot + 0.035*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_7=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.194*time) ); +per_frame_8=cy = cy + 0.037*( 0.60*sin(0.274*time) + 0.40*sin(0.394*time) ); +fRating=1.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Anomaly 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Anomaly 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Anomaly 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Anomaly 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,54 @@ +[preset00] +fGammaAdj=2.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=6.140000 +fWaveScale=1.694000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=0.060000 +fShader=0.000000 +zoom=0.971000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_x = wave_x + 0.500*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.500*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.500*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=zoom = zoom + 0.010*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_7=rot = rot + 0.035*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_8=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.194*time) ); +per_frame_9=cy = cy + 0.037*( 0.60*sin(0.274*time) + 0.40*sin(0.394*time) ); +per_frame_10=dx = dx + 0.025*( 0.60*sin(0.334*time) + 0.40*sin(0.277*time) ); +per_frame_11=dy = dy + 0.025*( 0.60*sin(0.384*time) + 0.40*sin(0.247*time) ); +per_frame_12=sx = sx + 0.010*( 0.60*sin(0.313*time) + 0.40*sin(0.383*time) ); +per_pixel_1=rot=rot+rad*0.18*sin(time*0.3986); +fRating=4.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Approach.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Approach.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Approach.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Approach.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=11.940000 +fWaveScale=1.372000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.001000 +fShader=0.000000 +zoom=1.007000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.300000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.150*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.150*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.200*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=rot = rot + 0.002*sin(time+0.073); +per_frame_7=decay = decay - 0.03*equal(frame%30,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Asymptote.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Asymptote.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Asymptote.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Asymptote.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,76 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=6.140000 +fWaveScale=1.694000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=0.090000 +fShader=0.000000 +zoom=0.971000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.020000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.500*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.500*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=rot = rot + 0.035*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_7=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.194*time) ); +per_frame_8=cy = cy + 0.037*( 0.60*sin(0.274*time) + 0.40*sin(0.394*time) ); +per_frame_9=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_10=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_11=ib_b = ib_b + 0.2*sin(time*0.4354); +per_frame_12=blah = 3.0/(ib_r+ib_g+ib_b); +per_frame_13=ib_r = ib_r*blah; ib_g = ib_g*blah; ib_b = ib_b*blah; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bass Kaleidosphere.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bass Kaleidosphere.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bass Kaleidosphere.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bass Kaleidosphere.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,49 @@ +[preset00] +fGammaAdj=2.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.970000 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=3.500000 +fWaveScale=2.720000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.046000 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.882000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.070*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.070*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_pixel_1=zoom=zoom-max(0,(bass-1.2))*sin(time*1.4+rad*6); +fRating=3.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bass Zoom.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bass Zoom.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bass Zoom.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bass Zoom.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.500000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.605000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%50,0); +per_frame_7=zoom=zoom+(bass_att-1)*0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,76 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.400000 +fWaveScale=1.170370 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.006000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.900000 +wave_g=0.450000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.100*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.050*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=decay = decay - 0.01*equal(frame%40,0); +per_frame_4=rot = rot + 0.01*sin(time*0.113); +per_frame_5=rot = rot + 0.01*sin(time*0.533); +per_frame_6=rot = rot + 0.02*sin(time*-0.323); +per_frame_7=dx = dx + dx_residual; +per_frame_8=dy = dy + dy_residual; +per_frame_9=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_10=dx_residual = equal(bass_thresh,2)*0.0072*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_11=dy_residual = equal(bass_thresh,2)*0.0054*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_pixel_1=zoom=0.9615+rad*0.1; +per_pixel_2=rot = rot * 3*(1-pow(rad*2-1,2)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.900000 +fWaveScale=0.408000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=-0.010000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.900000 +wave_g=0.450000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.100*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.050*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=decay = decay - 0.01*equal(frame%50,0); +per_pixel_1=zoom=0.9615+rad*0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 3.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.400000 +fWaveScale=0.948000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.007440 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.900000 +wave_g=0.450000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.100*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.050*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=decay = decay - 0.01*equal(frame%40,0); +per_pixel_1=zoom=0.9615+rad*0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 4.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 4.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 4.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 4.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.400000 +fWaveScale=0.559785 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.001440 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.800000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.100*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.050*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=decay = decay - 0.01*equal(frame%40,0); +per_frame_4=rot = rot + 0.01*sin(time*0.1); +per_pixel_1=zoom=0.8215+rad*0.5; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 5.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 5.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 5.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bipolar 5.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=1.904763 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.900000 +fWaveScale=0.559785 +fWaveSmoothing=0.900000 +fWaveParam=0.200000 +fModWaveAlphaStart=1.150000 +fModWaveAlphaEnd=1.310000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.001440 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.800000 +wave_b=0.950000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.100*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.050*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.049*( 0.60*sin(0.816*time) + 0.40*sin(1.036*time) ); +per_frame_4=decay = decay - 0.01*equal(frame%40,0); +per_frame_5=rot = rot + 0.01*sin(time*0.1); +per_pixel_1=zoom=0.745+rad*0.5; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Blasto.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Blasto.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Blasto.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Blasto.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,64 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=12.162793 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.131195 +fWaveSmoothing=0.720000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.019963 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.018800 +sx=1.000000 +sy=0.999831 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + .255*sin(time*.366); +per_frame_2=wave_g = wave_g + .255*sin(time*.222); +per_frame_3=wave_b = wave_b + .255*sin(time*.288); +per_frame_4=wave_r = wave_r + bass*.3; +per_frame_5=wave_g = wave_g + treb*.3; +per_frame_6=wave_b = wave_b + mid*.3; +per_frame_7=decay = .75 + .05*sin(time*2) - treb*.05; +per_pixel_1= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bonfire.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bonfire.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bonfire.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bonfire.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=1.728000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.200000 +fWaveScale=1.170000 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.611000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-0.018000 +warp=0.313000 +sx=0.952000 +sy=1.000000 +wave_r=0.675000 +wave_g=0.550000 +wave_b=0.350000 +wave_x=0.500000 +wave_y=0.140000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.20*( 0.60*sin(0.849*time) + 0.40*sin(1.090*time) ); +per_frame_2=wave_g = wave_g + 0.20*( 0.60*sin(0.711*time) + 0.40*sin(0.982*time) ); +per_frame_3=wave_b = wave_b + 0.20*( 0.60*sin(0.737*time) + 0.40*sin(1.012*time) ); +per_frame_4=cy = cy + 0.030*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_5=sx = sx + 0.010*( 0.60*sin(0.313*time) + 0.40*sin(0.383*time) ); +per_frame_6=sy = sy + 0.010*( 0.60*sin(0.367*time) + 0.40*sin(0.272*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bright Fiber Matrix 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bright Fiber Matrix 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bright Fiber Matrix 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bright Fiber Matrix 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,48 @@ +[preset00] +fGammaAdj=1.500000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.990000 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=3.320000 +fWaveScale=2.718000 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=25.548000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.099000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=4.044000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.110*( 0.60*sin(0.344*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.110*( 0.60*sin(0.313*time) + 0.40*sin(0.223*time) ); +fRating=4.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bright Fiber Matrix 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bright Fiber Matrix 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bright Fiber Matrix 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Bright Fiber Matrix 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.500000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.320000 +fWaveScale=2.718000 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=25.548000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.099000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=4.044000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.110*( 0.60*sin(0.344*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.110*( 0.60*sin(0.313*time) + 0.40*sin(0.223*time) ); +per_frame_8=dx = dx + dx_residual; +per_frame_9=dy = dy + dy_residual; +per_frame_10=bass_thresh = above(bass_att,bass_thresh)*2.4 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.5)*0.99+1.5); +per_frame_11=dx_residual = equal(bass_thresh,2.4)*0.020*sin(time*7) + (1-equal(bass_thresh,2.4))*dx_residual; +per_frame_12=dy_residual = equal(bass_thresh,2.4)*0.015*sin(time*9) + (1-equal(bass_thresh,2.4))*dy_residual; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Calligraphy.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Calligraphy.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Calligraphy.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Calligraphy.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.994000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=1 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.478300 +fWaveSmoothing=0.900000 +fWaveParam=-0.360000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.036087 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000715 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.700000 +wave_b=0.700000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_init_1=billy = 100; +per_frame_1=//zoom = 1;// + billy*0.01; +per_frame_2=wave_r = wave_r + 0.3*sin(time*0.345); +per_frame_3=wave_g = wave_g + 0.3*sin(time*0.425); +per_frame_4=wave_b = wave_b + 0.3*sin(time*0.515); +per_frame_5=decay = decay - 0.03*equal(int(frame)%2,0); +per_frame_6=rot = rot + 0.02*sin(time*0.05); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Casino.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Casino.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Casino.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Casino.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.993000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.300000 +fWaveScale=0.672168 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.500000 +fShader=0.000000 +zoom=1.150549 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.012485 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.850000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.370000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.150*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.150*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=dx = dx + 0.03*( 0.60*sin(0.334*time) + 0.40*sin(0.264*time) ); +per_frame_5=decay = decay - 0.01*(frame%2); +per_pixel_1=zoom=(zoom-1)*rad+1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cepiasound.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cepiasound.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cepiasound.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cepiasound.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.994000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.900000 +fWaveScale=0.436037 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.050000 +fModWaveAlphaEnd=1.390000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.065000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.280000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.600000 +wave_b=0.200000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=-1.400000 +mv_dy=2.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_g = wave_g + 0.100*( 0.90*sin(0.583*time) + 0.10*sin(1.006*time) ); +per_frame_2=wave_b = wave_b + 0.100*( 0.90*sin(0.993*time) + 0.10*sin(0.933*time) ); +per_frame_3=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.003*( 0.60*sin(0.471*time) + 0.40*sin(0.297*time) ); +per_frame_6=cy = cy + 0.003*( 0.60*sin(0.379*time) + 0.40*sin(0.351*time) ); +per_frame_7=dx = dx + 0.003*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_pixel_1=zoom=zoom+max(bass-1,0)*0.25*sin(rad*15); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Churn.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Churn.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Churn.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Churn.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.999000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.300000 +fWaveScale=1.053000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.488000 +fShader=1.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.239000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.742*time) + 0.40*sin(1.021*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.703*time) + 0.40*sin(0.969*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(1.090*time) + 0.40*sin(0.963*time) ); +per_frame_4=zoom = zoom + 0.033*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Constant Velocity.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Constant Velocity.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Constant Velocity.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Constant Velocity.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.981000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_pixel_1=dx=0.01*cos(ang+1.57); +per_pixel_2=dy=-0.01*sin(ang+1.57); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Coral.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Coral.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Coral.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Coral.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.502464 +fWaveScale=1.111000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.001000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.200*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.200*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.400*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=sx = sx + 0.010*( 0.60*sin(0.313*time) + 0.40*sin(0.383*time) ); +per_frame_7=sy = sy + 0.010*( 0.60*sin(0.367*time) + 0.40*sin(0.272*time) ); +per_pixel_1=rot=rot+rad*0.18*sin(0.4*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Corpus Callosum.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Corpus Callosum.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Corpus Callosum.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Corpus Callosum.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,47 @@ +[preset00] +fGammaAdj=1.900000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=4.400000 +fWaveScale=1.605447 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.006000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.900000 +wave_g=0.450000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.100*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.050*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=decay = decay - 0.01*equal(frame%40,0); +per_frame_4=sx = sx + max(0,max(bass_att,bass)-1)*0.5; +per_pixel_1=zoom=0.9615+rad*0.1; +fRating=1.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cosmic Dust 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cosmic Dust 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cosmic Dust 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cosmic Dust 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,55 @@ +[preset00] +fRating=4.000000 +fGammaAdj=2.000000 +fDecay=0.990000 +fVideoEchoZoom=2.977723 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.996240 +fWaveScale=1.497458 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.162176 +fZoomExponent=1.001000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.796896 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.700000 +wave_b=0.700000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_x = wave_x + 0.150*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.150*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.500*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=sx = sx + 0.010*( 0.60*sin(0.313*time) + 0.40*sin(0.383*time) ); +per_frame_7=sy = sy + 0.010*( 0.60*sin(0.367*time) + 0.40*sin(0.272*time) ); +per_frame_8=decay = decay - 0.01*equal(frame%20,0); +per_pixel_1=rot=rot+rad*0.18*sin(0.4*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cosmic Dust 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cosmic Dust 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cosmic Dust 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cosmic Dust 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.900000 +fDecay=0.980000 +fVideoEchoZoom=1.169360 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.299999 +fWaveScale=1.694000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.053000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.263000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.800000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.650*( 0.60*sin(1.437*time) + 0.40*sin(0.970*time) ); +per_frame_2=wave_g = wave_g + 0.650*( 0.60*sin(1.344*time) + 0.40*sin(0.841*time) ); +per_frame_3=wave_b = wave_b + 0.650*( 0.60*sin(1.251*time) + 0.40*sin(1.055*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.210*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.210*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_9=decay = decay - 0.01*equal(frame%6,0); +per_frame_10=dx = dx + dx_residual; +per_frame_11=dy = dy + dy_residual; +per_frame_12=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_13=dx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_14=dy_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cruzin'.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cruzin'.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cruzin'.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cruzin'.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,59 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.000000 +fWaveScale=1.691672 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000300 +rot=0.000000 +cx=0.500000 +cy=0.110000 +dx=0.000000 +dy=-0.001000 +warp=0.024300 +sx=1.001992 +sy=1.004987 +wave_r=0.000000 +wave_g=0.570000 +wave_b=1.000000 +wave_x=0.650000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(10.937*time) + 0.40*sin(1.470*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(11.344*time) + 0.40*sin(1.041*time) ); +per_frame_3=wave_b = wave_b + 0.250*( 0.60*sin(21.251*time) + 0.40*sin(1.355*time) ); +per_frame_4=rot = rot + 0.004*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=decay = decay - 0.01*equal(frame%6,0); +per_pixel_1=du = (x-cx)*2; +per_pixel_2=dv = (y-cy)*2; +per_pixel_3=q = 0.01*pow(du*du+dv*dv,1.5); +per_pixel_4=dx = q*du; +per_pixel_5=dy = q*dv; +per_pixel_6= +fRating=4.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cycloid 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cycloid 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cycloid 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cycloid 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,63 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.700000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.706706 +fWaveScale=0.234487 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.014000 +rot=-0.060000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.029439 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=dx = dx + 0.01*( 0.60*sin(0.173*time) + 0.40*sin(0.223*time) ); +per_frame_7=decay = decay - 0.01*equal(frame%20,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cycloid 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cycloid 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cycloid 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Cycloid 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,63 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.700000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.706706 +fWaveScale=0.490254 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.024000 +rot=-0.080000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.029439 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=cx = cx + 0.10*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=cy = cy + 0.10*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=dx = dx + 0.01*( 0.60*sin(0.173*time) + 0.40*sin(0.223*time) ); +per_frame_7=decay = decay - 0.01*equal(frame%20,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Davod The Pod.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Davod The Pod.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Davod The Pod.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Davod The Pod.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,53 @@ +[preset00] +fGammaAdj=1.990000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.605000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=2.762000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.100*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.100*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_8= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - De La Moutard 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - De La Moutard 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - De La Moutard 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - De La Moutard 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,62 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=11.940000 +fWaveScale=2.578376 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=4.401000 +fShader=0.000000 +zoom=1.031000 +rot=0.003000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.190000 +wave_g=0.190000 +wave_b=0.190000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = min(1,max(0,(bass_att-1)*1.3)); +per_frame_2=wave_g = wave_r*0.7; +per_frame_3=wave_b = wave_r*0.1; +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.038*time) + 0.40*sin(0.054*time) ); +per_frame_5=dx = dx + 0.002*( 0.60*sin(0.434*time) + 0.40*sin(0.277*time) ); +per_frame_6=dy = dy + 0.002*( 0.60*sin(0.384*time) + 0.40*sin(0.477*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - De La Moutard 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - De La Moutard 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - De La Moutard 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - De La Moutard 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,62 @@ +[preset00] +fRating=4.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=11.940000 +fWaveScale=2.578376 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=4.401000 +fShader=0.000000 +zoom=1.031000 +rot=0.003000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.158989 +sx=1.000000 +sy=1.000000 +wave_r=0.190000 +wave_g=0.190000 +wave_b=0.190000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = min(1,max(0,(bass_att-1)*1.2)); +per_frame_2=wave_g = wave_r*0.7; +per_frame_3=wave_b = wave_r*0.1; +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.038*time) + 0.40*sin(0.054*time) ); +per_frame_5=dx = dx + 0.002*( 0.60*sin(0.434*time) + 0.40*sin(0.277*time) ); +per_frame_6=dy = dy + 0.002*( 0.60*sin(0.384*time) + 0.40*sin(0.477*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Demonic Distortion.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Demonic Distortion.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Demonic Distortion.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Demonic Distortion.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.499900 +fWaveScale=1.981000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.003*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.0040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%2,0); +per_pixel_1=zoom=zoom+(y*2-1)*(0.06+0.12*sin(time*0.351))-(x*2-1)*(0.06+0.12*cos(time*0.351)); +per_pixel_2=rot=rot+(zoom-1.0)*0.16; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Descent.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Descent.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Descent.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Descent.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,48 @@ +[preset00] +fGammaAdj=1.999000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=0.900000 +fWaveScale=1.372000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.053000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.164000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.637*time) + 0.40*sin(0.570*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.744*time) + 0.40*sin(0.641*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.751*time) + 0.40*sin(0.555*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dy = dy + 0.002*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_8=decay = decay - 0.01*equal(frame%50,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Destruction.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Destruction.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Destruction.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Destruction.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,76 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.581546 +fWaveScale=1.235000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=2.301000 +fShader=0.000000 +zoom=1.042000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=2.594000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.250*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.250*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.500*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=zoom = zoom + 0.010*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_7=rot = rot + 0.035*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_8=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.194*time) ); +per_frame_9=cy = cy + 0.037*( 0.60*sin(0.274*time) + 0.40*sin(0.394*time) ); +per_frame_10=dx = dx + 0.019*( 0.60*sin(100.334*time) + 0.40*sin(250.277*time) ); +per_frame_11=dy = dy + 0.019*( 0.60*sin(200.384*time) + 0.40*sin(150.247*time) ); +per_frame_12=sx = sx + 0.010*( 0.60*sin(0.313*time) + 0.40*sin(0.383*time) ); +per_pixel_1=rot=rot+rad*0.18*sin(0.6*time*0.439+0.4*time*0.338); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Diffraction.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Diffraction.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Diffraction.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Diffraction.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,55 @@ +[preset00] +fGammaAdj=1.490000 +fDecay=0.980000 +fVideoEchoZoom=1.091009 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.000000 +fWaveScale=1.694000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.210000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.053000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.319000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.150*( 0.60*sin(1.037*time) + 0.40*sin(0.370*time) ); +per_frame_2=wave_g = wave_g + 0.150*( 0.60*sin(0.944*time) + 0.40*sin(0.441*time) ); +per_frame_3=wave_b = wave_b + 0.150*( 0.60*sin(0.851*time) + 0.40*sin(0.55*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.210*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.210*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_9=decay = decay - 0.01*equal(frame%30,0); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Digital Smoke.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Digital Smoke.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Digital Smoke.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Digital Smoke.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,54 @@ +[preset00] +fGammaAdj=1.000000 +fDecay=0.970000 +fVideoEchoZoom=1.728000 +fVideoEchoAlpha=0.400000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.800000 +fWaveScale=1.694000 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=2.000000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.239000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.10*( 0.60*sin(1.037*time) + 0.40*sin(0.370*time) ); +per_frame_2=wave_g = wave_g + 0.10*( 0.60*sin(0.944*time) + 0.40*sin(0.441*time) ); +per_frame_3=wave_b = wave_b + 0.10*( 0.60*sin(0.851*time) + 0.40*sin(0.55*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.210*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.210*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Downward Spiral.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Downward Spiral.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Downward Spiral.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Downward Spiral.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=2.717574 +fWaveSmoothing=0.900000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.990000 +rot=0.060000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=0.999900 +wave_r=1.000000 +wave_g=0.400000 +wave_b=0.100000 +wave_x=0.500000 +wave_y=0.600000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.120*( 0.60*sin(0.733*time) + 0.40*sin(0.345*time) ); +per_frame_2=wave_g = wave_g + 0.120*( 0.60*sin(0.600*time) + 0.40*sin(0.456*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.510*time) + 0.40*sin(0.550*time) ); +per_pixel_1=rot=rot*(-0.2+pow(cos(rad*8+ang-time*0.8),2)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Drift.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Drift.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Drift.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Drift.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.993000 +fDecay=0.990000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.165135 +fWaveScale=1.421896 +fWaveSmoothing=0.900000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.110549 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.198054 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.550000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_frame_8=decay=decay-0.02*pow(0.5+0.5*sin(time*1.5),3.8); +per_pixel_1=zoom=(zoom-1)*rad+1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Dynamic Swirls 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Dynamic Swirls 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Dynamic Swirls 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Dynamic Swirls 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fGammaAdj=2.700000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.634243 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004960 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.380000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=q1 = (cx*2-1) + 0.62*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=q2 = (cy*2-1) + 0.62*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=q3 = (cx*2-1) + 0.62*( 0.60*sin(0.174*-time) + 0.40*sin(0.364*time) ); +per_frame_7=q4 = (cy*2-1) + 0.62*( 0.60*sin(0.234*time) + 0.40*sin(0.271*-time) ); +per_frame_8=decay = decay - 0.01*equal(frame%5,0); +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.008/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Dynamic Swirls 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Dynamic Swirls 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Dynamic Swirls 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Dynamic Swirls 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fGammaAdj=2.700000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.100000 +fWaveScale=4.695139 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.670000 +fModWaveAlphaEnd=0.970000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.007964 +rot=0.020000 +cx=0.499999 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999667 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.700000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=q1 = (cx*2-1) + 0.32*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=q2 = (cy*2-1) + 0.52*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=q3 = (cx*2-1) + 0.32*( 0.60*sin(0.174*-time) + 0.40*sin(0.364*time) ); +per_frame_7=q4 = (cy*2-1) + 0.52*( 0.60*sin(0.234*time) + 0.40*sin(0.271*-time) ); +per_frame_8=decay = decay - 0.01*equal(frame%5,0); +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.012/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.012/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eddies 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eddies 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eddies 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eddies 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fGammaAdj=2.700000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.870018 +fWaveSmoothing=0.100000 +fWaveParam=0.400000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.593743 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004960 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.278033 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=q1 = (cx*2-1) + 0.62*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=q2 = (cy*2-1) + 0.62*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=q3 = (cx*2-1) + 0.62*( 0.60*sin(0.174*-time) + 0.40*sin(0.364*time) ); +per_frame_7=q4 = (cy*2-1) + 0.62*( 0.60*sin(0.234*time) + 0.40*sin(0.271*-time) ); +per_frame_8=decay = decay - 0.01*equal(frame%5,0); +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.008/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +fRating=4.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eddies 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eddies 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eddies 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eddies 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,78 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.700000 +fDecay=0.980000 +fVideoEchoZoom=1.645405 +fVideoEchoAlpha=0.400000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.605989 +fWaveScale=0.870018 +fWaveSmoothing=0.100000 +fWaveParam=-0.300000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.593743 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004960 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-0.010000 +warp=0.278033 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.140000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=q1 = (cx*2-1) + 0.62*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=q2 = (cy*2-1) + 0.62*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=q3 = (cx*2-1) + 0.62*( 0.60*sin(0.174*-time) + 0.40*sin(0.364*time) ); +per_frame_7=q4 = (cy*2-1) + 0.62*( 0.60*sin(0.234*time) + 0.40*sin(0.271*-time) ); +per_frame_8=decay = decay - 0.01*equal(frame%5,0); +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = dx + mult*sin(ang2-1.5); +per_pixel_7=dy = dy + mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.008/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eggs.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eggs.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eggs.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Eggs.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,54 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.500000 +fWaveScale=2.720000 +fWaveSmoothing=0.770000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.046000 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.420000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.070*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.070*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_pixel_1=zoom=zoom+0.27*sin(time*1.55+rad*5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - El Cubismo.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - El Cubismo.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - El Cubismo.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - El Cubismo.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,55 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.500000 +fWaveScale=2.720000 +fWaveSmoothing=0.770000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.046000 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.420000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.070*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.070*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_pixel_1=dx=dx-0.05*sin(time*1.35+(x*2-1)*18); +per_pixel_2=dy=dy-0.05*sin(time*1.79+(y*2-1)*9); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Feedback 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Feedback 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Feedback 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Feedback 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,231 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.000000 +fDecay=0.900000 +fVideoEchoZoom=0.710682 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.311604 +fWaveScale=1.228910 +fWaveSmoothing=0.000000 +fWaveParam=0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999902 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.207965 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.006500 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.370000 +shapecode_0_y=0.500000 +shapecode_0_rad=2.999997 +shapecode_0_ang=3.644249 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.500000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.300000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=1.000000 +shape_0_init1=t1 = rand(100)*0.01; +shape_0_init2=t2 = rand(100)*0.01; +shape_0_per_frame1=ang = time*(0.3 + 0.1*t1); +shape_0_per_frame2=rad = rad * (0.9 + 0.2*t2); +shape_0_per_frame3=r = min(1,max(0,r + 0.2*sin(time*0.417 + 1))); +shape_0_per_frame4=g = min(1,max(0,g + 0.2*sin(time*0.391 + 2))); +shape_0_per_frame5=b = min(1,max(0,b + 0.2*sin(time*0.432 + 4))); +shape_0_per_frame6=r2 = min(1,max(0,r2 + 0.2*sin(time*0.657 + 3))); +shape_0_per_frame7=g2 = min(1,max(0,g2 + 0.2*sin(time*0.737 + 5))); +shape_0_per_frame8=b2 = min(1,max(0,b2 + 0.2*sin(time*0.884 + 6))); +shapecode_1_enabled=1 +shapecode_1_sides=50 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.370000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.706533 +shapecode_1_ang=3.644249 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=0.800000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_init1=t1 = rand(100)*0.01; +shape_1_init2=t2 = rand(100)*0.01; +shape_1_per_frame1=x = x + 0.05*sin(time*1.25+3); +shape_1_per_frame2=y = y + 0.03*sin(time*1.49+1); +shape_1_per_frame3=ang = time*(0.3 + 0.1*t1); +shape_1_per_frame4=rad = rad * (0.9 + 0.2*t2); +shape_1_per_frame5=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_1_per_frame6=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_1_per_frame7=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_1_per_frame8=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_1_per_frame9=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_1_per_frame10=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shapecode_2_enabled=1 +shapecode_2_sides=50 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.670000 +shapecode_2_y=0.430000 +shapecode_2_rad=0.706533 +shapecode_2_ang=4.209736 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=0.800000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_init1=t1 = rand(100)*0.01; +shape_2_init2=t2 = rand(100)*0.01; +shape_2_per_frame1=x = x + 0.05*sin(time*2.17); +shape_2_per_frame2=y = y + 0.03*sin(time*1.83); +shape_2_per_frame3=ang = time*(0.3 + 0.1*t1); +shape_2_per_frame4=rad = rad * (0.9 + 0.2*t2); +shape_2_per_frame5=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_2_per_frame6=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_2_per_frame7=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_2_per_frame8=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_2_per_frame9=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_2_per_frame10=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shapecode_3_enabled=1 +shapecode_3_sides=60 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.161222 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=0.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=1.000000 +shape_3_per_frame1=x = x + 0.2*sin(time*1.14); +shape_3_per_frame2=y = y + 0.1*sin(time*0.93+2); +per_frame_1=wave_mystery = time*0.2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Feedback.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Feedback.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Feedback.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Feedback.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,224 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.311604 +fWaveScale=1.228910 +fWaveSmoothing=0.000000 +fWaveParam=0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.459526 +fWarpScale=2.006761 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999902 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.460478 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.006500 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.370000 +shapecode_0_y=0.500000 +shapecode_0_rad=2.999997 +shapecode_0_ang=3.644249 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.500000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.300000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=1.000000 +shape_0_init1=t1 = rand(100)*0.01; +shape_0_init2=t2 = rand(100)*0.01; +shape_0_per_frame1=ang = time*(0.3 + 0.1*t1); +shape_0_per_frame2=rad = rad * (0.9 + 0.2*t2); +shape_0_per_frame3=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_0_per_frame4=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_0_per_frame5=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_0_per_frame6=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_0_per_frame7=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_0_per_frame8=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.370000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.749999 +shapecode_1_ang=3.644249 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=0.800000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_init1=t1 = rand(100)*0.01; +shape_1_init2=t2 = rand(100)*0.01; +shape_1_per_frame1=ang = time*(0.3 + 0.1*t1); +shape_1_per_frame2=rad = rad * (0.9 + 0.2*t2); +shape_1_per_frame3=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_1_per_frame4=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_1_per_frame5=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_1_per_frame6=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_1_per_frame7=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_1_per_frame8=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.670000 +shapecode_2_y=0.430000 +shapecode_2_rad=0.749999 +shapecode_2_ang=4.209736 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=0.800000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_init1=t1 = rand(100)*0.01; +shape_2_init2=t2 = rand(100)*0.01; +shape_2_per_frame1=ang = time*(0.3 + 0.1*t1); +shape_2_per_frame2=rad = rad * (0.9 + 0.2*t2); +shape_2_per_frame3=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_2_per_frame4=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_2_per_frame5=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_2_per_frame6=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_2_per_frame7=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_2_per_frame8=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shapecode_3_enabled=1 +shapecode_3_sides=60 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.700000 +shapecode_3_y=0.580000 +shapecode_3_rad=0.161222 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=0.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=1.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Festive.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Festive.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Festive.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Festive.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.960000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=4.077960 +fWaveSmoothing=0.900000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.070549 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.198054 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = min(1,max(0,0.4*bass)); +per_frame_2=wave_g = min(1,max(0,0.4*mid)); +per_frame_3=wave_b = min(1,max(0,0.4*treb)); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_frame_8=decay=decay-0.03*pow(0.5+0.5*sin(time*1.5),3.8); +per_pixel_1=zoom=(zoom-1.0)*rad+1.0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Fiberglass.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Fiberglass.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Fiberglass.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Fiberglass.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,64 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.800000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.100000 +fWaveScale=15.477304 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.163000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=2.358000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.737*time) + 0.40*sin(0.970*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.844*time) + 0.40*sin(0.941*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.851*time) + 0.40*sin(1.055*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dy = dy + 0.002*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_8=decay = decay - 0.01*equal(frame%16,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flotsam.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flotsam.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flotsam.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flotsam.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,63 @@ +[preset00] +fGammaAdj=2.700000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=4.099998 +fWaveScale=2.245670 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.012991 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999666 +sy=0.999900 +wave_r=1.000000 +wave_g=0.650000 +wave_b=0.250000 +wave_x=0.500000 +wave_y=0.380000 +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.250*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.250*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=q1 = (cx*2-1) + 0.92*( 0.60*sin(0.374*time) + 0.40*sin(0.494*time) ); +per_frame_5=q2 = (cy*2-1) + 0.92*( 0.60*sin(0.393*time) + 0.40*sin(0.423*time) ); +per_frame_6=q3 = (cx*2-1) + 0.92*( 0.60*sin(0.174*-time) + 0.40*sin(0.364*time) ); +per_frame_7=q4 = (cy*2-1) + 0.92*( 0.60*sin(0.234*time) + 0.40*sin(0.271*-time) ); +per_pixel_1=du = (x*2-1) - q1; +per_pixel_2=dv = (y*2-1) - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.012/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = (x*2-1) - q3; +per_pixel_9=dv = (y*2-1) - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.012/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flower Blossom.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flower Blossom.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flower Blossom.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flower Blossom.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.500000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.499900 +fWaveScale=1.605000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=0.100000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_pixel_1=zoom=zoom+0.07*sin(rad*20+time*2.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flower.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flower.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flower.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Flower.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,49 @@ +[preset00] +fGammaAdj=2.700000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.960000 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=1.000000 +fWaveScale=1.151736 +fWaveSmoothing=0.100000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.280549 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.012485 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_pixel_1=zoom=(zoom-1)*rad+1; +fRating=1.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Four Kinds of Amphetamines.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Four Kinds of Amphetamines.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Four Kinds of Amphetamines.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Four Kinds of Amphetamines.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,47 @@ +[preset00] +fGammaAdj=0.800000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.970000 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=0.800000 +fWaveScale=1.053000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.488000 +fShader=1.000000 +zoom=1.316000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.350000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.742*time) + 0.40*sin(1.021*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.703*time) + 0.40*sin(0.969*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(1.090*time) + 0.40*sin(0.963*time) ); +per_frame_4=zoom = zoom + 0.033*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Galaxy 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Galaxy 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Galaxy 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Galaxy 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,60 @@ +[preset00] +fRating=1.000000 +fGammaAdj=1.900000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.000000 +fWaveScale=1.053000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.010000 +rot=-0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=0.990000 +wave_r=0.250000 +wave_g=0.250000 +wave_b=0.900000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.120*( 0.60*sin(0.733*time) + 0.40*sin(0.345*time) ); +per_frame_2=wave_g = wave_g + 0.120*( 0.60*sin(0.600*time) + 0.40*sin(0.456*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.510*time) + 0.40*sin(0.550*time) ); +per_pixel_1=rot=rot-0.082*(1-pow(abs(rad-0.3)*2.0, 0.3)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Galaxy 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Galaxy 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Galaxy 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Galaxy 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,53 @@ +[preset00] +fGammaAdj=1.970000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.000000 +fWaveScale=1.053000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.020000 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.869267 +sx=1.000000 +sy=0.990000 +wave_r=0.250000 +wave_g=0.250000 +wave_b=0.900000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.120*( 0.60*sin(0.733*time) + 0.40*sin(0.345*time) ); +per_frame_2=wave_g = wave_g + 0.120*( 0.60*sin(0.600*time) + 0.40*sin(0.456*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.510*time) + 0.40*sin(0.550*time) ); +per_frame_4=dx=dx+0.004*sin(time*0.974); +per_frame_5=dy=dy+0.004*cos(time*0.705); +per_frame_6= +per_pixel_1=rot=rot+0.082*(1-pow(abs(rad-0.3)*2.0, 0.3)); +fRating=1.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Greenland.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Greenland.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Greenland.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Greenland.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.989900 +fVideoEchoZoom=1.061000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.395453 +fWaveScale=0.135085 +fWaveSmoothing=0.500000 +fWaveParam=0.280000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=2.700000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.001000 +warp=0.319549 +sx=1.000000 +sy=1.000000 +wave_r=0.100000 +wave_g=1.000000 +wave_b=0.100000 +wave_x=0.500000 +wave_y=0.540000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(2.137*time) + 0.40*sin(1.770*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(1.944*time) + 0.40*sin(1.541*time) ); +per_frame_3=wave_b = wave_b + 0.250*( 0.60*sin(1.251*time) + 0.40*sin(1.655*time) ); +per_frame_4=rot = rot + 0.01*( 0.60*sin(0.337*time) + 0.40*sin(0.270*time) ); +per_frame_5=decay = decay - 0.03*equal(frame%4,0); +per_frame_6=wave_mystery = wave_mystery + 0.07*sin(time*0.09); +per_pixel_1=warp = warp*(x*2-1)*(y*2-1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,50 @@ +[preset00] +fGammaAdj=1.993000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=0.300000 +fWaveScale=1.151736 +fWaveSmoothing=0.100000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.280549 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.012485 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_frame_8=decay = decay - 0.01*(frame%2); +per_pixel_1=zoom=(zoom-1)*rad+1; +fRating=3.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,50 @@ +[preset00] +fGammaAdj=1.994000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=0.800000 +fWaveScale=1.151736 +fWaveSmoothing=0.100000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.280549 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.012485 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_frame_8=decay=decay-0.01*(frame%2); +per_pixel_1=zoom=(zoom-1)*rad+1; +fRating=4.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Heavenly 3.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,55 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.994000 +fDecay=0.980000 +fVideoEchoZoom=2.205000 +fVideoEchoAlpha=0.300000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.151736 +fWaveSmoothing=0.100000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.280549 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.012485 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.700000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_frame_8=decay=decay-0.01*(frame%2); +per_pixel_1=zoom=(zoom-1)*rad+1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - High Dynamic Range.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - High Dynamic Range.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - High Dynamic Range.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - High Dynamic Range.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,227 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.500000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=4 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=32.544682 +fWaveScale=0.503666 +fWaveSmoothing=0.558000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.870000 +fModWaveAlphaEnd=1.289900 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000012 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=16 +shapecode_0_additive=1 +shapecode_0_thickOutline=1 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.879999 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.060000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang = time*1.4; +shape_0_per_frame2=x = q1; +shape_0_per_frame3=y = q2; +shape_0_per_frame4=r = 0.5 + 0.5*sin(time*0.713 + 1); +shape_0_per_frame5=g = 0.5 + 0.5*sin(time*0.563 + 2); +shape_0_per_frame6=b = 0.5 + 0.5*sin(time*0.654 + 5); +shape_0_per_frame7=r2 = 0.5 + 0.5*sin(time*0.885 + 4); +shape_0_per_frame8=g2 = 0.5 + 0.5*sin(time*0.556+ 1); +shape_0_per_frame9=b2 = 0.5 + 0.5*sin(time*0.638 + 3); +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1= +per_frame_2=// in this example, q1 and q2 act as the center of zooming +per_frame_3=// AND as the position of custom shape #1... +per_frame_4=q1 = 0.5 + 0.32*cos(time*0.4); +per_frame_5=q2 = 0.5 + 0.22*sin(time*0.4); +per_frame_6= +per_frame_7=//wave_x = q1; +per_frame_8=wave_y = q2; +per_pixel_1=dx = (x-q1)*0.02; +per_pixel_2=dy = (y-q2)*0.02; +per_pixel_3= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Hovering.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Hovering.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Hovering.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Hovering.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.100000 +fWaveScale=3.019205 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.010000 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=decay = decay - 0.01*equal((frame/30)%2,0); +per_pixel_1=q1=0.5+0.5*sin(rad*12.0 + time*0.7); +per_pixel_2=dx=0.01*cos(q1+time*0.5); +per_pixel_3=dy=0.01*sin(q1+time*0.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Hyperion.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Hyperion.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Hyperion.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Hyperion.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,51 @@ +[preset00] +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=8.200001 +fWaveScale=3.227871 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.050000 +fModWaveAlphaEnd=1.650000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.205000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.016046 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.600000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_g = wave_g + 0.100*( 0.90*sin(0.583*time) + 0.10*sin(1.006*time) ); +per_frame_2=wave_b = wave_b + 0.100*( 0.90*sin(0.993*time) + 0.10*sin(0.933*time) ); +per_frame_3=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.003*( 0.60*sin(0.471*time) + 0.40*sin(0.297*time) ); +per_frame_6=cy = cy + 0.003*( 0.60*sin(0.379*time) + 0.40*sin(0.351*time) ); +per_frame_7=dx = dx + 0.003*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=rot=rot+0.02*(sin(time*2.134)+sin(time*1.7134)+sin(time*2.834)); +per_frame_9=dx=dx+0.01*(sin(time*1.134)+sin(time*0.7134)+sin(time*2.334)); +per_frame_10=dy=dy+0.01*(sin(time*1.8834)+sin(time*1.0144)+sin(time*1.334)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Inkblot.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Inkblot.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Inkblot.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Inkblot.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,49 @@ +[preset00] +fGammaAdj=1.500000 +fDecay=0.980000 +fVideoEchoZoom=1.010137 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=2.500000 +fWaveScale=2.202000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.196462 +sx=1.000000 +sy=1.000000 +wave_r=0.400000 +wave_g=0.600000 +wave_b=0.800000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.300*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.300*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*below(frame%2,1); +per_pixel_1=zoom=zoom+0.04*sin(ang*5+time*2.3); +fRating=3.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Iris.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Iris.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Iris.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Iris.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.972750 +fWaveScale=0.656000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=10.400000 +fShader=0.000000 +zoom=1.124000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.200*( 0.60*sin(1.321*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.200*( 0.60*sin(1.742*time) + 0.40*sin(1.422*time) ); +per_frame_3=wave_r = wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=rot = rot + 0.070*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_7=cx = cx + 0.090*( 0.60*sin(0.374*time) + 0.40*sin(0.194*time) ); +per_frame_8=cy = cy + 0.097*( 0.60*sin(0.274*time) + 0.40*sin(0.394*time) ); +per_frame_9=decay = decay - 0.01*equal(frame%70,0); +per_frame_10= +per_frame_11=dx = dx + dx_residual; +per_frame_12=dy = dy + dy_residual; +per_frame_13=bass_thresh = above(bass_att,bass_thresh)*2.5 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.4)*0.98+1.4); +per_frame_14=dx_residual = equal(bass_thresh,2.5)*0.016*sin(time*7) + (1-equal(bass_thresh,2.5))*dx_residual; +per_frame_15=dy_residual = equal(bass_thresh,2.5)*0.012*sin(time*9) + (1-equal(bass_thresh,2.5))*dy_residual; +per_pixel_1=rot=rot+rad*0.14*sin(0.6186*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Journey.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Journey.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Journey.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Journey.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.960000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=10.140000 +fWaveScale=2.868977 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=2.301000 +fShader=0.000000 +zoom=1.059000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.290000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_x = wave_x + 0.080*( 0.60*sin(0.221*time) + 0.40*sin(0.121*time) ); +per_frame_2=wave_y = wave_y + 0.120*( 0.60*sin(0.142*time) + 0.40*sin(0.232*time) ); +per_frame_3=wave_r = wave_r + 0.500*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=zoom = zoom + 0.007*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_7=rot = rot + 0.02*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_8=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.194*time) ); +per_frame_9=cy = cy + 0.037*( 0.60*sin(0.274*time) + 0.40*sin(0.394*time) ); +per_frame_10=dx = dx + 0.004*( 0.60*sin(0.334*time) + 0.40*sin(0.277*time) ); +per_frame_11=dy = dy + 0.004*( 0.60*sin(0.384*time) + 0.40*sin(0.247*time) ); +per_frame_12=sx = sx + 0.010*( 0.60*sin(0.313*time) + 0.40*sin(0.383*time) ); +per_pixel_1=rot=rot+rad*0.1*sin(0.6*time*0.439+0.4*time*0.338); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Julia Fractal 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Julia Fractal 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Julia Fractal 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Julia Fractal 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=1.010000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.740000 +fWaveScale=0.656000 +fWaveSmoothing=0.800000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.960000 +fShader=0.000000 +zoom=0.980000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.500*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.500*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.500*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=zoom = zoom + 0.070*( 0.60*sin(0.239*time) + 0.40*sin(0.296*time) ); +per_frame_7=rot = rot + 0.038*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_8=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.194*time) ); +per_frame_9=cy = cy + 0.037*( 0.60*sin(0.274*time) + 0.40*sin(0.394*time) ); +per_frame_10=dx = dx + 0.025*( 0.60*sin(0.334*time) + 0.40*sin(0.277*time) ); +per_frame_11=dy = dy + 0.025*( 0.60*sin(0.384*time) + 0.40*sin(0.247*time) ); +per_frame_12=sx = sx + 0.015*( 0.60*sin(0.313*time) + 0.40*sin(0.383*time) ); +per_frame_13=decay = decay - 0.01*equal(frame%50,0); +per_pixel_1=rot=rot+rad*0.25*sin(0.3986*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Julia Fractal 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Julia Fractal 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Julia Fractal 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Julia Fractal 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,82 @@ +[preset00] +fRating=3.00000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=1.010000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.740000 +fWaveScale=0.656000 +fWaveSmoothing=0.800000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.960000 +fShader=0.000000 +zoom=0.980000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.070000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.025000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.500*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.500*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.500*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=zoom = zoom + 0.070*( 0.60*sin(0.239*time) + 0.40*sin(0.296*time) ); +per_frame_7=rot = rot + 0.038*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_8=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.194*time) ); +per_frame_9=cy = cy + 0.037*( 0.60*sin(0.274*time) + 0.40*sin(0.394*time) ); +per_frame_10=dx = dx + 0.025*( 0.60*sin(0.334*time) + 0.40*sin(0.277*time) ); +per_frame_11=dy = dy + 0.025*( 0.60*sin(0.384*time) + 0.40*sin(0.247*time) ); +per_frame_12=sx = sx + 0.015*( 0.60*sin(0.313*time) + 0.40*sin(0.383*time) ); +per_frame_13=decay = decay - 0.01*equal(frame%50,0); +per_frame_14=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_15=ib_g = ib_g + 0.2*sin(time*0.3459); +per_frame_16=ib_b = ib_b + 0.2*sin(time*0.4354); +per_frame_17=blah = 3.0/(ib_r+ib_g+ib_b); +per_frame_18=ib_r = ib_r*blah; ib_g = ib_g*blah; ib_b = ib_b*blah; +per_pixel_1=rot=rot+rad*0.25*sin(0.3986*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Luz.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Luz.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Luz.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Luz.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,53 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.200000 +fWaveScale=71.269997 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=3.600000 +fShader=0.000000 +zoom=1.014000 +rot=-0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.309000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%30,0); +per_pixel_1=rot=rot+0.04*rad*cos(ang*4+time*1.9); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,48 @@ +[preset00] +fGammaAdj=2.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=3.300000 +fWaveScale=1.170000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=1.025000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.309000 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.500000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.01*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%6,0); +per_pixel_1=rot=rot+0.16*sin(time*-3.3+rad*11)*(1.3-rad); +fRating=3.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,53 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.300000 +fWaveScale=1.170000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=1.025000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.290770 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.500000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.01*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%6,0); +per_pixel_1=rot=rot+0.16*sin(time*-3.3+rad*11)*(1.3-rad); +fRating=3.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Mega Swirl 3.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.500000 +fWaveScale=0.621787 +fWaveSmoothing=0.500000 +fWaveParam=-0.140000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=1.025000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.309000 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.500000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.01*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%5,0); +per_pixel_1=rot=rot+0.16*sin(time*-3.3+rad*11)*(1.3-rad); +per_pixel_2=zoom=zoom+0.04*sin(time*1.2+ang*6.28*3); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Microcosm.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Microcosm.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Microcosm.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Microcosm.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.200000 +fWaveScale=1.981000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=zoom=max(0.98, min(0.15+0.8*bass_att, 1.75 )); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Monotone Ripples.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Monotone Ripples.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Monotone Ripples.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Monotone Ripples.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.500000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.100000 +fWaveScale=2.202000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.053000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.990000 +wave_g=0.990000 +wave_b=0.990000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.010*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.010*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.010*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=q2=0.05+0.01*sin(time*0.71); +per_pixel_1=zoom=zoom+q2*sin(rad*20+time*2.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Music Box.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Music Box.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Music Box.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Music Box.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,49 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=4.000000 +fWaveScale=0.022504 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.041000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-0.001000 +warp=0.350933 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.570000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.480000 +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(2.137*time) + 0.40*sin(1.770*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(1.944*time) + 0.40*sin(1.541*time) ); +per_frame_3=wave_b = wave_b + 0.250*( 0.60*sin(1.251*time) + 0.40*sin(1.655*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=decay = decay - 0.01*equal(frame%6,0); +fRating=3.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Nautilus.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Nautilus.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Nautilus.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Nautilus.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.058150 +fWaveSmoothing=0.750000 +fWaveParam=0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=-0.820000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.999999 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=rot = rot + 0.73*sin(time*0.065); +per_frame_2=zoom=zoom+rot*0.2; +per_frame_3=warp=warp+max(0,(bass_att-1.2)*4.5); +per_frame_4=decay = decay - 0.01*equal(frame%20,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Blue.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Blue.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Blue.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Blue.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.179452 +fWaveScale=3.540751 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.030000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.076000 +sx=1.000000 +sy=1.000000 +wave_r=0.450000 +wave_g=0.450000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.200*( 0.60*sin(1.517*time) + 0.40*sin(1.580*time) ); +per_frame_2=wave_g = wave_g + 0.200*( 0.60*sin(1.088*time) + 0.40*sin(1.076*time) ); +per_frame_3=wave_b = wave_b + 0.300*( 0.60*sin(1.037*time) + 0.40*sin(0.922*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=decay = decay - 0.02*equal(frame%5,0); +per_frame_8=q1=cos(1.41*time); +per_pixel_1=rot=rot+0.05*sin(rad*13.5 + time*-1.3 + q1*1.31); +per_pixel_2=zoom=zoom+0.05*sin(ang*8.0 + rad*7.5 + time*-1.63 + q1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Ever Changing.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Ever Changing.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Ever Changing.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Ever Changing.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,76 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.868656 +fWaveScale=1.420825 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.010000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.076000 +sx=1.000000 +sy=1.000000 +wave_r=0.950000 +wave_g=0.350000 +wave_b=0.450000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.000*( 0.60*sin(1.517*time) + 0.40*sin(1.580*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(1.088*time) + 0.40*sin(1.076*time) ); +per_frame_3=wave_b = wave_b + 0.300*( 0.60*sin(1.037*time) + 0.40*sin(0.922*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=q1=cos(1.41*time); +per_frame_8=q2=time + 0.3*sin(time*1.47); +per_frame_9=cx=cx+0.2*sin(q1*0.5); +per_frame_10=cy=cy+0.2*sin(q2*0.4); +per_pixel_1=rot=rot+0.05*sin(rad*(13.5 + 5.5*sin(time*0.1623)) + q2*1.3 + q*1.31); +per_pixel_2=zoom=zoom+0.05*sin(ang*10.0 + rad*(7.5 + 1.5*sin(time*0.13)) + q2*1.63 + q); +per_pixel_3=zoom=zoom+0.05-0.05*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Fat and Ever Changing.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Fat and Ever Changing.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Fat and Ever Changing.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Fat and Ever Changing.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=6.562210 +fWaveScale=0.838983 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.030000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.076000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.150000 +wave_b=0.350000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 1.000*( 0.60*sin(1.517*time) + 0.40*sin(1.580*time) ); +per_frame_2=wave_g = wave_g + 1.000*( 0.60*sin(1.088*time) + 0.40*sin(1.076*time) ); +per_frame_3=wave_b = wave_b + 1.000*( 0.60*sin(1.037*time) + 0.40*sin(0.922*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=q1=cos(1.41*time); +per_frame_8=q2=time + 0.3*sin(time*1.47); +per_frame_9=cx=cx+0.2*sin(q1*0.5); +per_frame_10=cy=cy+0.2*sin(q2*0.4); +per_pixel_1=rot=rot+0.05*sin(rad*(9.5 + 5.5*sin(time*0.1623)) + q2*1.3 + q*1.31); +per_pixel_2=zoom=zoom+0.05*sin(ang*6 + rad*(5.5 + 1.5*sin(time*0.13)) + q2*1.63 + q); +per_pixel_3=zoom=zoom+0.05-0.05*rad; +per_pixel_4=rot=rot*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Gold.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Gold.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Gold.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Gold.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=6.562210 +fWaveScale=2.673533 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=2.143588 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.010000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.004791 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.800000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=8.000000 +nMotionVectorsY=6.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.200*( 0.60*sin(0.394*time) + 0.40*sin(0.475*time) ); +per_frame_2=wave_y = wave_y + 0.200*( 0.60*sin(0.442*time) + 0.40*sin(0.321*time) ); +per_frame_3=wave_r = wave_r + 0.300*( 0.60*sin(1.517*time) + 0.40*sin(1.580*time) ); +per_frame_4=wave_g = wave_g + 0.200*( 0.60*sin(1.088*time) + 0.40*sin(1.076*time) ); +per_frame_5=wave_b = wave_b + 1.000*( 0.60*sin(3.422*time) + 0.40*sin(2.494*time) ); +per_frame_6=rot = rot + 0.040*( 0.60*sin(0.181*time) + 0.40*sin(0.279*time) ); +per_frame_7=cx = cx + 0.110*( 0.60*sin(0.174*time) + 0.40*sin(0.204*time) ); +per_frame_8=cy = cy + 0.110*( 0.60*sin(0.193*time) + 0.40*sin(0.237*time) ); +per_frame_9=zoom=zoom+0.01+0.037*sin(time*0.93) + 0.03*sin(time*0.01); +per_frame_10=q1=cos(0.23*time); +per_frame_11=q2=time + 0.3*sin(time*0.21); +per_frame_12=cx=cx+0.2*sin(q1*0.5); +per_frame_13=cy=cy+0.2*sin(q2*0.4); +per_pixel_1=rot=rot+0.05*sin(rad*(9.5 + 5.5*sin(time*0.0823)) + q2*1.3); +per_pixel_2=zoom=zoom+0.05*sin(ang*6 + rad*(5.5 + 1.5*sin(time*0.04)) + q2*1.63 + q); +per_pixel_3=zoom=zoom+0.05-0.05*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Gold with Dots.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Gold with Dots.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Gold with Dots.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus Gold with Dots.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=6.562210 +fWaveScale=0.838983 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=2.143588 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.040000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.004791 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.600000 +wave_b=0.100000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=8.000000 +nMotionVectorsY=6.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.200*( 0.60*sin(1.517*time) + 0.40*sin(1.580*time) ); +per_frame_2=wave_g = wave_g + 0.100*( 0.60*sin(1.088*time) + 0.40*sin(1.076*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(3.422*time) + 0.40*sin(2.494*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.181*time) + 0.40*sin(0.279*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.174*time) + 0.40*sin(0.204*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.193*time) + 0.40*sin(0.237*time) ); +per_frame_7=zoom=zoom+0.01+0.037*sin(time*0.93) + 0.03*sin(time*0.01); +per_frame_8=q1=cos(0.23*time); +per_frame_9=q2=time + 0.3*sin(time*0.21); +per_frame_10=cx=cx+0.2*sin(q1*0.5); +per_frame_11=cy=cy+0.2*sin(q2*0.4); +per_pixel_1=rot=rot+0.05*sin(rad*(9.5 + 5.5*sin(time*0.0823)) + q2*1.3); +per_pixel_2=zoom=zoom+0.05*sin(ang*6 + rad*(5.5 + 1.5*sin(time*0.04)) + q2*1.63 + q); +per_pixel_3=zoom=zoom+0.05-0.05*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Octopus.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.426125 +fWaveScale=1.881700 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.020000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.076000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.150000 +wave_b=0.350000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 1.000*( 0.60*sin(1.517*time) + 0.40*sin(1.580*time) ); +per_frame_2=wave_g = wave_g + 1.000*( 0.60*sin(1.088*time) + 0.40*sin(1.076*time) ); +per_frame_3=wave_b = wave_b + 1.000*( 0.60*sin(1.037*time) + 0.40*sin(0.922*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=q1=cos(1.41*time); +per_frame_8=q2=time + 0.3*sin(time*1.47); +per_pixel_1=rot=rot+0.05*sin(rad*13.5 + q2*1.3 + q*1.31); +per_pixel_2=zoom=zoom+0.05*sin(ang*10.0 + rad*7.5 + q2*1.63 + q); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Oldskool Mellowstyle.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Oldskool Mellowstyle.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Oldskool Mellowstyle.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Oldskool Mellowstyle.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.500000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.605000 +fWaveSmoothing=0.558000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.870000 +fModWaveAlphaEnd=1.289900 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.700000 +wave_b=0.700000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.3*( 0.60*sin(0.633*time) + 0.40*sin(0.845*time) ); +per_frame_2=wave_g = wave_g + 0.3*( 0.60*sin(0.370*time) + 0.40*sin(0.656*time) ); +per_frame_3=wave_b = wave_b + 0.3*( 0.60*sin(0.740*time) + 0.40*sin(0.520*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%50,0); +per_frame_7=zoom=zoom+(bass_att-1)*0.001; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pelota De Fuego.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pelota De Fuego.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pelota De Fuego.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pelota De Fuego.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,65 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.500000 +fWaveScale=3.187000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.010000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.263000 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.350000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.450*( 0.60*sin(2.137*time) + 0.40*sin(1.770*time) ); +per_frame_2=wave_g = wave_g + 0.150*( 0.60*sin(1.944*time) + 0.40*sin(1.541*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(1.251*time) + 0.40*sin(1.655*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.210*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.210*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_9=decay = decay - 0.01*equal(frame%20,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pinch.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pinch.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pinch.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pinch.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,52 @@ +[preset00] +fGammaAdj=1.500000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.605000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.900000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.100*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.100*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_pixel_1=rot=rot+0.05+0.04*sin(ang*3+time*1.6); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pistons.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pistons.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pistons.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Pistons.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,50 @@ +[preset00] +fGammaAdj=1.900000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.981000 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.995000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.975000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.200*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.200*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.200*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_pixel_1=sx=sx+0.07*sin(rad*18 + time*9); +fRating=3.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Planet 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Planet 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Planet 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Planet 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.300000 +fWaveScale=1.981000 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_pixel_1=zoom = zoom + (x*2-1)*(0.08+0.15*sin(time*0.321)) + (y*2-1)*(0.08+0.15*cos(time*0.321)); +per_pixel_2=sx=sx-(zoom-1)*0.1; +per_pixel_3=sy=sy-(zoom-1)*0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Planet 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Planet 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Planet 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Planet 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.300000 +fWaveScale=1.981000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.400000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.050*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.300*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay=decay-0.01*equal(frame%3,0); +per_pixel_1=zoom=zoom-0.02*acos(x*2-1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Quasilinear Submanifolds.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Quasilinear Submanifolds.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Quasilinear Submanifolds.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Quasilinear Submanifolds.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,47 @@ +[preset00] +fGammaAdj=2.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.400000 +nVideoEchoOrientation=0 +fDecay=0.970000 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=1.400000 +fWaveScale=1.605000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=2.762000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Reducto Absurdum.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Reducto Absurdum.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Reducto Absurdum.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Reducto Absurdum.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=5.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.605000 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.042000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.213*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.050*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx=cx+(zoom-1)*7; +per_frame_7=cy=cy+rot*2; +per_frame_8=sx=sx-max(0,(bass_att-1.2)); +per_frame_9=sy=sy-max(0,(treb_att-1.2)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Reducto Ad Nauseum.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Reducto Ad Nauseum.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Reducto Ad Nauseum.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Reducto Ad Nauseum.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=4.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.605000 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.042000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.213*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.050*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx=cx+(zoom-1)*7; +per_frame_7=cy=cy+rot*2; +per_frame_8=sx=sx+max(0,(bass_att-1.2)); +per_frame_9=sy=sy+max(0,(treb_att-1.2)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Rocket.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Rocket.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Rocket.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Rocket.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,53 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.300000 +fWaveScale=0.559607 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=3.300000 +fShader=0.000000 +zoom=1.046000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.025000 +warp=0.309000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.620000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%80,0); +per_pixel_1=sy=sy-0.1*log10(y*2+0.2); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Julia Fractal (Vectrip Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Julia Fractal (Vectrip Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Julia Fractal (Vectrip Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Julia Fractal (Vectrip Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,99 @@ +[preset00] +fRating=5.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=1.010000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.740000 +fWaveScale=0.656000 +fWaveSmoothing=0.800000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.960000 +fShader=0.000000 +zoom=0.980000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=0.600000 +mv_g=0.700000 +mv_b=0.640000 +mv_a=0.700000 +per_frame_1=wave_x = wave_x + 0.500*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.500*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.500*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=zoom = zoom + 0.070*( 0.60*sin(0.239*time) + 0.40*sin(0.296*time) ); +per_frame_7=rot = rot + 0.038*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_8=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.194*time) ); +per_frame_9=cy = cy + 0.037*( 0.60*sin(0.274*time) + 0.40*sin(0.394*time) ); +per_frame_10=dx = dx + 0.025*( 0.60*sin(0.334*time) + 0.40*sin(0.277*time) ); +per_frame_11=dy = dy + 0.025*( 0.60*sin(0.384*time) + 0.40*sin(0.247*time) ); +per_frame_12=sx = sx + 0.015*( 0.60*sin(0.313*time) + 0.40*sin(0.383*time) ); +per_frame_13=decay = decay - 0.01*equal(frame%50,0); +per_frame_14=vol = (bass+mid+att)/6; +per_frame_15=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_16=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_17=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_18=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_19=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_20=xpos = xpos + 0.001*xspeed; +per_frame_21=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_22=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_23=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_24=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_25=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_26=ypos = ypos + 0.001*yspeed; +per_frame_27=mv_x_speed = 16; +per_frame_28=mv_y_speed = 12; +per_frame_29=mv_x_range = 0.099; +per_frame_30=mv_y_range = 0.499; +per_frame_31=mv_x_amount = 1; +per_frame_32=mv_y_amount = 4; +per_frame_33=mv_x = mv_x_amount +mv_x_range + mv_x_range*sin(mv_x_speed*ypos+(sin(time*0.964)-0.5*cos(time*0.256))); +per_frame_34=mv_y = mv_y_amount + mv_y_range+ mv_y_range*sin(mv_y_speed*xpos-(cos(time*1.345)-0.5*cos(time*0.331))); +per_frame_35=mv_b = mv_b - 0.3*sin(time*3.511); +per_frame_36=mv_r = mv_r + 0.25*cos(time*0.433); +per_frame_37=mv_g = mv_g + 0.25*cos(time*0.568); +per_frame_38=mv_l = 24*sin(10*ypos)+ 32*cos(10*xpos); +per_pixel_1=rot=rot+rad*0.25*sin(0.3986*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Notions Of Tonality 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Notions Of Tonality 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Notions Of Tonality 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Notions Of Tonality 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,90 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.693000 +fDecay=0.970000 +fVideoEchoZoom=1.628259 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.200000 +fWaveScale=1.093260 +fWaveSmoothing=0.100000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.259127 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.004960 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.180378 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.380000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.010000 +ib_r=0.550000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.100000 +nMotionVectorsX=57.599998 +nMotionVectorsY=44.160000 +mv_dx=0.002000 +mv_dy=0.002000 +mv_l=5.000000 +mv_r=0.700000 +mv_g=0.400000 +mv_b=0.500000 +mv_a=0.100000 +per_frame_1=mv_r = wave_r + 0.35*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=mv_g = wave_g + 0.35*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=mv_b = wave_b + 0.35*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time)); +per_frame_4=q1 = (cx*2-1) + 0.62*( 0.60*sin(0.474*time) + 0.40*sin(0.394*time) ); +per_frame_5=q2 = (cy*2-1) + 0.62*( 0.60*sin(0.413*time) + 0.40*sin(0.323*time) ); +per_frame_6=q3 = (cx*2-1) + 0.62*( 0.60*sin(0.274*-time) + 0.40*sin(0.464*time) ); +per_frame_7=q4 = (cy*2-1) + 0.62*( 0.60*sin(0.334*time) + 0.40*sin(0.371*-time) ); +per_frame_8=decay = decay - 0.01*equal(frame%5,0); +per_frame_9=cy = cy + 0.1*sin(time*0.245); +per_frame_10=cx = cx + 0.1*cos(time*0341); +per_frame_11=wave_mystery = 2; +per_frame_12=//mv_l = 2*max(max(bass,bass_att)-1.2,0); +per_frame_13=warp = warp * pow(2, 0.6*sin(time*0.194)); +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.008/(dist+0.7); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - The Chaos Of Colours (sprouting dimentia mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - The Chaos Of Colours (sprouting dimentia mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - The Chaos Of Colours (sprouting dimentia mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - The Chaos Of Colours (sprouting dimentia mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,261 @@ +[preset00] +fRating=2 +fGammaAdj=1.7 +fDecay=0.94 +fVideoEchoZoom=1 +fVideoEchoAlpha=0 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001 +fWaveScale=0.01 +fWaveSmoothing=0.63 +fWaveParam=-1 +fModWaveAlphaStart=0.71 +fModWaveAlphaEnd=1.3 +fWarpAnimSpeed=1 +fWarpScale=1.331 +fZoomExponent=1 +fShader=0 +zoom=13.290894 +rot=-0.02 +cx=0.5 +cy=0.5 +dx=-0.28 +dy=-0.32 +warp=0.01 +sx=1 +sy=1 +wave_r=0.65 +wave_g=0.65 +wave_b=0.65 +wave_x=0.5 +wave_y=0.5 +ob_size=0 +ob_r=0.01 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0 +ib_r=0.95 +ib_g=0.85 +ib_b=0.65 +ib_a=1 +nMotionVectorsX=64 +nMotionVectorsY=0 +mv_dx=0 +mv_dy=0 +mv_l=0.9 +mv_r=1 +mv_g=1 +mv_b=1 +mv_a=0 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1 +wavecode_0_smoothing=0.5 +wavecode_0_r=1 +wavecode_0_g=1 +wavecode_0_b=1 +wavecode_0_a=1 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1 +wavecode_1_smoothing=0.5 +wavecode_1_r=1 +wavecode_1_g=1 +wavecode_1_b=1 +wavecode_1_a=1 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1 +wavecode_2_smoothing=0.5 +wavecode_2_r=1 +wavecode_2_g=1 +wavecode_2_b=1 +wavecode_2_a=1 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1 +wavecode_3_smoothing=0.5 +wavecode_3_r=1 +wavecode_3_g=1 +wavecode_3_b=1 +wavecode_3_a=1 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.5 +shapecode_0_y=0.5 +shapecode_0_rad=0.55 +shapecode_0_ang=0 +shapecode_0_tex_ang=0 +shapecode_0_tex_zoom=1 +shapecode_0_r=1 +shapecode_0_g=0 +shapecode_0_b=0 +shapecode_0_a=0.1 +shapecode_0_r2=0 +shapecode_0_g2=1 +shapecode_0_b2=0 +shapecode_0_a2=0.9 +shapecode_0_border_r=1 +shapecode_0_border_g=1 +shapecode_0_border_b=1 +shapecode_0_border_a=0.4 +shape_0_per_frame1=ang = time*0.4;; +shape_0_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_0_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_0_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_0_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_0_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_0_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_0_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_0_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shapecode_1_enabled=1 +shapecode_1_sides=32 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.5 +shapecode_1_y=0.5 +shapecode_1_rad=0.4 +shapecode_1_ang=0 +shapecode_1_tex_ang=0 +shapecode_1_tex_zoom=1 +shapecode_1_r=1 +shapecode_1_g=0 +shapecode_1_b=0 +shapecode_1_a=1 +shapecode_1_r2=0 +shapecode_1_g2=1 +shapecode_1_b2=0 +shapecode_1_a2=0.3 +shapecode_1_border_r=1 +shapecode_1_border_g=1 +shapecode_1_border_b=1 +shapecode_1_border_a=0.1 +shape_1_per_frame1=ang = time*1.7; +shape_1_per_frame2=x = 0.5 + 0.08*cos(time*1.1) + 0.03*cos(time*0.7); +shape_1_per_frame3=y = 0.5 + 0.08*sin(time*1.1) + 0.03*sin(time*0.7); +shape_1_per_frame4=r = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_1_per_frame5=g = 0.5 + 0.5*sin(q8*0.563 + 2); +shape_1_per_frame6=b = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_1_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.885 + 4); +shape_1_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.556+ 1); +shape_1_per_frame9=b2 = 0.5 + 0.5*sin(tq8*0.638 + 3); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.5 +shapecode_2_y=0.5 +shapecode_2_rad=0.4 +shapecode_2_ang=0 +shapecode_2_tex_ang=0 +shapecode_2_tex_zoom=1 +shapecode_2_r=1 +shapecode_2_g=0 +shapecode_2_b=0 +shapecode_2_a=1 +shapecode_2_r2=0 +shapecode_2_g2=1 +shapecode_2_b2=0 +shapecode_2_a2=0.5 +shapecode_2_border_r=1 +shapecode_2_border_g=1 +shapecode_2_border_b=1 +shapecode_2_border_a=0.1 +shape_2_per_frame1=ang = time*1.24; +shape_2_per_frame2=x = 0.5 - 0.08*cos(time*1.07) + 0.03*cos(time*0.7); +shape_2_per_frame3=y = 0.5 - 0.08*sin(time*1.33) + 0.03*sin(time*0.7); +shape_2_per_frame4=g = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_2_per_frame5=b = 0.5 + 0.5*sin(q8*0.563 + 2); +shape_2_per_frame6=r = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_2_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.885 + 4); +shape_2_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.556+ 1); +shape_2_per_frame9=b2 = 0.5 + 0.5*sin(q8*.638 + 3); +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.5 +shapecode_3_y=0.5 +shapecode_3_rad=0.1 +shapecode_3_ang=0 +shapecode_3_tex_ang=0 +shapecode_3_tex_zoom=1 +shapecode_3_r=1 +shapecode_3_g=0 +shapecode_3_b=0 +shapecode_3_a=1 +shapecode_3_r2=0 +shapecode_3_g2=1 +shapecode_3_b2=0 +shapecode_3_a2=0 +shapecode_3_border_r=1 +shapecode_3_border_g=1 +shapecode_3_border_b=1 +shapecode_3_border_a=0.1 +per_frame_1=ob_r = 0.5 + 0.4*sin(time*1.324); +per_frame_2=ob_g = 0.5 + 0.4*cos(time*1.371); +per_frame_3=ob_b = 0.5+0.4*sin(2.332*time); +per_frame_4=ib_r = 0.5 + 0.25*sin(time*1.424); +per_frame_5=ib_g = 0.25 + 0.25*cos(time*1.871); +per_frame_6=ib_b = 1-ob_b; +per_frame_7=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att); +per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_11=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_13=xpos = xpos + 0.001*xspeed; +per_frame_14=dx = xpos*0.05; +per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_18=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_19=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_20=ypos = ypos + 0.001*yspeed; +per_frame_21=dy = ypos*0.05; +per_frame_22=wave_a = 0; +per_frame_23=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_24=oldq8 = q8; +per_frame_25=q7 = 0.003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_26=rot = 0.4 + 1.5*sin(time*0.273) + 0.4*sin(time*0.379+3); +per_pixel_1=zoom =( log(sqrt(2)-rad) -0.24)*1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Tokamak (Naked Intrusion Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Tokamak (Naked Intrusion Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Tokamak (Naked Intrusion Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Rovastar - Tokamak (Naked Intrusion Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.993000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.010000 +fWaveSmoothing=0.700000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.197884 +sx=0.999667 +sy=0.999900 +wave_r=0.550000 +wave_g=0.550000 +wave_b=0.550000 +wave_x=0.500000 +wave_y=0.680000 +ob_size=0.010000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.700000 +ib_size=0.010000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_l=0.000000 +mv_r=0.800000 +mv_g=0.800000 +mv_b=0.800000 +mv_a=1.000000 +per_frame_1=mv_r = mv_r + 0.2*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=mv_g = mv_g + 0.2*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=mv_b = mv_b + 0.2*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=q1 = (cx*2-1) + 0.6*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=q2 = (cy*2-1) + 0.6*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=ob_r = 1- 0.4*abs(q1); +per_frame_7=ob_g = 0.3*abs(q2); +per_frame_8=ob_b = 0.4*abs(q1); +per_frame_9=wave_x = 1-abs(q2)-0.05; +per_frame_10=wave_y = 1-abs(q1)-0.06; +per_frame_11=wave_r = wave_r + 0.4*( 0.60*sin(0.514*time) + 0.40*sin(1.211*time) ); +per_frame_12=wave_b = wave_b + 0.4*( 0.60*sin(0.714*time) + 0.40*sin(q2) ); +per_frame_13=wave_g = wave_g + 0.4*( 0.60*sin(10*q1) + 0.40*sin(10*q2) ); +per_pixel_1=du = (x*2-1) - q1; +per_pixel_2=dv = (y*2-1) - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv) + time*0.15; +per_pixel_5=mult = 0.65*sin(dist*0.05); +per_pixel_6=dx = mult*sin(ang2*2-1.5); +per_pixel_7=dy = mult*cos(ang2*2-1.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Runoff.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Runoff.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Runoff.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Runoff.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,52 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.900000 +fWaveScale=1.605000 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.100*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%60,0); +per_pixel_1=warp=warp+pow(rad,1.3)*2.0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Scary.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Scary.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Scary.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Scary.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.004851 +fWaveScale=2.868000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=6.322000 +fWarpScale=3.138000 +fZoomExponent=2.600000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-0.005000 +warp=5.560000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.570000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.530000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(2.137*time) + 0.40*sin(1.770*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(1.944*time) + 0.40*sin(1.541*time) ); +per_frame_3=wave_b = wave_b + 0.250*( 0.60*sin(1.251*time) + 0.40*sin(1.655*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.410*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.410*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Script.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Script.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Script.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Script.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=3.000000 +fDecay=0.960000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=4 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.200000 +fWaveScale=3.541000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.110000 +fModWaveAlphaEnd=1.410000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=3.200000 +fShader=0.000000 +zoom=1.042000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.210000 +sx=1.000000 +sy=1.000000 +wave_r=0.550000 +wave_g=0.550000 +wave_b=0.550000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.737*time) + 0.40*sin(0.970*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.844*time) + 0.40*sin(0.941*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.851*time) + 0.40*sin(1.055*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dy = dy + 0.002*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Serpent.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Serpent.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Serpent.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Serpent.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.369668 +fWaveScale=1.300000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=3.600000 +fShader=0.000000 +zoom=1.004000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.309000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%200,0); +per_pixel_1=sx=sx+0.05*sin((y*2-1)*6+time*1.53+(x*2-1)*3.2); +per_pixel_2=sy=sy+0.05*cos((x*2-1)*8+time*1.71+(y*2-1)*4.3); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Shake.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Shake.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Shake.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Shake.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.500000 +fWaveScale=1.981000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=-0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=q1=max(0,bass-1)*0.04; +per_frame_5=dx=dx+q1*sin(time*71.2); +per_frame_6=dy=dy+q1*cos(time*97.2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Shift.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Shift.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Shift.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Shift.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.994000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.151736 +fWaveSmoothing=0.100000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.280549 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.012485 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_frame_8=decay=decay-0.01*(frame%2); +per_frame_9=dx = dx + dx_residual; +per_frame_10=dy = dy + dy_residual; +per_frame_11=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_12=dx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_13=dy_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_pixel_1=zoom=(zoom-1)*rad+1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sinews 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sinews 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sinews 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sinews 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,53 @@ +[preset00] +fGammaAdj=1.997000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.800000 +fWaveScale=1.170000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000415 +fShader=0.000000 +zoom=1.006000 +rot=-0.080000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.057228 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.742*time) + 0.40*sin(1.021*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.703*time) + 0.40*sin(0.969*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(1.090*time) + 0.40*sin(0.963*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_pixel_1=cx=0.5 + 0.3*cos(ang+time*0.97); +per_pixel_2=cy=0.5 + 0.3*sin(ang+time*0.78); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sinews 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sinews 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sinews 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sinews 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.997000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.800000 +fWaveScale=1.170000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000415 +fShader=0.000000 +zoom=0.986000 +rot=-0.040000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.002710 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.742*time) + 0.40*sin(1.021*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.703*time) + 0.40*sin(0.969*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(1.090*time) + 0.40*sin(0.963*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=ib_r = ib_r + 0.1*sin(time*0.5413); +per_frame_8=ib_g = ib_g + 0.1*sin(time*0.6459); +per_frame_9=ib_b = ib_b + 0.1*sin(time*0.4354); +per_frame_10=blah = 0.6/(ib_r+ib_g+ib_b); +per_frame_11=ib_r = ib_r*blah; ib_g = ib_g*blah; ib_b = ib_b*blah; +per_pixel_1=cx=0.5 + 0.4*cos(ang+time*0.397-rad); +per_pixel_2=cy=0.5 + 0.4*sin(ang+time*0.78+rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Smoke.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Smoke.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Smoke.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Smoke.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,52 @@ +[preset00] +fGammaAdj=1.994000 +fDecay=1.000000 +fVideoEchoZoom=1.728000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.783000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.611000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-0.015000 +warp=0.423967 +sx=0.985185 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.140000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.849*time) + 0.40*sin(1.090*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.711*time) + 0.40*sin(0.982*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.737*time) + 0.40*sin(1.012*time) ); +per_frame_4=cx = cx + 0.03*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=cy = cy + 0.03*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=dy = dy + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_7=decay=decay-0.02*pow(0.5+0.5*sin(time*1.5),3.8); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare (Blue).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare (Blue).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare (Blue).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare (Blue).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.000000 +fWaveScale=0.387000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=2.600000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-0.005000 +warp=0.123000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.570000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.470000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(2.137*time) + 0.40*sin(1.770*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(1.944*time) + 0.40*sin(1.541*time) ); +per_frame_3=wave_b = wave_b + 0.250*( 0.60*sin(1.251*time) + 0.40*sin(1.655*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.410*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.410*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_9=decay = decay - 0.03*equal(frame%2,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.500000 +fWaveScale=0.478000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-0.005000 +warp=0.123000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.570000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.470000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(2.137*time) + 0.40*sin(1.770*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(1.944*time) + 0.40*sin(1.541*time) ); +per_frame_3=wave_b = wave_b + 0.250*( 0.60*sin(1.251*time) + 0.40*sin(1.655*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.410*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.410*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_9=decay = decay - 0.03*equal(frame%2,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare (Reptile).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare (Reptile).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare (Reptile).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Solar Flare (Reptile).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=1.000000 +fVideoEchoZoom=1.061000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.450375 +fWaveScale=0.729000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=2.700000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-0.005000 +warp=0.112000 +sx=1.000000 +sy=1.000000 +wave_r=0.100000 +wave_g=1.000000 +wave_b=0.100000 +wave_x=0.500000 +wave_y=0.470000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(2.137*time) + 0.40*sin(1.770*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(1.944*time) + 0.40*sin(1.541*time) ); +per_frame_3=wave_b = wave_b + 0.250*( 0.60*sin(1.251*time) + 0.40*sin(1.655*time) ); +per_frame_4=zoom = zoom + 0.007*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.370*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.370*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_8=dx = dx + 0.008*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_9=dy = dy + 0.008*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_10=warp = warp + 0.100*( 0.60*sin(0.324*time) + 0.40*sin(0.347*time) ); +per_frame_11=decay = decay - 0.03*equal(frame%2,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sound And The Fury.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sound And The Fury.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sound And The Fury.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sound And The Fury.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,78 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.900000 +fWaveScale=0.769339 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.135000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.280000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_b = wave_b + min(1,max(0,(bass_att-1)*1.5)); +per_frame_2=wave_r = wave_b*0.4; +per_frame_3=wave_g = wave_b*0.4; +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.005*( 0.60*sin(0.471*time) + 0.40*sin(0.297*time) ); +per_frame_7=cy = cy + 0.005*( 0.60*sin(0.379*time) + 0.40*sin(0.351*time) ); +per_frame_8=dx = dx + 0.009*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_9= +per_frame_10=dx = dx + dx_residual; +per_frame_11=dy = dy + dy_residual; +per_frame_12=bass_thresh = above(bass_att,bass_thresh)*2.5 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.4)*0.98+1.4); +per_frame_13=dx_residual = equal(bass_thresh,2.5)*0.016*sin(time*7) + (1-equal(bass_thresh,2.5))*dx_residual; +per_frame_14=dy_residual = equal(bass_thresh,2.5)*0.012*sin(time*9) + (1-equal(bass_thresh,2.5))*dy_residual; +per_pixel_1=zoom = zoom + 0.1*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Spacedust.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Spacedust.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Spacedust.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Spacedust.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,63 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.600000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.900000 +fWaveScale=1.372000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.099000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.564000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.637*time) + 0.40*sin(0.570*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.744*time) + 0.40*sin(0.641*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.751*time) + 0.40*sin(0.555*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dy = dy + 0.002*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage Bright.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage Bright.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage Bright.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage Bright.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,49 @@ +[preset00] +fGammaAdj=1.900000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=1.100000 +fWaveScale=1.694000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.053000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.263000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.650*( 0.60*sin(1.437*time) + 0.40*sin(0.970*time) ); +per_frame_2=wave_g = wave_g + 0.650*( 0.60*sin(1.344*time) + 0.40*sin(0.841*time) ); +per_frame_3=wave_b = wave_b + 0.650*( 0.60*sin(1.251*time) + 0.40*sin(1.055*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.210*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.210*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_9=decay = decay - 0.01*equal(frame%6,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage (High-Warp).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage (High-Warp).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage (High-Warp).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage (High-Warp).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,49 @@ +[preset00] +fGammaAdj=1.900000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=1.200000 +fWaveScale=1.694000 +fWaveSmoothing=0.400000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.300000 +fShader=0.000000 +zoom=1.042000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.683000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.650*( 0.60*sin(1.437*time) + 0.40*sin(0.970*time) ); +per_frame_2=wave_g = wave_g + 0.650*( 0.60*sin(1.344*time) + 0.40*sin(0.841*time) ); +per_frame_3=wave_b = wave_b + 0.650*( 0.60*sin(1.251*time) + 0.40*sin(1.055*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.210*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.210*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_9=decay = decay - 0.01*equal(frame%6,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Space Voyage.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,53 @@ +[preset00] +fGammaAdj=1.642000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.100000 +fWaveScale=1.694000 +fWaveSmoothing=0.400000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.053000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.263000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.650*( 0.60*sin(1.437*time) + 0.40*sin(0.970*time) ); +per_frame_2=wave_g = wave_g + 0.650*( 0.60*sin(1.344*time) + 0.40*sin(0.841*time) ); +per_frame_3=wave_b = wave_b + 0.650*( 0.60*sin(1.251*time) + 0.40*sin(1.055*time) ); +per_frame_4=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.210*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.210*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Sperl - Feedback (projectM idle HDR mix).prjm kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Sperl - Feedback (projectM idle HDR mix).prjm --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Sperl - Feedback (projectM idle HDR mix).prjm 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss & Sperl - Feedback (projectM idle HDR mix).prjm 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,293 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1 +fDecay=0.9 +fVideoEchoZoom=0.710682 +fVideoEchoAlpha=0 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.311604 +fWaveScale=1.22891 +fWaveSmoothing=0 +fWaveParam=0.2 +fModWaveAlphaStart=0.71 +fModWaveAlphaEnd=1.3 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1 +fShader=0 +zoom=0.999902 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.207965 +sx=1 +sy=1 +wave_r=0.65 +wave_g=0.65 +wave_b=0.65 +wave_x=0.5 +wave_y=0.5 +ob_size=0.0065 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=0 +ib_size=0.26 +ib_r=0.25 +ib_g=0.25 +ib_b=0.25 +ib_a=0 +nMotionVectorsX=64 +nMotionVectorsY=48 +mv_dx=0 +mv_dy=0 +mv_l=0.85 +mv_r=0.4999 +mv_g=0.4999 +mv_b=0.4999 +mv_a=0 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.37 +shapecode_0_y=0.5 +shapecode_0_rad=4.999997 +shapecode_0_ang=3.644249 +shapecode_0_tex_ang=0 +shapecode_0_tex_zoom=1 +shapecode_0_r=0 +shapecode_0_g=0 +shapecode_0_b=0 +shapecode_0_a=0.5 +shapecode_0_r2=0 +shapecode_0_g2=0 +shapecode_0_b2=0 +shapecode_0_a2=0.3 +shapecode_0_border_r=1 +shapecode_0_border_g=1 +shapecode_0_border_b=1 +shapecode_0_border_a=1 +shape_0_init1=t1 = rand(100)*0.01; +shape_0_init2=t2 = rand(100)*0.01; +shape_0_per_frame1=ang = time*(0.3 + 0.1*t1); +shape_0_per_frame2=rad = rad * (0.9 + 0.2*t2); +shape_0_per_frame3=r = min(1,max(0,r + 0.2*sin(time*0.417 + 1))); +shape_0_per_frame4=g = min(1,max(0,g + 0.2*sin(time*0.391 + 2))); +shape_0_per_frame5=b = min(1,max(0,b + 0.2*sin(time*0.432 + 4))); +shape_0_per_frame6=r2 = min(1,max(0,r2 + 0.2*sin(time*0.657 + 3))); +shape_0_per_frame7=g2 = min(1,max(0,g2 + 0.2*sin(time*0.737 + 5))); +shape_0_per_frame8=b2 = min(1,max(0,b2 + 0.2*sin(time*0.884 + 6))); +shapecode_1_enabled=1 +shapecode_1_sides=5 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.37 +shapecode_1_y=0.5 +shapecode_1_rad=0.706533 +shapecode_1_ang=3.644249 +shapecode_1_tex_ang=0 +shapecode_1_tex_zoom=1 +shapecode_1_r=1 +shapecode_1_g=1 +shapecode_1_b=1 +shapecode_1_a=0.8 +shapecode_1_r2=1 +shapecode_1_g2=1 +shapecode_1_b2=1 +shapecode_1_a2=0 +shapecode_1_border_r=1 +shapecode_1_border_g=1 +shapecode_1_border_b=1 +shapecode_1_border_a=0 +shape_1_init1=t1 = rand(100)*0.01; +shape_1_init2=t2 = rand(100)*0.01; +shape_1_per_frame1=x = x + 0.05*sin(time*1.25+3); +shape_1_per_frame2=y = y + 0.03*sin(time*1.49+1); +shape_1_per_frame3=ang = time*(0.3 + 0.1*t1); +shape_1_per_frame4=rad = rad * (0.9 + 0.2*t2); +shape_1_per_frame5=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_1_per_frame6=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_1_per_frame7=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_1_per_frame8=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_1_per_frame9=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_1_per_frame10=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shapecode_2_enabled=1 +shapecode_2_sides=5 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.67 +shapecode_2_y=0.43 +shapecode_2_rad=0.706533 +shapecode_2_ang=4.209736 +shapecode_2_tex_ang=0 +shapecode_2_tex_zoom=1 +shapecode_2_r=1 +shapecode_2_g=1 +shapecode_2_b=1 +shapecode_2_a=0.8 +shapecode_2_r2=1 +shapecode_2_g2=1 +shapecode_2_b2=1 +shapecode_2_a2=0 +shapecode_2_border_r=1 +shapecode_2_border_g=1 +shapecode_2_border_b=1 +shapecode_2_border_a=0 +shape_2_init1=t1 = rand(100)*0.01; +shape_2_init2=t2 = rand(100)*0.01; +shape_2_per_frame1=x = x + 0.05*sin(time*2.17); +shape_2_per_frame2=y = y + 0.03*sin(time*1.83); +shape_2_per_frame3=ang = time*(0.3 + 0.1*t1); +shape_2_per_frame4=rad = rad * (0.9 + 0.2*t2); +shape_2_per_frame5=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_2_per_frame6=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_2_per_frame7=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_2_per_frame8=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_2_per_frame9=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_2_per_frame10=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shapecode_5_enabled=1 +shapecode_5_sides=16 +shapecode_5_additive=1 +shapecode_5_thickOutline=1 +shapecode_5_textured=0 +shapecode_5_x=0.68 +shapecode_5_y=0.5 +shapecode_5_rad=0.509999 +shapecode_5_ang=0 +shapecode_5_tex_ang=0 +shapecode_5_tex_zoom=1 +shapecode_5_r=1 +shapecode_5_g=0 +shapecode_5_b=0 +shapecode_5_a=0.46 +shapecode_5_r2=0 +shapecode_5_g2=1 +shapecode_5_b2=0 +shapecode_5_a2=0 +shapecode_5_border_r=0 +shapecode_5_border_g=1 +shapecode_5_border_b=1 +shapecode_5_border_a=0 +shape_5_per_frame1=ang = time*1.4; +shape_5_per_frame2=x = x + q1; +shape_5_per_frame3=y = y + q2; +shape_5_per_frame4=r = 0.5 + 0.5*sin(time*0.713 + 1); +shape_5_per_frame5=g = 0.5 + 0.5*sin(time*0.563 + 2); +shape_5_per_frame6=b = 0.5 + 0.5*sin(time*0.654 + 5); +shape_5_per_frame7=r2 = 0.5 + 0.5*sin(time*0.885 + 4); +shape_5_per_frame8=g2 = 0.5 + 0.5*sin(time*0.556+ 1); +shape_5_per_frame9=b2 = 0.5 + 0.5*sin(time*0.638 + 3); +shapecode_3_enabled=1 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_ImageURL=M.tga +shapecode_3_x=0.68 +shapecode_3_y=0.5 +shapecode_3_rad=0.41222 +shapecode_3_ang=0 +shapecode_3_tex_ang=0 +shapecode_3_tex_zoom=0.71 +shapecode_3_r=1 +shapecode_3_g=1 +shapecode_3_b=1 +shapecode_3_a=1 +shapecode_3_r2=1 +shapecode_3_g2=1 +shapecode_3_b2=1 +shapecode_3_a2=1 +shapecode_3_border_r=0 +shapecode_3_border_g=0 +shapecode_3_border_b=0 +shapecode_3_border_a=0 +shape_3_per_frame1=x = x + q1; +shape_3_per_frame2=y = y + q2; +shape_3_per_frame3=b2 = (sin(time)+1)*0.5; +shape_3_per_frame4=b = (sin(time)+1)*0.5; +shape_3_per_frame5=g2 = (cos(time*0.75+1)+1)*0.5; +shape_3_per_frame6=g = (cos(time*0.75+1)+1)*0.5; +shape_3_per_frame7=r2 = (sin(time*1.25+2)+1)*0.5; +shape_3_per_frame8=r = (sin(time*1.25+2)+1)*0.5; +shape_3_per_frame9=a = q3; +shape_3_per_frame10=a2 = q3; +shapecode_4_enabled=1 +shapecode_4_sides=4 +shapecode_4_additive=0 +shapecode_4_thickOutline=0 +shapecode_4_textured=1 +shapecode_4_ImageURL=headphones.tga +shapecode_4_x=0.68 +shapecode_4_y=0.58 +shapecode_4_rad=0.6 +shapecode_4_ang=0 +shapecode_4_tex_ang=0 +shapecode_4_tex_zoom=0.71 +shapecode_4_r=1 +shapecode_4_g=1 +shapecode_4_b=1 +shapecode_4_a=1 +shapecode_4_r2=1 +shapecode_4_g2=1 +shapecode_4_b2=1 +shapecode_4_a2=1 +shapecode_4_border_r=0 +shapecode_4_border_g=0 +shapecode_4_border_b=0 +shapecode_4_border_a=0 +shape_4_per_frame1=x = x + q1; +shape_4_per_frame2=y = y + q2; +shape_4_per_frame3=rad = rad + bass * 0.1; +shape_4_per_frame4=a = q3; +shape_4_per_frame5=a2 = q3; +shapecode_6_enabled=1 +shapecode_6_sides=4 +shapecode_6_additive=0 +shapecode_6_thickOutline=0 +shapecode_6_textured=1 +shapecode_6_ImageURL=project.tga +shapecode_6_x=0.38 +shapecode_6_y=0.435 +shapecode_6_rad=0.8 +shapecode_6_ang=0 +shapecode_6_tex_ang=0 +shapecode_6_tex_zoom=0.71 +shapecode_6_r=1 +shapecode_6_g=1 +shapecode_6_b=1 +shapecode_6_a=1 +shapecode_6_r2=1 +shapecode_6_g2=1 +shapecode_6_b2=1 +shapecode_6_a2=1 +shapecode_6_border_r=0 +shapecode_6_border_g=0 +shapecode_6_border_b=0 +shapecode_6_border_a=0 +shape_6_per_frame1=x = x + q1; +shape_6_per_frame2=y = y + q2; +shape_6_per_frame3=a = q3; +shape_6_per_frame4=a2 = q3; +per_frame_1=wave_mystery = time%5*0.2; +per_frame_2=q1 = 0.15*sin(time*1.14); +per_frame_3=q2 = 0.1*sin(time*0.93+2); +per_frame_4=q3 = if(above(frame,60),1, frame/60.0); \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Starfish 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Starfish 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Starfish 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Starfish 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,52 @@ +[preset00] +fGammaAdj=1.850000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.605000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*below(frame%5,1); +per_pixel_1=zoom=zoom+0.04*sin(ang*5+time*2.6); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Starfish 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Starfish 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Starfish 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Starfish 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,47 @@ +[preset00] +fGammaAdj=1.500000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.990000 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=1.700000 +fWaveScale=2.202000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*below(frame%2,1); +per_pixel_1=zoom=zoom+0.04*sin(ang*5+time*2.6); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sunsets.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sunsets.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sunsets.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Sunsets.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,64 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.990000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.700000 +fWaveScale=0.453000 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=25.548000 +fZoomExponent=0.400000 +fShader=0.000000 +zoom=1.099000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.417000 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.550000 +wave_b=0.200000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_8=decay = decay - 0.01*equal(frame%20,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Supernova 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Supernova 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Supernova 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Supernova 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,75 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.994000 +fDecay=0.990000 +fVideoEchoZoom=1.089924 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.200000 +fWaveScale=0.810235 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.371990 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.041800 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.238010 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.150*( 0.60*sin(1.037*time) + 0.40*sin(0.370*time) ); +per_frame_2=wave_g = wave_g + 0.150*( 0.60*sin(0.944*time) + 0.40*sin(0.441*time) ); +per_frame_3=wave_b = wave_b + 0.150*( 0.60*sin(0.851*time) + 0.40*sin(0.55*time) ); +per_frame_4=rot = rot + 0.007*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.210*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.210*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.005*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.005*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_9=my_rad = sqrt(my_x*my_x + my_y*my_y); +per_frame_10=my_mod = 16 - 14*below(my_rad,0.2); +per_frame_11=decay = decay - 0.01*equal(frame%my_mod,0); +per_frame_12=my_x = 0.2*sin(time*0.392) + 0.2*sin(time*0.551+2); +per_frame_13=my_y = 0.2*sin(time*0.322+1) + 0.2*sin(time*0.611+3); +per_frame_14=dx = dx + 0.03*my_x; +per_frame_15=dy = dy + 0.03*my_y; +per_frame_16=wave_x = wave_x - 0.89*my_x; +per_frame_17=wave_y = wave_y + 0.89*my_y; +per_frame_18= +per_frame_19= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Supernova 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Supernova 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Supernova 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Supernova 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.994000 +fDecay=0.990000 +fVideoEchoZoom=1.089924 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.200000 +fWaveScale=0.810235 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.264809 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.051800 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-0.000000 +warp=0.238010 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.150*( 0.60*sin(1.037*time) + 0.40*sin(0.370*time) ); +per_frame_2=wave_g = wave_g + 0.150*( 0.60*sin(0.944*time) + 0.40*sin(0.441*time) ); +per_frame_3=wave_b = wave_b + 0.150*( 0.60*sin(0.851*time) + 0.40*sin(0.55*time) ); +per_frame_4=rot = rot + 0.005*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cx = cx + 0.210*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.210*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=dx = dx + 0.005*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.005*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_9=decay = decay + 0.01*equal(frame%8,0); +per_frame_10=my_x = 0.2*sin(time*0.392) + 0.2*sin(time*0.551+2); +per_frame_11=my_y = 0.2*sin(time*0.322+1) + 0.2*sin(time*0.611+3); +per_frame_12=dx = dx + 0.03*my_x; +per_frame_13=dy = dy + 0.03*my_y; +per_frame_14=wave_x = wave_x - 0.89*my_x; +per_frame_15=wave_y = wave_y + 0.89*my_y; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Surface.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Surface.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Surface.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Surface.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.700000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=4 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.706706 +fWaveScale=0.234487 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.014000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.029439 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=dx = dx + 0.01*( 0.60*sin(0.173*time) + 0.40*sin(0.223*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirl 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirl 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirl 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirl 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.300000 +fWaveScale=1.170000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=1.025000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.309000 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.500000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.01*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%6,0); +per_frame_7=dx = dx + dx_residual; +per_frame_8=dy = dy + dy_residual; +per_frame_9=bass_thresh = above(bass_att,bass_thresh)*2.5 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.4)*0.98+1.4); +per_frame_10=dx_residual = equal(bass_thresh,2.5)*0.006*sin(time*7) + (1-equal(bass_thresh,2.5))*dx_residual; +per_frame_11=dy_residual = equal(bass_thresh,2.5)*0.0045*sin(time*9) + (1-equal(bass_thresh,2.5))*dy_residual; +per_pixel_1=rot=rot+0.04*sin(time*-2.7+rad*13)*(1.3-rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirl 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirl 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirl 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirl 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,52 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.300000 +fWaveScale=1.170000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=1.025000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=2.286678 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.500000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.01*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%6,0); +per_pixel_1=rot=rot+0.04*sin(time*-2.7+rad*13)*(1.3-rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,75 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.994000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.499998 +fWaveScale=1.524161 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.334695 +fWarpScale=3.928016 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=0.961000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.771011 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.030000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.010000 +ib_r=0.340000 +ib_g=0.340000 +ib_b=0.340000 +ib_a=0.500000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.2900*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.2900*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=rot = rot + 0.35*( 0.60*sin(0.21*time) + 0.30*sin(0.339*time) ); +per_frame_7=cx = cx + 0.30*( 0.60*sin(0.374*time) + 0.14*sin(0.194*time) ); +per_frame_8=cy = cy + 0.37*( 0.60*sin(0.274*time) + 0.10*sin(0.394*time) ); +per_frame_9=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_10=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_11=ib_b = ib_b + 0.2*sin(time*0.7354); +per_frame_12= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.994000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.499998 +fWaveScale=1.524161 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.334695 +fWarpScale=3.928016 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=0.961000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.771011 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.030000 +ib_r=0.340000 +ib_g=0.340000 +ib_b=0.340000 +ib_a=0.100000 +per_frame_1=wave_x = wave_x + 0.2900*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.2900*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=rot = rot + 0.35*( 0.60*sin(0.21*time) + 0.30*sin(0.339*time) ); +per_frame_7=cx = cx + 0.30*( 0.60*sin(0.374*time) + 0.14*sin(0.194*time) ); +per_frame_8=cy = cy + 0.37*( 0.60*sin(0.274*time) + 0.10*sin(0.394*time) ); +per_frame_9=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_10=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_11=ib_b = ib_b + 0.2*sin(time*0.7354); +per_frame_12= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 3.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.994000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.499998 +fWaveScale=1.524161 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.334695 +fWarpScale=3.928016 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=0.961000 +rot=0.220000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.771011 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.028500 +ib_r=0.340000 +ib_g=0.340000 +ib_b=0.340000 +ib_a=0.100000 +per_frame_1=wave_x = wave_x + 0.2900*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.2900*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=blah = 0.5/(wave_r+wave_g+wave_b); +per_frame_7=wave_r = wave_r*blah; wave_g = wave_g*blah; wave_b = wave_b*blah; +per_frame_8=rot = rot + 0.12*( 0.60*sin(0.21*time) + 0.40*sin(0.339*time) ); +per_frame_9=cx = cx + 0.30*( 0.60*sin(0.374*time) + 0.14*sin(0.194*time) ); +per_frame_10=cy = cy + 0.37*( 0.60*sin(0.274*time) + 0.10*sin(0.394*time) ); +per_frame_11=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_12=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_13=ib_b = ib_b + 0.2*sin(time*0.7354); +per_frame_14=blah = 0.4/(ib_r+ib_g+ib_b)*3; +per_frame_15=ib_r = ib_r*blah; ib_g = ib_g*blah; ib_b = ib_b*blah; +per_frame_16= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 4.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 4.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 4.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 4.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=1.000000 +fGammaAdj=1.994000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.499998 +fWaveScale=1.524161 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.334695 +fWarpScale=3.928016 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=0.961000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.771011 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.028500 +ib_r=0.340000 +ib_g=0.340000 +ib_b=0.340000 +ib_a=0.100000 +per_frame_1=wave_x = wave_x + 0.2900*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.2900*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=blah = 0.5/(wave_r+wave_g+wave_b); +per_frame_7=wave_r = wave_r*blah; wave_g = wave_g*blah; wave_b = wave_b*blah; +per_frame_8=rot = rot + 0.35*( 0.60*sin(0.21*time) + 0.30*sin(0.339*time) ); +per_frame_9=cx = cx + 0.30*( 0.60*sin(0.374*time) + 0.14*sin(0.194*time) ); +per_frame_10=cy = cy + 0.37*( 0.60*sin(0.274*time) + 0.10*sin(0.394*time) ); +per_frame_11=dx = dx + 0.01*( 0.60*sin(0.324*time) + 0.40*sin(0.234*time) ); +per_frame_12=dy = dy + 0.01*( 0.60*sin(0.244*time) + 0.40*sin(0.264*time) ); +per_frame_13=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_14=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_15=ib_b = ib_b + 0.2*sin(time*0.7354); +per_frame_16=blah = 12.4/(ib_r+ib_g+ib_b)*3; +per_frame_17=ib_r = ib_r*blah; ib_g = ib_g*blah; ib_b = ib_b*blah; +per_frame_18= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 5.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 5.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 5.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Swirlie 5.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.994000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.000000 +fWaveScale=1.693514 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.451118 +fWarpScale=3.928016 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=0.961000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=7.397955 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.950000 +ob_size=0.030000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.010000 +ib_r=0.340000 +ib_g=0.340000 +ib_b=0.340000 +ib_a=0.500000 +per_frame_1=wave_x = wave_x + 0.0200*( 0.60*sin(0.821*time) + 0.40*sin(0.621*time) ); +per_frame_2=wave_y = wave_y + 0.0200*( 0.60*sin(0.942*time) + 0.40*sin(0.722*time) ); +per_frame_3=wave_r = wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=rot = rot + 0.35*( 0.60*sin(0.21*time) + 0.30*sin(0.339*time) ); +per_frame_7=cx = cx + 0.30*( 0.60*sin(0.374*time) + 0.14*sin(0.194*time) ); +per_frame_8=cy = cy + 0.37*( 0.60*sin(0.274*time) + 0.10*sin(0.394*time) ); +per_frame_9=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_10=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_11=ib_b = ib_b + 0.2*sin(time*0.7354); +per_frame_12= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Symmetry.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Symmetry.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Symmetry.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Symmetry.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,53 @@ +[preset00] +fGammaAdj=1.990000 +fDecay=0.980000 +fVideoEchoZoom=1.010000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.700000 +fWaveScale=0.948000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.948717 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.651000 +sx=1.000000 +sy=1.000000 +wave_r=0.350000 +wave_g=0.300000 +wave_b=0.250000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.050*( 0.60*sin(0.994*time) + 0.40*sin(0.941*time) ); +per_frame_2=wave_g = wave_g + 0.050*( 0.60*sin(0.990*time) + 0.40*sin(1.002*time) ); +per_frame_3=wave_b = wave_b + 0.050*( 0.60*sin(0.775*time) + 0.40*sin(1.071*time) ); +per_frame_4=zoom = zoom + 0.015*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - The Fatty Lumpkin Sunkle Tweaker.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - The Fatty Lumpkin Sunkle Tweaker.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - The Fatty Lumpkin Sunkle Tweaker.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - The Fatty Lumpkin Sunkle Tweaker.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=5.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=10.140000 +fWaveScale=1.235000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=2.301000 +fShader=0.000000 +zoom=1.099000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.290000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.250*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.250*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.500*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=zoom = zoom + 0.010*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_7=rot = rot + 0.035*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_8=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.194*time) ); +per_frame_9=cy = cy + 0.037*( 0.60*sin(0.274*time) + 0.40*sin(0.394*time) ); +per_frame_10=q = time; +per_frame_11=dx = dx + 0.019*( 0.60*sin(100.334*q)+ 0.40*sin(250.277*q)); +per_frame_12=dy = dy + 0.019*( 0.60*sin(200.384*q) + 0.40*sin(150.247*q)); +per_frame_13=sx = sx + 0.010*( 0.60*sin(0.313*time) + 0.40*sin(0.383*time) ); +per_pixel_1=rot=rot+rad*0.18*sin(0.6*time*0.439+0.4*time*0.338); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Three And A Half Kinds Of Amphetamines.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Three And A Half Kinds Of Amphetamines.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Three And A Half Kinds Of Amphetamines.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Three And A Half Kinds Of Amphetamines.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,55 @@ +[preset00] +fGammaAdj=1.980000 +fDecay=0.960000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.620000 +fWaveScale=0.691358 +fWaveSmoothing=0.400000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.888000 +fShader=1.000000 +zoom=1.085000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.742*time) + 0.40*sin(1.021*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.703*time) + 0.40*sin(0.969*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(1.090*time) + 0.40*sin(0.963*time) ); +per_frame_4=zoom = zoom + 0.033*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=zoom = zoom + 0.5*max(0,bass_att-1.05); +per_frame_6=zoom = zoom + rad*0.1; +per_frame_7=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_8=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_9=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_pixel_1=zoom=zoom+0.13*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Three Kinds Of Amphetamines.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Three Kinds Of Amphetamines.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Three Kinds Of Amphetamines.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Three Kinds Of Amphetamines.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.420000 +fWaveScale=0.691358 +fWaveSmoothing=0.400000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.888000 +fShader=1.000000 +zoom=1.045000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.742*time) + 0.40*sin(1.021*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.703*time) + 0.40*sin(0.969*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(1.090*time) + 0.40*sin(0.963*time) ); +per_frame_4=zoom = zoom + 0.033*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=zoom = zoom + rad*0.2; +per_frame_6=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_7=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_8=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_9=dx = dx + dx_residual; +per_frame_10=dy = dy + dy_residual; +per_frame_11=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_12=dx_residual = equal(bass_thresh,2)*0.008*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_13=dy_residual = equal(bass_thresh,2)*0.006*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_pixel_1=zoom=zoom+0.13*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tokamak.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tokamak.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tokamak.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tokamak.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.993000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.200000 +fWaveScale=4.225629 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.197884 +sx=0.999667 +sy=0.999900 +wave_r=0.750000 +wave_g=0.750000 +wave_b=0.750000 +wave_x=0.500000 +wave_y=0.680000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.2*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.2*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.2*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=q1 = (cx*2-1) + 0.6*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=q2 = (cy*2-1) + 0.6*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_pixel_1=du = (x*2-1) - q1; +per_pixel_2=dv = (y*2-1) - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv) + time*0.15; +per_pixel_5=mult = 0.65*sin(dist*0.05); +per_pixel_6=dx = mult*sin(ang2*2-1.5); +per_pixel_7=dy = mult*cos(ang2*2-1.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tornado.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tornado.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tornado.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tornado.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,49 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=1.000000 +fWaveScale=3.020000 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.309000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%6,0); +per_pixel_1=rot = rot + (rad-0.4)*1.7*max(0,min((bass_att-1.1)*1.5,5)); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Toy.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Toy.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Toy.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Toy.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=11.940000 +fWaveScale=0.387000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=4.401000 +fShader=0.000000 +zoom=1.031000 +rot=0.003000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.190000 +wave_g=0.190000 +wave_b=0.190000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_x = wave_x + 0.350*( 0.70*sin(2.221*time) + 0.30*sin(1.821*time) ); +per_frame_2=wave_y = wave_y + 0.350*( 0.30*sin(1.942*time) + 0.70*sin(2.522*time) ); +per_frame_3=wave_r = wave_r + 0.890*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.890*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.890*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=rot = rot + 0.010*( 0.60*sin(0.038*time) + 0.40*sin(0.054*time) ); +per_frame_7=dx = dx + 0.002*( 0.60*sin(0.434*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.002*( 0.60*sin(0.384*time) + 0.40*sin(0.477*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Trampoline.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Trampoline.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Trampoline.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Trampoline.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.700000 +fWaveScale=1.605447 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=3.600000 +fShader=0.000000 +zoom=1.025000 +rot=-0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.309000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.500000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.200*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.200*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.200*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_pixel_1=zoom=zoom+0.03*sin((x*2-1)*4+time*1.63)+0.03*sin((y*2-1)*3+time*1.37)-0.1*sin(rad*0.1+time*1.6); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tube.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tube.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tube.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Tube.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,46 @@ +[preset00] +fGammaAdj=2.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=0.200000 +fWaveScale=1.694000 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=2.600000 +fShader=0.000000 +zoom=1.020000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.135000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_4=rot = rot + 0.025*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=cy = cy + 0.007*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%6,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Two-Pointed Pulsagon.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Two-Pointed Pulsagon.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Two-Pointed Pulsagon.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Two-Pointed Pulsagon.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,47 @@ +[preset00] +fGammaAdj=2.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=0.800000 +fWaveScale=1.605000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.014000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.600000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%6,0); +per_pixel_1=zoom=zoom+0.06-0.06*sin(ang*2+time*3); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Ultrafast.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Ultrafast.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Ultrafast.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Ultrafast.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,65 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=1.421369 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.456111 +fWaveScale=1.694000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.153000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.098615 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.800000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.650*( 0.60*sin(1.437*time) + 0.40*sin(0.970*time) ); +per_frame_2=wave_g = wave_g + 0.650*( 0.60*sin(1.344*time) + 0.40*sin(0.841*time) ); +per_frame_3=wave_b = wave_b + 0.650*( 0.60*sin(1.251*time) + 0.40*sin(1.055*time) ); +per_frame_4=rot = rot + 0.07*( 0.60*sin(0.381*time) + 0.09*sin(-0.579*time) ); +per_frame_5=cx = cx + 0.10*( 0.60*sin(0.374*time) + 0.10*sin(0.294*time) ); +per_frame_6=cy = cy + 0.10*( 0.60*sin(0.393*time) + 0.10*sin(0.223*time) ); +per_frame_7=dx = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_8=dy = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_9=decay = decay - 0.01*equal(frame%6,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Volume Zoom.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Volume Zoom.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Volume Zoom.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Volume Zoom.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,63 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.990000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.600000 +fWaveScale=1.605000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=zoom = zoom + max(0,(bass_att+treb_att+mid_att-3)*0.0333); +per_frame_7=decay = decay - 0.01*equal(frame%10,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Vortex 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Vortex 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Vortex 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Vortex 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.061817 +fWaveScale=0.948000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=3.600000 +fShader=0.000000 +zoom=1.025000 +rot=-0.240000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.420000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay=decay - 0.01*equal(frame%16,0); +per_pixel_1=rot=rot+0.1/(rad+0.1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Vortex 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Vortex 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Vortex 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Vortex 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,65 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.600000 +fWaveScale=0.948000 +fWaveSmoothing=0.500000 +fWaveParam=0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=3.600000 +fShader=0.000000 +zoom=1.025000 +rot=-0.180000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.420000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay=decay - 0.01*equal(frame%16,0); +per_frame_7=wave_mystery = 0.5 + 0.4*sin(time*0.207); +per_frame_8=wave_x = 0.5 + 0.3*sin(time*0.177); +per_pixel_1=rot=rot+0.1/(rad+0.1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,49 @@ +[preset00] +fGammaAdj=2.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=2.700000 +fWaveScale=1.053000 +fWaveSmoothing=0.800000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=3.600000 +fShader=0.000000 +zoom=1.046000 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.969000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.010*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.050*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.030*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_pixel_1=sx=sx-0.04*sin((y*2-1)*6+(x*2-1)*7+time*1.59); +per_pixel_2=sy=sy-0.04*sin((x*2-1)*8-(y*2-1)*5+time*1.43); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,50 @@ +[preset00] +fGammaAdj=2.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=2.700000 +fWaveScale=1.053000 +fWaveSmoothing=0.800000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.007318 +fShader=0.000000 +zoom=1.046000 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.969000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.010*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.050*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.030*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_pixel_1=sx=sx-0.04*sin((y*2-1)*6+(x*2-1)*7+time*1.59); +per_pixel_2=sy=sy-0.04*sin((x*2-1)*8-(y*2-1)*5+time*1.43); +per_pixel_3=zoom=zoom+rad*0.02; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali Bright.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali Bright.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali Bright.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Warp Of Dali Bright.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,55 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.700000 +fWaveScale=1.053000 +fWaveSmoothing=0.800000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=3.600000 +fShader=0.000000 +zoom=1.046000 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.969000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.470000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.010*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.050*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=cx = cx + 0.030*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_7=cy = cy + 0.030*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_8=decay=decay-0.02*pow(0.5+0.5*sin(time*0.9),3.2); +per_pixel_1=sx=sx-0.04*sin((y*2-1)*6+(x*2-1)*7+time*1.59); +per_pixel_2=sy=sy-0.04*sin((x*2-1)*8-(y*2-1)*5+time*1.43); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Waterfall.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Waterfall.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Waterfall.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Geiss - Waterfall.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.390620 +fWaveScale=2.201000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.000000 +cy=0.000000 +dx=0.000000 +dy=0.005000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.150000 +wave_g=0.150000 +wave_b=0.750000 +wave_x=0.950000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.100*( 0.60*sin(0.533*time) + 0.40*sin(0.945*time) ); +per_frame_2=wave_g = wave_g + 0.100*( 0.60*sin(0.600*time) + 0.40*sin(0.856*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.510*time) + 0.40*sin(0.920*time) ); +per_pixel_1=sy=1.1-0.065*(1-cos((x*2-1)*1.57)); Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/headphones.tga and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/headphones.tga differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot24-7 - Ascending to heaven 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot24-7 - Ascending to heaven 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot24-7 - Ascending to heaven 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot24-7 - Ascending to heaven 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,64 @@ +[preset00] +fRating=4.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=33.469135 +fWaveScale=0.931008 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.000000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=5.725291 +fZoomExponent=4.778017 +fShader=0.000000 +zoom=1.093507 +rot=-0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.066200 +sx=0.905286 +sy=1.010000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.470000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=19.199995 +nMotionVectorsY=14.400000 +mv_l=3.000000 +mv_r=0.600000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.100000 +per_frame_1=wave_r = wave_r + 1*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_b = wave_b + 1*( 1.60*sin(1.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_g = wave_g +1*(1.50*sin(1.900*time)+.40*sin(1*time) ); +per_frame_4=rot=.140*sin(time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot24-7 - Meeting place.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot24-7 - Meeting place.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot24-7 - Meeting place.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot24-7 - Meeting place.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,66 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.900000 +fDecay=0.970000 +fVideoEchoZoom=0.880200 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.254862 +fWaveScale=1.691355 +fWaveSmoothing=0.600000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=0.010000 +fShader=0.000000 +zoom=0.906940 +rot=-0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=0.535239 +sy=1.000000 +wave_r=0.600000 +wave_g=1.000000 +wave_b=0.100000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=1.000000 +ob_g=0.499900 +ob_b=0.399900 +ob_a=0.089900 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.200000 +ib_a=0.100000 +nMotionVectorsX=6.400000 +nMotionVectorsY=48.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_g=1*sin(time); +per_frame_2=wave_r=.5*tan(bass_att); +per_frame_3=wave_b=.3*cos(treb); +per_frame_4= +per_pixel_1= +per_pixel_2=zoom=zoom-time+time+.10 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - 9-7-02 (Remix) (sustain fixed).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - 9-7-02 (Remix) (sustain fixed).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - 9-7-02 (Remix) (sustain fixed).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - 9-7-02 (Remix) (sustain fixed).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,256 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000100 +fShader=0.000000 +zoom=1.000235 +rot=0.000000 +cx=0.530000 +cy=0.470000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999900 +sy=0.999904 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=1.000000 +ob_size=0.049900 +ob_r=1.000000 +ob_g=1.000000 +ob_b=1.000000 +ob_a=0.100000 +ib_size=0.055000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=1.280000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=vol_att=bass_att+treb_Att+mid_att; +per_frame_2=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_3=treb_thresh=above(treb_att,treb_thresh)*2+ +per_frame_4=(1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_5=mid_thresh=above(mid_att,mid_thresh)*2+ +per_frame_6=(1-above(mid_mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_7=vol_thresh=bass_thresh+treb_thresh+mid_thresh; +per_frame_8=new_bass_thresh=bass_thresh+bass_effect-.2*sin(bass_thresh-new_bass_thresh+1); +per_frame_9=new_treb_thresh=treb_thresh+treb_Effect-.2*sin(treb_thresh-new_treb_thresh+1); +per_frame_10=new_mid_thresh=mid_thresh+mid_effect-.2*sin(mid_thresh-new_mid_thresh+1); +per_frame_11=treb_effect=max(max(treb,treb_Att),treb_thresh); +per_frame_12=bass_effect=max(max(Bass,bass_Att),bass_thresh); +per_frame_13=mid_effect=max(max(mid,mid_att),mid_thresh); +per_frame_14=vol_effect=bass_effect+treb_effect+mid_effect; +per_frame_15=react=if(equal(new_vol,change),1,0); +per_frame_16=new_bass=if(above(react,bass_effect),bass_thresh,new_bass_thresh); +per_frame_17=new_treb=if(above(react,treb_effect),treb_thresh,new_treb_thresh); +per_frame_18=new_mid=if(above(react,mid_effect),mid_thresh,new_mid_thresh); +per_frame_19=new_vol=new_bass+new_treb+new_mid+.04; +per_frame_20=change=bnot(1); +per_frame_21=q1=new_bass; +per_frame_22=q2=new_treb; +per_frame_23=q3=new_mid; +per_frame_24=q4=new_vol; +per_frame_25=q5=if(above(q2,q3),above(q1,q3),-above(q1,q3)); +per_frame_26=q6=if(above(q1,q3),above(q2,q4),-above(q2,q3)); +per_frame_27=q7=if(above(q5,q6),q5,-q6);; +per_frame_28=q8=if(above(q6,q7),q6,-q7);; +per_frame_29= +per_frame_30=r=.2*sin(time); +per_frame_31=b=0+.3*sin(q1-time); +per_frame_32=g=0+.6*sin(time*.64-.2); +per_frame_33=wave_b=g; +per_frame_34=wave_r=r; +per_frame_35=wave_g=b; +per_frame_36=ob_r=r+.3*sin(time*.31); +per_frame_37=ob_b=b+.3-.1*sin(time*.12); +per_frame_38=ob_g=g-.3-.5*sin(time+.1);; +per_pixel_1=rot=if(above(zoom,box),if(equal(myzoom,1),rot+.2*sin(q1-q2*rad*.25),0) +per_pixel_2=*if(above(rad,x),rad-x*.25,pow(rad,1000)),0-.02*rad*x*-.2*sin(q1)); +per_pixel_3=be2=rad&rad-.4-.5*sin(q6); +per_pixel_4=box=sin(if(above(q1,q3),rad&rad+.2-x-y*.25*sin(Q3),be2)); +per_pixel_5=myzoomexp=cos(sin(if(Above(q1,q2),pow(box,2)*rad*5,box)));; +per_pixel_6=myzoom=if(Above(q1,q2),if(above(Q2,q3),1-y+.3*sin(q1)+.3,zoom-.2),1)+.1; +per_pixel_7=a=if(above(q3,q2),pow(myzoom-x,pow(myzoomexp,rad*2-.22-box-x+.2*sin(q1-q3)))+.2*.25,1); +per_pixel_8=dx=(x-.5)*a+.5-x+box; +per_pixel_9=dy=(y-.5)*a+.5-y+box; +per_pixel_10=cx=cx+.2*sin(Above(rad,x)); +per_pixel_11=cy=cy+.2*sin(above(rad,y)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Che - Various Abstract Effects.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Che - Various Abstract Effects.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Che - Various Abstract Effects.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Che - Various Abstract Effects.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,134 @@ +[preset00] +fRating=1.000000 +fGammaAdj=1.000000 +fDecay=0.970000 +fVideoEchoZoom=1.000499 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000416 +fWaveScale=1.000404 +fWaveSmoothing=0.000000 +fWaveParam=-0.720000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.010000 +fShader=0.000000 +zoom=1.000198 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.600000 +wave_y=0.700000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=20.223999 +nMotionVectorsY=10.656000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=2.200000 +mv_r=0.900000 +mv_g=0.500000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=// timed sidon sensor +per_frame_2=// le = signal level; desired average value = 2 +per_frame_3=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_4=pulse=above(le,th); +per_frame_5=// pulsefreq = running average of interval between last 5 pulses +per_frame_6=pulsefreq=if(equal(pulsefreq,0),2, +per_frame_7=if(pulse,.8*pulsefreq+.2*(time-lastpulse),pulsefreq)); +per_frame_8=lastpulse=if(pulse,time,lastpulse); +per_frame_9=// bt = relative time; 0 = prev beat; 1 = expected beat +per_frame_10=bt=(time-lastbeat)/(.5*beatfreq+.5*pulsefreq); +per_frame_11=// hccp = handcicap for th driven by bt +per_frame_12=hccp=(.03/(bt+.2))+.5*if(band(above(bt,.8),below(bt,1.2)), +per_frame_13=(pow(sin((bt-1)*7.854),4)-1),0); +per_frame_14=beat=band(above(le,th+hccp),btblock); +per_frame_15=btblock=1-above(le,th+hccp); +per_frame_16=lastbeat=if(beat,time,lastbeat); +per_frame_17=beatfreq=if(equal(beatfreq,0),2, +per_frame_18=if(beat,.8*beatfreq+.2*(time-lastbeat),beatfreq)); +per_frame_19=// th = threshold +per_frame_20=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_21=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_22=th=if(above(th,6),6,th); +per_frame_23= +per_frame_24=wave_r=.5*sqr(sin(time*3.7))+.5*sin(37*ccl+.01*leccl); +per_frame_25=wave_g=.5*sqr(sin(time*2.8))+.5*sin(38*ccl+.01*leccl); +per_frame_26=wave_b=.5*sqr(sin(time*3.2))+.5*sin(36*ccl+.01*leccl); +per_frame_27=wave_x=.5+.1*sin(leccl+frame); +per_frame_28=wave_y=.5+.1*sin(1.2*leccl+frame+1.17); +per_frame_29= +per_frame_30=ccl=ccl+beat; +per_frame_31=q1=ccl; +per_frame_32=leccl=leccl+bass+treb; +per_frame_33=q2=.001*leccl; +per_frame_34=q3=th; +per_frame_35= +per_frame_36=ob_r=wave_R; +per_frame_37=ob_b=wave_b; +per_frame_38=ob_g=wave_G; +per_pixel_1=sector=(ang+rot+x+y)*5000+q1+10*sin(q2); +per_pixel_2=orient=sector%4; +per_pixel_3=spd=.005*q3; +per_pixel_4=quadrant=above(x,.5)*2+above(y,.5-x); +per_pixel_5= +per_pixel_6=// variant movement +per_pixel_7=dx=dx+equal(quadrant,q1%4)*if(below(orient,2),-spd,spd); +per_pixel_8=dy=dx+equal(quadrant,q1%4)*if(orient%2,-spd,spd); +per_pixel_9= +per_pixel_10=// pulsed zoom +per_pixel_11=zoom = 1+equal(quadrant,(q1+1)%4-x*5*sin(100*q2+10*sign(sin(20*q1))*rad)); +per_pixel_12= +per_pixel_13=// weird warp +per_pixel_14=dx=dx+equal(quadrant,(q1+3)%4)*spd*sin((20+14*sin(18*q2))*x +per_pixel_15=+(15+10*sin(19*q2))*y+sin(1.8*q2)*q1)*Rad*sin(q1); +per_pixel_16=dy=dy+equal(quadrant,(q1+3)%4)*spd*sin((20+14*sin(18.5*q2))*x +per_pixel_17=+(15+10*sin(19.5*q2))*y+sin(1.7*q2)*q1)*Rad*sin(q1); +per_pixel_18= +per_pixel_19=// ccl driven stretch fx +per_pixel_20=sx=1+equal(quadrant,(q1+2)%4)*.1*sin(53*q1+10*q2+4*ang); +per_pixel_21=sy=1+equal(quadrant,(q1+2)%4)*.1*sin(32*q1+10*q2+4*ang); +per_pixel_22=rot=equal(quadrant,(q1+2)%4)*.05*sin(27*q1+10*q2); +per_pixel_23= +per_pixel_24=// structures +per_pixel_25=structure=equal(quadrant,(21.7*q1)%4)*above(sector%6,2)-q1*rad; +per_pixel_26= +per_pixel_27=dx=if(structure,5*-dx,dx); +per_pixel_28=dy=if(structure,5*-dy,dy);; +per_pixel_29=rot=if(structure,5*-rot-rad*rad,rad*rad); +per_pixel_30=zoom=if(structure,5*-zoom+6,zoom); +per_pixel_31= +per_pixel_32=sx=sx+.3*Sin(x)*sin(q3); +per_pixel_33=sy=sy-.3*sin(y)*sin(q1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Cortex (Spiritual Visions Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Cortex (Spiritual Visions Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Cortex (Spiritual Visions Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Cortex (Spiritual Visions Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,94 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.984600 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.073089 +fWaveSmoothing=0.630000 +fWaveParam=-0.800000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.347980 +fShader=0.000000 +zoom=1.020502 +rot=0.260000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.008264 +sx=0.999945 +sy=0.999904 +wave_r=0.300000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.049900 +ob_r=0.110000 +ob_g=1.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.055000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=1.280000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=vol_att=bass_att+treb_Att+mid_att; +per_frame_2=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.4)*0.85+1.4); +per_frame_3=treb_thresh = above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.5)*0.75+1.5); +per_frame_4=mid_thresh=above(mid_att,mid_thresh)*2+ +per_frame_5=(1-above(mid_att,mid_thresh))*((mid_thresh-1.5)*0.75+1.5); +per_frame_6=vol_thresh=bass_thresh+treb_thresh+mid_thresh; +per_frame_7=treb_effect=max(max(treb,treb_Att),react); +per_frame_8=bass_effect=max(max(Bass,bass_Att),react); +per_frame_9=mid_effect=max(max(mid,mid_att),react); +per_frame_10=vol_effect=bass_effect+treb_effect+mid_effect; +per_frame_11=normal=5; +per_frame_12=more=bass_effect; +per_frame_13=less=7; +per_frame_14=react=less; +per_frame_15=new_bass=if(above(Bass,bass_effect),bass+bass_att,bass_effect+bass_thresh); +per_frame_16=new_treb=if(above(treb,treb_effect),treb+treb_att,treb_Effect+treb_thresh); +per_frame_17=new_mid=if(above(mid,mid_effect),mid+mid_Att,mid_effect+mid_thresh); +per_frame_18=new_vol=new_bass+new_treb+new_mid+.04; +per_frame_19=change=bnot(1); +per_frame_20=q1=new_bass; +per_frame_21=q2=new_treb; +per_frame_22=q3=new_mid; +per_frame_23=q4=new_vol; +per_frame_24=q5=q4*.4*sin(q4)*.04; +per_frame_25=q6=-q1+q2+Q3+q4+q5+q6;; +per_frame_26=wave_r=wave_r*sin(q3); +per_frame_27=wave_B=wave_B-.2*cos(q4); +per_frame_28=wave_g=wave_b+wave_g*sin(q2+q5); +per_frame_29=wave_mystery=wave_myster-.1*sin(q1)+.4*sin(q5); +per_pixel_1=rot=rot*Sin(-ang+ang-.4*q1)-rot*sin(ang+-ang*q3)*rad*Sin(q1-rad)-x*.05*sin(q4)-y*.05*sin(q6); +per_pixel_2=zoom=zoom+rad+.3*sin(Q4-q1)*pow(x+.2*sin(Q4),y-.2*sin(Q1)) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Madness Within The Void (Remix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Madness Within The Void (Remix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Madness Within The Void (Remix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Madness Within The Void (Remix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,105 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=9.454960 +fWaveScale=0.863577 +fWaveSmoothing=0.630000 +fWaveParam=0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.200000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.050000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.015000 +ib_r=0.500000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=1.248000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=3.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=bass_counter = equal(bass_thresh,2)*1+bass_counter; +per_frame_2=treb_counter=equal(treb_thresh,2)*1+treb_counter; +per_frame_3=mid_counter=equal(mid_thresh,2)*1+mid_counter; +per_frame_4=vol_counter=equal(vol_thresh,2)*1+vol_counter; +per_frame_5=bass_cycler = bass_counter%8; +per_frame_6=treb_cycler=treb_counter%8; +per_frame_7=mid_cycler=mid_counter%8; +per_frame_8=q1=sin(Bass&timE*.43); +per_frame_9=q2=sin(bass_att&time*.23); +per_frame_10=q3=sin(treb&time*.43); +per_frame_11=q4=sin(mid&time*.23); +per_frame_12=q5=sin(mid_att&time*.54); +per_frame_13=q6=frame%40-bass*sin(time*.53-q3); +per_frame_14=q7=frame%20-treb*sin(time*.65-q2); +per_frame_15=q8=frame%30-mid*sin(time*.43-q1); +per_frame_16=ob_r=.3+.4*sin(above(q6,wave_b)); +per_frame_17=ob_b=.2+.7*sin(Above(q7,wave_g)); +per_frame_18=ob_G=.4+.5*sin(above(q8,wave_r)); +per_frame_19=//wave_A=100; +per_frame_20=wave_a=0; +per_frame_21=//wave_r=wave_b; +per_frame_22=//wave_g=wave_g; +per_frame_23=//wave_b=wave_R; +per_pixel_1=rad_cycle=rad*rad*x*60*rad*sin(q6); +per_pixel_2=d=.03*(sin(rad*3.14*sin(q3)))+1; +per_pixel_3=r=d-.03*(sin(ang*3.14*sin(q2))); +per_pixel_4=radx=below(0.3-rad+x,0.3+rad-x); +per_pixel_5=rady=below(0.3-rad+y,0.3+rad-y); +per_pixel_6=snare=below(0,x-rad-.3*sin(q4)-x-y*d*r)*sin(q1-d+r-q3); +per_pixel_7=x2=above(x,rad); +per_pixel_8=y2=above(y,rad); +per_pixel_9=zoome=zoom+.2*sin(above(q6,q7)/q8)*(radx*rady-d*sin(q2)-r*sin(q3)+.1*sin(rad*3.14*sin(Q1)) +per_pixel_10=+rad-x*radx-y*rady)*x2*y2-.03*sin(q4); +per_pixel_11=sx=sx-.09*sin(Q4)*sin(x2-rad+radx*sin(q2-q7))*radx-x2/2/2/2/2*rad; +per_pixel_12=sx=sx-.09*sin(q2)*sin(y2-rad+rady*sin(q3-q6))*rady-y2/2/2/2/2*rad; +per_pixel_13=rote=.1*sin(radx*rady-x2*sin(q3-x1+rad*300))-.03*d*r-.02*sin(q3-q1)-sin(ang*d/2/2/2/2/2 +per_pixel_14=*sin(q3)); +per_pixel_15=rote2=rot+.1--rad/2/2/2/2/2; +per_pixel_16=rot=if(above(q1,q2),rote,rote2*rad-ang/2*sin(above(bass,3.5))); +per_pixel_17=zoom=if(above(q2,q1),zoome,zoom+.05*sin(rad))+.01/2; +per_pixel_18= +per_pixel_19= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - MOTIVATION!.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - MOTIVATION!.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - MOTIVATION!.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - MOTIVATION!.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=1.000000 +fGammaAdj=1.000000 +fDecay=0.960000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.236877 +fWaveSmoothing=0.630000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=1.248000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_2=treb_thresh=above(treb_att,treb_thresh)*2+ +per_frame_3=(1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_4=mid_thresh=above(mid_att,mid_thresh)*2+ +per_frame_5=(1-above(mid_mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_6=vol_thresh=bass_thresh+treb_thresh+mid_thresh; +per_frame_7=q1=bass_thresh; +per_frame_8=q2=treb_thresh; +per_frame_9=q3=mid_thresh; +per_frame_10=q4=vol_thresh; +per_frame_11=wave_g=1-(abs(q1/2/2)); +per_frame_12=wave_r=1-(abs(Q2/2/2)); +per_frame_13=wave_g=1-(abs(q3/2/2)); +per_frame_14= +per_pixel_1=zoom=zoom+.1*Sin(Abs(rad/3.14)+.6*sin(above(Q1,1.594)+.1*sin(Q1))); +per_pixel_2=rot=rot+.1*sin(rad*3.14)*sin(if(above(q2,1.6),.5,-.5))+(.01*Rad)*sin(above(q1,1.7)); +per_pixel_3=dx=dx+.01*Sin(rad*5)*Sin(if(above(q3,1.2),.5,-.5))*sin(rad*50-q1)+.005*Sin(Q2*rad*50); +per_pixel_4=dy=dy-.01*sin(rad*5)*sin(if(above(q2,1.5),.5,-.5))*sin(rad*500-q2)-.005*sin(q1*rad*50); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Nothing Yet - 03 - The worst of the pack.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Nothing Yet - 03 - The worst of the pack.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Nothing Yet - 03 - The worst of the pack.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Nothing Yet - 03 - The worst of the pack.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,89 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.970000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.796892 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999500 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999999 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=1.216000 +nMotionVectorsY=1.248000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=vol_att=(treb_att*.25)+(mid_att*.25)+(bass_att*.25+.5*sin(vol))/vol; +per_frame_2=vol=bass+treb+mid; +per_frame_3=new_bass=(bass*.25+.5*sin(Bass_att*.25)); +per_frame_4=new_treb=(treb*.25+.5*sin(treb_att*.25)); +per_frame_5=new_mid=(mid*.25+.4*sin(mid_att*.25)); +per_frame_6=bass_c=q1-1*sin(bass_Att&time*.54); +per_frame_7=treb_c=q2-1*sin(treb_att&time*.44); +per_frame_8=mid_c=q3-1*sin(mid_att&time*.24); +per_frame_9=vol_c=q4-1*sin(vol_att&time*.64); +per_frame_10=q1=sin(Bass-new_bass&timE*.63); +per_frame_11=q2=sin(treb-new_treb&time*.43); +per_frame_12=q3=sin(mid-new_mid&time*.23); +per_frame_13=q4=sin(vol&time*.65); +per_frame_14=q5=bass_c; +per_frame_15=q6=treb_c; +per_frame_16=q7=mid_c; +per_frame_17=q8=vol_c; +per_frame_18=wave_r=.1+q1; +per_frame_19=wave_b=.9-q2; +per_frame_20=wave_G=.5-q3+q4; +per_pixel_1=zoom=zoom-.05*(rad-x-y+.05*sin(x*3.14*sin(y*3.14)))*q2*rad*3.14*sin(Q3)+.05*sin(ang*3.14-q2*rad*3.14); +per_pixel_2=rot=rot+.01*sin(ang*x-q1/y*ang*Rad-q3-zoom); +per_pixel_3=dx=rot*sin(x*3.14)/2; +per_pixel_4=dy=rot*sin(y*3.14)/2; +per_pixel_5=cx=-dx; +per_pixel_6=cy=dy; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Nucleus.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Nucleus.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Nucleus.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Nucleus.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,94 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.796892 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=1.248000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=vol_att=(treb_att*.25)+(mid_att*.25)+(bass_att*.25+.5*sin(vol))/vol; +per_frame_2=vol=bass+treb+mid; +per_frame_3=new_bass=(bass*.25+.5*sin(Bass_att*.25)); +per_frame_4=new_treb=(treb*.25+.5*sin(treb_att*.25)); +per_frame_5=new_mid=(mid*.25+.4*sin(mid_att*.25)); +per_frame_6=bass_c=q1-1*sin(bass_Att&time*.54); +per_frame_7=treb_c=q2-1*sin(treb_att&time*.44); +per_frame_8=mid_c=q3-1*sin(mid_att&time*.24); +per_frame_9=vol_c=q4-1*sin(vol_att&time*.64); +per_frame_10=q1=sin(Bass-new_bass&timE*.63); +per_frame_11=q2=sin(treb-new_treb&time*.43); +per_frame_12=q3=sin(mid-new_mid&time*.23); +per_frame_13=q4=sin(vol&time*.65); +per_frame_14=q5=bass_c; +per_frame_15=q6=treb_c; +per_frame_16=q7=mid_c; +per_frame_17=q8=vol_c; +per_frame_18=wave_r=if(above(q1,q3),redform1,redform2)+nozero; +per_frame_19=redform1=.3+.5*sin(q2); +per_frame_20=redform2=redform1-.3*Sin(Q4); +per_frame_21=wave_b=if(Above(Q1,q2),blueform1,blueform2)+nozero; +per_frame_22=blueform1=.1+.4*sin(q3); +per_frame_23=blueform2=blueform1+.3*sin(Q2); +per_frame_24=wave_g=if(Above(Q4,q5),.3*sin(time*.43),.7*sin(time*.43))+nozero; +per_frame_25= +per_frame_26=nozero=.2*sin(q3-.03*sin(q5))+.4; +per_pixel_1=zoome=zoom+.1*sin(rad*xy*3.14)/2*sin(q3); +per_pixel_2=xy=x+y*sin(ang*3.14*sin(q3)); +per_pixel_3=rot=rot+.01*sin(x*3.14*q1-y*3.14+ang*3.14*rand(300*sin(q2)*tan(rad+3*sin(q4)))); +per_pixel_4=zoome2=zoome+.10*sin(rad&Rad*sin(q3)); +per_pixel_5=zoom=if(equal(zoome2,0),zoom+.1*sin(rad*3.14*sin(q1)*ang*3.14*sin(bass_att-1)),zoome2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Rovastar - Altars Of Madness 2 (X.42 Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Rovastar - Altars Of Madness 2 (X.42 Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Rovastar - Altars Of Madness 2 (X.42 Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Rovastar - Altars Of Madness 2 (X.42 Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,95 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999600 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.763002 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.230000 +nMotionVectorsX=0.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.7 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.5- 0.4*sin(time*5.924); +per_frame_3=ob_b = 0.45 - 0.3*cos(time*0.816); +per_frame_4=warp =0; +per_frame_5=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_6=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_7=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_8=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_9=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_10=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_11=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_12=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_13=lastbeat = if(beat,time,lastbeat); +per_frame_14=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_15=q5 = if(beat,0.1*rand(1000),oldq5); +per_frame_16=oldq5 = q5; +per_frame_17=q3 = if(beat,0.1*rand(1000),oldq3); +per_frame_18=oldq3 = q3; +per_frame_19=ib_size = 0.02; +per_frame_20=ib_r = ib_r + 0.5*sin(time*2.424); +per_frame_21=ib_g = ib_g + 0.5*sin(time*2.247); +per_frame_22=ib_b = ib_b - 0.5*sin(time*1.131); +per_frame_23=dx = dx -0.008*(0.6*sin(time*0.23)+0.5*cos(time*0.153)); +per_frame_24=dy = dy - 0.008*(0.6*sin(time*0.21)+0.5*cos(time*0.142)); +per_frame_25=echo_zoom=echo_zoom-.3*sin(Time*(q5/2/2/2/2/2/2/2)); +per_frame_26=//echo_alpha=1; +per_pixel_1=box=abs(x*2-0.4*sin(q3))%2 + abs(y*2+0.4*sin(q5))%2; +per_pixel_2=q1 = 4.05+(sin(x+0.237*time)-cos(y+0.513*time)); +per_pixel_3=zoom = if(above(box,1),q1*.1,zoom); +per_pixel_4=rot = if(above(box,1),sin(0.885*time),0)*((ang/2/2/2)-rad)*Sin(q5)/2; +per_pixel_5=dx = if(above(box,1),sin(0.542*time),0.005*sin((y-0.5)*96)+0.005*sin((y-0.5)*128)); +per_pixel_6=dy= if(above(box,1),sin(0.581*time),0.001*cos((x-0.5)*128)+0.001*cos((x-0.5)*96)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Sinful Code (unchained style).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Sinful Code (unchained style).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Sinful Code (unchained style).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Sinful Code (unchained style).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,108 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999608 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.574824 +fWaveScale=0.179141 +fWaveSmoothing=0.630000 +fWaveParam=0.280000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004499 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999005 +sy=0.999005 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.020000 +ob_r=0.800000 +ob_g=0.800000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.025000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=3.984001 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=vol_att=(treb_att*.25)+(mid_att*.25)+(bass_att*.25+.5*sin(vol))/vol; +per_frame_2=vol=bass+treb+mid; +per_frame_3=new_bass=(bass*.25+.5*sin(Bass_att*.25)); +per_frame_4=new_treb=(treb*.25+.5*sin(treb_att*.25)); +per_frame_5=new_mid=(mid*.25+.4*sin(mid_att*.25)); +per_frame_6=bass_c=q1-1*sin(bass_Att&time*.54); +per_frame_7=treb_c=q2-1*sin(treb_att&time*.44); +per_frame_8=mid_c=q3-1*sin(mid_att&time*.24); +per_frame_9=vol_c=q4-1*sin(vol_att&time*.64); +per_frame_10=q1=sin(Bass-new_bass&timE*.63); +per_frame_11=q2=sin(treb-new_treb&time*.43); +per_frame_12=q3=sin(mid-new_mid&time*.23); +per_frame_13=q4=sin(vol&time*.65); +per_frame_14=q5=bass_c; +per_frame_15=q6=treb_c; +per_frame_16=q7=mid_c; +per_frame_17=q8=vol_c; +per_frame_18=wave_r=.3+q1; +per_frame_19=wave_b=.3+q3; +per_frame_20=wave_g=.5+.1*sin(q3); +per_frame_21=wave_mystery=wave_mystery-.6*sin(q2); +per_frame_22=ob_r=wave_r*sin(Q4); +per_frame_23=ob_b=wave_b*sin(Q2); +per_frame_24=ob_g=wave_g*sin(Q1); +per_frame_25=decay=decay-.01*sin(frame%2); +per_frame_26=//mv_a=1*sin(Q2); +per_frame_27= +per_frame_28=mv_r=.3+.6*sin(Q1-q2); +per_frame_29=mv_b=.4+.5*sin(Q3-q1); +per_frame_30=mv_g=.3+.5*sin(q2-q1); +per_frame_31=mv_dx=mv_dx+.03*sin(time*.54-q3); +per_frame_32=mv_dy=mv_dy-.03*sin(time*.43-q1); +per_frame_33=wave_x=wave_x+.2*sin(time*.43); +per_frame_34=wave_y=wave_y-.2*sin(time*.23); +per_frame_35=wave_mode=rand(10)*sin(above(Q1,q3)); +per_pixel_1=zoom=zoom+.05*sin(rad*3.14*sin(Q1)*ang*3.14*sin(q1))*sin(q4); +per_pixel_2=cx=rot*rad*sin(q1)-y*sin(q4); +per_pixel_3=cy=rot*rad*sin(q2)-x*sin(Q6); +per_pixel_4=rot=rot-.0003*tan(rad*3*sin(q1)); +per_pixel_5=dxon=above(q1,q2); +per_pixel_6=dxoff=below(q1,q2); +per_pixel_7=dyon=above(q2,q3); +per_pixel_8=dyoff=below(q2,q3); +per_pixel_9=dx=.01-below(rad,x-.03)*sin(above(dxon,dxoff))/2*sin(Q2)/2/2-.01/2; +per_pixel_10=dy=.01-below(rad,y-.03)*sin(above(dyon,dyoff))/2*sin(q1)/2/2-.01/2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Some big word I learned.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Some big word I learned.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Some big word I learned.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Some big word I learned.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,91 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.073159 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=1.216000 +nMotionVectorsY=1.248000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=vol_att=(treb_att*.25)+(mid_att*.25)+(bass_att*.25+.5*sin(vol))/vol; +per_frame_2=vol=bass+treb+mid; +per_frame_3=new_bass=(bass*.25+.5*sin(Bass_att*.25)); +per_frame_4=new_treb=(treb*.25+.5*sin(treb_att*.25)); +per_frame_5=new_mid=(mid*.25+.4*sin(mid_att*.25)); +per_frame_6=bass_c=q1-1*sin(bass_Att&time*.54); +per_frame_7=treb_c=q2-1*sin(treb_att&time*.44); +per_frame_8=mid_c=q3-1*sin(mid_att&time*.24); +per_frame_9=vol_c=q4-1*sin(vol_att&time*.64); +per_frame_10=q1=sin(Bass-new_bass&timE*.63); +per_frame_11=q2=sin(treb-new_treb&time*.43); +per_frame_12=q3=sin(mid-new_mid&time*.23); +per_frame_13=q4=sin(vol&time*.65); +per_frame_14=q5=bass_c; +per_frame_15=q6=treb_c; +per_frame_16=q7=mid_c; +per_frame_17=q8=vol_c; +per_frame_18=wave_r=.1+.3*Sin(time*q1); +per_frame_19=wave_b=.3+q2; +per_frame_20=wave_g=.3+.1*Sin(q3-time); +per_pixel_1=zoom=zoom+.1*sin(pick*picke); +per_pixel_2=pick=if(above(Q1,q2),rade,ange); +per_pixel_3=rade=if(Above(q1,q3),rad*3.14-.01*x*sin(time*2),rad*3.14-.0*y*sin(time*2)); +per_pixel_4=ange=if(Above(q2,q3),ang*3.14-.01*x*sin(time*2),ang*3.14-.01*y*sin(time*2)); +per_pixel_5=picke=if(Above(Q2,q1),3.14,1); +per_pixel_6=rot=if(Above(q1,q2),rot+.03*rade,rot+.03*ange)*sin(q3); +per_pixel_7=dx=.01*sin(rade*sin(q2))/2/2/2/2/2; +per_pixel_8=dy=.01*Sin(ange*sin(q1))/2/2/2/2/2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Spectrum.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Spectrum.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Spectrum.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/idiot - Spectrum.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.925000 +fVideoEchoZoom=0.986700 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.285751 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=1.248000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_2=treb_thresh=above(treb_att,treb_thresh)*2+ +per_frame_3=(1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_4=mid_thresh=above(mid_att,mid_thresh)*2+ +per_frame_5=(1-above(mid_mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_6=vol_thresh=bass_thresh+treb_thresh+mid_thresh; +per_frame_7=q1=bass_thresh; +per_frame_8=q2=treb_thresh; +per_frame_9=q3=mid_thresh; +per_frame_10=q4=vol_thresh; +per_frame_11=wave_r=.1+.5*sin(time*.54)-.2*sin(below(Q1,q2)); +per_frame_12=wave_B=if(Above(q2,q3),.5-.3*Sin(time*.23),0); +per_frame_13=wave_g=if(above(q2,q3),wave_r-.05*Sin(time*.3)+.5*sin(above(Q1,q2)),1-.5*Sin(Time) +per_frame_14=*sin(equal(wave_b,0))); +per_frame_15=ez=sin(wave_g)*cos(wave_R-wave_b)+.3*Sin(if(below(ez,.7),ez,ez+.2)); +per_frame_16=echo_zoom=ez; +per_frame_17= +per_pixel_1=zoom=zoom+.01*Sin(Rad*3.14-q1)+.03*sin(q3); +per_pixel_2=rot=rot-.01*sin(rad*3.14)+.02*sin(Above(Q1,q2)); +per_pixel_3=dx=dx+.01*Sin(rad*5)*sin(time*.54-q3); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Tentacle Dreams (Remix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Tentacle Dreams (Remix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Tentacle Dreams (Remix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Tentacle Dreams (Remix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,103 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=3.544918 +fWaveSmoothing=0.630000 +fWaveParam=-0.360000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000100 +fShader=0.000000 +zoom=1.000376 +rot=1.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999944 +sy=0.999904 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.049900 +ob_r=0.110000 +ob_g=0.500000 +ob_b=1.000000 +ob_a=0.000000 +ib_size=0.055000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=1.280000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=vol_att=bass_att+treb_Att+mid_att; +per_frame_2=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_3=treb_thresh=above(treb_att,treb_thresh)*2+ +per_frame_4=(1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_5=mid_thresh=above(mid_att,mid_thresh)*2+ +per_frame_6=(1-above(mid_mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_7=vol_thresh=bass_thresh+treb_thresh+mid_thresh; +per_frame_8=treb_effect=max(max(treb,treb_Att),treb_thresh); +per_frame_9=bass_effect=max(max(Bass,bass_Att),bass_thresh); +per_frame_10=mid_effect=max(max(mid,mid_att),mid_thresh); +per_frame_11=vol_effect=bass_effect+treb_effect+mid_effect; +per_frame_12=react=vol; +per_frame_13=new_bass=if(above(react,bass_effect),bass&bass_att,bass_effect+bass_thresh); +per_frame_14=new_treb=if(above(react,treb_effect),treb&treb_att,treb_Effect+treb_thresh); +per_frame_15=new_mid=if(above(react,mid_effect),mid&mid_Att,mid_effect+mid_thresh); +per_frame_16=new_vol=new_bass+new_treb+new_mid+.04; +per_frame_17=change=bnot(1); +per_frame_18=q1=new_bass; +per_frame_19=q2=new_treb; +per_frame_20=q3=new_mid; +per_frame_21=q4=new_vol; +per_frame_22=q5=bass_thresh; +per_frame_23=q6=treb_thresh; +per_frame_24=q7=mid_thresh; +per_frame_25=q8=vol_thresh; +per_frame_26=wave_r=.4+.3*Sin(time+Q1); +per_frame_27=wave_b=.3+.6*sin(time+q2); +per_frame_28=wave_g=.5+.5*sin(time-q1); +per_frame_29= +per_frame_30= +per_pixel_1=rot_effect=.3*Sin(rad-+ang*x+yQ3)*rad*sin(if(Above(Q1,q2),q5,-q5))*rad-.1*sin(Q3*rad+ang-x*y*rad*q1); +per_pixel_2=rot_effect2=if(Above(q5,q6),rot_effect,-rot_effect)-rad*.25*sin(Q6)+.2*Sin(Q6)-x*.25-.01*sin(Q7)- +per_pixel_3=above(rad,x)*sin(Q8)*.25*sin(time*.65); +per_pixel_4=rot=if(above(q5,q7),rot_effect,rot_effect2); +per_pixel_5=cx_x=if(Above(Q2,q3),cx+.5*Sin(x-.3*Rad*cos(q1-.3)-.2-rad*sin(q6)),.5); +per_pixel_6=cy_x=if(Above(Q2,q3),cy+.5*sin(y-.3*rad*cos(q2-.3)-.2-rad*sin(q5)),.5); +per_pixel_7=cx=if(above(q5,q6),cx_x,cx_x-.2); +per_pixel_8=cy=if(Above(Q5,q7),cy_x,cy_x-.2); +per_pixel_9=zoom=zoom-.10*rad*sin(Q1)*Rad-.02*sin(q6-x+y*sin(q6+rad)+rad); +per_pixel_10=//388-0250; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Texture Boxes (Remix 2).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Texture Boxes (Remix 2).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Texture Boxes (Remix 2).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Texture Boxes (Remix 2).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,250 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001715 +fWaveScale=1.000000 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999999 +rot=-0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.006000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.500000 +ib_r=0.400000 +ib_g=0.400000 +ib_b=0.400000 +ib_a=0.000000 +nMotionVectorsX=38.399994 +nMotionVectorsY=14.400005 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.000000 +shapecode_0_y=0.870000 +shapecode_0_rad=0.310900 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=3.141500 +shapecode_0_tex_zoom=2.216710 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=1.000000 +shape_0_per_frame1=textured=1; +shape_0_per_frame2=tex_ang=tex_ang+1*sin(time*.65*q2); +shape_0_per_frame3=ang=ang+1*sin(time*.62); +shape_0_per_frame4=x=.5-.3*sin(time*.34); +shape_0_per_frame5=y=.5+.3*sin(time*.53); +shape_0_per_frame6=rad=rad-.5*sin(time*.53); +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.000000 +shapecode_1_y=0.620000 +shapecode_1_rad=0.307832 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=2.448630 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=0.000000 +shapecode_1_border_a=1.000000 +shape_1_per_frame1=textured=1; +shape_1_per_frame2=tex_ang=tex_ang+1*sin(time*.23*q4); +shape_1_per_frame3=ang=ang+1*sin(time*.75); +shape_1_per_frame4=x=.5-.3*sin(time*.12); +shape_1_per_frame5=y=.5+.3*sin(time*.65); +shape_1_per_frame6=rad=rad+.5*sin(time*.75); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.000000 +shapecode_2_y=0.370000 +shapecode_2_rad=0.317160 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=2.448629 +shapecode_2_r=1.000000 +shapecode_2_g=0.400000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=0.400000 +shapecode_2_b2=0.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=0.400000 +shapecode_2_border_b=0.000000 +shapecode_2_border_a=1.000000 +shape_2_per_frame1=textured=1; +shape_2_per_frame2=tex_ang=tex_ang+1*sin(time*.34*q3); +shape_2_per_frame3=ang=ang+1*sin(time*.12); +shape_2_per_frame4=x=.5-.3*sin(time*.23); +shape_2_per_frame5=y=.5+.3*sin(time*.56); +shape_2_per_frame6=rad=rad+.5*sin(time*.12); +shapecode_3_enabled=1 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.000000 +shapecode_3_y=0.110000 +shapecode_3_rad=0.314020 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=2.216713 +shapecode_3_r=0.000000 +shapecode_3_g=1.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=0.000000 +shapecode_3_border_a=1.000000 +shape_3_per_frame1=textured=1; +shape_3_per_frame2=tex_ang=tex_ang+1*sin(time*.12*q6); +shape_3_per_frame3=ang=ang+1*sin(time*.65); +shape_3_per_frame4=x=.5-.3*sin(time*.54); +shape_3_per_frame5=y=.5+.3*sin(time*.23); +shape_3_per_frame6=rad=rad+.4*sin(time*.43); +per_frame_1=vol_att=(treb_att*.25)+(mid_att*.25)+(bass_att*.25+.5*sin(vol))/vol; +per_frame_2=vol=bass+treb+mid; +per_frame_3=new_bass=(bass*.25+.5*sin(bass_att*.25)); +per_frame_4=new_treb=(treb*.25+.5*sin(treb_att*.25)); +per_frame_5=new_mid=(mid*.25+.4*sin(mid_att*.25)); +per_frame_6=bass_c=q1-1*sin(bass_stt&time*.54); +per_frame_7=treb_c=q2-1*sin(treb_att&time*.44); +per_frame_8=mid_c=q3-1*sin(mid_att&time*.24); +per_frame_9=vol_c=q4-1*sin(vol_att&time*.64); +per_frame_10=q1=sin(bass-new_bass&time*.63); +per_frame_11=q2=sin(treb-new_treb&time*.43); +per_frame_12=q3=sin(mid-new_mid&time*.23); +per_frame_13=q4=sin(vol&time*.65); +per_frame_14=q5=bass_c; +per_frame_15=q6=treb_c; +per_frame_16=q7=mid_c; +per_frame_17=q8=vol_c; +per_frame_18= +per_frame_19= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Texture Boxes (Remix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Texture Boxes (Remix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Texture Boxes (Remix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Texture Boxes (Remix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,251 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001715 +fWaveScale=1.000000 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999999 +rot=-0.000000 +cx=0.500000 +cy=0.500000 +dx=0.194000 +dy=0.400000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.500000 +ib_r=0.400000 +ib_g=0.400000 +ib_b=0.400000 +ib_a=0.000000 +nMotionVectorsX=38.399994 +nMotionVectorsY=14.400005 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.000000 +shapecode_0_y=0.870000 +shapecode_0_rad=0.310900 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=3.141500 +shapecode_0_tex_zoom=2.216710 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=1.000000 +shape_0_per_frame1=tx=0+1*sin(q1); +shape_0_per_frame2=textured=if(below(.5,tx),0,1); +shape_0_per_frame3=tex_ang=tex_ang+1*sin(time*.65*q2); +shape_0_per_frame4=ang=ang+1*sin(time*.62); +shape_0_per_frame5=x=.5-.3*sin(time*.34); +shape_0_per_frame6=y=.5+.3*sin(time*.53); +shape_0_per_frame7= +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.000000 +shapecode_1_y=0.620000 +shapecode_1_rad=0.307832 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=2.448630 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=0.000000 +shapecode_1_border_a=1.000000 +shape_1_per_frame1=tx=0+1*sin(q2); +shape_1_per_frame2=textured=if(below(.5,tx),0,1); +shape_1_per_frame3=tex_ang=tex_ang+1*sin(time*.23*q4); +shape_1_per_frame4=ang=ang+1*sin(time*.75); +shape_1_per_frame5=x=.5-.3*sin(time*.12); +shape_1_per_frame6=y=.5+.3*sin(time*.65); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.000000 +shapecode_2_y=0.370000 +shapecode_2_rad=0.317160 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=2.448629 +shapecode_2_r=1.000000 +shapecode_2_g=0.400000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=0.400000 +shapecode_2_b2=0.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=0.400000 +shapecode_2_border_b=0.000000 +shapecode_2_border_a=1.000000 +shape_2_per_frame1=tx=0+1*sin(q3); +shape_2_per_frame2=textured=if(below(.5,tx),0,1); +shape_2_per_frame3=tex_ang=tex_ang+1*sin(time*.34*q3); +shape_2_per_frame4=ang=ang+1*sin(time*.12); +shape_2_per_frame5=x=.5-.3*sin(time*.23); +shape_2_per_frame6=y=.5+.3*sin(time*.56); +shapecode_3_enabled=1 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.000000 +shapecode_3_y=0.110000 +shapecode_3_rad=0.314020 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=2.216713 +shapecode_3_r=0.000000 +shapecode_3_g=1.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=0.000000 +shapecode_3_border_a=1.000000 +shape_3_per_frame1=tx=0+1*sin(q4); +shape_3_per_frame2=textured=if(below(.5,tx),0,1); +shape_3_per_frame3=tex_ang=tex_ang+1*sin(time*.12*q6); +shape_3_per_frame4=ang=ang+1*sin(time*.65); +shape_3_per_frame5=x=.5-.3*sin(time*.54); +shape_3_per_frame6=y=.5+.3*sin(time*.23); +per_frame_1=vol_att=(treb_att*.25)+(mid_att*.25)+(bass_att*.25+.5*sin(vol))/vol; +per_frame_2=vol=bass+treb+mid; +per_frame_3=new_bass=(bass*.25+.5*sin(bass_att*.25)); +per_frame_4=new_treb=(treb*.25+.5*sin(treb_att*.25)); +per_frame_5=new_mid=(mid*.25+.4*sin(mid_att*.25)); +per_frame_6=bass_c=q1-1*sin(bass_att&time*.54); +per_frame_7=treb_c=q2-1*sin(treb_att&time*.44); +per_frame_8=mid_c=q3-1*sin(mid_att&time*.24); +per_frame_9=vol_c=q4-1*sin(vol_att&time*.64); +per_frame_10=q1=sin(bass-new_bass&time*.63); +per_frame_11=q2=sin(treb-new_treb&time*.43); +per_frame_12=q3=sin(mid-new_mid&time*.23); +per_frame_13=q4=sin(vol&time*.65); +per_frame_14=q5=bass_c; +per_frame_15=q6=treb_c; +per_frame_16=q7=mid_c; +per_frame_17=q8=vol_c; +per_frame_18= +per_frame_19= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Typomatic (Remix 2).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Typomatic (Remix 2).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Typomatic (Remix 2).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - Typomatic (Remix 2).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,104 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.950000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.438652 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000157 +fShader=0.000000 +zoom=1.010404 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999944 +sy=0.999904 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.049900 +ob_r=0.110000 +ob_g=1.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.055000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=1.280000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=vol_att=bass_att+treb_Att+mid_att; +per_frame_2=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.4)*0.85+1.4); +per_frame_3=treb_thresh = above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.5)*0.75+1.5); +per_frame_4=mid_thresh=above(mid_att,mid_thresh)*2+ +per_frame_5=(1-above(mid_att,mid_thresh))*((mid_thresh-1.5)*0.75+1.5); +per_frame_6=vol_thresh=bass_thresh+treb_thresh+mid_thresh; +per_frame_7=treb_effect=max(max(treb,treb_Att),react); +per_frame_8=bass_effect=max(max(Bass,bass_Att),react); +per_frame_9=mid_effect=max(max(mid,mid_att),react); +per_frame_10=vol_effect=bass_effect+treb_effect+mid_effect; +per_frame_11=normal=5; +per_frame_12=more=bass_effect; +per_frame_13=less=7; +per_frame_14=react=less; +per_frame_15=new_bass=if(above(Bass,bass_effect),bass&bass_att,bass_effect+bass_thresh); +per_frame_16=new_treb=if(above(treb,treb_effect),treb&treb_att,treb_Effect+treb_thresh); +per_frame_17=new_mid=if(above(mid,mid_effect),mid&mid_Att,mid_effect+mid_thresh); +per_frame_18=new_vol=new_bass+new_treb+new_mid+.04; +per_frame_19=change=bnot(1); +per_frame_20=q1=new_bass; +per_frame_21=q2=new_treb; +per_frame_22=q3=new_mid; +per_frame_23=q4=new_vol; +per_frame_24=q5=if(above(q2,q3),above(q1,q3),-above(q1,q3)); +per_frame_25=q6=if(above(q1,q3),above(q2,q4),-above(q2,q3)); +per_frame_26=q7=if(above(q5,q6),q5,-q6);; +per_frame_27=q8=if(above(q6,q7),q6,-q7);; +per_frame_28=ib_r=q3-.2*sin(q2); +per_frame_29=ib_b=q3+.2*sin(q1); +per_frame_30=ib_g=q3-1*sin(q2); +per_frame_31=wave_r=.2*sin(Q3); +per_frame_32=wave_b=.6*sin(Q1); +per_frame_33=wave_g=.7*sin(Q2); +per_pixel_1=zoom=if(above(q1-q3,q6-q7),if(above(q2,q1),if(above(pow(x,q1-q5),pow(y,q1-q6)),zoom*sin(rad+1*sin(q1)*sin(q4)),zoom +per_pixel_2=*sin(Rad-.2)+1)-rad*sin(q6+rad-x-q6)+x*sin(above(q7,q6)*sin(Q7))+.2*sin(x*sin(q8)),1.20 +per_pixel_3=*sin(pow(x,y)*sin(Q4))),1+rad-.2*sin(q4-x))-(rad&rad*sin(q4)); +per_pixel_4= +per_pixel_5=rot=if(above(q3,q5),if(above(q5,.5),if(above(q7,q6),if(Above(q1,q2),rot*sin(Rad-.2*ang+x),-rot*Sin(rad+x-tan(ang)-cos(x*q3))+.2 +per_pixel_6=-x)*band(rad-zoom,rad+zoom),-.2*Sin(rad-ang-x)),0*sin(rad-.2)*zoom)*sin(q1-q2),rot&rad-1*x); +per_pixel_7= +per_pixel_8= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - What Is.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - What Is.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - What Is.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - What Is.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,102 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=-0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000157 +fShader=0.000000 +zoom=1.041020 +rot=0.160000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999944 +sy=0.999904 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.049900 +ob_r=0.110000 +ob_g=1.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.055000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=1.280000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=vol_att=bass_att+treb_Att+mid_att; +per_frame_2=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_3=treb_thresh=above(treb_att,treb_thresh)*2+ +per_frame_4=(1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_5=mid_thresh=above(mid_att,mid_thresh)*2+ +per_frame_6=(1-above(mid_mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_7=vol_thresh=bass_thresh+treb_thresh+mid_thresh; +per_frame_8=treb_effect=max(max(treb,treb_Att),react); +per_frame_9=bass_effect=max(max(Bass,bass_Att),react); +per_frame_10=mid_effect=max(max(mid,mid_att),react); +per_frame_11=vol_effect=bass_effect+treb_effect+mid_effect; +per_frame_12=normal=5; +per_frame_13=more=bass_effect; +per_frame_14=less=7; +per_frame_15=react=less; +per_frame_16=new_bass=if(above(Bass,bass_effect),bass&bass_att,bass_effect+bass_thresh); +per_frame_17=new_treb=if(above(treb,treb_effect),treb&treb_att,treb_Effect+treb_thresh); +per_frame_18=new_mid=if(above(mid,mid_effect),mid&mid_Att,mid_effect+mid_thresh); +per_frame_19=new_vol=new_bass+new_treb+new_mid+.04; +per_frame_20=change=bnot(1); +per_frame_21=q1=new_bass; +per_frame_22=q2=new_treb; +per_frame_23=q3=new_mid; +per_frame_24=q4=new_vol; +per_frame_25=q5=if(above(q2,q3),above(q1,q3),-above(q1,q3)); +per_frame_26=q6=if(above(q1,q3),above(q2,q4),-above(q2,q3)); +per_frame_27=q7=if(above(q5,q6),q5,-q6);; +per_frame_28=q8=if(above(q6,q7),q6,-q7);; +per_frame_29= +per_frame_30=wave_R=.5*sin(above(q1,q2)); +per_frame_31=wave_b=1*sin(above(q3,q2)); +per_frame_32=wave_G=wave_g*Sin(q4); +per_frame_33=wave_myster=wavE_myster-.2*sin(above(Q3,q5)); +per_pixel_1=rot=if(above(no_effect,5),rot*Sin(-ang+ang-.4*q1)-rot*sin(ang+-ang*q3)*rad*Sin(q1-rad)-x*.05*sin(q4)-y*.05 +per_pixel_2=*sin(q6-x+y*rad)-rot*sin(equal(q1,q2)),.1*rad); +per_pixel_3=zoom=if(above(no_effect,5),zoom+raD*.03*sin(q2+q5)-x*.05*sin(q4+q6)+y*.10*.25*sin(q5-q3) +per_pixel_4=,1+.10*sin(rad) +per_pixel_5=); +per_pixel_6=no_effect=q1-q3*sin(above(q1,q2)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - What Shall Come.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - What Shall Come.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - What Shall Come.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot - What Shall Come.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,114 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.020068 +fWaveSmoothing=0.630000 +fWaveParam=-0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000157 +fShader=0.000000 +zoom=1.041020 +rot=0.240000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999944 +sy=0.999904 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.025000 +ob_r=0.110000 +ob_g=1.000000 +ob_b=0.000000 +ob_a=0.040000 +ib_size=0.055000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.799995 +nMotionVectorsY=48.000000 +mv_dx=0.500000 +mv_dy=0.500000 +mv_l=3.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=1.000000 +per_frame_1=vol_att=bass_att+treb_Att+mid_att; +per_frame_2=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_3=treb_thresh=above(treb_att,treb_thresh)*2+ +per_frame_4=(1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_5=mid_thresh=above(mid_att,mid_thresh)*2+ +per_frame_6=(1-above(mid_mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_7=vol_thresh=bass_thresh+treb_thresh+mid_thresh; +per_frame_8=treb_effect=max(max(treb,treb_Att),react); +per_frame_9=bass_effect=max(max(Bass,bass_Att),react); +per_frame_10=mid_effect=max(max(mid,mid_att),react); +per_frame_11=vol_effect=bass_effect+treb_effect+mid_effect; +per_frame_12=normal=5; +per_frame_13=more=bass_effect; +per_frame_14=less=7; +per_frame_15=react=less; +per_frame_16=new_bass=if(above(Bass,bass_effect),bass&bass_att,bass_effect+bass_thresh); +per_frame_17=new_treb=if(above(treb,treb_effect),treb&treb_att,treb_Effect+treb_thresh); +per_frame_18=new_mid=if(above(mid,mid_effect),mid&mid_Att,mid_effect+mid_thresh); +per_frame_19=new_vol=new_bass+new_treb+new_mid+.04; +per_frame_20=change=bnot(1); +per_frame_21=q1=new_bass; +per_frame_22=q2=new_treb; +per_frame_23=q3=new_mid; +per_frame_24=q4=new_vol; +per_frame_25=q5=if(above(q2,q3),above(q1,q3),-above(q1,q3)); +per_frame_26=q6=if(above(q1,q3),above(q2,q4),-above(q2,q3)); +per_frame_27=q7=if(above(q5,q6),q5,-q6);; +per_frame_28=q8=if(above(q6,q7),q6,-q7);; +per_frame_29= +per_frame_30=wave_R=.5*sin(above(q1,q2)); +per_frame_31=wave_b=1*sin(above(q3,q2)); +per_frame_32=wave_G=wave_g*Sin(q4); +per_frame_33=wave_myster=wavE_myster-.2*sin(above(Q3,q5)); +per_frame_34= +per_frame_35=ob_r=wave_r; +per_frame_36=ob_b=wave_b; +per_frame_37=ob_g=wave_g; +per_frame_38=mv_r=wave_r; +per_frame_39=mv_b=wave_B; +per_frame_40=mv_g=wave_g; +per_frame_41=ob_a=mv_a; +per_frame_42=mv_A=.6*sin(above(q2,q3)); +per_pixel_1=rot=if(above(q1,bass),if(above(no_effect,0),rot*Sin(-ang+ang-.4*q1)-rot*sin(ang+-ang*q3)*rad*Sin(q1-rad)-x*.05*sin(q4)-y*.05 +per_pixel_2=*sin(q6-x+y*rad)-rot*sin(above(q1,q2)),.1*rad*ang*x*y),0*rad*Ang+.1*sin(q5)*ang-.3*rad*Sin(q5)); +per_pixel_3=zoom=if(above(no_effect,2),zoom+raD*.03*sin(q2+q5)-x*.05*sin(q4+q6)+y*.10*.25*sin(q5-q3) +per_pixel_4=,1+.10*sin(ang+Rad-x*ang+rad*sin(q4)) +per_pixel_5=)&y+.5-rad+x+y*sin(equal(q2,q2)&rad*sin(q6));; +per_pixel_6=no_effect=q4*sin(above(q4,1)); +per_pixel_7= +per_pixel_8=sx=sx+.07*sin(above(Q1,q3))*rad*.25; +per_pixel_9=sy=sy+.07*sin(above(Q1,q2))*rad*.25; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Zylot - Unhealthy Love (Idiot's STDs Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Zylot - Unhealthy Love (Idiot's STDs Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Zylot - Unhealthy Love (Idiot's STDs Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Idiot & Zylot - Unhealthy Love (Idiot's STDs Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,112 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.950000 +fVideoEchoZoom=0.999607 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=5.830096 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000100 +fShader=0.000000 +zoom=1.020484 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999944 +sy=0.999904 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.400000 +ob_size=0.049900 +ob_r=0.110000 +ob_g=0.500000 +ob_b=1.000000 +ob_a=0.400000 +ib_size=0.055000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=0.640000 +nMotionVectorsY=4.800000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.700000 +mv_g=0.350000 +mv_b=0.500000 +mv_a=0.000000 +per_frame_1=vol_att=bass_att+treb_Att+mid_att; +per_frame_2=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_3=treb_thresh=above(treb_att,treb_thresh)*2+ +per_frame_4=(1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_5=mid_thresh=above(mid_att,mid_thresh)*2+ +per_frame_6=(1-above(mid_mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_7=vol_thresh=bass_thresh+treb_thresh+mid_thresh; +per_frame_8=treb_effect=max(max(treb,treb_Att),treb_thresh); +per_frame_9=bass_effect=max(max(Bass,bass_Att),bass_thresh); +per_frame_10=mid_effect=max(max(mid,mid_att),mid_thresh); +per_frame_11=vol_effect=bass_effect+treb_effect+mid_effect; +per_frame_12=react=vol; +per_frame_13=new_bass=if(above(react,bass_effect),bass&bass_att,bass_effect+bass_thresh); +per_frame_14=new_treb=if(above(react,treb_effect),treb&treb_att,treb_Effect+treb_thresh); +per_frame_15=new_mid=if(above(react,mid_effect),mid&mid_Att,mid_effect+mid_thresh); +per_frame_16=new_vol=new_bass+new_treb+new_mid+.04; +per_frame_17=change=bnot(1); +per_frame_18=q1=new_bass; +per_frame_19=q2=new_treb; +per_frame_20=q3=new_mid; +per_frame_21=q4=new_vol; +per_frame_22=q5=if(above(q2,q3),above(q1,q3),-above(q1,q3)); +per_frame_23=q6=if(above(q1,q3),above(q2,q4),-above(q2,q3)); +per_frame_24=q7=if(above(q5,q6),q5,-q6);; +per_frame_25=q8=if(above(q6,q7),q6,-q7);; +per_frame_26= +per_frame_27= +per_frame_28= +per_frame_29= +per_frame_30=red=1*sin(time*1*q1); +per_frame_31=blue=1*sin(time*2*q2); +per_frame_32=green=1*sin(time*3*q3); +per_frame_33=wave_R=red-.2*sin(above(q1,q2)); +per_frame_34=wave_b=blue-.9*sin(Above(q1,q3)); +per_frame_35=wave_g=green-.5*sin(above(q3,q2));; +per_frame_36=ob_r=blue; +per_frame_37=ob_b=green; +per_frame_38=ob_g=red; +per_pixel_1=change=if(above(q1*q2,q3*q1),effect,effect0+.2+Rad*siN(q6-x+(.2*sin(q3)+x*sin(q7)))); +per_pixel_2=effect0=if(above(q1,q3),zoom,zoom-.1); +per_pixel_3=effect=if(above(q2,q3),zoom,zoom-.1); +per_pixel_4=change2=if(above(q1*q3,q4*q1),effect-.1,effect0-.1+rad*sin(q2-x+(.2*sin(q2)))); +per_pixel_5=change3=change-change2; +per_pixel_6=change4=change0-change+change2; +per_pixel_7=effect2=if(above(change,q1),if(above(change,q4),zoom+.3-rad,change), +per_pixel_8=if(above(change,q3),-zoom+.3-rad,change2))+.2; +per_pixel_9=zoom=if(above(change3,change4),if(above(chang2,change3),if(above(change,change2) +per_pixel_10=,effect,effect2),effect0),zoom); +per_pixel_11=rot = -ang*.05*zoom; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Che - Return Of The King.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Che - Return Of The King.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Che - Return Of The King.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Che - Return Of The King.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.999000 +fVideoEchoZoom=1.000498 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000416 +fWaveScale=0.591236 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000158 +fShader=1.000000 +zoom=1.000200 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.030301 +sy=1.020100 +wave_r=0.000000 +wave_g=0.500000 +wave_b=0.900000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.150000 +ob_r=0.000000 +ob_g=0.200000 +ob_b=0.400000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.150000 +ib_b=0.550000 +ib_a=1.000000 +nMotionVectorsX=19.199995 +nMotionVectorsY=14.400000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.500000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=wave_r = 0.150*( 0.30*sin(0.875*time) + 0.20*sin(0.315*time) ); +per_frame_2=wave_g = 0.850*( 0.10*sin(0.200*time) + 0.10*sin(1.025*time) ); +per_frame_3=wave_b = 0.250*( 0.90*sin(0.410*time) + 0.60*sin(0.150*time) ); +per_pixel_1=dx=.01*sin((20+10*sin(q1*1.5))*(y+.2*sin(q1*.7)))*bass; +per_pixel_2=dy=.01*sin((20+10*sin(q1))*(x+.2*sin(q1*.77)))*bass; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Che - The Piper.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Che - The Piper.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Che - The Piper.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Che - The Piper.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=1.000498 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000416 +fWaveScale=0.998162 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.000000 +fModWaveAlphaEnd=0.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000100 +fShader=1.000000 +zoom=0.970700 +rot=0.020000 +cx=0.350000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.072134 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.150000 +ob_r=0.000000 +ob_g=0.200000 +ob_b=0.400000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.150000 +ib_b=0.550000 +ib_a=1.000000 +nMotionVectorsX=19.199995 +nMotionVectorsY=14.400000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.500000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=wave_r = 0.150*(0.30*sin(0.875*time) + 0.20*sin(0.315*time) ); +per_frame_2=wave_g = 0.150*(0.10*sin(0.200*time) + 0.10*sin(1.025*time) ); +per_frame_3=wave_b = 0.150*(0.50*sin(0.410*time) + 0.60*sin(0.150*time) ); +per_pixel_1=dx=.01*sin((20+10*sin(q1*1.5))*(y+.2*sin(q1*.7)))*bass*3; +per_pixel_2=dy=.01*sin((20+10*sin(q1))*(x+.2*sin(q1*.77)))*bass*2; +per_pixel_3=sy = sy + 0.01 * bass_att; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion - Figure Eight.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion - Figure Eight.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion - Figure Eight.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion - Figure Eight.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=0.985000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.640223 +fWaveSmoothing=0.270000 +fWaveParam=0.600000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.040100 +rot=0.400000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.499900 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=3.200000 +nMotionVectorsY=3.000001 +mv_l=3.950000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.700000 +per_frame_1=dx = dx - .001; +per_frame_2=dy = dy - .001; +per_frame_3=warp = 0; +per_frame_4=wave_r = wave_r + .5*sin(time*.666); +per_frame_5=wave_g = wave_g + .5*sin(time*.777); +per_frame_6=wave_b = wave_b + .5*sin(time*.888); +per_frame_7=wave_r = wave_r + 0.5*sin(1.047*time); +per_frame_8=wave_g = wave_g - 0.5*cos(0.835*time); +per_frame_9=wave_b = wave_b + 0.5*cos(1.011*time); +per_frame_10=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_11=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_12=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_13=mv_a=mid_residual; +per_frame_14=mv_x=rand(30); +per_frame_15=mv_y=rand(30); +per_frame_16=mv_r=wave_b; +per_frame_17=mv_b=wave_g; +per_frame_18=mv_g=wave_r; +per_pixel_1=dx = .01*atan((rad)/.1*sin((x*y)*20+time*5)); +per_pixel_2=zoom = zoom + rad*.05; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion - Heavenly Eye.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion - Heavenly Eye.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion - Heavenly Eye.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion - Heavenly Eye.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,50 @@ +[preset00] +fGammaAdj=1.5000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +fDecay=0.980000 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +fWaveAlpha=0.800000 +fWaveScale=1.151736 +fWaveSmoothing=0.100000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=8.000000 +fWarpScale=1.331000 +fZoomExponent=15.000000 +fShader=0.000000 +zoom=1.280549 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.012485 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_frame_8=decay=decay-0.01*(frame%2); +per_pixel_1=zoom=(zoom-1)*rad+1; +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Clouded Bottle.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Clouded Bottle.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Clouded Bottle.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Clouded Bottle.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000001 +fDecay=0.999000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.254857 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=2.448629 +fWarpScale=67.165291 +fZoomExponent=0.132909 +fShader=1.000000 +zoom=0.970590 +rot=0.000000 +cx=2.000000 +cy=0.500000 +dx=0.020000 +dy=0.000000 +warp=0.029800 +sx=1.000000 +sy=1.010000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=1.000000 +wave_y=0.500000 +ob_size=0.300000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=0.000000 +nMotionVectorsX=8.000000 +nMotionVectorsY=1.920000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.500000 +per_frame_1=dx =dx -0.0005; +per_frame_2=dy = dy-0.0035; +per_frame_3=mv_l = 3000; +per_frame_4=mv_r = 0.5 + 0.499*sin(time*1.12); +per_frame_4=mv_g = 0.5 + 0.123*cos(time*1.83); +per_frame_5=mv_b = 0.4 + 0.79*cos(time*0.45); +per_frame_6=bass_effect = max(max(bass,bass_att)-1.3,0); +per_frame_7=decay = if(above(bass_effect,0),0.96,0.996); +per_frame_8=wave_x = 0.6+0.3*sin(time*0.724); +per_frame_9=warp = warp + (2*sin(0.75*time)); +per_frame_10=wrap_s = wrap_s +0.5*sin(0.1*time); +per_frame_9=wave_r = 0.5 + (sin(time/2) - cos(time*0.22))/2; +per_frame_10=wave_g = 0.5 - sin(time*0.877)/2; +per_frame_11=wave_b = 0.5 - cos(time)/2; +per_frame_13=dx = dx + dx_residual; +per_frame_14=dy = dy + dy_residual; +per_frame_15=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_16=dx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_17=dy_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Snowflake Delight.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Snowflake Delight.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Snowflake Delight.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Snowflake Delight.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000001 +fDecay=0.999000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.254857 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=2.448629 +fWarpScale=67.165291 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.030301 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.020000 +dy=0.000000 +warp=0.029800 +sx=1.000000 +sy=1.010000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=1.000000 +wave_y=0.500000 +ob_size=0.300000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=8.000000 +nMotionVectorsY=1.920000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.500000 +per_frame_1=dx =dx -0.0005; +per_frame_2=dy = dy-0.0035; +per_frame_3=mv_l = 3000; +per_frame_4=mv_r = 0.5+0.499*sin(time*1.12); +per_frame_5=mv_g = 0.199+0.8*sin(time); +per_frame_6=mv_g = 0.499+0.5*sin(time); +per_frame_7=bass_effect = max(max(bass,bass_att)-1.3,0); +per_frame_8=decay = if(above(bass_effect,0),0.96,0.996); +per_frame_9=wave_x = 0.6+0.3*sin(time*0.724); +per_frame_10=warp = warp + (2*sin(0.75*time)); +per_frame_11=wrap_s = wrap_s +0.5*sin(0.1*time); +per_frame_12=wave_r = wave_r + 0.150*( 0.60*sin(0.994*time) + 0.40*sin(0.941*time) ); +per_frame_13=wave_g = wave_g + 0.150*( 0.60*sin(0.990*time) + 0.40*sin(1.002*time) ); +per_frame_14=wave_b = wave_b + 0.150*( 0.60*sin(0.775*time) + 0.40*sin(1.071*time) ); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Snowflake Return.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Snowflake Return.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Snowflake Return.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Rovastar - Snowflake Return.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000001 +fDecay=0.999000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.254857 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=2.448629 +fWarpScale=67.165291 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.030301 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.020000 +dy=0.000000 +warp=0.029800 +sx=1.000000 +sy=1.010000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=1.000000 +wave_y=0.500000 +ob_size=0.300000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=8.000000 +nMotionVectorsY=1.920000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.500000 +per_frame_1=dx =dx -0.0005; +per_frame_2=dy = dy-0.0035; +per_frame_3=mv_l = 3000; +per_frame_4=mv_r = 0.5+0.499*sin(time*1.12); +per_frame_5=mv_b = 0.2 + 0.19*cos(time*0.45); +per_frame_6=bass_effect = max(max(bass,bass_att)-1.3,0); +per_frame_7=decay = if(above(bass_effect,0),0.96,0.996); +per_frame_8=wave_x = 0.6+0.3*sin(time*0.724); +per_frame_9=warp = warp + (2*sin(0.75*time)); +per_frame_10=wrap_s = wrap_s +0.5*sin(0.1*time); +per_frame_11=wave_b = wave_b + 0.5*sin(time); +per_frame_12=wave_r = wave_r + (bass - 0.5); +per_frame_13=dx = dx + dx_residual; +per_frame_14=dy = dy + dy_residual; +per_frame_15=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_16=dx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_17=dy_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/illusion & studio music - charged bliss.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/illusion & studio music - charged bliss.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/illusion & studio music - charged bliss.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/illusion & studio music - charged bliss.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.981000 +fVideoEchoZoom=1.008098 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.916265 +fWaveScale=0.999496 +fWaveSmoothing=0.666000 +fWaveParam=0.020000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=1.079900 +fWarpAnimSpeed=0.941900 +fWarpScale=0.712962 +fZoomExponent=0.999788 +fShader=0.830000 +zoom=1.006500 +rot=1.000000 +cx=1.280000 +cy=0.470000 +dx=0.000000 +dy=0.000000 +warp=1.728309 +sx=0.999600 +sy=0.999899 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.250000 +ob_g=0.650000 +ob_b=0.250000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.650000 +ib_g=0.250001 +ib_b=0.250001 +ib_a=1.000000 +nMotionVectorsX=26.719893 +nMotionVectorsY=48.000000 +mv_l=0.050000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=wave_r = sin(5*ff/bass)/2+0.5; +per_frame_2=wave_g = cos(ff/mid)/2+0.5; +per_frame_3=wave_b = cos(3*ff/treb)/2+0.5; +per_frame_4=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_7=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_8=ib_b = ib_b + 0.2*sin(time*0.4354); +per_frame_9=ob_r=wave_r; +per_frame_10=ob_g=wave_g; +per_frame_11=ob_b=wave_b; +per_frame_12=mv_x = lastingbass*30+24; +per_frame_13=mv_y= madtreb*48+8; +per_frame_14=mv_r = 0.7-bass_att; +per_frame_15=mv_b = 0.6-treb_att; +per_frame_16=mv_g = 0.5-mid_att; +per_frame_17=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.539*time) ); +per_frame_18=zoom=max(0.98, min(0.15+0.8*bass_att, 1.75 )); +per_frame_19=ff = frame/100; +per_frame_20=monitor = wave_r; +per_pixel_1=pre_zoom=zoom-.07*acos(y*2-1)*sin(time*1.2*q1)*zoom-.07*acos(x*2-1)*sin(time*1.1*q1); +per_pixel_2=zoom=if(above(abs(zoom-1),.04),pre_zoom,.99); +per_pixel_3=rot=if(above(abs(zoom-1),2),-.4+.2*q1,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Frozen Eye 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Frozen Eye 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Frozen Eye 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Frozen Eye 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.599179 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.850000 +fModWaveAlphaEnd=1.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=3.072695 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.410000 +wave_g=0.400000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=bass_on=if(above(bass_att,1.3),1,0); +per_frame_3=treb_on=if(above(treb_att,1.3),1,0); +per_frame_4=state = 1 + bass; +per_frame_5=wave_r = wave_r + 0.25*(0.6*sin(0.784*time) + 0.4*sin(0.986*time))*state; +per_frame_6=wave_g = wave_g + 0.25*(0.6*sin(0.671*time) + 0.4*sin(1.164*time))*(4-state); +per_frame_7=wave_b = wave_b + 0.25*(0.6*sin(1.423*time) + 0.4*sin(0.687*time))*(4/state); +per_frame_8=wave_y=if(equal(state,1),wave_y+rand(10)*.1*sin(time*3),wave_y); +per_frame_9=bass_effect = if(above(bass_att,1.4),pow(1.1,bass_att),1); +per_frame_10=treb_effect = if(above(treb_att,1.4),pow(0.97,treb_att),1); +per_frame_11=net_effect = if(above(bass_att,0.8*treb_att),bass_effect,treb_effect); +per_frame_12=zoom = 0.99 * net_effect; +per_frame_13=rot = 0.03 * net_effect * sin(time); +per_frame_14=wave_size=6*state + 3; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Invade My Mind.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Invade My Mind.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Invade My Mind.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Invade My Mind.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,110 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.976000 +fVideoEchoZoom=1.028414 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.818016 +fWaveScale=1.028415 +fWaveSmoothing=0.090000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995700 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000206 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.424100 +sx=1.000000 +sy=1.000000 +wave_r=0.200000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.060000 +ob_r=0.800000 +ob_g=0.300000 +ob_b=0.800000 +ob_a=1.000000 +ib_size=0.050000 +ib_r=0.200000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=old_bass_flop=bass_flop; +per_frame_2=old_treb_flop=treb_flop; +per_frame_3=old_mid_flop=mid_flop; +per_frame_4=chaos=.9+.1*sin(pulse); +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_6=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_7=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_8=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_9=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_10=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_11=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_12=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_13=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_14=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_15=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_16=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_17=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.0035); +per_frame_18=entropy=if(bass_changed*mid_changed*treb_changed,(1+bass_flop+treb_flop+mid_flop)*(1+rand(3)),entropy); +per_frame_19=q1=mid_residual; +per_frame_20=q2=bass_residual; +per_frame_21=q3=treb_residual; +per_frame_22=q4=sin(pulse); +per_frame_23=q5=cos(pulse*(.5+.1*entropy)); +per_frame_24=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_25=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_26=q8=entropy; +per_frame_27=wave_r=wave_r+wave_r*sin(q4+q5); +per_frame_28=wave_b=wave_b+wave_b*q2*sin(q3); +per_frame_29=wave_g=wave_g+wave_g*q2; +per_frame_30=ob_r=ob_r+ob_r*sin(q1+q2*2.14); +per_frame_31=ob_bob_b+ob_b*sin(q2+q3*2.14); +per_frame_32=ob_g=ob_g+ob_g*sin(q3+q1*2.14); +per_frame_33=ib_r=ib_r+ib_r*cos(q5+q1*2.14); +per_frame_34=ib_b=ib_b+ib_*cos(q5+q2*2.14); +per_frame_35=ib_g=ib_g+ib_g*cos(q5+q3*2.14); +per_frame_36=wave_mystery=.5*q6; +per_frame_37=warp=0; +per_frame_38=ob_size = 0.070 + (bass+mid)/24 + bass_att/30; +per_frame_39=ib_size = ob_size / 4; +per_pixel_1=zoom=zoom+.10*sin(q4+time+ang+rad); +per_pixel_2=rot=if(above(bnot(1*q4),bnot(1*q3*.24)),rot*sin(rad*sin(q4*.54)),-rot*sin(rad*cos(q4*. +per_pixel_3=34)))*Sin(Bass*.43)*sin(time*.13)*sin(q4*.54); +per_pixel_4=sx=sx+.2*sqrt(sin(x))*sin(q3)*sin(q4*.42)*sin(q1*.65); +per_pixel_5=sy=sy-.2*sqrt(sin(y))*cos(q3*q1)*Sin(above(q3,q3+.4)*.54)*sin(q4*above(q3,q2)*.54); +per_pixel_6=dx=rot*sin(q4+q3)*Y*sin(above(q2,q4*.12))*x*sin(q3*.53)*sin(q5*.43); +per_pixel_7=dy=-rot*sin(q3)*x*Sin(above(q3,q5)*.53)*y*sin(above(q4,q1)*-.12)*sin(above(q1,q3)*.23);; +per_pixel_8=cx = cx + 4 * sin(0.128 * q3); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Re-Enter Homeworld.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Re-Enter Homeworld.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Re-Enter Homeworld.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Illusion & Unchained - Re-Enter Homeworld.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,102 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.993000 +fVideoEchoZoom=3.047823 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.217956 +fWaveScale=0.568168 +fWaveSmoothing=0.072000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999900 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.600000 +dy=0.600000 +warp=1.000000 +sx=1.020100 +sy=1.020100 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.500000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.500000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.97+.03*sin(beat); +per_frame_6=entropy=if(bnot(entropy),1,if(equal(pulse,-3.14),entropy+sin(beat),entropy)); +per_frame_7=bass_thresh = above(bass,bass_thresh)*2 + (1-above(bass,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb,treb_thresh)*2 + (1-above(treb,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid,mid_thresh)*2 + (1-above(mid,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.016); +per_frame_20=beat=if(above(abs(beat),3.14),-3.14,beat+(bass+treb+mid)*.01*entropy); +per_frame_21=q1=mid_residual; +per_frame_22=q2=bass_residual; +per_frame_23=q3=treb_residual; +per_frame_24=q4=sin(pulse); +per_frame_25=q5=sin(beat); +per_frame_26=wave_r=wave_r+cos(time*q3)*.5; +per_frame_27=wave_b=wave_b+cos(time*q1)*.5; +per_frame_28=wave_g=wave_g+cos(time*q2)*.5; +per_frame_29=ob_r=.5+.5*q2; +per_frame_30=ob_b=.5+.5*-q2; +per_frame_31=ob_g=.5+.5*q3; +per_frame_32=ib_r=.5+.3*q2; +per_frame_33=ib_g=.6+.1*q3; +per_frame_34=dx=.01*q4; +per_frame_35=dy=.01*q5; +per_frame_36=zoom=zoom+.03*q1; +per_frame_37=ib_size=.25+.25*q2; +per_frame_38=ob_size=.25+.25*q3; +per_frame_39=ib_a=.04+.03*sin(time+q5); +per_frame_40=ob_a=.04+.03*cos(time+q5); +per_pixel_1=grid=bor(above(x,.5)*above(y,.5),below(x,.5)*below(y,.5)); +per_pixel_2=zoom=if(bor(grid*above(q1,0),bnot(grid)*below(q1,0)),zoom-.1*cos((x-.5)*6.2+q3),zoom+.1*sin(rad*3.14+q2)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/[Ishan] - Life in the drains.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/[Ishan] - Life in the drains.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/[Ishan] - Life in the drains.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/[Ishan] - Life in the drains.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,235 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.965000 +fVideoEchoZoom=0.999996 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=2 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.074097 +fWaveSmoothing=0.630000 +fWaveParam=0.540000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.065000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.580000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=wave_b1=wave_b1+if(above(bass_att,0),bass_att,-bass_att); +per_frame_2=wave_r=wave_r+(sin(time*1.43)*wave_b1)*.5; +per_frame_3=wave_g=wave_g+(cos(time*1.73)*wave_b1)*.5; +per_frame_4=wave_b=wave_b-(sin(time*2.03)*wave_b1)*.5; +per_frame_5=wave_mystery=sin((time+bass_att)*.5); +per_frame_6=wave_thick=1; +per_frame_7=rot=rot-wave_mystery*.1; +per_frame_8=wave_x1=wave_x1+.1; +per_frame_9=wave_y1=wave_y1-.1; +per_frame_10=decay = decay - 0.01*equal(frame%50,0); +per_frame_11=ob_r=sin(wave_r+time); +per_frame_12=ob_g=cos(wave_g+time); +per_frame_13=ob_b=sin(wave_b-time); +per_frame_14=gamma=2; +per_frame_15= +per_frame_16= +per_frame_17= +per_frame_18= +per_frame_19= +per_frame_20= +per_frame_21= +per_frame_22= +per_frame_23= +per_pixel_1=zoom=sin(zoom*1.3)-.1; +per_pixel_2=rot=rot+sin(rad*(zoom+sqr(rad)))*.1; +per_pixel_3= +per_pixel_4= +per_pixel_5= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Jess - Trying To Trap A Twister.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Jess - Trying To Trap A Twister.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Jess - Trying To Trap A Twister.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Jess - Trying To Trap A Twister.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,89 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.993000 +fVideoEchoZoom=0.996620 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.264366 +fWaveScale=0.264076 +fWaveSmoothing=0.720000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.300000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.061520 +sy=1.061520 +wave_r=1.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=1.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=1.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=entropy=if(bnot(entropy),2,if(equal(pulse,-9.42),1+rand(3),entropy)); +per_frame_3=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_4=bass_changed=abs(bass_flop-equal(bass_thresh,2)); +per_frame_5=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_6=treb_changed=abs(treb_flop-equal(treb_thresh,2)); +per_frame_7=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_8=mid_changed=abs(mid_flop-equal(mid_thresh,2)); +per_frame_9=bass_residual = bass_changed*sin(pulse*bass_thresh*.2*entropy) + bnot(bass_changed)*bass_residual; +per_frame_10=treb_residual = treb_changed*sin(pulse*treb_thresh*.2*entropy) + bnot(treb_changed)*treb_residual; +per_frame_11=mid_residual = mid_changed*sin(pulse*mid_thresh*.2*entropy) + bnot(mid_changed)*mid_residual; +per_frame_12=pulse=if(above(abs(pulse),9.42),-9.42,pulse+.1*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed)+(mid+bass+treb)*entropy*.01); +per_frame_13=q1=mid_residual; +per_frame_14=q2=bass_residual; +per_frame_15=q3=treb_residual; +per_frame_16=q4=sin(pulse); +per_frame_17=q5=cos(pulse); +per_frame_18=wave_mystery=-.2+.2*q4; +per_frame_19=wave_r=wave_r+.5*bass_residual; +per_frame_20=zoom=zoom-.0035*q1; +per_frame_21=decay=decay+.003*sin(pulse); +per_pixel_1=anti_rad=(1-rad); +per_pixel_2=dx=if(below(sin(rad*10*q5),abs(q5)),.02*q1,.025*q2); +per_pixel_3=dy=dy-cos(anti_rad*10*q3-rad*10*q5+rad*10*q4)*.05; +per_pixel_4=zoom=zoom+(dy-1)*(dx-1)*q1*.07; +per_pixel_5=rot=rot+atan(anti_rad*3.14*q3)*abs(zoom-1.2)*above(q2,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - 3D Shapes Demo 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - 3D Shapes Demo 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - 3D Shapes Demo 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - 3D Shapes Demo 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,291 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.000000 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=0.463735 +wavecode_0_smoothing=0.000000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_init1=//pi +wave_0_init2=t8=3.14159265; +wave_0_init3=t5 = 1; +wave_0_per_frame1=rotx = rotx+bass; +wave_0_per_frame2=roty = roty+mid; +wave_0_per_frame3=rotz = rotz+treb; +wave_0_per_frame4=//rotx =0; +wave_0_per_frame5=//roty =0; +wave_0_per_frame6=//rotz =0; +wave_0_per_frame7= +wave_0_per_frame8=//convert rotation values from degrees to radians +wave_0_per_frame9=t1= t8*rotx/180; +wave_0_per_frame10=t2 = t8*roty/180; +wave_0_per_frame11=t3 = t8*rotz/180; +wave_0_per_frame12= +wave_0_per_point1=//Define 3D Shape +wave_0_per_point2= +wave_0_per_point3=//Torus +wave_0_per_point4=x0 = (1+value1)*sin(2*t8*sample); +wave_0_per_point5=y0 = (1+value1)*cos(2*t8*sample); +wave_0_per_point6=x1 = 0.5*sin(32*t8*sample)*y0+y0; +wave_0_per_point7=y1 = 0.5*sin(32*t8*sample)*x0+x0; +wave_0_per_point8=z1= 0.5*cos(32*t8*sample); +wave_0_per_point9= +wave_0_per_point10=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_0_per_point11=y2 = y1*cos(t1)-z1*sin(t1); +wave_0_per_point12=z2 = y1*sin(t1)+z1*cos(t1); +wave_0_per_point13=x2 = z2*sin(t2)+x1*cos(t2); +wave_0_per_point14=z3 = z2*cos(t2)-x1*sin(t2); +wave_0_per_point15=x3 = x2*cos(t3)-y2*sin(t3); +wave_0_per_point16=y3 = y2*cos(t3)+x2*sin(t3); +wave_0_per_point17=//move resulting shape in 3d space +wave_0_per_point18=x4 = x3; +wave_0_per_point19=y4 = y3; +wave_0_per_point20=z4 = z3+2; +wave_0_per_point21=//draw 3d shape in 2d +wave_0_per_point22=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_0_per_point23=y=0.5+0.5*(y4/(1+z4*0.5)); +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=0.463735 +wavecode_1_smoothing=0.000000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_init1=//pi +wave_1_init2=t8=3.14159265; +wave_1_init3=t5 = 1; +wave_1_per_frame1=rotx = rotx+bass; +wave_1_per_frame2=roty = roty+mid; +wave_1_per_frame3=rotz = rotz+treb; +wave_1_per_frame4=//rotx = 0; +wave_1_per_frame5=//roty =0; +wave_1_per_frame6=//rotz = 0; +wave_1_per_frame7= +wave_1_per_frame8=//convert rotation values from degrees to radians +wave_1_per_frame9=t1= t8*rotx/180; +wave_1_per_frame10=t2 = t8*roty/180; +wave_1_per_frame11=t3 = t8*rotz/180; +wave_1_per_frame12= +wave_1_per_frame13=t4 = 3*sin(time+0.66*t8); +wave_1_per_frame14=t5 = 10+8*cos(time+0.66*t8); +wave_1_per_frame15= +wave_1_per_frame16=b = 0.5-0.4*cos(time+0.66*t8); +wave_1_per_frame17=g = 0.5-0.4*sin(time+0.66*t8); +wave_1_per_point1=//Define 3D Shape +wave_1_per_point2= +wave_1_per_point3=//Sphere +wave_1_per_point4=x1 = (1+value1)*sin(t8*sample)*sin(16*t8*sample); +wave_1_per_point5=y1 = (1+value1)*cos(t8*sample); +wave_1_per_point6=z1= (1+value1)*sin(t8*sample)*cos(16*t8*sample); +wave_1_per_point7= +wave_1_per_point8=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_1_per_point9=y2 = y1*cos(t1)-z1*sin(t1); +wave_1_per_point10=z2 = y1*sin(t1)+z1*cos(t1); +wave_1_per_point11=x2 = z2*sin(t2)+x1*cos(t2); +wave_1_per_point12=z3 = z2*cos(t2)-x1*sin(t2); +wave_1_per_point13=x3 = x2*cos(t3)-y2*sin(t3); +wave_1_per_point14=y3 = y2*cos(t3)+x2*sin(t3); +wave_1_per_point15=//move resulting shape in 3d space +wave_1_per_point16=x4 = x3+t4; +wave_1_per_point17=y4 = y3; +wave_1_per_point18=z4 = z3+t5; +wave_1_per_point19=//draw 3d shape in 2d +wave_1_per_point20=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_1_per_point21=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_1_per_point22= +wave_1_per_point23=r = g+value1; +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=0.463735 +wavecode_2_smoothing=0.000000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_init1=//pi +wave_2_init2=t8=3.14159265; +wave_2_init3=t5 = 1; +wave_2_per_frame1=rotx = rotx+bass; +wave_2_per_frame2=roty = roty+mid; +wave_2_per_frame3=rotz = rotz+treb; +wave_2_per_frame4=//rotx = 0; +wave_2_per_frame5=//roty =0; +wave_2_per_frame6=//rotz = 0; +wave_2_per_frame7= +wave_2_per_frame8=//convert rotation values from degrees to radians +wave_2_per_frame9=t1= t8*rotx/180; +wave_2_per_frame10=t2 = t8*roty/180; +wave_2_per_frame11=t3 = t8*rotz/180; +wave_2_per_frame12= +wave_2_per_frame13=t4 = 3*sin(time+1.33*t8); +wave_2_per_frame14=t5 = 10+8*cos(time+1.33*t8); +wave_2_per_frame15= +wave_2_per_frame16=r = 0.5-0.4*cos(time+1.33*t8); +wave_2_per_frame17=b = 0.5-0.4*sin(time+1.33*t8); +wave_2_per_point1=//Define 3D Shape +wave_2_per_point2= +wave_2_per_point3=//Cube +wave_2_per_point4=x0 = if(below(sample*12,1),sample*12, if(below(sample*12,2),1, if(below(sample*12,3),abs(sample*12-3), if(below(sample*12,6),0, if(below(sample*12,8),1, if(below(sample*12,9),abs(sample*12-9), if(below(sample*12,10),0, if(below(sample*12,11),sample*12-10,1)))))))); +wave_2_per_point5=y0 = if(below(sample*12,1),0, if(below(sample*12,2),sample*12-1, if(below(sample*12,3),1, if(below(sample*12,4),abs(sample*12-4), if(below(sample*12,5),0, if(below(sample*12,7),1, if(below(sample*12,9),0, if(below(sample*12,10),sample*12-9, if(below(sample*12,11),1,abs(sample*12-12)))))))))); +wave_2_per_point6=z0 = if(below(sample*12,4),0, if(below(sample*12,5),sample*12-4, if(below(sample*12,6),abs(sample*12-6), if(below(sample*12,7),sample*12-6, if(below(sample*12,8),abs(sample*12-8),1))))); +wave_2_per_point7=x1 = 0.5-x0+if(below(sin(sample*12*3.1415),0),value1,0); +wave_2_per_point8=y1 = 0.5-y0+if(below(cos((sample*12-1.5)*3.1415),0),value1,0); +wave_2_per_point9=z1 = 0.5-z0+if(below(sample*12,4),0,if(below(sample*12,8),value1,0)); +wave_2_per_point10= +wave_2_per_point11=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_2_per_point12=y2 = y1*cos(t1)-z1*sin(t1); +wave_2_per_point13=z2 = y1*sin(t1)+z1*cos(t1); +wave_2_per_point14=x2 = z2*sin(t2)+x1*cos(t2); +wave_2_per_point15=z3 = z2*cos(t2)-x1*sin(t2); +wave_2_per_point16=x3 = x2*cos(t3)-y2*sin(t3); +wave_2_per_point17=y3 = y2*cos(t3)+x2*sin(t3); +wave_2_per_point18=//move resulting shape in 3d space +wave_2_per_point19=x4 = x3+t4; +wave_2_per_point20=y4 = y3; +wave_2_per_point21=z4 = z3+t5; +wave_2_per_point22=//draw 3d shape in 2d +wave_2_per_point23=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_2_per_point24=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_2_per_point25= +wave_2_per_point26=g = b+value1; +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +per_frame_1=warp=0; +per_frame_2=wave_a=0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - 3D Shapes Demo.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - 3D Shapes Demo.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - 3D Shapes Demo.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - 3D Shapes Demo.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,296 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.000000 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=0.463735 +wavecode_0_smoothing=0.000000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_init1=//pi +wave_0_init2=t8=3.14159265; +wave_0_init3=t5 = 1; +wave_0_per_frame1=rotx = rotx+bass; +wave_0_per_frame2=roty = roty+mid; +wave_0_per_frame3=rotz = rotz+treb; +wave_0_per_frame4=//rotx = 0; +wave_0_per_frame5=//roty =0; +wave_0_per_frame6=//rotz = 0; +wave_0_per_frame7= +wave_0_per_frame8=//convert rotation values from degrees to radians +wave_0_per_frame9=t1= t8*rotx/180; +wave_0_per_frame10=t2 = t8*roty/180; +wave_0_per_frame11=t3 = t8*rotz/180; +wave_0_per_frame12= +wave_0_per_frame13=t4 = 3*sin(time); +wave_0_per_frame14=t5 = 10+8*cos(time); +wave_0_per_frame15= +wave_0_per_frame16=g = 0.5-0.4*cos(time); +wave_0_per_frame17=r = 0.5-0.4*sin(time); +wave_0_per_point1=//Define 3D Shape +wave_0_per_point2= +wave_0_per_point3=//Spiral +wave_0_per_point4=x1 = 0.5*sin(8*sample); +wave_0_per_point5=y1 = 2*(sample-0.5)-value1; +wave_0_per_point6=z1= 0.5*cos(8*sample); +wave_0_per_point7= +wave_0_per_point8=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_0_per_point9=y2 = y1*cos(t1)-z1*sin(t1); +wave_0_per_point10=z2 = y1*sin(t1)+z1*cos(t1); +wave_0_per_point11=x2 = z2*sin(t2)+x1*cos(t2); +wave_0_per_point12=z3 = z2*cos(t2)-x1*sin(t2); +wave_0_per_point13=x3 = x2*cos(t3)-y2*sin(t3); +wave_0_per_point14=y3 = y2*cos(t3)+x2*sin(t3); +wave_0_per_point15=//move resulting shape in 3d space +wave_0_per_point16=x4 =x3 + t4; +wave_0_per_point17=y4 = y3; +wave_0_per_point18=z4 = z3+t5; +wave_0_per_point19=//draw 3d shape in 2d +wave_0_per_point20=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_0_per_point21=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_0_per_point22=//x=(0.5)*sin(8*sample*t8); +wave_0_per_point23=b= r+value1; +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=0.463735 +wavecode_1_smoothing=0.000000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_init1=//pi +wave_1_init2=t8=3.14159265; +wave_1_init3=t5 = 1; +wave_1_per_frame1=rotx = rotx+bass; +wave_1_per_frame2=roty = roty+mid; +wave_1_per_frame3=rotz = rotz+treb; +wave_1_per_frame4=//rotx = 0; +wave_1_per_frame5=//roty =0; +wave_1_per_frame6=//rotz = 0; +wave_1_per_frame7= +wave_1_per_frame8=//convert rotation values from degrees to radians +wave_1_per_frame9=t1= t8*rotx/180; +wave_1_per_frame10=t2 = t8*roty/180; +wave_1_per_frame11=t3 = t8*rotz/180; +wave_1_per_frame12= +wave_1_per_frame13=t4 = 3*sin(time+0.66*t8); +wave_1_per_frame14=t5 = 10+8*cos(time+0.66*t8); +wave_1_per_frame15= +wave_1_per_frame16=b = 0.5-0.4*cos(time+0.66*t8); +wave_1_per_frame17=g = 0.5-0.4*sin(time+0.66*t8); +wave_1_per_point1=//Define 3D Shape +wave_1_per_point2= +wave_1_per_point3=//Sphere +wave_1_per_point4=x1 = (1+value1)*sin(t8*sample)*sin(16*t8*sample); +wave_1_per_point5=y1 = (1+value1)*cos(t8*sample); +wave_1_per_point6=z1= (1+value1)*sin(t8*sample)*cos(16*t8*sample); +wave_1_per_point7= +wave_1_per_point8=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_1_per_point9=y2 = y1*cos(t1)-z1*sin(t1); +wave_1_per_point10=z2 = y1*sin(t1)+z1*cos(t1); +wave_1_per_point11=x2 = z2*sin(t2)+x1*cos(t2); +wave_1_per_point12=z3 = z2*cos(t2)-x1*sin(t2); +wave_1_per_point13=x3 = x2*cos(t3)-y2*sin(t3); +wave_1_per_point14=y3 = y2*cos(t3)+x2*sin(t3); +wave_1_per_point15=//move resulting shape in 3d space +wave_1_per_point16=x4 = x3+t4; +wave_1_per_point17=y4 = y3; +wave_1_per_point18=z4 = z3+t5; +wave_1_per_point19=//draw 3d shape in 2d +wave_1_per_point20=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_1_per_point21=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_1_per_point22= +wave_1_per_point23=r = g+value1; +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=0.463735 +wavecode_2_smoothing=0.000000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_init1=//pi +wave_2_init2=t8=3.14159265; +wave_2_init3=t5 = 1; +wave_2_per_frame1=rotx = rotx+bass; +wave_2_per_frame2=roty = roty+mid; +wave_2_per_frame3=rotz = rotz+treb; +wave_2_per_frame4=//rotx = 0; +wave_2_per_frame5=//roty =0; +wave_2_per_frame6=//rotz = 0; +wave_2_per_frame7= +wave_2_per_frame8=//convert rotation values from degrees to radians +wave_2_per_frame9=t1= t8*rotx/180; +wave_2_per_frame10=t2 = t8*roty/180; +wave_2_per_frame11=t3 = t8*rotz/180; +wave_2_per_frame12= +wave_2_per_frame13=t4 = 3*sin(time+1.33*t8); +wave_2_per_frame14=t5 = 10+8*cos(time+1.33*t8); +wave_2_per_frame15= +wave_2_per_frame16=r = 0.5-0.4*cos(time+1.33*t8); +wave_2_per_frame17=b = 0.5-0.4*sin(time+1.33*t8); +wave_2_per_point1=//Define 3D Shape +wave_2_per_point2= +wave_2_per_point3=//Cube +wave_2_per_point4=x0 = if(below(sample*12,1),sample*12, if(below(sample*12,2),1, if(below(sample*12,3),abs(sample*12-3), if(below(sample*12,6),0, if(below(sample*12,8),1, if(below(sample*12,9),abs(sample*12-9), if(below(sample*12,10),0, if(below(sample*12,11),sample*12-10,1)))))))); +wave_2_per_point5=y0 = if(below(sample*12,1),0, if(below(sample*12,2),sample*12-1, if(below(sample*12,3),1, if(below(sample*12,4),abs(sample*12-4), if(below(sample*12,5),0, if(below(sample*12,7),1, if(below(sample*12,9),0, if(below(sample*12,10),sample*12-9, if(below(sample*12,11),1,abs(sample*12-12)))))))))); +wave_2_per_point6=z0 = if(below(sample*12,4),0, if(below(sample*12,5),sample*12-4, if(below(sample*12,6),abs(sample*12-6), if(below(sample*12,7),sample*12-6, if(below(sample*12,8),abs(sample*12-8),1))))); +wave_2_per_point7=x1 = 0.5-x0+if(below(sin(sample*12*3.1415),0),value1,0); +wave_2_per_point8=y1 = 0.5-y0+if(below(cos((sample*12-1.5)*3.1415),0),value1,0); +wave_2_per_point9=z1 = 0.5-z0+if(below(sample*12,4),0,if(below(sample*12,8),value1,0)); +wave_2_per_point10= +wave_2_per_point11=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_2_per_point12=y2 = y1*cos(t1)-z1*sin(t1); +wave_2_per_point13=z2 = y1*sin(t1)+z1*cos(t1); +wave_2_per_point14=x2 = z2*sin(t2)+x1*cos(t2); +wave_2_per_point15=z3 = z2*cos(t2)-x1*sin(t2); +wave_2_per_point16=x3 = x2*cos(t3)-y2*sin(t3); +wave_2_per_point17=y3 = y2*cos(t3)+x2*sin(t3); +wave_2_per_point18=//move resulting shape in 3d space +wave_2_per_point19=x4 = x3+t4; +wave_2_per_point20=y4 = y3; +wave_2_per_point21=z4 = z3+t5; +wave_2_per_point22=//draw 3d shape in 2d +wave_2_per_point23=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_2_per_point24=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_2_per_point25= +wave_2_per_point26=g = b+value1; +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +per_frame_1=warp=0; +per_frame_2=wave_a=0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash and Fvese - Molten Indecision (Fvese Remix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash and Fvese - Molten Indecision (Fvese Remix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash and Fvese - Molten Indecision (Fvese Remix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash and Fvese - Molten Indecision (Fvese Remix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,107 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=6.000000 +fWaveSmoothing=0.000000 +fWaveParam=-0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.950000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.800000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.060000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=dx=-0.0005; +per_frame_3=dy=-0.0005; +per_frame_4=drip1grav = if(above(drip1y,1.2),0.001*(1+rand(10)),drip1grav) + equal(drip1grav,0)*0.05; +per_frame_5=drip1x = if(above(drip1y,1.2),0.01*rand(100),drip1x); +per_frame_6=drip1y = if(above(drip1y,1.2),0,drip1y); +per_frame_7=drip2grav = if(above(drip2y,1.2),0.001*(1+rand(10)),drip2grav) + equal(drip2grav,0)*0.06; +per_frame_8=drip2x = if(above(drip2y,1.2),0.01*rand(100),drip2x); +per_frame_9=drip2y = if(above(drip2y,1.2),0,drip2y); +per_frame_10=drip3grav = if(above(drip3y,1.2),0.001*(1+rand(10)),drip3grav) + equal(drip3grav,0)*0.07; +per_frame_11=drip3x = if(above(drip3y,1.2),0.01*rand(100),drip3x); +per_frame_12=drip3y = if(above(drip3y,1.2),0,drip3y); +per_frame_13=drip4grav = if(above(drip4y,1.2),0.001*(1+rand(10)),drip4grav) + equal(drip4grav,0)*0.08; +per_frame_14=drip4x = if(above(drip4y,1.2),0.01*rand(100),drip4x); +per_frame_15=drip4y = if(above(drip4y,1.2),0,drip4y); +per_frame_16=drip1y = 0.001 + drip1y + drip1grav; +per_frame_17=drip2y = 0.001 + drip2y + drip2grav; +per_frame_18=drip3y = 0.001 + drip3y + drip3grav; +per_frame_19=drip4y = 0.001 + drip4y + drip4grav; +per_frame_20=q1 = if(equal(frame%4,0),drip1x,if(equal(frame%4,1),drip2x,if(equal(frame%4,2),drip3x,drip4x))); +per_frame_21=q2 = if(equal(frame%4,0),drip1y,if(equal(frame%4,1),drip2y,if(equal(frame%4,2),drip3y,drip4y))); +per_frame_22=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_23=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_24=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_25=vol = (bass+mid+att)/6; +per_frame_26=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_27=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_28=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_29=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_30=xpos = xpos + 0.001*xspeed; +per_frame_31=wave_x = xpos + 0.5; +per_frame_32=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_33=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_34=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_35=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_36=ypos = ypos + 0.001*yspeed; +per_frame_37=wave_y = ypos + 0.5; +per_frame_38=rot = rot + 0.01*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_39=cx = cx + 0.410*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_40=cy = cy + 0.410*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_41=dy = dy + 0.002*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_42=wave_mystery = wave_mystery + 0.15*( 0.60*sin(0.629*time) + 0.40*sin(1.826*time) ); +per_frame_43=warp = warp*vol+treb_att; +per_frame_44=dy = dy + above(bass_att,1.2)*bass_att*0.003; +per_frame_45=ob_a = ob_a - 2*vol; +per_pixel_1=dy = dy + if(below(abs(q1-x),0.01),if(below(y,q2),max(0.02-abs(q1-x),0),0.001),0.001); +per_pixel_2=zoom=zoom+0.07*sin(rad*9*time*2.5); +per_pixel_3=rot=if(below(rad,bass_factor),sin(time*.3+ang*8+rad*7.5)*.063,rot); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash and Rovastar - Rainbow Orb.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash and Rovastar - Rainbow Orb.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash and Rovastar - Rainbow Orb.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash and Rovastar - Rainbow Orb.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=5.000000 +fGammaAdj=2.000000 +fDecay=0.975000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=64 +nMotionVectorsY=1 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.108925 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.850000 +fModWaveAlphaEnd=1.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.400000 +wave_g=0.400000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +per_frame_1=warp=0; +per_frame_2=dx=-0.0005; +per_frame_3=dy=-0.0005; +per_frame_4=wave_x = 0.5+0.3*sin(bass+treb+mid); +per_frame_5=wave_r = 1 + sin(-wave_x*6.28); +per_frame_6=wave_g = abs(sin(2*wave_x*6.28)); +per_frame_7=wave_b = sin(wave_x*6.28); +per_frame_8=treb_effect = if(above(treb_att,1.4),pow(0.99,treb_att),1); +per_frame_9=net_effect = if(above(bass_att,0.8*treb_att),1,treb_effect); +per_frame_10=zoom = net_effect*1.065; +per_frame_11=rot = rot + rot_residual; +per_frame_12=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_13=shift = (tan(time*7)) -0.05; +per_frame_14=shift = if(above(shift,0),0,if(below(shift,-0.1),-0.1,shift)); +per_frame_15=rot_residual = if(equal(bass_thresh,2),shift,rot_residual); +per_pixel_1=rot = rot + if(equal(sin(ang), 0), rot, sin(1-rad)/2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Digital Flame.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Digital Flame.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Digital Flame.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Digital Flame.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=2 +fGammaAdj=2 +fDecay=0.9 +fVideoEchoZoom=1 +fVideoEchoAlpha=0 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1 +fWaveScale=0.3697 +fWaveSmoothing=0.75 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=53.523884 +fWarpScale=0.408391 +fZoomExponent=1 +fShader=0 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=1 +sx=1 +sy=1 +wave_r=0.6999 +wave_g=0.6 +wave_b=0.8 +wave_x=0 +wave_y=0.5 +ob_size=0 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=0 +ib_size=0 +ib_r=0 +ib_g=0 +ib_b=0 +ib_a=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +mv_l=0.9 +mv_r=1 +mv_g=1 +mv_b=1 +mv_a=0 +per_frame_1=q1 = (bass_att + mid_att + treb_att) /3; +per_frame_2=q2 = time + 1000; +per_frame_3=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.4)*0.95+1.4); +per_frame_4=treb_thresh = above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.5)*0.85+1.2); +per_frame_5=bass_on = above(bass_thresh,1.9); +per_frame_6=treb_on = above(treb_thresh,1.9); +per_frame_7=swapcolour = bass_on - treb_on; +per_frame_8=red_aim = if(equal(swapcolour,1),1,if(equal(swapcolour,0),0.9,0.7)); +per_frame_9=green_aim = if(equal(swapcolour,1),0.7,if(equal(swapcolour,0),0.3,0.6)); +per_frame_10=blue_aim = if(equal(swapcolour,1),0,if(equal(swapcolour,0),0.2,0.8)); +per_frame_11=red = red + (red_aim - red)*0.5; +per_frame_12=green = green + (green_aim - green)*0.5; +per_frame_13=blue = blue + (blue_aim - blue)*0.5; +per_frame_14=wave_r = red; +per_frame_15=wave_g = green; +per_frame_16=wave_b = blue; +per_pixel_1=dy = -0.1*(q1-1)*log(2-(abs(y*2 - 1.8))); +per_pixel_2=dy = below(dy,0.02)*dy - 0.02; +per_pixel_3=dy = dy + 0.01*(sin((x*q2*0.483) + (y*q2*1.238)) + sin((x*q2*1.612) + (y*q2*0.648))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Dynamic Borders 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Dynamic Borders 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Dynamic Borders 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Dynamic Borders 1.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,86 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.700000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.634243 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999990 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.380000 +ob_size=0.020000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.050000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.100000 +per_frame_1=warp = 0; +per_frame_2= +per_frame_3=ib_r = ib_r + 0.10*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_4=ib_g = ib_g + 0.10*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_5=ib_b = ib_b + 0.10*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_6=temp = 0.12*tan(0.3*(mid+bass)); +per_frame_7=ib_a = if(below(temp,0.4),temp,0.4); +per_frame_8=ob_size = ob_size - 0.01; +per_frame_9=ob_size = ob_size + 0.15*sin(0.5*bass_att); +per_frame_10=q1 = (cx*2-1) + 0.62*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_11=q2 = (cy*2-1) + 0.62*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_12=q3 = (cx*2-1) + 0.62*( 0.60*sin(0.174*-time) + 0.40*sin(0.364*time) ); +per_frame_13=q4 = (cy*2-1) + 0.62*( 0.60*sin(0.234*time) + 0.40*sin(0.271*-time) ); +per_frame_14=decay = decay - 0.01*equal(frame%5,0); +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.008/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +per_pixel_15=dx = dx*1.5; +per_pixel_16=dy = dy*1.5; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Framed Geometry.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Framed Geometry.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Framed Geometry.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Framed Geometry.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,360 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.990000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.369711 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.800000 +ob_size=0.500000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.010000 +ib_size=0.500000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.010000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=-0.122860 +mv_dy=0.400769 +mv_l=0.055000 +mv_r=0.068206 +mv_g=0.020766 +mv_b=0.516542 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=0.463735 +wavecode_0_smoothing=0.000000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_init1=//pi +wave_0_init2=t8=3.14159265; +wave_0_init3=t5 = 1; +wave_0_per_frame1=rotx = rotx+bass; +wave_0_per_frame2=roty = roty+mid; +wave_0_per_frame3=rotz = rotz+treb; +wave_0_per_frame4=//rotx = 0; +wave_0_per_frame5=//roty =0; +wave_0_per_frame6=//rotz = 0; +wave_0_per_frame7= +wave_0_per_frame8=//convert rotation values from degrees to radians +wave_0_per_frame9=t1= t8*rotx/180; +wave_0_per_frame10=t2 = t8*roty/180; +wave_0_per_frame11=t3 = t8*rotz/180; +wave_0_per_frame12= +wave_0_per_frame13=t4 = 4*sin(q1); +wave_0_per_frame14=t5 = 10+8*cos(q1); +wave_0_per_frame15= +wave_0_per_frame16=g = 0.5-0.3*cos(time); +wave_0_per_frame17=r = 0.5-0.3*sin(time); +wave_0_per_point1=//Define 3D Shape +wave_0_per_point2= +wave_0_per_point3=//Spiral +wave_0_per_point4=x1 = 0.5*sin(8*t8*sample); +wave_0_per_point5=y1 = 2*(sample-0.5)-value1; +wave_0_per_point6=z1= 0.5*cos(8*t8*sample); +wave_0_per_point7= +wave_0_per_point8=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_0_per_point9=y2 = y1*cos(t1)-z1*sin(t1); +wave_0_per_point10=z2 = y1*sin(t1)+z1*cos(t1); +wave_0_per_point11=x2 = z2*sin(t2)+x1*cos(t2); +wave_0_per_point12=z3 = z2*cos(t2)-x1*sin(t2); +wave_0_per_point13=x3 = x2*cos(t3)-y2*sin(t3); +wave_0_per_point14=y3 = y2*cos(t3)+x2*sin(t3); +wave_0_per_point15=//move resulting shape in 3d space +wave_0_per_point16=x4 = x3+t4; +wave_0_per_point17=y4 = y3; +wave_0_per_point18=z4 = z3+t5; +wave_0_per_point19=//draw 3d shape in 2d +wave_0_per_point20=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_0_per_point21=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_0_per_point22= +wave_0_per_point23=b= r+5*value1; +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=0.463735 +wavecode_1_smoothing=0.000000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_init1=//pi +wave_1_init2=t8=3.14159265; +wave_1_init3=t5 = 1; +wave_1_per_frame1=rotx = rotx+bass; +wave_1_per_frame2=roty = roty+mid; +wave_1_per_frame3=rotz = rotz+treb; +wave_1_per_frame4=//rotx = 0; +wave_1_per_frame5=//roty =0; +wave_1_per_frame6=//rotz = 0; +wave_1_per_frame7= +wave_1_per_frame8=//convert rotation values from degrees to radians +wave_1_per_frame9=t1= t8*rotx/180; +wave_1_per_frame10=t2 = t8*roty/180; +wave_1_per_frame11=t3 = t8*rotz/180; +wave_1_per_frame12= +wave_1_per_frame13=t4 = 4*sin(q1+0.66*t8); +wave_1_per_frame14=t5 = 10+8*cos(q1+0.66*t8); +wave_1_per_frame15= +wave_1_per_frame16=b = 0.5-0.3*cos(time+0.66*t8); +wave_1_per_frame17=g = 0.5-0.3*sin(time+0.66*t8); +wave_1_per_point1=//Define 3D Shape +wave_1_per_point2= +wave_1_per_point3=//Sphere +wave_1_per_point4=x0 = sin(2*t8*sample); +wave_1_per_point5=y0 = cos(2*t8*sample); +wave_1_per_point6=x1 = (1+value1)*sin(12*t8*sample)*y0; +wave_1_per_point7=y1 = (1+value1)*sin(12*t8*sample)*x0; +wave_1_per_point8=z1= (1+value1)*cos(12*t8*sample); +wave_1_per_point9= +wave_1_per_point10= +wave_1_per_point11=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_1_per_point12=y2 = y1*cos(t1)-z1*sin(t1); +wave_1_per_point13=z2 = y1*sin(t1)+z1*cos(t1); +wave_1_per_point14=x2 = z2*sin(t2)+x1*cos(t2); +wave_1_per_point15=z3 = z2*cos(t2)-x1*sin(t2); +wave_1_per_point16=x3 = x2*cos(t3)-y2*sin(t3); +wave_1_per_point17=y3 = y2*cos(t3)+x2*sin(t3); +wave_1_per_point18=//move resulting shape in 3d space +wave_1_per_point19=x4 = x3+t4; +wave_1_per_point20=y4 = y3; +wave_1_per_point21=z4 = z3+t5; +wave_1_per_point22=//draw 3d shape in 2d +wave_1_per_point23=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_1_per_point24=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_1_per_point25= +wave_1_per_point26=r = g+5*value1; +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=0.463735 +wavecode_2_smoothing=0.000000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_init1=//pi +wave_2_init2=t8=3.14159265; +wave_2_init3=t5 = 1; +wave_2_per_frame1=rotx = rotx+bass; +wave_2_per_frame2=roty = roty+mid; +wave_2_per_frame3=rotz = rotz+treb; +wave_2_per_frame4=//rotx = 0; +wave_2_per_frame5=//roty =0; +wave_2_per_frame6=//rotz = 0; +wave_2_per_frame7= +wave_2_per_frame8=//convert rotation values from degrees to radians +wave_2_per_frame9=t1= t8*rotx/180; +wave_2_per_frame10=t2 = t8*roty/180; +wave_2_per_frame11=t3 = t8*rotz/180; +wave_2_per_frame12= +wave_2_per_frame13=t4 = 4*sin(q1+1.33*t8); +wave_2_per_frame14=t5 = 10+8*cos(q1+1.33*t8); +wave_2_per_frame15= +wave_2_per_frame16=r = 0.5-0.3*cos(time+1.33*t8); +wave_2_per_frame17=b = 0.5-0.3*sin(time+1.33*t8); +wave_2_per_point1=//Define 3D Shape +wave_2_per_point2= +wave_2_per_point3=//Cube +wave_2_per_point4=x0 = if(below(sample*12,1),sample*12, if(below(sample*12,2),1, if(below(sample*12,3),abs(sample*12-3), if(below(sample*12,6),0, if(below(sample*12,8),1, if(below(sample*12,9),abs(sample*12-9), if(below(sample*12,10),0, if(below(sample*12,11),sample*12-10,1)))))))); +wave_2_per_point5=y0 = if(below(sample*12,1),0, if(below(sample*12,2),sample*12-1, if(below(sample*12,3),1, if(below(sample*12,4),abs(sample*12-4), if(below(sample*12,5),0, if(below(sample*12,7),1, if(below(sample*12,9),0, if(below(sample*12,10),sample*12-9, if(below(sample*12,11),1,abs(sample*12-12)))))))))); +wave_2_per_point6=z0 = if(below(sample*12,4),0, if(below(sample*12,5),sample*12-4, if(below(sample*12,6),abs(sample*12-6), if(below(sample*12,7),sample*12-6, if(below(sample*12,8),abs(sample*12-8),1))))); +wave_2_per_point7=x1 = 0.5-x0+if(below(sin(sample*12*3.1415),0),value1,0); +wave_2_per_point8=y1 = 0.5-y0+if(below(cos((sample*12-1.5)*3.1415),0),value1,0); +wave_2_per_point9=z1 = 0.5-z0+if(below(sample*12,4),0,if(below(sample*12,8),value1,0)); +wave_2_per_point10= +wave_2_per_point11=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_2_per_point12=y2 = y1*cos(t1)-z1*sin(t1); +wave_2_per_point13=z2 = y1*sin(t1)+z1*cos(t1); +wave_2_per_point14=x2 = z2*sin(t2)+x1*cos(t2); +wave_2_per_point15=z3 = z2*cos(t2)-x1*sin(t2); +wave_2_per_point16=x3 = x2*cos(t3)-y2*sin(t3); +wave_2_per_point17=y3 = y2*cos(t3)+x2*sin(t3); +wave_2_per_point18=//move resulting shape in 3d space +wave_2_per_point19=x4 = x3+t4; +wave_2_per_point20=y4 = y3; +wave_2_per_point21=z4 = z3+t5; +wave_2_per_point22=//draw 3d shape in 2d +wave_2_per_point23=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_2_per_point24=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_2_per_point25= +wave_2_per_point26=g = b+5*value1; +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=warp=0; +per_frame_2=volume = 0.3*(bass+mid); +per_frame_3=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_4=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_5=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_6=peakbass_att = max(bass_att,peakbass_att); +per_frame_7=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_8=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_9=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_10=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_11=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_12=dir = if(equal(abs(dir),1),dir,1); +per_frame_13=dir = if(equal(beatcount,beat),0-dir,dir); +per_frame_14=beatcount = if(above(beatcount,rand(10)+2),1,beatcount+beat); +per_frame_15=movement = movement+(dir/fps)*0.5*3.1415/beatrate; +per_frame_16=q1 = movement; +per_frame_17=monitor = beat; +per_pixel_1=zoom = zoom-0.001+0.06*max(abs(y-0.5)-0.3,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Idiot - Memories Of The Castle.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Idiot - Memories Of The Castle.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Idiot - Memories Of The Castle.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Idiot - Memories Of The Castle.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,93 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.357394 +fWaveSmoothing=0.630000 +fWaveParam=-0.600000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000100 +fShader=0.000000 +zoom=1.000376 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999900 +sy=0.999904 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.200000 +wave_x=0.500000 +wave_y=0.490000 +ob_size=0.049900 +ob_r=0.110000 +ob_g=0.500000 +ob_b=1.000000 +ob_a=0.000000 +ib_size=0.055000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=vol_att=bass_att+treb_Att+mid_att; +per_frame_2=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_3=treb_thresh=above(treb_att,treb_thresh)*2+ +per_frame_4=(1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_5=mid_thresh=above(mid_att,mid_thresh)*2+ +per_frame_6=(1-above(mid_mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_7=vol_thresh=bass_thresh+treb_thresh+mid_thresh; +per_frame_8=react=vol; +per_frame_9=new_bass=if(above(react,bass_effect),bass&bass_att,bass_effect+bass_thresh); +per_frame_10=new_treb=if(above(react,treb_effect),treb&treb_att,treb_Effect+treb_thresh); +per_frame_11=new_mid=if(above(react,mid_effect),mid&mid_Att,mid_effect+mid_thresh); +per_frame_12=new_vol=new_bass+new_treb+new_mid+.04; +per_frame_13=rotadd = rotadd+sign(0.6*sin(time*0.456) + 0.4*sin(time*0.965)); +per_frame_14=q1=new_bass; +per_frame_15=q2=new_treb; +per_frame_16=q3=0.03*rotadd; +per_frame_17=q4=new_vol; +per_frame_18=q5=bass_thresh; +per_frame_19=q6=treb_thresh; +per_frame_20=q7=mid_thresh; +per_frame_21=q8=vol_thresh; +per_frame_22=mode = frame%2; +per_frame_23=wave_r=.3+.5*sin(new_mid-time)+mode; +per_frame_24=wave_g=.5-.2*sin(q2-time)-mode; +per_frame_25=wave_b=.2+.6*sin(q1-time)-mode; +per_frame_26=wave_mode = if(mode,0,wave_mode); +per_pixel_1=shine=band(rad,2)-rad%8*rad%2+.2*sin(q1)+.1*sin(above(Q1,q2)); +per_pixel_2=zoom=shine+.2*sin(above(q2,q1)-rad*sin(q5&time*.75*sin(above(Q5,q6)))); +per_pixel_3=zoom = zoom - below(rad,0.5)*0.8*(zoom-1); +per_pixel_4=rot=if(above(q1,q2),.2*sin(q1),-.2*sin(q2))+above(rad,0.5)*q3; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Illusion - Indecisive Mosaic.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Illusion - Indecisive Mosaic.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Illusion - Indecisive Mosaic.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Illusion - Indecisive Mosaic.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,89 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.999996 +fWaveSmoothing=0.750000 +fWaveParam=-0.499900 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999900 +rot=0.100000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_3=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.522)); +per_frame_4=wave_g = wave_g + 0.4*sin(time*1.731); +per_frame_5=decay = decay - equal(frame%100,0)*0.1; +per_frame_6=vol = 0.167*(bass+mid+att); +per_frame_7=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_8=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_9=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_10=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_11=xpos = xpos + 0.001*xspeed; +per_frame_12=wave_x = 1.5*xpos + 0.5; +per_frame_13=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_14=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_15=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_16=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_17=ypos = ypos + 0.001*yspeed; +per_frame_18=wave_y = 1.5*ypos + 0.5; +per_frame_19=dx = dx + dx_residual; +per_frame_20=dy = dy + dy_residual; +per_frame_21=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_22=dx_residual = equal(bass_thresh,2)*0.003*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_23=dy_residual = equal(bass_thresh,2)*0.001*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_frame_24=rot = 0.1; +per_pixel_1=cx = (0&(x*10-0.5))*0.1+0.05; +per_pixel_2=cy = (0&(y*10-0.5))*0.1+0.05; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Illusion - Spiral Movement.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Illusion - Spiral Movement.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Illusion - Spiral Movement.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Illusion - Spiral Movement.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,88 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.504218 +fWaveSmoothing=0.750000 +fWaveParam=0.240000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=9.860800 +fWarpScale=16.217400 +fZoomExponent=1.503744 +fShader=0.000000 +zoom=1.020100 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.819544 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.200000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.060000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=dx=-0.0005; +per_frame_2=dy=-0.0005; +per_frame_3=vol = (bass+mid+att)/6; +per_frame_4=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_5=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_6=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_7=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_8=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_9=xpos = xpos + 0.001*xspeed; +per_frame_10=wave_x = xpos + 0.5; +per_frame_11=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_12=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_13=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_14=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_15=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_16=ypos = ypos + 0.001*yspeed; +per_frame_17=wave_y = ypos + 0.5; +per_frame_18=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_19=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_20=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_21=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_22=cx = cx + 0.410*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_23=cy = cy + 0.410*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_24=wave_mystery = wave_mystery + 0.15*( 0.60*sin(0.629*time) + 0.40*sin(1.826*time) ); +per_frame_25=warp = warp*vol; +per_frame_26=zoom = zoom - 0.02*zoom*bass_att; +per_frame_27=zoom_exp = 1.5*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_28=ob_a = 1 - 2*vol; +per_frame_29=monitor = zoom_exp; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Pulse.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Pulse.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Pulse.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Pulse.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.199999 +fDecay=0.980000 +fVideoEchoZoom=1.216077 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.888676 +fWaveScale=0.911592 +fWaveSmoothing=0.900000 +fWaveParam=-0.600000 +fModWaveAlphaStart=1.010000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.001828 +fWarpScale=0.998166 +fZoomExponent=0.224776 +fShader=0.000000 +zoom=0.999900 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.749001 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=27.000000 +nMotionVectorsY=19.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_4=warp = 0; +per_pixel_1=angval = 0.3/sqrt((3.14*tan(ang*0.001-time*3))+4); +per_pixel_2=zoom = if( above( rad,0.05 ), if( above( rad/7.8, angval ), if( below( (rad-0.05)/7.8, angval), 0.95, 1.1 ), if( above( rad/2.8, angval ), if( below( (rad-0.05)/2.8, angval), 0.95, 1.1 ), if( above( rad/1, angval ), if( below( (rad-0.05)/1, angval), 0.95, 1.1 ), 1.1 ) ) ), 1.1 ); +per_pixel_3=rot = 0.02*zoom-0.05*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Altars Of Madness (Mad Ocean Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Altars Of Madness (Mad Ocean Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Altars Of Madness (Mad Ocean Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Altars Of Madness (Mad Ocean Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,92 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.660126 +fWaveSmoothing=0.000000 +fWaveParam=0.300000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.150000 +mv_g=0.450000 +mv_b=0.650000 +mv_a=0.200000 +per_frame_1=warp=0; +per_frame_2=ib_a =0.2*bass; +per_frame_3=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_4=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.522)); +per_frame_5=wave_g = wave_g + 0.4*sin(time*1.731); +per_frame_6=decay = decay - equal(frame%100,0)*0.1; +per_frame_7=vol = 0.167*(bass+mid); +per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_11=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_12=xpos = xpos + 0.001*xspeed; +per_frame_13=wave_x = 1.5*xpos + 0.5; +per_frame_14=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_15=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_16=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_17=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_18=ypos = ypos + 0.001*yspeed; +per_frame_19=wave_y = 1.5*ypos + 0.5; +per_frame_20=zoom = .995; +per_frame_21=wave_x = if(frame%2,1-wave_x,wave_x); +per_frame_22=wave_y = if(frame%2,1-wave_y,wave_y); +per_frame_23=wave_r = if(frame%2,wave_r,wave_g); +per_frame_24=wave_g = if(frame%2,wave_g,wave_b); +per_frame_25=wave_b = if(frame%2,wave_b,wave_r); +per_frame_26=monitor = green; +per_pixel_1=dx=dx+0.008*sin((y*2-1)*(48+12*sin(0.412*time)))+0.008*sin(((y+sin(time*0.163))*2-1)*(3+sin(0.241*time))); +per_pixel_2=dy=dy+0.008*cos((x*2-1)*(64+18*sin(0.376*time)))+0.008*cos(((x+sin(time*0.282))*2-1)*(3+sin(0.349*time))); +per_frame_init_1=q8=0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - A Million Miles from Earth (Ripple Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - A Million Miles from Earth (Ripple Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - A Million Miles from Earth (Ripple Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - A Million Miles from Earth (Ripple Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,92 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.535234 +fWaveSmoothing=0.500000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.400000 +ob_g=0.300000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=1.000000 +ib_g=0.600000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=2.000000 +mv_dx=0.000000 +mv_dy=-0.100000 +mv_l=5.000000 +mv_r=0.200000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.500000 +per_frame_1=warp = 0; +per_frame_2=wave_r = 0.5 + 0.3*sin(time*0.894); +per_frame_3=wave_g = 0.53 + 0.33*sin(time*1.14); +per_frame_4=wave_b = 0.4 + 0.1*(1-bass); +per_frame_5=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_frame_6=test = equal(thresh,2); +per_frame_7=dx_r = test*0.002*sin(5*time)+(1-test)*dx_r; +per_frame_8=dy_r = test*0.002*sin(6*time)+(1-test)*dy_r; +per_frame_9=zoom = zoom -0.01*thresh; +per_frame_10=dx = 1.1* dx_r; +per_frame_11=dy = 1.1* dy_r; +per_frame_12=dx = dx + if (above(bass,1.3), 21*dx_r, 0); +per_frame_13=mv_x = if(test,2,64); +per_frame_14=mv_y = if(test,64,2); +per_frame_15=mv_dx = if(test,-0.1,0); +per_frame_16=mv_dy = if(test,0,-0.1); +per_frame_17=mv_a = if(test,1,0.5); +per_frame_18=xpos = xpos + 0.05*(80*dx_r - xpos); +per_frame_19=ypos = ypos + 0.05*(80*dy_r - ypos); +per_frame_20=wave_x = 0.5 - xpos + 0.1*sin(2*time); +per_frame_21=wave_y = 0.5 - ypos + 0.1*cos(2*time); +per_frame_22=q1 = wave_x; +per_frame_23=q2 = 1 - wave_y; +per_pixel_1=newx = x - q1; +per_pixel_2=newy = y - q2; +per_pixel_3=newrad = sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2; +per_pixel_4=newzoom = pow(1.03, pow(0.01+sin(newrad*newrad), newrad*2-1)); +per_pixel_5=dx = min(5*newrad,1)*dx + max(-newrad*5+1,0)*((newx)*newzoom - newx); +per_pixel_6=dy = min(5*newrad,1)*dy + max(-newrad*5+1,0)*((newy)*newzoom - newy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Cerebral Demons (Distant Memory Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Cerebral Demons (Distant Memory Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Cerebral Demons (Distant Memory Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Cerebral Demons (Distant Memory Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,108 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.993998 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.334693 +fWaveSmoothing=0.750000 +fWaveParam=-0.219900 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.300000 +zoom=0.999900 +rot=0.100000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.400000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_3=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.722)); +per_frame_4=wave_g = wave_g + 0.4*sin(time*1.931); +per_frame_5=wave_r = 0.2125*wave_r + 0.7154*wave_g + 0.0721*wave_b; +per_frame_6=wave_g = wave_r; +per_frame_7=wave_b = wave_r; +per_frame_8=vol = 0.167*(bass+mid); +per_frame_9=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_10=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_11=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_13=xpos = xpos + 0.001*xspeed; +per_frame_14=wave_x = 1.25*xpos + 0.5; +per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_18=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_19=ypos = ypos + 0.001*yspeed; +per_frame_20=wave_y = 1.25*ypos + 0.5; +per_frame_21=dx = dx + dx_residual; +per_frame_22=dy = dy + dy_residual; +per_frame_23=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_24=dx_residual = equal(bass_thresh,2)*0.003*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_25=dy_residual = equal(bass_thresh,2)*0.001*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_frame_26=rot = 0.1; +per_frame_27=q2=1.1*xpos +0.25*ypos + 0.5; +per_frame_28=q1=1.1*ypos +0.25*xpos + 0.5; +per_frame_29=ib_r = 0.3+xpos; +per_frame_30=ib_b = 0.06*bass; +per_frame_31=ib_g = 0.25+ypos; +per_frame_32=ib_r = 0.2125*ib_r + 0.7154*ib_g + 0.0721*ib_b; +per_frame_33=ib_g = ib_r; +per_frame_34=ib_b = ib_r; +per_pixel_1=cx = (0&(x*10-0.5))*0.1+0.05; +per_pixel_2=cy = (0&(y*10-0.5))*0.1+0.05; +per_pixel_3=newx = q1-x; +per_pixel_4=newy = q2-y; +per_pixel_5=newrad = sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2; +per_pixel_6=newzoom = pow(1.05 + 0.03*newrad, pow(0.01+sin(newrad*newrad), newrad*2-1)); +per_pixel_7=dx = (newx)*newzoom - newx; +per_pixel_8=dy = (newy)*newzoom - newy; +per_pixel_9=dx =dx*0.1; +per_pixel_10=dy=dy*0.1; +per_pixel_11=rot = 2*newrad*(0.5*(0.5-rad)+0.1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Cerebral Demons - Phat + Eo.S. hall of ghouls Remix.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Cerebral Demons - Phat + Eo.S. hall of ghouls Remix.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Cerebral Demons - Phat + Eo.S. hall of ghouls Remix.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Cerebral Demons - Phat + Eo.S. hall of ghouls Remix.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,367 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.334693 +fWaveSmoothing=0.750000 +fWaveParam=-0.219900 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.300000 +zoom=0.999900 +rot=0.100000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.800000 +ib_size=0.005000 +ib_r=0.400000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=0.800000 +wavecode_0_b=0.300000 +wavecode_0_a=1.000000 +wave_0_per_point1=n=sample*6.283; +wave_0_per_point2= +wave_0_per_point3=xp=sin(n); +wave_0_per_point4=yp=cos(n); +wave_0_per_point5= +wave_0_per_point6=tm=q3 - sample; +wave_0_per_point7= +wave_0_per_point8=xof=sin(tm) * sin(tm*3) * 0.4 + 0.5; +wave_0_per_point9=yof=cos(tm*1.3) * sin(tm*5.4) * 0.4 + 0.5; +wave_0_per_point10= +wave_0_per_point11= +wave_0_per_point12=x= xof; +wave_0_per_point13=y= (1-yof); +wave_0_per_point14= +wave_0_per_point15=a=1-sample; +wave_0_per_point16= +wave_0_per_point17= +wave_0_per_point18= +wave_0_per_point19= +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=0.700000 +wavecode_1_b=0.200000 +wavecode_1_a=1.000000 +wave_1_per_point1=n=sample*6.283; +wave_1_per_point2=n2=(sample-q8 - time*0.1)*6; +wave_1_per_point3= +wave_1_per_point4=xp=sin(n); +wave_1_per_point5=yp=cos(n); +wave_1_per_point6= +wave_1_per_point7=tm=q8 - sample; +wave_1_per_point8= +wave_1_per_point9=tx= sin(n2*13)*sin(n2*5) * sample * 0.05; +wave_1_per_point10=ty= cos(n2*13)*sin(n2*7) * sample * 0.05; +wave_1_per_point11= +wave_1_per_point12=xof=sin(tm) * sin(tm*3) * 0.4 + 0.5 + tx; +wave_1_per_point13=yof=cos(tm*1.3) * sin(tm*5.4) * 0.4 + 0.5 + ty; +wave_1_per_point14= +wave_1_per_point15=xran=(rand(10) - 5) * 0.0005; xran=xran*sample; +wave_1_per_point16=yran=(rand(10) - 5) * 0.0005; yran=yran*sample; +wave_1_per_point17= +wave_1_per_point18=x= xof + xran; +wave_1_per_point19=y= (1-yof) + yran; +wave_1_per_point20= +wave_1_per_point21=a=(1-sample); +wave_1_per_point22=g=g*(1-sample); +wave_1_per_point23=b=b*(1-sample) +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=1 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=0.780000 +wavecode_2_b=0.200000 +wavecode_2_a=1.000000 +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2=n2=(sample-q8 - time*0.1)*6; +wave_2_per_point3= +wave_2_per_point4=xp=sin(n); +wave_2_per_point5=yp=cos(n); +wave_2_per_point6= +wave_2_per_point7=tm=q8 - sample; +wave_2_per_point8= +wave_2_per_point9=tx= sin(n2*13)*sin(n2*5) * sample * 0.05; +wave_2_per_point10=ty= cos(n2*13)*sin(n2*7) * sample * 0.05; +wave_2_per_point11= +wave_2_per_point12=xof=sin(tm) * sin(tm*3) * 0.4 + 0.5 + tx; +wave_2_per_point13=yof=cos(tm*1.3) * sin(tm*5.4) * 0.4 + 0.5 + ty; +wave_2_per_point14= +wave_2_per_point15=xran=(rand(10) - 5) * 0.0005; xran=xran*sample; +wave_2_per_point16=yran=(rand(10) - 5) * 0.0005; yran=yran*sample; +wave_2_per_point17= +wave_2_per_point18=x= xof + xran; +wave_2_per_point19=y= (1-yof) + yran; +wave_2_per_point20= +wave_2_per_point21=a=(1-sample); +wave_2_per_point22=g=g*(1-sample); +wave_2_per_point23=b=b*(1-sample) +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +wave_3_per_point1=xs=sin(sample*6.28); +wave_3_per_point2=ys=cos(sample*6.28); +wave_3_per_point3=xs=xs*0.7 + 0.5; +wave_3_per_point4=ys=ys*0.7 + 0.5; +wave_3_per_point5=xs=min(xs,0.958); +wave_3_per_point6=xs=max(xs,0.042); +wave_3_per_point7=ys=min(ys,0.988); +wave_3_per_point8=ys=max(ys,0.012); +wave_3_per_point9=x=xs;y=ys; +wave_3_per_point10= +wave_3_per_point11=n2=abs((sample*6.283)-3.1415); +wave_3_per_point12= +wave_3_per_point13=r=sin(n2+time)*0.5+0.5; +wave_3_per_point14=g=sin(n2+2.1+time)*0.5+0.5; +wave_3_per_point15=b=sin(n2+4.2+time)*0.5+0.5; +wave_3_per_point16= +wave_3_per_point17= +wave_3_per_point18=a=a * above(sin(n2*9+q8*2), sin(time) ) +shapecode_0_enabled=1 +shapecode_0_sides=5 +shapecode_0_additive=1 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.110462 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=0.500000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=0.500000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shape_0_per_frame1=x=q1; +shape_0_per_frame2=y=1-q2; +shape_0_per_frame3=ang=time +shapecode_1_enabled=1 +shapecode_1_sides=5 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.030000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=0.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=0.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shape_1_per_frame1=x=q1; +shape_1_per_frame2=y=1-q2; +shape_1_per_frame3=ang=time +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=flip=1 +per_frame_1=warp=0; +per_frame_2=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_3=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.722)); +per_frame_4=wave_g = wave_g + 0.4*sin(time*1.931); +per_frame_5=wave_r = 0.2125*wave_r + 0.7154*wave_g + 0.0721*wave_b; +per_frame_6=wave_g = wave_r; +per_frame_7=wave_b = wave_r; +per_frame_8=vol = 0.167*(bass+mid); +per_frame_9=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_10=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_11=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_13=xpos = xpos + 0.001*xspeed; +per_frame_14=wave_x = 1.25*xpos + 0.5; +per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_18=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_19=ypos = ypos + 0.001*yspeed; +per_frame_20=wave_y = 1.25*ypos + 0.5; +per_frame_21=dx = dx + dx_residual; +per_frame_22=dy = dy + dy_residual; +per_frame_23=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_24=dx_residual = equal(bass_thresh,2)*0.003*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_25=dy_residual = equal(bass_thresh,2)*0.001*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_frame_26=rot = 0.1; +per_frame_27= +per_frame_28=vol=(bass+mid+treb)*0.25; +per_frame_29=vol=vol*vol; +per_frame_30=mtime=mtime + vol*0.01*(70/fps); +per_frame_31=q8=mtime; +per_frame_32= +per_frame_33= +per_frame_34=q1=sin(mtime) * sin(mtime*3) * 0.4 + 0.5; +per_frame_35=q2=cos(mtime*1.3) * sin(mtime*5.4) * 0.4 + 0.5; +per_frame_36= +per_frame_37= +per_frame_38= +per_frame_39=ib_r = tan(time); +per_frame_40=ib_r = min(1, max(ib_r,0)); +per_frame_41= +per_frame_42=ib_g = tan(time+2.1); +per_frame_43=ib_g = min(1, max(ib_g,0)); +per_frame_44= +per_frame_45=ib_b = tan(time+4.2); +per_frame_46=ib_b = min(1, max(ib_b,0)); +per_frame_47= +per_frame_48=q3 = 10+8*(0.6*sin(0.223*time) + 0.4*sin(0.153*time)); +per_frame_49=q4 = 1/q3; +per_frame_50=q5 = 0.5*sign(xpos); +per_frame_51=q6 = 0.5*sign(ypos); +per_frame_52= +per_frame_53=monitor=q4; +per_frame_54= +per_frame_55=flip=-flip; +per_frame_56=sx=flip +per_frame_57= +per_frame_58= +per_pixel_1=cx = ((0&(x*q3-q5))+q5)*q4; +per_pixel_2=cy = ((0&(y*q3-q6))+q6)*q4; +per_pixel_3=newx = q1-x; +per_pixel_4=newy = q2-y; +per_pixel_5=newrad = sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2; +per_pixel_6=newzoom = pow(1.05 + 0.03*newrad, pow(0.01+sin(newrad*newrad), newrad*2-1)); +per_pixel_7=dx = (newx)*newzoom - newx; +per_pixel_8=dy = (newy)*newzoom - newy; +per_pixel_9=dx =dx*0.1; +per_pixel_10=dy=dy*0.1; +per_pixel_11=rot = 2*newrad*(0.5*(0.5-rad)+0.1); +per_pixel_12=rot=rot*sin(time)*0.2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Switching Polygons.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Switching Polygons.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Switching Polygons.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - Switching Polygons.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.850000 +fDecay=0.973000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.396647 +fWaveScale=0.883471 +fWaveSmoothing=0.520000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.45*( 0.6*sin(1.517*time) + 0.4*mid_effect ); +per_frame_2=wave_b = wave_b + 0.45*( 0.6*sin(1.088*time) + 0.4*bass_effect ); +per_frame_3=wave_g = wave_g + 0.45*( 0.6*sin(1.037*time) + 0.4*treb_effect ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.020*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*below(frame%5,1); +per_frame_7=volume = 0.3*(bass+mid+att); +per_frame_8=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_9=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_10=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_11=peakbass_att = max(bass_att,peakbass_att); +per_frame_12=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_13=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_14=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_15=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_16=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_17=effect = if(beat,effect+rand(5)+1,effect); +per_frame_18=effect = if(above(effect,5),effect-6,effect); +per_frame_19=q1 = effect+2; +per_frame_20=monitor = q1; +per_pixel_1=zoom=zoom+0.04*sin(ang*int(q1)+time*2.6); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - The Devil Is In The Details.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - The Devil Is In The Details.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - The Devil Is In The Details.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Rovastar - The Devil Is In The Details.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,101 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.993998 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.334693 +fWaveSmoothing=0.750000 +fWaveParam=-0.219900 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=0.999900 +rot=0.100000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.400000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_3=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.722)); +per_frame_4=wave_g = wave_g + 0.4*sin(time*1.931); +per_frame_5=vol = 0.167*(bass+mid); +per_frame_6=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_7=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_8=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_9=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_10=xpos = xpos + 0.001*xspeed; +per_frame_11=wave_x = 1.25*xpos + 0.5; +per_frame_12=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_13=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_14=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_15=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_16=ypos = ypos + 0.001*yspeed; +per_frame_17=wave_y = 1.25*ypos + 0.5; +per_frame_18=q2=1.1*xpos +0.25*ypos + 0.5; +per_frame_19=q1=1.1*ypos +0.25*xpos + 0.5; +per_frame_20=ib_r = 0.3+xpos; +per_frame_21=ib_b = 0.06*bass; +per_frame_22=ib_g = 0.25+ypos; +per_frame_23=q3 = 10+8*(0.6*sin(0.423*time) + 0.4*sin(0.253*time)); +per_frame_24=q4 = 1/q3; +per_frame_25=q5 = 0.5*sign(xpos); +per_frame_26=q6 = 0.5*sign(ypos); +per_frame_27=monitor = rot; +per_pixel_1=cx = ((0&(x*q3-q5))+q5)*q4; +per_pixel_2=cy = ((0&(y*q3-q6))+q6)*q4; +per_pixel_3=newx = q1-x; +per_pixel_4=newy = q2-y; +per_pixel_5=newrad = sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2; +per_pixel_6=newzoom = pow(1.05 + 0.03*newrad, pow(0.01+sin(newrad*newrad), newrad*2-1)); +per_pixel_7=dx = (newx)*newzoom - newx; +per_pixel_8=dy = (newy)*newzoom - newy; +per_pixel_9=dx =dx*0.1; +per_pixel_10=dy=dy*0.1; +per_pixel_11=rot = 2*newrad*(0.5*(0.5-rad)+0.1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Season's Greetings 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Season's Greetings 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Season's Greetings 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Season's Greetings 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,116 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.940000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.042592 +fWaveSmoothing=0.750000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=1.000000 +nMotionVectorsY=1.000000 +mv_dx=-0.500000 +mv_dy=-0.500000 +mv_l=2.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp=0; +per_frame_2=q1 = (bass_att + mid_att + treb_att) /3; +per_frame_3=q2 = time + 5*(bass + mid + treb); +per_frame_4=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.4)*0.95+1.4); +per_frame_5=treb_thresh = above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.5)*0.85+1.2); +per_frame_6=bass_on = above(bass_thresh,1.9); +per_frame_7=treb_on = above(treb_thresh,1.9); +per_frame_8=swapcolour = bass_on - treb_on; +per_frame_9=red_aim = if(equal(swapcolour,1),0,if(equal(swapcolour,0),0,0)); +per_frame_10=green_aim = if(equal(swapcolour,1),0.4,if(equal(swapcolour,0),0.3,0.2)); +per_frame_11=blue_aim = if(equal(swapcolour,1),0.3,if(equal(swapcolour,0),0.2,0)); +per_frame_12=red = red + (red_aim - red)*0.5; +per_frame_13=green = green + (green_aim - green)*0.5; +per_frame_14=blue = blue + (blue_aim - blue)*0.5; +per_frame_15=vol = 0.167*(bass+mid); +per_frame_16=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_17=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_18=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_19=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_20=xpos = xpos + 0.001*xspeed; +per_frame_21=mv_dx = 0.2*xpos - 0.5; +per_frame_22=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_23=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_24=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_25=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_26=ypos = ypos + 0.001*yspeed; +per_frame_27=mv_dy = 1.5*ypos - 0.5; +per_frame_28=mv_r = 0.75 + 0.25*(0.6*sin(1.346*time) + 0.4*sin(0.832*time)); +per_frame_29=mv_g = 0.25 + 0.25*(0.6*sin(0.912*time) + 0.4*sin(0.327*time)); +per_frame_30=mv_b = 0.5 + 0.25*(0.6*sin(1.247*time) + 0.4*sin(0.721*time)); +per_frame_31=mv_l = -(1.5*ypos + 0.5)*15; +per_frame_32=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(2*vol,0.01) + (1-below(2*vol,0.01))*beatrate); +per_frame_33=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_34=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_35=peakbass_att = max(bass_att,peakbass_att); +per_frame_36=beat = above(2*vol,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_37=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_38=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_39=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_40=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_41=wasbeat = if(beat,time+0.2,wasbeat); +per_frame_42=decoration = above(wasbeat,time)*equal(frame%2,0); +per_frame_43=wave_r = if(decoration,1,red); +per_frame_44=wave_g = if(decoration,0.5,green); +per_frame_45=wave_b = if(decoration,0.1,blue); +per_frame_46=wave_y = if(decoration,0.2 + 0.01*rand(50),wave_y); +per_frame_47=wave_x = if(decoration,0.5 + 0.1*(1-wave_y)*sin(50*time),wave_x); +per_frame_48=wave_mode = if(decoration,0,6); +per_frame_49=wave_mystery = if(decoration,-0.48,-1); +per_frame_50=monitor = beat; +per_pixel_1=dx = if(above(x,0.5),if(below(y,0.9),above(rand(20),1)*0.02*pow(y+0.15,2),0.005),dx); +per_pixel_2=dx = if(below(x,0.5),if(below(y,0.9),above(rand(20),1)*-0.02*pow(y+0.15,2),-0.005),dx); +per_pixel_3=dy = -0.02*(abs(x-0.5)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & TEcHNO - Rhythmic Mantas.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & TEcHNO - Rhythmic Mantas.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & TEcHNO - Rhythmic Mantas.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & TEcHNO - Rhythmic Mantas.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.700000 +fDecay=0.995000 +fVideoEchoZoom=1.000224 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.003100 +fWaveScale=1.004873 +fWaveSmoothing=0.000000 +fWaveParam=-1.000000 +fModWaveAlphaStart=1.010000 +fModWaveAlphaEnd=1.010000 +fWarpAnimSpeed=0.999994 +fWarpScale=1.002083 +fZoomExponent=1.001830 +fShader=1.000000 +zoom=0.995048 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.010000 +dy=0.010000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.050000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=1.000000 +nMotionVectorsY=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=volume = 0.3*(bass+mid+att); +per_frame_2=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_3=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_4=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_5=peakbass_att = max(bass_att,peakbass_att); +per_frame_6=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_7=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_8=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_9=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_10=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_11=mode = if(beat,rand(4),mode); +per_frame_12=q1 = ((time*20)%50)*0.08; +per_frame_13=q2 = 1 - below(mode,2)*2; +per_frame_14=q3 = 1 - 2*(mode%2); +per_frame_15=wave_x = 1-below(mode,2); +per_frame_16=wave_mystery = (frame%2)*(2*(1-equal(mode%3,0))-1); +per_frame_17=wave_r=if(below(frame%6,3),bass*0.5,0); +per_frame_18=wave_b=0.9+sin(time)*0.1; +per_frame_19=wave_g=if(above(frame%6,2),bass*0.5,0); +per_pixel_1=dx = dx*pow(-1,0&(13+q1 - 5*(q2*y)))*min(bass,1.2); +per_pixel_2=dy = dy*pow(-1,0&(13+q1 - 5*(q3*x)))*min(bass,1.2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Twisting Indecision.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Twisting Indecision.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Twisting Indecision.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Twisting Indecision.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,85 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.999996 +fWaveSmoothing=0.750000 +fWaveParam=-0.499900 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999900 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.010000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_3=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.522)); +per_frame_4=wave_g = wave_g + 0.4*sin(time*1.731); +per_frame_5=decay = decay - equal(frame%100,0)*0.1; +per_frame_6=vol = 0.167*(bass+mid); +per_frame_7=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_8=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_9=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_10=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_11=xpos = xpos + 0.001*xspeed; +per_frame_12=wave_x = 1.5*xpos + 0.5; +per_frame_13=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_14=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_15=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_16=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_17=ypos = ypos + 0.001*yspeed; +per_frame_18=wave_y = 1.5*ypos + 0.5; +per_frame_19=q1 = xpos; +per_frame_20=q2 = -ypos; +per_pixel_1=cx = (0&(x+q1))-q1; +per_pixel_2=cy = (0&(y+q2))-q2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - War Machine (Shifting Complexity Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - War Machine (Shifting Complexity Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - War Machine (Shifting Complexity Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - War Machine (Shifting Complexity Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,90 @@ +[preset00] +fRating=4.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.999996 +fWaveSmoothing=0.750000 +fWaveParam=-0.499900 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999900 +rot=0.100000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.200000 +wave_b=0.200000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.500000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_3=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.522)); +per_frame_4=wave_g = wave_g + 0.4*sin(time*1.731); +per_frame_5=ob_r = above(bass_att,bass)*(bass_att-bass)*4; +per_frame_6=volume = 0.3*(bass+mid+att); +per_frame_7=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_8=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_9=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_10=peakbass_att = max(bass_att,peakbass_att); +per_frame_11=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_12=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_13=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_14=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_15=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_16=beatcounter = beatcounter + beat; +per_frame_17=mode = if(beat*equal(beatcounter%2,0),1-mode,mode); +per_frame_18=mode2 = if(beat,(mode2 + rand(7) + 1)%8,mode2); +per_frame_19=mode3 = if(beat,(mode3 + rand(7) + 1)%8,mode3); +per_frame_20=q1 = 2*mode-1; +per_frame_21=q2 = mode2 + 2; +per_frame_22=q3 = 1/q2; +per_frame_23=q4 = mode3 + 2; +per_frame_24=q5 = 1/q4; +per_frame_25=wave_x = (rand(q2)+0.5)*q3; +per_frame_26=wave_y = (rand(q4)+0.5)*q5; +per_frame_27=decay = decay - 0.1*equal(frame%50,0); +per_pixel_1=cx = ((0&(x*q2-0.5))+0.5)*q3; +per_pixel_2=cy = ((0&(y*q4-0.5))+0.5)*q5; +per_pixel_3=rot = rot*pow(-1,(0&(x*q2-0.5)) + (0&(y*q4-0.5)))*q1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Windowframe To Mega Swirl 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Windowframe To Mega Swirl 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Windowframe To Mega Swirl 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash - Windowframe To Mega Swirl 2.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.300000 +fWaveScale=1.170000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=1.025000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.290770 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.500000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.01*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%6,0); +per_frame_7=left = 0.5 + 0.25*(sin(0.555*time) + sin(1.111*time)); +per_frame_8=right = 0.5 + 0.25*(sin(0.333*time) + sin(1.222*time)); +per_frame_9=centrex = (left+right)/2; +per_frame_10=distx = 0.1 + (abs(centrex-left)+abs(centrex-right))/2; +per_frame_11=q1 = centrex + distx; +per_frame_12=q2 = centrex - distx; +per_frame_13=wave_x = centrex; +per_frame_14=top = 0.5 + 0.25*(sin(0.888*time) + sin(0.999*time)); +per_frame_15=bottom = 0.5 + 0.25*(sin(0.444*time) + sin(1.333*time)); +per_frame_16=centrey = (top+bottom)/2; +per_frame_17=disty = 0.1 + (abs(centrey-top)+abs(centrey-bottom))/2; +per_frame_18=q3 = centrey + disty; +per_frame_19=q4 = centrey - disty; +per_frame_20=wave_y = 1-centrey; +per_pixel_1=rot=rot+0.16*sin(time*-3.3+rad*11)*(1.3-rad); +per_pixel_2=dx = if(above(x,q1), 1,dx); +per_pixel_3=dx = if(below(x,q2), -1,dx); +per_pixel_4=dy = if(above(y,q3), 1,dy); +per_pixel_5=dy = if(below(y,q4), -1,dy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Zylot - Inside The Planar Portal (Indecision Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Zylot - Inside The Planar Portal (Indecision Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Zylot - Inside The Planar Portal (Indecision Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Krash & Zylot - Inside The Planar Portal (Indecision Mix).milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,86 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.224799 +fWaveSmoothing=0.750000 +fWaveParam=-0.440000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=wave_mystery = wave_mystery + bass*.06; +per_frame_3=wave_r = bass*.4; +per_frame_4=wave_g = treb*.4; +per_frame_5=wave_b = mid*.4; +per_frame_6=q1 = bass*0.03; +per_frame_7=q2 = treb*0.03; +per_frame_8=vol = 0.167*(bass+mid); +per_frame_9=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_10=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_11=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_13=xpos = xpos + 0.001*xspeed; +per_frame_14=wave_x = 0.5+xpos; +per_frame_15=q3 = wave_x; +per_frame_16=q4 = 1-wave_y; +per_frame_17=q5 = 0.5+0.3*xpos; +per_pixel_1=newx = x - q3; +per_pixel_2=newy = y - q4; +per_pixel_3=inbox = above(x,q3-0.1-q2)*below(x,q3+0.1+q2)*above(y,q4-0.1-q1)*below(y,q4+0.1+q1); +per_pixel_4=newzoom = if(inbox,1.04,q5); +per_pixel_5=dx = (newx)*newzoom - newx + (1-inbox)*q5; +per_pixel_6=dy = (newy)*newzoom - newy + (1-inbox); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress - Acoustic Nerve Impulses (Under Drug Effetcs (Hypn.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress - Acoustic Nerve Impulses (Under Drug Effetcs (Hypn.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress - Acoustic Nerve Impulses (Under Drug Effetcs (Hypn.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress - Acoustic Nerve Impulses (Under Drug Effetcs (Hypn.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,287 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.000000 +fDecay=0.998500 +fVideoEchoZoom=1.168096 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.118879 +fWaveSmoothing=0.000000 +fWaveParam=-0.000100 +fModWaveAlphaStart=0.240000 +fModWaveAlphaEnd=1.300001 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999998 +fShader=0.000000 +zoom=1.010514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000022 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.340000 +ob_g=0.340000 +ob_b=0.340000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.340000 +ib_g=0.340000 +ib_b=0.340000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=16 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=2.279692 +wavecode_0_smoothing=0.700000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_init1=t8 = time; +wave_0_per_frame1=t7 = t8; +wave_0_per_frame2=t8 = time; +wave_0_per_point1=x = 0.5 + sin(sample*3 + time*0.1); +wave_0_per_point2=y = 0.5 + sin(sample*94.23) + 0.02*sin(time*4.5); +wave_0_per_point3=b=abs(sin(sample*100+time)); +wave_0_per_point4=r=abs(sin(sample*512+time)); +wave_0_per_point5=g=abs(sin(sample*10+time)); +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=73 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.959247 +shapecode_0_ang=6.031858 +shapecode_0_tex_ang=5.780530 +shapecode_0_tex_zoom=0.999998 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=0.090000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.100000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=flag1=int(abs(flag1-q1)); +shape_0_per_frame2=flag=int(abs(flag-q1*flag1)); +shape_0_per_frame3=ang =ang +if(flag,0,-.4)+abs(sin(bass))*.4*if(flag,1,-1); +shape_0_per_frame4= +shape_0_per_frame5=x=x+sin(time*.7)*.06; +shape_0_per_frame6=y=y+sin(time*.5)*.06; +shape_0_per_frame7= +shape_0_per_frame8= +shape_0_per_frame9= +shape_0_per_frame10=a = if(equal(q5+q6+q7,0),0,a); +shape_0_per_frame11=a2=a; +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.840000 +shapecode_1_y=0.220000 +shapecode_1_rad=0.600092 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=0.734577 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=0.890000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=flag = abs(flag-1); +shape_1_per_frame2=y = if(flag,.8,.2); +shape_1_per_frame3=ang=if(flag,-q2,q3); +shape_1_per_frame4=tex_ang=if(flag,-q3*3,q2*3); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.181000 +shapecode_2_y=0.800000 +shapecode_2_rad=0.599578 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=0.734577 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=flag = abs(flag-1); +shape_2_per_frame2=y = if(flag,.2,.8); +shape_2_per_frame3=ang=if(flag,-q3,q2); +shape_2_per_frame4=tex_ang=if(flag,-q2*3,q3*3); +shapecode_3_enabled=1 +shapecode_3_sides=6 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.560000 +shapecode_3_y=0.150000 +shapecode_3_rad=0.230671 +shapecode_3_ang=5.403541 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=0.010000 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=1.000000 +shapecode_3_a2=0.130000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=g = min(1,max(0,0.2*q7)); +shape_3_per_frame2=r = min(1,max(0,0.2*q6)); +shape_3_per_frame3=b = min(1,max(0,0.2*q5)); +shape_3_per_frame4=g2 = min(.8,max(0,0.1*q7)); +shape_3_per_frame5=r2 = min(.8,max(0,0.1*q6)); +shape_3_per_frame6=b2 = min(.8,max(0,0.1*q5)); +shape_3_per_frame7=ang=time; +shape_3_per_frame8=a = if(equal(q5+q6+q7,0),0,a); +shape_3_per_frame9=a2=if(equal(q5+q6+q7,0),0,a2); +shape_3_per_frame10= +shape_3_per_frame11=mbass=bass*5; +shape_3_per_frame12=xmov = 0.1*rand(10)*mbass*0.015*(1-2*above(rand(10),5)); +shape_3_per_frame13=ymov = pow(pow(mbass*0.015,2)-pow(xmovn,2),1/2)*(1-2*above(rand(10),5)); +shape_3_per_frame14=x = .5+xmov ; +shape_3_per_frame15=y = .5+ymov; +per_frame_init_1=oldy=.4; +per_frame_1=meanbass = 0.01*(meanbass*99+bass); +per_frame_2=meantreb = 0.01*(meantreb*99+treb); +per_frame_3=meanmid = 0.01*(meanmid*99+mid); +per_frame_4=bassdiff = (bass - meanbass)*15; +per_frame_5=trebdiff = (treb - meantreb)*15; +per_frame_6=middiff = (mid - meanmid)*15; +per_frame_7=bassdiff = above(bassdiff,0)*bassdiff; +per_frame_8=trebdiff = above(trebdiff,0)*trebdiff; +per_frame_9=middiff = above(middiff,0)*middiff; +per_frame_10=q5=bassdiff; +per_frame_11=q6=middiff; +per_frame_12=q7=trebdiff; +per_frame_13= +per_frame_14= +per_frame_15= +per_frame_16=//Thanks to krash for beat detection (modified) +per_frame_17=volume = 0.3*bass+mid; +per_frame_18=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_19=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_20=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_21=runmeanbass =(runmeanbass*2 + bass_att)/3; +per_frame_22=peakbass_att = max(bass_att,peakbass_att); +per_frame_23=beat = above(volume,0.8)*above(bass_att,runmeanbass*1.1)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_24=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_25=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_26=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_27=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_28=q1 = beat; +per_frame_29=q2=oldq2+bass*.02; +per_frame_30=oldq2=q2; +per_frame_31=q3=oldq3+treb*.02; +per_frame_32=oldq3=q3; +per_frame_33=temp = y; +per_frame_34=y = if(beat,oldy,y); +per_frame_35=oldy=if(beat,temp,oldy); +per_frame_36= +per_frame_37=monitor =q2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress & Juppy - Dancer.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress & Juppy - Dancer.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress & Juppy - Dancer.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress & Juppy - Dancer.milk 2015-10-19 08:39:19.000000000 +0000 @@ -0,0 +1,403 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=0.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=1.000000 +wave_y=1.000000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.300000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=3.000000 +nMotionVectorsY=2.000000 +mv_dx=0.020000 +mv_dy=-0.020000 +mv_l=0.150000 +mv_r=0.490000 +mv_g=0.480000 +mv_b=0.300001 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=16 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.0000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_point1=dim =1; //Dancer dimensions +wave_0_per_point2=xpos=0;//Dancer x position variation +wave_0_per_point3=ypos=0;//Dancer y position variation +wave_0_per_point4= +wave_0_per_point5= +wave_0_per_point6= +wave_0_per_point7=//Position Stabilization +wave_0_per_point8=xpos=xpos+(1-dim)/2; +wave_0_per_point9=ypos=ypos+(1-dim)/2; +wave_0_per_point10= +wave_0_per_point11=meanbass = 0.01*(meanbass*99+bass); +wave_0_per_point12=meantreb = 0.01*(meantreb*99+treb); +wave_0_per_point13=meanmid = 0.01*(meanmid*99+mid); +wave_0_per_point14=bassdiff = (bass - meanbass)*15; +wave_0_per_point15=trebdiff = (treb - meantreb)*15; +wave_0_per_point16=middiff = (mid - meanmid)*15; +wave_0_per_point17=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +wave_0_per_point18=tr = min(above(trebdiff,0)*trebdiff*.005,.11); +wave_0_per_point19=mi = min(above(middiff,0)*middiff*.005,.11); +wave_0_per_point20= +wave_0_per_point21=mi2_prg = mi2_prg+mi; +wave_0_per_point22=gam = abs(gam-above(mi2_prg,5)); +wave_0_per_point23=mi2_prg= if(above(mi2_prg,5),0,mi2_prg); +wave_0_per_point24= +wave_0_per_point25=s = sample *15; +wave_0_per_point26=//Gambe +wave_0_per_point27=x= if(equal(int(s),1),.4,.4); +wave_0_per_point28=y= if(equal(int(s),1),.2+((ba+tr)*.5)*gam,.2+((ba+tr)*.5)*gam); +wave_0_per_point29= +wave_0_per_point30=x= if(equal(int(s),2),.5+sin(ba*100)*.03,x); +wave_0_per_point31=y= if(equal(int(s),2),.4,y); +wave_0_per_point32= +wave_0_per_point33=x= if(equal(int(s),3),.6,x); +wave_0_per_point34=y= if(equal(int(s),3),.2+((ba+tr)*.5)*(1-gam),y); +wave_0_per_point35= +wave_0_per_point36=x= if(equal(int(s),4),.5+sin(ba*100)*.03,x); +wave_0_per_point37=y= if(equal(int(s),4),.4,y); +wave_0_per_point38= +wave_0_per_point39=//Corpo +wave_0_per_point40=x= if(equal(int(s),5),.5,x); +wave_0_per_point41=y= if(equal(int(s),5),.6,y); +wave_0_per_point42= +wave_0_per_point43=//Braccia +wave_0_per_point44=x= if(equal(int(s),6),.4-mi*.23,x); +wave_0_per_point45=y= if(equal(int(s),6),.5+mi,y); +wave_0_per_point46= +wave_0_per_point47=x= if(equal(int(s),7),.5,x); +wave_0_per_point48=y= if(equal(int(s),7),.6,y); +wave_0_per_point49= +wave_0_per_point50=x= if(equal(int(s),8),.6+tr*.23,x); +wave_0_per_point51=y= if(equal(int(s),8),.5+tr,y); +wave_0_per_point52= +wave_0_per_point53=x= if(equal(int(s),9),.5,x); +wave_0_per_point54=y= if(equal(int(s),9),.6,y); +wave_0_per_point55= +wave_0_per_point56=//Testa +wave_0_per_point57=x= if(equal(int(s),10),.5,x); +wave_0_per_point58=y= if(equal(int(s),10),.62,y); +wave_0_per_point59= +wave_0_per_point60=x= if(equal(int(s),11),.47-ba*.23,x); +wave_0_per_point61=y= if(equal(int(s),11),.62,y); +wave_0_per_point62=x= if(equal(int(s),12),.47-ba*.23,x); +wave_0_per_point63=y= if(equal(int(s),12),.67+ba*.23,y); +wave_0_per_point64= +wave_0_per_point65=x= if(equal(int(s),13),.53+ba*.23,x); +wave_0_per_point66=y= if(equal(int(s),13),.67+ba*.23,y); +wave_0_per_point67= +wave_0_per_point68=x= if(equal(int(s),14),.53+ba*.23,x); +wave_0_per_point69=y= if(equal(int(s),14),.62,y); +wave_0_per_point70= +wave_0_per_point71=x= if(equal(int(s),15),.50,x); +wave_0_per_point72=y= if(equal(int(s),15),.62,y); +wave_0_per_point73= +wave_0_per_point74=x=x*dim+xpos; +wave_0_per_point75=y=y*dim+ypos; +wave_0_per_point76= +wave_0_per_point77=mi_prg= if(above(mi_prg,5),0,mi_prg+mi*.1); +wave_0_per_point78=ba_prg= if(above(ba_prg,5),0,ba_prg+ba*.1); +wave_0_per_point79=tr_prg= if(above(tr_prg,5),0,tr_prg+tr*.1); +wave_0_per_point80= +wave_0_per_point81=hm=sample+mi2_prg; +wave_0_per_point82=ht=sample+tr_prg; +wave_0_per_point83=hb=sample+ba_prg; +wave_0_per_point84= +wave_0_per_point85=r=hm; +wave_0_per_point86=g=ht; +wave_0_per_point87=b=hb; +wave_0_per_point88=a=.8; +wavecode_1_enabled=0 +wavecode_1_samples=16 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=1 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=1 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_per_frame1= +wave_2_per_frame2=rx=atan2(q2,sqr(q3)+sqr(q4))/4+q3/2; +wave_2_per_frame3=ry=atan2(q2,q4); +wave_2_per_frame4=rz=0; +wave_2_per_frame5= +wave_2_per_frame6=t1=sin(rx);t2=cos(rx); +wave_2_per_frame7=t3=sin(ry);t4=cos(ry); +wave_2_per_frame8=t5=sin(rz);t6=cos(rz); +wave_2_per_point1=sample=sample*q1*134; +wave_2_per_point2=x1=sin(sample*543)*2+q2; +wave_2_per_point3=y1=cos(sample*4232)*2+q3; +wave_2_per_point4=z1=sin(sample*90)*2+q4; +wave_2_per_point5= +wave_2_per_point6=x2=x1*t4-z1*t3;z2=x1*t3+z1*t4; +wave_2_per_point7=y2=y1*t2-z2*t1;z3=y1*t1+z2*t2+1; +wave_2_per_point8=x3=x2*t6-y2*t5;y3=x2*t5+y2*t6; +wave_2_per_point9=z3=if(above(z3,.1),.5/z3,0); +wave_2_per_point10=x=if(z3,x3*z3,x)+.5; +wave_2_per_point11=y=if(z3,-y3*z3,y)+.5; +wave_2_per_point12=a=z3*.8; +wavecode_3_enabled=0 +wavecode_3_samples=142 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +wave_3_per_frame1= +wave_3_per_frame2=rx=atan2(q2,sqr(q3)+sqr(q4))/4+q3/2; +wave_3_per_frame3=ry=atan2(q2,q4); +wave_3_per_frame4=rz=0; +wave_3_per_frame5=ry1=ry1+bass_att*.2; +wave_3_per_frame6=t1=sin(rx);t2=cos(rx); +wave_3_per_frame7=t3=sin(ry);t4=cos(ry); +wave_3_per_frame8=t5=sin(rz);t6=cos(rz); +wave_3_per_frame9=t7=sin(ry1);t8=cos(ry1); +wave_3_per_frame10= +wave_3_per_point1=cp=bnot(cp); +wave_3_per_point2=r=sample*q1*10; +wave_3_per_point3=i1=(sample*6)%2; +wave_3_per_point4=rt=if(cp,.7,.2); +wave_3_per_point5=sample=sample*q1*.5; +wave_3_per_point6= +wave_3_per_point7=x1=sin(r)*rt; +wave_3_per_point8=z1=cos(r)*rt; +wave_3_per_point9=y1=-.5; +wave_3_per_point10=x2=x1*t8-z1*t7;z2=x1*t7+z1*t8; +wave_3_per_point11=x1=x2+q2; +wave_3_per_point12=y1=y1+q3; +wave_3_per_point13=z1=z2+q4; +wave_3_per_point14=x2=x1*t4-z1*t3;z2=x1*t3+z1*t4; +wave_3_per_point15=y2=y1*t2-z2*t1;z3=y1*t1+z2*t2+1.4; +wave_3_per_point16=x3=x2*t6-y2*t5;y3=x2*t5+y2*t6; +wave_3_per_point17=z3=if(above(z3,.1),.5/z3,0); +wave_3_per_point18=x=if(z3,x3*z3,x)+.5; +wave_3_per_point19=y=if(z3,-y3*z3,y)+.5; +wave_3_per_point20=hu=sample+cos(time/q1)*q1; +wave_3_per_point21=r=sin(hu)*.5+.5; +wave_3_per_point22=g=sin(hu+q1*.33)*.5+.5; +wave_3_per_point23=b=sin(hu+q1*.66)*.5+.5; +wave_3_per_point24=a=z3*.8; +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.840000 +shapecode_0_y=0.740000 +shapecode_0_rad=0.289992 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.361327 +shapecode_0_r=0.100000 +shapecode_0_g=0.500000 +shapecode_0_b=0.500000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.100000 +shapecode_0_g2=0.500000 +shapecode_0_b2=0.400000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.040000 +shape_0_per_frame1=temp1 = 0.01*(temp1*99+bass); +shape_0_per_frame2=temp2 = (bass - temp1)*15; +shape_0_per_frame3=temp3 = min(above(temp2,0)*temp2*.005,.11); +shape_0_per_frame4= +shape_0_per_frame5=temp4= temp4+temp3; +shape_0_per_frame6= +shape_0_per_frame7=tex_ang =-temp4; +shapecode_1_enabled=1 +shapecode_1_sides=100 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.150000 +shapecode_1_y=0.730000 +shapecode_1_rad=0.511334 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.388689 +shapecode_1_r=0.600000 +shapecode_1_g=0.600000 +shapecode_1_b=0.200000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.600000 +shapecode_1_g2=0.600000 +shapecode_1_b2=0.210000 +shapecode_1_a2=0.899999 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.070000 +shape_1_per_frame1=meanbass = 0.01*(meanbass*99+bass); +shape_1_per_frame2=bassdiff = (bass - meanbass)*15; +shape_1_per_frame3=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +shape_1_per_frame4= +shape_1_per_frame5= +shape_1_per_frame6=ba_prg= ba_prg+ba; +shape_1_per_frame7= +shape_1_per_frame8=tex_ang =-ba_prg; +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=1 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.000000 +shapecode_2_rad=0.559238 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shape_2_per_frame1=meanbass = 0.01*(meanbass*99+bass); +shape_2_per_frame2=meantreb = 0.01*(meantreb*99+treb); +shape_2_per_frame3=meanmid = 0.01*(meanmid*99+mid); +shape_2_per_frame4=bassdiff = (bass - meanbass)*15; +shape_2_per_frame5=trebdiff = (treb - meantreb)*15; +shape_2_per_frame6=middiff = (mid - meanmid)*15; +shape_2_per_frame7=bassdiff = above(bassdiff,0)*bassdiff; +shape_2_per_frame8=trebdiff = above(trebdiff,0)*trebdiff; +shape_2_per_frame9=middiff = above(middiff,0)*middiff; +shape_2_per_frame10= +shape_2_per_frame11=g = min(1,max(0,0.2*trebdiff)); +shape_2_per_frame12=r = min(1,max(0,0.2*middiff)); +shape_2_per_frame13=b = min(1,max(0,0.2*bassdiff)); +shape_2_per_frame14=g2 = min(1,max(0,0.2*trebdiff)); +shape_2_per_frame15=r2 = min(1,max(0,0.2*middiff)); +shape_2_per_frame16=b2 = min(1,max(0,0.2*bassdiff)); +shape_2_per_frame17=border_g = .4+min(.6,max(0,0.1*trebdiff)); +shape_2_per_frame18=border_r = .4+min(.6,max(0,0.1*middiff)); +shape_2_per_frame19=border_b = .4+min(.6,max(0,0.1*bassdiff)); +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=q1=acos(-1)*2; +per_frame_1=decay=.30; +per_frame_2= +per_frame_3=meanmid = 0.01*(meanmid*99+mid); +per_frame_4=middiff = (mid - meanmid)*15; +per_frame_5=mi = min(above(middiff,0)*middiff*.005,.11); +per_frame_6= +per_frame_7=mi_prg = mi_prg+mi; +per_frame_8=gam = abs(gam-above(mi_prg,.5)); +per_frame_9=mi_prg= if(above(mi_prg,.5),0,mi_prg); +per_frame_10=q1=gam; +per_frame_11=monitor =mi_prg; +per_pixel_1= +per_pixel_2=ylim=.8; +per_pixel_3= +per_pixel_4=sx = sy-below(y,ylim)*.001; +per_pixel_5=dx=dx+.01*bass*(1-q1*2)*below(y,ylim); +per_pixel_6=rot=rot+.051*below(y,ylim); +per_pixel_7=cx=int(x*16)/16; +per_pixel_8=cy=int(y*16)/16; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress & Juppy - Dancers In The Dark.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress & Juppy - Dancers In The Dark.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress & Juppy - Dancers In The Dark.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress & Juppy - Dancers In The Dark.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,673 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=0.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=1.000000 +wave_y=1.000000 +ob_size=0.500000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.500000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=3.000000 +nMotionVectorsY=2.000000 +mv_dx=0.020000 +mv_dy=-0.020000 +mv_l=0.150000 +mv_r=0.490000 +mv_g=0.480000 +mv_b=0.300001 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=16 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_point1=meanbass = 0.01*(meanbass*99+bass_att); +wave_0_per_point2=meantreb = 0.01*(meantreb*99+treb_att); +wave_0_per_point3=meanmid = 0.01*(meanmid*99+mid_att); +wave_0_per_point4=bassdiff = (bass_att - meanbass)*15; +wave_0_per_point5=trebdiff = (treb_att - meantreb)*15; +wave_0_per_point6=middiff = (mid_att - meanmid)*15; +wave_0_per_point7=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +wave_0_per_point8=tr = min(above(trebdiff,0)*trebdiff*.005,.11); +wave_0_per_point9=mi = min(above(middiff,0)*middiff*.005,.11); +wave_0_per_point10=baprg=baprg+ba*.3; +wave_0_per_point11=trprg=trprg+tr*.2; +wave_0_per_point12=miprg=miprg+tr*.2; +wave_0_per_point13= +wave_0_per_point14= +wave_0_per_point15=dim =.5+.4*sin(miprg); //Dancer dimensions +wave_0_per_point16=xpos=0+.3*sin(baprg);//Dancer x position variation +wave_0_per_point17=ypos=0+.2*sin(trprg);//Dancer y position variation +wave_0_per_point18= +wave_0_per_point19= +wave_0_per_point20= +wave_0_per_point21=//Position Stabilization +wave_0_per_point22=xpos=xpos+(1-dim)/2; +wave_0_per_point23=ypos=ypos+(1-dim)/2; +wave_0_per_point24= +wave_0_per_point25=meanbass = 0.01*(meanbass*99+bass); +wave_0_per_point26=meantreb = 0.01*(meantreb*99+treb); +wave_0_per_point27=meanmid = 0.01*(meanmid*99+mid); +wave_0_per_point28=bassdiff = (bass - meanbass)*15; +wave_0_per_point29=trebdiff = (treb - meantreb)*15; +wave_0_per_point30=middiff = (mid - meanmid)*15; +wave_0_per_point31=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +wave_0_per_point32=tr = min(above(trebdiff,0)*trebdiff*.005,.11); +wave_0_per_point33=mi = min(above(middiff,0)*middiff*.005,.11); +wave_0_per_point34= +wave_0_per_point35=mi2_prg = mi2_prg+mi; +wave_0_per_point36=gam = abs(gam-above(mi2_prg,5)); +wave_0_per_point37=mi2_prg= if(above(mi2_prg,5),0,mi2_prg); +wave_0_per_point38= +wave_0_per_point39=s = sample *15; +wave_0_per_point40=//Gambe +wave_0_per_point41=x= if(equal(int(s),1),.4,.4); +wave_0_per_point42=y= if(equal(int(s),1),.2+((ba+tr)*.5)*gam,.2+((ba+tr)*.5)*gam); +wave_0_per_point43= +wave_0_per_point44=x= if(equal(int(s),2),.5+sin(ba*100)*.03,x); +wave_0_per_point45=y= if(equal(int(s),2),.4,y); +wave_0_per_point46= +wave_0_per_point47=x= if(equal(int(s),3),.6,x); +wave_0_per_point48=y= if(equal(int(s),3),.2+((ba+tr)*.5)*(1-gam),y); +wave_0_per_point49= +wave_0_per_point50=x= if(equal(int(s),4),.5+sin(ba*100)*.03,x); +wave_0_per_point51=y= if(equal(int(s),4),.4,y); +wave_0_per_point52= +wave_0_per_point53=//Corpo +wave_0_per_point54=x= if(equal(int(s),5),.5,x); +wave_0_per_point55=y= if(equal(int(s),5),.6,y); +wave_0_per_point56= +wave_0_per_point57=//Braccia +wave_0_per_point58=x= if(equal(int(s),6),.4-mi*.23,x); +wave_0_per_point59=y= if(equal(int(s),6),.5+mi,y); +wave_0_per_point60= +wave_0_per_point61=x= if(equal(int(s),7),.5,x); +wave_0_per_point62=y= if(equal(int(s),7),.6,y); +wave_0_per_point63= +wave_0_per_point64=x= if(equal(int(s),8),.6+tr*.23,x); +wave_0_per_point65=y= if(equal(int(s),8),.5+tr,y); +wave_0_per_point66= +wave_0_per_point67=x= if(equal(int(s),9),.5,x); +wave_0_per_point68=y= if(equal(int(s),9),.6,y); +wave_0_per_point69= +wave_0_per_point70=//Testa +wave_0_per_point71=x= if(equal(int(s),10),.5,x); +wave_0_per_point72=y= if(equal(int(s),10),.62,y); +wave_0_per_point73= +wave_0_per_point74=x= if(equal(int(s),11),.47-ba*.23,x); +wave_0_per_point75=y= if(equal(int(s),11),.62,y); +wave_0_per_point76=x= if(equal(int(s),12),.47-ba*.23,x); +wave_0_per_point77=y= if(equal(int(s),12),.67+ba*.23,y); +wave_0_per_point78= +wave_0_per_point79=x= if(equal(int(s),13),.53+ba*.23,x); +wave_0_per_point80=y= if(equal(int(s),13),.67+ba*.23,y); +wave_0_per_point81= +wave_0_per_point82=x= if(equal(int(s),14),.53+ba*.23,x); +wave_0_per_point83=y= if(equal(int(s),14),.62,y); +wave_0_per_point84= +wave_0_per_point85=x= if(equal(int(s),15),.50,x); +wave_0_per_point86=y= if(equal(int(s),15),.62,y); +wave_0_per_point87= +wave_0_per_point88=x=x*dim+xpos; +wave_0_per_point89=y=y*dim+ypos; +wave_0_per_point90= +wave_0_per_point91=mi_prg= if(above(mi_prg,5),0,mi_prg+mi*.1); +wave_0_per_point92=ba_prg= if(above(ba_prg,5),0,ba_prg+ba*.1); +wave_0_per_point93=tr_prg= if(above(tr_prg,5),0,tr_prg+tr*.1); +wave_0_per_point94= +wave_0_per_point95=hm=sample+mi2_prg; +wave_0_per_point96=ht=sample+tr_prg; +wave_0_per_point97=hb=sample+ba_prg; +wave_0_per_point98= +wave_0_per_point99=r=hm; +wave_0_per_point100=g=ht; +wave_0_per_point101=b=hb; +wave_0_per_point102=a=.8; +wavecode_1_enabled=1 +wavecode_1_samples=16 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_per_point1=meanbass = 0.01*(meanbass*99+bass_att); +wave_1_per_point2=meantreb = 0.01*(meantreb*99+treb_att); +wave_1_per_point3=meanmid = 0.01*(meanmid*99+mid_att); +wave_1_per_point4=bassdiff = (bass_att - meanbass)*15; +wave_1_per_point5=trebdiff = (treb_att - meantreb)*15; +wave_1_per_point6=middiff = (mid_att - meanmid)*15; +wave_1_per_point7=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +wave_1_per_point8=tr = min(above(trebdiff,0)*trebdiff*.005,.11); +wave_1_per_point9=mi = min(above(middiff,0)*middiff*.005,.11); +wave_1_per_point10=baprg=baprg+ba*.4; +wave_1_per_point11=trprg=trprg+tr*.1; +wave_1_per_point12=miprg=miprg+tr*.3; +wave_1_per_point13= +wave_1_per_point14= +wave_1_per_point15=dim =.5+.3*sin(baprg); //Dancer dimensions +wave_1_per_point16=xpos=0+.3*sin(trprg);//Dancer x position variation +wave_1_per_point17=ypos=0+.2*sin(miprg);//Dancer y position variation +wave_1_per_point18= +wave_1_per_point19= +wave_1_per_point20= +wave_1_per_point21=//Position Stabilization +wave_1_per_point22=xpos=xpos+(1-dim)/2; +wave_1_per_point23=ypos=ypos+(1-dim)/2; +wave_1_per_point24= +wave_1_per_point25=meanbass = 0.01*(meanbass*99+bass); +wave_1_per_point26=meantreb = 0.01*(meantreb*99+treb); +wave_1_per_point27=meanmid = 0.01*(meanmid*99+mid); +wave_1_per_point28=bassdiff = (bass - meanbass)*15; +wave_1_per_point29=trebdiff = (treb - meantreb)*15; +wave_1_per_point30=middiff = (mid - meanmid)*15; +wave_1_per_point31=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +wave_1_per_point32=tr = min(above(trebdiff,0)*trebdiff*.005,.11); +wave_1_per_point33=mi = min(above(middiff,0)*middiff*.005,.11); +wave_1_per_point34= +wave_1_per_point35=mi2_prg = mi2_prg+mi; +wave_1_per_point36=gam = abs(gam-above(mi2_prg,5)); +wave_1_per_point37=mi2_prg= if(above(mi2_prg,5),0,mi2_prg); +wave_1_per_point38= +wave_1_per_point39=s = sample *15; +wave_1_per_point40=//Gambe +wave_1_per_point41=x= if(equal(int(s),1),.4,.4); +wave_1_per_point42=y= if(equal(int(s),1),.2+((ba+tr)*.5)*gam,.2+((ba+tr)*.5)*gam); +wave_1_per_point43= +wave_1_per_point44=x= if(equal(int(s),2),.5+sin(ba*100)*.03,x); +wave_1_per_point45=y= if(equal(int(s),2),.4,y); +wave_1_per_point46= +wave_1_per_point47=x= if(equal(int(s),3),.6,x); +wave_1_per_point48=y= if(equal(int(s),3),.2+((ba+tr)*.5)*(1-gam),y); +wave_1_per_point49= +wave_1_per_point50=x= if(equal(int(s),4),.5+sin(ba*100)*.03,x); +wave_1_per_point51=y= if(equal(int(s),4),.4,y); +wave_1_per_point52= +wave_1_per_point53=//Corpo +wave_1_per_point54=x= if(equal(int(s),5),.5,x); +wave_1_per_point55=y= if(equal(int(s),5),.6,y); +wave_1_per_point56= +wave_1_per_point57=//Braccia +wave_1_per_point58=x= if(equal(int(s),6),.4-mi*.23,x); +wave_1_per_point59=y= if(equal(int(s),6),.5+mi,y); +wave_1_per_point60= +wave_1_per_point61=x= if(equal(int(s),7),.5,x); +wave_1_per_point62=y= if(equal(int(s),7),.6,y); +wave_1_per_point63= +wave_1_per_point64=x= if(equal(int(s),8),.6+tr*.23,x); +wave_1_per_point65=y= if(equal(int(s),8),.5+tr,y); +wave_1_per_point66= +wave_1_per_point67=x= if(equal(int(s),9),.5,x); +wave_1_per_point68=y= if(equal(int(s),9),.6,y); +wave_1_per_point69= +wave_1_per_point70=//Testa +wave_1_per_point71=x= if(equal(int(s),10),.5,x); +wave_1_per_point72=y= if(equal(int(s),10),.62,y); +wave_1_per_point73= +wave_1_per_point74=x= if(equal(int(s),11),.47-ba*.23,x); +wave_1_per_point75=y= if(equal(int(s),11),.62,y); +wave_1_per_point76=x= if(equal(int(s),12),.47-ba*.23,x); +wave_1_per_point77=y= if(equal(int(s),12),.67+ba*.23,y); +wave_1_per_point78= +wave_1_per_point79=x= if(equal(int(s),13),.53+ba*.23,x); +wave_1_per_point80=y= if(equal(int(s),13),.67+ba*.23,y); +wave_1_per_point81= +wave_1_per_point82=x= if(equal(int(s),14),.53+ba*.23,x); +wave_1_per_point83=y= if(equal(int(s),14),.62,y); +wave_1_per_point84= +wave_1_per_point85=x= if(equal(int(s),15),.50,x); +wave_1_per_point86=y= if(equal(int(s),15),.62,y); +wave_1_per_point87= +wave_1_per_point88=x=x*dim+xpos; +wave_1_per_point89=y=y*dim+ypos; +wave_1_per_point90= +wave_1_per_point91=mi_prg= if(above(mi_prg,5),0,mi_prg+mi*.1); +wave_1_per_point92=ba_prg= if(above(ba_prg,5),0,ba_prg+ba*.1); +wave_1_per_point93=tr_prg= if(above(tr_prg,5),0,tr_prg+tr*.1); +wave_1_per_point94= +wave_1_per_point95=hm=sample+mi2_prg; +wave_1_per_point96=ht=sample+tr_prg; +wave_1_per_point97=hb=sample+ba_prg; +wave_1_per_point98= +wave_1_per_point99=r=hm; +wave_1_per_point100=g=ht; +wave_1_per_point101=b=hb; +wave_1_per_point102=a=.8; +wavecode_2_enabled=1 +wavecode_2_samples=16 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=meanbass = 0.01*(meanbass*99+bass); +wave_2_per_point2=meantreb = 0.01*(meantreb*99+treb); +wave_2_per_point3=meanmid = 0.01*(meanmid*99+mid); +wave_2_per_point4=bassdiff = (bass - meanbass)*15; +wave_2_per_point5=trebdiff = (treb - meantreb)*15; +wave_2_per_point6=middiff = (mid - meanmid)*15; +wave_2_per_point7=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +wave_2_per_point8=tr = min(above(trebdiff,0)*trebdiff*.005,.11); +wave_2_per_point9=mi = min(above(middiff,0)*middiff*.005,.11); +wave_2_per_point10=baprg=baprg+ba*.1; +wave_2_per_point11=trprg=trprg+tr*.24; +wave_2_per_point12=miprg=miprg+tr*.3; +wave_2_per_point13= +wave_2_per_point14= +wave_2_per_point15=dim =.5+.3*sin(miprg); //Dancer dimensions +wave_2_per_point16=xpos=0+.3*sin(trprg);//Dancer x position variation +wave_2_per_point17=ypos=0+.2*sin(baprg);//Dancer y position variation +wave_2_per_point18= +wave_2_per_point19= +wave_2_per_point20= +wave_2_per_point21=//Position Stabilization +wave_2_per_point22=xpos=xpos+(1-dim)/2; +wave_2_per_point23=ypos=ypos+(1-dim)/2; +wave_2_per_point24= +wave_2_per_point25=meanbass = 0.01*(meanbass*99+bass); +wave_2_per_point26=meantreb = 0.01*(meantreb*99+treb); +wave_2_per_point27=meanmid = 0.01*(meanmid*99+mid); +wave_2_per_point28=bassdiff = (bass - meanbass)*15; +wave_2_per_point29=trebdiff = (treb - meantreb)*15; +wave_2_per_point30=middiff = (mid - meanmid)*15; +wave_2_per_point31=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +wave_2_per_point32=tr = min(above(trebdiff,0)*trebdiff*.005,.11); +wave_2_per_point33=mi = min(above(middiff,0)*middiff*.005,.11); +wave_2_per_point34= +wave_2_per_point35=mi2_prg = mi2_prg+mi; +wave_2_per_point36=gam = abs(gam-above(mi2_prg,5)); +wave_2_per_point37=mi2_prg= if(above(mi2_prg,5),0,mi2_prg); +wave_2_per_point38= +wave_2_per_point39=s = sample *15; +wave_2_per_point40=//Gambe +wave_2_per_point41=x= if(equal(int(s),1),.4,.4); +wave_2_per_point42=y= if(equal(int(s),1),.2+((ba+tr)*.5)*gam,.2+((ba+tr)*.5)*gam); +wave_2_per_point43= +wave_2_per_point44=x= if(equal(int(s),2),.5+sin(ba*100)*.03,x); +wave_2_per_point45=y= if(equal(int(s),2),.4,y); +wave_2_per_point46= +wave_2_per_point47=x= if(equal(int(s),3),.6,x); +wave_2_per_point48=y= if(equal(int(s),3),.2+((ba+tr)*.5)*(1-gam),y); +wave_2_per_point49= +wave_2_per_point50=x= if(equal(int(s),4),.5+sin(ba*100)*.03,x); +wave_2_per_point51=y= if(equal(int(s),4),.4,y); +wave_2_per_point52= +wave_2_per_point53=//Corpo +wave_2_per_point54=x= if(equal(int(s),5),.5,x); +wave_2_per_point55=y= if(equal(int(s),5),.6,y); +wave_2_per_point56= +wave_2_per_point57=//Braccia +wave_2_per_point58=x= if(equal(int(s),6),.4-mi*.23,x); +wave_2_per_point59=y= if(equal(int(s),6),.5+mi,y); +wave_2_per_point60= +wave_2_per_point61=x= if(equal(int(s),7),.5,x); +wave_2_per_point62=y= if(equal(int(s),7),.6,y); +wave_2_per_point63= +wave_2_per_point64=x= if(equal(int(s),8),.6+tr*.23,x); +wave_2_per_point65=y= if(equal(int(s),8),.5+tr,y); +wave_2_per_point66= +wave_2_per_point67=x= if(equal(int(s),9),.5,x); +wave_2_per_point68=y= if(equal(int(s),9),.6,y); +wave_2_per_point69= +wave_2_per_point70=//Testa +wave_2_per_point71=x= if(equal(int(s),10),.5,x); +wave_2_per_point72=y= if(equal(int(s),10),.62,y); +wave_2_per_point73= +wave_2_per_point74=x= if(equal(int(s),11),.47-ba*.23,x); +wave_2_per_point75=y= if(equal(int(s),11),.62,y); +wave_2_per_point76=x= if(equal(int(s),12),.47-ba*.23,x); +wave_2_per_point77=y= if(equal(int(s),12),.67+ba*.23,y); +wave_2_per_point78= +wave_2_per_point79=x= if(equal(int(s),13),.53+ba*.23,x); +wave_2_per_point80=y= if(equal(int(s),13),.67+ba*.23,y); +wave_2_per_point81= +wave_2_per_point82=x= if(equal(int(s),14),.53+ba*.23,x); +wave_2_per_point83=y= if(equal(int(s),14),.62,y); +wave_2_per_point84= +wave_2_per_point85=x= if(equal(int(s),15),.50,x); +wave_2_per_point86=y= if(equal(int(s),15),.62,y); +wave_2_per_point87= +wave_2_per_point88=x=x*dim+xpos; +wave_2_per_point89=y=y*dim+ypos; +wave_2_per_point90= +wave_2_per_point91=mi_prg= if(above(mi_prg,5),0,mi_prg+mi*.1); +wave_2_per_point92=ba_prg= if(above(ba_prg,5),0,ba_prg+ba*.1); +wave_2_per_point93=tr_prg= if(above(tr_prg,5),0,tr_prg+tr*.1); +wave_2_per_point94= +wave_2_per_point95=hm=sample+mi2_prg; +wave_2_per_point96=ht=sample+tr_prg; +wave_2_per_point97=hb=sample+ba_prg; +wave_2_per_point98= +wave_2_per_point99=r=hm; +wave_2_per_point100=g=ht; +wave_2_per_point101=b=hb; +wave_2_per_point102=a=.8; +wavecode_3_enabled=1 +wavecode_3_samples=16 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +wave_3_per_frame1= +wave_3_per_frame2=rx=at +wave_3_per_point1=meanbass = 0.01*(meanbass*99+bass); +wave_3_per_point2=meantreb = 0.01*(meantreb*99+treb); +wave_3_per_point3=meanmid = 0.01*(meanmid*99+mid); +wave_3_per_point4=bassdiff = (bass - meanbass)*15; +wave_3_per_point5=trebdiff = (treb - meantreb)*15; +wave_3_per_point6=middiff = (mid - meanmid)*15; +wave_3_per_point7=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +wave_3_per_point8=tr = min(above(trebdiff,0)*trebdiff*.005,.11); +wave_3_per_point9=mi = min(above(middiff,0)*middiff*.005,.11); +wave_3_per_point10=baprg=baprg+ba*.26; +wave_3_per_point11=trprg=trprg+tr*.34; +wave_3_per_point12=miprg=miprg+tr*.125; +wave_3_per_point13= +wave_3_per_point14= +wave_3_per_point15=dim =.5+.4*sin(trprg); //Dancer dimensions +wave_3_per_point16=xpos=0+.3*sin(baprg);//Dancer x position variation +wave_3_per_point17=ypos=0+.2*sin(miprg);//Dancer y position variation +wave_3_per_point18= +wave_3_per_point19= +wave_3_per_point20= +wave_3_per_point21=//Position Stabilization +wave_3_per_point22=xpos=xpos+(1-dim)/2; +wave_3_per_point23=ypos=ypos+(1-dim)/2; +wave_3_per_point24= +wave_3_per_point25=meanbass = 0.01*(meanbass*99+bass); +wave_3_per_point26=meantreb = 0.01*(meantreb*99+treb); +wave_3_per_point27=meanmid = 0.01*(meanmid*99+mid); +wave_3_per_point28=bassdiff = (bass - meanbass)*15; +wave_3_per_point29=trebdiff = (treb - meantreb)*15; +wave_3_per_point30=middiff = (mid - meanmid)*15; +wave_3_per_point31=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +wave_3_per_point32=tr = min(above(trebdiff,0)*trebdiff*.005,.11); +wave_3_per_point33=mi = min(above(middiff,0)*middiff*.005,.11); +wave_3_per_point34= +wave_3_per_point35=mi2_prg = mi2_prg+mi; +wave_3_per_point36=gam = abs(gam-above(mi2_prg,5)); +wave_3_per_point37=mi2_prg= if(above(mi2_prg,5),0,mi2_prg); +wave_3_per_point38= +wave_3_per_point39=s = sample *15; +wave_3_per_point40=//Gambe +wave_3_per_point41=x= if(equal(int(s),1),.4,.4); +wave_3_per_point42=y= if(equal(int(s),1),.2+((ba+tr)*.5)*gam,.2+((ba+tr)*.5)*gam); +wave_3_per_point43= +wave_3_per_point44=x= if(equal(int(s),2),.5+sin(ba*100)*.03,x); +wave_3_per_point45=y= if(equal(int(s),2),.4,y); +wave_3_per_point46= +wave_3_per_point47=x= if(equal(int(s),3),.6,x); +wave_3_per_point48=y= if(equal(int(s),3),.2+((ba+tr)*.5)*(1-gam),y); +wave_3_per_point49= +wave_3_per_point50=x= if(equal(int(s),4),.5+sin(ba*100)*.03,x); +wave_3_per_point51=y= if(equal(int(s),4),.4,y); +wave_3_per_point52= +wave_3_per_point53=//Corpo +wave_3_per_point54=x= if(equal(int(s),5),.5,x); +wave_3_per_point55=y= if(equal(int(s),5),.6,y); +wave_3_per_point56= +wave_3_per_point57=//Braccia +wave_3_per_point58=x= if(equal(int(s),6),.4-mi*.23,x); +wave_3_per_point59=y= if(equal(int(s),6),.5+mi,y); +wave_3_per_point60= +wave_3_per_point61=x= if(equal(int(s),7),.5,x); +wave_3_per_point62=y= if(equal(int(s),7),.6,y); +wave_3_per_point63= +wave_3_per_point64=x= if(equal(int(s),8),.6+tr*.23,x); +wave_3_per_point65=y= if(equal(int(s),8),.5+tr,y); +wave_3_per_point66= +wave_3_per_point67=x= if(equal(int(s),9),.5,x); +wave_3_per_point68=y= if(equal(int(s),9),.6,y); +wave_3_per_point69= +wave_3_per_point70=//Testa +wave_3_per_point71=x= if(equal(int(s),10),.5,x); +wave_3_per_point72=y= if(equal(int(s),10),.62,y); +wave_3_per_point73= +wave_3_per_point74=x= if(equal(int(s),11),.47-ba*.23,x); +wave_3_per_point75=y= if(equal(int(s),11),.62,y); +wave_3_per_point76=x= if(equal(int(s),12),.47-ba*.23,x); +wave_3_per_point77=y= if(equal(int(s),12),.67+ba*.23,y); +wave_3_per_point78= +wave_3_per_point79=x= if(equal(int(s),13),.53+ba*.23,x); +wave_3_per_point80=y= if(equal(int(s),13),.67+ba*.23,y); +wave_3_per_point81= +wave_3_per_point82=x= if(equal(int(s),14),.53+ba*.23,x); +wave_3_per_point83=y= if(equal(int(s),14),.62,y); +wave_3_per_point84= +wave_3_per_point85=x= if(equal(int(s),15),.50,x); +wave_3_per_point86=y= if(equal(int(s),15),.62,y); +wave_3_per_point87= +wave_3_per_point88=x=x*dim+xpos; +wave_3_per_point89=y=y*dim+ypos; +wave_3_per_point90= +wave_3_per_point91=mi_prg= if(above(mi_prg,5),0,mi_prg+mi*.1); +wave_3_per_point92=ba_prg= if(above(ba_prg,5),0,ba_prg+ba*.1); +wave_3_per_point93=tr_prg= if(above(tr_prg,5),0,tr_prg+tr*.1); +wave_3_per_point94= +wave_3_per_point95=hm=sample+mi2_prg; +wave_3_per_point96=ht=sample+tr_prg; +wave_3_per_point97=hb=sample+ba_prg; +wave_3_per_point98= +wave_3_per_point99=r=hm; +wave_3_per_point100=g=ht; +wave_3_per_point101=b=hb; +wave_3_per_point102=a=.8; +shapecode_0_enabled=0 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.840000 +shapecode_0_y=0.740000 +shapecode_0_rad=0.289992 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.321291 +shapecode_0_r=0.100000 +shapecode_0_g=0.500000 +shapecode_0_b=0.500000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.100000 +shapecode_0_g2=0.500000 +shapecode_0_b2=0.400000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=meantreb = 0.01*(meantreb*99+treb); +shape_0_per_frame2=trebdiff = (treb - meantreb)*15; +shape_0_per_frame3=tr = min(above(trebdiff,0)*trebdiff*.005,.11); +shape_0_per_frame4= +shape_0_per_frame5=tr_prg= tr_prg+tr; +shape_0_per_frame6= +shape_0_per_frame7=tex_ang =-tr_prg; +shapecode_1_enabled=0 +shapecode_1_sides=100 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.150000 +shapecode_1_y=0.730000 +shapecode_1_rad=0.511334 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.361326 +shapecode_1_r=0.600000 +shapecode_1_g=0.600000 +shapecode_1_b=0.200000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.600000 +shapecode_1_g2=0.600000 +shapecode_1_b2=0.210000 +shapecode_1_a2=0.899999 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=meanbass = 0.01*(meanbass*99+bass); +shape_1_per_frame2=bassdiff = (bass - meanbass)*15; +shape_1_per_frame3=ba = min(above(bassdiff,0)*bassdiff*.005,.11); +shape_1_per_frame4= +shape_1_per_frame5= +shape_1_per_frame6=ba_prg= ba_prg+ba; +shape_1_per_frame7= +shape_1_per_frame8=tex_ang =-ba_prg; +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=q1=acos(-1)*2; +per_frame_1=decay=.30; +per_frame_2= +per_frame_3=meanmid = 0.01*(meanmid*99+mid); +per_frame_4=middiff = (mid - meanmid)*15; +per_frame_5=mi = min(above(middiff,0)*middiff*.005,.11); +per_frame_6= +per_frame_7=mi_prg = mi_prg+mi; +per_frame_8=gam = abs(gam-above(mi_prg,.5)); +per_frame_9=mi_prg= if(above(mi_prg,.5),0,mi_prg); +per_frame_10=miprg=miprg+mi; +per_frame_11=q1=gam; +per_frame_12=monitor =mi_prg; +per_frame_13= +per_frame_14= +per_frame_15=//Thanks to krash for beat detection (modified) +per_frame_16=volume = 0.3*bass+mid; +per_frame_17=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_18=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_19=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_20=runmeanbass =(runmeanbass*2 + bass_att)/3; +per_frame_21=peakbass_att = max(bass_att,peakbass_att); +per_frame_22=beat = above(volume,0.8)*above(bass_att,runmeanbass*1.1)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_23=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_24=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_25=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_26=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_27= +per_frame_28=echo_zoom =pow(1/(1.8+1.5*sin(miprg)),.5); +per_frame_29=monitor=echo_zoom; +per_frame_30=//oldecho = echo_zoom; +per_pixel_1= +per_pixel_2= +per_pixel_3= +per_pixel_4=DY =dy-.004*below(y,1)*(rad+.1)*bass;//*(1-below(y,.50)*above(y,.479)); +per_pixel_5=//zoom=zoom+above(y,.49)*.1; +per_pixel_6=sx = sy-below(y,1)*.001; +per_pixel_7=dx=dx+.01*bass*(1-q1*2);//sin(bass*.2); +per_pixel_8=rot=rot+.051*below(y,1);//*(1-below(y,.49)*above(y,.47)); +per_pixel_9=cx=int(x*16)/16; +per_pixel_10=cy=int(y*16)/16; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress - Snowing Fiber City.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress - Snowing Fiber City.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress - Snowing Fiber City.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Mstress - Snowing Fiber City.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,210 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=0.900000 +fVideoEchoZoom=1.168096 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.003300 +fWaveScale=0.572643 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.240000 +fModWaveAlphaEnd=1.300001 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999998 +fShader=0.000000 +zoom=0.463900 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000022 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.035000 +ob_r=0.340000 +ob_g=0.340000 +ob_b=0.340000 +ob_a=0.380000 +ib_size=0.020000 +ib_r=0.340000 +ib_g=0.340000 +ib_b=0.340000 +ib_a=0.210000 +nMotionVectorsX=28.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=16 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=2.279600 +wavecode_0_smoothing=0.700000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=0.520000 +wave_0_init1=t8 = time; +wave_0_per_frame1=t7 = t8; +wave_0_per_frame2=t8 = time; +wave_0_per_point1=x = 0.5 + sin(sample*103.41 + time*0.1); +wave_0_per_point2=y = 0.5 + sin(sample*94.23) + 0.02*sin(time*4.5); +wave_0_per_point3=b=abs(sin(sample*100+time)); +wave_0_per_point4=r=abs(sin(sample*512+time)); +wave_0_per_point5=g=abs(sin(sample*10+time)); +wave_0_per_point6= +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=32 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.150000 +shapecode_0_ang=0.000000 +shapecode_0_r=0.790000 +shapecode_0_g=0.460000 +shapecode_0_b=0.420000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.360000 +shapecode_0_g2=0.460001 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shape_0_init1=oldx=.5; +shape_0_init2=oldy=.5; +shape_0_per_frame1=rad=rad+.1*sin(time); +shape_0_per_frame2=mbass=max(bass_att,3); +shape_0_per_frame3=xmovn = 0.1*rand(10)*mbass*0.015*(1-2*above(rand(10),5)); +shape_0_per_frame4=ymovn = pow(pow(mbass*0.015,2)-pow(xmovn,2),1/2)*(1-2*above(rand(10),5)); +shape_0_per_frame5=//ymovn=.05; +shape_0_per_frame6=xmov = if(beat,xmovn,xmov*.9); +shape_0_per_frame7=ymov = if(beat,ymovn,ymov*.9); +shape_0_per_frame8=q1=oldx; +shape_0_per_frame9=q2=oldy; +shape_0_per_frame10=out_x = bor(above(q1+xmov,.9),below(q1+xmov,.1)); +shape_0_per_frame11=out_y = bor(above(q2+ymov,.9),below(q2+ymov,.1)); +shape_0_per_frame12=xmov = xmov + (-2*xmov*out_x); +shape_0_per_frame13=ymov = ymov + (-2*ymov*out_y); +shape_0_per_frame14=x = q1+xmov ; +shape_0_per_frame15=y = q2+ymov; +shape_0_per_frame16=q1=x; +shape_0_per_frame17=q2=y; +shape_0_per_frame18=oldx = q1; +shape_0_per_frame19=oldy = q2; +shape_0_per_frame20= +shape_0_per_frame21=decay = decay - 0.91*(treble); +shape_0_per_frame22= +shape_0_per_frame23=//Thanks to krash for beat detection (modified) +shape_0_per_frame24=volume = 0.3*bass+mid; +shape_0_per_frame25=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +shape_0_per_frame26=lastbeat = lastbeat + equal(lastbeat,0)*time; +shape_0_per_frame27=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +shape_0_per_frame28=runmeanbass =(runmeanbass*2 + bass_att)/3; +shape_0_per_frame29=peakbass_att = max(bass_att,peakbass_att); +shape_0_per_frame30=beat = above(volume,0.8)*above(bass_att,runmeanbass*1.1)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +shape_0_per_frame31=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +shape_0_per_frame32=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +shape_0_per_frame33=lastbeat = beat*time + (1-beat)*lastbeat; +shape_0_per_frame34=peakbass_att = max(peakbass_att,1.1*meanbass_att); +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +per_frame_1=rot=tot+.1*sin(time); +per_frame_2=dx=dx+.1*sin(time*.5); +per_frame_3=dy=dy+.1*sin(time*.3); Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/M.tga and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/M.tga differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Can't Stop the Blithering.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Can't Stop the Blithering.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Can't Stop the Blithering.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Can't Stop the Blithering.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.992000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=4 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.096512 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.000000 +fModWaveAlphaEnd=0.780000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.473261 +fShader=0.000000 +zoom=0.869963 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.002000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=1.024000 +nMotionVectorsY=1.008003 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=0.600000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=q1=zoom; +per_frame_2=wave_mystery=sin(3.654*time)*sin(2.765*time); +per_frame_3=wave_b=sin(bass); +per_frame_4=wave_r=sin(treb); +per_frame_5=wave_g=sin(mid); +per_frame_6=zoom=(bass+q1)/2.2; +per_frame_7=rot=sin(time*sin(q1))*.1; +per_pixel_1=zoom=zoom+abs(sin(ang)*.2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Can't Stop the Cramming.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Can't Stop the Cramming.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Can't Stop the Cramming.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Can't Stop the Cramming.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.992000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=4 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.096512 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.000000 +fModWaveAlphaEnd=0.780000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.473261 +fShader=0.000000 +zoom=0.869963 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.002000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=1.024000 +nMotionVectorsY=1.008003 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=0.600000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=q1=zoom; +per_frame_2=wave_mystery=sin(3.654*time)*sin(2.765*time); +per_frame_3=wave_r=sin(bass); +per_frame_4=wave_g=sin(treb); +per_frame_5=wave_b=sin(mid); +per_frame_6=zoom=(bass+q1)/2.2; +per_pixel_1=zoom=zoom+abs(sin(ang)*.2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Cid and Lucy.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Cid and Lucy.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Cid and Lucy.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Cid and Lucy.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.022740 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=3.072695 +fShader=0.000000 +zoom=0.999837 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=12.023998 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r=sin(time*bass_att*sin(time*1.543)); +per_frame_2=wave_g=sin(time*1.6432*mid_att*sin(time*1.721)); +per_frame_3=wave_b=sin(time*1.37563*treb_att*sin(time*1.666)); +per_pixel_1=rot=abs(sin(ang*cos(time)*sin(time*1.8232)*.09)); +per_pixel_2=zoom=zoom+sin(rad*sin(time)*sin(time*1.562543)*.3)+.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Disco Comet.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Disco Comet.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Disco Comet.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Disco Comet.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.630000 +fDecay=0.925000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.306781 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=3.615999 +nMotionVectorsY=3.720001 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.350000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r=abs(sin(time*7)); +per_frame_2=wave_g=abs(sin(time*7.1)); +per_frame_3=wave_b=abs(sin(time*7.2)); +per_frame_4=cx=sin(time*1.234); +per_frame_5=cy=cos(time*.983); +per_pixel_1=zoom=zoom+sin(rad*5)*sin(time)*.2+.2; +per_pixel_2=rot=rot+sin(rad*.2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Singularity in My Oscilloscope.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Singularity in My Oscilloscope.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Singularity in My Oscilloscope.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Singularity in My Oscilloscope.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.925000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=10.673611 +fWaveSmoothing=0.657000 +fWaveParam=0.380000 +fModWaveAlphaStart=0.090000 +fModWaveAlphaEnd=0.540001 +fWarpAnimSpeed=1.308204 +fWarpScale=1.514802 +fZoomExponent=0.842832 +fShader=0.000000 +zoom=1.000000 +rot=0.179900 +cx=0.020000 +cy=-0.039999 +dx=0.240000 +dy=0.260000 +warp=0.871553 +sx=0.602019 +sy=0.749342 +wave_r=0.000000 +wave_g=1.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.065000 +ob_r=0.190000 +ob_g=0.140000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=19.679998 +nMotionVectorsY=15.239994 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.730000 +per_frame_1=rot=rot+sin(time*.4567)*.2-.1; +per_frame_2=cx=cx+sin(time*1.234)*.4; +per_frame_3=cy=cy+cos(time*1.234)*.4; +per_pixel_1=zoom = sin(x+1)*.8; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Vortex of Vortices.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Vortex of Vortices.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Vortex of Vortices.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/nil - Vortex of Vortices.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.998000 +fVideoEchoZoom=7.113829 +fVideoEchoAlpha=0.470001 +nVideoEchoOrientation=2 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=3.985613 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.090000 +fModWaveAlphaEnd=0.820000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.040000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.200000 +ib_size=0.003500 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.700000 +nMotionVectorsX=3.615999 +nMotionVectorsY=3.720001 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.350000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r=sin(time*2.345); +per_frame_2=wave_g=sin(time*1.456); +per_frame_3=wave_b=sin(time*1.789); +per_pixel_1=zoom=zoom+if(above(rad,.666),rad*.01,rad*.1)+sin(ang+time*.534)*.2; +per_pixel_2=rot=sin((rad+time*.666+bass_att*.2)*9)*.2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,410 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.965000 +fVideoEchoZoom=1.483827 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=1.285751 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=0.010000 +fWarpScale=1.470245 +fZoomExponent=4.778023 +fShader=0.000000 +zoom=0.998162 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.001828 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=1.000000 +ib_size=0.500000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=4.800001 +mv_dx=0.400000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=0.000000 +mv_g=0.500000 +mv_b=1.000000 +mv_a=0.100000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=1 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=1 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=0.060000 +wave_0_per_point1=xspout=.5; +wave_0_per_point2=yspout=-.01; +wave_0_per_point3= +wave_0_per_point4=pphase=9999*sample*sample*.0001; +wave_0_per_point5=pphase2=.1+((sample*3349*sample)%100)*.01; +wave_0_per_point6=pheight=((sample*9893)%100)*.002; +wave_0_per_point7=yheight=((sample*1231*sample)%100)*.01; +wave_0_per_point8= +wave_0_per_point9=r=((sample*5454)%100)*.01*abs(sin(time*.25)); +wave_0_per_point10=g=((sample*9954)%100)*.01; +wave_0_per_point11= +wave_0_per_point12=xoffset1=(cos((time*pphase2)+pphase)*pheight); +wave_0_per_point13=xoffset2=-1*(cos((time*pphase2)+pphase)*pheight); +wave_0_per_point14= +wave_0_per_point15=lrorient=if(below(cos((time*pphase2)+pphase),cos(((time-.1)*pphase2)+pphase)),0,1); +wave_0_per_point16= +wave_0_per_point17=px=if(equal(lrorient,0),xspout-pheight+xoffset1,xspout+pheight-xoffset2); +wave_0_per_point18= +wave_0_per_point19=py=yspout+(abs(sin((time*pphase2)+pphase))*yheight); +wave_0_per_point20= +wave_0_per_point21=x=px; +wave_0_per_point22=y=py; +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=1 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=1 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_per_point1=pphase=(sample*5671*cos(time*.0001)); +wave_1_per_point2=pheight=((sample*7654)%100)*.005*sin(time*.2); +wave_1_per_point3= +wave_1_per_point4=//xspout=.5; +wave_1_per_point5=xspout=if(below(abs(sin(time*.2)),.005),.3+(rand(40)*.01),xspout); +wave_1_per_point6=//yspout=.5; +wave_1_per_point7=yspout=if(below(abs(sin(time*.2)),.005),.3+(rand(40)*.01),yspout); +wave_1_per_point8= +wave_1_per_point9=px=xspout+(cos(time+pphase)*pheight); +wave_1_per_point10=py=yspout+(sin(time+pphase)*pheight); +wave_1_per_point11= +wave_1_per_point12=x=px; +wave_1_per_point13=y=py; +wave_1_per_point14=a=abs(sin(time*.2)*.3+(treb_att*.1)); +wave_1_per_point15= +wave_1_per_point16=r=treb*2; +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=1 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=0.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2=phs=-sample * 0.2; +wave_2_per_point3=tm=q1 + phs*4; +wave_2_per_point4= +wave_2_per_point5=flip=flip+1; +wave_2_per_point6=flip=flip*below(flip,2); +wave_2_per_point7= +wave_2_per_point8=xp=0; +wave_2_per_point9=yp=(flip*0.1-0.05)*(sample); +wave_2_per_point10=zp=0; +wave_2_per_point11= +wave_2_per_point12=//spin; +wave_2_per_point13=ang=tm*20 + sin(tm*76 + time*4)*0.4; +wave_2_per_point14=sa=sin(ang);ca=cos(ang); +wave_2_per_point15=xr=xp*sa + yp*ca; +wave_2_per_point16=yr=xp*ca - yp*sa; +wave_2_per_point17=zr=zp; +wave_2_per_point18= +wave_2_per_point19=xp=xr; +wave_2_per_point20=yp=yr + 0.05 + (sin(tm)*0.5 + 0.5)*0.2 + 0.05; +wave_2_per_point21=zp=zr; +wave_2_per_point22= +wave_2_per_point23=//wrist movement; +wave_2_per_point24=ang=sin(tm*2); +wave_2_per_point25= +wave_2_per_point26=xq=xp; +wave_2_per_point27=sa=sin(ang);ca=cos(ang); +wave_2_per_point28=yq=yp*sa + zp*ca; +wave_2_per_point29=zq=yp*ca - zp*sa; +wave_2_per_point30= +wave_2_per_point31= +wave_2_per_point32=ang=tm*8; +wave_2_per_point33=sa=sin(ang);ca=cos(ang); +wave_2_per_point34=xp=xq*sa + yq*ca; +wave_2_per_point35=yp=xq*ca - yq*sa; +wave_2_per_point36=zp=zq; +wave_2_per_point37= +wave_2_per_point38=//forearm movement; +wave_2_per_point39=zp=zp-0.3; +wave_2_per_point40=ang=3.14 + sin(tm*2 - 0.5)*2.5; +wave_2_per_point41=xq=xp; +wave_2_per_point42=sa=sin(ang);ca=cos(ang); +wave_2_per_point43=yq=yp*sa + zp*ca; +wave_2_per_point44=zq=yp*ca - zp*sa; +wave_2_per_point45= +wave_2_per_point46=//upper arm twist +wave_2_per_point47=ang=-1.0 + cos(tm*3 + 0.5); +wave_2_per_point48=xp=xq*sa + yq*ca; +wave_2_per_point49=yp=xq*ca - yq*sa; +wave_2_per_point50=zp=zq; +wave_2_per_point51= +wave_2_per_point52=//upper arm outward; +wave_2_per_point53=zp=zp-0.35; +wave_2_per_point54=ang=cos(tm*1)*1.75 - 1.05; +wave_2_per_point55=sa=sin(ang);ca=cos(ang); +wave_2_per_point56=xq=xp*sa + zp*ca; +wave_2_per_point57=yq=yp; +wave_2_per_point58=zq=xp*ca - zp*sa; +wave_2_per_point59= +wave_2_per_point60=//upper arm up down; +wave_2_per_point61=ang=cos(tm); +wave_2_per_point62=xp=xq; +wave_2_per_point63=sa=sin(ang);ca=cos(ang); +wave_2_per_point64=yp=yq*ca - zq*sa; +wave_2_per_point65=zp=yq*sa + zq*ca; +wave_2_per_point66= +wave_2_per_point67=//xp=xq;yp=yq;zp=zq; +wave_2_per_point68= +wave_2_per_point69= +wave_2_per_point70=//project into screenspace and draw on screen +wave_2_per_point71=zp=zp+1.5; +wave_2_per_point72=xs=xp/zp; +wave_2_per_point73=ys=yp/zp; +wave_2_per_point74= +wave_2_per_point75=x=xs+0.5; +wave_2_per_point76=y=ys*1.3+0.5; +wave_2_per_point77= +wave_2_per_point78= +wave_2_per_point79=a=(1-sample); +wave_2_per_point80= +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=1 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.000000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +wave_3_per_frame1=t1=q1; +wave_3_per_frame2= +wave_3_per_frame3=t7=.0; +wave_3_per_frame4=t8=.45; +wave_3_per_frame5= +wave_3_per_frame6=ddx=.25*cos(5.7119*t1)+2.5963*t1*sin(5.7119*t1); +wave_3_per_frame7=ddy=.3125*sin(5.7119*t1)-3.2453*t1*cos(5.7119*t1); +wave_3_per_frame8=ddtan=atan2(ddy,ddx); +wave_3_per_frame9=t2=-ddtan; +wave_3_per_frame10= +wave_3_per_frame11=val1=((-.5*cos(5.7119*t1))*cos(t2)-(-.625*sin(5.7119*t1))*sin(t2)); +wave_3_per_frame12=val2=((-.5*cos(5.7119*t1))*sin(t2)+(-.625*sin(5.7119*t1))*cos(t2)); +wave_3_per_frame13= +wave_3_per_frame14=t6=-sign(t1); +wave_3_per_frame15=t7=t7-val1; +wave_3_per_frame16=t8=t8-val2; +wave_3_per_frame17= +wave_3_per_frame18=t3=q2; +wave_3_per_point1=sample=pow(sample,.85); +wave_3_per_point2= +wave_3_per_point3=c1=6.2831*t1/(1.1-sample); +wave_3_per_point4=c=cos(c1); +wave_3_per_point5=s=sin(c1); +wave_3_per_point6=c2=sqrt(1-sample); +wave_3_per_point7= +wave_3_per_point8=ox=t7-.5*c2*c; +wave_3_per_point9=oy=t8-.625*c2*s; +wave_3_per_point10= +wave_3_per_point11=x=t7+((ox-t7)*cos(t2)-(oy-t8)*sin(t2)); +wave_3_per_point12=y=t8+((ox-t7)*sin(t2)+(oy-t8)*cos(t2)); +wave_3_per_point13= +wave_3_per_point14=inv=1/sqr(1.1-sample); +wave_3_per_point15=fdx=-.25*pow(1-sample,-.5)*c-c2*s*3.1415*t1*inv; +wave_3_per_point16=fdy=-.3125*c2*s+3.9268*c2*c*t1*inv; +wave_3_per_point17=invMag=1/sqrt(sqr(fdx)+sqr(fdy)); +wave_3_per_point18=fdx=fdx*invMag; +wave_3_per_point19=fdy=fdy*invMag; +wave_3_per_point20= +wave_3_per_point21=rdx=fdx*cos(1.5707+t2)-fdy*sin(1.5707+t2); +wave_3_per_point22=rdy=fdx*sin(1.5707+t2)+fdx*cos(1.5707+t2); +wave_3_per_point23=tt=rand(100)/100; +wave_3_per_point24=x=x+rdx*(.15*tt)*(1-sample); +wave_3_per_point25=y=y+rdy*(.15*tt)*(1-sample); +wave_3_per_point26= +wave_3_per_point27=x=x*.55; +wave_3_per_point28=y=(y-.5)*.55+.5; +wave_3_per_point29= +wave_3_per_point30=r=sample; +wave_3_per_point31=g=1-sample; +wave_3_per_point32=b=1; +wave_3_per_point33=a=below(sample,.995); +wave_3_per_point34= +wave_3_per_point35= +wave_3_per_point36=y=y+t3; +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=1 +shapecode_0_thickOutline=1 +shapecode_0_textured=1 +shapecode_0_x=1.000000 +shapecode_0_y=0.590000 +shapecode_0_rad=0.559231 +shapecode_0_ang=3.392920 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=100.000000 +shapecode_0_r=0.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=1.000000 +shape_0_per_frame1=x=sin(time/10)*0.1+0.5+(treb_att*0.1); +shapecode_1_enabled=0 +shapecode_1_sides=13 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.900000 +shapecode_1_y=0.840000 +shapecode_1_rad=0.364567 +shapecode_1_ang=3.078761 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=4.141463 +shapecode_1_r=0.250000 +shapecode_1_g=0.050000 +shapecode_1_b=0.000000 +shapecode_1_a=0.200000 +shapecode_1_r2=0.000000 +shapecode_1_g2=0.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=0.500000 +shapecode_1_border_g=0.500000 +shapecode_1_border_b=0.500000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=//additive=above(sin(time*50),.95); +shapecode_2_enabled=1 +shapecode_2_sides=6 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.300000 +shapecode_2_y=0.700000 +shapecode_2_rad=1.089252 +shapecode_2_ang=0.816814 +shapecode_2_tex_ang=3.141592 +shapecode_2_tex_zoom=0.504215 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=//tex_ang=(sin(time/4)*0.5+0.5)*6.28; +shapecode_3_enabled=1 +shapecode_3_sides=3 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.284278 +shapecode_3_ang=3.141593 +shapecode_3_tex_ang=4.900885 +shapecode_3_tex_zoom=2.987755 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.950000 +shapecode_3_g2=1.000000 +shapecode_3_b2=1.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=0.000000 +shapecode_3_border_b=0.000000 +shapecode_3_border_a=1.000000 +shape_3_per_frame1=ang=time/10; +shape_3_per_frame2=tex_zoom=3.4+(bass*0.03); +shape_3_per_frame3=var=above(bass_att,0.7); +shape_3_per_frame4=a=var; +shape_3_per_frame5=a2=var; +shape_3_per_frame6=border_a=var; +shape_3_per_frame7= +shape_3_per_frame8= +shape_3_per_frame9=//This preset fluctuates between 53.2 and 55.44 fps on my box. Texture size_2048 Meshsize_36*24 +shape_3_per_frame10=//On a SuperScan Pro 800 Hitachi +shape_3_per_frame11=//On a Radion_9600 +shape_3_per_frame12=//1280*1024_Screen_Resolution +shape_3_per_frame13=//;) hello! I am ATHEN ANDANDA! +per_frame_1=decay=.999; +per_frame_2=wrap=sin(time*10); +per_frame_3=mv_dx=bass; +per_frame_4=ib_a=.005; +per_frame_5= +per_frame_6= +per_frame_7=vol=(bass+mid+treb)*0.25; +per_frame_8=vol=vol*vol; +per_frame_9= +per_frame_10=mtime=mtime+vol*0.01*(55/fps); +per_frame_11= +per_frame_12=q1=time*0.5; +per_pixel_1=zoom=1.005-(rad/100); +per_pixel_2=rot=rad/600; +per_pixel_3=sy=-1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix - www.eos4life.com.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix - www.eos4life.com.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix - www.eos4life.com.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix - www.eos4life.com.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,444 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.965000 +fVideoEchoZoom=1.483827 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=1.285751 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=0.010000 +fWarpScale=1.470245 +fZoomExponent=4.778023 +fShader=0.000000 +zoom=0.998162 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.001828 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=1.000000 +ib_size=0.500000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=4.800001 +mv_dx=0.400000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=0.000000 +mv_g=0.500000 +mv_b=1.000000 +mv_a=0.100000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=1 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=1 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=0.060000 +wave_0_per_point1=xspout=.5; +wave_0_per_point2=yspout=-.01; +wave_0_per_point3= +wave_0_per_point4=pphase=9999*sample*sample*.0001; +wave_0_per_point5=pphase2=.1+((sample*3349*sample)%100)*.01; +wave_0_per_point6=pheight=((sample*9893)%100)*.002; +wave_0_per_point7=yheight=((sample*1231*sample)%100)*.01; +wave_0_per_point8= +wave_0_per_point9=r=((sample*5454)%100)*.01*abs(sin(time*.25)); +wave_0_per_point10=g=((sample*9954)%100)*.01; +wave_0_per_point11= +wave_0_per_point12=xoffset1=(cos((time*pphase2)+pphase)*pheight); +wave_0_per_point13=xoffset2=-1*(cos((time*pphase2)+pphase)*pheight); +wave_0_per_point14= +wave_0_per_point15=lrorient=if(below(cos((time*pphase2)+pphase),cos(((time-.1)*pphase2)+pphase)),0,1); +wave_0_per_point16= +wave_0_per_point17=px=if(equal(lrorient,0),xspout-pheight+xoffset1,xspout+pheight-xoffset2); +wave_0_per_point18= +wave_0_per_point19=py=yspout+(abs(sin((time*pphase2)+pphase))*yheight); +wave_0_per_point20= +wave_0_per_point21=x=px; +wave_0_per_point22=y=py; +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=1 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=1 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_per_point1=pphase=(sample*5671*cos(time*.0001)); +wave_1_per_point2=pheight=((sample*7654)%100)*.005*sin(time*.2); +wave_1_per_point3= +wave_1_per_point4=//xspout=.5; +wave_1_per_point5=xspout=if(below(abs(sin(time*.2)),.005),.3+(rand(40)*.01),xspout); +wave_1_per_point6=//yspout=.5; +wave_1_per_point7=yspout=if(below(abs(sin(time*.2)),.005),.3+(rand(40)*.01),yspout); +wave_1_per_point8= +wave_1_per_point9=px=xspout+(cos(time+pphase)*pheight); +wave_1_per_point10=py=yspout+(sin(time+pphase)*pheight); +wave_1_per_point11= +wave_1_per_point12=x=px; +wave_1_per_point13=y=py; +wave_1_per_point14=a=abs(sin(time*.2)*.3+(treb_att*.1)); +wave_1_per_point15= +wave_1_per_point16=r=treb*2; +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=1 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=0.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=n=sample*6.283; +wave_2_per_point2=phs=-sample * 0.2; +wave_2_per_point3=tm=q1 + phs*4; +wave_2_per_point4= +wave_2_per_point5=flip=flip+1; +wave_2_per_point6=flip=flip*below(flip,2); +wave_2_per_point7= +wave_2_per_point8=xp=0; +wave_2_per_point9=yp=(flip*0.1-0.05)*(sample); +wave_2_per_point10=zp=0; +wave_2_per_point11= +wave_2_per_point12=//spin; +wave_2_per_point13=ang=tm*20 + sin(tm*76 + time*4)*0.4; +wave_2_per_point14=sa=sin(ang);ca=cos(ang); +wave_2_per_point15=xr=xp*sa + yp*ca; +wave_2_per_point16=yr=xp*ca - yp*sa; +wave_2_per_point17=zr=zp; +wave_2_per_point18= +wave_2_per_point19=xp=xr; +wave_2_per_point20=yp=yr + 0.05 + (sin(tm)*0.5 + 0.5)*0.2 + 0.05; +wave_2_per_point21=zp=zr; +wave_2_per_point22= +wave_2_per_point23=//wrist movement; +wave_2_per_point24=ang=sin(tm*2); +wave_2_per_point25= +wave_2_per_point26=xq=xp; +wave_2_per_point27=sa=sin(ang);ca=cos(ang); +wave_2_per_point28=yq=yp*sa + zp*ca; +wave_2_per_point29=zq=yp*ca - zp*sa; +wave_2_per_point30= +wave_2_per_point31= +wave_2_per_point32=ang=tm*8; +wave_2_per_point33=sa=sin(ang);ca=cos(ang); +wave_2_per_point34=xp=xq*sa + yq*ca; +wave_2_per_point35=yp=xq*ca - yq*sa; +wave_2_per_point36=zp=zq; +wave_2_per_point37= +wave_2_per_point38=//forearm movement; +wave_2_per_point39=zp=zp-0.3; +wave_2_per_point40=ang=3.14 + sin(tm*2 - 0.5)*2.5; +wave_2_per_point41=xq=xp; +wave_2_per_point42=sa=sin(ang);ca=cos(ang); +wave_2_per_point43=yq=yp*sa + zp*ca; +wave_2_per_point44=zq=yp*ca - zp*sa; +wave_2_per_point45= +wave_2_per_point46=//upper arm twist +wave_2_per_point47=ang=-1.0 + cos(tm*3 + 0.5); +wave_2_per_point48=xp=xq*sa + yq*ca; +wave_2_per_point49=yp=xq*ca - yq*sa; +wave_2_per_point50=zp=zq; +wave_2_per_point51= +wave_2_per_point52=//upper arm outward; +wave_2_per_point53=zp=zp-0.35; +wave_2_per_point54=ang=cos(tm*1)*1.75 - 1.05; +wave_2_per_point55=sa=sin(ang);ca=cos(ang); +wave_2_per_point56=xq=xp*sa + zp*ca; +wave_2_per_point57=yq=yp; +wave_2_per_point58=zq=xp*ca - zp*sa; +wave_2_per_point59= +wave_2_per_point60=//upper arm up down; +wave_2_per_point61=ang=cos(tm); +wave_2_per_point62=xp=xq; +wave_2_per_point63=sa=sin(ang);ca=cos(ang); +wave_2_per_point64=yp=yq*ca - zq*sa; +wave_2_per_point65=zp=yq*sa + zq*ca; +wave_2_per_point66= +wave_2_per_point67=//xp=xq;yp=yq;zp=zq; +wave_2_per_point68= +wave_2_per_point69= +wave_2_per_point70=//project into screenspace and draw on screen +wave_2_per_point71=zp=zp+1.5; +wave_2_per_point72=xs=xp/zp; +wave_2_per_point73=ys=yp/zp; +wave_2_per_point74= +wave_2_per_point75=x=xs+0.5; +wave_2_per_point76=y=ys*1.3+0.5; +wave_2_per_point77= +wave_2_per_point78= +wave_2_per_point79=a=(1-sample); +wave_2_per_point80= +wavecode_3_enabled=1 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=0.000000 +wavecode_3_g=0.000000 +wavecode_3_b=0.000000 +wavecode_3_a=1.000000 +wave_3_per_point1=n=sample*6.283; +wave_3_per_point2=phs=-sample * 0.2; +wave_3_per_point3=tm=q1 + phs*4; +wave_3_per_point4= +wave_3_per_point5=flip=flip+1; +wave_3_per_point6=flip=flip*below(flip,2); +wave_3_per_point7= +wave_3_per_point8=xp=0; +wave_3_per_point9=yp=(flip*0.1*0.6-0.05*0.6)*(sample); +wave_3_per_point10=zp=0; +wave_3_per_point11= +wave_3_per_point12=//spin; +wave_3_per_point13=ang=tm*20 + sin(tm*76 + time*4)*0.4; +wave_3_per_point14=sa=sin(ang);ca=cos(ang); +wave_3_per_point15=xr=xp*sa + yp*ca; +wave_3_per_point16=yr=xp*ca - yp*sa; +wave_3_per_point17=zr=zp; +wave_3_per_point18= +wave_3_per_point19=xp=xr; +wave_3_per_point20=yp=yr + 0.05 + (sin(tm)*0.5 + 0.5)*0.2 + 0.05; +wave_3_per_point21=zp=zr; +wave_3_per_point22= +wave_3_per_point23=//wrist movement; +wave_3_per_point24=ang=sin(tm*2); +wave_3_per_point25= +wave_3_per_point26=xq=xp; +wave_3_per_point27=sa=sin(ang);ca=cos(ang); +wave_3_per_point28=yq=yp*sa + zp*ca; +wave_3_per_point29=zq=yp*ca - zp*sa; +wave_3_per_point30= +wave_3_per_point31= +wave_3_per_point32=ang=tm*8; +wave_3_per_point33=sa=sin(ang);ca=cos(ang); +wave_3_per_point34=xp=xq*sa + yq*ca; +wave_3_per_point35=yp=xq*ca - yq*sa; +wave_3_per_point36=zp=zq; +wave_3_per_point37= +wave_3_per_point38=//forearm movement; +wave_3_per_point39=zp=zp-0.3; +wave_3_per_point40=ang=3.14 + sin(tm*2 - 0.5)*2.5; +wave_3_per_point41=xq=xp; +wave_3_per_point42=sa=sin(ang);ca=cos(ang); +wave_3_per_point43=yq=yp*sa + zp*ca; +wave_3_per_point44=zq=yp*ca - zp*sa; +wave_3_per_point45= +wave_3_per_point46=//upper arm twist +wave_3_per_point47=ang=-1.0 + cos(tm*3 + 0.5); +wave_3_per_point48=xp=xq*sa + yq*ca; +wave_3_per_point49=yp=xq*ca - yq*sa; +wave_3_per_point50=zp=zq; +wave_3_per_point51= +wave_3_per_point52=//upper arm outward; +wave_3_per_point53=zp=zp-0.35; +wave_3_per_point54=ang=cos(tm*1)*1.75 - 1.05; +wave_3_per_point55=sa=sin(ang);ca=cos(ang); +wave_3_per_point56=xq=xp*sa + zp*ca; +wave_3_per_point57=yq=yp; +wave_3_per_point58=zq=xp*ca - zp*sa; +wave_3_per_point59= +wave_3_per_point60=//upper arm up down; +wave_3_per_point61=ang=cos(tm); +wave_3_per_point62=xp=xq; +wave_3_per_point63=sa=sin(ang);ca=cos(ang); +wave_3_per_point64=yp=yq*ca - zq*sa; +wave_3_per_point65=zp=yq*sa + zq*ca; +wave_3_per_point66= +wave_3_per_point67=//xp=xq;yp=yq;zp=zq; +wave_3_per_point68= +wave_3_per_point69= +wave_3_per_point70=//project into screenspace and draw on screen +wave_3_per_point71=zp=zp+1.5; +wave_3_per_point72=xs=xp/zp; +wave_3_per_point73=ys=yp/zp; +wave_3_per_point74= +wave_3_per_point75=x=xs+0.5; +wave_3_per_point76=y=ys*1.3+0.5; +wave_3_per_point77= +wave_3_per_point78= +wave_3_per_point79=a=(1-sample); +wave_3_per_point80= +wave_3_per_point81=//fade=min((1-sample)*1.4,1); +wave_3_per_point82=//b=b*fade; +wave_3_per_point83=//g=g*fade; +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=1 +shapecode_0_thickOutline=1 +shapecode_0_textured=1 +shapecode_0_x=1.000000 +shapecode_0_y=0.590000 +shapecode_0_rad=0.559231 +shapecode_0_ang=3.392920 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=100.000000 +shapecode_0_r=0.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=1.000000 +shape_0_per_frame1=x=sin(time/10)*0.1+0.5+(treb_att*0.1); +shapecode_1_enabled=0 +shapecode_1_sides=13 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.900000 +shapecode_1_y=0.840000 +shapecode_1_rad=0.364567 +shapecode_1_ang=3.078761 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=4.141463 +shapecode_1_r=0.250000 +shapecode_1_g=0.050000 +shapecode_1_b=0.000000 +shapecode_1_a=0.200000 +shapecode_1_r2=0.000000 +shapecode_1_g2=0.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=0.500000 +shapecode_1_border_g=0.500000 +shapecode_1_border_b=0.500000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=//additive=above(sin(time*50),.95); +shapecode_2_enabled=1 +shapecode_2_sides=6 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.300000 +shapecode_2_y=0.700000 +shapecode_2_rad=1.089252 +shapecode_2_ang=0.816814 +shapecode_2_tex_ang=3.141592 +shapecode_2_tex_zoom=0.504215 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=//tex_ang=(sin(time/4)*0.5+0.5)*6.28; +shape_2_per_frame2=ang=ang + sin(time*0.5)*0.1 +shapecode_3_enabled=1 +shapecode_3_sides=3 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.284278 +shapecode_3_ang=3.141593 +shapecode_3_tex_ang=4.900885 +shapecode_3_tex_zoom=2.987755 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.950000 +shapecode_3_g2=1.000000 +shapecode_3_b2=1.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=0.000000 +shapecode_3_border_b=0.000000 +shapecode_3_border_a=1.000000 +shape_3_per_frame1=ang=time/10; +shape_3_per_frame2=tex_zoom=3.4+(bass*0.03); +shape_3_per_frame3=var=above(bass_att,0.7); +shape_3_per_frame4=a=var; +shape_3_per_frame5=a2=var; +shape_3_per_frame6=border_a=var; +shape_3_per_frame7= +shape_3_per_frame8= +shape_3_per_frame9=//This preset fluctuates between 53.2 and 55.44 fps on my box. Texture size_2048 Meshsize_36*24 +shape_3_per_frame10=//On a SuperScan Pro 800 Hitachi +shape_3_per_frame11=//On a Radion_9600 +shape_3_per_frame12=//1280*1024_Screen_Resolution +shape_3_per_frame13=//;) hello! I am ATHEN ANDANDA! +per_frame_1=decay=.999; +per_frame_2=wrap=sin(time*10); +per_frame_3=mv_dx=bass; +per_frame_4=ib_a=.005; +per_frame_5= +per_frame_6= +per_frame_7=vol=(bass+mid+treb)*0.25; +per_frame_8=vol=vol*vol; +per_frame_9= +per_frame_10=mtime=mtime+vol*0.01*(55/fps); +per_frame_11= +per_frame_12=q1=mtime*0.5; +per_frame_13= +per_frame_14=ob_r = sin(mtime*0.3)*0.5 + 0.5; +per_frame_15=ob_g = sin(mtime*0.3 + 2.1)*0.5 + 0.5; +per_frame_16=ob_b = sin(mtime*0.3 + 4.2)*0.5 + 0.5 +per_pixel_1=zoom=1.005-(rad/100); +per_pixel_2=rot=rad/600; +per_pixel_3=sy=-1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/PieturP - triptrap_(getting_concrete_visions_through_a_diafragma_version).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/PieturP - triptrap_(getting_concrete_visions_through_a_diafragma_version).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/PieturP - triptrap_(getting_concrete_visions_through_a_diafragma_version).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/PieturP - triptrap_(getting_concrete_visions_through_a_diafragma_version).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,304 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.905900 +fVideoEchoZoom=2.003071 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.924157 +fWaveScale=0.653091 +fWaveSmoothing=0.000000 +fWaveParam=-0.480000 +fModWaveAlphaStart=0.800000 +fModWaveAlphaEnd=1.100000 +fWarpAnimSpeed=1.000000 +fWarpScale=0.010000 +fZoomExponent=1.008148 +fShader=0.000000 +zoom=1.001800 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.001829 +sy=1.008151 +wave_r=1.000000 +wave_g=0.650000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=31.999994 +nMotionVectorsY=24.000004 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=1.000000 +wavecode_0_enabled=0 +wavecode_0_samples=38 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=1 +wavecode_0_scaling=1.254862 +wavecode_0_smoothing=0.000000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=0.100000 +wave_0_per_frame1=r=1; +wave_0_per_frame2=g=1; +wave_0_per_frame3=b=1; +wave_0_per_frame4=a=0.1; +wave_0_per_point1= +wave_0_per_point2=y=sample; +wave_0_per_point3=x=value1; +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.746302 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=0.942039 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang=sin(time)*.5+.5; +shape_0_per_frame2=val=3; +shape_0_per_frame3=a2=val*.33; +shape_0_per_frame4=a=val*.33; +shape_0_per_frame5=rad=cos(time*.3)*.4+0.65; +shape_0_per_frame6=x=sin(time*.25)*.25+.5; +shape_0_per_frame7=y=cos(time*.45)*.25+.5; +shape_0_per_frame8= +shape_0_per_frame9= +shape_0_per_frame10= +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=1 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.746302 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=0.942039 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=0.000000 +shapecode_1_border_g=0.000000 +shapecode_1_border_b=0.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=ang=cos(time*.3)*.5+.5; +shape_1_per_frame2=val=3; +shape_1_per_frame3=a2=val*.33; +shape_1_per_frame4=a=val*.33; +shape_1_per_frame5=rad=sin(time*.3)*.4+0.65; +shape_1_per_frame6=x=cos(time*.25)*.25+.5; +shape_1_per_frame7=y=sin(time*.45)*.25+.5; +shape_1_per_frame8= +shape_1_per_frame9= +shape_1_per_frame10= +shapecode_2_enabled=1 +shapecode_2_sides=6 +shapecode_2_additive=0 +shapecode_2_thickOutline=1 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.364564 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=0.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=0.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=0.000000 +shapecode_2_border_g=0.000000 +shapecode_2_border_b=0.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1= +shape_2_per_frame2=h2=h2+(above(treb,1.32)*0.8)*.9; +shape_2_per_frame3=vr=sin(h2*.8)*.5+.5; +shape_2_per_frame4=vg=sin(h2*.5)*.5+.5; +shape_2_per_frame5=vb=sin(h2*.1)*.5+.5; +shape_2_per_frame6= +shape_2_per_frame7=g=vg; +shape_2_per_frame8=r=vr; +shape_2_per_frame9=b=vb; +shape_2_per_frame10=g2=g; +shape_2_per_frame11=r2=r; +shape_2_per_frame12=b2=b; +shape_2_per_frame13=dist=(frame%100)*.01; +shape_2_per_frame14=maat=maat+(above(bass_att,1.5)); +shape_2_per_frame15=maat=below(maat,16)*maat; +shape_2_per_frame16=x=if(below(maat,8),if(below(maat,4),dist,1-dist),x); +shape_2_per_frame17=y=if(above(maat,8),if(above(maat,4),dist,1-dist),y); +shape_2_per_frame18= +shapecode_3_enabled=1 +shapecode_3_sides=4 +shapecode_3_additive=1 +shapecode_3_thickOutline=1 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.364564 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.500000 +shapecode_3_b=0.500000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=0.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=0.000000 +shapecode_3_border_b=0.000000 +shapecode_3_border_a=0.000000 +per_frame_init_1=decay=1; +per_frame_init_2=beatvol=1.04; +per_frame_1=zoom=1; +per_frame_2=decay=0.995; +per_frame_3= +per_frame_4=maat=maat+(above(bass_att,1.5)); +per_frame_5=maat=below(maat,16)*maat; +per_frame_6= +per_frame_7=val=if(above(maat,8),1,val); +per_frame_8=val=if(above(val,0.6),val*.99,0.3); +per_frame_9=echo_zoom=val+0.7; +per_frame_10= +per_frame_11=zoom=1; +per_frame_12= +per_frame_13=ob_size=0; +per_frame_14=ob_g=0; +per_frame_15=ob_r=0; +per_frame_16=ob_b=0; +per_frame_17=ob_a=1; +per_frame_18= +per_frame_19=zoomin=bass+(zoomin*10)*.001; +per_frame_20=zoomi=above(zoomin,2)+zoomi*.975; +per_frame_21=zval=cos(time*.3)*(above(zoomi,2)); +per_frame_22=zuse=(zval)*.05+1; +per_frame_23=monitor=zoomi; +per_frame_24=zoom=zuse; +per_frame_25= +per_frame_26=//echo_orient=((maat*.5)%4)+1; +per_frame_27= +per_frame_28=//monitor=val; +per_frame_29=r=above(bass,1.3)+r*.95; +per_frame_30=t=below(r,5); +per_frame_31=q1=t*val*.5; +per_frame_32=mv_dx=sin(time)*.5+.5; +per_frame_33=mv_dy=cos(time)*.5+.5; +per_frame_34=ob_r=0; +per_frame_35=ob_g=0; +per_frame_36=ob_b=0; +per_frame_37=ib_r=0; +per_frame_38=ib_g=0; +per_frame_39=ib_b=0; +per_frame_40=ib_a=0.375; +per_frame_41=ob_a=0.475; +per_frame_42=ob_size=bass*.1; +per_frame_43=ib_size=treb*.1; +per_frame_44= +per_frame_45= +per_frame_46=wave_r=1; +per_pixel_1= +per_pixel_2=dx=(dx-0.05*sin(x*32))*(cos(time*8)*q1); +per_pixel_3=dy=(dy-0.05*sin(y*18))*(sin(time*8)*q1); +per_pixel_4= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/PieturP - triptrap_(ultimate-trip-mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/PieturP - triptrap_(ultimate-trip-mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/PieturP - triptrap_(ultimate-trip-mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/PieturP - triptrap_(ultimate-trip-mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,302 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.955900 +fVideoEchoZoom=2.003071 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.535239 +fWaveSmoothing=0.000000 +fWaveParam=-0.480000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.100000 +fWarpAnimSpeed=1.000000 +fWarpScale=0.010000 +fZoomExponent=1.008148 +fShader=0.000000 +zoom=1.001800 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.001829 +sy=1.008151 +wave_r=1.000000 +wave_g=0.650000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=6.400000 +nMotionVectorsY=48.000000 +mv_dx=0.500000 +mv_dy=0.500000 +mv_l=5.000000 +mv_r=0.013716 +mv_g=0.872347 +mv_b=0.522466 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.746302 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=0.942039 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang=sin(time)*.5+.5; +shape_0_per_frame2=val=3; +shape_0_per_frame3=a2=val*.33; +shape_0_per_frame4=a=val*.33; +shape_0_per_frame5=rad=cos(time*.3)*.4+0.65; +shape_0_per_frame6=x=sin(time*.25)*.25+.5; +shape_0_per_frame7=y=cos(time*.45)*.25+.5; +shape_0_per_frame8= +shape_0_per_frame9= +shape_0_per_frame10= +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=1 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.746302 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=0.942039 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=0.000000 +shapecode_1_border_g=0.000000 +shapecode_1_border_b=0.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=ang=cos(time*.3)*.5+.5; +shape_1_per_frame2=val=3; +shape_1_per_frame3=a2=val*.33; +shape_1_per_frame4=a=val*.33; +shape_1_per_frame5=rad=sin(time*.3)*.4+0.65; +shape_1_per_frame6=x=cos(time*.25)*.25+.5; +shape_1_per_frame7=y=sin(time*.45)*.25+.5; +shape_1_per_frame8= +shape_1_per_frame9= +shape_1_per_frame10= +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=1 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.364564 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=0.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=0.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=0.000000 +shapecode_2_border_g=0.000000 +shapecode_2_border_b=0.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1= +shape_2_per_frame2=h2=h2+(above(treb,1.32)*0.8)*.9; +shape_2_per_frame3=vr=sin(h2*.8)*.5+.5; +shape_2_per_frame4=vg=sin(h2*.5)*.5+.5; +shape_2_per_frame5=vb=sin(h2*.1)*.5+.5; +shape_2_per_frame6= +shape_2_per_frame7=g=vg; +shape_2_per_frame8=r=vr; +shape_2_per_frame9=b=vb; +shape_2_per_frame10=g2=g; +shape_2_per_frame11=r2=r; +shape_2_per_frame12=b2=b; +shape_2_per_frame13=dist=(frame%100)*.01; +shape_2_per_frame14=maat=maat+(above(bass_att,1.5)); +shape_2_per_frame15=maat=below(maat,16)*maat; +shape_2_per_frame16=x=if(below(maat,8),if(below(maat,4),dist,1-dist),x); +shape_2_per_frame17=y=if(above(maat,8),if(above(maat,4),dist,1-dist),y); +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=1 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.364564 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=0.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=0.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=0.000000 +shapecode_3_border_b=0.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1= +shape_3_per_frame2=h2=h2+(above(treb,1.32)*0.8)*.9; +shape_3_per_frame3=vr=sin(h2*.8)*.5+.5; +shape_3_per_frame4=vg=sin(h2*.5)*.5+.5; +shape_3_per_frame5=vb=sin(h2*.1)*.5+.5; +shape_3_per_frame6= +shape_3_per_frame7=g=vg; +shape_3_per_frame8=r=vr; +shape_3_per_frame9=b=vb; +shape_3_per_frame10=g2=g; +shape_3_per_frame11=r2=r; +shape_3_per_frame12=b2=b; +shape_3_per_frame13=dist=(frame%100)*.01; +shape_3_per_frame14=maat=maat+(above(bass_att,1.5)); +shape_3_per_frame15=maat=below(maat,16)*maat; +shape_3_per_frame16=y=if(below(maat,8),if(below(maat,4),dist,1-dist),y); +shape_3_per_frame17=x=if(above(maat,8),if(above(maat,4),dist,1-dist),x); +per_frame_init_1=decay=1; +per_frame_init_2=beatvol=1.04; +per_frame_1=zoom=1; +per_frame_2=decay=1; +per_frame_3= +per_frame_4=maat=maat+(above(bass_att,1.5)); +per_frame_5=maat=below(maat,16)*maat; +per_frame_6= +per_frame_7=val=if(above(maat,8),1,val); +per_frame_8=val=if(above(val,0.6),val*.99,0.3); +per_frame_9=echo_zoom=val+0.7; +per_frame_10= +per_frame_11=zoom=1; +per_frame_12= +per_frame_13=ob_size=0; +per_frame_14=ob_g=0; +per_frame_15=ob_r=0; +per_frame_16=ob_b=0; +per_frame_17=ob_a=1; +per_frame_18= +per_frame_19=zoomin=(sin(time)*.5+.5)%2; +per_frame_20=zval=cos(time*.3)*zoomin; +per_frame_21=zuse=(zval)*.05+1; +per_frame_22=monitor=zuse; +per_frame_23=zoom=zuse; +per_frame_24= +per_frame_25=//echo_orient=((maat*.5)%4)+1; +per_frame_26= +per_frame_27=//monitor=val; +per_frame_28=r=above(bass,1.3)+r*.95; +per_frame_29=t=below(r,5); +per_frame_30=q1=t*val*.5; +per_frame_31= +per_frame_32= +per_frame_33= +per_frame_34= +per_frame_35= +per_pixel_1= +per_pixel_2=dx=(dx-0.05*sin(x*32))*(cos(time*8)*q1); +per_pixel_3=dy=(dy-0.05*sin(y*18))*(sin(time*8)*q1); +per_pixel_4= Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/project.tga and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/project.tga differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Redi Jedi - acid in your brain.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Redi Jedi - acid in your brain.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Redi Jedi - acid in your brain.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Redi Jedi - acid in your brain.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,324 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.000000 +fDecay=0.935000 +fVideoEchoZoom=1.006593 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.285751 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=4.480000 +nMotionVectorsY=4.320000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.500000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=256 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=1 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_point1=x=(sin(q2*.1+q1*.01)*.3+.5)+value1*.1; +wave_0_per_point2=y=(cos(q1*.1-q3*.05)*.3+.5)+value2*.1; +wave_0_per_point3= +wave_0_per_point4=r=sin(q2+sample*3.14-treb)*.5+.5; +wave_0_per_point5=g=cos(q3+sample*3.14-bass)*.5+.5; +wave_0_per_point6=b=sin(q1+sample*3.14-mid)*.5+.5; +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=1 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_per_point1=x=sample; +wave_1_per_point2=y=value1+.5; +wave_1_per_point3=r=sin(q2*.1+sample*3.14)*.5+.5; +wave_1_per_point4=g=cos(q3*.15-sample*3.14)*.5+.5; +wave_1_per_point5=b=sin(q4*.2+(sample-.5)*3.14)*.5+.5; +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.542791 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=0.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=1 +shapecode_2_thickOutline=1 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.436055 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shape_2_per_frame1=rad=q5*.33; +shape_2_per_frame2=y=.75; +shape_2_per_frame3=x=.2; +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=db=.01; +per_frame_init_2=beatrate=1; +per_frame_init_3=avgbeatrate=2; +per_frame_init_4=lbbtime=time; +per_frame_init_5=avgdb=.01; +per_frame_init_6=vol=1; +per_frame_init_7=avgvol=.2; +per_frame_init_8=phase=0; +per_frame_init_9=bool=0; +per_frame_init_10=const=.02; +per_frame_init_11= +per_frame_init_12=mtime=1000+bass_att*1000; +per_frame_init_13=t1=500+bass*500; +per_frame_init_14=t2=500+treb*500; +per_frame_init_15=t3=500+mid*500; +per_frame_1=db=(bass-lbass)*fps; +per_frame_2=lbass=bass; +per_frame_3=avgdb=avgdb*.99+abs(db)*.01; +per_frame_4=avgvol=avgvol*.99+(bass+mid+treb)*.0033; +per_frame_5= +per_frame_6=//beatdection +per_frame_7=rawbeatb=above(abs(db),avgdb*avgvol*4); +per_frame_8=beatb=rawbeatb*above(time-lbbtime,avgbeatrate*.5); +per_frame_9=beathard=beatb*(abs(db)-avgdb*4); +per_frame_10=//beatrate calc +per_frame_11=beatrate=beatb*(time-lbbtime)+(1-beatb)*beatrate; +per_frame_12=avgbeatrate=beatb*(avgbeatrate*.9+beatrate*.1)+(1-beatb)*avgbeatrate; +per_frame_13=lbbtime=time*beatb+(1-beatb)*lbbtime; +per_frame_14= +per_frame_15=ph=(time-lbbtime)*(60/avgbeatrate)*const; +per_frame_16=phase=max(min( ph, 1 ),0); +per_frame_17= +per_frame_18=//const=beatb*( bool*(const-.001)+(1-bool)*(const+.001) ) + (1-beatb)*const; +per_frame_19=const=const*(1-beatb)+beatb*( const+ (.01*bool) ); +per_frame_20= +per_frame_21=bool=below(phase,.98)*(.99-ph)-above(phase,.98)*(ph*.5); +per_frame_22= +per_frame_23=bc=bc+beatb; +per_frame_24= +per_frame_25=vol=(rawbeatb*(abs(db)-(avgdb))*.01); +per_frame_26=avgvol=avgvol*.99+vol*.01; +per_frame_27= +per_frame_28=mtime=mtime+min(avgvol*.5,.25)*(60/fps); +per_frame_29= +per_frame_30=decay=.999+(1-phase)*.001; +per_frame_31=warp=0; +per_frame_32=wrap=1; +per_frame_33=zoom=1; +per_frame_34= +per_frame_35=bpm=(60/avgbeatrate)*.005; +per_frame_36=t1=t1+min(avgvol*bass_att*.5,.25)*(60/fps)*bpm; +per_frame_37=t2=t2+min(avgvol*treb_att*.5,.25)*(60/fps)*bpm; +per_frame_38=t3=t3+min(avgvol*mid_att*.5,.25)*(60/fps)*bpm; +per_frame_39=monitor=avgvol; +per_frame_40=q1=mtime; +per_frame_41=q2=t1; +per_frame_42=q3=t2; +per_frame_43=q4=t3; +per_frame_44= +per_frame_45=cx=sin(q2*.01)*.5+.5; +per_frame_46=cy=cos(q3*.01)*.5+.5; +per_frame_47=rot=sin(q2*.01-(q3*.01))*15+35; +per_frame_48=mv_a=phase; +per_pixel_1= +per_pixel_2=c=sin(q2*.06); +per_pixel_3=cc=sin(q3*.074-q1*.005); +per_pixel_4=ccc=sin(q4*.0575); +per_pixel_5=cx1=.5+ccc*.3-c*.2; +per_pixel_6=cy1=.5+c*.4-cc*.2; +per_pixel_7= +per_pixel_8=myx=(cx1-x); +per_pixel_9=myy=(cy1-(1-y)); +per_pixel_10=mrad=pow( myx*myx + myy*myy , .5); +per_pixel_11=mang=asin( abs(myy)/(mrad) ); +per_pixel_12= +per_pixel_13=ax=mang; +per_pixel_14=ay=mang; +per_pixel_15= +per_pixel_16=mrot=.1*(1-mrad)*sin(q1*.01+q2*.1); +per_pixel_17= +per_pixel_18=dx= sign(myy)*sin(ax)*mrot; +per_pixel_19=dy= sign(myx)*(cos(ay)*mrot); +per_pixel_20= +per_pixel_21= +per_pixel_22= +per_pixel_23=cx1=.5+c*.4-cc*.1; +per_pixel_24=cy1=.5+cc*.25-ccc*.15; +per_pixel_25= +per_pixel_26=myx=(cx1-x); +per_pixel_27=myy=(cy1-(1-y)); +per_pixel_28=mrad=pow( myx*myx + myy*myy , .5); +per_pixel_29=mang=asin( abs(myy)/(mrad) ); +per_pixel_30= +per_pixel_31=ax=mang; +per_pixel_32=ay=mang; +per_pixel_33= +per_pixel_34=mrot=.1*(1-mrad)*sin(q3*.02+q1*.3); +per_pixel_35= +per_pixel_36=dx= dx - sign(myy)*sin(ax)*mrot; +per_pixel_37=dy= dy - sign(myx)*(cos(ay)*mrot); +per_pixel_38= +per_pixel_39= +per_pixel_40= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Redi Jedi - multiple points of origin, one destination.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Redi Jedi - multiple points of origin, one destination.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Redi Jedi - multiple points of origin, one destination.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Redi Jedi - multiple points of origin, one destination.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,329 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.935000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.285751 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=256 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=1 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_point1=x=(sin(q2*.1+q1*.01)*.3+.5)+value1*.1; +wave_0_per_point2=y=(cos(q1*.1-q3*.05)*.3+.5)+value2*.1; +wave_0_per_point3= +wave_0_per_point4=r=sin(q2+sample*3.14-treb)*.5+.5; +wave_0_per_point5=g=cos(q3+sample*3.14-bass)*.5+.5; +wave_0_per_point6=b=sin(q1+sample*3.14-mid)*.5+.5; +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.542791 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=0.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=1 +shapecode_2_thickOutline=1 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.436055 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shape_2_per_frame1=rad=q5*.33; +shape_2_per_frame2=y=.75; +shape_2_per_frame3=x=.2; +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=db=.01; +per_frame_init_2=beatrate=1; +per_frame_init_3=avgbeatrate=2; +per_frame_init_4=lbbtime=time; +per_frame_init_5=avgdb=.01; +per_frame_init_6=vol=1; +per_frame_init_7=avgvol=.2; +per_frame_init_8=phase=0; +per_frame_init_9=bool=0; +per_frame_init_10=const=.02; +per_frame_init_11= +per_frame_init_12=mtime=1000+bass_att*1000; +per_frame_init_13=t1=500+bass*500; +per_frame_init_14=t2=500+treb*500; +per_frame_init_15=t3=500+mid*500; +per_frame_1=db=(bass-lbass)*fps; +per_frame_2=lbass=bass; +per_frame_3=avgdb=avgdb*.99+abs(db)*.01; +per_frame_4=avgvol=avgvol*.99+(bass+mid+treb)*.0033; +per_frame_5= +per_frame_6=//beatdection +per_frame_7=rawbeatb=above(abs(db),avgdb*avgvol*4); +per_frame_8=beatb=rawbeatb*above(time-lbbtime,avgbeatrate*.5); +per_frame_9=beathard=beatb*(abs(db)-avgdb*4); +per_frame_10=//beatrate calc +per_frame_11=beatrate=beatb*(time-lbbtime)+(1-beatb)*beatrate; +per_frame_12=avgbeatrate=beatb*(avgbeatrate*.9+beatrate*.1)+(1-beatb)*avgbeatrate; +per_frame_13=lbbtime=time*beatb+(1-beatb)*lbbtime; +per_frame_14= +per_frame_15=ph=(time-lbbtime)*(60/avgbeatrate)*const; +per_frame_16=phase=max(min( ph, 1 ),0); +per_frame_17= +per_frame_18=//const=beatb*( bool*(const-.001)+(1-bool)*(const+.001) ) + (1-beatb)*const; +per_frame_19=const=const*(1-beatb)+beatb*( const+ (.01*bool) ); +per_frame_20= +per_frame_21=bool=below(phase,.98)*(.99-ph)-above(phase,.98)*(ph*.5); +per_frame_22= +per_frame_23=bc=bc+beatb; +per_frame_24= +per_frame_25=vol=(rawbeatb*(abs(db)-(avgdb))*.01); +per_frame_26=avgvol=avgvol*.999+vol*.001; +per_frame_27= +per_frame_28=mtime=mtime+min(avgvol*.5,.25)*(60/fps); +per_frame_29= +per_frame_30=decay=.9; +per_frame_31=warp=0; +per_frame_32=wrap=1; +per_frame_33= +per_frame_34= +per_frame_35=// This is the version you should use... +per_frame_36=// ----------- start copying ----------- +per_frame_37=hue=(mtime*.01+phase*.5); // change this +per_frame_38=h=6*(hue-int(hue)); +per_frame_39=sw1=below(h,1); sw2=(1-sw1)*below(h,2); sw3=(1-sw1)*(1-sw2)*below(h,3); sw4=(1-sw1)*(1-sw2)*(1-sw3)*below(h,4); +per_frame_40=sw6=above(h,5); sw5=(1-sw1)*(1-sw2)*(1-sw3)*(1-sw4)*(1-sw6); +per_frame_41=ob_r=sw1+sw2*(2-h)+sw5*(h-4)+sw6; // resulting Red value, assign it to q1 +per_frame_42=ob_g=sw1*h+sw2+sw3+sw4*(4-h); // resulting Green value, assign it to q2 +per_frame_43=ob_b=sw3*(h-2)+sw4+sw5+sw6*(6-h); // resulting Blue value, assign it to q3 +per_frame_44=// ----------- end ---------------- +per_frame_45= +per_frame_46= +per_frame_47=t1=t1+min(avgvol*bass_att*.5,.25)*(60/fps); +per_frame_48=t2=t2+min(avgvol*treb_att*.5,.25)*(60/fps); +per_frame_49=t3=t3+min(avgvol*mid_att*.5,.25)*(60/fps); +per_frame_50=monitor=avgvol; +per_frame_51=q1=mtime; +per_frame_52=q2=t1; +per_frame_53=q3=t2; +per_frame_54=q4=t3; +per_frame_55= +per_frame_56=cx=sin(q2*.1)*.5+.5; +per_frame_57=cy=cos(q3*.1)*.5+.5; +per_frame_58=rot=sin(q2*.01+sin(q3*.001))*10+10; +per_pixel_1= +per_pixel_2=c=sin(q2*.1); +per_pixel_3=cc=sin(q3*.1); +per_pixel_4=ccc=sin(q4*.1); +per_pixel_5=cx1=.5+ccc*.3; +per_pixel_6=cy1=.5+cc*.4; +per_pixel_7= +per_pixel_8=myx=(cx1-x); +per_pixel_9=myy=(cy1-(1-y)); +per_pixel_10=mrad=pow( myx*myx + myy*myy , .5); +per_pixel_11=mang=asin( abs(myy)/(mrad) ); +per_pixel_12= +per_pixel_13=ax=mang; +per_pixel_14=ay=mang; +per_pixel_15= +per_pixel_16=mrot=.1*(1-mrad)*sin(q1*.01+q2*.1); +per_pixel_17= +per_pixel_18=dx= sign(myy)*sin(ax)*mrot; +per_pixel_19=dy= sign(myx)*(cos(ay)*mrot); +per_pixel_20= +per_pixel_21= +per_pixel_22= +per_pixel_23=cx1=.5+cc*.3; +per_pixel_24=cy1=.5+c*.25+ccc*.25; +per_pixel_25= +per_pixel_26=myx=(cx1-x); +per_pixel_27=myy=(cy1-(1-y)); +per_pixel_28=mrad=pow( myx*myx + myy*myy , .5); +per_pixel_29=mang=asin( abs(myy)/(mrad) ); +per_pixel_30= +per_pixel_31=ax=mang; +per_pixel_32=ay=mang; +per_pixel_33= +per_pixel_34=mrot=.1*(1-mrad)*sin(q3*.02+q1*.3); +per_pixel_35= +per_pixel_36=dx= dx + sign(myy)*sin(ax)*mrot; +per_pixel_37=dy= dy + sign(myx)*(cos(ay)*mrot); +per_pixel_38= +per_pixel_39= +per_pixel_40= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Reenen - phoenix.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Reenen - phoenix.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Reenen - phoenix.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Reenen - phoenix.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=0.999607 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.053452 +fWaveScale=0.811409 +fWaveSmoothing=0.720000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.000000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.608037 +fWarpScale=1.220618 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.009520 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.591235 +sx=0.970590 +sy=1.000000 +wave_r=0.700000 +wave_g=0.100000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.240000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=vol = (bass*5 + mid * 3 + treb*2)/20; +per_frame_2=wave_g = wave_g + vol/10 + 0.1*sin(3.21*time); +per_frame_3=wave_r = wave_r + vol/10; +per_frame_4=wave_b = vol/10; +per_frame_5=dy = dy - vol/30 + 0.0015*sin(0.56*time); +per_frame_6=sx = sx - vol/50; +per_frame_7=wave_x = wave_x + vol/50; +per_pixel_1=q1 = above(0.5,y); +per_pixel_2=q2 = bor(above(x,0.55),above(0.45,x)); +per_pixel_3=q3 = (pow(rad+0.95,4)-1)*0.1*(y+0.1); +per_pixel_4=rot = if(bor(q1,q2),q3,rot); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rocke - Cold Love (Tei Zwaa).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rocke - Cold Love (Tei Zwaa).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rocke - Cold Love (Tei Zwaa).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rocke - Cold Love (Tei Zwaa).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,59 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.900000 +fDecay=0.982000 +fVideoEchoZoom=1.000110 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=2 +nMotionVectorsY=2 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.220000 +fWaveScale=1.170400 +fWaveSmoothing=0.683900 +fWaveParam=-0.040000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.999900 +fWarpScale=3.137900 +fZoomExponent=1.609200 +fShader=0.200000 +zoom=0.907000 +rot=0.139900 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.238000 +sx=1.009900 +sy=1.257100 +wave_r=0.000000 +wave_g=0.100000 +wave_b=0.900000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.370000 +ob_g=0.460000 +ob_b=0.350000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.100000 +ib_g=0.000000 +ib_b=0.300000 +ib_a=1.000000 +per_frame_1=wave_r = wave_r + 0.4*sin(time*3.14) + (0.2*mid); +per_frame_2=wave_b = wave_b + 0.2*sin(time*1.5); +per_frame_3=wave_g = wave_g + 0.2*mid; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rocke - Personal Comet.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rocke - Personal Comet.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rocke - Personal Comet.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rocke - Personal Comet.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,59 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.980000 +fVideoEchoZoom=1.169360 +fVideoEchoAlpha=0.300000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=2 +nMotionVectorsY=2 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.220039 +fWaveScale=1.170433 +fWaveSmoothing=0.684000 +fWaveParam=-0.040000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.053000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.263000 +sx=0.999996 +sy=0.999996 +wave_r=0.610000 +wave_g=0.320000 +wave_b=0.100001 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.370000 +ob_g=0.460000 +ob_b=0.350000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.100000 +ib_g=0.000000 +ib_b=0.300000 +ib_a=1.000000 +per_frame_1=dx = dx + 0.003*sin(0.1*time); +per_frame_2=dy = dy + 0.005*sin(0.4*time); +per_pixel_1=rot = rot + 0.02*sin(0.25*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Aderrasi - Oceanic Bassograph (Underwater Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Aderrasi - Oceanic Bassograph (Underwater Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Aderrasi - Oceanic Bassograph (Underwater Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Aderrasi - Oceanic Bassograph (Underwater Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.504000 +fDecay=1.000000 +fVideoEchoZoom=2.987781 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.049629 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=0.010000 +fWarpScale=1.000154 +fZoomExponent=1.028415 +fShader=0.800000 +zoom=0.999999 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999999 +sy=1.000000 +wave_r=0.500000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.015000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.500000 +ob_a=0.100000 +ib_size=0.000000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=0.250000 +ib_a=0.200000 +nMotionVectorsX=6.400000 +nMotionVectorsY=4.800000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=3.500000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.040000 +per_frame_1=q8 = oldq8 +0.003*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_frame_2=oldq8 = q8; +per_frame_3=wave_x = wave_x +(0.48*sin(4*bass*treb*mid))*sin(q8/bass); +per_frame_4=wave_r = if(above((time*20)%2,0),0,wave_r + 0.5*sin(time)); +per_frame_5=wave_b=if(above((time*20)%2,0),1,0); +per_frame_6=rot = rot + 0.0*sin(time); +per_frame_7=dy = dy - 0.01- 0.01*sin(0.1*q8); +per_frame_8=ob_r = .1 + if(above(.2*sin(time*.444),0),.3*sin(time*.444),0); +per_frame_9=ob_g =.1 + if(above(.2*sin(time*.777),0),.3*sin(time*.777),0); +per_pixel_1=warp = warp + if (below(y, 0.5), if(below(rad,0.9), +0.5 + 0.5*sin(0.613*q8), 0), +0.1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Harlequin's Maddess.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Harlequin's Maddess.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Harlequin's Maddess.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Harlequin's Maddess.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,108 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.640100 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.960000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=31.199999 +nMotionVectorsY=2.280001 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=2.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.800000 +mv_a=0.000000 +per_frame_1=q8 =oldq8+ 0.001*(pow(1.2*bass+0.4*bass_att+0.2*treb+0.2*treb_att+0.2*mid+0.2*mid_att,6)/fps) +0.1/fps; +per_frame_2=oldq8 = q8; +per_frame_3=ob_r = 0.3 - 0.3*(0.5*sin(q8*0.701)+ 0.3*cos(q8*0.438)); +per_frame_4=ob_g = 0.6- 0.4*sin(q8*2.924); +per_frame_5=ob_b = 0.35 - 0.3*cos(q8*0.816); +per_frame_6=warp =0; +per_frame_7=ib_size = 0.02; +per_frame_8=ib_r = ib_r + 0.5*sin(q8*3.034); +per_frame_9=ib_g = ib_g + 0.5*sin(q8*2.547); +per_frame_10=ib_b = ib_b - 0.5*sin(q8*1.431); +per_frame_11=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_12=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_13=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_14=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_15=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_16=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_17=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_18=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_19=lastbeat = if(beat,time,lastbeat); +per_frame_20=mybeat = if(beat,mybeat+1,mybeat); +per_frame_21=mybeat = if(above(mybeat,7),0,mybeat); +per_frame_22=mybeat2 = if(equal(mybeat,1),1,0); +per_frame_23=q7 = if(beat*mybeat2,0.001+0.0001*rand(40),oldq7); +per_frame_24=oldq7=q7; +per_frame_25=q6 = if(beat*mybeat2,0.001+0.0001*rand(40),oldq6); +per_frame_26=oldq6=q6; +per_frame_27=q5= if(beat*mybeat2,0.001+0.0001*rand(40),oldq5); +per_frame_28=oldq5=q5; +per_frame_29=q4 = if(beat*mybeat2,0.001+0.0001*rand(40),oldq4); +per_frame_30=oldq4=q4; +per_frame_31=Flag = If(beat*mybeat2,if(Rand(2)-1,1,0),oldFlag); +per_frame_32=oldflag = flag; +per_frame_33=Ratio = If(Beat*mybeat2,100+rand(60),oldRatio); +per_frame_34=OldRatio = Ratio; +per_frame_35=q3 = if(beat*mybeat2,if(flag,ratio,0.75*ratio),oldq3); +per_frame_36=oldq3=q3; +per_frame_37=q2 = if(beat*mybeat2,if(flag,0.75*ratio,ratio),oldq2); +per_frame_38=oldq2=q2; +per_pixel_1=box=(0.7*sqrt(2)-rad)+0.5*abs(x*3-0.4*sin(q1))%2 + 0.5*abs(y*3+0.4*sin(q1))%2; +per_pixel_2=q1 = 8.3+(sin(x+0.137*q8)-cos(y+0.213*q8)); +per_pixel_3=zoom = if(above(box,1),q1*.1,zoom); +per_pixel_4=rot = if(above(box,1),0.1*rad+sin(0.385*q8),rot); +per_pixel_5=dx=if(above(box,1),dx,q4*sin((y-0.5)*q3)+q5*sin((y-0.5)*q2)); +per_pixel_6=dy=if(above(box,1),dy,q6*cos((x-0.5)*q2)+q7*cos((x-0.5)*q3)); +per_frame_init_1=q8=0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Harlequin's Madness (Dark Disorder Mix.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Harlequin's Madness (Dark Disorder Mix.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Harlequin's Madness (Dark Disorder Mix.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Harlequin's Madness (Dark Disorder Mix.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,239 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.640100 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.960000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=32 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.200000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.400000 +shapecode_0_a=0.500000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.200000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang = time*0.4;; +shape_0_per_frame2=x = 0.5 + 0.3*cos(time*1.23) + 0.03*cos(time*0.7); +shape_0_per_frame3=y = 0.5 + 0.3*sin(time*1.43) + 0.03*sin(time*0.7); +shape_0_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_0_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_0_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_0_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_0_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_0_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shapecode_1_enabled=1 +shapecode_1_sides=32 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.200000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.500000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.200000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shape_1_per_frame1=ang = time*0.4;; +shape_1_per_frame2=x = 0.5 + 0.3*cos(time*1.104) + 0.03*cos(time*0.7); +shape_1_per_frame3=y = 0.5 + 0.3*sin(time*1.27) + 0.03*sin(time*0.7); +shape_1_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_1_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_1_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_1_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_1_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_1_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.200000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=0.500000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.200000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shape_2_per_frame1=ang = time*0.4;; +shape_2_per_frame2=x = 0.5 + 0.3*cos(time*1.23) + 0.03*cos(time*0.9); +shape_2_per_frame3=y = 0.5 + 0.3*sin(time*1.18) + 0.03*sin(time*0.9); +shape_2_per_frame4=r =0.5 + 0.5*sin(q8*0.413 + 1); +shape_2_per_frame5=g = 0.5 + 0.5*sin(q8*0.363 + 2); +shape_2_per_frame6=b = 0.5 + 0.5*sin(q8*0.871 + 5); +shape_2_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.835 + 4); +shape_2_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.686+ 1); +shape_2_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.938 + 3); +shape_2_per_frame10=sides = 360; +per_frame_init_1=q8=0; +per_frame_1=q8 =oldq8+ 0.001*(pow(1.2*bass+0.4*bass_att+0.2*treb+0.2*treb_att+0.2*mid+0.2*mid_att,6)/fps) +0.1/fps; +per_frame_2=oldq8 = q8; +per_frame_3=ob_r = 0.3 - 0.3*(0.5*sin(q8*0.701)+ 0.3*cos(q8*0.438)); +per_frame_4=ob_g = 0.6- 0.4*sin(q8*2.924); +per_frame_5=ob_b = 0.35 - 0.3*cos(q8*0.816); +per_frame_6=warp =0; +per_frame_7=ib_size = 0.02; +per_frame_8=ib_r = ib_r + 0.5*sin(q8*3.034); +per_frame_9=ib_g = ib_g + 0.5*sin(q8*2.547); +per_frame_10=ib_b = ib_b - 0.5*sin(q8*1.431); +per_frame_11=ib_r =0; +per_frame_12=ib_g =0; +per_frame_13=ib_b =0; +per_frame_14=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_15=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_16=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_17=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_18=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_19=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_20=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_21=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_22=lastbeat = if(beat,time,lastbeat); +per_frame_23=mybeat = if(beat,mybeat+1,mybeat); +per_frame_24=mybeat = if(above(mybeat,7),0,mybeat); +per_frame_25=mybeat2 = if(equal(mybeat,1),1,0); +per_frame_26=q7 = if(beat*mybeat2,0.001+0.0001*rand(40),oldq7); +per_frame_27=oldq7=q7; +per_frame_28=q6 = if(beat*mybeat2,0.001+0.0001*rand(40),oldq6); +per_frame_29=oldq6=q6; +per_frame_30=q5= if(beat*mybeat2,0.001+0.0001*rand(40),oldq5); +per_frame_31=oldq5=q5; +per_frame_32=q4 = if(beat*mybeat2,0.001+0.0001*rand(40),oldq4); +per_frame_33=oldq4=q4; +per_frame_34=Flag = If(beat*mybeat2,if(Rand(2)-1,1,0),oldFlag); +per_frame_35=oldflag = flag; +per_frame_36=Ratio = If(Beat*mybeat2,100+rand(60),oldRatio); +per_frame_37=OldRatio = Ratio; +per_frame_38=q3 = if(beat*mybeat2,if(flag,ratio,0.75*ratio),oldq3); +per_frame_39=oldq3=q3; +per_frame_40=q2 = if(beat*mybeat2,if(flag,0.75*ratio,ratio),oldq2); +per_frame_41=oldq2=q2; +per_frame_42=solarize = beat;; +per_pixel_1=box=(0.7*sqrt(2)-rad)+0.8*abs(x*3-0.4*sin(q1))%2 + 0.8*abs(y*3+0.4*sin(q1))%2; +per_pixel_2=q1 = 8.3+(sin(x+0.137*q8)-cos(y+0.213*q8)); +per_pixel_3=zoom = if(above(box,1),q1*.1,zoom); +per_pixel_4=rot = if(above(box,1),0.1*rad+sin(0.385*q8),rot); +per_pixel_5=dx=if(above(box,1),dx,q4*sin((y-0.5)*q3)+q5*sin((y-0.5)*q2)); +per_pixel_6=dy=if(above(box,1),dy,q6*cos((x-0.5)*q2)+q7*cos((x-0.5)*q3)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness 2 (Frozen Time Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness 2 (Frozen Time Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness 2 (Frozen Time Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness 2 (Frozen Time Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,92 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=4 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=27.154621 +fWaveScale=0.982837 +fWaveSmoothing=0.630000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_3=oldq8 = q8; +per_frame_4=wave_r = 0.5+0.5*sin(2.123*q8); +per_frame_5=wave_g = 0.5+0.5*sin(q8*2.576); +per_frame_6=wave_b = 0.5+0.5*cos(q8*2.465); +per_frame_7=ib_a =1; +per_frame_8=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_9=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_10=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_11=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_12=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_13=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_14=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_15=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_16=lastbeat = if(beat,time,lastbeat); +per_frame_17=countertime = if(beat,time,countertime); +per_frame_18=counter =-1*pow(min((time-countertime-1.5),0),9); +per_frame_19=wave_a = beat; +per_frame_20=wave_x =0.2+(0.01*rand(60))*beat; +per_frame_21=ib_r=wave_g; +per_frame_22=ib_b= wave_r; +per_frame_23=ib_g = wave_b; +per_frame_24=mv_a = 1+beat; +per_frame_25=q2 = 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)); +per_frame_26=monitor = q2; +per_pixel_1=dx=dx+q2*0.01*sin((y-0.5)*96)+q2*0.01*sin((y-0.5)*128); +per_pixel_2=dy=dy+q2*0.001*cos((x-0.5)*128)+q2*0.001*cos((x-0.5)*96); +per_frame_init_1=decay=0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness 4 (Spirit Of Twisted Madness M.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness 4 (Spirit Of Twisted Madness M.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness 4 (Spirit Of Twisted Madness M.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness 4 (Spirit Of Twisted Madness M.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,94 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.640100 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.960000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.230000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.250000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.7 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.5- 0.4*sin(time*5.924); +per_frame_3=ob_b = 0.45 - 0.3*cos(time*0.816); +per_frame_4=warp =0; +per_frame_5=volume = 0.08*(bass_att+3*bass+mid+mid_att); +per_frame_6=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_7=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_8=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_9=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_10=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_11=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_12=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_13=lastbeat = if(beat,time,lastbeat); +per_frame_14=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_15=q5 = if(beat,0.1*rand(1000),oldq5); +per_frame_16=oldq5 = q5; +per_frame_17=q3 = if(beat,0.1*rand(1000),oldq3); +per_frame_18=oldq3 = q3; +per_frame_19=ib_size = 0.02; +per_frame_20=ib_r = ib_r + 0.5*sin(time*2.424); +per_frame_21=ib_g = ib_g + 0.5*sin(time*2.247); +per_frame_22=ib_b = ib_b - 0.5*sin(time*1.131); +per_frame_23=q8 = oldq8 +0.003*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)) + 1/(fps*5); +per_frame_24=oldq8 = q8; +per_pixel_1=box=abs(x*2-0.4*sin(q3))%2 + abs(y*2+0.4*sin(q5))%2; +per_pixel_2=q1 = 4.05+(sin(x+0.237*time)-cos(y+0.513*time)); +per_pixel_3=zoom = if(above(box,1),q1*.1,zoom); +per_pixel_4=rot = if(above(box,1),sin(0.885*q8),0); +per_pixel_5=dx = if(above(box,1),sin(0.542*time),0.005*sin((y*2-1)*48)+0.001*tan((y*2-1)*64)); +per_pixel_6=dy= if(above(box,1),sin(0.581*time),((1+abs(sin(q8)))*0.001)*cos((x*2-1)*48)+0.001*tan((x*2-1)*48)); +per_pixel_7=zoomexp = if(above(box,1),3,1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (A Million Miles From Earth Mi.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (A Million Miles From Earth Mi.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (A Million Miles From Earth Mi.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (A Million Miles From Earth Mi.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,244 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.299910 +fWaveSmoothing=0.630000 +fWaveParam=0.300000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.203212 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=0.787566 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +shape_0_per_frame2=dx_r = equal(thresh,2)*0.004*sin(5*time)+(1-equal(thresh,2))*dx_r; +shape_0_per_frame3=dy_r = equal(thresh,2)*0.004*sin(6*time)+(1-equal(thresh,2))*dy_r; +shape_0_per_frame4=//tex_zoom = 0.8 -0.01*thresh; +shape_0_per_frame5=fdx = 1.1* dx_r; +shape_0_per_frame6=fdy = 1.1* dy_r; +shape_0_per_frame7=x = x+0.1*(fdx + if (above(bass,1.35), 31*dx_r, 0)); +shape_0_per_frame8=y = y+0.01*(if (above(bass,1.3), 0, y)); +shape_0_per_frame9= +shape_0_per_frame10= +shape_0_per_frame11= +shape_0_per_frame12=tex_zoom = 0.8-0.0001*pow((bass+bass_att),5)-0.01*(bass+bass_att); +shape_0_per_frame13=//tex_ang = bass; +shape_0_per_frame14=//x = x +0.01*sin(time); +shape_0_per_frame15=//tex_ang = 0.1*bass; +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.730000 +shapecode_1_rad=0.221671 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=2.448624 +shapecode_1_r=1.000000 +shapecode_1_g=0.500000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=0.500000 +shapecode_1_b2=1.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=1.000000 +shape_1_per_frame1=ang = 2*3.1415*sin(0.541*time); +shape_1_per_frame2=tex_ang = ang; +shape_1_per_frame3=x = 0.5 + 0.3*cos(time*0.74); +shape_1_per_frame4=y = 0.5 - 0.34*sin(time*0.894); +shapecode_2_enabled=1 +shapecode_2_sides=5 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.230000 +shapecode_2_rad=0.221671 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.220186 +shapecode_2_r=0.500000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.500000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=1.000000 +shape_2_per_frame1=ang = 3.1415*2*sin(time*0.274); +shape_2_per_frame2=tex_ang = ang; +shape_2_per_frame3=x = 0.5+0.3*sin(time*0.5317); +shape_2_per_frame4=y = 0.5+0.35*sin(time*0.6121); +shapecode_3_enabled=1 +shapecode_3_sides=3 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.300000 +shapecode_3_y=0.730000 +shapecode_3_rad=0.221671 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=0.970586 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=1.000000 +shape_3_per_frame1=ang = 3.1415*2*cos(time*0.314); +shape_3_per_frame2=tex_ang = ang; +shape_3_per_frame3=x = 0.5-0.3*sin(time*0.7117); +shape_3_per_frame4=y = 0.5-0.36*cos(time*0.5621); +per_frame_init_1=q8=0; +per_frame_1=warp=0; +per_frame_2=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_3=oldq8 = q8; +per_frame_4=wave_r = 0.5+0.5*sin(1.123*q8); +per_frame_5=wave_g = 0.5+0.5*sin(q8*1.576); +per_frame_6=wave_b = 0.5+0.5*cos(q8*1.465); +per_frame_7=ib_a =0.2*bass; +per_pixel_1=dx=dx+0.008*sin((y*2-1)*meshx)+0.008*sin((y*2-1)*meshx*1.3333); +per_pixel_2=dy=dy+0.008*cos((x*2-1)*meshx*1.3333)+0.008*cos((x*2-1)*meshx); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Boxfresh Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Boxfresh Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Boxfresh Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Boxfresh Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,85 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.199252 +fWaveSmoothing=0.630000 +fWaveParam=0.300000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_3=oldq8 = q8; +per_frame_4=wave_r = 0.5+0.5*sin(1.123*q8); +per_frame_5=wave_g = 0.5+0.5*sin(q8*1.576); +per_frame_6=wave_b = 0.5+0.5*cos(q8*1.465); +per_frame_7=ib_a =0.2*bass; +per_frame_8=y_pos = (sin(q8)/2 + 0.5 - (sin(q8)/2 + 0.5)* q1); +per_frame_9=x_pos = (sin(q8/3)/2 + 0.5 - (sin(q8/3)/2 +0.5)*q2); +per_frame_10=q3 = y_pos; +per_frame_11=q4 = x_pos; +per_pixel_1=effect1 = dx+0.001*sin((y*2-1)*96)+0.01*sin((y*2-1)*128); +per_pixel_2=effect2 = dx+0.008*sin((y*2-1)*48)+0.008*sin((y*2-1)*64); +per_pixel_3=box_effect = if(above(y,q3),if(below(y,(q3+q1)), if(above(x,q4),if(below(x,(q4+q2)),effect1,effect2),effect2),effect2),effect2); +per_pixel_4=dx= box_effect; +per_pixel_5=effect3 = dy+0.001*cos((x*2-1)*128)+0.01*cos((x*2-1)*96); +per_pixel_6=effect4 = dy+0.008*cos((x*2-1)*64)+0.008*cos((x*2-1)*48); +per_pixel_7=box_effect2= if(above(y,q3),if(below(y,(q3+q1)), if(above(x,q4),if(below(x,(q4+q2)),effect3,effect4),effect4),effect4),effect4); +per_pixel_8=dy= box_effect2; +per_frame_init_1=q8=0; +per_frame_init_2=q1 = 0.005*rand(60)+0.2; +per_frame_init_3=q2 = 0.005*rand(60)+0.2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Duel Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Duel Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Duel Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Duel Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,225 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.235590 +fWaveSmoothing=0.630000 +fWaveParam=-0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=2.400000 +mv_dx=0.000000 +mv_dy=-0.100000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=q8=0; +per_frame_1=warp=0; +per_frame_2=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_3=oldq8 = q8; +per_frame_4=wave_r = 0.5+0.5*sin(1.123*q8); +per_frame_5=wave_g = 0.5+0.5*sin(q8*1.576); +per_frame_6=wave_b = 0.5+0.5*cos(q8*1.465); +per_frame_7=ib_r = wave_b; +per_frame_8=ib_b=wave_g; +per_frame_9=ib_g=wave_r; +per_frame_10=ib_a =1; +per_frame_11=wave_x = 0.5 + 0.32*sin(q8*0.3); +per_frame_12=wave_y = 0.5 - 0.24*cos(q8*0.2); +per_frame_13=ob_size = 0.005 - above(bass,2)*0.005; +per_pixel_1=dx=dx+0.008*sin((y*2-1)*meshx); +per_pixel_2=dy=dy+0.008*cos((x*2-1)*meshx*1.333); +per_pixel_3=dx=dx+0.008*sin((y*2-1)*meshx*1.333); +per_pixel_4=dy=dy+0.008*cos((x*2-1)*meshx); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,217 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.199252 +fWaveSmoothing=0.630000 +fWaveParam=0.300000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=q8=0; +per_frame_1=warp=0; +per_frame_2=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_3=oldq8 = q8; +per_frame_4=wave_r = 0.5+0.5*sin(1.123*q8); +per_frame_5=wave_g = 0.5+0.5*sin(q8*1.576); +per_frame_6=wave_b = 0.5+0.5*cos(q8*1.465); +per_frame_7=ib_a =0.2*bass; +per_pixel_1=dx=dx+0.008*sin((y*2-1)*meshx)+0.008*sin((y*2-1)*meshx*1.3333); +per_pixel_2=dy=dy+0.008*cos((x*2-1)*meshx*1.3333)+0.008*cos((x*2-1)*meshx); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Surealist Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Surealist Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Surealist Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Altars Of Madness (Surealist Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,221 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.199252 +fWaveSmoothing=0.630000 +fWaveParam=0.300000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=q8=0; +per_frame_1=warp=0; +per_frame_2=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_3=oldq8 = q8; +per_frame_4=wave_r = 0.5+0.5*sin(1.123*q8); +per_frame_5=wave_g = 0.5+0.5*sin(q8*1.576); +per_frame_6=wave_b = 0.5+0.5*cos(q8*1.465); +per_frame_7=ib_a =0.2*bass; +per_frame_8=q2 = q8; +per_frame_9=q1 = 0.1*q8; +per_pixel_1=dx=dx+0.008*sin((y*2-1)*meshx)+0.008*sin((y*2-1)*meshx*1.333); +per_pixel_2=dy=dy+0.008*cos((x*2-1)*meshx*2.6667)-0.008*cos((x*2-1)*meshx); +per_pixel_3=rot=rot+0.01*sin(rad*(9.5 + 5.5*sin(q8*0.1623)) + q2*1.3 + q1*1.31); +per_pixel_4=zoom=zoom+0.01*sin(ang*6 + rad*(5.5 + 1.5*sin(q8*0.13)) + q2*1.63 + q1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles from Earth.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles from Earth.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles from Earth.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles from Earth.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,75 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.438649 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.976000 +ob_size=0.005000 +ob_r=0.400000 +ob_g=0.300000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=1.000000 +ib_g=0.600000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = 0.5 + 0.3*sin(time*0.894); +per_frame_3=wave_g = 0.53 + 0.33*sin(time*1.14); +per_frame_4=wave_b = 0.2 + 0.1*(1-bass); +per_frame_5=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_frame_6=dx_r = equal(thresh,2)*0.004*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_frame_7=dy_r = equal(thresh,2)*0.004*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_frame_8=zoom = zoom -0.01*thresh; +per_frame_9=dx = 1.1* dx_r; +per_frame_10=dy = 1.1* dy_r; +per_frame_11=dx = dx + if (above(bass,1.35), 31*dx_r, 0); +per_frame_12=dy = if (above(bass,1.3), 0, dy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles from Earth (Pathfinder Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles from Earth (Pathfinder Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles from Earth (Pathfinder Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles from Earth (Pathfinder Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.438649 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.963000 +ob_size=0.005000 +ob_r=0.400000 +ob_g=0.300000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=1.000000 +ib_g=0.600000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = 0.5 + 0.3*sin(time*0.894); +per_frame_3=wave_g = 0.53 + 0.33*sin(time*1.14); +per_frame_4=wave_b = 0.2 + 0.1*(1-bass); +per_frame_5=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_frame_6=dx_r = equal(thresh,2)*0.002*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_frame_7=dy_r = equal(thresh,2)*0.002*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_frame_8=zoom = zoom -0.01*thresh; +per_frame_9=dx = 1.1* dx_r; +per_frame_10=dy = 1.1* dy_r; +per_frame_11=dx = dx + if (above(bass,1.3), 21*dx_r, 0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles From Earth (Wormhole Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles From Earth (Wormhole Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles From Earth (Wormhole Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - A Million Miles From Earth (Wormhole Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.438649 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.999996 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.976000 +ob_size=0.005000 +ob_r=0.400000 +ob_g=0.300000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=1.000000 +ib_g=0.600000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = 0.5 + 0.3*sin(time*0.894); +per_frame_3=wave_g = 0.53 + 0.33*sin(time*1.14); +per_frame_4=wave_b = 0.2 + 0.2*(1-bass); +per_frame_5=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_frame_6=dx_r = equal(thresh,2)*0.004*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_frame_7=dy_r = equal(thresh,2)*0.004*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_frame_8=q1 = thresh; +per_frame_9=dx = 1.1* dx_r; +per_frame_10=dy = 1.1* dy_r; +per_frame_11=dx = dx + if (above(bass,1.35), 31*dx_r, 0); +per_frame_12=dy = if(above(bass,1.3), 0, dy); +per_pixel_1=zoom = zoom -0.01*q1*rad; +per_pixel_2=zoomexp = 1+0.2*(rad-0.2*q1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Krash - Hallucinogenic Pyramids (Extra Beat Ti.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Krash - Hallucinogenic Pyramids (Extra Beat Ti.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Krash - Hallucinogenic Pyramids (Extra Beat Ti.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Krash - Hallucinogenic Pyramids (Extra Beat Ti.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=11.940000 +fWaveScale=1.599182 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.001000 +fShader=0.000000 +zoom=1.007000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.400000 +wave_b=0.650000 +wave_x=0.010000 +wave_y=0.000000 +ob_size=0.005000 +ob_r=0.300000 +ob_g=0.500000 +ob_b=0.300000 +ob_a=0.700000 +ib_size=0.005000 +ib_r=0.450000 +ib_g=0.350000 +ib_b=0.350000 +ib_a=0.300000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_b = wave_b - 0.200*( 0.60*sin(1.823*time) + 0.40*sin(0.916*time) ); +per_frame_2=wave_r = wave_r + 0.500*( 0.60*sin(1.900*time) + 0.40*sin(1.023*time) ); +per_frame_3=wave_g = wave_g + 0.500*( 0.60*sin(1.1*time) + 0.40*sin(0.949*time) ); +per_frame_4=decay = decay - 0.03*equal(frame%30,0); +per_frame_5=treb_effect = max(max(treb,treb_att)-1.25,0); +per_frame_6=mid_effect= max(max(mid,mid_att)-1.25,0); +per_frame_7=ob_size = ob_size + 0.005*treb_effect; +per_frame_8=ib_size = ib_size + 0.005*mid_effect; +per_frame_9=ob_g = ob_g -0.2* treb_effect +0.2* mid_effect; +per_frame_10=ib_g = ib_g + 0.2*mid_effect+ 0.2*treb_effect; +per_frame_11=ib_b = ib_b - 0.2*mid_effect+ 0.2*treb_effect; +per_frame_12=ok_to_change = if(above(time,beat_time+5),1,0); +per_frame_13=bass_effect = max(bass, bass_att)-1; +per_frame_14=beat_time = if(above(bass_effect,0.5), if(ok_to_change,time,beat_time),beat_time); +per_frame_15=effect = if(equal(time,beat_time),effect+rand(3)+1,effect); +per_frame_16=effect = if(above(effect,3),effect-4,effect); +per_frame_17=bass_effect = max(max(bass,bass_att)-1.34,0); +per_frame_18=q1 = effect; +per_frame_19=q2 = bass_effect; +per_frame_20=wave_x = if(equal(q1,0),0.01,if(equal(q1,1),0.99,if(equal(q1,2),0.01,0.99))); +per_frame_21=wave_mystery = if(equal(q1,0),1,if(equal(q1,1),1,if(equal(q1,2),0,0))); +per_frame_22=monitor = q1; +per_frame_23=zoom = if(equal(q1,0),0.4*x,if(equal(q1,1),0.4*(1-x),if(equal(q1,2),0.4*y,0.4*(1-y)))) + 0.6 - 0.13*(min(q2,0.3)); +per_pixel_1=zoom = if(equal(q1,0),0.4*x,if(equal(q1,1),0.4*(1-x),if(equal(q1,2),0.4*y,0.4*(1-y)))) + 0.6 - 0.13*(min(q2,0.3)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Unchained - Braindance Visions.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Unchained - Braindance Visions.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Unchained - Braindance Visions.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Unchained - Braindance Visions.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.935000 +fVideoEchoZoom=1.006595 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=100.000000 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.489000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_2=bass_residual = equal(bass_thresh,2)*sin(time*bass_thresh*.1) + (1-equal(bass_thresh,2))*bass_residual; +per_frame_3=mid_thresh = above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_4=mid_residual = equal(mid_thresh,2)*sin(time*bass_thresh*.1) + (1-equal(mid_thresh,2))*mid_residual; +per_frame_5=q1=.75+.2*bass_residual; +per_frame_6=q2=.25+.2*mid_residual; +per_frame_7=wave_g = wave_g*bass_residual; +per_frame_8=wave_b =wave_b*mid_residual; +per_frame_9=wave_r = wave_r + .5*sin(time*bass_residual*mid_residual*.4); +per_frame_10=rot=rot+.3*sin(time*mid_residual); +per_pixel_1=sy= if(below(y,q1),if(above(y,q2),pow(log(abs(ang)*time),3)/4,q1+.25),q2+.75); +per_pixel_2=zoom = 1 + sin(rad)/10*cos((y-.5+rad)*10*sin(time)); +per_pixel_3=rot=rot+if(bnot(below(y,q1)*above(y,q2)),0,sin(time/2)*.1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Unchained - Life After Pie (Remix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Unchained - Life After Pie (Remix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Unchained - Life After Pie (Remix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar and Unchained - Life After Pie (Remix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.977000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=3.192474 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.009091 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.35)*0.96+1.3); +per_frame_2=bass_factor = equal(bass_thresh,2)*sin(time*bass_thresh*.4) + (1-equal(bass_thresh,2))*bass_factor; +per_frame_3=mid_thresh = above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.35)*0.96+1.3); +per_frame_4=mid_factor = equal(mid_thresh,2)*sin(time*mid_thresh*.4) + (1-equal(mid_thresh,2))*mid_factor; +per_frame_5=treb_thresh = above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.35)*0.96+1.3); +per_frame_6=treb_factor = equal(treb_thresh,2)*sin(time*treb_thresh*.4) + (1-equal(treb_thresh,2))*treb_factor; +per_frame_7=wave_r = 0.5+0.5*bass_factor; +per_frame_8=wave_b = 0.5+0.5*mid_factor; +per_frame_9=wave_g = 0.5+0.5*treb_factor; +per_frame_10=wave_mystery = sin(time*.7)/10; +per_frame_11=q1=bass_factor; +per_frame_12=q2=mid_factor; +per_frame_13=q3=treb_factor; +per_pixel_1=pi=22/7+.2-.2*q1; +per_pixel_2=rpi=pi*rad; +per_pixel_3=api=(1-rad)*pi; +per_pixel_4=zoom = if(above(rad,abs(q2)),1.07+sin(rpi)*.04*q2, 0.97+(sin(rpi)/10-sin(api)/10)*.04*q2)+cos(rpi*3*q3)*.07; +per_pixel_5=rot = if(above(rad,abs(q2)),cos((rad*2*rpi)+sin(pi*pow(rad,5)))*.1*q1,(cos(api)/25+sin(rpi))*.1*q1)+cos(api*3*q3)*.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Attacking Freedom.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Attacking Freedom.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Attacking Freedom.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Attacking Freedom.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,82 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.960000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=1 +bInvert=1 +fWaveAlpha=1.000000 +fWaveScale=0.224562 +fWaveSmoothing=0.000000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.199900 +wave_b=0.700000 +wave_x=0.600000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.030000 +ob_g=0.150000 +ob_b=0.250000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.100000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.010000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.500000 +per_frame_1=warp=0; +per_frame_2=mv_g = mv_g + 0.1*(0.6*sin(time*0.763) + 0.4*sin(time*1.231)); +per_frame_3=mv_b = mv_b + 0.2*(0.6*sin(time*0.695) + 0.4*sin(time*0.367)); +per_frame_4=q8 = oldq8 +0.003*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)) + 1/(fps*5); +per_frame_5=oldq8 = q8; +per_frame_6=wave_x = 0.1*sin(q8*1.0677) + 0.5; +per_frame_7=wave_y = 0.1*sin(q8*1.1931) + 0.5; +per_frame_8=q1 = wave_x; +per_frame_9=q2 = 1-wave_y; +per_frame_10=cx = wave_x; +per_frame_11=cy = 1-wave_y; +per_pixel_1=newx = x - q1; +per_pixel_2=newy = y - q2; +per_pixel_3=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_4=newzoom = pow(0.996, pow(0.01+sin(newrad*newrad), newrad*2-1)); +per_pixel_5=dx = (newx)*newzoom - newx; +per_pixel_6=dy = (newy)*newzoom - newy; +per_pixel_7=rot = -0.1*newrad*(0.5*rad+0.1); +per_pixel_8=zoom = 1+newzoom*0.3; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Bellanova (New Wave Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Bellanova (New Wave Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Bellanova (New Wave Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Bellanova (New Wave Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,236 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=8.311065 +fWaveSmoothing=0.606000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.000000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.134784 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.599182 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.200000 +shapecode_0_g2=0.200000 +shapecode_0_b2=0.200000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = q3; +shape_0_per_frame2=y = 1- q4; +shape_0_per_frame3=r = 0.5 + 0.49*sin(time*0.467); +shape_0_per_frame4=b = 0.5 + 0.49*sin(time*0.568); +shape_0_per_frame5=g = 0.5 + 0.49*sin(time*0.669); +shape_0_per_frame6=r2 = 0.1*(bass+bass_att); +shape_0_per_frame7=b2 = r2; +shape_0_per_frame8=g2 = r2; +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=warp = 0; +per_frame_2= +per_frame_3=wave_g = 0.5 + 0.5*sin(time*2.13); +per_frame_4=wave_b = 0.5 + 0.5*sin(0.89*time); +per_frame_5=wave_r = 0.2 + 0.2*sin(time*1.113); +per_frame_6=movement =movement + 0.5*(((bass+bass_att + 0.075*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_7=movement = if(above(movement,10000), 0, movement); +per_frame_8= +per_frame_9=q3 = 0.5+0.1*sin(movement); +per_frame_10=q4 = 0.5-0.1*cos(0.781*movement); +per_frame_11= +per_frame_12=wave_x = q3; +per_frame_13=wave_y = 1-q4; +per_frame_14=decay = 0.995; +per_frame_15=//decay = 1.0; +per_pixel_1=newx =x- q3; +per_pixel_2=newy =y- q4; +per_pixel_3=newang = atan2(newx,newy); +per_pixel_4=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_5=rot = rot + 0.1*sin(newang*20); +per_pixel_6=zoom = 1.0+0.1*abs(sin(newang*4)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Biohazard Warning.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Biohazard Warning.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Biohazard Warning.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Biohazard Warning.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,282 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.447717 +fWaveSmoothing=0.600000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.995000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=-0.002000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.400000 +mv_a=1.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.330038 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = q1; +shape_0_per_frame2=y = 1- q2; +shape_0_per_frame3=r = 0.5 + 0.49*sin(time*1.467); +shape_0_per_frame4=b = 0.5 + 0.49*sin(time*0.768); +shape_0_per_frame5=g = 0.5 + 0.49*sin(time*0.559); +shape_0_per_frame6=r2 = 0.1*(bass+bass_att); +shape_0_per_frame7=b2 = r2; +shape_0_per_frame8=g2 = r2; +shape_0_per_frame9=rad = r2 + 0.2; +shapecode_1_enabled=1 +shapecode_1_sides=100 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.330038 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=r = 0.5 + 0.49*sin(time*0.467); +shape_1_per_frame2=b = 0.5 + 0.49*sin(time*0.568); +shape_1_per_frame3=g = 0.5 + 0.49*sin(time*0.669); +shape_1_per_frame4=r2 = 0.1*(bass+bass_att); +shape_1_per_frame5=b2 = r2; +shape_1_per_frame6=g2 = r2; +shape_1_per_frame7=rad = r2 + 0.2; +shape_1_per_frame8=x = q1+0.3*sin(time*0.85); +shape_1_per_frame9=y = 1-q2-0.4*cos(time*0.85); +shapecode_2_enabled=1 +shapecode_2_sides=100 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.330038 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=r = 0.5 + 0.49*sin(time*0.467); +shape_2_per_frame2=b = 0.5 + 0.49*sin(time*0.568); +shape_2_per_frame3=g = 0.5 + 0.49*sin(time*0.669); +shape_2_per_frame4=r2 = 0.1*(bass+bass_att); +shape_2_per_frame5=b2 = r2; +shape_2_per_frame6=g2 = r2; +shape_2_per_frame7=rad = r2 + 0.2; +shape_2_per_frame8=x = q1+0.3*sin(time*0.85+2.07); +shape_2_per_frame9=y = 1-q2-0.4*cos(time*0.85+2.07); +shapecode_3_enabled=1 +shapecode_3_sides=100 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.330038 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=x = q1; +shape_3_per_frame2=y = 1- q2; +shape_3_per_frame3=r = 0.5 + 0.49*sin(time*0.467); +shape_3_per_frame4=b = 0.5 + 0.49*sin(time*0.568); +shape_3_per_frame5=g = 0.5 + 0.49*sin(time*0.669); +shape_3_per_frame6=r2 = 0.1*(bass+bass_att); +shape_3_per_frame7=b2 = r2; +shape_3_per_frame8=g2 = r2; +shape_3_per_frame9=rad = r2 + 0.2; +shape_3_per_frame10=x = q1+0.3*sin(time*0.85+4.14); +shape_3_per_frame11=y = 1-q2-0.4*cos(time*0.85+4.14); +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.480*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.370*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=warp=0; +per_frame_5=zoom =1; +per_frame_6=rot=0; +per_frame_7=decay =0.99; +per_frame_8=decay =1; +per_frame_9=ib_r = 0.16 + 0.15*sin(time*0.783); +per_frame_10=ib_g = 0.16 + 0.15*sin(time*0.895); +per_frame_11=ib_b = 0.75 +0.24*sin(time*1.134); +per_frame_12=ib_size = 0.005*above(bass+bass_att,2.8); +per_frame_13=mv_r = ib_r; +per_frame_14=mv_b = ib_b; +per_frame_15=mv_g = ib_g; +per_frame_16= +per_frame_17=movement =movement + 0.5*(((bass+bass_att + 0.075*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_18=movement = if(above(movement,10000), 0, movement); +per_frame_19= +per_frame_20=q1 = 0.5+0.1*sin(movement); +per_frame_21=q2 = 0.5-0.1*cos(0.781*movement); +per_frame_22=q3 = movement; +per_frame_23=wave_x = q1; +per_frame_24=wave_y = 1-q2; +per_frame_25= +per_pixel_1=newx =x- q1; +per_pixel_2=newy =y- q2; +per_pixel_3=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_4=newang = atan2(newx,newy); +per_pixel_5=//effect = ((1-newrad)*(1-newrad))*(0.0*((0.9+0.2*sin(q3*0.23))*y)*((0.9+0.2*sin(q3*0.197))*x)); +per_pixel_6=effect = sqrt(2)-newrad; +per_pixel_7=effect2 = newang; +per_pixel_8=zoom=0.8+(0.3+0.3*bass)*cos(pow((effect),3)*10); +per_pixel_9=//rot=-0.01*sin(pow((effect),3)*10); +per_pixel_10=dx=0.015*sin(pow((effect2),3)*10); +per_pixel_11=dy=0.015*cos(pow((effect2),3)*10); +per_pixel_12= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Chapel Of Ghouls.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Chapel Of Ghouls.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Chapel Of Ghouls.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Chapel Of Ghouls.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,284 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.931011 +fWaveSmoothing=0.630000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=11.360000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.750000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=1 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.444842 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.200000 +shapecode_0_r2=0.200000 +shapecode_0_g2=0.300000 +shapecode_0_b2=0.200000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = 0.5 + 0.3*sin(time*0.9521); +shape_0_per_frame2=y = 0.5+0.3*sin(time*0.782); +shape_0_per_frame3=b = 0.2 + 0.199*sin(time*0.462); +shape_0_per_frame4=g = 0.2 + 0.199*sin(time*0.3462); +shape_0_per_frame5=r = 0.9 + 0.099*sin(time*0.2786); +shape_0_per_frame6=r2 = 0.2 + 0.199*sin(time*0.3162); +shape_0_per_frame7=g2 = 0.2 + 0.199*sin(time*0.29462); +shape_0_per_frame8=b2 = 0.2 + 0.199*sin(time*0.4042); +shape_0_per_frame9=//a1=q2; +shape_0_per_frame10=//a2 = q2; +shape_0_per_frame11=additive = if(q4,(q4-1)*equal(q3,0),bnot(equal(q3,0))); +shape_0_per_frame12=textured = bnot(equal(q3,0)); +shapecode_1_enabled=1 +shapecode_1_sides=100 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.444842 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.200000 +shapecode_1_r2=0.200000 +shapecode_1_g2=0.300000 +shapecode_1_b2=0.200000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=x = 0.5 + 0.3*sin(time*0.8521); +shape_1_per_frame2=y = 0.5+0.3*sin(time*0.67682); +shape_1_per_frame3=b = 0.2 + 0.199*sin(time*0.3462); +shape_1_per_frame4=g = 0.2 + 0.199*sin(time*0.462); +shape_1_per_frame5=r = 0.9 + 0.099*sin(time*0.3786); +shape_1_per_frame6=r2 = 0.2 + 0.199*sin(time*0.4162); +shape_1_per_frame7=g2 = 0.2 + 0.199*sin(time*0.39462); +shape_1_per_frame8=b2 = 0.2 + 0.199*sin(time*0.3042); +shape_1_per_frame9=additive = if(q4,(q4-1)*equal(q3,1),bnot(equal(q3,1))); +shape_1_per_frame10=textured = bnot(equal(q3,1)); +shapecode_2_enabled=1 +shapecode_2_sides=100 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.444842 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=0.200000 +shapecode_2_r2=0.200000 +shapecode_2_g2=0.300000 +shapecode_2_b2=0.200000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=x = 0.5 + 0.3*sin(time*0.7721); +shape_2_per_frame2=y = 0.5+0.3*sin(time*0.823); +shape_2_per_frame3=b = 0.2 + 0.199*sin(time*0.652); +shape_2_per_frame4=g = 0.2 + 0.199*sin(time*0.4162); +shape_2_per_frame5=r = 0.9 + 0.099*sin(time*0.1786); +shape_2_per_frame6=r2 = 0.2 + 0.199*sin(time*0.1862); +shape_2_per_frame7=g2 = 0.2 + 0.199*sin(time*0.442); +shape_2_per_frame8=b2 = 0.2 + 0.199*sin(time*0.382); +shape_2_per_frame9=//a = q2; +shape_2_per_frame10=//a2 = q2; +shape_2_per_frame11=additive = if(q4,(q4-1)*equal(q3,2),bnot(equal(q3,2))); +shape_2_per_frame12=textured = bnot(equal(q3,2)); +shapecode_3_enabled=1 +shapecode_3_sides=100 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.444842 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=0.200000 +shapecode_3_r2=0.200000 +shapecode_3_g2=0.300000 +shapecode_3_b2=0.200000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=x = 0.5 + 0.3*sin(time*0.621); +shape_3_per_frame2=y = 0.5+0.3*sin(time*0.693); +shape_3_per_frame3=b = 0.2 + 0.199*sin(time*0.3862); +shape_3_per_frame4=g = 0.2 + 0.199*sin(time*0.449); +shape_3_per_frame5=r = 0.9 + 0.099*sin(time*0.3521); +shape_3_per_frame6=r2 = 0.2 + 0.199*sin(time*0.5252); +shape_3_per_frame7=g2 = 0.2 + 0.199*sin(time*0.3085); +shape_3_per_frame8=b2 = 0.2 + 0.199*sin(time*0.4111); +shape_3_per_frame9=//a = q2; +shape_3_per_frame10=//a2 = q2; +shape_3_per_frame11=additive = if(q4,(q4-1)*equal(q3,3),bnot(equal(q3,3))); +shape_3_per_frame12=textured = bnot(equal(q3,3)); +per_frame_init_1=q4 = int(rand(3)); +per_frame_init_2=q5 = 2+int(rand(3))*(1/3); +per_frame_init_3=q6 = 2+int(rand(3))*(1/3); +per_frame_init_4=q7 = 2+int(rand(3))*(1/3); +per_frame_init_5=q8 = 2+int(rand(3))*(1/3); +per_frame_1=warp=0; +per_frame_2=ib_a =0.2*bass; +per_frame_3=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_4=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_5=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_6=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_7=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_8=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_9=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_10=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_11=lastbeat = if(beat,time,lastbeat); +per_frame_12=countertime = if(beat,time,countertime); +per_frame_13=counter =-1*pow(min((time-countertime-1.5),0),9); +per_frame_14=beatcounter = if(beat, Beatcounter+1, beatcounter); +per_frame_15=wave_a = 0; +per_frame_16=ib_r=0.1+0.0999*sin(time*0.4251); +per_frame_17=ib_b=0.1+0.0999*sin(time*0.351); +per_frame_18=ib_g=0.1+0.0999*sin(time*0.543); +per_frame_19=ob_a =bnot(beat); +per_frame_20=q2 = beat; +per_frame_21=q3 = beatcounter%4; +per_frame_22=monitor = q4; +per_frame_23=decay =if(q4,1,0.98); +per_frame_24=q1 =20/fps; +per_pixel_1=dx= dx+q1*0.005*sin((y-0.5)*meshx*q7) +q1*0.005*sin((y-0.5)*meshx*q4); +per_pixel_2=dy=dy+q1*0.0025*cos((x-0.5)*meshx*q6)+ q1*0.0025*cos((x-0.5)*meshx*q5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Che - Adela The Flower (Altars Of Madness Mix 2).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Che - Adela The Flower (Altars Of Madness Mix 2).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Che - Adela The Flower (Altars Of Madness Mix 2).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Che - Adela The Flower (Altars Of Madness Mix 2).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,113 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000499 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000416 +fWaveScale=0.671923 +fWaveSmoothing=0.450000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.200000 +fModWaveAlphaEnd=0.600000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000158 +fShader=0.000000 +zoom=1.000223 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=0.999999 +sy=0.999999 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.600000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=20.223999 +nMotionVectorsY=20.255999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=2.200000 +mv_r=0.900000 +mv_g=0.500000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=// timed sidon sensor +per_frame_2=// le = signal level; desired average value = 2 +per_frame_3=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_4=pulse=above(le,th); +per_frame_5=// pulsefreq = running average of interval between last 5 pulses +per_frame_6=pulsefreq=if(equal(pulsefreq,0),2, +per_frame_7=if(pulse,.8*pulsefreq+.2*(time-lastpulse),pulsefreq)); +per_frame_8=lastpulse=if(pulse,time,lastpulse); +per_frame_9=// bt = relative time; 0 = prev beat; 1 = expected beat +per_frame_10=bt=(time-lastbeat)/(.5*beatfreq+.5*pulsefreq); +per_frame_11=// hccp = handcicap for th driven by bt +per_frame_12=hccp=(.03/(bt+.2))+.5*if(band(above(bt,.8),below(bt,1.2)), +per_frame_13=(pow(sin((bt-1)*7.854),4)-1),0); +per_frame_14=beat=band(above(le,th+hccp),btblock); +per_frame_15=btblock=1-above(le,th+hccp); +per_frame_16=lastbeat=if(beat,time,lastbeat); +per_frame_17=beatfreq=if(equal(beatfreq,0),2, +per_frame_18=if(beat,.8*beatfreq+.2*(time-lastbeat),beatfreq)); +per_frame_19=// th = threshold +per_frame_20=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_21=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_22=th=if(above(th,6),6,th); +per_frame_23=thccl=thccl+(th-2.5144); +per_frame_24= +per_frame_25=cc=cc+beat; +per_frame_26=q1=cc; +per_frame_27=ib_a=if(equal((3*sin(cc))%2,0),.3+.3*sin(.01*thccl),0); +per_frame_28=//zoom=.98+.02*sin(12*cc); +per_frame_29=//zoomexp=1+.3*sin(26*cc); +per_frame_30=//sx=1+.01*sin(11*cc); +per_frame_31=//sy=1+.01*sin(14*cc); +per_frame_32=wave_x=.5+.4*sin((.02+.005*sin(.003*time))*thccl)+.05*sin(8*time); +per_frame_33=wave_y=.5+.4*sin((.017+.005*sin(.0027*time))*thccl)+.05*sin(6.7*time); +per_frame_34= +per_frame_35=wave_r=sqr(sin(cc+.07*time)); +per_frame_36=wave_g=sqr(sin(cc+.06*time)); +per_frame_37=wave_b=sqr(sin(cc+.05*time)); +per_frame_38=ob_r=.5+.5*sin(1.23*time+4*cc+.011*thccl); +per_frame_39=ob_g=.5+.5*sin(1.32*time+7*cc+.012*thccl); +per_frame_40=ob_b=.5+.5*sin(1.17*time+9*cc+.013*thccl); +per_pixel_1=ak=-sin(6*rad+((q1%5)*3)%5*ang+q1)*(1-rad+.2*sin(.54*q1))*above(rad,0); +per_pixel_2=block=if(below(ak,-.15),ak,0); +per_pixel_3=dx=dx+0.005*sin((y*2-1)*48)+0.001*tan((y*2-1)*64)+0.000*tan((ang-3.1415)*8); +per_pixel_4=dy =dy+0.005*sin((x*2-1)*48)+0.001*tan((x*2-1)*64)+0.000*tan((ang-3.1415)*6); +per_pixel_5=//dx=dx+0.008*sin((x-0.5)*48)+0.008*sin((x-0.5)*64); +per_pixel_6=//dy=dy+0.008*cos((y-0.5)*64); +per_pixel_7=dx=if(block,dx,0.008*sin((x-0.5)*48)+0.008*sin((x-0.5)*64)); +per_pixel_8=dy=if(block,dy,0.008*cos((y-0.5)*64)); +per_pixel_9= +per_pixel_10=zoom = if(block,1,0.97); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Che - Asylum Animations.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Che - Asylum Animations.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Che - Asylum Animations.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Che - Asylum Animations.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,127 @@ +[preset00] +fRating=3.500000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.500000 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.230000 +wave_g=0.200000 +wave_b=0.200000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.400000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.300000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.330000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=0.300000 +mv_b=0.100000 +mv_a=1.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.825*time) + 0.40*sin(0.915*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.025*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.810*time) + 0.40*sin(0.950*time) ); +per_frame_4=wave_x = 0.5-cos(time+dx_residual)/3.5; +per_frame_5=wave_y = 0.5-cos(time+dy_residual)/2.5; +per_frame_6=cx = cx + 0.225*( 0.60*sin(0.350*time) + 0.40*sin(0.350*time) ); +per_frame_7=cy = cy + 0.225*( 0.60*sin(0.350*time) + 0.40*sin(0.350*time) ); +per_frame_8=dx = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_9=dy = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_10=dx_residual=max(bass, bass_att)-1; +per_frame_11=dy_residual=min(bass, bass_att)-1; +per_frame_12=dx = if(above(bass_att+bass,2.8),6*dx,dx); +per_frame_13=// timed sidon sensor +per_frame_14=// le = signal level; desired average value = 2 +per_frame_15=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_16=pulse=above(le,th); +per_frame_17=// pulsefreq = running average of interval between last 5 pulses +per_frame_18=pulsefreq=if(equal(pulsefreq,0),2, +per_frame_19=if(pulse,.8*pulsefreq+.2*(time-lastpulse),pulsefreq)); +per_frame_20=lastpulse=if(pulse,time,lastpulse); +per_frame_21=// bt = relative time; 0 = prev beat; 1 = expected beat +per_frame_22=bt=(time-lastbeat)/(.5*beatfreq+.5*pulsefreq); +per_frame_23=// hccp = handcicap for th driven by bt +per_frame_24=hccp=(.03/(bt+.2))+.5*if(band(above(bt,.8),below(bt,1.2)), +per_frame_25=(pow(sin((bt-1)*7.854),4)-1),0); +per_frame_26=beat=band(above(le,th+hccp),btblock); +per_frame_27=btblock=1-above(le,th+hccp); +per_frame_28=lastbeat=if(beat,time,lastbeat); +per_frame_29=beatfreq=if(equal(beatfreq,0),2, +per_frame_30=if(beat,.8*beatfreq+.2*(time-lastbeat),beatfreq)); +per_frame_31=// th = threshold +per_frame_32=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_33=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_34=th=if(above(th,6),6,th); +per_frame_35=q3=30/fps; +per_frame_36=ccl=ccl+beat; +per_frame_37=minorccl=minorccl+.01*le; +per_frame_38=q4=beat; +per_frame_39=wave_r=.5+.15*sin(12*ccl)+.35*sin(3.62*minorccl); +per_frame_40=wave_g=.5+.15*sin(14*ccl)+.35*sin(7.38*minorccl); +per_frame_41=wave_b=.5+.15*sin(16*ccl)+.35*sin(5.21*minorccl); +per_frame_42=q1=.5+.25*sin(17*ccl+minorccl); +per_frame_43=cx=if(beat,.5+.5*sin(38*ccl),q1); +per_frame_44=q2=.5+.25*sin(17*ccl+minorccl); +per_frame_45=cy=if(beat,.5+.5*sin(46*ccl),q2); +per_frame_46=mv_x = 1.25; +per_frame_47=mv_y = 1.25; +per_frame_48=mv_dx =q1-0.5; +per_frame_49=mv_dy = -1*(q2-0.5); +per_pixel_1=myrot = 0.03*sin(0.84*time)-0.013*cos(0.784*time)+0.02*sin(1-rad); +per_pixel_2=rot = myrot; +per_pixel_3=// coordinates transfomation +per_pixel_4=// q1,q2 = position; q3 = 1/zoom; q4 = rotation +per_pixel_5=aang=atan2(y-q2,x-q1)-1.57; +per_pixel_6=arad=sqrt(sqr(y-q2)+sqr(x-q1)); +per_pixel_7=atx=cos(aang)*arad; +per_pixel_8=aty=sin(aang)*arad; +per_pixel_9= +per_pixel_10=sound=if(below(x,.5),2*x*mid+(1-(2*x))*bass, +per_pixel_11=(x-.5)*2*treb+(1-(x-.5)*2)*mid); +per_pixel_12=sound=sound*q3; +per_pixel_13=zone=below(abs(x-q1),.15)*below(abs(y-q2),.15); +per_pixel_14=rot=if(zone,bass*bass_att*0.2*pow(arad,arad),myrot); +per_pixel_15=dx = if(zone,0,dx+0.01*rad*sound); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Chemical Spirituality.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Chemical Spirituality.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Chemical Spirituality.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Chemical Spirituality.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,86 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.711551 +fWaveScale=0.083110 +fWaveSmoothing=0.540000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.503000 +wave_y=1.000000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.400000 +ib_size=0.005000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.210000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=dcounter = if( equal(dcounter,0),if(above(bass,1.5),bass,dcounter), if(below(dcounter,0),0,if(above(bass_att,1.35),dcounter+.14,dcounter-.14))); +per_frame_3=tcounter = if( equal(dcounter,0),if(above(treb,1.5),treb*.5,tcounter), if(below(tcounter,0),0,if(above(treb_att,1.35),tcounter+.2,tcounter-.2))); +per_frame_4=q1 = min(dcounter,2); +per_frame_5=q2 = min(tcounter,1.7); +per_frame_6=frametest = frame%2; +per_frame_7=wave_r = .2 + .2*sin(time)+.4*bass*frametest; +per_frame_8=wave_g = .2 + .2*sin(time*.222)+.4*treb*frametest; +per_frame_9=wave_b = .2 + .2*sin(time*.555)+.4*mid*frametest; +per_frame_10=q3 = min(max(q2,2),0.5); +per_frame_11=monitor =q1; +per_frame_12=wave_mystery = if(frametest,0,1); +per_frame_13=wave_x = if(frametest,0.5,0.5); +per_frame_14=wave_y = if(frametest,0.999,0.999); +per_frame_15=monitor = wave_g; +per_frame_16=ib_a = 0.03*(treb_att +treb); +per_frame_17=ib_b = 0.08*(bass_att+bass); +per_frame_18=ib_g = 0.08*(mid+mid_att); +per_pixel_1=cx = (0&(x*15-0.5))*(1/15)+0.05; +per_pixel_2=cy = (0&(y*15-0.5))*(1/15)+0.05; +per_pixel_3=rot = (0.1)*(q3*((5*(q2-(0.8+0.1*q1)+cx))*rad-q1)); +per_frame_init_1=dcounter = 0; +per_frame_init_2=tcounter = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Clouded Judgement 3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Clouded Judgement 3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Clouded Judgement 3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Clouded Judgement 3.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=0.902236 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=11.940000 +fWaveScale=1.599182 +fWaveSmoothing=0.700000 +fWaveParam=-0.200000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.001000 +fShader=0.000000 +zoom=1.007000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.300000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.400000 +ob_g=0.300000 +ob_b=0.000000 +ob_a=0.700000 +ib_size=0.005000 +ib_r=0.650000 +ib_g=0.050000 +ib_b=0.450000 +ib_a=0.300000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.200*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_4=decay = decay - 0.03*equal(frame%30,0); +per_frame_5=treb_effect = max(max(treb,treb_att)-1.25,0); +per_frame_6=mid_effect= max(max(mid,mid_att)-1.25,0); +per_frame_7=bass_effect = max(max(bass,bass_att)-1.34,0); +per_frame_8=ob_size = ob_size + 0.005*treb_effect; +per_frame_9=ib_size = ib_size + 0.005*mid_effect; +per_frame_10=ob_r = ob_r -0.2* treb_effect +0.2* mid_effect; +per_frame_11=ib_g = ib_g + 0.2*mid_effect- 0.2*treb_effect; +per_frame_12=dx = -0.01*treb_effect; +per_frame_13=rot = 0.1-2*bass_effect; +per_frame_14=zoom =0.99 - 0.2*(min(bass_effect,0.3)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Echoes 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Echoes 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Echoes 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Echoes 1.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.840000 +fDecay=0.900000 +fVideoEchoZoom=2.215847 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.130388 +fWaveSmoothing=0.540000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=1.000000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.4)*0.85+1.4); +per_frame_2=treb_thresh = above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.5)*0.75+1.5); +per_frame_3=bass_on = above(bass_thresh,1.8); +per_frame_4=treb_on = above(treb_thresh,1.9); +per_frame_5=swapcolour = bass_on - treb_on; +per_frame_6=red_aim = if(equal(swapcolour,1),1,if(equal(swapcolour,0),1,0)); +per_frame_7=green_aim = if(equal(swapcolour,1),0,if(equal(swapcolour,0),0.5,0.25)); +per_frame_8=blue_aim = if(equal(swapcolour,1),0,if(equal(swapcolour,0),0,1)); +per_frame_9=red = red + (red_aim - red)*if(equal(swapcolour,1),0.65,0.45); +per_frame_10=green = green + (green_aim - green)*0.5; +per_frame_11=blue = blue + (blue_aim - blue)*if(equal(swapcolour,1),0.45,0.65); +per_frame_12=wave_r = red; +per_frame_13=wave_g = green; +per_frame_14=wave_b = blue; +per_pixel_1=dx = if(above(x,0.5),sin(0.5-x)/15, log10(1/x)/45); +per_pixel_2=xrot = if(above(rad,0.4),cos(rad*2*x)/25+sin(pow(ang,5))/25,cos(1-rad)/25+2*sin(-rad)/25); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Echoes 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Echoes 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Echoes 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Echoes 2.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.840000 +fDecay=0.900000 +fVideoEchoZoom=2.215847 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.130388 +fWaveSmoothing=0.540000 +fWaveParam=-0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.000000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.4)*0.85+1.4); +per_frame_2=treb_thresh = above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.5)*0.75+1.5); +per_frame_3=bass_on = above(bass_thresh,1.8); +per_frame_4=treb_on = above(treb_thresh,1.9); +per_frame_5=swapcolour = bass_on - treb_on; +per_frame_6=red_aim = if(equal(swapcolour,1),1,if(equal(swapcolour,0),1,0)); +per_frame_7=green_aim = if(equal(swapcolour,1),0,if(equal(swapcolour,0),0.5,0.25)); +per_frame_8=blue_aim = if(equal(swapcolour,1),0,if(equal(swapcolour,0),0,1)); +per_frame_9=red = red + (red_aim - red)*if(equal(swapcolour,1),0.65,0.45); +per_frame_10=green = green + (green_aim - green)*0.5; +per_frame_11=blue = blue + (blue_aim - blue)*if(equal(swapcolour,1),0.45,0.65); +per_frame_12=wave_r = red; +per_frame_13=wave_g = green; +per_frame_14=wave_b = blue; +per_pixel_1=dy = if(above(y,0.5),sin(0.5-y)/10, log10(1/y)/35); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Havoc.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Havoc.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Havoc.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Havoc.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,78 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.700000 +fDecay=0.902000 +fVideoEchoZoom=0.999606 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.099694 +fWaveSmoothing=0.630000 +fWaveParam=0.899900 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999995 +fShader=1.000000 +zoom=0.999513 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999997 +sy=0.999999 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.000000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.4)*0.85+1.4); +per_frame_2=treb_thresh = above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.5)*0.75+1.5); +per_frame_3=bass_on = above(bass_thresh,1.8); +per_frame_4=treb_on = above(treb_thresh,1.9); +per_frame_5=swapcolour = bass_on - treb_on; +per_frame_6=red_aim = if(equal(swapcolour,1),1,if(equal(swapcolour,0),1,0)); +per_frame_7=green_aim = if(equal(swapcolour,1),0,if(equal(swapcolour,0),0.5,0.25)); +per_frame_8=blue_aim = if(equal(swapcolour,1),0,if(equal(swapcolour,0),0,1)); +per_frame_9=red = red + (red_aim - red)*if(equal(swapcolour,1),0.55+abs(sin(time/2)/10),0.45); +per_frame_10=green = green + (green_aim - green)*0.5; +per_frame_11=blue = blue + (blue_aim - blue)*if(equal(swapcolour,1),0.35,0.7); +per_frame_12=wave_r= red-green; +per_frame_13=wave_b = blue; +per_frame_14=wave_g= green; +per_frame_15=mybass= if(above((bass+bass_att),2.1),bass+bass_att,0); +per_frame_16=mytreb = if(below(treb,1),(1-treb)*3+2,0); +per_frame_17=q1 = if(above(mytreb+mybass,4),1, 0); +per_frame_18=wave_mystery= if(equal(q1,0),1,0); +per_pixel_1=effect1 = 0.32+(bass + bass_att*2)/20; +per_pixel_2=effect2 = 0.32+(mid + mid_att*2)/20; +per_pixel_3=dx =if(equal(q1,0), if(above(x,effect1),sin(effect1-x)/5, log10(1/x)/15),0); +per_pixel_4=dy = if(equal(q1,1),if(above(y,effect2),sin(effect2-y)/4, log10(1/y)/12),0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Mosaic (Active Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Mosaic (Active Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Mosaic (Active Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Cosmic Mosaic (Active Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,225 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.369668 +fWaveScale=2.608790 +fWaveSmoothing=0.500000 +fWaveParam=0.350000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=3.600000 +fShader=0.000000 +zoom=1.004000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.309000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=8.000000 +nMotionVectorsY=4.320000 +mv_dx=-0.136000 +mv_dy=-0.012000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.330038 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.691150 +shapecode_0_tex_zoom=2.283879 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=tex_zoom = tex_zoom - 0.025 + 0.05*(bass+bass_att); +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=//zoom = zoom + 0.023*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=//rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%200,0); +per_frame_7=warp=0; +per_frame_8=decay = 0.970; +per_frame_9=zoom =1; +per_frame_10=rot=0; +per_pixel_1=//dy=dy+0.05*sin((y*2-1)*48+(y*2-1)*64); +per_pixel_2=//dy=dy-0.05*cos((x*2-1)*64+(x*2-1)*48); +per_pixel_3=//dx=dx+0.005*sin((y*2-1)*48+(y*2-1)*64); +per_pixel_4=//dx=dx-0.005*cos((x*2-1)*64+(x*2-1)*48); +per_pixel_5= +per_pixel_6=dx = 0.005*sin((tan(1-rad))*(90+bass+bass_att)+((ang)*18)); +per_pixel_7=dy = -0.005*sin((tan(1-rad))*(90+bass+bass_att)+((-ang)*18)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dark Ritual (Star Of Destiny Denied Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dark Ritual (Star Of Destiny Denied Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dark Ritual (Star Of Destiny Denied Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dark Ritual (Star Of Destiny Denied Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,244 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.994000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.634243 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=100.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.460000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=1.000000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.050000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.200000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.600000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang = 0.1*q7+time*4; +shape_0_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_0_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_0_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_0_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_0_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_0_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_0_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_0_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shape_0_per_frame10=rad =0.2+q7*0.1; +shapecode_1_enabled=1 +shapecode_1_sides=3 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.200000 +shapecode_1_ang=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.600000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=ang =1+(0.1*q7)+ time*4;; +shape_1_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_1_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_1_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_1_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_1_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_1_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_1_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_1_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shape_1_per_frame10=rad = 0.2+0.1*q7; +shapecode_2_enabled=1 +shapecode_2_sides=3 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.200000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=0.600000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=ang = 0.3333+ (0.1*q7)+time*4;; +shape_2_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_2_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_2_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_2_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_2_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_2_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_2_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_2_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shape_2_per_frame10=rad = 0.2+q7*0.1; +per_frame_init_1=oldq8 =0; +per_frame_init_2=q8=0; +per_frame_1=warp=0; +per_frame_2=mv_r = mv_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_3=mv_g = mv_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_4=mv_b = mv_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_5=q8 =oldq8+ 0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_6=oldq8 = q8; +per_frame_7=q1 = 0.62*( 0.60*sin(0.374*q8) + 0.40*sin(0.294*q8) ); +per_frame_8=q2 = 0.62*( 0.60*sin(0.393*q8) + 0.40*sin(0.223*q8) ); +per_frame_9=q3 = 0.62*( 0.60*sin(0.174*-q8) + 0.40*sin(0.364*q8) ); +per_frame_10=q4 = 0.62*( 0.60*sin(0.234*q8) + 0.40*sin(0.271*-q8) ); +per_frame_11=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_12=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_13=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_14=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_15=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_16=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_17=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_18=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_19=lastbeat = if(beat,time,lastbeat); +per_frame_20=ob_a = bnot(beat); +per_frame_21=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_22=q5_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*q5_residual; +per_frame_23=q6_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*q6_residual; +per_frame_24= +per_frame_25= +per_frame_26= +per_frame_27=q5 = 1-abs(4*q5_residual); +per_frame_28=q6 = 1-abs(4*q5_residual); +per_frame_29=wave_a =0; +per_frame_30=zoom = 1000; +per_frame_31=monitor = q8; +per_frame_32=q7= 0.05*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_33=dx = 0.5; +per_frame_34=dy =0.5; +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = q5/(dist+0.4); +per_pixel_6=dx = dx+mult*sin(ang2-1.5); +per_pixel_7=dy = dy+mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = q6/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +per_pixel_15=rot = -0.1*rad*q7; +per_pixel_16=zoom = 1.01 + rad*0.15*q7 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dark Ritual (Star Of Destiny Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dark Ritual (Star Of Destiny Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dark Ritual (Star Of Destiny Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dark Ritual (Star Of Destiny Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,237 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.994000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.634243 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=100.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.460000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=1.000000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.050000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.400000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.600000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang = time*0.4;; +shape_0_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_0_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_0_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_0_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_0_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_0_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_0_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_0_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shapecode_1_enabled=1 +shapecode_1_sides=3 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.400000 +shapecode_1_ang=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.600000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=ang =1- time*0.4;; +shape_1_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_1_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_1_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_1_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_1_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_1_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_1_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_1_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shapecode_2_enabled=1 +shapecode_2_sides=3 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.300000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=0.600000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=ang = 0.5+time*0.4;; +shape_2_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_2_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_2_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_2_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_2_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_2_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_2_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_2_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +per_frame_init_1=oldq8 =0; +per_frame_init_2=q8=0; +per_frame_1=warp=0; +per_frame_2=mv_r = mv_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_3=mv_g = mv_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_4=mv_b = mv_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_5=q8 =oldq8+ 0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_6=oldq8 = q8; +per_frame_7=q1 = 0.62*( 0.60*sin(0.374*q8) + 0.40*sin(0.294*q8) ); +per_frame_8=q2 = 0.62*( 0.60*sin(0.393*q8) + 0.40*sin(0.223*q8) ); +per_frame_9=q3 = 0.62*( 0.60*sin(0.174*-q8) + 0.40*sin(0.364*q8) ); +per_frame_10=q4 = 0.62*( 0.60*sin(0.234*q8) + 0.40*sin(0.271*-q8) ); +per_frame_11=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_12=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_13=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_14=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_15=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_16=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_17=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_18=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_19=lastbeat = if(beat,time,lastbeat); +per_frame_20=ob_a = bnot(beat); +per_frame_21=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_22=q5_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*q5_residual; +per_frame_23=q6_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*q6_residual; +per_frame_24= +per_frame_25= +per_frame_26= +per_frame_27=q5 = 1-abs(4*q5_residual); +per_frame_28=q6 = 1-abs(4*q5_residual); +per_frame_29=wave_a =0; +per_frame_30=zoom = 1000; +per_frame_31=monitor = q8; +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = q5/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = q6/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +per_pixel_15=rot = -0.01*rad*sin(q8); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Decreasing Dreams (Extended Movement Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Decreasing Dreams (Extended Movement Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Decreasing Dreams (Extended Movement Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Decreasing Dreams (Extended Movement Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,242 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.893664 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.995000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=-0.002000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.330038 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = q1; +shape_0_per_frame2=y = 1- q2; +shape_0_per_frame3=r = 0.5 + 0.49*sin(time*0.467); +shape_0_per_frame4=b = 0.5 + 0.49*sin(time*0.568); +shape_0_per_frame5=g = 0.5 + 0.49*sin(time*0.669); +shape_0_per_frame6=r2 = 0.1*(bass+bass_att); +shape_0_per_frame7=b2 = r2; +shape_0_per_frame8=g2 = r2; +shape_0_per_frame9=rad = r2 + 0.2; +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=wave_r = wave_r + 0.200*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.200*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.200*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=warp=0; +per_frame_5=zoom =1; +per_frame_6=rot=0; +per_frame_7=decay =0.985; +per_frame_8=//decay =1; +per_frame_9= +per_frame_10=ib_r = 0.666 - 0.333*sin(time*1.234); +per_frame_11=ib_g = 0.666+0.333*sin(time*2.123); +per_frame_12=ib_b = 0.01+0.1*treb; +per_frame_13= +per_frame_14=movement =movement + 0.5*(((bass+bass_att + 0.075*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_15=movement = if(above(movement,10000), 0, movement); +per_frame_16= +per_frame_17=q1 = 0.5+0.1*sin(movement); +per_frame_18=q2 = 0.5-0.1*cos(0.781*movement); +per_frame_19=q3 = (35+15*sin(time*0.3426)+0.8*bass); +per_frame_20=wave_x = q1; +per_frame_21=wave_y = 1- q2; +per_pixel_1=newx =x- q1; +per_pixel_2=newy =y- q2; +per_pixel_3=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_4=dy=0.007*sin((1.3-newrad)*(1.3-newrad)*(q3)); +per_pixel_5=dx=-0.007*cos((1.3-newrad)*(1.3-newrad)*(q3)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dreamcatcher.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dreamcatcher.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dreamcatcher.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Dreamcatcher.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,91 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.711551 +fWaveScale=0.083110 +fWaveSmoothing=0.540000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.990000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.998000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.700000 +ib_size=0.005000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.210000 +nMotionVectorsX=1.280000 +nMotionVectorsY=5.280000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=dcounter = if( equal(dcounter,0),if(above(bass,1.5),bass,dcounter), if(below(dcounter,0),0,if(above(bass_att,1.35),dcounter+.14,dcounter-.14))); +per_frame_3=tcounter = if( equal(dcounter,0),if(above(treb,1.5),treb*.5,tcounter), if(below(tcounter,0),0,if(above(treb_att,1.35),tcounter+.2,tcounter-.2))); +per_frame_4=q1 = min(dcounter,2); +per_frame_5=q2 = min(tcounter,1.7); +per_frame_6=frametest = (frame)%2; +per_frame_7=wave_r = red + red*sin(time*1.067)+.2*bass*frametest; +per_frame_8=wave_g = green + green*sin(time*.722)+.2*treb*frametest; +per_frame_9=wave_b = blue + blue*sin(time*0.451)+.2*mid*frametest; +per_frame_10=wave_mystery = if(frametest,1,0); +per_frame_11=ib_a = 0.03*(treb_att +treb); +per_frame_12=ib_r = 0.08*(bass_att+bass); +per_frame_13=ib_g = 0.08*(mid+mid_att); +per_frame_14=ib_g =0.3*(mid*bass); +per_pixel_1=q4 = below(x,0.3)+ above(x,0.7); +per_pixel_2=q7 = 15 + int(3*rad); +per_pixel_3=cx = if(q4,(0&(x*q7-0.5))*(1/q7)+0.05,0.5); +per_pixel_4=cy = if(q4,(0&(y*15-0.5))*(1/15)+0.05,0.5); +per_pixel_5=zoom = 1+if(q4,0,0.05*log(rad)); +per_pixel_6=q5 = if(above(x,0.7),1,-1); +per_pixel_7=rot = if(q4,q5*0.05*(sy+bass+bass_att),0); +per_pixel_8=q6 = above(rad,0.2); +per_pixel_9=rot = if(q6,rot,0.125*(q1-q2)); +per_frame_init_1=dcounter = 0; +per_frame_init_2=tcounter = 0; +per_frame_init_3=blue = (rand(30)/30) + 0.1; +per_frame_init_4=green = (rand(30)/30) + 0.1; +per_frame_init_5=red = (rand(30)/30) + 0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Explosive Minds.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Explosive Minds.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Explosive Minds.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Explosive Minds.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=5.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999608 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.011046 +fWaveSmoothing=0.750000 +fWaveParam=-0.420000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.900000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=1.280000 +nMotionVectorsY=1.248000 +mv_dx=-0.060000 +mv_dy=-0.026000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = bass_att*.3; +per_frame_3=wave_g = treb_att*.3; +per_frame_4=wave_b = mid_att*.3; +per_frame_5=ob_r = 0.5+0.5*sin(time*5.12); +per_frame_6=ob_b = 0.5+0.5*sin(time*6.112); +per_frame_7=ob_g = 0.5+0.5*sin(time*7.212); +per_frame_8=q1 = zoom + pow((bass+bass_att),3)*.005-.02; +per_pixel_1=zoom =q1+ rad*sin(ang*25)*.05; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Forgotten Moon.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Forgotten Moon.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Forgotten Moon.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Forgotten Moon.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=8 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.015199 +fWaveSmoothing=0.630000 +fWaveParam=-0.340000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.100000 +wave_y=0.860000 +ob_size=0.005000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=ib_r = 0.5+0.5*sin(time); +per_frame_3=ib_g = 0.5+0.5*sin(time*1.576); +per_frame_4=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_5=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_6=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_7=q8 =oldq8+ 0.0002*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_8=oldq8 = q8; +per_pixel_1=dx = 0.01*sin(100*y+q8/y); +per_pixel_2=dy = 0.01*sin(100*x+q8/x); +per_frame_init_1=q8=0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Fantic Dancing Lights Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Fantic Dancing Lights Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Fantic Dancing Lights Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Fantic Dancing Lights Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,236 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=4.574798 +fWaveSmoothing=0.750000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=9.860800 +fWarpScale=16.217400 +fZoomExponent=1.503744 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.999999 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=1.000000 +ob_a=1.000000 +ib_size=0.040000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=-0.002000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=1.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.150375 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = 0.5 + 0.05*sin(q1*0.456); +shape_0_per_frame2=y = 0.5 + 0.05*sin(q1*0.56); +shape_0_per_frame3=tex_zoom = tex_zoom + 0.5*sin(q1*0.345); +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=q4 = 0.249+0.5*(rand(100)*0.01); +per_frame_init_2=q5 = 0.249+0.5*(rand(100)*0.01); +per_frame_init_3=q6 = 0.249+0.5*(rand(100)*0.01); +per_frame_1=wave_a =0; +per_frame_2=movement =movement + 0.5*(((bass+bass_att + 0.075*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_3=movement = if(above(movement,10000), 0, movement); +per_frame_4=ob_b = q4+0.25*sin(movement*3.816); +per_frame_5=ob_g = q4+0.25*sin(movement*0.744); +per_frame_6=ob_r = q4+0.25*sin(movement*0.707); +per_frame_7=wrap = above(bass+bass_att,3); +per_frame_8=decay=1; +per_frame_9=rot=0; +per_frame_10=zoom =0.98; +per_frame_11=mv_r = 0; +per_frame_12=mv_g = 0; +per_frame_13=mv_b =0; +per_frame_14=mv_dy = 0.03*sin(movement*0.34); +per_frame_15=mv_dx = 0.035*(sin(movement*0.217)+cos(movement*0.413)+sin(movement*0.311)); +per_frame_16=warp=0; +per_frame_17=dx =0.01*sin(movement*5); +per_frame_18=dy =0.0005*(bass+bass_att); +per_pixel_1=myy = y-(0.250025); +per_pixel_2=myx = x-0.5; +per_pixel_3=dx =dx+ 2*(2*myx*myy); +per_pixel_4=dy =dy+ 2*((myy*myy) - (myx*myx)); +per_pixel_5= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Galaxy Swirl Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Galaxy Swirl Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Galaxy Swirl Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Galaxy Swirl Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,236 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=4.574798 +fWaveSmoothing=0.750000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=9.860800 +fWarpScale=16.217400 +fZoomExponent=1.503744 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.999999 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=1.000000 +ob_a=1.000000 +ib_size=0.040000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=-0.002000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.600000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.491382 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=q4 = 0.249+0.5*(rand(100)*0.01); +per_frame_init_2=q5 = 0.249+0.5*(rand(100)*0.01); +per_frame_init_3=q6 = 0.249+0.5*(rand(100)*0.01); +per_frame_1=warp = 0; +per_frame_2=volume = 0.3*(bass+mid+att); +per_frame_3=wave_x = 1-(xpos + 0.5); +per_frame_4=wave_y = ypos + 0.5; +per_frame_5=mv_r = 0.5 + 0.499*(0.60*sin(3.980*time) + 0.40*sin(1.047*time) ); +per_frame_6=mv_g = 0.5+ 0.499*(0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_7=mv_b = 0.5 + 0.499*(0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_8=q1 = (x_pos+0.5); +per_frame_9=q2 = 1- (ypos+0.5); +per_frame_10=wave_a =0; +per_frame_11=warp=0; +per_frame_12=zoom =1; +per_frame_13=movement =movement + 0.5*(((bass+bass_att + 0.075*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_14=movement = if(above(movement,10000), 0, movement); +per_frame_15=rot =-0.04+ 0.01*(sin(movement*0.696)+cos(movement*0.463)+sin(movement*0.365)); +per_frame_16=cx = 0 + 0.1*(sin(movement*0.247)+cos(movement*0.373)+sin(movement*0.187)); +per_frame_17=cy = 0 + 0.1*(sin(movement*0.317)+cos(movement*0.209)+sin(movement*0.109)); +per_frame_18=ob_b = q4+0.25*sin(movement*3.816); +per_frame_19=ob_g = q4+0.25*sin(movement*0.744); +per_frame_20=ob_r = q4+0.25*sin(movement*0.707); +per_frame_21=wrap = below(bass+bass_att,3); +per_frame_22=zoom = 0.99 + 0.0035*(sin(movement*0.217)+cos(movement*0.413)+sin(movement*0.311)); +per_pixel_1=myy = y-(0.250025); +per_pixel_2=myx = x-0.5; +per_pixel_3=dx = 2*(2*myx*myy); +per_pixel_4=dy = 2*((myy*myy) - (myx*myx)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Upspoken Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Upspoken Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Upspoken Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Upspoken Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,263 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.180933 +fWaveSmoothing=0.750000 +fWaveParam=-0.200000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=9.860800 +fWarpScale=16.217400 +fZoomExponent=1.503744 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.999999 +sx=1.000000 +sy=1.000000 +wave_r=0.900000 +wave_g=0.200000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=1.000000 +ob_g=0.100000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.050000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=1.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.537415 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.725085 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=warp = 0; +per_frame_2=volume = 0.3*(bass+mid+att); +per_frame_3=xamptarg = if(equal(frame%15,0),min(0.25*volume*bass_att,0.5),xamptarg); +per_frame_4=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_5=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_6=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_7=xpos = xpos + 0.001*xspeed; +per_frame_8=yamptarg = if(equal(frame%15,0),min(0.15*volume*treb_att,0.5),yamptarg); +per_frame_9=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_10=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_11=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_12=ypos = ypos + 0.001*yspeed; +per_frame_13=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_14=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_15=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_16=peakbass_att = max(bass_att,peakbass_att); +per_frame_17=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_18=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_19=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_20=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_21=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_22=wave_x = xpos + 0.5; +per_frame_23=wave_y = 1-(ypos + 0.5); +per_frame_24=wave_r = 0.5 + 0.499*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_25=wave_g = 0.5 + 0.499*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_26=wave_b = 0.5 + 0.499*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_27=wave_mystery = -0.17 + 0.03*(0.6*sin(0.637*time) + 0.4*sin(0.949*time)); +per_frame_28=mv_r = if(beat, 1, ib_r); +per_frame_29=mv_b = if(beat, wave_b, ib_b); +per_frame_30=//mv_a = if(beat, 0.1, ib_a); +per_frame_31=//ib_a = 0.015; +per_frame_32=q3 = wave_mystery; +per_frame_33=q1 = wave_x; +per_frame_34=q2 = 1-wave_y; +per_frame_35=q2 = ypos+0.5; +per_frame_36=warp=0; +per_frame_37= +per_frame_38=//q2 = 1-(ypos + 0.5); +per_frame_39=//q1 = 0.5; +per_frame_40=//q2=0.5; +per_frame_41=ob_r = 1-wave_g; +per_frame_42=ob_b = 1-wave_r; +per_frame_43=ob_g = 1-wave_b; +per_frame_44= +per_frame_45=monitor = wave_y; +per_frame_46=movement =movement + 0.4*(((bass+bass_att + 0.1*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_47=movement = if(above(movement,10000), 0, movement); +per_frame_48=rot =1*sin(movement); +per_frame_49=cx = wave_x; +per_frame_50=cy = y_pos+0.5; +per_frame_51= +per_frame_52=q8 = movement; +per_pixel_1=myy = x-q1; +per_pixel_2=myx = y-q2+0.1; +per_pixel_3=dx = 3*sin(q8*0.675)*(2*myx*myy); +per_pixel_4=dy = 3*sin(q8*0.675)*((myx*myx) - (myy*myy)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Upspoken Mix)_Phat_Speak_When_Spoken_2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Upspoken Mix)_Phat_Speak_When_Spoken_2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Upspoken Mix)_Phat_Speak_When_Spoken_2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Fractopia (Upspoken Mix)_Phat_Speak_When_Spoken_2.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,420 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001273 +fWaveScale=0.180933 +fWaveSmoothing=0.750000 +fWaveParam=-0.200000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=9.860800 +fWarpScale=16.217400 +fZoomExponent=1.503744 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.999999 +sx=1.000000 +sy=1.000000 +wave_r=0.900000 +wave_g=0.200000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=1.000000 +ob_g=0.100000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.075000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=1.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_frame1=basstime=basstime+(bass*bass); +wave_0_per_frame2=t1=basstime*0.03; +wave_0_per_point1=//plot x,y,z to point on circle +wave_0_per_point2=smp=sample*6.283; +wave_0_per_point3=xp=sin(smp )*0.10; +wave_0_per_point4=yp=cos(smp )*0.10; +wave_0_per_point5=zp=0; +wave_0_per_point6= +wave_0_per_point7= +wave_0_per_point8=//alter shape; +wave_0_per_point9=angy=sin(sample*6.28*4 +t1 )*6.28; +wave_0_per_point10=xq=xp*cos(angy) - zp*sin(angy); +wave_0_per_point11=zq=xp*sin(angy) + zp*cos(angy); +wave_0_per_point12=xp=xq; +wave_0_per_point13=zp=zq; +wave_0_per_point14= +wave_0_per_point15= +wave_0_per_point16=//rotate on y axis; +wave_0_per_point17=angy=t1*0.1; +wave_0_per_point18=xq=xp*cos(angy) - zp*sin(angy); +wave_0_per_point19=zq=xp*sin(angy) + zp*cos(angy); +wave_0_per_point20=xp=xq; +wave_0_per_point21=zp=zq; +wave_0_per_point22= +wave_0_per_point23=//rotate on x axis +wave_0_per_point24=//axs1 = sin(t1*0.15) + 1.6; +wave_0_per_point25=//yq= yp*cos(axs1) - zp*sin(axs1); +wave_0_per_point26=//zq= yp*sin(axs1) + zp*cos(axs1); +wave_0_per_point27=//yp=yq; +wave_0_per_point28=//zp=zq; +wave_0_per_point29= +wave_0_per_point30=//rotate on y axis again +wave_0_per_point31=axs2 = sin(t1*0.1)*3.3; +wave_0_per_point32=xq=xp*cos(axs2) - zp*sin(axs2); +wave_0_per_point33=zq=xp*sin(axs2) + zp*cos(axs2); +wave_0_per_point34=xp=xq; +wave_0_per_point35=zp=zq; +wave_0_per_point36= +wave_0_per_point37=//stretch y axis to compensate for aspect ratio +wave_0_per_point38=yp=yp*1.2; +wave_0_per_point39= +wave_0_per_point40=//push forward into viewpace +wave_0_per_point41=zp=zp+2.1; +wave_0_per_point42= +wave_0_per_point43=//project x,y,z into screenspace +wave_0_per_point44=xs=xp/zp; +wave_0_per_point45=ys=yp/zp; +wave_0_per_point46= +wave_0_per_point47=//center 0,0 in middle of screen +wave_0_per_point48=//x=xs+0.5+q4; +wave_0_per_point49=//y=ys+0.5+q5; +wave_0_per_point50=x=xs+q4; +wave_0_per_point51=y=ys+q5; +wave_0_per_point52= +wave_0_per_point53=//r=1-q1; +wave_0_per_point54=//g=1-q2; +wave_0_per_point55=//b=1-q3; +wave_0_per_point56= +wave_0_per_point57=n2=abs((sample*6.283)-3.1415); +wave_0_per_point58= +wave_0_per_point59=r=sin(n2+time)*0.5+0.5; +wave_0_per_point60=g=sin(n2+2.1+time)*0.5+0.5; +wave_0_per_point61=b=sin(n2+4.2+time)*0.5+0.5; +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=0.000000 +wavecode_1_g=0.000000 +wavecode_1_b=0.000000 +wavecode_1_a=1.000000 +wave_1_per_frame1=basstime=basstime+(bass*bass); +wave_1_per_frame2=t1=basstime*0.06; +wave_1_per_point1=//plot x,y,z to point on circle +wave_1_per_point2=smp=sample*6.283; +wave_1_per_point3=xp=sin(smp )*0.1; +wave_1_per_point4=yp=cos(smp )*0.1; +wave_1_per_point5=zp=0; +wave_1_per_point6= +wave_1_per_point7= +wave_1_per_point8=//alter shape; +wave_1_per_point9=angy=sin(sample*6.28*4 +t1 )*6.28; +wave_1_per_point10=xq=xp*cos(angy) - zp*sin(angy); +wave_1_per_point11=zq=xp*sin(angy) + zp*cos(angy); +wave_1_per_point12=xp=xq; +wave_1_per_point13=zp=zq; +wave_1_per_point14= +wave_1_per_point15= +wave_1_per_point16=//rotate on y axis; +wave_1_per_point17=angy=t1*0.1; +wave_1_per_point18=xq=xp*cos(angy) - zp*sin(angy); +wave_1_per_point19=zq=xp*sin(angy) + zp*cos(angy); +wave_1_per_point20=xp=xq; +wave_1_per_point21=zp=zq; +wave_1_per_point22= +wave_1_per_point23=//rotate on x axis +wave_1_per_point24=axs1 = sin(t1*0.15) + 1.6; +wave_1_per_point25=yq= yp*cos(axs1) - zp*sin(axs1); +wave_1_per_point26=zq= yp*sin(axs1) + zp*cos(axs1); +wave_1_per_point27=yp=yq; +wave_1_per_point28=zp=zq; +wave_1_per_point29= +wave_1_per_point30=//rotate on y axis again +wave_1_per_point31=axs2 = sin(t1*0.1)*3.3; +wave_1_per_point32=xq=xp*cos(axs2) - zp*sin(axs2); +wave_1_per_point33=zq=xp*sin(axs2) + zp*cos(axs2); +wave_1_per_point34=xp=xq; +wave_1_per_point35=zp=zq; +wave_1_per_point36= +wave_1_per_point37=//stretch y axis to compensate for aspect ratio +wave_1_per_point38=yp=yp*1.2; +wave_1_per_point39= +wave_1_per_point40=//push forward into viewpace +wave_1_per_point41=zp=zp+2.1; +wave_1_per_point42= +wave_1_per_point43=//project x,y,z into screenspace +wave_1_per_point44=xs=xp/zp; +wave_1_per_point45=ys=yp/zp; +wave_1_per_point46= +wave_1_per_point47=//center 0,0 in middle of screen +wave_1_per_point48=//x=xs+0.5+q4; +wave_1_per_point49=//y=ys+0.5+q5; +wave_1_per_point50=x=xs+q4; +wave_1_per_point51=y=ys+q5; +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=xs=sin(sample*6.28); +wave_2_per_point2=ys=cos(sample*6.28); +wave_2_per_point3=xs=xs*0.7 + 0.5; +wave_2_per_point4=ys=ys*0.7 + 0.5; +wave_2_per_point5=xs=min(xs,0.958); +wave_2_per_point6=xs=max(xs,0.042); +wave_2_per_point7=ys=min(ys,0.988); +wave_2_per_point8=ys=max(ys,0.012); +wave_2_per_point9=x=xs-0.02;y=ys; +wave_2_per_point10= +wave_2_per_point11=n2=abs((sample*6.283)-3.1415); +wave_2_per_point12= +wave_2_per_point13=r=sin(n2+time)*0.5+0.5; +wave_2_per_point14=g=sin(n2+2.1+time)*0.5+0.5; +wave_2_per_point15=b=sin(n2+4.2+time)*0.5+0.5; +wavecode_3_enabled=1 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +wave_3_per_point1=xs=sin(sample*6.28); +wave_3_per_point2=ys=cos(sample*6.28); +wave_3_per_point3=xs=xs*0.7 + 0.5; +wave_3_per_point4=ys=ys*0.7 + 0.5; +wave_3_per_point5=xs=min(xs,0.958); +wave_3_per_point6=xs=max(xs,0.042); +wave_3_per_point7=ys=min(ys,0.988); +wave_3_per_point8=ys=max(ys,0.012); +wave_3_per_point9=x=xs;y=ys; +wave_3_per_point10= +wave_3_per_point11=n2=abs((sample*6.283)-3.1415); +wave_3_per_point12= +wave_3_per_point13=r=sin(n2+time)*0.5+0.5; +wave_3_per_point14=g=sin(n2+2.1+time)*0.5+0.5; +wave_3_per_point15=b=sin(n2+4.2+time)*0.5+0.5; +shapecode_0_enabled=1 +shapecode_0_sides=6 +shapecode_0_additive=1 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.247309 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=6.283185 +shapecode_0_tex_zoom=33.803761 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.010000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=0.500000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x=xs+q4; +shape_0_per_frame2=y=ys+q5; +shape_0_per_frame3=tex_ang=sin(time)*6.28; +shape_0_per_frame4=//rad=.166+(treb/100); +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=1.756120 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=0.567128 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=0.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shape_1_per_frame1=tex_ang=0.001 +shapecode_2_enabled=1 +shapecode_2_sides=6 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.153398 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=0.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=0.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shape_2_per_frame1=x=xs+q4; +shape_2_per_frame2=y=ys+q5; +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=warp = 0; +per_frame_2=volume = 0.3*(bass+mid+att); +per_frame_3=xamptarg = if(equal(frame%15,0),min(0.25*volume*bass_att,0.5),xamptarg); +per_frame_4=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_5=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_6=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_7=xpos = xpos + 0.001*xspeed; +per_frame_8=yamptarg = if(equal(frame%15,0),min(0.15*volume*treb_att,0.5),yamptarg); +per_frame_9=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_10=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_11=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_12=ypos = ypos + 0.001*yspeed; +per_frame_13=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_14=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_15=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_16=peakbass_att = max(bass_att,peakbass_att); +per_frame_17=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_18=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_19=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_20=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_21=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_22=wave_x = xpos + 0.5; +per_frame_23=wave_y = 1-(ypos + 0.5); +per_frame_24=//wave_r = 0.5 + 0.499*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_25=//wave_g = 0.5 + 0.499*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_26=//wave_b = 0.5 + 0.499*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_27=wave_mystery = -0.17 + 0.03*(0.6*sin(0.637*time) + 0.4*sin(0.949*time)); +per_frame_28=mv_r = if(beat, 1, ib_r); +per_frame_29=mv_b = if(beat, wave_b, ib_b); +per_frame_30=//mv_a = if(beat, 0.1, ib_a); +per_frame_31=//ib_a = 0.015; +per_frame_32=q3 = wave_mystery; +per_frame_33=q1 = wave_x; +per_frame_34=q2 = 1-wave_y; +per_frame_35=q2 = ypos+0.5; +per_frame_36=warp=0; +per_frame_37=q4=xpos +0.5; +per_frame_38=q5=1-(ypos + 0.5); +per_frame_39= +per_frame_40=wave_a=0; +per_frame_41=//q2 = 1-(ypos + 0.5); +per_frame_42=//q1 = 0.5; +per_frame_43=//q2=0.5; +per_frame_44=ob_r = 1-wave_g; +per_frame_45=ob_b = 1-wave_r; +per_frame_46=ob_g = 1-wave_b; +per_frame_47= +per_frame_48=monitor = wave_y; +per_frame_49=movement =movement + 0.4*(((bass+bass_att + 0.1*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_50=movement = if(above(movement,10000), 0, movement); +per_frame_51=rot =1*sin(movement); +per_frame_52=cx = wave_x; +per_frame_53=cy = y_pos+0.5; +per_frame_54= +per_frame_55=q8 = movement; +per_frame_56=wrap=above(sin(time*200),0); +per_pixel_1=myy = x-q1; +per_pixel_2=myx = y-q2+0.1; +per_pixel_3=dx = 3*sin(q8*0.675)*(2*myx*myy); +per_pixel_4=dy = 3*sin(q8*0.675)*((myx*myx) - (myy*myy)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Frozen Rapture .milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Frozen Rapture .milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Frozen Rapture .milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Frozen Rapture .milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,276 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.447717 +fWaveSmoothing=0.600000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.995000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=-0.002000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.400000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.330038 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = q1; +shape_0_per_frame2=y = 1- q2; +shape_0_per_frame3=r = 0.5 + 0.49*sin(time*1.467); +shape_0_per_frame4=b = 0.5 + 0.49*sin(time*0.768); +shape_0_per_frame5=g = 0.5 + 0.49*sin(time*0.559); +shape_0_per_frame6=r2 = 0.1*(bass+bass_att); +shape_0_per_frame7=b2 = r2; +shape_0_per_frame8=g2 = r2; +shape_0_per_frame9=rad = r2 + 0.2; +shape_0_per_frame10=ang = time*0.35; +shapecode_1_enabled=1 +shapecode_1_sides=100 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.330038 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=r = 0.5 + 0.49*sin(time*0.467); +shape_1_per_frame2=b = 0.5 + 0.49*sin(time*0.568); +shape_1_per_frame3=g = 0.5 + 0.49*sin(time*0.669); +shape_1_per_frame4=r2 = 0.1*(bass+bass_att); +shape_1_per_frame5=b2 = r2; +shape_1_per_frame6=g2 = r2; +shape_1_per_frame7=rad = r2; +shape_1_per_frame8=x = q1+0.15*sin(time*0.85); +shape_1_per_frame9=y = 1-q2-0.2*cos(time*0.85); +shapecode_2_enabled=1 +shapecode_2_sides=100 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.330038 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=r = 0.5 + 0.49*sin(time*0.467); +shape_2_per_frame2=b = 0.5 + 0.49*sin(time*0.568); +shape_2_per_frame3=g = 0.5 + 0.49*sin(time*0.669); +shape_2_per_frame4=r2 = 0.1*(bass+bass_att); +shape_2_per_frame5=b2 = r2; +shape_2_per_frame6=g2 = r2; +shape_2_per_frame7=rad = r2; +shape_2_per_frame8=x = q1+0.15*sin(time*0.85+2.07); +shape_2_per_frame9=y = 1-q2-0.2*cos(time*0.85+2.07); +shapecode_3_enabled=1 +shapecode_3_sides=100 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.330038 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=x = q1; +shape_3_per_frame2=y = 1- q2; +shape_3_per_frame3=r = 0.5 + 0.49*sin(time*0.467); +shape_3_per_frame4=b = 0.5 + 0.49*sin(time*0.568); +shape_3_per_frame5=g = 0.5 + 0.49*sin(time*0.669); +shape_3_per_frame6=r2 = 0.1*(bass+bass_att); +shape_3_per_frame7=b2 = r2; +shape_3_per_frame8=g2 = r2; +shape_3_per_frame9=rad = r2; +shape_3_per_frame10=x = q1+0.15*sin(time*0.85+4.14); +shape_3_per_frame11=y = 1-q2-0.2*cos(time*0.85+4.14); +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.480*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.370*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=warp=0; +per_frame_5=zoom =1; +per_frame_6=rot=0; +per_frame_7=decay =1; +per_frame_8=ib_r = 0.16 + 0.15*sin(time*0.783); +per_frame_9=ib_g = 0.16 + 0.15*sin(time*0.895); +per_frame_10=ib_b = 0.75 +0.24*sin(time*1.134); +per_frame_11=ib_size = 0.005*above(bass+bass_att,2.8); +per_frame_12=ib_size =0; +per_frame_13=mv_r = ib_r; +per_frame_14=mv_b = ib_b; +per_frame_15=mv_g = ib_g; +per_frame_16= +per_frame_17=movement =movement + 0.5*(((bass+bass_att + 0.075*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_18=movement = if(above(movement,10000), 0, movement); +per_frame_19= +per_frame_20=q1 = 0.5+0.2*sin(movement); +per_frame_21=q2 = 0.5-0.2*cos(0.781*movement); +per_frame_22=q3 = movement; +per_frame_23=wave_x = q1; +per_frame_24=wave_y = 1-q2; +per_frame_25= +per_pixel_1=newx =x- q1; +per_pixel_2=newy =y- q2; +per_pixel_3=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_4=effect = sqrt(2)-newrad; +per_pixel_5=dy=0.01*cos(pow((effect),3)*8); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Future Speakers.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Future Speakers.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Future Speakers.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Future Speakers.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,280 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.447717 +fWaveSmoothing=0.600000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.995000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=-0.002000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.400000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.330038 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = q1; +shape_0_per_frame2=y = 1- q2; +shape_0_per_frame3=r = 0.5 + 0.49*sin(time*1.467); +shape_0_per_frame4=b = 0.5 + 0.49*sin(time*0.768); +shape_0_per_frame5=g = 0.5 + 0.49*sin(time*0.559); +shape_0_per_frame6=r2 = 0.1*(bass+bass_att); +shape_0_per_frame7=b2 = r2; +shape_0_per_frame8=g2 = r2; +shape_0_per_frame9=rad = r2 + 0.2; +shapecode_1_enabled=1 +shapecode_1_sides=100 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.330038 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=r = 0.5 + 0.49*sin(time*0.467); +shape_1_per_frame2=b = 0.5 + 0.49*sin(time*0.568); +shape_1_per_frame3=g = 0.5 + 0.49*sin(time*0.669); +shape_1_per_frame4=r2 = 0.1*(bass+bass_att); +shape_1_per_frame5=b2 = r2; +shape_1_per_frame6=g2 = r2; +shape_1_per_frame7=rad = r2 + 0.2; +shape_1_per_frame8=x = q1+0.3*sin(time*0.85); +shape_1_per_frame9=y = 1-q2-0.4*cos(time*0.85); +shapecode_2_enabled=1 +shapecode_2_sides=100 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.330038 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=r = 0.5 + 0.49*sin(time*0.467); +shape_2_per_frame2=b = 0.5 + 0.49*sin(time*0.568); +shape_2_per_frame3=g = 0.5 + 0.49*sin(time*0.669); +shape_2_per_frame4=r2 = 0.1*(bass+bass_att); +shape_2_per_frame5=b2 = r2; +shape_2_per_frame6=g2 = r2; +shape_2_per_frame7=rad = r2 + 0.2; +shape_2_per_frame8=x = q1+0.3*sin(time*0.85+2.07); +shape_2_per_frame9=y = 1-q2-0.4*cos(time*0.85+2.07); +shapecode_3_enabled=1 +shapecode_3_sides=100 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.330038 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=x = q1; +shape_3_per_frame2=y = 1- q2; +shape_3_per_frame3=r = 0.5 + 0.49*sin(time*0.467); +shape_3_per_frame4=b = 0.5 + 0.49*sin(time*0.568); +shape_3_per_frame5=g = 0.5 + 0.49*sin(time*0.669); +shape_3_per_frame6=r2 = 0.1*(bass+bass_att); +shape_3_per_frame7=b2 = r2; +shape_3_per_frame8=g2 = r2; +shape_3_per_frame9=rad = r2 + 0.2; +shape_3_per_frame10=x = q1+0.3*sin(time*0.85+4.14); +shape_3_per_frame11=y = 1-q2-0.4*cos(time*0.85+4.14); +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.480*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.370*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=warp=0; +per_frame_5=zoom =1; +per_frame_6=rot=0; +per_frame_7=decay =1; +per_frame_8=ib_r = 0.16 + 0.15*sin(time*0.783); +per_frame_9=ib_g = 0.16 + 0.15*sin(time*0.895); +per_frame_10=ib_b = 0.75 +0.24*sin(time*1.134); +per_frame_11=ib_size = 0.005*above(bass+bass_att,2.8); +per_frame_12=ib_size =0; +per_frame_13=mv_r = ib_r; +per_frame_14=mv_b = ib_b; +per_frame_15=mv_g = ib_g; +per_frame_16= +per_frame_17=movement =movement + 0.5*(((bass+bass_att + 0.075*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_18=movement = if(above(movement,10000), 0, movement); +per_frame_19= +per_frame_20=q1 = 0.5+0.2*sin(movement); +per_frame_21=q2 = 0.5-0.2*cos(0.781*movement); +per_frame_22=q3 = movement; +per_frame_23=wave_x = q1; +per_frame_24=wave_y = 1-q2; +per_frame_25= +per_pixel_1=newx =x- q1; +per_pixel_2=newy =y- q2; +per_pixel_3=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_4=newang = atan2(newx,newy); +per_pixel_5=//effect = ((1-newrad)*(1-newrad))*(0.0*((0.9+0.2*sin(q3*0.23))*y)*((0.9+0.2*sin(q3*0.197))*x)); +per_pixel_6=effect = sqrt(2)-newrad; +per_pixel_7=effect2 = newang; +per_pixel_8=//effect = sqrt(2)-rad; +per_pixel_9=zoom=0.9-(0.1*bass)*cos(pow((effect),3)*8*(bass_att+1)); +per_pixel_10= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Dark Subconscious.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Dark Subconscious.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Dark Subconscious.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Dark Subconscious.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,76 @@ +[preset00] +fRating=2.5 +fGammaAdj=2 +fDecay=1 +fVideoEchoZoom=1 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1 +fWaveScale=0.5 +fWaveSmoothing=0 +fWaveParam=0 +fModWaveAlphaStart=1.5 +fModWaveAlphaEnd=1 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1 +fShader=0 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0 +sx=1 +sy=1 +wave_r=0.23 +wave_g=0.2 +wave_b=0.2 +wave_x=0.5 +wave_y=0.5 +ob_size=0.005 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=0.2 +ib_size=0 +ib_r=0 +ib_g=0 +ib_b=0.3 +ib_a=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +mv_dx=0 +mv_dy=0 +mv_l=5 +mv_r=1 +mv_g=0 +mv_b=0 +mv_a=0 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.825*time) + 0.40*sin(0.915*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.025*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.810*time) + 0.40*sin(0.950*time) ); +per_frame_4=wave_x = 0.5-cos(time+dx_residual)/3.5; +per_frame_5=wave_y = 0.5-cos(time+dy_residual)/2.5; +per_frame_6=cx = cx + 0.225*( 0.60*sin(0.350*time) + 0.40*sin(0.350*time) ); +per_frame_7=cy = cy + 0.225*( 0.60*sin(0.350*time) + 0.40*sin(0.350*time) ); +per_frame_8=dx = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_9=dy = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_10=dx_residual=max(bass, bass_att)-1; +per_frame_11=dy_residual=min(bass, bass_att)-1; +per_frame_12=dx = if(above(bass_att+bass,2.8),0.25,dx); +per_pixel_1=rot = 0.03*sin(0.84*time)-0.013*cos(0.784*time)+0.02*sin(1-rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Deadly Flower.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Deadly Flower.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Deadly Flower.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Deadly Flower.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=1 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000158 +fWaveScale=0.669541 +fWaveSmoothing=0.630000 +fWaveParam=-1.000000 +fModWaveAlphaStart=2.000000 +fModWaveAlphaEnd=2.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010100 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.000000 +wave_y=0.000000 +ob_size=0.015000 +ob_r=0.230000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.650000 +ib_a=0.400000 +nMotionVectorsX=12.256001 +nMotionVectorsY=9.288002 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp =0; +per_frame_2=wave_x=0.4+0.1*mid; +per_frame_3=wave_y=0.4+0.1*bass; +per_frame_4=wave_r=bass; +per_frame_5=wave_g=mid; +per_frame_6=wave_b=treb; +per_frame_7=madbass=max(max(bass,bass_att)-1.3,0); +per_frame_8=madtreb=max(max(treb,treb_att)-1.3,0); +per_frame_9=zoom = zoom -1.1* madbass+0.00; +per_frame_10=ib_a = if(above(bass,1.2),0.7,0); +per_frame_11=ob_r = if(above(treb,1.2),0.3,0.1); +per_frame_12=mv_x =48; +per_frame_13=mv_y= 3.25; +per_frame_14=mv_r = 1-bass_att; +per_frame_15=mv_b = 1-treb_att; +per_frame_16=mv_g = 1-mid_att; +per_frame_17=bass_effect=max(max(bass,bass_att)-0.8,0); +per_frame_18=q1 = if(above(bass_effect,0),0.45+bass_effect,0); +per_pixel_1=rot=if(below(rad,q1),0.05*bass_factor+sin(time*.3+ang*8+(sqrt(2)-rad*7.5))*.063,rot); +per_pixel_2=zoom=if(below(rad,q1),-0.05*bass_factor+1-.23*(1-rad)*sin(time*.3+ang*8+rad*7.5),zoom); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Mosaic Waves.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Mosaic Waves.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Mosaic Waves.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Mosaic Waves.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,76 @@ +[preset00] +fRating=2.500000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.500000 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.230000 +wave_g=0.200000 +wave_b=0.200000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.200000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.300000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.825*time) + 0.40*sin(0.915*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.025*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.810*time) + 0.40*sin(0.950*time) ); +per_frame_4=wave_x = 0.5-cos(time+dx_residual)/3.5; +per_frame_5=wave_y = 0.5-cos(time+dy_residual)/2.5; +per_frame_6=cx = cx + 0.225*( 0.60*sin(0.350*time) + 0.40*sin(0.350*time) ); +per_frame_7=cy = cy + 0.225*( 0.60*sin(0.350*time) + 0.40*sin(0.350*time) ); +per_frame_8=dx = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_9=dy = 0.005 + 0.002*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_10=dx_residual=max(bass, bass_att)-1; +per_frame_11=dy_residual=min(bass, bass_att)-1; +per_frame_12=dx = if(above(bass_att+bass,2.8),5*dx,dx); +per_pixel_1=rot = 0.03*sin(0.84*time)-0.013*cos(0.784*time)+0.02*sin(1-rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Paranormal Static.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Paranormal Static.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Paranormal Static.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Paranormal Static.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.490000 +fDecay=0.965000 +fVideoEchoZoom=0.996600 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.002776 +fWaveScale=1.089980 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=0.997374 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999500 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.001829 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.030000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.005000 +ib_r=0.400000 +ib_g=0.400000 +ib_b=0.400000 +ib_a=1.000000 +nMotionVectorsX=9.599999 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.050000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=wave_x = 0.5 + 0.2*(sin(time*0.678) + sin(time*0.987)); +per_frame_2=wave_y = 0.5 - 0.2*(sin(time*0.876) + sin(time*0.789)); +per_frame_3=decay = decay - 0.05*equal(frame%16,1); +per_frame_4=wave_r = 0.8+ 0.2*sin(time*1.24); +per_frame_5=wave_g = 0.3+0.1*sin(time*0.54); +per_frame_6=wave_b = 0.25+0.1*sin(time*0.677); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_8=cx = cx + bass_thresh; +per_frame_9=sx = sx - bass_thresh*0.2; +per_frame_10=cy = cy + wave_y; +per_frame_11=ib_r= wave_r + 0.350*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_12=ib_g= wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_13=ib_b= wave_b + 0.350*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_14=warp =0; +per_frame_15=dx = 0.02*bass; +per_pixel_1=zoom=zoom + 0.005*tan(ang-ang); +per_pixel_2=cx = (0&(x*20-0.5))*0.05+0.05; +per_pixel_3=cy = (0&(y*20-0.5))*0.05+0.05; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Stranger Minds (Astral Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Stranger Minds (Astral Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Stranger Minds (Astral Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Stranger Minds (Astral Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=3.500000 +fGammaAdj=1.000000 +fDecay=0.999000 +fVideoEchoZoom=0.999600 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.005730 +fWaveScale=0.023445 +fWaveSmoothing=0.000000 +fWaveParam=-0.480000 +fModWaveAlphaStart=1.489999 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999500 +rot=0.200000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.510000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.500000 +ib_g=0.400000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_l=0.055000 +mv_r=0.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.825*time) + 0.40*sin(0.915*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.025*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.810*time) + 0.40*sin(0.950*time) ); +per_frame_4=mv_r= wave_r + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(0.750*time) ); +per_frame_5=mv_g= wave_g + 0.350*( 0.60*sin(0.825*time) + 0.40*sin(0.950*time) ); +per_frame_6=mv_b= wave_b + 0.350*( 0.60*sin(0.775*time) + 0.40*sin(1.025*time) ); +per_frame_7=ib_r=1-min(bass*0.5,1); +per_frame_8=ib_b=1-min(treb*0.5,1); +per_frame_9=ib_g=1-min(mid*0.5,1); +per_frame_10=ob_r=1-min(mid_att*0.5,1); +per_frame_11=ob_b=1-min(bass_att*0.5,1); +per_frame_12=ob_g=1-min(treb_att*0.5,1); +per_frame_13=bass_effect = min(max(max(bass,bass_effect)-1.3,0),0.5); +per_frame_14=ib_size = ib_size+ bass_effect; +per_frame_15=wave_mystery = wave_mystery + 0.4*bass_effect; +per_frame_16=mv_l = mv_l + 0.5*bass_effect; +per_frame_17=q1 = bass_effect; +per_pixel_1=zoom =0.9- sin(time + ang*2)*0.02; +per_pixel_2=zoom=zoom+(q1)*0.1; +per_pixel_3=rot = rot + 0.1*q1*(3.14-ang); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Stranger Minds.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Stranger Minds.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Stranger Minds.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Fvese - Stranger Minds.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.500000 +fGammaAdj=1.000000 +fDecay=0.999000 +fVideoEchoZoom=0.999600 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.005730 +fWaveScale=0.535239 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.489999 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999500 +rot=0.200000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=3.200000 +nMotionVectorsY=1.440000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.825*time) + 0.40*sin(0.915*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(1.025*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.810*time) + 0.40*sin(0.950*time) ); +per_frame_4=mv_r= wave_r + 0.350*( 0.60*sin(0.900*time) + 0.40*sin(0.750*time) ); +per_frame_5=mv_g= wave_g + 0.350*( 0.60*sin(0.825*time) + 0.40*sin(0.950*time) ); +per_frame_6=mv_b= wave_b + 0.350*( 0.60*sin(0.775*time) + 0.40*sin(1.025*time) ); +per_frame_7=ib_r=min(bass*0.5,1); +per_frame_8=ib_b=min(treb*0.5,1); +per_frame_9=ib_g=min(mid*0.5,1); +per_frame_10=ob_r=1-min(mid_att*0.5,1); +per_frame_11=ob_b=1-min(bass_att*0.5,1); +per_frame_12=ob_g=1-min(treb_att*0.5,1); +per_pixel_1=zoom =0.9- sin(time + ang*2)*0.02; +per_pixel_2=zoom=zoom+(bass_att-1.0)*0.115; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Approach (Vectrip Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Approach (Vectrip Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Approach (Vectrip Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Approach (Vectrip Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,95 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=11.940000 +fWaveScale=1.372000 +fWaveSmoothing=0.700000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.001000 +fShader=0.000000 +zoom=1.007000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.300000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=0.600000 +mv_g=0.500000 +mv_b=0.450000 +mv_a=1.000000 +per_frame_1=wave_x = wave_x + 0.150*( 0.60*sin(2.121*time) + 0.40*sin(1.621*time) ); +per_frame_2=wave_y = wave_y + 0.150*( 0.60*sin(1.742*time) + 0.40*sin(2.322*time) ); +per_frame_3=wave_r = wave_r + 0.200*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_4=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_5=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_6=rot = rot + 0.002*sin(time+0.073); +per_frame_7=decay = decay - 0.03*equal(frame%30,0); +per_frame_8=vol = (bass+mid+att)/6; +per_frame_9=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_10=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_11=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_12=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_13=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_14=xpos = xpos + 0.001*xspeed; +per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_18=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_19=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_20=ypos = ypos + 0.001*yspeed; +per_frame_21=mv_x_speed = 16; +per_frame_22=mv_y_speed = 12; +per_frame_23=mv_x_range = 0.499; +per_frame_24=mv_y_range = 0.499; +per_frame_25=mv_x_amount = 2; +per_frame_26=mv_y_amount = 3+1.5*sin(sin(time*0.245)+cos(time*0.45)); +per_frame_27=mv_x = mv_x_amount +mv_x_range + mv_x_range*sin(mv_x_speed*ypos+(sin(time*0.964)-0.5*cos(time*0.256))); +per_frame_28=mv_y = mv_y_amount + mv_y_range+ mv_y_range*sin(mv_y_speed*xpos-(cos(time*1.345)-0.5*cos(time*0.331))); +per_frame_29=mv_b = mv_b - 0.3*sin(time*5.211); +per_frame_30=mv_r = mv_r + 0.25*cos(time*1.91); +per_frame_31=mv_g = mv_g + 0.25*cos(time*1.861); +per_frame_32=mv_l = 30*sin(10*ypos)+ 40*cos(10*xpos); +per_frame_33=wave_r = wave_r + 0.5*sin(3.758); +per_frame_34=wave_b = wave_b + 0.4*cos(time*2.023); +per_frame_35=wave_g = wave_g + 0.4*sin(time*2.01); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Bipolar 2 (Vectrip Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Bipolar 2 (Vectrip Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Bipolar 2 (Vectrip Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Bipolar 2 (Vectrip Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,92 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.900000 +fWaveScale=0.408000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=-0.010000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.900000 +wave_g=0.450000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=0.400000 +mv_g=0.700000 +mv_b=0.700000 +mv_a=1.000000 +per_frame_1=wave_r = wave_r + 0.100*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.050*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=decay = decay - 0.01*equal(frame%50,0); +per_frame_4=vol = (bass+mid+att)/6; +per_frame_5=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_6=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_7=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_8=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_9=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_10=xpos = xpos + 0.001*xspeed; +per_frame_11=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_12=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_13=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_14=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_15=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_16=ypos = ypos + 0.001*yspeed; +per_frame_17=mv_x_speed = 16; +per_frame_18=mv_y_speed = 12; +per_frame_19=mv_x_range = 0.01; +per_frame_20=mv_y_range = 0.01; +per_frame_21=mv_x_amount = 1.25; +per_frame_22=mv_y_amount = 1.25; +per_frame_23=mv_x = mv_x_amount +mv_x_range + mv_x_range*sin(mv_x_speed*ypos+(sin(time*0.964)-0.5*cos(time*0.256))); +per_frame_24=mv_y = mv_y_amount + mv_y_range+ mv_y_range*sin(mv_y_speed*xpos-(cos(time*1.345)-0.5*cos(time*0.331))); +per_frame_25=mv_b = mv_b - 0.3*sin(time*5.211); +per_frame_26=mv_r = mv_r + 0.25*cos(time*1.91); +per_frame_27=mv_g = mv_g + 0.25*cos(time*1.861); +per_frame_28=mv_l = 100 + 100*min(bass*0.5 + bass_att*0.5,2); +per_pixel_1=zoom=0.9615+rad*0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Broken Destiny Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Broken Destiny Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Broken Destiny Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Broken Destiny Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,90 @@ +[preset00] +fRating=2 +fGammaAdj=2.994 +fDecay=0.981 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=1 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1 +fWaveScale=0.634243 +fWaveSmoothing=0.1 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1.331 +fZoomExponent=1 +fShader=0 +zoom=1.00496 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.000156 +sx=0.999666 +sy=0.9999 +wave_r=0.55 +wave_g=0.55 +wave_b=0.55 +wave_x=0.5 +wave_y=0.36 +ob_size=0.01 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=0 +ib_size=0.01 +ib_r=0.25 +ib_g=0.25 +ib_b=0.25 +ib_a=0 +nMotionVectorsX=64 +nMotionVectorsY=2.016 +mv_dx=0 +mv_dy=-0.1 +mv_l=5 +mv_r=0 +mv_g=0 +mv_b=0.7 +mv_a=0 +per_frame_1=wave_r = wave_r + 0.40*( 0.60*sin(1.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.40*( 0.60*sin(1.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.40*( 0.60*sin(1.714*time) + 0.40*sin(1.011*time) ); +per_frame_4=q8 = oldq8+if(above(bass+bass_att,2.8),q8+0.005*pow((bass+bass_att),5),0); +per_frame_5=oldq8 = q8; +per_frame_6=q7 =0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_7=q1 = 0.62*( 0.60*sin(0.374*q8) + 0.40*sin(0.294*q8) ); +per_frame_8=q2 = 0.62*( 0.60*sin(0.393*q8) + 0.40*sin(0.223*q8) ); +per_frame_9=q3 = 0.62*( 0.60*sin(0.174*-q8) + 0.40*sin(0.364*q8) ); +per_frame_10=q4 = 0.62*( 0.60*sin(0.234*q8) + 0.40*sin(0.271*-q8) ); +per_frame_11=echo_zoom = 1+ q7; +per_frame_12=zoom = 1+q7; +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.008*sin(q8)/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +per_pixel_15=rot = -0.01*rad*sin(q8); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Mysticial Awakening Mi.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Mysticial Awakening Mi.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Mysticial Awakening Mi.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Mysticial Awakening Mi.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,91 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.000154 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.010000 +fWaveSmoothing=0.100000 +fWaveParam=-0.472000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.972366 +fShader=0.000000 +zoom=1.004960 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.510000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=q8 = oldq8+min(if(above(bass+bass_att,2.8),q8+0.025*pow((bass+bass_att-1.5),5),0),1); +per_frame_5=oldq8 = q8; +per_frame_6=q8 = q8 + 0.1*time; +per_frame_7=q1 = 0.62*( 0.60*sin(0.374*q8) + 0.40*sin(0.294*q8) ); +per_frame_8=q2 = 0.62*( 0.60*sin(0.393*q8) + 0.40*sin(0.223*q8) ); +per_frame_9=q3 = 0.62*( 0.60*sin(0.174*-q8) + 0.40*sin(0.364*q8) ); +per_frame_10=q4 = 0.62*( 0.60*sin(0.234*q8) + 0.40*sin(0.271*-q8) ); +per_frame_11=mv_x = 1.25; +per_frame_12=mv_y = 1.25; +per_frame_13=mv_a =1; +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.008*sin(q8)/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +per_pixel_15=rot = -0.01*rad*sin(q8); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Poltergiest Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Poltergiest Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Poltergiest Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Poltergiest Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,107 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.994000 +fDecay=0.900000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=1 +bInvert=1 +fWaveAlpha=1.000000 +fWaveScale=1.553027 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004960 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.150000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=q8 = oldq8+if(above(bass+bass_att,2.8),q8+0.005*pow((bass+bass_att),5),0); +per_frame_5=oldq8 = q8; +per_frame_6=q1 = 0.62*( 0.60*sin(0.374*q8) + 0.40*sin(0.294*q8) ); +per_frame_7=q2 = 0.62*( 0.60*sin(0.393*q8) + 0.40*sin(0.223*q8) ); +per_frame_8=q3 = 0.62*( 0.60*sin(0.174*-q8) + 0.40*sin(0.364*q8) ); +per_frame_9=q4 = 0.62*( 0.60*sin(0.234*q8) + 0.40*sin(0.271*-q8) ); +per_frame_10=zoom = 1+ 0.06*abs(sin(q8*1.123)); +per_frame_11=decay = 0.8+0.2*sin(q8*0.334); +per_frame_12= +per_frame_13=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_14=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_15=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_16=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_17=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_18=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_19=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_20=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_21=lastbeat = if(beat,time,lastbeat); +per_frame_22=countertime = if(beat,time,countertime); +per_frame_23=counter =-pow(min((time-countertime-1.5),0),9); +per_frame_24=q7 = min(time-countertime,1); +per_frame_25=q5=oldq5+0.04*counter; +per_frame_26=oldq5=q5; +per_frame_27=q6 = beat; +per_frame_28=echo_zoom = beat*abs(100*sin(3.13*q8)); +per_frame_29=echo_alpha = beat*0.5; +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.008*sin(q8)/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +per_pixel_15=rot =0.01*rad*sin(q8*0.781); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Smoke Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Smoke Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Smoke Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Smoke Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,107 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.980000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=1.169958 +fWaveScale=0.634243 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999972 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999666 +sy=0.999900 +wave_r=0.350000 +wave_g=0.350000 +wave_b=0.350000 +wave_x=0.500000 +wave_y=0.380000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=1.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.100000 +nMotionVectorsX=64.000000 +nMotionVectorsY=2.400000 +mv_dx=0.000000 +mv_dy=-0.100000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_5=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_6=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_7=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_8=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_9=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_10=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_11=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_12=lastbeat = if(beat,time,lastbeat); +per_frame_13=countertime = if(beat,time,countertime); +per_frame_14=counter =-pow(min((time-countertime-1.5),0),9); +per_frame_15=q7 = min(time-countertime,1); +per_frame_16=q5=oldq5+0.04*counter; +per_frame_17=oldq5=q5; +per_frame_18=q6 = beat; +per_frame_19=//mv_a = q6; +per_frame_20=q1 = 0.62*( 0.60*sin(0.374*q5) + 0.40*sin(0.294*q5) ); +per_frame_21=q2 = 0.62*( 0.60*sin(0.393*q5) + 0.40*sin(0.223*q5) ); +per_frame_22=q3 = 0.62*( 0.60*sin(0.174*-q5) + 0.40*sin(0.364*q5) ); +per_frame_23=q4 = 0.62*( 0.60*sin(0.234*q5) + 0.40*sin(0.271*-q5) ); +per_frame_24=ob_r = 0.4 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_25=ob_g = 0.5- 0.48*sin(time*3.324); +per_frame_26=ob_b = 0.5 - 0.48*cos(time*2.316); +per_frame_27=ib_r = 0.4 - 0.3*(0.5*sin(time*0.801)+ 0.3*cos(time*0.338)); +per_frame_28=ib_g = 0.5- 0.48*sin(time*4.8124); +per_frame_29=ib_b = 0.5 - 0.48*cos(time*3.316); +per_frame_30=wave_a = 0; +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.015/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Smoking Delusion Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Smoking Delusion Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Smoking Delusion Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Smoking Delusion Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,118 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.700000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=1.000000 +fWaveScale=0.634243 +fWaveSmoothing=0.100000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004960 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.380000 +ob_size=0.010000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=2.016000 +mv_dx=0.000000 +mv_dy=-0.100000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.700000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=tq8 = oldtq8+min(if(above(bass+bass_att,2.5),tq8+0.025*pow((bass+bass_att-2),5),0),1); +per_frame_5=oldtq8 = tq8; +per_frame_6=tq8 = tq8 + time*0.1; +per_frame_7=monitor = tq8; +per_frame_8=q1 = 0.62*( 0.60*sin(0.374*tq8) + 0.40*sin(0.294*tq8) ); +per_frame_9=q2 = 0.62*( 0.60*sin(0.393*tq8) + 0.40*sin(0.223*tq8) ); +per_frame_10=q3 = 0.62*( 0.60*sin(0.174*-tq8) + 0.40*sin(0.364*tq8) ); +per_frame_11=q4 = 0.62*( 0.60*sin(0.234*tq8) + 0.40*sin(0.271*-tq8) ); +per_frame_12=q5 = 0.62*( 0.60*sin(0.414*tq8) + 0.40*sin(0.264*tq8) ); +per_frame_13=q6 = 0.62*( 0.60*sin(0.234*tq8) + 0.40*sin(0.191*tq8) ); +per_frame_14=q7 = 0.62*( 0.60*sin(0.401*tq8) + 0.40*sin(0.307*tq8) ); +per_frame_15=q8 = 0.62*( 0.60*sin(0.162*tq8) + 0.40*sin(0.167*-tq8) ); +per_frame_16=decay = decay - 0.01*equal(q8%5,0); +per_frame_17=wave_a =0; +per_frame_18=ob_r = wave_r-.2; +per_frame_19=ob_b = wave_b-.2; +per_frame_20=ob_g = wave_g-2; +per_frame_21=ob_r = 0.4 - 0.49*(0.5*sin(time*2.701)+ 0.3*cos(time*0.438)); +per_frame_22=ob_g = 0.5- 0.48*sin(time*3.324); +per_frame_23=ob_b = 0.5 - 0.48*cos(time*2.316); +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1); +per_pixel_7=dy = mult*cos(ang2-1); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.008/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1); +per_pixel_14=dy = dy + mult*cos(ang2+1); +per_pixel_15=du = x*2-1 - q5; +per_pixel_16=dv = y*2-1 - q6; +per_pixel_17=dist = sqrt(du*du+dv*dv); +per_pixel_18=ang2 = atan2(du,dv); +per_pixel_19=mult = 0.008/(dist+0.2); +per_pixel_20=dx = dx + mult*sin(ang2+2); +per_pixel_21=dy = dy + mult*cos(ang2+2); +per_pixel_22=du = x*2-1 - q7; +per_pixel_23=dv = y*2-1 - q8; +per_pixel_24=dist = sqrt(du*du+dv*dv); +per_pixel_25=ang2 = atan2(du,dv); +per_pixel_26=mult = 0.008/(dist+0.2); +per_pixel_27=dx = dx + mult*sin(ang2-2); +per_pixel_28=dy = dy + mult*cos(ang2-2); +per_pixel_29=zoom = 3*dx - 3*dy+1; +per_pixel_30=//rot = 3*dx - 3*dy; +per_pixel_31=//dx = 0; +per_pixel_32=//dy =0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Voyage Of Twisted Soul.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Voyage Of Twisted Soul.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Voyage Of Twisted Soul.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Dynamic Swirls 3 (Voyage Of Twisted Soul.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,98 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.993000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.608039 +fWaveScale=0.634243 +fWaveSmoothing=0.100000 +fWaveParam=0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004960 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000156 +sx=0.999666 +sy=0.999900 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.360000 +ob_size=0.010000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.015000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.150000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.400000 +per_frame_1=ob_r = 0.7 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.5- 0.48*sin(time*1.324); +per_frame_3=ob_b = 0.5 - 0.48*cos(time*1.316); +per_frame_4=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_5=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_6=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_7=mv_r = wave_r; +per_frame_8=mv_b = wave_b; +per_frame_9=mv_g = wave_g; +per_frame_10=q8 = oldq8+if(above(bass+bass_att,2.8),q8+0.005*pow((bass+bass_att),5),0); +per_frame_11=oldq8 = q8; +per_frame_12=monitor = sin(q8); +per_frame_13=q1 = 0.62*( 0.60*sin(0.374*q8) + 0.40*sin(0.294*q8) ); +per_frame_14=q2 = 0.62*( 0.60*sin(0.393*q8) + 0.40*sin(0.223*q8) ); +per_frame_15=q3 = 0.62*( 0.60*sin(0.174*-q8) + 0.40*sin(0.364*q8) ); +per_frame_16=q4 = 0.62*( 0.60*sin(0.234*q8) + 0.40*sin(0.271*-q8) ); +per_frame_17=//zoom = zoom+ 0.06*abs(sin(q8)); +per_pixel_1=du = x*2-1 - q1; +per_pixel_2=dv = y*2-1 - q2; +per_pixel_3=dist = sqrt(du*du+dv*dv); +per_pixel_4=ang2 = atan2(du,dv); +per_pixel_5=mult = 0.008/(dist+0.4); +per_pixel_6=dx = mult*sin(ang2-1.5); +per_pixel_7=dy = mult*cos(ang2-1.5); +per_pixel_8=du = x*2-1 - q3; +per_pixel_9=dv = y*2-1 - q4; +per_pixel_10=dist = sqrt(du*du+dv*dv); +per_pixel_11=ang2 = atan2(du,dv); +per_pixel_12=mult = 0.008*sin(q8)/(dist+0.4); +per_pixel_13=dx = dx + mult*sin(ang2+1.5); +per_pixel_14=dy = dy + mult*cos(ang2+1.5); +per_pixel_15=//rot = -0.01*rad*sin(q8); +per_pixel_16=rot =0+abs(3* dx) - abs(3*dy); +per_pixel_17=zoom =1+abs(3* dx) - abs(3*dy); +per_pixel_18=zoomexp = 1 + abs((300* dx) - (300*dy)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Ice Planet.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Ice Planet.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Ice Planet.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Ice Planet.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=2 +fGammaAdj=1.998 +fDecay=0.96 +fVideoEchoZoom=2 +fVideoEchoAlpha=0 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=1 +bInvert=1 +fWaveAlpha=1.334524 +fWaveScale=1.981 +fWaveSmoothing=0.6 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=2.853 +fZoomExponent=1 +fShader=0 +zoom=1.064 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0 +sx=1 +sy=1 +wave_r=0.6 +wave_g=0.6 +wave_b=0.6 +wave_x=0.5 +wave_y=0.5 +ob_size=0.01 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0.01 +ib_r=0.25 +ib_g=0.25 +ib_b=0.25 +ib_a=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +mv_dx=0 +mv_dy=0 +mv_l=0.9 +mv_r=1 +mv_g=1 +mv_b=1 +mv_a=0 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=q8 = oldq8+if(above(bass+bass_att,2.8),q8+0.001*pow((bass+bass_att-2),8),0); +per_frame_5=oldq8 = q8; +per_frame_6=monitor = q8; +per_frame_7=zoom = zoom + 0.013*( 0.60*sin(0.339*q8) + 0.40*sin(0.276*q8) ); +per_frame_8=rot = rot + 0.040*( 0.60*sin(0.381*q8) + 0.40*sin(0.579*q8) ); +per_pixel_1=zoom = zoom + (x*2-1)*(0.08+0.15*sin(q8*0.321)) + (y*2-1)*(0.08+0.15*cos(q8*0.321)); +per_pixel_2=sx=sx-(zoom-1)*0.1; +per_pixel_3=sy=sy-(zoom-1)*0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octoplasm.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octoplasm.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octoplasm.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octoplasm.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.700000 +fDecay=0.964000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.695686 +fWaveSmoothing=0.450000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.020000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.076000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.100000 +ob_g=0.200000 +ob_b=0.400000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=3.008000 +nMotionVectorsY=48.000000 +mv_l=2.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=bass_effect = min(max(max(bass,bass_att)-1.3,0),1); +per_frame_3=treb_effect = min(max(max(treb,treb_att)-1.3,0),1); +per_frame_4=mid_effect = min(max(max(mid,mid_att)-1.3,0),1); +per_frame_5=wave_r = wave_r + 0.4*( 0.6*sin(1.517*time) + 0.4*mid_effect ); +per_frame_6=wave_b = wave_b + 0.4*( 0.6*sin(1.088*time) + 0.4*bass_effect ); +per_frame_7=wave_g = wave_g + 0.4*( 0.6*sin(1.037*time) + 0.4*treb_effect ); +per_frame_8=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_9=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_10=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_11=ob_r = 1-wave_b; +per_frame_12=ob_g = wave_r; +per_frame_13=ob_b = 1-wave_g; +per_frame_14=q1=cos((0.91*time) + sin(time*0.324)); +per_frame_15=q2=time + 0.3*sin((time*0.47) - cos(time*0.216)); +per_pixel_1=rot=rot+0.08*sin(rad*23.5 + q2*1.3 + q1*1.31); +per_pixel_2=zoom=zoom+0.05*sin(ang*4 + pow((sqrt(2)-rad),13*rad) + q2*1.63 + q1) - 0.05; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octotrip.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octotrip.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octotrip.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octotrip.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.700000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.695686 +fWaveSmoothing=0.450000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.020000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.076000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.100000 +ob_g=0.200000 +ob_b=0.400000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=3.008000 +nMotionVectorsY=48.000000 +mv_l=2.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp =0; +per_frame_2=bass_effect = min(max(max(bass,bass_att)-1.3,0),1); +per_frame_3=treb_effect = min(max(max(treb,treb_att)-1.3,0),1); +per_frame_4=mid_effect = min(max(max(mid,mid_att)-1.3,0),1); +per_frame_5=wave_r = wave_r + 0.4*( 0.6*sin(1.517*time) + 0.4*mid_effect ); +per_frame_6=wave_b = wave_b + 0.4*( 0.6*sin(1.088*time) + 0.4*bass_effect ); +per_frame_7=wave_g = wave_g + 0.4*( 0.6*sin(1.037*time) + 0.4*treb_effect ); +per_frame_8=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_9=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_10=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_11=ib_r = wave_g; +per_frame_12=ib_g = 1-wave_r; +per_frame_13=ib_b = wave_b; +per_frame_14=ob_r = 1-wave_b; +per_frame_15=ob_g = wave_r; +per_frame_16=ob_b = 1-wave_g; +per_frame_17=ib_size = 0.02*bass_effect; +per_frame_18=q1=cos((0.91*time) + sin(time*0.324)); +per_frame_19=q2=time + 0.3*sin((time*0.47) - cos(time*0.216)); +per_pixel_1=rot=rot+0.05*sin(rad*13.5 + q2*1.3 + q1*1.31); +per_pixel_2=zoom=zoom+0.05*sin(ang*10.0 + rad*7.5 + q2*1.63 + q1) - 0.05; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octotrip (MultiTrip Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octotrip (MultiTrip Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octotrip (MultiTrip Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Geiss - Octotrip (MultiTrip Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,240 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.695686 +fWaveSmoothing=0.450000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.020000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.076000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.100000 +ob_g=0.200000 +ob_b=0.400000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=3.008000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=2.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=warp =0; +per_frame_2=bass_effect = min(max(max(bass,bass_att)-1.3,0),1); +per_frame_3=treb_effect = min(max(max(treb,treb_att)-1.3,0),1); +per_frame_4=mid_effect = min(max(max(mid,mid_att)-1.3,0),1); +per_frame_5=wave_r = wave_r + 0.4*( 0.6*sin(1.517*time) + 0.4*mid_effect ); +per_frame_6=wave_b = wave_b + 0.4*( 0.6*sin(1.088*time) + 0.4*bass_effect ); +per_frame_7=wave_g = wave_g + 0.4*( 0.6*sin(1.037*time) + 0.4*treb_effect ); +per_frame_8=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_9=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_10=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_11=ib_r = wave_g; +per_frame_12=ib_g = 1-wave_r; +per_frame_13=ib_b = wave_b; +per_frame_14=ob_r = 1-wave_b; +per_frame_15=ob_g = wave_r; +per_frame_16=ob_b = 1-wave_g; +per_frame_17=ib_size = 0.02*bass_effect; +per_frame_18=q1=cos((0.91*time) + sin(time*0.324)); +per_frame_19=q2=time + 0.3*sin((time*0.47) - cos(time*0.216)); +per_frame_20=movement =movement + 0.5*(((bass+bass_att + 0.075*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_21=movement = if(above(movement,10000), 0, movement); +per_frame_22= +per_frame_23=q3 = 0.5+0.15*sin(movement); +per_frame_24=q4 = 0.5-0.15*cos(0.781*movement); +per_frame_25= +per_frame_26=wave_x = q3; +per_frame_27=wave_y = 1-q4; +per_pixel_1=newx =x- q3; +per_pixel_2=newy =y- q4; +per_pixel_3=newang = atan2(newx,newy); +per_pixel_4=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_5=rot=0+0.05*sin(newrad*13.5 + q2*1.3 + q1*1.31); +per_pixel_6=zoom=zoom+0.05*sin(newang*10.0 + newrad*7.5 + q2*1.63 + q1)-0.05; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Halcyon Dreams 3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Halcyon Dreams 3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Halcyon Dreams 3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Halcyon Dreams 3.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,64 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.979000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.824241 +fWaveScale=0.970586 +fWaveSmoothing=0.570000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.072135 +rot=0.040000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + .33*sin(time*1.2); +per_frame_3=wave_g = wave_g + .33*sin(time*.888); +per_frame_4=wave_b = wave_g + .33*sin(time*.999); +per_pixel_1=fleem=if(above(bass_att,1),-4,8)+if(above(treb_att,1),8,-4); +per_pixel_2=zoom = zoom + 0.07*cos(((rad)*-fleem)-rad); +per_pixel_3=sx = 1+sin(rad)/9; +per_pixel_4=sy = 1+sin(rad)/8; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hallucinogenic Pyramids (Beat Time Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hallucinogenic Pyramids (Beat Time Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hallucinogenic Pyramids (Beat Time Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hallucinogenic Pyramids (Beat Time Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,75 @@ +[preset00] +fRating=5.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=11.940000 +fWaveScale=1.599182 +fWaveSmoothing=0.700000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.001000 +fShader=0.000000 +zoom=1.007000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.300000 +wave_b=0.300000 +wave_x=0.000000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.400000 +ob_g=0.300000 +ob_b=0.000000 +ob_a=0.700000 +ib_size=0.005000 +ib_r=0.650000 +ib_g=0.050000 +ib_b=0.450000 +ib_a=0.300000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.200*( 0.60*sin(0.823*time) + 0.40*sin(0.916*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(1.023*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.808*time) + 0.40*sin(0.949*time) ); +per_frame_4=decay = decay - 0.03*equal(frame%30,0); +per_frame_5=treb_effect = max(max(treb,treb_att)-1.25,0); +per_frame_6=mid_effect= max(max(mid,mid_att)-1.25,0); +per_frame_7=ob_size = ob_size + 0.005*treb_effect; +per_frame_8=ib_size = ib_size + 0.005*mid_effect; +per_frame_9=ob_r = ob_r -0.2* treb_effect +0.2* mid_effect; +per_frame_10=ib_g = ib_g + 0.2*mid_effect- 0.2*treb_effect; +per_pixel_1=ok_to_change = if(above(time,beat_time+5),1,0); +per_pixel_2=bass_effect = max(bass, bass_att)-1; +per_pixel_3=beat_time = if(above(bass_effect,0.5), if(ok_to_change,time,beat_time),beat_time); +per_pixel_4=effect = if(equal(time,beat_time),abs(effect-1),effect); +per_pixel_5=bass_effect = max(max(bass,bass_att)-1.34,0); +per_pixel_6=zoom = if(above(effect,0),0.4*x,0.4*y) +0.6 -0.13*(min(bass_effect,0.3)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Delight (Endless Tunnel Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Delight (Endless Tunnel Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Delight (Endless Tunnel Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Delight (Endless Tunnel Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,92 @@ +[preset00] +fRating=2 +fGammaAdj=1 +fDecay=1 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001 +fWaveScale=0.6401 +fWaveSmoothing=0.27 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=5.99579 +fWarpScale=1.331 +fZoomExponent=1.01 +fShader=0 +zoom=0.996546 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.01 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.96 +ob_size=0.01 +ob_r=0 +ob_g=0.9 +ob_b=0.2 +ob_a=1 +ib_size=0 +ib_r=0.5 +ib_g=0.5 +ib_b=0.5 +ib_a=1 +nMotionVectorsX=0 +nMotionVectorsY=48 +mv_l=5 +mv_r=1 +mv_g=1 +mv_b=1 +mv_a=0 +per_frame_1=ob_r = 0.7 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.5- 0.4*sin(time*5.924); +per_frame_3=ob_b = 0.45 - 0.3*cos(time*0.816); +per_frame_4=cx = cx - 0.1*sin(time*0.542); +per_frame_5=cy = cy + 0.1*sin(time*0.753); +per_frame_6=warp =0; +per_frame_7=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_8=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_9=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_10=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_11=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_12=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_13=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_14=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_15=lastbeat = if(beat,time,lastbeat); +per_frame_16=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_17=q5 = if(beat,0.1*rand(1000),oldq5); +per_frame_18=oldq5 = q5; +per_frame_19=q3 = if(beat,0.1*rand(1000),oldq3); +per_frame_20=oldq3 = q3; +per_frame_21=my_ib_size = 0.01+abs(0.01*sin(0.1*rand(1000))); +per_frame_22=ib_size = if(beat,my_ib_size,old_ib_size); +per_frame_23=old_ib_size = ib_size; +per_frame_24=ib_r = ib_r + 0.5*sin(time*3.934); +per_frame_25=ib_g = ib_g + 0.5*sin(time*1.547); +per_frame_26=ib_b = ib_b - 0.5*sin(time*1.431); +per_pixel_1=box=abs(x*2-sin(q3))%2 + abs(y*2+sin(q5))%2; +per_pixel_2=q1 = 4.05+(sin(x+0.237*time)-cos(y+0.513*time)); +per_pixel_3=zoom = if(above(box,1),q1*.1,zoom*0.95); +per_pixel_4=rot = if(above(box,1),sin(0.885*time),0); +per_pixel_5=dx = if(above(box,1),sin(0.542*time),0); +per_pixel_6=dy= if(above(box,1),sin(0.581*time),0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 1.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,113 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.204482 +fWaveScale=1.284528 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.100000 +wave_y=0.860000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=48.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.3 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.4- 0.4*sin(time*5.924); +per_frame_3=ob_b = 0.35 - 0.3*cos(time*0.816); +per_frame_4=cx = cx - 0.1*sin(time*0.342); +per_frame_5=cy = cy + 0.1*sin(time*0.453); +per_frame_6=warp =0; +per_frame_7=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_8=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_9=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_10=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_11=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_12=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_13=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_14=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_15=lastbeat = if(beat,time,lastbeat); +per_frame_16=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_17=q5 = if(beat,0.1*rand(1000),oldq5); +per_frame_18=oldq5 = q5; +per_frame_19=q3 = if(beat,0.1*rand(1000),oldq3); +per_frame_20=oldq3 = q3; +per_frame_21=my_ib_size = 0.02; +per_frame_22=ib_size = if(beat,my_ib_size,old_ib_size); +per_frame_23=old_ib_size = ib_size; +per_frame_24=ib_r = ib_r + 0.5*sin(time*3.034); +per_frame_25=ib_g = ib_g + 0.5*sin(time*2.547); +per_frame_26=ib_b = ib_b - 0.5*sin(time*1.431); +per_frame_27=xdx = dx -0.008*sin(time*0.23); +per_frame_28=xdy = dy - 0.008*sin(time*0.2); +per_frame_29=wave_r = wave_r + 0.5*sin(time*0.734); +per_frame_30=wave_b = wave_b + 0.5*sin(time*0.615); +per_frame_31=wave_b = wave_b + 0.5*sin(time*0.714); +per_frame_32=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_33=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_34=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_35=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_36=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_37=xpos = xpos + 0.001*xspeed; +per_frame_38=dx = 0.1*xpos; +per_frame_39=q2 = xpos; +per_frame_40=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_41=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_42=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_43=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_44=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_45=ypos = ypos + 0.001*yspeed; +per_frame_46=dy =0.1*ypos; +per_frame_47=q4 = ypos; +per_pixel_1=box=0.8*(1-rad)+0.5*abs(x*3-0.2*sin(q3))%2 + 0.5*abs(y*3+0.2*sin(q5))%2; +per_pixel_2=q1 = 8.05+1.2*(sin(x)-cos(y)); +per_pixel_3=zoom = if(above(box,1),q1*0.1,zoom); +per_pixel_4=rot = if(above(box,1),3.5+ abs(sin(3*(q2+q4)))*(0.3*sin(0.385*time)+0.4*sin(time*0.254)+0.3*cos(time*0.311)),rot); +per_pixel_5=dx = if(above(box,1),q4,dx); +per_pixel_6=dy= if(above(box,1),q2,dy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 2.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,110 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.204482 +fWaveScale=0.535238 +fWaveSmoothing=0.270000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.100000 +wave_y=0.860000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=48.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.3 - 0.3*(0.5*sin(time*0.901)+ 0.3*cos(time*1.438)); +per_frame_2=ob_g = 0.4- 0.4*sin(time*3.924); +per_frame_3=ob_b = 0.35 - 0.3*cos(time*2.816); +per_frame_4=cx = cx - 0.1*sin(time*0.342); +per_frame_5=cy = cy + 0.1*sin(time*0.453); +per_frame_6=warp =0; +per_frame_7=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_8=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_9=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_10=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_11=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_12=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_13=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_14=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_15=lastbeat = if(beat,time,lastbeat); +per_frame_16=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_17=q5 = if(beat,0.1*rand(1000),oldq5); +per_frame_18=oldq5 = q5; +per_frame_19=q3 = if(beat,0.1*rand(1000),oldq3); +per_frame_20=oldq3 = q3; +per_frame_21=ib_size = 0.005 + 0.02*sin(time*0.963); +per_frame_22=ob_size = 0.005+ 0.02*abs(sin(time*0.7834)); +per_frame_23=ib_r = 0.8*(1- ob_r)+0.2; +per_frame_24=ib_g = 0.7*(1- ob_g)+0.3; +per_frame_25=ib_b = ib_b - 0.5*sin(time*1.731); +per_frame_26=wave_r = wave_r + 0.5*sin(time*0.734); +per_frame_27=wave_b = wave_b + 0.5*sin(time*0.615); +per_frame_28=wave_b = wave_b + 0.5*sin(time*0.714); +per_frame_29=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_30=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_31=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_32=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_33=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_34=xpos = xpos + 0.001*xspeed; +per_frame_35=dx = 0.1*xpos; +per_frame_36=q2 = xpos; +per_frame_37=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_38=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_39=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_40=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_41=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_42=ypos = ypos + 0.001*yspeed; +per_frame_43=dy =0.1*ypos; +per_frame_44=q4 = ypos; +per_pixel_1=box =0.12+2*x%2+2*y%2; +per_pixel_2=q1 = 6.4+1.2*(sin(x+(0.6*time))-cos(y+(0.432*time))); +per_pixel_3=zoom = if(above(box,1),q1*0.1,zoom); +per_pixel_4=rot = if(above(box,1),3.5+ abs(sin(3*(q2+q4)))*(0.3*sin(0.385*time)+0.4*sin(time*0.254)+0.3*cos(time*0.311)),rot); +per_pixel_5=dx = if(above(box,1),q4*3,dx); +per_pixel_6=dy= if(above(box,1),q2*3,dy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal 3.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,115 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.960000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.204482 +fWaveScale=0.535238 +fWaveSmoothing=0.270000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.100000 +wave_y=0.860000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=3.200000 +nMotionVectorsY=48.000000 +mv_l=3.500000 +mv_r=0.700000 +mv_g=0.700000 +mv_b=0.300000 +mv_a=1.000000 +per_frame_1=ob_r = 0.3 - 0.3*(0.5*sin(time*0.901)+ 0.3*cos(time*1.438)); +per_frame_2=ob_g = 0.4- 0.4*sin(time*3.924); +per_frame_3=ob_b = 0.35 - 0.3*cos(time*2.816); +per_frame_4=cx = cx - 0.1*sin(time*0.342); +per_frame_5=cy = cy + 0.1*sin(time*0.453); +per_frame_6=warp =0; +per_frame_7=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_8=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_9=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_10=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_11=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_12=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_13=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_14=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_15=lastbeat = if(beat,time,lastbeat); +per_frame_16=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_17=q5 = if(beat,0.1*rand(1000),oldq5); +per_frame_18=oldq5 = q5; +per_frame_19=q3 = if(beat,0.1*rand(1000),oldq3); +per_frame_20=oldq3 = q3; +per_frame_21=ib_size = 0.005 + 0.02*sin(time*0.963); +per_frame_22=ob_size = 0.02*abs(sin(time*0.7834)); +per_frame_23=mv_r = mv_r + 0.3*sin(time*3.034); +per_frame_24=mv_g = mv_g + 0.3*sin(time*2.547); +per_frame_25=mv_b = mv_b - 0.3*sin(time*1.731); +per_frame_26=wave_r = wave_r + 0.5*sin(time*0.734); +per_frame_27=wave_b = wave_b + 0.5*sin(time*0.615); +per_frame_28=wave_b = wave_b + 0.5*sin(time*0.714); +per_frame_29=ib_r = ib_r + 0.5*sin(time*0.734); +per_frame_30=ib_g = ib_g + 0.5*sin(time*1.215); +per_frame_31=ib_b = ib_b + 0.5*sin(time*1.414); +per_frame_32=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_33=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_34=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_35=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_36=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_37=xpos = xpos + 0.001*xspeed; +per_frame_38=dx = 0.1*xpos; +per_frame_39=q2 = xpos; +per_frame_40=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_41=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_42=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_43=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_44=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_45=ypos = ypos + 0.001*yspeed; +per_frame_46=dy =0.1*ypos; +per_frame_47=q4 = ypos; +per_frame_48=ib_a = if(beat,1,0); +per_frame_49=ob_a = if(beat,1,0); +per_pixel_1=box =0.05+2*x%2+2*y%2; +per_pixel_2=q1 = 6.4+1.4*(sin(x+(0.6*time))-cos(y+(0.432*time))); +per_pixel_3=zoom = if(above(box,1),q1*0.1,zoom); +per_pixel_4=rot = if(above(box,1),3.5+ abs(sin(3*(q2+q4)))*(0.3*sin(0.385*time)+0.4*sin(time*0.254)+0.3*cos(time*0.311)),rot); +per_pixel_5=dx = if(above(box,1),q4*4,dx); +per_pixel_6=dy= if(above(box,1),q2*4,dy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal (Crazed Spiral Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal (Crazed Spiral Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal (Crazed Spiral Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal (Crazed Spiral Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,76 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.640100 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.960000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=48.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.3 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.6- 0.4*sin(time*2.924); +per_frame_3=ob_b = 0.35 - 0.3*cos(time*0.816); +per_frame_4=cx = cx - 0.1*sin(time*0.342); +per_frame_5=cy = cy + 0.1*sin(time*0.433); +per_frame_6=warp =0; +per_frame_7=ib_size = 0.02; +per_frame_8=ib_r = ib_r + 0.5*sin(time*3.034); +per_frame_9=ib_g = ib_g + 0.5*sin(time*2.547); +per_frame_10=ib_b = ib_b - 0.5*sin(time*1.431); +per_frame_11=dx = dx -0.008*sin(time*0.23); +per_frame_12=dy = dy - 0.008*sin(time*0.2); +per_pixel_1=box=(1-rad)+0.5*abs(x*3-0.4*sin(q1))%2 + 0.5*abs(y*3+0.4*sin(q1))%2; +per_pixel_2=q1 = 8.05+(sin(x+0.137*time)-cos(y+0.213*time)); +per_pixel_3=zoom = if(above(box,1),q1*.1,zoom); +per_pixel_4=rot = if(above(box,1),1*sin(0.385*time),rot); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal (Dual Spiral Mix ).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal (Dual Spiral Mix ).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal (Dual Spiral Mix ).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Dynamic Fractal (Dual Spiral Mix ).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,91 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.640100 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.960000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=48.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.7 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.5- 0.4*sin(time*1.724); +per_frame_3=ob_b = 0.35 - 0.3*cos(time*1.816); +per_frame_4=warp =0; +per_frame_5=ib_size = 0.02; +per_frame_6=ib_r = ib_r + 0.5*sin(time*3.034); +per_frame_7=ib_g = ib_g + 0.5*sin(time*3.147); +per_frame_8=ib_b = ib_b - 0.5*sin(time*3.431); +per_frame_9=dx = dx -0.003*sin(time*0.23); +per_frame_10=dy = dy - 0.003*sin(time*0.2); +per_frame_11=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att); +per_frame_12=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_13=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_14=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_15=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_16=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_17=xpos = xpos + 0.001*xspeed; +per_frame_18=q2 = xpos; +per_frame_19=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_20=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_21=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_22=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_23=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_24=ypos = ypos + 0.001*yspeed; +per_frame_25=q4 = ypos; +per_pixel_1=box =0.5+0.8*(2*x%4+2*y%2); +per_pixel_2=q1 = 8.05+0.3*(sin(pow(x,3)+0.137*time)-cos(pow(y,3)+0.213*time)); +per_pixel_3=zoom = if(above(box,1),q1*.1,zoom); +per_pixel_4=rot = if(above(box,1),0.5*sin(0.5*rad+0.385*time),rot); +per_pixel_5=cx = cx - 0.21*sin(rad+2*q4); +per_pixel_6=cy = cy + 0.11*sin((1-rad)-2*q2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Fractal Encounter 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Fractal Encounter 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Fractal Encounter 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Fractal Encounter 2.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,125 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.014853 +fWaveScale=100.000000 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.800000 +wave_g=0.100000 +wave_b=0.100000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.201000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=5.760000 +nMotionVectorsY=4.680001 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.600000 +mv_g=0.400000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.21 - 0.2*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.5 - 0.46*sin(time*1.724); +per_frame_3=ob_b = 0.65 - 0.3*cos(time*1.816); +per_frame_4=warp =0; +per_frame_5=ib_size = 0.025; +per_frame_6=ib_r = ib_r + 0.2*(0.6*sin(time*3.034)+0.4*cos(time*2.14)); +per_frame_7=ib_g = ib_g + 0.5*(0.6*sin(time*3.147)+0.4*cos(time*2.015)); +per_frame_8=ib_b = ib_b - 0.5*(0.6*sin(time*3.431)+0.4*cos(time*1.842)); +per_frame_9=dx = dx +0.001+abs(0.003*(0.6*sin(time*0.234) + 0.4*cos(time*0.437))); +per_frame_10=dy = dy + abs(0.003*(0.7*sin(time*0.213) + 0.3*cos(time*0.315))); +per_frame_11=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att); +per_frame_12=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_13=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_14=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_15=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_16=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_17=xpos = xpos + 0.001*xspeed; +per_frame_18=q2 = xpos; +per_frame_19=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_20=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_21=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_22=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_23=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_24=ypos = ypos + 0.001*yspeed; +per_frame_25=q4 = ypos; +per_frame_26=bass_effect = max(max(bass,bass_att)-1.2,0); +per_frame_27=echo_zoom = 1.32 + 0.3*(0.59*sin(q4+time*0.865) + 0.41*cos(q2+time*1.192)) + 0.05*bass_effect; +per_frame_28=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_29=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_30=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_31=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_32=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_33=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_34=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_35=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_36=lastbeat = if(beat,time,lastbeat); +per_frame_37=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_38=beatcounter = if(above(beat,0),beatcounter +1, beatcounter); +per_frame_39=beatcounter = if(above(beatcounter,7), 0, beatcounter); +per_frame_40=beateven = beatcounter%2; +per_frame_41=mode = if(beat,(mode+rand(3)+1)%4,mode); +per_frame_42=echo_orient = mode; +per_frame_43=wave_a = if(beat,1,0); +per_frame_44=wave_r = wave_r + 0.2*sin(time*0.7854) - 0.2*beateven; +per_frame_45=wave_b = wave_b + 0.1*sin(time*0.8254) + 0.2*beateven; +per_frame_46=wave_g = wave_g + 0.1*sin(time*0.854) + 0.2*beateven; +per_frame_47=q6 = beat; +per_frame_48=wave_mode = if(beateven,7,0); +per_frame_49=mv_a = if(beat,if(equal(beatcounter,6),1,0),0); +per_frame_50=mv_r = if(mv_a,rand(2),0); +per_frame_51=mv_b = if(mv_a,rand(2),0); +per_frame_52=mv_g= if(mv_a,rand(2),0); +per_pixel_1=box =0.5+0.8*(2*x%4+2*y%2); +per_pixel_2=q1 = 8.45+0.3*(sin(pow(x,3)+0.177*time)-cos(pow(y,3)+0.223*time)); +per_pixel_3=q7 = above(box,1); +per_pixel_4=zoom = if(q7,(q1*.1) + q6*6 ,zoom); +per_pixel_5=rot = if(q7,0.63*sin(0.385*time + 0.12*sin(0.67*time) + 0.1*q4 + 0.12*q2 +q6*50),rot); +per_pixel_6=cx = cx - 0.15*sin(2*q4); +per_pixel_7=cy = cy + 0.14*sin(2*q2); +per_pixel_8=sx = if(q7,sx+q6*18,sx); +per_pixel_9=sy = if(q7,sy+q6*18,sy); +per_frame_init_1=beatcounter =0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Fractal Encounter.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Fractal Encounter.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Fractal Encounter.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Fractal Encounter.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,113 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.014853 +fWaveScale=0.010000 +fWaveSmoothing=0.270000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.100000 +wave_y=0.900000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=63.936001 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=0.630000 +mv_g=0.200000 +mv_b=0.300000 +mv_a=0.000000 +per_frame_1=ob_r = 0.4 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.5 - 0.46*sin(time*1.724); +per_frame_3=ob_b = 0.65 - 0.3*cos(time*1.816); +per_frame_4=warp =0; +per_frame_5=ib_size = 0.025; +per_frame_6=ib_r = ib_r + 0.5*(0.6*sin(time*3.034)+0.4*cos(time*2.14)); +per_frame_7=ib_g = ib_g + 0.5*(0.6*sin(time*3.147)+0.4*cos(time*2.015)); +per_frame_8=ib_b = ib_b - 0.5*(0.6*sin(time*3.431)+0.4*cos(time*1.842)); +per_frame_9=dx = dx -0.003*(0.6*sin(time*0.234) + 0.4*cos(time*0.437)); +per_frame_10=dy = dy - 0.003*(0.7*sin(time*0.213) + 0.3*cos(time*0.315)); +per_frame_11=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att); +per_frame_12=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_13=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_14=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_15=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_16=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_17=xpos = xpos + 0.001*xspeed; +per_frame_18=q2 = xpos; +per_frame_19=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_20=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_21=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_22=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_23=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_24=ypos = ypos + 0.001*yspeed; +per_frame_25=q4 = ypos; +per_frame_26=bass_effect = max(max(bass,bass_att)-1.2,0); +per_frame_27=echo_zoom = 1.32 + 0.3*(0.59*sin(q4+time*0.865) + 0.41*cos(q2+time*1.192)) + 0.05*bass_effect; +per_frame_28=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_29=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_30=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_31=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_32=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_33=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_34=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_35=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_36=lastbeat = if(beat,time,lastbeat); +per_frame_37=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_38=mode = (mode+beat*(rand(3)+1))%4; +per_frame_39=echo_orient = mode; +per_frame_40=wave_a = 0; +per_frame_41=q6 = beat; +per_pixel_1=box =0.5+0.8*(2*x%4+2*y%2); +per_pixel_2=q1 = 8.05+0.3*(sin(pow(x,3)+0.177*time)-cos(pow(y,3)+0.223*time)); +per_pixel_3=q7 = above(box,1); +per_pixel_4=zoom = if(q7,(q1*.1) + q6*6 ,zoom); +per_pixel_5=rot = if(q7,0.63*sin(0.5*rad+0.385*time + 0.12*sin(0.67*time) + 0.1*q4 + 0.12*q2 +q6*50),rot); +per_pixel_6=cx = cx - 0.05*sin(rad+2*q4); +per_pixel_7=cy = cy + 0.04*sin(((0.5*sqrt(2))-rad)-2*q2); +per_pixel_8=sx = if(q7,sx+q6*18,sx); +per_pixel_9=sy = if(q7,sy+q6*18,sy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Spirit.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Spirit.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Spirit.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Spirit.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,90 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.640100 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.960000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=48.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.7 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.5- 0.4*sin(time*5.924); +per_frame_3=ob_b = 0.45 - 0.3*cos(time*0.816); +per_frame_4=warp =0; +per_frame_5=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_6=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_7=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_8=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_9=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_10=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_11=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_12=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_13=lastbeat = if(beat,time,lastbeat); +per_frame_14=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_15=q5 = if(beat,0.1*rand(1000),oldq5); +per_frame_16=oldq5 = q5; +per_frame_17=q3 = if(beat,0.1*rand(1000),oldq3); +per_frame_18=oldq3 = q3; +per_frame_19=ib_size = 0.02; +per_frame_20=ib_r = ib_r + 0.5*sin(time*2.424); +per_frame_21=ib_g = ib_g + 0.5*sin(time*2.247); +per_frame_22=ib_b = ib_b - 0.5*sin(time*1.131); +per_frame_23=dx = dx -0.008*(0.6*sin(time*0.23)+0.5*cos(time*0.153)); +per_frame_24=dy = dy - 0.008*(0.6*sin(time*0.21)+0.5*cos(time*0.142)); +per_pixel_1=box=abs(x*2-0.4*sin(q3))%2 + abs(y*2+0.4*sin(q5))%2; +per_pixel_2=q1 = 4.05+(sin(x+0.237*time)-cos(y+0.513*time)); +per_pixel_3=zoom = if(above(box,1),q1*.1,zoom); +per_pixel_4=rot = if(above(box,1),sin(0.885*time),0); +per_pixel_5=dx = if(above(box,1),sin(0.542*time),dx); +per_pixel_6=dy= if(above(box,1),sin(0.581*time),dy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Spirit (Twisted Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Spirit (Twisted Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Spirit (Twisted Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Harlequin's Spirit (Twisted Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,94 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.640100 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.960000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=48.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.7 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.5- 0.4*sin(time*5.924); +per_frame_3=ob_b = 0.45 - 0.3*cos(time*0.816); +per_frame_4=cx = cx - 0.1*sin(time*0.542); +per_frame_5=cy = cy + 0.1*sin(time*0.753); +per_frame_6=warp =0; +per_frame_7=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_8=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_9=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_10=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_11=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_12=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_13=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_14=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_15=lastbeat = if(beat,time,lastbeat); +per_frame_16=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_17=q5 = if(beat,0.1*rand(1000),oldq5); +per_frame_18=oldq5 = q5; +per_frame_19=q3 = if(beat,0.1*rand(1000),oldq3); +per_frame_20=oldq3 = q3; +per_frame_21=my_ib_size = 0.02; +per_frame_22=ib_size = if(beat,my_ib_size,old_ib_size); +per_frame_23=old_ib_size = ib_size; +per_frame_24=ib_r = ib_r + 0.5*sin(time*3.034); +per_frame_25=ib_g = ib_g + 0.5*sin(time*2.547); +per_frame_26=ib_b = ib_b - 0.5*sin(time*1.431); +per_frame_27=dx = dx -0.008*sin(time*0.23); +per_frame_28=dy = dy - 0.008*sin(time*0.2); +per_pixel_1=box=abs(x*2-0.4*sin(q3))%2 + abs(y*2+0.4*sin(q5))%2; +per_pixel_2=q1 = 4.05+(sin(x+0.237*time)-cos(y+0.513*time)); +per_pixel_3=zoom = if(above(box,1),q1*.1,zoom); +per_pixel_4=dx = if(above(box,1),sin(0.542*time),dx); +per_pixel_5=dy= if(above(box,1),sin(0.581*time),dy); +per_pixel_6=zoomexp = if(above(box,1),3,1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace (Frozen Rapture Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace (Frozen Rapture Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace (Frozen Rapture Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace (Frozen Rapture Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.973000 +fVideoEchoZoom=1.047463 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=1 +bDarken=1 +bSolarize=1 +bInvert=1 +fWaveAlpha=0.900000 +fWaveScale=2.905229 +fWaveSmoothing=0.600000 +fWaveParam=-0.300000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=0.999835 +fShader=0.000000 +zoom=0.999682 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=1.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.100*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=mv_r = wave_r; +per_frame_5=mv_b = wave_b; +per_frame_6=mv_g = wave_g; +per_frame_7=q1 = 0.05*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_8=//q1 = 0.6*(bass+bass_att); +per_frame_9=mv_a = if(above(bass-1.2,1),1,bass-1.2); +per_frame_10=echo_zoom = 1+q1; +per_pixel_1=zoom = 1.01 + rad*0.15*q1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace (Hyper Speed Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace (Hyper Speed Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace (Hyper Speed Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace (Hyper Speed Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.973000 +fVideoEchoZoom=1.047463 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.900000 +fWaveScale=2.905229 +fWaveSmoothing=0.600000 +fWaveParam=-0.300000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=0.999835 +fShader=0.000000 +zoom=0.999682 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=1.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.100*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=mv_r = wave_r; +per_frame_5=mv_b = wave_b; +per_frame_6=mv_g = wave_g; +per_frame_7=q1 = 0.5*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_8=//q1 = 0.6*(bass+bass_att); +per_frame_9=mv_a = if(above(bass-1.2,1),1,bass-1.2); +per_pixel_1=zoom = 1.01 + rad*0.15*q1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Hyperspace.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.973000 +fVideoEchoZoom=1.047463 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.900000 +fWaveScale=2.905229 +fWaveSmoothing=0.600000 +fWaveParam=-0.300000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=0.999835 +fShader=0.000000 +zoom=0.999682 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=1.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.100*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=mv_r = wave_r; +per_frame_5=mv_b = wave_b; +per_frame_6=mv_g = wave_g; +per_frame_7=q1 = 0.05*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_8=//q1 = 0.6*(bass+bass_att); +per_frame_9=mv_a = if(above(bass-1.2,1),1,bass-1.2); +per_pixel_1=zoom = 1.01 + rad*0.15*q1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Balk Acid.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Balk Acid.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Balk Acid.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Balk Acid.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999514 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.591236 +fWaveSmoothing=0.000000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.010000 +fShader=0.000000 +zoom=1.000300 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.400000 +wave_g=1.000000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=1.000000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=1.000000 +ob_b=0.410000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=12.799995 +nMotionVectorsY=2.879900 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=3.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.400000 +per_frame_1=zoom=zoom+0.028*(bass+bass_att) -0.05; +per_frame_2=rot=rot+0.10*sin(time); +per_frame_3=mv_r=0.5 +0.5*sin(time*1.23); +per_frame_4=mv_b=0.5 + 0.5*sin(time*1.26); +per_frame_5=mv_g=0.5+ 0.5*sin(time*1.19); +per_frame_6=wave_g=wave_g*+.20*sin(time*.13); +per_frame_7=wave_r=wave_r+.13*sin(time); +per_frame_8=wave_b=wave_b*sin(time); +per_frame_9=wave_x=wave_x-.5*sin(time*.13); +per_frame_10=ob_a = if(above(mid+treb,2.6),1,0); +per_frame_11=ob_r = 0.5 + 0.4*sin(time*2.87); +per_frame_12=ob_b = 0.5 + 0.4*sin(time*2.914); +per_frame_13=ob_g = 0.5 + 0.4*sin(time*2.768); +per_frame_14=mv_y = 3.25; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mi.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mi.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mi.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mi.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.280000 +fDecay=0.994000 +fVideoEchoZoom=1.644630 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.475355 +fWaveSmoothing=0.630000 +fWaveParam=-0.140000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=63.504501 +fShader=0.000000 +zoom=0.544958 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.499900 +wave_b=0.560000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.400000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.600000 +ib_size=0.020000 +ib_r=0.510000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r=.5-.3*sin(Time*.33); +per_frame_2=wave_b=.5+.3*sin(time*13); +per_frame_3=wave_g=wave_g+.5*Sin(time*1.14); +per_frame_4=bass_max=max(Bass,bass_att); +per_frame_5=wave_mystery=wave_mystery-.2*(1-bass_max); +per_frame_6=echo_Zoom=echo_zoom-0.1+.20*Sin(time*0.95); +per_frame_7=echo_alpha = if(above(bass,1), if(below(sin(time*0.95),0),echo_alpha-0.2,echo_alpha),echo_alpha); +per_frame_8=ob_a = if(above(bass,1), if(below(sin(time*0.95),0),ob_a-0.3,ob_a),ob_a); +per_frame_9=ib_g = ib_g + 0.49*sin(time*4.16); +per_frame_10=ib_r = ib_r + 0.49*sin(time*5.876); +per_frame_11=ib_b = ib_b + 0.49*sin(time*0.846); +per_frame_12=decay = 1.005 + 0.01*sin(0.953*time); +per_frame_13=decay = if(above(decay,1),1,decay); +per_frame_14=zoomexp=zoomexp+zoomexp*sin(treb); +per_pixel_1=zoom=zoom+0.96*sin(rad) ; +per_pixel_2=rot = rot + (rad-1.4)*1.7*max(0.1*log(sqrt(2)-rad),0.1*rad+min((bass_att-1)/1.5,2)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Idiot24-7 - Mixed Emotions (Harlequin's Shame Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=2 +fGammaAdj=1.28 +fDecay=0.994 +fVideoEchoZoom=1.64463 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.475355 +fWaveSmoothing=0.63 +fWaveParam=-0.14 +fModWaveAlphaStart=0.71 +fModWaveAlphaEnd=1.3 +fWarpAnimSpeed=1 +fWarpScale=1.331 +fZoomExponent=63.504501 +fShader=0 +zoom=0.544958 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.01 +sx=1 +sy=1 +wave_r=0.6 +wave_g=0.4999 +wave_b=0.56 +wave_x=0.5 +wave_y=0.5 +ob_size=0.4 +ob_r=1 +ob_g=0 +ob_b=0 +ob_a=0.6 +ib_size=0.02 +ib_r=0.51 +ib_g=0.5 +ib_b=0.5 +ib_a=1 +nMotionVectorsX=0 +nMotionVectorsY=9 +mv_dx=0 +mv_dy=0 +mv_l=0.9 +mv_r=1 +mv_g=1 +mv_b=1 +mv_a=0 +per_frame_1=wave_r=.5-.3*sin(Time*.33); +per_frame_2=wave_b=.5+.3*sin(time*13); +per_frame_3=wave_g=wave_g+.5*Sin(time*1.14); +per_frame_4=bass_max=max(Bass,bass_att); +per_frame_5=wave_mystery=wave_mystery-.2*(1-bass_max); +per_frame_6=echo_Zoom=echo_zoom-0.1+.20*Sin(time*0.95); +per_frame_7=echo_alpha = if(above(bass,1), if(below(sin(time*0.95),0),echo_alpha-0.2,echo_alpha),echo_alpha); +per_frame_8=ob_a = if(above(bass,1), if(below(sin(time*0.95),0),ob_a-0.3,ob_a),ob_a); +per_frame_9=ib_g = ib_g + 0.49*sin(time*4.16); +per_frame_10=ib_r = ib_r + 0.49*sin(time*5.876); +per_frame_11=ib_b = ib_b + 0.49*sin(time*0.846); +per_frame_12=decay = 1.005 + 0.01*sin(0.953*time); +per_frame_13=decay = if(above(decay,1),1,decay); +per_frame_14=zoomexp=zoomexp+zoomexp*sin(treb); +per_pixel_1=zoom=zoom+0.96*sin(rad) ; +per_pixel_2=rot = rot + (rad-1.4)*1.7*max(0.1*log(sqrt(2)-rad),0.1*rad+min((bass_att-1)/1.5,2)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Illusion - Shifting Sphere.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Illusion - Shifting Sphere.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Illusion - Shifting Sphere.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Illusion - Shifting Sphere.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.998000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.875688 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.009091 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=dx = dx + dx_residual; +per_frame_5=dy = dy + dy_residual; +per_frame_6=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_7=dx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_8=dy_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_pixel_1=zoom = if(above(rad,0.4),1.01+0.1*sin(rad), 0.95+0.1*sin(rad)-0.1*sin(1-rad)); +per_pixel_2=rot = 0.4 * (if(above(rad,0.4),cos(rad*2*rad)/25+sin(pow(rad,5))/25,cos(1-rad)/25+sin(rad)/25)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Clouded Judgement Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Clouded Judgement Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Clouded Judgement Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Clouded Judgement Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,253 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=0.018000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.015000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.950000 +ib_g=0.850000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.621747 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=1.884956 +shapecode_0_tex_zoom=0.424973 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=0.700000 +shapecode_0_r2=1.000000 +shapecode_0_g2=0.600000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=//tex_zoom = 0.05*q6; +shape_0_per_frame2=a =1; +shape_0_per_frame3=a1=1; +shape_0_per_frame4=//tex_zoom =0.1; +shape_0_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_0_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_0_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521); +shapecode_1_enabled=1 +shapecode_1_sides=3 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=1.621747 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=1.884956 +shapecode_1_tex_zoom=0.424973 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=0.700000 +shapecode_1_r2=0.700000 +shapecode_1_g2=0.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=//tex_zoom = 0.05*q6; +shape_1_per_frame2=a =1; +shape_1_per_frame3=a1=1; +shape_1_per_frame4=//tex_zoom =0.1; +shape_1_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_1_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_1_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.521); +shapecode_2_enabled=1 +shapecode_2_sides=3 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=1.621747 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=1.884956 +shapecode_2_tex_zoom=0.424973 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=0.700000 +shapecode_2_r2=1.000000 +shapecode_2_g2=0.600000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=//tex_zoom = 0.05*q6; +shape_2_per_frame2=a =1; +shape_2_per_frame3=a1=1; +shape_2_per_frame4=//tex_zoom =0.1; +shape_2_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_2_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_2_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521); +shapecode_3_enabled=1 +shapecode_3_sides=100 +shapecode_3_additive=0 +shapecode_3_thickOutline=1 +shapecode_3_textured=1 +shapecode_3_x=0.900000 +shapecode_3_y=0.900000 +shapecode_3_rad=0.181670 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=1.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=0.000000 +shapecode_3_border_b=0.000000 +shapecode_3_border_a=1.000000 +shape_3_per_frame1=x = 0.5 +0.4*sin(0.1*q8); +shape_3_per_frame2=y = 0.5+0.4*sin(q7*0.19653); +shape_3_per_frame3=textured =1; +per_frame_init_1=q8 =0; +per_frame_init_2=q7=0; +per_frame_1=wave_r = 0.5+ 0.2*(bass-1); +per_frame_2=wave_g = 0.5+ 0.2*(mid-1.2); +per_frame_3=wave_b = 0.5+ 0.2*(treb-.5); +per_frame_4=warp =0; +per_frame_5=ob_r = 1-wave_r; +per_frame_6=ob_g = 1-wave_g; +per_frame_7=ob_b = 1-wave_b; +per_frame_8=ib_r = 0.75 + 0.25*sin(time*0.4123); +per_frame_9=ib_g = 0.25 + 0.25*cos(time*0.87); +per_frame_10=ib_b = 0.5+0.5*sin(1.23*time); +per_frame_11=q8 = oldq8 +0.003*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_frame_12=oldq8 = q8; +per_frame_13=q7 =oldq7+ 0.001*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,7)/fps); +per_frame_14=oldq7 = q7; +per_frame_15=wave_a =0; +per_frame_16=dy = 0.5 + 0.01*(sin(0.786*q7)); +per_frame_17=dx = 0.1*sin(1.143*q8); +per_frame_18=q6 = 15+0.1*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_pixel_1=//dx=dx+0.5*sin((y-0.5)*128); +per_pixel_2=dy=dy+0.008*cos((x-0.5 - 0.1*sin(q7))*(q6)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Dark Secret Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Dark Secret Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Dark Secret Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Dark Secret Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,261 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=4.099998 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=0.018000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.015000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.950000 +ib_g=0.850000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.153926 +mv_g=0.153926 +mv_b=0.714137 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=1 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.621747 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=1.884956 +shapecode_0_tex_zoom=0.424973 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=0.600000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=//tex_zoom = 0.05*q6; +shape_0_per_frame2=a =1; +shape_0_per_frame3=a1=1; +shape_0_per_frame4=//tex_zoom =0.1; +shape_0_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_0_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_0_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.05*sin(time); +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=1.621747 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=1.884956 +shapecode_1_tex_zoom=0.424973 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=0.600000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=//tex_zoom = 0.05*q6; +shape_1_per_frame2=a =1; +shape_1_per_frame3=a1=1; +shape_1_per_frame4=//tex_zoom =0.1; +shape_1_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_1_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_1_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.1*sin(time); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=1.621747 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=1.884956 +shapecode_2_tex_zoom=0.424973 +shapecode_2_r=0.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=0.600000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=//tex_zoom = 0.05*q6; +shape_2_per_frame2=a =1; +shape_2_per_frame3=a1=1; +shape_2_per_frame4=//tex_zoom =0.1; +shape_2_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_2_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_2_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.15*sin(time); +shapecode_3_enabled=1 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=1.621747 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=1.884956 +shapecode_3_tex_zoom=0.424973 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=0.600000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=//tex_zoom = 0.05*q6; +shape_3_per_frame2=a =1; +shape_3_per_frame3=a1=1; +shape_3_per_frame4=//tex_zoom =0.1; +shape_3_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_3_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_3_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.2*sin(time);; +per_frame_init_1=q8 =0; +per_frame_init_2=q7=0; +per_frame_1=wave_r = 0.5+ 0.2*(bass-1); +per_frame_2=wave_g = 0.5+ 0.2*(mid-1.2); +per_frame_3=wave_b = 0.5+ 0.2*(treb-.5); +per_frame_4=warp =0; +per_frame_5=ob_r = 1-wave_r; +per_frame_6=ob_g = 1-wave_g; +per_frame_7=ob_b = 1-wave_b; +per_frame_8=ib_r = 0.75 + 0.25*sin(time*0.4123); +per_frame_9=ib_g = 0.25 + 0.25*cos(time*0.87); +per_frame_10=ib_b = 0.5+0.5*sin(1.23*time); +per_frame_11=q8 = oldq8 +0.003*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_frame_12=oldq8 = q8; +per_frame_13=q7 =oldq7+ 0.001*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,7)/fps); +per_frame_14=oldq7 = q7; +per_frame_15=wave_a =0; +per_frame_16=dy = 0.5 + 0.01*(sin(0.786*q7)); +per_frame_17=dx = 0.1*sin(1.143*q8); +per_frame_18=q6 = 15+0.1*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_frame_19=//q7 =0; +per_frame_20=invert = 1+sin(q8); +per_frame_21=monitor = q8; +per_frame_22=invert =int(1 + sin(0.01*q8)); +per_pixel_1=//dx=dx+0.5*sin((y-0.5)*128); +per_pixel_2=dy=dy+0.008*cos((x-0.5 - 0.1*sin(q7))*(q6)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Distant Memories Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Distant Memories Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Distant Memories Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Distant Memories Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,259 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=0.018000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.015000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.950000 +ib_g=0.850000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=1 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.621747 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=1.884956 +shapecode_0_tex_zoom=0.424973 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=0.600000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=//tex_zoom = 0.05*q6; +shape_0_per_frame2=a =1; +shape_0_per_frame3=a1=1; +shape_0_per_frame4=//tex_zoom =0.1; +shape_0_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_0_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_0_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.05*sin(time); +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=1.621747 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=1.884956 +shapecode_1_tex_zoom=0.424973 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=0.600000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=//tex_zoom = 0.05*q6; +shape_1_per_frame2=a =1; +shape_1_per_frame3=a1=1; +shape_1_per_frame4=//tex_zoom =0.1; +shape_1_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_1_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_1_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.1*sin(time); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=1.621747 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=1.884956 +shapecode_2_tex_zoom=0.449770 +shapecode_2_r=0.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=0.600000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=//tex_zoom = 0.05*q6; +shape_2_per_frame2=a =1; +shape_2_per_frame3=a1=1; +shape_2_per_frame4=//tex_zoom =0.1; +shape_2_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_2_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_2_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.15*sin(time); +shapecode_3_enabled=1 +shapecode_3_sides=4 +shapecode_3_additive=1 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=1.621747 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=1.884956 +shapecode_3_tex_zoom=0.424973 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=0.600000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=//tex_zoom = 0.05*q6; +shape_3_per_frame2=a =1; +shape_3_per_frame3=a1=1; +shape_3_per_frame4=//tex_zoom =0.1; +shape_3_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_3_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_3_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.2*sin(time);; +per_frame_init_1=q8 =0; +per_frame_init_2=q7=0; +per_frame_1=wave_r = 0.5+ 0.2*(bass-1); +per_frame_2=wave_g = 0.5+ 0.2*(mid-1.2); +per_frame_3=wave_b = 0.5+ 0.2*(treb-.5); +per_frame_4=warp =0; +per_frame_5=ob_r = 1-wave_r; +per_frame_6=ob_g = 1-wave_g; +per_frame_7=ob_b = 1-wave_b; +per_frame_8=ib_r = 0.75 + 0.25*sin(time*0.4123); +per_frame_9=ib_g = 0.25 + 0.25*cos(time*0.87); +per_frame_10=ib_b = 0.5+0.5*sin(1.23*time); +per_frame_11=q8 = oldq8 +0.003*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_frame_12=oldq8 = q8; +per_frame_13=q7 =oldq7+ 0.001*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,7)/fps); +per_frame_14=oldq7 = q7; +per_frame_15=wave_a =0; +per_frame_16=dy = 0.5 + 0.01*(sin(0.786*q7)); +per_frame_17=dx = 0.1*sin(1.143*q8); +per_frame_18=q6 = 15+0.1*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_frame_19=//q7 =0; +per_frame_20=decay =0.1; +per_pixel_1=//dx=dx+0.5*sin((y-0.5)*128); +per_pixel_2=dy=dy+0.008*cos((x-0.5 - 0.1*sin(q7))*(q6)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Frantic Thoughts Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Frantic Thoughts Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Frantic Thoughts Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Frantic Thoughts Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,257 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=0.018000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.015000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.950000 +ib_g=0.850000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.621747 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=1.884956 +shapecode_0_tex_zoom=0.424973 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=0.700000 +shapecode_0_r2=1.000000 +shapecode_0_g2=0.600000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=//tex_zoom = 0.05*q6; +shape_0_per_frame2=a =1; +shape_0_per_frame3=a1=1; +shape_0_per_frame4=//tex_zoom =0.1; +shape_0_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_0_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_0_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521); +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=1.621747 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=1.884956 +shapecode_1_tex_zoom=0.424973 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=0.700000 +shapecode_1_r2=1.000000 +shapecode_1_g2=0.600000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=//tex_zoom = 0.05*q6; +shape_1_per_frame2=a =1; +shape_1_per_frame3=a1=1; +shape_1_per_frame4=//tex_zoom =0.1; +shape_1_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_1_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_1_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=1.621747 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=1.884956 +shapecode_2_tex_zoom=0.424973 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=0.700000 +shapecode_2_r2=1.000000 +shapecode_2_g2=0.600000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=//tex_zoom = 0.05*q6; +shape_2_per_frame2=a =1; +shape_2_per_frame3=a1=1; +shape_2_per_frame4=//tex_zoom =0.1; +shape_2_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_2_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_2_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521); +shapecode_3_enabled=1 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=1.621747 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=1.884956 +shapecode_3_tex_zoom=0.424973 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=0.700000 +shapecode_3_r2=1.000000 +shapecode_3_g2=0.600000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=//tex_zoom = 0.05*q6; +shape_3_per_frame2=a =1; +shape_3_per_frame3=a1=1; +shape_3_per_frame4=//tex_zoom =0.1; +shape_3_per_frame5=x = 0.5 + 0.1*sin(q7*0.986); +shape_3_per_frame6=y = 0.5 + 0.1*sin(q7*0.846); +shape_3_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521); +per_frame_init_1=q8 =0; +per_frame_init_2=q7=0; +per_frame_1=wave_r = 0.5+ 0.2*(bass-1); +per_frame_2=wave_g = 0.5+ 0.2*(mid-1.2); +per_frame_3=wave_b = 0.5+ 0.2*(treb-.5); +per_frame_4=warp =0; +per_frame_5=ob_r = 1-wave_r; +per_frame_6=ob_g = 1-wave_g; +per_frame_7=ob_b = 1-wave_b; +per_frame_8=ib_r = 0.75 + 0.25*sin(time*0.4123); +per_frame_9=ib_g = 0.25 + 0.25*cos(time*0.87); +per_frame_10=ib_b = 0.5+0.5*sin(1.23*time); +per_frame_11=q8 = oldq8 +0.003*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_frame_12=oldq8 = q8; +per_frame_13=q7 =oldq7+ 0.001*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,7)/fps); +per_frame_14=oldq7 = q7; +per_frame_15=wave_a =0; +per_frame_16=dy = 0.5 + 0.01*(sin(0.786*q7)); +per_frame_17=dx = 0.1*sin(1.143*q8); +per_frame_18=q6 = 15+0.1*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_pixel_1=//dx=dx+0.5*sin((y-0.5)*128); +per_pixel_2=dy=dy+0.008*cos((x-0.5 - 0.1*sin(q7))*(q6)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Strange Cargo Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Strange Cargo Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Strange Cargo Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Inner Thoughts (Strange Cargo Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,260 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=0.018000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.015000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.950000 +ib_g=0.850000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=1 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.621747 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=1.884956 +shapecode_0_tex_zoom=0.424973 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=0.600000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=//tex_zoom = 0.05*q6; +shape_0_per_frame2=a =1; +shape_0_per_frame3=a1=1; +shape_0_per_frame4=//tex_zoom =0.1; +shape_0_per_frame5=x = 0.5 + 0.1*sin(q7*0.986)+0.01; +shape_0_per_frame6=y = 0.5 + 0.1*sin(q7*0.846)+0.01;; +shape_0_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.05*sin(time); +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=1.621747 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=1.884956 +shapecode_1_tex_zoom=0.424973 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=0.600000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=//tex_zoom = 0.05*q6; +shape_1_per_frame2=a =1; +shape_1_per_frame3=a1=1; +shape_1_per_frame4=//tex_zoom =0.1; +shape_1_per_frame5=x = 0.5 + 0.1*sin(q7*0.986)+0.02; +shape_1_per_frame6=y = 0.5 + 0.1*sin(q7*0.846)+ 0.02; +shape_1_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.1*sin(time); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=1.621747 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=1.884956 +shapecode_2_tex_zoom=0.424973 +shapecode_2_r=0.000000 +shapecode_2_g=1.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=0.600000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=//tex_zoom = 0.05*q6; +shape_2_per_frame2=a =1; +shape_2_per_frame3=a1=1; +shape_2_per_frame4=//tex_zoom =0.1; +shape_2_per_frame5=x = 0.5 + 0.1*sin(q7*0.986)+0.03; +shape_2_per_frame6=y = 0.5 + 0.1*sin(q7*0.846)+0.03; +shape_2_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.15*sin(time); +shapecode_3_enabled=1 +shapecode_3_sides=4 +shapecode_3_additive=1 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=1.621747 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=1.884956 +shapecode_3_tex_zoom=0.424973 +shapecode_3_r=0.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=0.600000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=//tex_zoom = 0.05*q6; +shape_3_per_frame2=a =1; +shape_3_per_frame3=a1=1; +shape_3_per_frame4=//tex_zoom =0.1; +shape_3_per_frame5=x = 0.5 + 0.1*sin(q7*0.986) +0.04; +shape_3_per_frame6=y = 0.5 + 0.1*sin(q7*0.846) +0.04; +shape_3_per_frame7=tex_ang = 3.1515 + 3.1415*sin(q7*0.4521) +0.2*sin(time);; +per_frame_init_1=q8 =0; +per_frame_init_2=q7=0; +per_frame_1=wave_r = 0.5+ 0.2*(bass-1); +per_frame_2=wave_g = 0.5+ 0.2*(mid-1.2); +per_frame_3=wave_b = 0.5+ 0.2*(treb-.5); +per_frame_4=warp =0; +per_frame_5=ob_r = 1-wave_r; +per_frame_6=ob_g = 1-wave_g; +per_frame_7=ob_b = 1-wave_b; +per_frame_8=ib_r = 0.75 + 0.25*sin(time*0.4123); +per_frame_9=ib_g = 0.25 + 0.25*cos(time*0.87); +per_frame_10=ib_b = 0.5+0.5*sin(1.23*time); +per_frame_11=q8 = oldq8 +0.003*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_frame_12=oldq8 = q8; +per_frame_13=q7 =oldq7+ 0.001*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,7)/fps); +per_frame_14=oldq7 = q7; +per_frame_15=wave_a =0; +per_frame_16=dy = 0.5 + 0.01*(sin(0.786*q7)); +per_frame_17=dx = 0.1*sin(1.143*q8); +per_frame_18=q6 = 15+0.1*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)); +per_frame_19=//q7 =0; +per_frame_20=decay =0.2; +per_frame_21=decay =0.1*(bass_att+bass); +per_pixel_1=//dx=dx+0.5*sin((y-0.5)*128); +per_pixel_2=dy=dy+0.008*cos((x-0.5 - 0.1*sin(q7))*(q6)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars (Altars Of Madness MIx).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars (Altars Of Madness MIx).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars (Altars Of Madness MIx).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars (Altars Of Madness MIx).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,209 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.500000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.621810 +fWaveSmoothing=0.558000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.870000 +fModWaveAlphaEnd=1.289900 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.700000 +wave_b=0.700000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=12.799995 +nMotionVectorsY=2.879900 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=3.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=x=x+0.5+0.008*sin((y*2-1)*48)+0.008*sin((y*2-1)*64); +wave_2_per_point2=y=y+0.5+0.008*cos((x*2-1)*64)+0.008*cos((x*2-1)*48); +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.193000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.040000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.900000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.400000 +shape_0_per_frame1=sides = 40*q7; +shape_0_per_frame2=sides = 9; +shape_0_per_frame3=ang = q8*3.4; +shape_0_per_frame4=x = 0.5 + 0.18*cos(q8*0.5) + 0.03*cos(time*0.7); +shape_0_per_frame5=y = 0.5 + 0.18*sin(q8*0.5) + 0.03*sin(time*0.7); +shape_0_per_frame6=r = 0.5 + 0.5*sin(time*0.713 + 1); +shape_0_per_frame7=g = 0.5 + 0.5*sin(time*0.563 + 2); +shape_0_per_frame8=b = 0.5 + 0.5*sin(time*0.654 + 5); +shape_0_per_frame9=r2 = 0.5 + 0.5*sin(time*0.885 + 4); +shape_0_per_frame10=g2 = 0.5 + 0.5*sin(time*0.556+ 1); +shape_0_per_frame11=b2 = 0.5 + 0.5*sin(time*0.638 + 3); +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.340000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.040000 +shapecode_1_r2=0.000000 +shapecode_1_g2=0.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.900000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.400000 +shape_1_per_frame1=sides = 3; +shape_1_per_frame2=ang = q8*2.15; +shape_1_per_frame3=x = 0.5 + 0.18*cos(q8*0.5) + 0.03*cos(time*0.7); +shape_1_per_frame4=y = 0.5 + 0.18*sin(q8*0.5) + 0.03*sin(time*0.7); +shape_1_per_frame5=r = 0.5 - 0.5*sin(time*1.43 + 1); +shape_1_per_frame6=g = 0.5 - 0.5*sin(time*0.583 + 2); +shape_1_per_frame7=b = 0.5 - 0.5*sin(time*0.751 + 5); +shape_1_per_frame8=r2 = 0.5 + 0.5*sin(time*2.845 + 4); +shape_1_per_frame9=g2 = 0.5 + 0.5*sin(time*0.756+ 1); +shape_1_per_frame10=b2 = 0.5 + 0.5*sin(time*0.688 + 3); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.350000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=0.040000 +shapecode_2_r2=0.000000 +shapecode_2_g2=0.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.300000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.400000 +shape_2_per_frame1=sides = 360; +shape_2_per_frame2=ang = q8*1.4; +shape_2_per_frame3=x = 0.5 + 0.18*cos(q8*0.5) + 0.03*cos(time*0.7); +shape_2_per_frame4=y = 0.5 + 0.18*sin(q8*0.5) + 0.03*sin(time*0.7); +shape_2_per_frame5=r = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_2_per_frame6=g = 0.5 + 0.5*sin(q8*0.563 + 2); +shape_2_per_frame7=b = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_2_per_frame8=r2 = 0.5 + 0.5*sin(q8*0.885 + 4); +shape_2_per_frame9=g2 = 0.5 + 0.5*sin(q8*0.556+ 1); +shape_2_per_frame10=b2 = 0.5 + 0.5*sin(q8*0.638 + 3); +per_frame_1=wave_r = wave_r + 0.3*( 0.60*sin(0.633*time) + 0.40*sin(0.845*time) ); +per_frame_2=wave_g = wave_g + 0.3*( 0.60*sin(0.370*time) + 0.40*sin(0.656*time) ); +per_frame_3=wave_b = wave_b + 0.3*( 0.60*sin(0.740*time) + 0.40*sin(0.520*time) ); +per_frame_4=//zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=//rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%50,0); +per_frame_7=q8 =oldq8+ 0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_8=oldq8 = q8; +per_frame_9=q7 =0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_10=zoom=zoom+(q7)*0.01; +per_frame_11=q1 = 0.5 + 0.2*cos(q8*0.87); +per_frame_12=q2 = 0.5 + 0.2*sin(q8*0.87); +per_pixel_1=dx=dx+0.003*sin((y*2-1)*64)+0.001*sin((y*2-1)*96); +per_pixel_2=dy=dy+0.004*cos((x*2-1)*64)+0.002*cos((x*2-1)*96); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,210 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.500000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.621810 +fWaveSmoothing=0.558000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.870000 +fModWaveAlphaEnd=1.289900 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.004000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.700000 +wave_b=0.700000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=28.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=x=x+0.5+0.008*sin((y*2-1)*48)+0.008*sin((y*2-1)*64); +wave_2_per_point2=y=y+0.5+0.008*cos((x*2-1)*64)+0.008*cos((x*2-1)*48); +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.193000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.040000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.900000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.400000 +shape_0_per_frame1=sides = 40*q7; +shape_0_per_frame2=sides = 9; +shape_0_per_frame3=ang = q8*3.4; +shape_0_per_frame4=x = 0.5 + 0.18*cos(q8*0.5) + 0.03*cos(time*0.7); +shape_0_per_frame5=y = 0.5 + 0.18*sin(q8*0.5) + 0.03*sin(time*0.7); +shape_0_per_frame6=r = 0.5 + 0.5*sin(time*0.713 + 1); +shape_0_per_frame7=g = 0.5 + 0.5*sin(time*0.563 + 2); +shape_0_per_frame8=b = 0.5 + 0.5*sin(time*0.654 + 5); +shape_0_per_frame9=r2 = 0.5 + 0.5*sin(time*0.885 + 4); +shape_0_per_frame10=g2 = 0.5 + 0.5*sin(time*0.556+ 1); +shape_0_per_frame11=b2 = 0.5 + 0.5*sin(time*0.638 + 3); +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.340000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.040000 +shapecode_1_r2=0.000000 +shapecode_1_g2=0.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.900000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.400000 +shape_1_per_frame1=sides = 3; +shape_1_per_frame2=ang = q8*2.15; +shape_1_per_frame3=x = 0.5 + 0.18*cos(q8*0.5) + 0.03*cos(time*0.7); +shape_1_per_frame4=y = 0.5 + 0.18*sin(q8*0.5) + 0.03*sin(time*0.7); +shape_1_per_frame5=r = 0.5 - 0.5*sin(time*1.43 + 1); +shape_1_per_frame6=g = 0.5 - 0.5*sin(time*0.583 + 2); +shape_1_per_frame7=b = 0.5 - 0.5*sin(time*0.751 + 5); +shape_1_per_frame8=r2 = 0.5 + 0.5*sin(time*2.845 + 4); +shape_1_per_frame9=g2 = 0.5 + 0.5*sin(time*0.756+ 1); +shape_1_per_frame10=b2 = 0.5 + 0.5*sin(time*0.688 + 3); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.350000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=0.040000 +shapecode_2_r2=0.000000 +shapecode_2_g2=0.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.300000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.400000 +shape_2_per_frame1=sides = 360; +shape_2_per_frame2=ang = q8*1.4; +shape_2_per_frame3=x = 0.5 + 0.18*cos(q8*0.5) + 0.03*cos(time*0.7); +shape_2_per_frame4=y = 0.5 + 0.18*sin(q8*0.5) + 0.03*sin(time*0.7); +shape_2_per_frame5=r = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_2_per_frame6=g = 0.5 + 0.5*sin(q8*0.563 + 2); +shape_2_per_frame7=b = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_2_per_frame8=r2 = 0.5 + 0.5*sin(q8*0.885 + 4); +shape_2_per_frame9=g2 = 0.5 + 0.5*sin(q8*0.556+ 1); +shape_2_per_frame10=b2 = 0.5 + 0.5*sin(q8*0.638 + 3); +per_frame_1=wave_r = wave_r + 0.3*( 0.60*sin(0.633*time) + 0.40*sin(0.845*time) ); +per_frame_2=wave_g = wave_g + 0.3*( 0.60*sin(0.370*time) + 0.40*sin(0.656*time) ); +per_frame_3=wave_b = wave_b + 0.3*( 0.60*sin(0.740*time) + 0.40*sin(0.520*time) ); +per_frame_4=//zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=//rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%50,0); +per_frame_7=q8 =oldq8+ 0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_8=oldq8 = q8; +per_frame_9=q7 =0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_10=zoom=1+(q7)*0.01; +per_frame_11=q1 = 0.5 + 0.2*cos(q8*0.87); +per_frame_12=q2 = 0.5 + 0.2*sin(q8*0.87); +per_frame_13=wave_a =0; +per_pixel_1=//dx=dx+0.008*sin((y*2-1)*48)+0.008*sin((y*2-1)*64); +per_pixel_2=//dy=dy+0.008*cos((x*2-1)*64)+0.008*cos((x*2-1)*48); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars (Round Round Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars (Round Round Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars (Round Round Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Kalideostars (Round Round Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,210 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.994000 +fDecay=1.000000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.621810 +fWaveSmoothing=0.558000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.870000 +fModWaveAlphaEnd=1.289900 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000012 +rot=0.100000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.700000 +wave_g=0.700000 +wave_b=0.700000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=28.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_per_point1=x=x+0.5+0.008*sin((y*2-1)*48)+0.008*sin((y*2-1)*64); +wave_2_per_point2=y=y+0.5+0.008*cos((x*2-1)*64)+0.008*cos((x*2-1)*48); +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.193000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.040000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.900000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.400000 +shape_0_per_frame1=sides = 40*q7; +shape_0_per_frame2=sides = 9; +shape_0_per_frame3=ang = q8*3.4; +shape_0_per_frame4=x = 0.5 + 0.18*cos(q8*0.5) + 0.03*cos(time*0.7); +shape_0_per_frame5=y = 0.5 + 0.18*sin(q8*0.5) + 0.03*sin(time*0.7); +shape_0_per_frame6=r = 0.5 + 0.5*sin(time*0.713 + 1); +shape_0_per_frame7=g = 0.5 + 0.5*sin(time*0.563 + 2); +shape_0_per_frame8=b = 0.5 + 0.5*sin(time*0.654 + 5); +shape_0_per_frame9=r2 = 0.5 + 0.5*sin(time*0.885 + 4); +shape_0_per_frame10=g2 = 0.5 + 0.5*sin(time*0.556+ 1); +shape_0_per_frame11=b2 = 0.5 + 0.5*sin(time*0.638 + 3); +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.340000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.040000 +shapecode_1_r2=0.000000 +shapecode_1_g2=0.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.900000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.400000 +shape_1_per_frame1=sides = 3; +shape_1_per_frame2=ang = q8*2.15; +shape_1_per_frame3=x = 0.5 + 0.18*cos(q8*0.5) + 0.03*cos(time*0.7); +shape_1_per_frame4=y = 0.5 + 0.18*sin(q8*0.5) + 0.03*sin(time*0.7); +shape_1_per_frame5=r = 0.5 - 0.5*sin(time*1.43 + 1); +shape_1_per_frame6=g = 0.5 - 0.5*sin(time*0.583 + 2); +shape_1_per_frame7=b = 0.5 - 0.5*sin(time*0.751 + 5); +shape_1_per_frame8=r2 = 0.5 + 0.5*sin(time*2.845 + 4); +shape_1_per_frame9=g2 = 0.5 + 0.5*sin(time*0.756+ 1); +shape_1_per_frame10=b2 = 0.5 + 0.5*sin(time*0.688 + 3); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.350000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=0.040000 +shapecode_2_r2=0.000000 +shapecode_2_g2=0.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.300000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.400000 +shape_2_per_frame1=sides = 360; +shape_2_per_frame2=ang = q8*1.4; +shape_2_per_frame3=x = 0.5 + 0.18*cos(q8*0.5) + 0.03*cos(time*0.7); +shape_2_per_frame4=y = 0.5 + 0.18*sin(q8*0.5) + 0.03*sin(time*0.7); +shape_2_per_frame5=r = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_2_per_frame6=g = 0.5 + 0.5*sin(q8*0.563 + 2); +shape_2_per_frame7=b = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_2_per_frame8=r2 = 0.5 + 0.5*sin(q8*0.885 + 4); +shape_2_per_frame9=g2 = 0.5 + 0.5*sin(q8*0.556+ 1); +shape_2_per_frame10=b2 = 0.5 + 0.5*sin(q8*0.638 + 3); +per_frame_1=wave_r = wave_r + 0.3*( 0.60*sin(0.633*time) + 0.40*sin(0.845*time) ); +per_frame_2=wave_g = wave_g + 0.3*( 0.60*sin(0.370*time) + 0.40*sin(0.656*time) ); +per_frame_3=wave_b = wave_b + 0.3*( 0.60*sin(0.740*time) + 0.40*sin(0.520*time) ); +per_frame_4=//zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=//rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=decay = decay - 0.01*equal(frame%50,0); +per_frame_7=q8 =oldq8+ 0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_8=oldq8 = q8; +per_frame_9=q7 =0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_10=zoom=1+(q7)*0.01; +per_frame_11=q1 = 0.5 + 0.2*cos(q8*0.87); +per_frame_12=q2 = 0.5 + 0.2*sin(q8*0.87); +per_frame_13=wave_a =0; +per_pixel_1=//dx=dx+0.008*sin((y*2-1)*48)+0.008*sin((y*2-1)*64); +per_pixel_2=//dy=dy+0.008*cos((x*2-1)*64)+0.008*cos((x*2-1)*48); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Cerebral Demons.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Cerebral Demons.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Cerebral Demons.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Cerebral Demons.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,104 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.993998 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.334693 +fWaveSmoothing=0.750000 +fWaveParam=-0.219900 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=0.999900 +rot=0.100000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.400000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_3=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.722)); +per_frame_4=wave_g = wave_g + 0.4*sin(time*1.931); +per_frame_5=vol = 0.167*(bass+mid+att); +per_frame_6=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_7=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_8=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_9=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_10=xpos = xpos + 0.001*xspeed; +per_frame_11=wave_x = 1.25*xpos + 0.5; +per_frame_12=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_13=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_14=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_15=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_16=ypos = ypos + 0.001*yspeed; +per_frame_17=wave_y = 1.25*ypos + 0.5; +per_frame_18=dx = dx + dx_residual; +per_frame_19=dy = dy + dy_residual; +per_frame_20=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_21=dx_residual = equal(bass_thresh,2)*0.003*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_22=dy_residual = equal(bass_thresh,2)*0.001*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_frame_23=rot = 0.1; +per_frame_24=q2=1.1*xpos +0.25*ypos + 0.5; +per_frame_25=q1=1.1*ypos +0.25*xpos + 0.5; +per_frame_26=ib_r = 0.3+xpos; +per_frame_27=ib_b = 0.06*bass; +per_frame_28=ib_g = 0.25+ypos; +per_frame_29=monitor =ib_g; +per_pixel_1=cx = (0&(x*10-0.5))*0.1+0.05; +per_pixel_2=cy = (0&(y*10-0.5))*0.1+0.05; +per_pixel_3=newx = q1-x; +per_pixel_4=newy = q2-y; +per_pixel_5=newrad = sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2; +per_pixel_6=newzoom = pow(1.05 + 0.03*newrad, pow(0.01+sin(newrad*newrad), newrad*2-1)); +per_pixel_7=dx = (newx)*newzoom - newx; +per_pixel_8=dy = (newy)*newzoom - newy; +per_pixel_9=dx =dx*0.1; +per_pixel_10=dy=dy*0.1; +per_pixel_11=rot = 2*newrad*(0.5*(0.5-rad)+0.1); +per_frame_init_1=decay = 10000001; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Flowing Synergy.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Flowing Synergy.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Flowing Synergy.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Flowing Synergy.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.950000 +fVideoEchoZoom=0.455629 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=0.001000 +fWaveScale=0.993020 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=53.523743 +fWarpScale=0.274296 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.999900 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.000000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.450000 +ob_r=1.000000 +ob_g=0.900000 +ob_b=0.000000 +ob_a=0.014000 +ib_size=0.250000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=0.940000 +ib_a=0.050000 +nMotionVectorsX=63.936001 +nMotionVectorsY=47.952000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.200000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.120000 +per_frame_1=q1 = min((2*bass_att + mid_att + treb_att) *0.33,2); +per_frame_2=q2 = time*10 + 5*(bass + mid + treb); +per_frame_3=wave_g = 0.2 + 0.2*sin(time*1.672); +per_frame_4=wave_r = 0.5 + 0.2*cos((time+frame)*1.34); +per_frame_5=wave_b = 0.6 + 0.2*sin(time*0.934); +per_pixel_1=inside = if (below(abs(x-0.5),0.5),if (below(abs(y-0.5),0.25),1,0),0); +per_pixel_2=outsidex = if(below(abs(16*x%2),0.25),0,1); +per_pixel_3=outsidey = if(below(abs(12*y%2),0.25),0,1); +per_pixel_4=warp = 0.6*warp*abs(1-inside); +per_pixel_5=dy = if(outsidex,0,0.03*(q1-1)*log(2-(abs(y*2 - 1.8))) + 0.01*(sin((x*q2*0.483) + (y*q2*1.238)) + sin((x*q2*1.612) + (y*q2*0.648)))); +per_pixel_6=dx = if(outsidey,0,0.04*(q1-1)*log(2-(abs(x*2 - 1.8))) + 0.01*(cos((y*q2*0.483) + (x*q2*1.238)) + cos((y*q2*1.612) + (x*q2*0.648)))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Interwoven (Contra Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Interwoven (Contra Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Interwoven (Contra Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Krash - Interwoven (Contra Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,109 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=1.816695 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.091806 +fWaveSmoothing=0.750000 +fWaveParam=-0.480000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.950000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=31.199999 +nMotionVectorsY=2.280001 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=2.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.800000 +mv_a=0.100000 +per_frame_1=warp=0; +per_frame_2= +per_frame_3=framethird = frame%3; +per_frame_4= +per_frame_5=q8 =oldq8+ min(0.007*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps),0.1); +per_frame_6=oldq8 = q8; +per_frame_7=q7= 0.007*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps); +per_frame_8=q6 =oldq6+ 0.0001*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_9=oldq6 = q6; +per_frame_10= +per_frame_11=x1 = 0.5 + 0.15*sin(0.416*q8) + 0.15*sin(0.832*q8) + 0.1*sin(1.324*q8); +per_frame_12=x2 = 0.5 + 0.15*sin(0.341*q8) + 0.15*sin(0.768*q8) + 0.1*sin(1.523*q8); +per_frame_13=x3 = 0.5 + 0.15*sin(0.287*q8) + 0.15*sin(0.913*q8) + 0.1*sin(1.142*q8); +per_frame_14=y1 = 0.8 + 0.05*sin(0.516*q8) + 0.05*sin(0.232*q8) + 0.05*sin(1.024*q8); +per_frame_15=y2 = 0.8 + 0.05*sin(0.341*q8) + 0.05*sin(0.768*q8) + 0.05*sin(1.093*q8); +per_frame_16=y3 = 0.8 + 0.05*sin(0.301*q8) + 0.05*sin(0.873*q8) + 0.05*sin(1.251*q8); +per_frame_17=r1 = 0.5 + 0.15*sin(0.512*time) + 0.15*sin(0.943*time) + 0.1*sin(1.024*time); +per_frame_18=r2 = 0.5 + 0.15*sin(0.483*time) + 0.15*sin(0.879*time) + 0.1*sin(1.423*time); +per_frame_19=r3 = 0.5 + 0.15*sin(0.531*time) + 0.15*sin(0.671*time) + 0.1*sin(1.442*time); +per_frame_20=g1 = 0.5 + 0.15*sin(0.248*time) + 0.15*sin(0.829*time) + 0.1*sin(1.623*time); +per_frame_21=g2 = 0.5 + 0.15*sin(0.461*time) + 0.15*sin(0.699*time) + 0.1*sin(1.254*time); +per_frame_22=g3 = 0.5 + 0.15*sin(0.397*time) + 0.15*sin(0.768*time) + 0.1*sin(1.157*time); +per_frame_23=b1 = 0.5 + 0.15*sin(0.211*time) + 0.15*sin(0.652*time) + 0.1*sin(1.865*time); +per_frame_24=b2 = 0.5 + 0.15*sin(0.333*time) + 0.15*sin(0.978*time) + 0.1*sin(1.359*time); +per_frame_25=b3 = 0.5 + 0.15*sin(0.475*time) + 0.15*sin(0.791*time) + 0.1*sin(1.011*time); +per_frame_26=wave_x = if(equal(framethird,0),x1,if(equal(framethird,1),x2,x3)); +per_frame_27=wave_y = if(equal(framethird,0),y1,if(equal(framethird,1),y2,y3)); +per_frame_28=wave_r = if(equal(framethird,0),r1,if(equal(framethird,1),r2,r3)); +per_frame_29=wave_g = if(equal(framethird,0),g1,if(equal(framethird,1),g2,g3)); +per_frame_30=wave_b = if(equal(framethird,0),b1,if(equal(framethird,1),b2,b3)); +per_frame_31= +per_frame_32=volume = 0.3*(bass+mid); +per_frame_33=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_34=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_35=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_36=peakbass_att = max(bass_att,peakbass_att); +per_frame_37=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_38=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_39=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.99 + (1-above(time - lastbeat, 2*beatrate))*0.998); +per_frame_40=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_41=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_42=dx = beat; +per_frame_43=mv_a = beat; +per_pixel_1=dy = 0.001+0.008*q7 + 0.001*sin(12*x+3.059*q6) + 0.001*sin(24*x+2.025*q6) + 0.001*sin(1.231*q8); +per_pixel_2=dx = dx + 0.0001*sin(9*y+0.612*q6) + 0.0001*sin(13*y+0.429*q6) + 0.0001*sin(1.027*q8); +per_frame_init_1=oldq8 = time*0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - LabFunk.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - LabFunk.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - LabFunk.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - LabFunk.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.940000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=10.039368 +fWaveScale=0.461371 +fWaveSmoothing=0.450000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999922 +fShader=0.000000 +zoom=0.773208 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.005000 +dy=0.000000 +warp=0.198054 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.310000 +ob_g=0.200000 +ob_b=0.100000 +ob_a=0.200000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.050000 +ib_b=0.000000 +ib_a=0.300000 +per_frame_1=tt = time/100; +per_frame_2=ob_size = abs(cos(time))/5 - 0.3 + bass/8; +per_frame_3=ib_size = abs(sin(time))/5 - 0.3 + treble/7; +per_frame_4=ob_r = sin(3*tt)/4+0.75; +per_frame_5=ib_b = sin(tt)/2 +0.5; +per_frame_6=ob_a = 2*bass_att-0.5 ; +per_frame_7=ib_a = 2*treble_att-0.5; +per_frame_8=wave_r = sin(4*tt)/3 +0.3; +per_frame_9=wave_b = atan(3*tt)/2 +1; +per_frame_10=wave_g = cos(tt)/2 + 1; +per_pixel_1=rot = if(above(bass_att,1.1),-sin(rad)/2, sin(rad)/2); +per_pixel_2=cx = abs(sin(rad)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Lost Souls of the Bermuda Triangle (Darkest Soul.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Lost Souls of the Bermuda Triangle (Darkest Soul.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Lost Souls of the Bermuda Triangle (Darkest Soul.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Lost Souls of the Bermuda Triangle (Darkest Soul.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,99 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.994000 +fDecay=0.999000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=4.099998 +fWaveScale=0.316113 +fWaveSmoothing=0.594000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000995 +sy=1.000000 +wave_r=0.050000 +wave_g=0.100000 +wave_b=0.100000 +wave_x=0.920000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.030000 +ob_b=0.070000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.040000 +nMotionVectorsX=63.936001 +nMotionVectorsY=1.056000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = 0.7+0.3*sin(time*1.125) + 0.1*sin(time*0.145) + 0.1*tan(frame); +per_frame_2=wave_y = wave_y + 0.1*sin(20*time); +per_frame_3=sx = 1.0006; +per_frame_4=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_5=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_6=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_7=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_8=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_9=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_10=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_11=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_12=lastbeat = if(beat,time,lastbeat); +per_frame_13=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_14=beatcounter = if(above(beat,0),beatcounter +1, beatcounter); +per_frame_15=beatcounter = if(above(beatcounter,7), 0, beatcounter); +per_frame_16=beateven = beatcounter%2; +per_frame_17=monitor = beatcounter; +per_frame_18=wave_b = if(LifeSign,1-0.05*beatcounter+0.2*sin(time*0.142),wave_b); +per_frame_19=wave_g = if(LifeSign,1-0.05*beatcounter+0.2*sin(time*0.265),wave_g); +per_frame_20=Darkness = if(above(beatcounter,0),if(below(beatcounter,5),1,0),0); +per_frame_21=ib_b = 0.3+0.13*(sin(0.87*time)-1.15*sin(time*0.365)); +per_frame_22=ib_r = 0.3+0.13*(sin(0.97*time)-0.8*sin(time*0.365)); +per_frame_23=ib_g = 0.3+0.13*(sin(0.831*time)-1.1*sin(time*0.665)); +per_frame_24=ib_r = if(Darkness,0.6,ib_r); +per_frame_25=ib_b = if(Darkness,0.6,ib_b); +per_frame_26=ib_g = if(Darkness,0.6,ib_g); +per_frame_27=ib_a = if(Darkness,0.3-0.05*beatcounter,ib_a); +per_frame_28=LifeSign = Beat; +per_frame_29=wave_mode = if(LifeSign,0,wave_mode); +per_frame_30=wave_mystery = if(LifeSign,-0.5,wave_mystery); +per_frame_31=wave_y = if(LifeSIgn,0.9,wave_y); +per_frame_32=wave_x = if(LifeSIgn,0.5-0.45*sin(bass*treb*50),wave_x); +per_frame_33=wave_r = if(LifeSign,0.6,wave_r); +per_pixel_1=dy = 0.0003+0.009*(y+0.05*(bass+bass_att)); +per_pixel_2=dx = 0.0003*sin(rad-time+(0.5*ang)); +per_frame_init_1=beatcounter = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Magic Carpet.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Magic Carpet.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Magic Carpet.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Magic Carpet.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.994000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=8 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.013223 +fWaveSmoothing=0.630000 +fWaveParam=-0.340000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.100000 +wave_y=0.860000 +ob_size=0.000000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=0.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=2.400000 +mv_dx=0.000000 +mv_dy=-0.100000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_3=oldq8 = q8; +per_frame_4=ib_r = 0.5+0.5*sin(1.123*q8); +per_frame_5=ib_g = 0.5+0.5*sin(q8*1.576); +per_frame_6=ib_b = 0.5+0.5*cos(q8*1.465); +per_frame_7=wave_a=0; +per_frame_8=decay = 0.990 + abs(0.01*sin(0.321*q8)); +per_pixel_1=dx = 0.008*sin(100*y+(q8*y)); +per_pixel_2=dy = 0.008*sin(100*x+(q8*x)); +per_frame_init_1=q8=0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Mosaics Of Ages.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Mosaics Of Ages.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Mosaics Of Ages.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Mosaics Of Ages.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,97 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.640100 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.010000 +fShader=0.000000 +zoom=0.998531 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.960000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.900000 +ob_b=0.200000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=9.599999 +nMotionVectorsY=9.000000 +mv_dx=-0.220000 +mv_dy=0.000000 +mv_l=0.050000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.3 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_2=ob_g = 0.6- 0.4*sin(time*2.924); +per_frame_3=ob_b = 0.35 - 0.3*cos(time*0.816); +per_frame_4=warp =0; +per_frame_5=ib_size = 0.02; +per_frame_6=ib_r = ib_r + 0.5*sin(time*3.034); +per_frame_7=ib_g = ib_g + 0.5*sin(time*2.547); +per_frame_8=ib_b = ib_b - 0.5*sin(time*1.431); +per_frame_9=dx = dx -0.008*sin(time*0.23); +per_frame_10=dy = dy - 0.008*sin(time*0.2); +per_frame_11= +per_frame_12=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_13=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_14=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_15=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_16=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_17=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_18=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_19=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_20=lastbeat = if(beat,time,lastbeat); +per_frame_21=beatcounter = if(above(beat,0),beatcounter +1, beatcounter); +per_frame_22=beatcounter = if(above(beatcounter,7), 0, beatcounter); +per_frame_23=beateven = beatcounter%2; +per_frame_24=//dx = dx + beateven*0.01; +per_frame_25=q2 = beateven; +per_pixel_1=qx = (0&(x*10-0.5))*0.1+0.05; +per_pixel_2=qy = (0&(y*10-0.5))*0.1+0.05; +per_pixel_3=box=(1-rad)+0.5*abs(x*3-0.4*sin(q1))%2 + 0.5*abs(y*3+0.4*sin(q1))%2; +per_pixel_4=box = 3*qy+3*qx; +per_pixel_5=q1 = 8.05+(sin(x+0.137*time)-cos(y+0.213*time)); +per_pixel_6=zoom = if(above(box,1.5),q1*.1,zoom); +per_pixel_7=rot = if(above(box,1.5),1*sin(0.385*time),rot); +per_pixel_8=cx= q2*(0&(x*4-0.5))*0.25+0.05; +per_pixel_9=cy= q2*(0&(y*4-0.5))*0.25+0.05; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Multiverse Starfield 1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Multiverse Starfield 1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Multiverse Starfield 1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Multiverse Starfield 1.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.960000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.704175 +fWaveScale=0.031716 +fWaveSmoothing=0.630000 +fWaveParam=-0.800000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.980296 +sy=1.000000 +wave_r=0.000000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=wave_mystery = 2; +per_frame_3=zoom = 1.4 +0.15*cos(time*0.42); +per_frame_4=rot = 0.01*sin(1.34*time); +per_frame_5=dx = 0.005*sin(time*0.646); +per_frame_6=dy=0.005*sin(time*0.314); +per_frame_7=cx = 0.5 + 0.05*sin(0.497*time); +per_frame_8=cy = 0.5 +0.05*sin(0.413*time); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Multiverse Starfield 3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Multiverse Starfield 3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Multiverse Starfield 3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Multiverse Starfield 3.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.300000 +fDecay=0.960000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.704175 +fWaveScale=0.031716 +fWaveSmoothing=0.630000 +fWaveParam=-0.800000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.980296 +sy=1.000000 +wave_r=0.000000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=wave_mystery = 2; +per_pixel_1=zoom = 1.8 +0.04*cos(time*0.857) + atan(atan(0.5*sqrt(2)-rad)*1.5*rad); +per_pixel_2=rot = 0.03*sin(0.84*time)-0.013*cos(0.784*time)+0.02*sin(1-rad); +per_pixel_3=dx = 0.02*sin(time*0.46)*(0.5*sqrt(2)-rad)+0.015*sin(time*0.511); +per_pixel_4=dy=0.02*sin(time*0.54)*(0.5*sqrt(2)-rad)+0.013*cos(time*0.633); +per_pixel_5=cx = 0.5 + 0.1*sin(0.97*time)*(rad*rad); +per_pixel_6=cy = 0.5 +0.1*sin(0.613*time)*(rad*rad); +per_pixel_7=zoomexp = 0.8-0.2*(1-rad)+0.2*sin(-rad*rad)+0.1*sin(time*0.669); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Omnipresence Resurrection.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Omnipresence Resurrection.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Omnipresence Resurrection.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Omnipresence Resurrection.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,89 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.700000 +fDecay=0.970000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.020000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.020000 +ib_r=0.950000 +ib_g=0.850000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.3*sin(time*1.254); +per_frame_2=wave_g = wave_g +0.3*sin(time*0.952); +per_frame_3=wave_b = wave_b + 0.3*sin(time*0.824); +per_frame_4=ob_r = 0.5 + 0.4*sin(time*1.324); +per_frame_5=ob_g = 0.5 + 0.4*cos(time*1.371); +per_frame_6=ob_b = 0.5+0.4*sin(2.332*time); +per_frame_7=ib_r = 0.5 + 0.25*sin(time*1.424); +per_frame_8=ib_g = 0.25 + 0.25*cos(time*1.871); +per_frame_9=ib_b = 0.5+0.5*sin(2.273*time); +per_frame_10=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att); +per_frame_11=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_12=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_13=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_14=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_15=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_16=xpos = xpos + 0.001*xspeed; +per_frame_17=dx = xpos; +per_frame_18=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_19=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_20=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_21=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_22=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_23=ypos = ypos + 0.001*yspeed; +per_frame_24=dy = ypos; +per_pixel_1=myzoom = log(sqrt(2)-rad) -0.25; +per_pixel_2=zoom = if(above(rad,0.4),myzoom,(0.5*sqrt(2)-rad)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Omnipresence Resurrection (Raw Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Omnipresence Resurrection (Raw Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Omnipresence Resurrection (Raw Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Omnipresence Resurrection (Raw Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,86 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.700000 +fDecay=0.940000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.020000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.020000 +ib_r=0.950000 +ib_g=0.850000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ob_r = 0.5 + 0.4*sin(time*1.324); +per_frame_2=ob_g = 0.5 + 0.4*cos(time*1.371); +per_frame_3=ob_b = 0.5+0.4*sin(2.332*time); +per_frame_4=ib_r = 0.5 + 0.25*sin(time*1.424); +per_frame_5=ib_g = 0.25 + 0.25*cos(time*1.871); +per_frame_6=ib_b = 1-ob_b; +per_frame_7=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att); +per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_11=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_13=xpos = xpos + 0.001*xspeed; +per_frame_14=dx = xpos; +per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_18=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_19=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_20=ypos = ypos + 0.001*yspeed; +per_frame_21=dy = ypos; +per_frame_22=wave_a = 0; +per_pixel_1=zoom = log(sqrt(2)-rad) -0.24; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Oozing Resistance.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Oozing Resistance.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Oozing Resistance.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Oozing Resistance.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999513 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.000000 +per_frame_1=ob_r = 0.5+0.5*sin(2*time); +per_frame_2=ob_g = 0.5+0.5*sin(1.23*time); +per_frame_3=ob_b = 0.5+0.5*sin(time*1.321); +per_frame_4=wave_a =0; +per_frame_5=q8 =oldq8+ 0.003*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_6=oldq8 = q8; +per_frame_7=warp=0; +per_pixel_1=rot = 0.1*(rad+cos((5+5*sin(q8*1.211)*x)-0.5) -sin(((5+5*sin(q8*0.973))*y)-0.5)); +per_pixel_2=dx = 0.005*(cos((5+5*sin(q8*1.311)*x)-0.5) -sin(((5+5*sin(q8*0.9431))*y)-0.5)); +per_pixel_3=dy = 0.005*(cos((5+5*sin(q8*1.021)*x)-0.5) -sin(((5+5*sin(q8*0.987))*y)-0.5)); +per_pixel_4=zoom =1- 0.005*(rad+cos((5+5*sin(q8*0.943)*x)-0.5) -sin(((5+5*sin(q8*1.0961))*y)-0.5)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Pandora's Volcano.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Pandora's Volcano.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Pandora's Volcano.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Pandora's Volcano.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.925000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.627609 +fWaveSmoothing=0.108000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.070500 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.005000 +dy=0.000000 +warp=0.198054 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.040000 +ob_size=0.000000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.059900 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=tt = time/2; +per_frame_2=wave_r = 1; +per_frame_3=wave_b = 0.4 + sin(tt)/3; +per_frame_4=wave_g = 0.5 - cos(2*tt)/4; +per_frame_5=sy = 1.1 + progress/10; +per_pixel_1=sx = tan(pow(y,2))-log(y); +per_pixel_2=zoom = 1.0 + sin(rad)/5 + progress/10; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Parallel Universe.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Parallel Universe.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Parallel Universe.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Parallel Universe.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.990000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.032378 +fWaveSmoothing=0.630000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.045000 +wave_y=0.940000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=4.400000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=wave_r = 0.5+0.5*sin(time); +per_frame_2=wave_r = 0.5+0.5*sin(time); +per_frame_3=xwave_a = 0; +per_frame_4=ib_b = 0.5+0.3*sin(time*2.314); +per_frame_5=ib_r = 0.7+0.3*sin(time*1.867); +per_frame_6=q8 = if(above(bass,1.2),2*bass,0.5); +per_frame_7=q7 = if(above(bass_att,1.2),2*bass_att,0.5); +per_frame_8=q6 = if(above(bass+bass_att,2.3),bass+bass_att,0.5); +per_frame_9=warp =0; +per_frame_10=q5 = if(above(treb+treb_att,2.8),1,0); +per_frame_11=monitor = q5; +per_frame_12=ib_g = q5; +per_pixel_1=myx = x-0.5; +per_pixel_2=myy = y-0.5; +per_pixel_3=q1 =0.1*sqrt(x*x+y*y); +per_pixel_4=q1 = 0.05*(x+y); +per_pixel_5=dy = q1*abs(sin(50*bass)); +per_pixel_6=dx = q1*abs(sin(50*bass_att)); +per_pixel_7=dy = 0.2*q1*q6; +per_pixel_8=dx=0.2*q1*q6; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Answer.42 (Trippy S. Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Answer.42 (Trippy S. Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Answer.42 (Trippy S. Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Answer.42 (Trippy S. Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.998000 +fDecay=0.996700 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.150351 +fWaveScale=100.000000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.961900 +rot=-0.010000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=0.905287 +wave_r=0.850000 +wave_g=0.450000 +wave_b=0.300000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=19.199999 +mv_l=5.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.100000 +per_frame_1=wave_r = wave_r + 0.15*(0.6*sin(0.933*time) + 0.4*sin(1.072*time)); +per_frame_2=wave_g = wave_g + 0.15*(0.6*sin(0.888*time) + 0.4*sin(0.918*time)); +per_frame_3=wave_b = wave_b + 0.25*(0.6*sin(0.335*time) + 0.4*sin(0.4*time)); +per_frame_4=wave_mystery = 0.5*sin(0.35*bass); +per_frame_5=decay = decay - 0.01*equal(frame%10,0); +per_pixel_1=zoom = zoom + (0.1*(1+rad+0.5*bass)); +per_pixel_2=mymovement = sin(sin(1.211*time)+ 0.3*cos(0.887*time)- 0.4*sin(1.453*time)); +per_pixel_3=rot = rot - 0.15*sin(mymovement-ang); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Headspin.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Headspin.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Headspin.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Headspin.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,85 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.990000 +fVideoEchoZoom=0.999600 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.060957 +fWaveSmoothing=0.900000 +fWaveParam=-0.280000 +fModWaveAlphaStart=0.030000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.396381 +fWarpScale=0.720100 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.959069 +rot=0.500000 +cx=0.500000 +cy=0.500000 +dx=-0.002000 +dy=-0.002000 +warp=0.010000 +sx=1.000000 +sy=0.999999 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.010000 +ib_r=0.230000 +ib_g=0.230000 +ib_b=0.230000 +ib_a=0.499900 +nMotionVectorsX=1.384000 +nMotionVectorsY=4.320006 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = 0.225*mid_att; +per_frame_3=wave_g = 0.213*treb_att; +per_frame_4=wave_b = 0.235*bass_att; +per_frame_5=wave_mystery = wave_mystery + 0.15*sin(0.5*time); +per_frame_6=cx = cx + 0.1*sin(0.2*time); +per_frame_7=cy = cy + 0.1*sin(0.4*time); +per_frame_8=decay = decay + 0.01*sin(time); +per_frame_9=mv_x = 1.5; +per_frame_10=mv_y = 3 + 0.1*sin(time); +per_frame_11=mv_b = 0.5+0.4*sin(time*0.863); +per_frame_12=mv_g = 0.5+0.45*sin(time*0.523); +per_frame_13=mv_r = 0.5+0.45*sin(time*0.98); +per_frame_14=mv_l = 0.1+ 0.45*mv_y ; +per_frame_15=mv_dx = 0.5*(1-bass)+0.5*sin(time*1.1); +per_frame_16=mv_dy = 0.5*(1-bass)+0.5*sin(time*0.985); +per_frame_17=ob_r =max(bass+bass_att+treb+treb_att-5.5,0); +per_frame_18=ib_b = 0.5*max(bass-1,0); +per_frame_19=monitor = ob_r; +per_frame_20=ob_b = 0.12+0.1*sin(time*12); +per_frame_21=ob_g = 0.12+ 0.1*sin(5*time); +per_frame_22=warp =0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Sugar Spun Sister.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Sugar Spun Sister.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Sugar Spun Sister.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Rocke - Sugar Spun Sister.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.994000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.900000 +fWaveScale=1.116811 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.961900 +rot=-0.010000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.900000 +wave_g=0.450000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.500000 +ib_g=0.570000 +ib_b=0.400000 +ib_a=0.000000 +nMotionVectorsX=63.936001 +nMotionVectorsY=47.952000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.050000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.800000 +mv_a=0.100000 +per_frame_1=wave_r = wave_r + 0.1*(0.6*sin(0.933*time) + 0.4*sin(1.072*time)); +per_frame_2=wave_g = wave_g + 0.1*(0.6*sin(0.888*time) + 0.4*sin(0.918*time)); +per_frame_3=wave_b = wave_b + 0.2*(0.6*sin(0.335*time) + 0.4*sin(0.4*time)); +per_frame_4=wave_mystery = 0.5*sin(0.35*bass); +per_frame_5=decay = decay - 0.01*equal(frame%50,0); +per_frame_6=mv_b = mv_b + 0.2*sin(time*1.411); +per_frame_7=cx = cx + 0.08*sin(time*1.315); +per_frame_8=cy = cy + 0.08*sin(time*1.127); +per_frame_9=q1 = sin(sin(1.211*time)+ cos(0.887*time)-sin(1.453*time)); +per_pixel_1=zoom = zoom + (0.1*rad); +per_pixel_2=rot = rot - 0.15*sin(q1-ang); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Sea Shells.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Sea Shells.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Sea Shells.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Sea Shells.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,243 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.893664 +fWaveSmoothing=0.600000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.995000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=-0.002000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.400000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.330038 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = q1; +shape_0_per_frame2=y = 1- q2; +shape_0_per_frame3=r = 0.5 + 0.49*sin(time*0.467); +shape_0_per_frame4=b = 0.5 + 0.49*sin(time*0.568); +shape_0_per_frame5=g = 0.5 + 0.49*sin(time*0.669); +shape_0_per_frame6=r2 = 0.1*(bass+bass_att); +shape_0_per_frame7=b2 = r2; +shape_0_per_frame8=g2 = r2; +shape_0_per_frame9=rad = 0.5*r2 + 0.1; +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.480*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.370*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=warp=0; +per_frame_5=zoom =1; +per_frame_6=rot=0; +per_frame_7=decay =0.99; +per_frame_8=decay =1; +per_frame_9=ib_r = 0.16 + 0.15*sin(time*0.783); +per_frame_10=ib_g = 0.16 + 0.15*sin(time*0.895); +per_frame_11=ib_b = 0.75 +0.24*sin(time*1.134); +per_frame_12=ib_size = 0.005*above(bass+bass_att,2.8); +per_frame_13= +per_frame_14=movement =movement + 0.5*(((bass+bass_att + 0.075*pow((bass+0.6*bass_att+0.2*treb_att),3)))/fps); +per_frame_15=movement = if(above(movement,10000), 0, movement); +per_frame_16= +per_frame_17=q1 = 0.5+0.1*sin(movement); +per_frame_18=q2 = 0.5-0.1*cos(0.781*movement); +per_frame_19=q3 = movement; +per_frame_20=wave_x = q1; +per_frame_21=wave_y = 1-q2; +per_pixel_1=newx =x- q1; +per_pixel_2=newy =y- q2; +per_pixel_3=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_4=effect = newrad*((0.9+0.2*sin(q3*0.23))*y)*((0.9+0.2*sin(q3*0.197))*x); +per_pixel_5=dy=-0.007*cos(pow((sqrt(2)-effect),5)*10); +per_pixel_6=dx=-0.007*sin(pow((sqrt(2)-effect),5)*10); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Snapshot Of Space.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Snapshot Of Space.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Snapshot Of Space.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Snapshot Of Space.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=4.000000 +fGammaAdj=2.000000 +fDecay=0.981000 +fVideoEchoZoom=1.047463 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.900000 +fWaveScale=2.905229 +fWaveSmoothing=0.600000 +fWaveParam=-0.300000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=2.630064 +fShader=0.000000 +zoom=1.031000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=24.986328 +nMotionVectorsY=20.030640 +mv_dx=0.064545 +mv_dy=0.109009 +mv_l=0.035858 +mv_r=0.816156 +mv_g=0.098993 +mv_b=0.816156 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.100*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.100*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=mv_r = wave_r; +per_frame_5=mv_b = wave_b; +per_frame_6=mv_g = wave_g; +per_frame_7=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_8=oldq8 = q8; +per_frame_9=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_10=q5_residual = equal(bass_thresh,2)*0.0064*sin(q8*5) + (1-equal(bass_thresh,2))*q5_residual; +per_frame_11=q6_residual = equal(bass_thresh,2)*0.0048*sin(q8*6) + (1-equal(bass_thresh,2))*q6_residual; +per_frame_12=dx=q5_residual ; +per_frame_13=dy=q6_residual ; +per_frame_14=q1 = 0.03*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_15=monitor = q1; +per_frame_16=mv_a = bass-1.2; +per_pixel_1=zoom = 0.9 + 0.1*q1 + rad*0.1; +per_pixel_2=zoomexp = 2*zoom; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Solarized Space.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Solarized Space.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Solarized Space.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Solarized Space.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,107 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.994000 +fDecay=0.960000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=1 +bInvert=1 +fWaveAlpha=1.882469 +fWaveScale=0.000000 +fWaveSmoothing=0.630000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.980296 +sy=1.000000 +wave_r=1.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.001500 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=wave_mystery = -0.5; +per_frame_3=vol = 0.167*(bass+mid); +per_frame_4=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_5=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_6=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_7=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_8=xpos = xpos + 0.001*xspeed; +per_frame_9=myx = 1.25*xpos + 0.5; +per_frame_10=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_11=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_12=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_13=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_14=ypos = ypos + 0.001*yspeed; +per_frame_15=myy = 1.25*ypos + 0.5; +per_frame_16= +per_frame_17=cx = 0.5 + 0.05*sin(0.497*time); +per_frame_18=cy = 0.5 +0.05*sin(0.413*time); +per_frame_19=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_20=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_21=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_22=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_23=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_24=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_25=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_26=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_27=lastbeat = if(beat,time,lastbeat); +per_frame_28=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_29=beatcounter = if(above(beat,0),beatcounter +1, beatcounter); +per_frame_30=beatcounter = if(above(beatcounter,8), 0, beatcounter); +per_frame_31=beateven = beatcounter%4; +per_frame_32=mode = if(beat,(mode+rand(3)+1)%4,mode); +per_frame_33=beateven = if(equal(beateven,3),-1,beateven); +per_frame_34=beateven = if(equal(beateven,0),0.1*(myx+myy),beateven); +per_frame_35=beateven = if(equal(beateven,2),0.1*(-myx-myy),beateven); +per_frame_36=dx = 0.1*beateven*myx; +per_frame_37=dy = 0.1*beateven*myy; +per_frame_38=monitor = beateven; +per_frame_39=wave_a = Bass_thresh; +per_frame_40=zoom = 1.5 +0.25*myy; +per_frame_41=rot = myx*beateven; +per_frame_42=wave_x = 0.5 + 0.05*myx; +per_frame_43=wave_y=0.5 + 0.05*myy; +per_frame_44= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Solarized Space (Space DNA Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Solarized Space (Space DNA Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Solarized Space (Space DNA Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Solarized Space (Space DNA Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,236 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.994000 +fDecay=0.960000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=1 +bInvert=1 +fWaveAlpha=1.882469 +fWaveScale=0.000000 +fWaveSmoothing=0.630000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.980296 +sy=1.000000 +wave_r=1.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.001500 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang = time*0.4;; +shape_0_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_0_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_0_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_0_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_0_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_0_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_0_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_0_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shape_0_per_frame10=sides = 360; +shapecode_1_enabled=1 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=ang = time*0.4;; +shape_1_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.5); +shape_1_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.5); +shape_1_per_frame4=r =0.5 + 0.5*sin(q8*0.4413 + 1); +shape_1_per_frame5=g = 0.5 + 0.5*sin(q8*1.23 + 2); +shape_1_per_frame6=b = 0.5 + 0.5*sin(q8*0.721 + 5); +shape_1_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.775 + 4); +shape_1_per_frame8=g2 = 0.5 - 0.5*sin(q8*0.676+ 1); +shape_1_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.738 + 3); +shape_1_per_frame10=sides = 360; +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=ang = time*0.4;; +shape_2_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.9); +shape_2_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.9); +shape_2_per_frame4=r =0.5 + 0.5*sin(q8*0.413 + 1); +shape_2_per_frame5=g = 0.5 + 0.5*sin(q8*0.363 + 2); +shape_2_per_frame6=b = 0.5 + 0.5*sin(q8*0.871 + 5); +shape_2_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.835 + 4); +shape_2_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.686+ 1); +shape_2_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.938 + 3); +shape_2_per_frame10=sides = 360; +per_frame_1=warp = 0; +per_frame_2=wave_mystery = -0.5; +per_frame_3=vol = 0.167*(bass+mid); +per_frame_4=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_5=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_6=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_7=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_8=xpos = xpos + 0.001*xspeed; +per_frame_9=myx = 1.25*xpos + 0.5; +per_frame_10=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_11=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_12=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_13=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_14=ypos = ypos + 0.001*yspeed; +per_frame_15=myy = 1.25*ypos + 0.5; +per_frame_16=cx = 0.5 + 0.05*sin(0.497*time); +per_frame_17=cy = 0.5 +0.05*sin(0.413*time); +per_frame_18=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_19=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_20=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_21=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_22=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_23=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_24=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_25=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_26=lastbeat = if(beat,time,lastbeat); +per_frame_27=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_28=beatcounter = if(above(beat,0),beatcounter +1, beatcounter); +per_frame_29=beatcounter = if(above(beatcounter,8), 0, beatcounter); +per_frame_30=beateven = beatcounter%4; +per_frame_31=mode = if(beat,(mode+rand(3)+1)%4,mode); +per_frame_32=beateven = if(equal(beateven,3),-1,beateven); +per_frame_33=beateven = if(equal(beateven,0),0.1*(myx+myy),beateven); +per_frame_34=beateven = if(equal(beateven,2),0.1*(-myx-myy),beateven); +per_frame_35=dx = 0.1*beateven*myx; +per_frame_36=dy = 0.1*beateven*myy; +per_frame_37=monitor = beateven; +per_frame_38=wave_a = Bass_thresh; +per_frame_39=zoom = 1.5 +0.25*myy; +per_frame_40=rot = myx*beateven; +per_frame_41=wave_x = 0.5 + 0.05*myx; +per_frame_42=wave_y=0.5 + 0.05*myy; +per_frame_43=q8 =oldq8+ 0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_44=oldq8 = q8; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Space.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Space.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Space.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Space.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,106 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.960000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.882469 +fWaveScale=0.000000 +fWaveSmoothing=0.630000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.980296 +sy=1.000000 +wave_r=0.000000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.001500 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=wave_mystery = -0.5; +per_frame_3=vol = 0.167*(bass+mid); +per_frame_4=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_5=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_6=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_7=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_8=xpos = xpos + 0.001*xspeed; +per_frame_9=myx = 1.25*xpos + 0.5; +per_frame_10=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_11=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_12=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_13=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_14=ypos = ypos + 0.001*yspeed; +per_frame_15=myy = 1.25*ypos + 0.5; +per_frame_16= +per_frame_17=cx = 0.5 + 0.05*sin(0.497*time); +per_frame_18=cy = 0.5 +0.05*sin(0.413*time); +per_frame_19= +per_frame_20= +per_frame_21= +per_frame_22= +per_frame_23= +per_frame_24= +per_frame_25= +per_frame_26= +per_frame_27= +per_frame_28= +per_frame_29= +per_frame_30= +per_frame_31=dx = dx + dx_residual; +per_frame_32=dy = dy + dy_residual; +per_frame_33= +per_frame_34= +per_frame_35=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_36=dx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_37=dy_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_frame_38= +per_frame_39=wave_a = Bass_thresh; +per_frame_40=zoom = 1.5 +0.25*myy; +per_frame_41=rot = 215*myx*dx; +per_frame_42=wave_x = 0.5 + 0.05*myx; +per_frame_43=wave_y=0.5 + 0.05*myy; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Space (Twisted Dimension Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Space (Twisted Dimension Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Space (Twisted Dimension Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Space (Twisted Dimension Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,108 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.980000 +fDecay=0.940000 +fVideoEchoZoom=1.019701 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.882469 +fWaveScale=0.000000 +fWaveSmoothing=0.630000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=0.980296 +sy=1.000000 +wave_r=0.000000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=wave_mystery = -0.5; +per_frame_3=vol = 0.167*(bass+mid); +per_frame_4=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_5=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_6=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_7=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_8=xpos = xpos + 0.001*xspeed; +per_frame_9=myx = 1.25*xpos + 0.5; +per_frame_10=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_11=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_12=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_13=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_14=ypos = ypos + 0.001*yspeed; +per_frame_15=myy = 1.25*ypos + 0.5; +per_frame_16= +per_frame_17=cx = 0.5 + 0.05*sin(0.497*time); +per_frame_18=cy = 0.5 +0.05*sin(0.413*time); +per_frame_19= +per_frame_20= +per_frame_21= +per_frame_22=dx = dx + dx_residual; +per_frame_23=dy = dy + dy_residual; +per_frame_24= +per_frame_25= +per_frame_26=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_27=dx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_28=dy_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_frame_29= +per_frame_30=wave_a = Bass_thresh; +per_frame_31=monitor = rot; +per_frame_32=zoom = 1.5 +0.25*myy*dy; +per_frame_33=rot = 215*myx*dx; +per_frame_34=wave_x = 0.5 + 0.05*myx + 0.08*bass_thresh -0.1; +per_frame_35=wave_y=0.5 + 0.05*myy; +per_frame_36=monitor = rot; +per_frame_37=mv_dx = dx; +per_frame_38=mv_dy =dy; +per_frame_39=echo_zoom =1+ 0.1*(myx-myy); +per_frame_40=monitor=echo_zoom; +per_pixel_1=zoom = zoom + 0.1*(1-rad); +per_pixel_2=sy = 1+ 0.2*(1-rad); +per_pixel_3=rot = rot + 0.2*rad; +per_pixel_4=dx = dx*rad; +per_pixel_5=dy = dy*(1-rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Sperl - Tuxflower.prjm kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Sperl - Tuxflower.prjm --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Sperl - Tuxflower.prjm 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Sperl - Tuxflower.prjm 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,269 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.645252 +fWaveScale=0.010000 +fWaveSmoothing=0.500000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=2.100000 +fShader=0.000000 +zoom=1.025000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.290770 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=1.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.015000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.020410 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=1.000000 +shape_0_per_frame1=x = 0.5 + 0.01*sin(0.89*q8); +shape_0_per_frame2=y = 0.5 - 0.01*cos(0.77*q8); +shape_0_per_frame3= +shape_0_per_frame4=r = 0.25+0.25*sin(time*0.7679); +shape_0_per_frame5=g = 0.25+0.25*sin(time*0.8079); +shape_0_per_frame6=b = 0.25+0.25*sin(time*0.7339); +shape_0_per_frame7=r2 = 0.25+0.25*sin(time*0.6979); +shape_0_per_frame8=g2 = 0.25+0.25*sin(time*0.849); +shape_0_per_frame9=b2 = 0.25+0.25*sin(time*0.8079); +shapecode_1_enabled=0 +shapecode_1_sides=100 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.020068 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=0.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=1.000000 +shapecode_1_border_r=0.000000 +shapecode_1_border_g=0.000000 +shapecode_1_border_b=0.000000 +shapecode_1_border_a=1.000000 +shape_1_per_frame1=x = 0.5 - 0.01*sin(0.7089*q8); +shape_1_per_frame2=y = 0.5 + 0.01*cos(0.5077*q8); +shape_1_per_frame3= +shape_1_per_frame4=r = 0.25+0.25*sin(time*0.6479); +shape_1_per_frame5=g = 0.25+0.25*sin(time*0.5079); +shape_1_per_frame6=b = 0.25+0.25*sin(time*0.9339); +shape_1_per_frame7=r2 = 0.25+0.25*sin(time*0.779); +shape_1_per_frame8=g2 = 0.25+0.25*sin(time*0.707); +shape_1_per_frame9=b2 = 0.25+0.25*sin(time*0.747); +shapecode_2_enabled=0 +shapecode_2_sides=100 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.020068 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=0.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=0.000000 +shapecode_2_border_g=0.000000 +shapecode_2_border_b=0.000000 +shapecode_2_border_a=1.000000 +shape_2_per_frame1=x = 0.5 + 0.01*sin(0.679*q8); +shape_2_per_frame2=y = 0.5 - 0.01*cos(0.877*q8); +shape_2_per_frame3= +shape_2_per_frame4=r = 0.25+0.25*sin(time*0.5679); +shape_2_per_frame5=g = 0.25+0.25*sin(time*0.4079); +shape_2_per_frame6=b = 0.25+0.25*sin(time*1.1339); +shape_2_per_frame7=r2 = 0.25+0.25*sin(time*0.9979); +shape_2_per_frame8=g2 = 0.25+0.25*sin(time*0.891); +shape_2_per_frame9=b2 = 0.25+0.25*sin(time*0.713); +shapecode_3_enabled=1 +shapecode_3_sides=100 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_imageURL=Tux.tga +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.150068 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=0.7100000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=1.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=x = 0.5 + 0.01*sin(0.916*q8); +shape_3_per_frame2=y = 0.5 - 0.01*cos(0.977*q8); +shape_3_per_frame3= +shape_3_per_frame4=r = 0.25+0.25*sin(time*1.1679); +shape_3_per_frame5=g = 0.25+0.25*sin(time*1.18079); +shape_3_per_frame6=b = 0.25+0.25*sin(time*1.17339); +shape_3_per_frame7=r2 = 0.25+0.25*sin(time*1.16979); +shape_3_per_frame8=g2 = 0.25+0.25*sin(time*1.1849); +shape_3_per_frame9=b2 = 0.25+0.25*sin(time*1.81079); +per_frame_1=wave_r = 0.0 + 0.000*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = 0.0 + 0.000*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = 0.0 + 0.000*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.01*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.010*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_6=//decay = decay - 0.01*equal(frame%6,0); +per_frame_7=warp=0; +per_frame_8=zoom =1; +per_frame_9=rot =0; +per_frame_10=cx=0.5; +per_frame_11=cy=0.5; +per_frame_12=q1 = 0.5 + 0.1*sin(time); +per_frame_13=q2 = 0.5 - 0.1*cos(time); +per_frame_14=wave_a =0; +per_frame_15=decay=1; +per_frame_16=q8 = oldq8+ 0.0005*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_17=oldq8 =q8; +per_frame_18=mybass = mybass + 0.01*(bass + bass_att); +per_frame_19=rot =1 + 0.15*sin(mybass*0.1789); +per_frame_20=zoom = 1.6 + 0.1*sin(mybass*0.786); +per_pixel_1=myx = (x-q1)*2; +per_pixel_2=myy= (y-q2)*2; +per_pixel_3=myrad = (myx*myx) + (myy*myy); +per_pixel_4=dx = 0.1*(myy/(myrad+1)); +per_pixel_5=dy = -0.1*(myx/(myrad+1)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Starquake (Sunquake Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Starquake (Sunquake Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Starquake (Sunquake Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Starquake (Sunquake Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.950000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.704175 +fWaveScale=0.044484 +fWaveSmoothing=0.000000 +fWaveParam=-0.480000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.980296 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.800000 +ob_b=0.900000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.650000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=mv_r = 0.7 + 0.3*sin(time*0.5683); +per_frame_3=mv_b = 0.8 + 0.2*sin(time*0.7832); +per_frame_4=mv_g = 0.82 + 0.15*sin(time*1.103); +per_frame_5=q1 = max(max(bass,bass_att)-1.15,0); +per_frame_6=q2 = max(max(treb,treb_att)-1.15,0); +per_frame_7=rot = abs(0.05*sin(time))-1.3*q1; +per_pixel_1=zoom = 0.4 + atan(atan(rad)*1.5*rad)+2.5*q1; +per_pixel_2=zoomexp= max(10*(1+q1-q2),0.2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & StudioMusic - More Cherished Desires.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & StudioMusic - More Cherished Desires.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & StudioMusic - More Cherished Desires.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & StudioMusic - More Cherished Desires.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.947994 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.396500 +fWaveScale=0.969133 +fWaveSmoothing=0.666000 +fWaveParam=0.000100 +fModWaveAlphaStart=1.379900 +fModWaveAlphaEnd=1.020000 +fWarpAnimSpeed=2.000000 +fWarpScale=1.000000 +fZoomExponent=0.056700 +fShader=0.700000 +zoom=0.539300 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.819500 +sy=0.819545 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.500000 +ob_g=0.010000 +ob_b=0.010000 +ob_a=0.950000 +ib_size=0.010000 +ib_r=0.010000 +ib_g=0.010000 +ib_b=0.500000 +ib_a=0.950000 +nMotionVectorsX=9.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = bass*.5; +per_frame_3=wave_g = treb*.5; +per_frame_4=wave_b = mid*.5; +per_frame_5=decay = .99; +per_frame_6=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_7=zoom=max(0.98, min(0.15+0.8*bass_att, 1.75 )); +per_pixel_1=zoom = zoom+rad*.1+0.05; +per_pixel_2=zoomexp =1 - 1*sin(rad*time*100); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & StudioMusic - Twisted Spider Web.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & StudioMusic - Twisted Spider Web.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & StudioMusic - Twisted Spider Web.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & StudioMusic - Twisted Spider Web.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.990000 +fVideoEchoZoom=1.001799 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.995648 +fWaveScale=0.995868 +fWaveSmoothing=0.837000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=10.784599 +fZoomExponent=1.001700 +fShader=0.000000 +zoom=1.009989 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.500000 +dy=0.500000 +warp=1.000000 +sx=0.999900 +sy=1.000000 +wave_r=0.500000 +wave_g=0.499900 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=0.950000 +ib_size=0.010000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.950000 +nMotionVectorsX=64.000000 +nMotionVectorsY=1.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=bass_effect = max(max(bass,bass_att)-1.2,0); +per_frame_2=treb_effect = max(max(treb,treb_att)-1.2,0); +per_frame_3=warp = 0.25 + bass_att*1.25; +per_frame_4=ib_r= ib_r-+ 0.5*( sin(time*0.391)); +per_frame_5=ib_g= ib_g + 0.5*( sin(time*1.527) ); +per_frame_6=ib_b= ib_b - 0.5*( sin(time*1.843) ); +per_frame_7=ob_r = 1 - ib_r; +per_frame_8=ob_g = 1 - ib_g; +per_frame_9=ob_b = 1 - ib_b; +per_frame_10=ob_size = if(above(bass_effect,0), 0.001+0.0065*bass_effect,0.001); +per_frame_11=ib_size = if(above(treb_effect,0), 0.001+0.0065*treb_effect,0.001); +per_frame_12=zoom=1.35+0.2*sin(time); +per_pixel_1=rot = rot + 1 + log(sqrt(2)-rad); +per_pixel_2=zoom=zoom-0.5*rad +0.1*sin(rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Telek - Altars of Madness (Rolling Oceans Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Telek - Altars of Madness (Rolling Oceans Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Telek - Altars of Madness (Rolling Oceans Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Telek - Altars of Madness (Rolling Oceans Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,122 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.660126 +fWaveSmoothing=0.000000 +fWaveParam=0.300000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.150000 +mv_g=0.450000 +mv_b=0.650000 +mv_a=0.200000 +per_frame_1=warp=0; +per_frame_2=ib_a =0.2*bass; +per_frame_3=wave_r = wave_r + 0.45*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438)); +per_frame_4=wave_b = wave_b - 0.4*(0.5*sin(time*4.782)+0.5*cos(time*0.522)); +per_frame_5=wave_g = wave_g + 0.4*sin(time*1.731); +per_frame_6=decay = decay - equal(frame%100,0)*0.1; +per_frame_7=vol = 0.167*(bass+mid); +per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_11=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_12=xpos = xpos + 0.001*xspeed; +per_frame_13=wave_x = 1.5*xpos + 0.5; +per_frame_14=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_15=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_16=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_17=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_18=ypos = ypos + 0.001*yspeed; +per_frame_19=wave_y = 1.5*ypos + 0.5; +per_frame_20=zoom = .995; +per_frame_21= +per_frame_22= +per_frame_23= +per_frame_24= +per_frame_25= +per_frame_26= +per_frame_27= +per_frame_28=frametest = frame%2; +per_frame_29=wave_x = if(frametest,1-wave_x,wave_x); +per_frame_30=wave_y = if(frametest,1-wave_y,wave_y); +per_frame_31=wave_r = if(frametest,wave_r,wave_g); +per_frame_32=wave_g = if(frametest,wave_g,wave_b); +per_frame_33=wave_b = if(frametest,wave_b,wave_r); +per_frame_34=monitor = green; +per_frame_35=q8 = oldq8+ 0.0005*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_36=oldq8 = q8; +per_frame_37= +per_frame_38=mv_g=0.5+bass_att*.1; +per_frame_39=beat=if(above(bass*bass_att,4.5),1-beat,beat); +per_frame_40=q1=beat*2-1; +per_frame_41= +per_frame_42=amp =amp*.8+.2*(bass_att+mid_att+treb_att)*.3; +per_frame_43=q2 = min(amp,1); +per_frame_44=trebcap=trebcap*.7+.16*treb; +per_frame_45=q3=trebcap*2; +per_frame_46=monitor = q3; +per_pixel_1=dx=dx+0.008*sin((y*2-1)*(48+12*sin(0.412*q8)))+0.008*sin(((y+sin(time*0.163))*2-1)* (3+sin(0.241*q8))); +per_pixel_2=dy=dy+0.008*cos((x*2-1)*(64+18*sin(0.376*q8)))+0.008*sin(((x+sin(q8*0.282))*2-1) *(3+sin(0.349*q8))); +per_pixel_3=wang = (3+q3)*x+time*1.7+bass*.1; +per_pixel_4=in = 0; +per_pixel_5=in = in + below(abs(x-.25),.05)*below(abs(y-.5),.25); +per_pixel_6=in = below(abs(y-(.5+.5*sin(wang)*q2)),.1); +per_pixel_7=in=bnot(bnot(in)); +per_pixel_8=dx = dx+.02*in; +per_pixel_9=dy = dy+.08*cos(wang)*q2*in; +per_pixel_10= +per_pixel_11=dx = dx+bnot(in)*.005*q1; +per_pixel_12=dy = dy+bnot(in)*cos(wang)*-.01*q1; +per_frame_init_1=q8=0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Telek - Cosmic Fireworks.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Telek - Cosmic Fireworks.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Telek - Cosmic Fireworks.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Telek - Cosmic Fireworks.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,214 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.010000 +fWaveSmoothing=0.900000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.001000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.002000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=33.152000 +nMotionVectorsY=28.799997 +mv_dx=0.006000 +mv_dy=0.000000 +mv_l=2.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=32 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.300000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.500000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = 0.5 + 0.2*sin(time*0.5624); +shape_0_per_frame2=y = 0.5+0.2*sin(time*0.8934); +shape_0_per_frame3=r =0.5+0.5*sin(time*0.9431); +shape_0_per_frame4=b2 = 0.5+0.5*sin(time*3.175); +shape_0_per_frame5=g = 1 - 0.1*bass; +shape_0_per_frame6=r2 = 0.5*0.5*sin(1.7823); +shape_0_per_frame7=g2 = 0.5 + 0.5*sin(time*2.32); +shape_0_per_frame8=rad=0.02 + 0.00004*pow(bass+bass,5); +shape_0_per_frame9=ang = 0.1*sin(time) + (rad-0.1)*10;; +shapecode_1_enabled=1 +shapecode_1_sides=32 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.500000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.500000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=0.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=x = 0.5 + 0.2*sin(time*0.6824); +shape_1_per_frame2=y = 0.5+0.2*sin(time*0.934); +shape_1_per_frame3=r =0.5+0.5*sin(time*0.9431); +shape_1_per_frame4=b2 = 0.5+0.5*sin(time*3.675); +shape_1_per_frame5=g = 1 - 0.1*bass; +shape_1_per_frame6=r2 = 0.5*0.5*sin(2.23); +shape_1_per_frame7=g2 = 0.5 + 0.5*sin(time*1.32); +shape_1_per_frame8=rad=0.08 + 0.00001*pow(bass+bass,7); +shape_1_per_frame9=ang = 0.1*sin(time) + (rad-0.1)*10;; +shapecode_2_enabled=1 +shapecode_2_sides=32 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=0.500000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.500000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=x = 0.5 + 0.2*sin(time*0.9824); +shape_2_per_frame2=y = 0.5+0.2*sin(time*0.34); +shape_2_per_frame3=v =0.5+0.5*sin(time*0.9431); +shape_2_per_frame4=r2 = 0.5+0.5*sin(time*1.675); +shape_2_per_frame5=g = 1 - 0.1*bass; +shape_2_per_frame6=g2 = 0.5*0.5*sin(1.23); +shape_2_per_frame7=b2 = 0.5 + 0.5*sin(time*1.32); +shape_2_per_frame8=rad=0.02 + 0.00001*pow(bass+bass,5); +shape_2_per_frame9=ang = 0.2*sin(time) + (rad-0.1)*10;; +per_frame_1=xx = sin(time*.13)*.5+.5; +per_frame_2= +per_frame_3=beat = above(bass*bass_att,4.5)+bnot(xx); +per_frame_4=//xx = if(beat,0,xx); +per_frame_5=//x = if(beat,rand(10)*.1,x); +per_frame_6=//y = if(beat,rand(10)*.1,y); +per_frame_7=x = if(beat, max(min(rand( 2 )*.2 -.1+x, 1), 0), x); +per_frame_8=y = if(beat, max(min(rand( 2 )*.2 -.1+y, 1), 0), y); +per_frame_9=zoom = 1-beat*.1; +per_frame_10=wave_x = x; +per_frame_11=wave_y = y; +per_frame_12=wave_mystery = xx*1.7-.5; +per_frame_13=ob_a = beat; +per_frame_14=wave_r= sin(time*.197)*.5+.5; +per_frame_15=wave_g=cos(time*.201)*.5+.5; +per_frame_16=wave_b=sin(time*.215)*.5+.5; +per_frame_17= +per_frame_18=xx=sin(xx*62.82)*.5+.5; +per_frame_19=wave_r = xx+(1-xx)*wave_r; +per_frame_20=wave_g = xx+(1-xx)*wave_g; +per_frame_21=wave_b = xx+(1-xx)*wave_b; +per_frame_22=//wave_b= wave_g; +per_frame_23=//rot = .015; +per_frame_24=monitor = xx; +per_pixel_1=//rot = 0.001*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Awakening.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Awakening.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Awakening.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Awakening.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,65 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.989000 +fVideoEchoZoom=1.483841 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.089269 +fWaveSmoothing=0.720000 +fWaveParam=-0.360000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.009963 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.999999 +sy=0.999830 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.060000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + .4*sin(time*.678); +per_frame_3=wave_g = wave_g + .4*sin(time*.977); +per_frame_4=wave_b = wave_b + .4*sin(time*.766); +per_frame_5=decay = 1 - mid /20; +per_frame_6=q1 = wave_r; +per_frame_7=wave_mystery = -time/6; +per_pixel_1=zoom = 0.974 + rad/10 + abs(sin(ang-rad)/10) +q1/10; +per_pixel_2=rot = -0.4 + treb*.001 + sin(treb+rad)/33 -q1/8; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Chaos Of Colours (Drifting Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Chaos Of Colours (Drifting Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Chaos Of Colours (Drifting Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Chaos Of Colours (Drifting Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,217 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.700000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.950000 +ib_g=0.850000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.550000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.100000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.900000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.200000 +shape_0_per_frame1=ang = time*1.4; +shape_0_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_0_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_0_per_frame4=r = 0.5 + 0.5*sin(q8*0.613 + 1); +shape_0_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_0_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_0_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_0_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_0_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shapecode_1_enabled=1 +shapecode_1_sides=32 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.400000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.300000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.200000 +shape_1_per_frame1=ang = time*1.7; +shape_1_per_frame2=x = 0.5 + 0.08*cos(time*1.1) + 0.03*cos(time*0.7); +shape_1_per_frame3=y = 0.5 + 0.08*sin(time*1.1) + 0.03*sin(time*0.7); +shape_1_per_frame4=r = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_1_per_frame5=g = 0.5 + 0.5*sin(q8*0.563 + 2); +shape_1_per_frame6=b = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_1_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.885 + 4); +shape_1_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.556+ 1); +shape_1_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.638 + 3); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.400000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=0.600000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.400000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.200000 +shape_2_per_frame1=ang = time*1.24; +shape_2_per_frame2=x = 0.5 - 0.08*cos(time*1.07) + 0.03*cos(time*0.7); +shape_2_per_frame3=y = 0.5 - 0.08*sin(time*1.33) + 0.03*sin(time*0.7); +shape_2_per_frame4=g = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_2_per_frame5=b = 0.5 + 0.5*cos(q8*0.563 + 2); +shape_2_per_frame6=r = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_2_per_frame7=r2 = 0.5 + 0.5*cos(q8*0.885 + 4); +shape_2_per_frame8=g2 = 0.5 + 0.5*cos(q8*0.556+ 1); +shape_2_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.638 + 3); +per_frame_1=ob_r = 0.5 + 0.4*sin(time*1.324); +per_frame_2=ob_g = 0.5 + 0.4*cos(time*1.371); +per_frame_3=ob_b = 0.5+0.4*sin(2.332*time); +per_frame_4=ib_r = 0.5 + 0.25*sin(time*1.424); +per_frame_5=ib_g = 0.25 + 0.25*cos(time*1.871); +per_frame_6=ib_b = 1-ob_b; +per_frame_7=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att); +per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_11=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_13=xpos = xpos + 0.001*xspeed; +per_frame_14=dx = xpos*0.005; +per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_18=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_19=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_20=ypos = ypos + 0.001*yspeed; +per_frame_21=dy = ypos*0.005; +per_frame_22=rot = 10*(dx-dy); +per_frame_23=wave_a = 0; +per_frame_24=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_25=oldq8 = q8; +per_frame_26=q7 = 0.003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_27=monitor = rot; +per_pixel_1=zoom = 1+0.05*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Chaos Of Colours.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Chaos Of Colours.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Chaos Of Colours.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Chaos Of Colours.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,215 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.700000 +fDecay=0.940000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.630000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=13.290894 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-0.280000 +dy=-0.320000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.950000 +ib_g=0.850000 +ib_b=0.650000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.550000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.100000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.900000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.400000 +shape_0_per_frame1=ang = time*0.4;; +shape_0_per_frame2=x = 0.5 + 0.08*cos(time*1.3) + 0.03*cos(time*0.7); +shape_0_per_frame3=y = 0.5 + 0.08*sin(time*1.4) + 0.03*sin(time*0.7); +shape_0_per_frame4=r =0.5 + 0.5*sin(q8*0.613 + 1); +shape_0_per_frame5=g = 0.5 + 0.5*sin(q8*0.763 + 2); +shape_0_per_frame6=b = 0.5 + 0.5*sin(q8*0.771 + 5); +shape_0_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.635 + 4); +shape_0_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.616+ 1); +shape_0_per_frame9=b2 = 0.5 + 0.5*sin(q8*0.538 + 3); +shapecode_1_enabled=1 +shapecode_1_sides=32 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.400000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.300000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shape_1_per_frame1=ang = time*1.7; +shape_1_per_frame2=x = 0.5 + 0.08*cos(time*1.1) + 0.03*cos(time*0.7); +shape_1_per_frame3=y = 0.5 + 0.08*sin(time*1.1) + 0.03*sin(time*0.7); +shape_1_per_frame4=r = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_1_per_frame5=g = 0.5 + 0.5*sin(q8*0.563 + 2); +shape_1_per_frame6=b = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_1_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.885 + 4); +shape_1_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.556+ 1); +shape_1_per_frame9=b2 = 0.5 + 0.5*sin(tq8*0.638 + 3); +shapecode_2_enabled=1 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.400000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.500000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shape_2_per_frame1=ang = time*1.24; +shape_2_per_frame2=x = 0.5 - 0.08*cos(time*1.07) + 0.03*cos(time*0.7); +shape_2_per_frame3=y = 0.5 - 0.08*sin(time*1.33) + 0.03*sin(time*0.7); +shape_2_per_frame4=g = 0.5 + 0.5*sin(q8*0.713 + 1); +shape_2_per_frame5=b = 0.5 + 0.5*sin(q8*0.563 + 2); +shape_2_per_frame6=r = 0.5 + 0.5*sin(q8*0.654 + 5); +shape_2_per_frame7=r2 = 0.5 + 0.5*sin(q8*0.885 + 4); +shape_2_per_frame8=g2 = 0.5 + 0.5*sin(q8*0.556+ 1); +shape_2_per_frame9=b2 = 0.5 + 0.5*sin(q8*.638 + 3); +per_frame_1=ob_r = 0.5 + 0.4*sin(time*1.324); +per_frame_2=ob_g = 0.5 + 0.4*cos(time*1.371); +per_frame_3=ob_b = 0.5+0.4*sin(2.332*time); +per_frame_4=ib_r = 0.5 + 0.25*sin(time*1.424); +per_frame_5=ib_g = 0.25 + 0.25*cos(time*1.871); +per_frame_6=ib_b = 1-ob_b; +per_frame_7=volume = 0.15*(bass+bass_att+treb+treb_att+mid+mid_att); +per_frame_8=xamptarg = if(equal(frame%15,0),min(0.5*volume*bass_att,0.5),xamptarg); +per_frame_9=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_10=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_11=xaccel = xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_12=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_13=xpos = xpos + 0.001*xspeed; +per_frame_14=dx = xpos*0.05; +per_frame_15=yamptarg = if(equal(frame%15,0),min(0.3*volume*treb_att,0.5),yamptarg); +per_frame_16=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_17=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_18=yaccel = ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_19=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_20=ypos = ypos + 0.001*yspeed; +per_frame_21=dy = ypos*0.05; +per_frame_22=wave_a = 0; +per_frame_23=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_24=oldq8 = q8; +per_frame_25=q7 = 0.003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_pixel_1=zoom =( log(sqrt(2)-rad) -0.24)*1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Shroomery.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Shroomery.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Shroomery.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - The Shroomery.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,454 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=0.332702 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.000000 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.200000 +ob_a=0.500000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=7.058490 +nMotionVectorsY=31.639950 +mv_dx=-0.385207 +mv_dy=-0.168757 +mv_l=0.598467 +mv_r=0.358736 +mv_g=0.275337 +mv_b=0.561849 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=1 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.027964 +wavecode_0_smoothing=0.000000 +wavecode_0_r=0.300000 +wavecode_0_g=1.000000 +wavecode_0_b=0.300000 +wavecode_0_a=1.000000 +wave_0_init1=//pi +wave_0_init2=//t8=3.14159265*0.15; +wave_0_init3=//t5 = 1; +wave_0_init4= +wave_0_init5=//n =300; +wave_0_init6=t1 = 300; +wave_0_init7=//rx = 0; +wave_0_init8=t2 = 0; +wave_0_init9=//ry = 0; +wave_0_init10=t3 = 0; +wave_0_init11=//tpi =3.1415; +wave_0_init12=t4 = 3.14159265; +wave_0_init13=//c=1; +wave_0_init14=t5 = 1; +wave_0_init15=//hu=10; +wave_0_init16=t6 = 10; +wave_0_init17=//hut=-10; +wave_0_init18=t7 = -10; +wave_0_per_frame1=t7 = 0.5+0.5*sin(time)*t4; +wave_0_per_frame2=t6 = (t7+t6*5)/6; +wave_0_per_frame3=t2 = pow(2*bass+bass_att,5)*0.00015111 +oldt2; +wave_0_per_frame4=oldt2 = t2; +wave_0_per_frame5=//t2 = 3*sin(time*0.0965); +wave_0_per_frame6=t3 = pow(2*bass+bass_att,4)*0.00026213 + oldt3; +wave_0_per_frame7=oldt3 = t3; +wave_0_per_frame8=//t3 = 3*sin(time*0.0872); +wave_0_per_frame9= +wave_0_per_frame10=q1 = -cos(cos(t2)); +wave_0_per_frame11=q2 = cos(-t3); +wave_0_per_frame12=q3 = sin(cos(-t2)); +wave_0_per_frame13=q4 = sin(t3); +wave_0_per_point1=u = sample*2-1; +wave_0_per_point2=rf = 512; +wave_0_per_point3=shc = 1-u*u; +wave_0_per_point4=cf = below(sample,0.45); +wave_0_per_point5=u=if(cf,sqrt(shc)*(-u/2+0.5), if(below(sample,0.55), (sample-0.45)*15+0.1, pow(shc,0.7)*1.5)); +wave_0_per_point6=u = u + v/8; +wave_0_per_point7=px = cos(sample*t4*rf)*u/2+cos(t6)+1.5; +wave_0_per_point8=py = sample*2-1; +wave_0_per_point9=pz = sin(sample*t4*rf)*u/2+2.9; +wave_0_per_point10=y1 = py*q1 + pz*q3; +wave_0_per_point11=z1 = pz*q1 - py*q3; +wave_0_per_point12=x2 = px*q2 + z1*q4; +wave_0_per_point13=z2 = z1*q2 - px*q4+5; +wave_0_per_point14=x = x2/z2; +wave_0_per_point15=y = y1/z2; +wave_0_per_point16=x = x*0.5 + 0.5; +wave_0_per_point17=y = 0.5*y + 0.5; +wave_0_per_point18=r = 0.5+sin(sample*195)*0.5; +wave_0_per_point19=g = 0.5*sin(time*0.145)+0.499*(0.5+sin(x*95)*0.5); +wave_0_per_point20=b = 0.5*sin(time*0.1876)+0.495*(0.5+sin(y*208)*0.5); +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=1 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.027964 +wavecode_1_smoothing=0.000000 +wavecode_1_r=0.000000 +wavecode_1_g=0.000000 +wavecode_1_b=0.400000 +wavecode_1_a=1.000000 +wave_1_init1=//pi +wave_1_init2=//t8=3.14159265*0.15; +wave_1_init3=//t5 = 1; +wave_1_init4= +wave_1_init5=//n =300; +wave_1_init6=t1 = 300; +wave_1_init7=//rx = 0; +wave_1_init8=t2 = 0; +wave_1_init9=//ry = 0; +wave_1_init10=t3 = 0; +wave_1_init11=//tpi =3.1415; +wave_1_init12=t4 = 3.14159265; +wave_1_init13=//c=1; +wave_1_init14=t5 = 1; +wave_1_init15=//hu=10; +wave_1_init16=t6 = 10; +wave_1_init17=//hut=-10; +wave_1_init18=t7 = -10; +wave_1_per_frame1=t7 = 0.5+0.5*sin(time*0.135)*t4; +wave_1_per_frame2=t6 = (t7+t6*5)/6; +wave_1_per_frame3=t2 = pow(bass+bass_att,6)*0.00005 + 0.022+ oldt2; +wave_1_per_frame4=oldt2 = if(above(t2,10000),0,t2); +wave_1_per_frame5=//t2 = t2 -cos(time*0.451); +wave_1_per_frame6=t3 = pow(bass+bass_att,7)*0.00005 + 0.0278 +oldt3; +wave_1_per_frame7=oldt3 = t3; +wave_1_per_frame8=//t3 = t3-cos(time*0.321); +wave_1_per_frame9=q1 = -cos(cos(t2)); +wave_1_per_frame10=q2 = -cos(t3); +wave_1_per_frame11=q3 = sin(cos(t2)); +wave_1_per_frame12=q4 = sin(t3); +wave_1_per_point1=u = sample*2-1; +wave_1_per_point2=rf = 1000; +wave_1_per_point3=shc = 1-u*u; +wave_1_per_point4=cf = below(sample,0.45); +wave_1_per_point5=u=if(cf,sqrt(shc)*(-u/2+0.5), if(below(sample,0.55), (sample-0.45)*15+0.1, pow(shc,0.7)*1.5)); +wave_1_per_point6=u = u + v/8; +wave_1_per_point7=px = cos(sample*t4*rf)*u/2+cos(t6)+1.5; +wave_1_per_point8=py = sample*2-1; +wave_1_per_point9=pz = sin(sample*t4*rf)*u/2+2.9; +wave_1_per_point10=y1 = py*q1 + pz*q3; +wave_1_per_point11=z1 = pz*q1 - py*q3; +wave_1_per_point12=x2 = px*q2 + z1*q4; +wave_1_per_point13=z2 = z1*q2 - px*q4+5; +wave_1_per_point14=x = x2/z2; +wave_1_per_point15=y = y1/z2; +wave_1_per_point16=x = x*0.5 + 0.5; +wave_1_per_point17=y = 0.5*y + 0.5; +wave_1_per_point18=r = abs(sample-(sample*progress)); +wave_1_per_point19=g = sample/y; +wave_1_per_point20=b = x2*sample; +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=1 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.027964 +wavecode_2_smoothing=0.000000 +wavecode_2_r=0.800000 +wavecode_2_g=0.400000 +wavecode_2_b=0.400000 +wavecode_2_a=1.000000 +wave_2_init1=//pi +wave_2_init2=//t8=3.14159265*0.15; +wave_2_init3=//t5 = 1; +wave_2_init4= +wave_2_init5=//n =300; +wave_2_init6=t1 = 300; +wave_2_init7=//rx = 0; +wave_2_init8=t2 = 0; +wave_2_init9=//ry = 0; +wave_2_init10=t3 = 0; +wave_2_init11=//tpi =3.1415; +wave_2_init12=t4 = 3.14159265; +wave_2_init13=//c=1; +wave_2_init14=t5 = 1; +wave_2_init15=//hu=10; +wave_2_init16=t6 = 10; +wave_2_init17=//hut=-10; +wave_2_init18=t7 = -10; +wave_2_per_frame1=t7 = 0.5+0.5*sin(time*0.896)*t4; +wave_2_per_frame2=t6 = (t7+t6*5)/6; +wave_2_per_frame3=t2 = pow(1.13*bass+bass_att,5)*0.0001 +0.0017+oldt2; +wave_2_per_frame4=oldt2 = t2; +wave_2_per_frame5=t2 = t2 + sin(time*0.01963); +wave_2_per_frame6=t3 = pow(bass+1.14*bass_att,5)*0.0001 + 0.00121 +oldt3; +wave_2_per_frame7=oldt3 = t3; +wave_2_per_frame8=t3 = t3 + sin(time*0.06527); +wave_2_per_frame9=q1 = -cos(cos(t2)); +wave_2_per_frame10=q2 = cos(t3); +wave_2_per_frame11=q3 = sin(cos(t2)); +wave_2_per_frame12=q4 = sin(t3); +wave_2_per_point1=u = sample*2-1; +wave_2_per_point2=rf = 1000; +wave_2_per_point3=shc = 1-u*u; +wave_2_per_point4=cf = below(sample,0.45); +wave_2_per_point5=u=if(cf,sqrt(shc)*(-u/2+0.5), if(below(sample,0.55), (sample-0.45)*15+0.1, pow(shc,0.7)*1.5)); +wave_2_per_point6=u = u + v/8; +wave_2_per_point7=px = cos(sample*t4*rf)*u/2+cos(t6)+1.5; +wave_2_per_point8=py = sample*2-1; +wave_2_per_point9=pz = sin(sample*t4*rf)*u/2+2.9; +wave_2_per_point10=y1 = py*q1 + pz*q3; +wave_2_per_point11=z1 = pz*q1 - py*q3; +wave_2_per_point12=x2 = px*q2 + z1*q4; +wave_2_per_point13=z2 = z1*q2 - px*q4+5; +wave_2_per_point14=x = x2/z2; +wave_2_per_point15=y = y1/z2; +wave_2_per_point16=x = x*0.5 + 0.5; +wave_2_per_point17=y = 0.5*y + 0.5; +wave_2_per_point18=r = sample; +wave_2_per_point19=g = x*sample; +wave_2_per_point20=b = y*x/sample; +wavecode_3_enabled=1 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=1 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.027964 +wavecode_3_smoothing=0.000000 +wavecode_3_r=0.000000 +wavecode_3_g=0.500000 +wavecode_3_b=0.700000 +wavecode_3_a=1.000000 +wave_3_init1=//pi +wave_3_init2=//t8=3.14159265*0.15; +wave_3_init3=//t5 = 1; +wave_3_init4= +wave_3_init5=//n =300; +wave_3_init6=t1 = 300; +wave_3_init7=//rx = 0; +wave_3_init8=t2 = 0; +wave_3_init9=//ry = 0; +wave_3_init10=t3 = 0; +wave_3_init11=//tpi =3.1415; +wave_3_init12=t4 = 3.14159265; +wave_3_init13=//c=1; +wave_3_init14=t5 = 1; +wave_3_init15=//hu=10; +wave_3_init16=t6 = 10; +wave_3_init17=//hut=-10; +wave_3_init18=t7 = -10; +wave_3_per_frame1=t7 = 0.5+0.5*sin(time)*t4; +wave_3_per_frame2=t6 = (t7+t6*5)/6; +wave_3_per_frame3=t2 = q8*0.7825; +wave_3_per_frame4=t3 = q8*0.6242; +wave_3_per_frame5=q1 = -cos(cos(t2)); +wave_3_per_frame6=q2 = cos(t3); +wave_3_per_frame7=q3 = sin(cos(t2)); +wave_3_per_frame8=q4 = sin(t3); +wave_3_per_point1=u = sample*2-1; +wave_3_per_point2=rf = 1000; +wave_3_per_point3=shc = 1-u*u; +wave_3_per_point4=cf = below(sample,0.45); +wave_3_per_point5=u=if(cf,sqrt(shc)*(-u/2+0.5), if(below(sample,0.55), (sample-0.45)*15+0.1, pow(shc,0.7)*1.5)); +wave_3_per_point6=u = u + v/8; +wave_3_per_point7=px = cos(sample*t4*rf)*u/2+cos(t6)+1.5; +wave_3_per_point8=py = sample*2-1; +wave_3_per_point9=pz = sin(sample*t4*rf)*u/2+2.9; +wave_3_per_point10=y1 = py*q1 + pz*q3; +wave_3_per_point11=z1 = pz*q1 - py*q3; +wave_3_per_point12=x2 = px*q2 + z1*q4; +wave_3_per_point13=z2 = z1*q2 - px*q4+5; +wave_3_per_point14=x = x2/z2; +wave_3_per_point15=y = y1/z2; +wave_3_per_point16=x = x*0.5 + 0.5; +wave_3_per_point17=y = 0.5*y + 0.5; +wave_3_per_point18=r = 0.5*(y/x) + 0.499*sin(time*0.564); +wave_3_per_point19=b = 0.5*(x*y) + 0.499*sin(time*0.457); +wave_3_per_point20=g = 0.5*(x*x) + 0.499*sin(time*0.134); +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.496295 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=5.617169 +shapecode_0_tex_zoom=1.699528 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.100000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=//x = 0.5+ 0.4*sin(0.2765*time+0.341*q8); +shape_0_per_frame2=//y = 0.5+ 0.4*sin(0.311*time+0.213*q8); +shape_0_per_frame3=//ang = 3.1415-3.1415*cos(time*0.1389); +shape_0_per_frame4=//rad = 0.5+0.5*sin(q8*0.2685); +shape_0_per_frame5=tex_Ang = q8; +shapecode_1_enabled=1 +shapecode_1_sides=100 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.496295 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=5.617169 +shapecode_1_tex_zoom=1.719942 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.100000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=//x = 0.5+ 0.4*sin(0.2765*time+0.341*q8); +shape_1_per_frame2=//y = 0.5+ 0.4*sin(0.311*time+0.213*q8); +shape_1_per_frame3=//ang = 3.1415-3.1415*cos(time*0.1389); +shape_1_per_frame4=//rad = 0.5+0.5*sin(q8*0.2685); +shape_1_per_frame5=tex_Ang = q8-0.02; +shape_1_per_frame6=//x = x +0.01; +shapecode_2_enabled=1 +shapecode_2_sides=100 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.496295 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.740601 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=0.100000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=//x = 0.5+ 0.4*sin(0.2765*time+0.341*q8); +shape_2_per_frame2=//y = 0.5+ 0.4*sin(0.311*time+0.213*q8); +shape_2_per_frame3=//ang = 3.1415-3.1415*cos(time*0.1389); +shape_2_per_frame4=//rad = 0.5+0.5*sin(q8*0.2685); +shape_2_per_frame5=tex_Ang = q8-0.04; +shape_2_per_frame6=//x = x +0.01; +shapecode_3_enabled=0 +shapecode_3_sides=100 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.120000 +shapecode_3_y=0.200000 +shapecode_3_rad=0.330038 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=1.000000 +shapecode_3_a2=1.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=x = 0.5+ 0.4*sin(0.105*time+0.3*q4); +shape_3_per_frame2=y = 0.5+ 0.4*sin(0.1267*time+0.323*q4); +shape_3_per_frame3=ang = 3.1415+3.1415*sin(time*0.2654); +shape_3_per_frame4=rad = 0.5+0.5*sin(q4*0.785); +per_frame_init_1=//With thanks to UnConeD for his mushy SSC code. :) +per_frame_1=warp=0; +per_frame_2=wave_a=0; +per_frame_3=decay = 0.97; +per_frame_4=q7 = 0.00004*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_5= +per_frame_6=q6 = oldq6+ 0.0002*(pow(1+0.1*bass+0.1*bass_att+1.2*treb+0.4*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_7=oldq6 = q6; +per_frame_8= +per_frame_9=q4 = oldq4+ 0.0002*(pow(1+0.1*bass+0.1*bass_att+0.1*treb+0.1*treb_att+1.2*mid+0.4*mid_att,6)/fps); +per_frame_10=oldq4 = q4; +per_frame_11= +per_frame_12=q8 = oldq8+ 0.0002*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_13=oldq8 = q8; +per_frame_14= +per_frame_15=q8 = oldq8+ 0.0002*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_16=oldq8 = if(above(q8,10000),0,q8); +per_frame_17=ob_b = max(0,sin(q8*0.2542)*0.2 +0.1); +per_frame_18=ob_r = max(0,sin(q8*0.985)*0.4 + 0.2); +per_frame_19=ob_g = max(0,sin(q8*0.8711)*0.3 + 0.1); +per_frame_20=ob_a =max(0,0.3*(q7-0.2))+0.1; +per_frame_21=ib_r = 1-if(ob_size-0.005,0,1); +per_frame_22=ib_g = ib_r*(0.21*0.2*sin(time*0.643)); +per_frame_23=ib_b = ib_r*(0.21*0.2*sin(time*0.853)); +per_frame_24=ib_a =0.2*q7; +per_frame_25=echo_alpha = above(q7,0.2); +per_frame_26=echo_zoom = 1 + 0.01*q7; +per_pixel_1=dx=dx+0.007*sin((y*2-1)*meshx)+ 0.006*sin((y*2-1)*meshx*1.3333); +per_pixel_2=dy=dy+sin(q8*0.1745)*0.007*cos((x*2-1)*meshx*1.3333)+ sin(q8*0.1875)*0.006*cos((x*2-1)*meshx*1.666); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Timeless Voyage.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Timeless Voyage.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Timeless Voyage.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Timeless Voyage.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.285749 +fWaveSmoothing=0.900000 +fWaveParam=0.600000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.380217 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.198054 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.000000 +ob_g=1.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.550000 +ib_a=0.000000 +nMotionVectorsX=52.090683 +nMotionVectorsY=37.504894 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=4.534792 +mv_r=0.000000 +mv_g=0.162823 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = bass-1; +per_frame_2=wave_g = mid-1.2; +per_frame_3=wave_b = treb-.5; +per_frame_4=warp =0; +per_pixel_1=rot=0.2*pow(ang,3); +per_pixel_2=zoom=sin(pow(rad,3))+1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Touchdown on Mars (Detailed Pictures Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Touchdown on Mars (Detailed Pictures Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Touchdown on Mars (Detailed Pictures Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Touchdown on Mars (Detailed Pictures Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=0.999000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.381900 +fWaveSmoothing=0.810000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000995 +sy=1.000000 +wave_r=0.050000 +wave_g=0.100000 +wave_b=0.100000 +wave_x=0.920000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = 0.7+0.3*sin(time); +per_frame_2=wave_y = wave_y + 0.1*sin(20*time); +per_frame_3=sx = 1.0006; +per_pixel_1=dy = 0.0003+0.006*(y+0.05*(bass+bass_att)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Tripmaker.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Tripmaker.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Tripmaker.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - Tripmaker.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,264 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.221673 +fWaveScale=0.685151 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=100.000000 +fShader=1.000000 +zoom=0.999998 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.200000 +ob_g=0.400000 +ob_b=0.220000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=1 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=1.791418 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.062832 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=1.000000 +shapecode_0_b=1.000000 +shapecode_0_a=0.080000 +shapecode_0_r2=1.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=0.080000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=additive = q1; +shape_0_per_frame2=a = if(q1,1,a); +shape_0_per_frame3=a2 = a; +shape_0_per_frame4=r = q1; +shape_0_per_frame5=r2 =q1; +shape_0_per_frame6=tex_zoom = 3 - 3*bass; +shapecode_1_enabled=1 +shapecode_1_sides=100 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=1.791418 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.062832 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=1.000000 +shapecode_1_a=0.080000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.080000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=additive = q1; +shape_1_per_frame2=a = if(q1,1,a); +shape_1_per_frame3=a2 = a; +shape_1_per_frame4=r = q1; +shape_1_per_frame5=r2 =q1; +shape_1_per_frame6=tex_zoom = 3 - 2*bass; +shapecode_2_enabled=1 +shapecode_2_sides=100 +shapecode_2_additive=0 +shapecode_2_thickOutline=1 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.919739 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.628319 +shapecode_2_tex_zoom=1.030299 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=0.000000 +shapecode_2_border_g=0.000000 +shapecode_2_border_b=0.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=tex_zoom = q1+tex_zoom; +shape_2_per_frame2=a2 = 1; +shape_2_per_frame3=border_a = q1; +shapecode_3_enabled=1 +shapecode_3_sides=100 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.138869 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=0.050000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.050000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=r = 0.5 + 0.49*sin(time*0.2754); +shape_3_per_frame2=b = 0.5 + 0.49*sin(time*0.6254); +shape_3_per_frame3=g = 0.5 + 0.49*sin(time*0.514); +shape_3_per_frame4=r2 = 0.5 + 0.49*sin(time*0.475); +shape_3_per_frame5=b2 = 0.5 + 0.49*sin(time*0.2107); +shape_3_per_frame6=g2 = 0.5 + 0.49*sin(time*0.7714); +per_frame_init_1=beatcounter =0; +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + .15*sin(time*.222); +per_frame_3=wave_g = wave_g + .15*sin(time*.333); +per_frame_4=wave_b = wave_b + .15*sin(time*.444); +per_frame_5=zoom = zoom+.01 - bass_att*.01; +per_frame_6=volume = 0.3*(bass+mid); +per_frame_7=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_8=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_9=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_10=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_11=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_12=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_13=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_14=lastbeat = if(beat,time,lastbeat); +per_frame_15=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_16=beatcounter = if(above(beat,0),beatcounter +1, beatcounter); +per_frame_17=beatcounter = if(above(beatcounter,5), 0, beatcounter); +per_frame_18=beateven = beatcounter%2; +per_frame_19=mycounter = if(beateven,if(beat,if(above(mycounter,4),0,mycounter+1),mycounter),mycounter); +per_frame_20=q2 = if(beat,if(beateven,2,mycounter+3),oldq2); +per_frame_21=oldq2 = q2; +per_frame_22=ib_r = ib_r + 0.25*sin(time*0.965); +per_frame_23=ib_g = ib_g +0.25*sin(time*1.123); +per_frame_24=ib_b = ib_b + 0.25*sin(time*1.046); +per_frame_25=ob_r = ob_r + 0.15*sin(time*0.865); +per_frame_26=ob_g = ob_g +0.15*sin(time*1.103); +per_frame_27=ob_b = ob_b + 0.15*sin(time*1.086); +per_frame_28=wave_a =0; +per_frame_29=ob_size =0.05*beat; +per_frame_30=q1 = beat; +per_frame_31=monitor = q2; +per_frame_32=mv_a = q1*0.02; +per_pixel_1=rot = .3*tan(.1*sin(pow(rad,4)*20+time)+ sin(time*.222)*.1); +per_pixel_2=zoom = zoom + .1*sin((ang)*q2-time); +per_pixel_3=zoomexp = 100*(sqrt(2)-rad); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - twisted bytes.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - twisted bytes.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - twisted bytes.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - twisted bytes.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,69 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.931000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.394148 +fWaveScale=0.627609 +fWaveSmoothing=0.108000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.070500 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.005000 +dy=0.000000 +warp=0.198054 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.700000 +wave_b=0.500000 +wave_x=0.000000 +wave_y=0.030000 +ob_size=0.000000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.059900 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r - 0.5*sin(1.7*time); +per_frame_2=wave_b = wave_b + 0.4*sin(time*1.123); +per_frame_3=wave_g = wave_g - 0.3*cos(0.8*time); +per_frame_4=dx =dx -00.005; +per_frame_5=dy=dy-0.0005; +per_frame_6=warp=0; +per_pixel_1=bass_effect = max(max(bass,bass_att)-1.2,0); +per_pixel_2=dx = if(above(y,0.1),0.02+0*log(x/y)+0.25*bass_effect,0.25*bass_effect-0*log(ang)); +per_pixel_3=zoom = 0.4*rad*x +1; +per_pixel_4=sy= 1+0.5*x; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Ambrosia Mystic (Dark Heart Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Ambrosia Mystic (Dark Heart Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Ambrosia Mystic (Dark Heart Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Ambrosia Mystic (Dark Heart Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.942000 +fVideoEchoZoom=1.006500 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.799900 +fWaveScale=1.549220 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.040604 +rot=0.000000 +cx=0.470000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = 0.5 + 0.5*sin(time*1.143); +per_frame_2=wave_g = 0.5+0.5*sin(time*0.896); +per_frame_3=q8 = (bass+bass_att)*0.5; +per_pixel_1=state_scalar=if(equal(q8,3),-.1,if(equal(q8,2),2,1)); +per_pixel_2=location = sin(ang*10+time+abs(pow(1+rad,q8)+x*10%5)); +per_pixel_3=zoom = zoom+.08*state_scalar*location; +per_pixel_4=rot = rot+.02*state_scalar*location; +per_pixel_5=zoomexp = 1/(pow(q8,q8*10)); +per_pixel_6=zoomexp = if(above(rad,0.8),1,zoomexp); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Centre Of Gravity.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Centre Of Gravity.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Centre Of Gravity.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Centre Of Gravity.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,116 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.996000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=1 +bInvert=0 +fWaveAlpha=0.818016 +fWaveScale=0.653093 +fWaveSmoothing=0.090000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995700 +fWarpScale=1.331000 +fZoomExponent=0.999994 +fShader=0.000000 +zoom=1.008200 +rot=-0.760000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.424100 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.010000 +mv_a=1.000000 +per_frame_1=old_bass_flop=bass_flop; +per_frame_2=old_treb_flop=treb_flop; +per_frame_3=old_mid_flop=mid_flop; +per_frame_4=chaos=.9+.1*sin(pulse); +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_6=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_7=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_8=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_9=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_10=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_11=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_12=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_13=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_14=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_15=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_16=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_17=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.0035); +per_frame_18=entropy=if(bass_changed*mid_changed*treb_changed,(1+bass_flop+treb_flop+mid_flop)*(1+rand(3)),entropy); +per_frame_19=q1=mid_residual; +per_frame_20=q2=bass_residual; +per_frame_21=q3=treb_residual; +per_frame_22=q4=sin(pulse); +per_frame_23=q5=cos(pulse*(.5+.1*entropy)); +per_frame_24=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_25=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_26=q8=entropy; +per_frame_27=wave_r=wave_r+wave_r*q1; +per_frame_28=wave_b=wave_b+wave_b*q2; +per_frame_29=wave_g=wave_g+wave_g*q3; +per_frame_30=ob_r=ob_r+ob_r*sin(q1+q2*2.14); +per_frame_31=ob_b=ob_b+ob_b*sin(q2+q3*2.14); +per_frame_32=ob_g=ob_g+ob_g*sin(q3+q1*2.14); +per_frame_33=ib_r=ib_r+ib_r*cos(q5+q1*2.14); +per_frame_34=ib_b=ib_b+ib_*cos(q5+q2*2.14); +per_frame_35=ib_g=ib_g+ib_g*cos(q5+q3*2.14); +per_frame_36=ob_a=.25+.25*sin(q2+q3*2.14); +per_frame_37=ib_a=.25+.25*sin(q2*2.14+q3); +per_frame_38=ob_size=.1+.1*sin(q3*3+q1); +per_frame_39=ib_size=.1+.1*sin(q1*3+q3); +per_frame_40=wave_mystery=.5*q6; +per_frame_41=warp=0; +per_frame_42=wave_mode=q8%7; +per_frame_43=mv_x = 1.25; +per_frame_44=mv_y = 1.25; +per_frame_45=mv_dx = 0.1*sin(time); +per_frame_46=mv_dy = -0.1*cos(time); +per_pixel_1=c1=x*q1+sin(ang)*q4; +per_pixel_2=c2=y*q2+sin(ang)*q6; +per_pixel_3=radix=if(above(q3,0),min(x-c2,y-c2),max(x*c1,y*c1)); +per_pixel_4=radix=if(above(q2,0),min(radix,rad),max(radix,rad)); +per_pixel_5=rot=if(above(q6,0),((sqrt(2)*0.5)-rad)*.18*q5,.2*q5*sin(rad*2.133*q7)); +per_pixel_6=zoom=if(above(q2,0),zoom,if(above(q3,0),1+.07*sin(q4*.2*radix),1+.07*cos(radix*10*q4))); +per_pixel_7=zoomexp=if(above(q2,0),zoomexp, if(above(q3,0),1-.07*sin(q4*.2*radix), 1+.07*cos(radix*10*q4)))*rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Demonology (Vampire Soul Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Demonology (Vampire Soul Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Demonology (Vampire Soul Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Demonology (Vampire Soul Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,126 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999900 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.868000 +fWaveScale=0.282091 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.001700 +fShader=0.000000 +zoom=0.988100 +rot=1.000000 +cx=2.000000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.200000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.600000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.550000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=le=1+.5+2*sin(bass_att); +per_frame_3=bpulse=band(above(le,bth),above(le-bth,bblock)); +per_frame_4=bblock=le-bth; +per_frame_5=bth=if(above(le,bth),le+114/(le+10)-7.407, +per_frame_6=bth+bth*.07/(bth-12)+below(bth,2.7)*.1*(2.7-bth)); +per_frame_7=bth=if(above(bth,6),6,bth); +per_frame_8=bres=bpulse*sin(pulse+le*.5) + bnot(bpulse)*bres; +per_frame_9= +per_frame_10=le=1+.5+2*sin(treb_att); +per_frame_11=tpulse=band(above(le,tth),above(le-tth,tblock)); +per_frame_12=tblock=le-tth; +per_frame_13=tth=if(above(le,tth),le+114/(le+10)-7.407, +per_frame_14=tth+tth*.07/(tth-12)+below(tth,2.7)*.1*(2.7-tth)); +per_frame_15=tth=if(above(tth,6),6,tth); +per_frame_16=tres=tpulse*sin(pulse+le*.5) + bnot(tpulse)*tres; +per_frame_17= +per_frame_18=le=1+.5+2*sin(mid_att); +per_frame_19=mpulse=band(above(le,mth),above(le-mth,mblock)); +per_frame_20=mblock=le-mth; +per_frame_21=mth=if(above(le,mth),le+114/(le+10)-7.407, +per_frame_22=mth+mth*.07/(mth-12)+below(mth,2.7)*.1*(2.7-mth)); +per_frame_23=mth=if(above(mth,6),6,mth); +per_frame_24=mres=mpulse*sin(pulse+le*.5) + bnot(mpulse)*mres; +per_frame_25= +per_frame_26= +per_frame_27= +per_frame_28=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bth+mth+tth)*.003); +per_frame_29=q1=bres; +per_frame_30=q2=tres; +per_frame_31=q3=mres; +per_frame_32=q4=sin(pulse); +per_frame_33= +per_frame_34=mod_state=(above(q1,0)+above(q2,0)+above(q3,0))*(1+above(q4,0)); +per_frame_35=ccl=ccl+tpulse+mpulse-bpulse; +per_frame_36=q5=cos(pulse*(.5+.1*mod_state)); +per_frame_37=q6=sin(pulse*(.5+pow(.25,mod_state))); +per_frame_38=q7=mod_state; +per_frame_39=q8=ccl; +per_frame_40=ob_r=.5+.5*cos(q1+q7); +per_frame_41=ob_g=.5+.5*cos(q2*3.14+q7); +per_frame_42=ob_b=.5+.5*cos(q3*2+sin(time*.0816)); +per_frame_43=ib_size=.025+.02*q2; +per_frame_44=ob_size=.03+.02*q3-.002*q7; +per_frame_45=wave_r=.5+.5*sin(q1*q7+time*2.183); +per_frame_46=wave_g=.5+.5*sin(q2*3+time*1.211); +per_frame_47=wave_b=.5+.5*sin(q3+time*1.541); +per_frame_48=wave_mystery=wave_mystery+0.2*sin(time*2.18+q6); +per_frame_49=wave_x=wave_x+0.1*sin(time*.811+q1)+.1*(frame%3)*sign(q3); +per_frame_50=wave_y=wave_y+0.1*sin(time*.788+q2)+.1*(frame%2)*sign(q3); +per_frame_51=wave_mode=3 - 0.3*q7; +per_frame_52=mv_a = bass+ bass_att -2.5; +per_pixel_1=snee=bnot(above(x,.5)*above(q2,0)+above(y,.5)*above(q1,0)); +per_pixel_2=snur=bnot(below(x,.5)*above(q3,0)+below(y,.5)*below(q7,4)); +per_pixel_3=grid=pow(sin(rad*6*sin(q8)+(atan(ang*(1-y)-1.57))*6*q1)*2,1+q8%3)*(1+q7); +per_pixel_4=test = below(rad,0.5+ 0.25*q1); +per_pixel_5=cx =if(test,(0&(x*15-0.5*rad))*(1/(15-0.5*rad))+0,0.5); +per_pixel_6=cy =if(test, (0&(y*15-0.5*rad))*(1/(15-0.5*rad))+0,0.5); +per_pixel_7=rot=if(test, 0.1*q1-0.5*rad,snee*bnot(below(y,.5)*below(q7,3))*if(bnot(grid%q8),1,.1*sin(rad*3.14*q3))); +per_pixel_8=zoom=zoom-.031*snur*sin(rad*q7*q5)+snee*bnot(snur)*sin(rad*6*q5)*.1; +per_pixel_9=sx=if(test,1,sx+.0361*bnot(snee)*cos(y*3.14*q4)); +per_pixel_10=sy=if(test,1,sy+.00361*bnot(snur)*cos(x*3.14*q6)); +per_pixel_11=zoomexp = if(test,1 + rad,zoom+rot); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Oddball World.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Oddball World.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Oddball World.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Oddball World.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,93 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.960000 +fVideoEchoZoom=0.999900 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=25.080072 +fWaveSmoothing=0.750000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.008100 +fShader=0.300000 +zoom=0.122270 +rot=0.240000 +cx=2.000000 +cy=-1.000000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.003000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=0.600000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.050000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=// sensor - alpha +per_frame_2=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_3=pulse=band(above(le,th),above(le-th,block)); +per_frame_4=block=le-th; +per_frame_5=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_6=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_7=th=if(above(th,5.2),4,th); +per_frame_8= +per_frame_9=q1=.12*th; +per_frame_10=ccl=if(pulse,ccl+1,ccl); +per_frame_11=q2=ccl; +per_frame_12= +per_frame_13=ob_r=ob_r + time*sin(bass); +per_frame_14=ob_b=ob_b + time*sin(treb+1); +per_frame_15=ob_g=ob_g + time*sin(mid/1.5); +per_frame_16=zoomexp = q1; +per_frame_17=myb = cos(time) + abs(cos(time)); +per_frame_18=myg = abs(sin(time)) ; +per_frame_19=myr = (-1 * cos(time)) + abs(-1 * cos(time)) + 0.2 * (cos(sin(time))+(abs(cos(sin(time)))+cos(sin(time)))); +per_frame_20=avg = .9*avg+.1*le; +per_frame_21=wave_r = if(below(avg,1.8),myr,0); +per_frame_22=wave_b = if(below(avg,1.8),myb,0); +per_frame_23=wave_g = if(below(avg,1.8),myg,0); +per_frame_24=monitor = avg; +per_pixel_1=grid=sign(pow(sin(ang*(q2)+x*y*q1)*2,1+q2%4)) -.5; +per_pixel_2=snee=.5*sin(q2*q1); +per_pixel_3=rot=bnot(grid%((q2%10)+2))*above(x,.5+snee)*above(y,.5-snee); +per_pixel_4=sx=sx-sin((q2+.5)*x)*band(rot,snee)*.003; +per_pixel_5=sy=sy-cos((q2+3.4)*y)*band(rot,snee)*.003; +per_pixel_6=zoom=1+.1*sin((q1-q2)*3)+.2*cos(1.6*sin(time)+rad*6.28*q1)*below(x,.5+snee)*below(y,.5-snee); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Voodoo Chess Magnet (Everglow Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Voodoo Chess Magnet (Everglow Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Voodoo Chess Magnet (Everglow Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Voodoo Chess Magnet (Everglow Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,110 @@ +[preset00] +fRating=2 +fGammaAdj=2 +fDecay=1 +fVideoEchoZoom=1.006496 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.781664 +fWaveScale=0.590116 +fWaveSmoothing=0.36 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=7.523901 +fShader=0 +zoom=1.009898 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=1 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.01 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0 +ib_r=0.25 +ib_g=0.25 +ib_b=0.25 +ib_a=1 +nMotionVectorsX=64 +nMotionVectorsY=48 +mv_dx=0 +mv_dy=0 +mv_l=0 +mv_r=0.35 +mv_g=0.35 +mv_b=0.35 +mv_a=0 +per_frame_1=warp=0; +per_frame_2=state=if(above(bass_att,1.3),3,if(above(treb_att,1.3),2,1)); +per_frame_3=wave_b=if(equal(state,2),.2+.2*sin(time),if(equal(state,3),.9+.1*sin(time),.6+.08*sin(time))); +per_frame_4=wave_g=if(equal(state,2),0,if(equal(state,3),0,.49)); +per_frame_5=wave_r=if(equal(state,2),.7+.1*sin(time*.888),0); +per_frame_6=//zoom=if(above(bass_att+treb,2),1+sin(state*1.3)/10,1-sin(state*1.5)/10); +per_frame_7=q1=state; +per_frame_8=wave_mystery=wave_mystery+(1-zoom)*10; +per_frame_9=// timed sidon sensor +per_frame_10=// le = signal level; desired average value = 2 +per_frame_11=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_12=pulse=above(le,th); +per_frame_13=// pulsefreq = running average of interval between last 5 pulses +per_frame_14=pulsefreq=if(equal(pulsefreq,0),2, +per_frame_15=if(pulse,.8*pulsefreq+.2*(time-lastpulse),pulsefreq)); +per_frame_16=lastpulse=if(pulse,time,lastpulse); +per_frame_17=// bt = relative time; 0 = prev beat; 1 = expected beat +per_frame_18=bt=(time-lastbeat)/(.5*beatfreq+.5*pulsefreq); +per_frame_19=// hccp = handcicap for th driven by bt +per_frame_20=hccp=(.03/(bt+.2))+.5*if(band(above(bt,.8),below(bt,1.2)), +per_frame_21=(pow(sin((bt-1)*7.854),4)-1),0); +per_frame_22=beat=band(above(le,th+hccp),btblock); +per_frame_23=btblock=1-above(le,th+hccp); +per_frame_24=lastbeat=if(beat,time,lastbeat); +per_frame_25=beatfreq=if(equal(beatfreq,0),2, +per_frame_26=if(beat,.8*beatfreq+.2*(time-lastbeat),beatfreq)); +per_frame_27=// th = threshold +per_frame_28=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_29=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_30=th=if(above(th,6),6,th); +per_frame_31=q3=30/fps; +per_frame_32=ccl=ccl+beat; +per_frame_33=minorccl=minorccl+.01*le; +per_frame_34=q4=beat; +per_frame_35=beatcounter = if(beat,beatcounter +1, beatcounter); +per_frame_36=beatcounter = if(above(beatcounter,7), 0, beatcounter); +per_frame_37=beateven = beatcounter%2; +per_frame_38=q5 = beateven; +per_frame_39=q8 =oldq8+ 0.005*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_40=oldq8 = q8; +per_pixel_1=grid=abs(x*18+3*q5)%2 + abs(y*18+3*q5)%2; +per_pixel_2=cx = grid; +per_pixel_3=cy = grid; +per_pixel_4=zoom=1+0.5*if(bnot(grid),cos(rad*10*sin(q8))*.07,cos(x*10*sin(q8))*.07); +per_pixel_5=rot = 0.01*(1-rad); +per_pixel_6=dx=0.4*grid*(0.008*sin((y*2-1)*48)+0.008*sin((y*2-1)*64)); +per_pixel_7=dy=0.4*grid*(0.008*cos((x*2-1)*64)+0.008*cos((x*2-1)*48)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Xen Traffic.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Xen Traffic.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Xen Traffic.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Unchained - Xen Traffic.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,113 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.975000 +fVideoEchoZoom=0.999993 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.741913 +fWaveScale=0.502368 +fWaveSmoothing=0.360000 +fWaveParam=-0.280000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.942044 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.920000 +ib_size=0.004000 +ib_r=0.400000 +ib_g=0.400000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=63.936001 +nMotionVectorsY=47.952000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=0.400000 +mv_b=0.400000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(beat); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-3.14),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.052); +per_frame_20=beat=if(above(abs(beat),3.14),-3.14,beat+(bass+treb+mid)*.01); +per_frame_21=q1=mid_residual; +per_frame_22=q2=bass_residual; +per_frame_23=q3=treb_residual; +per_frame_24=q4=sin(pulse); +per_frame_25=q5=sin(beat); +per_frame_26=mv_r=mv_r+.5*bass_residual; +per_frame_27=mv_g=mv_g+.5*mid_residual; +per_frame_28=mv_b=mv_b+.5*treb_residual; +per_frame_29=mv_a=1.1-(ob_a+ib_a)*chaos*.5; +per_frame_30=mv_x=abs(beat*10)*entropy; +per_frame_31=mv_y=abs(pulse*10)*entropy; +per_frame_32=mv_l=entropy*(q4-q5); +per_frame_33=wave_r=0.8+0.2*bass_flop*mv_g; +per_frame_34=wave_g=0.3+0.3*mid_flop*mv_b; +per_frame_35=wave_b=0.4+0.3*0.1*treb_flop*mv_r; +per_frame_36=ob_r=0.1 + 0.1*sin(time*1.143)+0.2*mv_g; +per_frame_37=ob_g=0.3 + 0.3*sin(time*0.897)+0.3*mv_b; +per_frame_38=ob_b=0.2+0.5*mv_r; +per_frame_39=treb_effect = max(max(treb, treb_att)-1.2,0); +per_frame_40=mid_effect = max(max(mid,mid_att)-1.2,0); +per_frame_41=ib_r = 1 - ob_b; +per_frame_42=ib_g = 1- mv_g; +per_frame_43=ib_b = 0.5*mv_b + 0.5*ob_b; +per_frame_44=ib_a = if(above(treb_effect,0), if(above(mid_effect,0),1,0),0); +per_frame_45=q6 = max(max(bass,bass_att)-1.18,0); +per_pixel_1=grid=rad*10%(above(q1,q4)+above(q2,q5)+above(q3,q4)) + (sqrt(2)-rad)*10%(above(q1,q5)+above(q2,q4)+above(q3,q5))*q1; +per_pixel_2=rot=if(grid,.12*cos(rad*3.14+x*q1*3.14+y*q2*3.14)*(q5+q4),0); +per_pixel_3=zoom=zoom-bnot(grid)*atan2(x*q3*3.14,y*q5*3.14)*.14*(x*2-1)+0.12*q6; +per_pixel_4=sx=sx+.2*q1*sin(x*1.6)*-grid; +per_pixel_5=sy=sy+.2*q2*sin(y*1.6)*(1-grid); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - VooV's Movement (After Dark Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - VooV's Movement (After Dark Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - VooV's Movement (After Dark Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - VooV's Movement (After Dark Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,113 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.186471 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.351767 +fShader=0.000000 +zoom=0.980296 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.700000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=1.000000 +ob_b=1.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=1.280000 +nMotionVectorsY=1.248000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=framehalf = frame%2; +per_frame_3=volume = 0.3*(bass+mid); +per_frame_4=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_5=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_6=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_7=peakbass_att = max(bass_att,peakbass_att); +per_frame_8=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_9=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_10=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.99 + (1-above(time - lastbeat, 2*beatrate))*0.998); +per_frame_11=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_12=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_13=mode = if(beat,abs(mode-1),mode); +per_frame_14=q8 = oldq8 +0.003*(((pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,5)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,4)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,3)/fps) + (pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,2)/fps) +(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att)/fps)) + 1/(fps*5); +per_frame_15=oldq8 = q8; +per_frame_16=q1 = 0.5 + 0.15*sin(0.416*q8) + 0.15*sin(0.832*q8) + 0.1*sin(1.324*q8); +per_frame_17=q2 = 0.5 + 0.15*sin(0.341*q8) + 0.15*sin(0.768*q8) + 0.1*sin(1.523*q8); +per_frame_18=q6 = 0.5 + 0.15*sin(0.287*q8) + 0.15*sin(0.913*q8) + 0.1*sin(1.142*q8); +per_frame_19=q7 = 0.5 + 0.15*sin(0.531*q8) + 0.15*sin(0.671*q8) + 0.1*sin(1.442*q8); +per_frame_20=ob_size = beat*0.05; +per_frame_21=ob_r = sin(20*(q1+q2)); +per_frame_22=ob_g = sin(25*(q6+q7)); +per_frame_23=q4 = (8 + 0.2*sin(q8*0.385) + 0.2*sin(q8*0.641) + 0.2*sin(q8*0.846)); +per_frame_24=q5 = (12 + 0.2*sin(q8*0.385) + 0.2*sin(q8*0.641) + 0.2*sin(q8*0.846)); +per_frame_25=q3 = mode; +per_frame_26=wave_a =0.4; +per_frame_27=wave_r = if(framehalf,0.5 + 0.15*sin(0.512*time) + 0.15*sin(0.943*time) + 0.1*sin(1.024*time),0.5 + 0.15*sin(0.483*time) + 0.15*sin(0.879*time) + 0.1*sin(1.423*time)); +per_frame_28=wave_g = if(framehalf,0.5 + 0.15*sin(0.248*time) + 0.15*sin(0.829*time) + 0.1*sin(1.623*time),0.5 + 0.15*sin(0.461*time) + 0.15*sin(0.699*time) + 0.1*sin(1.254*time)); +per_frame_29=wave_b = if(framehalf,0.5 + 0.15*sin(0.211*time) + 0.15*sin(0.652*time) + 0.1*sin(1.865*time),0.5 + 0.15*sin(0.333*time) + 0.15*sin(0.978*time) + 0.1*sin(1.359*time)); +per_pixel_1=newx = x - q1; +per_pixel_2=newy = y - q6; +per_pixel_3=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_4=newang = atan2(newx,newy); +per_pixel_5=newzoom = pow(0.995 + 0.05*sin((q4)*(newang+q3)), pow(sin(newrad*newrad), newrad)); +per_pixel_6=dx = (newx)*newzoom - newx; +per_pixel_7=dy = (newy)*newzoom - newy; +per_pixel_8=newx = x - q2; +per_pixel_9=newy = y - q7; +per_pixel_10=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_11=newang = atan2(newx,newy); +per_pixel_12=newzoom = pow(0.995 + 0.05*sin((q5)*(newang)), pow(sin(newrad*newrad), newrad)); +per_pixel_13=dx = dx + (newx)*newzoom - newx; +per_pixel_14=dy = dy + (newy)*newzoom - newy; +per_pixel_15=newx = x - (0.33*(q1+q2+q6)); +per_pixel_16=newy = y - (0.33*(3-q2-q6-q7)); +per_pixel_17=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_18=newang = atan2(newx,newy); +per_pixel_19=newzoom = pow(1.04 + 0.05*sin(0.5*(q4+q5)*(newang)), pow(sin(newrad*newrad), newrad)); +per_pixel_20=dx = dx + (newx)*newzoom - newx; +per_pixel_21=dy = dy + (newy)*newzoom - newy; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - VooV's Movement.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - VooV's Movement.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - VooV's Movement.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar - VooV's Movement.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,125 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.186471 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.351767 +fShader=0.000000 +zoom=0.980296 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.700000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=1.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=1.280000 +nMotionVectorsY=1.248000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=framehalf = frame%2; +per_frame_3=volume = 0.3*(bass+mid); +per_frame_4=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_5=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_6=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_7=peakbass_att = max(bass_att,peakbass_att); +per_frame_8=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_9=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_10=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.99 + (1-above(time - lastbeat, 2*beatrate))*0.998); +per_frame_11=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_12=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_13=mode = if(beat,abs(mode-1),mode); +per_frame_14=q1 = 0.5 + 0.15*sin(0.416*time) + 0.15*sin(0.832*time) + 0.1*sin(1.324*time); +per_frame_15=q2 = 0.5 + 0.15*sin(0.341*time) + 0.15*sin(0.768*time) + 0.1*sin(1.523*time); +per_frame_16=q6 = 0.5 + 0.15*sin(0.287*time) + 0.15*sin(0.913*time) + 0.1*sin(1.142*time); +per_frame_17=q7 = 0.5 + 0.15*sin(0.531*time) + 0.15*sin(0.671*time) + 0.1*sin(1.442*time); +per_frame_18=//ob_size = beat*0.05; +per_frame_19=ob_r = sin(20*(q1+q2)); +per_frame_20=ob_g = sin(25*(q6+q7)); +per_frame_21=//mv_x = 1.25; +per_frame_22=//mv_y = 1.25; +per_frame_23=//mv_dx = (0.33*(q1+q2+q6))-0.5; +per_frame_24=//mv_dy = (1-0.33*(3-q2-q6-q7))-0.5; +per_frame_25=//mv_a = 1; +per_frame_26=//mv_l = 10*bass; +per_frame_27=change = if(beat,rand(10)+3,oldchange); +per_frame_28=oldchange = change; +per_frame_29=q4 = (change + 0.2*sin(time*0.385) + 0.2*sin(time*0.641) + 0.2*sin(time*0.846)); +per_frame_30=//ch = if(beat,rand(10)+3,oldch); +per_frame_31=zz = if(beat,rand(13)+3,oldzz); +per_frame_32=oldzz =zz; +per_frame_33=q5 = (zz + 0.2*sin(time*0.385) + 0.2*sin(time*0.641) + 0.2*sin(time*0.846)); +per_frame_34=q3 = mode; +per_frame_35=monitor = mode; +per_frame_36=//wave_x = if(framehalf,q1,q2); +per_frame_37=//wave_y =1- if(framehalf,q6,q7); +per_frame_38=//wave_a =0; +per_frame_39=wave_r = if(framehalf,0.5 + 0.15*sin(0.512*time) + 0.15*sin(0.943*time) + 0.1*sin(1.024*time),0.5 + 0.15*sin(0.483*time) + 0.15*sin(0.879*time) + 0.1*sin(1.423*time)); +per_frame_40=wave_g = if(framehalf,0.5 + 0.15*sin(0.248*time) + 0.15*sin(0.829*time) + 0.1*sin(1.623*time),0.5 + 0.15*sin(0.461*time) + 0.15*sin(0.699*time) + 0.1*sin(1.254*time)); +per_frame_41=wave_b = if(framehalf,0.5 + 0.15*sin(0.211*time) + 0.15*sin(0.652*time) + 0.1*sin(1.865*time),0.5 + 0.15*sin(0.333*time) + 0.15*sin(0.978*time) + 0.1*sin(1.359*time)); +per_pixel_1=newx = x - q1; +per_pixel_2=newy = y - q6; +per_pixel_3=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_4=newang = atan2(newx,newy); +per_pixel_5=newzoom = pow(0.995 + 0.05*sin((q4)*(newang+q3)), pow(sin(newrad*newrad), newrad)); +per_pixel_6=dx = (newx)*newzoom - newx; +per_pixel_7=dy = (newy)*newzoom - newy; +per_pixel_8=newx = x - q2; +per_pixel_9=newy = y - q7; +per_pixel_10=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_11=newang = atan2(newx,newy); +per_pixel_12=newzoom = pow(0.995 + 0.05*sin((q5)*(newang)), pow(sin(newrad*newrad), newrad)); +per_pixel_13=dx = dx + (newx)*newzoom - newx; +per_pixel_14=dy = dy + (newy)*newzoom - newy; +per_pixel_15=newx = x - (0.33*(q1+q2+q6)); +per_pixel_16=newy = y - (0.33*(3-q2-q6-q7)); +per_pixel_17=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,sqrt(2)); +per_pixel_18=newang = atan2(newx,newy); +per_pixel_19=newzoom = pow(1.04 + 0.05*sin(0.5*(q4+q5)*(newang)), pow(sin(newrad*newrad), newrad)); +per_pixel_20=dx = dx + (newx)*newzoom - newx; +per_pixel_21=dy = dy + (newy)*newzoom - newy; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Azirphaeli's Plan (Multiplan Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Azirphaeli's Plan (Multiplan Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Azirphaeli's Plan (Multiplan Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Azirphaeli's Plan (Multiplan Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,96 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.792077 +fWaveScale=0.999999 +fWaveSmoothing=0.000000 +fWaveParam=0.020000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=1.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = if(equal(wavecolor,1),.5 + .3*sin(time),if(equal(wavecolor,3),if( above(bass,1),1,0 ),if(equal(wavecolor,4),if(above(bass,1),0,1),bass_att*.1))); +per_frame_3=wave_g = if(equal(wavecolor,1),.5 + .3*sin(time*.333),if(equal(wavecolor,2),if(above(bass,1),1,0),if(equal(wavecolor,3),if( above(bass,1),0,1 ), +per_frame_4=treb_att*.1))); +per_frame_5=wave_b = if(equal(wavecolor,1),.5 + .3*sin(time*.666),if(equal(wavecolor,2),if(above(bass,1),0,1),if(equal(wavecolor,4),if( above(bass,1),1,0 ),mid_att*.1))); +per_frame_6=q1 = zoomeffect; +per_frame_7=wave_mystery=if( equal(othereffects,1),-.6+.4*sin(time),if( equal(wavesize,1),-.2,if( equal(wavesize,2),-.5,0))); +per_frame_8=ob_a = if( equal(zoomeffect,2),if( equal(othereffects,2),bass*.1,0),if( equal(zoomeffect,7),if(equal(othereffects,2),bass*.1,0),if( equal(zoomeffect,8),if(equal(othereffects,2),bass*.1,0),if( equal(zoomeffect,9),if(equal(othereffects,2),bass*.1,0),0)))); +per_frame_9=ob_r = wave_g; +per_frame_10=ob_g = wave_b; +per_frame_11=ob_b = wave_r; +per_frame_12=q2 = othereffects; +per_frame_13=wave_mode = if(equal(wavetype,3),5,wavetype); +per_frame_14=decay = if(equal(othereffects,3),.95+.05*sin(time),decay); +per_frame_15=volume = 0.3*(bass+mid+att); +per_frame_16=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_17=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_18=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_19=peakbass_att = max(bass_att,peakbass_att); +per_frame_20=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_21=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_22=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_23=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_24=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_25=mode = if(beat,rand(4),mode); +per_frame_26=wavecolor = if(beat,rand(5),wavecolor); +per_frame_27=zoomeffect = if(beat,rand(10),zoomeffect); +per_frame_28=wavesize = if(beat,rand(3),wavesize); +per_frame_29=othereffects = if(beat,rand(4),othereffects); +per_frame_30=wavetype = if(beat,rand(4),wavetype); +per_pixel_1=zoom = if( equal(q1,1),1+rad*.08,if( equal(q1,2),.93+bass_att*.07,if( equal(q1,3),1.06+.05*sin(rad*30+time*5),if( equal(q1,4),1.05+.05*sin((rad+ang*8+time*5)),if( equal(q1,5),1.05+.05*sin((rad*8+time*5)+(ang*8+time*5)),if( equal(q1,6),1 + .2*abs(rad-.5),if( equal(q1,7),1+.2*(-rad+.5),if( equal(q1,8),(3*y)+2*(pow(x,2))*.01,if( equal(q1,9),1 + .1*sin(y*10),1))))))))); +per_pixel_2=dx = if(equal(q1,10),(rand(11)*.01)-.05,0); +per_pixel_3=dy = if(equal(q1,10),(rand(11)*.01)-.05,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Narell's Fever.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Narell's Fever.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Narell's Fever.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Narell's Fever.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,93 @@ +[preset00] +fRating=2 +fGammaAdj=2 +fDecay=0.98 +fVideoEchoZoom=2 +fVideoEchoAlpha=0 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.221673 +fWaveScale=0.685151 +fWaveSmoothing=0.75 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1 +fShader=0 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=1 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.01 +ob_r=0.2 +ob_g=0.4 +ob_b=0.22 +ob_a=1 +ib_size=0.01 +ib_r=0.25 +ib_g=0.75 +ib_b=0.55 +ib_a=1 +nMotionVectorsX=64 +nMotionVectorsY=3 +mv_dx=0 +mv_dy=0 +mv_l=3.95 +mv_r=1 +mv_g=1 +mv_b=1 +mv_a=0 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + .15*sin(time*.222); +per_frame_3=wave_g = wave_g + .15*sin(time*.333); +per_frame_4=wave_b = wave_b + .15*sin(time*.444); +per_frame_5=zoom = zoom+.01 - bass_att*.01; +per_frame_6=volume = 0.3*(bass+mid); +per_frame_7=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_8=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_9=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_10=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_11=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_12=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_13=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_14=lastbeat = if(beat,time,lastbeat); +per_frame_15=peakbass_att = max(if(beat,bass_att,peakbass_att),1.1*meanbass_att); +per_frame_16=beatcounter = if(above(beat,0),beatcounter +1, beatcounter); +per_frame_17=beatcounter = if(above(beatcounter,5), 0, beatcounter); +per_frame_18=beateven = beatcounter%2; +per_frame_19=mycounter = if(beateven,if(beat,if(above(mycounter,4),0,mycounter+1),mycounter),mycounter); +per_frame_20=q2 = if(beat,if(beateven,2,mycounter+3),oldq2); +per_frame_21=oldq2 = q2; +per_frame_22=ib_r = ib_r + 0.25*sin(time*0.965); +per_frame_23=ib_g = ib_g +0.25*sin(time*1.123); +per_frame_24=ib_b = ib_b + 0.25*sin(time*1.046); +per_frame_25=ob_r = ob_r + 0.15*sin(time*0.865); +per_frame_26=ob_g = ob_g +0.15*sin(time*1.103); +per_frame_27=ob_b = ob_b + 0.15*sin(time*1.086); +per_pixel_1=rot = .3*tan(.1*sin(pow(rad,4)*20+time)+sin(time*.222)*.1); +per_pixel_2=zoom = zoom + .1*sin((ang)*q2+time); +per_frame_init_1=beatcounter =0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Passion Flower.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Passion Flower.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Passion Flower.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Passion Flower.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=1 +bInvert=1 +fWaveAlpha=1.315701 +fWaveScale=2.063784 +fWaveSmoothing=0.720000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = -1&(bass); +per_frame_3=wave_g = -1&(treb); +per_frame_4=wave_b = if(below(wave_r,1),if(below(wave_g,1),1,0),0); +per_frame_5=dx = -0.0003; +per_frame_6=dy = 0.0003; +per_pixel_1=zoom = if(above(rad,.13),rad*.1+0.98,1.01); +per_pixel_2=cx = (10&(x*15-0.5))*(1/15)+0.05; +per_pixel_3=cy = (10&(y*15-0.5))*(1/15)+0.05; +per_pixel_4=rot = 0-if(above(rad,.3),rad*.1+0.05,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Sea Of Zigrot.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Sea Of Zigrot.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Sea Of Zigrot.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rovastar & Zylot - Sea Of Zigrot.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.179142 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.199900 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.400000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_b = .25 + mid_att*.3; +per_frame_3=zoom = zoom + bass_att*.05; +per_pixel_1=dx = rad*sin(x*y)*.05; +per_pixel_2=warp = -rad; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzer & Zylot - Force Field Generator (Slowtime Tweak).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzer & Zylot - Force Field Generator (Slowtime Tweak).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzer & Zylot - Force Field Generator (Slowtime Tweak).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzer & Zylot - Force Field Generator (Slowtime Tweak).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.050000 +fDecay=0.950000 +fVideoEchoZoom=0.333500 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.108925 +fWaveSmoothing=0.900000 +fWaveParam=-0.399900 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=slowtime = slowtime+beat; +per_frame_2=vol_now = .4 * bass + 0.1 * (bass_att+treb+mid); +per_frame_3=vol_mean = if(equal(frame%50,0),vol_mean-0.5*(vol_mean-vol_now),0.1*(vol_mean*9 + vol_now)); +per_frame_4=beat = if(above(vol_now,1.5*vol_mean),1,0); +per_frame_5=beatcount = beatcount + beat; +per_frame_6=wave_b = 1- (cos(time) + abs(cos(time))); +per_frame_7=wave_g = 1-abs(sin(time)) ; +per_frame_8=wave_r = 1-(-1 * cos(time)) + abs(-1 * cos(time)) + 0.2 * (cos(sin(time))+(abs(cos(sin(time)))+cos(sin(time)))); +per_frame_9=q1 = abs(sin(slowtime)/3)-.2; +per_frame_10= +per_frame_11=warp = 0; +per_frame_12=wave_mode = 6; +per_frame_13=wave_mystery = if(below(frame%2,1),0,1)+slowtime*q1; +per_frame_14=monitor = q1; +per_pixel_1=zoom = zoom - q1*rad; +per_pixel_2=dx = .5; +per_pixel_3=dy = .5; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Aderrasi - Canon.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Aderrasi - Canon.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Aderrasi - Canon.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Aderrasi - Canon.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.463937 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.100000 +ob_size=0.010000 +ob_r=1.000000 +ob_g=1.000000 +ob_b=1.000000 +ob_a=1.000000 +ib_size=0.015000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=1.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_mystery = wave_mystery + 0.25*tan(3*bass); +per_frame_2=q1 = wave_mystery; +per_frame_3=wave_b = cos(time) + abs(cos(time)); +per_frame_4=wave_g = abs(sin(time)) ; +per_frame_5=wave_r = (-1 * cos(time)) + abs(-1 * cos(time)) + 0.2 * (cos(sin(time))+(abs(cos(sin(time)))+cos(sin(time)))); +per_frame_6=ob_r = if(above(wave_r,1),1,if(above(wave_r,0), abs(wave_r),0)); +per_frame_7=ob_g = if(above(wave_g,1),1,if(above(wave_g,0), abs(wave_g),0)); +per_frame_8=ob_b = if(above(wave_b,1),1,if(above(wave_b,0), abs(wave_b),0)); +per_frame_9=ib_g = wave_g; +per_frame_10=ib_r = sin(time); +per_frame_11=kick = above(bass_att,kick)*2 + (1-above(bass_att,kick))*((kick-1.3)*0.96+1.3); +per_frame_12=dx_r = equal(kick,2)*0.018*sin(6*time) + (1-equal(kick,2))*dx_r; +per_frame_13=dy_r = equal(kick,2)*0.015*sin(7*time) + (1-equal(kick,2))*dy_r; +per_frame_14=dy = dy + 2*dy_r * 0.5*sin(0.8*time); +per_frame_15=dx = dx + 2*dx_r * 0.5*sin(time); +per_frame_16=warp = warp + if (below(kick,0), + 0.5*treb, 0); +per_frame_17=q2 = kick; +per_pixel_1=rot = rot + 0.3*(0.2*sin(1-rad)*5 - 0.2*sin(0.05*rad)*5) * q2; +per_pixel_2=cx = if(above(dy,-.5),1-rot * 2,rot*q2); +per_pixel_3= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and che - Inside the House of nil.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and che - Inside the House of nil.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and che - Inside the House of nil.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and che - Inside the House of nil.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,86 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.175613 +fWaveSmoothing=0.306000 +fWaveParam=-0.460000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.854653 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.190000 +ob_g=0.120000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.015000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=7.679999 +nMotionVectorsY=11.519997 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.340000 +per_frame_1=slowtime = slowtime+beat*time; +per_frame_2=vol_now = .4 * bass + 0.1 * (bass_att+treb+mid); +per_frame_3=vol_mean = if(equal(frame%50,0),vol_mean-0.5*(vol_mean-vol_now),0.1*(vol_mean*9 + vol_now)); +per_frame_4=beat = if(above(vol_now,1.5*vol_mean),1,0); +per_frame_5=ib_r = - abs(cos(time)); +per_frame_6=ib_g = sin(time); +per_frame_7=ib_b= cos(time)*sign(cos(time)); +per_frame_8=mv_r = abs(sin(time)); +per_frame_9=mv_g = sin(slowtime) ; +per_frame_10=mv_b= cos(slowtime)*sign(cos(slowtime)); +per_frame_11=redneg = if(below(mv_r,0),1,0); +per_frame_12=greenneg = if(below(mv_g,0),1,0); +per_frame_13=blueneg = if(below(mv_b,0),1,0); +per_frame_14=wave_r = if(redneg,if(bor(greenneg , blueneg),1,1+mv_r),mv_r); +per_frame_15=wave_g = if(greenneg,if(equal(greenneg + blueneg,2),1,1+mv_g),mv_g); +per_frame_16=wave_b = if(blueneg,1 + mv_b, mv_b); +per_frame_17=dx=sin(slowtime*1.234)*.0125; +per_frame_18=dy=cos(slowtime*.9666)*.0125; +per_frame_19=q1 = sin(slowtime); +per_frame_20=q2 = wave_b; +per_pixel_1=zoom=1+above(sin(1.7*q2),-.5)*.1*sin(2*q2+.027*q1+4*(1+sin(.7*time+q2))*sin(.05*q2+time)*rad); +per_pixel_2=rot=.1*sin(q2)*sin(2.3*q2+.027*q1+2*sin(.07*q1+1.2*time)*(rad+sin(time+above(sin(q2),0)*4*sin(q2)*ang))); +per_pixel_3=rot=above(sin(1.2*q2+1.3),-.5)*rot; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Idiot - Any Other Deep Rising.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Idiot - Any Other Deep Rising.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Idiot - Any Other Deep Rising.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Idiot - Any Other Deep Rising.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,101 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.140000 +fDecay=0.910000 +fVideoEchoZoom=0.591237 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.008018 +fWaveScale=1.001829 +fWaveSmoothing=0.000000 +fWaveParam=0.500000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.001827 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.905286 +sy=0.932718 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.100000 +ob_g=0.100000 +ob_b=0.100000 +ob_a=0.010000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.500000 +nMotionVectorsX=11.520000 +nMotionVectorsY=10.559999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.500000 +per_frame_1=slowtime = slowtime+beat*time; +per_frame_2=ying = if(below(ying,1),1,ying); +per_frame_3=ying = if (beat,ying + bnot(time*10%3),ying); +per_frame_4=yin = ying%2; +per_frame_5=vol_now = .4 * bass + 0.1 * (bass_att+treb+mid); +per_frame_6=vol_mean = if(equal(frame%50,0),vol_mean-0.5*(vol_mean-vol_now),0.1*(vol_mean*9 + vol_now)); +per_frame_7=beat = if(above(vol_now,1.5*vol_mean),1,0); +per_frame_8=beatcount = if(bnot(time%5000),0,beatcount); +per_frame_9=beatcount = beatcount +.05*beat; +per_frame_10=yang = bnot(beatcount%2); +per_frame_11=ib_r = 0; +per_frame_12=ib_g = pow(abs(sign(sin(slowtime))),2)*sin(slowtime); +per_frame_13=ib_b= cos(slowtime)*sign(cos(slowtime))*pow(abs(sign(sin(slowtime))),2); +per_frame_14=mv_g = sin(slowtime)*(sign(sin(slowtime))-1)*(sign(sin(slowtime))); +per_frame_15=mv_b = -1*abs(cos(slowtime))+1; +per_frame_16=mv_r = .8; +per_frame_17=redneg = if(below(ib_r,0),1,0); +per_frame_18=greenneg = if(below(ib_g,0),1,0); +per_frame_19=blueneg = if(below(ib_b,0),1,0); +per_frame_20=wave_r = if(redneg,if(bor(greenneg , blueneg),1,1+ib_r),ib_r); +per_frame_21=wave_g = if(greenneg,if(equal(greenneg + blueneg,2),1,1+ib_g),ib_g); +per_frame_22=wave_b = if(blueneg,1 + ib_b, ib_b); +per_frame_23=q1 = if(yin,sin(slowtime),q1); +per_frame_24=q2 = if(yin,cos(slowtime),0); +per_frame_25=q3 = sin(beatcount); +per_frame_26=dx = if(yin,.01*sin(slowtime),if(equal(yin,yang),0,dx)); +per_frame_27=dy = if(yin,.01*cos(slowtime),0); +per_frame_28=q5 = if(bnot(yin),abs(cos(time)),dx); +per_frame_29=wave_mystery=wave_mystery-1*sin(time*.65*sin(q3)); +per_frame_30=wave_mode=rand(slowtime%12); +per_pixel_1=solipsist = if(equal(q3,0),0,.01*( rad - q3*x + pow(q3,4)*y)); +per_pixel_2=rot = rot + sin(rad)-5*solipsist-1.5*q5; +per_pixel_3=sy = if(equal(q3,0),sy,1-solipsist); +per_pixel_4=new_x=rad*.05-x; +per_pixel_5=new_y=rad*.05-y; +per_pixel_6=zoom=zoom+.01*sin(ang-rad*3.14*sin(if(Above(q2,q1),.5,-.5)*sin(new_X*new_y)))*sin(if(Above(q3,q1),.5,-.5))-.03*sin(Ang*5-rad*sin(if(Above(q3,q2),.5,-.5))); +per_frame_init_1=warp = 0; +per_frame_init_2=beatcount = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,107 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.900000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-1.000000 +dy=-1.000000 +warp=0.010000 +sx=1.000000 +sy=0.972365 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_3=oldq8 = q8; +per_frame_4=ib_a =bass; +per_frame_5=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_6=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_7=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_8=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_9=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_10=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_11=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_12=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_13=lastbeat = if(beat,time,lastbeat); +per_frame_14=countertime = if(beat,time,countertime); +per_frame_15=counter =-1*pow(min((time-countertime-1.5),0),9); +per_frame_16=q7 = if(beat,0.001+0.0001*rand(40),oldq7); +per_frame_17=oldq7=q7; +per_frame_18=q6 = if(beat,0.001+0.0001*rand(40),oldq6); +per_frame_19=oldq6=q6; +per_frame_20=q5= if(beat,0.001+0.0001*rand(40),oldq5); +per_frame_21=oldq5=q5; +per_frame_22=q4 = if(beat,0.001+0.0001*rand(40),oldq4); +per_frame_23=oldq4=q4; +per_frame_24=Flag = If(beat,if(Rand(2)-1,1,0),oldFlag); +per_frame_25=oldflag = flag; +per_frame_26=Ratio = If(Beat,50+rand(100),oldRatio); +per_frame_27=OldRatio = Ratio; +per_frame_28=q1 = if(beat,if(flag,ratio,0.75*ratio),oldq1); +per_frame_29=oldq1=q1; +per_frame_30=q2 = if(beat,if(flag,0.75*ratio,ratio),oldq2); +per_frame_31=//q2 = if(beat, rand(2)+1,oldq2); +per_frame_32=oldq2=q2; +per_frame_33=//monitor = if(rand(2)-1,-1,1); +per_frame_34=temp_b = cos(time) + abs(cos(time)); +per_frame_35=temp_g = abs(sin(time)) ; +per_frame_36=temp_r = (-1 * cos(time)) + abs(-1 * cos(time)) + 0.2 * (cos(sin(time))+(abs(cos(sin(time)))+cos(sin(time)))); +per_frame_37=ob_r = 1 - if(above(temp_r,1),1,if(above(temp_r,0), abs(temp_r),0)); +per_frame_38=ob_g = 1 - if(above(temp_g,1),1,if(above(temp_g,0), abs(temp_g),0)); +per_frame_39=ob_b = 1 - if(above(temp_b,1),1,if(above(temp_b,0), abs(temp_b),0)); +per_pixel_1=dx=q4*sin((y-0.5)*q1)+q5*sin((y-0.5)*q2); +per_pixel_2=dy=q6*cos((x-0.5)*q2)+q7*cos((x-0.5)*q1); +per_pixel_3=rot = 0.1*(rad+cos((5+5*sin(q8*1.211)*x)-0.5) -sin(((5+5*sin(q8*0.973))*y)-dx)); +per_pixel_4=cx = if(above(dy,-.5),1-rot * 2,rot*q8); +per_frame_init_1=decay=0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak with .milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak with .milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak with .milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Rovastar - Altars Of Madness 3 (ooze tweak with .milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,212 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.900000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=-1.000000 +dy=-1.000000 +warp=0.010000 +sx=1.000000 +sy=0.972365 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=384 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=22.479836 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=0.600000 +wave_0_per_frame1=x = 100*sin(time) * q2+.2; +wave_0_per_frame2=t1 = cos(time)*q3; +wave_0_per_point1=x = sample+(value1*t1); +wave_0_per_point2=y = value2 +q3; +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +per_frame_init_1=decay=0.1; +per_frame_1=warp=0; +per_frame_2=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_3=oldq8 = q8; +per_frame_4=ib_a =bass; +per_frame_5=volume = 0.15*(bass_att+bass+mid+mid_att); +per_frame_6=beatrate = if(equal(beatrate,0),1,if(below(volume,0.01),1,beatrate)); +per_frame_7=lastbeat = if(equal(lastbeat,0),time,lastbeat); +per_frame_8=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_9=peakbass_att = if(above(bass_att,peakbass_att),bass_att,peakbass_att); +per_frame_10=beat = if(above(volume,0.8),if(below(peakbass_att - bass_att, 0.05*peakbass_att),if(above(time - lastbeat,0.1+0.5*(beatrate-0.1)),1,0),0),0); +per_frame_11=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_12=peakbass_att = if(equal(beat,0),if(above(time - lastbeat,2*beatrate),peakbass_att*0.95,peakbass_att*0.995),bass_att); +per_frame_13=lastbeat = if(beat,time,lastbeat); +per_frame_14=countertime = if(beat,time,countertime); +per_frame_15=counter =-1*pow(min((time-countertime-1.5),0),9); +per_frame_16=q7 = if(beat,0.001+0.0001*rand(40),oldq7); +per_frame_17=oldq7=q7; +per_frame_18=q6 = if(beat,0.001+0.0001*rand(40),oldq6); +per_frame_19=oldq6=q6; +per_frame_20=q5= if(beat,0.001+0.0001*rand(40),oldq5); +per_frame_21=oldq5=q5; +per_frame_22=q4 = if(beat,0.001+0.0001*rand(40),oldq4); +per_frame_23=oldq4=q4; +per_frame_24=Flag = If(beat,if(Rand(2)-1,1,0),oldFlag); +per_frame_25=oldflag = flag; +per_frame_26=Ratio = If(Beat,50+rand(100),oldRatio); +per_frame_27=OldRatio = Ratio; +per_frame_28=q1 = if(beat,if(flag,ratio,0.75*ratio),oldq1); +per_frame_29=oldq1=q1; +per_frame_30=q2 = if(beat,if(flag,0.75*ratio,ratio),oldq2); +per_frame_31=//q2 = if(beat, rand(2)+1,oldq2); +per_frame_32=oldq2=q2; +per_frame_33=//monitor = if(rand(2)-1,-1,1); +per_frame_34=temp_b = cos(time) + abs(cos(time)); +per_frame_35=temp_g = abs(sin(time)) ; +per_frame_36=temp_r = (-1 * cos(time)) + abs(-1 * cos(time)) + 0.2 * (cos(sin(time))+(abs(cos(sin(time)))+cos(sin(time)))); +per_frame_37=ob_r = 1 - if(above(temp_r,1),1,if(above(temp_r,0), abs(temp_r),0)); +per_frame_38=ob_g = 1 - if(above(temp_g,1),1,if(above(temp_g,0), abs(temp_g),0)); +per_frame_39=ob_b = 1 - if(above(temp_b,1),1,if(above(temp_b,0), abs(temp_b),0)); +per_frame_40=q3 = .5+.5*sin(q8); +per_frame_41=monitor = q3; +per_pixel_1=dx=q4*sin((y-0.5)*q1)+q5*sin((y-0.5)*q2); +per_pixel_2=dy=q6*cos((x-0.5)*q2)+q7*cos((x-0.5)*q1); +per_pixel_3=rot = 0.1*(rad+cos((5+5*sin(q8*1.211)*x)-0.5) -sin(((5+5*sin(q8*0.973))*y)-dx)); +per_pixel_4=cx = if(above(dy,-.5),1-rot * 2,rot*q8); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and StudioMusic - Vertigyny (Geiss shape mod).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and StudioMusic - Vertigyny (Geiss shape mod).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and StudioMusic - Vertigyny (Geiss shape mod).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and StudioMusic - Vertigyny (Geiss shape mod).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,204 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.997000 +fVideoEchoZoom=0.999997 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=98.029610 +fWaveScale=0.935100 +fWaveSmoothing=0.306000 +fWaveParam=-0.360000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.854653 +fShader=0.000001 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.090000 +wave_g=0.090000 +wave_b=0.090000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.020000 +ob_g=0.020000 +ob_b=0.020000 +ob_a=0.970000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.970000 +nMotionVectorsX=5.120042 +nMotionVectorsY=5.088000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.899999 +mv_r=0.800000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=1 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=0.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_x=0.000000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.250000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.400000 +shape_0_per_frame1=ang = time*1.4; +shape_0_per_frame2=x = 0.5 + 0.08*cos(time*1.1) + 0.03*cos(time*0.7); +shape_0_per_frame3=y = q1 + 0.02*sin(time*1.3) + 0.04*sin(time*0.2); +shape_0_per_frame4=r = 0.5 + 0.5*sin(time*0.713 + 1); +shape_0_per_frame5=g = 0.5 + 0.5*sin(time*0.563 + 2); +shape_0_per_frame6=b = 0.5 + 0.5*sin(time*0.654 + 5); +shape_0_per_frame7=r2 = 0.5 + 0.5*sin(time*0.885 + 4); +shape_0_per_frame8=g2 = 0.5 + 0.5*sin(time*0.556+ 1); +shape_0_per_frame9=b2 = 0.5 + 0.5*sin(time*0.638 + 3); +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +per_frame_1=slowtime = slowtime+beat*time; +per_frame_2=vol_now = .4 * bass + 0.1 * (bass_att+treb+mid); +per_frame_3=vol_mean = if(equal(frame%50,0),vol_mean-0.5*(vol_mean-vol_now),0.1*(vol_mean*9 + vol_now)); +per_frame_4=beat = if(above(vol_now,1.5*vol_mean),1,0); +per_frame_5=ib_r=sin(cos(slowtime*0.235)); +per_frame_6=ib_g=sin(cos(slowtime*0.335)); +per_frame_7=ib_b=sin(cos(slowtime*0.435)); +per_frame_8=redneg = if(below(ib_r,0),1,0); +per_frame_9=greenneg = if(below(ib_g,0),1,0); +per_frame_10=blueneg = if(below(ib_b,0),1,0); +per_frame_11=ib_r = 1 - (if(redneg,if(bor(greenneg , blueneg),1,1+ib_r),ib_r)); +per_frame_12=ib_g = 1 - (if(greenneg,if(equal(greenneg + blueneg,2),1,1+ib_g),ib_g)); +per_frame_13=ib_b =1 - (if(blueneg,1 + ib_b, ib_b)); +per_frame_14=ff = slowtime/100; +per_frame_15=wave_r = sin(5*ff/bass)/2+0.5; +per_frame_16=wave_g = cos(ff/mid)/2+0.5; +per_frame_17=wave_b = cos(3*ff/treb)/2+0.5; +per_frame_18=rot = rot + 0.040*( 0.60*sin(0.381*slowtime) + 0.40*sin(0.579*slowtime) ); +per_frame_19=zoom=max(0.97, min(0.15+0.7*bass_att, 1.75 )); +per_frame_20=ob_r=sin(beat*cos(slowtime*0.735)); +per_frame_21=ob_g=sin(bass*cos(slowtime*0.635)); +per_frame_22=ob_b=sin(bass*cos(slowtime*0.535)); +per_frame_23=redneg = if(below(ob_r,0),1,0); +per_frame_24=greenneg = if(below(ob_g,0),1,0); +per_frame_25=blueneg = if(below(ob_b,0),1,0); +per_frame_26=ob_r = 1 - (if(redneg,if(bor(greenneg , blueneg),1,1+ob_r),ob_r)); +per_frame_27=ob_g = 1 - (if(greenneg,if(equal(greenneg + blueneg,2),1,1+ob_g),ob_g)); +per_frame_28=ob_b =1 - (if(blueneg,1 + ob_b, ob_b)); +per_frame_29=q1 = sin(slowtime); +per_pixel_1=q2=above(rad,.603); +per_pixel_2=rot=rot+if(q2,0,sin(time*.7243)*.5); +per_pixel_3=zoom=zoom+if(q2,0,rad*sin(time*.734)*.8); +per_pixel_4=warp=warp+if(above(rad,.2166),sin(ang*rad),0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Zylot - Associative Order.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Zylot - Associative Order.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Zylot - Associative Order.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor and Zylot - Associative Order.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,145 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.980000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.200015 +fWaveSmoothing=0.630000 +fWaveParam=0.300000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=11.520000 +nMotionVectorsY=10.559999 +mv_dx=-0.698261 +mv_dy=-0.023053 +mv_l=0.900000 +mv_r=0.123289 +mv_g=0.943345 +mv_b=0.422813 +mv_a=0.000000 +per_frame_1=ib_a =0.2*bass; +per_frame_2=warp = 0; +per_frame_3=counter1 = if(equal(counter2,1),if(equal(counter1,1),0,counter1+.05),1); +per_frame_4=counter2 = if(equal(counter1,1),if(equal(counter2,1),0,counter2+.05),1); +per_frame_5=cdelay1 = if(equal(cdelay2,1),1,if(equal(colorcounter%2,1),if(equal(counter1,1),2 ,0), if(equal(counter2,1),2,0))); +per_frame_6=cdelay2 = if(equal(cdelay1,2),1,0); +per_frame_7=colorcounter = if(above(colorcounter,7),0,if(equal(cdelay1,1),colorcounter+1,colorcounter)); +per_frame_8=oldx = if(equal(colorcounter%2,1),if(equal(counter1,.95),rx,oldx),if(equal(counter2,.95),rx,oldx)); +per_frame_9=oldy = if(equal(colorcounter%2,1),if(equal(counter1,.95),ry,oldy),if(equal(counter2,.95),ry,oldy)); +per_frame_10=oldxs = if(equal(colorcounter%2,1),if(equal(counter1,.95),rxs,oldxs),if(equal(counter2,.95),rxs,oldxs)); +per_frame_11=oldys = if(equal(colorcounter%2,1),if(equal(counter1,.95),rys,oldys),if(equal(counter2,.95),rys,oldys)); +per_frame_12=rx = if(equal(cdelay1,1),(rand(100)*.01),rx); +per_frame_13=ry = if(equal(cdelay1,1),(rand(100)*.01),ry); +per_frame_14=rxs = if(equal(cdelay1,1),(rand(100)*.01),rxs); +per_frame_15=rys = if(equal(cdelay1,1),(rand(100)*.01),rys); +per_frame_16=xm = if(equal(cdelay1,1),(rx - oldx)*.05,xm); +per_frame_17=ym = if(equal(cdelay1,1),(ry - oldy)*.05,ym); +per_frame_18=xms = if(equal(cdelay1,1),(rxs - oldxs)*.05,xms); +per_frame_19=yms = if(equal(cdelay1,1),(rys - oldys)*.05,yms); +per_frame_20=monitor = colorcounter; +per_frame_21=wave_r = bass*.4; +per_frame_22=wave_g = treb*.4; +per_frame_23= +per_frame_24=wave_b = mid*.4; +per_frame_25=wave_a = bass; +per_frame_26=wave_mystery = -.5+bass*.1; +per_frame_27=wave_x = if(above(frame%2,0), if(equal(colorcounter%2,1),rx-(abs(counter1-1)*(xm*20)),rx-(abs(counter2-1)*(xm*20))), if(equal(colorcounter%2,1),rxs-(abs(counter1-1)*(xms*20)),rxs-(abs(counter2-1)*(xms*20)))); +per_frame_28=wave_y = if(above(frame%2,0), if(equal(colorcounter%2,1),ry-(abs(counter1-1)*(ym*20)),ry-(abs(counter2-1)*(ym*20))), if(equal(colorcounter%2,1),rys-(abs(counter1-1)*(yms*20)),rys-(abs(counter2-1)*(yms*20)))); +per_frame_29=zoom = .995; +per_frame_30=slowtime = slowtime+beat*time; +per_frame_31=ying = if(below(ying,1),1,ying); +per_frame_32=ying = if (beat,ying + bnot(time*10%3),ying); +per_frame_33=yin = ying%2; +per_frame_34=vol_now = .4 * bass + 0.1 * (bass_att+treb+mid); +per_frame_35=vol_mean = if(equal(frame%50,0),vol_mean-0.5*(vol_mean-vol_now),0.1*(vol_mean*9 + vol_now)); +per_frame_36=beat = if(above(vol_now,1.5*vol_mean),1,0); +per_frame_37=beatcount = if(bnot(time%5000),0,beatcount); +per_frame_38=beatcount = beatcount +.05*beat; +per_frame_39=yang = bnot(beatcount%2); +per_frame_40=ib_r = 0; +per_frame_41=ib_g = pow(abs(sign(sin(slowtime))),2)*sin(slowtime); +per_frame_42=ib_b= cos(slowtime)*sign(cos(slowtime))*pow(abs(sign(sin(slowtime))),2); +per_frame_43=mv_g = sin(slowtime)*(sign(sin(slowtime))-1)*(sign(sin(slowtime))); +per_frame_44=mv_b = -1*abs(cos(slowtime))+1; +per_frame_45=mv_r = .8; +per_frame_46=wave_b = if(above(ib_b,0),ib_b,mv_b); +per_frame_47=wave_g = if(above(ib_g,0),ib_g,mv_g); +per_frame_48=q1 = if(yin,sin(slowtime),q1); +per_frame_49=wave_r = .8*q1; +per_frame_50=q2 = if(yin,.01*cos(slowtime),0); +per_frame_51=q3 = sin(slowtime); +per_frame_52=dx = if(yang,q1,dx); +per_frame_53=dy = if(yang,q2,dy); +per_frame_54=q3 = if(yang,0,q1); +per_frame_55=q5 = if(bnot(yin),abs(cos(time)),dx); +per_frame_56=sy = bnot(q3 * sin(time)); +per_frame_57=dx=if(below(dx,-1), -1, dx); +per_frame_58=dx=if(above(dx,1.0), 1.0, dx); +per_frame_59=dy=if(below(dy,-1), -1, dy); +per_frame_60=dy=if(above(dy,1.0), 1.0, dy); +per_frame_61=sy=if(below(sy,0.01), 0.01, sy); +per_frame_62=sy=if(above(sy,100.0), 100.0, sy); +per_frame_63=ib_a = sin(time); +per_frame_64=ob_a = cos(time); +per_pixel_1=solipsist = if(equal(q3,0),0,.01*( rad - q3*x + pow(q3,4)*y)); +per_pixel_2=rot = rot + sin(rad)-5*solipsist-1.5*q5; +per_pixel_3=zoom = .3+sin( rad)-5*solipsist; +per_pixel_4=dx = if(equal(q3,0),.08*x,.8*x*q1); +per_pixel_5=dy = if(equal(q3,0),.08*y,.8*y*q2); +per_pixel_6=sy = if(equal(q3,0),sy,1-solipsist); +per_pixel_7=dx = if(above(dx * rot , x - q1) , q2 * x , q2 + y); +per_pixel_8=zoom=if(below(zoom,0.01), 0.01, zoom); +per_pixel_9=zoom=if(above(zoom,100), 100, zoom); +per_pixel_10=rot=if(below(rot,-1.0), -1.0, rot); +per_pixel_11=rot=if(above(rot,1.0), 1.0, rot); +per_pixel_12=dx=if(below(dx,-1), -1, dx); +per_pixel_13=dx=if(above(dx,1.0), 1.0, dx); +per_pixel_14=dy=if(below(dy,-1), -1, dy); +per_pixel_15=dy=if(above(dy,1.0), 1.0, dy); +per_pixel_16=sy=if(below(sy,0.01), 0.01, sy); +per_pixel_17=sy=if(above(sy,100.0), 100.0, sy); +per_frame_init_1=q8=0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Che - Inside The House Of Nil.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Che - Inside The House Of Nil.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Che - Inside The House Of Nil.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Che - Inside The House Of Nil.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,86 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.175613 +fWaveSmoothing=0.306000 +fWaveParam=-0.460000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.854653 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.190000 +ob_g=0.120000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.015000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=7.679999 +nMotionVectorsY=11.519997 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.340000 +per_frame_1=slowtime = slowtime+beat*time; +per_frame_2=vol_now = .4 * bass + 0.1 * (bass_att+treb+mid); +per_frame_3=vol_mean = if(equal(frame%50,0),vol_mean-0.5*(vol_mean-vol_now),0.1*(vol_mean*9 + vol_now)); +per_frame_4=beat = if(above(vol_now,1.5*vol_mean),1,0); +per_frame_5=ib_r = - abs(cos(time)); +per_frame_6=ib_g = sin(time); +per_frame_7=ib_b= cos(time)*sign(cos(time)); +per_frame_8=mv_r = abs(sin(time)); +per_frame_9=mv_g = sin(slowtime) ; +per_frame_10=mv_b= cos(slowtime)*sign(cos(slowtime)); +per_frame_11=redneg = if(below(mv_r,0),1,0); +per_frame_12=greenneg = if(below(mv_g,0),1,0); +per_frame_13=blueneg = if(below(mv_b,0),1,0); +per_frame_14=wave_r = if(redneg,if(bor(greenneg , blueneg),1,1+mv_r),mv_r); +per_frame_15=wave_g = if(greenneg,if(equal(greenneg + blueneg,2),1,1+mv_g),mv_g); +per_frame_16=wave_b = if(blueneg,1 + mv_b, mv_b); +per_frame_17=dx=sin(slowtime*1.234)*.0125; +per_frame_18=dy=cos(slowtime*.9666)*.0125; +per_frame_19=q1 = sin(slowtime); +per_frame_20=q2 = wave_b; +per_pixel_1=zoom=1+above(sin(1.7*q2),-.5)*.1*sin(2*q2+.027*q1+4*(1+sin(.7*time+q2))*sin(.05*q2+time)*rad); +per_pixel_2=rot=.1*sin(q2)*sin(2.3*q2+.027*q1+2*sin(.07*q1+1.2*time)*(rad+sin(time+above(sin(q2),0)*4*sin(q2)*ang))); +per_pixel_3=rot=above(sin(1.2*q2+1.3),-.5)*rot; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor - Learning Curve (Invert tweak).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor - Learning Curve (Invert tweak).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor - Learning Curve (Invert tweak).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor - Learning Curve (Invert tweak).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,84 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.960000 +fVideoEchoZoom=0.010000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=0.793875 +fWaveScale=1.074093 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.000001 +fModWaveAlphaEnd=0.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=0.010000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.001837 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.015000 +ob_r=0.300000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.200000 +ib_size=0.025000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=vol_now = .4 * bass + 0.1 * (bass_att + treb + mid); +per_frame_3=vol_mean = if(equal(frame%50,0),vol_mean - 0.5 * (vol_mean-vol_now),0.1 * (vol_mean * 9 + vol_now)); +per_frame_4=beat = if(above(vol_now,1.15 * vol_mean),1,0); +per_frame_5=sinbeat =sin(beat * (vol_now-vol_mean)); +per_frame_6=wave_b = cos(time) + abs(cos(time)); +per_frame_7=wave_g = abs(sin(time)) ; +per_frame_8=wave_r = (-1 * cos(time)) + abs(-1 * cos(time)) + 0.2 * (cos(sin(time))+(abs(cos(sin(time)))+cos(sin(time)))); +per_frame_9=ib_r = if(above(wave_r,1),1,if(above(wave_r,0), abs(wave_r),0)); +per_frame_10=ib_g = if(above(wave_g,1),1,if(above(wave_g,0), abs(wave_g),0)); +per_frame_11=ib_b = if(above(wave_b,1),1,if(above(wave_b,0), abs(wave_b),0)); +per_frame_12=ob_r = 1 - if(above(wave_r,1),1,if(above(wave_r,0), abs(wave_r),0)); +per_frame_13=ob_g = 1 - if(above(wave_g,1),1,if(above(wave_g,0), abs(wave_g),0)); +per_frame_14=ob_b = 1 - if(above(wave_b,1),1,if(above(wave_b,0), abs(wave_b),0)); +per_frame_15=q1 = sinbeat+.35 ; +per_frame_16=wave_mystery = vol_now; +per_frame_17=monitor = sinbeat; +per_pixel_1=a = pow(1.02, pow(1, rad * 2 - 1)); +per_pixel_2=dx = (x - .5) * a + .5 - x; +per_pixel_3=dy = (y - .5) * a + .5 - y; +per_pixel_4=zoom = q1 + x; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Rovastar - Oozing Resistance (Waveform Mod).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Rovastar - Oozing Resistance (Waveform Mod).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Rovastar - Oozing Resistance (Waveform Mod).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Rozzor & Rovastar - Oozing Resistance (Waveform Mod).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=5.002776 +fWaveScale=1.186400 +fWaveSmoothing=0.630000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999513 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=0.350000 +mv_g=0.350000 +mv_b=0.350000 +mv_a=0.000000 +per_frame_1=ob_r = 0.5+0.5*sin(2*time); +per_frame_2=ob_g = 0.5+0.5*sin(1.23*time); +per_frame_3=ob_b = 0.5+0.5*sin(time*1.321); +per_frame_4=wave_a =0; +per_frame_5=q8 =oldq8+ 0.003*(pow(1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_6=oldq8 = q8; +per_frame_7=warp=0; +per_frame_8=sx = 1- 0.1*sin(q8)+0.05*sin(time); +per_frame_9=wave_b = cos(time) + abs(cos(time)); +per_frame_10=wave_g = abs(sin(time)) ; +per_frame_11=wave_r = (-1 * cos(time)) + abs(-1 * cos(time)) + 0.2 * (cos(sin(time))+(abs(cos(sin(time)))+cos(sin(time)))); +per_frame_12=wave_r = 1 - if(above(wave_r,1),1,if(above(wave_r,0), abs(wave_r),0)); +per_frame_13=wave_g = 1 - if(above(wave_g,1),1,if(above(wave_g,0), abs(wave_g),0)); +per_frame_14=wave_b = 1 - if(above(wave_b,1),1,if(above(wave_b,0), abs(wave_b),0)); +per_frame_15= +per_pixel_1=rot = 0.1*(rad+cos((5+5*sin(q8*1.211)*x)-0.5) -sin(((5+5*sin(q8*0.973))*y)-0.5)); +per_pixel_2=dx = 0.005*(cos((5+5*sin(q8*1.311)*x)-0.5) -sin(((5+5*sin(q8*0.9431))*y)-0.5)); +per_pixel_3=dy = 0.005*(cos((5+5*sin(q8*1.021)*x)-0.5) -sin(((5+5*sin(q8*0.987))*y)-0.5)); +per_pixel_4=zoom =1- 0.005*(rad+cos((5+5*sin(q8*0.943)*x)-0.5) -sin(((5+5*sin(q8*1.0961))*y)-0.5)); +per_pixel_5=cx = 1-rot * 2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/shifter - escape the worm - Eo.S. + Phat 5362.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/shifter - escape the worm - Eo.S. + Phat 5362.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/shifter - escape the worm - Eo.S. + Phat 5362.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/shifter - escape the worm - Eo.S. + Phat 5362.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,445 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.006543 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=0.001000 +fWaveScale=1.285751 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999900 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.050000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.300000 +ib_size=0.125000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=1.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=0.910000 +mv_b=0.710000 +mv_a=1.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_point1=sp = sample*6.283185; +wave_0_per_point2=x = .5 + sin(sp)*.45; +wave_0_per_point3=y = .5 + cos(sp)*.45; +wave_0_per_point4= +wave_0_per_point5=tm = time*.5 + sp; +wave_0_per_point6= +wave_0_per_point7=r = .75 + .25*sin(tm*1.178); +wave_0_per_point8=g = .75 + .25*sin(tm*1.152); +wave_0_per_point9=b = .75 + .25*sin(tm*1.102); +wave_0_per_point10= +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=51 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=1 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.327350 +wavecode_1_smoothing=0.820000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=3.000000 +wavecode_1_a=1.000000 +wave_1_per_frame1=t1=sin(time*0.236)*0.5 + 0.5 +wave_1_per_point1=it = (it+1)*below(it,5); +wave_1_per_point2=sw = if(equal(it,0),rand(2),sw); +wave_1_per_point3=rx = if(sw,rand(1001)*.001,rand(2)); +wave_1_per_point4=ry = if(sw,rand(2),rand(1001)*.001); +wave_1_per_point5= +wave_1_per_point6=tm = time*.5 + sample*2; +wave_1_per_point7= +wave_1_per_point8=vx = if(equal(it,0),rx,vx + sw*.002); +wave_1_per_point9=vy = if(equal(it,0),ry,vy +(1-sw)*.002); +wave_1_per_point10= +wave_1_per_point11=x = vx; +wave_1_per_point12=y = vy; +wave_1_per_point13= +wave_1_per_point14=tm= 1.11 + sample + t1*2; +wave_1_per_point15= +wave_1_per_point16=flux=sin(time)*0.5; +wave_1_per_point17=fluy=cos(time)*0.5; +wave_1_per_point18= +wave_1_per_point19=xfade = max(-abs(x-0.5 + flux) + 1 , 0); +wave_1_per_point20=xfade2= max(-abs(y-0.5 + fluy) + 1 , 0); +wave_1_per_point21=xfade = (xfade2+xfade)*0.5; +wave_1_per_point22= +wave_1_per_point23= +wave_1_per_point24=r1 = .5 + .5*sin(tm + 0.0); +wave_1_per_point25=g1 = .5 + .5*sin(tm + 2.1); +wave_1_per_point26=b1 = .5 + .5*sin(tm + 4.2); +wave_1_per_point27= +wave_1_per_point28=r=r1*xfade + g1*(1-xfade); +wave_1_per_point29=g=g1*xfade + b1*(1-xfade); +wave_1_per_point30=b=b1*xfade + r1*(1-xfade); +wave_1_per_point31= +wave_1_per_point32= +wave_1_per_point33=//r=xfade;g=xfade;b=xfade; +wave_1_per_point34= +wave_1_per_point35= +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=51 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=1 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.327350 +wavecode_2_smoothing=0.820000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=3.000000 +wavecode_2_a=1.000000 +wave_2_per_frame1=t1=sin(time*0.236)*0.5 + 0.5 +wave_2_per_point1=it = (it+1)*below(it,25); +wave_2_per_point2=sw = if(equal(it,0),rand(2),sw); +wave_2_per_point3=rx = if(sw,rand(1001)*.001,rand(2)); +wave_2_per_point4=ry = if(sw,rand(2),rand(1001)*.001); +wave_2_per_point5= +wave_2_per_point6=tm = time*.5 + sample*2; +wave_2_per_point7= +wave_2_per_point8=vx = if(equal(it,0),rx,vx + sw*.002); +wave_2_per_point9=vy = if(equal(it,0),ry,vy +(1-sw)*.002); +wave_2_per_point10= +wave_2_per_point11=x = vx; +wave_2_per_point12=y = vy; +wave_2_per_point13= +wave_2_per_point14=tm= 1.11 + sample + t1*2.0; +wave_2_per_point15= +wave_2_per_point16=flux=sin(time)*0.5; +wave_2_per_point17=fluy=cos(time)*0.5; +wave_2_per_point18= +wave_2_per_point19=xfade = max(-abs(x-0.5 + flux) + 1 , 0); +wave_2_per_point20=xfade2= max(-abs(y-0.5 + fluy) + 1 , 0); +wave_2_per_point21=xfade = (xfade2+xfade)*0.5; +wave_2_per_point22= +wave_2_per_point23= +wave_2_per_point24=r1 = .5 + .5*sin(tm + 0.0); +wave_2_per_point25=g1 = .5 + .5*sin(tm + 2.1); +wave_2_per_point26=b1 = .5 + .5*sin(tm + 4.2); +wave_2_per_point27= +wave_2_per_point28=r=r1*xfade + g1*(1-xfade); +wave_2_per_point29=g=g1*xfade + b1*(1-xfade); +wave_2_per_point30=b=b1*xfade + r1*(1-xfade); +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=1 +wavecode_3_bUseDots=1 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=1 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.000000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +wave_3_per_frame1=tic = min(time-tir,.1); +wave_3_per_frame2=tir = time; +wave_3_per_frame3=t2 = tic; +wave_3_per_point1=sam = rand(1001)*.001; +wave_3_per_point2=sam = sample; +wave_3_per_point3=it = (it+1)*above(sam,0); +wave_3_per_point4=set = int(sam*6); +wave_3_per_point5=sp = sam*6 - int(sam*6) + equal(it,511); +wave_3_per_point6=off = .866025403; +wave_3_per_point7= +wave_3_per_point8=mx = equal(set,0)*(-.5 + sp) + equal(set,1)*(.5 + .5*sp) + equal(set,2)*(1-.5*sp) + equal(set,3)*(.5-sp) + equal(set,4)*(-.5 - sp*.5) + above(set,4)*(-1 + sp*.5); +wave_3_per_point9=my = equal(set,0)*off + equal(set,1)*(1-sp)*off + equal(set,2)*-sp*off + equal(set,3)*-off + equal(set,4)*(-off + sp*off) + above(set,4)*(sp*off); +wave_3_per_point10= +wave_3_per_point11=zang = q6*50; +wave_3_per_point12=ox = mx*cos(zang) - my*sin(zang); +wave_3_per_point13=oy = mx*sin(zang) + my*cos(zang); +wave_3_per_point14=mx = ox; +wave_3_per_point15=my = oy; +wave_3_per_point16= +wave_3_per_point17=rad = max(0.2 - q7*.1,0)*.5; +wave_3_per_point18=vol = max(1-(value1+value2)*.2,0.5); +wave_3_per_point19=rad = if(equal(it%2,0),rad*vol,rad); +wave_3_per_point20=a = max(-.9 + vol,0); +wave_3_per_point21= +wave_3_per_point22=x = mx*rad; +wave_3_per_point23=y = my*rad; +wave_3_per_point24= +wave_3_per_point25=x = x*.75 + q1; +wave_3_per_point26=y = y + (1-q2); +shapecode_0_enabled=1 +shapecode_0_sides=20 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.336672 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.040000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = q1; +shape_0_per_frame2=y = 1-q2; +shape_0_per_frame3=//a2=.05+(below(q1,.5)*.1); +shape_0_per_frame4=//sides=10-(below(tan(time),.9)*6); +shapecode_1_enabled=1 +shapecode_1_sides=3 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.599580 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=1.256637 +shapecode_1_tex_zoom=0.010000 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.850000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=0.000000 +shapecode_1_border_b=0.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=x = q1; +shape_1_per_frame2=y = 1-q2; +shape_1_per_frame3=ang = .785398 - q6*50 - time*8; +shape_1_per_frame4=rad = max(0.2 - q7*.1,0)*2*rad; +shape_1_per_frame5= +shape_1_per_frame6= +shape_1_per_frame7=flux = sin(time*2.1); +shape_1_per_frame8=flux = flux*above(flux,0.95); +shape_1_per_frame9=flux = (flux-0.95) * 20; //normalize to 0-1; +shape_1_per_frame10=flux = max(flux,0); +shape_1_per_frame11=flux=pow(flux,1.3); +shape_1_per_frame12= +shape_1_per_frame13=rad = rad + flux*0.2 +shapecode_2_enabled=1 +shapecode_2_sides=3 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.542619 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=0.010000 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=1.000000 +shape_2_per_frame1=x = q1; +shape_2_per_frame2=y = 1-q2; +shape_2_per_frame3=ang = -.261799 - q6*50 - time*8; +shape_2_per_frame4=rad = max(0.2 - q7*.1,0)*2*rad; +shape_2_per_frame5= +shape_2_per_frame6=flux = sin(time*2.1); +shape_2_per_frame7=flux = flux*above(flux,0.95); +shape_2_per_frame8=flux = (flux-0.95) * 20; //normalize to 0-1; +shape_2_per_frame9=flux = max(flux,0); +shape_2_per_frame10=flux=pow(flux,1.3); +shape_2_per_frame11= +shape_2_per_frame12=rad = rad + flux*0.2 +shape_2_per_frame13= +shape_2_per_frame14= +shape_2_per_frame15= +shapecode_3_enabled=1 +shapecode_3_sides=6 +shapecode_3_additive=0 +shapecode_3_thickOutline=1 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.090529 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=0.819542 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=1.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=0.000000 +shapecode_3_border_b=0.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=x = q1; +shape_3_per_frame2=y = 1-q2; +shape_3_per_frame3=ang = .261799 - q6*50; +shape_3_per_frame4=rad = max(0.2 - q7*.1,0)*.7; +shape_3_per_frame5= +shape_3_per_frame6=tex_ang = time*8; +shape_3_per_frame7= +shape_3_per_frame8= +shape_3_per_frame9=flux = sin(time*2.1); +shape_3_per_frame10=flux = flux*above(flux,0.95); +shape_3_per_frame11=flux = (flux-0.95) * 20; //normalize to 0-1; +shape_3_per_frame12=flux = max(flux,0); +shape_3_per_frame13=flux=pow(flux,1.3); +shape_3_per_frame14= +shape_3_per_frame15=rad = rad + flux*0.2 +per_frame_1=warp = 0; +per_frame_2= +per_frame_3=//q1 = .1*tan(time); +per_frame_4=//q1 = min(0.5,max(0.0,q1)); +per_frame_5=//q1 = q1+0.5; +per_frame_6= +per_frame_7=q1=sin(time); +per_frame_8=q1sgn = sign(q1); +per_frame_9=q1=abs(q1); +per_frame_10=q1=pow(q1,6); +per_frame_11=q1=q1*q1sgn; +per_frame_12=q1=q1*0.4 + 0.5; +per_frame_13= +per_frame_14= +per_frame_15= +per_frame_16=q2 = .5 + .1*sin(time*.548); +per_frame_17= +per_frame_18=tic = min(time - tin,.1); +per_frame_19=tin = time; +per_frame_20= +per_frame_21=ra = 1; +per_frame_22=treb_avg = tic*(treb_avg*(1/tic - ra) + ra*treb); +per_frame_23=mid_avg = tic*(mid_avg*(1/tic - ra) + ra*mid); +per_frame_24=bass_avg = tic*(bass_avg*(1/tic - ra) + ra*bass); +per_frame_25= +per_frame_26=rb = 1; +per_frame_27=vav = tic*(vav*(1/tic - rb) + rb*(bass+treb+mid)*.33333); +per_frame_28= +per_frame_29=tt = tt + tic*treb_avg; +per_frame_30=mt = mt + tic*mid_avg; +per_frame_31=bt = bt + tic*bass_avg; +per_frame_32=vt = vt + tic*(treb_avg+mid_avg+bass_avg)*.33333; +per_frame_33= +per_frame_34=sp = abs(vav - slide)*.1; +per_frame_35=slide = if(above(slide,vav),slide-tic*sp,slide+tic*sp) + (1-toc)*vav; +per_frame_36=toc = 1; +per_frame_37= +per_frame_38=q3 = (treb + bass + mid)*.3333; +per_frame_39=q3=q3*q3*0.5 + 0.1; +per_frame_40= +per_frame_41=q4 = mt; +per_frame_42=q5 = bt; +per_frame_43= +per_frame_44=cx = q1; +per_frame_45=cy = q2; +per_frame_46= +per_frame_47=rmod = ((treb_avg + mid_avg)*.5 - bass_avg*0.5)*.01; +per_frame_48=rmod = 0.02 * pow(rmod/0.02 , 2)*7; +per_frame_49=rmod = min(0.001 , max(rmod, -0.001)); +per_frame_50=rmod=rmod*pow(sin(time)*1.1,2); +per_frame_51=rot = 0.02 * pow(rmod/0.02 , 2) *40; +per_frame_52= +per_frame_53=q6 = rmod; +per_frame_54= +per_frame_55=q7 = slide - below(q3,.5)*(6 + 2*sin(time*24))*pow(min(1,(.5 - q3)*2),5); +per_frame_56= +per_frame_57=q8=if( above(sin(time*0.5),0) , -1 , 1); +per_frame_58= +per_frame_59=//echo_zoom=1+(above(treb,.8)+treb); +per_pixel_1=tm=time/rad; +per_pixel_2=a = q1; +per_pixel_3=b = q2; +per_pixel_4= +per_pixel_5=//testcode +per_pixel_6=//a=0.5;b=0.5; +per_pixel_7= +per_pixel_8=mx = x-a; +per_pixel_9=my = y-b; +per_pixel_10=zm = -.45; +per_pixel_11=zm= if( above(sin(time*2.1),0.95) , 0.45 , zm); +per_pixel_12= +per_pixel_13=//test code +per_pixel_14=//zm= -0.5; +per_pixel_15= +per_pixel_16=dis = pow(mx*mx + my*my,.5)*.70710678; +per_pixel_17= +per_pixel_18=rot = rot*(1-dis); +per_pixel_19=rot=rot*20*q8 ; +per_pixel_20= +per_pixel_21=//testcode +per_pixel_22=//q3=3.1; +per_pixel_23= +per_pixel_24=dx = zm*mx*dis*cos(my*3.14)*q3; +per_pixel_25=dy = zm*my*dis*cos(mx*3.14)*q3; +per_pixel_26= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/shifter - escape the worm - Eo.S. + Phat - Before_It_Eats_Your_Brain_Mix_v2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/shifter - escape the worm - Eo.S. + Phat - Before_It_Eats_Your_Brain_Mix_v2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/shifter - escape the worm - Eo.S. + Phat - Before_It_Eats_Your_Brain_Mix_v2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/shifter - escape the worm - Eo.S. + Phat - Before_It_Eats_Your_Brain_Mix_v2.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,455 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.999894 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=1.285751 +fWaveSmoothing=0.630000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999900 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.300000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=6.399996 +nMotionVectorsY=4.800006 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=0.910000 +mv_b=0.710000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_point1=sp = sample*6.283185; +wave_0_per_point2=x = .5 + sin(sp)*.45; +wave_0_per_point3=y = .5 + cos(sp)*.45; +wave_0_per_point4= +wave_0_per_point5=tm = time*.5 + sp; +wave_0_per_point6= +wave_0_per_point7=r = .75 + .25*sin(tm*1.178); +wave_0_per_point8=g = .75 + .25*sin(tm*1.152); +wave_0_per_point9=b = .75 + .25*sin(tm*1.102); +wave_0_per_point10= +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=51 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=1 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.327350 +wavecode_1_smoothing=0.820000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=3.000000 +wavecode_1_a=1.000000 +wave_1_per_frame1=t1=sin(time*0.236)*0.5 + 0.5 +wave_1_per_point1=it = (it+1)*below(it,5); +wave_1_per_point2=sw = if(equal(it,0),rand(2),sw); +wave_1_per_point3=rx = if(sw,rand(1001)*.001,rand(2)); +wave_1_per_point4=ry = if(sw,rand(2),rand(1001)*.001); +wave_1_per_point5= +wave_1_per_point6=tm = time*.5 + sample*2; +wave_1_per_point7= +wave_1_per_point8=vx = if(equal(it,0),rx,vx + sw*.002); +wave_1_per_point9=vy = if(equal(it,0),ry,vy +(1-sw)*.002); +wave_1_per_point10= +wave_1_per_point11=x = vx; +wave_1_per_point12=y = vy; +wave_1_per_point13= +wave_1_per_point14=tm= 1.11 + sample + t1*2; +wave_1_per_point15= +wave_1_per_point16=flux=sin(time)*0.5; +wave_1_per_point17=fluy=cos(time)*0.5; +wave_1_per_point18= +wave_1_per_point19=xfade = max(-abs(x-0.5 + flux) + 1 , 0); +wave_1_per_point20=xfade2= max(-abs(y-0.5 + fluy) + 1 , 0); +wave_1_per_point21=xfade = (xfade2+xfade)*0.5; +wave_1_per_point22= +wave_1_per_point23= +wave_1_per_point24=r1 = .5 + .5*sin(tm + 0.0); +wave_1_per_point25=g1 = .5 + .5*sin(tm + 2.1); +wave_1_per_point26=b1 = .5 + .5*sin(tm + 4.2); +wave_1_per_point27= +wave_1_per_point28=r=r1*xfade + g1*(1-xfade); +wave_1_per_point29=g=g1*xfade + b1*(1-xfade); +wave_1_per_point30=b=b1*xfade + r1*(1-xfade); +wave_1_per_point31= +wave_1_per_point32= +wave_1_per_point33=//r=xfade;g=xfade;b=xfade; +wave_1_per_point34= +wave_1_per_point35= +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=51 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=1 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.327350 +wavecode_2_smoothing=0.820000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=3.000000 +wavecode_2_a=1.000000 +wave_2_per_frame1=t1=sin(time*0.236)*0.5 + 0.5 +wave_2_per_point1=it = (it+1)*below(it,25); +wave_2_per_point2=sw = if(equal(it,0),rand(2),sw); +wave_2_per_point3=rx = if(sw,rand(1001)*.001,rand(2)); +wave_2_per_point4=ry = if(sw,rand(2),rand(1001)*.001); +wave_2_per_point5= +wave_2_per_point6=tm = time*.5 + sample*2; +wave_2_per_point7= +wave_2_per_point8=vx = if(equal(it,0),rx,vx + sw*.002); +wave_2_per_point9=vy = if(equal(it,0),ry,vy +(1-sw)*.002); +wave_2_per_point10= +wave_2_per_point11=x = vx; +wave_2_per_point12=y = vy; +wave_2_per_point13= +wave_2_per_point14=tm= 1.11 + sample + t1*2.0; +wave_2_per_point15= +wave_2_per_point16=flux=sin(time)*0.5; +wave_2_per_point17=fluy=cos(time)*0.5; +wave_2_per_point18= +wave_2_per_point19=xfade = max(-abs(x-0.5 + flux) + 1 , 0); +wave_2_per_point20=xfade2= max(-abs(y-0.5 + fluy) + 1 , 0); +wave_2_per_point21=xfade = (xfade2+xfade)*0.5; +wave_2_per_point22= +wave_2_per_point23= +wave_2_per_point24=r1 = .5 + .5*sin(tm + 0.0); +wave_2_per_point25=g1 = .5 + .5*sin(tm + 2.1); +wave_2_per_point26=b1 = .5 + .5*sin(tm + 4.2); +wave_2_per_point27= +wave_2_per_point28=r=r1*xfade + g1*(1-xfade); +wave_2_per_point29=g=g1*xfade + b1*(1-xfade); +wave_2_per_point30=b=b1*xfade + r1*(1-xfade); +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=1 +wavecode_3_bUseDots=1 +wavecode_3_bDrawThick=1 +wavecode_3_bAdditive=1 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.000000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +wave_3_per_frame1=tic = min(time-tir,.1); +wave_3_per_frame2=tir = time; +wave_3_per_frame3=t2 = tic; +wave_3_per_point1=sam = rand(1001)*.001; +wave_3_per_point2=sam = sample; +wave_3_per_point3=it = (it+1)*above(sam,0); +wave_3_per_point4=set = int(sam*6); +wave_3_per_point5=sp = sam*6 - int(sam*6) + equal(it,511); +wave_3_per_point6=off = .866025403; +wave_3_per_point7= +wave_3_per_point8=mx = equal(set,0)*(-.5 + sp) + equal(set,1)*(.5 + .5*sp) + equal(set,2)*(1-.5*sp) + equal(set,3)*(.5-sp) + equal(set,4)*(-.5 - sp*.5) + above(set,4)*(-1 + sp*.5); +wave_3_per_point9=my = equal(set,0)*off + equal(set,1)*(1-sp)*off + equal(set,2)*-sp*off + equal(set,3)*-off + equal(set,4)*(-off + sp*off) + above(set,4)*(sp*off); +wave_3_per_point10= +wave_3_per_point11=zang = q6*50; +wave_3_per_point12=ox = mx*cos(zang) - my*sin(zang); +wave_3_per_point13=oy = mx*sin(zang) + my*cos(zang); +wave_3_per_point14=mx = ox; +wave_3_per_point15=my = oy; +wave_3_per_point16= +wave_3_per_point17=rad = max(0.2 - q7*.1,0)*.5; +wave_3_per_point18=vol = max(1-(value1+value2)*.2,0.5); +wave_3_per_point19=rad = if(equal(it%2,0),rad*vol,rad); +wave_3_per_point20=a = max(-.9 + vol,0); +wave_3_per_point21= +wave_3_per_point22=x = mx*rad; +wave_3_per_point23=y = my*rad; +wave_3_per_point24= +wave_3_per_point25=x = x*.75 + q1; +wave_3_per_point26=y = y + (1-q2); +shapecode_0_enabled=1 +shapecode_0_sides=20 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.275918 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.080000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x = q1; +shape_0_per_frame2=y = 1-q2; +shape_0_per_frame3=//a2=.05+(below(q1,.5)*.1); +shape_0_per_frame4=//sides=10-(below(tan(time),.9)*6); +shapecode_1_enabled=1 +shapecode_1_sides=3 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.599580 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=1.256637 +shapecode_1_tex_zoom=0.010000 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.000000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.850000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=0.000000 +shapecode_1_border_b=0.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=x = q1; +shape_1_per_frame2=y = 1-q2; +shape_1_per_frame3=ang = .785398 - q6*50 - time*8; +shape_1_per_frame4=rad = max(0.2 - q7*.1,0)*2*rad; +shape_1_per_frame5= +shape_1_per_frame6= +shape_1_per_frame7=flux = sin(time*2.1); +shape_1_per_frame8=flux = flux*above(flux,0.95); +shape_1_per_frame9=flux = (flux-0.95) * 20; //normalize to 0-1; +shape_1_per_frame10=flux = max(flux,0); +shape_1_per_frame11=flux=pow(flux,1.3); +shape_1_per_frame12= +shape_1_per_frame13=rad = rad + flux*0.2 +shapecode_2_enabled=1 +shapecode_2_sides=3 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.542619 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=0.010000 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=1.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=1.000000 +shape_2_per_frame1=x = q1; +shape_2_per_frame2=y = 1-q2; +shape_2_per_frame3=ang = -.261799 - q6*50 - time*8; +shape_2_per_frame4=rad = max(0.2 - q7*.1,0)*2*rad; +shape_2_per_frame5= +shape_2_per_frame6=flux = sin(time*2.1); +shape_2_per_frame7=flux = flux*above(flux,0.95); +shape_2_per_frame8=flux = (flux-0.95) * 20; //normalize to 0-1; +shape_2_per_frame9=flux = max(flux,0); +shape_2_per_frame10=flux=pow(flux,1.3); +shape_2_per_frame11= +shape_2_per_frame12=rad = rad + flux*0.2 +shape_2_per_frame13= +shape_2_per_frame14= +shape_2_per_frame15= +shapecode_3_enabled=1 +shapecode_3_sides=6 +shapecode_3_additive=0 +shapecode_3_thickOutline=1 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.090529 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=0.819542 +shapecode_3_r=1.000000 +shapecode_3_g=1.000000 +shapecode_3_b=1.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=1.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=1.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=0.000000 +shapecode_3_border_b=0.000000 +shapecode_3_border_a=0.000000 +shape_3_per_frame1=x = q1; +shape_3_per_frame2=y = 1-q2; +shape_3_per_frame3=ang = .261799 - q6*50; +shape_3_per_frame4=rad = max(0.2 - q7*.1,0)*.7; +shape_3_per_frame5= +shape_3_per_frame6=tex_ang = time*8; +shape_3_per_frame7= +shape_3_per_frame8= +shape_3_per_frame9=flux = sin(time*2.1); +shape_3_per_frame10=flux = flux*above(flux,0.95); +shape_3_per_frame11=flux = (flux-0.95) * 20; //normalize to 0-1; +shape_3_per_frame12=flux = max(flux,0); +shape_3_per_frame13=flux=pow(flux,1.3); +shape_3_per_frame14= +shape_3_per_frame15=rad = rad + flux*0.2 +per_frame_1=warp = 0; +per_frame_2=decay=.999; +per_frame_3=//q1 = .1*tan(time); +per_frame_4=//q1 = min(0.5,max(0.0,q1)); +per_frame_5=//q1 = q1+0.5; +per_frame_6= +per_frame_7=q1=sin(time); +per_frame_8=q1sgn = sign(q1); +per_frame_9=q1=abs(q1); +per_frame_10=q1=pow(q1,6); +per_frame_11=q1=q1*q1sgn; +per_frame_12=q1=q1*0.4 + 0.5; +per_frame_13= +per_frame_14= +per_frame_15= +per_frame_16=q2 = .5 + .1*sin(time*.548); +per_frame_17= +per_frame_18=tic = min(time - tin,.1); +per_frame_19=tin = time; +per_frame_20= +per_frame_21=ra = 1; +per_frame_22=treb_avg = tic*(treb_avg*(1/tic - ra) + ra*treb); +per_frame_23=mid_avg = tic*(mid_avg*(1/tic - ra) + ra*mid); +per_frame_24=bass_avg = tic*(bass_avg*(1/tic - ra) + ra*bass); +per_frame_25= +per_frame_26=rb = 1; +per_frame_27=vav = tic*(vav*(1/tic - rb) + rb*(bass+treb+mid)*.33333); +per_frame_28= +per_frame_29=tt = tt + tic*treb_avg; +per_frame_30=mt = mt + tic*mid_avg; +per_frame_31=bt = bt + tic*bass_avg; +per_frame_32=vt = vt + tic*(treb_avg+mid_avg+bass_avg)*.33333; +per_frame_33= +per_frame_34=sp = abs(vav - slide)*.1; +per_frame_35=slide = if(above(slide,vav),slide-tic*sp,slide+tic*sp) + (1-toc)*vav; +per_frame_36=toc = 1; +per_frame_37= +per_frame_38=q3 = (treb + bass + mid)*.3333; +per_frame_39=q3 = q3*q3*0.5 + 0.1; +per_frame_40=q3 = min(q3,1.0); +per_frame_41=//q3=1.25; +per_frame_42=monitor = int(q3*4)/4; +per_frame_43= +per_frame_44=q4 = mt; +per_frame_45=q5 = bt; +per_frame_46= +per_frame_47=cx = q1; +per_frame_48=cy = q2; +per_frame_49= +per_frame_50=rmod = ((treb_avg + mid_avg)*.5 - bass_avg*0.5)*.01; +per_frame_51=rmod = 0.02 * pow(rmod/0.02 , 2)*7; +per_frame_52=rmod = min(0.001 , max(rmod, -0.001)); +per_frame_53=rmod=rmod*pow(sin(time)*1.1,2); +per_frame_54=rot = 0.02 * pow(rmod/0.02 , 2) *40; +per_frame_55= +per_frame_56=q6 = rmod; +per_frame_57= +per_frame_58=q7 = slide - below(q3,.5)*(6 + 2*sin(time*24))*pow(min(1,(.5 - q3)*2),5); +per_frame_59= +per_frame_60=q8=if( above(sin(time*0.5),0) , -1 , 1); +per_frame_61= +per_frame_62=//echo_zoom=1+(above(treb,.8)+treb); +per_pixel_1=tm=time/rad; +per_pixel_2=a = q1; +per_pixel_3=b = q2; +per_pixel_4= +per_pixel_5=//testcode +per_pixel_6=//a=0.0;b=0.5; +per_pixel_7= +per_pixel_8=mx = x-a; +per_pixel_9=my = y-b; +per_pixel_10=zm = -.45; +per_pixel_11=zm= if( above(sin(time*2.1),0.95) , 0.45 * max(1-q3*.5,0) , zm); +per_pixel_12= +per_pixel_13=//test code +per_pixel_14=//zm= -0.5; +per_pixel_15= +per_pixel_16=dis = pow(mx*mx + my*my,.5)*.70710678; +per_pixel_17= +per_pixel_18=rot = rot*(1-dis); +per_pixel_19=rot=rot*20*q8 ; +per_pixel_20= +per_pixel_21=//testcode +per_pixel_22=//q3=3.1; +per_pixel_23= +per_pixel_24=limit=0.05; +per_pixel_25= +per_pixel_26=dx = zm*mx*dis*cos(my*3.14)*q3; +per_pixel_27=dsign=sign(dx); +per_pixel_28=dx = dx - ( max(abs(dx)-limit,0) )*dsign; +per_pixel_29= +per_pixel_30=dy = zm*my*dis*cos(mx*3.14)*q3; +per_pixel_31=dsign=sign(dy); +per_pixel_32=dy = dy - ( max(abs(dy)-limit,0) )*dsign; +per_pixel_33= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic Aderrasi & nil - LA movement (Intellectual Sens.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic Aderrasi & nil - LA movement (Intellectual Sens.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic Aderrasi & nil - LA movement (Intellectual Sens.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic Aderrasi & nil - LA movement (Intellectual Sens.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,94 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.997000 +fVideoEchoZoom=0.999997 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=98.029610 +fWaveScale=0.935100 +fWaveSmoothing=0.306000 +fWaveParam=-0.360000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.963044 +fShader=0.000001 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.090000 +wave_g=0.090000 +wave_b=0.090000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.020000 +ob_g=0.020000 +ob_b=0.020000 +ob_a=0.990000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.990000 +nMotionVectorsX=42.111980 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.050000 +mv_r=1.000000 +mv_g=0.640000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=ib_r=sin(bass*cos(frame*0.535)); +per_frame_2=ib_g=sin(bass*cos(frame*0.635)); +per_frame_3=ib_b=sin(bass*cos(frame*0.735)); +per_frame_4=dx=sin(time*1.234)*.0125; +per_frame_5=dy=cos(time*.9666)*.0125; +per_frame_6=q1=frame%2; +per_frame_7=wave_r=q1; +per_frame_8=wave_g=q1; +per_frame_9=wave_b=q1; +per_frame_10=ff = frame/100; +per_frame_11=wave_r = sin(5*ff/bass)/2+0.5; +per_frame_12=wave_g = cos(ff/mid)/2+0.5; +per_frame_13=wave_b = cos(3*ff/treb)/2+0.5; +per_frame_14=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_15=zoom=max(0.97, min(0.15+0.7*bass_att, 1.75 )); +per_frame_16=ob_r=wave_r; +per_frame_17=ob_g=wave_g; +per_frame_18=ob_b=wave_b; +per_pixel_1=q2=above(rad,.603); +per_pixel_2=rot=rot+if(q2,0,sin(time*.7243)*.5); +per_pixel_3=zoom=zoom+if(q2,0,rad*sin(time*.734)*.8); +per_pixel_4=warp=warp+if(above(rad,.2166),sin(ang*rad),0); +per_pixel_5=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_6=dx_r = equal(thresh,2)*0.025*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_7=dy_r = equal(thresh,2)*0.025*sin(5*time)+(1-equal(thresh,2))*dy_r; +per_pixel_8=crack = 1.34*sin(3.12*thresh*time) + 0.95*sin(5*thresh*time) + 1.73*cos(1.66*thresh*time) - 0.5*sin(0.25*thresh*time); +per_pixel_9=rip = 1.92*cos(1.96*thresh*time) - 0.195*cos(3.27*thresh*time) + 0.236*sin(3.25*thresh*time) + 1.5*sin(thresh*time); +per_pixel_10=crackdown = ((crack*2)*dx_r)*sin(3.75*time); +per_pixel_11=ripdown = ((rip*2)*dy_r)*sin(5.75*time); +per_pixel_12=dx = dx + if (above(crack,rip), 2*dx_r*crackdown, -2*dx_r*ripdown)*25; +per_pixel_13=dy = dy + if (above(rip,crack), 2*dy_r*crackdown, -2*dy_r*ripdown)*25; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Studio Music and Unchained - Rapid Alteration.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Studio Music and Unchained - Rapid Alteration.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Studio Music and Unchained - Rapid Alteration.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Studio Music and Unchained - Rapid Alteration.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,103 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=0.983000 +fVideoEchoZoom=0.998169 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=4 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.740000 +fWaveScale=0.372036 +fWaveSmoothing=0.387000 +fWaveParam=-0.360000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.334503 +fWarpScale=1.327831 +fZoomExponent=1.026514 +fShader=1.000000 +zoom=1.374512 +rot=0.020000 +cx=0.170000 +cy=0.830001 +dx=0.000000 +dy=0.000000 +warp=1.779457 +sx=0.990099 +sy=1.000000 +wave_r=0.270000 +wave_g=0.270000 +wave_b=0.270000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.360000 +ob_g=0.360000 +ob_b=0.360000 +ob_a=0.580000 +ib_size=0.010000 +ib_r=0.450000 +ib_g=0.450001 +ib_b=0.449900 +ib_a=0.530000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*bass_thresh*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*treb_thresh*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*mid_thresh*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+.2*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed)+(mid+bass+treb)*entropy*.025); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=sin(pulse/2); +per_frame_25=wave_r=wave_r+.5*bass_residual; +per_frame_26=wave_r=wave_g+.5*mid_residual; +per_frame_27=wave_r=wave_b+.5*treb_residual; +per_frame_28=wave_mystery=mid_residual; +per_frame_29=ob_r=if(bass_flop,treb_flop,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_flop,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_flop,wave_g); +per_frame_32=ob_a=.03+.02*wave_r; +per_frame_33=ob_size=.05+.04*treb_residual; +per_frame_34=ib_r=if(bass_flop,ob_b,ob_g); +per_frame_35=ib_b=if(treb_flop,ob_g,ob_r); +per_frame_36=ib_g=if(mid_flop,ob_r,ob_b); +per_frame_37=ib_a=.03+.02*wave_g; +per_frame_38=ib_size=.05+.04*bass_residual; +per_frame_39=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_40=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_41=ib_b = ib_b + 0.2*sin(time*0.4354); +per_frame_42=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_43=zoom=max(0.98, min(0.15+0.8*bass_att, 1.75 )); +per_pixel_1=radix=if(above(q3,0),min(x,y),max(x,y)); +per_pixel_2=radix=if(above(q2,0),min(radix,rad),max(radix,rad)); +per_pixel_3=rot=if(above(q4,0),rad*.2*q5,0); +per_pixel_4=zoom=if(above(q2,0),zoom,if(above(q3,0),1+q1*.05,1+.07*cos(radix*10*q1))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Studio Music - Cherished Desires.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Studio Music - Cherished Desires.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Studio Music - Cherished Desires.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Studio Music - Cherished Desires.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.947994 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.396500 +fWaveScale=0.969133 +fWaveSmoothing=0.666000 +fWaveParam=0.000100 +fModWaveAlphaStart=1.379900 +fModWaveAlphaEnd=1.020000 +fWarpAnimSpeed=2.000000 +fWarpScale=1.000000 +fZoomExponent=0.056700 +fShader=0.700000 +zoom=0.539300 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.819500 +sy=0.819545 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.500000 +ob_g=0.010000 +ob_b=0.010000 +ob_a=0.950000 +ib_size=0.010000 +ib_r=0.010000 +ib_g=0.010000 +ib_b=0.500000 +ib_a=0.950000 +nMotionVectorsX=9.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = bass*.5; +per_frame_3=wave_g = treb*.5; +per_frame_4=wave_b = mid*.5; +per_frame_5=decay = .99; +per_frame_6=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_7=zoom=max(0.98, min(0.15+0.8*bass_att, 1.75 )); +per_pixel_1=zoom = 1.2+rad*.1; +per_pixel_2=zoomexp =1 - 1*sin(rad*time*100); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Harmonic Bliss (elated mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Harmonic Bliss (elated mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Harmonic Bliss (elated mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Harmonic Bliss (elated mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,98 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.008000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.916200 +fWaveScale=0.999400 +fWaveSmoothing=0.666000 +fWaveParam=-0.020000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=1.079900 +fWarpAnimSpeed=0.941900 +fWarpScale=2.814595 +fZoomExponent=0.999600 +fShader=0.830000 +zoom=1.006500 +rot=0.000000 +cx=0.500001 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=3.947234 +sx=0.999600 +sy=0.999899 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.250000 +ob_g=0.650000 +ob_b=0.250000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.650000 +ib_g=0.250001 +ib_b=0.250001 +ib_a=1.000000 +nMotionVectorsX=11.999902 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.050000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=wave_r = sin(5*ff/bass)/2+0.5; +per_frame_2=wave_g = cos(ff/mid)/2+0.5; +per_frame_3=wave_b = cos(3*ff/treb)/2+0.5; +per_frame_4=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_7=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_8=ib_b = ib_b + 0.2*sin(time*0.4354); +per_frame_9=ob_r=wave_r; +per_frame_10=ob_g=wave_g; +per_frame_11=ob_b=wave_b; +per_frame_12=mv_x = lastingbass*30+24; +per_frame_13=mv_y= madtreb*48+8; +per_frame_14=mv_r = 0.7-bass_att; +per_frame_15=mv_b = 0.6-treb_att; +per_frame_16=mv_g = 0.5-mid_att; +per_frame_17=ff = frame/100; +per_frame_18=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_19=zoom=max(0.97, min(0.15+0.7*bass_att, 1.75 )); +per_pixel_1=q2=above(rad,.303); +per_pixel_2=rot=rot+if(q2,0,sin(time*.7243)*.5); +per_pixel_3=zoom=zoom+if(q2,0,rad*sin(time*.734)*.8); +per_pixel_4=warp=warp+if(above(rad,.2166),sin(ang*rad),0); +per_pixel_5=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_6=dx_r = equal(thresh,2)*0.025*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_7=dy_r = equal(thresh,2)*0.025*sin(5*time)+(1-equal(thresh,2))*dy_r; +per_pixel_8=crack = 1.34*sin(3.12*thresh*time) + 0.95*sin(5*thresh*time) + 1.73*cos(1.66*thresh*time) - 0.5*sin(0.25*thresh*time); +per_pixel_9=rip = 1.92*cos(1.96*thresh*time) - 0.195*cos(3.27*thresh*time) + 0.236*sin(3.25*thresh*time) + 1.5*sin(thresh*time); +per_pixel_10=crackdown = ((crack*2)*dx_r)*sin(3.75*time); +per_pixel_11=ripdown = ((rip*2)*dy_r)*sin(5.75*time); +per_pixel_12=dx = dx + if (above(crack,rip), 2*dx_r*crackdown, -2*dx_r*ripdown)*25; +per_pixel_13=dy = dy + if (above(rip,crack), 2*dy_r*crackdown, -2*dy_r*ripdown)*25; +per_pixel_14=pre_zoom=zoom-.07*acos(y*2-1)*sin(time*1.2*q1)*zoom-.07*acos(x*2-1)*sin(time*1.1*q1); +per_pixel_15=zoom=if(above(abs(zoom-1),.04),pre_zoom,.99); +per_pixel_16=rot=if(above(abs(zoom-1),2),-.4+.2*q1,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - It's Only Make Believe.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - It's Only Make Believe.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - It's Only Make Believe.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - It's Only Make Believe.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,75 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=1.006593 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.865441 +fWaveScale=69.200165 +fWaveSmoothing=0.792000 +fWaveParam=0.020000 +fModWaveAlphaStart=0.980000 +fModWaveAlphaEnd=0.999999 +fWarpAnimSpeed=0.960959 +fWarpScale=6.948194 +fZoomExponent=2.699864 +fShader=0.700000 +zoom=0.012572 +rot=0.000000 +cx=0.500000 +cy=0.500001 +dx=0.000000 +dy=0.000000 +warp=10.040655 +sx=0.999989 +sy=0.999999 +wave_r=0.250000 +wave_g=0.250000 +wave_b=0.250000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.150000 +ob_g=0.350000 +ob_b=0.250000 +ob_a=0.970000 +ib_size=0.010000 +ib_r=0.350000 +ib_g=0.250000 +ib_b=0.150000 +ib_a=0.970000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.050000 +mv_r=0.500000 +mv_g=0.500000 +mv_b=0.500000 +mv_a=0.950000 +per_frame_1=ff = frame/100; +per_frame_2=wave_r = sin(5*ff/bass)/2+0.5; +per_frame_3=wave_g = cos(ff/mid)/2+0.5; +per_frame_4=wave_b = cos(3*ff/treb)/2+0.5; +per_frame_5=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_6=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_7=ib_b = ib_b + 0.2*sin(time*0.4354); +per_frame_8=ob_r=wave_r; +per_frame_9=ob_g=wave_g; +per_frame_10=ob_b=wave_b; +per_frame_11=rot = rot + 0.180*( 0.60*sin(0.981*time) + 0.80*sin(0.279*time) ); +per_frame_12=zoom=max(0.98, min(0.15+0.8*bass_att, 1.75 )); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Numerosity.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Numerosity.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Numerosity.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Numerosity.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=0.330231 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.501800 +fWaveScale=1.297700 +fWaveSmoothing=0.450000 +fWaveParam=0.020000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.000001 +fWarpAnimSpeed=0.517589 +fWarpScale=0.704400 +fZoomExponent=0.347586 +fShader=0.610000 +zoom=0.793914 +rot=0.000000 +cx=0.499900 +cy=0.499900 +dx=0.000000 +dy=0.000000 +warp=0.290273 +sx=0.929000 +sy=0.932617 +wave_r=0.030000 +wave_g=0.030000 +wave_b=0.030000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.500000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.500000 +nMotionVectorsX=64.000000 +nMotionVectorsY=2.400000 +mv_dx=0.000000 +mv_dy=-0.100000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_5=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_6=ib_b = ib_b + 0.2*sin(time*0.4354); +per_frame_7=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_8=zoom=max(0.98, min(0.15+0.8*bass_att, 1.75 )); +per_pixel_1=gridx=bnot((x*q7)%2); +per_pixel_2=gridy=bnot((y*q7)%2); +per_pixel_3=zoom=zoom+.07*cos(sin(rad*2.14*q3+abs(rad*3.14*gridy))*2.14+rad*sin(q4*2.14+q1))*gridx; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Twisted Galaxy.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Twisted Galaxy.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Twisted Galaxy.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic - Twisted Galaxy.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,61 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=1 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.200000 +fWaveScale=1.981000 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=2.064000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=2.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.600000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.400*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.400*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.400*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_5=zoom=max(0.98, min(0.15+0.8*bass_att, 1.75 )); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Entity.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Entity.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Entity.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Entity.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,103 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=0.998099 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=1 +fWaveAlpha=7.740000 +fWaveScale=0.988200 +fWaveSmoothing=0.450000 +fWaveParam=0.300000 +fModWaveAlphaStart=1.359900 +fModWaveAlphaEnd=0.380000 +fWarpAnimSpeed=0.787543 +fWarpScale=1.327700 +fZoomExponent=1.332000 +fShader=0.500000 +zoom=1.195700 +rot=0.000000 +cx=0.050000 +cy=0.950000 +dx=0.000000 +dy=0.000000 +warp=3.753000 +sx=0.990000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.340001 +ib_size=0.005000 +ib_r=0.970000 +ib_g=0.500000 +ib_b=0.499900 +ib_a=0.500000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*bass_thresh*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*treb_thresh*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*mid_thresh*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+.2*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed)+(mid+bass+treb)*entropy*.025); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=sin(pulse/2); +per_frame_25=wave_r=wave_r+.5*bass_residual; +per_frame_26=wave_r=wave_g+.5*mid_residual; +per_frame_27=wave_r=wave_b+.5*treb_residual; +per_frame_28=wave_mystery=mid_residual; +per_frame_29=ob_r=if(bass_flop,treb_flop,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_flop,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_flop,wave_g); +per_frame_32=ob_a=.03+.02*wave_r; +per_frame_33=ob_size=.05+.04*treb_residual; +per_frame_34=ib_r=if(bass_flop,ob_b,ob_g); +per_frame_35=ib_b=if(treb_flop,ob_g,ob_r); +per_frame_36=ib_g=if(mid_flop,ob_r,ob_b); +per_frame_37=ib_a=.03+.02*wave_g; +per_frame_38=ib_size=.05+.04*bass_residual; +per_frame_39=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_40=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_41=ib_b = ib_b + 0.2*sin(time*0.4354); +per_frame_42=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_43=zoom=max(0.98, min(0.15+0.8*bass_att, 1.75 )); +per_pixel_1=radix=if(above(q3,0),min(x,y),max(x,y)); +per_pixel_2=radix=if(above(q2,0),min(radix,rad),max(radix,rad)); +per_pixel_3=rot=if(above(q4,0),rad*.2*q5,0); +per_pixel_4=zoom=if(above(q2,0),zoom,if(above(q3,0),1+q1*.05,1+.07*cos(radix*10*q1))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Minor Alteration.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Minor Alteration.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Minor Alteration.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Minor Alteration.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,99 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.900000 +fVideoEchoZoom=0.998169 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.740000 +fWaveScale=0.372036 +fWaveSmoothing=0.387000 +fWaveParam=-0.360000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.334503 +fWarpScale=1.327831 +fZoomExponent=1.026514 +fShader=0.400000 +zoom=1.374512 +rot=0.020000 +cx=0.170000 +cy=0.830001 +dx=0.000000 +dy=0.000000 +warp=1.779457 +sx=0.990099 +sy=1.000000 +wave_r=0.270000 +wave_g=0.270000 +wave_b=0.270000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.360000 +ob_g=0.360000 +ob_b=0.360000 +ob_a=0.580000 +ib_size=0.010000 +ib_r=0.450000 +ib_g=0.450001 +ib_b=0.449900 +ib_a=0.900000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*bass_thresh*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*treb_thresh*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*mid_thresh*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+.1*bor(bor(bass_changed,treb_changed),mid_changed)+(mid_thresh+bass_thresh+treb_thresh)*entropy*.025); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=sin(pulse/2); +per_frame_25=wave_r=wave_r+.5*bass_residual; +per_frame_26=wave_r=wave_g+.5*mid_residual; +per_frame_27=wave_r=wave_b+.5*treb_residual; +per_frame_28=wave_mystery=mid_residual; +per_frame_29=ob_r=if(bass_flop,treb_flop,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_flop,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_flop,wave_g); +per_frame_32=ob_a=.03+.02*wave_r; +per_frame_33=ob_size=.25+.25*treb_residual; +per_frame_34=ib_size=.05+.04*bass_residual; +per_frame_35=ib_r = if(bass_flop,ob_b,.5+ 0.2*sin(time*0.5413)); +per_frame_36=ib_g = if(treb_flop,ob_g,.5 + 0.2*sin(time*0.6459)); +per_frame_37=ib_b = if(mid_flop,ob_r,.5 + 0.2*sin(time*0.4354)); +per_frame_38=rot = rot + 0.04*q1; +per_frame_39=zoom=max(0.98, 0.2+0.35*bass_thresh); +per_pixel_1=radix=if(above(q3,0),min(x,y),max(x,y)); +per_pixel_2=radix=if(above(q2,0),min(radix,rad),max(radix,rad)); +per_pixel_3=rot=if(above(q4,0),rad*.2*q5,rot); +per_pixel_4=zoom=if(above(q2,0),zoom,if(above(q3,0),zoom+q1*.05,zoom+.07*cos(radix*10*q1))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - So Much Love.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - So Much Love.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - So Much Love.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - So Much Love.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,287 @@ +[preset00] +fRating=1.000000 +fGammaAdj=1.350000 +fDecay=0.999000 +fVideoEchoZoom=1.006465 +fVideoEchoAlpha=0.499900 +nVideoEchoOrientation=3 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.001574 +fWaveScale=0.728900 +fWaveSmoothing=0.783000 +fWaveParam=-0.140000 +fModWaveAlphaStart=0.760000 +fModWaveAlphaEnd=0.900001 +fWarpAnimSpeed=5.921029 +fWarpScale=1.095251 +fZoomExponent=1.570168 +fShader=0.650000 +zoom=0.970805 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.107093 +sx=1.078500 +sy=0.990000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.005000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=3.000000 +nMotionVectorsY=2.000000 +mv_dx=0.020000 +mv_dy=-0.020000 +mv_l=0.150000 +mv_r=0.490000 +mv_g=0.480000 +mv_b=0.300001 +mv_a=0.970000 +wavecode_0_enabled=0 +wavecode_0_samples=128 +wavecode_0_sep=2 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=0.749339 +wavecode_0_smoothing=0.250000 +wavecode_0_r=0.520000 +wavecode_0_g=0.410001 +wavecode_0_b=0.340001 +wavecode_0_a=0.970000 +wave_0_per_frame1=x=100*sin(time)*q2+.3; +wave_0_per_frame2=t1=cos(time)*q3; +wave_0_per_frame3=r = 0.5 + 0.5*sin(time*1.353 +3); +wave_0_per_frame4=b = 0.5 + 0.5*sin(time*1.561 + 2); +wave_0_per_frame5=g = 0.5 + 0.5*sin(time*1.213 + 4); +wave_0_per_point1=x = t8 + value1*0.7; +wave_0_per_point2=y = 0.5 + value2*0.7; +wave_0_per_point3=t1 = t1 + 0.01; +wave_0_per_point4=b = x; +wave_0_per_point5=a = 0.5 + 0.5*sin(time + t1*50); +wave_0_per_point6=a = a*a; +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=0.370001 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.075209 +shapecode_0_ang=0.010000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.640000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.610000 +shapecode_0_border_r=0.460001 +shapecode_0_border_g=0.370001 +shapecode_0_border_b=0.600000 +shapecode_0_border_a=0.400000 +shape_0_per_frame1=x = 0.5 + 0.50*cos(q3*0.5) + 0.25*cos(time*6.5); +shape_0_per_frame2=y = 0.5 + 0.50*sin(q3*0.5) + 0.25*sin(time*6.5); +shape_0_per_frame3=r = 0.5 + 0.5*sin(time*1.713 + 2); +shape_0_per_frame4=g = 0.5 + 0.5*sin(time*1.063 + 3); +shape_0_per_frame5=b = 0.5 + 0.5*sin(time*1.054 + 1); +shape_0_per_frame6=r2 = 0.5 + 0.5*sin(time*1.085 + 3); +shape_0_per_frame7=g2 = 0.5 + 0.5*sin(time*1.056+ 1); +shape_0_per_frame8=b2 = 0.5 + 0.5*sin(time*1.038 + 3); +shapecode_1_enabled=1 +shapecode_1_sides=32 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.089633 +shapecode_1_ang=0.030000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=0.210001 +shapecode_1_g=0.440000 +shapecode_1_b=0.230000 +shapecode_1_a=0.540000 +shapecode_1_r2=0.180000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.110000 +shapecode_1_a2=0.510000 +shapecode_1_border_r=0.150001 +shapecode_1_border_g=0.400001 +shapecode_1_border_b=0.480000 +shapecode_1_border_a=0.290000 +shape_1_per_frame1=ang = time*1.4; +shape_1_per_frame2=x = 0.5 + 0.16*cos(time*2.1) + 0.03*cos(time*0.7); +shape_1_per_frame3=y = 0.5 + 0.12*sin(time*2.3) + 0.04*sin(time*0.2); +shape_1_per_frame4=r = 0.5 + 0.5*sin(time*0.713 + 1); +shape_1_per_frame5=g = 0.5 + 0.5*sin(time*0.563 + 2); +shape_1_per_frame6=b = 0.5 + 0.5*sin(time*0.654 + 5); +shape_1_per_frame7=r2 = 0.5 + 0.5*sin(time*0.885 + 4); +shape_1_per_frame8=g2 = 0.5 + 0.5*sin(time*0.556+ 1); +shape_1_per_frame9=b2 = 0.5 + 0.5*sin(time*0.638 + 3); +shapecode_2_enabled=1 +shapecode_2_sides=5 +shapecode_2_additive=0 +shapecode_2_thickOutline=1 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.090001 +shapecode_2_ang=0.030000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=0.590000 +shapecode_2_g=0.430000 +shapecode_2_b=0.290000 +shapecode_2_a=0.560000 +shapecode_2_r2=0.160000 +shapecode_2_g2=0.400001 +shapecode_2_b2=0.540000 +shapecode_2_a2=0.530000 +shapecode_2_border_r=0.390001 +shapecode_2_border_g=0.000000 +shapecode_2_border_b=0.350001 +shapecode_2_border_a=0.390000 +shape_2_per_frame1=x = 0.5 + 0.15*cos(q3*0.5) + 0.21*cos(time*7.5); +shape_2_per_frame2=y = 0.5 + 0.15*sin(q3*0.5) + 0.21*sin(time*7.5); +shape_2_per_frame3=r = 0.5 + 0.5*sin(time*1.713 + 1); +shape_2_per_frame4=g = 0.5 + 0.5*sin(time*1.563 + 3); +shape_2_per_frame5=b = 0.5 + 0.5*sin(time*1.654 + 2); +shape_2_per_frame6=r2 = 0.5 + 0.5*sin(time*1.885 + 3); +shape_2_per_frame7=g2 = 0.5 + 0.5*sin(time*1.556+ 2); +shape_2_per_frame8=b2 = 0.5 + 0.5*sin(time*1.638 + 4); +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=sx=1; +per_frame_2=sy=1; +per_frame_3=warp=0; +per_frame_4=chaos=.9+.1*sin(pulse); +per_frame_5=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_6=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_7=bass_changed=abs(bass_changed-equal(bass_thresh,2)); +per_frame_8=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_9=treb_changed=abs(bass_changed-equal(treb_thresh,2)); +per_frame_10=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_11=mid_changed=abs(bass_changed-equal(mid_thresh,2)); +per_frame_12=bass_residual = bass_changed*sin(pulse*bass_thresh*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_13=treb_residual = treb_changed*sin(pulse*treb_thresh*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_14=mid_residual = mid_changed*sin(pulse*mid_thresh*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_15=pulse=if(above(abs(pulse),20),-20,pulse+.2*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed)+(mid+bass+treb)*.025); +per_frame_16=q1=mid_residual; +per_frame_17=q2=bass_residual; +per_frame_18=q3=treb_residual; +per_frame_19=q5=sin(pulse); +per_frame_20=q4=(1+1*above(q1,0))*(1+2*above(q2,0))*(1+4*above(q3,0))*(1+6*mid_changed*below(q5,0))*(1+10*below(q1,0))*(1+12*mid_changed*above(q5,0)); +per_frame_21=wave_r=if(equal(treb_changed,1),0+.2*q1,if(equal(bass_changed,1),.8+.2*q2,.6+.08*q5)); +per_frame_22=wave_g=if(equal(treb_changed,1),0,if(equal(mid_changed,1),0,.5+.5*q2)); +per_frame_23=wave_b=if(equal(treb_changed,1),.8+.2*q3,0); +per_frame_24=ob_r=if(bass_changed,treb_changed,wave_r); +per_frame_25=ob_b=if(treb_changed,mid_changedp,wave_b); +per_frame_26=ob_g=if(mid_changed,bass_changed,wave_g); +per_frame_27=ob_a=.03+.02*wave_r; +per_frame_28=ob_size=.05+.04*treb_residual; +per_frame_29=ob_size=bnot(q1%102)*.1; +per_frame_30=ib_r=if(bass_changed,ob_b,ob_g); +per_frame_31=ib_b=if(treb_changed,ob_g,ob_r); +per_frame_32=ib_g=if(mid_changed,ob_r,ob_b); +per_frame_33=ib_a=.03+.02*wave_g; +per_frame_34=ib_size=.05+.04*bass_residual; +per_frame_35=wave_mystery=bnot(q1%2)*.3-bnot(q1%11)*.3+.5*sin(pulse*q2); +per_frame_36=cx=cx+.5*q1; +per_frame_37=cy=cy+.5*q2; +per_frame_38=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_39=zoom=max(0.97, min(0.15+0.7*bass_att, 1.75 )); +per_pixel_1=state=q4; +per_pixel_2=bend = cos(x*10*q1*bnot(state%7)-rad*10*q2*bnot(state%3)); +per_pixel_3=zoom = zoom+bend*.05*q3*bnot(state%5); +per_pixel_4=grid=abs(x*10-5)%2 + abs(y*10-5)%2; +per_pixel_5=sx=sx-equal(grid,bnot(state%2))*above(q1*q2*q3*q5,.8)*.9; +per_pixel_6=rot=if(above(zoom-1,.03+.03*q5)*bnot(below(q1*q2*q3,0)),q1,rot); +per_pixel_7=rot=rot+if(q2,0,sin(time*.7243)*.5); +per_pixel_8=zoom=zoom+if(q2,0,rad*sin(time*.734)*.8); +per_pixel_9=warp=warp+if(above(rad,.2166),sin(ang*rad),0); +per_pixel_10=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*0.96+1.3); +per_pixel_11=dx_r = equal(thresh,2)*0.025*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_pixel_12=dy_r = equal(thresh,2)*0.025*sin(5*time)+(1-equal(thresh,2))*dy_r; +per_pixel_13=crack = 1.34*sin(3.12*thresh*time) + 0.95*sin(5*thresh*time) + 1.73*cos(1.66*thresh*time) - 0.5*sin(0.25*thresh*time); +per_pixel_14=rip = 1.92*cos(1.96*thresh*time) - 0.195*cos(3.27*thresh*time) + 0.236*sin(3.25*thresh*time) + 1.5*sin(thresh*time); +per_pixel_15=crackdown = ((crack*2)*dx_r)*sin(33.75*time); +per_pixel_16=ripdown = ((rip*2)*dy_r)*sin(5.75*time); +per_pixel_17=dx = dx + if (above(crack,rip), 2*dx_r*crackdown, -2*dx_r*ripdown)*25; +per_pixel_18=dy = dy + if (above(rip,crack), 2*dy_r*crackdown, -2*dy_r*ripdown)*25; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - State Of Discretion.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - State Of Discretion.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - State Of Discretion.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - State Of Discretion.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,103 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.983000 +fVideoEchoZoom=0.998168 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=4 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.973828 +fWaveScale=1.329466 +fWaveSmoothing=0.450000 +fWaveParam=0.020000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=0.999998 +fWarpScale=0.994977 +fZoomExponent=0.057600 +fShader=0.950000 +zoom=0.773282 +rot=0.000000 +cx=0.440000 +cy=0.440001 +dx=0.020000 +dy=0.000000 +warp=0.999100 +sx=0.990096 +sy=1.009997 +wave_r=0.350000 +wave_g=0.360000 +wave_b=0.400000 +wave_x=0.510000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.360000 +ob_g=0.500000 +ob_b=0.360001 +ob_a=0.959999 +ib_size=0.010000 +ib_r=0.450000 +ib_g=0.450001 +ib_b=0.500000 +ib_a=0.900000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*bass_thresh*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*treb_thresh*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*mid_thresh*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+.2*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed)+(mid+bass+treb)*entropy*.025); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=sin(pulse/2); +per_frame_25=wave_r=wave_r+.5*bass_residual; +per_frame_26=wave_r=wave_g+.5*mid_residual; +per_frame_27=wave_r=wave_b+.5*treb_residual; +per_frame_28=wave_mystery=mid_residual; +per_frame_29=ob_r=if(bass_flop,treb_flop,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_flop,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_flop,wave_g); +per_frame_32=ob_a=.03+.02*wave_r; +per_frame_33=ob_size=.05+.04*treb_residual; +per_frame_34=ib_r=if(bass_flop,ob_b,ob_g); +per_frame_35=ib_b=if(treb_flop,ob_g,ob_r); +per_frame_36=ib_g=if(mid_flop,ob_r,ob_b); +per_frame_37=ib_a=.03+.02*wave_g; +per_frame_38=ib_size=.05+.04*bass_residual; +per_frame_39=ib_r = ib_r + 0.2*sin(time*0.5413); +per_frame_40=ib_g = ib_g + 0.2*sin(time*0.6459); +per_frame_41=ib_b = ib_b + 0.2*sin(time*0.4354); +per_frame_42=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_frame_43=zoom=max(0.98, min(0.15+0.8*bass_att, 1.75 )); +per_pixel_1=radix=if(above(q3,0),min(x,y),max(x,y)); +per_pixel_2=radix=if(above(q2,0),min(radix,rad),max(radix,rad)); +per_pixel_3=rot=if(above(q4,0),rad*.2*q5,0); +per_pixel_4=zoom=if(above(q2,0),zoom,if(above(q3,0),1+q1*.05,1+.07*cos(radix*10*q1))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Wrenched Fate.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Wrenched Fate.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Wrenched Fate.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/StudioMusic & Unchained - Wrenched Fate.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,100 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.999001 +fDecay=0.980000 +fVideoEchoZoom=0.998100 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=5 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=64 +nMotionVectorsY=1 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=13.378749 +fWaveScale=0.717349 +fWaveSmoothing=0.531000 +fWaveParam=0.020000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.208100 +fWarpScale=1.263386 +fZoomExponent=0.111607 +fShader=0.509900 +zoom=0.054279 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.333300 +sx=0.999901 +sy=0.999901 +wave_r=0.250000 +wave_g=0.350000 +wave_b=0.700000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.500000 +ob_g=0.250000 +ob_b=0.150000 +ob_a=0.970000 +ib_size=0.010000 +ib_r=0.100000 +ib_g=0.300000 +ib_b=0.500000 +ib_a=0.970000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*bass_thresh*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*treb_thresh*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*mid_thresh*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+.1*bor(bor(bass_changed,treb_changed),mid_changed)+(mid_thresh+bass_thresh+treb_thresh)*entropy*.025); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=sin(pulse/2); +per_frame_25=wave_r=wave_r+.5*bass_residual; +per_frame_26=wave_r=wave_g+.5*mid_residual; +per_frame_27=wave_r=wave_b+.5*treb_residual; +per_frame_28=wave_mystery=mid_residual; +per_frame_29=ob_r=if(bass_flop,treb_flop,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_flop,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_flop,wave_g); +per_frame_32=ob_a=.03+.02*wave_r; +per_frame_33=ob_size=.25+.25*treb_residual; +per_frame_34=ib_size=.05+.04*bass_residual; +per_frame_35=ib_r = if(bass_flop,ob_b,.5+ 0.2*sin(time*0.5413)); +per_frame_36=ib_g = if(treb_flop,ob_g,.5 + 0.2*sin(time*0.6459)); +per_frame_37=ib_b = if(mid_flop,ob_r,.5 + 0.2*sin(time*0.4354)); +per_frame_38=rot = rot + 0.04*q1; +per_frame_39=zoom=max(0.98, 0.2+0.35*bass_thresh); +per_pixel_1=radix=if(above(q3,0),min(x,y),max(x,y)); +per_pixel_2=radix=if(above(q2,0),min(radix,rad),max(radix,rad)); +per_pixel_3=rot=if(above(q4,0),rad*.2*q5,rot); +per_pixel_4=zoom=if(above(q2,0),zoom,if(above(q3,0),zoom+q1*.05,zoom+.07*cos(radix*10*q1))); +per_pixel_5=rot=if(equal(q1,1),rad*(sin(mid+treb)/7),rad*(sin(-mid-treb)/7)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TEcHNO and SandStorm - Psychodelic Highway.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TEcHNO and SandStorm - Psychodelic Highway.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TEcHNO and SandStorm - Psychodelic Highway.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TEcHNO and SandStorm - Psychodelic Highway.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.985000 +fVideoEchoZoom=1.000224 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.003100 +fWaveScale=1.004873 +fWaveSmoothing=0.000000 +fWaveParam=-0.500000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.010000 +fWarpAnimSpeed=0.999994 +fWarpScale=1.002076 +fZoomExponent=1.001830 +fShader=1.000000 +zoom=1.077494 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.500000 +wave_b=0.800000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.030000 +ib_r=0.380000 +ib_g=0.270000 +ib_b=0.030000 +ib_a=0.300000 +nMotionVectorsX=10.879999 +nMotionVectorsY=11.520000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.250000 +per_frame_1=wave_mystery=abs(sin(time*0.51))*-1; +per_frame_2=cx=cx+(sin(time)*if(above(sin(time),0),(-1+bass),1.3))*0.5; +per_frame_3=cy=cy+(cos(time)*if(below(sin(time),0),(-1+bass),1.3))*0.6; +per_frame_4=mv_x=mv_x+sin(time/1.8)*3; +per_frame_5=mv_y=mv_x-sin(time/2)*3.5; +per_frame_6=wave_r=bass; +per_frame_7=wave_g=wave_g+sin(time*0.74)*0.3; +per_frame_8=wave_b=wave_b+sin(time*0.83)*0.2; +per_frame_9=mv_g=mv_g*abs(sin(time)); +per_frame_10=mv_r=bass; +per_frame_11=mv_b=treb; +per_frame_12=ib_size=ib_size+bass*0.15; +per_frame_13=rot=sin(time)*0.03; +per_frame_14=ib_r=abs(sin(time*1.5))*0.4; +per_frame_15=ib_g=abs(sin(time*1.53))*0.5 ; +per_frame_16=ib_b=abs(sin(time*1.51))*0.45 ; +per_pixel_1=zoom=zoom+rad*0.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - City Helix Lattice.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - City Helix Lattice.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - City Helix Lattice.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - City Helix Lattice.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,81 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.916999 +fDecay=1.000000 +fVideoEchoZoom=0.999609 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=1.028413 +fWaveSmoothing=0.450000 +fWaveParam=-0.600000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=0.073160 +fWarpScale=0.543568 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=0.650000 +wave_x=0.749900 +wave_y=0.719900 +ob_size=0.020000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.007000 +ib_size=0.010000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.006000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_b = if(below(treb, 2),1,0); +per_frame_2=decay = if(equal(frame % 20,0),.99,1); +per_frame_3=dx = if(equal(frame % 100,0),.001,0); +per_frame_4= +per_frame_5=rot = .05 *cos(time*.4); +per_frame_6=wave_x = (wave_x-.45)*sin(time*.4) + wave_x; +per_frame_7=wave_y = (wave_y-.45)*sin(time*.4) + wave_y; +per_frame_8=zoom = 1- cos(time*.4)*.05; +per_frame_9=//rot = -0.005; +per_frame_10=wave_x = .5+(wave_x-.5)*cos(time*5); +per_frame_11=wave_y = .5+(wave_y-.5)*sin(time*5); +per_frame_12=ib_a = cos(time*.4)*-.5+.5; +per_frame_13=ob_a = ib_a; +per_frame_14=ob_r = cos(time)*.5+.5; +per_frame_15=ob_b = .5; +per_frame_init_1=warp = 0; +per_frame_init_2=zoom = 1; +per_frame_init_3=rot = 0.01; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Directive Swagger (Spectral Inferno) (fix...) maybe.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Directive Swagger (Spectral Inferno) (fix...) maybe.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Directive Swagger (Spectral Inferno) (fix...) maybe.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Directive Swagger (Spectral Inferno) (fix...) maybe.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,157 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.210000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=9.088520 +fWaveScale=0.499500 +fWaveSmoothing=0.000000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.990000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.300000 +ob_g=0.000000 +ob_b=0.500000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=2.759997 +mv_dx=0.000000 +mv_dy=-0.620000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.400000 +per_frame_1=// Hello, +per_frame_2= +per_frame_3=// My beat detection algorithm had the aim of being able to detect and pickup a reliable beat throughout a song. This has creative possibilities of being able to PREDICT coming beats, and to have things lasting for (say) half a beat, etc. It still requires work, but I think I have made progress. +per_frame_4=// I emplore you to have a look over it and try to underdstand it. Help me out here - I think it could be reallly good. +per_frame_5= +per_frame_6=//Telek Sterling =:-) +per_frame_7=//Dilettante Extrodinaire +per_frame_8= +per_frame_9= +per_frame_10=//rt = realtime (for use with beat count) +per_frame_11=rt=time-start; +per_frame_12= +per_frame_13=//color cycling, yellow dynamic treble +per_frame_14=wave_g = max(0,min(1,.25*sin(time*10)+treb/2)); +per_frame_15=wave_x = cos(time*2.12)*.33+.5; +per_frame_16=wave_y = sin(time*1.5)*.13+.3; +per_frame_17= +per_frame_18=//initialisation bug patch +per_frame_19=beatrate = if(below(beatcount,2),.1,beatrate); +per_frame_20= +per_frame_21=//beat = if(longer that 10 sec,1,above(bass, decaying threshold)*(can't be less that .4 of last beat length) +per_frame_22=beat =if(above(rt-lastbeat,10),1, above(bass,1.6+.2*(lastbeat-rt)/beatrate)* above((rt-lastbeat)/beatrate,max(.4,.95-abs(accuracy*2)))); +per_frame_23= +per_frame_24=//Testing auto-beat trigger... exciting stuff.. +per_frame_25=beat = if(beat,1, if(below(abs(accuracy),0.1)*below((lastbeat-rt)/beatrate,-1),1,0)); +per_frame_26= +per_frame_27=//Comparison of last beat duration to current. Best value is 0. -1 and 5 are pretty bad. +per_frame_28=accuracy =if(beat,(rt-nextbeat)/beatrate,accuracy); +per_frame_29= +per_frame_30=beatcount = beatcount + beat; +per_frame_31= +per_frame_32=w_a = if(beat,1,w_a*0); +per_frame_33=wave_a = w_a; // I can't actually change this, can I..... Oh well, it's here now. +per_frame_34= +per_frame_35=//Preserve beat rate +per_frame_36=l_beatrate=if(beat,beatrate, l_beatrate); +per_frame_37=//Record new beatrate +per_frame_38=beatrate = if(beat,rt-lastbeat,beatrate); +per_frame_39= +per_frame_40=//Record most recent beat +per_frame_41=lastbeat=if(beat,rt,lastbeat); +per_frame_42=//Predict time of next beat +per_frame_43=nextbeat=if(beat,rt+beatrate,nextbeat); +per_frame_44= +per_frame_45= +per_frame_46= +per_frame_47= +per_frame_48=//Actual Display code: +per_frame_49= +per_frame_50=//Current direction of travel +per_frame_51=state = beat * (state+1)%4+(1-beat)*state; +per_frame_52= +per_frame_53=//acceleration of horizon point +per_frame_54=dddy = state%2-.5; +per_frame_55=dddx = above(state,1.5)-.5; +per_frame_56= +per_frame_57=//adjustment factors to play with +per_frame_58=ddx = dddx*.5; +per_frame_59=ddy = dddy*.5; +per_frame_60= +per_frame_61= +per_frame_62=q1 = (qq1*19+ddx)*.041; +per_frame_63=//preserve q variables +per_frame_64=qq1 = q1; +per_frame_65= +per_frame_66=q2 = (qq2*19+ddy)*.035; +per_frame_67=qq2 = q2; +per_frame_68= +per_frame_69=//Decay to Blue!! +per_frame_70=ob_a = 0.1*above(frame%10,6); +per_frame_71= +per_frame_72= +per_frame_73= +per_frame_74= +per_frame_75=//Well, what do we want to monitor?? +per_frame_76= +per_frame_77=//monitor = q1; +per_frame_78=//monitor = beat; +per_frame_79=//monitor = 1.6+.2*(lastbeat-rt)/beatrate; +per_frame_80=monitor = (rt-lastbeat)/beatrate; +per_frame_81=//monitor = accuracy; +per_frame_82=//monitor = max(.4,.95-abs(accuracy*2)); +per_frame_83=//monitor = wave_a; +per_frame_84=//monitor = wave_g; +per_frame_85=//qwer = accuracy + if(below(abs(accuracy),0.1)*above((lastbeat-rt)/beatrate,1),1,0)*1000; +per_frame_86=//monitor = qwer; +per_frame_87=//monitor = (lastbeat-rt)/beatrate; +per_pixel_1=dx = sin(.5-x)*.1+q1; +per_pixel_2=dy = sin(.5-y)*.1+q2; +per_frame_init_1=ddx = 0; +per_frame_init_2=ddy = 0; +per_frame_init_3=start = time; +per_frame_init_4=rt = 0; +per_frame_init_5=beatcount = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek EMPR - Scanner - Trust me I've got a Melways.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek EMPR - Scanner - Trust me I've got a Melways.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek EMPR - Scanner - Trust me I've got a Melways.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek EMPR - Scanner - Trust me I've got a Melways.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,165 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.886994 +fWaveSmoothing=0.630000 +fWaveParam=-0.512022 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.989618 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.080049 +wave_g=0.672309 +wave_b=0.063195 +wave_x=0.075045 +wave_y=0.423466 +ob_size=0.055000 +ob_r=0.773572 +ob_g=0.389471 +ob_b=0.393519 +ob_a=0.013639 +ib_size=0.003500 +ib_r=0.718305 +ib_g=0.386754 +ib_b=0.344725 +ib_a=0.018358 +nMotionVectorsX=38.399994 +nMotionVectorsY=24.000004 +mv_dx=-0.281976 +mv_dy=0.406558 +mv_l=5.000000 +mv_r=0.787740 +mv_g=0.415692 +mv_b=0.483679 +mv_a=0.111690 +per_frame_1=high_bass = above(bass_att,2); +per_frame_2=high_treb = above(treb, 2); +per_frame_3= +per_frame_4=wave_b = if(high_treb,0,1); +per_frame_5= +per_frame_6=ob_r = sin(time*.3)/2+.5; +per_frame_7=ob_g= sin(time*.34)/2+.5; +per_frame_8=ob_b = sin(time*.3714)/2+.5; +per_frame_9= +per_frame_10=boomnow = if(high_bass,time,boomnow); +per_frame_11=brightness = min(sqr(time-boomnow-.866)+.25,1); +per_frame_12=av_bass=if(high_bass,av_bass*.8+.2*bass,av_bass); +per_frame_13=count=count+above(bass,av_bass*1.2); +per_frame_14= +per_frame_15=ob_r = ob_r*brightness; +per_frame_16=ob_g = ob_g*brightness; +per_frame_17=ob_b = ob_b*brightness; +per_frame_18= +per_frame_19=w_dx = (above((w_y*bits)%2,0)*.01-.005)*sin(time); +per_frame_20=w_dy = (above((w_x*bits)%2,0)*.01-.005)*cos(time); +per_frame_21= +per_frame_22=w_x = w_x+w_dx; +per_frame_23=w_y = w_y +w_dy; +per_frame_24=q1 = bits; +per_frame_25= +per_frame_26= +per_frame_27=w_dx = if(above(abs(w_x-.5),.5),-w_dx,w_dx); +per_frame_28=w_dy = if(above(abs(w_y-.5),.5),-w_dy,w_dy); +per_frame_29=w_x = if(above(abs(w_x-.5),.5),(w_x-.5)*.95+.5,w_x); +per_frame_30=w_y = if(above(abs(w_y-.5),.5),(w_y-.5)*.95+.5,w_y); +per_frame_31= +per_frame_32=wave_x = w_x; +per_frame_33=wave_y = w_y; +per_frame_34= +per_frame_35=monitor = count; +per_frame_36= +per_frame_37= +per_frame_38=ob_a = max(wave_b - bass , wave_b * time); +per_frame_39=ib_r = max(treb * bass_att , wave_x * wave_b); +per_frame_40=//ob_g = max(time * wave_r , warp * wave_x); +per_frame_41=wave_g = min(wave_r + wave_x , time * wave_g); +per_frame_42=wave_b = if(equal(bass * wave_r , bass * treb_att) , treb * zoom , treb - time); +per_frame_43=//ob_b = max(max(bass_att + treb_att , mid_att * wave_g) , wave_r - wave_b); +per_frame_44=mv_l = 5 + min(bass + wave_g , zoom - frame); +per_frame_45=wave_b = max(if(equal(wave_b * wave_y , mid_att - wave_r) , time - frame , zoom * wave_r) , treb * frame); +per_frame_46=mv_r = if(equal(treb + mid , bass - mid_att) , wave_y + wave_y , wave_r * treb); +per_frame_47=mv_g = if(above(wave_r * treb_att , time - frame) , mid + warp , warp - treb); +per_frame_48=ib_G = wave_x + zoom; +per_frame_49=//ob_r = if(below(time * time , frame * bass) , bass_att * wave_g , bass * wave_g); +per_frame_50=wave_b=if(below(wave_b,0.0), 0.0, wave_b); +per_frame_51=wave_b=if(above(wave_b,1.0), 1.0, wave_b); +per_frame_52=wave_g=if(below(wave_g,0.0), 0.0, wave_g); +per_frame_53=wave_g=if(above(wave_g,1.0), 1.0, wave_g); +per_frame_54=//ob_r=if(below(ob_r,0.0), 0.0, ob_r); +per_frame_55=//ob_r=if(above(ob_r,1.0), 1.0, ob_r); +per_frame_56=//ob_g=if(below(ob_g,0.0), 0.0, ob_g); +per_frame_57=//ob_g=if(above(ob_g,1.0), 1.0, ob_g); +per_frame_58=//ob_b=if(below(ob_b,0.0), 0.0, ob_b); +per_frame_59=//ob_b=if(above(ob_b,1.0), 1.0, ob_b); +per_frame_60=//ob_a=if(below(ob_a,0.0), 0.0, ob_a); +per_frame_61=//ob_a=if(above(ob_a,1.0), 1.0, ob_a); +per_frame_62=mv_r=if(below(mv_r,0.0), 0.0, mv_r); +per_frame_63=mv_r=if(above(mv_r,1.0), 1.0, mv_r); +per_frame_64=mv_g=if(below(mv_g,0.0), 0.0, mv_g); +per_frame_65=mv_g=if(above(mv_g,1.0), 1.0, mv_g); +per_frame_66=mv_l=if(below(mv_l,0.0), 0.0, mv_l); +per_frame_67=mv_l=if(above(mv_l,5.0), 5.0, mv_l); +per_frame_68=wave_g=if(below(wave_g,0.0), 0.0, wave_g); +per_frame_69=wave_g=if(above(wave_g,1.0), 1.0, wave_g); +per_frame_70=wave_b=if(below(wave_b,0.0), 0.0, wave_b); +per_frame_71=wave_b=if(above(wave_b,1.0), 1.0, wave_b); +per_frame_72=ob_r=if(below(ob_r,0.0), 0.0, ob_r); +per_frame_73=ob_r=if(above(ob_r,1.0), 1.0, ob_r); +per_frame_74=ob_g=if(below(ob_g,0.0), 0.0, ob_g); +per_frame_75=ob_g=if(above(ob_g,1.0), 1.0, ob_g); +per_frame_76=ob_b=if(below(ob_b,0.0), 0.0, ob_b); +per_frame_77=ob_b=if(above(ob_b,1.0), 1.0, ob_b); +per_frame_78=wave_b=if(below(wave_b,0.0), 0.0, wave_b); +per_frame_79=wave_b=if(above(wave_b,1.0), 1.0, wave_b); +per_frame_80=wave_g=if(below(wave_g,0.0), 0.0, wave_g); +per_frame_81=wave_g=if(above(wave_g,1.0), 1.0, wave_g); +per_frame_82=ob_a=if(below(ob_a,0.0), 0.0, ob_a); +per_frame_83=ob_a=if(above(ob_a,1.0), 1.0, ob_a); +per_frame_84=ob_g=if(below(ob_g,0.0), 0.0, ob_g); +per_frame_85=ob_g=if(above(ob_g,1.0), 1.0, ob_g); +per_frame_86=ob_r=if(below(ob_r,0.0), 0.0, ob_r); +per_frame_87=ob_r=if(above(ob_r,1.0), 1.0, ob_r); +per_frame_88=ob_b=if(below(ob_b,0.0), 0.0, ob_b); +per_frame_89=ob_b=if(above(ob_b,1.0), 1.0, ob_b); +per_frame_90=ib_r=if(below(ib_r,0.0), 0.0, ib_r); +per_frame_91=ib_r=if(above(ib_r,1.0), 1.0, ib_r); +per_frame_92=ib_b=if(below(ib_b,0.0), 0.0, ib_b); +per_frame_93=ib_b=if(above(ib_b,1.0), 1.0, ib_b); +per_frame_94=ib_G=if(below(ib_G,0.0), 0.0, ib_G); +per_frame_95=ib_G=if(above(ib_G,1.0), 1.0, ib_G); +per_frame_96=mv_r=if(below(mv_r,0.0), 0.0, mv_r); +per_frame_97=mv_r=if(above(mv_r,1.0), 1.0, mv_r); +per_frame_98=mv_g=if(below(mv_g,0.0), 0.0, mv_g); +per_frame_99=mv_g=if(above(mv_g,1.0), 1.0, mv_g); +per_pixel_1=zoom = 1-.03*(1-rad); +per_pixel_2=rot = sin(time*.07845+sin(time*.1))*.04*(1+sin(time*.09784)*.5-rad); +per_frame_init_1=bits = 5; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Flicker.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Flicker.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Flicker.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Flicker.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,93 @@ +[preset00] +fRating=5.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.430333 +fWaveSmoothing=0.630000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.001000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.460000 +wave_y=0.005000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.060000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=58.752007 +nMotionVectorsY=14.400000 +mv_dx=0.006000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.100000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=bass_x = max(bass_x*.7+max(bass_att-.9,0)*.3,0); //decaying bass max +per_frame_2= +per_frame_3=wave_x = ((frame%3-1)*.5*bass_x+1)*wave_x; //spreads flame +per_frame_4= +per_frame_5=decay = 3000000+57.75; // Magic 'flame' decay +per_frame_6=//wave_mystery = sin(time*.2)*.05+1; +per_frame_7= +per_frame_8=ob_a = sqr(sqr(sin(time*1)*.25+.25)); // 'ad-lib decay' to black - no ugly artefacts +per_frame_9=// ^4 to get it up there quick -> min time with decay on. +per_frame_10= +per_frame_11=ob_a = ob_a*(1-bass_x); // just so we don't get rid of the wide impressive +per_frame_12=// flames so quickly +per_frame_13= +per_frame_14=monitor = ob_a; +per_frame_15= +per_frame_16=//Other decays to try: +per_frame_17=//300000 + 42.53, 90.63, 43.00 These are all fairly similar, but all are stable (equiv to decay 0.990 -> 1 in terms of speed of fade) +per_frame_18=//3000000 + 57.75 <<< =:-) +per_pixel_1=dy = (x+.08*sin(rand(100)))*2%2*-.01-.005; +per_pixel_2=dy = -.0025*((1-y)*10+rand(5)); //wobble, and faster at top - accelerating like real flames +per_pixel_3= +per_pixel_4=dx = rand(20)*.0001*sin(rand(2)-.5); //flicker +per_pixel_5=dx = dx*sqr(y); //dampens top +per_pixel_6=//dx = dx*(1-x/2); //slows sides +per_pixel_7=dx = dx*-.2*(rand(10)-5); //random damper +per_pixel_8=dx = dx -(x-.5)*.04*(.8-sqr(y)); //drift towards centre +per_pixel_9=dx = dx + cos(sqr(y-.5)*10-time*1.1)*sqr(1-(y))*.01; //add flutter at top +per_pixel_10= +per_pixel_11=// Telek - 26/09/2002 +per_frame_init_1=bass_x = 1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Flicker (@xis).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Flicker (@xis).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Flicker (@xis).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Flicker (@xis).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,128 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000001 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.387300 +fWaveSmoothing=0.630000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.001000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.460000 +wave_y=0.005000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.060000 +ib_size=0.500000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=1.000000 +ib_a=0.000000 +nMotionVectorsX=38.399994 +nMotionVectorsY=15.647999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=//virtual +per_frame_2=vnum_increment = 2/fps; +per_frame_3=vtarget = vtarget + if(above(bass*bass_att,4.5), if(below(vtarget,vnum+1),1,0),0); +per_frame_4=vnum = vnum + if(below(vnum,vtarget-vnum_increment*.5), vnum_increment,0); +per_frame_5=monitor = vnum; +per_frame_6= +per_frame_7=vang = vnum*3.14159265358979323*.25; +per_frame_8=q1=vang; +per_frame_9=q2 = vnum_increment; +per_frame_10=q3 = vnum; +per_frame_11=q4=vtarget; +per_frame_12=//vx = (x-.5)*cos(vang) - (y-.5)*sin(vang)+.5; +per_frame_13=//vy = (x-.5)*sin(vang) +(y-.5)*cos(vang)+.5; +per_frame_14= +per_frame_15=bass_x = max(bass_x*.7+max(bass_att-.9,0)*.3,0); //decaying bass max +per_frame_16=wave_vx = ((frame%3-1)*bass_x* above(vnum,vtarget-vnum_increment*.5) +1)*wave_x; //spreads flame +per_frame_17=wave_vy=wave_y; +per_frame_18= +per_frame_19=wave_x = -(wave_vx-.5)*cos(vang) + (wave_vy-.5)*sin(vang)+.5; +per_frame_20=wave_y = -(wave_vx-.5)*sin(vang) - (wave_vy-.5)*cos(vang)+.5; +per_frame_21=//end virtual +per_frame_22=wave_r = above(vnum,vtarget-vnum_increment*.5); +per_frame_23=//wave_g = below(bass*bass_att,3.5); +per_frame_24=decay = 3000000+57.75; // Magic 'flame' decay +per_frame_25=//wave_mystery = sin(time*.2)*.05+1; +per_frame_26= +per_frame_27=ob_a = max(sqr(sqr(sin(time*1)*.25+.25)),if(below(vnum,vtarget-.1),.2,0)); // 'ad-lib decay' to black - no ugly artefacts +per_frame_28=// ^4 to get it up there quick -> min time with decay on. +per_frame_29= +per_frame_30=ob_a = ob_a*(1-bass_x); // just so we don't get rid of the wide impressive +per_frame_31=// flames so quickly +per_frame_32= +per_frame_33=//ob_a=0; +per_frame_34=//monitor = ob_a; +per_frame_35= +per_frame_36=//Other decays to try: +per_frame_37=//300000 + 42.53, 90.63, 43.00 These are all fairly similar, but all are stable (equiv to decay 0.990 -> 1 in terms of speed of fade) +per_frame_38=//3000000 + 57.75 <<< =:-) +per_frame_39= +per_pixel_1=rot = below(q3, q4-q2*.5)*q2*.8*(1-0*(rad)); +per_pixel_2= +per_pixel_3=//virtual axes +per_pixel_4=vang=q1; +per_pixel_5=vx = (x-.5)*cos(vang) - (y-.5)*sin(vang)+.5; +per_pixel_6=vy = (x-.5)*sin(vang) +(y-.5)*cos(vang)+.5; +per_pixel_7=vy=1-vy; +per_pixel_8= +per_pixel_9=dvy = (vx+.08*sin(rand(100)))*2%2*-.01-.005; +per_pixel_10=dvy = -.0025*((1-vy)*10+rand(5)); //wobble, and faster at top - accelerating like real flames +per_pixel_11= +per_pixel_12=dvx = rand(20)*.0001*sin(rand(2)-.5); //flicker +per_pixel_13=dvx = dvx*sqr(vy); //dampens top +per_pixel_14=//dvx = dvx*(1-x/2); //slows sides +per_pixel_15=dvx = dvx*-.2*(rand(10)-5); //random damper +per_pixel_16=dvx = dvx -(vx-.5)*.04*(.8-sqr(vy)); //drift towards centre +per_pixel_17=dvx = dvx + cos(sqr(vy-.5)*10-time*1.1)*sqr(1-(vy))*.01; //add flutter at top +per_pixel_18= +per_pixel_19=//de-virtualise +per_pixel_20=dx = dvx*cos(vang) - dvy*sin(vang); +per_pixel_21=dy = -dvx*sin(vang) - dvy*cos(vang); +per_pixel_22= +per_pixel_23=// Telek - 09/11/2002 +per_frame_init_1=bass_x = 1; +per_frame_init_2=vtarget=4.000000; +per_frame_init_3=vnum = 4.000000; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Lost Star (Flash).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Lost Star (Flash).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Lost Star (Flash).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Lost Star (Flash).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,98 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.959000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=1.886994 +fWaveSmoothing=0.630000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.500000 +ob_a=0.000000 +ib_size=0.003500 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=38.399994 +nMotionVectorsY=24.000004 +mv_dx=0.000000 +mv_dy=0.000002 +mv_l=5.000000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=0.700000 +mv_a=0.000000 +per_frame_1=high_bass = above(bass_att,1.5); +per_frame_2=high_treb = above(treb, 2); +per_frame_3= +per_frame_4=wave_b = if(high_treb,0,1); +per_frame_5= +per_frame_6=mv_rr = if(high_bass,.5 ,mv_rr*.9); +per_frame_7=mv_r = mv_rr; +per_frame_8=mv_b = if(high_treb*high_bass,0,1); +per_frame_9= +per_frame_10=mv_g = if(high_treb*high_bass,0,.1*sin(time*.302)+.1); +per_frame_11=mv_a = if(above(bass_att,1.5),.6,mv_a); +per_frame_12=mv_x = bits *3; +per_frame_13=mv_y = mv_x *.8; +per_frame_14= +per_frame_15= +per_frame_16=w_dx = (above((w_y*bits)%2,0)*.01-.005)*sin(time); +per_frame_17=w_dy = (above((w_x*bits)%2,0)*.01-.005)*cos(time); +per_frame_18= +per_frame_19=w_x = w_x+w_dx; +per_frame_20=w_y = w_y +w_dy; +per_frame_21=monitor = bits; +per_frame_22=q1 = bits; +per_frame_23=w_x = if(above(abs(w_x-.5),.5),rand(10)/10,w_x); +per_frame_24=w_y = if(above(abs(w_y-.5),.5),rand(10)/10,w_y); +per_frame_25= +per_frame_26=wave_x = w_x; +per_frame_27=wave_y = w_y; +per_frame_28= +per_frame_29= +per_pixel_1=dx = above(y,0.9)*0.01; +per_pixel_2=dy = dx*.15*sin(x*10+time); +per_pixel_3=// q1 is number of bits +per_pixel_4=dx = (above((y*q1)%2,0)*.01-.005)*sin(time); +per_pixel_5=dy = (above((x*q1)%2,0)*.01-.005)*cos(time); +per_frame_init_1=bits = rand(7)+7; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Recirculate (Cool).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Recirculate (Cool).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Recirculate (Cool).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Recirculate (Cool).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,78 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.430333 +fWaveSmoothing=0.630000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.001000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.002000 +ob_r=1.000000 +ob_g=1.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.002500 +ib_r=0.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=1.000000 +nMotionVectorsX=1.537793 +nMotionVectorsY=2.090259 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.070441 +mv_r=0.024048 +mv_g=0.024048 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=//wave_r = (bass)-1.5; +per_frame_2=//wave_b = wave_r*treb*.5; +per_frame_3=wave_r = wave_r + 0.35*sin(4*time) + 0.15*sin(2.5*time); +per_frame_4=wave_g = wave_g + 0.35*sin(3.7*time) + 0.15*sin(2.11*time); +per_frame_5=wave_b = wave_b + 0.35*sin(3.84*time) + 0.15*sin(2.3*time); +per_frame_6= +per_frame_7=ob_r = wave_r; +per_frame_8=ob_g = wave_g; +per_frame_9=ob_b = wave_b; +per_frame_10= +per_frame_11= +per_frame_12=monitor = wave_r; +per_pixel_1=cx = .25+.5*above(x,.5); +per_pixel_2=cy = .5+sin(time)*(above(x,.5)-.5)*1.5; +per_pixel_3=rot =(.16*(above(x,.5)-.5)-sqr(y-.5)*.16)*sin(time*1.22+bass_att*.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Sine Wave.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Sine Wave.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Sine Wave.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Sine Wave.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,82 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.430333 +fWaveSmoothing=0.630000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.001000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.970000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=33.152000 +nMotionVectorsY=28.799997 +mv_dx=0.006000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.400000 +per_frame_1=mv_g=1-bass_att*.4; +per_frame_2=beat=if(above(bass*bass_att,4.5),1-beat,beat); +per_frame_3=q1=beat*2-1; +per_frame_4= +per_frame_5=amp =amp*.8+.2*(bass_att+mid_att+treb_att)*.3; +per_frame_6=q2 = min(amp,1); +per_frame_7=trebcap=trebcap*.7+.16*treb; +per_frame_8=q3=trebcap*2; +per_frame_9=monitor = q3; +per_pixel_1=wang = (3+q3)*x+time*1.7+bass*.1; +per_pixel_2=in = 0; +per_pixel_3=in = in + below(abs(x-.25),.05)*below(abs(y-.5),.25); +per_pixel_4=in = below(abs(y-(.5+.5*sin(wang)*q2)),.1); +per_pixel_5=in=bnot(bnot(in)); +per_pixel_6=dx = .02*in; +per_pixel_7=dy = .08*cos(wang)*q2*in; +per_pixel_8= +per_pixel_9=dx = dx+bnot(in)*.005*q1; +per_pixel_10=dy = dy+bnot(in)*cos(wang)*-.01*q1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix (bb4.5).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix (bb4.5).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix (bb4.5).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix (bb4.5).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=2 +fGammaAdj=1 +fDecay=0.9 +fVideoEchoZoom=1 +fVideoEchoAlpha=0 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001645 +fWaveScale=0.430333 +fWaveSmoothing=0.63 +fWaveParam=1 +fModWaveAlphaStart=2 +fModWaveAlphaEnd=2 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1 +fShader=0 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.001 +sx=1 +sy=1 +wave_r=0.65 +wave_g=0.65 +wave_b=0.65 +wave_x=0.5 +wave_y=0.5 +ob_size=0 +ob_r=0 +ob_g=0 +ob_b=0.3 +ob_a=1 +ib_size=0.1 +ib_r=1 +ib_g=0.25 +ib_b=0.25 +ib_a=1 +nMotionVectorsX=0 +nMotionVectorsY=48 +mv_dx=-0.941273 +mv_dy=0.426319 +mv_l=5 +mv_r=0.315997 +mv_g=0.078173 +mv_b=0.941976 +mv_a=0 +per_frame_1=bv = bass*.01+.99*bv; +per_frame_2=tt=tt+bass*.01; +per_frame_3=tt = if(above(bass*bass_att,4.5),rand(32768),tt); +per_frame_4=wave_x =-1; +per_frame_5=dx = .3*sin(tt*.12)+10*sin(tt*.015); +per_frame_6=dy = .39*sin(tt*.21)+20*sin(tt*.041); +per_frame_7=rot = 1*sin(tt*.15); +per_frame_8=cx = sin(tt*.16)*.5+.5; +per_frame_9=cy = cos(tt*.46)*.5+.5; +per_frame_10=ib_r = sin(tt*.51)*.5+.5; +per_frame_11=ib_g = sin(tt*.71)*.5+.5; +per_frame_12=ib_b = sin(tt*.81)*.5+.5; +per_frame_13=monitor = tt; +per_frame_14= +per_pixel_1=zoom = .8-.2*pow(1-rad,1); +per_frame_init_1=tt = rand(10000); +per_frame_init_2= diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix (Ethereal Drift).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix (Ethereal Drift).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix (Ethereal Drift).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix (Ethereal Drift).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,78 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.488853 +fVideoEchoAlpha=0.300000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=1 +bSolarize=1 +bInvert=0 +fWaveAlpha=0.001645 +fWaveScale=0.430333 +fWaveSmoothing=0.630000 +fWaveParam=1.000000 +fModWaveAlphaStart=2.000000 +fModWaveAlphaEnd=2.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.001000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.300000 +ob_a=1.000000 +ib_size=0.100000 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.040000 +nMotionVectorsX=38.399994 +nMotionVectorsY=24.000004 +mv_dx=-0.281976 +mv_dy=0.406558 +mv_l=5.000000 +mv_r=0.787740 +mv_g=0.415692 +mv_b=0.483679 +mv_a=0.000000 +per_frame_1=bv = bass*.3+.7*bv; +per_frame_2=tt=tt+bass*.01; +per_frame_3=c_inc = min(2*(pow(max(1,bv),3)-1),3); +per_frame_4=wave_x =-1; +per_frame_5=dx = .3*sin(tt*.12)+10*sin(tt*.015); +per_frame_6=dy = .39*sin(tt*.21)+20*sin(tt*.041); +per_frame_7=rot = 1*sin(tt*.151); +per_frame_8=cx = sin(tt*.16)*.5+.5; +per_frame_9=cy = cos(tt*.46)*.5+.5; +per_frame_10=ib_r = sin(tt*.51+c_inc)*.5+.5; +per_frame_11=ib_g = sin(tt*.71+c_inc)*.5+.5; +per_frame_12=ib_b = sin(tt*.81+c_inc)*.5+.5; +per_frame_13=monitor = c_inc; +per_pixel_1=zoom = .8-.1*pow(1-rad,2); +per_frame_init_1=tt = rand(10000); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Shift Matrix.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,77 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001645 +fWaveScale=0.430333 +fWaveSmoothing=0.630000 +fWaveParam=1.000000 +fModWaveAlphaStart=2.000000 +fModWaveAlphaEnd=2.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.001000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.300000 +ob_a=1.000000 +ib_size=0.100000 +ib_r=1.000000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=48.000000 +mv_dx=-0.941273 +mv_dy=0.426319 +mv_l=5.000000 +mv_r=0.315997 +mv_g=0.078173 +mv_b=0.941976 +mv_a=0.000000 +per_frame_1=bv = bass*.01+.99*bv; +per_frame_2=tt=tt+bass*.01; +per_frame_3=wave_x =-1; +per_frame_4=dx = .3*sin(tt*.12)+10*sin(tt*.015); +per_frame_5=dy = .39*sin(tt*.21)+20*sin(tt*.041); +per_frame_6=rot = 1*sin(tt*.15); +per_frame_7=cx = sin(tt*.16)*.5+.5; +per_frame_8=cy = cos(tt*.46)*.5+.5; +per_frame_9=ib_r = sin(tt*.51)*.5+.5; +per_frame_10=ib_g = sin(tt*.71)*.5+.5; +per_frame_11=ib_b = sin(tt*.81)*.5+.5; +per_frame_12=monitor = bv; +per_pixel_1=zoom = .8-.1*pow(1-rad,2); +per_frame_init_1=tt = rand(10000); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Thing (Spiderman Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Thing (Spiderman Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Thing (Spiderman Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Slow Thing (Spiderman Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,85 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.356739 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.209289 +fWaveScale=1.486134 +fWaveSmoothing=0.000000 +fWaveParam=-0.300000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=24.831774 +fWarpScale=0.419995 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=55.044964 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.330000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=33.152000 +nMotionVectorsY=28.799997 +mv_dx=0.006000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=0.200000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.600000 +per_frame_1=warp = 0; +per_frame_2= +per_frame_3=wave_b = if(below(treb, 1.8),1-.025*rand(10),0); +per_frame_4=wave_g = wave_g*sqr(.01*rand(100)); +per_frame_5=decay = .9999+.0001+0*if(equal(frame % 10,0),.95,1); +per_frame_6=monitor = wave_g; +per_frame_7=cx=.5+.3*cos(time*.21); +per_frame_8=cy=.5+.3*sin(time*.1); +per_frame_9=cx=cx+(bass-1.2)*.1; +per_frame_10=cy=cy+(treb_att-1)*.1; +per_frame_11=mv_r=bass_att*.4; +per_frame_12=wave_x = cx; +per_frame_13=wave_y=1-cy; +per_frame_14= +per_frame_15=q1=cx; +per_frame_16=q2=cy; +per_pixel_1=near=below(sqr(q1-x)+sqr(q2-y),.04); +per_pixel_2=notnear = 1- near; +per_pixel_3=sy=max(0.3,pow(bass_att,.2))*near + notnear; +per_pixel_4=sx=1/sy*near + notnear; +per_pixel_5=rot = .02*sin(x*5+time)*notnear-.03; +per_pixel_6=zoom = 1+ notnear*.001*(.5+sin(ang*5+time)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Spiral Tabletop (New and Improved!).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Spiral Tabletop (New and Improved!).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Spiral Tabletop (New and Improved!).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Spiral Tabletop (New and Improved!).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,118 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.684871 +fWaveSmoothing=0.900000 +fWaveParam=-0.280000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.001000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.016000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=33.152000 +nMotionVectorsY=28.799997 +mv_dx=0.006000 +mv_dy=0.000000 +mv_l=1.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=wave_x = pow(sin(time*.3011101),5)*.4+.5; +per_frame_2=wave_y = pow(cos(time*.3),3)*.4+.5; +per_frame_3=wave_r = sin(time*.874)*.5+.5; +per_frame_4=wave_g = sin(time*1.54)*.5+.5; +per_frame_5=wave_b = sin(time*1.1)*.5+.5; +per_frame_6= +per_frame_7=vol= (bass+treb+mid)*.3; +per_frame_8=vol_cap = (max(min(vol,1),.5)-.5)*2; +per_frame_9=wave_r = wave_r*vol_cap; +per_frame_10=wave_g = wave_g*vol_cap; +per_frame_11=wave_b = wave_b*vol_cap; +per_frame_12=ob_size =1; +per_frame_13=ob_r=wave_r*.0; +per_frame_14=ob_g=wave_g*.0; +per_frame_15=ob_b=wave_b*.0; +per_frame_16= +per_frame_17=q1=wave_x; +per_frame_18=q2=1-wave_y; +per_frame_19= +per_frame_20= +per_frame_21=beat=if(above(bass*bass_att,2.7),1,0); +per_frame_22=dm=dm-sign(dm)*bass*beat; +per_frame_23=vang=vang+.3*dm/fps; +per_frame_24=q3 = vang; +per_frame_25= +per_frame_26=monitor = vang; +per_frame_27=//mv_a = 1; decay = 0.81; +per_pixel_1=//cen_x = cos(time)*.2+.3; +per_pixel_2=//cen_y = sin(time)*.5+.5; +per_pixel_3=cen_x = q1; +per_pixel_4=cen_y = q2; +per_pixel_5=radxy = sin(time*.1)*.15+.3; +per_pixel_6= +per_pixel_7=dist_x = (x-cen_x)/(radxy*(sin(time*.2*0)*.3+cos((cen_x-x+ (cen_y-y))*10+time*2)*.3+1)); +per_pixel_8=dist_y = (y-cen_y)/(radxy*(sin(time*.2*0)*.3+sin((cen_x-x+ (cen_y-y))*10+time*2)*.3+1)); +per_pixel_9=in = below(abs(dist_x),1)*below(abs(dist_y),1); +per_pixel_10=//in = bnot(in); +per_pixel_11=out = bnot(in); +per_pixel_12=inx =(cen_x-q1)+.08*sign(dist_x)*sqr(1-abs(dist_x)); +per_pixel_13=iny =(cen_y-q2)+.08*sign(dist_y)*sqr(1-abs(dist_y)); +per_pixel_14= +per_pixel_15=//**********outside +per_pixel_16=vang=q3; //time*.1; +per_pixel_17=vx = (x-.5)*cos(vang) - (y-.5)*sin(vang)+.5; +per_pixel_18=vy = (x-.5)*sin(vang) +(y-.5)*cos(vang)+.5; +per_pixel_19= +per_pixel_20=dvx=.01*sin(time+vy*60*radxy); +per_pixel_21=dvy=.01*cos(time+vx*60*radxy); +per_pixel_22= +per_pixel_23=outx = dvx*cos(vang) - dvy*sin(vang); +per_pixel_24=outy = -dvx*sin(vang) - dvy*cos(vang); +per_pixel_25= +per_pixel_26=dx=in*inx+out*outx; +per_pixel_27=dy=in*iny+out*outy; +per_frame_init_1=dm = 1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Spokes (More Dynamic).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Spokes (More Dynamic).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Spokes (More Dynamic).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Spokes (More Dynamic).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,87 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.995000 +fVideoEchoZoom=1.228237 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.099998 +fWaveScale=0.120321 +fWaveSmoothing=0.630000 +fWaveParam=-0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=-0.100000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.300000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.200000 +ob_a=0.100000 +ib_size=0.260000 +ib_r=0.100000 +ib_g=0.100000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=7.552002 +nMotionVectorsY=14.400000 +mv_dx=0.006000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.100000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=ab15 = above(bass_att,1.5); +per_frame_2=ab10 = above(bass_att, 1.0) - ab15; +per_frame_3=ab05 = above(bass_att, 0.5) - ab15 - ab10; +per_frame_4=ab00 = 1 - ab15 - ab10 - ab05; +per_frame_5=wave_r = ab15*1 + ab10*(6*sin(time*.31)+ .5) + +per_frame_6= ab05*(.4*sin(time*.15)+.2) + ab00*.1; +per_frame_7=wave_g = ab15*.5 + ab10*(.2*sin(time*.316)+.1) + +per_frame_8= ab05*(.2*sin(time*.101)+.1) + ab00*1; +per_frame_9=wave_b = ab15*0 + ab10*(.4*sin(time*.407)+.7) + +per_frame_10= ab05*(.3*sin(time*.112)+.4) + ab00*.1; +per_frame_11=exb =exb*.92 + bass*.05; +per_frame_12=ext =ext *.92 + treb*.05; +per_frame_13=ob_t=.5; +per_frame_14=monitor = ext; +per_frame_15=w_y = w_y*.6+.2*max(min(1,bass_att*exb),.2); +per_frame_16=wave_y=w_y; +per_frame_17=wave_y = wave_y *(1- pow(progress,4)); +per_frame_18= +per_frame_19=wave_m = wave_m - fps*pow(1-wave_y, 3)*.01; +per_frame_20=wave_mystery = wave_m; +per_frame_21=//ob_a=above(bass_att,4); +per_frame_22= +per_pixel_1=rot = rot + (2-ang+time*1)*1.9+1.0*time; +per_frame_init_1=wave_m = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Target Practice (tracking retreat slide).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Target Practice (tracking retreat slide).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Target Practice (tracking retreat slide).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Telek - Target Practice (tracking retreat slide).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,89 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.010000 +fWaveSmoothing=0.900000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.001000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.006500 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=33.152000 +nMotionVectorsY=28.799997 +mv_dx=0.006000 +mv_dy=0.000000 +mv_l=2.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=xx = sin(time*.13)*.5+.5; +per_frame_2= +per_frame_3=beat = above(bass*bass_att,3.8)+bnot(xx); +per_frame_4=//xx = if(beat,0,xx); +per_frame_5=//x = if(beat,rand(10)*.1,x); +per_frame_6=//y = if(beat,rand(10)*.1,y); +per_frame_7=x = if(beat, max(min(rand( 2 )*.2 -.1+x, 1), 0), x); +per_frame_8=y = if(beat, max(min(rand( 2 )*.2 -.1+y, 1), 0), y); +per_frame_9=z = (z-beat*.15)*.8+.2; +per_frame_10=zoom = z; +per_frame_11= +per_frame_12=wave_x = x; +per_frame_13=wave_y = y; +per_frame_14=wave_mystery = xx*1.7-.5; +per_frame_15=ob_a = beat; +per_frame_16=wave_r= sin(time*.197)*.5+.5; +per_frame_17=wave_g=cos(time*.201)*.5+.5; +per_frame_18=wave_b=sin(time*.215)*.5+.5; +per_frame_19= +per_frame_20=xx=sin(xx*62.82)*.5+.5; +per_frame_21=wave_r = xx+(1-xx)*wave_r; +per_frame_22=wave_g = xx+(1-xx)*wave_g; +per_frame_23=wave_b = xx+(1-xx)*wave_b; +per_frame_24=//wave_b= wave_g; +per_frame_25=//rot = .015; +per_frame_26=monitor = zoom; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TobiasWolfBoi - Cataract.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TobiasWolfBoi - Cataract.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TobiasWolfBoi - Cataract.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TobiasWolfBoi - Cataract.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,53 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.500000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=1 +bSolarize=1 +bInvert=0 +fWaveAlpha=2.100000 +fWaveScale=71.663254 +fWaveSmoothing=0.000000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=100.000000 +fShader=0.000000 +zoom=1.567768 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.990000 +wave_g=0.990000 +wave_b=0.990000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.010*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.010*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.010*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_pixel_1=q2=0.05+0.01*sin(time*0.71); +per_pixel_2=zoom=zoom+q2*sin(rad*20+time*2.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TobiasWolfBoi - The Pit.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TobiasWolfBoi - The Pit.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TobiasWolfBoi - The Pit.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/TobiasWolfBoi - The Pit.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,52 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.500000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.386143 +fWaveSmoothing=0.000000 +fWaveParam=0.900000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.008151 +fWarpScale=3.151486 +fZoomExponent=0.100000 +fShader=0.000000 +zoom=0.801925 +rot=-0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=wave_r = wave_r + 0.500*( 0.60*sin(0.933*time) + 0.40*sin(1.045*time) ); +per_frame_2=wave_g = wave_g + 0.500*( 0.60*sin(0.900*time) + 0.40*sin(0.956*time) ); +per_frame_3=wave_b = wave_b + 0.500*( 0.60*sin(0.910*time) + 0.40*sin(0.920*time) ); +per_frame_4=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ); +per_frame_5=rot = rot + 0.040*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) ); +per_pixel_1=zoom=zoom+0.07*sin(rad*20+time*2.5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Tschoey - Music Flower.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Tschoey - Music Flower.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Tschoey - Music Flower.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Tschoey - Music Flower.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,67 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000158 +fWaveScale=3.001487 +fWaveSmoothing=0.000000 +fWaveParam=0.200000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=10.879999 +nMotionVectorsY=11.520000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=0.000000 +mv_g=1.000000 +mv_b=0.000000 +mv_a=0.000000 +per_frame_1=wave_r = 0.5 + 0.5 *sin(time*1.13); +per_frame_2=wave_g = 0.5 + 0.5 *sin(time*1.23); +per_frame_3=wave_b = 0.5 + 0.5 *sin(time*1.33); +per_pixel_1=zoom = 1 +0.05*(rad)* if(above(rad,0.7),1,-1); Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Tux.tga and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Tux.tga differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - All You Can Eat.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - All You Can Eat.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - All You Can Eat.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - All You Can Eat.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,96 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.981000 +fVideoEchoZoom=1.006440 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.868299 +fWaveScale=1.136001 +fWaveSmoothing=0.540000 +fWaveParam=0.200000 +fModWaveAlphaStart=0.950000 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.008151 +fShader=0.200000 +zoom=0.999800 +rot=0.000000 +cx=0.470000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +per_frame_1=warp=0; +per_frame_2=chaos=.9+.1*sin(pulse); +per_frame_3=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(5),entropy)); +per_frame_4=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_5=bass_changed=abs(bass_changed-equal(bass_thresh,2)); +per_frame_6=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_7=treb_changed=abs(treb_changed-equal(treb_thresh,2)); +per_frame_8=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_9=mid_changed=abs(mid_changed-equal(mid_thresh,2)); +per_frame_10=pulse=if(above(abs(pulse),20),-20,pulse+.1*chaos*bor(bor(bass_changed,treb_changed),mid_changed)+(mid+bass+treb)*.025); +per_frame_11=q3=sin(pulse); +per_frame_12=q2=(pulse/entropy)*.5*chaos; +per_frame_13=q4=sin(q2); +per_frame_14=q5=entropy; +per_frame_15=q1=(1+1*above(q4,0))*(1+2*above(q3,0))*(1+4*mid_changed*above(q3,0))*(1+6*above(pulse,0)); +per_frame_16=wave_r=if(treb_changed,.5+.5*q3,if(bass_changed,.5+.5*q4,1)); +per_frame_17=wave_g=.5+.2*bnot(q1%2)-.2*bnot(q1%3)+.2*bnot(q1%5)-.2*bnot(q1%7); +per_frame_18=wave_b=if(bnot(q1%6),.8+.2*q4,bass_changed*mid_changed); +per_frame_19=ob_r=ob_r+.2*q4+.3*bnot(q1%7)*q3; +per_frame_20=ob_b=ob_b-.1*bnot(q1%105)-.4*sin(q2*.8); +per_frame_21=ob_g=ob_g+.5*sin(pulse*.4*entropy); +per_frame_22=ob_a=.07+.05*q3; +per_frame_23=ob_size=.01*entropy*bnot(q1%6); +per_frame_24=ib_r=ib_r+.2*q1-.3*bnot(q1%3)*q4; +per_frame_25=ib_b=ib_b-.1*bnot(q1%42)-.4*sin(q2*.7); +per_frame_26=ib_g=ib_g+.5*sin(pulse*.5*entropy); +per_frame_27=ib_a=.07+.05*q3*q4; +per_frame_28=ib_size=.005+.005*q3; +per_frame_29=zoom_fade=if(above(q3,0),if(above(q4,0),zoom_fade-.0013,zoom_fade+.002),1+.04*q4); +per_frame_30=zoom=zoom_fade; +per_pixel_1=g1=sin(q2*.04*q5); +per_pixel_2=g2=sin(q2*.05*q5); +per_pixel_3=g3=sin(q2*.06*q5); +per_pixel_4=x_shift=pow(x,2)+x*g1*2+sqr(g1); +per_pixel_5=y_shift=pow(y,2)+y*g2*2+sqr(g2); +per_pixel_6=r_shift=pow(rad,2)+rad*g3*2+sqr(g3); +per_pixel_7=zoom=zoom -sin(x_shift*bnot(q1%10)+y_shift*bnot(q1%14)+r_shift*bnot(q1%21))*q3*(.1+.1*bnot(q1%30)+.1*bnot(q1%7)); +per_pixel_8=dx=dx+bnot(q1%35)*(rad-.5*g3)*g2-cos(y*1.68)*.1*bnot(q1%21); +per_pixel_9=dy=dy-cos(x*1.68)*bnot(q1%10); +per_pixel_10=rot=if(above(sin(q2*4.3),0),.3*above(abs(zoom-1),.05),.3*g3); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - A Matter Of Taste (Remix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - A Matter Of Taste (Remix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - A Matter Of Taste (Remix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - A Matter Of Taste (Remix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,84 @@ +[preset00] +fRating=2 +fGammaAdj=2 +fDecay=0.993 +fVideoEchoZoom=0.99662 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.264366 +fWaveScale=0.264076 +fWaveSmoothing=0.72 +fWaveParam=-0.4 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1 +fShader=0.3 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=1 +sx=1.06152 +sy=1.06152 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.01 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=0 +ib_size=0.01 +ib_r=0.25 +ib_g=0.25 +ib_b=0.25 +ib_a=0 +per_frame_1=warp=0; +per_frame_2=entropy=if(bnot(entropy),2,if(equal(pulse,-9.42),1+rand(3),entropy)); +per_frame_3=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_4=bass_changed=abs(bass_flop-equal(bass_thresh,2)); +per_frame_5=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_6=treb_changed=abs(treb_flop-equal(treb_thresh,2)); +per_frame_7=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_8=mid_changed=abs(mid_flop-equal(mid_thresh,2)); +per_frame_9=bass_residual = bass_changed*sin(pulse*bass_thresh*.2*entropy) + bnot(bass_changed)*bass_residual; +per_frame_10=treb_residual = treb_changed*sin(pulse*treb_thresh*.2*entropy) + bnot(treb_changed)*treb_residual; +per_frame_11=mid_residual = mid_changed*sin(pulse*mid_thresh*.2*entropy) + bnot(mid_changed)*mid_residual; +per_frame_12=pulse=if(above(abs(pulse),9.42),-9.42,pulse+.1*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed)+(mid+bass+treb)*entropy*.01); +per_frame_13=q1=mid_residual; +per_frame_14=q2=bass_residual; +per_frame_15=q3=treb_residual; +per_frame_16=q4=sin(pulse); +per_frame_17=q5=cos(pulse); +per_frame_18=wave_mystery=-.2+.2*q4; +per_frame_19=wave_r=wave_r+.5*bass_residual; +per_frame_20=wave_r=wave_g+.5*mid_residual; +per_frame_21=wave_r=wave_b+.5*treb_residual; +per_frame_22=zoom=zoom-.0035*q1; +per_frame_23=decay=decay+.003*sin(pulse); +per_pixel_1=anti_rad=(1-rad); +per_pixel_2=dx=if(below(sin(rad*10*q5),abs(q5)),.02*q1,.025*q2); +per_pixel_3=dy=dy-cos(anti_rad*10*q3-rad*10*q5+rad*10*q4)*.05; +per_pixel_4=zoom=zoom+(dy-1)*(dx-1)*q1*.07; +per_pixel_5=rot=rot+atan(anti_rad*3.14*q3)*abs(zoom-1.2)*above(q2,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Bad Karma Oddnezz Style.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Bad Karma Oddnezz Style.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Bad Karma Oddnezz Style.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Bad Karma Oddnezz Style.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,101 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.993000 +fVideoEchoZoom=0.999900 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.750000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=100.000000 +fShader=0.300000 +zoom=1.486000 +rot=1.000000 +cx=2.000000 +cy=-1.000000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=1.000000 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.1+.1*sin(pulse); +per_frame_6=bass_thresh =if(above(bass_att,bass_thresh),3,bass_thresh-chaos); +per_frame_7=bass_flop=abs(bass_flop-equal(bass_thresh,3)); +per_frame_8=treb_thresh=if(above(treb_att,treb_thresh),3,treb_thresh-chaos); +per_frame_9=treb_flop=abs(treb_flop-equal(treb_thresh,3)); +per_frame_10=mid_thresh=if(above(mid_att,mid_thresh),3,mid_thresh-chaos); +per_frame_11=mid_flop=abs(mid_flop-equal(mid_thresh,3)); +per_frame_12=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_13=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_14=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_15=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_16=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_17=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_18=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.0071); +per_frame_19=entropy=if(equal(pulse,-3.14),bass_flop+mid_flop+treb_flop+rand(5),entropy); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse*(.5+.1*entropy)); +per_frame_25=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_26=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_27=q8=entropy; +per_frame_28=ib_r=.5+.5*cos(time*1.2+q1*.1); +per_frame_29=ib_b=.5+.5*cos(time*2.811+q2*.1); +per_frame_30=ib_g=.5+.5*cos(time*1.666+q3*.1); +per_frame_31=rot=0; +per_pixel_1=grid=pow((sin(ang*10*q1)+x*y*q4)*2,1+q8*q7%11)%2; +per_pixel_2=snee=(.3+.2*q6)*q3; +per_pixel_3=rot=bnot(grid)*above(x,.5+snee)*above(y,.5-snee) - +per_pixel_4=ang*cos(5+(3.14*q6))*below(x,.5+snee)*below(y,.5-snee)*.05; +per_pixel_5=sx=sx+sin((q8%4+q7%5)*x*3.14)*bnot(rot)*.004; +per_pixel_6=sy=sy+sin((q8%5+q7%4)*y*3.14)*bnot(rot)*.004; +per_pixel_7=zoom=zoom+.1*cos(rad*q8*q7); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 1.0.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 1.0.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 1.0.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 1.0.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,91 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.981000 +fVideoEchoZoom=1.006440 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.868299 +fWaveScale=2.781641 +fWaveSmoothing=0.540000 +fWaveParam=0.200000 +fModWaveAlphaStart=0.950000 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.008151 +fShader=0.200000 +zoom=0.999800 +rot=0.000000 +cx=0.470000 +cy=0.500000 +dx=0.005000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +per_frame_1=warp=0; +per_frame_2=chaos=.9+.1*sin(pulse-beat); +per_frame_3=entropy=if(bnot(entropy),2,if(equal(pulse,-20)*above(beat,0),1+rand(5),entropy)); +per_frame_4=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_5=bass_changed=abs(bass_changed-equal(bass_thresh,2)); +per_frame_6=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_7=treb_changed=abs(treb_changed-equal(treb_thresh,2)); +per_frame_8=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_9=mid_changed=abs(mid_changed-equal(mid_thresh,2)); +per_frame_10=pulse=if(above(abs(pulse),20),-20,pulse+(mid+bass+treb)*.025); +per_frame_11=beat=if(above(abs(beat),20),-20,beat+.1*chaos*bor(bor(bass_changed,treb_changed),mid_changed)); +per_frame_12=q3=sin(pulse); +per_frame_13=q2=sin(pulse+beat); +per_frame_14=q4=sin(beat); +per_frame_15=q5=entropy; +per_frame_16=q1=(1+1*above(q2,0))*(1+2*above(q3,0))*(1+4*mid_changed*above(q3,0))*(1+6*above(q4,0))*(1+10*bass_changed*above(q4,0))*(1+12*above(q5,3))*(1+16*treb_changed*above(q2,0)); +per_frame_17=wave_r=.5+.2*bnot(q1%2)-.2*bnot(q1%3)+.3*q3*bnot(q1%13); +per_frame_18=wave_g=.5+.2*bnot(q1%5)-.2*bnot(q1%13)+.3*q4*bnot(q1%7); +per_frame_19=wave_b=if(bnot(q1%6),.8+.2*q4,.5+.5*q2); +per_frame_20=ob_r=ob_r+.2*q2+.3*bnot(q1%13)*q3; +per_frame_21=ob_b=ob_b-.1*bnot(q1%105)-.4*q2; +per_frame_22=ob_g=ob_g+.5*sin(pulse*.4*entropy); +per_frame_23=ob_a=.07+.05*q3; +per_frame_24=ob_size=.01*entropy*bnot(q1%6); +per_frame_25=ib_r=ib_r+.2*q1-.3*bnot(q1%3)*q4; +per_frame_26=ib_b=ib_b-.2*bnot(q1%17)-.3*q2+.2*bnot(q1%11); +per_frame_27=ib_g=ib_g+.5*sin(pulse*.35*entropy); +per_frame_28=ib_a=.07+.05*q3*q4; +per_frame_29=ib_size=.005+.005*q3; +per_frame_30=zoom_fade=if(bnot(q1%2),zoom_fade-(zoom_fade-.97)/2,zoom_fade-bnot(q1%5)*.02*q4+bnot(q1%2)*.02*q3-bnot(q1%11)*.04*q2); +per_frame_31=zoom=zoom_fade; +per_frame_32=rot_fade=if(bnot(q1%7),rot_fade-(rot_fade-.1*q3)/2-.03*bnot(q1%13),rot_fade-.02*bnot(q1%11)+.02*bnot(q1%3)+.03*bnot(q1%35)); +per_frame_33=rot=rot_fade; +per_frame_34=cx=cx+.1*bnot(q1%39)+.07*bnot(q1%13)*q3-.2*bnot(q1%55)*q4; +per_frame_35=wave_x=wave_x+.1*q3+.2*q4*bnot(q1%2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 10.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 10.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 10.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 10.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,91 @@ +[preset00] +fRating=3 +fGammaAdj=2 +fDecay=0.981 +fVideoEchoZoom=1.00644 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.868299 +fWaveScale=2.781641 +fWaveSmoothing=0.54 +fWaveParam=0.2 +fModWaveAlphaStart=0.95 +fModWaveAlphaEnd=0.75 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1.008151 +fShader=0.2 +zoom=0.9998 +rot=0 +cx=0.47 +cy=0.5 +dx=0.005 +dy=0 +warp=0.01 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0 +ob_r=0.5 +ob_g=0.5 +ob_b=0.5 +ob_a=0 +ib_size=0 +ib_r=0.5 +ib_g=0.5 +ib_b=0.5 +ib_a=0 +per_frame_1=warp=0; +per_frame_2=chaos=.9+.1*sin(pulse-beat); +per_frame_3=entropy=if(bnot(entropy),2,if(equal(pulse,-20)*above(beat,0),1+rand(5),entropy)); +per_frame_4=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_5=bass_changed=abs(bass_changed-equal(bass_thresh,2)); +per_frame_6=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_7=treb_changed=abs(treb_changed-equal(treb_thresh,2)); +per_frame_8=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_9=mid_changed=abs(mid_changed-equal(mid_thresh,2)); +per_frame_10=pulse=if(above(abs(pulse),20),-20,pulse+(mid+bass+treb)*.025); +per_frame_11=beat=if(above(abs(beat),20),-20,beat+.1*chaos*bor(bor(bass_changed,treb_changed),mid_changed)); +per_frame_12=q3=sin(pulse); +per_frame_13=q2=sin(pulse+beat); +per_frame_14=q4=sin(beat); +per_frame_15=q5=entropy; +per_frame_16=q1=(1+1*above(q2,0))*(1+2*above(q3,0))*(1+4*mid_changed*above(q3,0))*(1+6*above(q4,0))*(1+10*bass_changed*above(q4,0))*(1+12*above(q5,3))*(1+16*treb_changed*above(q2,0)); +per_frame_17=wave_r=.5+.2*bnot(q1%2)-.2*bnot(q1%3)+.3*q3*bnot(q1%13); +per_frame_18=wave_g=.5+.2*bnot(q1%5)-.2*bnot(q1%13)+.3*q4*bnot(q1%7); +per_frame_19=wave_b=if(bnot(q1%6),.8+.2*q4,.5+.5*q2); +per_frame_20=ob_r=ob_r+.2*q2+.3*bnot(q1%13)*q3; +per_frame_21=ob_b=ob_b-.1*bnot(q1%105)-.4*q2; +per_frame_22=ob_g=ob_g+.5*sin(pulse*.4*entropy); +per_frame_23=ob_a=.07+.05*q3; +per_frame_24=ob_size=.01*entropy*bnot(q1%6); +per_frame_25=ib_r=ib_r+.2*q1-.3*bnot(q1%3)*q4; +per_frame_26=ib_b=ib_b-.2*bnot(q1%17)-.3*q2+.2*bnot(q1%11); +per_frame_27=ib_g=ib_g+.5*sin(pulse*.35*entropy); +per_frame_28=ib_a=.07+.05*q3*q4; +per_frame_29=ib_size=.005+.005*q3; +per_frame_30=zoom_fade=if(bnot(q1%2),zoom_fade-(zoom_fade-.97)/2,zoom_fade-bnot(q1%5)*.02*q4+bnot(q1%2)*.02*q3-bnot(q1%11)*.04*q2); +per_frame_31=zoom=zoom_fade; +per_frame_32=rot_fade=if(bnot(q1%7),rot_fade-(rot_fade-.1*q3)/2-.03*bnot(q1%13),rot_fade-.02*bnot(q1%11)+.02*bnot(q1%3)+.03*bnot(q1%35)); +per_frame_33=rot=rot_fade; +per_frame_34=cx=cx+.1*bnot(q1%39)+.07*bnot(q1%13)*q3-.2*bnot(q1%55)*q4; +per_frame_35=wave_x=wave_x+.1*q3+.2*q4*bnot(q1%2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.0.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.0.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.0.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.0.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,111 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.818016 +fWaveScale=0.653093 +fWaveSmoothing=0.090000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995700 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.008200 +rot=-0.760000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.424100 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=old_bass_flop=bass_flop; +per_frame_2=old_treb_flop=treb_flop; +per_frame_3=old_mid_flop=mid_flop; +per_frame_4=chaos=.9+.1*sin(pulse); +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_6=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_7=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_8=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_9=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_10=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_11=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_12=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_13=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_14=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_15=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_16=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_17=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.0035); +per_frame_18=entropy=if(bass_changed*mid_changed*treb_changed,(1+bass_flop+treb_flop+mid_flop)*(1+rand(3)),entropy); +per_frame_19=q1=mid_residual; +per_frame_20=q2=bass_residual; +per_frame_21=q3=treb_residual; +per_frame_22=q4=sin(pulse); +per_frame_23=q5=cos(pulse*(.5+.1*entropy)); +per_frame_24=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_25=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_26=q8=entropy; +per_frame_27=wave_r=wave_r+wave_r*q1; +per_frame_28=wave_b=wave_b+wave_b*q2; +per_frame_29=wave_g=wave_g+wave_g*q3; +per_frame_30=ob_r=ob_r+ob_r*sin(q1+q2*2.14); +per_frame_31=ob_bob_b+ob_b*sin(q2+q3*2.14); +per_frame_32=ob_g=ob_g+ob_g*sin(q3+q1*2.14); +per_frame_33=ib_r=ib_r+ib_r*cos(q5+q1*2.14); +per_frame_34=ib_b=ib_b+ib_*cos(q5+q2*2.14); +per_frame_35=ib_g=ib_g+ib_g*cos(q5+q3*2.14); +per_frame_36=ob_a=.25+.25*sin(q2+q3*2.14); +per_frame_37=ib_a=.25+.25*sin(q2*2.14+q3); +per_frame_38=ob_size=.1+.1*sin(q3*3+q1); +per_frame_39=ib_size=.1+.1*sin(q1*3+q3); +per_frame_40=zoom=zoom+.1*q4; +per_frame_41=rot=.2*q5; +per_frame_42=wave_mystery=.5*q6; +per_frame_43=cx=cx+.5*q1; +per_frame_44=cy=cy+.5*q2; +per_frame_45=warp=bnot(q7%2); +per_frame_46=echo_zoom=1+.5*q3; +per_frame_47=echo_orientation=q8%4; +per_frame_48=wave_mode=q8%7; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.1.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.1.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.1.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.1.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,111 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.818016 +fWaveScale=0.653093 +fWaveSmoothing=0.090000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995700 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.008200 +rot=-0.760000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.424100 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=old_bass_flop=bass_flop; +per_frame_2=old_treb_flop=treb_flop; +per_frame_3=old_mid_flop=mid_flop; +per_frame_4=chaos=.9+.1*sin(pulse); +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_6=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_7=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_8=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_9=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_10=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_11=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_12=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_13=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_14=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_15=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_16=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_17=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.0035); +per_frame_18=entropy=if(bass_changed*mid_changed*treb_changed,(1+bass_flop+treb_flop+mid_flop)*(1+rand(3)),entropy); +per_frame_19=q1=mid_residual; +per_frame_20=q2=bass_residual; +per_frame_21=q3=treb_residual; +per_frame_22=q4=sin(pulse); +per_frame_23=q5=cos(pulse*(.5+.1*entropy)); +per_frame_24=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_25=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_26=q8=entropy; +per_frame_27=wave_r=wave_r+wave_r*q1; +per_frame_28=wave_b=wave_b+wave_b*q2; +per_frame_29=wave_g=wave_g+wave_g*q3; +per_frame_30=ob_r=ob_r+ob_r*sin(q1+q2*2.14); +per_frame_31=ob_bob_b+ob_b*sin(q2+q3*2.14); +per_frame_32=ob_g=ob_g+ob_g*sin(q3+q1*2.14); +per_frame_33=ib_r=ib_r+ib_r*cos(q5+q1*2.14); +per_frame_34=ib_b=ib_b+ib_*cos(q5+q2*2.14); +per_frame_35=ib_g=ib_g+ib_g*cos(q5+q3*2.14); +per_frame_36=ob_a=.25+.25*sin(q2+q3*2.14); +per_frame_37=ib_a=.25+.25*sin(q2*2.14+q3); +per_frame_38=ob_size=.1+.1*sin(q3*3+q1); +per_frame_39=ib_size=.1+.1*sin(q1*3+q3); +per_frame_40=wave_mystery=.5*q6; +per_frame_41=cx=cx+.5*q1; +per_frame_42=cy=cy+.5*q2; +per_frame_43=warp=bnot(q7%2); +per_frame_44=echo_zoom=1+.5*q3; +per_frame_45=echo_orientation=q8%4; +per_frame_46=wave_mode=q8%7; +per_pixel_1=zoom=zoom+.3*sin(y*3.14*q4); +per_pixel_2=rot=rot*cos(x*3.14*q5); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.2.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,109 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.996000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=1 +bInvert=0 +fWaveAlpha=0.818016 +fWaveScale=0.653093 +fWaveSmoothing=0.090000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995700 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.008200 +rot=-0.760000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.424100 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=old_bass_flop=bass_flop; +per_frame_2=old_treb_flop=treb_flop; +per_frame_3=old_mid_flop=mid_flop; +per_frame_4=chaos=.9+.1*sin(pulse); +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_6=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_7=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_8=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_9=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_10=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_11=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_12=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_13=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_14=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_15=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_16=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_17=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.0035); +per_frame_18=entropy=if(bass_changed*mid_changed*treb_changed,(1+bass_flop+treb_flop+mid_flop)*(1+rand(3)),entropy); +per_frame_19=q1=mid_residual; +per_frame_20=q2=bass_residual; +per_frame_21=q3=treb_residual; +per_frame_22=q4=sin(pulse); +per_frame_23=q5=cos(pulse*(.5+.1*entropy)); +per_frame_24=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_25=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_26=q8=entropy; +per_frame_27=wave_r=wave_r+wave_r*q1; +per_frame_28=wave_b=wave_b+wave_b*q2; +per_frame_29=wave_g=wave_g+wave_g*q3; +per_frame_30=ob_r=ob_r+ob_r*sin(q1+q2*2.14); +per_frame_31=ob_bob_b+ob_b*sin(q2+q3*2.14); +per_frame_32=ob_g=ob_g+ob_g*sin(q3+q1*2.14); +per_frame_33=ib_r=ib_r+ib_r*cos(q5+q1*2.14); +per_frame_34=ib_b=ib_b+ib_*cos(q5+q2*2.14); +per_frame_35=ib_g=ib_g+ib_g*cos(q5+q3*2.14); +per_frame_36=ob_a=.25+.25*sin(q2+q3*2.14); +per_frame_37=ib_a=.25+.25*sin(q2*2.14+q3); +per_frame_38=ob_size=.1+.1*sin(q3*3+q1); +per_frame_39=ib_size=.1+.1*sin(q1*3+q3); +per_frame_40=wave_mystery=.5*q6; +per_frame_41=warp=0; +per_frame_42=wave_mode=q8%7; +per_pixel_1=radix=if(above(q3,0),min(x,y),max(x,y)); +per_pixel_2=radix=if(above(q2,0),min(radix,rad),max(radix,rad)); +per_pixel_3=rot=if(above(q6,0),rad*.2*q5,.2*q5*sin(rad*2.133*q7)); +per_pixel_4=zoom=if(above(q2,0),zoom,if(above(q3,0),1+.07*sin(q4*.2*radix),1+.07*cos(radix*10*q4))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo 2.3.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,114 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.993000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.818016 +fWaveScale=0.653093 +fWaveSmoothing=0.090000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995700 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.018281 +rot=-0.760000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.424100 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=old_bass_flop=bass_flop; +per_frame_2=old_treb_flop=treb_flop; +per_frame_3=old_mid_flop=mid_flop; +per_frame_4=chaos=.9+.1*sin(pulse); +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_6=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_7=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_8=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_9=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_10=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_11=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_12=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_13=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_14=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_15=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_16=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_17=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.0035); +per_frame_18=entropy=if(bass_changed*mid_changed*treb_changed,(1+bass_flop+treb_flop+mid_flop)*(1+rand(3)),entropy); +per_frame_19=q1=mid_residual; +per_frame_20=q2=bass_residual; +per_frame_21=q3=treb_residual; +per_frame_22=q4=sin(pulse); +per_frame_23=q5=cos(pulse*(.5+.1*entropy)); +per_frame_24=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_25=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_26=q8=entropy; +per_frame_27=wave_r=wave_r+wave_r*q1; +per_frame_28=wave_b=wave_b+wave_b*q2; +per_frame_29=wave_g=wave_g+wave_g*q3; +per_frame_30=ob_r=ob_r+ob_r*sin(q1+q2*2.14); +per_frame_31=ob_bob_b+ob_b*sin(q2+q3*2.14); +per_frame_32=ob_g=ob_g+ob_g*sin(q3+q1*2.14); +per_frame_33=ib_r=ib_r+ib_r*cos(q5+q1*2.14); +per_frame_34=ib_b=ib_b+ib_*cos(q5+q2*2.14); +per_frame_35=ib_g=ib_g+ib_g*cos(q5+q3*2.14); +per_frame_36=ob_a=.25+.25*sin(q2+q3*2.14); +per_frame_37=ib_a=.25+.25*sin(q2*2.14+q3); +per_frame_38=ob_size=.1+.1*sin(q3*3+q1); +per_frame_39=ib_size=.1+.1*sin(q1*3+q3); +per_frame_40=wave_mystery=.5*q6; +per_frame_41=warp=0; +per_frame_42=wave_mode=q8%7; +per_frame_43=decay=.98+q8*.001; +per_frame_44=monitor=q8; +per_pixel_1=c1=x*q1+sin(ang)*q4; +per_pixel_2=c2=y*q2+sin(ang)*q6; +per_pixel_3=c3=rad*q3; +per_pixel_4=radix=if(above(q5,0),min(c1,c2),max(c1,c2)); +per_pixel_5=radix=if(above(q6,0),min(radix,c3),max(radix,c3)); +per_pixel_6=rot=if(above(q6,0),rad*.2*q5,.2*q5*sin(rad*2.133*q7)); +per_pixel_7=zoom=if(below(abs(q1),.5),zoom,if(below(abs(q2),.5),1+.07*sin(q4*3.14*radix),1+.07*sin(radix*q8*q4*1.618))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo (Demonology Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo (Demonology Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo (Demonology Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Beat Demo (Demonology Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,114 @@ +[preset00] +fRating=2 +fGammaAdj=1 +fDecay=0.996 +fVideoEchoZoom=1 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.818 +fWaveScale=0.374038 +fWaveSmoothing=0.81 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=5.9957 +fWarpScale=1.331 +fZoomExponent=1 +fShader=0 +zoom=0.968827 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.4241 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0 +ob_r=0.5 +ob_g=0.5 +ob_b=0.5 +ob_a=1 +ib_size=0 +ib_r=0.5 +ib_g=0.5 +ib_b=0.5 +ib_a=0 +nMotionVectorsX=0 +nMotionVectorsY=0 +mv_dx=0 +mv_dy=0 +mv_l=0.85 +mv_r=0.4999 +mv_g=0.4999 +mv_b=0.4999 +mv_a=1 +per_frame_1=old_bass_flop=bass_flop; +per_frame_2=old_treb_flop=treb_flop; +per_frame_3=old_mid_flop=mid_flop; +per_frame_4=chaos=.5+.5*sin(pulse); +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_6=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_7=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_8=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_9=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_10=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_11=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_12=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_13=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_14=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_15=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_16=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_17=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.005); +per_frame_18=entropy=if(bass_changed*mid_changed*treb_changed,(1+bass_flop+treb_flop+mid_flop)*(1+rand(3)),entropy); +per_frame_19=q1=mid_residual; +per_frame_20=q2=bass_residual; +per_frame_21=q3=treb_residual; +per_frame_22=q4=sin(pulse); +per_frame_23=q5=cos(pulse*(.5+.1*entropy)); +per_frame_24=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_25=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_26=q8=entropy; +per_frame_27=wave_r=.5+.5*q1; +per_frame_28=wave_b=.5+.5*q2; +per_frame_29=wave_g=.5+.5*q3; +per_frame_30=ob_r=ob_r+ob_r*sin(q1+time*2.18); +per_frame_31=ob_bob_b+ob_b*sin(q2+time*1.73); +per_frame_32=ob_g=ob_g+ob_g*sin(q3+time*2.09); +per_frame_33=ib_r=ib_r+ib_r*cos(q4+q1*2.14); +per_frame_34=ib_b=ib_b+ib_*cos(q4+q2*2.14); +per_frame_35=ib_g=ib_g+ib_g*cos(q4+q3*2.14); +per_frame_36=ob_a=.25+.25*sin(q2+q3*2.14); +per_frame_37=ib_a=.5+.5*sin(q2*2.14+q3); +per_frame_38=ob_size=.025+.025*sin(q3*3+q1); +per_frame_39=ib_size=.025+.025*sin(q1*3+q3); +per_frame_40=warp=0; +per_frame_41=wave_mystery=wave_mystery+.1*sin(time*2.18+q6); +per_frame_42=wave_x=wave_x+.2*sin(time*.811+q1)+.01*(frame%5)*sign(q3); +per_frame_43=wave_y=wave_y+.2*sin(time*2.3+q2)+.01*q7; +per_frame_44=decay=.996+.004*q3; +per_pixel_1=snee=bnot(above(sin(ang)-x,.5)*above(q2,0)+above(y-cos(ang),.5)*above(q1,0)); +per_pixel_2=snur=bnot(below(x,.5)*above(q3,0)+below(y,.5)*below(q7,4)); +per_pixel_3=grid=sin(sigmoid(sin(y*6.28*q2),sin(x*6.28*q1))*(10+q7)); +per_pixel_4=rot=snee*if(above(grid,0),snur,bnot(snur)); +per_pixel_5=zoom=zoom+.05*sin(rad*(q7*2+q5)+q1)*bnot(snee)*if(snur,-1,q3); +per_pixel_6=sx=sx+.1*bor(bnot(snee),bnot(snur))*cos(y*3.14*q4); +per_pixel_7=sy=sy+.1*bor(bnot(snee),snur)*cos(x*3.14*q6); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Cartoon Factory.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Cartoon Factory.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Cartoon Factory.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Cartoon Factory.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,116 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=0.999600 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.014853 +fWaveScale=0.098608 +fWaveSmoothing=0.810000 +fWaveParam=-0.400000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.502500 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.100000 +wave_y=0.900000 +ob_size=0.010000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(equal(pulse,-20),1+bass_flop+treb_flop+mid_flop+rand(2),entropy); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid_thresh+treb_thresh)*.032); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse/2+q1); +per_frame_25=q6=sin(q1*3.14+q2*3.14+q3*3.14); +per_frame_26=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_27=q8=entropy; +per_frame_28=wave_r=.5+.5*sin(q1+abs(q4*2.14)); +per_frame_29=wave_b=.5+.5*sin(q2+abs(q5*2.14)); +per_frame_30=wave_g=.5+.5*sin(q3+abs(q6*2.14)); +per_frame_31=ob_r=ob_r+ob_r*sin(q1+q2*2.14); +per_frame_32=ob_b=ob_b+ob_b*sin(q2+q3*2.14); +per_frame_33=ob_g=ob_g+ob_g*sin(q3+q1*2.14); +per_frame_34=ib_r=ib_r+ib_r*cos(q5+q1*2.14); +per_frame_35=ib_b=ib_b+ib_*cos(q5+q2*2.14); +per_frame_36=ib_g=ib_g+ib_g*cos(q5+q3*2.14); +per_frame_37=ob_a=.25+.25*sin(q2+q3*2.14); +per_frame_38=ib_a=.25+.25*sin(q2*2.14+q3); +per_frame_39=ob_size=.1+.1*sin(q3*3+q1); +per_frame_40=ib_size=.15+.05*sin(q1*3+q3); +per_frame_41=mv_r=mv_r+.5*sin(q4+q5*6*q1); +per_frame_42=mv_b=mv_b+.5*sin(q4+q5*6*q2); +per_frame_43=mv_g=mv_g+.5*sin(q5+q5*6*q3); +per_frame_44=mv_a=mv_a+mv_a*sin(q2+q3+q5*1.14); +per_frame_45=mv_l=.1*q8; +per_frame_46=mv_x=q8*q7; +per_frame_47=mv_y=q8*q7; +per_frame_48=wave_mystery=wave_mystery+.25*sin(time*q4); +per_frame_49=echo_zoom=1+.2*q1+.2*q5+.3*q4; +per_frame_50=echo_orientation=q7%3; +per_pixel_1=dx=sin(pow(x,2)*3.14*q3); +per_pixel_2=dy=sin(pow(y,2)*3.14*q2); +per_pixel_3=rot=sin(rad*3.14*q1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Che - Oddnezz 3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Che - Oddnezz 3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Che - Oddnezz 3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Che - Oddnezz 3.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,108 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=0.999900 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001043 +fWaveScale=0.010000 +fWaveSmoothing=0.750000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.008100 +fShader=0.300000 +zoom=1.008080 +rot=1.000000 +cx=2.000000 +cy=-1.000000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.003000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=0.600000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=// sensor - alpha +per_frame_2=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_3=pulse=band(above(le,th),above(le-th,block)); +per_frame_4=block=le-th; +per_frame_5=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_6=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_7=th=if(above(th,5.2),4,th); +per_frame_8= +per_frame_9=q1=.12*th; +per_frame_10=ccl=if(pulse,ccl+1,ccl); +per_frame_11=q2=ccl; +per_frame_12= +per_frame_13=mvrot=if(pulse, +per_frame_14=if(above(mvrot,4),0,mvrot+1),mvrot); +per_frame_15=mv_r=if(above(mvrot,2),if(above(mvrot,4),.039, +per_frame_16=if(equal(mvrot,3),.137,.835)),if(above(mvrot,1),.651, +per_frame_17=if(equal(mvrot,0),1,.773))); +per_frame_18=mv_g=if(above(mvrot,2),if(above(mvrot,4),.267, +per_frame_19=if(equal(mvrot,3),.886,.176)),if(above(mvrot,1),.804, +per_frame_20=if(equal(mvrot,0),1,.38))); +per_frame_21=mv_b=if(above(mvrot,2),if(above(mvrot,4),.694, +per_frame_22=if(equal(mvrot,3),.776,.851)),if(above(mvrot,1),.114, +per_frame_23=if(equal(mvrot,0),1,.145))); +per_frame_24= +per_frame_25=thccl = thccl + th; +per_frame_26=mv_r=min(1,max(0,mv_r+.5*sin(.015*thccl))); +per_frame_27=mv_g=min(1,max(0,mv_g+.5*sin(.016*thccl))); +per_frame_28=mv_b=min(1,max(0,mv_b+.5*sin(.017*thccl))); +per_frame_29=wave_r=1-mv_b; +per_frame_30=wave_g=1-mv_r; +per_frame_31=wave_b=1-mv_g; +per_frame_32= +per_frame_33=mv_x=mv_x+ccl%31-9; +per_frame_34=mv_y=mv_y+ccl%21-7; +per_frame_35= +per_frame_36=ob_r=ob_r + time*sin(bass); +per_frame_37=ob_b=ob_b + time*sin(treb+1); +per_frame_38=ob_g=ob_g + time*sin(mid/1.5); +per_frame_39=CX=2*sin(time); +per_pixel_1=zone=below(rad,q1); +per_pixel_2=zoom=1+.01*sin(if(zone,q2%4-1,(q2+1)%3)*q2+rad*8); +per_pixel_3=sx=sx+sin(if(zone,(q2+.5)%8-5,(q2+3)%6-3)*q2)*.008; +per_pixel_4=sy=sy+sin(if(zone,q2%7-5,(q2+3.4)%7-3)*q2)*.008; +per_pixel_5=grid=pow(x*(4+sin(q1*18)),1+q2%5)%2 + pow(y*(4+sin(q1*20)),1+q2%6)%2; +per_pixel_6=rot=bnot(grid)*above(x,y)*above(y,(1-x))*below(rad,.5+.25*sin(zoom*317)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Che - Oddnezz 4 (Done it again).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Che - Oddnezz 4 (Done it again).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Che - Oddnezz 4 (Done it again).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Che - Oddnezz 4 (Done it again).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,106 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=0.999900 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001043 +fWaveScale=0.010000 +fWaveSmoothing=0.750000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.008100 +fShader=0.300000 +zoom=1.008076 +rot=1.000000 +cx=2.000000 +cy=-1.000000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.003000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=1.000000 +ib_a=0.600000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=// sensor - alpha +per_frame_2=le=1.4*bass_att+.1*bass+.5*treb; +per_frame_3=pulse=band(above(le,th),above(le-th,block)); +per_frame_4=block=le-th; +per_frame_5=th=if(above(le,th),le+114/(le+10)-7.407, +per_frame_6=th+th*.07/(th-12)+below(th,2.7)*.1*(2.7-th)); +per_frame_7=th=if(above(th,5.2),4,th); +per_frame_8= +per_frame_9=q1=.12*th; +per_frame_10=ccl=if(pulse,ccl+1,ccl); +per_frame_11=q2=ccl; +per_frame_12= +per_frame_13=mvrot=if(pulse, +per_frame_14=if(above(mvrot,4),0,mvrot+1),mvrot); +per_frame_15=mv_r=if(above(mvrot,2),if(above(mvrot,4),.039, +per_frame_16=if(equal(mvrot,3),.137,.835)),if(above(mvrot,1),.651, +per_frame_17=if(equal(mvrot,0),1,.773))); +per_frame_18=mv_g=if(above(mvrot,2),if(above(mvrot,4),.267, +per_frame_19=if(equal(mvrot,3),.886,.176)),if(above(mvrot,1),.804, +per_frame_20=if(equal(mvrot,0),1,.38))); +per_frame_21=mv_b=if(above(mvrot,2),if(above(mvrot,4),.694, +per_frame_22=if(equal(mvrot,3),.776,.851)),if(above(mvrot,1),.114, +per_frame_23=if(equal(mvrot,0),1,.145))); +per_frame_24= +per_frame_25=thccl = thccl + th; +per_frame_26=mv_r=min(1,max(0,mv_r+.5*sin(.015*thccl))); +per_frame_27=mv_g=min(1,max(0,mv_g+.5*sin(.016*thccl))); +per_frame_28=mv_b=min(1,max(0,mv_b+.5*sin(.017*thccl))); +per_frame_29=wave_r=1-mv_b; +per_frame_30=wave_g=1-mv_r; +per_frame_31=wave_b=1-mv_g; +per_frame_32= +per_frame_33=mv_x=mv_x+ccl%31-9; +per_frame_34=mv_y=mv_y+ccl%21-7; +per_frame_35= +per_frame_36=ob_r=ob_r + time*sin(bass); +per_frame_37=ob_b=ob_b + time*sin(treb+1); +per_frame_38=ob_g=ob_g + time*sin(mid/1.5); +per_pixel_1=grid=pow(sin(rad*6*sin(q2)+x*y*16*q1)*2,1+q2%5)%2; +per_pixel_2=snee=.5*sin(q2*q1); +per_pixel_3=rot=bnot(grid)*above(x,.5+snee)*above(y,.5-snee); +per_pixel_4=sx=sx+sin((q2+.5)*x)*bnot(rot)*.003; +per_pixel_5=sy=sy+sin((q2+3.4)*y)*bnot(rot)*.003; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Cranked On Failure.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Cranked On Failure.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Cranked On Failure.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Cranked On Failure.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,97 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2 +fDecay=0.98 +fVideoEchoZoom=0.998169 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.320553 +fWaveScale=1 +fWaveSmoothing=0.45 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1.772 +fZoomExponent=1.96 +fShader=0.19 +zoom=0.999698 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.513 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.01 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=0.58 +ib_size=0.015 +ib_r=0.55 +ib_g=1 +ib_b=0.4999 +ib_a=1 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid+thresh+treb_thresh)*.052+-(bass+treb+mid)*.01); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=sin(pulse/2); +per_frame_25=wave_r=wave_r+.5*bass_residual; +per_frame_26=wave_r=wave_g+.5*mid_residual; +per_frame_27=wave_r=wave_b+.5*treb_residual; +per_frame_28=wave_mystery=mid_residual; +per_frame_29=ob_r=if(bass_flop,treb_flop,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_flop,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_flop,wave_g); +per_frame_32=ob_a=.05+.05*cos(wave_r+pulse*.03); +per_frame_33=ob_size=.2+.2*treb_residual; +per_frame_34=ib_r=if(bass_flop,ob_b,ob_g); +per_frame_35=ib_b=if(treb_flop,ob_g,ob_r); +per_frame_36=ib_g=if(mid_flop,ob_r,ob_b); +per_frame_37=ib_size=ob_size*cos(wave_g+pulse*0.4)*.5; +per_pixel_1=radix=if(above(q3,0),min(x,y),max(x,y)); +per_pixel_2=radix=if(above(q2,0),min(radix,rad),max(radix,rad)); +per_pixel_3=rot=if(above(q4,0),rad*.2*q5,rot+.3*sin(radix*3.14*(q1+q2+q3))); +per_pixel_4=zoom=if(above(q2,0),zoom-cos(radix*3.14*q2)*.1,if(above(q3,0),1+q1*.05,1+.07*cos(radix*10*q1))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & CTho - Bad Vibes.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & CTho - Bad Vibes.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & CTho - Bad Vibes.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & CTho - Bad Vibes.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,93 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.400000 +fWaveScale=1.605447 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.006000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.450000 +wave_g=0.650000 +wave_b=0.450000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=chaos=.9+.1*sin(pulse-beat); +per_frame_2=entropy=if(bnot(entropy),2,if(equal(pulse,-20)*above(beat,0),1+rand(5),entropy)); +per_frame_3=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_4=bass_changed=abs(bass_changed-equal(bass_thresh,2)); +per_frame_5=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_6=treb_changed=abs(treb_changed-equal(treb_thresh,2)); +per_frame_7=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_8=mid_changed=abs(mid_changed-equal(mid_thresh,2)); +per_frame_9=pulse=if(above(abs(pulse),20),-20,pulse+(mid_thresh+bass_thresh+treb_thresh)*.025); +per_frame_10=beat=if(above(abs(beat),20),-20,beat+.1*chaos*bor(bor(bass_changed,treb_changed),mid_changed)); +per_frame_11=q3=sin(pulse); +per_frame_12=q2=sin(pulse+beat); +per_frame_13=q4=sin(beat); +per_frame_14=q5=entropy; +per_frame_15=q1=(1+1*above(q2,0))*(1+2*above(q3,0))*(1+4*mid_changed*above(q3,0))*(1+6*above(q4,0))*(1+10*bass_changed*above(q4,0))*(1+12*above(q5,3))*(1+16*treb_changed*above(q2,0)); +per_frame_16=wave_r=.5+.2*bnot(q1%2)-.2*bnot(q1%3)+.3*q3*bnot(q1%13); +per_frame_17=wave_g=.5+.2*bnot(q1%5)-.2*bnot(q1%13)+.3*q4*bnot(q1%7); +per_frame_18=wave_b=if(bnot(q1%6),.8+.2*q4,.5+.5*q2); +per_frame_19=ob_r=ob_r+.2*q2+.3*bnot(q1%13)*q3; +per_frame_20=ob_b=ob_b-.1*bnot(q1%105)-.4*q2; +per_frame_21=ob_g=ob_g+.5*sin(pulse*.4*entropy); +per_frame_22=ob_a=.07+.05*q3; +per_frame_23=ob_size=.01*entropy*bnot(q1%6); +per_frame_24=ib_r=ib_r+.2*q1-.3*bnot(q1%3)*q4; +per_frame_25=ib_b=ib_b-.2*bnot(q1%17)-.3*q2+.2*bnot(q1%11); +per_frame_26=ib_g=ib_g+.5*sin(pulse*.35*entropy); +per_frame_27=ib_a=.07+.05*q3*q4; +per_frame_28=ib_size=.005+.005*q3; +per_frame_29=zoom_fade=if(bnot(q1%2),zoom_fade-(zoom_fade-.97)/2,zoom_fade-bnot(q1%5)*.02*q4+bnot(q1%2)*.02*q3-bnot(q1%11)*.04*q2); +per_frame_30=zoom=zoom_fade; +per_frame_31=rot_fade=if(bnot(q1%7),rot_fade-(rot_fade-.1*q3)/2-.03*bnot(q1%13),rot_fade-.02*bnot(q1%11)+.02*bnot(q1%3)+.03*bnot(q1%35)); +per_frame_32=rot=rot_fade; +per_frame_33=sy=sy+.07*bnot(q1%22)-.09*bnot(q1%17)+.07*q3*bnot(q1%65); +per_frame_34=sx = sx + max(0,max(bass_att,bass)-1)*0.5; +per_pixel_1=zoom=0.9615+rad*0.1*(zoom-1); +per_pixel_2=dx=dx+q1*.005; +per_pixel_3=dy=dy+q3*.005; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Custom Gramatix (Remix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Custom Gramatix (Remix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Custom Gramatix (Remix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Custom Gramatix (Remix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,105 @@ +[preset00] +fRating=2 +fGammaAdj=2 +fDecay=0.98 +fVideoEchoZoom=1.006435 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.028401 +fWaveScale=0.282087 +fWaveSmoothing=0 +fWaveParam=0.2 +fModWaveAlphaStart=0.95 +fModWaveAlphaEnd=0.75 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1.001827 +fShader=0.1 +zoom=0.98001 +rot=0 +cx=0.4399 +cy=0.5 +dx=0 +dy=0 +warp=0.01 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=0 +ib_size=0 +ib_r=0.5 +ib_g=0.5 +ib_b=0.5 +ib_a=0 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(above(pulse,pulse_cap-entropy*10),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=pulse_cap=entropy*100; +per_frame_17=pulse=if(above(abs(pulse),pulse_cap),0-pulse_cap,pulse+.1*entropy*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed)+(mid+bass+treb)*entropy*.03); +per_frame_18=q3=sin(pulse); +per_frame_19=effect_1=1+1*bass_flop*above(q3,0); +per_frame_20=effect_2=1+2*treb_flop*below(q3,0); +per_frame_21=effect_3=1+4*mid_flop*above(q3,0); +per_frame_22=effect_4=1+6*mid_flop*below(q3,0); +per_frame_23=effect_5=1+10*treb_flop*above(q3,0); +per_frame_24=effect_6=1+12*bass_flop*below(q3,0); +per_frame_25=q1=effect_1*effect_2*effect_3*effect_4*effect_5*effect_6; +per_frame_26=q2=time*q1*entropy*chaos*.002; +per_frame_27=q4=sin(q2*.02); +per_frame_28=q5=entropy; +per_frame_29=wave_r=if(treb_flop,abs(.5*q4),if(bass_flop,.5+.5*q4,1)); +per_frame_30=wave_g=if(treb_changed,0,if(mid_changed,0,.49)); +per_frame_31=wave_b=if(treb_flop,.8+.2*q4,bass_changed*mid_changed); +per_frame_32=cx=.5+.2*q3; +per_frame_33=cy=.5+.2*q4; +per_frame_34=wave_x=cy; +per_frame_35=wave_y=cx; +per_frame_36=ob_r=if(bass_flop,treb_flop,wave_g); +per_frame_37=ob_b=if(treb_flop,wave_r,wave_b); +per_frame_38=ob_g=if(mid_flop,wave_g,wave_b); +per_frame_39=ob_a=.07+.05*q2; +per_frame_40=ob_size=.01+.009*q4; +per_frame_41=ib_r=ib_r+.5*sin(time*.04*entropy); +per_frame_42=ib_b=ib_b+.5*sin(time*.03*entropy); +per_frame_43=ib_g=ib_g+.5*sin(time*.02*entropy); +per_frame_44=ib_a=.07+.05*q3*q4; +per_frame_45=ib_size=.01+.009*q3; +per_frame_46=zoom=zoom+.19*q4; +per_pixel_1=g1=sin(q2+time*q5*.01)/2; +per_pixel_2=g2=sin(q2+time*q5*.02)/2; +per_pixel_3=rot=if(above(sin(q2+time*q5*.025),0),g1*rad,g2*(1-rad)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Deeper Logic.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Deeper Logic.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Deeper Logic.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Deeper Logic.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,98 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=0.998169 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.740000 +fWaveScale=0.656000 +fWaveSmoothing=0.800000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.960000 +fShader=0.190000 +zoom=0.999698 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.580000 +ib_size=0.015000 +ib_r=0.550000 +ib_g=1.000000 +ib_b=0.499900 +ib_a=0.230000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*bass_thresh*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*treb_thresh*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*mid_thresh*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+.2*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed)+(mid+bass+treb)*entropy*.025); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=sin(pulse/2); +per_frame_25=wave_r=wave_r+.5*bass_residual; +per_frame_26=wave_r=wave_g+.5*mid_residual; +per_frame_27=wave_r=wave_b+.5*treb_residual; +per_frame_28=wave_mystery=mid_residual; +per_frame_29=ob_r=if(bass_flop,treb_flop,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_flop,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_flop,wave_g); +per_frame_32=ob_a=.03+.02*wave_r; +per_frame_33=ob_size=.05+.04*treb_residual; +per_frame_34=ib_r=if(bass_flop,ob_b,ob_g); +per_frame_35=ib_b=if(treb_flop,ob_g,ob_r); +per_frame_36=ib_g=if(mid_flop,ob_r,ob_b); +per_frame_37=ib_a=.03+.02*wave_g; +per_frame_38=ib_size=.05+.04*bass_residual; +per_pixel_1=radix=if(above(q3,0),min(x,y),max(x,y)); +per_pixel_2=radix=if(above(q2,0),min(radix,rad),max(radix,rad)); +per_pixel_3=rot=if(above(q4,0),rad*.2*q5,0); +per_pixel_4=zoom=if(above(q2,0),zoom,if(above(q3,0),1+q1*.05,1+.07*cos(radix*10*q1))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Free to Feel (Valium Remix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Free to Feel (Valium Remix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Free to Feel (Valium Remix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Free to Feel (Valium Remix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,103 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.986000 +fVideoEchoZoom=0.999993 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.741913 +fWaveScale=2.468550 +fWaveSmoothing=0.360000 +fWaveParam=-0.180000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999999 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.920000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=dx=-0.0005; +per_frame_3=dy=-0.0005; +per_frame_4=old_bass_flop=bass_flop; +per_frame_5=old_treb_flop=treb_flop; +per_frame_6=old_mid_flop=mid_flop; +per_frame_7=chaos=.9+.1*sin(beat); +per_frame_8=entropy=if(bnot(entropy),2,if(equal(pulse,-3.14),1+rand(3),entropy)); +per_frame_9=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_10=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_11=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_12=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_13=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_14=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_15=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_16=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_17=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_18=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_19=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_20=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_21=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.052); +per_frame_22=beat=if(above(abs(beat),3.14),-3.14,beat+(bass+treb+mid)*.01); +per_frame_23=q1=mid_residual; +per_frame_24=q2=bass_residual; +per_frame_25=q3=treb_residual; +per_frame_26=q4=sin(pulse); +per_frame_27=q5=sin(beat); +per_frame_28=mv_r=mv_r+.5*bass_residual; +per_frame_29=mv_g=mv_g+.5*mid_residual; +per_frame_30=mv_b=mv_b+.5*treb_residual; +per_frame_31=mv_a=1-(ob_a+ib_a)*chaos*.5; +per_frame_32=mv_x=abs(beat*10)*entropy; +per_frame_33=mv_y=abs(pulse*10)*entropy; +per_frame_34=mv_l=entropy*(q4-q5); +per_frame_35=wave_r=bass_flop*mv_g; +per_frame_36=wave_g=mid_flop*mv_b; +per_frame_37=wave_b=treb_flop*mv_r; +per_frame_38=ob_r=wave_r; +per_frame_39=ob_g=wave_g; +per_frame_40=ob_b=wave_b; +per_pixel_1=grid=x*100%(above(q1,q4)+above(q2,q5)+above(q3,q4)) + y*100%(above(q1,q5)+above(q2,q4)+above(q3,q5))*rand(10); +per_pixel_2=rot=if(grid,.12*cos(rad*3.14+x*q1*3.14+y*q2*3.14)*(q5+q4),0); +per_pixel_3=zoom=zoom-bnot(grid)*sin(x*q3*3.14+y*q5*3.14)*.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - French Clothing.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - French Clothing.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - French Clothing.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - French Clothing.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.500000 +fWaveScale=0.478000 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=3.138000 +fZoomExponent=6.811278 +fShader=0.000000 +zoom=1.000678 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=-0.005000 +warp=2.117467 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=0.570000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.470000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.250*( 0.60*sin(2.137*time) + 0.40*sin(1.770*time) ); +per_frame_2=wave_g = wave_g + 0.300*( 0.60*sin(1.944*time) + 0.40*sin(1.541*time) ); +per_frame_3=wave_b = wave_b + 0.250*( 0.60*sin(1.251*time) + 0.40*sin(1.655*time) ); +per_frame_4=q1 = cx + 0.410*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_5=q2 = cy + 0.410*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_6=q3 = dx + 0.010*( 0.60*sin(0.234*time) + 0.40*sin(0.277*time) ); +per_frame_7=q4 = dy + 0.010*( 0.60*sin(0.284*time) + 0.40*sin(0.247*time) ); +per_frame_8=decay = decay - 0.01*equal(frame%6,0); +per_pixel_1=cx=if(above(sin(time*1.321),0),q1,cx); +per_pixel_2=cy=if(above(sin(time*1.432),0),q2,cx); +per_pixel_3=dx=if(above(sin(time*1.543),0),q3,dx); +per_pixel_4=dy=if(above(sin(time*1.654),0),q4,dy); +per_pixel_5=rot=if(above(sin(time*3.888),0),rot-.2*cos(x*2-1),.2*sin(time*4.216)); +per_pixel_6=zoom=zoom-.043*cos(x*2-1)*sin(time*1.21); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Games With Light & Sound.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Games With Light & Sound.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Games With Light & Sound.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Games With Light & Sound.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,127 @@ +[preset00] +fRating=2 +fGammaAdj=2.12 +fDecay=1 +fVideoEchoZoom=2.986806 +fVideoEchoAlpha=0.9 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=25.573208 +fWaveScale=0.282091 +fWaveSmoothing=0 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1 +fShader=0 +zoom=0.9687 +rot=0 +cx=0.02 +cy=0.02 +dx=0 +dy=0 +warp=0.01 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.005 +ob_r=1 +ob_g=0 +ob_b=0 +ob_a=0.2 +ib_size=0.005 +ib_r=0 +ib_g=0 +ib_b=0 +ib_a=0.6 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0 +mv_dy=0 +mv_l=0.85 +mv_r=0.4999 +mv_g=0.4999 +mv_b=0.4999 +mv_a=0 +per_frame_1=warp=0; +per_frame_2=le=1+.5+2*sin(bass_att); +per_frame_3=bpulse=band(above(le,bth),above(le-bth,bblock)); +per_frame_4=bblock=le-bth; +per_frame_5=bth=if(above(le,bth),le+114/(le+10)-7.407, +per_frame_6=bth+bth*.07/(bth-12)+below(bth,2.7)*.1*(2.7-bth)); +per_frame_7=bth=if(above(bth,6),6,bth); +per_frame_8=bres=bpulse*sin(pulse+le*.5) + bnot(bpulse)*bres; +per_frame_9= +per_frame_10=le=1+.5+2*sin(treb_att); +per_frame_11=tpulse=band(above(le,tth),above(le-tth,tblock)); +per_frame_12=tblock=le-tth; +per_frame_13=tth=if(above(le,tth),le+114/(le+10)-7.407, +per_frame_14=tth+tth*.07/(tth-12)+below(tth,2.7)*.1*(2.7-tth)); +per_frame_15=tth=if(above(tth,6),6,tth); +per_frame_16=tres=tpulse*sin(pulse+le*.5) + bnot(tpulse)*tres; +per_frame_17= +per_frame_18=le=1+.5+2*sin(mid_att); +per_frame_19=mpulse=band(above(le,mth),above(le-mth,mblock)); +per_frame_20=mblock=le-mth; +per_frame_21=mth=if(above(le,mth),le+114/(le+10)-7.407, +per_frame_22=mth+mth*.07/(mth-12)+below(mth,2.7)*.1*(2.7-mth)); +per_frame_23=mth=if(above(mth,6),6,mth); +per_frame_24=mres=mpulse*sin(pulse+le*.5) + bnot(mpulse)*mres; +per_frame_25= +per_frame_26= +per_frame_27= +per_frame_28=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bth+mth+tth)*.003); +per_frame_29=q1=bres; +per_frame_30=q2=tres; +per_frame_31=q3=mres; +per_frame_32=q4=sin(pulse); +per_frame_33= +per_frame_34=mod_state=(above(q1,0)+above(q2,0)+above(q3,0))*(1+above(q4,0)); +per_frame_35=ccl=ccl+tpulse+mpulse-bpulse; +per_frame_36=q5=cos(pulse*(.5+.1*mod_state)); +per_frame_37=q6=sin(pulse*(.5+pow(.25,mod_state))); +per_frame_38=q7=mod_state; +per_frame_39=q8=ccl; +per_frame_40=ob_r=.5+.5*cos(q1+q7); +per_frame_41=ob_g=.5+.5*cos(q2*3.14+q7); +per_frame_42=ob_b=.5+.5*cos(q3*2+sin(time*.0816)); +per_frame_43=ib_size=.025+.02*q2; +per_frame_44=ob_size=.03+.02*q3-.002*q7; +per_frame_45=wave_r=.5+.5*sin(q1*q7+time*2.183); +per_frame_46=wave_g=.5+.5*sin(q2*3+time*1.211); +per_frame_47=wave_b=.5+.5*sin(q3+time*1.541); +per_frame_48=wave_mystery=wave_mystery+sin(time*2.18+q6); +per_frame_49=wave_x=wave_x+.25*sin(time*.811+q1)+.1*(frame%3)*sign(q3); +per_frame_50=wave_y=wave_y+.25*sin(time*.788+q2)+.1*(frame%2)*sign(q3); +per_frame_51= +per_frame_52=decay=.995+.0025*q3+.0025*q1; +per_frame_53=mv_a=above(q2,0)*(.1+.1*q5); +per_frame_54=mv_r=1-ob_g; +per_frame_55=mv_b=1-ob_r; +per_frame_56=mv_g=1-ob_b; +per_frame_57=zoom=.999+.001*q1; +per_frame_58=cx=0.5; +per_frame_59=cy=0.5; +per_pixel_1=snee=bnot(above(sin(ang)-x,.5)*above(q2,0)+above(y-cos(ang),.5)*above(q1,0)); +per_pixel_2=snur=bnot(below(x,.5)*above(q3,0)+below(y,.5)*below(q7,4)); +per_pixel_3=grid=sin(sigmoid(sin(y*6.28*q2),sin(x*6.28*q1))*(10+q7)); +per_pixel_4=zoom=zoom+.03*if(above(grid,0),q6*snee,q5*snur); +per_pixel_5=rot=sin((x*q4+y*q5)*3.14)*.01; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Ghostlight Whisper.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Ghostlight Whisper.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Ghostlight Whisper.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Ghostlight Whisper.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,114 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.982000 +fVideoEchoZoom=1.160967 +fVideoEchoAlpha=0.200000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.625316 +fWaveScale=0.359738 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999600 +fShader=0.030000 +zoom=0.999300 +rot=0.020000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.180000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(equal(pulse,-20),1+bass_flop+treb_flop+mid_flop+rand(2),entropy); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid_thresh+treb_thresh)*.01); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse/2+q1); +per_frame_25=q6=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_26=q7=entropy; +per_frame_27=q8=sin(q6*q1+q7*q2); +per_frame_28=wave_r=wave_r+.5*sin(q1+q2*2+q4*2.1); +per_frame_29=wave_b=wave_b+.5*sin(q2+q3*2+q4*2.2); +per_frame_30=wave_g=wave_g+.5*sin(q3+q1*2+q4*2.3); +per_frame_31=mv_r=mv_r+.5*sin(q4+q5*1.14*q1); +per_frame_32=mv_b=mv_b+.5*sin(q4+q5*1.14*q2); +per_frame_33=mv_g=mv_g+.5*sin(q5+q5*1.14*q3); +per_frame_34=mv_a=mv_a+mv_a*sin(q2+q3+q5*1.14); +per_frame_35=mv_l=(q7)*2; +per_frame_36= +per_frame_37= +per_frame_38= +per_frame_39=wave_x=wave_x+.03*q7*q4; +per_frame_40=wave_y=wave_x+.01*q6*q5; +per_frame_41=mv_x=q6*q7; +per_frame_42=mv_y=q6*q7; +per_frame_43=zoom=zoom+.01*q1; +per_pixel_1=gridx=bnot((q7*sin(x*3.14))%2); +per_pixel_2=gridy=bnot((q7*sin(y*3.14))%2); +per_pixel_3=dx=sin((y-0.5)*q1*6.2)*.01+q5*sin((y-0.5)*q2*6.2)*.01; +per_pixel_4=dy=cos((x-0.5)*q2*6.2)*.01+q4*cos((x-0.5)*q1*6.2)*.01; +per_pixel_5=grid=sin(sigmoid(sin(y*6.28*q2),sin(x*6.28*q5))*(10+q7)); +per_pixel_6=rot=rot*sign(grid)*q4; +per_pixel_7=sx=sx+grid*.03; +per_frame_init_1=entropy=2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - God Of The Game (Remix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - God Of The Game (Remix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - God Of The Game (Remix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - God Of The Game (Remix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,91 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.976000 +fVideoEchoZoom=1.006500 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=15 +nMotionVectorsY=6 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.876469 +fWaveScale=0.944293 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.150000 +fModWaveAlphaEnd=0.750000 +fWarpAnimSpeed=1.530000 +fWarpScale=1.731000 +fZoomExponent=1.003424 +fShader=0.000000 +zoom=1.000223 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.140100 +sx=1.006000 +sy=0.999900 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=warp=0; +per_frame_2=chaos=.9+.1*sin(pulse); +per_frame_3=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_4=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_5=bass_changed=abs(bass_changed-equal(bass_thresh,2)); +per_frame_6=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_7=treb_changed=abs(treb_changed-equal(treb_thresh,2)); +per_frame_8=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_9=mid_changed=abs(mid_changed-equal(mid_thresh,2)); +per_frame_10=pulse=if(above(abs(pulse),20),-20,pulse+.1*chaos*bor(bor(bass_changed,treb_changed),mid_changed)+(mid+bass+treb)*.025); +per_frame_11=q3=sin(pulse); +per_frame_12=q2=(pulse/entropy)*.5*chaos; +per_frame_13=q4=sin(q2); +per_frame_14=q5=entropy; +per_frame_15=q1=(1+1*above(q4,0))*(1+2*above(q3,0))*(1+4*mid_changed*above(q3,0))*(1+6*above(pulse,0))*(1+10*bass_changed*above(pulse,0))*(1+12*treb_changed*above(q4,0)); +per_frame_16=wave_r=if(treb_changed,.5+.5*q3,if(bass_changed,.5+.5*q4,1)); +per_frame_17=wave_g=.5+.2*bnot(q1%2)-.2*bnot(q1%3)+.2*bnot(q1%5)-.2*bnot(q1%7); +per_frame_18=wave_b=if(bnot(q1%6),.8+.2*q4,bass_changed*mid_changed); +per_frame_19=ob_r=if(bass_changed,wave_r,wave_g); +per_frame_20=ob_b=if(bnot(q1%14),.5+.5*q3,wave_b); +per_frame_21=ob_g=if(mid_changed,wave_g,wave_b); +per_frame_22=ob_a=.07+.05*q3; +per_frame_23=ob_size=.01*entropy*bnot(q1%6); +per_frame_24=ib_r=if(bnot(q1%13),wave_r,wave_b); +per_frame_25=ib_b=if(bnot(q1%11),bnot(q1%21),wave_g); +per_frame_26=ib_g=ib_g+.5*sin(time*.02*entropy); +per_frame_27=ib_a=.07+.05*q3*q4; +per_frame_28=ib_size=.01+.009*q3; +per_pixel_1=bend = cos(abs(x*10-5)*q2*bnot(q1%11)+(rad*10*q2-10*q3)*bnot(q1%7)+abs(y*10*q4-10*q3)*bnot(q1%13)); +per_pixel_2=zoom = zoom+bend*.05*bnot(q1%22); +per_pixel_3=dx=if(bnot(q1%5),dx,0); +per_pixel_4=dy=if(bnot(q1%3),dx,0); +per_pixel_5=grid=x*100%q5 + y*100%q5; +per_pixel_6=sx=sx-if(bnot(q1%10),if(bnot(grid),q3/2,.03),.1*q2*bnot(q1%77)); +per_pixel_7=sy=sy-if(bnot(q1%21),if(bnot(grid),q2/2,.03),.1*q3*bnot(q1%26)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Goofy Beat Detection.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Goofy Beat Detection.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Goofy Beat Detection.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Goofy Beat Detection.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,118 @@ +[preset00] +fRating=2 +fGammaAdj=1 +fDecay=0.992 +fVideoEchoZoom=0.9994 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.0592 +fWaveScale=0.653093 +fWaveSmoothing=0.27 +fWaveParam=-0.38 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=5.99579 +fWarpScale=1.331 +fZoomExponent=1 +fShader=0 +zoom=1.008 +rot=0.0019 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.01 +sx=1 +sy=1 +wave_r=1 +wave_g=1 +wave_b=1 +wave_x=0.5 +wave_y=0.5 +ob_size=0.005 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0.01 +ib_r=0.5 +ib_g=0.9 +ib_b=0.5 +ib_a=1 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0 +mv_dy=0 +mv_l=0.85 +mv_r=0.4999 +mv_g=0.4999 +mv_b=0.4999 +mv_a=1 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(equal(pulse,-20),1+bass_flop+treb_flop+mid_flop+rand(2),entropy); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid_thresh+treb_thresh)*.018); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse*(.5+.1*entropy)); +per_frame_25=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_26=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_27=q8=entropy; +per_frame_28=ob_r=.4+.4*sin(time*2.157+q6); +per_frame_29=ob_b=.8+.2*sin(time*1.689+q5); +per_frame_30=ob_g=.6+.4*sin(time*.413+q4); +per_frame_31=ib_r=.5+.5*cos(time*1.2+q1*.1); +per_frame_32=ib_b=.4+.4*cos(time*2.811+q2*.1); +per_frame_33=ib_g=.4+.4*cos(time*1.666+q3*.1); +per_frame_34=ib_size=.05+.03*q2; +per_frame_35=ob_size=.03+.02*sin(time*2.321+q2*.2); +per_frame_36=ob_a=.6+.4*q3; +per_frame_37=ib_a=.9+.1*sin(q2*.3+q4+q1*.5); +per_frame_38=mv_r=mv_r+.5*sin(q4+time*.678); +per_frame_39=mv_b=mv_b+.5*sin(q4+time*.789); +per_frame_40=mv_g=mv_g+.5*sin(q5+time*.456); +per_frame_41=mv_a=.2+.2*sin(time*1.178+q5*1.14); +per_frame_42=rot=0; +per_frame_43=wave_r=.6+.4*sin(q1+time*2.183); +per_frame_44=wave_b=.6+.4*sin(q2+time*1.211); +per_frame_45=wave_g=.6+.4*sin(q3+time*1.541); +per_frame_46=wave_mystery=wave_mystery+.5*sin(time*2.18+q6); +per_frame_47=wave_x=wave_x+.3*sin(time*.811)+.005*(frame%3); +per_frame_48=wave_y=wave_y+.3*sin(time*.788)+.005*(frame%3); +per_frame_49=wave_a=3+sin(time*1.414)+q3; +per_frame_50=wave_mode=q7; +per_frame_51=zoom=1+.7*sin(time*1.51); +per_pixel_1=rot=if(above(q4,0),rad*.2*q5,sin(rad*(q4+q3))); +per_pixel_2=zoom=if(above(q2,0),zoom+(1-zoom)*rot*cos(rad*3.14*q2),if(above(q3,0)*above(x,.5+.5*q5),zoom+(1-zoom)*sin(q1*rot*3.14),zoom+(1-zoom)*cos(rad*10*q6))); +per_pixel_3=dx=above(q1,0)*sin(rad*.5*q2); +per_pixel_4=dy=above(q3,0)*sin(rad*.5*q3); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Goo Kung Fu.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Goo Kung Fu.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Goo Kung Fu.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Goo Kung Fu.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,75 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.974000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.074092 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.850000 +fModWaveAlphaEnd=1.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.010000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.400000 +wave_g=0.400000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=wave_r = wave_r + 0.25*(0.6*sin(0.784*time) + 0.4*sin(0.986*time)); +per_frame_3=wave_g = wave_g + 0.25*(0.6*sin(0.671*time) + 0.4*sin(1.164*time)); +per_frame_4=wave_b = wave_b + 0.25*(0.6*sin(1.423*time) + 0.4*sin(0.687*time)); +per_frame_5=zoom=zoom+mid_att*.1; +per_pixel_1=timer_a=10*sin(time); +per_pixel_2=timer_b=10*sin(time*.5); +per_pixel_3=ripple_x=cos(x*timer_a-timer_b)*bass_att; +per_pixel_4=ripple_y=cos(y*timer_a-timer_b)*treb_att; +per_pixel_5=ripple_r=cos(rad*timer_b-timer_a)*mid_att; +per_pixel_6=ripple=ripple_x+ripple_y+ripple_r; +per_pixel_7=zoom=zoom+ripple*.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Housed In A Childish Mind.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Housed In A Childish Mind.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Housed In A Childish Mind.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Housed In A Childish Mind.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,135 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.560001 +fDecay=1.000000 +fVideoEchoZoom=0.999700 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=25.573200 +fWaveScale=1.135639 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.998170 +fShader=0.000000 +zoom=0.998137 +rot=1.000000 +cx=2.000000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.200000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.600000 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=le=1+.5+2*sin(bass_att); +per_frame_3=bpulse=band(above(le,bth),above(le-bth,bblock)); +per_frame_4=bblock=le-bth; +per_frame_5=bth=if(above(le,bth),le+114/(le+10)-7.407, +per_frame_6=bth+bth*.07/(bth-12)+below(bth,2.7)*.1*(2.7-bth)); +per_frame_7=bth=if(above(bth,6),6,bth); +per_frame_8=bres=bpulse*sin(pulse+le*.5) + bnot(bpulse)*bres; +per_frame_9= +per_frame_10=le=1+.5+2*sin(treb_att); +per_frame_11=tpulse=band(above(le,tth),above(le-tth,tblock)); +per_frame_12=tblock=le-tth; +per_frame_13=tth=if(above(le,tth),le+114/(le+10)-7.407, +per_frame_14=tth+tth*.07/(tth-12)+below(tth,2.7)*.1*(2.7-tth)); +per_frame_15=tth=if(above(tth,6),6,tth); +per_frame_16=tres=tpulse*sin(pulse+le*.5) + bnot(tpulse)*tres; +per_frame_17= +per_frame_18=le=1+.5+2*sin(mid_att); +per_frame_19=mpulse=band(above(le,mth),above(le-mth,mblock)); +per_frame_20=mblock=le-mth; +per_frame_21=mth=if(above(le,mth),le+114/(le+10)-7.407, +per_frame_22=mth+mth*.07/(mth-12)+below(mth,2.7)*.1*(2.7-mth)); +per_frame_23=mth=if(above(mth,6),6,mth); +per_frame_24=mres=mpulse*sin(pulse+le*.5) + bnot(mpulse)*mres; +per_frame_25= +per_frame_26= +per_frame_27= +per_frame_28=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bth+mth+tth)*.003); +per_frame_29=q1=bres; +per_frame_30=q2=tres; +per_frame_31=q3=mres; +per_frame_32=q4=sin(pulse); +per_frame_33= +per_frame_34=mod_state=(above(q1,0)+above(q2,0)+above(q3,0))*(1+above(q4,0)); +per_frame_35=ccl=ccl+tpulse+mpulse-bpulse; +per_frame_36=q5=cos(pulse*(.5+.1*mod_state)); +per_frame_37=q6=sin(pulse*(.5+pow(.25,mod_state))); +per_frame_38=q7=mod_state; +per_frame_39=q8=ccl; +per_frame_40=ob_r=.5+.5*cos(q1+q7); +per_frame_41=ob_g=.5+.5*cos(q2*3.14+q7); +per_frame_42=ob_b=.5+.5*cos(q3*2+sin(time*.0816)); +per_frame_43=ib_size=.025+.02*q2; +per_frame_44=ob_size=.03+.02*q3-.002*q7; +per_frame_45=wave_r=.5+.5*sin(q1*q7+time*2.183); +per_frame_46=wave_g=.5+.5*sin(q2*3+time*1.211); +per_frame_47=wave_b=.5+.5*sin(q3+time*1.541); +per_frame_48=wave_mystery=wave_mystery+sin(time*2.18+q6); +per_frame_49=wave_x=wave_x+.25*sin(time*.811+q1)+.1*(frame%3)*sign(q3); +per_frame_50=wave_y=wave_y+.25*sin(time*.788+q2)+.1*(frame%2)*sign(q3); +per_frame_51= +per_frame_52=cy=.5+.5*q4+sin(time*.086); +per_frame_53= +per_frame_54=decay=.995+.0025*q3+.0025*q1; +per_frame_55=mv_a=above(q2,0)*(.1+.1*q5); +per_frame_56=mv_r=1-ob_g; +per_frame_57=mv_b=1-ob_r; +per_frame_58=mv_g=1-ob_b; +per_pixel_1=snee=bnot(above(sin(ang)-x,.5)*above(q2,0)+above(y-cos(ang),.5)*above(q1,0)); +per_pixel_2=snur=bnot(below(x,.5+.5*y*q6)*above(q3,0)+below(y,.5+.5*sin(x*6.28*q1))*below(q7,4)); +per_pixel_3=grid=sin((rad*q1+x*q2+y*q3+ang*q4)*(10+q7)); +per_pixel_4=rot=snee*if(above(grid,0),snur,bnot(snur)); +per_pixel_5=zoom=(1+.01*sin(rad*q7+q5)*bnot(snee)*if(snur,-1,1))*(1+.03*q1*atan(ang*q4-rot*q2)); +per_pixel_6=sx=sx+.1*bor(bnot(snee),bnot(snur))*cos(y*3.14*q4); +per_pixel_7=sy=sy+.1*bor(bnot(snee),snur)*cos(x*3.14*q6); +per_pixel_8=checkx=bor(above(abs(q1),x)*below(abs(q2),x),above(abs(q2),x)*below(abs(q1),x)); +per_pixel_9=checky=bor(above(abs(q1),y)*below(abs(q2),y),above(abs(q2),y)*below(abs(q1),y)); +per_pixel_10=dx=checkx*sin(x*q3*6.29)*rot; +per_pixel_11=dy=checky*sin(y*q3*6.29)*rot; +per_pixel_12=rot=if(above(y,.5+.5*x*q3),rot*.01,rot*zoom*.005); +per_pixel_13=dx=dx*atan2(pow(ang*q4,1+q7),ang*sin(rad*3.14*q2)); +per_pixel_14=dy=dy*atan2(pow(ang*q5,1+(q8%6)),ang*sin(y*3.14*q1)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Dual Wave 3.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Dual Wave 3.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Dual Wave 3.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Dual Wave 3.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,63 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.950000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=1 +nMotionVectorsY=3 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=4.000000 +fWaveScale=1.402300 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.000000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.040000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.640000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.3*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_y = wave_y + 0.1*sin(time); +per_frame_3=wave_x = wave_x + 0.1*sin(time); +per_pixel_1=crazy_bass_effect=sin (time + abs(ang * bass * 2)); +per_pixel_2=dx= 0.03 * crazy_bass_effect; +per_pixel_3=rot=0.02 * bass * sin (time * .8); +per_pixel_4=warp=if(below(crazy_bass_effect,0),0,warp); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Logic Morph.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Logic Morph.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Logic Morph.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Logic Morph.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,86 @@ +[preset00] +fRating=1.000000 +fGammaAdj=2 +fDecay=0.98 +fVideoEchoZoom=1.00649 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=2 +nMotionVectorsY=1 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.9681 +fWaveScale=0.7063 +fWaveSmoothing=0 +fWaveParam=- +fModWaveAlphaStart=0.55 +fModWaveAlphaEnd=1.15 +fWarpAnimSpeed=1.53 +fWarpScale=1.731 +fZoomExponent=1.208145 +fShader=0 +zoom=1.000223 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.263 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.005 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0.301 +ib_r=0.25 +ib_g=0.25 +ib_b=0.25 +ib_a=1 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_frame_8=decay=decay-0.01*(frame%2); +per_frame_9=dx = dx + dx_residual; +per_frame_10=dy = dy + dy_residual; +per_frame_11=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_12=dx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_13=dy_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_frame_14=q1=dx_residual; +per_frame_15=q2=dy_residual; +per_frame_16=rot=rot+(dy_residual-dx_residual)*4; +per_frame_17=cy=cy+dy_residual*4; +per_frame_18=cx=cx+dx_residual*4; +per_frame_19=wave_x=wave_x+dx_residual*10; +per_frame_20=wave_y=wave_y+dy_residual*10; +per_frame_21=ob_r=wave_g; +per_frame_22=ob_g=wave_b; +per_frame_23=ob_b=wave_r; +per_frame_24=ib_r=wave_b; +per_frame_25=ib_g=wave_r; +per_frame_26=ib_b=wave_g; +per_frame_27=ob_size=dy_residual; +per_frame_28=ib_size=dx_residual; +per_pixel_1=zoom=1-zoom*rad*sin(time)*(q1+q2)*cos(rad*20*sin(time*.5))*10; +per_pixel_2=rot=rot-(1-zoom); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Spirit Morph.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Spirit Morph.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Spirit Morph.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Illusion - Spirit Morph.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=1.006490 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=2 +nMotionVectorsY=1 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.968100 +fWaveScale=0.780267 +fWaveSmoothing=0.126000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.550000 +fModWaveAlphaEnd=1.150000 +fWarpAnimSpeed=1.530000 +fWarpScale=1.731000 +fZoomExponent=1.208145 +fShader=0.000000 +zoom=1.000223 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.263000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.301000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=wave_r = wave_r + 0.350*( 0.60*sin(0.980*time) + 0.40*sin(1.047*time) ); +per_frame_2=wave_g = wave_g + 0.350*( 0.60*sin(0.835*time) + 0.40*sin(1.081*time) ); +per_frame_3=wave_b = wave_b + 0.350*( 0.60*sin(0.814*time) + 0.40*sin(1.011*time) ); +per_frame_4=rot = rot + 0.030*( 0.60*sin(0.381*time) + 0.40*sin(0.479*time) ); +per_frame_5=cx = cx + 0.110*( 0.60*sin(0.374*time) + 0.40*sin(0.294*time) ); +per_frame_6=cy = cy + 0.110*( 0.60*sin(0.393*time) + 0.40*sin(0.223*time) ); +per_frame_7=zoom=zoom+0.05+0.05*sin(time*0.133); +per_frame_8=decay=decay-0.01*(frame%2); +per_frame_9=dx = dx + dx_residual; +per_frame_10=dy = dy + dy_residual; +per_frame_11=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_12=dx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*dx_residual; +per_frame_13=dy_residual = equal(bass_thresh,2)*0.012*sin(time*9) + (1-equal(bass_thresh,2))*dy_residual; +per_frame_14=q1=dx_residual; +per_frame_15=q2=dy_residual; +per_pixel_1=zoom=1-zoom*rad*sin(time)*(q1+q2)*cos(rad*20*sin(time*.5))*10; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - In Memory Of Peg.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - In Memory Of Peg.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - In Memory Of Peg.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - In Memory Of Peg.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,118 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.990000 +fVideoEchoZoom=1.104060 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=1 +bSolarize=0 +bInvert=1 +fWaveAlpha=1.059269 +fWaveScale=0.653093 +fWaveSmoothing=0.270000 +fWaveParam=-0.380000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.998400 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.500000 +ib_g=0.900000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(equal(pulse,-20),1+bass_flop+treb_flop+mid_flop+rand(2),entropy); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid_thresh+treb_thresh)*.018); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse*(.5+.1*entropy)); +per_frame_25=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_26=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_27=q8=entropy; +per_frame_28=ob_r=.2+.1*sin(time*2.157+q6); +per_frame_29=ob_b=.2+.1*sin(time*1.689+q5); +per_frame_30=ob_g=.2+.1*sin(time*.413+q4); +per_frame_31=ib_r=.8+.2*cos(time*1.2+q1*.1); +per_frame_32=ib_b=.2+.2*cos(time*2.811+q2*.1); +per_frame_33=ib_g=.7+.3*cos(time*1.666+q3*.1); +per_frame_34=ib_size=.03+.02*q2; +per_frame_35=ob_size=.03+.02*sin(time*2.321+q2*.2); +per_frame_36=ob_a=.75+.25*q3; +per_frame_37=ib_a=.8+.2*sin(q2*.3+q4+q1*.5); +per_frame_38=mv_r=mv_r+.5*sin(q4+time*.678); +per_frame_39=mv_b=mv_b+.5*sin(q4+time*.789); +per_frame_40=mv_g=mv_g+.5*sin(q5+time*.456); +per_frame_41=mv_a=.2+.2*sin(time*1.178+q5*1.14); +per_frame_42=rot=0; +per_frame_43=wave_r=.6+.4*sin(q1+time*2.183); +per_frame_44=wave_b=.6+.4*sin(q2+time*1.211); +per_frame_45=wave_g=.6+.4*sin(q3+time*1.541); +per_frame_46=wave_mystery=wave_mystery+.3*sin(time*2.18+q6); +per_frame_47=wave_x=wave_x+.3*sin(time*.811)+.005*(frame%3); +per_frame_48=wave_y=wave_y+.3*sin(time*.788)+.005*(frame%3); +per_frame_49=wave_a=3+sin(time*1.414)+q3; +per_frame_50=zoom=zoom+.5*sin(time*1.69); +per_pixel_1=xx=(x-.5+.03*q5+.1*y*q6+.1*sin(time*.322))*2; +per_pixel_2=yy=(y-.5+.03*q6+.1*x*q5+.1*sin(time*.427))*2; +per_pixel_3=dx=sin(xx); +per_pixel_4=dy=sin(yy); +per_pixel_5=rot=sin(rad*(xx*q4+yy*q5+1.7*q6)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Invariant Under Rigorous Motions.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Invariant Under Rigorous Motions.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Invariant Under Rigorous Motions.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Invariant Under Rigorous Motions.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,91 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.992000 +fVideoEchoZoom=0.999999 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=100.000000 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.850000 +fModWaveAlphaEnd=1.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.008150 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.990099 +sy=0.990099 +wave_r=0.400000 +wave_g=0.400000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*bass_thresh*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*treb_thresh*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*mid_thresh*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+.2*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed)+(mid+bass+treb)*entropy*.025); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse); +per_frame_25=wave_r=wave_r+.5*bass_residual; +per_frame_26=wave_r=wave_g+.5*mid_residual; +per_frame_27=wave_r=wave_b+.5*treb_residual; +per_frame_28=zoom=zoom-.0035*q1; +per_frame_29=rot=.05*q3; +per_frame_30=wave_mystery=below(q1,0); +per_pixel_1=disk_shift = if(equal(abs(sin(ang)), if(above(q1,0),0,1)), -rot, sign(q3)*.1); +per_pixel_2=timer=q4; +per_pixel_3=x_or_y=if(above(q1,0),y,x); +per_pixel_4=rot = 0 + if(equal(x_or_y*10%2,0),if(below(timer,0),disk_shift,rot),if(above(timer,0),-disk_shift,0)); +per_pixel_5=zoom=zoom+rot; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Jaded Emotion.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Jaded Emotion.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Jaded Emotion.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Jaded Emotion.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,75 @@ +[preset00] +fRating=2 +fGammaAdj=2 +fDecay=0.98 +fVideoEchoZoom=0.99663 +fVideoEchoAlpha=0 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.005729 +fWaveScale=7.184967 +fWaveSmoothing=0.9 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1 +fShader=0 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=1 +sx=1 +sy=1 +wave_r=0 +wave_g=0 +wave_b=0 +wave_x=0.5 +wave_y=0.5 +ob_size=0.005 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0.25 +ib_r=0.5 +ib_g=0.5 +ib_b=0.5 +ib_a=0.1 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + bass*.5; +per_frame_3=wave_g = wave_g + treb*.5; +per_frame_4=wave_b = wave_b + mid*.5; +per_frame_5=ib_r = ib_r + .4*sin(time*.222); +per_frame_6=ib_g = ib_g + .4*sin(time*.333); +per_frame_7=ib_b = ib_b + .4*sin(time*.111); +per_frame_8=ib_a = ib_a + .05*sin(time*.555); +per_frame_9=ib_size = ib_size + .24*sin(time*.444); +per_frame_10=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_11=cx_residual = equal(bass_thresh,2)*0.016*sin(time*7) + (1-equal(bass_thresh,2))*cx_residual; +per_frame_12=treb_thresh = above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_13=cy_residual = equal(treb_thresh,2)*0.016*sin(time*7) + (1-equal(treb_thresh,2))*cy_residual; +per_frame_14=mid_thresh = above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_15=rot_residual = equal(mid_thresh,2)*0.016*sin(time*7) + (1-equal(mid_thresh,2))*rot_residual; +per_frame_16=cx=cx_residual+sin(time*.888); +per_frame_17=cy=cy_residual+sin(time*.999); +per_frame_18=rot=rot_residual*3; +per_pixel_1=zoom=zoom+cos(rad*10*sin(time*.666))*.07; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Jaundice.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Jaundice.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Jaundice.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Jaundice.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,103 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.983999 +fVideoEchoZoom=0.999993 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.583010 +fWaveScale=0.411715 +fWaveSmoothing=0.900000 +fWaveParam=-0.180000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.030300 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.920000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(beat); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-3.14),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.052); +per_frame_20=beat=if(above(abs(beat),3.14),-3.14,beat+(bass+treb+mid)*.01); +per_frame_21=q1=mid_residual; +per_frame_22=q2=bass_residual; +per_frame_23=q3=treb_residual; +per_frame_24=q4=sin(pulse); +per_frame_25=q5=sin(beat); +per_frame_26=mv_r=mv_r+.5*bass_residual; +per_frame_27=mv_g=mv_g+.5*mid_residual; +per_frame_28=mv_b=mv_b+.5*treb_residual; +per_frame_29=mv_a=1-(ob_a+ib_a)*chaos*.5; +per_frame_30=mv_x=abs(beat*10)*entropy; +per_frame_31=mv_y=abs(pulse*10)*entropy; +per_frame_32=wave_r=bass_flop*mv_g; +per_frame_33=wave_g=mid_flop*mv_b; +per_frame_34=wave_b=treb_flop*mv_r; +per_frame_35=ob_r=wave_r; +per_frame_36=ob_g=wave_g; +per_frame_37=ob_b=wave_b; +per_pixel_1=grid=x*100%(above(q1,q4)+above(q2,q5)+above(q3,q4)) + y*100%(above(q1,q5)+above(q2,q4)+above(q3,q5)); +per_pixel_2=rot=if(grid,.07*cos(rad*3.14+x*q1*3.14+y*q2*3.14)*(q5+q4),0); +per_pixel_3=zoom=zoom-bnot(grid)*sin(x*q3*3.14+y*q5*3.14)*.07; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Making a Science of It 4.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Making a Science of It 4.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Making a Science of It 4.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Making a Science of It 4.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,122 @@ +[preset00] +fRating=2 +fGammaAdj=1.560001 +fDecay=1 +fVideoEchoZoom=0.9998 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.419996 +fWaveScale=0.972362 +fWaveSmoothing=0.09 +fWaveParam=0.02 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=2.468457 +fShader=0 +zoom=1.001789 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.01 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.005 +ob_r=1 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0.005 +ib_r=0 +ib_g=0 +ib_b=0 +ib_a=1 +nMotionVectorsX=0 +nMotionVectorsY=0 +mv_dx=0 +mv_dy=0 +mv_l=0.85 +mv_r=0.4999 +mv_g=0.4999 +mv_b=0.4999 +mv_a=0 +per_frame_1=warp=0; +per_frame_2=le=1+.5+2*sin(bass_att); +per_frame_3=bpulse=band(above(le,bth),above(le-bth,bblock)); +per_frame_4=bblock=le-bth; +per_frame_5=bth=if(above(le,bth),le+114/(le+10)-7.407, +per_frame_6=bth+bth*.07/(bth-12)+below(bth,2.7)*.1*(2.7-bth)); +per_frame_7=bth=if(above(bth,6),6,bth); +per_frame_8=bres=bpulse*sin(pulse+le*.5) + bnot(bpulse)*bres; +per_frame_9= +per_frame_10=le=1+.5+2*sin(treb_att); +per_frame_11=tpulse=band(above(le,tth),above(le-tth,tblock)); +per_frame_12=tblock=le-tth; +per_frame_13=tth=if(above(le,tth),le+114/(le+10)-7.407, +per_frame_14=tth+tth*.07/(tth-12)+below(tth,2.7)*.1*(2.7-tth)); +per_frame_15=tth=if(above(tth,6),6,tth); +per_frame_16=tres=tpulse*sin(pulse+le*.5) + bnot(tpulse)*tres; +per_frame_17= +per_frame_18=le=1+.5+2*sin(mid_att); +per_frame_19=mpulse=band(above(le,mth),above(le-mth,mblock)); +per_frame_20=mblock=le-mth; +per_frame_21=mth=if(above(le,mth),le+114/(le+10)-7.407, +per_frame_22=mth+mth*.07/(mth-12)+below(mth,2.7)*.1*(2.7-mth)); +per_frame_23=mth=if(above(mth,6),6,mth); +per_frame_24=mres=mpulse*sin(pulse+le*.5) + bnot(mpulse)*mres; +per_frame_25= +per_frame_26= +per_frame_27= +per_frame_28=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bth+mth+tth)*.003); +per_frame_29=q1=bres; +per_frame_30=q2=tres; +per_frame_31=q3=mres; +per_frame_32=q4=sin(pulse); +per_frame_33= +per_frame_34=mod_state=(above(q1,0)+above(q2,0)+above(q3,0))*(1+above(q4,0)); +per_frame_35=ccl=ccl+tpulse+mpulse-bpulse; +per_frame_36=q5=cos(pulse*(.5+.1*mod_state)); +per_frame_37=q6=sin(pulse*(.5+pow(.25,mod_state))); +per_frame_38=q7=mod_state; +per_frame_39=q8=ccl; +per_frame_40=ob_r=.5+.5*cos(q1+q7); +per_frame_41=ob_g=.5+.5*cos(q2*3.14+q7); +per_frame_42=ob_b=.5+.5*cos(q3*2+sin(time*.0816)); +per_frame_43=ib_size=.025+.02*q2; +per_frame_44=ob_size=.03+.02*q3-.002*q7; +per_frame_45=wave_r=.5+.5*sin(q1*q7+time*2.183); +per_frame_46=wave_g=.5+.5*sin(q2*3+time*1.211); +per_frame_47=wave_b=.5+.5*sin(q3+time*1.541); +per_frame_48= +per_frame_49=decay=.997+.0015*q3+.0015*q1; +per_frame_50=ob_a=.5+.5*q2; +per_pixel_1=snee=bnot(above(sin(ang)-x,.5)*above(q2,0)+above(y-cos(ang),.5)*above(q1,0)); +per_pixel_2=snur=bnot(below(x,.5)*above(q3,0)+below(y,.5)*below(q7,4)); +per_pixel_3=grid=sin(sigmoid(sin(y*6.28*q2),sin(x*6.28*q6))*(10+q7)); +per_pixel_4=rot=(1-snee*if(above(grid,0),snur,bnot(snur))*(.5+.5*sin(rad*3.14*q1)))*q6*.13; +per_pixel_5=zoom=zoom+.01*sin(rad*(q7%2+q5)*2*q2+1.6*q1+q8)*bnot(snee)*if(snur,-1,q3); +per_pixel_6=sx=sx-bor(bnot(snee),bnot(snur))*cos(y*3.14*q4)*.04; +per_pixel_7=sy=sy-bor(bnot(snee),snur)*cos(x*3.14*q6)*.04; +per_pixel_8=cx=cx+sin(rad*3.14*q4)*.26; +per_pixel_9=cy=cx+sin(3.14*q5)*.1816; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Morat's Final Voyage.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Morat's Final Voyage.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Morat's Final Voyage.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Morat's Final Voyage.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=2 +fGammaAdj=2 +fDecay=0.98 +fVideoEchoZoom=1.001825 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.976151 +fWaveScale=0.931 +fWaveSmoothing=0.18 +fWaveParam=-0.32 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=2.3 +fShader=0 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=1 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.01 +ob_r=0.5 +ob_g=0.5 +ob_b=0.5 +ob_a=1 +ib_size=0.01 +ib_r=0.5 +ib_g=0.5 +ib_b=0.5 +ib_a=1 +per_frame_1=warp = 0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_6=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_7=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_8=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_9=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_10=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_11=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_12=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_13=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_14=pulse=if(above(abs(pulse),5000),-5000,pulse+mid_att*.1*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed)); +per_frame_15=wave_b=if(treb_changed,1,if(mid_changed,.45,-.45))*q4; +per_frame_16=wave_g=if(bass_changed,.1,bass_flop); +per_frame_17=wave_r=if(mid_flop,1,.5*q2*treb_flop); +per_frame_18=ib_b=ib_b+.5*sin(pulse); +per_frame_19=ib_g=ib_g+5*sin(pulse*.8); +per_frame_20=ib_r=ib_r+5*sin(pulse*.8); +per_frame_21=ob_b=wave_r; +per_frame_22=ob_g=wave_b; +per_frame_23=ob_r=wave_g; +per_frame_24=wave_mystery=sin(pulse); +per_frame_25=q1=pulse; +per_pixel_1=zoom=zoom-cos(x*10*sin(time+q1*.9)-10*sin(time+q1))*.1-sin(rad*10*sin(time+q1*.5))*.1; +per_pixel_2=rot=rot+abs(1-zoom)*sin(time+q1)*2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Non-Professional Music Analyzer.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Non-Professional Music Analyzer.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Non-Professional Music Analyzer.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Non-Professional Music Analyzer.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,107 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=0.996630 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.958904 +fWaveScale=0.010000 +fWaveSmoothing=0.540000 +fWaveParam=-0.460000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +per_frame_1=old_bass_flop=bass_flop; +per_frame_2=old_treb_flop=treb_flop; +per_frame_3=old_mid_flop=mid_flop; +per_frame_4=chaos=.9+.1*sin(pulse); +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_6=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_7=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_8=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_9=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_10=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_11=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_12=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_13=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_14=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_15=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_16=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_17=monitor=warp/100; +per_frame_18=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid_thresh+treb_thresh)*.032); +per_frame_19=entropy=if(bass_changed*mid_changed*treb_changed,bass_flop+treb_flop+mid_flop+rand(5),entropy); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse*(.5+.1*entropy)); +per_frame_25=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_26=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_27=q8=entropy; +per_frame_28=mv_r=.5+.5*sin(q4*.3+time*1.678); +per_frame_29=mv_b=.5+.5*sin(q4*.3+time*.789); +per_frame_30=mv_g=.5+.5*sin(q5*.3+time*.456); +per_frame_31=mv_a=.3+.3*sin(time*1.178+q5*1.14); +per_frame_32=wave_r=1-if(above(q7,3),ib_g,ob_g); +per_frame_33=wave_b=1-if(below(q7,3),ib_r,ob_r); +per_frame_34=wave_g=1-if(q7%3,ib_b,ob_b); +per_frame_35=wave_y=.25+.25*q2+.5*bnot(frame%3); +per_frame_36=wave_mystery=wave_mystery+.05*q3; +per_frame_37=wave_x=wave_x+.01*q4;; +per_frame_38=warp=0; +per_frame_39=rot=0; +per_frame_40=decay=.905+.005*q3; +per_frame_41=wave_mode=4*bnot(frame%3); +per_pixel_1=zoom = zoom + (q1*.005); +per_pixel_2=dy = if(below(y,.5+.5*q1),-.01*rand(10),0); +per_pixel_3=rot=.01*sin((y-.5)*3.14*q2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Painful Plasma (Multi-Wave Mirrored Rage) -- Ro.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Painful Plasma (Multi-Wave Mirrored Rage) -- Ro.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Painful Plasma (Multi-Wave Mirrored Rage) -- Ro.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Painful Plasma (Multi-Wave Mirrored Rage) -- Ro.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,224 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.960000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.224562 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.199900 +wave_b=0.700000 +wave_x=0.600000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.030000 +ob_g=0.150000 +ob_b=0.250000 +ob_a=0.020000 +ib_size=0.500000 +ib_r=0.100000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.010000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.500000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=1 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=0.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shapecode_1_enabled=1 +shapecode_1_sides=3 +shapecode_1_additive=0 +shapecode_1_thickOutline=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.250000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=0.100000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.400000 +shape_1_per_frame1=ang = time*1.4; +shape_1_per_frame2=x = 0.5 + 0.08*cos(time*1.1) + 0.03*cos(time*0.7); +shape_1_per_frame3=y = 0.5 + 0.08*sin(time*1.1) + 0.03*sin(time*0.7); +shape_1_per_frame4=r = 0.5 + 0.5*sin(time*0.713 + 1); +shape_1_per_frame5=g = 0.5 + 0.5*sin(time*0.563 + 2); +shape_1_per_frame6=b = 0.5 + 0.5*sin(time*0.654 + 5); +shape_1_per_frame7=r2 = 0.5 + 0.5*sin(time*0.885 + 4); +shape_1_per_frame8=g2 = 0.5 + 0.5*sin(time*0.556+ 1); +shape_1_per_frame9=b2 = 0.5 + 0.5*sin(time*0.638 + 3); +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid+thresh+treb_thresh)*.052+-(bass+treb+mid)*.01); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=sin(pulse/2); +per_frame_25=wave_r=wave_r+.5*bass_residual; +per_frame_26=wave_r=wave_g+.5*mid_residual; +per_frame_27=wave_r=wave_b+.5*treb_residual; +per_frame_28=wave_mystery=mid_residual; +per_frame_29=ob_r=if(bass_flop,treb_flop,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_flop,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_flop,wave_g); +per_frame_32=ob_a=.05+.05*cos(wave_r+pulse*.03); +per_frame_33=ob_size=.2+.2*treb_residual; +per_frame_34=ib_r=if(bass_flop,ob_b,ob_g); +per_frame_35=ib_b=if(treb_flop,ob_g,ob_r); +per_frame_36=ib_g=if(mid_flop,ob_r,ob_b); +per_frame_37=ib_size=ob_size*cos(wave_g+pulse*0.4)*.5; +per_frame_38=mv_a=q1; +per_frame_39=mv_x=rand(30); +per_frame_40=mv_y=rand(30); +per_frame_41=mv_r=wave_b; +per_frame_42=mv_b=wave_g; +per_frame_43=mv_g=wave_r; +per_frame_44=wave_mode=4+4*q4; +per_pixel_1=newx = x - abs(q1); +per_pixel_2=newy = y - abs(q2); +per_pixel_3=newrad = sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2; +per_pixel_4=newzoom = pow(1.03, pow(0.01+sin(newrad*newrad), newrad*2-1)); +per_pixel_5=dx = (newx)*newzoom - newx; +per_pixel_6=dy = (newy)*newzoom - newy; +per_pixel_7=rot = -0.1*newrad*(0.5*rad+0.1); +per_pixel_8=zoom = zoom+.07*cos(x*10*q3); +per_pixel_9=rot = rot * (zoom-1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Perverted Dialect.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Perverted Dialect.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Perverted Dialect.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Perverted Dialect.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,85 @@ +[preset00] +fRating=4.000000 +fGammaAdj=2.000000 +fDecay=0.983000 +fVideoEchoZoom=1.006596 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=3 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=2.047093 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=3.394161 +fShader=0.000000 +zoom=1.008148 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + if(above(bass_att,1.4),1,.49*sin(time*2)); +per_frame_3=wave_g = wave_g + if(above(bass_att,1.4),0,if(above(treb_att,1.4),1,.49*sin(time*3))); +per_frame_4=wave_b = wave_b + if(above(treb_att,1.4),0,.49*sin(time)); +per_frame_5=timer_base=.5; +per_frame_6=q1=sin(time*timer_base*4); +per_frame_7=q2=sin(time*timer_base*2); +per_frame_8=q3=sin(time*timer_base); +per_frame_9=rot=if(above(q1,0),if(above(q2,0),.1,-.1),0); +per_frame_10=zoom=zoom+.05*q2+.05*q1; +per_frame_11=wave_mystery=wave_mystery+.7*q1+.3*q2; +per_frame_12=wave_size=wave_size+0.5*q3; +per_frame_13=cx=cx+.2*q1; +per_frame_14=cy=cy+.2*q3; +per_pixel_1=centerx = .5; +per_pixel_2=centery = .5; +per_pixel_3=crad = abs(rad-.5)*q2; +per_pixel_4=grid=abs(x*10-5)%2 + abs(y*10-5)%2; +per_pixel_5=sx_temp = if(equal(grid,0),if(above(x,centerx),sx - crad - centerx,sx + crad - centerx),sx); +per_pixel_6=sy_temp = if(equal(grid,0),if(above(y,centery),sy - crad - centery,sy + crad - centery),sy); +per_pixel_7=sx=if(below(q1,0),sx-sx_temp*q2*.1,sx); +per_pixel_8=sy=if(below(q1,0),sy-sx_temp*q2*.1,sy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Exile.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Exile.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Exile.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Exile.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,118 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.996000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.817900 +fWaveScale=0.397105 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995700 +fWarpScale=1.331000 +fZoomExponent=100.000000 +fShader=0.000000 +zoom=0.998108 +rot=-0.760000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.350495 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.900000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=31.999994 +nMotionVectorsY=28.799999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=warp=0; +per_frame_2=rot=0; +per_frame_3=old_bass_flop=bass_flop; +per_frame_4=old_treb_flop=treb_flop; +per_frame_5=old_mid_flop=mid_flop; +per_frame_6=chaos=.1+.1*sin(pulse); +per_frame_7=bass_thresh =if(above(bass_att,bass_thresh),3,bass_thresh-chaos); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,3)); +per_frame_9=treb_thresh=if(above(treb_att,treb_thresh),3,treb_thresh-chaos); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,3)); +per_frame_11=mid_thresh=if(above(mid_att,mid_thresh),3,mid_thresh-chaos); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,3)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.032); +per_frame_20=entropy=if(equal(pulse,-3.14),bass_flop+mid_flop+treb_flop+rand(5),entropy); +per_frame_21=q1=mid_residual; +per_frame_22=q2=bass_residual; +per_frame_23=q3=treb_residual; +per_frame_24=q4=sin(pulse); +per_frame_25=q5=cos(pulse*(.5+.1*entropy)); +per_frame_26=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_27=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_28=q8=entropy; +per_frame_29= +per_frame_30=ob_r=.2+.1*sin(time*2.157+q6); +per_frame_31=ob_b=.2+.1*sin(time*1.689+q5); +per_frame_32=ob_g=.2+.1*sin(time*.413+q4); +per_frame_33=ib_r=.8+.2*cos(time*1.2+q1*.1); +per_frame_34=ib_b=.2+.2*cos(time*2.811+q2*.1); +per_frame_35=ib_g=.7+.3*cos(time*1.666+q3*.1); +per_frame_36=ib_size=.03+.02*q2; +per_frame_37=ob_size=.03+.02*sin(time*2.321+q2*.2); +per_frame_38=ob_a=.75+.25*q3; +per_frame_39=ib_a=.8+.2*sin(q2*.3+q4+q1*.5); +per_frame_40=mv_r=mv_r+.5*sin(q4+time*.678); +per_frame_41=mv_b=mv_b+.5*sin(q4+time*.789); +per_frame_42=mv_g=mv_g+.5*sin(q5+time*.456); +per_frame_43=mv_a=.2+.2*sin(time*1.178+q5*1.14); +per_frame_44=wave_r=if(treb_changed,.5+.5*q3,if(bass_changed,.5+.5*q4,1)); +per_frame_45=wave_g=.5+.2*bnot(q8%2)-.2*bnot(q8%3)+.2*bnot(q8%4)-.2*bnot(q8%5); +per_frame_46=wave_b=if(bnot(q8%6),.8+.2*q1,bass_changed*mid_changed); +per_frame_47=wave_mode=q8-bass_changed+mid_changed+treb_changed; +per_frame_48=wave_mystery=frame%2; +per_pixel_1=grid=pow(x*3,3-q1)%q8 + pow(y*3,3-q3)%q8; +per_pixel_2=bend = sin(x*(9.42-6.28*q2)*bnot(q8%3) +per_pixel_3=+(rad*9.42-6.28*sin(time*(1.3+.3*q1)))*bnot(q8%4)+y*(9.42*q4-6.28*q3)*bnot(q8%5)); +per_pixel_4=zoom = zoom+bend*below(y,.5)*below(x,.5)*.1; +per_pixel_5=sx=sx-if(above(q7,3),bnot(grid)*q3*.2,.1*q2*bnot(q8%5)); +per_pixel_6=sy=sy-if(below(q7,3),bnot(grid)*q2*.2,.1*q3*bnot(q8%2)); +per_pixel_7=rot=if(equal(grid,3),q3,bnot(grid%q7)*above(x,.5)*above(y,.5)*sin(zoom)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Nectar.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Nectar.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Nectar.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Nectar.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,118 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.970000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.817900 +fWaveScale=0.397105 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995700 +fWarpScale=1.331000 +fZoomExponent=100.000000 +fShader=0.000000 +zoom=2.002966 +rot=-0.760000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.350495 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.900000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=31.999994 +nMotionVectorsY=28.799999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=warp=0; +per_frame_2=rot=0; +per_frame_3=old_bass_flop=bass_flop; +per_frame_4=old_treb_flop=treb_flop; +per_frame_5=old_mid_flop=mid_flop; +per_frame_6=chaos=.1+.1*sin(pulse); +per_frame_7=bass_thresh =if(above(bass_att,bass_thresh),3,bass_thresh-chaos); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,3)); +per_frame_9=treb_thresh=if(above(treb_att,treb_thresh),3,treb_thresh-chaos); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,3)); +per_frame_11=mid_thresh=if(above(mid_att,mid_thresh),3,mid_thresh-chaos); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,3)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.032); +per_frame_20=entropy=if(equal(pulse,-3.14),bass_flop+mid_flop+treb_flop+rand(5),entropy); +per_frame_21=q1=mid_residual; +per_frame_22=q2=bass_residual; +per_frame_23=q3=treb_residual; +per_frame_24=q4=sin(pulse); +per_frame_25=q5=cos(pulse*(.5+.1*entropy)); +per_frame_26=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_27=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_28=q8=entropy; +per_frame_29= +per_frame_30=ob_r=.2+.1*sin(time*2.157+q6); +per_frame_31=ob_b=.2+.1*sin(time*1.689+q5); +per_frame_32=ob_g=.2+.1*sin(time*.413+q4); +per_frame_33=ib_r=.8+.2*cos(time*1.2+q1*.1); +per_frame_34=ib_b=.2+.2*cos(time*2.811+q2*.1); +per_frame_35=ib_g=.7+.3*cos(time*1.666+q3*.1); +per_frame_36=ib_size=.03+.02*q2; +per_frame_37=ob_size=.03+.02*sin(time*2.321+q2*.2); +per_frame_38=ob_a=.75+.25*q3; +per_frame_39=ib_a=.8+.2*sin(q2*.3+q4+q1*.5); +per_frame_40=mv_r=mv_r+.5*sin(q4+time*.678); +per_frame_41=mv_b=mv_b+.5*sin(q4+time*.789); +per_frame_42=mv_g=mv_g+.5*sin(q5+time*.456); +per_frame_43=mv_a=.2+.2*sin(time*1.178+q5*1.14); +per_frame_44=wave_r=if(treb_changed,.5+.5*q3,if(bass_changed,.5+.5*q4,1)); +per_frame_45=wave_g=.5+.2*bnot(q8%2)-.2*bnot(q8%3)+.2*bnot(q8%4)-.2*bnot(q8%5); +per_frame_46=wave_b=if(bnot(q8%6),.8+.2*q1,bass_changed*mid_changed); +per_frame_47=wave_mode=q8-bass_changed+mid_changed+treb_changed; +per_frame_48=wave_mystery=frame%2; +per_pixel_1=grid=pow(x*3,3-q1)%q8 + pow(y*3,3-q3)%q8; +per_pixel_2=bend = sin(x*(9.42-6.28*q2)*bnot(q8%3) +per_pixel_3=+(rad*9.42-6.28*sin(time*(1.3+.3*q1)))*bnot(q8%4)+y*(9.42*q4-6.28*q3)*bnot(q8%5)); +per_pixel_4=zoom = zoom+bend; +per_pixel_5=sx=sx-if(above(q1,2),bnot(grid)*q3*.2,.1*q2*bnot(q8%5)); +per_pixel_6=sy=sy-if(above(q1,3),bnot(grid)*q2*.2,.1*q3*bnot(q8%2)); +per_pixel_7=rot=equal(grid,3)*q3+bnot(grid%q7)*cos(zoom*grid*q1*.01); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Poison.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Poison.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Poison.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Picture Of Poison.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,118 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.997000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.817900 +fWaveScale=0.397105 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995700 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.740601 +rot=-0.760000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.350495 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.500000 +ib_g=0.900000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=31.999994 +nMotionVectorsY=28.799999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=warp=0; +per_frame_2=rot=0; +per_frame_3=old_bass_flop=bass_flop; +per_frame_4=old_treb_flop=treb_flop; +per_frame_5=old_mid_flop=mid_flop; +per_frame_6=chaos=.1+.1*sin(pulse); +per_frame_7=bass_thresh =if(above(bass_att,bass_thresh),3,bass_thresh-chaos); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,3)); +per_frame_9=treb_thresh=if(above(treb_att,treb_thresh),3,treb_thresh-chaos); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,3)); +per_frame_11=mid_thresh=if(above(mid_att,mid_thresh),3,mid_thresh-chaos); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,3)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.032); +per_frame_20=entropy=if(equal(pulse,-3.14),bass_flop+mid_flop+treb_flop+rand(5),entropy); +per_frame_21=q1=mid_residual; +per_frame_22=q2=bass_residual; +per_frame_23=q3=treb_residual; +per_frame_24=q4=sin(pulse); +per_frame_25=q5=cos(pulse*(.5+.1*entropy)); +per_frame_26=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_27=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_28=q8=entropy; +per_frame_29= +per_frame_30=ob_r=.2+.1*sin(time*2.157+q6); +per_frame_31=ob_b=.2+.1*sin(time*1.689+q5); +per_frame_32=ob_g=.2+.1*sin(time*.413+q4); +per_frame_33=ib_r=.8+.2*cos(time*1.2+q1*.1); +per_frame_34=ib_b=.2+.2*cos(time*2.811+q2*.1); +per_frame_35=ib_g=.7+.3*cos(time*1.666+q3*.1); +per_frame_36=ib_size=.03+.02*q2; +per_frame_37=ob_size=.03+.02*sin(time*2.321+q2*.2); +per_frame_38=ob_a=.75+.25*q3; +per_frame_39=ib_a=.8+.2*sin(q2*.3+q4+q1*.5); +per_frame_40=mv_r=mv_r+.5*sin(q4+time*.678); +per_frame_41=mv_b=mv_b+.5*sin(q4+time*.789); +per_frame_42=mv_g=mv_g+.5*sin(q5+time*.456); +per_frame_43=mv_a=.2+.2*sin(time*1.178+q5*1.14); +per_frame_44=wave_r=if(treb_changed,.5+.5*q3,if(bass_changed,.5+.5*q4,1)); +per_frame_45=wave_g=.5+.2*bnot(q8%2)-.2*bnot(q8%3)+.2*bnot(q8%4)-.2*bnot(q8%5); +per_frame_46=wave_b=if(bnot(q8%6),.8+.2*q1,bass_changed*mid_changed); +per_frame_47=wave_mode=q8-bass_changed+mid_changed+treb_changed; +per_frame_48=wave_mystery=frame%2; +per_pixel_1=grid=pow(x*3,3-q1)%q8 + pow(y*3,3-q3)%q8; +per_pixel_2=bend = sin(x*(9.42-6.28*q2)*bnot(q8%3) +per_pixel_3=+(rad*9.42-6.28*sin(time*(1.3+.3*q1)))*bnot(q8%4)+y*(9.42*q4-6.28*q3)*bnot(q8%5)); +per_pixel_4=zoom = zoom+bend*.1; +per_pixel_5=sx=sx-if(above(q1,2),bnot(grid)*q3*.2,.1*q2*bnot(q8%5)); +per_pixel_6=sy=sy-if(above(q1,3),bnot(grid)*q2*.2,.1*q3*bnot(q8%2)); +per_pixel_7=rot=equal(grid,3)*q3+bnot(grid%q7)*cos(zoom*grid*q1*.01); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - ReAwoke.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - ReAwoke.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - ReAwoke.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - ReAwoke.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,269 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999489 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.059269 +fWaveScale=0.653093 +fWaveSmoothing=0.270000 +fWaveParam=-0.380000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.337423 +rot=0.001900 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.500000 +ib_g=0.900000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=1 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.776608 +shapecode_0_ang=0.628319 +shapecode_0_tex_ang=3.141593 +shapecode_0_tex_zoom=0.408391 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=x=.5+.05*q4; +shape_0_per_frame2=y=.5+.05*q5; +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(equal(pulse,-20),1+bass_flop+treb_flop+mid_flop+rand(2),entropy); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid_thresh+treb_thresh)*.018); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse*(.5+.1*entropy)); +per_frame_25=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_26=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_27=q8=entropy; +per_frame_28=ob_r=.2+.1*sin(time*2.157+q6); +per_frame_29=ob_b=.2+.1*sin(time*1.689+q5); +per_frame_30=ob_g=.2+.1*sin(time*.413+q4); +per_frame_31=ib_r=.8+.2*cos(time*1.2+q1*.1); +per_frame_32=ib_b=.2+.2*cos(time*2.811+q2*.1); +per_frame_33=ib_g=.7+.3*cos(time*1.666+q3*.1); +per_frame_34=ib_size=.1+.05*q2; +per_frame_35=ob_size=.03+.02*sin(time*2.321+q2*.2); +per_frame_36=ob_a=.75+.25*q3; +per_frame_37=ib_a=.8+.2*sin(q2*.3+q4+q1*.5); +per_frame_38=mv_r=mv_r+.5*sin(q4+time*.678); +per_frame_39=mv_b=mv_b+.5*sin(q4+time*.789); +per_frame_40=mv_g=mv_g+.5*sin(q5+time*.456); +per_frame_41=mv_a=.2+.2*sin(time*1.178+q5*1.14); +per_frame_42=rot=0; +per_frame_43=wave_r=.6+.4*sin(q1+time*2.183); +per_frame_44=wave_b=.6+.4*sin(q2+time*1.211); +per_frame_45=wave_g=.6+.4*sin(q3+time*1.541); +per_frame_46=wave_mystery=wave_mystery+.5*sin(time*2.18+q6); +per_frame_47=wave_x=wave_x+.3*sin(time*.811)+.005*(frame%3); +per_frame_48=wave_y=wave_y+.3*sin(time*.788)+.005*(frame%3); +per_frame_49=wave_a=3+sin(time*1.414)+q3; +per_frame_50=zoom=zoom+.03*sin(time*.8); +per_frame_51=wave_mode=q8%2; +per_pixel_1=xx=(x-.5+.03*q5+.1*y*q6+.1*sin(time*.322))*2; +per_pixel_2=yy=(y-.5+.03*q6+.1*x*q5+.1*sin(time*.427))*2; +per_pixel_3=dx=sin(xx); +per_pixel_4=dy=sin(yy); +per_pixel_5=radix=if(above(q3,0),min(xx,yy),max(xx,yy)); +per_pixel_6=radix=if(above(q2,0),min(radix,rad),max(radix,rad)); +per_pixel_7=rot=sin(rad*(xx*q4+yy*q5+radix*q6)); +per_pixel_8=cx=cx+xx; +per_pixel_9=cy=cy+yy; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Resistance.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Resistance.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Resistance.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Resistance.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,116 @@ +[preset00] +fRating=2 +fGammaAdj=2 +fDecay=0.99 +fVideoEchoZoom=1 +fVideoEchoAlpha=0 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1 +fWaveScale=0.671653 +fWaveSmoothing=0.75 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1 +fShader=1 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=1 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.95 +wave_y=0.5 +ob_size=0.01 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0 +ib_r=0 +ib_g=0 +ib_b=0 +ib_a=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +mv_dx=0 +mv_dy=0 +mv_l=0.9 +mv_r=1 +mv_g=1 +mv_b=1 +mv_a=0 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(beat); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-3.14),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.052); +per_frame_20=beat=if(above(abs(beat),3.14),-3.14,beat+(bass+treb+mid)*.01); +per_frame_21=q1=mid_residual; +per_frame_22=q2=bass_residual; +per_frame_23=q3=treb_residual; +per_frame_24=q4=sin(pulse); +per_frame_25=q5=sin(beat); +per_frame_26=wave_r=wave_r+.5*bass_residual; +per_frame_27=wave_g=wave_g+.5*mid_residual; +per_frame_28=wave_b=wave_b+.5*treb_residual; +per_frame_29=ob_r=if(bass_flop,treb_changed,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_changed,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_changed,wave_g); +per_frame_32=ob_a=.05+.05*cos(wave_r+pulse*.03); +per_frame_33=ob_size=.2+.2*treb_residual; +per_frame_34=ib_r=if(bass_flop,ob_b,ob_g); +per_frame_35=ib_b=if(treb_flop,ob_g,ob_r); +per_frame_36=ib_g=if(mid_flop,ob_r,ob_b); +per_frame_37=ib_size=ob_size*cos(wave_g+pulse*0.4)*.5; +per_frame_38=mv_a=.5+.5*q5; +per_frame_39=mv_x=abs(beat*10)*entropy; +per_frame_40=mv_y=mv_x; +per_frame_41=mv_r=wave_b; +per_frame_42=mv_b=wave_g; +per_frame_43=mv_g=wave_r; +per_frame_44=wave_x = 0.5+sin(2*time)/8; +per_frame_45=wave_y = 0.5-cos(3*time)/6; +per_frame_46=wave_mystery=q5; +per_pixel_1=shift=q3*.1*mid_att; +per_pixel_2=checkx=bor(above(abs(q1),x)*below(abs(q2),x),above(abs(q2),x)*below(abs(q1),x)); +per_pixel_3=checky=bor(above(abs(q1),y)*below(abs(q2),y),above(abs(q2),y)*below(abs(q1),y)); +per_pixel_4=dx=if(checkx,shift*q4,dx); +per_pixel_5=dy=if(checky,shift*q5,dy); +per_pixel_6=rot=if(checkx*checky,0,shift); +per_pixel_7=zoom=if(above(q5,.8),zoom-shift*.1,if(below(q5,-.8),zoom+shift*.1,zoom)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Ribald Ballad.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Ribald Ballad.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Ribald Ballad.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Ribald Ballad.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,106 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.991000 +fVideoEchoZoom=1.008149 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.160929 +fWaveScale=3.394157 +fWaveSmoothing=0.540000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.772000 +fZoomExponent=1.960000 +fShader=0.070000 +zoom=0.999698 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.513000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.580000 +ib_size=0.015000 +ib_r=0.550000 +ib_g=1.000000 +ib_b=0.499900 +ib_a=1.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-20),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid+thresh+treb_thresh)*.035-(bass+treb+mid)*.01); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=sin(pulse/2); +per_frame_25=wave_r=wave_r+.5*bass_residual; +per_frame_26=wave_r=wave_g+.5*mid_residual; +per_frame_27=wave_r=wave_b+.5*treb_residual; +per_frame_28=wave_mystery=mid_residual; +per_frame_29=ob_r=if(bass_flop,treb_flop,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_flop,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_flop,wave_g); +per_frame_32=ob_a=.05+.05*cos(wave_r+pulse*.03); +per_frame_33=ob_size=.2+.2*treb_residual; +per_frame_34=ib_r=if(bass_flop,ob_b,ob_g); +per_frame_35=ib_b=if(treb_flop,ob_g,ob_r); +per_frame_36=ib_g=if(mid_flop,ob_r,ob_b); +per_frame_37=ib_size=ob_size*cos(wave_g+pulse*0.4)*.5; +per_frame_38=mv_a=.5+.5*q4; +per_frame_39=mv_x=bass_flop*(15+q2*15); +per_frame_40=mv_y=bass_flop*(15+q3*15); +per_frame_41=mv_r=wave_b; +per_frame_42=mv_b=wave_g; +per_frame_43=mv_g=wave_r; +per_frame_44=cx=cx+sin(pulse*q3)*.1; +per_frame_45=cy=cy+sin(pulse*q2)*.1; +per_pixel_1=rot=if(above(q4,0),rad*.2*q5,rot+.3*sin(ang*3.14*(q1+q2+q3))); +per_pixel_2=zoom=if(above(q2,0),zoom-cos(rad*3.14*q2)*.1,if(above(q3,0),1+q1*.05,1+.07*cos(ang*10*q1))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - For The Seagull.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - For The Seagull.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - For The Seagull.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - For The Seagull.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,91 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.980000 +fVideoEchoZoom=0.999838 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=2 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=35.318443 +fWaveScale=0.010000 +fWaveSmoothing=0.792000 +fWaveParam=-1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.970000 +fWarpAnimSpeed=1.444800 +fWarpScale=86.134796 +fZoomExponent=1.030300 +fShader=0.500000 +zoom=0.992400 +rot=0.000000 +cx=1.069900 +cy=1.069999 +dx=0.000000 +dy=0.000000 +warp=1.307431 +sx=1.000000 +sy=1.000000 +wave_r=0.250000 +wave_g=0.260000 +wave_b=0.270000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.500000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.100000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=1.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=1.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_6=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_7=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*0.96+1.3); +per_frame_8=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_9=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*0.96+1.3); +per_frame_10=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_11=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_12=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_13=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_14=pulse=if(above(abs(pulse),20),-20,pulse+.1*bor(bor(bass_changed*bnot(treb_changed),treb_changed*bnot(bass_changed))*bnot(mid_changed),mid_changed))+(bass+mid+treb)*.025; +per_frame_15=wave_b=if(treb_changed,1,if(mid_changed,.45,-.45))*q4; +per_frame_16=wave_g=if(bass_changed,.1,bass_flop); +per_frame_17=wave_r=if(mid_flop,1,.5*q2*treb_flop); +per_frame_18=ib_b=ib_b+.5*sin(pulse); +per_frame_19=ib_g=ib_g+5*sin(pulse*.8); +per_frame_20=ib_r=ib_r+5*sin(pulse*.8); +per_frame_21=ob_b=wave_r; +per_frame_22=ob_g=wave_b; +per_frame_23=ob_r=wave_g; +per_frame_24=wave_mystery=sin(pulse); +per_frame_25=q1=pulse; +per_frame_26=mv_y = 1.25; +per_pixel_1=rot = rot + 0.04*( 0.60*sin(0.381*time) + 0.40*sin(0.579*time) )+ if(above(q1,0),sin(rad)/30,sin(1-rad)/30); +per_pixel_2=zoom = zoom + 0.013*( 0.60*sin(0.339*time) + 0.40*sin(0.276*time) ) + if(above(sin(1.123*time/4),0),sin(1-rad)/40,-sin(rad*q1)/40); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Luckless.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Luckless.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Luckless.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Luckless.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,116 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999400 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.059269 +fWaveScale=0.653093 +fWaveSmoothing=0.270000 +fWaveParam=-0.380000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.619082 +rot=0.001900 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.500000 +ib_g=0.900000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(equal(pulse,-20),1+bass_flop+treb_flop+mid_flop+rand(2),entropy); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid_thresh+treb_thresh)*.018); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse*(.5+.1*entropy)); +per_frame_25=q6=sin(pulse*(.5+pow(.25,entropy))); +per_frame_26=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_27=q8=entropy; +per_frame_28=ob_r=.4+.4*sin(time*2.157+q6); +per_frame_29=ob_b=.8+.2*sin(time*1.689+q5); +per_frame_30=ob_g=.6+.4*sin(time*.413+q4); +per_frame_31=ib_r=.5+.5*cos(time*1.2+q1*.1); +per_frame_32=ib_b=.4+.4*cos(time*2.811+q2*.1); +per_frame_33=ib_g=.4+.4*cos(time*1.666+q3*.1); +per_frame_34=ib_size=.1+.05*q2; +per_frame_35=ob_size=.03+.02*sin(time*2.321+q2*.2); +per_frame_36=ob_a=.6+.4*q3; +per_frame_37=ib_a=.9+.1*sin(q2*.3+q4+q1*.5); +per_frame_38=mv_r=mv_r+.5*sin(q4+time*.678); +per_frame_39=mv_b=mv_b+.5*sin(q4+time*.789); +per_frame_40=mv_g=mv_g+.5*sin(q5+time*.456); +per_frame_41=mv_a=.2+.2*sin(time*1.178+q5*1.14); +per_frame_42=rot=0; +per_frame_43=wave_r=.6+.4*sin(q1+time*2.183); +per_frame_44=wave_b=.6+.4*sin(q2+time*1.211); +per_frame_45=wave_g=.6+.4*sin(q3+time*1.541); +per_frame_46=wave_mystery=wave_mystery+.5*sin(time*2.18+q6); +per_frame_47=wave_x=wave_x+.3*sin(time*.811)+.005*(frame%3); +per_frame_48=wave_y=wave_y+.3*sin(time*.788)+.005*(frame%3); +per_frame_49=wave_a=3+sin(time*1.414)+q3; +per_frame_50=wave_mode=q7; +per_frame_51=zoom=zoom+.1*sin(time*.8); +per_pixel_1=rot = rot + if(below(sin(ang+sin(rad+.5*q4)*5), q6), -rot, 0.5*sin((rad+.5*q1)*4*q5)); +per_pixel_2=zoom=zoom+rot*q3; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Rainbow Obscura.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Rainbow Obscura.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Rainbow Obscura.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Rainbow Obscura.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,78 @@ +[preset00] +fRating=2 +fGammaAdj=2 +fDecay=0.985 +fVideoEchoZoom=1 +fVideoEchoAlpha=0.5 +nVideoEchoOrientation=3 +nWaveMode=4 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1 +fWaveScale=0.040271 +fWaveSmoothing=0.75 +fWaveParam=0 +fModWaveAlphaStart=0.85 +fModWaveAlphaEnd=1.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1 +fShader=0 +zoom=1 +rot=0 +cx=-0.19 +cy=-0.1 +dx=0 +dy=0 +warp=1 +sx=1 +sy=1 +wave_r=0.4 +wave_g=0.4 +wave_b=0.4 +wave_x=0.5 +wave_y=0.5 +ob_size=0.005 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0 +ib_r=0 +ib_g=0 +ib_b=0 +ib_a=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +mv_dx=0 +mv_dy=0 +mv_l=0.9 +mv_r=1 +mv_g=1 +mv_b=1 +mv_a=0 +per_frame_1=warp=0; +per_frame_2=wave_x = 0.01*rand(100); +per_frame_3=wave_r = 1 + sin(-wave_x*3.1415); +per_frame_4=wave_g = abs(sin(2*wave_x*3.1415)); +per_frame_5=wave_b = sin(wave_x*3.1415); +per_frame_6=treb_effect = if(above(treb_att,1.4),pow(0.99,treb_att),1); +per_frame_7=net_effect = if(above(bass_att,0.8*treb_att),1,treb_effect); +per_frame_8=zoom = net_effect; +per_frame_9=rot = rot + rot_residual; +per_frame_10=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_11=shift = (tan(time*7)) -0.05; +per_frame_12=shift = if(above(shift,0),0,if(below(shift,-0.1),-0.1,shift)); +per_frame_13=rot_residual = if(equal(bass_thresh,2),shift,rot_residual); +per_pixel_1=rot = rot + if(equal(sin(ang), 0), -rot, 0.05*sin(rad*4*sin(time*.8))); +per_pixel_2=zoom=zoom+rot*sin(time*2); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Slow Solstice.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Slow Solstice.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Slow Solstice.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Slow Solstice.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,100 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.989000 +fVideoEchoZoom=1.006593 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=7 +bAdditiveWaves=0 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=1 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.089269 +fWaveSmoothing=0.720000 +fWaveParam=-0.360000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.009963 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.999999 +sy=0.999830 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.060000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=3.200000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=chaos=.9+.1*sin(pulse-beat); +per_frame_2=entropy=if(bnot(entropy),2,if(equal(pulse,-20)*above(beat,0),1+rand(5),entropy)); +per_frame_3=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_4=bass_changed=abs(bass_changed-equal(bass_thresh,2)); +per_frame_5=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_6=treb_changed=abs(treb_changed-equal(treb_thresh,2)); +per_frame_7=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_8=mid_changed=abs(mid_changed-equal(mid_thresh,2)); +per_frame_9=pulse=if(above(abs(pulse),20),-20,pulse+(mid+bass+treb)*.025); +per_frame_10=beat=if(above(abs(beat),20),-20,beat+.1*chaos*bor(bor(bass_changed,treb_changed),mid_changed)); +per_frame_11=q3=sin(pulse); +per_frame_12=q2=sin(pulse+beat); +per_frame_13=q4=sin(beat); +per_frame_14=q5=entropy; +per_frame_15=q1=(1+1*above(q2,0))*(1+2*above(q3,0))*(1+4*mid_changed*above(q3,0))*(1+6*above(q4,0))*(1+10*bass_changed*above(q4,0))*(1+12*above(q5,3))*(1+16*treb_changed*above(q2,0)); +per_frame_16=wave_r=.5+.2*bnot(q1%2)-.2*bnot(q1%3)+.3*q3*bnot(q1%13); +per_frame_17=wave_g=.5+.2*bnot(q1%5)-.2*bnot(q1%13)+.3*q4*bnot(q1%7); +per_frame_18=wave_b=if(bnot(q1%6),.8+.2*q4,.5+.5*q2); +per_frame_19=ob_r=ob_r+.2*q2+.3*bnot(q1%13)*q3; +per_frame_20=ob_b=ob_b-.1*bnot(q1%105)-.4*q2; +per_frame_21=ob_g=ob_g+.5*sin(pulse*.4*entropy); +per_frame_22=ob_a=.07+.05*q3; +per_frame_23=ob_size=.01*entropy*bnot(q1%6); +per_frame_24=ib_r=ib_r+.2*q1-.3*bnot(q1%3)*q4; +per_frame_25=ib_b=ib_b-.2*bnot(q1%17)-.3*q2+.2*bnot(q1%11); +per_frame_26=ib_g=ib_g+.5*sin(pulse*.35*entropy); +per_frame_27=ib_a=.07+.05*q3*q4; +per_frame_28=ib_size=.005+.005*q3; +per_frame_29=zoom_fade=if(bnot(q1%2),zoom_fade-(zoom_fade-.92)/2,zoom_fade-bnot(q1%5)*.02*q4+bnot(q1%2)*.02*q3-bnot(q1%11)*.04*q2); +per_frame_30=zoom=zoom_fade; +per_frame_31=rot_fade=if(bnot(q1%7),rot_fade-(rot_fade-.1*q3)/2-.03*bnot(q1%13),rot_fade-.02*bnot(q1%11)+.02*bnot(q1%3)+.03*bnot(q1%35)); +per_frame_32=rot=rot_fade; +per_frame_33=cx=cx+.1*bnot(q1%39)+.07*bnot(q1%13)*q3-.2*bnot(q1%55)*q4; +per_frame_34=wave_x=wave_x+.1*q3+.2*q4*bnot(q1%2); +per_frame_35=wave_mystery=wave_x-.5; +per_pixel_1=zoom = zoom + rad/10 + abs(sin(ang-rad)/10) +q4/10; +per_pixel_2=rot = rot + treb*.001 + sin(treb+rad)/33 -q3/8; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Triptionary.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Triptionary.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Triptionary.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Triptionary.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,107 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.849581 +fWaveScale=7.858094 +fWaveSmoothing=0.360000 +fWaveParam=-0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.650000 +wave_g=0.650000 +wave_b=0.650000 +wave_x=0.500000 +wave_y=0.400000 +ob_size=0.001500 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.017500 +ib_r=1.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(beat); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-3.14),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.052); +per_frame_20=beat=if(above(abs(beat),3.14),-3.14,beat+(bass+treb+mid)*.052); +per_frame_21=q1=mid_residual; +per_frame_22=q2=bass_residual; +per_frame_23=q3=treb_residual; +per_frame_24=q4=sin(pulse); +per_frame_25=q5=sin(beat); +per_frame_26=wave_r=wave_r+.5*bass_residual; +per_frame_27=wave_g=wave_g+.5*mid_residual; +per_frame_28=wave_b=wave_b+.5*treb_residual; +per_frame_29=ob_r=if(bass_flop,treb_flop,wave_r); +per_frame_30=ob_b=if(treb_flop,mid_flop,wave_b); +per_frame_31=ob_g=if(mid_flop,bass_flop,wave_g); +per_frame_32=ob_a=.05+.05*cos(wave_r+pulse*.03); +per_frame_33=ob_size=.2+.2*treb_residual; +per_frame_34=ib_r=if(bass_flop,ob_b,ob_g); +per_frame_35=ib_b=if(treb_flop,ob_g,ob_r); +per_frame_36=ib_g=if(mid_flop,ob_r,ob_b); +per_frame_37=ib_size=ob_size*cos(wave_g+pulse*0.4)*.5; +per_frame_38=mv_a=.5+.5*q5; +per_frame_39=mv_x=abs(beat*10)*entropy; +per_frame_40=mv_y=mv_x; +per_frame_41=mv_r=wave_b; +per_frame_42=mv_b=wave_g; +per_frame_43=mv_g=wave_r; +per_frame_44=wave_x = 0.5+sin(2*time)/8; +per_frame_45=wave_y = 0.5-cos(3*time)/6; +per_frame_46=wave_mystery=q5; +per_pixel_1=zoom = 1- log(sqrt(2)-rad)/20 - 0.1*sin(rad)- 0.09*cos(1-rad); +per_pixel_2=rot = log(sqrt(2)-rad)/3- 0.1*cos(time+rad*0.123) - 0.08*sin(time-(1-rad)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Wormhole Pillars (Hall of Shadows mi.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Wormhole Pillars (Hall of Shadows mi.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Wormhole Pillars (Hall of Shadows mi.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Wormhole Pillars (Hall of Shadows mi.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.438649 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.999996 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.976000 +ob_size=0.005000 +ob_r=0.400000 +ob_g=0.300000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=1.000000 +ib_g=0.600000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = 0.5 + 0.5*sin(time*0.894); +per_frame_3=wave_g = 0.5 + 0.5*sin(time*1.14); +per_frame_4=wave_b = 0.5 + 0.5*sin(3-bass_att); +per_frame_5=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*(0.9+.1*sin(time*2.8))+1.3); +per_frame_6=dx_r = equal(thresh,2)*0.004*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_frame_7=dy_r = equal(thresh,2)*0.004*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_frame_8=q1 = thresh; +per_frame_9=dx = 1.1* dx_r; +per_frame_10=dy = 1.1* dy_r; +per_frame_11=dx = dx + if (above(bass,1.35), 31*dx_r, 0); +per_frame_12=dy = if(above(bass,1.3), 0, dy); +per_frame_13=decay=.995+.004*sin(time*.369)+.001*sin(time*1.54); +per_pixel_1=zoom = zoom -0.01*q1*rad; +per_pixel_2=zoomexp = 1+0.2*(rad-0.2*q1); +per_pixel_3=sx=sx-cos(y*(6.28+3.14*sin(time)))*(.009+.003*sin(time*2.18))*sin(time*.3); +per_pixel_4=rot=sin(x*3.14)*.001*sin(time*.67); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Wormhole Pillars.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Wormhole Pillars.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Wormhole Pillars.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Wormhole Pillars.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,80 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=7 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.438649 +fWaveSmoothing=0.500000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.999996 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.976000 +ob_size=0.005000 +ob_r=0.400000 +ob_g=0.300000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=1.000000 +ib_g=0.600000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = 0.5 + 0.3*sin(time*0.894); +per_frame_3=wave_g = 0.53 + 0.33*sin(time*1.14); +per_frame_4=wave_b = 0.2 + 0.2*(1-bass); +per_frame_5=thresh = above(bass_att,thresh)*2+(1-above(bass_att,thresh))*((thresh-1.3)*(0.9+.1*sin(time*2.8))+1.3); +per_frame_6=dx_r = equal(thresh,2)*0.004*sin(5*time)+(1-equal(thresh,2))*dx_r; +per_frame_7=dy_r = equal(thresh,2)*0.004*sin(6*time)+(1-equal(thresh,2))*dy_r; +per_frame_8=q1 = thresh; +per_frame_9=dx = 1.1* dx_r; +per_frame_10=dy = 1.1* dy_r; +per_frame_11=dx = dx + if (above(bass,1.35), 31*dx_r, 0); +per_frame_12=dy = if(above(bass,1.3), 0, dy); +per_frame_13=decay=.997+.003*sin(time*.369); +per_pixel_1=zoom = zoom -0.01*q1*rad; +per_pixel_2=zoomexp = 1+0.2*(rad-0.2*q1); +per_pixel_3=sx=sx-cos(y*(6.28+3.14*sin(time)))*.005; +per_pixel_4=rot=sin(x*3.14)*.01*q1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Xen Traffic.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Xen Traffic.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Xen Traffic.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained & Rovastar - Xen Traffic.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,110 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.000000 +fDecay=0.975000 +fVideoEchoZoom=0.999993 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.741913 +fWaveScale=0.502368 +fWaveSmoothing=0.360000 +fWaveParam=-0.280000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.942044 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.920000 +ib_size=0.004000 +ib_r=0.400000 +ib_g=0.400000 +ib_b=0.000000 +ib_a=1.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(beat); +per_frame_6=entropy=if(bnot(entropy),2,if(equal(pulse,-3.14),1+rand(3),entropy)); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.052); +per_frame_20=beat=if(above(abs(beat),3.14),-3.14,beat+(bass+treb+mid)*.01); +per_frame_21=q1=mid_residual; +per_frame_22=q2=bass_residual; +per_frame_23=q3=treb_residual; +per_frame_24=q4=sin(pulse); +per_frame_25=q5=sin(beat); +per_frame_26=mv_r=mv_r+.5*bass_residual; +per_frame_27=mv_g=mv_g+.5*mid_residual; +per_frame_28=mv_b=mv_b+.5*treb_residual; +per_frame_29=mv_a=1.1-(ob_a+ib_a)*chaos*.5; +per_frame_30=mv_x=abs(beat*10)*entropy; +per_frame_31=mv_y=abs(pulse*10)*entropy; +per_frame_32=mv_l=entropy*(q4-q5); +per_frame_33=wave_r=0.8+0.2*bass_flop*mv_g; +per_frame_34=wave_g=0.3+0.3*mid_flop*mv_b; +per_frame_35=wave_b=0.4+0.3*0.1*treb_flop*mv_r; +per_frame_36=ob_r=0.1 + 0.1*sin(time*1.143)+0.2*mv_g; +per_frame_37=ob_g=0.3 + 0.3*sin(time*0.897)+0.3*mv_b; +per_frame_38=ob_b=0.2+0.5*mv_r; +per_frame_39=treb_effect = max(max(treb, treb_att)-1.2,0); +per_frame_40=mid_effect = max(max(mid,mid_att)-1.2,0); +per_frame_41=ib_r = 1 - ob_b; +per_frame_42=ib_g = 1- mv_g; +per_frame_43=ib_b = 0.5*mv_b + 0.5*ob_b; +per_frame_44=ib_a = if(above(treb_effect,0), if(above(mid_effect,0),1,0),0); +per_pixel_1=bass_effect = max(max(bass,bass_att)-1.18,0); +per_pixel_2=grid=rad*10%(above(q1,q4)+above(q2,q5)+above(q3,q4)) + (sqrt(2)-rad)*10%(above(q1,q5)+above(q2,q4)+above(q3,q5))*q1; +per_pixel_3=rot=if(grid,.12*cos(rad*3.14+x*q1*3.14+y*q2*3.14)*(q5+q4),0); +per_pixel_4=zoom=zoom-bnot(grid)*atan2(x*q3*3.14,y*q5*3.14)*.14*(x*2-1)+0.12*bass_effect; +per_pixel_5=sx=sx+.2*q1*sin(x*1.6)*-grid; +per_pixel_6=sy=sy+.2*q2*sin(y*1.6)*(1-grid); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Shaping The Grid.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Shaping The Grid.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Shaping The Grid.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Shaping The Grid.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,273 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.985000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=1 +bInvert=0 +fWaveAlpha=0.625316 +fWaveScale=1.187274 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999700 +fShader=0.030000 +zoom=0.960496 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=0.000000 +ib_size=0.500000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.500000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=1 +shapecode_0_textured=0 +shapecode_0_x=0.650000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.605500 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.628319 +shapecode_0_tex_zoom=1.816695 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=1.000000 +shape_0_per_frame1=ang=3.14+3.14*q1; +shape_0_per_frame2=x=.5+.1*q2; +shape_0_per_frame3=y=.5+.1*q3; +shape_0_per_frame4=sides=3+q6; +shape_0_per_frame5=rad=.5+.5*q4; +shape_0_per_frame6=textured=above(q6,3); +shape_0_per_frame7=border_r=1-rad; +shape_0_per_frame8=border_b=rad-.01*sides; +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_init_1=entropy=2; +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.1+.1*sin(pulse); +per_frame_6=bass_thresh =if(above(bass_att,bass_thresh),3,bass_thresh-chaos); +per_frame_7=bass_flop=abs(bass_flop-equal(bass_thresh,3)); +per_frame_8=treb_thresh=if(above(treb_att,treb_thresh),3,treb_thresh-chaos); +per_frame_9=treb_flop=abs(treb_flop-equal(treb_thresh,3)); +per_frame_10=mid_thresh=if(above(mid_att,mid_thresh),3,mid_thresh-chaos); +per_frame_11=mid_flop=abs(mid_flop-equal(mid_thresh,3)); +per_frame_12=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_13=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_14=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_15=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_16=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_17=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_18=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bass_thresh+mid_thresh+treb_thresh)*.032); +per_frame_19=entropy=if(equal(pulse,-3.14),bass_flop+mid_flop+treb_flop+rand(5),entropy); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse/2+q1); +per_frame_25=q6=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_26=q7=entropy; +per_frame_27=q8=sin(q6*q1+q7*q2); +per_frame_28=zoom=zoom+.02*q8; +per_frame_29=wave_mystery=sin(q1+q5); +per_frame_30=wave_r=wave_r+.5*sin(q1+q2*2+q4*2.1); +per_frame_31=wave_b=wave_b+.5*sin(q2+q3*2+q4*2.2); +per_frame_32=wave_g=wave_g+.5*sin(q3+q1*2+q4*2.3); +per_frame_33=ob_r=if(bass_flop,ob_r+.5*sin(q1+q3*1.14+q2),wave_b); +per_frame_34=ob_b=if(treb_flop,ob_b+.5*sin(q2+q1*1.14+q3),wave_g); +per_frame_35=ob_g=if(mid_flop,ob_g+.5*sin(q3+q2*1.14+q1),wave_r); +per_frame_36=ib_r=if(bass_flop,ob_b,ib_r+.5*cos(q5+q1*2.14)); +per_frame_37=ib_b=if(treb_flop,ob_g,ib_b+.5*cos(q5+q2*2.14)); +per_frame_38=ib_g=if(mid_flop,ob_r,ib_g+.5*cos(q5+q3*2.14)); +per_frame_39=mv_r=mv_r+.5*sin(q4+q5*1.14*q1); +per_frame_40=mv_b=mv_b+.5*sin(q4+q5*1.14*q2); +per_frame_41=mv_g=mv_g+.5*sin(q5+q5*1.14*q3); +per_frame_42=ob_a=.25+.25*sin(q2+q3*2.14); +per_frame_43=ib_a=.5+.5*sin(q2*2.14+q3); +per_frame_44=mv_a=mv_a+mv_a*sin(q3*2.14+q2); +per_frame_45=ob_size=.1+.1*sin(q3*3+q1); +per_frame_46=ib_size=ib_size*.5+ib_size*.25*sin(q1*3+q3); +per_frame_47=wave_mode=q6+above(q4,0)+above(q5,0); +per_frame_48=wave_mystery=sin(q3*1.14+q1*1.14+q2); +per_frame_49=mv_l=(q6*q7)*q2; +per_frame_50=wave_x=wave_x+.1*q7*q4; +per_frame_51=wave_y=wave_y+.1*q6*q5; +per_frame_52=mv_x=q6*q7; +per_frame_53=mv_y=q6*q7; +per_frame_54=monitor=q1; +per_pixel_1=grid=(x*q7*3)%2+above(y,.5+.25)*above(q6,4); +per_pixel_2=zoom=zoom+.07*cos(sin(rad*2.14*q3+abs(rad-.1*grid))*2.14+rad*sin(q4*2.14+q1))*bnot(grid); +per_pixel_3=rot=.05*equal(grid,0)*cos(rad*2.14*q2+q3)*(q2+q3); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Subjective Experience Of The Manifold.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Subjective Experience Of The Manifold.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Subjective Experience Of The Manifold.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Subjective Experience Of The Manifold.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,119 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=0.999496 +fVideoEchoAlpha=1.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.059269 +fWaveScale=0.653093 +fWaveSmoothing=0.090000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=5.995790 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.998400 +rot=0.002000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.500000 +ib_g=0.900000 +ib_b=0.500000 +ib_a=1.000000 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=1.000000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(equal(pulse,-20),1+bass_flop+treb_flop+mid_flop+rand(2),entropy); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.6)*chaos+1.6); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.6)*chaos+1.6); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.6)*chaos+1.6); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*3) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*3) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*3) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid_thresh+treb_thresh)*.008); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse*q1); +per_frame_24=q5=cos(pulse/2+q1); +per_frame_25=q6=sin(q1*1.14+q2*1.14+q3*1.14); +per_frame_26=q7=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_27=q8=entropy; +per_frame_28=ob_r=.2+.2*sin(time*2.157); +per_frame_29=ob_b=.2+.2*sin(time*1.689); +per_frame_30=ob_g=.2+.2*sin(time*1.413); +per_frame_31=ib_r=.8+.2*cos(time*1.2+q1*.1); +per_frame_32=ib_b=.2+.2*cos(time*2.811+q2*.1); +per_frame_33=ib_g=.7+.3*cos(time*1.666+q3*.1); +per_frame_34=ib_size=.03+.02*q2; +per_frame_35=ob_size=.03+.02*sin(time*2.321+q2*.2); +per_frame_36=ob_a=.75+.25*q3; +per_frame_37=ib_a=.8+.2*sin(q2*.3+q4+q1*.5); +per_frame_38=mv_r=mv_r+.5*sin(q4+time*.678); +per_frame_39=mv_b=mv_b+.5*sin(q4+time*.789); +per_frame_40=mv_g=mv_g+.5*sin(q5+time*.456); +per_frame_41=mv_a=.2+.2*sin(time*1.178+q5*1.14); +per_frame_42=rot=0; +per_frame_43=echo_zoom=1+.08*q1+.08*q2+.06*q3+.16*cos(time*.681); +per_frame_44=wave_r=.5+.5*sin(q1+time*2.183); +per_frame_45=wave_b=.5+.5*sin(q2+time*1.211); +per_frame_46=wave_g=.5+.5*sin(q3+time*1.541); +per_frame_47=wave_mystery=wave_mystery+.5*sin(time*3+q6); +per_frame_48=wave_x=wave_x+.3*sin(time*.811)+.005*(frame%3); +per_frame_49=wave_y=wave_y+.3*sin(time*.788)+.005*(frame%3); +per_frame_50=wave_mode=q8%3; +per_frame_51=wave_a=3+sin(time*1.414)+q3; +per_pixel_1=xx=x-.5+.03*q5+.1*y*q6+.1*sin(time*.322); +per_pixel_2=yy=y-.5+.03*q6+.1*x*q5+.1*sin(time*.427); +per_pixel_3=dx=sin(xx*2); +per_pixel_4=dy=sin(yy*2); +per_pixel_5=rot=sin(rad*1.4+.3*q4); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unclaimed Wreckage 2 (Shamanic).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unclaimed Wreckage 2 (Shamanic).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unclaimed Wreckage 2 (Shamanic).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unclaimed Wreckage 2 (Shamanic).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,123 @@ +[preset00] +fRating=2 +fGammaAdj=2.05 +fDecay=0.92 +fVideoEchoZoom=0.9998 +fVideoEchoAlpha=0.4999 +nVideoEchoOrientation=1 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.254574 +fWaveScale=0.45029 +fWaveSmoothing=0 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=0.998166 +fShader=0 +zoom=0.879987 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.01 +sx=0.999998 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.005 +ob_r=1 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0.005 +ib_r=0 +ib_g=0 +ib_b=0 +ib_a=0.9 +nMotionVectorsX=24.959999 +nMotionVectorsY=19.199999 +mv_dx=0 +mv_dy=0 +mv_l=0.85 +mv_r=0.4999 +mv_g=0.4999 +mv_b=0.4999 +mv_a=0 +per_frame_1=warp=0; +per_frame_2=le=1+.5+2*sin(bass_att); +per_frame_3=bpulse=band(above(le,bth),above(le-bth,bblock)); +per_frame_4=bblock=le-bth; +per_frame_5=bth=if(above(le,bth),le+114/(le+10)-7.407, +per_frame_6=bth+bth*.07/(bth-12)+below(bth,2.7)*.1*(2.7-bth)); +per_frame_7=bth=if(above(bth,6),6,bth); +per_frame_8=bres=bpulse*sin(pulse+le*.5) + bnot(bpulse)*bres; +per_frame_9= +per_frame_10=le=1+.5+2*sin(treb_att); +per_frame_11=tpulse=band(above(le,tth),above(le-tth,tblock)); +per_frame_12=tblock=le-tth; +per_frame_13=tth=if(above(le,tth),le+114/(le+10)-7.407, +per_frame_14=tth+tth*.07/(tth-12)+below(tth,2.7)*.1*(2.7-tth)); +per_frame_15=tth=if(above(tth,6),6,tth); +per_frame_16=tres=tpulse*sin(pulse+le*.5) + bnot(tpulse)*tres; +per_frame_17= +per_frame_18=le=1+.5+2*sin(mid_att); +per_frame_19=mpulse=band(above(le,mth),above(le-mth,mblock)); +per_frame_20=mblock=le-mth; +per_frame_21=mth=if(above(le,mth),le+114/(le+10)-7.407, +per_frame_22=mth+mth*.07/(mth-12)+below(mth,2.7)*.1*(2.7-mth)); +per_frame_23=mth=if(above(mth,6),6,mth); +per_frame_24=mres=mpulse*sin(pulse+le*.5) + bnot(mpulse)*mres; +per_frame_25= +per_frame_26= +per_frame_27= +per_frame_28=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bth+mth+tth)*.003); +per_frame_29=q1=bres; +per_frame_30=q2=tres; +per_frame_31=q3=mres; +per_frame_32=q4=sin(pulse); +per_frame_33= +per_frame_34=mod_state=(above(q1,0)+above(q2,0)+above(q3,0))*(1+above(q4,0)); +per_frame_35=ccl=ccl+tpulse+mpulse-bpulse; +per_frame_36=q5=cos(pulse*(.5+.1*mod_state)); +per_frame_37=q6=sin(pulse*(.5+pow(.25,mod_state))); +per_frame_38=q7=mod_state; +per_frame_39=q8=ccl; +per_frame_40=ob_r=.5+.5*cos(q1+q7); +per_frame_41=ob_g=.5+.5*cos(q2*3.14+q7); +per_frame_42=ob_b=.5+.5*cos(q3*2+sin(time*.0816)); +per_frame_43=ib_size=.025+.02*q2; +per_frame_44=ob_size=.03+.02*q3-.002*q7; +per_frame_45=wave_r=.5+.5*sin(q1*q7+time*2.183); +per_frame_46=wave_g=.5+.5*sin(q2*3+time*1.211); +per_frame_47=wave_b=.5+.5*sin(q3+time*1.541); +per_frame_48= +per_frame_49=ob_a=.8+.2*q2; +per_pixel_1=snee=bnot(above(sin(ang)-x,.5)*above(q2,0)+above(y-cos(ang),.5)*above(q1,0)); +per_pixel_2=snur=bnot(below(x,.5)*above(q3,0)+below(y,.5)*below(q7,4)); +per_pixel_3=grid=sin(sigmoid(sin(y*6.28*q2),sin(x*6.28*q6))*(10+q7)); +per_pixel_4=rot=bnot(above(x,.5)+((y*q8)%q7)) +per_pixel_5=*cos(rad+3.14*if(above(grid,0),snur,bnot(snur))*(.5+.5*sin(rad*3.14*q1)))*q4; +per_pixel_6=zoom=zoom+.003*sin(rad*2+rad*q2)*sign(snee)-.01*sin(rad*2*q3); +per_pixel_7=rot=if(rot,rot*sign(snur),q6*sign(-snur)); +per_pixel_8=cx=if(below(x,.5)*above(y,.5),.5+.2*q1,.5); +per_pixel_9=cy=if(below(x,.5)*below(y,.5),.5+.2*q3,.5); +per_pixel_10=sx=sx+.17*sin(rad)*q1*grid*(1-abs(rot)); +per_pixel_11=sy=sy+.17*sin(rad)*q2*grid*(1-abs(rot)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unclaimed Wreckage.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unclaimed Wreckage.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unclaimed Wreckage.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unclaimed Wreckage.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,124 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.999000 +fVideoEchoZoom=0.999800 +fVideoEchoAlpha=0.499900 +nVideoEchoOrientation=3 +nWaveMode=1 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.254574 +fWaveScale=0.450290 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=0.183895 +fShader=0.400000 +zoom=1.001507 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999998 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.005000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.900000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +per_frame_1=warp=0; +per_frame_2=le=1+.5+2*sin(bass_att); +per_frame_3=bpulse=band(above(le,bth),above(le-bth,bblock)); +per_frame_4=bblock=le-bth; +per_frame_5=bth=if(above(le,bth),le+114/(le+10)-7.407, +per_frame_6=bth+bth*.07/(bth-12)+below(bth,2.7)*.1*(2.7-bth)); +per_frame_7=bth=if(above(bth,6),6,bth); +per_frame_8=bres=bpulse*sin(pulse+le*.5) + bnot(bpulse)*bres; +per_frame_9= +per_frame_10=le=1+.5+2*sin(treb_att); +per_frame_11=tpulse=band(above(le,tth),above(le-tth,tblock)); +per_frame_12=tblock=le-tth; +per_frame_13=tth=if(above(le,tth),le+114/(le+10)-7.407, +per_frame_14=tth+tth*.07/(tth-12)+below(tth,2.7)*.1*(2.7-tth)); +per_frame_15=tth=if(above(tth,6),6,tth); +per_frame_16=tres=tpulse*sin(pulse+le*.5) + bnot(tpulse)*tres; +per_frame_17= +per_frame_18=le=1+.5+2*sin(mid_att); +per_frame_19=mpulse=band(above(le,mth),above(le-mth,mblock)); +per_frame_20=mblock=le-mth; +per_frame_21=mth=if(above(le,mth),le+114/(le+10)-7.407, +per_frame_22=mth+mth*.07/(mth-12)+below(mth,2.7)*.1*(2.7-mth)); +per_frame_23=mth=if(above(mth,6),6,mth); +per_frame_24=mres=mpulse*sin(pulse+le*.5) + bnot(mpulse)*mres; +per_frame_25= +per_frame_26= +per_frame_27= +per_frame_28=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bth+mth+tth)*.003); +per_frame_29=q1=bres; +per_frame_30=q2=tres; +per_frame_31=q3=mres; +per_frame_32=q4=sin(pulse); +per_frame_33= +per_frame_34=mod_state=(above(q1,0)+above(q2,0)+above(q3,0))*(1+above(q4,0)); +per_frame_35=ccl=ccl+tpulse+mpulse-bpulse; +per_frame_36=q5=cos(pulse*(.5+.1*mod_state)); +per_frame_37=q6=sin(pulse*(.5+pow(.25,mod_state))); +per_frame_38=q7=mod_state; +per_frame_39=q8=ccl; +per_frame_40=ob_r=.5+.5*cos(q1+q7); +per_frame_41=ob_g=.5+.5*cos(q2*3.14+q7); +per_frame_42=ob_b=.5+.5*cos(q3*2+sin(time*.0816)); +per_frame_43=ib_size=.025+.02*q2; +per_frame_44=ob_size=.03+.02*q3-.002*q7; +per_frame_45=wave_r=.5+.5*sin(q1*q7+time*2.183); +per_frame_46=wave_g=.5+.5*sin(q2*3+time*1.211); +per_frame_47=wave_b=.5+.5*sin(q3+time*1.541); +per_frame_48= +per_frame_49=ob_a=.8+.2*q2; +per_frame_50=zoom=.9985; +per_pixel_1=snee=bnot(above(sin(ang)-x,.5)*above(q2,0)+above(y-cos(ang),.5)*above(q1,0)); +per_pixel_2=snur=bnot(below(x,.5)*above(q3,0)+below(y,.5)*below(q7,4)); +per_pixel_3=grid=sin(sigmoid(sin(y*6.28*q2),sin(x*6.28*q6))*(10+q7)); +per_pixel_4=rot=bnot(above(x,.5)+((y*q8)%q7)) +per_pixel_5=*cos(rad+3.14*if(above(grid,0),snur,bnot(snur))*(.5+.5*sin(rad*3.14*q1)))*q4; +per_pixel_6=zoom=zoom+.03*sin(rad*2+rad*q2)*sign(snee)-.06*sin(rad*2*q3); +per_pixel_7=rot=if(rot,rot*sign(snur),q6*sign(-snur)); +per_pixel_8=cx=if(below(x,.5)*below(y,.5),.5+.2*q1,.5); +per_pixel_9=cy=if(below(x,.5)*below(y,.5),.5+.2*q3,.5); +per_pixel_10=sx=sx+.17*sin(rad)*q1*grid; +per_pixel_11=sy=sy+.17*sin(rad)*q2*grid; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unified Drag 2.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unified Drag 2.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unified Drag 2.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Unified Drag 2.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,122 @@ +[preset00] +fRating=2 +fGammaAdj=1 +fDecay=0.96 +fVideoEchoZoom=2.216266 +fVideoEchoAlpha=0.78 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=1 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.254574 +fWaveScale=0.931011 +fWaveSmoothing=0 +fWaveParam=0 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1.0081 +fShader=0.4 +zoom=0.820774 +rot=0 +cx=0.4999 +cy=0.5 +dx=0 +dy=0 +warp=0.01 +sx=0.999998 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.005 +ob_r=1 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0.005 +ib_r=0 +ib_g=0 +ib_b=0 +ib_a=0.9 +nMotionVectorsX=0 +nMotionVectorsY=0 +mv_dx=0 +mv_dy=0 +mv_l=0.85 +mv_r=0.4999 +mv_g=0.4999 +mv_b=0.4999 +mv_a=0 +per_frame_1=warp=0; +per_frame_2=le=1+.5+2*sin(bass_att); +per_frame_3=bpulse=band(above(le,bth),above(le-bth,bblock)); +per_frame_4=bblock=le-bth; +per_frame_5=bth=if(above(le,bth),le+114/(le+10)-7.407, +per_frame_6=bth+bth*.07/(bth-12)+below(bth,2.7)*.1*(2.7-bth)); +per_frame_7=bth=if(above(bth,6),6,bth); +per_frame_8=bres=bpulse*sin(pulse+le*.5) + bnot(bpulse)*bres; +per_frame_9= +per_frame_10=le=1+.5+2*sin(treb_att); +per_frame_11=tpulse=band(above(le,tth),above(le-tth,tblock)); +per_frame_12=tblock=le-tth; +per_frame_13=tth=if(above(le,tth),le+114/(le+10)-7.407, +per_frame_14=tth+tth*.07/(tth-12)+below(tth,2.7)*.1*(2.7-tth)); +per_frame_15=tth=if(above(tth,6),6,tth); +per_frame_16=tres=tpulse*sin(pulse+le*.5) + bnot(tpulse)*tres; +per_frame_17= +per_frame_18=le=1+.5+2*sin(mid_att); +per_frame_19=mpulse=band(above(le,mth),above(le-mth,mblock)); +per_frame_20=mblock=le-mth; +per_frame_21=mth=if(above(le,mth),le+114/(le+10)-7.407, +per_frame_22=mth+mth*.07/(mth-12)+below(mth,2.7)*.1*(2.7-mth)); +per_frame_23=mth=if(above(mth,6),6,mth); +per_frame_24=mres=mpulse*sin(pulse+le*.5) + bnot(mpulse)*mres; +per_frame_25= +per_frame_26= +per_frame_27= +per_frame_28=pulse=if(above(abs(pulse),3.14),-3.14,pulse+(bth+mth+tth)*.003); +per_frame_29=q1=bres; +per_frame_30=q2=tres; +per_frame_31=q3=mres; +per_frame_32=q4=sin(pulse); +per_frame_33= +per_frame_34=mod_state=(above(q1,0)+above(q2,0)+above(q3,0))*(1+above(q4,0)); +per_frame_35=ccl=ccl+tpulse+mpulse-bpulse; +per_frame_36=q5=cos(pulse*(.5+.1*mod_state)); +per_frame_37=q6=sin(pulse*(.5+pow(.25,mod_state))); +per_frame_38=q7=mod_state; +per_frame_39=q8=ccl; +per_frame_40=ob_r=.5+.5*cos(q1+q7); +per_frame_41=ob_g=.5+.5*cos(q2*3.14+q7); +per_frame_42=ob_b=.5+.5*cos(q3*2+sin(time*.0816)); +per_frame_43=ib_size=.025+.02*q2; +per_frame_44=ob_size=.03+.02*q3-.002*q7; +per_frame_45=wave_r=.5+.5*sin(q1*q7+time*2.183); +per_frame_46=wave_g=.5+.5*sin(q2*3+time*1.211); +per_frame_47=wave_b=.5+.5*sin(q3+time*1.541); +per_frame_48= +per_frame_49=ob_a=.8+.2*q2; +per_frame_50=rot=1; +per_frame_51=cx=cx+.05*q4; +per_frame_52=cy=cy+.05*q5; +per_frame_53=zoom=.95+.05*q6; +per_pixel_1=snee=bnot(above(sin(ang)-x,.5)*above(q2,0)+above(y-cos(ang),.5)*above(q1,0)); +per_pixel_2=snur=bnot(below(x,.5)*above(q3,0)+below(y,.5)*below(q7,4)); +per_pixel_3=grid=sin(sigmoid(sin(y*6.28*q2),sin(x*6.28*q6))*(10+q7)); +per_pixel_4=zoom=zoom+.02*cos(rad*2+rad*q2)*sign(snee)-.04*sin(rad*3.14*q3-3.14*cos(rad*3.14*snur-3.14*q6)); +per_pixel_5=sx=if(below(x,.5)*below(y,.5),sx+.2*q4*snur,1+.1*q2*grid); +per_pixel_6=sy=if(below(x,.5)*below(y,.5),sy+.2*q5*snee,1+.1*q2*grid); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - ventilation.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - ventilation.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - ventilation.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - ventilation.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.997000 +fVideoEchoZoom=0.999999 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=0.264000 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.850000 +fModWaveAlphaEnd=1.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=18.423244 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=0.990099 +sy=0.990099 +wave_r=0.400000 +wave_g=0.400000 +wave_b=0.400000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +per_frame_1=warp=0; +per_frame_2=dx=-0.0005; +per_frame_3=dy=-0.0005; +per_frame_4=wave_random = rand(100)/100; +per_frame_5=wave_r = 1 + sin(-wave_random*3.1415); +per_frame_6=wave_g = abs(sin(2*wave_random*3.1415)); +per_frame_7=wave_b = sin(wave_random*3.1415); +per_frame_8=treb_effect = if(above((treb_att*3+mid_att+bass_att)/5,1.4),pow(.99,treb_att),1.03); +per_frame_9=net_effect = if(above(bass_att,0.8*treb_att),1,treb_effect); +per_frame_10=zoom = net_effect; +per_frame_11=rot = rot + rot_residual; +per_frame_12=bass_thresh = 1.3; +per_frame_13=bass_thresh = above((bass_att*3+mid_att+treb_att)/5,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*0.96+1.3); +per_frame_14=shift = (tan(time*7)) -0.05; +per_frame_15=shift = if(above(shift,0),0,if(below(shift,-0.1),-0.1,shift)); +per_frame_16=rot_residual = if(equal(bass_thresh,2),shift,rot_residual); +per_frame_17=timer=sin(time*.888); +per_frame_18=wave_mystery=if(above(timer,0),0,1); +per_frame_19=q1=timer; +per_pixel_1=disk_shift = if(equal(abs(sin(ang)), if(above(q1,0),0,1)), -rot, 0.05); +per_pixel_2=timer=sin(time*1.3); +per_pixel_3=x_or_y=if(above(q1,0),y,x); +per_pixel_4=rot = rot + if(equal(x_or_y*10%2,0),if(below(timer,0),disk_shift,-rot),if(above(timer,0),disk_shift,-rot)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Working the Grid.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Working the Grid.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Working the Grid.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Unchained - Working the Grid.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,120 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=1.000000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.625316 +fWaveScale=1.187274 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=0.999700 +fShader=0.030000 +zoom=0.960496 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.500000 +ob_g=0.500000 +ob_b=0.500000 +ob_a=0.000000 +ib_size=0.500000 +ib_r=0.500000 +ib_g=0.500000 +ib_b=0.500000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.500000 +per_frame_1=warp=0; +per_frame_2=old_bass_flop=bass_flop; +per_frame_3=old_treb_flop=treb_flop; +per_frame_4=old_mid_flop=mid_flop; +per_frame_5=chaos=.9+.1*sin(pulse); +per_frame_6=entropy=if(equal(pulse,-20),1+bass_flop+treb_flop+mid_flop+rand(2),entropy); +per_frame_7=bass_thresh = above(bass_att,bass_thresh)*2 + (1-above(bass_att,bass_thresh))*((bass_thresh-1.3)*chaos+1.3); +per_frame_8=bass_flop=abs(bass_flop-equal(bass_thresh,2)); +per_frame_9=treb_thresh=above(treb_att,treb_thresh)*2 + (1-above(treb_att,treb_thresh))*((treb_thresh-1.3)*chaos+1.3); +per_frame_10=treb_flop=abs(treb_flop-equal(treb_thresh,2)); +per_frame_11=mid_thresh=above(mid_att,mid_thresh)*2 + (1-above(mid_att,mid_thresh))*((mid_thresh-1.3)*chaos+1.3); +per_frame_12=mid_flop=abs(mid_flop-equal(mid_thresh,2)); +per_frame_13=bass_changed=bnot(equal(old_bass_flop,bass_flop)); +per_frame_14=mid_changed=bnot(equal(old_mid_flop,mid_flop)); +per_frame_15=treb_changed=bnot(equal(old_treb_flop,treb_flop)); +per_frame_16=bass_residual = bass_changed*sin(pulse*.1*entropy) + bnot(bass_changed)*bass_residual; +per_frame_17=treb_residual = treb_changed*sin(pulse*.1*entropy) + bnot(treb_changed)*treb_residual; +per_frame_18=mid_residual = mid_changed*sin(pulse*.1*entropy) + bnot(mid_changed)*mid_residual; +per_frame_19=pulse=if(above(abs(pulse),20),-20,pulse+(bass_thresh+mid_thresh+treb_thresh)*.032); +per_frame_20=q1=mid_residual; +per_frame_21=q2=bass_residual; +per_frame_22=q3=treb_residual; +per_frame_23=q4=sin(pulse); +per_frame_24=q5=cos(pulse/2+q1); +per_frame_25=q6=above(q1,0)+above(q2,0)+above(q3,0)+above(q3,0)*treb_flop+above(q2,0)*bass_flop+above(q1,0)*mid_flop; +per_frame_26=q7=entropy; +per_frame_27=q8=sin(q6*q1+q7*q2); +per_frame_28=zoom=zoom+.02*q8; +per_frame_29=wave_mystery=sin(q1+q5); +per_frame_30=wave_r=wave_r+.5*sin(q1+q2*2+q4*2.1); +per_frame_31=wave_b=wave_b+.5*sin(q2+q3*2+q4*2.2); +per_frame_32=wave_g=wave_g+.5*sin(q3+q1*2+q4*2.3); +per_frame_33=ob_r=if(bass_flop,ob_r+.5*sin(q1+q3*1.14+q2),wave_b); +per_frame_34=ob_b=if(treb_flop,ob_b+.5*sin(q2+q1*1.14+q3),wave_g); +per_frame_35=ob_g=if(mid_flop,ob_g+.5*sin(q3+q2*1.14+q1),wave_r); +per_frame_36=ib_r=if(bass_flop,ob_b,ib_r+.5*cos(q5+q1*2.14)); +per_frame_37=ib_b=if(treb_flop,ob_g,ib_b+.5*cos(q5+q2*2.14)); +per_frame_38=ib_g=if(mid_flop,ob_r,ib_g+.5*cos(q5+q3*2.14)); +per_frame_39=mv_r=mv_r+.5*sin(q4+q5*1.14*q1); +per_frame_40=mv_b=mv_b+.5*sin(q4+q5*1.14*q2); +per_frame_41=mv_g=mv_g+.5*sin(q5+q5*1.14*q3); +per_frame_42=ob_a=.25+.25*sin(q2+q3*2.14); +per_frame_43=ib_a=.5+.5*sin(q2*2.14+q3); +per_frame_44=mv_a=mv_a+mv_a*sin(q3*2.14+q2); +per_frame_45=ob_size=.1+.1*sin(q3*3+q1); +per_frame_46=ib_size=ib_size*.5+ib_size*.25*sin(q1*3+q3); +per_frame_47=wave_mode=q6+above(q4,0)+above(q5,0); +per_frame_48=wave_mystery=sin(q3*1.14+q1*1.14+q2); +per_frame_49=mv_l=(q6*q7)*q2; +per_frame_50=wave_x=wave_x+.1*q7*q4; +per_frame_51=wave_y=wave_y+.1*q6*q5; +per_frame_52=mv_x=q6*q7; +per_frame_53=mv_y=q6*q7; +per_pixel_1=grid=(x*q7*3)%2+above(y,.5+.25)*above(q6,4); +per_pixel_2=zoom=zoom+.07*cos(sin(rad*2.14*q3+abs(rad-.1*grid))*2.14+rad*sin(q4*2.14+q1))*bnot(grid); +per_pixel_3=rot=.05*equal(grid,0)*cos(rad*2.14*q2+q3)*(q2+q3); +per_frame_init_1=entropy=2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Aderrasi - Oceanic Bassograph (New Jersey Shore Mix.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Aderrasi - Oceanic Bassograph (New Jersey Shore Mix.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Aderrasi - Oceanic Bassograph (New Jersey Shore Mix.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Aderrasi - Oceanic Bassograph (New Jersey Shore Mix.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.504000 +fDecay=1.000000 +fVideoEchoZoom=2.987781 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=100.000000 +fWaveScale=0.049629 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=0.010000 +fWarpScale=1.000154 +fZoomExponent=1.028415 +fShader=0.800000 +zoom=0.999999 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=0.999999 +sy=1.000000 +wave_r=0.500000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.015000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.500000 +ob_a=0.100000 +ib_size=0.000000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=0.250000 +ib_a=0.200000 +nMotionVectorsX=6.400000 +nMotionVectorsY=4.800000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=3.500000 +mv_r=0.000000 +mv_g=0.000000 +mv_b=1.000000 +mv_a=0.040000 +per_frame_1=wave_x = wave_x +(0.48*sin(4*bass*treb*mid))*sin(time/bass); +per_frame_2=wave_r = if(above((time*20)%2,0),0,wave_r + 0.5*sin(time)); +per_frame_3=wave_b=if(above((time*20)%2,0),1,0); +per_frame_4=rot = rot + 0.0*sin(time); +per_frame_5=decay = + if (above(progress, 0.99), 0.9, 1); +per_frame_6=dy = dy - 0.01 + 0.002*sin(0.01*time); +per_frame_7=ob_r = .1 + if(above(.2*sin(time*.444),0),.3*sin(time*.444),0); +per_frame_8=ob_g =.1 + if(above(.2*sin(time*.777),0),.3*sin(time*.777),0); +per_pixel_1=warp = warp + if (below(y, 0.5), if(below(rad,0.9), +0.4 + 0.2*sin(0.6*time), 0), +0.1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot and Rovastar - Iouo Stone Morphic Fusion.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot and Rovastar - Iouo Stone Morphic Fusion.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot and Rovastar - Iouo Stone Morphic Fusion.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot and Rovastar - Iouo Stone Morphic Fusion.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,79 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.132666 +fWaveSmoothing=0.750000 +fWaveParam=-0.380000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + .2*sin(time*.333)+bass_att*.2; +per_frame_3=wave_g = wave_g + .2*sin(time*.555)+treb_att*.2; +per_frame_4=wave_b = wave_b + .2*sin(time*.444)+mid_att*.2; +per_frame_5=bass_effect = max(max(bass,bass_att)-1.3,0); +per_frame_6=rot = min(if(above(bass_effect,0),bass_effect + 0.2,0),1.8); +per_frame_7=mv_x= 1; +per_frame_8=mv_y =1; +per_frame_9=dx = -0.0005; +per_frame_10=dy = -0.0005; +per_frame_11=mv_l = -25 + rot *500; +per_frame_12=mv_r = 1; +per_frame_13=mv_b = 1-wave_g; +per_frame_14=mv_g = 1-wave_r; +per_frame_15=monitor = rot; +per_pixel_1=dx = dx + (.1*treb_att)*abs(sin(time))*atan(x-.5); +per_pixel_2=dy = dy + (.1*bass_att)*abs(cos(time))*atan(y-.5); +per_pixel_3=zoom = zoom + .05*pow(zoom,2) -0.04; +per_pixel_4=rot = (dx*dy)*100 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Azirphaeli's Mirror.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Azirphaeli's Mirror.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Azirphaeli's Mirror.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Azirphaeli's Mirror.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=4.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=2.163847 +fWaveScale=0.591235 +fWaveSmoothing=0.000000 +fWaveParam=-0.440000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=ob_a = 1; +per_frame_3=ob_r = (bass*.3); +per_pixel_1=zoom = pow(rad+(0&bass*.5),2); +per_pixel_2=zoom = if(below(zoom,.5),.5,zoom); +per_pixel_3=rot = sin(time)*rad; +per_pixel_4=dx = .01*sin(time*.77); +per_pixel_5=dy = .01*cos(time*.33); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Block Of Sound (Abstract Architecture Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Block Of Sound (Abstract Architecture Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Block Of Sound (Abstract Architecture Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Block Of Sound (Abstract Architecture Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,218 @@ +[preset00] +fRating=2 +fGammaAdj=2 +fDecay=0.98 +fVideoEchoZoom=2 +fVideoEchoAlpha=0 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001 +fWaveScale=0.124746 +fWaveSmoothing=0 +fWaveParam=-0.5 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=1 +fZoomExponent=1 +fShader=0 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=1 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.03 +wave_y=0.96 +ob_size=0.01 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=0 +ib_size=0.01 +ib_r=0.25 +ib_g=0.25 +ib_b=0.25 +ib_a=0 +nMotionVectorsX=64 +nMotionVectorsY=2.016 +mv_dx=0 +mv_dy=-0.1 +mv_l=5 +mv_r=0 +mv_g=0 +mv_b=0.7 +mv_a=0 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1 +wavecode_0_smoothing=0.5 +wavecode_0_r=1 +wavecode_0_g=1 +wavecode_0_b=1 +wavecode_0_a=1 +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1 +wavecode_1_smoothing=0.5 +wavecode_1_r=1 +wavecode_1_g=1 +wavecode_1_b=1 +wavecode_1_a=1 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1 +wavecode_2_smoothing=0.5 +wavecode_2_r=1 +wavecode_2_g=1 +wavecode_2_b=1 +wavecode_2_a=1 +shapecode_0_enabled=1 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.5 +shapecode_0_y=0.5 +shapecode_0_rad=0.1 +shapecode_0_ang=0 +shapecode_0_r=0 +shapecode_0_g=0 +shapecode_0_b=0 +shapecode_0_a=0 +shapecode_0_r2=0 +shapecode_0_g2=1 +shapecode_0_b2=0 +shapecode_0_a2=1 +shapecode_0_border_r=1 +shapecode_0_border_g=1 +shapecode_0_border_b=1 +shapecode_0_border_a=1 +shape_0_per_frame1=ang = ang + 10*sin(time*.8); +shape_0_per_frame2=vol = 0.167*(bass+mid+att); +shape_0_per_frame3=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +shape_0_per_frame4=xamp = xamp + 0.5*(xamptarg-xamp); +shape_0_per_frame5=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +shape_0_per_frame6=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +shape_0_per_frame7=xpos = xpos + 0.001*xspeed; +shape_0_per_frame8=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +shape_0_per_frame9=yamp = yamp + 0.5*(yamptarg-yamp); +shape_0_per_frame10=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +shape_0_per_frame11=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +shape_0_per_frame12=ypos = ypos + 0.001*yspeed; +shape_0_per_frame13=x = centerx; +shape_0_per_frame14=y = abs(centery-1); +shape_0_per_frame15=centerx = 1.75*xpos + 0.5; +shape_0_per_frame16=centery = 1.75*ypos + 0.5; +shape_0_per_frame17=r2 = .5+.2*sin(time*.666); +shape_0_per_frame18=g2 = .5+.2*sin(time*.555); +shape_0_per_frame19=b2 = .5+.2*sin(time*.777); +shape_0_per_frame20=rad = rad + bass*.1; +shape_0_per_frame21=border_r = bass*.3; +shape_0_per_frame22=border_g = treb*.3; +shape_0_per_frame23=border_b = mis*.3; +shape_0_per_frame24=r = if(above(bass,1.3),1,0); +shape_0_per_frame25=g = if(above(bass,1.3),1,0); +shape_0_per_frame26=b = if(above(bass,1.3),1,0); +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.5 +shapecode_1_y=0.5 +shapecode_1_rad=0.1 +shapecode_1_ang=0 +shapecode_1_r=1 +shapecode_1_g=0 +shapecode_1_b=0 +shapecode_1_a=1 +shapecode_1_r2=0 +shapecode_1_g2=1 +shapecode_1_b2=0 +shapecode_1_a2=0 +shapecode_1_border_r=1 +shapecode_1_border_g=1 +shapecode_1_border_b=1 +shapecode_1_border_a=0.1 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.5 +shapecode_2_y=0.5 +shapecode_2_rad=0.1 +shapecode_2_ang=0 +shapecode_2_r=1 +shapecode_2_g=0 +shapecode_2_b=0 +shapecode_2_a=1 +shapecode_2_r2=0 +shapecode_2_g2=1 +shapecode_2_b2=0 +shapecode_2_a2=0 +shapecode_2_border_r=1 +shapecode_2_border_g=1 +shapecode_2_border_b=1 +shapecode_2_border_a=0.1 +per_frame_1=warp = 0; +per_frame_2=vol = 0.167*(bass+mid+att); +per_frame_3=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_4=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_5=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_6=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_7=xpos = xpos + 0.001*xspeed; +per_frame_8=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_9=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_10=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_11=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_12=ypos = ypos + 0.001*yspeed; +per_frame_13=wave_x = centerx; +per_frame_14=wave_y = abs(centery-1); +per_frame_15=centerx = 1.75*xpos + 0.5; +per_frame_16=centery = 1.75*ypos + 0.5; +per_frame_17=q1 = centerx; +per_frame_18=q2 = centery; +per_frame_19=q3 = .06 + bass*.04; +per_frame_20=wave_r = bass*.3; +per_frame_21=wave_g = treb*.3; +per_frame_22=wave_b = mid*.3; +per_pixel_1=zoom = if(above(x,q1 - q3),if(below(x,q1 + q3),if(above(y,q2 - q3),if(below(y,q2 + q3),1,.94+ze),.94+ze),.94+ze),.94+ze); +per_pixel_2=zoomerx = if(above(x,q1),.01,-.01); +per_pixel_3=zoomery = if(above(y,q2),.01,-.01); +per_pixel_4=dx = if(above(x,q1 - q3),if(below(x,q1 + q3),if(above(y,q2 - q3),if(below(y,q2 + q3),zoomerx,.7+dxe),.7+dxe),.7+dxe),.7+dxe); +per_pixel_5=dy = if(above(x,q1 - q3),if(below(x,q1 + q3),if(above(y,q2 - q3),if(below(y,q2 + q3),zoomery,.7+dye),.7+dye),.7+dye),.7+dye); +per_pixel_6=dxe = .2 + .2*sin(time*.444); +per_pixel_7=dye = .2+.2*cos(time*.222); +per_pixel_8=ze = .04*sin(time*.777); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Block Of Sound (Fractal Construction Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Block Of Sound (Fractal Construction Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Block Of Sound (Fractal Construction Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Block Of Sound (Fractal Construction Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,93 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.558724 +fWaveScale=0.124746 +fWaveSmoothing=0.000000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.030000 +wave_y=0.960000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=vol = 0.167*(bass+mid+att); +per_frame_3=xamptarg = if(equal(frame%15,0),min(0.5*vol*bass_att,0.5),xamptarg); +per_frame_4=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_5=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_6=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_7=xpos = xpos + 0.001*xspeed; +per_frame_8=yamptarg = if(equal(frame%15,0),min(0.3*vol*treb_att,0.5),yamptarg); +per_frame_9=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_10=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_11=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_12=ypos = ypos + 0.001*yspeed; +per_frame_13=wave_x = centerx; +per_frame_14=wave_y = abs(centery-1); +per_frame_15=centerx = 1.75*xpos + 0.5; +per_frame_16=centery = 1.75*ypos + 0.5; +per_frame_17=q1 = centerx; +per_frame_18=q2 = centery; +per_frame_19=q3 = .06 + bass*.04; +per_frame_20=wave_r = bass*.3; +per_frame_21=wave_g = treb*.3; +per_frame_22=wave_b = mid*.3; +per_pixel_1=zoom = if(above(x,q1 - q3),if(below(x,q1 + q3),if(above(y,q2 - q3),if(below(y,q2 + q3),1,.94+ze),.94+ze),.94+ze),.94+ze); +per_pixel_2=zoomerx = if(above(x,q1),.01,-.01); +per_pixel_3=zoomery = if(above(y,q2),.01,-.01); +per_pixel_4=dx = if(above(x,q1 - q3),if(below(x,q1 + q3),if(above(y,q2 - q3),if(below(y,q2 + q3),zoomerx,.7+dxe),.7+dxe),.7+dxe),.7+dxe); +per_pixel_5=dy = if(above(x,q1 - q3),if(below(x,q1 + q3),if(above(y,q2 - q3),if(below(y,q2 + q3),zoomery,.7+dye),.7+dye),.7+dye),.7+dye); +per_pixel_6=dxe = .2 + .2*sin(time*.444); +per_pixel_7=dye = .2+.2*cos(time*.222); +per_pixel_8=ze = .04*sin(time*.777); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Color Of Music.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Color Of Music.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Color Of Music.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Color Of Music.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.900000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=7.888676 +fWaveScale=2.978922 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.010000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=3.209179 +fWarpScale=0.512473 +fZoomExponent=0.999997 +fShader=0.000000 +zoom=1.104622 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=2.380965 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = bass/5; +per_frame_2=wave_g = treb/5; +per_frame_3=wave_b = time*sin(bass/treb*10); +per_frame_4=wave_x =.4+(((cos(bass)))/2); +per_frame_5=wave_y = .25+((treb/10)); +per_frame_6=warp = warp*(log(.2*time/2))/warp*tan(rand(1)); +per_frame_7=decay = decay + sy; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Crystal Ball (Magical Reaction Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Crystal Ball (Magical Reaction Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Crystal Ball (Magical Reaction Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Crystal Ball (Magical Reaction Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,364 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.000000 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=0.463735 +wavecode_0_smoothing=0.000000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_init1=//pi +wave_0_init2=t8=3.14159265; +wave_0_init3=t5 = 1; +wave_0_per_frame1=rotx = rotx+bass; +wave_0_per_frame2=roty = roty+mid; +wave_0_per_frame3=rotz = rotz+treb; +wave_0_per_frame4=//rotx = 0; +wave_0_per_frame5=//roty =0; +wave_0_per_frame6=//rotz = 0; +wave_0_per_frame7= +wave_0_per_frame8=//convert rotation values from degrees to radians +wave_0_per_frame9=t1= t8*rotx/180; +wave_0_per_frame10=t2 = t8*roty/180; +wave_0_per_frame11=t3 = t8*rotz/180; +wave_0_per_frame12= +wave_0_per_frame13=t4 = 3*sin(time); +wave_0_per_frame14=t5 = 10+8*cos(time); +wave_0_per_frame15= +wave_0_per_frame16=g = 0.5-0.4*cos(time); +wave_0_per_frame17=r = 0.5-0.4*sin(time); +wave_0_per_point1=//Define 3D Shape +wave_0_per_point2= +wave_0_per_point3=//Spiral +wave_0_per_point4=x1 = 0.5*sin(8*t8*sample); +wave_0_per_point5=y1 = 2*(sample-0.5)-value1; +wave_0_per_point6=z1= 0.5*cos(8*t8*sample); +wave_0_per_point7= +wave_0_per_point8=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_0_per_point9=y2 = y1*cos(t1)-z1*sin(t1); +wave_0_per_point10=z2 = y1*sin(t1)+z1*cos(t1); +wave_0_per_point11=x2 = z2*sin(t2)+x1*cos(t2); +wave_0_per_point12=z3 = z2*cos(t2)-x1*sin(t2); +wave_0_per_point13=x3 = x2*cos(t3)-y2*sin(t3); +wave_0_per_point14=y3 = y2*cos(t3)+x2*sin(t3); +wave_0_per_point15=//move resulting shape in 3d space +wave_0_per_point16=x4 = x3+t4; +wave_0_per_point17=y4 = y3; +wave_0_per_point18=z4 = z3+t5; +wave_0_per_point19=//draw 3d shape in 2d +wave_0_per_point20=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_0_per_point21=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_0_per_point22= +wave_0_per_point23=b= r+value1; +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=0.463735 +wavecode_1_smoothing=0.000000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_init1=//pi +wave_1_init2=t8=3.14159265; +wave_1_init3=t5 = 1; +wave_1_per_frame1=rotx = rotx+bass; +wave_1_per_frame2=roty = roty+mid; +wave_1_per_frame3=rotz = rotz+treb; +wave_1_per_frame4=//rotx = 0; +wave_1_per_frame5=//roty =0; +wave_1_per_frame6=//rotz = 0; +wave_1_per_frame7= +wave_1_per_frame8=//convert rotation values from degrees to radians +wave_1_per_frame9=t1= t8*rotx/180; +wave_1_per_frame10=t2 = t8*roty/180; +wave_1_per_frame11=t3 = t8*rotz/180; +wave_1_per_frame12= +wave_1_per_frame13=t4 = 3*sin(time+0.66*t8); +wave_1_per_frame14=t5 = 10+8*cos(time+0.66*t8); +wave_1_per_frame15= +wave_1_per_frame16=b = 0.5-0.4*cos(time+0.66*t8); +wave_1_per_frame17=g = 0.5-0.4*sin(time+0.66*t8); +wave_1_per_point1=//Define 3D Shape +wave_1_per_point2= +wave_1_per_point3=//Sphere +wave_1_per_point4=x1 = (1+value1)*sin(t8*sample)*sin(16*t8*sample); +wave_1_per_point5=y1 = (1+value1)*cos(t8*sample); +wave_1_per_point6=z1= (1+value1)*sin(t8*sample)*cos(16*t8*sample); +wave_1_per_point7= +wave_1_per_point8=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_1_per_point9=y2 = y1*cos(t1)-z1*sin(t1); +wave_1_per_point10=z2 = y1*sin(t1)+z1*cos(t1); +wave_1_per_point11=x2 = z2*sin(t2)+x1*cos(t2); +wave_1_per_point12=z3 = z2*cos(t2)-x1*sin(t2); +wave_1_per_point13=x3 = x2*cos(t3)-y2*sin(t3); +wave_1_per_point14=y3 = y2*cos(t3)+x2*sin(t3); +wave_1_per_point15=//move resulting shape in 3d space +wave_1_per_point16=x4 = x3+t4; +wave_1_per_point17=y4 = y3; +wave_1_per_point18=z4 = z3+t5; +wave_1_per_point19=//draw 3d shape in 2d +wave_1_per_point20=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_1_per_point21=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_1_per_point22= +wave_1_per_point23=r = g+value1; +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=0.463735 +wavecode_2_smoothing=0.000000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_init1=//pi +wave_2_init2=t8=3.14159265; +wave_2_init3=t5 = 1; +wave_2_per_frame1=rotx = rotx+bass; +wave_2_per_frame2=roty = roty+mid; +wave_2_per_frame3=rotz = rotz+treb; +wave_2_per_frame4=//rotx = 0; +wave_2_per_frame5=//roty =0; +wave_2_per_frame6=//rotz = 0; +wave_2_per_frame7= +wave_2_per_frame8=//convert rotation values from degrees to radians +wave_2_per_frame9=t1= t8*rotx/180; +wave_2_per_frame10=t2 = t8*roty/180; +wave_2_per_frame11=t3 = t8*rotz/180; +wave_2_per_frame12= +wave_2_per_frame13=t4 = 3*sin(time+1.33*t8); +wave_2_per_frame14=t5 = 10+8*cos(time+1.33*t8); +wave_2_per_frame15= +wave_2_per_frame16=r = 0.5-0.4*cos(time+1.33*t8); +wave_2_per_frame17=b = 0.5-0.4*sin(time+1.33*t8); +wave_2_per_point1=//Define 3D Shape +wave_2_per_point2= +wave_2_per_point3=//Zylot's dumb 3d wave +wave_2_per_point4=fvar = sample*512; +wave_2_per_point5=svar = fvar/16; +wave_2_per_point6=tvar = 0&svar; +wave_2_per_point7=newsample = tvar/3.2; +wave_2_per_point8=x1 = sin(newsample*3.1415926*2); +wave_2_per_point9=y1 = cos(newsample*3.1415926*2); +wave_2_per_point10=z1 = 0; +wave_2_per_point11= +wave_2_per_point12=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_2_per_point13=y2 = y1*cos(t1)-z1*sin(t1); +wave_2_per_point14=z2 = y1*sin(t1)+z1*cos(t1); +wave_2_per_point15=x2 = z2*sin(t2)+x1*cos(t2); +wave_2_per_point16=z3 = z2*cos(t2)-x1*sin(t2); +wave_2_per_point17=x3 = x2*cos(t3)-y2*sin(t3); +wave_2_per_point18=y3 = y2*cos(t3)+x2*sin(t3); +wave_2_per_point19=//move resulting shape in 3d space +wave_2_per_point20=x4 = x3; +wave_2_per_point21=y4 = y3; +wave_2_per_point22=z4 = z3+5; +wave_2_per_point23=//draw 3d shape in 2d +wave_2_per_point24=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_2_per_point25=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_2_per_point26= +wave_2_per_point27=r = -.5 + sin(sample*5+((time*5)+9)); +wave_2_per_point28=r = if(below(r,0),0,r); +wave_2_per_point29=g = -.5 + sin(sample*5+time*5); +wave_2_per_point30=g = if(below(g,0),0,g); +wave_2_per_point31=b = -.5 + sin(sample*5+((time*5)+18)); +wave_2_per_point32=b = if(below(b,0),0,b); +wave_2_per_point33=r = if(above(bass,1.5),1,r); +wave_2_per_point34=g = if(above(bass,1.5),1,g); +wave_2_per_point35=b = if(above(bass,1.5),1,b); +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=6.530878 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.500000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=1.000000 +shape_0_per_frame1=rad = rad + sin(time); +shape_0_per_frame2=r2 = bass; +shape_0_per_frame3=g2 = treb; +shape_0_per_frame4=b2 = mid; +shape_0_per_frame5=r = if(above(bass+mid+treb/3,6),1,0); +shape_0_per_frame6=g = if(above(bass+mid+treb/3,6),1,0); +shape_0_per_frame7=b = if(above(bass+mid+treb/3,6),1,0); +shapecode_1_enabled=1 +shapecode_1_sides=100 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.022480 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=0.800000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.300000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=rad = .55; +shape_1_per_frame2=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_1_per_frame3=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_1_per_frame4=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_1_per_frame5=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_1_per_frame6=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_1_per_frame7=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shape_1_per_frame8=ang = ang-cos(time*.02); +shape_1_per_frame9=x = .5 + .1*sin(time*.11); +shape_1_per_frame10=y = .5 + .1*sin(time*.51); +shapecode_2_enabled=1 +shapecode_2_sides=100 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.108925 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=0.800000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=0.800000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=rad = .750 + .1*sin(time*.02); +shape_2_per_frame2=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_2_per_frame3=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_2_per_frame4=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_2_per_frame5=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_2_per_frame6=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_2_per_frame7=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shape_2_per_frame8=ang = ang+4*sin(time*.2); +shape_2_per_frame9=x = .5 + .1*cos(time*.11); +shape_2_per_frame10=y = .5 + .1*cos(time*.51); +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=warp=0; +per_frame_2=wave_a=0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - De(-a)range(d)(ment) complex.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - De(-a)range(d)(ment) complex.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - De(-a)range(d)(ment) complex.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - De(-a)range(d)(ment) complex.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.691361 +fWaveScale=3.300357 +fWaveSmoothing=0.819000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.310000 +ob_r=0.300000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=1.488000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = .6+(.3*sin(time)); +per_frame_3=wave_g = .6+(.3*sin(time*.999)); +per_frame_4=wave_b = .6+(.3*sin(time*.777)); +per_pixel_1=dx = if(above(treb,1.4),.01*atan((rad)/.1*sin((x*y)*100000*(.1*sin(time)))),dy); +per_pixel_2=dy = if(above(bass,1.4),.01*atan((rad)/.1*sin((x*y)*100000*(.1*sin(time)))),-dy); +per_pixel_3=zoom = zoom + (dx+dy)*2; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - De(-a)range(d)(ment) strain.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - De(-a)range(d)(ment) strain.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - De(-a)range(d)(ment) strain.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - De(-a)range(d)(ment) strain.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,73 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.691361 +fWaveScale=3.300357 +fWaveSmoothing=0.819000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.310000 +ob_r=0.300000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=1.488000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.500000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = .6+(.3*sin(time)); +per_frame_3=wave_g = .6+(.3*sin(time*.999)); +per_frame_4=wave_b = .6+(.3*sin(time*.777)); +per_pixel_1=dx = if(above(treb,1.4),.01*atan((rad)/.1*sin((x*y)*100000*(.1*sin(time)))),dy); +per_pixel_2=dy = if(above(bass,1.4),.01*atan((rad)/.1*sin((x*y)*100000*(.1*sin(time)))),-dy); +per_pixel_3=zoom = zoom + (dx+dy)*2; +per_pixel_4=rot = if(above(bass,1.5),zoom - 1,-zoom + 1); +per_pixel_5=cx = dy; +per_pixel_6=cy = dx; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Digiscape Advanced Processor.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Digiscape Advanced Processor.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Digiscape Advanced Processor.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Digiscape Advanced Processor.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,52 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.900001 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=5.053452 +fWaveScale=2.448587 +fWaveSmoothing=0.900000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=0.010000 +fWarpScale=0.010000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.499900 +wave_y=0.499900 +per_frame_1=wave_r = wave_r + .3*sin(time*.222); +per_frame_2=wave_g = wave_g + .3*sin(time*.123); +per_frame_3=wave_b = wave_b + .3*sin(time*.444); +per_frame_4=decay = .9 + .1*sin(time*.01); +per_pixel_1=dx = dx - .08*tan(time + (x)*47); +per_pixel_2=dy = .01*sin((-time*.22 + (y+.5))); +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Ether Storm.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Ether Storm.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Ether Storm.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Ether Storm.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,65 @@ +[preset00] +fRating=5.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.958904 +fWaveScale=0.550447 +fWaveSmoothing=0.360000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.310000 +ob_r=0.300000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=dx = dx - .001; +per_frame_2=dy = dy - .001; +per_frame_3=wave_r = wave_r + .5*sin(time*.666); +per_frame_4=wave_g = wave_g + .5*sin(time*.777); +per_frame_5=wave_b = wave_b + .5*sin(time*.888); +per_pixel_1=dx = if(above(y,.7),001.*asin((x-.5)*(y-.7)),dx); +per_pixel_2=dx = if(below(y,.3),001.*-asin((x-.5)*(y-.3)),dx); +per_pixel_3=dy = (y-.5)*.05; +per_pixel_4=warp = dx*50; \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Global Earthquake.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Global Earthquake.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Global Earthquake.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Global Earthquake.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,63 @@ +[preset00] +fRating=5.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.692005 +fWaveSmoothing=0.750000 +fWaveParam=-0.640000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.490000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=dx = dx - .001; +per_frame_2=dy = dy - .001; +per_frame_3=warp = 0; +per_frame_4=wave_r = wave_r + .25*sin(time*.555); +per_frame_5=wave_g = wave_g + .25*cos(time*.888); +per_frame_6=wave_b = wave_b + .25*sin(time); +per_pixel_1=zoom = bass_att*.2 + (3*y)+2*(pow(x,2))*.01; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Idiot - ATan2 Demo (Spiraling Mad Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Idiot - ATan2 Demo (Spiraling Mad Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Idiot - ATan2 Demo (Spiraling Mad Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Idiot - ATan2 Demo (Spiraling Mad Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,68 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1 +fDecay=1 +fVideoEchoZoom=0.9996 +fVideoEchoAlpha=0 +nVideoEchoOrientation=3 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.011566 +fWaveScale=1 +fWaveSmoothing=0.63 +fWaveParam=0 +fModWaveAlphaStart=0.71 +fModWaveAlphaEnd=1.3 +fWarpAnimSpeed=1 +fWarpScale=1.331 +fZoomExponent=1 +fShader=0 +zoom=0.904846 +rot=0.2 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=0.01 +sx=1 +sy=1.000002 +wave_r=1 +wave_g=1 +wave_b=1 +wave_x=0.5 +wave_y=0.5 +ob_size=0.05 +ob_r=1 +ob_g=0 +ob_b=0 +ob_a=1 +ib_size=0.01 +ib_r=0.25 +ib_g=0.25 +ib_b=0.25 +ib_a=1 +nMotionVectorsX=10.240001 +nMotionVectorsY=7.200006 +mv_dx=0 +mv_dy=0.08 +mv_l=0.55 +mv_r=0 +mv_g=1 +mv_b=0 +mv_a=0 +per_frame_1=ob_r=rand(10)*Sin(above(bass,bass_att)); +per_frame_2=ob_g=rand(10)*sin(above(mid,mid_Att)); +per_frame_3=ob_b=rand(10)*Sin(above(treb,treb_Att)); +per_frame_4=zoom = .9+bass*.05; +per_pixel_1=rot=rot*atan2(-rad,sin(ang*10)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Inside The Planar Portal.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Inside The Planar Portal.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Inside The Planar Portal.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Inside The Planar Portal.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=4.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.224799 +fWaveSmoothing=0.750000 +fWaveParam=-0.440000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=mv_l = 5; +per_frame_3=wave_mystery = wave_mystery + bass*.06; +per_frame_4=wave_r = bass*.4; +per_frame_5=wave_g = treb*.4; +per_frame_6=wave_b = mid*.4; +per_pixel_1=basseffect = bass*.03; +per_pixel_2=trebeffect = treb*.03; +per_pixel_3=zoom = if(above(x,.4-trebeffect), if(below(x,.6+trebeffect), if(above(y,.4-basseffect), if(below(y,.6+basseffect),1.04,.6),.6),.6),.6); +per_pixel_4=dx = if(above(x,.4-trebeffect), if(below(x,.6+trebeffect), if(above(y,.4-basseffect), if(below(y,.6+basseffect),0,.5),.5),.5),.5); +per_pixel_5=dy = if(above(x,.4-trebeffect), if(below(x,.6+trebeffect), if(above(y,.4-basseffect), if(below(y,.6+basseffect),0,1),1),1),1); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Krash - Extremophile.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Krash - Extremophile.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Krash - Extremophile.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Krash - Extremophile.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,115 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.700000 +fDecay=0.997000 +fVideoEchoZoom=1.000224 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=1 +nWaveMode=6 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=1 +bInvert=0 +fWaveAlpha=1.003100 +fWaveScale=1.004873 +fWaveSmoothing=0.000000 +fWaveParam=0.000000 +fModWaveAlphaStart=1.010000 +fModWaveAlphaEnd=1.010000 +fWarpAnimSpeed=0.999994 +fWarpScale=1.002083 +fZoomExponent=0.627608 +fShader=1.000000 +zoom=0.994800 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.010000 +dy=0.010000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.000000 +wave_b=0.000000 +wave_x=0.000000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.029900 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=0.000000 +nMotionVectorsY=0.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +per_frame_1=volume = 0.3*(bass+mid+att); +per_frame_2=beatrate = equal(beatrate,0) + (1-equal(beatrate,0))*(below(volume,0.01) + (1-below(volume,0.01))*beatrate); +per_frame_3=lastbeat = lastbeat + equal(lastbeat,0)*time; +per_frame_4=meanbass_att = 0.1*(meanbass_att*9 + bass_att); +per_frame_5=peakbass_att = max(bass_att,peakbass_att); +per_frame_6=beat = above(volume,0.8)*below(peakbass_att - bass_att, 0.05*peakbass_att)*above(time - lastbeat, 0.1 + 0.5*(beatrate - 0.1)); +per_frame_7=beatrate = max(if(beat,if(below(time-lastbeat,2*beatrate),0.1*(beatrate*9 + time - lastbeat),beatrate),beatrate),0.1); +per_frame_8=peakbass_att = beat*bass_att + (1-beat)*peakbass_att*(above(time - lastbeat, 2*beatrate)*0.95 + (1-above(time - lastbeat, 2*beatrate))*0.995); +per_frame_9=lastbeat = beat*time + (1-beat)*lastbeat; +per_frame_10=peakbass_att = max(peakbass_att,1.1*meanbass_att); +per_frame_11=xamptarg = if(equal(frame%15,0),min(0.25*volume*bass_att,0.5),xamptarg); +per_frame_12=xamp = xamp + 0.5*(xamptarg-xamp); +per_frame_13=xdir = if(above(abs(xpos),xamp),-sign(xpos),if(below(abs(xspeed),0.1),2*above(xpos,0)-1,xdir)); +per_frame_14=xspeed = xspeed + xdir*xamp - xpos - xspeed*0.055*below(abs(xpos),xamp); +per_frame_15=xpos = xpos + 0.001*xspeed; +per_frame_16=wave_x = 1.5*xpos + 0.5; +per_frame_17=yamptarg = if(equal(frame%15,0),min(0.15*volume*treb_att,0.5),yamptarg); +per_frame_18=yamp = yamp + 0.5*(yamptarg-yamp); +per_frame_19=ydir = if(above(abs(ypos),yamp),-sign(ypos),if(below(abs(yspeed),0.1),2*above(ypos,0)-1,ydir)); +per_frame_20=yspeed = yspeed + ydir*yamp - ypos - yspeed*0.055*below(abs(ypos),yamp); +per_frame_21=ypos = ypos + 0.001*yspeed; +per_frame_22=mode = if(beat,rand(2),mode); +per_frame_23=q1 = (25+15*sin(time*1.56) + 10*sin(time*0.643))*0.08; +per_frame_24=q2 = 1 - mode*2; +per_frame_25=red=if(below(frame%6,3),bass*0.5,0); +per_frame_26=blue=if(above(frame%6,2),bass*0.5,0); +per_frame_27=green=0.9+sin(time)*0.1; +per_frame_28=q3 = 3 + sin(time*0.496) + sin(time*0.591); +per_frame_29=mode2 = frame%2; +per_frame_30=wave_r = if(mode2,red,green); +per_frame_31=wave_g = if(mode2,green,0.5*blue); +per_frame_32=wave_b = if(mode2,blue,red); +per_frame_33=wave_mode = if(mode2,6,0); +per_frame_34=wave_x = if(mode2,0,0.5 + xpos + 0.1*sin(time)); +per_frame_35=wave_y = if(mode2,0.5,0.5+ ypos + 0.1*cos(time)); +per_frame_36=q4 = 0.5 + xpos + 0.18*sin(time); +per_frame_37=q5 = 0.5 - ypos - 0.18*cos(time); +per_frame_38=wave_mystery = if(mode2,0,-0.4); +per_frame_39=wave_r=abs(wave_r-my_rand); +per_frame_40=wave_b=abs(wave_b-my_rand); +per_frame_41=wave_g=abs(wave_g-my_rand); +per_pixel_1=dx = dx*pow(-1,0&(13+q1 - 2*(q2*y)))*min(0.5*bass,1.2); +per_pixel_2=dy = dy*pow(-1,0&(13+q1 - 5*(x*q3)))*min(0.5*bass,1.2)-0.01; +per_pixel_3=newx = x - q4; +per_pixel_4=newy = y - q5; +per_pixel_5=newrad = min(sqrt((newx)*(newx)+0.5625*(newy)*(newy))*2,1); +per_pixel_6=newzoom = pow(1.03, pow(0.01+sin(newrad*newrad), newrad*2-1)); +per_pixel_7=dx = (min(5*newrad,1)*dx + max(1 - newrad*5,0)*((newx)*newzoom - newx*bass)); +per_pixel_8=dy = (min(5*newrad,1)*dy + max(1 - newrad*5,0)*((newy)*newzoom - newy*treb)); +per_pixel_9=sy=sy+above(x,.5)*sin(rad*q5*1.68*mid)*.8; +per_pixel_10=zoom=zoom-.04*sin((x-.5)*8+q4)*sin(y*31.4+q3*sin(bass+ang*treb+time)); +per_frame_init_1=my_rand=abs(sin(rand(500))); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - light of the path.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - light of the path.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - light of the path.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - light of the path.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,65 @@ +[preset00] +fRating=5.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=3 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.000000 +fWaveSmoothing=0.750000 +fWaveParam=-0.440000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.070000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +per_frame_1=dx = dx - .001; +per_frame_2=dy = dy - .001; +per_frame_3=warp = 0; +per_frame_4=wave_r = wave_r + .2*sin(time*1.33)+bass*.3; +per_frame_5=wave_g = wave_g + .2*sin(time)+treb*.3; +per_frame_6=wave_b = wave_b + .2*sin(time*.988)+mid*.3; +per_pixel_1=zoomlv = .1*sin(ang*1000+time)+.05; +per_pixel_2=zoom = zoom + zoomlv; +per_pixel_3=dx = zoomlv; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Mixing Pot.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Mixing Pot.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Mixing Pot.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Mixing Pot.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,60 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=1.000000 +fWaveSmoothing=0.720000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999963 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=0.999831 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + .255*sin(time*.366); +per_frame_3=wave_g = wave_g + .255*sin(time*.222); +per_frame_4=wave_b = wave_b + .255*sin(time*.288); +per_frame_5=wave_r = wave_r + bass*.3; +per_frame_6=wave_g = wave_g + treb*.3; +per_frame_7=wave_b = wave_b + mid*.3; +per_frame_8=zoom = zoom + .01 + .1*sin(time); +per_frame_9=zoom = zoom - bass*.1; +per_frame_10=cx = cx + .1*sin(time*.111); +per_frame_11=cy = cy + .1*sin(time*.222); +per_pixel_1=zoom = zoom + abs(x-.5); +per_pixel_2=zoom = zoom + abs(x-.5); +per_pixel_3=rot = .2*sin(rad*(2 - 10*sin(time))-time*4); +fRating=3.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Mstress - Celebrate.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Mstress - Celebrate.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Mstress - Celebrate.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Mstress - Celebrate.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,83 @@ +[preset00] +fRating=4.000000 +fGammaAdj=1.998000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=5 +bAdditiveWaves=1 +bWaveDots=1 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.179297 +fWaveScale=0.472722 +fWaveSmoothing=0.027000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.019934 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.770000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.420000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = min(1,max(0,0.2*bass)); +per_frame_2=wave_g = min(1,max(0,0.2*mid)); +per_frame_3=wave_b = min(1,max(0,0.2*treb)); +per_frame_4=xpos = 0.01*rand(80); +per_frame_5=yspos = 0.01*rand(80); +per_frame_6=ypos = max(0,bass_att-0.3)/2; +per_frame_7=wave_x = wave_x + xpos - 0.4; +per_frame_8=wave_y = wave_y + (min(yspos-0.4,0.9)); +per_frame_9=decay = min(decay+ 0.016*((treb + mid + bass)/3),1); +per_frame_10=bass_trig = max(bass_att-1.2,0); +per_frame_11=zoom = zoom + 0.04 * (0.3+sin(time*0.3+(bass_trig*6))) ; +per_frame_12=dy = dy +(sin(time*0.2))*0.9*(.015+((abs(zoom)-1)*10)*.02); +per_frame_13=dx = dx +(sin(time*0.5))*0.9*(.015+((abs(zoom)-1)*10)*.02); +per_frame_14=rot = rot +(if(above(bass_trig,0),rand(10)-5,0)*0.1)*bass*.5; +per_frame_15=monitor = rot; +per_pixel_1=mrad = sqr(pow(x-(0.5-(sin(time*0.5)*0.5)),2)+pow(y-(0.5-(sin(time*0.2)*0.5)),2))*sqr(2); +per_pixel_2=//dy = dy +(sin(time*0.2))*0.5*(.015+(y+sin(time*0.2)*0.5*((zoom-1)*10))*.01); +per_pixel_3=//dx = dx +(sin(time*0.5))*0.5*(.015+(x+sin(time*0.5)*0.5*((zoom-1)*10))*.01); +per_pixel_4=zoom = zoom +(.01 + (mrad *0.05*prova)); +per_pixel_5=prova = 0.13 * max(bass_att-1.3,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Mstress - Toxic Storm On Acid Sea (The End Of The W.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Mstress - Toxic Storm On Acid Sea (The End Of The W.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Mstress - Toxic Storm On Acid Sea (The End Of The W.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Mstress - Toxic Storm On Acid Sea (The End Of The W.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,88 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.998000 +fDecay=0.990000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=1 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.051300 +fWaveScale=2.778365 +fWaveSmoothing=0.900000 +fWaveParam=-0.799999 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=2.853000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.001829 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.770000 +wave_g=0.600000 +wave_b=0.600000 +wave_x=0.420000 +wave_y=0.500000 +ob_size=0.005500 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.520000 +ob_a=0.180000 +ib_size=0.000500 +ib_r=0.291000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=2.400000 +mv_dx=0.000000 +mv_dy=-0.100000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=wave_r = min(1,max(0,0.2*bass)); +per_frame_2=wave_g = min(1,max(0,0.2*mid)); +per_frame_3=wave_b = min(1,max(0,0.2*treb)); +per_frame_4=xpos = 0.01*rand(100); +per_frame_5=wave_x = xpos; +per_frame_6=decay = .99; +per_frame_7= +per_frame_8=//Thanks to Zylot for rainbow generator +per_frame_9=counter1 = if(equal(counter2,1),if(equal(counter1,1),0,counter1+.2),1); +per_frame_10=counter2 = if(equal(counter1,1),if(equal(counter2,1),0,counter2+.2),1); +per_frame_11=cdelay1 = if(equal(cdelay2,1),1,if(equal(colorcounter%2,1),if(equal(counter1,1),2 ,0), if(equal(counter2,1),2,0))); +per_frame_12=cdelay2 = if(equal(cdelay1,2),1,0); +per_frame_13=colorcounter = if(above(colorcounter,7),0,if(equal(cdelay1,1),colorcounter+1,colorcounter)); +per_frame_14=ob_r = .5*if(equal(colorcounter,1),1, if(equal(colorcounter,2),1, if(equal(colorcounter,3),1, if(equal(colorcounter,4),sin(counter2+2.1), if(equal(colorcounter,5),0, if(equal(colorcounter,6),0,sin(counter1))))))); +per_frame_15=ob_g = .5*if(equal(colorcounter,1),0, if(equal(colorcounter,2),sin(counter2*.5), if(equal(colorcounter,3),sin((counter1+1.75)*.4), if(equal(colorcounter,4),1, if(equal(colorcounter,5),1, if(equal(colorcounter,6),sin(counter2+2),0)))))); +per_frame_16=ob_b = if(equal(colorcounter,1),sin(counter1+2.1), if(equal(colorcounter,2),0, if(equal(colorcounter,3),0, if(equal(colorcounter,4),0, if(equal(colorcounter,5),sin(counter1), if(equal(colorcounter,6),1,1)))))); +per_frame_17= +per_frame_18=q3=10+bass+mid+treb; +per_pixel_1=empty = 1-(above(x,.97)*below(y,.46)); +per_pixel_2=sea=q3; +per_pixel_3=mang=atan((-0.5+0.1*sin(time)+y)/(-1+x*3))-.65+.20*sin(time); +per_pixel_4=cx = int(x*sea)/sea; +per_pixel_5=cy = int(y*sea)/sea; +per_pixel_6=rot = rot+.2*(bass_att)*empty-.3*(1-2*below(2*sin(mang)+2*cos(mang),.2*bass))*empty; +per_pixel_7=dy = dy +sin(time*.3)*.01*cos(rad/x); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Puddle Of Music.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Puddle Of Music.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Puddle Of Music.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Puddle Of Music.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,86 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.958904 +fWaveScale=0.010000 +fWaveSmoothing=0.360000 +fWaveParam=-0.380000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.030000 +ob_r=0.200000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.000000 +mv_r=0.000000 +mv_g=0.700000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=counter1 = if(equal(counter2,1),if(equal(counter1,1),0,counter1+.02),1); +per_frame_3=counter2 = if(equal(counter1,1),if(equal(counter2,1),0,counter2+.02),1); +per_frame_4=cdelay1 = if(equal(cdelay2,1),1,if(equal(colorcounter%2,1),if(equal(counter1,1),2 ,0), if(equal(counter2,1),2,0))); +per_frame_5=cdelay2 = if(equal(cdelay1,2),1,0); +per_frame_6=colorcounter = if(above(colorcounter,7),0,if(equal(cdelay1,1),colorcounter+1,colorcounter)); +per_frame_7=q1 = counter1; +per_frame_8=q2 = counter2; +per_frame_9=q3 = colorcounter; +per_frame_10=monitor = colorcounter; +per_frame_11=wave_r = bass*.4; +per_frame_12=wave_g = treb*.4; +per_frame_13=wave_b = mid*.4; +per_frame_14=wave_a = bass; +per_frame_15=wave_mystery = -.5+bass*.1; +per_pixel_1=zoom = if(equal(q3,0),1+.4*sin(q2)*rad,if(below(q3,6),1+rad*.4,if(equal(q3,6),1+.4*sin(q2+2)*rad,1))); +per_pixel_2=rot = if(below(q3,4),0,if(equal(q3,4),(.2*sin(q2)*zoom),if(below(q3,7),.2*zoom,(.2*sin(q1+2))*zoom))); +per_pixel_3=zoom = zoom + sin((0&bass)*(rad*10*treb))*.1; +per_frame_init_1=colorcounter = 1; +per_frame_init_2=counter1 = 0; +per_frame_init_3=counter2 = 1; +per_frame_init_4=cdelay1 = 0; +per_frame_init_5=cdelay2 = 0; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Rainbow Planet Under Attack.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Rainbow Planet Under Attack.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Rainbow Planet Under Attack.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Rainbow Planet Under Attack.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,74 @@ +[preset00] +fRating=2.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=1 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.692005 +fWaveSmoothing=0.750000 +fWaveParam=-0.640000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.490000 +ob_size=0.005000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + .25*sin(time*.555); +per_frame_3=wave_g = if(above(frame%2,0),wave_b + .25*cos(time*.888),0); +per_frame_4=wave_b = if(above(frame%2,0),wave_b + .25*sin(time),0); +per_frame_5=wave_mode = 2*above(frame%2,0); +per_frame_6=wave_x = if(above(frame%2,0),wave_x,rand(100)*.01); +per_frame_7=wave_y = if(above(frame%2,0),wave_y,(rand(30)+70)*.01); +per_pixel_1=zoom = bass_att*.2 + (3*y)+2*(pow(x,2))*.01; +per_pixel_2=zoom = if(below(zoom,1),.995,zoom); +per_pixel_3=dx = if(below(zoom,1),(rand(100)-50)*.0003,0); +per_pixel_4=dy = if(below(zoom,1),(rand(100)-50)*.0003,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Rovastar - Crystal Ball (Cerimonial Decor Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Rovastar - Crystal Ball (Cerimonial Decor Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Rovastar - Crystal Ball (Cerimonial Decor Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot & Rovastar - Crystal Ball (Cerimonial Decor Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,381 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=0.999838 +fVideoEchoAlpha=0.500000 +nVideoEchoOrientation=3 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.000000 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.000000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=0.463735 +wavecode_0_smoothing=0.000000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_init1=//pi +wave_0_init2=t8=3.14159265; +wave_0_init3=t5 = 1; +wave_0_per_frame1=rotx = rotx+bass; +wave_0_per_frame2=roty = roty+mid; +wave_0_per_frame3=rotz = rotz+treb; +wave_0_per_frame4=//rotx = 0; +wave_0_per_frame5=//roty =0; +wave_0_per_frame6=//rotz = 0; +wave_0_per_frame7= +wave_0_per_frame8=//convert rotation values from degrees to radians +wave_0_per_frame9=t1= t8*rotx/180; +wave_0_per_frame10=t2 = t8*roty/180; +wave_0_per_frame11=t3 = t8*rotz/180; +wave_0_per_frame12= +wave_0_per_frame13=t4 = 3*sin(time); +wave_0_per_frame14=t5 = 10+8*cos(time); +wave_0_per_frame15= +wave_0_per_frame16=g = 0.5-0.4*cos(time); +wave_0_per_frame17=r = 0.5-0.4*sin(time); +wave_0_per_point1=//Define 3D Shape +wave_0_per_point2= +wave_0_per_point3=//Spiral +wave_0_per_point4=x1 = 0.5*sin(8*t8*sample); +wave_0_per_point5=y1 = 2*(sample-0.5)-value1; +wave_0_per_point6=z1= 0.5*cos(8*t8*sample); +wave_0_per_point7= +wave_0_per_point8=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_0_per_point9=y2 = y1*cos(t1)-z1*sin(t1); +wave_0_per_point10=z2 = y1*sin(t1)+z1*cos(t1); +wave_0_per_point11=x2 = z2*sin(t2)+x1*cos(t2); +wave_0_per_point12=z3 = z2*cos(t2)-x1*sin(t2); +wave_0_per_point13=x3 = x2*cos(t3)-y2*sin(t3); +wave_0_per_point14=y3 = y2*cos(t3)+x2*sin(t3); +wave_0_per_point15=//move resulting shape in 3d space +wave_0_per_point16=x4 = x3+t4; +wave_0_per_point17=y4 = y3; +wave_0_per_point18=z4 = z3+t5; +wave_0_per_point19=//draw 3d shape in 2d +wave_0_per_point20=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_0_per_point21=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_0_per_point22= +wave_0_per_point23=b= r+value1; +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=0.463735 +wavecode_1_smoothing=0.000000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_init1=//pi +wave_1_init2=t8=3.14159265; +wave_1_init3=t5 = 1; +wave_1_per_frame1=rotx = rotx+bass; +wave_1_per_frame2=roty = roty+mid; +wave_1_per_frame3=rotz = rotz+treb; +wave_1_per_frame4=//rotx = 0; +wave_1_per_frame5=//roty =0; +wave_1_per_frame6=//rotz = 0; +wave_1_per_frame7= +wave_1_per_frame8=//convert rotation values from degrees to radians +wave_1_per_frame9=t1= t8*rotx/180; +wave_1_per_frame10=t2 = t8*roty/180; +wave_1_per_frame11=t3 = t8*rotz/180; +wave_1_per_frame12= +wave_1_per_frame13=t4 = 3*sin(0.66*t8); +wave_1_per_frame14=t5 = 10+8*cos(0.66*t8); +wave_1_per_point1=//Define 3D Shape +wave_1_per_point2= +wave_1_per_point3=//Sphere +wave_1_per_point4=fvar = sample*512; +wave_1_per_point5=svar = fvar/32; +wave_1_per_point6=tvar = 0&svar; +wave_1_per_point7=nsample = tvar*3.5; +wave_1_per_point8=x1 = (1)*sin(nsample+value1*5); +wave_1_per_point9=y1 = (4)*cos(sample*t8*2); +wave_1_per_point10=z1= (4)*sin(sample*(t8*2)); +wave_1_per_point11= +wave_1_per_point12=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_1_per_point13=y2 = y1*cos(t1)-z1*sin(t1); +wave_1_per_point14=z2 = y1*sin(t1)+z1*cos(t1); +wave_1_per_point15=x2 = z2*sin(t2)+x1*cos(t2); +wave_1_per_point16=z3 = z2*cos(t2)-x1*sin(t2); +wave_1_per_point17=x3 = x2*cos(t3)-y2*sin(t3); +wave_1_per_point18=y3 = y2*cos(t3)+x2*sin(t3); +wave_1_per_point19=//move resulting shape in 3d space +wave_1_per_point20=x4 = x3; +wave_1_per_point21=y4 = y3; +wave_1_per_point22=z4 = z3+10; +wave_1_per_point23=//draw 3d shape in 2d +wave_1_per_point24=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_1_per_point25=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_1_per_point26= +wave_1_per_point27=r = sin(nsample); +wave_1_per_point28=g = -.1+cos(sample*5+(time*5)); +wave_1_per_point29=b = -.1-sin(sample*5+(time*5)); +wave_1_per_point30=g = if(below(g,0),0,g); +wave_1_per_point31=b = if(below(b,0),0,b); +wavecode_2_enabled=1 +wavecode_2_samples=48 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=0.463735 +wavecode_2_smoothing=0.000000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_init1=//pi +wave_2_init2=t8=3.14159265; +wave_2_init3=t5 = 1; +wave_2_per_frame1=rotx = rotx+bass; +wave_2_per_frame2=roty = roty+mid; +wave_2_per_frame3=rotz = rotz+treb; +wave_2_per_frame4=//rotx = 0; +wave_2_per_frame5=//roty =0; +wave_2_per_frame6=//rotz = 0; +wave_2_per_frame7= +wave_2_per_frame8=//convert rotation values from degrees to radians +wave_2_per_frame9=t1= t8*rotx/180; +wave_2_per_frame10=t2 = t8*roty/180; +wave_2_per_frame11=t3 = t8*rotz/180; +wave_2_per_frame12= +wave_2_per_frame13=t4 = 3*sin(time+1.33*t8); +wave_2_per_frame14=t5 = 10+8*cos(time+1.33*t8); +wave_2_per_frame15= +wave_2_per_frame16=r = 0.5-0.4*cos(time+1.33*t8); +wave_2_per_frame17=b = 0.5-0.4*sin(time+1.33*t8); +wave_2_per_point1=//Define 3D Shape +wave_2_per_point2= +wave_2_per_point3=//Zylot's dumb 3d wave +wave_2_per_point4=fvar = sample*512; +wave_2_per_point5=svar = fvar/16; +wave_2_per_point6=tvar = 0&svar; +wave_2_per_point7=newsample = tvar/3.2; +wave_2_per_point8=x1 = sin(newsample*3.1415926*2); +wave_2_per_point9=y1 = cos(newsample*3.1415926*2); +wave_2_per_point10=z1 = 0; +wave_2_per_point11= +wave_2_per_point12=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_2_per_point13=y2 = y1*cos(t1)-z1*sin(t1); +wave_2_per_point14=z2 = y1*sin(t1)+z1*cos(t1); +wave_2_per_point15=x2 = z2*sin(t2)+x1*cos(t2); +wave_2_per_point16=z3 = z2*cos(t2)-x1*sin(t2); +wave_2_per_point17=x3 = x2*cos(t3)-y2*sin(t3); +wave_2_per_point18=y3 = y2*cos(t3)+x2*sin(t3); +wave_2_per_point19=//move resulting shape in 3d space +wave_2_per_point20=x4 = x3; +wave_2_per_point21=y4 = y3; +wave_2_per_point22=z4 = z3+5; +wave_2_per_point23=//draw 3d shape in 2d +wave_2_per_point24=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_2_per_point25=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_2_per_point26= +wave_2_per_point27=r = -.5 + sin(sample*5+((time*5)+9)); +wave_2_per_point28=r = if(below(r,0),0,r); +wave_2_per_point29=g = -.5 + sin(sample*5+time*5); +wave_2_per_point30=g = if(below(g,0),0,g); +wave_2_per_point31=b = -.5 + sin(sample*5+((time*5)+18)); +wave_2_per_point32=b = if(below(b,0),0,b); +wave_2_per_point33=r = if(above(bass,1.5),1,r); +wave_2_per_point34=g = if(above(bass,1.5),1,g); +wave_2_per_point35=b = if(above(bass,1.5),1,b); +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=1 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=6.530878 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=0.500000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=1.000000 +shapecode_0_a2=1.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=1.000000 +shape_0_per_frame1=rad = rad + sin(q8); +shape_0_per_frame2=r2 = bass; +shape_0_per_frame3=g2 = treb; +shape_0_per_frame4=b2 = mid; +shapecode_1_enabled=1 +shapecode_1_sides=100 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=1 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.022480 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=1.000000 +shapecode_1_b=1.000000 +shapecode_1_a=0.800000 +shapecode_1_r2=1.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.300000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=rad = .55; +shape_1_per_frame2=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_1_per_frame3=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_1_per_frame4=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_1_per_frame5=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_1_per_frame6=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_1_per_frame7=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shape_1_per_frame8=ang = ang-cos(time*.02); +shape_1_per_frame9=x = .5 + .1*sin(q8*.11); +shape_1_per_frame10=y = .5 + .1*sin(q8*.51); +shapecode_2_enabled=1 +shapecode_2_sides=100 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=1 +shapecode_2_x=0.650000 +shapecode_2_y=0.620000 +shapecode_2_rad=0.108925 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=1.000000 +shapecode_2_b=1.000000 +shapecode_2_a=0.540000 +shapecode_2_r2=1.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=1.000000 +shapecode_2_a2=0.400000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=rad = .750 + .1*sin(q8*.02); +shape_2_per_frame2=r = min(1,max(0,r + 0.1*sin(time*0.417 + 1))); +shape_2_per_frame3=g = min(1,max(0,g + 0.1*sin(time*0.391 + 2))); +shape_2_per_frame4=b = min(1,max(0,b + 0.1*sin(time*0.432 + 4))); +shape_2_per_frame5=r2 = min(1,max(0,r2 + 0.1*sin(time*0.457 + 3))); +shape_2_per_frame6=g2 = min(1,max(0,g2 + 0.1*sin(time*0.437 + 5))); +shape_2_per_frame7=b2 = min(1,max(0,b2 + 0.1*sin(time*0.484 + 6))); +shape_2_per_frame8=ang = ang+4*sin(q8*.2); +shapecode_3_enabled=0 +shapecode_3_sides=100 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=1 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.000000 +per_frame_1=warp=0; +per_frame_2=wave_a=0; +per_frame_3=q8 =oldq8+ 0.0003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_4=oldq8 = q8; +per_frame_5=q7 = 0.003*(pow(1+1.2*bass+0.4*bass_att+0.1*treb+0.1*treb_att+0.1*mid+0.1*mid_att,6)/fps); +per_frame_6=zoom = 1+.005*q7; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Rush.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Rush.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Rush.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Rush.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,192 @@ +[preset00] +fRating=2.000000 +fGammaAdj=1.980000 +fDecay=0.940000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=2.987793 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=1.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=1 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=0.120321 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_point1=x=sample; +wave_0_per_point2=y=.3+pow(value1,.2); +wave_0_per_point3=r=rand(10)*.1; +wave_0_per_point4=g=rand(10)*.1; +wave_0_per_point5=b=rand(10)*.1; +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=1 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_per_point1=x=sample; +wave_1_per_point2=y=.9-pow(value2,.2); +wave_1_per_point3=r=rand(10)*.1; +wave_1_per_point4=g=rand(10)*.1; +wave_1_per_point5=b=rand(10)*.1; +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_init1=t1 = 0; +wave_2_per_point1=x=.5+.1*sin(sample*10)*(rand(10)*.1)*bass; +wave_2_per_point2=y=.5+.1*cos(sample*10)*(rand(10)*.1)*treb; +wave_2_per_point3=a=(abs(y-.5)*abs(x-.5))*60; +shapecode_0_enabled=1 +shapecode_0_sides=4 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.100000 +shapecode_0_ang=0.000000 +shapecode_0_r=1.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.100000 +shape_0_per_frame1=r=.5+.2*sin(time*1.3); +shape_0_per_frame2=g=.5+.2*sin(time*1.1); +shape_0_per_frame3=b=.5+.2*sin(time*.9); +shape_0_per_frame4=a=bass; +shape_0_per_frame5=r2=r; +shape_0_per_frame6=g2=g; +shape_0_per_frame7=b2=b; +shape_0_per_frame8=border_a = if(above(bass,1.5),1,0); +shape_0_per_frame9=rad = bass*.1; +shape_0_per_frame10=rad = rad*if(above(bass,1.7),5,1); +shapecode_1_enabled=0 +shapecode_1_sides=4 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.100000 +shapecode_1_ang=0.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=1.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.100000 +shapecode_2_enabled=0 +shapecode_2_sides=4 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.100000 +shapecode_2_ang=0.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=1.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.100000 +per_frame_1=warp = 0; +per_pixel_1=zoom = if(above(abs(x-.5),.04),if(above(abs(y-.5),.04),1.2,1),1); +per_pixel_2=dx = if(above(x-.5,.025),if(below(abs(y-.5),.025),.02,0),0); +per_pixel_3=dx = if(below(x-.5,-.025),if(below(abs(y-.5),.025),-.02,dx),dx); +per_pixel_4=dy = if(above(y-.5,.025),if(below(abs(x-.5),.02),.02,0),0); +per_pixel_5=dy = if(below(y-.5,-.025),if(below(abs(x-.5),.02),-.02,dy),dy); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - S Pulse Virus.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - S Pulse Virus.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - S Pulse Virus.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - S Pulse Virus.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,70 @@ +[preset00] +fRating=4 +fGammaAdj=2 +fDecay=0.98 +fVideoEchoZoom=2 +fVideoEchoAlpha=0 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.8 +fWaveScale=1 +fWaveSmoothing=0.75 +fWaveParam=-1 +fModWaveAlphaStart=0.75 +fModWaveAlphaEnd=0.95 +fWarpAnimSpeed=1 +fWarpScale=0.999994 +fZoomExponent=1 +fShader=0 +zoom=1 +rot=0 +cx=0.5 +cy=0.5 +dx=0 +dy=0 +warp=1 +sx=1 +sy=1 +wave_r=0.5 +wave_g=0.5 +wave_b=0.5 +wave_x=0.5 +wave_y=0.5 +ob_size=0.01 +ob_r=0 +ob_g=0 +ob_b=0 +ob_a=0 +ib_size=0.01 +ib_r=0.25 +ib_g=0.25 +ib_b=0.25 +ib_a=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +mv_dx=0 +mv_dy=0 +mv_l=0.9 +mv_r=1 +mv_g=1 +mv_b=1 +mv_a=0 +per_frame_1=push = if(above(progress,0),if(above(push,1),-1,push + .05),-1); +per_frame_2=wave_mystery = wave_mystery + push; +per_frame_3=wave_r = wave_r + .5*sin(time*.222); +per_frame_4=wave_g = wave_g + .5*sin(time*.333); +per_frame_5=wave_b = wave_b + .5*sin(time*.444); +per_frame_6=warp = 0; +per_pixel_1=zoom = zoom + abs((rad-.3 - bass*.2)*.3); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - String.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - String.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - String.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - String.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,275 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.997000 +fVideoEchoZoom=0.996629 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.527792 +fWaveScale=0.034344 +fWaveSmoothing=0.270000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=0.000000 +wave_g=0.700000 +wave_b=1.000000 +wave_x=0.100000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=1.000000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=2.987785 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_init1=t1 = (rand(100)*.01)+.5; +wave_0_init2=t2 = (rand(100)*.01)+.5; +wave_0_init3=t3 = (rand(40)*.01)+.1; +wave_0_init4=inc = 1; +wave_0_per_frame1=inc = if(below(inc,1),inc+.01,if(above(bass,1.5),0,1)); +wave_0_per_frame2= +wave_0_per_frame3=t7 = inc; +wave_0_per_point1=x =.5 + t3 * sin(sample*6.28+time*t1); +wave_0_per_point2=y =.5 + .2 * cos(sample*6.28+time*t2)+sample; +wave_0_per_point3= +wave_0_per_point4=a = if(below(sample,.1),abs(sample*-1)*10,1); +wave_0_per_point5= +wave_0_per_point6=r = if(above(sample,t7-.01),if(below(sample,t7+.01),1,1),1); +wave_0_per_point7=g = if(above(sample,t7-.01),if(below(sample,t7+.01),0,1),1); +wave_0_per_point8=b = if(above(sample,t7-.01),if(below(sample,t7+.01),0,1),1); +wavecode_1_enabled=1 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_init1=t1 = (rand(100)*.01)+.5; +wave_1_init2=t2 = (rand(100)*.01)+.5; +wave_1_init3=t3 = (rand(40)*.01)+.1; +wave_1_init4=inc = 1; +wave_1_per_frame1=inc = if(below(inc,1),inc+.01,if(above(treb,1.5),0,1)); +wave_1_per_frame2= +wave_1_per_frame3=t7 = inc; +wave_1_per_point1=x =.5 + t3 * sin(sample*6.28+time*t1); +wave_1_per_point2=y =.5 + .2 * cos(sample*6.28+time*t2)+sample; +wave_1_per_point3= +wave_1_per_point4=a = if(below(sample,.1),abs(sample*-1)*10,1); +wave_1_per_point5= +wave_1_per_point6=r = if(above(sample,t7-.01),if(below(sample,t7+.01),0,1),1); +wave_1_per_point7=g = if(above(sample,t7-.01),if(below(sample,t7+.01),.75,1),1); +wave_1_per_point8=b = if(above(sample,t7-.01),if(below(sample,t7+.01),0,1),1); +wavecode_2_enabled=1 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_init1=t1 = (rand(100)*.01)+.5; +wave_2_init2=t2 = (rand(100)*.01)+.5; +wave_2_init3=t3 = (rand(40)*.01)+.1; +wave_2_init4=inc = 1; +wave_2_init5=speed = 0; +wave_2_per_frame1=inc = if(below(inc,1),inc+.01,if(above(mid,1.5),0,1)); +wave_2_per_frame2= +wave_2_per_frame3=t7 = inc; +wave_2_per_point1=x =.5 + t3 * sin(sample*6.28+time*t1); +wave_2_per_point2=y =.5 + .2 * cos(sample*6.28+time*t2)+sample; +wave_2_per_point3= +wave_2_per_point4=a = if(below(sample,.1),abs(sample*-1)*10,1); +wave_2_per_point5= +wave_2_per_point6=r = if(above(sample,t7-.01),if(below(sample,t7+.01),0,1),1); +wave_2_per_point7=g = if(above(sample,t7-.01),if(below(sample,t7+.01),0,1),1); +wave_2_per_point8=b = if(above(sample,t7-.01),if(below(sample,t7+.01),1,1),1); +wavecode_3_enabled=1 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +wave_3_init1=t1 = (rand(100)*.01)+.5; +wave_3_init2=t2 = (rand(100)*.01)+.5; +wave_3_init3=t3 = (rand(40)*.01)+.1; +wave_3_init4=inc = 1; +wave_3_per_frame1=inc = if(below(inc,1),inc+.01,if(above(bass+mid+treb,4.5),0,1)); +wave_3_per_frame2= +wave_3_per_frame3=t7 = inc; +wave_3_per_point1=x =.5 + t3 * sin(sample*6.28+time*t1); +wave_3_per_point2=y =.5 + .2 * cos(sample*6.28+time*t2)+sample; +wave_3_per_point3= +wave_3_per_point4=a = if(below(sample,.1),abs(sample*-1)*10,1); +wave_3_per_point5= +wave_3_per_point6=r = if(above(sample,t7-.01),if(below(sample,t7+.01),0,1),1); +wave_3_per_point7=g = if(above(sample,t7-.01),if(below(sample,t7+.01),0,1),1); +wave_3_per_point8=b = if(above(sample,t7-.01),if(below(sample,t7+.01),0,1),1); +shapecode_0_enabled=0 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.340000 +shapecode_0_ang=0.530000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.560000 +shapecode_0_g=0.360000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.900000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang = ang + time; +shapecode_1_enabled=0 +shapecode_1_sides=3 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.410000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=0.000000 +shapecode_1_g=0.800000 +shapecode_1_b=0.700000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=0.400000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=ang = ang - time*.333; +shapecode_2_enabled=0 +shapecode_2_sides=3 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.210000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=0.840000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=0.580000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=ang = ang + time*4; +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=warp = 0; +per_frame_2=decay = .92; +per_pixel_1=dy = if(above(y,.9),.0 +per_pixel_2=1,0); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Tangent Universe (Collapsed With Artifact Mix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Tangent Universe (Collapsed With Artifact Mix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Tangent Universe (Collapsed With Artifact Mix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Tangent Universe (Collapsed With Artifact Mix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=1 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=3.221673 +fWaveScale=1.104617 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.010000 +ob_r=0.000000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.900000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + if(above(bass,1),.5*cos(.33*time),.5*sin(.33*time)); +per_frame_3=wave_g = wave_g + if(above(bass,1),.5*cos(.55*time),.5*sin(.55*time)); +per_frame_4=wave_b = wave_b + if(above(bass,1),.5*cos(.44*time),.5*sin(.44*time)); +per_frame_5=wave_mystery = if(above(10*time%2,0),.5*sin(time)-.5,0); +per_pixel_1=zoom =-zoom + .1*sin(rad+tan(ang*5+(time*3)))*.1; +per_pixel_2=dx = rand(2)*.01; +per_pixel_3=dy = rand(2)*.01; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - The Deeper.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - The Deeper.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - The Deeper.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - The Deeper.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,59 @@ +[preset00] +fGammaAdj=2.000000 +fDecay=0.980000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=6 +bAdditiveWaves=0 +bWaveDots=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bMotionVectorsOn=0 +bRedBlueStereo=0 +nMotionVectorsX=12 +nMotionVectorsY=9 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.800000 +fWaveScale=0.302995 +fWaveSmoothing=0.750000 +fWaveParam=1.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.499900 +wave_x=0.980000 +wave_y=0.500000 +per_frame_1=warp = 0; +per_frame_2=sy = .9; +per_frame_3=sx = 1.02; +per_frame_4=wave_r = wave_r + .25*sin(time*.444); +per_frame_5=wave_g = wave_g + .25*sin(time*.333); +per_frame_6=wave_b = wave_b + .25*sin(time*.222); +per_frame_7=wave_r = wave_r + bass*.3; +per_frame_8=wave_g = wave_g + treb*.3; +per_frame_9=wave_b = wave_b + mid*.3; +per_pixel_1=sy = .9; +per_pixel_2=zoom = zoom - rad*.1; +per_pixel_3=rot = rot + .6 + .39*sin((rot + rad*.2)+time); + +fRating=2.000000 diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - The Inner Workings of my New Computer.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - The Inner Workings of my New Computer.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - The Inner Workings of my New Computer.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - The Inner Workings of my New Computer.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,72 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.939999 +fVideoEchoZoom=2.006761 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=1 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.576900 +fWaveScale=1.074092 +fWaveSmoothing=0.540000 +fWaveParam=-0.240000 +fModWaveAlphaStart=0.500000 +fModWaveAlphaEnd=1.000000 +fWarpAnimSpeed=9.180534 +fWarpScale=3.544900 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000010 +dy=0.000010 +warp=0.972365 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=1.000000 +ob_g=0.930000 +ob_b=0.600000 +ob_a=1.000000 +ib_size=0.500000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=1.000000 +ib_a=0.000000 +nMotionVectorsX=16.000004 +nMotionVectorsY=16.800003 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.150000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=1.000000 +per_frame_1=warp = 0; +per_frame_2=zoom = .6+.2*sin(time*.433); +per_frame_3=dx = .6 +.1*sin(time); +per_frame_4=dy = .6 +.1*cos(time*.888); +per_frame_5=rot = .3*sin(time*.333); +per_frame_6=wave_r = bass*.3; +per_frame_7=wave_g = treb*.3; +per_frame_8=wave_b = mid*.3; +per_frame_9=wave_a = if(equal(frame%2,0),if(above(bass,1.3),10,0),10.57); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Visionarie (geiss aspect ratio fix).milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Visionarie (geiss aspect ratio fix).milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Visionarie (geiss aspect ratio fix).milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Visionarie (geiss aspect ratio fix).milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,220 @@ +[preset00] +fRating=3.000000 +fGammaAdj=1.000000 +fDecay=0.997000 +fVideoEchoZoom=0.996629 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=1 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=1 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=1 +bSolarize=0 +bInvert=0 +fWaveAlpha=0.001000 +fWaveScale=0.010000 +fWaveSmoothing=0.270000 +fWaveParam=-0.380000 +fModWaveAlphaStart=0.710000 +fModWaveAlphaEnd=1.300000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.331000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=0.999514 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=0.010000 +sx=1.000000 +sy=1.000000 +wave_r=1.000000 +wave_g=1.000000 +wave_b=1.000000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.500000 +ob_r=0.010000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=0.000000 +ib_size=0.260000 +ib_r=1.000000 +ib_g=1.000000 +ib_b=1.000000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=48.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=0.850000 +mv_r=0.499900 +mv_g=0.499900 +mv_b=0.499900 +mv_a=0.000000 +wavecode_0_enabled=1 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=0 +wavecode_0_bAdditive=0 +wavecode_0_scaling=1.000000 +wavecode_0_smoothing=0.500000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_per_point1=x = .5 + (bass*.2)*sin(sample*2*(time*10)); +wave_0_per_point2=y = .5 + (bass*.2)*cos(sample*2*(time*10)); +wave_0_per_point3=r = sample; +wave_0_per_point4=g = x; +wave_0_per_point5=b = y; +wave_0_per_point6=x = (x-0.5)*0.75 + 0.5; // aspect ratio fix by geiss +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=0 +wavecode_1_bAdditive=0 +wavecode_1_scaling=1.000000 +wavecode_1_smoothing=0.500000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=0 +wavecode_2_bAdditive=0 +wavecode_2_scaling=1.000000 +wavecode_2_smoothing=0.500000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=0 +shapecode_0_sides=3 +shapecode_0_additive=0 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.340000 +shapecode_0_ang=0.530000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.560000 +shapecode_0_g=0.360000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.900000 +shapecode_0_g2=1.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=0.000000 +shapecode_0_border_g=0.000000 +shapecode_0_border_b=0.000000 +shapecode_0_border_a=0.000000 +shape_0_per_frame1=ang = ang + time; +shapecode_1_enabled=0 +shapecode_1_sides=3 +shapecode_1_additive=0 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.410000 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=0.000000 +shapecode_1_g=0.800000 +shapecode_1_b=0.700000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=0.400000 +shapecode_1_b2=1.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=1.000000 +shapecode_1_border_g=1.000000 +shapecode_1_border_b=1.000000 +shapecode_1_border_a=0.000000 +shape_1_per_frame1=ang = ang - time*.333; +shapecode_2_enabled=0 +shapecode_2_sides=3 +shapecode_2_additive=0 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.210000 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=0.840000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=1.000000 +shapecode_2_g2=0.580000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=1.000000 +shapecode_2_border_g=1.000000 +shapecode_2_border_b=1.000000 +shapecode_2_border_a=0.000000 +shape_2_per_frame1=ang = ang + time*4; +shapecode_3_enabled=0 +shapecode_3_sides=4 +shapecode_3_additive=0 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.100000 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=1.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=1.000000 +shapecode_3_border_g=1.000000 +shapecode_3_border_b=1.000000 +shapecode_3_border_a=0.100000 +per_frame_1=warp = 0; +per_frame_2=decay = .92; +per_pixel_1=zoom = zoom + .1; +per_pixel_2=rot = rot + rad*.1; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Waves Of Blood.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Waves Of Blood.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Waves Of Blood.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Waves Of Blood.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,71 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.970000 +fVideoEchoZoom=2.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=2 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=1 +bTexWrap=1 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.958904 +fWaveScale=0.369707 +fWaveSmoothing=0.360000 +fWaveParam=-0.500000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.030000 +ob_r=0.200000 +ob_g=0.000000 +ob_b=0.000000 +ob_a=1.000000 +ib_size=0.010000 +ib_r=0.250000 +ib_g=0.250000 +ib_b=0.250000 +ib_a=0.000000 +nMotionVectorsX=12.000000 +nMotionVectorsY=9.000000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=1.000000 +mv_b=1.000000 +mv_a=0.000000 +per_frame_1=warp = 0; +per_frame_2=wave_r = wave_r + .5*sin(time*.666); +per_frame_3=wave_g = wave_g + .5*sin(time*.777); +per_frame_4=wave_b = wave_b + .5*sin(time*.888); +per_frame_5=ob_r = ob_r + .1*sin(time); +per_pixel_1=cx = (0&(x*17-0.5))*(1/17)+0.05; +per_pixel_2=cy = (0&(y*17-0.5))*(1/17)+0.05; +per_pixel_3=rot = (bass*.6)*sin(ang*(5+bass)+(time*3)); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Wisps.milk kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Wisps.milk --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Wisps.milk 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/presets/Zylot - Wisps.milk 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,420 @@ +[preset00] +fRating=3.000000 +fGammaAdj=2.000000 +fDecay=0.900000 +fVideoEchoZoom=1.000000 +fVideoEchoAlpha=0.000000 +nVideoEchoOrientation=0 +nWaveMode=0 +bAdditiveWaves=0 +bWaveDots=0 +bWaveThick=0 +bModWaveAlphaByVolume=0 +bMaximizeWaveColor=0 +bTexWrap=0 +bDarkenCenter=0 +bRedBlueStereo=0 +bBrighten=0 +bDarken=0 +bSolarize=0 +bInvert=0 +fWaveAlpha=1.000000 +fWaveScale=1.000000 +fWaveSmoothing=0.750000 +fWaveParam=0.000000 +fModWaveAlphaStart=0.750000 +fModWaveAlphaEnd=0.950000 +fWarpAnimSpeed=1.000000 +fWarpScale=1.000000 +fZoomExponent=1.000000 +fShader=0.000000 +zoom=1.000000 +rot=0.000000 +cx=0.500000 +cy=0.500000 +dx=0.000000 +dy=0.000000 +warp=1.000000 +sx=1.000000 +sy=1.000000 +wave_r=0.500000 +wave_g=0.500000 +wave_b=0.500000 +wave_x=0.500000 +wave_y=0.500000 +ob_size=0.005000 +ob_r=0.300000 +ob_g=0.300000 +ob_b=0.300000 +ob_a=1.000000 +ib_size=0.000000 +ib_r=0.000000 +ib_g=0.000000 +ib_b=0.000000 +ib_a=0.000000 +nMotionVectorsX=64.000000 +nMotionVectorsY=1.920000 +mv_dx=0.000000 +mv_dy=0.000000 +mv_l=5.000000 +mv_r=1.000000 +mv_g=0.000000 +mv_b=0.000000 +mv_a=0.000000 +wavecode_0_enabled=0 +wavecode_0_samples=512 +wavecode_0_sep=0 +wavecode_0_bSpectrum=0 +wavecode_0_bUseDots=0 +wavecode_0_bDrawThick=1 +wavecode_0_bAdditive=0 +wavecode_0_scaling=0.463735 +wavecode_0_smoothing=0.000000 +wavecode_0_r=1.000000 +wavecode_0_g=1.000000 +wavecode_0_b=1.000000 +wavecode_0_a=1.000000 +wave_0_init1=//pi +wave_0_init2=t8=3.14159265; +wave_0_init3=t5 = 1; +wave_0_per_frame1=rotx = rotx+bass; +wave_0_per_frame2=roty = roty+mid; +wave_0_per_frame3=rotz = rotz+treb; +wave_0_per_frame4=//rotx = 0; +wave_0_per_frame5=//roty =0; +wave_0_per_frame6=//rotz = 0; +wave_0_per_frame7= +wave_0_per_frame8=//convert rotation values from degrees to radians +wave_0_per_frame9=t1= t8*rotx/180; +wave_0_per_frame10=t2 = t8*roty/180; +wave_0_per_frame11=t3 = t8*rotz/180; +wave_0_per_frame12= +wave_0_per_frame13=t4 = 3*sin(time); +wave_0_per_frame14=t5 = 10+8*cos(time); +wave_0_per_frame15= +wave_0_per_frame16=g = 0.5-0.4*cos(time); +wave_0_per_frame17=r = 0.5-0.4*sin(time); +wave_0_per_point1=//Define 3D Shape +wave_0_per_point2= +wave_0_per_point3=//Spiral +wave_0_per_point4=x1 = 0.5*sin(8*t8*sample); +wave_0_per_point5=y1 = 2*(sample-0.5)-value1; +wave_0_per_point6=z1= 0.5*cos(8*t8*sample); +wave_0_per_point7= +wave_0_per_point8=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_0_per_point9=y2 = y1*cos(t1)-z1*sin(t1); +wave_0_per_point10=z2 = y1*sin(t1)+z1*cos(t1); +wave_0_per_point11=x2 = z2*sin(t2)+x1*cos(t2); +wave_0_per_point12=z3 = z2*cos(t2)-x1*sin(t2); +wave_0_per_point13=x3 = x2*cos(t3)-y2*sin(t3); +wave_0_per_point14=y3 = y2*cos(t3)+x2*sin(t3); +wave_0_per_point15=//move resulting shape in 3d space +wave_0_per_point16=x4 = x3+t4; +wave_0_per_point17=y4 = y3; +wave_0_per_point18=z4 = z3+t5; +wave_0_per_point19=//draw 3d shape in 2d +wave_0_per_point20=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_0_per_point21=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_0_per_point22= +wave_0_per_point23=b= r+value1; +wavecode_1_enabled=0 +wavecode_1_samples=512 +wavecode_1_sep=0 +wavecode_1_bSpectrum=0 +wavecode_1_bUseDots=0 +wavecode_1_bDrawThick=1 +wavecode_1_bAdditive=0 +wavecode_1_scaling=0.463735 +wavecode_1_smoothing=0.000000 +wavecode_1_r=1.000000 +wavecode_1_g=1.000000 +wavecode_1_b=1.000000 +wavecode_1_a=1.000000 +wave_1_init1=//pi +wave_1_init2=t8=3.14159265; +wave_1_init3=t5 = 1; +wave_1_per_frame1=rotx = rotx+bass; +wave_1_per_frame2=roty = roty+mid; +wave_1_per_frame3=rotz = rotz+treb; +wave_1_per_frame4=//rotx = 0; +wave_1_per_frame5=//roty =0; +wave_1_per_frame6=//rotz = 0; +wave_1_per_frame7= +wave_1_per_frame8=//convert rotation values from degrees to radians +wave_1_per_frame9=t1= t8*rotx/180; +wave_1_per_frame10=t2 = t8*roty/180; +wave_1_per_frame11=t3 = t8*rotz/180; +wave_1_per_frame12= +wave_1_per_frame13=t4 = 3*sin(time+0.66*t8); +wave_1_per_frame14=t5 = 10+8*cos(time+0.66*t8); +wave_1_per_frame15= +wave_1_per_frame16=b = 0.5-0.4*cos(time+0.66*t8); +wave_1_per_frame17=g = 0.5-0.4*sin(time+0.66*t8); +wave_1_per_point1=//Define 3D Shape +wave_1_per_point2= +wave_1_per_point3=//Sphere +wave_1_per_point4=fvar = sample*512; +wave_1_per_point5=svar = fvar/32; +wave_1_per_point6=tvar = 0&svar; +wave_1_per_point7=nsample = tvar*3.5; +wave_1_per_point8=x1 = (1*sin(t8*nsample)); +wave_1_per_point9=y1 = (1*cos(t8*nsample)); +wave_1_per_point10=z1 = 1.5*sin((0&sample)); +wave_1_per_point11= +wave_1_per_point12=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_1_per_point13=y2 = y1*cos(t1)-z1*sin(t1); +wave_1_per_point14=z2 = y1*sin(t1)+z1*cos(t1); +wave_1_per_point15=x2 = z2*sin(t2)+x1*cos(t2); +wave_1_per_point16=z3 = z2*cos(t2)-x1*sin(t2); +wave_1_per_point17=x3 = x2*cos(t3)-y2*sin(t3); +wave_1_per_point18=y3 = y2*cos(t3)+x2*sin(t3); +wave_1_per_point19=//move resulting shape in 3d space +wave_1_per_point20=x4 = x3; +wave_1_per_point21=y4 = y3; +wave_1_per_point22=z4 = z3+5; +wave_1_per_point23=//draw 3d shape in 2d +wave_1_per_point24=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_1_per_point25=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_1_per_point26= +wave_1_per_point27=r = g+value1; +wavecode_2_enabled=0 +wavecode_2_samples=512 +wavecode_2_sep=0 +wavecode_2_bSpectrum=0 +wavecode_2_bUseDots=0 +wavecode_2_bDrawThick=1 +wavecode_2_bAdditive=0 +wavecode_2_scaling=0.463735 +wavecode_2_smoothing=0.000000 +wavecode_2_r=1.000000 +wavecode_2_g=1.000000 +wavecode_2_b=1.000000 +wavecode_2_a=1.000000 +wave_2_init1=//pi +wave_2_init2=t8=3.14159265; +wave_2_init3=t5 = 1; +wave_2_per_frame1=rotx = rotx+bass; +wave_2_per_frame2=roty = roty+mid; +wave_2_per_frame3=rotz = rotz+treb; +wave_2_per_frame4=//rotx = 0; +wave_2_per_frame5=//roty =0; +wave_2_per_frame6=//rotz = 0; +wave_2_per_frame7= +wave_2_per_frame8=//convert rotation values from degrees to radians +wave_2_per_frame9=t1= t8*rotx/180; +wave_2_per_frame10=t2 = t8*roty/180; +wave_2_per_frame11=t3 = t8*rotz/180; +wave_2_per_frame12= +wave_2_per_frame13=t4 = 3*sin(time+1.33*t8); +wave_2_per_frame14=t5 = 10+8*cos(time+1.33*t8); +wave_2_per_frame15= +wave_2_per_frame16=r = 0.5-0.4*cos(time+1.33*t8); +wave_2_per_frame17=b = 0.5-0.4*sin(time+1.33*t8); +wave_2_per_point1=//Define 3D Shape +wave_2_per_point2= +wave_2_per_point3=//Cube +wave_2_per_point4=x0 = if(below(sample*12,1),sample*12, if(below(sample*12,2),1, if(below(sample*12,3),abs(sample*12-3), if(below(sample*12,6),0, if(below(sample*12,8),1, if(below(sample*12,9),abs(sample*12-9), if(below(sample*12,10),0, if(below(sample*12,11),sample*12-10,1)))))))); +wave_2_per_point5=y0 = if(below(sample*12,1),0, if(below(sample*12,2),sample*12-1, if(below(sample*12,3),1, if(below(sample*12,4),abs(sample*12-4), if(below(sample*12,5),0, if(below(sample*12,7),1, if(below(sample*12,9),0, if(below(sample*12,10),sample*12-9, if(below(sample*12,11),1,abs(sample*12-12)))))))))); +wave_2_per_point6=z0 = if(below(sample*12,4),0, if(below(sample*12,5),sample*12-4, if(below(sample*12,6),abs(sample*12-6), if(below(sample*12,7),sample*12-6, if(below(sample*12,8),abs(sample*12-8),1))))); +wave_2_per_point7=x1 = 0.5-x0+if(below(sin(sample*12*3.1415),0),value1,0); +wave_2_per_point8=y1 = 0.5-y0+if(below(cos((sample*12-1.5)*3.1415),0),value1,0); +wave_2_per_point9=z1 = 0.5-z0+if(below(sample*12,4),0,if(below(sample*12,8),value1,0)); +wave_2_per_point10= +wave_2_per_point11=//modulate values to adjust for rotation on multiple axes, convert to world co-ordinates +wave_2_per_point12=y2 = y1*cos(t1)-z1*sin(t1); +wave_2_per_point13=z2 = y1*sin(t1)+z1*cos(t1); +wave_2_per_point14=x2 = z2*sin(t2)+x1*cos(t2); +wave_2_per_point15=z3 = z2*cos(t2)-x1*sin(t2); +wave_2_per_point16=x3 = x2*cos(t3)-y2*sin(t3); +wave_2_per_point17=y3 = y2*cos(t3)+x2*sin(t3); +wave_2_per_point18=//move resulting shape in 3d space +wave_2_per_point19=x4 = x3+t4; +wave_2_per_point20=y4 = y3; +wave_2_per_point21=z4 = z3+t5; +wave_2_per_point22=//draw 3d shape in 2d +wave_2_per_point23=x=0.5+0.5*(x4/(1+z4*0.5)); +wave_2_per_point24=y=0.5+0.5*(y4/(1+z4*0.5)); +wave_2_per_point25= +wave_2_per_point26=g = b+value1; +wavecode_3_enabled=0 +wavecode_3_samples=512 +wavecode_3_sep=0 +wavecode_3_bSpectrum=0 +wavecode_3_bUseDots=0 +wavecode_3_bDrawThick=0 +wavecode_3_bAdditive=0 +wavecode_3_scaling=1.000000 +wavecode_3_smoothing=0.500000 +wavecode_3_r=1.000000 +wavecode_3_g=1.000000 +wavecode_3_b=1.000000 +wavecode_3_a=1.000000 +shapecode_0_enabled=1 +shapecode_0_sides=100 +shapecode_0_additive=1 +shapecode_0_thickOutline=0 +shapecode_0_textured=0 +shapecode_0_x=0.500000 +shapecode_0_y=0.500000 +shapecode_0_rad=0.217303 +shapecode_0_ang=0.000000 +shapecode_0_tex_ang=0.000000 +shapecode_0_tex_zoom=1.000000 +shapecode_0_r=0.000000 +shapecode_0_g=0.000000 +shapecode_0_b=0.000000 +shapecode_0_a=1.000000 +shapecode_0_r2=0.000000 +shapecode_0_g2=0.000000 +shapecode_0_b2=0.000000 +shapecode_0_a2=0.000000 +shapecode_0_border_r=1.000000 +shapecode_0_border_g=1.000000 +shapecode_0_border_b=1.000000 +shapecode_0_border_a=0.000000 +shape_0_init1=speedc=0; +shape_0_init2=trebc=0; +shape_0_init3=radc=0; +shape_0_per_frame1=x = .5+radc*sin(speedc); +shape_0_per_frame2=y = .5+radc*cos(speedc); +shape_0_per_frame3= +shape_0_per_frame4=radc = if(above(bass*.3,radc),radc+.01,radc-.01); +shape_0_per_frame5=radc = if(below(radc,0),0,radc); +shape_0_per_frame6= +shape_0_per_frame7=trebc = if(above(treb*.05,trebc),trebc+.0005,trebc-.0005); +shape_0_per_frame8=trebc = if(below(trebc,0),0,trebc); +shape_0_per_frame9= +shape_0_per_frame10=speedc = speedc + trebc; +shape_0_per_frame11= +shape_0_per_frame12=r = bass; +shape_0_per_frame13=g = treb; +shape_0_per_frame14=b = mid; +shapecode_1_enabled=1 +shapecode_1_sides=100 +shapecode_1_additive=1 +shapecode_1_thickOutline=0 +shapecode_1_textured=0 +shapecode_1_x=0.500000 +shapecode_1_y=0.500000 +shapecode_1_rad=0.215152 +shapecode_1_ang=0.000000 +shapecode_1_tex_ang=0.000000 +shapecode_1_tex_zoom=1.000000 +shapecode_1_r=1.000000 +shapecode_1_g=0.000000 +shapecode_1_b=0.000000 +shapecode_1_a=1.000000 +shapecode_1_r2=0.000000 +shapecode_1_g2=0.000000 +shapecode_1_b2=0.000000 +shapecode_1_a2=0.000000 +shapecode_1_border_r=0.000000 +shapecode_1_border_g=0.000000 +shapecode_1_border_b=0.000000 +shapecode_1_border_a=0.000000 +shape_1_init1=speedc=0; +shape_1_init2=trebc=0; +shape_1_init3=radc=0; +shape_1_per_frame1=x = .5+radc*sin(speedc+q1); +shape_1_per_frame2=y = .5+radc*cos(speedc+q1); +shape_1_per_frame3= +shape_1_per_frame4=radc = if(above(bass*.3,radc),radc+.01,radc-.01); +shape_1_per_frame5=radc = if(below(radc,0),0,radc); +shape_1_per_frame6= +shape_1_per_frame7=trebc = if(above(treb*.05,trebc),trebc+.0005,trebc-.0005); +shape_1_per_frame8=trebc = if(below(trebc,0),0,trebc); +shape_1_per_frame9= +shape_1_per_frame10=speedc = speedc + trebc; +shape_1_per_frame11= +shape_1_per_frame12=r = bass; +shape_1_per_frame13=g = treb; +shape_1_per_frame14=b = mid; +shapecode_2_enabled=1 +shapecode_2_sides=100 +shapecode_2_additive=1 +shapecode_2_thickOutline=0 +shapecode_2_textured=0 +shapecode_2_x=0.500000 +shapecode_2_y=0.500000 +shapecode_2_rad=0.215152 +shapecode_2_ang=0.000000 +shapecode_2_tex_ang=0.000000 +shapecode_2_tex_zoom=1.000000 +shapecode_2_r=1.000000 +shapecode_2_g=0.000000 +shapecode_2_b=0.000000 +shapecode_2_a=1.000000 +shapecode_2_r2=0.000000 +shapecode_2_g2=0.000000 +shapecode_2_b2=0.000000 +shapecode_2_a2=0.000000 +shapecode_2_border_r=0.000000 +shapecode_2_border_g=0.000000 +shapecode_2_border_b=0.000000 +shapecode_2_border_a=0.000000 +shape_2_init1=speedc=0; +shape_2_init2=trebc=0; +shape_2_init3=radc=0; +shape_2_per_frame1=x = .5+radc*sin(speedc+(q1*2)); +shape_2_per_frame2=y = .5+radc*cos(speedc+(q1*2)); +shape_2_per_frame3= +shape_2_per_frame4=radc = if(above(bass*.3,radc),radc+.01,radc-.01); +shape_2_per_frame5=radc = if(below(radc,0),0,radc); +shape_2_per_frame6= +shape_2_per_frame7=trebc = if(above(treb*.05,trebc),trebc+.0005,trebc-.0005); +shape_2_per_frame8=trebc = if(below(trebc,0),0,trebc); +shape_2_per_frame9= +shape_2_per_frame10=speedc = speedc + trebc; +shape_2_per_frame11= +shape_2_per_frame12=r = bass; +shape_2_per_frame13=g = treb; +shape_2_per_frame14=b = mid; +shapecode_3_enabled=1 +shapecode_3_sides=100 +shapecode_3_additive=1 +shapecode_3_thickOutline=0 +shapecode_3_textured=0 +shapecode_3_x=0.500000 +shapecode_3_y=0.500000 +shapecode_3_rad=0.215152 +shapecode_3_ang=0.000000 +shapecode_3_tex_ang=0.000000 +shapecode_3_tex_zoom=1.000000 +shapecode_3_r=1.000000 +shapecode_3_g=0.000000 +shapecode_3_b=0.000000 +shapecode_3_a=1.000000 +shapecode_3_r2=0.000000 +shapecode_3_g2=0.000000 +shapecode_3_b2=0.000000 +shapecode_3_a2=0.000000 +shapecode_3_border_r=0.000000 +shapecode_3_border_g=0.000000 +shapecode_3_border_b=0.000000 +shapecode_3_border_a=0.000000 +shape_3_init1=speedc=0; +shape_3_init2=trebc=0; +shape_3_init3=radc=0; +shape_3_per_frame1=x = .5+radc*sin(speedc+(q1*3)); +shape_3_per_frame2=y = .5+radc*cos(speedc+(q1*3)); +shape_3_per_frame3= +shape_3_per_frame4=radc = if(above(bass*.3,radc),radc+.01,radc-.01); +shape_3_per_frame5=radc = if(below(radc,0),0,radc); +shape_3_per_frame6= +shape_3_per_frame7=trebc = if(above(treb*.05,trebc),trebc+.0005,trebc-.0005); +shape_3_per_frame8=trebc = if(below(trebc,0),0,trebc); +shape_3_per_frame9= +shape_3_per_frame10=speedc = speedc + trebc; +shape_3_per_frame11= +shape_3_per_frame12=r = bass; +shape_3_per_frame13=g = treb; +shape_3_per_frame14=b = mid; +per_frame_init_1=space = 3+(rand(80)*.1); +per_frame_1=warp=0; +per_frame_2=wave_a=0; +per_frame_3= +per_frame_4=zoom = zoom-.1+(bass*.1); +per_frame_5= +per_frame_6=q1=space; +per_frame_7=dx = .04*sin(time); +per_frame_8=dy = .04*sin(time*.6677); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,919 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +#include "wipemalloc.h" + +#include "fatal.h" +#include "Common.hpp" +#include "compare.h" +#ifdef WIN32 +#include "win32-dirent.h" +#define CMAKE_INSTALL_PREFIX "" +#endif + +#include "timer.h" +#include +#ifdef LINUX +#include "time.h" +#endif + +#ifdef WIN32 +#include +#endif + +//#include +#include +#include "projectM.hpp" +#include "BuiltinFuncs.hpp" +#include "BeatDetect.hpp" +#include "Eval.hpp" +#include "Param.hpp" +#include "Parser.hpp" +#include "Preset.hpp" +#include "PerPixelEqn.hpp" +#include "PresetMerge.hpp" +//#include "menu.h" +#include "PCM.hpp" //Sound data handler (buffering, FFT, etc.) +#include "CustomWave.hpp" +#include "CustomShape.hpp" +#include "IdlePreset.hpp" + +#include + +#include "Renderer.hpp" +#include "PresetFrameIO.hpp" +#include "PresetChooser.hpp" +#include "TextureManager.hpp" +#include "TimeKeeper.hpp" +#ifdef USE_THREADS +#include "pthread.h" +#endif +#include "SectionLock.h" +/* +DLLEXPORT projectM::projectM ( int gx, int gy, int fps, int texsize, int width, int height, std::string preset_url,std::string title_fonturl, std::string title_menuurl ) :beatDetect ( 0 ), renderer ( 0 ), settings.presetURL ( preset_url ), title_fontURL ( title_fonturl ), menu_fontURL ( menu_fontURL ), smoothFrame ( 0 ), m_presetQueuePos(0) +{ + presetURL = preset_url; + projectM_reset(); + projectM_init ( gx, gy, fps, texsize, width, height ); + projectM_resetGL ( width, height ); +} +*/ + + +projectM::~projectM() +{ + + #ifdef USE_THREADS + pthread_mutex_lock( &mutex ); + running = false; + pthread_cond_signal(&condition); + pthread_mutex_unlock( &mutex ); + pthread_join(thread, NULL); + + pthread_cond_destroy(&condition); + pthread_mutex_destroy( &mutex ); +#endif + destroyPresetTools(); + + + if ( renderer ) + delete ( renderer ); + if ( beatDetect ) + delete ( beatDetect ); + if ( _pcm ) { + delete ( _pcm ); + _pcm = 0; + } + + +} + +DLLEXPORT unsigned projectM::initRenderToTexture() +{ + return renderer->initRenderToTexture(); +} + +DLLEXPORT void projectM::projectM_resetTextures() +{ + renderer->ResetTextures(); +} + + +DLLEXPORT projectM::projectM ( Settings config_pm, int flags) : + beatDetect ( 0 ), renderer ( 0 ), m_presetPos(0), _pcm(0), m_flags(flags) +{ + readConfig ( config_pm ); + projectM_reset(); + projectM_resetGL ( _settings.windowWidth, _settings.windowHeight); + +} + +void projectM::readConfig (const Settings configpm ) +{ + _settings.meshX = configpm.meshX; + _settings.meshY = configpm.meshY; + _settings.textureSize = configpm.textureSize; + _settings.fps = configpm.fps; + _settings.windowWidth = configpm.windowWidth; + _settings.windowHeight = configpm.windowHeight; + _settings.windowLeft = configpm.windowLeft; + _settings.windowBottom = configpm.windowBottom; + _settings.smoothPresetDuration = configpm.smoothPresetDuration; + _settings.presetDuration = configpm.presetDuration; + _settings.presetURL = configpm.presetURL; + _settings.shuffleEnabled = configpm.shuffleEnabled; + _settings.useFBO = false; + _settings.easterEgg = configpm.easterEgg; + projectM_init ( _settings.meshX, _settings.meshY, _settings.fps, + _settings.textureSize, _settings.windowWidth,_settings.windowHeight, + _settings.windowLeft, _settings.windowBottom, _settings.useFBO ); + _settings.beatSensitivity = beatDetect->beat_sensitivity = configpm.beatSensitivity; + if ( configpm.aspectCorrection ) + _settings.aspectCorrection = renderer->correction = true; + else + _settings.aspectCorrection = renderer->correction = false; +} + +#ifdef USE_THREADS +static void *thread_callback(void *prjm) +{ + projectM *p = (projectM *)prjm; + p->thread_func(prjm); + return NULL; +} + + +void *projectM::thread_func(void *vptr_args) +{ + pthread_mutex_lock( &mutex ); + while (true) + { + pthread_cond_wait( &condition, &mutex ); + if(!running) + { + pthread_mutex_unlock( &mutex ); + return NULL; + } + evaluateSecondPreset(); + } +} +#endif + +void projectM::evaluateSecondPreset() +{ + Preset* p = m_activePreset2.get(); + if (p) + { + setupPresetInputs(&p->presetInputs()); + p->presetInputs().frame = timeKeeper->PresetFrameB(); + p->presetInputs().progress= timeKeeper->PresetProgressB(); + + p->evaluateFrame(); + renderer->PerPixelMath ( &p->presetOutputs(), &presetInputs2 ); + renderer->WaveformMath ( &p->presetOutputs(), &presetInputs2, true ); + } + else + printf("projectm: %s - preset was NULL\n", __FUNCTION__); +} + +void projectM::setupPresetInputs(PresetInputs *inputs) +{ + inputs->ResetMesh(); + + inputs->time = timeKeeper->GetRunningTime(); + inputs->bass = beatDetect->bass; + inputs->mid = beatDetect->mid; + inputs->treb = beatDetect->treb; + inputs->bass_att = beatDetect->bass_att; + inputs->mid_att = beatDetect->mid_att; + inputs->treb_att = beatDetect->treb_att; +} + +DLLEXPORT void projectM::renderFrame() +{ + +#ifdef DEBUG + char fname[1024]; + FILE *f = NULL; + int index = 0; + int x, y; +#endif + + timeKeeper->UpdateTimers(); + + mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); //milliseconds per frame + + setupPresetInputs(&m_activePreset->presetInputs()); + m_activePreset->presetInputs().frame = timeKeeper->PresetFrameA(); + m_activePreset->presetInputs().progress= timeKeeper->PresetProgressA(); + + beatDetect->detectFromSamples(); + + //m_activePreset->evaluateFrame(); + + if ( renderer->noSwitch==false && !m_presetChooser->empty() ) + { + if ( timeKeeper->PresetProgressA()>=1.0 && !timeKeeper->IsSmoothing()) + { + + CSectionLock lock(&mutex); + timeKeeper->StartSmoothing(); + switchPreset(m_activePreset2, + &m_activePreset->presetInputs() == &presetInputs ? presetInputs2 : presetInputs, + &m_activePreset->presetOutputs() == &presetOutputs ? presetOutputs2 : presetOutputs); + + presetSwitchedEvent(false, **m_presetPos); + } + + else if ( ( beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) && timeKeeper->CanHardCut() ) + { + switchPreset(m_activePreset, presetInputs, presetOutputs); + + timeKeeper->StartPreset(); + presetSwitchedEvent(true, **m_presetPos); + } + } + + + + if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() <= 1.0 && !m_presetChooser->empty() ) + { + assert ( m_activePreset.get() ); + +#ifdef USE_THREADS + pthread_cond_signal(&condition); +#endif + m_activePreset->evaluateFrame(); + renderer->PerPixelMath ( &m_activePreset->presetOutputs(), &presetInputs ); + renderer->WaveformMath ( &m_activePreset->presetOutputs(), &presetInputs, true ); + +#ifndef USE_THREADS + evaluateSecondPreset(); +#endif + + + CSectionLock lock(&mutex); + PresetMerger::MergePresets ( m_activePreset->presetOutputs(),m_activePreset2->presetOutputs(),timeKeeper->SmoothRatio(),presetInputs.gx, presetInputs.gy ); + + } + else + { + if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() > 1.0 ) + { + CSectionLock lock(&mutex); + m_activePreset = std::move(m_activePreset2); + switchPreset(m_activePreset2, presetInputs2, presetOutputs2); + timeKeeper->EndSmoothing(); + } + + m_activePreset->evaluateFrame(); + + renderer->PerPixelMath ( &m_activePreset->presetOutputs(), &presetInputs ); + renderer->WaveformMath ( &m_activePreset->presetOutputs(), &presetInputs, false ); + + } + + renderer->RenderFrame ( &m_activePreset->presetOutputs(), &presetInputs ); + + count++; +#ifndef WIN32 + /** Frame-rate limiter */ + /** Compute once per preset */ + if ( this->count%100==0 ) + { + this->renderer->realfps=100.0/ ( ( getTicks ( &timeKeeper->startTime )-this->fpsstart ) /1000 ); + this->fpsstart=getTicks ( &timeKeeper->startTime ); + } + + int timediff = getTicks ( &timeKeeper->startTime )-this->timestart; + + if ( timediff < this->mspf ) + { + int sleepTime = ( unsigned int ) ( this->mspf-timediff ) * 1000; + if ( sleepTime > 0 && sleepTime < 100000 ) + { + if ( usleep ( sleepTime ) != 0 ) {}} + } + this->timestart=getTicks ( &timeKeeper->startTime ); +#endif /** !WIN32 */ + + +} + +void projectM::projectM_reset() +{ + + /** Default variable settings */ + + // this->wvw = 512; + // this->wvh = 512; + + /** More other stuff */ + this->mspf = 0; + this->timed = 0; + this->timestart = 0; + this->count = 0; + + this->fpsstart = 0; + + projectM_resetengine(); +} + +void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, int height, int xpos, int ypos, bool usefbo ) +{ + + /** Initialise engine variables */ + + projectM_initengine(); + presetInputs.Initialize ( gx, gy ); + presetInputs2.Initialize ( gx, gy ); + presetOutputs.Initialize ( gx, gy ); + presetOutputs2.Initialize ( gx, gy ); + + /** Initialise start time */ + timeKeeper = new TimeKeeper(_settings.presetDuration,_settings.smoothPresetDuration, _settings.easterEgg); + + /** Nullify frame stash */ + + + /** Initialise per-pixel matrix calculations */ + + + presetInputs.fps = fps; + presetInputs2.fps = fps; + /** We need to initialise this before the builtin param db otherwise bass/mid etc won't bind correctly */ + assert ( !beatDetect ); + + if (!_pcm) + _pcm = new PCM(); + assert(pcm()); + beatDetect = new BeatDetect ( _pcm ); + + this->presetInputs.gx = gx; + this->presetInputs.gy = gy; + this->presetInputs2.gx = gx; + this->presetInputs2.gy = gy; + + this->renderer = new Renderer ( width, height, gx, gy, texsize, beatDetect, settings().presetURL, settings().titleFontURL, settings().menuFontURL, xpos, ypos, usefbo); + + initPresetTools(); + if ( presetInputs.fps > 0 ) + mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); + else mspf = 0; + + running = true; + +#ifdef USE_THREADS + pthread_mutex_init(&mutex, NULL); + pthread_cond_init(&condition, NULL); + if (pthread_create(&thread, NULL, thread_callback, this) != 0) + { + std::cerr << "failed to allocate a thread! try building with option USE_THREADS turned off" << std::endl;; + exit(1); + } +#endif + + renderer->setPresetName ( m_activePreset->presetName() ); + timeKeeper->StartPreset(); + assert(pcm()); +} + + +void projectM::projectM_initengine() +{ + + /* PER FRAME CONSTANTS BEGIN */ + this->presetOutputs.zoom=1.0; + this->presetOutputs.zoomexp= 1.0; + this->presetOutputs.rot= 0.0; + this->presetOutputs.warp= 0.0; + + this->presetOutputs.sx= 1.0; + this->presetOutputs.sy= 1.0; + this->presetOutputs.dx= 0.0; + this->presetOutputs.dy= 0.0; + this->presetOutputs.cx= 0.5; + this->presetOutputs.cy= 0.5; + + this->presetOutputs.decay=.98; + + this->presetOutputs.wave_r= 1.0; + this->presetOutputs.wave_g= 0.2; + this->presetOutputs.wave_b= 0.0; + this->presetOutputs.wave_x= 0.5; + this->presetOutputs.wave_y= 0.5; + this->presetOutputs.wave_mystery= 0.0; + + this->presetOutputs.ob_size= 0.0; + this->presetOutputs.ob_r= 0.0; + this->presetOutputs.ob_g= 0.0; + this->presetOutputs.ob_b= 0.0; + this->presetOutputs.ob_a= 0.0; + + this->presetOutputs.ib_size = 0.0; + this->presetOutputs.ib_r = 0.0; + this->presetOutputs.ib_g = 0.0; + this->presetOutputs.ib_b = 0.0; + this->presetOutputs.ib_a = 0.0; + + this->presetOutputs.mv_a = 0.0; + this->presetOutputs.mv_r = 0.0; + this->presetOutputs.mv_g = 0.0; + this->presetOutputs.mv_b = 0.0; + this->presetOutputs.mv_l = 1.0; + this->presetOutputs.mv_x = 16.0; + this->presetOutputs.mv_y = 12.0; + this->presetOutputs.mv_dy = 0.02; + this->presetOutputs.mv_dx = 0.02; + +//this->presetInputs.meshx = 0; +//this->presetInputs.meshy = 0; + + + this->presetInputs.progress = 0; + this->presetInputs.frame = 1; + this->presetInputs2.progress = 0; + this->presetInputs2.frame = 1; +//bass_thresh = 0; + + /* PER_FRAME CONSTANTS END */ + this->presetOutputs.fRating = 0; + this->presetOutputs.fGammaAdj = 1.0; + this->presetOutputs.fVideoEchoZoom = 1.0; + this->presetOutputs.fVideoEchoAlpha = 0; + this->presetOutputs.nVideoEchoOrientation = 0; + + this->presetOutputs.nWaveMode = 7; + this->presetOutputs.bAdditiveWaves = 0; + this->presetOutputs.bWaveDots = 0; + this->presetOutputs.bWaveThick = 0; + this->presetOutputs.bModWaveAlphaByVolume = 0; + this->presetOutputs.bMaximizeWaveColor = 0; + this->presetOutputs.bTexWrap = 0; + this->presetOutputs.bDarkenCenter = 0; + this->presetOutputs.bRedBlueStereo = 0; + this->presetOutputs.bBrighten = 0; + this->presetOutputs.bDarken = 0; + this->presetOutputs.bSolarize = 0; + this->presetOutputs.bInvert = 0; + this->presetOutputs.bMotionVectorsOn = 1; + + this->presetOutputs.fWaveAlpha =1.0; + this->presetOutputs.fWaveScale = 1.0; + this->presetOutputs.fWaveSmoothing = 0; + this->presetOutputs.fWaveParam = 0; + this->presetOutputs.fModWaveAlphaStart = 0; + this->presetOutputs.fModWaveAlphaEnd = 0; + this->presetOutputs.fWarpAnimSpeed = 0; + this->presetOutputs.fWarpScale = 0; + this->presetOutputs.fShader = 0; + + + /* PER_PIXEL CONSTANTS BEGIN */ + + /* PER_PIXEL CONSTANT END */ + + + /* Q AND T VARIABLES START */ + + this->presetOutputs.q1 = 0; + this->presetOutputs.q2 = 0; + this->presetOutputs.q3 = 0; + this->presetOutputs.q4 = 0; + this->presetOutputs.q5 = 0; + this->presetOutputs.q6 = 0; + this->presetOutputs.q7 = 0; + this->presetOutputs.q8 = 0; + + + /* Q AND T VARIABLES END */ + +} + +/* Reinitializes the engine variables to a default (conservative and sane) value */ +void projectM::projectM_resetengine() +{ + + this->presetOutputs.zoom=1.0; + this->presetOutputs.zoomexp= 1.0; + this->presetOutputs.rot= 0.0; + this->presetOutputs.warp= 0.0; + + this->presetOutputs.sx= 1.0; + this->presetOutputs.sy= 1.0; + this->presetOutputs.dx= 0.0; + this->presetOutputs.dy= 0.0; + this->presetOutputs.cx= 0.5; + this->presetOutputs.cy= 0.5; + + this->presetOutputs.decay=.98; + + this->presetOutputs.wave_r= 1.0; + this->presetOutputs.wave_g= 0.2; + this->presetOutputs.wave_b= 0.0; + this->presetOutputs.wave_x= 0.5; + this->presetOutputs.wave_y= 0.5; + this->presetOutputs.wave_mystery= 0.0; + + this->presetOutputs.ob_size= 0.0; + this->presetOutputs.ob_r= 0.0; + this->presetOutputs.ob_g= 0.0; + this->presetOutputs.ob_b= 0.0; + this->presetOutputs.ob_a= 0.0; + + this->presetOutputs.ib_size = 0.0; + this->presetOutputs.ib_r = 0.0; + this->presetOutputs.ib_g = 0.0; + this->presetOutputs.ib_b = 0.0; + this->presetOutputs.ib_a = 0.0; + + this->presetOutputs.mv_a = 0.0; + this->presetOutputs.mv_r = 0.0; + this->presetOutputs.mv_g = 0.0; + this->presetOutputs.mv_b = 0.0; + this->presetOutputs.mv_l = 1.0; + this->presetOutputs.mv_x = 16.0; + this->presetOutputs.mv_y = 12.0; + this->presetOutputs.mv_dy = 0.02; + this->presetOutputs.mv_dx = 0.02; + + + if ( beatDetect != NULL ) + { + beatDetect->reset(); + } + this->presetInputs.progress = 0; + this->presetInputs.frame = 1; + this->presetInputs2.progress = 0; + this->presetInputs2.frame = 1; +// bass_thresh = 0; + + /* PER_FRAME CONSTANTS END */ + this->presetOutputs.fRating = 0; + this->presetOutputs.fGammaAdj = 1.0; + this->presetOutputs.fVideoEchoZoom = 1.0; + this->presetOutputs.fVideoEchoAlpha = 0; + this->presetOutputs.nVideoEchoOrientation = 0; + + this->presetOutputs.nWaveMode = 7; + this->presetOutputs.bAdditiveWaves = 0; + this->presetOutputs.bWaveDots = 0; + this->presetOutputs.bWaveThick = 0; + this->presetOutputs.bModWaveAlphaByVolume = 0; + this->presetOutputs.bMaximizeWaveColor = 0; + this->presetOutputs.bTexWrap = 0; + this->presetOutputs.bDarkenCenter = 0; + this->presetOutputs.bRedBlueStereo = 0; + this->presetOutputs.bBrighten = 0; + this->presetOutputs.bDarken = 0; + this->presetOutputs.bSolarize = 0; + this->presetOutputs.bInvert = 0; + this->presetOutputs.bMotionVectorsOn = 1; + + this->presetOutputs.fWaveAlpha =1.0; + this->presetOutputs.fWaveScale = 1.0; + this->presetOutputs.fWaveSmoothing = 0; + this->presetOutputs.fWaveParam = 0; + this->presetOutputs.fModWaveAlphaStart = 0; + this->presetOutputs.fModWaveAlphaEnd = 0; + this->presetOutputs.fWarpAnimSpeed = 0; + this->presetOutputs.fWarpScale = 0; + this->presetOutputs.fShader = 0; + + + /* PER_PIXEL CONSTANTS BEGIN */ + this->presetInputs2.x_per_pixel = 0; + this->presetInputs2.y_per_pixel = 0; + this->presetInputs2.rad_per_pixel = 0; + this->presetInputs2.ang_per_pixel = 0; + this->presetInputs.x_per_pixel = 0; + this->presetInputs.y_per_pixel = 0; + this->presetInputs.rad_per_pixel = 0; + this->presetInputs.ang_per_pixel = 0; + + /* PER_PIXEL CONSTANT END */ + + /* Q VARIABLES START */ + + this->presetOutputs.q1 = 0; + this->presetOutputs.q2 = 0; + this->presetOutputs.q3 = 0; + this->presetOutputs.q4 = 0; + this->presetOutputs.q5 = 0; + this->presetOutputs.q6 = 0; + this->presetOutputs.q7 = 0; + this->presetOutputs.q8 = 0; + + + /* Q VARIABLES END */ + +} + +/** Resets OpenGL state */ +DLLEXPORT void projectM::projectM_resetGL ( int w, int h ) +{ + + /** Stash the new dimensions */ + + renderer->reset ( w,h ); +} + +/** Sets the title to display */ +DLLEXPORT void projectM::projectM_setTitle ( std::string title ) +{ + if ( title != renderer->title ) + { + renderer->title=title; + renderer->drawtitle=1; + } +} + + +int projectM::initPresetTools() +{ + + /* Initializes the builtin function database */ + BuiltinFuncs::init_builtin_func_db(); + + /* Initializes all infix operators */ + Eval::init_infix_ops(); + + /* Set the seed to the current time in seconds */ + srand ( time ( NULL ) ); + + std::string url = (m_flags & FLAG_DISABLE_PLAYLIST_LOAD) ? std::string() : settings().presetURL; + + if ( ( m_presetLoader = new PresetLoader ( url) ) == 0 ) + { + m_presetLoader = 0; + std::cerr << "[projectM] error allocating preset loader" << std::endl; + return PROJECTM_FAILURE; + } + + if ( ( m_presetChooser = new PresetChooser ( *m_presetLoader ) ) == 0 ) + { + delete ( m_presetLoader ); + + m_presetChooser = 0; + m_presetLoader = 0; + + std::cerr << "[projectM] error allocating preset chooser" << std::endl; + return PROJECTM_FAILURE; + } + + // Start the iterator + if (!m_presetPos) + m_presetPos = new PresetIterator(); + + // Initialize a preset queue position as well +// m_presetQueuePos = new PresetIterator(); + + // Start at end ptr- this allows next/previous to easily be done from this position. + *m_presetPos = m_presetChooser->end(); + + // Load idle preset + //std::cerr << "[projectM] Allocating idle preset..." << std::endl; + if (m_presetChooser->empty()) + m_activePreset = IdlePreset::allocate ( presetInputs, presetOutputs ); + else + switchPreset(m_activePreset, presetInputs, presetOutputs); + + // Case where no valid presets exist in directory. Could also mean + // playlist initialization was deferred + //if ( m_presetChooser->empty() ) + //{ + //std::cerr << "[projectM] warning: no valid files found in preset directory \"" + //<< m_presetLoader->directoryName() << "\"" << std::endl; + //} + + //std::cerr << "[projectM] Idle preset allocated." << std::endl; + + projectM_resetengine(); + + //std::cerr << "[projectM] engine has been reset." << std::endl; + return PROJECTM_SUCCESS; +} + +void projectM::destroyPresetTools() +{ + + if ( m_presetPos ) + delete ( m_presetPos ); + + /// @slow might not be necessary + m_presetPos = 0; + + if ( m_presetChooser ) + delete ( m_presetChooser ); + + /// @slow might not be necessary + m_presetChooser = 0; + + if ( m_presetLoader ) + delete ( m_presetLoader ); + + /// @slow might not be necessary + m_presetLoader = 0; + + Eval::destroy_infix_ops(); + BuiltinFuncs::destroy_builtin_func_db(); + +} + +/// @bug queuePreset case isn't handled +void projectM::removePreset(unsigned int index) { + + unsigned int chooserIndex = **m_presetPos; + + m_presetLoader->removePreset(index); + + + // Case: no more presets, set iterator to end + if (m_presetChooser->empty()) + *m_presetPos = m_presetChooser->end(); + + // Case: chooser index has become one less due to removal of an index below it + else if (chooserIndex > index) { + chooserIndex--; + *m_presetPos = m_presetChooser->begin(chooserIndex); + } + + // Case: we have deleted the active preset position + // Set iterator to end of chooser + else if (chooserIndex == index) { + //*m_presetPos = m_presetChooser->begin(chooserIndex); + std::cerr << "deleted active preset!"; + *m_presetPos = m_presetChooser->end(); + } + + + +} + +unsigned int projectM::addPresetURL ( const std::string & presetURL, const std::string & presetName, int rating ) +{ + bool restorePosition = false; + + if (*m_presetPos == m_presetChooser->end()) + restorePosition = true; + + int index = m_presetLoader->addPresetURL ( presetURL, presetName, rating); + + if (restorePosition) + *m_presetPos = m_presetChooser->end(); + + return index; +} + +void projectM::selectPreset ( unsigned int index ) +{ + + if ( m_presetChooser->empty() ) + return; + + assert ( index < m_presetLoader->getNumPresets() ); + assert ( index >= 0 ); + + *m_presetPos = m_presetChooser->begin ( index ); + + m_activePreset = m_presetPos->allocate ( presetInputs, presetOutputs ); + + renderer->setPresetName ( m_activePreset->presetName() ); + + timeKeeper->StartPreset(); +} + +void projectM::switchPreset(std::unique_ptr & targetPreset, PresetInputs & inputs, PresetOutputs & outputs) { + + if (_settings.shuffleEnabled) + *m_presetPos = m_presetChooser->weightedRandom(); + else + m_presetChooser->nextPreset(*m_presetPos); + + targetPreset = m_presetPos->allocate( inputs, outputs ); + + // Set preset name here- event is not done because at the moment this function is oblivious to smooth/hard switches + renderer->setPresetName ( targetPreset->presetName() ); + + +} + +void projectM::setPresetLock ( bool isLocked ) +{ + renderer->noSwitch = isLocked; +} + +bool projectM::isPresetLocked() const +{ + return renderer->noSwitch; +} + +std::string projectM::getPresetURL ( unsigned int index ) const +{ + return m_presetLoader->getPresetURL(index); +} + +int projectM::getPresetRating ( unsigned int index ) const +{ + return m_presetLoader->getPresetRating(index); +} + +std::string projectM::getPresetName ( unsigned int index ) const +{ + return m_presetLoader->getPresetName(index); +} + +void projectM::clearPlaylist ( ) +{ + + m_presetLoader->clear(); + *m_presetPos = m_presetChooser->end(); + +} + +/// Sets preset iterator position to the passed in index +void projectM::selectPresetPosition(unsigned int index) { + *m_presetPos = m_presetChooser->begin(index); +} + +bool projectM::selectedPresetIndex(unsigned int & index) const { + + if (*m_presetPos == m_presetChooser->end()) + return false; + + index = **m_presetPos; + return true; +} + + +bool projectM::presetPositionValid() const { + + return (*m_presetPos != m_presetChooser->end()); +} + +unsigned int projectM::getPlaylistSize() const +{ + return m_presetLoader->getNumPresets(); +} + +void projectM:: changePresetRating (unsigned int index, int rating) { + m_presetLoader->setRating(index, rating); +} + +void projectM::insertPresetURL(unsigned int index, const std::string & presetURL, const std::string & presetName, int rating) +{ + bool atEndPosition = false; + + int newSelectedIndex = index; + + + if (*m_presetPos == m_presetChooser->end()) // Case: preset not selected + { + atEndPosition = true; + } + + else if (**m_presetPos < index) // Case: inserting before selected preset + { + newSelectedIndex = **m_presetPos; + } + + else if (**m_presetPos > index) // Case: inserting after selected preset + { + newSelectedIndex++; + } + + else // Case: inserting at selected preset + { + newSelectedIndex++; + } + + m_presetLoader->insertPresetURL (index, presetURL, presetName, rating); + + if (atEndPosition) + *m_presetPos = m_presetChooser->end(); + else + *m_presetPos = m_presetChooser->begin(newSelectedIndex); + + +} + + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.dsp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.dsp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.dsp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.dsp 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,381 @@ +# Microsoft Developer Studio Project File - Name="projectM" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=projectM - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "projectM.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "projectM.mak" CFG="projectM - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "projectM - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "projectM - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "projectM - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "projectM - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "DEBUG" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "projectM - Win32 Release" +# Name "projectM - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\beat_detect.c +# End Source File +# Begin Source File + +SOURCE=.\browser.c +# End Source File +# Begin Source File + +SOURCE=.\builtin_funcs.c +# End Source File +# Begin Source File + +SOURCE=.\console_interface.c +# End Source File +# Begin Source File + +SOURCE=.\custom_shape.c +# End Source File +# Begin Source File + +SOURCE=.\custom_wave.c +# End Source File +# Begin Source File + +SOURCE=.\editor.c +# End Source File +# Begin Source File + +SOURCE=.\eval.c +# End Source File +# Begin Source File + +SOURCE=.\fftsg.c +# End Source File +# Begin Source File + +SOURCE=.\func.c +# End Source File +# Begin Source File + +SOURCE=.\glConsole.c +# End Source File +# Begin Source File + +SOURCE=.\glf.c +# End Source File +# Begin Source File + +SOURCE=.\init_cond.c +# End Source File +# Begin Source File + +SOURCE=.\menu.c +# End Source File +# Begin Source File + +SOURCE=.\param.c +# End Source File +# Begin Source File + +SOURCE=.\parser.c +# End Source File +# Begin Source File + +SOURCE=.\PCM.c +# End Source File +# Begin Source File + +SOURCE=.\per_frame_eqn.c +# End Source File +# Begin Source File + +SOURCE=.\per_pixel_eqn.c +# End Source File +# Begin Source File + +SOURCE=.\preset.c +# End Source File +# Begin Source File + +SOURCE=.\projectm.c +# End Source File +# Begin Source File + +SOURCE=.\pbuffer.c +# End Source File +# Begin Source File + +SOURCE=.\splaytree.c +# End Source File +# Begin Source File + +SOURCE=.\timer.c +# End Source File +# Begin Source File + +SOURCE=.\tree_types.c +# End Source File +# Begin Source File + +SOURCE=".\win32-dirent.c" +# End Source File +# Begin Source File + +SOURCE=.\wipemalloc.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\beat_detect.h +# End Source File +# Begin Source File + +SOURCE=.\browser.h +# End Source File +# Begin Source File + +SOURCE=.\builtin_funcs.h +# End Source File +# Begin Source File + +SOURCE=.\common.h +# End Source File +# Begin Source File + +SOURCE=.\compare.h +# End Source File +# Begin Source File + +SOURCE=.\config.h +# End Source File +# Begin Source File + +SOURCE=.\console_interface.h +# End Source File +# Begin Source File + +SOURCE=.\custom_shape.h +# End Source File +# Begin Source File + +SOURCE=.\custom_shape_types.h +# End Source File +# Begin Source File + +SOURCE=.\custom_wave.h +# End Source File +# Begin Source File + +SOURCE=.\custom_wave_types.h +# End Source File +# Begin Source File + +SOURCE=.\editor.h +# End Source File +# Begin Source File + +SOURCE=.\eval.h +# End Source File +# Begin Source File + +SOURCE=.\event.h +# End Source File +# Begin Source File + +SOURCE=.\expr_types.h +# End Source File +# Begin Source File + +SOURCE=.\fatal.h +# End Source File +# Begin Source File + +SOURCE=.\fftsg.h +# End Source File +# Begin Source File + +SOURCE=.\func.h +# End Source File +# Begin Source File + +SOURCE=.\func_types.h +# End Source File +# Begin Source File + +SOURCE=.\glConsole.h +# End Source File +# Begin Source File + +SOURCE=.\glf.h +# End Source File +# Begin Source File + +SOURCE=.\idle_preset.h +# End Source File +# Begin Source File + +SOURCE=.\init_cond.h +# End Source File +# Begin Source File + +SOURCE=.\init_cond_types.h +# End Source File +# Begin Source File + +SOURCE=.\interface_types.h +# End Source File +# Begin Source File + +SOURCE=.\menu.h +# End Source File +# Begin Source File + +SOURCE=.\param.h +# End Source File +# Begin Source File + +SOURCE=.\param_types.h +# End Source File +# Begin Source File + +SOURCE=.\parser.h +# End Source File +# Begin Source File + +SOURCE=.\PCM.h +# End Source File +# Begin Source File + +SOURCE=.\per_frame_eqn.h +# End Source File +# Begin Source File + +SOURCE=.\per_frame_eqn_types.h +# End Source File +# Begin Source File + +SOURCE=.\per_pixel_eqn.h +# End Source File +# Begin Source File + +SOURCE=.\per_pixel_eqn_types.h +# End Source File +# Begin Source File + +SOURCE=.\per_point_types.h +# End Source File +# Begin Source File + +SOURCE=.\preset.h +# End Source File +# Begin Source File + +SOURCE=.\preset_types.h +# End Source File +# Begin Source File + +SOURCE=.\projectM.h +# End Source File +# Begin Source File + +SOURCE=.\pbuffer.h +# End Source File +# Begin Source File + +SOURCE=.\splaytree.h +# End Source File +# Begin Source File + +SOURCE=.\splaytree_types.h +# End Source File +# Begin Source File + +SOURCE=.\timer.h +# End Source File +# Begin Source File + +SOURCE=.\tree_types.h +# End Source File +# Begin Source File + +SOURCE=".\win32-dirent.h" +# End Source File +# Begin Source File + +SOURCE=.\wipemalloc.h +# End Source File +# End Group +# End Target +# End Project diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/projectM.hpp 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,316 @@ +/* + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: projectM.hpp,v 1.1.1.1 2005/12/23 18:05:11 psperl Exp $ + * + * Encapsulation of ProjectM engine + * + * $Log$ + */ + +#ifndef _PROJECTM_H +#define _PROJECTM_H + +#ifdef WIN32 +#include "win32-dirent.h" +#else +#include +#endif /** WIN32 */ +#include +#include +#include +#include +#include +#ifndef WIN32 +#include +#endif +#include + +#ifdef MACOS +//#include +//#include +//#include +#else +#ifdef WIN32 +#include +#endif /** WIN32 */ + +#endif /** MACOS */ +#ifdef WIN322 +#define inline +#endif /** WIN32 */ + +#include "dlldefs.h" +#include "event.h" +#include "fatal.h" +#include "PresetFrameIO.hpp" +#include "PCM.hpp" +#include "pthread.h" + +#include + +class BeatDetect; +class PCM; +class Func; +class Renderer; +class Preset; +class PresetIterator; +class PresetChooser; +class PresetLoader; +class TimeKeeper; + +#include +#ifdef WIN32 +#pragma warning (disable:4244) +#pragma warning (disable:4305) +#endif /** WIN32 */ + +#ifdef MACOS2 +#define inline +#endif + +/** KEEP THIS UP TO DATE! */ +#define PROJECTM_VERSION "1.1.00" +#define PROJECTM_TITLE "projectM 1.1.00" + +/** Interface types */ +typedef enum { + MENU_INTERFACE, + SHELL_INTERFACE, + EDITOR_INTERFACE, + DEFAULT_INTERFACE, + BROWSER_INTERFACE + } interface_t; + +/// A functor class that allows users of this library to specify random preset behavior +class RandomizerFunctor { + + public: + //RandomizerFunctor(); + RandomizerFunctor(PresetChooser & chooser) ; + virtual ~RandomizerFunctor(); + virtual double operator() (int index); + private: + const PresetChooser & m_chooser; +}; + + +class projectM +{ +public: + static const int FLAG_NONE = 0; + static const int FLAG_DISABLE_PLAYLIST_LOAD = 1 << 0; + + struct Settings { + int meshX; + int meshY; + int fps; + int textureSize; + int windowWidth; + int windowHeight; + int windowLeft; + int windowBottom; + std::string presetURL; + std::string titleFontURL; + std::string menuFontURL; + int smoothPresetDuration; + int presetDuration; + float beatSensitivity; + bool aspectCorrection; + float easterEgg; + bool shuffleEnabled; + bool useFBO; + }; + + DLLEXPORT projectM(Settings config_pm, int flags = FLAG_NONE); + + //DLLEXPORT projectM(int gx, int gy, int fps, int texsize, int width, int height,std::string preset_url,std::string title_fonturl, std::string title_menuurl); + + DLLEXPORT void projectM_resetGL( int width, int height ); + DLLEXPORT void projectM_resetTextures(); + DLLEXPORT void projectM_setTitle( std::string title ); + DLLEXPORT void renderFrame(); + DLLEXPORT unsigned initRenderToTexture(); + DLLEXPORT void key_handler( projectMEvent event, + projectMKeycode keycode, projectMModifier modifier ); + + DLLEXPORT virtual ~projectM(); + + + + DLLEXPORT const Settings & settings() const { + return _settings; + } + + /// Sets preset iterator position to the passed in index + void selectPresetPosition(unsigned int index); + + /// Plays a preset immediately + void selectPreset(unsigned int index); + + /// Removes a preset from the play list. If it is playing then it will continue as normal until next switch + void removePreset(unsigned int index); + + /// Sets the randomization functor. If set to null, the traversal will move in order according to the playlist + void setRandomizer(RandomizerFunctor * functor); + + /// Tell projectM to play a particular preset when it chooses to switch + /// If the preset is locked the queued item will be not switched to until the lock is released + /// Subsequent calls to this function effectively nullifies previous calls. + void queuePreset(unsigned int index); + + /// Returns true if a preset is queued up to play next + bool isPresetQueued() const; + + /// Removes entire playlist, The currently loaded preset will end up sticking until new presets are added + void clearPlaylist(); + + /// Turn on or off a lock that prevents projectM from switching to another preset + void setPresetLock(bool isLocked); + + /// Returns true if the active preset is locked + bool isPresetLocked() const; + + /// Returns index of currently active preset. In the case where the active + /// preset was removed from the playlist, this function will return the element + /// before active preset (thus the next in order preset is invariant with respect + /// to the removal) + bool selectedPresetIndex(unsigned int & index) const; + + /// Add a preset url to the play list. Appended to bottom. Returns index of preset + unsigned int addPresetURL(const std::string & presetURL, const std::string & presetName, int rating); + + /// Insert a preset url to the play list at the suggested index. + void insertPresetURL(unsigned int index, + const std::string & presetURL, const std::string & presetName, int rating); + + /// Returns true if the selected preset position points to an actual preset in the + /// currently loaded playlist + bool presetPositionValid() const; + + /// Returns the url associated with a preset index + std::string getPresetURL(unsigned int index) const; + + /// Returns the preset name associated with a preset index + std::string getPresetName ( unsigned int index ) const; + + /// Returns the rating associated with a preset index + int getPresetRating (unsigned int index) const; + + void changePresetRating (unsigned int index, int rating); + + /// Returns the size of the play list + unsigned int getPlaylistSize() const; + + void evaluateSecondPreset(); + + inline void setShuffleEnabled(bool value) + { + _settings.shuffleEnabled = value; + + /// idea@ call a virtualfunction shuffleChanged() + } + + + inline bool isShuffleEnabled() const + { + return _settings.shuffleEnabled; + } + + /// Occurs when active preset has switched. Switched to index is returned + virtual void presetSwitchedEvent(bool isHardCut, unsigned int index) const {}; + virtual void shuffleEnabledValueChanged(bool isEnabled) const {}; + + + inline const PCM * pcm() { + return _pcm; + } + void *thread_func(void *vptr_args); + +private: + + double sampledPresetDuration(); + BeatDetect * beatDetect; + Renderer *renderer; + Settings _settings; + + int wvw; //windowed dimensions + int wvh; + + /** Timing information */ + int mspf; + int timed; + int timestart; + int count; + float fpsstart; + + void switchPreset(std::unique_ptr & targetPreset, PresetInputs & inputs, PresetOutputs & outputs); + void readConfig(const Settings configpm); + void projectM_init(int gx, int gy, int fps, int texsize, int width, int height, int xpos, int ypos, bool useFBO); + void projectM_reset(); + + void projectM_initengine(); + void projectM_resetengine(); + /// Initializes preset loading / management libraries + int initPresetTools(); + + /// Deinitialize all preset related tools. Usually done before projectM cleanup + void destroyPresetTools(); + + void default_key_handler( projectMEvent event, projectMKeycode keycode ); + void setupPresetInputs(PresetInputs *inputs); + /// The current position of the directory iterator + PresetIterator * m_presetPos; + + /// Required by the preset chooser. Manages a loaded preset directory + PresetLoader * m_presetLoader; + + /// Provides accessor functions to choose presets + PresetChooser * m_presetChooser; + + /// Currently loaded preset + std::unique_ptr m_activePreset; + + /// Destination preset when smooth preset switching + std::unique_ptr m_activePreset2; + + /// All readonly variables which are passed as inputs to presets + PresetInputs presetInputs; + PresetInputs presetInputs2; + /// A preset outputs container used and modified by the "current" preset + PresetOutputs presetOutputs; + + /// A preset outputs container used for smooth preset switching + PresetOutputs presetOutputs2; + + TimeKeeper *timeKeeper; + + PCM * _pcm; + int m_flags; + + +pthread_mutex_t mutex; +pthread_cond_t condition; +pthread_t thread; + bool running; + +}; +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/RandomNumberGenerators.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/RandomNumberGenerators.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/RandomNumberGenerators.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/RandomNumberGenerators.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,118 @@ +#ifndef RANDOM_NUMBER_GENERATORS_HPP +#define RANDOM_NUMBER_GENERATORS_HPP +#include +#include +#include +#include + +namespace RandomNumberGenerators { + +inline float uniform() +/* Uniform random number generator x(n+1)= a*x(n) mod c + with a = pow(7,5) and c = pow(2,31)-1. + Copyright (c) Tao Pang 1997. */ + { + const int ia=16807,ic=2147483647,iq=127773,ir=2836; + int il,ih,it; + float rc; + static int iseed = rand(); + ih = iseed/iq; + il = iseed%iq; + it = ia*il-ir*ih; + if (it > 0) + { + iseed = it; + } + else + { + iseed = ic+it; + } + rc = ic; + return iseed/rc; + } + +inline float gaussian(float mean, float sigma) +{ + + float x1, x2, w, y1, y2; + + do { + x1 = 2.0 * uniform() - 1.0; + x2 = 2.0 * uniform() - 1.0; + w = x1 * x1 + x2 * x2; + } while ( w >= 1.0 ); + + w = sqrt( (-2.0 * log( w ) ) / w ); + y1 = x1 * w; + y2 = x2 * w; + + float ret = y1*sigma + mean; + + return ret; +} + +inline std::size_t uniformInteger(std::size_t upperBound=1) { + + + /// @bug there was a man entry about how this leads to a lousy uniform + /// @bug distribution in practice. should probably review + assert(upperBound > 0); + return ((rand()) % ((int)upperBound)); +} + + + + +/// Randomizes from probabilistically weighted distribution. Thus, +/// sum of passed in weights should be 1.0 +inline std::size_t weightedRandomNormalized(std::vector weights) { + +#ifdef WIN32 + // Choose a random bounded mass between 0 and 1 + float cutoff = ((float)(rand())) / RAND_MAX; +#endif + +#ifdef LINUX + // Choose a random bounded mass between 0 and 1 + float cutoff = ((float)(random())) / RAND_MAX; +#endif + +#ifdef MACOS + // Choose a random bounded mass between 0 and 1 + float cutoff = ((float)(rand())) / RAND_MAX; +#endif + + // Sum up mass, stopping when cutoff is reached. This is the typical + // weighted sampling algorithm. + float mass = 0; + for (std::size_t i = 0; i< weights.size() ; i++) { + mass += weights[i]; + if (mass >= cutoff) + return i; + } + + // Just in case something slips through the cracks + return weights.size()-1; +} + +inline std::size_t weightedRandom(const std::vector & weights, unsigned int weightTotalHint = 0) { + + + if (weightTotalHint == 0) { + for (std::size_t i = 0; i < weights.size();i++) + weightTotalHint += weights[i]; + } + + int sampledSum = uniformInteger(weightTotalHint); + int sum = 0; + + for (std::size_t i = 0; i < weights.size();i++) { + sum += weights[i]; + if (sampledSum <= sum) + return i; + } + return weights.size()-1; +} + +} +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Renderer.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Renderer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Renderer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Renderer.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,2002 @@ +#include "Renderer.hpp" +#include "wipemalloc.h" +#include "math.h" +#include "Common.hpp" +#include "CustomShape.hpp" +#include "CustomWave.hpp" +#include "KeyHandler.hpp" +#include "TextureManager.hpp" +#include +#include +#include "SectionLock.h" + +class Preset; + +Renderer::Renderer(int width, int height, int gx, int gy, int texsize, BeatDetect *beatDetect, std::string _presetURL, std::string _titlefontURL, std::string _menufontURL, int xpos, int ypos, bool usefbo): title_fontURL(_titlefontURL), menu_fontURL(_menufontURL), presetURL(_presetURL), m_presetName("None"), vw(width), vh(height), gx(gx), gy(gy), texsize(texsize), vx(xpos), vy(ypos), useFBO(usefbo) +{ + int x; int y; + + // this->gx=gx; + // this->gy=gy; +#ifdef _USE_THREADS + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&_renderer_lock, &attr); + pthread_mutexattr_destroy(&attr); +#endif + + + this->totalframes = 1; + this->noSwitch = false; + this->showfps = false; + this->showtitle = false; + this->showpreset = false; + this->showhelp = false; + this->showstats = false; + this->studio = false; + this->realfps=0; + + this->drawtitle=0; + + this->title = "Unknown"; + + /** Other stuff... */ + this->correction = true; + this->aspect=1.33333333; + + this->gridx=(float **)wipemalloc(gx * sizeof(float *)); + for(x = 0; x < gx; x++) + { + this->gridx[x] = (float *)wipemalloc(gy * sizeof(float)); + } + this->gridy=(float **)wipemalloc(gx * sizeof(float *)); + for(x = 0; x < gx; x++) + { + this->gridy[x] = (float *)wipemalloc(gy * sizeof(float)); + } + + this->origx2=(float **)wipemalloc(gx * sizeof(float *)); + for(x = 0; x < gx; x++) + { + this->origx2[x] = (float *)wipemalloc(gy * sizeof(float)); + } + this->origy2=(float **)wipemalloc(gx * sizeof(float *)); + for(x = 0; x < gx; x++) + { + this->origy2[x] = (float *)wipemalloc(gy * sizeof(float)); + } + + //initialize reference grid values + for (x=0;xgridx[x][y]=origx; + this->gridy[x][y]=origy; + this->origx2[x][y]=( origx-.5)*2; + this->origy2[x][y]=( origy-.5)*2; + + } + } + + /// @bug put these on member init list + this->renderTarget = new RenderTarget( texsize, width, height, useFBO ); + this->textureManager = new TextureManager(presetURL); + this->beatDetect = beatDetect; + + +#ifdef USE_FTGL + /**f Load the standard fonts */ + + title_font = new FTGLPixmapFont(title_fontURL.c_str()); + other_font = new FTGLPixmapFont(menu_fontURL.c_str()); + other_font->UseDisplayList(true); + title_font->UseDisplayList(true); + + + poly_font = new FTGLExtrdFont(title_fontURL.c_str()); + + poly_font->UseDisplayList(true); + poly_font->Depth(20); + poly_font->FaceSize(72); + + poly_font->UseDisplayList(true); + +#endif /** USE_FTGL */ + + +} + +void Renderer::ResetTextures() +{ + CSectionLock lock(&_renderer_lock); + textureManager->Clear(); + + delete(renderTarget); + renderTarget = new RenderTarget(texsize, vw, vh, useFBO); + reset(vw, vh); + + textureManager->Preload(); +} + +void Renderer::RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInputs) +{ + /** Save original view state */ + // TODO: check there is sufficient room on the stack + CSectionLock lock(&_renderer_lock); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + GLint viewport[4]; + glGetIntegerv(GL_VIEWPORT, viewport); + + totalframes++; + + //BEGIN PASS 1 + // + //This pass is used to render our texture + //the texture is drawn to a FBO or a subsection of the framebuffer + //and then we perform our manipulations on it in pass 2 we + //will copy the image into texture memory and render the final image + + + //Lock FBO + renderTarget->lock(); + + glViewport( 0, 0, renderTarget->texsize, renderTarget->texsize ); + + glEnable( GL_TEXTURE_2D ); + + //If using FBO, sitch to FBO texture + if(this->renderTarget->useFBO) + { + glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[1] ); + } + else + { + glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[0] ); + } + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + + + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); +#ifdef USE_GLES1 + glOrthof(0.0, 1, 0.0, 1, -40, 40); +#else + glOrtho(0.0, 1, 0.0, 1, -40, 40); +#endif + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + + + if(this->renderTarget->useFBO) + { + //draw_motion_vectors(); //draw motion vectors + //unlockPBuffer( this->renderTarget); + //lockPBuffer( this->renderTarget, PBUFFER_PASS1 ); + } + + Interpolation(presetOutputs, presetInputs); + + // if(!this->renderTarget->useFBO) + { + draw_motion_vectors(presetOutputs); + } + + draw_shapes(presetOutputs); + draw_custom_waves(presetOutputs); + draw_waveform(presetOutputs); + if(presetOutputs->bDarkenCenter)darken_center(); + draw_borders(presetOutputs); + draw_title_to_texture(); + /** Restore original view state */ + glMatrixMode( GL_MODELVIEW ); + glPopMatrix(); + + glMatrixMode( GL_PROJECTION ); + glPopMatrix(); + + renderTarget->unlock(); + + +#ifdef DEBUG + GLint msd = 0, psd = 0; + glGetIntegerv( GL_MODELVIEW_STACK_DEPTH, &msd ); + glGetIntegerv( GL_PROJECTION_STACK_DEPTH, &psd ); + DWRITE( "end pass1: modelview matrix depth: %d\tprojection matrix depth: %d\n", msd, psd ); + DWRITE( "begin pass2\n" ); +#endif + + //BEGIN PASS 2 + // + //end of texture rendering + //now we copy the texture from the FBO or framebuffer to + //video texture memory and render fullscreen. + + /** Reset the viewport size */ +#ifdef USE_FBO + if(renderTarget->renderToTexture) + { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->renderTarget->fbuffer[1]); + glViewport( 0, 0, this->renderTarget->texsize, this->renderTarget->texsize ); + } + else +#endif + glViewport( viewport[0], viewport[1], viewport[2], viewport[3] ); + + + + glBindTexture( GL_TEXTURE_2D, this->renderTarget->textureID[0] ); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); +#ifdef USE_GLES1 + glOrthof(-0.5, 0.5, -0.5, 0.5, -40, 40); +#else + glOrtho(-0.5, 0.5, -0.5, 0.5, -40, 40); +#endif + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glLineWidth( this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize/512.0); + if(this->studio%2)render_texture_to_studio(presetOutputs, presetInputs); + else render_texture_to_screen(presetOutputs); + + + glMatrixMode(GL_MODELVIEW); + glTranslatef(-0.5, -0.5, 0); + + // When console refreshes, there is a chance the preset has been changed by the user + refreshConsole(); + draw_title_to_screen(false); + if(this->showhelp%2) draw_help(); + if(this->showtitle%2) draw_title(); + if(this->showfps%2) draw_fps(this->realfps); + if(this->showpreset%2) draw_preset(); + if(this->showstats%2) draw_stats(presetInputs); + glTranslatef(0.5 , 0.5, 0); + +#ifdef USE_FBO + if(renderTarget->renderToTexture) + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); +#endif +} + + +void Renderer::Interpolation(PresetOutputs *presetOutputs, PresetInputs *presetInputs) +{ + CSectionLock lock(&_renderer_lock); + //Texture wrapping( clamp vs. wrap) + if (presetOutputs->bTexWrap==0) + { +#ifdef USE_GLES1 + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +#else + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); +#endif + } + else + { glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);} + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + + glBlendFunc(GL_SRC_ALPHA, GL_ZERO); + + glColor4f(1.0, 1.0, 1.0, presetOutputs->decay); + + glEnable(GL_TEXTURE_2D); + + int size = presetInputs->gy; + +#ifdef _WIN32PC + // guessed value. solved in current projectM svn + float p[30*2][2]; + float t[30*2][2]; +#else + float p[size*2][2]; + float t[size*2][2]; +#endif + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glVertexPointer(2,GL_FLOAT,0,p); + glTexCoordPointer(2,GL_FLOAT,0,t); + + for (int x=0;xgx - 1;x++) + { + for(int y=0;ygy;y++) + { + t[y*2][0] = presetOutputs->x_mesh[x][y]; + t[y*2][1] = presetOutputs->y_mesh[x][y]; + + p[y*2][0] = this->gridx[x][y]; + p[y*2][1] = this->gridy[x][y]; + + t[(y*2)+1][0] = presetOutputs->x_mesh[x+1][y]; + t[(y*2)+1][1] = presetOutputs->y_mesh[x+1][y]; + + p[(y*2)+1][0] = this->gridx[x+1][y]; + p[(y*2)+1][1] = this->gridy[x+1][y]; + + } + glDrawArrays(GL_TRIANGLE_STRIP,0,size*2); + } + + + + glDisable(GL_TEXTURE_2D); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + +} + + +Renderer::~Renderer() +{ + + int x; + + + if (renderTarget) + delete(renderTarget); + if (textureManager) + delete(textureManager); + + assert(gx > 0); + for(x = 0; x < this->gx; x++) + { + free(this->gridx[x]); + free(this->gridy[x]); + free(this->origx2[x]); + free(this->origy2[x]); + } + + + //std::cerr << "freeing grids" << std::endl; + free(this->origx2); + free(this->origy2); + free(this->gridx); + free(this->gridy); + +//std:cerr << "grid assign begin " << std::endl; + this->origx2 = NULL; + this->origy2 = NULL; + this->gridx = NULL; + this->gridy = NULL; + +//std::cerr << "grid assign end" << std::endl; + +#ifdef USE_FTGL +// std::cerr << "freeing title fonts" << std::endl; + if (title_font) + delete title_font; + if (poly_font) + delete poly_font; + if (other_font) + delete other_font; +// std::cerr << "freeing title fonts finished" << std::endl; +#endif +// std::cerr << "exiting destructor" << std::endl; +#ifdef _USE_THREADS + pthread_mutex_destroy(&_renderer_lock); +#endif +} + + +void Renderer::PerPixelMath(PresetOutputs * presetOutputs, PresetInputs * presetInputs) +{ + + int x, y; + float fZoom2, fZoom2Inv; + CSectionLock lock(&_renderer_lock); + + + for (x=0;xgx;x++) + { + for(y=0;ygy;y++) + { + fZoom2 = powf( presetOutputs->zoom_mesh[x][y], powf( presetOutputs->zoomexp_mesh[x][y], presetInputs->rad_mesh[x][y]*2.0f - 1.0f)); + fZoom2Inv = 1.0f/fZoom2; + presetOutputs->x_mesh[x][y]= this->origx2[x][y]*0.5f*fZoom2Inv + 0.5f; + presetOutputs->y_mesh[x][y]= this->origy2[x][y]*0.5f*fZoom2Inv + 0.5f; + } + } + + for (x=0;xgx;x++) + { + for(y=0;ygy;y++) + { + presetOutputs->x_mesh[x][y] = ( presetOutputs->x_mesh[x][y] - presetOutputs->cx_mesh[x][y])/presetOutputs->sx_mesh[x][y] + presetOutputs->cx_mesh[x][y]; + } + } + + for (x=0;xgx;x++) + { + for(y=0;ygy;y++) + { + presetOutputs->y_mesh[x][y] = ( presetOutputs->y_mesh[x][y] - presetOutputs->cy_mesh[x][y])/presetOutputs->sy_mesh[x][y] + presetOutputs->cy_mesh[x][y]; + } + } + + float fWarpTime = presetInputs->time * presetOutputs->fWarpAnimSpeed; + float fWarpScaleInv = 1.0f / presetOutputs->fWarpScale; + float f[4]; + f[0] = 11.68f + 4.0f*cosf(fWarpTime*1.413f + 10); + f[1] = 8.77f + 3.0f*cosf(fWarpTime*1.113f + 7); + f[2] = 10.54f + 3.0f*cosf(fWarpTime*1.233f + 3); + f[3] = 11.49f + 4.0f*cosf(fWarpTime*0.933f + 5); + + for (x=0;xgx;x++) + { + for(y=0;ygy;y++) + { + presetOutputs->x_mesh[x][y] += presetOutputs->warp_mesh[x][y]*0.0035f*sinf(fWarpTime*0.333f + fWarpScaleInv*(this->origx2[x][y]*f[0] - this->origy2[x][y]*f[3])); + presetOutputs->y_mesh[x][y] += presetOutputs->warp_mesh[x][y]*0.0035f*cosf(fWarpTime*0.375f - fWarpScaleInv*(this->origx2[x][y]*f[2] + this->origy2[x][y]*f[1])); + presetOutputs->x_mesh[x][y] += presetOutputs->warp_mesh[x][y]*0.0035f*cosf(fWarpTime*0.753f - fWarpScaleInv*(this->origx2[x][y]*f[1] - this->origy2[x][y]*f[2])); + presetOutputs->y_mesh[x][y] += presetOutputs->warp_mesh[x][y]*0.0035f*sinf(fWarpTime*0.825f + fWarpScaleInv*(this->origx2[x][y]*f[0] + this->origy2[x][y]*f[3])); + } + } + for (x=0;xgx;x++) + { + for(y=0;ygy;y++) + { + float u2 = presetOutputs->x_mesh[x][y] - presetOutputs->cx_mesh[x][y]; + float v2 = presetOutputs->y_mesh[x][y] - presetOutputs->cy_mesh[x][y]; + + float cos_rot = cosf(presetOutputs->rot_mesh[x][y]); + float sin_rot = sinf(presetOutputs->rot_mesh[x][y]); + + presetOutputs->x_mesh[x][y] = u2*cos_rot - v2*sin_rot + presetOutputs->cx_mesh[x][y]; + presetOutputs->y_mesh[x][y] = u2*sin_rot + v2*cos_rot + presetOutputs->cy_mesh[x][y]; + + } + } + + + for (x=0;xgx;x++) + { + for(y=0;ygy;y++) + { + presetOutputs->x_mesh[x][y] -= presetOutputs->dx_mesh[x][y]; + } + } + + + + for (x=0;xgx;x++) + { + for(y=0;ygy;y++) + { + presetOutputs->y_mesh[x][y] -= presetOutputs->dy_mesh[x][y]; + } + } + +} + + + +void Renderer::reset(int w, int h) +{ + CSectionLock lock(&_renderer_lock); + this->aspect=(float)h / (float)w; + this -> vw = w; + this -> vh = h; + + glShadeModel( GL_SMOOTH); + + glCullFace( GL_BACK ); + //glFrontFace( GL_CCW ); + + glClearColor( 0, 0, 0, 0 ); + + glViewport( 0, 0, w, h ); + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + +#ifndef USE_GLES1 + glDrawBuffer(GL_BACK); + glReadBuffer(GL_BACK); +#endif + glEnable(GL_BLEND); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glEnable( GL_LINE_SMOOTH ); + + +// glEnable(GL_POINT_SMOOTH); + glClear(GL_COLOR_BUFFER_BIT); + +#ifndef USE_GLES1 + glLineStipple(2, 0xAAAA); +#endif + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); + //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + + if (!this->renderTarget->useFBO) + { + this->renderTarget->fallbackRescale(w, h); + } +} + + +void Renderer::draw_custom_waves(PresetOutputs *presetOutputs) +{ + + int x; + + CSectionLock lock(&_renderer_lock); + + glPointSize(this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize/512); + + for (PresetOutputs::cwave_container::const_iterator pos = presetOutputs->customWaves.begin(); + pos != presetOutputs->customWaves.end(); ++pos) + { + + if( (*pos)->enabled==1) + { + + if ( (*pos)->bAdditive==0) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + else glBlendFunc(GL_SRC_ALPHA, GL_ONE); + if ( (*pos)->bDrawThick==1) + { glLineWidth(this->renderTarget->texsize < 512 ? 1 : 2*this->renderTarget->texsize/512); + glPointSize(this->renderTarget->texsize < 512 ? 1 : 2*this->renderTarget->texsize/512); + + } + beatDetect->pcm->getPCM( (*pos)->value1, (*pos)->samples, 0, (*pos)->bSpectrum, (*pos)->smoothing, 0); + beatDetect->pcm->getPCM( (*pos)->value2, (*pos)->samples, 1, (*pos)->bSpectrum, (*pos)->smoothing, 0); + // printf("%f\n",pcmL[0]); + + + float mult= (*pos)->scaling*presetOutputs->fWaveScale*( (*pos)->bSpectrum ? 0.015f :1.0f); + + for(x=0;x< (*pos)->samples;x++) + { (*pos)->value1[x]*=mult;} + + for(x=0;x< (*pos)->samples;x++) + { (*pos)->value2[x]*=mult;} + + for(x=0;x< (*pos)->samples;x++) + { (*pos)->sample_mesh[x]=((float)x)/((float)( (*pos)->samples-1));} + + // printf("mid inner loop\n"); + (*pos)->evalPerPointEqns(); + +#ifdef _WIN32PC + char buf[1024]; + sprintf(buf, "%s: samples = %d\n", __FUNCTION__,(*pos)->samples); + OutputDebugString( buf ); + float colors[1024][4]; + float points[1024][2]; +#else + float colors[(*pos)->samples][4]; + float points[(*pos)->samples][2]; +#endif + + for(x=0;x< (*pos)->samples;x++) + { + colors[x][0] = (*pos)->r_mesh[x]; + colors[x][1] = (*pos)->g_mesh[x]; + colors[x][2] = (*pos)->b_mesh[x]; + colors[x][3] = (*pos)->a_mesh[x]; + + points[x][0] = (*pos)->x_mesh[x]; + points[x][1] = -( (*pos)->y_mesh[x]-1); + + } + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + + glVertexPointer(2,GL_FLOAT,0,points); + glColorPointer(4,GL_FLOAT,0,colors); + + + if ( (*pos)->bUseDots==1) + glDrawArrays(GL_POINTS,0,(*pos)->samples); + else glDrawArrays(GL_LINE_STRIP,0,(*pos)->samples); + + glPointSize(this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize/512); + glLineWidth(this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize/512); +#ifndef USE_GLES1 + glDisable(GL_LINE_STIPPLE); +#endif + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + // glPopMatrix(); + + } + } + + +} + +void Renderer::draw_shapes(PresetOutputs *presetOutputs) +{ + + + CSectionLock lock(&_renderer_lock); + float radius; + float xval, yval; + float t; + + float aspect=this->aspect; + + for (PresetOutputs::cshape_container::const_iterator pos = presetOutputs->customShapes.begin(); + pos != presetOutputs->customShapes.end(); ++pos) + { + + if( (*pos)->enabled==1) + { + + // printf("drawing shape %f\n", (*pos)->ang); + (*pos)->y=-(( (*pos)->y)-1); + radius=.5; + (*pos)->radius= (*pos)->radius*(.707*.707*.707*1.04); + //Additive Drawing or Overwrite + if ( (*pos)->additive==0) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + else glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + xval= (*pos)->x; + yval= (*pos)->y; + + if ( (*pos)->textured) + { + + if ((*pos)->getImageUrl() !="") + { + GLuint tex = textureManager->getTexture((*pos)->getImageUrl()); + if (tex != 0) + { + glBindTexture(GL_TEXTURE_2D, tex); + aspect=1.0; + } + } + + + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + + glEnable(GL_TEXTURE_2D); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + +#ifdef _WIN32PC + char buf[1024]; + sprintf(buf, "%s: sides = %d\n", __FUNCTION__,(*pos)->sides); + OutputDebugString( buf ); + float colors[1024][4]; + float tex[1024][2]; + float points[1024][2]; +#else + float colors[(*pos)->sides+2][4]; + float tex[(*pos)->sides+2][2]; + float points[(*pos)->sides+2][2]; +#endif + + //Define the center point of the shape + colors[0][0] = (*pos)->r; + colors[0][1] = (*pos)->g; + colors[0][2] = (*pos)->b; + colors[0][3] = (*pos)->a; + tex[0][0] = 0.5; + tex[0][1] = 0.5; + points[0][0] = xval; + points[0][1] = yval; + + for ( int i=1;i< (*pos)->sides+2;i++) + { + colors[i][0]= (*pos)->r2; + colors[i][1]=(*pos)->g2; + colors[i][2]=(*pos)->b2; + colors[i][3]=(*pos)->a2; + + t = (i-1)/(float) (*pos)->sides; + tex[i][0] =0.5f + 0.5f*cosf(t*3.1415927f*2 + (*pos)->tex_ang + 3.1415927f*0.25f)*(this->correction ? aspect : 1.0)/ (*pos)->tex_zoom; + tex[i][1] = 0.5f + 0.5f*sinf(t*3.1415927f*2 + (*pos)->tex_ang + 3.1415927f*0.25f)/ (*pos)->tex_zoom; + points[i][0]=(*pos)->radius*cosf(t*3.1415927f*2 + (*pos)->ang + 3.1415927f*0.25f)*(this->correction ? aspect : 1.0)+xval; + points[i][1]=(*pos)->radius*sinf(t*3.1415927f*2 + (*pos)->ang + 3.1415927f*0.25f)+yval; + + + + } + + glVertexPointer(2,GL_FLOAT,0,points); + glColorPointer(4,GL_FLOAT,0,colors); + glTexCoordPointer(2,GL_FLOAT,0,tex); + + glDrawArrays(GL_TRIANGLE_FAN,0,(*pos)->sides+2); + + glDisable(GL_TEXTURE_2D); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //Reset Texture state since we might have changed it + if(this->renderTarget->useFBO) + { + glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[1] ); + } + else + { + glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[0] ); + } + + + } + else + {//Untextured (use color values) + + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + +#ifdef _WIN32PC + char buf[1024]; + sprintf(buf, "%s: sides = %d\n", __FUNCTION__,(*pos)->sides+2); + OutputDebugString( buf ); + float colors[1024][4]; + float points[1024][2]; +#else + float colors[(*pos)->sides+2][4]; + float points[(*pos)->sides+2][2]; +#endif + + //Define the center point of the shape + colors[0][0]=(*pos)->r; + colors[0][1]=(*pos)->g; + colors[0][2]=(*pos)->b; + colors[0][3]=(*pos)->a; + points[0][0]=xval; + points[0][1]=yval; + + + + for ( int i=1;i< (*pos)->sides+2;i++) + { + colors[i][0]=(*pos)->r2; + colors[i][1]=(*pos)->g2; + colors[i][2]=(*pos)->b2; + colors[i][3]=(*pos)->a2; + t = (i-1)/(float) (*pos)->sides; + points[i][0]=(*pos)->radius*cosf(t*3.1415927f*2 + (*pos)->ang + 3.1415927f*0.25f)*(this->correction ? aspect : 1.0)+xval; + points[i][1]=(*pos)->radius*sinf(t*3.1415927f*2 + (*pos)->ang + 3.1415927f*0.25f)+yval; + + } + + glVertexPointer(2,GL_FLOAT,0,points); + glColorPointer(4,GL_FLOAT,0,colors); + + + glDrawArrays(GL_TRIANGLE_FAN,0,(*pos)->sides+2); + //draw first n-1 triangular pieces + + } + if (presetOutputs->bWaveThick==1) glLineWidth(this->renderTarget->texsize < 512 ? 1 : 2*this->renderTarget->texsize/512); + + glEnableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + +#ifdef _WIN32PC + char buf[1024]; + sprintf(buf, "%s: sides = %d\n", __FUNCTION__,(*pos)->sides+1); + OutputDebugString( buf ); + float points[1024][2]; +#else + float points[(*pos)->sides+1][2]; +#endif + + glColor4f( (*pos)->border_r, (*pos)->border_g, (*pos)->border_b, (*pos)->border_a); + + for ( int i=0;i< (*pos)->sides;i++) + { + t = (i-1)/(float) (*pos)->sides; + points[i][0]= (*pos)->radius*cosf(t*3.1415927f*2 + (*pos)->ang + 3.1415927f*0.25f)*(this->correction ? aspect : 1.0)+xval; + points[i][1]= (*pos)->radius*sinf(t*3.1415927f*2 + (*pos)->ang + 3.1415927f*0.25f)+yval; + + } + + glVertexPointer(2,GL_FLOAT,0,points); + glDrawArrays(GL_LINE_LOOP,0,(*pos)->sides); + + if (presetOutputs->bWaveThick==1) glLineWidth(this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize/512); + + + } + } + + +} + +void Renderer::WaveformMath(PresetOutputs *presetOutputs, PresetInputs *presetInputs, bool isSmoothing) +{ + + int x; + + float r, theta; + + float offset, scale; + + float wave_x_temp=0; + float wave_y_temp=0; + + float cos_rot; + float sin_rot; + CSectionLock lock(&_renderer_lock); + + offset=presetOutputs->wave_x-.5; + scale=505.0/512.0; + + presetOutputs->two_waves = false; + presetOutputs->draw_wave_as_loop = false; + + switch(presetOutputs->nWaveMode) + { + + case 0: + { + presetOutputs->draw_wave_as_loop = true; + presetOutputs->wave_rot = 0; + presetOutputs->wave_scale =1.0; + presetOutputs->wave_y=-1*(presetOutputs->wave_y-1.0); + + + presetOutputs->wave_samples = isSmoothing ? 512-32 : beatDetect->pcm->numsamples; + + float inv_nverts_minus_one = 1.0f/(float)(presetOutputs->wave_samples); + + float last_value = beatDetect->pcm->pcmdataR[presetOutputs->wave_samples-1]+beatDetect->pcm->pcmdataL[presetOutputs->wave_samples-1]; + float first_value = beatDetect->pcm->pcmdataR[0]+beatDetect->pcm->pcmdataL[0]; + float offset = first_value-last_value; + + for ( x=0;xwave_samples;x++) + { + + + float value = beatDetect->pcm->pcmdataR[x]+beatDetect->pcm->pcmdataL[x]; + value += offset * (x/(float)presetOutputs->wave_samples); + + r=(0.5 + 0.4f*.12*value*presetOutputs->fWaveScale + presetOutputs->wave_mystery)*.5; + theta=(x)*inv_nverts_minus_one*6.28f + presetInputs->time*0.2f; + + presetOutputs->wavearray[x][0]=(r*cos(theta)*(this->correction ? this->aspect : 1.0)+presetOutputs->wave_x); + presetOutputs->wavearray[x][1]=(r*sin(theta)+presetOutputs->wave_y); + + } + + } + + break; + + case 1://circularly moving waveform + + presetOutputs->wave_rot = 0; + presetOutputs->wave_scale = this->vh/(float)this->vw; + + + presetOutputs->wave_y=-1*(presetOutputs->wave_y-1.0); + + + presetOutputs->wave_samples = 512-32; + for ( x=0;x<(512-32);x++) + { + + theta=beatDetect->pcm->pcmdataL[x+32]*0.06*presetOutputs->fWaveScale * 1.57 + presetInputs->time*2.3; + r=(0.53 + 0.43*beatDetect->pcm->pcmdataR[x]*0.12*presetOutputs->fWaveScale+ presetOutputs->wave_mystery)*.5; + + presetOutputs->wavearray[x][0]=(r*cos(theta)*(this->correction ? this->aspect : 1.0)+presetOutputs->wave_x); + presetOutputs->wavearray[x][1]=(r*sin(theta)+presetOutputs->wave_y); + + } + + + + break; + + case 2://EXPERIMENTAL + + + presetOutputs->wave_y=-1*(presetOutputs->wave_y-1.0); + presetOutputs->wave_rot = 0; + presetOutputs->wave_scale =1.0; + presetOutputs->wave_samples = 512-32; + + + for (x=0; x<512-32; x++) + { + presetOutputs->wavearray[x][0]=(beatDetect->pcm->pcmdataR[x]*presetOutputs->fWaveScale*0.5*(this->correction ? this->aspect : 1.0) + presetOutputs->wave_x); + + presetOutputs->wavearray[x][1]=(beatDetect->pcm->pcmdataL[x+32]*presetOutputs->fWaveScale*0.5 + presetOutputs->wave_y); + + } + + + break; + + case 3://EXPERIMENTAL + + + presetOutputs->wave_y=-1*(presetOutputs->wave_y-1.0); + + presetOutputs->wave_rot = 0; + presetOutputs->wave_scale =1.0; + + + presetOutputs->wave_samples = 512-32; + + for (x=0; x<512-32; x++) + { + presetOutputs->wavearray[x][0]=(beatDetect->pcm->pcmdataR[x] * presetOutputs->fWaveScale*0.5 + presetOutputs->wave_x); + presetOutputs->wavearray[x][1]=( (beatDetect->pcm->pcmdataL[x+32]*presetOutputs->fWaveScale*0.5 + presetOutputs->wave_y)); + + } + + + break; + + case 4://single x-axis derivative waveform + { + + presetOutputs->wave_rot =-presetOutputs->wave_mystery*90; + presetOutputs->wave_scale=1.0; + + presetOutputs->wave_y=-1*(presetOutputs->wave_y-1.0); + + + float w1 = 0.45f + 0.5f*(presetOutputs->wave_mystery*0.5f + 0.5f); + float w2 = 1.0f - w1; + float xx[512], yy[512]; + presetOutputs->wave_samples = 512-32; + + for (int i=0; i<512-32; i++) + { + xx[i] = -1.0f + 2.0f*(i/(512.0-32.0)) + presetOutputs->wave_x; + yy[i] =0.4* beatDetect->pcm->pcmdataL[i]*0.47f*presetOutputs->fWaveScale + presetOutputs->wave_y; + xx[i] += 0.4*beatDetect->pcm->pcmdataR[i]*0.44f*presetOutputs->fWaveScale; + + if (i>1) + { + xx[i] = xx[i]*w2 + w1*(xx[i-1]*2.0f - xx[i-2]); + yy[i] = yy[i]*w2 + w1*(yy[i-1]*2.0f - yy[i-2]); + } + presetOutputs->wavearray[i][0]=xx[i]; + presetOutputs->wavearray[i][1]=yy[i]; + } } + break; + + case 5://EXPERIMENTAL + + presetOutputs->wave_rot = 0; + presetOutputs->wave_scale =1.0; + + presetOutputs->wave_y=-1*(presetOutputs->wave_y-1.0); + + cos_rot = cosf(presetInputs->time*0.3f); + sin_rot = sinf(presetInputs->time*0.3f); + presetOutputs->wave_samples = 512-32; + + for (x=0; x<512-32; x++) + { + float x0 = (beatDetect->pcm->pcmdataR[x]*beatDetect->pcm->pcmdataL[x+32] + beatDetect->pcm->pcmdataL[x+32]*beatDetect->pcm->pcmdataR[x]); + float y0 = (beatDetect->pcm->pcmdataR[x]*beatDetect->pcm->pcmdataR[x] - beatDetect->pcm->pcmdataL[x+32]*beatDetect->pcm->pcmdataL[x+32]); + presetOutputs->wavearray[x][0]=((x0*cos_rot - y0*sin_rot)*presetOutputs->fWaveScale*0.5*(this->correction ? this->aspect : 1.0) + presetOutputs->wave_x); + presetOutputs->wavearray[x][1]=( (x0*sin_rot + y0*cos_rot)*presetOutputs->fWaveScale*0.5 + presetOutputs->wave_y); + + } + + + + break; + + case 6://single waveform + + + + wave_x_temp=-2*0.4142*(fabs(fabs(presetOutputs->wave_mystery)-.5)-.5); + + presetOutputs->wave_rot = -presetOutputs->wave_mystery*90; + presetOutputs->wave_scale =1.0+wave_x_temp; + wave_x_temp=-1*(presetOutputs->wave_x-1.0); + presetOutputs->wave_samples = isSmoothing ? 512-32 : beatDetect->pcm->numsamples; + + for ( x=0;x< presetOutputs->wave_samples;x++) + { + + presetOutputs->wavearray[x][0]=x/(float) presetOutputs->wave_samples; + presetOutputs->wavearray[x][1]=beatDetect->pcm->pcmdataR[x]*.04*presetOutputs->fWaveScale+wave_x_temp; + + } + // printf("%f %f\n",renderTarget->texsize*wave_y_temp,wave_y_temp); + + break; + + case 7://dual waveforms + + + wave_x_temp=-2*0.4142*(fabs(fabs(presetOutputs->wave_mystery)-.5)-.5); + + presetOutputs->wave_rot = -presetOutputs->wave_mystery*90; + presetOutputs->wave_scale =1.0+wave_x_temp; + + + presetOutputs->wave_samples = isSmoothing ? 512-32 : beatDetect->pcm->numsamples; + presetOutputs->two_waves = true; + + double y_adj = presetOutputs->wave_y*presetOutputs->wave_y*.5; + + wave_y_temp=-1*(presetOutputs->wave_x-1); + + for ( x=0;x< presetOutputs->wave_samples ;x++) + { + presetOutputs->wavearray[x][0]=x/((float) presetOutputs->wave_samples); + presetOutputs->wavearray[x][1]= beatDetect->pcm->pcmdataL[x]*.04*presetOutputs->fWaveScale+(wave_y_temp+y_adj); + + } + + for ( x=0;x< presetOutputs->wave_samples;x++) + { + + presetOutputs->wavearray2[x][0]=x/((float) presetOutputs->wave_samples); + presetOutputs->wavearray2[x][1]=beatDetect->pcm->pcmdataR[x]*.04*presetOutputs->fWaveScale+(wave_y_temp-y_adj); + + } + + break; + + + } + + +} + +void Renderer::draw_waveform(PresetOutputs * presetOutputs) +{ + + CSectionLock lock(&_renderer_lock); + glMatrixMode( GL_MODELVIEW ); + glPushMatrix(); + glLoadIdentity(); + + modulate_opacity_by_volume(presetOutputs); + maximize_colors(presetOutputs); + +#ifndef USE_GLES1 + if(presetOutputs->bWaveDots==1) glEnable(GL_LINE_STIPPLE); +#endif + + //Thick wave drawing + if (presetOutputs->bWaveThick==1) glLineWidth( (this->renderTarget->texsize < 512 ) ? 2 : 2*this->renderTarget->texsize/512); + else glLineWidth( (this->renderTarget->texsize < 512 ) ? 1 : this->renderTarget->texsize/512); + + //Additive wave drawing (vice overwrite) + if (presetOutputs->bAdditiveWaves==0) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + else glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + glTranslatef(.5, .5, 0); + glRotatef(presetOutputs->wave_rot, 0, 0, 1); + glScalef(presetOutputs->wave_scale, 1.0, 1.0); + glTranslatef(-.5, -.5, 0); + + + glEnableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glVertexPointer(2,GL_FLOAT,0,presetOutputs->wavearray); + + if (presetOutputs->draw_wave_as_loop) + glDrawArrays(GL_LINE_LOOP,0,presetOutputs->wave_samples); + else + glDrawArrays(GL_LINE_STRIP,0,presetOutputs->wave_samples); + + + if (presetOutputs->two_waves) + { + glVertexPointer(2,GL_FLOAT,0,presetOutputs->wavearray2); + if (presetOutputs->draw_wave_as_loop) + glDrawArrays(GL_LINE_LOOP,0,presetOutputs->wave_samples); + else + glDrawArrays(GL_LINE_STRIP,0,presetOutputs->wave_samples); + } + + +#ifndef USE_GLES1 + if(presetOutputs->bWaveDots==1) glDisable(GL_LINE_STIPPLE); +#endif + + glPopMatrix(); +} + +void Renderer::maximize_colors(PresetOutputs *presetOutputs) +{ + + float wave_r_switch=0, wave_g_switch=0, wave_b_switch=0; + CSectionLock lock(&_renderer_lock); + //wave color brightening + // + //forces max color value to 1.0 and scales + // the rest accordingly + if(presetOutputs->nWaveMode==2 || presetOutputs->nWaveMode==5) + { + switch(this->renderTarget->texsize) + { + case 256: presetOutputs->wave_o *= 0.07f; break; + case 512: presetOutputs->wave_o *= 0.09f; break; + case 1024: presetOutputs->wave_o *= 0.11f; break; + case 2048: presetOutputs->wave_o *= 0.13f; break; + } + } + + else if(presetOutputs->nWaveMode==3) + { + switch(this->renderTarget->texsize) + { + case 256: presetOutputs->wave_o *= 0.075f; break; + case 512: presetOutputs->wave_o *= 0.15f; break; + case 1024: presetOutputs->wave_o *= 0.22f; break; + case 2048: presetOutputs->wave_o *= 0.33f; break; + } + presetOutputs->wave_o*=1.3f; + presetOutputs->wave_o*=powf(beatDetect->treb , 2.0f); + } + + if (presetOutputs->bMaximizeWaveColor==1) + { + if(presetOutputs->wave_r>=presetOutputs->wave_g && presetOutputs->wave_r>=presetOutputs->wave_b) //red brightest + { + wave_b_switch=presetOutputs->wave_b*(1/presetOutputs->wave_r); + wave_g_switch=presetOutputs->wave_g*(1/presetOutputs->wave_r); + wave_r_switch=1.0; + } + else if (presetOutputs->wave_b>=presetOutputs->wave_g && presetOutputs->wave_b>=presetOutputs->wave_r) //blue brightest + { + wave_r_switch=presetOutputs->wave_r*(1/presetOutputs->wave_b); + wave_g_switch=presetOutputs->wave_g*(1/presetOutputs->wave_b); + wave_b_switch=1.0; + + } + + else if (presetOutputs->wave_g>=presetOutputs->wave_b && presetOutputs->wave_g>=presetOutputs->wave_r) //green brightest + { + wave_b_switch=presetOutputs->wave_b*(1/presetOutputs->wave_g); + wave_r_switch=presetOutputs->wave_r*(1/presetOutputs->wave_g); + wave_g_switch=1.0; + } + + + glColor4f(wave_r_switch, wave_g_switch, wave_b_switch, presetOutputs->wave_o); + } + else + { + glColor4f(presetOutputs->wave_r, presetOutputs->wave_g, presetOutputs->wave_b, presetOutputs->wave_o); + } + +} + +void Renderer::darken_center() +{ + + CSectionLock lock(&_renderer_lock); + float unit=0.05f; + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + float colors[6][4] = {{0, 0, 0, 3.0f/32.0f}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}}; + + float points[6][2] = {{ 0.5, 0.5}, + { 0.45, 0.5}, + { 0.5, 0.45}, + { 0.55, 0.5}, + { 0.5, 0.55}, + { 0.45, 0.5}}; + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + + glVertexPointer(2,GL_FLOAT,0,points); + glColorPointer(4,GL_FLOAT,0,colors); + + glDrawArrays(GL_TRIANGLE_FAN,0,6); + +} + + +void Renderer::modulate_opacity_by_volume(PresetOutputs *presetOutputs) +{ + + //modulate volume by opacity + // + //set an upper and lower bound and linearly + //calculate the opacity from 0=lower to 1=upper + //based on current volume + + CSectionLock lock(&_renderer_lock); + + if (presetOutputs->bModWaveAlphaByVolume==1) + {if (beatDetect->vol<=presetOutputs->fModWaveAlphaStart) presetOutputs->wave_o=0.0; + else if (beatDetect->vol>=presetOutputs->fModWaveAlphaEnd) presetOutputs->wave_o=presetOutputs->fWaveAlpha; + else presetOutputs->wave_o=presetOutputs->fWaveAlpha*((beatDetect->vol-presetOutputs->fModWaveAlphaStart)/(presetOutputs->fModWaveAlphaEnd-presetOutputs->fModWaveAlphaStart));} + else presetOutputs->wave_o=presetOutputs->fWaveAlpha; +} + +void Renderer::draw_motion_vectors(PresetOutputs *presetOutputs) +{ + CSectionLock lock(&_renderer_lock); + + glEnableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + float offsetx=presetOutputs->mv_dx, intervalx=1.0/(float)presetOutputs->mv_x; + float offsety=presetOutputs->mv_dy, intervaly=1.0/(float)presetOutputs->mv_y; + + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glPointSize(presetOutputs->mv_l); + glColor4f(presetOutputs->mv_r, presetOutputs->mv_g, presetOutputs->mv_b, presetOutputs->mv_a); + + int numx = static_cast(presetOutputs->mv_x); + int numy = static_cast(presetOutputs->mv_y); + + if (numx + numy < 600) + { + int size = numx * numy; + +#ifdef _WIN32PC + // guessed value. solved in current projectM svn + char buf[1024]; + sprintf(buf, "%s: size = %d\n", __FUNCTION__,size); + OutputDebugString( buf ); + float points[1024][2]; +#else + float points[size][2]; +#endif + + + + for (int x=0;xinitRenderToTexture(); +} + +void Renderer::draw_borders(PresetOutputs *presetOutputs) +{ + CSectionLock lock(&_renderer_lock); + glEnableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + //Draw Borders + float of=presetOutputs->ob_size*.5; + float iff=presetOutputs->ib_size*.5; + float texof=1.0-of; + + //no additive drawing for borders + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glColor4f(presetOutputs->ob_r, presetOutputs->ob_g, presetOutputs->ob_b, presetOutputs->ob_a); + + + + float pointsA[4][2] = {{0,0},{0,1},{of,0},{of,1}}; + glVertexPointer(2,GL_FLOAT,0,pointsA); + glDrawArrays(GL_TRIANGLE_STRIP,0,4); + + float pointsB[4][2] = {{of,0},{of,of},{texof,0},{texof,of}}; + glVertexPointer(2,GL_FLOAT,0,pointsB); + glDrawArrays(GL_TRIANGLE_STRIP,0,4); + + float pointsC[4][2] = {{texof,0},{texof,1},{1,0},{1,1}}; + glVertexPointer(2,GL_FLOAT,0,pointsC); + glDrawArrays(GL_TRIANGLE_STRIP,0,4); + + float pointsD[4][2] = {{of,1},{of,texof},{texof,1},{texof,texof}}; + glVertexPointer(2,GL_FLOAT,0,pointsD); + glDrawArrays(GL_TRIANGLE_STRIP,0,4); + + glColor4f(presetOutputs->ib_r, presetOutputs->ib_g, presetOutputs->ib_b, presetOutputs->ib_a); + + glRectd(of, of, of+iff, texof); + glRectd(of+iff, of, texof-iff, of+iff); + glRectd(texof-iff, of, texof, texof); + glRectd(of+iff, texof, texof-iff, texof-iff); + + float pointsE[4][2] = {{of,of},{of,texof},{of+iff,of},{of+iff,texof}}; + glVertexPointer(2,GL_FLOAT,0,pointsE); + glDrawArrays(GL_TRIANGLE_STRIP,0,4); + + float pointsF[4][2] = {{of+iff,of},{of+iff,of+iff},{texof-iff,of},{texof-iff,of+iff}}; + glVertexPointer(2,GL_FLOAT,0,pointsF); + glDrawArrays(GL_TRIANGLE_STRIP,0,4); + + float pointsG[4][2] = {{texof-iff,of},{texof-iff,texof},{texof,of},{texof,texof}}; + glVertexPointer(2,GL_FLOAT,0,pointsG); + glDrawArrays(GL_TRIANGLE_STRIP,0,4); + + float pointsH[4][2] = {{of+iff,texof},{of+iff,texof-iff},{texof-iff,texof},{texof-iff,texof-iff}}; + glVertexPointer(2,GL_FLOAT,0,pointsH); + glDrawArrays(GL_TRIANGLE_STRIP,0,4); + + + +} + + + +void Renderer::draw_title_to_texture() +{ + CSectionLock lock(&_renderer_lock); +#ifdef USE_FTGL + if (this->drawtitle>100) + { + draw_title_to_screen(true); + this->drawtitle=0; + } +#endif /** USE_FTGL */ +} + +/* +void setUpLighting() +{ + CSectionLock lock(&_renderer_lock); + // Set up lighting. + float light1_ambient[4] = { 1.0, 1.0, 1.0, 1.0 }; + float light1_diffuse[4] = { 1.0, 0.9, 0.9, 1.0 }; + float light1_specular[4] = { 1.0, 0.7, 0.7, 1.0 }; + float light1_position[4] = { -1.0, 1.0, 1.0, 0.0 }; + glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse); + glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular); + glLightfv(GL_LIGHT1, GL_POSITION, light1_position); + //glEnable(GL_LIGHT1); + + float light2_ambient[4] = { 0.2, 0.2, 0.2, 1.0 }; + float light2_diffuse[4] = { 0.9, 0.9, 0.9, 1.0 }; + float light2_specular[4] = { 0.7, 0.7, 0.7, 1.0 }; + float light2_position[4] = { 0.0, -1.0, 1.0, 0.0 }; + glLightfv(GL_LIGHT2, GL_AMBIENT, light2_ambient); + glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse); + glLightfv(GL_LIGHT2, GL_SPECULAR, light2_specular); + glLightfv(GL_LIGHT2, GL_POSITION, light2_position); + glEnable(GL_LIGHT2); + + float front_emission[4] = { 0.3, 0.2, 0.1, 0.0 }; + float front_ambient[4] = { 0.2, 0.2, 0.2, 0.0 }; + float front_diffuse[4] = { 0.95, 0.95, 0.8, 0.0 }; + float front_specular[4] = { 0.6, 0.6, 0.6, 0.0 }; + glMaterialfv(GL_FRONT, GL_EMISSION, front_emission); + glMaterialfv(GL_FRONT, GL_AMBIENT, front_ambient); + glMaterialfv(GL_FRONT, GL_DIFFUSE, front_diffuse); + glMaterialfv(GL_FRONT, GL_SPECULAR, front_specular); + glMaterialf(GL_FRONT, GL_SHININESS, 16.0); + glColor4fv(front_diffuse); + + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); + glColorMaterial(GL_FRONT, GL_DIFFUSE); + glEnable(GL_COLOR_MATERIAL); + + glEnable(GL_LIGHTING); +} +*/ + +float title_y; + +void Renderer::draw_title_to_screen(bool flip) +{ + CSectionLock lock(&_renderer_lock); + +#ifdef USE_FTGL + if(this->drawtitle>0) + { + + //setUpLighting(); + + //glEnable(GL_POLYGON_SMOOTH); + //glEnable( GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + glClear(GL_DEPTH_BUFFER_BIT); + + int draw; + if (drawtitle>=80) draw = 80; + else draw = drawtitle; + + float easein = ((80-draw)*.0125); + float easein2 = easein * easein; + + if(drawtitle==1) + { + title_y = (float)rand()/RAND_MAX; + title_y *= 2; + title_y -= 1; + title_y *= .6; + } + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + //glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE); + glColor4f(1.0, 1.0, 1.0, 1.0); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + + glFrustum(-1, 1, -1 * (float)vh/(float)vw, 1 *(float)vh/(float)vw, 1, 1000); + if (flip) glScalef(1, -1, 1); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glTranslatef(-850, title_y * 850 *vh/vw , easein2*900-900); + + glRotatef(easein2*360, 1, 0, 0); + + poly_font->Render(this->title.c_str() ); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + this->drawtitle++; + + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + + glDisable( GL_CULL_FACE); + glDisable( GL_DEPTH_TEST); + + glDisable(GL_COLOR_MATERIAL); + + glDisable(GL_LIGHTING); + glDisable(GL_POLYGON_SMOOTH); + } +#endif /** USE_FTGL */ +} + + + +void Renderer::draw_title() +{ +#ifdef USE_FTGL + CSectionLock lock(&_renderer_lock); + //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + + glColor4f(1.0, 1.0, 1.0, 1.0); + // glPushMatrix(); + // glTranslatef(this->vw*.001,this->vh*.03, -1); + // glScalef(this->vw*.015,this->vh*.025,0); + + glRasterPos2f(0.01, 0.05); + title_font->FaceSize( (unsigned)(20*(this->vh/512.0))); + + + title_font->Render(this->title.c_str() ); + // glPopMatrix(); + //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + +#endif /** USE_FTGL */ +} + +void Renderer::draw_preset() +{ +#ifdef USE_FTGL + CSectionLock lock(&_renderer_lock); + //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + + glColor4f(1.0, 1.0, 1.0, 1.0); + // glPushMatrix(); + //glTranslatef(this->vw*.001,this->vh*-.01, -1); + //glScalef(this->vw*.003,this->vh*.004,0); + + + glRasterPos2f(0.01, 0.01); + + title_font->FaceSize((unsigned)(12*(this->vh/512.0))); + if(this->noSwitch) title_font->Render("[LOCKED] " ); + title_font->FaceSize((unsigned)(20*(this->vh/512.0))); + + title_font->Render(this->presetName().c_str() ); + + + + //glPopMatrix(); + // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); +#endif /** USE_FTGL */ +} + +void Renderer::draw_help( ) +{ + +#ifdef USE_FTGL + CSectionLock lock(&_renderer_lock); +//glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + + glColor4f(1.0, 1.0, 1.0, 1.0); + glPushMatrix(); + glTranslatef(0, 1, 0); + //glScalef(this->vw*.02,this->vh*.02 ,0); + + + title_font->FaceSize((unsigned)( 18*(this->vh/512.0))); + + glRasterPos2f(0.01, -0.05); + title_font->Render("Help"); + + glRasterPos2f(0.01, -0.09); + title_font->Render("----------------------------"); + + glRasterPos2f(0.01, -0.13); + title_font->Render("F1: This help menu"); + + glRasterPos2f(0.01, -0.17); + title_font->Render("F2: Show song title"); + + glRasterPos2f(0.01, -0.21); + title_font->Render("F3: Show preset name"); + + glRasterPos2f(0.01, -0.25); + title_font->Render("F4: Show Rendering Settings"); + + glRasterPos2f(0.01, -0.29); + title_font->Render("F5: Show FPS"); + + glRasterPos2f(0.01, -0.35); + title_font->Render("F: Fullscreen"); + + glRasterPos2f(0.01, -0.39); + title_font->Render("L: Lock/Unlock Preset"); + + glRasterPos2f(0.01, -0.43); + title_font->Render("M: Show Menu"); + + glRasterPos2f(0.01, -0.49); + title_font->Render("R: Random preset"); + glRasterPos2f(0.01, -0.53); + title_font->Render("N: Next preset"); + + glRasterPos2f(0.01, -0.57); + title_font->Render("P: Previous preset"); + + glPopMatrix(); + // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + +#endif /** USE_FTGL */ +} + +void Renderer::draw_stats(PresetInputs *presetInputs) +{ + +#ifdef USE_FTGL + CSectionLock lock(&_renderer_lock); + char buffer[128]; + float offset= (this->showfps%2 ? -0.05 : 0.0); + // glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + + glColor4f(1.0, 1.0, 1.0, 1.0); + glPushMatrix(); + glTranslatef(0.01, 1, 0); + glRasterPos2f(0, -.05+offset); + other_font->Render(this->correction ? " aspect: corrected" : " aspect: stretched"); + sprintf( buffer, " (%f)", this->aspect); + other_font->Render(buffer); + + + + glRasterPos2f(0, -.09+offset); + other_font->FaceSize((unsigned)(18*(this->vh/512.0))); + + sprintf( buffer, " texsize: %d", this->renderTarget->texsize); + other_font->Render(buffer); + + glRasterPos2f(0, -.13+offset); + sprintf( buffer, "viewport: %d x %d", this->vw, this->vh); + + other_font->Render(buffer); + glRasterPos2f(0, -.17+offset); + other_font->Render((this->renderTarget->useFBO ? " FBO: on" : " FBO: off")); + + glRasterPos2f(0, -.21+offset); + sprintf( buffer, " mesh: %d x %d", presetInputs->gx, presetInputs->gy); + other_font->Render(buffer); + + glRasterPos2f(0, -.25+offset); + sprintf( buffer, "textures: %.1fkB", textureManager->getTextureMemorySize() /1000.0f); + other_font->Render(buffer); + + glPopMatrix(); + // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + + +#endif /** USE_FTGL */ +} +void Renderer::draw_fps( float realfps ) +{ +#ifdef USE_FTGL + CSectionLock lock(&_renderer_lock); + char bufferfps[20]; + sprintf( bufferfps, "%.1f fps", realfps); + // glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + + glColor4f(1.0, 1.0, 1.0, 1.0); + glPushMatrix(); + glTranslatef(0.01, 1, 0); + glRasterPos2f(0, -0.05); + title_font->FaceSize((unsigned)(20*(this->vh/512.0))); + title_font->Render(bufferfps); + + glPopMatrix(); + // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + +#endif /** USE_FTGL */ +} + + +//Actually draws the texture to the screen +// +//The Video Echo effect is also applied here +void Renderer::render_texture_to_screen(PresetOutputs *presetOutputs) +{ + + CSectionLock lock(&_renderer_lock); + int flipx=1, flipy=1; + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + //Overwrite anything on the screen + glBlendFunc(GL_ONE, GL_ZERO); + glColor4f(1.0, 1.0, 1.0, 1.0f); + + glEnable(GL_TEXTURE_2D); + + + + float tex[4][2] = {{0, 1}, + {0, 0}, + {1, 0}, + {1, 1}}; + + float points[4][2] = {{-0.5, -0.5}, + {-0.5, 0.5}, + { 0.5, 0.5}, + { 0.5, -0.5}}; + + glEnableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + glVertexPointer(2,GL_FLOAT,0,points); + glTexCoordPointer(2,GL_FLOAT,0,tex); + + glDrawArrays(GL_TRIANGLE_FAN,0,4); + + //Noe Blend the Video Echo + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glMatrixMode(GL_TEXTURE); + + //draw video echo + glColor4f(1.0, 1.0, 1.0, presetOutputs->fVideoEchoAlpha); + glTranslatef(.5, .5, 0); + glScalef(1.0/presetOutputs->fVideoEchoZoom, 1.0/presetOutputs->fVideoEchoZoom, 1); + glTranslatef(-.5, -.5, 0); + + switch (((int)presetOutputs->nVideoEchoOrientation)) + { + case 0: flipx=1;flipy=1;break; + case 1: flipx=-1;flipy=1;break; + case 2: flipx=1;flipy=-1;break; + case 3: flipx=-1;flipy=-1;break; + default: flipx=1;flipy=1; break; + } + + float pointsFlip[4][2] = {{(float)-0.5*flipx, (float)-0.5*flipy}, + {(float)-0.5*flipx, (float)0.5*flipy}, + { (float)0.5*flipx, (float)0.5*flipy}, + { (float)0.5*flipx, (float)-0.5*flipy}}; + + glVertexPointer(2,GL_FLOAT,0,pointsFlip); + glDrawArrays(GL_TRIANGLE_FAN,0,4); + + glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + + if (presetOutputs->bBrighten==1) + { + glColor4f(1.0, 1.0, 1.0, 1.0); + glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); + glDrawArrays(GL_TRIANGLE_FAN,0,4); + glBlendFunc(GL_ZERO, GL_DST_COLOR); + glDrawArrays(GL_TRIANGLE_FAN,0,4); + glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); + glDrawArrays(GL_TRIANGLE_FAN,0,4); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + } + + if (presetOutputs->bDarken==1) + { + glColor4f(1.0, 1.0, 1.0, 1.0); + glBlendFunc(GL_ZERO, GL_DST_COLOR); + glDrawArrays(GL_TRIANGLE_FAN,0,4); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + + if (presetOutputs->bSolarize) + { + glColor4f(1.0, 1.0, 1.0, 1.0); + glBlendFunc(GL_ZERO, GL_ONE_MINUS_DST_COLOR); + glDrawArrays(GL_TRIANGLE_FAN,0,4); + glBlendFunc(GL_DST_COLOR, GL_ONE); + glDrawArrays(GL_TRIANGLE_FAN,0,4); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + if (presetOutputs->bInvert) + { + glColor4f(1.0, 1.0, 1.0, 1.0); + glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); + glDrawArrays(GL_TRIANGLE_FAN,0,4); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + +} + +void Renderer::render_texture_to_studio(PresetOutputs *presetOutputs, PresetInputs *presetInputs) +{ + /* + CSectionLock lock(&_renderer_lock); + int x, y; + int flipx=1, flipy=1; + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glColor4f(0.0, 0.0, 0.0, 0.04); + + + glBegin(GL_QUADS); + glVertex4d(-0.5, -0.5, -1, 1); + glVertex4d(-0.5, 0.5, -1, 1); + glVertex4d(0.5, 0.5, -1, 1); + glVertex4d(0.5, -0.5, -1, 1); + glEnd(); + + + glColor4f(0.0, 0.0, 0.0, 1.0); + + glBegin(GL_QUADS); + glVertex4d(-0.5, 0, -1, 1); + glVertex4d(-0.5, 0.5, -1, 1); + glVertex4d(0.5, 0.5, -1, 1); + glVertex4d(0.5, 0, -1, 1); + glEnd(); + + glBegin(GL_QUADS); + glVertex4d(0, -0.5, -1, 1); + glVertex4d(0, 0.5, -1, 1); + glVertex4d(0.5, 0.5, -1, 1); + glVertex4d(0.5, -0.5, -1, 1); + glEnd(); + + glPushMatrix(); + glTranslatef(.25, .25, 0); + glScalef(.5, .5, 1); + + glEnable(GL_TEXTURE_2D); + + glBlendFunc(GL_ONE, GL_ZERO); + glColor4f(1.0, 1.0, 1.0, 1.0); + //Draw giant rectangle and texture it with our texture! + glBegin(GL_QUADS); + glTexCoord4d(0, 1, 0, 1); glVertex4d(-0.5, -0.5, -1, 1); + glTexCoord4d(0, 0, 0, 1); glVertex4d(-0.5, 0.5, -1, 1); + glTexCoord4d(1, 0, 0, 1); glVertex4d(0.5, 0.5, -1, 1); + glTexCoord4d(1, 1, 0, 1); glVertex4d(0.5, -0.5, -1, 1); + glEnd(); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + + glMatrixMode(GL_TEXTURE); + + //draw video echo + glColor4f(1.0, 1.0, 1.0, presetOutputs->fVideoEchoAlpha); + glTranslatef(.5, .5, 0); + glScalef(1/presetOutputs->fVideoEchoZoom, 1/presetOutputs->fVideoEchoZoom, 1); + glTranslatef(-.5, -.5, 0); + + switch (((int)presetOutputs->nVideoEchoOrientation)) + { + case 0: flipx=1;flipy=1;break; + case 1: flipx=-1;flipy=1;break; + case 2: flipx=1;flipy=-1;break; + case 3: flipx=-1;flipy=-1;break; + default: flipx=1;flipy=1; break; + } + glBegin(GL_QUADS); + glTexCoord4d(0, 1, 0, 1); glVertex4f(-0.5*flipx, -0.5*flipy, -1, 1); + glTexCoord4d(0, 0, 0, 1); glVertex4f(-0.5*flipx, 0.5*flipy, -1, 1); + glTexCoord4d(1, 0, 0, 1); glVertex4f(0.5*flipx, 0.5*flipy, -1, 1); + glTexCoord4d(1, 1, 0, 1); glVertex4f(0.5*flipx, -0.5*flipy, -1, 1); + glEnd(); + + + glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + + + if (presetOutputs->bInvert) + { + glColor4f(1.0, 1.0, 1.0, 1.0); + glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); + glBegin(GL_QUADS); + glVertex4f(-0.5*flipx, -0.5*flipy, -1, 1); + glVertex4f(-0.5*flipx, 0.5*flipy, -1, 1); + glVertex4f(0.5*flipx, 0.5*flipy, -1, 1); + glVertex4f(0.5*flipx, -0.5*flipy, -1, 1); + glEnd(); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + // glTranslated(.5,.5,0); + // glScaled(1/fVideoEchoZoom,1/fVideoEchoZoom,1); + // glTranslated(-.5,-.5,0); + //glTranslatef(0,.5*vh,0); + + + //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + + glDisable(GL_TEXTURE_2D); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glPushMatrix(); + glTranslatef(.25, -.25, 0); + glScalef(.5, .5, 1); + glColor4f(1.0, 1.0, 1.0, 1.0); + + for (x=0;xgx;x++) + { + glBegin(GL_LINE_STRIP); + for(y=0;ygy;y++) + { + glVertex4f((presetOutputs->x_mesh[x][y]-.5), (presetOutputs->y_mesh[x][y]-.5), -1, 1); + //glVertex4f((origx[x+1][y]-.5) * vw, (origy[x+1][y]-.5) *vh ,-1,1); + } + glEnd(); + } + + for (y=0;ygy;y++) + { + glBegin(GL_LINE_STRIP); + for(x=0;xgx;x++) + { + glVertex4f((presetOutputs->x_mesh[x][y]-.5), (presetOutputs->y_mesh[x][y]-.5), -1, 1); + //glVertex4f((origx[x+1][y]-.5) * vw, (origy[x+1][y]-.5) *vh ,-1,1); + } + glEnd(); + } + + glEnable( GL_TEXTURE_2D ); + + + // glTranslated(-.5,-.5,0); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + // Waveform display -- bottom-left + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(-.5, 0, 0); + + glTranslatef(0, -0.10, 0); + glBegin(GL_LINE_STRIP); + glColor4f(0, 1.0, 1.0, 1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->treb_att*-7, -1); + glColor4f(1.0, 1.0, 1.0, 1.0); + glVertex3f((((this->totalframes%256)/551.0)), 0 , -1); + glColor4f(.5, 1.0, 1.0, 1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->treb*7, -1); + glEnd(); + + glTranslatef(0, -0.13, 0); + glBegin(GL_LINE_STRIP); + glColor4f(0, 1.0, 0.0, 1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->mid_att*-7, -1); + glColor4f(1.0, 1.0, 1.0, 1.0); + glVertex3f((((this->totalframes%256)/551.0)), 0 , -1); + glColor4f(.5, 1.0, 0.0, 0.5); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->mid*7, -1); + glEnd(); + + + glTranslatef(0, -0.13, 0); + glBegin(GL_LINE_STRIP); + glColor4f(1.0, 0.0, 0.0, 1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->bass_att*-7, -1); + glColor4f(1.0, 1.0, 1.0, 1.0); + glVertex3f((((this->totalframes%256)/551.0)), 0 , -1); + glColor4f(.7, 0.2, 0.2, 1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->bass*7, -1); + glEnd(); + + glTranslatef(0, -0.13, 0); + glBegin(GL_LINES); + + glColor4f(1.0, 1.0, 1.0, 1.0); + glVertex3f((((this->totalframes%256)/551.0)), 0 , -1); + glColor4f(1.0, 0.6, 1.0, 1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->vol*7, -1); + glEnd(); + + glPopMatrix(); + + glDisable(GL_TEXTURE_2D); + */ +} + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Renderer.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Renderer.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/Renderer.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/Renderer.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,138 @@ +#ifndef Renderer_HPP +#define Renderer_HPP + +#include "FBO.hpp" +#include "PresetFrameIO.hpp" +#include "BeatDetect.hpp" +#include +#include + +#ifdef USE_GLES1 +#include +#else +#ifdef __APPLE__ +#include +#include +#else +#include +#include +#endif +#endif + +#ifdef USE_FTGL +#ifdef WIN32 +#include +#include +#include +#else +#include +#include +#include +#endif +#endif /** USE_FTGL */ + +class BeatDetect; +class TextureManager; + +class Renderer +{ + +public: + + bool showfps; + bool showtitle; + bool showpreset; + bool showhelp; + bool showstats; + + bool studio; + bool correction; + + bool noSwitch; + + int totalframes; + float realfps; + std::string title; + int drawtitle; + int texsize; + + Renderer( int width, int height, int gx, int gy, int texsize, BeatDetect *beatDetect, std::string presetURL, std::string title_fontURL, std::string menu_fontURL, int xpos, int ypos, bool usefbo ); + ~Renderer(); + void RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInputs); + void ResetTextures(); + void reset(int w, int h); + GLuint initRenderToTexture(); + void PerPixelMath(PresetOutputs *presetOutputs, PresetInputs *presetInputs); + void WaveformMath(PresetOutputs *presetOutputs, PresetInputs *presetInputs, bool isSmoothing); + + void setPresetName(const std::string& theValue) + { + m_presetName = theValue; + } + + std::string presetName() const + { + return m_presetName; + } + + +private: + + RenderTarget *renderTarget; + BeatDetect *beatDetect; + TextureManager *textureManager; + + //per pixel equation variables + float **gridx; //grid containing interpolated mesh + float **gridy; + float **origx2; //original mesh + float **origy2; + int gx; + int gy; + + std::string m_presetName; + + int vx; + int vy; + int vw; + int vh; + bool useFBO; + float aspect; + + pthread_mutex_t _renderer_lock; + +#ifdef USE_FTGL + FTGLPixmapFont *title_font; + FTGLPixmapFont *other_font; + FTGLExtrdFont *poly_font; +#endif /** USE_FTGL */ + + std::string title_fontURL; + std::string menu_fontURL; + std::string presetURL; + + void draw_waveform(PresetOutputs * presetOutputs); + void Interpolation(PresetOutputs *presetOutputs, PresetInputs *presetInputs); + + void rescale_per_pixel_matrices(); + void maximize_colors(PresetOutputs *presetOutputs); + void render_texture_to_screen(PresetOutputs *presetOutputs); + void render_texture_to_studio(PresetOutputs *presetOutputs, PresetInputs *presetInputs); + void draw_fps( float realfps ); + void draw_stats(PresetInputs *presetInputs); + void draw_help( ); + void draw_preset(); + void draw_title(); + void draw_title_to_screen(bool flip); + void maximize_colors(); + void draw_title_to_texture(); + void draw_motion_vectors(PresetOutputs *presetOutputs); + void draw_borders(PresetOutputs *presetOutputs); + void draw_shapes(PresetOutputs *presetOutputs); + void draw_custom_waves(PresetOutputs *presetOutputs); + + void modulate_opacity_by_volume(PresetOutputs *presetOutputs) ; + void darken_center(); +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/resource.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/resource.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/resource.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/resource.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by libprojectM.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/sdltoprojectM.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/sdltoprojectM.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/sdltoprojectM.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/sdltoprojectM.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,165 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: sdltoprojectM.hpp,v 1.1 2004/10/08 00:35:28 cvs Exp $ + * + * Translates SDL -> projectM variables + * + * $Log: sdltoprojectM.hpp,v $ + * Revision 1.1 2004/10/08 00:35:28 cvs + * Moved and imported + * + * Revision 1.1.1.1 2004/10/04 12:56:00 cvs + * Imported + * + */ + +#ifndef _SDLTOPROJECTM_H +#define _SDLTOPROJECTM_H + +#include "event.h" + + //#include "projectM/projectM.hpp" +#ifdef WIN32 +#include +#else +#include +#endif + +inline projectMEvent sdl2pmEvent( SDL_Event event ) { \ + + switch ( event.type ) { \ + case SDL_VIDEORESIZE: + return PROJECTM_VIDEORESIZE; \ + case SDL_KEYUP: \ + return PROJECTM_KEYUP; \ + case SDL_KEYDOWN: \ + return PROJECTM_KEYDOWN; \ + default: + return PROJECTM_KEYUP; \ + } \ + } \ + +inline projectMKeycode sdl2pmKeycode( SDLKey keysym ) { \ + switch ( keysym ) { \ + case SDLK_F1: \ + return PROJECTM_K_F1; \ + case SDLK_F2: \ + return PROJECTM_K_F2; \ + case SDLK_F3: \ + return PROJECTM_K_F3; \ + case SDLK_F4: \ + return PROJECTM_K_F4; \ + case SDLK_F5: \ + return PROJECTM_K_F5; \ + case SDLK_F6: \ + return PROJECTM_K_F6; \ + case SDLK_F7: \ + return PROJECTM_K_F7; \ + case SDLK_F8: \ + return PROJECTM_K_F8; \ + case SDLK_F9: \ + return PROJECTM_K_F9; \ + case SDLK_F10: \ + return PROJECTM_K_F10; \ + case SDLK_F11: \ + return PROJECTM_K_F11; \ + case SDLK_F12: \ + return PROJECTM_K_F12; \ + case SDLK_ESCAPE: \ + return PROJECTM_K_ESCAPE; + case SDLK_a: + return PROJECTM_K_a; + case SDLK_b: + return PROJECTM_K_b; + case SDLK_c: + return PROJECTM_K_c; + case SDLK_d: + return PROJECTM_K_d; + case SDLK_e: + return PROJECTM_K_e; + case SDLK_f: + return PROJECTM_K_f; + case SDLK_g: + return PROJECTM_K_g; + case SDLK_h: + return PROJECTM_K_h; + case SDLK_i: + return PROJECTM_K_i; + case SDLK_j: + return PROJECTM_K_j; + case SDLK_k: + return PROJECTM_K_k; + case SDLK_l: + return PROJECTM_K_l; + case SDLK_m: + return PROJECTM_K_m; + case SDLK_n: + return PROJECTM_K_n; + case SDLK_o: + return PROJECTM_K_o; + case SDLK_p: + return PROJECTM_K_p; + case SDLK_q: + return PROJECTM_K_q; + case SDLK_r: + return PROJECTM_K_r; + case SDLK_s: + return PROJECTM_K_s; + case SDLK_t: + return PROJECTM_K_t; + case SDLK_u: + return PROJECTM_K_u; + case SDLK_v: + return PROJECTM_K_v; + case SDLK_w: + return PROJECTM_K_w; + case SDLK_x: + return PROJECTM_K_x; + case SDLK_y: + return PROJECTM_K_y; + case SDLK_z: + return PROJECTM_K_z; + case SDLK_UP: + return PROJECTM_K_UP; + case SDLK_RETURN: + return PROJECTM_K_RETURN; + case SDLK_RIGHT: + return PROJECTM_K_RIGHT; + case SDLK_LEFT: + return PROJECTM_K_LEFT; + case SDLK_DOWN: + return PROJECTM_K_DOWN; + case SDLK_PAGEUP: + return PROJECTM_K_PAGEUP; + case SDLK_PAGEDOWN: + return PROJECTM_K_PAGEDOWN; + + default: \ + return PROJECTM_K_NONE; \ + } \ + } \ + +inline projectMModifier sdl2pmModifier( SDLMod mod ) { \ + return PROJECTM_KMOD_LSHIFT; \ + } \ + +#endif /** _SDLTOPROJECTM_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/SectionLock.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/SectionLock.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/SectionLock.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/SectionLock.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,27 @@ + +#ifndef SECTION_LOCK_H__ +#define SECTION_LOCK_H__ + +#include +#include + +class CSectionLock +{ + pthread_mutex_t* m_lock; + public: + CSectionLock(pthread_mutex_t* lock) : m_lock(lock) + { +#ifdef _USE_THREADS + assert(lock); + pthread_mutex_lock(&m_lock); +#endif + } + ~CSectionLock() + { +#ifdef _USE_THREADS + pthread_mutex_unlock(&m_lock); +#endif + } +}; + +#endif // SECTION_LOCK_H__ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/SOIL.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/SOIL.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/SOIL.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/SOIL.c 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,1818 @@ +/* + Jonathan Dummer + 2007-07-26-10.36 + + Simple OpenGL Image Library + + Public Domain + using Sean Barret's stb_image as a base + + Thanks to: + * Sean Barret - for the awesome stb_image + * Dan Venkitachalam - for finding some non-compliant DDS files, and patching some explicit casts + * everybody at gamedev.net +*/ + +#ifdef WIN32 + #define WIN32_LEAN_AND_MEAN + #include + #include + #include +#elif defined(__APPLE__) || defined(__APPLE_CC__) + /* I can't test this Apple stuff! */ + #include + #include + #define APIENTRY + +#else + #include + #include +#endif + +#include "SOIL.h" +#include "stb_image_aug.h" +#include "image_helper.h" +#include "image_DXT.h" + +#include +#include + +#define SOIL_CHECK_FOR_GL_ERRORS 0 + +/* error reporting */ +char *result_string_pointer = "SOIL initialized"; + +/* for loading cube maps */ +enum{ + SOIL_CUBEMAP_UNKNOWN = -1, + SOIL_CUBEMAP_NONE = 0, + SOIL_CUBEMAP_PRESENT = 1 +}; +static int has_cubemap_capability = SOIL_CUBEMAP_UNKNOWN; +int query_cubemap_capability( void ); +#define SOIL_TEXTURE_WRAP_R 0x8072 +#define SOIL_CLAMP_TO_EDGE 0x812F +#define SOIL_NORMAL_MAP 0x8511 +#define SOIL_REFLECTION_MAP 0x8512 +#define SOIL_TEXTURE_CUBE_MAP 0x8513 +#define SOIL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define SOIL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define SOIL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define SOIL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +/* for using DXT compression */ +enum{ + SOIL_DXT_UNKNOWN = -1, + SOIL_DXT_NONE = 0, + SOIL_DXT_COMPRESS = 1, + SOIL_DXT_DIRECT_UPLOAD = 2 +}; +static int has_DXT_capability = SOIL_DXT_UNKNOWN; +int query_DXT_capability( void ); +#define SOIL_RGB_S3TC_DXT1 0x83F0 +#define SOIL_RGBA_S3TC_DXT1 0x83F1 +#define SOIL_RGBA_S3TC_DXT3 0x83F2 +#define SOIL_RGBA_S3TC_DXT5 0x83F3 +typedef void (APIENTRY * P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); +P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC soilGlCompressedTexImage2D = NULL; +unsigned int SOIL_direct_load_DDS( + const char *filename, + unsigned int reuse_texture_ID, + int flags, + int loading_as_cubemap ); +unsigned int SOIL_direct_load_DDS_from_memory( + const unsigned char *const buffer, + int buffer_length, + unsigned int reuse_texture_ID, + int flags, + int loading_as_cubemap ); +/* other functions */ +unsigned int + SOIL_internal_create_OGL_texture + ( + const unsigned char *const data, + int width, int height, int channels, + unsigned int reuse_texture_ID, + unsigned int flags, + unsigned int opengl_texture_type, + unsigned int opengl_texture_target, + unsigned int texture_check_size_enum + ); + +/* and the code magic begins here [8^) */ +unsigned int + SOIL_load_OGL_texture + ( + const char *filename, + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ) +{ + /* variables */ + unsigned char* img; + int width, height, channels; + unsigned int tex_id; + /* does the user want direct uploading of the image as a DDS file? */ + if( flags & SOIL_FLAG_DDS_LOAD_DIRECT ) + { + /* 1st try direct loading of the image as a DDS file + note: direct uploading will only load what is in the + DDS file, no MIPmaps will be generated, the image will + not be flipped, etc. */ + tex_id = SOIL_direct_load_DDS( filename, reuse_texture_ID, flags, 0 ); + if( tex_id ) + { + /* hey, it worked!! */ + return tex_id; + } + } + /* try to load the image */ + img = SOIL_load_image( filename, &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* OK, make it a texture! */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + reuse_texture_ID, flags, + GL_TEXTURE_2D, GL_TEXTURE_2D, + GL_MAX_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + /* and return the handle, such as it is */ + return tex_id; +} + +unsigned int + SOIL_load_OGL_texture_from_memory + ( + const unsigned char *const buffer, + int buffer_length, + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ) +{ + /* variables */ + unsigned char* img; + int width, height, channels; + unsigned int tex_id; + /* does the user want direct uploading of the image as a DDS file? */ + if( flags & SOIL_FLAG_DDS_LOAD_DIRECT ) + { + /* 1st try direct loading of the image as a DDS file + note: direct uploading will only load what is in the + DDS file, no MIPmaps will be generated, the image will + not be flipped, etc. */ + tex_id = SOIL_direct_load_DDS_from_memory( + buffer, buffer_length, + reuse_texture_ID, flags, 0 ); + if( tex_id ) + { + /* hey, it worked!! */ + return tex_id; + } + } + /* try to load the image */ + img = SOIL_load_image_from_memory( + buffer, buffer_length, + &width, &height, &channels, + force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* OK, make it a texture! */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + reuse_texture_ID, flags, + GL_TEXTURE_2D, GL_TEXTURE_2D, + GL_MAX_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + /* and return the handle, such as it is */ + return tex_id; +} + +unsigned int + SOIL_load_OGL_cubemap + ( + const char *x_pos_file, + const char *x_neg_file, + const char *y_pos_file, + const char *y_neg_file, + const char *z_pos_file, + const char *z_neg_file, + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ) +{ + /* variables */ + unsigned char* img; + int width, height, channels; + unsigned int tex_id; + /* error checking */ + if( (x_pos_file == NULL) || + (x_neg_file == NULL) || + (y_pos_file == NULL) || + (y_neg_file == NULL) || + (z_pos_file == NULL) || + (z_neg_file == NULL) ) + { + result_string_pointer = "Invalid cube map files list"; + return 0; + } + /* capability checking */ + if( query_cubemap_capability() != SOIL_CUBEMAP_PRESENT ) + { + result_string_pointer = "No cube map capability present"; + return 0; + } + /* 1st face: try to load the image */ + img = SOIL_load_image( x_pos_file, &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, and create a texture ID if necessary */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + reuse_texture_ID, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_X, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + /* continue? */ + if( tex_id != 0 ) + { + /* 1st face: try to load the image */ + img = SOIL_load_image( x_neg_file, &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, but reuse the assigned texture ID */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + } + /* continue? */ + if( tex_id != 0 ) + { + /* 1st face: try to load the image */ + img = SOIL_load_image( y_pos_file, &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, but reuse the assigned texture ID */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + } + /* continue? */ + if( tex_id != 0 ) + { + /* 1st face: try to load the image */ + img = SOIL_load_image( y_neg_file, &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, but reuse the assigned texture ID */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + } + /* continue? */ + if( tex_id != 0 ) + { + /* 1st face: try to load the image */ + img = SOIL_load_image( z_pos_file, &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, but reuse the assigned texture ID */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + } + /* continue? */ + if( tex_id != 0 ) + { + /* 1st face: try to load the image */ + img = SOIL_load_image( z_neg_file, &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, but reuse the assigned texture ID */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + } + /* and return the handle, such as it is */ + return tex_id; +} + +unsigned int + SOIL_load_OGL_cubemap_from_memory + ( + const unsigned char *const x_pos_buffer, + int x_pos_buffer_length, + const unsigned char *const x_neg_buffer, + int x_neg_buffer_length, + const unsigned char *const y_pos_buffer, + int y_pos_buffer_length, + const unsigned char *const y_neg_buffer, + int y_neg_buffer_length, + const unsigned char *const z_pos_buffer, + int z_pos_buffer_length, + const unsigned char *const z_neg_buffer, + int z_neg_buffer_length, + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ) +{ + /* variables */ + unsigned char* img; + int width, height, channels; + unsigned int tex_id; + /* error checking */ + if( (x_pos_buffer == NULL) || + (x_neg_buffer == NULL) || + (y_pos_buffer == NULL) || + (y_neg_buffer == NULL) || + (z_pos_buffer == NULL) || + (z_neg_buffer == NULL) ) + { + result_string_pointer = "Invalid cube map buffers list"; + return 0; + } + /* capability checking */ + if( query_cubemap_capability() != SOIL_CUBEMAP_PRESENT ) + { + result_string_pointer = "No cube map capability present"; + return 0; + } + /* 1st face: try to load the image */ + img = SOIL_load_image_from_memory( + x_pos_buffer, x_pos_buffer_length, + &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, and create a texture ID if necessary */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + reuse_texture_ID, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_X, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + /* continue? */ + if( tex_id != 0 ) + { + /* 1st face: try to load the image */ + img = SOIL_load_image_from_memory( + x_neg_buffer, x_neg_buffer_length, + &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, but reuse the assigned texture ID */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + } + /* continue? */ + if( tex_id != 0 ) + { + /* 1st face: try to load the image */ + img = SOIL_load_image_from_memory( + y_pos_buffer, y_pos_buffer_length, + &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, but reuse the assigned texture ID */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + } + /* continue? */ + if( tex_id != 0 ) + { + /* 1st face: try to load the image */ + img = SOIL_load_image_from_memory( + y_neg_buffer, y_neg_buffer_length, + &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, but reuse the assigned texture ID */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + } + /* continue? */ + if( tex_id != 0 ) + { + /* 1st face: try to load the image */ + img = SOIL_load_image_from_memory( + z_pos_buffer, z_pos_buffer_length, + &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, but reuse the assigned texture ID */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + } + /* continue? */ + if( tex_id != 0 ) + { + /* 1st face: try to load the image */ + img = SOIL_load_image_from_memory( + z_neg_buffer, z_neg_buffer_length, + &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* upload the texture, but reuse the assigned texture ID */ + tex_id = SOIL_internal_create_OGL_texture( + img, width, height, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + /* and nuke the image data */ + SOIL_free_image_data( img ); + } + /* and return the handle, such as it is */ + return tex_id; +} + +unsigned int + SOIL_load_OGL_single_cubemap + ( + const char *filename, + const char face_order[6], + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ) +{ + /* variables */ + unsigned char* img; + int width, height, channels, i; + unsigned int tex_id = 0; + /* error checking */ + if( filename == NULL ) + { + result_string_pointer = "Invalid single cube map file name"; + return 0; + } + /* does the user want direct uploading of the image as a DDS file? */ + if( flags & SOIL_FLAG_DDS_LOAD_DIRECT ) + { + /* 1st try direct loading of the image as a DDS file + note: direct uploading will only load what is in the + DDS file, no MIPmaps will be generated, the image will + not be flipped, etc. */ + tex_id = SOIL_direct_load_DDS( filename, reuse_texture_ID, flags, 1 ); + if( tex_id ) + { + /* hey, it worked!! */ + return tex_id; + } + } + /* face order checking */ + for( i = 0; i < 6; ++i ) + { + if( (face_order[i] != 'N') && + (face_order[i] != 'S') && + (face_order[i] != 'W') && + (face_order[i] != 'E') && + (face_order[i] != 'U') && + (face_order[i] != 'D') ) + { + result_string_pointer = "Invalid single cube map face order"; + return 0; + }; + } + /* capability checking */ + if( query_cubemap_capability() != SOIL_CUBEMAP_PRESENT ) + { + result_string_pointer = "No cube map capability present"; + return 0; + } + /* 1st off, try to load the full image */ + img = SOIL_load_image( filename, &width, &height, &channels, force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* now, does this image have the right dimensions? */ + if( (width != 6*height) && + (6*width != height) ) + { + SOIL_free_image_data( img ); + result_string_pointer = "Single cubemap image must have a 6:1 ratio"; + return 0; + } + /* try the image split and create */ + tex_id = SOIL_create_OGL_single_cubemap( + img, width, height, channels, + face_order, reuse_texture_ID, flags + ); + /* nuke the temporary image data and return the texture handle */ + SOIL_free_image_data( img ); + return tex_id; +} + +unsigned int + SOIL_load_OGL_single_cubemap_from_memory + ( + const unsigned char *const buffer, + int buffer_length, + const char face_order[6], + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ) +{ + /* variables */ + unsigned char* img; + int width, height, channels, i; + unsigned int tex_id = 0; + /* error checking */ + if( buffer == NULL ) + { + result_string_pointer = "Invalid single cube map buffer"; + return 0; + } + /* does the user want direct uploading of the image as a DDS file? */ + if( flags & SOIL_FLAG_DDS_LOAD_DIRECT ) + { + /* 1st try direct loading of the image as a DDS file + note: direct uploading will only load what is in the + DDS file, no MIPmaps will be generated, the image will + not be flipped, etc. */ + tex_id = SOIL_direct_load_DDS_from_memory( + buffer, buffer_length, + reuse_texture_ID, flags, 1 ); + if( tex_id ) + { + /* hey, it worked!! */ + return tex_id; + } + } + /* face order checking */ + for( i = 0; i < 6; ++i ) + { + if( (face_order[i] != 'N') && + (face_order[i] != 'S') && + (face_order[i] != 'W') && + (face_order[i] != 'E') && + (face_order[i] != 'U') && + (face_order[i] != 'D') ) + { + result_string_pointer = "Invalid single cube map face order"; + return 0; + }; + } + /* capability checking */ + if( query_cubemap_capability() != SOIL_CUBEMAP_PRESENT ) + { + result_string_pointer = "No cube map capability present"; + return 0; + } + /* 1st off, try to load the full image */ + img = SOIL_load_image_from_memory( + buffer, buffer_length, + &width, &height, &channels, + force_channels ); + if( NULL == img ) + { + /* image loading failed */ + result_string_pointer = stbi_failure_reason(); + return 0; + } + /* now, does this image have the right dimensions? */ + if( (width != 6*height) && + (6*width != height) ) + { + SOIL_free_image_data( img ); + result_string_pointer = "Single cubemap image must have a 6:1 ratio"; + return 0; + } + /* try the image split and create */ + tex_id = SOIL_create_OGL_single_cubemap( + img, width, height, channels, + face_order, reuse_texture_ID, flags + ); + /* nuke the temporary image data and return the texture handle */ + SOIL_free_image_data( img ); + return tex_id; +} + +unsigned int + SOIL_create_OGL_single_cubemap + ( + const unsigned char *const data, + int width, int height, int channels, + const char face_order[6], + unsigned int reuse_texture_ID, + unsigned int flags + ) +{ + /* variables */ + unsigned char* sub_img; + int dw, dh, sz, i; + unsigned int tex_id; + /* error checking */ + if( data == NULL ) + { + result_string_pointer = "Invalid single cube map image data"; + return 0; + } + /* face order checking */ + for( i = 0; i < 6; ++i ) + { + if( (face_order[i] != 'N') && + (face_order[i] != 'S') && + (face_order[i] != 'W') && + (face_order[i] != 'E') && + (face_order[i] != 'U') && + (face_order[i] != 'D') ) + { + result_string_pointer = "Invalid single cube map face order"; + return 0; + }; + } + /* capability checking */ + if( query_cubemap_capability() != SOIL_CUBEMAP_PRESENT ) + { + result_string_pointer = "No cube map capability present"; + return 0; + } + /* now, does this image have the right dimensions? */ + if( (width != 6*height) && + (6*width != height) ) + { + result_string_pointer = "Single cubemap image must have a 6:1 ratio"; + return 0; + } + /* which way am I stepping? */ + if( width > height ) + { + dw = height; + dh = 0; + } else + { + dw = 0; + dh = width; + } + sz = dw+dh; + sub_img = (unsigned char *)malloc( sz*sz*channels ); + /* do the splitting and uploading */ + tex_id = reuse_texture_ID; + for( i = 0; i < 6; ++i ) + { + int x, y, idx = 0; + unsigned int cubemap_target = 0; + /* copy in the sub-image */ + for( y = i*dh; y < i*dh+sz; ++y ) + { + for( x = i*dw*channels; x < (i*dw+sz)*channels; ++x ) + { + sub_img[idx++] = data[y*width*channels+x]; + } + } + /* what is my texture target? + remember, this coordinate system is + LHS if viewed from inside the cube! */ + switch( face_order[i] ) + { + case 'N': + cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_Z; + break; + case 'S': + cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z; + break; + case 'W': + cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_X; + break; + case 'E': + cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_X; + break; + case 'U': + cubemap_target = SOIL_TEXTURE_CUBE_MAP_POSITIVE_Y; + break; + case 'D': + cubemap_target = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Y; + break; + } + /* upload it as a texture */ + tex_id = SOIL_internal_create_OGL_texture( + sub_img, sz, sz, channels, + tex_id, flags, + SOIL_TEXTURE_CUBE_MAP, + cubemap_target, + SOIL_MAX_CUBE_MAP_TEXTURE_SIZE ); + } + /* and nuke the image and sub-image data */ + SOIL_free_image_data( sub_img ); + /* and return the handle, such as it is */ + return tex_id; +} + +unsigned int + SOIL_create_OGL_texture + ( + const unsigned char *const data, + int width, int height, int channels, + unsigned int reuse_texture_ID, + unsigned int flags + ) +{ + /* wrapper function for 2D textures */ + return SOIL_internal_create_OGL_texture( + data, width, height, channels, + reuse_texture_ID, flags, + GL_TEXTURE_2D, GL_TEXTURE_2D, + GL_MAX_TEXTURE_SIZE ); +} + +#if SOIL_CHECK_FOR_GL_ERRORS +void check_for_GL_errors( const char *calling_location ) +{ + /* check for errors */ + GLenum err_code = glGetError(); + while( GL_NO_ERROR != err_code ) + { + printf( "OpenGL Error @ %s: %i", calling_location, err_code ); + err_code = glGetError(); + } +} +#endif + +unsigned int + SOIL_internal_create_OGL_texture + ( + const unsigned char *const data, + int width, int height, int channels, + unsigned int reuse_texture_ID, + unsigned int flags, + unsigned int opengl_texture_type, + unsigned int opengl_texture_target, + unsigned int texture_check_size_enum + ) +{ + /* variables */ + unsigned char* img; + unsigned int tex_id; + unsigned int internal_texture_format = 0, original_texture_format = 0; + int DXT_mode = SOIL_DXT_NONE; + int max_supported_size; + /* create a copy the image data */ + img = (unsigned char*)malloc( width*height*channels ); + memcpy( img, data, width*height*channels ); + /* does the user want me to invert the image? */ + if( flags & SOIL_FLAG_INVERT_Y ) + { + int i, j; + for( j = 0; j*2 < height; ++j ) + { + int index1 = j * width * channels; + int index2 = (height - 1 - j) * width * channels; + for( i = width * channels; i > 0; --i ) + { + unsigned char temp = img[index1]; + img[index1] = img[index2]; + img[index2] = temp; + ++index1; + ++index2; + } + } + } + /* does the user want me to scale the colors into the NTSC safe RGB range? */ + if( flags & SOIL_FLAG_NTSC_SAFE_RGB ) + { + scale_image_RGB_to_NTSC_safe( img, width, height, channels ); + } + /* does the user want me to convert from straight to pre-multiplied alpha? + (and do we even _have_ alpha?) */ + if( flags & SOIL_FLAG_MULTIPLY_ALPHA ) + { + int i; + switch( channels ) + { + case 2: + for( i = 0; i < 2*width*height; i += 2 ) + { + img[i] = (img[i] * img[i+1] + 128) >> 8; + } + break; + case 4: + for( i = 0; i < 4*width*height; i += 4 ) + { + img[i+0] = (img[i+0] * img[i+3] + 128) >> 8; + img[i+1] = (img[i+1] * img[i+3] + 128) >> 8; + img[i+2] = (img[i+2] * img[i+3] + 128) >> 8; + } + break; + default: + /* no other number of channels contains alpha data */ + break; + } + } + /* how large of a texture can this OpenGL implementation handle? */ + /* texture_check_size_enum will be GL_MAX_TEXTURE_SIZE or SOIL_MAX_CUBE_MAP_TEXTURE_SIZE */ + glGetIntegerv( texture_check_size_enum, &max_supported_size ); + /* do I need to make it a power of 2? */ + if( + (flags & SOIL_FLAG_POWER_OF_TWO) || /* user asked for it */ + (flags & SOIL_FLAG_MIPMAPS) || /* need it for the MIP-maps */ + (width > max_supported_size) || /* it's too big, (make sure it's */ + (height > max_supported_size) ) /* 2^n for later down-sampling) */ + { + int new_width = 1; + int new_height = 1; + while( new_width < width ) + { + new_width *= 2; + } + while( new_height < height ) + { + new_height *= 2; + } + /* still? */ + if( (new_width != width) || (new_height != height) ) + { + /* yep, resize */ + unsigned char *resampled = (unsigned char*)malloc( channels*new_width*new_height ); + up_scale_image( + img, width, height, channels, + resampled, new_width, new_height ); + /* OJO this is for debug only! */ + /* + SOIL_save_image( "\\showme.bmp", SOIL_SAVE_TYPE_BMP, + new_width, new_height, channels, + resampled ); + */ + /* nuke the old guy, then point it at the new guy */ + SOIL_free_image_data( img ); + img = resampled; + width = new_width; + height = new_height; + } + } + /* now, if it is too large... */ + if( (width > max_supported_size) || (height > max_supported_size) ) + { + /* I've already made it a power of two, so simply use the MIPmapping + code to reduce its size to the allowable maximum. */ + unsigned char *resampled; + int reduce_block_x = 1, reduce_block_y = 1; + int new_width, new_height; + if( width > max_supported_size ) + { + reduce_block_x = width / max_supported_size; + } + if( height > max_supported_size ) + { + reduce_block_y = height / max_supported_size; + } + new_width = width / reduce_block_x; + new_height = height / reduce_block_y; + resampled = (unsigned char*)malloc( channels*new_width*new_height ); + /* perform the actual reduction */ + mipmap_image( img, width, height, channels, + resampled, reduce_block_x, reduce_block_y ); + /* nuke the old guy, then point it at the new guy */ + SOIL_free_image_data( img ); + img = resampled; + width = new_width; + height = new_height; + } + /* does the user want us to use YCoCg color space? */ + if( flags & SOIL_FLAG_CoCg_Y ) + { + /* this will only work with RGB and RGBA images */ + convert_RGB_to_YCoCg( img, width, height, channels ); + /* + save_image_as_DDS( "CoCg_Y.dds", width, height, channels, img ); + //*/ + } + /* create the OpenGL texture ID handle + (note: allowing a forced texture ID lets me reload a texture) */ + tex_id = reuse_texture_ID; + if( tex_id == 0 ) + { + glGenTextures( 1, &tex_id ); + } + #if SOIL_CHECK_FOR_GL_ERRORS + check_for_GL_errors( "glGenTextures" ); + #endif + /* Note: sometimes glGenTextures fails (usually no OpenGL context) */ + if( tex_id ) + { + /* and what type am I using as the internal texture format? */ + switch( channels ) + { + case 1: + original_texture_format = GL_LUMINANCE; + break; + case 2: + original_texture_format = GL_LUMINANCE_ALPHA; + break; + case 3: + original_texture_format = GL_RGB; + break; + case 4: + original_texture_format = GL_RGBA; + break; + } + internal_texture_format = original_texture_format; + /* does the user want me to, and can I, save as DXT? */ + if( flags & SOIL_FLAG_COMPRESS_TO_DXT ) + { + DXT_mode = query_DXT_capability(); + if( DXT_mode != SOIL_DXT_NONE ) + { + /* I can use DXT, whether I compress it or OpenGL does */ + if( (channels & 1) == 1 ) + { + /* 1 or 3 channels = DXT1 */ + internal_texture_format = SOIL_RGB_S3TC_DXT1; + } else + { + /* 2 or 4 channels = DXT5 */ + internal_texture_format = SOIL_RGBA_S3TC_DXT5; + } + } + } + /* bind an OpenGL texture ID */ + glBindTexture( opengl_texture_type, tex_id ); + #if SOIL_CHECK_FOR_GL_ERRORS + check_for_GL_errors( "glBindTexture" ); + #endif + /* upload the main image */ + if( DXT_mode == SOIL_DXT_DIRECT_UPLOAD ) + { + /* user wants me to do the DXT conversion! */ + int DDS_size; + unsigned char *DDS_data = NULL; + if( (channels & 1) == 1 ) + { + /* RGB, use DXT1 */ + DDS_data = convert_image_to_DXT1( img, width, height, channels, &DDS_size ); + } else + { + /* RGBA, use DXT5 */ + DDS_data = convert_image_to_DXT5( img, width, height, channels, &DDS_size ); + } + if( DDS_data ) + { + soilGlCompressedTexImage2D( + opengl_texture_target, 0, + internal_texture_format, width, height, 0, + DDS_size, DDS_data ); + #if SOIL_CHECK_FOR_GL_ERRORS + check_for_GL_errors( "glCompressedTexImage2D" ); + #endif + SOIL_free_image_data( DDS_data ); + /* printf( "Internal DXT compressor\n" ); */ + } else + { + /* my compression failed, try the OpenGL driver's version */ + glTexImage2D( + opengl_texture_target, 0, + internal_texture_format, width, height, 0, + original_texture_format, GL_UNSIGNED_BYTE, img ); + #if SOIL_CHECK_FOR_GL_ERRORS + check_for_GL_errors( "glTexImage2D" ); + #endif + /* printf( "OpenGL DXT compressor\n" ); */ + } + } else + { + /* user want OpenGL to do all the work! */ + glTexImage2D( + opengl_texture_target, 0, + internal_texture_format, width, height, 0, + original_texture_format, GL_UNSIGNED_BYTE, img ); + #if SOIL_CHECK_FOR_GL_ERRORS + check_for_GL_errors( "glTexImage2D" ); + #endif + /*printf( "OpenGL DXT compressor\n" ); */ + } + /* are any MIPmaps desired? */ + if( flags & SOIL_FLAG_MIPMAPS ) + { + int MIPlevel = 1; + int MIPwidth = (width+1) / 2; + int MIPheight = (height+1) / 2; + unsigned char *resampled = (unsigned char*)malloc( channels*MIPwidth*MIPheight ); + while( ((1< 0; --i ) + { + unsigned char temp = pixel_data[index1]; + pixel_data[index1] = pixel_data[index2]; + pixel_data[index2] = temp; + ++index1; + ++index2; + } + } + + /* save the image */ + save_result = SOIL_save_image( filename, image_type, width, height, 3, pixel_data); + + /* And free the memory */ + SOIL_free_image_data( pixel_data ); + return save_result; +} + +unsigned char* + SOIL_load_image + ( + const char *filename, + int *width, int *height, int *channels, + int force_channels + ) +{ + unsigned char *result = stbi_load( (char*)filename, + width, height, channels, force_channels ); + if( result == NULL ) + { + result_string_pointer = stbi_failure_reason(); + } else + { + result_string_pointer = "Image loaded"; + } + return result; +} + +unsigned char* + SOIL_load_image_from_memory + ( + const unsigned char *const buffer, + int buffer_length, + int *width, int *height, int *channels, + int force_channels + ) +{ + unsigned char *result = stbi_load_from_memory( + (stbi_uc *)buffer, buffer_length, + width, height, channels, + force_channels ); + if( result == NULL ) + { + result_string_pointer = stbi_failure_reason(); + } else + { + result_string_pointer = "Image loaded from memory"; + } + return result; +} + +int + SOIL_save_image + ( + const char *filename, + int image_type, + int width, int height, int channels, + const unsigned char *const data + ) +{ + int save_result; + + /* error check */ + if( (width < 1) || (height < 1) || + (channels < 1) || (channels > 4) || + (data == NULL) || + (filename == NULL) ) + { + return 0; + } + if( image_type == SOIL_SAVE_TYPE_BMP ) + { + save_result = stbi_write_bmp( (char*)filename, + width, height, channels, (void*)data ); + } else + if( image_type == SOIL_SAVE_TYPE_TGA ) + { + save_result = stbi_write_tga( (char*)filename, + width, height, channels, (void*)data ); + } else + if( image_type == SOIL_SAVE_TYPE_DDS ) + { + save_result = save_image_as_DDS( (const char*)filename, + width, height, channels, (const unsigned char *const)data ); + } else + { + save_result = 0; + } + if( save_result == 0 ) + { + result_string_pointer = "Saving the image failed"; + } else + { + result_string_pointer = "Image saved"; + } + return save_result; +} + +void + SOIL_free_image_data + ( + unsigned char *img_data + ) +{ + free( (void*)img_data ); +} + +const char* + SOIL_last_result + ( + void + ) +{ + return result_string_pointer; +} + +int query_cubemap_capability( void ) +{ + /* check for the capability */ + if( has_cubemap_capability == SOIL_CUBEMAP_UNKNOWN ) + { + /* we haven't yet checked for the capability, do so */ + if( + (NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ), + "GL_ARB_texture_cube_map" ) ) + && + (NULL == strstr( (char const*)glGetString( GL_EXTENSIONS ), + "GL_EXT_texture_cube_map" ) ) + ) + { + /* not there, flag the failure */ + has_cubemap_capability = SOIL_CUBEMAP_NONE; + } else + { + /* it's there! */ + has_cubemap_capability = SOIL_CUBEMAP_PRESENT; + } + } + /* let the user know if we can do cubemaps or not */ + return has_cubemap_capability; +} + +int query_DXT_capability( void ) +{ + /* check for the capability */ + if( has_DXT_capability == SOIL_DXT_UNKNOWN ) + { + /* we haven't yet checked for the capability, do so */ + if( NULL == strstr( + (char const*)glGetString( GL_EXTENSIONS ), + "GL_EXT_texture_compression_s3tc" ) ) + { + /* not there, flag the failure */ + has_DXT_capability = SOIL_DXT_NONE; + } else + { + /* and find the address of the extension function */ + P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC ext_addr = NULL; + #ifdef WIN32 + ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC) + wglGetProcAddress("glCompressedTexImage2DARB"); + + #elif defined(__APPLE__) || defined(__APPLE_CC__) + /* I can't test this Apple stuff! */ + CFBundleRef bundle; + CFURLRef bundleURL = + CFURLCreateWithFileSystemPath( + kCFAllocatorDefault, + CFSTR("/System/Library/Frameworks/OpenGL.framework"), + kCFURLPOSIXPathStyle, + true ); + CFStringRef extensionName = + CFStringCreateWithCString( + kCFAllocatorDefault, + "glCompressedTexImage2DARB", + kCFStringEncodingASCII ); + bundle = CFBundleCreate( kCFAllocatorDefault, bundleURL ); + assert( bundle != NULL ); + ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC) + CFBundleGetFunctionPointerForName( bundle, extensionName ); + + + CFRelease( bundleURL ); + CFRelease( extensionName ); + + // CFRelease( functionName ); + CFRelease( bundle ); + #else + ext_addr = (P_SOIL_GLCOMPRESSEDTEXIMAGE2DPROC) + glXGetProcAddress((const GLubyte *)"glCompressedTexImage2DARB"); + + #endif + /* Flag it so no checks needed later */ + if( NULL == ext_addr ) + { + /* hmm, not good!! This should not happen, but does on my + laptop's VIA chipset. The GL_EXT_texture_compression_s3tc + spec requires that ARB_texture_compression be present too. + this means I can upload and have the OpenGL drive do the + conversion, but I can't use my own routines or load DDS files + from disk and upload them directly [8^( */ + has_DXT_capability = SOIL_DXT_COMPRESS; + } else + { + /* all's well! */ + soilGlCompressedTexImage2D = ext_addr; + has_DXT_capability = SOIL_DXT_DIRECT_UPLOAD; + } + } + } + /* let the user know if we can do DXT or not */ + return has_DXT_capability; +} + +unsigned int SOIL_direct_load_DDS_from_memory( + const unsigned char *const buffer, + int buffer_length, + unsigned int reuse_texture_ID, + int flags, + int loading_as_cubemap ) +{ + /* variables */ + DDS_header header; + unsigned int buffer_index = 0; + unsigned int tex_ID = 0; + /* file reading variables */ + unsigned int S3TC_type = 0; + unsigned char *DDS_data; + unsigned int DDS_main_size; + unsigned int DDS_full_size; + unsigned int width, height; + int mipmaps, cubemap, uncompressed, block_size = 16; + unsigned int flag; + unsigned int cf_target, ogl_target_start, ogl_target_end; + unsigned int opengl_texture_type; + int i; + /* 1st off, does the filename even exist? */ + if( NULL == buffer ) + { + /* we can't do it! */ + result_string_pointer = "NULL buffer"; + return 0; + } + if( buffer_length < sizeof( DDS_header ) ) + { + /* we can't do it! */ + result_string_pointer = "DDS file was too small to contain the DDS header"; + return 0; + } + /* try reading in the header */ + memcpy ( (void*)(&header), (const void *)buffer, sizeof( DDS_header ) ); + buffer_index = sizeof( DDS_header ); + /* guilty until proven innocent */ + result_string_pointer = "Failed to read a known DDS header"; + /* validate the header (warning, "goto"'s ahead, shield your eyes!!) */ + flag = ('D'<<0)|('D'<<8)|('S'<<16)|(' '<<24); + if( header.dwMagic != flag ) {goto quick_exit;} + if( header.dwSize != 124 ) {goto quick_exit;} + /* I need all of these */ + flag = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; + if( (header.dwFlags & flag) != flag ) {goto quick_exit;} + /* According to the MSDN spec, the dwFlags should contain + DDSD_LINEARSIZE if it's compressed, or DDSD_PITCH if + uncompressed. Some DDS writers do not conform to the + spec, so I need to make my reader more tolerant */ + /* I need one of these */ + flag = DDPF_FOURCC | DDPF_RGB; + if( (header.sPixelFormat.dwFlags & flag) == 0 ) {goto quick_exit;} + if( header.sPixelFormat.dwSize != 32 ) {goto quick_exit;} + if( (header.sCaps.dwCaps1 & DDSCAPS_TEXTURE) == 0 ) {goto quick_exit;} + /* make sure it is a type we can upload */ + if( (header.sPixelFormat.dwFlags & DDPF_FOURCC) && + !( + (header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('1'<<24))) || + (header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('3'<<24))) || + (header.sPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('5'<<24))) + ) ) + { + goto quick_exit; + } + /* OK, validated the header, let's load the image data */ + result_string_pointer = "DDS header loaded and validated"; + width = header.dwWidth; + height = header.dwHeight; + uncompressed = 1 - (header.sPixelFormat.dwFlags & DDPF_FOURCC) / DDPF_FOURCC; + cubemap = (header.sCaps.dwCaps2 & DDSCAPS2_CUBEMAP) / DDSCAPS2_CUBEMAP; + if( uncompressed ) + { + S3TC_type = GL_RGB; + block_size = 3; + if( header.sPixelFormat.dwFlags & DDPF_ALPHAPIXELS ) + { + S3TC_type = GL_RGBA; + block_size = 4; + } + DDS_main_size = width * height * block_size; + } else + { + /* can we even handle direct uploading to OpenGL DXT compressed images? */ + if( query_DXT_capability() != SOIL_DXT_DIRECT_UPLOAD ) + { + /* we can't do it! */ + result_string_pointer = "Direct upload of S3TC images not supported by the OpenGL driver"; + return 0; + } + /* well, we know it is DXT1/3/5, because we checked above */ + switch( (header.sPixelFormat.dwFourCC >> 24) - '0' ) + { + case 1: + S3TC_type = SOIL_RGBA_S3TC_DXT1; + block_size = 8; + break; + case 3: + S3TC_type = SOIL_RGBA_S3TC_DXT3; + block_size = 16; + break; + case 5: + S3TC_type = SOIL_RGBA_S3TC_DXT5; + block_size = 16; + break; + } + DDS_main_size = ((width+3)>>2)*((height+3)>>2)*block_size; + } + if( cubemap ) + { + /* does the user want a cubemap? */ + if( !loading_as_cubemap ) + { + /* we can't do it! */ + result_string_pointer = "DDS image was a cubemap"; + return 0; + } + /* can we even handle cubemaps with the OpenGL driver? */ + if( query_cubemap_capability() != SOIL_CUBEMAP_PRESENT ) + { + /* we can't do it! */ + result_string_pointer = "Direct upload of cubemap images not supported by the OpenGL driver"; + return 0; + } + ogl_target_start = SOIL_TEXTURE_CUBE_MAP_POSITIVE_X; + ogl_target_end = SOIL_TEXTURE_CUBE_MAP_NEGATIVE_Z; + opengl_texture_type = SOIL_TEXTURE_CUBE_MAP; + } else + { + /* does the user want a non-cubemap? */ + if( loading_as_cubemap ) + { + /* we can't do it! */ + result_string_pointer = "DDS image was not a cubemap"; + return 0; + } + ogl_target_start = GL_TEXTURE_2D; + ogl_target_end = GL_TEXTURE_2D; + opengl_texture_type = GL_TEXTURE_2D; + } + if( (header.sCaps.dwCaps1 & DDSCAPS_MIPMAP) && (header.dwMipMapCount > 1) ) + { + int shift_offset; + mipmaps = header.dwMipMapCount - 1; + DDS_full_size = DDS_main_size; + if( uncompressed ) + { + /* uncompressed DDS, simple MIPmap size calculation */ + shift_offset = 0; + } else + { + /* compressed DDS, MIPmap size calculation is block based */ + shift_offset = 2; + } + for( i = 1; i <= mipmaps; ++ i ) + { + int w, h; + w = width >> (shift_offset + i); + h = height >> (shift_offset + i); + if( w < 1 ) + { + w = 1; + } + if( h < 1 ) + { + h = 1; + } + DDS_full_size += w*h*block_size; + } + } else + { + mipmaps = 0; + DDS_full_size = DDS_main_size; + } + DDS_data = (unsigned char*)malloc( DDS_full_size ); + /* got the image data RAM, create or use an existing OpenGL texture handle */ + tex_ID = reuse_texture_ID; + if( tex_ID == 0 ) + { + glGenTextures( 1, &tex_ID ); + } + /* bind an OpenGL texture ID */ + glBindTexture( opengl_texture_type, tex_ID ); + /* do this for each face of the cubemap! */ + for( cf_target = ogl_target_start; cf_target <= ogl_target_end; ++cf_target ) + { + if( buffer_index + DDS_full_size <= buffer_length ) + { + unsigned int byte_offset = DDS_main_size; + memcpy( (void*)DDS_data, (const void*)(&buffer[buffer_index]), DDS_full_size ); + buffer_index += DDS_full_size; + /* upload the main chunk */ + if( uncompressed ) + { + /* and remember, DXT uncompressed uses BGR(A), + so swap to RGB(A) for ALL MIPmap levels */ + for( i = 0; i < DDS_full_size; i += block_size ) + { + unsigned char temp = DDS_data[i]; + DDS_data[i] = DDS_data[i+2]; + DDS_data[i+2] = temp; + } + glTexImage2D( + cf_target, 0, + S3TC_type, width, height, 0, + S3TC_type, GL_UNSIGNED_BYTE, DDS_data ); + } else + { + soilGlCompressedTexImage2D( + cf_target, 0, + S3TC_type, width, height, 0, + DDS_main_size, DDS_data ); + } + /* upload the mipmaps, if we have them */ + for( i = 1; i <= mipmaps; ++i ) + { + int w, h, mip_size; + w = width >> i; + h = height >> i; + if( w < 1 ) + { + w = 1; + } + if( h < 1 ) + { + h = 1; + } + /* upload this mipmap */ + if( uncompressed ) + { + mip_size = w*h*block_size; + glTexImage2D( + cf_target, i, + S3TC_type, w, h, 0, + S3TC_type, GL_UNSIGNED_BYTE, &DDS_data[byte_offset] ); + } else + { + mip_size = ((w+3)/4)*((h+3)/4)*block_size; + soilGlCompressedTexImage2D( + cf_target, i, + S3TC_type, w, h, 0, + mip_size, &DDS_data[byte_offset] ); + } + /* and move to the next mipmap */ + byte_offset += mip_size; + } + /* it worked! */ + result_string_pointer = "DDS file loaded"; + } else + { + glDeleteTextures( 1, & tex_ID ); + tex_ID = 0; + cf_target = ogl_target_end + 1; + result_string_pointer = "DDS file was too small for expected image data"; + } + }/* end reading each face */ + SOIL_free_image_data( DDS_data ); + if( tex_ID ) + { + /* did I have MIPmaps? */ + if( mipmaps > 0 ) + { + /* instruct OpenGL to use the MIPmaps */ + glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); + } else + { + /* instruct OpenGL _NOT_ to use the MIPmaps */ + glTexParameteri( opengl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexParameteri( opengl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + } + /* does the user want clamping, or wrapping? */ + if( flags & SOIL_FLAG_TEXTURE_REPEATS ) + { + glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, GL_REPEAT ); + glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, GL_REPEAT ); + glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, GL_REPEAT ); + } else + { + /* unsigned int clamp_mode = SOIL_CLAMP_TO_EDGE; */ + unsigned int clamp_mode = GL_CLAMP; + glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_S, clamp_mode ); + glTexParameteri( opengl_texture_type, GL_TEXTURE_WRAP_T, clamp_mode ); + glTexParameteri( opengl_texture_type, SOIL_TEXTURE_WRAP_R, clamp_mode ); + } + } + +quick_exit: + /* report success or failure */ + return tex_ID; +} + +unsigned int SOIL_direct_load_DDS( + const char *filename, + unsigned int reuse_texture_ID, + int flags, + int loading_as_cubemap ) +{ + FILE *f; + unsigned char *buffer; + size_t buffer_length, bytes_read; + unsigned int tex_ID = 0; + /* error checks */ + if( NULL == filename ) + { + result_string_pointer = "NULL filename"; + return 0; + } + f = fopen( filename, "rb" ); + if( NULL == f ) + { + /* the file doesn't seem to exist (or be open-able) */ + result_string_pointer = "Can not find DDS file"; + return 0; + } + fseek( f, 0, SEEK_END ); + buffer_length = ftell( f ); + fseek( f, 0, SEEK_SET ); + buffer = (unsigned char *) malloc( buffer_length ); + if( NULL == buffer ) + { + result_string_pointer = "malloc failed"; + fclose( f ); + return 0; + } + bytes_read = fread( (void*)buffer, 1, buffer_length, f ); + fclose( f ); + if( bytes_read < buffer_length ) + { + /* huh? */ + buffer_length = bytes_read; + } + /* now try to do the loading */ + tex_ID = SOIL_direct_load_DDS_from_memory( + (const unsigned char *const)buffer, buffer_length, + reuse_texture_ID, flags, loading_as_cubemap ); + SOIL_free_image_data( buffer ); + return tex_ID; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/SOIL.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/SOIL.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/SOIL.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/SOIL.h 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,389 @@ +/** + @mainpage SOIL + + Jonathan Dummer + 2007-07-26-10.36 + + Simple OpenGL Image Library + + A tiny c library for uploading images as + textures into OpenGL. Also saving and + loading of images is supported. + + I'm using Sean's Tool Box image loader as a base: + http://www.nothings.org/ + + I'm upgrading it to load TGA and DDS files, and a direct + path for loading DDS files straight into OpenGL textures, + when applicable. + + Image Formats: + - BMP load & save + - TGA load & save + - DDS load & save + - PNG load + - JPG load + + OpenGL Texture Features: + - resample to power-of-two sizes + - MIPmap generation + - compressed texture S3TC formats (if supported) + - can pre-multiply alpha for you, for better compositing + - can flip image about the y-axis (except pre-compressed DDS files) + + Thanks to: + * Sean Barret - for the awesome stb_image + * Dan Venkitachalam - for finding some non-compliant DDS files, and patching some explicit casts + * everybody at gamedev.net +**/ + +#ifndef HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY +#define HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY + +#ifdef __cplusplus +extern "C" { +#endif + +/** + The format of images that may be loaded (force_channels). + SOIL_LOAD_AUTO leaves the image in whatever format it was found. + SOIL_LOAD_L forces the image to load as Luminous (greyscale) + SOIL_LOAD_LA forces the image to load as Luminous with Alpha + SOIL_LOAD_RGB forces the image to load as Red Green Blue + SOIL_LOAD_RGBA forces the image to load as Red Green Blue Alpha +**/ +enum +{ + SOIL_LOAD_AUTO = 0, + SOIL_LOAD_L = 1, + SOIL_LOAD_LA = 2, + SOIL_LOAD_RGB = 3, + SOIL_LOAD_RGBA = 4 +}; + +/** + Passed in as reuse_texture_ID, will cause SOIL to + register a new texture ID using glGenTextures(). + If the value passed into reuse_texture_ID > 0 then + SOIL will just re-use that texture ID (great for + reloading image assets in-game!) +**/ +enum +{ + SOIL_CREATE_NEW_ID = 0 +}; + +/** + flags you can pass into SOIL_load_OGL_texture() + and SOIL_create_OGL_texture(). + (note that if SOIL_FLAG_DDS_LOAD_DIRECT is used + the rest of the flags with the exception of + SOIL_FLAG_TEXTURE_REPEATS will be ignored while + loading already-compressed DDS files.) + + SOIL_FLAG_POWER_OF_TWO: force the image to be POT + SOIL_FLAG_MIPMAPS: generate mipmaps for the texture + SOIL_FLAG_TEXTURE_REPEATS: otherwise will clamp + SOIL_FLAG_MULTIPLY_ALPHA: for using (GL_ONE,GL_ONE_MINUS_SRC_ALPHA) blending + SOIL_FLAG_INVERT_Y: flip the image vertically + SOIL_FLAG_COMPRESS_TO_DXT: if the card can display them, will convert RGB to DXT1, RGBA to DXT5 + SOIL_FLAG_DDS_LOAD_DIRECT: will load DDS files directly without _ANY_ additional processing + SOIL_FLAG_NTSC_SAFE_RGB: clamps RGB components to the range [16,235] + SOIL_FLAG_CoCg_Y: Google YCoCg; RGB=>CoYCg, RGBA=>CoCgAY +**/ +enum +{ + SOIL_FLAG_POWER_OF_TWO = 1, + SOIL_FLAG_MIPMAPS = 2, + SOIL_FLAG_TEXTURE_REPEATS = 4, + SOIL_FLAG_MULTIPLY_ALPHA = 8, + SOIL_FLAG_INVERT_Y = 16, + SOIL_FLAG_COMPRESS_TO_DXT = 32, + SOIL_FLAG_DDS_LOAD_DIRECT = 64, + SOIL_FLAG_NTSC_SAFE_RGB = 128, + SOIL_FLAG_CoCg_Y = 256 +}; + +/** + The types of images that may be saved. + (TGA supports uncompressed RGB / RGBA) + (BMP supports uncompressed RGB) + (DDS supports DXT1 and DXT5) +**/ +enum +{ + SOIL_SAVE_TYPE_TGA = 0, + SOIL_SAVE_TYPE_BMP = 1, + SOIL_SAVE_TYPE_DDS = 2 +}; + +/** + Defines the order of faces in a DDS cubemap. + I recommend that you use the same order in single + image cubemap files, so they will be interchangeable + with DDS cubemaps when using SOIL. +**/ +#define SOIL_DDS_CUBEMAP_FACE_ORDER "EWUDNS" + +/** + Loads an image from disk into an OpenGL texture. + \param filename the name of the file to upload as a texture + \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA + \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) + \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT + \return 0-failed, otherwise returns the OpenGL texture handle +**/ +unsigned int + SOIL_load_OGL_texture + ( + const char *filename, + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ); + +/** + Loads 6 images from disk into an OpenGL cubemap texture. + \param x_pos_file the name of the file to upload as the +x cube face + \param x_neg_file the name of the file to upload as the -x cube face + \param y_pos_file the name of the file to upload as the +y cube face + \param y_neg_file the name of the file to upload as the -y cube face + \param z_pos_file the name of the file to upload as the +z cube face + \param z_neg_file the name of the file to upload as the -z cube face + \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA + \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) + \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT + \return 0-failed, otherwise returns the OpenGL texture handle +**/ +unsigned int + SOIL_load_OGL_cubemap + ( + const char *x_pos_file, + const char *x_neg_file, + const char *y_pos_file, + const char *y_neg_file, + const char *z_pos_file, + const char *z_neg_file, + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ); + +/** + Loads 1 image from disk and splits it into an OpenGL cubemap texture. + \param filename the name of the file to upload as a texture + \param face_order the order of the faces in the file, any combination of NSWEUD, for North, South, Up, etc. + \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA + \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) + \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT + \return 0-failed, otherwise returns the OpenGL texture handle +**/ +unsigned int + SOIL_load_OGL_single_cubemap + ( + const char *filename, + const char face_order[6], + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ); + +/** + Loads an image from RAM into an OpenGL texture. + \param buffer the image data in RAM just as if it were still in a file + \param buffer_length the size of the buffer in bytes + \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA + \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) + \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT + \return 0-failed, otherwise returns the OpenGL texture handle +**/ +unsigned int + SOIL_load_OGL_texture_from_memory + ( + const unsigned char *const buffer, + int buffer_length, + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ); + +/** + Loads 6 images from memory into an OpenGL cubemap texture. + \param x_pos_buffer the image data in RAM to upload as the +x cube face + \param x_pos_buffer_length the size of the above buffer + \param x_neg_buffer the image data in RAM to upload as the +x cube face + \param x_neg_buffer_length the size of the above buffer + \param y_pos_buffer the image data in RAM to upload as the +x cube face + \param y_pos_buffer_length the size of the above buffer + \param y_neg_buffer the image data in RAM to upload as the +x cube face + \param y_neg_buffer_length the size of the above buffer + \param z_pos_buffer the image data in RAM to upload as the +x cube face + \param z_pos_buffer_length the size of the above buffer + \param z_neg_buffer the image data in RAM to upload as the +x cube face + \param z_neg_buffer_length the size of the above buffer + \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA + \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) + \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT + \return 0-failed, otherwise returns the OpenGL texture handle +**/ +unsigned int + SOIL_load_OGL_cubemap_from_memory + ( + const unsigned char *const x_pos_buffer, + int x_pos_buffer_length, + const unsigned char *const x_neg_buffer, + int x_neg_buffer_length, + const unsigned char *const y_pos_buffer, + int y_pos_buffer_length, + const unsigned char *const y_neg_buffer, + int y_neg_buffer_length, + const unsigned char *const z_pos_buffer, + int z_pos_buffer_length, + const unsigned char *const z_neg_buffer, + int z_neg_buffer_length, + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ); + +/** + Loads 1 image from RAM and splits it into an OpenGL cubemap texture. + \param buffer the image data in RAM just as if it were still in a file + \param buffer_length the size of the buffer in bytes + \param face_order the order of the faces in the file, any combination of NSWEUD, for North, South, Up, etc. + \param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA + \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) + \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT + \return 0-failed, otherwise returns the OpenGL texture handle +**/ +unsigned int + SOIL_load_OGL_single_cubemap_from_memory + ( + const unsigned char *const buffer, + int buffer_length, + const char face_order[6], + int force_channels, + unsigned int reuse_texture_ID, + unsigned int flags + ); + +/** + Creates a 2D OpenGL texture from raw image data. Note that the raw data is + _NOT_ freed after the upload (so the user can load various versions). + \param data the raw data to be uploaded as an OpenGL texture + \param width the width of the image in pixels + \param height the height of the image in pixels + \param channels the number of channels: 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA + \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) + \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT + \return 0-failed, otherwise returns the OpenGL texture handle +**/ +unsigned int + SOIL_create_OGL_texture + ( + const unsigned char *const data, + int width, int height, int channels, + unsigned int reuse_texture_ID, + unsigned int flags + ); + +/** + Creates an OpenGL cubemap texture by splitting up 1 image into 6 parts. + \param data the raw data to be uploaded as an OpenGL texture + \param width the width of the image in pixels + \param height the height of the image in pixels + \param channels the number of channels: 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA + \param face_order the order of the faces in the file, and combination of NSWEUD, for North, South, Up, etc. + \param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture) + \param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT + \return 0-failed, otherwise returns the OpenGL texture handle +**/ +unsigned int + SOIL_create_OGL_single_cubemap + ( + const unsigned char *const data, + int width, int height, int channels, + const char face_order[6], + unsigned int reuse_texture_ID, + unsigned int flags + ); + +/** + Captures the OpenGL window (RGB) and saves it to disk + \return 0 if it failed, otherwise returns 1 +**/ +int + SOIL_save_screenshot + ( + const char *filename, + int image_type, + int x, int y, + int width, int height + ); + +/** + Loads an image from disk into an array of unsigned chars. + \return 0 if failed, otherwise returns 1 +**/ +unsigned char* + SOIL_load_image + ( + const char *filename, + int *width, int *height, int *channels, + int force_channels + ); + +/** + Loads an image from memory into an array of unsigned chars. + \return 0 if failed, otherwise returns 1 +**/ +unsigned char* + SOIL_load_image_from_memory + ( + const unsigned char *const buffer, + int buffer_length, + int *width, int *height, int *channels, + int force_channels + ); + +/** + Saves an image from an array of unsigned chars (RGBA) to disk + \return 0 if failed, otherwise returns 1 +**/ +int + SOIL_save_image + ( + const char *filename, + int image_type, + int width, int height, int channels, + const unsigned char *const data + ); + +/** + Frees the image data (note, this is just C's "free()"...this function is + present mostly so C++ programmers don't forget to use "free()" and call + "delete []" instead [8^) +**/ +void + SOIL_free_image_data + ( + unsigned char *img_data + ); + +/** + This function resturn a pointer to a string describing the last thing + that happened inside SOIL. It can be used to determine why an image + failed to load. +**/ +const char* + SOIL_last_result + ( + void + ); + + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/stbi_DDS_aug_c.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/stbi_DDS_aug_c.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/stbi_DDS_aug_c.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/stbi_DDS_aug_c.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,504 @@ + +/// DDS file support, does decoding, _not_ direct uploading +/// (use SOIL for that ;-) + +/// A bunch of DirectDraw Surface structures and flags +typedef struct { + unsigned int dwMagic; + unsigned int dwSize; + unsigned int dwFlags; + unsigned int dwHeight; + unsigned int dwWidth; + unsigned int dwPitchOrLinearSize; + unsigned int dwDepth; + unsigned int dwMipMapCount; + unsigned int dwReserved1[ 11 ]; + + // DDPIXELFORMAT + struct { + unsigned int dwSize; + unsigned int dwFlags; + unsigned int dwFourCC; + unsigned int dwRGBBitCount; + unsigned int dwRBitMask; + unsigned int dwGBitMask; + unsigned int dwBBitMask; + unsigned int dwAlphaBitMask; + } sPixelFormat; + + // DDCAPS2 + struct { + unsigned int dwCaps1; + unsigned int dwCaps2; + unsigned int dwDDSX; + unsigned int dwReserved; + } sCaps; + unsigned int dwReserved2; +} DDS_header ; + +// the following constants were copied directly off the MSDN website + +// The dwFlags member of the original DDSURFACEDESC2 structure +// can be set to one or more of the following values. +#define DDSD_CAPS 0x00000001 +#define DDSD_HEIGHT 0x00000002 +#define DDSD_WIDTH 0x00000004 +#define DDSD_PITCH 0x00000008 +#define DDSD_PIXELFORMAT 0x00001000 +#define DDSD_MIPMAPCOUNT 0x00020000 +#define DDSD_LINEARSIZE 0x00080000 +#define DDSD_DEPTH 0x00800000 + +// DirectDraw Pixel Format +#define DDPF_ALPHAPIXELS 0x00000001 +#define DDPF_FOURCC 0x00000004 +#define DDPF_RGB 0x00000040 + +// The dwCaps1 member of the DDSCAPS2 structure can be +// set to one or more of the following values. +#define DDSCAPS_COMPLEX 0x00000008 +#define DDSCAPS_TEXTURE 0x00001000 +#define DDSCAPS_MIPMAP 0x00400000 + +// The dwCaps2 member of the DDSCAPS2 structure can be +// set to one or more of the following values. +#define DDSCAPS2_CUBEMAP 0x00000200 +#define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400 +#define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800 +#define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000 +#define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000 +#define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000 +#define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000 +#define DDSCAPS2_VOLUME 0x00200000 + +static int dds_test(void) +{ + // check the magic number + if (get8() != 'D') return 0; + if (get8() != 'D') return 0; + if (get8() != 'S') return 0; + if (get8() != ' ') return 0; + // check header size + if (get32le() != 124) return 0; + return 1; +} +#ifndef STBI_NO_STDIO +int stbi_dds_test_file (FILE *f) +{ + int r,n = ftell(f); + start_file(f); + r = dds_test(); + fseek(f,n,SEEK_SET); + return r; +} +#endif + +int stbi_dds_test_memory (stbi_uc *buffer, int len) +{ + start_mem(buffer, len); + return dds_test(); +} + +// helper functions +int stbi_convert_bit_range( int c, int from_bits, int to_bits ) +{ + int b = (1 << (from_bits - 1)) + c * ((1 << to_bits) - 1); + return (b + (b >> from_bits)) >> from_bits; +} +void stbi_rgb_888_from_565( unsigned int c, int *r, int *g, int *b ) +{ + *r = stbi_convert_bit_range( (c >> 11) & 31, 5, 8 ); + *g = stbi_convert_bit_range( (c >> 05) & 63, 6, 8 ); + *b = stbi_convert_bit_range( (c >> 00) & 31, 5, 8 ); +} +void stbi_decode_DXT1_block( + unsigned char uncompressed[16*4], + unsigned char compressed[8] ) +{ + int next_bit = 4*8; + int i, r, g, b; + int c0, c1; + unsigned char decode_colors[4*4]; + // find the 2 primary colors + c0 = compressed[0] + (compressed[1] << 8); + c1 = compressed[2] + (compressed[3] << 8); + stbi_rgb_888_from_565( c0, &r, &g, &b ); + decode_colors[0] = r; + decode_colors[1] = g; + decode_colors[2] = b; + decode_colors[3] = 255; + stbi_rgb_888_from_565( c1, &r, &g, &b ); + decode_colors[4] = r; + decode_colors[5] = g; + decode_colors[6] = b; + decode_colors[7] = 255; + if( c0 > c1 ) + { + // no alpha, 2 interpolated colors + decode_colors[8] = (2*decode_colors[0] + decode_colors[4]) / 3; + decode_colors[9] = (2*decode_colors[1] + decode_colors[5]) / 3; + decode_colors[10] = (2*decode_colors[2] + decode_colors[6]) / 3; + decode_colors[11] = 255; + decode_colors[12] = (decode_colors[0] + 2*decode_colors[4]) / 3; + decode_colors[13] = (decode_colors[1] + 2*decode_colors[5]) / 3; + decode_colors[14] = (decode_colors[2] + 2*decode_colors[6]) / 3; + decode_colors[15] = 255; + } else + { + // 1 interpolated color, alpha + decode_colors[8] = (decode_colors[0] + decode_colors[4]) / 2; + decode_colors[9] = (decode_colors[1] + decode_colors[5]) / 2; + decode_colors[10] = (decode_colors[2] + decode_colors[6]) / 2; + decode_colors[11] = 255; + decode_colors[12] = 0; + decode_colors[13] = 0; + decode_colors[14] = 0; + decode_colors[15] = 0; + } + // decode the block + for( i = 0; i < 16*4; i += 4 ) + { + int idx = ((compressed[next_bit>>3] >> (next_bit & 7)) & 3) * 4; + next_bit += 2; + uncompressed[i+0] = decode_colors[idx+0]; + uncompressed[i+1] = decode_colors[idx+1]; + uncompressed[i+2] = decode_colors[idx+2]; + uncompressed[i+3] = decode_colors[idx+3]; + } + // done +} +void stbi_decode_DXT23_alpha_block( + unsigned char uncompressed[16*4], + unsigned char compressed[8] ) +{ + int i, next_bit = 0; + // each alpha value gets 4 bits + for( i = 3; i < 16*4; i += 4 ) + { + uncompressed[i] = stbi_convert_bit_range( + (compressed[next_bit>>3] >> (next_bit&7)) & 15, + 4, 8 ); + next_bit += 4; + } +} +void stbi_decode_DXT45_alpha_block( + unsigned char uncompressed[16*4], + unsigned char compressed[8] ) +{ + int i, next_bit = 8*2; + unsigned char decode_alpha[8]; + // each alpha value gets 3 bits, and the 1st 2 bytes are the range + decode_alpha[0] = compressed[0]; + decode_alpha[1] = compressed[1]; + if( decode_alpha[0] > decode_alpha[1] ) + { + // 6 step intermediate + decode_alpha[2] = (6*decode_alpha[0] + 1*decode_alpha[1]) / 7; + decode_alpha[3] = (5*decode_alpha[0] + 2*decode_alpha[1]) / 7; + decode_alpha[4] = (4*decode_alpha[0] + 3*decode_alpha[1]) / 7; + decode_alpha[5] = (3*decode_alpha[0] + 4*decode_alpha[1]) / 7; + decode_alpha[6] = (2*decode_alpha[0] + 5*decode_alpha[1]) / 7; + decode_alpha[7] = (1*decode_alpha[0] + 6*decode_alpha[1]) / 7; + } else + { + // 4 step intermediate, pluss full and none + decode_alpha[2] = (4*decode_alpha[0] + 1*decode_alpha[1]) / 5; + decode_alpha[3] = (3*decode_alpha[0] + 2*decode_alpha[1]) / 5; + decode_alpha[4] = (2*decode_alpha[0] + 3*decode_alpha[1]) / 5; + decode_alpha[5] = (1*decode_alpha[0] + 4*decode_alpha[1]) / 5; + decode_alpha[6] = 0; + decode_alpha[7] = 255; + } + for( i = 3; i < 16*4; i += 4 ) + { + int idx = 0, bit; + bit = (compressed[next_bit>>3] >> (next_bit&7)) & 1; + idx += bit << 0; + ++next_bit; + bit = (compressed[next_bit>>3] >> (next_bit&7)) & 1; + idx += bit << 1; + ++next_bit; + bit = (compressed[next_bit>>3] >> (next_bit&7)) & 1; + idx += bit << 2; + ++next_bit; + uncompressed[i] = decode_alpha[idx & 7]; + } + // done +} +void stbi_decode_DXT_color_block( + unsigned char uncompressed[16*4], + unsigned char compressed[8] ) +{ + int next_bit = 4*8; + int i, r, g, b; + int c0, c1; + unsigned char decode_colors[4*3]; + // find the 2 primary colors + c0 = compressed[0] + (compressed[1] << 8); + c1 = compressed[2] + (compressed[3] << 8); + stbi_rgb_888_from_565( c0, &r, &g, &b ); + decode_colors[0] = r; + decode_colors[1] = g; + decode_colors[2] = b; + stbi_rgb_888_from_565( c1, &r, &g, &b ); + decode_colors[3] = r; + decode_colors[4] = g; + decode_colors[5] = b; + // Like DXT1, but no choicees: + // no alpha, 2 interpolated colors + decode_colors[6] = (2*decode_colors[0] + decode_colors[3]) / 3; + decode_colors[7] = (2*decode_colors[1] + decode_colors[4]) / 3; + decode_colors[8] = (2*decode_colors[2] + decode_colors[5]) / 3; + decode_colors[9] = (decode_colors[0] + 2*decode_colors[3]) / 3; + decode_colors[10] = (decode_colors[1] + 2*decode_colors[4]) / 3; + decode_colors[11] = (decode_colors[2] + 2*decode_colors[5]) / 3; + // decode the block + for( i = 0; i < 16*4; i += 4 ) + { + int idx = ((compressed[next_bit>>3] >> (next_bit & 7)) & 3) * 3; + next_bit += 2; + uncompressed[i+0] = decode_colors[idx+0]; + uncompressed[i+1] = decode_colors[idx+1]; + uncompressed[i+2] = decode_colors[idx+2]; + } + // done +} +static stbi_uc *dds_load(int *x, int *y, int *comp, int req_comp) +{ + // all variables go up front + stbi_uc *dds_data = NULL; + stbi_uc block[16*4]; + stbi_uc compressed[8]; + int flags, DXT_family; + int has_alpha, has_mipmap; + int is_compressed, cubemap_faces; + int block_pitch, num_blocks; + DDS_header header; + int i, sz, cf; + // load the header + if( sizeof( DDS_header ) != 128 ) + { + return NULL; + } + getn( (stbi_uc*)(&header), 128 ); + // and do some checking + if( header.dwMagic != (('D' << 0) | ('D' << 8) | ('S' << 16) | (' ' << 24)) ) return NULL; + if( header.dwSize != 124 ) return NULL; + flags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; + if( (header.dwFlags & flags) != flags ) return NULL; + /* According to the MSDN spec, the dwFlags should contain + DDSD_LINEARSIZE if it's compressed, or DDSD_PITCH if + uncompressed. Some DDS writers do not conform to the + spec, so I need to make my reader more tolerant */ + if( header.sPixelFormat.dwSize != 32 ) return NULL; + flags = DDPF_FOURCC | DDPF_RGB; + if( (header.sPixelFormat.dwFlags & flags) == 0 ) return NULL; + if( (header.sCaps.dwCaps1 & DDSCAPS_TEXTURE) == 0 ) return NULL; + // get the image data + img_x = header.dwWidth; + img_y = header.dwHeight; + img_n = 4; + is_compressed = (header.sPixelFormat.dwFlags & DDPF_FOURCC) / DDPF_FOURCC; + has_alpha = (header.sPixelFormat.dwFlags & DDPF_ALPHAPIXELS) / DDPF_ALPHAPIXELS; + has_mipmap = (header.sCaps.dwCaps1 & DDSCAPS_MIPMAP) && (header.dwMipMapCount > 1); + cubemap_faces = (header.sCaps.dwCaps2 & DDSCAPS2_CUBEMAP) / DDSCAPS2_CUBEMAP; + /* I need cubemaps to have square faces */ + cubemap_faces &= (img_x == img_y); + cubemap_faces *= 5; + cubemap_faces += 1; + block_pitch = (img_x+3) >> 2; + num_blocks = block_pitch * ((img_y+3) >> 2); + /* let the user know what's going on */ + *x = img_x; + *y = img_y; + *comp = img_n; + /* is this uncompressed? */ + if( is_compressed ) + { + /* compressed */ + // note: header.sPixelFormat.dwFourCC is something like (('D'<<0)|('X'<<8)|('T'<<16)|('1'<<24)) + DXT_family = 1 + (header.sPixelFormat.dwFourCC >> 24) - '1'; + if( (DXT_family < 1) || (DXT_family > 5) ) return NULL; + /* check the expected size...oops, nevermind... + those non-compliant writers leave + dwPitchOrLinearSize == 0 */ + // passed all the tests, get the RAM for decoding + sz = (img_x)*(img_y)*4*cubemap_faces; + dds_data = (unsigned char*)malloc( sz ); + /* do this once for each face */ + for( cf = 0; cf < cubemap_faces; ++ cf ) + { + // now read and decode all the blocks + for( i = 0; i < num_blocks; ++i ) + { + // where are we? + int bx, by, bw=4, bh=4; + int ref_x = 4 * (i % block_pitch); + int ref_y = 4 * (i / block_pitch); + // get the next block's worth of compressed data, and decompress it + if( DXT_family == 1 ) + { + // DXT1 + getn( compressed, 8 ); + stbi_decode_DXT1_block( block, compressed ); + } else if( DXT_family < 4 ) + { + // DXT2/3 + getn( compressed, 8 ); + stbi_decode_DXT23_alpha_block ( block, compressed ); + getn( compressed, 8 ); + stbi_decode_DXT_color_block ( block, compressed ); + } else + { + // DXT4/5 + getn( compressed, 8 ); + stbi_decode_DXT45_alpha_block ( block, compressed ); + getn( compressed, 8 ); + stbi_decode_DXT_color_block ( block, compressed ); + } + // is this a partial block? + if( ref_x + 4 > img_x ) + { + bw = img_x - ref_x; + } + if( ref_y + 4 > img_y ) + { + bh = img_y - ref_y; + } + // now drop our decompressed data into the buffer + for( by = 0; by < bh; ++by ) + { + int idx = 4*((ref_y+by+cf*img_x)*img_x + ref_x); + for( bx = 0; bx < bw*4; ++bx ) + { + + dds_data[idx+bx] = block[by*16+bx]; + } + } + } + /* done reading and decoding the main image... + skip MIPmaps if present */ + if( has_mipmap ) + { + int block_size = 16; + if( DXT_family == 1 ) + { + block_size = 8; + } + for( i = 1; i < header.dwMipMapCount; ++i ) + { + int mx = img_x >> (i + 2); + int my = img_y >> (i + 2); + if( mx < 1 ) + { + mx = 1; + } + if( my < 1 ) + { + my = 1; + } + skip( mx*my*block_size ); + } + } + }/* per cubemap face */ + } else + { + /* uncompressed */ + DXT_family = 0; + img_n = 3; + if( has_alpha ) + { + img_n = 4; + } + *comp = img_n; + sz = img_x*img_y*img_n*cubemap_faces; + dds_data = (unsigned char*)malloc( sz ); + /* do this once for each face */ + for( cf = 0; cf < cubemap_faces; ++ cf ) + { + /* read the main image for this face */ + getn( &dds_data[cf*img_x*img_y*img_n], img_x*img_y*img_n ); + /* done reading and decoding the main image... + skip MIPmaps if present */ + if( has_mipmap ) + { + for( i = 1; i < header.dwMipMapCount; ++i ) + { + int mx = img_x >> i; + int my = img_y >> i; + if( mx < 1 ) + { + mx = 1; + } + if( my < 1 ) + { + my = 1; + } + skip( mx*my*img_n ); + } + } + } + /* data was BGR, I need it RGB */ + for( i = 0; i < sz; i += img_n ) + { + unsigned char temp = dds_data[i]; + dds_data[i] = dds_data[i+2]; + dds_data[i+2] = temp; + } + } + /* finished decompressing into RGBA, + adjust the y size if we have a cubemap + note: sz is already up to date */ + img_y *= cubemap_faces; + *y = img_y; + // did the user want something else, or + // see if all the alpha values are 255 (i.e. no transparency) + has_alpha = 0; + if( img_n == 4) + { + for( i = 3; (i < sz) && (has_alpha == 0); i += 4 ) + { + has_alpha |= (dds_data[i] < 255); + } + } + if( (req_comp <= 4) && (req_comp >= 1) && (req_comp != img_n) ) + { + // user has some requirements, meet them + dds_data = convert_format( dds_data, img_n, req_comp ); + *comp = req_comp; + } else + { + // user had no requirements, only drop to RGB is no alpha + if( (has_alpha == 0) && (img_n == 4) ) + { + dds_data = convert_format( dds_data, 4, 3 ); + *comp = 3; + } + } + // OK, done + return dds_data; +} + +#ifndef STBI_NO_STDIO +stbi_uc *stbi_dds_load (char *filename, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *data; + FILE *f = fopen(filename, "rb"); + if (!f) return NULL; + data = dds_load(x,y,comp,req_comp); + fclose(f); + return data; +} + +stbi_uc *stbi_dds_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp) +{ + start_file(f); + return dds_load(x,y,comp,req_comp); +} +#endif + +stbi_uc *stbi_dds_load_from_memory (stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + start_mem(buffer, len); + return dds_load(x,y,comp,req_comp); +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/stbi_DDS_aug.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/stbi_DDS_aug.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/stbi_DDS_aug.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/stbi_DDS_aug.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,21 @@ +/* + adding DDS loading support to stbi +*/ + +#ifndef HEADER_STB_IMAGE_DDS_AUGMENTATION +#define HEADER_STB_IMAGE_DDS_AUGMENTATION + +// is it a DDS file? +extern int stbi_dds_test_memory (stbi_uc *buffer, int len); + +extern stbi_uc *stbi_dds_load (char *filename, int *x, int *y, int *comp, int req_comp); +extern stbi_uc *stbi_dds_load_from_memory (stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp); +#ifndef STBI_NO_STDIO +extern int stbi_dds_test_file (FILE *f); +extern stbi_uc *stbi_dds_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // HEADER_STB_IMAGE_DDS_AUGMENTATION diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/stb_image_aug.c kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/stb_image_aug.c --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/stb_image_aug.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/stb_image_aug.c 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,3163 @@ +/* stbi-1.03 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c + when you control the images you're loading + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline (no JPEG progressive, no oddball channel decimations) + PNG non-interlaced + BMP non-1bpp, non-RLE + TGA (not sure what subset, if a subset) + HDR (radiance rgbE format) + writes BMP,TGA (define STBI_NO_WRITE to remove code) + decoded from memory or through stdio FILE (define STBI_NO_STDIO to remove code) + + TODO: + stbi_info_* + PSD loader + + history: + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less + than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant +*/ + +#include "stb_image_aug.h" + +#ifndef STBI_NO_STDIO +#include +#endif +#include +#include +#include +#include + +#ifndef _MSC_VER +#define __forceinline +#endif + +// implementation: +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef signed short int16; +typedef unsigned int uint32; +typedef signed int int32; +typedef unsigned int uint; + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(uint32)==4]; + +#if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE) +#define STBI_NO_WRITE +#endif + +#ifndef STBI_NO_DDS +#include "stbi_DDS_aug.h" +#endif + +// I (JLD) want full messages for SOIL +#define STBI_FAILURE_USERMSG 1 + +////////////////////////////////////////////////////////////////////////////// +// +// Generic API that works on all image types +// + +static char *failure_reason; + +char *stbi_failure_reason(void) +{ + return failure_reason; +} + +static int e(char *str) +{ + failure_reason = str; + return 0; +} + +#ifdef STBI_NO_FAILURE_STRINGS + #define e(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define e(x,y) e(y) +#else + #define e(x,y) e(x) +#endif + +#define ep(x,y) (e(x,y)?NULL:NULL) + +void stbi_image_free(unsigned char *retval_from_stbi_load) +{ + free(retval_from_stbi_load); +} + +#define MAX_LOADERS 32 +stbi_loader *loaders[MAX_LOADERS]; +static int max_loaders = 0; + +int stbi_register_loader(stbi_loader *loader) +{ + int i; + for (i=0; i < MAX_LOADERS; ++i) { + // already present? + if (loaders[i] == loader) + return 1; + // end of the list? + if (loaders[i] == NULL) { + loaders[i] = loader; + max_loaders = i+1; + return 1; + } + } + // no room for it + return 0; +} + +#ifndef STBI_NO_HDR +static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_STDIO +unsigned char *stbi_load(char *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = fopen(filename, "rb"); + unsigned char *result; + if (!f) return ep("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + int i; + if (stbi_jpeg_test_file(f)) + return stbi_jpeg_load_from_file(f,x,y,comp,req_comp); + if (stbi_png_test_file(f)) + return stbi_png_load_from_file(f,x,y,comp,req_comp); + if (stbi_bmp_test_file(f)) + return stbi_bmp_load_from_file(f,x,y,comp,req_comp); + #ifndef STBI_NO_DDS + if (stbi_dds_test_file(f)) + return stbi_dds_load_from_file(f,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_HDR + if (stbi_hdr_test_file(f)) { + float *hdr = stbi_hdr_load_from_file(f, x,y,comp,req_comp); + return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + for (i=0; i < max_loaders; ++i) + if (loaders[i]->test_file(f)) + return loaders[i]->load_from_file(f,x,y,comp,req_comp); + // test tga last because it's a crappy test! + if (stbi_tga_test_file(f)) + return stbi_tga_load_from_file(f,x,y,comp,req_comp); + return ep("unknown image type", "Image not of any known type, or corrupt"); +} +#endif + +unsigned char *stbi_load_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + int i; + if (stbi_jpeg_test_memory(buffer,len)) + return stbi_jpeg_load_from_memory(buffer,len,x,y,comp,req_comp); + if (stbi_png_test_memory(buffer,len)) + return stbi_png_load_from_memory(buffer,len,x,y,comp,req_comp); + if (stbi_bmp_test_memory(buffer,len)) + return stbi_bmp_load_from_memory(buffer,len,x,y,comp,req_comp); + #ifndef STBI_NO_DDS + if (stbi_dds_test_memory(buffer,len)) + return stbi_dds_load_from_memory(buffer,len,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_HDR + if (stbi_hdr_test_memory(buffer, len)) { + float *hdr = stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp); + return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + for (i=0; i < max_loaders; ++i) + if (loaders[i]->test_memory(buffer,len)) + return loaders[i]->load_from_memory(buffer,len,x,y,comp,req_comp); + // test tga last because it's a crappy test! + if (stbi_tga_test_memory(buffer,len)) + return stbi_tga_load_from_memory(buffer,len,x,y,comp,req_comp); + return ep("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_HDR + +#ifndef STBI_NO_STDIO +float *stbi_loadf(char *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = fopen(filename, "rb"); + float *result; + if (!f) return ep("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi_hdr_test_file(f)) + return stbi_hdr_load_from_file(f,x,y,comp,req_comp); + #endif + data = stbi_load_from_file(f, x, y, comp, req_comp); + if (data) + return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return ep("unknown image type", "Image not of any known type, or corrupt"); +} +#endif + +float *stbi_loadf_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *data; + #ifndef STBI_NO_HDR + if (stbi_hdr_test_memory(buffer, len)) + return stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp); + #endif + data = stbi_load_from_memory(buffer, len, x, y, comp, req_comp); + if (data) + return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return ep("unknown image type", "Image not of any known type, or corrupt"); +} +#endif + +// these is-hdr-or-not is defined independent of whether STBI_NO_HDR is +// defined, for API simplicity; if STBI_NO_HDR is defined, it always +// reports false! + +extern int stbi_is_hdr_from_memory(stbi_uc *buffer, int len) +{ + #ifndef STBI_NO_HDR + return stbi_hdr_test_memory(buffer, len); + #else + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +extern int stbi_is_hdr (char *filename) +{ + FILE *f = fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +extern int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + return stbi_hdr_test_file(f); + #else + return 0; + #endif +} + +#endif + +// @TODO: get image dimensions & components without fully decoding +#ifndef STBI_NO_STDIO +extern int stbi_info (char *filename, int *x, int *y, int *comp); +extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +#endif +extern int stbi_info_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp); + +#ifndef STBI_NO_HDR +static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f; +static float l2h_gamma=2.2f, l2h_scale=1.0f; + +void stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; } +void stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; } + +void stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; } +void stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; } +#endif + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +// image width, height, # components +static uint32 img_x, img_y; +static int img_n, img_out_n; + +enum +{ + SCAN_load=0, + SCAN_type, + SCAN_header, +}; + +// An API for reading either from memory or file. +#ifndef STBI_NO_STDIO +static FILE *img_file; +#endif +static uint8 *img_buffer, *img_buffer_end; + +#ifndef STBI_NO_STDIO +static void start_file(FILE *f) +{ + img_file = f; +} +#endif + +static void start_mem(uint8 *buffer, int len) +{ +#ifndef STBI_NO_STDIO + img_file = NULL; +#endif + img_buffer = buffer; + img_buffer_end = buffer+len; +} + +static int get8(void) +{ +#ifndef STBI_NO_STDIO + if (img_file) { + int c = fgetc(img_file); + return c == EOF ? 0 : c; + } +#endif + if (img_buffer < img_buffer_end) + return *img_buffer++; + return 0; +} + +static int at_eof(void) +{ +#ifndef STBI_NO_STDIO + if (img_file) + return feof(img_file); +#endif + return img_buffer >= img_buffer_end; +} + +static uint8 get8u(void) +{ + return (uint8) get8(); +} + +static void skip(int n) +{ +#ifndef STBI_NO_STDIO + if (img_file) + fseek(img_file, n, SEEK_CUR); + else +#endif + img_buffer += n; +} + +static int get16(void) +{ + int z = get8(); + return (z << 8) + get8(); +} + +static uint32 get32(void) +{ + uint32 z = get16(); + return (z << 16) + get16(); +} + +static int get16le(void) +{ + int z = get8(); + return z + (get8() << 8); +} + +static uint32 get32le(void) +{ + uint32 z = get16le(); + return z + (get16le() << 16); +} + +static void getn(stbi_uc *buffer, int n) +{ +#ifndef STBI_NO_STDIO + if (img_file) { + fread(buffer, 1, n, img_file); + return; + } +#endif + memcpy(buffer, img_buffer, n); + img_buffer += n; +} + +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static uint8 compute_y(int r, int g, int b) +{ + return (uint8) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp) +{ + uint i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + assert(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) malloc(req_comp * img_x * img_y); + if (good == NULL) { + free(data); + return ep("outofmem", "Out of memory"); + } + + for (j=0; j < img_y; ++j) { + unsigned char *src = data + j * img_x * img_n ; + unsigned char *dest = good + j * img_x * req_comp; + + #define COMBO(a,b) ((a)*8+(b)) + #define CASE(a,b) case COMBO(a,b): for(i=0; i < img_x; ++i, src += a, dest += b) + + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch(COMBO(img_n, req_comp)) { + CASE(1,2) dest[0]=src[0], dest[1]=255; break; + CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; + CASE(2,1) dest[0]=src[0]; break; + CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; + CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; + CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]); break; + CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255; break; + CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]); break; + CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; + CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; + default: assert(0); + } + #undef CASE + } + + free(data); + img_out_n = req_comp; + return good; +} + +#ifndef STBI_NO_HDR +static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output = (float *) malloc(x * y * comp * sizeof(float)); + if (output == NULL) { free(data); return ep("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) pow(data[i*comp+k]/255.0, l2h_gamma) * l2h_scale; + } + if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; + } + free(data); + return output; +} + +#define float2int(x) ((int) (x)) +static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output = (stbi_uc *) malloc(x * y * comp); + if (output == NULL) { free(data); return ep("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = float2int(z); + } + } + free(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder (not actually fully baseline implementation) +// +// simple implementation +// - channel subsampling of at most 2 in each dimension +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - uses a lot of intermediate memory, could cache poorly +// - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4 +// stb_jpeg: 1.34 seconds (MSVC6, default release build) +// stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro) +// IJL11.dll: 1.08 seconds (compiled by intel) +// IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG) +// IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro) + +int stbi_jpeg_dc_only; + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + uint8 fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + uint16 code[256]; + uint8 values[256]; + uint8 size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} huffman; + +static huffman huff_dc[4]; // baseline is 2 tables, extended is 4 +static huffman huff_ac[4]; +static uint8 dequant[4][64]; + +static int build_huffman(huffman *h, int *count) +{ + int i,j,k=0,code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (uint8) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (uint16) (code++); + if (code-1 >= (1 << j)) return e("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (uint8) i; + } + } + } + return 1; +} + +// sizes for components, interleaved MCUs +static int img_h_max, img_v_max; +static int img_mcu_x, img_mcu_y; +static int img_mcu_w, img_mcu_h; + +// definition of jpeg image component +static struct +{ + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + uint8 *data; +} img_comp[4]; + +static unsigned long code_buffer; // jpeg entropy-coded buffer +static int code_bits; // number of valid bits +static unsigned char marker; // marker seen while filling entropy buffer +static int nomore; // flag if we saw a marker so must stop + +static void grow_buffer_unsafe(void) +{ + do { + int b = nomore ? 0 : get8(); + if (b == 0xff) { + int c = get8(); + if (c != 0) { + marker = (unsigned char) c; + nomore = 1; + return; + } + } + code_buffer = (code_buffer << 8) | b; + code_bits += 8; + } while (code_bits <= 24); +} + +// (1 << n) - 1 +static unsigned long bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +__forceinline static int decode(huffman *h) +{ + unsigned int temp; + int c,k; + + if (code_bits < 16) grow_buffer_unsafe(); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (code_buffer >> (code_bits - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + if (h->size[k] > code_bits) + return -1; + code_bits -= h->size[k]; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + if (code_bits < 16) + temp = (code_buffer << (16 - code_bits)) & 0xffff; + else + temp = (code_buffer >> (code_bits - 16)) & 0xffff; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + code_bits -= 16; + return -1; + } + + if (k > code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((code_buffer >> (code_bits - k)) & bmask[k]) + h->delta[k]; + assert((((code_buffer) >> (code_bits - h->size[c])) & bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + code_bits -= k; + return h->values[c]; +} + +// combined JPEG 'receive' and JPEG 'extend', since baseline +// always extends everything it receives. +__forceinline static int extend_receive(int n) +{ + unsigned int m = 1 << (n-1); + unsigned int k; + if (code_bits < n) grow_buffer_unsafe(); + k = (code_buffer >> (code_bits - n)) & bmask[n]; + code_bits -= n; + // the following test is probably a random branch that won't + // predict well. I tried to table accelerate it but failed. + // maybe it's compiling as a conditional move? + if (k < m) + return (-1 << n) + k + 1; + else + return k; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static uint8 dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int decode_block(short data[64], huffman *hdc, huffman *hac, int b) +{ + int diff,dc,k; + int t = decode(hdc); + if (t < 0) return e("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? extend_receive(t) : 0; + dc = img_comp[b].dc_pred + diff; + img_comp[b].dc_pred = dc; + data[0] = (short) dc; + + // decode AC components, see JPEG spec + k = 1; + do { + int r,s; + int rs = decode(hac); + if (rs < 0) return e("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + data[dezigzag[k++]] = (short) extend_receive(s); + } + } while (k < 64); + return 1; +} + +// take a -128..127 value and clamp it and convert to 0..255 +__forceinline static uint8 clamp(int x) +{ + x += 128; + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (uint8) x; +} + +#define f2f(x) (int) (((x) * 4096 + 0.5)) +#define fsh(x) ((x) << 12) + +// derived from jidctint -- DCT_ISLOW +#define IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * f2f(0.5411961f); \ + t2 = p1 + p3*f2f(-1.847759065f); \ + t3 = p1 + p2*f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = fsh(p2+p3); \ + t1 = fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*f2f( 1.175875602f); \ + t0 = t0*f2f( 0.298631336f); \ + t1 = t1*f2f( 2.053119869f); \ + t2 = t2*f2f( 3.072711026f); \ + t3 = t3*f2f( 1.501321110f); \ + p1 = p5 + p1*f2f(-0.899976223f); \ + p2 = p5 + p2*f2f(-2.562915447f); \ + p3 = p3*f2f(-1.961570560f); \ + p4 = p4*f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +// .344 seconds on 3*anemones.jpg +static void idct_block(uint8 *out, int out_stride, short data[64], uint8 *dequantize) +{ + int i,val[64],*v=val; + uint8 *o,*dq = dequantize; + short *d = data; + + if (stbi_jpeg_dc_only) { + // ok, I don't really know why this is right, but it seems to be: + int z = 128 + ((d[0] * dq[0]) >> 3); + for (i=0; i < 8; ++i) { + out[0] = out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = out[7] = z; + out += out_stride; + } + return; + } + + // columns + for (i=0; i < 8; ++i,++d,++dq, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0] * dq[0] << 2; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], + d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + x0 += 65536; x1 += 65536; x2 += 65536; x3 += 65536; + o[0] = clamp((x0+t3) >> 17); + o[7] = clamp((x0-t3) >> 17); + o[1] = clamp((x1+t2) >> 17); + o[6] = clamp((x1-t2) >> 17); + o[2] = clamp((x2+t1) >> 17); + o[5] = clamp((x2-t1) >> 17); + o[3] = clamp((x3+t0) >> 17); + o[4] = clamp((x3-t0) >> 17); + } +} + +#define MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static uint8 get_marker(void) +{ + uint8 x; + if (marker != MARKER_none) { x = marker; marker = MARKER_none; return x; } + x = get8u(); + if (x != 0xff) return MARKER_none; + while (x == 0xff) + x = get8u(); + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +static int scan_n, order[4]; +static int restart_interval, todo; +#define RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, reset the entropy decoder and +// the dc prediction +static void reset(void) +{ + code_bits = 0; + code_buffer = 0; + nomore = 0; + img_comp[0].dc_pred = img_comp[1].dc_pred = img_comp[2].dc_pred = 0; + marker = MARKER_none; + todo = restart_interval ? restart_interval : 0x7fffffff; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int parse_entropy_coded_data(void) +{ + reset(); + if (scan_n == 1) { + int i,j; + short data[64]; + int n = order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (img_comp[n].x+7) >> 3; + int h = (img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + if (!decode_block(data, huff_dc+img_comp[n].hd, huff_ac+img_comp[n].ha, n)) return 0; + idct_block(img_comp[n].data+img_comp[n].w2*j*8+i*8, img_comp[n].w2, data, dequant[img_comp[n].tq]); + // every data block is an MCU, so countdown the restart interval + if (--todo <= 0) { + if (code_bits < 24) grow_buffer_unsafe(); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!RESTART(marker)) return 1; + reset(); + } + } + } + } else { // interleaved! + int i,j,k,x,y; + short data[64]; + for (j=0; j < img_mcu_y; ++j) { + for (i=0; i < img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < scan_n; ++k) { + int n = order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < img_comp[n].v; ++y) { + for (x=0; x < img_comp[n].h; ++x) { + int x2 = (i*img_comp[n].h + x)*8; + int y2 = (j*img_comp[n].v + y)*8; + if (!decode_block(data, huff_dc+img_comp[n].hd, huff_ac+img_comp[n].ha, n)) return 0; + idct_block(img_comp[n].data+img_comp[n].w2*y2+x2, img_comp[n].w2, data, dequant[img_comp[n].tq]); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--todo <= 0) { + if (code_bits < 24) grow_buffer_unsafe(); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!RESTART(marker)) return 1; + reset(); + } + } + } + } + return 1; +} + +static int process_marker(int m) +{ + int L; + switch (m) { + case MARKER_none: // no marker found + return e("expected marker","Corrupt JPEG"); + + case 0xC2: // SOF - progressive + return e("progressive jpeg","JPEG format not supported (progressive)"); + + case 0xDD: // DRI - specify restart interval + if (get16() != 4) return e("bad DRI len","Corrupt JPEG"); + restart_interval = get16(); + return 1; + + case 0xDB: // DQT - define quantization table + L = get16()-2; + while (L > 0) { + int z = get8(); + int p = z >> 4; + int t = z & 15,i; + if (p != 0) return e("bad DQT type","Corrupt JPEG"); + if (t > 3) return e("bad DQT table","Corrupt JPEG"); + for (i=0; i < 64; ++i) + dequant[t][dezigzag[i]] = get8u(); + L -= 65; + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = get16()-2; + while (L > 0) { + uint8 *v; + int sizes[16],i,m=0; + int z = get8(); + int tc = z >> 4; + int th = z & 15; + if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = get8(); + m += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!build_huffman(huff_dc+th, sizes)) return 0; + v = huff_dc[th].values; + } else { + if (!build_huffman(huff_ac+th, sizes)) return 0; + v = huff_ac[th].values; + } + for (i=0; i < m; ++i) + v[i] = get8u(); + L -= m; + } + return L==0; + } + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + skip(get16()-2); + return 1; + } + return 0; +} + +// after we see SOS +static int process_scan_header(void) +{ + int i; + int Ls = get16(); + scan_n = get8(); + if (scan_n < 1 || scan_n > 4 || scan_n > (int) img_n) return e("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*scan_n) return e("bad SOS len","Corrupt JPEG"); + for (i=0; i < scan_n; ++i) { + int id = get8(), which; + int z = get8(); + for (which = 0; which < img_n; ++which) + if (img_comp[which].id == id) + break; + if (which == img_n) return 0; + img_comp[which].hd = z >> 4; if (img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG"); + img_comp[which].ha = z & 15; if (img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG"); + order[i] = which; + } + if (get8() != 0) return e("bad SOS","Corrupt JPEG"); + get8(); // should be 63, but might be 0 + if (get8() != 0) return e("bad SOS","Corrupt JPEG"); + + return 1; +} + +static int process_frame_header(int scan) +{ + int Lf,p,i,z, h_max=1,v_max=1; + Lf = get16(); if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG + p = get8(); if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + img_y = get16(); if (img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + img_x = get16(); if (img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires + img_n = get8(); + if (img_n != 3 && img_n != 1) return e("bad component count","Corrupt JPEG"); // JFIF requires + + if (Lf != 8+3*img_n) return e("bad SOF len","Corrupt JPEG"); + + for (i=0; i < img_n; ++i) { + img_comp[i].id = get8(); + if (img_comp[i].id != i+1) // JFIF requires + if (img_comp[i].id != i) // jpegtran outputs non-JFIF-compliant files! + return e("bad component ID","Corrupt JPEG"); + z = get8(); + img_comp[i].h = (z >> 4); if (!img_comp[i].h || img_comp[i].h > 4) return e("bad H","Corrupt JPEG"); + img_comp[i].v = z & 15; if (!img_comp[i].v || img_comp[i].v > 4) return e("bad V","Corrupt JPEG"); + img_comp[i].tq = get8(); if (img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG"); + } + + if (scan != SCAN_load) return 1; + + if ((1 << 30) / img_x / img_n < img_y) return e("too large", "Image too large to decode"); + + for (i=0; i < img_n; ++i) { + if (img_comp[i].h > h_max) h_max = img_comp[i].h; + if (img_comp[i].v > v_max) v_max = img_comp[i].v; + } + + // compute interleaved mcu info + img_h_max = h_max; + img_v_max = v_max; + img_mcu_w = h_max * 8; + img_mcu_h = v_max * 8; + img_mcu_x = (img_x + img_mcu_w-1) / img_mcu_w; + img_mcu_y = (img_y + img_mcu_h-1) / img_mcu_h; + + for (i=0; i < img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + img_comp[i].x = (img_x * img_comp[i].h + h_max-1) / h_max; + img_comp[i].y = (img_y * img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + img_comp[i].w2 = img_mcu_x * img_comp[i].h * 8; + img_comp[i].h2 = img_mcu_y * img_comp[i].v * 8; + img_comp[i].data = (uint8 *) malloc(img_comp[i].w2 * img_comp[i].h2); + if (img_comp[i].data == NULL) { + for(--i; i >= 0; --i) + free(img_comp[i].data); + return e("outofmem", "Out of memory"); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define DNL(x) ((x) == 0xdc) +#define SOI(x) ((x) == 0xd8) +#define EOI(x) ((x) == 0xd9) +#define SOF(x) ((x) == 0xc0 || (x) == 0xc1) +#define SOS(x) ((x) == 0xda) + +static int decode_jpeg_header(int scan) +{ + int m; + marker = MARKER_none; // initialize cached marker to empty + m = get_marker(); + if (!SOI(m)) return e("no SOI","Corrupt JPEG"); + if (scan == SCAN_type) return 1; + m = get_marker(); + while (!SOF(m)) { + if (!process_marker(m)) return 0; + m = get_marker(); + while (m == MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (at_eof()) return e("no SOF", "Corrupt JPEG"); + m = get_marker(); + } + } + if (!process_frame_header(scan)) return 0; + return 1; +} + +static int decode_jpeg_image(void) +{ + int m; + restart_interval = 0; + if (!decode_jpeg_header(SCAN_load)) return 0; + m = get_marker(); + while (!EOI(m)) { + if (SOS(m)) { + if (!process_scan_header()) return 0; + if (!parse_entropy_coded_data()) return 0; + } else { + if (!process_marker(m)) return 0; + } + m = get_marker(); + } + return 1; +} + +// static jfif-centered resampling with cross-block smoothing +// here by cross-block smoothing what I mean is that the resampling +// is bilerp and crosses blocks; I dunno what IJG means + +#define div4(x) ((uint8) ((x) >> 2)) + +static void resample_v_2(uint8 *out1, uint8 *input, int w, int h, int s) +{ + // need to generate two samples vertically for every one in input + uint8 *above; + uint8 *below; + uint8 *source; + uint8 *out2; + int i,j; + source = input; + out2 = out1+w; + for (j=0; j < h; ++j) { + above = source; + source = input + j*s; + below = source + s; if (j == h-1) below = source; + for (i=0; i < w; ++i) { + int n = source[i]*3; + out1[i] = div4(above[i] + n); + out2[i] = div4(below[i] + n); + } + out1 += w*2; + out2 += w*2; + } +} + +static void resample_h_2(uint8 *out, uint8 *input, int w, int h, int s) +{ + // need to generate two samples horizontally for every one in input + int i,j; + if (w == 1) { + for (j=0; j < h; ++j) + out[j*2+0] = out[j*2+1] = input[j*s]; + return; + } + for (j=0; j < h; ++j) { + out[0] = input[0]; + out[1] = div4(input[0]*3 + input[1]); + for (i=1; i < w-1; ++i) { + int n = input[i]*3; + out[i*2-2] = div4(input[i-1] + n); + out[i*2-1] = div4(input[i+1] + n); + } + out[w*2-2] = div4(input[w-2]*3 + input[w-1]); + out[w*2-1] = input[w-1]; + out += w*2; + input += s; + } +} + +// .172 seconds on 3*anemones.jpg +static void resample_hv_2(uint8 *out, uint8 *input, int w, int h, int s) +{ + // need to generate 2x2 samples for every one in input + int i,j; + int os = w*2; + // generate edge samples... @TODO lerp them! + for (i=0; i < w; ++i) { + out[i*2+0] = out[i*2+1] = input[i]; + out[i*2+(2*h-1)*os+0] = out[i*2+(2*h-1)*os+1] = input[i+(h-1)*w]; + } + for (j=0; j < h; ++j) { + out[j*os*2+0] = out[j*os*2+os+0] = input[j*w]; + out[j*os*2+os-1] = out[j*os*2+os+os-1] = input[j*w+i-1]; + } + // now generate interior samples; i & j point to top left of input + for (j=0; j < h-1; ++j) { + uint8 *in1 = input+j*s; + uint8 *in2 = in1 + s; + uint8 *out1 = out + (j*2+1)*os + 1; + uint8 *out2 = out1 + os; + for (i=0; i < w-1; ++i) { + int p00 = in1[0], p01=in1[1], p10=in2[0], p11=in2[1]; + int p00_3 = p00*3, p01_3 = p01*3, p10_3 = p10*3, p11_3 = p11*3; + + #define div16(x) ((uint8) ((x) >> 4)) + + out1[0] = div16(p00*9 + p01_3 + p10_3 + p11); + out1[1] = div16(p01*9 + p00_3 + p01_3 + p10); + out2[0] = div16(p10*9 + p11_3 + p00_3 + p01); + out2[1] = div16(p11*9 + p10_3 + p01_3 + p00); + out1 += 2; + out2 += 2; + ++in1; + ++in2; + } + } +} + +#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) + +// 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro) +// VC6 without processor=Pro is generating multiple LEAs per multiply! +static void YCbCr_to_RGB_row(uint8 *out, uint8 *y, uint8 *pcb, uint8 *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 16) + 32768; // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr*float2fixed(1.40200f); + g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); + b = y_fixed + cb*float2fixed(1.77200f); + r >>= 16; + g >>= 16; + b >>= 16; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (uint8)r; + out[1] = (uint8)g; + out[2] = (uint8)b; + if (step == 4) out[3] = 255; + out += step; + } +} + +// clean up the temporary component buffers +static void cleanup_jpeg(void) +{ + int i; + for (i=0; i < img_n; ++i) { + if (img_comp[i].data) { + free(img_comp[i].data); + img_comp[i].data = NULL; + } + } +} + +static uint8 *load_jpeg_image(int *out_x, int *out_y, int *comp, int req_comp) +{ + int i, n; + // validate req_comp + if (req_comp < 0 || req_comp > 4) return ep("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source + if (!decode_jpeg_image()) { cleanup_jpeg(); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : img_n; + + // resample components to full size... memory wasteful, but this + // lets us bilerp across blocks while upsampling + for (i=0; i < img_n; ++i) { + // if we're outputting fewer than 3 components, we're grey not RGB; + // in that case, don't bother upsampling Cb or Cr + if (n < 3 && i) continue; + + // check if the component scale is less than max; if so it needs upsampling + if (img_comp[i].h != img_h_max || img_comp[i].v != img_v_max) { + int stride = img_x; + // allocate final size; make sure it's big enough for upsampling off + // the edges with upsample up to 4x4 (although we only support 2x2 + // currently) + uint8 *new_data = (uint8 *) malloc((img_x+3)*(img_y+3)); + if (new_data == NULL) { + cleanup_jpeg(); + return ep("outofmem", "Out of memory (image too large?)"); + } + if (img_comp[i].h*2 == img_h_max && img_comp[i].v*2 == img_v_max) { + int tx = (img_x+1)>>1; + resample_hv_2(new_data, img_comp[i].data, tx,(img_y+1)>>1, img_comp[i].w2); + stride = tx*2; + } else if (img_comp[i].h == img_h_max && img_comp[i].v*2 == img_v_max) { + resample_v_2(new_data, img_comp[i].data, img_x,(img_y+1)>>1, img_comp[i].w2); + } else if (img_comp[i].h*2 == img_h_max && img_comp[i].v == img_v_max) { + int tx = (img_x+1)>>1; + resample_h_2(new_data, img_comp[i].data, tx,img_y, img_comp[i].w2); + stride = tx*2; + } else { + // @TODO resample uncommon sampling pattern with nearest neighbor + free(new_data); + cleanup_jpeg(); + return ep("uncommon H or V", "JPEG not supported: atypical downsampling mode"); + } + img_comp[i].w2 = stride; + free(img_comp[i].data); + img_comp[i].data = new_data; + } + } + + // now convert components to output image + { + uint32 i,j; + uint8 *output = (uint8 *) malloc(n * img_x * img_y + 1); + if (n >= 3) { // output STBI_rgb_* + for (j=0; j < img_y; ++j) { + uint8 *y = img_comp[0].data + j*img_comp[0].w2; + uint8 *out = output + n * img_x * j; + if (img_n == 3) { + uint8 *cb = img_comp[1].data + j*img_comp[1].w2; + uint8 *cr = img_comp[2].data + j*img_comp[2].w2; + YCbCr_to_RGB_row(out, y, cb, cr, img_x, n); + } else { + for (i=0; i < img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n == 3 + out += n; + } + } + } + } else { // output STBI_grey_* + for (j=0; j < img_y; ++j) { + uint8 *y = img_comp[0].data + j*img_comp[0].w2; + uint8 *out = output + n * img_x * j; + if (n == 1) + for (i=0; i < img_x; ++i) *out++ = *y++; + else + for (i=0; i < img_x; ++i) *out++ = *y++, *out++ = 255; + } + } + cleanup_jpeg(); + *out_x = img_x; + *out_y = img_y; + if (comp) *comp = n; // Changed JLD: report output components + //if (comp) *comp = img_n; // report original components, not output + return output; + } +} + +#ifndef STBI_NO_STDIO +unsigned char *stbi_jpeg_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + start_file(f); + return load_jpeg_image(x,y,comp,req_comp); +} + +unsigned char *stbi_jpeg_load(char *filename, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + FILE *f = fopen(filename, "rb"); + if (!f) return NULL; + data = stbi_jpeg_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return data; +} +#endif + +unsigned char *stbi_jpeg_load_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + start_mem(buffer,len); + return load_jpeg_image(x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +int stbi_jpeg_test_file(FILE *f) +{ + int n,r; + n = ftell(f); + start_file(f); + r = decode_jpeg_header(SCAN_type); + fseek(f,n,SEEK_SET); + return r; +} +#endif + +int stbi_jpeg_test_memory(unsigned char *buffer, int len) +{ + start_mem(buffer,len); + return decode_jpeg_header(SCAN_type); +} + +// @TODO: +#ifndef STBI_NO_STDIO +extern int stbi_jpeg_info (char *filename, int *x, int *y, int *comp); +extern int stbi_jpeg_info_from_file (FILE *f, int *x, int *y, int *comp); +#endif +extern int stbi_jpeg_info_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp); + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define ZFAST_BITS 9 // accelerate all cases in default tables +#define ZFAST_MASK ((1 << ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + uint16 fast[1 << ZFAST_BITS]; + uint16 firstcode[16]; + int maxcode[17]; + uint16 firstsymbol[16]; + uint8 size[288]; + uint16 value[288]; +} zhuffman; + +__forceinline static int bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +__forceinline static int bit_reverse(int v, int bits) +{ + assert(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return bitreverse16(v) >> (16-bits); +} + +static int zbuild_huffman(zhuffman *z, uint8 *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 255, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + assert(sizes[i] <= (1 << i)); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (uint16) code; + z->firstsymbol[i] = (uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + z->size[c] = (uint8)s; + z->value[c] = (uint16)i; + if (s <= ZFAST_BITS) { + int k = bit_reverse(next_code[s],s); + while (k < (1 << ZFAST_BITS)) { + z->fast[k] = (uint16) c; + k += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +static uint8 *zbuffer, *zbuffer_end; + +__forceinline static int zget8(void) +{ + if (zbuffer >= zbuffer_end) return 0; + return *zbuffer++; +} + +//static unsigned long code_buffer; +static int num_bits; + +static void fill_bits(void) +{ + do { + assert(code_buffer < (1U << num_bits)); + code_buffer |= zget8() << num_bits; + num_bits += 8; + } while (num_bits <= 24); +} + +__forceinline static unsigned int zreceive(int n) +{ + unsigned int k; + if (num_bits < n) fill_bits(); + k = code_buffer & ((1 << n) - 1); + code_buffer >>= n; + num_bits -= n; + return k; +} + +__forceinline static int zhuffman_decode(zhuffman *z) +{ + int b,s,k; + if (num_bits < 16) fill_bits(); + b = z->fast[code_buffer & ZFAST_MASK]; + if (b < 0xffff) { + s = z->size[b]; + code_buffer >>= s; + num_bits -= s; + return z->value[b]; + } + + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = bit_reverse(code_buffer, 16); + for (s=ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + assert(z->size[b] == s); + code_buffer >>= s; + num_bits -= s; + return z->value[b]; +} + +static char *zout; +static char *zout_start; +static char *zout_end; +static int z_expandable; + +static int expand(int n) // need to make room for n bytes +{ + char *q; + int cur, limit; + if (!z_expandable) return e("output buffer limit","Corrupt PNG"); + cur = (int) (zout - zout_start); + limit = (int) (zout_end - zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) realloc(zout_start, limit); + if (q == NULL) return e("outofmem", "Out of memory"); + zout_start = q; + zout = q + cur; + zout_end = q + limit; + return 1; +} + +static zhuffman z_length, z_distance; + +static int length_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static int length_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static int dist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int parse_huffman_block(void) +{ + for(;;) { + int z = zhuffman_decode(&z_length); + if (z < 256) { + if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= zout_end) if (!expand(1)) return 0; + *zout++ = (char) z; + } else { + uint8 *p; + int len,dist; + if (z == 256) return 1; + z -= 257; + len = length_base[z]; + if (length_extra[z]) len += zreceive(length_extra[z]); + z = zhuffman_decode(&z_distance); + if (z < 0) return e("bad huffman code","Corrupt PNG"); + dist = dist_base[z]; + if (dist_extra[z]) dist += zreceive(dist_extra[z]); + if (zout - zout_start < dist) return e("bad dist","Corrupt PNG"); + if (zout + len > zout_end) if (!expand(len)) return 0; + p = (uint8 *) (zout - dist); + while (len--) + *zout++ = *p++; + } + } +} + +static int compute_huffman_codes(void) +{ + static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + static zhuffman z_codelength; // static just to save stack space + uint8 lencodes[286+32+137];//padding for maximum single op + uint8 codelength_sizes[19]; + int i,n; + + int hlit = zreceive(5) + 257; + int hdist = zreceive(5) + 1; + int hclen = zreceive(4) + 4; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = zreceive(3); + codelength_sizes[length_dezigzag[i]] = (uint8) s; + } + if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < hlit + hdist) { + int c = zhuffman_decode(&z_codelength); + assert(c >= 0 && c < 19); + if (c < 16) + lencodes[n++] = (uint8) c; + else if (c == 16) { + c = zreceive(2)+3; + memset(lencodes+n, lencodes[n-1], c); + n += c; + } else if (c == 17) { + c = zreceive(3)+3; + memset(lencodes+n, 0, c); + n += c; + } else { + assert(c == 18); + c = zreceive(7)+11; + memset(lencodes+n, 0, c); + n += c; + } + } + if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG"); + if (!zbuild_huffman(&z_length, lencodes, hlit)) return 0; + if (!zbuild_huffman(&z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int parse_uncompressed_block(void) +{ + uint8 header[4]; + int len,nlen,k; + if (num_bits & 7) + zreceive(num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (num_bits > 0) { + header[k++] = (uint8) (code_buffer & 255); // wtf this warns? + code_buffer >>= 8; + num_bits -= 8; + } + assert(num_bits == 0); + // now fill header the normal way + while (k < 4) + header[k++] = (uint8) zget8(); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG"); + if (zbuffer + len > zbuffer_end) return e("read past buffer","Corrupt PNG"); + if (zout + len > zout_end) + if (!expand(len)) return 0; + memcpy(zout, zbuffer, len); + zbuffer += len; + zout += len; + return 1; +} + +static int parse_zlib_header(void) +{ + int cmf = zget8(); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = zget8(); + if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static uint8 default_length[288], default_distance[32]; +static void init_defaults(void) +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) default_length[i] = 8; + for ( ; i <= 255; ++i) default_length[i] = 9; + for ( ; i <= 279; ++i) default_length[i] = 7; + for ( ; i <= 287; ++i) default_length[i] = 8; + + for (i=0; i <= 31; ++i) default_distance[i] = 5; +} + +static int parse_zlib(int parse_header) +{ + int final, type; + if (parse_header) + if (!parse_zlib_header()) return 0; + num_bits = 0; + code_buffer = 0; + do { + final = zreceive(1); + type = zreceive(2); + if (type == 0) { + if (!parse_uncompressed_block()) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!default_length[0]) init_defaults(); + if (!zbuild_huffman(&z_length , default_length , 288)) return 0; + if (!zbuild_huffman(&z_distance, default_distance, 32)) return 0; + } else { + if (!compute_huffman_codes()) return 0; + } + if (!parse_huffman_block()) return 0; + } + } while (!final); + return 1; +} + +static int do_zlib(char *obuf, int olen, int exp, int parse_header) +{ + zout_start = obuf; + zout = obuf; + zout_end = obuf + olen; + z_expandable = exp; + + return parse_zlib(parse_header); +} + +char *stbi_zlib_decode_malloc_guesssize(int initial_size, int *outlen) +{ + char *p = (char *) malloc(initial_size); + if (p == NULL) return NULL; + if (do_zlib(p, initial_size, 1, 1)) { + *outlen = (int) (zout - zout_start); + return zout_start; + } else { + free(zout_start); + return NULL; + } +} + +char *stbi_zlib_decode_malloc(char *buffer, int len, int *outlen) +{ + zbuffer = (uint8 *) buffer; + zbuffer_end = (uint8 *) buffer+len; + return stbi_zlib_decode_malloc_guesssize(16384, outlen); +} + +int stbi_zlib_decode_buffer(char *obuffer, int olen, char *ibuffer, int ilen) +{ + zbuffer = (uint8 *) ibuffer; + zbuffer_end = (uint8 *) ibuffer + ilen; + if (do_zlib(obuffer, olen, 0, 1)) + return (int) (zout - zout_start); + else + return -1; +} + +char *stbi_zlib_decode_noheader_malloc(char *buffer, int len, int *outlen) +{ + char *p = (char *) malloc(16384); + if (p == NULL) return NULL; + zbuffer = (uint8 *) buffer; + zbuffer_end = (uint8 *) buffer+len; + if (do_zlib(p, 16384, 1, 0)) { + *outlen = (int) (zout - zout_start); + return zout_start; + } else { + free(zout_start); + return NULL; + } +} + +int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, char *ibuffer, int ilen) +{ + zbuffer = (uint8 *) ibuffer; + zbuffer_end = (uint8 *) ibuffer + ilen; + if (do_zlib(obuffer, olen, 0, 0)) + return (int) (zout - zout_start); + else + return -1; +} + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + + +typedef struct +{ + unsigned long length; + unsigned long type; +} chunk; + +#define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) + +static chunk get_chunk_header(void) +{ + chunk c; + c.length = get32(); + c.type = get32(); + return c; +} + +static int check_png_header(void) +{ + static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (get8() != png_sig[i]) return e("bad png sig","Not a PNG"); + return 1; +} + +static uint8 *idata, *expanded, *out; + +enum { + F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4, + F_avg_first, F_paeth_first, +}; + +static uint8 first_row_filter[5] = +{ + F_none, F_sub, F_none, F_avg_first, F_paeth_first +}; + +static int paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +// create the png data from post-deflated data +static int create_png_image(uint8 *raw, uint32 raw_len, int out_n) +{ + uint32 i,j,stride = img_x*out_n; + int k; + assert(out_n == img_n || out_n == img_n+1); + out = (uint8 *) malloc(img_x * img_y * out_n); + if (!out) return e("outofmem", "Out of memory"); + if (raw_len != (img_n * img_x + 1) * img_y) return e("not enough pixels","Corrupt PNG"); + for (j=0; j < img_y; ++j) { + uint8 *cur = out + stride*j; + uint8 *prior = cur - stride; + int filter = *raw++; + if (filter > 4) return e("invalid filter","Corrupt PNG"); + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + // handle first pixel explicitly + for (k=0; k < img_n; ++k) { + switch(filter) { + case F_none : cur[k] = raw[k]; break; + case F_sub : cur[k] = raw[k]; break; + case F_up : cur[k] = raw[k] + prior[k]; break; + case F_avg : cur[k] = raw[k] + (prior[k]>>1); break; + case F_paeth : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break; + case F_avg_first : cur[k] = raw[k]; break; + case F_paeth_first: cur[k] = raw[k]; break; + } + } + if (img_n != out_n) cur[img_n] = 255; + raw += img_n; + cur += out_n; + prior += out_n; + // this is a little gross, so that we don't switch per-pixel or per-component + if (img_n == out_n) { + #define CASE(f) \ + case f: \ + for (i=1; i < img_x; ++i, raw+=img_n,cur+=img_n,prior+=img_n) \ + for (k=0; k < img_n; ++k) + switch(filter) { + CASE(F_none) cur[k] = raw[k]; break; + CASE(F_sub) cur[k] = raw[k] + cur[k-img_n]; break; + CASE(F_up) cur[k] = raw[k] + prior[k]; break; + CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1); break; + CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n])); break; + CASE(F_avg_first) cur[k] = raw[k] + (cur[k-img_n] >> 1); break; + CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0)); break; + } + #undef CASE + } else { + assert(img_n+1 == out_n); + #define CASE(f) \ + case f: \ + for (i=1; i < img_x; ++i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ + for (k=0; k < img_n; ++k) + switch(filter) { + CASE(F_none) cur[k] = raw[k]; break; + CASE(F_sub) cur[k] = raw[k] + cur[k-out_n]; break; + CASE(F_up) cur[k] = raw[k] + prior[k]; break; + CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1); break; + CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; + CASE(F_avg_first) cur[k] = raw[k] + (cur[k-out_n] >> 1); break; + CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0)); break; + } + #undef CASE + } + } + return 1; +} + +static int compute_transparency(uint8 tc[3], int out_n) +{ + uint32 i, pixel_count = img_x * img_y; + uint8 *p = out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + assert(out_n == 2 || out_n == 4); + + p = out; + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int expand_palette(uint8 *palette, int len, int pal_img_n) +{ + uint32 i, pixel_count = img_x * img_y; + uint8 *p, *temp_out, *orig = out; + + p = (uint8 *) malloc(pixel_count * pal_img_n); + if (p == NULL) return e("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + free(out); + out = temp_out; + return 1; +} + +static int parse_png_file(int scan, int req_comp) +{ + uint8 palette[1024], pal_img_n=0; + uint8 has_trans=0, tc[3]; + uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k; + + if (!check_png_header()) return 0; + + if (scan == SCAN_type) return 1; + + for(;;first=0) { + chunk c = get_chunk_header(); + if (first && c.type != PNG_TYPE('I','H','D','R')) + return e("first not IHDR","Corrupt PNG"); + switch (c.type) { + case PNG_TYPE('I','H','D','R'): { + int depth,color,interlace,comp,filter; + if (!first) return e("multiple IHDR","Corrupt PNG"); + if (c.length != 13) return e("bad IHDR len","Corrupt PNG"); + img_x = get32(); if (img_x > (1 << 24)) return e("too large","Very large image (corrupt?)"); + img_y = get32(); if (img_y > (1 << 24)) return e("too large","Very large image (corrupt?)"); + depth = get8(); if (depth != 8) return e("8bit only","PNG not supported: 8-bit only"); + color = get8(); if (color > 6) return e("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG"); + comp = get8(); if (comp) return e("bad comp method","Corrupt PNG"); + filter= get8(); if (filter) return e("bad filter method","Corrupt PNG"); + interlace = get8(); if (interlace) return e("interlaced","PNG not supported: interlaced mode"); + if (!img_x || !img_y) return e("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / img_x / img_n < img_y) return e("too large", "Image too large to decode"); + if (scan == SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + img_n = 1; + if ((1 << 30) / img_x / 4 < img_y) return e("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case PNG_TYPE('P','L','T','E'): { + if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = get8u(); + palette[i*4+1] = get8u(); + palette[i*4+2] = get8u(); + palette[i*4+3] = 255; + } + break; + } + + case PNG_TYPE('t','R','N','S'): { + if (idata) return e("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == SCAN_header) { img_n = 4; return 1; } + if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = get8u(); + } else { + if (!(img_n & 1)) return e("tRNS with alpha","Corrupt PNG"); + if (c.length != (uint32) img_n*2) return e("bad tRNS len","Corrupt PNG"); + has_trans = 1; + for (k=0; k < img_n; ++k) + tc[k] = (uint8) get16(); // non 8-bit images will be larger + } + break; + } + + case PNG_TYPE('I','D','A','T'): { + if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG"); + if (scan == SCAN_header) { img_n = pal_img_n; return 1; } + if (ioff + c.length > idata_limit) { + uint8 *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + p = (uint8 *) realloc(idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory"); + idata = p; + } + #ifndef STBI_NO_STDIO + if (img_file) + { + if (fread(idata+ioff,1,c.length,img_file) != c.length) return e("outofdata","Corrupt PNG"); + } + else + #endif + { + memcpy(idata+ioff, img_buffer, c.length); + img_buffer += c.length; + } + ioff += c.length; + break; + } + + case PNG_TYPE('I','E','N','D'): { + uint32 raw_len; + if (scan != SCAN_load) return 1; + if (idata == NULL) return e("no IDAT","Corrupt PNG"); + expanded = (uint8 *) stbi_zlib_decode_malloc((char *) idata, ioff, (int *) &raw_len); + if (expanded == NULL) return 0; // zlib should set error + free(idata); idata = NULL; + if ((req_comp == img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + img_out_n = img_n+1; + else + img_out_n = img_n; + if (!create_png_image(expanded, raw_len, img_out_n)) return 0; + if (has_trans) + if (!compute_transparency(tc, img_out_n)) return 0; + if (pal_img_n) { + // pal_img_n == 3 or 4 + img_n = pal_img_n; // record the actual colors we had + img_out_n = pal_img_n; + if (req_comp >= 3) img_out_n = req_comp; + if (!expand_palette(palette, pal_len, img_out_n)) + return 0; + } + free(expanded); expanded = NULL; + return 1; + } + + default: + // if critical, fail + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + static char invalid_chunk[] = "XXXX chunk not known"; + invalid_chunk[0] = (uint8) (c.type >> 24); + invalid_chunk[1] = (uint8) (c.type >> 16); + invalid_chunk[2] = (uint8) (c.type >> 8); + invalid_chunk[3] = (uint8) (c.type >> 0); + #endif + return e(invalid_chunk, "PNG not supported: unknown chunk type"); + } + skip(c.length); + break; + } + // end of chunk, read and skip CRC + get8(); get8(); get8(); get8(); + } +} + +static unsigned char *do_png(int *x, int *y, int *n, int req_comp) +{ + unsigned char *result=NULL; + if (req_comp < 0 || req_comp > 4) return ep("bad req_comp", "Internal error"); + if (parse_png_file(SCAN_load, req_comp)) { + result = out; + out = NULL; + if (req_comp && req_comp != img_out_n) { + result = convert_format(result, img_out_n, req_comp); + if (result == NULL) return result; + } + *x = img_x; + *y = img_y; + if (n) *n = img_n; + } + free(out); out = NULL; + free(expanded); expanded = NULL; + free(idata); idata = NULL; + + return result; +} + +#ifndef STBI_NO_STDIO +unsigned char *stbi_png_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + start_file(f); + return do_png(x,y,comp,req_comp); +} + +unsigned char *stbi_png_load(char *filename, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + FILE *f = fopen(filename, "rb"); + if (!f) return NULL; + data = stbi_png_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return data; +} +#endif + +unsigned char *stbi_png_load_from_memory(unsigned char *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + start_mem(buffer,len); + return do_png(x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +int stbi_png_test_file(FILE *f) +{ + int n,r; + n = ftell(f); + start_file(f); + r = parse_png_file(SCAN_type,STBI_default); + fseek(f,n,SEEK_SET); + return r; +} +#endif + +int stbi_png_test_memory(unsigned char *buffer, int len) +{ + start_mem(buffer, len); + return parse_png_file(SCAN_type,STBI_default); +} + +// TODO: load header from png +#ifndef STBI_NO_STDIO +extern int stbi_png_info (char *filename, int *x, int *y, int *comp); +extern int stbi_png_info_from_file (FILE *f, int *x, int *y, int *comp); +#endif +extern int stbi_png_info_from_memory (stbi_uc *buffer, int len, int *x, int *y, int *comp); + +// Microsoft/Windows BMP image + +static int bmp_test(void) +{ + int sz; + if (get8() != 'B') return 0; + if (get8() != 'M') return 0; + get32le(); // discard filesize + get16le(); // discard reserved + get16le(); // discard reserved + get32le(); // discard data offset + sz = get32le(); + if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1; + return 0; +} + +#ifndef STBI_NO_STDIO +int stbi_bmp_test_file (FILE *f) +{ + int r,n = ftell(f); + start_file(f); + r = bmp_test(); + fseek(f,n,SEEK_SET); + return r; +} +#endif + +int stbi_bmp_test_memory (stbi_uc *buffer, int len) +{ + start_mem(buffer, len); + return bmp_test(); +} + +// returns 0..31 for the highest set bit +static int high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) n += 16, z >>= 16; + if (z >= 0x00100) n += 8, z >>= 8; + if (z >= 0x00010) n += 4, z >>= 4; + if (z >= 0x00004) n += 2, z >>= 2; + if (z >= 0x00002) n += 1, z >>= 1; + return n; +} + +static int bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +static int shiftsigned(int v, int shift, int bits) +{ + int result; + int z=0; + + if (shift < 0) v <<= -shift; + else v >>= shift; + result = v; + + z = bits; + while (z < 8) { + result += v >> z; + z += bits; + } + return result; +} + +static stbi_uc *bmp_load(int *x, int *y, int *comp, int req_comp) +{ + unsigned int mr=0,mg=0,mb=0,ma=0; + stbi_uc pal[256][4]; + int psize=0,i,j,compress=0,width; + int bpp, flip_vertically, pad, target, offset, hsz; + if (get8() != 'B' || get8() != 'M') return ep("not BMP", "Corrupt BMP"); + get32le(); // discard filesize + get16le(); // discard reserved + get16le(); // discard reserved + offset = get32le(); + hsz = get32le(); + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return ep("unknown BMP", "BMP type not supported: unknown"); + failure_reason = "bad BMP"; + if (hsz == 12) { + img_x = get16le(); + img_y = get16le(); + } else { + img_x = get32le(); + img_y = get32le(); + } + if (get16le() != 1) return 0; + bpp = get16le(); + if (bpp == 1) return ep("monochrome", "BMP type not supported: 1-bit"); + flip_vertically = ((int) img_y) > 0; + img_y = abs((int) img_y); + if (hsz == 12) { + if (bpp < 24) + psize = (offset - 14 - 24) / 3; + } else { + compress = get32le(); + if (compress == 1 || compress == 2) return ep("BMP RLE", "BMP type not supported: RLE"); + get32le(); // discard sizeof + get32le(); // discard hres + get32le(); // discard vres + get32le(); // discard colorsused + get32le(); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + get32le(); + get32le(); + get32le(); + get32le(); + } + if (bpp == 16 || bpp == 32) { + mr = mg = mb = 0; + if (compress == 0) { + if (bpp == 32) { + mr = 0xff << 16; + mg = 0xff << 8; + mb = 0xff << 0; + } else { + mr = 31 << 10; + mg = 31 << 5; + mb = 31 << 0; + } + } else if (compress == 3) { + mr = get32le(); + mg = get32le(); + mb = get32le(); + // not documented, but generated by photoshop and handled by mspaint + if (mr == mg && mg == mb) { + // ?!?!? + return NULL; + } + } else + return NULL; + } + } else { + assert(hsz == 108); + mr = get32le(); + mg = get32le(); + mb = get32le(); + ma = get32le(); + get32le(); // discard color space + for (i=0; i < 12; ++i) + get32le(); // discard color space parameters + } + if (bpp < 16) + psize = (offset - 14 - hsz) >> 2; + } + img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = img_n; // if they want monochrome, we'll post-convert + out = (stbi_uc *) malloc(target * img_x * img_y); + if (!out) return ep("outofmem", "Out of memory"); + if (bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) return ep("invalid", "Corrupt BMP"); + for (i=0; i < psize; ++i) { + pal[i][2] = get8(); + pal[i][1] = get8(); + pal[i][0] = get8(); + if (hsz != 12) get8(); + pal[i][3] = 255; + } + skip(offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); + if (bpp == 4) width = (img_x + 1) >> 1; + else if (bpp == 8) width = img_x; + else return ep("bad bpp", "Corrupt BMP"); + pad = (-width)&3; + for (j=0; j < (int) img_y; ++j) { + for (i=0; i < (int) img_x; i += 2) { + int v=get8(),v2=0; + if (bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) img_x) break; + v = (bpp == 8) ? get8() : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + skip(pad); + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + skip(offset - 14 - hsz); + if (bpp == 24) width = 3 * img_x; + else if (bpp == 16) width = 2*img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (bpp == 24) { + easy = 1; + } else if (bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0xff000000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) return ep("bad masks", "Corrupt BMP"); + // right shift amt to put high bit in position #7 + rshift = high_bit(mr)-7; rcount = bitcount(mr); + gshift = high_bit(mg)-7; gcount = bitcount(mr); + bshift = high_bit(mb)-7; bcount = bitcount(mr); + ashift = high_bit(ma)-7; acount = bitcount(mr); + } + for (j=0; j < (int) img_y; ++j) { + if (easy) { + for (i=0; i < (int) img_x; ++i) { + int a; + out[z+2] = get8(); + out[z+1] = get8(); + out[z+0] = get8(); + z += 3; + a = (easy == 2 ? get8() : 255); + if (target == 4) out[z++] = a; + } + } else { + for (i=0; i < (int) img_x; ++i) { + unsigned long v = (bpp == 16 ? get16le() : get32le()); + int a; + out[z++] = shiftsigned(v & mr, rshift, rcount); + out[z++] = shiftsigned(v & mg, gshift, gcount); + out[z++] = shiftsigned(v & mb, bshift, bcount); + a = (ma ? shiftsigned(v & ma, ashift, acount) : 255); + if (target == 4) out[z++] = a; + } + } + skip(pad); + } + } + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) img_y>>1; ++j) { + stbi_uc *p1 = out + j *img_x*target; + stbi_uc *p2 = out + (img_y-1-j)*img_x*target; + for (i=0; i < (int) img_x*target; ++i) { + t = p1[i], p1[i] = p2[i], p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = convert_format(out, target, req_comp); + if (out == NULL) return out; // convert_format frees input on failure + } + + *x = img_x; + *y = img_y; + if (comp) *comp = target; + return out; +} + +#ifndef STBI_NO_STDIO +stbi_uc *stbi_bmp_load (char *filename, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *data; + FILE *f = fopen(filename, "rb"); + if (!f) return NULL; + data = stbi_bmp_load_from_file(f, x,y,comp,req_comp); + fclose(f); + return data; +} + +stbi_uc *stbi_bmp_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp) +{ + start_file(f); + return bmp_load(x,y,comp,req_comp); +} +#endif + +stbi_uc *stbi_bmp_load_from_memory (stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + start_mem(buffer, len); + return bmp_load(x,y,comp,req_comp); +} + +// Targa Truevision - TGA +// by Jonathan Dummer + +static int tga_test(void) +{ + int sz; + get8u(); // discard Offset + sz = get8u(); // color type + if( sz > 1 ) return 0; // only RGB or indexed allowed + sz = get8u(); // image type + if( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE + get16(); // discard palette start + get16(); // discard palette length + get8(); // discard bits per palette color entry + get16(); // discard x origin + get16(); // discard y origin + if( get16() < 1 ) return 0; // test width + if( get16() < 1 ) return 0; // test height + sz = get8(); // bits per pixel + if( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0; // only RGB or RGBA or grey allowed + return 1; // seems to have passed everything +} + +#ifndef STBI_NO_STDIO +int stbi_tga_test_file (FILE *f) +{ + int r,n = ftell(f); + start_file(f); + r = tga_test(); + fseek(f,n,SEEK_SET); + return r; +} +#endif + +int stbi_tga_test_memory (stbi_uc *buffer, int len) +{ + start_mem(buffer, len); + return tga_test(); +} + +static stbi_uc *tga_load(int *x, int *y, int *comp, int req_comp) +{ + // read in the TGA header stuff + int tga_offset = get8u(); + int tga_indexed = get8u(); + int tga_image_type = get8u(); + int tga_is_RLE = 0; + int tga_palette_start = get16le(); + int tga_palette_len = get16le(); + int tga_palette_bits = get8u(); + int tga_x_origin = get16le(); + int tga_y_origin = get16le(); + int tga_width = get16le(); + int tga_height = get16le(); + int tga_bits_per_pixel = get8u(); + int tga_inverted = get8u(); + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4]; + unsigned char trans_data[] = { 0, 0, 0, 0 }; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + // do a tiny bit of precessing + if( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + /* int tga_alpha_bits = tga_inverted & 15; */ + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // error check + if( //(tga_indexed) || + (tga_width < 1) || (tga_height < 1) || + (tga_image_type < 1) || (tga_image_type > 3) || + ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && + (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) + ) + { + return NULL; + } + + // If I'm paletted, then I'll use the number of bits from the palette + if( tga_indexed ) + { + tga_bits_per_pixel = tga_palette_bits; + } + + // tga info + *x = tga_width; + *y = tga_height; + if( (req_comp < 1) || (req_comp > 4) ) + { + // just use whatever the file was + req_comp = tga_bits_per_pixel / 8; + *comp = req_comp; + } else + { + // force a new number of components + *comp = req_comp; + } + tga_data = (unsigned char*)malloc( tga_width * tga_height * req_comp ); + + // skip to the data's starting position (offset usually = 0) + skip( tga_offset ); + // do I need to load a palette? + if( tga_indexed ) + { + // any data to skip? (offset usually = 0) + skip( tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 ); + getn( tga_palette, tga_palette_len * tga_palette_bits / 8 ); + } + // load the data + for( i = 0; i < tga_width * tga_height; ++i ) + { + // if I'm in RLE mode, do I need to get a RLE chunk? + if( tga_is_RLE ) + { + if( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = get8u(); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if( read_next_pixel ) + { + // load however much data we did have + if( tga_indexed ) + { + // read in 1 byte, then perform the lookup + int pal_idx = get8u(); + if( pal_idx >= tga_palette_len ) + { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_bits_per_pixel / 8; + for( j = 0; j*8 < tga_bits_per_pixel; ++j ) + { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else + { + // read in the data raw + for( j = 0; j*8 < tga_bits_per_pixel; ++j ) + { + raw_data[j] = get8u(); + } + } + // convert raw to the intermediate format + switch( tga_bits_per_pixel ) + { + case 8: + // Luminous => RGBA + trans_data[0] = raw_data[0]; + trans_data[1] = raw_data[0]; + trans_data[2] = raw_data[0]; + trans_data[3] = 255; + break; + case 16: + // Luminous,Alpha => RGBA + trans_data[0] = raw_data[0]; + trans_data[1] = raw_data[0]; + trans_data[2] = raw_data[0]; + trans_data[3] = raw_data[1]; + break; + case 24: + // BGR => RGBA + trans_data[0] = raw_data[2]; + trans_data[1] = raw_data[1]; + trans_data[2] = raw_data[0]; + trans_data[3] = 255; + break; + case 32: + // BGRA => RGBA + trans_data[0] = raw_data[2]; + trans_data[1] = raw_data[1]; + trans_data[2] = raw_data[0]; + trans_data[3] = raw_data[3]; + break; + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + // convert to final format + switch( req_comp ) + { + case 1: + // RGBA => Luminous + tga_data[i*req_comp+0] = (trans_data[0] + trans_data[1] + trans_data[2]) / 3; + break; + case 2: + // RGBA => Luminous,Alpha + tga_data[i*req_comp+0] = (trans_data[0] + trans_data[1] + trans_data[2]) / 3; + tga_data[i*req_comp+1] = trans_data[3]; + break; + case 3: + // RGBA => RGB + tga_data[i*req_comp+0] = trans_data[0]; + tga_data[i*req_comp+1] = trans_data[1]; + tga_data[i*req_comp+2] = trans_data[2]; + break; + case 4: + // RGBA => RGBA + tga_data[i*req_comp+0] = trans_data[0]; + tga_data[i*req_comp+1] = trans_data[1]; + tga_data[i*req_comp+2] = trans_data[2]; + tga_data[i*req_comp+3] = trans_data[3]; + break; + } + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if( tga_inverted ) + { + for( j = 0; j*2 < tga_height; ++j ) + { + int index1 = j * tga_width * req_comp; + int index2 = (tga_height - 1 - j) * tga_width * req_comp; + for( i = tga_width * req_comp; i > 0; --i ) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if( tga_palette != NULL ) + { + free( tga_palette ); + } + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + // OK, done + return tga_data; +} + +#ifndef STBI_NO_STDIO +stbi_uc *stbi_tga_load (char *filename, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *data; + FILE *f = fopen(filename, "rb"); + if (!f) return NULL; + data = stbi_tga_load_from_file(f, x,y,comp,req_comp); + fclose(f); + return data; +} + +stbi_uc *stbi_tga_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp) +{ + start_file(f); + return tga_load(x,y,comp,req_comp); +} +#endif + +stbi_uc *stbi_tga_load_from_memory (stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + start_mem(buffer, len); + return tga_load(x,y,comp,req_comp); +} + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int hdr_test(void) +{ + char *signature = "#?RADIANCE\n"; + int i; + for (i=0; signature[i]; ++i) + if (get8() != signature[i]) + return 0; + return 1; +} + +int stbi_hdr_test_memory(stbi_uc *buffer, int len) +{ + start_mem(buffer, len); + return hdr_test(); +} + +#ifndef STBI_NO_STDIO +int stbi_hdr_test_file(FILE *f) +{ + int r,n = ftell(f); + start_file(f); + r = hdr_test(); + fseek(f,n,SEEK_SET); + return r; +} +#endif + +#define HDR_BUFLEN 1024 +static char *hdr_gettoken(char *buffer) +{ + int len=0; + /*char *s = buffer, */ + char c = '\0'; + + c = get8(); + + while (!at_eof() && c != '\n') { + buffer[len++] = c; + if (len == HDR_BUFLEN-1) { + // flush to end of line + while (!at_eof() && get8() != '\n') + ; + break; + } + c = get8(); + } + + buffer[len] = 0; + return buffer; +} + +static void hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 255; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 255; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + + +static float *hdr_load(int *x, int *y, int *comp, int req_comp) +{ + char buffer[HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + + + // Check identifier + if (strcmp(hdr_gettoken(buffer), "#?RADIANCE") != 0) + return ep("not HDR", "Corrupt HDR image"); + + // Parse header + while(1) { + token = hdr_gettoken(buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return ep("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = hdr_gettoken(buffer); + if (strncmp(token, "-Y ", 3)) return ep("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return ep("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = strtol(token, NULL, 10); + + *x = width; + *y = height; + + *comp = 3; + if (req_comp == 0) req_comp = 3; + + // Read data + hdr_data = (float *) malloc(height * width * req_comp * sizeof(float)); + + // Load image data + // image data is stored as some number of sca + if( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + getn(rgbe, 4); + hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = get8(); + c2 = get8(); + len = get8(); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4] = { c1,c2,len, get8() }; + hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + free(scanline); + goto main_decode_loop; // yes, this is fucking insane; blame the fucking insane format + } + len <<= 8; + len |= get8(); + if (len != width) { free(hdr_data); free(scanline); return ep("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4); + + for (k = 0; k < 4; ++k) { + i = 0; + while (i < width) { + count = get8(); + if (count > 128) { + // Run + value = get8(); + count -= 128; + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = get8(); + } + } + } + for (i=0; i < width; ++i) + hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + free(scanline); + } + + return hdr_data; +} + +#ifndef STBI_NO_STDIO +float *stbi_hdr_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + start_file(f); + return hdr_load(x,y,comp,req_comp); +} +#endif + +float *stbi_hdr_load_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + start_mem(buffer, len); + return hdr_load(x,y,comp,req_comp); +} + +#endif // STBI_NO_HDR + +/////////////////////// write image /////////////////////// + +#ifndef STBI_NO_WRITE + +static void write8(FILE *f, int x) { uint8 z = (uint8) x; fwrite(&z,1,1,f); } + +static void writefv(FILE *f, char *fmt, va_list v) +{ + while (*fmt) { + switch (*fmt++) { + case ' ': break; + case '1': { uint8 x = va_arg(v, int); write8(f,x); break; } + case '2': { int16 x = va_arg(v, int); write8(f,x); write8(f,x>>8); break; } + case '4': { int32 x = va_arg(v, int); write8(f,x); write8(f,x>>8); write8(f,x>>16); write8(f,x>>24); break; } + default: + assert(0); + va_end(v); + return; + } + } +} + +static void writef(FILE *f, char *fmt, ...) +{ + va_list v; + va_start(v, fmt); + writefv(f,fmt,v); + va_end(v); +} + +static void write_pixels(FILE *f, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad) +{ + uint8 bg[3] = { 255, 0, 255}, px[3]; + uint32 zero = 0; + int i,j,k, j_end; + + if (vdir < 0) + j_end = -1, j = y-1; + else + j_end = y, j = 0; + + for (; j != j_end; j += vdir) { + for (i=0; i < x; ++i) { + uint8 *d = (uint8 *) data + (j*x+i)*comp; + if (write_alpha < 0) + fwrite(&d[comp-1], 1, 1, f); + switch (comp) { + case 1: + case 2: writef(f, "111", d[0],d[0],d[0]); + break; + case 4: + if (!write_alpha) { + for (k=0; k < 3; ++k) + px[k] = bg[k] + ((d[k] - bg[k]) * d[3])/255; + writef(f, "111", px[1-rgb_dir],px[1],px[1+rgb_dir]); + break; + } + /* FALLTHROUGH */ + case 3: + writef(f, "111", d[1-rgb_dir],d[1],d[1+rgb_dir]); + break; + } + if (write_alpha > 0) + fwrite(&d[comp-1], 1, 1, f); + } + fwrite(&zero,scanline_pad,1,f); + } +} + +static int outfile(char *filename, int rgb_dir, int vdir, int x, int y, int comp, void *data, int alpha, int pad, char *fmt, ...) +{ + FILE *f = fopen(filename, "wb"); + if (f) { + va_list v; + va_start(v, fmt); + writefv(f, fmt, v); + va_end(v); + write_pixels(f,rgb_dir,vdir,x,y,comp,data,alpha,pad); + fclose(f); + } + return f != NULL; +} + +int stbi_write_bmp(char *filename, int x, int y, int comp, void *data) +{ + int pad = (-x*3) & 3; + return outfile(filename,-1,-1,x,y,comp,data,0,pad, + "11 4 22 4" "4 44 22 444444", + 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header + 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header +} + +int stbi_write_tga(char *filename, int x, int y, int comp, void *data) +{ + int has_alpha = !(comp & 1); + return outfile(filename, -1,-1, x, y, comp, data, has_alpha, 0, + "111 221 2222 11", 0,0,2, 0,0,0, 0,0,x,y, 24+8*has_alpha, 8*has_alpha); +} + +// any other image formats that do interleaved rgb data? +// PNG: requires adler32,crc32 -- significant amount of code +// PSD: no, channels output separately +// TIFF: no, stripwise-interleaved... i think + +#endif /* STBI_NO_WRITE */ + +// add in my DDS loading support +#ifndef STBI_NO_DDS +#include "stbi_DDS_aug_c.h" +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/stb_image_aug.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/stb_image_aug.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/stb_image_aug.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/stb_image_aug.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,313 @@ +/* stbi-1.03 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c + when you control the images you're loading + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline (no JPEG progressive, no oddball channel decimations) + PNG non-interlaced + BMP non-1bpp, non-RLE + TGA (not sure what subset, if a subset) + HDR (radiance rgbE format) + writes BMP,TGA (define STBI_NO_WRITE to remove code) + decoded from memory or through stdio FILE (define STBI_NO_STDIO to remove code) + + TODO: + stbi_info_* + PSD loader + + history: + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less + than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant +*/ + +#ifndef HEADER_STB_IMAGE_AUGMENTED +#define HEADER_STB_IMAGE_AUGMENTED + +//// begin header file //////////////////////////////////////////////////// +// +// Limitations: +// - no progressive/interlaced support (jpeg, png) +// - 8-bit samples only (jpeg, png) +// - not threadsafe +// - channel subsampling of at most 2 in each dimension (jpeg) +// - no delayed line count (jpeg) -- IJG doesn't support either +// +// Basic usage (see HDR discussion below): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// stbi_image_free(data) +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *comp -- outputs # of image components in image file +// int req_comp -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. +// If req_comp is non-zero, *comp has the number of components that _would_ +// have been output otherwise. E.g. if you set req_comp to 4, you will always +// get RGBA output, but you can check *comp to easily see if it's opaque. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *comp will be unchanged. The function stbi_failure_reason() +// can be queried for an extremely brief, end-user unfriendly explanation +// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid +// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG and BMP images are automatically depalettized. +// +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image now supports loading HDR images in general, and currently +// the Radiance .HDR file format, although the support is provided +// generically. You can still load any file through the existing interface; +// if you attempt to load an HDR file, it will be automatically remapped to +// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); + + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_NO_HDR +#include // ldexp +#include // strcmp +#endif + +enum +{ + STBI_default = 0, // only used for req_comp + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4, +}; + +typedef unsigned char stbi_uc; + +#ifdef __cplusplus +extern "C" { +#endif + +// WRITING API + +#if !defined(STBI_NO_WRITE) && !defined(STBI_NO_STDIO) +// write a BMP/TGA file given tightly packed 'comp' channels (no padding, nor bmp-stride-padding) +// (you must include the appropriate extension in the filename). +// returns TRUE on success, FALSE if couldn't open file, error writing file +extern int stbi_write_bmp (char *filename, int x, int y, int comp, void *data); +extern int stbi_write_tga (char *filename, int x, int y, int comp, void *data); +#endif + +// PRIMARY API - works on images of any type + +// load image by filename, open file, or memory buffer +#ifndef STBI_NO_STDIO +extern stbi_uc *stbi_load (char *filename, int *x, int *y, int *comp, int req_comp); +extern stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +#endif +extern stbi_uc *stbi_load_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp); +// for stbi_load_from_file, file pointer is left pointing immediately after image + +#ifndef STBI_NO_HDR +#ifndef STBI_NO_STDIO +extern float *stbi_loadf (char *filename, int *x, int *y, int *comp, int req_comp); +extern float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +#endif +extern float *stbi_loadf_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp); + +extern void stbi_hdr_to_ldr_gamma(float gamma); +extern void stbi_hdr_to_ldr_scale(float scale); + +extern void stbi_ldr_to_hdr_gamma(float gamma); +extern void stbi_ldr_to_hdr_scale(float scale); + +#endif // STBI_NO_HDR + +// get a VERY brief reason for failure +extern char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +extern void stbi_image_free (stbi_uc *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +extern int stbi_info_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp); +extern int stbi_is_hdr_from_memory(stbi_uc *buffer, int len); +#ifndef STBI_NO_STDIO +extern int stbi_info (char *filename, int *x, int *y, int *comp); +extern int stbi_is_hdr (char *filename); +extern int stbi_is_hdr_from_file(FILE *f); +#endif + +// ZLIB client - used by PNG, available for other purposes + +extern char *stbi_zlib_decode_malloc_guesssize(int initial_size, int *outlen); +extern char *stbi_zlib_decode_malloc(char *buffer, int len, int *outlen); +extern int stbi_zlib_decode_buffer(char *obuffer, int olen, char *ibuffer, int ilen); + +extern char *stbi_zlib_decode_noheader_malloc(char *buffer, int len, int *outlen); +extern int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, char *ibuffer, int ilen); + + +// TYPE-SPECIFIC ACCESS + +// is it a jpeg? +extern int stbi_jpeg_test_memory (stbi_uc *buffer, int len); +extern stbi_uc *stbi_jpeg_load_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp); +extern int stbi_jpeg_info_from_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp); + +#ifndef STBI_NO_STDIO +extern stbi_uc *stbi_jpeg_load (char *filename, int *x, int *y, int *comp, int req_comp); +extern int stbi_jpeg_test_file (FILE *f); +extern stbi_uc *stbi_jpeg_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); + +extern int stbi_jpeg_info (char *filename, int *x, int *y, int *comp); +extern int stbi_jpeg_info_from_file (FILE *f, int *x, int *y, int *comp); +#endif + +extern int stbi_jpeg_dc_only; // only decode DC component + +// is it a png? +extern int stbi_png_test_memory (stbi_uc *buffer, int len); +extern stbi_uc *stbi_png_load_from_memory (stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp); +extern int stbi_png_info_from_memory (stbi_uc *buffer, int len, int *x, int *y, int *comp); + +#ifndef STBI_NO_STDIO +extern stbi_uc *stbi_png_load (char *filename, int *x, int *y, int *comp, int req_comp); +extern int stbi_png_info (char *filename, int *x, int *y, int *comp); +extern int stbi_png_test_file (FILE *f); +extern stbi_uc *stbi_png_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +extern int stbi_png_info_from_file (FILE *f, int *x, int *y, int *comp); +#endif + +// is it a bmp? +extern int stbi_bmp_test_memory (stbi_uc *buffer, int len); + +extern stbi_uc *stbi_bmp_load (char *filename, int *x, int *y, int *comp, int req_comp); +extern stbi_uc *stbi_bmp_load_from_memory (stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp); +#ifndef STBI_NO_STDIO +extern int stbi_bmp_test_file (FILE *f); +extern stbi_uc *stbi_bmp_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +#endif + +// is it a tga? +extern int stbi_tga_test_memory (stbi_uc *buffer, int len); + +extern stbi_uc *stbi_tga_load (char *filename, int *x, int *y, int *comp, int req_comp); +extern stbi_uc *stbi_tga_load_from_memory (stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp); +#ifndef STBI_NO_STDIO +extern int stbi_tga_test_file (FILE *f); +extern stbi_uc *stbi_tga_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +#endif + +// is it an hdr? +extern int stbi_hdr_test_memory (stbi_uc *buffer, int len); + +extern float * stbi_hdr_load (char *filename, int *x, int *y, int *comp, int req_comp); +extern float * stbi_hdr_load_from_memory (stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp); +#ifndef STBI_NO_STDIO +extern int stbi_hdr_test_file (FILE *f); +extern float * stbi_hdr_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +#endif + +// define new loaders +typedef struct +{ + int (*test_memory)(stbi_uc *buffer, int len); + stbi_uc * (*load_from_memory)(stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp); + #ifndef STBI_NO_STDIO + int (*test_file)(FILE *f); + stbi_uc * (*load_from_file)(FILE *f, int *x, int *y, int *comp, int req_comp); + #endif +} stbi_loader; + +// register a loader by filling out the above structure (you must defined ALL functions) +// returns 1 if added or already added, 0 if not added (too many loaders) +extern int stbi_register_loader(stbi_loader *loader); + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/TextureManager.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/TextureManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/TextureManager.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/TextureManager.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,158 @@ +#include "TextureManager.hpp" +#include "CustomShape.hpp" +#include "Common.hpp" +#include "IdleTextures.hpp" + + + +TextureManager::TextureManager(const std::string _presetURL): presetURL(_presetURL) +{ +#ifdef USE_DEVIL +ilInit(); +iluInit(); +ilutInit(); +ilutRenderer(ILUT_OPENGL); +#endif + + Preload(); +} + +TextureManager::~TextureManager() +{ + Clear(); +} + +void TextureManager::Preload() +{ + +#ifdef USE_DEVIL + ILuint image; + ilGenImages(1, &image); + ilBindImage(image); + ilLoadL(IL_TYPE_UNKNOWN,(ILvoid*) M_data, M_bytes); + GLuint tex = ilutGLBindTexImage(); +#else + GLuint tex = SOIL_load_OGL_texture_from_memory( + M_data, + M_bytes, + SOIL_LOAD_AUTO, + SOIL_CREATE_NEW_ID, + + SOIL_FLAG_POWER_OF_TWO + | SOIL_FLAG_MULTIPLY_ALPHA + | SOIL_FLAG_COMPRESS_TO_DXT + ); +#endif + + textures["M.tga"]=tex; + +#ifdef USE_DEVIL + ilLoadL(IL_TYPE_UNKNOWN,(ILvoid*) project_data,project_bytes); + tex = ilutGLBindTexImage(); +#else + tex = SOIL_load_OGL_texture_from_memory( + project_data, + project_bytes, + SOIL_LOAD_AUTO, + SOIL_CREATE_NEW_ID, + + SOIL_FLAG_POWER_OF_TWO + | SOIL_FLAG_MULTIPLY_ALPHA + | SOIL_FLAG_COMPRESS_TO_DXT + ); +#endif + + textures["project.tga"]=tex; + +#ifdef USE_DEVIL + ilLoadL(IL_TYPE_UNKNOWN,(ILvoid*) headphones_data, headphones_bytes); + tex = ilutGLBindTexImage(); +#else + tex = SOIL_load_OGL_texture_from_memory( + headphones_data, + headphones_bytes, + SOIL_LOAD_AUTO, + SOIL_CREATE_NEW_ID, + + SOIL_FLAG_POWER_OF_TWO + | SOIL_FLAG_MULTIPLY_ALPHA + | SOIL_FLAG_COMPRESS_TO_DXT + ); +#endif + + textures["headphones.tga"]=tex; +} + +void TextureManager::Clear() +{ + + + for(std::map::const_iterator iter = textures.begin(); iter != textures.end(); iter++) + { + glDeleteTextures(1,&iter->second); + } + textures.clear(); +} + + +void TextureManager::unloadTextures(const PresetOutputs::cshape_container &shapes) +{ + /* + for (PresetOutputs::cshape_container::const_iterator pos = shapes.begin(); + pos != shapes.end(); ++pos) + { + + if( (*pos)->enabled==1) + { + + if ( (*pos)->textured) + { + std::string imageUrl = (*pos)->getImageUrl(); + if (imageUrl != "") + { + std::string fullUrl = presetURL + "/" + imageUrl; + ReleaseTexture(LoadTexture(fullUrl.c_str())); + } + } + } + } + */ +} + + +GLuint TextureManager::getTexture(const std::string imageURL) +{ + + if (textures.find(imageURL)!= textures.end()) + { + return textures[imageURL]; + } + else + { + std::string fullURL = presetURL + PATH_SEPARATOR + imageURL; +#ifdef USE_DEVIL + GLuint tex = ilutGLLoadImage((char *)fullURL.c_str()); +#else + GLuint tex = SOIL_load_OGL_texture( + fullURL.c_str(), + SOIL_LOAD_AUTO, + SOIL_CREATE_NEW_ID, + + SOIL_FLAG_POWER_OF_TWO + // SOIL_FLAG_MIPMAPS + | SOIL_FLAG_MULTIPLY_ALPHA + | SOIL_FLAG_COMPRESS_TO_DXT + //| SOIL_FLAG_DDS_LOAD_DIRECT + ); +#endif + textures[imageURL]=tex; + return tex; + + + } +} + +unsigned int TextureManager::getTextureMemorySize() +{ + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/TextureManager.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/TextureManager.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/TextureManager.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/TextureManager.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,40 @@ +#ifndef TextureManager_HPP +#define TextureManager_HPP + +#include "PresetFrameIO.hpp" +#ifdef LINUX +#include +#endif +#ifdef WIN32 +#include "glew.h" +#endif + +#ifdef __APPLE__ +#include +#endif + +#ifdef USE_DEVIL +#include +#else +#include "SOIL.h" +#endif + +#include +#include +#include + +class TextureManager +{ + std::string presetURL; + std::map textures; +public: + ~TextureManager(); + TextureManager(std::string _presetURL); + void unloadTextures(const PresetOutputs::cshape_container &shapes); + void Clear(); + void Preload(); + GLuint getTexture(std::string imageUrl); + unsigned int getTextureMemorySize(); +}; + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/TimeKeeper.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/TimeKeeper.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/TimeKeeper.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/TimeKeeper.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,133 @@ +#ifndef WIN32 +#include +#else +#endif /** !WIN32 */ +#include +#include "TimeKeeper.hpp" +#include "RandomNumberGenerators.hpp" +#include "SectionLock.h" + +TimeKeeper::TimeKeeper(double presetDuration, double smoothDuration, double easterEgg) + { + _smoothDuration = smoothDuration; + _presetDuration = presetDuration; + _easterEgg = easterEgg; +#ifdef _USE_THREADS + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&_tk_lock, &attr); + pthread_mutexattr_destroy(&attr); +#endif + +#ifndef WIN32 + gettimeofday ( &this->startTime, NULL ); +#else + startTime = GetTickCount(); +#endif /** !WIN32 */ + + UpdateTimers(); + } + + TimeKeeper::~TimeKeeper() + { +#ifdef _USE_THREADS + pthread_mutex_destroy(&_tk_lock); +#endif + } + + void TimeKeeper::UpdateTimers() + { + CSectionLock lock(&_tk_lock); +#ifndef WIN32 + _currentTime = getTicks ( &startTime ) * 0.001; +#else + _currentTime = getTicks ( startTime ) * 0.001; +#endif /** !WIN32 */ + + _presetFrameA++; + _presetFrameB++; + + } + + void TimeKeeper::StartPreset() + { + CSectionLock lock(&_tk_lock); + _isSmoothing = false; + _presetTimeA = _currentTime; + _presetFrameA = 1; + _presetDurationA = sampledPresetDuration(); + } + void TimeKeeper::StartSmoothing() + { + CSectionLock lock(&_tk_lock); + _isSmoothing = true; + _presetTimeB = _currentTime; + _presetFrameB = 1; + _presetDurationB = sampledPresetDuration(); + } + void TimeKeeper::EndSmoothing() + { + CSectionLock lock(&_tk_lock); + _isSmoothing = false; + _presetTimeA = _presetTimeB; + _presetFrameA = _presetFrameB; + _presetDurationA = _presetDurationB; + } + + bool TimeKeeper::CanHardCut() + { + CSectionLock lock(&_tk_lock); + return ((_currentTime - _presetTimeA) > HARD_CUT_DELAY); + } + + double TimeKeeper::SmoothRatio() + { + CSectionLock lock(&_tk_lock); + return (_currentTime - _presetTimeB) / _smoothDuration; + } + bool TimeKeeper::IsSmoothing() + { + CSectionLock lock(&_tk_lock); + return _isSmoothing; + } + + double TimeKeeper::GetRunningTime() + { + CSectionLock lock(&_tk_lock); + return _currentTime; + } + + double TimeKeeper::PresetProgressA() + { + CSectionLock lock(&_tk_lock); + if (_isSmoothing) return 1.0; + else return (_currentTime - _presetTimeA) / _presetDurationA; + } + double TimeKeeper::PresetProgressB() + { + CSectionLock lock(&_tk_lock); + return (_currentTime - _presetTimeB) / _presetDurationB; + } + +int TimeKeeper::PresetFrameB() + { + CSectionLock lock(&_tk_lock); + return _presetFrameB; + } + +int TimeKeeper::PresetFrameA() + { + CSectionLock lock(&_tk_lock); + return _presetFrameA; + } + +double TimeKeeper::sampledPresetDuration() { + CSectionLock lock(&_tk_lock); +#ifdef WIN32 + return _presetDuration; +#else + return fmax(1, fmin(60, RandomNumberGenerators::gaussian + (_presetDuration, _easterEgg))); +#endif +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/TimeKeeper.hpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/TimeKeeper.hpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/TimeKeeper.hpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/TimeKeeper.hpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,68 @@ +#ifndef TimeKeeper_HPP +#define TimeKeeper_HPP + +#ifndef WIN32 +#include +#endif + +#include "timer.h" +#include + +#define HARD_CUT_DELAY 3 + +class TimeKeeper +{ + +public: + + TimeKeeper(double presetDuration, double smoothDuration, double easterEgg); + ~TimeKeeper(); + + void UpdateTimers(); + + void StartPreset(); + void StartSmoothing(); + void EndSmoothing(); + + bool CanHardCut(); + + double SmoothRatio(); + bool IsSmoothing(); + + double GetRunningTime(); + + double PresetProgressA(); + double PresetProgressB(); + + int PresetFrameA(); + int PresetFrameB(); + + double sampledPresetDuration(); + +#ifndef WIN32 + /* The first ticks value of the application */ + struct timeval startTime; +#else + long startTime; +#endif /** !WIN32 */ + +private: + + double _easterEgg; + double _presetDuration; + double _presetDurationA; + double _presetDurationB; + double _smoothDuration; + + double _currentTime; + double _presetTimeA; + double _presetTimeB; + int _presetFrameA; + int _presetFrameB; + + bool _isSmoothing; + + pthread_mutex_t _tk_lock; + +}; +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/timer.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/timer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/timer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/timer.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,49 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: timer.c,v 1.1.1.1 2005/12/23 18:05:05 psperl Exp $ + * + * Platform-independent timer + */ + +#include "timer.h" +#include + +#ifndef WIN32 +/** Get number of ticks since the given timestamp */ +unsigned int getTicks( struct timeval *start ) { + struct timeval now; + unsigned int ticks; + + gettimeofday(&now, NULL); + ticks=(now.tv_sec-start->tv_sec)*1000+(now.tv_usec-start->tv_usec)/1000; + return(ticks); + } + +#else +unsigned int getTicks( long start ) { + return GetTickCount() - start; + } + +#endif /** !WIN32 */ + + + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/timer.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/timer.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/timer.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/timer.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,51 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: timer.h,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $ + * + * Platform-independent timer + * + * $Log: timer.h,v $ + * Revision 1.1.1.1 2005/12/23 18:05:00 psperl + * Imported + * + * Revision 1.2 2004/10/05 09:19:40 cvs + * Fixed header include defines + * + * Revision 1.1.1.1 2004/10/04 12:56:00 cvs + * Imported + * + */ + +#ifndef _TIMER_H +#define _TIMER_H + +#ifndef WIN32 +#include +unsigned int getTicks( struct timeval *start ); +struct timeval GetCurrentTime(); +#else +#include +unsigned int getTicks( long start ); + +#endif /** !WIN32 */ + +#endif /** _TIMER_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/win32-dirent.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/win32-dirent.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/win32-dirent.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/win32-dirent.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,231 @@ +/* + + Implementation of POSIX directory browsing functions and types for Win32. + + Author: Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com) + History: Created March 1997. Updated June 2003. + Rights: See end of file. + +*/ + +#include "win32-dirent.h" +#include +#include /* _findfirst and _findnext set errno iff they return -1 */ +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +struct DIR +{ + long handle; /* -1 for failed rewind */ + struct _finddata_t info; + struct dirent result; /* d_name null iff first time */ + char *name; /* null-terminated char string */ +}; + +DIR *opendir(const char *name) +{ + DIR *dir = 0; + + if(name && name[0]) + { + size_t base_length = strlen(name); + const char *all = /* search pattern must end with suitable wildcard */ + strchr("/\\", name[base_length - 1]) ? "" : "/"; + + if((dir = (DIR *) malloc(sizeof *dir)) != 0 && + (dir->name = (char *) malloc(base_length + strlen(all) + 1)) != 0) + { + strcat(strcpy(dir->name, name), all); + + if((dir->handle = (long) _findfirst(dir->name, &dir->info)) != -1) + { + dir->result.d_name = 0; + } + else /* rollback */ + { + free(dir->name); + free(dir); + dir = 0; + } + } + else /* rollback */ + { + free(dir); + dir = 0; + errno = ENOMEM; + } + } + else + { + errno = EINVAL; + } + + return dir; +} + +int closedir(DIR *dir) +{ + int result = -1; + + if(dir) + { + if(dir->handle != -1) + { + result = _findclose(dir->handle); + } + + free(dir->name); + free(dir); + } + + if(result == -1) /* map all errors to EBADF */ + { + errno = EBADF; + } + + return result; +} + +struct dirent *readdir(DIR *dir) +{ + struct dirent *result = 0; + + if(dir && dir->handle != -1) + { + if(!dir->result.d_name || _findnext(dir->handle, &dir->info) != -1) + { + result = &dir->result; + result->d_name = dir->info.name; + } + } + else + { + errno = EBADF; + } + + return result; +} + +void rewinddir(DIR *dir) +{ + if(dir && dir->handle != -1) + { + _findclose(dir->handle); + dir->handle = (long) _findfirst(dir->name, &dir->info); + dir->result.d_name = 0; + } + else + { + errno = EBADF; + } +} + +// helper for scandir below +static void scandir_free_dir_entries(struct dirent*** namelist, int entries) { + int i; + if (!*namelist) return; + for (i = 0; i < entries; ++i) { + free((*namelist)[i]); + } + free(*namelist); + *namelist = 0; +} + +// returns the number of directory entries select or -1 if an error occurs +int scandir( + const char* dir, + struct dirent*** namelist, + int(*filter)(const struct dirent*), + int(*compar)(const void*, const void*) +) { + int entries = 0; + int max_entries = 1024; // assume 2*512 = 1024 entries (used for allocation) + DIR* d; + + *namelist = 0; + + // open directory + d = opendir(dir); + if (!d) return -1; + + // iterate + while (1) { + struct dirent* ent = readdir(d); + if (!ent) break; + + // add if no filter or filter returns non-zero + if (filter && (0 == filter(ent))) continue; + + // resize our buffer if there is not enough room + if (!*namelist || entries >= max_entries) { + struct dirent** new_entries; + + max_entries *= 2; + new_entries = (struct dirent **)realloc(*namelist, max_entries); + if (!new_entries) { + scandir_free_dir_entries(namelist, entries); + closedir(d); + errno = ENOMEM; + return -1; + } + + *namelist = new_entries; + } + + // allocate new entry + (*namelist)[entries] = (struct dirent *)malloc(sizeof(struct dirent) + strlen(ent->d_name) + 1); + if (!(*namelist)[entries]) { + scandir_free_dir_entries(namelist, entries); + closedir(d); + errno = ENOMEM; + return -1; + } + + // copy entry info + *(*namelist)[entries] = *ent; + + // and then we tack the string onto the end + { + char* dest = (char*)((*namelist)[entries]) + sizeof(struct dirent); + strcpy(dest, ent->d_name); + (*namelist)[entries]->d_name = dest; + } + + ++entries; + } + + // sort + if (*namelist && compar) qsort(*namelist, entries, sizeof((*namelist)[0]), compar); + + return entries; +} + +int alphasort(const void* lhs, const void* rhs) { + const struct dirent* lhs_ent = *(struct dirent**)lhs; + const struct dirent* rhs_ent = *(struct dirent**)rhs; + return _strcmpi(lhs_ent->d_name, rhs_ent->d_name); +} + +#ifdef __cplusplus +} +#endif + +/* + + Copyright Kevlin Henney, 1997, 2003. All rights reserved. + + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose is hereby granted without fee, provided + that this copyright and permissions notice appear in all copies and + derivatives. + + This software is supplied "as is" without express or implied warranty. + + But that said, if there are any problems please get in touch. + +*/ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/win32-dirent.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/win32-dirent.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/win32-dirent.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/win32-dirent.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,61 @@ + +#ifndef DIRENT_INCLUDED +#define DIRENT_INCLUDED + +/* + + Declaration of POSIX directory browsing functions and types for Win32. + + Author: Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com) + History: Created March 1997. Updated June 2003. + Rights: See end of file. + +*/ + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef struct DIR DIR; + +#ifndef WIN32 +static int errno; +#endif + +struct dirent +{ + char *d_name; +}; + +DIR *opendir(const char *); +int closedir(DIR *); +struct dirent *readdir(DIR *); +void rewinddir(DIR *); +int scandir( + const char* dir, + struct dirent*** namelist, + int(*filter)(const struct dirent*), + int(*compar)(const void*, const void*) ); +int alphasort(const void* lhs, const void* rhs); + +/* + + Copyright Kevlin Henney, 1997, 2003. All rights reserved. + + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose is hereby granted without fee, provided + that this copyright and permissions notice appear in all copies and + derivatives. + + This software is supplied "as is" without express or implied warranty. + + But that said, if there are any problems please get in touch. + +*/ + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/wipemalloc.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/wipemalloc.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/wipemalloc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/wipemalloc.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,44 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2004 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: wipemalloc.c,v 1.1.1.1 2005/12/23 18:05:05 psperl Exp $ + * + * Clean memory allocator + */ + +#include "wipemalloc.h" + + void *wipemalloc( size_t count ) { + void *mem = malloc( count ); + if ( mem != NULL ) { + memset( mem, 0, count ); + } else { + printf( "wipemalloc() failed to allocate %d bytes\n", (int)count ); + } + return mem; + } + +/** Safe memory deallocator */ + void wipefree( void *ptr ) { + if ( ptr != NULL ) { + free( ptr ); + } + } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/wipemalloc.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/wipemalloc.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/libprojectM/wipemalloc.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/libprojectM/wipemalloc.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,60 @@ +/** + * projectM -- Milkdrop-esque visualisation SDK + * Copyright (C)2003-2007 projectM Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * See 'LICENSE.txt' included within this release + * + */ +/** + * $Id: wipemalloc.h,v 1.1.1.1 2005/12/23 18:05:03 psperl Exp $ + * + * Contains an inline function which can replace malloc() that also + * call memset( ..., 0, sizeof( ... ) ) on the allocated block for + * safe initialization + * + * $Log$ + */ + +#ifndef _WIPEMALLOC_H +#define _WIPEMALLOC_H + +#ifndef MACOS +#ifndef HAVE_AIX /** AIX has malloc() defined in a strange place... */ +#ifdef WIN32 +#include +#endif +#include +#include +#else +#include +#endif /** !HAVE_AIX */ +#else +#include +#include +#endif /** !MACOS */ +#include + +#ifdef PANTS +#if defined(WIN32) && !defined(inline) +#define inline +#endif +#endif + +/** Safe memory allocator */ + void *wipemalloc( size_t count ); + void wipefree( void *ptr ); + +#endif /** !_WIPEMALLOC_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/Main.cpp kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/Main.cpp --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/Main.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/Main.cpp 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,458 @@ +/* + * Copyright (C) 2007-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +/* +xmms-projectM v0.99 - xmms-projectm.sourceforge.net +-------------------------------------------------- + +Lead Developers: Carmelo Piccione (cep@andrew.cmu.edu) & + Peter Sperl (peter@sperl.com) + +We have also been advised by some professors at CMU, namely Roger B. Dannenberg. +http://www-2.cs.cmu.edu/~rbd/ + +The inspiration for this program was Milkdrop by Ryan Geiss. Obviously. + +This code is distributed under the GPL. + + +THANKS FOR THE CODE!!! +------------------------------------------------- +The base for this program was andy@nobugs.org's XMMS plugin tutorial +http://www.xmms.org/docs/vis-plugin.html + +We used some FFT code by Takuya OOURA instead of XMMS' built-in fft code +fftsg.c - http://momonga.t.u-tokyo.ac.jp/~ooura/fft.html + +For font rendering we used GLF by Roman Podobedov +glf.c - http://astronomy.swin.edu.au/~pbourke/opengl/glf/ + +and some beat detection code was inspired by Frederic Patin @ +www.gamedev.net/reference/programming/features/beatdetection/ +-- + +"ported" to XBMC by d4rk +d4rk@xbmc.org + +*/ + +#include "addons/include/xbmc_vis_dll.h" +#include "addons/include/xbmc_addon_cpp_dll.h" +#include +#include "libprojectM/projectM.hpp" +#include +#include + +projectM *globalPM = NULL; + +// some projectm globals +int maxSamples=512; +int texsize=512; +int gx=40,gy=30; +int fps=100; +char *disp; +char g_visName[512]; +char **g_presets=NULL; +unsigned int g_numPresets = 0; +projectM::Settings g_configPM; + +bool g_UserPackFolder; +char lastPresetDir[1024]; +bool lastLockStatus; +int lastPresetIdx; +unsigned int lastLoggedPresetIdx; + +//-- Create ------------------------------------------------------------------- +// Called once when the visualisation is created by XBMC. Do any setup here. +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + VIS_PROPS* visprops = (VIS_PROPS*)props; + + strcpy(g_visName, visprops->name); + g_configPM.meshX = gx; + g_configPM.meshY = gy; + g_configPM.fps = fps; + g_configPM.textureSize = texsize; + g_configPM.windowWidth = visprops->width; + g_configPM.windowHeight = visprops->height; + g_configPM.aspectCorrection = true; + g_configPM.easterEgg = 0.0; + g_configPM.windowLeft = visprops->x; + g_configPM.windowBottom = visprops->y; + lastLoggedPresetIdx = lastPresetIdx; + + return ADDON_STATUS_NEED_SAVEDSETTINGS; +} + +//-- Start -------------------------------------------------------------------- +// Called when a new soundtrack is played +//----------------------------------------------------------------------------- +extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName) +{ + //printf("Got Start Command\n"); +} + +//-- Audiodata ---------------------------------------------------------------- +// Called by XBMC to pass new audio data to the vis +//----------------------------------------------------------------------------- +extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +{ + if (globalPM) + globalPM->pcm()->addPCMfloat(pAudioData, iAudioDataLength); +} + +//-- Render ------------------------------------------------------------------- +// Called once per frame. Do all rendering here. +//----------------------------------------------------------------------------- +extern "C" void Render() +{ + if (globalPM) + { + globalPM->renderFrame(); + if (g_presets) + { + unsigned preset; + globalPM->selectedPresetIndex(preset); + if (lastLoggedPresetIdx != preset) + CLog::Log(LOGDEBUG,"PROJECTM - Changed preset to: %s",g_presets[preset]); + lastLoggedPresetIdx = preset; + } + } +} + +//-- GetInfo ------------------------------------------------------------------ +// Tell XBMC our requirements +//----------------------------------------------------------------------------- +extern "C" void GetInfo(VIS_INFO* pInfo) +{ + pInfo->bWantsFreq = false; + pInfo->iSyncDelay = 0; +} + +//-- OnAction ----------------------------------------------------------------- +// Handle XBMC actions such as next preset, lock preset, album art changed etc +//----------------------------------------------------------------------------- +extern "C" bool OnAction(long flags, const void *param) +{ + bool ret = false; + + if (!globalPM) + return false; + + if (flags == VIS_ACTION_LOAD_PRESET && param) + { + int pindex = *((int *)param); + globalPM->selectPreset(pindex); + ret = true; + } + else if (flags == VIS_ACTION_NEXT_PRESET) + { +// switchPreset(ALPHA_NEXT, SOFT_CUT); + if (!globalPM->isShuffleEnabled()) + globalPM->key_handler(PROJECTM_KEYDOWN, PROJECTM_K_n, PROJECTM_KMOD_CAPS); //ignore PROJECTM_KMOD_CAPS + else + globalPM->key_handler(PROJECTM_KEYDOWN, PROJECTM_K_r, PROJECTM_KMOD_CAPS); //ignore PROJECTM_KMOD_CAPS + ret = true; + } + else if (flags == VIS_ACTION_PREV_PRESET) + { +// switchPreset(ALPHA_PREVIOUS, SOFT_CUT); + if (!globalPM->isShuffleEnabled()) + globalPM->key_handler(PROJECTM_KEYDOWN, PROJECTM_K_p, PROJECTM_KMOD_CAPS); //ignore PROJECTM_KMOD_CAPS + else + globalPM->key_handler(PROJECTM_KEYDOWN, PROJECTM_K_r, PROJECTM_KMOD_CAPS); //ignore PROJECTM_KMOD_CAPS + + ret = true; + } + else if (flags == VIS_ACTION_RANDOM_PRESET) + { + globalPM->setShuffleEnabled(g_configPM.shuffleEnabled); + ret = true; + } + else if (flags == VIS_ACTION_LOCK_PRESET) + { + globalPM->setPresetLock(!globalPM->isPresetLocked()); + unsigned preset; + globalPM->selectedPresetIndex(preset); + globalPM->selectPreset(preset); + ret = true; + } + return ret; +} + +//-- GetPresets --------------------------------------------------------------- +// Return a list of presets to XBMC for display +//----------------------------------------------------------------------------- +extern "C" unsigned int GetPresets(char ***presets) +{ + g_numPresets = globalPM ? globalPM->getPlaylistSize() : 0; + if (g_numPresets > 0) + { + g_presets = (char**) malloc(sizeof(char*)*g_numPresets); + for (unsigned i = 0; i < g_numPresets; i++) + { + g_presets[i] = (char*) malloc(strlen(globalPM->getPresetName(i).c_str())+2); + if (g_presets[i]) + strcpy(g_presets[i], globalPM->getPresetName(i).c_str()); + } + *presets = g_presets; + } + return g_numPresets; +} + +//-- GetPreset ---------------------------------------------------------------- +// Return the index of the current playing preset +//----------------------------------------------------------------------------- +extern "C" unsigned GetPreset() +{ + if (g_presets) + { + unsigned preset; + if(globalPM && globalPM->selectedPresetIndex(preset)) + return preset; + } + return 0; +} + +//-- IsLocked ----------------------------------------------------------------- +// Returns true if this add-on use settings +//----------------------------------------------------------------------------- +extern "C" bool IsLocked() +{ + if(globalPM) + return globalPM->isPresetLocked(); + else + return false; +} + +//-- Stop --------------------------------------------------------------------- +// Do everything before unload of this add-on +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Stop() +{ + if (globalPM) + { + delete globalPM; + globalPM = NULL; + } + if (g_presets) + { + for (unsigned i = 0; i setPresetLock(lastLockStatus); + globalPM->selectPreset(lastPresetIdx); + } + else + { + //If it is the first run or a newly chosen preset pack we choose a random preset as first + if (globalPM->getPlaylistSize()) + globalPM->selectPreset((rand() % (globalPM->getPlaylistSize()))); + } + return true; + } + catch (...) + { + printf("exception in projectM ctor"); + return false; + } +} + +//-- UpdateSetting ------------------------------------------------------------ +// Handle setting change request from XBMC +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_SetSetting(const char* id, const void* value) +{ + if (!id || !value) + return ADDON_STATUS_UNKNOWN; + + if (strcmp(id, "###GetSavedSettings") == 0) // We have some settings to be saved in the settings.xml file + { + if (!globalPM) + { + return ADDON_STATUS_UNKNOWN; + } + if (strcmp((char*)value, "0") == 0) + { + strcpy((char*)id, "lastpresetfolder"); + strcpy((char*)value, globalPM->settings().presetURL.c_str()); + } + if (strcmp((char*)value, "1") == 0) + { + strcpy((char*)id, "lastlockedstatus"); + strcpy((char*)value, (globalPM->isPresetLocked() ? "true" : "false")); + } + if (strcmp((char*)value, "2") == 0) + { + strcpy((char*)id, "lastpresetidx"); + unsigned int lastindex; + globalPM->selectedPresetIndex(lastindex); + sprintf ((char*)value, "%i", (int)lastindex); + } + if (strcmp((char*)value, "3") == 0) + { + strcpy((char*)id, "###End"); + } + return ADDON_STATUS_OK; + } + // It is now time to set the settings got from xbmc + if (strcmp(id, "quality")==0) + ChooseQuality (*(int*)value); + else if (strcmp(id, "shuffle")==0) + g_configPM.shuffleEnabled = *(bool*)value; + + else if (strcmp(id, "lastpresetidx")==0) + lastPresetIdx = *(int*)value; + else if (strcmp(id, "lastlockedstatus")==0) + lastLockStatus = *(bool*)value; + else if (strcmp(id, "lastpresetfolder")==0) + strcpy(lastPresetDir, (char*)value); + + else if (strcmp(id, "smooth_duration")==0) + g_configPM.smoothPresetDuration = (*(int*)value * 5 + 5); + else if (strcmp(id, "preset_duration")==0) + g_configPM.presetDuration = (*(int*)value * 5 + 5); + else if (strcmp(id, "preset pack")==0) + ChoosePresetPack(*(int*)value); + else if (strcmp(id, "user preset folder") == 0) + ChooseUserPresetFolder((char*)value); + else if (strcmp(id, "beat_sens")==0) + { + g_configPM.beatSensitivity = *(int*)value * 2; + if (!InitProjectM()) //The last setting value is already set so we (re)initalize + return ADDON_STATUS_UNKNOWN; + } + return ADDON_STATUS_OK; +} + +//-- GetSubModules ------------------------------------------------------------ +// Return any sub modules supported by this vis +//----------------------------------------------------------------------------- +extern "C" unsigned int GetSubModules(char ***names) +{ + return 0; // this vis supports 0 sub modules +} + +//-- Announce ----------------------------------------------------------------- +// Receive announcements from XBMC +//----------------------------------------------------------------------------- +extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/Makefile.in kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/Makefile.in --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/Makefile.in 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,46 @@ +ARCH=@ARCH@ +OBJS=Main.o +SLIB=@abs_top_srcdir@/addons/visualization.projectm/projectM.vis +PRESETS=@abs_top_srcdir@/addons/visualization.projectm/resources/presets.zip +DEFINES+=-DHAS_GL +CXXFLAGS=-fPIC +DIRS=libprojectM + +ifeq ($(findstring osx,$(ARCH)), osx) +CXXFLAGS+=-fno-common + +$(SLIB): $(OBJS) libprojectM/libprojectM.dylib + $(CXX) $(CFLAGS) $(LDFLAGS) -Wl,-alias_list,@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper_mach_alias \ + -bundle -undefined dynamic_lookup -read_only_relocs suppress -o $(SLIB) \ + @abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o ./libprojectM/CMakeFiles/projectM.dir/*.o $(OBJS) + $(MAKE) $(PRESETS) + +libprojectM/libprojectM.dylib: + $(MAKE) -C libprojectM +else +$(SLIB): $(OBJS) libprojectM/libprojectM.so + $(CXX) $(CXXFLAGS) $(LDFLAGS) ./libprojectM/CMakeFiles/projectM.dir/*.o -fPIC -shared -o $(SLIB) $(OBJS) `cat @abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.def` @abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o + $(MAKE) $(PRESETS) + +libprojectM/libprojectM.so: + $(MAKE) -C libprojectM +endif + +$(PRESETS): libprojectM/presets/* + zip -j $@ libprojectM/presets/* + +CLEAN_FILES = \ + libprojectM/libprojectM.so \ + libprojectM/libprojectM.so.2 \ + libprojectM/libprojectM.so.2.00 + +DISTCLEAN_FILES= \ + libprojectM/CMakeFiles/ \ + libprojectM/CMakeCache.txt \ + libprojectM/Makefile \ + libprojectM/cmake_install.cmake \ + libprojectM/config.inp \ + libprojectM/libprojectM.pc \ + $(PRESETS) + +include @abs_top_srcdir@/Makefile.include diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/projectm_1.2.0.patch kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/projectm_1.2.0.patch --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/projectm_1.2.0.patch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/projectm_1.2.0.patch 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,118 @@ +Index: Renderer.hpp +=================================================================== +--- Renderer.hpp (revision 1028) ++++ Renderer.hpp (working copy) +@@ -55,7 +55,7 @@ + int drawtitle; + int texsize; + +- Renderer( int width, int height, int gx, int gy, int texsize, BeatDetect *beatDetect, std::string presetURL, std::string title_fontURL, std::string menu_fontURL); ++ Renderer( int width, int height, int gx, int gy, int texsize, BeatDetect *beatDetect, std::string presetURL, std::string title_fontURL, std::string menu_fontURL, int xpos, int ypos); + ~Renderer(); + void RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInputs); + void ResetTextures(); +@@ -90,7 +90,9 @@ + int gy; + + std::string m_presetName; +- ++ ++ int vx; ++ int vy; + int vw; + int vh; + +Index: projectM.cpp +=================================================================== +--- projectM.cpp (revision 1028) ++++ projectM.cpp (working copy) +@@ -149,6 +149,8 @@ + config.add("Aspect Correction", settings.aspectCorrection); + config.add("Easter Egg Parameter", settings.easterEgg); + config.add("Shuffle Enabled", settings.shuffleEnabled); ++ config.add("Window Left", settings.windowLeft); ++ config.add("Window Bottom", settings.windowBottom); + + std::fstream file(configFile.c_str()); + if (file) { +@@ -171,6 +173,8 @@ + _settings.fps = config.read ( "FPS", 35 ); + _settings.windowWidth = config.read ( "Window Width", 512 ); + _settings.windowHeight = config.read ( "Window Height", 512 ); ++ _settings.windowLeft = config.read ( "Window Left", 0 ); ++ _settings.windowBottom = config.read ( "Window Bottom", 0 ); + _settings.smoothPresetDuration = config.read + ( "Smooth Preset Duration", config.read("Smooth Transition Duration", 10)); + _settings.presetDuration = config.read ( "Preset Duration", 15 ); +@@ -216,7 +220,8 @@ + + + projectM_init ( _settings.meshX, _settings.meshY, _settings.fps, +- _settings.textureSize, _settings.windowWidth,_settings.windowHeight); ++ _settings.textureSize, _settings.windowWidth,_settings.windowHeight, ++ _settings.windowLeft, _settings.windowBottom); + + + _settings.beatSensitivity = beatDetect->beat_sensitivity = config.read ( "Hard Cut Sensitivity", 10.0 ); +@@ -422,7 +427,7 @@ + projectM_resetengine(); + } + +-void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, int height ) ++void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, int height, int xpos, int ypos ) + { + + /** Initialise engine variables */ +@@ -462,7 +467,7 @@ + this->presetInputs2.gx = gx; + this->presetInputs2.gy = gy; + +- this->renderer = new Renderer ( width, height, gx, gy, texsize, beatDetect, settings().presetURL, settings().titleFontURL, settings().menuFontURL ); ++ this->renderer = new Renderer ( width, height, gx, gy, texsize, beatDetect, settings().presetURL, settings().titleFontURL, settings().menuFontURL, xpos, ypos); + + running = true; + +Index: Renderer.cpp +=================================================================== +--- Renderer.cpp (revision 1028) ++++ Renderer.cpp (working copy) +@@ -11,7 +11,7 @@ + + class Preset; + +-Renderer::Renderer(int width, int height, int gx, int gy, int texsize, BeatDetect *beatDetect, std::string _presetURL, std::string _titlefontURL, std::string _menufontURL): title_fontURL(_titlefontURL), menu_fontURL(_menufontURL), presetURL(_presetURL), m_presetName("None"), vw(width), vh(height), gx(gx), gy(gy), texsize(texsize) ++Renderer::Renderer(int width, int height, int gx, int gy, int texsize, BeatDetect *beatDetect, std::string _presetURL, std::string _titlefontURL, std::string _menufontURL, int xpos, int ypos): title_fontURL(_titlefontURL), menu_fontURL(_menufontURL), presetURL(_presetURL), m_presetName("None"), vw(width), vh(height), gx(gx), gy(gy), texsize(texsize), vx(xpos), vy(ypos) + { + int x; int y; + +@@ -217,7 +217,7 @@ + } + else + #endif +- glViewport( 0, 0, this->vw, this->vh ); ++ glViewport( vx, vy, this->vw + vx, this->vh + vy ); + + + +Index: projectM.hpp +=================================================================== +--- projectM.hpp (revision 1028) ++++ projectM.hpp (working copy) +@@ -141,6 +141,8 @@ + int textureSize; + int windowWidth; + int windowHeight; ++ int windowLeft; ++ int windowBottom; + std::string presetURL; + std::string titleFontURL; + std::string menuFontURL; +@@ -265,7 +267,7 @@ + + void switchPreset(std::unique_ptr & targetPreset, PresetInputs & inputs, PresetOutputs & outputs); + void readConfig(const std::string & configFile); +- void projectM_init(int gx, int gy, int fps, int texsize, int width, int height); ++ void projectM_init(int gx, int gy, int fps, int texsize, int width, int height, int xpos, int ypos); + void projectM_reset(); + + void projectM_initengine(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/README kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/README --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/README 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/README 2015-10-19 08:39:17.000000000 +0000 @@ -0,0 +1,14 @@ +XBMCProjectM should be checked out into the sources/visualisations dir at the same level as XBMC (as it is in svn). + +projectM now uses cmake, so get it: +sudo apt-get install cmake + +For complete projectM build instructions see: +http://projectm.wiki.sourceforge.net/Installation+Instructions + +Unset CC and CXX environment variables or you'll upset CMake: +unset CC +unset CXX + +Quick and dirty projectM build instructions: +make Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/win32/glew/glew32.dll and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/win32/glew/glew32.dll differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/win32/glew/libglew32.a and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/win32/glew/libglew32.a differ Binary files /tmp/tmpAfsyo3/TzUgzksEGr/kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/win32/glew/libglew32.dll.a and /tmp/tmpAfsyo3/egsHi5k7WO/kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/win32/glew/libglew32.dll.a differ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/win32/glew/ReadMe.txt kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/win32/glew/ReadMe.txt --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/win32/glew/ReadMe.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/win32/glew/ReadMe.txt 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1 @@ +Downloaded from http://glew.sourceforge.net/index.html and compiled in our mingw environment. \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/win32/pthreads/pthread.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/win32/pthreads/pthread.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/win32/pthreads/pthread.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/win32/pthreads/pthread.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,1077 @@ +/* This is the POSIX thread API (POSIX 1003). + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright (C) 1998 John E. Bossom + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#if !defined( PTHREAD_H ) +#define PTHREAD_H + +#ifdef _UWIN +# define HAVE_STRUCT_TIMESPEC 1 +# define HAVE_SIGNAL_H 1 +# undef HAVE_CONFIG_H +# pragma comment(lib, "pthread") +#endif + +/* + * ------------------------------------------------------------- + * + * + * Module: pthread.h + * + * Purpose: + * Provides an implementation of PThreads based upon the + * standard: + * + * POSIX 1003.1c-1995 (POSIX.1c) + * + * Parts of the implementation also comply with the + * Open Group Unix 98 specification in order to enhance + * code portability between Windows, various commercial + * Unix implementations, and Linux. + * + * Authors: + * There have been many contributors to this library. + * The initial implementation was contributed by + * John Bossom, and several others have provided major + * sections or revisions of parts of the implementation. + * Often significant effort has been contributed to + * find and fix important bugs and other problems to + * improve the reliability of the library, which sometimes + * is not reflected in the amount of code which changed as + * result. + * As much as possible, the contributors are acknowledged + * in the ChangeLog file in the source code distribution + * where their changes are noted in detail. + * + * Contributors are listed in the MAINTAINERS file. + * + * As usual, all bouquets go to the contributors, and all + * brickbats go to the project maintainer. + * + * Maintainer: + * The code base for this project is coordinated and + * eventually pre-tested, packaged, and made available by + * + * Ross Johnson + * + * QA Testers: + * Ultimately, the library is tested in the real world by + * a host of competent and demanding scientists and + * engineers who report bugs and/or provide solutions + * which are then fixed or incorporated into subsequent + * versions of the library. Each time a bug is fixed, a + * test case is written to prove the fix and ensure + * that later changes to the code don't reintroduce the + * same error. The number of test cases is slowly growing + * and therefore so is the code reliability. + * + * Compliance: + * See the file ANNOUNCE for the list of implemented + * and not-implemented routines and defined options. + * Of course, these are all defined is this file as well. + * + * Web site: + * The source code and other information about this library + * are available from + * + * http://sources.redhat.com/pthreads-win32/ + * + * ------------------------------------------------------------- + */ + +/* + * ----------------- + * autoconf switches + * ----------------- + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include + +#ifndef NEED_FTIME +#include +#else /* NEED_FTIME */ +/* use native WIN32 time API */ +#endif /* NEED_FTIME */ + +#if HAVE_SIGNAL_H +#include +#endif /* HAVE_SIGNAL_H */ + +#include + +#ifndef HAVE_STRUCT_TIMESPEC +struct timespec { + long tv_sec; + long tv_nsec; +}; +#endif /* HAVE_STRUCT_TIMESPEC */ + +#ifndef SIG_BLOCK +#define SIG_BLOCK 0 +#endif /* SIG_BLOCK */ + +#ifndef SIG_UNBLOCK +#define SIG_UNBLOCK 1 +#endif /* SIG_UNBLOCK */ + +#ifndef SIG_SETMASK +#define SIG_SETMASK 2 +#endif /* SIG_SETMASK */ + +/* + * note: ETIMEDOUT is correctly defined in winsock.h + */ +#include + +#ifdef NEED_ERRNO +# include "need_errno.h" +#else +# include +#endif + +#include + +/* + * In case ETIMEDOUT hasn't been defined above somehow. + */ +#ifndef ETIMEDOUT +# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +#endif + +/* + * Several systems don't define ENOTSUP. If not, we use + * the same value as Solaris. + */ +#ifndef ENOTSUP +# define ENOTSUP 48 +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* + * ------------------------------------------------------------- + * + * POSIX 1003.1c-1995 Options + * =========================== + * + * _POSIX_THREADS (set) + * If set, you can use threads + * + * _POSIX_THREAD_ATTR_STACKSIZE (set) + * If set, you can control the size of a thread's + * stack + * pthread_attr_getstacksize + * pthread_attr_setstacksize + * + * _POSIX_THREAD_ATTR_STACKADDR (not set) + * If set, you can allocate and control a thread's + * stack. If not supported, the following functions + * will return ENOSYS, indicating they are not + * supported: + * pthread_attr_getstackaddr + * pthread_attr_setstackaddr + * + * _POSIX_THREAD_PRIORITY_SCHEDULING (set) + * If set, you can use realtime scheduling. + * Indicates the availability of: + * pthread_attr_getinheritsched + * pthread_attr_getschedparam + * pthread_attr_getschedpolicy + * pthread_attr_getscope + * pthread_attr_setinheritsched + * pthread_attr_setschedparam + * pthread_attr_setschedpolicy + * pthread_attr_setscope + * pthread_getschedparam + * pthread_setschedparam + * sched_get_priority_max + * sched_get_priority_min + * sched_rr_set_interval + * + * _POSIX_THREAD_PRIO_INHERIT (not set) + * If set, you can create priority inheritance + * mutexes. + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprotocol + + * + * _POSIX_THREAD_PRIO_PROTECT (not set) + * If set, you can create priority ceiling mutexes + * Indicates the availability of: + * pthread_mutex_getprioceiling + * pthread_mutex_setprioceiling + * pthread_mutexattr_getprioceiling + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprioceiling + * pthread_mutexattr_setprotocol + + * + * _POSIX_THREAD_PROCESS_SHARED (not set) + * If set, you can create mutexes and condition + * variables that can be shared with another + * process.If set, indicates the availability + * of: + * pthread_mutexattr_getpshared + * pthread_mutexattr_setpshared + * pthread_condattr_getpshared + * pthread_condattr_setpshared + * + * _POSIX_THREAD_SAFE_FUNCTIONS (set) + * If set you can use the special *_r library + * functions that provide thread-safe behaviour + * + * + These functions provide both 'inherit' and/or + * 'protect' protocol, based upon these macro + * settings. + * + * POSIX 1003.1c-1995 Limits + * =========================== + * + * PTHREAD_DESTRUCTOR_ITERATIONS + * Maximum number of attempts to destroy + * a thread's thread-specific data on + * termination (must be at least 4) + * + * PTHREAD_KEYS_MAX + * Maximum number of thread-specific data keys + * available per process (must be at least 128) + * + * PTHREAD_STACK_MIN + * Minimum supported stack size for a thread + * + * PTHREAD_THREADS_MAX + * Maximum number of threads supported per + * process (must be at least 64). + * + * + * POSIX 1003.1j/D10-1999 Options + * ============================== + * + * _POSIX_READER_WRITER_LOCKS (set) + * If set, you can use read/write locks + * + * _POSIX_SPIN_LOCKS (set) + * If set, you can use spin locks + * + * _POSIX_BARRIERS (set) + * If set, you can use barriers + * + * ------------------------------------------------------------- + */ + +/* + * POSIX Options + */ +#ifndef _POSIX_THREADS +#define _POSIX_THREADS +#endif + +#ifndef _POSIX_READER_WRITER_LOCKS +#define _POSIX_READER_WRITER_LOCKS +#endif + +#ifndef _POSIX_SPIN_LOCKS +#define _POSIX_SPIN_LOCKS +#endif + +#ifndef _POSIX_BARRIERS +#define _POSIX_BARRIERS +#endif + +#define _POSIX_THREAD_SAFE_FUNCTIONS +#define _POSIX_THREAD_ATTR_STACKSIZE +#define _POSIX_THREAD_PRIORITY_SCHEDULING + +#if defined( KLUDGE ) +/* + * The following are not supported + */ +#define _POSIX_THREAD_ATTR_STACKADDR +#define _POSIX_THREAD_PRIO_INHERIT +#define _POSIX_THREAD_PRIO_PROTECT +#define _POSIX_THREAD_PROCESS_SHARED + +#endif /* KLUDGE */ + +/* + * POSIX Limits + * + * PTHREAD_DESTRUCTOR_ITERATIONS + * Standard states this must be at least + * 4. + * + * PTHREAD_KEYS_MAX + * WIN32 permits only 64 TLS keys per process. + * This limitation could be worked around by + * simply simulating keys. + * + * PTHREADS_STACK_MIN + * POSIX specifies 0 which is also the value WIN32 + * interprets as allowing the system to + * set the size to that of the main thread. The + * maximum stack size in Win32 is 1Meg. WIN32 + * allocates more stack as required up to the 1Meg + * limit. + * + * PTHREAD_THREADS_MAX + * Not documented by WIN32. Wrote a test program + * that kept creating threads until it failed + * revealed this approximate number. + * + */ +#define PTHREAD_DESTRUCTOR_ITERATIONS 4 +#define PTHREAD_KEYS_MAX 64 +#define PTHREAD_STACK_MIN 0 +#define PTHREAD_THREADS_MAX 2019 + + +#ifdef _UWIN +# include +#else +typedef struct pthread_t_ *pthread_t; +typedef struct pthread_attr_t_ *pthread_attr_t; +typedef struct pthread_once_t_ pthread_once_t; +typedef struct pthread_key_t_ *pthread_key_t; +typedef struct pthread_mutex_t_ *pthread_mutex_t; +typedef struct pthread_mutexattr_t_ *pthread_mutexattr_t; +typedef struct pthread_cond_t_ *pthread_cond_t; +typedef struct pthread_condattr_t_ *pthread_condattr_t; +#endif +typedef struct pthread_rwlock_t_ *pthread_rwlock_t; +typedef struct pthread_rwlockattr_t_ *pthread_rwlockattr_t; +typedef struct pthread_spinlock_t_ *pthread_spinlock_t; +typedef struct pthread_barrier_t_ *pthread_barrier_t; +typedef struct pthread_barrierattr_t_ *pthread_barrierattr_t; + +/* + * ==================== + * ==================== + * POSIX Threads + * ==================== + * ==================== + */ + +enum { +/* + * pthread_attr_{get,set}detachstate + */ + PTHREAD_CREATE_JOINABLE = 0, /* Default */ + PTHREAD_CREATE_DETACHED = 1, + +/* + * pthread_attr_{get,set}inheritsched + */ + PTHREAD_INHERIT_SCHED = 0, + PTHREAD_EXPLICIT_SCHED = 1, /* Default */ + +/* + * pthread_{get,set}scope + */ + PTHREAD_SCOPE_PROCESS = 0, + PTHREAD_SCOPE_SYSTEM = 1, /* Default */ + +/* + * pthread_setcancelstate paramters + */ + PTHREAD_CANCEL_ENABLE = 0, /* Default */ + PTHREAD_CANCEL_DISABLE = 1, + +/* + * pthread_setcanceltype parameters + */ + PTHREAD_CANCEL_ASYNCHRONOUS = 0, + PTHREAD_CANCEL_DEFERRED = 1, /* Default */ + +/* + * pthread_mutexattr_{get,set}pshared + * pthread_condattr_{get,set}pshared + */ + PTHREAD_PROCESS_PRIVATE = 0, + PTHREAD_PROCESS_SHARED = 1, + +/* + * pthread_barrier_wait + */ + PTHREAD_BARRIER_SERIAL_THREAD = -1 +}; + +/* + * ==================== + * ==================== + * Cancelation + * ==================== + * ==================== + */ +#define PTHREAD_CANCELED ((void *) -1) + + +/* + * ==================== + * ==================== + * Once Key + * ==================== + * ==================== + */ +#define PTHREAD_ONCE_INIT { FALSE, -1 } + +struct pthread_once_t_ +{ + int done; /* indicates if user function executed */ + long started; /* First thread to increment this value */ + /* to zero executes the user function */ +}; + + +/* + * ==================== + * ==================== + * Object initialisers + * ==================== + * ==================== + */ +#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) -1) + +#define PTHREAD_COND_INITIALIZER ((pthread_cond_t) -1) + +#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) -1) + +#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t) -1) + +enum +{ + PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL +}; + + +/* There are three implementations of cancel cleanup. + * Note that pthread.h is included in both application + * compilation units and also internally for the library. + * The code here and within the library aims to work + * for all reasonable combinations of environments. + * + * The three implementations are: + * + * WIN32 SEH + * C + * C++ + * + * Please note that exiting a push/pop block via + * "return", "exit", "break", or "continue" will + * lead to different behaviour amongst applications + * depending upon whether the library was built + * using SEH, C++, or C. For example, a library built + * with SEH will call the cleanup routine, while both + * C++ and C built versions will not. + */ + +/* + * define defaults for cleanup code + */ +#if !defined( __CLEANUP_SEH ) && !defined( __CLEANUP_CXX ) && !defined( __CLEANUP_C ) + +#if defined(_MSC_VER) +#define __CLEANUP_SEH +#elif defined(__cplusplus) +#define __CLEANUP_CXX +#else +#define __CLEANUP_C +#endif + +#endif + +#if defined( __CLEANUP_SEH ) && defined(__GNUC__) +#error ERROR [__FILE__, line __LINE__]: GNUC does not support SEH. +#endif + +typedef struct ptw32_cleanup_t ptw32_cleanup_t; +typedef void (__cdecl *ptw32_cleanup_callback_t)(void *); + +struct ptw32_cleanup_t +{ + ptw32_cleanup_callback_t routine; + void *arg; + struct ptw32_cleanup_t *prev; +}; + +#ifdef __CLEANUP_SEH + /* + * WIN32 SEH version of cancel cleanup. + */ + +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + ptw32_cleanup_t _cleanup; \ + \ + _cleanup.routine = (ptw32_cleanup_callback_t)(_rout); \ + _cleanup.arg = (_arg); \ + __try \ + { \ + +#define pthread_cleanup_pop( _execute ) \ + } \ + __finally \ + { \ + if( _execute || AbnormalTermination()) \ + { \ + (*(_cleanup.routine))( _cleanup.arg ); \ + } \ + } \ + } + +#else /* __CLEANUP_SEH */ + +#ifdef __CLEANUP_C + + /* + * C implementation of PThreads cancel cleanup + */ + +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + ptw32_cleanup_t _cleanup; \ + \ + ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \ + +#define pthread_cleanup_pop( _execute ) \ + (void) ptw32_pop_cleanup( _execute ); \ + } + +#else /* __CLEANUP_C */ + +#ifdef __CLEANUP_CXX + + /* + * C++ version of cancel cleanup. + * - John E. Bossom. + */ + + class PThreadCleanup { + /* + * PThreadCleanup + * + * Purpose + * This class is a C++ helper class that is + * used to implement pthread_cleanup_push/ + * pthread_cleanup_pop. + * The destructor of this class automatically + * pops the pushed cleanup routine regardless + * of how the code exits the scope + * (i.e. such as by an exception) + */ + ptw32_cleanup_callback_t cleanUpRout; + void * obj; + int executeIt; + + public: + PThreadCleanup() : + cleanUpRout( NULL ), + obj( NULL ), + executeIt( 0 ) + /* + * No cleanup performed + */ + { + } + + PThreadCleanup( + ptw32_cleanup_callback_t routine, + void * arg ) : + cleanUpRout( routine ), + obj( arg ), + executeIt( 1 ) + /* + * Registers a cleanup routine for 'arg' + */ + { + } + + ~PThreadCleanup() + { + if ( executeIt && ((void *) cleanUpRout != NULL) ) + { + (void) (*cleanUpRout)( obj ); + } + } + + void execute( int exec ) + { + executeIt = exec; + } + }; + + /* + * C++ implementation of PThreads cancel cleanup; + * This implementation takes advantage of a helper + * class who's destructor automatically calls the + * cleanup routine if we exit our scope weirdly + */ +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + PThreadCleanup cleanup((ptw32_cleanup_callback_t)(_rout), \ + (void *) (_arg) ); + +#define pthread_cleanup_pop( _execute ) \ + cleanup.execute( _execute ); \ + } + +#else + +#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. + +#endif /* __CLEANUP_CXX */ + +#endif /* __CLEANUP_C */ + +#endif /* __CLEANUP_SEH */ + +/* + * =============== + * =============== + * Methods + * =============== + * =============== + */ + +/* + * PThread Attribute Functions + */ +int pthread_attr_init (pthread_attr_t * attr); + +int pthread_attr_destroy (pthread_attr_t * attr); + +int pthread_attr_getdetachstate (const pthread_attr_t * attr, + int *detachstate); + +int pthread_attr_getstackaddr (const pthread_attr_t * attr, + void **stackaddr); + +int pthread_attr_getstacksize (const pthread_attr_t * attr, + size_t * stacksize); + +int pthread_attr_setdetachstate (pthread_attr_t * attr, + int detachstate); + +int pthread_attr_setstackaddr (pthread_attr_t * attr, + void *stackaddr); + +int pthread_attr_setstacksize (pthread_attr_t * attr, + size_t stacksize); + +int pthread_attr_getschedparam (const pthread_attr_t *attr, + struct sched_param *param); + +int pthread_attr_setschedparam (pthread_attr_t *attr, + const struct sched_param *param); + +int pthread_attr_setschedpolicy (pthread_attr_t *, + int); + +int pthread_attr_getschedpolicy (pthread_attr_t *, + int *); + +int pthread_attr_setinheritsched(pthread_attr_t * attr, + int inheritsched); + +int pthread_attr_getinheritsched(pthread_attr_t * attr, + int * inheritsched); + +int pthread_attr_setscope (pthread_attr_t *, + int); + +int pthread_attr_getscope (const pthread_attr_t *, + int *); + +/* + * PThread Functions + */ +int pthread_create (pthread_t * tid, + const pthread_attr_t * attr, + void *(*start) (void *), + void *arg); + +int pthread_detach (pthread_t tid); + +int pthread_equal (pthread_t t1, + pthread_t t2); + +void pthread_exit (void *value_ptr); + +int pthread_join (pthread_t thread, + void **value_ptr); + +pthread_t pthread_self (void); + +int pthread_cancel (pthread_t thread); + +int pthread_setcancelstate (int state, + int *oldstate); + +int pthread_setcanceltype (int type, + int *oldtype); + +void pthread_testcancel (void); + +int pthread_once (pthread_once_t * once_control, + void (*init_routine) (void)); + +ptw32_cleanup_t *ptw32_pop_cleanup (int execute); + +void ptw32_push_cleanup (ptw32_cleanup_t * cleanup, + void (*routine) (void *), + void *arg); + +/* + * Thread Specific Data Functions + */ +int pthread_key_create (pthread_key_t * key, + void (*destructor) (void *)); + +int pthread_key_delete (pthread_key_t key); + +int pthread_setspecific (pthread_key_t key, + const void *value); + +void *pthread_getspecific (pthread_key_t key); + + +/* + * Mutex Attribute Functions + */ +int pthread_mutexattr_init (pthread_mutexattr_t * attr); + +int pthread_mutexattr_destroy (pthread_mutexattr_t * attr); + +int pthread_mutexattr_getpshared (const pthread_mutexattr_t + * attr, + int *pshared); + +int pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, + int pshared); + +int pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); +int pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int *kind); + +/* + * Barrier Attribute Functions + */ +int pthread_barrierattr_init (pthread_barrierattr_t * attr); + +int pthread_barrierattr_destroy (pthread_barrierattr_t * attr); + +int pthread_barrierattr_getpshared (const pthread_barrierattr_t + * attr, + int *pshared); + +int pthread_barrierattr_setpshared (pthread_barrierattr_t * attr, + int pshared); + +/* + * Mutex Functions + */ +int pthread_mutex_init (pthread_mutex_t * mutex, + const pthread_mutexattr_t * attr); + +int pthread_mutex_destroy (pthread_mutex_t * mutex); + +int pthread_mutex_lock (pthread_mutex_t * mutex); + +int pthread_mutex_trylock (pthread_mutex_t * mutex); + +int pthread_mutex_unlock (pthread_mutex_t * mutex); + +/* + * Spinlock Functions + */ +int pthread_spin_init (pthread_spinlock_t * lock, int pshared); + +int pthread_spin_destroy (pthread_spinlock_t * lock); + +int pthread_spin_lock (pthread_spinlock_t * lock); + +int pthread_spin_trylock (pthread_spinlock_t * lock); + +int pthread_spin_unlock (pthread_spinlock_t * lock); + +/* + * Barrier Functions + */ +int pthread_barrier_init (pthread_barrier_t * barrier, + const pthread_barrierattr_t * attr, + unsigned int count); + +int pthread_barrier_destroy (pthread_barrier_t * barrier); + +int pthread_barrier_wait (pthread_barrier_t * barrier); + +/* + * Condition Variable Attribute Functions + */ +int pthread_condattr_init (pthread_condattr_t * attr); + +int pthread_condattr_destroy (pthread_condattr_t * attr); + +int pthread_condattr_getpshared (const pthread_condattr_t * attr, + int *pshared); + +int pthread_condattr_setpshared (pthread_condattr_t * attr, + int pshared); + +/* + * Condition Variable Functions + */ +int pthread_cond_init (pthread_cond_t * cond, + const pthread_condattr_t * attr); + +int pthread_cond_destroy (pthread_cond_t * cond); + +int pthread_cond_wait (pthread_cond_t * cond, + pthread_mutex_t * mutex); + +int pthread_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, + const struct timespec *abstime); + +int pthread_cond_signal (pthread_cond_t * cond); + +int pthread_cond_broadcast (pthread_cond_t * cond); + +/* + * Scheduling + */ +int pthread_setschedparam (pthread_t thread, + int policy, + const struct sched_param *param); + +int pthread_getschedparam (pthread_t thread, + int *policy, + struct sched_param *param); + +int pthread_setconcurrency (int); + +int pthread_getconcurrency (void); + +/* + * Read-Write Lock Functions + */ +int pthread_rwlock_init(pthread_rwlock_t *lock, + const pthread_rwlockattr_t *attr); + +int pthread_rwlock_destroy(pthread_rwlock_t *lock); + +int pthread_rwlock_tryrdlock(pthread_rwlock_t *); + +int pthread_rwlock_trywrlock(pthread_rwlock_t *); + +int pthread_rwlock_rdlock(pthread_rwlock_t *lock); + +int pthread_rwlock_wrlock(pthread_rwlock_t *lock); + +int pthread_rwlock_unlock(pthread_rwlock_t *lock); + + +/* + * Non-portable functions + */ + +/* + * Compatibility with Linux. + */ +int pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, int kind); +int pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, int *kind); + +/* + * Possibly supported by other POSIX threads implementations + */ +int pthread_delay_np (struct timespec * interval); + +/* + * Returns the Win32 HANDLE for the POSIX thread. + */ +HANDLE pthread_getw32threadhandle_np(pthread_t thread); + +/* + * Returns the number of CPUs available to the process. + */ +int pthread_getprocessors_np(int * count); + +/* + * Useful if an application wants to statically link + * the lib rather than load the DLL at run-time. + */ +int pthread_win32_process_attach_np(void); +int pthread_win32_process_detach_np(void); +int pthread_win32_thread_attach_np(void); +int pthread_win32_thread_detach_np(void); + + +/* + * Protected Methods + * + * This function blocks until the given WIN32 handle + * is signaled or pthread_cancel had been called. + * This function allows the caller to hook into the + * PThreads cancel mechanism. It is implemented using + * + * WaitForMultipleObjects + * + * on 'waitHandle' and a manually reset WIN32 Event + * used to implement pthread_cancel. The 'timeout' + * argument to TimedWait is simply passed to + * WaitForMultipleObjects. + */ +int pthreadCancelableWait (HANDLE waitHandle); +int pthreadCancelableTimedWait (HANDLE waitHandle, DWORD timeout); + +/* + * Thread-Safe C Runtime Library Mappings. + */ +#ifndef _UWIN +#if 1 +#if (! defined(HAVE_ERRNO)) && (! defined(_REENTRANT)) && (! defined(_MT)) +int * _errno( void ); +#endif +#else +#if (! defined(NEED_ERRNO)) || (! defined( _REENTRANT ) && (! defined( _MT ) || ! defined( _MD ))) +#if defined(PTW32_BUILD) +__declspec( dllexport ) int * _errno( void ); +#else +int * _errno( void ); +#endif +#endif +#endif +#endif + +/* + * WIN32 C runtime library had been made thread-safe + * without affecting the user interface. Provide + * mappings from the UNIX thread-safe versions to + * the standard C runtime library calls. + * Only provide function mappings for functions that + * actually exist on WIN32. + */ + +#if !defined(__MINGW32__) +#define strtok_r( _s, _sep, _lasts ) \ + ( *(_lasts) = strtok( (_s), (_sep) ) ) +#endif /* !__MINGW32__ */ + +#define asctime_r( _tm, _buf ) \ + ( strcpy( (_buf), asctime( (_tm) ) ), \ + (_buf) ) + +#define ctime_r( _clock, _buf ) \ + ( strcpy( (_buf), ctime( (_clock) ) ), \ + (_buf) ) + +#define gmtime_r( _clock, _result ) \ + ( *(_result) = *gmtime( (_clock) ), \ + (_result) ) + +#define localtime_r( _clock, _result ) \ + ( *(_result) = *localtime( (_clock) ), \ + (_result) ) + +#define rand_r( _seed ) \ + ( _seed == _seed? rand() : rand() ) + + +#ifdef __cplusplus + +/* + * Internal exceptions + */ +class ptw32_exception {}; +class ptw32_exception_cancel : public ptw32_exception {}; +class ptw32_exception_exit : public ptw32_exception {}; + +#endif + +/* FIXME: This is only required if the library was built using SEH */ +/* + * Get internal SEH tag + */ +DWORD ptw32_get_exception_services_code(void); + +#ifndef PTW32_BUILD + +#ifdef __CLEANUP_SEH + +/* + * Redefine the SEH __except keyword to ensure that applications + * propagate our internal exceptions up to the library's internal handlers. + */ +#define __except( E ) \ + __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \ + ? EXCEPTION_CONTINUE_SEARCH : ( E ) ) + +#endif /* __CLEANUP_SEH */ + +#ifdef __cplusplus + +/* + * Redefine the C++ catch keyword to ensure that applications + * propagate our internal exceptions up to the library's internal handlers. + */ +#ifdef _MSC_VER + /* + * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll' + * if you want Pthread-Win32 cancelation and pthread_exit to work. + */ + +#ifndef PtW32NoCatchWarn + +#pragma message("When compiling applications with MSVC++ and C++ exception handling:") +#pragma message(" Replace any 'catch( ... )' with 'PtW32CatchAll' in POSIX threads") +#pragma message(" if you want POSIX thread cancelation and pthread_exit to work.") + +#endif + +#define PtW32CatchAll \ + catch( ptw32_exception & ) { throw; } \ + catch( ... ) + +#else /* _MSC_VER */ + +#define catch( E ) \ + catch( ptw32_exception & ) { throw; } \ + catch( E ) + +#endif /* _MSC_VER */ + +#endif /* __cplusplus */ + +#endif /* ! PTW32_BUILD */ + +#ifdef __cplusplus +} /* End of extern "C" */ +#endif /* __cplusplus */ + +#endif /* PTHREAD_H */ diff -Nru kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/win32/pthreads/sched.h kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/win32/pthreads/sched.h --- kodi-16.1~git20160425.1001-final/xbmc/visualizations/XBMCProjectM/win32/pthreads/sched.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/visualizations/XBMCProjectM/win32/pthreads/sched.h 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,89 @@ +/* + * Module: sched.h + * + * Purpose: + * Provides an implementation of POSIX realtime extensions + * as defined in + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright (C) 1998 John E. Bossom + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ +#ifndef _SCHED_H +#define _SCHED_H + +#if defined(__MINGW32__) || defined(_UWIN) +/* For pid_t */ +# include +/* Required by Unix 98 */ +# include +#else +typedef int pid_t; +#endif + +/* Thread scheduling policies */ + +enum { + SCHED_OTHER = 0, + SCHED_FIFO, + SCHED_RR, + SCHED_MIN = SCHED_OTHER, + SCHED_MAX = SCHED_RR +}; + +struct sched_param { + int sched_priority; +}; + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +int sched_yield (void); + +int sched_get_priority_min (int policy); + +int sched_get_priority_max (int policy); + +int sched_setscheduler (pid_t pid, int policy); + +int sched_getscheduler (pid_t pid); + +/* + * Note that this macro returns ENOTSUP rather than + * ENOSYS as might be expected. However, returning ENOSYS + * should mean that sched_get_priority_{min,max} are + * not implemented as well as sched_rr_get_interval. + * This is not the case, since we just don't support + * round-robin scheduling. Therefore I have chosen to + * return the same value as sched_setscheduler when + * SCHED_RR is passed to it. + */ +#define sched_rr_get_interval(_pid, _interval) \ + ( errno = ENOTSUP, (int) -1 ) + + +#ifdef __cplusplus +} /* End of extern "C" */ +#endif /* __cplusplus */ + + +#endif /* !_SCHED_H */ + diff -Nru kodi-16.1~git20160425.1001-final/xbmc/win32/dxerr.cpp kodi-15.2~git20151019.1039-final/xbmc/win32/dxerr.cpp --- kodi-16.1~git20160425.1001-final/xbmc/win32/dxerr.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/win32/dxerr.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,3965 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: DXErr.cpp -// -// DirectX Error Library -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -//-------------------------------------------------------------------------------------- - -// This version only supports UNICODE. - -#include "dxerr.h" - -#include -#include - -#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) -#include -#include -#include - -#define DIRECTINPUT_VERSION 0x800 -#include -#include -#endif - -#include -#include - -#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP -#include -#include -#include -#endif - -#define XAUDIO2_E_INVALID_CALL 0x88960001 -#define XAUDIO2_E_XMA_DECODER_ERROR 0x88960002 -#define XAUDIO2_E_XAPO_CREATION_FAILED 0x88960003 -#define XAUDIO2_E_DEVICE_INVALIDATED 0x88960004 - -#define XAPO_E_FORMAT_UNSUPPORTED MAKE_HRESULT(SEVERITY_ERROR, 0x897, 0x01) - -#define DXUTERR_NODIRECT3D MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0901) -#define DXUTERR_NOCOMPATIBLEDEVICES MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0902) -#define DXUTERR_MEDIANOTFOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0903) -#define DXUTERR_NONZEROREFCOUNT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0904) -#define DXUTERR_CREATINGDEVICE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0905) -#define DXUTERR_RESETTINGDEVICE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0906) -#define DXUTERR_CREATINGDEVICEOBJECTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0907) -#define DXUTERR_RESETTINGDEVICEOBJECTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0908) -#define DXUTERR_INCORRECTVERSION MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0909) -#define DXUTERR_DEVICEREMOVED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x090A) - -//----------------------------------------------------------------------------- -#define BUFFER_SIZE 3000 - -#pragma warning( disable : 6001 6221 ) - -//-------------------------------------------------------------------------------------- -#define CHK_ERR(hrchk, strOut) \ - case hrchk: \ - return L##strOut; - -#define CHK_ERRA(hrchk) \ - case hrchk: \ - return L#hrchk; - -#define HRESULT_FROM_WIN32b(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000))) - -#define CHK_ERR_WIN32A(hrchk) \ - case HRESULT_FROM_WIN32b(hrchk): \ - case hrchk: \ - return L#hrchk; - -#define CHK_ERR_WIN32_ONLY(hrchk, strOut) \ - case HRESULT_FROM_WIN32b(hrchk): \ - return L##strOut; - -//----------------------------------------------------- -const WCHAR* WINAPI DXGetErrorStringW( _In_ HRESULT hr ) -{ - switch(hr) - { -// Commmented out codes are actually alises for other codes - -// ------------------------------------------------------------- -// Common Win32 error codes -// ------------------------------------------------------------- - CHK_ERRA(S_OK) - CHK_ERRA(S_FALSE) - - CHK_ERRA(E_UNEXPECTED) - CHK_ERRA(E_NOTIMPL) - CHK_ERRA(E_OUTOFMEMORY) - CHK_ERRA(E_INVALIDARG) - CHK_ERRA(E_NOINTERFACE) - CHK_ERRA(E_POINTER) - CHK_ERRA(E_HANDLE) - CHK_ERRA(E_ABORT) - CHK_ERRA(E_FAIL) - CHK_ERRA(E_ACCESSDENIED) - CHK_ERRA(E_PENDING) - CHK_ERRA(CO_E_INIT_TLS) - CHK_ERRA(CO_E_INIT_SHARED_ALLOCATOR) - CHK_ERRA(CO_E_INIT_MEMORY_ALLOCATOR) - CHK_ERRA(CO_E_INIT_CLASS_CACHE) - CHK_ERRA(CO_E_INIT_RPC_CHANNEL) - CHK_ERRA(CO_E_INIT_TLS_SET_CHANNEL_CONTROL) - CHK_ERRA(CO_E_INIT_TLS_CHANNEL_CONTROL) - CHK_ERRA(CO_E_INIT_UNACCEPTED_USER_ALLOCATOR) - CHK_ERRA(CO_E_INIT_SCM_MUTEX_EXISTS) - CHK_ERRA(CO_E_INIT_SCM_FILE_MAPPING_EXISTS) - CHK_ERRA(CO_E_INIT_SCM_MAP_VIEW_OF_FILE) - CHK_ERRA(CO_E_INIT_SCM_EXEC_FAILURE) - CHK_ERRA(CO_E_INIT_ONLY_SINGLE_THREADED) - CHK_ERRA(CO_E_CANT_REMOTE) - CHK_ERRA(CO_E_BAD_SERVER_NAME) - CHK_ERRA(CO_E_WRONG_SERVER_IDENTITY) - CHK_ERRA(CO_E_OLE1DDE_DISABLED) - CHK_ERRA(CO_E_RUNAS_SYNTAX) - CHK_ERRA(CO_E_CREATEPROCESS_FAILURE) - CHK_ERRA(CO_E_RUNAS_CREATEPROCESS_FAILURE) - CHK_ERRA(CO_E_RUNAS_LOGON_FAILURE) - CHK_ERRA(CO_E_LAUNCH_PERMSSION_DENIED) - CHK_ERRA(CO_E_START_SERVICE_FAILURE) - CHK_ERRA(CO_E_REMOTE_COMMUNICATION_FAILURE) - CHK_ERRA(CO_E_SERVER_START_TIMEOUT) - CHK_ERRA(CO_E_CLSREG_INCONSISTENT) - CHK_ERRA(CO_E_IIDREG_INCONSISTENT) - CHK_ERRA(CO_E_NOT_SUPPORTED) - CHK_ERRA(CO_E_RELOAD_DLL) - CHK_ERRA(CO_E_MSI_ERROR) - CHK_ERRA(OLE_E_FIRST) - CHK_ERRA(OLE_E_LAST) - CHK_ERRA(OLE_S_FIRST) - CHK_ERRA(OLE_S_LAST) -// CHK_ERRA(OLE_E_OLEVERB) - CHK_ERRA(OLE_E_ADVF) - CHK_ERRA(OLE_E_ENUM_NOMORE) - CHK_ERRA(OLE_E_ADVISENOTSUPPORTED) - CHK_ERRA(OLE_E_NOCONNECTION) - CHK_ERRA(OLE_E_NOTRUNNING) - CHK_ERRA(OLE_E_NOCACHE) - CHK_ERRA(OLE_E_BLANK) - CHK_ERRA(OLE_E_CLASSDIFF) - CHK_ERRA(OLE_E_CANT_GETMONIKER) - CHK_ERRA(OLE_E_CANT_BINDTOSOURCE) - CHK_ERRA(OLE_E_STATIC) - CHK_ERRA(OLE_E_PROMPTSAVECANCELLED) - CHK_ERRA(OLE_E_INVALIDRECT) - CHK_ERRA(OLE_E_WRONGCOMPOBJ) - CHK_ERRA(OLE_E_INVALIDHWND) - CHK_ERRA(OLE_E_NOT_INPLACEACTIVE) - CHK_ERRA(OLE_E_CANTCONVERT) - CHK_ERRA(OLE_E_NOSTORAGE) - CHK_ERRA(DV_E_FORMATETC) - CHK_ERRA(DV_E_DVTARGETDEVICE) - CHK_ERRA(DV_E_STGMEDIUM) - CHK_ERRA(DV_E_STATDATA) - CHK_ERRA(DV_E_LINDEX) - CHK_ERRA(DV_E_TYMED) - CHK_ERRA(DV_E_CLIPFORMAT) - CHK_ERRA(DV_E_DVASPECT) - CHK_ERRA(DV_E_DVTARGETDEVICE_SIZE) - CHK_ERRA(DV_E_NOIVIEWOBJECT) - CHK_ERRA(DRAGDROP_E_FIRST) - CHK_ERRA(DRAGDROP_E_LAST) - CHK_ERRA(DRAGDROP_S_FIRST) - CHK_ERRA(DRAGDROP_S_LAST) -// CHK_ERRA(DRAGDROP_E_NOTREGISTERED) - CHK_ERRA(DRAGDROP_E_ALREADYREGISTERED) - CHK_ERRA(DRAGDROP_E_INVALIDHWND) - CHK_ERRA(CLASSFACTORY_E_FIRST) - CHK_ERRA(CLASSFACTORY_E_LAST) - CHK_ERRA(CLASSFACTORY_S_FIRST) - CHK_ERRA(CLASSFACTORY_S_LAST) -// CHK_ERRA(CLASS_E_NOAGGREGATION) - CHK_ERRA(CLASS_E_CLASSNOTAVAILABLE) - CHK_ERRA(CLASS_E_NOTLICENSED) - CHK_ERRA(MARSHAL_E_FIRST) - CHK_ERRA(MARSHAL_E_LAST) - CHK_ERRA(MARSHAL_S_FIRST) - CHK_ERRA(MARSHAL_S_LAST) - CHK_ERRA(DATA_E_FIRST) - CHK_ERRA(DATA_E_LAST) - CHK_ERRA(DATA_S_FIRST) - CHK_ERRA(DATA_S_LAST) - CHK_ERRA(VIEW_E_FIRST) - CHK_ERRA(VIEW_E_LAST) - CHK_ERRA(VIEW_S_FIRST) - CHK_ERRA(VIEW_S_LAST) -// CHK_ERRA(VIEW_E_DRAW) - CHK_ERRA(REGDB_E_FIRST) - CHK_ERRA(REGDB_E_LAST) - CHK_ERRA(REGDB_S_FIRST) - CHK_ERRA(REGDB_S_LAST) -// CHK_ERRA(REGDB_E_READREGDB) - CHK_ERRA(REGDB_E_WRITEREGDB) - CHK_ERRA(REGDB_E_KEYMISSING) - CHK_ERRA(REGDB_E_INVALIDVALUE) - CHK_ERRA(REGDB_E_CLASSNOTREG) - CHK_ERRA(REGDB_E_IIDNOTREG) - CHK_ERRA(CAT_E_FIRST) - CHK_ERRA(CAT_E_LAST) -// CHK_ERRA(CAT_E_CATIDNOEXIST) -// CHK_ERRA(CAT_E_NODESCRIPTION) - CHK_ERRA(CS_E_FIRST) - CHK_ERRA(CS_E_LAST) -// CHK_ERRA(CS_E_PACKAGE_NOTFOUND) - CHK_ERRA(CS_E_NOT_DELETABLE) - CHK_ERRA(CS_E_CLASS_NOTFOUND) - CHK_ERRA(CS_E_INVALID_VERSION) - CHK_ERRA(CS_E_NO_CLASSSTORE) - CHK_ERRA(CS_E_OBJECT_NOTFOUND) - CHK_ERRA(CS_E_OBJECT_ALREADY_EXISTS) - CHK_ERRA(CS_E_INVALID_PATH) - CHK_ERRA(CS_E_NETWORK_ERROR) - CHK_ERRA(CS_E_ADMIN_LIMIT_EXCEEDED) - CHK_ERRA(CS_E_SCHEMA_MISMATCH) -// CHK_ERRA(CS_E_INTERNAL_ERROR) - CHK_ERRA(CACHE_E_FIRST) - CHK_ERRA(CACHE_E_LAST) - CHK_ERRA(CACHE_S_FIRST) - CHK_ERRA(CACHE_S_LAST) -// CHK_ERRA(CACHE_E_NOCACHE_UPDATED) - CHK_ERRA(OLEOBJ_E_FIRST) - CHK_ERRA(OLEOBJ_E_LAST) - CHK_ERRA(OLEOBJ_S_FIRST) - CHK_ERRA(OLEOBJ_S_LAST) -// CHK_ERRA(OLEOBJ_E_NOVERBS) - CHK_ERRA(OLEOBJ_E_INVALIDVERB) - CHK_ERRA(CLIENTSITE_E_FIRST) - CHK_ERRA(CLIENTSITE_E_LAST) - CHK_ERRA(CLIENTSITE_S_FIRST) - CHK_ERRA(CLIENTSITE_S_LAST) - CHK_ERRA(INPLACE_E_NOTUNDOABLE) - CHK_ERRA(INPLACE_E_NOTOOLSPACE) -// CHK_ERRA(INPLACE_E_FIRST) - CHK_ERRA(INPLACE_E_LAST) - CHK_ERRA(INPLACE_S_FIRST) - CHK_ERRA(INPLACE_S_LAST) - CHK_ERRA(ENUM_E_FIRST) - CHK_ERRA(ENUM_E_LAST) - CHK_ERRA(ENUM_S_FIRST) - CHK_ERRA(ENUM_S_LAST) - CHK_ERRA(CONVERT10_E_FIRST) - CHK_ERRA(CONVERT10_E_LAST) - CHK_ERRA(CONVERT10_S_FIRST) - CHK_ERRA(CONVERT10_S_LAST) -// CHK_ERRA(CONVERT10_E_OLESTREAM_GET) - CHK_ERRA(CONVERT10_E_OLESTREAM_PUT) - CHK_ERRA(CONVERT10_E_OLESTREAM_FMT) - CHK_ERRA(CONVERT10_E_OLESTREAM_BITMAP_TO_DIB) - CHK_ERRA(CONVERT10_E_STG_FMT) - CHK_ERRA(CONVERT10_E_STG_NO_STD_STREAM) - CHK_ERRA(CONVERT10_E_STG_DIB_TO_BITMAP) - CHK_ERRA(CLIPBRD_E_FIRST) - CHK_ERRA(CLIPBRD_E_LAST) - CHK_ERRA(CLIPBRD_S_FIRST) - CHK_ERRA(CLIPBRD_S_LAST) -// CHK_ERRA(CLIPBRD_E_CANT_OPEN) - CHK_ERRA(CLIPBRD_E_CANT_EMPTY) - CHK_ERRA(CLIPBRD_E_CANT_SET) - CHK_ERRA(CLIPBRD_E_BAD_DATA) - CHK_ERRA(CLIPBRD_E_CANT_CLOSE) - CHK_ERRA(MK_E_FIRST) - CHK_ERRA(MK_E_LAST) - CHK_ERRA(MK_S_FIRST) - CHK_ERRA(MK_S_LAST) -// CHK_ERRA(MK_E_CONNECTMANUALLY) - CHK_ERRA(MK_E_EXCEEDEDDEADLINE) - CHK_ERRA(MK_E_NEEDGENERIC) - CHK_ERRA(MK_E_UNAVAILABLE) - CHK_ERRA(MK_E_SYNTAX) - CHK_ERRA(MK_E_NOOBJECT) - CHK_ERRA(MK_E_INVALIDEXTENSION) - CHK_ERRA(MK_E_INTERMEDIATEINTERFACENOTSUPPORTED) - CHK_ERRA(MK_E_NOTBINDABLE) - CHK_ERRA(MK_E_NOTBOUND) - CHK_ERRA(MK_E_CANTOPENFILE) - CHK_ERRA(MK_E_MUSTBOTHERUSER) - CHK_ERRA(MK_E_NOINVERSE) - CHK_ERRA(MK_E_NOSTORAGE) - CHK_ERRA(MK_E_NOPREFIX) -// CHK_ERRA(MK_E_ENUMERATION_FAILED) - CHK_ERRA(CO_E_NOTINITIALIZED) - CHK_ERRA(CO_E_ALREADYINITIALIZED) - CHK_ERRA(CO_E_CANTDETERMINECLASS) - CHK_ERRA(CO_E_CLASSSTRING) - CHK_ERRA(CO_E_IIDSTRING) - CHK_ERRA(CO_E_APPNOTFOUND) - CHK_ERRA(CO_E_APPSINGLEUSE) - CHK_ERRA(CO_E_ERRORINAPP) - CHK_ERRA(CO_E_DLLNOTFOUND) - CHK_ERRA(CO_E_ERRORINDLL) - CHK_ERRA(CO_E_WRONGOSFORAPP) - CHK_ERRA(CO_E_OBJNOTREG) - CHK_ERRA(CO_E_OBJISREG) - CHK_ERRA(CO_E_OBJNOTCONNECTED) - CHK_ERRA(CO_E_APPDIDNTREG) - CHK_ERRA(CO_E_RELEASED) -// CHK_ERRA(OLE_S_USEREG) - CHK_ERRA(OLE_S_STATIC) - CHK_ERRA(OLE_S_MAC_CLIPFORMAT) -// CHK_ERRA(DRAGDROP_S_DROP) - CHK_ERRA(DRAGDROP_S_CANCEL) - CHK_ERRA(DRAGDROP_S_USEDEFAULTCURSORS) -// CHK_ERRA(DATA_S_SAMEFORMATETC) -// CHK_ERRA(VIEW_S_ALREADY_FROZEN) -// CHK_ERRA(CACHE_S_FORMATETC_NOTSUPPORTED) - CHK_ERRA(CACHE_S_SAMECACHE) - CHK_ERRA(CACHE_S_SOMECACHES_NOTUPDATED) -// CHK_ERRA(OLEOBJ_S_INVALIDVERB) - CHK_ERRA(OLEOBJ_S_CANNOT_DOVERB_NOW) - CHK_ERRA(OLEOBJ_S_INVALIDHWND) -// CHK_ERRA(INPLACE_S_TRUNCATED) -// CHK_ERRA(CONVERT10_S_NO_PRESENTATION) - CHK_ERRA(MK_S_REDUCED_TO_SELF) - CHK_ERRA(MK_S_ME) - CHK_ERRA(MK_S_HIM) - CHK_ERRA(MK_S_US) - CHK_ERRA(MK_S_MONIKERALREADYREGISTERED) - CHK_ERRA(CO_E_CLASS_CREATE_FAILED) - CHK_ERRA(CO_E_SCM_ERROR) - CHK_ERRA(CO_E_SCM_RPC_FAILURE) - CHK_ERRA(CO_E_BAD_PATH) - CHK_ERRA(CO_E_SERVER_EXEC_FAILURE) - CHK_ERRA(CO_E_OBJSRV_RPC_FAILURE) - CHK_ERRA(MK_E_NO_NORMALIZED) - CHK_ERRA(CO_E_SERVER_STOPPING) - CHK_ERRA(MEM_E_INVALID_ROOT) - CHK_ERRA(MEM_E_INVALID_LINK) - CHK_ERRA(MEM_E_INVALID_SIZE) - CHK_ERRA(CO_S_NOTALLINTERFACES) - CHK_ERRA(DISP_E_UNKNOWNINTERFACE) - CHK_ERRA(DISP_E_MEMBERNOTFOUND) - CHK_ERRA(DISP_E_PARAMNOTFOUND) - CHK_ERRA(DISP_E_TYPEMISMATCH) - CHK_ERRA(DISP_E_UNKNOWNNAME) - CHK_ERRA(DISP_E_NONAMEDARGS) - CHK_ERRA(DISP_E_BADVARTYPE) - CHK_ERRA(DISP_E_EXCEPTION) - CHK_ERRA(DISP_E_OVERFLOW) - CHK_ERRA(DISP_E_BADINDEX) - CHK_ERRA(DISP_E_UNKNOWNLCID) - CHK_ERRA(DISP_E_ARRAYISLOCKED) - CHK_ERRA(DISP_E_BADPARAMCOUNT) - CHK_ERRA(DISP_E_PARAMNOTOPTIONAL) - CHK_ERRA(DISP_E_BADCALLEE) - CHK_ERRA(DISP_E_NOTACOLLECTION) - CHK_ERRA(DISP_E_DIVBYZERO) - CHK_ERRA(DISP_E_BUFFERTOOSMALL) - CHK_ERRA(TYPE_E_BUFFERTOOSMALL) - CHK_ERRA(TYPE_E_FIELDNOTFOUND) - CHK_ERRA(TYPE_E_INVDATAREAD) - CHK_ERRA(TYPE_E_UNSUPFORMAT) - CHK_ERRA(TYPE_E_REGISTRYACCESS) - CHK_ERRA(TYPE_E_LIBNOTREGISTERED) - CHK_ERRA(TYPE_E_UNDEFINEDTYPE) - CHK_ERRA(TYPE_E_QUALIFIEDNAMEDISALLOWED) - CHK_ERRA(TYPE_E_INVALIDSTATE) - CHK_ERRA(TYPE_E_WRONGTYPEKIND) - CHK_ERRA(TYPE_E_ELEMENTNOTFOUND) - CHK_ERRA(TYPE_E_AMBIGUOUSNAME) - CHK_ERRA(TYPE_E_NAMECONFLICT) - CHK_ERRA(TYPE_E_UNKNOWNLCID) - CHK_ERRA(TYPE_E_DLLFUNCTIONNOTFOUND) - CHK_ERRA(TYPE_E_BADMODULEKIND) - CHK_ERRA(TYPE_E_SIZETOOBIG) - CHK_ERRA(TYPE_E_DUPLICATEID) - CHK_ERRA(TYPE_E_INVALIDID) - CHK_ERRA(TYPE_E_TYPEMISMATCH) - CHK_ERRA(TYPE_E_OUTOFBOUNDS) - CHK_ERRA(TYPE_E_IOERROR) - CHK_ERRA(TYPE_E_CANTCREATETMPFILE) - CHK_ERRA(TYPE_E_CANTLOADLIBRARY) - CHK_ERRA(TYPE_E_INCONSISTENTPROPFUNCS) - CHK_ERRA(TYPE_E_CIRCULARTYPE) - CHK_ERRA(STG_E_INVALIDFUNCTION) - CHK_ERRA(STG_E_FILENOTFOUND) - CHK_ERRA(STG_E_PATHNOTFOUND) - CHK_ERRA(STG_E_TOOMANYOPENFILES) - CHK_ERRA(STG_E_ACCESSDENIED) - CHK_ERRA(STG_E_INVALIDHANDLE) - CHK_ERRA(STG_E_INSUFFICIENTMEMORY) - CHK_ERRA(STG_E_INVALIDPOINTER) - CHK_ERRA(STG_E_NOMOREFILES) - CHK_ERRA(STG_E_DISKISWRITEPROTECTED) - CHK_ERRA(STG_E_SEEKERROR) - CHK_ERRA(STG_E_WRITEFAULT) - CHK_ERRA(STG_E_READFAULT) - CHK_ERRA(STG_E_SHAREVIOLATION) - CHK_ERRA(STG_E_LOCKVIOLATION) - CHK_ERRA(STG_E_FILEALREADYEXISTS) - CHK_ERRA(STG_E_INVALIDPARAMETER) - CHK_ERRA(STG_E_MEDIUMFULL) - CHK_ERRA(STG_E_PROPSETMISMATCHED) - CHK_ERRA(STG_E_ABNORMALAPIEXIT) - CHK_ERRA(STG_E_INVALIDHEADER) - CHK_ERRA(STG_E_INVALIDNAME) - CHK_ERRA(STG_E_UNKNOWN) - CHK_ERRA(STG_E_UNIMPLEMENTEDFUNCTION) - CHK_ERRA(STG_E_INVALIDFLAG) - CHK_ERRA(STG_E_INUSE) - CHK_ERRA(STG_E_NOTCURRENT) - CHK_ERRA(STG_E_REVERTED) - CHK_ERRA(STG_E_CANTSAVE) - CHK_ERRA(STG_E_OLDFORMAT) - CHK_ERRA(STG_E_OLDDLL) - CHK_ERRA(STG_E_SHAREREQUIRED) - CHK_ERRA(STG_E_NOTFILEBASEDSTORAGE) - CHK_ERRA(STG_E_EXTANTMARSHALLINGS) - CHK_ERRA(STG_E_DOCFILECORRUPT) - CHK_ERRA(STG_E_BADBASEADDRESS) - CHK_ERRA(STG_E_DOCFILETOOLARGE) - CHK_ERRA(STG_E_NOTSIMPLEFORMAT) - CHK_ERRA(STG_E_INCOMPLETE) - CHK_ERRA(STG_E_TERMINATED) - CHK_ERRA(STG_S_CONVERTED) - CHK_ERRA(STG_S_BLOCK) - CHK_ERRA(STG_S_RETRYNOW) - CHK_ERRA(STG_S_MONITORING) - CHK_ERRA(STG_S_MULTIPLEOPENS) - CHK_ERRA(STG_S_CONSOLIDATIONFAILED) - CHK_ERRA(STG_S_CANNOTCONSOLIDATE) - CHK_ERRA(RPC_E_CALL_REJECTED) - CHK_ERRA(RPC_E_CALL_CANCELED) - CHK_ERRA(RPC_E_CANTPOST_INSENDCALL) - CHK_ERRA(RPC_E_CANTCALLOUT_INASYNCCALL) - CHK_ERRA(RPC_E_CANTCALLOUT_INEXTERNALCALL) - CHK_ERRA(RPC_E_CONNECTION_TERMINATED) - CHK_ERRA(RPC_E_SERVER_DIED) - CHK_ERRA(RPC_E_CLIENT_DIED) - CHK_ERRA(RPC_E_INVALID_DATAPACKET) - CHK_ERRA(RPC_E_CANTTRANSMIT_CALL) - CHK_ERRA(RPC_E_CLIENT_CANTMARSHAL_DATA) - CHK_ERRA(RPC_E_CLIENT_CANTUNMARSHAL_DATA) - CHK_ERRA(RPC_E_SERVER_CANTMARSHAL_DATA) - CHK_ERRA(RPC_E_SERVER_CANTUNMARSHAL_DATA) - CHK_ERRA(RPC_E_INVALID_DATA) - CHK_ERRA(RPC_E_INVALID_PARAMETER) - CHK_ERRA(RPC_E_CANTCALLOUT_AGAIN) - CHK_ERRA(RPC_E_SERVER_DIED_DNE) - CHK_ERRA(RPC_E_SYS_CALL_FAILED) - CHK_ERRA(RPC_E_OUT_OF_RESOURCES) - CHK_ERRA(RPC_E_ATTEMPTED_MULTITHREAD) - CHK_ERRA(RPC_E_NOT_REGISTERED) - CHK_ERRA(RPC_E_FAULT) - CHK_ERRA(RPC_E_SERVERFAULT) - CHK_ERRA(RPC_E_CHANGED_MODE) - CHK_ERRA(RPC_E_INVALIDMETHOD) - CHK_ERRA(RPC_E_DISCONNECTED) - CHK_ERRA(RPC_E_RETRY) - CHK_ERRA(RPC_E_SERVERCALL_RETRYLATER) - CHK_ERRA(RPC_E_SERVERCALL_REJECTED) - CHK_ERRA(RPC_E_INVALID_CALLDATA) - CHK_ERRA(RPC_E_CANTCALLOUT_ININPUTSYNCCALL) - CHK_ERRA(RPC_E_WRONG_THREAD) - CHK_ERRA(RPC_E_THREAD_NOT_INIT) - CHK_ERRA(RPC_E_VERSION_MISMATCH) - CHK_ERRA(RPC_E_INVALID_HEADER) - CHK_ERRA(RPC_E_INVALID_EXTENSION) - CHK_ERRA(RPC_E_INVALID_IPID) - CHK_ERRA(RPC_E_INVALID_OBJECT) - CHK_ERRA(RPC_S_CALLPENDING) - CHK_ERRA(RPC_S_WAITONTIMER) - CHK_ERRA(RPC_E_CALL_COMPLETE) - CHK_ERRA(RPC_E_UNSECURE_CALL) - CHK_ERRA(RPC_E_TOO_LATE) - CHK_ERRA(RPC_E_NO_GOOD_SECURITY_PACKAGES) - CHK_ERRA(RPC_E_ACCESS_DENIED) - CHK_ERRA(RPC_E_REMOTE_DISABLED) - CHK_ERRA(RPC_E_INVALID_OBJREF) - CHK_ERRA(RPC_E_NO_CONTEXT) - CHK_ERRA(RPC_E_TIMEOUT) - CHK_ERRA(RPC_E_NO_SYNC) - CHK_ERRA(RPC_E_FULLSIC_REQUIRED) - CHK_ERRA(RPC_E_INVALID_STD_NAME) - CHK_ERRA(CO_E_FAILEDTOIMPERSONATE) - CHK_ERRA(CO_E_FAILEDTOGETSECCTX) - CHK_ERRA(CO_E_FAILEDTOOPENTHREADTOKEN) - CHK_ERRA(CO_E_FAILEDTOGETTOKENINFO) - CHK_ERRA(CO_E_TRUSTEEDOESNTMATCHCLIENT) - CHK_ERRA(CO_E_FAILEDTOQUERYCLIENTBLANKET) - CHK_ERRA(CO_E_FAILEDTOSETDACL) - CHK_ERRA(CO_E_ACCESSCHECKFAILED) - CHK_ERRA(CO_E_NETACCESSAPIFAILED) - CHK_ERRA(CO_E_WRONGTRUSTEENAMESYNTAX) - CHK_ERRA(CO_E_INVALIDSID) - CHK_ERRA(CO_E_CONVERSIONFAILED) - CHK_ERRA(CO_E_NOMATCHINGSIDFOUND) - CHK_ERRA(CO_E_LOOKUPACCSIDFAILED) - CHK_ERRA(CO_E_NOMATCHINGNAMEFOUND) - CHK_ERRA(CO_E_LOOKUPACCNAMEFAILED) - CHK_ERRA(CO_E_SETSERLHNDLFAILED) - CHK_ERRA(CO_E_FAILEDTOGETWINDIR) - CHK_ERRA(CO_E_PATHTOOLONG) - CHK_ERRA(CO_E_FAILEDTOGENUUID) - CHK_ERRA(CO_E_FAILEDTOCREATEFILE) - CHK_ERRA(CO_E_FAILEDTOCLOSEHANDLE) - CHK_ERRA(CO_E_EXCEEDSYSACLLIMIT) - CHK_ERRA(CO_E_ACESINWRONGORDER) - CHK_ERRA(CO_E_INCOMPATIBLESTREAMVERSION) - CHK_ERRA(CO_E_FAILEDTOOPENPROCESSTOKEN) - CHK_ERRA(CO_E_DECODEFAILED) - CHK_ERRA(CO_E_ACNOTINITIALIZED) - CHK_ERRA(RPC_E_UNEXPECTED) - CHK_ERRA(NTE_BAD_UID) - CHK_ERRA(NTE_BAD_HASH) - CHK_ERRA(NTE_BAD_KEY) - CHK_ERRA(NTE_BAD_LEN) - CHK_ERRA(NTE_BAD_DATA) - CHK_ERRA(NTE_BAD_SIGNATURE) - CHK_ERRA(NTE_BAD_VER) - CHK_ERRA(NTE_BAD_ALGID) - CHK_ERRA(NTE_BAD_FLAGS) - CHK_ERRA(NTE_BAD_TYPE) - CHK_ERRA(NTE_BAD_KEY_STATE) - CHK_ERRA(NTE_BAD_HASH_STATE) - CHK_ERRA(NTE_NO_KEY) - CHK_ERRA(NTE_NO_MEMORY) - CHK_ERRA(NTE_EXISTS) - CHK_ERRA(NTE_PERM) - CHK_ERRA(NTE_NOT_FOUND) - CHK_ERRA(NTE_DOUBLE_ENCRYPT) - CHK_ERRA(NTE_BAD_PROVIDER) - CHK_ERRA(NTE_BAD_PROV_TYPE) - CHK_ERRA(NTE_BAD_PUBLIC_KEY) - CHK_ERRA(NTE_BAD_KEYSET) - CHK_ERRA(NTE_PROV_TYPE_NOT_DEF) - CHK_ERRA(NTE_PROV_TYPE_ENTRY_BAD) - CHK_ERRA(NTE_KEYSET_NOT_DEF) - CHK_ERRA(NTE_KEYSET_ENTRY_BAD) - CHK_ERRA(NTE_PROV_TYPE_NO_MATCH) - CHK_ERRA(NTE_SIGNATURE_FILE_BAD) - CHK_ERRA(NTE_PROVIDER_DLL_FAIL) - CHK_ERRA(NTE_PROV_DLL_NOT_FOUND) - CHK_ERRA(NTE_BAD_KEYSET_PARAM) - CHK_ERRA(NTE_FAIL) - CHK_ERRA(NTE_SYS_ERR) - CHK_ERRA(NTE_SILENT_CONTEXT) - CHK_ERRA(NTE_TOKEN_KEYSET_STORAGE_FULL) - CHK_ERRA(CRYPT_E_MSG_ERROR) - CHK_ERRA(CRYPT_E_UNKNOWN_ALGO) - CHK_ERRA(CRYPT_E_OID_FORMAT) - CHK_ERRA(CRYPT_E_INVALID_MSG_TYPE) - CHK_ERRA(CRYPT_E_UNEXPECTED_ENCODING) - CHK_ERRA(CRYPT_E_AUTH_ATTR_MISSING) - CHK_ERRA(CRYPT_E_HASH_VALUE) - CHK_ERRA(CRYPT_E_INVALID_INDEX) - CHK_ERRA(CRYPT_E_ALREADY_DECRYPTED) - CHK_ERRA(CRYPT_E_NOT_DECRYPTED) - CHK_ERRA(CRYPT_E_RECIPIENT_NOT_FOUND) - CHK_ERRA(CRYPT_E_CONTROL_TYPE) - CHK_ERRA(CRYPT_E_ISSUER_SERIALNUMBER) - CHK_ERRA(CRYPT_E_SIGNER_NOT_FOUND) - CHK_ERRA(CRYPT_E_ATTRIBUTES_MISSING) - CHK_ERRA(CRYPT_E_STREAM_MSG_NOT_READY) - CHK_ERRA(CRYPT_E_STREAM_INSUFFICIENT_DATA) - CHK_ERRA(CRYPT_E_BAD_LEN) - CHK_ERRA(CRYPT_E_BAD_ENCODE) - CHK_ERRA(CRYPT_E_FILE_ERROR) - CHK_ERRA(CRYPT_E_NOT_FOUND) - CHK_ERRA(CRYPT_E_EXISTS) - CHK_ERRA(CRYPT_E_NO_PROVIDER) - CHK_ERRA(CRYPT_E_SELF_SIGNED) - CHK_ERRA(CRYPT_E_DELETED_PREV) - CHK_ERRA(CRYPT_E_NO_MATCH) - CHK_ERRA(CRYPT_E_UNEXPECTED_MSG_TYPE) - CHK_ERRA(CRYPT_E_NO_KEY_PROPERTY) - CHK_ERRA(CRYPT_E_NO_DECRYPT_CERT) - CHK_ERRA(CRYPT_E_BAD_MSG) - CHK_ERRA(CRYPT_E_NO_SIGNER) - CHK_ERRA(CRYPT_E_PENDING_CLOSE) - CHK_ERRA(CRYPT_E_REVOKED) - CHK_ERRA(CRYPT_E_NO_REVOCATION_DLL) - CHK_ERRA(CRYPT_E_NO_REVOCATION_CHECK) - CHK_ERRA(CRYPT_E_REVOCATION_OFFLINE) - CHK_ERRA(CRYPT_E_NOT_IN_REVOCATION_DATABASE) - CHK_ERRA(CRYPT_E_INVALID_NUMERIC_STRING) - CHK_ERRA(CRYPT_E_INVALID_PRINTABLE_STRING) - CHK_ERRA(CRYPT_E_INVALID_IA5_STRING) - CHK_ERRA(CRYPT_E_INVALID_X500_STRING) - CHK_ERRA(CRYPT_E_NOT_CHAR_STRING) - CHK_ERRA(CRYPT_E_FILERESIZED) - CHK_ERRA(CRYPT_E_SECURITY_SETTINGS) - CHK_ERRA(CRYPT_E_NO_VERIFY_USAGE_DLL) - CHK_ERRA(CRYPT_E_NO_VERIFY_USAGE_CHECK) - CHK_ERRA(CRYPT_E_VERIFY_USAGE_OFFLINE) - CHK_ERRA(CRYPT_E_NOT_IN_CTL) - CHK_ERRA(CRYPT_E_NO_TRUSTED_SIGNER) - CHK_ERRA(CRYPT_E_OSS_ERROR) - CHK_ERRA(OSS_MORE_BUF) - CHK_ERRA(OSS_NEGATIVE_UINTEGER) - CHK_ERRA(OSS_PDU_RANGE) - CHK_ERRA(OSS_MORE_INPUT) - CHK_ERRA(OSS_DATA_ERROR) - CHK_ERRA(OSS_BAD_ARG) - CHK_ERRA(OSS_BAD_VERSION) - CHK_ERRA(OSS_OUT_MEMORY) - CHK_ERRA(OSS_PDU_MISMATCH) - CHK_ERRA(OSS_LIMITED) - CHK_ERRA(OSS_BAD_PTR) - CHK_ERRA(OSS_BAD_TIME) - CHK_ERRA(OSS_INDEFINITE_NOT_SUPPORTED) - CHK_ERRA(OSS_MEM_ERROR) - CHK_ERRA(OSS_BAD_TABLE) - CHK_ERRA(OSS_TOO_LONG) - CHK_ERRA(OSS_CONSTRAINT_VIOLATED) - CHK_ERRA(OSS_FATAL_ERROR) - CHK_ERRA(OSS_ACCESS_SERIALIZATION_ERROR) - CHK_ERRA(OSS_NULL_TBL) - CHK_ERRA(OSS_NULL_FCN) - CHK_ERRA(OSS_BAD_ENCRULES) - CHK_ERRA(OSS_UNAVAIL_ENCRULES) - CHK_ERRA(OSS_CANT_OPEN_TRACE_WINDOW) - CHK_ERRA(OSS_UNIMPLEMENTED) - CHK_ERRA(OSS_OID_DLL_NOT_LINKED) - CHK_ERRA(OSS_CANT_OPEN_TRACE_FILE) - CHK_ERRA(OSS_TRACE_FILE_ALREADY_OPEN) - CHK_ERRA(OSS_TABLE_MISMATCH) - CHK_ERRA(OSS_TYPE_NOT_SUPPORTED) - CHK_ERRA(OSS_REAL_DLL_NOT_LINKED) - CHK_ERRA(OSS_REAL_CODE_NOT_LINKED) - CHK_ERRA(OSS_OUT_OF_RANGE) - CHK_ERRA(OSS_COPIER_DLL_NOT_LINKED) - CHK_ERRA(OSS_CONSTRAINT_DLL_NOT_LINKED) - CHK_ERRA(OSS_COMPARATOR_DLL_NOT_LINKED) - CHK_ERRA(OSS_COMPARATOR_CODE_NOT_LINKED) - CHK_ERRA(OSS_MEM_MGR_DLL_NOT_LINKED) - CHK_ERRA(OSS_PDV_DLL_NOT_LINKED) - CHK_ERRA(OSS_PDV_CODE_NOT_LINKED) - CHK_ERRA(OSS_API_DLL_NOT_LINKED) - CHK_ERRA(OSS_BERDER_DLL_NOT_LINKED) - CHK_ERRA(OSS_PER_DLL_NOT_LINKED) - CHK_ERRA(OSS_OPEN_TYPE_ERROR) - CHK_ERRA(OSS_MUTEX_NOT_CREATED) - CHK_ERRA(OSS_CANT_CLOSE_TRACE_FILE) - CHK_ERRA(CERTSRV_E_BAD_REQUESTSUBJECT) - CHK_ERRA(CERTSRV_E_NO_REQUEST) - CHK_ERRA(CERTSRV_E_BAD_REQUESTSTATUS) - CHK_ERRA(CERTSRV_E_PROPERTY_EMPTY) - CHK_ERRA(CERTSRV_E_INVALID_CA_CERTIFICATE) - CHK_ERRA(CERTSRV_E_UNSUPPORTED_CERT_TYPE) - CHK_ERRA(CERTSRV_E_NO_CERT_TYPE) - CHK_ERRA(TRUST_E_SYSTEM_ERROR) - CHK_ERRA(TRUST_E_NO_SIGNER_CERT) - CHK_ERRA(TRUST_E_COUNTER_SIGNER) - CHK_ERRA(TRUST_E_CERT_SIGNATURE) - CHK_ERRA(TRUST_E_TIME_STAMP) - CHK_ERRA(TRUST_E_BAD_DIGEST) - CHK_ERRA(TRUST_E_BASIC_CONSTRAINTS) - CHK_ERRA(TRUST_E_FINANCIAL_CRITERIA) -// CHK_ERRA(NTE_OP_OK) - CHK_ERRA(TRUST_E_PROVIDER_UNKNOWN) - CHK_ERRA(TRUST_E_ACTION_UNKNOWN) - CHK_ERRA(TRUST_E_SUBJECT_FORM_UNKNOWN) - CHK_ERRA(TRUST_E_SUBJECT_NOT_TRUSTED) - CHK_ERRA(DIGSIG_E_ENCODE) - CHK_ERRA(DIGSIG_E_DECODE) - CHK_ERRA(DIGSIG_E_EXTENSIBILITY) - CHK_ERRA(DIGSIG_E_CRYPTO) - CHK_ERRA(PERSIST_E_SIZEDEFINITE) - CHK_ERRA(PERSIST_E_SIZEINDEFINITE) - CHK_ERRA(PERSIST_E_NOTSELFSIZING) - CHK_ERRA(TRUST_E_NOSIGNATURE) - CHK_ERRA(CERT_E_EXPIRED) - CHK_ERRA(CERT_E_VALIDITYPERIODNESTING) - CHK_ERRA(CERT_E_ROLE) - CHK_ERRA(CERT_E_PATHLENCONST) - CHK_ERRA(CERT_E_CRITICAL) - CHK_ERRA(CERT_E_PURPOSE) - CHK_ERRA(CERT_E_ISSUERCHAINING) - CHK_ERRA(CERT_E_MALFORMED) - CHK_ERRA(CERT_E_UNTRUSTEDROOT) - CHK_ERRA(CERT_E_CHAINING) - CHK_ERRA(TRUST_E_FAIL) - CHK_ERRA(CERT_E_REVOKED) - CHK_ERRA(CERT_E_UNTRUSTEDTESTROOT) - CHK_ERRA(CERT_E_REVOCATION_FAILURE) - CHK_ERRA(CERT_E_CN_NO_MATCH) - CHK_ERRA(CERT_E_WRONG_USAGE) - CHK_ERRA(SPAPI_E_EXPECTED_SECTION_NAME) - CHK_ERRA(SPAPI_E_BAD_SECTION_NAME_LINE) - CHK_ERRA(SPAPI_E_SECTION_NAME_TOO_LONG) - CHK_ERRA(SPAPI_E_GENERAL_SYNTAX) - CHK_ERRA(SPAPI_E_WRONG_INF_STYLE) - CHK_ERRA(SPAPI_E_SECTION_NOT_FOUND) - CHK_ERRA(SPAPI_E_LINE_NOT_FOUND) - CHK_ERRA(SPAPI_E_NO_BACKUP) - CHK_ERRA(SPAPI_E_NO_ASSOCIATED_CLASS) - CHK_ERRA(SPAPI_E_CLASS_MISMATCH) - CHK_ERRA(SPAPI_E_DUPLICATE_FOUND) - CHK_ERRA(SPAPI_E_NO_DRIVER_SELECTED) - CHK_ERRA(SPAPI_E_KEY_DOES_NOT_EXIST) - CHK_ERRA(SPAPI_E_INVALID_DEVINST_NAME) - CHK_ERRA(SPAPI_E_INVALID_CLASS) - CHK_ERRA(SPAPI_E_DEVINST_ALREADY_EXISTS) - CHK_ERRA(SPAPI_E_DEVINFO_NOT_REGISTERED) - CHK_ERRA(SPAPI_E_INVALID_REG_PROPERTY) - CHK_ERRA(SPAPI_E_NO_INF) - CHK_ERRA(SPAPI_E_NO_SUCH_DEVINST) - CHK_ERRA(SPAPI_E_CANT_LOAD_CLASS_ICON) - CHK_ERRA(SPAPI_E_INVALID_CLASS_INSTALLER) - CHK_ERRA(SPAPI_E_DI_DO_DEFAULT) - CHK_ERRA(SPAPI_E_DI_NOFILECOPY) - CHK_ERRA(SPAPI_E_INVALID_HWPROFILE) - CHK_ERRA(SPAPI_E_NO_DEVICE_SELECTED) - CHK_ERRA(SPAPI_E_DEVINFO_LIST_LOCKED) - CHK_ERRA(SPAPI_E_DEVINFO_DATA_LOCKED) - CHK_ERRA(SPAPI_E_DI_BAD_PATH) - CHK_ERRA(SPAPI_E_NO_CLASSINSTALL_PARAMS) - CHK_ERRA(SPAPI_E_FILEQUEUE_LOCKED) - CHK_ERRA(SPAPI_E_BAD_SERVICE_INSTALLSECT) - CHK_ERRA(SPAPI_E_NO_CLASS_DRIVER_LIST) - CHK_ERRA(SPAPI_E_NO_ASSOCIATED_SERVICE) - CHK_ERRA(SPAPI_E_NO_DEFAULT_DEVICE_INTERFACE) - CHK_ERRA(SPAPI_E_DEVICE_INTERFACE_ACTIVE) - CHK_ERRA(SPAPI_E_DEVICE_INTERFACE_REMOVED) - CHK_ERRA(SPAPI_E_BAD_INTERFACE_INSTALLSECT) - CHK_ERRA(SPAPI_E_NO_SUCH_INTERFACE_CLASS) - CHK_ERRA(SPAPI_E_INVALID_REFERENCE_STRING) - CHK_ERRA(SPAPI_E_INVALID_MACHINENAME) - CHK_ERRA(SPAPI_E_REMOTE_COMM_FAILURE) - CHK_ERRA(SPAPI_E_MACHINE_UNAVAILABLE) - CHK_ERRA(SPAPI_E_NO_CONFIGMGR_SERVICES) - CHK_ERRA(SPAPI_E_INVALID_PROPPAGE_PROVIDER) - CHK_ERRA(SPAPI_E_NO_SUCH_DEVICE_INTERFACE) - CHK_ERRA(SPAPI_E_DI_POSTPROCESSING_REQUIRED) - CHK_ERRA(SPAPI_E_INVALID_COINSTALLER) - CHK_ERRA(SPAPI_E_NO_COMPAT_DRIVERS) - CHK_ERRA(SPAPI_E_NO_DEVICE_ICON) - CHK_ERRA(SPAPI_E_INVALID_INF_LOGCONFIG) - CHK_ERRA(SPAPI_E_DI_DONT_INSTALL) - CHK_ERRA(SPAPI_E_INVALID_FILTER_DRIVER) - CHK_ERRA(SPAPI_E_NON_WINDOWS_NT_DRIVER) - CHK_ERRA(SPAPI_E_NON_WINDOWS_DRIVER) - CHK_ERRA(SPAPI_E_NO_CATALOG_FOR_OEM_INF) - CHK_ERRA(SPAPI_E_DEVINSTALL_QUEUE_NONNATIVE) - CHK_ERRA(SPAPI_E_ERROR_NOT_INSTALLED) -// CHK_ERRA(SCARD_S_SUCCESS) - CHK_ERRA(SCARD_F_INTERNAL_ERROR) - CHK_ERRA(SCARD_E_CANCELLED) - CHK_ERRA(SCARD_E_INVALID_HANDLE) - CHK_ERRA(SCARD_E_INVALID_PARAMETER) - CHK_ERRA(SCARD_E_INVALID_TARGET) - CHK_ERRA(SCARD_E_NO_MEMORY) - CHK_ERRA(SCARD_F_WAITED_TOO_LONG) - CHK_ERRA(SCARD_E_INSUFFICIENT_BUFFER) - CHK_ERRA(SCARD_E_UNKNOWN_READER) - CHK_ERRA(SCARD_E_TIMEOUT) - CHK_ERRA(SCARD_E_SHARING_VIOLATION) - CHK_ERRA(SCARD_E_NO_SMARTCARD) - CHK_ERRA(SCARD_E_UNKNOWN_CARD) - CHK_ERRA(SCARD_E_CANT_DISPOSE) - CHK_ERRA(SCARD_E_PROTO_MISMATCH) - CHK_ERRA(SCARD_E_NOT_READY) - CHK_ERRA(SCARD_E_INVALID_VALUE) - CHK_ERRA(SCARD_E_SYSTEM_CANCELLED) - CHK_ERRA(SCARD_F_COMM_ERROR) - CHK_ERRA(SCARD_F_UNKNOWN_ERROR) - CHK_ERRA(SCARD_E_INVALID_ATR) - CHK_ERRA(SCARD_E_NOT_TRANSACTED) - CHK_ERRA(SCARD_E_READER_UNAVAILABLE) - CHK_ERRA(SCARD_P_SHUTDOWN) - CHK_ERRA(SCARD_E_PCI_TOO_SMALL) - CHK_ERRA(SCARD_E_READER_UNSUPPORTED) - CHK_ERRA(SCARD_E_DUPLICATE_READER) - CHK_ERRA(SCARD_E_CARD_UNSUPPORTED) - CHK_ERRA(SCARD_E_NO_SERVICE) - CHK_ERRA(SCARD_E_SERVICE_STOPPED) - CHK_ERRA(SCARD_E_UNEXPECTED) - CHK_ERRA(SCARD_E_ICC_INSTALLATION) - CHK_ERRA(SCARD_E_ICC_CREATEORDER) - CHK_ERRA(SCARD_E_UNSUPPORTED_FEATURE) - CHK_ERRA(SCARD_E_DIR_NOT_FOUND) - CHK_ERRA(SCARD_E_FILE_NOT_FOUND) - CHK_ERRA(SCARD_E_NO_DIR) - CHK_ERRA(SCARD_E_NO_FILE) - CHK_ERRA(SCARD_E_NO_ACCESS) - CHK_ERRA(SCARD_E_WRITE_TOO_MANY) - CHK_ERRA(SCARD_E_BAD_SEEK) - CHK_ERRA(SCARD_E_INVALID_CHV) - CHK_ERRA(SCARD_E_UNKNOWN_RES_MNG) - CHK_ERRA(SCARD_E_NO_SUCH_CERTIFICATE) - CHK_ERRA(SCARD_E_CERTIFICATE_UNAVAILABLE) - CHK_ERRA(SCARD_E_NO_READERS_AVAILABLE) - CHK_ERRA(SCARD_E_COMM_DATA_LOST) - CHK_ERRA(SCARD_W_UNSUPPORTED_CARD) - CHK_ERRA(SCARD_W_UNRESPONSIVE_CARD) - CHK_ERRA(SCARD_W_UNPOWERED_CARD) - CHK_ERRA(SCARD_W_RESET_CARD) - CHK_ERRA(SCARD_W_REMOVED_CARD) - CHK_ERRA(SCARD_W_SECURITY_VIOLATION) - CHK_ERRA(SCARD_W_WRONG_CHV) - CHK_ERRA(SCARD_W_CHV_BLOCKED) - CHK_ERRA(SCARD_W_EOF) - CHK_ERRA(SCARD_W_CANCELLED_BY_USER) - CHK_ERR_WIN32_ONLY(ERROR_INVALID_FUNCTION, "ERROR_INVALID_FUNCTION") - CHK_ERR_WIN32A(ERROR_FILE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_PATH_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_TOO_MANY_OPEN_FILES) - CHK_ERRA(ERROR_ACCESS_DENIED) - CHK_ERRA(ERROR_INVALID_HANDLE) - CHK_ERR_WIN32A(ERROR_ARENA_TRASHED) - CHK_ERR_WIN32A(ERROR_NOT_ENOUGH_MEMORY) - CHK_ERR_WIN32A(ERROR_INVALID_BLOCK) - CHK_ERR_WIN32A(ERROR_BAD_ENVIRONMENT) - CHK_ERR_WIN32A(ERROR_BAD_FORMAT) - CHK_ERR_WIN32A(ERROR_INVALID_ACCESS) - CHK_ERR_WIN32A(ERROR_INVALID_DATA) - CHK_ERRA(ERROR_OUTOFMEMORY) - CHK_ERR_WIN32A(ERROR_INVALID_DRIVE) - CHK_ERR_WIN32A(ERROR_CURRENT_DIRECTORY) - CHK_ERR_WIN32A(ERROR_NOT_SAME_DEVICE) - CHK_ERR_WIN32A(ERROR_NO_MORE_FILES) - CHK_ERR_WIN32A(ERROR_WRITE_PROTECT) - CHK_ERR_WIN32A(ERROR_BAD_UNIT) - CHK_ERR_WIN32A(ERROR_NOT_READY) - CHK_ERR_WIN32A(ERROR_BAD_COMMAND) - CHK_ERR_WIN32A(ERROR_CRC) - CHK_ERR_WIN32A(ERROR_BAD_LENGTH) - CHK_ERR_WIN32A(ERROR_SEEK) - CHK_ERR_WIN32A(ERROR_NOT_DOS_DISK) - CHK_ERR_WIN32A(ERROR_SECTOR_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_OUT_OF_PAPER) - CHK_ERR_WIN32A(ERROR_WRITE_FAULT) - CHK_ERR_WIN32A(ERROR_READ_FAULT) - CHK_ERR_WIN32A(ERROR_GEN_FAILURE) - CHK_ERR_WIN32A(ERROR_SHARING_VIOLATION) - CHK_ERR_WIN32A(ERROR_LOCK_VIOLATION) - CHK_ERR_WIN32A(ERROR_WRONG_DISK) - CHK_ERR_WIN32A(ERROR_SHARING_BUFFER_EXCEEDED) - CHK_ERR_WIN32A(ERROR_HANDLE_EOF) - CHK_ERR_WIN32A(ERROR_HANDLE_DISK_FULL) - CHK_ERR_WIN32A(ERROR_NOT_SUPPORTED) - CHK_ERR_WIN32A(ERROR_REM_NOT_LIST) - CHK_ERR_WIN32A(ERROR_DUP_NAME) - CHK_ERR_WIN32A(ERROR_BAD_NETPATH) - CHK_ERR_WIN32A(ERROR_NETWORK_BUSY) - CHK_ERR_WIN32A(ERROR_DEV_NOT_EXIST) - CHK_ERR_WIN32A(ERROR_TOO_MANY_CMDS) - CHK_ERR_WIN32A(ERROR_ADAP_HDW_ERR) - CHK_ERR_WIN32A(ERROR_BAD_NET_RESP) - CHK_ERR_WIN32A(ERROR_UNEXP_NET_ERR) - CHK_ERR_WIN32A(ERROR_BAD_REM_ADAP) - CHK_ERR_WIN32A(ERROR_PRINTQ_FULL) - CHK_ERR_WIN32A(ERROR_NO_SPOOL_SPACE) - CHK_ERR_WIN32A(ERROR_PRINT_CANCELLED) - CHK_ERR_WIN32A(ERROR_NETNAME_DELETED) - CHK_ERR_WIN32A(ERROR_NETWORK_ACCESS_DENIED) - CHK_ERR_WIN32A(ERROR_BAD_DEV_TYPE) - CHK_ERR_WIN32A(ERROR_BAD_NET_NAME) - CHK_ERR_WIN32A(ERROR_TOO_MANY_NAMES) - CHK_ERR_WIN32A(ERROR_TOO_MANY_SESS) - CHK_ERR_WIN32A(ERROR_SHARING_PAUSED) - CHK_ERR_WIN32A(ERROR_REQ_NOT_ACCEP) - CHK_ERR_WIN32A(ERROR_REDIR_PAUSED) - CHK_ERR_WIN32A(ERROR_FILE_EXISTS) - CHK_ERR_WIN32A(ERROR_CANNOT_MAKE) - CHK_ERR_WIN32A(ERROR_FAIL_I24) - CHK_ERR_WIN32A(ERROR_OUT_OF_STRUCTURES) - CHK_ERR_WIN32A(ERROR_ALREADY_ASSIGNED) - CHK_ERR_WIN32A(ERROR_INVALID_PASSWORD) - CHK_ERRA(ERROR_INVALID_PARAMETER) - CHK_ERR_WIN32A(ERROR_NET_WRITE_FAULT) - CHK_ERR_WIN32A(ERROR_NO_PROC_SLOTS) - CHK_ERR_WIN32A(ERROR_TOO_MANY_SEMAPHORES) - CHK_ERR_WIN32A(ERROR_EXCL_SEM_ALREADY_OWNED) - CHK_ERR_WIN32A(ERROR_SEM_IS_SET) - CHK_ERR_WIN32A(ERROR_TOO_MANY_SEM_REQUESTS) - CHK_ERR_WIN32A(ERROR_INVALID_AT_INTERRUPT_TIME) - CHK_ERR_WIN32A(ERROR_SEM_OWNER_DIED) - CHK_ERR_WIN32A(ERROR_SEM_USER_LIMIT) - CHK_ERR_WIN32A(ERROR_DISK_CHANGE) - CHK_ERR_WIN32A(ERROR_DRIVE_LOCKED) - CHK_ERR_WIN32A(ERROR_BROKEN_PIPE) - CHK_ERR_WIN32A(ERROR_OPEN_FAILED) - CHK_ERR_WIN32A(ERROR_BUFFER_OVERFLOW) - CHK_ERR_WIN32A(ERROR_DISK_FULL) - CHK_ERR_WIN32A(ERROR_NO_MORE_SEARCH_HANDLES) - CHK_ERR_WIN32A(ERROR_INVALID_TARGET_HANDLE) - CHK_ERR_WIN32A(ERROR_INVALID_CATEGORY) - CHK_ERR_WIN32A(ERROR_INVALID_VERIFY_SWITCH) - CHK_ERR_WIN32A(ERROR_BAD_DRIVER_LEVEL) - CHK_ERR_WIN32A(ERROR_CALL_NOT_IMPLEMENTED) - CHK_ERR_WIN32A(ERROR_SEM_TIMEOUT) - CHK_ERR_WIN32A(ERROR_INSUFFICIENT_BUFFER) - CHK_ERR_WIN32A(ERROR_INVALID_NAME) - CHK_ERR_WIN32A(ERROR_INVALID_LEVEL) - CHK_ERR_WIN32A(ERROR_NO_VOLUME_LABEL) - CHK_ERR_WIN32A(ERROR_MOD_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_PROC_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_WAIT_NO_CHILDREN) - CHK_ERR_WIN32A(ERROR_CHILD_NOT_COMPLETE) - CHK_ERR_WIN32A(ERROR_DIRECT_ACCESS_HANDLE) - CHK_ERR_WIN32A(ERROR_NEGATIVE_SEEK) - CHK_ERR_WIN32A(ERROR_SEEK_ON_DEVICE) - CHK_ERR_WIN32A(ERROR_IS_JOIN_TARGET) - CHK_ERR_WIN32A(ERROR_IS_JOINED) - CHK_ERR_WIN32A(ERROR_IS_SUBSTED) - CHK_ERR_WIN32A(ERROR_NOT_JOINED) - CHK_ERR_WIN32A(ERROR_NOT_SUBSTED) - CHK_ERR_WIN32A(ERROR_JOIN_TO_JOIN) - CHK_ERR_WIN32A(ERROR_SUBST_TO_SUBST) - CHK_ERR_WIN32A(ERROR_JOIN_TO_SUBST) - CHK_ERR_WIN32A(ERROR_SUBST_TO_JOIN) - CHK_ERR_WIN32A(ERROR_BUSY_DRIVE) - CHK_ERR_WIN32A(ERROR_SAME_DRIVE) - CHK_ERR_WIN32A(ERROR_DIR_NOT_ROOT) - CHK_ERR_WIN32A(ERROR_DIR_NOT_EMPTY) - CHK_ERR_WIN32A(ERROR_IS_SUBST_PATH) - CHK_ERR_WIN32A(ERROR_IS_JOIN_PATH) - CHK_ERR_WIN32A(ERROR_PATH_BUSY) - CHK_ERR_WIN32A(ERROR_IS_SUBST_TARGET) - CHK_ERR_WIN32A(ERROR_SYSTEM_TRACE) - CHK_ERR_WIN32A(ERROR_INVALID_EVENT_COUNT) - CHK_ERR_WIN32A(ERROR_TOO_MANY_MUXWAITERS) - CHK_ERR_WIN32A(ERROR_INVALID_LIST_FORMAT) - CHK_ERR_WIN32A(ERROR_LABEL_TOO_LONG) - CHK_ERR_WIN32A(ERROR_TOO_MANY_TCBS) - CHK_ERR_WIN32A(ERROR_SIGNAL_REFUSED) - CHK_ERR_WIN32A(ERROR_DISCARDED) - CHK_ERR_WIN32A(ERROR_NOT_LOCKED) - CHK_ERR_WIN32A(ERROR_BAD_THREADID_ADDR) - CHK_ERR_WIN32A(ERROR_BAD_ARGUMENTS) - CHK_ERR_WIN32A(ERROR_BAD_PATHNAME) - CHK_ERR_WIN32A(ERROR_SIGNAL_PENDING) - CHK_ERR_WIN32A(ERROR_MAX_THRDS_REACHED) - CHK_ERR_WIN32A(ERROR_LOCK_FAILED) - CHK_ERR_WIN32A(ERROR_BUSY) - CHK_ERR_WIN32A(ERROR_CANCEL_VIOLATION) - CHK_ERR_WIN32A(ERROR_ATOMIC_LOCKS_NOT_SUPPORTED) - CHK_ERR_WIN32A(ERROR_INVALID_SEGMENT_NUMBER) - CHK_ERR_WIN32A(ERROR_INVALID_ORDINAL) - CHK_ERR_WIN32A(ERROR_ALREADY_EXISTS) - CHK_ERR_WIN32A(ERROR_INVALID_FLAG_NUMBER) - CHK_ERR_WIN32A(ERROR_SEM_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_INVALID_STARTING_CODESEG) - CHK_ERR_WIN32A(ERROR_INVALID_STACKSEG) - CHK_ERR_WIN32A(ERROR_INVALID_MODULETYPE) - CHK_ERR_WIN32A(ERROR_INVALID_EXE_SIGNATURE) - CHK_ERR_WIN32A(ERROR_EXE_MARKED_INVALID) - CHK_ERR_WIN32A(ERROR_BAD_EXE_FORMAT) - CHK_ERR_WIN32A(ERROR_ITERATED_DATA_EXCEEDS_64k) - CHK_ERR_WIN32A(ERROR_INVALID_MINALLOCSIZE) - CHK_ERR_WIN32A(ERROR_DYNLINK_FROM_INVALID_RING) - CHK_ERR_WIN32A(ERROR_IOPL_NOT_ENABLED) - CHK_ERR_WIN32A(ERROR_INVALID_SEGDPL) - CHK_ERR_WIN32A(ERROR_AUTODATASEG_EXCEEDS_64k) - CHK_ERRA(ERROR_RING2SEG_MUST_BE_MOVABLE) - CHK_ERRA(ERROR_RELOC_CHAIN_XEEDS_SEGLIM) - CHK_ERR_WIN32A(ERROR_INFLOOP_IN_RELOC_CHAIN) - CHK_ERR_WIN32A(ERROR_ENVVAR_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_NO_SIGNAL_SENT) - CHK_ERR_WIN32A(ERROR_FILENAME_EXCED_RANGE) - CHK_ERR_WIN32A(ERROR_RING2_STACK_IN_USE) - CHK_ERR_WIN32A(ERROR_META_EXPANSION_TOO_LONG) - CHK_ERR_WIN32A(ERROR_INVALID_SIGNAL_NUMBER) - CHK_ERR_WIN32A(ERROR_THREAD_1_INACTIVE) - CHK_ERR_WIN32A(ERROR_LOCKED) - CHK_ERR_WIN32A(ERROR_TOO_MANY_MODULES) - CHK_ERR_WIN32A(ERROR_NESTING_NOT_ALLOWED) - CHK_ERR_WIN32A(ERROR_EXE_MACHINE_TYPE_MISMATCH) - CHK_ERR_WIN32A(ERROR_BAD_PIPE) - CHK_ERR_WIN32A(ERROR_PIPE_BUSY) - CHK_ERR_WIN32A(ERROR_NO_DATA) - CHK_ERR_WIN32A(ERROR_PIPE_NOT_CONNECTED) - CHK_ERR_WIN32A(ERROR_MORE_DATA) - CHK_ERR_WIN32A(ERROR_VC_DISCONNECTED) - CHK_ERR_WIN32A(ERROR_INVALID_EA_NAME) - CHK_ERR_WIN32A(ERROR_EA_LIST_INCONSISTENT) - CHK_ERR_WIN32A(WAIT_TIMEOUT) - CHK_ERR_WIN32A(ERROR_NO_MORE_ITEMS) - CHK_ERR_WIN32A(ERROR_CANNOT_COPY) - CHK_ERR_WIN32A(ERROR_DIRECTORY) - CHK_ERR_WIN32A(ERROR_EAS_DIDNT_FIT) - CHK_ERR_WIN32A(ERROR_EA_FILE_CORRUPT) - CHK_ERR_WIN32A(ERROR_EA_TABLE_FULL) - CHK_ERR_WIN32A(ERROR_INVALID_EA_HANDLE) - CHK_ERR_WIN32A(ERROR_EAS_NOT_SUPPORTED) - CHK_ERR_WIN32A(ERROR_NOT_OWNER) - CHK_ERR_WIN32A(ERROR_TOO_MANY_POSTS) - CHK_ERR_WIN32A(ERROR_PARTIAL_COPY) - CHK_ERR_WIN32A(ERROR_OPLOCK_NOT_GRANTED) - CHK_ERR_WIN32A(ERROR_INVALID_OPLOCK_PROTOCOL) - CHK_ERR_WIN32A(ERROR_MR_MID_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_INVALID_ADDRESS) - CHK_ERR_WIN32A(ERROR_ARITHMETIC_OVERFLOW) - CHK_ERR_WIN32A(ERROR_PIPE_CONNECTED) - CHK_ERR_WIN32A(ERROR_PIPE_LISTENING) - CHK_ERR_WIN32A(ERROR_EA_ACCESS_DENIED) - CHK_ERR_WIN32A(ERROR_OPERATION_ABORTED) - CHK_ERR_WIN32A(ERROR_IO_INCOMPLETE) - CHK_ERR_WIN32A(ERROR_IO_PENDING) - CHK_ERR_WIN32A(ERROR_NOACCESS) - CHK_ERR_WIN32A(ERROR_SWAPERROR) - CHK_ERR_WIN32A(ERROR_STACK_OVERFLOW) - CHK_ERR_WIN32A(ERROR_INVALID_MESSAGE) - CHK_ERR_WIN32A(ERROR_CAN_NOT_COMPLETE) - CHK_ERR_WIN32A(ERROR_INVALID_FLAGS) - CHK_ERR_WIN32A(ERROR_UNRECOGNIZED_VOLUME) - CHK_ERR_WIN32A(ERROR_FILE_INVALID) - CHK_ERR_WIN32A(ERROR_FULLSCREEN_MODE) - CHK_ERR_WIN32A(ERROR_NO_TOKEN) - CHK_ERR_WIN32A(ERROR_BADDB) - CHK_ERR_WIN32A(ERROR_BADKEY) - CHK_ERR_WIN32A(ERROR_CANTOPEN) - CHK_ERR_WIN32A(ERROR_CANTREAD) - CHK_ERR_WIN32A(ERROR_CANTWRITE) - CHK_ERR_WIN32A(ERROR_REGISTRY_RECOVERED) - CHK_ERR_WIN32A(ERROR_REGISTRY_CORRUPT) - CHK_ERR_WIN32A(ERROR_REGISTRY_IO_FAILED) - CHK_ERR_WIN32A(ERROR_NOT_REGISTRY_FILE) - CHK_ERR_WIN32A(ERROR_KEY_DELETED) - CHK_ERR_WIN32A(ERROR_NO_LOG_SPACE) - CHK_ERR_WIN32A(ERROR_KEY_HAS_CHILDREN) - CHK_ERR_WIN32A(ERROR_CHILD_MUST_BE_VOLATILE) - CHK_ERR_WIN32A(ERROR_NOTIFY_ENUM_DIR) - CHK_ERR_WIN32A(ERROR_DEPENDENT_SERVICES_RUNNING) - CHK_ERR_WIN32A(ERROR_INVALID_SERVICE_CONTROL) - CHK_ERR_WIN32A(ERROR_SERVICE_REQUEST_TIMEOUT) - CHK_ERR_WIN32A(ERROR_SERVICE_NO_THREAD) - CHK_ERR_WIN32A(ERROR_SERVICE_DATABASE_LOCKED) - CHK_ERR_WIN32A(ERROR_SERVICE_ALREADY_RUNNING) - CHK_ERR_WIN32A(ERROR_INVALID_SERVICE_ACCOUNT) - CHK_ERR_WIN32A(ERROR_SERVICE_DISABLED) - CHK_ERR_WIN32A(ERROR_CIRCULAR_DEPENDENCY) - CHK_ERR_WIN32A(ERROR_SERVICE_DOES_NOT_EXIST) - CHK_ERR_WIN32A(ERROR_SERVICE_CANNOT_ACCEPT_CTRL) - CHK_ERR_WIN32A(ERROR_SERVICE_NOT_ACTIVE) - CHK_ERR_WIN32A(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) - CHK_ERR_WIN32A(ERROR_EXCEPTION_IN_SERVICE) - CHK_ERR_WIN32A(ERROR_DATABASE_DOES_NOT_EXIST) - CHK_ERR_WIN32A(ERROR_SERVICE_SPECIFIC_ERROR) - CHK_ERR_WIN32A(ERROR_PROCESS_ABORTED) - CHK_ERR_WIN32A(ERROR_SERVICE_DEPENDENCY_FAIL) - CHK_ERR_WIN32A(ERROR_SERVICE_LOGON_FAILED) - CHK_ERR_WIN32A(ERROR_SERVICE_START_HANG) - CHK_ERR_WIN32A(ERROR_INVALID_SERVICE_LOCK) - CHK_ERR_WIN32A(ERROR_SERVICE_MARKED_FOR_DELETE) - CHK_ERR_WIN32A(ERROR_SERVICE_EXISTS) - CHK_ERR_WIN32A(ERROR_ALREADY_RUNNING_LKG) - CHK_ERR_WIN32A(ERROR_SERVICE_DEPENDENCY_DELETED) - CHK_ERR_WIN32A(ERROR_BOOT_ALREADY_ACCEPTED) - CHK_ERR_WIN32A(ERROR_SERVICE_NEVER_STARTED) - CHK_ERR_WIN32A(ERROR_DUPLICATE_SERVICE_NAME) - CHK_ERR_WIN32A(ERROR_DIFFERENT_SERVICE_ACCOUNT) - CHK_ERR_WIN32A(ERROR_CANNOT_DETECT_DRIVER_FAILURE) - CHK_ERR_WIN32A(ERROR_CANNOT_DETECT_PROCESS_ABORT) - CHK_ERR_WIN32A(ERROR_NO_RECOVERY_PROGRAM) - CHK_ERR_WIN32A(ERROR_SERVICE_NOT_IN_EXE) - CHK_ERR_WIN32A(ERROR_END_OF_MEDIA) - CHK_ERR_WIN32A(ERROR_FILEMARK_DETECTED) - CHK_ERR_WIN32A(ERROR_BEGINNING_OF_MEDIA) - CHK_ERR_WIN32A(ERROR_SETMARK_DETECTED) - CHK_ERR_WIN32A(ERROR_NO_DATA_DETECTED) - CHK_ERR_WIN32A(ERROR_PARTITION_FAILURE) - CHK_ERR_WIN32A(ERROR_INVALID_BLOCK_LENGTH) - CHK_ERR_WIN32A(ERROR_DEVICE_NOT_PARTITIONED) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_LOCK_MEDIA) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_UNLOAD_MEDIA) - CHK_ERR_WIN32A(ERROR_MEDIA_CHANGED) - CHK_ERR_WIN32A(ERROR_BUS_RESET) - CHK_ERR_WIN32A(ERROR_NO_MEDIA_IN_DRIVE) - CHK_ERR_WIN32A(ERROR_NO_UNICODE_TRANSLATION) - CHK_ERR_WIN32A(ERROR_DLL_INIT_FAILED) - CHK_ERR_WIN32A(ERROR_SHUTDOWN_IN_PROGRESS) - CHK_ERR_WIN32A(ERROR_NO_SHUTDOWN_IN_PROGRESS) - CHK_ERR_WIN32A(ERROR_IO_DEVICE) - CHK_ERR_WIN32A(ERROR_SERIAL_NO_DEVICE) - CHK_ERR_WIN32A(ERROR_IRQ_BUSY) - CHK_ERR_WIN32A(ERROR_MORE_WRITES) - CHK_ERR_WIN32A(ERROR_COUNTER_TIMEOUT) - CHK_ERR_WIN32A(ERROR_FLOPPY_ID_MARK_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_FLOPPY_WRONG_CYLINDER) - CHK_ERR_WIN32A(ERROR_FLOPPY_UNKNOWN_ERROR) - CHK_ERR_WIN32A(ERROR_FLOPPY_BAD_REGISTERS) - CHK_ERR_WIN32A(ERROR_DISK_RECALIBRATE_FAILED) - CHK_ERR_WIN32A(ERROR_DISK_OPERATION_FAILED) - CHK_ERR_WIN32A(ERROR_DISK_RESET_FAILED) - CHK_ERR_WIN32A(ERROR_EOM_OVERFLOW) - CHK_ERR_WIN32A(ERROR_NOT_ENOUGH_SERVER_MEMORY) - CHK_ERR_WIN32A(ERROR_POSSIBLE_DEADLOCK) - CHK_ERR_WIN32A(ERROR_MAPPED_ALIGNMENT) - CHK_ERR_WIN32A(ERROR_SET_POWER_STATE_VETOED) - CHK_ERR_WIN32A(ERROR_SET_POWER_STATE_FAILED) - CHK_ERR_WIN32A(ERROR_TOO_MANY_LINKS) - CHK_ERR_WIN32A(ERROR_OLD_WIN_VERSION) - CHK_ERR_WIN32A(ERROR_APP_WRONG_OS) - CHK_ERR_WIN32A(ERROR_SINGLE_INSTANCE_APP) - CHK_ERR_WIN32A(ERROR_RMODE_APP) - CHK_ERR_WIN32A(ERROR_INVALID_DLL) - CHK_ERR_WIN32A(ERROR_NO_ASSOCIATION) - CHK_ERR_WIN32A(ERROR_DDE_FAIL) - CHK_ERR_WIN32A(ERROR_DLL_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_NO_MORE_USER_HANDLES) - CHK_ERR_WIN32A(ERROR_MESSAGE_SYNC_ONLY) - CHK_ERR_WIN32A(ERROR_SOURCE_ELEMENT_EMPTY) - CHK_ERR_WIN32A(ERROR_DESTINATION_ELEMENT_FULL) - CHK_ERR_WIN32A(ERROR_ILLEGAL_ELEMENT_ADDRESS) - CHK_ERR_WIN32A(ERROR_MAGAZINE_NOT_PRESENT) - CHK_ERR_WIN32A(ERROR_DEVICE_REINITIALIZATION_NEEDED) - CHK_ERR_WIN32A(ERROR_DEVICE_REQUIRES_CLEANING) - CHK_ERR_WIN32A(ERROR_DEVICE_DOOR_OPEN) - CHK_ERR_WIN32A(ERROR_DEVICE_NOT_CONNECTED) - CHK_ERR_WIN32A(ERROR_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_NO_MATCH) - CHK_ERR_WIN32A(ERROR_SET_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_POINT_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_NO_TRACKING_SERVICE) - CHK_ERR_WIN32A(ERROR_NO_VOLUME_ID) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_REMOVE_REPLACED) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_MOVE_REPLACEMENT) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_MOVE_REPLACEMENT_2) - CHK_ERR_WIN32A(ERROR_JOURNAL_DELETE_IN_PROGRESS) - CHK_ERR_WIN32A(ERROR_JOURNAL_NOT_ACTIVE) - CHK_ERR_WIN32A(ERROR_POTENTIAL_FILE_FOUND) - CHK_ERR_WIN32A(ERROR_BAD_DEVICE) - CHK_ERR_WIN32A(ERROR_CONNECTION_UNAVAIL) - CHK_ERR_WIN32A(ERROR_DEVICE_ALREADY_REMEMBERED) - CHK_ERR_WIN32A(ERROR_NO_NET_OR_BAD_PATH) - CHK_ERR_WIN32A(ERROR_BAD_PROVIDER) - CHK_ERR_WIN32A(ERROR_CANNOT_OPEN_PROFILE) - CHK_ERR_WIN32A(ERROR_BAD_PROFILE) - CHK_ERR_WIN32A(ERROR_NOT_CONTAINER) - CHK_ERR_WIN32A(ERROR_EXTENDED_ERROR) - CHK_ERR_WIN32A(ERROR_INVALID_GROUPNAME) - CHK_ERR_WIN32A(ERROR_INVALID_COMPUTERNAME) - CHK_ERR_WIN32A(ERROR_INVALID_EVENTNAME) - CHK_ERR_WIN32A(ERROR_INVALID_DOMAINNAME) - CHK_ERR_WIN32A(ERROR_INVALID_SERVICENAME) - CHK_ERR_WIN32A(ERROR_INVALID_NETNAME) - CHK_ERR_WIN32A(ERROR_INVALID_SHARENAME) - CHK_ERR_WIN32A(ERROR_INVALID_PASSWORDNAME) - CHK_ERR_WIN32A(ERROR_INVALID_MESSAGENAME) - CHK_ERR_WIN32A(ERROR_INVALID_MESSAGEDEST) - CHK_ERR_WIN32A(ERROR_SESSION_CREDENTIAL_CONFLICT) - CHK_ERR_WIN32A(ERROR_REMOTE_SESSION_LIMIT_EXCEEDED) - CHK_ERR_WIN32A(ERROR_DUP_DOMAINNAME) - CHK_ERR_WIN32A(ERROR_NO_NETWORK) - CHK_ERR_WIN32A(ERROR_CANCELLED) - CHK_ERR_WIN32A(ERROR_USER_MAPPED_FILE) - CHK_ERR_WIN32A(ERROR_CONNECTION_REFUSED) - CHK_ERR_WIN32A(ERROR_GRACEFUL_DISCONNECT) - CHK_ERR_WIN32A(ERROR_ADDRESS_ALREADY_ASSOCIATED) - CHK_ERR_WIN32A(ERROR_ADDRESS_NOT_ASSOCIATED) - CHK_ERR_WIN32A(ERROR_CONNECTION_INVALID) - CHK_ERR_WIN32A(ERROR_CONNECTION_ACTIVE) - CHK_ERR_WIN32A(ERROR_NETWORK_UNREACHABLE) - CHK_ERR_WIN32A(ERROR_HOST_UNREACHABLE) - CHK_ERR_WIN32A(ERROR_PROTOCOL_UNREACHABLE) - CHK_ERR_WIN32A(ERROR_PORT_UNREACHABLE) - CHK_ERR_WIN32A(ERROR_REQUEST_ABORTED) - CHK_ERR_WIN32A(ERROR_CONNECTION_ABORTED) - CHK_ERR_WIN32A(ERROR_RETRY) - CHK_ERR_WIN32A(ERROR_CONNECTION_COUNT_LIMIT) - CHK_ERR_WIN32A(ERROR_LOGIN_TIME_RESTRICTION) - CHK_ERR_WIN32A(ERROR_LOGIN_WKSTA_RESTRICTION) - CHK_ERR_WIN32A(ERROR_INCORRECT_ADDRESS) - CHK_ERR_WIN32A(ERROR_ALREADY_REGISTERED) - CHK_ERR_WIN32A(ERROR_SERVICE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_NOT_AUTHENTICATED) - CHK_ERR_WIN32A(ERROR_NOT_LOGGED_ON) - CHK_ERR_WIN32A(ERROR_CONTINUE) - CHK_ERR_WIN32A(ERROR_ALREADY_INITIALIZED) - CHK_ERR_WIN32A(ERROR_NO_MORE_DEVICES) - CHK_ERR_WIN32A(ERROR_NO_SUCH_SITE) - CHK_ERR_WIN32A(ERROR_DOMAIN_CONTROLLER_EXISTS) - CHK_ERR_WIN32A(ERROR_NOT_ALL_ASSIGNED) - CHK_ERR_WIN32A(ERROR_SOME_NOT_MAPPED) - CHK_ERR_WIN32A(ERROR_NO_QUOTAS_FOR_ACCOUNT) - CHK_ERR_WIN32A(ERROR_LOCAL_USER_SESSION_KEY) - CHK_ERR_WIN32A(ERROR_NULL_LM_PASSWORD) - CHK_ERR_WIN32A(ERROR_UNKNOWN_REVISION) - CHK_ERR_WIN32A(ERROR_REVISION_MISMATCH) - CHK_ERR_WIN32A(ERROR_INVALID_OWNER) - CHK_ERR_WIN32A(ERROR_INVALID_PRIMARY_GROUP) - CHK_ERR_WIN32A(ERROR_NO_IMPERSONATION_TOKEN) - CHK_ERR_WIN32A(ERROR_CANT_DISABLE_MANDATORY) - CHK_ERR_WIN32A(ERROR_NO_LOGON_SERVERS) - CHK_ERR_WIN32A(ERROR_NO_SUCH_LOGON_SESSION) - CHK_ERR_WIN32A(ERROR_NO_SUCH_PRIVILEGE) - CHK_ERR_WIN32A(ERROR_PRIVILEGE_NOT_HELD) - CHK_ERR_WIN32A(ERROR_INVALID_ACCOUNT_NAME) - CHK_ERR_WIN32A(ERROR_USER_EXISTS) - CHK_ERR_WIN32A(ERROR_NO_SUCH_USER) - CHK_ERR_WIN32A(ERROR_GROUP_EXISTS) - CHK_ERR_WIN32A(ERROR_NO_SUCH_GROUP) - CHK_ERR_WIN32A(ERROR_MEMBER_IN_GROUP) - CHK_ERR_WIN32A(ERROR_MEMBER_NOT_IN_GROUP) - CHK_ERR_WIN32A(ERROR_LAST_ADMIN) - CHK_ERR_WIN32A(ERROR_WRONG_PASSWORD) - CHK_ERR_WIN32A(ERROR_ILL_FORMED_PASSWORD) - CHK_ERR_WIN32A(ERROR_PASSWORD_RESTRICTION) - CHK_ERR_WIN32A(ERROR_LOGON_FAILURE) - CHK_ERR_WIN32A(ERROR_ACCOUNT_RESTRICTION) - CHK_ERR_WIN32A(ERROR_INVALID_LOGON_HOURS) - CHK_ERR_WIN32A(ERROR_INVALID_WORKSTATION) - CHK_ERR_WIN32A(ERROR_PASSWORD_EXPIRED) - CHK_ERR_WIN32A(ERROR_ACCOUNT_DISABLED) - CHK_ERR_WIN32A(ERROR_NONE_MAPPED) - CHK_ERR_WIN32A(ERROR_TOO_MANY_LUIDS_REQUESTED) - CHK_ERR_WIN32A(ERROR_LUIDS_EXHAUSTED) - CHK_ERR_WIN32A(ERROR_INVALID_SUB_AUTHORITY) - CHK_ERR_WIN32A(ERROR_INVALID_ACL) - CHK_ERR_WIN32A(ERROR_INVALID_SID) - CHK_ERR_WIN32A(ERROR_INVALID_SECURITY_DESCR) - CHK_ERR_WIN32A(ERROR_BAD_INHERITANCE_ACL) - CHK_ERR_WIN32A(ERROR_SERVER_DISABLED) - CHK_ERR_WIN32A(ERROR_SERVER_NOT_DISABLED) - CHK_ERR_WIN32A(ERROR_INVALID_ID_AUTHORITY) - CHK_ERR_WIN32A(ERROR_ALLOTTED_SPACE_EXCEEDED) - CHK_ERR_WIN32A(ERROR_INVALID_GROUP_ATTRIBUTES) - CHK_ERR_WIN32A(ERROR_BAD_IMPERSONATION_LEVEL) - CHK_ERR_WIN32A(ERROR_CANT_OPEN_ANONYMOUS) - CHK_ERR_WIN32A(ERROR_BAD_VALIDATION_CLASS) - CHK_ERR_WIN32A(ERROR_BAD_TOKEN_TYPE) - CHK_ERR_WIN32A(ERROR_NO_SECURITY_ON_OBJECT) - CHK_ERR_WIN32A(ERROR_CANT_ACCESS_DOMAIN_INFO) - CHK_ERR_WIN32A(ERROR_INVALID_SERVER_STATE) - CHK_ERR_WIN32A(ERROR_INVALID_DOMAIN_STATE) - CHK_ERR_WIN32A(ERROR_INVALID_DOMAIN_ROLE) - CHK_ERR_WIN32A(ERROR_NO_SUCH_DOMAIN) - CHK_ERR_WIN32A(ERROR_DOMAIN_EXISTS) - CHK_ERR_WIN32A(ERROR_DOMAIN_LIMIT_EXCEEDED) - CHK_ERR_WIN32A(ERROR_INTERNAL_DB_CORRUPTION) - CHK_ERR_WIN32A(ERROR_INTERNAL_ERROR) - CHK_ERR_WIN32A(ERROR_GENERIC_NOT_MAPPED) - CHK_ERR_WIN32A(ERROR_BAD_DESCRIPTOR_FORMAT) - CHK_ERR_WIN32A(ERROR_NOT_LOGON_PROCESS) - CHK_ERR_WIN32A(ERROR_LOGON_SESSION_EXISTS) - CHK_ERR_WIN32A(ERROR_NO_SUCH_PACKAGE) - CHK_ERR_WIN32A(ERROR_BAD_LOGON_SESSION_STATE) - CHK_ERR_WIN32A(ERROR_LOGON_SESSION_COLLISION) - CHK_ERR_WIN32A(ERROR_INVALID_LOGON_TYPE) - CHK_ERR_WIN32A(ERROR_CANNOT_IMPERSONATE) - CHK_ERR_WIN32A(ERROR_RXACT_INVALID_STATE) - CHK_ERR_WIN32A(ERROR_RXACT_COMMIT_FAILURE) - CHK_ERR_WIN32A(ERROR_SPECIAL_ACCOUNT) - CHK_ERR_WIN32A(ERROR_SPECIAL_GROUP) - CHK_ERR_WIN32A(ERROR_SPECIAL_USER) - CHK_ERR_WIN32A(ERROR_MEMBERS_PRIMARY_GROUP) - CHK_ERR_WIN32A(ERROR_TOKEN_ALREADY_IN_USE) - CHK_ERR_WIN32A(ERROR_NO_SUCH_ALIAS) - CHK_ERR_WIN32A(ERROR_MEMBER_NOT_IN_ALIAS) - CHK_ERR_WIN32A(ERROR_MEMBER_IN_ALIAS) - CHK_ERR_WIN32A(ERROR_ALIAS_EXISTS) - CHK_ERR_WIN32A(ERROR_LOGON_NOT_GRANTED) - CHK_ERR_WIN32A(ERROR_TOO_MANY_SECRETS) - CHK_ERR_WIN32A(ERROR_SECRET_TOO_LONG) - CHK_ERR_WIN32A(ERROR_INTERNAL_DB_ERROR) - CHK_ERR_WIN32A(ERROR_TOO_MANY_CONTEXT_IDS) - CHK_ERR_WIN32A(ERROR_LOGON_TYPE_NOT_GRANTED) - CHK_ERR_WIN32A(ERROR_NT_CROSS_ENCRYPTION_REQUIRED) - CHK_ERR_WIN32A(ERROR_NO_SUCH_MEMBER) - CHK_ERR_WIN32A(ERROR_INVALID_MEMBER) - CHK_ERR_WIN32A(ERROR_TOO_MANY_SIDS) - CHK_ERR_WIN32A(ERROR_LM_CROSS_ENCRYPTION_REQUIRED) - CHK_ERR_WIN32A(ERROR_NO_INHERITANCE) - CHK_ERR_WIN32A(ERROR_FILE_CORRUPT) - CHK_ERR_WIN32A(ERROR_DISK_CORRUPT) - CHK_ERR_WIN32A(ERROR_NO_USER_SESSION_KEY) - CHK_ERR_WIN32A(ERROR_LICENSE_QUOTA_EXCEEDED) - CHK_ERR_WIN32A(ERROR_WRONG_TARGET_NAME) - CHK_ERR_WIN32A(ERROR_MUTUAL_AUTH_FAILED) - CHK_ERR_WIN32A(ERROR_TIME_SKEW) - CHK_ERR_WIN32A(ERROR_INVALID_WINDOW_HANDLE) - CHK_ERR_WIN32A(ERROR_INVALID_MENU_HANDLE) - CHK_ERR_WIN32A(ERROR_INVALID_CURSOR_HANDLE) - CHK_ERR_WIN32A(ERROR_INVALID_ACCEL_HANDLE) - CHK_ERR_WIN32A(ERROR_INVALID_HOOK_HANDLE) - CHK_ERR_WIN32A(ERROR_INVALID_DWP_HANDLE) - CHK_ERR_WIN32A(ERROR_TLW_WITH_WSCHILD) - CHK_ERR_WIN32A(ERROR_CANNOT_FIND_WND_CLASS) - CHK_ERR_WIN32A(ERROR_WINDOW_OF_OTHER_THREAD) - CHK_ERR_WIN32A(ERROR_HOTKEY_ALREADY_REGISTERED) - CHK_ERR_WIN32A(ERROR_CLASS_ALREADY_EXISTS) - CHK_ERR_WIN32A(ERROR_CLASS_DOES_NOT_EXIST) - CHK_ERR_WIN32A(ERROR_CLASS_HAS_WINDOWS) - CHK_ERR_WIN32A(ERROR_INVALID_INDEX) - CHK_ERR_WIN32A(ERROR_INVALID_ICON_HANDLE) - CHK_ERR_WIN32A(ERROR_PRIVATE_DIALOG_INDEX) - CHK_ERR_WIN32A(ERROR_LISTBOX_ID_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_NO_WILDCARD_CHARACTERS) - CHK_ERR_WIN32A(ERROR_CLIPBOARD_NOT_OPEN) - CHK_ERR_WIN32A(ERROR_HOTKEY_NOT_REGISTERED) - CHK_ERR_WIN32A(ERROR_WINDOW_NOT_DIALOG) - CHK_ERR_WIN32A(ERROR_CONTROL_ID_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_INVALID_COMBOBOX_MESSAGE) - CHK_ERR_WIN32A(ERROR_WINDOW_NOT_COMBOBOX) - CHK_ERR_WIN32A(ERROR_INVALID_EDIT_HEIGHT) - CHK_ERR_WIN32A(ERROR_DC_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_INVALID_HOOK_FILTER) - CHK_ERR_WIN32A(ERROR_INVALID_FILTER_PROC) - CHK_ERR_WIN32A(ERROR_HOOK_NEEDS_HMOD) - CHK_ERR_WIN32A(ERROR_GLOBAL_ONLY_HOOK) - CHK_ERR_WIN32A(ERROR_JOURNAL_HOOK_SET) - CHK_ERR_WIN32A(ERROR_HOOK_NOT_INSTALLED) - CHK_ERR_WIN32A(ERROR_INVALID_LB_MESSAGE) - CHK_ERR_WIN32A(ERROR_SETCOUNT_ON_BAD_LB) - CHK_ERR_WIN32A(ERROR_LB_WITHOUT_TABSTOPS) - CHK_ERR_WIN32A(ERROR_DESTROY_OBJECT_OF_OTHER_THREAD) - CHK_ERR_WIN32A(ERROR_CHILD_WINDOW_MENU) - CHK_ERR_WIN32A(ERROR_NO_SYSTEM_MENU) - CHK_ERR_WIN32A(ERROR_INVALID_MSGBOX_STYLE) - CHK_ERR_WIN32A(ERROR_INVALID_SPI_VALUE) - CHK_ERR_WIN32A(ERROR_SCREEN_ALREADY_LOCKED) - CHK_ERR_WIN32A(ERROR_HWNDS_HAVE_DIFF_PARENT) - CHK_ERR_WIN32A(ERROR_NOT_CHILD_WINDOW) - CHK_ERR_WIN32A(ERROR_INVALID_GW_COMMAND) - CHK_ERR_WIN32A(ERROR_INVALID_THREAD_ID) - CHK_ERR_WIN32A(ERROR_NON_MDICHILD_WINDOW) - CHK_ERR_WIN32A(ERROR_POPUP_ALREADY_ACTIVE) - CHK_ERR_WIN32A(ERROR_NO_SCROLLBARS) - CHK_ERR_WIN32A(ERROR_INVALID_SCROLLBAR_RANGE) - CHK_ERR_WIN32A(ERROR_INVALID_SHOWWIN_COMMAND) - CHK_ERR_WIN32A(ERROR_NO_SYSTEM_RESOURCES) - CHK_ERR_WIN32A(ERROR_NONPAGED_SYSTEM_RESOURCES) - CHK_ERR_WIN32A(ERROR_PAGED_SYSTEM_RESOURCES) - CHK_ERR_WIN32A(ERROR_WORKING_SET_QUOTA) - CHK_ERR_WIN32A(ERROR_PAGEFILE_QUOTA) - CHK_ERR_WIN32A(ERROR_COMMITMENT_LIMIT) - CHK_ERR_WIN32A(ERROR_MENU_ITEM_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_INVALID_KEYBOARD_HANDLE) - CHK_ERR_WIN32A(ERROR_HOOK_TYPE_NOT_ALLOWED) - CHK_ERR_WIN32A(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION) - CHK_ERR_WIN32A(ERROR_TIMEOUT) - CHK_ERR_WIN32A(ERROR_INVALID_MONITOR_HANDLE) - CHK_ERR_WIN32A(ERROR_EVENTLOG_FILE_CORRUPT) - CHK_ERR_WIN32A(ERROR_EVENTLOG_CANT_START) - CHK_ERR_WIN32A(ERROR_LOG_FILE_FULL) - CHK_ERR_WIN32A(ERROR_EVENTLOG_FILE_CHANGED) - CHK_ERR_WIN32A(ERROR_INSTALL_USEREXIT) - CHK_ERR_WIN32A(ERROR_INSTALL_FAILURE) - CHK_ERR_WIN32A(ERROR_INSTALL_SUSPEND) - CHK_ERR_WIN32A(ERROR_UNKNOWN_PRODUCT) - CHK_ERR_WIN32A(ERROR_UNKNOWN_FEATURE) - CHK_ERR_WIN32A(ERROR_UNKNOWN_COMPONENT) - CHK_ERR_WIN32A(ERROR_UNKNOWN_PROPERTY) - CHK_ERR_WIN32A(ERROR_INVALID_HANDLE_STATE) - CHK_ERR_WIN32A(ERROR_BAD_CONFIGURATION) - CHK_ERR_WIN32A(ERROR_INDEX_ABSENT) - CHK_ERR_WIN32A(ERROR_INSTALL_SOURCE_ABSENT) - CHK_ERR_WIN32A(ERROR_PRODUCT_UNINSTALLED) - CHK_ERR_WIN32A(ERROR_BAD_QUERY_SYNTAX) - CHK_ERR_WIN32A(ERROR_INVALID_FIELD) - CHK_ERR_WIN32A(ERROR_DEVICE_REMOVED) - CHK_ERR_WIN32A(RPC_S_INVALID_STRING_BINDING) - CHK_ERR_WIN32A(RPC_S_WRONG_KIND_OF_BINDING) - CHK_ERR_WIN32A(RPC_S_INVALID_BINDING) - CHK_ERR_WIN32A(RPC_S_PROTSEQ_NOT_SUPPORTED) - CHK_ERR_WIN32A(RPC_S_INVALID_RPC_PROTSEQ) - CHK_ERR_WIN32A(RPC_S_INVALID_STRING_UUID) - CHK_ERR_WIN32A(RPC_S_INVALID_ENDPOINT_FORMAT) - CHK_ERR_WIN32A(RPC_S_INVALID_NET_ADDR) - CHK_ERR_WIN32A(RPC_S_NO_ENDPOINT_FOUND) - CHK_ERR_WIN32A(RPC_S_INVALID_TIMEOUT) - CHK_ERR_WIN32A(RPC_S_OBJECT_NOT_FOUND) - CHK_ERR_WIN32A(RPC_S_ALREADY_REGISTERED) - CHK_ERR_WIN32A(RPC_S_TYPE_ALREADY_REGISTERED) - CHK_ERR_WIN32A(RPC_S_ALREADY_LISTENING) - CHK_ERR_WIN32A(RPC_S_NO_PROTSEQS_REGISTERED) - CHK_ERR_WIN32A(RPC_S_NOT_LISTENING) - CHK_ERR_WIN32A(RPC_S_UNKNOWN_MGR_TYPE) - CHK_ERR_WIN32A(RPC_S_UNKNOWN_IF) - CHK_ERR_WIN32A(RPC_S_NO_BINDINGS) - CHK_ERR_WIN32A(RPC_S_NO_PROTSEQS) - CHK_ERR_WIN32A(RPC_S_CANT_CREATE_ENDPOINT) - CHK_ERR_WIN32A(RPC_S_OUT_OF_RESOURCES) - CHK_ERR_WIN32A(RPC_S_SERVER_UNAVAILABLE) - CHK_ERR_WIN32A(RPC_S_SERVER_TOO_BUSY) - CHK_ERR_WIN32A(RPC_S_INVALID_NETWORK_OPTIONS) - CHK_ERR_WIN32A(RPC_S_NO_CALL_ACTIVE) - CHK_ERR_WIN32A(RPC_S_CALL_FAILED) - CHK_ERR_WIN32A(RPC_S_CALL_FAILED_DNE) - CHK_ERR_WIN32A(RPC_S_PROTOCOL_ERROR) - CHK_ERR_WIN32A(RPC_S_UNSUPPORTED_TRANS_SYN) - CHK_ERR_WIN32A(RPC_S_UNSUPPORTED_TYPE) - CHK_ERR_WIN32A(RPC_S_INVALID_TAG) - CHK_ERR_WIN32A(RPC_S_INVALID_BOUND) - CHK_ERR_WIN32A(RPC_S_NO_ENTRY_NAME) - CHK_ERR_WIN32A(RPC_S_INVALID_NAME_SYNTAX) - CHK_ERR_WIN32A(RPC_S_UNSUPPORTED_NAME_SYNTAX) - CHK_ERR_WIN32A(RPC_S_UUID_NO_ADDRESS) - CHK_ERR_WIN32A(RPC_S_DUPLICATE_ENDPOINT) - CHK_ERR_WIN32A(RPC_S_UNKNOWN_AUTHN_TYPE) - CHK_ERR_WIN32A(RPC_S_MAX_CALLS_TOO_SMALL) - CHK_ERR_WIN32A(RPC_S_STRING_TOO_LONG) - CHK_ERR_WIN32A(RPC_S_PROTSEQ_NOT_FOUND) - CHK_ERR_WIN32A(RPC_S_PROCNUM_OUT_OF_RANGE) - CHK_ERR_WIN32A(RPC_S_BINDING_HAS_NO_AUTH) - CHK_ERR_WIN32A(RPC_S_UNKNOWN_AUTHN_SERVICE) - CHK_ERR_WIN32A(RPC_S_UNKNOWN_AUTHN_LEVEL) - CHK_ERR_WIN32A(RPC_S_INVALID_AUTH_IDENTITY) - CHK_ERR_WIN32A(RPC_S_UNKNOWN_AUTHZ_SERVICE) - CHK_ERR_WIN32A(EPT_S_INVALID_ENTRY) - CHK_ERR_WIN32A(EPT_S_CANT_PERFORM_OP) - CHK_ERR_WIN32A(EPT_S_NOT_REGISTERED) - CHK_ERR_WIN32A(RPC_S_NOTHING_TO_EXPORT) - CHK_ERR_WIN32A(RPC_S_INCOMPLETE_NAME) - CHK_ERR_WIN32A(RPC_S_INVALID_VERS_OPTION) - CHK_ERR_WIN32A(RPC_S_NO_MORE_MEMBERS) - CHK_ERR_WIN32A(RPC_S_NOT_ALL_OBJS_UNEXPORTED) - CHK_ERR_WIN32A(RPC_S_INTERFACE_NOT_FOUND) - CHK_ERR_WIN32A(RPC_S_ENTRY_ALREADY_EXISTS) - CHK_ERR_WIN32A(RPC_S_ENTRY_NOT_FOUND) - CHK_ERR_WIN32A(RPC_S_NAME_SERVICE_UNAVAILABLE) - CHK_ERR_WIN32A(RPC_S_INVALID_NAF_ID) - CHK_ERR_WIN32A(RPC_S_CANNOT_SUPPORT) - CHK_ERR_WIN32A(RPC_S_NO_CONTEXT_AVAILABLE) - CHK_ERR_WIN32A(RPC_S_INTERNAL_ERROR) - CHK_ERR_WIN32A(RPC_S_ZERO_DIVIDE) - CHK_ERR_WIN32A(RPC_S_ADDRESS_ERROR) - CHK_ERR_WIN32A(RPC_S_FP_DIV_ZERO) - CHK_ERR_WIN32A(RPC_S_FP_UNDERFLOW) - CHK_ERR_WIN32A(RPC_S_FP_OVERFLOW) - CHK_ERR_WIN32A(RPC_X_NO_MORE_ENTRIES) - CHK_ERR_WIN32A(RPC_X_SS_CHAR_TRANS_OPEN_FAIL) - CHK_ERR_WIN32A(RPC_X_SS_CHAR_TRANS_SHORT_FILE) - CHK_ERR_WIN32A(RPC_X_SS_IN_NULL_CONTEXT) - CHK_ERR_WIN32A(RPC_X_SS_CONTEXT_DAMAGED) - CHK_ERR_WIN32A(RPC_X_SS_HANDLES_MISMATCH) - CHK_ERR_WIN32A(RPC_X_SS_CANNOT_GET_CALL_HANDLE) - CHK_ERR_WIN32A(RPC_X_NULL_REF_POINTER) - CHK_ERR_WIN32A(RPC_X_ENUM_VALUE_OUT_OF_RANGE) - CHK_ERR_WIN32A(RPC_X_BYTE_COUNT_TOO_SMALL) - CHK_ERR_WIN32A(RPC_X_BAD_STUB_DATA) - CHK_ERR_WIN32A(ERROR_INVALID_USER_BUFFER) - CHK_ERR_WIN32A(ERROR_UNRECOGNIZED_MEDIA) - CHK_ERR_WIN32A(ERROR_NO_TRUST_LSA_SECRET) - CHK_ERR_WIN32A(ERROR_NO_TRUST_SAM_ACCOUNT) - CHK_ERR_WIN32A(ERROR_TRUSTED_DOMAIN_FAILURE) - CHK_ERR_WIN32A(ERROR_TRUSTED_RELATIONSHIP_FAILURE) - CHK_ERR_WIN32A(ERROR_TRUST_FAILURE) - CHK_ERR_WIN32A(RPC_S_CALL_IN_PROGRESS) - CHK_ERR_WIN32A(ERROR_NETLOGON_NOT_STARTED) - CHK_ERR_WIN32A(ERROR_ACCOUNT_EXPIRED) - CHK_ERR_WIN32A(ERROR_REDIRECTOR_HAS_OPEN_HANDLES) - CHK_ERR_WIN32A(ERROR_PRINTER_DRIVER_ALREADY_INSTALLED) - CHK_ERR_WIN32A(ERROR_UNKNOWN_PORT) - CHK_ERR_WIN32A(ERROR_UNKNOWN_PRINTER_DRIVER) - CHK_ERR_WIN32A(ERROR_UNKNOWN_PRINTPROCESSOR) - CHK_ERR_WIN32A(ERROR_INVALID_SEPARATOR_FILE) - CHK_ERR_WIN32A(ERROR_INVALID_PRIORITY) - CHK_ERR_WIN32A(ERROR_INVALID_PRINTER_NAME) - CHK_ERR_WIN32A(ERROR_PRINTER_ALREADY_EXISTS) - CHK_ERR_WIN32A(ERROR_INVALID_PRINTER_COMMAND) - CHK_ERR_WIN32A(ERROR_INVALID_DATATYPE) - CHK_ERR_WIN32A(ERROR_INVALID_ENVIRONMENT) - CHK_ERR_WIN32A(RPC_S_NO_MORE_BINDINGS) - CHK_ERR_WIN32A(ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT) - CHK_ERR_WIN32A(ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT) - CHK_ERR_WIN32A(ERROR_NOLOGON_SERVER_TRUST_ACCOUNT) - CHK_ERR_WIN32A(ERROR_DOMAIN_TRUST_INCONSISTENT) - CHK_ERR_WIN32A(ERROR_SERVER_HAS_OPEN_HANDLES) - CHK_ERR_WIN32A(ERROR_RESOURCE_DATA_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_RESOURCE_TYPE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_RESOURCE_NAME_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_RESOURCE_LANG_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_NOT_ENOUGH_QUOTA) - CHK_ERR_WIN32A(RPC_S_NO_INTERFACES) - CHK_ERR_WIN32A(RPC_S_CALL_CANCELLED) - CHK_ERR_WIN32A(RPC_S_BINDING_INCOMPLETE) - CHK_ERR_WIN32A(RPC_S_COMM_FAILURE) - CHK_ERR_WIN32A(RPC_S_UNSUPPORTED_AUTHN_LEVEL) - CHK_ERR_WIN32A(RPC_S_NO_PRINC_NAME) - CHK_ERR_WIN32A(RPC_S_NOT_RPC_ERROR) - CHK_ERR_WIN32A(RPC_S_UUID_LOCAL_ONLY) - CHK_ERR_WIN32A(RPC_S_SEC_PKG_ERROR) - CHK_ERR_WIN32A(RPC_S_NOT_CANCELLED) - CHK_ERR_WIN32A(RPC_X_INVALID_ES_ACTION) - CHK_ERR_WIN32A(RPC_X_WRONG_ES_VERSION) - CHK_ERR_WIN32A(RPC_X_WRONG_STUB_VERSION) - CHK_ERR_WIN32A(RPC_X_INVALID_PIPE_OBJECT) - CHK_ERR_WIN32A(RPC_X_WRONG_PIPE_ORDER) - CHK_ERR_WIN32A(RPC_X_WRONG_PIPE_VERSION) - CHK_ERR_WIN32A(RPC_S_GROUP_MEMBER_NOT_FOUND) - CHK_ERR_WIN32A(EPT_S_CANT_CREATE) - CHK_ERR_WIN32A(RPC_S_INVALID_OBJECT) - CHK_ERR_WIN32A(ERROR_INVALID_TIME) - CHK_ERR_WIN32A(ERROR_INVALID_FORM_NAME) - CHK_ERR_WIN32A(ERROR_INVALID_FORM_SIZE) - CHK_ERR_WIN32A(ERROR_ALREADY_WAITING) - CHK_ERR_WIN32A(ERROR_PRINTER_DELETED) - CHK_ERR_WIN32A(ERROR_INVALID_PRINTER_STATE) - CHK_ERR_WIN32A(ERROR_PASSWORD_MUST_CHANGE) - CHK_ERR_WIN32A(ERROR_DOMAIN_CONTROLLER_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_ACCOUNT_LOCKED_OUT) - CHK_ERR_WIN32A(OR_INVALID_OXID) - CHK_ERR_WIN32A(OR_INVALID_OID) - CHK_ERR_WIN32A(OR_INVALID_SET) - CHK_ERR_WIN32A(RPC_S_SEND_INCOMPLETE) - CHK_ERR_WIN32A(RPC_S_INVALID_ASYNC_HANDLE) - CHK_ERR_WIN32A(RPC_S_INVALID_ASYNC_CALL) - CHK_ERR_WIN32A(RPC_X_PIPE_CLOSED) - CHK_ERR_WIN32A(RPC_X_PIPE_DISCIPLINE_ERROR) - CHK_ERR_WIN32A(RPC_X_PIPE_EMPTY) - CHK_ERR_WIN32A(ERROR_NO_SITENAME) - CHK_ERR_WIN32A(ERROR_CANT_ACCESS_FILE) - CHK_ERR_WIN32A(ERROR_CANT_RESOLVE_FILENAME) - CHK_ERR_WIN32A(ERROR_INVALID_PIXEL_FORMAT) - CHK_ERR_WIN32A(ERROR_BAD_DRIVER) - CHK_ERR_WIN32A(ERROR_INVALID_WINDOW_STYLE) - CHK_ERR_WIN32A(ERROR_METAFILE_NOT_SUPPORTED) - CHK_ERR_WIN32A(ERROR_TRANSFORM_NOT_SUPPORTED) - CHK_ERR_WIN32A(ERROR_CLIPPING_NOT_SUPPORTED) - CHK_ERR_WIN32A(ERROR_INVALID_CMM) - CHK_ERR_WIN32A(ERROR_INVALID_PROFILE) - CHK_ERR_WIN32A(ERROR_TAG_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_TAG_NOT_PRESENT) - CHK_ERR_WIN32A(ERROR_DUPLICATE_TAG) - CHK_ERR_WIN32A(ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE) - CHK_ERR_WIN32A(ERROR_PROFILE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_INVALID_COLORSPACE) - CHK_ERR_WIN32A(ERROR_ICM_NOT_ENABLED) - CHK_ERR_WIN32A(ERROR_DELETING_ICM_XFORM) - CHK_ERR_WIN32A(ERROR_INVALID_TRANSFORM) - CHK_ERR_WIN32A(ERROR_COLORSPACE_MISMATCH) - CHK_ERR_WIN32A(ERROR_INVALID_COLORINDEX) - CHK_ERR_WIN32A(ERROR_CONNECTED_OTHER_PASSWORD) - CHK_ERR_WIN32A(ERROR_BAD_USERNAME) - CHK_ERR_WIN32A(ERROR_NOT_CONNECTED) - CHK_ERR_WIN32A(ERROR_OPEN_FILES) - CHK_ERR_WIN32A(ERROR_ACTIVE_CONNECTIONS) - CHK_ERR_WIN32A(ERROR_DEVICE_IN_USE) - CHK_ERR_WIN32A(ERROR_UNKNOWN_PRINT_MONITOR) - CHK_ERR_WIN32A(ERROR_PRINTER_DRIVER_IN_USE) - CHK_ERR_WIN32A(ERROR_SPOOL_FILE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_SPL_NO_STARTDOC) - CHK_ERR_WIN32A(ERROR_SPL_NO_ADDJOB) - CHK_ERR_WIN32A(ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED) - CHK_ERR_WIN32A(ERROR_PRINT_MONITOR_ALREADY_INSTALLED) - CHK_ERR_WIN32A(ERROR_INVALID_PRINT_MONITOR) - CHK_ERR_WIN32A(ERROR_PRINT_MONITOR_IN_USE) - CHK_ERR_WIN32A(ERROR_PRINTER_HAS_JOBS_QUEUED) - CHK_ERR_WIN32A(ERROR_SUCCESS_REBOOT_REQUIRED) - CHK_ERR_WIN32A(ERROR_SUCCESS_RESTART_REQUIRED) - CHK_ERR_WIN32A(ERROR_PRINTER_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_WINS_INTERNAL) - CHK_ERR_WIN32A(ERROR_CAN_NOT_DEL_LOCAL_WINS) - CHK_ERR_WIN32A(ERROR_STATIC_INIT) - CHK_ERR_WIN32A(ERROR_INC_BACKUP) - CHK_ERR_WIN32A(ERROR_FULL_BACKUP) - CHK_ERR_WIN32A(ERROR_REC_NON_EXISTENT) - CHK_ERR_WIN32A(ERROR_RPL_NOT_ALLOWED) - CHK_ERR_WIN32A(ERROR_DHCP_ADDRESS_CONFLICT) - CHK_ERR_WIN32A(ERROR_WMI_GUID_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_WMI_INSTANCE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_WMI_ITEMID_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_WMI_TRY_AGAIN) - CHK_ERR_WIN32A(ERROR_WMI_DP_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_WMI_UNRESOLVED_INSTANCE_REF) - CHK_ERR_WIN32A(ERROR_WMI_ALREADY_ENABLED) - CHK_ERR_WIN32A(ERROR_WMI_GUID_DISCONNECTED) - CHK_ERR_WIN32A(ERROR_WMI_SERVER_UNAVAILABLE) - CHK_ERR_WIN32A(ERROR_WMI_DP_FAILED) - CHK_ERR_WIN32A(ERROR_WMI_INVALID_MOF) - CHK_ERR_WIN32A(ERROR_WMI_INVALID_REGINFO) - CHK_ERR_WIN32A(ERROR_WMI_ALREADY_DISABLED) - CHK_ERR_WIN32A(ERROR_WMI_READ_ONLY) - CHK_ERR_WIN32A(ERROR_WMI_SET_FAILURE) - CHK_ERR_WIN32A(ERROR_INVALID_MEDIA) - CHK_ERR_WIN32A(ERROR_INVALID_LIBRARY) - CHK_ERR_WIN32A(ERROR_INVALID_MEDIA_POOL) - CHK_ERR_WIN32A(ERROR_DRIVE_MEDIA_MISMATCH) - CHK_ERR_WIN32A(ERROR_MEDIA_OFFLINE) - CHK_ERR_WIN32A(ERROR_LIBRARY_OFFLINE) - CHK_ERR_WIN32A(ERROR_EMPTY) - CHK_ERR_WIN32A(ERROR_NOT_EMPTY) - CHK_ERR_WIN32A(ERROR_MEDIA_UNAVAILABLE) - CHK_ERR_WIN32A(ERROR_RESOURCE_DISABLED) - CHK_ERR_WIN32A(ERROR_INVALID_CLEANER) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_CLEAN) - CHK_ERR_WIN32A(ERROR_OBJECT_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_DATABASE_FAILURE) - CHK_ERR_WIN32A(ERROR_DATABASE_FULL) - CHK_ERR_WIN32A(ERROR_MEDIA_INCOMPATIBLE) - CHK_ERR_WIN32A(ERROR_RESOURCE_NOT_PRESENT) - CHK_ERR_WIN32A(ERROR_INVALID_OPERATION) - CHK_ERR_WIN32A(ERROR_MEDIA_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_DEVICE_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_REQUEST_REFUSED) - CHK_ERR_WIN32A(ERROR_INVALID_DRIVE_OBJECT) - CHK_ERR_WIN32A(ERROR_LIBRARY_FULL) - CHK_ERR_WIN32A(ERROR_MEDIUM_NOT_ACCESSIBLE) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_LOAD_MEDIUM) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_INVENTORY_DRIVE) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_INVENTORY_SLOT) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_INVENTORY_TRANSPORT) - CHK_ERR_WIN32A(ERROR_TRANSPORT_FULL) - CHK_ERR_WIN32A(ERROR_CONTROLLING_IEPORT) - CHK_ERR_WIN32A(ERROR_UNABLE_TO_EJECT_MOUNTED_MEDIA) - CHK_ERR_WIN32A(ERROR_CLEANER_SLOT_SET) - CHK_ERR_WIN32A(ERROR_CLEANER_SLOT_NOT_SET) - CHK_ERR_WIN32A(ERROR_CLEANER_CARTRIDGE_SPENT) - CHK_ERR_WIN32A(ERROR_UNEXPECTED_OMID) - CHK_ERR_WIN32A(ERROR_CANT_DELETE_LAST_ITEM) - CHK_ERR_WIN32A(ERROR_MESSAGE_EXCEEDS_MAX_SIZE) - CHK_ERR_WIN32A(ERROR_FILE_OFFLINE) - CHK_ERR_WIN32A(ERROR_REMOTE_STORAGE_NOT_ACTIVE) - CHK_ERR_WIN32A(ERROR_REMOTE_STORAGE_MEDIA_ERROR) - CHK_ERR_WIN32A(ERROR_NOT_A_REPARSE_POINT) - CHK_ERR_WIN32A(ERROR_REPARSE_ATTRIBUTE_CONFLICT) - CHK_ERR_WIN32A(ERROR_INVALID_REPARSE_DATA) - CHK_ERR_WIN32A(ERROR_DEPENDENT_RESOURCE_EXISTS) - CHK_ERR_WIN32A(ERROR_DEPENDENCY_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_DEPENDENCY_ALREADY_EXISTS) - CHK_ERR_WIN32A(ERROR_RESOURCE_NOT_ONLINE) - CHK_ERR_WIN32A(ERROR_HOST_NODE_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_RESOURCE_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_RESOURCE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_SHUTDOWN_CLUSTER) - CHK_ERR_WIN32A(ERROR_CANT_EVICT_ACTIVE_NODE) - CHK_ERR_WIN32A(ERROR_OBJECT_ALREADY_EXISTS) - CHK_ERR_WIN32A(ERROR_OBJECT_IN_LIST) - CHK_ERR_WIN32A(ERROR_GROUP_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_GROUP_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_GROUP_NOT_ONLINE) - CHK_ERR_WIN32A(ERROR_HOST_NODE_NOT_RESOURCE_OWNER) - CHK_ERR_WIN32A(ERROR_HOST_NODE_NOT_GROUP_OWNER) - CHK_ERR_WIN32A(ERROR_RESMON_CREATE_FAILED) - CHK_ERR_WIN32A(ERROR_RESMON_ONLINE_FAILED) - CHK_ERR_WIN32A(ERROR_RESOURCE_ONLINE) - CHK_ERR_WIN32A(ERROR_QUORUM_RESOURCE) - CHK_ERR_WIN32A(ERROR_NOT_QUORUM_CAPABLE) - CHK_ERR_WIN32A(ERROR_CLUSTER_SHUTTING_DOWN) - CHK_ERR_WIN32A(ERROR_INVALID_STATE) - CHK_ERR_WIN32A(ERROR_RESOURCE_PROPERTIES_STORED) - CHK_ERR_WIN32A(ERROR_NOT_QUORUM_CLASS) - CHK_ERR_WIN32A(ERROR_CORE_RESOURCE) - CHK_ERR_WIN32A(ERROR_QUORUM_RESOURCE_ONLINE_FAILED) - CHK_ERR_WIN32A(ERROR_QUORUMLOG_OPEN_FAILED) - CHK_ERR_WIN32A(ERROR_CLUSTERLOG_CORRUPT) - CHK_ERR_WIN32A(ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZE) - CHK_ERR_WIN32A(ERROR_CLUSTERLOG_EXCEEDS_MAXSIZE) - CHK_ERR_WIN32A(ERROR_CLUSTERLOG_CHKPOINT_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CLUSTERLOG_NOT_ENOUGH_SPACE) - CHK_ERR_WIN32A(ERROR_ENCRYPTION_FAILED) - CHK_ERR_WIN32A(ERROR_DECRYPTION_FAILED) - CHK_ERR_WIN32A(ERROR_FILE_ENCRYPTED) - CHK_ERR_WIN32A(ERROR_NO_RECOVERY_POLICY) - CHK_ERR_WIN32A(ERROR_NO_EFS) - CHK_ERR_WIN32A(ERROR_WRONG_EFS) - CHK_ERR_WIN32A(ERROR_NO_USER_KEYS) - CHK_ERR_WIN32A(ERROR_FILE_NOT_ENCRYPTED) - CHK_ERR_WIN32A(ERROR_NOT_EXPORT_FORMAT) - CHK_ERR_WIN32A(ERROR_NO_BROWSER_SERVERS_FOUND) - CHK_ERR_WIN32A(ERROR_CTX_WINSTATION_NAME_INVALID) - CHK_ERR_WIN32A(ERROR_CTX_INVALID_PD) - CHK_ERR_WIN32A(ERROR_CTX_PD_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CTX_WD_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CTX_CANNOT_MAKE_EVENTLOG_ENTRY) - CHK_ERR_WIN32A(ERROR_CTX_SERVICE_NAME_COLLISION) - CHK_ERR_WIN32A(ERROR_CTX_CLOSE_PENDING) - CHK_ERR_WIN32A(ERROR_CTX_NO_OUTBUF) - CHK_ERR_WIN32A(ERROR_CTX_MODEM_INF_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CTX_INVALID_MODEMNAME) - CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_ERROR) - CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_TIMEOUT) - CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_NO_CARRIER) - CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_NO_DIALTONE) - CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_BUSY) - CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_VOICE) - CHK_ERR_WIN32A(ERROR_CTX_TD_ERROR) - CHK_ERR_WIN32A(ERROR_CTX_WINSTATION_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CTX_WINSTATION_ALREADY_EXISTS) - CHK_ERR_WIN32A(ERROR_CTX_WINSTATION_BUSY) - CHK_ERR_WIN32A(ERROR_CTX_BAD_VIDEO_MODE) - CHK_ERR_WIN32A(ERROR_CTX_GRAPHICS_INVALID) - CHK_ERR_WIN32A(ERROR_CTX_LOGON_DISABLED) - CHK_ERR_WIN32A(ERROR_CTX_NOT_CONSOLE) - CHK_ERR_WIN32A(ERROR_CTX_CLIENT_QUERY_TIMEOUT) - CHK_ERR_WIN32A(ERROR_CTX_CONSOLE_DISCONNECT) - CHK_ERR_WIN32A(ERROR_CTX_CONSOLE_CONNECT) - CHK_ERR_WIN32A(ERROR_CTX_SHADOW_DENIED) - CHK_ERR_WIN32A(ERROR_CTX_WINSTATION_ACCESS_DENIED) - CHK_ERR_WIN32A(ERROR_CTX_INVALID_WD) - CHK_ERR_WIN32A(ERROR_CTX_SHADOW_INVALID) - CHK_ERR_WIN32A(ERROR_CTX_SHADOW_DISABLED) - CHK_ERR_WIN32A(FRS_ERR_INVALID_API_SEQUENCE) - CHK_ERR_WIN32A(FRS_ERR_STARTING_SERVICE) - CHK_ERR_WIN32A(FRS_ERR_STOPPING_SERVICE) - CHK_ERR_WIN32A(FRS_ERR_INTERNAL_API) - CHK_ERR_WIN32A(FRS_ERR_INTERNAL) - CHK_ERR_WIN32A(FRS_ERR_SERVICE_COMM) - CHK_ERR_WIN32A(FRS_ERR_INSUFFICIENT_PRIV) - CHK_ERR_WIN32A(FRS_ERR_AUTHENTICATION) - CHK_ERR_WIN32A(FRS_ERR_PARENT_INSUFFICIENT_PRIV) - CHK_ERR_WIN32A(FRS_ERR_PARENT_AUTHENTICATION) - CHK_ERR_WIN32A(FRS_ERR_CHILD_TO_PARENT_COMM) - CHK_ERR_WIN32A(FRS_ERR_PARENT_TO_CHILD_COMM) - CHK_ERR_WIN32A(FRS_ERR_SYSVOL_POPULATE) - CHK_ERR_WIN32A(FRS_ERR_SYSVOL_POPULATE_TIMEOUT) - CHK_ERR_WIN32A(FRS_ERR_SYSVOL_IS_BUSY) - CHK_ERR_WIN32A(FRS_ERR_SYSVOL_DEMOTE) - CHK_ERR_WIN32A(FRS_ERR_INVALID_SERVICE_PARAMETER) -// CHK_ERR_WIN32A(DS_S_SUCCESS) - CHK_ERR_WIN32A(ERROR_DS_NOT_INSTALLED) - CHK_ERR_WIN32A(ERROR_DS_MEMBERSHIP_EVALUATED_LOCALLY) - CHK_ERR_WIN32A(ERROR_DS_NO_ATTRIBUTE_OR_VALUE) - CHK_ERR_WIN32A(ERROR_DS_INVALID_ATTRIBUTE_SYNTAX) - CHK_ERR_WIN32A(ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED) - CHK_ERR_WIN32A(ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS) - CHK_ERR_WIN32A(ERROR_DS_BUSY) - CHK_ERR_WIN32A(ERROR_DS_UNAVAILABLE) - CHK_ERR_WIN32A(ERROR_DS_NO_RIDS_ALLOCATED) - CHK_ERR_WIN32A(ERROR_DS_NO_MORE_RIDS) - CHK_ERR_WIN32A(ERROR_DS_INCORRECT_ROLE_OWNER) - CHK_ERR_WIN32A(ERROR_DS_RIDMGR_INIT_ERROR) - CHK_ERR_WIN32A(ERROR_DS_OBJ_CLASS_VIOLATION) - CHK_ERR_WIN32A(ERROR_DS_CANT_ON_NON_LEAF) - CHK_ERR_WIN32A(ERROR_DS_CANT_ON_RDN) - CHK_ERR_WIN32A(ERROR_DS_CANT_MOD_OBJ_CLASS) - CHK_ERR_WIN32A(ERROR_DS_CROSS_DOM_MOVE_ERROR) - CHK_ERR_WIN32A(ERROR_DS_GC_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_SHARED_POLICY) - CHK_ERR_WIN32A(ERROR_POLICY_OBJECT_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_POLICY_ONLY_IN_DS) - CHK_ERR_WIN32A(ERROR_PROMOTION_ACTIVE) - CHK_ERR_WIN32A(ERROR_NO_PROMOTION_ACTIVE) - CHK_ERR_WIN32A(ERROR_DS_OPERATIONS_ERROR) - CHK_ERR_WIN32A(ERROR_DS_PROTOCOL_ERROR) - CHK_ERR_WIN32A(ERROR_DS_TIMELIMIT_EXCEEDED) - CHK_ERR_WIN32A(ERROR_DS_SIZELIMIT_EXCEEDED) - CHK_ERR_WIN32A(ERROR_DS_ADMIN_LIMIT_EXCEEDED) - CHK_ERR_WIN32A(ERROR_DS_COMPARE_FALSE) - CHK_ERR_WIN32A(ERROR_DS_COMPARE_TRUE) - CHK_ERR_WIN32A(ERROR_DS_AUTH_METHOD_NOT_SUPPORTED) - CHK_ERR_WIN32A(ERROR_DS_STRONG_AUTH_REQUIRED) - CHK_ERR_WIN32A(ERROR_DS_INAPPROPRIATE_AUTH) - CHK_ERR_WIN32A(ERROR_DS_AUTH_UNKNOWN) - CHK_ERR_WIN32A(ERROR_DS_REFERRAL) - CHK_ERR_WIN32A(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION) - CHK_ERR_WIN32A(ERROR_DS_CONFIDENTIALITY_REQUIRED) - CHK_ERR_WIN32A(ERROR_DS_INAPPROPRIATE_MATCHING) - CHK_ERR_WIN32A(ERROR_DS_CONSTRAINT_VIOLATION) - CHK_ERR_WIN32A(ERROR_DS_NO_SUCH_OBJECT) - CHK_ERR_WIN32A(ERROR_DS_ALIAS_PROBLEM) - CHK_ERR_WIN32A(ERROR_DS_INVALID_DN_SYNTAX) - CHK_ERR_WIN32A(ERROR_DS_IS_LEAF) - CHK_ERR_WIN32A(ERROR_DS_ALIAS_DEREF_PROBLEM) - CHK_ERR_WIN32A(ERROR_DS_UNWILLING_TO_PERFORM) - CHK_ERR_WIN32A(ERROR_DS_LOOP_DETECT) - CHK_ERR_WIN32A(ERROR_DS_NAMING_VIOLATION) - CHK_ERR_WIN32A(ERROR_DS_OBJECT_RESULTS_TOO_LARGE) - CHK_ERR_WIN32A(ERROR_DS_AFFECTS_MULTIPLE_DSAS) - CHK_ERR_WIN32A(ERROR_DS_SERVER_DOWN) - CHK_ERR_WIN32A(ERROR_DS_LOCAL_ERROR) - CHK_ERR_WIN32A(ERROR_DS_ENCODING_ERROR) - CHK_ERR_WIN32A(ERROR_DS_DECODING_ERROR) - CHK_ERR_WIN32A(ERROR_DS_FILTER_UNKNOWN) - CHK_ERR_WIN32A(ERROR_DS_PARAM_ERROR) - CHK_ERR_WIN32A(ERROR_DS_NOT_SUPPORTED) - CHK_ERR_WIN32A(ERROR_DS_NO_RESULTS_RETURNED) - CHK_ERR_WIN32A(ERROR_DS_CONTROL_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_DS_CLIENT_LOOP) - CHK_ERR_WIN32A(ERROR_DS_REFERRAL_LIMIT_EXCEEDED) - CHK_ERR_WIN32A(ERROR_DS_ROOT_MUST_BE_NC) - CHK_ERR_WIN32A(ERROR_DS_ADD_REPLICA_INHIBITED) - CHK_ERR_WIN32A(ERROR_DS_ATT_NOT_DEF_IN_SCHEMA) - CHK_ERR_WIN32A(ERROR_DS_MAX_OBJ_SIZE_EXCEEDED) - CHK_ERR_WIN32A(ERROR_DS_OBJ_STRING_NAME_EXISTS) - CHK_ERR_WIN32A(ERROR_DS_NO_RDN_DEFINED_IN_SCHEMA) - CHK_ERR_WIN32A(ERROR_DS_RDN_DOESNT_MATCH_SCHEMA) - CHK_ERR_WIN32A(ERROR_DS_NO_REQUESTED_ATTS_FOUND) - CHK_ERR_WIN32A(ERROR_DS_USER_BUFFER_TO_SMALL) - CHK_ERR_WIN32A(ERROR_DS_ATT_IS_NOT_ON_OBJ) - CHK_ERR_WIN32A(ERROR_DS_ILLEGAL_MOD_OPERATION) - CHK_ERR_WIN32A(ERROR_DS_OBJ_TOO_LARGE) - CHK_ERR_WIN32A(ERROR_DS_BAD_INSTANCE_TYPE) - CHK_ERR_WIN32A(ERROR_DS_MASTERDSA_REQUIRED) - CHK_ERR_WIN32A(ERROR_DS_OBJECT_CLASS_REQUIRED) - CHK_ERR_WIN32A(ERROR_DS_MISSING_REQUIRED_ATT) - CHK_ERR_WIN32A(ERROR_DS_ATT_NOT_DEF_FOR_CLASS) - CHK_ERR_WIN32A(ERROR_DS_ATT_ALREADY_EXISTS) - CHK_ERR_WIN32A(ERROR_DS_CANT_ADD_ATT_VALUES) - CHK_ERR_WIN32A(ERROR_DS_SINGLE_VALUE_CONSTRAINT) - CHK_ERR_WIN32A(ERROR_DS_RANGE_CONSTRAINT) - CHK_ERR_WIN32A(ERROR_DS_ATT_VAL_ALREADY_EXISTS) - CHK_ERR_WIN32A(ERROR_DS_CANT_REM_MISSING_ATT) - CHK_ERR_WIN32A(ERROR_DS_CANT_REM_MISSING_ATT_VAL) - CHK_ERR_WIN32A(ERROR_DS_ROOT_CANT_BE_SUBREF) - CHK_ERR_WIN32A(ERROR_DS_NO_CHAINING) - CHK_ERR_WIN32A(ERROR_DS_NO_CHAINED_EVAL) - CHK_ERR_WIN32A(ERROR_DS_NO_PARENT_OBJECT) - CHK_ERR_WIN32A(ERROR_DS_PARENT_IS_AN_ALIAS) - CHK_ERR_WIN32A(ERROR_DS_CANT_MIX_MASTER_AND_REPS) - CHK_ERR_WIN32A(ERROR_DS_CHILDREN_EXIST) - CHK_ERR_WIN32A(ERROR_DS_OBJ_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_DS_ALIASED_OBJ_MISSING) - CHK_ERR_WIN32A(ERROR_DS_BAD_NAME_SYNTAX) - CHK_ERR_WIN32A(ERROR_DS_ALIAS_POINTS_TO_ALIAS) - CHK_ERR_WIN32A(ERROR_DS_CANT_DEREF_ALIAS) - CHK_ERR_WIN32A(ERROR_DS_OUT_OF_SCOPE) - CHK_ERR_WIN32A(ERROR_DS_CANT_DELETE_DSA_OBJ) - CHK_ERR_WIN32A(ERROR_DS_GENERIC_ERROR) - CHK_ERR_WIN32A(ERROR_DS_DSA_MUST_BE_INT_MASTER) - CHK_ERR_WIN32A(ERROR_DS_CLASS_NOT_DSA) - CHK_ERR_WIN32A(ERROR_DS_INSUFF_ACCESS_RIGHTS) - CHK_ERR_WIN32A(ERROR_DS_ILLEGAL_SUPERIOR) - CHK_ERR_WIN32A(ERROR_DS_ATTRIBUTE_OWNED_BY_SAM) - CHK_ERR_WIN32A(ERROR_DS_NAME_TOO_MANY_PARTS) - CHK_ERR_WIN32A(ERROR_DS_NAME_TOO_LONG) - CHK_ERR_WIN32A(ERROR_DS_NAME_VALUE_TOO_LONG) - CHK_ERR_WIN32A(ERROR_DS_NAME_UNPARSEABLE) - CHK_ERR_WIN32A(ERROR_DS_NAME_TYPE_UNKNOWN) - CHK_ERR_WIN32A(ERROR_DS_NOT_AN_OBJECT) - CHK_ERR_WIN32A(ERROR_DS_SEC_DESC_TOO_SHORT) - CHK_ERR_WIN32A(ERROR_DS_SEC_DESC_INVALID) - CHK_ERR_WIN32A(ERROR_DS_NO_DELETED_NAME) - CHK_ERR_WIN32A(ERROR_DS_SUBREF_MUST_HAVE_PARENT) - CHK_ERR_WIN32A(ERROR_DS_NCNAME_MUST_BE_NC) - CHK_ERR_WIN32A(ERROR_DS_CANT_ADD_SYSTEM_ONLY) - CHK_ERR_WIN32A(ERROR_DS_CLASS_MUST_BE_CONCRETE) - CHK_ERR_WIN32A(ERROR_DS_INVALID_DMD) - CHK_ERR_WIN32A(ERROR_DS_OBJ_GUID_EXISTS) - CHK_ERR_WIN32A(ERROR_DS_NOT_ON_BACKLINK) - CHK_ERR_WIN32A(ERROR_DS_NO_CROSSREF_FOR_NC) - CHK_ERR_WIN32A(ERROR_DS_SHUTTING_DOWN) - CHK_ERR_WIN32A(ERROR_DS_UNKNOWN_OPERATION) - CHK_ERR_WIN32A(ERROR_DS_INVALID_ROLE_OWNER) - CHK_ERR_WIN32A(ERROR_DS_COULDNT_CONTACT_FSMO) - CHK_ERR_WIN32A(ERROR_DS_CROSS_NC_DN_RENAME) - CHK_ERR_WIN32A(ERROR_DS_CANT_MOD_SYSTEM_ONLY) - CHK_ERR_WIN32A(ERROR_DS_REPLICATOR_ONLY) - CHK_ERR_WIN32A(ERROR_DS_OBJ_CLASS_NOT_DEFINED) - CHK_ERR_WIN32A(ERROR_DS_OBJ_CLASS_NOT_SUBCLASS) - CHK_ERR_WIN32A(ERROR_DS_NAME_REFERENCE_INVALID) - CHK_ERR_WIN32A(ERROR_DS_CROSS_REF_EXISTS) - CHK_ERR_WIN32A(ERROR_DS_CANT_DEL_MASTER_CROSSREF) - CHK_ERR_WIN32A(ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEAD) - CHK_ERR_WIN32A(ERROR_DS_NOTIFY_FILTER_TOO_COMPLEX) - CHK_ERR_WIN32A(ERROR_DS_DUP_RDN) - CHK_ERR_WIN32A(ERROR_DS_DUP_OID) - CHK_ERR_WIN32A(ERROR_DS_DUP_MAPI_ID) - CHK_ERR_WIN32A(ERROR_DS_DUP_SCHEMA_ID_GUID) - CHK_ERR_WIN32A(ERROR_DS_DUP_LDAP_DISPLAY_NAME) - CHK_ERR_WIN32A(ERROR_DS_SEMANTIC_ATT_TEST) - CHK_ERR_WIN32A(ERROR_DS_SYNTAX_MISMATCH) - CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_MUST_HAVE) - CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_MAY_HAVE) - CHK_ERR_WIN32A(ERROR_DS_NONEXISTENT_MAY_HAVE) - CHK_ERR_WIN32A(ERROR_DS_NONEXISTENT_MUST_HAVE) - CHK_ERR_WIN32A(ERROR_DS_AUX_CLS_TEST_FAIL) - CHK_ERR_WIN32A(ERROR_DS_NONEXISTENT_POSS_SUP) - CHK_ERR_WIN32A(ERROR_DS_SUB_CLS_TEST_FAIL) - CHK_ERR_WIN32A(ERROR_DS_BAD_RDN_ATT_ID_SYNTAX) - CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_AUX_CLS) - CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_SUB_CLS) - CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_POSS_SUP) - CHK_ERR_WIN32A(ERROR_DS_RECALCSCHEMA_FAILED) - CHK_ERR_WIN32A(ERROR_DS_TREE_DELETE_NOT_FINISHED) - CHK_ERR_WIN32A(ERROR_DS_CANT_DELETE) - CHK_ERR_WIN32A(ERROR_DS_ATT_SCHEMA_REQ_ID) - CHK_ERR_WIN32A(ERROR_DS_BAD_ATT_SCHEMA_SYNTAX) - CHK_ERR_WIN32A(ERROR_DS_CANT_CACHE_ATT) - CHK_ERR_WIN32A(ERROR_DS_CANT_CACHE_CLASS) - CHK_ERR_WIN32A(ERROR_DS_CANT_REMOVE_ATT_CACHE) - CHK_ERR_WIN32A(ERROR_DS_CANT_REMOVE_CLASS_CACHE) - CHK_ERR_WIN32A(ERROR_DS_CANT_RETRIEVE_DN) - CHK_ERR_WIN32A(ERROR_DS_MISSING_SUPREF) - CHK_ERR_WIN32A(ERROR_DS_CANT_RETRIEVE_INSTANCE) - CHK_ERR_WIN32A(ERROR_DS_CODE_INCONSISTENCY) - CHK_ERR_WIN32A(ERROR_DS_DATABASE_ERROR) - CHK_ERR_WIN32A(ERROR_DS_GOVERNSID_MISSING) - CHK_ERR_WIN32A(ERROR_DS_MISSING_EXPECTED_ATT) - CHK_ERR_WIN32A(ERROR_DS_NCNAME_MISSING_CR_REF) - CHK_ERR_WIN32A(ERROR_DS_SECURITY_CHECKING_ERROR) - CHK_ERR_WIN32A(ERROR_DS_SCHEMA_NOT_LOADED) - CHK_ERR_WIN32A(ERROR_DS_SCHEMA_ALLOC_FAILED) - CHK_ERR_WIN32A(ERROR_DS_ATT_SCHEMA_REQ_SYNTAX) - CHK_ERR_WIN32A(ERROR_DS_GCVERIFY_ERROR) - CHK_ERR_WIN32A(ERROR_DS_DRA_SCHEMA_MISMATCH) - CHK_ERR_WIN32A(ERROR_DS_CANT_FIND_DSA_OBJ) - CHK_ERR_WIN32A(ERROR_DS_CANT_FIND_EXPECTED_NC) - CHK_ERR_WIN32A(ERROR_DS_CANT_FIND_NC_IN_CACHE) - CHK_ERR_WIN32A(ERROR_DS_CANT_RETRIEVE_CHILD) - CHK_ERR_WIN32A(ERROR_DS_SECURITY_ILLEGAL_MODIFY) - CHK_ERR_WIN32A(ERROR_DS_CANT_REPLACE_HIDDEN_REC) - CHK_ERR_WIN32A(ERROR_DS_BAD_HIERARCHY_FILE) - CHK_ERR_WIN32A(ERROR_DS_BUILD_HIERARCHY_TABLE_FAILED) - CHK_ERR_WIN32A(ERROR_DS_CONFIG_PARAM_MISSING) - CHK_ERR_WIN32A(ERROR_DS_COUNTING_AB_INDICES_FAILED) - CHK_ERR_WIN32A(ERROR_DS_HIERARCHY_TABLE_MALLOC_FAILED) - CHK_ERR_WIN32A(ERROR_DS_INTERNAL_FAILURE) - CHK_ERR_WIN32A(ERROR_DS_UNKNOWN_ERROR) - CHK_ERR_WIN32A(ERROR_DS_ROOT_REQUIRES_CLASS_TOP) - CHK_ERR_WIN32A(ERROR_DS_REFUSING_FSMO_ROLES) - CHK_ERR_WIN32A(ERROR_DS_MISSING_FSMO_SETTINGS) - CHK_ERR_WIN32A(ERROR_DS_UNABLE_TO_SURRENDER_ROLES) - CHK_ERR_WIN32A(ERROR_DS_DRA_GENERIC) - CHK_ERR_WIN32A(ERROR_DS_DRA_INVALID_PARAMETER) - CHK_ERR_WIN32A(ERROR_DS_DRA_BUSY) - CHK_ERR_WIN32A(ERROR_DS_DRA_BAD_DN) - CHK_ERR_WIN32A(ERROR_DS_DRA_BAD_NC) - CHK_ERR_WIN32A(ERROR_DS_DRA_DN_EXISTS) - CHK_ERR_WIN32A(ERROR_DS_DRA_INTERNAL_ERROR) - CHK_ERR_WIN32A(ERROR_DS_DRA_INCONSISTENT_DIT) - CHK_ERR_WIN32A(ERROR_DS_DRA_CONNECTION_FAILED) - CHK_ERR_WIN32A(ERROR_DS_DRA_BAD_INSTANCE_TYPE) - CHK_ERR_WIN32A(ERROR_DS_DRA_OUT_OF_MEM) - CHK_ERR_WIN32A(ERROR_DS_DRA_MAIL_PROBLEM) - CHK_ERR_WIN32A(ERROR_DS_DRA_REF_ALREADY_EXISTS) - CHK_ERR_WIN32A(ERROR_DS_DRA_REF_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_DS_DRA_OBJ_IS_REP_SOURCE) - CHK_ERR_WIN32A(ERROR_DS_DRA_DB_ERROR) - CHK_ERR_WIN32A(ERROR_DS_DRA_NO_REPLICA) - CHK_ERR_WIN32A(ERROR_DS_DRA_ACCESS_DENIED) - CHK_ERR_WIN32A(ERROR_DS_DRA_NOT_SUPPORTED) - CHK_ERR_WIN32A(ERROR_DS_DRA_RPC_CANCELLED) - CHK_ERR_WIN32A(ERROR_DS_DRA_SOURCE_DISABLED) - CHK_ERR_WIN32A(ERROR_DS_DRA_SINK_DISABLED) - CHK_ERR_WIN32A(ERROR_DS_DRA_NAME_COLLISION) - CHK_ERR_WIN32A(ERROR_DS_DRA_SOURCE_REINSTALLED) - CHK_ERR_WIN32A(ERROR_DS_DRA_MISSING_PARENT) - CHK_ERR_WIN32A(ERROR_DS_DRA_PREEMPTED) - CHK_ERR_WIN32A(ERROR_DS_DRA_ABANDON_SYNC) - CHK_ERR_WIN32A(ERROR_DS_DRA_SHUTDOWN) - CHK_ERR_WIN32A(ERROR_DS_DRA_INCOMPATIBLE_PARTIAL_SET) - CHK_ERR_WIN32A(ERROR_DS_DRA_SOURCE_IS_PARTIAL_REPLICA) - CHK_ERR_WIN32A(ERROR_DS_DRA_EXTN_CONNECTION_FAILED) - CHK_ERR_WIN32A(ERROR_DS_INSTALL_SCHEMA_MISMATCH) - CHK_ERR_WIN32A(ERROR_DS_DUP_LINK_ID) - CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_RESOLVING) - CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_NOT_UNIQUE) - CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_NO_MAPPING) - CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_DOMAIN_ONLY) - CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING) - CHK_ERR_WIN32A(ERROR_DS_CONSTRUCTED_ATT_MOD) - CHK_ERR_WIN32A(ERROR_DS_WRONG_OM_OBJ_CLASS) - CHK_ERR_WIN32A(ERROR_DS_DRA_REPL_PENDING) - CHK_ERR_WIN32A(DNS_ERROR_RESPONSE_CODES_BASE) -// CHK_ERR_WIN32A(DNS_ERROR_MASK) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_FORMAT_ERROR) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_SERVER_FAILURE) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_NAME_ERROR) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_NOT_IMPLEMENTED) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_REFUSED) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_YXDOMAIN) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_YXRRSET) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_NXRRSET) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_NOTAUTH) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_NOTZONE) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_BADSIG) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_BADKEY) - CHK_ERR_WIN32A(DNS_ERROR_RCODE_BADTIME) - CHK_ERR_WIN32A(DNS_ERROR_PACKET_FMT_BASE) - CHK_ERR_WIN32A(DNS_INFO_NO_RECORDS) - CHK_ERR_WIN32A(DNS_ERROR_BAD_PACKET) - CHK_ERR_WIN32A(DNS_ERROR_NO_PACKET) - CHK_ERR_WIN32A(DNS_ERROR_RCODE) - CHK_ERR_WIN32A(DNS_ERROR_UNSECURE_PACKET) - CHK_ERR_WIN32A(DNS_ERROR_GENERAL_API_BASE) - CHK_ERR_WIN32A(DNS_ERROR_INVALID_TYPE) - CHK_ERR_WIN32A(DNS_ERROR_INVALID_IP_ADDRESS) - CHK_ERR_WIN32A(DNS_ERROR_INVALID_PROPERTY) - CHK_ERR_WIN32A(DNS_ERROR_TRY_AGAIN_LATER) - CHK_ERR_WIN32A(DNS_ERROR_NOT_UNIQUE) - CHK_ERR_WIN32A(DNS_ERROR_NON_RFC_NAME) - CHK_ERR_WIN32A(DNS_STATUS_FQDN) - CHK_ERR_WIN32A(DNS_STATUS_DOTTED_NAME) - CHK_ERR_WIN32A(DNS_STATUS_SINGLE_PART_NAME) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_BASE) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_DOES_NOT_EXIST) - CHK_ERR_WIN32A(DNS_ERROR_NO_ZONE_INFO) - CHK_ERR_WIN32A(DNS_ERROR_INVALID_ZONE_OPERATION) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_CONFIGURATION_ERROR) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_HAS_NO_SOA_RECORD) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_HAS_NO_NS_RECORDS) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_LOCKED) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_CREATION_FAILED) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_ALREADY_EXISTS) - CHK_ERR_WIN32A(DNS_ERROR_AUTOZONE_ALREADY_EXISTS) - CHK_ERR_WIN32A(DNS_ERROR_INVALID_ZONE_TYPE) - CHK_ERR_WIN32A(DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_NOT_SECONDARY) - CHK_ERR_WIN32A(DNS_ERROR_NEED_SECONDARY_ADDRESSES) - CHK_ERR_WIN32A(DNS_ERROR_WINS_INIT_FAILED) - CHK_ERR_WIN32A(DNS_ERROR_NEED_WINS_SERVERS) - CHK_ERR_WIN32A(DNS_ERROR_NBSTAT_INIT_FAILED) - CHK_ERR_WIN32A(DNS_ERROR_SOA_DELETE_INVALID) - CHK_ERR_WIN32A(DNS_ERROR_DATAFILE_BASE) - CHK_ERR_WIN32A(DNS_ERROR_PRIMARY_REQUIRES_DATAFILE) - CHK_ERR_WIN32A(DNS_ERROR_INVALID_DATAFILE_NAME) - CHK_ERR_WIN32A(DNS_ERROR_DATAFILE_OPEN_FAILURE) - CHK_ERR_WIN32A(DNS_ERROR_FILE_WRITEBACK_FAILED) - CHK_ERR_WIN32A(DNS_ERROR_DATAFILE_PARSING) - CHK_ERR_WIN32A(DNS_ERROR_DATABASE_BASE) - CHK_ERR_WIN32A(DNS_ERROR_RECORD_DOES_NOT_EXIST) - CHK_ERR_WIN32A(DNS_ERROR_RECORD_FORMAT) - CHK_ERR_WIN32A(DNS_ERROR_NODE_CREATION_FAILED) - CHK_ERR_WIN32A(DNS_ERROR_UNKNOWN_RECORD_TYPE) - CHK_ERR_WIN32A(DNS_ERROR_RECORD_TIMED_OUT) - CHK_ERR_WIN32A(DNS_ERROR_NAME_NOT_IN_ZONE) - CHK_ERR_WIN32A(DNS_ERROR_CNAME_LOOP) - CHK_ERR_WIN32A(DNS_ERROR_NODE_IS_CNAME) - CHK_ERR_WIN32A(DNS_ERROR_CNAME_COLLISION) - CHK_ERR_WIN32A(DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT) - CHK_ERR_WIN32A(DNS_ERROR_RECORD_ALREADY_EXISTS) - CHK_ERR_WIN32A(DNS_ERROR_SECONDARY_DATA) - CHK_ERR_WIN32A(DNS_ERROR_NO_CREATE_CACHE_DATA) - CHK_ERR_WIN32A(DNS_ERROR_NAME_DOES_NOT_EXIST) - CHK_ERR_WIN32A(DNS_WARNING_PTR_CREATE_FAILED) - CHK_ERR_WIN32A(DNS_WARNING_DOMAIN_UNDELETED) - CHK_ERR_WIN32A(DNS_ERROR_DS_UNAVAILABLE) - CHK_ERR_WIN32A(DNS_ERROR_DS_ZONE_ALREADY_EXISTS) - CHK_ERR_WIN32A(DNS_ERROR_NO_BOOTFILE_IF_DS_ZONE) - CHK_ERR_WIN32A(DNS_ERROR_OPERATION_BASE) - CHK_ERR_WIN32A(DNS_INFO_AXFR_COMPLETE) - CHK_ERR_WIN32A(DNS_ERROR_AXFR) - CHK_ERR_WIN32A(DNS_INFO_ADDED_LOCAL_WINS) - CHK_ERR_WIN32A(DNS_ERROR_SECURE_BASE) - CHK_ERR_WIN32A(DNS_STATUS_CONTINUE_NEEDED) - CHK_ERR_WIN32A(DNS_ERROR_SETUP_BASE) - CHK_ERR_WIN32A(DNS_ERROR_NO_TCPIP) - CHK_ERR_WIN32A(DNS_ERROR_NO_DNS_SERVERS) - CHK_ERR_WIN32A(WSABASEERR) - CHK_ERR_WIN32A(WSAEINTR) - CHK_ERR_WIN32A(WSAEBADF) - CHK_ERR_WIN32A(WSAEACCES) - CHK_ERR_WIN32A(WSAEFAULT) - CHK_ERR_WIN32A(WSAEINVAL) - CHK_ERR_WIN32A(WSAEMFILE) - CHK_ERR_WIN32A(WSAEWOULDBLOCK) - CHK_ERR_WIN32A(WSAEINPROGRESS) - CHK_ERR_WIN32A(WSAEALREADY) - CHK_ERR_WIN32A(WSAENOTSOCK) - CHK_ERR_WIN32A(WSAEDESTADDRREQ) - CHK_ERR_WIN32A(WSAEMSGSIZE) - CHK_ERR_WIN32A(WSAEPROTOTYPE) - CHK_ERR_WIN32A(WSAENOPROTOOPT) - CHK_ERR_WIN32A(WSAEPROTONOSUPPORT) - CHK_ERR_WIN32A(WSAESOCKTNOSUPPORT) - CHK_ERR_WIN32A(WSAEOPNOTSUPP) - CHK_ERR_WIN32A(WSAEPFNOSUPPORT) - CHK_ERR_WIN32A(WSAEAFNOSUPPORT) - CHK_ERR_WIN32A(WSAEADDRINUSE) - CHK_ERR_WIN32A(WSAEADDRNOTAVAIL) - CHK_ERR_WIN32A(WSAENETDOWN) - CHK_ERR_WIN32A(WSAENETUNREACH) - CHK_ERR_WIN32A(WSAENETRESET) - CHK_ERR_WIN32A(WSAECONNABORTED) - CHK_ERR_WIN32A(WSAECONNRESET) - CHK_ERR_WIN32A(WSAENOBUFS) - CHK_ERR_WIN32A(WSAEISCONN) - CHK_ERR_WIN32A(WSAENOTCONN) - CHK_ERR_WIN32A(WSAESHUTDOWN) - CHK_ERR_WIN32A(WSAETOOMANYREFS) - CHK_ERR_WIN32A(WSAETIMEDOUT) - CHK_ERR_WIN32A(WSAECONNREFUSED) - CHK_ERR_WIN32A(WSAELOOP) - CHK_ERR_WIN32A(WSAENAMETOOLONG) - CHK_ERR_WIN32A(WSAEHOSTDOWN) - CHK_ERR_WIN32A(WSAEHOSTUNREACH) - CHK_ERR_WIN32A(WSAENOTEMPTY) - CHK_ERR_WIN32A(WSAEPROCLIM) - CHK_ERR_WIN32A(WSAEUSERS) - CHK_ERR_WIN32A(WSAEDQUOT) - CHK_ERR_WIN32A(WSAESTALE) - CHK_ERR_WIN32A(WSAEREMOTE) - CHK_ERR_WIN32A(WSASYSNOTREADY) - CHK_ERR_WIN32A(WSAVERNOTSUPPORTED) - CHK_ERR_WIN32A(WSANOTINITIALISED) - CHK_ERR_WIN32A(WSAEDISCON) - CHK_ERR_WIN32A(WSAENOMORE) - CHK_ERR_WIN32A(WSAECANCELLED) - CHK_ERR_WIN32A(WSAEINVALIDPROCTABLE) - CHK_ERR_WIN32A(WSAEINVALIDPROVIDER) - CHK_ERR_WIN32A(WSAEPROVIDERFAILEDINIT) - CHK_ERR_WIN32A(WSASYSCALLFAILURE) - CHK_ERR_WIN32A(WSASERVICE_NOT_FOUND) - CHK_ERR_WIN32A(WSATYPE_NOT_FOUND) - CHK_ERR_WIN32A(WSA_E_NO_MORE) - CHK_ERR_WIN32A(WSA_E_CANCELLED) - CHK_ERR_WIN32A(WSAEREFUSED) - CHK_ERR_WIN32A(WSAHOST_NOT_FOUND) - CHK_ERR_WIN32A(WSATRY_AGAIN) - CHK_ERR_WIN32A(WSANO_RECOVERY) - CHK_ERR_WIN32A(WSANO_DATA) - CHK_ERR_WIN32A(WSA_QOS_RECEIVERS) - CHK_ERR_WIN32A(WSA_QOS_SENDERS) - CHK_ERR_WIN32A(WSA_QOS_NO_SENDERS) - CHK_ERR_WIN32A(WSA_QOS_NO_RECEIVERS) - CHK_ERR_WIN32A(WSA_QOS_REQUEST_CONFIRMED) - CHK_ERR_WIN32A(WSA_QOS_ADMISSION_FAILURE) - CHK_ERR_WIN32A(WSA_QOS_POLICY_FAILURE) - CHK_ERR_WIN32A(WSA_QOS_BAD_STYLE) - CHK_ERR_WIN32A(WSA_QOS_BAD_OBJECT) - CHK_ERR_WIN32A(WSA_QOS_TRAFFIC_CTRL_ERROR) - CHK_ERR_WIN32A(WSA_QOS_GENERIC_ERROR) - - CHK_ERRA(CO_E_ATTEMPT_TO_CREATE_OUTSIDE_CLIENT_CONTEXT) - CHK_ERRA(CO_E_SERVER_PAUSED) - CHK_ERRA(CO_E_SERVER_NOT_PAUSED) - CHK_ERRA(CO_E_CLASS_DISABLED) - CHK_ERRA(CO_E_CLRNOTAVAILABLE) - CHK_ERRA(CO_E_ASYNC_WORK_REJECTED) - CHK_ERRA(CO_E_SERVER_INIT_TIMEOUT) - CHK_ERRA(CO_E_NO_SECCTX_IN_ACTIVATE) - CHK_ERRA(CO_E_TRACKER_CONFIG) - CHK_ERRA(CO_E_THREADPOOL_CONFIG) - CHK_ERRA(CO_E_SXS_CONFIG) - CHK_ERRA(CO_E_MALFORMED_SPN) - CHK_ERRA(REGDB_E_BADTHREADINGMODEL) -// CHK_ERRA(EVENT_E_FIRST) -// CHK_ERRA(EVENT_E_LAST) -// CHK_ERRA(EVENT_S_FIRST) -// CHK_ERRA(EVENT_S_LAST) -// CHK_ERRA(EVENT_S_SOME_SUBSCRIBERS_FAILED) -// CHK_ERRA(EVENT_E_ALL_SUBSCRIBERS_FAILED) - CHK_ERRA(EVENT_S_NOSUBSCRIBERS) -// CHK_ERRA(EVENT_E_QUERYSYNTAX) -// CHK_ERRA(EVENT_E_QUERYFIELD) -// CHK_ERRA(EVENT_E_INTERNALEXCEPTION) -// CHK_ERRA(EVENT_E_INTERNALERROR) -// CHK_ERRA(EVENT_E_INVALID_PER_USER_SID) -// CHK_ERRA(EVENT_E_USER_EXCEPTION) -// CHK_ERRA(EVENT_E_TOO_MANY_METHODS) -// CHK_ERRA(EVENT_E_MISSING_EVENTCLASS) -// CHK_ERRA(EVENT_E_NOT_ALL_REMOVED) -// CHK_ERRA(EVENT_E_COMPLUS_NOT_INSTALLED) -// CHK_ERRA(EVENT_E_CANT_MODIFY_OR_DELETE_UNCONFIGURED_OBJECT) -// CHK_ERRA(EVENT_E_CANT_MODIFY_OR_DELETE_CONFIGURED_OBJECT) -// CHK_ERRA(EVENT_E_INVALID_EVENT_CLASS_PARTITION) -// CHK_ERRA(EVENT_E_PER_USER_SID_NOT_LOGGED_ON) - CHK_ERRA(CONTEXT_E_FIRST) - CHK_ERRA(CONTEXT_E_LAST) - CHK_ERRA(CONTEXT_S_FIRST) - CHK_ERRA(CONTEXT_S_LAST) - CHK_ERRA(CONTEXT_E_ABORTED) - CHK_ERRA(CONTEXT_E_ABORTING) - CHK_ERRA(CONTEXT_E_NOCONTEXT) -// CHK_ERRA(CONTEXT_E_WOULD_DEADLOCK) - CHK_ERRA(CONTEXT_E_SYNCH_TIMEOUT) - CHK_ERRA(CONTEXT_E_OLDREF) - CHK_ERRA(CONTEXT_E_ROLENOTFOUND) - CHK_ERRA(CONTEXT_E_TMNOTAVAILABLE) - CHK_ERRA(CO_E_ACTIVATIONFAILED) - CHK_ERRA(CO_E_ACTIVATIONFAILED_EVENTLOGGED) - CHK_ERRA(CO_E_ACTIVATIONFAILED_CATALOGERROR) - CHK_ERRA(CO_E_ACTIVATIONFAILED_TIMEOUT) - CHK_ERRA(CO_E_INITIALIZATIONFAILED) - CHK_ERRA(CONTEXT_E_NOJIT) - CHK_ERRA(CONTEXT_E_NOTRANSACTION) - CHK_ERRA(CO_E_THREADINGMODEL_CHANGED) - CHK_ERRA(CO_E_NOIISINTRINSICS) - CHK_ERRA(CO_E_NOCOOKIES) - CHK_ERRA(CO_E_DBERROR) - CHK_ERRA(CO_E_NOTPOOLED) - CHK_ERRA(CO_E_NOTCONSTRUCTED) - CHK_ERRA(CO_E_NOSYNCHRONIZATION) -// CHK_ERRA(CO_E_ISOLEVELMISMATCH) - CHK_ERRA(SCHED_S_TASK_READY) - CHK_ERRA(SCHED_S_TASK_RUNNING) - CHK_ERRA(SCHED_S_TASK_DISABLED) - CHK_ERRA(SCHED_S_TASK_HAS_NOT_RUN) - CHK_ERRA(SCHED_S_TASK_NO_MORE_RUNS) - CHK_ERRA(SCHED_S_TASK_NOT_SCHEDULED) - CHK_ERRA(SCHED_S_TASK_TERMINATED) - CHK_ERRA(SCHED_S_TASK_NO_VALID_TRIGGERS) - CHK_ERRA(SCHED_S_EVENT_TRIGGER) - CHK_ERRA(SCHED_E_TRIGGER_NOT_FOUND) - CHK_ERRA(SCHED_E_TASK_NOT_READY) - CHK_ERRA(SCHED_E_TASK_NOT_RUNNING) - CHK_ERRA(SCHED_E_SERVICE_NOT_INSTALLED) - CHK_ERRA(SCHED_E_CANNOT_OPEN_TASK) - CHK_ERRA(SCHED_E_INVALID_TASK) - CHK_ERRA(SCHED_E_ACCOUNT_INFORMATION_NOT_SET) - CHK_ERRA(SCHED_E_ACCOUNT_NAME_NOT_FOUND) - CHK_ERRA(SCHED_E_ACCOUNT_DBASE_CORRUPT) - CHK_ERRA(SCHED_E_NO_SECURITY_SERVICES) - CHK_ERRA(SCHED_E_UNKNOWN_OBJECT_VERSION) - CHK_ERRA(SCHED_E_UNSUPPORTED_ACCOUNT_OPTION) - CHK_ERRA(SCHED_E_SERVICE_NOT_RUNNING) - CHK_ERRA(CO_S_MACHINENAMENOTFOUND) - CHK_ERRA(STG_E_STATUS_COPY_PROTECTION_FAILURE) - CHK_ERRA(STG_E_CSS_AUTHENTICATION_FAILURE) - CHK_ERRA(STG_E_CSS_KEY_NOT_PRESENT) - CHK_ERRA(STG_E_CSS_KEY_NOT_ESTABLISHED) - CHK_ERRA(STG_E_CSS_SCRAMBLED_SECTOR) - CHK_ERRA(STG_E_CSS_REGION_MISMATCH) - CHK_ERRA(STG_E_RESETS_EXHAUSTED) - CHK_ERRA(CO_E_CANCEL_DISABLED) - CHK_ERRA(ERROR_AUDITING_DISABLED) - CHK_ERRA(ERROR_ALL_SIDS_FILTERED) - CHK_ERRA(NTE_TEMPORARY_PROFILE) - CHK_ERRA(NTE_FIXEDPARAMETER) - CHK_ERRA(SEC_E_INSUFFICIENT_MEMORY) - CHK_ERRA(SEC_E_INVALID_HANDLE) - CHK_ERRA(SEC_E_UNSUPPORTED_FUNCTION) - CHK_ERRA(SEC_E_TARGET_UNKNOWN) - CHK_ERRA(SEC_E_INTERNAL_ERROR) - CHK_ERRA(SEC_E_SECPKG_NOT_FOUND) - CHK_ERRA(SEC_E_NOT_OWNER) - CHK_ERRA(SEC_E_CANNOT_INSTALL) - CHK_ERRA(SEC_E_INVALID_TOKEN) - CHK_ERRA(SEC_E_CANNOT_PACK) - CHK_ERRA(SEC_E_QOP_NOT_SUPPORTED) - CHK_ERRA(SEC_E_NO_IMPERSONATION) - CHK_ERRA(SEC_E_LOGON_DENIED) - CHK_ERRA(SEC_E_UNKNOWN_CREDENTIALS) - CHK_ERRA(SEC_E_NO_CREDENTIALS) - CHK_ERRA(SEC_E_MESSAGE_ALTERED) - CHK_ERRA(SEC_E_OUT_OF_SEQUENCE) - CHK_ERRA(SEC_E_NO_AUTHENTICATING_AUTHORITY) - CHK_ERRA(SEC_I_CONTINUE_NEEDED) - CHK_ERRA(SEC_I_COMPLETE_NEEDED) - CHK_ERRA(SEC_I_COMPLETE_AND_CONTINUE) - CHK_ERRA(SEC_I_LOCAL_LOGON) - CHK_ERRA(SEC_E_BAD_PKGID) - CHK_ERRA(SEC_E_CONTEXT_EXPIRED) - CHK_ERRA(SEC_I_CONTEXT_EXPIRED) - CHK_ERRA(SEC_E_INCOMPLETE_MESSAGE) - CHK_ERRA(SEC_E_INCOMPLETE_CREDENTIALS) - CHK_ERRA(SEC_E_BUFFER_TOO_SMALL) - CHK_ERRA(SEC_I_INCOMPLETE_CREDENTIALS) - CHK_ERRA(SEC_I_RENEGOTIATE) - CHK_ERRA(SEC_E_WRONG_PRINCIPAL) - CHK_ERRA(SEC_I_NO_LSA_CONTEXT) - CHK_ERRA(SEC_E_TIME_SKEW) - CHK_ERRA(SEC_E_UNTRUSTED_ROOT) - CHK_ERRA(SEC_E_ILLEGAL_MESSAGE) - CHK_ERRA(SEC_E_CERT_UNKNOWN) - CHK_ERRA(SEC_E_CERT_EXPIRED) - CHK_ERRA(SEC_E_ENCRYPT_FAILURE) - CHK_ERRA(SEC_E_DECRYPT_FAILURE) - CHK_ERRA(SEC_E_ALGORITHM_MISMATCH) - CHK_ERRA(SEC_E_SECURITY_QOS_FAILED) - CHK_ERRA(SEC_E_UNFINISHED_CONTEXT_DELETED) - CHK_ERRA(SEC_E_NO_TGT_REPLY) - CHK_ERRA(SEC_E_NO_IP_ADDRESSES) - CHK_ERRA(SEC_E_WRONG_CREDENTIAL_HANDLE) - CHK_ERRA(SEC_E_CRYPTO_SYSTEM_INVALID) - CHK_ERRA(SEC_E_MAX_REFERRALS_EXCEEDED) - CHK_ERRA(SEC_E_MUST_BE_KDC) - CHK_ERRA(SEC_E_STRONG_CRYPTO_NOT_SUPPORTED) - CHK_ERRA(SEC_E_TOO_MANY_PRINCIPALS) - CHK_ERRA(SEC_E_NO_PA_DATA) - CHK_ERRA(SEC_E_PKINIT_NAME_MISMATCH) - CHK_ERRA(SEC_E_SMARTCARD_LOGON_REQUIRED) - CHK_ERRA(SEC_E_SHUTDOWN_IN_PROGRESS) - CHK_ERRA(SEC_E_KDC_INVALID_REQUEST) - CHK_ERRA(SEC_E_KDC_UNABLE_TO_REFER) - CHK_ERRA(SEC_E_KDC_UNKNOWN_ETYPE) - CHK_ERRA(SEC_E_UNSUPPORTED_PREAUTH) - CHK_ERRA(SEC_E_DELEGATION_REQUIRED) - CHK_ERRA(SEC_E_BAD_BINDINGS) - CHK_ERRA(SEC_E_MULTIPLE_ACCOUNTS) - CHK_ERRA(SEC_E_NO_KERB_KEY) -// CHK_ERRA(SEC_E_CERT_WRONG_USAGE) -// CHK_ERRA(SEC_E_DOWNGRADE_DETECTED) - CHK_ERRA(SEC_E_SMARTCARD_CERT_REVOKED) - CHK_ERRA(SEC_E_ISSUING_CA_UNTRUSTED) - CHK_ERRA(SEC_E_REVOCATION_OFFLINE_C) - CHK_ERRA(SEC_E_PKINIT_CLIENT_FAILURE) - CHK_ERRA(SEC_E_SMARTCARD_CERT_EXPIRED) -// CHK_ERRA(SEC_E_NO_SPM) -// CHK_ERRA(SEC_E_NOT_SUPPORTED) - CHK_ERRA(CRYPT_I_NEW_PROTECTION_REQUIRED) - CHK_ERRA(CRYPT_E_MISSING_PUBKEY_PARA) - CHK_ERRA(CRYPT_E_ASN1_ERROR) - CHK_ERRA(CRYPT_E_ASN1_INTERNAL) - CHK_ERRA(CRYPT_E_ASN1_EOD) - CHK_ERRA(CRYPT_E_ASN1_CORRUPT) - CHK_ERRA(CRYPT_E_ASN1_LARGE) - CHK_ERRA(CRYPT_E_ASN1_CONSTRAINT) - CHK_ERRA(CRYPT_E_ASN1_MEMORY) - CHK_ERRA(CRYPT_E_ASN1_OVERFLOW) - CHK_ERRA(CRYPT_E_ASN1_BADPDU) - CHK_ERRA(CRYPT_E_ASN1_BADARGS) - CHK_ERRA(CRYPT_E_ASN1_BADREAL) - CHK_ERRA(CRYPT_E_ASN1_BADTAG) - CHK_ERRA(CRYPT_E_ASN1_CHOICE) - CHK_ERRA(CRYPT_E_ASN1_RULE) - CHK_ERRA(CRYPT_E_ASN1_UTF8) - CHK_ERRA(CRYPT_E_ASN1_PDU_TYPE) - CHK_ERRA(CRYPT_E_ASN1_NYI) - CHK_ERRA(CRYPT_E_ASN1_EXTENDED) - CHK_ERRA(CRYPT_E_ASN1_NOEOD) - CHK_ERRA(CERTSRV_E_SERVER_SUSPENDED) - CHK_ERRA(CERTSRV_E_ENCODING_LENGTH) - CHK_ERRA(CERTSRV_E_ROLECONFLICT) - CHK_ERRA(CERTSRV_E_RESTRICTEDOFFICER) - CHK_ERRA(CERTSRV_E_KEY_ARCHIVAL_NOT_CONFIGURED) - CHK_ERRA(CERTSRV_E_NO_VALID_KRA) - CHK_ERRA(CERTSRV_E_BAD_REQUEST_KEY_ARCHIVAL) - CHK_ERRA(CERTSRV_E_NO_CAADMIN_DEFINED) - CHK_ERRA(CERTSRV_E_BAD_RENEWAL_CERT_ATTRIBUTE) - CHK_ERRA(CERTSRV_E_NO_DB_SESSIONS) - CHK_ERRA(CERTSRV_E_ALIGNMENT_FAULT) - CHK_ERRA(CERTSRV_E_ENROLL_DENIED) - CHK_ERRA(CERTSRV_E_TEMPLATE_DENIED) -// CHK_ERRA(CERTSRV_E_DOWNLEVEL_DC_SSL_OR_UPGRADE) - CHK_ERRA(CERTSRV_E_TEMPLATE_CONFLICT) - CHK_ERRA(CERTSRV_E_SUBJECT_ALT_NAME_REQUIRED) - CHK_ERRA(CERTSRV_E_ARCHIVED_KEY_REQUIRED) - CHK_ERRA(CERTSRV_E_SMIME_REQUIRED) - CHK_ERRA(CERTSRV_E_BAD_RENEWAL_SUBJECT) - CHK_ERRA(CERTSRV_E_BAD_TEMPLATE_VERSION) - CHK_ERRA(CERTSRV_E_TEMPLATE_POLICY_REQUIRED) - CHK_ERRA(CERTSRV_E_SIGNATURE_POLICY_REQUIRED) - CHK_ERRA(CERTSRV_E_SIGNATURE_COUNT) - CHK_ERRA(CERTSRV_E_SIGNATURE_REJECTED) - CHK_ERRA(CERTSRV_E_ISSUANCE_POLICY_REQUIRED) - CHK_ERRA(CERTSRV_E_SUBJECT_UPN_REQUIRED) - CHK_ERRA(CERTSRV_E_SUBJECT_DIRECTORY_GUID_REQUIRED) - CHK_ERRA(CERTSRV_E_SUBJECT_DNS_REQUIRED) - CHK_ERRA(CERTSRV_E_ARCHIVED_KEY_UNEXPECTED) - CHK_ERRA(CERTSRV_E_KEY_LENGTH) -// CHK_ERRA(CERTSRV_E_SUBJECT_EMAIL_REQUIRED) -// CHK_ERRA(CERTSRV_E_UNKNOWN_CERT_TYPE) -// CHK_ERRA(CERTSRV_E_CERT_TYPE_OVERLAP) - CHK_ERRA(XENROLL_E_KEY_NOT_EXPORTABLE) - CHK_ERRA(XENROLL_E_CANNOT_ADD_ROOT_CERT) - CHK_ERRA(XENROLL_E_RESPONSE_KA_HASH_NOT_FOUND) - CHK_ERRA(XENROLL_E_RESPONSE_UNEXPECTED_KA_HASH) - CHK_ERRA(XENROLL_E_RESPONSE_KA_HASH_MISMATCH) - CHK_ERRA(XENROLL_E_KEYSPEC_SMIME_MISMATCH) - CHK_ERRA(MSSIPOTF_E_OUTOFMEMRANGE) - CHK_ERRA(MSSIPOTF_E_CANTGETOBJECT) - CHK_ERRA(MSSIPOTF_E_NOHEADTABLE) - CHK_ERRA(MSSIPOTF_E_BAD_MAGICNUMBER) - CHK_ERRA(MSSIPOTF_E_BAD_OFFSET_TABLE) - CHK_ERRA(MSSIPOTF_E_TABLE_TAGORDER) - CHK_ERRA(MSSIPOTF_E_TABLE_LONGWORD) - CHK_ERRA(MSSIPOTF_E_BAD_FIRST_TABLE_PLACEMENT) - CHK_ERRA(MSSIPOTF_E_TABLES_OVERLAP) - CHK_ERRA(MSSIPOTF_E_TABLE_PADBYTES) - CHK_ERRA(MSSIPOTF_E_FILETOOSMALL) - CHK_ERRA(MSSIPOTF_E_TABLE_CHECKSUM) - CHK_ERRA(MSSIPOTF_E_FILE_CHECKSUM) - CHK_ERRA(MSSIPOTF_E_FAILED_POLICY) - CHK_ERRA(MSSIPOTF_E_FAILED_HINTS_CHECK) - CHK_ERRA(MSSIPOTF_E_NOT_OPENTYPE) - CHK_ERRA(MSSIPOTF_E_FILE) - CHK_ERRA(MSSIPOTF_E_CRYPT) - CHK_ERRA(MSSIPOTF_E_BADVERSION) - CHK_ERRA(MSSIPOTF_E_DSIG_STRUCTURE) - CHK_ERRA(MSSIPOTF_E_PCONST_CHECK) - CHK_ERRA(MSSIPOTF_E_STRUCTURE) - CHK_ERRA(TRUST_E_EXPLICIT_DISTRUST) - CHK_ERRA(CERT_E_UNTRUSTEDCA) - CHK_ERRA(CERT_E_INVALID_POLICY) - CHK_ERRA(CERT_E_INVALID_NAME) - CHK_ERRA(SPAPI_E_NOT_DISABLEABLE) - CHK_ERRA(SPAPI_E_CANT_REMOVE_DEVINST) - CHK_ERRA(SPAPI_E_INVALID_TARGET) - CHK_ERRA(SPAPI_E_DRIVER_NONNATIVE) - CHK_ERRA(SPAPI_E_IN_WOW64) - CHK_ERRA(SPAPI_E_SET_SYSTEM_RESTORE_POINT) - CHK_ERRA(SPAPI_E_INCORRECTLY_COPIED_INF) - CHK_ERRA(SPAPI_E_SCE_DISABLED) - CHK_ERRA(SCARD_E_NO_KEY_CONTAINER) - CHK_ERRA(SCARD_W_CARD_NOT_AUTHENTICATED) - CHK_ERRA(COMADMIN_E_OBJECTERRORS) - CHK_ERRA(COMADMIN_E_OBJECTINVALID) - CHK_ERRA(COMADMIN_E_KEYMISSING) - CHK_ERRA(COMADMIN_E_ALREADYINSTALLED) - CHK_ERRA(COMADMIN_E_APP_FILE_WRITEFAIL) - CHK_ERRA(COMADMIN_E_APP_FILE_READFAIL) - CHK_ERRA(COMADMIN_E_APP_FILE_VERSION) - CHK_ERRA(COMADMIN_E_BADPATH) - CHK_ERRA(COMADMIN_E_APPLICATIONEXISTS) - CHK_ERRA(COMADMIN_E_ROLEEXISTS) - CHK_ERRA(COMADMIN_E_CANTCOPYFILE) - CHK_ERRA(COMADMIN_E_NOUSER) - CHK_ERRA(COMADMIN_E_INVALIDUSERIDS) - CHK_ERRA(COMADMIN_E_NOREGISTRYCLSID) - CHK_ERRA(COMADMIN_E_BADREGISTRYPROGID) - CHK_ERRA(COMADMIN_E_AUTHENTICATIONLEVEL) - CHK_ERRA(COMADMIN_E_USERPASSWDNOTVALID) - CHK_ERRA(COMADMIN_E_CLSIDORIIDMISMATCH) - CHK_ERRA(COMADMIN_E_REMOTEINTERFACE) - CHK_ERRA(COMADMIN_E_DLLREGISTERSERVER) - CHK_ERRA(COMADMIN_E_NOSERVERSHARE) - CHK_ERRA(COMADMIN_E_DLLLOADFAILED) - CHK_ERRA(COMADMIN_E_BADREGISTRYLIBID) - CHK_ERRA(COMADMIN_E_APPDIRNOTFOUND) - CHK_ERRA(COMADMIN_E_REGISTRARFAILED) - CHK_ERRA(COMADMIN_E_COMPFILE_DOESNOTEXIST) - CHK_ERRA(COMADMIN_E_COMPFILE_LOADDLLFAIL) - CHK_ERRA(COMADMIN_E_COMPFILE_GETCLASSOBJ) - CHK_ERRA(COMADMIN_E_COMPFILE_CLASSNOTAVAIL) - CHK_ERRA(COMADMIN_E_COMPFILE_BADTLB) - CHK_ERRA(COMADMIN_E_COMPFILE_NOTINSTALLABLE) - CHK_ERRA(COMADMIN_E_NOTCHANGEABLE) - CHK_ERRA(COMADMIN_E_NOTDELETEABLE) - CHK_ERRA(COMADMIN_E_SESSION) - CHK_ERRA(COMADMIN_E_COMP_MOVE_LOCKED) - CHK_ERRA(COMADMIN_E_COMP_MOVE_BAD_DEST) - CHK_ERRA(COMADMIN_E_REGISTERTLB) - CHK_ERRA(COMADMIN_E_SYSTEMAPP) - CHK_ERRA(COMADMIN_E_COMPFILE_NOREGISTRAR) - CHK_ERRA(COMADMIN_E_COREQCOMPINSTALLED) - CHK_ERRA(COMADMIN_E_SERVICENOTINSTALLED) - CHK_ERRA(COMADMIN_E_PROPERTYSAVEFAILED) - CHK_ERRA(COMADMIN_E_OBJECTEXISTS) - CHK_ERRA(COMADMIN_E_COMPONENTEXISTS) - CHK_ERRA(COMADMIN_E_REGFILE_CORRUPT) - CHK_ERRA(COMADMIN_E_PROPERTY_OVERFLOW) - CHK_ERRA(COMADMIN_E_NOTINREGISTRY) - CHK_ERRA(COMADMIN_E_OBJECTNOTPOOLABLE) - CHK_ERRA(COMADMIN_E_APPLID_MATCHES_CLSID) - CHK_ERRA(COMADMIN_E_ROLE_DOES_NOT_EXIST) - CHK_ERRA(COMADMIN_E_START_APP_NEEDS_COMPONENTS) - CHK_ERRA(COMADMIN_E_REQUIRES_DIFFERENT_PLATFORM) - CHK_ERRA(COMADMIN_E_CAN_NOT_EXPORT_APP_PROXY) - CHK_ERRA(COMADMIN_E_CAN_NOT_START_APP) - CHK_ERRA(COMADMIN_E_CAN_NOT_EXPORT_SYS_APP) - CHK_ERRA(COMADMIN_E_CANT_SUBSCRIBE_TO_COMPONENT) - CHK_ERRA(COMADMIN_E_EVENTCLASS_CANT_BE_SUBSCRIBER) - CHK_ERRA(COMADMIN_E_LIB_APP_PROXY_INCOMPATIBLE) - CHK_ERRA(COMADMIN_E_BASE_PARTITION_ONLY) - CHK_ERRA(COMADMIN_E_START_APP_DISABLED) - CHK_ERRA(COMADMIN_E_CAT_DUPLICATE_PARTITION_NAME) - CHK_ERRA(COMADMIN_E_CAT_INVALID_PARTITION_NAME) - CHK_ERRA(COMADMIN_E_CAT_PARTITION_IN_USE) - CHK_ERRA(COMADMIN_E_FILE_PARTITION_DUPLICATE_FILES) - CHK_ERRA(COMADMIN_E_CAT_IMPORTED_COMPONENTS_NOT_ALLOWED) - CHK_ERRA(COMADMIN_E_AMBIGUOUS_APPLICATION_NAME) - CHK_ERRA(COMADMIN_E_AMBIGUOUS_PARTITION_NAME) - CHK_ERRA(COMADMIN_E_REGDB_NOTINITIALIZED) - CHK_ERRA(COMADMIN_E_REGDB_NOTOPEN) - CHK_ERRA(COMADMIN_E_REGDB_SYSTEMERR) - CHK_ERRA(COMADMIN_E_REGDB_ALREADYRUNNING) - CHK_ERRA(COMADMIN_E_MIG_VERSIONNOTSUPPORTED) - CHK_ERRA(COMADMIN_E_MIG_SCHEMANOTFOUND) - CHK_ERRA(COMADMIN_E_CAT_BITNESSMISMATCH) - CHK_ERRA(COMADMIN_E_CAT_UNACCEPTABLEBITNESS) - CHK_ERRA(COMADMIN_E_CAT_WRONGAPPBITNESS) - CHK_ERRA(COMADMIN_E_CAT_PAUSE_RESUME_NOT_SUPPORTED) - CHK_ERRA(COMADMIN_E_CAT_SERVERFAULT) - CHK_ERRA(COMQC_E_APPLICATION_NOT_QUEUED) - CHK_ERRA(COMQC_E_NO_QUEUEABLE_INTERFACES) - CHK_ERRA(COMQC_E_QUEUING_SERVICE_NOT_AVAILABLE) - CHK_ERRA(COMQC_E_NO_IPERSISTSTREAM) - CHK_ERRA(COMQC_E_BAD_MESSAGE) - CHK_ERRA(COMQC_E_UNAUTHENTICATED) - CHK_ERRA(COMQC_E_UNTRUSTED_ENQUEUER) - CHK_ERRA(MSDTC_E_DUPLICATE_RESOURCE) - CHK_ERRA(COMADMIN_E_OBJECT_PARENT_MISSING) - CHK_ERRA(COMADMIN_E_OBJECT_DOES_NOT_EXIST) - CHK_ERRA(COMADMIN_E_APP_NOT_RUNNING) - CHK_ERRA(COMADMIN_E_INVALID_PARTITION) - CHK_ERRA(COMADMIN_E_SVCAPP_NOT_POOLABLE_OR_RECYCLABLE) - CHK_ERRA(COMADMIN_E_USER_IN_SET) - CHK_ERRA(COMADMIN_E_CANTRECYCLELIBRARYAPPS) - CHK_ERRA(COMADMIN_E_CANTRECYCLESERVICEAPPS) - CHK_ERRA(COMADMIN_E_PROCESSALREADYRECYCLED) - CHK_ERRA(COMADMIN_E_PAUSEDPROCESSMAYNOTBERECYCLED) - CHK_ERRA(COMADMIN_E_CANTMAKEINPROCSERVICE) - CHK_ERRA(COMADMIN_E_PROGIDINUSEBYCLSID) - CHK_ERRA(COMADMIN_E_DEFAULT_PARTITION_NOT_IN_SET) - CHK_ERRA(COMADMIN_E_RECYCLEDPROCESSMAYNOTBEPAUSED) - CHK_ERRA(COMADMIN_E_PARTITION_ACCESSDENIED) - CHK_ERRA(COMADMIN_E_PARTITION_MSI_ONLY) - CHK_ERRA(COMADMIN_E_LEGACYCOMPS_NOT_ALLOWED_IN_1_0_FORMAT) - CHK_ERRA(COMADMIN_E_LEGACYCOMPS_NOT_ALLOWED_IN_NONBASE_PARTITIONS) - CHK_ERRA(COMADMIN_E_COMP_MOVE_SOURCE) - CHK_ERRA(COMADMIN_E_COMP_MOVE_DEST) - CHK_ERRA(COMADMIN_E_COMP_MOVE_PRIVATE) - CHK_ERRA(COMADMIN_E_BASEPARTITION_REQUIRED_IN_SET) - CHK_ERRA(COMADMIN_E_CANNOT_ALIAS_EVENTCLASS) - CHK_ERRA(COMADMIN_E_PRIVATE_ACCESSDENIED) - CHK_ERRA(COMADMIN_E_SAFERINVALID) - CHK_ERRA(COMADMIN_E_REGISTRY_ACCESSDENIED) -// CHK_ERRA(COMADMIN_E_PARTITIONS_DISABLED) -// CHK_ERR_WIN32A(ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY) -// CHK_ERR_WIN32A(ERROR_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY) - CHK_ERR_WIN32A(ERROR_DISK_TOO_FRAGMENTED) - CHK_ERR_WIN32A(ERROR_DELETE_PENDING) -// CHK_ERR_WIN32A(ERROR_SCOPE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_NOT_SAFEBOOT_SERVICE) - CHK_ERR_WIN32A(ERROR_JOURNAL_ENTRY_DELETED) - CHK_ERR_WIN32A(ERROR_ONLY_IF_CONNECTED) - CHK_ERR_WIN32A(ERROR_OVERRIDE_NOCHANGES) - CHK_ERR_WIN32A(ERROR_BAD_USER_PROFILE) - CHK_ERR_WIN32A(ERROR_NOT_SUPPORTED_ON_SBS) - CHK_ERR_WIN32A(ERROR_SERVER_SHUTDOWN_IN_PROGRESS) - CHK_ERR_WIN32A(ERROR_HOST_DOWN) - CHK_ERR_WIN32A(ERROR_NON_ACCOUNT_SID) - CHK_ERR_WIN32A(ERROR_NON_DOMAIN_SID) - CHK_ERR_WIN32A(ERROR_APPHELP_BLOCK) - CHK_ERR_WIN32A(ERROR_ACCESS_DISABLED_BY_POLICY) - CHK_ERR_WIN32A(ERROR_REG_NAT_CONSUMPTION) - CHK_ERR_WIN32A(ERROR_CSCSHARE_OFFLINE) - CHK_ERR_WIN32A(ERROR_PKINIT_FAILURE) - CHK_ERR_WIN32A(ERROR_SMARTCARD_SUBSYSTEM_FAILURE) - CHK_ERR_WIN32A(ERROR_DOWNGRADE_DETECTED) - CHK_ERR_WIN32A(ERROR_MACHINE_LOCKED) - CHK_ERR_WIN32A(ERROR_CALLBACK_SUPPLIED_INVALID_DATA) - CHK_ERR_WIN32A(ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED) - CHK_ERR_WIN32A(ERROR_DRIVER_BLOCKED) - CHK_ERR_WIN32A(ERROR_INVALID_IMPORT_OF_NON_DLL) -// CHK_ERR_WIN32A(ERROR_ACCESS_DISABLED_WEBBLADE) -// CHK_ERR_WIN32A(ERROR_ACCESS_DISABLED_WEBBLADE_TAMPER) -// CHK_ERR_WIN32A(ERROR_RECOVERY_FAILURE) -// CHK_ERR_WIN32A(ERROR_ALREADY_FIBER) -// CHK_ERR_WIN32A(ERROR_ALREADY_THREAD) -// CHK_ERR_WIN32A(ERROR_STACK_BUFFER_OVERRUN) -// CHK_ERR_WIN32A(ERROR_PARAMETER_QUOTA_EXCEEDED) -// CHK_ERR_WIN32A(ERROR_DEBUGGER_INACTIVE) -// CHK_ERR_WIN32A(ERROR_DELAY_LOAD_FAILED) - CHK_ERR_WIN32A(ERROR_CURRENT_DOMAIN_NOT_ALLOWED) - CHK_ERR_WIN32A(ERROR_INSTALL_SERVICE_FAILURE) - CHK_ERR_WIN32A(ERROR_INSTALL_PACKAGE_VERSION) - CHK_ERR_WIN32A(ERROR_INSTALL_ALREADY_RUNNING) - CHK_ERR_WIN32A(ERROR_INSTALL_PACKAGE_OPEN_FAILED) - CHK_ERR_WIN32A(ERROR_INSTALL_PACKAGE_INVALID) - CHK_ERR_WIN32A(ERROR_INSTALL_UI_FAILURE) - CHK_ERR_WIN32A(ERROR_INSTALL_LOG_FAILURE) - CHK_ERR_WIN32A(ERROR_INSTALL_LANGUAGE_UNSUPPORTED) - CHK_ERR_WIN32A(ERROR_INSTALL_TRANSFORM_FAILURE) - CHK_ERR_WIN32A(ERROR_INSTALL_PACKAGE_REJECTED) - CHK_ERR_WIN32A(ERROR_FUNCTION_NOT_CALLED) - CHK_ERR_WIN32A(ERROR_FUNCTION_FAILED) - CHK_ERR_WIN32A(ERROR_INVALID_TABLE) - CHK_ERR_WIN32A(ERROR_DATATYPE_MISMATCH) - CHK_ERR_WIN32A(ERROR_UNSUPPORTED_TYPE) - CHK_ERR_WIN32A(ERROR_CREATE_FAILED) - CHK_ERR_WIN32A(ERROR_INSTALL_TEMP_UNWRITABLE) - CHK_ERR_WIN32A(ERROR_INSTALL_PLATFORM_UNSUPPORTED) - CHK_ERR_WIN32A(ERROR_INSTALL_NOTUSED) - CHK_ERR_WIN32A(ERROR_PATCH_PACKAGE_OPEN_FAILED) - CHK_ERR_WIN32A(ERROR_PATCH_PACKAGE_INVALID) - CHK_ERR_WIN32A(ERROR_PATCH_PACKAGE_UNSUPPORTED) - CHK_ERR_WIN32A(ERROR_PRODUCT_VERSION) - CHK_ERR_WIN32A(ERROR_INVALID_COMMAND_LINE) - CHK_ERR_WIN32A(ERROR_INSTALL_REMOTE_DISALLOWED) - CHK_ERR_WIN32A(ERROR_SUCCESS_REBOOT_INITIATED) - CHK_ERR_WIN32A(ERROR_PATCH_TARGET_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_PATCH_PACKAGE_REJECTED) - CHK_ERR_WIN32A(ERROR_INSTALL_TRANSFORM_REJECTED) -// CHK_ERR_WIN32A(ERROR_INSTALL_REMOTE_PROHIBITED) - CHK_ERR_WIN32A(RPC_S_ENTRY_TYPE_MISMATCH) - CHK_ERR_WIN32A(RPC_S_NOT_ALL_OBJS_EXPORTED) - CHK_ERR_WIN32A(RPC_S_INTERFACE_NOT_EXPORTED) - CHK_ERR_WIN32A(RPC_S_PROFILE_NOT_ADDED) - CHK_ERR_WIN32A(RPC_S_PRF_ELT_NOT_ADDED) - CHK_ERR_WIN32A(RPC_S_PRF_ELT_NOT_REMOVED) - CHK_ERR_WIN32A(RPC_S_GRP_ELT_NOT_ADDED) - CHK_ERR_WIN32A(RPC_S_GRP_ELT_NOT_REMOVED) - CHK_ERR_WIN32A(ERROR_KM_DRIVER_BLOCKED) - CHK_ERR_WIN32A(ERROR_CONTEXT_EXPIRED) -// CHK_ERR_WIN32A(ERROR_PER_USER_TRUST_QUOTA_EXCEEDED) -// CHK_ERR_WIN32A(ERROR_ALL_USER_TRUST_QUOTA_EXCEEDED) -// CHK_ERR_WIN32A(ERROR_USER_DELETE_TRUST_QUOTA_EXCEEDED) - CHK_ERR_WIN32A(ERROR_CONNECTED_OTHER_PASSWORD_DEFAULT) - CHK_ERR_WIN32A(ERROR_PRINTER_DRIVER_WARNED) - CHK_ERR_WIN32A(ERROR_PRINTER_DRIVER_BLOCKED) - CHK_ERR_WIN32A(ERROR_VOLUME_CONTAINS_SYS_FILES) - CHK_ERR_WIN32A(ERROR_INDIGENOUS_TYPE) - CHK_ERR_WIN32A(ERROR_NO_SUPPORTING_DRIVES) - CHK_ERR_WIN32A(ERROR_CLEANER_CARTRIDGE_INSTALLED) - CHK_ERR_WIN32A(ERROR_REPARSE_TAG_INVALID) - CHK_ERR_WIN32A(ERROR_REPARSE_TAG_MISMATCH) - CHK_ERR_WIN32A(ERROR_VOLUME_NOT_SIS_ENABLED) - CHK_ERR_WIN32A(ERROR_QUORUM_OWNER_ALIVE) - CHK_ERR_WIN32A(ERROR_NETWORK_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_NODE_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_ALL_NODES_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_RESOURCE_FAILED) - CHK_ERR_WIN32A(ERROR_CLUSTER_INVALID_NODE) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_EXISTS) - CHK_ERR_WIN32A(ERROR_CLUSTER_JOIN_IN_PROGRESS) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CLUSTER_LOCAL_NODE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_EXISTS) - CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CLUSTER_NETINTERFACE_EXISTS) - CHK_ERR_WIN32A(ERROR_CLUSTER_NETINTERFACE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CLUSTER_INVALID_REQUEST) - CHK_ERR_WIN32A(ERROR_CLUSTER_INVALID_NETWORK_PROVIDER) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_DOWN) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_UNREACHABLE) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_NOT_MEMBER) - CHK_ERR_WIN32A(ERROR_CLUSTER_JOIN_NOT_IN_PROGRESS) - CHK_ERR_WIN32A(ERROR_CLUSTER_INVALID_NETWORK) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_UP) - CHK_ERR_WIN32A(ERROR_CLUSTER_IPADDR_IN_USE) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_NOT_PAUSED) - CHK_ERR_WIN32A(ERROR_CLUSTER_NO_SECURITY_CONTEXT) - CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_NOT_INTERNAL) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_ALREADY_UP) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_ALREADY_DOWN) - CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_ALREADY_ONLINE) - CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_ALREADY_OFFLINE) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_ALREADY_MEMBER) - CHK_ERR_WIN32A(ERROR_CLUSTER_LAST_INTERNAL_NETWORK) - CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_HAS_DEPENDENTS) - CHK_ERR_WIN32A(ERROR_INVALID_OPERATION_ON_QUORUM) - CHK_ERR_WIN32A(ERROR_DEPENDENCY_NOT_ALLOWED) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_PAUSED) - CHK_ERR_WIN32A(ERROR_NODE_CANT_HOST_RESOURCE) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_NOT_READY) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_SHUTTING_DOWN) - CHK_ERR_WIN32A(ERROR_CLUSTER_JOIN_ABORTED) - CHK_ERR_WIN32A(ERROR_CLUSTER_INCOMPATIBLE_VERSIONS) - CHK_ERR_WIN32A(ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDED) - CHK_ERR_WIN32A(ERROR_CLUSTER_SYSTEM_CONFIG_CHANGED) - CHK_ERR_WIN32A(ERROR_CLUSTER_RESOURCE_TYPE_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CLUSTER_RESTYPE_NOT_SUPPORTED) - CHK_ERR_WIN32A(ERROR_CLUSTER_RESNAME_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CLUSTER_NO_RPC_PACKAGES_REGISTERED) - CHK_ERR_WIN32A(ERROR_CLUSTER_OWNER_NOT_IN_PREFLIST) - CHK_ERR_WIN32A(ERROR_CLUSTER_DATABASE_SEQMISMATCH) - CHK_ERR_WIN32A(ERROR_RESMON_INVALID_STATE) - CHK_ERR_WIN32A(ERROR_CLUSTER_GUM_NOT_LOCKER) - CHK_ERR_WIN32A(ERROR_QUORUM_DISK_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_DATABASE_BACKUP_CORRUPT) - CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_ALREADY_HAS_DFS_ROOT) - CHK_ERR_WIN32A(ERROR_RESOURCE_PROPERTY_UNCHANGEABLE) - CHK_ERR_WIN32A(ERROR_CLUSTER_MEMBERSHIP_INVALID_STATE) - CHK_ERR_WIN32A(ERROR_CLUSTER_QUORUMLOG_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_CLUSTER_MEMBERSHIP_HALT) - CHK_ERR_WIN32A(ERROR_CLUSTER_INSTANCE_ID_MISMATCH) - CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_NOT_FOUND_FOR_IP) - CHK_ERR_WIN32A(ERROR_CLUSTER_PROPERTY_DATA_TYPE_MISMATCH) - CHK_ERR_WIN32A(ERROR_CLUSTER_EVICT_WITHOUT_CLEANUP) - CHK_ERR_WIN32A(ERROR_CLUSTER_PARAMETER_MISMATCH) - CHK_ERR_WIN32A(ERROR_NODE_CANNOT_BE_CLUSTERED) - CHK_ERR_WIN32A(ERROR_CLUSTER_WRONG_OS_VERSION) - CHK_ERR_WIN32A(ERROR_CLUSTER_CANT_CREATE_DUP_CLUSTER_NAME) -// CHK_ERR_WIN32A(ERROR_CLUSCFG_ALREADY_COMMITTED) -// CHK_ERR_WIN32A(ERROR_CLUSCFG_ROLLBACK_FAILED) -// CHK_ERR_WIN32A(ERROR_CLUSCFG_SYSTEM_DISK_DRIVE_LETTER_CONFLICT) -// CHK_ERR_WIN32A(ERROR_CLUSTER_OLD_VERSION) -// CHK_ERR_WIN32A(ERROR_CLUSTER_MISMATCHED_COMPUTER_ACCT_NAME) - CHK_ERR_WIN32A(ERROR_FILE_READ_ONLY) - CHK_ERR_WIN32A(ERROR_DIR_EFS_DISALLOWED) - CHK_ERR_WIN32A(ERROR_EFS_SERVER_NOT_TRUSTED) - CHK_ERR_WIN32A(ERROR_BAD_RECOVERY_POLICY) - CHK_ERR_WIN32A(ERROR_EFS_ALG_BLOB_TOO_BIG) - CHK_ERR_WIN32A(ERROR_VOLUME_NOT_SUPPORT_EFS) - CHK_ERR_WIN32A(ERROR_EFS_DISABLED) - CHK_ERR_WIN32A(ERROR_EFS_VERSION_NOT_SUPPORT) - CHK_ERR_WIN32A(SCHED_E_SERVICE_NOT_LOCALSYSTEM) - CHK_ERR_WIN32A(ERROR_CTX_CLIENT_LICENSE_IN_USE) - CHK_ERR_WIN32A(ERROR_CTX_CLIENT_LICENSE_NOT_SET) - CHK_ERR_WIN32A(ERROR_CTX_LICENSE_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_CTX_LICENSE_CLIENT_INVALID) - CHK_ERR_WIN32A(ERROR_CTX_LICENSE_EXPIRED) - CHK_ERR_WIN32A(ERROR_CTX_SHADOW_NOT_RUNNING) - CHK_ERR_WIN32A(ERROR_CTX_SHADOW_ENDED_BY_MODE_CHANGE) -// CHK_ERR_WIN32A(ERROR_ACTIVATION_COUNT_EXCEEDED) - CHK_ERR_WIN32A(ERROR_DS_SORT_CONTROL_MISSING) - CHK_ERR_WIN32A(ERROR_DS_OFFSET_RANGE_ERROR) - CHK_ERR_WIN32A(ERROR_DS_OBJECT_BEING_REMOVED) - CHK_ERR_WIN32A(ERROR_DS_DS_REQUIRED) - CHK_ERR_WIN32A(ERROR_DS_INVALID_LDAP_DISPLAY_NAME) - CHK_ERR_WIN32A(ERROR_DS_NON_BASE_SEARCH) - CHK_ERR_WIN32A(ERROR_DS_CANT_RETRIEVE_ATTS) - CHK_ERR_WIN32A(ERROR_DS_BACKLINK_WITHOUT_LINK) - CHK_ERR_WIN32A(ERROR_DS_EPOCH_MISMATCH) - CHK_ERR_WIN32A(ERROR_DS_SRC_NAME_MISMATCH) - CHK_ERR_WIN32A(ERROR_DS_SRC_AND_DST_NC_IDENTICAL) - CHK_ERR_WIN32A(ERROR_DS_DST_NC_MISMATCH) - CHK_ERR_WIN32A(ERROR_DS_NOT_AUTHORITIVE_FOR_DST_NC) - CHK_ERR_WIN32A(ERROR_DS_SRC_GUID_MISMATCH) - CHK_ERR_WIN32A(ERROR_DS_CANT_MOVE_DELETED_OBJECT) - CHK_ERR_WIN32A(ERROR_DS_PDC_OPERATION_IN_PROGRESS) - CHK_ERR_WIN32A(ERROR_DS_CROSS_DOMAIN_CLEANUP_REQD) - CHK_ERR_WIN32A(ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATION) - CHK_ERR_WIN32A(ERROR_DS_CANT_WITH_ACCT_GROUP_MEMBERSHPS) - CHK_ERR_WIN32A(ERROR_DS_NC_MUST_HAVE_NC_PARENT) - CHK_ERR_WIN32A(ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE) - CHK_ERR_WIN32A(ERROR_DS_DST_DOMAIN_NOT_NATIVE) - CHK_ERR_WIN32A(ERROR_DS_MISSING_INFRASTRUCTURE_CONTAINER) - CHK_ERR_WIN32A(ERROR_DS_CANT_MOVE_ACCOUNT_GROUP) - CHK_ERR_WIN32A(ERROR_DS_CANT_MOVE_RESOURCE_GROUP) - CHK_ERR_WIN32A(ERROR_DS_INVALID_SEARCH_FLAG) - CHK_ERR_WIN32A(ERROR_DS_NO_TREE_DELETE_ABOVE_NC) - CHK_ERR_WIN32A(ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE) - CHK_ERR_WIN32A(ERROR_DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETE) - CHK_ERR_WIN32A(ERROR_DS_SAM_INIT_FAILURE) - CHK_ERR_WIN32A(ERROR_DS_SENSITIVE_GROUP_VIOLATION) - CHK_ERR_WIN32A(ERROR_DS_CANT_MOD_PRIMARYGROUPID) - CHK_ERR_WIN32A(ERROR_DS_ILLEGAL_BASE_SCHEMA_MOD) - CHK_ERR_WIN32A(ERROR_DS_NONSAFE_SCHEMA_CHANGE) - CHK_ERR_WIN32A(ERROR_DS_SCHEMA_UPDATE_DISALLOWED) - CHK_ERR_WIN32A(ERROR_DS_CANT_CREATE_UNDER_SCHEMA) - CHK_ERR_WIN32A(ERROR_DS_INSTALL_NO_SRC_SCH_VERSION) - CHK_ERR_WIN32A(ERROR_DS_INSTALL_NO_SCH_VERSION_IN_INIFILE) - CHK_ERR_WIN32A(ERROR_DS_INVALID_GROUP_TYPE) - CHK_ERR_WIN32A(ERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN) - CHK_ERR_WIN32A(ERROR_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN) - CHK_ERR_WIN32A(ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER) - CHK_ERR_WIN32A(ERROR_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER) - CHK_ERR_WIN32A(ERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER) - CHK_ERR_WIN32A(ERROR_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER) - CHK_ERR_WIN32A(ERROR_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER) - CHK_ERR_WIN32A(ERROR_DS_HAVE_PRIMARY_MEMBERS) - CHK_ERR_WIN32A(ERROR_DS_STRING_SD_CONVERSION_FAILED) - CHK_ERR_WIN32A(ERROR_DS_NAMING_MASTER_GC) - CHK_ERR_WIN32A(ERROR_DS_DNS_LOOKUP_FAILURE) - CHK_ERR_WIN32A(ERROR_DS_COULDNT_UPDATE_SPNS) - CHK_ERR_WIN32A(ERROR_DS_CANT_RETRIEVE_SD) - CHK_ERR_WIN32A(ERROR_DS_KEY_NOT_UNIQUE) - CHK_ERR_WIN32A(ERROR_DS_WRONG_LINKED_ATT_SYNTAX) - CHK_ERR_WIN32A(ERROR_DS_SAM_NEED_BOOTKEY_PASSWORD) - CHK_ERR_WIN32A(ERROR_DS_SAM_NEED_BOOTKEY_FLOPPY) - CHK_ERR_WIN32A(ERROR_DS_CANT_START) - CHK_ERR_WIN32A(ERROR_DS_INIT_FAILURE) - CHK_ERR_WIN32A(ERROR_DS_NO_PKT_PRIVACY_ON_CONNECTION) - CHK_ERR_WIN32A(ERROR_DS_SOURCE_DOMAIN_IN_FOREST) - CHK_ERR_WIN32A(ERROR_DS_DESTINATION_DOMAIN_NOT_IN_FOREST) - CHK_ERR_WIN32A(ERROR_DS_DESTINATION_AUDITING_NOT_ENABLED) - CHK_ERR_WIN32A(ERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAIN) - CHK_ERR_WIN32A(ERROR_DS_SRC_OBJ_NOT_GROUP_OR_USER) - CHK_ERR_WIN32A(ERROR_DS_SRC_SID_EXISTS_IN_FOREST) - CHK_ERR_WIN32A(ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCH) - CHK_ERR_WIN32A(ERROR_SAM_INIT_FAILURE) - CHK_ERR_WIN32A(ERROR_DS_DRA_SCHEMA_INFO_SHIP) - CHK_ERR_WIN32A(ERROR_DS_DRA_SCHEMA_CONFLICT) - CHK_ERR_WIN32A(ERROR_DS_DRA_EARLIER_SCHEMA_CONFLICT) - CHK_ERR_WIN32A(ERROR_DS_DRA_OBJ_NC_MISMATCH) - CHK_ERR_WIN32A(ERROR_DS_NC_STILL_HAS_DSAS) - CHK_ERR_WIN32A(ERROR_DS_GC_REQUIRED) - CHK_ERR_WIN32A(ERROR_DS_LOCAL_MEMBER_OF_LOCAL_ONLY) - CHK_ERR_WIN32A(ERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPS) - CHK_ERR_WIN32A(ERROR_DS_CANT_ADD_TO_GC) - CHK_ERR_WIN32A(ERROR_DS_NO_CHECKPOINT_WITH_PDC) - CHK_ERR_WIN32A(ERROR_DS_SOURCE_AUDITING_NOT_ENABLED) - CHK_ERR_WIN32A(ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NC) - CHK_ERR_WIN32A(ERROR_DS_INVALID_NAME_FOR_SPN) - CHK_ERR_WIN32A(ERROR_DS_FILTER_USES_CONTRUCTED_ATTRS) - CHK_ERR_WIN32A(ERROR_DS_UNICODEPWD_NOT_IN_QUOTES) - CHK_ERR_WIN32A(ERROR_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED) - CHK_ERR_WIN32A(ERROR_DS_MUST_BE_RUN_ON_DST_DC) - CHK_ERR_WIN32A(ERROR_DS_SRC_DC_MUST_BE_SP4_OR_GREATER) - CHK_ERR_WIN32A(ERROR_DS_CANT_TREE_DELETE_CRITICAL_OBJ) - CHK_ERR_WIN32A(ERROR_DS_INIT_FAILURE_CONSOLE) - CHK_ERR_WIN32A(ERROR_DS_SAM_INIT_FAILURE_CONSOLE) - CHK_ERR_WIN32A(ERROR_DS_FOREST_VERSION_TOO_HIGH) - CHK_ERR_WIN32A(ERROR_DS_DOMAIN_VERSION_TOO_HIGH) - CHK_ERR_WIN32A(ERROR_DS_FOREST_VERSION_TOO_LOW) - CHK_ERR_WIN32A(ERROR_DS_DOMAIN_VERSION_TOO_LOW) - CHK_ERR_WIN32A(ERROR_DS_INCOMPATIBLE_VERSION) - CHK_ERR_WIN32A(ERROR_DS_LOW_DSA_VERSION) - CHK_ERR_WIN32A(ERROR_DS_NO_BEHAVIOR_VERSION_IN_MIXEDDOMAIN) - CHK_ERR_WIN32A(ERROR_DS_NOT_SUPPORTED_SORT_ORDER) - CHK_ERR_WIN32A(ERROR_DS_NAME_NOT_UNIQUE) - CHK_ERR_WIN32A(ERROR_DS_MACHINE_ACCOUNT_CREATED_PRENT4) - CHK_ERR_WIN32A(ERROR_DS_OUT_OF_VERSION_STORE) - CHK_ERR_WIN32A(ERROR_DS_INCOMPATIBLE_CONTROLS_USED) - CHK_ERR_WIN32A(ERROR_DS_NO_REF_DOMAIN) - CHK_ERR_WIN32A(ERROR_DS_RESERVED_LINK_ID) - CHK_ERR_WIN32A(ERROR_DS_LINK_ID_NOT_AVAILABLE) - CHK_ERR_WIN32A(ERROR_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER) - CHK_ERR_WIN32A(ERROR_DS_MODIFYDN_DISALLOWED_BY_INSTANCE_TYPE) - CHK_ERR_WIN32A(ERROR_DS_NO_OBJECT_MOVE_IN_SCHEMA_NC) - CHK_ERR_WIN32A(ERROR_DS_MODIFYDN_DISALLOWED_BY_FLAG) - CHK_ERR_WIN32A(ERROR_DS_MODIFYDN_WRONG_GRANDPARENT) - CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_TRUST_REFERRAL) - CHK_ERR_WIN32A(ERROR_NOT_SUPPORTED_ON_STANDARD_SERVER) - CHK_ERR_WIN32A(ERROR_DS_CANT_ACCESS_REMOTE_PART_OF_AD) - CHK_ERR_WIN32A(ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE_V2) - CHK_ERR_WIN32A(ERROR_DS_THREAD_LIMIT_EXCEEDED) - CHK_ERR_WIN32A(ERROR_DS_NOT_CLOSEST) - CHK_ERR_WIN32A(ERROR_DS_CANT_DERIVE_SPN_WITHOUT_SERVER_REF) - CHK_ERR_WIN32A(ERROR_DS_SINGLE_USER_MODE_FAILED) - CHK_ERR_WIN32A(ERROR_DS_NTDSCRIPT_SYNTAX_ERROR) - CHK_ERR_WIN32A(ERROR_DS_NTDSCRIPT_PROCESS_ERROR) - CHK_ERR_WIN32A(ERROR_DS_DIFFERENT_REPL_EPOCHS) - CHK_ERR_WIN32A(ERROR_DS_DRS_EXTENSIONS_CHANGED) - CHK_ERR_WIN32A(ERROR_DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR) - CHK_ERR_WIN32A(ERROR_DS_NO_MSDS_INTID) - CHK_ERR_WIN32A(ERROR_DS_DUP_MSDS_INTID) - CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_RDNATTID) - CHK_ERR_WIN32A(ERROR_DS_AUTHORIZATION_FAILED) - CHK_ERR_WIN32A(ERROR_DS_INVALID_SCRIPT) - CHK_ERR_WIN32A(ERROR_DS_REMOTE_CROSSREF_OP_FAILED) -// CHK_ERR_WIN32A(ERROR_DS_CROSS_REF_BUSY) -// CHK_ERR_WIN32A(ERROR_DS_CANT_DERIVE_SPN_FOR_DELETED_DOMAIN) -// CHK_ERR_WIN32A(ERROR_DS_CANT_DEMOTE_WITH_WRITEABLE_NC) -// CHK_ERR_WIN32A(ERROR_DS_DUPLICATE_ID_FOUND) -// CHK_ERR_WIN32A(ERROR_DS_INSUFFICIENT_ATTR_TO_CREATE_OBJECT) -// CHK_ERR_WIN32A(ERROR_DS_GROUP_CONVERSION_ERROR) -// CHK_ERR_WIN32A(ERROR_DS_CANT_MOVE_APP_BASIC_GROUP) -// CHK_ERR_WIN32A(ERROR_DS_CANT_MOVE_APP_QUERY_GROUP) -// CHK_ERR_WIN32A(ERROR_DS_ROLE_NOT_VERIFIED) -// CHK_ERR_WIN32A(ERROR_DS_WKO_CONTAINER_CANNOT_BE_SPECIAL) -// CHK_ERR_WIN32A(ERROR_DS_DOMAIN_RENAME_IN_PROGRESS) -// CHK_ERR_WIN32A(ERROR_DS_EXISTING_AD_CHILD_NC) -// CHK_ERR_WIN32A(DNS_ERROR_INVALID_NAME_CHAR) -// CHK_ERR_WIN32A(DNS_ERROR_NUMERIC_NAME) -// CHK_ERR_WIN32A(DNS_ERROR_NOT_ALLOWED_ON_ROOT_SERVER) -// CHK_ERR_WIN32A(DNS_ERROR_NOT_ALLOWED_UNDER_DELEGATION) -// CHK_ERR_WIN32A(DNS_ERROR_CANNOT_FIND_ROOT_HINTS) -// CHK_ERR_WIN32A(DNS_ERROR_INCONSISTENT_ROOT_HINTS) - CHK_ERR_WIN32A(DNS_ERROR_FORWARDER_ALREADY_EXISTS) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_REQUIRES_MASTER_IP) - CHK_ERR_WIN32A(DNS_ERROR_ZONE_IS_SHUTDOWN) - CHK_ERR_WIN32A(DNS_ERROR_DP_BASE) - CHK_ERR_WIN32A(DNS_ERROR_DP_DOES_NOT_EXIST) - CHK_ERR_WIN32A(DNS_ERROR_DP_ALREADY_EXISTS) - CHK_ERR_WIN32A(DNS_ERROR_DP_NOT_ENLISTED) - CHK_ERR_WIN32A(DNS_ERROR_DP_ALREADY_ENLISTED) -// CHK_ERR_WIN32A(DNS_ERROR_DP_NOT_AVAILABLE) - CHK_ERR_WIN32A(WSA_QOS_ESERVICETYPE) - CHK_ERR_WIN32A(WSA_QOS_EFLOWSPEC) - CHK_ERR_WIN32A(WSA_QOS_EPROVSPECBUF) - CHK_ERR_WIN32A(WSA_QOS_EFILTERSTYLE) - CHK_ERR_WIN32A(WSA_QOS_EFILTERTYPE) - CHK_ERR_WIN32A(WSA_QOS_EFILTERCOUNT) - CHK_ERR_WIN32A(WSA_QOS_EOBJLENGTH) - CHK_ERR_WIN32A(WSA_QOS_EFLOWCOUNT) - CHK_ERR_WIN32A(WSA_QOS_EUNKOWNPSOBJ) - CHK_ERR_WIN32A(WSA_QOS_EPOLICYOBJ) - CHK_ERR_WIN32A(WSA_QOS_EFLOWDESC) - CHK_ERR_WIN32A(WSA_QOS_EPSFLOWSPEC) - CHK_ERR_WIN32A(WSA_QOS_EPSFILTERSPEC) - CHK_ERR_WIN32A(WSA_QOS_ESDMODEOBJ) - CHK_ERR_WIN32A(WSA_QOS_ESHAPERATEOBJ) - CHK_ERR_WIN32A(WSA_QOS_RESERVED_PETYPE) - CHK_ERR_WIN32A(ERROR_SXS_SECTION_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_SXS_CANT_GEN_ACTCTX) - CHK_ERR_WIN32A(ERROR_SXS_INVALID_ACTCTXDATA_FORMAT) - CHK_ERR_WIN32A(ERROR_SXS_ASSEMBLY_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_SXS_MANIFEST_FORMAT_ERROR) - CHK_ERR_WIN32A(ERROR_SXS_MANIFEST_PARSE_ERROR) - CHK_ERR_WIN32A(ERROR_SXS_ACTIVATION_CONTEXT_DISABLED) - CHK_ERR_WIN32A(ERROR_SXS_KEY_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_SXS_VERSION_CONFLICT) - CHK_ERR_WIN32A(ERROR_SXS_WRONG_SECTION_TYPE) - CHK_ERR_WIN32A(ERROR_SXS_THREAD_QUERIES_DISABLED) - CHK_ERR_WIN32A(ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET) - CHK_ERR_WIN32A(ERROR_SXS_UNKNOWN_ENCODING_GROUP) - CHK_ERR_WIN32A(ERROR_SXS_UNKNOWN_ENCODING) - CHK_ERR_WIN32A(ERROR_SXS_INVALID_XML_NAMESPACE_URI) - CHK_ERR_WIN32A(ERROR_SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED) - CHK_ERR_WIN32A(ERROR_SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED) - CHK_ERR_WIN32A(ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE) - CHK_ERR_WIN32A(ERROR_SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE) - CHK_ERR_WIN32A(ERROR_SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE) - CHK_ERR_WIN32A(ERROR_SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT) - CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_DLL_NAME) - CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_WINDOWCLASS_NAME) - CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_CLSID) - CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_IID) - CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_TLBID) - CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_PROGID) - CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_ASSEMBLY_NAME) - CHK_ERR_WIN32A(ERROR_SXS_FILE_HASH_MISMATCH) - CHK_ERR_WIN32A(ERROR_SXS_POLICY_PARSE_ERROR) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSINGQUOTE) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_COMMENTSYNTAX) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADSTARTNAMECHAR) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADNAMECHAR) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADCHARINSTRING) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_XMLDECLSYNTAX) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADCHARDATA) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSINGWHITESPACE) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_EXPECTINGTAGEND) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSINGSEMICOLON) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNBALANCEDPAREN) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_INTERNALERROR) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNEXPECTED_WHITESPACE) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_INCOMPLETE_ENCODING) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSING_PAREN) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_EXPECTINGCLOSEQUOTE) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_MULTIPLE_COLONS) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALID_DECIMAL) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALID_HEXIDECIMAL) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALID_UNICODE) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_WHITESPACEORQUESTIONMARK) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNEXPECTEDENDTAG) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDTAG) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_DUPLICATEATTRIBUTE) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_MULTIPLEROOTS) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALIDATROOTLEVEL) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADXMLDECL) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSINGROOT) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNEXPECTEDEOF) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADPEREFINSUBSET) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDSTARTTAG) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDENDTAG) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDSTRING) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDCOMMENT) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDDECL) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDCDATA) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_RESERVEDNAMESPACE) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALIDENCODING) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALIDSWITCH) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADXMLCASE) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALID_STANDALONE) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNEXPECTED_STANDALONE) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALID_VERSION) - CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSINGEQUALS) - CHK_ERR_WIN32A(ERROR_SXS_PROTECTION_RECOVERY_FAILED) - CHK_ERR_WIN32A(ERROR_SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT) - CHK_ERR_WIN32A(ERROR_SXS_PROTECTION_CATALOG_NOT_VALID) - CHK_ERR_WIN32A(ERROR_SXS_UNTRANSLATABLE_HRESULT) - CHK_ERR_WIN32A(ERROR_SXS_PROTECTION_CATALOG_FILE_MISSING) - CHK_ERR_WIN32A(ERROR_SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE) - CHK_ERR_WIN32A(ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME) - CHK_ERR_WIN32A(ERROR_IPSEC_QM_POLICY_EXISTS) - CHK_ERR_WIN32A(ERROR_IPSEC_QM_POLICY_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_IPSEC_QM_POLICY_IN_USE) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_POLICY_EXISTS) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_POLICY_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_POLICY_IN_USE) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_FILTER_EXISTS) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_FILTER_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_IPSEC_TRANSPORT_FILTER_EXISTS) - CHK_ERR_WIN32A(ERROR_IPSEC_TRANSPORT_FILTER_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_AUTH_EXISTS) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_AUTH_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_AUTH_IN_USE) - CHK_ERR_WIN32A(ERROR_IPSEC_DEFAULT_MM_POLICY_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_IPSEC_DEFAULT_MM_AUTH_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_IPSEC_DEFAULT_QM_POLICY_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_IPSEC_TUNNEL_FILTER_EXISTS) - CHK_ERR_WIN32A(ERROR_IPSEC_TUNNEL_FILTER_NOT_FOUND) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_FILTER_PENDING_DELETION) - CHK_ERR_WIN32A(ERROR_IPSEC_TRANSPORT_FILTER_PENDING_DELETION) - CHK_ERR_WIN32A(ERROR_IPSEC_TUNNEL_FILTER_PENDING_DELETION) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_POLICY_PENDING_DELETION) - CHK_ERR_WIN32A(ERROR_IPSEC_MM_AUTH_PENDING_DELETION) - CHK_ERR_WIN32A(ERROR_IPSEC_QM_POLICY_PENDING_DELETION) -// CHK_ERR_WIN32A(WARNING_IPSEC_MM_POLICY_PRUNED) -// CHK_ERR_WIN32A(WARNING_IPSEC_QM_POLICY_PRUNED) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NEG_STATUS_BEGIN) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_AUTH_FAIL) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_ATTRIB_FAIL) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NEGOTIATION_PENDING) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_GENERAL_PROCESSING_ERROR) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_TIMED_OUT) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_CERT) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SA_DELETED) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SA_REAPED) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_MM_ACQUIRE_DROP) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_QM_ACQUIRE_DROP) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_QUEUE_DROP_MM) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_QUEUE_DROP_NO_MM) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_DROP_NO_RESPONSE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_MM_DELAY_DROP) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_QM_DELAY_DROP) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_ERROR) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_CRL_FAILED) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_KEY_USAGE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_CERT_TYPE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_PRIVATE_KEY) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_DH_FAIL) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_HEADER) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_POLICY) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_SIGNATURE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_KERBEROS_ERROR) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_PUBLIC_KEY) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_SA) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_PROP) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_TRANS) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_KE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_ID) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_CERT) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_CERT_REQ) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_HASH) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_SIG) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_NONCE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_NOTIFY) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_DELETE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_VENDOR) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_PAYLOAD) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_LOAD_SOFT_SA) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SOFT_SA_TORN_DOWN) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_COOKIE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_PEER_CERT) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PEER_CRL_FAILED) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_POLICY_CHANGE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_MM_POLICY) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NOTCBPRIV) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SECLOADFAIL) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_FAILSSPINIT) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_FAILQUERYSSP) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SRVACQFAIL) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SRVQUERYCRED) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_GETSPIFAIL) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_FILTER) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_OUT_OF_MEMORY) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_ADD_UPDATE_KEY_FAILED) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_POLICY) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_UNKNOWN_DOI) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_SITUATION) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_DH_FAILURE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_GROUP) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_ENCRYPT) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_DECRYPT) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_POLICY_MATCH) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_UNSUPPORTED_ID) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_HASH) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_HASH_ALG) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_HASH_SIZE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_ENCRYPT_ALG) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_AUTH_ALG) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_SIG) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_LOAD_FAILED) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_RPC_DELETE) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_BENIGN_REINIT) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_RESPONDER_LIFETIME_NOTIFY) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_CERT_KEYLEN) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_MM_LIMIT) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NEGOTIATION_DISABLED) - CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NEG_STATUS_END) - -#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) - -// ------------------------------------------------------------- -// ddraw.h error codes -// ------------------------------------------------------------- - CHK_ERRA(DDERR_ALREADYINITIALIZED) - CHK_ERRA(DDERR_CANNOTATTACHSURFACE) - CHK_ERRA(DDERR_CANNOTDETACHSURFACE) - CHK_ERRA(DDERR_CURRENTLYNOTAVAIL) - CHK_ERRA(DDERR_EXCEPTION) -// CHK_ERRA(DDERR_GENERIC) - CHK_ERRA(DDERR_HEIGHTALIGN) - CHK_ERRA(DDERR_INCOMPATIBLEPRIMARY) - CHK_ERRA(DDERR_INVALIDCAPS) - CHK_ERRA(DDERR_INVALIDCLIPLIST) - CHK_ERRA(DDERR_INVALIDMODE) - CHK_ERRA(DDERR_INVALIDOBJECT) -// CHK_ERRA(DDERR_INVALIDPARAMS) - CHK_ERRA(DDERR_INVALIDPIXELFORMAT) - CHK_ERRA(DDERR_INVALIDRECT) - CHK_ERRA(DDERR_LOCKEDSURFACES) - CHK_ERRA(DDERR_NO3D) - CHK_ERRA(DDERR_NOALPHAHW) - CHK_ERRA(DDERR_NOSTEREOHARDWARE) - CHK_ERRA(DDERR_NOSURFACELEFT) - CHK_ERRA(DDERR_NOCLIPLIST) - CHK_ERRA(DDERR_NOCOLORCONVHW) - CHK_ERRA(DDERR_NOCOOPERATIVELEVELSET) - CHK_ERRA(DDERR_NOCOLORKEY) - CHK_ERRA(DDERR_NOCOLORKEYHW) - CHK_ERRA(DDERR_NODIRECTDRAWSUPPORT) - CHK_ERRA(DDERR_NOEXCLUSIVEMODE) - CHK_ERRA(DDERR_NOFLIPHW) - CHK_ERRA(DDERR_NOGDI) - CHK_ERRA(DDERR_NOMIRRORHW) - CHK_ERRA(DDERR_NOTFOUND) - CHK_ERRA(DDERR_NOOVERLAYHW) - CHK_ERRA(DDERR_OVERLAPPINGRECTS) - CHK_ERRA(DDERR_NORASTEROPHW) - CHK_ERRA(DDERR_NOROTATIONHW) - CHK_ERRA(DDERR_NOSTRETCHHW) - CHK_ERRA(DDERR_NOT4BITCOLOR) - CHK_ERRA(DDERR_NOT4BITCOLORINDEX) - CHK_ERRA(DDERR_NOT8BITCOLOR) - CHK_ERRA(DDERR_NOTEXTUREHW) - CHK_ERRA(DDERR_NOVSYNCHW) - CHK_ERRA(DDERR_NOZBUFFERHW) - CHK_ERRA(DDERR_NOZOVERLAYHW) - CHK_ERRA(DDERR_OUTOFCAPS) -// CHK_ERRA(DDERR_OUTOFMEMORY) -// CHK_ERRA(DDERR_OUTOFVIDEOMEMORY) - CHK_ERRA(DDERR_OVERLAYCANTCLIP) - CHK_ERRA(DDERR_OVERLAYCOLORKEYONLYONEACTIVE) - CHK_ERRA(DDERR_PALETTEBUSY) - CHK_ERRA(DDERR_COLORKEYNOTSET) - CHK_ERRA(DDERR_SURFACEALREADYATTACHED) - CHK_ERRA(DDERR_SURFACEALREADYDEPENDENT) - CHK_ERRA(DDERR_SURFACEBUSY) - CHK_ERRA(DDERR_CANTLOCKSURFACE) - CHK_ERRA(DDERR_SURFACEISOBSCURED) - CHK_ERRA(DDERR_SURFACELOST) - CHK_ERRA(DDERR_SURFACENOTATTACHED) - CHK_ERRA(DDERR_TOOBIGHEIGHT) - CHK_ERRA(DDERR_TOOBIGSIZE) - CHK_ERRA(DDERR_TOOBIGWIDTH) -// CHK_ERRA(DDERR_UNSUPPORTED) - CHK_ERRA(DDERR_UNSUPPORTEDFORMAT) - CHK_ERRA(DDERR_UNSUPPORTEDMASK) - CHK_ERRA(DDERR_INVALIDSTREAM) - CHK_ERRA(DDERR_VERTICALBLANKINPROGRESS) - CHK_ERRA(DDERR_WASSTILLDRAWING) - CHK_ERRA(DDERR_DDSCAPSCOMPLEXREQUIRED) - CHK_ERRA(DDERR_XALIGN) - CHK_ERRA(DDERR_INVALIDDIRECTDRAWGUID) - CHK_ERRA(DDERR_DIRECTDRAWALREADYCREATED) - CHK_ERRA(DDERR_NODIRECTDRAWHW) - CHK_ERRA(DDERR_PRIMARYSURFACEALREADYEXISTS) - CHK_ERRA(DDERR_NOEMULATION) - CHK_ERRA(DDERR_REGIONTOOSMALL) - CHK_ERRA(DDERR_CLIPPERISUSINGHWND) - CHK_ERRA(DDERR_NOCLIPPERATTACHED) - CHK_ERRA(DDERR_NOHWND) - CHK_ERRA(DDERR_HWNDSUBCLASSED) - CHK_ERRA(DDERR_HWNDALREADYSET) - CHK_ERRA(DDERR_NOPALETTEATTACHED) - CHK_ERRA(DDERR_NOPALETTEHW) - CHK_ERRA(DDERR_BLTFASTCANTCLIP) - CHK_ERRA(DDERR_NOBLTHW) - CHK_ERRA(DDERR_NODDROPSHW) - CHK_ERRA(DDERR_OVERLAYNOTVISIBLE) - CHK_ERRA(DDERR_NOOVERLAYDEST) - CHK_ERRA(DDERR_INVALIDPOSITION) - CHK_ERRA(DDERR_NOTAOVERLAYSURFACE) - CHK_ERRA(DDERR_EXCLUSIVEMODEALREADYSET) - CHK_ERRA(DDERR_NOTFLIPPABLE) - CHK_ERRA(DDERR_CANTDUPLICATE) - CHK_ERRA(DDERR_NOTLOCKED) - CHK_ERRA(DDERR_CANTCREATEDC) - CHK_ERRA(DDERR_NODC) - CHK_ERRA(DDERR_WRONGMODE) - CHK_ERRA(DDERR_IMPLICITLYCREATED) - CHK_ERRA(DDERR_NOTPALETTIZED) - CHK_ERRA(DDERR_UNSUPPORTEDMODE) - CHK_ERRA(DDERR_NOMIPMAPHW) - CHK_ERRA(DDERR_INVALIDSURFACETYPE) - CHK_ERRA(DDERR_NOOPTIMIZEHW) - CHK_ERRA(DDERR_NOTLOADED) - CHK_ERRA(DDERR_NOFOCUSWINDOW) - CHK_ERRA(DDERR_NOTONMIPMAPSUBLEVEL) - CHK_ERRA(DDERR_DCALREADYCREATED) - CHK_ERRA(DDERR_NONONLOCALVIDMEM) - CHK_ERRA(DDERR_CANTPAGELOCK) - CHK_ERRA(DDERR_CANTPAGEUNLOCK) - CHK_ERRA(DDERR_NOTPAGELOCKED) - CHK_ERRA(DDERR_MOREDATA) - CHK_ERRA(DDERR_EXPIRED) - CHK_ERRA(DDERR_TESTFINISHED) - CHK_ERRA(DDERR_NEWMODE) - CHK_ERRA(DDERR_D3DNOTINITIALIZED) - CHK_ERRA(DDERR_VIDEONOTACTIVE) - CHK_ERRA(DDERR_NOMONITORINFORMATION) - CHK_ERRA(DDERR_NODRIVERSUPPORT) - CHK_ERRA(DDERR_DEVICEDOESNTOWNSURFACE) - -// ------------------------------------------------------------- -// dinput.h error codes -// ------------------------------------------------------------- -// CHK_ERRA(DI_OK) -// CHK_ERRA(DI_NOTATTACHED) -// CHK_ERRA(DI_BUFFEROVERFLOW) -// CHK_ERRA(DI_PROPNOEFFECT) -// CHK_ERRA(DI_NOEFFECT) -// CHK_ERRA(DI_POLLEDDEVICE) -// CHK_ERRA(DI_DOWNLOADSKIPPED) -// CHK_ERRA(DI_EFFECTRESTARTED) -// CHK_ERRA(DI_SETTINGSNOTSAVED_ACCESSDENIED) -// CHK_ERRA(DI_SETTINGSNOTSAVED_DISKFULL) -// CHK_ERRA(DI_TRUNCATED) -// CHK_ERRA(DI_TRUNCATEDANDRESTARTED) -// CHK_ERRA(DI_WRITEPROTECT) - CHK_ERR(DIERR_INSUFFICIENTPRIVS, "DIERR_INSUFFICIENTPRIVS & VFW_E_INVALIDMEDIATYPE") - CHK_ERR(DIERR_DEVICEFULL, "DIERR_DEVICEFULL & VFW_E_INVALIDSUBTYPE & DMO_E_INVALIDSTREAMINDEX") - CHK_ERR(DIERR_MOREDATA, "DIERR_MOREDATA & VFW_E_NEED_OWNER & DMO_E_INVALIDTYPE") - CHK_ERR(DIERR_NOTDOWNLOADED, "DIERR_NOTDOWNLOADED & VFW_E_ENUM_OUT_OF_SYNC & DMO_E_TYPE_NOT_SET") - CHK_ERR(DIERR_HASEFFECTS, "DIERR_HASEFFECTS & VFW_E_ALREADY_CONNECTED & DMO_E_NOTACCEPTING") - CHK_ERR(DIERR_NOTEXCLUSIVEACQUIRED, "DIERR_NOTEXCLUSIVEACQUIRED & VFW_E_FILTER_ACTIVE & DMO_E_TYPE_NOT_ACCEPTED") - CHK_ERR(DIERR_INCOMPLETEEFFECT, "DIERR_INCOMPLETEEFFECT & VFW_E_NO_TYPES & DMO_E_NO_MORE_ITEMS") - CHK_ERR(DIERR_NOTBUFFERED, "DIERR_NOTBUFFERED & VFW_E_NO_ACCEPTABLE_TYPES") - CHK_ERR(DIERR_EFFECTPLAYING, "DIERR_EFFECTPLAYING & VFW_E_INVALID_DIRECTION") - CHK_ERR(DIERR_UNPLUGGED, "DIERR_UNPLUGGED & VFW_E_NOT_CONNECTED") - CHK_ERR(DIERR_REPORTFULL, "DIERR_REPORTFULL & VFW_E_NO_ALLOCATOR") - CHK_ERR(DIERR_MAPFILEFAIL, "DIERR_MAPFILEFAIL & VFW_E_RUNTIME_ERROR") -// CHK_ERRA(DIERR_OLDDIRECTINPUTVERSION) -// CHK_ERRA(DIERR_GENERIC) -// CHK_ERRA(DIERR_OLDDIRECTINPUTVERSION) -// CHK_ERRA(DIERR_BETADIRECTINPUTVERSION) -// CHK_ERRA(DIERR_BADDRIVERVER) -// CHK_ERRA(DIERR_DEVICENOTREG) -// CHK_ERRA(DIERR_NOTFOUND) -// CHK_ERRA(DIERR_OBJECTNOTFOUND) -// CHK_ERRA(DIERR_INVALIDPARAM) -// CHK_ERRA(DIERR_NOINTERFACE) -// CHK_ERRA(DIERR_GENERIC) -// CHK_ERRA(DIERR_OUTOFMEMORY) -// CHK_ERRA(DIERR_UNSUPPORTED) -// CHK_ERRA(DIERR_NOTINITIALIZED) -// CHK_ERRA(DIERR_ALREADYINITIALIZED) -// CHK_ERRA(DIERR_NOAGGREGATION) -// CHK_ERRA(DIERR_OTHERAPPHASPRIO) -// CHK_ERRA(DIERR_INPUTLOST) -// CHK_ERRA(DIERR_ACQUIRED) -// CHK_ERRA(DIERR_NOTACQUIRED) -// CHK_ERRA(DIERR_READONLY) -// CHK_ERRA(DIERR_HANDLEEXISTS) - - -// ------------------------------------------------------------- -// dinputd.h error -// ------------------------------------------------------------- -// CHK_ERRA(DIERR_NOMOREITEMS) - CHK_ERRA(DIERR_DRIVERFIRST) - CHK_ERR(DIERR_DRIVERFIRST+1, "DIERR_DRIVERFIRST+1") - CHK_ERR(DIERR_DRIVERFIRST+2, "DIERR_DRIVERFIRST+2") - CHK_ERR(DIERR_DRIVERFIRST+3, "DIERR_DRIVERFIRST+3") - CHK_ERR(DIERR_DRIVERFIRST+4, "DIERR_DRIVERFIRST+4") - CHK_ERR(DIERR_DRIVERFIRST+5, "DIERR_DRIVERFIRST+5") - CHK_ERRA(DIERR_DRIVERLAST) - CHK_ERR(DIERR_INVALIDCLASSINSTALLER, "DIERR_INVALIDCLASSINSTALLER") - CHK_ERR(DIERR_CANCELLED, "DIERR_CANCELLED & MS_E_SAMPLEALLOC") - CHK_ERRA(DIERR_BADINF) - -// ------------------------------------------------------------- -// d3d9.h error codes -// ------------------------------------------------------------- -// CHK_ERRA(D3D_OK) - CHK_ERRA(D3DERR_WRONGTEXTUREFORMAT) - CHK_ERRA(D3DERR_UNSUPPORTEDCOLOROPERATION) - CHK_ERRA(D3DERR_UNSUPPORTEDCOLORARG) - CHK_ERRA(D3DERR_UNSUPPORTEDALPHAOPERATION) - CHK_ERRA(D3DERR_UNSUPPORTEDALPHAARG) - CHK_ERRA(D3DERR_TOOMANYOPERATIONS) - CHK_ERRA(D3DERR_CONFLICTINGTEXTUREFILTER) - CHK_ERRA(D3DERR_UNSUPPORTEDFACTORVALUE) - CHK_ERRA(D3DERR_CONFLICTINGRENDERSTATE) - CHK_ERRA(D3DERR_UNSUPPORTEDTEXTUREFILTER) - CHK_ERRA(D3DERR_CONFLICTINGTEXTUREPALETTE) - CHK_ERRA(D3DERR_DRIVERINTERNALERROR) - CHK_ERRA(D3DERR_NOTFOUND) - CHK_ERRA(D3DERR_MOREDATA) - CHK_ERRA(D3DERR_DEVICELOST) - CHK_ERRA(D3DERR_DEVICENOTRESET) - CHK_ERRA(D3DERR_NOTAVAILABLE) - CHK_ERRA(D3DERR_OUTOFVIDEOMEMORY) - CHK_ERRA(D3DERR_INVALIDDEVICE) - CHK_ERRA(D3DERR_INVALIDCALL) - CHK_ERRA(D3DERR_DRIVERINVALIDCALL) - //CHK_ERRA(D3DERR_WASSTILLDRAWING) - CHK_ERRA(D3DOK_NOAUTOGEN) - - // Extended for Windows Vista - CHK_ERRA(D3DERR_DEVICEREMOVED) - CHK_ERRA(S_NOT_RESIDENT) - CHK_ERRA(S_RESIDENT_IN_SHARED_MEMORY) - CHK_ERRA(S_PRESENT_MODE_CHANGED) - CHK_ERRA(S_PRESENT_OCCLUDED) - CHK_ERRA(D3DERR_DEVICEHUNG) - - // Extended for Windows 7 - CHK_ERRA(D3DERR_UNSUPPORTEDOVERLAY) - CHK_ERRA(D3DERR_UNSUPPORTEDOVERLAYFORMAT) - CHK_ERRA(D3DERR_CANNOTPROTECTCONTENT) - CHK_ERRA(D3DERR_UNSUPPORTEDCRYPTO) - CHK_ERRA(D3DERR_PRESENT_STATISTICS_DISJOINT) - -// ------------------------------------------------------------- -// dsound.h error codes -// ------------------------------------------------------------- -// CHK_ERRA(DS_OK) - CHK_ERRA(DS_NO_VIRTUALIZATION) - CHK_ERRA(DSERR_ALLOCATED) - CHK_ERRA(DSERR_CONTROLUNAVAIL) -// CHK_ERRA(DSERR_INVALIDPARAM) - CHK_ERRA(DSERR_INVALIDCALL) -// CHK_ERRA(DSERR_GENERIC) - CHK_ERRA(DSERR_PRIOLEVELNEEDED) -// CHK_ERRA(DSERR_OUTOFMEMORY) - CHK_ERRA(DSERR_BADFORMAT) -// CHK_ERRA(DSERR_UNSUPPORTED) - CHK_ERRA(DSERR_NODRIVER) - CHK_ERRA(DSERR_ALREADYINITIALIZED) -// CHK_ERRA(DSERR_NOAGGREGATION) - CHK_ERRA(DSERR_BUFFERLOST) - CHK_ERRA(DSERR_OTHERAPPHASPRIO) - CHK_ERRA(DSERR_UNINITIALIZED) -// CHK_ERRA(DSERR_NOINTERFACE) -// CHK_ERRA(DSERR_ACCESSDENIED) - CHK_ERRA(DSERR_BUFFERTOOSMALL) - CHK_ERRA(DSERR_DS8_REQUIRED) - CHK_ERRA(DSERR_SENDLOOP) - CHK_ERRA(DSERR_BADSENDBUFFERGUID) - CHK_ERRA(DSERR_OBJECTNOTFOUND) - - CHK_ERRA(DSERR_FXUNAVAILABLE) - -#endif // !WINAPI_FAMILY || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP - -// ------------------------------------------------------------- -// d3d10.h error codes -// ------------------------------------------------------------- - CHK_ERRA(D3D10_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS) - CHK_ERRA(D3D10_ERROR_FILE_NOT_FOUND) - -// ------------------------------------------------------------- -// dxgi.h error codes -// ------------------------------------------------------------- - CHK_ERRA(DXGI_STATUS_OCCLUDED) - CHK_ERRA(DXGI_STATUS_CLIPPED) - CHK_ERRA(DXGI_STATUS_NO_REDIRECTION) - CHK_ERRA(DXGI_STATUS_NO_DESKTOP_ACCESS) - CHK_ERRA(DXGI_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE) - CHK_ERRA(DXGI_STATUS_MODE_CHANGED) - CHK_ERRA(DXGI_STATUS_MODE_CHANGE_IN_PROGRESS) - CHK_ERRA(DXGI_ERROR_INVALID_CALL) - CHK_ERRA(DXGI_ERROR_NOT_FOUND) - CHK_ERRA(DXGI_ERROR_MORE_DATA) - CHK_ERRA(DXGI_ERROR_UNSUPPORTED) - CHK_ERRA(DXGI_ERROR_DEVICE_REMOVED) - CHK_ERRA(DXGI_ERROR_DEVICE_HUNG) - CHK_ERRA(DXGI_ERROR_DEVICE_RESET) - CHK_ERRA(DXGI_ERROR_WAS_STILL_DRAWING) - CHK_ERRA(DXGI_ERROR_FRAME_STATISTICS_DISJOINT) - CHK_ERRA(DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE) - CHK_ERRA(DXGI_ERROR_DRIVER_INTERNAL_ERROR) - CHK_ERRA(DXGI_ERROR_NONEXCLUSIVE) - CHK_ERRA(DXGI_ERROR_NOT_CURRENTLY_AVAILABLE) - CHK_ERRA(DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED) - CHK_ERRA(DXGI_ERROR_REMOTE_OUTOFMEMORY) - -// ------------------------------------------------------------- -// d3d11.h error codes -// ------------------------------------------------------------- - CHK_ERRA(D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS) - CHK_ERRA(D3D11_ERROR_FILE_NOT_FOUND) - CHK_ERRA(D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS) - CHK_ERRA(D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD) - -#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP - -// ------------------------------------------------------------- -// Direct2D error codes -// ------------------------------------------------------------- -// CHK_ERRA(D2DERR_UNSUPPORTED_PIXEL_FORMAT) -// CHK_ERRA(D2DERR_INSUFFICIENT_BUFFER) - CHK_ERRA(D2DERR_WRONG_STATE) - CHK_ERRA(D2DERR_NOT_INITIALIZED) - CHK_ERRA(D2DERR_UNSUPPORTED_OPERATION) - CHK_ERRA(D2DERR_SCANNER_FAILED) - CHK_ERRA(D2DERR_SCREEN_ACCESS_DENIED) - CHK_ERRA(D2DERR_DISPLAY_STATE_INVALID) - CHK_ERRA(D2DERR_ZERO_VECTOR) - CHK_ERRA(D2DERR_INTERNAL_ERROR) - CHK_ERRA(D2DERR_DISPLAY_FORMAT_NOT_SUPPORTED) - CHK_ERRA(D2DERR_INVALID_CALL) - CHK_ERRA(D2DERR_NO_HARDWARE_DEVICE) - CHK_ERRA(D2DERR_RECREATE_TARGET) - CHK_ERRA(D2DERR_TOO_MANY_SHADER_ELEMENTS) - CHK_ERRA(D2DERR_SHADER_COMPILE_FAILED) - CHK_ERRA(D2DERR_MAX_TEXTURE_SIZE_EXCEEDED) - CHK_ERRA(D2DERR_UNSUPPORTED_VERSION) - CHK_ERRA(D2DERR_BAD_NUMBER) - CHK_ERRA(D2DERR_WRONG_FACTORY) - CHK_ERRA(D2DERR_LAYER_ALREADY_IN_USE) - CHK_ERRA(D2DERR_POP_CALL_DID_NOT_MATCH_PUSH) -// CHK_ERRA(D2DERR_WRONG_RESOURCE_DOMAIN) - CHK_ERRA(D2DERR_PUSH_POP_UNBALANCED) - CHK_ERRA(D2DERR_RENDER_TARGET_HAS_LAYER_OR_CLIPRECT) - CHK_ERRA(D2DERR_INCOMPATIBLE_BRUSH_TYPES) - CHK_ERRA(D2DERR_WIN32_ERROR) - CHK_ERRA(D2DERR_TARGET_NOT_GDI_COMPATIBLE) - CHK_ERRA(D2DERR_TEXT_EFFECT_IS_WRONG_TYPE) - CHK_ERRA(D2DERR_TEXT_RENDERER_NOT_RELEASED) -// CHK_ERRA(D2DERR_EXCEEDS_MAX_BITMAP_SIZE) - -// ------------------------------------------------------------- -// DirectWrite error codes -// ------------------------------------------------------------- - CHK_ERRA(DWRITE_E_FILEFORMAT) - CHK_ERRA(DWRITE_E_UNEXPECTED) - CHK_ERRA(DWRITE_E_NOFONT) - CHK_ERRA(DWRITE_E_FILENOTFOUND) - CHK_ERRA(DWRITE_E_FILEACCESS) - CHK_ERRA(DWRITE_E_FONTCOLLECTIONOBSOLETE) - CHK_ERRA(DWRITE_E_ALREADYREGISTERED) - -// ------------------------------------------------------------- -// WIC error codes -// ------------------------------------------------------------- - CHK_ERRA(WINCODEC_ERR_WRONGSTATE) - CHK_ERRA(WINCODEC_ERR_VALUEOUTOFRANGE) - CHK_ERRA(WINCODEC_ERR_UNKNOWNIMAGEFORMAT) - CHK_ERRA(WINCODEC_ERR_UNSUPPORTEDVERSION) - CHK_ERRA(WINCODEC_ERR_NOTINITIALIZED) - CHK_ERRA(WINCODEC_ERR_ALREADYLOCKED) - CHK_ERRA(WINCODEC_ERR_PROPERTYNOTFOUND) - CHK_ERRA(WINCODEC_ERR_PROPERTYNOTSUPPORTED) - CHK_ERRA(WINCODEC_ERR_PROPERTYSIZE) - CHK_ERRA(WINCODEC_ERR_CODECPRESENT) - CHK_ERRA(WINCODEC_ERR_CODECNOTHUMBNAIL) - CHK_ERRA(WINCODEC_ERR_PALETTEUNAVAILABLE) - CHK_ERRA(WINCODEC_ERR_CODECTOOMANYSCANLINES) - CHK_ERRA(WINCODEC_ERR_INTERNALERROR) - CHK_ERRA(WINCODEC_ERR_SOURCERECTDOESNOTMATCHDIMENSIONS) - CHK_ERRA(WINCODEC_ERR_COMPONENTNOTFOUND) - CHK_ERRA(WINCODEC_ERR_IMAGESIZEOUTOFRANGE) - CHK_ERRA(WINCODEC_ERR_TOOMUCHMETADATA) - CHK_ERRA(WINCODEC_ERR_BADIMAGE) - CHK_ERRA(WINCODEC_ERR_BADHEADER) - CHK_ERRA(WINCODEC_ERR_FRAMEMISSING) - CHK_ERRA(WINCODEC_ERR_BADMETADATAHEADER) - CHK_ERRA(WINCODEC_ERR_BADSTREAMDATA) - CHK_ERRA(WINCODEC_ERR_STREAMWRITE) - CHK_ERRA(WINCODEC_ERR_STREAMREAD) - CHK_ERRA(WINCODEC_ERR_STREAMNOTAVAILABLE) - CHK_ERRA(WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT) - CHK_ERRA(WINCODEC_ERR_UNSUPPORTEDOPERATION) - CHK_ERRA(WINCODEC_ERR_INVALIDREGISTRATION) - CHK_ERRA(WINCODEC_ERR_COMPONENTINITIALIZEFAILURE) - CHK_ERRA(WINCODEC_ERR_INSUFFICIENTBUFFER) - CHK_ERRA(WINCODEC_ERR_DUPLICATEMETADATAPRESENT) - CHK_ERRA(WINCODEC_ERR_PROPERTYUNEXPECTEDTYPE) - CHK_ERRA(WINCODEC_ERR_UNEXPECTEDSIZE) - CHK_ERRA(WINCODEC_ERR_INVALIDQUERYREQUEST) - CHK_ERRA(WINCODEC_ERR_UNEXPECTEDMETADATATYPE) - CHK_ERRA(WINCODEC_ERR_REQUESTONLYVALIDATMETADATAROOT) - CHK_ERRA(WINCODEC_ERR_INVALIDQUERYCHARACTER) - CHK_ERRA(WINCODEC_ERR_WIN32ERROR) - CHK_ERRA(WINCODEC_ERR_INVALIDPROGRESSIVELEVEL) - -#endif // !WINAPI_FAMILY || WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP - -// ------------------------------------------------------------- -// DXUT error codes -// ------------------------------------------------------------- - CHK_ERRA(DXUTERR_NODIRECT3D) - CHK_ERRA(DXUTERR_NOCOMPATIBLEDEVICES) - CHK_ERRA(DXUTERR_MEDIANOTFOUND) - CHK_ERRA(DXUTERR_NONZEROREFCOUNT) - CHK_ERRA(DXUTERR_CREATINGDEVICE) - CHK_ERRA(DXUTERR_RESETTINGDEVICE) - CHK_ERRA(DXUTERR_CREATINGDEVICEOBJECTS) - CHK_ERRA(DXUTERR_RESETTINGDEVICEOBJECTS) - CHK_ERRA(DXUTERR_INCORRECTVERSION) - CHK_ERRA(DXUTERR_DEVICEREMOVED) - -// ------------------------------------------------------------- -// xaudio2.h error codes -// ------------------------------------------------------------- - CHK_ERRA(XAUDIO2_E_INVALID_CALL) - CHK_ERRA(XAUDIO2_E_XMA_DECODER_ERROR) - CHK_ERRA(XAUDIO2_E_XAPO_CREATION_FAILED) - CHK_ERRA(XAUDIO2_E_DEVICE_INVALIDATED) - -// ------------------------------------------------------------- -// xapo.h error codes -// ------------------------------------------------------------- - CHK_ERRA(XAPO_E_FORMAT_UNSUPPORTED) - } - - return L"Unknown"; -} - -//-------------------------------------------------------------------------------------- -#undef CHK_ERR -#undef CHK_ERRA -#undef HRESULT_FROM_WIN32b -#undef CHK_ERR_WIN32A -#undef CHK_ERR_WIN32_ONLY - -#define CHK_ERRA(hrchk) \ - case hrchk: \ - wcscpy_s( desc, count, L#hrchk ); \ - break; - -#define CHK_ERR(hrchk, strOut) \ - case hrchk: \ - wcscpy_s( desc, count, L##strOut ); \ - break; - - -//-------------------------------------------------------------------------------------- -void WINAPI DXGetErrorDescriptionW( _In_ HRESULT hr, _Out_cap_(count) WCHAR* desc, _In_ size_t count ) -{ - if ( !count ) - return; - - *desc = 0; - - // First try to see if FormatMessage knows this hr - UINT icount = static_cast( std::min( count, 32767 ) ); - - DWORD result = FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM, nullptr, hr, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), desc, icount, nullptr ); - - if (result > 0) - return; - - switch (hr) - { -// Commmented out codes are actually alises for other codes - -#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) - -// ------------------------------------------------------------- -// ddraw.h error codes -// ------------------------------------------------------------- - CHK_ERR(DDERR_ALREADYINITIALIZED, "This object is already initialized") - CHK_ERR(DDERR_CANNOTATTACHSURFACE, "This surface can not be attached to the requested surface.") - CHK_ERR(DDERR_CANNOTDETACHSURFACE, "This surface can not be detached from the requested surface.") - CHK_ERR(DDERR_CURRENTLYNOTAVAIL, "Support is currently not available.") - CHK_ERR(DDERR_EXCEPTION, "An exception was encountered while performing the requested operation") -// CHK_ERR(DDERR_GENERIC, "DDERR_GENERIC") - CHK_ERR(DDERR_HEIGHTALIGN, "Height of rectangle provided is not a multiple of reqd alignment") - CHK_ERR(DDERR_INCOMPATIBLEPRIMARY, "Unable to match primary surface creation request with existing primary surface.") - CHK_ERR(DDERR_INVALIDCAPS, "One or more of the caps bits passed to the callback are incorrect.") - CHK_ERR(DDERR_INVALIDCLIPLIST, "DirectDraw does not support provided Cliplist.") - CHK_ERR(DDERR_INVALIDMODE, "DirectDraw does not support the requested mode") - CHK_ERR(DDERR_INVALIDOBJECT, "DirectDraw received a pointer that was an invalid DIRECTDRAW object.") -// CHK_ERR(DDERR_INVALIDPARAMS, "DDERR_INVALIDPARAMS") - CHK_ERR(DDERR_INVALIDPIXELFORMAT, "pixel format was invalid as specified") - CHK_ERR(DDERR_INVALIDRECT, "Rectangle provided was invalid.") - CHK_ERR(DDERR_LOCKEDSURFACES, "Operation could not be carried out because one or more surfaces are locked") - CHK_ERR(DDERR_NO3D, "There is no 3D present.") - CHK_ERR(DDERR_NOALPHAHW, "Operation could not be carried out because there is no alpha accleration hardware present or available.") - CHK_ERR(DDERR_NOSTEREOHARDWARE, "Operation could not be carried out because there is no stereo hardware present or available.") - CHK_ERR(DDERR_NOSURFACELEFT, "Operation could not be carried out because there is no hardware present which supports stereo surfaces") - CHK_ERR(DDERR_NOCLIPLIST, "no clip list available") - CHK_ERR(DDERR_NOCOLORCONVHW, "Operation could not be carried out because there is no color conversion hardware present or available.") - CHK_ERR(DDERR_NOCOOPERATIVELEVELSET, "Create function called without DirectDraw object method SetCooperativeLevel being called.") - CHK_ERR(DDERR_NOCOLORKEY, "Surface doesn't currently have a color key") - CHK_ERR(DDERR_NOCOLORKEYHW, "Operation could not be carried out because there is no hardware support of the dest color key.") - CHK_ERR(DDERR_NODIRECTDRAWSUPPORT, "No DirectDraw support possible with current display driver") - CHK_ERR(DDERR_NOEXCLUSIVEMODE, "Operation requires the application to have exclusive mode but the application does not have exclusive mode.") - CHK_ERR(DDERR_NOFLIPHW, "Flipping visible surfaces is not supported.") - CHK_ERR(DDERR_NOGDI, "There is no GDI present.") - CHK_ERR(DDERR_NOMIRRORHW, "Operation could not be carried out because there is no hardware present or available.") - CHK_ERR(DDERR_NOTFOUND, "Requested item was not found") - CHK_ERR(DDERR_NOOVERLAYHW, "Operation could not be carried out because there is no overlay hardware present or available.") - CHK_ERR(DDERR_OVERLAPPINGRECTS, "Operation could not be carried out because the source and destination rectangles are on the same surface and overlap each other.") - CHK_ERR(DDERR_NORASTEROPHW, "Operation could not be carried out because there is no appropriate raster op hardware present or available.") - CHK_ERR(DDERR_NOROTATIONHW, "Operation could not be carried out because there is no rotation hardware present or available.") - CHK_ERR(DDERR_NOSTRETCHHW, "Operation could not be carried out because there is no hardware support for stretching") - CHK_ERR(DDERR_NOT4BITCOLOR, "DirectDrawSurface is not in 4 bit color palette and the requested operation requires 4 bit color palette.") - CHK_ERR(DDERR_NOT4BITCOLORINDEX, "DirectDrawSurface is not in 4 bit color index palette and the requested operation requires 4 bit color index palette.") - CHK_ERR(DDERR_NOT8BITCOLOR, "DirectDraw Surface is not in 8 bit color mode and the requested operation requires 8 bit color.") - CHK_ERR(DDERR_NOTEXTUREHW, "Operation could not be carried out because there is no texture mapping hardware present or available.") - CHK_ERR(DDERR_NOVSYNCHW, "Operation could not be carried out because there is no hardware support for vertical blank synchronized operations.") - CHK_ERR(DDERR_NOZBUFFERHW, "Operation could not be carried out because there is no hardware support for zbuffer blting.") - CHK_ERR(DDERR_NOZOVERLAYHW, "Overlay surfaces could not be z layered based on their BltOrder because the hardware does not support z layering of overlays.") - CHK_ERR(DDERR_OUTOFCAPS, "The hardware needed for the requested operation has already been allocated.") -// CHK_ERR(DDERR_OUTOFMEMORY, "DDERR_OUTOFMEMORY") -// CHK_ERR(DDERR_OUTOFVIDEOMEMORY, "DDERR_OUTOFVIDEOMEMORY") - CHK_ERR(DDERR_OVERLAYCANTCLIP, "hardware does not support clipped overlays") - CHK_ERR(DDERR_OVERLAYCOLORKEYONLYONEACTIVE, "Can only have ony color key active at one time for overlays") - CHK_ERR(DDERR_PALETTEBUSY, "Access to this palette is being refused because the palette is already locked by another thread.") - CHK_ERR(DDERR_COLORKEYNOTSET, "No src color key specified for this operation.") - CHK_ERR(DDERR_SURFACEALREADYATTACHED, "This surface is already attached to the surface it is being attached to.") - CHK_ERR(DDERR_SURFACEALREADYDEPENDENT, "This surface is already a dependency of the surface it is being made a dependency of.") - CHK_ERR(DDERR_SURFACEBUSY, "Access to this surface is being refused because the surface is already locked by another thread.") - CHK_ERR(DDERR_CANTLOCKSURFACE, "Access to this surface is being refused because no driver exists which can supply a pointer to the surface. This is most likely to happen when attempting to lock the primary surface when no DCI provider is present. Will also happen on attempts to lock an optimized surface.") - CHK_ERR(DDERR_SURFACEISOBSCURED, "Access to Surface refused because Surface is obscured.") - CHK_ERR(DDERR_SURFACELOST, "Access to this surface is being refused because the surface is gone. The DIRECTDRAWSURFACE object representing this surface should have Restore called on it.") - CHK_ERR(DDERR_SURFACENOTATTACHED, "The requested surface is not attached.") - CHK_ERR(DDERR_TOOBIGHEIGHT, "Height requested by DirectDraw is too large.") - CHK_ERR(DDERR_TOOBIGSIZE, "Size requested by DirectDraw is too large -- The individual height and width are OK.") - CHK_ERR(DDERR_TOOBIGWIDTH, "Width requested by DirectDraw is too large.") -// CHK_ERR(DDERR_UNSUPPORTED, "DDERR_UNSUPPORTED") - CHK_ERR(DDERR_UNSUPPORTEDFORMAT, "Pixel format requested is unsupported by DirectDraw") - CHK_ERR(DDERR_UNSUPPORTEDMASK, "Bitmask in the pixel format requested is unsupported by DirectDraw") - CHK_ERR(DDERR_INVALIDSTREAM, "The specified stream contains invalid data") - CHK_ERR(DDERR_VERTICALBLANKINPROGRESS, "vertical blank is in progress") - CHK_ERR(DDERR_WASSTILLDRAWING, "Was still drawing") - CHK_ERR(DDERR_DDSCAPSCOMPLEXREQUIRED, "The specified surface type requires specification of the COMPLEX flag") - CHK_ERR(DDERR_XALIGN, "Rectangle provided was not horizontally aligned on reqd. boundary") - CHK_ERR(DDERR_INVALIDDIRECTDRAWGUID, "The GUID passed to DirectDrawCreate is not a valid DirectDraw driver identifier.") - CHK_ERR(DDERR_DIRECTDRAWALREADYCREATED, "A DirectDraw object representing this driver has already been created for this process.") - CHK_ERR(DDERR_NODIRECTDRAWHW, "A hardware only DirectDraw object creation was attempted but the driver did not support any hardware.") - CHK_ERR(DDERR_PRIMARYSURFACEALREADYEXISTS, "this process already has created a primary surface") - CHK_ERR(DDERR_NOEMULATION, "software emulation not available.") - CHK_ERR(DDERR_REGIONTOOSMALL, "region passed to Clipper::GetClipList is too small.") - CHK_ERR(DDERR_CLIPPERISUSINGHWND, "an attempt was made to set a clip list for a clipper objec that is already monitoring an hwnd.") - CHK_ERR(DDERR_NOCLIPPERATTACHED, "No clipper object attached to surface object") - CHK_ERR(DDERR_NOHWND, "Clipper notification requires an HWND or no HWND has previously been set as the CooperativeLevel HWND.") - CHK_ERR(DDERR_HWNDSUBCLASSED, "HWND used by DirectDraw CooperativeLevel has been subclassed, this prevents DirectDraw from restoring state.") - CHK_ERR(DDERR_HWNDALREADYSET, "The CooperativeLevel HWND has already been set. It can not be reset while the process has surfaces or palettes created.") - CHK_ERR(DDERR_NOPALETTEATTACHED, "No palette object attached to this surface.") - CHK_ERR(DDERR_NOPALETTEHW, "No hardware support for 16 or 256 color palettes.") - CHK_ERR(DDERR_BLTFASTCANTCLIP, "If a clipper object is attached to the source surface passed into a BltFast call.") - CHK_ERR(DDERR_NOBLTHW, "No blter.") - CHK_ERR(DDERR_NODDROPSHW, "No DirectDraw ROP hardware.") - CHK_ERR(DDERR_OVERLAYNOTVISIBLE, "returned when GetOverlayPosition is called on a hidden overlay") - CHK_ERR(DDERR_NOOVERLAYDEST, "returned when GetOverlayPosition is called on a overlay that UpdateOverlay has never been called on to establish a destionation.") - CHK_ERR(DDERR_INVALIDPOSITION, "returned when the position of the overlay on the destionation is no longer legal for that destionation.") - CHK_ERR(DDERR_NOTAOVERLAYSURFACE, "returned when an overlay member is called for a non-overlay surface") - CHK_ERR(DDERR_EXCLUSIVEMODEALREADYSET, "An attempt was made to set the cooperative level when it was already set to exclusive.") - CHK_ERR(DDERR_NOTFLIPPABLE, "An attempt has been made to flip a surface that is not flippable.") - CHK_ERR(DDERR_CANTDUPLICATE, "Can't duplicate primary & 3D surfaces, or surfaces that are implicitly created.") - CHK_ERR(DDERR_NOTLOCKED, "Surface was not locked. An attempt to unlock a surface that was not locked at all, or by this process, has been attempted.") - CHK_ERR(DDERR_CANTCREATEDC, "Windows can not create any more DCs, or a DC was requested for a paltte-indexed surface when the surface had no palette AND the display mode was not palette-indexed (in this case DirectDraw cannot select a proper palette into the DC)") - CHK_ERR(DDERR_NODC, "No DC was ever created for this surface.") - CHK_ERR(DDERR_WRONGMODE, "This surface can not be restored because it was created in a different mode.") - CHK_ERR(DDERR_IMPLICITLYCREATED, "This surface can not be restored because it is an implicitly created surface.") - CHK_ERR(DDERR_NOTPALETTIZED, "The surface being used is not a palette-based surface") - CHK_ERR(DDERR_UNSUPPORTEDMODE, "The display is currently in an unsupported mode") - CHK_ERR(DDERR_NOMIPMAPHW, "Operation could not be carried out because there is no mip-map texture mapping hardware present or available.") - CHK_ERR(DDERR_INVALIDSURFACETYPE, "The requested action could not be performed because the surface was of the wrong type.") - CHK_ERR(DDERR_NOOPTIMIZEHW, "Device does not support optimized surfaces, therefore no video memory optimized surfaces") - CHK_ERR(DDERR_NOTLOADED, "Surface is an optimized surface, but has not yet been allocated any memory") - CHK_ERR(DDERR_NOFOCUSWINDOW, "Attempt was made to create or set a device window without first setting the focus window") - CHK_ERR(DDERR_NOTONMIPMAPSUBLEVEL, "Attempt was made to set a palette on a mipmap sublevel") - CHK_ERR(DDERR_DCALREADYCREATED, "A DC has already been returned for this surface. Only one DC can be retrieved per surface.") - CHK_ERR(DDERR_NONONLOCALVIDMEM, "An attempt was made to allocate non-local video memory from a device that does not support non-local video memory.") - CHK_ERR(DDERR_CANTPAGELOCK, "The attempt to page lock a surface failed.") - CHK_ERR(DDERR_CANTPAGEUNLOCK, "The attempt to page unlock a surface failed.") - CHK_ERR(DDERR_NOTPAGELOCKED, "An attempt was made to page unlock a surface with no outstanding page locks.") - CHK_ERR(DDERR_MOREDATA, "There is more data available than the specified buffer size could hold") - CHK_ERR(DDERR_EXPIRED, "The data has expired and is therefore no longer valid.") - CHK_ERR(DDERR_TESTFINISHED, "The mode test has finished executing.") - CHK_ERR(DDERR_NEWMODE, "The mode test has switched to a new mode.") - CHK_ERR(DDERR_D3DNOTINITIALIZED, "D3D has not yet been initialized.") - CHK_ERR(DDERR_VIDEONOTACTIVE, "The video port is not active") - CHK_ERR(DDERR_NOMONITORINFORMATION, "The monitor does not have EDID data.") - CHK_ERR(DDERR_NODRIVERSUPPORT, "The driver does not enumerate display mode refresh rates.") - CHK_ERR(DDERR_DEVICEDOESNTOWNSURFACE, "Surfaces created by one direct draw device cannot be used directly by another direct draw device.") - - -// ------------------------------------------------------------- -// dinput.h error codes -// ------------------------------------------------------------- -// CHK_ERR(DI_OK, "DI_OK") -// CHK_ERR(DI_NOTATTACHED, "DI_NOTATTACHED") -// CHK_ERR(DI_BUFFEROVERFLOW, "DI_BUFFEROVERFLOW") -// CHK_ERR(DI_PROPNOEFFECT, "DI_PROPNOEFFECT") -// CHK_ERR(DI_NOEFFECT, "DI_NOEFFECT") -// CHK_ERR(DI_POLLEDDEVICE, "DI_POLLEDDEVICE") -// CHK_ERR(DI_DOWNLOADSKIPPED, "DI_DOWNLOADSKIPPED") -// CHK_ERR(DI_EFFECTRESTARTED, "DI_EFFECTRESTARTED") -// CHK_ERR(DI_SETTINGSNOTSAVED_ACCESSDENIED, "DI_SETTINGSNOTSAVED_ACCESSDENIED") -// CHK_ERR(DI_SETTINGSNOTSAVED_DISKFULL, "DI_SETTINGSNOTSAVED_DISKFULL") -// CHK_ERR(DI_TRUNCATED, "DI_TRUNCATED") -// CHK_ERR(DI_TRUNCATEDANDRESTARTED, "DI_TRUNCATEDANDRESTARTED") -// CHK_ERR(DI_WRITEPROTECT, "DI_WRITEPROTECT") - CHK_ERR(DIERR_OLDDIRECTINPUTVERSION, "The application requires a newer version of DirectInput.") -// CHK_ERR(DIERR_GENERIC, "DIERR_GENERIC") -// CHK_ERR(DIERR_OLDDIRECTINPUTVERSION, "DIERR_OLDDIRECTINPUTVERSION") - CHK_ERR(DIERR_BETADIRECTINPUTVERSION, "The application was written for an unsupported prerelease version of DirectInput.") - CHK_ERR(DIERR_BADDRIVERVER, "The object could not be created due to an incompatible driver version or mismatched or incomplete driver components.") -// CHK_ERR(DIERR_DEVICENOTREG, "DIERR_DEVICENOTREG") -// CHK_ERR(DIERR_NOTFOUND, "The requested object does not exist.") -// CHK_ERR(DIERR_OBJECTNOTFOUND, "DIERR_OBJECTNOTFOUND") -// CHK_ERR(DIERR_INVALIDPARAM, "DIERR_INVALIDPARAM") -// CHK_ERR(DIERR_NOINTERFACE, "DIERR_NOINTERFACE") -// CHK_ERR(DIERR_GENERIC, "DIERR_GENERIC") -// CHK_ERR(DIERR_OUTOFMEMORY, "DIERR_OUTOFMEMORY") -// CHK_ERR(DIERR_UNSUPPORTED, "DIERR_UNSUPPORTED") - CHK_ERR(DIERR_NOTINITIALIZED, "This object has not been initialized") - CHK_ERR(DIERR_ALREADYINITIALIZED, "This object is already initialized") -// CHK_ERR(DIERR_NOAGGREGATION, "DIERR_NOAGGREGATION") -// CHK_ERR(DIERR_OTHERAPPHASPRIO, "DIERR_OTHERAPPHASPRIO") - CHK_ERR(DIERR_INPUTLOST, "Access to the device has been lost. It must be re-acquired.") - CHK_ERR(DIERR_ACQUIRED, "The operation cannot be performed while the device is acquired.") - CHK_ERR(DIERR_NOTACQUIRED, "The operation cannot be performed unless the device is acquired.") -// CHK_ERR(DIERR_READONLY, "DIERR_READONLY") -// CHK_ERR(DIERR_HANDLEEXISTS, "DIERR_HANDLEEXISTS") - CHK_ERR(DIERR_INSUFFICIENTPRIVS, "Unable to IDirectInputJoyConfig_Acquire because the user does not have sufficient privileges to change the joystick configuration. & An invalid media type was specified") - CHK_ERR(DIERR_DEVICEFULL, "The device is full. & An invalid media subtype was specified.") - CHK_ERR(DIERR_MOREDATA, "Not all the requested information fit into the buffer. & This object can only be created as an aggregated object.") - CHK_ERR(DIERR_NOTDOWNLOADED, "The effect is not downloaded. & The enumerator has become invalid.") - CHK_ERR(DIERR_HASEFFECTS, "The device cannot be reinitialized because there are still effects attached to it. & At least one of the pins involved in the operation is already connected.") - CHK_ERR(DIERR_NOTEXCLUSIVEACQUIRED, "The operation cannot be performed unless the device is acquired in DISCL_EXCLUSIVE mode. & This operation cannot be performed because the filter is active.") - CHK_ERR(DIERR_INCOMPLETEEFFECT, "The effect could not be downloaded because essential information is missing. For example, no axes have been associated with the effect, or no type-specific information has been created. & One of the specified pins supports no media types.") - CHK_ERR(DIERR_NOTBUFFERED, "Attempted to read buffered device data from a device that is not buffered. & There is no common media type between these pins.") - CHK_ERR(DIERR_EFFECTPLAYING, "An attempt was made to modify parameters of an effect while it is playing. Not all hardware devices support altering the parameters of an effect while it is playing. & Two pins of the same direction cannot be connected together.") - CHK_ERR(DIERR_UNPLUGGED, "The operation could not be completed because the device is not plugged in. & The operation cannot be performed because the pins are not connected.") - CHK_ERR(DIERR_REPORTFULL, "SendDeviceData failed because more information was requested to be sent than can be sent to the device. Some devices have restrictions on how much data can be sent to them. (For example, there might be a limit on the number of buttons that can be pressed at once.) & No sample buffer allocator is available.") - CHK_ERR(DIERR_MAPFILEFAIL, "A mapper file function failed because reading or writing the user or IHV settings file failed. & A run-time error occurred.") - -// ------------------------------------------------------------- -// dinputd.h error codes -// ------------------------------------------------------------- - CHK_ERR(DIERR_NOMOREITEMS, "No more items.") - CHK_ERR(DIERR_DRIVERFIRST, "Device driver-specific codes. Unless the specific driver has been precisely identified, no meaning should be attributed to these values other than that the driver originated the error.") - CHK_ERR(DIERR_DRIVERFIRST+1, "DIERR_DRIVERFIRST+1") - CHK_ERR(DIERR_DRIVERFIRST+2, "DIERR_DRIVERFIRST+2") - CHK_ERR(DIERR_DRIVERFIRST+3, "DIERR_DRIVERFIRST+3") - CHK_ERR(DIERR_DRIVERFIRST+4, "DIERR_DRIVERFIRST+4") - CHK_ERR(DIERR_DRIVERFIRST+5, "DIERR_DRIVERFIRST+5") - CHK_ERR(DIERR_DRIVERLAST, "Device installer errors.") - CHK_ERR(DIERR_INVALIDCLASSINSTALLER, "Registry entry or DLL for class installer invalid or class installer not found.") - CHK_ERR(DIERR_CANCELLED, "The user cancelled the install operation. & The stream already has allocated samples and the surface doesn't match the sample format.") - CHK_ERR(DIERR_BADINF, "The INF file for the selected device could not be found or is invalid or is damaged. & The specified purpose ID can't be used for the call.") - -// ------------------------------------------------------------- -// d3d9.h error codes -// ------------------------------------------------------------- -// CHK_ERR(D3D_OK, "Ok") - CHK_ERR(D3DERR_WRONGTEXTUREFORMAT, "Wrong texture format") - CHK_ERR(D3DERR_UNSUPPORTEDCOLOROPERATION, "Unsupported color operation") - CHK_ERR(D3DERR_UNSUPPORTEDCOLORARG, "Unsupported color arg") - CHK_ERR(D3DERR_UNSUPPORTEDALPHAOPERATION, "Unsupported alpha operation") - CHK_ERR(D3DERR_UNSUPPORTEDALPHAARG, "Unsupported alpha arg") - CHK_ERR(D3DERR_TOOMANYOPERATIONS, "Too many operations") - CHK_ERR(D3DERR_CONFLICTINGTEXTUREFILTER, "Conflicting texture filter") - CHK_ERR(D3DERR_UNSUPPORTEDFACTORVALUE, "Unsupported factor value") - CHK_ERR(D3DERR_CONFLICTINGRENDERSTATE, "Conflicting render state") - CHK_ERR(D3DERR_UNSUPPORTEDTEXTUREFILTER, "Unsupported texture filter") - CHK_ERR(D3DERR_CONFLICTINGTEXTUREPALETTE, "Conflicting texture palette") - CHK_ERR(D3DERR_DRIVERINTERNALERROR, "Driver internal error") - CHK_ERR(D3DERR_NOTFOUND, "Not found") - CHK_ERR(D3DERR_MOREDATA, "More data") - CHK_ERR(D3DERR_DEVICELOST, "Device lost") - CHK_ERR(D3DERR_DEVICENOTRESET, "Device not reset") - CHK_ERR(D3DERR_NOTAVAILABLE, "Not available") - CHK_ERR(D3DERR_OUTOFVIDEOMEMORY, "Out of video memory") - CHK_ERR(D3DERR_INVALIDDEVICE, "Invalid device") - CHK_ERR(D3DERR_INVALIDCALL, "Invalid call") - CHK_ERR(D3DERR_DRIVERINVALIDCALL, "Driver invalid call") - //CHK_ERR(D3DERR_WASSTILLDRAWING, "Was Still Drawing") - CHK_ERR(D3DOK_NOAUTOGEN, "The call succeeded but there won't be any mipmaps generated") - - // Extended for Windows Vista - CHK_ERR(D3DERR_DEVICEREMOVED, "Hardware device was removed") - CHK_ERR(S_NOT_RESIDENT, "Resource not resident in memory") - CHK_ERR(S_RESIDENT_IN_SHARED_MEMORY, "Resource resident in shared memory") - CHK_ERR(S_PRESENT_MODE_CHANGED, "Desktop display mode has changed") - CHK_ERR(S_PRESENT_OCCLUDED, "Client window is occluded (minimized or other fullscreen)") - CHK_ERR(D3DERR_DEVICEHUNG, "Hardware adapter reset by OS") - - // Extended for Windows 7 - CHK_ERR(D3DERR_UNSUPPORTEDOVERLAY, "Overlay is not supported" ) - CHK_ERR(D3DERR_UNSUPPORTEDOVERLAYFORMAT, "Overlay format is not supported" ) - CHK_ERR(D3DERR_CANNOTPROTECTCONTENT, "Contect protection not available" ) - CHK_ERR(D3DERR_UNSUPPORTEDCRYPTO, "Unsupported cryptographic system" ) - CHK_ERR(D3DERR_PRESENT_STATISTICS_DISJOINT, "Presentation statistics are disjoint" ) - - -// ------------------------------------------------------------- -// dsound.h error codes -// ------------------------------------------------------------- -// CHK_ERR(DS_OK, "") - CHK_ERR(DS_NO_VIRTUALIZATION, "The call succeeded, but we had to substitute the 3D algorithm") - CHK_ERR(DSERR_ALLOCATED, "The call failed because resources (such as a priority level) were already being used by another caller") - CHK_ERR(DSERR_CONTROLUNAVAIL, "The control (vol, pan, etc.) requested by the caller is not available") -// CHK_ERR(DSERR_INVALIDPARAM, "DSERR_INVALIDPARAM") - CHK_ERR(DSERR_INVALIDCALL, "This call is not valid for the current state of this object") -// CHK_ERR(DSERR_GENERIC, "DSERR_GENERIC") - CHK_ERR(DSERR_PRIOLEVELNEEDED, "The caller does not have the priority level required for the function to succeed") -// CHK_ERR(DSERR_OUTOFMEMORY, "Not enough free memory is available to complete the operation") - CHK_ERR(DSERR_BADFORMAT, "The specified WAVE format is not supported") -// CHK_ERR(DSERR_UNSUPPORTED, "DSERR_UNSUPPORTED") - CHK_ERR(DSERR_NODRIVER, "No sound driver is available for use") - CHK_ERR(DSERR_ALREADYINITIALIZED, "This object is already initialized") -// CHK_ERR(DSERR_NOAGGREGATION, "DSERR_NOAGGREGATION") - CHK_ERR(DSERR_BUFFERLOST, "The buffer memory has been lost, and must be restored") - CHK_ERR(DSERR_OTHERAPPHASPRIO, "Another app has a higher priority level, preventing this call from succeeding") - CHK_ERR(DSERR_UNINITIALIZED, "This object has not been initialized") -// CHK_ERR(DSERR_NOINTERFACE, "DSERR_NOINTERFACE") -// CHK_ERR(DSERR_ACCESSDENIED, "DSERR_ACCESSDENIED") - CHK_ERR(DSERR_BUFFERTOOSMALL, "Tried to create a DSBCAPS_CTRLFX buffer shorter than DSBSIZE_FX_MIN milliseconds") - CHK_ERR(DSERR_DS8_REQUIRED, "Attempt to use DirectSound 8 functionality on an older DirectSound object") - CHK_ERR(DSERR_SENDLOOP, "A circular loop of send effects was detected") - CHK_ERR(DSERR_BADSENDBUFFERGUID, "The GUID specified in an audiopath file does not match a valid MIXIN buffer") - CHK_ERR(DSERR_OBJECTNOTFOUND, "The object requested was not found (numerically equal to DMUS_E_NOT_FOUND)") - - CHK_ERR(DSERR_FXUNAVAILABLE, "Requested effects are not available") - -#endif // !WINAPI_FAMILY || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP - -// ------------------------------------------------------------- -// d3d10.h error codes -// ------------------------------------------------------------- - CHK_ERR(D3D10_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS, "There are too many unique state objects.") - CHK_ERR(D3D10_ERROR_FILE_NOT_FOUND, "File not found") - -// ------------------------------------------------------------- -// dxgi.h error codes -// ------------------------------------------------------------- - CHK_ERR(DXGI_STATUS_OCCLUDED, "The target window or output has been occluded. The application should suspend rendering operations if possible.") - CHK_ERR(DXGI_STATUS_CLIPPED, "Target window is clipped.") - CHK_ERR(DXGI_STATUS_NO_REDIRECTION, "") - CHK_ERR(DXGI_STATUS_NO_DESKTOP_ACCESS, "No access to desktop.") - CHK_ERR(DXGI_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE, "") - CHK_ERR(DXGI_STATUS_MODE_CHANGED, "Display mode has changed") - CHK_ERR(DXGI_STATUS_MODE_CHANGE_IN_PROGRESS, "Display mode is changing") - CHK_ERR(DXGI_ERROR_INVALID_CALL, "The application has made an erroneous API call that it had enough information to avoid. This error is intended to denote that the application should be altered to avoid the error. Use of the debug version of the DXGI.DLL will provide run-time debug output with further information.") - CHK_ERR(DXGI_ERROR_NOT_FOUND, "The item requested was not found. For GetPrivateData calls, this means that the specified GUID had not been previously associated with the object.") - CHK_ERR(DXGI_ERROR_MORE_DATA, "The specified size of the destination buffer is too small to hold the requested data.") - CHK_ERR(DXGI_ERROR_UNSUPPORTED, "Unsupported.") - CHK_ERR(DXGI_ERROR_DEVICE_REMOVED, "Hardware device removed.") - CHK_ERR(DXGI_ERROR_DEVICE_HUNG, "Device hung due to badly formed commands.") - CHK_ERR(DXGI_ERROR_DEVICE_RESET, "Device reset due to a badly formed commant.") - CHK_ERR(DXGI_ERROR_WAS_STILL_DRAWING, "Was still drawing.") - CHK_ERR(DXGI_ERROR_FRAME_STATISTICS_DISJOINT, "The requested functionality is not supported by the device or the driver.") - CHK_ERR(DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE, "The requested functionality is not supported by the device or the driver.") - CHK_ERR(DXGI_ERROR_DRIVER_INTERNAL_ERROR, "An internal driver error occurred.") - CHK_ERR(DXGI_ERROR_NONEXCLUSIVE, "The application attempted to perform an operation on an DXGI output that is only legal after the output has been claimed for exclusive owenership.") - CHK_ERR(DXGI_ERROR_NOT_CURRENTLY_AVAILABLE, "The requested functionality is not supported by the device or the driver.") - CHK_ERR(DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED, "Remote desktop client disconnected.") - CHK_ERR(DXGI_ERROR_REMOTE_OUTOFMEMORY, "Remote desktop client is out of memory.") - -// ------------------------------------------------------------- -// d3d11.h error codes -// ------------------------------------------------------------- - CHK_ERR(D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS, "There are too many unique state objects.") - CHK_ERR(D3D11_ERROR_FILE_NOT_FOUND, "File not found") - CHK_ERR(D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS, "Therea are too many unique view objects.") - CHK_ERR(D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD, "Deferred context requires Map-Discard usage pattern") - -#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP - -// ------------------------------------------------------------- -// Direct2D error codes -// ------------------------------------------------------------- -// CHK_ERR(D2DERR_UNSUPPORTED_PIXEL_FORMAT, "The pixel format is not supported.") -// CHK_ERR(D2DERR_INSUFFICIENT_BUFFER, "The supplied buffer was too small to accomodate the data.") - CHK_ERR(D2DERR_WRONG_STATE, "The object was not in the correct state to process the method.") - CHK_ERR(D2DERR_NOT_INITIALIZED, "The object has not yet been initialized.") - CHK_ERR(D2DERR_UNSUPPORTED_OPERATION, "The requested opertion is not supported.") - CHK_ERR(D2DERR_SCANNER_FAILED, "The geomery scanner failed to process the data.") - CHK_ERR(D2DERR_SCREEN_ACCESS_DENIED, "D2D could not access the screen.") - CHK_ERR(D2DERR_DISPLAY_STATE_INVALID, "A valid display state could not be determined.") - CHK_ERR(D2DERR_ZERO_VECTOR, "The supplied vector is zero.") - CHK_ERR(D2DERR_INTERNAL_ERROR, "An internal error (D2D bug) occurred. On checked builds, we would assert.") - CHK_ERR(D2DERR_DISPLAY_FORMAT_NOT_SUPPORTED, "The display format we need to render is not supported by the hardware device.") - CHK_ERR(D2DERR_INVALID_CALL, "A call to this method is invalid.") - CHK_ERR(D2DERR_NO_HARDWARE_DEVICE, "No HW rendering device is available for this operation.") - CHK_ERR(D2DERR_RECREATE_TARGET, "here has been a presentation error that may be recoverable. The caller needs to recreate, rerender the entire frame, and reattempt present.") - CHK_ERR(D2DERR_TOO_MANY_SHADER_ELEMENTS, "Shader construction failed because it was too complex.") - CHK_ERR(D2DERR_SHADER_COMPILE_FAILED, "Shader compilation failed.") - CHK_ERR(D2DERR_MAX_TEXTURE_SIZE_EXCEEDED, "Requested DX surface size exceeded maximum texture size.") - CHK_ERR(D2DERR_UNSUPPORTED_VERSION, "The requested D2D version is not supported.") - CHK_ERR(D2DERR_BAD_NUMBER, "Invalid number.") - CHK_ERR(D2DERR_WRONG_FACTORY, "Objects used together must be created from the same factory instance.") - CHK_ERR(D2DERR_LAYER_ALREADY_IN_USE, "A layer resource can only be in use once at any point in time.") - CHK_ERR(D2DERR_POP_CALL_DID_NOT_MATCH_PUSH, "The pop call did not match the corresponding push call") -// CHK_ERR(D2DERR_WRONG_RESOURCE_DOMAIN, "The resource was realized on the wrong render target") - CHK_ERR(D2DERR_PUSH_POP_UNBALANCED, "The push and pop calls were unbalanced") - CHK_ERR(D2DERR_RENDER_TARGET_HAS_LAYER_OR_CLIPRECT, "Attempt to copy from a render target while a layer or clip rect is applied") - CHK_ERR(D2DERR_INCOMPATIBLE_BRUSH_TYPES, "The brush types are incompatible for the call.") - CHK_ERR(D2DERR_WIN32_ERROR, "An unknown win32 failure occurred.") - CHK_ERR(D2DERR_TARGET_NOT_GDI_COMPATIBLE, "The render target is not compatible with GDI") - CHK_ERR(D2DERR_TEXT_EFFECT_IS_WRONG_TYPE, "A text client drawing effect object is of the wrong type") - CHK_ERR(D2DERR_TEXT_RENDERER_NOT_RELEASED, "The application is holding a reference to the IDWriteTextRenderer interface after the corresponding DrawText or DrawTextLayout call has returned. The IDWriteTextRenderer instance will be zombied.") -// CHK_ERR(D2DERR_EXCEEDS_MAX_BITMAP_SIZE, "The requested size is larger than the guaranteed supported texture size.") - -// ------------------------------------------------------------- -// DirectWrite error codes -// ------------------------------------------------------------- - CHK_ERR(DWRITE_E_FILEFORMAT, "Indicates an error in an input file such as a font file.") - CHK_ERR(DWRITE_E_UNEXPECTED, "Indicates an error originating in DirectWrite code, which is not expected to occur but is safe to recover from.") - CHK_ERR(DWRITE_E_NOFONT, "Indicates the specified font does not exist.") - CHK_ERR(DWRITE_E_FILENOTFOUND, "A font file could not be opened because the file, directory, network location, drive, or other storage location does not exist or is unavailable.") - CHK_ERR(DWRITE_E_FILEACCESS, "A font file exists but could not be opened due to access denied, sharing violation, or similar error.") - CHK_ERR(DWRITE_E_FONTCOLLECTIONOBSOLETE, "A font collection is obsolete due to changes in the system.") - CHK_ERR(DWRITE_E_ALREADYREGISTERED, "The given interface is already registered.") - -// ------------------------------------------------------------- -// WIC error codes -// ------------------------------------------------------------- - CHK_ERR(WINCODEC_ERR_WRONGSTATE, "WIC object in incorrect state.") - CHK_ERR(WINCODEC_ERR_VALUEOUTOFRANGE, "WIC Value out of range.") - CHK_ERR(WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "Encountered unexpected value or setting in WIC image format.") - CHK_ERR(WINCODEC_ERR_UNSUPPORTEDVERSION, "Unsupported WINCODEC_SD_VERSION passed to WIC factory.") - CHK_ERR(WINCODEC_ERR_NOTINITIALIZED, "WIC component not initialized.") - CHK_ERR(WINCODEC_ERR_ALREADYLOCKED, "WIC bitmap object already locked.") - CHK_ERR(WINCODEC_ERR_PROPERTYNOTFOUND, "WIC property not found.") - CHK_ERR(WINCODEC_ERR_PROPERTYNOTSUPPORTED, "WIC property not supported.") - CHK_ERR(WINCODEC_ERR_PROPERTYSIZE, "Invalid property size") - CHK_ERRA(WINCODEC_ERR_CODECPRESENT) // not currently used by WIC - CHK_ERRA(WINCODEC_ERR_CODECNOTHUMBNAIL) // not currently used by WIC - CHK_ERR(WINCODEC_ERR_PALETTEUNAVAILABLE, "Required palette data not available.") - CHK_ERR(WINCODEC_ERR_CODECTOOMANYSCANLINES, "More scanlines requested than are available in WIC bitmap.") - CHK_ERR(WINCODEC_ERR_INTERNALERROR, "Unexpected internal error in WIC.") - CHK_ERR(WINCODEC_ERR_SOURCERECTDOESNOTMATCHDIMENSIONS, "Source WIC rectangle does not match bitmap dimensions.") - CHK_ERR(WINCODEC_ERR_COMPONENTNOTFOUND, "WIC component not found.") - CHK_ERR(WINCODEC_ERR_IMAGESIZEOUTOFRANGE, "Image size beyond expected boundaries for WIC codec." ) - CHK_ERR(WINCODEC_ERR_TOOMUCHMETADATA, "Image metadata size beyond expected boundaries for WIC codec.") - CHK_ERR(WINCODEC_ERR_BADIMAGE, "WIC image is corrupted.") - CHK_ERR(WINCODEC_ERR_BADHEADER, "Invalid header found in WIC image.") - CHK_ERR(WINCODEC_ERR_FRAMEMISSING, "Expected bitmap frame data not found in WIC image." ) - CHK_ERR(WINCODEC_ERR_BADMETADATAHEADER, "Invalid metadata header found in WIC image.") - CHK_ERR(WINCODEC_ERR_BADSTREAMDATA, "Invalid stream data found in WIC image.") - CHK_ERR(WINCODEC_ERR_STREAMWRITE, "WIC operation on write stream failed.") - CHK_ERR(WINCODEC_ERR_STREAMREAD, "WIC operation on read stream failed.") - CHK_ERR(WINCODEC_ERR_STREAMNOTAVAILABLE, "Required stream is not available." ) - CHK_ERR(WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT, "The pixel format is not supported.") - CHK_ERR(WINCODEC_ERR_UNSUPPORTEDOPERATION, "This operation is not supported by WIC." ) - CHK_ERR(WINCODEC_ERR_INVALIDREGISTRATION, "Error occurred reading WIC codec registry keys.") - CHK_ERR(WINCODEC_ERR_COMPONENTINITIALIZEFAILURE, "Failed initializing WIC codec.") - CHK_ERR(WINCODEC_ERR_INSUFFICIENTBUFFER, "Not enough buffer space available for WIC operation.") - CHK_ERR(WINCODEC_ERR_DUPLICATEMETADATAPRESENT, "Duplicate metadata detected in WIC image.") - CHK_ERR(WINCODEC_ERR_PROPERTYUNEXPECTEDTYPE, "Unexpected property type in WIC image.") - CHK_ERR(WINCODEC_ERR_UNEXPECTEDSIZE, "Unexpected value size in WIC metadata.") - CHK_ERR(WINCODEC_ERR_INVALIDQUERYREQUEST, "Invalid metadata query.") - CHK_ERR(WINCODEC_ERR_UNEXPECTEDMETADATATYPE, "Unexpected metadata type encountered in WIC image.") - CHK_ERR(WINCODEC_ERR_REQUESTONLYVALIDATMETADATAROOT, "Operation only valid on meatadata root.") - CHK_ERR(WINCODEC_ERR_INVALIDQUERYCHARACTER, "Invalid character in WIC metadata query.") - CHK_ERR(WINCODEC_ERR_WIN32ERROR, "General Win32 error encountered during WIC operation.") - CHK_ERR(WINCODEC_ERR_INVALIDPROGRESSIVELEVEL, "Invalid level for progressive WIC image decode.") - -#endif // !WINAPI_FAMILY || WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP - -// ------------------------------------------------------------- -// DXUT error codes -// ------------------------------------------------------------- - CHK_ERR(DXUTERR_NODIRECT3D, "Could not initialize Direct3D.") - CHK_ERR(DXUTERR_NOCOMPATIBLEDEVICES, "No device could be found with the specified device settings.") - CHK_ERR(DXUTERR_MEDIANOTFOUND, "A media file could not be found.") - CHK_ERR(DXUTERR_NONZEROREFCOUNT, "The device interface has a non-zero reference count, meaning that some objects were not released.") - CHK_ERR(DXUTERR_CREATINGDEVICE, "An error occurred when attempting to create a device.") - CHK_ERR(DXUTERR_RESETTINGDEVICE, "An error occurred when attempting to reset a device.") - CHK_ERR(DXUTERR_CREATINGDEVICEOBJECTS, "An error occurred in the device create callback function.") - CHK_ERR(DXUTERR_RESETTINGDEVICEOBJECTS, "An error occurred in the device reset callback function.") - CHK_ERR(DXUTERR_INCORRECTVERSION, "Incorrect version of Direct3D or D3DX.") - CHK_ERR(DXUTERR_DEVICEREMOVED, "The device was removed.") - -// ------------------------------------------------------------- -// xaudio2.h error codes -// ------------------------------------------------------------- - CHK_ERR(XAUDIO2_E_INVALID_CALL, "Invalid XAudio2 API call or arguments") - CHK_ERR(XAUDIO2_E_XMA_DECODER_ERROR, "Hardware XMA decoder error") - CHK_ERR(XAUDIO2_E_XAPO_CREATION_FAILED, "Failed to create an audio effect") - CHK_ERR(XAUDIO2_E_DEVICE_INVALIDATED, "Device invalidated (unplugged, disabled, etc)") - -// ------------------------------------------------------------- -// xapo.h error codes -// ------------------------------------------------------------- - CHK_ERR(XAPO_E_FORMAT_UNSUPPORTED, "Requested audio format unsupported.") - } -} - -//----------------------------------------------------------------------------- -HRESULT WINAPI DXTraceW( _In_z_ const WCHAR* strFile, _In_ DWORD dwLine, _In_ HRESULT hr, - _In_opt_ const WCHAR* strMsg, _In_ bool bPopMsgBox ) -{ - WCHAR strBufferLine[128]; - WCHAR strBufferError[256]; - WCHAR strBuffer[BUFFER_SIZE]; - - swprintf_s( strBufferLine, 128, L"%lu", dwLine ); - if( strFile ) - { - swprintf_s( strBuffer, BUFFER_SIZE, L"%ls(%ls): ", strFile, strBufferLine ); - OutputDebugStringW( strBuffer ); - } - - size_t nMsgLen = (strMsg) ? wcsnlen_s( strMsg, 1024 ) : 0; - if( nMsgLen > 0 ) - { - OutputDebugStringW( strMsg ); - OutputDebugStringW( L" " ); - } - - swprintf_s( strBufferError, 256, L"%ls (0x%0.8x)", DXGetErrorStringW(hr), hr ); - swprintf_s( strBuffer, BUFFER_SIZE, L"hr=%ls", strBufferError ); - OutputDebugStringW( strBuffer ); - - OutputDebugStringW( L"\n" ); - -#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) - if( bPopMsgBox ) - { - WCHAR strBufferFile[MAX_PATH]; - wcscpy_s( strBufferFile, MAX_PATH, L"" ); - if( strFile ) - wcscpy_s( strBufferFile, MAX_PATH, strFile ); - - WCHAR strBufferMsg[1024]; - wcscpy_s( strBufferMsg, 1024, L"" ); - if( nMsgLen > 0 ) - swprintf_s( strBufferMsg, 1024, L"Calling: %ls\n", strMsg ); - - swprintf_s( strBuffer, BUFFER_SIZE, L"File: %ls\nLine: %ls\nError Code: %ls\n%lsDo you want to debug the application?", - strBufferFile, strBufferLine, strBufferError, strBufferMsg ); - - int nResult = MessageBoxW( GetForegroundWindow(), strBuffer, L"Unexpected error encountered", MB_YESNO | MB_ICONERROR ); - if( nResult == IDYES ) - DebugBreak(); - } -#else - UNREFERENCED_PARAMETER(bPopMsgBox); -#endif - - return hr; -} \ No newline at end of file diff -Nru kodi-16.1~git20160425.1001-final/xbmc/win32/dxerr.h kodi-15.2~git20151019.1039-final/xbmc/win32/dxerr.h --- kodi-16.1~git20160425.1001-final/xbmc/win32/dxerr.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/win32/dxerr.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -//-------------------------------------------------------------------------------------- -// File: DXErr.h -// -// DirectX Error Library -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF -// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -// PARTICULAR PURPOSE. -// -// Copyright (c) Microsoft Corporation. All rights reserved. -//-------------------------------------------------------------------------------------- - -// This version only supports UNICODE. - -#pragma once - -#if !defined(NOMINMAX) -#define NOMINMAX -#endif - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -//-------------------------------------------------------------------------------------- -// DXGetErrorString -//-------------------------------------------------------------------------------------- -const WCHAR* WINAPI DXGetErrorStringW( _In_ HRESULT hr ); - -#define DXGetErrorString DXGetErrorStringW - -//-------------------------------------------------------------------------------------- -// DXGetErrorDescription has to be modified to return a copy in a buffer rather than -// the original static string. -//-------------------------------------------------------------------------------------- -void WINAPI DXGetErrorDescriptionW( _In_ HRESULT hr, _Out_cap_(count) WCHAR* desc, _In_ size_t count ); - -#define DXGetErrorDescription DXGetErrorDescriptionW - -//-------------------------------------------------------------------------------------- -// DXTrace -// -// Desc: Outputs a formatted error message to the debug stream -// -// Args: WCHAR* strFile The current file, typically passed in using the -// __FILEW__ macro. -// DWORD dwLine The current line number, typically passed in using the -// __LINE__ macro. -// HRESULT hr An HRESULT that will be traced to the debug stream. -// CHAR* strMsg A string that will be traced to the debug stream (may be NULL) -// BOOL bPopMsgBox If TRUE, then a message box will popup also containing the passed info. -// -// Return: The hr that was passed in. -//-------------------------------------------------------------------------------------- -HRESULT WINAPI DXTraceW( _In_z_ const WCHAR* strFile, _In_ DWORD dwLine, _In_ HRESULT hr, _In_opt_ const WCHAR* strMsg, _In_ bool bPopMsgBox ); - -#define DXTrace DXTraceW - -//-------------------------------------------------------------------------------------- -// -// Helper macros -// -//-------------------------------------------------------------------------------------- -#if defined(DEBUG) || defined(_DEBUG) -#define DXTRACE_MSG(str) DXTrace( __FILEW__, (DWORD)__LINE__, 0, str, false ) -#define DXTRACE_ERR(str,hr) DXTrace( __FILEW__, (DWORD)__LINE__, hr, str, false ) -#define DXTRACE_ERR_MSGBOX(str,hr) DXTrace( __FILEW__, (DWORD)__LINE__, hr, str, true ) -#else -#define DXTRACE_MSG(str) (0L) -#define DXTRACE_ERR(str,hr) (hr) -#define DXTRACE_ERR_MSGBOX(str,hr) (hr) -#endif - -#ifdef __cplusplus -} -#endif //__cplusplus diff -Nru kodi-16.1~git20160425.1001-final/xbmc/win32/pch.h kodi-15.2~git20151019.1039-final/xbmc/win32/pch.h --- kodi-16.1~git20160425.1001-final/xbmc/win32/pch.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/win32/pch.h 2015-10-19 08:39:20.000000000 +0000 @@ -36,12 +36,8 @@ #include "DInput.h" #include "DSound.h" #ifdef HAS_DX -#include "d3d9.h" -#include "d3d11_1.h" -#include "dxgi.h" -#include "d3dcompiler.h" -#include "directxmath.h" -#include "directxcolors.h" +#include "D3D9.h" +#include "D3DX9.h" #else #include #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/win32/WIN32Util.cpp kodi-15.2~git20151019.1039-final/xbmc/win32/WIN32Util.cpp --- kodi-16.1~git20160425.1001-final/xbmc/win32/WIN32Util.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/win32/WIN32Util.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -54,6 +54,7 @@ extern HWND g_hWnd; +using namespace std; using namespace MEDIA_DETECT; CWIN32Util::CWIN32Util(void) @@ -334,7 +335,7 @@ std::vector CWIN32Util::GetDiskUsage() { - std::vector result; + vector result; ULARGE_INTEGER ULTotal= { { 0 } }; ULARGE_INTEGER ULTotalFree= { { 0 } }; @@ -1469,85 +1470,34 @@ } // Adjust the src rectangle so that the dst is always contained in the target rectangle. -void CWIN32Util::CropSource(CRect& src, CRect& dst, CRect target, UINT rotation /* = 0 */) +void CWIN32Util::CropSource(CRect& src, CRect& dst, CRect target) { - float s_width = src.Width(), s_height = src.Height(); - float d_width = dst.Width(), d_height = dst.Height(); - - if (dst.x1 < target.x1) + if(dst.x1 < target.x1) { - switch (rotation) - { - case 90: - src.y1 -= (dst.x1 - target.x1) * s_height / d_width; - break; - case 180: - src.x2 += (dst.x1 - target.x1) * s_width / d_width; - break; - case 270: - src.y2 += (dst.x1 - target.x1) * s_height / d_width; - break; - default: - src.x1 -= (dst.x1 - target.x1) * s_width / d_width; - break; - } + src.x1 -= (dst.x1 - target.x1) + * (src.x2 - src.x1) + / (dst.x2 - dst.x1); dst.x1 = target.x1; } if(dst.y1 < target.y1) { - switch (rotation) - { - case 90: - src.x1 -= (dst.y1 - target.y1) * s_width / d_height; - break; - case 180: - src.y2 += (dst.y1 - target.y1) * s_height / d_height; - break; - case 270: - src.x2 += (dst.y1 - target.y1) * s_width / d_height; - break; - default: - src.y1 -= (dst.y1 - target.y1) * s_height / d_height; - break; - } + src.y1 -= (dst.y1 - target.y1) + * (src.y2 - src.y1) + / (dst.y2 - dst.y1); dst.y1 = target.y1; } if(dst.x2 > target.x2) { - switch (rotation) - { - case 90: - src.y2 -= (dst.x2 - target.x2) * s_height / d_width; - break; - case 180: - src.x1 += (dst.x2 - target.x2) * s_width / d_width; - break; - case 270: - src.y1 += (dst.x2 - target.x2) * s_height / d_width; - break; - default: - src.x2 -= (dst.x2 - target.x2) * s_width / d_width; - break; - } + src.x2 -= (dst.x2 - target.x2) + * (src.x2 - src.x1) + / (dst.x2 - dst.x1); dst.x2 = target.x2; } if(dst.y2 > target.y2) { - switch (rotation) - { - case 90: - src.x2 -= (dst.y2 - target.y2) * s_width / d_height; - break; - case 180: - src.y1 += (dst.y2 - target.y2) * s_height / d_height; - break; - case 270: - src.x1 += (dst.y2 - target.y2) * s_width / d_height; - break; - default: - src.y2 -= (dst.y2 - target.y2) * s_height / d_height; - break; - } + src.y2 -= (dst.y2 - target.y2) + * (src.y2 - src.y1) + / (dst.y2 - dst.y1); dst.y2 = target.y2; } // Callers expect integer coordinates. diff -Nru kodi-16.1~git20160425.1001-final/xbmc/win32/WIN32Util.h kodi-15.2~git20151019.1039-final/xbmc/win32/WIN32Util.h --- kodi-16.1~git20160425.1001-final/xbmc/win32/WIN32Util.h 2016-02-20 09:20:09.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/win32/WIN32Util.h 2015-02-21 04:00:10.000000000 +0000 @@ -89,7 +89,7 @@ static bool UtilRegOpenKeyEx( const HKEY hKeyParent, const char *const pcKey, const REGSAM rsAccessRights, HKEY *hKey, const bool bReadX64= false ); static bool GetFocussedProcess(std::string &strProcessFile); - static void CropSource(CRect& src, CRect& dst, CRect target, UINT rotation = 0); + static void CropSource(CRect& src, CRect& dst, CRect target); static bool IsUsbDevice(const std::wstring &strWdrive); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/win32/WindowHelper.cpp kodi-15.2~git20151019.1039-final/xbmc/win32/WindowHelper.cpp --- kodi-16.1~git20160425.1001-final/xbmc/win32/WindowHelper.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/win32/WindowHelper.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -22,6 +22,8 @@ extern HWND g_hWnd; +using namespace std; + CWHelper g_windowHelper; CWHelper::CWHelper(void) : CThread("WindowHelper") diff -Nru kodi-16.1~git20160425.1001-final/xbmc/win32/WMIInterface.cpp kodi-15.2~git20151019.1039-final/xbmc/win32/WMIInterface.cpp --- kodi-16.1~git20160425.1001-final/xbmc/win32/WMIInterface.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/win32/WMIInterface.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -22,6 +22,10 @@ #include "WMIInterface.h" #include "../Util.h" +using namespace std; + + + CWIN32Wmi::CWIN32Wmi(void) { bconnected = false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/win32/XBMC_PC.cpp kodi-15.2~git20151019.1039-final/xbmc/win32/XBMC_PC.cpp --- kodi-16.1~git20160425.1001-final/xbmc/win32/XBMC_PC.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/win32/XBMC_PC.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "AppParamParser.h" +#include "settings/AdvancedSettings.h" +#include "utils/CharsetConverter.h" +#include "utils/log.h" +#include "utils/SystemInfo.h" +#include "threads/platform/win/Win32Exception.h" +#include "shellapi.h" +#include "Application.h" +#include "XbmcContext.h" +#include "GUIInfoManager.h" +#include "utils/CPUInfo.h" +#include "utils/Environment.h" +#include +#include "win32/IMMNotificationClient.h" + +#ifndef _DEBUG +#define XBMC_TRACK_EXCEPTIONS +#endif + +// Minidump creation function +LONG WINAPI CreateMiniDump( EXCEPTION_POINTERS* pEp ) +{ + win32_exception::write_stacktrace(pEp); + win32_exception::write_minidump(pEp); + return pEp->ExceptionRecord->ExceptionCode;; +} + +//----------------------------------------------------------------------------- +// Name: WinMain() +// Desc: The application's entry point +//----------------------------------------------------------------------------- +INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR commandLine, INT ) +{ + // set up some xbmc specific relationships + XBMC::Context context; + + // this fixes crash if OPENSSL_CONF is set to existed openssl.cfg + // need to set it as soon as possible + CEnvironment::unsetenv("OPENSSL_CONF"); + + //this can't be set from CAdvancedSettings::Initialize() because it will overwrite + //the loglevel set with the --debug flag +#ifdef _DEBUG + g_advancedSettings.m_logLevel = LOG_LEVEL_DEBUG; + g_advancedSettings.m_logLevelHint = LOG_LEVEL_DEBUG; +#else + g_advancedSettings.m_logLevel = LOG_LEVEL_NORMAL; + g_advancedSettings.m_logLevelHint = LOG_LEVEL_NORMAL; +#endif + CLog::SetLogLevel(g_advancedSettings.m_logLevel); + + // Initializes CreateMiniDump to handle exceptions. + win32_exception::set_version(g_infoManager.GetVersion()); + SetUnhandledExceptionFilter( CreateMiniDump ); + + // check if Kodi is already running + std::string appName = CSysInfo::GetAppName(); + CreateMutex(NULL, FALSE, (appName + " Media Center").c_str()); + if(GetLastError() == ERROR_ALREADY_EXISTS) + { + HWND m_hwnd = FindWindow(appName.c_str(), appName.c_str()); + if(m_hwnd != NULL) + { + // switch to the running instance + ShowWindow(m_hwnd,SW_RESTORE); + SetForegroundWindow(m_hwnd); + } + return 0; + } + +#ifndef HAS_DX + if(CWIN32Util::GetDesktopColorDepth() < 32) + { + //FIXME: replace it by a SDL window for all ports + MessageBox(NULL, "Desktop Color Depth isn't 32Bit", (appName + ": Fatal Error").c_str(), MB_OK|MB_ICONERROR); + return 0; + } +#endif + + if((g_cpuInfo.GetCPUFeatures() & CPU_FEATURE_SSE2) == 0) + { + MessageBox(NULL, "No SSE2 support detected", (appName + ": Fatal Error").c_str(), MB_OK|MB_ICONERROR); + return 0; + } + + //Initialize COM + CoInitializeEx(NULL, COINIT_MULTITHREADED); + + // Handle numeric values using the default/POSIX standard + setlocale(LC_NUMERIC, "C"); + + // If the command line passed to WinMain, commandLine, is not "" we need + // to process the command line arguments. + // Note that commandLine does not include the program name and can be + // equal to "" if no arguments were supplied. By contrast GetCommandLineW() + // does include the program name and is never equal to "". + g_advancedSettings.Initialize(); + if (strlen(commandLine) != 0) + { + int argc; + LPWSTR* argvW = CommandLineToArgvW(GetCommandLineW(), &argc); + + std::vector strargvA; + strargvA.resize(argc); + const char** argv = (const char**) LocalAlloc(LMEM_FIXED, argc*sizeof(char*)); + if (!argv) + return 20; + for (int i = 0; i < argc; i++) + { + g_charsetConverter.wToUTF8(argvW[i], strargvA[i]); + argv[i] = strargvA[i].c_str(); + } + + // Parse the arguments + CAppParamParser appParamParser; + appParamParser.Parse(argv, argc); + + // Clean up the storage we've used + LocalFree(argvW); + LocalFree(argv); + } + + // Initialise Winsock + WSADATA wd; + WSAStartup(MAKEWORD(2,2), &wd); + + // use 1 ms timer precision - like SDL initialization used to do + timeBeginPeriod(1); + +#ifdef XBMC_TRACK_EXCEPTIONS + try + { +#endif + // Create and run the app + if(!g_application.Create()) + { + MessageBox(NULL, "ERROR: Unable to create application. Exiting.", (appName + ": Error").c_str(), MB_OK|MB_ICONERROR); + return 1; + } +#ifdef XBMC_TRACK_EXCEPTIONS + } + catch (const XbmcCommons::UncheckedException &e) + { + e.LogThrowMessage("CApplication::Create()"); + MessageBox(NULL, "ERROR: Unable to create application. Exiting.", (appName + ": Error").c_str(), MB_OK|MB_ICONERROR); + return 1; + } + catch (...) + { + CLog::Log(LOGERROR, "exception in CApplication::Create()"); + MessageBox(NULL, "ERROR: Unable to create application. Exiting.", (appName + ": Error").c_str(), MB_OK|MB_ICONERROR); + return 1; + } +#endif + +#ifndef _DEBUG + // we don't want to see the "no disc in drive" windows message box + SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX); +#endif + +#ifdef XBMC_TRACK_EXCEPTIONS + try + { +#endif + if (!g_application.CreateGUI()) + { + MessageBox(NULL, "ERROR: Unable to create GUI. Exiting.", (appName + ": Error").c_str(), MB_OK|MB_ICONERROR); + return 1; + } +#ifdef XBMC_TRACK_EXCEPTIONS + } + catch (const XbmcCommons::UncheckedException &e) + { + e.LogThrowMessage("CApplication::CreateGUI()"); + MessageBox(NULL, "ERROR: Unable to create GUI. Exiting.", (appName + ": Error").c_str(), MB_OK|MB_ICONERROR); + return 1; + } + catch (...) + { + CLog::Log(LOGERROR, "exception in CApplication::CreateGUI()"); + MessageBox(NULL, "ERROR: Unable to create GUI. Exiting.", (appName + ": Error").c_str(), MB_OK|MB_ICONERROR); + return 1; + } +#endif + +#ifdef XBMC_TRACK_EXCEPTIONS + try + { +#endif + if (!g_application.Initialize()) + { + MessageBox(NULL, "ERROR: Unable to Initialize. Exiting.", (appName + ": Error").c_str(), MB_OK|MB_ICONERROR); + return 1; + } +#ifdef XBMC_TRACK_EXCEPTIONS + } + catch (const XbmcCommons::UncheckedException &e) + { + e.LogThrowMessage("CApplication::Initialize()"); + MessageBox(NULL, "ERROR: Unable to Initialize. Exiting.", (appName + ": Error").c_str(), MB_OK|MB_ICONERROR); + return 1; + } + catch (...) + { + CLog::Log(LOGERROR, "exception in CApplication::Initialize()"); + MessageBox(NULL, "ERROR: Unable to Initialize. Exiting.", (appName + ": Error").c_str(), MB_OK|MB_ICONERROR); + return 1; + } +#endif + + IMMDeviceEnumerator *pEnumerator = NULL; + CMMNotificationClient cMMNC; + HRESULT hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void**)&pEnumerator); + if(SUCCEEDED(hr)) + { + pEnumerator->RegisterEndpointNotificationCallback(&cMMNC); + SAFE_RELEASE(pEnumerator); + } + + g_application.Run(); + + // clear previously set timer resolution + timeEndPeriod(1); + + // the end + hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void**)&pEnumerator); + if(SUCCEEDED(hr)) + { + pEnumerator->UnregisterEndpointNotificationCallback(&cMMNC); + SAFE_RELEASE(pEnumerator); + } + WSACleanup(); + CoUninitialize(); + + return 0; +} diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/android/WinEventsAndroid.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/android/WinEventsAndroid.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/android/WinEventsAndroid.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/android/WinEventsAndroid.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -220,7 +220,7 @@ if (fabs(amount) >= ALMOST_ZERO) { - ret |= CInputManager::GetInstance().ProcessJoystickEvent(g_windowManager.GetActiveWindowID(), + ret |= CInputManager::Get().ProcessJoystickEvent(g_windowManager.GetActiveWindowID(), input_device.name, item, input_type, amount, holdTime); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeAmlAndroid.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeAmlAndroid.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeAmlAndroid.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeAmlAndroid.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -76,32 +76,6 @@ switch(res.iScreenWidth) { default: - case 720: - if (!aml_IsHdmiConnected()) - { - if (res.iScreenHeight == 480) - return SetDisplayResolution("480cvbs"); - else - return SetDisplayResolution("576cvbs"); - } - else - { - if (res.iScreenHeight == 480) - { - if (res.dwFlags & D3DPRESENTFLAG_INTERLACED) - return SetDisplayResolution("480i"); - else - return SetDisplayResolution("480p"); - } - else - { - if (res.dwFlags & D3DPRESENTFLAG_INTERLACED) - return SetDisplayResolution("576i"); - else - return SetDisplayResolution("576p"); - } - } - break; case 1280: return SetDisplayResolution("720p"); break; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -64,10 +64,14 @@ void CEGLNativeTypeAmlogic::Initialize() { aml_permissions(); - DisableFreeScale(); + aml_cpufreq_min(true); + aml_cpufreq_max(true); + return; } void CEGLNativeTypeAmlogic::Destroy() { + aml_cpufreq_min(false); + aml_cpufreq_max(false); return; } @@ -84,12 +88,9 @@ if (!nativeWindow) return false; - nativeWindow->width = 1920; - nativeWindow->height = 1080; + nativeWindow->width = 1280; + nativeWindow->height = 720; m_nativeWindow = nativeWindow; - - SetFramebufferResolution(nativeWindow->width, nativeWindow->height); - return true; #else return false; @@ -134,14 +135,6 @@ bool CEGLNativeTypeAmlogic::SetNativeResolution(const RESOLUTION_INFO &res) { -#if defined(_FBDEV_WINDOW_H_) - if (m_nativeWindow) - { - ((fbdev_window *)m_nativeWindow)->width = res.iScreenWidth; - ((fbdev_window *)m_nativeWindow)->height = res.iScreenHeight; - } -#endif - switch((int)(0.5 + res.fRefreshRate)) { default: @@ -227,10 +220,7 @@ std::string mode = resolution; // switch display resolution SysfsUtils::SetString("/sys/class/display/mode", mode.c_str()); - - RESOLUTION_INFO res; - aml_mode_to_resolution(mode.c_str(), &res); - SetFramebufferResolution(res); + SetupVideoScaling(mode.c_str()); return true; } @@ -256,20 +246,50 @@ SysfsUtils::SetInt("/sys/class/graphics/fb0/blank", 0); } -void CEGLNativeTypeAmlogic::DisableFreeScale() +void CEGLNativeTypeAmlogic::EnableFreeScale() { - // turn off frame buffer freescale + // enable OSD free scale using frame buffer size of 720p SysfsUtils::SetInt("/sys/class/graphics/fb0/free_scale", 0); SysfsUtils::SetInt("/sys/class/graphics/fb1/free_scale", 0); + SysfsUtils::SetInt("/sys/class/graphics/fb0/scale_width", 1280); + SysfsUtils::SetInt("/sys/class/graphics/fb0/scale_height", 720); + SysfsUtils::SetInt("/sys/class/graphics/fb1/scale_width", 1280); + SysfsUtils::SetInt("/sys/class/graphics/fb1/scale_height", 720); + + // enable video free scale (scaling to 1920x1080 with frame buffer size 1280x720) + SysfsUtils::SetInt("/sys/class/ppmgr/ppscaler", 0); + SysfsUtils::SetInt("/sys/class/video/disable_video", 1); + SysfsUtils::SetInt("/sys/class/ppmgr/ppscaler", 1); + SysfsUtils::SetString("/sys/class/ppmgr/ppscaler_rect", "0 0 1919 1079 0"); + SysfsUtils::SetString("/sys/class/ppmgr/disp", "1280 720"); + // + SysfsUtils::SetInt("/sys/class/graphics/fb0/scale_width", 1280); + SysfsUtils::SetInt("/sys/class/graphics/fb0/scale_height", 720); + SysfsUtils::SetInt("/sys/class/graphics/fb1/scale_width", 1280); + SysfsUtils::SetInt("/sys/class/graphics/fb1/scale_height", 720); + // + SysfsUtils::SetInt("/sys/class/video/disable_video", 2); + SysfsUtils::SetString("/sys/class/display/axis", "0 0 1279 719 0 0 0 0"); + SysfsUtils::SetString("/sys/class/ppmgr/ppscaler_rect", "0 0 1279 719 1"); + // + SysfsUtils::SetInt("/sys/class/graphics/fb0/free_scale", 1); + SysfsUtils::SetInt("/sys/class/graphics/fb1/free_scale", 1); + SysfsUtils::SetString("/sys/class/graphics/fb0/free_scale_axis", "0 0 1279 719"); } -void CEGLNativeTypeAmlogic::SetFramebufferResolution(const RESOLUTION_INFO &res) const +void CEGLNativeTypeAmlogic::DisableFreeScale() { - SetFramebufferResolution(res.iScreenWidth, res.iScreenHeight); -} + // turn off frame buffer freescale + SysfsUtils::SetInt("/sys/class/graphics/fb0/free_scale", 0); + SysfsUtils::SetInt("/sys/class/graphics/fb1/free_scale", 0); + SysfsUtils::SetString("/sys/class/graphics/fb0/free_scale_axis", "0 0 1279 719"); -void CEGLNativeTypeAmlogic::SetFramebufferResolution(int width, int height) const -{ + SysfsUtils::SetInt("/sys/class/ppmgr/ppscaler", 0); + SysfsUtils::SetInt("/sys/class/video/disable_video", 0); + // now default video display to off + SysfsUtils::SetInt("/sys/class/video/disable_video", 1); + + // revert display axis int fd0; std::string framebuffer = "/dev/" + m_framebuffer_name; @@ -278,13 +298,9 @@ struct fb_var_screeninfo vinfo; if (ioctl(fd0, FBIOGET_VSCREENINFO, &vinfo) == 0) { - vinfo.xres = width; - vinfo.yres = height; - vinfo.xres_virtual = 1920; - vinfo.yres_virtual = 2160; - vinfo.bits_per_pixel = 32; - vinfo.activate = FB_ACTIVATE_ALL; - ioctl(fd0, FBIOPUT_VSCREENINFO, &vinfo); + char daxis_str[256] = {0}; + sprintf(daxis_str, "%d %d %d %d 0 0 0 0", 0, 0, vinfo.xres-1, vinfo.yres-1); + SysfsUtils::SetString("/sys/class/display/axis", daxis_str); } close(fd0); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeAmlogic.h kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeAmlogic.h --- kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeAmlogic.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeAmlogic.h 2015-10-19 08:39:20.000000000 +0000 @@ -50,11 +50,9 @@ protected: bool SetDisplayResolution(const char *resolution); void SetupVideoScaling(const char *mode); + void EnableFreeScale(); void DisableFreeScale(); private: - void SetFramebufferResolution(const RESOLUTION_INFO &res) const; - void SetFramebufferResolution(int width, int height) const; - std::string m_framebuffer_name; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp 2015-07-14 18:01:43.000000000 +0000 @@ -35,6 +35,7 @@ #include "android/jni/System.h" CEGLNativeTypeAndroid::CEGLNativeTypeAndroid() + : m_width(0), m_height(0) { } @@ -66,6 +67,29 @@ void CEGLNativeTypeAndroid::Initialize() { std::string displaySize; + m_width = m_height = 0; + + // FIXME: Temporary shield specific hack to obtain HDMI resolution + // Remove and use New Android M API + if (DeviceCanUseDisplaysize(CJNIBuild::DEVICE)) + displaySize = CJNISystemProperties::get("sys.display-size", ""); + + // Override with xmbc_properties if present + std::string customdisplaySize = CJNISystem::getProperty("xbmc.display-size", ""); + if (!customdisplaySize.empty()) + displaySize = customdisplaySize; + + if (!displaySize.empty()) + { + CLog::Log(LOGDEBUG, "CEGLNativeTypeAndroid: display-size: %s", displaySize.c_str()); + std::vector aSize = StringUtils::Split(displaySize, "x"); + if (aSize.size() == 2) + { + m_width = StringUtils::IsInteger(aSize[0]) ? atoi(aSize[0].c_str()) : 0; + m_height = StringUtils::IsInteger(aSize[1]) ? atoi(aSize[1].c_str()) : 0; + } + } + return; } void CEGLNativeTypeAndroid::Destroy() @@ -97,8 +121,8 @@ { if (!nativeWindow) return false; - *nativeWindow = (XBNativeWindowType*) CXBMCApp::GetNativeWindow(2000); - return (*nativeWindow != NULL && **nativeWindow != NULL); + *nativeWindow = (XBNativeWindowType*) CXBMCApp::GetNativeWindow(30000); + return (*nativeWindow != NULL); } bool CEGLNativeTypeAndroid::DestroyNativeDisplay() @@ -117,9 +141,8 @@ if (window) { float preferredRate = window.getAttributes().getpreferredRefreshRate(); - if (preferredRate > 20.0 && preferredRate < 70.0) + if (preferredRate > 1.0) { - CLog::Log(LOGDEBUG, "CEGLNativeTypeAndroid: Preferred refresh rate: %f", preferredRate); return preferredRate; } CJNIView view(window.getDecorView()); @@ -128,11 +151,7 @@ if (display) { float reportedRate = display.getRefreshRate(); - if (reportedRate > 20.0 && reportedRate < 70.0) - { - CLog::Log(LOGDEBUG, "CEGLNativeTypeAndroid: Current display refresh rate: %f", reportedRate); - return reportedRate; - } + return reportedRate; } } } @@ -146,10 +165,18 @@ if (!nativeWindow) return false; - ANativeWindow_acquire(*nativeWindow); - res->iWidth = ANativeWindow_getWidth(*nativeWindow); - res->iHeight= ANativeWindow_getHeight(*nativeWindow); - ANativeWindow_release(*nativeWindow); + if (!m_width || !m_height) + { + ANativeWindow_acquire(*nativeWindow); + res->iWidth = ANativeWindow_getWidth(*nativeWindow); + res->iHeight= ANativeWindow_getHeight(*nativeWindow); + ANativeWindow_release(*nativeWindow); + } + else + { + res->iWidth = m_width; + res->iHeight = m_height; + } res->fRefreshRate = currentRefreshRate(); res->dwFlags= D3DPRESENTFLAG_PROGRESSIVE; @@ -167,7 +194,9 @@ bool CEGLNativeTypeAndroid::SetNativeResolution(const RESOLUTION_INFO &res) { - CLog::Log(LOGNOTICE, "CEGLNativeTypeAndroid: Switching to resolution: %s", res.strMode.c_str()); + CLog::Log(LOGDEBUG, "CEGLNativeTypeAndroid: SetNativeResolution: %dx%d", m_width, m_height); + if (m_width && m_height) + CXBMCApp::SetBuffersGeometry(m_width, m_height, 0); if (abs(currentRefreshRate() - res.fRefreshRate) > 0.0001) CXBMCApp::SetRefreshRate(res.fRefreshRate); @@ -196,21 +225,19 @@ } } - if (!refreshRates.empty()) + if (refreshRates.size()) { for (unsigned int i = 0; i < refreshRates.size(); i++) { - if (refreshRates[i] < 20.0 || refreshRates[i] > 70.0) - continue; res.fRefreshRate = refreshRates[i]; res.strMode = StringUtils::Format("%dx%d @ %.2f%s - Full Screen", res.iScreenWidth, res.iScreenHeight, res.fRefreshRate, res.dwFlags & D3DPRESENTFLAG_INTERLACED ? "i" : ""); resolutions.push_back(res); } } - if (resolutions.empty()) + else { - /* No valid refresh rates available, just provide the current one */ + /* No refresh rate list available, just provide the current one */ resolutions.push_back(res); } return true; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeAndroid.h kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeAndroid.h --- kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeAndroid.h 2015-11-02 01:00:18.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeAndroid.h 2015-06-14 19:32:51.000000000 +0000 @@ -46,4 +46,8 @@ virtual bool GetPreferredResolution(RESOLUTION_INFO *res) const; virtual bool ShowWindow(bool show); + +protected: + int m_width; + int m_height; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -60,10 +60,7 @@ # define DLOG(fmt, args...) #endif -#if defined(TARGET_RASPBERRY_PI) static void SetResolutionString(RESOLUTION_INFO &res); -static SDTV_ASPECT_T get_sdtv_aspect_from_display_aspect(float display_aspect); -#endif CEGLNativeTypeRaspberryPI::CEGLNativeTypeRaspberryPI() { @@ -190,7 +187,7 @@ for (int i = 0; i < (int)resolutions.size(); i++) { if(resolutions[i].iScreenWidth == res.iScreenWidth && resolutions[i].iScreenHeight == res.iScreenHeight && resolutions[i].fRefreshRate == res.fRefreshRate && - (resolutions[i].dwFlags & D3DPRESENTFLAG_MODEMASK) == (res.dwFlags & D3DPRESENTFLAG_MODEMASK)) + (resolutions[i].dwFlags & (D3DPRESENTFLAG_MODE3DSBS|D3DPRESENTFLAG_MODE3DTB)) == (res.dwFlags & (D3DPRESENTFLAG_MODE3DSBS|D3DPRESENTFLAG_MODE3DTB))) { return i; } @@ -206,7 +203,8 @@ int i = FindMatchingResolution(res, resolutions); if (i>=0) { // don't replace a progressive resolution with an interlaced one of same resolution - resolutions[i] = res; + if (!(res.dwFlags & D3DPRESENTFLAG_INTERLACED)) + resolutions[i] = res; } else { @@ -224,7 +222,7 @@ DestroyDispmaxWindow(); - if(GETFLAGS_GROUP(res.dwFlags) && GETFLAGS_MODE(res.dwFlags)) + if(!m_fixedMode && GETFLAGS_GROUP(res.dwFlags) && GETFLAGS_MODE(res.dwFlags)) { sem_init(&m_tv_synced, 0, 0); m_DllBcmHost->vc_tv_register_callback(CallbackTvServiceCallback, this); @@ -278,33 +276,6 @@ m_desktopRes = res; } - else if(!GETFLAGS_GROUP(res.dwFlags) && GETFLAGS_MODE(res.dwFlags)) - { - sem_init(&m_tv_synced, 0, 0); - m_DllBcmHost->vc_tv_register_callback(CallbackTvServiceCallback, this); - - SDTV_OPTIONS_T options; - options.aspect = get_sdtv_aspect_from_display_aspect((float)res.iScreenWidth / (float)res.iScreenHeight); - - int success = m_DllBcmHost->vc_tv_sdtv_power_on((SDTV_MODE_T)GETFLAGS_MODE(res.dwFlags), &options); - - if (success == 0) - { - CLog::Log(LOGDEBUG, "EGL set SDTV mode (%d,%d)=%d\n", - GETFLAGS_GROUP(res.dwFlags), GETFLAGS_MODE(res.dwFlags), success); - - sem_wait(&m_tv_synced); - } - else - { - CLog::Log(LOGERROR, "EGL failed to set SDTV mode (%d,%d)=%d\n", - GETFLAGS_GROUP(res.dwFlags), GETFLAGS_MODE(res.dwFlags), success); - } - m_DllBcmHost->vc_tv_unregister_callback(CallbackTvServiceCallback); - sem_destroy(&m_tv_synced); - - m_desktopRes = res; - } m_dispman_display = g_RBP.OpenDisplay(0); @@ -441,25 +412,6 @@ res.dwFlags & D3DPRESENTFLAG_MODE3DTB ? " 3DTB" : "", res.dwFlags & D3DPRESENTFLAG_MODE3DSBS ? " 3DSBS" : ""); } - -static SDTV_ASPECT_T get_sdtv_aspect_from_display_aspect(float display_aspect) -{ - SDTV_ASPECT_T aspect; - const float delta = 1e-3; - if(fabs(get_display_aspect_ratio(SDTV_ASPECT_16_9) - display_aspect) < delta) - { - aspect = SDTV_ASPECT_16_9; - } - else if(fabs(get_display_aspect_ratio(SDTV_ASPECT_14_9) - display_aspect) < delta) - { - aspect = SDTV_ASPECT_14_9; - } - else - { - aspect = SDTV_ASPECT_4_3; - } - return aspect; -} #endif bool CEGLNativeTypeRaspberryPI::ProbeResolutions(std::vector &resolutions) @@ -470,6 +422,8 @@ if(!m_DllBcmHost) return false; + m_fixedMode = false; + /* read initial desktop resolution before probe resolutions. * probing will replace the desktop resolution when it finds the same one. * we raplace it because probing will generate more detailed @@ -493,7 +447,7 @@ m_desktopRes.iScreenWidth = tv_state.display.hdmi.width; m_desktopRes.iScreenHeight= tv_state.display.hdmi.height; m_desktopRes.dwFlags = MAKEFLAGS(tv_state.display.hdmi.group, tv_state.display.hdmi.mode, tv_state.display.hdmi.scan_mode); - m_desktopRes.fPixelRatio = tv_state.display.hdmi.display_options.aspect == 0 ? 1.0f : get_display_aspect_ratio((HDMI_ASPECT_T)tv_state.display.hdmi.display_options.aspect) / ((float)m_desktopRes.iScreenWidth / (float)m_desktopRes.iScreenHeight); + m_desktopRes.fPixelRatio = get_display_aspect_ratio((HDMI_ASPECT_T)tv_state.display.hdmi.display_options.aspect) / ((float)m_desktopRes.iScreenWidth / (float)m_desktopRes.iScreenHeight); // Also add 3D flags if (tv_state.display.hdmi.format_3d == HDMI_3D_FORMAT_SBS_HALF) { @@ -510,7 +464,7 @@ vc_tv_hdmi_get_property(&property); m_desktopRes.fRefreshRate = property.param1 == HDMI_PIXEL_CLOCK_TYPE_NTSC ? tv_state.display.hdmi.frame_rate * (1000.0f/1001.0f) : tv_state.display.hdmi.frame_rate; } - else if ((tv_state.state & ( VC_SDTV_NTSC | VC_SDTV_PAL )) != 0) // sdtv + else // sdtv { m_desktopRes.iScreen = 0; m_desktopRes.bFullScreen = true; @@ -518,9 +472,9 @@ m_desktopRes.iHeight = tv_state.display.sdtv.height; m_desktopRes.iScreenWidth = tv_state.display.sdtv.width; m_desktopRes.iScreenHeight= tv_state.display.sdtv.height; - m_desktopRes.dwFlags = MAKEFLAGS(HDMI_RES_GROUP_INVALID, tv_state.display.sdtv.mode, 1); + m_desktopRes.dwFlags = D3DPRESENTFLAG_INTERLACED; m_desktopRes.fRefreshRate = (float)tv_state.display.sdtv.frame_rate; - m_desktopRes.fPixelRatio = tv_state.display.hdmi.display_options.aspect == 0 ? 1.0f : get_display_aspect_ratio((SDTV_ASPECT_T)tv_state.display.sdtv.display_options.aspect) / ((float)m_desktopRes.iScreenWidth / (float)m_desktopRes.iScreenHeight); + m_desktopRes.fPixelRatio = get_display_aspect_ratio((SDTV_ASPECT_T)tv_state.display.sdtv.display_options.aspect) / ((float)m_desktopRes.iScreenWidth / (float)m_desktopRes.iScreenHeight); } SetResolutionString(m_desktopRes); @@ -535,11 +489,15 @@ GetSupportedModes(HDMI_RES_GROUP_CEA, resolutions); GetSupportedModes(HDMI_RES_GROUP_DMT, resolutions); + if(resolutions.size() == 0) { AddUniqueResolution(m_desktopRes, resolutions); CLog::Log(LOGDEBUG, "EGL probe resolution %s:%x\n", m_desktopRes.strMode.c_str(), m_desktopRes.dwFlags); } + if(resolutions.size() < 2) + m_fixedMode = true; + DLOG("CEGLNativeTypeRaspberryPI::ProbeResolutions\n"); return true; #else @@ -626,12 +584,6 @@ res.fPixelRatio = get_display_aspect_ratio((HDMI_ASPECT_T)tv->aspect_ratio) / ((float)res.iScreenWidth / (float)res.iScreenHeight); res.iSubtitles = (int)(0.965 * res.iHeight); - if (!m_desktopRes.dwFlags && prefer_group == group && prefer_mode == tv->code) - m_desktopRes = res; - - if (res.dwFlags & D3DPRESENTFLAG_INTERLACED) - continue; - AddUniqueResolution(res, resolutions); CLog::Log(LOGDEBUG, "EGL mode %d: %s (%.2f) %s%s:%x\n", i, res.strMode.c_str(), res.fPixelRatio, tv->native ? "N" : "", tv->scan_mode ? "I" : "", tv->code); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.h kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.h --- kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.h 2015-10-19 08:39:20.000000000 +0000 @@ -59,6 +59,7 @@ DISPMANX_ELEMENT_HANDLE_T m_dispman_element; TV_GET_STATE_RESP_T m_tv_state; sem_t m_tv_synced; + bool m_fixedMode; RESOLUTION_INFO m_desktopRes; int m_width; int m_height; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/WinSystemEGL.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/WinSystemEGL.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/egl/WinSystemEGL.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/egl/WinSystemEGL.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -334,7 +334,7 @@ bool CWinSystemEGL::ResizeWindow(int newWidth, int newHeight, int newLeft, int newTop) { CRenderSystemGLES::ResetRenderSystem(newWidth, newHeight, true, 0); - int vsync_mode = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOSCREEN_VSYNC); + int vsync_mode = CSettings::Get().GetInt("videoscreen.vsync"); if (vsync_mode != VSYNC_DRIVER) SetVSyncImpl(m_iVSyncMode); return true; @@ -344,7 +344,7 @@ { CreateNewWindow("", fullScreen, res, NULL); CRenderSystemGLES::ResetRenderSystem(res.iWidth, res.iHeight, fullScreen, res.fRefreshRate); - int vsync_mode = CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOSCREEN_VSYNC); + int vsync_mode = CSettings::Get().GetInt("videoscreen.vsync"); if (vsync_mode != VSYNC_DRIVER) SetVSyncImpl(m_iVSyncMode); return true; @@ -387,14 +387,14 @@ { // if this is a new setting, // create a new empty setting to fill in. - if ((int)CDisplaySettings::GetInstance().ResolutionInfoSize() <= res_index) + if ((int)CDisplaySettings::Get().ResolutionInfoSize() <= res_index) { RESOLUTION_INFO res; - CDisplaySettings::GetInstance().AddResolutionInfo(res); + CDisplaySettings::Get().AddResolutionInfo(res); } g_graphicsContext.ResetOverscan(resolutions[i]); - CDisplaySettings::GetInstance().GetResolutionInfo(res_index) = resolutions[i]; + CDisplaySettings::Get().GetResolutionInfo(res_index) = resolutions[i]; CLog::Log(LOGNOTICE, "Found resolution %d x %d for display %d with %d x %d%s @ %f Hz\n", resolutions[i].iWidth, @@ -427,9 +427,9 @@ resDesktop.fRefreshRate, (int)ResDesktop, (int)RES_DESKTOP); - RESOLUTION_INFO desktop = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP); - CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP) = CDisplaySettings::GetInstance().GetResolutionInfo(ResDesktop); - CDisplaySettings::GetInstance().GetResolutionInfo(ResDesktop) = desktop; + RESOLUTION_INFO desktop = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP); + CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP) = CDisplaySettings::Get().GetResolutionInfo(ResDesktop); + CDisplaySettings::Get().GetResolutionInfo(ResDesktop) = desktop; } } @@ -534,18 +534,18 @@ // the logic in this function should match whether CBaseRenderer::FindClosestResolution picks a 3D mode bool CWinSystemEGL::Support3D(int width, int height, uint32_t mode) const { - RESOLUTION_INFO &curr = CDisplaySettings::GetInstance().GetResolutionInfo(g_graphicsContext.GetVideoResolution()); + RESOLUTION_INFO &curr = CDisplaySettings::Get().GetResolutionInfo(g_graphicsContext.GetVideoResolution()); // if we are using automatic hdmi mode switching - if (CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ADJUSTREFRESHRATE) != ADJUST_REFRESHRATE_OFF) + if (CSettings::Get().GetInt("videoplayer.adjustrefreshrate") != ADJUST_REFRESHRATE_OFF) { int searchWidth = curr.iScreenWidth; int searchHeight = curr.iScreenHeight; // only search the custom resolutions - for (unsigned int i = (int)RES_DESKTOP; i < CDisplaySettings::GetInstance().ResolutionInfoSize(); i++) + for (unsigned int i = (int)RES_DESKTOP; i < CDisplaySettings::Get().ResolutionInfoSize(); i++) { - RESOLUTION_INFO res = CDisplaySettings::GetInstance().GetResolutionInfo(i); + RESOLUTION_INFO res = CDisplaySettings::Get().GetResolutionInfo(i); if(res.iScreenWidth == searchWidth && res.iScreenHeight == searchHeight && (res.dwFlags & mode)) return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/osx/WinEventsIOS.mm kodi-15.2~git20151019.1039-final/xbmc/windowing/osx/WinEventsIOS.mm --- kodi-16.1~git20160425.1001-final/xbmc/windowing/osx/WinEventsIOS.mm 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/osx/WinEventsIOS.mm 2015-10-19 08:39:20.000000000 +0000 @@ -59,7 +59,22 @@ pumpEvent = events.front(); events.pop_front(); } - ret = g_application.OnEvent(pumpEvent); + + if (pumpEvent.type == XBMC_USEREVENT) + { + // On ATV2, we push in events as a XBMC_USEREVENT, + // the jbutton.which will be the keyID to translate using joystick.AppleRemote.xml + // jbutton.holdTime is the time the button is hold in ms (for repeated keypresses) + std::string joystickName = "AppleRemote"; + float fAmount = 1.0; + unsigned char wKeyID = pumpEvent.jbutton.which; + unsigned int holdTime = pumpEvent.jbutton.holdTime; + + CLog::Log(LOGDEBUG,"CWinEventsIOS: Button press keyID = %i", wKeyID); + ret |= CInputManager::Get().ProcessJoystickEvent(g_windowManager.GetActiveWindowID(), joystickName, wKeyID, JACTIVE_BUTTON, fAmount, holdTime); + } + else + ret |= g_application.OnEvent(pumpEvent); } return ret; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/osx/WinSystemIOS.mm kodi-15.2~git20151019.1039-final/xbmc/windowing/osx/WinSystemIOS.mm --- kodi-16.1~git20160425.1001-final/xbmc/windowing/osx/WinSystemIOS.mm 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/osx/WinSystemIOS.mm 2015-10-19 08:39:20.000000000 +0000 @@ -45,7 +45,11 @@ #import #import +#if defined(TARGET_DARWIN_IOS_ATV2) +#import "atv2/KodiController.h" +#else #import "ios/XBMCController.h" +#endif #import "osx/IOSScreenManager.h" #include "osx/DarwinUtils.h" #import @@ -146,7 +150,9 @@ m_bFullScreen = fullScreen; CLog::Log(LOGDEBUG, "About to switch to %i x %i on screen %i",m_nWidth, m_nHeight, res.iScreen); +#ifndef TARGET_DARWIN_IOS_ATV2 SwitchToVideoMode(res.iWidth, res.iHeight, res.fRefreshRate, res.iScreen); +#endif//TARGET_DARWIN_IOS_ATV2 CRenderSystemGLES::ResetRenderSystem(res.iWidth, res.iHeight, fullScreen, res.fRefreshRate); return true; @@ -247,9 +253,10 @@ //first screen goes into the current desktop mode if(GetScreenResolution(&w, &h, &fps, 0)) { - UpdateDesktopResolution(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP), 0, w, h, fps); + UpdateDesktopResolution(CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP), 0, w, h, fps); } +#ifndef TARGET_DARWIN_IOS_ATV2 //see resolution.h enum RESOLUTION for how the resolutions //have to appear in the resolution info vector in CDisplaySettings //add the desktop resolutions of the other screens @@ -260,13 +267,14 @@ if(GetScreenResolution(&w, &h, &fps, i)) { UpdateDesktopResolution(res, i, w, h, fps); - CDisplaySettings::GetInstance().AddResolutionInfo(res); + CDisplaySettings::Get().AddResolutionInfo(res); } } //now just fill in the possible reolutions for the attached screens //and push to the resolution info vector FillInVideoModes(); +#endif //TARGET_DARWIN_IOS_ATV2 } void CWinSystemIOS::FillInVideoModes() @@ -305,7 +313,7 @@ //the same resolution twice... - thats why i add a FIXME here. res.strMode = StringUtils::Format("%dx%d @ %.2f", w, h, refreshrate); g_graphicsContext.ResetOverscan(res); - CDisplaySettings::GetInstance().AddResolutionInfo(res); + CDisplaySettings::Get().AddResolutionInfo(res); } } } @@ -443,8 +451,14 @@ bool CWinSystemIOS::HasCursor() { - // apple touch devices - return false; + if( CDarwinUtils::IsAppleTV2() ) + { + return true; + } + else//apple touch devices + { + return false; + } } void CWinSystemIOS::NotifyAppActiveChange(bool bActivated) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/osx/WinSystemOSX.mm kodi-15.2~git20151019.1039-final/xbmc/windowing/osx/WinSystemOSX.mm --- kodi-16.1~git20160425.1001-final/xbmc/windowing/osx/WinSystemOSX.mm 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/osx/WinSystemOSX.mm 2015-10-19 08:39:20.000000000 +0000 @@ -26,7 +26,7 @@ #include "WinSystemOSX.h" #include "WinEventsOSX.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "CompileInfo.h" #include "guilib/DispResource.h" #include "guilib/GUIWindowManager.h" @@ -55,8 +55,6 @@ // turn off deprecated warning spew. #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -using namespace KODI::MESSAGING; - //------------------------------------------------------------------------------------------ // special object-c class for handling the inhibit display NSTimer callback. @interface windowInhibitScreenSaverClass : NSObject @@ -542,7 +540,7 @@ return; NSScreen* pScreen = nil; - unsigned int screenIdx = CDisplaySettings::GetInstance().GetResolutionInfo(res).iScreen; + unsigned int screenIdx = CDisplaySettings::Get().GetResolutionInfo(res).iScreen; if ( screenIdx < [[NSScreen screens] count] ) { @@ -687,12 +685,9 @@ bool CWinSystemOSX::CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res, PHANDLE_EVENT_FUNC userFunction) { - // force initial window creation to be windowed, if fullscreen, it will switch to it below - // fixes the white screen of death if starting fullscreen and switching to windowed. - RESOLUTION_INFO resInfo = CDisplaySettings::GetInstance().GetResolutionInfo(RES_WINDOW); - m_nWidth = resInfo.iWidth; - m_nHeight = resInfo.iHeight; - m_bFullScreen = false; + m_nWidth = res.iWidth; + m_nHeight = res.iHeight; + m_bFullScreen = fullScreen; SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); @@ -716,7 +711,7 @@ // if we are not starting up windowed, then hide the initial SDL window // so we do not see it flash before the fade-out and switch to fullscreen. - if (CDisplaySettings::GetInstance().GetCurrentResolution() != RES_WINDOW) + if (CDisplaySettings::Get().GetCurrentResolution() != RES_WINDOW) ShowHideNSWindow([view window], false); // disassociate view from context @@ -752,7 +747,7 @@ // get screen refreshrate - this is needed // when we startup in windowed mode and don't run through SetFullScreen int dummy; - m_lastDisplayNr = resInfo.iScreen; + m_lastDisplayNr = res.iScreen; GetScreenResolution(&dummy, &dummy, &m_refreshRate, GetCurrentScreen()); return true; @@ -852,7 +847,7 @@ { needtoshowme = false; ShowHideNSWindow([last_view window], needtoshowme); - RESOLUTION_INFO& window = CDisplaySettings::GetInstance().GetResolutionInfo(RES_WINDOW); + RESOLUTION_INFO& window = CDisplaySettings::Get().GetResolutionInfo(RES_WINDOW); CWinSystemOSX::SetFullScreen(false, window, blankOtherDisplays); needtoshowme = true; } @@ -902,7 +897,7 @@ last_window_origin = [[last_view window] frame].origin; last_window_level = [[last_view window] level]; - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN)) + if (CSettings::Get().GetBool("videoscreen.fakefullscreen")) { // This is Cocca Windowed FullScreen Mode // Get the screen rect of our current display @@ -1010,7 +1005,7 @@ if (GetDisplayID(res.iScreen) == kCGDirectMainDisplay || CDarwinUtils::IsMavericks() ) SetMenuBarVisible(true); - if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN)) + if (CSettings::Get().GetBool("videoscreen.fakefullscreen")) { // restore the windowed window level [[last_view window] setLevel:last_window_level]; @@ -1082,15 +1077,15 @@ // first screen goes into the current desktop mode GetScreenResolution(&w, &h, &fps, 0); - UpdateDesktopResolution(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP), 0, w, h, fps); + UpdateDesktopResolution(CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP), 0, w, h, fps); NSString *dispName = screenNameForDisplay(GetDisplayID(0)); if (dispName != nil) { - CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).strOutput = [dispName UTF8String]; + CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).strOutput = [dispName UTF8String]; } - CDisplaySettings::GetInstance().ClearCustomResolutions(); + CDisplaySettings::Get().ClearCustomResolutions(); // see resolution.h enum RESOLUTION for how the resolutions // have to appear in the resolution info vector in CDisplaySettings @@ -1108,7 +1103,7 @@ res.strOutput = [dispName UTF8String]; } - CDisplaySettings::GetInstance().AddResolutionInfo(res); + CDisplaySettings::Get().AddResolutionInfo(res); } if (m_can_display_switch) @@ -1117,7 +1112,7 @@ // and push to the resolution info vector FillInVideoModes(); } - CDisplaySettings::GetInstance().ApplyCalibrations(); + CDisplaySettings::Get().ApplyCalibrations(); } /* @@ -1372,7 +1367,7 @@ } g_graphicsContext.ResetOverscan(res); - CDisplaySettings::GetInstance().AddResolutionInfo(res); + CDisplaySettings::Get().AddResolutionInfo(res); } } } @@ -1387,7 +1382,7 @@ bool CWinSystemOSX::IsObscured(void) { - if (m_bFullScreen && !CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN)) + if (m_bFullScreen && !CSettings::Get().GetBool("videoscreen.fakefullscreen")) return false;// in true fullscreen mode - we can't be obscured by anyone... // check once a second if we are obscured. @@ -1621,7 +1616,10 @@ oldRefreshRate = m_refreshRate; // send a message so that videoresolution (and refreshrate) // is changed - CApplicationMessenger::GetInstance().PostMsg(TMSG_VIDEORESIZE, m_SDLSurface->w, m_SDLSurface->h); + ThreadMessage msg = {TMSG_VIDEORESIZE}; + msg.param1 = m_SDLSurface->w; + msg.param2 = m_SDLSurface->h; + CApplicationMessenger::Get().SendMessage(msg, false); } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinEventsWin32.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinEventsWin32.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinEventsWin32.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinEventsWin32.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -450,7 +450,7 @@ case WM_ACTIVATE: { if( WA_INACTIVE != wParam ) - CInputManager::GetInstance().ReInitializeJoystick(); + CInputManager::Get().ReInitializeJoystick(); bool active = g_application.GetRenderGUI(); if (HIWORD(wParam)) @@ -495,7 +495,7 @@ case SC_MONITORPOWER: if (g_application.m_pPlayer->IsPlaying() || g_application.m_pPlayer->IsPausedPlayback()) return 0; - else if(CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_DISPLAYSOFF) == 0) + else if(CSettings::Get().GetInt("powermanagement.displaysoff") == 0) return 0; break; case SC_SCREENSAVE: @@ -675,7 +675,7 @@ CLog::Log(LOGDEBUG, __FUNCTION__": window resize event"); - if (g_application.GetRenderGUI() && !g_Windowing.IsAlteringWindow() && newEvent.resize.w > 0 && newEvent.resize.h > 0) + if (!g_Windowing.IsAlteringWindow() && newEvent.resize.w > 0 && newEvent.resize.h > 0) m_pEventFunc(newEvent); return(0); @@ -686,7 +686,7 @@ CLog::Log(LOGDEBUG, __FUNCTION__": window move event"); - if (g_application.GetRenderGUI() && !g_Windowing.IsAlteringWindow()) + if (!g_Windowing.IsAlteringWindow()) m_pEventFunc(newEvent); return(0); @@ -756,7 +756,7 @@ if (((_DEV_BROADCAST_HEADER*) lParam)->dbcd_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { g_peripherals.TriggerDeviceScan(PERIPHERAL_BUS_USB); - CInputManager::GetInstance().ReInitializeJoystick(); + CInputManager::Get().ReInitializeJoystick(); } // check if an usb or optical media was inserted or removed if (((_DEV_BROADCAST_HEADER*) lParam)->dbcd_devicetype == DBT_DEVTYP_VOLUME) @@ -846,7 +846,7 @@ // send a message to see if a control wants any int gestures = 0; - if ((gestures = CGenericTouchActionHandler::GetInstance().QuerySupportedGestures((float)point.x, (float)point.y)) != EVENT_RESULT_UNHANDLED) + if ((gestures = CGenericTouchActionHandler::Get().QuerySupportedGestures((float)point.x, (float)point.y)) != EVENT_RESULT_UNHANDLED) { if (gestures & EVENT_RESULT_ZOOM) gc[0].dwWant |= GC_ZOOM; @@ -865,7 +865,7 @@ gc[2].dwWant |= GC_PAN | GC_PAN_WITH_SINGLE_FINGER_VERTICALLY | GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY | GC_PAN_WITH_GUTTER; // create a new touch swipe detector - m_touchSwipeDetector = new CGenericTouchSwipeDetector(&CGenericTouchActionHandler::GetInstance(), 160.0f); + m_touchSwipeDetector = new CGenericTouchSwipeDetector(&CGenericTouchActionHandler::Get(), 160.0f); } gc[0].dwBlock = gc[0].dwWant ^ 0x01; @@ -909,12 +909,12 @@ m_touchPointer.down = m_touchPointer.current; m_originalZoomDistance = 0; - CGenericTouchActionHandler::GetInstance().OnTouchGestureStart((float)point.x, (float)point.y); + CGenericTouchActionHandler::Get().OnTouchGestureStart((float)point.x, (float)point.y); } break; case GID_END: - CGenericTouchActionHandler::GetInstance().OnTouchGestureEnd((float)point.x, (float)point.y, 0.0f, 0.0f, 0.0f, 0.0f); + CGenericTouchActionHandler::Get().OnTouchGestureEnd((float)point.x, (float)point.y, 0.0f, 0.0f, 0.0f, 0.0f); break; case GID_PAN: @@ -926,7 +926,7 @@ float velocityX, velocityY; m_touchPointer.velocity(velocityX, velocityY); - CGenericTouchActionHandler::GetInstance().OnTouchGesturePan(m_touchPointer.current.x, m_touchPointer.current.y, + CGenericTouchActionHandler::Get().OnTouchGesturePan(m_touchPointer.current.x, m_touchPointer.current.y, m_touchPointer.current.x - m_touchPointer.last.x, m_touchPointer.current.y - m_touchPointer.last.y, velocityX, velocityY); @@ -955,7 +955,7 @@ if (gi.dwFlags == GF_BEGIN) break; - CGenericTouchActionHandler::GetInstance().OnRotate((float)point.x, (float)point.y, + CGenericTouchActionHandler::Get().OnRotate((float)point.x, (float)point.y, -(float)ROTATE_ANGLE_DEGREE(gi.ullArguments)); } break; @@ -972,13 +972,13 @@ if (m_originalZoomDistance == 0) break; - CGenericTouchActionHandler::GetInstance().OnZoomPinch((float)point.x, (float)point.y, + CGenericTouchActionHandler::Get().OnZoomPinch((float)point.x, (float)point.y, (float)LODWORD(gi.ullArguments) / (float)m_originalZoomDistance); } break; case GID_TWOFINGERTAP: - CGenericTouchActionHandler::GetInstance().OnTap((float)point.x, (float)point.y, 2); + CGenericTouchActionHandler::Get().OnTap((float)point.x, (float)point.y, 2); break; case GID_PRESSANDTAP: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinSystemWin32.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinSystemWin32.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinSystemWin32.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinSystemWin32.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -27,7 +27,6 @@ #include "settings/Settings.h" #include "utils/log.h" #include "utils/CharsetConverter.h" -#include "utils/SystemInfo.h" #ifdef TARGET_WINDOWS #include @@ -234,7 +233,7 @@ bool CWinSystemWin32::CenterWindow() { - RESOLUTION_INFO DesktopRes = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP); + RESOLUTION_INFO DesktopRes = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP); m_nLeft = (DesktopRes.iWidth / 2) - (m_nWidth / 2); m_nTop = (DesktopRes.iHeight / 2) - (m_nHeight / 2); @@ -269,22 +268,15 @@ void CWinSystemWin32::NotifyAppFocusChange(bool bGaining) { - if (m_bFullScreen && bGaining) - { + if (m_bFullScreen && bGaining) //bump ourselves to top SetWindowPos(m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOREDRAW); - } } bool CWinSystemWin32::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) { - return SetFullScreenEx(fullScreen, res, blankOtherDisplays, false); -} - -bool CWinSystemWin32::SetFullScreenEx(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays, bool forceResChange) -{ m_IsAlteringWindow = true; - CLog::Log(LOGDEBUG, "%s (%s) on screen %d with size %dx%d, refresh %f%s", __FUNCTION__, !fullScreen ? "windowed" : (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN) ? "windowed fullscreen" : "true fullscreen"), res.iScreen, res.iWidth, res.iHeight, res.fRefreshRate, (res.dwFlags & D3DPRESENTFLAG_INTERLACED) ? "i" : ""); + CLog::Log(LOGDEBUG, "%s (%s) on screen %d with size %dx%d, refresh %f%s", __FUNCTION__, !fullScreen ? "windowed" : (CSettings::Get().GetBool("videoscreen.fakefullscreen") ? "windowed fullscreen" : "true fullscreen"), res.iScreen, res.iWidth, res.iHeight, res.fRefreshRate, (res.dwFlags & D3DPRESENTFLAG_INTERLACED) ? "i" : ""); bool forceResize = false; @@ -315,8 +307,8 @@ m_nHeight = res.iHeight; m_bBlankOtherDisplay = blankOtherDisplays; - if (fullScreen && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN)) - ChangeResolution(res, forceResChange); + if (fullScreen && CSettings::Get().GetBool("videoscreen.fakefullscreen")) + ChangeResolution(res); ResizeInternal(forceResize); @@ -332,33 +324,23 @@ int resIdx = RES_DESKTOP; for (int idx = RES_DESKTOP; idx < RES_DESKTOP + GetNumScreens(); idx++) { - if (CDisplaySettings::GetInstance().GetResolutionInfo(idx).iScreen == screen) + if (CDisplaySettings::Get().GetResolutionInfo(idx).iScreen == screen) { resIdx = idx; break; } } - ChangeResolution(CDisplaySettings::GetInstance().GetResolutionInfo(resIdx)); + ChangeResolution(CDisplaySettings::Get().GetResolutionInfo(resIdx)); } -const MONITOR_DETAILS* CWinSystemWin32::GetMonitor(int screen) const +const MONITOR_DETAILS &CWinSystemWin32::GetMonitor(int screen) const { for (unsigned int monitor = 0; monitor < m_MonitorsInfo.size(); monitor++) if (m_MonitorsInfo[monitor].ScreenNumber == screen) - return &m_MonitorsInfo[monitor]; + return m_MonitorsInfo[monitor]; // What to do if monitor is not found? Not sure... use the primary screen as a default value. - if (m_nPrimary >= 0 && static_cast(m_nPrimary) < m_MonitorsInfo.size()) - { - CLog::LogFunction(LOGDEBUG, __FUNCTION__, "no monitor found for screen %i, " - "will use primary screen %i", screen, m_nPrimary); - return &m_MonitorsInfo[m_nPrimary]; - } - else - { - CLog::LogFunction(LOGERROR, __FUNCTION__, "no monitor found for screen %i", screen); - return nullptr; - } + return m_MonitorsInfo[m_nPrimary]; } int CWinSystemWin32::GetCurrentScreen() @@ -373,17 +355,12 @@ RECT CWinSystemWin32::ScreenRect(int screen) { - const MONITOR_DETAILS* details = GetMonitor(screen); - - if (!details) - { - CLog::LogFunction(LOGERROR, __FUNCTION__, "no monitor found for screen %i", screen); - } + const MONITOR_DETAILS &details = GetMonitor(screen); DEVMODEW sDevMode; ZeroMemory(&sDevMode, sizeof(sDevMode)); sDevMode.dmSize = sizeof(sDevMode); - if(!EnumDisplaySettingsW(details->DeviceNameW.c_str(), ENUM_CURRENT_SETTINGS, &sDevMode)) + if(!EnumDisplaySettingsW(details.DeviceNameW.c_str(), ENUM_CURRENT_SETTINGS, &sDevMode)) CLog::Log(LOGERROR, "%s : EnumDisplaySettings failed with %d", __FUNCTION__, GetLastError()); RECT rc; @@ -463,24 +440,20 @@ return true; } -bool CWinSystemWin32::ChangeResolution(RESOLUTION_INFO res, bool forceChange /*= false*/) +bool CWinSystemWin32::ChangeResolution(RESOLUTION_INFO res) { - const MONITOR_DETAILS* details = GetMonitor(res.iScreen); - - if (!details) - return false; + const MONITOR_DETAILS &details = GetMonitor(res.iScreen); DEVMODEW sDevMode; ZeroMemory(&sDevMode, sizeof(sDevMode)); sDevMode.dmSize = sizeof(sDevMode); // If we can't read the current resolution or any detail of the resolution is different than res - if (!EnumDisplaySettingsW(details->DeviceNameW.c_str(), ENUM_CURRENT_SETTINGS, &sDevMode) || + if (!EnumDisplaySettingsW(details.DeviceNameW.c_str(), ENUM_CURRENT_SETTINGS, &sDevMode) || sDevMode.dmPelsWidth != res.iWidth || sDevMode.dmPelsHeight != res.iHeight || sDevMode.dmDisplayFrequency != (int)res.fRefreshRate || ((sDevMode.dmDisplayFlags & DM_INTERLACED) && !(res.dwFlags & D3DPRESENTFLAG_INTERLACED)) || - (!(sDevMode.dmDisplayFlags & DM_INTERLACED) && (res.dwFlags & D3DPRESENTFLAG_INTERLACED)) - || forceChange) + (!(sDevMode.dmDisplayFlags & DM_INTERLACED) && (res.dwFlags & D3DPRESENTFLAG_INTERLACED)) ) { ZeroMemory(&sDevMode, sizeof(sDevMode)); sDevMode.dmSize = sizeof(sDevMode); @@ -491,61 +464,19 @@ sDevMode.dmDisplayFlags = (res.dwFlags & D3DPRESENTFLAG_INTERLACED) ? DM_INTERLACED : 0; sDevMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS; - LONG rc = DISP_CHANGE_SUCCESSFUL; - bool bResChanged = false; - - // Windows 8 refresh rate workaround for 24.0, 48.0 and 60.0 Hz - if (CSysInfo::IsWindowsVersionAtLeast(CSysInfo::WindowsVersionWin8) && (res.fRefreshRate == 24.0 || res.fRefreshRate == 48.0 || res.fRefreshRate == 60.0)) + // CDS_FULLSCREEN is for temporary fullscreen mode and prevents icons and windows from moving + // to fit within the new dimensions of the desktop + LONG rc = ChangeDisplaySettingsExW(details.DeviceNameW.c_str(), &sDevMode, NULL, CDS_FULLSCREEN, NULL); + if (rc != DISP_CHANGE_SUCCESSFUL) { - CLog::Log(LOGDEBUG, "%s : Using Windows 8+ workaround for refresh rate %d Hz", __FUNCTION__, (int)res.fRefreshRate); - - // Get current resolution stored in registry - DEVMODEW sDevModeRegistry; - ZeroMemory(&sDevModeRegistry, sizeof(sDevModeRegistry)); - sDevModeRegistry.dmSize = sizeof(sDevModeRegistry); - if (EnumDisplaySettingsW(details->DeviceNameW.c_str(), ENUM_REGISTRY_SETTINGS, &sDevModeRegistry)) - { - // Set requested mode in registry without actually changing resolution - rc = ChangeDisplaySettingsExW(details->DeviceNameW.c_str(), &sDevMode, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL); - if (rc == DISP_CHANGE_SUCCESSFUL) - { - // Change resolution based on registry setting - rc = ChangeDisplaySettingsExW(details->DeviceNameW.c_str(), NULL, NULL, CDS_FULLSCREEN, NULL); - if (rc == DISP_CHANGE_SUCCESSFUL) - bResChanged = true; - else - CLog::Log(LOGERROR, "%s : ChangeDisplaySettingsEx (W8+ change resolution) failed with %d, using fallback", __FUNCTION__, rc); - - // Restore registry with original values - sDevModeRegistry.dmSize = sizeof(sDevModeRegistry); - sDevModeRegistry.dmDriverExtra = 0; - sDevModeRegistry.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS; - rc = ChangeDisplaySettingsExW(details->DeviceNameW.c_str(), &sDevModeRegistry, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL); - if (rc != DISP_CHANGE_SUCCESSFUL) - CLog::Log(LOGERROR, "%s : ChangeDisplaySettingsEx (W8+ restore registry) failed with %d", __FUNCTION__, rc); - } - else - CLog::Log(LOGERROR, "%s : ChangeDisplaySettingsEx (W8+ set registry) failed with %d, using fallback", __FUNCTION__, rc); - } - else - CLog::Log(LOGERROR, "%s : Unable to retrieve registry settings for Windows 8+ workaround, using fallback", __FUNCTION__); + CLog::Log(LOGERROR, "%s : ChangeDisplaySettingsEx failed with %d", __FUNCTION__, rc); + return false; } - - // Standard resolution change/fallback for Windows 8+ workaround - if (!bResChanged) + else { - // CDS_FULLSCREEN is for temporary fullscreen mode and prevents icons and windows from moving - // to fit within the new dimensions of the desktop - rc = ChangeDisplaySettingsExW(details->DeviceNameW.c_str(), &sDevMode, NULL, CDS_FULLSCREEN, NULL); - if (rc == DISP_CHANGE_SUCCESSFUL) - bResChanged = true; - else - CLog::Log(LOGERROR, "%s : ChangeDisplaySettingsEx failed with %d", __FUNCTION__, rc); + return true; } - - return bResChanged; } - // nothing to do, return success return true; } @@ -576,8 +507,8 @@ refreshRate = (float)m_MonitorsInfo[m_nPrimary].RefreshRate; dwFlags = m_MonitorsInfo[m_nPrimary].Interlaced ? D3DPRESENTFLAG_INTERLACED : 0; - UpdateDesktopResolution(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP), 0, w, h, refreshRate, dwFlags); - CLog::Log(LOGNOTICE, "Primary mode: %s", CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).strMode.c_str()); + UpdateDesktopResolution(CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP), 0, w, h, refreshRate, dwFlags); + CLog::Log(LOGNOTICE, "Primary mode: %s", CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).strMode.c_str()); // Desktop resolution of the other screens if(m_MonitorsInfo.size() >= 2) @@ -599,7 +530,7 @@ RESOLUTION_INFO res; UpdateDesktopResolution(res, xbmcmonitor++, w, h, refreshRate, dwFlags); - CDisplaySettings::GetInstance().AddResolutionInfo(res); + CDisplaySettings::Get().AddResolutionInfo(res); CLog::Log(LOGNOTICE, "Secondary mode: %s", res.strMode.c_str()); } } @@ -635,19 +566,19 @@ void CWinSystemWin32::AddResolution(const RESOLUTION_INFO &res) { - for (unsigned int i = 0; i < CDisplaySettings::GetInstance().ResolutionInfoSize(); i++) + for (unsigned int i = 0; i < CDisplaySettings::Get().ResolutionInfoSize(); i++) { - if (CDisplaySettings::GetInstance().GetResolutionInfo(i).iScreen == res.iScreen && - CDisplaySettings::GetInstance().GetResolutionInfo(i).iWidth == res.iWidth && - CDisplaySettings::GetInstance().GetResolutionInfo(i).iHeight == res.iHeight && - CDisplaySettings::GetInstance().GetResolutionInfo(i).iScreenWidth == res.iScreenWidth && - CDisplaySettings::GetInstance().GetResolutionInfo(i).iScreenHeight== res.iScreenHeight && - CDisplaySettings::GetInstance().GetResolutionInfo(i).fRefreshRate == res.fRefreshRate && - CDisplaySettings::GetInstance().GetResolutionInfo(i).dwFlags == res.dwFlags) + if (CDisplaySettings::Get().GetResolutionInfo(i).iScreen == res.iScreen && + CDisplaySettings::Get().GetResolutionInfo(i).iWidth == res.iWidth && + CDisplaySettings::Get().GetResolutionInfo(i).iHeight == res.iHeight && + CDisplaySettings::Get().GetResolutionInfo(i).iScreenWidth == res.iScreenWidth && + CDisplaySettings::Get().GetResolutionInfo(i).iScreenHeight== res.iScreenHeight && + CDisplaySettings::Get().GetResolutionInfo(i).fRefreshRate == res.fRefreshRate && + CDisplaySettings::Get().GetResolutionInfo(i).dwFlags == res.dwFlags) return; // already have this resolution } - CDisplaySettings::GetInstance().AddResolutionInfo(res); + CDisplaySettings::Get().AddResolutionInfo(res); } bool CWinSystemWin32::UpdateResolutionsInternal() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinSystemWin32DX.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinSystemWin32DX.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinSystemWin32DX.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinSystemWin32DX.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -39,7 +39,7 @@ bool CWinSystemWin32DX::UseWindowedDX(bool fullScreen) { - return (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN) || !fullScreen); + return (CSettings::Get().GetBool("videoscreen.fakefullscreen") || !fullScreen); } bool CWinSystemWin32DX::CreateNewWindow(std::string name, bool fullScreen, RESOLUTION_INFO& res, PHANDLE_EVENT_FUNC userFunction) @@ -52,26 +52,20 @@ CRenderSystemDX::m_interlaced = ((res.dwFlags & D3DPRESENTFLAG_INTERLACED) != 0); CRenderSystemDX::m_useWindowedDX = UseWindowedDX(fullScreen); SetRenderParams(m_nWidth, m_nHeight, fullScreen, res.fRefreshRate); - const MONITOR_DETAILS* monitor = GetMonitor(res.iScreen); - if (!monitor) - return false; - - SetMonitor(monitor->hMonitor); + SetMonitor(GetMonitor(res.iScreen).hMonitor); return true; } void CWinSystemWin32DX::UpdateMonitor() { - const MONITOR_DETAILS* monitor = GetMonitor(m_nScreen); - if (monitor) - SetMonitor(monitor->hMonitor); + SetMonitor(GetMonitor(m_nScreen).hMonitor); } bool CWinSystemWin32DX::ResizeWindow(int newWidth, int newHeight, int newLeft, int newTop) { CWinSystemWin32::ResizeWindow(newWidth, newHeight, newLeft, newTop); - CRenderSystemDX::OnResize(newWidth, newHeight); + CRenderSystemDX::ResetRenderSystem(newWidth, newHeight, false, 0); return true; } @@ -83,53 +77,22 @@ bool CWinSystemWin32DX::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) { - // When going DX fullscreen -> windowed, we must switch DXGI device to windowed mode first to + // When going DX fullscreen -> windowed, we must reset the D3D device first to // get it out of fullscreen mode because it restores a former resolution. // We then change to the mode we want. - // In other cases, set the window/mode then swith DXGI mode. - bool FS2Windowed = !m_useWindowedDX && UseWindowedDX(fullScreen); + // In other cases, set the window/mode then reset the D3D device. - const MONITOR_DETAILS* monitor = GetMonitor(res.iScreen); - if (!monitor) - return false; + bool FS2Windowed = !m_useWindowedDX && UseWindowedDX(fullScreen); - SetMonitor(monitor->hMonitor); + SetMonitor(GetMonitor(res.iScreen).hMonitor); CRenderSystemDX::m_interlaced = ((res.dwFlags & D3DPRESENTFLAG_INTERLACED) != 0); CRenderSystemDX::m_useWindowedDX = UseWindowedDX(fullScreen); - // this needed to prevent resize/move events from DXGI during changing mode - CWinSystemWin32::m_IsAlteringWindow = true; if (FS2Windowed) - CRenderSystemDX::SetFullScreenInternal(); - - if (!m_useWindowedDX) - { - // if the window isn't focused, bring it to front or SetFullScreen will fail - BYTE keyState[256] = { 0 }; - // to unlock SetForegroundWindow we need to imitate Alt pressing - if (GetKeyboardState((LPBYTE)&keyState) && !(keyState[VK_MENU] & 0x80)) - keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); - - BringWindowToTop(m_hWnd); - - if (GetKeyboardState((LPBYTE)&keyState) && !(keyState[VK_MENU] & 0x80)) - keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); - } - - // to disable stereo mode in windowed mode we must recreate swapchain and then change display mode - // so this flags delays call SetFullScreen _after_ resetting render system - bool delaySetFS = CRenderSystemDX::m_bHWStereoEnabled && UseWindowedDX(fullScreen); - if (!delaySetFS) - CWinSystemWin32::SetFullScreen(fullScreen, res, blankOtherDisplays); + CRenderSystemDX::ResetRenderSystem(res.iWidth, res.iHeight, fullScreen, res.fRefreshRate); - // this needed to prevent resize/move events from DXGI during changing mode - CWinSystemWin32::m_IsAlteringWindow = true; + CWinSystemWin32::SetFullScreen(fullScreen, res, blankOtherDisplays); CRenderSystemDX::ResetRenderSystem(res.iWidth, res.iHeight, fullScreen, res.fRefreshRate); - CWinSystemWin32::m_IsAlteringWindow = false; - - if (delaySetFS) - // now resize window and force changing resolution if stereo mode disabled - CWinSystemWin32::SetFullScreenEx(fullScreen, res, blankOtherDisplays, !CRenderSystemDX::m_bHWStereoEnabled); return true; } @@ -159,22 +122,4 @@ return utf8_text; } -void CWinSystemWin32DX::NotifyAppFocusChange(bool bGaining) -{ - CWinSystemWin32::NotifyAppFocusChange(bGaining); - - // if true fullscreen we need switch render system to/from ff manually like dx9 does - if (!UseWindowedDX(m_bFullScreen) && CRenderSystemDX::m_bRenderCreated) - { - CRenderSystemDX::m_useWindowedDX = !bGaining; - CRenderSystemDX::SetFullScreenInternal(); - if (bGaining) - CRenderSystemDX::CreateWindowSizeDependentResources(); - - // minimize window on lost focus - if (!bGaining) - ShowWindow(m_hWnd, SW_FORCEMINIMIZE); - } -} - #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinSystemWin32DX.h kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinSystemWin32DX.h --- kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinSystemWin32DX.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinSystemWin32DX.h 2015-10-19 08:39:20.000000000 +0000 @@ -41,7 +41,6 @@ virtual void OnMove(int x, int y); virtual bool SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays); virtual bool WindowedMode() { return CRenderSystemDX::m_useWindowedDX; } - virtual void NotifyAppFocusChange(bool bGaining); std::string GetClipboardText(void); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinSystemWin32GL.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinSystemWin32GL.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinSystemWin32GL.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinSystemWin32GL.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -83,7 +83,7 @@ CWIN32Util::CheckGLVersion(); - CSettings::GetInstance().SetBool(CSettings::SETTING_VIDEOSCREEN_FAKEFULLSCREEN, true); + CSettings::Get().SetBool("videoscreen.fakefullscreen", true); return true; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinSystemWin32.h kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinSystemWin32.h --- kodi-16.1~git20160425.1001-final/xbmc/windowing/windows/WinSystemWin32.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/windows/WinSystemWin32.h 2015-10-19 08:39:20.000000000 +0000 @@ -135,7 +135,6 @@ virtual bool CreateNewWindow(const std::string& name, bool fullScreen, RESOLUTION_INFO& res, PHANDLE_EVENT_FUNC userFunction); virtual bool ResizeWindow(int newWidth, int newHeight, int newLeft, int newTop); virtual bool SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays); - virtual bool SetFullScreenEx(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays, bool forceResChange); virtual void UpdateResolutions(); virtual bool CenterWindow(); virtual void NotifyAppFocusChange(bool bGaining); @@ -163,12 +162,12 @@ pCloseGestureInfoHandle PtrCloseGestureInfoHandle; protected: - bool ChangeResolution(RESOLUTION_INFO res, bool forceChange = false); + bool ChangeResolution(RESOLUTION_INFO res); virtual bool ResizeInternal(bool forceRefresh = false); virtual bool UpdateResolutionsInternal(); virtual bool CreateBlankWindows(); virtual bool BlankNonActiveMonitors(bool bBlank); - const MONITOR_DETAILS* GetMonitor(int screen) const; + const MONITOR_DETAILS &GetMonitor(int screen) const; void RestoreDesktopResolution(int screen); RECT ScreenRect(int screen); /*! diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEvents.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEvents.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEvents.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEvents.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -64,7 +64,7 @@ CSingleLock lock(g_lock); if (!g_init) { - PERIPHERALS::CPeripherals::GetInstance().RegisterObserver(&g_imp); + PERIPHERALS::CPeripherals::Get().RegisterObserver(&g_imp); g_init = true; } } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEventsLinux.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEventsLinux.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEventsLinux.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEventsLinux.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -79,9 +79,4 @@ return m_devices.Size(); } -void CWinEventsLinux::MessagePush(XBMC_Event *ev) -{ - g_application.OnEvent(*ev); -} - #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEventsLinux.h kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEventsLinux.h --- kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEventsLinux.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEventsLinux.h 2015-10-19 08:39:20.000000000 +0000 @@ -31,7 +31,6 @@ CWinEventsLinux(); bool MessagePump(); size_t GetQueueSize(); - void MessagePush(XBMC_Event *ev); void RefreshDevices(); void Notify(const Observable &obs, const ObservableMessage msg) { diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEventsSDL.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEventsSDL.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEventsSDL.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEventsSDL.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -24,7 +24,7 @@ #include "WinEvents.h" #include "WinEventsSDL.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "GUIUserMessages.h" #include "settings/DisplaySettings.h" #include "guilib/GUIWindowManager.h" @@ -46,8 +46,6 @@ #include "utils/log.h" #endif -using namespace KODI::MESSAGING; - #if defined(TARGET_POSIX) && !defined(TARGET_DARWIN) // The following chunk of code is Linux specific. For keys that have // with keysym.sym set to zero it checks the scan code, and sets the sym @@ -229,7 +227,7 @@ { case SDL_QUIT: if (!g_application.m_bStop) - CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT); + CApplicationMessenger::Get().Quit(); break; #ifdef HAS_SDL_JOYSTICK @@ -240,7 +238,7 @@ case SDL_JOYHATMOTION: case SDL_JOYDEVICEADDED: case SDL_JOYDEVICEREMOVED: - CInputManager::GetInstance().UpdateJoystick(event); + CInputManager::Get().UpdateJoystick(event); ret = true; break; #endif @@ -348,7 +346,7 @@ { if (0 == (SDL_GetAppState() & SDL_APPMOUSEFOCUS)) { - CInputManager::GetInstance().SetMouseActive(false); + CInputManager::Get().SetMouseActive(false); #if defined(TARGET_DARWIN_OSX) // See CApplication::ProcessSlow() for a description as to why we call Cocoa_HideMouse. // this is here to restore the pointer when toggling back to window mode from fullscreen. @@ -377,8 +375,8 @@ if(!g_Windowing.IsFullScreen()) { int RES_SCREEN = g_Windowing.DesktopResolution(g_Windowing.GetCurrentScreen()); - if((event.resize.w == CDisplaySettings::GetInstance().GetResolutionInfo(RES_SCREEN).iWidth) && - (event.resize.h == CDisplaySettings::GetInstance().GetResolutionInfo(RES_SCREEN).iHeight)) + if((event.resize.w == CDisplaySettings::Get().GetResolutionInfo(RES_SCREEN).iWidth) && + (event.resize.h == CDisplaySettings::Get().GetResolutionInfo(RES_SCREEN).iHeight)) break; } XBMC_Event newEvent; @@ -441,7 +439,7 @@ { case SDLK_q: // CMD-q to quit if (!g_application.m_bStop) - CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT); + CApplicationMessenger::Get().Quit(); return true; case SDLK_f: // CMD-f to toggle fullscreen @@ -457,7 +455,7 @@ return true; case SDLK_m: // CMD-m to minimize - CApplicationMessenger::GetInstance().PostMsg(TMSG_MINIMIZE); + CApplicationMessenger::Get().Minimize(); return true; default: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEventsSDL.h kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEventsSDL.h --- kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEventsSDL.h 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEventsSDL.h 2015-10-19 08:39:20.000000000 +0000 @@ -25,9 +25,9 @@ #include "system.h" #ifdef HAS_SDL -#if HAVE_SDL_VERSION == 1 +#if SDL_VERSION == 1 #include -#elif HAVE_SDL_VERSION == 2 +#elif SDL_VERSION == 2 #include #endif diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEventsX11.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEventsX11.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/WinEventsX11.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/WinEventsX11.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -26,7 +26,7 @@ #include "WinEvents.h" #include "WinEventsX11.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include #include #include "X11/WinSystemX11GL.h" @@ -43,8 +43,6 @@ #include "input/SDLJoystick.h" #endif -using namespace KODI::MESSAGING; - CWinEventsX11Imp* CWinEventsX11Imp::WinEvents = 0; static uint32_t SymMappingsX11[][2] = @@ -408,7 +406,7 @@ case ClientMessage: { if ((unsigned int)xevent.xclient.data.l[0] == WinEvents->m_wmDeleteMessage) - if (!g_application.m_bStop) CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT); + if (!g_application.m_bStop) CApplicationMessenger::Get().Quit(); break; } @@ -537,7 +535,7 @@ // lose mouse coverage case LeaveNotify: { - CInputManager::GetInstance().SetMouseActive(false); + CInputManager::Get().SetMouseActive(false); break; } @@ -609,7 +607,7 @@ case SDL_JOYHATMOTION: case SDL_JOYDEVICEADDED: case SDL_JOYDEVICEREMOVED: - CInputManager::GetInstance().UpdateJoystick(event); + CInputManager::Get().UpdateJoystick(event); ret = true; break; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/WinSystem.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/WinSystem.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/WinSystem.cpp 2015-11-02 01:00:17.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/WinSystem.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -28,6 +28,8 @@ #include "guilib/GUIFontTTFGL.h" #endif +using namespace std; + CWinSystemBase::CWinSystemBase() { m_eWindowSystem = WINDOW_SYSTEM_WIN32; // this is the 0 value enum @@ -50,7 +52,7 @@ bool CWinSystemBase::InitWindowSystem() { UpdateResolutions(); - CDisplaySettings::GetInstance().ApplyCalibrations(); + CDisplaySettings::Get().ApplyCalibrations(); return true; } @@ -96,7 +98,7 @@ void CWinSystemBase::UpdateResolutions() { // add the window res - defaults are fine. - RESOLUTION_INFO& window = CDisplaySettings::GetInstance().GetResolutionInfo(RES_WINDOW); + RESOLUTION_INFO& window = CDisplaySettings::Get().GetResolutionInfo(RES_WINDOW); window.bFullScreen = false; if (window.iWidth == 0) window.iWidth = 720; @@ -112,7 +114,7 @@ void CWinSystemBase::SetWindowResolution(int width, int height) { - RESOLUTION_INFO& window = CDisplaySettings::GetInstance().GetResolutionInfo(RES_WINDOW); + RESOLUTION_INFO& window = CDisplaySettings::Get().GetResolutionInfo(RES_WINDOW); window.iWidth = width; window.iHeight = height; window.iScreenWidth = width; @@ -124,15 +126,15 @@ int CWinSystemBase::DesktopResolution(int screen) { for (int idx = 0; idx < GetNumScreens(); idx++) - if (CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP + idx).iScreen == screen) + if (CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP + idx).iScreen == screen) return RES_DESKTOP + idx; // Uh? something's wrong, fallback to default res of main screen return RES_DESKTOP; } -static void AddResolution(std::vector &resolutions, unsigned int addindex, float bestRefreshrate) +static void AddResolution(vector &resolutions, unsigned int addindex, float bestRefreshrate) { - RESOLUTION_INFO resInfo = CDisplaySettings::GetInstance().GetResolutionInfo(addindex); + RESOLUTION_INFO resInfo = CDisplaySettings::Get().GetResolutionInfo(addindex); int width = resInfo.iScreenWidth; int height = resInfo.iScreenHeight; int flags = resInfo.dwFlags & D3DPRESENTFLAG_MODEMASK; @@ -167,13 +169,13 @@ || (i.width == j.width && i.height == j.height && i.flags < j.flags) ); } -std::vector CWinSystemBase::ScreenResolutions(int screen, float refreshrate) +vector CWinSystemBase::ScreenResolutions(int screen, float refreshrate) { - std::vector resolutions; + vector resolutions; - for (unsigned int idx = RES_DESKTOP; idx < CDisplaySettings::GetInstance().ResolutionInfoSize(); idx++) + for (unsigned int idx = RES_DESKTOP; idx < CDisplaySettings::Get().ResolutionInfoSize(); idx++) { - RESOLUTION_INFO info = CDisplaySettings::GetInstance().GetResolutionInfo(idx); + RESOLUTION_INFO info = CDisplaySettings::Get().GetResolutionInfo(idx); if (info.iScreen == screen) AddResolution(resolutions, idx, refreshrate); } @@ -185,9 +187,9 @@ return resolutions; } -static void AddRefreshRate(std::vector &refreshrates, unsigned int addindex) +static void AddRefreshRate(vector &refreshrates, unsigned int addindex) { - float RefreshRate = CDisplaySettings::GetInstance().GetResolutionInfo(addindex).fRefreshRate; + float RefreshRate = CDisplaySettings::Get().GetResolutionInfo(addindex).fRefreshRate; for (unsigned int idx = 0; idx < refreshrates.size(); idx++) if ( refreshrates[idx].RefreshRate == RefreshRate) @@ -202,15 +204,15 @@ return (i.RefreshRate < j.RefreshRate); } -std::vector CWinSystemBase::RefreshRates(int screen, int width, int height, uint32_t dwFlags) +vector CWinSystemBase::RefreshRates(int screen, int width, int height, uint32_t dwFlags) { - std::vector refreshrates; + vector refreshrates; - for (unsigned int idx = RES_DESKTOP; idx < CDisplaySettings::GetInstance().ResolutionInfoSize(); idx++) - if ( CDisplaySettings::GetInstance().GetResolutionInfo(idx).iScreen == screen - && CDisplaySettings::GetInstance().GetResolutionInfo(idx).iScreenWidth == width - && CDisplaySettings::GetInstance().GetResolutionInfo(idx).iScreenHeight == height - && (CDisplaySettings::GetInstance().GetResolutionInfo(idx).dwFlags & D3DPRESENTFLAG_MODEMASK) == (dwFlags & D3DPRESENTFLAG_MODEMASK)) + for (unsigned int idx = RES_DESKTOP; idx < CDisplaySettings::Get().ResolutionInfoSize(); idx++) + if ( CDisplaySettings::Get().GetResolutionInfo(idx).iScreen == screen + && CDisplaySettings::Get().GetResolutionInfo(idx).iScreenWidth == width + && CDisplaySettings::Get().GetResolutionInfo(idx).iScreenHeight == height + && (CDisplaySettings::Get().GetResolutionInfo(idx).dwFlags & D3DPRESENTFLAG_MODEMASK) == (dwFlags & D3DPRESENTFLAG_MODEMASK)) AddRefreshRate(refreshrates, idx); // Can't assume a sort order @@ -219,11 +221,11 @@ return refreshrates; } -REFRESHRATE CWinSystemBase::DefaultRefreshRate(int screen, std::vector rates) +REFRESHRATE CWinSystemBase::DefaultRefreshRate(int screen, vector rates) { REFRESHRATE bestmatch = rates[0]; float bestfitness = -1.0f; - float targetfps = CDisplaySettings::GetInstance().GetResolutionInfo(DesktopResolution(screen)).fRefreshRate; + float targetfps = CDisplaySettings::Get().GetResolutionInfo(DesktopResolution(screen)).fRefreshRate; for (unsigned i = 0; i < rates.size(); i++) { @@ -243,7 +245,7 @@ bool CWinSystemBase::UseLimitedColor() { #if defined(HAS_GL) || defined(HAS_DX) - static CSettingBool* setting = (CSettingBool*)CSettings::GetInstance().GetSetting(CSettings::SETTING_VIDEOSCREEN_LIMITEDRANGE); + static CSettingBool* setting = (CSettingBool*)CSettings::Get().GetSetting("videoscreen.limitedrange"); return setting->GetValue(); #else return false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/X11/WinSystemX11.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/X11/WinSystemX11.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/X11/WinSystemX11.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/X11/WinSystemX11.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -32,7 +32,6 @@ #include "utils/log.h" #include "XRandR.h" #include -#include #include "threads/SingleLock.h" #include "cores/VideoRenderers/RenderManager.h" #include "utils/TimeUtils.h" @@ -46,6 +45,8 @@ #include "../WinEventsX11.h" #include "input/InputManager.h" +using namespace std; + #define EGL_NO_CONFIG (EGLConfig)0 CWinSystemX11::CWinSystemX11() : CWinSystemBase() @@ -94,11 +95,11 @@ { XOutput out; XMode mode; - out.name = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).strOutput; - mode.w = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).iWidth; - mode.h = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).iHeight; - mode.hz = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).fRefreshRate; - mode.id = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).strId; + out.name = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).strOutput; + mode.w = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).iWidth; + mode.h = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).iHeight; + mode.hz = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).fRefreshRate; + mode.id = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).strId; g_xrandr.SetMode(out, mode); } @@ -188,7 +189,7 @@ bool CWinSystemX11::ResizeWindow(int newWidth, int newHeight, int newLeft, int newTop) { - m_userOutput = CSettings::GetInstance().GetString(CSettings::SETTING_VIDEOSCREEN_MONITOR); + m_userOutput = CSettings::Get().GetString("videoscreen.monitor"); XOutput *out = NULL; if (m_userOutput.compare("Default") != 0) { @@ -247,11 +248,11 @@ } else { - out.name = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).strOutput; - mode.w = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).iWidth; - mode.h = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).iHeight; - mode.hz = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).fRefreshRate; - mode.id = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).strId; + out.name = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).strOutput; + mode.w = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).iWidth; + mode.h = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).iHeight; + mode.hz = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).fRefreshRate; + mode.id = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).strId; } XMode currmode = g_xrandr.GetCurrentMode(out.name); @@ -320,8 +321,8 @@ int numScreens = XScreenCount(m_dpy); g_xrandr.SetNumScreens(numScreens); - bool switchOnOff = CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_BLANKDISPLAYS); - m_userOutput = CSettings::GetInstance().GetString(CSettings::SETTING_VIDEOSCREEN_MONITOR); + bool switchOnOff = CSettings::Get().GetBool("videoscreen.blankdisplays"); + m_userOutput = CSettings::Get().GetString("videoscreen.monitor"); if (m_userOutput.compare("Default") == 0) switchOnOff = false; @@ -366,11 +367,11 @@ mode = g_xrandr.GetPreferredMode(m_userOutput); m_bIsRotated = out->isRotated; if (!m_bIsRotated) - UpdateDesktopResolution(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP), 0, mode.w, mode.h, mode.hz); + UpdateDesktopResolution(CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP), 0, mode.w, mode.h, mode.hz); else - UpdateDesktopResolution(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP), 0, mode.h, mode.w, mode.hz); - CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).strId = mode.id; - CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).strOutput = m_userOutput; + UpdateDesktopResolution(CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP), 0, mode.h, mode.w, mode.hz); + CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).strId = mode.id; + CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).strOutput = m_userOutput; } else { @@ -378,18 +379,18 @@ m_nScreen = DefaultScreen(m_dpy); int w = DisplayWidth(m_dpy, m_nScreen); int h = DisplayHeight(m_dpy, m_nScreen); - UpdateDesktopResolution(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP), 0, w, h, 0.0); + UpdateDesktopResolution(CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP), 0, w, h, 0.0); } // erase previous stored modes - CDisplaySettings::GetInstance().ClearCustomResolutions(); + CDisplaySettings::Get().ClearCustomResolutions(); CLog::Log(LOGINFO, "Available videomodes (xrandr):"); XOutput *out = g_xrandr.GetOutput(m_userOutput); if (out != NULL) { - std::vector::iterator modeiter; + vector::iterator modeiter; CLog::Log(LOGINFO, "Output '%s' has %" PRIdS" modes", out->name.c_str(), out->modes.size()); for (modeiter = out->modes.begin() ; modeiter!=out->modes.end() ; modeiter++) @@ -399,14 +400,10 @@ mode.id.c_str(), mode.name.c_str(), mode.hz, mode.w, mode.h); RESOLUTION_INFO res; res.iScreen = 0; // not used by X11 - res.dwFlags = 0; res.iWidth = mode.w; res.iHeight = mode.h; res.iScreenWidth = mode.w; res.iScreenHeight = mode.h; - if (mode.IsInterlaced()) - res.dwFlags |= D3DPRESENTFLAG_INTERLACED; - if (!m_bIsRotated) { res.iWidth = mode.w; @@ -431,11 +428,16 @@ res.fRefreshRate = mode.hz; res.bFullScreen = true; + if (mode.h > 0 && ((float)mode.w / (float)mode.h >= 1.59)) + res.dwFlags = D3DPRESENTFLAG_WIDESCREEN; + else + res.dwFlags = 0; + g_graphicsContext.ResetOverscan(res); - CDisplaySettings::GetInstance().AddResolutionInfo(res); + CDisplaySettings::Get().AddResolutionInfo(res); } } - CDisplaySettings::GetInstance().ApplyCalibrations(); + CDisplaySettings::Get().ApplyCalibrations(); } bool CWinSystemX11::HasCalibration(const RESOLUTION_INFO &resInfo) @@ -474,7 +476,7 @@ void CWinSystemX11::GetConnectedOutputs(std::vector *outputs) { - std::vector outs; + vector outs; g_xrandr.Query(true); outs = g_xrandr.GetModes(); outputs->push_back("Default"); @@ -709,12 +711,9 @@ return false; } - if(m_eglConfig == EGL_NO_CONFIG) - { - m_eglConfig = getEGLConfig(m_eglDisplay, vInfo); - } + EGLConfig eglConfig = getEGLConfig(m_eglDisplay, vInfo); - if (m_eglConfig == EGL_NO_CONFIG) + if (eglConfig == EGL_NO_CONFIG) { CLog::Log(LOGERROR, "failed to get eglconfig for visual id\n"); return false; @@ -722,7 +721,7 @@ if (m_eglSurface == EGL_NO_SURFACE) { - m_eglSurface = eglCreateWindowSurface(m_eglDisplay, m_eglConfig, m_glWindow, NULL); + m_eglSurface = eglCreateWindowSurface(m_eglDisplay, eglConfig, m_glWindow, NULL); if (m_eglSurface == EGL_NO_SURFACE) { CLog::Log(LOGERROR, "failed to create EGL window surface %d\n", eglGetError()); @@ -735,7 +734,7 @@ EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; - m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, contextAttributes); + m_eglContext = eglCreateContext(m_eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttributes); if (m_eglContext == EGL_NO_CONTEXT) { CLog::Log(LOGERROR, "failed to create EGL context\n"); @@ -907,10 +906,10 @@ RESOLUTION_INFO res; unsigned int i; bool found(false); - for (i = RES_DESKTOP; i < CDisplaySettings::GetInstance().ResolutionInfoSize(); ++i) + for (i = RES_DESKTOP; i < CDisplaySettings::Get().ResolutionInfoSize(); ++i) { - res = CDisplaySettings::GetInstance().GetResolutionInfo(i); - if (StringUtils::EqualsNoCase(CDisplaySettings::GetInstance().GetResolutionInfo(i).strId, mode.id)) + res = CDisplaySettings::Get().GetResolutionInfo(i); + if (StringUtils::EqualsNoCase(CDisplaySettings::Get().GetResolutionInfo(i).strId, mode.id)) { found = true; break; @@ -937,7 +936,7 @@ g_renderManager.Flush(); { CSingleLock lock(m_resourceSection); - for (std::vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) + for (vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) (*i)->OnLostDevice(); } @@ -953,7 +952,7 @@ void CWinSystemX11::Unregister(IDispResource* resource) { CSingleLock lock(m_resourceSection); - std::vector::iterator i = find(m_resources.begin(), m_resources.end(), resource); + vector::iterator i = find(m_resources.begin(), m_resources.end(), resource); if (i != m_resources.end()) m_resources.erase(i); } @@ -982,7 +981,7 @@ if (!m_mainWindow) { - CInputManager::GetInstance().SetMouseActive(false); + CInputManager::Get().SetMouseActive(false); } if (m_mainWindow && ((m_bFullScreen != fullscreen) || m_currentOutput.compare(output) != 0 || m_windowDirty)) @@ -1012,7 +1011,7 @@ } } - CInputManager::GetInstance().SetMouseActive(false); + CInputManager::Get().SetMouseActive(false); OnLostDevice(); DestroyWindow(); m_windowDirty = true; @@ -1090,10 +1089,9 @@ if (!eglChooseConfig(m_eglDisplay, att, &eglConfig, 1, &numConfigs) || numConfigs == 0) { CLog::Log(LOGERROR, "Failed to choose a config %d\n", eglGetError()); } - m_eglConfig=eglConfig; EGLint eglVisualid; - if (!eglGetConfigAttrib(m_eglDisplay, m_eglConfig, EGL_NATIVE_VISUAL_ID, &eglVisualid)) + if (!eglGetConfigAttrib(m_eglDisplay, eglConfig, EGL_NATIVE_VISUAL_ID, &eglVisualid)) { CLog::Log(LOGERROR, "Failed to query native visual id\n"); } @@ -1149,19 +1147,8 @@ XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_NET_WM_STATE", True), XA_ATOM, 32, PropModeReplace, (unsigned char *) &fs, 1); // disable desktop compositing for KDE, when Kodi is in full-screen mode int one = 1; - Atom composite = XInternAtom(m_dpy, "_KDE_NET_WM_BLOCK_COMPOSITING", True); - if (composite != None) - { - XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_KDE_NET_WM_BLOCK_COMPOSITING", True), XA_CARDINAL, 32, - PropModeReplace, (unsigned char*) &one, 1); - } - composite = XInternAtom(m_dpy, "_NET_WM_BYPASS_COMPOSITOR", True); - if (composite != None) - { - // standard way for Gnome 3 - XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_NET_WM_BYPASS_COMPOSITOR", True), XA_CARDINAL, 32, - PropModeReplace, (unsigned char*) &one, 1); - } + XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_KDE_NET_WM_BLOCK_COMPOSITING", True), XA_CARDINAL, 32, + PropModeReplace, (unsigned char*) &one, 1); } // define invisible cursor @@ -1183,7 +1170,7 @@ changeSize = true; #if defined(HAS_EGL) - m_eglSurface = eglCreateWindowSurface(m_eglDisplay, m_eglConfig, m_glWindow, NULL); + m_eglSurface = eglCreateWindowSurface(m_eglDisplay, eglConfig, m_glWindow, NULL); if (m_eglSurface == EGL_NO_SURFACE) { CLog::Log(LOGERROR, "failed to create egl window surface\n"); @@ -1267,7 +1254,7 @@ #if defined(HAS_GLX) CSingleLock lock(m_resourceSection); // tell any shared resources - for (std::vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) + for (vector::iterator i = m_resources.begin(); i != m_resources.end(); ++i) (*i)->OnResetDevice(); #endif } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/X11/WinSystemX11.h kodi-15.2~git20151019.1039-final/xbmc/windowing/X11/WinSystemX11.h --- kodi-16.1~git20160425.1001-final/xbmc/windowing/X11/WinSystemX11.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/X11/WinSystemX11.h 2015-10-19 08:39:20.000000000 +0000 @@ -40,7 +40,7 @@ class IDispResource; -class CWinSystemX11 : public CWinSystemBase +class CWinSystemX11 : public CWinSystemBase, public ISettingCallback { public: CWinSystemX11(); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/X11/XRandR.cpp kodi-15.2~git20151019.1039-final/xbmc/windowing/X11/XRandR.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windowing/X11/XRandR.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/X11/XRandR.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -37,6 +37,8 @@ #include #endif +using namespace std; + CXRandR::CXRandR(bool query) { m_bInit = false; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windowing/X11/XRandR.h kodi-15.2~git20151019.1039-final/xbmc/windowing/X11/XRandR.h --- kodi-16.1~git20160425.1001-final/xbmc/windowing/X11/XRandR.h 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windowing/X11/XRandR.h 2015-10-19 08:39:20.000000000 +0000 @@ -33,36 +33,32 @@ { public: XMode() - { - id=""; - name=""; - hz=0.0f; - isPreferred=false; - isCurrent=false; - w=h=0; - } + { + id=""; + name=""; + hz=0.0f; + isPreferred=false; + isCurrent=false; + w=h=0; + } bool operator==(XMode& mode) const - { - if (id != mode.id) - return false; - if (name != mode.name) - return false; - if (hz != mode.hz) - return false; - if (isPreferred != mode.isPreferred) - return false; - if (isCurrent != mode.isCurrent) - return false; - if (w != mode.w) - return false; - if (h != mode.h) - return false; - return true; - } - bool IsInterlaced() - { - return name.back() == 'i'; - } + { + if (id!=mode.id) + return false; + if (name!=mode.name) + return false; + if (hz!=mode.hz) + return false; + if (isPreferred!=mode.isPreferred) + return false; + if (isCurrent!=mode.isCurrent) + return false; + if (w!=mode.w) + return false; + if (h!=mode.h) + return false; + return true; + } std::string id; std::string name; float hz; @@ -76,11 +72,11 @@ { public: XOutput() - { - name = ""; - isConnected = false; - w = h = x = y = wmm = hmm = 0; - } + { + name=""; + isConnected=false; + w=h=x=y=wmm=hmm=0; + } std::string name; bool isConnected; int screen; @@ -102,8 +98,8 @@ bool Query(bool force=false, bool ignoreoff=true); bool Query(bool force, int screennum, bool ignoreoff=true); std::vector GetModes(void); - XMode GetCurrentMode(const std::string& outputName); - XMode GetPreferredMode(const std::string& outputName); + XMode GetCurrentMode(const std::string& outputName); + XMode GetPreferredMode(const std::string& outputName); XOutput *GetOutput(const std::string& outputName); bool SetMode(XOutput output, XMode mode); void LoadCustomModeLinesToAllOutputs(void); diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIMediaWindow.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIMediaWindow.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIMediaWindow.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIMediaWindow.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -20,7 +20,7 @@ #include "GUIMediaWindow.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "ContextMenuManager.h" #include "FileItemListModification.h" #include "GUIPassword.h" @@ -50,7 +50,7 @@ #include "guilib/GUIKeyboardFactory.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" -#include "interfaces/builtins/Builtins.h" +#include "interfaces/Builtins.h" #include "interfaces/generic/ScriptInvocationManager.h" #include "input/Key.h" #include "network/Network.h" @@ -63,10 +63,8 @@ #include "utils/FileUtils.h" #include "utils/LabelFormatter.h" #include "utils/log.h" -#include "utils/SortUtils.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "video/VideoLibraryQueue.h" #define CONTROL_BTNVIEWASICONS 2 @@ -83,8 +81,8 @@ #define PROPERTY_SORT_ORDER "sort.order" #define PROPERTY_SORT_ASCENDING "sort.ascending" +using namespace std; using namespace ADDON; -using namespace KODI::MESSAGING; CGUIMediaWindow::CGUIMediaWindow(int id, const char *xmlFile) : CGUIWindow(id, xmlFile) @@ -116,8 +114,8 @@ if (element && element->FirstChild()) { // format is 50,29,51,95 const std::string &allViews = element->FirstChild()->ValueStr(); - std::vector views = StringUtils::Split(allViews, ","); - for (std::vector::const_iterator i = views.begin(); i != views.end(); ++i) + vector views = StringUtils::Split(allViews, ","); + for (vector::const_iterator i = views.begin(); i != views.end(); ++i) { int controlID = atol(i->c_str()); CGUIControl *control = GetControl(controlID); @@ -127,7 +125,7 @@ } else { // backward compatibility - std::vector controls; + vector controls; GetContainers(controls); for (ciControls it = controls.begin(); it != controls.end(); it++) { @@ -560,7 +558,7 @@ // \brief Sorts Fileitems based on the sort method and sort oder provided by guiViewState void CGUIMediaWindow::SortItems(CFileItemList &items) { - std::unique_ptr guiState(CGUIViewState::GetViewState(GetID(), items)); + unique_ptr guiState(CGUIViewState::GetViewState(GetID(), items)); if (guiState.get()) { @@ -578,7 +576,7 @@ { sorting.sortBy = sortBy; sorting.sortOrder = items.GetProperty(PROPERTY_SORT_ASCENDING).asBoolean() ? SortOrderAscending : SortOrderDescending; - sorting.sortAttributes = CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone; + sorting.sortAttributes = CSettings::Get().GetBool("filelists.ignorethewhensorting") ? SortAttributeIgnoreArticle : SortAttributeNone; // if the sort order is descending, we need to switch the original sort order, as we assume // in CGUIViewState::AddPlaylistOrder that SortByPlaylistOrder is ascending. @@ -616,7 +614,7 @@ // \brief Prepares and adds the fileitems list/thumb panel void CGUIMediaWindow::FormatAndSort(CFileItemList &items) { - std::unique_ptr viewState(CGUIViewState::GetViewState(GetID(), items)); + unique_ptr viewState(CGUIViewState::GetViewState(GetID(), items)); if (viewState.get()) { @@ -685,12 +683,12 @@ } int iWindow = GetID(); - std::vector regexps; + vector regexps; // TODO: Do we want to limit the directories we apply the video ones to? if (iWindow == WINDOW_VIDEO_NAV) regexps = g_advancedSettings.m_videoExcludeFromListingRegExps; - if (iWindow == WINDOW_MUSIC_FILES || iWindow == WINDOW_MUSIC_NAV) + if (iWindow == WINDOW_MUSIC_FILES) regexps = g_advancedSettings.m_audioExcludeFromListingRegExps; if (iWindow == WINDOW_PICTURES) regexps = g_advancedSettings.m_pictureExcludeFromListingRegExps; @@ -777,7 +775,7 @@ showLabel = 997; else if (iWindow == WINDOW_MUSIC_FILES) showLabel = 998; - else if (iWindow == WINDOW_FILES) + else if (iWindow == WINDOW_FILES || iWindow == WINDOW_PROGRAMS) showLabel = 1026; } if (m_vecItems->IsPath("sources://video/")) @@ -786,7 +784,8 @@ showLabel = 998; else if (m_vecItems->IsPath("sources://pictures/")) showLabel = 997; - else if (m_vecItems->IsPath("sources://files/")) + else if (m_vecItems->IsPath("sources://programs/") || + m_vecItems->IsPath("sources://files/")) showLabel = 1026; if (showLabel && (m_vecItems->Size() == 0 || !m_guiState->DisableAddSourceButtons())) // add 'add source button' { @@ -877,7 +876,7 @@ // It's used to load tag info for music. void CGUIMediaWindow::OnPrepareFileItems(CFileItemList &items) { - CFileItemListModification::GetInstance().Modify(items); + CFileItemListModification::Get().Modify(items); } // \brief This function will be called by Update() before @@ -925,10 +924,10 @@ // execute the script CURL url(pItem->GetPath()); AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(url.GetHostName(), addon, ADDON_SCRIPT)) + if (CAddonMgr::Get().GetAddon(url.GetHostName(), addon, ADDON_SCRIPT)) { - if (!CScriptInvocationManager::GetInstance().Stop(addon->LibPath())) - CScriptInvocationManager::GetInstance().ExecuteAsync(addon->LibPath(), addon); + if (!CScriptInvocationManager::Get().Stop(addon->LibPath())) + CScriptInvocationManager::Get().ExecuteAsync(addon->LibPath(), addon); return true; } } @@ -938,7 +937,7 @@ if ( pItem->m_bIsShareOrDrive ) { const std::string& strLockType=m_guiState->GetLockType(); - if (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) if (!strLockType.empty() && !g_passwordManager.IsItemUnlocked(pItem.get(), strLockType)) return true; @@ -947,8 +946,8 @@ } // check for the partymode playlist items - they may not exist yet - if ((pItem->GetPath() == CProfilesManager::GetInstance().GetUserDataItem("PartyMode.xsp")) || - (pItem->GetPath() == CProfilesManager::GetInstance().GetUserDataItem("PartyMode-Video.xsp"))) + if ((pItem->GetPath() == CProfilesManager::Get().GetUserDataItem("PartyMode.xsp")) || + (pItem->GetPath() == CProfilesManager::Get().GetUserDataItem("PartyMode-Video.xsp"))) { // party mode playlist item - if it doesn't exist, prompt for user to define it if (!XFILE::CFile::Exists(pItem->GetPath())) @@ -1012,30 +1011,33 @@ } else if (StringUtils::StartsWithNoCase(pItem->GetPath(), "addons://more/")) { - CBuiltins::GetInstance().Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.addon." + pItem->GetPath().substr(14) + ",return)"); + CBuiltins::Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.addon." + pItem->GetPath().substr(14) + ",return)"); return true; } + // If karaoke song is being played AND popup autoselector is enabled, the playlist should not be added + bool do_not_add_karaoke = CSettings::Get().GetBool("karaoke.enabled") && + CSettings::Get().GetBool("karaoke.autopopupselector") && pItem->IsKaraoke(); bool autoplay = m_guiState.get() && m_guiState->AutoPlayNextItem(); if (m_vecItems->IsPlugin()) { CURL url(m_vecItems->GetPath()); AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(url.GetHostName(),addon)) + if (CAddonMgr::Get().GetAddon(url.GetHostName(),addon)) { PluginPtr plugin = std::dynamic_pointer_cast(addon); if (plugin && plugin->Provides(CPluginSource::AUDIO)) { CFileItemList items; - std::unique_ptr state(CGUIViewState::GetViewState(GetID(), items)); + unique_ptr state(CGUIViewState::GetViewState(GetID(), items)); autoplay = state.get() && state->AutoPlayNextItem(); } } } if (autoplay && !g_partyModeManager.IsEnabled() && - !pItem->IsPlayList()) + !pItem->IsPlayList() && !do_not_add_karaoke) { return OnPlayAndQueueMedia(pItem); } @@ -1061,7 +1063,7 @@ { if (!g_mediaManager.IsDiscInDrive(strPath)) { - CGUIDialogOK::ShowAndGetInput(CVariant{218}, CVariant{219}); + CGUIDialogOK::ShowAndGetInput(218, 219); return false; } } @@ -1070,7 +1072,7 @@ // TODO: Handle not connected to a remote share if ( !g_application.getNetwork().IsConnected() ) { - CGUIDialogOK::ShowAndGetInput(CVariant{220}, CVariant{221}); + CGUIDialogOK::ShowAndGetInput(220, 221); return false; } } @@ -1094,7 +1096,7 @@ else idMessageText = 15300; // Path not found or invalid - CGUIDialogOK::ShowAndGetInput(CVariant{220}, CVariant{idMessageText}); + CGUIDialogOK::ShowAndGetInput(220, idMessageText); } // \brief The functon goes up one level in the directory tree @@ -1417,7 +1419,7 @@ if (item->IsPlayList()) item->m_bIsFolder = false; - if (CProfilesManager::GetInstance().GetCurrentProfile().getLockMode() != LOCK_MODE_EVERYONE && CProfilesManager::GetInstance().GetCurrentProfile().filesLocked()) + if (CProfilesManager::Get().GetCurrentProfile().getLockMode() != LOCK_MODE_EVERYONE && CProfilesManager::Get().GetCurrentProfile().filesLocked()) if (!g_passwordManager.IsMasterLockUnlocked(true)) return; @@ -1431,7 +1433,7 @@ { if ( iItem < 0 || iItem >= m_vecItems->Size()) return; - if (CProfilesManager::GetInstance().GetCurrentProfile().getLockMode() != LOCK_MODE_EVERYONE && CProfilesManager::GetInstance().GetCurrentProfile().filesLocked()) + if (CProfilesManager::Get().GetCurrentProfile().getLockMode() != LOCK_MODE_EVERYONE && CProfilesManager::Get().GetCurrentProfile().filesLocked()) if (!g_passwordManager.IsMasterLockUnlocked(true)) return; @@ -1544,8 +1546,7 @@ // TODO: FAVOURITES Conditions on masterlock and localisation if (!item->IsParentFolder() && !item->IsPath("add") && !item->IsPath("newplaylist://") && !URIUtils::IsProtocol(item->GetPath(), "newsmartplaylist") && !URIUtils::IsProtocol(item->GetPath(), "newtag") && - !URIUtils::PathStarts(item->GetPath(), "addons://more/") && !URIUtils::IsProtocol(item->GetPath(), "musicsearch") && - !URIUtils::PathStarts(item->GetPath(), "pvr://guide/") && !URIUtils::PathStarts(item->GetPath(), "pvr://timers/")) + !URIUtils::PathStarts(item->GetPath(), "addons://more/") && !URIUtils::IsProtocol(item->GetPath(), "musicsearch")) { if (XFILE::CFavouritesDirectory::IsFavourite(item.get(), GetID())) buttons.Add(CONTEXT_BUTTON_ADD_FAVOURITE, 14077); // Remove Favourite @@ -1567,7 +1568,7 @@ { CFileItemPtr item = m_vecItems->Get(itemNumber); m_viewControl.SetSelectedItem(m_viewControl.GetSelectedItem() + 1); - CVideoLibraryQueue::GetInstance().MarkAsWatched(item, (button == CONTEXT_BUTTON_MARK_WATCHED)); + CVideoLibraryQueue::Get().MarkAsWatched(item, (button == CONTEXT_BUTTON_MARK_WATCHED)); return true; } case CONTEXT_BUTTON_ADD_FAVOURITE: @@ -1584,7 +1585,7 @@ bool isPluginOrScriptItem = (item && (item->IsPlugin() || item->IsScript())); CURL plugin(isPluginOrScriptItem ? item->GetPath() : m_vecItems->GetPath()); ADDON::AddonPtr addon; - if (CAddonMgr::GetInstance().GetAddon(plugin.GetHostName(), addon)) + if (CAddonMgr::Get().GetAddon(plugin.GetHostName(), addon)) if (CGUIDialogAddonSettings::ShowAndGetInput(addon)) Refresh(); return true; @@ -1592,7 +1593,8 @@ case CONTEXT_BUTTON_BROWSE_INTO: { CFileItemPtr item = m_vecItems->Get(itemNumber); - Update(item->GetPath()); + if(Update(item->GetPath())) + return true; return true; } case CONTEXT_BUTTON_USER1: @@ -1607,14 +1609,14 @@ case CONTEXT_BUTTON_USER10: { std::string action = StringUtils::Format("contextmenuaction(%i)", button - CONTEXT_BUTTON_USER1); - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, m_vecItems->Get(itemNumber)->GetProperty(action).asString()); + CApplicationMessenger::Get().ExecBuiltIn(m_vecItems->Get(itemNumber)->GetProperty(action).asString()); return true; } default: break; } if (button >= CONTEXT_BUTTON_FIRST_ADDON) - return CContextMenuManager::GetInstance().OnClick(button, m_vecItems->Get(itemNumber)); + return CContextMenuManager::Get().Execute(button, m_vecItems->Get(itemNumber)); return false; } @@ -1638,10 +1640,10 @@ return true; CURL url(m_vecItems->GetPath()); - progress->SetHeading(CVariant{1040}); // Loading Directory - progress->SetLine(1, CVariant{url.GetWithoutUserDetails()}); + progress->SetHeading(1040); // Loading Directory + progress->SetLine(1, url.GetWithoutUserDetails()); progress->ShowProgressBar(false); - progress->Open(); + progress->StartModal(); while (!g_application.getNetwork().IsAvailable()) { progress->Progress(); @@ -1866,7 +1868,7 @@ XFILE::CSmartPlaylistDirectory::GetDirectory(m_filter, resultItems, m_strFilterPath, true); // put together a lookup map for faster path comparison - std::map lookup; + map lookup; for (int j = 0; j < resultItems.Size(); j++) { std::string itemPath = RemoveParameterFromPath(resultItems[j]->GetPath(), "filter"); @@ -1893,7 +1895,7 @@ std::string path = RemoveParameterFromPath(item->GetPath(), "filter"); StringUtils::ToLower(path); - std::map::iterator itItem = lookup.find(path); + map::iterator itItem = lookup.find(path); if (itItem != lookup.end()) { // add the item to the list of filtered items diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowDebugInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowDebugInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowDebugInfo.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowDebugInfo.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -34,12 +34,14 @@ #include "utils/Variant.h" #include "utils/StringUtils.h" +#include + CGUIWindowDebugInfo::CGUIWindowDebugInfo(void) - : CGUIDialog(WINDOW_DEBUG_INFO, "", DialogModalityType::MODELESS) + : CGUIDialog(WINDOW_DEBUG_INFO, "") { m_needsScaling = false; m_layout = NULL; - m_renderOrder = RENDER_ORDER_WINDOW_DEBUG; + m_renderOrder = INT_MAX - 2; } CGUIWindowDebugInfo::~CGUIWindowDebugInfo(void) @@ -49,7 +51,7 @@ void CGUIWindowDebugInfo::UpdateVisibility() { if (LOG_LEVEL_DEBUG_FREEMEM <= g_advancedSettings.m_logLevel || g_SkinInfo->IsDebugging()) - Open(); + Show(); else Close(); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowFileManager.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowFileManager.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowFileManager.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowFileManager.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -21,7 +21,7 @@ #include "system.h" #include "GUIWindowFileManager.h" #include "Application.h" -#include "messaging/ApplicationMessenger.h" +#include "ApplicationMessenger.h" #include "Util.h" #include "filesystem/Directory.h" #include "filesystem/ZipManager.h" @@ -54,13 +54,12 @@ #include "utils/FileOperationJob.h" #include "utils/FileUtils.h" #include "utils/URIUtils.h" -#include "utils/Variant.h" #include "Autorun.h" #include "URL.h" +using namespace std; using namespace XFILE; using namespace PLAYLIST; -using namespace KODI::MESSAGING; #define ACTION_COPY 1 #define ACTION_MOVE 2 @@ -291,7 +290,7 @@ if (iAction == ACTION_HIGHLIGHT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK) { OnMark(list, iItem); - if (!CInputManager::GetInstance().IsMouseActive()) + if (!CInputManager::Get().IsMouseActive()) { //move to next item CGUIMessage msg(GUI_MSG_ITEM_SELECT, GetID(), iControl, iItem + 1); @@ -309,10 +308,6 @@ } } break; - // prevent touch/gesture unfocussing .. - case GUI_MSG_GESTURE_NOTIFY: - case GUI_MSG_UNFOCUS_ALL: - return true; } return CGUIWindow::OnMessage(message); } @@ -458,7 +453,7 @@ std::string strParentPath; URIUtils::GetParentPath(strDirectory, strParentPath); - if (strDirectory.empty() && (m_vecItems[iList]->Size() == 0 || CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWADDSOURCEBUTTONS))) + if (strDirectory.empty() && (m_vecItems[iList]->Size() == 0 || CSettings::Get().GetBool("filelists.showaddsourcebuttons"))) { // add 'add source button' std::string strLabel = g_localizeStrings.Get(1026); CFileItemPtr pItem(new CFileItem(strLabel)); @@ -470,7 +465,7 @@ pItem->SetSpecialSort(SortSpecialOnBottom); m_vecItems[iList]->Add(pItem); } - else if (items.IsEmpty() || CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS)) + else if (items.IsEmpty() || CSettings::Get().GetBool("filelists.showparentdiritems")) { CFileItemPtr pItem(new CFileItem("..")); pItem->SetPath(m_rootDir.IsSource(strDirectory) ? "" : strParentPath); @@ -533,7 +528,7 @@ { if (CGUIDialogMediaSource::ShowAndAddMediaSource("files")) { - m_rootDir.SetSources(*CMediaSourceSettings::GetInstance().GetSources("files")); + m_rootDir.SetSources(*CMediaSourceSettings::Get().GetSources("files")); Update(0,m_Directory[0]->GetPath()); Update(1,m_Directory[1]->GetPath()); } @@ -596,12 +591,12 @@ if (pItem->IsPlayList()) { std::string strPlayList = pItem->GetPath(); - std::unique_ptr pPlayList (CPlayListFactory::Create(strPlayList)); + unique_ptr pPlayList (CPlayListFactory::Create(strPlayList)); if (NULL != pPlayList.get()) { if (!pPlayList->Load(strPlayList)) { - CGUIDialogOK::ShowAndGetInput(CVariant{6}, CVariant{477}); + CGUIDialogOK::ShowAndGetInput(6, 477); return; } } @@ -616,7 +611,7 @@ #ifdef HAS_PYTHON if (pItem->IsPythonScript()) { - CScriptInvocationManager::GetInstance().ExecuteAsync(pItem->GetPath()); + CScriptInvocationManager::Get().ExecuteAsync(pItem->GetPath()); return ; } #endif @@ -642,7 +637,7 @@ { if ( !g_mediaManager.IsDiscInDrive(strPath) ) { - CGUIDialogOK::ShowAndGetInput(CVariant{218}, CVariant{219}); + CGUIDialogOK::ShowAndGetInput(218, 219); int iList = GetFocusedList(); int iItem = GetSelectedItem(iList); Update(iList, ""); @@ -655,7 +650,7 @@ // TODO: Handle not connected to a remote share if ( !g_application.getNetwork().IsConnected() ) { - CGUIDialogOK::ShowAndGetInput(CVariant{220}, CVariant{221}); + CGUIDialogOK::ShowAndGetInput(220, 221); return false; } } @@ -689,7 +684,7 @@ void CGUIWindowFileManager::OnCopy(int iList) { - if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{120}, CVariant{123})) + if (!CGUIDialogYesNo::ShowAndGetInput(120, 123)) return; AddJob(new CFileOperationJob(CFileOperationJob::ActionCopy, @@ -700,7 +695,7 @@ void CGUIWindowFileManager::OnMove(int iList) { - if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{121}, CVariant{124})) + if (!CGUIDialogYesNo::ShowAndGetInput(121, 124)) return; AddJob(new CFileOperationJob(CFileOperationJob::ActionMove, @@ -711,7 +706,7 @@ void CGUIWindowFileManager::OnDelete(int iList) { - if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{122}, CVariant{125})) + if (!CGUIDialogYesNo::ShowAndGetInput(122, 125)) return; AddJob(new CFileOperationJob(CFileOperationJob::ActionDelete, @@ -753,7 +748,7 @@ void CGUIWindowFileManager::OnNewFolder(int iList) { std::string strNewFolder = ""; - if (CGUIKeyboardFactory::ShowAndGetInput(strNewFolder, CVariant{g_localizeStrings.Get(16014)}, false)) + if (CGUIKeyboardFactory::ShowAndGetInput(strNewFolder, g_localizeStrings.Get(16014), false)) { std::string strNewPath = m_Directory[iList]->GetPath(); URIUtils::AddSlashAtEnd(strNewPath); @@ -966,7 +961,7 @@ // and do the popup menu if (CGUIDialogContextMenu::SourcesMenu("files", pItem, posX, posY)) { - m_rootDir.SetSources(*CMediaSourceSettings::GetInstance().GetSources("files")); + m_rootDir.SetSources(*CMediaSourceSettings::Get().GetSources("files")); if (m_Directory[1 - list]->IsVirtualDirectoryRoot()) Refresh(); else @@ -985,14 +980,14 @@ // determine available players VECPLAYERCORES vecCores; - CPlayerCoreFactory::GetInstance().GetPlayers(*pItem, vecCores); + CPlayerCoreFactory::Get().GetPlayers(*pItem, vecCores); // add the needed buttons CContextButtons choices; if (item >= 0) { //The ".." item is not selectable. Take that into account when figuring out if all items are selected - int notSelectable = CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_SHOWPARENTDIRITEMS) ? 1 : 0; + int notSelectable = CSettings::Get().GetBool("filelists.showparentdiritems") ? 1 : 0; if (NumSelected(list) < m_vecItems[list]->Size() - notSelectable) choices.Add(1, 188); // SelectAll if (!pItem->IsParentFolder()) @@ -1031,8 +1026,8 @@ if (btnid == 3) { VECPLAYERCORES vecCores; - CPlayerCoreFactory::GetInstance().GetPlayers(*pItem, vecCores); - g_application.m_eForcedNextPlayer = CPlayerCoreFactory::GetInstance().SelectPlayerDialog(vecCores); + CPlayerCoreFactory::Get().GetPlayers(*pItem, vecCores); + g_application.m_eForcedNextPlayer = CPlayerCoreFactory::Get().SelectPlayerDialog(vecCores); if (g_application.m_eForcedNextPlayer != EPC_NONE) OnStart(pItem.get()); } @@ -1052,10 +1047,10 @@ CGUIDialogProgress *progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); if (progress) { - progress->SetHeading(CVariant{13394}); + progress->SetHeading(13394); for (int i=0; i < 3; i++) - progress->SetLine(i, CVariant{""}); - progress->Open(); + progress->SetLine(i, ""); + progress->StartModal(); } // Calculate folder size for each selected item @@ -1128,7 +1123,7 @@ int64_t totalSize = 0; CFileItemList items; CVirtualDirectory rootDir; - rootDir.SetSources(*CMediaSourceSettings::GetInstance().GetSources("files")); + rootDir.SetSources(*CMediaSourceSettings::Get().GetSources("files")); rootDir.GetDirectory(pathToUrl, items, false); for (int i=0; i < items.Size(); i++) { @@ -1149,14 +1144,14 @@ if(!success) { CFileOperationJob* fileJob = (CFileOperationJob*)job; - CGUIDialogOK::ShowAndGetInput(CVariant{fileJob->GetHeading()}, - CVariant{fileJob->GetLine()}, CVariant{16200}, CVariant{0}); + CGUIDialogOK::ShowAndGetInput(fileJob->GetHeading(), + fileJob->GetLine(), 16200, 0); } if (IsActive()) { CGUIMessage msg(GUI_MSG_NOTIFY_ALL, GetID(), 0, GUI_MSG_UPDATE); - CApplicationMessenger::GetInstance().SendGUIMessage(msg, GetID(), false); + CApplicationMessenger::Get().SendGUIMessage(msg, GetID(), false); } CJobQueue::OnJobComplete(jobID, success, job); @@ -1174,7 +1169,7 @@ else idMessageText = 15300; // Path not found or invalid - CGUIDialogOK::ShowAndGetInput(CVariant{220}, CVariant{idMessageText}); + CGUIDialogOK::ShowAndGetInput(220, idMessageText); } void CGUIWindowFileManager::OnInitWindow() @@ -1206,7 +1201,7 @@ { // check for a passed destination path std::string strDestination = path; - m_rootDir.SetSources(*CMediaSourceSettings::GetInstance().GetSources("files")); + m_rootDir.SetSources(*CMediaSourceSettings::Get().GetSources("files")); if (!strDestination.empty()) { CLog::Log(LOGINFO, "Attempting to quickpath to: %s", strDestination.c_str()); @@ -1214,7 +1209,7 @@ // otherwise, is this the first time accessing this window? else if (m_Directory[0]->GetPath() == "?") { - m_Directory[0]->SetPath(strDestination = CMediaSourceSettings::GetInstance().GetDefaultSource("files")); + m_Directory[0]->SetPath(strDestination = CMediaSourceSettings::Get().GetDefaultSource("files")); CLog::Log(LOGINFO, "Attempting to default to: %s", strDestination.c_str()); } // try to open the destination path diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowHome.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowHome.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowHome.cpp 2015-11-02 01:00:18.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowHome.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -40,12 +40,12 @@ m_updateRA = (Audio | Video | Totals); m_loadType = KEEP_IN_MEMORY; - CAnnouncementManager::GetInstance().AddAnnouncer(this); + CAnnouncementManager::Get().AddAnnouncer(this); } CGUIWindowHome::~CGUIWindowHome(void) { - CAnnouncementManager::GetInstance().RemoveAnnouncer(this); + CAnnouncementManager::Get().RemoveAnnouncer(this); } bool CGUIWindowHome::OnAction(const CAction &action) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowHome.h kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowHome.h --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowHome.h 2015-11-02 01:00:18.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowHome.h 2015-10-19 08:39:20.000000000 +0000 @@ -24,8 +24,6 @@ #include "interfaces/IAnnouncer.h" #include "utils/Job.h" -class CVariant; - class CGUIWindowHome : public CGUIWindow, public ANNOUNCEMENT::IAnnouncer, diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowLoginScreen.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowLoginScreen.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowLoginScreen.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowLoginScreen.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -18,49 +18,43 @@ * */ -#include "GUIWindowLoginScreen.h" - #include "system.h" - #include "Application.h" -#include "ContextMenuManager.h" -#include "FileItem.h" -#include "GUIPassword.h" -#include "addons/AddonManager.h" -#include "addons/Skin.h" -#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h" +#include "ApplicationMessenger.h" +#include "GUIWindowLoginScreen.h" +#include "profiles/Profile.h" +#include "profiles/ProfilesManager.h" +#include "profiles/dialogs/GUIDialogProfileSettings.h" #include "dialogs/GUIDialogContextMenu.h" -#include "dialogs/GUIDialogOK.h" -#include "guilib/GUIMessage.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "guilib/StereoscopicsManager.h" -#include "input/Key.h" -#include "interfaces/builtins/Builtins.h" +#include "GUIPassword.h" #ifdef HAS_JSONRPC #include "interfaces/json-rpc/JSONRPC.h" #endif -#include "messaging/ApplicationMessenger.h" -#include "network/Network.h" -#include "profiles/Profile.h" -#include "profiles/ProfilesManager.h" -#include "profiles/dialogs/GUIDialogProfileSettings.h" -#include "pvr/PVRManager.h" -#include "settings/Settings.h" +#include "interfaces/Builtins.h" #include "utils/log.h" -#include "utils/StringUtils.h" #include "utils/Weather.h" -#include "utils/Variant.h" +#include "utils/StringUtils.h" +#include "network/Network.h" +#include "addons/Skin.h" +#include "guilib/GUIMessage.h" +#include "guilib/GUIWindowManager.h" +#include "guilib/StereoscopicsManager.h" +#include "dialogs/GUIDialogOK.h" +#include "settings/Settings.h" +#include "FileItem.h" +#include "input/Key.h" +#include "guilib/LocalizeStrings.h" +#include "addons/AddonManager.h" #include "view/ViewState.h" - -using namespace KODI::MESSAGING; +#include "pvr/PVRManager.h" +#include "ContextMenuManager.h" #define CONTROL_BIG_LIST 52 #define CONTROL_LABEL_HEADER 2 #define CONTROL_LABEL_SELECTED_PROFILE 3 CGUIWindowLoginScreen::CGUIWindowLoginScreen(void) - : CGUIWindow(WINDOW_LOGIN_SCREEN, "LoginScreen.xml") +: CGUIWindow(WINDOW_LOGIN_SCREEN, "LoginScreen.xml") { watch.StartZero(); m_vecItems = new CFileItemList; @@ -118,7 +112,7 @@ else { if (!bCanceled && iItem != 0) - CGUIDialogOK::ShowAndGetInput(CVariant{20068}, CVariant{20117}); + CGUIDialogOK::ShowAndGetInput(20068, 20117); } } } @@ -150,7 +144,7 @@ StringUtils::ToLower(actionName); if ((actionName.find("shutdown") != std::string::npos) && PVR::g_PVRManager.CanSystemPowerdown()) - CBuiltins::GetInstance().Execute(action.GetName()); + CBuiltins::Execute(action.GetName()); return true; } return CGUIWindow::OnAction(action); @@ -167,14 +161,14 @@ if (GetFocusedControlID() == CONTROL_BIG_LIST && g_windowManager.GetTopMostModalDialogID() == WINDOW_INVALID) if (m_viewControl.HasControl(CONTROL_BIG_LIST)) m_iSelectedItem = m_viewControl.GetSelectedItem(); - std::string strLabel = StringUtils::Format(g_localizeStrings.Get(20114).c_str(), m_iSelectedItem+1, CProfilesManager::GetInstance().GetNumberOfProfiles()); + std::string strLabel = StringUtils::Format(g_localizeStrings.Get(20114).c_str(), m_iSelectedItem+1, CProfilesManager::Get().GetNumberOfProfiles()); SET_CONTROL_LABEL(CONTROL_LABEL_SELECTED_PROFILE,strLabel); CGUIWindow::FrameMove(); } void CGUIWindowLoginScreen::OnInitWindow() { - m_iSelectedItem = (int)CProfilesManager::GetInstance().GetLastUsedProfileIndex(); + m_iSelectedItem = (int)CProfilesManager::Get().GetLastUsedProfileIndex(); // Update list/thumb control m_viewControl.SetCurrentView(DEFAULT_VIEW_LIST); Update(); @@ -202,9 +196,9 @@ void CGUIWindowLoginScreen::Update() { m_vecItems->Clear(); - for (unsigned int i=0;igetName())); std::string strLabel; if (profile->getDate().empty()) @@ -237,15 +231,15 @@ if (iItem == 0 && g_passwordManager.iMasterLockRetriesLeft == 0) choices.Add(2, 12334); - CContextMenuManager::GetInstance().AddVisibleItems(pItem, choices); + CContextMenuManager::Get().AddVisibleItems(pItem, choices); int choice = CGUIDialogContextMenu::ShowAndGetChoice(choices); if (choice == 2) { - if (g_passwordManager.CheckLock(CProfilesManager::GetInstance().GetMasterProfile().getLockMode(),CProfilesManager::GetInstance().GetMasterProfile().getLockCode(),20075)) - g_passwordManager.iMasterLockRetriesLeft = CSettings::GetInstance().GetInt(CSettings::SETTING_MASTERLOCK_MAXRETRIES); + if (g_passwordManager.CheckLock(CProfilesManager::Get().GetMasterProfile().getLockMode(),CProfilesManager::Get().GetMasterProfile().getLockCode(),20075)) + g_passwordManager.iMasterLockRetriesLeft = CSettings::Get().GetInt("masterlock.maxretries"); else // be inconvenient - CApplicationMessenger::GetInstance().PostMsg(TMSG_SHUTDOWN); + CApplicationMessenger::Get().Shutdown(); return true; } @@ -253,13 +247,13 @@ // Edit the profile after checking if the correct master lock password was given. if (choice == 1 && g_passwordManager.IsMasterLockUnlocked(true)) CGUIDialogProfileSettings::ShowForProfile(m_viewControl.GetSelectedItem()); - + //NOTE: this can potentially (de)select the wrong item if the filelisting has changed because of an action above. - if (iItem < (int)CProfilesManager::GetInstance().GetNumberOfProfiles()) + if (iItem < (int)CProfilesManager::Get().GetNumberOfProfiles()) m_vecItems->Get(iItem)->Select(bSelect); if (choice >= CONTEXT_BUTTON_FIRST_ADDON) - return CContextMenuManager::GetInstance().OnClick(choice, pItem); + return CContextMenuManager::Get().Execute(choice, pItem); return false; } @@ -276,18 +270,15 @@ void CGUIWindowLoginScreen::LoadProfile(unsigned int profile) { // stop service addons and give it some time before we start it again - ADDON::CAddonMgr::GetInstance().StopServices(true); + ADDON::CAddonMgr::Get().StopServices(true); // stop PVR related services g_application.StopPVRManager(); - // stop audio DSP services with a blocking message - CApplicationMessenger::GetInstance().SendMsg(TMSG_SETAUDIODSPSTATE, ACTIVE_AE_DSP_STATE_OFF); - - if (profile != 0 || !CProfilesManager::GetInstance().IsMasterProfile()) + if (profile != 0 || !CProfilesManager::Get().IsMasterProfile()) { g_application.getNetwork().NetworkMessage(CNetwork::SERVICES_DOWN,1); - CProfilesManager::GetInstance().LoadProfile(profile); + CProfilesManager::Get().LoadProfile(profile); } else { @@ -297,10 +288,10 @@ } g_application.getNetwork().NetworkMessage(CNetwork::SERVICES_UP,1); - CProfilesManager::GetInstance().UpdateCurrentProfileDate(); - CProfilesManager::GetInstance().Save(); + CProfilesManager::Get().UpdateCurrentProfileDate(); + CProfilesManager::Get().Save(); - if (CProfilesManager::GetInstance().GetLastUsedProfileIndex() != profile) + if (CProfilesManager::Get().GetLastUsedProfileIndex() != profile) { g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.ClearPlaylist(PLAYLIST_MUSIC); @@ -308,25 +299,23 @@ } // reload the add-ons, or we will first load all add-ons from the master account without checking disabled status - ADDON::CAddonMgr::GetInstance().ReInit(); - - // let CApplication know that we are logging into a new profile - g_application.SetLoggingIn(true); + ADDON::CAddonMgr::Get().ReInit(); if (!g_application.LoadLanguage(true)) { - CLog::Log(LOGFATAL, "CGUIWindowLoginScreen: unable to load language for profile \"%s\"", CProfilesManager::GetInstance().GetCurrentProfile().getName().c_str()); + CLog::Log(LOGFATAL, "CGUIWindowLoginScreen: unable to load language for profile \"%s\"", CProfilesManager::Get().GetCurrentProfile().getName().c_str()); return; } g_weatherManager.Refresh(); + g_application.SetLoggingIn(true); #ifdef HAS_JSONRPC JSONRPC::CJSONRPC::Initialize(); #endif - // start services which should run on login - ADDON::CAddonMgr::GetInstance().StartServices(false); + // start services which should run on login + ADDON::CAddonMgr::Get().StartServices(false); // start PVR related services g_application.StartPVRManager(); @@ -338,10 +327,7 @@ g_windowManager.ChangeActiveWindow(firstWindow); g_application.UpdateLibraries(); - CStereoscopicsManager::GetInstance().Initialize(); - - // start audio DSP related services with a blocking message - CApplicationMessenger::GetInstance().SendMsg(TMSG_SETAUDIODSPSTATE, ACTIVE_AE_DSP_STATE_ON, ACTIVE_AE_DSP_SYNC_ACTIVATE); + CStereoscopicsManager::Get().Initialize(); // if the user interfaces has been fully initialized let everyone know if (uiInitializationFinished) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowLoginScreen.h kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowLoginScreen.h --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowLoginScreen.h 2015-11-11 04:00:23.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowLoginScreen.h 2015-04-04 00:00:18.000000000 +0000 @@ -21,8 +21,8 @@ */ #include "guilib/GUIDialog.h" -#include "utils/Stopwatch.h" #include "view/GUIViewControl.h" +#include "utils/Stopwatch.h" class CFileItemList; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowPointer.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowPointer.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowPointer.cpp 2015-11-02 01:00:18.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowPointer.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -22,16 +22,17 @@ #include "input/MouseStat.h" #include "input/InputManager.h" #include "windowing/WindowingFactory.h" +#include #define ID_POINTER 10 CGUIWindowPointer::CGUIWindowPointer(void) - : CGUIDialog(WINDOW_DIALOG_POINTER, "Pointer.xml", DialogModalityType::MODELESS) + : CGUIDialog(WINDOW_DIALOG_POINTER, "Pointer.xml") { m_pointer = 0; m_loadType = LOAD_ON_GUI_INIT; m_needsScaling = false; m_active = false; - m_renderOrder = RENDER_ORDER_WINDOW_POINTER; + m_renderOrder = INT_MAX - 1; } CGUIWindowPointer::~CGUIWindowPointer(void) @@ -58,8 +59,8 @@ { if(g_Windowing.HasCursor()) { - if (CInputManager::GetInstance().IsMouseActive()) - Open(); + if (CInputManager::Get().IsMouseActive()) + Show(); else Close(); } @@ -75,19 +76,19 @@ CGUIWindow::OnWindowLoaded(); DynamicResourceAlloc(false); m_pointer = 0; - m_renderOrder = RENDER_ORDER_WINDOW_POINTER; + m_renderOrder = INT_MAX - 1; } void CGUIWindowPointer::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { - bool active = CInputManager::GetInstance().IsMouseActive(); + bool active = CInputManager::Get().IsMouseActive(); if (active != m_active) { MarkDirtyRegion(); m_active = active; } - MousePosition pos = CInputManager::GetInstance().GetMousePosition(); + MousePosition pos = CInputManager::Get().GetMousePosition(); SetPosition((float)pos.x, (float)pos.y); - SetPointer(CInputManager::GetInstance().GetMouseState()); + SetPointer(CInputManager::Get().GetMouseState()); return CGUIWindow::Process(currentTime, dirtyregions); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowScreensaver.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowScreensaver.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowScreensaver.cpp 2015-11-02 01:00:18.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowScreensaver.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -122,6 +122,8 @@ // RESOLUTION res = g_graphicsContext.GetVideoResolution(); // g_graphicsContext.SetVideoResolution(res, FALSE); + // enable the overlay + g_windowManager.ShowOverlay(OVERLAY_STATE_SHOWN); } break; @@ -137,7 +139,7 @@ m_addon.reset(); // Setup new screensaver instance AddonPtr addon; - if (!CAddonMgr::GetInstance().GetAddon(CSettings::GetInstance().GetString(CSettings::SETTING_SCREENSAVER_MODE), addon, ADDON_SCREENSAVER)) + if (!CAddonMgr::Get().GetAddon(CSettings::Get().GetString("screensaver.mode"), addon, ADDON_SCREENSAVER)) return false; m_addon = std::dynamic_pointer_cast(addon); @@ -152,6 +154,8 @@ // RESOLUTION res = g_graphicsContext.GetVideoResolution(); // g_graphicsContext.SetVideoResolution(res, TRUE); + // disable the overlay + g_windowManager.ShowOverlay(OVERLAY_STATE_HIDDEN); return true; } case GUI_MSG_CHECK_LOCK: diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowScreensaverDim.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowScreensaverDim.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowScreensaverDim.cpp 2015-11-02 01:00:18.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowScreensaverDim.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -22,16 +22,16 @@ #include "guilib/GraphicContext.h" #include "guilib/GUITexture.h" #include "Application.h" +#include CGUIWindowScreensaverDim::CGUIWindowScreensaverDim(void) - : CGUIDialog(WINDOW_SCREENSAVER_DIM, "", DialogModalityType::MODELESS) + : CGUIDialog(WINDOW_SCREENSAVER_DIM, "") { m_needsScaling = false; m_dimLevel = 100.0f; - m_newDimLevel = 100.0f; m_animations.push_back(CAnimation::CreateFader(0, 100, 0, 1000, ANIM_TYPE_WINDOW_OPEN)); m_animations.push_back(CAnimation::CreateFader(100, 0, 0, 1000, ANIM_TYPE_WINDOW_CLOSE)); - m_renderOrder = RENDER_ORDER_WINDOW_SCREENSAVER; + m_renderOrder = INT_MAX; } CGUIWindowScreensaverDim::~CGUIWindowScreensaverDim(void) @@ -40,17 +40,15 @@ void CGUIWindowScreensaverDim::UpdateVisibility() { - m_newDimLevel = g_application.GetDimScreenSaverLevel(); - if (m_newDimLevel) - Open(); + m_dimLevel = g_application.GetDimScreenSaverLevel(); + if (m_dimLevel) + Show(); else Close(); } void CGUIWindowScreensaverDim::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { - if (m_newDimLevel != m_dimLevel && !IsAnimating(ANIM_TYPE_WINDOW_CLOSE)) - m_dimLevel = m_newDimLevel; CGUIDialog::Process(currentTime, dirtyregions); m_renderRegion.SetRect(0, 0, (float)g_graphicsContext.GetWidth(), (float)g_graphicsContext.GetHeight()); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowScreensaverDim.h kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowScreensaverDim.h --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowScreensaverDim.h 2015-11-02 01:00:18.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowScreensaverDim.h 2014-12-18 01:02:02.000000000 +0000 @@ -34,5 +34,4 @@ virtual void UpdateVisibility(); private: float m_dimLevel; - float m_newDimLevel; }; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowSplash.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowSplash.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowSplash.cpp 2015-11-02 01:00:18.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowSplash.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -45,7 +45,7 @@ CLog::Log(LOGINFO, "load splash image: %s", CSpecialProtocol::TranslatePath(splashImage).c_str()); m_image = new CGUIImage(0, 0, 0, 0, g_graphicsContext.GetWidth(), g_graphicsContext.GetHeight(), CTextureInfo(splashImage)); - m_image->SetAspectRatio(CAspectRatio::AR_SCALE); + m_image->SetAspectRatio(CAspectRatio::AR_CENTER); } void CGUIWindowSplash::Render() diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowSystemInfo.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowSystemInfo.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowSystemInfo.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowSystemInfo.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2015 Team XBMC - * http://kodi.tv + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,10 +24,11 @@ #include "guilib/WindowIDs.h" #include "guilib/LocalizeStrings.h" #include "pvr/PVRManager.h" +#ifdef HAS_SYSINFO #include "utils/SystemInfo.h" +#endif #include "utils/StringUtils.h" #include "storage/MediaManager.h" -#include "guiinfo/GUIInfoLabels.h" #define CONTROL_BT_STORAGE 94 #define CONTROL_BT_DEFAULT 95 @@ -39,40 +40,37 @@ #define CONTROL_START CONTROL_BT_STORAGE #define CONTROL_END CONTROL_BT_PVR -CGUIWindowSystemInfo::CGUIWindowSystemInfo(void) : - CGUIWindow(WINDOW_SYSTEM_INFORMATION, "SettingsSystemInfo.xml") +CGUIWindowSystemInfo::CGUIWindowSystemInfo(void) +:CGUIWindow(WINDOW_SYSTEM_INFORMATION, "SettingsSystemInfo.xml") { m_section = CONTROL_BT_DEFAULT; m_loadType = KEEP_IN_MEMORY; } - CGUIWindowSystemInfo::~CGUIWindowSystemInfo(void) { } - bool CGUIWindowSystemInfo::OnMessage(CGUIMessage& message) { - switch (message.GetMessage()) + switch ( message.GetMessage() ) { - case GUI_MSG_WINDOW_INIT: + case GUI_MSG_WINDOW_INIT: { CGUIWindow::OnMessage(message); - SET_CONTROL_LABEL(52, CSysInfo::GetAppName() + " " + CSysInfo::GetVersion()); - SET_CONTROL_LABEL(53, CSysInfo::GetBuildDate()); - CONTROL_ENABLE_ON_CONDITION(CONTROL_BT_PVR, PVR::CPVRManager::GetInstance().IsStarted()); + SET_CONTROL_LABEL(52, CSysInfo::GetAppName() + " " + g_infoManager.GetLabel(SYSTEM_BUILD_VERSION).c_str() + + " (Compiled: " + g_infoManager.GetLabel(SYSTEM_BUILD_DATE).c_str() +")"); + CONTROL_ENABLE_ON_CONDITION(CONTROL_BT_PVR, + PVR::CPVRManager::Get().IsStarted()); return true; } break; - - case GUI_MSG_WINDOW_DEINIT: + case GUI_MSG_WINDOW_DEINIT: { CGUIWindow::OnMessage(message); m_diskUsage.clear(); return true; } break; - - case GUI_MSG_FOCUSED: + case GUI_MSG_FOCUSED: { CGUIWindow::OnMessage(message); int focusedControl = GetFocusedControlID(); @@ -93,19 +91,20 @@ int i = 2; if (m_section == CONTROL_BT_DEFAULT) { - SET_CONTROL_LABEL(40, g_localizeStrings.Get(20154)); + SET_CONTROL_LABEL(40,g_localizeStrings.Get(20154)); SetControlLabel(i++, "%s: %s", 158, SYSTEM_FREE_MEMORY); SetControlLabel(i++, "%s: %s", 150, NETWORK_IP_ADDRESS); SetControlLabel(i++, "%s %s", 13287, SYSTEM_SCREEN_RESOLUTION); +#ifdef HAS_SYSINFO SetControlLabel(i++, "%s %s", 13283, SYSTEM_OS_VERSION_INFO); +#endif SetControlLabel(i++, "%s: %s", 12390, SYSTEM_UPTIME); SetControlLabel(i++, "%s: %s", 12394, SYSTEM_TOTALUPTIME); SetControlLabel(i++, "%s: %s", 12395, SYSTEM_BATTERY_LEVEL); } - else if (m_section == CONTROL_BT_STORAGE) { - SET_CONTROL_LABEL(40, g_localizeStrings.Get(20155)); + SET_CONTROL_LABEL(40,g_localizeStrings.Get(20155)); if (m_diskUsage.size() == 0) m_diskUsage = g_mediaManager.GetDiskUsage(); @@ -114,12 +113,13 @@ SET_CONTROL_LABEL(i++, m_diskUsage[d]); } } - else if (m_section == CONTROL_BT_NETWORK) { SET_CONTROL_LABEL(40,g_localizeStrings.Get(20158)); +#ifdef HAS_SYSINFO SET_CONTROL_LABEL(i++, g_infoManager.GetLabel(NETWORK_LINK_STATE)); SetControlLabel(i++, "%s: %s", 149, NETWORK_MAC_ADDRESS); +#endif SetControlLabel(i++, "%s: %s", 150, NETWORK_IP_ADDRESS); SetControlLabel(i++, "%s: %s", 13159, NETWORK_SUBNET_MASK); SetControlLabel(i++, "%s: %s", 13160, NETWORK_GATEWAY_ADDRESS); @@ -127,26 +127,28 @@ SetControlLabel(i++, "%s: %s", 20307, NETWORK_DNS2_ADDRESS); SetControlLabel(i++, "%s %s", 13295, SYSTEM_INTERNET_STATE); } - else if (m_section == CONTROL_BT_VIDEO) { SET_CONTROL_LABEL(40,g_localizeStrings.Get(20159)); +#ifdef HAS_SYSINFO SET_CONTROL_LABEL(i++,g_infoManager.GetLabel(SYSTEM_VIDEO_ENCODER_INFO)); SetControlLabel(i++, "%s %s", 13287, SYSTEM_SCREEN_RESOLUTION); +#endif #ifndef HAS_DX SetControlLabel(i++, "%s %s", 22007, SYSTEM_RENDER_VENDOR); SetControlLabel(i++, "%s %s", 22009, SYSTEM_RENDER_VERSION); #else + SetControlLabel(i++, "%s %s", 22023, SYSTEM_RENDER_VENDOR); SetControlLabel(i++, "%s %s", 22024, SYSTEM_RENDER_VERSION); #endif -#if !defined(__arm__) && !defined(HAS_DX) +#ifndef __arm__ SetControlLabel(i++, "%s %s", 22010, SYSTEM_GPU_TEMPERATURE); #endif } - else if (m_section == CONTROL_BT_HARDWARE) { SET_CONTROL_LABEL(40,g_localizeStrings.Get(20160)); +#ifdef HAS_SYSINFO SET_CONTROL_LABEL(i++, g_sysinfo.GetCPUModel()); #if defined(__arm__) && defined(TARGET_LINUX) SET_CONTROL_LABEL(i++, g_sysinfo.GetCPUBogoMips()); @@ -158,30 +160,31 @@ #if !defined(__arm__) || defined(TARGET_RASPBERRY_PI) SetControlLabel(i++, "%s %s", 13284, SYSTEM_CPUFREQUENCY); #endif +#endif #if !(defined(__arm__) && defined(TARGET_LINUX)) SetControlLabel(i++, "%s %s", 13271, SYSTEM_CPU_USAGE); #endif - i++; // empty line + i++; // empty line SetControlLabel(i++, "%s: %s", 22012, SYSTEM_TOTAL_MEMORY); SetControlLabel(i++, "%s: %s", 158, SYSTEM_FREE_MEMORY); } - - else if (m_section == CONTROL_BT_PVR) + else if(m_section == CONTROL_BT_PVR) { - SET_CONTROL_LABEL(40, g_localizeStrings.Get(19166)); + SET_CONTROL_LABEL(40,g_localizeStrings.Get(19166)); int i = 2; SetControlLabel(i++, "%s: %s", 19120, PVR_BACKEND_NUMBER); - i++; // empty line + i++; // empty line SetControlLabel(i++, "%s: %s", 19012, PVR_BACKEND_NAME); SetControlLabel(i++, "%s: %s", 19114, PVR_BACKEND_VERSION); SetControlLabel(i++, "%s: %s", 19115, PVR_BACKEND_HOST); SetControlLabel(i++, "%s: %s", 19116, PVR_BACKEND_DISKSPACE); SetControlLabel(i++, "%s: %s", 19019, PVR_BACKEND_CHANNELS); SetControlLabel(i++, "%s: %s", 19163, PVR_BACKEND_RECORDINGS); - SetControlLabel(i++, "%s: %s", 19168, PVR_BACKEND_DELETED_RECORDINGS); // Deleted and recoverable recordings + SetControlLabel(i++, "%s: %s", 19168, PVR_BACKEND_DELETED_RECORDINGS); // Deleted and recoverable recordings SetControlLabel(i++, "%s: %s", 19025, PVR_BACKEND_TIMERS); } + CGUIWindow::FrameMove(); } @@ -189,13 +192,12 @@ { for (int i = 2; i < 12; i++) { - SET_CONTROL_LABEL(i, ""); + SET_CONTROL_LABEL(i,""); } } void CGUIWindowSystemInfo::SetControlLabel(int id, const char *format, int label, int info) { - std::string tmpStr = StringUtils::Format(format, g_localizeStrings.Get(label).c_str(), - g_infoManager.GetLabel(info).c_str()); + std::string tmpStr = StringUtils::Format(format, g_localizeStrings.Get(label).c_str(), g_infoManager.GetLabel(info).c_str()); SET_CONTROL_LABEL(id, tmpStr); } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowWeather.cpp kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowWeather.cpp --- kodi-16.1~git20160425.1001-final/xbmc/windows/GUIWindowWeather.cpp 2015-11-02 01:00:18.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/windows/GUIWindowWeather.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -18,17 +18,16 @@ * */ -#include "GUIWindowWeather.h" - -#include - -#include "dialogs/GUIDialogOK.h" +#include "system.h" #include "GUIUserMessages.h" +#include "dialogs/GUIDialogOK.h" +#include "GUIWindowWeather.h" +#include "utils/Weather.h" +#include "utils/URIUtils.h" +#ifdef HAS_PYTHON +#endif #include "LangInfo.h" #include "utils/StringUtils.h" -#include "utils/URIUtils.h" -#include "utils/Variant.h" -#include "utils/Weather.h" using namespace ADDON; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/XBApplicationEx.cpp kodi-15.2~git20151019.1039-final/xbmc/XBApplicationEx.cpp --- kodi-16.1~git20160425.1001-final/xbmc/XBApplicationEx.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/XBApplicationEx.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -82,6 +82,13 @@ unsigned int frameTime = 0; const unsigned int noRenderFrameTime = 15; // Simulates ~66fps +#ifdef XBMC_TRACK_EXCEPTIONS + BYTE processExceptionCount = 0; + BYTE frameMoveExceptionCount = 0; + BYTE renderExceptionCount = 0; + const BYTE MAX_EXCEPTION_COUNT = 10; +#endif + // Run xbmc while (!m_bStop) { @@ -99,17 +106,30 @@ Process(); //reset exception count #ifdef XBMC_TRACK_EXCEPTIONS + processExceptionCount = 0; } catch (const XbmcCommons::UncheckedException &e) { e.LogThrowMessage("CApplication::Process()"); - throw; + processExceptionCount++; + //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out + if (processExceptionCount > MAX_EXCEPTION_COUNT) + { + CLog::Log(LOGERROR, "CApplication::Process(), too many exceptions"); + throw; + } } catch (...) { CLog::Log(LOGERROR, "exception in CApplication::Process()"); - throw; + processExceptionCount++; + //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out + if (processExceptionCount > MAX_EXCEPTION_COUNT) + { + CLog::Log(LOGERROR, "CApplication::Process(), too many exceptions"); + throw; + } } #endif // Frame move the scene @@ -120,16 +140,30 @@ if (!m_bStop) FrameMove(true, m_renderGUI); //reset exception count #ifdef XBMC_TRACK_EXCEPTIONS + frameMoveExceptionCount = 0; + } catch (const XbmcCommons::UncheckedException &e) { e.LogThrowMessage("CApplication::FrameMove()"); - throw; + frameMoveExceptionCount++; + //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out + if (frameMoveExceptionCount > MAX_EXCEPTION_COUNT) + { + CLog::Log(LOGERROR, "CApplication::FrameMove(), too many exceptions"); + throw; + } } catch (...) { CLog::Log(LOGERROR, "exception in CApplication::FrameMove()"); - throw; + frameMoveExceptionCount++; + //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out + if (frameMoveExceptionCount > MAX_EXCEPTION_COUNT) + { + CLog::Log(LOGERROR, "CApplication::FrameMove(), too many exceptions"); + throw; + } } #endif @@ -146,16 +180,31 @@ Sleep(noRenderFrameTime - frameTime); } #ifdef XBMC_TRACK_EXCEPTIONS + //reset exception count + renderExceptionCount = 0; + } catch (const XbmcCommons::UncheckedException &e) { e.LogThrowMessage("CApplication::Render()"); - throw; + renderExceptionCount++; + //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out + if (renderExceptionCount > MAX_EXCEPTION_COUNT) + { + CLog::Log(LOGERROR, "CApplication::Render(), too many exceptions"); + throw; + } } catch (...) { CLog::Log(LOGERROR, "exception in CApplication::Render()"); - throw; + renderExceptionCount++; + //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out + if (renderExceptionCount > MAX_EXCEPTION_COUNT) + { + CLog::Log(LOGERROR, "CApplication::Render(), too many exceptions"); + throw; + } } #endif } // while (!m_bStop) diff -Nru kodi-16.1~git20160425.1001-final/xbmc/XBDateTime.cpp kodi-15.2~git20151019.1039-final/xbmc/XBDateTime.cpp --- kodi-16.1~git20160425.1001-final/xbmc/XBDateTime.cpp 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/XBDateTime.cpp 2015-10-19 08:39:16.000000000 +0000 @@ -874,7 +874,7 @@ SYSTEMTIME st; GetAsSystemTime(st); - return StringUtils::Format("%04i%02i%02i_%02i%02i%02i", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); + return StringUtils::Format("%04i%02i%02i_%02i%02i%02i", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);; } bool CDateTime::SetFromUTCDateTime(const CDateTime &dateTime) @@ -1264,12 +1264,12 @@ return strOut; } -std::string CDateTime::GetAsLocalizedDate(bool longDate/*=false*/) const +std::string CDateTime::GetAsLocalizedDate(bool longDate/*=false*/, bool withShortNames/*=true*/) const { - return GetAsLocalizedDate(g_langInfo.GetDateFormat(longDate)); + return GetAsLocalizedDate(g_langInfo.GetDateFormat(longDate), withShortNames); } -std::string CDateTime::GetAsLocalizedDate(const std::string &strFormat) const +std::string CDateTime::GetAsLocalizedDate(const std::string &strFormat, bool withShortNames/*=true*/) const { std::string strOut; @@ -1332,7 +1332,7 @@ { int wday = dateTime.wDayOfWeek; if (wday < 1 || wday > 7) wday = 7; - str = g_localizeStrings.Get((c =='d' ? 40 : 10) + wday); + str = g_localizeStrings.Get(((withShortNames || c =='d') ? 40 : 10) + wday); } strOut+=str; } @@ -1364,7 +1364,7 @@ { int wmonth = dateTime.wMonth; if (wmonth < 1 || wmonth > 12) wmonth = 12; - str = g_localizeStrings.Get((c =='m' ? 50 : 20) + wmonth); + str = g_localizeStrings.Get(((withShortNames || c =='m') ? 50 : 20) + wmonth); } strOut+=str; } diff -Nru kodi-16.1~git20160425.1001-final/xbmc/XBDateTime.h kodi-15.2~git20151019.1039-final/xbmc/XBDateTime.h --- kodi-16.1~git20160425.1001-final/xbmc/XBDateTime.h 2016-04-25 08:01:35.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/XBDateTime.h 2015-10-19 08:39:16.000000000 +0000 @@ -193,8 +193,8 @@ std::string GetAsSaveString() const; std::string GetAsDBDateTime() const; std::string GetAsDBDate() const; - std::string GetAsLocalizedDate(bool longDate=false) const; - std::string GetAsLocalizedDate(const std::string &strFormat) const; + std::string GetAsLocalizedDate(bool longDate=false, bool withShortNames=true) const; + std::string GetAsLocalizedDate(const std::string &strFormat, bool withShortNames=true) const; std::string GetAsLocalizedTime(const std::string &format, bool withSeconds=true) const; std::string GetAsLocalizedDateTime(bool longDate=false, bool withSeconds=true) const; std::string GetAsRFC1123DateTime() const; diff -Nru kodi-16.1~git20160425.1001-final/xbmc/xbmc.cpp kodi-15.2~git20151019.1039-final/xbmc/xbmc.cpp --- kodi-16.1~git20160425.1001-final/xbmc/xbmc.cpp 2016-04-25 08:01:38.000000000 +0000 +++ kodi-15.2~git20151019.1039-final/xbmc/xbmc.cpp 2015-10-19 08:39:20.000000000 +0000 @@ -30,16 +30,6 @@ #include "client/linux/handler/exception_handler.h" #endif -#ifdef TARGET_WINDOWS -#include -#include "win32/IMMNotificationClient.h" -#include "main/win32/MessagePrinter.h" -#endif - -#if !defined(TARGET_WINDOWS) -#include "main/posix/MessagePrinter.h" -#endif - extern "C" int XBMC_Run(bool renderGUI) { int status = -1; @@ -58,7 +48,7 @@ if (!g_application.Create()) { - CMessagePrinter::DisplayError("ERROR: Unable to create application. Exiting"); + fprintf(stderr, "ERROR: Unable to create application. Exiting\n"); return status; } @@ -82,56 +72,25 @@ if (renderGUI && !g_application.CreateGUI()) { - CMessagePrinter::DisplayError("ERROR: Unable to create GUI. Exiting"); + fprintf(stderr, "ERROR: Unable to create GUI. Exiting\n"); return status; } if (!g_application.Initialize()) { - CMessagePrinter::DisplayError("ERROR: Unable to Initialize. Exiting"); + fprintf(stderr, "ERROR: Unable to Initialize. Exiting\n"); return status; } -#ifdef TARGET_WINDOWS - IMMDeviceEnumerator *pEnumerator = nullptr; - CMMNotificationClient cMMNC; - HRESULT hr = CoCreateInstance(CLSID_MMDeviceEnumerator, nullptr, CLSCTX_ALL, IID_IMMDeviceEnumerator, - reinterpret_cast(&pEnumerator)); - if (SUCCEEDED(hr)) - { - pEnumerator->RegisterEndpointNotificationCallback(&cMMNC); - SAFE_RELEASE(pEnumerator); - } -#endif - try { status = g_application.Run(); } -#ifdef TARGET_WINDOWS - catch (const XbmcCommons::UncheckedException &e) - { - e.LogThrowMessage("CApplication::Create()"); - CMessagePrinter::DisplayError("ERROR: Exception caught on main loop. Exiting"); - status = -1; - } -#endif catch(...) { - CMessagePrinter::DisplayError("ERROR: Exception caught on main loop. Exiting"); + fprintf(stderr, "ERROR: Exception caught on main loop. Exiting\n"); status = -1; } -#ifdef TARGET_WINDOWS - // the end - hr = CoCreateInstance(CLSID_MMDeviceEnumerator, nullptr, CLSCTX_ALL, IID_IMMDeviceEnumerator, - reinterpret_cast(&pEnumerator)); - if (SUCCEEDED(hr)) - { - pEnumerator->UnregisterEndpointNotificationCallback(&cMMNC); - SAFE_RELEASE(pEnumerator); - } -#endif - #ifdef TARGET_RASPBERRY_PI g_RBP.Deinitialize(); #endif